ZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLy5wcm9qZWN0IGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNzk3YWQuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllM2E4MTkuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZW5fbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2VfZW4uaHRtbApkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg1OTNkMC4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1mZWF0dXJlTmFtZT1FUEYgQmFzZSBGZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLWRlc2NyaXB0aW9uPUVQRiBCYXNlIEZlYXR1cmUuCi11cGRhdGVTaXRlTmFtZT1FUEYgRmVhdHVyZSBVcGRhdGVzCi1jb3B5cmlnaHQ9KGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLWxpY2Vuc2VUZXh0PVVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgc3ViamVjdCB0byB0aGUgc2FtZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB3aGljaCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgUHJvZHVjdCB3aGljaCBpbmNsdWRlZCB0aGlzIGZlYXR1cmUuCmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9mZWF0dXJlLnhtbCBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWFkMTBjLi4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS41LjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmJhc2UiCi0gICAgICBvcz0ibGludXgsd2luMzIiCi0gICAgICB3cz0iZ3RrLHdpbjMyIgotICAgICAgYXJjaD0ieDg2IgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZVRleHQKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZHJhdzJkIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZ2VmIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5mb3JtcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmludHJvIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0iY29tLmlibS5pY3UiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5hcGFjaGUuYW50Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLmVjb3JlMmVjb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyeG1sIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5vc2dpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuaGVscC5iYXNlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmFwYWNoZS5sdWNlbmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zZWFyY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVkaXQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbiIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5iYXNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2IgotICAgICAgICAgb3M9IndpbjMyIgotICAgICAgICAgd3M9IndpbjMyIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51aS5pbnRybyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnVtYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2xpY2Vuc2VfZW4uaHRtbCBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2xpY2Vuc2VfZW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9saWNlbnNlX2VuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+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+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmRvYy5mZWF0dXJlLy5wcm9qZWN0IGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk5YjUxNC4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmRvYy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmRvYy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTNhODE5Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZW5fbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2VfZW4uaHRtbApkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOWIyNTQuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1mZWF0dXJlTmFtZT1FUEYgRG9jIEZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotZGVzY3JpcHRpb249RVBGIERvY3VtZW50YXRpb24gRmVhdHVyZS4KLXVwZGF0ZVNpdGVOYW1lPUVQRiBGZWF0dXJlIFVwZGF0ZXMKLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotbGljZW5zZVRleHQ9VXNlIG9mIHRoaXMgZmVhdHVyZSBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIHRlcm1zIGFuZCBjb25kaXRpb25zIHdoaWNoIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBQcm9kdWN0IHdoaWNoIGluY2x1ZGVkIHRoaXMgZmVhdHVyZS4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzM1N2IyLi4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4yLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmRvYyIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2VUZXh0Ci0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZG9jIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUvbGljZW5zZV9lbi5odG1sIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9saWNlbnNlX2VuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9saWNlbnNlX2VuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+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+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjVlNjE4Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlbl9saWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZV9lbi5odG1sCmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNWQ5OWQuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLWZlYXR1cmVOYW1lPUVQRiBQbGF0Zm9ybSBGZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLWRlc2NyaXB0aW9uPUVQRiBQbGF0Zm9ybSBGZWF0dXJlLgotdXBkYXRlU2l0ZU5hbWU9RVBGIEZlYXR1cmUgVXBkYXRlcwotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi1saWNlbnNlVGV4dD1Vc2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHN1YmplY3QgdG8gdGhlIHNhbWUgdGVybXMgYW5kIGNvbmRpdGlvbnMgd2hpY2ggZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIFByb2R1Y3Qgd2hpY2ggaW5jbHVkZWQgdGhpcyBmZWF0dXJlLgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTZlNmE1Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4yLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtIgotICAgICAgb3M9ImxpbnV4LHdpbjMyIgotICAgICAgd3M9Imd0ayx3aW4zMiIKLSAgICAgIGFyY2g9Ing4NiIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2VUZXh0Ci0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJjb20uamNyYWZ0LmpzY2giCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJqYXZheC5zZXJ2bGV0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iamF2YXguc2VydmxldC5qc3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmphc3BlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5lbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5hbnQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUubHVjZW5lIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hbnQuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmJvb3QiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5uZXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbXBhdGliaWxpdHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZGVidWcuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnJlZ2lzdHJ5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLmpldHR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmpzcC5qYXNwZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmpzcC5qYXNwZXIucmVnaXN0cnkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLndlYmFwcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLmFwcHNlcnZlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnNlYXJjaCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50b21jYXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRleHQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanNjaC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuY29uc29sZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmludHJvIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5icm93c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZm9ybXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUuYXBwbGljYXRpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0gICAgICAgICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5uZXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53aW4zMiIKLSAgICAgICAgIHdzPSJ3aW4zMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmNvbXBhdGliaWxpdHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLmxpbnV4Lng4NiIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLndpbjMyLng4NiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMud2luMzIiCi0gICAgICAgICBvcz0id2luMzIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5yZWdpc3RyeSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcubW9ydGJheS5qZXR0eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImNvbS5pYm0uaWN1IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nLmJlYW5zIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5qb2JzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LmF1dGgiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2dpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpmYWNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3Qud2luMzIud2luMzIueDg2IgotICAgICAgICAgb3M9IndpbjMyIgotICAgICAgICAgd3M9IndpbjMyIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrLmxpbnV4Lng4NiIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnJjcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmFwcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgueDg2IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4NiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIHdzPSJ3aW4zMiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hbnQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLm1hbmlwdWxhdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5kZWJ1ZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmN2cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2giCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2gyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5jaGFuZ2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmVkaXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uai5zZG8iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyZWNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJ4bWwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZS5lZGl0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYub2NsIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLnF1ZXJ5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLnF1ZXJ5Lm9jbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im5ldC5zb3VyY2Vmb3JnZS5scGcubHBnamF2YXJ1bnRpbWUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vY2wuZWNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5kcmF3MmQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nZWYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5hY3Rpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuYWN0aW9uLmlkZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5hY3Rpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuZG5kIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmRuZC5pZGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucHJvcGVydGllcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmRuZCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZ2Vvc2hhcGVzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm9wZXJ0aWVzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5pZGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlbmRlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkucmVuZGVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLnJlbmRlci5hd3QiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY2xpcGJvYXJkLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnByb3BlcnRpZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLnByb3ZpZGVycyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5wcmludGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5wcmludGluZy53aW4zMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcucmVuZGVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5iYXRpay5kb20uc3ZnIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5iYXRpay5icmlkZ2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmJhdGlrLmRvbSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYmF0aWsudHJhbnNjb2RlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYmF0aWsuc3ZnZ2VuIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5iYXRpay51dGlsIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLnczYy5kb20uc3ZnIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS54ZXJjZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLnhtbC5yZXNvbHZlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYmF0aWsuY3NzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5iYXRpay51dGlsLmd1aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYmF0aWsucGFyc2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5iYXRpay54bWwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcudzNjLmNzcy5zYWMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcudzNjLmRvbS5zbWlsIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudW1sMi5jb21tb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51bWwyLmNvbW1vbi5lZGl0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudW1sMi51bWwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51bWwyLnVtbC5lZGl0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvbGljZW5zZV9lbi5odG1sIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2xpY2Vuc2VfZW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvbGljZW5zZV9lbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+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+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LmZlYXR1cmUvLnByb2plY3QgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnByb2R1Y3QuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5NzQwNi4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnByb2R1Y3QuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnByb2R1Y3QuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnByb2R1Y3QuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucHJvZHVjdC5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhOGIwMzYuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucHJvZHVjdC5mZWF0dXJlIgotICAgICAgbGFiZWw9IkVQRiBQcm9kdWN0IGZlYXR1cmUiCi0gICAgICB2ZXJzaW9uPSIxLjUuMC5xdWFsaWZpZXIiCi0gICAgICBvcz0ibGludXgsd2luMzIiCi0gICAgICB3cz0iZ3RrLHdpbjMyIgotICAgICAgYXJjaD0ieDg2Ij4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9kZXNjcmlwdGlvbiI+Ci0gICAgICBbRW50ZXIgRmVhdHVyZSBEZXNjcmlwdGlvbiBoZXJlLl0KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2NvcHlyaWdodCI+Ci0gICAgICBbRW50ZXIgQ29weXJpZ2h0IERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9saWNlbnNlIj4KLSAgICAgIFtFbnRlciBMaWNlbnNlIERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9saWNlbnNlPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlLy5wcm9qZWN0IGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY0YjRhOS4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTNhODE5Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZW5fbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2VfZW4uaHRtbApkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNjIyMGMuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1mZWF0dXJlTmFtZT1FUEYgUkNQIEZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotZGVzY3JpcHRpb249RVBGIFJDUCBGZWF0dXJlLgotdXBkYXRlU2l0ZU5hbWU9RVBGIFJDUCBVcGRhdGVzCi1jb3B5cmlnaHQ9KGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLWxpY2Vuc2VUZXh0PVVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgc3ViamVjdCB0byB0aGUgc2FtZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB3aGljaCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgUHJvZHVjdCB3aGljaCBpbmNsdWRlZCB0aGlzIGZlYXR1cmUuCmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkxNDkzYS4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuNS4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5yY3AiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlVGV4dAotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUiIHZlcnNpb249IjEuMi4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmNwLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJjcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS9saWNlbnNlX2VuLmh0bWwgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlL2xpY2Vuc2VfZW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlL2xpY2Vuc2VfZW4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+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/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTE1YjZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWksCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5kcmF3MmQsCi0gb3JnLmVjbGlwc2UuZ2VmLAotIG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zLAotIG9yZy5lY2xpcHNlLnVpLmludHJvLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLAotIG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLAotIG9yZy5lY2xpcHNlLnRlYW0uY3ZzLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLnNlYXJjaCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkucmVuZGVyLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5yZW5kZXIuYXd0LAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdCwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9ycywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNoZWF0c2hlZXRzLmFjdGlvbnMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZG5kLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtcywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YWJiYTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGhlbHAvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9oZWxwL2Jvb2sueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9oZWxwL2Jvb2sueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2IwODE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaGVscC9ib29rLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPHRvYyBsYWJlbD0iRVBGIENvbXBvc2VyIE1ldGhvZCBBdXRocm9pbmcgSGVscCBQYWdlIiAgdG9waWM9Imh0bWwvYm9vay5odG1sIj4KLQk8dG9waWMgbGFiZWw9Ik10aG9kIEF1dGhvcmluZyBPdmVydmlldyIgaHJlZj0iaHRtbC9vdmVydmlldy5odG1sIi8+Ci0JPHRvcGljIGxhYmVsPSJBdXRob3JpbmcgVHV0b3JpYWwiIGhyZWY9Imh0bWwvdHV0b3JpYWwuaHRtbCIvPgotPC90b2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9JdGVyYXRpb24xNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL0l0ZXJhdGlvbjE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxMWU0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL0l0ZXJhdGlvbjE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvUGhhc2UxNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1BoYXNlMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDYwYmQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvUGhhc2UxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1JvbGVEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvUm9sZURlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjhjN2I4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvUm9sZURlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9TeW5jaEJhcjE2LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvU3luY2hCYXIxNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjOTk0NGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9TeW5jaEJhcjE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvU3luY2hCYXIyNC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1N5bmNoQmFyMjQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzk5NDRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvU3luY2hCYXIyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1Rhc2tEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvVGFza0Rlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTRlMjZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvVGFza0Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9UZW1wbGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc2MzI1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvVGVtcGxhdGVEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1RlbXBsYXRlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzYzMjUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvVGVtcGxhdGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FjdGl2aXR5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzM5M2U2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hY3Rpdml0eTE2LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkxNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hY3Rpdml0eTE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkyNC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FjdGl2aXR5MjQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FkZEFsbERlcGVuZGVudEVsZW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hZGRBbGxEZXBlbmRlbnRFbGVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhY2I5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FkZEFsbERlcGVuZGVudEVsZW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hZGRyZWZfY28uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hZGRyZWZfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODQwY2Q5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWRkcmVmX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY2hlY2tlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NoZWNrZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjM0NGRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY2hlY2tlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nsb3N1cmVfY28uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jbG9zdXJlX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI1NTQxYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nsb3N1cmVfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb2xsYXBzZWFsbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NvbGxhcHNlYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkODBhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NvbGxhcHNlYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29sbGFwc2VkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29sbGFwc2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY0YzhiYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NvbGxhcHNlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nvbm5lY3Rpb24xNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nvbm5lY3Rpb24xNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NmExMjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb25uZWN0aW9uMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb25uZWN0aW9uMjQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb25uZWN0aW9uMjQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmE1ZmU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29ubmVjdGlvbjI0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29ud2Fybl9jby5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nvbndhcm5fY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjUwYzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29ud2Fybl9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2RlY25vZGVfcGFsMTYuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9kZWNub2RlX3BhbDE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1YTViNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2RlY25vZGVfcGFsMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9kZWNub2RlX3BhbDI0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZGVjbm9kZV9wYWwyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NmVhYTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9kZWNub2RlX3BhbDI0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZW5kbm9kZV9wYWwxNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2VuZG5vZGVfcGFsMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDY1MDZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZW5kbm9kZV9wYWwxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2VuZG5vZGVfcGFsMjQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9lbmRub2RlX3BhbDI0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IxNzdmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2VuZG5vZGVfcGFsMjQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9lcnJvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Vycm9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlN2E5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Vycm9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZXhwYW5kYWxsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZXhwYW5kYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIwNWIyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2V4cGFuZGFsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2V4cGFuZGVkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZXhwYW5kZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjRkOWM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZXhwYW5kZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mcmVldGV4dF9wYWwxNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2ZyZWV0ZXh0X3BhbDE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRiODEzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2ZyZWV0ZXh0X3BhbDE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnJlZXRleHRfcGFsMjQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mcmVldGV4dF9wYWwyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YjRlMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mcmVldGV4dF9wYWwyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9zaG93X2VtcHR5X3VpX2ZvbGRlcnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2R0b29sMTYvc2hvd19lbXB0eV91aV9mb2xkZXJzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRlMmFlZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9zaG93X2VtcHR5X3VpX2ZvbGRlcnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvUHJlc19uYW1lX3RvZ2dsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9QcmVzX25hbWVfdG9nZ2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcwYWZhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9QcmVzX25hbWVfdG9nZ2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1ByaW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1ByaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1ZGU3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9QcmludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9SZWZyZXNoLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1JlZnJlc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2EwNGQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1JlZnJlc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvU3RvcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9TdG9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwODIzYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9TdG9wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2ZsYXRMYXlvdXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvZmxhdExheW91dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZjc0Y2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvZmxhdExheW91dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NDg2MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvbW92ZV9kb3duLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfZG93bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNDNlMTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvbW92ZV9kb3duLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfZG93bl9kaXNhYmxlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX2Rvd25fZGlzYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGRjZjUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfZG93bl9kaXNhYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX3VwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfdXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDc0NzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfdXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvbW92ZV91cF9kaXNhYmxlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX3VwX2Rpc2FibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYyZGYxOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX3VwX2Rpc2FibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3Nob3dfbGlua2VkX2VsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvc2hvd19saW5rZWRfZWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ODRmN2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvc2hvd19saW5rZWRfZWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zaG93X2xpbmtlZF9lbGVtZW50X2Rpc2FibGVkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3Nob3dfbGlua2VkX2VsZW1lbnRfZGlzYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTdmOGZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3Nob3dfbGlua2VkX2VsZW1lbnRfZGlzYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvc2hvd191aV9mb2xkZXJzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3Nob3dfdWlfZm9sZGVycy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNTRlMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvc2hvd191aV9mb2xkZXJzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3N5bmNlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zeW5jZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWE3NjAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3N5bmNlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi92YWxpZGF0ZV9tZXRob2RfbGliLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3ZhbGlkYXRlX21ldGhvZF9saWIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmMyZTNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3ZhbGlkYXRlX21ldGhvZF9saWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvdmFsaWRhdGVfbWV0aG9kX2xpYl9kaXNhYmxlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi92YWxpZGF0ZV9tZXRob2RfbGliX2Rpc2FibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ4NjRlNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi92YWxpZGF0ZV9tZXRob2RfbGliX2Rpc2FibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQ2hlY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0NoZWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4OTcyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQ2hlY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0NvbGxhcHNlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQ29sbGFwc2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIzM2MzOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQ29sbGFwc2VkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9EaXNhYmxlQ2hlY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0Rpc2FibGVDaGVjay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNjczNzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0Rpc2FibGVDaGVjay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvRGlzYWJsZVVuY2hlY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0Rpc2FibGVVbmNoZWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUyYTc4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvRGlzYWJsZVVuY2hlY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0V4cGFuZGVkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9FeHBhbmRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNTc0NTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0V4cGFuZGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4OTYwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZmIzMGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQbHVnaW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiODJjMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1VuY2hlY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1VuY2hlY2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGZhOTYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9VbmNoZWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMTgyMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3ZyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTEyNDE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9BdXRob3JpbmdQZXJzcGVjdGl2ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0F1dGhvcmluZ1BlcnNwZWN0aXZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhMzExZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0F1dGhvcmluZ1BlcnNwZWN0aXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvQnJvd3NpbmdQZXJzcGVjdGl2ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0Jyb3dzaW5nUGVyc3BlY3RpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTg5NjAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvQnJvd3NpbmdQZXJzcGVjdGl2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0NvbmZpZ3VyYXRpb25FcnJvckxvZ1ZpZXcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Db25maWd1cmF0aW9uRXJyb3JMb2dWaWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFiNjM3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0NvbmZpZ3VyYXRpb25FcnJvckxvZ1ZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Db25maWd1cmF0aW9uVmlldy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0NvbmZpZ3VyYXRpb25WaWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4OTYwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0NvbmZpZ3VyYXRpb25WaWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvQ29udGVudFZpZXcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Db250ZW50Vmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Db250ZW50Vmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0xpYnJhcnlWaWV3LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvTGlicmFyeVZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvTGlicmFyeVZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9NZXRob2RQbHVnaW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9NZXRob2RQbHVnaW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjgyYzM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvTWV0aG9kUGx1Z2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC93aXpiYW4vTmV3LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC93aXpiYW4vTmV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI0OTgzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL05ldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3N5bmNocm9uaXphdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3N5bmNocm9uaXphdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNGIzNjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3dpemJhbi9zeW5jaHJvbml6YXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9oaWRlVW5jaGVja2VkRWxlbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2hpZGVVbmNoZWNrZWRFbGVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcwOTM0Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2hpZGVVbmNoZWNrZWRFbGVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbGlua19wYWwxNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2xpbmtfcGFsMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGY0MDhjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbGlua19wYWwxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2xpbmtfcGFsMjQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9saW5rX3BhbDI0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxMzdlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2xpbmtfcGFsMjQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tYXJxX3BhbDE2LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbWFycV9wYWwxNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Zjg3NWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tYXJxX3BhbDE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbWFycV9wYWwyNC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21hcnFfcGFsMjQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTdkNzg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbWFycV9wYWwyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21vdmVfZG93bi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21vdmVfZG93bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMjgzNTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tb3ZlX2Rvd24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tb3ZlX3VwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbW92ZV91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMGMyYzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tb3ZlX3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2VsZWN0X3BhbDE2LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2VsZWN0X3BhbDE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ1Y2FmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NlbGVjdF9wYWwxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NlbGVjdF9wYWwyNC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NlbGVjdF9wYWwyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMGZjZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zZWxlY3RfcGFsMjQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9hY3Rpdml0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczOTNlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2FjdGl2aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvYXJ0aWZhY3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9hcnRpZmFjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9hcnRpZmFjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2NhcGFiaWxpdHlwYXR0ZXJuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY2FwYWJpbGl0eXBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODBiMWFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY2FwYWJpbGl0eXBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jaGVja2xpc3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jaGVja2xpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzNhYTNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY2hlY2tsaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY29uY2VwdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2NvbmNlcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGU5NWNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY29uY2VwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2NvbnRlbnRwYWNrYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY29udGVudHBhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2FkOTZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY29udGVudHBhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jdXN0b21jYXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jdXN0b21jYXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmIyZDhmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY3VzdG9tY2F0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGVsaXZlcmFibGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kZWxpdmVyYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMTA1NjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kZWxpdmVyYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RlbGl2ZXJ5cHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RlbGl2ZXJ5cHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYmE3ODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kZWxpdmVyeXByb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kaXNjaXBsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGlzY2lwbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MTVhOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kaXNjaXBsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGlzY2lwbGluZWdyb3VwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGlzY2lwbGluZWdyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MzA2OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2Rpc2NpcGxpbmVncm91cC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RvbWFpbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RvbWFpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZTI1N2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kb21haW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9ndWlkZWxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9ndWlkZWxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTkxZTViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZ3VpZGVsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvaXRlcmF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvaXRlcmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjOGExNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2l0ZXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL21ldGhvZGxpYnJhcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9tZXRob2RsaWJyYXJ5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0Zjk3MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL21ldGhvZGxpYnJhcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9tZXRob2RwbHVnaW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9tZXRob2RwbHVnaW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTFhMjNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvbWV0aG9kcGx1Z2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvbWlsZXN0b25lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvbWlsZXN0b25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2ZmY5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL21pbGVzdG9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL291dGNvbWUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9vdXRjb21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwMzUxOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL291dGNvbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9waGFzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3BoYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVjYjNjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3BoYXNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjlhMDg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3Njb21wb25lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzY29tcG9uZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5YTA4NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3Njb21wb25lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzY29udHJpYnV0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc2NvbnRyaWJ1dGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NjZiNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzY29udHJpYnV0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc3BhY2thZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzcGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTdmYzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzcGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3NwbGFubmluZ3RlbXBsYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc3BsYW5uaW5ndGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDA2ODA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc3BsYW5uaW5ndGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZWJkZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZWRlc19vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlZGVzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NTI0YWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlZGVzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3JvbGVkZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZWRlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWEyMmIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZWRlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlc2V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZXNldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjY3YzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlc2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFzay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjMzZDU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2tkZXNfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDllZmUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90YXNrZGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2tkZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1ZDY1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2tkZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc2NyaXB0b3IxLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc2NyaXB0b3IxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1ZDY1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2tkZXNjcmlwdG9yMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3RlY2huaXF1ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3RlY2huaXF1ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNTEzNWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90ZWNobmlxdWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90ZW1wbGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3YTdlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdG9vbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rvb2wuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzU1YTJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdG9vbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rvb2xtZW50b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90b29sbWVudG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM1NWEyYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rvb2xtZW50b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93aGl0ZXBhcGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvd2hpdGVwYXBlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZTQ4ZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93aGl0ZXBhcGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvd29ya2Rlc19vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3JrZGVzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZWE4Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3JrZGVzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3dvcmtvcmRlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3dvcmtvcmRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNWViYzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3Jrb3JkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3JrcHJvZHVjdGRlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3JrcHJvZHVjdGRlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjE4MjI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvd29ya3Byb2R1Y3RkZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvd3BndWlkZWxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93cGd1aWRlbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllOTFlNWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93cGd1aWRlbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3Nob3dDb25maWdFcnJvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3Nob3dDb25maWdFcnJvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYjYzN2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaG93Q29uZmlnRXJyb3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zdG5vZGVfcGFsMTYuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zdG5vZGVfcGFsMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjIyZjRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3Rub2RlX3BhbDE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3Rub2RlX3BhbDI0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3Rub2RlX3BhbDI0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU2YjFmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3N0bm9kZV9wYWwyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3N5bmNiYXJfcGFsMTYuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zeW5jYmFyX3BhbDE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ5ZDBmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3N5bmNiYXJfcGFsMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zeW5jYmFyX3BhbDI0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3luY2Jhcl9wYWwyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwN2QwN2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zeW5jYmFyX3BhbDI0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2FybmluZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3dhcm5pbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWUyMGFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2FybmluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3dmX2VkaXRvcl9pY29uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2ZfZWRpdG9yX2ljb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGRjMWNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2ZfZWRpdG9yX2ljb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy93aXpiYW4vc3luY2hyb25pemF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2l6YmFuL3N5bmNocm9uaXphdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNGIzNjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy93aXpiYW4vc3luY2hyb25pemF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzM3ZTQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBBdXRob3JpbmcgVUkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIENhdGVnb3J5Ci1tZXRob2RDYXRlZ29yeU5hbWU9TWV0aG9kCi0KLSMgUGVyc3BlY3RpdmUKLWF1dGhvcmluZ1BlcnNwZWN0aXZlTmFtZT1BdXRob3JpbmcKLWJyb3dzaW5nUGVyc3BlY3RpdmVOYW1lPUJyb3dzaW5nCi0KLSMgVmlld3MKLWxpYnJhcnlWaWV3TmFtZT1MaWJyYXJ5Ci1jb25maWd1cmF0aW9uVmlld05hbWU9Q29uZmlndXJhdGlvbgotY29udGVudFZpZXdOYW1lPUNvbnRlbnQKLWNvbmZpZ3VyYXRpb25FcnJvckxvZ1ZpZXdOYW1lPUNvbmZpZ3VyYXRpb24gRXJyb3IgTG9nCi0KLSMgRWRpdG9ycwotbWV0aG9kRWxlbWVudEVkaXRvck5hbWU9TWV0aG9kIEVsZW1lbnQgRWRpdG9yCi1jb25maWd1cmF0aW9uRWRpdG9yTmFtZT1Db25maWd1cmF0aW9uIEVkaXRvcgotcHJvY2Vzc0VkaXRvck5hbWU9UHJvY2VzcyBFZGl0b3IKLWFjdGl2aXR5RGlhZ3JhbUVkaXRvck5hbWU9QWN0aXZpdHkgRGlhZ3JhbSBFZGl0b3IKLWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvck5hbWU9QWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gRWRpdG9yCi13b3JrUHJvZHVjdERlcGVkZW5jeURpYWdyYW1FZGl0b3JOYW1lPVdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0gRWRpdG9yCi0KLSMgV2l6YXJkcwotbmV3TWV0aG9kTGlicmFyeVdpemFyZE5hbWU9TWV0aG9kIExpYnJhcnkKLW5ld01ldGhvZExpYnJhcnlXaXphcmREZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgbWV0aG9kIGxpYnJhcnkuCi1uZXdNZXRob2RQbHVnaW5XaXphcmROYW1lPU1ldGhvZCBQbHVnLWluCi1uZXdNZXRob2RQbHVnaW5XaXphcmREZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgbWV0aG9kIHBsdWctaW4uCi1uZXdDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1NZXRob2QgQ29uZmlndXJhdGlvbgotbmV3Q29uZmlndXJhdGlvbldpemFyZERlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbi4KLQotIyBDaGVhdCBTaGVldHMKLW1ldGhvZEF1dGhvcmluZ0NoZWF0U2hlZXRzTmFtZT1NZXRob2QgQXV0aG9yaW5nIENoZWF0IFNoZWV0cwotQ2hlYXRzaGVldEdldHN0YXJ0ZWRDYXRlZ29yeVRleHQ9R2V0dGluZyBTdGFydGVkCi1DaGVhdHNoZWV0UmV1c2FibGVDb250ZW50Q2F0ZWdvcnlUZXh0PUNyZWF0ZSBSZXVzYWJsZSBNZXRob2QgQ29udGVudAotQ2hlYXRzaGVldFdyaXRlQ29udGVudENhdGVnb3J5VGV4dD1Xcml0ZSBNZXRob2QgQ29udGVudAotQ2hlYXRzaGVldFByb2Nlc3Nlc0NhdGVnb3J5VGV4dD1Xb3JrIHdpdGggUHJvY2Vzc2VzCi1DaGVhdHNoZWV0TmF2aWdhdGVNZXRob2RDb250ZW50PU5hdmlnYXRlIE1ldGhvZCBDb250ZW50Ci1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbj1DcmVhdGUgeW91ciBvd24gTWV0aG9kIENvbmZpZ3VyYXRpb24KLUNoZWF0c2hlZXRDcmVhdGVNZXRob2RQbHVnaW49Q3JlYXRlIHlvdXIgb3duIE1ldGhvZCBQbHVnLWluCi1DaGVhdHNoZWV0QWRkTWV0aG9kQ29udGVudD1BZGQgbmV3IE1ldGhvZCBDb250ZW50IHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzLCBvciBHdWlkYW5jZQotQ2hlYXRzaGVldFRhaWxvck1ldGhvZEVsZW1lbnRzPVRhaWxvciBleGlzdGluZyBNZXRob2QgRWxlbWVudHMgKFJvbGVzLCBUYXNrcywgV29yayBQcm9kdWN0cyBvciBHdWlkYW5jZSkgVXNpbmcgQ29udHJpYnV0aW9uCi1DaGVhdHNoZWV0UmVwbGFjZU1laHRvZEVsZW1lbnRzPVJlcGxhY2UgZXhpc3RpbmcgTWV0aG9kIEVsZW1lbnRzIChSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMgb3IgR3VpZGFuY2UpCi1DaGVhdHNoZWV0QWRkTWV0aG9kUmVmT3JIeXBlcmxpbms9QWRkIGEgTWV0aG9kIFJlZmVyZW5jZSBvciBIeXBlcmxpbmsgKFVSTCkKLUNoZWF0c2hlZXRBcHBseUNhcGFiaWxpdHlQYXR0ZXJuPUFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuCi1DaGVhdHNoZWV0Q3JlYXRlUHJvY2Vzcz1DcmVhdGUgYSBQcm9jZXNzIChDYXBhYmlsaXR5IFBhdHRlcm4gb3IgRGVsaXZlcnkgUHJvY2VzcykKLQotIyBBY3Rpb24gU2V0Ci1hdXRob3JpbmdBY3Rpb25TZXQ9QXV0aG9yaW5nCi1jaGVhdFNoZWV0c0FjdGlvblNldD1DaGVhdCBTaGVldHMKLQotIyBHbG9iYWwgQWN0aW9ucwotbmV3TGlicmFyeUFjdGlvbj1NZXRob2QgJkxpYnJhcnkKLW5ld0xpYnJhcnlBY3Rpb25Ub29sdGlwPUNyZWF0ZSBhIG5ldyBNZXRob2QgTGlicmFyeQotbmV3UGx1Z2luQWN0aW9uPU1ldGhvZCAmUGx1Zy1pbgotbmV3UGx1Z2luQWN0aW9uVG9vbHRpcD1DcmVhdGUgYSBuZXcgTWV0aG9kIFBsdWctaW4KLW5ld0NvbmZpZ0FjdGlvbj1NZXRob2QgJkNvbmZpZ3VyYXRpb24KLW5ld0NvbmZpZ0FjdGlvblRvb2x0aXA9Q3JlYXRlIGEgbmV3IE1ldGhvZCBDb25maWd1cmF0aW9uCi1vcGVuTGlicmFyeUFjdGlvbj1NZXRob2QgJkxpYnJhcnkKLW9wZW5MaWJyYXJ5QWN0aW9uVG9vbHRpcD1PcGVuIGFuIGV4aXN0aW5nIE1ldGhvZCBMaWJyYXJ5Ci1vcGVuQ29uZmlnQWN0aW9uPU1ldGhvZCAmQ29uZmlndXJhdGlvbgotb3BlbkNvbmZpZ0FjdGlvblRvb2x0aXA9T3BlbiBhbiBleGlzdGluZyBNZXRob2QgQ29uZmlndXJhdGlvbgotb3BlbkNoZWF0U2hlZXRzPSZDaGVhdCBTaGVldHMuLi4KLQotIyBMaWJyYXJ5IFZpZXcgQWN0aW9ucwotbGlua1dpdGhFZGl0b3I9TGluayB3aXRoIEVkaXRvcgotbGlua1dpdGhFZGl0b3JUb29sdGlwPUxpbmsgd2l0aCBFZGl0b3IKLXNob3dQcmVzZW50YXRpb25OYW1lcz1TaG93IFByZXNlbnRhdGlvbiBOYW1lcwotc2hvd1ByZXNlbnRhdGlvbk5hbWVzVG9vbHRpcD1TaG93IFByZXNlbnRhdGlvbiBOYW1lcwotCi0jIENvbmZpZ3VyYXRpb24gVmlldyBBY3Rpb25zCi1yZWZyZXNoQ29uZmlnPVJlZnJlc2gKLXJlZnJlc2hDb25maWdUb29sdGlwPVJlZnJlc2ggQ29uZmlndXJhdGlvbgotCi0jIFByZWZlcmVuY2UgUGFnZQotYXV0aG9yaW5nUHJlZmVyZW5jZVBhZ2U9QXV0aG9yaW5nCi1wcm9jZXNzRWRpdG9yPVByb2Nlc3MgRWRpdG9yCi1saWJyYXJ5T3B0aW9ucz1MaWJyYXJ5IE9wdGlvbnMKLXN0YXJ0dXBBbmRTaHV0ZG93bj1TdGFydHVwIGFuZCBTaHV0ZG93bgotZGVidWc9RGVidWcKLW1vZGVsaW5nT3B0aW9ucz1Nb2RlbGluZyBPcHRpb25zCi1kaWFncmFtQXBwZWFyYW5jZT1EaWFncmFtIEFwcGVhcmFuY2UKLWJyZWFrZG93bkVsZW1lbnRBdHRyaWJ1dGVzPUJyZWFrZG93biBFbGVtZW50IEF0dHJpYnV0ZXMKLWxpYnJhcnlWaWV3T3B0aW9ucz1MaWJyYXJ5IFZpZXcgT3B0aW9ucwotCi0jIENvbW1hbmQgSGFuZGxlcgotc2VsZWN0QWxsPVNlbGVjdCBBbGwKLQotIyBQcm9wZXJ0aWVzIFZpZXcKLV9VSV9Qcm9jZXNzRWRpdG9yX21lbnU9UHJvY2VzcwotX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbT0mTmV3IENoaWxkCi1fVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW09TiZldyBTaWJsaW5nCi1fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbT1TaG93IFByb3BlcnRpZXMgJlZpZXcKLV9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbT1SZSZmcmVzaAotX1VJX1Byb3BlcnRpZXNfR2VuZXJhbD1HZW5lcmFsCi1fVUlfUHJvcGVydGllc19Eb2N1bWVudGF0aW9uPURvY3VtZW50YXRpb24KLV9VSV9Qcm9wZXJ0aWVzX0d1aWRhbmNlPUd1aWRhbmNlCi1fVUlfUHJvcGVydGllc19Xb3JrX1JvbGx1cD1Xb3JrIFJvbGx1cAotX1VJX1Byb3BlcnRpZXNfVGVhbV9Sb2xsdXA9VGVhbSBSb2xsdXAKLV9VSV9Qcm9wZXJ0aWVzX1dQX1JvbGx1cD1Xb3JrIFByb2R1Y3QgUm9sbHVwCi1fVUlfUHJvcGVydGllc19Sb2xlcz1Sb2xlcwotX1VJX1Byb3BlcnRpZXNfV29ya1Byb2R1Y3RzPVdvcmsgUHJvZHVjdHMKLV9VSV9Qcm9wZXJ0aWVzX1N0ZXBzPVN0ZXBzCi1fVUlfUHJvcGVydGllc19UZWFtcz1UZWFtcwotCi1SaWNoVGV4dE1hcmtlclR5cGVOYW1lPUhUTUwgUHJvYmxlbXMKLUNvbmZpZ3VyYXRpb25NYXJrZXJUeXBlTmFtZT1Db25maWd1cmF0aW9uIFByb2JsZW1zCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzY2M5OTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICAgICBpZD0ibmV3UGx1Z2luV2l6YXJkIgotICAgICAgICAgbmFtZT0iTmV3IE1ldGhvZCBQbHVnLWluIFdpemFyZCBFeHRlbnNpb24iCi0gICAgICAgICBzY2hlbWE9InNjaGVtYS9OZXdQbHVnaW5XaXphcmQuZXhzZCIgLz4KLSAgICAgICAgIAotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgICAgaWQ9Im5ld0NvbmZpZ3VyYXRpb25XaXphcmQiCi0gICAgICAgICBuYW1lPSJOZXcgTWV0aG9kIENvbmZpZ3VyYXRpb24gV2l6YXJkIEV4dGVuc2lvbiIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL05ld0NvbmZpZ3VyYXRpb25XaXphcmQuZXhzZCIgLz4gICAgICAgICAKLQotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgICAgaWQ9IlRhc2tFZGl0b3JQYWdlUHJvdmlkZXIiCi0gICAgICAgICBuYW1lPSJUYXNrIEVkaXRvciBQYWdlIFByb3ZpZGVyIgotICAgICAgICAgc2NoZW1hPSJzY2hlbWEvVGFza0VkaXRvclBhZ2VQcm92aWRlci5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJQcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyIgotICAgICAgICAgbmFtZT0iUHJvY2VzcyBFZGl0b3IgUGFnZSBQcm92aWRlciIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL1Byb2Nlc3NFZGl0b3JQYWdlUHJvdmlkZXIuZXhzZCIvPgotICAgICAgICAgCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICAgICBpZD0iZGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIiCi0gICAgICAgICBuYW1lPSJFZGl0b3IgRGVzY3JpcHRpb24gUGFnZSBDb2x1bW4gUHJvdmlkZXIiCi0gICAgICAgICBzY2hlbWE9InNjaGVtYS9kZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlci5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJ3aXphcmRSZWdpc3RyeVByb3ZpZGVyIgotICAgICAgICAgbmFtZT0iV2l6YXJkIFJlZ2lzdGVyeSBQcm92aWRlciIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL3dpemFyZFJlZ2lzdHJ5UHJvdmlkZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iRWRpdG9yT3BlbmVyIiBuYW1lPSJFZGl0b3IgT3BlbmVyIiBzY2hlbWE9InNjaGVtYS9lZGl0b3JPcGVuZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iQ3VzdG9taXplZExvY2tlciIgbmFtZT0iQ3VzdG9taXplZCBMb2NrZXIiIHNjaGVtYT0ic2NoZW1hL0N1c3RvbWl6ZWRMb2NrZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ibWV0aG9kUmljaFRleHQiIG5hbWU9Ik1ldGhvZCBSaWNoIFRleHQgRXh0ZW5zaW9uIiBzY2hlbWE9InNjaGVtYS9tZXRob2RSaWNoVGV4dC5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtZXRob2RSaWNoVGV4dEVkaXRvciIgbmFtZT0iTWV0aG9kIFJpY2ggVGV4dCBFZGl0b3IgRXh0ZW5zaW9uIiBzY2hlbWE9InNjaGVtYS9tZXRob2RSaWNoVGV4dEVkaXRvci5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcyI+Ci0gICAgICA8cGVyc3BlY3RpdmUKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1BlcnNwZWN0aXZlIgotICAgICAgICAgICAgZml4ZWQ9ImZhbHNlIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC92aWV3MTYvQXV0aG9yaW5nUGVyc3BlY3RpdmUuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nUGVyc3BlY3RpdmUiCi0gICAgICAgICAgICBuYW1lPSIlYXV0aG9yaW5nUGVyc3BlY3RpdmVOYW1lIi8+Ci0gICAgICA8cGVyc3BlY3RpdmUKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkJyb3dzaW5nUGVyc3BlY3RpdmUiCi0gICAgICAgICAgICBmaXhlZD0iZmFsc2UiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL3ZpZXcxNi9Ccm93c2luZ1BlcnNwZWN0aXZlLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkJyb3dzaW5nUGVyc3BlY3RpdmUiCi0gICAgICAgICAgICBuYW1lPSIlYnJvd3NpbmdQZXJzcGVjdGl2ZU5hbWUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi51aS52aWV3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3IgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC92aWV3MTYvTGlicmFyeVZpZXcuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXciCi0gICAgICAgICAgICBuYW1lPSIlbGlicmFyeVZpZXdOYW1lIi8+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi51aS52aWV3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3IgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC92aWV3MTYvQ29uZmlndXJhdGlvblZpZXcuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXciCi0gICAgICAgICAgICBuYW1lPSIlY29uZmlndXJhdGlvblZpZXdOYW1lIi8+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi51aS52aWV3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbnRlbnRWaWV3IgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC92aWV3MTYvQ29udGVudFZpZXcuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29udGVudFZpZXciCi0gICAgICAgICAgICBuYW1lPSIlY29udGVudFZpZXdOYW1lIi8+Ci0gICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlRXh0ZW5zaW9ucyI+Ci0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1BlcnNwZWN0aXZlIj4KLSAgICAgICAgIDx2aWV3Ci0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db25maWd1cmF0aW9uVmlldyIKLSAgICAgICAgICAgICAgIG1vdmVhYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgcmF0aW89IjAuNWYiCi0gICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9ImJvdHRvbSIKLSAgICAgICAgICAgICAgIHJlbGF0aXZlPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3Ii8+Ci0gICAgICAgICA8dmlld1Nob3J0Y3V0Ci0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldyIvPgotICAgICAgICAgPHZpZXdTaG9ydGN1dAotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXciLz4KLSAgICAgICAgIDxzaG93SW5QYXJ0IGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3Ii8+Ci0gICAgICA8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPgotICAgICAgCi0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkJyb3dzaW5nUGVyc3BlY3RpdmUiPgotICAgICAgICAgPHZpZXcKLSAgICAgICAgICAgICAgIGNsb3NlYWJsZT0iZmFsc2UiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db250ZW50VmlldyIKLSAgICAgICAgICAgICAgIG1vdmVhYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgcmF0aW89IjAuNzBmIgotICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPSJyaWdodCIKLSAgICAgICAgICAgICAgIHJlbGF0aXZlPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzcyIvPgotICAgICAgPC9wZXJzcGVjdGl2ZUV4dGVuc2lvbj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudC5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IiCi0gICAgICAgICAgICBuYW1lPSIlbWV0aG9kRWxlbWVudEVkaXRvck5hbWUiCi0gICAgICAgICAgICBtYXRjaGluZ1N0cmF0ZWd5PSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvck1hdGNoaW5nU3RyYXRlZ3kiLz4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29uZmlndXJhdGlvbkVkaXRvciIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbi5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3IiCi0gICAgICAgICAgICBuYW1lPSIlY29uZmlndXJhdGlvbkVkaXRvck5hbWUiCi0gICAgICAgICAgICBtYXRjaGluZ1N0cmF0ZWd5PSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvck1hdGNoaW5nU3RyYXRlZ3kiLz4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvciIKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L1Byb2Nlc3MuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yIgotICAgICAgICAgICAgbmFtZT0iJXByb2Nlc3NFZGl0b3JOYW1lIi8+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+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL05ld0NvbmZpZ3VyYXRpb25XaXphcmQuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL05ld0NvbmZpZ3VyYXRpb25XaXphcmQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM2NGFlMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9OZXdDb25maWd1cmF0aW9uV2l6YXJkLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSIgaWQ9Im5ld1BsdWdpbldpemFyZCIgbmFtZT0iTmV3IE1ldGhvZCBQbHVnaW4gV2l6YXJkIEV4dGVuc2lvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFbmFibGVzIGEgcGx1Zy1pbiB0byBleHRlbmQgdGhlIE5ldyBNZXRob2QgQ29uZmlndXJhdGlvbiB3aXphcmQgYnkgcmVwbGFjaW5nIGV4aXN0aW5nIHdpemFyZCBwYWdlcyBvciBhZGRpbmcgbmV3IG9uZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+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+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBob3cgdGhlIGV4dGVuc2lvbiBwb2ludCBjYW4gYmUgdXNlZDogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmV3Q29uZmlndXJhdGlvbldpemFyZCZxdW90OyZndDsKLSAgICAgICZsdDt3aXphcmQKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdDb25maWd1cmF0aW9uV2l6YXJkRXh0ZW5kZXImcXVvdDsmZ3Q7Ci0gICAgICAgICAmbHQ7d2l6YXJkUGFnZQotICAgICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld0NuZmlndXJhdGlvbldpemFyZFBhZ2UmcXVvdDsKLSAgICAgICAgICAgICAgIHR5cGU9JnF1b3Q7cmVwbGFjZSZxdW90OwotICAgICAgICAgICAgICAgdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdDb25maWd1cmF0aW9uTWFpblBhZ2UmcXVvdDsvJmd0OwotICAgICAgICAgJmx0O3dpemFyZFBhZ2UKLSAgICAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TZWxlY3RPcHRpb25zUGFnZSZxdW90OwotICAgICAgICAgICAgICAgdHlwZT0mcXVvdDtuZXcmcXVvdDsKLSAgICAgICAgICAgICAgIHRhcmdldD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlJnF1b3Q7Ci0gICAgICAgICAgICAgICBpbnNlcnQ9JnF1b3Q7YWZ0ZXImcXVvdDsvJmd0OyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgJmx0Oy93aXphcmQmZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvTmV3UGx1Z2luV2l6YXJkLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9OZXdQbHVnaW5XaXphcmQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1NjI2Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9OZXdQbHVnaW5XaXphcmQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIiBpZD0ibmV3UGx1Z2luV2l6YXJkIiBuYW1lPSJOZXcgTWV0aG9kIFBsdWdpbiBXaXphcmQgRXh0ZW5zaW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEVuYWJsZXMgYSBwbHVnLWluIHRvIGV4dGVuZCB0aGUgTmV3IE1ldGhvZCBQbHVnLWluIHdpemFyZCBieSByZXBsYWNpbmcgZXhpc3Rpbmcgd2l6YXJkIHBhZ2VzIG9yIGFkZGluZyBuZXcgb25lcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l6YXJkRXh0ZW5kZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkRXh0ZW5kZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmRQYWdlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHdpemFyZCBleHRlbmRlci4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkcy5JUHVibGlzaENvbmZpZ1dpemFyZEV4dGVuZGVyJmx0Oy9jb2RlJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkUGFnZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgd2l6YXJkIHBhZ2UuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZSZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiBleHRlbnNpb24gLSAmcXVvdDtyZXBsYWNlJnF1b3Q7IG9yICZxdW90O25ldyZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGJhc2Ugd2l6YXJkIHBhZ2UgdG8gYmUgcmVwbGFjZWQgb3IgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgaW5zZXJ0aW5nIGEgbmV3IHdpemFyZCBwYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imluc2VydCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaW5zZXJ0aW9uIHR5cGUgZm9yIGEgbmV3IHdpemFyZCBwYWdlIC0gJnF1b3Q7YmVmb3JlJnF1b3Q7IG9yICZxdW90O2FmdGVyJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0aGUgZXh0ZW5zaW9uIHBvaW50IGNhbiBiZSB1c2VkOiAKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5uZXdQbHVnaW5XaXphcmQmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7d2l6YXJkCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3UGx1Z2luV2l6YXJkRXh0ZW5kZXImcXVvdDsmZ3Q7Ci0gICAgICAgICAmbHQ7d2l6YXJkUGFnZQotICAgICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld1BsdWdpbldpemFyZFBhZ2UmcXVvdDsKLSAgICAgICAgICAgICAgIHR5cGU9JnF1b3Q7cmVwbGFjZSZxdW90OwotICAgICAgICAgICAgICAgdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdQbHVnaW5NYWluUGFnZSZxdW90Oy8mZ3Q7Ci0gICAgICAgICAmbHQ7d2l6YXJkUGFnZQotICAgICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLlNlbGVjdE9wdGlvbnNQYWdlJnF1b3Q7Ci0gICAgICAgICAgICAgICB0eXBlPSZxdW90O25ldyZxdW90OwotICAgICAgICAgICAgICAgdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdQbHVnaW5NYWluUGFnZSZxdW90OwotICAgICAgICAgICAgICAgaW5zZXJ0PSZxdW90O2FmdGVyJnF1b3Q7LyZndDsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICZsdDsvd2l6YXJkJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL1Byb2Nlc3NFZGl0b3JQYWdlUHJvdmlkZXIuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL1Byb2Nlc3NFZGl0b3JQYWdlUHJvdmlkZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJlNjE2MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9Qcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSIgaWQ9IlByb2Nlc3NFZGl0b3JQYWdlUHJvdmlkZXIiIG5hbWU9IlByb2Nlc3MgRWRpdG9yIFBhZ2UgUHJvdmlkZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVkaXRvclBhZ2UiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZWRpdG9yUGFnZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLklFeHRlbnNpb25Gb3JtUGFnZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwcmUmZ3Q7Ci0gJmx0O2V4dGVuc2lvbgotICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlByb2Nlc3NFZGl0b3JQYWdlUHJvdmlkZXImcXVvdDsmZ3Q7Ci0gICZsdDtlZGl0b3JQYWdlCi0gICBpZD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlByb2Nlc3NFc3RpbWF0aW9uUGFnZSZxdW90OwotICAgbmFtZT0mcXVvdDtFc3RpbWF0aW9uJnF1b3Q7Ci0gICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlByb2Nlc3NFc3RpbWF0aW9uUGFnZSZxdW90OyZndDsKLSAgJmx0Oy9lZGl0b3JQYWdlJmd0OwotICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL1Rhc2tFZGl0b3JQYWdlUHJvdmlkZXIuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL1Rhc2tFZGl0b3JQYWdlUHJvdmlkZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk5NGE0OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9UYXNrRWRpdG9yUGFnZVByb3ZpZGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSIgaWQ9IkVkaXRvclBhZ2VQcm92aWRlciIgbmFtZT0iRWRpdG9yIFBhZ2UgUHJvdmlkZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgZW5hYmxlcyBhIHBsdWctaW4gdG8gcmVnaXN0ZXIgb25lIG9yIG1vcmUgcGFnZXMgaW4gYXV0aG9yaW5nIGVkaXRvci4gVGhvdWdoIHRoaXMgcGFnZSB3aWxsIG9ubHkgYmUgYWRkZWQgZm9yIG1ldGhvZCBlbGVtZW50IHR5cGUgJnF1b3Q7dGFzayZxdW90Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZWRpdG9yUGFnZSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJlZGl0b3JQYWdlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuSUV4dGVuc2lvbkZvcm1QYWdlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cHJlJmd0OwotICZsdDtleHRlbnNpb24KLSAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5UYXNrRWRpdG9yUGFnZVByb3ZpZGVyJnF1b3Q7Jmd0OwotICAmbHQ7ZWRpdG9yUGFnZQotICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5UYXNrRXN0aW1hdGlvblBhZ2UmcXVvdDsKLSAgIG5hbWU9JnF1b3Q7RXN0aW1hdGlvbiZxdW90OwotICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5UYXNrRXN0aW1hdGlvblBhZ2UmcXVvdDsmZ3Q7Ci0gICZsdDsvZWRpdG9yUGFnZSZndDsKLSAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9kZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlci5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvZGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUyZWJiZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9kZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiIGlkPSJkZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlciIgbmFtZT0iRWRpdG9yIERlc2NyaXB0aW9uIFBhZ2UgQ29sdW1uIFByb3ZpZGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGVuYWJsZXMgYSBwbHVnLWluIHRvIHJlZ2lzdGVyIG1vcmUgY29sdW1ucyBpbiBkZXNjcmlwdGlvbiBwYWdlcyBvZiB0aGUgYXV0aG9yaW5nIGVkaXRvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29sdW1uIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbHVtbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9IndpZHRoIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFsaWduIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5JQ29sdW1uUHJvdmlkZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS41Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwcmUmZ3Q7Ci0gJmx0O2V4dGVuc2lvbgotICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyJnF1b3Q7Jmd0OwotICAmbHQ7Y29sdW1uCi0gICBpZD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uVGFiRXh0cmFDb2x1bW4mcXVvdDsKLSAgIHdpZHRoPSZxdW90OzIwJnF1b3Q7Ci0gICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uVGFiRXh0cmFDb2x1bW4mcXVvdDsmZ3Q7Ci0gICZsdDsvY29sdW1uJmd0OwotICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL2VkaXRvck9wZW5lci5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvZWRpdG9yT3BlbmVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZDE5ZGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvZWRpdG9yT3BlbmVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSIgaWQ9ImVkaXRvck9wZW5lciIgbmFtZT0iRWRpdG9yIE9wZW5lciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBleHRlbnNpb24gdG8gZGVmaW5lIGVkaXRvciBvcGVuZWQuIFRoZSBvcGVuZXIgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIElEIHRoYXQgbWF0Y2hlcyB3aXRoIHRoZSBNZXRob2RFbGVtZW50UHJvcGVydHkgbmFtZS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iRWRpdG9yT3BlbmVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IkVkaXRvck9wZW5lciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvbWV0aG9kUmljaFRleHQuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL21ldGhvZFJpY2hUZXh0LmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OTQxM2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvbWV0aG9kUmljaFRleHQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIiBpZD0ibWV0aG9kUmljaFRleHQiIG5hbWU9Ik1ldGhvZCBSaWNoIFRleHQgRXh0ZW5zaW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhIHBsdWctaW4gdG8gZGVmaW5lIHdoaWNoIGNsYXNzIGlzIHVzZWQgZm9yIGEgTWV0aG9kIFJpY2ggVGV4dCB3aWRnZXQuICBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgSU1ldGhvZFJpY2hUZXh0LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtZXRob2RSaWNoVGV4dCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJtZXRob2RSaWNoVGV4dCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBWZXJzaW9uIG11c3QgYmUgYW4gaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAyLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9tZXRob2RSaWNoVGV4dEVkaXRvci5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvbWV0aG9kUmljaFRleHRFZGl0b3IuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmNjBmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9tZXRob2RSaWNoVGV4dEVkaXRvci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiIGlkPSJtZXRob2RSaWNoVGV4dEVkaXRvciIgbmFtZT0iTWV0aG9kIFJpY2ggVGV4dCBFZGl0b3IgRXh0ZW5zaW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhIHBsdWctaW4gdG8gZGVmaW5lIHdoaWNoIGNsYXNzIGlzIHVzZWQgZm9yIGEgTWV0aG9kIFJpY2ggVGV4dCBFZGl0b3Igd2lkZ2V0LiAgVGhlIGNsYXNzIG11c3QgaW1wbGVtZW50IElNZXRob2RSaWNoVGV4dEVkaXRvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibWV0aG9kUmljaFRleHRFZGl0b3IiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibWV0aG9kUmljaFRleHRFZGl0b3IiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dEVkaXRvciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVmVyc2lvbiBtdXN0IGJlIGFuIGludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMi4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvd2l6YXJkUmVnaXN0cnlQcm92aWRlci5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvd2l6YXJkUmVnaXN0cnlQcm92aWRlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmU2OGU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL3dpemFyZFJlZ2lzdHJ5UHJvdmlkZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIiBpZD0id2l6YXJkUmVnaXN0cnlQcm92aWRlciIgbmFtZT0iV2l6YXJkIFJlZ2lzdGVyeSBQcm92aWRlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmRSZWdpc3RyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkUmVnaXN0cnkiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5JV2l6YXJkUmVnaXN0cnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NoYW5nZUJvdW5kc0NvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NoYW5nZUJvdW5kc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0YzJlZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VCb3VuZHNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENoYW5nZUJvdW5kc0NvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgTm9kZSBub2RlOwotCi0JcHJpdmF0ZSBQb2ludCBuZXdMb2NhdGlvbiwgb2xkTG9jYXRpb247Ci0KLQlwcml2YXRlIGludCBuZXdXaWR0aCwgb2xkV2lkdGg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfY2hhbmdlQm91bmRzQ29tbWFuZF9sYWJlbDsgCi0KLQlwdWJsaWMgQ2hhbmdlQm91bmRzQ29tbWFuZChOb2RlIG5vZGUsIFBvaW50IG5ld0xvY2F0aW9uLCBpbnQgbmV3V2lkdGgpIHsKLQkJc3VwZXIoQ2hhbmdlQm91bmRzQ29tbWFuZC5MQUJFTCk7Ci0JCXNldE5vZGUobm9kZSk7Ci0JCXNldE5ld0xvY2F0aW9uKG5ld0xvY2F0aW9uLmdldENvcHkoKSk7Ci0JCXRoaXMubmV3V2lkdGggPSBuZXdXaWR0aDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gbm9kZSAhPSBudWxsCi0JCQkJJiYgbmV3TG9jYXRpb24gIT0gbnVsbAotCQkJCSYmIChuZXdXaWR0aCAhPSBvbGRXaWR0aCB8fCAhKG5vZGUuZ2V0TG9jYXRpb24oKQotCQkJCQkJLmVxdWFscyhuZXdMb2NhdGlvbikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGRMb2NhdGlvbiA9IG5vZGUuZ2V0TG9jYXRpb24oKTsKLQkJb2xkV2lkdGggPSBub2RlLmdldFdpZHRoKCk7Ci0JCXJlZG8oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlub2RlLnNldExvY2F0aW9uKG5ld0xvY2F0aW9uKTsKLQkJbm9kZS5zZXRXaWR0aChuZXdXaWR0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm9kZShOb2RlIG5vZGUpIHsKLQkJdGhpcy5ub2RlID0gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXdMb2NhdGlvbihQb2ludCBsb2MpIHsKLQkJbmV3TG9jYXRpb24gPSBsb2M7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJbm9kZS5zZXRXaWR0aChvbGRXaWR0aCk7Ci0JCW5vZGUuc2V0TG9jYXRpb24ob2xkTG9jYXRpb24pOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NoYW5nZUhlaWdodENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NoYW5nZUhlaWdodENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhkNDk1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VIZWlnaHRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBDb21tYW5kIHRvIGhhbmRsZSBOb2RlJ3MgaGVpZ2h0IGNoYW5nZXMuCi0gKiBDaGFuZ2VCb3VuZHNDb21tYW5kIGhhbmRsZXMgTm9kZSdzIHdpZHRoIGNoYW5nZXMuIAotICovCi1wdWJsaWMgY2xhc3MgQ2hhbmdlSGVpZ2h0Q29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBOb2RlIG5vZGU7Ci0KLQlwcml2YXRlIFBvaW50IG5ld0xvY2F0aW9uLCBvbGRMb2NhdGlvbjsKLQotCXByaXZhdGUgaW50IG5ld0hlaWdodCwgb2xkSGVpZ2h0OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gIkNoYW5nZSBIZWlnaHQgQ29tbWFuZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBDaGFuZ2VIZWlnaHRDb21tYW5kKE5vZGUgbm9kZSwgUG9pbnQgbmV3TG9jYXRpb24sIGludCBuZXdIZWlnaHQpIHsKLQkJc3VwZXIoQ2hhbmdlSGVpZ2h0Q29tbWFuZC5MQUJFTCk7Ci0JCXNldE5vZGUobm9kZSk7Ci0JCXNldE5ld0xvY2F0aW9uKG5ld0xvY2F0aW9uLmdldENvcHkoKSk7Ci0JCXRoaXMubmV3SGVpZ2h0ID0gbmV3SGVpZ2h0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBub2RlICE9IG51bGwKLQkJCQkmJiBuZXdMb2NhdGlvbiAhPSBudWxsCi0JCQkJJiYgKG5ld0hlaWdodCAhPSBvbGRIZWlnaHQgfHwgIShub2RlLmdldExvY2F0aW9uKCkKLQkJCQkJCS5lcXVhbHMobmV3TG9jYXRpb24pKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkTG9jYXRpb24gPSBub2RlLmdldExvY2F0aW9uKCk7Ci0JCW9sZEhlaWdodCA9IG5vZGUuZ2V0SGVpZ2h0KCk7Ci0JCXJlZG8oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlub2RlLnNldExvY2F0aW9uKG5ld0xvY2F0aW9uKTsKLQkJbm9kZS5zZXRIZWlnaHQobmV3SGVpZ2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb2RlKE5vZGUgbm9kZSkgewotCQl0aGlzLm5vZGUgPSBub2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5ld0xvY2F0aW9uKFBvaW50IGxvYykgewotCQluZXdMb2NhdGlvbiA9IGxvYzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlub2RlLnNldEhlaWdodChvbGRIZWlnaHQpOwotCQlub2RlLnNldExvY2F0aW9uKG9sZExvY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VOYW1lQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlTmFtZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA5NTZlZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VOYW1lQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5hbWVkTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2hhbmdlTmFtZUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgTmFtZWROb2RlIGVsZW1lbnQ7Ci0KLQlwcml2YXRlIFN0cmluZyBuZXdOYW1lLCBvbGROYW1lOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX2NoYW5nZU5hbWVDb21tYW5kX2xhYmVsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRPX01FU1NBR0UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfY2hhbmdlTmFtZUNvbW1hbmRfdW5kb01lc3NhZ2U7Ci0KLQlwdWJsaWMgQ2hhbmdlTmFtZUNvbW1hbmQoTmFtZWROb2RlIGVsZW0sIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXN1cGVyKExBQkVMKTsKLQkJZWxlbWVudCA9IGVsZW07Ci0JCW9sZE5hbWUgPSBlbGVtLmdldE5hbWUoKTsKLQkJdGhpcy5uZXdOYW1lID0gbmV3TmFtZS50cmltKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQllbGVtZW50LnNldE5hbWUobmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKCFTdHJVdGlsLmlzQmxhbmsob2xkTmFtZSkpIHsKLQkJCWVsZW1lbnQuc2V0TmFtZShvbGROYW1lKTsKLQkJfSBlbHNlIHsKLQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUHJvbXB0RWRpdChudWxsLCBVTkRPX01FU1NBR0UpKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBQcm9tcHRFZGl0IGltcGxlbWVudHMgUnVubmFibGUgewotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgbXNnOwotCi0JCVByb21wdEVkaXQoTmFtZWROb2RlRWRpdFBhcnQgcGFydCwgU3RyaW5nIG1zZykgewotCQkJdGhpcy5tc2cgPSBtc2c7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLndhcm5pbmdEaWFsb2dfdGl0bGU7Ci0JCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpOwotCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NTRkMTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBOb2RlIGVsZW1lbnQ7Ci0KLQlwcml2YXRlIE5vZGVFZGl0UGFydCBwYXJ0OwotCi0JcHJpdmF0ZSBTdHJpbmcgbmV3TmFtZSwgb2xkTmFtZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl9jaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZF9sYWJlbDsgCi0KLQlwdWJsaWMgQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQoTm9kZUVkaXRQYXJ0IGVsZW0sIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXN1cGVyKExBQkVMKTsKLQkJcGFydCA9IGVsZW07Ci0JCWVsZW1lbnQgPSAoTm9kZSkgZWxlbS5nZXRNb2RlbCgpOwotCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gZWxlbWVudC5nZXRHcmFwaE5vZGUoKTsKLQkJTGlzdCBsaXN0ID0gZ3JhcGhOb2RlLmdldFByb3BlcnR5KCk7Ci0JCW9sZE5hbWUgPSAoKFByb3BlcnR5KSBsaXN0LmdldCgwKSkuZ2V0VmFsdWUoKTsKLQkJdGhpcy5uZXdOYW1lID0gbmV3TmFtZS50cmltKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkoKFByb3BlcnR5KSBlbGVtZW50LmdldEdyYXBoTm9kZSgpLmdldFByb3BlcnR5KCkuZ2V0KDApKQotCQkJCS5zZXRWYWx1ZShuZXdOYW1lKTsKLQkJcGFydC5yZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJKChQcm9wZXJ0eSkgZWxlbWVudC5nZXRHcmFwaE5vZGUoKS5nZXRQcm9wZXJ0eSgpLmdldCgwKSkKLQkJCQkuc2V0VmFsdWUob2xkTmFtZSk7Ci0JCXBhcnQucmVmcmVzaCgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NyZWF0ZUJlbmRwb2ludENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NyZWF0ZUJlbmRwb2ludENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ0YzMyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DcmVhdGVCZW5kcG9pbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVCZW5kcG9pbnRDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIExpbmsgbGluazsKLQotCXByaXZhdGUgQWJzb2x1dGVCZW5kcG9pbnQgcG9pbnQ7Ci0KLQlwcml2YXRlIGludCBpbmRleCA9IC0xOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX2NyZWF0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw7IAotCi0JcHVibGljIENyZWF0ZUJlbmRwb2ludENvbW1hbmQoTGluayBsaW5rLCBQb2ludCBsb2NhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXN1cGVyKExBQkVMKTsKLQkJdGhpcy5saW5rID0gbGluazsKLQkJcG9pbnQgPSBuZXcgQWJzb2x1dGVCZW5kcG9pbnQobG9jYXRpb24pOwotCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIGxpbmsgIT0gbnVsbCAmJiBwb2ludCAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWxpbmsuZ2V0QmVuZHBvaW50cygpLmFkZChpbmRleCwgcG9pbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWxpbmsuZ2V0QmVuZHBvaW50cygpLnJlbW92ZShpbmRleCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ3JlYXRlTGlua0NvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NyZWF0ZUxpbmtDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZTRkMDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ3JlYXRlTGlua0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5WYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVMaW5rQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBMaW5rIGxpbms7Ci0KLQlwcml2YXRlIE5vZGUgc291cmNlLCB0YXJnZXQ7Ci0KLQlwcml2YXRlIFBvaW50IHRhcmdldEVuZFBvaW50OwotCi0JcHJpdmF0ZSBQb2ludCBzb3VyY2VFbmRQb2ludDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl9jcmVhdGVMaW5rQ29tbWFuZF9sYWJlbDsgCi0KLQlwdWJsaWMgQ3JlYXRlTGlua0NvbW1hbmQoTGluayBuZXdPYmosIE5vZGUgc3JjKSB7Ci0JCXN1cGVyKExBQkVMKTsKLQkJbGluayA9IG5ld09iajsKLQkJc291cmNlID0gc3JjOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gc291cmNlICE9IG51bGwgJiYgdGFyZ2V0ICE9IG51bGwgJiYgbGluayAhPSBudWxsOwotCQlpZiAoIXJlc3VsdCkKLQkJCXJldHVybiByZXN1bHQ7Ci0KLQkJU3RyaW5nIG1zZyA9IFZhbGlkYXRpb24uY2hlY2tDb25uZWN0KHNvdXJjZSwgdGFyZ2V0LCBsaW5rKTsKLQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJaWYgKHNvdXJjZSA9PSB0YXJnZXQpIHsKLQkJCWxpbmsuZ2V0QmVuZHBvaW50cygpLmFkZCgKLQkJCQkJbmV3IEFic29sdXRlQmVuZHBvaW50KHNvdXJjZS5nZXRMb2NhdGlvbigpLmdldFRyYW5zbGF0ZWQoCi0JCQkJCQkJLTEwLCAxMCkpKTsKLQkJCWxpbmsuZ2V0QmVuZHBvaW50cygpLmFkZCgKLQkJCQkJbmV3IEFic29sdXRlQmVuZHBvaW50KHNvdXJjZS5nZXRMb2NhdGlvbigpLmdldFRyYW5zbGF0ZWQoCi0JCQkJCQkJLTEwLCAtMTApKSk7Ci0JCQlsaW5rLmdldEJlbmRwb2ludHMoKS5hZGQoCi0JCQkJCW5ldyBBYnNvbHV0ZUJlbmRwb2ludChzb3VyY2UuZ2V0TG9jYXRpb24oKS5nZXRUcmFuc2xhdGVkKAotCQkJCQkJCTEwLCAtMTApKSk7Ci0JCX0KLQotCQlsaW5rLnNldFRhcmdldEVuZFBvaW50KHRhcmdldEVuZFBvaW50KTsKLQkJbGluay5zZXRTb3VyY2VFbmRQb2ludChzb3VyY2VFbmRQb2ludCk7Ci0JCWxpbmsuc2V0U291cmNlKHNvdXJjZSk7Ci0JCWxpbmsuc2V0VGFyZ2V0KHRhcmdldCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vZGUgdGFyZ2V0KSB7Ci0JCXRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhcmdldEVuZFBvaW50KFBvaW50IHApIHsKLQkJdGFyZ2V0RW5kUG9pbnQgPSBwOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNvdXJjZUVuZFBvaW50KFBvaW50IHApIHsKLQkJc291cmNlRW5kUG9pbnQgPSBwOwotCX0KLQotCXB1YmxpYyBQb2ludCBnZXRUYXJnZXRFbmRQb2ludCgpIHsKLQkJcmV0dXJuIHRhcmdldEVuZFBvaW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc291cmNlRW5kUG9pbnQuCi0JICovCi0JcHVibGljIFBvaW50IGdldFNvdXJjZUVuZFBvaW50KCkgewotCQlyZXR1cm4gc291cmNlRW5kUG9pbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJbGluay5zZXRTb3VyY2VFbmRQb2ludChudWxsKTsKLQkJbGluay5zZXRUYXJnZXRFbmRQb2ludChudWxsKTsKLQkJbGluay5zZXRTb3VyY2UobnVsbCk7Ci0JCWxpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQlpZiAoc291cmNlID09IHRhcmdldCkgewotCQkJbGluay5nZXRCZW5kcG9pbnRzKCkuY2xlYXIoKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NyZWF0ZU5vZGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DcmVhdGVOb2RlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzA3Nzg2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NyZWF0ZU5vZGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZU5vZGVDb21tYW5kIGV4dGVuZHMgRGlhZ3JhbU1vZGlmeUNvbW1hbmQgewotCi0JcHJpdmF0ZSBQb2ludCBsb2M7Ci0KLQlwcml2YXRlIE5vZGUgbm9kZTsKLQotCXByaXZhdGUgRGlhZ3JhbSBkaWFncmFtOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX2NyZWF0ZU5vZGVDb21tYW5kX2xhYmVsOyAKLQotCXB1YmxpYyBDcmVhdGVOb2RlQ29tbWFuZChOb2RlIG5ld09iamVjdCwgRGlhZ3JhbSBwYXJlbnQsIFBvaW50IGxvY2F0aW9uKSB7Ci0JCXN1cGVyKExBQkVMKTsKLQkJbm9kZSA9IG5ld09iamVjdDsKLQkJZGlhZ3JhbSA9IHBhcmVudDsKLQkJbG9jID0gbG9jYXRpb24uZ2V0Q29weSgpOwotCQlzZXREaWFncmFtKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJbm9kZS5zZXRMb2NhdGlvbihudWxsKTsKLQkJbm9kZS5zZXREaWFncmFtKG51bGwpOwotCQlkaWFncmFtLmdldE5vZGVzKCkucmVtb3ZlKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuRGlhZ3JhbU1vZGlmeUNvbW1hbmQjZG9FeGVjdXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCW5vZGUuc2V0TG9jYXRpb24obG9jKTsKLQkJbm9kZS5zZXREaWFncmFtKGRpYWdyYW0pOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJZGlhZ3JhbS5zZXREZWZhdWx0TmFtZSgoTmFtZWROb2RlKSBub2RlKTsKLQkJfQotCQlkaWFncmFtLmdldE5vZGVzKCkuYWRkKG5vZGUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCWlmIChkaWFncmFtIGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJaWYgKGRpYWdyYW0uaXNSZWFkT25seSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5jYW5FeGVjdXRlKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvRGVsZXRlQmVuZHBvaW50Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvRGVsZXRlQmVuZHBvaW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODAxNjM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0RlbGV0ZUJlbmRwb2ludENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlQmVuZHBvaW50Q29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBMaW5rIGxpbms7Ci0KLQlwcml2YXRlIEFic29sdXRlQmVuZHBvaW50IGJlbmRwb2ludDsKLQotCXByaXZhdGUgaW50IGluZGV4OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX2RlbGV0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw7IAotCi0JcHVibGljIERlbGV0ZUJlbmRwb2ludENvbW1hbmQoTGluayBsaW5rLCBpbnQgaW5kZXgpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQl0aGlzLmxpbmsgPSBsaW5rOwotCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCWJlbmRwb2ludCA9IGxpbmsuZ2V0QmVuZHBvaW50cygpLmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIGluZGV4ID49IDAgJiYgYmVuZHBvaW50ICE9IG51bGwgJiYgbGluayAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWxpbmsuZ2V0QmVuZHBvaW50cygpLnJlbW92ZShpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJbGluay5nZXRCZW5kcG9pbnRzKCkuYWRkKGluZGV4LCBiZW5kcG9pbnQpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0RlbGV0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0RlbGV0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEzMzNjYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EZWxldGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIENvbW1hbmQgZGVsZWdhdGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfZGVsZXRlQ29tbWFuZF9sYWJlbDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUEVSTV9ERUxFVEUgPSAiZ2VmLmVkaWFncmFtLiRwZXJtIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIERlbGV0ZUNvbW1hbmQoYm9vbGVhbiBoYXJkRGVsZXRlKSB7Ci0JCXN1cGVyKExBQkVMKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gZGVsZWdhdGUgIT0gbnVsbCAmJiBkZWxlZ2F0ZS5jYW5FeGVjdXRlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJZGVsZWdhdGUuZXhlY3V0ZSgpOwotCX0KLQotCXB1YmxpYyBDb21tYW5kIHNldFBhcnRUb0JlRGVsZXRlZChPYmplY3QgbW9kZWwpIHsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgTm9kZSkKLQkJCWRlbGVnYXRlID0gbmV3IERlbGV0ZU5vZGVDb21tYW5kKG1vZGVsKTsKLQkJZWxzZQotCQkJZGVsZWdhdGUgPSBudWxsOwotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlkZWxlZ2F0ZS51bmRvKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVsZXRlTm9kZUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQkJcHJvdGVjdGVkIE1hcCBpbmNvbWluZ0Nvbm5lY3Rpb25zVG9Tb3VyY2U7Ci0KLQkJcHJvdGVjdGVkIE1hcCBvdXRnb2luZ0Nvbm5lY3Rpb25zVG9UYXJnZXQ7Ci0KLQkJcHJvdGVjdGVkIE5vZGVDb250YWluZXIgY29udGFpbmVyOwotCi0JCXByb3RlY3RlZCBOb2RlIG5vZGU7Ci0KLQkJcHJvdGVjdGVkIGludCBpbmRleDsKLQotCQlwdWJsaWMgRGVsZXRlTm9kZUNvbW1hbmQoT2JqZWN0IG5vZGUpIHsKLQkJCXRoaXMubm9kZSA9IChOb2RlKSBub2RlOwotCQkJY29udGFpbmVyID0gKE5vZGVDb250YWluZXIpIHRoaXMubm9kZS5lQ29udGFpbmVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJaW5kZXggPSBjb250YWluZXIuZ2V0Tm9kZXMoKS5pbmRleE9mKG5vZGUpOwotCQkJLy8gVGhlcmUncyBhbHdheXMgdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhpcyBub2RlIGhhcyBhbHJlYWR5IGJlZW4KLQkJCS8vIGRlbGV0ZWQgYnkgdGhlIHRpbWUgdGhpcyBjb21tYW5kIGlzIGV4ZWN1dGVkIChlZy4sIHdoZW4gdGhlCi0JCQkvLyBwYWNrYWdlIGNvbnRhaW5pbmcgdGhpcyBjbGFzcyBpcyBhbHNvIHNlbGVjdGVkKS4gSGVuY2UsIHdlIGNoZWNrCi0JCQkvLyB0byBzZWUgaWYgdGhlIG5vZGUgZXhpc3RzIGluIHRoZSBkaWFncmFtLiBJZiBub3QsIGRvIG5vdGhpbmcuCi0JCQlpZiAoaW5kZXggPT0gLTEpCi0JCQkJcmV0dXJuOwotCQkJaW5jb21pbmdDb25uZWN0aW9uc1RvU291cmNlID0gbmV3IEhhc2hNYXAoKTsKLQkJCW91dGdvaW5nQ29ubmVjdGlvbnNUb1RhcmdldCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCW91dGdvaW5nQ29ubmVjdGlvbnNUb1RhcmdldC5wdXQobGluaywgbGluay5nZXRUYXJnZXQoKSk7Ci0JCQkJbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCWluY29taW5nQ29ubmVjdGlvbnNUb1NvdXJjZS5wdXQobGluaywgbGluay5nZXRTb3VyY2UoKSk7Ci0JCQkJbGluay5zZXRTb3VyY2UobnVsbCk7Ci0JCQl9Ci0JCQkvLyBDb21tZW50aW5nIGJlbG93IHR3byBsaW5lcywgTGlua3MgZ2V0IHJlbW92ZWQgZnJvbSB0aGUgbW9kZWwKLQkJCS8vIHdoZW4gbGluay5zZXRUYXJnZXQobnVsbCkgb3IgbGluay5zZXRTb3VyY2UobnVsbCkgaXMgZG9uZS4gIEZvciAKLQkJCS8vIE5vZGUgaWYgd2UgY2xlYXIgaW5jb21pbmcvb3V0Z29pbmcgY29ubmVjdGlvbnMsIFVuZG8gY29tbWFuZCB3aWxsIG5vdCB3b3JrLgotCQkJCi0JCQkvL25vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLmNsZWFyKCk7Ci0JCQkvL25vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLmNsZWFyKCk7Ci0JCQljb250YWluZXIuZ2V0Tm9kZXMoKS5yZW1vdmUoaW5kZXgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdW5kbygpIHsKLQkJCWlmIChpbmRleCA9PSAtMSkKLQkJCQlyZXR1cm47Ci0JCQljb250YWluZXIuZ2V0Tm9kZXMoKS5hZGQoaW5kZXgsIG5vZGUpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb3V0Z29pbmdDb25uZWN0aW9uc1RvVGFyZ2V0LmtleVNldCgpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJbGluay5zZXRUYXJnZXQoKE5vZGUpIG91dGdvaW5nQ29ubmVjdGlvbnNUb1RhcmdldC5nZXQobGluaykpOwotCQkJCWxpbmsuc2V0U291cmNlKG5vZGUpOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gaW5jb21pbmdDb25uZWN0aW9uc1RvU291cmNlLmtleVNldCgpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJbGluay5zZXRUYXJnZXQobm9kZSk7Ci0JCQkJbGluay5zZXRTb3VyY2UoKE5vZGUpIGluY29taW5nQ29ubmVjdGlvbnNUb1NvdXJjZS5nZXQobGluaykpOwotCQkJfQotCQkJb3V0Z29pbmdDb25uZWN0aW9uc1RvVGFyZ2V0ID0gbnVsbDsKLQkJCWluY29taW5nQ29ubmVjdGlvbnNUb1NvdXJjZSA9IG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCNjYW5FeGVjdXRlKCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCQlpZiAoVmFsaWRhdGlvbi5jaGVja0RlbGV0ZShub2RlKSAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiBzdXBlci5jYW5FeGVjdXRlKCk7Ci0JCX0KLQl9Ci0JLyoKLQkgKiBOb3QgaW4gdXNlLiBOZWVkIG1vZGlmaWNhdGlvbiBmb3IgZnV0dXJlIGZlYXR1cmUgaW1wbGVtZW50YXRpb25zLiAKLQkgKiBDb21wb3VuZCBDb21tYW5kIGRlbGV0aW9uIGRvIHRoZSByZWN1cnNpdmUgZGVsZXRpb24gYW5kIHVuZG8uIAotCSAqLwotLy8JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVsZXRlTm9kZUNvbXBvdW5kQ29tbWFuZCBleHRlbmRzIENvbXBvdW5kQ29tbWFuZCB7Ci0vLwkJcHJvdGVjdGVkIE1hcCBpbmNvbWluZ0Nvbm5lY3Rpb25zVG9Tb3VyY2U7Ci0vLwotLy8JCXByb3RlY3RlZCBNYXAgb3V0Z29pbmdDb25uZWN0aW9uc1RvVGFyZ2V0OwotLy8KLS8vCQlwcm90ZWN0ZWQgTm9kZUNvbnRhaW5lciBjb250YWluZXI7Ci0vLwotLy8JCXByb3RlY3RlZCBOb2RlIG5vZGU7Ci0vLwotLy8JCXByb3RlY3RlZCBpbnQgaW5kZXg7Ci0vLwotLy8JCXB1YmxpYyBEZWxldGVOb2RlQ29tcG91bmRDb21tYW5kKE9iamVjdCBub2RlKSB7Ci0vLwkJCXRoaXMubm9kZSA9IChOb2RlKSBub2RlOwotLy8JCQljb250YWluZXIgPSAoTm9kZUNvbnRhaW5lcikgdGhpcy5ub2RlLmVDb250YWluZXIoKTsKLS8vCQkJaW5jb21pbmdDb25uZWN0aW9uc1RvU291cmNlID0gbmV3IEhhc2hNYXAoKTsKLS8vCQkJb3V0Z29pbmdDb25uZWN0aW9uc1RvVGFyZ2V0ID0gbmV3IEhhc2hNYXAoKTsKLS8vCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5ub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0vLwkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLS8vCQkJCW91dGdvaW5nQ29ubmVjdGlvbnNUb1RhcmdldC5wdXQobGluaywgbGluay5nZXRUYXJnZXQoKSk7Ci0vLwkJCQlhZGQobmV3IERlbGV0ZUxpbmtDb21tYW5kKCBsaW5rLCBmYWxzZSkpOwotLy8JCQl9Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMubm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotLy8JCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0vLwkJCQlpbmNvbWluZ0Nvbm5lY3Rpb25zVG9Tb3VyY2UucHV0KGxpbmssIGxpbmsuZ2V0U291cmNlKCkpOwotLy8JCQkJYWRkKG5ldyBEZWxldGVMaW5rQ29tbWFuZCggbGluaywgZmFsc2UpKTsKLS8vCQkJfQotLy8JCX0KLS8vCi0vLwkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLS8vCQkJaW5kZXggPSBjb250YWluZXIuZ2V0Tm9kZXMoKS5pbmRleE9mKG5vZGUpOwotLy8JCQkvLyBUaGVyZSdzIGFsd2F5cyB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGlzIG5vZGUgaGFzIGFscmVhZHkgYmVlbgotLy8JCQkvLyBkZWxldGVkIGJ5IHRoZSB0aW1lIHRoaXMgY29tbWFuZCBpcyBleGVjdXRlZCAoZWcuLCB3aGVuIHRoZQotLy8JCQkvLyBwYWNrYWdlIGNvbnRhaW5pbmcgdGhpcyBjbGFzcyBpcyBhbHNvIHNlbGVjdGVkKS4gSGVuY2UsIHdlIGNoZWNrCi0vLwkJCS8vIHRvIHNlZSBpZiB0aGUgbm9kZSBleGlzdHMgaW4gdGhlIGRpYWdyYW0uIElmIG5vdCwgZG8gbm90aGluZy4KLS8vCQkJaWYgKGluZGV4ID09IC0xKQotLy8JCQkJcmV0dXJuOwotLy8KLS8vCQkJc3VwZXIuZXhlY3V0ZSgpOwotLy8JCQljb250YWluZXIuZ2V0Tm9kZXMoKS5yZW1vdmUoaW5kZXgpOwotLy8JCQkKLS8vCQl9Ci0vLwotLy8JCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0vLwkJCWlmIChpbmRleCA9PSAtMSkKLS8vCQkJCXJldHVybjsKLS8vCQkJY29udGFpbmVyLmdldE5vZGVzKCkuYWRkKGluZGV4LCBub2RlKTsKLS8vCQkJc3VwZXIudW5kbygpOwotLy8JCX0KLS8vCi0vLwkJLyoqCi0vLwkJICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCNjYW5FeGVjdXRlKCkKLS8vCQkgKi8KLS8vCQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotLy8JCQlpZiAoVmFsaWRhdGlvbi5jaGVja0RlbGV0ZShub2RlKSAhPSBudWxsKQotLy8JCQkJcmV0dXJuIGZhbHNlOwotLy8JCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotLy8JCX0KLS8vCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0RlbGV0ZUxpbmtDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EZWxldGVMaW5rQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTBjZmZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0RlbGV0ZUxpbmtDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlTGlua0NvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgTGluayBsaW5rOwotCi0JcHJpdmF0ZSBOb2RlIHNyYywgdGFyZ2V0OwotCi0JcHJpdmF0ZSBpbnQgc3JjSW5kZXgsIHRhcmdldEluZGV4OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX2RlbGV0ZUxpbmtDb21tYW5kX2xhYmVsOyAKLQotCXB1YmxpYyBEZWxldGVMaW5rQ29tbWFuZChMaW5rIGxpbmssIGJvb2xlYW4gaXNIYXJkRGVsZXRlKSB7Ci0JCXN1cGVyKExBQkVMKTsKLQkJdGhpcy5saW5rID0gbGluazsKLQkJc3JjID0gbGluay5nZXRTb3VyY2UoKTsKLQkJdGFyZ2V0ID0gbGluay5nZXRUYXJnZXQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlpZiAoVmFsaWRhdGlvbi5jaGVja0RlbGV0ZShsaW5rKSAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gbGluayAhPSBudWxsICYmIHNyYyAhPSBudWxsICYmIHRhcmdldCAhPSBudWxsOwotCX0KLQotCS8qCi0JICogVGhpcyBzaG91bGQgd29yayBldmVuIGlmIHRoZSBsaW5rICh2aWV3KSB3YXMgZGVsZXRlZC4gRWcuLCB1c2VyIHNlbGVjdHMgYQotCSAqIGNsYXNzIGFuZCBvbmUgb2YgaXRzIHJlZmVyZW5jZXMsIGFuZCBoaXRzIEN0cmwrRGVsLiBUaGUgY2xhc3Mgd2lsbCBiZQotCSAqIGRlbGV0ZWQgZmlyc3QgYW5kIGl0IHdpbGwgZGVsZXRlIGFsbCBpdHMgcmVmZXJlbmNlcy4gV2hlbiB0aGlzIGNvbW1hbmQgaXMKLQkgKiBleGVjdXRlZCwgaXQgc2hvdWxkIGRvIHRoZSBoYXJkLWRlbGV0ZSBwYXJ0LgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXNyY0luZGV4ID0gc3JjLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pbmRleE9mKGxpbmspOwotCQl0YXJnZXRJbmRleCA9IHRhcmdldC5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaW5kZXhPZihsaW5rKTsKLQkJaWYgKHNyY0luZGV4ICE9IC0xICYmIHRhcmdldEluZGV4ICE9IC0xKSB7Ci0JCQlzcmMuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLnJlbW92ZShzcmNJbmRleCk7Ci0JCQl0YXJnZXQuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLnJlbW92ZSh0YXJnZXRJbmRleCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoc3JjSW5kZXggIT0gLTEgJiYgdGFyZ2V0SW5kZXggIT0gLTEpIHsKLQkJCXNyYy5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuYWRkKHNyY0luZGV4LCBsaW5rKTsKLQkJCXRhcmdldC5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuYWRkKHRhcmdldEluZGV4LCBsaW5rKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0RpYWdyYW1Nb2RpZnlDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EaWFncmFtTW9kaWZ5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWYxNmJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0RpYWdyYW1Nb2RpZnlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuRGlhZ3JhbVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEaWFncmFtTW9kaWZ5Q29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBFT2JqZWN0IG9iamVjdDsKLQotCXByaXZhdGUgYm9vbGVhbiBjYW5VbmRvID0gdHJ1ZTsKLQotCXB1YmxpYyBEaWFncmFtTW9kaWZ5Q29tbWFuZChTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobGFiZWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERpYWdyYW0oRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCU9iamVjdCBvYmogPSBkaWFncmFtLmdldE9iamVjdCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJb2JqZWN0ID0gKEVPYmplY3QpIG9iajsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmVFeGVjdXRlKCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShvYmplY3QsIE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSk7Ci0JCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheVdhcm5pbmcoCi0JCQkJCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuY29tbWFuZF9jYW5ub3RFZGl0LCAKLQkJCQkJCQlzdGF0dXMpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlpZiAocHJlcGFyZUV4ZWN1dGUoKSkgewotCQkJZG9FeGVjdXRlKCk7Ci0JCQljYW5VbmRvID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCWNhblVuZG8gPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQjY2FuVW5kbygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIGNhblVuZG87Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9FeGVjdXRlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL01vdmVCZW5kcG9pbnRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9Nb3ZlQmVuZHBvaW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGI3NWMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL01vdmVCZW5kcG9pbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0vKioKLSAqIEJlbmRwb2ludCBtYW5pcHVsYXRpb24gY29tbWFuZHMgY2Fubm90IGJlIGNoYWluZWQgb3IgY29tcG91bmRlZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1vdmVCZW5kcG9pbnRDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIExpbmsgbGluazsKLQotCXByaXZhdGUgaW50IGluZGV4OwotCi0JcHJpdmF0ZSBBYnNvbHV0ZUJlbmRwb2ludCBvbGRCZW5kcG9pbnQ7Ci0KLQlBYnNvbHV0ZUJlbmRwb2ludCBuZXdCZW5kcG9pbnQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfbW92ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw7IAotCi0JcHVibGljIE1vdmVCZW5kcG9pbnRDb21tYW5kKExpbmsgbGluaywgUG9pbnQgbG9jYXRpb24sIGludCBpbmRleCkgewotCQlzdXBlcihMQUJFTCk7Ci0JCXRoaXMubGluayA9IGxpbms7Ci0JCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJbmV3QmVuZHBvaW50ID0gbmV3IEFic29sdXRlQmVuZHBvaW50KGxvY2F0aW9uKTsKLQkJb2xkQmVuZHBvaW50ID0gbGluay5nZXRCZW5kcG9pbnRzKCkuZ2V0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gbGluayAhPSBudWxsICYmIGluZGV4ID49IDAgJiYgbmV3QmVuZHBvaW50ICE9IG51bGwKLQkJCQkmJiBvbGRCZW5kcG9pbnQgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlsaW5rLmdldEJlbmRwb2ludHMoKS5zZXQoaW5kZXgsIG5ld0JlbmRwb2ludCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJbGluay5nZXRCZW5kcG9pbnRzKCkuc2V0KGluZGV4LCBvbGRCZW5kcG9pbnQpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL1JlY29ubmVjdExpbmtDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9SZWNvbm5lY3RMaW5rQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDkzMjlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL1JlY29ubmVjdExpbmtDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFJlY29ubmVjdExpbmtDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTb3VyY2U7Ci0KLQlwcml2YXRlIExpbmsgbGluazsKLQotCXByaXZhdGUgTm9kZSBuZXdOb2RlLCBvbGROb2RlOwotCi0JcHJpdmF0ZSBpbnQgdmlld0luZGV4OwotCi0JcHJpdmF0ZSBQb2ludCBlbmRQb2ludDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl9yZWNvbm5lY3RMaW5rQ29tbWFuZF9sYWJlbDsgCi0KLQlwdWJsaWMgUmVjb25uZWN0TGlua0NvbW1hbmQoTGluayBsaW5rLCBOb2RlIG5ld05vZGUsIGJvb2xlYW4gaXNTb3VyY2UpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQl0aGlzLmxpbmsgPSBsaW5rOwotCQl0aGlzLm5ld05vZGUgPSBuZXdOb2RlOwotCQl0aGlzLmlzU291cmNlID0gaXNTb3VyY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5kUG9pbnQoUG9pbnQgcCkgewotCQllbmRQb2ludCA9IHAuZ2V0Q29weSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gbGluayAhPSBudWxsICYmIG5ld05vZGUgIT0gbnVsbDsKLQkJaWYgKCFyZXN1bHQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoaXNTb3VyY2UpIHsKLQkJCXJldHVybiBWYWxpZGF0aW9uLmNoZWNrUmVjb25uZWN0KG5ld05vZGUsIGxpbmsuZ2V0VGFyZ2V0KCksIGxpbmspID09IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gVmFsaWRhdGlvbi5jaGVja1JlY29ubmVjdChsaW5rLmdldFNvdXJjZSgpLCBuZXdOb2RlLCBsaW5rKSA9PSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQotCQkvLyBMaW5rCi0JCWlmIChpc1NvdXJjZSkgewotCQkJb2xkTm9kZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCQlpZiAob2xkTm9kZSAhPSBudWxsKSB7IC8vIHNhZmV0eSBjaGVjayB0byBoYW5kbGUgZGFuZ2xpbmcgbGluawotCQkJCXZpZXdJbmRleCA9IG9sZE5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLmluZGV4T2YobGluayk7Ci0JCQl9Ci0JCQlsaW5rLnNldFNvdXJjZShuZXdOb2RlKTsKLQkJCWxpbmsuc2V0U291cmNlRW5kUG9pbnQoZW5kUG9pbnQpOwotCQl9IGVsc2UgewotCQkJb2xkTm9kZSA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCQlpZiAob2xkTm9kZSAhPSBudWxsKSB7IC8vIHNhZmV0eSBjaGVjayB0byBoYW5kbGUgZGFuZ2xpbmcgbGluawotCQkJCXZpZXdJbmRleCA9IG9sZE5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLmluZGV4T2YobGluayk7Ci0JCQl9Ci0JCQlsaW5rLnNldFRhcmdldChuZXdOb2RlKTsKLQkJCWxpbmsuc2V0VGFyZ2V0RW5kUG9pbnQoZW5kUG9pbnQpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoaXNTb3VyY2UpIHsKLQkJCW5ld05vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLnJlbW92ZShsaW5rKTsKLQkJCW9sZE5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLmFkZCh2aWV3SW5kZXgsIGxpbmspOwotCQl9IGVsc2UgewotCQkJbmV3Tm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkucmVtb3ZlKGxpbmspOwotCQkJb2xkTm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuYWRkKHZpZXdJbmRleCwgbGluayk7Ci0JCX0KLQkJb2xkTm9kZSA9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9SZWZyZXNoRGlhZ3JhbUZyb21CYXNlQWN0aXZpdHlDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9SZWZyZXNoRGlhZ3JhbUZyb21CYXNlQWN0aXZpdHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMzU2NTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvUmVmcmVzaERpYWdyYW1Gcm9tQmFzZUFjdGl2aXR5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVmcmVzaERpYWdyYW1Gcm9tQmFzZUFjdGl2aXR5Q29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gRGlhZ3JhbVVJUmVzb3VyY2VzLnJlZnJlc2hGcm9tQmFzZUNtZF9sYWJlbDsgCi0KLQlwdWJsaWMgUmVmcmVzaERpYWdyYW1Gcm9tQmFzZUFjdGl2aXR5Q29tbWFuZCgpIHsKLQkJc3VwZXIoTEFCRUwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2UyZDdiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGNvbW1hbmRzIGZvciBlZGl0aW5nIHRoZSBhY3Rpdml0eSBkaWFncmFtcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNTA0MzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCBleHRlbmRzIERpYWdyYW1FZGl0UGFydCB7Ci0KLQlpbnQgeSA9IDYwOwotCi0JYm9vbGVhbiB4YXhpc2JlZ2luID0gZmFsc2U7Ci0KLQlib29sZWFuIGxvYWRpbmcgPSB0cnVlOwotCi0JZmluYWwgc3RhdGljIGludCBzcGFjaW5nID0gNDA7Ci0KLQlmaW5hbCBzdGF0aWMgaW50IHlzcGFjaW5nID0gMjA7Ci0KLQlib29sZWFuIG1pc2NlbGxhbmVvdXMgPSBmYWxzZTsKLQotCWludCB4ID0gMTA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRTID0gIm91dHB1dHMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVFMgPSAiaW5wdXRzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBMaXN0IHJlY2VudGx5QWRkZWRQYXJ0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKiAKLQkgKiBFZGl0UGFydCBmb3IgQWN0aXZpdHlEZXRhaWxEaWFncmFtLgotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydChBY3Rpdml0eURldGFpbERpYWdyYW0gbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIG1ldGhvZCBzdXBlci5yZXNldENoaWxkcmVuTG9jYXRpb25zLiBJbiB0aGlzLCBBbGwgdGhlIFRhc2sncwotCSAqIE1hbmRhdG9yeUlucHV0IHdvcmtwcm9kdWN0cyBwbGFjZWQgb24gdG9wLiBhbmQgUm9sZVRhc2sgY29tcG9zaXRlIGluIHRoZQotCSAqIG1pZGRsZS4gYW5kIFRhc2sncyBvdXRwdXQgd29ya3Byb2R1Y3RzIHNvdXRoLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc2V0Q2hpbGRyZW5Mb2NhdGlvbnMoKSB7Ci0JCWZpbmFsIGludCB5c3BhY2luZyA9IDQwOwotCQlMaXN0IHJvbGVjb21wb3NpdGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IG91dHB1dFdvcmtQcm9kdWN0Q29tcG9zaXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBtaXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB0YXNrTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdGhpcy5yZWNlbnRseUFkZGVkUGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCU5vZGUgbiA9IChOb2RlKSAoKEVkaXRQYXJ0KSBjaGlsZCkuZ2V0TW9kZWwoKTsKLQkJCWlmIChuLmdldExvY2F0aW9uKCkgPT0gbnVsbCB8fCBuLmdldExvY2F0aW9uKCkueCA9PSAtMSkgewotCQkJCXRoaXMucmVjZW50bHlBZGRlZFBhcnRzLmFkZChjaGlsZCk7Ci0JCQl9Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQkJcm9sZWNvbXBvc2l0ZUxpc3QuYWRkKGNoaWxkKTsKLQkJCQlMaXN0IGxpc3QgPSAoKFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpIGNoaWxkKS5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQkJTm9kZSBvYmpOb2RlID0gKE5vZGUpICgoTm9kZUVkaXRQYXJ0KSBvYmopLmdldE1vZGVsKCk7Ci0JCQkJCWlmIChvYmpOb2RlIGluc3RhbmNlb2YgVGFza05vZGUpIHsKLQkJCQkJCXRhc2tMaXN0LmFkZChvYmpOb2RlKTsKLQkJCQkJCUhhc2hNYXAgdGFza01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCQlMaXN0IGlucHV0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCUxpc3Qgb3V0cHV0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCXRhc2tNYXAucHV0KCJpbnB1dHMiLCBpbnB1dExpc3QpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl0YXNrTWFwLnB1dCgib3V0cHV0cyIsIG91dHB1dExpc3QpOyAvLyROT04tTkxTLTEkCi0JCQkJCQltYXAucHV0KG9iak5vZGUsIHRhc2tNYXApOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCQlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZDsKLQkJCQlpZiAocGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGUpIHsKLQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUgbm9kZSA9IChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgcGFydAotCQkJCQkJCS5nZXRNb2RlbCgpOwotCQkJCQlpZiAobm9kZS5nZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuSU5QVVRTKSB7Ci0JCQkJCQlpbnB1dHdvcmtwcm9kdWN0Q29tcG9zaXRlTGlzdC5hZGQoY2hpbGQpOwotCQkJCQl9IGVsc2UgaWYgKG5vZGUuZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLk9VVFBVVFMpIHsKLQkJCQkJCW91dHB1dFdvcmtQcm9kdWN0Q29tcG9zaXRlTGlzdC5hZGQoY2hpbGQpOwotCQkJCQl9Ci0JCQkJCWNhbGNTaXplKGNoaWxkKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCW1pc2NMaXN0LmFkZChjaGlsZCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBTZXQgc2l6ZSBmb3IgdGhlIHJvbGVjb21wb3NpdGUuCi0JCWlmICghcm9sZWNvbXBvc2l0ZUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSByb2xlY29tcG9zaXRlTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0JCQkJTGlzdCBsaXN0ID0gKChSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSBvYmplY3QpLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdG9yMSA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvcjEuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXRvcjEubmV4dCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRGVzY3JpcHRvck5vZGVFZGl0UGFydCkgewotCQkJCQkJaWYgKCgoRGVzY3JpcHRvck5vZGVFZGl0UGFydCkgb2JqKS5nZXRNb2RlbCgpIGluc3RhbmNlb2YgVGFza05vZGUpIHsKLQkJCQkJCQlUYXNrTm9kZSB0YXNrTm9kZSA9IChUYXNrTm9kZSkgKChEZXNjcmlwdG9yTm9kZUVkaXRQYXJ0KSBvYmopCi0JCQkJCQkJCQkuZ2V0TW9kZWwoKTsKLQkJCQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrID0gKFRhc2tEZXNjcmlwdG9yKSB0YXNrTm9kZQotCQkJCQkJCQkJLmdldE9iamVjdCgpOwotCQkJCQkJCWZvciAoSXRlcmF0b3Igd3BpdG9yID0gaW5wdXR3b3JrcHJvZHVjdENvbXBvc2l0ZUxpc3QKLQkJCQkJCQkJCS5pdGVyYXRvcigpOyB3cGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0IHdwRWRpdFBhcnQgPSAoV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgd3BpdG9yCi0JCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUgd3BDb21wb3NpdGVOb2RlID0gKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSB3cEVkaXRQYXJ0Ci0JCQkJCQkJCQkJLmdldE1vZGVsKCk7Ci0JCQkJCQkJCU9iamVjdCB3cE9iamVjdCA9IHdwQ29tcG9zaXRlTm9kZS5nZXRPYmplY3QoKTsKLQkJCQkJCQkJaWYgKHdwT2JqZWN0LmVxdWFscyh0YXNrKSkgewotCQkJCQkJCQkJaW50IHdpZHRoID0gd3BFZGl0UGFydC5nZXRGaWd1cmUoKQotCQkJCQkJCQkJCQkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoOwotCQkJCQkJCQkJaW50IGhlaWdodCA9ICgoRGVzY3JpcHRvck5vZGVFZGl0UGFydCkgb2JqKQotCQkJCQkJCQkJCQkuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCQkJCQkJCSgoRGVzY3JpcHRvck5vZGVFZGl0UGFydCkgb2JqKQotCQkJCQkJCQkJCQkuZ2V0RmlndXJlKCkKLQkJCQkJCQkJCQkJLnNldFByZWZlcnJlZFNpemUoCi0JCQkJCQkJCQkJCQkJbmV3IERpbWVuc2lvbih3aWR0aCwgaGVpZ2h0KSk7Ci0JCQkJCQkJCQlpZiAoKChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgd3BFZGl0UGFydAotCQkJCQkJCQkJCQkuZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLklOUFVUUykgewotCQkJCQkJCQkJCUxpc3QgaW5wdXRMaXN0ID0gKExpc3QpICgoSGFzaE1hcCkgbWFwCi0JCQkJCQkJCQkJCQkuZ2V0KHRhc2tOb2RlKSkuZ2V0KElOUFVUUyk7Ci0JCQkJCQkJCQkJaW5wdXRMaXN0LmFkZCh3cEVkaXRQYXJ0KTsKLQkJCQkJCQkJCX0gZWxzZSBpZiAoKChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgd3BFZGl0UGFydAotCQkJCQkJCQkJCQkuZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLk9VVFBVVFMpIHsKLQkJCQkJCQkJCQlMaXN0IG91dHB1dExpc3QgPSAoTGlzdCkgKChIYXNoTWFwKSBtYXAKLQkJCQkJCQkJCQkJCS5nZXQodGFza05vZGUpKS5nZXQoT1VUUFVUUyk7Ci0JCQkJCQkJCQkJb3V0cHV0TGlzdC5hZGQod3BFZGl0UGFydCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIXJvbGVjb21wb3NpdGVMaXN0LmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb2xlY29tcG9zaXRlTGlzdC5zaXplKCk7IGkrKykgewotCQkJCUxpc3QgY29uZmlybWVkU2VxSW5wdXRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUxpc3QgY29uZmlybWVkU2VxT3V0cHV0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlMaXN0IGxpc3QgPSAoKFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpIHJvbGVjb21wb3NpdGVMaXN0Ci0JCQkJCQkuZ2V0KGkpKS5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbGlzdC5zaXplKCk7IGorKykgewotCQkJCQlEZXNjcmlwdG9yTm9kZUVkaXRQYXJ0IHRhc2sgPSAoRGVzY3JpcHRvck5vZGVFZGl0UGFydCkgbGlzdAotCQkJCQkJCS5nZXQoaik7Ci0JCQkJCWlmICh0YXNrLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBUYXNrTm9kZSkgewotCQkJCQkJVGFza05vZGUgdGFza25vZGUgPSAoVGFza05vZGUpIHRhc2suZ2V0TW9kZWwoKTsKLQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgaW5wdXR3b3JrcHJvZHVjdENvbXBvc2l0ZUxpc3QKLQkJCQkJCQkJLnNpemUoKTsgaysrKSB7Ci0JCQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUgd3Bjb21wID0gKChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgKChXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSBpbnB1dHdvcmtwcm9kdWN0Q29tcG9zaXRlTGlzdAotCQkJCQkJCQkJLmdldChrKSkuZ2V0TW9kZWwoKSk7Ci0JCQkJCQkJaWYgKHdwY29tcC5nZXRPYmplY3QoKS5lcXVhbHModGFza25vZGUuZ2V0T2JqZWN0KCkpKSB7Ci0JCQkJCQkJCWlmICh3cGNvbXAuZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLklOUFVUUykgewotCQkJCQkJCQkJY29uZmlybWVkU2VxSW5wdXRMaXN0Ci0JCQkJCQkJCQkJCS5hZGQoaW5wdXR3b3JrcHJvZHVjdENvbXBvc2l0ZUxpc3QKLQkJCQkJCQkJCQkJCQkuZ2V0KGspKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgb3V0cHV0V29ya1Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCS5zaXplKCk7IGsrKykgewotCQkJCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdwY29tcCA9ICgoV29ya1Byb2R1Y3RDb21wb3NpdGUpICgoV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgb3V0cHV0V29ya1Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCQkuZ2V0KGspKS5nZXRNb2RlbCgpKTsKLQkJCQkJCQlpZiAod3Bjb21wLmdldE9iamVjdCgpLmVxdWFscyh0YXNrbm9kZS5nZXRPYmplY3QoKSkpIHsKLQkJCQkJCQkJaWYgKHdwY29tcC5nZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuT1VUUFVUUykgewotCQkJCQkJCQkJY29uZmlybWVkU2VxT3V0cHV0TGlzdAotCQkJCQkJCQkJCQkuYWRkKG91dHB1dFdvcmtQcm9kdWN0Q29tcG9zaXRlTGlzdAotCQkJCQkJCQkJCQkJCS5nZXQoaykpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghY29uZmlybWVkU2VxSW5wdXRMaXN0LmlzRW1wdHkoKSkgewotCQkJCQlzZXRPYmplY3RzTG9jYXRpb25zKGNvbmZpcm1lZFNlcUlucHV0TGlzdCk7Ci0JCQkJCXkgPSBjYWNoZWRQb2ludC55ICsgY2FjaGVkSGVpZ2h0ICsgeXNwYWNpbmc7Ci0JCQkJfQotCQkJCUxpc3Qgcm9sZUMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJcm9sZUMuYWRkKHJvbGVjb21wb3NpdGVMaXN0LmdldChpKSk7Ci0JCQkJc2V0T2JqZWN0c0xvY2F0aW9ucyhyb2xlQyk7Ci0KLQkJCQl5ID0gY2FjaGVkUG9pbnQueSArIGNhY2hlZEhlaWdodCArIHlzcGFjaW5nOwotCQkJCWlmICghY29uZmlybWVkU2VxT3V0cHV0TGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJc2V0T2JqZWN0c0xvY2F0aW9ucyhjb25maXJtZWRTZXFPdXRwdXRMaXN0KTsKLQkJCQkJeSA9IGNhY2hlZFBvaW50LnkgKyBjYWNoZWRIZWlnaHQgKyB5c3BhY2luZzsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCWlmICghbWlzY0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByaW50IFNpemUgb2YgbWlzYzogIiArIG1pc2NMaXN0LnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmICghbG9hZGluZykgewotCQkJCW1pc2NlbGxhbmVvdXMgPSB0cnVlOwotCQkJfQotCQkJc2V0T2JqZWN0c0xvY2F0aW9ucyhtaXNjTGlzdCk7Ci0JCQltaXNjZWxsYW5lb3VzID0gZmFsc2U7Ci0JCX0KLQotCQlsb2FkaW5nID0gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbGNTaXplKE9iamVjdCBjaGlsZCkgewotCQlMaXN0IGxpc3QgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZCkuZ2V0Q2hpbGRyZW4oKTsKLQkJaW50IGxhcmdlc3RXaWR0aCA9IDA7Ci0JCWludCBsYXJnZXN0SGVpZ2h0ID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCU5vZGUgb2JqTm9kZSA9IChOb2RlKSAoKE5vZGVFZGl0UGFydCkgb2JqKS5nZXRNb2RlbCgpOwotCQkJaWYgKG9iak5vZGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKSB7Ci0JCQkJaW50IG5vZGVXaWR0aCA9ICgoRGVzY3JpcHRvck5vZGVFZGl0UGFydCkgb2JqKS5nZXRGaWd1cmUoKQotCQkJCQkJLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQlpbnQgbm9kZUhlaWdodCA9ICgoRGVzY3JpcHRvck5vZGVFZGl0UGFydCkgb2JqKS5nZXRGaWd1cmUoKQotCQkJCQkJLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQkJaWYgKG5vZGVXaWR0aCA+IGxhcmdlc3RXaWR0aCkKLQkJCQkJbGFyZ2VzdFdpZHRoID0gbm9kZVdpZHRoOwotCQkJCWlmIChub2RlSGVpZ2h0ID4gbGFyZ2VzdEhlaWdodCkKLQkJCQkJbGFyZ2VzdEhlaWdodCA9IG5vZGVIZWlnaHQ7Ci0JCQl9Ci0JCX0KLQkJKChXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSBjaGlsZCkuZ2V0RmlndXJlKCkuc2V0UHJlZmVycmVkU2l6ZSgKLQkJCQluZXcgRGltZW5zaW9uKGxhcmdlc3RXaWR0aCAqIDIgKyAxMCwgMjAgKyBsYXJnZXN0SGVpZ2h0Ci0JCQkJCQkqIChsaXN0LnNpemUoKSAvIDIgKyAxKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRPYmplY3RzTG9jYXRpb25zKExpc3QgbGlzdCkgewotCi0JCXhheGlzYmVnaW4gPSB0cnVlOwotCQl4ID0gMTA7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQ7Ci0JCQkJaWYgKHBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIHBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJUG9pbnQgcCA9IG5vZGUuZ2V0TG9jYXRpb24oKTsKLQkJCQkJaWYgKHAgPT0gbnVsbCB8fCBwLnggPT0gLTEpIHsKLQkJCQkJCWludCB2aWV3ZXJXaWR0aCA9IHBhcnQuZ2V0Um9vdCgpLmdldFZpZXdlcigpCi0JCQkJCQkJCS5nZXRDb250cm9sKCkuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JCQkJCQlpZiAoIXhheGlzYmVnaW4pIHsKLQkJCQkJCQl4ID0gY2FjaGVkUG9pbnQueCArIGNhY2hlZFdpZHRoICsgc3BhY2luZzsKLQkJCQkJCX0KLQkJCQkJCS8vIGNoZWNrIGlmIHAgaXMgbnVsbCwgY3JlYXRlIFBvaW50LgotCQkJCQkJaWYgKHAgPT0gbnVsbCkKLQkJCQkJCQlwID0gbmV3IFBvaW50KCk7Ci0KLQkJCQkJCWlmICghbG9hZGluZyAmJiBtaXNjZWxsYW5lb3VzKSB7Ci0JCQkJCQkJcC54ID0geDsKLQkJCQkJCQlwLnkgPSAxMDsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcC54ID0geDsKLQkJCQkJCQlwLnkgPSB5OwotCQkJCQkJfQotCQkJCQkJbm9kZS5zZXRMb2NhdGlvbihwKTsKLQkJCQkJCWlmICghbWlzY2VsbGFuZW91cykKLQkJCQkJCQljYWNoZWRQb2ludCA9IHA7Ci0JCQkJCQljYWNoZWRXaWR0aCA9IHBhcnQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoOwotCQkJCQkJaWYgKHBhcnQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCA+IGNhY2hlZEhlaWdodCkKLQkJCQkJCQljYWNoZWRIZWlnaHQgPSBwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQkJCQl4YXhpc2JlZ2luID0gZmFsc2U7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiUG9pbnQgOiAiICsgbmV3IFBvaW50KHgsIHkpLnRvU3RyaW5nKCkgKyAiQW5kIHdpZHRoPSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSsgY2FjaGVkV2lkdGgKLQkJCQkJCQkJCQkJKyAiLCBIZWlnaHQ9IiArIGNhY2hlZEhlaWdodCArICIsIFdpZHRoIG9mIFZpZXdlcjogIiArIHZpZXdlcldpZHRoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHJlY2VudGx5IGFkZGRlZCBlZGl0cGFydHMuIFVzdWFsbHkgY2FsbGVkIAotCSAqIGJ5IGRpYWdyYW0gc2VydmljZXMgdG8gZG8gYXV0b2xheW91dCBhZGp1c3RtZW50LgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlY2VudGx5QWRkZWRQYXJ0cygpIHsKLQkJcmV0dXJuIHJlY2VudGx5QWRkZWRQYXJ0czsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgcmVjZW50bHkgYWRkZWQgZWRpdHBhcnRzIGZyb20gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXJSZWNlbnRseUFkZGVkUGFydHMoKSB7Ci0JCXJlY2VudGx5QWRkZWRQYXJ0cy5jbGVhcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNDZmNTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci0KLS8qKgotICogRmFjdG9yeSBmb3IgQWN0aXZpdHlEZXRhaWxEaWFncmFtJ3MgRWRpdFBhcnQuIENyZWF0ZXMgYW4gRWRpdFBhcnQgZm9yCi0gKiBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSdzIGNoaWxkcmVuLiAgCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSBpbXBsZW1lbnRzIEVkaXRQYXJ0RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIEVkaXRQYXJ0IGZvciBhIGNoaWxkIHdpdGggaW4gdGhlIGNvbnRleHQuCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KEVkaXRQYXJ0IGNvbnRleHQsIE9iamVjdCBtb2RlbCkgewotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJCXJldHVybiBuZXcgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQoCi0JCQkJCShBY3Rpdml0eURldGFpbERpYWdyYW0pIG1vZGVsKTsKLQkJfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlKSB7Ci0JCQlyZXR1cm4gbmV3IFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQoKFJvbGVUYXNrQ29tcG9zaXRlKSBtb2RlbCk7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZSkgewotCQkJcmV0dXJuIG5ldyBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KAotCQkJCQkoV29ya1Byb2R1Y3RDb21wb3NpdGUpIG1vZGVsKTsKLQkJfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFJvbGVOb2RlIHx8IG1vZGVsIGluc3RhbmNlb2YgVGFza05vZGUKLQkJCQl8fCBtb2RlbCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpIHsKLQkJCXJldHVybiBuZXcgRGVzY3JpcHRvck5vZGVFZGl0UGFydCgoTmFtZWROb2RlKSBtb2RlbCk7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBMaW5rKSB7Ci0JCQlyZXR1cm4gbmV3IExpbmtFZGl0UGFydCgoTGluaykgbW9kZWwpOwotCQl9Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJVHlwZWROb2RlIG5vZGUgPSAoVHlwZWROb2RlKSBtb2RlbDsKLQkJCXN3aXRjaCAobm9kZS5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgVHlwZWROb2RlLlNUQVJUOgotCQkJCXJldHVybiBuZXcgU3RhcnROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5FTkQ6Ci0JCQkJcmV0dXJuIG5ldyBFbmROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5ERUNJU0lPTjoKLQkJCQlyZXR1cm4gbmV3IERlY2lzaW9uTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuU1lOQ0hfQkFSOgotCQkJCXJldHVybiBuZXcgU3luY2hCYXJOb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5GUkVFX1RFWFQ6Ci0JCQkJcmV0dXJuIG5ldyBGcmVlVGV4dE5vZGVFZGl0UGFydChub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEaWFncmFtRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEaWFncmFtRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA3OWY5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0FjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtOwotCi0vKioKLSAqIEVkaXRQYXJ0IGZvciBBY3Rpdml0eURpYWdyYW0uCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEaWFncmFtRWRpdFBhcnQgZXh0ZW5kcyBEaWFncmFtRWRpdFBhcnQgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGVkaXRwYXJ0IGZvciBBY3Rpdml0eSBEaWFncmFtLiAKLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwge0BsaW5rIEFjdGl2aXR5RGlhZ3JhbX0KLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEaWFncmFtRWRpdFBhcnQoQWN0aXZpdHlEaWFncmFtIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0FjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VjOTc2YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0FjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURpYWdyYW1FZGl0UGFydEZhY3RvcnkgaW1wbGVtZW50cyBFZGl0UGFydEZhY3RvcnkgewotCi0JLyoqCi0JICogQ3JlYXRlcyBlZGl0cGFydCBmb3IgQWN0aXZpdHlEaWFncmFtJ3MgY2hpbGRyZW4uIAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeSNjcmVhdGVFZGl0UGFydChvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpIHsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgQWN0aXZpdHlEaWFncmFtKSB7Ci0JCQlyZXR1cm4gbmV3IEFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0KChBY3Rpdml0eURpYWdyYW0pIG1vZGVsKTsKLQkJfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJcmV0dXJuIG5ldyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVFZGl0UGFydCgoTmFtZWROb2RlKSBtb2RlbCk7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBMaW5rKSB7Ci0JCQlyZXR1cm4gbmV3IExpbmtFZGl0UGFydCgoTGluaykgbW9kZWwpOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQlUeXBlZE5vZGUgbm9kZSA9IChUeXBlZE5vZGUpIG1vZGVsOwotCQkJc3dpdGNoIChub2RlLmdldFR5cGUoKSkgewotCQkJY2FzZSBUeXBlZE5vZGUuU1RBUlQ6Ci0JCQkJcmV0dXJuIG5ldyBTdGFydE5vZGVFZGl0UGFydChub2RlKTsKLQkJCWNhc2UgVHlwZWROb2RlLkVORDoKLQkJCQlyZXR1cm4gbmV3IEVuZE5vZGVFZGl0UGFydChub2RlKTsKLQkJCWNhc2UgVHlwZWROb2RlLkRFQ0lTSU9OOgotCQkJCXJldHVybiBuZXcgRGVjaXNpb25Ob2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5TWU5DSF9CQVI6Ci0JCQkJcmV0dXJuIG5ldyBTeW5jaEJhck5vZGVFZGl0UGFydChub2RlKTsKLQkJCWNhc2UgVHlwZWROb2RlLkZSRUVfVEVYVDoKLQkJCQlyZXR1cm4gbmV3IEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9CYXNlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQmFzZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMTk3ZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9CYXNlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC50ZXh0LlRleHRGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llcy5MYWJlbFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5TZWxlY3RhYmxlTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLQotLyoqCi0gKiBQcm92aWRlcyBpbmZyYXN0cnVjdHVyZSBmb3IgZGVsZXRpb24sIGRpcmVjdC1lZGl0aW5nLCBwcm9wZXJ0eSBzb3VyY2UgYW5kCi0gKiBtb2RlbC1saXN0ZW5pbmcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHsKLQotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXIgbW9kZWxMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQloYW5kbGVQcm9wZXJ0eUNoYW5nZWQobXNnKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAKLQkgKiBAcGFyYW0gb2JqIHtAbGluayBFT2JqZWN0fQotCSAqLwotCXB1YmxpYyBCYXNlRWRpdFBhcnQoRU9iamVjdCBvYmopIHsKLQkJc3VwZXIoKTsKLQkJc2V0TW9kZWwob2JqKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuYWN0aXZhdGUoKTsKLQkJKChFT2JqZWN0KSBnZXRNb2RlbCgpKS5lQWRhcHRlcnMoKS5hZGQobW9kZWxMaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IERpcmVjdEVkaXRQb2xpY3kgY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpOwotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgewotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLAotCQkJCW5ldyBMYWJlbFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGFibGVMYWJlbCgpOwotCX0KLQotCS8qKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCNkZWFjdGl2YXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQkoKEVPYmplY3QpIGdldE1vZGVsKCkpLmVBZGFwdGVycygpLnJlbW92ZShtb2RlbExpc3RlbmVyKTsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCX0KLQotCUlGaWd1cmUgZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpIHsKLQkJcmV0dXJuIGdldEZpZ3VyZSgpOwotCX0KLQotCVN0cmluZyBnZXREaXJlY3RFZGl0VGV4dCgpIHsKLQkJSUZpZ3VyZSBmaWcgPSBnZXREaXJlY3RFZGl0RmlndXJlKCk7Ci0JCWlmIChmaWcgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZykuZ2V0VGV4dCgpOwotCQl9IGVsc2UgaWYgKGZpZyBpbnN0YW5jZW9mIFRleHRGbG93KSB7Ci0JCQlyZXR1cm4gKChUZXh0RmxvdykgZmlnKS5nZXRUZXh0KCk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpOwotCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldERpcmVjdEVkaXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQltYW5hZ2VyID0gY3JlYXRlRGlyZWN0RWRpdE1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0RGlyZWN0RWRpdE1hbmFnZXIoKTsKLQotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQltYW5hZ2VyLnNob3coKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBjcmVhdGVEaXJlY3RFZGl0TWFuYWdlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHRDZWxsRWRpdG9yLmNsYXNzLAotCQkJCW5ldyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKGdldERpcmVjdEVkaXRGaWd1cmUoKSkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQm90dG9tQW5jaG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0JvdHRvbUFuY2hvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjdmNTZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQm90dG9tQW5jaG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0Q29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotLyoqCi0gKiBQcm92aWRlcyBzdXBwb3J0IGZvciBib3R0b20gYW5jaG9yIGZvciBhIGZpZ3VyZSdzIGJvdHRvbSBsb2NhdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotY2xhc3MgQm90dG9tQW5jaG9yIGV4dGVuZHMgQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yIHsKLQotCXByaXZhdGUgaW50IG9mZnNldDsKLQotCUJvdHRvbUFuY2hvcihJRmlndXJlIHNvdXJjZSwgaW50IG9mZnNldCkgewotCQlzdXBlcihzb3VyY2UpOwotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oUG9pbnQgcmVmZXJlbmNlKSB7Ci0JCVJlY3RhbmdsZSByID0gZ2V0T3duZXIoKS5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCWdldE93bmVyKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShyKTsKLQkJaW50IG9mZiA9IG9mZnNldDsKLQkJaWYgKG9mZiA9PSAtMSkKLQkJCW9mZiA9IHIud2lkdGggLyAyOwotCQlpZiAoci5jb250YWlucyhyZWZlcmVuY2UpIHx8IHIuYm90dG9tKCkgPiByZWZlcmVuY2UueSkKLQkJCXJldHVybiByLmdldFRvcExlZnQoKS50cmFuc2xhdGUob2ZmLCAwKTsKLQkJZWxzZQotCQkJcmV0dXJuIHIuZ2V0Qm90dG9tTGVmdCgpLnRyYW5zbGF0ZShvZmYsIC0xKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0Nsb3Nlc3RBbmNob3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQ2xvc2VzdEFuY2hvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA0YTVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQ2xvc2VzdEFuY2hvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkFuY2hvclV0aWw7Ci0KLS8qKgotICogUHJvdmlkZXMgc3VwcG9ydCB0byBmaW5kIHRoZSBjbG9zZXN0IGxvY2F0aW9uIGluIGZpZ3VyZQotICogZm9yIGFuY2hvci4gCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDbG9zZXN0QW5jaG9yIGV4dGVuZHMgQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yIHsKLQotCXB1YmxpYyBDbG9zZXN0QW5jaG9yKElGaWd1cmUgZmlndXJlKSB7Ci0JCXN1cGVyKGZpZ3VyZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkFuY2hvciNnZXRMb2NhdGlvbihQb2ludCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oUG9pbnQgcmVmZXJlbmNlKSB7Ci0JCXJldHVybiBnZXRMb2NhdGlvbihnZXRPd25lcigpLCByZWZlcmVuY2UpOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSBsb2NhdGlvbiBpbiB0aGUgY2xvc2VzdCBsb2NhdGlvbiBpbiBmaWd1cmUsIGJhc2VkIG9uIAotCSAqIGZpZ3VyZSBib3VuZHMgYW5kIHRoZSByZWZlcmVuY2UgcG9pbnQuICAgCi0JICogCi0JICogQHBhcmFtIGZpZ3VyZSB7QGxpbmsgSUZpZ3VyZX0gIEZpZ3VyZSB0byB3aGljaCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGluZy4KLQkgKiBAcGFyYW0gcmVmZXJlbmNlIHtAbGluayBQb2ludH0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBvaW50IGdldExvY2F0aW9uKElGaWd1cmUgZmlndXJlLCBQb2ludCByZWZlcmVuY2UpIHsKLQkJUmVjdGFuZ2xlIHIgPSBmaWd1cmUuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQlmaWd1cmUudHJhbnNsYXRlVG9BYnNvbHV0ZShyKTsKLQkJUmVjdGFuZ2xlIGFic29sdXRlQm91bmRzID0gci5nZXRDb3B5KCk7Ci0JCVBvaW50IHAgPSBudWxsOwotCQlzd2l0Y2ggKHIuZ2V0UG9zaXRpb24ocmVmZXJlbmNlKSkgewotCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIOgotCQkJcCA9IHIuZ2V0VG9wTGVmdCgpLnRyYW5zbGF0ZShyZWZlcmVuY2UueCAtIHIueCwgMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSF9FQVNUOgotCQkJcCA9IHIuZ2V0VG9wUmlnaHQoKTsKLQkJCWJyZWFrOwotCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLkVBU1Q6Ci0JCQlwID0gci5nZXRUb3BSaWdodCgpLnRyYW5zbGF0ZSgwLCByZWZlcmVuY2UueSAtIHIueSk7Ci0JCQlicmVhazsKLQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSF9FQVNUOgotCQkJcCA9IHIuZ2V0Qm90dG9tUmlnaHQoKTsKLQkJCWJyZWFrOwotCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIOgotCQkJcCA9IHIuZ2V0Qm90dG9tTGVmdCgpLnRyYW5zbGF0ZShyZWZlcmVuY2UueCAtIHIueCwgMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSF9XRVNUOgotCQkJcCA9IHIuZ2V0Qm90dG9tTGVmdCgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUG9zaXRpb25Db25zdGFudHMuV0VTVDoKLQkJCXAgPSByLmdldFRvcExlZnQoKS50cmFuc2xhdGUoMCwgcmVmZXJlbmNlLnkgLSByLnkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUG9zaXRpb25Db25zdGFudHMuTk9SVEhfV0VTVDoKLQkJCXAgPSByLmdldFRvcExlZnQoKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaW50IHRvcERpc3RhbmNlID0gcmVmZXJlbmNlLnkgLSByLnk7Ci0JCQlpbnQgcmlnaHREaXN0YW5jZSA9IHIucmlnaHQoKSAtIHJlZmVyZW5jZS54OwotCQkJaW50IGJvdHRvbURpc3RhbmNlID0gci5ib3R0b20oKSAtIHJlZmVyZW5jZS55OwotCQkJaW50IGxlZnREaXN0YW5jZSA9IHJlZmVyZW5jZS54IC0gci54OwotCQkJaW50W10gZGlzdGFuY2VzID0geyB0b3BEaXN0YW5jZSwgcmlnaHREaXN0YW5jZSwgYm90dG9tRGlzdGFuY2UsCi0JCQkJCWxlZnREaXN0YW5jZSB9OwotCQkJaW50IGlkID0gQW5jaG9yVXRpbC5taW4oZGlzdGFuY2VzKTsKLQkJCXN3aXRjaCAoaWQpIHsKLQkJCWNhc2UgMDoKLQkJCQlwID0gci5nZXRUb3BMZWZ0KCkudHJhbnNsYXRlKGxlZnREaXN0YW5jZSwgMCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6Ci0JCQkJcCA9IHIuZ2V0VG9wUmlnaHQoKS50cmFuc2xhdGUoMCwgdG9wRGlzdGFuY2UpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCXAgPSByLmdldEJvdHRvbUxlZnQoKS50cmFuc2xhdGUobGVmdERpc3RhbmNlLCAwKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNDoKLQkJCQlwID0gci5nZXRUb3BMZWZ0KCkudHJhbnNsYXRlKHRvcERpc3RhbmNlLCAwKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAocCAhPSBudWxsKSB7Ci0JCQlwLnBlcmZvcm1UcmFuc2xhdGUoLWFic29sdXRlQm91bmRzLngsIC1hYnNvbHV0ZUJvdW5kcy55KTsKLQkJfQotCQlyZXR1cm4gcDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGVjaXNpb25Ob2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGVjaXNpb25Ob2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODllMmFiZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0RlY2lzaW9uTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuRGlhbW9uZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkFuY2hvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5Db25uZWN0aW9uQW5jaG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQ29ubmVjdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkxvY2F0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLS8qKgotICogRWRpdFBhcnQgZm9yICBEZWNpc2lvbk5vZGUsIHVzZWQgaW4gYWN0aXZpdHkgZGlhZ3JhbS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlY2lzaW9uTm9kZUVkaXRQYXJ0IGV4dGVuZHMgTm9kZUVkaXRQYXJ0IGltcGxlbWVudHMKLQkJQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sb3IgQkdfQ09MT1IgPSBuZXcgQ29sb3IobnVsbCwgMjU0LCAyMDQsIDE1Myk7Ci0KLQlwcml2YXRlIFBvaW50IHJlY2VudFNvdXJjZUVuZFBvaW50OwotCi0JcHJpdmF0ZSBQb2ludCByZWNlbnRUYXJnZXRFbmRQb2ludDsKLQotCXB1YmxpYyBEZWNpc2lvbk5vZGVFZGl0UGFydChUeXBlZE5vZGUgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5CYXNlRWRpdFBhcnQjY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRQb2xpY3kgY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkJhc2VFZGl0UGFydCNjcmVhdGVGaWd1cmUoKQotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJRGlhbW9uZCBmaWd1cmUgPSBuZXcgRGlhbW9uZCgpOwotCQlmaWd1cmUuc2V0QmFja2dyb3VuZENvbG9yKEJHX0NPTE9SKTsKLQkJZmlndXJlLnNldFNpemUoNDgsIDI0KTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVFZGl0UGFydCNnZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKG9yZy5lY2xpcHNlLmdlZi5Db25uZWN0aW9uRWRpdFBhcnQpCi0JICovCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcigKLQkJCUNvbm5lY3Rpb25FZGl0UGFydCBjb25uZWN0aW9uKSB7Ci0JCWJvb2xlYW4gaXNSZWxhdGl2ZSA9IGZhbHNlOwotCQlQb2ludCBzb3VyY2VFbmRQb2ludDsKLQkJaWYgKHJlY2VudFNvdXJjZUVuZFBvaW50ID09IG51bGwpIHsKLQkJCS8vIGdldCBzb3VyY2UgZW5kIHBvaW50IGZyb20gdGhlIG1vZGVsCi0JCQlMaW5rIGxpbmsgPSAoTGluaykgY29ubmVjdGlvbi5nZXRNb2RlbCgpOwotCQkJc291cmNlRW5kUG9pbnQgPSBsaW5rLmdldFNvdXJjZUVuZFBvaW50KCk7Ci0JCQlpc1JlbGF0aXZlID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXNvdXJjZUVuZFBvaW50ID0gcmVjZW50U291cmNlRW5kUG9pbnQ7Ci0JCX0KLQkJaWYgKHNvdXJjZUVuZFBvaW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgUmVsYXRpdmVYWUFuY2hvcihnZXRGaWd1cmUoKSwgc291cmNlRW5kUG9pbnQsIGlzUmVsYXRpdmUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKGNvbm5lY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlRWRpdFBhcnQjZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdCkKLQkgKi8KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKFJlcXVlc3QgcmVxdWVzdCkgewotCQlQb2ludCBwID0gbnVsbDsKLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCkgewotCQkJQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QgcmVxID0gKENyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0KSByZXF1ZXN0OwotCQkJcCA9IHJlcS5nZXRMb2NhdGlvbigpOwotCQl9IGVsc2UgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBMb2NhdGlvblJlcXVlc3QpIHsKLQkJCXAgPSAoKExvY2F0aW9uUmVxdWVzdCkgcmVxdWVzdCkuZ2V0TG9jYXRpb24oKTsKLQkJfQotCQlpZiAocCAhPSBudWxsKSB7Ci0JCQlyZWNlbnRTb3VyY2VFbmRQb2ludCA9IGdldExvY2F0aW9uKHApOwotCQkJcmV0dXJuIG5ldyBSZWxhdGl2ZVhZQW5jaG9yKGdldEZpZ3VyZSgpLCByZWNlbnRTb3VyY2VFbmRQb2ludCwgdHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IocmVxdWVzdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVFZGl0UGFydCNnZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKG9yZy5lY2xpcHNlLmdlZi5Db25uZWN0aW9uRWRpdFBhcnQpCi0JICovCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcigKLQkJCUNvbm5lY3Rpb25FZGl0UGFydCBjb25uZWN0aW9uKSB7Ci0JCWJvb2xlYW4gaXNSZWxhdGl2ZSA9IGZhbHNlOwotCQlQb2ludCB0YXJnZXRFbmRQb2ludDsKLQkJaWYgKHJlY2VudFRhcmdldEVuZFBvaW50ID09IG51bGwpIHsKLQkJCS8vIGdldCB0YXJnZXQgZW5kIHBvaW50IGZyb20gbW9kZWwKLQkJCUxpbmsgbGluayA9IChMaW5rKSBjb25uZWN0aW9uLmdldE1vZGVsKCk7Ci0JCQl0YXJnZXRFbmRQb2ludCA9IGxpbmsuZ2V0VGFyZ2V0RW5kUG9pbnQoKTsKLQkJCWlzUmVsYXRpdmUgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJdGFyZ2V0RW5kUG9pbnQgPSByZWNlbnRUYXJnZXRFbmRQb2ludDsKLQkJfQotCQlpZiAodGFyZ2V0RW5kUG9pbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBSZWxhdGl2ZVhZQW5jaG9yKGdldEZpZ3VyZSgpLCB0YXJnZXRFbmRQb2ludCwgaXNSZWxhdGl2ZSk7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcihjb25uZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUVkaXRQYXJ0I2dldFRhcmdldENvbm5lY3Rpb25BbmNob3Iob3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3QpCi0JICovCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcihSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJUG9pbnQgcCA9IG51bGw7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QpIHsKLQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcSA9IChDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCkgcmVxdWVzdDsKLQkJCXAgPSByZXEuZ2V0TG9jYXRpb24oKTsKLQkJfSBlbHNlIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgTG9jYXRpb25SZXF1ZXN0KSB7Ci0JCQlwID0gKChMb2NhdGlvblJlcXVlc3QpIHJlcXVlc3QpLmdldExvY2F0aW9uKCk7Ci0JCX0KLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJcmVjZW50VGFyZ2V0RW5kUG9pbnQgPSBnZXRMb2NhdGlvbihwKTsKLQkJCXJldHVybiBuZXcgUmVsYXRpdmVYWUFuY2hvcihnZXRGaWd1cmUoKSwgcmVjZW50VGFyZ2V0RW5kUG9pbnQsIHRydWUpOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldFRhcmdldENvbm5lY3Rpb25BbmNob3IocmVxdWVzdCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkNvbm5lY3Rpb25BbmNob3JMb2NhdG9yI2dldExvY2F0aW9uKFBvaW50KQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRMb2NhdGlvbihQb2ludCByZWZlcmVuY2UpIHsKLQkJRGlhbW9uZCBmID0gKChEaWFtb25kKSBnZXRGaWd1cmUoKSk7Ci0KLQkJLy8gdHJhbnNsYXRlIHBvaW50cyB0byBhYnNvbHV0ZQotCQlQb2ludFtdIHBvaW50cyA9IG5ldyBQb2ludFtmLmdldFBvaW50cygpLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSBmLmdldFBvaW50cygpLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlQb2ludCBwID0gZi5nZXRQb2ludHMoKS5nZXRQb2ludChpKTsKLQkJCWYudHJhbnNsYXRlVG9BYnNvbHV0ZShwKTsKLQkJCXBvaW50c1tpXSA9IHA7Ci0JCX0KLQotCQlQb2ludCBwID0gQW5jaG9yVXRpbC5nZXRDbG9zZXN0UG9pbnQocG9pbnRzLCByZWZlcmVuY2UpOwotCQlpZiAocCAhPSBudWxsKSB7Ci0JCQlSZWN0YW5nbGUgciA9IGYuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQkJZi50cmFuc2xhdGVUb0Fic29sdXRlKHIpOwotCQkJcC5wZXJmb3JtVHJhbnNsYXRlKC1yLngsIC1yLnkpOwotCQl9Ci0JCXJldHVybiBwOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0Rlc2NyaXB0b3JOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE3YTY0Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0Rlc2NyaXB0b3JOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLS8qKgotICogRWRpdFBhcnQgZm9yIFdvcmtCcmVha2Rvd24gRWxlbWVudHMgaW4gYW4gQWN0aXZpdHkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yTm9kZUVkaXRQYXJ0IGV4dGVuZHMgTmFtZWROb2RlRWRpdFBhcnQgewotCi0JcHVibGljIERlc2NyaXB0b3JOb2RlRWRpdFBhcnQoTmFtZWROb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTmFtZWROb2RlRWRpdFBhcnQjZ2V0SW1hZ2UoKQotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgUm9sZU5vZGUpIHsKLQkJCWlmKCgoTm9kZSltb2RlbCkuZ2V0RGlhZ3JhbSgpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKQotCQkJCXJldHVybiBJbWFnZXMuUk9MRV9ERVNDUklQVE9SXzE2OwotCQkJcmV0dXJuIEltYWdlcy5ST0xFOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgVGFza05vZGUpIHsKLQkJCWlmKCgoTm9kZSltb2RlbCkuZ2V0RGlhZ3JhbSgpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKQotCQkJCXJldHVybiBJbWFnZXMuVEFTS19ERVNDUklQVE9SXzE2OwotCQkJcmV0dXJuIEltYWdlcy5UQVNLX0RFU0NSSVBUT1I7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKSB7Ci0JCQlpZigoKE5vZGUpbW9kZWwpLmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkKLQkJCQlyZXR1cm4gSW1hZ2VzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SXzE2OwotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpICgoTGlua2VkT2JqZWN0KSBtb2RlbCkKLQkJCQkJLmdldE9iamVjdCgpOwotCQkJV29ya1Byb2R1Y3Qgd3AgPSB3cGQuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCWlmICh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJcmV0dXJuIEltYWdlcy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl8xNjsKLQkJCX0gZWxzZSBpZiAod3AgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCXJldHVybiBJbWFnZXMuREVMSVZFUkFCTEU7Ci0JCQl9IGVsc2UgaWYgKHdwIGluc3RhbmNlb2YgT3V0Y29tZSkgewotCQkJCXJldHVybiBJbWFnZXMuT1VUQ09NRTsKLQkJCX0KLQkJCXJldHVybiBJbWFnZXMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfMTY7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5hbWVkTm9kZUVkaXRQYXJ0I2NyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSAqCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGNyZWF0ZURpcmVjdEVkaXRNYW5hZ2VyKCkgewotCQlMYWJlbCBsID0gKExhYmVsKSBnZXRGaWd1cmUoKTsKLQkJcmV0dXJuIG5ldyBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dENlbGxFZGl0b3IuY2xhc3MsCi0JCQkJbmV3IExhYmVsVGV4dENlbGxFZGl0b3JMb2NhdG9yKGwpLCBsKSB7Ci0KLQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHR4dCkgewotCQkJCU9iamVjdCBvYmogPSBnZXRFZGl0UGFydCgpLmdldE1vZGVsKCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpIHsKLQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iajsKLQkJCQkJT2JqZWN0IGUgPSBub2RlLmdldE9iamVjdCgpOwotCQkJCQlyZXR1cm4gVG5nVXRpbC5jaGVja1dvcmtQcm9kdWN0RGVzY3JpcHRvclByZXNlbnRhdGlvbk5hbWUoCi0JCQkJCQkJZSwgdHh0LCBub2RlLmdldERpYWdyYW0oKS5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tOb2RlKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmo7Ci0JCQkJCU9iamVjdCBlID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tXb3JrQnJlYWtkb3duRWxlbWVudFByZXNlbnRhdGlvbk5hbWUoZSwKLQkJCQkJCQl0eHQsIG5vZGUuZ2V0RGlhZ3JhbSgpLmdldFN1cHByZXNzaW9uKCkpOwotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZU5vZGUpIHsKLQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iajsKLQkJCQkJT2JqZWN0IGUgPSBub2RlLmdldE9iamVjdCgpOwotCQkJCQlyZXR1cm4gVG5nVXRpbC5jaGVja1JvbGVEZXNjcmlwdG9yUHJlc2VudGF0aW9uTmFtZShlLCB0eHQsIG5vZGUuZ2V0RGlhZ3JhbSgpLmdldFN1cHByZXNzaW9uKCkpOwotCQkJCX0KLQotCQkJCXJldHVybiBzdXBlci52YWxpZGF0ZSh0eHQpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTb3VyY2VDb25uZWN0aW9ucygpIHsKLQkJc3VwZXIucmVmcmVzaFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT01QT05FTlRfUk9MRSwgbnVsbCk7Ci0JfQotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXREaXJlY3RFZGl0TWFuYWdlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EaWFncmFtQWN0aW9uU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EaWFncmFtQWN0aW9uU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2M0NTc1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGlhZ3JhbUFjdGlvblNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ2hhbmdlQm91bmRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5SZWNvbm5lY3RMaW5rQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkRlZmF1bHRFZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBTZXJ2aWNlIGNsYXNzIHRvIGFsbG93IGNyZWF0ZSBhbmQgcmVnaXN0ZXIgY29tbW9uIGFjdGlvbiB0byB0aGUgYWN0aW9uCi0gKiByZWdpc3Rlci4gTW9zdCBvZiB0aGUgY29kZSBhcmUgbW92ZWQgZnJvbSB0aGUgRWRpdG9yIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUFjdGlvblNlcnZpY2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fSE9SWl9BVkVSQUdFID0gImFsaWduX2hvcml6b250YWxfdG9fYXZlcmFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOX0hPUlpfRklSU1RfU0VMRUNURUQgPSAiYWxpZ25faG9yaXpvbnRhbF90b19maXJzdF9zZWxlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9WRVJUX0FWRVJBR0UgPSAiYWxpZ25fdmVydGljYWxfdG9fYXZlcmFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOX1ZFUlRfRklSU1RfU0VMRUNURUQgPSAiYWxpZ25fdmVydGljYWxfdG9fZmlyc3Rfc2VsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBEZWZhdWx0RWRpdERvbWFpbiBlZGl0RG9tYWluOwotCi0JcHJpdmF0ZSBHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyOwotCi0JcHJpdmF0ZSBBY3Rpb25SZWdpc3RyeSBhY3Rpb25SZWdpc3RyeTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIAotCSAqIEBwYXJhbSBncmFwaGljYWxWaWV3ZXIge0BsaW5rIEdyYXBoaWNhbFZpZXdlcn0KLQkgKiBAcGFyYW0gZWRpdERvbWFpbiAJe0BsaW5rIERlZmF1bHRFZGl0RG9tYWlufQotCSAqIEBwYXJhbSBhY3Rpb25SZWdpc3RyeSAJe0BsaW5rIEFjdGlvblJlZ2lzdHJ5fQotCSAqLwotCXB1YmxpYyBEaWFncmFtQWN0aW9uU2VydmljZShHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyLAotCQkJRGVmYXVsdEVkaXREb21haW4gZWRpdERvbWFpbiwgQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnkpIHsKLQkJdGhpcy5ncmFwaGljYWxWaWV3ZXIgPSBncmFwaGljYWxWaWV3ZXI7Ci0JCXRoaXMuZWRpdERvbWFpbiA9IGVkaXREb21haW47Ci0JCXRoaXMuYWN0aW9uUmVnaXN0cnkgPSBhY3Rpb25SZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBHcmFwaGljYWxWaWV3ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0R3JhcGhpY2FsVmlld2VyKEdyYXBoaWNhbFZpZXdlciBncmFwaGljYWxWaWV3ZXIpIHsKLQkJdGhpcy5ncmFwaGljYWxWaWV3ZXIgPSBncmFwaGljYWxWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyBHcmFwaGljYWxWaWV3ZXIKLQkgKi8KLQlwcml2YXRlIEdyYXBoaWNhbFZpZXdlciBnZXRHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXJldHVybiBncmFwaGljYWxWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29tbWFuZCBzdGFjay4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb21tYW5kIHN0YWNrCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRTdGFjayBnZXRDb21tYW5kU3RhY2soKSB7Ci0JCXJldHVybiBnZXRFZGl0RG9tYWluKCkuZ2V0Q29tbWFuZFN0YWNrKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdCBkb21haW4uCi0JICogCi0JICogQHJldHVybiB0aGUgZWRpdCBkb21haW4KLQkgKi8KLQlwcm90ZWN0ZWQgRGVmYXVsdEVkaXREb21haW4gZ2V0RWRpdERvbWFpbigpIHsKLQkJcmV0dXJuIGVkaXREb21haW47Ci0JfQotCi0JcHJvdGVjdGVkIEFjdGlvblJlZ2lzdHJ5IGdldEFjdGlvblJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gYWN0aW9uUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXIgSG9yaXpvbnRhbEFsaWduQXZlcmFnZUFjdGlvbiBhY3Rpb24uIAotCSAqIEhvcml6b250YWxBaWduQXZlcmFnZSBBY3Rpb24gYWxpZ25zIHNlbGVjdGVkIGVkaXRwYXJ0cyB0byBob3Jpem9udGFsIGF2ZXJhZ2UuICAKLQkgKi8KLQlwdWJsaWMgSUFjdGlvbiByZWdpc3Rlckhvcml6b250YWxBbGlnbkF2ZXJhZ2VBY3Rpb24oKSB7Ci0JCS8vIGFsaWduIGhvcml6b250YWxseSB0byBhdmVyYWdlIHktdmFsdWUgb2YgYWxsIG5vZGVzCi0JCUlBY3Rpb24gaEFsaWduQXZlcmFnZUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQpIHsgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaG9yaXpBbGlnblRvQXZlcmFnZVNlbGVjdGVkKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIEFMSUdOX0hPUlpfQVZFUkFHRTsKLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihoQWxpZ25BdmVyYWdlQWN0aW9uKTsKLQotCQlyZXR1cm4gaEFsaWduQXZlcmFnZUFjdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXIgSG9yaXpvbnRhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbiBhY3Rpb24uIAotCSAqIEhvcml6b250YWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24gYWxpZ25zIHNlbGVjdGVkIGVkaXRwYXJ0cyB3aXRoIAotCSAqIHJlc3BlY3QgdG8gZmlyc3Qgc2VsZWN0ZWQgZWRpdHBhcnQuIAotCSAqLwotCi0JcHVibGljIElBY3Rpb24gcmVnaXN0ZXJIb3Jpem9udGFsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKCkgewotCQkvLyBhbGlnbiBob3Jpem9udGFsbHkgdG8geS12YWx1ZSBvZiBmaXJzdCBzZWxlY3RlZCBub2RlCi0JCUlBY3Rpb24gaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQpIHsgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaG9yekFsaWduVG9GaXJzdFNlbGVjdGVkKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIEFMSUdOX0hPUlpfRklSU1RfU0VMRUNURUQ7Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbik7Ci0KLQkJcmV0dXJuIGhBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb247Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVyIHZlcnRpYWxBbGlnbkF2ZXJhZ2VBY3Rpb24gYWN0aW9uLiAKLQkgKiB2ZXJ0aWFsQWxpZ25BdmVyYWdlQWN0aW9uIGFsaWducyBzZWxlY3RlZCBlZGl0cGFydHMgdmVydGljYWxseSB3LnIudCBhdmVyYWdlLgotCSAqIAotCSAqLwotCQotCXB1YmxpYyBJQWN0aW9uIHJlZ2lzdGVyVmVydGljYWxBbGlnbkF2ZXJhZ2VBY3Rpb24oKSB7Ci0JCS8vIGFsaWduIHZlcnRpY2FsbHkgdG8gYXZlcmFnZSB4LXZhbHVlIG9mIGFsbCBzZWxlY3RlZCBub2RlcwotCQlJQWN0aW9uIHZBbGlnbkF2ZXJhZ2VBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0KSB7IAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXZlcnRpY2FsQWxpZ25Ub0F2ZXJhZ2VTZWxlY3RlZCgpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBBTElHTl9WRVJUX0FWRVJBR0U7Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24odkFsaWduQXZlcmFnZUFjdGlvbik7Ci0KLQkJcmV0dXJuIHZBbGlnbkF2ZXJhZ2VBY3Rpb247Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXIgdmVydGlhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbiBhY3Rpb24uIAotCSAqIHZlcnRpYWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24gYWxpZ25zIHNlbGVjdGVkIGVkaXRwYXJ0cyB2ZXJ0aWNhbGx5IHcuci50IGZpcnN0IHNlbGVjdGVkLgotCSAqIAotCSAqLwotCi0JcHVibGljIElBY3Rpb24gcmVnaXN0ZXJWZXJ0aWNhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbigpIHsKLQkJLy8gYWxpZ24gdmVydGljYWxseSB0byB4LXZhbHVlIG9mIGZpcnN0IHNlbGVjdGVkIG5vZGUKLQkJSUFjdGlvbiB2QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dCkgeyAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl2ZXJ0aWNhbEFsaWduVG9GaXJzdFNlbGVjdGVkKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIEFMSUdOX1ZFUlRfRklSU1RfU0VMRUNURUQ7Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24odkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbik7Ci0KLQkJcmV0dXJuIHZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb247Ci0JfQotCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vIGFjdGlvbiBtZXRob2RzCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQotCS8qKiAKLQkgKiBBY3Rpb24gaW1wbGVtZW50YXRpb24gbWV0aG9kIGZvciBob3Jpem9udGFsQWxpZ25GaXJzdGVTRWxlY3RlZEFjdGlvbi4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBob3J6QWxpZ25Ub0ZpcnN0U2VsZWN0ZWQoKSB7Ci0JCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBmaXJzdFBhcnQgPSBudWxsOwotCQkvLyBsb29wIHRocm91Z2ggYWxsIHNlbGVjdGVkIGl0ZW1zLCByZW1lbWJlciB0aGUgeS12YWx1ZSBvZiB0aGUKLQkJLy8gZmlyc3Qgbm9kZSwKLQkJLy8gc2V0IHRoZSBmb2xsb3dpbmcgbm9kZXMgdG8gdGhlIHNhbWUgeS12YWx1ZQotCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJaWYgKGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQKLQkJCQkJfHwgZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkuZ2V0KGEpOwotCQkJCS8vIHJlbWVtYmVyIHRoZSBmaXJzdCBwYXJ0IHdlIG1vdmUKLQkJCQlpZiAoZmlyc3RQYXJ0ID09IG51bGwpIHsKLQkJCQkJZmlyc3RQYXJ0ID0gZXA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gY2FsY3VsYXRlIHRoZSBvZmZzZXQgZm9yIGNlbnRlcmxpbmUgYWxpZ25tZW50Ci0JCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkJaW50IG9mZnNldCA9IChpbnQpICgoZG91YmxlKSAoYm91bmRzLmhlaWdodCAtIGZpcnN0UGFydAotCQkJCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5oZWlnaHQpIC8gMi4wKTsKLQkJCQkJLy8gaXMgdGhpcyBub2RlIGluIGEgY29udGFpbmVyPwotCQkJCQlpZiAoIShlcC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkpIHsKLQkJCQkJCS8vIG5lZWQgdG8gbW92ZSB0aGUgY29udGFpbmVyLCBhZGp1c3QgdGhlIG9mZnNldAotCQkJCQkJZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZXAuZ2V0UGFyZW50KCk7Ci0JCQkJCQlSZWN0YW5nbGUgcGFyZW50Qm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCQlvZmZzZXQgKz0gYm91bmRzLnkgLSBwYXJlbnRCb3VuZHMueTsKLQkJCQkJCWJvdW5kcyA9IHBhcmVudEJvdW5kczsKLQkJCQkJfQotCQkJCQkvLyBzZW5kIHRoZSBjb21tYW5kIHRvIG1vdmUgdGhlIG5vZGUKLQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKAotCQkJCQkJCShOb2RlKSBlcC5nZXRNb2RlbCgpLCBuZXcgUG9pbnQoYm91bmRzLngsIGZpcnN0UGFydAotCQkJCQkJCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLnkKLQkJCQkJCQkJCS0gb2Zmc2V0KSwgYm91bmRzLndpZHRoKTsKLQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqIAotCSAqIEFjdGlvbiBpbXBsZW1lbnRhdGlvbiBtZXRob2QgZm9yIGhvcml6b250YWxBbGlnbkF2ZXJhZ2VBY3Rpb24uCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgaG9yaXpBbGlnblRvQXZlcmFnZVNlbGVjdGVkKCkgewotCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZmlyc3RQYXJ0ID0gbnVsbDsKLQkJaW50IHRvdGFsID0gMDsKLQkJaW50IHlzdW0gPSAwOwotCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJaWYgKGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQKLQkJCQkJfHwgZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkuZ2V0KGEpOwotCQkJCS8vIHJlbWVtYmVyIHRoZSBmaXJzdCBwYXJ0IHdlIG1vdmUKLQkJCQlpZiAoZmlyc3RQYXJ0ID09IG51bGwpIHsKLQkJCQkJZmlyc3RQYXJ0ID0gZXA7Ci0JCQkJfQotCQkJCXlzdW0gKz0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueTsKLQkJCQl0b3RhbCsrOwotCQkJfQotCQl9Ci0JCS8vIGNhbGN1bGF0ZSB0aGUgYXZlcmFnZSB5LXZhbHVlIGZvciBhbGwgbm9kZXMKLQkJaW50IHlhdmUgPSAoaW50KSAoKGRvdWJsZSkgeXN1bSAvIChkb3VibGUpIHRvdGFsKTsKLQkJLy8gbG9vcCB0aHJvdWdoIGFsbCB0aGUgbm9kZXMgYWdhaW4gYW5kIHNldCB0aGVtCi0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVFZGl0UGFydAotCQkJCQl8fCBlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJLy8gY2FsY3VsYXRlIHRoZSBoZWlnaHQgZGlmZmVyZW5jZSwgc28gdGhhdCBlbGVtZW50cyBhcmUgYWxpZ25lZAotCQkJCS8vIHRocm91Z2ggdGhlIGNlbnRlcmxpbmUKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJaW50IG9mZnNldCA9IChpbnQpICgoZG91YmxlKSAoYm91bmRzLmhlaWdodCAtIGZpcnN0UGFydAotCQkJCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmhlaWdodCkgLyAyLjApOwotCQkJCS8vIGlzIHRoaXMgbm9kZSBpbnNpZGUgYSBjb250YWluZXI/Ci0JCQkJaWYgKCEoZXAuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpKSB7Ci0JCQkJCS8vIHdlIG5lZWQgdG8gbW92ZSB0aGUgY29udGFpbmVyLCBhZGp1c3QgdGhlIG9mZnNldAotCQkJCQllcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlcC5nZXRQYXJlbnQoKTsKLQkJCQkJUmVjdGFuZ2xlIHBhcmVudEJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQlvZmZzZXQgKz0gYm91bmRzLnkgLSBwYXJlbnRCb3VuZHMueTsKLQkJCQkJYm91bmRzID0gcGFyZW50Qm91bmRzOwotCQkJCX0KLQkJCQkvLyBzZW5kIHRoZSBjb21tYW5kIHRvIG1vdmUgdGhlIG5vZGUKLQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoCi0JCQkJCQkoTm9kZSkgZXAuZ2V0TW9kZWwoKSwKLQkJCQkJCW5ldyBQb2ludChib3VuZHMueCwgeWF2ZSAtIG9mZnNldCksIGJvdW5kcy53aWR0aCk7Ci0JCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCX0KLQkJfQotCi0JfQotCS8qKiAKLQkgKiBBY3Rpb24gaW1wbGVtZW50YXRpb24gbWV0aG9kIGZvciB2ZXJ0aWNhbEFsaWduVG9BdmVyYWdlQWN0aW9uLgotCSAqIAotCSAqLwotCi0JcHVibGljIHZvaWQgdmVydGljYWxBbGlnblRvQXZlcmFnZVNlbGVjdGVkKCkgewotCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZmlyc3RQYXJ0ID0gbnVsbDsKLQkJaW50IHRvdGFsID0gMDsKLQkJaW50IHhzdW0gPSAwOwotCQkvLyBsb29wIHRocm91Z2ggdGhlIHNlbGVjdGVkIHBhcnRzCi0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQkvLyB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIG5vZGVzIGFuZCBjb250YWluZXJzCi0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVFZGl0UGFydAotCQkJCQl8fCBlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJaWYgKGZpcnN0UGFydCA9PSBudWxsKSB7Ci0JCQkJCWZpcnN0UGFydCA9IGVwOwotCQkJCX0KLQkJCQkvLyBzdW0gdGhlIHggY29vcmRpbmF0ZXMgb2YgZWFjaCBlbGVtZW50Ci0JCQkJeHN1bSArPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54OwotCQkJCS8vIHJlbWVtYmVyIGhvdyBtYW55IHNlbGVjdGVkIGVsZW1lbnRzIGFwcGxpZWQgdG8gdGhpcyBvcGVyYXRpb24KLQkJCQl0b3RhbCsrOwotCQkJfQotCQl9Ci0JCS8vIGNhbGN1bGF0ZSB0aGUgYXZlcmFnZSB4LXZhbHVlIGZvciBhbGwgbm9kZXMKLQkJaW50IHhhdmUgPSAoaW50KSAoKGRvdWJsZSkgeHN1bSAvIChkb3VibGUpIHRvdGFsKTsKLQkJLy8gbG9vcCB0aHJvdWdoIGFsbCB0aGUgbm9kZXMgYWdhaW4gYW5kIHNldCB0aGVtCi0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVFZGl0UGFydAotCQkJCQl8fCBlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJLy8gY2FsY3VsYXRlIHRoZSBvZmZzZXQgZm9yIGNlbnRlcmxpbmUgYWxpZ25tZW50Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCWludCBvZmZzZXQgPSAoaW50KSAoKGRvdWJsZSkgKGJvdW5kcy53aWR0aCAtIGZpcnN0UGFydAotCQkJCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoKSAvIDIuMCk7Ci0JCQkJLy8gYXJlIHdlIGluc2lkZSBhIGNvbnRhaW5lcj8KLQkJCQlpZiAoIShlcC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkpIHsKLQkJCQkJLy8gYWRqdXN0IHRoZSBvZmZzZXQgc2luY2Ugd2UgaGF2ZSB0byBtb3ZlIHRoZSBjb250YWluZXIKLQkJCQkJZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZXAuZ2V0UGFyZW50KCk7Ci0JCQkJCVJlY3RhbmdsZSBwYXJlbnRCb3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkJb2Zmc2V0ICs9IGJvdW5kcy54IC0gcGFyZW50Qm91bmRzLng7Ci0JCQkJCWJvdW5kcyA9IHBhcmVudEJvdW5kczsKLQkJCQl9Ci0JCQkJLy8gc2VuZCB0aGUgY29tbWFuZCB0byBtb3ZlIHRoZSBlbGVtZW50Ci0JCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKAotCQkJCQkJKE5vZGUpIGVwLmdldE1vZGVsKCksCi0JCQkJCQluZXcgUG9pbnQoeGF2ZSAtIG9mZnNldCwgYm91bmRzLnkpLCBib3VuZHMud2lkdGgpOwotCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQl9Ci0JCX0KLQotCX0KLQkvKiogCi0JICogQWN0aW9uIGltcGxlbWVudGF0aW9uIG1ldGhvZCBmb3IgdmVydGljYWxBbGlnblRvRmlyc3RTZWxlY3RlZEFjdGlvbi4KLQkgKiAKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHZlcnRpY2FsQWxpZ25Ub0ZpcnN0U2VsZWN0ZWQoKSB7Ci0JCS8vIGdldCB0aGUgc2VsZWN0ZWQgaXRlbXMKLQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGFsaWduVG9QYXJ0ID0gbnVsbDsKLQkJLy8gZmluZCB0aGUgZmlyc3QgZGlhZ3JhbSBwYXJ0IHdlIGNhbiBhbGlnbiB0bwotCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJaWYgKGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQKLQkJCQkJfHwgZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkuZ2V0KGEpOwotCQkJCWlmIChhbGlnblRvUGFydCA9PSBudWxsKSB7Ci0JCQkJCS8vIHJlbWVtYmVyIGl0IGFuZCBzdG9wCi0JCQkJCWFsaWduVG9QYXJ0ID0gZXA7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBsb29wIHRocm91Z2ggdGhlIGVsZW1lbnRzIGFuZCBzZXQgdGhlaXIgbmV3IHBvc2l0aW9uCi0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVFZGl0UGFydAotCQkJCQl8fCBlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJLy8gd2UgY2FuIHNraXAgdGhlIGZpcnN0IG9uZSBzaW5jZSB0aGlzIGlzIGFuIGFsaWduLXRvCi0JCQkJaWYgKGVwICE9IGFsaWduVG9QYXJ0Ci0JCQkJCQkmJiAhKGFsaWduVG9QYXJ0IGluc3RhbmNlb2YgU3luY2hCYXJOb2RlRWRpdFBhcnQpKSB7Ci0JCQkJCS8vIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZvciBjZW50ZXJsaW5lIGFsaWdubWVudAotCQkJCQlpZiAoIShlcCBpbnN0YW5jZW9mIFN5bmNoQmFyTm9kZUVkaXRQYXJ0KSkgewotCQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQkJaW50IG9mZnNldCA9IChpbnQpICgoZG91YmxlKSAoYm91bmRzLndpZHRoIC0gYWxpZ25Ub1BhcnQKLQkJCQkJCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoKSAvIDIuMCk7Ci0JCQkJCQkvLyBpcyB0aGlzIGluc2lkZSBhIGNvbnRhaW5lcj8KLQkJCQkJCWlmICghKGVwLmdldFBhcmVudCgpIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSkgewotCQkJCQkJCS8vIGFkanVzdCB0aGUgb2Zmc2V0IHNpbmNlIHdlIGFyZSBtb3ZpbmcgdGhlCi0JCQkJCQkJLy8gY29udGFpbmVyCi0JCQkJCQkJZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZXAuZ2V0UGFyZW50KCk7Ci0JCQkJCQkJUmVjdGFuZ2xlIHBhcmVudEJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQkJCW9mZnNldCArPSBib3VuZHMueCAtIHBhcmVudEJvdW5kcy54OwotCQkJCQkJCWJvdW5kcyA9IHBhcmVudEJvdW5kczsKLQkJCQkJCX0KLQkJCQkJCS8vIHNlbmQgdGhlIGNvbW1hbmQgdG8gbW92ZSB0aGUgZWxlbWVudAotCQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKAotCQkJCQkJCQkoTm9kZSkgZXAuZ2V0TW9kZWwoKSwgbmV3IFBvaW50KGFsaWduVG9QYXJ0Ci0JCQkJCQkJCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLngKLQkJCQkJCQkJCQktIG9mZnNldCwgYm91bmRzLnkpLCBib3VuZHMud2lkdGgpOwotCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCWVwLmdldEZpZ3VyZSgpLnNldExvY2F0aW9uKAotCQkJCQkJCQluZXcgUG9pbnQoYWxpZ25Ub1BhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueAotCQkJCQkJCQkJCS0gb2Zmc2V0LCBib3VuZHMueSkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJUG9pbnQgdHAgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRMb2NhdGlvbigpOwotCQkJCQkJYm9vbGVhbiBjb25uZWN0ZWQgPSBmYWxzZTsKLQkJCQkJCWJvb2xlYW4gc291cmNlID0gZmFsc2U7Ci0JCQkJCQlQb2ludCBlbmRQb2ludCA9IG51bGw7Ci0JCQkJCQlMaW5rRWRpdFBhcnQgbHAgPSBudWxsOwotCQkJCQkJLy8gY2hlY2sgdGFyZ2V0IGNvbm5lY3Rpb25zCi0JCQkJCQlMaXN0IGxpc3QgPSAoKE5vZGVFZGl0UGFydCkgZXApLmdldFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCWxwID0gKExpbmtFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGxwLmdldFNvdXJjZSgpLmVxdWFscyhhbGlnblRvUGFydCkpIHsKLQkJCQkJCQkJZW5kUG9pbnQgPSAoKExpbmspIGxwLmdldE1vZGVsKCkpCi0JCQkJCQkJCQkJLmdldFRhcmdldEVuZFBvaW50KCk7Ci0JCQkJCQkJCXRwID0gdHAuZ2V0VHJhbnNsYXRlZChlbmRQb2ludCk7Ci0JCQkJCQkJCWNvbm5lY3RlZCA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIGNoZWNrIHNvdXJjZSBjb25uZWN0aW9ucyBpZiBub3QgZm91bmQgaW4gdGFyZ2V0IGNvbm5lY3Rpb25zCi0JCQkJCQlpZiAoIWNvbm5lY3RlZCkgewotCQkJCQkJCWxpc3QgPSAoKE5vZGVFZGl0UGFydCkgZXApLmdldFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlscCA9IChMaW5rRWRpdFBhcnQpIGl0b3IubmV4dCgpOwotCQkJCQkJCQlpZiAobHAuZ2V0VGFyZ2V0KCkuZXF1YWxzKGFsaWduVG9QYXJ0KSkgewotCQkJCQkJCQkJZW5kUG9pbnQgPSAoKExpbmspIGxwLmdldE1vZGVsKCkpCi0JCQkJCQkJCQkJCS5nZXRTb3VyY2VFbmRQb2ludCgpOwotCQkJCQkJCQkJdHAgPSB0cC5nZXRUcmFuc2xhdGVkKGVuZFBvaW50KTsKLQkJCQkJCQkJCWNvbm5lY3RlZCA9IHRydWU7Ci0JCQkJCQkJCQlzb3VyY2UgPSB0cnVlOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoY29ubmVjdGVkICYmIChhbGlnblRvUGFydCBpbnN0YW5jZW9mIE5vZGVFZGl0UGFydCkpIHsKLQkJCQkJCQkJCVBvaW50IGNlbnRlclBvaW50ID0gYWxpZ25Ub1BhcnQuZ2V0RmlndXJlKCkKLQkJCQkJCQkJCQkJLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotCQkJCQkJCQkJaW50IGRlbHRhID0gY2VudGVyUG9pbnQueCAtIHRwLng7Ci0JCQkJCQkJZW5kUG9pbnQueCArPSBkZWx0YTsKLQkJCQkJCQkJCVJlY29ubmVjdExpbmtDb21tYW5kIGMgPSBuZXcgUmVjb25uZWN0TGlua0NvbW1hbmQoCi0JCQkJCQkJCQkoTGluaykgbHAuZ2V0TW9kZWwoKSwgKE5vZGUpIGVwLmdldE1vZGVsKCksCi0JCQkJCQkJCQlzb3VyY2UpOwotCQkJCQkJCWMuc2V0RW5kUG9pbnQoZW5kUG9pbnQpOwotCQkJCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIElmIGZpcnN0IHNlbGVjdGVkIGVkaXQgcGFydCBpcyBzeW5jYmFybm9kZWVkaXRwYXJ0LCBuZWVkIHRvCi0JCQkJLy8gaGFuZGxlIGRpZmZlcmVudGx5Ci0JCQkJaWYgKGVwICE9IGFsaWduVG9QYXJ0Ci0JCQkJCQkmJiAoYWxpZ25Ub1BhcnQgaW5zdGFuY2VvZiBTeW5jaEJhck5vZGVFZGl0UGFydCkpIHsKLQotCQkJCQlQb2ludCBzcCA9IGFsaWduVG9QYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCQkJLmdldExvY2F0aW9uKCk7Ci0JCQkJCWJvb2xlYW4gY29ubmVjdGVkID0gZmFsc2U7Ci0JCQkJCS8vIGNoZWNrIGlmIHRoZSBwYXJ0IGlzIGNvbm5lY3RlZCB2aWEgc291cmNlIGNvbm5lY3Rpb25zCi0JCQkJCUxpc3QgbGlzdCA9ICgoTm9kZUVkaXRQYXJ0KSBhbGlnblRvUGFydCkKLQkJCQkJCQkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCUxpbmtFZGl0UGFydCBscCA9IChMaW5rRWRpdFBhcnQpIGl0b3IubmV4dCgpOwotCQkJCQkJaWYgKGxwLmdldFRhcmdldCgpLmVxdWFscyhlcCkpIHsKLQkJCQkJCQlQb2ludCBzb3VyY2VFbmRQb2ludCA9ICgoTGluaykgbHAuZ2V0TW9kZWwoKSkKLQkJCQkJCQkJCS5nZXRTb3VyY2VFbmRQb2ludCgpOwotCQkJCQkJCXNwID0gc3AuZ2V0VHJhbnNsYXRlZChzb3VyY2VFbmRQb2ludCk7Ci0JCQkJCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBpZiBub3QgZm91bmQgYWJvdmUsIGNoZWNrIGlmIGl0IGlzIGNvbm5lY3RlZCB2aWEgdGFyZ2V0IGNvbm5lY3Rpb25zCi0JCQkJCWlmICghY29ubmVjdGVkKSB7Ci0JCQkJCQlsaXN0ID0gKChOb2RlRWRpdFBhcnQpIGFsaWduVG9QYXJ0KQotCQkJCQkJCQkuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJTGlua0VkaXRQYXJ0IGxwID0gKExpbmtFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGxwLmdldFNvdXJjZSgpLmVxdWFscyhlcCkpIHsKLQkJCQkJCQkJUG9pbnQgdGFyZ2V0RW5kUG9pbnQgPSAoKExpbmspIGxwLmdldE1vZGVsKCkpCi0JCQkJCQkJCQkJLmdldFRhcmdldEVuZFBvaW50KCk7Ci0JCQkJCQkJCXNwID0gc3AuZ2V0VHJhbnNsYXRlZCh0YXJnZXRFbmRQb2ludCk7Ci0JCQkJCQkJCWNvbm5lY3RlZCA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoZXAgaW5zdGFuY2VvZiBTeW5jaEJhck5vZGVFZGl0UGFydCkgewotCQkJCQkJUG9pbnQgdHAgPSAoKE5vZGUpIGVwLmdldE1vZGVsKCkpLmdldExvY2F0aW9uKCkKLQkJCQkJCQkJLmdldENvcHkoKTsKLQkJCQkJCVBvaW50IGFsaWduVG9DZW50ZXIgPSBhbGlnblRvUGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTsKLQkJCQkJCVBvaW50IGNlbnRlclBvaW50ID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7Ci0JCQkJCQlpbnQgZGVsdGEgPSBhbGlnblRvQ2VudGVyLnggLSBjZW50ZXJQb2ludC54OwotCQkJCQkJdHAueCA9IHRwLnggKyBkZWx0YTsKLQkJCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgKLQkJCQkJCQkJKE5vZGUpIGVwLmdldE1vZGVsKCksIHRwLCBlcC5nZXRGaWd1cmUoKQotCQkJCQkJCQkJCS5nZXRCb3VuZHMoKS53aWR0aCk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJZXAuZ2V0RmlndXJlKCkuc2V0TG9jYXRpb24obmV3IFBvaW50KHRwLngsIHRwLnkpKTsKLQkJCQkJfSBlbHNlIGlmIChlcCBpbnN0YW5jZW9mIE5vZGVFZGl0UGFydCkgewotCQkJCQkJUG9pbnQgdHAgPSAoKE5vZGUpIGVwLmdldE1vZGVsKCkpLmdldExvY2F0aW9uKCkKLQkJCQkJCQkJLmdldENvcHkoKTsKLQkJCQkJCVBvaW50IGNlbnRlclBvaW50ID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJCQkJLmdldENlbnRlcigpOwotCQkJCQkJaW50IGRlbHRhID0gc3AueCAtIGNlbnRlclBvaW50Lng7Ci0JCQkJCQl0cC54ID0gdHAueCArIGRlbHRhOwotCQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKAotCQkJCQkJCQkoTm9kZSkgZXAuZ2V0TW9kZWwoKSwgdHAsIGVwLmdldEZpZ3VyZSgpCi0JCQkJCQkJCQkJLmdldEJvdW5kcygpLndpZHRoKTsKLQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQllcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbihuZXcgUG9pbnQodHAueCwgdHAueSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0RpYWdyYW1FZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EaWFncmFtRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlNzQxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0RpYWdyYW1FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNoYW5nZUJvdW5kc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llcy5EaWFncmFtTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlJvb3RDb21wb25lbnRFZGl0UG9saWN5OwotCi0vKioKLSAqIFByb3ZpZGVzIEVkaXRQYXJ0IGZvciBEaWFncmFtLiBIYW5kbGVzIHRoZSBiYXNpYyBsYXlvdXQgbWVjaGFuaXNtCi0gKiBpZiB0aGUgY2hpbGRyZW4gbG9jYXRpb24gaXMgbm90IHNldCBpbiB0aGUgZGlhZ3JhbS4gIAotICogICAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIHNrYW5ub29yCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRWRpdFBhcnQgZXh0ZW5kcyBOb2RlQ29udGFpbmVyRWRpdFBhcnQgewotCi0JUG9pbnQgY2FjaGVkUG9pbnQgPSBuZXcgUG9pbnQoLTEsIC0xKTsKLQotCXByb3RlY3RlZCBib29sZWFuIGRlYnVnOwotCi0JcHJpdmF0ZSBib29sZWFuIG1hcmtEaXJ0eSA9IGZhbHNlOwotCi0Jc3RhdGljIGludCBjYWNoZWRXaWR0aCA9IDEwOwotCi0Jc3RhdGljIGludCBjYWNoZWRIZWlnaHQgPSAxMDsKLQotCXB1YmxpYyBEaWFncmFtRWRpdFBhcnQoRGlhZ3JhbSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JCWRlYnVnID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlGaWd1cmUgZiA9IG5ldyBGcmVlZm9ybUxheWVyKCkgewotCQkJcHJvdGVjdGVkIHZvaWQgbGF5b3V0KCkgewotCQkJCWlmIChoYXNNaXNwbGFjZWRDaGlsZHJlbigpKSB7Ci0JCQkJCXJlc2V0Q2hpbGRyZW5Mb2NhdGlvbnMoKTsKLQkJCQl9Ci0JCQkJc3VwZXIubGF5b3V0KCk7Ci0JCQl9Ci0KLQkJfTsKLQotCQlmLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDIwKSk7Ci0JCWYuc2V0TGF5b3V0TWFuYWdlcihuZXcgRnJlZWZvcm1MYXlvdXQoKSk7Ci0JCXJldHVybiBmOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc2V0Q2hpbGRyZW5Mb2NhdGlvbnMoKSB7Ci0JCWludCB5ID0gMTA7Ci0JCWZpbmFsIGludCBzcGFjaW5nID0gNDA7Ci0JCWludCBvY2N1cGllZCA9IDA7Ci0JCWludCB4ZWxlbWVudHMgPSAwOwotCQlpbnQgeCA9IDEwOwotCQlib29sZWFuIGxvY2tlZCA9IFRuZ1V0aWwuaXNMb2NrZWQoKEVPYmplY3QpKChEaWFncmFtKWdldE1vZGVsKCkpLmdldE9iamVjdCgpKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCQlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZDsKLQkJCQlpbnQgd2lkdGggPSBwYXJ0LmdldFJvb3QoKS5nZXRWaWV3ZXIoKS5nZXRDb250cm9sKCkuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JCQkJaWYgKHBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIHBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJUG9pbnQgcCA9IG5vZGUuZ2V0TG9jYXRpb24oKS5nZXRDb3B5KCk7Ci0JCQkJCWlmIChwID09IG51bGwgfHwgcC54ID09IC0xKSB7Ci0JCQkJCQlpZiAoeCArIHBhcnQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoID4gd2lkdGgpIHsKLQkJCQkJCQl5ID0gY2FjaGVkUG9pbnQueSArIGNhY2hlZEhlaWdodCArIHNwYWNpbmc7Ci0JCQkJCQkJeGVsZW1lbnRzID0gMDsKLQkJCQkJCQl4ID0gMTA7Ci0JCQkJCQkJY2FjaGVkUG9pbnQueCA9IC0xOwotCQkJCQkJCW9jY3VwaWVkID0gMDsKLQkJCQkJCX0KLQkJCQkJCWlmIChjYWNoZWRQb2ludC54ICE9IC0xKSB7Ci0JCQkJCQkJeCA9IGNhY2hlZFBvaW50LnggKyBjYWNoZWRXaWR0aCArIHNwYWNpbmc7Ci0JCQkJCQl9Ci0JCQkJCQkrK3hlbGVtZW50czsKLQkJCQkJCWlmIChwID09IG51bGwpIHsKLQkJCQkJCQlwID0gbmV3IFBvaW50KC0xLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCQlwLnggPSB4OwotCQkJCQkJcC55ID0geTsKLQkJCQkJCS8vbm9kZS5zZXRMb2NhdGlvbihwKTsKLQkJCQkJCS8vT24gb3BlbmluZyBhIEFEIGRpYWdyYW0sIGVkaXRvciBzaG91bGQgYmUgbWFya2VkIGRpcnR5LgotCQkJCQkJLy9JZiBkaWFncmFtIGlzIG5vdCBzYXZlZCwgY2Fubm90IGJlIGJyb3dzZWQuIEZvcmNpbmcgdG8gc2F2ZSB0aGUgZGlhZ3JhbSBvbmNlLgotCQkJCQkJaWYgKCFsb2NrZWQgJiYgKChEaWFncmFtKSBnZXRNb2RlbCgpKS5pc05ldygpCi0JCQkJCQkJCSYmICEoKERpYWdyYW0pIGdldE1vZGVsKCkpLmlzUmVhZE9ubHkoKQotCQkJCQkJCQkmJiBtYXJrRGlydHkpIHsKLQkJCQkJCQlDaGFuZ2VCb3VuZHNDb21tYW5kIGNiYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKG5vZGUsIHAsIHBhcnQuZ2V0RmlndXJlKCkKLQkJCQkJCQkJCQkJLmdldFByZWZlcnJlZFNpemUoKS53aWR0aCk7Ci0JCQkJCQkJZ2V0Vmlld2VyKCkuZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpCi0JCQkJCQkJCQkuZXhlY3V0ZShjYmMpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBJZiBQbHVnaW4gaXMgTG9ja2VkOiBEbyBhdXRvLWxheW91dCBhbmQgZG9ub3QKLQkJCQkJCQkvLyBzYXZlIHRvIG1vZGVsLgotCQkJCQkJCW5vZGUuc2V0TG9jYXRpb24ocCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWNhY2hlZFBvaW50ID0gcDsKLQkJCQkJCWNhY2hlZFdpZHRoID0gcGFydC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0JCQkJCQljYWNoZWRIZWlnaHQgPSBwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiUG9pbnQgOiAiICsgbmV3IFBvaW50KHgsIHkpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIkNhY2hlZCA6IHdpZHRoOiAiICsgY2FjaGVkV2lkdGggKyAiIEhlaWdodCA6ICIgKyBjYWNoZWRIZWlnaHQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCX0KLQkJCQkJCW9jY3VwaWVkICs9IHg7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNNaXNwbGFjZWRDaGlsZHJlbigpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgRWRpdFBhcnQpIHsKLQkJCQlPYmplY3QgbW9kZWwgPSAoKEVkaXRQYXJ0KSBjaGlsZCkuZ2V0TW9kZWwoKTsKLQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBtb2RlbDsKLQkJCQkJUG9pbnQgcCA9IG5vZGUuZ2V0TG9jYXRpb24oKTsKLQkJCQkJaWYgKHAgPT0gbnVsbCB8fCBwLnggPT0gLTEpewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT01QT05FTlRfUk9MRSwKLQkJCQluZXcgUm9vdENvbXBvbmVudEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09OVEFJTkVSX1JPTEUsCi0JCQkJbmV3IERpYWdyYW1MYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlQ29udGFpbmVyRWRpdFBhcnQjYWRkUGFydFRvRWRpdChDb2xsZWN0aW9uLAotCSAqICAgICAgT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhcnRUb0VkaXQoQ29sbGVjdGlvbiBwYXJ0c1RvRWRpdCwgT2JqZWN0IG5vZGUpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyKSB7Ci0JCQlOb2RlQ29udGFpbmVyRWRpdFBhcnQgZWRpdFBhcnQgPSAoTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSBmaW5kQ2hpbGRCeU1vZGVsKG5vZGUpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChOb2RlQ29udGFpbmVyKSBub2RlKS5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQllZGl0UGFydC5hZGRQYXJ0VG9FZGl0KHBhcnRzVG9FZGl0LCBpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRQYXJ0VG9FZGl0KHBhcnRzVG9FZGl0LCBub2RlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1vdmVzIGNvbXBsZXRlIGRpYWdyYW0gY2hpbGRyZW4gdG8gZ2l2ZW4gZGVsdGEuIAotCSAqIEBwYXJhbSBpbnQgIChYLWF4aXMgZGVsdGEpCi0JICogQHBhcmFtIGludCAgKFktYXhpcyBkZWx0YSkKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3ZlRmlndXJlKGludCBtb3ZlWCwgaW50IG1vdmVZKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCQlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZDsKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gcGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQlSZWN0YW5nbGUgciA9IG5ldyBSZWN0YW5nbGUobmV3IFBvaW50KGJvdW5kcy54ICsgbW92ZVgsCi0JCQkJCQlib3VuZHMueSArIG1vdmVZKSwgYm91bmRzLmdldFNpemUoKSk7Ci0KLQkJCQkvLyBhbHNvIG5lZWQgdG8gbW92ZSB0aGUgYmVuZCBwb2ludHMKLQkJCQlMaXN0IGxpc3QgPSBwYXJ0LmdldFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJTGlua0VkaXRQYXJ0IGxpbmtwYXJ0ID0gKExpbmtFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0JCQkJCUxpbmsgbGluayA9IChMaW5rKSBsaW5rcGFydC5nZXRNb2RlbCgpOwotCQkJCQlpZiAobGluay5nZXRCZW5kcG9pbnRzKCkuc2l6ZSgpID4gMCkgewotCQkJCQkJUG9pbnRMaXN0IHBsaXN0ID0gKChQb2x5bGluZUNvbm5lY3Rpb24pIGxpbmtwYXJ0Ci0JCQkJCQkJCS5nZXRGaWd1cmUoKSkuZ2V0UG9pbnRzKCk7Ci0JCQkJCQlMaXN0IHBvaW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgcGxpc3Quc2l6ZSgpIC0gMTsgaSsrKSB7Ci0JCQkJCQkJUG9pbnQgcCA9IHBsaXN0LmdldFBvaW50KGkpOwotCQkJCQkJCXAgPSBwLnRyYW5zbGF0ZShuZXcgUG9pbnQobW92ZVgsIG1vdmVZKSk7Ci0KLQkJCQkJCQlvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQgYnAgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50KAotCQkJCQkJCQkJcCk7Ci0JCQkJCQkJcG9pbnRzLmFkZChicCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCWxpbmtwYXJ0LmdldENvbm5lY3Rpb25GaWd1cmUoKS5zZXRSb3V0aW5nQ29uc3RyYWludCgKLQkJCQkJCQkJcG9pbnRzKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXRoaXMuc2V0TGF5b3V0Q29uc3RyYWludChwYXJ0LCBwYXJ0LmdldEZpZ3VyZSgpLCByKTsKLQotCQkJfSBlbHNlIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlBhcnQgbm90IG1vdmVkOiAiICsgY2hpbGQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCX0KLQkvKioKLQkgKiBPbiBvcGVuaW5nIGEgZGlhZ3JhbSwgZWRpdG9yIHNob3VsZCBiZSBtYXJrZWQgZGlydHkuCi0JICogSW52b2tlciBvZiBEaWFncmFtRWRpdFBhcnQgc2hvdWxkIGV4cGxpY2l0bHkgc2V0IHRoZSBmbGFnIHRvIG1hcmsgZWRpdG9yIGRpcnR5Ci0JICogb3Igbm90LiBXaXRob3UgaGFuZGxpbmcgdGhpcyB3aWxsIGNhdXNlIGJyb3dzaW5nIHBlcnNwZWN0aXZlIGluIGNvbnNpc3RlbnQuICAgIAotCSAqIEZvciBkZWZlY3Q6IGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTYwMjkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtYXJrRGlydHkoYm9vbGVhbiBtYXJrRGlydHkpewotCQl0aGlzLm1hcmtEaXJ0eSAgPSBtYXJrRGlydHk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGlhZ3JhbVVwZGF0ZVNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGlhZ3JhbVVwZGF0ZVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA3OGE0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0RpYWdyYW1VcGRhdGVTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNoYW5nZUJvdW5kc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRGVmYXVsdEVkaXREb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi0vKioKLSAqIFNlcnZpY2UgY2xhc3MgdG8gYWxsb3cgdXBkYXRpbmcgZGlhZ3JhbSB0byBhIGRlZmF1bHQgbGF5b3V0LiBNb3N0IG9mIHRoZSBjb2RlCi0gKiBhcmUgbW92ZWQgZnJvbSB0aGUgRWRpdG9yIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVVwZGF0ZVNlcnZpY2UgewotCi0JcHJpdmF0ZSBEZWZhdWx0RWRpdERvbWFpbiBlZGl0RG9tYWluOwotCi0JcHJpdmF0ZSBHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyOwotCi0JcHJpdmF0ZSBBY3Rpb25SZWdpc3RyeSBhY3Rpb25SZWdpc3RyeTsKLQotCXB1YmxpYyBEaWFncmFtVXBkYXRlU2VydmljZSgKLQkJCUdyYXBoaWNhbFZpZXdlciBncmFwaGljYWxWaWV3ZXIsIERlZmF1bHRFZGl0RG9tYWluIGVkaXREb21haW4sCi0JCQlBY3Rpb25SZWdpc3RyeSBhY3Rpb25SZWdpc3RyeSkgewotCQl0aGlzLmdyYXBoaWNhbFZpZXdlciA9IGdyYXBoaWNhbFZpZXdlcjsKLQkJdGhpcy5lZGl0RG9tYWluID0gZWRpdERvbWFpbjsKLQkJdGhpcy5hY3Rpb25SZWdpc3RyeSA9IGFjdGlvblJlZ2lzdHJ5OwotCX0KLQotCXByaXZhdGUgR3JhcGhpY2FsVmlld2VyIGdldEdyYXBoaWNhbFZpZXdlcigpIHsKLQkJcmV0dXJuIGdyYXBoaWNhbFZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb21tYW5kIHN0YWNrLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbW1hbmQgc3RhY2sKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZFN0YWNrIGdldENvbW1hbmRTdGFjaygpIHsKLQkJcmV0dXJuIGdldEVkaXREb21haW4oKS5nZXRDb21tYW5kU3RhY2soKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlZGl0IGRvbWFpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlZGl0IGRvbWFpbgotCSAqLwotCXByb3RlY3RlZCBEZWZhdWx0RWRpdERvbWFpbiBnZXRFZGl0RG9tYWluKCkgewotCQlyZXR1cm4gZWRpdERvbWFpbjsKLQl9Ci0KLQkvKioKLQkgKiBMYXppbHkgY3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgYWN0aW9uIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFjdGlvbiByZWdpc3RyeQotCSAqLwotCXByb3RlY3RlZCBBY3Rpb25SZWdpc3RyeSBnZXRBY3Rpb25SZWdpc3RyeSgpIHsKLQkJcmV0dXJuIGFjdGlvblJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB1c2VkIG9ubHkgaW4gQWN0aXZpdHlEZXRhaWxEaWFncmFtIG9yIGFueSBkaWFncmFtIG5lZWQgYXV0by1sYXlvdXQuCi0JICogTWV0aG9kIHdpbGwgdmVyaWZ5IHJlY2VudGx5IGFkZGVkIGVkaXRwYXJ0cyBpbiB0aGUgQWN0aXZpdHlkZXRhaWxkaWFncmFtIGVkaXRwYXJ0Ci0JICogaW5kaXJlY3RseSBmcm9tIFdvcmtCcmVha2Rvd25TdHJ1Y3R1cmUgKG1lYW5zIGFueSBkZXNjcmlwdG9ycyBjcmVhdGVkIGluIHdicywgY29ycmVzcG9uZGluZwotCSAqIEVkaXRQYXJ0IHdpbGwgZ2V0IGNyZWF0ZWQgaW4gQWN0aXZpdHlEZXRhaWxEaWFncmFtIFZpZXdlcikgYW5kIGRvZXMgYXV0by1sYXlvdXQKLQkgKiBhbGwgdGhlIG5ldyBhZGRlZCBlZGl0cGFydHMgYW5kIGV4aXN0aW5nIG9uZXMuIAotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFuVXBEaWFncmFtKCkgewotCQlpZiAoZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0Q29udGVudHMoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSB7Ci0JCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCBkZXAgPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCS5nZXRDb250ZW50cygpOwotCQkJTGlzdCBjaGlsZHJlbiA9IGRlcC5nZXRSZWNlbnRseUFkZGVkUGFydHMoKTsKLQkJCWlmICghY2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0JCQkJQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0KLQkJCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgewotCQkJCQkJaW50IHJjID0gMDsKLQkJCQkJCWlmIChhcmcwIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgewotCQkJCQkJCWlmICghKGFyZzEgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSkKLQkJCQkJCQkJcmMgPSAtMTsKLQkJCQkJCX0gZWxzZSBpZiAoYXJnMSBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpCi0JCQkJCQkJcmMgPSAxOwotCQkJCQkJcmV0dXJuIHJjOwotCQkJCQl9Ci0KLQkJCQl9OwotCi0JCQkJT2JqZWN0W10gYXJyYXkgPSBjaGlsZHJlbi50b0FycmF5KCk7Ci0JCQkJQXJyYXlzLnNvcnQoYXJyYXksIGNvbXBhcmF0b3IpOwotCQkJCWZvciAoaW50IGEgPSAwOyBhIDwgYXJyYXkubGVuZ3RoOyBhKyspIHsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBhcnJheVthXTsKLQkJCQkJYWRqdXN0U2l6ZShlcCk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGIgPSAwOyBiIDwgYXJyYXkubGVuZ3RoOyBiKyspIHsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBhcnJheVtiXTsKLQkJCQkJY2xlYW5VcChlcCk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGMgPSAwOyBjIDwgYXJyYXkubGVuZ3RoOyBjKyspIHsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBhcnJheVtjXTsKLQkJCQkJcmVkdWNlTGlua0xlbmd0aChlcCk7Ci0JCQkJfQotLy8JCQkJZm9yIChpbnQgYyA9IDA7IGMgPCBhcnJheS5sZW5ndGg7IGMrKykgewotLy8JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgYXJyYXlbY107Ci0vLwkJCQkJaWYoZXAgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KXsKLS8vCQkJCQkJcmVzZXRTaXplcyhlcCwgZXApOwotLy8JCQkJCX0KLS8vCQkJCX0KLQkJCQlwYWNrRGlhZ3JhbSgpOwotCQkJCWRlcC5jbGVhclJlY2VudGx5QWRkZWRQYXJ0cygpOwotCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JcHJpdmF0ZSB2b2lkIHJlc2V0U2l6ZXMoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCwgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwYXJlbnQpIHsKLQkJaWYgKCEoZXAgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSkgewotCQkJTGlzdCBzb3VyY2VMaW5rcyA9IGVwLmdldFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0JCQlpZiAoc291cmNlTGlua3Muc2l6ZSgpID4gMCkgewotCQkJCWZvciAoaW50IGIgPSAwOyBiIDwgc291cmNlTGlua3Muc2l6ZSgpOyBiKyspIHsKLQkJCQkJTGlua0VkaXRQYXJ0IGxpbmsgPSAoTGlua0VkaXRQYXJ0KSBzb3VyY2VMaW5rcy5nZXQoYik7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgdGFyZ2V0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGxpbmsKLQkJCQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCQkJCWludCB3ID0gdGFyZ2V0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoOwotCQkJCQlpbnQgZXcgPSBlcC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0JCQkJCWlmICh3ID4gZXcpIHsKLQkJCQkJCVBvaW50IGxvY2F0aW9uID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJCS5nZXRMb2NhdGlvbigpOwotCQkJCQkJbG9jYXRpb24ueCs9KHctZXcpLzI7Ci0JCQkJCQlDb21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgoKE5vZGUpIGVwCi0JCQkJCQkJCS5nZXRNb2RlbCgpKSwgZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJCQkJLmdldExvY2F0aW9uKCksIHcpOwotCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCWludCBoID0gZXAuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCQkJCWVwLmdldEZpZ3VyZSgpCi0JCQkJCQkJCS5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24odywgaCkpOwotCQkJCQkJZXAuZ2V0RmlndXJlKCkuc2V0U2l6ZShuZXcgRGltZW5zaW9uKHcsIGgpKTsKLQkJCQkJfQotCQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkJCS5zZXRTZWxlY3Rpb24oCi0JCQkJCQkJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10geyBlcCwKLQkJCQkJCQkJCQkJdGFyZ2V0IH0pKTsKLQkJCQkJSUFjdGlvbiB2YWxpZ24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQkJCQlEaWFncmFtQWN0aW9uU2VydmljZS5BTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEKTsKLQkJCQkJdmFsaWduLnJ1bigpOwotCQkJCX0KLQkJCX0KLQkJCUxpc3QgdGFyZ2V0TGlua3MgPSBlcC5nZXRUYXJnZXRDb25uZWN0aW9ucygpOwotCQkJaWYgKHRhcmdldExpbmtzLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKGludCBiID0gMDsgYiA8IHRhcmdldExpbmtzLnNpemUoKTsgYisrKSB7Ci0JCQkJCUxpbmtFZGl0UGFydCBsaW5rID0gKExpbmtFZGl0UGFydCkgdGFyZ2V0TGlua3MuZ2V0KGIpOwotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBsaW5rCi0JCQkJCQkJLmdldFNvdXJjZSgpOwotCQkJCQlpbnQgdyA9IHNvdXJjZS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS53aWR0aDsKLQkJCQkJaW50IGV3ID0gZXAuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoOwotCQkJCQlpZiAodyA+IGV3KSB7Ci0JCQkJCQlDb21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgoKE5vZGUpIGVwCi0JCQkJCQkJCS5nZXRNb2RlbCgpKSwgZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJCQkJLmdldExvY2F0aW9uKCksIHcpOwotCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCWludCBoID0gZXAuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCQkJCWVwLmdldEZpZ3VyZSgpCi0JCQkJCQkJCS5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24odywgaCkpOwotCQkJCQkJZXAuZ2V0RmlndXJlKCkuc2V0U2l6ZShuZXcgRGltZW5zaW9uKHcsIGgpKTsKLQkJCQkJfQotCQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkJCS5zZXRTZWxlY3Rpb24oCi0JCQkJCQkJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10geyBlcCwKLQkJCQkJCQkJCQkJc291cmNlIH0pKTsKLQkJCQkJSUFjdGlvbiB2YWxpZ24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQkJCQlEaWFncmFtQWN0aW9uU2VydmljZS5BTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEKTsKLQkJCQkJdmFsaWduLnJ1bigpOwotCQkJCX0KLQkJCX0KLQkJCXBhcmVudC5nZXRGaWd1cmUoKS5nZXRMYXlvdXRNYW5hZ2VyKCkubGF5b3V0KHBhcmVudC5nZXRGaWd1cmUoKSk7Ci0JCQlpZiAoZXAgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCQlMaXN0IGNoaWxkcmVuID0gZXAuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKGludCBkID0gMDsgZCA8IGNoaWxkcmVuLnNpemUoKTsgZCsrKSB7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZHJlbgotCQkJCQkJCS5nZXQoZCk7Ci0JCQkJCXJlc2V0U2l6ZXMocCwgZXApOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkqLwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZG9lcyBhIHZlcnRpY2FsIGFsaWdubWVudCBvZiBhbGwgbm9kZXMgd2l0aCBsaW5rcwotCSAqLwotCXByaXZhdGUgdm9pZCBjbGVhblVwKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXApIHsKLQkJaWYgKCEoZXAgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSkgewotCQkJTGlzdCBzb3VyY2VMaW5rcyA9IGVwLmdldFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0JCQlpZiAoc291cmNlTGlua3Muc2l6ZSgpID4gMCkgewotCQkJCWZvciAoaW50IGIgPSAwOyBiIDwgc291cmNlTGlua3Muc2l6ZSgpOyBiKyspIHsKLQkJCQkJTGlua0VkaXRQYXJ0IGxpbmsgPSAoTGlua0VkaXRQYXJ0KSBzb3VyY2VMaW5rcy5nZXQoYik7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgdGFyZ2V0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGxpbmsKLQkJCQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCQkJCWludCB3ID0gdGFyZ2V0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoOwotCQkJCQlpbnQgZXcgPSBlcC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0JCQkJCWlmICh3IDwgZXcpIHsKLQkJCQkJCUNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKCgoTm9kZSkgZXAKLQkJCQkJCQkJLmdldE1vZGVsKCkpLCB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJCQkJLmdldExvY2F0aW9uKCksIHcpOwotCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCWludCBoID0gdGFyZ2V0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQkJCQl0YXJnZXQuZ2V0RmlndXJlKCkKLQkJCQkJCQkJLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbih3LCBoKSk7Ci0JCQkJCQl0YXJnZXQuZ2V0RmlndXJlKCkuc2V0U2l6ZShuZXcgRGltZW5zaW9uKHcsIGgpKTsKLQkJCQkJfQotCQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkJCS5zZXRTZWxlY3Rpb24oCi0JCQkJCQkJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10geyBlcCwKLQkJCQkJCQkJCQkJdGFyZ2V0IH0pKTsKLQkJCQkJSUFjdGlvbiB2YWxpZ24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQkJCQlEaWFncmFtQWN0aW9uU2VydmljZS5BTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEKTsKLQkJCQkJdmFsaWduLnJ1bigpOwotCQkJCX0KLQkJCX0KLQkJCUxpc3QgdGFyZ2V0TGlua3MgPSBlcC5nZXRUYXJnZXRDb25uZWN0aW9ucygpOwotCQkJaWYgKHRhcmdldExpbmtzLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKGludCBiID0gMDsgYiA8IHRhcmdldExpbmtzLnNpemUoKTsgYisrKSB7Ci0JCQkJCUxpbmtFZGl0UGFydCBsaW5rID0gKExpbmtFZGl0UGFydCkgdGFyZ2V0TGlua3MuZ2V0KGIpOwotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBsaW5rCi0JCQkJCQkJLmdldFNvdXJjZSgpOwotCQkJCQlpbnQgdyA9IHNvdXJjZS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS53aWR0aDsKLQkJCQkJaW50IGV3ID0gZXAuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoOwotCQkJCQlpZiAodyA8IGV3KSB7Ci0JCQkJCQlDb21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgoKE5vZGUpIGVwCi0JCQkJCQkJCS5nZXRNb2RlbCgpKSwgc291cmNlLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCQkJCS5nZXRMb2NhdGlvbigpLCB3KTsKLQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQlpbnQgaCA9IHNvdXJjZS5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCQkJc291cmNlLmdldEZpZ3VyZSgpCi0JCQkJCQkJCS5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24odywgaCkpOwotCQkJCQkJc291cmNlLmdldEZpZ3VyZSgpLnNldFNpemUobmV3IERpbWVuc2lvbih3LCBoKSk7Ci0JCQkJCX0KLQkJCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkJCQkuc2V0U2VsZWN0aW9uKAotCQkJCQkJCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHsgZXAsCi0JCQkJCQkJCQkJCXNvdXJjZSB9KSk7Ci0JCQkJCUlBY3Rpb24gdmFsaWduID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCQkJRGlhZ3JhbUFjdGlvblNlcnZpY2UuQUxJR05fVkVSVF9GSVJTVF9TRUxFQ1RFRCk7Ci0JCQkJCXZhbGlnbi5ydW4oKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZXAgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCQlMaXN0IGNoaWxkcmVuID0gZXAuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKGludCBkID0gMDsgZCA8IGNoaWxkcmVuLnNpemUoKTsgZCsrKSB7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZHJlbgotCQkJCQkJCS5nZXQoZCk7Ci0JCQkJCWNsZWFuVXAocCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogIEZvciBhdXRvLWxheW91dCwgbmVlZCB0byBhZGp1c3QgY29ubmVjdGlvbihvciBsaW5rKSBsZW5ndGgsIGJhc2VkIG9uCi0JICogIGNvbm5lY3RpbmcgZWRpdHBhcnRzKGZpZ3VyZXMpLgotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiByZWR1Y2VMaW5rTGVuZ3RoKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcGFydCkgewotCQlib29sZWFuIG1vdmVkID0gZmFsc2U7Ci0JCS8vIG9ubHkgbW92ZSBuZXcgV29ya1Byb2R1Y3RDb21wb3NpdGUgZWxlbWVudHMKLQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGxpbmtlZFBhcnQgPSBudWxsOwotCQkJaW50IHBvc2l0aW9uID0gUG9zaXRpb25Db25zdGFudHMuQ0VOVEVSOwotCQkJLy8gaXMgdGhpcyBlbGVtZW50IGxpbmtlZCB0byBhbm90aGVyIGl0ZW0/Ci0JCQlpZiAocGFydC5nZXRUYXJnZXRDb25uZWN0aW9ucygpLnNpemUoKSA+IDApIHsKLQkJCQlsaW5rZWRQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpICgoTGlua0VkaXRQYXJ0KSBwYXJ0Ci0JCQkJCQkuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKS5nZXQoMCkpLmdldFNvdXJjZSgpOwotCQkJCXBvc2l0aW9uID0gUG9zaXRpb25Db25zdGFudHMuTk9SVEg7Ci0JCQl9IGVsc2UgaWYgKHBhcnQuZ2V0U291cmNlQ29ubmVjdGlvbnMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJbGlua2VkUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSAoKExpbmtFZGl0UGFydCkgcGFydAotCQkJCQkJLmdldFNvdXJjZUNvbm5lY3Rpb25zKCkuZ2V0KDApKS5nZXRUYXJnZXQoKTsKLQkJCQlwb3NpdGlvbiA9IFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIOwotCQkJfQotCQkJaWYgKGxpbmtlZFBhcnQgIT0gbnVsbCkgewotCQkJCWlmICghKGxpbmtlZFBhcnQuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpKSB7Ci0JCQkJCWxpbmtlZFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgbGlua2VkUGFydAotCQkJCQkJCS5nZXRQYXJlbnQoKTsKLQkJCQl9Ci0JCQkJLy8gZ2V0IHRoZSBwYXJ0J3MgcG9zaXRpb24KLQkJCQlSZWN0YW5nbGUgcGFydEJvdW5kcyA9IHBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJLy8gZ2V0IHRoZSBsaW5rZWQgcGFydCdzIHBvc2l0aW9uCi0JCQkJUmVjdGFuZ2xlIGxpbmtlZFBhcnRCb3VuZHMgPSBsaW5rZWRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCS8vIGRldGVybWluZSBpbiB3aGljaCBkaXJlY3Rpb24gaXMgdGhlIGxpbmtlZCBwYXJ0Ci0JCQkJLy8gaW50IHBvc2l0aW9uID0gcGFydEJvdW5kcy5nZXRQb3NpdGlvbihsaW5rZWRQYXJ0Qm91bmRzCi0JCQkJLy8gLmdldExvY2F0aW9uKCkpOwotCQkJCS8vIGFzc3VtZSBpdCBpcyBiZWxvdyB1cywgc28gdGhpcyBwYXJ0IG1vdmVzIHVwCi0JCQkJaW50IGRpcmVjdGlvbiA9IC0xOwotCQkJCWlmICgocG9zaXRpb24gJiBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCkgPT0gUG9zaXRpb25Db25zdGFudHMuTk9SVEgKLQkJCQkJCXx8IChwb3NpdGlvbiAmIFBvc2l0aW9uQ29uc3RhbnRzLkNFTlRFUikgPT0gUG9zaXRpb25Db25zdGFudHMuQ0VOVEVSKSB7Ci0JCQkJCS8vIGFib3ZlIHVzLCBtb3ZlIGRvd24KLQkJCQkJZGlyZWN0aW9uID0gMTsKLQkJCQl9Ci0JCQkJLy8gc2V0IG5ldyBib3VuZHMgZm9yIHRoZSBwYXJ0IHNvIHRoYXQgaXQgc2l0ZXMganVzdCBvdXRzaWRlIG9mCi0JCQkJLy8gdGhlIGxpbmtlZCBwYXJ0Ci0JCQkJUmVjdGFuZ2xlIHRlc3RCb3VuZHMgPSBwYXJ0Qm91bmRzLmdldENvcHkoKTsKLQkJCQlpZiAoZGlyZWN0aW9uID09IDEpIHsKLQkJCQkJdGVzdEJvdW5kcy55ID0gbGlua2VkUGFydEJvdW5kcy55ICsgbGlua2VkUGFydEJvdW5kcy5oZWlnaHQKLQkJCQkJCQkrIFZFUlRfUElYX1BBRERJTkc7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGVzdEJvdW5kcy55ID0gbGlua2VkUGFydEJvdW5kcy55IC0gVkVSVF9QSVhfUEFERElORwotCQkJCQkJCS0gcGFydEJvdW5kcy5oZWlnaHQ7Ci0JCQkJfQotCQkJCS8vIHNldCB0aGUgbmV3IGxvY2F0aW9uIGZvciB0aGUgcGFydCBpbiB0aGUgbW9kZWwKLQkJCQlQb2ludCBucCA9IG5ldyBQb2ludCh0ZXN0Qm91bmRzLngsIHRlc3RCb3VuZHMueSk7Ci0JCQkJcGFydC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbihucCk7Ci0JCQkJQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoKE5vZGUpIHBhcnQuZ2V0TW9kZWwoKSwgbnAsCi0JCQkJCQlwYXJ0Qm91bmRzLndpZHRoKTsKLQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb3ZlZDsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdG8gYWRqdXN0IHRoZSBzaXplIG9mIGVkaXRwYXJ0LiAgCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkanVzdFNpemUoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCkgewotCQlpZiAoZXAgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQlhZGp1c3RTaXplKChOb2RlQ29udGFpbmVyRWRpdFBhcnQpIGVwLCAxKTsKLQkJfQotCQkvLyBCZWxvdyBDb2RlIGdlbmVyaWMgTm9kZUNvbnRhaW5lckVkaXRQYXJ0IG1vZGlmaWNhdGlvbi4KLQkJZWxzZSBpZiAoZXAgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCS8vIFRoaXMgaXMgdG8gYWxsb3cgdXNlciBjdXN0b21pemFibGUgCi0vLwkJCVN0cmluZyBjb3VudCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotLy8JCQkJCQkJLmdldFN0cmluZyhUZW1wbGF0ZUNvbnN0YW50cy5BRERfUk9MRV9UQVNLU19DT1VOVCk7Ci0vLwkJCWlmKGNvdW50ICE9IG51bGwgfHwgY291bnQgIT0gIiIpewotLy8JCQkJaW50IGkgPSBJbnRlZ2VyLnBhcnNlSW50KGNvdW50KTsKLS8vCQkJCWlmKGkgPiAwKXsKLS8vCQkJCQlhZGp1c3RTaXplKChOb2RlQ29udGFpbmVyRWRpdFBhcnQpIGVwLCBpKTsKLS8vCQkJCX0KLS8vCQkJfWVsc2V7Ci0vLwkJCQlhZGp1c3RTaXplKChOb2RlQ29udGFpbmVyRWRpdFBhcnQpIGVwLCA1MCk7Ci0vLwkJCX0KLQkJCWFkanVzdFNpemUoKE5vZGVDb250YWluZXJFZGl0UGFydCkgZXAsIDUwKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IEhPUklaX1BJWF9QQURESU5HID0gMzA7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBWRVJUX1BJWF9QQURESU5HID0gMjA7Ci0KLQkvKioKLQkgKiBBZGp1c3RzIHRoZSBzaXplIG9mIENvbnRhaW5lckVkaXRQYXJ0IHRvIGFjY29tb2RhdGUgbnVtYmVyIG9mIGVkaXRwYXJ0cyBpbiBhIHJvdywKLQkgKiBwdXNoIHRoZSByZW1haW5pbmcgdGhlIGVkaXRwYXJ0cyBpbiB0d28gc2Vjb25kIHJvdy4gCi0JICogVGhpcyBpcyB1c2VmdWwgZm9yIHtAbGluayBUb29sYmFyTGF5b3V0fQotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGp1c3RTaXplKE5vZGVDb250YWluZXJFZGl0UGFydCBlcCwgaW50IGhvcml6Q291bnQpIHsKLQkJaW50IHJlcXVpcmVkV2lkdGggPSAwOwotCQlpbnQgcm93TWF4SGVpZ2h0ID0gMDsKLQkJaW50IHJvd3MgPSAwOwotCQlpbnQgd2lkdGhTdW0gPSAwOwotCQlpbnQgaGVpZ2h0U3VtID0gMDsKLQkJaW50IGNvbHVtbiA9IDA7Ci0JCS8vaW50IG9yaWdpbmFsV2lkdGggPSBlcC5nZXRGaWd1cmUoKS5nZXRTaXplKCkud2lkdGg7Ci0JCUxpc3QgY2hpbGRyZW4gPSBlcC5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBwID0gMDsgcCA8IGNoaWxkcmVuLnNpemUoKTspIHsKLQkJCWlmIChjb2x1bW4gPT0gMCkgewotCQkJCXJvd3MrKzsKLQkJCX0KLQkJCWlmIChjb2x1bW4gPCBob3JpekNvdW50KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBjaGlsZCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZHJlbgotCQkJCQkJLmdldChwKTsKLQkJCQlEaW1lbnNpb24gZCA9IGNoaWxkLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKTsKLQkJCQl3aWR0aFN1bSArPSBkLndpZHRoOwotCQkJCWlmIChkLmhlaWdodCA+IHJvd01heEhlaWdodCkgewotCQkJCQlyb3dNYXhIZWlnaHQgPSBkLmhlaWdodDsKLQkJCQl9Ci0JCQkJcCsrOwotCQkJCWNvbHVtbisrOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAod2lkdGhTdW0gPiByZXF1aXJlZFdpZHRoKSB7Ci0JCQkJCXJlcXVpcmVkV2lkdGggPSB3aWR0aFN1bTsKLQkJCQl9Ci0JCQkJaGVpZ2h0U3VtICs9IHJvd01heEhlaWdodDsKLQkJCQlyb3dNYXhIZWlnaHQgPSAwOwotCQkJCXdpZHRoU3VtID0gMDsKLQkJCQljb2x1bW4gPSAwOwotCQkJfQotCQl9Ci0JCWlmICh3aWR0aFN1bSA+IHJlcXVpcmVkV2lkdGgpIHsKLQkJCXJlcXVpcmVkV2lkdGggPSB3aWR0aFN1bTsKLQkJfQotCQloZWlnaHRTdW0gKz0gcm93TWF4SGVpZ2h0OwotCQlyZXF1aXJlZFdpZHRoICs9IEhPUklaX1BJWF9QQURESU5HCi0JCQkJKiBNYXRoLm1pbihob3JpekNvdW50LCBjaGlsZHJlbi5zaXplKCkpOwotCQlpbnQgcmVxdWlyZWRIZWlnaHQgPSBoZWlnaHRTdW0gKyAoVkVSVF9QSVhfUEFERElORyAqIHJvd3MpOwotCQlDb21tYW5kIGNtZCA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKCgoTm9kZSkgZXAuZ2V0TW9kZWwoKSksIGVwCi0JCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldExvY2F0aW9uKCksIHJlcXVpcmVkV2lkdGgpOwotCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNtZCk7Ci0JCWVwLmdldEZpZ3VyZSgpLnNldFByZWZlcnJlZFNpemUoCi0JCQkJbmV3IERpbWVuc2lvbihyZXF1aXJlZFdpZHRoLCByZXF1aXJlZEhlaWdodCkpOwotCQkoKE5vZGUpIGVwLmdldE1vZGVsKCkpLnNldEhlaWdodChyZXF1aXJlZEhlaWdodCk7Ci0JCWVwLmdldEZpZ3VyZSgpLnNldFNpemUobmV3IERpbWVuc2lvbihyZXF1aXJlZFdpZHRoLCByZXF1aXJlZEhlaWdodCkpOwotCQkJZXAuZ2V0RmlndXJlKCkuZ2V0TGF5b3V0TWFuYWdlcigpLmxheW91dChlcC5nZXRGaWd1cmUoKSk7Ci0JCS8vIGFmdGVyIGxheW91dCwgY2hlY2sgdGhlIGJvdHRvbS1tb3N0IGNoaWxkIGZpZ3VyZSBhZ2FpbnN0IHRoZSBib3R0b20KLQkJLy8gb2YgdGhlIGNvbnRhaW5lciwgYWRqdXN0IHRoZSBib3R0b20gb2YgdGhlIGNvbnRhaW5lciBpcyBuZWNlc3NhcnkKLQkJaWYgKGVwIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCAmJiBjaGlsZHJlbi5zaXplKCkgPiAwKSB7Ci0JCQlHcmFwaGljYWxFZGl0UGFydCBsYXN0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZHJlbi5nZXQoY2hpbGRyZW4KLQkJCQkJLnNpemUoKSAtIDEpOwotCQkJUG9pbnQgY2hpbGRCb3R0b20gPSBsYXN0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldEJvdHRvbSgpOwotCQkJUG9pbnQgcGFyZW50Qm90dG9tID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Qm90dG9tKCk7Ci0JCQlpbnQgZGVsdGEgPSBwYXJlbnRCb3R0b20ueSAtIGNoaWxkQm90dG9tLnkgLSAoVkVSVF9QSVhfUEFERElORyAvIDIpOwotCQkJZXAuZ2V0RmlndXJlKCkuc2V0UHJlZmVycmVkU2l6ZSgKLQkJCQkJbmV3IERpbWVuc2lvbihyZXF1aXJlZFdpZHRoLCByZXF1aXJlZEhlaWdodCAtIGRlbHRhKSk7Ci0JCQkoKE5vZGUpIGVwLmdldE1vZGVsKCkpLnNldEhlaWdodChyZXF1aXJlZEhlaWdodCAtIGRlbHRhKTsKLQkJCWVwLmdldEZpZ3VyZSgpLnNldFNpemUoCi0JCQkJCW5ldyBEaW1lbnNpb24ocmVxdWlyZWRXaWR0aCwgcmVxdWlyZWRIZWlnaHQgLSBkZWx0YSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW51bWVyYXRlQ29ubmVjdGVkUGFydHMoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwYXJ0LAotCQkJTGlzdCBjb25uZWN0ZWQpIHsKLQkJLy8gb25seSBhZGQgcGFydHMgZGlyZWN0bHkgb24gdGhlIGRpYWdyYW0gc3VyZmFjZQotCQlpZiAoIWNvbm5lY3RlZC5jb250YWlucyhwYXJ0KSkgewotCQkJaWYgKCEocGFydC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkpIHsKLQkJCQlpZiAoIWNvbm5lY3RlZC5jb250YWlucyhwYXJ0LmdldFBhcmVudCgpKSkgewotCQkJCQljb25uZWN0ZWQuYWRkKHBhcnQuZ2V0UGFyZW50KCkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJY29ubmVjdGVkLmFkZChwYXJ0KTsKLQkJCX0KLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgbGlua2VkUGFydCA9IG51bGw7Ci0JCQlMaXN0IGNoaWxkcmVuID0gcGFydC5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBjaGlsZHJlbi5zaXplKCk7IHgrKykgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZHJlbgotCQkJCQkJLmdldCh4KTsKLQkJCQllbnVtZXJhdGVDb25uZWN0ZWRQYXJ0cyhwLCBjb25uZWN0ZWQpOwotCQkJfQotCQkJLy8gaXMgdGhpcyBlbGVtZW50IGxpbmtlZCB0byBhbm90aGVyIGl0ZW0/Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IHBhcnQuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKS5zaXplKCk7IHgrKykgewotCQkJCWxpbmtlZFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgKChMaW5rRWRpdFBhcnQpIHBhcnQKLQkJCQkJCS5nZXRUYXJnZXRDb25uZWN0aW9ucygpLmdldCh4KSkuZ2V0U291cmNlKCk7Ci0JCQkJZW51bWVyYXRlQ29ubmVjdGVkUGFydHMobGlua2VkUGFydCwgY29ubmVjdGVkKTsKLQkJCX0KLQkJCWZvciAoaW50IHggPSAwOyB4IDwgcGFydC5nZXRTb3VyY2VDb25uZWN0aW9ucygpLnNpemUoKTsgeCsrKSB7Ci0JCQkJbGlua2VkUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSAoKExpbmtFZGl0UGFydCkgcGFydAotCQkJCQkJLmdldFNvdXJjZUNvbm5lY3Rpb25zKCkuZ2V0KHgpKS5nZXRUYXJnZXQoKTsKLQkJCQllbnVtZXJhdGVDb25uZWN0ZWRQYXJ0cyhsaW5rZWRQYXJ0LCBjb25uZWN0ZWQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZmluZHMgc2luZ2xlIGVsZW1lbnRzIGFuZCBncm91cHMgb2YgZWxlbWVudHMsIGFuZCBwb3NpdGlvbnMKLQkgKiB0aGVtIHN0YXJ0aW5nIGZyb20gdGhlIHRvcCBvZiB0aGUgZGlhZ3JhbSBhbmQgY29udGludW91c2x5IGRvd24gdGhlIHBhZ2UuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhY2tEaWFncmFtKCkgewotCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCBkaWFncmFtID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSBnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCS5nZXRDb250ZW50cygpOwotCQkvLyBzdGFydCBhdCB0aGUgdG9wIG9mIHRoZSBkaWFncmFtCi0JCS8vIERpbWVuc2lvbiBkaWFncmFtU2l6ZSA9IGRpYWdyYW0uZ2V0RmlndXJlKCkuZ2V0U2l6ZSgpOwotCQkvLyBubyBuZXcgc2hhcGVzIGNhbiBiZSBtb3ZlZCBhYm92ZSB0aGlzIHktYXhpcyB2YWx1ZQotCQlpbnQgcmVzZXJ2ZWQgPSAwOwotCQkvLyB0aGVzZSBhcmUgZWxlbWVudHMgd2l0aG91dCBjb25uZWN0aW9ucwotCQlMaXN0IHN0cmFnZ2xlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIHRoZXNlIGFyZSBncm91cHMgb2YgZWxlbWVudHMgY29ubmVjdGVkIHdpdGggbGlua3MKLQkJTGlzdCBncm91cHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIHRoZXNlIGFyZSB0b3AgbGV2ZWwgcGFydHMgb24gdGhlIGRpYWdyYW0gdGhhdCBoYXZlIGJlZW4gYWRkZWQKLQkJTGlzdCBkaWFncmFtUGFydHMgPSBkaWFncmFtLmdldFJlY2VudGx5QWRkZWRQYXJ0cygpOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IGRpYWdyYW1QYXJ0cy5zaXplKCk7IHgrKykgewotCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGRpYWdyYW1QYXJ0cwotCQkJCQkuZ2V0KHgpOwotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgZyA9IDA7IGcgPCBncm91cHMuc2l6ZSgpICYmIGZvdW5kID09IGZhbHNlOyBnKyspIHsKLQkJCQlMaXN0IGdyb3VwID0gKExpc3QpIGdyb3Vwcy5nZXQoZyk7Ci0JCQkJaWYgKGdyb3VwLmNvbnRhaW5zKHApKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFmb3VuZCkgewotCQkJCUxpc3QgY29ubmVjdGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWVudW1lcmF0ZUNvbm5lY3RlZFBhcnRzKHAsIGNvbm5lY3RlZCk7Ci0JCQkJaWYgKGNvbm5lY3RlZC5zaXplKCkgPT0gMSkgewotCQkJCQlzdHJhZ2dsZXJzLmFkZChwKTsKLQkJCQl9IGVsc2UgewotCQkJCQlncm91cHMuYWRkKGNvbm5lY3RlZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIHByb2Nlc3MgZWFjaCBncm91cCBjbG9zZXN0IHRvIHRoZSB0b3AgKG1pbiB5IHZhbHVlKQotCQl3aGlsZSAoZ3JvdXBzLnNpemUoKSA+IDApIHsKLQkJCUxpc3QgdG9wID0gKExpc3QpIGdyb3Vwcy5nZXQoMCk7Ci0JCQlpbnQgdG9wWSA9IGdldFZlcnRpY2FsTWluUGFydCh0b3ApLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLnk7Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IGdyb3Vwcy5zaXplKCk7IHgrKykgewotCQkJCUxpc3QgZyA9IChMaXN0KSBncm91cHMuZ2V0KHgpOwotCQkJCWludCB5ID0gZ2V0VmVydGljYWxNaW5QYXJ0KGcpLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLnk7Ci0JCQkJaWYgKHkgPCB0b3BZKSB7Ci0JCQkJCXRvcCA9IGc7Ci0JCQkJCXRvcFkgPSB5OwotCQkJCX0KLQkJCX0KLQkJCWludCBsaW1pdCA9IHJlc2VydmVkICsgMTsKLQkJCWludCB2ZXJ0aWNhbERlbHRhID0gbGltaXQgLSB0b3BZOwotCQkJaW50IGxlZnRYID0gZ2V0SG9yaXpvbnRhbE1pblBhcnQodG9wKS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54OwotCQkJaW50IGhvcml6b250YWxEZWx0YSA9IEhPUklaX1BJWF9QQURESU5HIC0gbGVmdFg7Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IHRvcC5zaXplKCk7IHgrKykgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSB0b3AKLQkJCQkJCS5nZXQoeCk7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJQ2hhbmdlQm91bmRzQ29tbWFuZCBjYmMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgoTm9kZSkgcAotCQkJCQkJLmdldE1vZGVsKCksIG5ldyBQb2ludChib3VuZHMueCArIGhvcml6b250YWxEZWx0YSwKLQkJCQkJCWJvdW5kcy55ICsgdmVydGljYWxEZWx0YSksIGJvdW5kcy53aWR0aCk7Ci0JCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjYmMpOwotCQkJCXAuZ2V0RmlndXJlKCkuc2V0TG9jYXRpb24oCi0JCQkJCQluZXcgUG9pbnQoYm91bmRzLnggKyBob3Jpem9udGFsRGVsdGEsIGJvdW5kcy55Ci0JCQkJCQkJCSsgdmVydGljYWxEZWx0YSkpOwotCQkJfQotCQkJaW50IGJvdHRvbVkgPSBnZXRWZXJ0aWNhbE1heFBhcnQodG9wKS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkuYm90dG9tKCk7Ci0JCQlyZXNlcnZlZCA9IGJvdHRvbVkgKyAoVkVSVF9QSVhfUEFERElORyAqIDIpOwotCQkJZ3JvdXBzLnJlbW92ZSh0b3ApOwotCQl9Ci0JCWludCBuZXh0ID0gSE9SSVpfUElYX1BBRERJTkc7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgc3RyYWdnbGVycy5zaXplKCk7IHgrKykgewotCQkJaW50IGxpbWl0ID0gcmVzZXJ2ZWQgKyAxOwotCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHN0cmFnZ2xlcnMKLQkJCQkJLmdldCh4KTsKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJQ2hhbmdlQm91bmRzQ29tbWFuZCBjYmMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgoTm9kZSkgcAotCQkJCQkuZ2V0TW9kZWwoKSwgbmV3IFBvaW50KG5leHQsIGxpbWl0KSwgYm91bmRzLndpZHRoKTsKLQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY2JjKTsKLQkJCXAuZ2V0RmlndXJlKCkuc2V0TG9jYXRpb24obmV3IFBvaW50KG5leHQsIGxpbWl0KSk7Ci0JCQluZXh0ICs9IGJvdW5kcy53aWR0aCArIEhPUklaX1BJWF9QQURESU5HOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGdldFZlcnRpY2FsTWluUGFydChMaXN0IHBhcnRzKSB7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcmMgPSBwYXJ0cy5zaXplKCkgPiAwID8gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHBhcnRzCi0JCQkJLmdldCgwKQotCQkJCTogbnVsbDsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBwYXJ0cy5zaXplKCk7IHgrKykgewotCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHBhcnRzCi0JCQkJCS5nZXQoeCk7Ci0JCQlpZiAocC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55IDwgcmMuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueSkgewotCQkJCXJjID0gcDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcHJpdmF0ZSBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGdldEhvcml6b250YWxNaW5QYXJ0KExpc3QgcGFydHMpIHsKLQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCByYyA9IHBhcnRzLnNpemUoKSA+IDAgPyAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgcGFydHMKLQkJCQkuZ2V0KDApCi0JCQkJOiBudWxsOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IHBhcnRzLnNpemUoKTsgeCsrKSB7Ci0JCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgcGFydHMKLQkJCQkJLmdldCh4KTsKLQkJCWlmIChwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLnggPCByYy5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54KSB7Ci0JCQkJcmMgPSBwOwotCQkJfQotCQl9Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlwcml2YXRlIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZ2V0VmVydGljYWxNYXhQYXJ0KExpc3QgcGFydHMpIHsKLQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCByYyA9IHBhcnRzLnNpemUoKSA+IDAgPyAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgcGFydHMKLQkJCQkuZ2V0KDApCi0JCQkJOiBudWxsOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IHBhcnRzLnNpemUoKTsgeCsrKSB7Ci0JCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgcGFydHMKLQkJCQkJLmdldCh4KTsKLQkJCWlmIChwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmJvdHRvbSgpID4gcmMuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJLmJvdHRvbSgpKSB7Ci0JCQkJcmMgPSBwOwotCQkJfQotCQl9Ci0JCXJldHVybiByYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRW5kTm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0VuZE5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDRiZDk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRW5kTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuRW5kTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5EaXJlY3RFZGl0UG9saWN5OwotCi0vKioKLSAqIEVkaXRQYXJ0IGZvciBGaW5hbChvciBFbmQpIG5vZGUgCi0gKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVuZE5vZGVFZGl0UGFydCBleHRlbmRzIE5vZGVFZGl0UGFydCB7Ci0KLQlwdWJsaWMgRW5kTm9kZUVkaXRQYXJ0KFR5cGVkTm9kZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkJhc2VFZGl0UGFydCNjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdFBvbGljeSBjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZUZpZ3VyZSgpCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlFbmROb2RlRmlndXJlIGYgPSBuZXcgRW5kTm9kZUZpZ3VyZSgpOwotCQlmLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0JCWYuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLnJlZCk7Ci0JCWYuc2V0U2l6ZSgyNCwgMjQpOwotCQlyZXR1cm4gZjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRnJlZVRleHRDZWxsRWRpdG9yTG9jYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9GcmVlVGV4dENlbGxFZGl0b3JMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYTkyZTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9GcmVlVGV4dENlbGxFZGl0b3JMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkZyZWVUZXh0RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogCi0gKiBDb25zdHJhaW50IGZvciBwbGFjaW5nIEZyZWVUZXh0IENlbGwgRWRpdG9yLgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRnJlZVRleHRDZWxsRWRpdG9yTG9jYXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3JMb2NhdG9yIHsKLQotCUlGaWd1cmUgZmlndXJlOwotCS8qCi0JICogQ3JlYXRlcyBhIG5ldyBGcmVlVGV4dENlbGxFZGl0b3JMb2NhdG9yIAotCSAqIAotCSAqIEBwYXJhbSBsYWJlbCB0aGUgTGFiZWwKLQkgKi8KLQlwdWJsaWMgRnJlZVRleHRDZWxsRWRpdG9yTG9jYXRvcihJRmlndXJlIGZpZ3VyZSkgewotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yI3JlbG9jYXRlKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxvY2F0ZShDZWxsRWRpdG9yIGNlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJRnJlZVRleHRGaWd1cmUgZmlnID0gKEZyZWVUZXh0RmlndXJlKWZpZ3VyZTsKLQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNlLmdldENvbnRyb2woKTsKLQkJU3RyaW5nIG4gPSAoU3RyaW5nKSBjZS5nZXRWYWx1ZSgpOwotCQlHQyBnYyA9IG5ldyBHQyh0ZXh0KTsKLQkJUG9pbnQgc2l6ZSA9IGdjLnRleHRFeHRlbnQobik7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJaWYgKHNpemUueCAhPSAwKQotCQkJc2l6ZSA9IHRleHQuY29tcHV0ZVNpemUoc2l6ZS54LCBTV1QuREVGQVVMVCk7Ci0JCXRleHQuc2V0U2l6ZShzaXplLngsIHNpemUueSk7Ci0JCVJlY3RhbmdsZSB0ZXh0Qm91bmRzID0gbmV3IFJlY3RhbmdsZSh0ZXh0LmdldENsaWVudEFyZWEoKS54LCB0ZXh0Ci0JCQkJLmdldENsaWVudEFyZWEoKS55LCB0ZXh0LmdldENsaWVudEFyZWEoKS53aWR0aCwgdGV4dAotCQkJCS5nZXRDbGllbnRBcmVhKCkuaGVpZ2h0KTsKLQkJUmVjdGFuZ2xlIGZpZ0JvdW5kcyA9IGZpZy5nZXRDbGllbnRBcmVhKCk7Ci0JCWZpZy50cmFuc2xhdGVUb0Fic29sdXRlKGZpZ0JvdW5kcyk7Ci0JCWludCBkZWx0YSA9IChmaWdCb3VuZHMud2lkdGggLSB0ZXh0Qm91bmRzLndpZHRoKSAvIDI7Ci0JCWludCB5ID0gZmlnLmdldFRleHRGbG93UGFnZSgpLmdldExvY2F0aW9uKCkueTsKLQkJdGV4dC5zZXRMb2NhdGlvbihmaWdCb3VuZHMueCArIGRlbHRhLCB5KTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRGaWd1cmUoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJdGhpcy5maWd1cmUgPSBmaWd1cmU7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZmlndXJlLgotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldEZpZ3VyZSgpIHsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRnJlZVRleHREaXJlY3RFZGl0TWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9GcmVlVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMzVkMDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9GcmVlVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGRpcmVjdCBlZGl0IG9wZXJhdGlvbiBieSBjcmVhdGluZyBhbmQgbWFpbnRhaW5pbmcgdGhlIAotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcn0gYW5kIGV4ZWN1dGluZyB0aGUgcmVzdWx0aW5nIGNvbW1hbmQgaWYgCi0gKiB0aGUgY2VsbCBlZGl0b3IgdmFsdWUgaGFzIGNoYW5nZWQuIFNwZWNpZmljYWxseSBmb3IgRnJlZVRleHQuCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZyZWVUZXh0RGlyZWN0RWRpdE1hbmFnZXIgZXh0ZW5kcyBEaXJlY3RFZGl0TWFuYWdlciB7Ci0JCi0JLyoKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgVmVyaWZ5TGlzdGVuZXIgdmVyaWZ5TGlzdGVuZXI7Ci0JcHJpdmF0ZSBGb250IHNjYWxlZEZvbnQ7Ci0JcHJvdGVjdGVkIElGaWd1cmUgZmlndXJlOwotCQotCXB1YmxpYyBGcmVlVGV4dERpcmVjdEVkaXRNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwgQ2xhc3MgZWRpdG9yVHlwZSwgQ2VsbEVkaXRvckxvY2F0b3IgbG9jYXRvciwgSUZpZ3VyZSBmaWd1cmUpIHsKLQkJc3VwZXIoc291cmNlLCBlZGl0b3JUeXBlLCBsb2NhdG9yKTsKLQkJdGhpcy5maWd1cmUgPSBmaWd1cmU7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKCkgewotCQlicmluZ0Rvd24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjYnJpbmdEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBicmluZ0Rvd24oYm9vbGVhbiBjaGVjaykgewotCQkvLyBUaGlzIG1ldGhvZCBtaWdodCBiZSByZS1lbnRlcmVkIHdoZW4gc3VwZXIuYnJpbmdEb3duKCkgaXMgY2FsbGVkLgotCQlGb250IGRpc3Bvc2VGb250ID0gc2NhbGVkRm9udDsKLQkJc2NhbGVkRm9udCA9IG51bGw7Ci0JCXN1cGVyLmJyaW5nRG93bigpOwotCQlpZiAoZGlzcG9zZUZvbnQgIT0gbnVsbCkKLQkJCWRpc3Bvc2VGb250LmRpc3Bvc2UoKTsKLQkJaWYgKGNoZWNrKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgZ2V0RWRpdFBhcnQoKS5nZXRNb2RlbCgpOwotCQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJLy8gVE9ETzogUmVtb3ZlIHRoaXMgY2hlY2sgCi0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJCU9iamVjdCB3YmVsZW1lbnQgPSBub2RlLmdldE9iamVjdCgpOwotCQkJCWlmICh3YmVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJJiYgUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpKSB7Ci0JCQkJCW5hbWUgPSBQcm9jZXNzVXRpbAotCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpOwotCQkJCX0KLQotCQkJfQotCQkJaWYobm9kZSBpbnN0YW5jZW9mIFR5cGVkTm9kZSAmJiAoKFR5cGVkTm9kZSlub2RlKS5nZXRUeXBlKCk9PVR5cGVkTm9kZS5GUkVFX1RFWFQpewotCQkJCUdyYXBoTm9kZSBnbm9kZSA9ICgoTm9kZSkgZ2V0RWRpdFBhcnQoKS5nZXRNb2RlbCgpKS5nZXRHcmFwaE5vZGUoKTsKLQkJCQluYW1lID0gKChQcm9wZXJ0eSkgZ25vZGUuZ2V0UHJvcGVydHkoKS5nZXQoMCkpLmdldFZhbHVlKCk7Ci0JCQl9Ci0JCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlEaXNwbGF5Ci0JCQkJCQkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuYXN5bmNFeGVjKAotCQkJCQkJCQluZXcgUHJvbXB0RWRpdCgKLQkJCQkJCQkJCQkoTm9kZUVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpLAotCQkJCQkJCQkJCURpYWdyYW1VSVJlc291cmNlcy5lcnJfbmFtZV9lbXB0eSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjaW5pdENlbGxFZGl0b3IoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDZWxsRWRpdG9yKCkgewotCQlUZXh0Q2VsbEVkaXRvciBlZGl0b3IgPSAoVGV4dENlbGxFZGl0b3IpIGdldENlbGxFZGl0b3IoKTsKLQkJZWRpdG9yLnNldFN0eWxlKFNXVC5NVUxUSSk7Ci0JCVRleHQgdCA9IChUZXh0KSBlZGl0b3IuZ2V0Q29udHJvbCgpOwotCQl2ZXJpZnlMaXN0ZW5lciA9IG5ldyBWZXJpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCQlUZXh0IHRleHQgPSAoVGV4dCkgZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLQkJCQlTdHJpbmcgb2xkVGV4dCA9IHRleHQuZ2V0VGV4dCgpOwotCQkJCVN0cmluZyBsZWZ0VGV4dCA9IG9sZFRleHQuc3Vic3RyaW5nKDAsIGV2ZW50LnN0YXJ0KTsKLQkJCQlTdHJpbmcgcmlnaHRUZXh0ID0gb2xkVGV4dC5zdWJzdHJpbmcoZXZlbnQuZW5kLCBvbGRUZXh0Ci0JCQkJCQkubGVuZ3RoKCkpOwotCQkJCUdDIGdjID0gbmV3IEdDKHRleHQpOwotCQkJCVBvaW50IHNpemUgPSBnYy50ZXh0RXh0ZW50KGxlZnRUZXh0ICsgZXZlbnQudGV4dCArIHJpZ2h0VGV4dCk7Ci0JCQkJZ2MuZGlzcG9zZSgpOwotCQkJCWlmIChzaXplLnggIT0gMCkKLQkJCQkJc2l6ZSA9IHRleHQuY29tcHV0ZVNpemUoc2l6ZS54LCBTV1QuREVGQVVMVCk7Ci0JCQkJZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKS5zZXRTaXplKHNpemUueCwgc2l6ZS55KTsKLQkJCX0KLQkJfTsKLQkJdC5hZGRWZXJpZnlMaXN0ZW5lcih2ZXJpZnlMaXN0ZW5lcik7Ci0JCVN0cmluZyBpbml0aWFsTGFiZWxUZXh0ID0gKChOb2RlRWRpdFBhcnQpIHRoaXMuZ2V0RWRpdFBhcnQoKSkKLQkJCQkuZ2V0RGlyZWN0RWRpdFRleHQoKTsKLQkJZWRpdG9yLnNldFZhbHVlKGluaXRpYWxMYWJlbFRleHQpOwotCQlGb250IGYgPSBmaWd1cmUuZ2V0Rm9udCgpOwotCQlGb250TWV0cmljcyBmbSA9IEZpZ3VyZVV0aWxpdGllcy5nZXRGb250TWV0cmljcyhmKTsKLQkJaW50IGggPSBmbS5nZXRIZWlnaHQoKTsKLQkJaW50IHcgPSBmbS5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci0JCXQuc2V0U2l6ZShpbml0aWFsTGFiZWxUZXh0Lmxlbmd0aCgpKncrMTAwLCBoKzUwKTsKLQkKLQkJaWYoZiAhPSBudWxsKQotCQkJdC5zZXRGb250KGYpOwotCQllbHNlCi0JCQl0LnNldEZvbnQoVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UKTsKLQkJdC5zZWxlY3RBbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciN1bmhvb2tMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVuaG9va0xpc3RlbmVycygpIHsKLQkJc3VwZXIudW5ob29rTGlzdGVuZXJzKCk7Ci0JCWlmIChnZXRDZWxsRWRpdG9yKCkgIT0gbnVsbCkgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0JCQlpZiAodmVyaWZ5TGlzdGVuZXIgIT0gbnVsbCkKLQkJCQl0ZXh0LnJlbW92ZVZlcmlmeUxpc3RlbmVyKHZlcmlmeUxpc3RlbmVyKTsKLQkJCXZlcmlmeUxpc3RlbmVyID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gdGV4dCBpcyB2YWxpZC4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIHR4dAotCSAqIEByZXR1cm4gbnVsbCBpZiB0aGUgZ2l2ZW4gdGV4dCBpcyB2YWxpZCwgYW4gZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjY29tbWl0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21taXQoKSB7Ci0JCVN0cmluZyBtc2cgPSB2YWxpZGF0ZSgoU3RyaW5nKSBnZXRDZWxsRWRpdG9yKCkuZ2V0VmFsdWUoKSk7Ci0JCWlmIChtc2cgIT0gbnVsbCkgewotCQkJYnJpbmdEb3duKGZhbHNlKTsKLQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYygKLQkJCQkJbmV3IFByb21wdEVkaXQoKE5vZGVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSwgbXNnKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuY29tbWl0KCk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFByb21wdEVkaXQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLQkJcHJpdmF0ZSBOb2RlRWRpdFBhcnQgcGFydDsKLQotCQlwcml2YXRlIFN0cmluZyBtc2c7Ci0KLQkJUHJvbXB0RWRpdChOb2RlRWRpdFBhcnQgcGFydCwgU3RyaW5nIG1zZykgewotCQkJdGhpcy5wYXJ0ID0gcGFydDsKLQkJCXRoaXMubXNnID0gbXNnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlTdHJpbmcgdGl0bGUgPSBEaWFncmFtVUlSZXNvdXJjZXMuZGlhZ3JhbV9lcnJvckRpYWxvZ190aXRsZV90ZXh0MDsgCi0JCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpOwotCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnKTsgCi0JCQlwYXJ0LnBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRnJlZVRleHRFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9GcmVlVGV4dEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMWMwNWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9GcmVlVGV4dEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuU2VsZWN0YWJsZUxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVGVtcGxhdGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5EaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIGRpcmVjdCBlZGl0aW5nLCBmcmVlIHRleHQgcHJvcGVydGllcyBjaGFuZ2VzIGxpa2UgZm9udCwgY29sb3IgYW5kIHRleHQuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRnJlZVRleHRFZGl0UGFydCBleHRlbmRzIE5vZGVFZGl0UGFydCB7Ci0KLQlwcml2YXRlIEZvbnQgZm9udDsKLQotCXByaXZhdGUgQ29sb3IgY29sb3I7Ci0KLQlwcml2YXRlIEZvbnREYXRhIGZEYXRhOwotCi0JcHJpdmF0ZSBOb2RlRWRpdFBhcnQgcGFydDsKLQotCXB1YmxpYyBGcmVlVGV4dEVkaXRQYXJ0KE5vZGUgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCQlwYXJ0ID0gdGhpczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUxhYmVsIGwgPSBuZXcgU2VsZWN0YWJsZUxhYmVsKCk7Ci0JCWwuc2V0TGFiZWxBbGlnbm1lbnQoUG9zaXRpb25Db25zdGFudHMuTEVGVCk7Ci0JCWwuc2V0VGV4dFBsYWNlbWVudChQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7Ci0JCXJldHVybiBsOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLQkJaWYgKCEoKE5vZGUpIGdldE1vZGVsKCkpLmlzUmVhZE9ubHkoKSkgewotCQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCQljcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRQb2xpY3kgY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpIHsKLQkJcmV0dXJuIG5ldyBEaXJlY3RFZGl0UG9saWN5KCkgewotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGlyZWN0RWRpdENvbW1hbmQoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBuZXcgQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQocGFydCwgKFN0cmluZykgcmVxdWVzdAotCQkJCQkJLmdldENlbGxFZGl0b3IoKS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIHZvaWQgc2hvd0N1cnJlbnRFZGl0VmFsdWUoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCUlGaWd1cmUgZmlnID0gZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpOwotCQkJCWlmIChmaWcgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJCQkoKExhYmVsKSBmaWcpLnNldFRleHQoKFN0cmluZykgcmVxdWVzdC5nZXRDZWxsRWRpdG9yKCkKLQkJCQkJCQkuZ2V0VmFsdWUoKSk7Ci0JCQkJCWZpZy5nZXRVcGRhdGVNYW5hZ2VyKCkucGVyZm9ybVVwZGF0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTm9kZS5jbGFzcykpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fVFlQRToKLQkJCXJlZnJlc2hWaXN1YWxzKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuaGFuZGxlUHJvcGVydHlDaGFuZ2VkKG1zZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybVJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RfRURJVAotCQkJCSYmICEoKE5vZGUpIGdldE1vZGVsKCkpLmlzUmVhZE9ubHkoKSkgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnBlcmZvcm1SZXF1ZXN0KHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCUlGaWd1cmUgZmlnID0gZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpOwotCQlpZiAoZmlnIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCUxhYmVsIGwgPSAoTGFiZWwpIGZpZzsKLQkJCUxpc3QgYWxpc3QgPSAoKE5vZGUpIGdldE1vZGVsKCkpLmdldEdyYXBoTm9kZSgpLmdldFByb3BlcnR5KCk7Ci0JCQlTdHJpbmcgZm9udE5hbWUgPSBUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfTkFNRTsKLQkJCWludCBmb250U3R5bGUgPSBTV1QuTk9STUFMOwotCQkJaW50IGZvbnRIZWlnaHQgPSBUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfU0laRTsKLQkJCWludCBmb250UmVkID0gU1dULkNPTE9SX1JFRDsKLQkJCWludCBmb250Qmx1ZSA9IFNXVC5DT0xPUl9CTFVFOwotCQkJaW50IGZvbnRHcmVlbiA9IFNXVC5DT0xPUl9HUkVFTjsKLQotCQkJaWYgKGFsaXN0LnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGlvciA9IGFsaXN0Lml0ZXJhdG9yKCk7IGlvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVByb3BlcnR5IHByb3AgPSAoUHJvcGVydHkpIGlvci5uZXh0KCk7Ci0JCQkJCWlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLkdSQVBIX05PREVfRlJFRV9URVhUKSkgewotCQkJCQkJbC5zZXRUZXh0KHByb3AuZ2V0VmFsdWUoKSk7Ci0JCQkJCX0gZWxzZSBpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9OQU1FKSkgewotCQkJCQkJZm9udE5hbWUgPSBwcm9wLmdldFZhbHVlKCk7Ci0JCQkJCX0gZWxzZSBpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9TVFlMRSkpIHsKLQkJCQkJCWZvbnRTdHlsZSA9IG5ldyBJbnRlZ2VyKHByb3AuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0hFSUdIVCkpIHsKLQkJCQkJCWZvbnRIZWlnaHQgPSBuZXcgSW50ZWdlcihwcm9wLmdldFZhbHVlKCkpLmludFZhbHVlKCk7Ci0JCQkJCX0gZWxzZSBpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9SRUQpKSB7Ci0JCQkJCQlmb250UmVkID0gbmV3IEludGVnZXIocHJvcC5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfQkxVRSkpIHsKLQkJCQkJCWZvbnRCbHVlID0gbmV3IEludGVnZXIocHJvcC5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfR1JFRU4pKSB7Ci0JCQkJCQlmb250R3JlZW4gPSBuZXcgSW50ZWdlcihwcm9wLmdldFZhbHVlKCkpLmludFZhbHVlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWwuc2V0VGV4dCgoKE5vZGUpIGdldE1vZGVsKCkpLmdldEdyYXBoTm9kZSgpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlpZiAoZm9udCAhPSBudWxsICYmICFmb250LmlzRGlzcG9zZWQoKSkgewotCQkJCWZvbnQuZGlzcG9zZSgpOwotCQkJfQotCQkJaWYgKGNvbG9yICE9IG51bGwgJiYgIWNvbG9yLmlzRGlzcG9zZWQoKSkgewotCQkJCWNvbG9yLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWZEYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBmb250SGVpZ2h0LCBmb250U3R5bGUpOwotCQkJZm9udCA9IG5ldyBGb250KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLCBmRGF0YSk7Ci0JCQljb2xvciA9IG5ldyBDb2xvcihudWxsLCBmb250UmVkLCBmb250R3JlZW4sIGZvbnRCbHVlKTsKLQkJCWwuc2V0Rm9udChmb250KTsKLQotCQkJbC5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGNyZWF0ZURpcmVjdEVkaXRNYW5hZ2VyKCkgewotCQlMYWJlbCBsID0gKExhYmVsKSBnZXRGaWd1cmUoKTsKLQkJcmV0dXJuIG5ldyBWYWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcih0aGlzLCBUZXh0Q2VsbEVkaXRvci5jbGFzcywKLQkJCQluZXcgTGFiZWxUZXh0Q2VsbEVkaXRvckxvY2F0b3IobCksIGwpIHsKLQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHR4dCkgewotCQkJCXJldHVybiBzdXBlci52YWxpZGF0ZSh0eHQpOwotCQkJfQotCQl9OwotCX0KLQotCUlGaWd1cmUgZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpIHsKLQkJcmV0dXJuIGdldEZpZ3VyZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCWlmIChmb250ICE9IG51bGwgJiYgIWZvbnQuaXNEaXNwb3NlZCgpKSB7Ci0JCQlmb250LmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoY29sb3IgIT0gbnVsbCAmJiAhY29sb3IuaXNEaXNwb3NlZCgpKSB7Ci0JCQljb2xvci5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9GcmVlVGV4dE5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9GcmVlVGV4dE5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjE5ZWZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRnJlZVRleHROb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuRnJlZVRleHRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIGRpcmVjdCBlZGl0aW5nLCB0ZXh0IGZvbnQsIGNvbG9yIGFuZCBzaXplIGNoYW5nZXMuIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpLgotICovCi0KLXB1YmxpYyBjbGFzcyBGcmVlVGV4dE5vZGVFZGl0UGFydCBleHRlbmRzIE5vZGVFZGl0UGFydCB7Ci0JcHJpdmF0ZSBGb250IGZvbnQ7Ci0KLQlwcml2YXRlIENvbG9yIGNvbG9yOwotCi0JcHJpdmF0ZSBGb250RGF0YSBmRGF0YTsKLQotCXByaXZhdGUgTm9kZUVkaXRQYXJ0IHBhcnQ7Ci0KLQlwdWJsaWMgRnJlZVRleHROb2RlRWRpdFBhcnQoTm9kZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JCXBhcnQgPSB0aGlzOyAKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJRnJlZVRleHRGaWd1cmUgbCA9IG5ldyBGcmVlVGV4dEZpZ3VyZSgpOwotCQlyZXR1cm4gbDsKLQotCX0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotCQlpZiAoISgoTm9kZSkgZ2V0TW9kZWwoKSkuaXNSZWFkT25seSgpKSB7Ci0JCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJCWNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkJhc2VFZGl0UGFydCNjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdFBvbGljeSBjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBuZXcgRGlyZWN0RWRpdFBvbGljeSgpIHsKLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldERpcmVjdEVkaXRDb21tYW5kKERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbmV3IENoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kKHBhcnQsIChTdHJpbmcpIHJlcXVlc3QKLQkJCQkJCS5nZXRDZWxsRWRpdG9yKCkuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCB2b2lkIHNob3dDdXJyZW50RWRpdFZhbHVlKERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlJRmlndXJlIGZpZyA9IGdldERpcmVjdEVkaXRGaWd1cmUoKTsKLQkJCQlpZiAoZmlnIGluc3RhbmNlb2YgRnJlZVRleHRGaWd1cmUpIHsKLQkJCQkJKChGcmVlVGV4dEZpZ3VyZSkgZmlnKS5zZXRUZXh0KChTdHJpbmcpIHJlcXVlc3QuZ2V0Q2VsbEVkaXRvcigpCi0JCQkJCQkJLmdldFZhbHVlKCkpOwotCQkJCQlmaWcuZ2V0VXBkYXRlTWFuYWdlcigpLnBlcmZvcm1VcGRhdGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChOb2RlLmNsYXNzKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19UWVBFOgotCQkJcmVmcmVzaFZpc3VhbHMoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZWQobXNnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QuZ2V0VHlwZSgpID09IFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVF9FRElUCi0JCQkJJiYgISgoTm9kZSkgZ2V0TW9kZWwoKSkuaXNSZWFkT25seSgpKSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9IGVsc2UgewotCQkJc3VwZXIucGVyZm9ybVJlcXVlc3QocmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJSUZpZ3VyZSBmaWcgPSBnZXREaXJlY3RFZGl0RmlndXJlKCk7Ci0JCWlmIChmaWcgaW5zdGFuY2VvZiBGcmVlVGV4dEZpZ3VyZSkgewotCQkJRnJlZVRleHRGaWd1cmUgbCA9IChGcmVlVGV4dEZpZ3VyZSkgZmlnOwotCQkJTGlzdCBhbGlzdCA9ICgoTm9kZSkgZ2V0TW9kZWwoKSkuZ2V0R3JhcGhOb2RlKCkuZ2V0UHJvcGVydHkoKTsKLQkJCVN0cmluZyBmb250TmFtZSA9IFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVF9OQU1FOwotCQkJaW50IGZvbnRTdHlsZSA9IFNXVC5OT1JNQUw7Ci0JCQlpbnQgZm9udEhlaWdodCA9IFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVF9TSVpFOwotCQkJaW50IGZvbnRSZWQgPSBTV1QuQ09MT1JfUkVEOwotCQkJaW50IGZvbnRCbHVlID0gU1dULkNPTE9SX0JMVUU7Ci0JCQlpbnQgZm9udEdyZWVuID0gU1dULkNPTE9SX0dSRUVOOwotCi0JCQlpZiAoYWxpc3Quc2l6ZSgpID4gMCkgewotCQkJCWZvciAoSXRlcmF0b3IgaW9yID0gYWxpc3QuaXRlcmF0b3IoKTsgaW9yLmhhc05leHQoKTspIHsKLQkJCQkJUHJvcGVydHkgcHJvcCA9IChQcm9wZXJ0eSkgaW9yLm5leHQoKTsKLQkJCQkJaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuR1JBUEhfTk9ERV9GUkVFX1RFWFQpKSB7Ci0JCQkJCQlsLnNldFRleHQocHJvcC5nZXRWYWx1ZSgpKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX05BTUUpKSB7Ci0JCQkJCQlmb250TmFtZSA9IHByb3AuZ2V0VmFsdWUoKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX1NUWUxFKSkgewotCQkJCQkJZm9udFN0eWxlID0gbmV3IEludGVnZXIocHJvcC5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfSEVJR0hUKSkgewotCQkJCQkJZm9udEhlaWdodCA9IG5ldyBJbnRlZ2VyKHByb3AuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX1JFRCkpIHsKLQkJCQkJCWZvbnRSZWQgPSBuZXcgSW50ZWdlcihwcm9wLmdldFZhbHVlKCkpLmludFZhbHVlKCk7Ci0JCQkJCX0gZWxzZSBpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9CTFVFKSkgewotCQkJCQkJZm9udEJsdWUgPSBuZXcgSW50ZWdlcihwcm9wLmdldFZhbHVlKCkpLmludFZhbHVlKCk7Ci0JCQkJCX0gZWxzZSBpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9HUkVFTikpIHsKLQkJCQkJCWZvbnRHcmVlbiA9IG5ldyBJbnRlZ2VyKHByb3AuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbC5zZXRUZXh0KCgoTm9kZSkgZ2V0TW9kZWwoKSkuZ2V0R3JhcGhOb2RlKCkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCWlmIChmb250ICE9IG51bGwgJiYgIWZvbnQuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJZm9udC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlpZiAoY29sb3IgIT0gbnVsbCAmJiAhY29sb3IuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJY29sb3IuZGlzcG9zZSgpOwotCQkJfQotCQkJZkRhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIGZvbnRIZWlnaHQsIGZvbnRTdHlsZSk7Ci0JCQlmb250ID0gbmV3IEZvbnQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCksIGZEYXRhKTsKLQkJCWNvbG9yID0gbmV3IENvbG9yKG51bGwsIGZvbnRSZWQsIGZvbnRHcmVlbiwgZm9udEJsdWUpOwotCQkJbC5zZXRGb250KGZvbnQpOwotCi0JCQlsLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgY3JlYXRlRGlyZWN0RWRpdE1hbmFnZXIoKSB7Ci0JCUZyZWVUZXh0RmlndXJlIGwgPSAoRnJlZVRleHRGaWd1cmUpIGdldEZpZ3VyZSgpOwotCQlyZXR1cm4gbmV3IEZyZWVUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dENlbGxFZGl0b3IuY2xhc3MsCi0JCQkJbmV3IEZyZWVUZXh0Q2VsbEVkaXRvckxvY2F0b3IobCksIGwpIHsKLQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHR4dCkgewotCQkJCXJldHVybiBzdXBlci52YWxpZGF0ZSh0eHQpOwotCQkJfQotCQl9OwotCX0KLQotCUlGaWd1cmUgZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpIHsKLQkJcmV0dXJuIGdldEZpZ3VyZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlRWRpdFBhcnQjZGVhY3RpdmF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJaWYgKGZvbnQgIT0gbnVsbCAmJiAhZm9udC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWZvbnQuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChjb2xvciAhPSBudWxsICYmICFjb2xvci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWNvbG9yLmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JfQotCVN0cmluZyBnZXREaXJlY3RFZGl0VGV4dCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkvL3JldHVybiBzdXBlci5nZXREaXJlY3RFZGl0VGV4dCgpOwotCQlJRmlndXJlIGZpZyA9IGdldERpcmVjdEVkaXRGaWd1cmUoKTsKLQkJaWYgKGZpZyBpbnN0YW5jZW9mIEZyZWVUZXh0RmlndXJlKSB7Ci0JCQlyZXR1cm4gKChGcmVlVGV4dEZpZ3VyZSkgZmlnKS5nZXRUZXh0KCk7Ci0JCX0gCi0JCXJldHVybiAiIjsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGFiZWxDZWxsRWRpdG9yTG9jYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9MYWJlbENlbGxFZGl0b3JMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhOTg0MTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9MYWJlbENlbGxFZGl0b3JMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQ29uc3RyYWludCBmb3IgTGFiZWwgcGxhY2luZy4gCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLWZpbmFsIHB1YmxpYyBjbGFzcyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IgewotCi0JcHJpdmF0ZSBJRmlndXJlIGZpZzsKLQotCXByaXZhdGUgc3RhdGljIGludCBXSU5fWF9PRkZTRVQgPSAtNDsKLQotCXByaXZhdGUgc3RhdGljIGludCBXSU5fV19PRkZTRVQgPSA1OwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IEdUS19YX09GRlNFVCA9IDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgR1RLX1dfT0ZGU0VUID0gMDsKLQotCXByaXZhdGUgc3RhdGljIGludCBNQUNfWF9PRkZTRVQgPSAtMzsKLQotCXByaXZhdGUgc3RhdGljIGludCBNQUNfV19PRkZTRVQgPSA5OwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1BQ19ZX09GRlNFVCA9IC0zOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1BQ19IX09GRlNFVCA9IDY7Ci0KLQlwdWJsaWMgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcihJRmlndXJlIGZpZ3VyZSkgewotCQlmaWcgPSBmaWd1cmU7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yI3JlbG9jYXRlKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcikKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikgewotCQlUZXh0IHRleHQgPSAoVGV4dCkgY2VsbGVkaXRvci5nZXRDb250cm9sKCk7Ci0KLQkJUmVjdGFuZ2xlIHJlY3QgPSBudWxsOwotCQlpZiAoZmlnIGluc3RhbmNlb2YgTGFiZWwpCi0JCQlyZWN0ID0gKChMYWJlbCkgZmlnKS5nZXRUZXh0Qm91bmRzKCkuaW50ZXJzZWN0KGZpZy5nZXRDbGllbnRBcmVhKCkpOwotCQllbHNlCi0JCQlyZWN0ID0gZmlnLmdldENsaWVudEFyZWEoUmVjdGFuZ2xlLlNJTkdMRVRPTik7Ci0JCWZpZy50cmFuc2xhdGVUb0Fic29sdXRlKHJlY3QpOwotCi0JCWludCB4T2Zmc2V0ID0gMDsKLQkJaW50IHdPZmZzZXQgPSAwOwotCQlpbnQgeU9mZnNldCA9IDA7Ci0JCWludCBoT2Zmc2V0ID0gMDsKLQotCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzSWdub3JlQ2FzZSgiZ3RrIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJeE9mZnNldCA9IEdUS19YX09GRlNFVDsKLQkJCXdPZmZzZXQgPSBHVEtfV19PRkZTRVQ7Ci0JCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzSWdub3JlQ2FzZSgiY2FyYm9uIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJeE9mZnNldCA9IE1BQ19YX09GRlNFVDsKLQkJCXdPZmZzZXQgPSBNQUNfV19PRkZTRVQ7Ci0JCQl5T2Zmc2V0ID0gTUFDX1lfT0ZGU0VUOwotCQkJaE9mZnNldCA9IE1BQ19IX09GRlNFVDsKLQkJfSBlbHNlIHsKLQkJCXhPZmZzZXQgPSBXSU5fWF9PRkZTRVQ7Ci0JCQl3T2Zmc2V0ID0gV0lOX1dfT0ZGU0VUOwotCQl9Ci0KLQkJdGV4dC5zZXRCb3VuZHMocmVjdC54ICsgeE9mZnNldCwgcmVjdC55ICsgeU9mZnNldCwKLQkJCQlyZWN0LndpZHRoICsgd09mZnNldCwgcmVjdC5oZWlnaHQgKyBoT2Zmc2V0KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xhYmVsRGlyZWN0RWRpdE1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGFiZWxEaXJlY3RFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjBmOTI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGFiZWxEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBkaXJlY3QgZWRpdCBvcGVyYXRpb24gYnkgY3JlYXRpbmcgYW5kIG1haW50YWluaW5nIHRoZSAKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3J9IGFuZCBleGVjdXRpbmcgdGhlIHJlc3VsdGluZyBjb21tYW5kIGlmIAotICogdGhlIGNlbGwgZWRpdG9yIHZhbHVlIGhhcyBjaGFuZ2VkLiBGb3Ige0BsaW5rIExhYmVsfS4KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMYWJlbERpcmVjdEVkaXRNYW5hZ2VyIGV4dGVuZHMgRGlyZWN0RWRpdE1hbmFnZXIgewotCi0JRm9udCBzY2FsZWRGb250OwotCi0JcHVibGljIExhYmVsRGlyZWN0RWRpdE1hbmFnZXIoR3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLCBDbGFzcyBlZGl0b3JUeXBlLAotCQkJQ2VsbEVkaXRvckxvY2F0b3IgbG9jYXRvcikgewotCQlzdXBlcihzb3VyY2UsIGVkaXRvclR5cGUsIGxvY2F0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKCkgewotCQkvLyBUaGlzIG1ldGhvZCBtaWdodCBiZSByZS1lbnRlcmVkIHdoZW4gc3VwZXIuYnJpbmdEb3duKCkgaXMgY2FsbGVkLgotCQlGb250IGRpc3Bvc2VGb250ID0gc2NhbGVkRm9udDsKLQkJc2NhbGVkRm9udCA9IG51bGw7Ci0JCXN1cGVyLmJyaW5nRG93bigpOwotCQlpZiAoZGlzcG9zZUZvbnQgIT0gbnVsbCkKLQkJCWRpc3Bvc2VGb250LmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q2VsbEVkaXRvcigpIHsKLQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0KLQkJZ2V0Q2VsbEVkaXRvcigpLnNldFZhbHVlKGdldEluaXRpYWxUZXh0KCkpOwotCQlJRmlndXJlIGZpZ3VyZSA9IGdldEVkaXRQYXJ0KCkuZ2V0RmlndXJlKCk7Ci0JCXNjYWxlZEZvbnQgPSBmaWd1cmUuZ2V0Rm9udCgpOwotCQlGb250RGF0YSBkYXRhID0gc2NhbGVkRm9udC5nZXRGb250RGF0YSgpWzBdOwotCQlEaW1lbnNpb24gZm9udFNpemUgPSBuZXcgRGltZW5zaW9uKDAsIGRhdGEuZ2V0SGVpZ2h0KCkpOwotCQlnZXREaXJlY3RFZGl0RmlndXJlKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShmb250U2l6ZSk7Ci0JCWRhdGEuc2V0SGVpZ2h0KGZvbnRTaXplLmhlaWdodCk7Ci0JCXNjYWxlZEZvbnQgPSBuZXcgRm9udChudWxsLCBkYXRhKTsKLQotCQl0ZXh0LnNldEZvbnQoc2NhbGVkRm9udCk7Ci0JCXRleHQuc2VsZWN0QWxsKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY2VsbCBlZGl0b3Igb24gdGhlIGdpdmVuIGNvbXBvc2l0ZS4gVGhlIGNlbGwgZWRpdG9yIGlzCi0JICogY3JlYXRlZCBieSBpbnN0YW50aWF0aW5nIHRoZSBjZWxsIGVkaXRvciB0eXBlIHBhc3NlZCBpbnRvIHRoaXMKLQkgKiBEaXJlY3RFZGl0TWFuYWdlcidzIGNvbnN0dWN0b3IuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIGNvbXBvc2l0ZSB0byBjcmVhdGUgdGhlIGNlbGwgZWRpdG9yIG9uCi0JICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBjZWxsIGVkaXRvcgotCSAqLwotCXByb3RlY3RlZCBDZWxsRWRpdG9yIGNyZWF0ZUNlbGxFZGl0b3JPbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXJldHVybiBuZXcgVGV4dENlbGxFZGl0b3IoY29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgdGV4dCBzaG93biBpbiB0aGUgY2VsbCBlZGl0b3IgZm9yCi0JICogICAgICAgICBkaXJlY3QtZWRpdGluZzsgY2Fubm90IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5pdGlhbFRleHQoKSB7Ci0JCXJldHVybiAoKEJhc2VFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkuZ2V0RGlyZWN0RWRpdFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGRldGVybWluZSB0aGUgaW5pdGlhbCB0ZXh0IG9mIHRoZSBjZWxsIGVkaXRvciBhbmQgdG8gZGV0ZXJtaW5lCi0JICogdGhlIGZvbnQgc2l6ZSBvZiB0aGUgdGV4dC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmaWd1cmUgYmVpbmcgZWRpdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpIHsKLQkJcmV0dXJuICgoQmFzZUVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpKS5nZXREaXJlY3RFZGl0RmlndXJlKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9MYWJlbFRleHRDZWxsRWRpdG9yTG9jYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9MYWJlbFRleHRDZWxsRWRpdG9yTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjFlZDQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGFiZWxUZXh0Q2VsbEVkaXRvckxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIENvbnN0cmFpbnQgZm9yIFRleHQgcGxhY2luZy4gCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGFiZWxUZXh0Q2VsbEVkaXRvckxvY2F0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yTG9jYXRvciB7Ci0KLQlwcml2YXRlIExhYmVsIGxhYmVsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBMYWJlbFRleHRDZWxsRWRpdG9yTG9jYXRvciBmb3IgdGhlIGdpdmVuIExhYmVsCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICB0aGUgTGFiZWwKLQkgKi8KLQlwdWJsaWMgTGFiZWxUZXh0Q2VsbEVkaXRvckxvY2F0b3IoTGFiZWwgbGFiZWwpIHsKLQkJc2V0TGFiZWwobGFiZWwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2VsbEVkaXRvckxvY2F0b3IjcmVsb2NhdGUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikgewotCQlUZXh0IHRleHQgPSAoVGV4dCkgY2VsbGVkaXRvci5nZXRDb250cm9sKCk7Ci0JCVBvaW50IHByZWYgPSB0ZXh0LmNvbXB1dGVTaXplKC0xLCAtMSk7Ci0JCVJlY3RhbmdsZSByZWN0ID0gbGFiZWwuZ2V0VGV4dEJvdW5kcygpLmdldENvcHkoKTsKLQkJbGFiZWwudHJhbnNsYXRlVG9BYnNvbHV0ZShyZWN0KTsKLQkJdGV4dC5zZXRCb3VuZHMocmVjdC54IC0gMSwgcmVjdC55IC0gMSwgcHJlZi54ICsgMSwgcHJlZi55ICsgMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgTGFiZWwgZmlndXJlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIExhYmVsCi0JICovCi0JcHJvdGVjdGVkIExhYmVsIGdldExhYmVsKCkgewotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBUaGUgbGFiZWwgdG8gc2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWwoTGFiZWwgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9MaW5rRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGlua0VkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YmNiZGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9MaW5rRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5Z29uRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5EZWxldGVMaW5rQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzLkxpbmtCZW5kcG9pbnRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXMuTGlua0VuZHBvaW50RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbm5lY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Hcm91cFJlcXVlc3Q7Ci0KLS8qKgotICogUHJvdmlkZXMgc3VwcG9ydCB0byB1cGRhdGUgdGhlIGFwcGVhcmFuY2UsIGFuZCBpbnN0YWxscyB0aGUgZWRpdHBvbGljaWVzCi0gKiBzcGVjaWZpYyB0aGUge0BsaW5rIExpbmt9IGFuZCBsaXN0ZW5zIHRvIGNoYW5nZXMgaW4gdGhlIGRpYWdyYW0gbW9kZWwuCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlua0VkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RDb25uZWN0aW9uRWRpdFBhcnQgewotCi0JcHJvdGVjdGVkIEFkYXB0ZXIgbW9kZWxMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQloYW5kbGVQcm9wZXJ0eUNoYW5nZWQobXNnKTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgTGlua0VkaXRQYXJ0KExpbmsgY29ubikgewotCQlzdXBlcigpOwotCQlzZXRNb2RlbChjb25uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuYWN0aXZhdGUoKTsKLQkJZ2V0TGluaygpLmVBZGFwdGVycygpLmFkZChtb2RlbExpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09OTkVDVElPTl9FTkRQT0lOVFNfUk9MRSwKLQkJCQluZXcgTGlua0VuZHBvaW50RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT05ORUNUSU9OX1JPTEUsCi0JCQkJbmV3IENvbm5lY3Rpb25FZGl0UG9saWN5KCkgewotCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKEdyb3VwUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlCb29sZWFuIGJvb2wgPSAoQm9vbGVhbikgcmVxdWVzdC5nZXRFeHRlbmRlZERhdGEoKS5nZXQoCi0JCQkJCQkJCURlbGV0ZUNvbW1hbmQuS0VZX1BFUk1fREVMRVRFKTsKLQkJCQkJCWJvb2xlYW4gcGVybURlbGV0ZSA9IGJvb2wgPT0gbnVsbCA/IGZhbHNlIDogYm9vbAotCQkJCQkJCQkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCQlyZXR1cm4gbmV3IERlbGV0ZUxpbmtDb21tYW5kKChMaW5rKSBnZXRIb3N0KCkKLQkJCQkJCQkJLmdldE1vZGVsKCksIHBlcm1EZWxldGUpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09OTkVDVElPTl9CRU5EUE9JTlRTX1JPTEUsCi0JCQkJbmV3IExpbmtCZW5kcG9pbnRFZGl0UG9saWN5KCkpOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJUG9seWxpbmVDb25uZWN0aW9uIGNvbm4gPSBuZXcgUG9seWxpbmVDb25uZWN0aW9uKCk7Ci0JCWNvbm4uc2V0VGFyZ2V0RGVjb3JhdGlvbihuZXcgUG9seWdvbkRlY29yYXRpb24oKSk7Ci0JCXVwZGF0ZUFwcGVhcmFuY2UoKTsKLQkJcmV0dXJuIGNvbm47Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUFwcGVhcmFuY2UoKSB7Ci0JCWlmIChmaWd1cmUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTGluayBsaW5rID0gKExpbmspIGdldE1vZGVsKCk7Ci0JCWlmIChWYWxpZGF0aW9uLmlzUmVhZE9ubHkobGluaykpIHsKLQkJCWZpZ3VyZS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JzLklOSEVSSVRFRF9FTEVNRU5UX0xBQkVMKTsKLQkJfSBlbHNlIHsKLQkJCWZpZ3VyZS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJZ2V0TGluaygpLmVBZGFwdGVycygpLnJlbW92ZShtb2RlbExpc3RlbmVyKTsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBMaW5rIGdldExpbmsoKSB7Ci0JCXJldHVybiAoTGluaykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTGluay5jbGFzcykpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fQkVORFBPSU5UUzoKLQkJCXJlZnJlc2hWaXN1YWxzKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUX0VORF9QT0lOVDoKLQkJCXJlZnJlc2hUYXJnZXRBbmNob3IoKTsKLQkJCWJyZWFrOwotCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0VfRU5EX1BPSU5UOgotCQkJcmVmcmVzaFNvdXJjZUFuY2hvcigpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJdXBkYXRlQXBwZWFyYW5jZSgpOwotCQlnZXRDb25uZWN0aW9uRmlndXJlKCkuc2V0Um91dGluZ0NvbnN0cmFpbnQoZ2V0TGluaygpLmdldEJlbmRwb2ludHMoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9OYW1lZE5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9OYW1lZE5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWI1MjIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTmFtZWROb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNoYW5nZU5hbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuU2VsZWN0YWJsZUxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuVGV4dEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQnJlYWtJdGVyYXRvcjsKLQotLyoqCi0gKiBEaWFncmFtIGNoaWxkcmVuIHNob3VsZCBleHRlbmQgdGhpcyBOYW1lZE5vZGVFZGl0UGFydCBpbiBvcmRlciB0byBzdXBwb3J0IG5hbWUgZm9yIGZpZ3VyZS4KLSAqIE5hbWVkTm9kZUVkaXRQYXJ0IHByb3ZpZGVzIGluc3RydWN0dXJlIHRvIGhhbmRsZSB0aGUgbmFtZSB3cmFwcGluZyBhbmQgY29sb3IuIFN1cHBvcnQgZGlyZWN0IAotICogZWRpdGluZyBmZWVkYmFjay4gICAKLSAqICAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOYW1lZE5vZGVFZGl0UGFydCBleHRlbmRzIE5vZGVFZGl0UGFydCB7Ci0KLQlwdWJsaWMgTmFtZWROb2RlRWRpdFBhcnQoTmFtZWROb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUxhYmVsIGwgPSBuZXcgU2VsZWN0YWJsZUxhYmVsKCk7Ci0JCWwuc2V0TGFiZWxBbGlnbm1lbnQoUG9zaXRpb25Db25zdGFudHMuTEVGVCk7Ci0JCWlmIChnZXRJbWFnZSgpICE9IG51bGwpIHsKLQkJCWwuc2V0SWNvbihnZXRJbWFnZSgpKTsKLQkJfQotCQlsLnNldFRleHRQbGFjZW1lbnQoUG9zaXRpb25Db25zdGFudHMuU09VVEgpOwotCQlsLnNldEZvbnQoVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UKTsKLQkJc2V0TGFiZWxGb3JlZ3JvdW5kQ29sb3IobCk7Ci0JCXJldHVybiBsOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRMYWJlbEZvcmVncm91bmRDb2xvcihMYWJlbCBsKSB7Ci0JCU5hbWVkTm9kZSBub2RlID0gKE5hbWVkTm9kZSkgZ2V0TW9kZWwoKTsKLQkJLy8gT2JqZWN0IGUgPSBub2RlLmdldE9iamVjdCgpOwotCQkvLyBib29sZWFuIHN1cHByZXNzZWQgPSBpc1N1cHByZXNzZWQoZSk7Ci0JCWJvb2xlYW4gc3VwcHJlc3NlZCA9IG5vZGUuaXNTdXBwcmVzc2VkKCk7Ci0JCWlmIChub2RlLmlzUmVhZE9ubHkoKSkgewotCQkJaWYgKCFzdXBwcmVzc2VkKSB7Ci0JCQkJbC5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JzLklOSEVSSVRFRF9FTEVNRU5UX0xBQkVMKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICghc3VwcHJlc3NlZCkgewotCQkJCWwuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLQkJCX0KLQkJfQotCQlpZiAoc3VwcHJlc3NlZCkgewotCQkJbC5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JzLlNVUFJFU1NFRF9FTEVNRU5UX0xBQkVMKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLQkJaWYgKCEoKE5vZGUpIGdldE1vZGVsKCkpLmlzUmVhZE9ubHkoKSkgewotCQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCQljcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRQb2xpY3kgY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpIHsKLQkJcmV0dXJuIG5ldyBEaXJlY3RFZGl0UG9saWN5KCkgewotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGlyZWN0RWRpdENvbW1hbmQoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBuZXcgQ2hhbmdlTmFtZUNvbW1hbmQoKE5hbWVkTm9kZSkgZ2V0TW9kZWwoKSwKLQkJCQkJCShTdHJpbmcpIHJlcXVlc3QuZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCkpOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgdm9pZCBzaG93Q3VycmVudEVkaXRWYWx1ZShEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJSUZpZ3VyZSBmaWcgPSBnZXREaXJlY3RFZGl0RmlndXJlKCk7Ci0JCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSByZXF1ZXN0LmdldENlbGxFZGl0b3IoKS5nZXRWYWx1ZSgpOwotCQkJCWlmIChmaWcgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJCQkoKExhYmVsKSBmaWcpLnNldFRleHQocyk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGZpZyBpbnN0YW5jZW9mIFRleHRGaWd1cmUpIHsKLQkJCQkJKChUZXh0RmlndXJlKSBmaWcpLnNldFRleHQocyk7Ci0JCQkJfQotCQkJCWZpZy5nZXRVcGRhdGVNYW5hZ2VyKCkucGVyZm9ybVVwZGF0ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChOYW1lZE5vZGUuY2xhc3MpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX05BTUU6Ci0JCQlyZWZyZXNoVmlzdWFscygpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlZChtc2cpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVQKLQkJCQkmJiAhKChOb2RlKSBnZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkpIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5wZXJmb3JtUmVxdWVzdChyZXF1ZXN0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFdSQVBfV0lEVEggPSAxMjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFdPUktfUFJPRFVDVF9XUkFQX1dJRFRIID0gMzsKLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlJRmlndXJlIGZpZyA9IGdldERpcmVjdEVkaXRGaWd1cmUoKTsKLQkJaWYgKGZpZyBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlMYWJlbCBsID0gKExhYmVsKSBmaWc7Ci0JCQlzZXRMYWJlbEZvcmVncm91bmRDb2xvcihsKTsKLQkJCVN0cmluZyB0ZXh0OwotCQkJLy8gQmVsb3cgY2hlY2sgaXMgcmVxdWlyZWQgZm9yIEV4dGVuZGVkIEFjdGl2aXR5IHByZXNlbnRhdGlvbiBuYW1lCi0JCQkvLyBzaG91bGQgYmUgdXNlZCBmcm9tIGJhc2UuCi0JCQlpZiAoZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBub2RlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgZ2V0TW9kZWwoKTsKLQkJCQlPYmplY3Qgd2JlbGVtZW50ID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQlpZiAod2JlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCSYmIFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZygoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KSkgewotCQkJCQl0ZXh0ID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KTsKLQkJCQl9IGVsc2UgewotCQkJCQl0ZXh0ID0gKChOYW1lZE5vZGUpIGdldE1vZGVsKCkpLmdldE5hbWUoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXRleHQgPSAoKE5hbWVkTm9kZSkgZ2V0TW9kZWwoKSkuZ2V0TmFtZSgpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlpZiAoZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydAotCQkJCQkJfHwgZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgewotCQkJCQlpbnQgdyA9IFdSQVBfV0lEVEg7Ci0JCQkJCWlmICh0aGlzLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKQotCQkJCQkJdyA9IFdPUktfUFJPRFVDVF9XUkFQX1dJRFRIOwotCQkJCQkKLQkJCQkJaWYodGhpcy5nZXRNb2RlbCgpIGluc3RhbmNlb2YgVGFza05vZGUgJiYgCi0JCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5pc0F1dG9MYXlvdXQoCi0JCQkJCQkJKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSlnZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRNb2RlbCgpKSl7Ci0JCQkJCQkvLyBVc2VkIDE2IGFzIG1pbiBsZW5ndGggZm9yIHRhc2tuYW1lLCBlbHNlIGFkZCBzcGFjZXMgdG8gaXQuCi0JCQkJCQkvLyBUT0RPOiBmaW5kIGJldHRlciBzb2x1dGlvbiBmb3IgdGhpcy4KLQkJCQkJCWlmKHRleHQubGVuZ3RoKCkgPCAxNil7Ci0JCQkJCQkJaW50IGdhcCA9IDE2IC0gdGV4dC5sZW5ndGgoKTsKLQkJCQkJCQlmb3IoaW50IGk9MDsgaTxnYXAvMjsgaSsrKXsKLQkJCQkJCQkJdGV4dCs9IiAiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWZvcihpbnQgaT0wOyBpPGdhcC8yOyBpKyspewotCQkJCQkJCQl0ZXh0ID0gIiAiK3RleHQ7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJdGV4dCA9IHdyYXAodGV4dCwgdyk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7Ci0JCQl9Ci0JCQlsLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHdyYXAoU3RyaW5nIHMsIGludCB3cmFwV2lkdGgpIHsKLQkJU3RyaW5nIHdyYXBwZWQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlCcmVha0l0ZXJhdG9yIGJpID0gQnJlYWtJdGVyYXRvci5nZXRMaW5lSW5zdGFuY2UoKTsKLQkJU3RyaW5nIHJlbWFpbmluZyA9IHM7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpZiAocmVtYWluaW5nLmxlbmd0aCgpIDw9IHdyYXBXaWR0aCkgewotCQkJCXdyYXBwZWQgKz0gcmVtYWluaW5nOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQliaS5zZXRUZXh0KHJlbWFpbmluZyk7Ci0JCQkJaW50IHBvcyA9IGJpLmZvbGxvd2luZyh3cmFwV2lkdGgpOwotCQkJCWlmIChwb3MgPT0gQnJlYWtJdGVyYXRvci5ET05FKSB7Ci0JCQkJCXdyYXBwZWQgKz0gcmVtYWluaW5nOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAocG9zID49IHJlbWFpbmluZy5sZW5ndGgoKSkgewotCQkJCQkJd3JhcHBlZCArPSByZW1haW5pbmc7Ci0JCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXdyYXBwZWQgKz0gcmVtYWluaW5nLnN1YnN0cmluZygwLCBwb3MpICsgIlxuIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmVtYWluaW5nID0gcmVtYWluaW5nLnN1YnN0cmluZyhwb3MpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB3cmFwcGVkOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTm9kZUNvbnRhaW5lckVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05vZGVDb250YWluZXJFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDIxODUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTm9kZUNvbnRhaW5lckVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkJlbmRwb2ludENvbm5lY3Rpb25Sb3V0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25MYXllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmFuUm91dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXMuTm9kZUNvbnRhaW5lckVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llcy5Ob2RlQ29udGFpbmVyRmxvd0xheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRGVmYXVsdEVkaXREb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Db21wb25lbnRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Hcm91cFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotCi0vKioKLSAqIE5vZGVDb250YWluZXJFZGl0UGFydCBtYW5hZ2VzIHRoZSBjaGlsZCBlZGl0cGFydHMgaW4gYSB7QGxpbmsgR3JhcGhpY2FsVmlld2VyfS4KLSAqIFByb3ZpZGVzIGluc3RydWN0dXJlIHRvIGhhbmRsZSB0aGUgbm90aWZpY2F0aW9ucyBmcm9tIG1vZGVsLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9kZUNvbnRhaW5lckVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydAotCQlpbXBsZW1lbnRzIExheWVyQ29uc3RhbnRzIHsKLQotCXByaXZhdGUgQmVuZHBvaW50Q29ubmVjdGlvblJvdXRlciBjUm91dGVyOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXIgbW9kZWxMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQloYW5kbGVQcm9wZXJ0eUNoYW5nZWQobXNnKTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KE5vZGVDb250YWluZXIgbW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJc2V0TW9kZWwobW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQlzdXBlci5hY3RpdmF0ZSgpOwotCQlOb2RlQ29udGFpbmVyIG1vZGVsID0gKE5vZGVDb250YWluZXIpICgoRU9iamVjdCkgZ2V0TW9kZWwoKSk7Ci0JCW1vZGVsLmVBZGFwdGVycygpLmFkZChtb2RlbExpc3RlbmVyKTsKLQkJbW9kZWwuYWRkQ29uc3VtZXIodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgewotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkNPTVBPTkVOVF9ST0xFLCBuZXcgQ29tcG9uZW50RWRpdFBvbGljeSgpIHsKLQkJCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURlbGV0ZUNvbW1hbmQoR3JvdXBSZXF1ZXN0IGRlbGV0ZVJlcXVlc3QpIHsKLQkJCQlCb29sZWFuIGJvb2wgPSAoQm9vbGVhbikgZGVsZXRlUmVxdWVzdC5nZXRFeHRlbmRlZERhdGEoKS5nZXQoCi0JCQkJCQlEZWxldGVDb21tYW5kLktFWV9QRVJNX0RFTEVURSk7Ci0JCQkJYm9vbGVhbiBwZXJtRGVsZXRlID0gYm9vbCA9PSBudWxsID8gZmFsc2UgOiBib29sLmJvb2xlYW5WYWx1ZSgpOwotCQkJCURlbGV0ZUNvbW1hbmQgY21kID0gbmV3IERlbGV0ZUNvbW1hbmQocGVybURlbGV0ZSk7Ci0JCQkJY21kLnNldFBhcnRUb0JlRGVsZXRlZChnZXRIb3N0KCkuZ2V0TW9kZWwoKSk7Ci0JCQkJcmV0dXJuIGNtZDsKLQkJCX0KLQkJfSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIG51bGwpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkNPTlRBSU5FUl9ST0xFLAotCQkJCW5ldyBOb2RlQ29udGFpbmVyRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5OT0RFX1JPTEUsIG51bGwpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLAotCQkJCW5ldyBOb2RlQ29udGFpbmVyRmxvd0xheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJTm9kZUNvbnRhaW5lciBtb2RlbCA9IChOb2RlQ29udGFpbmVyKSAoKEVPYmplY3QpIGdldE1vZGVsKCkpOwotCQltb2RlbC5lQWRhcHRlcnMoKS5yZW1vdmUobW9kZWxMaXN0ZW5lcik7Ci0JCW1vZGVsLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCi0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWRpdFBhcnQgZmluZENoaWxkQnlNb2RlbChPYmplY3QgbW9kZWwpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVkaXRQYXJ0IGNoaWxkID0gKEVkaXRQYXJ0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZC5nZXRNb2RlbCgpID09IG1vZGVsKSB7Ci0JCQkJcmV0dXJuIGNoaWxkOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFBhcnRUb0VkaXQoQ29sbGVjdGlvbiBwYXJ0c1RvRWRpdCwgT2JqZWN0IG5vZGUpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBOYW1lZE5vZGUpIHsKLQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gZmluZENoaWxkQnlNb2RlbChub2RlKTsKLQkJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEJhc2VFZGl0UGFydCkgewotCQkJCURpcmVjdEVkaXRNYW5hZ2VyIGVkaXRNYW5hZ2VyID0gKChCYXNlRWRpdFBhcnQpIGVkaXRQYXJ0KQotCQkJCQkJLmdldERpcmVjdEVkaXRNYW5hZ2VyKCk7Ci0JCQkJaWYgKGVkaXRNYW5hZ2VyIGluc3RhbmNlb2YgVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCQkmJiAoKFZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcikgZWRpdE1hbmFnZXIpCi0JCQkJCQkJCS52YWxpZGF0ZSgoKE5hbWVkTm9kZSkgbm9kZSkuZ2V0TmFtZSgpKSAhPSBudWxsKSB7Ci0JCQkJCXBhcnRzVG9FZGl0LmFkZChlZGl0UGFydCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE5vZGVDb250YWluZXIuY2xhc3MpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0xPQ0FUSU9OOgotCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19XSURUSDoKLQkJCXJlZnJlc2hWaXN1YWxzKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlM6Ci0JCQlyZWZyZXNoU291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCWJyZWFrOwotCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUzoKLQkJCXJlZnJlc2hUYXJnZXRDb25uZWN0aW9ucygpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19OT0RFUzoKLQkJCXJlZnJlc2hDaGlsZHJlbigpOwotCi0JCQlMaXN0IHBhcnRzVG9FZGl0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQlhZGRQYXJ0VG9FZGl0KHBhcnRzVG9FZGl0LCBtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlhZGRQYXJ0VG9FZGl0KHBhcnRzVG9FZGl0LCBpdGVyLm5leHQoKSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpLmlzRm9jdXNDb250cm9sKCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYXJ0c1RvRWRpdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJQmFzZUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEJhc2VFZGl0UGFydCkgaXRlci5uZXh0KCk7Ci0JCQkJCWVkaXRQYXJ0LnBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJfQotCQkJfQotCi0JCQlicmVhazsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlOb2RlIG5vZGUgPSAoTm9kZSkgZ2V0TW9kZWwoKTsKLQkJRGltZW5zaW9uIHNpemUgPSBuZXcgRGltZW5zaW9uKG5vZGUuZ2V0V2lkdGgoKSwgbm9kZS5nZXRIZWlnaHQoKSk7Ci0JCWlmIChzaXplID09IG51bGwpIHsKLQkJCXNpemUgPSBuZXcgRGltZW5zaW9uKDYwLCAxMDApOwotCQl9Ci0JCVBvaW50IGxvYyA9IG5vZGUuZ2V0TG9jYXRpb24oKTsKLQkJaWYgKGxvYyA9PSBudWxsKSB7Ci0JCQlsb2MgPSBuZXcgUG9pbnQoMTAsIDEwKTsKLQkJfQotCQlSZWN0YW5nbGUgciA9IG5ldyBSZWN0YW5nbGUobG9jLCBzaXplKTsKLQotCQkoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuc2V0TGF5b3V0Q29uc3RyYWludCh0aGlzLAotCQkJCWdldEZpZ3VyZSgpLCByKTsKLQotCQlpZiAoY1JvdXRlciA9PSBudWxsKSB7Ci0JCQlDb25uZWN0aW9uTGF5ZXIgY0xheWVyID0gKENvbm5lY3Rpb25MYXllcikgZ2V0TGF5ZXIoQ09OTkVDVElPTl9MQVlFUik7Ci0JCQlGYW5Sb3V0ZXIgcm91dGVyID0gbmV3IEZhblJvdXRlcigpOwotCQkJcm91dGVyLnNldFNlcGFyYXRpb24oMzApOwotCQkJY1JvdXRlciA9IG5ldyBCZW5kcG9pbnRDb25uZWN0aW9uUm91dGVyKCk7Ci0JCQlyb3V0ZXIuc2V0TmV4dFJvdXRlcihjUm91dGVyKTsKLQkJCWNMYXllci5zZXRDb25uZWN0aW9uUm91dGVyKHJvdXRlcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gKChOb2RlQ29udGFpbmVyKSBnZXRNb2RlbCgpKS5nZXROb2RlcygpOwotCX0KLQkKLQkvKioKLQkgKiBPbmx5IHVzZWZ1bCBpbiBjYXNlIG9mIEFERC4gUGxhY2VkIGhlcmUgaW4gb3JkZXIgdG8gaW52b2tlIGluIHN1YiBjbGFzc2VzLgotCSAqIFRPRE86ICBNb3ZlIHRoaXMgbWV0aG9kIHRvIHV0aWxpdHkgY2xhc3MuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYW5VcERpYWdyYW0oRWRpdFBhcnQgcGFydCkgewotCQlFZGl0UGFydCBkZXAgPSAoRWRpdFBhcnQpIHBhcnQuZ2V0UGFyZW50KCk7Ci0JCWlmKGRlcCBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0ICl7Ci0JCQkKLQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGFkZCA9ICgoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpZGVwKTsKLQkJCWlmKCEoKERpYWdyYW0pYWRkLmdldE1vZGVsKCkpLmlzUmVhZE9ubHkoKSl7Ci0JCQkJYWRkLmdldFJlY2VudGx5QWRkZWRQYXJ0cygpLmFkZEFsbChkZXAuZ2V0Q2hpbGRyZW4oKSk7Ci0JCQotCQkJCS8vIGNsZWFuIHVwIHRoZSBkaWFncmFtCi0JCQkJRGVmYXVsdEVkaXREb21haW4gZWRpdGluZ0RvbWFpbiA9IG5ldyBEZWZhdWx0RWRpdERvbWFpbihudWxsKTsKLQkJCQlBY3Rpb25SZWdpc3RyeSBhY3Rpb25SZWdpc3RyeSA9IG5ldyBBY3Rpb25SZWdpc3RyeSgpOwotCQkKLQkJCQlEaWFncmFtQWN0aW9uU2VydmljZSBhY3Rpb25TZXJ2aWNlID0gbmV3IERpYWdyYW1BY3Rpb25TZXJ2aWNlKAotCQkJCQkJKEdyYXBoaWNhbFZpZXdlcilnZXRQYXJlbnQoKS5nZXRWaWV3ZXIoKSwgZWRpdGluZ0RvbWFpbiwgYWN0aW9uUmVnaXN0cnkpOwotCQkJCWFjdGlvblNlcnZpY2UucmVnaXN0ZXJWZXJ0aWNhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbigpOwotCQkKLQkJCQlEaWFncmFtVXBkYXRlU2VydmljZSBzZXJ2aWNlID0gbmV3IERpYWdyYW1VcGRhdGVTZXJ2aWNlKAotCQkJCQkJKEdyYXBoaWNhbFZpZXdlcilnZXRQYXJlbnQoKS5nZXRWaWV3ZXIoKSwgZWRpdGluZ0RvbWFpbiwgYWN0aW9uUmVnaXN0cnkpOwotCQkJCXNlcnZpY2UuY2xlYW5VcERpYWdyYW0oKTsKLQkJCX0KLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTk4N2Y1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5DaG9wYm94QW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNyZWF0ZUxpbmtDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuUmVjb25uZWN0TGlua0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5Db25uZWN0aW9uQW5jaG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQ29ubmVjdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Db21wb25lbnRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVDb25uZWN0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuR3JvdXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5SZWNvbm5lY3RSZXF1ZXN0OwotCi0vKioKLSAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIGNvbm5lY3Rpb25zLCBhbmQgaW5zdGFsbHMgRWRpdFBvbGljeSBmb3IgKAotICoge0BsaW5rIEVkaXRQb2xpY3kuQ09NUE9ORU5UX1JPTEV9LCB7QGxpbmsgRWRpdFBvbGljeS5HUkFQSElDQUxfTk9ERV9ST0xFfSwKLSAqIHtAbGlua0VkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEV9KQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9kZUVkaXRQYXJ0IGV4dGVuZHMgQmFzZUVkaXRQYXJ0IGltcGxlbWVudHMKLQkJb3JnLmVjbGlwc2UuZ2VmLk5vZGVFZGl0UGFydCB7Ci0KLQlwdWJsaWMgTm9kZUVkaXRQYXJ0KE5vZGUgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09NUE9ORU5UX1JPTEUsIG5ldyBDb21wb25lbnRFZGl0UG9saWN5KCkgewotCQkJcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRGVsZXRlQ29tbWFuZChHcm91cFJlcXVlc3QgZGVsZXRlUmVxdWVzdCkgewotCQkJCUJvb2xlYW4gYm9vbCA9IChCb29sZWFuKSBkZWxldGVSZXF1ZXN0LmdldEV4dGVuZGVkRGF0YSgpLmdldCgKLQkJCQkJCURlbGV0ZUNvbW1hbmQuS0VZX1BFUk1fREVMRVRFKTsKLQkJCQlib29sZWFuIHBlcm1EZWxldGUgPSBib29sID09IG51bGwgPyBmYWxzZSA6IGJvb2wuYm9vbGVhblZhbHVlKCk7Ci0JCQkJRGVsZXRlQ29tbWFuZCBjbWQgPSBuZXcgRGVsZXRlQ29tbWFuZChwZXJtRGVsZXRlKTsKLQkJCQljbWQuc2V0UGFydFRvQmVEZWxldGVkKGdldEhvc3QoKS5nZXRNb2RlbCgpKTsKLQkJCQlyZXR1cm4gY21kOwotCQkJfQotCQl9KTsKLQotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCQkJbmV3IEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5KCkgewotCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb25uZWN0aW9uQ29tcGxldGVDb21tYW5kKAotCQkJCQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCUNyZWF0ZUxpbmtDb21tYW5kIGNtZCA9IChDcmVhdGVMaW5rQ29tbWFuZCkgcmVxdWVzdAotCQkJCQkJCQkuZ2V0U3RhcnRDb21tYW5kKCk7Ci0JCQkJCQljbWQuc2V0VGFyZ2V0KChOb2RlKSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSk7Ci0KLQkJCQkJCWlmIChyZXF1ZXN0LmdldFRhcmdldEVkaXRQYXJ0KCkgaW5zdGFuY2VvZiBDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgewotCQkJCQkJCWlmIChyZXF1ZXN0LmdldFRhcmdldEVkaXRQYXJ0KCkuZXF1YWxzKAotCQkJCQkJCQkJcmVxdWVzdC5nZXRTb3VyY2VFZGl0UGFydCgpKSkgewotCi0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJY21kCi0JCQkJCQkJCQkJLnNldFRhcmdldEVuZFBvaW50KCgoQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHJlcXVlc3QKLQkJCQkJCQkJCQkJCS5nZXRUYXJnZXRFZGl0UGFydCgpKQotCQkJCQkJCQkJCQkJLmdldExvY2F0aW9uKHJlcXVlc3QKLQkJCQkJCQkJCQkJCQkJLmdldExvY2F0aW9uKCkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCXJldHVybiBjbWQ7Ci0JCQkJCX0KLQotCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb25uZWN0aW9uQ3JlYXRlQ29tbWFuZCgKLQkJCQkJCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlDcmVhdGVMaW5rQ29tbWFuZCBjbWQgPSBuZXcgQ3JlYXRlTGlua0NvbW1hbmQoCi0JCQkJCQkJCU1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluaygpLAotCQkJCQkJCQkoTm9kZSkgZ2V0SG9zdCgpLmdldE1vZGVsKCkpOwotCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0RWRpdFBhcnQoKSBpbnN0YW5jZW9mIENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSB7Ci0JCQkJCQkJY21kCi0JCQkJCQkJCQkuc2V0U291cmNlRW5kUG9pbnQoKChDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgcmVxdWVzdAotCQkJCQkJCQkJCQkuZ2V0VGFyZ2V0RWRpdFBhcnQoKSkKLQkJCQkJCQkJCQkJLmdldExvY2F0aW9uKHJlcXVlc3QuZ2V0TG9jYXRpb24oKSkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljbWQuc2V0U291cmNlRW5kUG9pbnQocmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0KLQkJCQkJCXJlcXVlc3Quc2V0U3RhcnRDb21tYW5kKGNtZCk7Ci0KLQkJCQkJCXJldHVybiBjbWQ7Ci0KLQkJCQkJfQotCi0JCQkJCXByb3RlY3RlZCBDb21tYW5kIGdldFJlY29ubmVjdFNvdXJjZUNvbW1hbmQoCi0JCQkJCQkJUmVjb25uZWN0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgcmVxdWVzdC5nZXRDb25uZWN0aW9uRWRpdFBhcnQoKQotCQkJCQkJCQkuZ2V0TW9kZWwoKTsKLQkJCQkJCVJlY29ubmVjdExpbmtDb21tYW5kIGNtZCA9IG5ldyBSZWNvbm5lY3RMaW5rQ29tbWFuZCgKLQkJCQkJCQkJbGluaywgKE5vZGUpIGdldEhvc3QoKS5nZXRNb2RlbCgpLCB0cnVlKTsKLQkJCQkJCWlmIChyZXF1ZXN0LmdldFRhcmdldCgpIGluc3RhbmNlb2YgQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHsKLQkJCQkJCQljbWQuc2V0RW5kUG9pbnQoKChDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgcmVxdWVzdAotCQkJCQkJCQkJLmdldFRhcmdldCgpKS5nZXRMb2NhdGlvbihyZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSkpOwotCQkJCQkJfQotCi0JCQkJCQlyZXR1cm4gY21kOwotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVjb25uZWN0VGFyZ2V0Q29tbWFuZCgKLQkJCQkJCQlSZWNvbm5lY3RSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCUxpbmsgbGluayA9IChMaW5rKSByZXF1ZXN0LmdldENvbm5lY3Rpb25FZGl0UGFydCgpCi0JCQkJCQkJCS5nZXRNb2RlbCgpOwotCQkJCQkJUmVjb25uZWN0TGlua0NvbW1hbmQgY21kID0gbmV3IFJlY29ubmVjdExpbmtDb21tYW5kKAotCQkJCQkJCQlsaW5rLCAoTm9kZSkgZ2V0SG9zdCgpLmdldE1vZGVsKCksIGZhbHNlKTsKLQkJCQkJCWlmIChyZXF1ZXN0LmdldFRhcmdldCgpIGluc3RhbmNlb2YgQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHsKLQkJCQkJCQljbWQuc2V0RW5kUG9pbnQoKChDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgcmVxdWVzdAotCQkJCQkJCQkJLmdldFRhcmdldCgpKS5nZXRMb2NhdGlvbihyZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSkpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIGNtZDsKLQkJCQkJfQotCQkJCX0pOwotCi0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIG51bGwpOwotCQkvLyBCeSBkZWZhdWx0LCBjYW4ndCBhZGQgYW55dGhpbmcgdG8gYSBub2RlCi0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldERlbGV0ZURlcGVuZGFudENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCBOb2RlIGdldE5vZGUoKSB7Ci0JCXJldHVybiAoTm9kZSkgZ2V0TW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbFNvdXJjZUNvbm5lY3Rpb25zKCkgewotCQlyZXR1cm4gZ2V0Tm9kZSgpLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbFRhcmdldENvbm5lY3Rpb25zKCkgewotCQlyZXR1cm4gZ2V0Tm9kZSgpLmdldEluY29taW5nQ29ubmVjdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKAotCQkJQ29ubmVjdGlvbkVkaXRQYXJ0IGNvbm5lY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBDaG9wYm94QW5jaG9yKGdldEZpZ3VyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKFJlcXVlc3QgcmVxdWVzdCkgewotCQlyZXR1cm4gbmV3IENob3Bib3hBbmNob3IoZ2V0RmlndXJlKCkpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoCi0JCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubmVjdGlvbikgewotCQlyZXR1cm4gbmV3IENob3Bib3hBbmNob3IoZ2V0RmlndXJlKCkpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXJldHVybiBuZXcgQ2hvcGJveEFuY2hvcihnZXRGaWd1cmUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE5vZGUuY2xhc3MpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0xPQ0FUSU9OOgotCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19XSURUSDoKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSEVJR0hUOgkJCQotCQkJcmVmcmVzaFZpc3VhbHMoKTsKLQkJCWJyZWFrOwotCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19SRUFEX09OTFk6Ci0JCQlyZWZyZXNoVmlzdWFscygpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJQ29ubmVjdGlvbkVkaXRQYXJ0IGNvbm4gPSAoQ29ubmVjdGlvbkVkaXRQYXJ0KSBpdGVyLm5leHQoKTsKLQkJCQljb25uLnJlZnJlc2goKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOgotCQkJcmVmcmVzaFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0JCQlicmVhazsKLQotCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUzoKLQkJCXJlZnJlc2hUYXJnZXRDb25uZWN0aW9ucygpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJUmVjdGFuZ2xlIGNvbnN0cmFpbnQgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIC0xLCAtMSk7Ci0JCWlmIChnZXROb2RlKCkuZ2V0TG9jYXRpb24oKSAhPSBudWxsKQotCQkJY29uc3RyYWludC5zZXRMb2NhdGlvbihnZXROb2RlKCkuZ2V0TG9jYXRpb24oKSk7Ci0JCWNvbnN0cmFpbnQud2lkdGggPSBnZXROb2RlKCkuZ2V0V2lkdGgoKTsKLQkJKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0UGFyZW50KCkpLnNldExheW91dENvbnN0cmFpbnQodGhpcywKLQkJCQlnZXRGaWd1cmUoKSwgY29uc3RyYWludCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkJhc2VFZGl0UGFydCNhY3RpdmF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCSgoTm9kZSkgZ2V0TW9kZWwoKSkuYWRkQ29uc3VtZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkJhc2VFZGl0UGFydCNkZWFjdGl2YXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQkoKE5vZGUpIGdldE1vZGVsKCkpLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9SYWlzZWRNYXJnaW5Cb3JkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvUmFpc2VkTWFyZ2luQm9yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MmQwYTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9SYWlzZWRNYXJnaW5Cb3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlICBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5JbnNldHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotLyoqCi0gKiAgQSBib3JkZXIgd2l0aCBhIHJhaXNlZCBtYXJnaW4uCi0gKiAgCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJhaXNlZE1hcmdpbkJvcmRlciBleHRlbmRzIE1hcmdpbkJvcmRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnNldHMgREVGQVVMVF9JTlNFVFMgPSBuZXcgSW5zZXRzKDEwLCAxMCwgMTAsIDEwKTsKLQotCXB1YmxpYyBSYWlzZWRNYXJnaW5Cb3JkZXIoKSB7Ci0JCXRoaXMoREVGQVVMVF9JTlNFVFMpOwotCX0KLQotCXB1YmxpYyBSYWlzZWRNYXJnaW5Cb3JkZXIoSW5zZXRzIGluc2V0cykgewotCQlzdXBlcihpbnNldHMpOwotCX0KLQotCXB1YmxpYyBSYWlzZWRNYXJnaW5Cb3JkZXIoaW50IHQsIGludCBsLCBpbnQgYiwgaW50IHIpIHsKLQkJc3VwZXIodCwgbCwgYiwgcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQm9yZGVyI2dldEluc2V0cyhJRmlndXJlKQotCSAqLwotCXB1YmxpYyBJbnNldHMgZ2V0SW5zZXRzKElGaWd1cmUgZmlndXJlKSB7Ci0JCXJldHVybiBpbnNldHM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkJvcmRlciNpc09wYXF1ZSgpCi0JICovCQotCXB1YmxpYyBib29sZWFuIGlzT3BhcXVlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5Cb3JkZXIjcGFpbnQoSUZpZ3VyZSwgR3JhcGhpY3MsIEluc2V0cykKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYWludChJRmlndXJlIGZpZ3VyZSwgR3JhcGhpY3MgZywgSW5zZXRzIGluc2V0cykgewotCQlnLnNldExpbmVTdHlsZShHcmFwaGljcy5MSU5FX1NPTElEKTsKLQkJZy5zZXRMaW5lV2lkdGgoMSk7Ci0JCWcuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJ1dHRvbkxpZ2h0ZXN0KTsKLQkJUmVjdGFuZ2xlIHIgPSBnZXRQYWludFJlY3RhbmdsZShmaWd1cmUsIGluc2V0cyk7Ci0JCXIucmVzaXplKC0xLCAtMSk7Ci0JCWcuZHJhd0xpbmUoci54LCByLnksIHIucmlnaHQoKSwgci55KTsKLQkJZy5kcmF3TGluZShyLngsIHIueSwgci54LCByLmJvdHRvbSgpKTsKLQkJZy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYnV0dG9uRGFya2VyKTsKLQkJZy5kcmF3TGluZShyLngsIHIuYm90dG9tKCksIHIucmlnaHQoKSwgci5ib3R0b20oKSk7Ci0JCWcuZHJhd0xpbmUoci5yaWdodCgpLCByLnksIHIucmlnaHQoKSwgci5ib3R0b20oKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1JlbGF0aXZlWFlBbmNob3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvUmVsYXRpdmVYWUFuY2hvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGNiNzVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvUmVsYXRpdmVYWUFuY2hvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdENvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLS8qKgotICogUHJvdmlkZXMgcmVsYXRpdmUgYW5jaG9yIGZvciBhIGZpZ3VyZSdzIGxvY2F0aW9uLiAKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlbGF0aXZlWFlBbmNob3IgZXh0ZW5kcyBBYnN0cmFjdENvbm5lY3Rpb25BbmNob3IgewotCi0JcHJpdmF0ZSBQb2ludCByZWxhdGl2ZUxvY2F0aW9uOwotCi0JcHVibGljIFJlbGF0aXZlWFlBbmNob3IoSUZpZ3VyZSBmaWd1cmUsIFBvaW50IGxvY2F0aW9uLCBib29sZWFuIGlzUmVsYXRpdmUpIHsKLQkJc3VwZXIoZmlndXJlKTsKLQkJcmVsYXRpdmVMb2NhdGlvbiA9IGxvY2F0aW9uLmdldENvcHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uQW5jaG9yI2dldExvY2F0aW9uKFBvaW50KQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRMb2NhdGlvbihQb2ludCByZWZlcmVuY2UpIHsKLQkJUG9pbnQgcCA9IHJlbGF0aXZlTG9jYXRpb24uZ2V0Q29weSgpOwotCQlSZWN0YW5nbGUgciA9IGdldE93bmVyKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQlwLnBlcmZvcm1UcmFuc2xhdGUoci54LCByLnkpOwotCQlnZXRPd25lcigpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocCk7Ci0JCXJldHVybiBwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0Q29ubmVjdGlvbkFuY2hvciNnZXRSZWZlcmVuY2VQb2ludCgpCi0JICovCi0JcHVibGljIFBvaW50IGdldFJlZmVyZW5jZVBvaW50KCkgewotCQlyZXR1cm4gZ2V0TG9jYXRpb24obnVsbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1JvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDA4MTI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GbG93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzLlJvbGVUYXNrRmxvd0xheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQgaXMgY29udGFpbmVyIHdpdGgge0BsaW5rIEZsb3dMYXlvdXR9LCBhbmQgZG9lcyBub3Qgc3VwcG9ydCBhZGRpbmcvcmVtb3ZpbmcgY2hpbGQgZWRpdHBhcnQuIAotICogIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQgZXh0ZW5kcyBOb2RlQ29udGFpbmVyRWRpdFBhcnQgewotCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xvciBCR19DT0xPUiA9IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgMjU1LAotLy8JCQkyNTUsIDE1Nik7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgIENvbG9yIEJHX0NPTE9SOwotCXB1YmxpYyBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KFJvbGVUYXNrQ29tcG9zaXRlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUZpZ3VyZSBmaWd1cmUgPSBuZXcgRmlndXJlKCk7Ci0JCUZsb3dMYXlvdXQgbGF5b3V0ID0gbmV3IEZsb3dMYXlvdXQoKTsKLQkJbGF5b3V0LnNldE1pbm9yU3BhY2luZygyMCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCWZpZ3VyZS5zZXRCb3JkZXIobmV3IFJhaXNlZE1hcmdpbkJvcmRlcigpKTsKLQkJZmlndXJlLnNldEJhY2tncm91bmRDb2xvcihnZXRCYWNrZ3JvdW5kQ29sb3IoKSk7Ci0JCWZpZ3VyZS5zZXRPcGFxdWUodHJ1ZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVDb250YWluZXJFZGl0UGFydCNoYW5kbGVQcm9wZXJ0eUNoYW5nZWQoTm90aWZpY2F0aW9uKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChOb2RlQ29udGFpbmVyLmNsYXNzKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fTk9ERVM6Ci0JCQlyZWZyZXNoQ2hpbGRyZW4oKTsKLQotCQkJLy8gcmVmcmVzaCBkaWFncmFtJ3MgY2hpbGRyZW4KLQkJCUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydCA9IGdldFBhcmVudCgpOwotLy8JCQlpZiAoZGlhZ3JhbUVkaXRQYXJ0IGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIHsKLS8vCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBkaWFncmFtID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgZGlhZ3JhbUVkaXRQYXJ0Ci0vLwkJCQkJCS5nZXRNb2RlbCgpOwotLy8KLS8vCQkJCWlmICghR3JhcGhpY2FsRGF0YUhlbHBlci5pc0F1dG9MYXlvdXQoZGlhZ3JhbSkpIHsKLS8vCQkJCQkoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSBkaWFncmFtRWRpdFBhcnQpCi0vLwkJCQkJCQkuZ2V0UmVjZW50bHlBZGRlZFBhcnRzKCkuYWRkQWxsKAotLy8JCQkJCQkJCQlkaWFncmFtRWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKSk7Ci0vLwkJCQkJRGVmYXVsdEVkaXREb21haW4gZWQgPSAoRGVmYXVsdEVkaXREb21haW4pIGRpYWdyYW1FZGl0UGFydAotLy8JCQkJCQkJLmdldFZpZXdlcigpLmdldEVkaXREb21haW4oKTsKLS8vCQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBlZC5nZXRFZGl0b3JQYXJ0KCk7Ci0vLwkJCQkJaWYgKGVkaXRvciAhPSBudWxsICYmIGVkaXRvciBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcikgewotLy8JCQkJCQkoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcikgZWRpdG9yKS5jbGVhblVwRGlhZ3JhbSgpOwotLy8JCQkJCX0KLS8vCQkJCX0gZWxzZSB7Ci0vLwkJCQkJZGlhZ3JhbUVkaXRQYXJ0LnJlZnJlc2goKTsKLS8vCQkJCX0KLS8vCQkJfQotCQkJZGlhZ3JhbUVkaXRQYXJ0LnJlZnJlc2goKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZWQobXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUNvbnRhaW5lckVkaXRQYXJ0I2NyZWF0ZUVkaXRQb2xpY2llcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgbmV3IFJvbGVUYXNrRmxvd0xheW91dEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09NUE9ORU5UX1JPTEUsIG51bGwpOwotCX0KLQlwcm90ZWN0ZWQgQ29sb3IgZ2V0QmFja2dyb3VuZENvbG9yKCl7Ci0JCWlmKEJHX0NPTE9SICE9IG51bGwpIHJldHVybiBCR19DT0xPUjsKLQkJCi0JCWlmKEJHX0NPTE9SID09IG51bGwpewotCQkJU3RyaW5nIGNvbG9yU3RyaW5nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQkJVGVtcGxhdGVDb25zdGFudHMuQUREX1JPTEVfVEFTS1NfQk9YX0JHX0NPTE9SX1JHQik7Ci0JCQlpZihjb2xvclN0cmluZyAhPSBudWxsICYmIGNvbG9yU3RyaW5nLmxlbmd0aCgpID4gMCl7Ci0JCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY29sb3JTdHJpbmcsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbnQgciA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQlpbnQgZyA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQlpbnQgYiA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQlCR19DT0xPUiA9IG5ldyBDb2xvcihudWxsLCByLGcsYik7Ci0JCQkJcmV0dXJuIEJHX0NPTE9SOwotCQkJfQotCQl9Ci0JCWlmKEJHX0NPTE9SID09IG51bGwpewotCQkJQkdfQ09MT1IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIDI1NSwKLQkJCQkJCQkyNTUsIDE1Nik7Ci0JCX0KLQkJcmV0dXJuIEJHX0NPTE9SOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvU3RhcnROb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvU3RhcnROb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFhYmNiMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1N0YXJ0Tm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5FbGxpcHNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci0KLS8qKgotICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgY3JlYXRpbmcgZmlndXJlIGZvciB7QGxpbmsgVHlwZWROb2RlLlNUQVJUfQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RhcnROb2RlRWRpdFBhcnQgZXh0ZW5kcyBOb2RlRWRpdFBhcnQgewotCi0JcHVibGljIFN0YXJ0Tm9kZUVkaXRQYXJ0KFR5cGVkTm9kZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkJhc2VFZGl0UGFydCNjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdFBvbGljeSBjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZUZpZ3VyZSgpCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlFbGxpcHNlIGYgPSBuZXcgRWxsaXBzZSgpOwotCQlmLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0JCWYuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLnJlZCk7Ci0JCWYuc2V0U2l6ZSgyMCwgMjApOwotCQlyZXR1cm4gZjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvU3luY2hCYXJOb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvU3luY2hCYXJOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJmYzAwMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1N5bmNoQmFyTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuQ29ubmVjdGlvbkFuY2hvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkNvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Mb2NhdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIGNyZWF0aW5nIGZpZ3VyZSBhbmQgY3JlYXRpbmcgcmVsYXRpdmUgYW5jaG9ycwotICogZm9yIHtAbGluayBUeXBlZE5vZGUuU1lOQ19CQVJ9Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3luY2hCYXJOb2RlRWRpdFBhcnQgZXh0ZW5kcyBOb2RlRWRpdFBhcnQgaW1wbGVtZW50cwotCQlDb25uZWN0aW9uQW5jaG9yTG9jYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xvciBCR19DT0xPUiA9IG5ldyBDb2xvcihudWxsLCA1MSwgMTAyLCAxMDIpOwotCi0JcHJpdmF0ZSBQb2ludCByZWNlbnRUYXJnZXRFbmRQb2ludDsKLQotCXByaXZhdGUgUG9pbnQgcmVjZW50U291cmNlRW5kUG9pbnQ7Ci0KLQlwdWJsaWMgU3luY2hCYXJOb2RlRWRpdFBhcnQoVHlwZWROb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZURpcmVjdEVkaXRQb2xpY3koKQotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0UG9saWN5IGNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJUmVjdGFuZ2xlRmlndXJlIGYgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7Ci0JCWYuc2V0QmFja2dyb3VuZENvbG9yKEJHX0NPTE9SKTsKLQkJZi5zZXRTaXplKDEwMCwgNSk7Ci0JCXJldHVybiBmOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoCi0JCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubmVjdGlvbikgewotCQlib29sZWFuIGlzUmVsYXRpdmUgPSBmYWxzZTsKLQkJUG9pbnQgc291cmNlRW5kUG9pbnQgPSBudWxsOwotCQlpZiAocmVjZW50U291cmNlRW5kUG9pbnQgPT0gbnVsbCkgewotCQkJLy8gZ2V0IHNvdXJjZSBlbmQgcG9pbnQgZnJvbSB0aGUgbW9kZWwKLQkJCUxpbmsgbGluayA9IChMaW5rKSBjb25uZWN0aW9uLmdldE1vZGVsKCk7Ci0JCQlzb3VyY2VFbmRQb2ludCA9IGxpbmsuZ2V0U291cmNlRW5kUG9pbnQoKTsKLQkJCWlzUmVsYXRpdmUgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJc291cmNlRW5kUG9pbnQgPSByZWNlbnRTb3VyY2VFbmRQb2ludDsKLQkJfQotCQlpZiAoc291cmNlRW5kUG9pbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBSZWxhdGl2ZVhZQW5jaG9yKGdldEZpZ3VyZSgpLCBzb3VyY2VFbmRQb2ludCwgaXNSZWxhdGl2ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoY29ubmVjdGlvbik7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJUG9pbnQgcCA9IG51bGw7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QpIHsKLQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcSA9IChDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCkgcmVxdWVzdDsKLQkJCXAgPSByZXEuZ2V0TG9jYXRpb24oKTsKLQkJfSBlbHNlIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgTG9jYXRpb25SZXF1ZXN0KSB7Ci0JCQlwID0gKChMb2NhdGlvblJlcXVlc3QpIHJlcXVlc3QpLmdldExvY2F0aW9uKCk7Ci0JCX0KLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJcmVjZW50U291cmNlRW5kUG9pbnQgPSBnZXRMb2NhdGlvbihwKTsKLQkJCXJldHVybiBuZXcgUmVsYXRpdmVYWUFuY2hvcihnZXRGaWd1cmUoKSwgcmVjZW50U291cmNlRW5kUG9pbnQsIHRydWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKHJlcXVlc3QpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoCi0JCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubmVjdGlvbikgewotCQlib29sZWFuIGlzUmVsYXRpdmUgPSBmYWxzZTsKLQkJUG9pbnQgdGFyZ2V0RW5kUG9pbnQgPSBudWxsOwotCQlpZiAocmVjZW50VGFyZ2V0RW5kUG9pbnQgPT0gbnVsbCkgewotCQkJTGluayBsaW5rID0gKExpbmspIGNvbm5lY3Rpb24uZ2V0TW9kZWwoKTsKLQkJCXRhcmdldEVuZFBvaW50ID0gbGluay5nZXRUYXJnZXRFbmRQb2ludCgpOwotCQkJaXNSZWxhdGl2ZSA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQl0YXJnZXRFbmRQb2ludCA9IHJlY2VudFRhcmdldEVuZFBvaW50OwotCQl9Ci0JCWlmICh0YXJnZXRFbmRQb2ludCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFJlbGF0aXZlWFlBbmNob3IoZ2V0RmlndXJlKCksIHRhcmdldEVuZFBvaW50LCBpc1JlbGF0aXZlKTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKGNvbm5lY3Rpb24pOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCVBvaW50IHAgPSBudWxsOwotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0KSB7Ci0JCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXEgPSAoQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QpIHJlcXVlc3Q7Ci0JCQlwID0gcmVxLmdldExvY2F0aW9uKCk7Ci0JCX0gZWxzZSBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIExvY2F0aW9uUmVxdWVzdCkgewotCQkJcCA9ICgoTG9jYXRpb25SZXF1ZXN0KSByZXF1ZXN0KS5nZXRMb2NhdGlvbigpOwotCQl9Ci0JCWlmIChwICE9IG51bGwpIHsKLQkJCXJlY2VudFRhcmdldEVuZFBvaW50ID0gZ2V0TG9jYXRpb24ocCk7Ci0JCQlyZXR1cm4gbmV3IFJlbGF0aXZlWFlBbmNob3IoZ2V0RmlndXJlKCksIHJlY2VudFRhcmdldEVuZFBvaW50LCB0cnVlKTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKHJlcXVlc3QpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5Db25uZWN0aW9uQW5jaG9yTG9jYXRvciNnZXRMb2NhdGlvbihQb2ludCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oUG9pbnQgcmVmZXJlbmNlKSB7Ci0JCXJldHVybiBDbG9zZXN0QW5jaG9yLmdldExvY2F0aW9uKGdldEZpZ3VyZSgpLCByZWZlcmVuY2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9UZXh0RmlndXJlQ2VsbEVkaXRvckxvY2F0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVGV4dEZpZ3VyZUNlbGxFZGl0b3JMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NWU3ZGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9UZXh0RmlndXJlQ2VsbEVkaXRvckxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuVGV4dEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIENvbnN0cmFpbnQgZm9yIFRleHRGbG93IHBsYWNpbmcuCi0gKiBAYXV0aG9yIEphbWVzIFRoYXJpbwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGV4dEZpZ3VyZUNlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IgewotCi0JcHJpdmF0ZSBUZXh0RmlndXJlIGZpZ3VyZTsKLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBMYWJlbFRleHRDZWxsRWRpdG9yTG9jYXRvciBmb3IgdGhlIGdpdmVuIHRleHQgZmlndXJlCi0JICogQHBhcmFtIHRmCi0JICovCi0JcHVibGljIFRleHRGaWd1cmVDZWxsRWRpdG9yTG9jYXRvcihUZXh0RmlndXJlIHRmKSB7Ci0JCXNldEZpZ3VyZSh0Zik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDZWxsRWRpdG9yTG9jYXRvciNyZWxvY2F0ZShvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKSB7Ci0JCVRleHRGaWd1cmVDZWxsRWRpdG9yTG9jYXRvci5kb0xvY2F0ZShjZWxsZWRpdG9yLCBmaWd1cmUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkb0xvY2F0ZShDZWxsRWRpdG9yIGNlLCBUZXh0RmlndXJlIGZpZykgewotCQlUZXh0IHRleHQgPSAoVGV4dCkgY2UuZ2V0Q29udHJvbCgpOwotCQlTdHJpbmcgbiA9IChTdHJpbmcpIGNlLmdldFZhbHVlKCk7Ci0JCUdDIGdjID0gbmV3IEdDKHRleHQpOwotCQlQb2ludCBzaXplID0gZ2MudGV4dEV4dGVudChuKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQlpZiAoc2l6ZS54ICE9IDApCi0JCQlzaXplID0gdGV4dC5jb21wdXRlU2l6ZShzaXplLngsIFNXVC5ERUZBVUxUKTsKLQkJdGV4dC5zZXRTaXplKHNpemUueCwgc2l6ZS55KTsKLQkJUmVjdGFuZ2xlIHRleHRCb3VuZHMgPSBuZXcgUmVjdGFuZ2xlKHRleHQuZ2V0Q2xpZW50QXJlYSgpLngsIHRleHQKLQkJCQkuZ2V0Q2xpZW50QXJlYSgpLnksIHRleHQuZ2V0Q2xpZW50QXJlYSgpLndpZHRoLCB0ZXh0Ci0JCQkJLmdldENsaWVudEFyZWEoKS5oZWlnaHQpOwotCQlSZWN0YW5nbGUgZmlnQm91bmRzID0gZmlnLmdldENsaWVudEFyZWEoKTsKLQkJZmlnLnRyYW5zbGF0ZVRvQWJzb2x1dGUoZmlnQm91bmRzKTsKLQkJaW50IGRlbHRhID0gKGZpZ0JvdW5kcy53aWR0aCAtIHRleHRCb3VuZHMud2lkdGgpIC8gMjsKLQkJaW50IHkgPSBmaWcuZ2V0VGV4dEZsb3dQYWdlKCkuZ2V0TG9jYXRpb24oKS55OwotCQl0ZXh0LnNldExvY2F0aW9uKGZpZ0JvdW5kcy54ICsgZGVsdGEsIHkpOwotCX0KLQotCXB1YmxpYyBUZXh0RmlndXJlIGdldEZpZ3VyZSgpIHsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWd1cmUoVGV4dEZpZ3VyZSBmaWd1cmUpIHsKLQkJdGhpcy5maWd1cmUgPSBmaWd1cmU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1RleHRGaWd1cmVEaXJlY3RFZGl0TWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9UZXh0RmlndXJlRGlyZWN0RWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc2YjI3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1RleHRGaWd1cmVEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuVGV4dEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIE1hbmFnZXMgZGlyZWN0IGVkaXRpbmcgYW5kIGNyZWF0aW5nIGNlbGxlZGl0b3IgZm9yIHtAbGluayBUZXh0RmlndXJlfQotICogCi0gKiBAYXV0aG9yIEphbWVzIFRoYXJpbwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGV4dEZpZ3VyZURpcmVjdEVkaXRNYW5hZ2VyIGV4dGVuZHMgRGlyZWN0RWRpdE1hbmFnZXIgewotCi0JRm9udCBzY2FsZWRGb250OwotCi0JcHJvdGVjdGVkIFZlcmlmeUxpc3RlbmVyIHZlcmlmeUxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIFRleHRGaWd1cmUgZmlndXJlID0gbnVsbDsKLQotCXB1YmxpYyBUZXh0RmlndXJlRGlyZWN0RWRpdE1hbmFnZXIoR3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLAotCQkJQ2xhc3MgZWRpdG9yVHlwZSwgQ2VsbEVkaXRvckxvY2F0b3IgbG9jYXRvciwgVGV4dEZpZ3VyZSBmaWd1cmUpIHsKLQkJc3VwZXIoc291cmNlLCBlZGl0b3JUeXBlLCBsb2NhdG9yKTsKLQkJdGhpcy5maWd1cmUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjYnJpbmdEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBicmluZ0Rvd24oKSB7Ci0JCWJyaW5nRG93bih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNicmluZ0Rvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJyaW5nRG93bihib29sZWFuIGNoZWNrKSB7Ci0JCS8vIFRoaXMgbWV0aG9kIG1pZ2h0IGJlIHJlLWVudGVyZWQgd2hlbiBzdXBlci5icmluZ0Rvd24oKSBpcyBjYWxsZWQuCi0JCUZvbnQgZGlzcG9zZUZvbnQgPSBzY2FsZWRGb250OwotCQlzY2FsZWRGb250ID0gbnVsbDsKLQkJc3VwZXIuYnJpbmdEb3duKCk7Ci0JCWlmIChkaXNwb3NlRm9udCAhPSBudWxsKQotCQkJZGlzcG9zZUZvbnQuZGlzcG9zZSgpOwotCQlpZiAoY2hlY2spIHsKLQkJCU5hbWVkTm9kZSBub2RlID0gKE5hbWVkTm9kZSkgZ2V0RWRpdFBhcnQoKS5nZXRNb2RlbCgpOwotCQkJU3RyaW5nIG5hbWUgPSBub2RlLmdldE5hbWUoKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkJT2JqZWN0IHdiZWxlbWVudCA9IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJaWYgKHdiZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkmJiBQcm9jZXNzVXRpbAotCQkJCQkJCQkuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoKEJyZWFrZG93bkVsZW1lbnQpIHdiZWxlbWVudCkpIHsKLQkJCQkJbmFtZSA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKEJyZWFrZG93bkVsZW1lbnQpIHdiZWxlbWVudCk7Ci0JCQkJfQotCi0JCQl9Ci0JCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlEaXNwbGF5Ci0JCQkJCQkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuYXN5bmNFeGVjKAotCQkJCQkJCQluZXcgUHJvbXB0RWRpdCgKLQkJCQkJCQkJCQkoTmFtZWROb2RlRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCksCi0JCQkJCQkJCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLmVycl9uYW1lX2VtcHR5KSk7IAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjaW5pdENlbGxFZGl0b3IoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDZWxsRWRpdG9yKCkgewotCQlUZXh0Q2VsbEVkaXRvciBlZGl0b3IgPSAoVGV4dENlbGxFZGl0b3IpIGdldENlbGxFZGl0b3IoKTsKLQkJZWRpdG9yLnNldFN0eWxlKFNXVC5NVUxUSSk7Ci0JCVRleHQgdCA9IChUZXh0KSBlZGl0b3IuZ2V0Q29udHJvbCgpOwotCQl2ZXJpZnlMaXN0ZW5lciA9IG5ldyBWZXJpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCQlUZXh0IHRleHQgPSAoVGV4dCkgZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLQkJCQlTdHJpbmcgb2xkVGV4dCA9IHRleHQuZ2V0VGV4dCgpOwotCQkJCVN0cmluZyBsZWZ0VGV4dCA9IG9sZFRleHQuc3Vic3RyaW5nKDAsIGV2ZW50LnN0YXJ0KTsKLQkJCQlTdHJpbmcgcmlnaHRUZXh0ID0gb2xkVGV4dC5zdWJzdHJpbmcoZXZlbnQuZW5kLCBvbGRUZXh0Ci0JCQkJCQkubGVuZ3RoKCkpOwotCQkJCUdDIGdjID0gbmV3IEdDKHRleHQpOwotCQkJCVBvaW50IHNpemUgPSBnYy50ZXh0RXh0ZW50KGxlZnRUZXh0ICsgZXZlbnQudGV4dCArIHJpZ2h0VGV4dCk7Ci0JCQkJZ2MuZGlzcG9zZSgpOwotCQkJCWlmIChzaXplLnggIT0gMCkKLQkJCQkJc2l6ZSA9IHRleHQuY29tcHV0ZVNpemUoc2l6ZS54LCBTV1QuREVGQVVMVCk7Ci0JCQkJZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKS5zZXRTaXplKHNpemUueCwgc2l6ZS55KTsKLQkJCX0KLQkJfTsKLQkJdC5hZGRWZXJpZnlMaXN0ZW5lcih2ZXJpZnlMaXN0ZW5lcik7Ci0JCVN0cmluZyBpbml0aWFsTGFiZWxUZXh0ID0gKChOYW1lZE5vZGVFZGl0UGFydCkgdGhpcy5nZXRFZGl0UGFydCgpKQotCQkJCS5nZXREaXJlY3RFZGl0VGV4dCgpOwotCQllZGl0b3Iuc2V0VmFsdWUoaW5pdGlhbExhYmVsVGV4dCk7Ci0JCXQuc2V0Rm9udChUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlQpOwotCQl0LnNlbGVjdEFsbCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI3VuaG9va0xpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdW5ob29rTGlzdGVuZXJzKCkgewotCQlzdXBlci51bmhvb2tMaXN0ZW5lcnMoKTsKLQkJaWYgKGdldENlbGxFZGl0b3IoKSAhPSBudWxsKSB7Ci0JCQlUZXh0IHRleHQgPSAoVGV4dCkgZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLQkJCWlmICh2ZXJpZnlMaXN0ZW5lciAhPSBudWxsKQotCQkJCXRleHQucmVtb3ZlVmVyaWZ5TGlzdGVuZXIodmVyaWZ5TGlzdGVuZXIpOwotCQkJdmVyaWZ5TGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB0ZXh0IGlzIHZhbGlkLiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gdHh0Ci0JICogQHJldHVybiBudWxsIGlmIHRoZSBnaXZlbiB0ZXh0IGlzIHZhbGlkLCBhbiBlcnJvciBtZXNzYWdlIG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHR4dCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNjb21taXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbW1pdCgpIHsKLQkJU3RyaW5nIG1zZyA9IHZhbGlkYXRlKChTdHJpbmcpIGdldENlbGxFZGl0b3IoKS5nZXRWYWx1ZSgpKTsKLQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQlicmluZ0Rvd24oZmFsc2UpOwotCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKAotCQkJCQluZXcgUHJvbXB0RWRpdCgoTmFtZWROb2RlRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCksIG1zZykpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmNvbW1pdCgpOwotCX0KLQotCXN0YXRpYyBjbGFzcyBQcm9tcHRFZGl0IGltcGxlbWVudHMgUnVubmFibGUgewotCi0JCXByaXZhdGUgTmFtZWROb2RlRWRpdFBhcnQgcGFydDsKLQotCQlwcml2YXRlIFN0cmluZyBtc2c7Ci0KLQkJUHJvbXB0RWRpdChOYW1lZE5vZGVFZGl0UGFydCBwYXJ0LCBTdHJpbmcgbXNnKSB7Ci0JCQl0aGlzLnBhcnQgPSBwYXJ0OwotCQkJdGhpcy5tc2cgPSBtc2c7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCVN0cmluZyB0aXRsZSA9IERpYWdyYW1VSVJlc291cmNlcy5kaWFncmFtX2Vycm9yRGlhbG9nX3RpdGxlX3RleHQwOyAKLQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBtc2cpOyAKLQkJCXBhcnQucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1RvcEFuY2hvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Ub3BBbmNob3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY4MjgyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1RvcEFuY2hvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdENvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLS8qKgotICogQ29ubmVjdGlvbiBhbmNob3IgZm9yIHRvcCBvZiB0aGUgZmlndXJlLiAKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotY2xhc3MgVG9wQW5jaG9yIGV4dGVuZHMgQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yIHsKLQotCXByaXZhdGUgaW50IG9mZnNldDsKLQotCVRvcEFuY2hvcihJRmlndXJlIHNvdXJjZSwgaW50IG9mZnNldCkgewotCQlzdXBlcihzb3VyY2UpOwotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oUG9pbnQgcmVmZXJlbmNlKSB7Ci0JCVJlY3RhbmdsZSByID0gZ2V0T3duZXIoKS5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCWdldE93bmVyKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShyKTsKLQkJaW50IG9mZiA9IG9mZnNldDsKLQkJaWYgKG9mZiA9PSAtMSkKLQkJCW9mZiA9IHIud2lkdGggLyAyOwotCQlpZiAoci5jb250YWlucyhyZWZlcmVuY2UpIHx8IHIueSA8IHJlZmVyZW5jZS55KQotCQkJcmV0dXJuIHIuZ2V0Qm90dG9tTGVmdCgpLnRyYW5zbGF0ZShvZmYsIC0xKTsKLQkJZWxzZQotCQkJcmV0dXJuIHIuZ2V0VG9wTGVmdCgpLnRyYW5zbGF0ZShvZmYsIDApOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1ZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzJkMDBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuRGlhZ3JhbVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLQotLyoqCi0gKiBNYW5hZ2VzIGRpcmVjdCBlZGl0aW5nIGFuZCBjcmVhdGluZyBjZWxsIGVkaXRvciBmb3IgdGhlIHtAbGluayBMYWJlbH0KLSAqIGFuZCB2YWxpZGF0ZXMgdGhlIGlucHV0LiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXIgZXh0ZW5kcyBEaXJlY3RFZGl0TWFuYWdlciB7Ci0KLQlGb250IHNjYWxlZEZvbnQ7Ci0KLQlwcm90ZWN0ZWQgVmVyaWZ5TGlzdGVuZXIgdmVyaWZ5TGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgYWN0aXZpdHlMYWJlbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgQWN0aXZpdHlEaXJlY3RFZGl0TWFuYWdlciB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgRWRpdFBhcnQKLQkgKiBAcGFyYW0gZWRpdG9yVHlwZQotCSAqICAgICAgICAgICAgdHlwZSBvZiBlZGl0b3IKLQkgKiBAcGFyYW0gbG9jYXRvcgotCSAqICAgICAgICAgICAgdGhlIENlbGxFZGl0b3JMb2NhdG9yCi0JICovCi0JcHVibGljIFZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcihHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsCi0JCQlDbGFzcyBlZGl0b3JUeXBlLCBDZWxsRWRpdG9yTG9jYXRvciBsb2NhdG9yLCBMYWJlbCBsYWJlbCkgewotCQlzdXBlcihzb3VyY2UsIGVkaXRvclR5cGUsIGxvY2F0b3IpOwotCQlhY3Rpdml0eUxhYmVsID0gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjYnJpbmdEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBicmluZ0Rvd24oKSB7Ci0JCWJyaW5nRG93bih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNicmluZ0Rvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJyaW5nRG93bihib29sZWFuIGNoZWNrKSB7Ci0JCS8vIFRoaXMgbWV0aG9kIG1pZ2h0IGJlIHJlLWVudGVyZWQgd2hlbiBzdXBlci5icmluZ0Rvd24oKSBpcyBjYWxsZWQuCi0JCUZvbnQgZGlzcG9zZUZvbnQgPSBzY2FsZWRGb250OwotCQlzY2FsZWRGb250ID0gbnVsbDsKLQkJc3VwZXIuYnJpbmdEb3duKCk7Ci0JCWlmIChkaXNwb3NlRm9udCAhPSBudWxsKQotCQkJZGlzcG9zZUZvbnQuZGlzcG9zZSgpOwotCQlpZiAoY2hlY2spIHsKLQkJCU5hbWVkTm9kZSBub2RlID0gKE5hbWVkTm9kZSkgZ2V0RWRpdFBhcnQoKS5nZXRNb2RlbCgpOwotCQkJU3RyaW5nIG5hbWUgPSBub2RlLmdldE5hbWUoKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkJT2JqZWN0IHdiZWxlbWVudCA9IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJaWYgKHdiZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkmJiBQcm9jZXNzVXRpbAotCQkJCQkJCQkuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoKEJyZWFrZG93bkVsZW1lbnQpIHdiZWxlbWVudCkpIHsKLQkJCQkJbmFtZSA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKEJyZWFrZG93bkVsZW1lbnQpIHdiZWxlbWVudCk7Ci0JCQkJfQotCi0JCQl9Ci0JCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlEaXNwbGF5Ci0JCQkJCQkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuYXN5bmNFeGVjKAotCQkJCQkJCQluZXcgUHJvbXB0RWRpdCgKLQkJCQkJCQkJCQkoTmFtZWROb2RlRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCksCi0JCQkJCQkJCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLmVycl9uYW1lX2VtcHR5KSk7IAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjaW5pdENlbGxFZGl0b3IoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDZWxsRWRpdG9yKCkgewotCQlUZXh0IHRleHQgPSAoVGV4dCkgZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLQkJdmVyaWZ5TGlzdGVuZXIgPSBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0JCQkJU3RyaW5nIG9sZFRleHQgPSB0ZXh0LmdldFRleHQoKTsKLQkJCQlTdHJpbmcgbGVmdFRleHQgPSBvbGRUZXh0LnN1YnN0cmluZygwLCBldmVudC5zdGFydCk7Ci0JCQkJU3RyaW5nIHJpZ2h0VGV4dCA9IG9sZFRleHQuc3Vic3RyaW5nKGV2ZW50LmVuZCwgb2xkVGV4dAotCQkJCQkJLmxlbmd0aCgpKTsKLQkJCQlHQyBnYyA9IG5ldyBHQyh0ZXh0KTsKLQkJCQlQb2ludCBzaXplID0gZ2MudGV4dEV4dGVudChsZWZ0VGV4dCArIGV2ZW50LnRleHQgKyByaWdodFRleHQpOwotCQkJCWdjLmRpc3Bvc2UoKTsKLQkJCQlpZiAoc2l6ZS54ICE9IDApCi0JCQkJCXNpemUgPSB0ZXh0LmNvbXB1dGVTaXplKHNpemUueCwgU1dULkRFRkFVTFQpOwotCQkJCWdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCkuc2V0U2l6ZShzaXplLngsIHNpemUueSk7Ci0JCQl9Ci0JCX07Ci0JCXRleHQuYWRkVmVyaWZ5TGlzdGVuZXIodmVyaWZ5TGlzdGVuZXIpOwotCi0JCVN0cmluZyBpbml0aWFsTGFiZWxUZXh0ID0gYWN0aXZpdHlMYWJlbC5nZXRUZXh0KCk7Ci0JCWdldENlbGxFZGl0b3IoKS5zZXRWYWx1ZShpbml0aWFsTGFiZWxUZXh0KTsKLQkJSUZpZ3VyZSBmaWd1cmUgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpKS5nZXRGaWd1cmUoKTsKLQkJc2NhbGVkRm9udCA9IGZpZ3VyZS5nZXRGb250KCk7Ci0JCUZvbnREYXRhIGRhdGEgPSBzY2FsZWRGb250LmdldEZvbnREYXRhKClbMF07Ci0JCURpbWVuc2lvbiBmb250U2l6ZSA9IG5ldyBEaW1lbnNpb24oMCwgZGF0YS5nZXRIZWlnaHQoKSk7Ci0JCWFjdGl2aXR5TGFiZWwudHJhbnNsYXRlVG9BYnNvbHV0ZShmb250U2l6ZSk7Ci0JCWRhdGEuc2V0SGVpZ2h0KGZvbnRTaXplLmhlaWdodCk7Ci0JCXNjYWxlZEZvbnQgPSBuZXcgRm9udChudWxsLCBkYXRhKTsKLQotCQl0ZXh0LnNldEZvbnQoc2NhbGVkRm9udCk7Ci0JCXRleHQuc2VsZWN0QWxsKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjdW5ob29rTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1bmhvb2tMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnVuaG9va0xpc3RlbmVycygpOwotCQlpZiAoZ2V0Q2VsbEVkaXRvcigpICE9IG51bGwpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCQkJdGV4dC5yZW1vdmVWZXJpZnlMaXN0ZW5lcih2ZXJpZnlMaXN0ZW5lcik7Ci0JCQl2ZXJpZnlMaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSB0eHQKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQsIGFuIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2NvbW1pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tbWl0KCkgewotCQlTdHJpbmcgbXNnID0gdmFsaWRhdGUoKFN0cmluZykgZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCkpOwotCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCWJyaW5nRG93bihmYWxzZSk7Ci0JCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoCi0JCQkJCW5ldyBQcm9tcHRFZGl0KChOYW1lZE5vZGVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSwgbXNnKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuY29tbWl0KCk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFByb21wdEVkaXQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLQkJcHJpdmF0ZSBOYW1lZE5vZGVFZGl0UGFydCBwYXJ0OwotCi0JCXByaXZhdGUgU3RyaW5nIG1zZzsKLQotCQlQcm9tcHRFZGl0KE5hbWVkTm9kZUVkaXRQYXJ0IHBhcnQsIFN0cmluZyBtc2cpIHsKLQkJCXRoaXMucGFydCA9IHBhcnQ7Ci0JCQl0aGlzLm1zZyA9IG1zZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU3RyaW5nIHRpdGxlID0gRGlhZ3JhbVVJUmVzb3VyY2VzLmRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA7IAotCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZyk7IAotCQkJcGFydC5wZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgwZTM4My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1ZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuRGlhZ3JhbVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLQotLyoqCi0gKiBNYW5hZ2VzIGRpcmVjdCBlZGl0aW5nIGFuZCBjcmVhdGluZyBjZWxsIGVkaXRvciBmb3IgdGhlIHtAbGluayBMYWJlbH0KLSAqIGFuZCB2YWxpZGF0ZXMgdGhlIGlucHV0LiAKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXIgZXh0ZW5kcyBEaXJlY3RFZGl0TWFuYWdlciB7Ci0KLQlGb250IHNjYWxlZEZvbnQ7Ci0KLQlwcm90ZWN0ZWQgVmVyaWZ5TGlzdGVuZXIgdmVyaWZ5TGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgYWN0aXZpdHlMYWJlbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgQWN0aXZpdHlEaXJlY3RFZGl0TWFuYWdlciB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgRWRpdFBhcnQKLQkgKiBAcGFyYW0gZWRpdG9yVHlwZQotCSAqICAgICAgICAgICAgdHlwZSBvZiBlZGl0b3IKLQkgKiBAcGFyYW0gbG9jYXRvcgotCSAqICAgICAgICAgICAgdGhlIENlbGxFZGl0b3JMb2NhdG9yCi0JICovCi0JcHVibGljIFZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwKLQkJCUNsYXNzIGVkaXRvclR5cGUsIENlbGxFZGl0b3JMb2NhdG9yIGxvY2F0b3IsIExhYmVsIGxhYmVsKSB7Ci0JCXN1cGVyKHNvdXJjZSwgZWRpdG9yVHlwZSwgbG9jYXRvcik7Ci0JCWFjdGl2aXR5TGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNicmluZ0Rvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJyaW5nRG93bigpIHsKLQkJYnJpbmdEb3duKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKGJvb2xlYW4gY2hlY2spIHsKLQkJLy8gVGhpcyBtZXRob2QgbWlnaHQgYmUgcmUtZW50ZXJlZCB3aGVuIHN1cGVyLmJyaW5nRG93bigpIGlzIGNhbGxlZC4KLQkJRm9udCBkaXNwb3NlRm9udCA9IHNjYWxlZEZvbnQ7Ci0JCXNjYWxlZEZvbnQgPSBudWxsOwotCQlzdXBlci5icmluZ0Rvd24oKTsKLQkJaWYgKGRpc3Bvc2VGb250ICE9IG51bGwpCi0JCQlkaXNwb3NlRm9udC5kaXNwb3NlKCk7Ci0JCWlmIChjaGVjaykgewotCQkJR3JhcGhOb2RlIG5vZGUgPSAoKE5vZGUpIGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKSkuZ2V0R3JhcGhOb2RlKCk7Ci0JCQlTdHJpbmcgbmFtZSA9ICgoUHJvcGVydHkpIG5vZGUuZ2V0UHJvcGVydHkoKS5nZXQoMCkpLmdldFZhbHVlKCk7Ci0JCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlEaXNwbGF5Ci0JCQkJCQkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuYXN5bmNFeGVjKAotCQkJCQkJCQluZXcgUHJvbXB0RWRpdCgKLQkJCQkJCQkJCQkoTm9kZUVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpLAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl92YWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQpKTsgCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNpbml0Q2VsbEVkaXRvcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENlbGxFZGl0b3IoKSB7Ci0JCVRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCQl2ZXJpZnlMaXN0ZW5lciA9IG5ldyBWZXJpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCQlUZXh0IHRleHQgPSAoVGV4dCkgZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLQkJCQlTdHJpbmcgb2xkVGV4dCA9IHRleHQuZ2V0VGV4dCgpOwotCQkJCVN0cmluZyBsZWZ0VGV4dCA9IG9sZFRleHQuc3Vic3RyaW5nKDAsIGV2ZW50LnN0YXJ0KTsKLQkJCQlTdHJpbmcgcmlnaHRUZXh0ID0gb2xkVGV4dC5zdWJzdHJpbmcoZXZlbnQuZW5kLCBvbGRUZXh0Ci0JCQkJCQkubGVuZ3RoKCkpOwotCQkJCUdDIGdjID0gbmV3IEdDKHRleHQpOwotCQkJCVBvaW50IHNpemUgPSBnYy50ZXh0RXh0ZW50KGxlZnRUZXh0ICsgZXZlbnQudGV4dCArIHJpZ2h0VGV4dCk7Ci0JCQkJZ2MuZGlzcG9zZSgpOwotCQkJCWlmIChzaXplLnggIT0gMCkKLQkJCQkJc2l6ZSA9IHRleHQuY29tcHV0ZVNpemUoc2l6ZS54LCBTV1QuREVGQVVMVCk7Ci0JCQkJZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKS5zZXRTaXplKHNpemUueCwgc2l6ZS55KTsKLQkJCX0KLQkJfTsKLQkJdGV4dC5hZGRWZXJpZnlMaXN0ZW5lcih2ZXJpZnlMaXN0ZW5lcik7Ci0KLQkJU3RyaW5nIGluaXRpYWxMYWJlbFRleHQgPSBhY3Rpdml0eUxhYmVsLmdldFRleHQoKTsKLQkJZ2V0Q2VsbEVkaXRvcigpLnNldFZhbHVlKGluaXRpYWxMYWJlbFRleHQpOwotCQl0ZXh0LnNlbGVjdEFsbCgpOwotCQlJRmlndXJlIGZpZ3VyZSA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCkpLmdldEZpZ3VyZSgpOwotCQlzY2FsZWRGb250ID0gZmlndXJlLmdldEZvbnQoKTsKLQkJRm9udERhdGEgZGF0YSA9IHNjYWxlZEZvbnQuZ2V0Rm9udERhdGEoKVswXTsKLQkJRGltZW5zaW9uIGZvbnRTaXplID0gbmV3IERpbWVuc2lvbigwLCBkYXRhLmdldEhlaWdodCgpKTsKLQkJYWN0aXZpdHlMYWJlbC50cmFuc2xhdGVUb0Fic29sdXRlKGZvbnRTaXplKTsKLQkJZGF0YS5zZXRIZWlnaHQoZm9udFNpemUuaGVpZ2h0KTsKLQkJc2NhbGVkRm9udCA9IG5ldyBGb250KG51bGwsIGRhdGEpOwotCi0JCXRleHQuc2V0Rm9udChzY2FsZWRGb250KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciN1bmhvb2tMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVuaG9va0xpc3RlbmVycygpIHsKLQkJc3VwZXIudW5ob29rTGlzdGVuZXJzKCk7Ci0JCWlmIChnZXRDZWxsRWRpdG9yKCkgIT0gbnVsbCkgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0JCQl0ZXh0LnJlbW92ZVZlcmlmeUxpc3RlbmVyKHZlcmlmeUxpc3RlbmVyKTsKLQkJCXZlcmlmeUxpc3RlbmVyID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gdGV4dCBpcyB2YWxpZC4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIHR4dAotCSAqIEByZXR1cm4gbnVsbCBpZiB0aGUgZ2l2ZW4gdGV4dCBpcyB2YWxpZCwgYW4gZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjY29tbWl0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21taXQoKSB7Ci0JCVN0cmluZyBtc2cgPSB2YWxpZGF0ZSgoU3RyaW5nKSBnZXRDZWxsRWRpdG9yKCkuZ2V0VmFsdWUoKSk7Ci0JCWlmIChtc2cgIT0gbnVsbCkgewotCQkJYnJpbmdEb3duKGZhbHNlKTsKLQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYygKLQkJCQkJbmV3IFByb21wdEVkaXQoKE5hbWVkTm9kZUVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpLCBtc2cpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5jb21taXQoKTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgUHJvbXB0RWRpdCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQotCQlwcml2YXRlIE5vZGVFZGl0UGFydCBwYXJ0OwotCi0JCXByaXZhdGUgU3RyaW5nIG1zZzsKLQotCQlQcm9tcHRFZGl0KE5vZGVFZGl0UGFydCBwYXJ0LCBTdHJpbmcgbXNnKSB7Ci0JCQl0aGlzLnBhcnQgPSBwYXJ0OwotCQkJdGhpcy5tc2cgPSBtc2c7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCVN0cmluZyB0aXRsZSA9IERpYWdyYW1VSVJlc291cmNlcy5kaWFncmFtX2Vycm9yRGlhbG9nX3RpdGxlX3RleHQwOyAKLQkJCVN0cmluZyBwcm9ibGVtID0gRGlhZ3JhbVVJUmVzb3VyY2VzLmRpYWdyYW1fbm9kZV9wcm9wZXJ0eV92YWx1ZV9wcm9ibGVtX21zZzsgCi0JCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpOwotCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgcHJvYmxlbSwgbXNnKTsgCi0JCQlwYXJ0LnBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9XUERpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV1BEaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNDc3ZjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9XUERpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci0KLS8qKgotICogRmFjdG9yeSBmb3IgV29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbS4gU3VwcG9ydCBjcmVhdGlvbiAKLSAqIG9mIGNoaWxkIGVkaXRwYXJ0IGluIFdvcmtQUm9kdWN0IGRlcGVuZGVuY3kgZGlhZ3JhbS4gCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV1BEaWFncmFtRWRpdFBhcnRGYWN0b3J5IGltcGxlbWVudHMgRWRpdFBhcnRGYWN0b3J5IHsKLQotCXB1YmxpYyBXUERpYWdyYW1FZGl0UGFydEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5I2NyZWF0ZUVkaXRQYXJ0KEVkaXRQYXJ0LCBPYmplY3QpCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KEVkaXRQYXJ0IGNvbnRleHQsIE9iamVjdCBtb2RlbCkgewotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQlyZXR1cm4gbmV3IERpYWdyYW1FZGl0UGFydCgoRGlhZ3JhbSkgbW9kZWwpOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgV29ya1Byb2R1Y3ROb2RlKSB7Ci0JCQlyZXR1cm4gbmV3IFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0KChOYW1lZE5vZGUpIG1vZGVsKTsKLQkJfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIExpbmspIHsKLQkJCXJldHVybiBuZXcgTGlua0VkaXRQYXJ0KChMaW5rKSBtb2RlbCk7Ci0JCX0KLQkJLy8gdHlwZWQgbm9kZSBjcmVhdGlvbgotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCVR5cGVkTm9kZSBub2RlID0gKFR5cGVkTm9kZSkgbW9kZWw7Ci0JCQlzd2l0Y2ggKG5vZGUuZ2V0VHlwZSgpKSB7Ci0JCQljYXNlIFR5cGVkTm9kZS5TVEFSVDoKLQkJCQlyZXR1cm4gbmV3IFN0YXJ0Tm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuRU5EOgotCQkJCXJldHVybiBuZXcgRW5kTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuREVDSVNJT046Ci0JCQkJcmV0dXJuIG5ldyBEZWNpc2lvbk5vZGVFZGl0UGFydChub2RlKTsKLQkJCWNhc2UgVHlwZWROb2RlLlNZTkNIX0JBUjoKLQkJCQlyZXR1cm4gbmV3IFN5bmNoQmFyTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuRlJFRV9URVhUOgotCQkJCXJldHVybiBuZXcgRnJlZVRleHROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dQTm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dQTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OTFlYmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9XUE5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuU2VsZWN0YWJsZUxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuV1BDb21wYXJ0bWVudEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAZGVwcmVjYXRlZCAKLSAqIEBzZWUgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQKLSAqLwotcHVibGljIGNsYXNzIFdQTm9kZUVkaXRQYXJ0IGV4dGVuZHMgTmFtZWROb2RlRWRpdFBhcnQgewotCi0JaW50IHR5cGUgPSAxOwotCi0JcHVibGljIFdQTm9kZUVkaXRQYXJ0KE5hbWVkTm9kZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlpZiAoZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Tm9kZSkgewotCQkJdHlwZSA9ICgoV29ya1Byb2R1Y3ROb2RlKSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCX0KLQkJTGFiZWwgbCA9IG5ldyBTZWxlY3RhYmxlTGFiZWwoKTsKLQkJbC5zZXRMYWJlbEFsaWdubWVudChQb3NpdGlvbkNvbnN0YW50cy5MRUZUKTsKLQkJbC5zZXRUZXh0UGxhY2VtZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsKLQkJbC5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMud2hpdGUpOwotCQlGb250IGZvbnQgPSBuZXcgRm9udChudWxsLCAiQXJpYWwiLCA5LCBTV1QuTk9STUFMKTsgLy8kTk9OLU5MUy0xJAotCQlsLnNldEZvbnQoZm9udCk7Ci0JCWlmICh0eXBlID09IDEpCi0JCQlsLnNldEljb24oSW1hZ2VzLkFSVElGQUNUKTsKLQkJZWxzZSBpZiAodHlwZSA9PSAyKQotCQkJbC5zZXRJY29uKEltYWdlcy5ERUxJVkVSQUJMRSk7Ci0JCWVsc2UgaWYgKHR5cGUgPT0gMykKLQkJCWwuc2V0SWNvbihJbWFnZXMuT1VUQ09NRSk7Ci0JCWVsc2UKLQkJCWwuc2V0SWNvbihJbWFnZXMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1IpOwotCQlsLnNldEljb25UZXh0R2FwKDUpOwotCi0JCVdQQ29tcGFydG1lbnRGaWd1cmUgd3BmaWd1cmUgPSBuZXcgV1BDb21wYXJ0bWVudEZpZ3VyZShsLCB0eXBlKTsKLQkJcmV0dXJuIHdwZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5CYXNlRWRpdFBhcnQjY3JlYXRlRGlyZWN0RWRpdE1hbmFnZXIoKQotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBjcmVhdGVEaXJlY3RFZGl0TWFuYWdlcigpIHsKLQkJTGFiZWwgbCA9IChMYWJlbCkgKCgoV1BDb21wYXJ0bWVudEZpZ3VyZSkgZ2V0RmlndXJlKCkpLmdldExhYmVsKCkpOwotCQlyZXR1cm4gbmV3IFZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0Q2VsbEVkaXRvci5jbGFzcywKLQkJCQluZXcgTGFiZWxUZXh0Q2VsbEVkaXRvckxvY2F0b3IobCksIGwpIHsKLQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHR4dCkgewotCQkJCU9iamVjdCBvYmogPSBnZXRFZGl0UGFydCgpLmdldE1vZGVsKCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Tm9kZSkgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqOwotCQkJCQlPYmplY3QgZSA9IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gbm9kZS5nZXREaWFncmFtKCkuZ2V0U3VwcHJlc3Npb24oKTsKLQkJCQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tXb3JrUHJvZHVjdERlc2NyaXB0b3JQcmVzZW50YXRpb25OYW1lKAotCQkJCQkJCWUsIHR4dCwgc3VwcHJlc3Npb24pOwotCQkJCX0KLQotCQkJCXJldHVybiBzdXBlci52YWxpZGF0ZSh0eHQpOwotCQkJfQotCQl9OwotCX0KLQotCUlGaWd1cmUgZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpIHsKLQkJcmV0dXJuICgoKFdQQ29tcGFydG1lbnRGaWd1cmUpIGdldEZpZ3VyZSgpKS5nZXRMYWJlbCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE5YmU3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkFjdGl2aXR5RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuVGV4dEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBDb21tb24gZWRpdHBhcnQgZm9yIGRpZmZlcmVudCB7QGxpbmsgRGVzY3JpcHRvcn0KLSAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIHdvcmQtd3JhcCBvZiBlZGl0cGFydCdzIG9iamVjdCBuYW1lLiAKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUVkaXRQYXJ0IGV4dGVuZHMgTmFtZWROb2RlRWRpdFBhcnQgewotCi0JcHVibGljIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUVkaXRQYXJ0KE5hbWVkTm9kZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5hbWVkTm9kZUVkaXRQYXJ0I2dldEltYWdlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCUltYWdlIGltZyA9IG51bGw7Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSBnZXRNb2RlbCgpOwotCQlPYmplY3Qgb2JqID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFBoYXNlKSB7Ci0JCQlpbWcgPSBJbWFnZXMuUEhBU0U7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSXRlcmF0aW9uKSB7Ci0JCQlpbWcgPSBJbWFnZXMuSVRFUkFUSU9OOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlpbWcgPSBJbWFnZXMuQUNUSVZJVFk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCWltZyA9IEltYWdlcy5UQVNLX0RFU0NSSVBUT1I7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQlpbWcgPSBJbWFnZXMuTUlMRVNUT05FOwotCQl9Ci0JCXJldHVybiBpbWc7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlBY3Rpdml0eUZpZ3VyZSBmaWd1cmUgPSBuZXcgQWN0aXZpdHlGaWd1cmUoKTsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZSgpOwotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJZmlndXJlLmFkZChpbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0RGlyZWN0RWRpdFRleHQoKSB7Ci0JCVRleHRGaWd1cmUgbm90ZSA9IChUZXh0RmlndXJlKSBnZXRGaWd1cmUoKTsKLQkJcmV0dXJuIG5vdGUuZ2V0VGV4dCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlJRmlndXJlIGZpZyA9IGdldERpcmVjdEVkaXRGaWd1cmUoKTsKLQkJaWYgKGZpZyBpbnN0YW5jZW9mIEFjdGl2aXR5RmlndXJlKSB7Ci0JCQlBY3Rpdml0eUZpZ3VyZSBsID0gKEFjdGl2aXR5RmlndXJlKSBmaWc7Ci0JCQlmaWcuc2V0Rm9yZWdyb3VuZENvbG9yKGdldEZvcmVncm91bmRDb2xvcigpKTsKLQkJCVN0cmluZyB0ZXh0OwotCQkJLy8gQmVsb3cgY2hlY2sgaXMgcmVxdWlyZWQgZm9yIEV4dGVuZGVkIEFjdGl2aXR5IHByZXNlbnRhdGlvbiBuYW1lCi0JCQkvLyBzaG91bGQgYmUgdXNlZCBmcm9tIGJhc2UuCi0JCQlpZiAoZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBub2RlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgZ2V0TW9kZWwoKTsKLQkJCQlPYmplY3Qgd2JlbGVtZW50ID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQlpZiAod2JlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCSYmIFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZygoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KSkgewotCQkJCQl0ZXh0ID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXRleHQgPSAoKE5hbWVkTm9kZSkgZ2V0TW9kZWwoKSkuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXRleHQgPSAoKE5hbWVkTm9kZSkgZ2V0TW9kZWwoKSkuZ2V0TmFtZSgpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlpZiAoZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydAotCQkJCQkJfHwgZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgewotCQkJCQlpbnQgdyA9IFdSQVBfV0lEVEg7Ci0JCQkJCWlmICh0aGlzLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKQotCQkJCQkJdyA9IFdPUktfUFJPRFVDVF9XUkFQX1dJRFRIOwotCQkJCQl0ZXh0ID0gd3JhcCh0ZXh0LCB3KTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7Ci0JCQl9Ci0JCQlsLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbG9yIGdldEZvcmVncm91bmRDb2xvcigpIHsKLQkJTmFtZWROb2RlIG5vZGUgPSAoTmFtZWROb2RlKSBnZXRNb2RlbCgpOwotCQlpZiAobm9kZS5pc1N1cHByZXNzZWQoKSkgewotCQkJcmV0dXJuIENvbG9ycy5TVVBSRVNTRURfRUxFTUVOVF9MQUJFTDsKLQkJfQotCQlpZiAobm9kZS5pc1JlYWRPbmx5KCkpIHsKLQkJCXJldHVybiBDb2xvcnMuSU5IRVJJVEVEX0VMRU1FTlRfTEFCRUw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gQ29sb3JDb25zdGFudHMuYmxhY2s7Ci0JCX0KLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkJhc2VFZGl0UGFydCNjcmVhdGVEaXJlY3RFZGl0TWFuYWdlcigpCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGNyZWF0ZURpcmVjdEVkaXRNYW5hZ2VyKCkgewotCQlyZXR1cm4gbmV3IFRleHRGaWd1cmVEaXJlY3RFZGl0TWFuYWdlcigoR3JhcGhpY2FsRWRpdFBhcnQpIHRoaXMsCi0JCQkJVGV4dENlbGxFZGl0b3IuY2xhc3MsIG5ldyBUZXh0RmlndXJlQ2VsbEVkaXRvckxvY2F0b3IoCi0JCQkJCQkoVGV4dEZpZ3VyZSkgZ2V0RmlndXJlKCkpLCAoVGV4dEZpZ3VyZSkgZ2V0RmlndXJlKCkpIHsKLQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHR4dCkgewotCQkJCU9iamVjdCBvYmogPSBnZXRFZGl0UGFydCgpLmdldE1vZGVsKCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgbm9kZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIG9iajsKLQkJCQkJT2JqZWN0IGUgPSBub2RlLmdldE9iamVjdCgpOwotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlyZXR1cm4gVG5nVXRpbC5jaGVja1dCU0FjdGl2aXR5UHJlc2VudGF0aW9uTmFtZShlLCB0eHQsIG5vZGUuZ2V0RGlhZ3JhbSgpLmdldFN1cHByZXNzaW9uKCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcmV0dXJuIFRuZ1V0aWwKLQkJCQkJCQkJLmNoZWNrV29ya0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKGUsCi0JCQkJCQkJCQkJdHh0LCBub2RlLmdldERpYWdyYW0oKS5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiBzdXBlci52YWxpZGF0ZSh0eHQpOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUxYzZmZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNob3Bib3hBbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmxvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ3JlYXRlTGlua0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuUmVjb25uZWN0TGlua0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5Db25uZWN0aW9uQW5jaG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQ29ubmVjdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVDb25uZWN0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuUmVjb25uZWN0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQgaXMgY29udGFpbmVyIHdpdGgge0BsaW5rIEZsb3dMYXlvdXR9LCBhbmQgZG9lcyBub3Qgc3VwcG9ydCBhZGRpbmcvcmVtb3ZpbmcgY2hpbGQgZWRpdHBhcnQuCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0IGV4dGVuZHMgTm9kZUNvbnRhaW5lckVkaXRQYXJ0Ci0JCWltcGxlbWVudHMgTm9kZUVkaXRQYXJ0IHsKLQotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sb3IgQkdfQ09MT1IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIDI1NSwKLQkvLwkJMjU1LCAyMDUpOwotCXByaXZhdGUgc3RhdGljIENvbG9yIEJHX0NPTE9SOwotCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQoV29ya1Byb2R1Y3RDb21wb3NpdGUgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJRmlndXJlIGZpZ3VyZSA9IG5ldyBGaWd1cmUoKTsKLQkJRmxvd0xheW91dCBsYXlvdXQgPSBuZXcgRmxvd0xheW91dCgpOwotCQlsYXlvdXQuc2V0TWlub3JTcGFjaW5nKDIwKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJZmlndXJlLnNldEJvcmRlcihuZXcgUmFpc2VkTWFyZ2luQm9yZGVyKCkpOwotCQlmaWd1cmUuc2V0QmFja2dyb3VuZENvbG9yKGdldEJhY2tncm91bmRDb2xvcigpKTsKLQkJZmlndXJlLnNldE9wYXF1ZSh0cnVlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUNvbnRhaW5lckVkaXRQYXJ0I2hhbmRsZVByb3BlcnR5Q2hhbmdlZChOb3RpZmljYXRpb24pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE5vZGVDb250YWluZXIuY2xhc3MpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19OT0RFUzoKLQkJCXJlZnJlc2hDaGlsZHJlbigpOwotCQkJCi0JCQlhZGp1c3RTaXplKCk7Ci0JCQkKLQkJCS8vIHJlZnJlc2ggZGlhZ3JhbSdzIGNoaWxkcmVuCi0JCQlFZGl0UGFydCBkaWFncmFtRWRpdFBhcnQgPSBnZXRQYXJlbnQoKTsKLQkJCWRpYWdyYW1FZGl0UGFydC5yZWZyZXNoKCk7Ci0KLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZWQobXNnKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRqdXN0U2l6ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlMaXN0IGxpc3QgPSBnZXRDaGlsZHJlbigpOwotCQlpbnQgdEhlaWdodCA9IDIwOwotCQlpbnQgdFdpZHRoID0gMjA7Ci0JCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyl7Ci0JCQlHcmFwaGljYWxFZGl0UGFydCBlZGl0cGFydCA9IChHcmFwaGljYWxFZGl0UGFydClpdGVyYXRvci5uZXh0KCk7Ci0JCQl0SGVpZ2h0Kz1lZGl0cGFydC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJaWYodFdpZHRoIDwgZWRpdHBhcnQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoKXsKLQkJCQl0V2lkdGggPSBlZGl0cGFydC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0JCQl9Ci0JCX0KLQkJKChOb2RlKSB0aGlzLmdldE1vZGVsKCkpLnNldEhlaWdodCh0SGVpZ2h0KTsKLQkJKChOb2RlKSB0aGlzLmdldE1vZGVsKCkpLnNldFdpZHRoKHRXaWR0aCsyMCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5HUkFQSElDQUxfTk9ERV9ST0xFLAotCQkJCW5ldyBHcmFwaGljYWxOb2RlRWRpdFBvbGljeSgpIHsKLQkJCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29ubmVjdGlvbkNvbXBsZXRlQ29tbWFuZCgKLQkJCQkJCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlDcmVhdGVMaW5rQ29tbWFuZCBjbWQgPSAoQ3JlYXRlTGlua0NvbW1hbmQpIHJlcXVlc3QKLQkJCQkJCQkJLmdldFN0YXJ0Q29tbWFuZCgpOwotCQkJCQkJY21kLnNldFRhcmdldCgoTm9kZSkgZ2V0SG9zdCgpLmdldE1vZGVsKCkpOwotCi0JCQkJCQlpZiAocmVxdWVzdC5nZXRUYXJnZXRFZGl0UGFydCgpIGluc3RhbmNlb2YgQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHsKLQkJCQkJCQlpZiAocmVxdWVzdC5nZXRUYXJnZXRFZGl0UGFydCgpLmVxdWFscygKLQkJCQkJCQkJCXJlcXVlc3QuZ2V0U291cmNlRWRpdFBhcnQoKSkpIHsKLQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWNtZAotCQkJCQkJCQkJCS5zZXRUYXJnZXRFbmRQb2ludCgoKENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSByZXF1ZXN0Ci0JCQkJCQkJCQkJCQkuZ2V0VGFyZ2V0RWRpdFBhcnQoKSkKLQkJCQkJCQkJCQkJCS5nZXRMb2NhdGlvbihyZXF1ZXN0Ci0JCQkJCQkJCQkJCQkJCS5nZXRMb2NhdGlvbigpKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlyZXR1cm4gY21kOwotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29ubmVjdGlvbkNyZWF0ZUNvbW1hbmQoCi0JCQkJCQkJQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJQ3JlYXRlTGlua0NvbW1hbmQgY21kID0gbmV3IENyZWF0ZUxpbmtDb21tYW5kKAotCQkJCQkJCQlNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmsoKSwKLQkJCQkJCQkJKE5vZGUpIGdldEhvc3QoKS5nZXRNb2RlbCgpKTsKLQkJCQkJCWlmIChyZXF1ZXN0LmdldFRhcmdldEVkaXRQYXJ0KCkgaW5zdGFuY2VvZiBDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgewotCQkJCQkJCWNtZAotCQkJCQkJCQkJLnNldFNvdXJjZUVuZFBvaW50KCgoQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHJlcXVlc3QKLQkJCQkJCQkJCQkJLmdldFRhcmdldEVkaXRQYXJ0KCkpCi0JCQkJCQkJCQkJCS5nZXRMb2NhdGlvbihyZXF1ZXN0LmdldExvY2F0aW9uKCkpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY21kLnNldFNvdXJjZUVuZFBvaW50KHJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXF1ZXN0LnNldFN0YXJ0Q29tbWFuZChjbWQpOwotCi0JCQkJCQlyZXR1cm4gY21kOwotCi0JCQkJCX0KLQotCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZWNvbm5lY3RTb3VyY2VDb21tYW5kKAotCQkJCQkJCVJlY29ubmVjdFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJTGluayBsaW5rID0gKExpbmspIHJlcXVlc3QuZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KCkKLQkJCQkJCQkJLmdldE1vZGVsKCk7Ci0JCQkJCQlSZWNvbm5lY3RMaW5rQ29tbWFuZCBjbWQgPSBuZXcgUmVjb25uZWN0TGlua0NvbW1hbmQoCi0JCQkJCQkJCWxpbmssIChOb2RlKSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSwgdHJ1ZSk7Ci0JCQkJCQlpZiAocmVxdWVzdC5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSB7Ci0JCQkJCQkJY21kLnNldEVuZFBvaW50KCgoQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHJlcXVlc3QKLQkJCQkJCQkJCS5nZXRUYXJnZXQoKSkuZ2V0TG9jYXRpb24ocmVxdWVzdAotCQkJCQkJCQkJLmdldExvY2F0aW9uKCkpKTsKLQkJCQkJCX0KLQotCQkJCQkJcmV0dXJuIGNtZDsKLQkJCQkJfQotCi0JCQkJCXByb3RlY3RlZCBDb21tYW5kIGdldFJlY29ubmVjdFRhcmdldENvbW1hbmQoCi0JCQkJCQkJUmVjb25uZWN0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgcmVxdWVzdC5nZXRDb25uZWN0aW9uRWRpdFBhcnQoKQotCQkJCQkJCQkuZ2V0TW9kZWwoKTsKLQkJCQkJCVJlY29ubmVjdExpbmtDb21tYW5kIGNtZCA9IG5ldyBSZWNvbm5lY3RMaW5rQ29tbWFuZCgKLQkJCQkJCQkJbGluaywgKE5vZGUpIGdldEhvc3QoKS5nZXRNb2RlbCgpLCBmYWxzZSk7Ci0JCQkJCQlpZiAocmVxdWVzdC5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSB7Ci0JCQkJCQkJY21kLnNldEVuZFBvaW50KCgoQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHJlcXVlc3QKLQkJCQkJCQkJCS5nZXRUYXJnZXQoKSkuZ2V0TG9jYXRpb24ocmVxdWVzdAotCQkJCQkJCQkJLmdldExvY2F0aW9uKCkpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBjbWQ7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgbnVsbCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09NUE9ORU5UX1JPTEUsIG51bGwpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoCi0JCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubmVjdGlvbikgewotCQlyZXR1cm4gbmV3IENob3Bib3hBbmNob3IoZ2V0RmlndXJlKCkpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXJldHVybiBuZXcgQ2hvcGJveEFuY2hvcihnZXRGaWd1cmUoKSk7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcigKLQkJCUNvbm5lY3Rpb25FZGl0UGFydCBjb25uZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgQ2hvcGJveEFuY2hvcihnZXRGaWd1cmUoKSk7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcihSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJcmV0dXJuIG5ldyBDaG9wYm94QW5jaG9yKGdldEZpZ3VyZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbFNvdXJjZUNvbm5lY3Rpb25zKCkgewotCQlyZXR1cm4gZ2V0Tm9kZSgpLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbFRhcmdldENvbm5lY3Rpb25zKCkgewotCQlyZXR1cm4gZ2V0Tm9kZSgpLmdldEluY29taW5nQ29ubmVjdGlvbnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBnZXROb2RlKCkgewotCQlyZXR1cm4gKE5vZGUpIGdldE1vZGVsKCk7Ci0JfQotCQotCXByb3RlY3RlZCBDb2xvciBnZXRCYWNrZ3JvdW5kQ29sb3IoKXsKLQkJaWYoQkdfQ09MT1IgIT0gbnVsbCkgcmV0dXJuIEJHX0NPTE9SOwotCQkKLQkJaWYoQkdfQ09MT1IgPT0gbnVsbCl7Ci0JCQlTdHJpbmcgY29sb3JTdHJpbmcgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5BRERfV1BfQk9YX0JHX0NPTE9SX1JHQik7Ci0JCQlpZihjb2xvclN0cmluZyAhPSBudWxsICYmIGNvbG9yU3RyaW5nLmxlbmd0aCgpID4gMCl7Ci0JCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY29sb3JTdHJpbmcsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbnQgciA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQlpbnQgZyA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQlpbnQgYiA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQlCR19DT0xPUiA9IG5ldyBDb2xvcihudWxsLCByLGcsYik7Ci0JCQkJcmV0dXJuIEJHX0NPTE9SOwotCQkJfQotCQl9Ci0JCWlmKEJHX0NPTE9SID09IG51bGwpewotCQkJQkdfQ09MT1IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIDI1NSwKLQkJCQkJCQkyNTUsIDIwNSk7Ci0JCX0KLQkJcmV0dXJuIEJHX0NPTE9SOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU3ODE1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIHtAbGluayBXb3JrUHJvZHVjdERlc2NyaXB0b3J9LgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydCBleHRlbmRzIE5hbWVkTm9kZUVkaXRQYXJ0IHsKLQotCXB1YmxpYyBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydChOYW1lZE5vZGUgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5OYW1lZE5vZGVFZGl0UGFydCNnZXRJbWFnZSgpCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkgewotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdE5vZGUpIHsKLQkJCVdvcmtQcm9kdWN0Tm9kZSBub2RlID0gKFdvcmtQcm9kdWN0Tm9kZSkgbW9kZWw7Ci0JCQlzd2l0Y2ggKG5vZGUuZ2V0VHlwZSgpKSB7Ci0JCQljYXNlIFdvcmtQcm9kdWN0Tm9kZS5BUlRJRkFDVDoKLQkJCQlyZXR1cm4gSW1hZ2VzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SXzE2OwotCQkJY2FzZSBXb3JrUHJvZHVjdE5vZGUuREVMSVZFUkFCTEU6Ci0JCQkJcmV0dXJuIEltYWdlcy5ERUxJVkVSQUJMRTsKLQkJCWNhc2UgV29ya1Byb2R1Y3ROb2RlLk9VVENPTUU6Ci0JCQkJcmV0dXJuIEltYWdlcy5PVVRDT01FOwotCQkJfQotCQkJcmV0dXJuIEltYWdlcy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl8xNjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTmFtZWROb2RlRWRpdFBhcnQjY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGNyZWF0ZURpcmVjdEVkaXRNYW5hZ2VyKCkgewotCQlMYWJlbCBsID0gKExhYmVsKSBnZXRGaWd1cmUoKTsKLQkJcmV0dXJuIG5ldyBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dENlbGxFZGl0b3IuY2xhc3MsCi0JCQkJbmV3IExhYmVsVGV4dENlbGxFZGl0b3JMb2NhdG9yKGwpLCBsKSB7Ci0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQlPYmplY3Qgb2JqID0gZ2V0RWRpdFBhcnQoKS5nZXRNb2RlbCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdE5vZGUpIHsKLQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iajsKLQkJCQkJT2JqZWN0IGUgPSBub2RlLmdldE9iamVjdCgpOwotCQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IG5vZGUuZ2V0RGlhZ3JhbSgpLmdldFN1cHByZXNzaW9uKCk7Ci0JCQkJCXJldHVybiBUbmdVdGlsLmNoZWNrV29ya1Byb2R1Y3REZXNjcmlwdG9yUHJlc2VudGF0aW9uTmFtZSgKLQkJCQkJCQllLCB0eHQsIHN1cHByZXNzaW9uKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHR4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTFmZjM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZGlzcGxheSBhbmQgZWRpdGluZyBzdXBwb3J0IGZvciB0aGUgYWN0aXZpdHkgZGlhZ3JhbXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9EaWFncmFtTGF5b3V0RWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9EaWFncmFtTGF5b3V0RWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzQ5ZGM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUxheW91dEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ2hhbmdlQm91bmRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DaGFuZ2VIZWlnaHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNyZWF0ZU5vZGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLk1vdmVCZW5kcG9pbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbnN0cmFpbmVkTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5YWUxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci0KLS8qKgotICogQW4gRWRpdFBvbGljeSBmb3IgdXNlIHdpdGggPGNvZGU+RmlndXJlczwvY29kZT4gaW4ge0BsaW5rIFhZTGF5b3V0fSBvZiBkaWFncmFtLiBUaGUgY29uc3RyYWludCBmb3IKLSAqIFhZTGF5b3V0IGlzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGV9LiBJbXBsZW1lbnRzIHRoZSBjaGFuZ2Vjb25zdHJhaW50LCBkZWxldGUsCi0gKiByZXNpemUgY29tbWFuZHMgb2Yge0BsaW5rIENvbnN0cmFpbmVkTGF5b3V0RWRpdFBvbGljeX0KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1MYXlvdXRFZGl0UG9saWN5IGV4dGVuZHMgWFlMYXlvdXRFZGl0UG9saWN5IHsKLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdFBhcnQgY2hpbGQsIE9iamVjdCBjb25zdHJhaW50KSB7Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNoYW5nZUNvbnN0cmFpbnRDb21tYW5kKEVkaXRQYXJ0IGNoaWxkLAotCQkJT2JqZWN0IGNvbnN0cmFpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ2hhbmdlQ29uc3RyYWludENvbW1hbmQoCi0JCQlDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QsIEVkaXRQYXJ0IGNoaWxkLCBPYmplY3QgY29uc3RyYWludCkgewotCQkKLQkJLy8gc3BlY2lhbCBmb3IgQURECi0JCUVkaXRQYXJ0IHBhcmVudCA9IGNoaWxkLmdldFBhcmVudCgpOwotCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCl7Ci0JCQlTdHJpbmcgYXV0b2xheW91dCA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0QXV0b0xheW91dEZsYWcoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkoTm9kZSlwYXJlbnQuZ2V0TW9kZWwoKSk7Ci0JCQlpZihhdXRvbGF5b3V0ICE9IG51bGwpewotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuY3JlYXRlUHJvcGVydHkoKChOb2RlKXBhcmVudC5nZXRNb2RlbCgpKS5nZXRHcmFwaE5vZGUoKSwKLQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0FVVE9fTEFZT1VULCAKLQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0FVVE9fTEFZT1VUX1ZBTFVFX0ZBTFNFKTsKLQkJCX0KLQkJfQotCQkKLQkJTm9kZSBub2RlID0gKE5vZGUpIGNoaWxkLmdldE1vZGVsKCk7Ci0JCWludCBkaXJlY3Rpb25zID0gcmVxdWVzdC5nZXRSZXNpemVEaXJlY3Rpb24oKTsKLQkJCi0JCWlmICgoZGlyZWN0aW9ucyAmIFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIX1NPVVRIKSAKLQkJCQk9PSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCl7Ci0JCQlQb2ludCBuZXdMb2NhdGlvbiA9IG5vZGUuZ2V0TG9jYXRpb24oKS5nZXRUcmFuc2xhdGVkKAotCQkJCQlyZXF1ZXN0LmdldE1vdmVEZWx0YSgpKTsKLQkJCWludCBuZXdIZWlnaHQgPSByZXF1ZXN0LmdldFNpemVEZWx0YSgpLmhlaWdodDsKLQkJCWlmIChuZXdIZWlnaHQgIT0gMCkgewotCQkJCW5ld0hlaWdodCArPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuaGVpZ2h0OwotCQkJCWlmIChuZXdIZWlnaHQgPCAxMCkKLQkJCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQl9IGVsc2UKLQkJCQluZXdIZWlnaHQgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuaGVpZ2h0OwotCQkJcmV0dXJuIG5ldyBDaGFuZ2VIZWlnaHRDb21tYW5kKG5vZGUsIG5ld0xvY2F0aW9uLCBuZXdIZWlnaHQpOwotCQl9Ci0JCWVsc2V7Ci0JCQkvLyBPdGhlciBkaXJlY3Rpb25zIGFyZSBFQVNUIFdFU1QuIAotCQkJUG9pbnQgbmV3TG9jYXRpb24gPSBub2RlLmdldExvY2F0aW9uKCkuZ2V0VHJhbnNsYXRlZCgKLQkJCQkJcmVxdWVzdC5nZXRNb3ZlRGVsdGEoKSk7Ci0JCQlpbnQgbmV3V2lkdGggPSByZXF1ZXN0LmdldFNpemVEZWx0YSgpLndpZHRoOwotCQkJaWYgKG5ld1dpZHRoICE9IDApIHsKLQkJCQluZXdXaWR0aCArPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JCQkJaWYgKG5ld1dpZHRoIDwgMTApCi0JCQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQkJfSBlbHNlCi0JCQkJbmV3V2lkdGggPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JCQlyZXR1cm4gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQobm9kZSwgbmV3TG9jYXRpb24sIG5ld1dpZHRoKTsKLQkJfSAKLQl9Ci0KLQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJUmVzaXphYmxlRWRpdFBvbGljeSBjaGlsZFBvbGljeSA9IG5ldyBSZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCWlmKGNoaWxkIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCB8fAotCQkJCWNoaWxkIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCl7Ci0JCQljaGlsZFBvbGljeS5zZXRSZXNpemVEaXJlY3Rpb25zKFBvc2l0aW9uQ29uc3RhbnRzLk5TRVcpOwotCQl9ZWxzZXsKLQkJCWNoaWxkUG9saWN5LnNldFJlc2l6ZURpcmVjdGlvbnMoUG9zaXRpb25Db25zdGFudHMuRUFTVF9XRVNUKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRQb2xpY3k7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlQb2ludCBsb2MgPSByZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0JCQlnZXRIb3N0RmlndXJlKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShsb2MpOwotCQkJcmV0dXJuIG5ldyBDcmVhdGVOb2RlQ29tbWFuZCgoTm9kZSkgcmVxdWVzdC5nZXROZXdPYmplY3QoKSwKLQkJCQkJKERpYWdyYW0pIGdldEhvc3QoKS5nZXRNb2RlbCgpLCBsb2MpOwotCQl9Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGdldERlbGV0ZURlcGVuZGFudENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlc2l6ZUNoaWxkcmVuQ29tbWFuZChDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJQ29tcG91bmRDb21tYW5kIHJlc2l6ZSA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkJQ29tbWFuZCBjOwotCQlHcmFwaGljYWxFZGl0UGFydCBjaGlsZDsKLQkJTGlzdCBjaGlsZHJlbiA9IHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJY2hpbGQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkcmVuLmdldChpKTsKLQkJCWMgPSBjcmVhdGVDaGFuZ2VDb25zdHJhaW50Q29tbWFuZCgKLQkJCQkJcmVxdWVzdCwKLQkJCQkJY2hpbGQsCi0JCQkJCXRyYW5zbGF0ZVRvTW9kZWxDb25zdHJhaW50KGdldENvbnN0cmFpbnRGb3IocmVxdWVzdCwgY2hpbGQpKSk7Ci0JCQlyZXNpemUuYWRkKGMpOwotCQkJaWYgKCFjaGlsZC5nZXRTb3VyY2VDb25uZWN0aW9ucygpLmlzRW1wdHkoKSkgewotCQkJCUxpc3QgbGlzdCA9IGNoaWxkLmdldFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTGlua0VkaXRQYXJ0KSB7Ci0JCQkJCQlFZGl0UGFydCByb290ZWRpdCA9IGNoaWxkLmdldFBhcmVudCgpOwotCQkJCQkJTGlzdCBzZWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlpZiAocm9vdGVkaXQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpIHsKLQkJCQkJCQlzZWwgPSAoKERpYWdyYW1FZGl0UGFydCkgcm9vdGVkaXQpLmdldFZpZXdlcigpCi0JCQkJCQkJCQkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJCQkJCX0KLQkJCQkJCUVkaXRQYXJ0IHBhcnQgPSAoKExpbmtFZGl0UGFydCkgb2JqKS5nZXRUYXJnZXQoKTsKLQkJCQkJCWlmIChzZWwuY29udGFpbnMocGFydCkpIHsKLQkJCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgKChMaW5rRWRpdFBhcnQpIG9iaikuZ2V0TW9kZWwoKTsKLQkJCQkJCQkoKERpYWdyYW1FZGl0UGFydCkgcm9vdGVkaXQpLmdldFZpZXdlcigpCi0JCQkJCQkJCQkuYXBwZW5kU2VsZWN0aW9uKChMaW5rRWRpdFBhcnQpIG9iaik7Ci0JCQkJCQkJTGlzdCBibGlzdCA9IGxpbmsuZ2V0QmVuZHBvaW50cygpOwotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYmxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJCQkJQWJzb2x1dGVCZW5kcG9pbnQgYWJwb2ludCA9IChBYnNvbHV0ZUJlbmRwb2ludCkgYmxpc3QKLQkJCQkJCQkJCQkuZ2V0KGopOwotCQkJCQkJCQlQb2ludCBkZWx0YVBvaW50ID0gcmVxdWVzdC5nZXRNb3ZlRGVsdGEoKTsKLQkJCQkJCQkJKChMaW5rRWRpdFBhcnQpIG9iaikuZ2V0RmlndXJlKCkKLQkJCQkJCQkJCQkudHJhbnNsYXRlVG9BYnNvbHV0ZShkZWx0YVBvaW50KTsKLQkJCQkJCQkJUG9pbnQgcCA9IGFicG9pbnQuZ2V0VHJhbnNsYXRlZChyZXF1ZXN0Ci0JCQkJCQkJCQkJLmdldE1vdmVEZWx0YSgpKTsKLQkJCQkJCQkJQ29tbWFuZCBiZW5kY29tbWFuZCA9IG5ldyBNb3ZlQmVuZHBvaW50Q29tbWFuZCgKLQkJCQkJCQkJCQlsaW5rLCBwLCBqKTsKLQkJCQkJCQkJcmVzaXplLmFkZChiZW5kY29tbWFuZCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXNpemU7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9MYWJlbFNlbGVjdGlvbkVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvTGFiZWxTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NjkzYzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9MYWJlbFNlbGVjdGlvbkVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLlNlbGVjdGFibGVMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotCi0vKioKLSAqIEhhbmRsZXMgc2VsZWN0aW9uIG9mIGFjdGl2aXRlcy4gUHJpbWFyeSBzZWxlY3Rpb24gaXMgZGVub3RlZCBieSBoaWdobGlnaHQgYW5kCi0gKiBhIGZvY3VzIHJlY3RhbmdsZS4gTm9ybWFsIHNlbGVjdGlvbiBpcyBkZW5vdGVkIGJ5IGhpZ2hsaWdodCBvbmx5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGFiZWxTZWxlY3Rpb25FZGl0UG9saWN5IGV4dGVuZHMgTm9uUmVzaXphYmxlRWRpdFBvbGljeSB7Ci0KLQlwcml2YXRlIFNlbGVjdGFibGVMYWJlbCBnZXRMYWJlbCgpIHsKLQkJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpOwotCQlyZXR1cm4gKChTZWxlY3RhYmxlTGFiZWwpIHBhcnQuZ2V0RmlndXJlKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5I2hpZGVGb2N1cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZUZvY3VzKCkgewotCQlnZXRMYWJlbCgpLnNldEZvY3VzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kjaGlkZVNlbGVjdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZVNlbGVjdGlvbigpIHsKLQkJZ2V0TGFiZWwoKS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0JCWdldExhYmVsKCkuc2V0Rm9jdXMoZmFsc2UpOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3kjc2hvd0ZvY3VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93Rm9jdXMoKSB7Ci0JCWdldExhYmVsKCkuc2V0Rm9jdXModHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5I3Nob3dTZWxlY3Rpb24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dQcmltYXJ5U2VsZWN0aW9uKCkgewotCQlnZXRMYWJlbCgpLnNldFNlbGVjdGVkKHRydWUpOwotCQlnZXRMYWJlbCgpLnNldEZvY3VzKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSNzaG93U2VsZWN0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93U2VsZWN0aW9uKCkgewotCQlnZXRMYWJlbCgpLnNldFNlbGVjdGVkKHRydWUpOwotCQlnZXRMYWJlbCgpLnNldEZvY3VzKGZhbHNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvTGlua0JlbmRwb2ludEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvTGlua0JlbmRwb2ludEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJkYmY4NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0xpbmtCZW5kcG9pbnRFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNyZWF0ZUJlbmRwb2ludENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuRGVsZXRlQmVuZHBvaW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5Nb3ZlQmVuZHBvaW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQmVuZHBvaW50RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQmVuZHBvaW50UmVxdWVzdDsKLQotLyoqCi0gKiBBIEVkaXRQb2xpY3kgdG8gaGFuZGxlIHRoZSBjcmVhdGUsIG1vdmUgYW5kIGRlbGV0ZSBiZW5kcG9pbnRzIGFjdGl2aXRpZXMgb2YgTGluay4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpbmtCZW5kcG9pbnRFZGl0UG9saWN5IGV4dGVuZHMgQmVuZHBvaW50RWRpdFBvbGljeSB7Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVCZW5kcG9pbnRDb21tYW5kKEJlbmRwb2ludFJlcXVlc3QgcmVxdWVzdCkgewotCQlQb2ludCBsb2MgPSByZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0JCWdldENvbm5lY3Rpb24oKS50cmFuc2xhdGVUb1JlbGF0aXZlKGxvYyk7Ci0JCXJldHVybiBuZXcgQ3JlYXRlQmVuZHBvaW50Q29tbWFuZCgKLQkJCQkoTGluaykgcmVxdWVzdC5nZXRTb3VyY2UoKS5nZXRNb2RlbCgpLCBsb2MsIHJlcXVlc3QuZ2V0SW5kZXgoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVsZXRlQmVuZHBvaW50Q29tbWFuZChCZW5kcG9pbnRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJcmV0dXJuIG5ldyBEZWxldGVCZW5kcG9pbnRDb21tYW5kKChMaW5rKSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSwgcmVxdWVzdAotCQkJCS5nZXRJbmRleCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQmVuZHBvaW50Q29tbWFuZChCZW5kcG9pbnRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJUG9pbnQgbG9jID0gcmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCQlnZXRDb25uZWN0aW9uKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShsb2MpOwotCQlyZXR1cm4gbmV3IE1vdmVCZW5kcG9pbnRDb21tYW5kKChMaW5rKSByZXF1ZXN0LmdldFNvdXJjZSgpLmdldE1vZGVsKCksCi0JCQkJbG9jLCByZXF1ZXN0LmdldEluZGV4KCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvTGlua0VuZHBvaW50RWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9MaW5rRW5kcG9pbnRFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MDVhZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9MaW5rRW5kcG9pbnRFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbm5lY3Rpb25FbmRwb2ludEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci0KLS8qKgotICogQSBFZGl0UG9saWN5IHRvIGhhbmRsZSB0aGUgc2VsZWN0aW9uIGhhbmRsZXMgZm9yIGNvbm5lY3Rpb24uIAotICogIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpbmtFbmRwb2ludEVkaXRQb2xpY3kgZXh0ZW5kcyBDb25uZWN0aW9uRW5kcG9pbnRFZGl0UG9saWN5IHsKLQotCXByaXZhdGUgc3RhdGljIEZvbnQgQk9MRF9GT05UOwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJc3VwZXIuYWRkU2VsZWN0aW9uSGFuZGxlcygpOwotCQlnZXRDb25uZWN0aW9uRmlndXJlKCkuc2V0TGluZVdpZHRoKDIpOwotCX0KLQotCXByb3RlY3RlZCBQb2x5bGluZUNvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpIHsKLQkJcmV0dXJuIChQb2x5bGluZUNvbm5lY3Rpb24pIGdldEhvc3RGaWd1cmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlU2VsZWN0aW9uKCkgewotCQlzdXBlci5oaWRlU2VsZWN0aW9uKCk7Ci0JCWdldEhvc3RGaWd1cmUoKS5zZXRGb250KG51bGwpOwotCQlnZXRIb3N0RmlndXJlKCkuaW52YWxpZGF0ZVRyZWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQlzdXBlci5yZW1vdmVTZWxlY3Rpb25IYW5kbGVzKCk7Ci0JCWdldENvbm5lY3Rpb25GaWd1cmUoKS5zZXRMaW5lV2lkdGgoMCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpIHsKLQkJc3VwZXIuc2hvd1NlbGVjdGlvbigpOwotCQlpZiAoQk9MRF9GT05UID09IG51bGwpIHsKLQkJCUZvbnREYXRhW10gZGF0YSA9IGdldENvbm5lY3Rpb25GaWd1cmUoKS5nZXRGb250KCkuZ2V0Rm9udERhdGEoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykKLQkJCQlpZiAoKGRhdGFbaV0uZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSA9PSAwKQotCQkJCQlkYXRhW2ldLnNldFN0eWxlKGRhdGFbaV0uZ2V0U3R5bGUoKSB8IFNXVC5CT0xEKTsKLQkJCUJPTERfRk9OVCA9IG5ldyBGb250KG51bGwsIGRhdGEpOwotCQl9Ci0JCWdldEhvc3RGaWd1cmUoKS5zZXRGb250KEJPTERfRk9OVCk7Ci0JCWdldEhvc3RGaWd1cmUoKS5pbnZhbGlkYXRlVHJlZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvTm9kZUNvbnRhaW5lckVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvTm9kZUNvbnRhaW5lckVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVmMDVmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL05vZGVDb250YWluZXJFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlQ29udGFpbmVyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Db250YWluZXJFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotCi0vKioKLSAqIEEgRWRpdFBvbGljeSBmb3Ige0BsaW5rIE5vZGVDb250YWluZXJFZGl0UGFydH0gZm9yIGRpc2FibGluZyBkaXJlY3QgY2hpbGQgY3JlYXRpb24uCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTm9kZUNvbnRhaW5lckVkaXRQb2xpY3kgZXh0ZW5kcyBDb250YWluZXJFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Db250YWluZXJFZGl0UG9saWN5I2dldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvTm9kZUNvbnRhaW5lckZsb3dMYXlvdXRFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL05vZGVDb250YWluZXJGbG93TGF5b3V0RWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGY0ODFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvTm9kZUNvbnRhaW5lckZsb3dMYXlvdXRFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlQ29udGFpbmVyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuRmxvd0xheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci0KLS8qKgotICogQSBFZGl0UG9saWN5IGZvciB7QGxpbmsgTm9kZUNvbnRhaW5lckVkaXRQYXJ0fSB0byBkaXNhYmxlIHRoZSBhbGwgZWRpdGluZyBmZWF0dXJlcy4KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlQ29udGFpbmVyRmxvd0xheW91dEVkaXRQb2xpY3kgZXh0ZW5kcyBGbG93TGF5b3V0RWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuT3JkZXJlZExheW91dEVkaXRQb2xpY3kjY3JlYXRlQWRkQ29tbWFuZChFZGl0UGFydCwKLQkgKiAgICAgIEVkaXRQYXJ0KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdFBhcnQgY2hpbGQsIEVkaXRQYXJ0IGFmdGVyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5PcmRlcmVkTGF5b3V0RWRpdFBvbGljeSNjcmVhdGVNb3ZlQ2hpbGRDb21tYW5kKEVkaXRQYXJ0LAotCSAqICAgICAgRWRpdFBhcnQpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlTW92ZUNoaWxkQ29tbWFuZChFZGl0UGFydCBjaGlsZCwgRWRpdFBhcnQgYWZ0ZXIpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kjZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5I2dldERlbGV0ZURlcGVuZGFudENvbW1hbmQoUmVxdWVzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZWxldGVEZXBlbmRhbnRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tGbG93TGF5b3V0RWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0Zsb3dMYXlvdXRFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZmU4N2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0Zsb3dMYXlvdXRFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmxvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5GbG93TGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLQotLyoqCi0gKiBFZGl0UG9saWN5IHRvIGRpc2FibGUgdGhlIGVkaXRpbmcgZmVhdHVyZSBpbiBhIHtAbGluayBGbG93TGF5b3V0fQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tGbG93TGF5b3V0RWRpdFBvbGljeSBleHRlbmRzIEZsb3dMYXlvdXRFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBSb2xlVGFza0Zsb3dMYXlvdXRFZGl0UG9saWN5KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk9yZGVyZWRMYXlvdXRFZGl0UG9saWN5I2NyZWF0ZUFkZENvbW1hbmQob3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0LCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0UGFydCBjaGlsZCwgRWRpdFBhcnQgYWZ0ZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk9yZGVyZWRMYXlvdXRFZGl0UG9saWN5I2NyZWF0ZU1vdmVDaGlsZENvbW1hbmQob3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0LCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlTW92ZUNoaWxkQ29tbWFuZChFZGl0UGFydCBjaGlsZCwgRWRpdFBhcnQgYWZ0ZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kjZ2V0Q3JlYXRlQ29tbWFuZChvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNkODU0OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGdyYXBoaWNhbCBlZGl0IHBvbGljaWVzIGZvciB0aGUgYWN0aXZpdHkgZGlhZ3JhbXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9BY3Rpdml0eUZpZ3VyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9BY3Rpdml0eUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmE0ZjdiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQWN0aXZpdHlGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLS8qKgotICogQGF1dGhvciBKYW1lcyBUaGFyaW8KLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpZ3VyZSBleHRlbmRzIFRleHRGaWd1cmUgewotCi0JcHVibGljIEFjdGl2aXR5RmlndXJlKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQ2VudHJlZExhYmVsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0NlbnRyZWRMYWJlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzA5ZjgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQ2VudHJlZExhYmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2VudHJlZExhYmVsIGV4dGVuZHMgTGFiZWwgewotCi0JcHVibGljIENlbnRyZWRMYWJlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ2VudHJlZExhYmVsKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCXB1YmxpYyBDZW50cmVkTGFiZWwoSW1hZ2UgaSkgewotCQlzdXBlcihpKTsKLQl9Ci0KLQlwdWJsaWMgQ2VudHJlZExhYmVsKFN0cmluZyBzLCBJbWFnZSBpKSB7Ci0JCXN1cGVyKHMsIGkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZSNwYWludEZpZ3VyZShHcmFwaGljcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQlpZiAoaXNPcGFxdWUoKSkKLQkJCXN1cGVyLnBhaW50RmlndXJlKGdyYXBoaWNzKTsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGdldEJvdW5kcygpOwotCQlncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMueWVsbG93KTsKLQkJZ3JhcGhpY3MudHJhbnNsYXRlKGJvdW5kcy54LCBib3VuZHMueSk7Ci0JCWlmICghaXNFbmFibGVkKCkpIHsKLQkJCWdyYXBoaWNzLnRyYW5zbGF0ZSgxLCAxKTsKLQkJCWdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy55ZWxsb3cpOwotCQkJZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJ1dHRvbkxpZ2h0ZXN0KTsKLQkJCWdyYXBoaWNzLmRyYXdUZXh0KGdldFN1YlN0cmluZ1RleHQoKSwgZ2V0VGV4dExvY2F0aW9uKCkpOwotCQkJZ3JhcGhpY3MudHJhbnNsYXRlKC0xLCAtMSk7Ci0JCQlncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYnV0dG9uRGFya2VyKTsKLQkJfQotCQlncmFwaGljcy5kcmF3VGV4dChnZXRTdWJTdHJpbmdUZXh0KCksIGdldFRleHRMb2NhdGlvbigpKTsKLQkJZ3JhcGhpY3Muc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLnllbGxvdyk7Ci0JCWdyYXBoaWNzLnRyYW5zbGF0ZSgtYm91bmRzLngsIC1ib3VuZHMueSk7Ci0JCWdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQ29sb3JzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0NvbG9ycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzdlMDJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQ29sb3JzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotLyoqCi0gKiBUaGUgY29sb3IgY29uc3RhbnRzIHJlZmVyZW5jZWQgYnkgdGhlIGRpYWdyYW0gZWRpdG9ycy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbG9ycyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIElOSEVSSVRFRF9FTEVNRU5UX0xBQkVMID0gQ29sb3JDb25zdGFudHMuZGFya0dyZWVuOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBTVVBSRVNTRURfRUxFTUVOVF9MQUJFTCA9IENvbG9yQ29uc3RhbnRzLmdyYXk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQ29tcG9zaXRlRmlndXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0NvbXBvc2l0ZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTJmY2NjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQ29tcG9zaXRlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmxvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuUmFpc2VkTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlRmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbG9yIEJHX0NPTE9SID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCAyNTUsCi0JCQkyNTUsIDIwNSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfV0lEVEggPSA1MDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTUEFDSU5HID0gMTA7Ci0KLQlwcml2YXRlIGludCBtYXhXaWR0aCA9IERFRkFVTFRfTUFYX1dJRFRIOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUZpZ3VyZSgpIHsKLQkJVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dCgpOwotCQlsYXlvdXQuc2V0TWlub3JBbGlnbm1lbnQoRmxvd0xheW91dC5BTElHTl9DRU5URVIpOwotCQlsYXlvdXQuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7Ci0JCWxheW91dC5zZXRTcGFjaW5nKFNQQUNJTkcpOwotCQlsYXlvdXQuc2V0T2JzZXJ2ZVZpc2liaWxpdHkodHJ1ZSk7Ci0JCXNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJc2V0Qm9yZGVyKG5ldyBSYWlzZWRNYXJnaW5Cb3JkZXIoKSk7Ci0JCXNldEJhY2tncm91bmRDb2xvcihCR19DT0xPUik7Ci0JCXNldE9wYXF1ZSh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXhXaWR0aChpbnQgdykgewotCQltYXhXaWR0aCA9IHc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlI2dldFByZWZlcnJlZFNpemUoaW50LCBpbnQpCi0JICovCi0JcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKGludCB3SGludCwgaW50IGhIaW50KSB7Ci0JCWlmICh3SGludCA+IG1heFdpZHRoKSB7Ci0JCQl3SGludCA9IG1heFdpZHRoOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQcmVmZXJyZWRTaXplKHdIaW50LCBoSGludCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0RpYW1vbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvRGlhbW9uZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmZlNGZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvRGlhbW9uZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIEEgZmlndXJlIGZvciBkaWFtb25kIHNoYXBlLiAgCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlhbW9uZCBleHRlbmRzIFNoYXBlIHsKLQotCXByaXZhdGUgUG9pbnRMaXN0IGRpYW1vbmQgPSBuZXcgUG9pbnRMaXN0KDQpOwotCi0JLyoqCi0JICogQHNlZSBTaGFwZSNmaWxsU2hhcGUoR3JhcGhpY3MpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbFNoYXBlKEdyYXBoaWNzIGcpIHsKLQkJZy5maWxsUG9seWdvbihkaWFtb25kKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFNoYXBlI291dGxpbmVTaGFwZShHcmFwaGljcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvdXRsaW5lU2hhcGUoR3JhcGhpY3MgZykgewotCQlnLmRyYXdQb2x5Z29uKGRpYW1vbmQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZSN2YWxpZGF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCVJlY3RhbmdsZSByID0gZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQlyLmNyb3AoZ2V0SW5zZXRzKCkpOwotCQlyLnJlc2l6ZSgtMSwgLTEpOwotCQlkaWFtb25kLnJlbW92ZUFsbFBvaW50cygpOwotCQlkaWFtb25kLmFkZFBvaW50KHIuZ2V0VG9wKCkpOwotCQlkaWFtb25kLmFkZFBvaW50KHIuZ2V0UmlnaHQoKSk7Ci0JCWRpYW1vbmQuYWRkUG9pbnQoci5nZXRCb3R0b20oKSk7Ci0JCWRpYW1vbmQuYWRkUG9pbnQoci5nZXRMZWZ0KCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lI3ByaW1UcmFuc2xhdGUoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgcHJpbVRyYW5zbGF0ZShpbnQgeCwgaW50IHkpIHsKLQkJc3VwZXIucHJpbVRyYW5zbGF0ZSh4LCB5KTsKLQkJZGlhbW9uZC50cmFuc2xhdGUoeCwgeSk7Ci0JfQotCi0JcHVibGljIFBvaW50TGlzdCBnZXRQb2ludHMoKSB7Ci0JCXJldHVybiBkaWFtb25kOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9FbmROb2RlRmlndXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0VuZE5vZGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMwMWEwNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0VuZE5vZGVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRWxsaXBzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci0KLS8qKgotICogRmlndXJlIGZvciB7QGxpbmsgVHlwZWROb2RlfSBlbmQuCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRW5kTm9kZUZpZ3VyZSBleHRlbmRzIEVsbGlwc2UgewotCi0JLyoqCi0JICogRmlsbHMgdGhlIGVsbGlwc2UuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGUjZmlsbFNoYXBlKG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsU2hhcGUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJUmVjdGFuZ2xlIHIgPSBnZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCXIuc2hyaW5rKHIud2lkdGggLyA4LCByLmhlaWdodCAvIDgpOwotCQlncmFwaGljcy5maWxsT3ZhbChyKTsKLQl9Ci0KLQkvKioKLQkgKiBPdXRsaW5lcyB0aGUgZWxsaXBzZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZSNvdXRsaW5lU2hhcGUob3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG91dGxpbmVTaGFwZShHcmFwaGljcyBncmFwaGljcykgewotCQlzdXBlci5vdXRsaW5lU2hhcGUoZ3JhcGhpY3MpOwotCi0JCVJlY3RhbmdsZSByID0gUmVjdGFuZ2xlLlNJTkdMRVRPTjsKLQkJci5zZXRCb3VuZHMoZ2V0Qm91bmRzKCkpOwotCQlyLnNocmluayhnZXRCb3VuZHMoKS53aWR0aCAvIDgsIGdldEJvdW5kcygpLmhlaWdodCAvIDgpOwotCQlyLndpZHRoLS07Ci0JCXIuaGVpZ2h0LS07Ci0JCXIuc2hyaW5rKChsaW5lV2lkdGggLSAxKSAvIDIsIChsaW5lV2lkdGggLSAxKSAvIDIpOwotCQlncmFwaGljcy5kcmF3T3ZhbChyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvRnJlZVRleHRGaWd1cmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvRnJlZVRleHRGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkOGU1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0ZyZWVUZXh0RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlbGF0aXZlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuRmxvd1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuUGFyYWdyYXBoVGV4dExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQudGV4dC5UZXh0RmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLS8qKgotICogRmlndXJlIHRvIHN1cHBvcnQgZnJlZSB0ZXh0IGluIHRoZSBkaWFncmFtLCB3aXRob3V0IGFuIGltYWdlIGF0dGFjaGVkIHRvIGl0LgotICogRnJlZVRleHRGaWd1cmUgd3JhcHBlciBvdmVyIHtAbGluayBGbG93UGFnZX0gYW5kIHtAbGluayBUZXh0Rmxvd30uIAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIga2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGcmVlVGV4dEZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0KLQlwcml2YXRlIEZsb3dQYWdlIHRleHRGbG93UGFnZTsKLQotCXByaXZhdGUgVGV4dEZsb3cgdGV4dEZsb3c7Ci0KLQlwdWJsaWMgRnJlZVRleHRGaWd1cmUoKSB7Ci0JCXRleHRGbG93UGFnZSA9IG5ldyBGbG93UGFnZSgpOwotCQl0ZXh0Rmxvd1BhZ2Uuc2V0SG9yaXpvbnRhbEFsaWdtZW50KFBvc2l0aW9uQ29uc3RhbnRzLkNFTlRFUik7Ci0JCXNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlhZGQodGV4dEZsb3dQYWdlLCBuZXcgUmVsYXRpdmVMb2NhdG9yKHRleHRGbG93UGFnZSwKLQkJCQlQb3NpdGlvbkNvbnN0YW50cy5BTFdBWVNfTEVGVCkpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0Rmxvdy5nZXRUZXh0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgbmV3VGV4dCkgewotCQl0ZXh0Rmxvd1BhZ2UucmVtb3ZlQWxsKCk7Ci0JCXRleHRGbG93ID0gbmV3IFRleHRGbG93KCk7Ci0JCXRleHRGbG93LnNldEZvbnQoVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UKTsKLQkJdGV4dEZsb3cuc2V0TGF5b3V0TWFuYWdlcihuZXcgUGFyYWdyYXBoVGV4dExheW91dCh0ZXh0RmxvdywKLQkJCQlQYXJhZ3JhcGhUZXh0TGF5b3V0LldPUkRfV1JBUF9UUlVOQ0FURSkpOwotCQl0ZXh0Rmxvdy5zZXRUZXh0KG5ld1RleHQpOwotCQl0ZXh0Rmxvd1BhZ2UuYWRkKHRleHRGbG93KTsKLQl9Ci0KLQlwdWJsaWMgRmxvd1BhZ2UgZ2V0VGV4dEZsb3dQYWdlKCkgewotCQlyZXR1cm4gdGV4dEZsb3dQYWdlOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRGb250KEZvbnQgZikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLnNldEZvbnQoZik7Ci0JCXRleHRGbG93LnNldEZvbnQoZik7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBmZykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLnNldEZvcmVncm91bmRDb2xvcihmZyk7Ci0JCXRleHRGbG93LnNldEZvcmVncm91bmRDb2xvcihmZyk7Ci0JfQotCi0JcHVibGljIFRleHRGbG93IGdldFRleHRGbG93KCkgewotCQlyZXR1cm4gdGV4dEZsb3c7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9JbWFnZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvSW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNGUwMWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9JbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBJbWFnZSBsb2NhdGlvbiBjb25zdGFudHMgcmVmZXJlbmNlZCBpbiBkaWFncmFtLgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEltYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIEFDVElWSVRZID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0SW1hZ2UoInNoYXBlL2FjdGl2aXR5LmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElURVJBVElPTiA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldEltYWdlKCJzaGFwZS9pdGVyYXRpb24uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgUEhBU0UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoCi0JCQkic2hhcGUvcGhhc2UuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgTUlMRVNUT05FID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0SW1hZ2UoInNoYXBlL21pbGVzdG9uZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBST0xFID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKAotCQkJInNoYXBlL3JvbGUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgVEFTSyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgKLQkJCSJzaGFwZS90YXNrLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIFRBU0tfREVTQ1JJUFRPUiA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldEltYWdlKCJzaGFwZS90YXNrZGVzY3JpcHRvci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUiA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJzaGFwZS93b3JrcHJvZHVjdGRlc2NyaXB0b3IuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgQVJUSUZBQ1QgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRJbWFnZSgic2hhcGUvYXJ0aWZhY3QuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgREVMSVZFUkFCTEUgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRJbWFnZSgic2hhcGUvZGVsaXZlcmFibGUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgT1VUQ09NRSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldEltYWdlKCJzaGFwZS9vdXRjb21lLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIFdPUktfUFJPRFVDVCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldEltYWdlKCJXb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgVEFTS19ERVNDUklQVE9SXzE2ID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoInNoYXBlL3Rhc2tkZXNfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIFJPTEVfREVTQ1JJUFRPUl8xNiA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJzaGFwZS9yb2xlZGVzX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl8xNiA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJzaGFwZS93b3JrZGVzX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL05vdGVGaWd1cmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvTm90ZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2FiMWVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvTm90ZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIEphbWVzIFRoYXJpbwotICogQHNpbmNlICAxLjAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBOb3RlRmlndXJlCi0gICAgICAgIGV4dGVuZHMgVGV4dEZpZ3VyZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPUk5FUl9TSVpFID0gNDsKLQotICAgIHB1YmxpYyBOb3RlRmlndXJlKCkgewotICAgICAgICBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMudG9vbHRpcEJhY2tncm91bmQpOwotICAgICAgICBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotCi0gICAgICAgIHNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKENPUk5FUl9TSVpFKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLSAgICAgICAgUmVjdGFuZ2xlIHJlY3QgPSBnZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0KLSAgICAgICAgZ3JhcGhpY3MudHJhbnNsYXRlKGdldExvY2F0aW9uKCkpOwotCi0gICAgICAgIC8vIGZpbGwgdGhlIG5vdGUKLSAgICAgICAgUG9pbnRMaXN0IG91dGxpbmUgPSBuZXcgUG9pbnRMaXN0KCk7Ci0KLSAgICAgICAgb3V0bGluZS5hZGRQb2ludCgwLCAwKTsKLSAgICAgICAgb3V0bGluZS5hZGRQb2ludChyZWN0LndpZHRoIC0gQ09STkVSX1NJWkUsIDApOwotICAgICAgICBvdXRsaW5lLmFkZFBvaW50KHJlY3Qud2lkdGggLSAxLCBDT1JORVJfU0laRSk7Ci0gICAgICAgIG91dGxpbmUuYWRkUG9pbnQocmVjdC53aWR0aCAtIDEsIHJlY3QuaGVpZ2h0IC0gMSk7Ci0gICAgICAgIG91dGxpbmUuYWRkUG9pbnQoMCwgcmVjdC5oZWlnaHQgLSAxKTsKLQotICAgICAgICBncmFwaGljcy5maWxsUG9seWdvbihvdXRsaW5lKTsKLQotICAgICAgICAvLyBkcmF3IHRoZSBpbm5lciBvdXRsaW5lCi0gICAgICAgIFBvaW50TGlzdCBpbm5lckxpbmUgPSBuZXcgUG9pbnRMaXN0KCk7Ci0KLSAgICAgICAgaW5uZXJMaW5lLmFkZFBvaW50KHJlY3Qud2lkdGggLSBDT1JORVJfU0laRSAtIDEsIDApOwotICAgICAgICBpbm5lckxpbmUuYWRkUG9pbnQocmVjdC53aWR0aCAtIENPUk5FUl9TSVpFIC0gMSwgQ09STkVSX1NJWkUpOwotICAgICAgICBpbm5lckxpbmUuYWRkUG9pbnQocmVjdC53aWR0aCAtIDEsIENPUk5FUl9TSVpFKTsKLSAgICAgICAgaW5uZXJMaW5lLmFkZFBvaW50KHJlY3Qud2lkdGggLSBDT1JORVJfU0laRSAtIDEsIDApOwotICAgICAgICBpbm5lckxpbmUuYWRkUG9pbnQoMCwgMCk7Ci0gICAgICAgIGlubmVyTGluZS5hZGRQb2ludCgwLCByZWN0LmhlaWdodCAtIDEpOwotICAgICAgICBpbm5lckxpbmUuYWRkUG9pbnQocmVjdC53aWR0aCAtIDEsIHJlY3QuaGVpZ2h0IC0gMSk7Ci0gICAgICAgIGlubmVyTGluZS5hZGRQb2ludChyZWN0LndpZHRoIC0gMSwgQ09STkVSX1NJWkUpOwotCi0gICAgICAgIGdyYXBoaWNzLmRyYXdQb2x5Z29uKGlubmVyTGluZSk7Ci0KLSAgICAgICAgZ3JhcGhpY3MudHJhbnNsYXRlKGdldExvY2F0aW9uKCkuZ2V0TmVnYXRlZCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1JvbGVUYXNrQ29tcG9zaXRlRmlndXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1JvbGVUYXNrQ29tcG9zaXRlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YzhhNWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Sb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZsb3dMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LlJhaXNlZE1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBGaWd1cmUgZm9yIHtAbGluayBSb2xlVGFza0NvbXBvc2l0ZX0uCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sb3IgQkdfQ09MT1IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIDI1NSwKLQkJCTI1NSwgMTU2KTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfV0lEVEggPSA1MDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOT1JfU1BBQ0lORyA9IDIwOwotCi0JcHJpdmF0ZSBGaWd1cmUgdGFza3NGaWd1cmU7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUoKSB7Ci0JCUZsb3dMYXlvdXQgbGF5b3V0ID0gbmV3IEZsb3dMYXlvdXQodHJ1ZSk7Ci0JCWxheW91dC5zZXRNaW5vckFsaWdubWVudChGbG93TGF5b3V0LkFMSUdOX0NFTlRFUik7Ci0JCWxheW91dC5zZXRNYWpvckFsaWdubWVudChGbG93TGF5b3V0LkFMSUdOX0xFRlRUT1ApOwotCQlsYXlvdXQuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7Ci0JCWxheW91dC5zZXRNaW5vclNwYWNpbmcoTUlOT1JfU1BBQ0lORyk7Ci0JCWxheW91dC5zZXRPYnNlcnZlVmlzaWJpbGl0eSh0cnVlKTsKLQotCQlzZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCXNldEJvcmRlcihuZXcgUmFpc2VkTWFyZ2luQm9yZGVyKCkpOwotCQlzZXRCYWNrZ3JvdW5kQ29sb3IoQkdfQ09MT1IpOwotCQlzZXRPcGFxdWUodHJ1ZSk7Ci0KLQkJdGFza3NGaWd1cmUgPSBuZXcgRmlndXJlKCkgewotCQkJLyoqCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmUjZ2V0UHJlZmVycmVkU2l6ZShpbnQsIGludCkKLQkJCSAqLwotCQkJcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKGludCB3SGludCwgaW50IGhIaW50KSB7Ci0JCQkJSUZpZ3VyZSBmaXJzdENoaWxkID0gKElGaWd1cmUpIGdldENoaWxkcmVuKCkuZ2V0KDApOwotCQkJCWlmIChmaXJzdENoaWxkICE9IHRoaXMpIHsKLQkJCQkJaW50IG9mZnNldCA9IGZpcnN0Q2hpbGQuZ2V0U2l6ZSgpLndpZHRoOyAvLyBmaXJzdENoaWxkLmdldFNpemUoKS53aWR0aAotCQkJCQkvLyArCi0JCQkJCS8vIFJvbGVUYXNrQ29tcG9zaXRlRmlndXJlLnRoaXMuZ2V0SW5zZXRzKCkuZ2V0V2lkdGgoKQotCQkJCQkvLyArCi0JCQkJCS8vIE1JTk9SX1NQQUNJTkc7Ci0JCQkJCWlmICh3SGludCA8IG9mZnNldCkgewotCi0JCQkJCX0KLQkJCQkJd0hpbnQgPSB3SGludCAtIG9mZnNldDsKLQkJCQkJaWYgKHdIaW50ID4gTUFYX1dJRFRIKSB7Ci0JCQkJCQl3SGludCA9IE1BWF9XSURUSDsKLQkJCQkJfQotCQkJCX0KLQkJCQlEaW1lbnNpb24gZGltID0gc3VwZXIuZ2V0UHJlZmVycmVkU2l6ZSh3SGludCwgaEhpbnQpOwotCQkJCXJldHVybiBkaW07Ci0JCQl9Ci0JCX07Ci0JCUZsb3dMYXlvdXQgZmxvd0xheW91dCA9IG5ldyBGbG93TGF5b3V0KCk7Ci0JCWZsb3dMYXlvdXQuc2V0TWlub3JTcGFjaW5nKDEwKTsKLQkJZmxvd0xheW91dC5zZXRNaW5vckFsaWdubWVudChGbG93TGF5b3V0LkFMSUdOX0NFTlRFUik7Ci0JCXRhc2tzRmlndXJlLnNldExheW91dE1hbmFnZXIoZmxvd0xheW91dCk7Ci0JCXRhc2tzRmlndXJlLnNldE9wYXF1ZSh0cnVlKTsKLQkJc3VwZXIuYWRkKHRhc2tzRmlndXJlLCBudWxsLCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlI2FkZChJRmlndXJlLCBPYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoSUZpZ3VyZSBmaWd1cmUsIE9iamVjdCBjb25zdHJhaW50LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGdldENoaWxkcmVuKCkuc2l6ZSgpID09IDEpIHsKLQkJCXN1cGVyLmFkZChmaWd1cmUsIGNvbnN0cmFpbnQsIDApOwotCQl9IGVsc2UgewotCQkJdGFza3NGaWd1cmUuYWRkKGZpZ3VyZSwgY29uc3RyYWludCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvUm9sZVRhc2tGbG93TGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1JvbGVUYXNrRmxvd0xheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmQ3ODYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvUm9sZVRhc2tGbG93TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZsb3dMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIEBhdXRob3Igc2thbm5vb3IKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0Zsb3dMYXlvdXQgZXh0ZW5kcyBGbG93TGF5b3V0IHsKLQotCWJvb2xlYW4gYWRqdXN0ID0gZmFsc2U7Ci0JV29ya2luZ0RhdGEgZGF0YTsKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUm9sZVRhc2tGbG93TGF5b3V0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXNIb3Jpem9udGFsCi0JICovCi0JcHVibGljIFJvbGVUYXNrRmxvd0xheW91dChib29sZWFuIGlzSG9yaXpvbnRhbCkgewotCQlzdXBlcihpc0hvcml6b250YWwpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JCi0JcHVibGljIHZvaWQgbGF5b3V0KElGaWd1cmUgcGFyZW50KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJaWYoYWRqdXN0KXsKLQkJCWFkanVzdExheW91dChwYXJlbnQpOwotCQl9ZWxzZQotCQkJc3VwZXIubGF5b3V0KHBhcmVudCk7Ci0JfQotCWNsYXNzIFdvcmtpbmdEYXRhIHsKLQkJaW50IHJvd0hlaWdodCwgcm93V2lkdGgsIHJvd0NvdW50LCByb3dYLCByb3dZLCBtYXhXaWR0aDsKLQkJUmVjdGFuZ2xlIGJvdW5kc1tdLCBhcmVhOwotCQlJRmlndXJlIHJvd1tdOwotCX0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgc3RhdGUgb2Ygcm93IGRhdGEsIHdoaWNoIGlzIGludGVybmFsIHRvIHRoZSBsYXlvdXQgcHJvY2Vzcy4gCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRSb3coKSB7Ci0JCWRhdGEucm93WCA9IDA7Ci0JCWRhdGEucm93SGVpZ2h0ID0gMDsKLQkJZGF0YS5yb3dXaWR0aCA9IDA7Ci0JCWRhdGEucm93Q291bnQgPSAwOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlIGRhdGEgZm9yIGxheWluZyBvdXQgY2hpbGRyZW4sIGJhc2VkIG9uIHRoZSBGaWd1cmUgZ2l2ZW4gYXMgaW5wdXQuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgZmlndXJlCi0JICogQHNpbmNlIDIuMCAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdFZhcmlhYmxlcyhJRmlndXJlIHBhcmVudCkgewotCQlkYXRhLnJvdyA9IG5ldyBJRmlndXJlW3BhcmVudC5nZXRDaGlsZHJlbigpLnNpemUoKV07Ci0JCWRhdGEuYm91bmRzID0gbmV3IFJlY3RhbmdsZVtkYXRhLnJvdy5sZW5ndGhdOwotCQlkYXRhLm1heFdpZHRoID0gZGF0YS5hcmVhLndpZHRoOwotCX0KLQlwcml2YXRlIHZvaWQgYWRqdXN0TGF5b3V0KElGaWd1cmUgcGFyZW50KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJZGF0YSA9IG5ldyBXb3JraW5nRGF0YSgpOwotCQlSZWN0YW5nbGUgcmVsYXRpdmVBcmVhID0gcGFyZW50LmdldENsaWVudEFyZWEoKTsKLQkJZGF0YS5hcmVhID0gdHJhbnNwb3Nlci50KHJlbGF0aXZlQXJlYSk7Ci0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOwotCQlpbnQgZHg7Ci0KLQkJLy9DYWxjdWxhdGUgdGhlIGhpbnRzIHRvIGJlIHBhc3NlZCB0byBjaGlsZHJlbgotCQlpbnQgd0hpbnQgPSAtMTsKLQkJaW50IGhIaW50ID0gLTE7Ci0JCWlmIChpc0hvcml6b250YWwoKSkKLQkJCXdIaW50ID0gcGFyZW50LmdldENsaWVudEFyZWEoKS53aWR0aDsKLQkJZWxzZQotCQkJaEhpbnQgPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpLmhlaWdodDsKLQotCQlpbml0VmFyaWFibGVzKHBhcmVudCk7Ci0JCWluaXRSb3coKTsKLQkJaW50IGkgPSAwOyAKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSUZpZ3VyZSBmID0gKElGaWd1cmUpaXRlcmF0b3IubmV4dCgpOwotCQkJRGltZW5zaW9uIHByZWYgPSB0cmFuc3Bvc2VyLnQoZ2V0Q2hpbGRTaXplKGYsIHdIaW50LCBoSGludCkpOwotCQkJUmVjdGFuZ2xlIHIgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIHByZWYud2lkdGgsIHByZWYuaGVpZ2h0KTsKLQotCQkJaWYgKGRhdGEucm93Q291bnQgPiAwKSB7Ci0JCQkJaWYgKGRhdGEucm93V2lkdGggKyBwcmVmLndpZHRoID4gZGF0YS5tYXhXaWR0aCkKLQkJCQkJbGF5b3V0Um93KHBhcmVudCk7Ci0JCQl9Ci0JCQlyLnggPSBkYXRhLnJvd1g7Ci0JCQlyLnkgPSBkYXRhLnJvd1k7Ci0JCQlkeCA9IHIud2lkdGggKyBnZXRNaW5vclNwYWNpbmcoKTsKLQkJCWRhdGEucm93WCArPSBkeDsKLQkJCWRhdGEucm93V2lkdGggKz0gZHg7Ci0JCQlkYXRhLnJvd0hlaWdodCA9IE1hdGgubWF4KGRhdGEucm93SGVpZ2h0LCByLmhlaWdodCk7Ci0JCQlkYXRhLnJvdyBbZGF0YS5yb3dDb3VudF0gPSBmOwotCQkJZGF0YS5ib3VuZHNbZGF0YS5yb3dDb3VudF0gPSByOwotCQkJZGF0YS5yb3dDb3VudCsrOwotCQkJaSsrOwotCQl9Ci0JCWlmIChkYXRhLnJvd0NvdW50ICE9IDApCi0JCQlsYXlvdXRSb3cocGFyZW50KTsKLQkJZGF0YSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWRqdXN0KGJvb2xlYW4gYWRqdXN0KSB7Ci0JCXRoaXMuYWRqdXN0ID0gYWRqdXN0OwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvU2VsZWN0YWJsZUxhYmVsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1NlbGVjdGFibGVMYWJlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTkyNWI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvU2VsZWN0YWJsZUxhYmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5Lkluc2V0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIEEgY3VzdG9taXplZCBMYWJlbCBmb3Igc2VsZWN0aW9uLiBQcmltYXJ5IHNlbGVjdGlvbiBpcyBkZW5vdGVkIGJ5IGhpZ2hsaWdodAotICogYW5kIGZvY3VzIHJlY3RhbmdsZS4gTm9ybWFsIHNlbGVjdGlvbiBpcyBkZW5vdGVkIGJ5IGhpZ2hsaWdodCBvbmx5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0YWJsZUxhYmVsIGV4dGVuZHMgTGFiZWwgewotCi0JcHJpdmF0ZSBib29sZWFuIHNlbGVjdGVkOwotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0ZvY3VzOwotCi0JcHJpdmF0ZSBSZWN0YW5nbGUgZ2V0U2VsZWN0aW9uUmVjdGFuZ2xlKCkgewotCQlSZWN0YW5nbGUgYm91bmRzID0gZ2V0VGV4dEJvdW5kcygpOwotCQlib3VuZHMuZXhwYW5kKG5ldyBJbnNldHMoMiwgMiwgMCwgMCkpOwotCQl0cmFuc2xhdGVUb1BhcmVudChib3VuZHMpOwotCQlib3VuZHMuaW50ZXJzZWN0KGdldEJvdW5kcygpKTsKLQkJcmV0dXJuIGJvdW5kczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbCNwYWludEZpZ3VyZShHcmFwaGljcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCWdyYXBoaWNzLnB1c2hTdGF0ZSgpOwotCQkJZ3JhcGhpY3Muc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVCYWNrZ3JvdW5kU2VsZWN0ZWQpOwotCQkJZ3JhcGhpY3MuZmlsbFJlY3RhbmdsZShnZXRTZWxlY3Rpb25SZWN0YW5nbGUoKSk7Ci0JCQlncmFwaGljcy5wb3BTdGF0ZSgpOwotCQkJZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLQkJfQotCQlpZiAoaGFzRm9jdXMpIHsKLQkJCWdyYXBoaWNzLnB1c2hTdGF0ZSgpOwotCQkJZ3JhcGhpY3Muc2V0WE9STW9kZSh0cnVlKTsKLQkJCWdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0JCQlncmFwaGljcy5kcmF3Rm9jdXMoZ2V0U2VsZWN0aW9uUmVjdGFuZ2xlKCkucmVzaXplKC0xLCAtMSkpOwotCQkJZ3JhcGhpY3MucG9wU3RhdGUoKTsKLQkJfQotCQlzdXBlci5wYWludEZpZ3VyZShncmFwaGljcyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2VsZWN0aW9uIHN0YXRlIG9mIHRoaXMgU2ltcGxlQWN0aXZpdHlMYWJlbAotCSAqIAotCSAqIEBwYXJhbSBiCi0JICogICAgICAgICAgICB0cnVlIHdpbGwgY2F1c2UgdGhlIGxhYmVsIHRvIGFwcGVhciBzZWxlY3RlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKGJvb2xlYW4gYikgewotCQlzZWxlY3RlZCA9IGI7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmb2N1cyBzdGF0ZSBvZiB0aGlzIFNpbXBsZUFjdGl2aXR5TGFiZWwKLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqICAgICAgICAgICAgdHJ1ZSB3aWxsIGNhdXNlIGEgZm9jdXMgcmVjdGFuZ2xlIHRvIGJlIGRyYXduIGFyb3VuZCB0aGUgdGV4dAotCSAqICAgICAgICAgICAgb2YgdGhlIExhYmVsCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoYm9vbGVhbiBiKSB7Ci0JCWhhc0ZvY3VzID0gYjsKLQkJcmVwYWludCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9UZXh0RmlndXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1RleHRGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDllMWE4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1RleHRGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JbWFnZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWxhdGl2ZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuRmxvd1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuUGFyYWdyYXBoVGV4dExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQudGV4dC5UZXh0RmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBUZXh0RmlndXJlIGlzIGN1c3RvbWl6YWJsZSBmaWd1cmUgdG8gYWxsb3cgd29yZC13cmFwaW5nIGFuZCB3aXRoIGltYWdlLiAKLSAqIHtAbGluayBMYWJlbH0gZG8gbm90IHN1cHBvcnQgd29yZC13cmFwLiAgVGV4dEZpZ3VyZSBpcyB3cmFwcGVyIG92ZXIge0BsaW5rIFRleHRGbG93fQotICogYW5kIHtAbGluayBGbG93UGFnZX0gdG8gc3VwcG9ydCB3b3JkLXdyYXAgYW5kIGltYWdlLiAKLSAqIEBhdXRob3IgSmFtZXMgVGhhcmlvCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGV4dEZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0KLQlwcml2YXRlIEZsb3dQYWdlIHRleHRGbG93UGFnZTsKLQotCXByaXZhdGUgVGV4dEZsb3cgdGV4dEZsb3c7Ci0KLQlwcml2YXRlIEltYWdlRmlndXJlIGltYWdlRmlndXJlOwotCi0JcHVibGljIFRleHRGaWd1cmUoKSB7Ci0JCXRleHRGbG93UGFnZSA9IG5ldyBGbG93UGFnZSgpOwotCQl0ZXh0Rmxvd1BhZ2Uuc2V0SG9yaXpvbnRhbEFsaWdtZW50KFBvc2l0aW9uQ29uc3RhbnRzLkNFTlRFUik7Ci0JCXNldExheW91dE1hbmFnZXIobmV3IFRvb2xiYXJMYXlvdXQoKSk7Ci0JCWltYWdlRmlndXJlID0gbmV3IEltYWdlRmlndXJlKCk7Ci0JCWFkZChpbWFnZUZpZ3VyZSwgbmV3IFJlbGF0aXZlTG9jYXRvcihpbWFnZUZpZ3VyZSwKLQkJCQlQb3NpdGlvbkNvbnN0YW50cy5DRU5URVIpKTsKLQkJYWRkKHRleHRGbG93UGFnZSwgbmV3IFJlbGF0aXZlTG9jYXRvcih0ZXh0Rmxvd1BhZ2UsCi0JCQkJUG9zaXRpb25Db25zdGFudHMuQUxXQVlTX0xFRlQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoSW1hZ2UgaW1hZ2UpIHsKLQkJaW1hZ2VGaWd1cmUuc2V0SW1hZ2UoaW1hZ2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHRGbG93LmdldFRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBuZXdUZXh0KSB7Ci0JCXRleHRGbG93UGFnZS5yZW1vdmVBbGwoKTsKLQkJdGV4dEZsb3cgPSBuZXcgVGV4dEZsb3coKTsKLQkJdGV4dEZsb3cuc2V0Rm9udChUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlQpOwotCQl0ZXh0Rmxvdy5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBQYXJhZ3JhcGhUZXh0TGF5b3V0KHRleHRGbG93LAotCQkJCVBhcmFncmFwaFRleHRMYXlvdXQuV09SRF9XUkFQX0hBUkQpKTsKLQkJdGV4dEZsb3cuc2V0VGV4dChuZXdUZXh0KTsKLQkJdGV4dEZsb3dQYWdlLmFkZCh0ZXh0Rmxvdyk7Ci0JfQotCi0JcHVibGljIEZsb3dQYWdlIGdldFRleHRGbG93UGFnZSgpIHsKLQkJcmV0dXJuIHRleHRGbG93UGFnZTsKLQl9Ci0KLQlwdWJsaWMgVGV4dEZsb3cgZ2V0VGV4dEZsb3coKSB7Ci0JCXJldHVybiB0ZXh0RmxvdzsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dQQ29tcGFydG1lbnRGaWd1cmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV1BDb21wYXJ0bWVudEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDdlZDczLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV1BDb21wYXJ0bWVudEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuUmFpc2VkTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1BDb21wYXJ0bWVudEZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIENvbG9yIHdwQ29sb3IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIDI1NSwKLQkJCTI1NSwgMTU2KTsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgYXJ0aWZhY3RDb2xvciA9IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwKLQkJCTI1NSwgMjU1LCAxNTYpOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciBkZWxpdmVyYWJsZUNvbG9yID0gbmV3IENvbG9yKAotCQkJRGlzcGxheS5nZXRDdXJyZW50KCksIDIwNiwgMjU1LCAyMTYpOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciBvdXRjb21lQ29sb3IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksCi0JCQkyMDYsIDI1NSwgMTAwKTsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIG5ld1dQTmFtZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLldQQ29tcGFydG1lbnRGaWd1cmVfMDsgCi0KLQlwdWJsaWMgTGFiZWwgbGFiZWw7Ci0KLQlXUEZpZ3VyZSBmaWd1cmUgPSBudWxsOwotCi0JLyoqCi0JICogV29ya1Byb2R1Y3QgQ29tcGFydG1lbnQgLSBXaXRoIGJhY2tncm91bmQgZmlsbGVkIGRlcGVuZGluZyBvbiBUeXBlIG9mIHRoZQotCSAqIFdvcmtQcm9kdWN0LgotCSAqLwotCXB1YmxpYyBXUENvbXBhcnRtZW50RmlndXJlKExhYmVsIG5hbWUsIGludCB0eXBlKSB7Ci0JCWxhYmVsID0gbmFtZTsKLQkJVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dCgpOwotCQlzZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCXNldE9wYXF1ZSh0cnVlKTsKLQkJc2V0Qm9yZGVyKG5ldyBSYWlzZWRNYXJnaW5Cb3JkZXIoKSk7Ci0JCWlmICh0eXBlID09IDEpCi0JCQlzZXRCYWNrZ3JvdW5kQ29sb3IoYXJ0aWZhY3RDb2xvcik7Ci0JCWVsc2UgaWYgKHR5cGUgPT0gMikKLQkJCXNldEJhY2tncm91bmRDb2xvcihkZWxpdmVyYWJsZUNvbG9yKTsKLQkJZWxzZSBpZiAodHlwZSA9PSAzKQotCQkJc2V0QmFja2dyb3VuZENvbG9yKG91dGNvbWVDb2xvcik7Ci0JCWVsc2UKLQkJCXNldEJhY2tncm91bmRDb2xvcih3cENvbG9yKTsKLQkJbGFiZWwuc2V0VGV4dChuZXdXUE5hbWUpOwotCQlhZGQobGFiZWwpOwotCX0KLQotCXB1YmxpYyBMYWJlbCBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsTmFtZShTdHJpbmcgbmFtZSkgewotCQlsYWJlbC5zZXRUZXh0KG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKExhYmVsIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV1BGaWd1cmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV1BGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJhMTBjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dQRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0Qm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5Lkluc2V0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdQRmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQotCXB1YmxpYyBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCgpOwotCi0JcHVibGljIFdQRmlndXJlKExhYmVsIGwpIHsKLQkJc3VwZXIoKTsKLQkJYWRkKGwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGcpIHsKLQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBnZXRDbGllbnRBcmVhKCk7Ci0JCVJlY3RhbmdsZSBiYXIgPSBjbGllbnRBcmVhLmdldENvcHkoKTsKLQkJYmFyLmNyb3AobmV3IEluc2V0cygwLCA1LCA1LCA1KSk7Ci0JCWcuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmdyYXkpOwotCQlnLmZpbGxSZWN0YW5nbGUoYmFyLmdldFRyYW5zbGF0ZWQoNiwgNikpOwotCQlnLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy55ZWxsb3cpOwotCQlnLmZpbGxSZWN0YW5nbGUoYmFyKTsKLQkJZy5zZXRMaW5lU3R5bGUoMik7Ci0JCWcuc2V0TGluZVdpZHRoKDEpOwotCQlzdXBlci5wYWludEZpZ3VyZShnKTsKLQl9Ci0KLQlwdWJsaWMgTGFiZWwgZ2V0RmlndXJlKCkgewotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWxOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWxhYmVsLnNldFRleHQobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoTGFiZWwgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotCWNsYXNzIEJveCBleHRlbmRzIEZpZ3VyZSB7Ci0JCXB1YmxpYyBCb3goSW5zZXRzIGluc2V0cykgewotCQkJc2V0Qm9yZGVyKG5ldyBCb3hCb3JkZXIoaW5zZXRzKSk7Ci0JCQlUb29sYmFyTGF5b3V0IHRvb2xiYXJMYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dCgpOwotCQkJdG9vbGJhckxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKGZhbHNlKTsKLQkJCXNldExheW91dE1hbmFnZXIodG9vbGJhckxheW91dCk7Ci0JCQlzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMucmVkKTsKLQotCQl9Ci0KLQkJcHJpdmF0ZSBjbGFzcyBCb3hCb3JkZXIgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlciB7Ci0KLQkJCXB1YmxpYyBJbnNldHMgaW5zZXRzID0gbmV3IEluc2V0cygxLCAwLCAwLCAwKTsKLQotCQkJcHVibGljIEJveEJvcmRlcihJbnNldHMgaW5zZXRzKSB7Ci0JCQkJdGhpcy5pbnNldHMgPSBpbnNldHM7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQm9yZGVyI2dldEluc2V0cyhJRmlndXJlKQotCQkJICovCi0JCQlwdWJsaWMgSW5zZXRzIGdldEluc2V0cyhJRmlndXJlIGZpZ3VyZSkgewotCQkJCXJldHVybiBpbnNldHM7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQm9yZGVyI3BhaW50KElGaWd1cmUsIEdyYXBoaWNzLCBJbnNldHMpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHBhaW50KElGaWd1cmUgZmlndXJlLCBHcmFwaGljcyBncmFwaGljcywgSW5zZXRzIGluc2V0cykgewotCQkJCVJlY3RhbmdsZSByZWN0ID0gZ2V0UGFpbnRSZWN0YW5nbGUoZmlndXJlLCBpbnNldHMpOwotCQkJCWdyYXBoaWNzLmRyYXdMaW5lKHJlY3QuZ2V0VG9wTGVmdCgpLCByZWN0LmdldFRvcFJpZ2h0KCkpOwotCQkJfQotCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV3JhcExhYmVsbkltYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dyYXBMYWJlbG5JbWFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjgwZGY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV3JhcExhYmVsbkltYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSW1hZ2VGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQudGV4dC5GbG93UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQudGV4dC5QYXJhZ3JhcGhUZXh0TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC50ZXh0LlRleHRGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXcmFwTGFiZWxuSW1hZ2UgZXh0ZW5kcyBGaWd1cmUgewotCi0JLy8gVGhlIGlubmVyIFRleHRGbG93Ci0JcHJpdmF0ZSBUZXh0RmxvdyB0ZXh0RmxvdzsKLQotCXByaXZhdGUgSW1hZ2UgaW1hZ2U7Ci0KLQlwdWJsaWMgV3JhcExhYmVsbkltYWdlKEltYWdlIGltYWdlKSB7Ci0JCXNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDMpKTsKLQkJSW1hZ2VGaWd1cmUgZmlnID0gbmV3IEltYWdlRmlndXJlKCk7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQkJZmlnLnNldEltYWdlKGltYWdlKTsKLQkJYWRkKGZpZyk7Ci0JCUZsb3dQYWdlIGZsb3dQYWdlID0gbmV3IEZsb3dQYWdlKCk7Ci0KLQkJdGV4dEZsb3cgPSBuZXcgVGV4dEZsb3coKTsKLQotCQl0ZXh0Rmxvdy5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBQYXJhZ3JhcGhUZXh0TGF5b3V0KHRleHRGbG93LAotCQkJCVBhcmFncmFwaFRleHRMYXlvdXQuV09SRF9XUkFQX1NPRlQpKTsKLQkJCi0JCWZsb3dQYWdlLmFkZCh0ZXh0Rmxvdyk7Ci0JCWZsb3dQYWdlLnNldFNpemUoNDAsNDApOwotCi0JCXNldExheW91dE1hbmFnZXIobmV3IFRvb2xiYXJMYXlvdXQoKSk7Ci0JCWFkZChmbG93UGFnZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IGluc2lkZSB0aGUgVGV4dEZsb3cuCi0JICogCi0JICogQHJldHVybiB0aGUgdGV4dCBmbG93IGluc2lkZSB0aGUgdGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0Rmxvdy5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGV4dCBvZiB0aGUgVGV4dEZsb3cgdG8gdGhlIGdpdmVuIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBuZXdUZXh0Ci0JICogICAgICAgICAgICB0aGUgbmV3IHRleHQgdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgbmV3VGV4dCkgewotCQl0ZXh0Rmxvdy5zZXRUZXh0KG5ld1RleHQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaW1hZ2UuCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGltYWdlCi0JICogICAgICAgICAgICBUaGUgaW1hZ2UgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlKEltYWdlIGltYWdlKSB7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQl9Ci0JcHVibGljIFRleHRGbG93IGdldFRleHRGbG93KCl7Ci0JCXJldHVybiB0ZXh0RmxvdzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV3JhcHBhYmxlTGFiZWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvV3JhcHBhYmxlTGFiZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU4NzNjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dyYXBwYWJsZUxhYmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuSW5zZXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkJyZWFrSXRlcmF0b3I7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgdGV4dCB3cmFwIGluIGEgbGFiZWwuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBXcmFwcGFibGVMYWJlbCBleHRlbmRzIEZpZ3VyZSBpbXBsZW1lbnRzIFBvc2l0aW9uQ29uc3RhbnRzIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBFTExJUFNJUyA9ICIuLi4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEltYWdlIGljb247Ci0KLQlwcml2YXRlIFN0cmluZyB0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIHN1YlN0cmluZ1RleHQ7Ci0KLQlwcml2YXRlIERpbWVuc2lvbiB0ZXh0U2l6ZTsKLQotCXByaXZhdGUgRGltZW5zaW9uIHN1YlN0cmluZ1RleHRTaXplOwotCi0JcHJpdmF0ZSBEaW1lbnNpb24gaWNvblNpemUgPSBuZXcgRGltZW5zaW9uKDAsIDApOwotCi0JcHJpdmF0ZSBQb2ludCBpY29uTG9jYXRpb247Ci0KLQlwcml2YXRlIFBvaW50IHRleHRMb2NhdGlvbjsKLQotCXByaXZhdGUgaW50IHRleHRBbGlnbm1lbnQgPSBDRU5URVI7Ci0KLQlwcml2YXRlIGludCBpY29uQWxpZ25tZW50ID0gQ0VOVEVSOwotCi0JcHJpdmF0ZSBpbnQgbGFiZWxBbGlnbm1lbnQgPSBDRU5URVI7Ci0KLQlwcml2YXRlIGludCB0ZXh0UGxhY2VtZW50ID0gU09VVEg7Ci0KLQlwcml2YXRlIGludCBpY29uVGV4dEdhcCA9IDM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TRUxFQ1RFRCA9IE1BWF9GTEFHIDw8IDEsCi0JCQlGTEFHX0hBU0ZPQ1VTID0gTUFYX0ZMQUcgPDwgMiwgRkxBR19XUkFQID0gTUFYX0ZMQUcgPDwgNSwKLQkJCUZMQUdfV1JBUF9BTElHTiA9IE1BWF9GTEFHIDw8IDY7Ci0KLQkvLyBUaGUgcHJpbWFyeSBkaW1lbnNpb25zIHVzZWQgdG8gY2FsY3VsYXRlIHRleHQgc2l6ZS4KLQlwcml2YXRlIERpbWVuc2lvbiB0ZXh0RGltZW5zaW9uID0gbmV3IERpbWVuc2lvbigtMSwgLTEpOwotCi0JcHJpdmF0ZSBEaW1lbnNpb24gcHJlZlNpemVEaW1lbnNpb24gPSBuZXcgRGltZW5zaW9uKC0xLCAtMSk7Ci0KLQlwcml2YXRlIGludCB3cmFwV2lkdGg7Ci0KLQlwdWJsaWMgV3JhcHBhYmxlTGFiZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgTGFiZWwgd2l0aCBwYXNzZWQgU3RyaW5nIGFzIGl0cyB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICB0aGUgbGFiZWwgdGV4dAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgV3JhcHBhYmxlTGFiZWwoU3RyaW5nIHMpIHsKLQkJc2V0VGV4dChzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBXcmFwcGVkTGFiZWwgd2l0aCBwYXNzZWQgSW1hZ2UgYXMgaXRzIGljb24uCi0JICogCi0JICogQHBhcmFtIGkKLQkgKiAgICAgICAgICAgIHRoZSBXcmFwcGVkTGFiZWwgaW1hZ2UKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFdyYXBwYWJsZUxhYmVsKEltYWdlIGkpIHsKLQkJc2V0SWNvbihpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBXcmFwcGVkTGFiZWwgd2l0aCBwYXNzZWQgU3RyaW5nIGFzIHRleHQgYW5kIHBhc3NlZCBJbWFnZSBhcwotCSAqIGl0cyBpY29uLgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICB0aGUgV3JhcHBlZExhYmVsIHRleHQKLQkgKiBAcGFyYW0gaQotCSAqICAgICAgICAgICAgdGhlIFdyYXBwZWRMYWJlbCBpbWFnZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgV3JhcHBhYmxlTGFiZWwoU3RyaW5nIHMsIEltYWdlIGkpIHsKLQkJc2V0VGV4dChzKTsKLQkJc2V0SWNvbihpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWxpZ25PbkhlaWdodChQb2ludCBsb2MsIERpbWVuc2lvbiBzaXplLCBpbnQgYWxpZ25tZW50KSB7Ci0JCUluc2V0cyBpbnNldHMgPSBnZXRJbnNldHMoKTsKLQkJc3dpdGNoIChhbGlnbm1lbnQpIHsKLQkJY2FzZSBUT1A6Ci0JCQlsb2MueSA9IGluc2V0cy50b3A7Ci0JCQlicmVhazsKLQkJY2FzZSBCT1RUT006Ci0JCQlsb2MueSA9IGJvdW5kcy5oZWlnaHQgLSBzaXplLmhlaWdodCAtIGluc2V0cy5ib3R0b207Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWxvYy55ID0gKGJvdW5kcy5oZWlnaHQgLSBzaXplLmhlaWdodCkgLyAyOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFsaWduT25XaWR0aChQb2ludCBsb2MsIERpbWVuc2lvbiBzaXplLCBpbnQgYWxpZ25tZW50KSB7Ci0JCUluc2V0cyBpbnNldHMgPSBnZXRJbnNldHMoKTsKLQkJc3dpdGNoIChhbGlnbm1lbnQpIHsKLQkJY2FzZSBMRUZUOgotCQkJbG9jLnggPSBpbnNldHMubGVmdDsKLQkJCWJyZWFrOwotCQljYXNlIFJJR0hUOgotCQkJbG9jLnggPSBib3VuZHMud2lkdGggLSBzaXplLndpZHRoIC0gaW5zZXRzLnJpZ2h0OwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlsb2MueCA9IChib3VuZHMud2lkdGggLSBzaXplLndpZHRoKSAvIDI7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlQWxpZ25tZW50KCkgewotCQlzd2l0Y2ggKHRleHRQbGFjZW1lbnQpIHsKLQkJY2FzZSBFQVNUOgotCQljYXNlIFdFU1Q6Ci0JCQlhbGlnbk9uSGVpZ2h0KHRleHRMb2NhdGlvbiwgZ2V0VGV4dFNpemUoKSwgdGV4dEFsaWdubWVudCk7Ci0JCQlhbGlnbk9uSGVpZ2h0KGljb25Mb2NhdGlvbiwgaWNvblNpemUsIGljb25BbGlnbm1lbnQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTk9SVEg6Ci0JCWNhc2UgU09VVEg6Ci0JCQlhbGlnbk9uV2lkdGgodGV4dExvY2F0aW9uLCBnZXRTdWJTdHJpbmdUZXh0U2l6ZSgpLCB0ZXh0QWxpZ25tZW50KTsKLQkJCWFsaWduT25XaWR0aChpY29uTG9jYXRpb24sIGljb25TaXplLCBpY29uQWxpZ25tZW50KTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlcyB0aGUgc2l6ZSBvZiB0aGUgV3JhcHBlZExhYmVsIHVzaW5nIHRoZSBwYXNzZWQgRGltZW5zaW9uIGFzIHRoZQotCSAqIHNpemUgb2YgdGhlIFdyYXBwZWRMYWJlbCdzIHRleHQuCi0JICogCi0JICogQHBhcmFtIHR4dFNpemUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVjYWxjdWxhdGVkIHNpemUgb2YgdGhlIFdyYXBwZWRMYWJlbCdzIHRleHQKLQkgKiBAcmV0dXJuIHRoZSBXcmFwcGVkTGFiZWwncyBzaXplCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlTGFiZWxTaXplKERpbWVuc2lvbiB0eHRTaXplKSB7Ci0JCWludCBnYXAgPSBpY29uVGV4dEdhcDsKLQkJaWYgKGdldEljb24oKSA9PSBudWxsIHx8IGdldFRleHQoKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQlnYXAgPSAwOwotCQlEaW1lbnNpb24gZCA9IG5ldyBEaW1lbnNpb24oMCwgMCk7Ci0JCWlmICh0ZXh0UGxhY2VtZW50ID09IFdFU1QgfHwgdGV4dFBsYWNlbWVudCA9PSBFQVNUKSB7Ci0JCQlkLndpZHRoID0gaWNvblNpemUud2lkdGggKyBnYXAgKyB0eHRTaXplLndpZHRoOwotCQkJZC5oZWlnaHQgPSBNYXRoLm1heChpY29uU2l6ZS5oZWlnaHQsIHR4dFNpemUuaGVpZ2h0KTsKLQkJfSBlbHNlIHsKLQkJCWQud2lkdGggPSBNYXRoLm1heChpY29uU2l6ZS53aWR0aCwgdHh0U2l6ZS53aWR0aCk7Ci0JCQlkLmhlaWdodCA9IGljb25TaXplLmhlaWdodCArIGdhcCArIHR4dFNpemUuaGVpZ2h0OwotCQl9Ci0JCXJldHVybiBkOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVMb2NhdGlvbnMoKSB7Ci0JCXRleHRMb2NhdGlvbiA9IG5ldyBQb2ludCgpOwotCQlpY29uTG9jYXRpb24gPSBuZXcgUG9pbnQoKTsKLQotCQljYWxjdWxhdGVQbGFjZW1lbnQoKTsKLQkJY2FsY3VsYXRlQWxpZ25tZW50KCk7Ci0JCURpbWVuc2lvbiBvZmZzZXQgPSBnZXRTaXplKCkuZ2V0RGlmZmVyZW5jZShnZXRQcmVmZXJyZWRTaXplKCkpOwotCQlvZmZzZXQud2lkdGggKz0gZ2V0VGV4dFNpemUoKS53aWR0aCAtIGdldFN1YlN0cmluZ1RleHRTaXplKCkud2lkdGg7Ci0JCXN3aXRjaCAobGFiZWxBbGlnbm1lbnQpIHsKLQkJY2FzZSBDRU5URVI6Ci0JCQlvZmZzZXQuc2NhbGUoMC41Zik7Ci0JCQlicmVhazsKLQkJY2FzZSBMRUZUOgotCQkJb2Zmc2V0LnNjYWxlKDAuMGYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUklHSFQ6Ci0JCQlvZmZzZXQuc2NhbGUoMS4wZik7Ci0JCQlicmVhazsKLQkJY2FzZSBUT1A6Ci0JCQlvZmZzZXQuaGVpZ2h0ID0gMDsKLQkJCW9mZnNldC5zY2FsZSgwLjVmKTsKLQkJCWJyZWFrOwotCQljYXNlIEJPVFRPTToKLQkJCW9mZnNldC5oZWlnaHQgPSBvZmZzZXQuaGVpZ2h0ICogMjsKLQkJCW9mZnNldC5zY2FsZSgwLjVmKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJb2Zmc2V0LnNjYWxlKDAuNWYpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzd2l0Y2ggKHRleHRQbGFjZW1lbnQpIHsKLQkJY2FzZSBFQVNUOgotCQljYXNlIFdFU1Q6Ci0JCQlvZmZzZXQuaGVpZ2h0ID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIE5PUlRIOgotCQljYXNlIFNPVVRIOgotCQkJb2Zmc2V0LndpZHRoID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJdGV4dExvY2F0aW9uLnRyYW5zbGF0ZShvZmZzZXQpOwotCQlpY29uTG9jYXRpb24udHJhbnNsYXRlKG9mZnNldCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVBsYWNlbWVudCgpIHsKLQkJaW50IGdhcCA9IGljb25UZXh0R2FwOwotCQlpZiAoaWNvbiA9PSBudWxsIHx8IHRleHQuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJZ2FwID0gMDsKLQkJSW5zZXRzIGluc2V0cyA9IGdldEluc2V0cygpOwotCi0JCXN3aXRjaCAodGV4dFBsYWNlbWVudCkgewotCQljYXNlIEVBU1Q6Ci0JCQlpY29uTG9jYXRpb24ueCA9IGluc2V0cy5sZWZ0OwotCQkJdGV4dExvY2F0aW9uLnggPSBpY29uU2l6ZS53aWR0aCArIGdhcCArIGluc2V0cy5sZWZ0OwotCQkJYnJlYWs7Ci0JCWNhc2UgV0VTVDoKLQkJCXRleHRMb2NhdGlvbi54ID0gaW5zZXRzLmxlZnQ7Ci0JCQlpY29uTG9jYXRpb24ueCA9IGdldFN1YlN0cmluZ1RleHRTaXplKCkud2lkdGggKyBnYXAgKyBpbnNldHMubGVmdDsKLQkJCWJyZWFrOwotCQljYXNlIE5PUlRIOgotCQkJdGV4dExvY2F0aW9uLnkgPSBpbnNldHMudG9wOwotCQkJaWNvbkxvY2F0aW9uLnkgPSBnZXRUZXh0U2l6ZSgpLmhlaWdodCArIGdhcCArIGluc2V0cy50b3A7Ci0JCQlicmVhazsKLQkJY2FzZSBTT1VUSDoKLQkJCXRleHRMb2NhdGlvbi55ID0gaWNvblNpemUuaGVpZ2h0ICsgZ2FwICsgaW5zZXRzLnRvcDsKLQkJCWljb25Mb2NhdGlvbi55ID0gaW5zZXRzLnRvcDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZXMgdGhlIHNpemUgb2YgdGhlIExhYmVsJ3MgdGV4dCBzaXplLiBUaGUgdGV4dCBzaXplIGNhbGN1bGF0ZWQKLQkgKiB0YWtlcyBpbnRvIGNvbnNpZGVyYXRpb24gaWYgdGhlIExhYmVsJ3MgdGV4dCBpcyBjdXJyZW50bHkgdHJ1bmNhdGVkLiBJZgotCSAqIHRleHQgc2l6ZSB3aXRob3V0IGNvbnNpZGVyaW5nIGN1cnJlbnQgdHJ1bmNhdGlvbiBpcyBkZXNpcmVkLCB1c2UKLQkgKiB7QGxpbmsgI2NhbGN1bGF0ZVRleHRTaXplKCl9LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxhYmVsJ3MgdGV4dCwgdGFraW5nIGludG8gYWNjb3VudCB0cnVuY2F0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlU3ViU3RyaW5nVGV4dFNpemUoKSB7Ci0JCXJldHVybiBGaWd1cmVVdGlsaXRpZXMuZ2V0VGV4dEV4dGVudHMoZ2V0U3ViU3RyaW5nVGV4dCgpLCBnZXRGb250KCkpOwotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZXMgYW5kIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIExhYmVsJ3MgdGV4dC4gTm90ZSB0aGF0IHRoaXMKLQkgKiBEaW1lbnNpb24gaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgTGFiZWwncyBmdWxsIHRleHQsIHJlZ2FyZGxlc3Mgb2YKLQkgKiB3aGV0aGVyIG9yIG5vdCBpdHMgdGV4dCBpcyBjdXJyZW50bHkgdHJ1bmNhdGVkLiBJZiB0ZXh0IHNpemUgY29uc2lkZXJpbmcKLQkgKiBjdXJyZW50IHRydW5jYXRpb24gaXMgZGVzaXJlZCwgdXNlIHtAbGluayAjY2FsY3VsYXRlU3ViU3RyaW5nVGV4dFNpemUoKX0uCi0JICogCi0JICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbGFiZWwncyB0ZXh0LCBpZ25vcmluZyB0cnVuY2F0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlVGV4dFNpemUoKSB7Ci0JCS8vIHJldHVybiBGaWd1cmVVdGlsaXRpZXMuZ2V0VGV4dEV4dGVudHMoZ2V0VGV4dCgpLCBnZXRGb250KCkpOwotCQlyZXR1cm4gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKGdldFdyYXBwZWRUZXh0KGdldFNpemUoKS53aWR0aCwKLQkJCQlnZXRTaXplKCkuaGVpZ2h0KSwgZ2V0Rm9udCgpKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckxvY2F0aW9ucygpIHsKLQkJaWNvbkxvY2F0aW9uID0gdGV4dExvY2F0aW9uID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBMYWJlbCdzIGljb24uCi0JICogCi0JICogQHJldHVybiB0aGUgbGFiZWwgaWNvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SWNvbigpIHsKLQkJcmV0dXJuIGljb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBhbGlnbm1lbnQgb2YgdGhlIExhYmVsJ3MgaWNvbi4gVGhlIGRlZmF1bHQgaXMKLQkgKiB7QGxpbmsgUG9zaXRpb25Db25zdGFudHMjQ0VOVEVSfS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpY29uIGFsaWdubWVudAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEljb25BbGlnbm1lbnQoKSB7Ci0JCXJldHVybiBpY29uQWxpZ25tZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJvdW5kcyBvZiB0aGUgTGFiZWwncyBpY29uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGljb24ncyBib3VuZHMKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFJlY3RhbmdsZSBnZXRJY29uQm91bmRzKCkgewotCQlSZWN0YW5nbGUgYm91bmRzID0gZ2V0Qm91bmRzKCk7Ci0JCXJldHVybiBuZXcgUmVjdGFuZ2xlKGJvdW5kcy5nZXRMb2NhdGlvbigpLnRyYW5zbGF0ZShnZXRJY29uTG9jYXRpb24oKSksCi0JCQkJaWNvblNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBMYWJlbCdzIGljb24gcmVsYXRpdmUgdG8gdGhlIExhYmVsLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGljb24ncyBsb2NhdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0SWNvbkxvY2F0aW9uKCkgewotCQlpZiAoaWNvbkxvY2F0aW9uID09IG51bGwpCi0JCQljYWxjdWxhdGVMb2NhdGlvbnMoKTsKLQkJcmV0dXJuIGljb25Mb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBnYXAgaW4gcGl4ZWxzIGJldHdlZW4gdGhlIExhYmVsJ3MgaWNvbiBhbmQgaXRzIHRleHQuCi0JICogCi0JICogQHJldHVybiB0aGUgZ2FwCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SWNvblRleHRHYXAoKSB7Ci0JCXJldHVybiBpY29uVGV4dEdhcDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElGaWd1cmUjZ2V0TWluaW11bVNpemUoaW50LCBpbnQpCi0JICovCi0JcHVibGljIERpbWVuc2lvbiBnZXRNaW5pbXVtU2l6ZShpbnQgdywgaW50IGgpIHsKLQkJaWYgKG1pblNpemUgIT0gbnVsbCkKLQkJCXJldHVybiBtaW5TaXplOwotCQltaW5TaXplID0gbmV3IERpbWVuc2lvbigpOwotCQlpZiAoZ2V0TGF5b3V0TWFuYWdlcigpICE9IG51bGwpCi0JCQltaW5TaXplLnNldFNpemUoZ2V0TGF5b3V0TWFuYWdlcigpLmdldE1pbmltdW1TaXplKHRoaXMsIHcsIGgpKTsKLQotCQlEaW1lbnNpb24gbGFiZWxTaXplID0gY2FsY3VsYXRlTGFiZWxTaXplKEZpZ3VyZVV0aWxpdGllcwotCQkJCS5nZXRUZXh0RXh0ZW50cyhFTExJUFNJUywgZ2V0Rm9udCgpKS5pbnRlcnNlY3QoCi0JCQkJCQlGaWd1cmVVdGlsaXRpZXMuZ2V0VGV4dEV4dGVudHMoZ2V0VGV4dCgpLCBnZXRGb250KCkpKSk7Ci0JCUluc2V0cyBpbnNldHMgPSBnZXRJbnNldHMoKTsKLQkJbGFiZWxTaXplLmV4cGFuZChpbnNldHMuZ2V0V2lkdGgoKSwgaW5zZXRzLmdldEhlaWdodCgpKTsKLQkJbWluU2l6ZS51bmlvbihsYWJlbFNpemUpOwotCQlyZXR1cm4gbWluU2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElGaWd1cmUjZ2V0UHJlZmVycmVkU2l6ZShpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgRGltZW5zaW9uIGdldFByZWZlcnJlZFNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQpIHsKLQkJaWYgKHByZWZTaXplID09IG51bGwgfHwgd0hpbnQgIT0gcHJlZlNpemVEaW1lbnNpb24ud2lkdGgKLQkJCQl8fCBoSGludCAhPSBwcmVmU2l6ZURpbWVuc2lvbi5oZWlnaHQpIHsKLQkJCXByZWZTaXplID0gY2FsY3VsYXRlTGFiZWxTaXplKGdldFRleHRTaXplKHdIaW50LCBoSGludCkpOwotCQkJSW5zZXRzIGluc2V0cyA9IGdldEluc2V0cygpOwotCQkJcHJlZlNpemUuZXhwYW5kKGluc2V0cy5nZXRXaWR0aCgpLCBpbnNldHMuZ2V0SGVpZ2h0KCkpOwotCQkJaWYgKGdldExheW91dE1hbmFnZXIoKSAhPSBudWxsKQotCQkJCXByZWZTaXplLnVuaW9uKGdldExheW91dE1hbmFnZXIoKS5nZXRQcmVmZXJyZWRTaXplKHRoaXMsIHdIaW50LAotCQkJCQkJaEhpbnQpKTsKLQkJfQotCQlpZiAod0hpbnQgPj0gMCAmJiB3SGludCA8IHByZWZTaXplLndpZHRoKSB7Ci0JCQlEaW1lbnNpb24gbWluU2l6ZSA9IGdldE1pbmltdW1TaXplKHdIaW50LCBoSGludCk7Ci0JCQlEaW1lbnNpb24gcmVzdWx0ID0gcHJlZlNpemUuZ2V0Q29weSgpOwotCQkJcmVzdWx0LndpZHRoID0gTWF0aC5taW4ocmVzdWx0LndpZHRoLCB3SGludCk7Ci0JCQlyZXN1bHQud2lkdGggPSBNYXRoLm1heChtaW5TaXplLndpZHRoLCByZXN1bHQud2lkdGgpOwotCQkJcHJlZlNpemVEaW1lbnNpb24ud2lkdGggPSByZXN1bHQud2lkdGg7Ci0JCQlwcmVmU2l6ZURpbWVuc2lvbi5oZWlnaHQgPSByZXN1bHQud2lkdGg7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBwcmVmU2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIHRoZSBhbW91bnQgb2YgdGhlIExhYmVsJ3MgY3VycmVudCB0ZXh0IHdpbGwgZml0IGluIHRoZSBMYWJlbCwKLQkgKiBpbmNsdWRpbmcgYW4gZWxpcHNpcyAiLi4uIiBpZiB0cnVuY2F0aW9uIGlzIHJlcXVpcmVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHN1YnN0cmluZwotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN1YlN0cmluZ1RleHQoKSB7Ci0JCWlmIChzdWJTdHJpbmdUZXh0ICE9IG51bGwpCi0JCQlyZXR1cm4gc3ViU3RyaW5nVGV4dDsKLQotCQlzdWJTdHJpbmdUZXh0ID0gdGV4dDsKLQkJRGltZW5zaW9uIHNocmluayA9IGdldFByZWZlcnJlZFNpemUoZ2V0U2l6ZSgpLndpZHRoLCBnZXRTaXplKCkuaGVpZ2h0KQotCQkJCS5nZXREaWZmZXJlbmNlKGdldFNpemUoKSk7Ci0JCURpbWVuc2lvbiBlZmZlY3RpdmVTaXplID0gZ2V0VGV4dFNpemUoKS5nZXRFeHBhbmRlZCgtc2hyaW5rLndpZHRoLAotCQkJCS1zaHJpbmsuaGVpZ2h0KTsKLQkJRm9udCBjdXJyZW50Rm9udCA9IGdldEZvbnQoKTsKLQkJaW50IGZvbnRIZWlnaHQgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3MoY3VycmVudEZvbnQpCi0JCQkJLmdldEhlaWdodCgpOwotCQlpbnQgbWF4TGluZXMgPSAoaW50KSAoZWZmZWN0aXZlU2l6ZS5oZWlnaHQgLyAoZG91YmxlKSBmb250SGVpZ2h0KTsKLQotCQlTdHJpbmdCdWZmZXIgYWNjdW1sYXRlZFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ0J1ZmZlciByZW1haW5pbmdUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRUZXh0KCkpOwotCQlpbnQgaSA9IDAsIGogPSAwOwotCi0JCXdoaWxlIChyZW1haW5pbmdUZXh0Lmxlbmd0aCgpID4gMCAmJiBqKysgPCBtYXhMaW5lcykgewotCQkJaSA9IGdldExpbmVXcmFwUG9zaXRpb24ocmVtYWluaW5nVGV4dC50b1N0cmluZygpLCBjdXJyZW50Rm9udCwKLQkJCQkJZWZmZWN0aXZlU2l6ZS53aWR0aCk7Ci0KLQkJCWlmIChhY2N1bWxhdGVkVGV4dC5sZW5ndGgoKSA+IDApCi0JCQkJYWNjdW1sYXRlZFRleHQuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCWlmIChpID09IDAgfHwgKHJlbWFpbmluZ1RleHQubGVuZ3RoKCkgPiBpICYmIGogPT0gbWF4TGluZXMpKSB7Ci0JCQkJaW50IGRvdHNXaWR0aCA9IEZpZ3VyZVV0aWxpdGllcy5nZXRUZXh0RXh0ZW50cyhFTExJUFNJUywKLQkJCQkJCWN1cnJlbnRGb250KS53aWR0aDsKLQkJCQlpID0gZ2V0TGFyZ2VzdFN1YnN0cmluZ0NvbmZpbmVkVG8ocmVtYWluaW5nVGV4dC50b1N0cmluZygpLAotCQkJCQkJY3VycmVudEZvbnQsIE1hdGgubWF4KGVmZmVjdGl2ZVNpemUud2lkdGggLSBkb3RzV2lkdGgsCi0JCQkJCQkJCTApKTsKLQkJCQlhY2N1bWxhdGVkVGV4dC5hcHBlbmQocmVtYWluaW5nVGV4dC5zdWJzdHJpbmcoMCwgaSkpOwotCQkJCWFjY3VtbGF0ZWRUZXh0LmFwcGVuZChFTExJUFNJUyk7Ci0JCQl9IGVsc2UKLQkJCQlhY2N1bWxhdGVkVGV4dC5hcHBlbmQocmVtYWluaW5nVGV4dC5zdWJzdHJpbmcoMCwgaSkpOwotCQkJcmVtYWluaW5nVGV4dC5kZWxldGUoMCwgaSk7Ci0JCX0KLQkJcmV0dXJuIHN1YlN0cmluZ1RleHQgPSBhY2N1bWxhdGVkVGV4dC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIExhYmVsJ3MgY3VycmVudCB0ZXh0LiBJZiB0aGUgdGV4dCBpcyBjdXJyZW50bHkKLQkgKiB0cnVuY2F0ZWQsIHRoZSB0cnVuY2F0ZWQgdGV4dCB3aXRoIGl0cyBlbGxpcHNpcyBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUKLQkgKiBzaXplLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhpcyBsYWJlbCdzIHRleHQsIHRha2luZyBpbnRvIGFjY291bnQgdHJ1bmNhdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIGdldFN1YlN0cmluZ1RleHRTaXplKCkgewotCQlpZiAoc3ViU3RyaW5nVGV4dFNpemUgPT0gbnVsbCkKLQkJCXN1YlN0cmluZ1RleHRTaXplID0gY2FsY3VsYXRlU3ViU3RyaW5nVGV4dFNpemUoKTsKLQkJcmV0dXJuIHN1YlN0cmluZ1RleHRTaXplOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgb2YgdGhlIGxhYmVsLiBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGUKLQkgKiBsYWJlbCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGN1cnJlbnRseSBiZWluZyB0cnVuY2F0ZWQuIENhbGwKLQkgKiB7QGxpbmsgI2dldFN1YlN0cmluZ1RleHQoKX0gdG8gcmV0dXJuIHRoZSBsYWJlbCdzIGN1cnJlbnQgdGV4dCBjb250ZW50cwotCSAqIHdpdGggdHJ1bmNhdGlvbiBjb25zaWRlcmVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBsYWJlbAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgYWxpZ25tZW50IG9mIHRoZSBMYWJlbCdzIHRleHQuIFRoZSBkZWZhdWx0IHRleHQKLQkgKiBhbGlnbm1lbnQgaXMge0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0NFTlRFUn0uCi0JICogCi0JICogQHJldHVybiB0aGUgdGV4dCBhbGlnbm1lbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRBbGlnbm1lbnQoKSB7Ci0JCXJldHVybiB0ZXh0QWxpZ25tZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJvdW5kcyBvZiB0aGUgbGFiZWwncyB0ZXh0LiBOb3RlIHRoYXQgdGhlIGJvdW5kcyBhcmUKLQkgKiBjYWxjdWxhdGVkIHVzaW5nIHRoZSBsYWJlbCdzIGNvbXBsZXRlIHRleHQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZQotCSAqIGxhYmVsJ3MgdGV4dCBpcyBjdXJyZW50bHkgdHJ1bmNhdGVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJvdW5kcyBvZiB0aGlzIGxhYmVsJ3MgY29tcGxldGUgdGV4dAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgUmVjdGFuZ2xlIGdldFRleHRCb3VuZHMoKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBnZXRCb3VuZHMoKTsKLQkJcmV0dXJuIG5ldyBSZWN0YW5nbGUoYm91bmRzLmdldExvY2F0aW9uKCkudHJhbnNsYXRlKGdldFRleHRMb2NhdGlvbigpKSwKLQkJCQl0ZXh0U2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIGxhYmVsJ3MgdGV4dCByZWxhdGl2ZSB0byB0aGUgbGFiZWwuCi0JICogCi0JICogQHJldHVybiB0aGUgdGV4dCBsb2NhdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0VGV4dExvY2F0aW9uKCkgewotCQlpZiAodGV4dExvY2F0aW9uICE9IG51bGwpCi0JCQlyZXR1cm4gdGV4dExvY2F0aW9uOwotCQljYWxjdWxhdGVMb2NhdGlvbnMoKTsKLQkJcmV0dXJuIHRleHRMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBsYWNlbWVudCBvZiB0aGUgbGFiZWwncyB0ZXh0IHJlbGF0aXZlIHRvIGl0cyBpY29uLgotCSAqIFRoZSBkZWZhdWx0IHRleHQgcGxhY2VtZW50IGlzIHtAbGluayBQb3NpdGlvbkNvbnN0YW50cyNFQVNUfS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IHBsYWNlbWVudAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRQbGFjZW1lbnQoKSB7Ci0JCXJldHVybiB0ZXh0UGxhY2VtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGxhYmVsJ3MgY29tcGxldGUgdGV4dC4gTm90ZSB0aGF0IHRoZSB0ZXh0IHVzZWQgdG8KLQkgKiBtYWtlIHRoaXMgY2FsY3VsYXRpb24gaXMgdGhlIGxhYmVsJ3MgZnVsbCB0ZXh0LCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlCi0JICogbGFiZWwncyB0ZXh0IGlzIGN1cnJlbnRseSBiZWluZyB0cnVuY2F0ZWQgYW5kIGlzIGRpc3BsYXlpbmcgYW4gZWxsaXBzaXMuCi0JICogSWYgdGhlIHNpemUgY29uc2lkZXJpbmcgY3VycmVudCB0cnVuY2F0aW9uIGlzIGRlc2lyZWQsIGNhbGwKLQkgKiB7QGxpbmsgI2dldFN1YlN0cmluZ1RleHRTaXplKCl9LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhpcyBsYWJlbCdzIGNvbXBsZXRlIHRleHQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIERpbWVuc2lvbiBnZXRUZXh0U2l6ZSgpIHsKLQkJaWYgKHRleHRTaXplID09IG51bGwpCi0JCQl0ZXh0U2l6ZSA9IGNhbGN1bGF0ZVRleHRTaXplKCk7Ci0JCXJldHVybiB0ZXh0U2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBsYWJlbCdzIGNvbXBsZXRlIHRleHQuIE5vdGUgdGhhdCB0aGUgdGV4dCB1c2VkIHRvCi0JICogbWFrZSB0aGlzIGNhbGN1bGF0aW9uIGlzIHRoZSBsYWJlbCdzIGZ1bGwgdGV4dCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZQotCSAqIGxhYmVsJ3MgdGV4dCBpcyBjdXJyZW50bHkgYmVpbmcgdHJ1bmNhdGVkIGFuZCBpcyBkaXNwbGF5aW5nIGFuIGVsbGlwc2lzLgotCSAqIElmIHRoZSBzaXplIGNvbnNpZGVyaW5nIGN1cnJlbnQgdHJ1bmNhdGlvbiBpcyBkZXNpcmVkLCBjYWxsCi0JICoge0BsaW5rICNnZXRTdWJTdHJpbmdUZXh0U2l6ZSgpfS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoaXMgbGFiZWwncyBjb21wbGV0ZSB0ZXh0Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXByb3RlY3RlZCBEaW1lbnNpb24gZ2V0VGV4dFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCWlmICh0ZXh0U2l6ZSA9PSBudWxsKSB7Ci0JCQl0ZXh0U2l6ZSA9IGNhbGN1bGF0ZVRleHRTaXplKHdpZHRoLCBoZWlnaHQpOwotCQkJdGV4dERpbWVuc2lvbi53aWR0aCA9IHdpZHRoOwotCQkJdGV4dERpbWVuc2lvbi5oZWlnaHQgPSBoZWlnaHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHRTaXplOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUZpZ3VyZSNpbnZhbGlkYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKCkgewotCQlwcmVmU2l6ZSA9IG51bGw7Ci0JCW1pblNpemUgPSBudWxsOwotCQljbGVhckxvY2F0aW9ucygpOwotCQl0ZXh0U2l6ZSA9IG51bGw7Ci0JCXN1YlN0cmluZ1RleHRTaXplID0gbnVsbDsKLQkJc3ViU3RyaW5nVGV4dCA9IG51bGw7Ci0JCXN1cGVyLmludmFsaWRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsYWJlbCdzIHRleHQgaXMgY3VycmVudGx5IHRydW5jYXRlZAotCSAqIGFuZCBpcyBkaXNwbGF5aW5nIGFuIGVsbGlwc2lzLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxhYmVsJ3MgdGV4dCBpcyB0cnVuY2F0ZWQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUZXh0VHJ1bmNhdGVkKCkgewotCQlyZXR1cm4gIWdldFN1YlN0cmluZ1RleHRTaXplKCkuZXF1YWxzKGdldFRleHRTaXplKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgRmlndXJlI3BhaW50RmlndXJlKEdyYXBoaWNzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCWlmIChpc1NlbGVjdGVkKCkpIHsKLQkJCWdyYXBoaWNzLnB1c2hTdGF0ZSgpOwotCQkJZ3JhcGhpY3Muc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVCYWNrZ3JvdW5kU2VsZWN0ZWQpOwotCQkJZ3JhcGhpY3MuZmlsbFJlY3RhbmdsZShnZXRTZWxlY3Rpb25SZWN0YW5nbGUoKSk7Ci0JCQlncmFwaGljcy5wb3BTdGF0ZSgpOwotCQkJZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLQkJfQotCQlpZiAoaGFzRm9jdXMoKSkgewotCQkJZ3JhcGhpY3MucHVzaFN0YXRlKCk7Ci0JCQlncmFwaGljcy5zZXRYT1JNb2RlKHRydWUpOwotCQkJZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVCYWNrZ3JvdW5kU2VsZWN0ZWQpOwotCQkJZ3JhcGhpY3Muc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLQkJCWdyYXBoaWNzLmRyYXdGb2N1cyhnZXRTZWxlY3Rpb25SZWN0YW5nbGUoKS5yZXNpemUoLTEsIC0xKSk7Ci0JCQlncmFwaGljcy5wb3BTdGF0ZSgpOwotCQl9Ci0JCWlmIChpc09wYXF1ZSgpKQotCQkJc3VwZXIucGFpbnRGaWd1cmUoZ3JhcGhpY3MpOwotCQlSZWN0YW5nbGUgYm91bmRzID0gZ2V0Qm91bmRzKCk7Ci0JCWdyYXBoaWNzLnRyYW5zbGF0ZShib3VuZHMueCwgYm91bmRzLnkpOwotCQlpZiAoaWNvbiAhPSBudWxsKQotCQkJZ3JhcGhpY3MuZHJhd0ltYWdlKGljb24sIGdldEljb25Mb2NhdGlvbigpKTsKLQotCQlpZiAoIWlzRW5hYmxlZCgpKSB7Ci0JCQlncmFwaGljcy50cmFuc2xhdGUoMSwgMSk7Ci0JCQlncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYnV0dG9uTGlnaHRlc3QpOwotCQkJZ3JhcGhpY3NkcmF3VGV4dChncmFwaGljcyk7Ci0JCQlncmFwaGljcy5kcmF3VGV4dChnZXRTdWJTdHJpbmdUZXh0KCksIGdldFRleHRMb2NhdGlvbigpKTsKLQkJCWdyYXBoaWNzLnRyYW5zbGF0ZSgtMSwgLTEpOwotCQkJZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJ1dHRvbkRhcmtlcik7Ci0JCX0KLQkJZ3JhcGhpY3NkcmF3VGV4dChncmFwaGljcyk7Ci0JCWdyYXBoaWNzLnRyYW5zbGF0ZSgtYm91bmRzLngsIC1ib3VuZHMueSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFiZWwncyBpY29uIHRvIHRoZSBwYXNzZWQgaW1hZ2UuCi0JICogCi0JICogQHBhcmFtIGltYWdlCi0JICogICAgICAgICAgICB0aGUgbmV3IGxhYmVsIGltYWdlCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEljb24oSW1hZ2UgaW1hZ2UpIHsKLQkJaWYgKGljb24gPT0gaW1hZ2UpCi0JCQlyZXR1cm47Ci0JCWljb24gPSBpbWFnZTsKLQkJLy8gQ2FsbCByZXBhaW50LCBpbiBjYXNlIHRoZSBpbWFnZSBkaW1lbnNpb25zIGFyZSB0aGUgc2FtZS4KLQkJcmVwYWludCgpOwotCQlpZiAoaWNvbiA9PSBudWxsKQotCQkJc2V0SWNvbkRpbWVuc2lvbihuZXcgRGltZW5zaW9uKCkpOwotCQllbHNlCi0JCQlzZXRJY29uRGltZW5zaW9uKG5ldyBEaW1lbnNpb24oaW1hZ2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBhbGlnbm1lbnQgb2YgdGhlIGljb24gd2l0aGluIHRoZSBpY29uIGRpbWVuc2lvbi4gVGhlCi0JICogZGltZW5zaW9uIHNob3VsZCBiZSB0aGUgc2FtZSBzaXplIGFzIHRoZSBJbWFnZSBpdHNlbGYsIHNvIGNhbGxpbmcgdGhpcwotCSAqIG1ldGhvZCBzaG91bGQgaGF2ZSBubyBhZmZlY3QuCi0JICogCi0JICogQHBhcmFtIGFsaWduCi0JICogICAgICAgICAgICB0aGUgaWNvbiBhbGlnbm1lbnQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWNvbkFsaWdubWVudChpbnQgYWxpZ24pIHsKLQkJaWYgKGljb25BbGlnbm1lbnQgPT0gYWxpZ24pCi0JCQlyZXR1cm47Ci0JCWljb25BbGlnbm1lbnQgPSBhbGlnbjsKLQkJY2xlYXJMb2NhdGlvbnMoKTsKLQkJcmVwYWludCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhYmVsJ3MgaWNvbiBzaXplIHRvIHRoZSBwYXNzZWQgRGltZW5zaW9uLgotCSAqIAotCSAqIEBwYXJhbSBkCi0JICogICAgICAgICAgICB0aGUgbmV3IGljb24gc2l6ZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJY29uRGltZW5zaW9uKERpbWVuc2lvbiBkKSB7Ci0JCWlmIChkLmVxdWFscyhpY29uU2l6ZSkpCi0JCQlyZXR1cm47Ci0JCWljb25TaXplID0gZDsKLQkJcmV2YWxpZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGdhcCBpbiBwaXhlbHMgYmV0d2VlbiB0aGUgbGFiZWwncyBpY29uIGFuZCB0ZXh0IHRvIHRoZSBwYXNzZWQKLQkgKiB2YWx1ZS4gVGhlIGRlZmF1bHQgaXMgNC4KLQkgKiAKLQkgKiBAcGFyYW0gZ2FwCi0JICogICAgICAgICAgICB0aGUgZ2FwCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEljb25UZXh0R2FwKGludCBnYXApIHsKLQkJaWYgKGljb25UZXh0R2FwID09IGdhcCkKLQkJCXJldHVybjsKLQkJaWNvblRleHRHYXAgPSBnYXA7Ci0JCXJlcGFpbnQoKTsKLQkJcmV2YWxpZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFsaWdubWVudCBvZiB0aGUgZW50aXJlIGxhYmVsIChpY29uIGFuZCB0ZXh0KS4gSWYgdGhpcyBmaWd1cmUncwotCSAqIGJvdW5kcyBhcmUgbGFyZ2VyIHRoYW4gdGhlIHNpemUgbmVlZGVkIHRvIGRpc3BsYXkgdGhlIGxhYmVsLCB0aGUgbGFiZWwKLQkgKiB3aWxsIGJlIGFsaWduZWQgYWNjb3JkaW5nbHkuIFZhbGlkIHZhbHVlcyBhcmU6Ci0JICogPFVMPgotCSAqIDxMST48RU0+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0NFTlRFUn08L0VNPgotCSAqIDxMST57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjVE9QfQotCSAqIDxMST57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjQk9UVE9NfQotCSAqIDxMST57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjTEVGVH0KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI1JJR0hUfQotCSAqIDwvVUw+Ci0JICogCi0JICogQHBhcmFtIGFsaWduCi0JICogICAgICAgICAgICBsYWJlbCBhbGlnbm1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbEFsaWdubWVudChpbnQgYWxpZ24pIHsKLQkJaWYgKGxhYmVsQWxpZ25tZW50ID09IGFsaWduKQotCQkJcmV0dXJuOwotCQlsYWJlbEFsaWdubWVudCA9IGFsaWduOwotCQljbGVhckxvY2F0aW9ucygpOwotCQlyZXBhaW50KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFiZWwncyB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICB0aGUgbmV3IGxhYmVsIHRleHQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgcykgewotCQkvLyAidGV4dCIgd2lsbCBuZXZlciBiZSBudWxsLgotCQlpZiAocyA9PSBudWxsKQotCQkJcyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmICh0ZXh0LmVxdWFscyhzKSkKLQkJCXJldHVybjsKLQkJdGV4dCA9IHM7Ci0JCXJldmFsaWRhdGUoKTsKLQkJcmVwYWludCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFsaWdubWVudCBvZiB0aGUgVGV4dCByZWxhdGl2ZSB0byB0aGUgaWNvbi4gVGhlIHRleHQgYWxpZ25tZW50Ci0JICogbXVzdCBiZSBvcnRob2dvbmFsIHRvIHRoZSB0ZXh0IHBsYWNlbWVudC4gRm9yIGV4YW1wbGUsIGlmIHRoZSBwbGFjZW1lbnQKLQkgKiBpcyBFQVNULCB0aGVuIHRoZSB0ZXh0IGNhbiBiZSBhbGlnbmVkIHVzaW5nIFRPUCwgQ0VOVEVSLCBvciBCT1RUT00uIFZhbGlkCi0JICogdmFsdWVzIGFyZToKLQkgKiA8VUw+Ci0JICogPExJPjxFTT57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjQ0VOVEVSfTwvRU0+Ci0JICogPExJPntAbGluayBQb3NpdGlvbkNvbnN0YW50cyNUT1B9Ci0JICogPExJPntAbGluayBQb3NpdGlvbkNvbnN0YW50cyNCT1RUT019Ci0JICogPExJPntAbGluayBQb3NpdGlvbkNvbnN0YW50cyNMRUZUfQotCSAqIDxMST57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjUklHSFR9Ci0JICogPC9VTD4KLQkgKiAKLQkgKiBAc2VlICNzZXRMYWJlbEFsaWdubWVudChpbnQpCi0JICogQHBhcmFtIGFsaWduCi0JICogICAgICAgICAgICB0aGUgdGV4dCBhbGlnbm1lbnQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dEFsaWdubWVudChpbnQgYWxpZ24pIHsKLQkJaWYgKHRleHRBbGlnbm1lbnQgPT0gYWxpZ24pCi0JCQlyZXR1cm47Ci0JCXRleHRBbGlnbm1lbnQgPSBhbGlnbjsKLQkJY2xlYXJMb2NhdGlvbnMoKTsKLQkJcmVwYWludCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBsYWNlbWVudCBvZiB0ZXh0IHJlbGF0aXZlIHRvIHRoZSBsYWJlbCdzIGljb24uIFZhbGlkIHZhbHVlcwotCSAqIGFyZToKLQkgKiA8VUw+Ci0JICogPExJPjxFTT57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjRUFTVH08L0VNPgotCSAqIDxMST57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjTk9SVEh9Ci0JICogPExJPntAbGluayBQb3NpdGlvbkNvbnN0YW50cyNTT1VUSH0KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI1dFU1R9Ci0JICogPC9VTD4KLQkgKiAKLQkgKiBAcGFyYW0gd2hlcmUKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHBsYWNlbWVudAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0UGxhY2VtZW50KGludCB3aGVyZSkgewotCQlpZiAodGV4dFBsYWNlbWVudCA9PSB3aGVyZSkKLQkJCXJldHVybjsKLQkJdGV4dFBsYWNlbWVudCA9IHdoZXJlOwotCQlyZXZhbGlkYXRlKCk7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQlwcml2YXRlIFJlY3RhbmdsZSBnZXRTZWxlY3Rpb25SZWN0YW5nbGUoKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBnZXRUZXh0Qm91bmRzKCk7Ci0JCWJvdW5kcy5leHBhbmQobmV3IEluc2V0cygyLCAyLCAwLCAwKSk7Ci0JCXRyYW5zbGF0ZVRvUGFyZW50KGJvdW5kcyk7Ci0JCWJvdW5kcy5pbnRlcnNlY3QoZ2V0Qm91bmRzKCkpOwotCQlyZXR1cm4gYm91bmRzOwotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZXMgYW5kIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIExhYmVsJ3MgdGV4dC4gTm90ZSB0aGF0IHRoaXMKLQkgKiBEaW1lbnNpb24gaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgTGFiZWwncyBmdWxsIHRleHQsIHJlZ2FyZGxlc3Mgb2YKLQkgKiB3aGV0aGVyIG9yIG5vdCBpdHMgdGV4dCBpcyBjdXJyZW50bHkgdHJ1bmNhdGVkLiBJZiB0ZXh0IHNpemUgY29uc2lkZXJpbmcKLQkgKiBjdXJyZW50IHRydW5jYXRpb24gaXMgZGVzaXJlZCwgdXNlIHtAbGluayAjY2FsY3VsYXRlU3ViU3RyaW5nVGV4dFNpemUoKX0uCi0JICogCi0JICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbGFiZWwncyB0ZXh0LCBpZ25vcmluZyB0cnVuY2F0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlVGV4dFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCXJldHVybiBGaWd1cmVVdGlsaXRpZXMuZ2V0VGV4dEV4dGVudHMoZ2V0V3JhcHBlZFRleHQod2lkdGgsIGhlaWdodCksCi0JCQkJZ2V0Rm9udCgpKTsKLQl9Ci0KLQkvLyBDb2RlIGZvciB0aGUgVGV4dCBXcmFwLgotCS8vIFN0YXJ0cyBoZXJlLgotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0V3JhcHBlZFRleHQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCWlmICghaXNUZXh0V3JhcHBlZCgpIHx8IHdpZHRoID09IC0xKQotCQkJcmV0dXJuIGdldFRleHQoKTsKLQotCQlpZiAoaXNJY29uRXhpc3QoKSkgewotCQkJc3dpdGNoICh0ZXh0UGxhY2VtZW50KSB7Ci0JCQljYXNlIEVBU1Q6Ci0JCQljYXNlIFdFU1Q6Ci0JCQkJd2lkdGggLT0gaWNvblNpemUud2lkdGggKyBnZXRJY29uVGV4dEdhcCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBOT1JUSDoKLQkJCWNhc2UgU09VVEg6Ci0JCQkJaWYgKGhlaWdodCAhPSAtMSkKLQkJCQkJaGVpZ2h0IC09IGljb25TaXplLmhlaWdodCArIGdldEljb25UZXh0R2FwKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlGb250IGYgPSBnZXRGb250KCk7Ci0JCWludCBtYXhMaW5lcyA9IEludGVnZXIuTUFYX1ZBTFVFOwotCQlpZiAoaGVpZ2h0ICE9IC0xKSB7Ci0JCQlpbnQgZm9udEhlaWdodCA9IEZpZ3VyZVV0aWxpdGllcy5nZXRGb250TWV0cmljcyhmKS5nZXRIZWlnaHQoKTsKLQkJCW1heExpbmVzID0gKGludCkgKGhlaWdodCAvIChkb3VibGUpIGZvbnRIZWlnaHQpOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIGFjY3VtbGF0ZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdCdWZmZXIgcmVtYWluaW5nVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0VGV4dCgpKTsKLQkJaW50IGkgPSAwLCBqID0gMDsKLQotCQl3aGlsZSAocmVtYWluaW5nVGV4dC5sZW5ndGgoKSA+IDAgJiYgaisrIDwgbWF4TGluZXMpIHsKLQkJCWlmICgoaSA9IGdldExpbmVXcmFwUG9zaXRpb24ocmVtYWluaW5nVGV4dC50b1N0cmluZygpLCBmLCBoZWlnaHQpKSA9PSAwKQotCQkJCWJyZWFrOwotCi0JCQlpZiAoYWNjdW1sYXRlZFRleHQubGVuZ3RoKCkgPiAwKQotCQkJCWFjY3VtbGF0ZWRUZXh0LmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJYWNjdW1sYXRlZFRleHQuYXBwZW5kKHJlbWFpbmluZ1RleHQuc3Vic3RyaW5nKDAsIGkpKTsKLQkJCXJlbWFpbmluZ1RleHQuZGVsZXRlKDAsIGkpOwotCQl9Ci0JCXJldHVybiBhY2N1bWxhdGVkVGV4dC50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0ljb25FeGlzdCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0TGluZVdyYXBQb3NpdGlvbihTdHJpbmcgc3RyaW5nLCBGb250IGYsIGludCB3aWR0aCkgewotCQlCcmVha0l0ZXJhdG9yIGl0ZXIgPSBCcmVha0l0ZXJhdG9yLmdldExpbmVJbnN0YW5jZSgpOwotCQlpdGVyLnNldFRleHQoc3RyaW5nKTsKLQkJaW50IHN0YXJ0ID0gaXRlci5maXJzdCgpOwotCQlpbnQgZW5kID0gaXRlci5uZXh0KCk7Ci0KLQkJLy8gaWYgdGhlIGZpcnN0IGxpbmUgc2VnbWVudCBkb2VzIG5vdCBmaXQgaW4gdGhlIHdpZHRoLAotCQkvLyBkZXRlcm1pbmUgdGhlIHBvc2l0aW9uIHdpdGhpbiBpdCB3aGVyZSB3ZSBuZWVkIHRvIGN1dAotCQlpZiAoRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKHN0cmluZy5zdWJzdHJpbmcoc3RhcnQsIGVuZCksIGYpLndpZHRoID4gd2lkdGgpIHsKLQkJCWl0ZXIgPSBCcmVha0l0ZXJhdG9yLmdldENoYXJhY3Rlckluc3RhbmNlKCk7Ci0JCQlpdGVyLnNldFRleHQoc3RyaW5nKTsKLQkJCXN0YXJ0ID0gaXRlci5maXJzdCgpOwotCQl9Ci0KLQkJLy8ga2VlcCBpdGVyYXRpbmcgYXMgbG9uZyBhcyB3aWR0aCBwZXJtaXRzCi0JCWRvCi0JCQllbmQgPSBpdGVyLm5leHQoKTsKLQkJd2hpbGUgKGVuZCAhPSBCcmVha0l0ZXJhdG9yLkRPTkUKLQkJCQkmJiBGaWd1cmVVdGlsaXRpZXMuZ2V0VGV4dEV4dGVudHMoc3RyaW5nLnN1YnN0cmluZyhzdGFydCwgZW5kKSwKLQkJCQkJCWYpLndpZHRoIDw9IHdpZHRoKTsKLQkJcmV0dXJuIChlbmQgPT0gQnJlYWtJdGVyYXRvci5ET05FKSA/IGl0ZXIubGFzdCgpIDogaXRlci5wcmV2aW91cygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxhcmdlc3Qgc3Vic3RyaW5nIG9mIDxpPnM8L2k+IGluIEZvbnQgPGk+ZjwvaT4gdGhhdCBjYW4gYmUKLQkgKiBjb25maW5lZCB0byB0aGUgbnVtYmVyIG9mIHBpeGVscyBpbiA8aT5hdmFpbGFibGVXaWR0aDxpPi4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIHN0cmluZwotCSAqIEBwYXJhbSBmCi0JICogICAgICAgICAgICB0aGUgZm9udAotCSAqIEBwYXJhbSBhdmFpbGFibGVXaWR0aAotCSAqICAgICAgICAgICAgdGhlIGF2YWlsYWJsZSB3aWR0aAotCSAqIEByZXR1cm4gdGhlIGxhcmdlc3Qgc3Vic3RyaW5nIHRoYXQgZml0cyBpbiB0aGUgZ2l2ZW4gd2lkdGgKLQkgKiBAc2luY2UgMi4wIENvcGllZCBmcm9tIDxjbGFzcz5GaWd1cmVVdGlsaXRpZXM8Y2xhc3M+IENsYXNzLCB0byBhdm9pZAotCSAqICAgICAgICBjYWxsIG9mIHN0YXRpYy4KLQkgKi8KLQlzdGF0aWMgaW50IGdldExhcmdlc3RTdWJzdHJpbmdDb25maW5lZFRvKFN0cmluZyBzLCBGb250IGYsCi0JCQlpbnQgYXZhaWxhYmxlV2lkdGgpIHsKLQkJRm9udE1ldHJpY3MgbWV0cmljcyA9IEZpZ3VyZVV0aWxpdGllcy5nZXRGb250TWV0cmljcyhmKTsKLQkJaW50IG1pbiwgbWF4OwotCQlmbG9hdCBhdmcgPSBtZXRyaWNzLmdldEF2ZXJhZ2VDaGFyV2lkdGgoKTsKLQkJbWluID0gMDsKLQkJbWF4ID0gcy5sZW5ndGgoKSArIDE7Ci0KLQkJLy8gVGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgZ3Vlc3MKLQkJaW50IGd1ZXNzID0gMCwgZ3Vlc3NTaXplID0gMDsKLQkJd2hpbGUgKChtYXggLSBtaW4pID4gMSkgewotCQkJLy8gUGljayBhIG5ldyBndWVzcyBzaXplCi0JCQkvLyBOZXcgZ3Vlc3MgaXMgdGhlIGxhc3QgZ3Vlc3MgcGx1cyB0aGUgbWlzc2luZyB3aWR0aCBpbiBwaXhlbHMKLQkJCS8vIGRpdmlkZWQgYnkgdGhlIGF2ZXJhZ2UgY2hhcmFjdGVyIHNpemUgaW4gcGl4ZWxzCi0JCQlndWVzcyA9IGd1ZXNzICsgKGludCkgKChhdmFpbGFibGVXaWR0aCAtIGd1ZXNzU2l6ZSkgLyBhdmcpOwotCi0JCQlpZiAoZ3Vlc3MgPj0gbWF4KQotCQkJCWd1ZXNzID0gbWF4IC0gMTsKLQkJCWlmIChndWVzcyA8PSBtaW4pCi0JCQkJZ3Vlc3MgPSBtaW4gKyAxOwotCi0JCQkvLyBNZWFzdXJlIHRoZSBjdXJyZW50IGd1ZXNzCi0JCQlndWVzc1NpemUgPSBGaWd1cmVVdGlsaXRpZXMKLQkJCQkJLmdldFRleHRFeHRlbnRzKHMuc3Vic3RyaW5nKDAsIGd1ZXNzKSwgZikud2lkdGg7Ci0KLQkJCWlmIChndWVzc1NpemUgPCBhdmFpbGFibGVXaWR0aCkKLQkJCQkvLyBXZSBkaWQgbm90IHVzZSB0aGUgYXZhaWxhYmxlIHdpZHRoCi0JCQkJbWluID0gZ3Vlc3M7Ci0JCQllbHNlCi0JCQkJLy8gV2UgZXhjZWVkZWQgdGhlIGF2YWlsYWJsZSB3aWR0aAotCQkJCW1heCA9IGd1ZXNzOwotCQl9Ci0JCXJldHVybiBtaW47Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0byB3cmFwIHRleHQgaW4gTGFiZWwuCi0JICogCi0JICogQHBhcmFtIGIKLQkgKiAgICAgICAgICAgIHRydWUvZmFsc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0V3JhcChib29sZWFuIGIpIHsKLQkJaWYgKGlzVGV4dFdyYXBwZWQoKSA9PSBiKQotCQkJcmV0dXJuOwotCQlzZXRGbGFnKEZMQUdfV1JBUCwgYik7Ci0JCXJldmFsaWRhdGUoKTsKLQkJcmVwYWludCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGV4dCB3cmFwLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVGV4dFdyYXBwZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFNldCB0ZXh0IHdyYXAgd2lkdGguCi0JICogCi0JICogQHBhcmFtIGkKLQkgKiAgICAgICAgICAgIFRoZSBsYWJlbCB0ZXh0IHdyYXAgd2lkdGgKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0V3JhcFdpZHRoKGludCBpKSB7Ci0JCWlmICh0aGlzLndyYXBXaWR0aCA9PSBpKQotCQkJcmV0dXJuOwotCQl0aGlzLndyYXBXaWR0aCA9IGk7Ci0JCXJldmFsaWRhdGUoKTsKLQkJcmVwYWludCgpOwotCi0JfQotCi0JLyoqCi0JICogVGV4dCBXcmFwIEFsaWdubWVudCwgdXNlIG9ubHkgYWZ0ZXIgdXNpbmcgPG1ldGhvZD5zZXRUZXh0V3JhcChib29sZWFuKTwvbWV0aG9kPgotCSAqIAotCSAqIEBwYXJhbSBpCi0JICogICAgICAgICAgICBUaGUgbGFiZWwgdGV4dCB3cmFwcGluZyB3aWR0aAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRXcmFwQWxpZ25tZW50KGludCBpKSB7Ci0JCWlmIChnZXRUZXh0V3JhcEFsaWdubWVudCgpID09IGkpCi0JCQlyZXR1cm47Ci0KLQkJc2V0QWxpZ25tZW50RmxhZ3MoaSwgRkxBR19XUkFQX0FMSUdOKTsKLQkJcmVwYWludCgpOwotCX0KLQotCS8qKgotCSAqIHNldEFsaWdubWVudEZsYWdzCi0JICogCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgYWxpZ24KLQkgKiBAcGFyYW0gaW50Ci0JICogICAgICAgICAgICBmbGFnT2Zmc2V0Ci0JICogCi0JICogLS0tIFRPRE8gLSBjb3BpZWQgbmVlZHMgdG8gbW9kaWZ5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEFsaWdubWVudEZsYWdzKGludCBhbGlnbiwgaW50IGZsYWdPZmZzZXQpIHsKLQkJZmxhZ3MgJj0gfigweDcgKiBmbGFnT2Zmc2V0KTsKLQkJc3dpdGNoIChhbGlnbikgewotCQljYXNlIENFTlRFUjoKLQkJCWZsYWdzIHw9IDB4MSAqIGZsYWdPZmZzZXQ7Ci0JCQlicmVhazsKLQkJY2FzZSBUT1A6Ci0JCQlmbGFncyB8PSAweDIgKiBmbGFnT2Zmc2V0OwotCQkJYnJlYWs7Ci0JCWNhc2UgTEVGVDoKLQkJCWZsYWdzIHw9IDB4MyAqIGZsYWdPZmZzZXQ7Ci0JCQlicmVhazsKLQkJY2FzZSBSSUdIVDoKLQkJCWZsYWdzIHw9IDB4NCAqIGZsYWdPZmZzZXQ7Ci0JCQlicmVhazsKLQkJY2FzZSBCT1RUT006Ci0JCQlmbGFncyB8PSAweDUgKiBmbGFnT2Zmc2V0OwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gd3JhcFZhbHVlCi0JICogQHJldHVybiBQb3NpdGlvbkNvbnN0YW50IHJlcHJlc2VudGluZyB0aGUgYWxpZ25tZW50Ci0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0QWxpZ25tZW50KGludCBmbGFnT2Zmc2V0KSB7Ci0JCWludCB3cmFwVmFsdWUgPSBmbGFncyAmICgweDcgKiBmbGFnT2Zmc2V0KTsKLQkJaWYgKHdyYXBWYWx1ZSA9PSAweDEgKiBmbGFnT2Zmc2V0KQotCQkJcmV0dXJuIENFTlRFUjsKLQkJZWxzZSBpZiAod3JhcFZhbHVlID09IDB4MiAqIGZsYWdPZmZzZXQpCi0JCQlyZXR1cm4gVE9QOwotCQllbHNlIGlmICh3cmFwVmFsdWUgPT0gMHgzICogZmxhZ09mZnNldCkKLQkJCXJldHVybiBMRUZUOwotCQllbHNlIGlmICh3cmFwVmFsdWUgPT0gMHg0ICogZmxhZ09mZnNldCkKLQkJCXJldHVybiBSSUdIVDsKLQkJZWxzZSBpZiAod3JhcFZhbHVlID09IDB4NSAqIGZsYWdPZmZzZXQpCi0JCQlyZXR1cm4gQk9UVE9NOwotCi0JCXJldHVybiBDRU5URVI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbGFiZWwgdGV4dCB3cmFwcGluZyB3aWR0aAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGV4dFdyYXBBbGlnbm1lbnQoKSB7Ci0JCXJldHVybiBnZXRBbGlnbm1lbnQoRkxBR19XUkFQX0FMSUdOKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBmb2N1cyBzdGF0ZSBvZiB0aGlzIGxhYmVsCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBGTEFHX0hBU0ZPQ1VTKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHNlbGVjdGlvbiBzdGF0ZSBvZiB0aGlzIGxhYmVsCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCgpIHsKLQkJcmV0dXJuIChmbGFncyAmIEZMQUdfU0VMRUNURUQpICE9IDA7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdyYXBoaWNzZHJhd1RleHQoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJU3RyaW5nIHN1YlN0cmluZyA9IGdldFN1YlN0cmluZ1RleHQoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3ViU3RyaW5nLCAiXG4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCUZvbnQgZiA9IGdldEZvbnQoKTsKLQkJaW50IGZvbnRIZWlnaHQgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3MoZikuZ2V0SGVpZ2h0KCk7Ci0JCWludCB0ZXh0V2lkdGggPSBGaWd1cmVVdGlsaXRpZXMuZ2V0VGV4dEV4dGVudHMoc3ViU3RyaW5nLCBmKS53aWR0aDsKLQkJaW50IHkgPSBnZXRUZXh0TG9jYXRpb24oKS55OwotCi0JCS8vIElmIHRoZSBmb250J3MgbGVhZGluZyBhcmVhIGlzIDAgdGhlbiB3ZSBuZWVkIHRvIGFkZCBhbiBvZmZzZXQgdG8KLQkJLy8gYXZvaWQgdHJ1bmNhdGluZyBhdCB0aGUgdG9wIChlLmcuIEtvcmVhbiBmb250cykKLQkJaWYgKDAgPT0gRmlndXJlVXRpbGl0aWVzLmdldEZvbnRNZXRyaWNzKGYpLmdldExlYWRpbmcoKSkgewotCQkJaW50IG9mZnNldCA9IDI7IC8vIDIgaXMgdGhlIGxlYWRpbmcgYXJlYSBmb3IgZGVmYXVsdCBFbmdsaXNoCi0JCQl5ICs9IG9mZnNldDsKLQkJfQotCi0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRleHQgYWRkZWQgdG8gZHJhdyIgKyB0b2tlbik7IC8vJE5PTi1OTFMtMSQKLQkJCWludCB0b2tlbldpZHRoID0gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKHRva2VuLCBmKS53aWR0aDsKLQkJCWludCB4ID0gZ2V0VGV4dExvY2F0aW9uKCkueDsKLQkJCXN3aXRjaCAoZ2V0VGV4dFdyYXBBbGlnbm1lbnQoKSkgewotCQkJY2FzZSBDRU5URVI6Ci0JCQkJeCArPSAodGV4dFdpZHRoIC0gdG9rZW5XaWR0aCkgLyAyOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSSUdIVDoKLQkJCQl4ICs9IHRleHRXaWR0aCAtIHRva2VuV2lkdGg7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlncmFwaGljcy5kcmF3VGV4dCh0b2tlbiwgeCwgeSk7Ci0JCQl5ICs9IGZvbnRIZWlnaHQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmb2N1cyBzdGF0ZSBvZiB0aGlzIGxhYmVsCi0JICogCi0JICogQHBhcmFtIGIKLQkgKiAgICAgICAgICAgIHRydWUgd2lsbCBjYXVzZSBhIGZvY3VzIHJlY3RhbmdsZSB0byBiZSBkcmF3biBhcm91bmQgdGhlIHRleHQKLQkgKiAgICAgICAgICAgIG9mIHRoZSBMYWJlbAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKGJvb2xlYW4gYikgewotCQlpZiAoaGFzRm9jdXMoKSA9PSBiKQotCQkJcmV0dXJuOwotCQlzZXRGbGFnKEZMQUdfSEFTRk9DVVMsIGIpOwotCQlyZXBhaW50KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2VsZWN0aW9uIHN0YXRlIG9mIHRoaXMgbGFiZWwKLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqICAgICAgICAgICAgdHJ1ZSB3aWxsIGNhdXNlIHRoZSBsYWJlbCB0byBhcHBlYXIgc2VsZWN0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChib29sZWFuIGIpIHsKLQkJaWYgKGlzU2VsZWN0ZWQoKSA9PSBiKQotCQkJcmV0dXJuOwotCQlzZXRGbGFnKEZMQUdfU0VMRUNURUQsIGIpOwotCQlyZXBhaW50KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTA4ZGQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZ3JhcGhpY2FsIGZpZ3VyZXMgZm9yIHRoZSBhY3Rpdml0eSBkaWFncmFtcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL0FuY2hvclV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvQW5jaG9yVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjExZGJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvQW5jaG9yVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBhbmNob3JzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQW5jaG9yVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIFBvaW50IGdldENsb3Nlc3RQb2ludChQb2ludFtdIHBvaW50cywgUG9pbnQgcG9pbnQpIHsKLQkJaW50IHNpemUgPSBwb2ludHMubGVuZ3RoOwotCQlkb3VibGVbXSBkaXN0YW5jZXMgPSBuZXcgZG91YmxlW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJZGlzdGFuY2VzW2ldID0gcG9pbnRzW2ldLmdldERpc3RhbmNlKHBvaW50KTsKLQkJfQotCQlyZXR1cm4gcG9pbnRzW21pbihkaXN0YW5jZXMpXTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBtaW4oZG91YmxlW10gbnVtYmVycykgewotCQlpZiAobnVtYmVycy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiAtMTsKLQkJZG91YmxlIG1pbiA9IG51bWJlcnNbMF07Ci0JCWludCBpZCA9IDA7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgbnVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJZG91YmxlIG4gPSBudW1iZXJzW2ldOwotCQkJaWYgKG4gPCBtaW4pIHsKLQkJCQltaW4gPSBuOwotCQkJCWlkID0gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG51bWJlcnMKLQkgKiBAcmV0dXJuCi0JICogCQlpbmRleCBvZiB0aGUgc21hbGxlc3QgbnVtYmVyIGluIHRoZSBnaXZlbiBhcnJheQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IG1pbihpbnRbXSBudW1iZXJzKSB7Ci0JCWlmIChudW1iZXJzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIC0xOwotCQlpbnQgbWluID0gbnVtYmVyc1swXTsKLQkJaW50IGlkID0gMDsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBudW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgbiA9IG51bWJlcnNbaV07Ci0JCQlpZiAobiA8IG1pbikgewotCQkJCW1pbiA9IG47Ci0JCQkJaWQgPSBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYzNGZmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL0Nvbm5lY3Rpb25BbmNob3JMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotCi0vKioKLSAqIENvbnN0cmFpbnQgZm9yIHBsYWNpbmcgYW5jaG9yIGxvY2F0aW9uLgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uQW5jaG9yTG9jYXRvciB7Ci0KLQkvKioKLQkgKiBHZXRzIHJlbGF0aXZlIGxvY2F0aW9uIGJhc2VkIG9uIHRoZSBnaXZlbiByZWZlcmVuY2UgcG9pbnQKLQkgKiAKLQkgKiBAcGFyYW0gcmVmZXJlbmNlCi0JICogQHJldHVybiBhYnNvbHV0ZSBsb2NhdGlvbgotCSAqLwotCVBvaW50IGdldExvY2F0aW9uKFBvaW50IHJlZmVyZW5jZSk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvRGlhZ3JhbUVkaXRvclV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvRGlhZ3JhbUVkaXRvclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTljMzFhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL0RpYWdyYW1FZGl0b3JVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLkRpYWdyYW1FZGl0b3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlZhcnlBY3Rpdml0eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLQotLyoqCi0gKiBQcm92aWRlcyBpbnN0cnVjdHVyZSB0byBsaXN0ZW5zIHRvIGFjdGlvbnMgbGlrZSBMb2NhbENvbnRyaWJ1dGlvbiwgTG9jYWwKLSAqIFJlcGxhY2UgaW4gV29ya0JyZWFrZG93biBTdHJ1Y3R1cmUuIExvYWRzIGF0IHRpbWUgb2YgcGx1Z2luIGxvYWQuCi0gKiAKLSAqIEBzZWUgVmFyeUFjdGl2aXR5Q29tbWFuZAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEaWFncmFtRWRpdG9yVXRpbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBEaWFncmFtRWRpdG9yVXRpbCBpbnN0YW5jZSA9IG51bGw7Ci0KLQlwcml2YXRlIExpc3Q8SUNvbW1hbmRMaXN0ZW5lcj4gY29tbWFuZExpc3RlbmVyczsKLQotCXByaXZhdGUgRGlhZ3JhbUVkaXRvclV0aWwoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEaWFncmFtRWRpdG9yVXRpbCBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoRGlhZ3JhbUVkaXRvclV0aWwuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBEaWFncmFtRWRpdG9yVXRpbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIExpc3Q8SUNvbW1hbmRMaXN0ZW5lcj4gZ2V0VmFyeUNvbW1hbmRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChjb21tYW5kTGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWNvbW1hbmRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElDb21tYW5kTGlzdGVuZXI+KCk7Ci0JCX0KLQotCQljb21tYW5kTGlzdGVuZXJzLmFkZChuZXcgSUNvbW1hbmRMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgbm90aWZ5RXhlY3V0ZWQoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQkJLy8gR2V0IGNvbnRyaWJ1dG9yL3JlcGxhY2VyIG9mIHRoZSBhY3Rpdml0eS4KLQkJCQlPYmplY3Qgd3JhcHBlciA9ICgoVmFyeUFjdGl2aXR5Q29tbWFuZCkgY29tbWFuZCkuZ2V0V3JhcHBlcigpOwotCQkJCURpYWdyYW1FZGl0b3JIZWxwZXIuY2xvc2VEaWFncmFtRWRpdG9ycyh3cmFwcGVyLCAKLQkJCQkJCW5ldyBBcnJheUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4oKSk7Ci0JCQkJRGlhZ3JhbUVkaXRvckhlbHBlci5yZWZyZXNoUGFyZW50RGlhZ3JhbUVkaXRvcnMod3JhcHBlciwKLQkJCQkJCW5ldyBBcnJheUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4oKSwgdHJ1ZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBDbGFzcyBnZXRDb21tYW5kVHlwZSgpIHsKLQkJCQlyZXR1cm4gVmFyeUFjdGl2aXR5Q29tbWFuZC5jbGFzczsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcHJlVW5kbyhDb21tYW5kIGNvbW1hbmQpIHsKLQkJCQkvLyBHZXQgb2xkIGNvbnRyaWJ1dG9yL3JlcGxhY2VyIG9mIHRoZSBhY3Rpdml0eS4KLQkJCQlDb2xsZWN0aW9uIGxpc3QgPSAoKFZhcnlBY3Rpdml0eUNvbW1hbmQpIGNvbW1hbmQpLmdldFJlc3VsdCgpOwotCi0JCQkJTGlzdCBsaXN0eCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCB3cmFwcGVyID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlEaWFncmFtRWRpdG9ySGVscGVyLmNsb3NlRGlhZ3JhbUVkaXRvcnMod3JhcHBlciwgCi0JCQkJCQkJbmV3IEFycmF5TGlzdDxJRWRpdG9yUmVmZXJlbmNlPigpKTsKLQkJCQkJbGlzdHguY2xlYXIoKTsKLQkJCQl9Ci0KLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHByZUV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHBvc3RVbmRvKENvbW1hbmQgY29tbWFuZCkgewotCQkJCURpYWdyYW1FZGl0b3JIZWxwZXIucmVmcmVzaFBhcmVudERpYWdyYW1FZGl0b3JzKCgoVmFyeUFjdGl2aXR5Q29tbWFuZCkgY29tbWFuZCkuc3VwZXJBY3Rpdml0eSwKLQkJCQkJCQluZXcgQXJyYXlMaXN0PElFZGl0b3JSZWZlcmVuY2U+KCksIGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGNvbW1hbmRMaXN0ZW5lcnM7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9EaWFncmFtVUlSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvRGlhZ3JhbVVJUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZGY5MzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9EaWFncmFtVUlSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogUmVzb3VyY2UgQ2xhc3MgZm9yIHRoZSBBdXRob3JpbmcgRGlhZ3JhbSAoR0VGKSBwYWNrYWdlcy4KLSAqIAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGlhZ3JhbVVJUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBEaWFncmFtVUlSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXZpb3VzX25hbWVfbnVsbDE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyX25hbWVfZW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW92ZUFjdGlvbl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fU2VsZWN0X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX1NlbGVjdF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX2Vycl9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX0xpbmtfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fTGlua19zZWxlY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX0xpbmtfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEZXRhaWxEaWFncmFtX3ByZWZpeDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1BoYXNlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1BoYXNlX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX1JvbGVEZXNjcmlwdG9yX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV9wcmVmaXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX1JvbGVEZXNjcmlwdG9yX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0dml0aXZpdHlEaWFncmFtX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdHZpdGl2aXR5RGlhZ3JhbV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdHZpdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0dml0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdHZpdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX2FsaWduTWVudV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9ycmVmcmVzaGZyb21iYXNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9CZW5kUG9pbnRfY3JlYXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmcmVzaEFjdGlvbl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZyZXNoRnJvbUJhc2VDbWRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhZ3JhbV9zYXZlRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlRGlhZ3JhbV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZURpYWdyYW1fcHJvbXB0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFsaWduX2JlbmRfcG9pbnRfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXRfY29uZmlnZWRpdG9yMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFncmFtX25vZGVfcHJvcGVydHlfdmFsdWVfcHJvYmxlbV9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhZ3JhbV9lcnJvckRpYWxvZ190aXRsZV90ZXh0MDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JfUmVzZXREaWFncmFtTGF5b3V0X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tbWFuZF9jYW5ub3RFZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGV4dDsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIERpYWdyYW1VSVJlc291cmNlcy5jbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2Uga2V5IGFuZCBmb3JtYXR0ZWQKLQkgKiB3aXRoIGEgZ2l2ZW4gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIEEgcmVzb3VyY2Uga2V5LgotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBBbiBvYmplY3QuCi0JICogQHJldHVybiBBIGZvcm1hdHRlZCBsb2NhbGl6ZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGtleSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKGtleSwgbmV3IE9iamVjdFtdIHsgZGF0YSB9KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YmNlNTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLXByZXZpb3VzX25hbWVfbnVsbDE9VW5kbyBvZiBhIG5hbWUgY2hhbmdlIGlzIG5vdCBhbGxvd2VkIGlmIHRoZSBwcmV2aW91cyBuYW1lIGlzIG51bGwuCi1lcnJfbmFtZV9lbXB0eT1UaGUgbmFtZSBjYW5ub3QgYmUgZW1wdHkuIFBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgbmFtZS4KLW1vdmVBY3Rpb25fbGFiZWw9TW92ZQotCi1BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3RleHQ9U2VsZWN0Ci1BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3Rvb2x0aXA9U2VsZWN0IG5vZGUgb3IgbGluawotQWJzdHJhY3REaWFncmFtX0FkZE5vZGVfdGl0bGU9QWRkIE5vZGUKLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX2Vycl9tc2c9SVhSRDAwMDJXOiBBZGRpbmcgYSBub2RlIHRvIGRpYWdyYW0gZmFpbGVkCi1BYnN0cmFjdERpYWdyYW1fTGlua190ZXh0PUxpbmsKLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3NlbGVjdD1TZWxlY3QgTGluawotQWJzdHJhY3REaWFncmFtX0xpbmtfdG9vbHRpcD1DcmVhdGUgbmV3IGxpbmsKLUFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdGV4dD1TdGFydCBOb2RlCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXA9Q3JlYXRlIG5ldyBzdGFydCBub2RlCi1BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dD1GcmVlIFRleHQKLUFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwPUNyZWF0ZSBuZXcgZnJlZSB0ZXh0Ci1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90ZXh0PVN5bmNocm9uaXphdGlvbiBCYXIKLUFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3Rvb2x0aXA9Q3JlYXRlIG5ldyBzeW5jaHJvbml6YXRpb24gYmFyCi1BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3RleHQ9RGVjaXNpb24gTm9kZQotQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90b29sdGlwPUNyZWF0ZSBuZXcgZGVjaXNpb24gbm9kZQotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dD1FbmQgTm9kZQotQWN0aXZpdHlEZXRhaWxEaWFncmFtX3ByZWZpeD1BY3Rpdml0eSBEZXRhaWw6Ci1BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90b29sdGlwPUNyZWF0ZSBuZXcgZW5kIG5vZGUKLUFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0PUFjdGl2aXR5Ci1BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdG9vbHRpcD1DcmVhdGUgbmV3IGFjdGl2aXR5Ci1BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ9SXRlcmF0aW9uCi1BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3Rvb2x0aXA9Q3JlYXRlIG5ldyBpdGVyYXRpb24KLUFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXh0PVBoYXNlCi1BY3Rpdml0eURpYWdyYW1fUGhhc2VfdG9vbHRpcD1DcmVhdGUgbmV3IHBoYXNlCi1BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdGV4dD1UYXNrIERlc2NyaXB0b3IKLUFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90ZXh0PVJvbGUgRGVzY3JpcHRvcgotV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV9wcmVmaXg9V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbToKLUFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90b29sdGlwPUNyZWF0ZSBuZXcgcm9sZSBkZXNjcmlwdG9yCi1BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdG9vbHRpcD1DcmVhdGUgbmV3IHRhc2sgZGVzY3JpcHRvcgotQWN0dml0aXZpdHlEaWFncmFtX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0PURlbGl2ZXJ5IFByb2Nlc3MKLUFjdHZpdGl2aXR5RGlhZ3JhbV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0PUNhcGFiaWxpdHkgUGF0dGVybgotQWN0dml0aXZpdHlEaWFncmFtX1BoYXNlX3RleD1QaGFzZQotQWN0dml0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0PUl0ZXJhdGlvbgotQWN0dml0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9QWN0aXZpdHkKLUFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dD1Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcgotQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90b29sdGlwPUNyZWF0ZSBuZXcgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IKLQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2FsaWduTWVudV90ZXh0PUFsaWduCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1SZWZyZXNoIGZyb20gQmFzZSBBY3Rpdml0eQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2Zvcm1hdFRleHRCb3hBY3Rpdml0eV90ZXh0PUZvcm1hdCBUZXh0IEJveC4uLgotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1Ib3Jpem9udGFsbHkgdG8gQXZlcmFnZQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1Ib3Jpem9udGFsbHkgdG8gRmlyc3QgU2VsZWN0ZWQKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9VmVydGljYWxseSB0byBBdmVyYWdlCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PVZlcnRpY2FsbHkgdG8gRmlyc3QgU2VsZWN0ZWQKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX3RleHQ9U2F2ZQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfbWVzc2FnZT1TYXZpbmcgezB9Ci1BYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw9TW92ZSBOb2RlCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JyZWZyZXNoZnJvbWJhc2U9UmVmcmVzaCBGcm9tIEJhc2UKLUFic3RyYWN0RGlhZ3JhbV9CZW5kUG9pbnRfY3JlYXRlPUNyZWF0ZSBCZW5kcG9pbnQKLQotQWN0aXZpdHlEaWFncmFtX29wZW5BY3Rpdml0eURldGFpbERpYWdyYW1fdGV4dD1PcGVuIEFjdGl2aXR5IERldGFpbCBEaWFncmFtCi1yZWZyZXNoQWN0aW9uX2xhYmVsPVJlZnJlc2gKLXJlZnJlc2hGcm9tQmFzZUNtZF9sYWJlbD1SZWZyZXNoIEZyb20gQmFzZQotZGlhZ3JhbV9zYXZlRXJyb3I9SVVQRDAwMDFXOiBTYXZpbmcgZGlhZ3JhbSBmYWlsZWQKLQotRGVsZXRlRGlhZ3JhbV90ZXh0PURlbGV0ZSBEaWFncmFtCi1EZWxldGVEaWFncmFtX3Byb21wdD1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY2xvc2UgYW5kIGRlbGV0ZSB0aGlzIGRpYWdyYW0/XG5UaGlzIGNoYW5nZSBpcyBwZXJtYW5lbnQgYW5kIGNhbm5vdCBiZSB1bmRvbmUuCi1hbGlnbl9iZW5kX3BvaW50X3RleHQ9QWxpZ24gQmVuZCBQb2ludAotQ29uZmlndXJhdGlvbkVkaXRvcklucHV0X2NvbmZpZ2VkaXRvcjA9Q29uZmlndXJhdGlvbiBFZGl0b3IKLWRpYWdyYW1fbm9kZV9wcm9wZXJ0eV92YWx1ZV9wcm9ibGVtX21zZz1FcnJvciBpbiB0aGUgbm9kZSdzIHByb3BlcnR5IHZhbHVlLgotZGlhZ3JhbV9lcnJvckRpYWxvZ190aXRsZV90ZXh0MD1FcnJvcgotCi1BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JfUmVzZXREaWFncmFtTGF5b3V0X3RleHQ9UmVzZXQgRGlhZ3JhbSBMYXlvdXQKLWVycm9yRGlhbG9nX3RpdGxlPUVycm9yCi1jb21tYW5kX2Nhbm5vdEVkaXQ9SVVQRDAwMDNFOiBDYW5ub3QgZWRpdCBkaWFncmFtCi0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90aXRsZT1QYXJlbnQgRWRpdG9yIENsb3NlZAotQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RleHQ9ezB9IGhhcyBjbG9zZWQuIFdvdWxkIHlvdSBhbHNvIGxpa2UgdG8gY2xvc2UgezF9PwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9UZW1wbGF0ZUNvbnN0YW50cy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9UZW1wbGF0ZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDhmMzE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvVGVtcGxhdGVDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci0KLS8qKgotICogQ29uc3RhbnRzIHVzZWQgaW4gYXV0aG9yaW5nIGRpYWdyYW0KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUZW1wbGF0ZUNvbnN0YW50cyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUWSA9ICJhY3Rpdml0eSB0ZW1wbGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElURVJBVElPTiA9ICJpdGVyYXRpb24gdGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSEFTRSA9ICJwaGFzZSB0ZW1wbGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkNIX0JBUiA9ICJzeW5jaG9uaXphdGlvbiBiYXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUNJU0lPTl9OT0RFID0gImRlY2lzaW9uIG5vZGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9OT0RFID0gInN0YXJ0IG5vZGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfTk9ERSA9ICJlbmQgbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfUFJPRFVDVCA9ICJ3b3JrIHByb2R1Y3QgdGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX0RFU0NSSVBUT1IgPSAicm9sZSBkZXNjcmlwdG9yIHRlbXBsYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19ERVNDUklQVE9SID0gInRhc2sgZGVzY3JpcHRvciB0ZW1wbGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SID0gIndvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIHRlbXBsYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJFRV9URVhUID0gImZyZWUgdGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRPRE86IG1vdmUgdGhlc2UgY29uc3RhbnRzIHRvIG90aGVyIGZpbGUuIFRoaXMgY2xhc3MgZGVmaW5lIG9ubHkgdGVtcGxhdGUKLQkvLyBjb25zdGFudHMKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0ZPTlRfTkFNRSA9ICJwcm9wZXJ0eV9mb250X25hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9GT05UX1NUWUxFID0gInByb3BlcnR5X2ZvbnRfc3R5bGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9GT05UX0hFSUdIVCA9ICJwcm9wZXJ0eV9mb250X2hlaWdodCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0ZPTlRfUkVEID0gInByb3BlcnR5X2ZvbnRfcmVkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRk9OVF9CTFVFID0gInByb3BlcnR5X2ZvbnRfYmx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0ZPTlRfR1JFRU4gPSAicHJvcGVydHlfZm9udF9ncmVlbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIEZvciBkZWZhdWx0IGZvbnRzLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRk9OVF9OQU1FID0gZ2V0Rm9udE5hbWUoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfRk9OVF9TSVpFID0gODsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9udCBERUZBVUxUX0ZPTlQgPSBuZXcgRm9udChudWxsLCBERUZBVUxUX0ZPTlRfTkFNRSwKLQkJCURFRkFVTFRfRk9OVF9TSVpFLCBqYXZhLmF3dC5Gb250LlBMQUlOKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9udCBERUZBVUxUX0ZPTlRfSVRBTElDID0gbmV3IEZvbnQobnVsbCwKLQkJCURFRkFVTFRfRk9OVF9OQU1FLCBERUZBVUxUX0ZPTlRfU0laRSwgamF2YS5hd3QuRm9udC5JVEFMSUMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lOXzJLID0gIldpbmRvd3MgMjAwMCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEZvbnROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9ICJBcmlhbCI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDb3JydXB0ZWQgSmFwYW5lc2UgY2hhcmFjdGVycyBpbiBBY3Rpdml0eSBEaWFncmFtcwotCQlTdHJpbmcgY3VycmVudExvY2FsZSA9IFBsYXRmb3JtLmdldE5MKCk7Ci0JCWlmIChjdXJyZW50TG9jYWxlICE9IG51bGwKLQkJCQkmJiBjdXJyZW50TG9jYWxlLnN0YXJ0c1dpdGgoTG9jYWxlLkpBUEFORVNFLmdldExhbmd1YWdlKCkpKSB7Ci0JCQlpZiAoV0lOXzJLLmVxdWFsc0lnbm9yZUNhc2UoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQluYW1lID0gTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX1JPTEVfVEFTS1NfQk9YX0JHX0NPTE9SX1JHQiA9ICJBRERfUk9MRV9UQVNLU19CT1hfQkdfQ09MT1JfUkdCIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9XUF9CT1hfQkdfQ09MT1JfUkdCID0gIkFERF9XUF9CT1hfQkdfQ09MT1JfUkdCIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9WYWxpZGF0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1ZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RiMTlkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1ZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0vKioKLSAqIFZhbGlkYXRpbmcgcm91dGluZXMgZm9yIGRpYWdyYW0gZWRpdGluZwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWYWxpZGF0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBlcnJNc2dfQ2FuTm90Q29ubmVjdCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0OyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBlcnJNc2dfU2FtZVByZWRBbmRTdWNjID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGlhZ3JhbVZhbGlkYXRpb25fZXJyX3NhbWVwcmVkYW5kc3VjX3RleHQ7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGVyck1zZ19DYW5Ob3REZWxldGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2RlbGV0ZV90ZXh0OyAKLQotCS8qKgotCSAqIENoZWNrcyBpZiB1c2VyIGNhbiBjb25uZWN0IHRoZSBnaXZlbiBub2Rlcy4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHBhcmFtIHRhcmdldAotCSAqIEByZXR1cm4gbnVsbCBpZiBjb25uZWN0aW9uIGlzIGFsbG93ZWQsIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrQ29ubmVjdChOb2RlIHNvdXJjZSwgTm9kZSB0YXJnZXQpIHsKLQkJaWYgKHNvdXJjZS5nZXREaWFncmFtKCkgIT0gdGFyZ2V0LmdldERpYWdyYW0oKSkKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2Nvbm5lY3RfdGV4dDsKLQotCQlpZiAoc291cmNlLmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGlhZ3JhbSkgewotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoc291cmNlLmdldERpYWdyYW0oKQotCQkJCQkuZ2V0T2JqZWN0KCksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlPYmplY3QgcHJvYyA9IG51bGw7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCXByb2MgPSAoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcikuZ2V0VG9wSXRlbSgpOwotCQkJfQotCQkJLy8gZ2V0IGFsbCBicmVha2Rvd24gZWxlbWVudHMgaW4gdGhpcyBwcm9jZXNzCi0JCQlMaXN0PE9iamVjdD4gYWxsRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkJcHJvYyk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlhbGxFbGVtZW50cy5hZGQoVG5nVXRpbC51bndyYXAob2JqKSk7Ci0JCQl9Ci0JCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQkJLy8gSWYgdGFyZ2V0IGlzIFJlYWRPbmx5IChtZWFucyBleHRlbmRzKSBhbmQgYWxsb3cgdGhlIGxpbmsgaWYKLQkJCQkvLyBpdHMgcGFyZW50IGFjdGl2aXR5IGlzIGEgQ29udHJpYnV0b3IKLQkJCQlpZiAodGFyZ2V0LmdldERpYWdyYW0oKS5pc1JlYWRPbmx5KCkpCi0JCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQlpZiAoc291cmNlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJaWYgKHRhcmdldC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQlpZiAoUHJvY2Vzc1V0aWwuY2hlY2tDaXJjdWxhcigKLQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSB0YXJnZXQuZ2V0T2JqZWN0KCksCi0JCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgc291cmNlLmdldE9iamVjdCgpLAotCQkJCQkJCQlhbGxFbGVtZW50cykpIHsKLQkJCQkJCQlyZXR1cm4gZXJyTXNnX1NhbWVQcmVkQW5kU3VjYzsKLQkJCQkJCX0KLQkJCQkJCWlmICh0YXJnZXQuaXNSZWFkT25seSgpKQotCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQkJCS8vIHNob3VsZCBub3QgYWxsb3cgaW5jb21pbmcgY29ubmVjdGlvbiB0byBzdGFydCBub2RlCi0JCQkJCQkvLyBhbmQgRnJlZVRleHQuCi0JCQkJCQlpZiAoKChUeXBlZE5vZGUpIHRhcmdldCkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TVEFSVAotCQkJCQkJCQl8fCAoKFR5cGVkTm9kZSkgdGFyZ2V0KS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkZSRUVfVEVYVCkgewotCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQkJCX0KLQotCQkJCQkJQ29sbGVjdGlvbiB0YXJnZXROb2RlcyA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkJLmdldFRhcmdldE5vZGVzKChUeXBlZE5vZGUpIHRhcmdldCwKLQkJCQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpOwotCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgc291cmNlCi0JCQkJCQkJCS5nZXRPYmplY3QoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhcmdldE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlOb2RlIG5vZGUgPSAoKE5vZGUpIGl0ZXIubmV4dCgpKTsKLQkJCQkJCQlpZiAobm9kZS5pc1JlYWRPbmx5KCkpCi0JCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQkJCQlpZiAoUHJvY2Vzc1V0aWwuY2hlY2tDaXJjdWxhcigKLQkJCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZS5nZXRPYmplY3QoKSwKLQkJCQkJCQkJCXByZWQsIGFsbEVsZW1lbnRzKSkgewotCQkJCQkJCQlyZXR1cm4gZXJyTXNnX1NhbWVQcmVkQW5kU3VjYzsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCQlpZiAodGFyZ2V0ID09IHNvdXJjZSkgewotCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQl9Ci0JCQkJCS8vIHNob3VsZCBub3QgYWxsb3cgb3V0Z29pbmcgY29ubmVjdGlvbiBmcm9tIEVuZCBOb2RlIGFuZAotCQkJCQkvLyBGcmVlIFRleHQKLQkJCQkJaWYgKCgoVHlwZWROb2RlKSBzb3VyY2UpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuRU5ECi0JCQkJCQkJfHwgKChUeXBlZE5vZGUpIHNvdXJjZSkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5GUkVFX1RFWFQpIHsKLQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQkJfQotCi0JCQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQotCQkJCQkJLyoKLQkJCQkJCSAqIElmIHNvdXJjZSBhbmQgdGFyZ2V0IGFyZSBUeXBlZE5vZGVzLCBhdm9pZCBjaXJjdWxhcgotCQkJCQkJICogbG9vcCBjb25uZWN0aW9uLgotCQkJCQkJICovCi0JCQkJCQlpZiAoY2hlY2tTeW5jQmFyQ2lyY3VsYXJMb29vcCgoVHlwZWROb2RlKSBzb3VyY2UsCi0JCQkJCQkJCShUeXBlZE5vZGUpIHRhcmdldCkgIT0gbnVsbCkgewotCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQkJCX0KLQotCQkJCQkJLy8gc2hvdWxkIG5vdCBhbGxvdyBpbmNvbWluZyBjb25uZWN0aW9uIHRvIHN0YXJ0IG5vZGUKLQkJCQkJCS8vIGFuZCBGcmVlVGV4dC4KLQkJCQkJCWlmICgoKFR5cGVkTm9kZSkgdGFyZ2V0KS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNUQVJUCi0JCQkJCQkJCXx8ICgoVHlwZWROb2RlKSB0YXJnZXQpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuRlJFRV9URVhUKSB7Ci0JCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQkJfQotCi0JCQkJCQlDb2xsZWN0aW9uIHNyY05vZGVzID0gR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCQkuZ2V0U291cmNlTm9kZXMoKFR5cGVkTm9kZSkgc291cmNlLAotCQkJCQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5jbGFzcyk7Ci0JCQkJCQlpZiAoIXNyY05vZGVzLmlzRW1wdHkoKSkgewotCQkJCQkJCUNvbGxlY3Rpb24gdGFyZ2V0Tm9kZXMgPSBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJCQkuZ2V0VGFyZ2V0Tm9kZXMoKFR5cGVkTm9kZSkgdGFyZ2V0LAotCQkJCQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhcmdldE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCU5vZGUgbm9kZSA9ICgoTm9kZSkgaXRlci5uZXh0KCkpOwotCQkJCQkJCQlpZiAobm9kZS5pc1JlYWRPbmx5KCkpCi0JCQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHN1Y2MgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUKLQkJCQkJCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzcmNOb2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSAoKE5vZGUpIGl0ZXJhdG9yCi0JCQkJCQkJCQkJCS5uZXh0KCkpLmdldE9iamVjdCgpOwotCQkJCQkJCQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQ2lyY3VsYXIoc3VjYywgcHJlZCwKLQkJCQkJCQkJCQkJYWxsRWxlbWVudHMpKSB7Ci0JCQkJCQkJCQkJcmV0dXJuIGVyck1zZ19TYW1lUHJlZEFuZFN1Y2M7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0KLQkJCQkJCWlmICh0YXJnZXQuaXNSZWFkT25seSgpKQotCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQotCQkJCQkJQ29sbGVjdGlvbiBzcmNOb2RlcyA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkJLmdldFNvdXJjZU5vZGVzKChUeXBlZE5vZGUpIHNvdXJjZSwKLQkJCQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpOwotCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgc3VjYyA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgKChOb2RlKSB0YXJnZXQpCi0JCQkJCQkJCS5nZXRPYmplY3QoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzcmNOb2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpICgoTm9kZSkgaXRlcmF0b3IKLQkJCQkJCQkJCS5uZXh0KCkpLmdldE9iamVjdCgpOwotCQkJCQkJCWlmIChQcm9jZXNzVXRpbC5jaGVja0NpcmN1bGFyKHN1Y2MsIHByZWQsCi0JCQkJCQkJCQlhbGxFbGVtZW50cykpIHsKLQkJCQkJCQkJcmV0dXJuIGVyck1zZ19TYW1lUHJlZEFuZFN1Y2M7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc291cmNlLmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQkJaWYgKHNvdXJjZS5pc1JlYWRPbmx5KCkgfHwgdGFyZ2V0LmlzUmVhZE9ubHkoKSkgewotCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCX0KLQotCQkJaWYgKChzb3VyY2UuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvciB8fCB0YXJnZXQKLQkJCQkJLmdldE9iamVjdCgpIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpCi0JCQkJCXx8IChzb3VyY2UuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvciAmJiB0YXJnZXQKLQkJCQkJCQkuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikKLQkJCQkJfHwgKHNvdXJjZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvciAmJiB0YXJnZXQKLQkJCQkJCQkuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpKSB7Ci0JCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJfSBlbHNlIHsKLQkJCQkvLyBjaGVjayBmb3IgZHVwbGljYXRlIGNvbm5lY3Rpb24KLQkJCQkvLwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNvdXJjZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAobGluay5nZXRUYXJnZXQoKSA9PSB0YXJnZXQpIHsKLQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9IGVsc2UgaWYgKHNvdXJjZS5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKSB7Ci0JCQlpZiAoc291cmNlLmlzUmVhZE9ubHkoKSB8fCB0YXJnZXQuaXNSZWFkT25seSgpKSB7Ci0JCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tEZWxldGUoTGluayBsaW5rKSB7Ci0KLQkJLy8gaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbAotCQkvLyAmJiBsaW5rLmdldFRhcmdldCgpLmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGlhZ3JhbSkgewotCQkvLyBpZiAobGluay5nZXRUYXJnZXQoKS5pc1JlYWRPbmx5KCkpewotCQkvLyBpZihsaW5rLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgVHlwZWROb2RlKXsKLQkJLy8gaWYoKChUeXBlZE5vZGUpbGluay5nZXRTb3VyY2UoKSkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5ERUNJU0lPTil7Ci0JCS8vIHJldHVybiBudWxsOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCS8vIH0KLQkJLy8gaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJLy8JCQkJCi0JCS8vIFR5cGVkTm9kZSB0eXBlZG5vZGUgPSAoVHlwZWROb2RlKWxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCS8vIGlmKHR5cGVkbm9kZS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkRFQ0lTSU9OKXsKLQkJLy8gcmV0dXJuIG51bGw7Ci0JCS8vIH0KLQkJLy8gaWYobGluay5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZSl7Ci0JCS8vIHR5cGVkbm9kZSA9IChUeXBlZE5vZGUpbGluay5nZXRTb3VyY2UoKTsKLQkJLy8gaWYodHlwZWRub2RlLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuREVDSVNJT04pewotCQkvLyByZXR1cm4gbnVsbDsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vCQkJCQotCQkvLyBpZiAobGluay5nZXRTb3VyY2UoKS5pc1JlYWRPbmx5KCkpCi0JCS8vIHJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkvLwkJCQkKLQkJLy8gaWYgKGxpbmsuZ2V0U291cmNlKCkuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudAotCQkvLyB8fCAobGluay5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZSAmJiAhR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkvLyAuZ2V0U291cmNlTm9kZXMoKFR5cGVkTm9kZSkgbGluay5nZXRTb3VyY2UoKSwKLQkJLy8gV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKQotCQkvLyAuaXNFbXB0eSgpKSkgewotCQkvLwkJCQkJCi0JCS8vIENvbGxlY3Rpb24gdGFyZ2V0Tm9kZXMgPQotCQkvLyBHcmFwaGljYWxEYXRhSGVscGVyLmdldFRhcmdldE5vZGVzKChUeXBlZE5vZGUpIGxpbmsuZ2V0VGFyZ2V0KCksCi0JCS8vIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5jbGFzcyk7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHRhcmdldE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCS8vIGlmIChub2RlLmlzUmVhZE9ubHkoKSkgewotCQkvLyByZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJLy8KLQkJLy8gfQotCQkvLyBpZiAobGluay5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkvLyBUeXBlZE5vZGUgdHlwZWRub2RlID0gKFR5cGVkTm9kZSlsaW5rLmdldFNvdXJjZSgpOwotCQkvLyBpZih0eXBlZG5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5ERUNJU0lPTil7Ci0JCS8vIHJldHVybiBudWxsOwotCQkvLyB9Ci0JCS8vIGlmIChsaW5rLmdldFRhcmdldCgpLmlzUmVhZE9ubHkoKSkKLQkJLy8gcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCS8vIH0KLQkJLy8gfSBlbHNlIGlmICgobGluay5nZXRUYXJnZXQoKSAhPSBudWxsICYmCi0JCS8vIGxpbmsuZ2V0VGFyZ2V0KCkuaXNSZWFkT25seSgpKQotCQkvLyB8fCAobGluay5nZXRTb3VyY2UoKSAhPSBudWxsICYmIGxpbmsuZ2V0U291cmNlKCkuaXNSZWFkT25seSgpKSkgewotCQkvLyByZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJLy8gfQotCQkvLyByZXR1cm4gbnVsbDsKLQotCQlOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCU5vZGUgdGFyZ2V0ID0gbGluay5nZXRUYXJnZXQoKTsKLQotCQkvLyBTcGVjaWFsIGhhbmRsZSBmb3IgQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gbGlua3MgY2Fubm90IGJlIGRlbGV0ZWQuCi0JCWlmICh0YXJnZXQgIT0gbnVsbAotCQkJCSYmIHRhcmdldC5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQl9Ci0KLQkJaWYgKHRhcmdldCAhPSBudWxsICYmIHRhcmdldC5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURpYWdyYW0pIHsKLQotCQkJLy8gVGFyZ2V0ID0gYnJlYWtkb3duZWxlbWVudAotCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJCS8vIFNvdXJjZSA9IEJyZWFrZG93biBlbGVtZW50Ci0JCQkJaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJCQlpZiAobGluay5nZXRUYXJnZXQoKS5pc1JlYWRPbmx5KCkpCi0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCS8vIFNvdXJjZSA9IFR5cGVkTm9kZQotCQkJCWlmIChzb3VyY2UgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQkJLy8gU291cmNlID0gRGVjaXNpb24gTm9kZQotCQkJCQlUeXBlZE5vZGUgc291cmNlTm9kZSA9IChUeXBlZE5vZGUpIHNvdXJjZTsKLQkJCQkJaWYgKCF0YXJnZXQuaXNSZWFkT25seSgpKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfSBlbHNlIGlmIChzb3VyY2VOb2RlLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuREVDSVNJT04pIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9IGVsc2UgaWYgKHNvdXJjZU5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TWU5DSF9CQVIpIHsKLQkJCQkJCXJldHVybiBjaGVja1N5bmNCYXJJbmNvbWluZ0xpbmtzKHNvdXJjZU5vZGUpOwotCQkJCQl9IGVsc2UgaWYgKHNvdXJjZU5vZGUuaXNSZWFkT25seSgpKSB7Ci0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0vLyBUYXJnZXQgaXMgVHlwZWROb2RlCi0JCQllbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQotCQkJCVR5cGVkTm9kZSB0eXBlZE5vZGUgPSAoVHlwZWROb2RlKSB0YXJnZXQ7Ci0JCQkJLy8gaWYgVGFyZ2V0IGlzIFR5cGVkTm9kZSBhbmQgaXRzIGEgRGVjaXNpb25Qb2ludCAtIHNob3VsZCBiZQotCQkJCS8vIGJsYWNrLgotCQkJCWlmICh0eXBlZE5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5ERUNJU0lPTikgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJLy8gSWYgVGFyZ2V0IGlzIFR5cGVkTm9kZSBhbmQgYW5kIFNvdXJjZSBpcyBXb3JrQnJlYWtkb3duRWxlbWVudAotCQkJCS8vIGFuZCByZWFkb25seQotCQkJCS8vIExpbmsgc2hvdWxkIGJlIGdyZWVuLgotCQkJCWlmIChzb3VyY2UgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQkJLy8gQ2hlY2sgVGFyZ2V0IC0gaXMgaGF2aW5nIGFueSBpbmRpcmVjdChvdXRnb2luZwotCQkJCQkvLyBjb25ubmVjdGlvbikgY29udGFpbnMgZGVjaXNpb24gcG9pbnRzLgotCQkJCQlpZiAoY2hlY2tTeW5jQmFyT3V0Z29pbmdMaW5rcygoVHlwZWROb2RlKSB0YXJnZXQpID09IG51bGwpCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJaWYgKHNvdXJjZS5pc1JlYWRPbmx5KCkpCi0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCQl9Ci0JCQkJaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCQlUeXBlZE5vZGUgc291cmNlVHlwZWROb2RlID0gKFR5cGVkTm9kZSkgc291cmNlOwotCQkJCQkvLyBTb3VyY2UgaXMgVHlwZWQgTm9kZSBhbmQgaXRzIGEgZGVjaXNpb24gcG9pbnQgcmV0dXJuCi0JCQkJCS8vIG51bGwuCi0JCQkJCWlmIChzb3VyY2VUeXBlZE5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5ERUNJU0lPTikgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQkJLy8gaWYgc291cmNlIGlzIFN5bmNCYXIgYW5kIGNoZWNrIGFsbCBpdHMgaW5jb21pbmcKLQkJCQkJLy8gY29ubmVjdGlvbnMuCi0JCQkJCWlmIChzb3VyY2VUeXBlZE5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TWU5DSF9CQVIpIHsKLQkJCQkJCXJldHVybiBjaGVja1N5bmNCYXJJbmNvbWluZ0xpbmtzKHNvdXJjZVR5cGVkTm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tEZWxldGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmlzUmVhZE9ubHkoKSkKLQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQlEaWFncmFtIGRpYWdyYW0gPSBub2RlLmdldERpYWdyYW0oKTsKLQkJaWYgKGRpYWdyYW0gaW5zdGFuY2VvZiBBY3Rpdml0eURpYWdyYW0pIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJQ29sbGVjdGlvbiB0YXJnZXROb2RlcyA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0VGFyZ2V0Tm9kZXMoCi0JCQkJCQkoVHlwZWROb2RlKSBub2RlLCBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhcmdldE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlOb2RlIHRhcmdldCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKHRhcmdldC5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGRpYWdyYW0gaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgUm9sZU5vZGUpIHsKLQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1JlY29ubmVjdChOb2RlIHNvdXJjZSwgTm9kZSB0YXJnZXQsIExpbmsgbGluaykgewotCQlpZiAoc291cmNlLmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGlhZ3JhbSkgewotCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkJCWlmIChsaW5rLmdldFRhcmdldCgpLmlzUmVhZE9ubHkoKSkgewotCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQkJCUNvbGxlY3Rpb24gdGFyZ2V0Tm9kZXMgPSBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJCS5nZXRUYXJnZXROb2RlcygoVHlwZWROb2RlKSBsaW5rLmdldFRhcmdldCgpLAotCQkJCQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5jbGFzcyk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXROb2Rlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmIChub2RlLmlzUmVhZE9ubHkoKSkgewotCQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNoZWNrQ29ubmVjdChzb3VyY2UsIHRhcmdldCwgbGluayk7Ci0JfQotCi0JLyoKLQkgKiBNZXRob2Qgd2lsbCBub3QgYWxsb3cgbXVsdGlwbGUgbGluayBiZXR3ZWVuIHR3byBub2Rlcy4gTmVlZHMgdG8gY2FsbAotCSAqIENyZWFrTGlua0NvbW1hbmQgYW5kIFJlY29ubmVjdExpbmtDb21tYW5kLiBBbnkgYWN0aW9uIG9uIGEgTGluayBzaG91bGQKLQkgKiBjYWxsIHRoaXMgY2hlY2tDb25uZWN0KE5vZGUgc291cmNlLCBOb2RlIHRhcmdldCwgTGluayBsaW5rKSBiZWZvcmUgYWxsb3cKLQkgKiB0byBjb25uZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrQ29ubmVjdChOb2RlIHNvdXJjZSwgTm9kZSB0YXJnZXQsIExpbmsgbGluaykgewotCi0JCWlmIChzb3VyY2UgPT0gdGFyZ2V0ICYmICEoc291cmNlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCX0KLQotCQlMaXN0IGxpbmtzID0gc291cmNlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKTsKLQkJaWYgKGxpbmtzICE9IG51bGwpIHsKLQkJCS8vIFRoaXMgaXMgbmVlZCBmb3IgcmVjb25uZWN0IHRvIHNhbWUgdGFyZ2V0IG5vZGUuCi0JCQlpZiAobGlua3MuY29udGFpbnMobGluaykpIHsKLQkJCQlpZiAobGluay5nZXRUYXJnZXQoKS5lcXVhbHModGFyZ2V0KSkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBUaGlzIGlzIG5lZWQgZm9yIG5ldyBjb25uZWN0IGFuZCByZWNvbm5lY3QgdG8gZGlmZmVyZW50IHRhcmdldAotCQkJLy8gbm9kZS4KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpbmtzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGlua3ggPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IGxpbmt4dGFyZ2V0ID0gbGlua3guZ2V0VGFyZ2V0KCk7Ci0JCQkJaWYgKGxpbmt4dGFyZ2V0ICE9IG51bGwgJiYgbGlua3h0YXJnZXQuZXF1YWxzKHRhcmdldCkpIHsKLQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hlY2tDb25uZWN0KHNvdXJjZSwgdGFyZ2V0KTsKLQl9Ci0KLQkvKgotCSAqIFRvIGF2b2lkIGNpcmN1bGFyIGxvb3BpbmcgYmV0d2VlbiBzeW5jaHJvbml6YXRpb24gYmFycy4gSWYgU3ljbkJhcjEgLT4KLQkgKiBTeW5jQmFyMiAoY29ubmVjdGVkKSB0aGVuIFN5bmNCYXIyIC0+IFN5bmNCYXIxIGNhbm5vdCBjb25uZWN0LiBpZgotCSAqIHN5bmNiYXIxIC0+IHN5bmNiYXIyLT5zeW5jYmFyMyB0aGVuIHN5bmNiYXIzIC0+IHN5bmNiYXIxIGRpc2FsbG93ZWQuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tTeW5jQmFyQ2lyY3VsYXJMb29vcChUeXBlZE5vZGUgc05vZGUsCi0JCQlUeXBlZE5vZGUgdE5vZGUpIHsKLQkJTGlzdCBsaXN0ID0gdE5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpOwotCQlpZiAoIWxpc3QuaXNFbXB0eSgpICYmIGxpc3Quc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJTm9kZSB0eXBlZG5vZGUgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJCWlmIChzTm9kZS5lcXVhbHModHlwZWRub2RlKSkKLQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCWlmICh0eXBlZG5vZGUgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQkJcmV0dXJuIGNoZWNrU3luY0JhckNpcmN1bGFyTG9vb3Aoc05vZGUsCi0JCQkJCQkJKFR5cGVkTm9kZSkgdHlwZWRub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBNZXRob2QgdG8gQ2hlY2sgaWYgU3luY0JhciBpbkNvbW1pbmcgY29ubmVjdGlvbnMgaGF2ZSBhbnkgc291cmNlIGlzIGEKLQkgKiByZWFkb25seS4gQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrU3luY0JhckluY29taW5nTGlua3MoVHlwZWROb2RlIHR5cGVkTm9kZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlZE5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJTm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCQkJaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJCWlmIChzb3VyY2UuaXNSZWFkT25seSgpKQotCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCX0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJaWYgKCgoVHlwZWROb2RlKSBzb3VyY2UpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1lOQ0hfQkFSKQotCQkJCQlpZiAoY2hlY2tTeW5jQmFySW5jb21pbmdMaW5rcygoVHlwZWROb2RlKSBzb3VyY2UpICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIE1ldGhvZCB0byBjaGVjayBpZiBzeW5jaHJvbml6YXRpb24gYmFyIG91dGdvaW5nIGNvbm5lY3Rpb24gaGFzIGFueSB0YXJnZXQKLQkgKiBpcyByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1N5bmNCYXJPdXRnb2luZ0xpbmtzKFR5cGVkTm9kZSB0eXBlZE5vZGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCU5vZGUgdGFyZ2V0ID0gbGluay5nZXRUYXJnZXQoKTsKLQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQlpZiAodGFyZ2V0LmlzUmVhZE9ubHkoKSkKLQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCWlmICgoKFR5cGVkTm9kZSkgdGFyZ2V0KS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNZTkNIX0JBUikKLQkJCQkJaWYgKGNoZWNrU3luY0Jhck91dGdvaW5nTGlua3MoKFR5cGVkTm9kZSkgdGFyZ2V0KSAhPSBudWxsKQotCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIGxpbmsgaXMgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZE9ubHkoTGluayBsaW5rKSB7Ci0JCU5vZGUgdGFyZ2V0ID0gbGluay5nZXRUYXJnZXQoKTsKLQkJTm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCQlpZiAodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0LmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGlhZ3JhbSkgewotCQkJcmV0dXJuIGNoZWNrRGVsZXRlKGxpbmspICE9IG51bGw7Ci0JCX0gZWxzZSBpZiAodGFyZ2V0ICE9IG51bGwKLQkJCQkmJiB0YXJnZXQuZ2V0RGlhZ3JhbSgpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7Ci0JCQlpZiAoKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZSBpbnN0YW5jZW9mIFRhc2tOb2RlICYmIHNvdXJjZQotCQkJCQkuaXNSZWFkT25seSgpKQotCQkJCQl8fCAodGFyZ2V0IGluc3RhbmNlb2YgVGFza05vZGUgJiYgdGFyZ2V0LmlzUmVhZE9ubHkoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE5OGE2Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIHRoZSBhY3Rpdml0eSBkaWFncmFtcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZmI4NmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0Fic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU1dUR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVDb250YWluZXJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLlNlbGVjdGFibGVMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5EaWFncmFtSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5MYXllck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5TY2FsYWJsZUZyZWVmb3JtUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5TY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGEgZ3JhcGhpY2FsIHZpZXdlciBvZiB0aGUgZWxlbWVudCBkaWFncmFtLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIHsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgcGFyZW50OwotCi0JcHJvdGVjdGVkIEdyYXBoaWNhbFZpZXdlciBncmFwaGljYWxWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHdyYXBwZXI7Ci0KLQlwdWJsaWMgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCWNyZWF0ZUdyYXBoaWNhbFZpZXdlcigpOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgT2JqZWN0IHdyYXBwZXIpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMud3JhcHBlciA9IHdyYXBwZXI7Ci0JCWNyZWF0ZUdyYXBoaWNhbFZpZXdlcigpOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBHcmFwaGljYWxWaWV3ZXIgb24gdGhlIHNwZWNpZmllZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+Ci0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR3JhcGhpY2FsVmlld2VyKCkgewotCQl0aGlzLmdyYXBoaWNhbFZpZXdlciA9IG5ldyBTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIoKTsKLQkJdGhpcy5ncmFwaGljYWxWaWV3ZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQljb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBncmFwaGljYWwgdmlld2VyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGdyYXBoaWNhbCB2aWV3ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgR3JhcGhpY2FsVmlld2VyIGdldEdyYXBoaWNhbFZpZXdlcigpIHsKLQkJcmV0dXJuIGdyYXBoaWNhbFZpZXdlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCWdldEdyYXBoaWNhbFZpZXdlcigpLmdldENvbnRyb2woKS5zZXRCYWNrZ3JvdW5kKAotCQkJCUNvbG9yQ29uc3RhbnRzLmxpc3RCYWNrZ3JvdW5kKTsKLQkJU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIpIGdldEdyYXBoaWNhbFZpZXdlcigpOwotCi0JCVNjYWxhYmxlRnJlZWZvcm1Sb290RWRpdFBhcnQgcm9vdCA9IG5ldyBTY2FsYWJsZUZyZWVmb3JtUm9vdEVkaXRQYXJ0KCk7Ci0JCXZpZXdlci5zZXRSb290RWRpdFBhcnQocm9vdCk7Ci0JCXZpZXdlci5zZXRFZGl0UGFydEZhY3RvcnkoY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkpOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGdldEZpZ3VyZSgpIHsKLQkJR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IGdldEdyYXBoaWNhbFZpZXdlcigpOwotCi0JCS8vIGZpbmQgdGhlIGZpZ3VyZSB0byBiZSBzYXZlZAotCQlMYXllck1hbmFnZXIgbG0gPSAoTGF5ZXJNYW5hZ2VyKSB2aWV3ZXIuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLmdldCgKLQkJCQlMYXllck1hbmFnZXIuSUQpOwotCQlJRmlndXJlIGZpZ3VyZSA9IGxtLmdldExheWVyKExheWVyQ29uc3RhbnRzLlBSSU5UQUJMRV9MQVlFUlMpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFN1cHByZXNzaW9uVG9EaWFncmFtKERpYWdyYW0gZGlhZ3JhbSkgewotCQlPYmplY3QgZSA9IGRpYWdyYW0uZ2V0T2JqZWN0KCk7Ci0JCWlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBlKTsKLQkJCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCQlkaWFncmFtLnNldFN1cHByZXNzaW9uKFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKHByb2MpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZGlhZ3JhbSBmb3IgZ2l2ZW4gb2JqZWN0IChvbmx5IGZvciB7QGxpbmsgQWN0aXZpdHl9IGFuZCBwYWNrcyB0aGUgYm91bmRzLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyIAl7QGxpbmsgT2JqZWN0fSAJCi0JICogQHBhcmFtIG5lZWRSZXNldCBib29sZWFuCi0JICogQHBhcmFtIGZpbHRlciAJe0BsaW5rIElGaWx0ZXJ9Ci0JICogQHBhcmFtIHN1cAkJe0BsaW5rIFN1cHByZXNzaW9ufQotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBsb2FkRGlhZ3JhbShPYmplY3Qgd3JhcHBlciwgYm9vbGVhbiBuZWVkUmVzZXQsCi0JCQlJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCS8vIGluaXRpYWxpemUgdGhlIHZpZXdlciB3aXRoIHRoZSBlZGl0IHBhcnQKLQkJRWRpdFBhcnQgZWRpdFBhcnQgPSBjcmVhdGVFZGl0UGFydCh3cmFwcGVyLCBmaWx0ZXIsIHN1cCk7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyLnNldENvbnRlbnRzKGVkaXRQYXJ0KTsKLQotCQkvLyBhc2sgZm9yIGltbWVkaWF0ZSB1cGRhdGUgb2YgdGhlIGNvbnRyb2wgc28gdGhhdCB0aGUgZGlhZ3JhbSBmaWd1cmUKLQkJLy8gd2lsbCBiZSBjb21wdXRlZAotCQlwYXJlbnQucGFjayh0cnVlKTsKLQotCQkvLyBUaGlzIGNoZWNrIGlzIG5lZWRlZCBmb3IgYnJvd3NpbmcsIGluIG9yZGVyIHRvIHJlbmRlciBhY3Rpdml0eSBjb250cmlidXRpbmcncwotCQkvLyBjaGlsZHJlbi4gIEluIHByb2Nlc3NBdXRob3Jpbmcgd2UgZG9uJ3QgZG8gcmVhbGl6YXRpb24sIGluIG9yZGVyIHRvIGRpc3BsYXllZCAKLQkJLy8gcmVhbGl6ZWQgZWxlbWVudHMsIHdlIGhhdmUgdG8gY2xlYW51cCBBREQgZGlhZ3JhbSBhbmQgcmVjcmVhdGUuIG5lZWR0b1Jlc2V0IG9yIGNsZWFudXBkaWFncmFtLgotCQkvLyBPbmx5IGZvciBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbS4KLQkJT2JqZWN0IG8gPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJaWYobyBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCAmJiBnZXREaWFncmFtVHlwZSgpICE9IG51bGwgJiYgCi0JCQkJZ2V0RGlhZ3JhbVR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUwpKXsKLQkJCWlmKFRuZ1V0aWwuaGFzQ29udHJpYnV0b3IoKFZhcmlhYmlsaXR5RWxlbWVudClvKSl7Ci0JCQkJbmVlZFJlc2V0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKG5lZWRSZXNldCkgewotCQkJY2xlYW5VcERpYWdyYW0oKTsKLQkJfQotCi0JCUlGaWd1cmUgZmlndXJlID0gZ2V0RmlndXJlKCk7Ci0JCWlmIChmaWd1cmUgIT0gbnVsbCkgewotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGZpZ3VyZS5nZXRCb3VuZHMoKTsKLQotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkJlZm9yZSB1cGRhdGU6IERpYWdyYW0gQm91bmRzID0gIiArIGJvdW5kcyk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChib3VuZHMueCA8IDAgfHwgYm91bmRzLnkgPCAwKSB7Ci0JCQkJKChEaWFncmFtRWRpdFBhcnQpIGVkaXRQYXJ0KS5tb3ZlRmlndXJlKC1ib3VuZHMueCwgLWJvdW5kcy55KTsKLQotCQkJCXBhcmVudC5wYWNrKHRydWUpOwotCi0JCQkJYm91bmRzID0gZmlndXJlLmdldEJvdW5kcygpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJBZnRlciB1cGRhdGU6IERpYWdyYW0gQm91bmRzID0gIiArIGJvdW5kcyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWRpdFBhcnQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERpYWdyYW1JbmZvKEdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQsIERpYWdyYW1JbmZvIGRpYWdyYW1JbmZvKSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSBwYXJ0LmdldENoaWxkcmVuKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSB7Ci0JCQkJbG9hZERpYWdyYW1JbmZvKChHcmFwaGljYWxFZGl0UGFydCkgbywgZGlhZ3JhbUluZm8pOwotCQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCQlwYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBvOwotCQkJCU9iamVjdCBtb2RlbCA9IHBhcnQuZ2V0TW9kZWwoKTsKLQkJCQlPYmplY3QgZSA9IG1vZGVsOwotCQkJCWlmIChlIGluc3RhbmNlb2YgTGlua2VkT2JqZWN0KSB7Ci0JCQkJCWUgPSAoKExpbmtlZE9iamVjdCkgZSkuZ2V0T2JqZWN0KCk7Ci0JCQkJfQotCi0JCQkJaWYgKGUgaW5zdGFuY2VvZiBEaWFncmFtRWxlbWVudCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJYm9vbGVhbiBzdXBwcmVzc2VkOwotCQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBOYW1lZE5vZGUpIHsKLQkJCQkJCXN1cHByZXNzZWQgPSAoKE5hbWVkTm9kZSkgbW9kZWwpLmlzU3VwcHJlc3NlZCgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc3VwcHJlc3NlZCA9ICgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0U3VwcHJlc3NlZCgpCi0JCQkJCQkJCS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJfQotCi0JCQkJCQlJRmlndXJlIGYgPSBwYXJ0LmdldEZpZ3VyZSgpOwotCQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGYuZ2V0Qm91bmRzKCk7Ci0KLQkJCQkJCVN0cmluZyBhbHRUYWcgPSBudWxsOwotCQkJCQkJaWYgKGYgaW5zdGFuY2VvZiBTZWxlY3RhYmxlTGFiZWwpIHsKLQkJCQkJCQlhbHRUYWcgPSAoKFNlbGVjdGFibGVMYWJlbCkgZikuZ2V0VGV4dCgpOwotCQkJCQkJfQotCQkJCQkJZGlhZ3JhbUluZm8uYWRkQXJlYSgoTWV0aG9kRWxlbWVudCkgZSwgYm91bmRzLngsCi0JCQkJCQkJYm91bmRzLnksIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCwgYWx0VGFnLCBzdXBwcmVzc2VkKTsKLQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJFZGl0UGFydCBub3QgaGFuZGxlZDogIiArIG8pOwotCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHJldHVybnMge0BsaW5rIERpYWdyYW1JbmZvfQotCSAqIAotCSAqLwotCXB1YmxpYyBEaWFncmFtSW5mbyBnZXREaWFncmFtSW5mbygpIHsKLQkJRGlhZ3JhbUluZm8gZGlhZ3JhbUluZm8gPSBudWxsOwotCi0JCUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIHRoaXMuZ3JhcGhpY2FsVmlld2VyCi0JCQkJLmdldENvbnRlbnRzKCk7Ci0JCU9iamVjdCBlbGVtZW50ID0gcGFydC5nZXRNb2RlbCgpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIExpbmtlZE9iamVjdCkgewotCQkJZWxlbWVudCA9ICgoTGlua2VkT2JqZWN0KSBlbGVtZW50KS5nZXRPYmplY3QoKTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCWRpYWdyYW1JbmZvID0gbmV3IERpYWdyYW1JbmZvKGdldERpYWdyYW1UeXBlKCksCi0JCQkJCShNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLQkJCWxvYWREaWFncmFtSW5mbyhwYXJ0LCBkaWFncmFtSW5mbyk7Ci0JCX0KLQotCQlyZXR1cm4gZGlhZ3JhbUluZm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBkaWFncmFtIGltYWdlIGZyb20gZmlndXJlIGNyZWF0ZWQgaW4gbG9hZERpYWdyYW0gbWV0aG9kLgotCSAqIAotCSAqLwotCXB1YmxpYyBJbWFnZSBjcmVhdGVEaWFncmFtSW1hZ2UoKSB7Ci0JCUlGaWd1cmUgZmlndXJlID0gZ2V0RmlndXJlKCk7Ci0KLQkJU1dUR3JhcGhpY3MgZ3JhcGhpY3MgPSBudWxsOwotCQlHQyBnYyA9IG51bGw7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQotCQl0cnkgewotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGZpZ3VyZS5nZXRCb3VuZHMoKTsKLQkJCWludCBoZWlnaHQgPSBib3VuZHMuaGVpZ2h0OwotCQkJaW50IHdpZHRoID0gYm91bmRzLndpZHRoOwotCi0JCQkvLyBjcmVhdGUgYSBuZXcgaW1hZ2UgYW5kIHJlcGFpbnQgdGhlIGdyYXBoCi0JCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHdpZHRoLCBoZWlnaHQpOwotCQkJZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCQkJZ3JhcGhpY3MgPSBuZXcgU1dUR3JhcGhpY3MoZ2MpOwotCQkJZmlndXJlLnBhaW50KGdyYXBoaWNzKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJLy8gcmVsZWFzZSByZXNvdXJjZXMKLQkJCWlmIChncmFwaGljcyAhPSBudWxsKQotCQkJCWdyYXBoaWNzLmRpc3Bvc2UoKTsKLQkJCWlmIChnYyAhPSBudWxsKQotCQkJCWdjLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0cnkgewotCQkJaWYgKGdyYXBoaWNhbFZpZXdlciAhPSBudWxsKSB7Ci0JCQkJQ29udHJvbCBjdHJsID0gZ3JhcGhpY2FsVmlld2VyLmdldENvbnRyb2woKTsKLQkJCQlpZiAoY3RybCAhPSBudWxsKSB7Ci0JCQkJCWN0cmwuZGlzcG9zZSgpOwotCQkJCX0KLQotCQkJCWdyYXBoaWNhbFZpZXdlciA9IG51bGw7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEVkaXRQYXJ0RmFjdG9yeSBjcmVhdGVFZGl0UGFydEZhY3RvcnkoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChPYmplY3QgZSwgSUZpbHRlciBmaWx0ZXIsCi0JCQlTdXBwcmVzc2lvbiBzdXApOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREaWFncmFtVHlwZSgpOwotCi0JcHJvdGVjdGVkIHZvaWQgY2xlYW5VcERpYWdyYW0oKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MDgxNWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkRpYWdyYW1BY3Rpb25TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRGlhZ3JhbVVwZGF0ZVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkRlZmF1bHRFZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgZ3JhcGhpY2FsIHZpZXdlciBmb3IgdGhlIEFjdGl2aXR5RGV0YWlsIGRpYWdyYW0uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIgZXh0ZW5kcyBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgewotCi0JcHVibGljIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXRQYXJ0RmFjdG9yeSBjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnRGYWN0b3J5KCk7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLkFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciNjcmVhdGVFZGl0UGFydChqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXIsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbikKLQkgKi8KLQotCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChPYmplY3QgZSwgSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQlBY3Rpdml0eURldGFpbERpYWdyYW0gZGlhZ3JhbSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQWN0aXZpdHlEZXRhaWxEaWFncmFtKCk7Ly8KLQkJZGlhZ3JhbS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJaWYgKHN1cCAhPSBudWxsKSB7Ci0JCQlkaWFncmFtLnNldFN1cHByZXNzaW9uKHN1cCk7Ci0JCX0KLQotCQlkaWFncmFtLnNldE9iamVjdChlKTsKLQkJRWRpdFBhcnQgcGFydCA9IG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCgKLQkJCQkoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBkaWFncmFtKTsKLQkJcGFydC5zZXRNb2RlbChkaWFncmFtKTsKLQkJcmV0dXJuIHBhcnQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFncmFtVHlwZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyI2NsZWFuVXBEaWFncmFtKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhblVwRGlhZ3JhbSgpIHsKLQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgZGVwID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSBnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCS5nZXRDb250ZW50cygpOwotCQlkZXAuZ2V0UmVjZW50bHlBZGRlZFBhcnRzKCkuYWRkQWxsKGRlcC5nZXRDaGlsZHJlbigpKTsKLQotCQkvLyBjbGVhbiB1cCB0aGUgZGlhZ3JhbQotCQlEZWZhdWx0RWRpdERvbWFpbiBlZGl0aW5nRG9tYWluID0gbmV3IERlZmF1bHRFZGl0RG9tYWluKG51bGwpOwotCQlBY3Rpb25SZWdpc3RyeSBhY3Rpb25SZWdpc3RyeSA9IG5ldyBBY3Rpb25SZWdpc3RyeSgpOwotCi0JCURpYWdyYW1BY3Rpb25TZXJ2aWNlIGFjdGlvblNlcnZpY2UgPSBuZXcgRGlhZ3JhbUFjdGlvblNlcnZpY2UoCi0JCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCksIGVkaXRpbmdEb21haW4sIGFjdGlvblJlZ2lzdHJ5KTsKLQkJYWN0aW9uU2VydmljZS5yZWdpc3RlclZlcnRpY2FsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKCk7Ci0KLQkJRGlhZ3JhbVVwZGF0ZVNlcnZpY2Ugc2VydmljZSA9IG5ldyBEaWFncmFtVXBkYXRlU2VydmljZSgKLQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKSwgZWRpdGluZ0RvbWFpbiwgYWN0aW9uUmVnaXN0cnkpOwotCQlzZXJ2aWNlLmNsZWFuVXBEaWFncmFtKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvQWN0aXZpdHlEaWFncmFtU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGlhZ3JhbVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRlYWU4OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvQWN0aXZpdHlEaWFncmFtU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlZhcmlhYmlsaXR5SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLkRpYWdyYW1JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLklBY3Rpdml0eURpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBQcm92aWRlcyBzZXJ2aWNlIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGRpYWdyYW0gaW1hZ2VzIGZvciBhY3Rpdml0eSBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEaWFncmFtU2VydmljZSBpbXBsZW1lbnRzIElBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudCA9IG51bGw7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBob2xkZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBGaWxlIHB1YkRpcjsKLQotCXByaXZhdGUgc3RhdGljIE1hcCB0eXBlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgRGlhZ3JhbUluZm8gZGlhZ3JhbUluZm8gPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hVbmNyZWF0ZWRBREQgPSB0cnVlOwotCQotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbiA9IHRydWU7Ci0KLQlzdGF0aWMgewotCQl0eXBlTWFwLnB1dChSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1csIG5ldyBJbnRlZ2VyKAotCQkJCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKSk7Ci0JCXR5cGVNYXAucHV0KFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUwsIG5ldyBJbnRlZ2VyKAotCQkJCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSkpOwotCQl0eXBlTWFwLnB1dChSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWSwgbmV3IEludGVnZXIoCi0JCQkJSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0pKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRJbnRUeXBlKFN0cmluZyBkaWFncmFtVHlwZSkgewotCQlJbnRlZ2VyIHR5cGUgPSAoSW50ZWdlcikgdHlwZU1hcC5nZXQoZGlhZ3JhbVR5cGUpOwotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdHlwZS5pbnRWYWx1ZSgpOwotCQl9Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCVNoZWxsIHNoZWxsID0gbnVsbDsKLQotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKCkgewotCQl0aGlzKG51bGwsIG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpKSk7Ci0JfQotCi0JcHVibGljIEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoRmlsZSBwdWJEaXIpIHsKLQkJdGhpcyhudWxsLCBwdWJEaXIpOwotCX0KLQotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKENvbXBvc2l0ZSBwYXJlbnQsIEZpbGUgcHViRGlyKSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLnB1YkRpciA9IHB1YkRpcjsKLQl9Ci0KLQlwcml2YXRlIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciBnZXREaWFncmFtVmlld2VyKGludCBkaWFncmFtVHlwZSkgewotCQkvLyBpZiB0aGUgc2hlbGwgd2luZG93IGlzIGRpc3Ryb3llZCwgcmVjcmVhdGUgaXQKLQkJaWYgKCh0aGlzLnNoZWxsICE9IG51bGwpICYmIHRoaXMuc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnBhcmVudCA9IG51bGw7Ci0JCQl0aGlzLnNoZWxsID0gbnVsbDsKLQkJfQotCi0JCWdldFZpZXdlckhvbGRlcihwYXJlbnQpOwotCi0JCXN3aXRjaCAoZGlhZ3JhbVR5cGUpIHsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCXJldHVybiBuZXcgQWN0aXZpdHlEaWFncmFtVmlld2VyKGhvbGRlcik7Ci0KLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQlyZXR1cm4gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlcihob2xkZXIpOwotCi0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQlyZXR1cm4gbmV3IFdQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIoaG9sZGVyKTsKLQkJCQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0Vmlld2VySG9sZGVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlpZiAoc2hlbGwgPT0gbnVsbCB8fCBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlzaGVsbCA9IGNyZWF0ZVNoZWxsKCk7Ci0JCQl9Ci0JCQlzaGVsbC5vcGVuKCk7Ci0JCQlwYXJlbnQgPSBzaGVsbDsKLQkJfQotCi0JCWlmIChob2xkZXIgIT0gbnVsbCkgewotCQkJaG9sZGVyLmRpc3Bvc2UoKTsKLQkJfQotCi0JCWhvbGRlciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWhvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgxLCAxKSk7IC8vIHNpemUgY2FuJ3QgYmUgMCwwCi0JCS8vIG90aGVyd2lzZSB0aGUgZGlhZ3JhbQotCQkvLyB3aWxsIG5vdCBiZSBwYWludGVkCi0JCWhvbGRlci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWhvbGRlci5zZXRWaXNpYmxlKGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIFNoZWxsIGNyZWF0ZVNoZWxsKCkgewotCQlTaGVsbCBzaGVsbCA9IG51bGw7Ci0JCURpc3BsYXkgZCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQlzaGVsbCA9IG5ldyBTaGVsbChkKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXNoZWxsLnNldEJvdW5kcygwLCAwLCAwLCAwKTsKLQkJc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCXJldHVybiBzaGVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoKHNoZWxsICE9IG51bGwpICYmICghc2hlbGwuaXNEaXNwb3NlZCgpKSkgewotCQkJc2hlbGwuY2xvc2UoKTsKLQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHNhdmUgdGhlIGVsZW1lbnQgZGlhZ3JhbSBpbWFnZSBhbmQgcmV0dXJucyB0aGUgaW1hZ2UgZmlsZSB1cmwuCi0JICogCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKiBAcGFyYW0gaW1nUGF0aAotCSAqIEBwYXJhbSBkaWFncmFtVHlwZQotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiAgICAgICAgICAgIElGaWx0ZXIKLQkgKiBAcGFyYW0gc3VwCi0JICogICAgICAgICAgICBTdXBwcmVzc2lvbgotCSAqIEByZXR1cm4gU3RyaW5nIHRoZSBpbWFnZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwdWJsaXNoaW5nIGRpcgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0uSUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2Ujc2F2ZURpYWdyYW0oamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyLCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb24pCi0JICovCi0JcHVibGljIERpYWdyYW1JbmZvIHNhdmVEaWFncmFtKGZpbmFsIE9iamVjdCB3cmFwcGVyLCBmaW5hbCBTdHJpbmcgaW1nUGF0aCwgCi0JCQlmaW5hbCBTdHJpbmcgZGlhZ3JhbVR5cGUsIGZpbmFsIElGaWx0ZXIgZmlsdGVyLAotCQkJZmluYWwgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCS8vIGluaXRpYWxpemUgdGhlIGRpYWdyYW1JbmZvCi0JCWRpYWdyYW1JbmZvID0gbnVsbDsKLQotCQkvLyBncmFiIHRoZSBVSSB0aHJlYWQgdG8gYXZvaWQgdGhyZWFkIGFjY2VzcyBlcnJvcgotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJX19pbnRlcm5hbF9zYXZlRGlhZ3JhbSh3cmFwcGVyLCBpbWdQYXRoLCBkaWFncmFtVHlwZSwgZmlsdGVyLCBzdXApOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gZGlhZ3JhbUluZm87Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc1VzZXJEZWZpbmVkRGlhZ3JhbShBY3Rpdml0eSBlLCBTdHJpbmcgaW1nUGF0aCwgU3RyaW5nIGRpYWdyYW1UeXBlKSB0aHJvd3MgRXhjZXB0aW9uCi0JewkJCi0JCS8vIGlmIHRoZXJlIGlzIGEgdXNlciBkZWZpbmVkIGRpYWdyYW0sIHVzZSBpdAotCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvIGluZm8gPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbygoQWN0aXZpdHkpZSk7Ci0JCXN3aXRjaCAoZ2V0SW50VHlwZShkaWFncmFtVHlwZSkpCi0JCXsKLQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQkJaWYgKCBpbmZvLmNhblB1Ymxpc2hBREltYWdlKCkgKQotCQkJCXsKLQkJCQkJcmV0dXJuIChpbmZvLmdldEFjdGl2aXR5RGlhZ3JhbSgpICE9IG51bGwpICYmIGluZm8uY2FuUHVibGlzaEFESW1hZ2UoKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCi0JCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCQlpZiAoIGluZm8uY2FuUHVibGlzaEFEREltYWdlKCkgKQotCQkJCXsKLQkJCQkJcmV0dXJuIChpbmZvLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpICE9IG51bGwpICYmIGluZm8uY2FuUHVibGlzaEFEREltYWdlKCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJCQkJCQotCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCQlpZiAoIGluZm8uY2FuUHVibGlzaFdQREltYWdlKCkgKQotCQkJCXsKLQkJCQkJcmV0dXJuIChpbmZvLmdldFdQRERpYWdyYW0oKSAhPSBudWxsICkgJiYgaW5mby5jYW5QdWJsaXNoV1BESW1hZ2UoKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIF9faW50ZXJuYWxfc2F2ZURpYWdyYW0oT2JqZWN0IHdyYXBwZXIsIGZpbmFsIFN0cmluZyBpbWdQYXRoLCBTdHJpbmcgZGlhZ3JhbVR5cGUsCi0JCQlJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCQotCQlpZiAoIHN1cC5pc1N1cHByZXNzZWQod3JhcHBlcikgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCU9iamVjdCBvID0gVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCWlmICghKG8gaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpbzsKLQkJQWN0aXZpdHkgZSA9IChBY3Rpdml0eSlvOwotCQkvLyBEaWFncmFtSW5mbyBkaWFncmFtSW5mbyA9IG51bGw7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJaW50IHR5cGUgPSBnZXRJbnRUeXBlKGRpYWdyYW1UeXBlKTsKLQkJaWYgKHR5cGUgPCAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQotCQkvLyBrZWVwIHRoZSBkaXJ0eSBmbGFnIGFuZCByZXNldCBiYWNrIHRvIGF2b2lkIG1ha2UgdGhlIGxpYnJhcnkgZGlydHkKLQkJYm9vbGVhbiBkaXJ0eUZsYWcgPSBlLmVSZXNvdXJjZSgpLmlzTW9kaWZpZWQoKTsKLQotCQl0cnkgewotCQkJaWYgKCBoYXNVc2VyRGVmaW5lZERpYWdyYW0oKEFjdGl2aXR5KWUsIGltZ1BhdGgsIGRpYWdyYW1UeXBlKSApCi0JCQl7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0KLQkJCS8vIGZpcnN0IGNoZWNrIGlmIHdlIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIGRpYWdyYW0gb3Igbm90Ci0JCQkvLyBpZiB0aGUgZGlhZ3JhbSBpcyBzdXByZXNzZWQsIGRvbid0IGdlbmVyYXRlIGRpYWdyYW0KLQkJCS8vIGRvbid0IGNyZWF0ZSB0aGUgZGlhZ3JhbSBpZiBpdCdzIG5vdCB0aGVyZSwKLQkJCS8vIGlkIHRoZSBkaWFncmFtIGRvZXMgbm90IGV4aXN0LCBpdCdzIHN1cHJlc3NlZAotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIGQgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRVTUFEaWFncmFtKChBY3Rpdml0eSkgZSwgdHlwZSwgZmFsc2UpOwotCi0JCQkvLyBBbGxvdyB0aGUgb3B0aW9uIHRvIHB1Ymxpc2ggJ3VuY3JlYXRlZCcgZGlhZ3JhbXMKLQkJCS8vIGJ5IGRlZmF1bHQsIHVuY3JlYXRlZCBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbXMgd2lsbCBiZSBwdWJsaXNoZWQsCi0JCQkvLyB1bmNyZWF0ZWQgZGlhZ3JhbXMgb2Ygb3RoZXIgdHlwZXMgd2lsbCBub3QgYmUgcHVibGlzaGVkCi0JCQlib29sZWFuIGV4aXN0ID0gKGQgIT0gbnVsbCk7Ci0JCQlpZiAoZXhpc3QpIHsKLQkJCQlpZiAoZC5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkKLQkJCQkJcmV0dXJuOwotCQkJCQotCQkJCS8vIElmIGFuIGV4dGVuc2lvbiBoYXMgaXRzIG93biBkaWFncmFtLiBCYXNlIGlzIHJlcGxhY2VkIG9yIGNvbnRyaWJ1dGVkLiAKLQkJCQkvLyBleHRlbnNpb24gZGlhZ3JhbSBzaG93cyByZWFsaXplZCBlbGVtZW50IGluIHVuZGVmaW5lZCBsb2NhdGlvbi4gCi0JCQkJLy8gSW4gcHVibGlzaGluZyBkb24ndCBkaXNwbGF5IGV4dGVuc2lvbiBkaWFncmFtIGV2ZW4gaWYgaXQgaGFzIGl0cyBvd24KLQkJCQkvLyBkaWFncmFtIGlmIHJlYWxpemVkIGVsZW1lbnRzIGFyZSBjb21pbmcgaW4gdGhyb3VnaCB2YXJpYWJpbGl0eS4KLQkJCQlpZih0eXBlID09IEdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfRElBR1JBTSAmJgotCQkJCQkJY2hlY2tWYXJpYWJpbGl0eShlLCBmaWx0ZXIsdHlwZSkgIT0gbnVsbCl7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJCQotCQkJfWVsc2V7Ci0JCQkJCi0JCQkJaWYoKHR5cGUgPT0gR3JhcGhpY2FsRGF0YUhlbHBlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNKSkKLQkJCQkJcmV0dXJuOwotCi0JCQkJLy8gRm9yIEFjdGl2aXR5IERpYWdyYW0gdW4gb3BlbmVkIGV4dGVuc2lvbiBwdWJsaXNoLgotCQkJCWlmKHR5cGUgPT0gR3JhcGhpY2FsRGF0YUhlbHBlci5BQ1RJVklUWV9ESUFHUkFNKXsKLQkJCQkJLy8gSWYgb3B0aW9uIGlzIG5vdCBjaGVja2VkLCBkb24ndCBnZW5lcmF0ZSBhIGRpYWdyYW0KLQkJCQkJaWYoIXB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKSByZXR1cm47Ci0JCQkJCQotCQkJCQkvL0lmIGV4dGVuc2lvbiBpcyBtb2RpZmllZCBkb24ndCBnZW5lcmF0ZSBpdC4KLQkJCQkJaWYoIWUuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pc0VtcHR5KCkpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBjYWxjdWxhdGVkQmFzZSA9IGNoZWNrVmFyaWFiaWxpdHkoZSwgZmlsdGVyLCB0eXBlKTsKLQkJCQkJaWYoY2FsY3VsYXRlZEJhc2UgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9CQotCQkJCQkKLQkJCQkJd3JhcHBlciA9IGNhbGN1bGF0ZWRCYXNlOwotCQkJCQllID0gKEFjdGl2aXR5KWNhbGN1bGF0ZWRCYXNlOwotCQkJCQlleGlzdCA9IHRydWU7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChwdWJsaXNoVW5jcmVhdGVkQUREID09IGZhbHNlICYmIHR5cGUgPT0gR3JhcGhpY2FsRGF0YUhlbHBlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSl7Ci0JCQkJCWJvb2xlYW4gY29udHJpYnV0b3JleGlzdCA9IGZhbHNlOwotCQkJCQkvLyBUaGlzIGlzIG5lZWQsIGlmIGNvbnRyaWJ1dG9yIGhhcyBhIEFERCBkaWFncmEsIGJhc2UgZG9uJ3QgCi0JCQkJCS8vIGJhc2Ugc2hvdWxkIGdlbmVyYXRlIEFERCBpbiBicm93c2luZy4KLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCQkJCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSB7Ci0JCQkJCQljb25maWcgPSAoKFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyKQotCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJCQl9Ci0JCQkJCWlmIChjb25maWcgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsKLQotCQkJCQkvLyBHZXQgaW1tZWRpYXRlIGNvbnRyaWJ1dG9ycyBmaXJzdCwgYW5kIGNoZWNrIGltbWVkaWF0ZSBjb250cmlidXRvcnMKLQkJCQkJLy8gaGF2ZSBhbnl0aGluZyBleHRyYSBicmVha2Rvd24gZWxlbWVudHMuCi0JCQkJCUxpc3QgbGlzdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29udHJpYnV0b3JzKGUsIGNvbmZpZyk7Ci0JCQkJCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJCQkJCWlmKGl0ZXJhdG9yICE9IG51bGwpewotCQkJCQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSl7Ci0JCQkJCQkJCU9iamVjdCBhY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmKGFjdCAhPSBudWxsKXsKLQkJCQkJCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSBkeCA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCS5nZXRVTUFEaWFncmFtKChBY3Rpdml0eSkgYWN0LCB0eXBlLCBmYWxzZSk7Ci0JCQkJCQkJCQlpZihkeCAhPSBudWxsKXsgICAKLQkJCQkJCQkJCQljb250cmlidXRvcmV4aXN0ID0gdHJ1ZTsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZighY29udHJpYnV0b3JleGlzdCkKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJdHJ5IHsKLQkJCQl2aWV3ZXIgPSBnZXREaWFncmFtVmlld2VyKHR5cGUpOwotCQkJCXZpZXdlci5sb2FkRGlhZ3JhbSh3cmFwcGVyLCAhZXhpc3QsIGZpbHRlciwgc3VwKTsKLQkJCQlkaWFncmFtSW5mbyA9IHZpZXdlci5nZXREaWFncmFtSW5mbygpOwotCQkJCWlmIChkaWFncmFtSW5mbyAhPSBudWxsICYmICFkaWFncmFtSW5mby5pc0VtcHR5KCkpIHsKLQkJCQkJaW1hZ2UgPSB2aWV3ZXIuY3JlYXRlRGlhZ3JhbUltYWdlKCk7Ci0JCQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBzYXZlIHRoZSBpbWFnZQotCQkJCQkJRmlsZSBmID0gbmV3IEZpbGUocHViRGlyLCBpbWdQYXRoKTsKLQotCQkJCQkJLy8gbWFrZSBzdXJlIHRoZSBmaWxlIGlzIGNyZWF0ZWQgb3RoZXJ3aXNlIGV4Y2VwdGlvbgotCQkJCQkJRmlsZSBwYXJlbnQgPSBmLmdldFBhcmVudEZpbGUoKTsKLQkJCQkJCWlmICghcGFyZW50LmV4aXN0cygpKSB7Ci0JCQkJCQkJcGFyZW50Lm1rZGlycygpOwotCQkJCQkJfQotCi0JCQkJCQlpZiAoIWYuZXhpc3RzKCkpIHsKLQkJCQkJCQlmLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCQkJCX0KLQkJCQkJCU91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpOwotCQkJCQkJSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCQkJCQlsb2FkZXIuZGF0YSA9IG5ldyBJbWFnZURhdGFbXSB7IGltYWdlLmdldEltYWdlRGF0YSgpIH07Ci0JCQkJCQlsb2FkZXIuc2F2ZShvcywgU1dULklNQUdFX0pQRUcpOwotCi0JCQkJCQlkaWFncmFtSW5mby5zZXRJbWFnZUZpbGVQYXRoKGltZ1BhdGgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gY3JlYXRlIGRpYWdyYW0gaW1hZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlMSkgewotCQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCi0JCQkvLyBkZWxldGUgdGhlIG5ld2x5IGNyZWF0ZWQgZGlhZ3JhbSBmcm9tIHRoZSBsaWJyYXJ5Ci0JCQlpZiAoIWV4aXN0KSB7Ci0JCQkJZCA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0VU1BRGlhZ3JhbSgKLQkJCQkJCShBY3Rpdml0eSkgZSwgdHlwZSwgZmFsc2UpOwotCQkJCWlmIChkICE9IG51bGwpIHsKLQkJCQkJRWNvcmVVdGlsLnJlbW92ZShkKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0KLQkJCQkvLyByZXN0b3JlIHRoZSBkaXJ0eSBmbGFnCi0JCQkJZS5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZChkaXJ0eUZsYWcpOwotCi0JCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJCXZpZXdlci5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUxKSB7Ci0JCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCi0JcHJpdmF0ZSBWYXJpYWJpbGl0eUVsZW1lbnQgY2hlY2tWYXJpYWJpbGl0eShWYXJpYWJpbGl0eUVsZW1lbnQgZSwgSUZpbHRlciBmaWx0ZXIsCi0JCQlpbnQgdHlwZSkgewotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgewotCQkJY29uZmlnID0gKChQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJfQotCQlpZiAoY29uZmlnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBHZXQgaW1tZWRpYXRlIGNvbnRyaWJ1dG9ycyBmaXJzdCwgYW5kIGNoZWNrIGltbWVkaWF0ZSBjb250cmlidXRvcnMKLQkJLy8gaGF2ZSBhbnl0aGluZyBleHRyYSBicmVha2Rvd24gZWxlbWVudHMuCi0JCUxpc3QgbGlzdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29udHJpYnV0b3JzKGUsIGNvbmZpZyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWlmICghKChBY3Rpdml0eSkgbmV4dCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJLy8gR2V0IGFsbCBDb250cmlidXRvcnMgZnJvbSBwYXJlbnQgY2hhaW4gYW5kIGNvbnRyaWJ1dG9yIGNoYWluIGZvciB0aGUKLQkJLy8gZWxlbWVudCBlLgotCQlWYXJpYWJpbGl0eUluZm8gZUluZm8gPSAoKFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyKQotCQkJCS5nZXRWYXJpYWJpbGl0eUluZm8oKFZhcmlhYmlsaXR5RWxlbWVudCkgZSk7Ci0JCUxpc3QgY29udHJpYnV0b3JzID0gZUluZm8uZ2V0Q29udHJpYnV0b3JzKCk7Ci0KLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCWlmICh2ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJQWN0aXZpdHkgcmVwbGFjZXIgPSAoQWN0aXZpdHkpIENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UmVwbGFjZXIodmUsCi0JCQkJY29uZmlnKTsKLQkJaWYgKHJlcGxhY2VyICE9IG51bGwpIHsKLQkJCXZlID0gcmVwbGFjZXI7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gcmVwbGFjZXJEaWFncmFtID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0VU1BRGlhZ3JhbShyZXBsYWNlciwgdHlwZSwgZmFsc2UpOwotCQkJaWYgKHJlcGxhY2VyRGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJLy9hbnlSZXBsYWNlci5hZGQocmVwbGFjZXIpOwotCQkJCXJldHVybiByZXBsYWNlcjsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gYmFzZURpYWdyYW0gPSBHcmFwaGljYWxEYXRhTWFuYWdlcgotCQkJCQkuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0VU1BRGlhZ3JhbSgoQWN0aXZpdHkpIHZlLCB0eXBlLCBmYWxzZSk7Ci0JCQlpZiAoYmFzZURpYWdyYW0gIT0gbnVsbCkgewotCQkJCQotCQkJCS8vIENoZWNrIGZpcnN0IGlmIGJhc2VEaWFncmFtIGlzIHN1cHByZXNzZWQuCi0JCQkJaWYgKGJhc2VEaWFncmFtLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkKLQkJCQkvLyBGaW5kIHRoZSBjb250cmlidXRvcnMgb2YgQmFzZQotCQkJCVZhcmlhYmlsaXR5SW5mbyB2ZUluZm8gPSAoKFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyKQotCQkJCQkJLmdldFZhcmlhYmlsaXR5SW5mbygoVmFyaWFiaWxpdHlFbGVtZW50KSB2ZSk7Ci0JCQkJTGlzdCB2ZUNvbnRyaWJ1dG9ycyA9IHZlSW5mby5nZXRDb250cmlidXRvcnMoKTsKLQkJCQlpZiAoY29udHJpYnV0b3JzLnNpemUoKSAhPSB2ZUNvbnRyaWJ1dG9ycy5zaXplKCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbnRyaWJ1dG9ycy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmICghdmVDb250cmlidXRvcnMuY29udGFpbnMobmV4dCkpIHsKLQkJCQkJCQlpZiAoISgoQWN0aXZpdHkpIG5leHQpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkKLQkJCQkJCQkJCS5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiB2ZTsKLQkJCQkKLQkJCX1lbHNlewotCQkJCS8vIElmIG5vIGJhc2UgZGlhZ3JhbSwgY2hlY2sgYmFzZSBvZiBiYXNlIGhhZCBhbnkgZGlhZ3JhbS4KLQkJCQlyZXR1cm4gY2hlY2tWYXJpYWJpbGl0eSh2ZSwgZmlsdGVyLCB0eXBlKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHdpbmRvdydzIHByZWZlcmVuY2UgYXR0cmlidXRlIGZvciBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoZWRVbkNyZWF0ZWRBREQoYm9vbGVhbiBmbGFnKSB7Ci0JCXRoaXMucHVibGlzaFVuY3JlYXRlZEFERCA9IGZsYWc7Ci0JfQotCS8qKgotCSAqIFNldCB0aGUgd2luZG93J3MgcHJlZmVyZW5jZSBhdHRyaWJ1dGUgZm9yIEFjaXRpdnl0IERpYWdyYW0KLQkgKiAKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihib29sZWFuIGZsYWcpewotCQl0aGlzLnB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uID0gZmxhZzsKLQl9Ci0KLQlwdWJsaWMgQWN0aXZpdHkgZ2V0UmVhbGl6ZWRGb3JVbm1vZGlmaWVkKE9iamVjdCBhY3Rpdml0eSwgSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCS8vIERvZXMgbm90aGluZywganVzdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24uCi0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvQWN0aXZpdHlEaWFncmFtVmlld2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvQWN0aXZpdHlEaWFncmFtVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYTE1ZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGlhZ3JhbVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5BY3Rpdml0eURpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGdyYXBoaWNhbCB2aWV3ZXIgZm9yIHRoZSBBY3Rpdml0eSBkaWFncmFtLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEaWFncmFtVmlld2VyIGV4dGVuZHMgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIHsKLQotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW1WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChPYmplY3QgZSwgSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQlBY3Rpdml0eURpYWdyYW0gZGlhZ3JhbSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQWN0aXZpdHlEaWFncmFtKCk7Ci0JCWRpYWdyYW0uc2V0RmlsdGVyKGZpbHRlcik7Ci0JCWlmIChzdXAgIT0gbnVsbCkgewotCQkJZGlhZ3JhbS5zZXRTdXBwcmVzc2lvbihzdXApOwotCQl9Ci0KLQkJZGlhZ3JhbS5zZXRPYmplY3QoZSk7Ci0JCUVkaXRQYXJ0IHBhcnQgPSBuZXcgQWN0aXZpdHlEaWFncmFtRWRpdFBhcnQoZGlhZ3JhbSk7Ci0JCXBhcnQuc2V0TW9kZWwoZGlhZ3JhbSk7Ci0JCXJldHVybiBwYXJ0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1c7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvV1BEZXBlbmRlbmN5RGlhZ3JhbVZpZXdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL1dQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q3YTk4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvV1BEZXBlbmRlbmN5RGlhZ3JhbVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5XUERpYWdyYW1FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgZ3JhcGhpY2FsIHZpZXdlciBmb3IgdGhlIFdQIERlcGVuZGVuY3kgZGlhZ3JhbS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIgZXh0ZW5kcyBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgewotCi0JcHVibGljIFdQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCi0JfQotCi0JcHJvdGVjdGVkIEVkaXRQYXJ0RmFjdG9yeSBjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgV1BEaWFncmFtRWRpdFBhcnRGYWN0b3J5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KE9iamVjdCBlLCBJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gZGlhZ3JhbSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpOwotCQlkaWFncmFtLnNldEZpbHRlcihmaWx0ZXIpOwotCQlpZiAoc3VwICE9IG51bGwpIHsKLQkJCWRpYWdyYW0uc2V0U3VwcHJlc3Npb24oc3VwKTsKLQkJfQotCi0JCWRpYWdyYW0uc2V0T2JqZWN0KGUpOwotCQlFZGl0UGFydCBwYXJ0ID0gbmV3IERpYWdyYW1FZGl0UGFydChkaWFncmFtKTsKLQkJcGFydC5zZXRNb2RlbChkaWFncmFtKTsKLQkJcmV0dXJuIHBhcnQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFncmFtVHlwZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMmUzMjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGdyYXBoaWNhbCB2aWV3ZXJzIGZvciB0aGUgYWN0aXZpdHkgZGlhZ3JhbXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdQZXJzcGVjdGl2ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdQZXJzcGVjdGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjQzZGMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nUGVyc3BlY3RpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3Q29uZmlndXJhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3TGlicmFyeVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3UGx1Z2luV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLldpemFyZENhdGVnb3JpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLk5ld1NlYXJjaFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGb2xkZXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQbGFjZWhvbGRlckZvbGRlckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuSUNvbnNvbGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVByb2dyZXNzQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuSVdpemFyZENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuSVdpemFyZERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5JV2l6YXJkUmVnaXN0cnk7Ci0KLS8qKgotICogVGhlIE1ldGhvZCBBdXRob3JpbmcgcGVyc3BlY3RpdmUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEF1dGhvcmluZ1BlcnNwZWN0aXZlIGltcGxlbWVudHMgSVBlcnNwZWN0aXZlRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgQXV0aG9yaW5nIHBlcnNwZWN0aXZlIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNQRUNUSVZFX0lEID0gQXV0aG9yaW5nUGVyc3BlY3RpdmUuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gbmV3V2l6YXJkU2hvcnRjdXRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLQlzdGF0aWMgewotCQluZXdXaXphcmRTaG9ydGN1dHMuYWRkKE5ld0xpYnJhcnlXaXphcmQuV0laQVJEX0lEKTsKLQkJbmV3V2l6YXJkU2hvcnRjdXRzLmFkZChOZXdQbHVnaW5XaXphcmQuV0laQVJEX0lEKTsKLQkJbmV3V2l6YXJkU2hvcnRjdXRzLmFkZChOZXdDb25maWd1cmF0aW9uV2l6YXJkLldJWkFSRF9JRCk7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgdGhpcyBwZXJzcGVjdGl2ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBwZXJzcGVjdGl2ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBvcGVuKCkgewotCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCUlQZXJzcGVjdGl2ZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0UGVyc3BlY3RpdmVSZWdpc3RyeSgpOwotCQkJSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBvbGRQZXJzcGVjdGl2ZSA9IGFjdGl2ZVBhZ2UuZ2V0UGVyc3BlY3RpdmUoKTsKLQkJCWlmICghb2xkUGVyc3BlY3RpdmUuZ2V0SWQoKS5lcXVhbHMoUEVSU1BFQ1RJVkVfSUQpKSB7Ci0JCQkJSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBwZXJzcGVjdGl2ZSA9IHJlZ2lzdHJ5Ci0JCQkJCQkuZmluZFBlcnNwZWN0aXZlV2l0aElkKFBFUlNQRUNUSVZFX0lEKTsKLQkJCQlhY3RpdmVQYWdlLnNldFBlcnNwZWN0aXZlKHBlcnNwZWN0aXZlKTsKLQkJCX0KLQkJCXJldHVybiBvbGRQZXJzcGVjdGl2ZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3RvcnkjY3JlYXRlSW5pdGlhbExheW91dChJUGFnZUxheW91dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVJbml0aWFsTGF5b3V0KElQYWdlTGF5b3V0IGxheW91dCkgewotCQlsYXlvdXQuc2V0RWRpdG9yQXJlYVZpc2libGUodHJ1ZSk7Ci0JCVN0cmluZyBlZGl0b3JBcmVhID0gbGF5b3V0LmdldEVkaXRvckFyZWEoKTsKLQkJSUZvbGRlckxheW91dCB0b3BMZWZ0Rm9sZGVyID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigidG9wTGVmdCIsIC8vJE5PTi1OTFMtMSQKLQkJCQlJUGFnZUxheW91dC5MRUZULCAwLjMwZiwgZWRpdG9yQXJlYSk7Ci0KLQkJSUZvbGRlckxheW91dCBib3R0b21MZWZ0Rm9sZGVyID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigiYm90dG9tTGVmdCIsIC8vJE5PTi1OTFMtMSQKLQkJCQlJUGFnZUxheW91dC5CT1RUT00sIDAuNTBmLCAidG9wTGVmdCIpOyAvLyROT04tTkxTLTEkCi0KLQkJdG9wTGVmdEZvbGRlci5hZGRWaWV3KExpYnJhcnlWaWV3LlZJRVdfSUQpOwotCQlib3R0b21MZWZ0Rm9sZGVyLmFkZFZpZXcoQ29uZmlndXJhdGlvblZpZXcuVklFV19JRCk7Ci0KLQkJSVBsYWNlaG9sZGVyRm9sZGVyTGF5b3V0IG91dHB1dEZvbGRlciA9IGxheW91dC5jcmVhdGVQbGFjZWhvbGRlckZvbGRlcigKLQkJCQkiYm90dG9tIiwgSVBhZ2VMYXlvdXQuQk9UVE9NLCAwLjY1ZiwgZWRpdG9yQXJlYSk7IC8vJE5PTi1OTFMtMSQKLQkJb3V0cHV0Rm9sZGVyLmFkZFBsYWNlaG9sZGVyKElQYWdlTGF5b3V0LklEX1BST1BfU0hFRVQpOwotCQlvdXRwdXRGb2xkZXIuYWRkUGxhY2Vob2xkZXIoSVBhZ2VMYXlvdXQuSURfUFJPQkxFTV9WSUVXKTsKLQkJb3V0cHV0Rm9sZGVyLmFkZFBsYWNlaG9sZGVyKE5ld1NlYXJjaFVJLlNFQVJDSF9WSUVXX0lEKTsKLQkJb3V0cHV0Rm9sZGVyLmFkZFBsYWNlaG9sZGVyKElDb25zb2xlQ29uc3RhbnRzLklEX0NPTlNPTEVfVklFVyk7Ci0JCW91dHB1dEZvbGRlci5hZGRQbGFjZWhvbGRlcihJUGFnZUxheW91dC5JRF9CT09LTUFSS1MpOwotCQlvdXRwdXRGb2xkZXIuYWRkUGxhY2Vob2xkZXIoSVByb2dyZXNzQ29uc3RhbnRzLlBST0dSRVNTX1ZJRVdfSUQpOwotCi0JCWxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dChOZXdMaWJyYXJ5V2l6YXJkLldJWkFSRF9JRCk7Ci0JCWxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dChOZXdQbHVnaW5XaXphcmQuV0laQVJEX0lEKTsKLQkJbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KE5ld0NvbmZpZ3VyYXRpb25XaXphcmQuV0laQVJEX0lEKTsKLQotCQlJV2l6YXJkUmVnaXN0cnkgbmV3V2l6YXJkUmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldE5ld1dpemFyZFJlZ2lzdHJ5KCk7Ci0JCUlXaXphcmRDYXRlZ29yeSBuZXdXaXphcmRDYXRlZ29yeSA9IG5ld1dpemFyZFJlZ2lzdHJ5Ci0JCQkJLmZpbmRDYXRlZ29yeShXaXphcmRDYXRlZ29yaWVzLk5FV19XSVpBUkRTX0NBVEVHT1JZKTsKLQkJSVdpemFyZERlc2NyaXB0b3JbXSB3aXphcmREZXNjcmlwdG9ycyA9IG5ld1dpemFyZENhdGVnb3J5LmdldFdpemFyZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3aXphcmREZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJSVdpemFyZERlc2NyaXB0b3Igd2l6YXJkRGVzY3JpcHRvciA9IHdpemFyZERlc2NyaXB0b3JzW2ldOwotCQkJU3RyaW5nIHdpemFyZElkID0gd2l6YXJkRGVzY3JpcHRvci5nZXRJZCgpOwotCQkJaWYgKCFuZXdXaXphcmRTaG9ydGN1dHMuY29udGFpbnMod2l6YXJkSWQpKSB7Ci0JCQkJbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KHdpemFyZElkKTsKLQkJCX0KLQkJfQotCi0JCVBlcnNwZWN0aXZlTGlzdFV0aWwuYWRkUGVyc3BlY3RpdmVTaG9ydExpc3QobGF5b3V0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY0M2Q0ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJSGVscENvbnRleHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsKLQotLyoqCi0gKiBBdXRob3JpbmcgVUkgaGVscCBjb250ZXh0cwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEF1dGhvcmluZ1VJSGVscENvbnRleHRzIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBST09UX0NPTlRFWFQgPSBBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpICsgIi4iOyAgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGSUxFX05FV19MSUJSQVJZX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZpbGVfbmV3X2xpYnJhcnlfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcJRklMRV9ORVdfUExVR0lOX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZpbGVfbmV3X3BsdWdpbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nCUZJTEVfTkVXX0NPTkZJR1VSQVRJT05fQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZmlsZV9uZXdfY29uZmlndXJhdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZJTEVfT1BFTl9MSUJSQVJZX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZpbGVfb3Blbl9saWJyYXJ5X2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZJTEVfT1BFTl9DT05GSUdVUkFUSU9OX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZpbGVfb3Blbl9jb25maWd1cmF0aW9uX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZJTEVfSU1QT1JUX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAiZmlsZV9pbXBvcnRfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRklMRV9FWFBPUlRfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICJmaWxlX2V4cG9ydF9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBMSUJSQVJZX05BVklHQVRPUl9WSUVXX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImxpYnJhcnlfbmF2aWdhdG9yX3ZpZXdfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBDT05GSUdVUkFUSU9OX1ZJRVdfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiY29uZmlndXJhdGlvbl92aWV3X2NvbnRleHQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgUExVR0lOX0VESVRPUl9ERVNDUklQVElPTl9BTExfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAicGx1Z2luX2VkaXRvcl9kZXNjcmlwdGlvbl9hbGxfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBDT05GSUdVUkFUSU9OX0VESVRPUl9BTExfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiY29uZmlndXJhdGlvbl9lZGl0b3JfYWxsX2NvbnRleHQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgQ09OVEVOVF9QQUNLQUdFX0VESVRPUl9BTExfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiY29udGVudF9wYWNrYWdlX2VkaXRvcl9hbGxfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfUk9MRV9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl9yb2xlX2NvbnRleHRfaGVscF9JRCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfVEFTS19DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl90YXNrX2NvbnRleHRfaGVscF9JRCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfV09SS19QUk9EVUNUX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX3dvcmtfcHJvZHVjdF9jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX0dVSURBTkNFX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX2d1aWRhbmNlX2NvbnRleHRfaGVscF9JRCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfRElTQ0lQTElORV9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl9kaXNjaXBsaW5lX2NvbnRleHRfaGVscF9JRCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfRElTQ0lQTElORV9HUk9VUElOR19DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl9kaXNjaXBsaW5lX2dyb3VwaW5nX2NvbnRleHRfaGVscF9JRCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfRE9NQUlOX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX2RvbWFpbl9jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX1dPUktfUFJPRFVDVF9UWVBFX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX3dvcmtfcHJvZHVjdF90eXBlX2NvbnRleHRfaGVscF9JRCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfUk9MRV9TRVRfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3Jfcm9sZV9zZXRfY29udGV4dF9oZWxwX0lEIjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEVESVRPUl9ST0xTRV9TRVRfR1JPVVBJTkdfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3Jfcm9sc2Vfc2V0X2dyb3VwaW5nX2NvbnRleHRfaGVscF9JRCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfVE9PTF9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl90b29sX2NvbnRleHRfaGVscF9JRCI7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEVESVRPUl9DVVNUT01fQ0FURUdPUllfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3JfY3VzdG9tX2NhdGVnb3J5X2NvbnRleHRfaGVscF9JRCIgOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGT1JNX0VESVRPUl9ERVNDUklQVElPTl9HRU5FUkFMX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX2dlbmVyYWxfY29udGV4dCIgOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGT1JNX0VESVRPUl9ERVNDUklQVElPTl9ERVRBSUxfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fZGV0YWlsX2NvbnRleHQiICA7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfREVTQ1JJUFRJT05fTk9UQVRJT05fQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fbm90YXRpb25fY29udGV4dCIgIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGT1JNX0VESVRPUl9ERVNDUklQVElPTl9UQUlMT1JJTkdfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fdGFpbG9yaW5nX2NvbnRleHQiIDsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfREVTQ1JJUFRJT05fVkVSU0lPTl9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl92ZXJzaW9uX2NvbnRleHQiIDsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfREVTQ1JJUFRJT05fRUxFTUVOVF9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9lbGVtZW50X2NvbnRleHQiIDsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfREVTQ1JJUFRJT05fSUNPTl9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9pY29uX2NvbnRleHQiIDsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX0NQX0RFU0NSSVBUSU9OX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX2NwX2Rlc2NyaXB0aW9uX2NvbnRleHRfaGVscF9JRCIgOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfRFBfREVTQ1JJUFRJT05fQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3JfZHBfZGVzY3JpcHRpb25fY29udGV4dF9oZWxwX0lEIiA7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX1BST0NFU1NfV0JTX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZvcm1fZWRpdG9yX3Byb2Nlc3Nfd2JzX2NvbnRleHQiICA7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfUFJPQ0VTU19PQlNfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZm9ybV9lZGl0b3JfcHJvY2Vzc19vYnNfY29udGV4dCIgOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGT1JNX0VESVRPUl9QUk9DRVNTX1BCU19DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmb3JtX2VkaXRvcl9wcm9jZXNzX3Bic19jb250ZXh0IiAgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX1BST0NFU1NfQUxMQlNfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICJmb3JtX2VkaXRvcl9wcm9jZXNzX2FsbGJzX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIENPTkZJR1VSQVRJT05fUFVCTElTSF9XSVpBUkRfQUxMX1BBR0VTX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImNvbmZpZ3VyYXRpb25fcHVibGlzaF93aXphcmRfYWxsX3BhZ2VzX2NvbnRleHQiIDsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgUklDSF9URVhUX0VESVRPUl9DT05URVhUX0lEID0gUk9PVF9DT05URVhUICsgICJyaWNoX3RleHRfZWRpdG9yX2NvbnRleHRfSUQiICA7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfQUNUSVZJVFlfRElBR1JBTV9DT05URVhUID0gUk9PVF9DT05URVhUICsgImZvcm1fZWRpdG9yX2FjdGl2aXR5X2RpYWdyYW1fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArImZvcm1fZWRpdG9yX2FjdGl2aXR5X2RldGFpbF9kaWFncmFtX2NvbnRleHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfV1BfREVQRU5ERU5DWV9ESUFHUkFNX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAiZm9ybV9lZGl0b3Jfd3BfZGVwZW5kZW5jeV9kaWFncmFtX2NvbnRleHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQgPSBST09UX0NPTlRFWFQgKyAibGlicmFyeV92aWV3X25vZGVfY29udGV4dF9ub3RfaW1wbGVtZW50ZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgIExBWU9VVF9GTEFUX0FDVElPTiA9IFJPT1RfQ09OVEVYVCArICJsYXlvdXRfZmxhdF9hY3Rpb24iOyAJIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyAgTEFZT1VUX0hJRVJBUkNISUNBTF9BQ1RJT04gPSBST09UX0NPTlRFWFQgKyAibGF5b3V0X2hpZXJhcmNoaWNhbF9hY3Rpb24iOyAJIC8vJE5PTi1OTFMtMSQJCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlJbWFnZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlJbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRiYmI5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogU2hhcmVkIGltYWdlcyB1c2VkIGluIHRoZSBBdXRob3JpbmcgVUkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXV0aG9yaW5nVUlJbWFnZXMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX05BTUVfQ09MTEFQU0VEID0gImZ1bGwvb2JqMTYvQ29sbGFwc2VkLmdpZiI7IC8vJE5PTi1OTFMtMSQgCQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX05BTUVfRVhQQU5ERUQgPSAiZnVsbC9vYmoxNi9FeHBhbmRlZC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTkFNRV9SRUZSRVNIID0gImZ1bGwvZXRvb2wxNi9SZWZyZXNoLmdpZiI7IC8vJE5PTi1OTFMtMSQgCQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX05BTUVfU1RPUCA9ICJmdWxsL2V0b29sMTYvU3RvcC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTkFNRV9QUklOVCA9ICJmdWxsL2V0b29sMTYvUHJpbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OQU1FX09WUl9FUlJPUiA9ICJmdWxsL292cjE2L2Vycm9yX292ci5naWYiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX05BTUVfTEFZT1VUX0ZMQVQgPSAiZnVsbC9ldG9vbDE2L2ZsYXRMYXlvdXQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX05BTUVfTEFZT1VUX0hJRVJBUkNISUNBTCA9ICJmdWxsL2V0b29sMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0NPTExBUFNFRCA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJTUdfTkFNRV9DT0xMQVBTRUQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfRVhQQU5ERUQgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX05BTUVfRVhQQU5ERUQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfUkVGUkVTSCA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJTUdfTkFNRV9SRUZSRVNIKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX1NUT1AgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX05BTUVfU1RPUCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19QUklOVCA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJTUdfTkFNRV9QUklOVCk7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfT1ZSX0VSUk9SID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19OQU1FX09WUl9FUlJPUik7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19MQVlPVVRfRkxBVCA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJTUdfTkFNRV9MQVlPVVRfRkxBVCk7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfTEFZT1VUX0hJRVJBUkNISUNBTCA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJTUdfTkFNRV9MQVlPVVRfSElFUkFSQ0hJQ0FMKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0JBQ0sgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9CQUNLKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0NPTExBUFNFRCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldFNoYXJlZEltYWdlKElNR19OQU1FX0NPTExBUFNFRCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19FWFBBTkRFRCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldFNoYXJlZEltYWdlKElNR19OQU1FX0VYUEFOREVEKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0ZPUldBUkQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9GT1JXQVJEKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1JFRlJFU0ggPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfTkFNRV9SRUZSRVNIKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1NUT1AgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfTkFNRV9TVE9QKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1BSSU5UID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX05BTUVfUFJJTlQpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX09WUl9FUlJPUiA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldFNoYXJlZEltYWdlKElNR19OQU1FX09WUl9FUlJPUik7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19MQVlPVVRfRkxBVCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldFNoYXJlZEltYWdlKElNR19OQU1FX0xBWU9VVF9GTEFUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0xBWU9VVF9ISUVSQVJDSElDQUwgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfTkFNRV9MQVlPVVRfSElFUkFSQ0hJQ0FMKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTExY2YxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsLkltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWwuUHJvYmxlbU1hcmtlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5Vmlld1ByZWZQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIEF1dGhvcmluZyBVSSBwbHVnLWluIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRob3JpbmdVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBBdXRob3JpbmdVSVBsdWdpbiBwbHVnaW47Ci0KLQlwcml2YXRlIFByb2JsZW1NYXJrZXJNYW5hZ2VyIGZQcm9ibGVtTWFya2VyTWFuYWdlcjsKLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5IGZJbWFnZURlc2NyaXB0b3JSZWdpc3RyeTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEF1dGhvcmluZ1VJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJCi0JCS8vIEluaXRpYWxpemUgdGhlIEF1dGhvcmluZyBVSSBzZXJ2aWNlLgotCQlBdXRob3JpbmdVSVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zdGFydCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5pbml0KGNvbnRleHQpOwotCQkKLQkJTGlicmFyeVZpZXdQcmVmUGFnZS5pbml0RGVmYXVsdHMoZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEF1dGhvcmluZ1VJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgUHJvYmxlbU1hcmtlck1hbmFnZXIgZ2V0UHJvYmxlbU1hcmtlck1hbmFnZXIoKSB7Ci0JCWlmIChmUHJvYmxlbU1hcmtlck1hbmFnZXIgPT0gbnVsbCkKLQkJCWZQcm9ibGVtTWFya2VyTWFuYWdlcj0gbmV3IFByb2JsZW1NYXJrZXJNYW5hZ2VyKCk7Ci0JCXJldHVybiBmUHJvYmxlbU1hcmtlck1hbmFnZXI7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkgZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuaW50ZXJuYWxHZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5IGludGVybmFsR2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKSB7Ci0JCWlmIChmSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkgPT0gbnVsbCkKLQkJCWZJbWFnZURlc2NyaXB0b3JSZWdpc3RyeT0gbmV3IEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCk7Ci0JCXJldHVybiBmSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHQpIHsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKHQpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNmYmFkYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEF1dGhvaW5nIFVJIHJlc291cmNlcwotICogCi0gKiBAYXV0aG9yIExva2FuYXRoIEphZ2dhCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXV0aG9yaW5nVUlSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJVTkRMRV9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBBdXRob3JpbmdVSVJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlLgotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25PcmRlckRpYWxvZ19kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25PcmRlckRpYWxvZ19OYXZpZ2F0aW9uVmlld3M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhc3NpZ25QYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2F0ZWdvcmllc1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpdmVyYWJsZVBhcnRzUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2NyaXB0aW9uUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVzUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NhcmR1bnJlc29sdmVkcmVmOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGFuY2VQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSXRlbXNGaWx0ZXJEaWFsb2dfVXBkYXRlVHJlZUpvYl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3RGlhZ3JhbUZpbGVfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmV2aWV3UGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb21wdENyZWF0ZU5ld0RpYWdyYW1GaWxlX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb21wdERlbGV0ZUN1c3RvbUNhdGVnb3J5QmVmb3JlUmVtb3ZlTGFzdFJlZlRvSXQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZlcmVuY2VzUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZmVyZW5jZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmZXJlbmNlV29ya2Zsb3dQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZXNQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldHNQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RlcHNQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza3NQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbE1lbnRvcnNQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RzUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrSXRlbXNTZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0l0ZW1zU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVwZW5kZW5jaWVzU2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVwZW5kZW5jaWVzU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGV0YWlsU2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VuZXJhbEluZm9TZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGljb25TZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm90YXRpb25TZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub3RhdGlvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGFmZmluZ1NlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YWZmaW5nU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RlcHNTZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGVwc1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhaWxvcmluZ1NlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhaWxvcmluZ1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhcmlhYmlsaXR5U2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uSW5mb1NlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkaXRpb25hbEluZm9fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGxpY2F0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25MYWJlbF9lZGl0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFsdGVybmF0aXZlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXNzaWdubWVudEFwcHJvYWNoZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF1dGhvcnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhY2tncm91bmRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VFbGVtZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYXNlR3VpZGFuY2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyaWVmRGVzY3JpcHRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2NyaXB0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYWNrdXBiZWZvcmVzYXZlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBicmllZk91dGxpbmVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoYW5nZURhdGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoYW5nZURlc2NyaXB0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0l0ZW1zX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250cmlidXRlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYWxDb250cmlidXRlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udHJpYnV0ZXNfdG9fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlbmRzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlbmRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVybmFsRGVzY3JpcHRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVybmFsSWRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdvYWxzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBhY3RPZk5vdEhhdmluZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcga2V5Q29uc2lkZXJhdGlvbnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxldmVsc09mQWRvcHRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1haW5EZXNjcmlwdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3RWxlbWVudF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm90QXBwbGljYWJsZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm90YXRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhY2thZ2luZ0d1aWRhbmNlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVzZW50YXRpb25OYW1lX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9tcHRmb3JsaWJhcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuYWJsZUhlYWx0aENoZWNrX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9ibGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdXJwb3NlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFzb25Gb3JOb3ROZWVkaW5nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYWxSZXBsYWNlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZW5kc1JlcGxhY2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXByZXNlbnRhdGlvbk9wdGlvbnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcHJlc2VudGF0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdHRhY2hlZEZpbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNraWxsc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RlcHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0ZXBzX25hbWVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0b3BfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByaW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5vbnltc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHlwZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVlcENvcHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhY2tfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld19wbHVnaW47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb3ZlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5pcXVlSWRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhcmlhYmlsaXR5VHlwZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdHRhY2hCdXR0b25fdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdHRhY2hVcmxCdXR0b25fdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBicm93c2VCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoYW5nZVR5cGVCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsZWFyQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRldGFjaEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhZ3JhbV9zYXZlRXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb3duQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXJlY3RvcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9yZGVyQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0QnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbmFtZUFjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW5hbWVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVBc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0QnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXNlbGVjdEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VEZWZhdWx0QnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3SGlzdG9yeUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVRhc2tzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVRhc2tzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlR3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZUNhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1JvbGVzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1JvbGVzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrUm9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrUm9sZXNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbW9kaWZ5X21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrUm9sZXNQYWdlX2NvbmZpcm1fdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0d1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3JlbW92ZVVucmVzb2x2ZWRSZWZlcmVuY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3Nob3dPd25lckluTGlicmFyeVZpZXc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9yZXNvbHZlTWlzc2luZ1JlZmVyZW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3RfVGFza3NfQXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0X1Rhc2tzX011bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXRlZ29yeUd1aWRhbmNlc1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhdGVnb3J5R3VpZGFuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX1VzZURlZmF1bHREaXJlY3RvcnlCdXR0b25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVUYXNrc1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sVG9vbE1lbnRvcnNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbFRvb2xNZW50b3JzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbFRvb2xNZW50b3JzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdQbHVnaW5XaXphcmRfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdQbHVnaW5XaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3UGx1Z2luV2l6YXJkUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3UGx1Z2luRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3UGx1Z2luRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kTGlicmFyeUdyb3VwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0UGF0aExhYmVsX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW9kZWxpbmdHcm91cF90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVzZXJJbnRlcmZhY2VHcm91cF90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlYnVnR3JvdXBfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmFibGVMaWJyYXJ5VmFsaWRhdGlvbkNoZWNrYm94X3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFByZWZlcmVuY2VIaXN0b3J5U2l6ZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXREaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmVEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW5hbWVEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3YXJuaW5nRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkQ29uZmlnRXJyb3JEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXREZWZhdWx0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0UHJvY2Vzc0VsZW1lbnRFcnJvckRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlEaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZUxpYnJhcnlEaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlQXNzb2NpYXRpb25EaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vT3BlbkxpYnJhcnlFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVDb25maWdFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVDb25maWdFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnRlcm5hbEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRQcmVzZW50YXRpb25OYW1lRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZENvbmZpZ0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNldERlZmF1bHRDb25maWdFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuTGlicmFyeUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmVMaWJyYXJ5RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZUxpYnJhcnlUb0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRBbHJlYWR5RGVsZXRlZEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkNvbmZpZ1dpemFyZEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludGVybmFsRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBncmFkZUxpYnJhcnlFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlVXBncmFkZWRMaWJyYXJ5RXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZpbmdMaWJyYXJ5VGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBncmFkaW5nTGlicmFyeVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRpbmdMaWJyYXJ5RWxlbWVudHNUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZpbmdVcGdyYWRlZEVsZW1lbnRzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2aW5nVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2aW5nRmlsZXNUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaXhpbmdDb250ZW50RGVzY3JpcHRpb25HVUlEc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0aW5nSW52YWxpZFJlZmVyZW5jZXNUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRFZGl0b3JUb1BlcnNwZWN0aXZlV2FybmluZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDaGFuZ2VIaXN0b3J5RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2hhbmdlSGlzdG9yeURpYWxvZ19sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpcm1EZWxldGVEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maXJtRGVsZXRlRGlhbG9nX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpcm1EZWxldGVEaWFsb2dfbXNnV2l0aFJlZmVyZW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRpYWxvZ19lcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycl9ub29wZW5saWJyYXJ5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyX2xvYWRpbmdsaWJyYXJ5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbXNnX3JlbG9hZExpYnJhcnk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWxvYWREaWFsb2dfbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbG9hZERpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvclRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nc19Nb3ZlRGlhbG9nX2Vycm9yTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ19tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlX3ZpZXdzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29sdW1uc2VsZWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdWaWV3UGFnZV9hZGRWaWV3QnV0dG9uVGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlX3JlbW92ZVZpZXdCdXR0b25UZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnVmlld1BhZ2VfbWFrZURlZmF1bHRCdXR0b25UZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvbk1lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UxOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfbWVzc2FnZTI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGFuZ2VBY3Rpdml0eVR5cGVXYXJuaW5nRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXNzb2NpYXRpb25Gb3JtUGFnZV9CcmllZkRlc2NyaXB0aW9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUmVtb3ZlUmVmQ29uZmlybV9tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jYW5ub3RSZW5hbWVQbHVnaW5Gb2xkZXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5fbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uU2VjdGlvbk1lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbnM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzRGVzY3JpcHRpb25fZGVmYXVsdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NEZXNjcmlwdGlvbl9zZWxlY3RDb25maWd1cmF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0RlbGV0ZUFjdGlvbl9kZWxldGVjb2Zpcm1fdGV4dDA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRGVsZXRlQWN0aW9uX3NlbGVjdERlc2NyaXB0b3JzVG9EZWxldGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3SGVscGVyX3BlcmZvcm1IZWFsdGhDaGVjazsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdIZWxwZXJIZWFsdGhDaGVja0RpYWxvZ19tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXR0YWNoR3VpZGFuY2VGaWxlRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlRWxlbWVudERpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZU5ld0VsZW1lbnRFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkbGdUaXRsZV9yZWxvYWRMaWJyYXJ5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlRWxlbWVudEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZUNvbmZpZ0Vycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9jaGFuZ2VCb3VuZHNDb21tYW5kX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VmX2NoYW5nZU5hbWVDb21tYW5kX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VmX2NoYW5nZU5hbWVDb21tYW5kX3VuZG9NZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VmX2NoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VmX2NyZWF0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfY3JlYXRlTGlua0NvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfY3JlYXRlTm9kZUNvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfZGVsZXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9kZWxldGVDb21tYW5kX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VmX2RlbGV0ZUxpbmtDb21tYW5kX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VmX21vdmVCZW5kcG9pbnRDb21tYW5kX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VmX3JlY29ubmVjdExpbmtDb21tYW5kX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VmX3ZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfdmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXJfYnJpbmdEb3duUHJvbXB0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VmX3dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0X3ZhbGlkYXRlTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbnNfRWxlbWVudHNWaWV3RGVsZXRlQWN0aW9uX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JNZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JSZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfaW52YWxpZEVkaXRvck1zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9pbnZhbGlkRWRpdG9yVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JNZXNzYWdlMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbmFtZUVycm9yX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVuYW1lRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0RWxlbWVudERpYWxvZ19zZWxlY3RlbGVtZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0Rlc2NyaXB0aW9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfU2VsZWN0QWxsQnV0dG9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlX2VkaXRfdGV4dDA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfSWNvbkZpbGVDaG9vc2VyRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeU5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfRGVzY3JpcHRpb25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX0Rlc2VsZWN0QWxsQnV0dG9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfbWlncmF0aW9uX2Rpcl9kbGdfZGVzY3JpcHRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ19yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZVRvb0JpZ0RpYWxvZ190ZW1wbGF0ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190ZW1wbGF0ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19TZWxlY3RCdXR0b25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVmYXVsdExpYnJhcnlEZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZWZhdWx0QnJpZWZEZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3Jtc19HdWlkYW5jZVdpdGhBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TGlicmFyeUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0xpYnJhcnlJbnRlcm5sRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TGlicmFyeUVycm9yX3JlYXNvbjE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdMaWJyYXJ5RXJyb3JfcmVhc29uMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0xpYnJhcnlFcnJvcl9yZWFzb24zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TGlicmFyeUVycm9yX2FkdmljZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfRXh0ZXJuYWxJRDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfUHVycG9zZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfU2NvcGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1VzYWdlTm90ZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0FsdGVybmF0aXZlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfSG93VG9TdGFmZjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfS2V5Q29uc2lkZXJhdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfU2NhbGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1Jpc2tMZXZlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfRXN0aW1hdGluZ1RlY2huaXF1ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfUHJvamVjdE1lbWJlckV4cGVydGlzZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfVHlwZU9mQ29udHJhY3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYWNrQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3J3YXJkQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3J3YXJkX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdG9wQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZyZXNoQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZyZXNoX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXduYW1lX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmludEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTWV0aG9kRWRpdG9yX21lbnU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUGFyZW50UGFnZV9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MaXN0UGFnZV9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9UcmVlUGFnZV9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9UYWJsZVBhZ2VfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVGFibGVUcmVlUGFnZV9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9PYmplY3RDb2x1bW5fbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU2VsZkNvbHVtbl9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9Ob09iamVjdFNlbGVjdGVkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfT3BlbkVkaXRvckVycm9yX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dpemFyZF9jYXRlZ29yeTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NZXRob2RNb2RlbFdpemFyZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NZXRob2RNb2RlbFdpemFyZF9kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NZXRob2RFZGl0b3JfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTWV0aG9kRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NZXRob2RFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XaXphcmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTl9GaWxlbmFtZUV4dGVuc2lvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9Nb2RlbE9iamVjdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9YTUxFbmNvZGluZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9YTUxFbmNvZGluZ0Nob2ljZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV2l6YXJkX2luaXRpYWxfb2JqZWN0X2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0ZpbGVDb25mbGljdF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9XQVJOX0ZpbGVDb25mbGljdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZExpbmtEaWFsb2dfbGlua1R5cGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuTGlua0NoZWNrYm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBoZWlnaHRMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2lkdGhMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudHNWaWV3XzIwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudHNWaWV3XzIxOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudHNWaWV3XzIyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudHNWaWV3XzM1OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudHNWaWV3XzM2OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWx0VGFnTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltYWdlU2l6ZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9QcmVzZW50YXRpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9JbmRleDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfUHJlZGVjZXNzb3JzOwotCi0JLy8gcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfU2VsZWN0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2hlY2tsaXN0T3JkZXJfZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfcmVuYW1pbmdfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfTW9kZWxJbmZvOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9QcmVmaXg7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX21vdmVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENoZWNrbGlzdE9yZGVyX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9SZXBldGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX09uZ29pbmc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9TeW5jaHJvbml6YXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0V2ZW50RHJpdmVuOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9EZWxpdmVyYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfT3B0aW9uYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJEaWFsb2dfVHlwZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyRGlhbG9nX0V4cGFuZEFsbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVEaWFsb2dfbW92aW5nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWRTaGFwZUljb25XYXJuaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkU2hhcGVJY29uRXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX05hbWVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfTmFtZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fbmV3Q29uZmlndXJhdGlvbldpemFyZF90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdMaWJyYXJ5V2l6YXJkX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TGlicmFyeVdpemFyZE1haW5QYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TGlicmFyeVdpemFyZE1haW5QYWdlX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeVBhdGhMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeVR5cGVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uV2l6YXJkX3dpbmRvd1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudHNWaWV3X3JlcGxhY2Vpbmd3aXRoZm9ybWF0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbldhcm5pbmc7Ci0KLQkvLyBwdWJsaWMgc3RhdGljIFN0cmluZyBNZXNzYWdlTGFiZWxQcm92aWRlcl91bnNlbGVjdGVkcGFja2FnZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbkVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RlcHNPcmRlckRpYWxvZ19zdGVwczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0ZXBzT3JkZXJEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1BsYW5uZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzcGVjaWZ5ZGlyZWN0b3J5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX011bHRpcGxlT2NjdXJyZW5jZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0VudHJ5U3RhdGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0V4aXRTdGF0ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbHVtbnN0b0FkZF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9UeXBlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9UZWFtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkNoZWF0c2hlZXRWaWV3X3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbFVwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbERvd247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlVXA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlRG93bjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0luZGVudDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9PdXRkZW50OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfUmV2ZWFsX1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29weTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRob2RMaWJyYXJ5RWRpdG9yX3RpdGxlOwotCi0JLy8gcHVibGljIHN0YXRpYyBTdHJpbmcgTWVzc2FnZVZpZXdfc2VsZWN0ZWRfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXNzYWdlVmlld19lcnJtc2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld19lcnJfc2F2aW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyX2NvcHlpbmdfZmlsZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycl9jb3B5aW5nX2ZpbGVfZXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJfY29weWluZ19maWxlX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycl9wcm9jZXNzaW5nX2ZpbGVfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0Q29uZmlndXJhdGlvbl90b29sdGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdERpYWxvZ19tc2dDYW5ub3RFZGl0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZVRoaXNBY3Rpb25fc2F2ZW9iamVjdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld19yZXBsYWNlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9FeHRlbmQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX2Rlc3RpbmF0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaG9vc2VEZWZhdWx0RGlyZWN0b3J5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0Fzc2lnblVzZXJEaWFncmFtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkSW1hZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYWRkSW1hZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfd3BkSW1hZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfbm90YUZpbGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYXNzaWduQnV0dG9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2VudGVyZWRJbWFnZU5vdEZvdW5kOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3NlbGVjdGVkSW1hZ2VOb3RGb3VuZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBREltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZUFEREltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZVdQREltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29udHJpYnV0ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1JlcGxhY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9EaWFncmFtczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfYWN0aW9uX2RlZXBDb3B5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyRGlhbG9nX0JyaWVmRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9oaWRlVG9vbFRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3NBbGw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJEaWFsb2dfUGF0dGVybl9kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX1RyZWVUaXRsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfQWRkQ2F0ZWdvcmllc1RpdGxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9TdWJDYXRlZ29yaWVzVGl0bGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0xvYWRpbmdNZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW92ZURpYWxvZ192YWxpZGRlc3RpbmF0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX2Nhbm5vdE1vZGlmeURlc3RpbmF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsQWxsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkJhc2VBY3Rpdml0eTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NGb3JtRWRpdG9yX2V4cGFuQWxsQWN0aW9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRm9ybUVkaXRvcl9jb2xsYXBzZUFsbEFjdGlvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGlhZ3JhbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfcHJvbXB0VG9EZWxldGVCZWZvcmVSZXZlYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfU2VsZWN0Q29sdW1uczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURldGFpbERpYWdyYW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfQ29sdW1uU2VsZWN0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N3aXRjaENvbmZpZ3VyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3VwcHJlc3Npb25Hcm91cFRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX2luaGVyaXRTdXBwcmVzc2lvblN0YXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fSW5zZXJ0TmV3UGhhc2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWaWV3SGVscGVyX3JlbG9hZExpYk9uUm9sbGJhY2tFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRjb25maXJtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9BZGRNaXNzaW5nVG9vbFRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uR2VuZXJhbEluZm87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9BcHBseVBhdHRlcm47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX3NlbGVjdGRlc3RpbmF0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX25vbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZExpYnJhcnlFZGl0b3JfdHJvdWJsZW9iamVjdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VMYWJlbFByb3ZpZGVyX2VycmNoaWxkcGtnczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfU3VwcHJlc3NEaWFsb2dfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX01lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUFzd2l0aGRvdHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfV29ya0JyZWFrZG93blN0cnVjdHVyZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfVGVhbUFsbG9jYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1dvcmtQcm9kdWN0VXNhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0NvbnNvbGlkYXRlZFZpZXc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX2NvbmZpcm1BdXRvU3luY2g7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX2RlZmF1bHRTeW5jaHJvbml6YXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdMaWJyYXJ5RGlhbG9nX25ld2xpYnJhcnlfYXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdQbHVnaW5EaWFsb2dfbmV3cGx1Z2luX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RFbGVtZW50RGlhbG9nX3RpdGxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuQ29uZmlnRGlhbG9nbmV3Y29uZmlnX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2VfQlNFZGl0b3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX2ludmFsaWRfbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZW1vZGVsbGlicmFyeTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZExpYnJhcnlFZGl0b3JfZXJyb3JfZGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uX2RlbGV0ZWNvbmZpcm1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX0NvbnRlbnRFbGVtZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0Jyb3dzZUJ1dHRvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dGFjaG1lbnREaWFsb2dhdHRhY2hGaWxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkNvbmZpZ0RpYWxvZ29wZW5jb25maWdfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld19yZXBsYWNlQWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfU2hvd0Vycm9yVG9vbFRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkZvcm1QcmVmaXg7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDaGVja2xpc3RPcmRlcl9jaGVja2xpc3RpdGVtc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfTWFrZUNsb3N1cmVUb29sVGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3UGx1Z2luRGlhbG9nX3JlZmVyZW5jZXBsdWdpbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX2NyZWF0ZUZyZWVUZXh0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbVZhbGlkYXRpb25fZXJyX3NhbWVwcmVkYW5kc3VjX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JDaG9vc2VyX2xvYWRkRXJyb3JEbGdUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvckNob29zZXJfUmVzb3VyY2VzRXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9Gb3JtUHJlZml4OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dGFjaG1lbnREaWFsb2dGaWxlVVJMX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGVwc09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJfc2F2ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VWaWV3X2VycmVsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VWaWV3X3JlZmVsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9jcmVhdGVTdGFydE5vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnREZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RpcmVjdG9yeUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9vdFByZWZQYWdlX2VuYWJsZXByb2Nlc3Njb250cmlidXRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udHJpYnV0aW9uU2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld19vcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ192aWV3ZXJMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfZGVsZXRlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1FZGl0b3Jfb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl9kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXUENvbXBhcnRtZW50RmlndXJlXzA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9tcHRmb3JfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfTmFtZVBhdHRlcm47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbl9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1BhdHRlcm47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJfcHJvY2Vzc2luZ19maWxlX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQ2F0ZWdvcnlUeXBlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1NlbGVjdENhdGVnb3JpZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVhdHNoZWV0X2xvYWRfZmFpbHVyZV9sb2dfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3Q29uZmlndXJhdGlvbldpcmF6ZF9jcmVhdGVFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld1BsdWdpbldpemFyZF9jcmVhdGVFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX21vdmVFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbmFtZURpYWxvZ19yZW5hbWVFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX2NyZWF0ZUVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHVwbGljYXRlUGx1Z2luTmFtZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFESW1hZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JNc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRBRERJbWFnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZFdQREltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURJbWFnZUluUHVibGlzaGluZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfcHJvbXB0VG9EZWxldGVCZWZvcmVTdXBwcmVzczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFEREltYWdlSW5QdWJsaXNoaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlV1BESW1hZ2VJblB1Ymxpc2hpbmc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0RpYWdyYW1JbWFnZV9JbnB1dERpYWxvZ19pbml0aWFsVmFsdWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9TaG93TGlua2VkRWxlbWVudGluTGlicmFyeVZpZXc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX3VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb25fbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0NvbnRleHRNZW51X0RpYWdyYW1JbWFnZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfY29uZmlnTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJvcGVydGllc19sYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9uYW1lX2xhYmxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByZXNlbnRhdGlvbk5hbWVfbGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYnJpZWZEZXNjX2xhYmxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX29wdGlvbmFsSW5vdXRzX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX21hbmRhdG9yeUlucHV0c19sYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9vdXRwdXRzX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYWRkblBlcmZvcm1lcnNfbGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcmVzcG9uc2libGVSb2xlc19sYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9jb250bkFydGlmYWN0c19sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9kaWx2ZWRQYXJ0c19sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9zZWxTdGVwc19sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RFZGl0b3JzVG9EaXNjYXJkQ29uZmxpY3RDaGFuZ2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3RpdGxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX2V4cGxhaW5UZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlblJURTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsb3NlUlRFOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2hhbmdlSGlzdG9yeURpYWxvZ19kZWxpbWl0ZXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlc2V0c19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtwcm9kdWN0dHlwZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbnNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21jYXRlZ29yeV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uY2VwdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tsaXN0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGFtcGxlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkZWxpbmVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvYWRtYXBfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldXNhYmxlYXNzZXRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1cHBvcnRpbmdtYXRlcmlhbF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb3J0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVtcGxhdGVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlcm1kZWZpbml0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sbWVudG9yX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aGl0ZXBhcGVyX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JLy8gTmV3IFN0cmluZyBTZWN0aW9uIERlc2NyaXB0aW9uCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X25vdGF0aW9uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RfdGFpbG9yaW5nU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dGNvbWVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0Y29tZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dGNvbWVfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dGNvbWVfbm90YXRpb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdXRjb21lX3RhaWxvcmluZ1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dGNvbWVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdXRjb21lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpdmVyYWJsZV9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVfbm90YXRpb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpdmVyYWJsZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpdmVyYWJsZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5fZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG9tYWluX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG9tYWluX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG9tYWluX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya3Byb2R1Y3R0eXBlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtwcm9kdWN0dHlwZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtwcm9kdWN0dHlwZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtwcm9kdWN0dHlwZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVzZXRfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZXNldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVzZXRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jZXB0X2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNlcHRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jZXB0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uY2VwdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrbGlzdF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja2xpc3RfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja2xpc3RfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja2xpc3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGFtcGxlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4YW1wbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGFtcGxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhhbXBsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1aWRlbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkZWxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkZWxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkZWxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRpb25jb25zaWRlcmF0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBvcnRfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb3J0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb3J0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb3J0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzdWFibGVhc3NldF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXN1YWJsZWFzc2V0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzdWFibGVhc3NldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc3VhYmxlYXNzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2FkbWFwX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvYWRtYXBfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2FkbWFwX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9hZG1hcF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1cHBvcnRpbmdtYXRlcmlhbF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdXBwb3J0aW5nbWF0ZXJpYWxfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdXBwb3J0aW5nbWF0ZXJpYWxfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdXBwb3J0aW5nbWF0ZXJpYWxfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wbGF0ZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wbGF0ZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlbXBsYXRlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVtcGxhdGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZXJtZGVmaW5pdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZXJtZGVmaW5pdGlvbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlcm1kZWZpbml0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVybWRlZmluaXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sbWVudG9yX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xtZW50b3JfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sbWVudG9yX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbG1lbnRvcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdoaXRlcGFwZXJfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2hpdGVwYXBlcl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdoaXRlcGFwZXJfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aGl0ZXBhcGVyX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZWdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVzZXRncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlc2V0Z3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlc2V0Z3JvdXBpbmdfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlc2V0Z3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21jYXRlZ29yeV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21jYXRlZ29yeV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbWNhdGVnb3J5X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tY2F0ZWdvcnlfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21jYXRlZ29yeV9JY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uY2VwdF9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tsaXN0X2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sbWVudG9yX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aGl0ZXBhcGVyX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVybWRlZmluaXRpb25faWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlbXBsYXRlX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXVzYWJsZWFzc2V0X2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBvcnRfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGFtcGxlX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkZWxpbmVfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvYWRtYXBfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1cHBvcnRpbmdtYXRlcmlhbF9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNpcmN1bGFyX2RlcGVuZGVuY3lfZXJyb3JfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBseV9wYXR0ZXJuX2Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGx5X3BhdHRlcm5fZXJyb3JfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JfdGl0bGVfY29sb25fd2l0aF9zcGFjZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoX2NhdGVnb3JpZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRfbGlzdF9sZW5ndGhfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlbmRfc2VtYW50aWNzX2J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZW5kX3NlbWFudGljc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUHJlZmVyZW5jZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc19UYXNrOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsX1Rhc2s7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMYXlvdXRBY3Rpb25Hcm91cF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExheW91dEFjdGlvbkdyb3VwX2ZsYXRMYXlvdXRBY3Rpb25fbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMYXlvdXRBY3Rpb25Hcm91cF9oaWVyYXJjaGljYWxMYXlvdXRBY3Rpb25fbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmZXJlbmNlX1dvcmtCcmVha2Rvd25FbGVtZW50czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZlcmVuY2VfRGVzY3JpcHRvckVsZW1lbnRzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZmVyZW5jZV9icmVha0Rvd25FbGVtZW50X0Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZmVyZW5jZV9BY3Rpdml0eV9EaWFncmFtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZmVyZW5jZV9BY3Rpdml0eV9EZXRhaWxfRGlhZ3JhbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25QYWdlX1F1aWNrZml4RXJyb3JfcmVhc29uMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25QYWdlX3F1aWNrZml4RXJyb3JfdGl0bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdExpbmtUeXBlUHJlZkxhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1zX0d1aWRhbmNlV2l0aFVybEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlX2FscmVhZHlBdHRhY2hlZF9tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0YWNobWVudERpYWxvZ2F0dGFjaFVybF90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRlX21ldGhvZF9saWJyYXJ5OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVDYXRlZ29yaWVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0NhdGVnb3JpZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBsdWdpbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBsdWdpbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTdjNTExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuRGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWRpdG9yUGFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLlByb2Nlc3NFZGl0b3JQYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5QcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Db3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBUaGUgQXV0aG9yaW5nIFVJIHNlcnZpY2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEF1dGhvcmluZ1VJU2VydmljZSB7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEF1dGhvcmluZ1VJU2VydmljZSBpbnN0YW5jZSA9IG5ldyBBdXRob3JpbmdVSVNlcnZpY2UoKTsKLQotCS8vIFRoZSBzdGF0dXMgZmxhZy4KLQlwcml2YXRlIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEF1dGhvcmluZ1VJU2VydmljZSgpIHsKLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcihuZXcgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJfQkJCQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCQkJc3RhcnQoKTsKLQkJCQl9Ci0JCQkJTGlicmFyeVVJVXRpbC51cGRhdGVTaGVsbFRpdGxlKCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCX0JCQkKLQkJfSk7CQkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBBdXRob3JpbmdVSVNlcnZpY2UgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydHMgdGhlIEF1dGhvcmluZyBVSSBzZXJ2aWNlLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKLQkJaWYgKCFzdGFydGVkKSB7CQotCQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuYXBwbHlEZWZhdWx0VmFsdWVzRm9yQnJlYWtkb3duRWxlbWVudEF0dHJpYnV0ZXMoKTsKLQotCQkJLy8gSW5pdGlhbGl6ZSBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yCi0JCQlQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFLmdldENsYXNzKCk7Ci0JCQkKLQkJCS8vIFNldCBjb25maWd1cmF0b3IgZm9yIFdCUyBhZGFwdGVyIGZhY3RvcnkgaWYgaXQncyBub3Qgc2V0IHlldAotCQkJaWYoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQlDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJaWYoYWRhcHRlckZhY3RvcnkuZ2V0RmlsdGVyKCkgPT0gbnVsbCkgewotCQkJCQlhZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIoUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBJbml0aWFsaXplIHRoZSBtb3ZlL3Bhc3RlIGNvbW1hbmQuCi0JCQlNZXRob2RFbGVtZW50QWRkQ29tbWFuZAotCQkJCQkuc2V0UmVzb3VyY2VNYW5hZ2VyKG5ldyBDb3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uKCkpOwotCi0JCQkvLyBJbml0aWFsaXplIHRoZSBFZGl0b3JDaG9vc2VyLgotCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpOwotCi0JCQkvLyBMb2FkIEVkaXRvclBhZ2UgUHJvdmlkZXJzCi0JCQlNZXRob2RFZGl0b3JQYWdlUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKS5sb2FkUHJvdmlkZXJzKCk7Ci0JCQlQcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyLmdldEluc3RhbmNlKCkubG9hZFByb3ZpZGVycygpOwotCQkJRGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKS5sb2FkUHJvdmlkZXJzKCk7Ci0KLQkJCS8vIFNldCBwcm92aWRlcnMgZm9yIGxpYnJhcnkgZWRpdC4KLQkJCVByb3ZpZGVycy5zZXRDb25maWd1cmF0b3JGYWN0b3J5KG5ldyBJQ29uZmlndXJhdG9yRmFjdG9yeSgpIHsKLQkJCQlwdWJsaWMgSUNvbmZpZ3VyYXRvciBjcmVhdGVDb25maWd1cmF0b3IoCi0JCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkJCQlyZXR1cm4gbmV3IFByb2Nlc3NDb25maWd1cmF0b3IoY29uZmlnLCB0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJUHJvdmlkZXJzCi0JCQkJCS5zZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcihuZXcgQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKSk7Ci0KLQkJCVByb3ZpZGVycy5zZXRQcmVmZXJlbmNlU3RvcmUoTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQotCQkJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBzdG9yZSA9IG5ldyBQcmVmZXJlbmNlU3RvcmVXcmFwcGVyKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCQlQcm92aWRlcnMuc2V0QXV0aG9yaW5nUGx1Z2luUHJlZmVyZW5jZVN0b3JlKHN0b3JlKTsKLQotCQkJTGlzdDxJQ29tbWFuZExpc3RlbmVyPiBjbWRMaXN0ZW5lcnMgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDb21tYW5kTGlzdGVuZXJzKCk7Ci0JCQljbWRMaXN0ZW5lcnMuYWRkQWxsKERpYWdyYW1FZGl0b3JVdGlsLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldFZhcnlDb21tYW5kTGlzdGVuZXJzKCkpOwotCQkJZm9yIChJdGVyYXRvcjxJQ29tbWFuZExpc3RlbmVyPiBpdGVyID0gY21kTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlDb21tYW5kTGlzdGVuZXIgbGlzdGVuZXIgPSBpdGVyLm5leHQoKTsKLQkJCQlQcm92aWRlcnMucmVnaXN0ZXJDb21tYW5kTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJfQotCi0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc3RhcnQoKTsKLQkJCQotCQkJc3RhcnRlZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wcyB0aGUgQXV0aG9yaW5nIFVJIHNlcnZpY2UuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB7Ci0JCWlmIChzdGFydGVkKSB7Ci0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc3RvcCgpOwkJCQotCQkJc3RhcnRlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJVGV4dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSVRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzNzc1OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotCi0vKioKLSAqIERlZmluZXMgYW5kIGNhY2hlcyB0aGUgY29tbW9ubHkgcmVmZXJlbmNlZCB0ZXh0IGluIHRoZSBBdXRob3JpbmcgVUkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXV0aG9yaW5nVUlUZXh0IHsKLQotCS8qKgotCSAqIEVkaXRvciBmb3JtIHBhZ2UgdGl0bGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU0lHTl9QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXNzaWduUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SSUVTX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jYXRlZ29yaWVzUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxJVkVSQUJMRV9QQVJUU19QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsaXZlcmFibGVQYXJ0c1BhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlc2NyaXB0aW9uUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDSVBMSU5FU19QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZXNQYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURBTkNFX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5ndWlkYW5jZVBhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFVklFV19QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJldmlld1BhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJFTkNFU19QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVmZXJlbmNlc1BhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJFTkNFX1dPUktGTE9XX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZWZlcmVuY2VXb3JrZmxvd1BhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRVNfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVzUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX1NFVFNfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVTZXRzUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEVQU19QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RlcHNQYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tTX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrc1BhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTF9NRU5UT1JTX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy50b29sTWVudG9yc1BhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19QUk9EVUNUU19QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RzUGFnZV90aXRsZTsgCi0KLQkvKioKLQkgKiBFZGl0b3Igc2VjdGlvbiBuYW1lcyBhbmQgZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tfSVRFTVNfU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hlY2tJdGVtc1NlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19JVEVNU19TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGVja0l0ZW1zU2VjdGlvbl9kZXNjOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUEVOREVOQ0lFU19TRUNUSU9OX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXBlbmRlbmNpZXNTZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQRU5ERU5DSUVTX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlcGVuZGVuY2llc1NlY3Rpb25fZGVzYzsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVRBSUxfU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGV0YWlsU2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFVEFJTF9TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXRhaWxTZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9JTkZPX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlbmVyYWxJbmZvU2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfSU5GT19TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmljb25TZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy5pY29uU2VjdGlvbl9kZXNjOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5vdGF0aW9uU2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5vdGF0aW9uU2VjdGlvbl9kZXNjOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRURfUExVR0lOU19TRUNUSU9OX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VEX1BMVUdJTlNfU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBRkZJTkdfU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RhZmZpbmdTZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBRkZJTkdfU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RhZmZpbmdTZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RFUFNfU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RlcHNTZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RFUFNfU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RlcHNTZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFJTE9SSU5HX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhaWxvcmluZ1NlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUlMT1JJTkdfU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFpbG9yaW5nU2VjdGlvbl9kZXNjOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUklBQklMSVRZX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnZhcmlhYmlsaXR5U2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUklBQklMSVRZX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fSU5GT19TRUNUSU9OX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy52ZXJzaW9uSW5mb1NlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0lORk9fU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7IAotCi0JLyoqCi0JICogVUkgYW5kIGVsZW1lbnQgYXR0cmlidXRlIGxhYmVscy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERJVElPTkFMX0lORk9fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFkZGl0aW9uYWxJbmZvX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFwcGxpY2F0aW9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxURVJOQVRJVkVTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hbHRlcm5hdGl2ZXNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NJR05NRU5UX0FQUFJPQUNIRVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFzc2lnbm1lbnRBcHByb2FjaGVzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXV0aG9yc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tHUk9VTkRfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJhY2tncm91bmRfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX0VMRU1FTlRfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJhc2VFbGVtZW50X3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9HVUlEQU5DRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmFzZUd1aWRhbmNlX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJRUZfREVTQ1JJUFRJT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJyaWVmRGVzY3JpcHRpb25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUklFRl9PVVRMSU5FX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5icmllZk91dGxpbmVfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0VfREFURV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hhbmdlRGF0ZV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRV9ERVNDUklQVElPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hhbmdlRGVzY3JpcHRpb25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19JVEVNU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hlY2tJdGVtc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRSSUJVVEVTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb250cmlidXRlc190ZXh0OyAKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9DT05UUklCVVRFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubG9jYWxDb250cmlidXRlc190ZXh0OyAgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1BZUklHSFRfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvcHlyaWdodF90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5EU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXh0ZW5kc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0RFU0NSSVBUSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5leHRlcm5hbERlc2NyaXB0aW9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfSURfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4dGVybmFsSWRfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHT0FMU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ29hbHNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBBQ1RfT0ZfTk9UX0hBVklOR19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuaW1wYWN0T2ZOb3RIYXZpbmdfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OU0lERVJBVElPTlNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmtleUNvbnNpZGVyYXRpb25zX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVWRUxfT0ZfQURPUFRJT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmxldmVsc09mQWRvcHRpb25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQUlOX0RFU0NSSVBUSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5tYWluRGVzY3JpcHRpb25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5uYW1lX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0VMRU1FTlRfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0VsZW1lbnRfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfQVBQTElDQUJMRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubm90QXBwbGljYWJsZV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5ub3RhdGlvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0lOR19HVUlEQU5DRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucGFja2FnaW5nR3VpZGFuY2VfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRU5UQVRJT05fTkFNRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJlc2VudGF0aW9uTmFtZV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0JMRU1fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2JsZW1fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVVJQT1NFX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wdXJwb3NlX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBU09OX0ZPUl9OT1RfTkVFRElOR19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVhc29uRm9yTm90TmVlZGluZ190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0VTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXBsYWNlc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUFJFU0VOVEFUSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXByZXNlbnRhdGlvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUFJFU0VOVEFUSU9OX09QVElPTlNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlcHJlc2VudGF0aW9uT3B0aW9uc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSUxMU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2tpbGxzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RFUFNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN0ZXBzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RFUF9OQU1FX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdGVwc19uYW1lX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOT05ZTVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bm9ueW1zX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUQUNIRURfRklMRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXR0YWNoZWRGaWxlX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudHlwZV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOSVFVRV9JRF9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudW5pcXVlSWRfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJJQUJJTElUWV9UWVBFX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy52YXJpYWJpbGl0eVR5cGVfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy52ZXJzaW9uX3RleHQ7IAotCi0JLyoqCi0JICogQnV0dG9uIGxhYmVscy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hZGRCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRBQ0hfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hdHRhY2hCdXR0b25fdGV4dDsgCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUQUNIX1VSTF9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmF0dGFjaFVybEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJPV1NFX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYnJvd3NlQnV0dG9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFX1RZUEVfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGFuZ2VUeXBlQnV0dG9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVJfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jbGVhckJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGV0ZUJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0VMRUNUX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVzZWxlY3RCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVRBQ0hfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXRhY2hCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1dOX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG93bkJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SREVSX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMub3JkZXJCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdEJ1dHRvbl90ZXh0OyAKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkVfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZW1vdmVCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zZWxlY3RCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUF9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnVwQnV0dG9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19ISVNUT1JZX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmlld0hpc3RvcnlCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTFdBWVNfQlVUVE9OX1RFWFQgPSBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5BTFdBWVM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVZFUl9CVVRUT05fVEVYVCA9IE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLk5FVkVSOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPTVBUX0JVVFRPTl9URVhUID0gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuUFJPTVBUOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DQVRFR09SSUVTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wdWJsaXNoX2NhdGVnb3JpZXNfdGV4dDsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQnJvd3NpbmdQZXJzcGVjdGl2ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9Ccm93c2luZ1BlcnNwZWN0aXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4M2FhMzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9Ccm93c2luZ1BlcnNwZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db25maWd1cmF0aW9uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbnRlbnRWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFRoZSBNZXRob2QgQnJvd3NpbmcgcGVyc3BlY3RpdmUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQnJvd3NpbmdQZXJzcGVjdGl2ZSBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIHBlcnNwZWN0aXZlIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNQRUNUSVZFX0lEID0gQnJvd3NpbmdQZXJzcGVjdGl2ZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeSNjcmVhdGVJbml0aWFsTGF5b3V0KElQYWdlTGF5b3V0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0JCWxheW91dC5zZXRFZGl0b3JBcmVhVmlzaWJsZShmYWxzZSk7Ci0JCVN0cmluZyBlZGl0b3JBcmVhID0gbGF5b3V0LmdldEVkaXRvckFyZWEoKTsKLQkJbGF5b3V0LmFkZFZpZXcoQ29uZmlndXJhdGlvblZpZXcuVklFV19JRCwgSVBhZ2VMYXlvdXQuTEVGVCwgMC4zMGYsCi0JCQkJZWRpdG9yQXJlYSk7Ci0JCVBlcnNwZWN0aXZlTGlzdFV0aWwuYWRkUGVyc3BlY3RpdmVTaG9ydExpc3QobGF5b3V0KTsKLQkJbGF5b3V0LmFkZFZpZXcoQ29udGVudFZpZXcuVklFV19JRCwgSVBhZ2VMYXlvdXQuUklHSFQsIDAuNzBmLCBlZGl0b3JBcmVhKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGlzIHBlcnNwZWN0aXZlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuKCkgewotCQl0cnkgewotCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCWlmICh3aW5kb3cgPT0gbnVsbCkgewotCQkJCUlXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLQkJCQlpZiAod2luZG93cyAhPSBudWxsICYmIHdpbmRvd3MubGVuZ3RoID4gMCkgewotCQkJCQl3aW5kb3cgPSB3aW5kb3dzWzBdOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5zaG93UGVyc3BlY3RpdmUoUEVSU1BFQ1RJVkVfSUQsCi0JCQkJCQl3aW5kb3cpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkiRmFpbGVkIHRvIG9wZW4gYnJvd3NpbmcgcGVyc3BlY3RpdmUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1BlcnNwZWN0aXZlTGlzdFV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUGVyc3BlY3RpdmVMaXN0VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjg4MGJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUGVyc3BlY3RpdmVMaXN0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5QZXJzcGVjdGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIGZvciB0aGUgQXV0aG9yaW5nIGFuZCBCcm93c2luZyBwZXJzcGVjdGl2ZXMuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVMaXN0VXRpbCB7Ci0KLQkvKioKLQkgKiBBZGQgdGhlIEJyb3dzaW5nIGFuZCBBdXRob3JpbmcgcGVyc3BlY3RpdmUgc2hvcnRjdXRzIHRvIHRoZSBnaXZlbiBwYWdlCi0JICogbGF5b3V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRQZXJzcGVjdGl2ZVNob3J0TGlzdChJUGFnZUxheW91dCBsYXlvdXQpIHsKLQkJbGF5b3V0LmFkZFBlcnNwZWN0aXZlU2hvcnRjdXQoQnJvd3NpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCWxheW91dC5hZGRQZXJzcGVjdGl2ZVNob3J0Y3V0KEF1dGhvcmluZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjdXJyZW50IHBlcnNwZWN0aXZlIGlzIHRoZSBBdXRob3JpbmcKLQkgKiBwZXJzcGVjdGl2ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdXRob3JpbmdQZXJzcGVjdGl2ZSgpIHsKLQkJU3RyaW5nIGFjdGl2ZVBlcnNwZWN0aXZlSWQgPSBQZXJzcGVjdGl2ZVV0aWwuZ2V0QWN0aXZlUGVyc3BlY3RpdmVJZCgpOwotCQlpZiAoYWN0aXZlUGVyc3BlY3RpdmVJZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gYWN0aXZlUGVyc3BlY3RpdmVJZAotCQkJCQkuZXF1YWxzSWdub3JlQ2FzZShBdXRob3JpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjdXJyZW50IHBlcnNwZWN0aXZlIGlzIHRoZSBCcm93c2luZwotCSAqIHBlcnNwZWN0aXZlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Jyb3dzaW5nUGVyc3BlY3RpdmUoKSB7Ci0JCVN0cmluZyBhY3RpdmVQZXJzcGVjdGl2ZUlkID0gUGVyc3BlY3RpdmVVdGlsLmdldEFjdGl2ZVBlcnNwZWN0aXZlSWQoKTsKLQkJaWYgKGFjdGl2ZVBlcnNwZWN0aXZlSWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGFjdGl2ZVBlcnNwZWN0aXZlSWQKLQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoQnJvd3NpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODU3YTZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQ1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU1RBUlQgTk8gVFJBTlNMQVRJT04KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX2RlbGltaXRlcj18Ci0KLSNCZWxvdyBwcm9wZXJ0eSAiZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzIiBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQKLSNEb24ndCBkZWxldGUgYSBzcGFjZSBhZnRlciAiOiAiCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1lZGl0b3JfdGl0bGVfY29sb25fd2l0aF9zcGFjZXM9OiAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEVORCBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBGb3JtIFBhZ2UgVGl0bGVzCi1hc3NpZ25QYWdlX3RpdGxlPUFzc2lnbgotY2F0ZWdvcmllc1BhZ2VfdGl0bGU9Q2F0ZWdvcmllcwotZGVsaXZlcmFibGVQYXJ0c1BhZ2VfdGl0bGU9RGVsaXZlcmFibGUgUGFydHMKLWRlc2NyaXB0aW9uUGFnZV90aXRsZT1EZXNjcmlwdGlvbgotZGlzY2lwbGluZXNQYWdlX3RpdGxlPURpc2NpcGxpbmVzCi1kaXNjYXJkdW5yZXNvbHZlZHJlZj1EaXNjYXJkIHVucmVzb2x2ZWQgcmVmZXJlbmNlcwotZ3VpZGFuY2VQYWdlX3RpdGxlPUd1aWRhbmNlCi1wcmV2aWV3UGFnZV90aXRsZT1QcmV2aWV3Ci1yZWZlcmVuY2VzUGFnZV90aXRsZT1SZWZlcmVuY2VzCi1yZWZlcmVuY2VfdGV4dD1SZWZlcmVuY2VzOgotcmVmZXJlbmNlV29ya2Zsb3dQYWdlX3RpdGxlPVJlZmVyZW5jZSBXb3JrZmxvdwotcm9sZXNQYWdlX3RpdGxlPVJvbGVzCi1yb2xlU2V0c1BhZ2VfdGl0bGU9Um9sZSBTZXRzCi1zdGVwc1BhZ2VfdGl0bGU9U3RlcHMKLXRhc2tzUGFnZV90aXRsZT1UYXNrcwotdG9vbE1lbnRvcnNQYWdlX3RpdGxlPVRvb2wgTWVudG9ycwotd29ya1Byb2R1Y3RzUGFnZV90aXRsZT1Xb3JrIFByb2R1Y3RzCi0KLSMgU2VjdGlvbiBOYW1lcyAmIERlc2NyaXB0aW9uCi1jaGVja0l0ZW1zU2VjdGlvbl9uYW1lPUNoZWNrIEl0ZW1zCi1jaGVja0l0ZW1zU2VjdGlvbl9kZXNjPVNwZWNpZnkgdGhlIGNoZWNrIGl0ZW1zIHRoYXQgY29uc3RpdHV0ZSB0aGlzIGNoZWNrbGlzdC4KLWRlcGVuZGVuY2llc1NlY3Rpb25fbmFtZT1EZXBlbmRlbmNpZXMKLWRlcGVuZGVuY2llc1NlY3Rpb25fZGVzYz1UaGlzIHNlY3Rpb24gZGlzcGxheXMgZGVwZW5kZW5jaWVzIG9mIHRoaXMgY29udGVudCBwYWNrYWdlIHRvIG90aGVyIGNvbnRlbnQgcGFja2FnZXMuCi1kZXRhaWxTZWN0aW9uX25hbWU9RGV0YWlsIEluZm9ybWF0aW9uCi1kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHswfS4KLWdlbmVyYWxJbmZvU2VjdGlvbl9uYW1lPUdlbmVyYWwgSW5mb3JtYXRpb24KLWdlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHswfS4KLWljb25TZWN0aW9uX25hbWU9SWNvbgotaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHswfS4KLW5vdGF0aW9uU2VjdGlvbl9uYW1lPURlbGl2ZXJ5IEluZm9ybWF0aW9uCi1ub3RhdGlvblNlY3Rpb25fZGVzYz1Qcm92aWRlIGRlbGl2ZXJ5IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgezB9LgotcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX25hbWU9UmVmZXJlbmNlZCBQbHVnLWluczoKLXJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9kZXNjPVRoaXMgc2VjdGlvbiBkaXNwbGF5cyBwbHVnLWlucyByZWZlcmVuY2VkIGJ5IHRoaXMgbWV0aG9kIHBsdWctaW4uCi1zdGFmZmluZ1NlY3Rpb25fbmFtZT1TdGFmZmluZyBJbmZvcm1hdGlvbgotc3RhZmZpbmdTZWN0aW9uX2Rlc2M9UHJvdmlkZSBzdGFmZmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvbGUuCi1zdGVwc1NlY3Rpb25fbmFtZT1TdGVwcwotc3RlcHNTZWN0aW9uX2Rlc2M9U3BlY2lmeSB0aGUgc3RlcHMgdG8gcGVyZm9ybSB0aGlzIHRhc2suCi10YWlsb3JpbmdTZWN0aW9uX25hbWU9VGFpbG9yaW5nCi10YWlsb3JpbmdTZWN0aW9uX2Rlc2M9UHJvdmlkZSB0YWlsb3JpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB7MH0uCi12YXJpYWJpbGl0eVNlY3Rpb25fbmFtZT1Db250ZW50IFZhcmlhYmlsaXR5Ci12YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHswfSByZWxhdGVzIHRvIGFub3RoZXIgezB9LgotdmVyc2lvbkluZm9TZWN0aW9uX25hbWU9VmVyc2lvbiBJbmZvcm1hdGlvbgotdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgezB9LgotCi0jIFVJICYgRWxlbWVudCBBdHRyaWJ1dGUgTGFiZWxzCi1hZGRpdGlvbmFsSW5mb190ZXh0PUFkZGl0aW9uYWwgaW5mb3JtYXRpb246Ci1hcHBsaWNhdGlvbl90ZXh0PUFwcGxpY2F0aW9uOgotYWN0aW9uTGFiZWxfZWRpdD0mRWRpdAotYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdj0mU2hvdyBpbiBMaWJyYXJ5IFZpZXcKLWFsdGVybmF0aXZlc190ZXh0PUFsdGVybmF0aXZlczoKLWFzc2lnbm1lbnRBcHByb2FjaGVzX3RleHQ9QXNzaWdubWVudCBhcHByb2FjaGVzOgotYXV0aG9yc190ZXh0PUF1dGhvcnM6Ci1iYWNrZ3JvdW5kX3RleHQ9QmFja2dyb3VuZDoKLWJhc2VFbGVtZW50X3RleHQ9QmFzZToKLWJhc2VHdWlkYW5jZV90ZXh0PUJhc2UgZ3VpZGFuY2U6Ci1icmllZkRlc2NyaXB0aW9uX3RleHQ9QnJpZWYgZGVzY3JpcHRpb246Ci1kZXNjcmlwdGlvbl90ZXh0PURlc2NyaXB0aW9uOgotYmFja3VwYmVmb3Jlc2F2ZV90ZXh0PUJhY2sgdXAgYmVmb3JlIHNhdmUKLWJyaWVmT3V0bGluZV90ZXh0PUJyaWVmIG91dGxpbmU6Ci1jaGFuZ2VEYXRlX3RleHQ9Q2hhbmdlIGRhdGU6Ci1jaGFuZ2VEZXNjcmlwdGlvbl90ZXh0PUNoYW5nZSBkZXNjcmlwdGlvbjoKLWNoZWNrSXRlbXNfdGV4dD1DaGVjayBJdGVtcwotY29udHJpYnV0ZXNfdGV4dD1Db250cmlidXRlcwotbG9jYWxDb250cmlidXRlc190ZXh0PUxvY2FsQ29udHJpYnV0ZXMKLWNvbnRyaWJ1dGVzX3RvX3RleHQ9Q29udHJpYnV0ZXMgdG8KLWNvcHlyaWdodF90ZXh0PUNvcHlyaWdodDoKLWVkaXRvcl90ZXh0PUVkaXRvcgotZXh0ZW5kc190ZXh0PUV4dGVuZHMKLWV4dGVuZF90ZXh0PUV4dGVuZAotZXh0ZXJuYWxEZXNjcmlwdGlvbl90ZXh0PUV4dGVybmFsIGRlc2NyaXB0aW9uOgotZXh0ZXJuYWxJZF90ZXh0PUV4dGVybmFsIElEOgotZ29hbHNfdGV4dD1Hb2FsczoKLWltcGFjdE9mTm90SGF2aW5nX3RleHQ9SW1wYWN0IG9mIG5vdCBoYXZpbmc6Ci1rZXlDb25zaWRlcmF0aW9uc190ZXh0PUtleSBjb25zaWRlcmF0aW9uczoKLWxldmVsc09mQWRvcHRpb25fdGV4dD1MZXZlbCBvZiBhZG9wdGlvbjoKLW1haW5EZXNjcmlwdGlvbl90ZXh0PU1haW4gZGVzY3JpcHRpb246Ci1uZXdFbGVtZW50X3RleHQ9TmV3IHswfQotbmFtZV90ZXh0PU5hbWU6Ci1ub3RBcHBsaWNhYmxlX3RleHQ9Tm90IGFwcGxpY2FibGUKLXBhY2thZ2luZ0d1aWRhbmNlX3RleHQ9UGFja2FnaW5nIGd1aWRhbmNlOgotcHJlc2VudGF0aW9uTmFtZV90ZXh0PVByZXNlbnRhdGlvbiBuYW1lOgotcHJvbXB0Zm9ybGliYXJ5X3RleHQ9UHJvbXB0IGZvciBtZXRob2QgbGlicmFyeSBvbiBzdGFydHVwCi1lbmFibGVIZWFsdGhDaGVja190ZXh0PUVuYWJsZSBpbnRlcm5hbCBkZWJ1ZyB0b29scwotbm90YXRpb25fdGV4dD1Ob3RhdGlvbjoKLXByb2JsZW1fdGV4dD1Qcm9ibGVtOgotcHVycG9zZV90ZXh0PVB1cnBvc2U6Ci1yZWFzb25Gb3JOb3ROZWVkaW5nX3RleHQ9UmVhc29uIGZvciBub3QgbmVlZGluZzoKLXJlcGxhY2VzX3RleHQ9UmVwbGFjZXMKLWxvY2FsUmVwbGFjZXNfdGV4dD1Mb2NhbFJlcGxhY2VzCi1leHRlbmRzUmVwbGFjZXNfdGV4dD1FeHRlbmRzIGFuZCBSZXBsYWNlcwotcmVwcmVzZW50YXRpb25PcHRpb25zX3RleHQ9UmVwcmVzZW50YXRpb24gb3B0aW9uczoKLXJlcHJlc2VudGF0aW9uX3RleHQ9U2VsZWN0ZWQgcmVwcmVzZW50YXRpb246Ci1hdHRhY2hlZEZpbGVfdGV4dD1BdHRhY2hlZCBmaWxlKHMpL1VSTChzKToKLXNraWxsc190ZXh0PVNraWxsczoKLXN0ZXBzX3RleHQ9U3RlcHM6Ci1zdGVwc19uYW1lX3RleHQ9TmFtZToKLXN0b3BfdGV4dD1TdG9wCi1wcmludF90ZXh0PVByaW50Ci1zeW5vbnltc190ZXh0PVN5bm9ueW1zOgotdHlwZV90ZXh0PVR5cGU6Ci1jb3B5X3RleHQ9Q29weQotZGVlcENvcHlfdGV4dD1EZWVwIENvcHkKLWJhY2tfdGV4dD1CYWNrCi1uZXdfcGx1Z2luPU5lJncgTWV0aG9kIFBsdWctaW4KLW1vdmU9Jk1vdmUuLi4KLXVuaXF1ZUlkX3RleHQ9VW5pcXVlIElEOgotdmFyaWFiaWxpdHlUeXBlX3RleHQ9VmFyaWFiaWxpdHkgdHlwZToKLXZlcnNpb25fdGV4dD1WZXJzaW9uOgotCi0jIEJ1dHRvbiBMYWJlbHMKLWFkZEJ1dHRvbl90ZXh0PUFkZC4uLgotYXR0YWNoQnV0dG9uX3RleHQ9QXR0YWNoIEZpbGUuLi4KLWF0dGFjaFVybEJ1dHRvbl90ZXh0PUF0dGFjaCBVcmwuLi4KLWJyb3dzZUJ1dHRvbl90ZXh0PUJyb3dzZS4uLgotY2hhbmdlVHlwZUJ1dHRvbl90ZXh0PUNoYW5nZSBUeXBlLi4uCi1jbGVhckJ1dHRvbl90ZXh0PUNsZWFyCi1kZWxldGVCdXR0b25fdGV4dD1EZWxldGUKLWRldGFjaEJ1dHRvbl90ZXh0PURldGFjaAotZGlhZ3JhbV9zYXZlRXJyb3I9RXJyb3Igc2F2aW5nIGRpYWdyYW0KLWRvd25CdXR0b25fdGV4dD1Eb3duCi1kaXJlY3RvcnlfdGV4dD1EaXJlY3Rvcnk6Ci1vcmRlckJ1dHRvbl90ZXh0PU9yZGVyCi1lZGl0QnV0dG9uX3RleHQ9RWRpdC4uLgotcmVtb3ZlQnV0dG9uX3RleHQ9UmVtb3ZlCi1yZW5hbWVBY3Rpb25fdGV4dD1SZW4mYW1lLi4uCi1yZW1vdmVfdGV4dD1SZW1vdmUKLXJlbmFtZV90ZXh0PVJlbmFtZQotU2F2ZUFzX3RleHQ9U2F2ZSBBcwotc2VsZWN0QnV0dG9uX3RleHQ9U2VsZWN0Li4uCi1kZXNlbGVjdEJ1dHRvbl90ZXh0PURlc2VsZWN0Ci11cEJ1dHRvbl90ZXh0PVVwCi1tYWtlRGVmYXVsdEJ1dHRvbl90ZXh0PU1ha2UgRGVmYXVsdAotdmlld0hpc3RvcnlCdXR0b25fdGV4dD1WaWV3IEhpc3RvcnkuLi4KLQotIyBSb2xlIEVkaXRvciBUYXNrcyBQYWdlCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25OYW1lPVRhc2tzCi1yb2xlVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1UaGlzIHJvbGUgaXMgdGhlIHBlcmZvcm1lciBvZiB0aGUgZm9sbG93aW5nIHRhc2tzLgotcm9sZVRhc2tzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgdGFza3MKLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1QcmltYXJ5IHBlcmZvcm1lcjoKLXJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9QWRkaXRpb25hbCBwZXJmb3JtZXI6Ci1yb2xlVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHRhc2tzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBSb2xlIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UKLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVdvcmsgUHJvZHVjdHM6Ci1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249U3BlY2lmeSB3b3JrIHByb2R1Y3RzIHRoYXQgdGhpcyByb2xlIGlzIHJlc3BvbnNpYmxlIGZvci4KLXJvbGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSB3b3JrIHByb2R1Y3RzOgotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1SZXNwb25zaWJsZSBmb3I6Ci1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMj1Xb3JrIHByb2R1Y3RzIHRoYXQgYXJlIG91dHB1dCBvZiB0YXNrcyB0aGF0IHRoaXMgcm9sZSBwZXJmb3JtczoKLXJvbGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHdvcmsgcHJvZHVjdHMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFJvbGUgRWRpdG9yIEd1aWRhbmNlIFBhZ2UKLXJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU9R3VpZGFuY2UKLXJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgbGlua3MgdG8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybSBvZiBndWlkYW5jZS4KLXJvbGVHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIEd1aWRhbmNlOgotcm9sZUd1aWRhbmNlUGFnZV9zZWxlY3RlZExhYmVsPUd1aWRhbmNlOgotcm9sZUd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBndWlkYW5jZSBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgUm9sZSBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlCi1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9Q2F0ZWdvcmllczoKLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgcm9sZSBiZWxvbmdzLgotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPVJvbGUgU2V0czoKLXJvbGVDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9Q3VzdG9tIENhdGVnb3JpZXM6Ci1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Sb2xlIHNldHM6Ci1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9Q3VzdG9tIGNhdGVnb3JpZXM6Ci1yb2xlQ2F0ZWdvcmllc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gY2F0ZWdvcmllcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgVGFzayBFZGl0b3IgUm9sZXMgUGFnZQotdGFza1JvbGVzUGFnZV9zZWN0aW9uTmFtZT1Sb2xlcwotdGFza1JvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249QXNzaWduIHRoZSByb2xlcyB0byBwZXJmb3JtIHRoaXMgdGFzay4KLXRhc2tSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIHJvbGVzOgotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVByaW1hcnkgcGVyZm9ybWVyczoKLXRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9QWRkaXRpb25hbCBwZXJmb3JtZXJzOgotdGFza1JvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSByb2xlcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi10YXNrUm9sZXNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbW9kaWZ5X21lc3NhZ2U9SVVQQTAwMDQ1VzogRG8geW91IHdhbnQgdG8gY2hhbmdlIHRoZSBwcmltYXJ5IHBlcmZvcm1lciB0byAnJ3swfScnPwotdGFza1JvbGVzUGFnZV9jb25maXJtX3RpdGxlPUNvbmZpcm0gcHJpbWFyeSByb2xlIGNoYW5nZQotCi0jIFRhc2sgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9V29yayBQcm9kdWN0cwotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVNwZWNpZnkgdGhlIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cyBmb3IgdGhpcyB0YXNrLgotdGFza1dvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIFdvcmsgUHJvZHVjdHMKLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9TWFuZGF0b3J5IGlucHV0czoKLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyPU9wdGlvbmFsIGlucHV0czoKLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwzPU91dHB1dHM6Ci10YXNrV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSB3b3JrIHByb2R1Y3RzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBUYXNrIEVkaXRvciBHdWlkYW5jZSBQYWdlCi10YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPUd1aWRhbmNlCi10YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGxpbmtzIHRvIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm0gb2YgZ3VpZGFuY2UuCi10YXNrR3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSBHdWlkYW5jZToKLXRhc2tHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1HdWlkYW5jZToKLXRhc2tHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gZ3VpZGFuY2VzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBUYXNrIEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UKLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1DYXRlZ29yaWVzCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHRhc2sgYmVsb25ncy4KLXRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1EaXNjaXBsaW5lcwotdGFza0NhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1DdXN0b20gQ2F0ZWdvcmllcwotdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw9RGlzY2lwbGluZXM6Ci10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9Q3VzdG9tIGNhdGVnb3JpZXM6Ci10YXNrQ2F0ZWdvcmllc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gY2F0ZWdvcmllcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBUYXNrcyBQYWdlCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uTmFtZT1UYXNrcwotV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPVRoaXMgd29yayBwcm9kdWN0IGlzIGFuIGlucHV0IG9yIG91dHB1dCBmb3IgdGhlIGZvbGxvd2luZyB0YXNrcy4KLVdvcmtQcm9kdWN0X1Rhc2tzX0F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSB0YXNrcwotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbD1NYW5kYXRvcnkgaW5wdXQ6Ci1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMj1PcHRpb25hbCBpbnB1dDoKLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwzPU91dHB1dDoKLVdvcmtQcm9kdWN0X1Rhc2tzX011bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHRhc2tzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIFJvbGVzIFBhZ2UKLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25OYW1lPVJvbGVzCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249VGhlIGZvbGxvd2luZyByb2xlcyBhcmUgcmVzcG9uc2libGUgZm9yIG9yIG1vZGlmeSB0aGlzIHdvcmsgcHJvZHVjdC4KLXdvcmtQcm9kdWN0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSByb2xlcwotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1SZXNwb25zaWJsZSByb2xlOgotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9TW9kaWZ5aW5nIHJvbGVzOgotd29ya1Byb2R1Y3RSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gcm9sZXMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIyBXb3JrIFByb2R1Y3QgRWRpdG9yIERlbGl2ZXJhYmxlIFBhcnRzIFBhZ2UKLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbk5hbWU9RGVsaXZlcmFibGUgUGFydHMKLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVNwZWNpZnkgdGhlIHdvcmsgcHJvZHVjdHMgdGhhdCBjb25zdGl0dXRlIHRoaXMgZGVsaXZlcmFibGUuCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSB3b3JrIHByb2R1Y3RzIGFzIGRlbGl2ZXJhYmxlIHBhcnRzOgotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWxlY3RlZExhYmVsPVdvcmsgcHJvZHVjdHMgYXMgZGVsaXZlcmFibGUgcGFydHM6Ci13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHdvcmsgcHJvZHVjdHMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgR3VpZGFuY2UgUGFnZQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU9R3VpZGFuY2UKLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGxpbmtzIHRvIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm0gb2YgZ3VpZGFuY2UuCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgR3VpZGFuY2U6Ci13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWxlY3RlZExhYmVsPUd1aWRhbmNlOgotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gZ3VpZGFuY2VzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1DYXRlZ29yaWVzCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB3b3JrIHByb2R1Y3QgYmVsb25ncy4KLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw9RG9tYWlucwotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9V29yayBQcm9kdWN0IEtpbmRzOgotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDM9Q3VzdG9tIENhdGVnb3JpZXM6Ci13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw9RG9tYWluOgotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1Xb3JrIHByb2R1Y3Qga2luZHM6Ci13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwzPUN1c3RvbSBjYXRlZ29yaWVzOgotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBjYXRlZ29yaWVzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBQcmFjdGljZSBFZGl0b3IgUmVmZXJlbmNlcyBQYWdlCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25OYW1lPUNvbnRlbnQgRWxlbWVudHMKLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVNwZWNpZnkgdGhlIGNvbnRlbnQgZWxlbWVudHMgcmVmZXJlbmNlZCBieSB0aGlzIHByYWN0aWNlLgotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgY29udGVudCBlbGVtZW50czoKLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Db250ZW50IGVsZW1lbnRzOgotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBDb250ZW50IGVsZW1lbnRzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBDYXRlZ29yeSBFZGl0b3IgR3VpZGFuY2UgUGFnZQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlY3Rpb25OYW1lPUd1aWRhbmNlCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgezB9LgotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSBndWlkYW5jZToKLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWxlY3RlZExhYmVsPUd1aWRhbmNlOgotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGd1aWRhbmNlcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgRGlzY2lwbGluZSBHcm91cGluZyBFZGl0b3IgRGlzY2lwbGluZXMgUGFnZQotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlY3Rpb25OYW1lPURpc2NpcGxpbmVzCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZGlzY2lwbGluZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyBkaXNjaXBsaW5lIGdyb3VwaW5nLgotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSBEaXNjaXBsaW5lczoKLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWxlY3RlZExhYmVsPURpc2NpcGxpbmVzOgotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IERpc2NpcGxpbmVzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfVXNlRGVmYXVsdERpcmVjdG9yeUJ1dHRvbkxhYmVsPVVzZSBkZWZhdWx0IGRpcmVjdG9yeQotCi0jIERpc2NpcGxpbmUgRWRpdG9yIFRhc2tzIFBhZ2UKLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbk5hbWU9VGFza3MKLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgdGFza3MgdGhhdCBiZWxvbmcgdG8gdGhpcyBkaXNjaXBsaW5lLgotZGlzY2lwbGluZVRhc2tzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgdGFza3M6Ci1kaXNjaXBsaW5lVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw9VGFza3M6Ci1kaXNjaXBsaW5lVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHRhc2tzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBEaXNjaXBsaW5lIEVkaXRvciBSZWZlcmVuY2UgV29ya2Zsb3cgUGFnZQotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWN0aW9uTmFtZT1SZWZlcmVuY2UgV29ya2Zsb3dzCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIHJlZmVyZW5jZSB3b3JrZmxvd3MgdGhhdCBiZWxvbmcgdG8gdGhpcyBkaXNjaXBsaW5lLgotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgUmVmZXJlbmNlIFdvcmtmbG93czoKLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VsZWN0ZWRMYWJlbD1SZWZlcmVuY2Ugd29ya2Zsb3dzOgotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBSZWZlcmVuY2Ugd29ya2Zsb3dzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBEb21haW4gRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Xb3JrIFByb2R1Y3RzCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIHdvcmsgcHJvZHVjdHMgdGhhdCBiZWxvbmcgdG8gdGhpcyBkb21haW4uCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSB3b3JrIHByb2R1Y3RzOgotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVdvcmsgcHJvZHVjdHM6Ci1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHdvcmsgcHJvZHVjdHMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFdvcmsgUHJvZHVjdCBLaW5kIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UKLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9V29yayBQcm9kdWN0cwotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSB3b3JrIHByb2R1Y3RzIHRoYXQgYmVsb25nIHRvIHRoaXMgd29yayBwcm9kdWN0IGtpbmQuCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSB3b3JrIHByb2R1Y3RzOgotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVdvcmsgcHJvZHVjdHM6Ci13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHdvcmsgcHJvZHVjdHMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFJvbGUgU2V0IEdyb3VwaW5nIEVkaXRvciBSb2xlIFNldHMgUGFnZQotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25OYW1lPVJvbGUgU2V0cwotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIHJvbGUgc2V0cyB0aGF0IGJlbG9uZyB0byB0aGlzIHJvbGUgc2V0IGdyb3VwaW5nLgotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSBSb2xlIFNldHM6Ci1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Sb2xlIHNldHM6Ci1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gUm9sZSBTZXRzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBSb2xlIFNldCBFZGl0b3IgUm9sZXMgUGFnZQotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uTmFtZT1Sb2xlcwotcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSByb2xlcyB0aGF0IGJlbG9uZyB0byB0aGlzIHJvbGUgc2V0Lgotcm9sZVNldFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgcm9sZXM6Ci1yb2xlU2V0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9Um9sZXM6Ci1yb2xlU2V0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHJvbGVzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBUb29sIEVkaXRvciBUb29sIE1lbnRvcnMgUGFnZQotdG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uTmFtZT1Ub29sIE1lbnRvcnMKLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgdG9vbCBtZW50b3JzIHRoYXQgYmVsb25nIHRvIHRoaXMgdG9vbC4KLXRvb2xUb29sTWVudG9yc1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIHRvb2wgbWVudG9yczoKLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Ub29sIG1lbnRvcnM6Ci10b29sVG9vbE1lbnRvcnNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IFRvb2wgTWVudG9ycyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgQ3VzdG9tIENhdGVnb3J5IEVkaXRvciBBc3NpZ24gUGFnZQotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25OYW1lPUNvbnRlbnQgRWxlbWVudHMKLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSBjb250ZW50IGVsZW1lbnRzIHRoYXQgY29uc3RpdHV0ZSB0aGlzIGN1c3RvbSBjYXRlZ29yeS4KLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgQ29udGVudCBFbGVtZW50czoKLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWxlY3RlZExhYmVsPUNvbnRlbnQgZWxlbWVudHM6Ci1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gQ29udGVudCBFbGVtZW50cyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgTmV3IE1ldGhvZCBQbHVnLWluIFdpemFyZAotbmV3UGx1Z2luV2l6YXJkX3RpdGxlPU5ldyBNZXRob2QgUGx1Zy1pbgotbmV3UGx1Z2luV2l6YXJkUGFnZV90aXRsZT1DcmVhdGUgYSBuZXcgbWV0aG9kIHBsdWctaW4KLW5ld1BsdWdpbldpemFyZFBhZ2VfdGV4dD1TcGVjaWZ5IGEgbmFtZSBhbmQgcHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuZXcgbWV0aG9kIHBsdWctaW4uCi1uZXdQbHVnaW5FcnJvcl9tc2c9SVVQQTAwMjFFOiBGYWlsZWQgdG8gY3JlYXRlIHRoZSBtZXRob2QgcGx1Zy1pbi4KLW5ld1BsdWdpbkVycm9yX3JlYXNvbj1JbnRlcm5hbCBlcnJvci5cblxuQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotIyBQcmVmZXJlbmNlIFBhZ2VzCi1tZXRob2RMaWJyYXJ5R3JvdXBfdGV4dD1NZXRob2QgbGlicmFyeQotZGVmYXVsdFBhdGhMYWJlbF90ZXh0PURlZmF1bHQgcGF0aDoKLW1vZGVsaW5nR3JvdXBfdGV4dD1Nb2RlbGluZwotdXNlckludGVyZmFjZUdyb3VwX3RleHQ9VXNlciBpbnRlcmZhY2UKLWRlYnVnR3JvdXBfdGV4dD1EZWJ1ZwotZW5hYmxlTGlicmFyeVZhbGlkYXRpb25DaGVja2JveF90ZXh0PUVuYWJsZSBtZXRob2QgbGlicmFyeSB2YWxpZGF0aW9uCi1pbnZhbGlkUHJlZmVyZW5jZUhpc3RvcnlTaXplRXJyb3JfbXNnPVByZWZlcmVuY2UgaGlzdG9yeSBzaXplIG11c3QgYmUgYW4gaW50ZWdlciB3aXRoIHZhbHVlIHJhbmdpbmcgZnJvbSB7MH0gdG8gezF9LgotCi0jIEdlbmVyaWMgZGlhbG9nIHRpdGxlcwotY3JlYXRlRGlhbG9nX3RpdGxlPUNyZWF0ZSBFbGVtZW50Ci1kZWxldGVEaWFsb2dfdGl0bGU9RGVsZXRlIEVsZW1lbnQKLWVkaXREaWFsb2dfdGl0bGU9RWRpdCBFbGVtZW50Ci1lcnJvckRpYWxvZ190aXRsZT1FcnJvcgotbW92ZURpYWxvZ190aXRsZT1Nb3ZlIEVsZW1lbnQKLXJlbmFtZURpYWxvZ190aXRsZT1SZW5hbWUgRWxlbWVudAotd2FybmluZ0RpYWxvZ190aXRsZT1XYXJuaW5nCi0KLSMgQWRkIENvbmZpZ3VyYXRpb24gdG8gUHJvY2VzcyBFcnJvciBEaWFsb2cKLWFkZENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPUFkZCBDb25maWd1cmF0aW9uIHRvIFByb2Nlc3MKLQotIyBTZXQgRGVmYXVsdCBDb25maWd1cmF0aW9uIEVycm9yIERpYWxvZwotc2V0RGVmYXVsdENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPVNldCBEZWZhdWx0IENvbmZpZ3VyYXRpb24gZm9yIFByb2Nlc3MKLQotIyBFZGl0IFByb2Nlc3MgRXJyb3IgRGlhbG9nCi1lZGl0UHJvY2Vzc0VsZW1lbnRFcnJvckRpYWxvZ190aXRsZT1FZGl0IFByb2Nlc3MgRWxlbWVudAotCi0jIE9wZW4gTGlicmFyeSBEaWFsb2cKLW9wZW5MaWJyYXJ5RGlhbG9nX3RpdGxlPU9wZW4gTWV0aG9kIExpYnJhcnkKLW9wZW5MaWJyYXJ5RGlhbG9nX3RleHQ9VGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgd2FzIG5vdCBzYXZlZCBwcm9wZXJseS4gRG8geW91IHdhbnQgdG8gaWdub3JlIHRoZSBlcnJvciBhbmQgcHJvY2VlZCB0byBvcGVuIGFub3RoZXIgbGlicmFyeT8KLQotIyBTYXZlIExpYnJhcnkgRGlhbG9nCi1zYXZlTGlicmFyeURpYWxvZ190aXRsZT1TYXZlIE1ldGhvZCBMaWJyYXJ5Ci1zYXZlTGlicmFyeURpYWxvZ190ZXh0PVRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IGhhcyBiZWVuIG1vZGlmaWVkLiBEbyB5b3Ugd2FudCB0byBzYXZlIHRoZSBjaGFuZ2VzPwotCi0jIFVwZ3JhZGUgTGlicmFyeSBEaWFsb2cKLXVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlPVVwZ3JhZGUgTWV0aG9kIExpYnJhcnkKLQotIyBEZWxldGUgRWxlbWVudCBSZWZlcmVuY2UgRGlhbG9nCi1kZWxldGVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0PVRoZSBlbGVtZW50ICcnezB9JycgaGFzIGFscmVhZHkgYmVlbiBkZWxldGVkLiBEbyB5b3Ugd2FudCB0byByZW1vdmUgaXQgZnJvbSAnJ3sxfScnPwotCi0jIEVycm9yIE1lc3NhZ2VzCi1ub09wZW5MaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDAwRTogTm8gb3BlbiBtZXRob2QgbGlicmFyeS5cblxuQSBtZXRob2QgbGlicmFyeSBtdXN0IGJlIG9wZW5lZCBiZWZvcmUgYSBuZXcgbWV0aG9kIGVsZW1lbnQgY2FuIGJlIGFkZGVkLlxuXG5DcmVhdGUgYSBuZXcgbWV0aG9kIGxpYnJhcnkgb3Igb3BlbiBhbiBleGlzdGluZyBvbmUgYW5kIHRyeSBhZ2Fpbi4KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDFFOiBUaGUgezB9IG5hbWUgaXMgbWlzc2luZy5cblxuQWxsIG1ldGhvZCBhbmQgcHJvY2VzcyBlbGVtZW50cyBtdXN0IGhhdmUgYSBuYW1lLlxuXG5DbGljayBPSyBhbmQgZW50ZXIgYSB2YWxpZCBuYW1lIGZvciB0aGUgZWxlbWVudC4KLWR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEEwMDAyRTogVGhlIG5hbWUgJyd7MH0nJyBhbHJlYWR5IGV4aXN0cy5cblxuQSBtZXRob2QgZWxlbWVudCBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZS5cblxuQ2xpY2sgT0sgYW5kIGVudGVyIGEgZGlmZmVyZW50IG5hbWUgZm9yIHRoZSBlbGVtZW50LgotY3JlYXRlQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDAzRTogVGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSBjcmVhdGVkLgotZGVsZXRlQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDA0VzogVGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSBkZWxldGVkLgotaW50ZXJuYWxFcnJvcl9tc2c9SVVQQTAwMDVFOiBBbiBpbnRlcm5hbCBlcnJvciBoYXMgb2NjdXJyZWQuXG5cbkNsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1pbnZhbGlkUHJlc2VudGF0aW9uTmFtZUVycm9yX21zZz1JVVBBMDAwNkU6IFRoZSBzcGVjaWZpZWQgcHJlc2VudGF0aW9uIG5hbWUgaXMgaW52YWxpZC5cblxuQ2xpY2sgT0sgYW5kIGVudGVyIGEgZGlmZmVyZW50IG5hbWUuCi1pbnZhbGlkQ29uZmlnRXJyb3JfbXNnPUlVUEEwMDA3RTogVGhlIHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uICcnezB9JycgaXMgbm90IGEgc3Vic2V0IG9mIHRoZSBwcm9jZXNzJydzIGRlZmF1bHQgY29uZmlndXJhdGlvbi5cblxuSW4gb3JkZXIgdG8gbWFpbnRhaW4gdGhlIGludGVncml0eSBvZiBhIHByb2Nlc3MsIGl0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gbXVzdCBiZSBhIHN1cGVyc2V0IG9mIGFsbCBvdGhlciBjb25maWd1cmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2Nlc3MuXG5cblNlbGVjdCBhbm90aGVyIGNvbmZpZ3VyYXRpb24gb3IgbW9kaWZ5IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gdG8gaW5jbHVkZSB0aGUgY29udGVudCBvZiB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBhbmQgdHJ5IGFnYWluLgotc2V0RGVmYXVsdENvbmZpZ0Vycm9yX21zZz1JVVBBMDAwOEU6IFRoZSBzZWxlY3RlZCBtZXRob2QgY29uZmlndXJhdGlvbiAnJ3swfScnIGlzIG5vdCBhIHN1cGVyc2V0IG9mIHRoZSBvdGhlciBjb25maWd1cmF0aW9ucyByZWZlcmVuY2VkIGJ5IHRoZSBwcm9jZXNzLlxuXG5JbiBvcmRlciB0byBtYWludGFpbiB0aGUgaW50ZWdyaXR5IG9mIGEgcHJvY2VzcywgaXRzIGRlZmF1bHQgY29uZmlndXJhdGlvbiBtdXN0IGJlIGEgc3VwZXJzZXQgb2YgYWxsIG90aGVyIGNvbmZpZ3VyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvY2Vzcy5cblxuU2VsZWN0IGFub3RoZXIgY29uZmlndXJhdGlvbiBvciBtb2RpZnkgdGhlIGNvbnRlbnQgb2YgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gYW5kIHRyeSBhZ2Fpbi4KLW9wZW5MaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDA5RTogVGhlIG1ldGhvZCBsaWJyYXJ5IGNhbm5vdCBiZSBsb2FkZWQuXG5cbkNsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1zYXZlTGlicmFyeUVycm9yX21zZz1JVVBBMDAxMEU6IFRoZSBtZXRob2QgbGlicmFyeSBjYW5ub3QgYmUgc2F2ZWQuCi1zYXZlTGlicmFyeVRvRXJyb3JfbXNnPUlVUEEwMDEwRTogVGhlIG1ldGhvZCBsaWJyYXJ5IGNhbm5vdCBiZSBzYXZlZCB0byAnJ3swfScnLgotZWxlbWVudEFscmVhZHlEZWxldGVkRXJyb3JfbXNnPUlVUEEwMDExRTogVGhlIGVsZW1lbnQgJyd7MH0nJyBoYXMgYWxyZWFkeSBiZWVuIGRlbGV0ZWQuCi11cGdyYWRlTGlicmFyeUVycm9yX21zZz1JVVBBMDAxMkU6IFRoZSBtZXRob2QgbGlicmFyeSBjYW5ub3QgYmUgdXBncmFkZWQuCi1vcGVuQ29uZmlnV2l6YXJkRXJyb3JfbXNnPUlVUEEwMDE2RTogVGhlIE5ldyBNZXRob2QgQ29uZmlndXJhdGlvbiB3aXphcmQgY2Fubm90IGJlIG9wZW5lZC4KLQotIyBFcnJvciBSZWFzb25zCi1lcnJvcl9yZWFzb249QW4gZXJyb3IgaGFzIG9jY3VycmVkLlxuXG5DbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotaW50ZXJuYWxFcnJvcl9yZWFzb249QW4gaW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkLlxuXG5DbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotdXBncmFkZUxpYnJhcnlFcnJvcl9yZWFzb249SVVQQTAwMThFOiBBbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hpbGUgbG9hZGluZyB0aGUgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuXG5cbkNsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1zYXZlVXBncmFkZWRMaWJyYXJ5RXJyb3JfcmVhc29uPUlVUEEwMDE5RTogQW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoaWxlIHNhdmluZyB0aGUgdXBncmFkZWQgbWV0aG9kIGxpYnJhcnkuXG5cbkNsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLWNvbmZpZ3VyYXRpb25QYWdlX1F1aWNrZml4RXJyb3JfcmVhc29uMT1JVVBBMDAyMFc6VW5hYmxlIHRvIGZpeCB0aGUgcHJvYmxlbSBmb3IgZWxlbWVudCAnJ3swfScnIHNpbmNlIGl0IGlzIGluIGEgc3VidHJhY3RlZCBjYXRlZ29yeS4gXG5cbiBZb3UgbmVlZCB0byBtYW51YWxseSByZW1vdmUgdGhlIGVsZW1lbnQgZnJvbSB0aGUgc3VidHJhY3RlZCBjYXRlZ29yeS4KLWNvbmZpZ3VyYXRpb25QYWdlX3F1aWNrZml4RXJyb3JfdGl0bGU9UXVpY2sgRml4Ci0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMKLW9wZW5pbmdMaWJyYXJ5VGFza19uYW1lPU9wZW5pbmcgbWV0aG9kIGxpYnJhcnkuLi4KLXNhdmluZ0xpYnJhcnlUYXNrX25hbWU9U2F2aW5nIG1ldGhvZCBsaWJyYXJ5IC4uLgotdXBncmFkaW5nTGlicmFyeVRhc2tfbmFtZT1VcGdyYWRpbmcgbWV0aG9kIGxpYnJhcnkuLi4KLWxvYWRpbmdMaWJyYXJ5RWxlbWVudHNUYXNrX25hbWU9TG9hZGluZyBtZXRob2QgbGlicmFyeSBlbGVtZW50cy4uLgotc2F2aW5nVXBncmFkZWRFbGVtZW50c1Rhc2tfbmFtZT1TYXZpbmcgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMgaW4gbmV3IGZpbGUgZm9ybWF0Li4uCi1zYXZpbmdUYXNrX25hbWU9U2F2aW5nICcnezB9JycuLi4KLXNhdmluZ0ZpbGVzVGFza19uYW1lPVNhdmluZyBmaWxlcy4uLgotZml4aW5nQ29udGVudERlc2NyaXB0aW9uR1VJRHNUYXNrX25hbWU9Rml4aW5nIGNvbnRlbnQgZGVzY3JpcHRpb24gR1VJRHMuLi4KLWRlbGV0aW5nSW52YWxpZFJlZmVyZW5jZXNUYXNrX25hbWU9RGVsZXRpbmcgaW52YWxpZCByZWZlcmVuY2VzLi4uCi0KLQotIyBBZGQgRWRpdG9yIFRvIEJyb3dzaW5nIFBlcnNwZWN0aXZlIFdhcm5pbmcgRGlhbG9nCi1hZGRFZGl0b3JUb1BlcnNwZWN0aXZlV2FybmluZ19tc2c9SVVQQTAwNDZXOiBUaGlzIHBlcnNwZWN0aXZlIGhhcyBiZWVuIHNwZWNpYWxseSBkZXNpZ25lZCB0byBtYXhpbWl6ZSB5b3VyIHVzZXIgZXhwZXJpZW5jZSBvZiBicm93c2luZyB0aGUgSFRNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuIE5vIGVkaXRvciBjYW4gYmUgYWRkZWQgb3IgZGlzcGxheWVkIGhlcmUuCi0KLSMgQ2hhbmdlIEhpc3RvcnkgRGlhbG9nCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX3RpdGxlPUNoYW5nZSBEZXNjcmlwdGlvbiBIaXN0b3J5Ci1DaGFuZ2VIaXN0b3J5RGlhbG9nX2xhYmVsPUNoYW5nZSBoaXN0b3J5OgotCi0jIE1ldGhvZCBFbGVtZW50IERlbGV0ZSBBY3Rpb24KLWNvbmZpcm1EZWxldGVEaWFsb2dfdGl0bGU9Q29uZmlybSBEZWxldGlvbgotY29uZmlybURlbGV0ZURpYWxvZ19tc2c9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAnJ3swfScnPwotY29uZmlybURlbGV0ZURpYWxvZ19tc2dXaXRoUmVmZXJlbmNlPUFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgJyd7MH0nJz9cblxuVGhlIGZvbGxvd2luZyBlbGVtZW50KHMpIGNvbnRhaW4gcmVmZXJlbmNlcyB0byB0aGUgaXRlbShzKSB0byBiZSBkZWxldGVkOiB7MX0KLQotIyBOZXcgTGlicmFyeSBEaWFsb2cKLWVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjJFOiBUaGUgIG1ldGhvZCBsaWJyYXJ5ICcnezB9JycgY2Fubm90IGJlIGNyZWF0ZWQuCi1lcnJvckRpYWxvZ19lcnJvcj1DYW5ub3QgY3JlYXRlIGEgbWV0aG9kIGxpYnJhcnkgd2l0aGluIGFub3RoZXIgbWV0aG9kIGxpYnJhcnkuCi1lcnJfbm9vcGVubGlicmFyeT1JVVBBMDA0MEU6IE5vIG9wZW4gbWV0aG9kIGxpYnJhcnkuXG5cbkEgbWV0aG9kIGxpYnJhcnkgbXVzdCBiZSBvcGVuZWQgYmVmb3JlIGEgbmV3IG1ldGhvZCBwbHVnLWluIGNhbiBiZSBhZGRlZC5cblxuQ3JlYXRlIGEgbmV3IG1ldGhvZCBsaWJyYXJ5IG9yIG9wZW4gYW4gZXhpc3Rpbmcgb25lIGFuZCB0cnkgYWdhaW4uCi1lcnJfbG9hZGluZ2xpYnJhcnk9RXJyb3IgbG9hZGluZyBsaWJyYXJ5Ci1tc2dfcmVsb2FkTGlicmFyeT1FcnJvciB1bmRvaW5nIHRoZSBmYWlsZWQgZGVsZXRpb24uIFRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IG5lZWRzIHRvIGJlIHJlbG9hZGVkLgotCi0jIFJlbG9hZCBMaWJyYXJ5IERpYWxvZwotcmVsb2FkRGlhbG9nX21lc3NhZ2U9VGhlIGxpYnJhcnkgbmVlZHMgdG8gYmUgcmVsb2FkZWQgdG8gcmVzdG9yZSBpdHMgb3JpZ2luYWwgc3RhdGUuCi1yZWxvYWREaWFsb2dfdGl0bGU9UmVsb2FkIExpYnJhcnkKLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvclRpdGxlPU1vdmUgRXJyb3IKLWRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvck1lc3NhZ2U9RXJyb3IgZHVyaW5nIG1vdmUKLQotIyBQcm9jZXNzIEZvcm0gRWRpdG9yCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU9U2F2ZQotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UxPVRoaXMgY2hhbmdlIHdpbGwgYWZmZWN0IGFsbCBkaWFncmFtcyBpbiB5b3VyIHByb2Nlc3MuIFRoZSBlZGl0b3Igd2lsbCBiZSBzYXZlZCBhZnRlciB5b3VyIGNoYW5nZS4gRG8geW91IHdhbnQgdG8gY29udGludWU/Ci1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTI9VGhlIGVkaXRvciB3aWxsIGJlIHNhdmVkIGFmdGVyIHlvdXIgY2hhbmdlLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLQotIyBDb25maWd1cmF0aW9uIFZpZXcgUGFnZQotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX3RpdGxlPUNvbmZpcm0gUmVtb3ZpbmcKLWNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ19tZXNzYWdlPUFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmUgdmlldyAnJ3swfScnPwotY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX3RpdGxlPVdhcm5pbmcKLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb249Q29uZmlndXJhdGlvbjoKLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3cz1Db25maWd1cmF0aW9uIFZpZXdzCi1jb25maWdWaWV3UGFnZV92aWV3cz1WaWV3cwotY29sdW1uc2VsZWN0aW9uX3RleHQ9Q29sdW1uIHNlbGVjdGlvbjoKLWNvbmZpZ1ZpZXdQYWdlX2FkZFZpZXdCdXR0b25UZXh0PUFkZCBWaWV3Li4uCi1jb25maWdWaWV3UGFnZV9yZW1vdmVWaWV3QnV0dG9uVGV4dD1SZW1vdmUgVmlldwotY29uZmlnVmlld1BhZ2VfbWFrZURlZmF1bHRCdXR0b25UZXh0PU1ha2UgRGVmYXVsdAotY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNXOiBWaWV3IHdpdGggbmFtZSAnJ3swfScnIGFscmVhZHkgZXhpc3RzLgotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdTZWN0aW9uVGl0bGU9UHVibGlzaGVkIE5hdmlnYXRpb24gVmlld3MKLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvbk1lc3NhZ2U9U3BlY2lmeSB0aGUgdmlld3MgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIHdoZW4gdGhpcyBjb25maWd1cmF0aW9uIGlzIHB1Ymxpc2hlZC4gVG8gY3JlYXRlIGEgdmlldywgY2xpY2sgQWRkIFZpZXcgdG8gc2VsZWN0IGFueSBzdGFuZGFyZCBvciBjdXN0b20gY2F0ZWdvcnkgd2l0aGluIHRoZSBjb25maWd1cmF0aW9uLiAgVGhlIHNlbGVjdGVkIGNhdGVnb3J5IHdpbGwgcmVwcmVzZW50IHRoZSB2aWV3IGFuZCB0aGUgY2F0ZWdvcnkncyBzdWItY2F0ZWdvcmllcyBhbmQgY29udGVudCBlbGVtZW50cyB3aWxsIHJlcHJlc2VudCB0aGUgdmlldydzIHRyZWUgZWxlbWVudHMuCi0KLSMgRGVzY3JpcHRpb24gVGFiCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ190aXRsZT1Db252ZXJ0IEd1aWRhbmNlCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMT1JVVBBMDA0MFc6ICBQbGVhc2Ugc2F2ZSB0aGUgZWRpdG9yIGZpcnN0LgotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfbWVzc2FnZTI9VGhlcmUgYXJlIG5vIGNvbXBhdGlibGUgZ3VpZGFuY2UgZm9yIHRoaXMgdHlwZS4KLQotY2hhbmdlQWN0aXZpdHlUeXBlV2FybmluZ0RpYWxvZ190aXRsZT1Db252ZXJ0IEFjdGl2aXR5Ci0jIEFzc29jaWF0aW9uIEZvcm0gUGFnZQotQXNzb2NpYXRpb25Gb3JtUGFnZV9CcmllZkRlc2NyaXB0aW9uTGFiZWw9QnJpZWYgZGVzY3JpcHRpb24gb2Ygc2VsZWN0ZWQgZWxlbWVudDoKLQotIyBNZXRob2QgRWxlbWVudCBEZXNjcmlwdGlvbgotbWV0aG9kRWxlbWVudERlc2NyaXB0aW9uRW1wdHlOYW1lRGlhbG9nX3RpdGxlPUVudGVyIEVsZW1lbnQgTmFtZQotbWV0aG9kRWxlbWVudERlc2NyaXB0aW9uRW1wdHlOYW1lRGlhbG9nX21lc3NhZ2U9VGhlIG5hbWUgZmllbGQgY2Fubm90IGJlIGVtcHR5LgotCi0jIE1ldGhvZCBQbHVnLWluIERlc2NyaXB0aW9uCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblJlbW92ZVJlZkNvbmZpcm1fbWVzc2FnZT1EZXNlbGVjdGluZyB0aGUgcmVmZXJlbmNlZCBwbHVnLWluKHMpIGFzc29jaWF0ZWQgd2l0aCBwbHVnLWluICcnezB9Jycgd2lsbCBwcm9kdWNlIGludmFsaWQgcmVsYXRpb25zaGlwcyB0aGF0IHdpbGwgYmUgZGVsZXRlZC5cblxuVGhpcyBhY3Rpb24gY2Fubm90IGJlIHVuZG9uZS4gRG8geW91IHdhbnQgdG8gcHJvY2VlZCB3aXRoIHRoaXMgY2hhbmdlPwotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWU9WW91IGFyZSBhYm91dCB0byBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBtZXRob2QgcGx1Zy1pbiBmcm9tICcnezB9JycgdG8gJyd7MX0nJy4gVGhpcyBhY3Rpb24gd2lsbCBzYXZlIGFuZCBjbG9zZSBhbnkgb3BlbiBlZGl0b3JzIG9mIGVsZW1lbnRzIGJlbG9uZ2luZyB0byB0aGlzIHBsdWctaW4gYW5kIHJlbmFtZSB0aGUgcGx1Zy1pbiBmb2xkZXIgdG8gdGhlIG5ldyBuYW1lLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jb25maXJtUmVuYW1lX3RpdGxlPVJlbmFtZSBNZXRob2QgUGx1Zy1pbgotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2Nhbm5vdFJlbmFtZVBsdWdpbkZvbGRlcj1Db3VsZCBub3QgcmVuYW1lIHBsdWctaW4gZm9sZGVyIHRvIG5ldyBuYW1lCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbkxhYmVsPUxvY2sgcGx1Zy1pbgotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5fbWVzc2FnZT1DaGFuZ2luZyB0aGUgbG9jayBzdGF0ZSBvZiB0aGlzIHBsdWctaW4gJyd7MH0nJyB3aWxsIHNhdmUgYW5kIGNsb3NlIGFueSBvcGVuIGVkaXRvcnMgb2YgZWxlbWVudHMgYmVsb25naW5nIHRvIGl0LiBEbyB5b3Ugd2FudCBwcm9jZWVkIHdpdGggdGhpcyBjaGFuZ2U/Ci0KLSMgUHJvY2VzcyBEZXNjcmlwdGlvbgotcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fdGl0bGU9UmVuYW1lCi1wcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV9tZXNzYWdlPVlvdSBhcmUgYWJvdXQgdG8gY2hhbmdlIHRoZSBuYW1lIG9mIHRoaXMgcHJvY2Vzcy4gVGhpcyB3aWxsIHNhdmUgdGhpcyBlZGl0b3IgYW5kIHJlbmFtZSB0aGUgcHJvY2VzcyBmb2xkZXIgdG8gdGhlIG5ldyBuYW1lLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uRGVzY3JpcHRpb249RGVzY3JpcHRpb246Ci1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25UaXRsZT1Db25maWd1cmF0aW9uCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25NZXNzYWdlPVNwZWNpZnkgYWxsIHRoZSBjb25maWd1cmF0aW9ucyB2YWxpZCBmb3IgdGhpcyBwcm9jZXNzLiBTZWxlY3Qgb25lIGNvbmZpZ3VyYXRpb24gYXMgdGhlIGRlZmF1bHQgYW5kIGl0IG5lZWRzIHRvIGJlIGEgc3VwZXItc2V0IG9mIGFsbCB0aGUgb3RoZXIgY29uZmlndXJhdGlvbnMuCi1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbnM9Q29uZmlndXJhdGlvbnM6Ci1wcm9jZXNzRGVzY3JpcHRpb25fZGVmYXVsdD0oZGVmYXVsdCkKLVByb2Nlc3NEZXNjcmlwdGlvbl9zZWxlY3RDb25maWd1cmF0aW9uPVNlbGVjdCB0aGUgY29uZmlndXJhdGlvbnMgdG8gYWRkCi1Qcm9jZXNzRGVsZXRlQWN0aW9uX2RlbGV0ZWNvZmlybV90ZXh0MD1UaGlzIHdpbGwgc2F2ZSB0aGUgY3VycmVudCBlZGl0b3IgYW5kIHRoZSBjaGFuZ2Ugd2lsbCBiZSBwZXJtYW5lbnQuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgJyd7MH0nJz8KLVByb2Nlc3NEZWxldGVBY3Rpb25fc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZT1UaGUgZm9sbG93aW5nIGRlc2NyaXB0b3JzIGFyZSBub3QgdXNlZCBhbnl3aGVyZSBhZnRlciBkZWxldGlvbiBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHMuXG5TZWxlY3QgZGVzY3JpcHRvcnMgeW91IHdhbnQgdG8gZGVsZXRlLgotCi0jIFZpZXcgSGVscGVyCi12aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfdGl0bGU9TGlicmFyeSBIZWFsdGggQ2hlY2sKLXZpZXdIZWxwZXJfcGVyZm9ybUhlYWx0aENoZWNrPVBlcmZvcm1pbmcgaGVhbHRoIGNoZWNrIG9uIGxpYnJhcnkuLi4KLXZpZXdIZWxwZXJIZWFsdGhDaGVja0RpYWxvZ19tZXNzYWdlPVRoZSBoZWFsdGggY2hlY2sgb24gb3BlbiBsaWJyYXJ5IGlzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuIFNlZSB0aGUgcmVwb3J0IGluIHRoZSBsb2cgZmlsZS4KLQotIyBBdHRhY2ggR3VpZGFuY2UgRmlsZSBEaWFsb2cKLWF0dGFjaEd1aWRhbmNlRmlsZURpYWxvZ190aXRsZT1BdHRhY2ggRmlsZQotCi0jIENyZWF0ZSBFbGVtZW50IEVycm9yIERpYWxvZwotY3JlYXRlRWxlbWVudERpYWxvZ190aXRsZT1DcmVhdGUgTmV3IHswfQotY3JlYXRlTmV3RWxlbWVudEVycm9yX21zZz1FcnJvciBjcmVhdGluZyBuZXcgezB9LgotCi1kbGdUaXRsZV9yZWxvYWRMaWJyYXJ5PVJlbG9hZCBMaWJyYXJ5Ci1jcmVhdGVFbGVtZW50RXJyb3JfcmVhc29uPVRoZSB7MH0gbmFtZSBjYW5ub3QgYmUgZW1wdHkuXG5cblNwZWNpZnkgYSB2YWxpZCBuYW1lIGFuZCB0cnkgYWdhaW4uCi1kZWxldGVDb25maWdFcnJvcl9yZWFzb249VGhlIGNvbmZpZ3VyYXRpb24gaXMgcmVmZXJlbmNlZCBieSBwcm9jZXNzICcnezB9JycKLQotIyBDaGFuZ2VCb3VuZHNDb21tYW5kCi1nZWZfY2hhbmdlQm91bmRzQ29tbWFuZF9sYWJlbD1DaGFuZ2UgQm91bmRzCi0jIENoYW5nZU5hbWVDb21tYW5kCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfbGFiZWw9Q2hhbmdlIE5hbWUKLWdlZl9jaGFuZ2VOYW1lQ29tbWFuZF91bmRvTWVzc2FnZT1DYW5ub3QgdW5kbyB0aGUgbmFtZSBjaGFuZ2UuXG5cblVuZG8gbmFtZSBjaGFuZ2UgaXMgbm90IGFsbG93ZWQgaWYgcHJldmlvdXMgbmFtZSBpcyBudWxsLgotIyBDaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZAotZ2VmX2NoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kX2xhYmVsPUNoYW5nZSBQcm9wZXJ0eSBWYWx1ZQotIyBDcmVhdGVCZW5kcG9pbnRDb21tYW5kCi1nZWZfY3JlYXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1DcmVhdGUgQmVuZHBvaW50Ci0jIENyZWF0ZUxpbmtDb21tYW5kCi1nZWZfY3JlYXRlTGlua0NvbW1hbmRfbGFiZWw9TGluayBDcmVhdGlvbgotIyBDcmVhdGVOb2RlQ29tbWFuZAotZ2VmX2NyZWF0ZU5vZGVDb21tYW5kX2xhYmVsPUNyZWF0ZSBOZXcgTm9kZQotIyBEZWxldGVCZW5kcG9pbnRDb21tYW5kCi1nZWZfZGVsZXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1EZWxldGUgQmVuZHBvaW50Ci0jIERlbGV0ZUNvbW1hbmQKLWdlZl9kZWxldGVDb21tYW5kX2xhYmVsPURlbGV0ZQotIyBEZWxldGVMaW5rQ29tbWFuZAotZ2VmX2RlbGV0ZUxpbmtDb21tYW5kX2xhYmVsPURlbGV0ZSBDb25uZWN0aW9uCi0jIE1vdmVCZW5kcG9pbnRDb21tYW5kCi1nZWZfbW92ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9TW92ZSBCZW5kcG9pbnQKLSMgUmVjb25uZWN0TGlua0NvbW1hbmQKLWdlZl9yZWNvbm5lY3RMaW5rQ29tbWFuZF9sYWJlbD1SZWNvbm5lY3QgTGluawotCi0jIFZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcgotZ2VmX3ZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ9VGhlIG5hbWUgY2Fubm90IGJlIGVtcHR5LiBQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIG5hbWUuCi0jIFZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyCi1nZWZfdmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXJfYnJpbmdEb3duUHJvbXB0PVRoZSBuYW1lIGNhbm5vdCBiZSBlbXB0eS4gUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBuYW1lLgotIyBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydAotZ2VmX3dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0X3ZhbGlkYXRlTWVzc2FnZT1UaGUgbmFtZSBjYW5ub3QgYmUgZW1wdHkuIFBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgbmFtZS4KLQotIyBFbGVtZW50c1ZpZXdEZWxldGVBY3Rpb24KLWFjdGlvbnNfRWxlbWVudHNWaWV3RGVsZXRlQWN0aW9uX21lc3NhZ2U9VGhlIGNvbmZpZ3VyYXRpb24gJyd7MH0nJyBjYW5ub3QgYmUgZGVsZXRlZCBzaW5jZSBpdCBpcyBzdGlsbCBpbiB1c2UgYnkgcHJvY2VzcyAnJ3sxfScnLgotCi0jIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcgotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JUaXRsZT1EZWxldGUgRXJyb3IKLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yTWVzc2FnZT1VbmhhbmRsZWQgZXhjZXB0aW9uCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclJlYXNvbj1TZWUgZGV0YWlscwotCi0jIE1ldGhvZEVsZW1lbnRFZGl0b3IKLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZT1TYXZlIEVycm9yCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTE9SVVQQTAwMjBFOiBFcnJvciBzYXZpbmcgZmlsZQotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UyPUNvbW1pdCBFcnJvcgotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjE9U2VlIGxvZyBmaWxlIGZvciBtb3JlIGRldGFpbHMKLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24yPVNlZSBkZXRhaWxzCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JUaXRsZT1SZW5hbWUgRXJyb3IKLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9pbnZhbGlkRWRpdG9yTXNnPU9uZSBvciBtYW55IGZpbGVzIG9mIHRoaXMgZWRpdG9yIGhhdmUgYmVlbiByZW1vdmVkLiBUaGUgZWRpdG9yIGlzIG5vIGxvbmdlciB2YWxpZCBhbmQgaGFzIHRvIGNsb3NlLgotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JUaXRsZT1JbnZhbGlkIEVkaXRvcgotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yTWVzc2FnZTE9RXJyb3IgcmVuYW1pbmcgZmlsZShzKSAnJ3swfScnCi0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQotcmVuYW1lRXJyb3JfdGl0bGU9UmVuYW1lIEVsZW1lbnQKLXJlbmFtZUVycm9yX21zZz1JVVBBMDAxM0U6IFRoZSByZW5hbWUgb3BlcmF0aW9uIGNhbm5vdCBiZSBjb21wbGV0ZWQuCi1TZWxlY3RFbGVtZW50RGlhbG9nX3NlbGVjdGVsZW1lbnRfdGV4dD1TZWxlY3QgRWxlbWVudAotCi0jIEVkaXRvckNob29zZXIKLWVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ190aXRsZT1PcGVuIE1ldGhvZCBFZGl0b3IKLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVzY3JpcHRpb25MYWJlbD1EZXNjcmlwdGlvbjoKLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9TZWxlY3RBbGxCdXR0b25MYWJlbD1TZWxlY3QgQWxsCi1PcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlX2VkaXRfdGV4dDA9RWRpdCBFbGVtZW50Ci1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfbWVzc2FnZT1JVVBBMDAyM0U6IENhbm5vdCBvcGVuIHRoZSBlZGl0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZWxlY3RlZCBNZXRob2QgZWxlbWVudC4KLURlc2NyaXB0aW9uRm9ybVBhZ2VfSWNvbkZpbGVDaG9vc2VyRGlhbG9nX3RpdGxlPVNlbGVjdCBJbWFnZSBGaWxlCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5TmFtZT1OZXcgTGlicmFyeQotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX0Rlc2NyaXB0aW9uTGFiZWw9RGVzY3JpcHRpb246Ci1BdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbj1TZWxlY3Qgb25lIG9yIG1vcmUgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIGFuZCBjbGljayBGaW5pc2ggdG8gb3BlbiB0aGVtLgotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX0Rlc2VsZWN0QWxsQnV0dG9uTGFiZWw9RGVzZWxlY3QgQWxsCi1FbGVtZW50c1ZpZXdfbWlncmF0aW9uX2Rpcl9kbGdfZGVzY3JpcHRpb25fdGV4dD1TcGVjaWZ5IHRoZSBkaXJlY3Rvcnkgb2YgbmV3bHkgbWlncmF0ZWQgezB9IHRvIHJlcGxhY2UgdGhlIHNlbGVjdGVkIHswfQotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX3JlYXNvbj1BIHN5c3RlbSBlcnJvciBoYXMgb2NjdXJyZWQuIENsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbkNsb3NlIHNvbWUgb2YgdGhlIG9wZW5lZCBlZGl0b3JzIGFuZCB0cnkgYWdhaW4uCi0KLSMgRGVzY3JpcHRpb25Gb3JtUGFnZQotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZVRvb0JpZ0RpYWxvZ190aXRsZT1JbWFnZSBpcyBpbnZhbGlkCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RlbXBsYXRlPUlVUEEwMDMxRTogVGhlIHNlbGVjdGVkIGltYWdlICcnezB9JycgaXMgbGFyZ2VyIHRoYW4gdGhlIGFsbG93ZWQgc2l6ZSAoezF9IGJ5IHsyfSkuIFBsZWFzZSBzZWxlY3QgYW5vdGhlciBpbWFnZS4KLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190aXRsZT1JbWFnZSBpcyBpbnZhbGlkCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzJFOiBUaGUgc2VsZWN0ZWQgZmlsZSAnJ3swfScnIGRvZXMgbm90IGV4aXN0LiBQbGVhc2Ugc2VsZWN0IGFub3RoZXIgaW1hZ2UuCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw9U2VsZWN0Li4uCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5RGVzY3JpcHRpb249TWV0aG9kIGxpYnJhcnkgZGVzY3JpcHRpb24KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZWZhdWx0QnJpZWZEZXNjcmlwdGlvbj1NZXRob2QgY29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbgotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VEZXNjcmlwdGlvbj1BbGwgZWRpdG9ycyBtdXN0IGJlIGNsb3NlZC4gU2VsZWN0IHRoZSBvbmVzIHRoYXQgbmVlZCB0byBiZSBzYXZlZCBmaXJzdCwgaWYgYXBwbGljYWJsZS4KLQotIyBUZW1wbGF0ZURlc2NyaXB0aW9uUGFnZQotZm9ybXNfR3VpZGFuY2VXaXRoQXR0YWNobWVudHNEZXNjcmlwdGlvblBhZ2VfYWxyZWFkeUF0dGFjaGVkX21zZz1UaGUgc2VsZWN0ZWQgZmlsZSBpcyBhbHJlYWR5IGFuIGF0dGFjaG1lbnQgdG8gdGhpcyBHdWlkYW5jZS4KLWZvcm1zX0d1aWRhbmNlV2l0aFVybEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlX2FscmVhZHlBdHRhY2hlZF9tc2c9VGhlIHNlbGVjdGVkIFVSTCBpcyBhbHJlYWR5IGFuIGF0dGFjaG1lbnQgdG8gdGhpcyBHdWlkYW5jZS4KLQotIyBOZXcgTGlicmFyeSBFcnJvciBEaWFsb2cKLW5ld0xpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMTRFOiBVbmFibGUgdG8gY3JlYXRlIHRoZSBtZXRob2QgbGlicmFyeS4KLW5ld0xpYnJhcnlJbnRlcm5sRXJyb3JfcmVhc29uPUFuIGludGVybmFsIGVycm9yIGhhcyBvY2N1cnJlZC4KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24xPVRoZSBzcGVjaWZpZWQgbWV0aG9kIGxpYnJhcnkgcGF0aCAnJ3swfScnIGlzIGludmFsaWQuCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMj1BIG1ldGhvZCBsaWJyYXJ5IGFscmVhZHkgZXhpc3RzIGluICcnezB9JycuCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMz1UaGUgc3BlY2lmaWVkIG1ldGhvZCBsaWJyYXJ5IGZvbGRlciAnJ3swfScnIGNhbm5vdCBiZSBjcmVhdGVkLgotbmV3TGlicmFyeUVycm9yX2FkdmljZT1TZWxlY3QgT0sgdG8gc3BlY2lmeSBhbm90aGVyIG1ldGhvZCBsaWJyYXJ5IHBhdGguCi0KLSNQcm9jZXNzIGxpdGVyYWxzCi1Qcm9jZXNzX0V4dGVybmFsSUQ9RXh0ZXJuYWwgSUQ6Ci1Qcm9jZXNzX1B1cnBvc2U9UHVycG9zZToKLVByb2Nlc3NfU2NvcGU9U2NvcGU6Ci1Qcm9jZXNzX1VzYWdlTm90ZXM9VXNhZ2UgTm90ZXM6Ci1Qcm9jZXNzX0FsdGVybmF0aXZlcz1BbHRlcm5hdGl2ZXM6Ci1Qcm9jZXNzX0hvd1RvU3RhZmY9SG93IHRvIFN0YWZmOgotUHJvY2Vzc19LZXlDb25zaWRlcmF0aW9uPUtleSBDb25zaWRlcmF0aW9uczoKLVByb2Nlc3NfU2NhbGU9U2NhbGU6Ci1Qcm9jZXNzX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3M9UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M6Ci1Qcm9jZXNzX1Jpc2tMZXZlbD1SaXNrIExldmVsOgotUHJvY2Vzc19Fc3RpbWF0aW5nVGVjaG5pcXVlPUVzdGltYXRpbmcgVGVjaG5pcXVlczoKLVByb2Nlc3NfUHJvamVjdE1lbWJlckV4cGVydGlzZT1Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U6Ci1Qcm9jZXNzX1R5cGVPZkNvbnRyYWN0PVR5cGUgT2YgQ29udHJhY3Q6Ci0KLSMgRWRpdG9yIFByZXZpZXcgTmF2aWdhdGlvbiBCdXR0b25zCi1iYWNrQnV0dG9uX3RleHQ9QmFjawotZm9yd2FyZEJ1dHRvbl90ZXh0PUZvcndhcmQKLWZvcndhcmRfdGV4dD1Gb3J3YXJkCi1zdG9wQnV0dG9uX3RleHQ9U3RvcAotcmVmcmVzaEJ1dHRvbl90ZXh0PVJlZnJlc2gKLXJlZnJlc2hfdGV4dD1SZWZyZXNoCi1uZXduYW1lX3RleHQ9TmV3IG5hbWU6Ci1wcmludEJ1dHRvbl90ZXh0PVByaW50Ci0KLSMgQ29udGV4dCBtZW51cwotX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtPSZSZWZyZXNoCi1fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbT0mU2hvdyBQcm9wZXJ0aWVzCi0KLV9VSV9NZXRob2RFZGl0b3JfbWVudT0mTWV0aG9kIEVkaXRvcgotX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbT0mTmV3Ci1fVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW09TiZldyBTaWJsaW5nCi0KLV9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsPVNlbGVjdGlvbgotX1VJX1BhcmVudFBhZ2VfbGFiZWw9UGFyZW50Ci1fVUlfTGlzdFBhZ2VfbGFiZWw9TGlzdAotX1VJX1RyZWVQYWdlX2xhYmVsPVRyZWUKLV9VSV9UYWJsZVBhZ2VfbGFiZWw9VGFibGUKLV9VSV9UYWJsZVRyZWVQYWdlX2xhYmVsPVRhYmxlVHJlZQotX1VJX09iamVjdENvbHVtbl9sYWJlbD1PYmplY3QKLV9VSV9TZWxmQ29sdW1uX2xhYmVsPVNlbGYKLQotX1VJX05vT2JqZWN0U2VsZWN0ZWQ9U2VsZWN0ZWQgTm90aGluZwotX1VJX1NpbmdsZU9iamVjdFNlbGVjdGVkPVNlbGVjdGVkIE9iamVjdDogezB9Ci1fVUlfTXVsdGlPYmplY3RTZWxlY3RlZD1TZWxlY3RlZCB7MH0gT2JqZWN0cwotCi1fVUlfT3BlbkVkaXRvckVycm9yX2xhYmVsPU9wZW4gRWRpdG9yCi0KLV9VSV9XaXphcmRfY2F0ZWdvcnk9RXhhbXBsZSBFTUYgTW9kZWwgQ3JlYXRpb24gV2l6YXJkcwotCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfbGFiZWw9TWV0aG9kIE1vZGVsCi1fVUlfTWV0aG9kTW9kZWxXaXphcmRfZGVzY3JpcHRpb249Q3JlYXRlIGEgbmV3IE1ldGhvZCBtb2RlbAotCi1fVUlfTWV0aG9kRWRpdG9yX2xhYmVsPU1ldGhvZCBNb2RlbCBFZGl0b3IKLQotX1VJX01ldGhvZEVkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2U9TXkKLV9VSV9NZXRob2RFZGl0b3JGaWxlbmFtZUV4dGVuc2lvbj1tZXRob2QKLQotX1VJX1dpemFyZF9sYWJlbD1OZXcKLQotX1dBUk5fRmlsZW5hbWVFeHRlbnNpb249VGhlIGZpbGVuYW1lIG11c3QgZW5kIGluICcnLnswfScnCi0KLV9VSV9Nb2RlbE9iamVjdD1Nb2RlbCBPYmplY3QKLV9VSV9YTUxFbmNvZGluZz1YTUwgRW5jb2RpbmcKLV9VSV9YTUxFbmNvZGluZ0Nob2ljZXM9VVRGLTggQVNDSUkgVVRGLTE2IFVURi0xNkJFIFVURi0xNkxFIElTTy04ODU5LTEKLV9VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb249U2VsZWN0IGEgbW9kZWwgb2JqZWN0IHRvIGNyZWF0ZQotCi1fVUlfRmlsZUNvbmZsaWN0X2xhYmVsPUZpbGUgQ29uZmxpY3QKLV9XQVJOX0ZpbGVDb25mbGljdD1UaGVyZSBhcmUgdW5zYXZlZCBjaGFuZ2VzIHRoYXQgY29uZmxpY3Qgd2l0aCBjaGFuZ2VzIG1hZGUgb3V0c2lkZSB0aGUgZWRpdG9yLiBEbyB5b3Ugd2lzaCB0byBkaXNjYXJkIHRoaXMgZWRpdG9yJ3MgY2hhbmdlcz8KLQotIyBBZGQgTGluayBEaWFsb2cKLWFkZExpbmtEaWFsb2dfbGlua1R5cGU9VHlwZToKLW9wZW5MaW5rQ2hlY2tib3hfdGV4dD1PcGVuIGxpbmsgaW4gYSBzZXBhcmF0ZSBicm93c2VyIHdpbmRvdwotCi0jIEFkZCBJbWFnZSBEaWFsb2cKLWhlaWdodExhYmVsX3RleHQ9SGVpZ2h0Ogotd2lkdGhMYWJlbF90ZXh0PVdpZHRoOgotRWxlbWVudHNWaWV3XzIwPWNhcGFiaWxpdHkgcGF0dGVybgotRWxlbWVudHNWaWV3XzIxPWRlbGl2ZXJ5IHByb2Nlc3MKLUVsZW1lbnRzVmlld18yMj1wcm9jZXNzCi1FbGVtZW50c1ZpZXdfMzU9ezB9IGlzIHJlYWQtb25seS4gTWFrZSBpdCB3cml0YWJsZSBiZWZvcmUgY29udGludWluZy4KLUVsZW1lbnRzVmlld18zNj1FcnJvciBsb2FkaW5nIGxpYnJhcnkKLWFsdFRhZ0xhYmVsX3RleHQ9QUxUIHRhZzoKLWltYWdlU2l6ZUxhYmVsX3RleHQ9SGVpZ2h0IGFuZCB3aWR0aCBvZiBpbWFnZSBtdXN0IGJlIGF0IGxlYXN0IDEwIGFuZCBubyBtb3JlIHRoYW4gNjAwLiBJbnZhbGlkIGhlaWdodCBhbmQgd2lkdGggd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBzdWl0YWJsZSBzaXplLgotCi0jIFByb2Nlc3MgRWRpdG9yCi1Qcm9jZXNzRWRpdG9yPVByb2Nlc3NFZGl0b3IKLVByb2Nlc3NFZGl0b3JfTmFtZT1OYW1lCi1Qcm9jZXNzRWRpdG9yX1ByZXNlbnRhdGlvbk5hbWU9UHJlc2VudGF0aW9uIE5hbWUKLVByb2Nlc3NFZGl0b3JfSW5kZXg9SW5kZXgKLVByb2Nlc3NFZGl0b3JfUHJlZGVjZXNzb3JzPVByZWRlY2Vzc29ycwotI0NvbmZpZ3VyYXRpb25QYWdlX1NlbGVjdGVkPVNlbGVjdGVkOiAKLUNoZWNrbGlzdE9yZGVyX2Rlc2NyaXB0aW9uPVNlbGVjdCBhIGNoZWNrIGl0ZW0gYW5kIGNsaWNrIFVwIG9yIERvd24gdG8gY2hhbmdlIGl0cyBvcmRlci4KLUVsZW1lbnRzVmlld19yZW5hbWluZ190ZXh0PVJlbmFtaW5nLi4uCi1Qcm9jZXNzRWRpdG9yX01vZGVsSW5mbz1Nb2RlbCBJbmZvCi1Qcm9jZXNzRWRpdG9yX1ByZWZpeD1QcmVmaXgKLU1vdmVEaWFsb2dfbW92ZV90ZXh0PU1vdmUKLUNoZWNrbGlzdE9yZGVyX3RpdGxlPU9yZGVyIENoZWNrIEl0ZW1zCi1Qcm9jZXNzRWRpdG9yX1JlcGV0YWJsZT1SZXBlYXRhYmxlCi1Qcm9jZXNzRWRpdG9yX09uZ29pbmc9T25nb2luZwotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3luY2hyb25pemF0aW9uPVN5bmNocm9uaXplLi4uCi1Qcm9jZXNzRWRpdG9yX0V2ZW50RHJpdmVuPUV2ZW50LURyaXZlbgotUHJvY2Vzc0VkaXRvcl9EZWxpdmVyYWJsZT1EZWxpdmVyYWJsZQotUHJvY2Vzc0VkaXRvcl9PcHRpb25hbD1PcHRpb25hbAotRmlsdGVyRGlhbG9nX1R5cGVfdGV4dD1NZXRob2QgRWxlbWVudCBUeXBlOgotRmlsdGVyRGlhbG9nX0V4cGFuZEFsbD1FeHBhbmQgQWxsCi1Nb3ZlRGlhbG9nX21vdmluZ190ZXh0PU1vdmluZy4uLgotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkU2hhcGVJY29uV2FybmluZz1JVVBBMDAyNVc6IFNoYXBlIGljb24gZm9yIHswfSBpcyBub3QgZm91bmQgaW4gcGF0aDogezF9Ci1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWRTaGFwZUljb25FcnJvcj1JVVBBMDAyNUU6IEVycm9yOiBTaGFwZSBpY29uIHNlY3Rpb246IHswfQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9OYW1lTGFiZWw9TmFtZToKLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGU9Q3JlYXRlIGEgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfTmFtZUxhYmVsPU5hbWU6Ci1BdXRob3JpbmdVSVBsdWdpbl9uZXdDb25maWd1cmF0aW9uV2l6YXJkX3RpdGxlPU5ldyBNZXRob2QgQ29uZmlndXJhdGlvbgotbmV3Q29uZmlndXJhdGlvbldpemFyZF90aXRsZT1OZXcgTWV0aG9kIENvbmZpZ3VyYXRpb24KLXByZWZlcmVuY2VfV29ya0JyZWFrZG93bkVsZW1lbnRzPVBoYXNlLCBJdGVyYXRpb24sIEFjdGl2aXR5IGFuZCBNaWxlc3RvbmUKLXByZWZlcmVuY2VfRGVzY3JpcHRvckVsZW1lbnRzPVJvbGUsIFRhc2sgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yCi1wcmVmZXJlbmNlX2JyZWFrRG93bkVsZW1lbnRfRGVzY3JpcHRpb249VGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIHdpbGwgYmUgc2VsZWN0ZWQgYnkgZGVmYXVsdCBpbiB0aGUgcHJvY2VzcyBlZGl0b3I6Ci1wcmVmZXJlbmNlX0FjdGl2aXR5X0RpYWdyYW09QWN0aXZpdHkgRGlhZ3JhbSAKLXByZWZlcmVuY2VfQWN0aXZpdHlfRGV0YWlsX0RpYWdyYW09QWN0aXZpdHkgRGV0YWlsIERpYWdyYW0KLQotIyBOZXcgTWV0aG9kIExpYnJhcnkgV2l6YXJkCi1uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlPU5ldyBNZXRob2QgTGlicmFyeQotbmV3TGlicmFyeVdpemFyZE1haW5QYWdlX3RpdGxlPUNyZWF0ZSBhIG5ldyBtZXRob2QgbGlicmFyeS4KLW5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV9kZXNjcmlwdGlvbj1TcGVjaWZ5IGEgcGF0aCBhbmQgZGVzY3JpcHRpb24gZm9yIHRoZSBuZXcgbWV0aG9kIGxpYnJhcnkuCi0jbmV3TGlicmFyeVdpemFyZE1haW5QYWdlX2Rlc2NyaXB0aW9uXzE9U3BlY2lmeSBhIG5hbWUsIGRlc2NyaXB0aW9uIGFuZCBzdG9yYWdlIHR5cGUgZm9yIHRoZSBuZXcgbWV0aG9kIGxpYnJhcnkuCi1saWJyYXJ5UGF0aExhYmVsX3RleHQ9UGF0aDoKLWxpYnJhcnlUeXBlTGFiZWxfdGV4dD1UeXBlOgotCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZVRpdGxlPVNhdmUgY2hhbmdlcwotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVEZXNjcmlwdGlvbj1PbmUgb3IgbW9yZSBtZXRob2QgZWxlbWVudHMgaGF2ZSBiZWVuIG1vZGlmaWVkLiBTZWxlY3QgdGhlIG9uZXMgdGhhdCBuZWVkIHRvIGJlIHNhdmVkLgotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGU9T3BlbiBNZXRob2QgQ29uZmlndXJhdGlvbnMKLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uV2l6YXJkX3dpbmRvd1RpdGxlPU9wZW4gTWV0aG9kIENvbmZpZ3VyYXRpb25zCi1FbGVtZW50c1ZpZXdfcmVwbGFjZWluZ3dpdGhmb3JtYXRfdGV4dD1SZXBsYWNpbmcgezB9Li4uCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbldhcm5pbmc9SVVQQTAwMjZXOiBOb2RlIGljb24gZm9yIHswfSBpcyBub3QgZm91bmQgaW4gcGF0aDogezF9Ci0jTWVzc2FnZUxhYmVsUHJvdmlkZXJfdW5zZWxlY3RlZHBhY2thZ2VzPScnezB9JycgY29udGFpbnMgZWxlbWVudHMgdGhhdCByZWZlcmVuY2UgZWxlbWVudHMgaW4gdW5zZWxlY3RlZCBwYWNrYWdlcwotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkTm9kZUljb25FcnJvcj1JVVBBMDAyNkU6IEVycm9yOiBOb2RlIGljb24gc2VjdGlvbjogezB9Ci1TdGVwc09yZGVyRGlhbG9nX3N0ZXBzPVN0ZXBzOiAKLVN0ZXBzT3JkZXJEaWFsb2dfdGl0bGU9T3JkZXIgVGFzayBTdGVwcwotUHJvY2Vzc0VkaXRvcl9QbGFubmVkPVBsYW5uZWQKLXNwZWNpZnlkaXJlY3RvcnlfdGV4dD1QbGVhc2Ugc3BlY2lmeSBhIGRpcmVjdG9yeSB0byBzYXZlIHRoZSBtZXRob2QgbGlicmFyeSB0bwotUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzPU11bHRpcGxlIE9jY3VycmVuY2VzCi1Qcm9jZXNzRWRpdG9yX0VudHJ5U3RhdGU9RW50cnkgU3RhdGUKLVByb2Nlc3NFZGl0b3JfRXhpdFN0YXRlPUV4aXQgU3RhdGUKLXNlbGVjdENvbHVtbnN0b0FkZF90ZXh0PVNlbGVjdCB0aGUgY29sdW1ucyB0byBhZGQKLVByb2Nlc3NFZGl0b3JfVHlwZT1UeXBlCi1Qcm9jZXNzRWRpdG9yX1RlYW09VGVhbQotRmlsdGVyRGlhbG9nX3RpdGxlPVNlbGVjdCBEaWFsb2c6IAotCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGQ9JkFkZCBmcm9tIE1ldGhvZCBDb250ZW50Li4uCi1GaWx0ZXJEaWFsb2dfQ29sbGFwc2VBbGw9Q29sbGFwc2UgQWxsCi1PcGVuQ2hlYXRzaGVldFZpZXdfdGl0bGU9T3BlbiBDaGVhdFNoZWV0IFZpZXcKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxVcD1SJm9sbCBVcAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbERvd249UiZvbGwgRG93bgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZVVwPSZNb3ZlIFVwCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlRG93bj1Nb3ZlIERvJnduCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9JbmRlbnQ9JkluZGVudAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3V0ZGVudD0mT3V0ZGVudAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsPVJldmUmYWwKLVByb2Nlc3NFZGl0b3JfUmV2ZWFsX1RpdGxlPVJldmVhbAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29weT0mQ29weS4uLgotRmlsdGVyRGlhbG9nX1BhdHRlcm5fdGV4dD1OYW1lIHBhdHRlcm5zIChtYXRjaGluZyBuYW1lcyB3aWxsIGJlIHNob3duKTogCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9QcmVmZXJlbmNlcz1QcmVmZXJlbmNlJnMuLi4KLU1ldGhvZExpYnJhcnlFZGl0b3JfdGl0bGU9TWV0aG9kIExpYnJhcnk6IAotI01lc3NhZ2VWaWV3X3NlbGVjdGVkX3RleHQ9U2VsZWN0ZWQ6IAotTWVzc2FnZVZpZXdfZXJybXNnX3RleHQ9RGVzY3JpcHRpb24KLUVsZW1lbnRzVmlld19lcnJfc2F2aW5nPUlVUEEwMDI3RTogRXJyb3Igc2F2aW5nICcnezB9Jyd7MX0KLQotZXJyX2NvcHlpbmdfZmlsZV90aXRsZT1FcnJvciBjb3B5aW5nIGZpbGUKLWVycl9jb3B5aW5nX2ZpbGVfZXJyb3I9SVVQQTAwMjhFOiBUaGUgaWNvbiBjb3VsZCBub3QgYmUgYXNzaWduZWQuIAotZXJyX2NvcHlpbmdfZmlsZV9yZWFzb249QW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgY29weWluZyB0aGUgc2VsZWN0ZWQgZmlsZS4gQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLWVycl9wcm9jZXNzaW5nX2ZpbGVfdGl0bGU9RXJyb3IgcHJvY2Vzc2luZyBmaWxlCi1lZGl0Q29uZmlndXJhdGlvbl90b29sdGlwPUVkaXQgY29uZmlndXJhdGlvbgotZWRpdERpYWxvZ19tc2dDYW5ub3RFZGl0PUlVUEEwMDE1RTogQ2Fubm90IGVkaXQgZWxlbWVudAotU2F2ZVRoaXNBY3Rpb25fc2F2ZW9iamVjdD1TYXZlIFRoaXMgT2JqZWN0Li4uCi1FbGVtZW50c1ZpZXdfcmVwbGFjZV90ZXh0PVJlcGxhY2UKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0V4dGVuZD0mRXh0ZW5kLi4uCi1Nb3ZlRGlhbG9nX2Rlc3RpbmF0aW9uX3RleHQ9Q2hvb3NlIGRlc3RpbmF0aW9uIGZvciBzZWxlY3RlZCBlbGVtZW50KHMpOgotY2hvb3NlRGVmYXVsdERpcmVjdG9yeV90ZXh0PUNob29zZSBhIGRlZmF1bHQgZGlyZWN0b3J5IGZvciBsaWJyYXJpZXM6Ci1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzcz0mU3VwcHJlc3MKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzMj0mUHVibGlzaGluZyBPcHRpb25zLi4uCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Bc3NpZ25Vc2VyRGlhZ3JhbT0mVXNlciBEZWZpbmVkIERpYWdyYW1zLi4uCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdGl0bGU9QXNzaWduIHVzZXIgZGVmaW5lZCBkaWFncmFtcwotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkSW1hZ2U9QWN0aXZpdHkgRGlhZ3JhbToKLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hZGRJbWFnZT1BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbToKLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ193cGRJbWFnZT1Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtOgotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX25vdGFGaWxlPUlVUEEwMDA0RTogVGhlIHNwZWNpZmllZCBwYXRoIGlzIG5vdCBhIGZpbGUuCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYXNzaWduQnV0dG9uPVNlbGVjdC4uLgotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2VudGVyZWRJbWFnZU5vdEZvdW5kPUlVUEEwMDI0RTogVGhlIHNwZWNpZmllZCBpbWFnZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbGlicmFyeS4gTWFrZSBzdXJlIHlvdSBlbnRlciB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgbGlicmFyeSdzIHJvb3QgZGlyZWN0b3J5LgotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3NlbGVjdGVkSW1hZ2VOb3RGb3VuZD1JVVBBMDAzMEU6IFRoZSBpbWFnZSB5b3Ugc2VsZWN0ZWQgaXMgbm90IGluIHRoZSBsaWJyYXJ5LgotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZUFESW1hZ2U9VXNlIEFjdGl2aXR5IGRpYWdyYW0gaW1hZ2UgZm9yIGJyb3dzaW5nIGFuZCBwdWJsaXNoaW5nCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURESW1hZ2U9VXNlIEFjdGl2aXR5IGRldGFpbCBkaWFncmFtIGltYWdlIGZvciBicm93c2luZyBhbmQgcHVibGlzaGluZwotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZVdQREltYWdlPVVzZSBXb3JrIHByb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtIGltYWdlIGZvciBicm93c2luZyBhbmQgcHVibGlzaGluZwotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29udHJpYnV0ZT0mTG9jYWwgQ29udHJpYnV0aW9uCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXBsYWNlPUxvY2FsIFJlcGxhY2VtZW4mdAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRGlhZ3JhbXM9RGlhJmdyYW1zCi1Qcm9jZXNzRWRpdG9yX2FjdGlvbl9kZWVwQ29weT0mRGVlcCBDb3B5Li4uCi1GaWx0ZXJEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbj1CcmllZiBEZXNjcmlwdGlvbjoKLUNvbmZpZ3VyYXRpb25QYWdlX2hpZGVUb29sVGlwPVNob3cvSGlkZSBVbmNoZWNrZWQgRWxlbWVudHMKLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uPURlc2NyaXB0aW9uOgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3NBbGw9UHVibGlzaCAmTm9uZQotRmlsdGVyRGlhbG9nX1BhdHRlcm5fZGVzY3JpcHRpb249UGF0dGVybnMgYXJlIHNlcGFyYXRlZCBieSBjb21tYSwgd2hlcmUgKj1hbnkgc3RyaW5nLCA/PWFueSBjaGFyYWN0ZXIKLUNvbmZpZ3VyYXRpb25QYWdlX1RyZWVUaXRsZUxhYmVsPUNvbnRlbnQ6Ci1Db25maWd1cmF0aW9uUGFnZV9Mb2FkaW5nTWVzc2FnZT1Mb2FkaW5nIGNvbmZpZ3VyYXRpb24sIHBsZWFzZSB3YWl0IC4uLgotQ29uZmlndXJhdGlvblBhZ2VfQWRkQ2F0ZWdvcmllc1RpdGxlTGFiZWw9QWRkIHRoZXNlIENhdGVnb3JpZXM6Ci1Db25maWd1cmF0aW9uUGFnZV9TdWJDYXRlZ29yaWVzVGl0bGVMYWJlbD1TdWJ0cmFjdCB0aGVzZSBDYXRlZ29yaWVzOgotTW92ZURpYWxvZ192YWxpZGRlc3RpbmF0aW9uX3RleHQ9VGhlIHNwZWNpZmllZCBtb3ZlIGRlc3RpbmF0aW9uIGlzIGludmFsaWQuCi1Nb3ZlRGlhbG9nX2Nhbm5vdE1vZGlmeURlc3RpbmF0aW9uPUlVUEEwMDM0RTogVGhlIHNlbGVjdGVkIGRlc3RpbmF0aW9uIGNhbm5vdCBiZSBtb2RpZmllZC4KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbEFsbD1QdWJsaXNoIEEmbGwKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5CYXNlQWN0aXZpdHk9T3BlbiAmQmFzZSBBY3Rpdml0eQotUHJvY2Vzc0Zvcm1FZGl0b3JfZXhwYW5BbGxBY3Rpb25MYWJlbD1FJnhwYW5kIEFsbAotUHJvY2Vzc0Zvcm1FZGl0b3JfY29sbGFwc2VBbGxBY3Rpb25MYWJlbD1DbyZsbGFwc2UgQWxsCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEaWFncmFtPU9wZW4gJkFjdGl2aXR5IERpYWdyYW0KLVByb2Nlc3NFZGl0b3JfcHJvbXB0VG9EZWxldGVCZWZvcmVSZXZlYWw9VGhlIHVuc3VwcHJlc3NlZCBkZXNjcmlwdG9ycyBsaXN0ZWQgaW4gRGV0YWlscyBtdXN0IGJlIGRlbGV0ZWQgdG8gYXZvaWQgZHVwbGljYXRpb24gYWZ0ZXIgcmV2ZWFsaW5nIHRoZSBzZWxlY3RlZCBlbGVtZW50cy4gQ2xpY2sgT0sgaWYgeW91IHdhbnQgdG8gZGVsZXRlIHRoZW0gYW5kIGNvbnRpbnVlLgotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX1NlbGVjdENvbHVtbnM9U2VsZWN0IHRoZSBjb2x1bW5zIHRvIGFkZAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT1PcGVuIEFjdGl2aXR5ICZEZXRhaWwgRGlhZ3JhbQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX0NvbHVtblNlbGVjdGlvbj1Db2x1bW4gc2VsZWN0aW9uOgotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N3aXRjaENvbmZpZ3VyYXRpb249U3dpdGNoIHRvIHRoZSBQcm9jZXNzJyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2hlbiBhY3RpdmF0aW5nIGEgUHJvY2VzcyBlZGl0b3IKLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zdXBwcmVzc2lvbkdyb3VwVGl0bGU9U3VwcHJlc3Npb24KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9pbmhlcml0U3VwcHJlc3Npb25TdGF0ZT1Jbmhlcml0IHN1cHByZXNzaW9uIHN0YXRlcwotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW09T3BlbiAmV29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbQotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw9Q2xlYXIKLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsPVNlbGVjdC4uLgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fSW5zZXJ0TmV3UGhhc2U9SW5zZXJ0IE5ldyBQaGFzZQotVmlld0hlbHBlcl9yZWxvYWRMaWJPblJvbGxiYWNrRXJyb3I9Q291bGQgbm90IHJlY292ZXIgZnJvbSBhIHBlcnNpc3RlbmNlIGVycm9yLiBUaGUgbGlicmFyeSBuZWVkcyB0byBiZSByZWxvYWRlZCB0byByZXN0b3JlIGl0cyBvcmlnaW5hbCBzdGF0ZS4KLVZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRfdGV4dD1UaGUgZWxlbWVudCAnJ3swfScnIGlzIGFscmVhZHkgZGVsZXRlZC4KLVZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRjb25maXJtX3RleHQ9VGhlIGVsZW1lbnQgJyd7MH0nJyBpcyBhbHJlYWR5IGRlbGV0ZWQuIERvIHlvdSB3YW50IHRvIHJlbW92ZSBpdCBmcm9tICcnezF9Jyc/Ci1Db25maWd1cmF0aW9uUGFnZV9BZGRNaXNzaW5nVG9vbFRpcD1GaXggZXJyb3JzIGFuZCB3YXJuaW5ncwotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb249RGVzY3JpcHRpb24KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkdlbmVyYWxJbmZvPUdlbmVyYWwgSW5mb3JtYXRpb24gCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BcHBseVBhdHRlcm49QXBwbHkgUGEmdHRlcm4KLU1vdmVEaWFsb2dfc2VsZWN0ZGVzdGluYXRpb25fdGV4dD1QbGVhc2Ugc2VsZWN0IGEgZGVzdGluYXRpb24uCi1Nb3ZlRGlhbG9nX25vbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZz1ObyBtb3ZlIGRlc3RpbmF0aW9uIHNwZWNpZmllZC4KLU1ldGhvZExpYnJhcnlFZGl0b3JfdHJvdWJsZW9iamVjdD0uIFRyb3VibGUgb2JqZWN0OiAKLU1lc3NhZ2VMYWJlbFByb3ZpZGVyX2VycmNoaWxkcGtncz1BIGNoaWxkIGNvbnRlbnQgcGFja2FnZSBvciBwcm9jZXNzIGNvbnRhaW5zIGVsZW1lbnRzIHdpdGggbWlzc2luZyByZWZlcmVuY2VzCi1Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX1RpdGxlPURpYWdyYW0gUHVibGlzaGluZyBPcHRpb25zCi1Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX01lc3NhZ2U9UGxlYXNlIHNlbGVjdCB0aGUgZGlhZ3JhbShzKSB0byBwdWJsaXNoIG9yIGRlc2VsZWN0IHRvIG5vdCBwdWJsaXNoCi1Qcm9jZXNzRWRpdG9yX1RpdGxlPVByb2Nlc3MgRWRpdG9yOiAKLVNhdmVBc3dpdGhkb3RzX3RleHQ9U2F2ZSBBcy4uLgotUHJvY2Vzc0VkaXRvcl9Xb3JrQnJlYWtkb3duU3RydWN0dXJlPVdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZQotUHJvY2Vzc0VkaXRvcl9UZWFtQWxsb2NhdGlvbj1UZWFtIEFsbG9jYXRpb24KLVByb2Nlc3NFZGl0b3JfV29ya1Byb2R1Y3RVc2FnZT1Xb3JrIFByb2R1Y3QgVXNhZ2UKLVByb2Nlc3NFZGl0b3JfQ29uc29saWRhdGVkVmlldz1Db25zb2xpZGF0ZWQgVmlldwotUHJvY2Vzc0VkaXRvcl9jb25maXJtQXV0b1N5bmNoPVRoaXMgb3BlcmF0aW9uIHJlZnJlc2hlcyB0aGUgc2VsZWN0ZWQgZGVzY3JpcHRvcnMgb3IgYWxsIGRlc2NyaXB0b3JzIGJlbG93IHRoZSBzZWxlY3RlZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIG1hcmtlZCBhcyAiU3luY2hyb25pemVkIHdpdGggc291cmNlIiBpbiB0aGUgR2VuZXJhbCB0YWIgb2YgdGhlaXIgUHJvcGVydGllcyB2aWV3LiAgSXQgcmVmcmVzaGVzIHRoZXNlIGRlc2NyaXB0b3JzIHdpdGggdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgb2YgdGhlIGxpbmtlZCBtZXRob2QgY29udGVudCBlbGVtZW50cyB1bmRlciB0aGUgcHJvY2VzcycgZGVmYXVsdCBjb25maWd1cmF0aW9uLiAgTm90ZSB0aGF0IGl0IHdpbGwgbm90IHVwZGF0ZSBhbnkgZHluYW1pY2FsbHkgbGlua2VkIChncmVlbiBpdGFsaWMpIGRlc2NyaXB0b3JzLiAgRG8geW91IHdhbnQgdG8gcHJvY2VlZD8KLVByb2Nlc3NFZGl0b3JfZGVmYXVsdFN5bmNocm9uaXphdGlvbj1EZWZhdWx0IFN5bmNocm9uaXphdGlvbiBmcm9tIG1ldGhvZCBjb250ZW50Ci1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjE9Q29uZmlndXJhdGlvbgotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24yPVBsdWctaW4gYW5kIFBhY2thZ2UgU2VsZWN0aW9uCi1OZXdMaWJyYXJ5RGlhbG9nX25ld2xpYnJhcnlfYXM9Q3JlYXRlIE5ldyBMaWJyYXJ5IEFzCi1OZXdQbHVnaW5EaWFsb2dfbmV3cGx1Z2luX3RleHQ9TmV3IE1ldGhvZCBQbHVnLWluCi1TZWxlY3RFbGVtZW50RGlhbG9nX3RpdGxlX3RleHQ9U2VsZWN0IHRoZSBlbGVtZW50IG9yIG9uZSBvZiBpdHMgY29udHJpYnV0b3JzOgotT3BlbkNvbmZpZ0RpYWxvZ25ld2NvbmZpZ190ZXh0PU5ldyBDb25maWd1cmF0aW9uOgotcHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlX0JTRWRpdG9yPVByb2Nlc3MgRWRpdG9yCi0KLSMgQWJzdHJhY3REaWFncmFtRWRpdG9yCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9QWxpZ24KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0PVJlZnJlc2ggZnJvbSBCYXNlIEFjdGl2aXR5Ci1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9Rm9ybWF0IFRleHQgQm94Li4uCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PUhvcml6b250YWxseSB0byBBdmVyYWdlCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PUhvcml6b250YWxseSB0byBGaXJzdCBTZWxlY3RlZAotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1WZXJ0aWNhbGx5IHRvIEF2ZXJhZ2UKLU1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fdGl0bGU9R2VuZXJhbCBJbmZvcm1hdGlvbgotTW92ZURpYWxvZ19pbnZhbGlkX21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9SVVQQTAwNDFFOiBUaGUgc2VsZWN0ZWQgZWxlbWVudChzKSBjYW5ub3QgYmUgbW92ZWQgdG8gdGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbi4KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZW1vZGVsbGlicmFyeT1TYXZpbmcgbW9kZWwgbGlicmFyeSAuLi4KLU1ldGhvZExpYnJhcnlFZGl0b3JfZXJyb3JfZGlhbG9nX3RpdGxlPUVycm9yCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3NhdmVfbGlicmFyeV9wcm9ibGVtX21zZz1JVVBBMDAzM0U6IFByb2JsZW0gZW5jb3VudGVyZWQgaW4gc2F2aW5nIGxpYnJhcnkuCi1NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uX2RlbGV0ZWNvbmZpcm1fdGV4dD1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICcnezB9Jyc/Ci1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19Db250ZW50RWxlbWVudF90ZXh0PUNvbnRlbnQgRWxlbWVudHM6IAotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Ccm93c2VCdXR0b25MYWJlbD1Ccm93c2UuLi4KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlRGVzY3JpcHRpb249U3BlY2lmeSBhIG5hbWUgYW5kIGRlc2NyaXB0aW9uIGZvciB0aGUgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uLgotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VUaXRsZT1TYXZlIGNoYW5nZXMgYW5kIGNsb3NlIGFsbCBlZGl0b3JzCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PVZlcnRpY2FsbHkgdG8gRmlyc3QgU2VsZWN0ZWQKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX3RleHQ9U2F2ZQotQXR0YWNobWVudERpYWxvZ2F0dGFjaEZpbGVfdGV4dD1BdHRhY2ggRmlsZQotQXR0YWNobWVudERpYWxvZ2F0dGFjaFVybF90ZXh0PUF0dGFjaCBVcmwKLUNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnQ9Q29uZmlndXJhdGlvbiBDb250ZW50Ci1PcGVuQ29uZmlnRGlhbG9nb3BlbmNvbmZpZ190ZXh0PU9wZW4gQ29uZmlndXJhdGlvbgotRWxlbWVudHNWaWV3X3JlcGxhY2VBY3Rpb25fdGV4dD1SZXBsYWNlLi4uCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlPVNhdmluZyB7MH0KLUNvbmZpZ3VyYXRpb25QYWdlX1Nob3dFcnJvclRvb2xUaXA9U2hvdyBjb25maWd1cmF0aW9uIGVycm9ycwotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRm9ybVByZWZpeD1Db25maWd1cmF0aW9uOiAKLUNoZWNrbGlzdE9yZGVyX2NoZWNrbGlzdGl0ZW1zX3RleHQ9Q2hlY2sgSXRlbXM6IAotQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsPU1vdmUgTm9kZQotQ29uZmlndXJhdGlvblBhZ2VfTWFrZUNsb3N1cmVUb29sVGlwPUZpeCBlcnJvcnMKLUNvbmZpZ3VyYXRpb25PcmRlckRpYWxvZ19kZXNjcmlwdGlvbj1PcmRlciBOYXZpZ2F0aW9uIFZpZXdzCi1OZXdQbHVnaW5EaWFsb2dfcmVmZXJlbmNlcGx1Z2luX3RleHQ9UmVmZXJlbmNlIFBsdWctaW5zOgotQWJzdHJhY3REaWFncmFtRWRpdG9yX2NyZWF0ZUZyZWVUZXh0X3RleHQ9Q3JlYXRlIGEgRnJlZSBUZXh0Ci1EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19MYWJlbD1Ob2RlIEljb24gUHJldmlldzoKLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0PUlVUEEwMDMyVzogQ2Fubm90IGNvbm5lY3QKLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9zYW1lcHJlZGFuZHN1Y190ZXh0PUlVUEEwMDMzVzogQ2Fubm90IGhhdmUgdGhlIHNhbWUgYnJlYWtkb3duIGVsZW1lbnQgYXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvcgotCi0jIEVkaXRvckNob29zZXIKLUVkaXRvckNob29zZXJfbG9hZGRFcnJvckRsZ1RpdGxlPU9wZW4gRWRpdG9yCi1FZGl0b3JDaG9vc2VyX1Jlc291cmNlc0Vycm9yPVRoaXMgZWxlbWVudCBoYXMgZXJyb3JzLiBJdCBpcyByZWNvbW1lbmRlZCB0byBmaXggdGhlc2UgZXJyb3JzIGJlZm9yZSBjb250aW51aW5nIChzZWUgZGV0YWlscykuXG5cbkNsaWNrIE9LIHRvIGNvbnRpbnVlIHdpdGhvdXQgb3BlbmluZyB0aGUgZWRpdG9yLiBDbG9zZSB0aGlzIGRpYWxvZyB0byBvcGVuIHRoZSBlZGl0b3IuCi1Db25maWd1cmF0aW9uUGFnZV9Gb3JtUHJlZml4PUNvbmZpZ3VyYXRpb246IAotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uTmFtZT1OYW1lOgotQXR0YWNobWVudERpYWxvZ0ZpbGVVUkxfdGV4dD1GaWxlIFVSTDoKLVN0ZXBzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb249U2VsZWN0IGEgc3RlcCBhbmQgY2xpY2sgVXAgb3IgRG93biB0byBjaGFuZ2UgaXRzIG9yZGVyLgotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJfc2F2ZT1FcnJvciBkdXJpbmcgc2F2aW5nCi1NZXNzYWdlVmlld19lcnJlbGVtZW50X3RleHQ9UmVmZXJlbmNpbmcgRWxlbWVudAotTWVzc2FnZVZpZXdfcmVmZWxlbWVudF90ZXh0PVJlZmVyZW5jZWQgRWxlbWVudAotCi0jQWN0aXZpdHkgRGlhZ3JhbQotQWN0aXZpdHlEaWFncmFtRWRpdG9yX2NyZWF0ZVN0YXJ0Tm9kZV90ZXh0PUNyZWF0ZSBhIFN0YXJ0IE5vZGUKLUNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnREZXNjcmlwdGlvbj1TZWxlY3QgdGhlIG1ldGhvZCBwbHVnLWlucywgY29udGVudCBwYWNrYWdlcyBhbmQgcHJvY2Vzc2VzIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24uCi1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbl90ZXh0PU9yZGVyIGRpYWxvZwotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EaXJlY3RvcnlMYWJlbD1EaXJlY3Rvcnk6Ci1Sb290UHJlZlBhZ2VfZW5hYmxlcHJvY2Vzc2NvbnRyaWJ1dGlvbl90ZXh0PUVuYWJsZSBQcm9jZXNzIENvbnRyaWJ1dGlvbgotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25fdGV4dD1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBtZXRob2QgY29uZmlndXJhdGlvbi4KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uTGFiZWw9RGVzY3JpcHRpb246Ci1Db25maWd1cmF0aW9uT3JkZXJEaWFsb2dfTmF2aWdhdGlvblZpZXdzPU5hdmlnYXRpb24gVmlld3M6IAotQ29udHJpYnV0aW9uU2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZT1DaG9vc2luZyBDb250cmlidXRvcnMgZm9yICcnezB9JycKLUVsZW1lbnRzVmlld19vcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb25fdGV4dD0mT3BlbiB2aWEgdmFyaWFiaWxpdHkgZWxlbWVudHMKLVZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZT1jaG9vc2luZyB2YXJpYWJpbGl0eSBlbGVtZW50cyBmb3IgJyd7MH0nJwotVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3ZpZXdlckxhYmVsPVZhcmlhYmlsaXR5IGVsZW1lbnRzIGZvciAnJ3swfScnCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfTGFiZWw9U2hhcGUgSWNvbiBQcmV2aWV3OgotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9kZWxldGVfdGV4dD1DYW5ub3QgZGVsZXRlCi1BY3Rpdml0eURpYWdyYW1FZGl0b3Jfb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0PU9wZW4gQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gCi1NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZV9zZWN0aW9uX2Rlc2NyaXB0aW9uPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG1ldGhvZCBsaWJyYXJ5LgotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbD1DbGVhcgotV1BDb21wYXJ0bWVudEZpZ3VyZV8wPU5ldyBXb3JrUHJvZHVjdCBEZXNjcmlwdG9yCi1wcm9tcHRmb3JfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZF90ZXh0PVB1Ymxpc2ggYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW1zIHRoYXQgaGF2ZSBub3QgYmVlbiBjcmVhdGVkIGluIHByb2Nlc3MgZWRpdG9yCi1wcm9tcHRfZm9yX3B1Ymxpc2hfZXh0ZW5kX2FjdGl2aXR5X2RpYWdyYW09UHVibGlzaCBhY3Rpdml0eSBkaWFncmFtcyBmb3IgdW5tb2RpZmllZCBhY3Rpdml0eSBleHRlbnNpb25zCi0KLSNDb25maWdQcm9jZXNzVmlld0RpYWxvZwotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfTmFtZVBhdHRlcm49TmFtZSBwYXR0ZXJucyAobWF0Y2hpbmcgbmFtZXMgd2lsbCBiZSBzaG93bik6Ci1zaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbl9sYWJlbD0mU2hvdyBpbiBSZXNvdXJjZSBOYXZpZ2F0b3IKLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1BhdHRlcm49UGF0dGVybnMgYXJlIHNlcGFyYXRlZCBieSBjb21tYSwgd2hlcmUgKj1hbnkgc3RyaW5nLCA/PWFueSBjaGFyYWN0ZXIKLWVycl9wcm9jZXNzaW5nX2ZpbGVfZGVzY3JpcHRpb249SVVQQTAwMjlFOiBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBzZWxlY3RlZCBmaWxlLiBDbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQ2F0ZWdvcnlUeXBlPUNhdGVnb3J5IFR5cGUgOgotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbj1CcmllZiBEZXNjcmlwdGlvbjoKLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1NlbGVjdENhdGVnb3JpZXM9U2VsZWN0IENhdGVnb3JpZXMKLQotI2xvZyBtZXNzYWdlcwotY2hlYXRzaGVldF9sb2FkX2ZhaWx1cmVfbG9nX21zZz1GYWlsZWQgdG8gb3BlbiB0aGUgcmVxdWVzdGVkIGNoZWF0c2hlZXQ6IAotCi1uZXdDb25maWd1cmF0aW9uV2lyYXpkX2NyZWF0ZUVycm9yPUlVUEEwMDM1RTogVGhlIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Ci1uZXdQbHVnaW5XaXphcmRfY3JlYXRlRXJyb3I9SVVQQTAwMzZFOiBUaGUgcGx1Zy1pbiBjYW5ub3QgYmUgY3JlYXRlZCBzdWNjZXNzZnVsbHkKLWVycm9yRGlhbG9nX21vdmVFcnJvcj1JVVBBMDAzN0U6IFRoZSBlbGVtZW50IGNhbm5vdCBiZSBtb3ZlZCBzdWNjZXNzZnVsbHkKLXJlbmFtZURpYWxvZ19yZW5hbWVFcnJvcj1JVVBBMDAzOEU6IFRoZSBlbGVtZW50IGNhbm5vdCBiZSByZW5hbWVkIHN1Y2Nlc3NmdWxseQotZXJyb3JEaWFsb2dfY3JlYXRlRXJyb3I9SVVQQTAwMzlFOiBUaGUgZWxlbWVudCBjYW5ub3QgYmUgY3JlYXRlZCBzdWNjZXNzZnVsbHkKLWR1cGxpY2F0ZVBsdWdpbk5hbWVFcnJvcl9tc2c9SVVQQTAxMDFFOiBUaGUgbmFtZSAnJ3swfScnIGFscmVhZHkgZXhpc3RzLiBFbnRlciBhIGRpZmZlcmVudCBuYW1lIGFuZCB0cnkgYWdhaW4uCi0KLSNOZXcgU3RyaW5ncyBmb3IgUHJvY2Vzc0VkaXRvciBDb250ZXh0IG1lbnUgZGlhZ3JhbSBpbWFnZXMKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFESW1hZ2U9QXNzaWduIEFEIEltYWdlLi4uCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlPVJlZnJlc2ggRXJyb3IKLVByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yTXNnPUVycm9yIHJlZnJlc2hpbmcgZWRpdG9yCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRBRERJbWFnZT1Bc3NpZ24gQUREIEltYWdlLi4uCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRXUERJbWFnZT1Bc3NpZ24gV1BEIEltYWdlLi4uCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VBREltYWdlSW5QdWJsaXNoaW5nPVVzZSBBRCBJbWFnZSBpbiBQdWJsaXNoaW5nCi1Qcm9jZXNzRWRpdG9yX3Byb21wdFRvRGVsZXRlQmVmb3JlU3VwcHJlc3M9VGhlIHN1cHByZXNzZWQgZGVzY3JpcHRvcnMgbGlzdGVkIGluIERldGFpbHMgbXVzdCBiZSBkZWxldGVkIHRvIGF2b2lkIGR1cGxpY2F0aW9uIGFmdGVyIHN1cHByZXNzaW5nIHRoZSBzZWxlY3RlZCBlbGVtZW50cy4gQ2xpY2sgT0sgaWYgeW91IHdhbnQgdG8gZGVsZXRlIHRoZW0gYW5kIGNvbnRpbnVlLgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURESW1hZ2VJblB1Ymxpc2hpbmc9VXNlIEFERCBJbWFnZSBpbiBQdWJsaXNoaW5nCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VXUERJbWFnZUluUHVibGlzaGluZz1Vc2UgV1BEIEltYWdlIGluIFB1Ymxpc2hpbmcKLVByb2Nlc3NFZGl0b3JfRGlhZ3JhbUltYWdlX0lucHV0RGlhbG9nX2luaXRpYWxWYWx1ZT1JbWFnZSBQYXRoCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TaG93TGlua2VkRWxlbWVudGluTGlicmFyeVZpZXc9UyZob3cgTGlua2VkIEVsZW1lbnQgaW4gTGlicmFyeSBWaWV3Ci1Qcm9jZXNzRWRpdG9yX3VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb25fbGFiZWw9VXBkYXRlIFN1cHByZXNzaW9uIGZyb20gJkJhc2UKLVByb2Nlc3NFZGl0b3JfQ29udGV4dE1lbnVfRGlhZ3JhbUltYWdlcz1EaWFncmFtIEltYWdlcwotCi0jU3RyaW5ncyBmb3Igc3luY2hyb25pemF0aW9uIHdpemFyZCBvbiBwcm9jZXNzIGVkaXRvcidzIEJTCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RpdGxlPVN5bmNocm9uaXphdGlvbiBEZXNjcmlwdGlvbgotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90ZXh0PVJlYWQgdGhlIGluZm9ybWF0aW9uIGJlbG93IFwKLXRoYXQgZXhwbGFpbnMgd2hhdCBjdXN0b20gc3luY2hyb25pemF0aW9uIHdpbGwgYWNjb21wbGlzaC4KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RpdGxlPVNlbGVjdCBDb25maWd1cmF0aW9uCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0PVNlbGVjdCB0aGUgY29uZmlndXJhdGlvbiBcCi10aGF0IHlvdSB3YW50IHRvIHVzZSBmb3IgdGhlIHN5bmNocm9uaXphdGlvbi4gIFlvdXIgc2VsZWN0aW9uIGRldGVybWluZXMgd2hpY2ggY29udHJpYnV0aW9ucyBhbmQgcmVwbGFjZW1lbnRzIHdpbGwgYmUgdXNlZCBmb3IgdGhlIHN5bmNocm9uaXphdGlvbi4KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX2NvbmZpZ0xhYmVsPUNvbmZpZ3VyYXRpb246Ci1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGl0bGU9U2VsZWN0IFByb3BlcnRpZXMgdG8gU3luY2hyb25pemUKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcm9wZXJ0aWVzX2xhYmxlPVByb3BlcnRpZXMKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9uYW1lX2xhYmxlPU5hbWUKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmVzZW50YXRpb25OYW1lX2xhYmxlPVByZXNlbnRhdGlvbiBOYW1lCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYnJpZWZEZXNjX2xhYmxlPUJyaWVmIERlc2NyaXB0aW9uCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3B0aW9uYWxJbm91dHNfbGFiZWw9T3B0aW9uYWwgSW5wdXRzCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbWFuZGF0b3J5SW5wdXRzX2xhYmxlPU1hbmRhdG9yeSBJbnB1dHMKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9vdXRwdXRzX2xhYmVsPU91dHB1dHMKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX2xhYmVsPVByaW1hcnkgUGVyZm9ybWVyCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYWRkblBlcmZvcm1lcnNfbGFibGU9QWRkaXRpb25hbCBQZXJmb3JtZXJzCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcmVzcG9uc2libGVSb2xlc19sYWJsZT1SZXNwb25zaWJsZSBSb2xlcwotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2NvbnRuQXJ0aWZhY3RzX2xhYmVsPUNvbnRhaW5lZCBBcnRpZmFjdHMKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9kaWx2ZWRQYXJ0c19sYWJlbD1EZWxpdmVyYWJsZSBQYXJ0cwotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3NlbFN0ZXBzX2xhYmVsPVN0ZXBzIFNlbGVjdGlvbgotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RleHQ9Q2hvb3NlIHRoZSBwcm9wZXJ0aWVzIG9mIFwKLXRoZSBtZXRob2QgY29udGVudCB0aGF0IHlvdSB3YW50IHRvIGJlIGNvbnNpZGVyZWQgZm9yIHN5bmNocm9uaXphdGlvbi4KLXN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90aXRsZT1TeW5jaHJvbml6YXRpb24gUHJldmlldwotc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RleHQ9UmV2aWV3IHRoZSBwcm9wb3NlZCBzeW5jaHJvbml6YXRpb24gZGV0YWlscyBiZWxvdy4KLXNlbGVjdEVkaXRvcnNUb0Rpc2NhcmRDb25mbGljdENoYW5nZXM9VGhlcmUgYXJlIHVuc2F2ZWQgY2hhbmdlcyB0aGF0IGNvbmZsaWN0IHdpdGggY2hhbmdlcyBtYWRlIG91dHNpZGUgdGhlIGVkaXRvcnMuXG5TZWxlY3QgdGhlIGVkaXRvcnMgeW91IHdpc2ggdG8gZGlzY2FyZCB0aGVpciBjaGFuZ2VzLgotc3luY2hyb25pemF0aW9uV2l6YXJkX3RpdGxlX3RleHQ9U3luY2hyb25pemF0aW9uIFdpemFyZAotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV9leHBsYWluVGV4dD1UaGlzIHdpemFyZCBzdXBwb3J0cyB5b3UgaW4gcmVmcmVzaGluZyBcCi10aGUgc2VsZWN0ZWQgZGVzY3JpcHRvcnMgb3IgYWxsIGRlc2NyaXB0b3JzIGJlbG93IHRoZSBzZWxlY3RlZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIG1hcmtlZCBhcyBcCi0iU3luY2hyb25pemUgd2l0aCBTb3VyY2UiIGluIHRoZSBHZW5lcmFsIHRhYiBvZiB0aGVpciBQcm9wZXJ0aWVzIHZpZXcuICBPbmx5IHRoZSBwcm9wZXJ0aWVzIHRoYXQgeW91IFwKLXNlbGVjdCBpbiB0aGlzIHdpemFyZCBhcmUgcmVmcmVzaGVkIGluIHRoZSBkZXNjcmlwdG9ycy4gIFlvdSBjYW4gYWxzbyBzZWxlY3QgYW55IHZhbGlkIGNvbmZpZ3VyYXRpb24gXAotZm9yIHlvdXIgcHJvY2VzcyB0byBiZSB1c2VkIHdoZW4gY29tcHV0aW5nIHRoZSByZWZyZXNoLiAgTm90ZSB0aGF0IHRoZSB3aXphcmQgd2lsbCBub3QgdXBkYXRlIGFueSBcCi1keW5hbWljYWxseSBsaW5rZWQgKGdyZWVuIGl0YWxpYykgZGVzY3JpcHRvcnMuCi0KLW9wZW5SVEU9T3BlbiByaWNoIHRleHQgZWRpdG9yCi1jbG9zZVJURT1DbG9zZSByaWNoIHRleHQgZWRpdG9yCi0KLSNOZXcgU3RyaW5ncwotcm9sZXNldHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIHJvbGUgc2V0LgotZGlzY2lwbGluZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIGRpc2NpcGxpbmUuCi13b3JrcHJvZHVjdHR5cGVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyB3b3JrIHByb2R1Y3Qga2luZC4KLWRvbWFpbnNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIGRvbWFpbi4KLXRvb2xzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyB0b29sLgotY3VzdG9tY2F0ZWdvcnlfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIGN1c3RvbSBjYXRlZ29yeS4KLQotY29uY2VwdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgY29uY2VwdC4KLWNoZWNrbGlzdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgY2hlY2tsaXN0LgotZXhhbXBsZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgZXhhbXBsZS4KLWd1aWRlbGluZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgZ3VpZGVsaW5lLgotcm9hZG1hcF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgcm9hZG1hcC4KLXJldXNhYmxlYXNzZXRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIHJldXNhYmxlIGFzc2V0Lgotc3VwcG9ydGluZ21hdGVyaWFsX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyBzdXBwb3J0aW5nIG1hdGVyaWFsLgotcmVwb3J0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyByZXBvcnQuCi1wcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgcHJhY3RpY2UuCi10ZW1wbGF0ZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgdGVtcGxhdGUuCi10ZXJtZGVmaW5pdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgdGVybSBkZWZpbml0aW9uLgotdG9vbG1lbnRvcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgdG9vbCBtZW50b3IuCi13aGl0ZXBhcGVyX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyB3aGl0ZXBhcGVyLgotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbi4KLQotI05ldyBTdHJpbmcgU2VjdGlvbiBEZXNjcmlwdGlvbgotcm9sZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvbGUuCi1yb2xlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvbGUuCi1yb2xlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgcm9sZSByZWxhdGVzIHRvIGFub3RoZXIgcm9sZS4KLXJvbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcm9sZS4KLQotdGFza19kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhc2suCi10YXNrX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhc2suCi10YXNrX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgdGFzayByZWxhdGVzIHRvIGFub3RoZXIgdGFzay4KLXRhc2tfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFzay4KLQotYXJ0aWZhY3RfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhcnRpZmFjdC4KLWFydGlmYWN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGFydGlmYWN0LgotYXJ0aWZhY3RfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGFydGlmYWN0LgotYXJ0aWZhY3Rfbm90YXRpb25TZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZWxpdmVyeSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGFydGlmYWN0LgotYXJ0aWZhY3RfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPVByb3ZpZGUgdGFpbG9yaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYXJ0aWZhY3QuCi1hcnRpZmFjdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGFydGlmYWN0IHJlbGF0ZXMgdG8gYW5vdGhlciBhcnRpZmFjdC4KLWFydGlmYWN0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGFydGlmYWN0LgotCi1vdXRjb21lX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgb3V0Y29tZS4KLW91dGNvbWVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgb3V0Y29tZS4KLW91dGNvbWVfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIG91dGNvbWUuCi1vdXRjb21lX25vdGF0aW9uU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGVsaXZlcnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBvdXRjb21lLgotb3V0Y29tZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9UHJvdmlkZSB0YWlsb3JpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBvdXRjb21lLgotb3V0Y29tZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIG91dGNvbWUgcmVsYXRlcyB0byBhbm90aGVyIG91dGNvbWUuCi1vdXRjb21lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG91dGNvbWUuCi0KLWRlbGl2ZXJhYmxlX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGVsaXZlcmFibGUuCi1kZWxpdmVyYWJsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkZWxpdmVyYWJsZS4KLWRlbGl2ZXJhYmxlX2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIHRoZSBpY29ucyBmb3IgdGhpcyBkZWxpdmVyYWJsZS4KLWRlbGl2ZXJhYmxlX25vdGF0aW9uU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGVsaXZlcnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkZWxpdmVyYWJsZS4KLWRlbGl2ZXJhYmxlX3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1Qcm92aWRlIHRhaWxvcmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRlbGl2ZXJhYmxlLgotZGVsaXZlcmFibGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyBkZWxpdmVyYWJsZSByZWxhdGVzIHRvIGFub3RoZXIgZGVsaXZlcmFibGUuCi1kZWxpdmVyYWJsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkZWxpdmVyYWJsZS4KLQotZGlzY2lwbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRpc2NpcGxpbmUuCi1kaXNjaXBsaW5lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRpc2NpcGxpbmUuCi1kaXNjaXBsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgZGlzY2lwbGluZSByZWxhdGVzIHRvIGFub3RoZXIgZGlzY2lwbGluZS4KLWRpc2NpcGxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGlzY2lwbGluZS4KLQotZG9tYWluX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZG9tYWluLgotZG9tYWluX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRvbWFpbi4KLWRvbWFpbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGRvbWFpbiByZWxhdGVzIHRvIGFub3RoZXIgZG9tYWluLgotZG9tYWluX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRvbWFpbi4KLQotd29ya3Byb2R1Y3R0eXBlX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgd29yayBwcm9kdWN0IGtpbmQuCi13b3JrcHJvZHVjdHR5cGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgd29yayBwcm9kdWN0IGtpbmQuCi13b3JrcHJvZHVjdHR5cGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyB3b3JrIHByb2R1Y3Qga2luZCByZWxhdGVzIHRvIGFub3RoZXIgd29yayBwcm9kdWN0IGtpbmQuCi13b3JrcHJvZHVjdHR5cGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgd29yayBwcm9kdWN0IGtpbmQuCi0KLXJvbGVzZXRfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2xlIHNldC4KLXJvbGVzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcm9sZSBzZXQuCi1yb2xlc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgcm9sZSBzZXQgcmVsYXRlcyB0byBhbm90aGVyIHJvbGUgc2V0Lgotcm9sZXNldF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2xlIHNldC4KLQotdG9vbF9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRvb2wuCi10b29sX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRvb2wuCi10b29sX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgdG9vbCByZWxhdGVzIHRvIGFub3RoZXIgdG9vbC4KLXRvb2xfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdG9vbC4KLQotY29uY2VwdF9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbmNlcHQuCi1jb25jZXB0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbmNlcHQuCi1jb25jZXB0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgY29uY2VwdCByZWxhdGVzIHRvIGFub3RoZXIgY29uY2VwdC4KLWNvbmNlcHRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29uY2VwdC4KLQotY2hlY2tsaXN0X2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY2hlY2tsaXN0LgotY2hlY2tsaXN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNoZWNrbGlzdC4KLWNoZWNrbGlzdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGNoZWNrbGlzdCByZWxhdGVzIHRvIGFub3RoZXIgY2hlY2tsaXN0LgotY2hlY2tsaXN0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNoZWNrbGlzdC4KLQotZXhhbXBsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGV4YW1wbGUuCi1leGFtcGxlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGV4YW1wbGUuCi1leGFtcGxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgZXhhbXBsZSByZWxhdGVzIHRvIGFub3RoZXIgZXhhbXBsZS4KLWV4YW1wbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZXhhbXBsZS4KLQotZ3VpZGVsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZ3VpZGVsaW5lLgotZ3VpZGVsaW5lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGd1aWRlbGluZS4KLWd1aWRlbGluZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGd1aWRlbGluZSByZWxhdGVzIHRvIGFub3RoZXIgZ3VpZGVsaW5lLgotZ3VpZGVsaW5lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGd1aWRlbGluZS4KLQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb24uCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb24uCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbiByZWxhdGVzIHRvIGFub3RoZXIgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9uLgotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9uLgotCi1wcmFjdGljZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHByYWN0aWNlLgotcHJhY3RpY2VfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcHJhY3RpY2UuCi1wcmFjdGljZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHByYWN0aWNlIHJlbGF0ZXMgdG8gYW5vdGhlciBwcmFjdGljZS4KLXByYWN0aWNlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHByYWN0aWNlLgotCi1yZXBvcnRfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByZXBvcnQuCi1yZXBvcnRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcmVwb3J0LgotcmVwb3J0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgcmVwb3J0IHJlbGF0ZXMgdG8gYW5vdGhlciByZXBvcnQuCi1yZXBvcnRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcmVwb3J0LgotCi1yZXN1YWJsZWFzc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcmV1c2FibGUgYXNzZXQuCi1yZXN1YWJsZWFzc2V0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJldXNhYmxlIGFzc2V0LgotcmVzdWFibGVhc3NldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHJldXNhYmxlIGFzc2V0IHJlbGF0ZXMgdG8gYW5vdGhlciByZXVzYWJsZSBhc3NldC4KLXJlc3VhYmxlYXNzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcmV1c2FibGUgYXNzZXQuCi0KLXJvYWRtYXBfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2FkbWFwLgotcm9hZG1hcF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2FkbWFwLgotcm9hZG1hcF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHJvYWRtYXAgcmVsYXRlcyB0byBhbm90aGVyIHJvYWRtYXAuCi1yb2FkbWFwX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvYWRtYXAuCi0KLXN1cHBvcnRpbmdtYXRlcmlhbF9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHN1cHBvcnRpbmcgbWF0ZXJpYWwuCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc3VwcG9ydGluZyBtYXRlcmlhbC4KLXN1cHBvcnRpbmdtYXRlcmlhbF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHN1cHBvcnRpbmcgbWF0ZXJpYWwgcmVsYXRlcyB0byBhbm90aGVyIHN1cHBvcnRpbmcgbWF0ZXJpYWwuCi1zdXBwb3J0aW5nbWF0ZXJpYWxfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc3VwcG9ydGluZyBtYXRlcmlhbC4KLQotdGVtcGxhdGVfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0ZW1wbGF0ZS4KLXRlbXBsYXRlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRlbXBsYXRlLgotdGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyB0ZW1wbGF0ZSByZWxhdGVzIHRvIGFub3RoZXIgdGVtcGxhdGUuCi10ZW1wbGF0ZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0ZW1wbGF0ZS4KLQotdGVybWRlZmluaXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0ZXJtIGRlZmluaXRpb24uCi10ZXJtZGVmaW5pdGlvbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0ZXJtIGRlZmluaXRpb24uCi10ZXJtZGVmaW5pdGlvbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHRlcm0gZGVmaW5pdGlvbiByZWxhdGVzIHRvIGFub3RoZXIgdGVybSBkZWZpbml0aW9uLgotdGVybWRlZmluaXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGVybSBkZWZpbml0aW9uLgotCi10b29sbWVudG9yX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdG9vbCBtZW50b3IuCi10b29sbWVudG9yX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRvb2wgbWVudG9yLgotdG9vbG1lbnRvcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHRvb2wgbWVudG9yIHJlbGF0ZXMgdG8gYW5vdGhlciB0b29sIG1lbnRvci4KLXRvb2xtZW50b3JfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdG9vbCBtZW50b3IuCi0KLXdoaXRlcGFwZXJfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB3aGl0ZXBhcGVyLgotd2hpdGVwYXBlcl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB3aGl0ZXBhcGVyLgotd2hpdGVwYXBlcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHdoaXRlcGFwZXIgcmVsYXRlcyB0byBhbm90aGVyIHdoaXRlcGFwZXIuCi13aGl0ZXBhcGVyX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHdoaXRlcGFwZXIuCi0KLWRpc2NpcGxpbmVncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRpc2NpcGxpbmUgZ3JvdXBpbmcuCi1kaXNjaXBsaW5lZ3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGlzY2lwbGluZSBncm91cGluZy4KLWRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGRpc2NpcGxpbmUgZ3JvdXBpbmcgcmVsYXRlcyB0byBhbm90aGVyIGRpc2NpcGxpbmUgZ3JvdXBpbmcuCi1kaXNjaXBsaW5lZ3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGlzY2lwbGluZSBncm91cGluZy4KLQotcm9sZXNldGdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcm9sZXNldCBncm91cGluZy4KLXJvbGVzZXRncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2xlc2V0IGdyb3VwaW5nLgotcm9sZXNldGdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgcm9sZXNldCBncm91cGluZyByZWxhdGVzIHRvIGFub3RoZXIgcm9sZXNldCBncm91cGluZy4KLXJvbGVzZXRncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2xlc2V0IGdyb3VwaW5nLgotCi1jdXN0b21jYXRlZ29yeV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGN1c3RvbSBjYXRlZ29yeS4KLWN1c3RvbWNhdGVnb3J5X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGN1c3RvbSBjYXRlZ29yeS4KLWN1c3RvbWNhdGVnb3J5X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgY3VzdG9tIGNhdGVnb3J5IHJlbGF0ZXMgdG8gYW5vdGhlciBjdXN0b20gY2F0ZWdvcnkuCi1jdXN0b21jYXRlZ29yeV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjdXN0b20gY2F0ZWdvcnkuCi1jdXN0b21jYXRlZ29yeV9JY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgY3VzdG9tIGNhdGVnb3J5LgotCi1wbHVnaW5fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbWV0aG9kIHBsdWctaW4uCi1wbHVnaW5fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbWV0aG9kIHBsdWctaW4uCi0KLWNvbmNlcHRfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGNvbmNlcHQuCi1jaGVja2xpc3RfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGNoZWNrbGlzdC4KLXRvb2xtZW50b3JfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHRvb2wgbWVudG9yLgotd2hpdGVwYXBlcl9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgd2hpdGVwYXBlci4KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIHRoZSBpY29ucyBmb3IgdGhpcyBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb24uCi10ZXJtZGVmaW5pdGlvbl9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgdGVybSBkZWZpbml0aW9uLgotdGVtcGxhdGVfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHRlbXBsYXRlLgotcmV1c2FibGVhc3NldF9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgcmV1c2FibGUgYXNzZXQuCi1yZXBvcnRfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHJlcG9ydC4KLXByYWN0aWNlX2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIHRoZSBpY29ucyBmb3IgdGhpcyBwcmFjdGljZS4KLWV4YW1wbGVfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGV4YW1wbGUuCi1ndWlkZWxpbmVfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGd1aWRlbGluZS4KLXJvYWRtYXBfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHJvYWRtYXAuCi1zdXBwb3J0aW5nbWF0ZXJpYWxfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHN1cHBvcnRpbmcgbWF0ZXJpYWwuCi0KLXB1Ymxpc2hfY2F0ZWdvcmllc190ZXh0PVB1Ymxpc2ggdGhpcyBjYXRlZ29yeSB3aXRoIHRoZSBjYXRlZ29yaXplZCBtZXRob2QgZWxlbWVudHMuCi1lZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY190aXRsZT1GaWxlIENoYW5nZWQKLWVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX21lc3NhZ2U9VGhlIGZpbGUgaGFzIGJlZW4gY2hhbmdlZCBvbiB0aGUgZmlsZSBzeXN0ZW0uIERvIHlvdSB3YW50IHRvIGxvYWQgdGhlIGNoYW5nZXM/Ci0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlPUFjdGl2aXR5IFZhcmlhYmlsaXR5Ci0KLXZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlPVZhcmlhYmlsaXR5Ci0KLWNpcmN1bGFyX2RlcGVuZGVuY3lfZXJyb3JfdGl0bGU9Q2lyY3VsYXIgZGVwZW5kZW5jeQotCi1hcHBseV9wYXR0ZXJuX2Vycm9yX3RpdGxlPUFwcGx5IFBhdHRlcm4KLWFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnPUFjdGl2aXR5ICcnezB9JycgY2Fubm90IGFwcGx5IHBhdHRlcm4gd2l0aCAnJ3sxfScnIHNpbmNlIGl0IHdpbGwgcmVzdWx0IGluIGNpcmN1bGFyIGRlcGVuZGVuY3kuCi0KLSNzZXQgZGVmYXVsdCBoaXN0b3J5IHNpemUKLWRlZmF1bHRfbGlzdF9sZW5ndGhfbGFiZWw9UHJlZmVyZW5jZSBoaXN0b3J5IHNpemU6Ci0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzX1Rhc2s9U3VwcHJlc3MgJlRhc2tzCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxfVGFzaz1SZXZlYWwgJlRhc2tzCi0KLSNFeHRlbmQgU2VtYW50aWNzIHByZWZlcmVuY2UgY2hlY2sKLWV4dGVuZF9zZW1hbnRpY3NfYnV0dG9uX3RleHQ9VXNlIG5ldyAmRXh0ZW5kcyBzZW1hbnRpY3MKLWV4dGVuZF9zZW1hbnRpY3NfdGV4dD1FeHRlbmRpbmcgZWxlbWVudHMgb3ZlcnJpZGUgdG8tbWFueSByZWxhdGlvbnNoaXBzIGluc3RlYWQgb2YgYWRkaW5nIHRvIHRoZSBpbmhlcml0ZWQgZWxlbWVudHMuCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEVQRiAxLjIgTkwgc3RyaW5ncy4KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgTGF5b3V0IEFjdGlvbiBncm91cAotIyBOb3RlOiBNbmVtb25pY3MgZG8gbm90IHdvcmsgb24gdGhlc2UKLUxheW91dEFjdGlvbkdyb3VwX2xhYmVsPU1ldGhvZCBQbHVnLWluIFByZXNlbnRhdGlvbgotTGF5b3V0QWN0aW9uR3JvdXBfZmxhdExheW91dEFjdGlvbl9sYWJlbD1GbGF0Ci1MYXlvdXRBY3Rpb25Hcm91cF9oaWVyYXJjaGljYWxMYXlvdXRBY3Rpb25fbGFiZWw9SGllcmFyY2hpY2FsCi0KLVZhbGlkYXRlX21ldGhvZF9saWJyYXJ5PVZhbGlkYXRlIE1ldGhvZCBMaWJyYXJ5Ci0KLU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3Jfc2hvd093bmVySW5MaWJyYXJ5Vmlldz1TaG93IG93bmVyIG9mIHRoaXMgdW5yZXNvbHZlZCByZWZlcmVuY2UgaW4gTGlicmFyeSB2aWV3Ci1NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3JlbW92ZVVucmVzb2x2ZWRSZWZlcmVuY2U9UmVtb3ZlIHRoaXMgdW5yZXNvbHZlZCByZWZlcmVuY2UKLXByb21wdERlbGV0ZUN1c3RvbUNhdGVnb3J5QmVmb3JlUmVtb3ZlTGFzdFJlZlRvSXQ9WW91IGFyZSBhYm91dCB0byByZW1vdmUgdGhlIGxhc3QgcmVmZXJlbmNlIHRvIHswfSBpbiB0aGUgcGx1Zy1pbi4gVGhlIGVsZW1lbnQocykgd2lsbCBiZSBkZWxldGVkLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLQotQ29uZmlndXJhdGlvbk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3JfcmVzb2x2ZU1pc3NpbmdSZWZlcmVuY2U9QWRkIHJlZmVyZW5jZQotCi1kZWZhdWx0TGlua1R5cGVQcmVmTGFiZWw9Q2hvb3NlIHRoZSBkZWZhdWx0IGVsZW1lbnQgbGluayB0eXBlIHdoZW4gZHJhZ2dpbmcgZnJvbSB0aGUgTGlicmFyeSB2aWV3LgotcHJvbXB0Q3JlYXRlTmV3RGlhZ3JhbUZpbGVfbXNnPU5vIGRpYWdyYW0gZmlsZSBleGlzdHMgZm9yIHRoaXMgcHJvY2Vzcy4gRG8geW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IG9uZT8KLU5ld0RpYWdyYW1GaWxlX3RpdGxlPU5ldyBEaWFncmFtIEZpbGUKLUl0ZW1zRmlsdGVyRGlhbG9nX1VwZGF0ZVRyZWVKb2JfbmFtZT1VcGRhdGUgZmlsdGVyIHRyZWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvVUlBY3Rpb25EaXNwYXRjaGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1VJQWN0aW9uRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDFjNjY2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvVUlBY3Rpb25EaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuQ29udHJpYnV0aW9uU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuUGVyc3BlY3RpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBIYW5kbGVzIFVJIGFjdGlvbnMgaW4gdGhlIHdvcmtiZW5jaC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVJQWN0aW9uRGlzcGF0Y2hlciBpbXBsZW1lbnRzIElTZWxlY3Rpb25Qcm92aWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBVSUFjdGlvbkRpc3BhdGNoZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JcHJvdGVjdGVkIExpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oKTsKLQotCXByb3RlY3RlZCBMaXN0PElEb3VibGVDbGlja0xpc3RlbmVyPiBkb3VibGVDbGlja0xpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SURvdWJsZUNsaWNrTGlzdGVuZXI+KCk7Ci0KLQlwcml2YXRlIEN1cnJlbnRTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbiA9IG5ldyBDdXJyZW50U2VsZWN0aW9uKCk7Ci0KLQlwcml2YXRlIElEb3VibGVDbGlja0xpc3RlbmVyIGRvdWJsZUNsaWNrTGlzdGVuZXIgPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVUlBY3Rpb25EaXNwYXRjaGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChVSUFjdGlvbkRpc3BhdGNoZXIuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBVSUFjdGlvbkRpc3BhdGNoZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFByaXZhdGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcml2YXRlIFVJQWN0aW9uRGlzcGF0Y2hlcigpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGUgYW4gYWN0aW9uIGRpc3BhdGNoZXIgb2YgbXkgb3duCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICovCi0JcHVibGljIFVJQWN0aW9uRGlzcGF0Y2hlcihPYmplY3Qgb3duZXIpIHsKLQkJLy8gQ3JlYXRlIHRoZSBkb3VibGUgY2xpY2sgbGlzdGVuZXIgdXNlZCBmb3IgbGF1bmNoaW5nIHRoZSBNZXRob2QKLQkJLy8gZWRpdG9ycy4KLQkJZG91YmxlQ2xpY2tMaXN0ZW5lciA9IG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZSkgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJCQlJV29ya2JlbmNoUGFydFNpdGUgc2l0ZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCkKLQkJCQkJCQkuZ2V0QWN0aXZlUGFydCgpLmdldFNpdGUoKTsKLQotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQkJT2JqZWN0W10gc2VsT2JqcyA9IHNlbC50b0FycmF5KCk7Ci0JCQkJCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IG51bGw7Ci0KLQkJCQkJaWYgKChzZWxPYmpzICE9IG51bGwpICYmIChzZWxPYmpzLmxlbmd0aCA+IDApKSB7Ci0JCQkJCQkvLyBPcGVuIHRoZSBBdXRob3JpbmcgcGVyc2VwZWN0aXZlLgotCQkJCQkJVUlBY3Rpb25EaXNwYXRjaGVyLm9wZW5BdXRob3JpbmdQZXJzcGVjdGl2ZSgpOwotCi0JCQkJCQkvLyBMb2NhdGUgdGhlIHNlbGVjdGVkIE1ldGhvZCBlbGVtZW50LgotCQkJCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKHNlbE9ianNbMF0pOwotCQkJCQkJQ29uZmlndXJhdGlvblZpZXcgdmlldyA9IENvbmZpZ3VyYXRpb25WaWV3LmdldFZpZXcoKTsJCQkJCQkKLQkJCQkJCWlmICgodmlldyAhPSBudWxsICkgJiYgc2l0ZS5lcXVhbHModmlldy5nZXRTaXRlKCkpICkgewotCQkJCQkJCS8vIERvdWJsZS1jbGljayBvcmdpbmF0ZWQgZnJvbSB0aGUgQ29uZmlndXJhdGlvbgotCQkJCQkJCS8vIHZpZXcuCi0JCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iajsKLQkJCQkJCQkJQ29udHJpYnV0aW9uU2VsZWN0aW9uIGNvbnRyaWJTZWxlY3Rpb24gPSBuZXcgQ29udHJpYnV0aW9uU2VsZWN0aW9uKCk7Ci0JCQkJCQkJCXNlbGVjdGVkT2JqZWN0ID0gY29udHJpYlNlbGVjdGlvbgotCQkJCQkJCQkJCS5nZXRTZWxlY3RlZENvbnRyaWJ1dG9yKGVsZW1lbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJc2VsZWN0ZWRPYmplY3QgPSBvYmo7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChzZWxlY3RlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQkJCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLm9wZW5FZGl0b3IoCi0JCQkJCQkJCQlzZWxlY3RlZE9iamVjdCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gQWRkIGEgcGVyc3BlY3RpdmUgbGlzdGVuZXIgdG8gZW5hYmxlL2Rpc2FibGUgZG91YmxlLWNsaWNrIGxpc3RlbmluZy4KLQkJSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXb3JrYmVuY2hXaW5kb3cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmIChhY3RpdmVXb3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkgewotCQkJYWN0aXZlV29ya2JlbmNoV2luZG93Ci0JCQkJCS5hZGRQZXJzcGVjdGl2ZUxpc3RlbmVyKG5ldyBJUGVyc3BlY3RpdmVMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHBlcnNwZWN0aXZlQWN0aXZhdGVkKElXb3JrYmVuY2hQYWdlIHBhZ2UsCi0JCQkJCQkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgZGVzYykgewotCQkJCQkJCWlmIChkZXNjLmdldElkKCkuZXF1YWxzKAotCQkJCQkJCQkJQXV0aG9yaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpKSB7Ci0JCQkJCQkJCWFkZERvdWJsZUNsaWNrTGlzdGVuZXIoZG91YmxlQ2xpY2tMaXN0ZW5lcik7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihkb3VibGVDbGlja0xpc3RlbmVyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHBlcnNwZWN0aXZlQ2hhbmdlZChJV29ya2JlbmNoUGFnZSBwYWdlLAotCQkJCQkJCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGRlc2MsIFN0cmluZyBpZCkgewotCQkJCQkJfQotCQkJCQl9KTsKLQkJfQotCi0JCWlmIChQZXJzcGVjdGl2ZVV0aWwKLQkJCQkuaXNBY3RpdmVQZXJzcGVjdGl2ZShBdXRob3JpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCkpIHsKLQkJCWFkZERvdWJsZUNsaWNrTGlzdGVuZXIoZG91YmxlQ2xpY2tMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZWRpdENvbmZpZ3VyYXRpb24oU3RyaW5nIGNvbmZpZ05hbWUpIHsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGxpYnJhcnkgcGVyc3BlY3RpdmUKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkxpYnJhcnlQZXJzcGVjdGl2ZSgpIHsKLQkJUGVyc3BlY3RpdmVVdGlsLm9wZW5QZXJzcGVjdGl2ZShCcm93c2luZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKTsKLQkJSVdvcmtiZW5jaFBhZ2Ugd2tiUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJVmlld1BhcnQgdmlld1BhcnQgPSB3a2JQYWdlLmZpbmRWaWV3KExpYnJhcnlWaWV3LlZJRVdfSUQpOwotCQlpZiAodmlld1BhcnQgIT0gbnVsbCkKLQkJCXdrYlBhZ2UuaGlkZVZpZXcodmlld1BhcnQpOwotCQl2aWV3UGFydCA9IHdrYlBhZ2UuZmluZFZpZXcoQ29uZmlndXJhdGlvblZpZXcuVklFV19JRCk7Ci0JCXdrYlBhZ2UuYWN0aXZhdGUodmlld1BhcnQpOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYXV0aG9yaW5nIHBlcnNwZWN0aXZlCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5BdXRob3JpbmdQZXJzcGVjdGl2ZSgpIHsKLQkJUGVyc3BlY3RpdmVVdGlsLm9wZW5QZXJzcGVjdGl2ZShBdXRob3JpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHdrYlBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSVZpZXdQYXJ0IHZpZXdQYXJ0ID0gd2tiUGFnZS5maW5kVmlldyhMaWJyYXJ5Vmlldy5WSUVXX0lEKTsKLQkJd2tiUGFnZS5hY3RpdmF0ZSh2aWV3UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICghc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gY3VycmVudCBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBjdXJyZW50U2VsZWN0aW9uLnNlbGVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgSVNlbGVjdGlvblByb3ZpZGVyIGdldFNlbGVjdGlvblNvdXJjZSgpIHsKLQkJcmV0dXJuIGN1cnJlbnRTZWxlY3Rpb24uc291cmNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgY3VycmVudCBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2V0U2VsZWN0aW9uKHRoaXMsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBjdXJyZW50IHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uUHJvdmlkZXIgc291cmNlLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWN1cnJlbnRTZWxlY3Rpb24uc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQkJY3VycmVudFNlbGVjdGlvbi5zb3VyY2UgPSBzb3VyY2U7Ci0KLQkJCVNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc291cmNlLAotCQkJCQlzZWxlY3Rpb24pOwotCi0JCQkvLyBBdm9pZCBjb25jdXJyZW50IGVycm9yLgotCQkJTGlzdDxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPiBwcm9jZXNzZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oKTsKLQkJCXdoaWxlIChzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnNpemUoKSA+IDApIHsKLQkJCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMKLQkJCQkJCS5yZW1vdmUoMCk7Ci0JCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJCXByb2Nlc3NlZEl0ZW1zLmFkZChsaXN0ZW5lcik7Ci0JCQkJfQotCQkJfQotCi0JCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmFkZEFsbChwcm9jZXNzZWRJdGVtcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgZG91YmxlIGNsaWNrIGxpc3RlbmVyCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihJRG91YmxlQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoIWRvdWJsZUNsaWNrTGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJZG91YmxlQ2xpY2tMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBkb3VibGUgY2xpY2sgbGlzdGVuZXIKLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVEb3VibGVDbGlja0xpc3RlbmVyKElEb3VibGVDbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWRvdWJsZUNsaWNrTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIGRvdWJsZSBjbGljayBldmVudAotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZURvdWJsZUNsaWNrRXZlbnQoRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCS8vIEF2b2lkIGNvbmN1cnJlbnQgZXJyb3IuCi0JCQlMaXN0PElEb3VibGVDbGlja0xpc3RlbmVyPiBwcm9jZXNzZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8SURvdWJsZUNsaWNrTGlzdGVuZXI+KCk7Ci0JCQl3aGlsZSAoZG91YmxlQ2xpY2tMaXN0ZW5lcnMuc2l6ZSgpID4gMCkgewotCQkJCUlEb3VibGVDbGlja0xpc3RlbmVyIGxpc3RlbmVyID0gKElEb3VibGVDbGlja0xpc3RlbmVyKSBkb3VibGVDbGlja0xpc3RlbmVycwotCQkJCQkJLnJlbW92ZSgwKTsKLQkJCQl0cnkgewotCQkJCQlsaXN0ZW5lci5kb3VibGVDbGljayhldmVudCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCQlwcm9jZXNzZWRJdGVtcy5hZGQobGlzdGVuZXIpOwotCQkJfQotCQkJZG91YmxlQ2xpY2tMaXN0ZW5lcnMuYWRkQWxsKHByb2Nlc3NlZEl0ZW1zKTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBDdXJyZW50U2VsZWN0aW9uIHsKLQotCQlwdWJsaWMgSVNlbGVjdGlvblByb3ZpZGVyIHNvdXJjZSA9IG51bGw7Ci0KLQkJcHVibGljIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0Fic3RyYWN0TW92ZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0Fic3RyYWN0TW92ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDVkZTFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9BYnN0cmFjdE1vdmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogTW92ZXMgYnJlYWtkb3duIGVsZW1lbnQgaW4gYSBwcm9jZXNzIHRyZWUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNb3ZlQWN0aW9uIGV4dGVuZHMKLQkJQ29tbWFuZEFjdGlvbkhhbmRsZXIgaW1wbGVtZW50cyBJV29ya2JlbmNoUGFydEFjdGlvbiwgSU1vZGlmeWluZ0FjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgUHJvY2Vzc0VkaXRvciBlZGl0b3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RNb3ZlQWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKG51bGwsIHRleHQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIHN1cHBvcnQgbW92ZSBvbmx5IG9uZSBhY3Rpdml0eSBmb3Igbm93Ci0JCS8vCi0JCWlmKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJT2JqZWN0IGUgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXAgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBnZXRJdGVtUHJvdmlkZXIoZSk7Ci0JCQlyZXR1cm4gZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQgJiYgaXAgIT0gbnVsbCAmJiBpcC5nZXRQYXJlbnQoZSkgaW5zdGFuY2VvZiBBY3Rpdml0eTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkJCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBzdXBwb3J0IG1vdmUgb25seSBvbmUgYWN0aXZpdHkgZm9yIG5vdwotCQkvLwotCQlpZihhY2NlcHQoc2VsZWN0aW9uKSkgewotCQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElCU0l0ZW1Qcm92aWRlciBnZXRJdGVtUHJvdmlkZXIoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYoZG9tYWluIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9ICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKWRvbWFpbikuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCU9iamVjdCBpcCA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZihpcCBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiAoSUJTSXRlbVByb3ZpZGVyKSBpcDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjY3JlYXRlQ29tbWFuZChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBlbGVtZW50ID0gc2VsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJQlNJdGVtUHJvdmlkZXIgaXAgPSBnZXRJdGVtUHJvdmlkZXIoZWxlbWVudCk7Ci0JCWlmKGlwICE9IG51bGwpIHsKLQkJCU9iamVjdCBwYXJlbnQgPSAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcilpcCkuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJCXJldHVybiBjcmVhdGVNb3ZlQ29tbWFuZCgoQWN0aXZpdHkpcGFyZW50LCBlbGVtZW50LCBpcC5nZXRFQ2xhc3NlcygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJCi0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBDb21tYW5kIGNyZWF0ZU1vdmVDb21tYW5kKEFjdGl2aXR5IGFjdCwgT2JqZWN0IGVsZW1lbnQsIENvbGxlY3Rpb248RUNsYXNzPiBlQ2xhc3Nlcyk7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JV29ya2JlbmNoUGFydEFjdGlvbiNzZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVdvcmtiZW5jaFBhcnQoSVdvcmtiZW5jaFBhcnQgd29ya2JlbmNoUGFydCkgewotCQlpZih3b3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgSUVkaXRpbmdEb21haW5Qcm92aWRlcikgewotCQkJZG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKXdvcmtiZW5jaFBhcnQpLmdldEVkaXRpbmdEb21haW4oKTsKLQkJfQotCQlpZih3b3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgUHJvY2Vzc0VkaXRvcikgewotCQkJZWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpIHdvcmtiZW5jaFBhcnQ7Ci0JCX0JCQotCQllbHNlIGlmKHdvcmtiZW5jaFBhcnQgPT0gbnVsbCkgewotCQkJZWRpdG9yID0gbnVsbDsKLQkJfQotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIHN1cGVyUnVuKCkgewotCQlzdXBlci5ydW4oKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGVkaXRvci5nZXRFZGl0b3JTaXRlKCkKLQkJCQkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlzdXBlclJ1bigpOwotCQkJCQl9Ci0JCQkKLQkJfSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUluZm9BY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9BY3Rpdml0eURldGFpbERpYWdyYW1JbmZvQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMjYyMmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUluZm9BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkFEREluZm9EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogQWN0aW9uIHRvIHNob3cgdGhlIEFEREluZm9EaWFsb2csIHRvIHNob3cgdGhlIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbXMKLSAqIGluIHRoZSBwcm9jZXNzLiBOb3QgaW4gdXNlLgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURldGFpbERpYWdyYW1JbmZvQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQotCXByb3RlY3RlZCBPYmplY3Qgc2VsZWN0ZWQ7Ci0JCi0JcHVibGljIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUluZm9BY3Rpb24oKSB7Ci0JCXN1cGVyKCJBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBJbmZvIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQkKLQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgQURERmlsdGVyKG51bGwsIG51bGwsIG51bGwpOwotCQkKLQkJQURESW5mb0RpYWxvZyBmZCA9IG5ldyBBRERJbmZvRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBnZXRPYmplY3QoKSwgIkFjdGl2aXR5IiwgLy8kTk9OLU5MUy0xJAotCQkJCW51bGwpOwotCi0JCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlmZC5zZXRUaXRsZSgiQWN0aXZpdHkiKTsgLy8kTk9OLU5MUy0xJAotCQlmZC5vcGVuKCk7Ci0JCUxpc3QgbGlzdCA9IGZkLmdldFNlbGVjdGVkSXRlbXMoKTsKLQkJCi0JCXRyeSB7Ci0JCQlJRWRpdG9yUGFydCBwYXJlbnQgPSBnZXRQYWdleCgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5FZGl0b3JJbnB1dCgKLQkJCQkJbGlzdC5nZXQoMCksIFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKChQcm9jZXNzKWdldE9iamVjdCgpKSk7Ci0JCQlJRWRpdG9yUGFydCBwYXJ0ID0gZ2V0UGFnZXgoKS5vcGVuRWRpdG9yKGlucHV0LAotCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IuY2xhc3MKLQkJCQkJLmdldE5hbWUoKSk7Ci0JCQlpZiAocGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCUFic3RyYWN0RGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoQWJzdHJhY3REaWFncmFtRWRpdG9yKSBwYXJ0OwotCQkJCWVkaXRvci5zZXRQYXJlbnRFZGl0b3IocGFyZW50KTsKLQkJCX0KLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCWV4Y2VwdGlvbik7Ci0JCX0KLQkJLy8gb3BlbiBlZGl0b3IKLQotCQlzdXBlci5ydW4oKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKXsKLQkJcmV0dXJuIHNlbGVjdGVkOwotCX0KLQkKLQlwdWJsaWMgSVdvcmtiZW5jaFBhZ2UgZ2V0UGFnZXgoKXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzRW5hYmxlZCgpOwotCX0KLQlwdWJsaWMgY2xhc3MgQURERmlsdGVyIGV4dGVuZHMgRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIgewotCQlwdWJsaWMgQURERmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBWaWV3ZXIgdmlld2VyLCBTdHJpbmcgZmlsdGVyU3RyKSB7Ci0JCQlzdXBlcihtZXRob2RDb25maWcsIHZpZXdlciwgZmlsdGVyU3RyKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQlpZihvYmogaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgcmV0dXJuIHRydWU7Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIGQgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFVNQURpYWdyYW0oKEFjdGl2aXR5KSBvYmosIEdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0sIGZhbHNlKTsKLQkJCQlpZihkICE9IG51bGwgKSByZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9Db25maWd1cmF0aW9uVmlld0VkaXRBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9Db25maWd1cmF0aW9uVmlld0VkaXRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ3MGVhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQ29uZmlndXJhdGlvblZpZXdFZGl0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlBlcnNwZWN0aXZlTGlzdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5VSUFjdGlvbkRpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkNvbnRyaWJ1dGlvblNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQmFzZVNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOwotCi0KLS8qKgotICogRWRpdHMgYW4gZWxlbWVudCBpbiB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblZpZXdFZGl0QWN0aW9uIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uIHsKLQotCS8qKgotCSAqIFRoZSBJRCBmb3IgdGhpcyBhY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0lEID0gQ29uZmlndXJhdGlvblZpZXdFZGl0QWN0aW9uLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3RlZDsKLQotCXByaXZhdGUgQ29udHJpYnV0aW9uU2VsZWN0aW9uIGNvbnRyaWJ1dG9yU2VsZWN0b3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uVmlld0VkaXRBY3Rpb24oU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIodGV4dCk7Ci0JCWNvbnRyaWJ1dG9yU2VsZWN0b3IgPSBuZXcgQ29udHJpYnV0aW9uU2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlBcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGVkLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmplY3RzLm5leHQoKSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCU9iamVjdCBvYmogPSBjb250cmlidXRvclNlbGVjdG9yCi0JCQkJCQkuZ2V0U2VsZWN0ZWRDb250cmlidXRvcigoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50KTsKLQkJCQlpZiAob2JqICE9IG51bGwpCi0JCQkJCWVsZW1lbnRMaXN0LmFkZChvYmopOwotCQkJfSBlbHNlIHsKLQkJCQllbGVtZW50TGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZWxlbWVudExpc3Quc2l6ZSgpIDwgMSkKLQkJCXJldHVybjsKLQotCQlpZiAoUGVyc3BlY3RpdmVMaXN0VXRpbC5pc0Jyb3dzaW5nUGVyc3BlY3RpdmUoKSkgewotCQkJVUlBY3Rpb25EaXNwYXRjaGVyLm9wZW5BdXRob3JpbmdQZXJzcGVjdGl2ZSgpOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gZWxlbWVudExpc3QuaXRlcmF0b3IoKTsgb2JqZWN0cy5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IG9iamVjdHMubmV4dCgpOwotCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLm9wZW5FZGl0b3IoZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoaXMgYWN0aW9uIGluIHJlc3BvbnNlIHRvIHRoZSBnaXZlbiBzZWxlY3Rpb24gY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNlbGVjdGVkID0gc2VsZWN0aW9uOwotCi0JCWJvb2xlYW4gZW5hYmxlVGhlTWVudSA9IHRydWU7Ci0KLQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBvYmplY3RzLm5leHQoKTsKLQkJCU9iamVjdCByZWFsT2JqID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQlpZiAoIShyZWFsT2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkpIHsKLQkJCQllbmFibGVUaGVNZW51ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKChyZWFsT2JqIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKQotCQkJCQl8fCAocmVhbE9iaiBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSkgewotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmICgocmVhbE9iaiBpbnN0YW5jZW9mIFBoYXNlKQotCQkJCQl8fCAocmVhbE9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KQotCQkJCQl8fCAocmVhbE9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSkgewotCQkJCWVuYWJsZVRoZU1lbnUgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBlbmFibGVUaGVNZW51OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0NyZWF0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQ3JlYXRlTWV0aG9kRWxlbWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE4MWU2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQ3JlYXRlTWV0aG9kRWxlbWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLklFZGl0b3JLZWVwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5WaWV3SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkNvbW1hbmRTdGF0dXNDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5DcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIENyZWF0ZXMgYSBuZXcgTWV0aG9kIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGV4dGVuZHMgQ29tbWFuZFdyYXBwZXIgaW1wbGVtZW50cwotCQlDb21tYW5kQWN0aW9uRGVsZWdhdGUgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ3JlYXRlTWV0aG9kRWxlbWVudENvbW1hbmQoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXN1cGVyKGNvbW1hbmQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVsb2FkQ3VycmVudExpYnJhcnlPblJvbGxiYWNrRXJyb3IoKSB7Ci0JCVZpZXdIZWxwZXIucmVsb2FkQ3VycmVudExpYmFyeU9uUm9sbGJhY2tFcnJvcihudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlciNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlDb21tYW5kIGNtZCA9IFRuZ1V0aWwudW53cmFwKHRoaXMpOwotCi0JCXN1cGVyLmV4ZWN1dGUoKTsKLQotCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIENyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9ICgoQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQpIGNvbW1hbmQpCi0JCQkJCS5nZXRTdGF0dXMoKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkgewotCQkJCWlmIChDb21tYW5kU3RhdHVzQ2hlY2tlci5oYXNSb2xsYmFja0Vycm9yKHN0YXR1cykpIHsJCQkJCQotCQkJCQlyZWxvYWRDdXJyZW50TGlicmFyeU9uUm9sbGJhY2tFcnJvcigpOwotCQkJCX0gZWxzZSBpZiAoIUNvbW1hbmRTdGF0dXNDaGVja2VyLmhhc1NhdmVFcnJvcihzdGF0dXMpKSB7Ci0JCQkJCWRpc3BsYXlFcnJvcihzdGF0dXMpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQljbWQgPSB0aGlzOwotCi0JCQl3aGlsZSAoY21kIGluc3RhbmNlb2YgQ29tbWFuZFdyYXBwZXIKLQkJCQkJJiYgIShjbWQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCkpIHsKLQkJCQljbWQgPSAoKENvbW1hbmRXcmFwcGVyKSBjbWQpLmdldENvbW1hbmQoKTsKLQkJCX0KLQotCQkJaWYgKGNtZCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKSB7Ci0JCQkJTWV0aG9kRWxlbWVudEFkZENvbW1hbmQgYWRkQ21kID0gKChNZXRob2RFbGVtZW50QWRkQ29tbWFuZCkgY21kKTsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IGFkZENtZC5nZXRTdGF0dXMoKTsKLQkJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJaWYgKENvbW1hbmRTdGF0dXNDaGVja2VyLmhhc1JvbGxiYWNrRXJyb3Ioc3RhdHVzKSkgewotCQkJCQkJcmVsb2FkQ3VycmVudExpYnJhcnlPblJvbGxiYWNrRXJyb3IoKTsKLQkJCQkJfSBlbHNlIGlmICghQ29tbWFuZFN0YXR1c0NoZWNrZXIuaGFzU2F2ZUVycm9yKHN0YXR1cykpIHsKLQkJCQkJCWRpc3BsYXlFcnJvcihzdGF0dXMpOwotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlDb2xsZWN0aW9uPD8+IHJlc3VsdCA9IGdldENvbW1hbmQoKS5nZXRSZXN1bHQoKTsKLQkJZm9yIChPYmplY3QgbyA6IHJlc3VsdCkgewotCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKG8pOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QgJiYgKChFT2JqZWN0KSBvYmopLmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQkJLy8gT3BlbiB0aGUgZWRpdG9yIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBlbGVtZW50LgotCQkJCUlFZGl0b3JLZWVwZXIuUkVGRVJFTkNFLmdldEVkaXRvcktlZXBlcigpLm9wZW5FZGl0b3Iob2JqKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyI2NhblVuZG8oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZEFjdGlvbkRlbGVnYXRlI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKCkgewotCQlDb21tYW5kQWN0aW9uRGVsZWdhdGUgY21kID0gKENvbW1hbmRBY3Rpb25EZWxlZ2F0ZSkgZ2V0Q29tbWFuZCgpOwotCQlyZXR1cm4gY21kLmdldEltYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRBY3Rpb25EZWxlZ2F0ZSNnZXRUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCUNvbW1hbmRBY3Rpb25EZWxlZ2F0ZSBjbWQgPSAoQ29tbWFuZEFjdGlvbkRlbGVnYXRlKSBnZXRDb21tYW5kKCk7Ci0JCXJldHVybiBjbWQuZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kQWN0aW9uRGVsZWdhdGUjZ2V0VG9vbFRpcFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCUNvbW1hbmRBY3Rpb25EZWxlZ2F0ZSBjbWQgPSAoQ29tbWFuZEFjdGlvbkRlbGVnYXRlKSBnZXRDb21tYW5kKCk7Ci0JCXJldHVybiBjbWQuZ2V0VG9vbFRpcFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5IGFuIGVycm9yIGRpYWxvZy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwbGF5RXJyb3IoSVN0YXR1cyBzdGF0dXMpIHsKLQkJaW50IHNldmVyaXR5ID0gc3RhdHVzLmdldFNldmVyaXR5KCk7Ci0JCWlmIChzZXZlcml0eSA9PSBJU3RhdHVzLkVSUk9SIHx8IHNldmVyaXR5ID09IElTdGF0dXMuV0FSTklORykgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXkoCi0JCQkJCWdldExhYmVsKCksCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX2NyZWF0ZUVycm9yCi0JCQkJCSwgc3RhdHVzKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0RpYWdyYW1QcmludEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0RpYWdyYW1QcmludEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjQ4ZDRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9EaWFncmFtUHJpbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnByaW50LlByaW50R3JhcGhpY2FsVmlld2VyT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLlByaW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLlByaW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy5QcmludGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy5QcmludGVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiAKLSAqIFByaW50IGRpYWdyYW0KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVByaW50QWN0aW9uIGV4dGVuZHMgUHJpbnRBY3Rpb24gewotCi0JR3JhcGhpY2FsVmlld2VyIHZpZXdlcjsKLQkvKioKLQkgKiBAcGFyYW0gcGFydAotCSAqLwotCXB1YmxpYyBEaWFncmFtUHJpbnRBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCwgR3JhcGhpY2FsVmlld2VyIHZpZXdlcikgewotCQlzdXBlcihwYXJ0KTsKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JfQotCQotCS8qIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuUHJpbnRBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCS8vR3JhcGhpY2FsVmlld2VyIHZpZXdlcjsKLQkJUHJpbnREaWFsb2cgZGlhbG9nID0gbmV3IFByaW50RGlhbG9nKHZpZXdlci5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwgU1dULk5VTEwpOwotCQlQcmludGVyRGF0YSBkYXRhID0gZGlhbG9nLm9wZW4oKTsKLQkJCi0JCWlmIChkYXRhICE9IG51bGwpIHsKLQkJCVByaW50R3JhcGhpY2FsVmlld2VyT3BlcmF0aW9uIG9wID0gCi0JCQkJCQluZXcgUHJpbnRHcmFwaGljYWxWaWV3ZXJPcGVyYXRpb24obmV3IFByaW50ZXIoZGF0YSksIHZpZXdlcik7Ci0JCQlvcC5ydW4oZ2V0V29ya2JlbmNoUGFydCgpLmdldFRpdGxlKCkpOwotCQl9Ci0JCXN1cGVyLnJ1bigpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgZ3JhcGhpY2FsIHZpZXdlcgotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXIoR3JhcGhpY2FsVmlld2VyIHZpZXdlcikgewotCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGdyYXBoaWNhbCB2aWV3ZXIKLQkgKiBAcmV0dXJuIHZpZXdlcgotCSAqLwotCXB1YmxpYyBHcmFwaGljYWxWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9JTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZGE1NDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSBMaWJyYXJ5IHZpZXcgYWN0aW9uIGJhciBjb250cmlidXRvci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMKLQkJSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQotCXB1YmxpYyBJVmlld1BhcnQgZ2V0QWN0aXZlVmlldygpOwotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlVmlldyhJVmlld1BhcnQgcGFydCk7Ci0KLQlwdWJsaWMgdm9pZCBzaGFyZUdsb2JhbEFjdGlvbnMoSVBhZ2UgcGFnZSwgSUFjdGlvbkJhcnMgYWN0aW9uQmFycyk7Ci0KLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKTsKLQotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKTsKLQotCXB1YmxpYyB2b2lkIGRpc2FibGVHbG9iYWxFZGl0TWVudSgpOwotCi0JcHVibGljIHZvaWQgZW5hYmxlR2xvYmFsRWRpdE1lbnUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lNb2RpZnlpbmdBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9JTW9kaWZ5aW5nQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MTM0NWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lNb2RpZnlpbmdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kaWZ5aW5nQWN0aW9uIGV4dGVuZHMgSUFjdGlvbiB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9JV29ya2JlbmNoUGFydEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lXb3JrYmVuY2hQYXJ0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExY2IwMmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lXb3JrYmVuY2hQYXJ0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIHdvcmtiZW5jaCBwYXJ0Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIAotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJV29ya2JlbmNoUGFydEFjdGlvbiB7Ci0Jdm9pZCBzZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KElXb3JrYmVuY2hQYXJ0IHdvcmtiZW5jaFBhcnQpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0luZGVudEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0luZGVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTM0NGJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9JbmRlbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBJbmRlbnRzIGJyZWFrZG93biBlbGVtZW50cyBpbiBhIHByb2Nlc3MgdHJlZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmRlbnRBY3Rpb24gZXh0ZW5kcwotCQlDb21tYW5kQWN0aW9uSGFuZGxlciBpbXBsZW1lbnRzIElXb3JrYmVuY2hQYXJ0QWN0aW9uLCBJTW9kaWZ5aW5nQWN0aW9uIHsKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW5kZW50Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzIElSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0JCQotCQlwcml2YXRlIENvbGxlY3Rpb248QnJlYWtkb3duRWxlbWVudD4gZWxlbWVudHM7Ci0JCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0JCXByaXZhdGUgU2V0IG1vZGlmaWVkUmVzb3VyY2VzOwotCQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudDsKLQkJcHJpdmF0ZSBBY3Rpdml0eSBvbGRQYXJlbnQ7Ci0JCXByaXZhdGUgQWN0aXZpdHkgbmV3UGFyZW50OwotCQlwcml2YXRlIGludCBvbGRJbmRleDsKLQkJcHJpdmF0ZSBNYXA8V29ya0JyZWFrZG93bkVsZW1lbnQsIFdvcmtPcmRlcj4gY2lyY3VsYXJXb3JrT3JkZXJzOwotCi0JCXB1YmxpYyBJbmRlbnRDb21tYW5kKENvbGxlY3Rpb248QnJlYWtkb3duRWxlbWVudD4gY29sbGVjdGlvbiwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJCXRoaXMuZWxlbWVudHMgPSBjb2xsZWN0aW9uOwotCQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCQkJc2V0TGFiZWwoTEFCRUwpOwotCQl9Ci0KLQkJcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCQlpZihtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQkJUHJvY2VzcyBwcm9jID0gbnVsbDsKLQkJCQlmb3IgKEl0ZXJhdG9yPEJyZWFrZG93bkVsZW1lbnQ+IGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBwcm9jID09IG51bGwgJiYgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IGl0ZXIubmV4dCgpOwotCQkJCQlwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGUpOwotCQkJCX0KLQkJCQlpZihwcm9jICE9IG51bGwpIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBwcm9jLmVSZXNvdXJjZSgpOwotCQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQltb2RpZmllZFJlc291cmNlcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbihwcm9jLmVSZXNvdXJjZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzID0gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCQllbGVtZW50ID0gZWxlbWVudHMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQlvbGRQYXJlbnQgPSBlbGVtZW50LmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJaWYob2xkUGFyZW50ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlvbGRJbmRleCA9IG9sZFBhcmVudC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmluZGV4T2YoZWxlbWVudCk7Ci0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXAgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvbGRQYXJlbnQsIAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJTGlzdDxPYmplY3Q+IGNoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8T2JqZWN0PihpcC5nZXRDaGlsZHJlbihvbGRQYXJlbnQpKTsKLQkJCWludCBpbmRleCA9IGNoaWxkcmVuLmluZGV4T2YoZWxlbWVudCk7Ci0JCQlpZihpbmRleCA+IDApIHsKLQkJCQlPYmplY3QgcHJldiA9IGNoaWxkcmVuLmdldChpbmRleCAtIDEpOwotCQkJCWlmKHByZXYgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQluZXdQYXJlbnQgPSAoQWN0aXZpdHkpIHByZXY7Ci0JCQkJCXJldHVybiBEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRm9yTW92aW5nVmFyaWFiaWxpdHlFbGVtZW50KG5ld1BhcmVudCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKGVsZW1lbnQpLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJbmV3UGFyZW50LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGVsZW1lbnQpOwotCQkJCi0JCQkvLyByZW1vdmUgY2lyY3VsYXIgd29yayBvcmRlcnMKLQkJCS8vCi0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlpZihjaXJjdWxhcldvcmtPcmRlcnMgPT0gbnVsbCkgewotCQkJCQljaXJjdWxhcldvcmtPcmRlcnMgPSBuZXcgSGFzaE1hcDxXb3JrQnJlYWtkb3duRWxlbWVudCwgV29ya09yZGVyPigpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY2lyY3VsYXJXb3JrT3JkZXJzLmNsZWFyKCk7Ci0JCQkJfQotCQkJCVdvcmtPcmRlciB3byA9IFVtYVV0aWwuZmluZFdvcmtPcmRlcihuZXdQYXJlbnQsIGVsZW1lbnQpOwotCQkJCWlmKHdvICE9IG51bGwpIHsJCi0JCQkJCW5ld1BhcmVudC5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLnJlbW92ZSh3byk7Ci0JCQkJCWNpcmN1bGFyV29ya09yZGVycy5wdXQobmV3UGFyZW50LCB3byk7Ci0JCQkJfQotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHdiZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudDsKLQkJCQl3byA9IFVtYVV0aWwuZmluZFdvcmtPcmRlcih3YmUsIG5ld1BhcmVudCk7Ci0JCQkJaWYod28gIT0gbnVsbCkgewotCQkJCQl3YmUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5yZW1vdmUod28pOwotCQkJCQljaXJjdWxhcldvcmtPcmRlcnMucHV0KHdiZSwgd28pOwotCQkJCX0KLQkJCX0JCQkKLQkJCQotCQkJLy8gbW92ZSB0aGUgcHJvY2VzcyBwYWNha2dlIG9mIHRoZSBhY3Rpdml0eSB0byBuZXcgcGFyZW50IHBhY2thZ2UKLQkJCS8vCi0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwYXJlbnRQa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIG5ld1BhcmVudC5lQ29udGFpbmVyKCk7Ci0JCQkJcGFyZW50UGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKE1ldGhvZFBhY2thZ2UpIGVsZW1lbnQuZUNvbnRhaW5lcigpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCQlleGVjdXRlKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkJaWYoY2lyY3VsYXJXb3JrT3JkZXJzICE9IG51bGwgJiYgIWNpcmN1bGFyV29ya09yZGVycy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKE1hcC5FbnRyeTxXb3JrQnJlYWtkb3duRWxlbWVudCwgV29ya09yZGVyPiBlbnRyeSA6IGNpcmN1bGFyV29ya09yZGVycy5lbnRyeVNldCgpKSB7Ci0JCQkJCWVudHJ5LmdldEtleSgpLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuYWRkKGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCX0KLQkJCQljaXJjdWxhcldvcmtPcmRlcnMuY2xlYXIoKTsKLQkJCX0KLQkJCW9sZFBhcmVudC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChvbGRJbmRleCwgZWxlbWVudCk7CQkJCi0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwYXJlbnRQa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIG9sZFBhcmVudC5lQ29udGFpbmVyKCk7Ci0JCQkJcGFyZW50UGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKE1ldGhvZFBhY2thZ2UpIGVsZW1lbnQuZUNvbnRhaW5lcigpKTsKLQkJCX0KLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJCXJldHVybiBlbGVtZW50czsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX0luZGVudDsKLQotCXByaXZhdGUgUHJvY2Vzc0VkaXRvciBlZGl0b3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwdWJsaWMgSW5kZW50QWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKG51bGwsIHRleHQpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICoKLQkgKi8KLQlwdWJsaWMgSW5kZW50QWN0aW9uKCkgewotCQl0aGlzKExBQkVMKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0lOREVOVCk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0lOREVOVCk7Ci0JCXNldFRvb2xUaXBUZXh0KExBQkVMKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBzdXBwb3J0IGluZGVudCBvbmx5IG9uZSBhY3Rpdml0eSBmb3Igbm93Ci0JCS8vCi0JCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0JCWlmKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJT2JqZWN0IGUgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZihlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlyZXQgPSBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsJCQkJCi0JCQl9Ci0JCX0KLQkJc2V0RW5hYmxlZChyZXQpOwotCQlyZXR1cm4gcmV0OwotCQkKLQkJLy9UT0RPOiBzdXBwb3J0IGluZGVudCBtdWx0aXBsZSBhY3Rpdml0aWVzIGluIHNlbGVjdGlvbgotLy8JCUFycmF5TGlzdDxBY3Rpdml0eT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHk+KCk7Ci0vLwkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotLy8JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLS8vCQkJCWxpc3QuYWRkKChBY3Rpdml0eSkgZWxlbWVudCk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJaWYobGlzdC5pc0VtcHR5KCkpIHsKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLS8vCQlyZXR1cm4gc3VwZXIudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGxpc3QpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjY3JlYXRlQ29tbWFuZChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmKGRvbWFpbiBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJcmV0dXJuIG5ldyBJbmRlbnRDb21tYW5kKHNlbGVjdGlvbiwgKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pZG9tYWluKS5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJfQotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9CQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuSVdvcmtiZW5jaFBhcnRBY3Rpb24jc2V0QWN0aXZlV29ya2JlbmNoUGFydChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KElXb3JrYmVuY2hQYXJ0IHdvcmtiZW5jaFBhcnQpIHsKLQkJaWYod29ya2JlbmNoUGFydCBpbnN0YW5jZW9mIElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIHsKLQkJCWRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcil3b3JrYmVuY2hQYXJ0KS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCX0KLQkJaWYod29ya2JlbmNoUGFydCBpbnN0YW5jZW9mIFByb2Nlc3NFZGl0b3IpIHsKLQkJCWVkaXRvciA9IChQcm9jZXNzRWRpdG9yKSB3b3JrYmVuY2hQYXJ0OwotCQl9CQkKLQkJZWxzZSBpZih3b3JrYmVuY2hQYXJ0ID09IG51bGwpIHsKLQkJCWVkaXRvciA9IG51bGw7Ci0JCX0KLQl9CQotCQotCXByaXZhdGUgdm9pZCBzdXBlclJ1bigpIHsKLQkJc3VwZXIucnVuKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJc3VwZXJSdW4oKTsKLQkJCQkJfQotCQkJCi0JCX0pOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MYXlvdXRBY3Rpb25Hcm91cC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xheW91dEFjdGlvbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNjdiYWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xheW91dEFjdGlvbkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlBsdWdpblVJUGFja2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiAKLSAqIENvZGUgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucGFja2FnZXZpZXcuTGF5b3V0QWN0aW9uR3JvdXAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXRBY3Rpb25Hcm91cCBleHRlbmRzIE11bHRpQWN0aW9uR3JvdXAgewotCi0JcHVibGljIExheW91dEFjdGlvbkdyb3VwKExpYnJhcnlWaWV3IGxpYlZpZXcpIHsKLQkJc3VwZXIoY3JlYXRlQWN0aW9ucyhsaWJWaWV3KSwgZ2V0U2VsZWN0ZWRTdGF0ZShsaWJWaWV3KSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQWN0aW9uR3JvdXAjZmlsbEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlzdXBlci5maWxsQWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKLQkJY29udHJpYnV0ZVRvVmlld01lbnUoYWN0aW9uQmFycy5nZXRNZW51TWFuYWdlcigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbnRyaWJ1dGVUb1ZpZXdNZW51KElNZW51TWFuYWdlciB2aWV3TWVudSkgewotCQl2aWV3TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQotCQkvLyBDcmVhdGUgbGF5b3V0IHN1YiBtZW51Ci0JCQotCQlJTWVudU1hbmFnZXIgbGF5b3V0U3ViTWVudT0gbmV3IE1lbnVNYW5hZ2VyKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkxheW91dEFjdGlvbkdyb3VwX2xhYmVsKTsgCi0JCWZpbmFsIFN0cmluZyBsYXlvdXRHcm91cE5hbWU9ICJsYXlvdXQiOyAvLyROT04tTkxTLTEkCi0JCVNlcGFyYXRvciBtYXJrZXI9IG5ldyBTZXBhcmF0b3IobGF5b3V0R3JvdXBOYW1lKTsKLQotCQl2aWV3TWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQl2aWV3TWVudS5hZGQobWFya2VyKTsKLQkJdmlld01lbnUuYXBwZW5kVG9Hcm91cChsYXlvdXRHcm91cE5hbWUsIGxheW91dFN1Yk1lbnUpOwotCQl2aWV3TWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUysiLWVuZCIpKTsvLyROT04tTkxTLTEkCQkKLQkJYWRkQWN0aW9ucyhsYXlvdXRTdWJNZW51KTsKLQl9Ci0KLQlzdGF0aWMgaW50IGdldFNlbGVjdGVkU3RhdGUoTGlicmFyeVZpZXcgbGliVmlldykgewotCQlpZiAoUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5JTlNUQU5DRS5pc0ZsYXRMYXlvdXQoKSkKLQkJCXJldHVybiAwOwotCQllbHNlCi0JCQlyZXR1cm4gMTsKLQl9Ci0JCi0Jc3RhdGljIElBY3Rpb25bXSBjcmVhdGVBY3Rpb25zKExpYnJhcnlWaWV3IGxpYlZpZXcpIHsKLQkJSUFjdGlvbiBmbGF0TGF5b3V0QWN0aW9uPSBuZXcgTGF5b3V0QWN0aW9uKGxpYlZpZXcsIHRydWUpOwotCQlmbGF0TGF5b3V0QWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuTGF5b3V0QWN0aW9uR3JvdXBfZmxhdExheW91dEFjdGlvbl9sYWJlbCk7IAotCQlmbGF0TGF5b3V0QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSUltYWdlcy5JTUdfREVTQ19MQVlPVVRfRkxBVCk7Ci0JCUlBY3Rpb24gaGllcmFyY2hpY2FsTGF5b3V0PSBuZXcgTGF5b3V0QWN0aW9uKGxpYlZpZXcsIGZhbHNlKTsKLQkJaGllcmFyY2hpY2FsTGF5b3V0LnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuTGF5b3V0QWN0aW9uR3JvdXBfaGllcmFyY2hpY2FsTGF5b3V0QWN0aW9uX2xhYmVsKTsKLQkJaGllcmFyY2hpY2FsTGF5b3V0LnNldEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSUltYWdlcy5JTUdfREVTQ19MQVlPVVRfSElFUkFSQ0hJQ0FMKTsKLQkJCi0JCXJldHVybiBuZXcgSUFjdGlvbltde2ZsYXRMYXlvdXRBY3Rpb24sIGhpZXJhcmNoaWNhbExheW91dH07Ci0JfQotfQotCi1jbGFzcyBMYXlvdXRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uIHsKLQotCXByaXZhdGUgYm9vbGVhbiBmSXNGbGF0TGF5b3V0OwotCXByaXZhdGUgTGlicmFyeVZpZXcgZmxpYlZpZXc7Ci0KLQlwdWJsaWMgTGF5b3V0QWN0aW9uKExpYnJhcnlWaWV3IGxpYlZpZXcsIGJvb2xlYW4gZmxhdCkgewotCQlzdXBlcigiIiwgQVNfUkFESU9fQlVUVE9OKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZJc0ZsYXRMYXlvdXQ9IGZsYXQ7Ci0JCWZsaWJWaWV3PSBsaWJWaWV3OwotCQlpZiAoZklzRmxhdExheW91dCkKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywgQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTEFZT1VUX0ZMQVRfQUNUSU9OKTsKLQkJZWxzZQotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLCBBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MQVlPVVRfSElFUkFSQ0hJQ0FMX0FDVElPTik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5JTlNUQU5DRS5pc0ZsYXRMYXlvdXQoKSAhPSBmSXNGbGF0TGF5b3V0KSB7Ci0JCQlQbHVnaW5VSVBhY2thZ2VDb250ZXh0LklOU1RBTkNFLnRvZ2dsZUxheW91dCgpOwotCQkJLy8gc2F2ZSBzdGF0ZQotCQkJQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLnNldExheW91dChQbHVnaW5VSVBhY2thZ2VDb250ZXh0LklOU1RBTkNFLmdldExheW91dEFzU3RyaW5nKCkpOwotCQl9Ci0JCWZsaWJWaWV3LmdldFZpZXdlcigpLmdldENvbnRyb2woKS5zZXRSZWRyYXcoZmFsc2UpOwotCQlmbGliVmlldy5nZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JCWZsaWJWaWV3LmdldFZpZXdlcigpLmdldENvbnRyb2woKS5zZXRSZWRyYXcodHJ1ZSk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NTNmOTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db3B5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5QYXN0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uUmVkb0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVW5kb0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uTGlicmFyeUVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3ViQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotCi0vKioKLSAqIFRoZSBMaWJyYXJ5IHZpZXcgYWN0aW9uIGJhciBjb250cmlidXRvci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzCi0JCUVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciBpbXBsZW1lbnRzCi0JCUlMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCi0JLy8gS2VlcCB0cmFjayBvZiB0aGUgYWN0aXZlIGVkaXRvci4KLQlwcm90ZWN0ZWQgSVZpZXdQYXJ0IGFjdGl2ZVZpZXdQYXJ0OwotCi0JLy8gS2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gcHJvdmlkZXIuCi0JcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcjsKLQotCXByb3RlY3RlZCBJQWN0aW9uQmFycyB2aWV3QWN0aW9uQmFyczsKLQotCS8vIExpYnJhcnkgdmlldyBlZGl0IGFjdGlvbgotCXByb3RlY3RlZCBMaWJyYXJ5Vmlld0VkaXRBY3Rpb24gbGlicmFyeVZpZXdFZGl0QWN0aW9uOwotCi0JLy8gQ29uZmlndXJhdGlvbiB2aWV3IGVkaXQgYWN0aW9uCi0JcHJvdGVjdGVkIENvbmZpZ3VyYXRpb25WaWV3RWRpdEFjdGlvbiBjb25maWdWaWV3RWRpdEFjdGlvbjsKLQotCXByaXZhdGUgRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOwotCQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBQcm9wZXJ0aWVzIHZpZXcuCi0JICovCi0JcHJvdGVjdGVkIElBY3Rpb24gc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtKSB7IAotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCXRyeSB7Ci0JCQkJCWdldFBhZ2UoKS5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudmlld3MuUHJvcGVydHlTaGVldCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSB2aWV3ZXIgb2YgdGhlIGN1cnJlbnQgZWRpdG9yIGlmIHRoZSBlZGl0b3IgaW1wbGVtZW50cwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXJ9LgotCSAqLwotCXByb3RlY3RlZCBJQWN0aW9uIHJlZnJlc2hWaWV3ZXJBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtKSB7IAotCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQlyZXR1cm4gYWN0aXZlVmlld1BhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXI7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAoYWN0aXZlVmlld1BhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsKLQkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpIGFjdGl2ZVZpZXdQYXJ0KS5nZXRWaWV3ZXIoKTsKLQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQkJcmVmcmVzaFZpZXdlcih2aWV3ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvCi0JICogZWFjaCBkZXNjcmlwdG9yIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGNyZWF0ZUNoaWxkQWN0aW9uczsKLQotCS8qKgotCSAqIFRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yCi0JICogQ3JlYXRlQ2hpbGQgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXI7Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGNvcnJlc3BvbmRpbmcKLQkgKiB0byBlYWNoIGRlc2NyaXB0b3IgZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0KLQkgKiBwcm92aWRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjcmVhdGVTaWJsaW5nQWN0aW9uczsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZQotCSAqIGFkZGVkIGZvciBDcmVhdGVTaWJsaW5nIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IoRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluKSB7Ci0JCXRoaXMuZWRpdGluZ0RvbWFpbiA9IGVkaXRpbmdEb21haW47Ci0JCQotCQl2YWxpZGF0ZUFjdGlvbiA9IG5ldyBMaWJyYXJ5VmFsaWRhdGVBY3Rpb24oKTsKLQkJKChMaWJyYXJ5VmFsaWRhdGVBY3Rpb24pdmFsaWRhdGVBY3Rpb24pLnB1dENvbnRleHREYXRhKExpYnJhcnlFVmFsaWRhdG9yLkNUWF9BREFQVEVSX0ZBQ1RPUllfUFJPVklERVIsCi0JCQkJUHJvY2Vzc0VkaXRvci5hZGFwdGVyRmFjdG9yeVByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpZXdlcihWaWV3ZXIgdmlld2VyKSB7Ci0JCXZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBTZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zIHRvIHRoZSB0b29sIGJhci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigibWV0aG9kLXNldHRpbmdzIikpOyAvLyROT04tTkxTLTEkCi0JCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJtZXRob2QtYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQWRkcyB0byB0aGUgbWVudSBiYXIgYSBtZW51IGFuZCBzb21lIHNlcGFyYXRvcnMgZm9yIGVkaXRvcgotCSAqIGFkZGl0aW9ucywgYXMgd2VsbCBhcyB0aGUgc3ViLW1lbnVzIGZvciBvYmplY3QgY3JlYXRpb24gaXRlbXMuCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51TWFuYWdlcik7Ci0KLQkJSU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9NZXRob2RFZGl0b3JfbWVudSwgImNvbS5pYm0ubWV0aG9kTWVudUlEIik7IC8vJE5PTi1OTFMtMSQgIAotCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCi0JCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJzZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAotCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWN0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMtZW5kIikpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlQ2hpbGQgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgotCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0pOyAKLQkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFByZXBhcmUgZm9yIENyZWF0ZVNpYmxpbmcgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgotCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtKTsgCi0JCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEZvcmNlIGFuIHVwZGF0ZSBiZWNhdXNlIEVjbGlwc2UgaGlkZXMgZW1wdHkgbWVudXMgbm93LgotCQlzdWJtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCQkJbWVudU1hbmFnZXIudXBkYXRlQWxsKHRydWUpOwotCQkJfQotCQl9KTsKLQotCQlhZGRHbG9iYWxBY3Rpb25zKHN1Ym1lbnVNYW5hZ2VyKTsKLQl9Ci0KLQlwdWJsaWMgSVZpZXdQYXJ0IGdldEFjdGl2ZVZpZXcoKSB7Ci0JCXJldHVybiBhY3RpdmVWaWV3UGFydDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVWaWV3KElWaWV3UGFydCBwYXJ0KSB7Ci0JCS8vIFRPRE8gLSBtYXkgbmVlZCB0byBjaGVjayBvdGhlciBtZXRob2QKLQkJaWYgKHBhcnQgIT0gbnVsbCkKLQkJCXN1cGVyLnNldEFjdGl2ZVZpZXcocGFydCk7Ci0JCWlmIChwYXJ0ID09IGFjdGl2ZVZpZXdQYXJ0KQotCQkJcmV0dXJuOwotCQlpZiAoYWN0aXZlVmlld1BhcnQgIT0gbnVsbCkgewotCQkJZGVhY3RpdmF0ZSgpOwotCQl9Ci0JCWlmIChwYXJ0ID09IG51bGwpIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyID0gbnVsbDsKLQkJfQotCQlpZiAoIShwYXJ0IGluc3RhbmNlb2YgSUVkaXRpbmdEb21haW5Qcm92aWRlcikpCi0JCQlyZXR1cm47Ci0JCWFjdGl2ZVZpZXdQYXJ0ID0gcGFydDsKLQkJZWRpdGluZ0RvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgcGFydCkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCi0JCS8vIFN3aXRjaCB0byB0aGUgbmV3IHNlbGVjdGlvbiBwcm92aWRlci4KLQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJfSBlbHNlIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyID0gcGFydC5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCQkJLy8gRmFrZSBhIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50IHRvIHVwZGF0ZSB0aGUgbWVudXMuCi0JCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCkgewotCQkJCXNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChzZWxlY3Rpb25Qcm92aWRlciwKLQkJCQkJCXNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKSk7Ci0JCQl9Ci0JCX0KLQotCQlhY3RpdmF0ZSgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJYWN0aXZlVmlld1BhcnQucmVtb3ZlUHJvcGVydHlMaXN0ZW5lcih0aGlzKTsKLQotCQlkZWxldGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQkJY3V0QWN0aW9uLnNldEVkaXRpbmdEb21haW4obnVsbCk7Ci0JCWNvcHlBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQkJcGFzdGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQkJdW5kb0FjdGlvbi5zZXRFZGl0aW5nRG9tYWluKG51bGwpOwotCQlyZWRvQWN0aW9uLnNldEVkaXRpbmdEb21haW4obnVsbCk7Ci0KLQkJaWYgKGxvYWRSZXNvdXJjZUFjdGlvbiAhPSBudWxsKSB7Ci0JCQlsb2FkUmVzb3VyY2VBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQkJfQotCi0JCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZVZpZXdQYXJ0IGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlVmlld1BhcnQKLQkJCQk6IGFjdGl2ZVZpZXdQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlzZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZGVsZXRlQWN0aW9uKTsKLQkJc2VsZWN0aW9uUHJvdmlkZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpYnJhcnlWaWV3RWRpdEFjdGlvbik7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihjdXRBY3Rpb24pOwotCQlzZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoY29weUFjdGlvbik7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihwYXN0ZUFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzYWJsZUdsb2JhbEVkaXRNZW51KCkgewotCQlkZWxldGVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWlmIChsaWJyYXJ5Vmlld0VkaXRBY3Rpb24gIT0gbnVsbCkKLQkJCWxpYnJhcnlWaWV3RWRpdEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJaWYgKGNvbmZpZ1ZpZXdFZGl0QWN0aW9uICE9IG51bGwpCi0JCQljb25maWdWaWV3RWRpdEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3V0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQljb3B5QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlwYXN0ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJdW5kb0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVkb0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmFibGVHbG9iYWxFZGl0TWVudSgpIHsKLQkJZGVsZXRlQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWlmIChsaWJyYXJ5Vmlld0VkaXRBY3Rpb24gIT0gbnVsbCkKLQkJCWxpYnJhcnlWaWV3RWRpdEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlpZiAoY29uZmlnVmlld0VkaXRBY3Rpb24gIT0gbnVsbCkKLQkJCWNvbmZpZ1ZpZXdFZGl0QWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWN1dEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQljb3B5QWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXBhc3RlQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXVuZG9BY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmVkb0FjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciNhY3RpdmF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCWFjdGl2ZVZpZXdQYXJ0LmFkZFByb3BlcnR5TGlzdGVuZXIodGhpcyk7Ci0JCQotCQlkZWxldGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQkJY3V0QWN0aW9uLnNldEVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbik7Ci0JCWNvcHlBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQkJcGFzdGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQkJdW5kb0FjdGlvbi5zZXRFZGl0aW5nRG9tYWluKGVkaXRpbmdEb21haW4pOwotCQlyZWRvQWN0aW9uLnNldEVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbik7Ci0KLQkJaWYgKGxvYWRSZXNvdXJjZUFjdGlvbiAhPSBudWxsKSB7Ci0JCQlsb2FkUmVzb3VyY2VBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQkJfQotCi0JCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZVZpZXdQYXJ0IGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlVmlld1BhcnQKLQkJCQk6IGFjdGl2ZVZpZXdQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZGVsZXRlQWN0aW9uKTsKLQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpYnJhcnlWaWV3RWRpdEFjdGlvbik7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihjdXRBY3Rpb24pOwotCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoY29weUFjdGlvbik7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihwYXN0ZUFjdGlvbik7Ci0JCWlmICh2YWxpZGF0ZUFjdGlvbiAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodmFsaWRhdGVBY3Rpb24pOwotCQl9Ci0KLQkJaWYgKGNvbnRyb2xBY3Rpb24gIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGNvbnRyb2xBY3Rpb24pOwotCQl9ICAgICAgCQkKLQotCQl1cGRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IjdXBkYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCWlmIChhY3RpdmVWaWV3UGFydCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZVZpZXdQYXJ0IGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlVmlld1BhcnQKLQkJCQk6IGFjdGl2ZVZpZXdQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gPyAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbgotCQkJCTogU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQotCQlkZWxldGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQlsaWJyYXJ5Vmlld0VkaXRBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQljdXRBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQljb3B5QWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJcGFzdGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQl1bmRvQWN0aW9uLnVwZGF0ZSgpOwotCQlyZWRvQWN0aW9uLnVwZGF0ZSgpOwotCi0JCWlmIChsb2FkUmVzb3VyY2VBY3Rpb24gIT0gbnVsbCkgewotCQkJbG9hZFJlc291cmNlQWN0aW9uLnVwZGF0ZSgpOwotCQl9Ci0KLQkJaWYgKHZhbGlkYXRlQWN0aW9uICE9IG51bGwpIHsKLQkJCXZhbGlkYXRlQWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9LCBoYW5kbGluZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudH0gYnkgcXVlcnlpbmcgZm9yCi0JICogdGhlIGNoaWxkcmVuIGFuZCBzaWJsaW5ncyB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgc2VsZWN0ZWQgb2JqZWN0IGFuZAotCSAqIHVwZGF0aW5nIHRoZSBtZW51cyBhY2NvcmRpbmdseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkvLyBSZW1vdmUgYW55IG1lbnUgaXRlbXMgZm9yIG9sZCBzZWxlY3Rpb24uCi0JCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucyk7Ci0JCX0KLQkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zKTsKLQkJfQotCi0JCS8vIFF1ZXJ5IHRoZSBuZXcgc2VsZWN0aW9uIGZvciBhcHByb3ByaWF0ZSBuZXcgY2hpbGQvc2libGluZyBkZXNjcmlwdG9ycwotCQlDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMgPSBudWxsOwotCi0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbgotCQkJCSYmICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuc2l6ZSgpID09IDEpIHsKLQkJCU9iamVjdCBvYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQkJRWRpdGluZ0RvbWFpbiBkb21haW4gPSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIGFjdGl2ZVZpZXdQYXJ0KQotCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCi0JCQluZXdDaGlsZERlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMob2JqZWN0LCBudWxsKTsKLQkJfQotCi0JCS8vIEdlbmVyYXRlIGFjdGlvbnMgZm9yIHNlbGVjdGlvbjsgcG9wdWxhdGUgYW5kIHJlZHJhdyB0aGUgbWVudXMuCi0JCWNyZWF0ZUNoaWxkQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQkJc2VsZWN0aW9uKTsKLQotCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKLQkJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufQotCSAqIGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sIGFuZCByZXR1cm5zIHRoZQotCSAqIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLAotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQ29sbGVjdGlvbiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJYWN0aW9ucy5hZGQobmV3IE1ldGhvZENyZWF0ZUNoaWxkQWN0aW9uKGVkaXRpbmdEb21haW4sCi0JCQkJCQlzZWxlY3Rpb24sIGkubmV4dCgpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZW5lcmF0ZXMgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gZm9yIGVhY2gKLQkgKiBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LCBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZgotCSAqIHRoZXNlIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLAotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQ29sbGVjdGlvbiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJYWN0aW9ucy5hZGQobmV3IE1ldGhvZENyZWF0ZVNpYmxpbmdBY3Rpb24oYWN0aXZlVmlld1BhcnQsCi0JCQkJCQlzZWxlY3Rpb24sIGkubmV4dCgpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBwb3B1bGF0ZXMgdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMgYmFzZWQgb24gdGhlCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZQotCSAqIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24sIGJ5IGluc2VydGluZyB0aGVtIGJlZm9yZSB0aGUgc3BlY2lmaWVkCi0JICogY29udHJpYnV0aW9uIGl0ZW0gPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+LiBJZiA8Y29kZT5JRDwvY29kZT4gaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiwgdGhleSBhcmUgc2ltcGx5IGFkZGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLAotCQkJQ29sbGVjdGlvbiBhY3Rpb25zLCBTdHJpbmcgY29udHJpYnV0aW9uSUQpIHsKLQkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gYWN0aW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlJQWN0aW9uIGFjdGlvbiA9IChJQWN0aW9uKSBpLm5leHQoKTsKLQkJCQlpZiAoY29udHJpYnV0aW9uSUQgIT0gbnVsbCkgewotCQkJCQltYW5hZ2VyLmluc2VydEJlZm9yZShjb250cmlidXRpb25JRCwgYWN0aW9uKTsKLQkJCQl9IGVsc2UgewotCQkJCQltYW5hZ2VyLmFkZChhY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgcmVtb3ZlcyBmcm9tIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMgYmFzZWQgb24gdGhlCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZQotCSAqIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwKLQkJCUNvbGxlY3Rpb24gYWN0aW9ucykgewotCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7Ci0JCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWFuYWdlci5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCS8vIExvb2sgaW50byBTdWJDb250cmlidXRpb25JdGVtcwotCQkJCUlDb250cmlidXRpb25JdGVtIGNvbnRyaWJ1dGlvbkl0ZW0gPSBpdGVtc1tpXTsKLQkJCQl3aGlsZSAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIFN1YkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLQkJCQkJY29udHJpYnV0aW9uSXRlbSA9ICgoU3ViQ29udHJpYnV0aW9uSXRlbSkgY29udHJpYnV0aW9uSXRlbSkKLQkJCQkJCQkuZ2V0SW5uZXJJdGVtKCk7Ci0JCQkJfQotCi0JCQkJLy8gRGVsZXRlIHRoZSBBY3Rpb25Db250cmlidXRpb25JdGVtcyB3aXRoIG1hdGNoaW5nIGFjdGlvbi4KLQkJCQlpZiAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLQkJCQkJSUFjdGlvbiBhY3Rpb24gPSAoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIGNvbnRyaWJ1dGlvbkl0ZW0pCi0JCQkJCQkJLmdldEFjdGlvbigpOwotCQkJCQlpZiAoYWN0aW9ucy5jb250YWlucyhhY3Rpb24pKSB7Ci0JCQkJCQltYW5hZ2VyLnJlbW92ZShjb250cmlidXRpb25JdGVtKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBwb3AtdXAgbWVudSBiZWZvcmUgaXQgYXBwZWFycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCXN1cGVyLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7Ci0JCU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbnVsbDsKLQotCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtKTsgCi0JCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKLQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnRzIGdsb2JhbCBhY3Rpb25zIGJlZm9yZSB0aGUgImFkZGl0aW9ucy1lbmQiIHNlcGFyYXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRHbG9iYWxBY3Rpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zLWVuZCIsIG5ldyBTZXBhcmF0b3IoInVpLWFjdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCXJlZnJlc2hWaWV3ZXJBY3Rpb24uc2V0RW5hYmxlZChyZWZyZXNoVmlld2VyQWN0aW9uLmlzRW5hYmxlZCgpKTsKLQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoInVpLWFjdGlvbnMiLCByZWZyZXNoVmlld2VyQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zLWVuZCIsIG5ldyBTZXBhcmF0b3IoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JICAgIFN0cmluZyBrZXkgPSAoc3R5bGUgJiBBRERJVElPTlNfTEFTVF9TVFlMRSkgPT0gMCA/ICJhZGRpdGlvbnMtZW5kIiA6ICJhZGRpdGlvbnMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkgICAgaWYgKHZhbGlkYXRlQWN0aW9uICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoa2V5LCBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSh2YWxpZGF0ZUFjdGlvbikpOwotCSAgICB9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjaW5pdChJQWN0aW9uQmFycywKLQkgKiAgICAgIElXb3JrYmVuY2hQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYWN0aW9uQmFycywgSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQlzdXBlci5pbml0KGFjdGlvbkJhcnMsIHBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNpbml0KElBY3Rpb25CYXJzKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQl2aWV3QWN0aW9uQmFycyA9IGFjdGlvbkJhcnM7Ci0KLQkJSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldFNoYXJlZEltYWdlcygpOwotCi0JCWxpYnJhcnlWaWV3RWRpdEFjdGlvbiA9IG5ldyBMaWJyYXJ5Vmlld0VkaXRBY3Rpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uTGFiZWxfZWRpdCk7IAotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoTGlicmFyeVZpZXdFZGl0QWN0aW9uLkFDVElPTl9JRCwKLQkJCQlsaWJyYXJ5Vmlld0VkaXRBY3Rpb24pOwotCi0JCWN1dEFjdGlvbiA9IGNyZWF0ZUN1dEFjdGlvbigpOwotCQljdXRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9DVVQpKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ1VULmdldElkKCksIGN1dEFjdGlvbik7Ci0KLQkJY29weUFjdGlvbiA9IGNyZWF0ZUNvcHlBY3Rpb24oKTsKLQkJY29weUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0NPUFkpKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpLAotCQkJCWNvcHlBY3Rpb24pOwotCi0JCXBhc3RlQWN0aW9uID0gY3JlYXRlUGFzdGVBY3Rpb24oKTsKLQkJcGFzdGVBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9QQVNURSkpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpLAotCQkJCXBhc3RlQWN0aW9uKTsKLQotCQlkZWxldGVBY3Rpb24gPSBjcmVhdGVEZWxldGVBY3Rpb24oKTsKLQkJZGVsZXRlQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpLAotCQkJCWRlbGV0ZUFjdGlvbik7Ci0JCQotCQl1bmRvQWN0aW9uID0gbmV3IFVuZG9BY3Rpb24oKTsKLQkJdW5kb0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1VORE8pKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLAotCQkJCXVuZG9BY3Rpb24pOwotCi0JCXJlZG9BY3Rpb24gPSBuZXcgUmVkb0FjdGlvbigpOwotCQlyZWRvQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfUkVETykpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5SRURPLmdldElkKCksCi0JCQkJcmVkb0FjdGlvbik7Ci0KLQkJbGlicmFyeVZpZXdFZGl0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJY29udHJpYnV0ZVRvVG9vbEJhcihhY3Rpb25CYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY3V0IGFjdGlvbgotCSAqIEByZXR1cm4gYWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIEN1dEFjdGlvbiBjcmVhdGVDdXRBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgQ3V0QWN0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgcGFzdGUgYWN0aW9uCi0JICogQHJldHVybiBhY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgUGFzdGVBY3Rpb24gY3JlYXRlUGFzdGVBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUGFzdGVBY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBjb3B5IGFjdGlvbgotCSAqIEByZXR1cm4gYWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIENvcHlBY3Rpb24gY3JlYXRlQ29weUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBDb3B5QWN0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgZGVsZXRlIGFjdGlvbgotCSAqIEByZXR1cm4gYWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIERlbGV0ZUFjdGlvbiBjcmVhdGVEZWxldGVBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgRGVsZXRlQWN0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNnZXRBY3Rpb25CYXJzKCkKLQkgKi8KLQlwdWJsaWMgSUFjdGlvbkJhcnMgZ2V0QWN0aW9uQmFycygpIHsKLQkJcmV0dXJuIHZpZXdBY3Rpb25CYXJzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZhbGlkYXRlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZhbGlkYXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YTVkZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWYWxpZGF0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5EaWFnbm9zdGljaWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuRU1GRWRpdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5NZXRob2RFbGVtZW50TGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkxpYnJhcnlWYWxpZGF0aW9uTWFya2VySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5VmFsaWRhdGlvbk1ncjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLkxpYnJhcnlFVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLkxpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5jb25zdHJhaW50cy5MaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3kuTGlicmFyeUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNldFNlbGVjdGlvblRhcmdldDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlWYWxpZGF0ZUFjdGlvbiBleHRlbmRzIFZhbGlkYXRlQWN0aW9uIHsKLQlwcml2YXRlIEhhc2hTZXQgcmVzb3VyY2VzOwotCXByaXZhdGUgYm9vbGVhbiBzdWNjZXNzOwotCXByaXZhdGUgYm9vbGVhbiBzaG93U3VjY2VzcyA9IHRydWU7Ci0JcHJpdmF0ZSBNYXAgY29udGV4dERhdGEgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIExpYnJhcnlWYWxpZGF0ZUFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJZWNsaXBzZVJlc291cmNlc1V0aWwgPSBuZXcgTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIoKTsKLQl9Ci0JCi0JcHVibGljIExpYnJhcnlWYWxpZGF0ZUFjdGlvbihib29sZWFuIHNob3dTdWNjZXNzKSB7Ci0JCXRoaXMoKTsKLQkJdGhpcy5zaG93U3VjY2VzcyAgPSBzaG93U3VjY2VzczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcHV0Q29udGV4dERhdGEoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWNvbnRleHREYXRhLnB1dChrZXksIHZhbHVlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVmFsaWRhdGVBY3Rpb24jdmFsaWRhdGUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHJvdGVjdGVkIERpYWdub3N0aWMgdmFsaWRhdGUoZmluYWwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkgICAgaWYocmVzb3VyY2VzID09IG51bGwpIHsKLQkgICAgCXJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JICAgIAlyZXNvdXJjZXMuY2xlYXIoKTsKLQkgICAgfQotCSAgICBib29sZWFuIGRlcGVuZGVuY3lJbmZvTWdyU2V0ID0gZmFsc2U7Ci0JCUNvbGxlY3Rpb24gZU9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGVkT2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQllT2JqZWN0cy5hZGQoZWxlbWVudCk7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKEVPYmplY3QpZWxlbWVudCkuZVJlc291cmNlKCk7Ci0JCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQlyZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQkJaWYgKCEgZGVwZW5kZW5jeUluZm9NZ3JTZXQgJiYgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwkKLQkJCQkJcHV0Q29udGV4dERhdGEoTGlicmFyeUVWYWxpZGF0b3IuQ1RYX0RFUEVOREVOQ1lfVkFMSURBVElPTl9NR1IsIG5ldyBEZXBlbmRlbmN5VmFsaWRhdGlvbk1ncihsaWIpKTsKLQkJCQkJZGVwZW5kZW5jeUluZm9NZ3JTZXQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkgICAgaW50IGNvdW50ID0gZU9iamVjdHMuc2l6ZSgpOwotCSAgICBlT2JqZWN0cyA9IExpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneS5tYWtlVGFyZ2V0c0Rpc2pvaW50KGVPYmplY3RzKTsKLQkJTGlicmFyeUl0ZXJhdG9yIGxpYkl0ZXIgPSBuZXcgTGlicmFyeUl0ZXJhdG9yKGVPYmplY3RzLCB0cnVlLCBMaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3kuREVFUCwgdHJ1ZSk7Ci0JCXdoaWxlKGxpYkl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbyA9IGxpYkl0ZXIubmV4dCgpOwotCQkJY291bnQrKzsKLQkJCWlmKG8gaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKEVPYmplY3QpbykuZVJlc291cmNlKCk7Ci0JCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQlyZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JICAgIHByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soIiIsIGNvdW50KTsgLy8kTk9OLU5MUy0xJAotCi0vLwkgICAgZmluYWwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSAKLS8vCSAgICAgIGRvbWFpbiBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiA/ICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKWRvbWFpbikuZ2V0QWRhcHRlckZhY3RvcnkoKSA6IG51bGw7Ci0KLQkgICAgRGlhZ25vc3RpY2lhbiBkaWFnbm9zdGljaWFuID0gCi0JICAgICAgbmV3IERpYWdub3N0aWNpYW4oKQotCSAgICAgIHsKLQkgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0TGFiZWwoRU9iamVjdCBlT2JqZWN0KQotCSAgICAgICAgewotLy8JICAgICAgICAgIGlmIChhZGFwdGVyRmFjdG9yeSAhPSBudWxsICYmICFlT2JqZWN0LmVJc1Byb3h5KCkpCi0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgSUl0ZW1MYWJlbFByb3ZpZGVyIGl0ZW1MYWJlbFByb3ZpZGVyID0gKElJdGVtTGFiZWxQcm92aWRlcilhZGFwdGVyRmFjdG9yeS5hZGFwdChlT2JqZWN0LCBJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotLy8JICAgICAgICAgICAgaWYgKGl0ZW1MYWJlbFByb3ZpZGVyICE9IG51bGwpCi0vLwkgICAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICAgIHJldHVybiBpdGVtTGFiZWxQcm92aWRlci5nZXRUZXh0KGVPYmplY3QpOwotLy8JICAgICAgICAgICAgfQotLy8JICAgICAgICAgIH0KLS8vCSAgCi0vLwkgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldE9iamVjdExhYmVsKGVPYmplY3QpOwotCSAgICAgICAgCQotCSAgICAgICAgCXJldHVybiBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZU9iamVjdCk7Ci0JICAgICAgICB9Ci0KLQkgICAgICAgIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlKEVDbGFzcyBlQ2xhc3MsIEVPYmplY3QgZU9iamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkKLQkgICAgICAgIHsKLQkgICAgICAgICAgcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsKLQkgICAgICAgICAgaWYoY29udGV4dCA9PSBudWxsKSB7Ci0JICAgICAgICAJICBjb250ZXh0ID0gY29udGV4dERhdGE7CSAgICAgICAgCSAgCi0JICAgICAgICAgIH0KLQkgICAgICAgICAgZWxzZSB7Ci0JICAgICAgICAJICBjb250ZXh0LnB1dEFsbChjb250ZXh0RGF0YSk7Ci0JICAgICAgICAgIH0KLQkgICAgICAgICAgcmV0dXJuIHN1cGVyLnZhbGlkYXRlKGVDbGFzcywgZU9iamVjdCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCSAgICAgICAgfQkgICAgICAgIAotCSAgICAgICAgCi0JICAgICAgfTsKLQkgICAgICAKLQkgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGVPYmplY3RzKTsKLQkgICAgICBpbnQgbWF4ID0gbGlzdC5zaXplKCkgLSAxOwotCSAgICAgIFN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCSAgICAJICBPYmplY3QgZSA9IGxpc3QuZ2V0KGkpOwotCSAgICAJICBpZihlIGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7Ci0JICAgIAkJICBzdHJCdWYuYXBwZW5kKCgoTmFtZWRFbGVtZW50KWUpLmdldE5hbWUoKSkuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JICAgIAkgIH0KLQkgICAgICB9Ci0JICAgICAgT2JqZWN0IGUgPSBtYXggPCAwID8gbnVsbCA6IGxpc3QuZ2V0KG1heCk7Ci0JICAgICAgaWYoZSBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotICAgIAkJICBzdHJCdWYuYXBwZW5kKCgoTmFtZWRFbGVtZW50KWUpLmdldE5hbWUoKSk7Ci0gICAgCSAgfQotCSAgICAgIEJhc2ljRGlhZ25vc3RpYyBkaWFnbm9zdGljcyA9IAotCSAgICAgICAgICBuZXcgQmFzaWNEaWFnbm9zdGljCi0JICAgICAgICAgICAgKEVPYmplY3RWYWxpZGF0b3IuRElBR05PU1RJQ19TT1VSQ0UsCi0JICAgICAgICAgICAgIDAsCi0JICAgICAgICAgICAgIEVjb3JlUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZwotCSAgICAgICAgICAgICAgICgiX1VJX0RpYWdub3N0aWNSb290X2RpYWdub3N0aWMiLCAvLyROT04tTkxTLTEkIAotCSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0IFtdIHsgc3RyQnVmLnRvU3RyaW5nKCkgfSksIAotCSAgICAgICAgICAgICBsaXN0LnRvQXJyYXkoKSk7Ci0JICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZU9iamVjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JICAgIAkgIEVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkgICAgCSAgcHJvZ3Jlc3NNb25pdG9yLnNldFRhc2tOYW1lCi0JICAgIAkgIChFTUZFZGl0VUlQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVmFsaWRhdGluZ19tZXNzYWdlIiwgbmV3IE9iamVjdCBbXSB7ZGlhZ25vc3RpY2lhbi5nZXRPYmplY3RMYWJlbChlT2JqZWN0KX0pKTsgLy8kTk9OLU5MUy0xJAotCSAgICAJICBkaWFnbm9zdGljaWFuLnZhbGlkYXRlKGVPYmplY3QsIGRpYWdub3N0aWNzKTsKLQkgICAgICB9Ci0JICAgICAgc3VjY2VzcyA9IGRpYWdub3N0aWNzLmdldFNldmVyaXR5KCkgPT0gRGlhZ25vc3RpYy5PSzsKLQkgICAgICByZXR1cm4gZGlhZ25vc3RpY3M7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbiNoYW5kbGVEaWFnbm9zdGljKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURpYWdub3N0aWMoRGlhZ25vc3RpYyBkaWFnbm9zdGljKSB7Ci0JCWlmKGRpYWdub3N0aWMgIT0gbnVsbCkgewotCQkJaWYoc2hvd1N1Y2Nlc3MgfHwgIWlzU3VjY2Vzc2Z1bCgpKSB7Ci0JCQkJLy8gc2F2ZSB0aGUgcmVmZXJlbmNlIHRvIEVjbGlwc2VSZXNvdXJjZXNVdGlsIGFuZCBzZXQgZWNsaXBzZVJlc291cmNlc1V0aWwgdG8gbnVsbAotCQkJCS8vIHNvIHN1cGVyIG1ldGhvZCB3aWxsIG5vdCB0cnkgdG8gZGVhbCB3aXRoIHRoZSBtYXJrZXJzCi0JCQkJLy8KLQkJCQlFY2xpcHNlUmVzb3VyY2VzVXRpbCBzYXZlZFJlZiA9IGVjbGlwc2VSZXNvdXJjZXNVdGlsOwotCQkJCWVjbGlwc2VSZXNvdXJjZXNVdGlsID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlzdXBlci5oYW5kbGVEaWFnbm9zdGljKGRpYWdub3N0aWMpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJZWNsaXBzZVJlc291cmNlc1V0aWwgPSBzYXZlZFJlZjsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGRlYWxpbmcgd2l0aCBtYXJrZXJzCi0JCQkvLwotCQkJaWYgKGVjbGlwc2VSZXNvdXJjZXNVdGlsICE9IG51bGwpCQkJCQotCQkJewotCQkJCS8vIGRlbGV0ZSBvbGQgbWFya2VycwotCQkJCS8vCQkJCQkKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCWVjbGlwc2VSZXNvdXJjZXNVdGlsLmRlbGV0ZU1hcmtlcnMoKFJlc291cmNlKSBpdGVyLm5leHQoKSk7Ci0JCQkJfQotCQkJCQotCQkJCVZpZXdlciB2aWV3ZXIgPSBudWxsOwotCQkJCWlmICghZGlhZ25vc3RpYy5nZXRDaGlsZHJlbigpLmlzRW1wdHkoKSkKLQkJCQl7Ci0JCQkJCU1hcCBkaWFnbm9zdGljVG9SZXNvdXJjZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaSA9IGRpYWdub3N0aWMuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCQkJCQl7Ci0JCQkJCQlEaWFnbm9zdGljIGNoaWxkRGlhZ25vc3RpYyA9IChEaWFnbm9zdGljKWkubmV4dCgpOwotCQkJCQkJTGlzdCBkYXRhID0gY2hpbGREaWFnbm9zdGljLmdldERhdGEoKTsKLQkJCQkJCWlmICghZGF0YS5pc0VtcHR5KCkpIHsKLQkJCQkJCQlPYmplY3QgbyA9IGRhdGEuZ2V0KDApOwotCQkJCQkJCWlmKG8gaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKChFT2JqZWN0KW8pLmVSZXNvdXJjZSgpOwotCQkJCQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlkaWFnbm9zdGljVG9SZXNvdXJjZU1hcC5wdXQoY2hpbGREaWFnbm9zdGljLCByZXNvdXJjZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCQkJCQkKLQkJCQkJLy8gY3JlYXRlIG1hcmtlcnMKLQkJCQkJLy8KLQkJCQkJZm9yIChJdGVyYXRvciBpID0gZGlhZ25vc3RpY1RvUmVzb3VyY2VNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCQkJCQl7Ci0JCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGkubmV4dCgpOwotCQkJCQkJRGlhZ25vc3RpYyBjaGlsZERpYWdub3N0aWMgPSAoRGlhZ25vc3RpYyllbnRyeS5nZXRLZXkoKTsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCQkJZWNsaXBzZVJlc291cmNlc1V0aWwuY3JlYXRlTWFya2VycyhyZXNvdXJjZSwgY2hpbGREaWFnbm9zdGljKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gc2VsZWN0IHRoZSBmaXJzdCBvYmplY3Qgd2l0aCBwcm9ibGVtIGluIHRoZSB2aWV3ZXIgaWYgcG9zc2libGUKLQkJCQkJLy8KLQkJCQkJTGlzdCBkYXRhID0gKChEaWFnbm9zdGljKWRpYWdub3N0aWMuZ2V0Q2hpbGRyZW4oKS5nZXQoMCkpLmdldERhdGEoKTsKLQkJCQkJaWYgKCFkYXRhLmlzRW1wdHkoKSkKLQkJCQkJewotCQkJCQkJT2JqZWN0IHBhcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7CQkJCQkJCi0JCQkJCQlPYmplY3QgZSA9IGRhdGEuZ2V0KDApOwotCQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJU2V0U2VsZWN0aW9uVGFyZ2V0KQotCQkJCQkJewotCQkJCQkJCSgoSVNldFNlbGVjdGlvblRhcmdldClwYXJ0KS5zZWxlY3RSZXZlYWwobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZSkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAocGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikKLQkJCQkJCXsKLQkJCQkJCQl2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcilwYXJ0KS5nZXRWaWV3ZXIoKTsKLQkJCQkJCQlpZiAodmlld2VyICE9IG51bGwpCi0JCQkJCQkJewotCQkJCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGRhdGEuZ2V0KDApKSwgdHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9CQkJCQkKLQkJCQl9Ci0JCQkJaWYodmlld2VyID09IG51bGwpIHsKLQkJCQkJT2JqZWN0IHBhcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKQotCQkJCQl7Ci0JCQkJCQl2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcilwYXJ0KS5nZXRWaWV3ZXIoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZih2aWV3ZXIgIT0gbnVsbCkgewotCQkJCQkvLyBjbGVhciBkZWNvcmF0aW9uIGNhY2hlCi0JCQkJCS8vCi0JCQkJCU1ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvci5jbGVhckRlY29yYXRpb25DYWNoZSgpOwotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCQkKLQkJCQl0cnkgewotCQkJCQlyZWZyZXNoVmlld3MoKTsKLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaWV3cygpIHsKLQkJLy8gbm8gZXJyb3IgbWFya2VycyBmb3IgY29uZmlndXJhdGlvbiB2aWV3Ci0JCS8vCi0vLwkJQ29uZmlndXJhdGlvblZpZXcuZ2V0VmlldygpLmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1Y2Nlc3NmdWwoKSB7Ci0JCXJldHVybiBzdWNjZXNzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0NvcHlBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0NvcHlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwOTg3Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdDb3B5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weVRvQ2xpcGJvYXJkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuQ2xpcGJvYXJkVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbi5UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotCi0vKioKLSAqIENvcGllcyBhbiBlbGVtZW50IGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5Vmlld0NvcHlBY3Rpb24gZXh0ZW5kcyBDb3B5QWN0aW9uIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoY29tbWFuZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbHNlIHsKLQkJCWlmIChkb21haW4gaW5zdGFuY2VvZiBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCQkoKFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZG9tYWluKS5yZXNldENvcHlNYXBzKCk7Ci0JCQl9Ci0JCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIENvcHlUb0NsaXBib2FyZENvbW1hbmQpIHsKLQkJCQlTdHJpbmcgbGlua3MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29weVRvQ2xpcGJvYXJkQ29tbWFuZCljb21tYW5kKS5nZXRTb3VyY2VPYmplY3RzKCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGl0ZW0gPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXRlbTsKLQkJCQkJCVN0cmluZyBocmVmID0gUmVzb3VyY2VIZWxwZXIuZ2V0VXJsKGUsCi0JCQkJCQkJCW51bGwsICJodG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChsaW5rcy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlsaW5rcyArPSBTdHJVdGlsLkxJTkVfRkVFRDsKLQkJCQkJCX0KLQkJCQkJCWxpbmtzICs9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRMaW5rKGUsIHRydWUsCi0JCQkJCQkJCSJmaWxlOi8vIiArIGhyZWYpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGxpbmtzLmxlbmd0aCgpID4gMCkgewotCQkJCQlDbGlwYm9hcmRVdGlsLmNvcHlUZXh0SFRNTFRvQ2xpcGJvYXJkKGxpbmtzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlzdXBlci5ydW4oKTsKLQkJfQotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3VwZGF0ZVNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgb2JqZWN0cy5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKG9iamVjdHMubmV4dCgpKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pCi0JCQkJCSYmICFUbmdVdGlsLmlzUHJlZGVmaW5lZCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkpIHsKLQkJCQljb2xsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCX0KLQotCQl9Ci0KLQkJY29tbWFuZCA9IGNyZWF0ZUNvbW1hbmQoY29sbGVjdGlvbik7Ci0KLQkJcmV0dXJuIGNvbW1hbmQuY2FuRXhlY3V0ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3Q3V0QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdDdXRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjY2RlMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdDdXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotLyoqCi0gKiBDdXRzIGFuIGVsZW1lbnQgaW4gdGhlIExpYnJhcnkgdmlldyB0byB0aGUgY2xpcGJvYXJkLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZpZXdDdXRBY3Rpb24gZXh0ZW5kcyBDdXRBY3Rpb24gewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChjb21tYW5kID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVsc2UKLQkJCXN1cGVyLnJ1bigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3VwZGF0ZVNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0RlbGV0ZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3RGVsZXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZjQ0ZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3RGVsZXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLklFZGl0b3JLZWVwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5GZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuUHJvY2Vzc0RlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLQotLyoqCi0gKiBEZWxldGVzIGFuIGVsZW1lbnQgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZpZXdEZWxldGVBY3Rpb24gZXh0ZW5kcyBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uIHsKLQkKLQkvKiogCi0JICogRGVsZXRzIGFuIGVsZW1lbnQgaW4gbGlicmFyeSB2aWV3Ci0JICogCi0JICovCi0JcHVibGljIExpYnJhcnlWaWV3RGVsZXRlQWN0aW9uKCkgewotCQl0aGlzKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBEZWxldGVzIGFuIGVsZW1lbnQgaW4gbGlicmFyeSB2aWV3IGFmdGVyIGNvbmZpcm1pbmcgd2l0aCB1c2VyCi0JICogQHBhcmFtIGNvbmZpcm0KLQkgKi8KLQlwdWJsaWMgTGlicmFyeVZpZXdEZWxldGVBY3Rpb24oYm9vbGVhbiBjb25maXJtKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29uZmlybSA9IGNvbmZpcm07IAotCX0KLQotCS8qKgotCSAqIEBzZWUgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbiNkaWREZWxldGUoQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaWREZWxldGUoQ29sbGVjdGlvbiBkZWxldGVkRWxlbWVudHMpIHsKLQkJc3VwZXIuZGlkRGVsZXRlKGRlbGV0ZWRFbGVtZW50cyk7Ci0JCQotCQkvLyBDbG9zZSBhbGwgb3BlbiBlZGl0b3JzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVsZXRlZCBlbGVtZW50cy4KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVsZXRlZEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJJiYgKChNZXRob2RFbGVtZW50KSBlbGVtZW50KS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCUlFZGl0b3JLZWVwZXIuUkVGRVJFTkNFLmdldEVkaXRvcktlZXBlcigpCi0JCQkJCQkuY2xvc2VFZGl0b3JzT25EZWxldGlvbigoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBDdXN0b21DYXRlZ29yeSBnZXRSb290Q3VzdG9tQ2F0ZWdvcnkoT2JqZWN0IG9iamVjdCkgewotCQlmb3IoOyBvYmplY3QgaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlcjsgb2JqZWN0ID0gKChJV3JhcHBlckl0ZW1Qcm92aWRlcilvYmplY3QpLmdldE93bmVyKCkpOwotCQlvYmplY3QgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlyZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkgJiYgVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdCkgPwotCQkJKEN1c3RvbUNhdGVnb3J5KSBvYmplY3QgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3VwZGF0ZVNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQXJyYXlMaXN0IGZpbHRlcmVkU2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQlpZihlIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlmaWx0ZXJlZFNlbGVjdGlvbi5hZGQoZSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGUpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyCi0JCQkJCXx8IChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBUbmdVdGlsCi0JCQkJCQkJLmlzUHJlZGVmaW5lZCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdEN1c3RvbUNhdGVnb3J5ID0gZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KGUpOwotCQkJCUN1c3RvbUNhdGVnb3J5IGNjID0gKEN1c3RvbUNhdGVnb3J5KSBlbGVtZW50OwotCQkJCWlmIChyb290Q3VzdG9tQ2F0ZWdvcnkgIT0gbnVsbCAmJiAKLQkJCQkJCVVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHJvb3RDdXN0b21DYXRlZ29yeSkgPT0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2MpKSB7Ci0JCQkJCS8vIHNlbGVjdGVkIGN1c3RvbWUgY2F0ZWdvcnkgaXMgaW4gdGhlIGN1cnJlbnQgcGx1Z2luLgotCQkJCQkvLyBhZGQgdGhlIGVsZW1lbnQgdG8gdGhlIHNlbGVjdGlvbiBpbnN0ZWFkIG9mIGl0cwotCQkJCQkvLyB3cmFwcGVyIHNvIHRoZSBlbGVtZW50Ci0JCQkJCS8vIHdpbGwgYmUgZGVsZXRlZCBwZXJtYW5lbnRseSBmcm9tIHRoZSBsaWJyYXJ5Ci0JCQkJCS8vCi0JCQkJCWZpbHRlcmVkU2VsZWN0aW9uLmFkZChlbGVtZW50KTsJCQkJCQotCQkJCX0KLQkJCX0gZWxzZSB7CQkJCQotCQkJCWlmKGUgaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlJV3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKElXcmFwcGVySXRlbVByb3ZpZGVyKSBlOwotLy8JCQkJCWlmKHdyYXBwZXIuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyICYmCi0vLwkJCQkJCQkhKFRuZ1V0aWwudW53cmFwKHdyYXBwZXIuZ2V0T3duZXIoKSkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkpIHsKLS8vCQkJCQkJLy8gZGlzYWxsb3cgZGVsZXRpbmcgZWxlbWVudCB3aGVuIGl0cyByZWZlcmVuY2UgaW4KLS8vCQkJCQkJLy8gQ3VzdG9tQ2F0ZWdvcnkgdHJlZQotLy8JCQkJCQkvLyB0aGF0IGlzIG5vdCBkaXJlY3RseSB1bmRlciBhIEN1c3RvbUNhdGVnb3J5IGlzCi0vLwkJCQkJCS8vIHNlbGVjdGVkCi0vLwkJCQkJCS8vCi0vLwkJCQkJCWNvbnRpbnVlOwotLy8JCQkJCX0KLQkJCQkJCi0JCQkJCWlmIChUbmdVdGlsLmlzVW5kZXJDdXN0b21DYXRlZ29yeVRyZWUod3JhcHBlcikpIHsKLQkJCQkJCS8vIGRpc2FsbG93IGRlbGV0aW5nIGVsZW1lbnQgdW5kZXIgYSBjdXN0b20gY2F0ZWdvcnkgdGhhdCBpcyBub3QgYSBjdXN0b20gY2F0ZWdvcnkKLQkJCQkJCS8vCi0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICh3cmFwcGVyLmdldEZlYXR1cmUoKSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkVTIAotCQkJCQkJCXx8IHdyYXBwZXIuZ2V0RmVhdHVyZSgpID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUykgCi0JCQkJCXsKLQkJCQkJCU9iamVjdCBvd25lciA9IHdyYXBwZXIuZ2V0T3duZXIoKTsKLQkJCQkJCWlmKG93bmVyIGluc3RhbmNlb2YgRU9iamVjdCAmJiBlbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCAmJiAKLQkJCQkJCQkJVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIG93bmVyKSA9PSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgZWxlbWVudCkpIHsKLQkJCQkJCQkvLyBjYXRlZ29yeSBncm91cGluZyBhbmQgY2F0ZWdvcnkgYXJlIGluIHRoZSBzYW1lIHBsdWdpbgotCQkJCQkJCS8vIGFkZCB0aGUgZWxlbWVudCB0byB0aGUgc2VsZWN0aW9uIGluc3RlYWQgb2YgaXRzIHdyYXBwZXIgc28gdGhlIGVsZW1lbnQgCi0JCQkJCQkJLy8gd2lsbCBiZSBkZWxldGVkIHBlcm1hbmVudGx5IGZyb20gdGhlIGxpYnJhcnkKLQkJCQkJCQkvLwotCQkJCQkJCWZpbHRlcmVkU2VsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmlsdGVyZWRTZWxlY3Rpb24uYWRkKGUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGZpbHRlcmVkU2VsZWN0aW9uLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gc3VwZXIKLQkJCQkudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZpbHRlcmVkU2VsZWN0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLk1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24jcGVyZm9ybURlbGV0ZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlbGV0ZSgpIHsKLQkJSGFzaFNldCBjb25maWdzVG9EZWxldGUgPSBuZXcgSGFzaFNldCgpOwotCQlIYXNoU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJSUxpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldEN1cnJlbnRQZXJzaXN0ZXIoKTsKLQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQljb25maWdzVG9EZWxldGUuYWRkKG9iamVjdCk7Ci0JCQkJfQotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0ICYmICFwZXJzaXN0ZXIuaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIob2JqZWN0KSkgewotCQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoRU9iamVjdCkgb2JqZWN0KS5lQ29udGFpbmVyKCk7Ci0JCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCAmJiBjb250YWluZXIuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNvbnRhaW5lci5lUmVzb3VyY2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBBdm9pZCBkZWxldGluZyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIGEgcHJvY2Vzcy4KLQkJaWYgKCFjb25maWdzVG9EZWxldGUuaXNFbXB0eSgpKSB7Ci0JCQlIYXNoU2V0IGNvbmZpZ0dVSURzVG9EZWxldGUgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29uZmlnc1RvRGVsZXRlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0ZXIubmV4dCgpOwotCQkJCWNvbmZpZ0dVSURzVG9EZWxldGUuYWRkKGNvbmZpZy5nZXRHdWlkKCkpOwotCQkJfQotCQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IChJTGlicmFyeVJlc291cmNlU2V0KSBMaWJyYXJ5U2VydmljZQotCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLmVSZXNvdXJjZSgpCi0JCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCQkJcmVzb3VyY2VTZXQKLQkJCQkJLmxvYWRPcHBvc2l0ZUZlYXR1cmVzKAotCQkJCQkJCUNvbGxlY3Rpb25zCi0JCQkJCQkJCQkuc2luZ2xldG9uTGlzdChBc3NvY2lhdGlvbkhlbHBlci5NZXRob2RDb25maWd1cmF0aW9uX0RlcGVuZGVudFByb2Nlc3NlcyksCi0JCQkJCQkJY29uZmlnR1VJRHNUb0RlbGV0ZSk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbmZpZ3NUb0RlbGV0ZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdGVyLm5leHQoKTsKLQotCQkJCUxpc3QgcmVmZXJlbmNlcyA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkuZ2V0RGVwZW5kZW50UHJvY2Vzc2VzKGNvbmZpZyk7Ci0JCQkJaWYgKHJlZmVyZW5jZXMgIT0gbnVsbCAmJiByZWZlcmVuY2VzLnNpemUoKSA+IDApIHsKLQkJCQkJU3RyaW5nIHByb2Nlc3NOYW1lID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIHJlZmVyZW5jZXMKLQkJCQkJCQkuZ2V0KDApKS5nZXROYW1lKCk7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5V2FybmluZygKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGV0ZURpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kZWxldGVDb25maWdFcnJvcl9tc2csIAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsZXRlQ29uZmlnRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJCQkJCXByb2Nlc3NOYW1lKSk7IAotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQl9Ci0KLQkJfQotCi0JCUlTdGF0dXMgc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KG1vZGlmaWVkUmVzb3VyY2VzLAotCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb250ZXh0KCkpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5KAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kZWxldGVEaWFsb2dfdGl0bGUsIAotCQkJCQlzdGF0dXMpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGNvbmZpcm1EZWxldGUoKSkgewotCQkJLy8gQ29sbGVjdCB0aGUgaW5mb3JtYXRpb24gb2YgUmVmcmVzaGFibGUgT2JqZWN0cwotCQkJLy8gKCBSZWZlcmVuY2UgT2JqZWN0cyBzaG91bGQgYmUgcmVmcmVzaGVkIGluIG5hdmlnYXRpb24gdHJlZSkgLQotCQkJQXJyYXlMaXN0IHJlZnJlc2hMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBkZWxldGluZ09iamVjdCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCQlpZiAoZGVsZXRpbmdPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCS8vIGNoZWNrIGZvciB2YXJpYWJpbGl0eQotCQkJCQlpZiAoZGVsZXRpbmdPYmplY3QgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBUbmdVdGlsCi0JCQkJCQkJCS5nZXRHZW5lcmFsaXplcnMoKFZhcmlhYmlsaXR5RWxlbWVudCkgZGVsZXRpbmdPYmplY3QpOyBpdGVyYXRvcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBhUmVmZXJlbmNlID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCXJlZnJlc2hMaXN0LmFkZChhUmVmZXJlbmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQgY21kID0gKERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKSAoY29tbWFuZCBpbnN0YW5jZW9mIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kID8gY29tbWFuZCA6IG51bGwpOwotCQkJCi0JCQkvLyBleGVjdXRlIGFjdHVhbCBkZWxldGUgY29tbWFuZC4KLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCi0JCQkvLyBkZWxldGUgdGhlIHJlZmVyZW5jaW5nIGRlc2NyaXB0b3JzIGlmIHRoZXJlIGlzIGFueQotCQkJLy8KLQkJCWlmKGNtZCAhPSBudWxsKSB7Ci0JCQkJQ29sbGVjdGlvbjxEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc1RvRGVsZXRlID0gY21kLmdldERlc2NyaXB0b3JzVG9EZWxldGUoKTsKLQkJCQlpZihkZXNjcmlwdG9yc1RvRGVsZXRlICE9IG51bGwgJiYgIWRlc2NyaXB0b3JzVG9EZWxldGUuaXNFbXB0eSgpKSB7Ci0JCQkJCVByb2Nlc3NEZWxldGVBY3Rpb24uZGVsZXRlKGRlc2NyaXB0b3JzVG9EZWxldGUpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gUmVmcmVzaCB0aGUgcmVmcmVzaGxpc3Qgb2JqZWN0cyBpbiBuYXZpZ2F0aW9uIHRyZWUuCi0JCQlpZiAocmVmcmVzaExpc3Quc2l6ZSgpID4gMCkgewotCQkJCVRyZWVWaWV3ZXIgdmlld2VyID0gKChUcmVlVmlld2VyKSAoTGlicmFyeVZpZXcuZ2V0VmlldygpCi0JCQkJCQkuZ2V0Vmlld2VyKCkpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZyZXNoTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJdmlld2VyLnJlZnJlc2goaXRlci5uZXh0KCkpOwotCQkJCX0KLQkJCX0JCQkKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBwcm9wZXJ5IGNoYW5nZSB3aXRoIG9sZCBhbmQgbmV3IHZhbHVlCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIAkJCXByb3BlcnR5IG5hbWUgZm9yIHdoaWNoIHZhbHVlIGlzIGdvaW5nIHRvIGNoYW5nZQotCSAqIEBwYXJhbSBvbGRWYWx1ZQotCSAqIAkJCU9sZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAJCQlOZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5UHJvcGVydHlDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLAotCQkJT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIHRoZSBzcGVjaWFsIGNhc2Ugb2YgY3VzdG9tY2F0ZWdvcnkgQ29weS9EZWxldGUgYWN0aW9uIElmIHBhcmVudCBvZgotCSAqIGN1c3RvbWNhdGVnb3J5IHNlbGVjdGVkLCBpZ25vcmUgdGhlIGN1c3RvbWNhdGVnb3J5LCBvdGhlcndpc2UgY29tcG91bmQKLQkgKiBjb21tYW5kIGNyZWF0ZXMgYSBjb21tYW5kIGZvciBwYXJlbnQgYW5kIGEgY29tbWFuZCBmb3IgY2hpbGQsCi0JICogQ29tcG91bmRDb21tYW5kIHdpbGwgZXhlY3V0ZSBib3RoIGNvbW1hbmRzLCBjb21tYW5kIGZvciBwYXJlbnQgd2lsbAotCSAqIHJlbW92ZSBwYXJlbnQgaXRzZWxmIGFuZCByZW1vdmVzIGNoaWxkIHRvbywgbmV4dCBpdCB0cnkgdG8gZXhlY3V0ZQotCSAqIGNvbW1hbmQgZm9yIGNoaWxkLCBjb21tYW5kIHdpbGwgZmFpbCBiZWNhdXNlIGNoaWxkIGdvdCByZW1vdmUgaW4gY29tbWFuZAotCSAqIGZvciBwYXJlbnQuIAotCSAqIFRPRE86IGhhbmRsZSBwcm9wZXJseSBpbiBSZW1vdmVDb21tYW5kIGZvciB0aGlzIGNhc2UgaW5zdGVhZCBoZXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpbHRlckN1c3RvbUNhdGVnb3J5U2VsZWN0aW9uKE9iamVjdCBlLCBMaXN0IGZpbHRlcmVkU2VsZWN0aW9uKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJZmlsdGVyZWRTZWxlY3Rpb24uYWRkKGUpOwotCQl9IGVsc2UgewotCQkJT2JqZWN0IG93bmVyID0gKChEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcikgZSkuZ2V0T3duZXIoKTsKLQkJCXdoaWxlIChvd25lciBpbnN0YW5jZW9mIERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJaWYgKG93bmVyIGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlpZiAoIWZpbHRlcmVkU2VsZWN0aW9uLmNvbnRhaW5zKG93bmVyKSkgewotCQkJCQkJZmlsdGVyZWRTZWxlY3Rpb24uYWRkKGUpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChmaWx0ZXJlZFNlbGVjdGlvbi5jb250YWlucyhvd25lcikpCi0JCQkJCQlicmVhazsKLQkJCQkJb3duZXIgPSAoKERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyKSBvd25lcikuZ2V0T3duZXIoKTsKLQkJCQkJaWYgKCEob3duZXIgaW5zdGFuY2VvZiBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSkgewotCQkJCQkJaWYgKCFmaWx0ZXJlZFNlbGVjdGlvbi5jb250YWlucyhvd25lcikpIHsKLQkJCQkJCQlmaWx0ZXJlZFNlbGVjdGlvbi5hZGQoZSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdFZGl0QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdFZGl0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNjBkZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3RWRpdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5CYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb247Ci0KLQotLyoqCi0gKiBFZGl0cyBhbiBlbGVtZW50IGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5Vmlld0VkaXRBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24gewotCi0JLyoqCi0JICogVGhlIElEIGZvciB0aGlzIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fSUQgPSBMaWJyYXJ5Vmlld0VkaXRBY3Rpb24uY2xhc3MuZ2V0TmFtZSgpOwotCQotCXByaXZhdGUgQ29sbGVjdGlvbiBzZWxlY3RlZDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExpYnJhcnlWaWV3RWRpdEFjdGlvbihTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGVkLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBvYmplY3RzLm5leHQoKTsKLQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRWRpdG9yKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGlzIGFjdGlvbiBpbiByZXNwb25zZSB0byB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGNoYW5nZXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJc2VsZWN0ZWQgPSBuZXcgSGFzaFNldCgpOwotCi0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gb2JqZWN0cy5uZXh0KCk7Ci0JCQlPYmplY3QgcmVhbE9iaiA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJaWYgKHJlYWxPYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCSYmICFUbmdVdGlsLmlzUHJlZGVmaW5lZCgoTWV0aG9kRWxlbWVudCkgcmVhbE9iaikKLQkJCQkJJiYgIShyZWFsT2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UgJiYgIShyZWFsT2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkpKSB7Ci0JCQkJc2VsZWN0ZWQuYWRkKHJlYWxPYmopOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuICFzZWxlY3RlZC5pc0VtcHR5KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJlOTNiZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5CYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb247Ci0KLS8qKgotICogCi0gKiBGaW5kcyBhbiBlbGVtZW50IGluIGxpYnJhcnkgdmlldwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24gewotCi0JLyoqCi0JICogVGhlIElEIGZvciB0aGlzIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fSUQgPSBMaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCQotCXByaXZhdGUgTGlicmFyeVZpZXcgdGFyZ2V0VmlldzsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkOwotCi0JCi0JcHVibGljIExpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24oU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAodGFyZ2V0VmlldyA9PSBudWxsKQotCQkJdGFyZ2V0VmlldyA9IExpYnJhcnlWaWV3LmdldFZpZXcoKTsKLQotCQkvLyBzZWxlY3QgY3VycmVudFNlbGVjdGlvbiBpbiBMaWIgVmlldwotCQlpZiAodGFyZ2V0VmlldyAhPSBudWxsICYmIHNlbGVjdGVkICE9IG51bGwgJiYgIXNlbGVjdGVkLmlzRW1wdHkoKSkgewotCi0JCQl0cnkgewotCQkJCXRhcmdldFZpZXcuZ2V0U2l0ZSgpLmdldFBhZ2UoKS5zaG93VmlldyhMaWJyYXJ5Vmlldy5WSUVXX0lEKTsKLQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKHBlKTsKLQkJCX0KLQotCQkJZmluYWwgT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gc2VsZWN0ZWQuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoc2VsZWN0ZWRPYmplY3QgIT0gbnVsbCkgewotCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUxpYnJhcnlWaWV3LmdldFZpZXcoKS5zZXRTZWxlY3Rpb25Ub1ZpZXdlcigKLQkJCQkJCQkJc2VsZWN0ZWRPYmplY3QpOwotCQkJCQl9Ci0KLQkJCQl9KTsKLQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiN1cGRhdGVTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNlbGVjdGVkID0gc2VsZWN0aW9uOwotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJT2JqZWN0IHJlYWxPYmogPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCWlmIChyZWFsT2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdQYXN0ZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3UGFzdGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc1ODhhNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdQYXN0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uUGFzdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuSUxpYnJhcnlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLQotLyoqCi0gKiBQYXN0ZXMgYW4gZWxlbWVudCBmcm9tIHRoZSBjbGlwYm9hcmQgdG8gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODE1NTkKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlWaWV3UGFzdGVBY3Rpb24gZXh0ZW5kcyBQYXN0ZUFjdGlvbiBpbXBsZW1lbnRzCi0JCUlMaWJyYXJ5QWN0aW9uIHsKLQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3I7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCXJ1bm5lci5zZXRQcm9ncmVzc01vbml0b3IoZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJcGVyZm9ybVBhc3RlKCk7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIFBlcmZvcm0gcGFzdGUgb3BlcmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVBhc3RlKCkgewotCQlpZihjb21tYW5kIGluc3RhbmNlb2YgUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCkgewotCQkJUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCBjbWQgPSAoKFBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQpY29tbWFuZCk7Ci0JCQlPYmplY3Qgb3duZXIgPSBjbWQuZ2V0T3duZXIoKTsKLQkJCWlmKG93bmVyIGluc3RhbmNlb2YgQWRhcHRlcikgewotCQkJCW93bmVyID0gKChBZGFwdGVyKW93bmVyKS5nZXRUYXJnZXQoKTsKLQkJCX0KLQkJCQotCQkJLy8gY2hlY2sgdGFyZ2V0IGZvciBtb2RpZmlhYmxlCi0JCQkvLwotCQkJaWYob3duZXIgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoKEVPYmplY3QpIG93bmVyLCBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkpOwotCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJCWdldFRleHQoKSwgbnVsbCwgc3RhdHVzKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0JCQkKLQkJfQotCQkKLQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZQotCQkJc3VwZXIucnVuKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZihzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24uaXNFbXB0eSgpIHx8IHNlbGVjdGlvbi5zaXplKCkgIT0gMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZWxzZXsKLQkJCU9iamVjdCBvYmplY3QgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCX0KLQkKLQkvKioKLQkgKiBOb3RpZnkgcHJvcGVyeSBjaGFuZ2Ugd2l0aCBvbGQgYW5kIG5ldyB2YWx1ZQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAJCQlwcm9wZXJ0eSBuYW1lIGZvciB3aGljaCB2YWx1ZSBpcyBnb2luZyB0byBjaGFuZ2UKLQkgKiBAcGFyYW0gb2xkVmFsdWUKLQkgKiAJCQlPbGQgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogCQkJTmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeVByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwKLQkJCU9iamVjdCBuZXdWYWx1ZSkgewotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5JTGlicmFyeUFjdGlvbiNzZXRQcm9ncmVzc01vbml0b3Iob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlwcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEByZXR1cm4gdGhlIHByb2dyZXNzTW9uaXRvcgotCSAqLwotCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQkJaWYocHJvZ3Jlc3NNb25pdG9yID09IG51bGwpIHsKLQkJCXByb2dyZXNzTW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIHByb2dyZXNzTW9uaXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlua1dpdGhFZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaW5rV2l0aEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTYzNDYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaW5rV2l0aEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBMaW5rcyBlZGl0b3Igd2l0aCBhbiBlbGVtZW50IGluIGxpYnJhcnkgdmlldwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTGlua1dpdGhFZGl0b3IgaW1wbGVtZW50cyBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQotCXByaXZhdGUgTGlicmFyeVZpZXcgdGFyZ2V0VmlldzsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZW5hYmxlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBJUGFydExpc3RlbmVyIGVkaXRvclBhcnRMaXN0ZW5lciA9IG5ldyBJUGFydExpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLQkJCQkvLyBTZWxlY3QgdGhlIG1ldGhvZCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudGx5Ci0JCQkJLy8gc2VsZWN0ZWQgZWRpdG9yLgotCQkJCU9iamVjdFtdIG9iamVjdHMgPSBuZXcgT2JqZWN0WzFdOwotCQkJCW9iamVjdHNbMF0gPSBFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRBY3RpdmVNZXRob2RFZGl0b3JJbnB1dCgpOwotCQkJCWlmIChvYmplY3RzWzBdICE9IG51bGwpIHsKLQkJCQkJLy8gZGlzYWJsZSB0aGUgc2VsZWN0aW9uQ2hhbmdlZCBtZXRob2QgZnJvbSBmaXJpbmcgZnJvbSB0aGlzIHNlbGVjdGlvbiBjaGFuZ2UKLQkJCQkJZW5hYmxlZCA9IGZhbHNlOwotCQkJCQl0YXJnZXRWaWV3LnNldFNlbGVjdGlvblRvVmlld2VyKG9iamVjdHNbMF0pOwotCQkJCQllbmFibGVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQl0YXJnZXRWaWV3ID0gKExpYnJhcnlWaWV3KSB2aWV3OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGVuYWJsZWQpIHsKLQkJCS8vIHJlbW92ZSBsaXN0ZW5lcnMgZnJvbSBlZGl0b3JwYXJ0Ci0JCQl0YXJnZXRWaWV3LmdldFNpdGUoKS5nZXRQYWdlKCkucmVtb3ZlUGFydExpc3RlbmVyKAotCQkJCQllZGl0b3JQYXJ0TGlzdGVuZXIpOwotCi0JCQllbmFibGVkID0gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBzZWxlY3QgZWxlbWVudCBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgZWRpdG9yCi0JCQlPYmplY3RbXSBvYmplY3RzID0gbmV3IE9iamVjdFsxXTsKLQkJCW9iamVjdHNbMF0gPSBFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuZ2V0QWN0aXZlTWV0aG9kRWRpdG9ySW5wdXQoKTsKLQkJCWlmIChvYmplY3RzWzBdICE9IG51bGwpIHsKLQkJCQl0YXJnZXRWaWV3LnNldFNlbGVjdGlvblRvVmlld2VyKG9iamVjdHNbMF0pOwotCQkJfQotCi0JCQkvLyBhZGQgbGlzdGVuZXJzIHRvIGVkaXRvcnBhcnQKLQkJCXRhcmdldFZpZXcuZ2V0U2l0ZSgpLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIoZWRpdG9yUGFydExpc3RlbmVyKTsKLQotCQkJZW5hYmxlZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJMaW5rV2l0aEVkaXRvciBzZWxlY3Rpb24gaXMgIiArIHNlbGVjdGlvbik7Ci0JCWlmIChlbmFibGVkKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5zZWxlY3RFZGl0b3Ioc2VsLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RBZGRJbWFnZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZEFkZEltYWdlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NDg5OTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZEFkZEltYWdlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuTWV0aG9kQWRkSW1hZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlJpY2hUZXh0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotCi0vKioKLSAqIERpc3BsYXlzIHRoZSBBZGQgSW1hZ2UgZGlhbG9nLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kQWRkSW1hZ2VBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RBZGRJbWFnZUFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX0lNQUdFKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuYWRkSW1hZ2VBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgQSBSaWNoIFRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCAmJiByaWNoVGV4dCBpbnN0YW5jZW9mIElNZXRob2RSaWNoVGV4dCkgewotCQkJTWV0aG9kQWRkSW1hZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1ldGhvZEFkZEltYWdlRGlhbG9nKERpc3BsYXkKLQkJCQkJLmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkoKElNZXRob2RSaWNoVGV4dCkgcmljaFRleHQpLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJaWYgKGRpYWxvZy5nZXRGaWxlVG9Db3B5KCkgIT0gbnVsbCkgewotCQkJCQkvLyBDb3B5IHRoZSBpbWFnZSB0byB0aGUgcmVzb3VyY2UgZm9sZGVyIGlmIG5lY2Vzc2FyeS4KLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBpbWFnZUxpbmsgPSBOZXRVdGlsLmRlY29kZWRGaWxlVXJsKExpYnJhcnlVSVV0aWwuZ2V0VVJMRm9yQXR0YWNobWVudChEaXNwbGF5Ci0JCQkJCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgZGlhbG9nCi0JCQkJCQkJCS5nZXRGaWxlVG9Db3B5KCksCi0JCQkJCQkJCSgoSU1ldGhvZFJpY2hUZXh0KSByaWNoVGV4dCkKLQkJCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgpLCB0cnVlKSk7Ci0JCQkJCQlpZiAoaW1hZ2VMaW5rID09IG51bGwpIHsKLQkJCQkJCQkvLyB1c2VyIGhpdCBjYW5jZWwgb24gUmVuYW1lRmlsZUNvbmZsaWN0RGlhbG9nCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJaWYgKHJpY2hUZXh0IGluc3RhbmNlb2YgUmljaFRleHRFZGl0b3IpIHsKLQkJCQkJCQkoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkuc2V0Rm9jdXMoKTsKLQkJCQkJCQkoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkuYWRkSW1hZ2UoaW1hZ2VMaW5rLCAiIiArIGRpYWxvZy5nZXRIZWlnaHQoKSwgIiIgKyBkaWFsb2cuZ2V0V2lkdGgoKSwgZGlhbG9nLmdldEFsdFRhZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJpY2hUZXh0Ci0JCQkJCQkJLmV4ZWN1dGVDb21tYW5kKAotCQkJCQkJCQkJUmljaFRleHRDb21tYW5kLkFERF9JTUFHRSwKLQkJCQkJCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJCQkJCWltYWdlTGluaywKLQkJCQkJCQkJCQkJIiIgKyBkaWFsb2cuZ2V0SGVpZ2h0KCksICIiICsgZGlhbG9nLmdldFdpZHRoKCksIGRpYWxvZy5nZXRBbHRUYWcoKSB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RBZGRMaW5rQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kQWRkTGlua0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDBlYWZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RBZGRMaW5rQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLk1ldGhvZEFkZExpbmtEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5BZGRMaW5rQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBBZGRzIGEgbGluayB0byBhIFJpY2ggVGV4dCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RBZGRMaW5rQWN0aW9uIGV4dGVuZHMgQWRkTGlua0FjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RBZGRMaW5rQWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIEEgUmljaCBUZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIElNZXRob2RSaWNoVGV4dCkgewotCQkJCU1ldGhvZEFkZExpbmtEaWFsb2cgZGlhbG9nID0gbmV3IE1ldGhvZEFkZExpbmtEaWFsb2coRGlzcGxheQotCQkJCQkJLmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJKElNZXRob2RSaWNoVGV4dCkgcmljaFRleHQpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJCVN0cmluZyBsaW5rVVJMID0gZGlhbG9nLmdldExpbmsoKS5nZXRVUkwoKTsKLQkJCQkJaWYgKGxpbmtVUkwubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlpZiAoZGlhbG9nLmdldEZpbGVUb0NvcHkoKSAhPSBudWxsKSB7Ci0JCQkJCQkJLy8gbGluayB0byBhIGZpbGUsIGNyZWF0ZSB0aGUgVVJMCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbGlua1VSTCA9IExpYnJhcnlVSVV0aWwuZ2V0VVJMRm9yQXR0YWNobWVudChEaXNwbGF5Ci0JCQkJCQkJCQkJLmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBkaWFsb2cKLQkJCQkJCQkJCQkuZ2V0RmlsZVRvQ29weSgpLAotCQkJCQkJCQkJCSgoSU1ldGhvZFJpY2hUZXh0KSByaWNoVGV4dCkKLQkJCQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KCksIHRydWUpOwotCQkJCQkJCQlpZiAobGlua1VSTCA9PSBudWxsKSB7Ci0JCQkJCQkJCQkvLyB1c2VyIGhpdCBjYW5jZWwgb24gUmVuYW1lRmlsZUNvbmZsaWN0RGlhbG9nCi0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCX0KLQkJCQkJCQkJU3RyaW5nIHVybCA9ICI8YSBocmVmPVwiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlpZiAoUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoUGxhdGZvcm0uV1NfV0lOMzIpKSB7Ci0JCQkJCQkJCQl1cmwgKz0gTmV0VXRpbAotCQkJCQkJCQkJCQkuZW5jb2RlRmlsZVVSTChOZXRVdGlsLkZJTEVfVVJJX1BSRUZJWAotCQkJCQkJCQkJCQkJCSsgbGlua1VSTCk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQl1cmwgKz0gTmV0VXRpbC5lbmNvZGVGaWxlVVJMKCIuLyIgKyBsaW5rVVJMKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJCXVybCArPSAiXCIiICsgKGRpYWxvZy5nZXRPcGVuTGlua0luTmV3V2luZG93KCkgPyAiICIgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQlNZXRob2RBZGRMaW5rRGlhbG9nLk9QRU5fTElOS19JTl9ORVdfV0lORE9XX0FUVFJJQlVURSA6ICIiKSArICAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJIj4iICsgbmV3IEZpbGUobGlua1VSTCkuZ2V0TmFtZSgpICsgIjwvYT4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJbGlua1VSTCA9IHVybDsKLQotCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIFJpY2hUZXh0RWRpdG9yKSB7Ci0JCQkJCQkJKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpLmFkZEhUTUwobGlua1VSTCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5BRERfSFRNTCwKLQkJCQkJCQkJCWxpbmtVUkwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlzdXBlci5leGVjdXRlKHJpY2hUZXh0KTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZENyZWF0ZUNoaWxkQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kQ3JlYXRlQ2hpbGRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU5NTE2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kQ3JlYXRlQ2hpbGRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5TdGF0aWNTZWxlY3Rpb25Db21tYW5kQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkNyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotCi0KLS8qKgotICogTWV0aG9kIENyZWF0ZSBDaGlsZCBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZXRob2RDcmVhdGVDaGlsZEFjdGlvbiBleHRlbmRzIFN0YXRpY1NlbGVjdGlvbkNvbW1hbmRBY3Rpb24gewotCS8qKgotCSAqIFRoaXMgZGVzY3JpYmVzIHRoZSBjaGlsZCB0byBiZSBjcmVhdGVkLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZGVzY3JpcHRvcjsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiBhbiBhY3Rpb24gdGhhdCBjcmVhdGVzIGEgY2hpbGQgc3BlY2lmaWVkCi0JICogYnkgPGNvZGU+ZGVzY3JpcHRvcjwvY29kZT4gZm9yIHRoZSBzaW5nbGUgb2JqZWN0IGluIHRoZQotCSAqIDxjb2RlPnNlbGVjdGlvbjwvY29kZT4uCi0JICovCi0JcHVibGljIE1ldGhvZENyZWF0ZUNoaWxkQWN0aW9uKEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uLCBPYmplY3QgZGVzY3JpcHRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLmVkaXRpbmdEb21haW4gPSBlZGl0aW5nRG9tYWluOwotCQl0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotCQljb25maWd1cmVBY3Rpb24oc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgdGhlIGNvbW1hbmQgZm9yIHtAbGluawotCSAqIFN0YXRpY1NlbGVjdGlvbkNvbW1hbmRBY3Rpb24jY3JlYXRlQWN0aW9uQ29tbWFuZH0uCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWN0aW9uQ29tbWFuZChFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sCi0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJaWYgKGNvbGxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCU9iamVjdCBvd25lciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQlDb21tYW5kIGNtZCA9IG51bGw7Ci0KLQkJCWlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgQ29tbWFuZFBhcmFtZXRlcgotCQkJCQkmJiAoKENvbW1hbmRQYXJhbWV0ZXIpIGRlc2NyaXB0b3IpLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJQ29tbWFuZFBhcmFtZXRlciBuZXdDaGlsZFBhcmFtZXRlciA9IChDb21tYW5kUGFyYW1ldGVyKSBkZXNjcmlwdG9yOwotCQkJCUNyZWF0ZUNoaWxkQ29tbWFuZC5IZWxwZXIgaGVscGVyID0gKEhlbHBlcikgKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pZWRpdGluZ0RvbWFpbikuZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdChvd25lciwgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotLy8JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChFT2JqZWN0KSBvd25lcikuZUFkYXB0ZXJzKCkuaXRlcmF0b3IoKTsgaXRlcgotLy8JCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0vLwkJCQkJaWYgKG8gaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcikgewotLy8JCQkJCQloZWxwZXIgPSAoUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIpIG87Ci0vLwkJCQkJCWJyZWFrOwotLy8JCQkJCX0KLS8vCQkJCX0KLQkJCQljbWQgPSBuZXcgQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQoZWRpdGluZ0RvbWFpbiwKLQkJCQkJCShFT2JqZWN0KSBvd25lciwgbmV3Q2hpbGRQYXJhbWV0ZXIKLQkJCQkJCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLCBuZXdDaGlsZFBhcmFtZXRlcgotCQkJCQkJCQkuZ2V0VmFsdWUoKSwgbmV3Q2hpbGRQYXJhbWV0ZXIuZ2V0SW5kZXgoKSwKLQkJCQkJCWNvbGxlY3Rpb24sIGhlbHBlcikgewotCQkJCX07Ci0JCQl9IGVsc2UgewotCQkJCWNtZCA9IENyZWF0ZUNoaWxkQ29tbWFuZC5jcmVhdGUoZWRpdGluZ0RvbWFpbiwgb3duZXIsCi0JCQkJCQlkZXNjcmlwdG9yLCBjb2xsZWN0aW9uKTsKLQkJCX0KLQotCQkJcmV0dXJuIG5ldyBDcmVhdGVNZXRob2RFbGVtZW50Q29tbWFuZChjbWQpOwotCQl9Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3VwZXJSdW4oKSB7Ci0JCXN1cGVyLnJ1bigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5TdGF0aWNTZWxlY3Rpb25Db21tYW5kQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBydW5uZXIgPSBuZXcgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKTsKLQkJcnVubmVyLnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCXN1cGVyUnVuKCk7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZENyZWF0ZVNpYmxpbmdBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RDcmVhdGVTaWJsaW5nQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZjRmMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZENyZWF0ZVNpYmxpbmdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlN0YXRpY1NlbGVjdGlvbkNvbW1hbmRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLQotLyoqCi0gKiBNZXRob2QgQ3JlYXRlIFNpYmlsaW5nIGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1ldGhvZENyZWF0ZVNpYmxpbmdBY3Rpb24gZXh0ZW5kcwotCQlTdGF0aWNTZWxlY3Rpb25Db21tYW5kQWN0aW9uIHsKLQotCS8qKgotCSAqIFRoaXMgZGVzY3JpYmVzIHRoZSBzaWJsaW5nIHRvIGJlIGNyZWF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkZXNjcmlwdG9yOwotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIGFuIGFjdGlvbiB0aGF0IGNyZWF0ZXMgYSBzaWJsaW5nIHNwZWNpZmllZAotCSAqIGJ5IDxjb2RlPmRlc2NyaXB0b3I8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBNZXRob2RDcmVhdGVTaWJsaW5nQWN0aW9uKElWaWV3UGFydCB2aWV3UGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24sCi0JCQlPYmplY3QgZGVzY3JpcHRvcikgewotCQlzdXBlcigpOwotCQlpZiAodmlld1BhcnQgaW5zdGFuY2VvZiBJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSB7Ci0JCQllZGl0aW5nRG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSB2aWV3UGFydCkKLQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJfQotCQl0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotCQljb25maWd1cmVBY3Rpb24oc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgdGhlIGNvbW1hbmQgZm9yIHtAbGluawotCSAqIFN0YXRpY1NlbGVjdGlvbkNvbW1hbmRBY3Rpb24jY3JlYXRlQWN0aW9uQ29tbWFuZH0uCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWN0aW9uQ29tbWFuZChFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sCi0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJaWYgKGNvbGxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCUNvbW1hbmQgY21kID0gQ3JlYXRlQ2hpbGRDb21tYW5kLmNyZWF0ZShlZGl0aW5nRG9tYWluLCBudWxsLAotCQkJCQlkZXNjcmlwdG9yLCBjb2xsZWN0aW9uKTsKLQkJCXJldHVybiBuZXcgQ3JlYXRlTWV0aG9kRWxlbWVudENvbW1hbmQoY21kKTsKLQkJfQotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkwYjdmOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvcHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Mb2FkUmVzb3VyY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlBhc3RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5SZWRvQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5VbmRvQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3ViQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLQotLyoqCi0gKiBUaGUgY29udHJpYnV0b3IgZm9yIGEgTWV0aG9kIGVkaXRvci4KLSAqICAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcwotCQlFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQkKLQkvLyBLZWVwIHRyYWNrIG9mIHRoZSBhY3RpdmUgZWRpdG9yLgotCXByb3RlY3RlZCBJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3JQYXJ0OwotCi0JLy8gS2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gcHJvdmlkZXIuCi0JcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcjsKLQotCS8vIEhhbmRsZSB0aGUgU2hvdyBQcm9wZXJ0aWVzIHZpZXcgYWN0aW9uLgotCXByb3RlY3RlZCBJQWN0aW9uIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlnZXRTdHJpbmcoIl9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtIikpIHsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCWdldFBhZ2UoKS5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudmlld3MuUHJvcGVydHlTaGVldCIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXhjZXB0aW9uKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBUaGlzIGFjdGlvbiByZWZyZXNoZXMgdGhlIHZpZXdlciBvZiB0aGUgY3VycmVudCBlZGl0b3IgaWYgdGhlIGVkaXRvcgotCSAqIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcn0uCi0JICovCi0JcHJvdGVjdGVkIElBY3Rpb24gcmVmcmVzaFZpZXdlckFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlnZXRTdHJpbmcoIl9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJcmV0dXJuIGFjdGl2ZUVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXI7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlkb1JlZnJlc2goKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvCi0JICogZWFjaCBkZXNjcmlwdG9yIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGNyZWF0ZUNoaWxkQWN0aW9uczsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZQotCSAqIGFkZGVkIGZvciBDcmVhdGVDaGlsZCBhY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcjsKLQotCS8qKgotCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gY29ycmVzcG9uZGluZwotCSAqIHRvIGVhY2ggZGVzY3JpcHRvciBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbQotCSAqIHByb3ZpZGVyLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGNyZWF0ZVNpYmxpbmdBY3Rpb25zOwotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlCi0JICogYWRkZWQgZm9yIENyZWF0ZVNpYmxpbmcgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlcjsKLQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGVuYWJsZWQ7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNvbnRyaWJ1dG9yLgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IoU3RyaW5nIG5hbWUpIHsKLQkJbG9hZFJlc291cmNlQWN0aW9uID0gbmV3IExvYWRSZXNvdXJjZUFjdGlvbigpOwotCQl2YWxpZGF0ZUFjdGlvbiA9IG5ldyBMaWJyYXJ5VmFsaWRhdGVBY3Rpb24oKTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGRlbGV0ZSBhY3Rpb24KLQkgKiBAcmV0dXJuIEFjdGlvbgotCSAqLwotCXByb3RlY3RlZCBEZWxldGVBY3Rpb24gY3JlYXRlRGVsZXRlQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IERlbGV0ZUFjdGlvbigpOwotCX0KLQotCSAvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IjaW5pdChvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFycykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldFNoYXJlZEltYWdlcygpOwotCi0JCWRlbGV0ZUFjdGlvbiA9IGNyZWF0ZURlbGV0ZUFjdGlvbigpOwotCQlkZWxldGVBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ERUxFVEUpKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksCi0JCQkJZGVsZXRlQWN0aW9uKTsKLQotCQljdXRBY3Rpb24gPSBjcmVhdGVDdXRBY3Rpb24oKTsKLQkJY3V0QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQ1VUKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpLCBjdXRBY3Rpb24pOwotCi0JCWNvcHlBY3Rpb24gPSBjcmVhdGVDb3B5QWN0aW9uKCk7Ci0JCWNvcHlBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9DT1BZKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwKLQkJCQljb3B5QWN0aW9uKTsKLQotCQlwYXN0ZUFjdGlvbiA9IGNyZWF0ZVBhc3RlQWN0aW9uKCk7Ci0JCXBhc3RlQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfUEFTVEUpKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSwKLQkJCQlwYXN0ZUFjdGlvbik7Ci0KLQkJdW5kb0FjdGlvbiA9IG5ldyBVbmRvQWN0aW9uKCk7Ci0JCXVuZG9BY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9VTkRPKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlVORE8uZ2V0SWQoKSwKLQkJCQl1bmRvQWN0aW9uKTsKLQotCQlyZWRvQWN0aW9uID0gbmV3IFJlZG9BY3Rpb24oKTsKLQkJcmVkb0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1JFRE8pKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUkVETy5nZXRJZCgpLAotCQkJCXJlZG9BY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY29weSBhY3Rpb24KLQkgKiBAcmV0dXJuIEFjdGlvbgotCSAqLwotCXByb3RlY3RlZCBDb3B5QWN0aW9uIGNyZWF0ZUNvcHlBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgQ29weUFjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgcGFzdGUgYWN0aW9uCi0JICogQHJldHVybiBBY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgUGFzdGVBY3Rpb24gY3JlYXRlUGFzdGVBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUGFzdGVBY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGN1dCBhY3Rpb24KLQkgKiBAcmV0dXJuIEFjdGlvbgotCSAqLwotCXByb3RlY3RlZCBDdXRBY3Rpb24gY3JlYXRlQ3V0QWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IEN1dEFjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBTZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zIHRvIHRoZSB0b29sIGJhci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihuYW1lICsgIi1zZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAotCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihuYW1lICsgIi1hZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGVuYWJsZWQgZmxhZwotCSAqIEBwYXJhbSBlbmFibGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIG1lbnUgYmFyIGEgbWVudSBhbmQgc29tZSBzZXBhcmF0b3JzIGZvciBlZGl0b3IKLQkgKiBhZGRpdGlvbnMsIGFzIHdlbGwgYXMgdGhlIHN1Yi1tZW51cyBmb3Igb2JqZWN0IGNyZWF0aW9uIGl0ZW1zLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb01lbnUobWVudU1hbmFnZXIpOwotCQlJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJZ2V0U3RyaW5nKCJfVUlfIiArIG5hbWUgKyAiX21lbnUiKSwgIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuIiArIG5hbWUgKyAiTWVudUlEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucyIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigic2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFjdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zLWVuZCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFByZXBhcmUgZm9yIENyZWF0ZUNoaWxkIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4KLQkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFByZXBhcmUgZm9yIENyZWF0ZVNpYmxpbmcgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgotCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gRm9yY2UgYW4gdXBkYXRlIGJlY2F1c2UgRWNsaXBzZSBoaWRlcyBlbXB0eSBtZW51cyBub3cuCi0JCXN1Ym1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcihuZXcgSU1lbnVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJCQltZW51TWFuYWdlci51cGRhdGVBbGwodHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWFkZEdsb2JhbEFjdGlvbnMoc3VibWVudU1hbmFnZXIpOwotCX0KLQotCS8qKgotCSAqIFdoZW4gdGhlIGFjdGl2ZSBlZGl0b3IgY2hhbmdlcywgdGhpcyByZW1lbWJlcnMgdGhlIGNoYW5nZSBhbmQgcmVnaXN0ZXJzCi0JICogd2l0aCBpdCBhcyBhIHNlbGVjdGlvbiBwcm92aWRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgcGFydCkgewotCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IocGFydCk7Ci0JCWFjdGl2ZUVkaXRvclBhcnQgPSBwYXJ0OwotCi0JCS8vIFN3aXRjaCB0byB0aGUgbmV3IHNlbGVjdGlvbiBwcm92aWRlci4KLQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlpZiAocGFydCA9PSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlciA9IHBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLQkJCS8vIEZha2UgYSBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCB0byB1cGRhdGUgdGhlIG1lbnVzLgotCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpICE9IG51bGwpIHsKLQkJCQlzZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsCi0JCQkJCQlzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn0sIGhhbmRsaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50fSBieSBxdWVyeWluZyBmb3IKLQkgKiB0aGUgY2hpbGRyZW4gYW5kIHNpYmxpbmdzIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZWxlY3RlZCBvYmplY3QgYW5kCi0JICogdXBkYXRpbmcgdGhlIG1lbnVzIGFjY29yZGluZ2x5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIFJlbW92ZSBhbnkgbWVudSBpdGVtcyBmb3Igb2xkIHNlbGVjdGlvbi4KLQkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zKTsKLQkJfQotCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMpOwotCQl9Ci0KLQkJLy8gUXVlcnkgdGhlIG5ldyBzZWxlY3Rpb24gZm9yIGFwcHJvcHJpYXRlIG5ldyBjaGlsZC9zaWJsaW5nCi0JCS8vIGRlc2NyaXB0b3JzLgotCQlDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMgPSBudWxsOwotCQlDb2xsZWN0aW9uIG5ld1NpYmxpbmdEZXNjcmlwdG9ycyA9IG51bGw7Ci0KLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uCi0JCQkJJiYgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5zaXplKCkgPT0gMSkgewotCQkJT2JqZWN0IG9iamVjdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikKLQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCi0JCQlFZGl0aW5nRG9tYWluIGRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgYWN0aXZlRWRpdG9yUGFydCkKLQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQotCQkJbmV3Q2hpbGREZXNjcmlwdG9ycyA9IGRvbWFpbi5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG9iamVjdCwgbnVsbCk7Ci0JCQluZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhudWxsLCBvYmplY3QpOwotCQl9Ci0KLQkJLy8gR2VuZXJhdGUgYWN0aW9ucyBmb3Igc2VsZWN0aW9uOyBwb3B1bGF0ZSBhbmQgcmVkcmF3IHRoZSBtZW51cy4KLQkJY3JlYXRlQ2hpbGRBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMobmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCQlzZWxlY3Rpb24pOwotCQljcmVhdGVTaWJsaW5nQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMoCi0JCQkJbmV3U2libGluZ0Rlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOwotCi0JCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOwotCQkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7Ci0JCX0KLQkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywKLQkJCQkJbnVsbCk7Ci0JCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufQotCSAqIGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sIGFuZCByZXR1cm5zIHRoZQotCSAqIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLAotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQ29sbGVjdGlvbiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJYWN0aW9ucy5hZGQobmV3IENyZWF0ZUNoaWxkQWN0aW9uKGFjdGl2ZUVkaXRvclBhcnQsIHNlbGVjdGlvbiwKLQkJCQkJCWkubmV4dCgpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZW5lcmF0ZXMgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gZm9yIGVhY2gKLQkgKiBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LCBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZgotCSAqIHRoZXNlIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLAotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQ29sbGVjdGlvbiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJYWN0aW9ucy5hZGQobmV3IENyZWF0ZVNpYmxpbmdBY3Rpb24oYWN0aXZlRWRpdG9yUGFydCwKLQkJCQkJCXNlbGVjdGlvbiwgaS5uZXh0KCkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHBvcHVsYXRlcyB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cyBiYXNlZCBvbiB0aGUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlCi0JICogPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbiwgYnkgaW5zZXJ0aW5nIHRoZW0gYmVmb3JlIHRoZSBzcGVjaWZpZWQKLQkgKiBjb250cmlidXRpb24gaXRlbSA8Y29kZT5jb250cmlidXRpb25JRDwvY29kZT4uIElmIDxjb2RlPklEPC9jb2RlPiBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LCB0aGV5IGFyZSBzaW1wbHkgYWRkZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsCi0JCQlDb2xsZWN0aW9uIGFjdGlvbnMsIFN0cmluZyBjb250cmlidXRpb25JRCkgewotCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBhY3Rpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCUlBY3Rpb24gYWN0aW9uID0gKElBY3Rpb24pIGkubmV4dCgpOwotCQkJCWlmIChjb250cmlidXRpb25JRCAhPSBudWxsKSB7Ci0JCQkJCW1hbmFnZXIuaW5zZXJ0QmVmb3JlKGNvbnRyaWJ1dGlvbklELCBhY3Rpb24pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1hbmFnZXIuYWRkKGFjdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZW1vdmVzIGZyb20gdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cyBiYXNlZCBvbiB0aGUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlCi0JICogPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZXBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLAotCQkJQ29sbGVjdGlvbiBhY3Rpb25zKSB7Ci0JCWlmIChhY3Rpb25zICE9IG51bGwpIHsKLQkJCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBtYW5hZ2VyLmdldEl0ZW1zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gTG9vayBpbnRvIFN1YkNvbnRyaWJ1dGlvbkl0ZW1zCi0JCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY29udHJpYnV0aW9uSXRlbSA9IGl0ZW1zW2ldOwotCQkJCXdoaWxlIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgU3ViQ29udHJpYnV0aW9uSXRlbSkgewotCQkJCQljb250cmlidXRpb25JdGVtID0gKChTdWJDb250cmlidXRpb25JdGVtKSBjb250cmlidXRpb25JdGVtKQotCQkJCQkJCS5nZXRJbm5lckl0ZW0oKTsKLQkJCQl9Ci0KLQkJCQkvLyBEZWxldGUgdGhlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW1zIHdpdGggbWF0Y2hpbmcgYWN0aW9uLgotCQkJCWlmIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgewotCQkJCQlJQWN0aW9uIGFjdGlvbiA9ICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgY29udHJpYnV0aW9uSXRlbSkKLQkJCQkJCQkuZ2V0QWN0aW9uKCk7Ci0JCQkJCWlmIChhY3Rpb25zLmNvbnRhaW5zKGFjdGlvbikpIHsKLQkJCQkJCW1hbmFnZXIucmVtb3ZlKGNvbnRyaWJ1dGlvbkl0ZW0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBwb3B1bGF0ZXMgdGhlIHBvcC11cCBtZW51IGJlZm9yZSBpdCBhcHBlYXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJLy8gQWRkIG91ciBzdGFuZGFyZCBtYXJrZXIuCi0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImVkaXQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBBZGQgdGhlIGVkaXQgbWVudSBhY3Rpb25zLgotCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0odW5kb0FjdGlvbikpOwotCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0ocmVkb0FjdGlvbikpOwotCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJLy8gbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGN1dEFjdGlvbikpOwotCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oY29weUFjdGlvbikpOwotCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0ocGFzdGVBY3Rpb24pKTsKLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShkZWxldGVBY3Rpb24pKTsKLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLQkJLy8gQWRkIG91ciBvdGhlciBzdGFuZGFyZCBtYXJrZXIuCi0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMtZW5kIikpOyAvLyROT04tTkxTLTEkCi0KLQkJYWRkR2xvYmFsQWN0aW9ucyhtZW51TWFuYWdlcik7Ci0KLQkJaWYgKGVuYWJsZWQpIHsKLQkJCU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbnVsbDsKLQkJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCQlnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCi0KLQkJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCQlnZXRTdHJpbmcoIl9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywgbnVsbCk7Ci0JCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucyIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbnNlcnRzIGdsb2JhbCBhY3Rpb25zIGJlZm9yZSB0aGUgImFkZGl0aW9ucy1lbmQiIHNlcGFyYXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRHbG9iYWxBY3Rpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zLWVuZCIsIG5ldyBTZXBhcmF0b3IoInVpLWFjdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigidWktYWN0aW9ucyIsIHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZWZyZXNoVmlld2VyQWN0aW9uLnNldEVuYWJsZWQocmVmcmVzaFZpZXdlckFjdGlvbi5pc0VuYWJsZWQoKSk7Ci0JCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgcmVmcmVzaFZpZXdlckFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JICAgIFN0cmluZyBrZXkgPSAoc3R5bGUgJiBBRERJVElPTlNfTEFTVF9TVFlMRSkgPT0gMCA/ICJhZGRpdGlvbnMtZW5kIiA6ICJhZGRpdGlvbnMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkgICAgaWYgKHZhbGlkYXRlQWN0aW9uICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoa2V5LCBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSh2YWxpZGF0ZUFjdGlvbikpOwotCSAgICB9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZyhrZXkpOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2ggdGhlIHZpZXdlcgotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9SZWZyZXNoKCkgewotCQlpZiAoYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgewotCQkJVmlld2VyIHZpZXdlciA9ICgoSVZpZXdlclByb3ZpZGVyKSBhY3RpdmVFZGl0b3JQYXJ0KS5nZXRWaWV3ZXIoKTsKLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9Nb3ZlRG93bkFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01vdmVEb3duQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYWEwZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01vdmVEb3duQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuTW92ZURvd25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLS8qKgotICogTW92ZXMgdXAgYnJlYWtkb3duIGVsZW1lbnQgaW4gYSBwcm9jZXNzIHRyZWUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMgotICovCi1wdWJsaWMgY2xhc3MgTW92ZURvd25BY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdE1vdmVBY3Rpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZURvd247Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL2V0b29sMTYvbW92ZV9kb3duLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkiZnVsbC9ldG9vbDE2L21vdmVfZG93bl9kaXNhYmxlZC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBNb3ZlRG93bkFjdGlvbigpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSU1HX0RFU0MpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfREVTQyk7Ci0JCXNldFRvb2xUaXBUZXh0KExBQkVMKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVNb3ZlQ29tbWFuZChBY3Rpdml0eSBhY3QsIE9iamVjdCBlbGVtZW50LAotCQkJQ29sbGVjdGlvbjxFQ2xhc3M+IGNsYXNzZXMpIHsKLQkJcmV0dXJuIG5ldyBNb3ZlRG93bkNvbW1hbmQoYWN0LCBlbGVtZW50LCBjbGFzc2VzKTsKLQl9CQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsJCQotCQlpZihzdXBlci5hY2NlcHQoc2VsZWN0aW9uKSkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgaXAgPSBnZXRJdGVtUHJvdmlkZXIoZWxlbWVudCk7Ci0JCQlpZihpcCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuICFpcC5pc0xhc3RFbGVtZW50KGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTW92ZVVwQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTW92ZVVwQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OTYxMTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01vdmVVcEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLk1vdmVVcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotLyoqCi0gKiBNb3ZlcyB1cCBicmVha2Rvd24gZWxlbWVudCBpbiBhIHByb2Nlc3MgdHJlZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBNb3ZlVXBBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdE1vdmVBY3Rpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZVVwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQyA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9ldG9vbDE2L21vdmVfdXAuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0MgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvZXRvb2wxNi9tb3ZlX3VwX2Rpc2FibGVkLmdpZiIpOyAvLyROT04tTkxTLTEkIAotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBNb3ZlVXBBY3Rpb24oKSB7Ci0JCXN1cGVyKExBQkVMKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKElNR19ERVNDKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX0RFU0MpOwotCQlzZXRUb29sVGlwVGV4dChMQUJFTCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlTW92ZUNvbW1hbmQoQWN0aXZpdHkgYWN0LCBPYmplY3QgZWxlbWVudCwKLQkJCUNvbGxlY3Rpb248RUNsYXNzPiBjbGFzc2VzKSB7Ci0JCXJldHVybiBuZXcgTW92ZVVwQ29tbWFuZChhY3QsIGVsZW1lbnQsIGNsYXNzZXMpOwotCX0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewkJCi0JCWlmKHN1cGVyLmFjY2VwdChzZWxlY3Rpb24pKSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCUlCU0l0ZW1Qcm92aWRlciBpcCA9IGdldEl0ZW1Qcm92aWRlcihlbGVtZW50KTsKLQkJCWlmKGlwICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gIWlwLmlzRmlyc3RFbGVtZW50KGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTXVsdGlBY3Rpb25Hcm91cC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL011bHRpQWN0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgwZGFkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTXVsdGlBY3Rpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Hcm91cDsKLQotLyoqCi0gKiBBIE11bHRpQWN0aW9uR3JvdXAgd2lsbCBkaXNwbGF5IGEgbGlzdCBvZiBJQWN0aW9ucyBpbiBhIG1lbnUgYnkgdHJhbnNmb3JtaW5nIHRoZW0KLSAqIGludG8gTWVudUl0ZW1zLiBUaGUgbGlzdCBvZiBsYWJlbHMgZ2l2ZW4gd2lsbCBiZSB3aGF0IGlzIGRpc3BsYXllZCBpbiB0aGUgVmlld01lbnUgZm9yIAotICogdGhlIGNvcnJlc3BvbmRpbmcgYWN0aW9uICh0aGUgYWN0aW9uIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGluIHRoZSBhY3Rpb24gYXJyYXkpLgotICogVGhlIGFjdGlvbnMgYXJlIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBhcyBzdGF0ZSBiYXNlZAotICogc28gdGhhdCBhZnRlciBhbiBhY3Rpb24gaXMgZXhlY3V0ZWQgdGhlIGxhYmVsIHdpbGwgaGF2ZSBhIHNlbGVjdGlvbiBjaGVjay4KLSAqIAotICogQ29kZSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5hY3Rpb25zLk11bHRpQWN0aW9uR3JvdXAuY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIE11bHRpQWN0aW9uR3JvdXAgZXh0ZW5kcyBBY3Rpb25Hcm91cCB7Ci0JCi0JcHVibGljIElBY3Rpb25bXSBOT19BQ1RJT05TID0gbmV3IElBY3Rpb25bMF07Ci0JCi0JcHJpdmF0ZSBJQWN0aW9uW10gZkFjdGlvbnM7IAotCQotCXByaXZhdGUgaW50IGZDdXJyZW50U2VsZWN0aW9uOwotCXByaXZhdGUgTWVudUl0ZW1bXSBmSXRlbXM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbiBncm91cCB3aXRoIGEgZ2l2ZW4gc2V0IG9mIGFjdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGFjdGlvbnMJCQl0aGUgYWN0aW9ucyBmb3IgdGhpcyBtdWx0aSBncm91cAotCSAqIEBwYXJhbSBjdXJyZW50U2VsZWN0aW9uCWRlY2lkZXMgd2hpY2ggYWN0aW9uIGlzIHNlbGVjdGVkIGluIHRoZSBtZW51IG9uIHN0YXJ0IHVwLgotCSAqIAkJCQkJCQlEZW5vdGVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgYWN0aW9ucyBhcnJheSBvZiB0aGUgY3VycmVudAotCSAqIAkJCQkJCQlzZWxlY3RlZCBzdGF0ZS4gSXQgY2Fubm90IGJlIG51bGwuCi0JICovCi0JcHVibGljIE11bHRpQWN0aW9uR3JvdXAoSUFjdGlvbltdIGFjdGlvbnMsIGludCBjdXJyZW50U2VsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldEFjdGlvbnMoYWN0aW9ucywgY3VycmVudFNlbGVjdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uIGdyb3VwLiBDbGllbnRzIHVzaW5nIHRoaXMgY29uc3RydWN0b3IgbXVzdCBzZXQgdGhlIGFjdGlvbnMKLQkgKiBpbW1lZGlhdGVseSBhZnRlciBjcmVhdGluZyB0aGUgbXVsdGkgYWN0aW9uIGdyb3VwIGJ5IGNhbGxpbmcge0BsaW5rICNzZXRBY3Rpb25zKElBY3Rpb25bXSwgaW50KX0uCi0JICovCi0JcHJvdGVjdGVkIE11bHRpQWN0aW9uR3JvdXAoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGdpdmVuIGFjdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGFjdGlvbnMJCQl0aGUgYWN0aW9ucyBmb3IgdGhpcyBtdWx0aSBncm91cCwgYXQgbGVhc3Qgb25lCi0JICogQHBhcmFtIGN1cnJlbnRTZWxlY3Rpb24JZGVjaWRlcyB3aGljaCBhY3Rpb24gaXMgc2VsZWN0ZWQgaW4gdGhlIG1lbnUgb24gc3RhcnQgdXAuCi0JICogCQkJCQkJCURlbm90ZXMgdGhlIGxvY2F0aW9uIGluIHRoZSBhY3Rpb25zIGFycmF5IG9mIHRoZSBjdXJyZW50Ci0JICogCQkJCQkJCXNlbGVjdGVkIHN0YXRlLiBJdCBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRBY3Rpb25zKElBY3Rpb25bXSBhY3Rpb25zLCBpbnQgY3VycmVudFNlbGVjdGlvbikgewotCQlmQ3VycmVudFNlbGVjdGlvbj0gY3VycmVudFNlbGVjdGlvbjsKLQkJZkFjdGlvbnMgPSBhY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGFjdGlvbnMgdG8gdGhlIGdpdmVuIG1lbnUgbWFuYWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBY3Rpb25zKElNZW51TWFuYWdlciB2aWV3TWVudSkgewotCi0JCXZpZXdNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQlmSXRlbXM9IG5ldyBNZW51SXRlbVtmQWN0aW9ucy5sZW5ndGhdOwotCi0JCWZvciAoaW50IGk9IDA7IGkgPCBmQWN0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgaW50IGo9IGk7Ci0KLQkJCXZpZXdNZW51LmFkZChuZXcgQ29udHJpYnV0aW9uSXRlbSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGZpbGwoTWVudSBtZW51LCBpbnQgaW5kZXgpIHsKLQkJCQkJCi0JCQkJCWludCBzdHlsZT0gU1dULkNIRUNLOwotCQkJCQlpZiAoKGZBY3Rpb25zW2pdLmdldFN0eWxlKCkgJiBJQWN0aW9uLkFTX1JBRElPX0JVVFRPTikgIT0gMCkKLQkJCQkJCXN0eWxlPSBTV1QuUkFESU87Ci0JCQkJCQotCQkJCQlNZW51SXRlbSBtaT0gbmV3IE1lbnVJdGVtKG1lbnUsIHN0eWxlLCBpbmRleCk7Ci0JCQkJCUltYWdlRGVzY3JpcHRvciBkPSBmQWN0aW9uc1tqXS5nZXRJbWFnZURlc2NyaXB0b3IoKTsKLQkJCQkJbWkuc2V0SW1hZ2UoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5nZXQoZCkpOwotCQkJCQlmSXRlbXNbal09IG1pOwotCQkJCQltaS5zZXRUZXh0KGZBY3Rpb25zW2pdLmdldFRleHQoKSk7Ci0JCQkJCW1pLnNldFNlbGVjdGlvbihmQ3VycmVudFNlbGVjdGlvbiA9PSBqKTsKLQkJCQkJbWkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCQlpZiAoZkN1cnJlbnRTZWxlY3Rpb24gPT0gaikgewotCQkJCQkJCQlmSXRlbXNbZkN1cnJlbnRTZWxlY3Rpb25dLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCQlmQWN0aW9uc1tqXS5ydW4oKTsKLQotCQkJCQkJCS8vIFVwZGF0ZSBjaGVja2VkIHN0YXRlCi0JCQkJCQkJZkl0ZW1zW2ZDdXJyZW50U2VsZWN0aW9uXS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCQkJCWZDdXJyZW50U2VsZWN0aW9uPSBqOwotCQkJCQkJCWZJdGVtc1tmQ3VycmVudFNlbGVjdGlvbl0uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCQkJfQotCi0JCQkJCX0pOwotCQkJCX0KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0R5bmFtaWMoKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9OZXdDb25maWd1cmF0aW9uQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTmV3Q29uZmlndXJhdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTZlNDM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9OZXdDb25maWd1cmF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdDb25maWd1cmF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgTmV3IE1ldGhvZCBDb25maWd1cmF0aW9uIHdpemFyZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdDb25maWd1cmF0aW9uQWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQotCS8vIFRoZSBjdXJyZW50IHdvcmtiZW5jaCB3aW5kb3cuCi0JcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotCS8vIFRoZSBjdXJyZW50IHNlbGVjdGlvbiBvYmplY3QuCi0JcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0NvbmZpZ3VyYXRpb25BY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3Q29uZmlndXJhdGlvbkFjdGlvbihTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KElXb3JrYmVuY2hXaW5kb3cpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl0aGlzLndpbmRvdyA9IHdpbmRvdzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24sIElTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKElBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXJ1bigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBudWxsOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCXdvcmtiZW5jaCA9IHdpbmRvdy5nZXRXb3JrYmVuY2goKTsKLQkJfQotCQlpZiAod29ya2JlbmNoID09IG51bGwpIHsKLQkJCXdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJTmV3Q29uZmlndXJhdGlvbldpemFyZCB3aXphcmQgPSBuZXcgTmV3Q29uZmlndXJhdGlvbldpemFyZCgpOwotCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJd2l6YXJkLmluaXQod29ya2JlbmNoLCAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JCQl9IGVsc2UgewotCQkJCXdpemFyZC5pbml0KHdvcmtiZW5jaCwgbnVsbCk7Ci0JCQl9Ci0JCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgd2l6YXJkKTsKLQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdDb25maWd1cmF0aW9uV2l6YXJkX3RpdGxlLAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5vcGVuQ29uZmlnV2l6YXJkRXJyb3JfbXNnLAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5pbnRlcm5hbEVycm9yX3JlYXNvbiwgIiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9OZXdQbHVnaW5BY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9OZXdQbHVnaW5BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU1Njc5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTmV3UGx1Z2luQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuUGVyc3BlY3RpdmVMaXN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3UGx1Z2luV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5QZXJzcGVjdGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogRGlzcGxheXMgdGhlIE5ldyBNZXRob2QgUGx1Zy1pbiB3aXphcmQgYW5kIGNyZWF0ZXMgYSBuZXcgcGx1Zy1pbiB3aGVuIHRoZQotICogdXNlciBzZWxlY3RzIHRoZSBGaW5pc2ggYnV0dG9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdQbHVnaW5BY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cwotCQlJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCi0JLy8gVGhlIGNhY2hlZCB3aW5kb3cgb2JqZWN0LgotCXByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdQbHVnaW5BY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3UGx1Z2luQWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2luaXQoSVdvcmtiZW5jaFdpbmRvdykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCXRoaXMud2luZG93ID0gd2luZG93OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihJQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlydW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCU1ldGhvZExpYnJhcnkgdGFyZ2V0TGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAodGFyZ2V0TGliID09IG51bGwpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbldpemFyZF90aXRsZSwgCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5vT3BlbkxpYnJhcnlFcnJvcl9tc2cpOyAKLQkJCXJldHVybjsKLQkJfQotCi0JCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkodGFyZ2V0TGliLCBzaGVsbCk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXkoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbldpemFyZF90aXRsZSwgCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbldpemFyZF9jcmVhdGVFcnJvciwgCi0JCQkJCXN0YXR1cyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmaW5hbCBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IHdpbmRvdyAhPSBudWxsID8gKHdpbmRvdy5nZXRXb3JrYmVuY2goKSA9PSBudWxsID8gUGxhdGZvcm1VSQotCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCTogd2luZG93LmdldFdvcmtiZW5jaCgpKQotCQkJCTogUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlleGVjdXRlKHdvcmtiZW5jaCwgbnVsbCk7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uLCBJU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB3b3JrYmVuY2gKLQkgKiAgICAgICAgICAgIFRoZSBhY3RpdmUgd29ya2JlbmNoLgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIFRoZSBhY3RpdmUgc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBleGVjdXRlKElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlOZXdQbHVnaW5XaXphcmQgd2l6YXJkID0gbmV3IE5ld1BsdWdpbldpemFyZCgpOwotCi0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiB8fCBzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJd2l6YXJkLmluaXQod29ya2JlbmNoLCAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JCX0KLQotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0KLQkJaWYgKCFQZXJzcGVjdGl2ZUxpc3RVdGlsLmlzQXV0aG9yaW5nUGVyc3BlY3RpdmUoKSkgewotCQkJUGVyc3BlY3RpdmVVdGlsCi0JCQkJCS5vcGVuUGVyc3BlY3RpdmUoQXV0aG9yaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5DaGVhdHNoZWV0Vmlldy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5DaGVhdHNoZWV0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjA1MzZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PcGVuQ2hlYXRzaGVldFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNoZWF0c2hlZXRzLnZpZXdzLkNoZWF0U2hlZXRWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludHJvLklJbnRyb1NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50cm8uY29uZmlnLklJbnRyb0FjdGlvbjsKLQotLyoqCi0gKiBPcGVuIGNoZWF0IHNoZWV0IHZpZXcKLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5DaGVhdHNoZWV0VmlldyBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElJbnRyb0FjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBPcGVuQ2hlYXRzaGVldFZpZXcoKSB7Ci0JCXN1cGVyKEF1dGhvcmluZ1VJUmVzb3VyY2VzLk9wZW5DaGVhdHNoZWV0Vmlld190aXRsZSk7IAotCX0KLQotCS8qIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50cm8uY29uZmlnLklJbnRyb0FjdGlvbiNydW4ob3JnLmVjbGlwc2UudWkuaW50cm8uSUludHJvU2l0ZSwgamF2YS51dGlsLlByb3BlcnRpZXMpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElJbnRyb1NpdGUgc2l0ZSwgUHJvcGVydGllcyBwYXJhbXMpIHsKLQkJU3RyaW5nIGNoZWF0c2hlZXRfaWQgPSBwYXJhbXMuZ2V0UHJvcGVydHkoImlucHV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHRvZ2dsZV9zdHIgPSBwYXJhbXMuZ2V0UHJvcGVydHkoInRvZ2dsZSIpOyAvLyROT04tTkxTLTEkCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIElORk86IGNoZWF0c2hlZXQgaWQgPSAiICsgY2hlYXRzaGVldF9pZCk7Ci0KLQkJSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCi0JCS8vIGRlLW1heGltYWl6ZSB0aGUgd2VsY29tZSwgaS5lLiB0aGUgaW50cm8gdmlldyB3aW5kb3cKLQkJaWYgKHRvZ2dsZV9zdHIgIT0gbnVsbCAmJiB0b2dnbGVfc3RyLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0b2dnbGVBY3RpdmVWaWV3KCk7Ci0JCX0KLQotCQl0cnkgewotCQkJLy8gQ2hlYXRTaGVldFZpZXcgb2JqID0gbmV3IENoZWF0U2hlZXRWaWV3KCk7Ci0JCQlhY3RpdmVXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLnNob3dWaWV3KAotCQkJCQkib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMudmlld3MuQ2hlYXRTaGVldFZpZXciKTsgLy8kTk9OLU5MUy0xJAotCQkJQ2hlYXRTaGVldFZpZXcgY3NWaWV3ID0gKENoZWF0U2hlZXRWaWV3KSBhY3RpdmVXaW5kb3cKLQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQljc1ZpZXcuc2V0SW5wdXQoY2hlYXRzaGVldF9pZCk7Ci0KLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhwKSB7Ci0JCQkvLyAkJCQgZXJyb3IgaGFuZGxpbmcgaGVyZS4KLQkJfQotCi0JfQotCi0JLyoqCi0JICogVG9nZ2xlIGFjdGl2ZSB2aWV3Ci0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgdG9nZ2xlQWN0aXZlVmlldygpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCi0JCS8vIGRlLW1heGltYWl6ZSB0aGUgd2VsY29tZSwgaS5lLiB0aGUgaW50cm8gdmlldyB3aW5kb3cgb3IgYW55IGFjdGl2ZQotCQkvLyB2aWV3Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBhY3RpdmVXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQlpZiAocGFnZSBpbnN0YW5jZW9mIFdvcmtiZW5jaFBhZ2UpIHsKLQkJCQkvL1dvcmtiZW5jaFBhZ2UgcmVhbFBhZ2UgPSAoV29ya2JlbmNoUGFnZSkgcGFnZTsKLQotCQkJCUlXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYgPSBwYWdlLmdldEFjdGl2ZVBhcnRSZWZlcmVuY2UoKTsKLQotCQkJCWlmIChwYXJ0UmVmICE9IG51bGwpIHsKLQkJCQkJKChXb3JrYmVuY2hQYWdlKSBwYWdlKS50b2dnbGVab29tKHBhcnRSZWYpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5FbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PcGVuRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MmI0ZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5FbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuUGVyc3BlY3RpdmVMaXN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlVJQWN0aW9uRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuQ29udHJpYnV0aW9uU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotCi0vKioKLSAqIE9wZW4gYSBtZXRob2QgZWxlbWVudCBlZGl0b3IgZGVsZWdhdGlvbiBhY3Rpb24KLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuRWxlbWVudEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydDsKLQotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQlwcml2YXRlIENvbnRyaWJ1dGlvblNlbGVjdGlvbiBjb250cmlidXRvclNlbGVjdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqCi0JICovCi0JcHVibGljIE9wZW5FbGVtZW50QWN0aW9uRGVsZWdhdGUoKSB7Ci0JCXN1cGVyKCk7Ci0JCWNvbnRyaWJ1dG9yU2VsZWN0b3IgPSBuZXcgQ29udHJpYnV0aW9uU2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlUGFydChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQl0aGlzLnRhcmdldFBhcnQgPSB0YXJnZXRQYXJ0OwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIE9wZW4gZWxlbWVudCBhY3Rpb24hIik7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgNTogIiArIHNlbGVjdGlvbik7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0KLQkJQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHRhcmdldFBhcnQgPSAiICsgdGFyZ2V0UGFydCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRhcmdldFBhcnQgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uVmlldykgewotCQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gc2VsZWN0ZWQuaXRlcmF0b3IoKTsgb2JqZWN0cy5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmplY3RzLm5leHQoKSk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGNvbnRyaWJ1dG9yU2VsZWN0b3IKLQkJCQkJCQkuZ2V0U2VsZWN0ZWRDb250cmlidXRvcigoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50KTsKLQkJCQkJaWYgKG9iaiAhPSBudWxsKQotCQkJCQkJZWxlbWVudExpc3QuYWRkKG9iaik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZWxlbWVudExpc3QuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGVkLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqZWN0cy5uZXh0KCkpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQllbGVtZW50TGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGVsZW1lbnRMaXN0LnNpemUoKSA8IDEpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKFBlcnNwZWN0aXZlTGlzdFV0aWwuaXNCcm93c2luZ1BlcnNwZWN0aXZlKCkpIHsKLQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmUoKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IGVsZW1lbnRMaXN0Lml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBvYmplY3RzLm5leHQoKTsKLQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRWRpdG9yKGVsZW1lbnQpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5FbGVtZW50V29ya2JlbmNoQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcyYzRiYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5QZXJzcGVjdGl2ZUxpc3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuVUlBY3Rpb25EaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjsKLQotCi0vKioKLSAqIE9wZW4gbWV0aG9kIGVsZW1lbnQgZWRpdG9yIGRlbGVnYXRpb24gYWN0aW9uIAotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5FbGVtZW50V29ya2JlbmNoQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcwotCQlCYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24gaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCi0JLy8gcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICoKLQkgKi8KLQlwdWJsaWMgT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZSgpIHsKLQkJdGhpcygKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5PcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlX2VkaXRfdGV4dDApOyAKLQl9Ci0KLQlwcm90ZWN0ZWQgT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZShTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJLy8gdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIE9wZW4gZWxlbWVudCBhY3Rpb24hIik7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgNTogIiArIHNlbGVjdGlvbik7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0KLQkJaWYgKFBlcnNwZWN0aXZlTGlzdFV0aWwuaXNCcm93c2luZ1BlcnNwZWN0aXZlKCkpIHsKLQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmUoKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGVkLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmplY3RzLm5leHQoKSk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCA2OiAiICsgZWxlbWVudCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkub3BlbkVkaXRvcihlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3RlZCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCi0JCS8vIGlmICghUGVyc3BlY3RpdmVMaXN0VWl0bC5pc0F1dGhvcmluZ1BlcnNwZWN0aXZlKCkgfHwKLQkJLy8gc2VsZWN0ZWQuaXNFbXB0eSgpKSB7Ci0JCWlmIChzZWxlY3RlZC5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWJvb2xlYW4gZW5hYmxlTWVudSA9IHRydWU7Ci0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGVkLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmplY3RzLm5leHQoKSk7Ci0JCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkpIHsKLQkJCQllbmFibGVNZW51ID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlhY3Rpb24uc2V0RW5hYmxlZChlbmFibGVNZW51KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PdXRkZW50QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3V0ZGVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTRmNjJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PdXRkZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogVXBkYXRlIHN1cHByZXNzaW9uIGluZm9ybWF0aW9uIGZyb20gYmFzZSBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjIKLSAqLwotcHVibGljIGNsYXNzIE91dGRlbnRBY3Rpb24gZXh0ZW5kcwotCQlDb21tYW5kQWN0aW9uSGFuZGxlciBpbXBsZW1lbnRzIElXb3JrYmVuY2hQYXJ0QWN0aW9uLCBJTW9kaWZ5aW5nQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGNsYXNzIE91dGRlbnRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMgSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRhcHRlckZhY3RvcnlbXSBBREFQVEVSX0ZBQ1RPUklFUyA9IHsKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCQl9OwotCQkKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPEJyZWFrZG93bkVsZW1lbnQ+IGVsZW1lbnRzOwotCQlwcml2YXRlIFNldCBtb2RpZmllZFJlc291cmNlczsKLQkJcHJpdmF0ZSBCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQ7Ci0JCXByaXZhdGUgQWN0aXZpdHkgb2xkUGFyZW50OwotCQlwcml2YXRlIEFjdGl2aXR5IG5ld1BhcmVudDsKLQkJcHJpdmF0ZSBpbnQgb2xkSW5kZXg7Ci0JCXByaXZhdGUgaW50IG5ld0luZGV4OwotCQlwcml2YXRlIExpc3Q8T2JqZWN0PiBuZXdDaGlsZHJlbjsKLQotCQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JCXB1YmxpYyBPdXRkZW50Q29tbWFuZChDb2xsZWN0aW9uPEJyZWFrZG93bkVsZW1lbnQ+IGNvbGxlY3Rpb24sIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQl0aGlzLmVsZW1lbnRzID0gY29sbGVjdGlvbjsKLQkJCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQkJCXNldExhYmVsKExBQkVMKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpZihuZXdDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJbmV3Q2hpbGRyZW4uY2xlYXIoKTsKLQkJCQluZXdDaGlsZHJlbiA9IG51bGw7Ci0JCQl9Ci0JCQkKLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQkJaWYobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJCVByb2Nlc3MgcHJvYyA9IG51bGw7Ci0JCQkJZm9yIChJdGVyYXRvcjxCcmVha2Rvd25FbGVtZW50PiBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgcHJvYyA9PSBudWxsICYmIGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlCcmVha2Rvd25FbGVtZW50IGUgPSBpdGVyLm5leHQoKTsKLQkJCQkJcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlKTsKLQkJCQl9Ci0JCQkJaWYocHJvYyAhPSBudWxsKSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gcHJvYy5lUmVzb3VyY2UoKTsKLQkJCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocHJvYy5lUmVzb3VyY2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJCQltb2RpZmllZFJlc291cmNlcyA9IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQkJZWxlbWVudCA9IGVsZW1lbnRzLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJb2xkUGFyZW50ID0gZWxlbWVudC5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCWlmKG9sZFBhcmVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJb2xkSW5kZXggPSBvbGRQYXJlbnQuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pbmRleE9mKGVsZW1lbnQpOwotCQkJTWFwPExpc3Q8T2JqZWN0PiwgSW50ZWdlcj4gY2hpbGRyZW5Ub1N0YXJ0SW5kZXhNYXAgPSBuZXcgSGFzaE1hcDxMaXN0PE9iamVjdD4sIEludGVnZXI+KCk7Ci0JCQlBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXM7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlhZGFwdGVyRmFjdG9yaWVzID0gQURBUFRFUl9GQUNUT1JJRVM7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJCQlhZGFwdGVyRmFjdG9yeQkKLQkJCQl9OwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVyRmFjdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yaWVzW2ldOwotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpcCA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9sZFBhcmVudCwgCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCUxpc3Q8T2JqZWN0PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PihpcC5nZXRDaGlsZHJlbihvbGRQYXJlbnQpKTsKLQkJCQlpbnQgaW5kZXggPSBjaGlsZHJlbi5pbmRleE9mKGVsZW1lbnQpOwotCQkJCWludCBzaXplID0gY2hpbGRyZW4uc2l6ZSgpOwotCQkJCWludCBuZXdDaGlsZHJlbkZyb21JbmRleCA9IGluZGV4ICsgMTsKLQkJCQlpZihuZXdDaGlsZHJlbkZyb21JbmRleCA8IHNpemUpIHsKLQkJCQkJZm9yKGludCBqID0gbmV3Q2hpbGRyZW5Gcm9tSW5kZXg7IGogPCBzaXplOyBqKyspIHsKLQkJCQkJCU9iamVjdCBjaGlsZCA9IGNoaWxkcmVuLmdldChqKTsKLQkJCQkJCWlmKFByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKGNoaWxkKSkgewotCQkJCQkJCS8vIGNhbm5vdCBvdXRkZW50IGFjdGl2aXR5IHRoYXQgaGF2ZSBpbmhlcml0ZWQgc2libGluZyBiZWxvdyBpdAotCQkJCQkJCS8vCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNoaWxkcmVuVG9TdGFydEluZGV4TWFwLnB1dChjaGlsZHJlbiwgSW50ZWdlci52YWx1ZU9mKG5ld0NoaWxkcmVuRnJvbUluZGV4KSk7Ci0JCQkJfQotCQkJfQotCQkJaWYoIShlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpICYmICFjaGlsZHJlblRvU3RhcnRJbmRleE1hcC5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQluZXdQYXJlbnQgPSBvbGRQYXJlbnQuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQlpZihuZXdQYXJlbnQgIT0gbnVsbCkgewotCQkJCW5ld0luZGV4ID0gbmV3UGFyZW50LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaW5kZXhPZihvbGRQYXJlbnQpICsgMTsKLQkJCQlpZighY2hpbGRyZW5Ub1N0YXJ0SW5kZXhNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJCW5ld0NoaWxkcmVuID0gbmV3IFVuaXF1ZUVMaXN0KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PExpc3Q8T2JqZWN0PiwgSW50ZWdlcj4+IGl0ZXIgPSBjaGlsZHJlblRvU3RhcnRJbmRleE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJTWFwLkVudHJ5PExpc3Q8T2JqZWN0PiwgSW50ZWdlcj4gZW50cnkgPSBpdGVyLm5leHQoKTsKLQkJCQkJCUxpc3QgY2hpbGRyZW4gPSBlbnRyeS5nZXRLZXkoKTsKLQkJCQkJCW5ld0NoaWxkcmVuLmFkZEFsbChjaGlsZHJlbi5zdWJMaXN0KGVudHJ5LmdldFZhbHVlKCkuaW50VmFsdWUoKSwgY2hpbGRyZW4uc2l6ZSgpKSk7Ci0JCQkJCX0KLQkJCQkJaWYoIURlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQoKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudCwgbmV3Q2hpbGRyZW4sIHRydWUpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7CQkJCQkJCi0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQobmV3UGFyZW50LCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oZWxlbWVudCksIHRydWUpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCW5ld1BhcmVudC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChuZXdJbmRleCwgZWxlbWVudCk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwYXJlbnRQa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIG5ld1BhcmVudC5lQ29udGFpbmVyKCk7Ci0JCQkJcGFyZW50UGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKE1ldGhvZFBhY2thZ2UpZWxlbWVudC5lQ29udGFpbmVyKCkpOwotCi0JCQkJaWYobmV3Q2hpbGRyZW4gIT0gbnVsbCkgewotLy8JCQkJCSgoQWN0aXZpdHkpZWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwobmV3Q2hpbGRyZW4pOwkJCQotCQkJCQkvLyBtb3ZlIHRoZSBwcm9jZXNzIHBhY2FrZ2Ugb2YgdGhlIGFjdGl2aXR5IHRvIG5ldyBwYXJlbnQgcGFja2FnZQotCQkJCQkvLwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXdDaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkKLQkJCQkJCQkoKEFjdGl2aXR5KWVsZW1lbnQpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKChCcmVha2Rvd25FbGVtZW50KSBjaGlsZCk7Ci0JCQkJCQlpZihjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJcGFyZW50UGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKE1ldGhvZFBhY2thZ2UpKChBY3Rpdml0eSljaGlsZCkuZUNvbnRhaW5lcigpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCQlleGVjdXRlKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkJb2xkUGFyZW50LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKG9sZEluZGV4LCBlbGVtZW50KTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCVByb2Nlc3NQYWNrYWdlIHBhcmVudFBrZyA9IChQcm9jZXNzUGFja2FnZSkgb2xkUGFyZW50LmVDb250YWluZXIoKTsKLQkJCQlwYXJlbnRQa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZCgoTWV0aG9kUGFja2FnZSllbGVtZW50LmVDb250YWluZXIoKSk7Ci0JCQkJaWYobmV3Q2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCQkoKEFjdGl2aXR5KSBlbGVtZW50KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbChuZXdDaGlsZHJlbik7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ld0NoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZihjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJcGFyZW50UGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKE1ldGhvZFBhY2thZ2UpKChBY3Rpdml0eSljaGlsZCkuZUNvbnRhaW5lcigpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJCXJldHVybiBlbGVtZW50czsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX091dGRlbnQ7Ci0KLQlwcml2YXRlIFByb2Nlc3NFZGl0b3IgZWRpdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIE91dGRlbnRBY3Rpb24oU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIobnVsbCwgdGV4dCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBPdXRkZW50QWN0aW9uKCkgewotCQl0aGlzKExBQkVMKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX09VVERFTlQpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19PVVRERU5UKTsKLQkJc2V0VG9vbFRpcFRleHQoTEFCRUwpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciN1cGRhdGVTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIHN1cHBvcnQgaW5kZW50IG9ubHkgb25lIGFjdGl2aXR5IGZvciBub3cKLQkJLy8KLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJaWYoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQlPYmplY3QgZSA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXJldCA9IHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0JCXNldEVuYWJsZWQocmV0KTsKLQkJcmV0dXJuIHJldDsKLQkJCi0JCS8vVE9ETzogc3VwcG9ydCBpbmRlbnQgbXVsdGlwbGUgYWN0aXZpdGllcyBpbiBzZWxlY3Rpb24KLS8vCQlBcnJheUxpc3Q8QWN0aXZpdHk+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5PigpOwotLy8JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLS8vCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0vLwkJCQlsaXN0LmFkZCgoQWN0aXZpdHkpIGVsZW1lbnQpOwotLy8JCQl9Ci0vLwkJfQotLy8JCWlmKGxpc3QuaXNFbXB0eSgpKSB7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0vLwkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihsaXN0KSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZihkb21haW4gaW5zdGFuY2VvZiBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCXJldHVybiBuZXcgT3V0ZGVudENvbW1hbmQoc2VsZWN0aW9uLCAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQl9Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0JCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JV29ya2JlbmNoUGFydEFjdGlvbiNzZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVdvcmtiZW5jaFBhcnQoSVdvcmtiZW5jaFBhcnQgd29ya2JlbmNoUGFydCkgewotCQlpZih3b3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgSUVkaXRpbmdEb21haW5Qcm92aWRlcikgewotCQkJZG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKXdvcmtiZW5jaFBhcnQpLmdldEVkaXRpbmdEb21haW4oKTsKLQkJfQotCQlpZih3b3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgUHJvY2Vzc0VkaXRvcikgewotCQkJZWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpIHdvcmtiZW5jaFBhcnQ7Ci0JCX0JCQotCQllbHNlIGlmKHdvcmtiZW5jaFBhcnQgPT0gbnVsbCkgewotCQkJZWRpdG9yID0gbnVsbDsKLQkJfQotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIHN1cGVyUnVuKCkgewotCQlzdXBlci5ydW4oKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGVkaXRvci5nZXRFZGl0b3JTaXRlKCkKLQkJCQkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlzdXBlclJ1bigpOwotCQkJCQl9Ci0JCQkKLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1Byb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMDg1NTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1Byb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuU3luY2hyb25pemVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLlByb2Nlc3NEZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0KLS8qKgotICogRGVmYXVsdCBTeW5jaHJvbml6ZSBhY3Rpb24gZm9yIHByb2Nlc3MgZWxlbWVudHMuCi0gKiBTeW5jaHJvbml6YXRpb24gdGFrZXMgcGxhY2UgZnJvbSBtZXRob2QgdG8gcHJvY2VzcyBlbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb24gZXh0ZW5kcyBDb21tYW5kQWN0aW9uSGFuZGxlciAKLWltcGxlbWVudHMgSVdvcmtiZW5jaFBhcnRBY3Rpb24sIElNb2RpZnlpbmdBY3Rpb24KLXsKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhcnQgYWN0aXZlV29ya2JlbmNoUGFydDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SdW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICovCi0JcHVibGljIFByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb24oKSB7Ci0JCXN1cGVyKG51bGwsIExpYnJhcnlFZGl0UmVzb3VyY2VzLkF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWwpOyAKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIHdpdGggbGFiZWwgdGV4dAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uKFN0cmluZyBsYWJlbFRleHQpIHsKLQkJc3VwZXIobnVsbCwgbGFiZWxUZXh0KTsgCi0JfQotCQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLklXb3JrYmVuY2hQYXJ0QWN0aW9uI3NldEFjdGl2ZVdvcmtiZW5jaFBhcnQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlV29ya2JlbmNoUGFydChJV29ya2JlbmNoUGFydCB3b3JrYmVuY2hQYXJ0KSB7Ci0JCWFjdGl2ZVdvcmtiZW5jaFBhcnQgPSB3b3JrYmVuY2hQYXJ0OwotCQlpZiAod29ya2JlbmNoUGFydCBpbnN0YW5jZW9mIElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIHsKLQkJCWRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgd29ya2JlbmNoUGFydCkKLQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IFN5bmNocm9uaXplQ29tbWFuZChnZXRUZXh0KCksIHNlbGVjdGlvbikgewotCQkJLyoKLQkJCSAqIAotCQkJICogCi0JCQkgKiBAc2VlIEF1dG9TeW5jaHJvbml6ZUNvbW1hbmQjZGVsZXRlKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCQkJICovCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBkZWxldGUoTGlzdCBlbGVtZW50cykgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBQcm9jZXNzRGVsZXRlQWN0aW9uLmRlbGV0ZShlbGVtZW50cyk7Ci0JCQkJfQotCQkJCWNhdGNoKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJYWJvcnRlZCA9IHRydWU7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9jZXNzIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlpZihhY3RpdmVXb3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9ICgoSUVkaXRvclBhcnQpYWN0aXZlV29ya2JlbmNoUGFydCkuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmKGlucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpaW5wdXQpLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQlpZihlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlyZXR1cm4gKChQcm9jZXNzQ29tcG9uZW50KWUpLmdldFByb2Nlc3MoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3VwZGF0ZVNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQXJyYXlMaXN0IHNlbGVjdGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIAotCQkJCQkmJiAhKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudCkuaXNSZWFkT25seSgpKSB7Ci0JCQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJfQotCQkJCi0JCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCQlEZXNjcmlwdG9yIGRlc2MgPSAoRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQkJCi0JCQkJCS8vIGRlc2NyaXB0b3IgbXVzdCBiZSBsaW5rZWQgYW5kIGlzIG5vdCBzdXBwcmVzc2VkCi0JCQkJCS8vCi0JCQkJCXZhbGlkID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoZGVzYykgIT0gbnVsbCAmJiAhZGVzYy5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCk7CQkJCQkKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGV4Y2x1ZGUgYnJlYWtkb3duIGVsZW1lbnQgd2l0aG91dCBhIHN1cGVyIGFjdGl2aXR5IGxpa2UgVGVhbVByb2ZpbGUncyBvd24gUm9sZURlc2NyaXB0b3IKLQkJCQkJLy8KLQkJCQkJaWYgKCgoQnJlYWtkb3duRWxlbWVudCllbGVtZW50KS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSAKLQkJCQkJewotCQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MgJiYgKChQcm9jZXNzKWVsZW1lbnQpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCQl2YWxpZCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl2YWxpZCA9IGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBlbGVtZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZih2YWxpZCkgewotCQkJCXNlbGVjdGVkLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlpZiAoc2VsZWN0ZWQuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3RlZCkpOwotCX0KLQotCi0gICAvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQljYW5SdW4gPSAoKFN5bmNocm9uaXplQ29tbWFuZCkgY29tbWFuZCkuaW5pdGlsaXplKCk7Ci0JCQl9Ci0JCX07Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIExpYnJhcnlFZGl0UmVzb3VyY2VzLlByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fcHJlcGFyZSk7IAotCi0JCWlmIChjYW5SdW4pIHsKLQkJCXN1cGVyLnJ1bigpOwotCQkJLy8gaWYoKChBdXRvU3luY2hyb25pemVDb21tYW5kKWNvbW1hbmQpLmlzU3VjZXNzZnVsKCkpIHsKLQkJCS8vIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5SW5mbyhnZXRUZXh0KCksCi0JCQkvLyAiU3luY2hyb25pemF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIik7Ci0JCQkvLwkJCQkKLQkJCS8vIH0KLQkJfSBlbHNlIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQlnZXRUZXh0KCksCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9ub0Rlc2NyaXB0b3JUb1N5bmNoKTsgCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9SZWZyZXNoQ29uZmlndXJhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1JlZnJlc2hDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYWVmMWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1JlZnJlc2hDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLQotLyoqCi0gKiBSZWZyZXNoIENvbmZpZ3VyYXRpb24gYWN0aW9uCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUmVmcmVzaENvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvblZpZXcgdGFyZ2V0VmlldzsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0JCXRhcmdldFZpZXcgPSAoQ29uZmlndXJhdGlvblZpZXcpIHZpZXc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQl0YXJnZXRWaWV3LmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvUmVuYW1lQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvUmVuYW1lQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiY2Q1M2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1JlbmFtZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLk1lc3NhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JSW5wdXRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JbnB1dERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogUmVuYW1lcyBtZXRob2QgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW5hbWVBY3Rpb24gZXh0ZW5kcwotCQlDb21tYW5kQWN0aW9uSGFuZGxlciBpbXBsZW1lbnRzIElXb3JrYmVuY2hQYXJ0QWN0aW9uLCBJTW9kaWZ5aW5nQWN0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZUFjdGlvbl90ZXh0OwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwdWJsaWMgUmVuYW1lQWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKG51bGwsIHRleHQpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICoKLQkgKi8KLQlwdWJsaWMgUmVuYW1lQWN0aW9uKCkgewotCQl0aGlzKExBQkVMKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VsZWN0ZWQgbWV0aG9kIGVsZW1lbnRzIGNhbiBiZQotCSAqIHJlbmFtZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNhblJlbmFtZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKCEoZG9tYWluIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB8fCBzZWxlY3Rpb24uc2l6ZSgpID4gMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudAotCQkJCSYmICFUbmdVdGlsLmlzUHJlZGVmaW5lZCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciN1cGRhdGVTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0JCWlmKGNhblJlbmFtZShzZWxlY3Rpb24pKSB7Ci0JCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJCXJldCA9IHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQl9Ci0JCXNldEVuYWJsZWQocmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlpZihzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlPYmplY3QgbyA9IFRuZ1V0aWwudW53cmFwKHNlbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWlmKG8gaW5zdGFuY2VvZiBOYW1lZEVsZW1lbnQpIHsKLQkJCXJldHVybiBuZXcgUmVuYW1lQ29tbWFuZCgoTmFtZWRFbGVtZW50KSBvLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuSVdvcmtiZW5jaFBhcnRBY3Rpb24jc2V0QWN0aXZlV29ya2JlbmNoUGFydChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KElXb3JrYmVuY2hQYXJ0IHdvcmtiZW5jaFBhcnQpIHsKLQkJaWYod29ya2JlbmNoUGFydCBpbnN0YW5jZW9mIElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIHsKLQkJCWRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcil3b3JrYmVuY2hQYXJ0KS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCX0KLQkJYWN0aXZlUGFydCA9IHdvcmtiZW5jaFBhcnQ7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgc3VwZXJSdW4oKSB7Ci0JCWZpbmFsIE5hbWVkRWxlbWVudCBlID0gKE5hbWVkRWxlbWVudCkgVG5nVXRpbC51bndyYXAoc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLS8vCQlSZXNvdXJjZSByZXNvdXJjZSA9IGUuZVJlc291cmNlKCk7Ci0vLwkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotLy8JCQlvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUoZS5lUmVzb3VyY2UoKSk7Ci0vLwkJCWlmKGZpbGUgIT0gbnVsbCkgewotLy8JCQkJUmVwb3NpdG9yeVByb3ZpZGVyIHByb3ZpZGVyID0gUmVwb3NpdG9yeVByb3ZpZGVyLmdldFByb3ZpZGVyKGZpbGUuZ2V0UHJvamVjdCgpKTsKLS8vCQkJCWlmKHByb3ZpZGVyICE9IG51bGwpIHsKLS8vCQkJCQlJRmlsZUhpc3RvcnlQcm92aWRlciBoaXN0b3J5UHJvdmlkZXIgPSBwcm92aWRlci5nZXRGaWxlSGlzdG9yeVByb3ZpZGVyKCk7Ci0vLwkJCQkJRmlsZU1vZGlmaWNhdGlvblZhbGlkYXRvciBtb2RWYWxpZGF0b3IgPSBwcm92aWRlci5nZXRGaWxlTW9kaWZpY2F0aW9uVmFsaWRhdG9yMigpOwotLy8JCQkJCVN0cmluZyBpZCA9IHByb3ZpZGVyLmdldElEKCk7Ci0vLwkJCQkJU3Vic2NyaWJlciBzdWJzY3JpYmVyID0gcHJvdmlkZXIuZ2V0U3Vic2NyaWJlcigpOwotLy8JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihpZCk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0KLQkJU2hlbGwgc2hlbGwgPSBhY3RpdmVQYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpOwotCQkKLQkJLy8gY2hlY2sgaWYgY29udGFpbmVyJ3MgcmVzb3VyY2UgY2FuIGJlIG1vZGlmaWVkCi0JCS8vCi0JCWlmIChlLmVDb250YWluZXIoKSAhPSBudWxsCi0JCQkJJiYgZS5lQ29udGFpbmVyKCkuZVJlc291cmNlKCkgIT0gZS5lUmVzb3VyY2UoKSkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoZS5lQ29udGFpbmVyKCksIHNoZWxsKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJLmdldERlZmF1bHQoKQotCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVEaWFsb2dfdGl0bGUsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVEaWFsb2dfcmVuYW1lRXJyb3IsCi0JCQkJCQlzdGF0dXMpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCWZpbmFsIElWYWxpZGF0b3IgdmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UKLQkJLmNyZWF0ZU5hbWVWYWxpZGF0b3IoZSwgKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pZG9tYWluKS5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJSUlucHV0VmFsaWRhdG9yIGlucHV0VmFsaWRhdG9yID0gbmV3IElJbnB1dFZhbGlkYXRvcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQkJCWlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCS5nZXRTaW1wbGVFcnJvck1lc3NhZ2UodmFsaWRhdG9yCi0JCQkJCQkJLmlzVmFsaWQobmV3VGV4dCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQotCQlib29sZWFuIGdldElucHV0ID0gdHJ1ZTsKLQkJSW5wdXREaWFsb2cgaW5wdXREbGcgPSBuZXcgSW5wdXREaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lX3RleHQsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3bmFtZV90ZXh0LCBlLmdldE5hbWUoKSwKLQkJCQlpbnB1dFZhbGlkYXRvcik7Ci0JCXdoaWxlIChnZXRJbnB1dCkgewotCQkJZ2V0SW5wdXQgPSBmYWxzZTsKLQkJCWlmIChpbnB1dERsZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJU3RyaW5nIG5ld05hbWUgPSBpbnB1dERsZy5nZXRWYWx1ZSgpLnRyaW0oKTsKLQkJCQlpZihlIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQkJbmV3TmFtZSA9IFN0clV0aWwubWFrZVZhbGlkRmlsZU5hbWUobmV3TmFtZSk7Ci0JCQkJfQotCQkJCWlmICghbmV3TmFtZS5lcXVhbHMoZS5nZXROYW1lKCkpKSB7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQkJU3RyaW5nW10gY29uZmlnTmFtZXMgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uTmFtZXMoTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWlmIChuZXdOYW1lLmVxdWFscyhjb25maWdOYW1lc1tpXSkpIHsKLQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLAotCQkJCQkJCQkJCQkJbmV3TmFtZSkpOwotCQkJCQkJCQlnZXRJbnB1dCA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoZ2V0SW5wdXQgPT0gdHJ1ZSkgewotCQkJCQkJaW5wdXREbGcgPSBuZXcgSW5wdXREaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJCQkJLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZV90ZXh0LAotCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXduYW1lX3RleHQsIGUKLQkJCQkJCQkJLmdldE5hbWUoKSwgaW5wdXRWYWxpZGF0b3IpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMubWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWUsIChuZXcgT2JqZWN0W10geyBlLmdldE5hbWUoKSwgbmV3TmFtZSB9KSk7IAotCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWVfdGl0bGU7IAotCQkJCQkJaWYgKCFNZXNzYWdlRGlhbG9nLm9wZW5Db25maXJtKHNoZWxsLCB0aXRsZSwgbXNnKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQotCQkJCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLmNsb3NlTWV0aG9kRWRpdG9yc0ZvclBsdWdpbkVsZW1lbnRzKChNZXRob2RQbHVnaW4pZSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCVJlbmFtZUNvbW1hbmQgcmVuYW1lQ21kID0gKFJlbmFtZUNvbW1hbmQpIGNvbW1hbmQ7Ci0JCQkJCXJlbmFtZUNtZC5zZXROZXdOYW1lKG5ld05hbWUpOwotCQkJCQlyZW5hbWVDbWQuc2V0U2hlbGwoc2hlbGwpOwotCQkJCQlzdXBlci5ydW4oKTsJCQkJCQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoYWN0aXZlUGFydC5nZXRTaXRlKCkKLQkJCQkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBydW5uZXIgPSBuZXcgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKTsKLQkJCQkJCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCQkJc3VwZXJSdW4oKTsKLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQl9KTsKLQkJCQkJfQotCQkJCi0JCX0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkb1JlbmFtZShmaW5hbCBOYW1lZEVsZW1lbnQgZSwgZmluYWwgU3RyaW5nIG5ld05hbWUpIHsKLQkJbmV3IFJlbmFtZUNvbW1hbmQoZSwgbmV3TmFtZSkuZXhlY3V0ZSgpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSZW5hbWVDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsJCQotCQlwcml2YXRlIE5hbWVkRWxlbWVudCBlOwotCQlwcml2YXRlIFN0cmluZyBuZXdOYW1lOwotCQlwcml2YXRlIFN0cmluZyBvbGROYW1lOwotCQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCQlDb2xsZWN0aW9uPFJlc291cmNlPiByZW5hbWVkUmVzb3VyY2VzOwotCQkKLQkJcHVibGljIFJlbmFtZUNvbW1hbmQoTmFtZWRFbGVtZW50IGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCQl0aGlzLmUgPSBlOwotCQkJdGhpcy5uZXdOYW1lID0gbmV3TmFtZTsKLQkJfQkJCi0JCQotCQlwdWJsaWMgdm9pZCBzZXROZXdOYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCQl0aGlzLm5ld05hbWUgPSBuZXdOYW1lOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRTaGVsbChTaGVsbCBzaGVsbCkgewotCQkJdGhpcy5zaGVsbCA9IHNoZWxsOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgcm9sbGJhY2soKSB7Ci0JCQkvLyByZXN0b3JlIG9sZCBuYW1lCi0JCQkvLwotCQkJc2V0TmFtZShvbGROYW1lKTsKLQkJCQotCQkJLy8gcmVzdG9yZSBvbGQgbG9jYXRpb24KLQkJCS8vCi0JCQlpZighcmVuYW1lZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQlhZGp1c3RMb2NhdGlvbihyZW5hbWVkUmVzb3VyY2VzLCBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpKTsKLQkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGhhbmRsZVBlcnNpc3RlbmNlRXhjZXB0aW9uKEV4Y2VwdGlvbiBlMSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUxKTsKLQotCQkJU3RyaW5nIGRldGFpbHMgPSBlMS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IE1lc3NhZ2VGb3JtYXQKLQkJCQkJLmZvcm1hdCgiOiB7MH0iLCBuZXcgT2JqZWN0W10geyBlMS5nZXRNZXNzYWdlKCkgfSkgOiAiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld19lcnJfc2F2aW5nLAotCQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJCWUuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCksCi0JCQkJCQkJZGV0YWlscyB9KTsKLQkJCXRocm93IG5ldyBNZXNzYWdlRXhjZXB0aW9uKG1zZyk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGdldFBlcnNpc3RlcigpIHsKLQkJCXJldHVybiBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0UGVyc2lzdGVyRm9yKGUuZVJlc291cmNlKCkpCi0JCQkJCQkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEFkanVzdHMgbG9jYXRpb24gb2YgYWxsIGFmZmVjdGVkIHJlc291cmNlcy4KLQkJICogCi0JCSAqIEByZXR1cm4gcmVzb3VyY2VzIHdob3NlIGxvY2F0aW9uIGhhcyBiZWVuIGFkanVzdGVkCi0JCSAqLwotCQlwcml2YXRlIElTdGF0dXMgYWRqdXN0TG9jYXRpb24oQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVuYW1lZFJlc291cmNlcykgewotCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzVG9SZW5hbWUgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudAotCQkJCQkmJiBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Ci0JCQkJCQkJLmhhc1ByZXNlbnRhdGlvbigoTWV0aG9kRWxlbWVudCkgZSkpIHsKLQkJCQlyZXNvdXJjZXNUb1JlbmFtZS5hZGQoKChDb250ZW50RWxlbWVudCkgZSkuZ2V0UHJlc2VudGF0aW9uKCkKLQkJCQkJCS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCQlyZXNvdXJjZXNUb1JlbmFtZS5hZGQoZS5lUmVzb3VyY2UoKSk7Ci0JCQlyZXR1cm4gYWRqdXN0TG9jYXRpb24ocmVzb3VyY2VzVG9SZW5hbWUsIHJlbmFtZWRSZXNvdXJjZXMpOwotCQl9Ci0JCQotCQkvKioKLQkJICogQWRqdXN0cyBsb2NhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHJlc291cmNlcy4KLQkJICogCi0JCSAqIEByZXR1cm4gcmVzb3VyY2VzIHdob3NlIGxvY2F0aW9uIGhhcyBiZWVuIGFkanVzdGVkCi0JCSAqLwotCQlwcml2YXRlIElTdGF0dXMgYWRqdXN0TG9jYXRpb24oQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzVG9SZW5hbWUsIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbmFtZWRSZXNvdXJjZXMpIHsKLQkJCUZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBnZXRQZXJzaXN0ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IHJlc291cmNlc1RvUmVuYW1lKSB7Ci0JCQkJCVVSSSBvbGRVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCQkJcGVyc2lzdGVyLmFkanVzdExvY2F0aW9uKHJlc291cmNlKTsKLQkJCQkJaWYoIXJlc291cmNlLmdldFVSSSgpLmVxdWFscyhvbGRVUkkpKSB7Ci0JCQkJCQlyZW5hbWVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksCi0JCQkJCQllLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0JCQotCQkKLQkJcHJpdmF0ZSB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJCWUuc2V0TmFtZShuZXdOYW1lKTsKLQkJCQotCQkJLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgUHJvY2Vzc0NvbXBvbmVudCB0byBrZWVwIGl0cwotCQkJLy8gbmFtZSBhbmQgdGhlIG5hbWUgb2YgaXRzIHByb2Nlc3MgaW4gc3luYy4KLQkJCWlmIChlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgZSkuZ2V0UHJvY2VzcygpOwotCQkJCXByb2Muc2V0TmFtZShuZXdOYW1lKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQlvbGROYW1lID0gZS5nZXROYW1lKCk7CQkJCi0JCQlzZXROYW1lKG5ld05hbWUpOwotCQkJCi0JCQlyZW5hbWVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQotCQkJLy8gcmVuYW1lIGZpbGUocykKLQkJCS8vCi0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IGFkanVzdExvY2F0aW9uKHJlbmFtZWRSZXNvdXJjZXMpOwotCQkJCQlpZighc3RhdHVzLmlzT0soKSkgewotCQkJCQkJcm9sbGJhY2soKTsKLQkJCQkJCUV4Y2VwdGlvbiBleCA9IChFeGNlcHRpb24pIHN0YXR1cy5nZXRFeGNlcHRpb24oKTsKLQkJCQkJCXRocm93IGV4IGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbiA/IChSdW50aW1lRXhjZXB0aW9uKSBleCA6IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4KTsKLQkJCQkJfQotCQkJCQkKLQkJCQl9Ci0JCQotCQkJfTsKLQkJCi0JCQlib29sZWFuIHJlc3VsdCA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld19yZW5hbWluZ190ZXh0KTsKLQkJCWlmKCFyZXN1bHQpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCUlTdGF0dXMgc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KGUsIAotCQkJCQlzaGVsbCA9PSBudWxsID8gTXNnQm94LmdldERlZmF1bHRTaGVsbCgpIDogc2hlbGwpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ190aXRsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ19yZW5hbWVFcnJvciwKLQkJCQkJCXN0YXR1cyk7Ci0JCQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJcm9sbGJhY2soKTsKLQkJCQkJfQotCQkJCQkKLQkJCQl9LCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCS8vIFNhdmUgdGhlIG1vZGlmaWVkIGZpbGUocykuCi0JCQkvLwotCQkJcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkvLyBTYXZlIHRoZSBtb2RpZmllZCBmaWxlKHMpLgotCQkJCQkvLwotCQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gZ2V0UGVyc2lzdGVyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXBlcnNpc3Rlci5zYXZlKGUuZVJlc291cmNlKCkpOwotCQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsJCQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7CQkKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJCX0KLQkJCQkJCQloYW5kbGVQZXJzaXN0ZW5jZUV4Y2VwdGlvbihlMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2goUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlyb2xsYmFjaygpOwkJCQkJCQotCQkJCQkJdGhyb3cgZTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gY2hhbmdlIGRpYWdyYW0gcmVzb3VyY2UgYXMgd2VsbAotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgZSkuZ2V0UHJvY2VzcygpOwkKLQkJCQkJCURpYWdyYW1NYW5hZ2VyIG1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKHByb2MsIHRoaXMpOwotCQkJCQkJaWYobWdyICE9IG51bGwpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQltZ3IudXBkYXRlUmVzb3VyY2VVUkkoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJCX0KLQkJCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQkJdHJ5IHsgCi0JCQkJCQkJCQltZ3IucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9Ci0JCQkJfQotCQkKLQkJCX07Ci0JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5FbGVtZW50c1ZpZXdfcmVuYW1pbmdfdGV4dCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQkJZXhlY3V0ZSgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWUgPSBudWxsOwotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1NhdmVUaGlzQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvU2F2ZVRoaXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2ZjA5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvU2F2ZVRoaXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLQotLyoqCi0gKiBBY3Rpb24gZm9yIHNhdmluZyByZXNvdXJjZXMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNhdmVUaGlzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQotCXByaXZhdGUgQXJyYXlMaXN0IHNlbGVjdGVkT2JqZWN0czsKLQotCXB1YmxpYyBTYXZlVGhpc0FjdGlvbigpIHsKLQkJc3VwZXIoQXV0aG9yaW5nVUlSZXNvdXJjZXMuU2F2ZVRoaXNBY3Rpb25fc2F2ZW9iamVjdCk7IAotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogCQkJU2VsZWN0aW9uCi0JICogQHJldHVybiAKLQkgKiAJCQlib29sZWFuIHZhbHVlIHRvIGluZGljYXRlIHdoZXRoZXIgdXBkYXRlIHdhcyBkb25lCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZWxlY3RlZE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTspIHsKLQkJCXNlbGVjdGVkT2JqZWN0cy5hZGQoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluLnVud3JhcChvYmplY3RzCi0JCQkJCS5uZXh0KCkpKTsKLQkJfQotCi0JCXJldHVybiBzZWxlY3RlZE9iamVjdHMuc2l6ZSgpID09IDEKLQkJCQkmJiBzZWxlY3RlZE9iamVjdHMuZ2V0KDApIGluc3RhbmNlb2YgRU9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoc2VsZWN0ZWRPYmplY3RzID09IG51bGwgfHwgc2VsZWN0ZWRPYmplY3RzLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJRmlsZURpYWxvZyBmZCA9IG5ldyBGaWxlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJU1dULlNBVkUpOwotCQlTdHJpbmcgcGF0aCA9IGZkLm9wZW4oKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJVVJJIGZpbGVVUkkgPSBVUkkuY3JlYXRlRmlsZVVSSShwYXRoKTsKLQkJLy8gQ3JlYXRlIHRoZSByZXNvdXJjZSB0byBwZXJzaXN0IHRoZSBtb2RlbC4KLQkJUmVzb3VyY2UgcmVzID0gbmV3IFhNSVJlc291cmNlRmFjdG9yeUltcGwoKS5jcmVhdGVSZXNvdXJjZShmaWxlVVJJKTsKLQkJT2JqZWN0IG9iaiA9IHNlbGVjdGVkT2JqZWN0cy5nZXQoMCk7Ci0JCXJlcy5nZXRDb250ZW50cygpLmFkZCgoRU9iamVjdCkgb2JqKTsKLQkJdHJ5IHsKLQkJCXJlcy5zYXZlKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TaG93UHJlc2VudGF0aW9uTmFtZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TaG93UHJlc2VudGF0aW9uTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRjZjUxNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvU2hvd1ByZXNlbnRhdGlvbk5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci0KLS8qKgotICogU2hvdyBQcmVzZW50YXRpb24gbmFtZXMgaW4gbGlicmFyeSB2aWV3Ci0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFNob3dQcmVzZW50YXRpb25OYW1lcyBpbXBsZW1lbnRzIElWaWV3QWN0aW9uRGVsZWdhdGUgewotCi0JcHJpdmF0ZSBMaWJyYXJ5VmlldyB0YXJnZXRWaWV3OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJdGFyZ2V0VmlldyA9IChMaWJyYXJ5VmlldykgdmlldzsKLQotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLnNldFNob3dQcmVzZW50YXRpb25OYW1lcyghUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5pc1Nob3dQcmVzZW50YXRpb25OYW1lcygpKTsKLQkJdGFyZ2V0Vmlldy5nZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvU3luY2hyb25pemF0aW9uQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvU3luY2hyb25pemF0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZTFmMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1N5bmNocm9uaXphdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuU3luY2hyb25pemF0aW9uQ2hvaWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuU3luY2hyb25pemF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuU3luY2hyb25pemVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBTeW5jaHJvbml6YWl0b24gYWN0aW9uIGZvciBwcm9jZXNzIGVsZW1lbnRzLiBTeW5jaHJvbml6YXRpb24gdGFrZXMgcGxhY2UgZnJvbSBtZXRob2QKLSAqIGVsZW1lbnQgdG8gcHJvY2VzcyBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIFBob25nIExlCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemF0aW9uQWN0aW9uIGV4dGVuZHMgUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbiAKLWltcGxlbWVudHMgSVdvcmtiZW5jaFBhcnRBY3Rpb24KLXsKLQotCXByaXZhdGUgUHJvY2VzcyBzZWxlY3RlZFByb2Nlc3M7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqCi0JICovCi0JcHVibGljIFN5bmNocm9uaXphdGlvbkFjdGlvbigpIHsKLQkJc3VwZXIoTGlicmFyeUVkaXRSZXNvdXJjZXMuTWFudWFsU3luY2hyb25pemVDb21tYW5kX2xhYmVsKTsgCi0JfQotCQotCS8qCi0JICogU2V0IFByb2Nlc3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzKFByb2Nlc3MgYVByb2Nlc3MpIHsKLQkJdGhpcy5zZWxlY3RlZFByb2Nlc3MgPSBhUHJvY2VzczsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN1cGVyUnVuKCkgewotCQlzdXBlci5ydW4oKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemF0aW9uQ2hvaWNlcyBjaG9pY2VzID0gbmV3IFN5bmNocm9uaXphdGlvbkNob2ljZXMoKTsKLQkJCQljaG9pY2VzLnNldFNlbGVjdGVkUHJvY2VzcyhzZWxlY3RlZFByb2Nlc3MpOwotCQkJCQotCQkJCS8vIEluc3RhbnRpYXRlIGFuZCBpbml0aWFsaXplIHRoZSB3aXphcmQuCi0JCQkJU3luY2hyb25pemF0aW9uV2l6YXJkIHdpemFyZCA9IG5ldyBTeW5jaHJvbml6YXRpb25XaXphcmQoY2hvaWNlcyk7Ci0KLQkJCQkvLyBJbnN0YW50aWF0ZSB0aGUgd2l6YXJkIGNvbnRhaW5lciB3aXRoIHRoZSB3aXphcmQgYW5kIG9wZW4gaXQuCi0JCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgCi0JCQkJCQkJCQkJCXdpemFyZCk7Ci0JCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJCWRpYWxvZy5vcGVuKCk7CQotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgREVCVUc6ICIgKyBjaG9pY2VzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQotCQkJCWlmICghY2hvaWNlcy5pc0ZpbmlzaFByZXNzZWQoKSkKLQkJCQkJcmV0dXJuOwotCQkJCQotCQkJCS8vIFNldCBzeW5jaEZlYXR1cmVzICdzeW5jRmVhdHVyZVNldCcKLQkJCQlIYXNoU2V0IHN5bmNGZWF0dXJlU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlhZGRDaG9pY2VzVG9TZXQoc3luY0ZlYXR1cmVTZXQsIGNob2ljZXMpOwotCQkJCS8vIE1ldGhvZCBjb25maWcgY2FuIGJlIG9idGFpbmVkIGJ5ICdjaG9pY2VzLmdldFNlbGVjdGVkQ29uZmlnKCknCi0JCQkJCi0JCQkJU3luY2hyb25pemVDb21tYW5kIGNtZCA9IChTeW5jaHJvbml6ZUNvbW1hbmQpY29tbWFuZDsKLQkJCQljbWQuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjaG9pY2VzLmdldFNlbGVjdGVkQ29uZmlnKCkpOwotCQkJCWNtZC5zZXRTeW5jaHJvbml6YXRpb25GZWF0dXJlcyhzeW5jRmVhdHVyZVNldCk7Ci0JCQkJCi0JCQkJc3VwZXJSdW4oKTsKLQkJCX0KLQkJfSk7Ci0JCQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRDaG9pY2VzVG9TZXQoSGFzaFNldCBzeW5jU2V0LCBTeW5jaHJvbml6YXRpb25DaG9pY2VzIGNob2ljZXMpIHsKLQkJaWYgKGNob2ljZXMuZ2V0U3luY05hbWUoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKXsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQl9Ci0JCWlmIChjaG9pY2VzLmdldFN5bmNQcmVzTmFtZSgpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpOwotCQl9Ci0JCWlmIChjaG9pY2VzLmdldFN5bmNCcmllZkRlc2MoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKXsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jT3B0SW5wdXQoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKXsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jTWFuSW5wdXQoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKXsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSk7Ci0JCX0KLQkJaWYgKGNob2ljZXMuZ2V0U3luY091dHB1dCgpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKSk7Ci0JCX0KLQkJaWYgKGNob2ljZXMuZ2V0U3luY1ByaW1QZXJmb3JtZXIoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKXsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSk7Ci0JCX0KLQkJaWYgKGNob2ljZXMuZ2V0U3luY0FkZG5QZXJmb3JtZXIoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKXsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCX0KLQkJaWYgKGNob2ljZXMuZ2V0U3luY1Jlc3BSb2xlKCkgPT0gU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCl7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkpOwotCQl9Ci0JCWlmIChjaG9pY2VzLmdldFN5bmNDb250QXJ0aWZhY3QoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKXsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jRGVsaXZQYXJ0KCkgPT0gU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCl7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSk7Ci0JCX0KLQkJaWYgKGNob2ljZXMuZ2V0U3luY1NlbFN0ZXAoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKXsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfU3RlcHMoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ2OTQ4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5VcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBVcGRhdGUgc3VwcHJlc3Npb24gaW5mb3JtYXRpb24gZnJvbSBiYXNlIGVsZW1lbnRzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbiBleHRlbmRzCi0JCUNvbW1hbmRBY3Rpb25IYW5kbGVyIGltcGxlbWVudHMgSVdvcmtiZW5jaFBhcnRBY3Rpb24sIElNb2RpZnlpbmdBY3Rpb24gewotCi0JcHJpdmF0ZSBQcm9jZXNzRWRpdG9yIGVkaXRvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyBVcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKG51bGwsIHRleHQpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICoKLQkgKi8KLQlwdWJsaWMgVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbigpIHsKLQkJdGhpcyhBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX3VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb25fbGFiZWwpOyAKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlBcnJheUxpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZihTdXBwcmVzc2lvbi5pc1ZhbGlkKGVsZW1lbnQpKSB7Ci0JCQkJbGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJaWYobGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZihsaXN0LnNpemUoKSA9PSAxICYmIAotCQkJCVByb2Nlc3NVdGlsLmlzUm9sbGVkVXBEZXNjcmlwdG9yKGxpc3QuZ2V0KDApLCAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihsaXN0KSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IFVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VDb21tYW5kKGdldFRleHQoKSwgc2VsZWN0aW9uLCBlZGl0b3IuZ2V0QWRhcHRlckZhY3RvcnkoKSwgZWRpdG9yLmdldFN1cHByZXNzaW9uKCkpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUNvbW1hbmQjZXhlY3V0ZSgpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQkJc3VwZXIuZXhlY3V0ZSgpOwotCQkJCQotCQkJCWlmKCFnZXRBZmZlY3RlZE9iamVjdHMoKS5pc0VtcHR5KCkpIHsKLQkJCQkJZWRpdG9yLnJlZnJlc2hBbGxQcm9jZXNzRWRpdG9ycygpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5VcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQ29tbWFuZCN1bmRvKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgdW5kbygpIHsKLQkJCQlzdXBlci51bmRvKCk7Ci0JCQkJCi0JCQkJaWYoIWdldEFmZmVjdGVkT2JqZWN0cygpLmlzRW1wdHkoKSkgewotCQkJCQllZGl0b3IucmVmcmVzaEFsbFByb2Nlc3NFZGl0b3JzKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLklXb3JrYmVuY2hQYXJ0QWN0aW9uI3NldEFjdGl2ZVdvcmtiZW5jaFBhcnQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlV29ya2JlbmNoUGFydChJV29ya2JlbmNoUGFydCB3b3JrYmVuY2hQYXJ0KSB7Ci0JCWlmKHdvcmtiZW5jaFBhcnQgaW5zdGFuY2VvZiBJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSB7Ci0JCQlkb21haW4gPSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpd29ya2JlbmNoUGFydCkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQl9Ci0JCWlmKHdvcmtiZW5jaFBhcnQgaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9yKSB7Ci0JCQllZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgd29ya2JlbmNoUGFydDsKLQkJfQkJCi0JCWVsc2UgaWYod29ya2JlbmNoUGFydCA9PSBudWxsKSB7Ci0JCQllZGl0b3IgPSBudWxsOwotCQl9Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgc3VwZXJSdW4oKSB7Ci0JCXN1cGVyLnJ1bigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZWRpdG9yLmdldEVkaXRvclNpdGUoKQotCQkJCS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXN1cGVyUnVuKCk7Ci0JCQkJCX0KLQkJCQotCQl9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvVXNlckludGVyYWN0aW9uSGFuZGxlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1VzZXJJbnRlcmFjdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxNzk2NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvVXNlckludGVyYWN0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdDb25maWd1cmF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5FcnJvckRpYWxvZ05vUmVhc29uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Vc2VySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3MuVW5jYW5jZWxhYmxlTGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzLlVzZXJJbnB1dHNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJvdmlkZXJzLkRlbGVnYXRlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklJbnB1dFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklucHV0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIGhhbmRsaW5nIG9mIHVzZXIgaW50ZXJhY3Rpb24gZHVyaW5nIGNvbW1hbmQgZXhlY3V0aW9uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VySW50ZXJhY3Rpb25IYW5kbGVyIGltcGxlbWVudHMgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgewotCi0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotCXByaXZhdGUgSU1lc3NlbmdlciBtZXNzZW5nZXIgPSBuZXcgSU1lc3NlbmdlcigpIHsKLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNob3dXYXJuaW5nKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1zZykgewotCQkJaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpID09IG51bGwpIHsKLQkJCQkvLyBjdXJyZW50IHRocmVhZCBpcyBub3QgYSB1c2VyLWludGVyZmFjZSB0aHJlYWQKLQkJCQkvLwotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5V2FybmluZyh0aXRsZSwgbXNnKTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0JCQl9IGVsc2UgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheVdhcm5pbmcoCi0JCQkJCQl0aXRsZSwgbXNnKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0Vycm9yKGphdmEubGFuZy5TdHJpbmcsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzaG93RXJyb3IoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbXNnLAotCQkJCWZpbmFsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCQlpZiAoc3RhdHVzID09IG51bGwpIHsKLQkJCQlzaG93RXJyb3IodGl0bGUsIG1zZyk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKSB7Ci0JCQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJCQkvLwotCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIHN0YXR1cyk7Ci0JCQkJCQl9Ci0KLQkJCQkJfSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJdGl0bGUsIG1zZywgc3RhdHVzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dFcnJvcihqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5FeGNlcHRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzaG93RXJyb3IoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbXNnLAotCQkJCWZpbmFsIFN0cmluZyByZWFzb24sIGZpbmFsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKSB7Ci0JCQkJLy8gY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdXNlci1pbnRlcmZhY2UgdGhyZWFkCi0JCQkJLy8KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIHJlYXNvbiwgZXhjZXB0aW9uKTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0JCQl9IGVsc2UgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLAotCQkJCQkJbXNnLCByZWFzb24sIGV4Y2VwdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNob3dXYXJuaW5nKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1zZywKLQkJCQlmaW5hbCBTdHJpbmcgcmVhc29uKSB7Ci0JCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkgewotCQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJCS8vCi0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlXYXJuaW5nKHRpdGxlLCBtc2csIHJlYXNvbik7Ci0JCQkJCX0KLQotCQkJCX0pOwotCQkJfSBlbHNlIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlXYXJuaW5nKAotCQkJCQkJdGl0bGUsIG1zZywgcmVhc29uKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0Vycm9yKGphdmEubGFuZy5TdHJpbmcsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNob3dFcnJvcihmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBtc2cpIHsKLQkJCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKSB7Ci0JCQkJLy8gY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdXNlci1pbnRlcmZhY2UgdGhyZWFkCi0JCQkJLy8KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2cpOwotCQkJCQl9Ci0KLQkJCQl9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsCi0JCQkJCQltc2cpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93SW5mbyhqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzaG93SW5mbyhmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBtc2cpIHsKLQkJCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKSB7Ci0JCQkJLy8gY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdXNlci1pbnRlcmZhY2UgdGhyZWFkCi0JCQkJLy8KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUluZm8odGl0bGUsIG1zZyk7Ci0JCQkJCX0KLQotCQkJCX0pOwotCQkJfSBlbHNlIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlJbmZvKHRpdGxlLAotCQkJCQkJbXNnKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0Vycm9yKGphdmEubGFuZy5TdHJpbmcsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKLQkJICogICAgICBqYXZhLmxhbmcuRXhjZXB0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2hvd0Vycm9yKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1zZywKLQkJCQlmaW5hbCBTdHJpbmcgcmVhc29uLCBmaW5hbCBTdHJpbmcgZGV0YWlscywKLQkJCQlmaW5hbCBFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkgewotCQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJCS8vCi0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnLCByZWFzb24sIGRldGFpbHMsCi0JCQkJCQkJCQkJZXhjZXB0aW9uKTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0JCQl9IGVsc2UgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLAotCQkJCQkJbXNnLCByZWFzb24sIGRldGFpbHMsIGV4Y2VwdGlvbik7Ci0JCQl9Ci0JCX0KLQotCX07Ci0KLQlwdWJsaWMgVXNlckludGVyYWN0aW9uSGFuZGxlcigpIHsKLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzaGVsbAotCSAqICAgICAgICAgICAgdGhlIHNoZWxsIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyI2dldFVJQ29udGV4dCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRVSUNvbnRleHQoKSB7Ci0JCWlmIChzaGVsbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTXNnQm94LmdldERlZmF1bHRTaGVsbCgpOwotCQl9Ci0JCXJldHVybiBzaGVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyI3NlbGVjdChqYXZhLnV0aWwuTGlzdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIsIGJvb2xlYW4sIGphdmEudXRpbC5MaXN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgTGlzdCBzZWxlY3QoTGlzdCBvYmplY3RzVG9TZWxlY3QsIGZpbmFsIElJdGVtTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCQkJYm9vbGVhbiBtdWx0aXBsZSwgTGlzdCBpbnRpdGlhbFNlbGVjdGlvbiwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCUlMYWJlbFByb3ZpZGVyIGxwID0gbmV3IERlbGVnYXRlTGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJaWYgKG11bHRpcGxlKSB7Ci0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKTsKLQkJCVVuY2FuY2VsYWJsZUxpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IFVuY2FuY2VsYWJsZUxpc3RTZWxlY3Rpb25EaWFsb2coCi0JCQkJCXNoZWxsLCBvYmplY3RzVG9TZWxlY3QsIGNvbnRlbnRQcm92aWRlciwgbHAsIG1zZyk7Ci0JCQlkbGcuc2V0VGl0bGUodGl0bGUpOwotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZGxnLm9wZW4oKTsKLQkJCU9iamVjdCBvYmpzW10gPSBkbGcuZ2V0UmVzdWx0KCk7Ci0JCQlpZiAob2JqcyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChvYmpzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJCX0KLQkJCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChvYmpzKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZygKLQkJCQkJc2hlbGwsIGxwKTsKLQotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZGxnLnNldEVsZW1lbnRzKG9iamVjdHNUb1NlbGVjdC50b0FycmF5KCkpOwotCQkJZGxnLnNldE11bHRpcGxlU2VsZWN0aW9uKGZhbHNlKTsKLQkJCWRsZy5zZXRNZXNzYWdlKG1zZyk7Ci0JCQlkbGcuc2V0VGl0bGUodGl0bGUpOwotCQkJZGxnLnNldEZpbHRlcihudWxsKTsKLQkJCWlmIChkbGcub3BlbigpID09IERpYWxvZy5DQU5DRUwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCU9iamVjdCBvYmogPSBkbGcuZ2V0Rmlyc3RSZXN1bHQoKTsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG9iaik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyI3NlbGVjdE9uZShpbnRbXSwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGludCBzZWxlY3RPbmUoaW50W10gYWN0aW9ucywgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBJU3RhdHVzIHN0YXR1cykgewotCQlmaW5hbCBTdHJpbmdbXSBidXR0b25MYWJlbHMgPSBuZXcgU3RyaW5nW2FjdGlvbnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlidXR0b25MYWJlbHNbaV0gPSBnZXRBY3Rpb25UZXh0KGFjdGlvbnNbaV0pOwotCQl9Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNoZWxsID0gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkKLQkJCQkJLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCQlpbWFnZSA9IHNoZWxsLmdldEltYWdlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJaWYgKHN0YXR1cyA9PSBudWxsKSB7Ci0JCQlNZXNzYWdlRGlhbG9nIG1zZ0RsZyA9IG5ldyBNZXNzYWdlRGlhbG9nKHNoZWxsLCB0aXRsZSwgaW1hZ2UsIG1zZywKLQkJCQkJTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgYnV0dG9uTGFiZWxzLCAwKTsKLQkJCWludCBpZCA9IG1zZ0RsZy5vcGVuKCk7Ci0JCQlyZXR1cm4gYWN0aW9uc1tpZF07Ci0JCX0gZWxzZSB7Ci0JCQlFcnJvckRpYWxvZ05vUmVhc29uIGRsZyA9IG5ldyBFcnJvckRpYWxvZ05vUmVhc29uKHNoZWxsLCB0aXRsZSwKLQkJCQkJbXNnLCBzdGF0dXMsIElTdGF0dXMuT0sgfCBJU3RhdHVzLklORk8gfCBJU3RhdHVzLldBUk5JTkcKLQkJCQkJCQl8IElTdGF0dXMuRVJST1IpIHsKLQotCQkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCQkvLyBjcmVhdGUgT0sgYW5kIERldGFpbHMgYnV0dG9ucwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1dHRvbkxhYmVscy5sZW5ndGg7IGkrKykgewotCQkJCQkJU3RyaW5nIGxhYmVsID0gYnV0dG9uTGFiZWxzW2ldOwotCQkJCQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgaSwgbGFiZWwsIGkgPT0gMCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHNob3VsZFNob3dEZXRhaWxzQnV0dG9uKCkpIHsKLQkJCQkJCWRldGFpbHNCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQkJCQlJRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQsCi0JCQkJCQkJCUlEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMLCBmYWxzZSk7Ci0JCQkJCX0KLQotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5FcnJvckRpYWxvZ05vUmVhc29uI2J1dHRvblByZXNzZWQoaW50KQotCQkJCSAqLwotCQkJCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGlkKSB7Ci0JCQkJCWlmIChpZCA9PSBJRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQpIHsKLQkJCQkJCXN1cGVyLmJ1dHRvblByZXNzZWQoaWQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc2V0UmV0dXJuQ29kZShpZCk7Ci0JCQkJCQljbG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCWludCBpZCA9IGRsZy5vcGVuKCk7Ci0JCQlyZXR1cm4gYWN0aW9uc1tpZF07Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWN0aW9uIHRleHQKLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uCi0JICogQHJldHVybiBBY3Rpb24gdGV4dCAtIGVpdGhlciBBQk9SVCwgQ0FOQ0VMLCBPSywgUkVUUlkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25UZXh0KGludCBhY3Rpb24pIHsKLQkJc3dpdGNoIChhY3Rpb24pIHsKLQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQUJPUlQ6Ci0JCQlyZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5BQk9SVF9MQUJFTDsKLQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQ0FOQ0VMOgotCQkJcmV0dXJuIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMOwotCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9PSzoKLQkJCXJldHVybiBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMOwotCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9SRVRSWToKLQkJCXJldHVybiBJRGlhbG9nQ29uc3RhbnRzLlJFVFJZX0xBQkVMOwotCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9ZRVM6Ci0JCQlyZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUw7Ci0JCWNhc2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX05POgotCQkJcmV0dXJuIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUw7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyI2dldE1lc3NlbmdlcigpCi0JICovCi0JcHVibGljIElNZXNzZW5nZXIgZ2V0TWVzc2VuZ2VyKCkgewotCQlyZXR1cm4gbWVzc2VuZ2VyOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIjcmVxdWVzdElucHV0KGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXF1ZXN0SW5wdXQoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbXNnLCBmaW5hbCBMaXN0IHVzZXJJbnB1dHMpIHsKLQkJaWYgKHVzZXJJbnB1dHMgPT0gbnVsbCB8fCB1c2VySW5wdXRzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpID09IG51bGwpIHsKLQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJLy8KLQkJCWZpbmFsIGJvb2xlYW4gcmV0SG9sZGVyW10gPSBuZXcgYm9vbGVhblsxXTsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJcmV0SG9sZGVyWzBdID0gZG9SZXF1ZXN0SW5wdXQodGl0bGUsIG1zZywgdXNlcklucHV0cyk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJCXJldHVybiByZXRIb2xkZXJbMF07Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZG9SZXF1ZXN0SW5wdXQodGl0bGUsIG1zZywgdXNlcklucHV0cyk7Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBkb1JlcXVlc3RJbnB1dChTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIExpc3QgdXNlcklucHV0cykgewotCQlmaW5hbCBVc2VySW5wdXQgdXNlcklucHV0ID0gKFVzZXJJbnB1dCkgdXNlcklucHV0cy5nZXQoMCk7Ci0JCWlmICh1c2VySW5wdXQuZ2V0Q29udGV4dCgpIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZCkgewotCQkJTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZCBjbWQgPSAoTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZCkgdXNlcklucHV0Ci0JCQkJCS5nZXRDb250ZXh0KCk7Ci0JCQlpZiAoY21kLmdldEZlYXR1cmUoKSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSkgewotCQkJCU5ld0NvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkID0gbmV3IE5ld0NvbmZpZ3VyYXRpb25XaXphcmQoKTsKLQkJCQl3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBudWxsKTsKLQkJCQl3aXphcmQuc2V0TWV0aG9kQ29uZmlndXJhdGlvbigoTWV0aG9kQ29uZmlndXJhdGlvbikgY21kLmdldENoaWxkKCkpOwotCQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgd2l6YXJkKTsKLQkJCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJCXVzZXJJbnB1dC5zZXRJbnB1dCh3aXphcmQuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLmdldE5hbWUoKSk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYodXNlcklucHV0cy5zaXplKCkgPT0gMSAmJiB1c2VySW5wdXQuZ2V0VHlwZSgpID09IFVzZXJJbnB1dC5URVhUICYmIHVzZXJJbnB1dC5nZXRMYWJlbCgpID09IG51bGwpIHsKLQkJCS8vIHVzZXIgSW5wdXREaWFsb2cgZm9yIHRoaXMgY2FzZSB1bnRpbCB3ZSBmaXggdGhpcyBkaWFsb2cgYm94Ci0JCQkvLwotCQkJSUlucHV0VmFsaWRhdG9yIHZhbGlkYXRvciA9IHVzZXJJbnB1dC5nZXRWYWxpZGF0b3IoKSAhPSBudWxsID8gbmV3IElJbnB1dFZhbGlkYXRvcigpIHsKLQotCQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQkJCQlyZXR1cm4gdXNlcklucHV0LmdldFZhbGlkYXRvcigpLmlzVmFsaWQobmV3VGV4dCk7Ci0JCQkJfQotCQkJCi0JCQl9IDogbnVsbDsKLQkJCUlucHV0RGlhbG9nIGRsZyA9IG5ldyBJbnB1dERpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCXRpdGxlLCBtc2csIChTdHJpbmcpdXNlcklucHV0LmdldElucHV0KCksIHZhbGlkYXRvcik7Ci0JCQlpZihkbGcub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCXVzZXJJbnB1dC5zZXRJbnB1dChkbGcuZ2V0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCVVzZXJJbnB1dHNEaWFsb2cgZGlhbG9nID0gbmV3IFVzZXJJbnB1dHNEaWFsb2coUGxhdGZvcm1VSQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSwgdXNlcklucHV0cywKLQkJCQl0aXRsZSwgbXNnKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm4gZGlhbG9nLmdldFJlc3VsdCgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDE3ZGQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBlZGl0aW5nIGFjdGlvbnMgZm9yIHRoZSBBdXRob3JpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jZWxsZWRpdG9ycy9BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jZWxsZWRpdG9ycy9BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTdiYjI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2VsbGVkaXRvcnMvQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNlbGxlZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UcmVlRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotCi0vKioKLSAqIEFuIGFic3RyYWN0IGNsYXNzIGZvciBjaGVjayBib3ggY2VsbCBlZGl0b3IKLSAqIEBhdXRob3IgQW4gTWluZwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yIHsKLQotCS8vIHRoZSBjZWxsIG1vZGlmaWVyCi0JcHJpdmF0ZSBJQ2VsbE1vZGlmaWVyIG1vZGlmaWVyID0gbnVsbDsKLQotCS8vIHRyZWUgZWRpdG9yCi0JcHJpdmF0ZSBUcmVlRWRpdG9yIHRyZWVFZGl0b3IgPSBudWxsOwotCi0JLy8gdGhlIHRyZWUKLQlwcml2YXRlIFRyZWUgdHJlZSA9IG51bGw7Ci0KLQkvLyB0aGUgY29udHJvbCBlZGl0b3IKLQlwcml2YXRlIENvbnRyb2wgY29udHJvbCA9IG51bGw7Ci0KLQkvLyB0aGUgY29sdW1uIGluZGV4Ci0JcHJpdmF0ZSBpbnQgY29sdW1uSW5kZXg7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gdHJlZQotCSAqLwotCXB1YmxpYyBBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvcihDb21wb3NpdGUgdHJlZSkgewotCQl0aGlzLnRyZWUgPSAoVHJlZSkgdHJlZTsKLQkJdGhpcy50cmVlRWRpdG9yID0gbmV3IFRyZWVFZGl0b3IodGhpcy50cmVlKTsKLQl9Ci0KLQotCS8qKgotCSAqIFNldCBjZWxsIG1vZGlmaWVyCi0JICogQHBhcmFtIG1vZGlmaWVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2VsbE1vZGlmaWVyKElDZWxsTW9kaWZpZXIgbW9kaWZpZXIpIHsKLQkJdGhpcy5tb2RpZmllciA9IG1vZGlmaWVyOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY2VsbCBtb2RpZmllcgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCUNlbGxNb2RpZmllcgotCSAqLwotCXByb3RlY3RlZCBJQ2VsbE1vZGlmaWVyIGdldENlbGxNb2RpZmllcigpIHsKLQkJcmV0dXJuIHRoaXMubW9kaWZpZXI7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IEltYWdlIGdldEltYWdlKFRyZWVJdGVtIGl0ZW0sIFN0cmluZyBjb2x1bW5wcm9wZXJ0eSk7Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBtb2RpZnkoVHJlZUl0ZW0gaXRlbSwgU3RyaW5nIGNvbHVtbnByb3BlcnR5KTsKLQotCS8qCi0JICogPT09PT09PWluIGZhY3QgYmVsb3cgY29kZXMgYXJlIGZvciB0aGUgZHluYW1pYyBjZWxsIGVkaXRvciAocmVhbCBjb250cm9sCi0JICogImJ1dHRvbiIpPT09PT0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0b3JUbyhUcmVlSXRlbSBpdGVtLCBTdHJpbmcgY29sdW1ucHJvcGVydHkpIHsKLQkJaWYgKHRyZWVFZGl0b3IuZ2V0SXRlbSgpICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChjb250cm9sID09IG51bGwpCi0JCQljb250cm9sID0gY3JlYXRlQ29udHJvbCh0cmVlKTsKLQkJaG9va0NvbnRyb2woY29udHJvbCwgaXRlbSwgY29sdW1ucHJvcGVydHkpOwotCi0JCXRyZWVFZGl0b3IubWluaW11bVdpZHRoID0gY29udHJvbC5nZXRTaXplKCkueDsKLQkJdHJlZUVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJdHJlZUVkaXRvci5zZXRFZGl0b3IoY29udHJvbCwgaXRlbSwgY29sdW1uSW5kZXgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlRWRpdG9yRnJvbShUcmVlSXRlbSBpdGVtLCBTdHJpbmcgY29sdW1ucHJvcGVydHkpIHsKLQkJY29udHJvbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJdHJlZUVkaXRvci5zZXRFZGl0b3IobnVsbCwgbnVsbCwgY29sdW1uSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBDb250cm9sIGNyZWF0ZUNvbnRyb2woVHJlZSBwYXJlbnQpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaG9va0NvbnRyb2woQ29udHJvbCBjb250cm9sLCBUcmVlSXRlbSBpdGVtLAotCQkJU3RyaW5nIGNvbHVtbnByb3BlcnR5KTsKLQotCS8qKgotCSAqIEdldCBjb2x1bW4gaW5kZXgKLQkgKiBAcmV0dXJuCi0JICogCQlpbmRleAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29sdW1uSW5kZXgoKSB7Ci0JCXJldHVybiBjb2x1bW5JbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgaW5kZXggZm9yIGNvbHVtbgotCSAqIEBwYXJhbSBjb2x1bW5JbmRleAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtbkluZGV4KGludCBjb2x1bW5JbmRleCkgewotCQl0aGlzLmNvbHVtbkluZGV4ID0gY29sdW1uSW5kZXg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jZWxsZWRpdG9ycy9Qcm9jZXNzQ2hlY2tCb3hDZWxsRWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NlbGxlZGl0b3JzL1Byb2Nlc3NDaGVja0JveENlbGxFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVjZDQzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NlbGxlZGl0b3JzL1Byb2Nlc3NDaGVja0JveENlbGxFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNlbGxlZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLQotLyoqCi0gKiBDaGVjayBCb3ggY2VsbCBlZGl0b3IgZm9yIHByb2Nlc3MgZm9ybSBwYWdlLCBXQlMsIFRBLCBXUFUKLSAqIAotICogQGF1dGhvciBBbiBNaW5nCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NoZWNrQm94Q2VsbEVkaXRvciBleHRlbmRzIEFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yIHsKLQkKLQkvLyBjaGVja2JveCBpbWFnZXMKLQlwcml2YXRlIGZpbmFsIEltYWdlIGNoZWNrSW1hZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkiZnVsbC9vYmoxNi9DaGVjay5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBJbWFnZSB1bmNoZWNrSW1hZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkiZnVsbC9vYmoxNi9VbmNoZWNrLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIEltYWdlIGRpc2FibGVDaGVja0ltYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkiZnVsbC9vYmoxNi9EaXNhYmxlQ2hlY2suZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIGZpbmFsIEltYWdlIGRpc2FibGVVbmNoZWNrSW1hZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCSJmdWxsL29iajE2L0Rpc2FibGVVbmNoZWNrLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHRyZWUKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NoZWNrQm94Q2VsbEVkaXRvcihDb21wb3NpdGUgdHJlZSkgewotCQlzdXBlcih0cmVlKTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2VsbGVkaXRvcnMuQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3IjZ2V0SW1hZ2Uob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW0sIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFRyZWVJdGVtIGl0ZW0sIFN0cmluZyBjb2x1bW5wcm9wZXJ0eSkgewotCQlmaW5hbCBJQ2VsbE1vZGlmaWVyIG1vZGlmaWVyID0gZ2V0Q2VsbE1vZGlmaWVyKCk7Ci0JCU9iamVjdCBlbGVtZW50ID0gaXRlbS5nZXREYXRhKCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLS8vCQlpZiAoY29sdW1ucHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HCi0vLwkJCQl8fCBjb2x1bW5wcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUKLS8vCQkJCXx8IGNvbHVtbnByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOKSB7Ci0vLwkJCWlmICghKFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpKSB7Ci0vLwkJCQlyZXR1cm4gbnVsbDsKLS8vCQkJfQotLy8JCX0KLQkJT2JqZWN0IHZhbHVlID0gbW9kaWZpZXIuZ2V0VmFsdWUoZWxlbWVudCwgY29sdW1ucHJvcGVydHkpOwotCQlpZiAodmFsdWUgPT0gbnVsbCB8fCAhKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJYm9vbGVhbiBjYW5Nb2RpZnkgPSBtb2RpZmllci5jYW5Nb2RpZnkoZWxlbWVudCwgY29sdW1ucHJvcGVydHkpOwotCi0JCWlmICgoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSkgewotCQkJcmV0dXJuIGNhbk1vZGlmeSA/IGNoZWNrSW1hZ2UgOiBkaXNhYmxlQ2hlY2tJbWFnZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBjYW5Nb2RpZnkgPyB1bmNoZWNrSW1hZ2UgOiBkaXNhYmxlVW5jaGVja0ltYWdlOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9ycy5BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciNtb2RpZnkob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW0sIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5KFRyZWVJdGVtIGl0ZW0sIFN0cmluZyBjb2x1bW5wcm9wZXJ0eSkgewotCQlmaW5hbCBJQ2VsbE1vZGlmaWVyIG1vZGlmaWVyID0gZ2V0Q2VsbE1vZGlmaWVyKCk7Ci0JCWlmICghbW9kaWZpZXIuY2FuTW9kaWZ5KGl0ZW0uZ2V0RGF0YSgpLCBjb2x1bW5wcm9wZXJ0eSkpCi0JCQlyZXR1cm47Ci0JCW1vZGlmaWVyLm1vZGlmeShpdGVtLCBjb2x1bW5wcm9wZXJ0eSwgbmV3IEJvb2xlYW4oISgoQm9vbGVhbikgbW9kaWZpZXIKLQkJCQkuZ2V0VmFsdWUoaXRlbS5nZXREYXRhKCksIGNvbHVtbnByb3BlcnR5KSkuYm9vbGVhblZhbHVlKCkpKTsKLQl9Ci0KLQkvKgotCSAqID09PT09PT1pbiBmYWN0IGJlbG93IGNvZGVzIGFyZSBmb3IgdGhlIGR5bmFtaWMgY2VsbCBlZGl0b3IgKHJlYWwgY29udHJvbAotCSAqICJidXR0b24iKT09PT09Ci0JICovCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9ycy5BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udHJvbChUcmVlIHBhcmVudCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWJ1dHRvbi5wYWNrKCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9ycy5BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciNob29rQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sLCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbSwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBob29rQ29udHJvbChDb250cm9sIGNvbnRyb2wsIFRyZWVJdGVtIGl0ZW0sCi0JCQlmaW5hbCBTdHJpbmcgY29sdW1ucHJvcGVydHkpIHsKLQkJZmluYWwgSUNlbGxNb2RpZmllciBtb2RpZmllciA9IGdldENlbGxNb2RpZmllcigpOwotCQlmaW5hbCBPYmplY3QgZWxlbWVudCA9IGl0ZW07Ci0JCWZpbmFsIEJ1dHRvbiBjaGVja2JveCA9IChCdXR0b24pIGNvbnRyb2w7Ci0JCWlmIChsaXN0ZW5lciAhPSBudWxsKQotCQkJY2hlY2tib3gucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQlsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW1vZGlmaWVyLm1vZGlmeShlbGVtZW50LCBjb2x1bW5wcm9wZXJ0eSwgbmV3IEJvb2xlYW4oY2hlY2tib3gKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSkpOwotCQkJfQotCQl9OwotCQljaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jaGVhdHNoZWV0cy9hY3Rpb25zL0NoZWF0c2hlZXRTd2l0Y2hKb2IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9DaGVhdHNoZWV0U3dpdGNoSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MTk4ZjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jaGVhdHNoZWV0cy9hY3Rpb25zL0NoZWF0c2hlZXRTd2l0Y2hKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2hlYXRzaGVldHMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuT3BlbkNoZWF0U2hlZXRBY3Rpb247Ci0KLS8qKgotICogU3dpdGNocyBjaGVhdCBzaGVldCBhbmQgb3BlbnMgaXQuCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIENoZWF0c2hlZXRTd2l0Y2hKb2IgZXh0ZW5kcyBKb2IgewotCXByaXZhdGUgU3RyaW5nIGNoZWF0c2hlZXRJZDsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSB3aXRoIGNoZWF0IHNoZWV0IG5hbWUgYW5kIElkCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gY2hlYXRzaGVldElkCi0JICovCi0JcHVibGljIENoZWF0c2hlZXRTd2l0Y2hKb2IoU3RyaW5nIG5hbWUsIFN0cmluZyBjaGVhdHNoZWV0SWQpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXRoaXMuY2hlYXRzaGVldElkID0gY2hlYXRzaGVldElkOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJbmV3IE9wZW5DaGVhdFNoZWV0QWN0aW9uKGNoZWF0c2hlZXRJZCkucnVuKCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvQ3JlYXRlUGx1Z2luQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvQ3JlYXRlUGx1Z2luQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2Nzg3OGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jaGVhdHNoZWV0cy9hY3Rpb25zL0NyZWF0ZVBsdWdpbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jaGVhdHNoZWV0cy5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk5ld1BsdWdpbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuSUNoZWF0U2hlZXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuSUNoZWF0U2hlZXRNYW5hZ2VyOwotCi0vKioKLSAqIENyZWF0ZSBNZXRob2QgUGx1Zy1pbiBjaGVhdCBzaGVldCBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlUGx1Z2luQWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSUNoZWF0U2hlZXRBY3Rpb24gewotCi0JLyoqCi0JICogQHNlZSBJQ2hlYXRTaGVldEFjdGlvbiNydW4oU3RyaW5nW10sIElDaGVhdFNoZWV0TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oU3RyaW5nW10gcGFyYW1zLCBJQ2hlYXRTaGVldE1hbmFnZXIgbWFuYWdlcikgewotCQlOZXdQbHVnaW5BY3Rpb24uZXhlY3V0ZShQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBudWxsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9Td2l0Y2hDaGVhdHNoZWV0VG8uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9Td2l0Y2hDaGVhdHNoZWV0VG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQxMzVlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvU3dpdGNoQ2hlYXRzaGVldFRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNoZWF0c2hlZXRzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLklDaGVhdFNoZWV0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLklDaGVhdFNoZWV0TWFuYWdlcjsKLQotLyoqCi0gKiBDcmVhdGUgc3dpdGNoIGNoZWF0IHNoZWV0IGFjdGlvbgotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTd2l0Y2hDaGVhdHNoZWV0VG8gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJQ2hlYXRTaGVldEFjdGlvbiB7Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLklDaGVhdFNoZWV0QWN0aW9uI3J1bihqYXZhLmxhbmcuU3RyaW5nW10sIG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLklDaGVhdFNoZWV0TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oU3RyaW5nW10gcGFyYW1zLCBJQ2hlYXRTaGVldE1hbmFnZXIgbWFuYWdlcikgewotCi0JCWlmIChwYXJhbXMubGVuZ3RoIDw9IDApCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIGNzX2lkID0gcGFyYW1zWzBdOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIERFQlVHOiBpbiBTd2l0Y2hDaGVhdHNoZWV0VG8ucnVuKC4uLikgY3NfSUQgPQotCQkvLyAiICsgY3NfaWQpOyAvLyROT04tTkxTLTEkCi0KLQkJQ2hlYXRzaGVldFN3aXRjaEpvYiBzd2l0Y2hKb2IgPSBuZXcgQ2hlYXRzaGVldFN3aXRjaEpvYigKLQkJCQkiU3dpdGNoIENoZWF0c2hlZXQiLCBjc19pZCk7IC8vJE5PTi1OTFMtMSQKLQkJc3dpdGNoSm9iLnNjaGVkdWxlKDUwKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmU5YWZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBhY3Rpb25zIGZvciB0aGUgQXV0aG9yaW5nIGNoZWF0c2hlZXRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9BRERJbmZvRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQURESW5mb0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTAyMTc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9BRERJbmZvRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkRlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5FeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklQcm9jZXNzRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi0vKioKLSAqIEZpbHRlciBEaWFsb2cgLSBhbGxvdyB0aGUgdXNlciB0byBmaWx0ZXIgdGhlIGNvbnRlbnQgZWxlbWVudCwgY29udGVudAotICogY2F0ZWdvcmllcywgY3VzdG9tIGNhdGVnb3JpZXMsIEFsbCB0eXBlcyBvZiBjb250ZW50ZWxlbWVudHMgYmFzZWQgb24gbG9jYXRpb24gb2YgdGhlIHVzZSBvZiB0aGUgZmlsdGVyCi0gKiBkaWFsb2cuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICovCi1wdWJsaWMgY2xhc3MgQURESW5mb0RpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzCi0JCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIElEb3VibGVDbGlja0xpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b24sIGNhbmNlbEJ1dHRvbjsKLQotCXByb3RlY3RlZCBUZXh0IGN0cmxfYnJpZWZfZGVzYzsKLQotCS8vcHJpdmF0ZSBTdHJpbmcgcGF0dGVybiwgZmlsdGVyVHlwZVN0cjsKLQotCS8vcHJvdGVjdGVkIENvbWJvIGZpbHRlclR5cGU7Ci0KLQlwcml2YXRlIFN0cmluZyBkaWFsb2dUaXRsZSwgdGFiU3RyOwotCi0JcHJpdmF0ZSBPYmplY3QgY29udGVudEVsZW1lbnQ7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBzZWxlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdmlld2VyU2VsZWN0aW9uU2luZ2xlID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgdmlld2VyTGFiZWwgPSBudWxsOwotCQotCS8qCi0JICogVHJlZXZpZXdlciBmb3IgQ29udGVudEVsZW1lbnRzIHRvIGRpc3BsYXkuCi0JICovCi0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkvLyByZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwgIiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQlwcml2YXRlIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLQotCS8qCi0JICogRGlhbG9nIEF0dHJpYnV0ZXMKLQkgKi8KLQkvLyBwcml2YXRlIGJvb2xlYW4gYW55Q2hpbGRzID0gdHJ1ZTsKLQlwcml2YXRlIExpc3QgYWxyZWFkeVNlbGVjdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlQYXR0ZXJuIHJlZ2V4UGF0dGVybjsKLQotCS8vIHByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWd1cmF0aW9uOwotCXByb3RlY3RlZCBGaWx0ZXJIZWxwZXIgaGVscGVyOwotCi0JcHJpdmF0ZSBCdXR0b24gZXhwYW5kQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gY29sbGFwc2VCdXR0b247Ci0KLQlwcml2YXRlIE9iamVjdCBpbnB1dDsKLQotCS8vcHJpdmF0ZSBTdHJpbmdbXSB0eXBlczsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRmlsdGVyRGlhbG9nLiBUaGlzIGNvbnN0cnVjdG9yIHdpbGwgdXNlIGZpbHRlciBiYXNlZCBvbgotCSAqIHRhYlN0ciwgZmlsdGVycyBvdXQgdGhlIGxpc3Qgb2YgZWxlbWVudHMgYmFzZWQgb24gYWxyZWFkeSBleGlzdGluZwotCSAqIHNlbGVjdGVkIGVsZW1lbnQgaW4gdGhlIHNlbGVjdGVkIHRhYmxlLiBJbml0aWFsaXplcyB0aGUgQ29udGVudFByb3ZpZGVyCi0JICogZm9yIHRoZSB0cmVldmlld2VyLgotCSAqIAotCSAqLwotCXB1YmxpYyBBRERJbmZvRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBPYmplY3QgY29udGVudEVsZW1lbnQsCi0JCQlTdHJpbmcgdGFiU3RyLCBMaXN0IGFscmVhZHlFeGlzdHMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCXRoaXMudGFiU3RyID0gdGFiU3RyOwotCQl0aGlzLmZpbHRlciA9IG51bGw7Ci0JCXRoaXMuYWxyZWFkeVNlbGVjdGVkTGlzdCA9IGFscmVhZHlFeGlzdHM7Ci0JCWhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIoY29udGVudEVsZW1lbnQsIHRhYlN0ciwgbnVsbCwgbnVsbCwKLQkJCQl0aGlzLmFscmVhZHlTZWxlY3RlZExpc3QpOwotCQlpbml0UHJvdmlkZXJGb3JUYWJzKCk7Ci0JfQotCi0JcHVibGljIEFEREluZm9EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElGaWx0ZXIgZmlsdGVyLCBTdHJpbmcgdGFiU3RyLAotCQkJTGlzdCBhbHJlYWR5RXhpc3RzLCBPYmplY3QgaW5wdXQpIHsKLQkJdGhpcyhwYXJlbnRTaGVsbCwgZmlsdGVyLCBudWxsLCB0YWJTdHIsIGFscmVhZHlFeGlzdHMpOwotCQl0aGlzLmlucHV0ID0gaW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBGaWx0ZXJEaWFsb2cuIFRoaXMgY29uc3RydWN0b3Igd2lsbCB1c2UgcGFzc2VkIGZpbHRlci4KLQkgKiB0YWJTdHIgaXMgdXNlZCBmb3IgdGhlIHNlYXJjaHR5cGUgb25seS4gSW5pdGlhbGl6ZXMgdGhlIENvbnRlbnRQcm92aWRlcgotCSAqIGZvciB0aGUgdHJlZXZpZXdlci4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgQURESW5mb0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSUZpbHRlciBmaWx0ZXIsCi0JCQlPYmplY3QgY29udGVudEVsZW1lbnQsIFN0cmluZyB0YWJTdHIpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJdGhpcy50YWJTdHIgPSB0YWJTdHI7Ci0KLQkJaGVscGVyID0gbmV3IEZpbHRlckhlbHBlcihjb250ZW50RWxlbWVudCwgdGFiU3RyLCBudWxsLCBudWxsLCBudWxsKTsKLQkJaW5pdFByb3ZpZGVyRm9yVGFicygpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRmlsdGVyRGlhbG9nLiBUaGlzIGNvbnN0cnVjdG9yIHdpbGwgdXNlIHBhc3NlZCBmaWx0ZXIuCi0JICogdGFiU3RyIGlzIHVzZWQgZm9yIHRoZSBzZWFyY2h0eXBlIG9ubHkuIEluaXRpYWxpemVzIHRoZSBDb250ZW50UHJvdmlkZXIKLQkgKiBmb3IgdGhlIHRyZWV2aWV3ZXIuCi0JICogCi0JICovCi0JcHVibGljIEFEREluZm9EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElGaWx0ZXIgZmlsdGVyLAotCQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50LCBTdHJpbmcgdGFiU3RyLCBMaXN0IGFscmVhZHlFeGlzdHMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJdGhpcy50YWJTdHIgPSB0YWJTdHI7Ci0JCXRoaXMuYWxyZWFkeVNlbGVjdGVkTGlzdCA9IGFscmVhZHlFeGlzdHM7Ci0JCWhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIoY29udGVudEVsZW1lbnQsIHRhYlN0ciwgbnVsbCwgbnVsbCwKLQkJCQlhbHJlYWR5RXhpc3RzKTsKLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCQlpbml0UHJvdmlkZXJGb3JUYWJzKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBGaWx0ZXJEaWFsb2cuIE9ubHkgZm9yIG1ldGhvZGNvbmZpZ3VyYXRpb24uIFRoaXMKLQkgKiBjb25zdHJ1Y3RvciB3aWxsIHVzZSBwYXNzZWQgZmlsdGVyLiBJbml0aWFsaXplcyB0aGUgQ29udGVudFByb3ZpZGVyIGZvcgotCSAqIHRoZSB0cmVldmlld2VyLgotCSAqIAotCSAqLwotCS8vIHB1YmxpYyBJdGVtc0ZpbHRlckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgT2JqZWN0IGNvbnRlbnRFbGVtZW50LAotCS8vIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlndXJhdGlvbiwgU3RyaW5nIHRhYlN0cikgewotCS8vIHN1cGVyKHBhcmVudFNoZWxsKTsKLQkvLyB0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JLy8gdGhpcy50YWJTdHIgPSB0YWJTdHI7Ci0JLy8gdGhpcy5maWx0ZXIgPSBudWxsOwotCS8vIHRoaXMubWV0aG9kQ29uZmlndXJhdGlvbiA9IG1ldGhvZENvbmZpZ3VyYXRpb247Ci0JLy8gaGVscGVyID0gbmV3IEZpbHRlckhlbHBlcihjb250ZW50RWxlbWVudCwgdGFiU3RyLCBudWxsLCBudWxsLCBudWxsKTsKLQkvLyBpbml0UHJvdmlkZXJGb3JUYWJzKCk7Ci0JLy8gfQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3IgaXMgdmVyeSBnZW5lcmljLCBpbiBvcmRlciB0byBpbml0aWFsaXplIGZpbHRlciwgaW5wdXQKLQkgKiBhbmQgY29udGVudHByb3ZpZGVyIHNob3VsZCBiZSBoYW5kbGVkIGV4cGxpY2l0bHkgYnkgY2FsbGluZyBiZWxvdyBtZXRob2QuCi0JICogc2V0RmlsdGVyKElGaWx0ZXIpIHNldElucHV0KE9iamVjdCkKLQkgKiBzZXRDb250ZW50UHJvdmlkZXIoSVN0cnVjdHVyZWRQcm92aWRlcikKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQURESW5mb0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCWhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGlmIGEgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0JCQlzYXZlVmFsdWVzKCk7Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCQlpZihjb21wb3NlZEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpewotCQkJY29tcG9zZWRBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCX0KLQkJY2xvc2UoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVWYWx1ZXMoKXsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0cmVlVmlld2VyCi0JCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQlPYmplY3RbXSBvYmplY3RBcnIgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RBcnIubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gTGlicmFyeVV0aWwudW53cmFwKG9iamVjdEFycltpXSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCXNlbGVjdGVkTGlzdC5hZGQob2JqKTsKLQkJCQl9IAotCQkJfQotCQl9Ci0JfQotCQkKLQkvKioKLQkgKiBOb3RpZmllcyB0aGF0IHRoZSBjYW5jZWwgYnV0dG9uIG9mIHRoaXMgZGlhbG9nIGhhcyBiZWVuIHByZXNzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2FuY2VsUHJlc3NlZCgpIHsKLQkJaWYoY29tcG9zZWRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKXsKLQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGl0bGUgZm9yIGRpYWxvZyBib3ggZWc6IFNlbGVjdCBEaWFsb2cgRm9yIFJvbGUsIGRpYWxvZ1RpdGxlIG5lZWRzIHRvCi0JICogIlJvbGUiCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIGRpYWxvZ1RpdGxlKSB7Ci0JCXRoaXMuZGlhbG9nVGl0bGUgPSBkaWFsb2dUaXRsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlpZiAoZGlhbG9nVGl0bGUgPT0gbnVsbCkKLQkJCWRpYWxvZ1RpdGxlID0gdGFiU3RyOwotCQlzaGVsbC5zZXRUZXh0KCJBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBJbmZvOiAiICsgZGlhbG9nVGl0bGUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogKG5vbi1KYXZhZG9jKSBBZGRzIGJ1dHRvbnMgdG8gdGhpcyBkaWFsb2cncyBidXR0b24gYmFyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBidXR0b24gYmFyIGNvbXBvc2l0ZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGRpYWxvZyBhcmVhIGFuZCBjb250cm9scyBhbmQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSB0aGUKLQkgKiAgICAgICAgICAgIHBhcmVudCBjb21wb3NpdGUgdG8gY29udGFpbiB0aGUgZGlhbG9nIGFyZWEKLQkgKiBAcmV0dXJuIHRoZSBkaWFsb2cgYXJlYSBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCQkvL0dyaWREYXRhIGdEID0gKEdyaWREYXRhKSBjb21wb3NpdGUuZ2V0TGF5b3V0RGF0YSgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0KLQkJTGFiZWwgdHlwZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl7Ci0JCQl0eXBlTGFiZWwuc2V0VGV4dCgiU2VsZWN0IHRoZSBhY3Rpdml0eSB0byBtb2RpZnkgQUREIik7IC8vJE5PTi1OTFMtMSQKLQkJCUdyaWREYXRhIGdEMSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJdHlwZUxhYmVsLnNldExheW91dERhdGEoZ0QxKTsKLQotCQl9Ci0vLwkJZmlsdGVyVHlwZSA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLS8vCQl7Ci0vLwkJCUdyaWREYXRhIGdEMSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotLy8JCQlnRDEuaG9yaXpvbnRhbFNwYW4gPSAyOwotLy8JCQlnRDEud2lkdGhIaW50ID0gMzkwOwotLy8JCQlmaWx0ZXJUeXBlLnNldExheW91dERhdGEoZ0QxKTsKLS8vCQl9Ci0vLwotLy8JCWlmICh0eXBlcyA9PSBudWxsKSB7Ci0vLwkJCWZpbGxGaWx0ZXJUeXBlQ29tYm8oKTsKLS8vCQl9IGVsc2UgewotLy8JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHR5cGVzKTsKLS8vCQkJaWYgKGhlbHBlciAhPSBudWxsKSB7Ci0vLwkJCQlmaWx0ZXJUeXBlU3RyID0gZmlsdGVyVHlwZS5nZXRJdGVtKDApOwotLy8JCQkJaGVscGVyLnNldEZpbHRlclR5cGVTdHIoZmlsdGVyVHlwZS5nZXRJdGVtKDApKTsKLS8vCQkJCWlmICh0YWJTdHIgPT0gbnVsbCkgewotLy8JCQkJCXRhYlN0ciA9IGZpbHRlclR5cGVTdHI7Ci0vLwkJCQkJaGVscGVyLnNldFRhYlN0cih0YWJTdHIpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8JCWZpbHRlclR5cGUuc2VsZWN0KDApOwotCi0vLwkJTGFiZWwgY3RybF9wYXR0ZXJuTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0vLwkJewotLy8JCQljdHJsX3BhdHRlcm5MYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQpOyAvLyROT04tTkxTLTEkCi0vLwkJCWdELmhvcml6b250YWxTcGFuID0gMzsKLS8vCQkJY3RybF9wYXR0ZXJuTGFiZWwuc2V0TGF5b3V0RGF0YShnRCk7Ci0vLwkJfQotCi0vLwkJY3RybF9wYXR0ZXJuID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLS8vCQl7Ci0vLwkJCUdyaWREYXRhIGdEMSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotLy8JCQlnRDEuaG9yaXpvbnRhbFNwYW4gPSAzOwotLy8JCQljdHJsX3BhdHRlcm4uc2V0TGF5b3V0RGF0YShnRDEpOwotLy8JCQljdHJsX3BhdHRlcm4uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcigKLS8vCQkJCQluZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotLy8JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX1BhdHRlcm5fdGV4dCArICAKLS8vCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19QYXR0ZXJuX2Rlc2NyaXB0aW9uKSk7Ci0vLwkJfQotLy8JCUxhYmVsIGN0cmxfcGF0dGVybkxhYmVsMSA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLS8vCQl7Ci0vLwkJCWN0cmxfcGF0dGVybkxhYmVsMS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19QYXR0ZXJuX2Rlc2NyaXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotLy8JCQljdHJsX3BhdHRlcm5MYWJlbDEuc2V0TGF5b3V0RGF0YShnRCk7Ci0vLwkJfQotCQkKLQkJQ29tcG9zaXRlIGJ1dHRvbnNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwkJCi0JCQotCQlHcmlkRGF0YSBnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJZ2QyLmhvcml6b250YWxTcGFuID0gMjsKLQkJYnV0dG9uc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkMik7Ci0JCUdyaWRMYXlvdXQgYnV0dG9uc0xheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWJ1dHRvbnNMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWJ1dHRvbnNMYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotCQlidXR0b25zQ29tcG9zaXRlLnNldExheW91dChidXR0b25zTGF5b3V0KTsKLQkJCi0JCWV4cGFuZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0NvbXBvc2l0ZSwgU1dULkJVVFRPTjEpOwotCi0JCWV4cGFuZEJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImV4cGFuZGFsbC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZXhwYW5kQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19FeHBhbmRBbGwpOyAKLQkJCi0JCWV4cGFuZEJ1dHRvbi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfRXhwYW5kQWxsKSk7CQkKLQotCQlnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0KLQkJZXhwYW5kQnV0dG9uLnNldExheW91dERhdGEoZ2QyKTsKLQotCQljb2xsYXBzZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0NvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQljb2xsYXBzZUJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImNvbGxhcHNlYWxsLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWNvbGxhcHNlQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbCk7IAotCQljb2xsYXBzZUJ1dHRvbi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsKSk7Ci0JCQotCQlnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCi0JCWNvbGxhcHNlQnV0dG9uLnNldExheW91dERhdGEoZ2QyKTsKLQkJCi0JCWNyZWF0ZUxpbmUoY29tcG9zaXRlLCAzKTsKLQkJY3JlYXRlVmlld2VyTGFiZWwoY29tcG9zaXRlKTsKLQkJLy8gY3JlYXRlIGEgdHJlZXZpZXdlciBhcmVhLgotCQljcmVhdGVWaWV3ZXIoY29tcG9zaXRlKTsKLQotCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uKTsgCi0JCWN0cmxfYnJpZWZfZGVzYyA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5XUkFQCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQkJewotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJCWdkLmhlaWdodEhpbnQgPSA2MDsKLQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRMYXlvdXREYXRhKGdkKTsKLQkJfQotCQkvLyBSZXN0b3JlIHRoZSBsYXN0IHN0YXRlCi0JCWNyZWF0ZUxpbmUoY29tcG9zaXRlLCAzKTsKLQotCQkvLyBSZXR1cm4gcmVzdWx0cy4KLQkJYWRkTGlzdGVuZXIoKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgY3JlYXRlRGlhbG9nQXJlYS5maWx0ZXJUeXBlU3RyID0gIiArCi0JCS8vIGZpbHRlclR5cGVTdHIpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyB2aWV3ZXIgaW4gdGhlIHBhcmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmICh2aWV3ZXJTZWxlY3Rpb25TaW5nbGUpIHsKLQkJCXRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwKLQkJCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJfSBlbHNlIHsKLQkJCXRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTAotCQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl9Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJdHJlZVZpZXdlci5zZXRVc2VIYXNobG9va3VwKHRydWUpOwotCi0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQl0cmVlVmlld2VyLnNldElucHV0KGlucHV0KTsKLQkJfSBlbHNlIHsKLQkJCS8vIFBob25nOiB0aGlzIGlzIHRvbyBtZXNzeS4gSWYgeW91IHJlbGllcyBvbiB0aGUgY29udGVudEVsZW1lbnQgdG8KLQkJCS8vIGRldGVybWluZSB0aGUgaW5wdXQgZm9yIHRoZSB2aWV3ZXIKLQkJCS8vIHRoZW4geW91IHNob3VsZCBkZWNsYXJlIGEgaW5wdXQgZmllbGQgaW5zdGVhZCBhbmQgbW92ZSB0aGlzIGNvZGUKLQkJCS8vIHRvIGNvbnN0cnVjdG9yCi0JCQkvLwotCQkJLy8gc29ydGVyIG5lZWRzIG9yIG5vdC4gVE9ETwotCQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkJCQlpZiAoKChQcm9jZXNzKSBjb250ZW50RWxlbWVudCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJCWlmICh0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRSkKLQkJCQkJCQkJCXx8IHRhYlN0ci5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlJPQURNQVApIAotCQkJCQkJCQkJfHwgdGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFMpKSB7Ci0JCQkJCQkJCXRyZWVWaWV3ZXIKLQkJCQkJCQkJCQkuc2V0SW5wdXQoVW1hVXRpbAotCQkJCQkJCQkJCQkJLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGNvbnRlbnRFbGVtZW50KSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJdHJlZVZpZXdlci5zZXRJbnB1dCgoKFByb2Nlc3MpIGNvbnRlbnRFbGVtZW50KQotCQkJCQkJCQkJCS5lQ29udGFpbmVyKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZQotCQkJCQkJCXRyZWVWaWV3ZXIuc2V0SW5wdXQoY29udGVudEVsZW1lbnQpOwotCQkJCQl9IGVsc2UKLQkJCQkJCXRyZWVWaWV3ZXIuc2V0SW5wdXQoVW1hVXRpbAotCQkJCQkJCQkuZ2V0TWV0aG9kTGlicmFyeSgoRU9iamVjdCkgY29udGVudEVsZW1lbnQpKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0cmVlVmlld2VyLnNldElucHV0KFVtYVV0aWwKLQkJCQkJCQkuZ2V0TWV0aG9kTGlicmFyeSgoRU9iamVjdCkgY29udGVudEVsZW1lbnQpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXRyZWVWaWV3ZXIKLQkJCQkJCS5zZXRJbnB1dChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQkJfQotCQl9Ci0KLQkJdHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCXRyZWVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotCQlpZiAodGFiU3RyLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLkFMTF9FTEVNRU5UUykpIHsgCi0JCQl0cmVlVmlld2VyLnNldFNvcnRlcihuZXcgRmlsdGVyU29ydGVyRm9yQWxsKCkpOwotCQl9IGVsc2UgewotCQkJdHJlZVZpZXdlci5zZXRTb3J0ZXIobmV3IEZpbHRlclNvcnRlcigpKTsKLQkJfQotCi0JCS8vIHRyZWVWaWV3ZXIuZXhwYW5kVG9MZXZlbCgzKTsKLQkJLy8gdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQotCQlHcmlkRGF0YSBzcGVjID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXsKLQkJCXNwZWMud2lkdGhIaW50ID0gMzAwOwotCQkJc3BlYy5oZWlnaHRIaW50ID0gMzAwOwotCQkJc3BlYy5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKHNwZWMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUxpbmUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG5jb2wpIHsKLQkJTGFiZWwgbGluZSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTAotCQkJCXwgU1dULkJPTEQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IG5jb2w7Ci0JCWxpbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVZpZXdlckxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgIAkJaWYgKHZpZXdlckxhYmVsICE9IG51bGwpIHsKLSAgIAkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dCh2aWV3ZXJMYWJlbCk7Ci0gICAJCX0KLSAgIAl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKGJvb2xlYW4gc2luZ2xlKSB7Ci0JCXZpZXdlclNlbGVjdGlvblNpbmdsZSA9IHNpbmdsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXIjZG91YmxlQ2xpY2sob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBlbGVtZW50ID0gcy5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJZWxlbWVudCA9IExpYnJhcnlVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCB8fCBlbGVtZW50IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJc2VsZWN0ZWRMaXN0LmFkZChlbGVtZW50KTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJc2VsZWN0ZWRMaXN0LmFkZChlbGVtZW50KTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJLy8gaWYoIShlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKQotCQkJc2VsZWN0ZWRMaXN0LmFkZChlbGVtZW50KTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCS8vIGlmKCEoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkKLQkJCXNlbGVjdGVkTGlzdC5hZGQoZWxlbWVudCk7Ci0JCX0KLQkJY2xvc2UoKTsKLQkJaWYoY29tcG9zZWRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKXsKLQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdHJhdmVyc2VUcmVlKFRyZWVJdGVtW10gaXRlbXMsIExpc3QgbGlzdCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlUcmVlSXRlbVtdIGl0ZW1zeCA9IGl0ZW1zW2ldLmdldEl0ZW1zKCk7Ci0JCQlpZiAoaXRlbXN4Lmxlbmd0aCA+IDEpIHsKLQkJCQlsaXN0LmFkZChpdGVtc1tpXS5nZXREYXRhKCkpOwotCQkJCXRyYXZlcnNlVHJlZShpdGVtc3gsIGxpc3QpOwotCQkJfSBlbHNlIHsKLQkJCQlsaXN0LmFkZChpdGVtc1tpXS5nZXREYXRhKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JCi0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoYXQgdGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIGV2ZW50IG9iamVjdCBkZXNjcmliaW5nIHRoZSBjaGFuZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQl1cGRhdGVTZWxlY3Rpb24oZXZlbnQpOwotCQl1cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBidXR0b24gZW5hYmxlbWVudCBzdGF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25zKCkgewotCQkvLyBva0J1dHRvbi5zZXRFbmFibGVkKGdldFNlbGVjdGlvbigpLmxlbmd0aCA+IDApOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50T2JqZWN0KE9iamVjdCBjb250ZW50RWxlbWVudCkgewotCQlyZXR1cm4gTWV0aG9kRWxlbWVudFV0aWwuZ2V0TWV0aG9kTW9kZWwoY29udGVudEVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgc2VsZWN0aW9uIG9iamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZWxlY3Rpb24oU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIEFycmF5TGlzdCBkZXNjcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB8fAotCQkJCXNlbGVjdGVkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcil7Ci0JCQlPYmplY3QgdW53cmFwID0gIFRuZ1V0aWwudW53cmFwKHNlbGVjdGVkKTsKLQkJCXNldEJyaWVmRGVzY3JpcHRpb24odW53cmFwKTsKLQkJfWVsc2UgewotCQkJc2V0QnJpZWZEZXNjcmlwdGlvbihzZWxlY3RlZCk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogU2V0IHRoZSBicmllZiBkZXNjcmlwdGlvbiB0byBjb250cm9sCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEJyaWVmRGVzY3JpcHRpb24oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlTdHJpbmcgZGVzYyA9ICgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KGRlc2MpOwotCQkJfQotCQl9Ci0JfQotCi0JCi0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcigpIHsKLQotCQlleHBhbmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQotCQkJfQotCQl9KTsKLQkJY29sbGFwc2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdHJlZVZpZXdlci5jb2xsYXBzZUFsbCgpOwotCi0JCQl9Ci0JCX0pOwotCi0JfQotCi0JcHVibGljIEFycmF5TGlzdCBnZXRTZWxlY3RlZEl0ZW1zKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRMaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UHJvdmlkZXJGb3JUYWJzKCkgewotCi0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUZpbHRlcikgewotCQkJCWlmKGZpbHRlciBpbnN0YW5jZW9mIElDYXRlZ29yeUZpbHRlcil7Ci0JCQkJCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbnRlbnRjYXRlZ29yeS4KLQkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzQ1MgotCQkJCQloZWxwZXIuc2V0Q29udGVudENhdGVnb3J5VGFiU3RyKHRhYlN0cik7Ci0JCQkJfQotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JRmlsdGVyKSBmaWx0ZXIpCi0JCQkJCQkuc2V0SGVscGVyKGhlbHBlcik7Ci0JCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyKSB7Ci0JCQkJKChEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcikgZmlsdGVyKS5zZXRIZWxwZXIoaGVscGVyKTsKLQkJCX1lbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBFeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IpIHsKLQkJCQkoKEV4UHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcikgZmlsdGVyKS5zZXRIZWxwZXIoaGVscGVyKTsKLQkJCX0KLQkJfQotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSVByb2Nlc3NGaWx0ZXIpIHsKLQkJCWlmICh0YWJTdHIKLQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SUykpIHsKLQkJCQlhZGFwdGVyRmFjdG9yeSA9VG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcik7Ci0JCQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJfSBlbHNlIGlmICh0YWJTdHIKLQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLlJPTEVfREVTQ1JJUFRPUlMpKSB7Ci0JCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKTsgCi0JCQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCQlsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpOyAKLQkJCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0SXRlbXNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhpc3RpbmdFbGVtZW50cyhMaXN0IGxpc3QpIHsKLQkJdGhpcy5hbHJlYWR5U2VsZWN0ZWRMaXN0ID0gbGlzdDsKLQkJaWYgKGhlbHBlciAhPSBudWxsKSB7Ci0JCQloZWxwZXIuc2V0QWxyZWFkeVNlbGVjdGVkTGlzdChsaXN0KTsKLQkJfQotCX0KLQotCXB1YmxpYyBGaWx0ZXJIZWxwZXIgZ2V0SGVscGVyKCkgewotCQlyZXR1cm4gdGhpcy5oZWxwZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldEZpbHRlclR5cGVBcnJheSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBzZXRzIHRoZSBDb250ZW50UHJvdmlkZXIgdXNlZCBieSBUcmVlVmlld2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRQcm92aWRlcihJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0JCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5jb250ZW50UHJvdmlkZXIgPSBjb250ZW50UHJvdmlkZXI7Ci0JCXRoaXMuY29tcG9zZWRBZGFwdGVyRmFjdG9yeSA9IGNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoKLQkgKiBzZXQgdGhlIEZpbHRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCWlmIChoZWxwZXIgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZmlsdGVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JRmlsdGVyKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklGaWx0ZXIpIHRoaXMuZmlsdGVyKQotCQkJCQkJLnNldEhlbHBlcihoZWxwZXIpOwotCQkJfSBlbHNlIGlmICh0aGlzLmZpbHRlciBpbnN0YW5jZW9mIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyKSB7Ci0JCQkJKChEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcikgdGhpcy5maWx0ZXIpLnNldEhlbHBlcihoZWxwZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQl0aGlzLmlucHV0ID0gaW5wdXQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXJMYWJlbChTdHJpbmcgdmlld2VyTGFiZWwpIHsKLQkJdGhpcy52aWV3ZXJMYWJlbCA9IHZpZXdlckxhYmVsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQXR0YWNobWVudERpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0F0dGFjaG1lbnREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM1MDcwYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQXR0YWNobWVudERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogT3BlbnMgZGlhbG9nIHRvIGF0dGFjaCBhdHRhY2htZW50cwotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEF0dGFjaG1lbnREaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JLyoqCi0JICogVGhlIE9LIGJ1dHRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCi0JLyoqCi0JICogVGhlIENhbmNlbCBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjYW5jZWxCdXR0b247Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0KLQlwcml2YXRlIFRleHQgYXR0YWNobWVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIEF0dGFjaG1lbnREaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBkaWFsb2dBcmVhLmdldExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gKEdyaWREYXRhKSBkaWFsb2dBcmVhLmdldExheW91dERhdGEoKTsKLQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSAxMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCi0JCUxhYmVsIHVybExhYmVsID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJdXJsTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5BdHRhY2htZW50RGlhbG9nRmlsZVVSTF90ZXh0KTsgCi0JCWF0dGFjaG1lbnQgPSBuZXcgVGV4dChkaWFsb2dBcmVhLCBTV1QuQk9SREVSKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotCQlhdHRhY2htZW50LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlhdHRhY2htZW50LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChva0J1dHRvbiAhPSBudWxsKSB7Ci0JCQkJCW9rQnV0dG9uCi0JCQkJCQkJLnNldEVuYWJsZWQoYXR0YWNobWVudC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlCdXR0b24gYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5CUk9XU0VfQlVUVE9OX1RFWFQpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULk9QRU4pOwotCQkJCVN0cmluZyBpbWFnZUZpbGUgPSBkaWFsb2cub3BlbigpOwotCQkJCWlmIChpbWFnZUZpbGUgIT0gbnVsbCAmJiBpbWFnZUZpbGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGltYWdlRmlsZSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgdXJsID0gZmlsZS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQkJCQlhdHRhY2htZW50LnNldFRleHQodXJsKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJc3VwZXIKLQkJCQkuZ2V0U2hlbGwoKQotCQkJCS5zZXRUZXh0KAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXR0YWNobWVudERpYWxvZ2F0dGFjaEZpbGVfdGV4dCk7IAotCi0JCXJldHVybiBkaWFsb2dBcmVhOwotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGlhbG9nIGJ1dHRvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgT0sgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCi0JCS8vIENyZWF0ZSB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgT0sgYnV0dG9uLgotCQlva0J1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY2FuY2VsQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKTsKLQotCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJLy8gU3RyaW5nIHVybCA9IGF0dGFjaG1lbnQuZ2V0VGV4dCgpOwotCQkvLyBpZiAodXJsICE9IG51bGwgJiYgdXJsLmxlbmd0aCgpID4gMCkgewotCQkvLwkJCQotCQkvLyB9Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEZpbGUgTmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0YWNobWVudFBhdGgoKSB7Ci0JCXJldHVybiBhdHRhY2htZW50LmdldFRleHQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ2hhbmdlSGlzdG9yeURpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NoYW5nZUhpc3RvcnlEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJhNDMwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ2hhbmdlSGlzdG9yeURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKioKLSAqIERpYWxvZyB0byBzaG93IGNoYW5nZSBoaXN0b3J5IG9mIGFuIGVsZW1lbnQKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENoYW5nZUhpc3RvcnlEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JLyoqCi0JICogVGhlIE9LIGJ1dHRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCi0JLyoqCi0JICogVGhlIENhbmNlbCBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjYW5jZWxCdXR0b247Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQotCXByaXZhdGUgVGFibGUgdGFibGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIENoYW5nZUhpc3RvcnlEaWFsb2coU2hlbGwgcGFyZW50LCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgZGlhbG9nQXJlYS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlHcmlkRGF0YSBnZCA9IChHcmlkRGF0YSkgZGlhbG9nQXJlYS5nZXRMYXlvdXREYXRhKCk7Ci0JCWdkLnZlcnRpY2FsSW5kZW50ID0gMTA7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNoYW5nZUhpc3RvcnlEaWFsb2dfbGFiZWwpOyAKLQotCQl0YWJsZSA9IG5ldyBUYWJsZShkaWFsb2dBcmVhLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSAzMDA7Ci0JCQl0YWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotCQl9Ci0KLQkJaW5pdENoYW5nZUhpc3RvcnlUYWJsZSgpOwotCQlzdXBlci5nZXRTaGVsbCgpLnNldFRleHQoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ2hhbmdlSGlzdG9yeURpYWxvZ190aXRsZSk7IAotCi0JCXJldHVybiBkaWFsb2dBcmVhOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRDaGFuZ2VIaXN0b3J5VGFibGUoKSB7Ci0JCVN0cmluZyBjaGFuZ2VEZXNjID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9ICgoQ29udGVudEVsZW1lbnQpIGVsZW1lbnQpCi0JCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCWNoYW5nZURlc2MgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJY2hhbmdlRGVzYyA9ICgoTWV0aG9kUGx1Z2luKSBlbGVtZW50KS5nZXRDaGFuZ2VEZXNjcmlwdGlvbigpOwotCQl9Ci0KLQkJaWYgKGNoYW5nZURlc2MgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoCi0JCQkJCWNoYW5nZURlc2MsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNoYW5nZUhpc3RvcnlEaWFsb2dfZGVsaW1pdGVyKTsgCi0JCQlMaXN0IHN0ckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCXdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJc3RyTGlzdC5hZGQodG9rLm5leHRUb2tlbigpKTsKLQkJCX0KLQotCQkJZm9yIChpbnQgaSA9IHN0ckxpc3Quc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJCQlpdGVtLnNldFRleHQoKFN0cmluZykgc3RyTGlzdC5nZXQoaSkpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkaWFsb2cgYnV0dG9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBPSyBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0JCQkJdHJ1ZSk7Ci0KLQkJLy8gU2V0IGhlbHAgY29udGV4dCBmb3IgdGhlIE9LIGJ1dHRvbi4KLQkJb2tCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIE9LIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0KLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NWYyZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NvbmZpZ3VyYXRpb25BZGRWaWV3c0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBPcGVuIGFuIGRpYWxvZyB0byBhZGQgdmlld3MgaW50byBjb25maWd1cmF0aW9uCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nIGV4dGVuZHMgSXRlbXNGaWx0ZXJEaWFsb2cgewotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25BZGRWaWV3c0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUgPSBudWxsOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQkJcHJlc2VudGF0aW9uTmFtZSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQl9Ci0JCQkJaWYgKHByZXNlbnRhdGlvbk5hbWUgPT0gbnVsbCB8fCAiIi5lcXVhbHMocHJlc2VudGF0aW9uTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcmVzZW50YXRpb25OYW1lID0gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCQkJCX0KLQkJCQlyZXR1cm4gcHJlc2VudGF0aW9uTmFtZTsKLQkJCX0KLQkJfTsKLQkJaGVscGVyLnNldFNob3dQcmVzZW50YXRpb25OYW1lKHRydWUpOwotCQlyZXR1cm4gc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Db25maWd1cmF0aW9uT3JkZXJEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Db25maWd1cmF0aW9uT3JkZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA4MTlmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29uZmlndXJhdGlvbk9yZGVyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Nb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotCi0vKioKLSAqIE9wZW4gYSBkaWFsb2cgdG8gb3JkZXIgY29uZmlndXJhdGlvbiB2aWV3cwotICogQGF1dGhvciBYaWFuZyBEb25nIEh1Ci0gKiBAc2luY2UgMS4yCi0gKiAgZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTczODI3Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uT3JkZXJEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgYmFzZUNvbXBvc2l0ZTsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfdXAsIGN0cmxfZG93bjsKLQotCXByaXZhdGUgVGFibGUgY3RybF92aWV3czsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdmlld3NUYWJsZVZpZXdlcjsKLQotLy8JcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBhbGxTdGVwczsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgdmlld3NWaWV3ZXJDb250ZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIHZpZXdzVmlld2VyTGFiZWxQcm92aWRlcjsKLQkKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyOwotCQotCXByaXZhdGUgQXJyYXlMaXN0IGNvbW1hbmRzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXB1YmxpYyBDb25maWd1cmF0aW9uT3JkZXJEaWFsb2coU2hlbGwgcGFyZW50LCAKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl0aGlzLmFjdGlvbk1hbmFnZXIgPSBhY3Rpb25NYW5hZ2VyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIERpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWJhc2VDb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWZpbmFsIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDQ7Ci0JCWJhc2VDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQliYXNlQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCS8vIEVtcHR5IGxpbmUKLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgIiAiLCA0KTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3JlYXRlTGFiZWwoCi0JCQkJYmFzZUNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uT3JkZXJEaWFsb2dfTmF2aWdhdGlvblZpZXdzLCAzKTsKLQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCAiICIsIDEpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfdmlld3MgPSBuZXcgVGFibGUoYmFzZUNvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNDAwOwotCQkJY3RybF92aWV3cy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWluaXRQcm92aWRlcnMoKTsKLQotCQl2aWV3c1RhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdmlld3MpOwotCQl2aWV3c1RhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcih2aWV3c1ZpZXdlckNvbnRlbnRQcm92aWRlcik7Ci0JCXZpZXdzVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcih2aWV3c1ZpZXdlckxhYmVsUHJvdmlkZXIpOwotCi0JCUNvbXBvc2l0ZSBvcmRlckJ1dHRvblBhbmUgPSBuZXcgQ29tcG9zaXRlKGJhc2VDb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJb3JkZXJCdXR0b25QYW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJb3JkZXJCdXR0b25QYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJfQotCi0JCWN0cmxfdXAgPSBjcmVhdGVCdXR0b24ob3JkZXJCdXR0b25QYW5lLCBBdXRob3JpbmdVSVRleHQuVVBfQlVUVE9OX1RFWFQpOwotCQljdHJsX3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWN0cmxfZG93biA9IGNyZWF0ZUJ1dHRvbihvcmRlckJ1dHRvblBhbmUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRPV05fQlVUVE9OX1RFWFQpOwotCQljdHJsX2Rvd24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkvLyBFbXB0eSBsaW5lCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgNCk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMaW5lKGJhc2VDb21wb3NpdGUsIDQpOwotCi0JCXN1cGVyCi0JCQkJLmdldFNoZWxsKCkKLQkJCQkuc2V0VGV4dCgKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25PcmRlckRpYWxvZ19kZXNjcmlwdGlvbik7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0JCWxvYWREYXRhKCk7Ci0KLQkJcmV0dXJuIGJhc2VDb21wb3NpdGU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVMaW5lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBuY29sKSB7Ci0JCUxhYmVsIGxpbmUgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwKLQkJCQl8IFNXVC5CT0xEKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBuY29sOwotCQlsaW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQkKLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgbkNvbCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbkNvbDsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRQcm92aWRlcnMoKSB7Ci0JCXZpZXdzVmlld2VyQ29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdmlld3NWaWV3ZXJMYWJlbFByb3ZpZGVyID0gbmV3IFZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuICFjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCkuY29udGFpbnMoZWxlbWVudCk7Ci0JCQl9Ci0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQl2aWV3c1RhYmxlVmlld2VyCi0JCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3c1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCWlmICh2aWV3c1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJCQkmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCQkJCWlmICh2aWV3c1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHZpZXdzVGFibGVWaWV3ZXIKLQkJCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCQkmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9IGVsc2UKLQkJCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSk7Ci0JCQotCQljdHJsX3VwLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld3NUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCi0JCQkJQXJyYXlMaXN0IG1vdmVVcEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vdmVVcEl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpOwotCQkJCU1vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZCgKLQkJCQkJCWNvbmZpZywgbW92ZVVwSXRlbXMsIGZlYXR1cmUsMSk7Ci0JCQkJYWN0aW9uTWFuYWdlci5leGVjdXRlKGNtZCk7Ci0JCQkJY29tbWFuZHMuYWRkKGNtZCk7Ci0KLQkJCQl2aWV3c1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQotCQkJCWlmICh2aWV3c1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDApIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWlmICh2aWV3c1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHZpZXdzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMSkgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9KTsKLQkJCi0JCWN0cmxfZG93bi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlBcnJheUxpc3QgbW92ZURvd25JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlRG93bkl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpOwotCQkJCU1vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZCgKLQkJCQkJCWNvbmZpZywgbW92ZURvd25JdGVtcywgZmVhdHVyZSwwKTsKLQkJCQlhY3Rpb25NYW5hZ2VyLmV4ZWN1dGUoY21kKTsKLQkJCQljb21tYW5kcy5hZGQoY21kKTsKLQotCQkJCXZpZXdzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKHZpZXdzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMCkgewotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJaWYgKHZpZXdzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgdmlld3NUYWJsZVZpZXdlcgotCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxKSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkIGluaXRpYWwgZGF0YSBmcm9tIG1vZGVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWREYXRhKCkgewotCQl2aWV3c1RhYmxlVmlld2VyLnNldElucHV0KGNvbmZpZyk7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotLy8JCWFsbFN0ZXBzLmFwcGx5KCk7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNhbmNlbFByZXNzZWQoKSB7Ci0JCWlmICghY29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gY29tbWFuZHMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlPYmplY3QgY21kID0gY29tbWFuZHMuZ2V0KGkpOwotCQkJCWlmIChjbWQgaW5zdGFuY2VvZiBNb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZCkgewotCQkJCQkoKE1vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kKSBjbWQpLnVuZG8oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuY2FuY2VsUHJlc3NlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I2MzM0YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1vdmVJbkNhdGVnb3J5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ2F0ZWdvcnlTb3J0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db250ZW50RWxlbWVudE9yZGVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLQotLyoqCi0gKiBPcGVuIGFuIGRpYWxvZyB0byBvcmRlciBjb250ZW50IGVsZW1lbnRzCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RWxlbWVudHNPcmRlckRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBiYXNlQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF91cCwgY3RybF9kb3duOwotCi0JcHJpdmF0ZSBUYWJsZSBjdHJsX3N0ZXBzOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBzdGVwc1RhYmxlVmlld2VyOwotCi0JLy8gcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBhbGxTdGVwczsKLQlwcml2YXRlIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGFsbFN0ZXBzOwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBzdGVwc1ZpZXdlckNvbnRlbnRQcm92aWRlcjsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgc3RlcHNWaWV3ZXJMYWJlbFByb3ZpZGVyOwotCi0JLy8gcHJpdmF0ZSBUYXNrIGNvbnRlbnRFbGVtZW50OwotCXByaXZhdGUgQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQ7Ci0KLQkvLyB0aGUgRWxlbWVudCB0byB1c2UgZm9yIHNvcnRpbmcKLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgc29ydEVsZW1lbnQ7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1hbmFnZXI7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBjb21tYW5kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBDb21ib1ZpZXdlciB2aWV3ZXJfc29ydDsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXJTb3J0ID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQlMaXN0PFN0cmluZz4gc29ydFR5cGVzTGlzdCA9IENhdGVnb3J5U29ydEhlbHBlcgotCQkJCQkuZ2V0Q2F0ZWdvcnlTb3J0VHlwZXMoKTsKLQkJCXJldHVybiBzb3J0VHlwZXNMaXN0LnRvQXJyYXkoKTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlclNvcnQgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJU3RyaW5nIHN0ciA9ICgoU3RyaW5nKSBvYmplY3QpOwotCQkJCXJldHVybiBDYXRlZ29yeVNvcnRIZWxwZXIuZ2V0U29ydFR5cGVEaXNwbGF5TmFtZShzdHIpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSA8Y29kZT5BZHZhbmNlZFNlYXJjaERpYWxvZzwvY29kZT4gZ2l2ZWIgdGhlIHBhcmVudCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2coU2hlbGwgcGFyZW50LAotCQkJQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQsIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1hbmFnZXIpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCQlpZiAoVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKGNvbnRlbnRFbGVtZW50KSkgewotCQkJdGhpcy5zb3J0RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuc29ydEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQkJfQotCQl0aGlzLmFjdGlvbk1hbmFnZXIgPSBhY3Rpb25NYW5hZ2VyOwotCQl0aGlzLmFsbFN0ZXBzID0gbnVsbDsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJYmFzZUNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJZmluYWwgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gNDsKLQkJYmFzZUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCWJhc2VDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0KLQkJLy8gRW1wdHkgbGluZQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCAiICIsIDQpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgIiAiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMYWJlbCgKLQkJCQliYXNlQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX0NvbnRlbnRFbGVtZW50X3RleHQsCi0JCQkJMyk7IAotCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9zdGVwcyA9IG5ldyBUYWJsZShiYXNlQ29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA0MDA7Ci0JCQljdHJsX3N0ZXBzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJaW5pdFByb3ZpZGVycygpOwotCi0JCXN0ZXBzVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9zdGVwcyk7Ci0JCXN0ZXBzVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHN0ZXBzVmlld2VyQ29udGVudFByb3ZpZGVyKTsKLQkJc3RlcHNUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHN0ZXBzVmlld2VyTGFiZWxQcm92aWRlcik7Ci0KLQkJQ29tcG9zaXRlIG9yZGVyQnV0dG9uUGFuZSA9IG5ldyBDb21wb3NpdGUoYmFzZUNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlvcmRlckJ1dHRvblBhbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQlvcmRlckJ1dHRvblBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQl9Ci0KLQkJY3RybF91cCA9IGNyZWF0ZUJ1dHRvbihvcmRlckJ1dHRvblBhbmUsIEF1dGhvcmluZ1VJVGV4dC5VUF9CVVRUT05fVEVYVCk7Ci0JCWN0cmxfdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3RybF9kb3duID0gY3JlYXRlQnV0dG9uKG9yZGVyQnV0dG9uUGFuZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuRE9XTl9CVVRUT05fVEVYVCk7Ci0JCWN0cmxfZG93bi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJY3JlYXRlTGFiZWwob3JkZXJCdXR0b25QYW5lLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5Tb3J0VHlwZV9MYWJlbCwgMSk7Ci0JCUNvbWJvIGN0cmxfc29ydCA9IG5ldyBDb21ibyhvcmRlckJ1dHRvblBhbmUsIFNXVC5TSU5HTEUgfCBTV1QuRkxBVAotCQkJCXwgU1dULlJFQURfT05MWSk7Ci0JCXZpZXdlcl9zb3J0ID0gbmV3IENvbWJvVmlld2VyKGN0cmxfc29ydCk7Ci0JCXZpZXdlcl9zb3J0LnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTb3J0KTsKLQkJdmlld2VyX3NvcnQuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyU29ydCk7Ci0JCXZpZXdlcl9zb3J0LnNldElucHV0KGNvbnRlbnRFbGVtZW50KTsKLQkJLy8gc2V0IGluaXRpYWwgc2VsZWN0aW9uCi0JCVN0cmluZyBzb3J0VHlwZSA9IENhdGVnb3J5U29ydEhlbHBlci5nZXRDYXRlZ29yeVNvcnRWYWx1ZShzb3J0RWxlbWVudCk7Ci0JCXZpZXdlcl9zb3J0LnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzb3J0VHlwZSksIHRydWUpOwotCQllbmFibGVCdXR0b25zKCk7Ci0KLQkJLy8gRW1wdHkgbGluZQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCAiICIsIDQpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGluZShiYXNlQ29tcG9zaXRlLCA0KTsKLQotCQlzdXBlcgotCQkJCS5nZXRTaGVsbCgpCi0JCQkJLnNldFRleHQoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbl90ZXh0KTsgCi0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0JCWxvYWREYXRhKCk7Ci0KLQkJLy8gY29udHJpYnV0b3JzIGNhbm5vdCBjaGFuZ2UgdGhlIHNvcnQgdHlwZSAtIHRoZSBiYXNlIGVsZW1lbnQncyBzb3J0IGlzCi0JCS8vIHVzZWQKLQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpIHx8IFRuZ1V0aWwuaXNDb250cmlidXRvcihjb250ZW50RWxlbWVudCkpIHsKLQkJCXZpZXdlcl9zb3J0LmdldENvbWJvKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQl2aWV3ZXJfc29ydC5nZXRDb21ibygpLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0KLQotCQlyZXR1cm4gYmFzZUNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTGluZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbmNvbCkgewotCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMCi0JCQkJfCBTV1QuQk9MRCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbmNvbDsKLQkJbGluZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0KLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgbkNvbCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbkNvbDsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkaWFsb2cgYnV0dG9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBPSyBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0JCQkJdHJ1ZSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBDYW5jZWwgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UHJvdmlkZXJzKCkgewotCQlzdGVwc1ZpZXdlckNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCi0JCQkJLy8gaWYgKGFsbFN0ZXBzID09IG51bGwpIHsKLQkJCQkvLyBhbGxTdGVwcyA9IG5ldyBDb250ZW50RWxlbWVudE9yZGVyTGlzdCgKLQkJCQkvLyBjb250ZW50RWxlbWVudCwKLQkJCQkvLyBDb250ZW50RWxlbWVudE9yZGVyTGlzdC5DT05URU5UX0VMRU1FTlRTX19GT1JfRUxFTUVOVF9BTkRfUEFSRU5UUyk7Ci0JCQkJLy8gfQotCQkJCS8vIExpc3QgcmV0dXJuTGlzdCA9Ci0JCQkJLy8gQ2F0ZWdvcnlTb3J0SGVscGVyLnNvcnRDYXRlZ29yeUVsZW1lbnRzKHNvcnRFbGVtZW50LAotCQkJCS8vIGFsbFN0ZXBzLnRvQXJyYXkoKSk7Ci0JCQkJLy8gcmV0dXJuIHJldHVybkxpc3QudG9BcnJheSgpOwotCi0JCQkJaWYgKGFsbFN0ZXBzID09IG51bGwpIHsKLQkJCQkJYWxsU3RlcHMgPSBuZXcgQ29udGVudEVsZW1lbnRPcmRlckxpc3QoCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJQ29udGVudEVsZW1lbnRPcmRlckxpc3QuQ09OVEVOVF9FTEVNRU5UU19fRk9SX0VMRU1FTlRfQU5EX1BBUkVOVFMsCi0JCQkJCQkJZmVhdHVyZSk7Ci0JCQkJfQotCQkJCUxpc3QgcmV0dXJuTGlzdCA9IENhdGVnb3J5U29ydEhlbHBlci5zb3J0Q2F0ZWdvcnlFbGVtZW50cygKLQkJCQkJCXNvcnRFbGVtZW50LCBhbGxTdGVwcy50b0FycmF5KCkpOwotCQkJCXJldHVybiByZXR1cm5MaXN0LnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQlzdGVwc1ZpZXdlckxhYmVsUHJvdmlkZXIgPSBuZXcgVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gISgoTGlzdCkgKChDb250ZW50Q2F0ZWdvcnkpIGNvbnRlbnRFbGVtZW50KQotCQkJCQkJLmVHZXQoZmVhdHVyZSkpLmNvbnRhaW5zKGVsZW1lbnQpOwotCQkJfQotCi0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCi0JCXN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQllbmFibGVCdXR0b25zKCk7Ci0JCQkJCX0KLQotCQkJCX0pOwotCi0JCWN0cmxfdXAuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCQlBcnJheUxpc3QgbW92ZVVwSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbW92ZVVwSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKTsKLQkJCQlNb3ZlSW5DYXRlZ29yeUNvbW1hbmQgY21kID0gbmV3IE1vdmVJbkNhdGVnb3J5Q29tbWFuZCgKLQkJCQkJCShDb250ZW50Q2F0ZWdvcnkpIGNvbnRlbnRFbGVtZW50LCBtb3ZlVXBJdGVtcywKLQkJCQkJCWFsbFN0ZXBzLCBmZWF0dXJlLAotCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgsIDEpOwotCi0JCQkJYWN0aW9uTWFuYWdlci5leGVjdXRlKGNtZCk7Ci0JCQkJY29tbWFuZHMuYWRkKGNtZCk7Ci0KLQkJCQlyZWZyZXNoVmlld2VycygpOwotCi0JCQkJZW5hYmxlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX2Rvd24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJQXJyYXlMaXN0IG1vdmVEb3duSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbW92ZURvd25JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCQkJCU1vdmVJbkNhdGVnb3J5Q29tbWFuZCBjbWQgPSBuZXcgTW92ZUluQ2F0ZWdvcnlDb21tYW5kKAotCQkJCQkJKENvbnRlbnRDYXRlZ29yeSkgY29udGVudEVsZW1lbnQsIG1vdmVEb3duSXRlbXMsCi0JCQkJCQlhbGxTdGVwcywgZmVhdHVyZSwKLQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoLCAwKTsKLQkJCQlhY3Rpb25NYW5hZ2VyLmV4ZWN1dGUoY21kKTsKLQkJCQljb21tYW5kcy5hZGQoY21kKTsKLQotCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0KLQkJCQllbmFibGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXZpZXdlcl9zb3J0Ci0JCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NvcnQKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJU3RyaW5nIHNvcnRUeXBlID0gKFN0cmluZykgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSBDYXRlZ29yeVNvcnRIZWxwZXIKLQkJCQkJCQkJLmdldENhdGVnb3J5U29ydFByb3BlcnR5KGNvbnRlbnRFbGVtZW50KTsKLQotCQkJCQkJaWYgKHByb3AgPT0gbnVsbCkgewotCQkJCQkJCXByb3AgPSBDYXRlZ29yeVNvcnRIZWxwZXIKLQkJCQkJCQkJCS5jcmVhdGVOZXdTb3J0UHJvcGVydHkoc29ydFR5cGUpOwotCQkJCQkJCWFjdGlvbk1hbmFnZXIKLQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKSwKLQkJCQkJCQkJCQkJcHJvcCwgLTEpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlhY3Rpb25NYW5hZ2VyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgcHJvcCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHlfVmFsdWUoKSwKLQkJCQkJCQkJCXNvcnRUeXBlLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZWZyZXNoVmlld2VycygpOwotCQkJCQkJZW5hYmxlQnV0dG9ucygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmcmVzaFZpZXdlcnMoKSB7Ci0JCXN0ZXBzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIExvYWQgaW5pdGlhbCBkYXRhIGZyb20gbW9kZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERhdGEoKSB7Ci0JCXN0ZXBzVGFibGVWaWV3ZXIuc2V0SW5wdXQoY29udGVudEVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlhbGxTdGVwcy5hcHBseSgpOwotCi0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNhbmNlbFByZXNzZWQoKSB7Ci0JCWlmICghY29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gY29tbWFuZHMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlPYmplY3QgY21kID0gY29tbWFuZHMuZ2V0KGkpOwotCQkJCWlmIChjbWQgaW5zdGFuY2VvZiBNb3ZlSW5DYXRlZ29yeUNvbW1hbmQpIHsKLQkJCQkJKChNb3ZlSW5DYXRlZ29yeUNvbW1hbmQpIGNtZCkudW5kbygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5jYW5jZWxQcmVzc2VkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCX0KLQotCXByaXZhdGUgdm9pZCBlbmFibGVCdXR0b25zKCkgewotCQlpZiAoaXNTaG91bGRFbmFibGVVcCgpKSB7Ci0JCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZQotCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlpZiAoaXNTaG91bGRFbmFibGVEb3duKCkpIHsKLQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQl9IGVsc2UKLQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaG91bGRFbmFibGVVcCgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzdGVwc1RhYmxlVmlld2VyCi0JCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEgJiYKLQkJCQlzdGVwc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAgJiYKLQkJCQkhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkgJiYgCi0JCQkJQ2F0ZWdvcnlTb3J0SGVscGVyLmlzTWFudWFsQ2F0ZWdvcnlTb3J0KHNvcnRFbGVtZW50KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaG91bGRFbmFibGVEb3duKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSAmJgotCQkJCShzdGVwc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxKSAmJgotCQkJCSFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSAmJgotCQkJCUNhdGVnb3J5U29ydEhlbHBlci5pc01hbnVhbENhdGVnb3J5U29ydChzb3J0RWxlbWVudCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NvbnRyaWJ1dGlvblNlbGVjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NvbnRyaWJ1dGlvblNlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmRmYjc5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Db250cmlidXRpb25TZWxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkFsbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkNvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5Qcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVGhlIGRpYWxvZyBmb3Igc2VsZWN0aW5nIGVsZW1lbnQgdG8gZGV0ZXRtaW5lIHdoaWNoIGVsZW1lbnQgZWRpdG9yIHRvIG9wZW4gaW4KLSAqIGNhc2Ugb2YgdmFyaWFiaWxpdHkgcmVsYXRpb25zaGlwLiBUaGlzIHdpbGwgb25seSB0YWtlIGVmZmVjdCBpZiB1c2VyCi0gKiBkb3VibGUtY2xpY2tzIGZyb20gY29uZmlndXJhdGlvbiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJpYnV0aW9uU2VsZWN0aW9uIHsKLQotCXByaXZhdGUgSGFzaFNldCBmaWx0ZXJFbGVtZW50TGlzdCA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwcml2YXRlIGNsYXNzIENvbnRyaWJ1dGlvbkZpbHRlciBleHRlbmRzIEFsbEZpbHRlciB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlPYmplY3QgY29udGVudEVsZW1lbnQgPSBoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQkJCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iai5lcXVhbHMoaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCkpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpICE9IG51bGwpIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucygKLQkJCQkJCQkoKFByb2Nlc3NDb21wb25lbnQpIG9iaikuZ2V0UHJvY2VzcygpKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucyhvYmopKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBvYmopKSB7Ci0JCQkJCWlmICgoKEN1c3RvbUNhdGVnb3J5KSBvYmopLmdldENhdGVnb3JpemVkRWxlbWVudHMoKQotCQkJCQkJCS5pc0VtcHR5KCkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbikgcmV0dXJuIGZhbHNlOwotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJaWYgKE1ldGhvZEVsZW1lbnRVdGlsLmdldEFsbE1vZGVscyhjb250ZW50RWxlbWVudCkKLQkJCQkJCQkJLmNvbnRhaW5zKG9iaikpCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlDb2xsZWN0aW9uIGxpc3QgPSAoKFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJZm9yIChJdGVyYXRvciBpb3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGlvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmplY3QgPSBpb3IubmV4dCgpOwotCQkJCQlpZiAoKChDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqZWN0KQotCQkJCQkJCS5nZXRDaGlsZHJlbihvYmplY3QpLmlzRW1wdHkoKSkKLQkJCQkJCWlvci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKGNoaWxkQWNjZXB0KG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlyZXR1cm4gYW55Q2F0ZWdvcml6ZWRFbGVtZW50QWNjZXB0ZWQoKEN1c3RvbUNhdGVnb3J5KSBvYmosCi0JCQkJCQlmaWx0ZXJFbGVtZW50TGlzdCk7Ci0JCQl9Ci0JCQlpZiAoKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KQotCQkJCQkmJiBmaWx0ZXJFbGVtZW50TGlzdC5jb250YWlucyhvYmopKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBQcm9jZXNzKXsgCi0JCQkJaWYoZmlsdGVyRWxlbWVudExpc3QuY29udGFpbnMob2JqKSl7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJcmV0dXJuIGNoZWNrUHJvY2Vzc1BrZyhvYmopOwotCQkJfQotCQkJaWYob2JqIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCXJldHVybiBjaGVja1Byb2Nlc3NFbGVtZW50cyhvYmopOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBjaGVja1Byb2Nlc3NQa2coT2JqZWN0IG9iail7Ci0JCQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKXsKLQkJCWlmKGZpbHRlckVsZW1lbnRMaXN0LmNvbnRhaW5zKG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KXsKLQkJCQlpZihmaWx0ZXJFbGVtZW50TGlzdC5jb250YWlucygoKFByb2Nlc3NDb21wb25lbnQpb2JqKS5nZXRQcm9jZXNzKCkpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlsaXN0ID0gKChQcm9jZXNzQ29tcG9uZW50KW9iaikuZ2V0UHJvY2VzcygpLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCQl9ZWxzZXsKLQkJCQlsaXN0ID0gKChQcm9jZXNzUGFja2FnZSlvYmopLmdldENoaWxkUGFja2FnZXMoKTsKLQkJCX0KLQkJCQotCQl9Ci0JCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLQkJewotCQkJT2JqZWN0IGNoaWxkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KXsKLQkJCQlpZihjaGVja1Byb2Nlc3NQa2coY2hpbGQpKSByZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCl7Ci0JCQkJaWYoZmlsdGVyRWxlbWVudExpc3QuY29udGFpbnMoY2hpbGQpKSByZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrIGFueSBwcm9jZXNzIGVsZW1lbnRzCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4KLQkgKiAJCQlCb29sZWFuIHZhbHVlIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNoZWNrUHJvY2Vzc0VsZW1lbnRzKE9iamVjdCBvYmopewotCQlMaXN0IGxpc3QgPSAoKFByb2Nlc3Mpb2JqKS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0JCXsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCl7Ci0JCQkJaWYoZmlsdGVyRWxlbWVudExpc3QuY29udGFpbnMoKChCcmVha2Rvd25FbGVtZW50KWNoaWxkKSkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYW55IGNhdGVnb3JpemVkIGVsZW1lbnRzIHRvIGJlIGFjY2VwdGVkLgotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gbGlzdAotCSAqIEByZXR1cm4KLQkgKiAJCUJvb2xlYW4gdmFsdWUgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgYW55IGNhdGVnb3JpZXplZCBlbGVtZW50cyB0byBiZSBhY2NlcHRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGFueUNhdGVnb3JpemVkRWxlbWVudEFjY2VwdGVkKEN1c3RvbUNhdGVnb3J5IG9iaiwKLQkJCUhhc2hTZXQgbGlzdCkgewotCQlpZiAobGlzdC5jb250YWlucyhvYmopKQotCQkJcmV0dXJuIHRydWU7Ci0JCUxpc3QgZWxlbWVudHMgPSBvYmouZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCWlmIChsaXN0LmNvbnRhaW5zKG9iamVjdCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWFueUNhdGVnb3JpemVkRWxlbWVudEFjY2VwdGVkKChDdXN0b21DYXRlZ29yeSkgb2JqZWN0LCBsaXN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvKioKLQkgKiBEaXNwbGF5IGNvbnRyaWJ1dGlvbiBzZWxlY3Rpb24gZGlhbG9nIHdoaWNoIGxpc3RzIGVsZW1lbnRzIGFuZCBpdCdzCi0JICogY29udHJpYnV0b3JzLgotCSAqLwotCXB1YmxpYyBDb250cmlidXRpb25TZWxlY3Rpb24oKSB7Ci0JfQotCi0JLyoqCi0JICogSXQgc2hvd3MgZGlhbG9nIGJveCBmb3IgYWxsIHRoZSBjb250cmlidXRvcnMuIFVzZXIgaXMgZXhwZWN0ZWQgdG8gc2VsZWN0Ci0JICogb25lLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogCQkJRWxlbWVudCBmb3Igd2hpY2ggY29udHJpYnV0b3IgYXJlIHNob3duCi0JICogQHJldHVybgotCSAqIAkJCVNlbGVjdGVkIGNvbnRyaWJ1dG9yCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTZWxlY3RlZENvbnRyaWJ1dG9yKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50KSB7Ci0JCWZpbHRlckVsZW1lbnRMaXN0ID0gbmV3IEhhc2hTZXQoKTsKLQkJLy8gR2V0IHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JCS8vIGdldCBsaXN0IG9mIGNvbnRyaWJ1dG9ycwotCQlMaXN0IGNvbnRyaWJ1dG9ycyA9IENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkuZ2V0Q29udHJpYnV0b3JzKGVsZW1lbnQsIGNvbmZpZyk7Ci0JCWlmICgoY29udHJpYnV0b3JzICE9IG51bGwpICYmICghY29udHJpYnV0b3JzLmlzRW1wdHkoKSkpIHsKLQkJCS8vIGNsZWFyIHRoZSBhcnJheQotCQkJTGlzdCBlbGVtZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJLy8gYWRkIGVsZW1lbnQgYW5kIGl0J3MgY29udHJpYnV0b3JzCi0JCQllbGVtZW50TGlzdC5hZGQoZWxlbWVudCk7Ci0JCQllbGVtZW50TGlzdC5hZGRBbGwoY29udHJpYnV0b3JzKTsKLQkJCWZpbHRlckVsZW1lbnRMaXN0LmFkZEFsbChlbGVtZW50TGlzdCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBlbGVtZW50TGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZSA9IGl0b3IubmV4dCgpOwotCQkJCUxpc3QgZ3JvdXBpbmdzID0gbnVsbDsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCQkJZ3JvdXBpbmdzID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0RGlzY2lwbGluZUdyb3VwcygoRGlzY2lwbGluZSkgZSk7Ci0KLQkJCQl9Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQkJCWdyb3VwaW5ncyA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldFJvbGVTZXRHcm91cHMoKFJvbGVTZXQpIGUpOwotCQkJCX0KLQotCQkJCWlmICgoZ3JvdXBpbmdzICE9IG51bGwpICYmICghZ3JvdXBpbmdzLmlzRW1wdHkoKSkpCi0JCQkJCWZpbHRlckVsZW1lbnRMaXN0LmFkZEFsbChncm91cGluZ3MpOwotCi0JCQl9Ci0KLQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IENvbnRyaWJ1dGlvbkZpbHRlcigpOwotCQkJLy8gSXRlbXNGaWx0ZXJEaWFsb2cgZGxnID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCS8vIC5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJLy8gZmlsdGVyLCBudWxsLCBGaWx0ZXJDb25zdGFudHMuQ09ORklHX0NPTlRFTlRfRUxFTUVOVCk7Ci0JCQkvLyBkbGcuc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKHRydWUpOwotCQkJU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1tdIHsgRmlsdGVyQ29uc3RhbnRzLkNPTkZJR19DT05URU5UX0VMRU1FTlQgfTsKLQkJCUNvbmZpZ3VyYXRpb25BZGRWaWV3c0RpYWxvZyBkbGcgPSBuZXcgQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nKAotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJLmdldFNoZWxsKCkpOwotCQkJZGxnLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJZGxnLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5DT05GSUdfQ09OVEVOVF9FTEVNRU5UKTsKLQkJCWRsZy5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQlkbGcuc2V0VHlwZXMoc3RyKTsKLQkJCWRsZy5zZXRJbnB1dChVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGVsZW1lbnQpKTsKLQkJCWRsZy5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpKSwKLQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0SXRlbXNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQotCQkJU3RyaW5nIHRpdGxlID0gTWVzc2FnZUZvcm1hdAotCQkJCQkuZm9ybWF0KAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbnRyaWJ1dGlvblNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGUsIAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IGVsZW1lbnQuZ2V0TmFtZSgpIH0pOwotCi0JCQlkbGcuc2V0VGl0bGUodGl0bGUpOwotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZGxnLm9wZW4oKTsKLQotCQkJTGlzdCByZXN1bHQgPSBkbGcuZ2V0U2VsZWN0ZWRJdGVtcygpOwotCQkJaWYgKChyZXN1bHQgPT0gbnVsbCkgfHwgKHJlc3VsdC5pc0VtcHR5KCkpKQotCQkJCXJldHVybiBudWxsOwotCQkJZWxzZQotCQkJCXJldHVybiByZXN1bHQuZ2V0KDApOwotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0RpYWxvZ0hlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0RpYWxvZ0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTkxZDQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9EaWFsb2dIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc0FjdGl2aXR5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Qcm9jZXNzUm9sZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuVmFyaWFiaWxpdHlQcm9jZXNzUm9sZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuVmFyaWFiaWxpdHlQcm9jZXNzVGFza0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuVmFyaWFiaWxpdHlQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGNvbGxlY3QgaW5wdXQgZGF0YSBmcm9tIHVzZXJzIHVzaW5nIGRpYWxvZyBib3hlcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpYWxvZ0hlbHBlciB7Ci0KLQlwdWJsaWMgc3RhdGljIExpc3Qgc2VsZWN0RWxlbWVudHNGb3IoQnJlYWtkb3duRWxlbWVudCBlLCBJRmlsdGVyIGZpbHRlciwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgdGFiTmFtZSkgewotCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIGZpbHRlciwgdGFiTmFtZSwgbnVsbCwKLQkJCQljb25maWcpOwotCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZmQuc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKGZhbHNlKTsKLQkJZmQuc2V0VGl0bGUodGFiTmFtZSk7Ci0JCWZkLm9wZW4oKTsKLQkJcmV0dXJuIGZkLmdldFNlbGVjdGVkSXRlbXMoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3Qgc2VsZWN0VGFza3NGb3IoQWN0aXZpdHkgYWN0LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlTdHJpbmcgdGFiTmFtZSA9IEZpbHRlckNvbnN0YW50cy5UQVNLUzsKLQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgVmFyaWFiaWxpdHlQcm9jZXNzVGFza0ZpbHRlcihjb25maWcsIG51bGwsCi0JCQkJRmlsdGVyQ29uc3RhbnRzLlRBU0tTLCBhY3QpOwotCi0JCXJldHVybiBzZWxlY3RFbGVtZW50c0ZvcihhY3QsIGZpbHRlciwgY29uZmlnLCB0YWJOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3Qgc2VsZWN0RWxlbWVudHNGb3IoT2JqZWN0IG9iamVjdCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSA9PSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJCXJldHVybiBzZWxlY3RUYXNrc0ZvcigoQWN0aXZpdHkpIG9iamVjdCwgY29uZmlnKTsKLQkJCX0gZWxzZSBpZiAoYWRhcHRlckZhY3RvcnkgPT0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQlTdHJpbmcgdGFiTmFtZSA9IEZpbHRlckNvbnN0YW50cy5ST0xFUzsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBWYXJpYWJpbGl0eVByb2Nlc3NSb2xlRmlsdGVyKGNvbmZpZywgbnVsbCwKLQkJCQkJCUZpbHRlckNvbnN0YW50cy5ST0xFUywgKEFjdGl2aXR5KSBvYmplY3QpOwotCQkJCXJldHVybiBzZWxlY3RFbGVtZW50c0ZvcigoQnJlYWtkb3duRWxlbWVudCkgb2JqZWN0LCBmaWx0ZXIsCi0JCQkJCQljb25maWcsIHRhYk5hbWUpOwotCQkJfSBlbHNlIGlmIChhZGFwdGVyRmFjdG9yeSA9PSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJCVN0cmluZyB0YWJOYW1lID0gRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUzsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBWYXJpYWJpbGl0eVByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlcigKLQkJCQkJCWNvbmZpZywgbnVsbCwgRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUywKLQkJCQkJCShBY3Rpdml0eSkgb2JqZWN0KTsKLQkJCQlyZXR1cm4gc2VsZWN0RWxlbWVudHNGb3IoKEJyZWFrZG93bkVsZW1lbnQpIG9iamVjdCwgZmlsdGVyLAotCQkJCQkJY29uZmlnLCB0YWJOYW1lKTsKLQkJCX0KLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSA9PSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJCVN0cmluZyB0YWJOYW1lID0gRmlsdGVyQ29uc3RhbnRzLlJPTEVTOwotCQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IFByb2Nlc3NSb2xlRmlsdGVyKGNvbmZpZywgbnVsbCwKLQkJCQkJCUZpbHRlckNvbnN0YW50cy5ST0xFUyk7Ci0JCQkJcmV0dXJuIHNlbGVjdEVsZW1lbnRzRm9yKChCcmVha2Rvd25FbGVtZW50KSBvYmplY3QsIGZpbHRlciwKLQkJCQkJCWNvbmZpZywgdGFiTmFtZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3Qgc2VsZWN0QWN0aXZpdGllc0ZvcihBY3Rpdml0eSBhY3QsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgaW50IGNvbW1hbmQpIHsKLQkJLy8gcmV0dXJuIG51bGw7Ci0JCVN0cmluZyB0YWJOYW1lID0gRmlsdGVyQ29uc3RhbnRzLlBST0NFU1NFUzsKLQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgUHJvY2Vzc0FjdGl2aXR5RmlsdGVyKGNvbmZpZywgbnVsbCwKLQkJCQlGaWx0ZXJDb25zdGFudHMuUFJPQ0VTU0VTLCBhY3QsIGNvbW1hbmQpOwotCQlMaXN0IHNlbGVjdGlvbiA9IHNlbGVjdEVsZW1lbnRzRm9yKGFjdCwgZmlsdGVyLCBjb25maWcsIHRhYk5hbWUpOwotCQlBcnJheUxpc3QgYWN0aXZpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlhY3Rpdml0aWVzLmFkZChlbGVtZW50KTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIGVsZW1lbnQpLmdldFByb2Nlc3MoKTsKLQkJCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQkJCWFjdGl2aXRpZXMuYWRkKHByb2MpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYWN0aXZpdGllczsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvRmlsdGVyU29ydGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvRmlsdGVyU29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMjEzZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0ZpbHRlclNvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbnRlbnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLQotCi0KLS8qKgotICogQSB7QGxpbmsgSXRlbXNGaWx0ZXJEaWFsb2d9IGRpYWxvZyB2aWV3ZXIgc29ydGVyIHRvIG9yZGVyIHRoZSBkaXNwbGF5IGZvciBjZXJ0YWluIGVsZW1lbnQgYW5kIHBhY2thZ2VzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZpbHRlclNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0KLQlwdWJsaWMgRmlsdGVyU29ydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBpbnQgY2F0ZWdvcnkoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCXJldHVybiAwOwotCQllbHNlCi0JCQlyZXR1cm4gMTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29sbGF0b3IKLQkgKi8KLQlwdWJsaWMgRmlsdGVyU29ydGVyKENvbGxhdG9yIGNvbGxhdG9yKSB7Ci0JCXN1cGVyKGNvbGxhdG9yKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvciNjb21wYXJlKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCi0JCWlmICghKGUxIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHx8ICEoZTIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkpIHsKLQkJCWludCBjYXQxID0gY2F0ZWdvcnkoZTEpOwotCQkJaW50IGNhdDIgPSBjYXRlZ29yeShlMik7Ci0KLQkJCWlmIChjYXQxICE9IGNhdDIpCi0JCQkJcmV0dXJuIGNhdDEgLSBjYXQyOwotCQl9Ci0KLQkJaWYgKGUxIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luICYmIGUyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCVN0cmluZyBuYW1lMTsKLQkJU3RyaW5nIG5hbWUyOwotCi0JCWlmICh2aWV3ZXIgPT0gbnVsbCB8fCAhKHZpZXdlciBpbnN0YW5jZW9mIENvbnRlbnRWaWV3ZXIpKSB7Ci0JCQluYW1lMSA9IGUxLnRvU3RyaW5nKCk7Ci0JCQluYW1lMiA9IGUyLnRvU3RyaW5nKCk7Ci0JCX0gZWxzZSB7Ci0JCQlJQmFzZUxhYmVsUHJvdmlkZXIgcHJvdiA9ICgoQ29udGVudFZpZXdlcikgdmlld2VyKQotCQkJCQkuZ2V0TGFiZWxQcm92aWRlcigpOwotCQkJaWYgKHByb3YgaW5zdGFuY2VvZiBJTGFiZWxQcm92aWRlcikgewotCQkJCUlMYWJlbFByb3ZpZGVyIGxwcm92ID0gKElMYWJlbFByb3ZpZGVyKSBwcm92OwotCQkJCW5hbWUxID0gbHByb3YuZ2V0VGV4dChlMSk7Ci0JCQkJbmFtZTIgPSBscHJvdi5nZXRUZXh0KGUyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmFtZTEgPSBlMS50b1N0cmluZygpOwotCQkJCW5hbWUyID0gZTIudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlpZiAobmFtZTEgPT0gbnVsbCkKLQkJCW5hbWUxID0gIiI7Ly8kTk9OLU5MUy0xJAotCQlpZiAobmFtZTIgPT0gbnVsbCkKLQkJCW5hbWUyID0gIiI7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gY29sbGF0b3IuY29tcGFyZShuYW1lMSwgbmFtZTIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yI3NvcnQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzb3J0KGZpbmFsIFZpZXdlciB2aWV3ZXIsIE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0JCUFycmF5cy5zb3J0KGVsZW1lbnRzLCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCQlyZXR1cm4gRmlsdGVyU29ydGVyLnRoaXMuY29tcGFyZSh2aWV3ZXIsIGEsIGIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9GaWx0ZXJTb3J0ZXJGb3JBbGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9GaWx0ZXJTb3J0ZXJGb3JBbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRhMmE2OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvRmlsdGVyU29ydGVyRm9yQWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbnRlbnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLQotCi0vKioKLSAqIEEgRmlsdGVyIHNvcnRlciBmb3Ige0BsaW5rIEl0ZW1zRmlsdGVyRGlhbG9nfSB1c2luZyB7QGxpbmsgQWxsRmlsdGVyfQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJTb3J0ZXJGb3JBbGwgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotCi0JcHVibGljIEZpbHRlclNvcnRlckZvckFsbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29sbGF0b3IKLQkgKi8KLQlwdWJsaWMgRmlsdGVyU29ydGVyRm9yQWxsKENvbGxhdG9yIGNvbGxhdG9yKSB7Ci0JCXN1cGVyKGNvbGxhdG9yKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNhdGVnb3J5KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQlyZXR1cm4gMDsKLQkJZWxzZQotCQkJcmV0dXJuIDE7Ci0JfQotCi0JcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0KLQkJaWYgKCEoZTEgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgfHwgIShlMiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSkgewotCQkJaW50IGNhdDEgPSBjYXRlZ29yeShlMSk7Ci0JCQlpbnQgY2F0MiA9IGNhdGVnb3J5KGUyKTsKLQotCQkJaWYgKGNhdDEgIT0gY2F0MikKLQkJCQlyZXR1cm4gY2F0MSAtIGNhdDI7Ci0JCX0KLQotCQlpZiAoZTEgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gJiYgZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWlmICghKGUxIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHx8ICEoZTIgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJU3RyaW5nIG5hbWUxOwotCQlTdHJpbmcgbmFtZTI7Ci0KLQkJaWYgKHZpZXdlciA9PSBudWxsIHx8ICEodmlld2VyIGluc3RhbmNlb2YgQ29udGVudFZpZXdlcikpIHsKLQkJCW5hbWUxID0gZTEudG9TdHJpbmcoKTsKLQkJCW5hbWUyID0gZTIudG9TdHJpbmcoKTsKLQkJfSBlbHNlIHsKLQkJCUlCYXNlTGFiZWxQcm92aWRlciBwcm92ID0gKChDb250ZW50Vmlld2VyKSB2aWV3ZXIpCi0JCQkJCS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCQlpZiAocHJvdiBpbnN0YW5jZW9mIElMYWJlbFByb3ZpZGVyKSB7Ci0JCQkJSUxhYmVsUHJvdmlkZXIgbHByb3YgPSAoSUxhYmVsUHJvdmlkZXIpIHByb3Y7Ci0JCQkJbmFtZTEgPSBscHJvdi5nZXRUZXh0KGUxKTsKLQkJCQluYW1lMiA9IGxwcm92LmdldFRleHQoZTIpOwotCQkJfSBlbHNlIHsKLQkJCQluYW1lMSA9IGUxLnRvU3RyaW5nKCk7Ci0JCQkJbmFtZTIgPSBlMi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0JCWlmIChuYW1lMSA9PSBudWxsKQotCQkJbmFtZTEgPSAiIjsvLyROT04tTkxTLTEkCi0JCWlmIChuYW1lMiA9PSBudWxsKQotCQkJbmFtZTIgPSAiIjsvLyROT04tTkxTLTEkCi0JCXJldHVybiBjb2xsYXRvci5jb21wYXJlKG5hbWUxLCBuYW1lMik7Ci0JfQotCi0JcHVibGljIHZvaWQgc29ydChmaW5hbCBWaWV3ZXIgdmlld2VyLCBPYmplY3RbXSBlbGVtZW50cykgewotCQlBcnJheXMuc29ydChlbGVtZW50cywgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQkJcmV0dXJuIEZpbHRlclNvcnRlckZvckFsbC50aGlzLmNvbXBhcmUodmlld2VyLCBhLCBiKTsKLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0lucHV0VHlwZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0lucHV0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGNjY2JlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9JbnB1dFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotLyoqCi0gKiBAYXV0aG9yIHNrYW5ub29yCi0gKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSW5wdXRUeXBlIHsKLQkKLQlwdWJsaWMgc3RhdGljIGludCBURVhUID0gMDsKLQlwdWJsaWMgc3RhdGljIGludCBDT01CTyA9IDE7Ci0JcHVibGljIHN0YXRpYyBpbnQgTElTVCA9IDI7Ci0JcHVibGljIHN0YXRpYyBpbnQgVFJFRSA9IDM7Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvSXRlbXNGaWx0ZXJEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9JdGVtc0ZpbHRlckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODE1NjVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9JdGVtc0ZpbHRlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRXhQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5BdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSVByb2Nlc3NGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLmludGVybmFsLmNvcmUudGV4dC5QYXR0ZXJuQ29uc3RydWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBGaWx0ZXIgRGlhbG9nIC0gYWxsb3cgdGhlIHVzZXIgdG8gZmlsdGVyIHRoZSBjb250ZW50IGVsZW1lbnQsIGNvbnRlbnQKLSAqIGNhdGVnb3JpZXMsIGN1c3RvbSBjYXRlZ29yaWVzLCBBbGwgdHlwZXMgb2YgY29udGVudGVsZW1lbnRzIGJhc2VkIG9uIGxvY2F0aW9uIG9mIHRoZSB1c2Ugb2YgdGhlIGZpbHRlcgotICogZGlhbG9nLgotICogCi0gKiBAYXV0aG9yIExva2FuYXRoIEphZ2dhCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIEl0ZW1zRmlsdGVyRGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSURvdWJsZUNsaWNrTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbiwgY2FuY2VsQnV0dG9uOwotCi0JcHJvdGVjdGVkIFRleHQgY3RybF9wYXR0ZXJuLCBjdHJsX2JyaWVmX2Rlc2M7Ci0KLQlwcml2YXRlIFN0cmluZyBwYXR0ZXJuLCBmaWx0ZXJUeXBlU3RyOwotCi0JcHJvdGVjdGVkIENvbWJvIGZpbHRlclR5cGU7Ci0KLQlwcml2YXRlIFN0cmluZyBkaWFsb2dUaXRsZSwgdGFiU3RyOwotCi0JcHJpdmF0ZSBPYmplY3QgY29udGVudEVsZW1lbnQ7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBzZWxlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdmlld2VyU2VsZWN0aW9uU2luZ2xlID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgdmlld2VyTGFiZWwgPSBudWxsOwotCQotCS8qCi0JICogVHJlZXZpZXdlciBmb3IgQ29udGVudEVsZW1lbnRzIHRvIGRpc3BsYXkuCi0JICovCi0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkvLyByZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwgIiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCU1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBtZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgPSAoTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKVRuZ1V0aWwuZ2V0QWRhcHRlcigoTWV0aG9kUGx1Z2luKW9iamVjdCwgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAobWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5nZXRGdWxsTmFtZShvYmplY3QpOwotCQkJCX0KLQkJCX0gCi0JCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCQl9Ci0JCQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBpbmRleCkgewotCQkJcmV0dXJuIGdldFRleHQob2JqZWN0KTsKLQkJfQotCQkKLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBpbmRleCkgewotCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQlwcml2YXRlIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLQotCS8qCi0JICogRGlhbG9nIEF0dHJpYnV0ZXMKLQkgKi8KLQkvLyBwcml2YXRlIGJvb2xlYW4gYW55Q2hpbGRzID0gdHJ1ZTsKLQlwcml2YXRlIExpc3QgYWxyZWFkeVNlbGVjdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlQYXR0ZXJuIHJlZ2V4UGF0dGVybjsKLQotCS8vIHByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWd1cmF0aW9uOwotCXByb3RlY3RlZCBGaWx0ZXJIZWxwZXIgaGVscGVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgU1RPUkVfRVhQQU5ERURfTEVWRUxfSUQgPSAiLkxFVkVMX0lEIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIFBBVFRFUk5fSUQgPSAiLlBhdHRlcm4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgVFlQRV9JRCA9ICIuVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIERJQUxPR19OQU1FOwotCi0JcHJpdmF0ZSBCdXR0b24gZXhwYW5kQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gY29sbGFwc2VCdXR0b247Ci0KLQlwcml2YXRlIE9iamVjdCBpbnB1dDsKLQotCXByaXZhdGUgU3RyaW5nW10gdHlwZXM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbHRlckRpYWxvZy4gVGhpcyBjb25zdHJ1Y3RvciB3aWxsIHVzZSBmaWx0ZXIgYmFzZWQgb24KLQkgKiB0YWJTdHIsIGZpbHRlcnMgb3V0IHRoZSBsaXN0IG9mIGVsZW1lbnRzIGJhc2VkIG9uIGFscmVhZHkgZXhpc3RpbmcKLQkgKiBzZWxlY3RlZCBlbGVtZW50IGluIHRoZSBzZWxlY3RlZCB0YWJsZS4gSW5pdGlhbGl6ZXMgdGhlIENvbnRlbnRQcm92aWRlcgotCSAqIGZvciB0aGUgdHJlZXZpZXdlci4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgSXRlbXNGaWx0ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIE9iamVjdCBjb250ZW50RWxlbWVudCwKLQkJCVN0cmluZyB0YWJTdHIsIExpc3QgYWxyZWFkeUV4aXN0cykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMuY29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQkJdGhpcy50YWJTdHIgPSB0YWJTdHI7Ci0JCXRoaXMuZmlsdGVyID0gbnVsbDsKLQkJdGhpcy5hbHJlYWR5U2VsZWN0ZWRMaXN0ID0gYWxyZWFkeUV4aXN0czsKLQkJaGVscGVyID0gbmV3IEZpbHRlckhlbHBlcihjb250ZW50RWxlbWVudCwgdGFiU3RyLCBudWxsLCBudWxsLAotCQkJCXRoaXMuYWxyZWFkeVNlbGVjdGVkTGlzdCk7Ci0JCWluaXRQcm92aWRlckZvclRhYnMoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlbXNGaWx0ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElGaWx0ZXIgZmlsdGVyLCBTdHJpbmcgdGFiU3RyLAotCQkJTGlzdCBhbHJlYWR5RXhpc3RzLCBPYmplY3QgaW5wdXQpIHsKLQkJdGhpcyhwYXJlbnRTaGVsbCwgZmlsdGVyLCBudWxsLCB0YWJTdHIsIGFscmVhZHlFeGlzdHMpOwotCQl0aGlzLmlucHV0ID0gaW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBGaWx0ZXJEaWFsb2cuIFRoaXMgY29uc3RydWN0b3Igd2lsbCB1c2UgcGFzc2VkIGZpbHRlci4KLQkgKiB0YWJTdHIgaXMgdXNlZCBmb3IgdGhlIHNlYXJjaHR5cGUgb25seS4gSW5pdGlhbGl6ZXMgdGhlIENvbnRlbnRQcm92aWRlcgotCSAqIGZvciB0aGUgdHJlZXZpZXdlci4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgSXRlbXNGaWx0ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElGaWx0ZXIgZmlsdGVyLAotCQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50LCBTdHJpbmcgdGFiU3RyKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCXRoaXMudGFiU3RyID0gdGFiU3RyOwotCi0JCWhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIoY29udGVudEVsZW1lbnQsIHRhYlN0ciwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JCWluaXRQcm92aWRlckZvclRhYnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbHRlckRpYWxvZy4gVGhpcyBjb25zdHJ1Y3RvciB3aWxsIHVzZSBwYXNzZWQgZmlsdGVyLgotCSAqIHRhYlN0ciBpcyB1c2VkIGZvciB0aGUgc2VhcmNodHlwZSBvbmx5LiBJbml0aWFsaXplcyB0aGUgQ29udGVudFByb3ZpZGVyCi0JICogZm9yIHRoZSB0cmVldmlld2VyLgotCSAqIAotCSAqLwotCXB1YmxpYyBJdGVtc0ZpbHRlckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSUZpbHRlciBmaWx0ZXIsCi0JCQlPYmplY3QgY29udGVudEVsZW1lbnQsIFN0cmluZyB0YWJTdHIsIExpc3QgYWxyZWFkeUV4aXN0cykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQl0aGlzLnRhYlN0ciA9IHRhYlN0cjsKLQkJdGhpcy5hbHJlYWR5U2VsZWN0ZWRMaXN0ID0gYWxyZWFkeUV4aXN0czsKLQkJaGVscGVyID0gbmV3IEZpbHRlckhlbHBlcihjb250ZW50RWxlbWVudCwgdGFiU3RyLCBudWxsLCBudWxsLAotCQkJCWFscmVhZHlFeGlzdHMpOwotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCWluaXRQcm92aWRlckZvclRhYnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbHRlckRpYWxvZy4gT25seSBmb3IgbWV0aG9kY29uZmlndXJhdGlvbi4gVGhpcwotCSAqIGNvbnN0cnVjdG9yIHdpbGwgdXNlIHBhc3NlZCBmaWx0ZXIuIEluaXRpYWxpemVzIHRoZSBDb250ZW50UHJvdmlkZXIgZm9yCi0JICogdGhlIHRyZWV2aWV3ZXIuCi0JICogCi0JICovCi0JLy8gcHVibGljIEl0ZW1zRmlsdGVyRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBPYmplY3QgY29udGVudEVsZW1lbnQsCi0JLy8gTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWd1cmF0aW9uLCBTdHJpbmcgdGFiU3RyKSB7Ci0JLy8gc3VwZXIocGFyZW50U2hlbGwpOwotCS8vIHRoaXMuY29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQkvLyB0aGlzLnRhYlN0ciA9IHRhYlN0cjsKLQkvLyB0aGlzLmZpbHRlciA9IG51bGw7Ci0JLy8gdGhpcy5tZXRob2RDb25maWd1cmF0aW9uID0gbWV0aG9kQ29uZmlndXJhdGlvbjsKLQkvLyBoZWxwZXIgPSBuZXcgRmlsdGVySGVscGVyKGNvbnRlbnRFbGVtZW50LCB0YWJTdHIsIG51bGwsIG51bGwsIG51bGwpOwotCS8vIGluaXRQcm92aWRlckZvclRhYnMoKTsKLQkvLyB9Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBpcyB2ZXJ5IGdlbmVyaWMsIGluIG9yZGVyIHRvIGluaXRpYWxpemUgZmlsdGVyLCBpbnB1dAotCSAqIGFuZCBjb250ZW50cHJvdmlkZXIgc2hvdWxkIGJlIGhhbmRsZWQgZXhwbGljaXRseSBieSBjYWxsaW5nIGJlbG93IG1ldGhvZC4KLQkgKiBzZXRGaWx0ZXIoSUZpbHRlcikgc2V0SW5wdXQoT2JqZWN0KQotCSAqIHNldENvbnRlbnRQcm92aWRlcihJU3RydWN0dXJlZFByb3ZpZGVyKQotCSAqIAotCSAqLwotCXB1YmxpYyBJdGVtc0ZpbHRlckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCWhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGlmIGEgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0JCQlzYXZlVmFsdWVzKCk7Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCQlpZihjb21wb3NlZEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpewotCQkJY29tcG9zZWRBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoYXQgdGhlIGNhbmNlbCBidXR0b24gb2YgdGhpcyBkaWFsb2cgaGFzIGJlZW4gcHJlc3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkgewotCSAgICBpZiAodHJlZUpvYiAhPSBudWxsKSB7Ci0JICAgIAl0cmVlSm9iLmNhbmNlbCgpOwotCSAgICB9Ci0JCXN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLQkJaWYoY29tcG9zZWRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKXsKLQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkgICAgaWYgKHRyZWVKb2IgIT0gbnVsbCkgewotCSAgICAJdHJlZUpvYi5jYW5jZWwoKTsKLQkgICAgfQotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGl0bGUgZm9yIGRpYWxvZyBib3ggZWc6IFNlbGVjdCBEaWFsb2cgRm9yIFJvbGUsIGRpYWxvZ1RpdGxlIG5lZWRzIHRvCi0JICogIlJvbGUiCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIGRpYWxvZ1RpdGxlKSB7Ci0JCXRoaXMuZGlhbG9nVGl0bGUgPSBkaWFsb2dUaXRsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlpZiAoZGlhbG9nVGl0bGUgPT0gbnVsbCkKLQkJCWRpYWxvZ1RpdGxlID0gdGFiU3RyOwotCQlzaGVsbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ190aXRsZSArIGRpYWxvZ1RpdGxlKTsgCi0JfQotCi0JLyoqCi0JICogKG5vbi1KYXZhZG9jKSBBZGRzIGJ1dHRvbnMgdG8gdGhpcyBkaWFsb2cncyBidXR0b24gYmFyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBidXR0b24gYmFyIGNvbXBvc2l0ZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGRpYWxvZyBhcmVhIGFuZCBjb250cm9scyBhbmQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSB0aGUKLQkgKiAgICAgICAgICAgIHBhcmVudCBjb21wb3NpdGUgdG8gY29udGFpbiB0aGUgZGlhbG9nIGFyZWEKLQkgKiBAcmV0dXJuIHRoZSBkaWFsb2cgYXJlYSBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0KLQkJTGFiZWwgdHlwZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl7Ci0JCQl0eXBlTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfVHlwZV90ZXh0KTsgCi0JCQlHcmlkRGF0YSBnRDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCXR5cGVMYWJlbC5zZXRMYXlvdXREYXRhKGdEMSk7Ci0KLQkJfQotCQlmaWx0ZXJUeXBlID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQl7Ci0JCQlHcmlkRGF0YSBnRDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdEMS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlnRDEud2lkdGhIaW50ID0gMzkwOwotCQkJZmlsdGVyVHlwZS5zZXRMYXlvdXREYXRhKGdEMSk7Ci0JCX0KLQotCQlpZiAodHlwZXMgPT0gbnVsbCkgewotCQkJZmlsbEZpbHRlclR5cGVDb21ibygpOwotCQl9IGVsc2UgewotCQkJZmlsdGVyVHlwZS5zZXRJdGVtcyh0eXBlcyk7Ci0JCQlpZiAoaGVscGVyICE9IG51bGwpIHsKLQkJCQlmaWx0ZXJUeXBlU3RyID0gZmlsdGVyVHlwZS5nZXRJdGVtKDApOwotCQkJCWhlbHBlci5zZXRGaWx0ZXJUeXBlU3RyKGZpbHRlclR5cGUuZ2V0SXRlbSgwKSk7Ci0JCQkJaWYgKHRhYlN0ciA9PSBudWxsKSB7Ci0JCQkJCXRhYlN0ciA9IGZpbHRlclR5cGVTdHI7Ci0JCQkJCWhlbHBlci5zZXRUYWJTdHIodGFiU3RyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmlsdGVyVHlwZS5zZWxlY3QoMCk7Ci0KLQkJTGFiZWwgY3RybF9wYXR0ZXJuTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXsKLQkJCWN0cmxfcGF0dGVybkxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX1BhdHRlcm5fdGV4dCk7IAotCQkJR3JpZERhdGEgZ0QgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWdELmhvcml6b250YWxTcGFuID0gMzsKLQkJCWN0cmxfcGF0dGVybkxhYmVsLnNldExheW91dERhdGEoZ0QpOwotCQl9Ci0KLQkJY3RybF9wYXR0ZXJuID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJewotCQkJR3JpZERhdGEgZ0QxID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCQlnRDEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJY3RybF9wYXR0ZXJuLnNldExheW91dERhdGEoZ0QxKTsKLQkJCWN0cmxfcGF0dGVybi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCQluZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQgKyAgCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX1BhdHRlcm5fZGVzY3JpcHRpb24pKTsKLQkJfQotCQlMYWJlbCBjdHJsX3BhdHRlcm5MYWJlbDEgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCXsKLQkJCWN0cmxfcGF0dGVybkxhYmVsMS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19QYXR0ZXJuX2Rlc2NyaXB0aW9uKTsgCi0JCQlHcmlkRGF0YSBnRCA9IG5ldyBHcmlkRGF0YShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlLCBmYWxzZSwgMywgMSk7Ci0JCQlnRC53aWR0aEhpbnQgPSA1NTA7Ci0JCQljdHJsX3BhdHRlcm5MYWJlbDEuc2V0TGF5b3V0RGF0YShnRCk7Ci0JCX0KLQkJCi0JCUNvbXBvc2l0ZSBidXR0b25zQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsJCQotCQkKLQkJR3JpZERhdGEgZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWdkMi5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWJ1dHRvbnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZDIpOwotCQlHcmlkTGF5b3V0IGJ1dHRvbnNMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlidXR0b25zTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlidXR0b25zTGF5b3V0Lm1hcmdpblJpZ2h0ID0gMDsKLQkJYnV0dG9uc0NvbXBvc2l0ZS5zZXRMYXlvdXQoYnV0dG9uc0xheW91dCk7Ci0JCQotCQlleHBhbmRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNDb21wb3NpdGUsIFNXVC5CVVRUT04xKTsKLQotCQlleHBhbmRCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJleHBhbmRhbGwuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWV4cGFuZEJ1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfRXhwYW5kQWxsKTsgCi0JCQotCQlleHBhbmRCdXR0b24uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX0V4cGFuZEFsbCkpOwkJCi0KLQkJZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HCi0JCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCi0JCWV4cGFuZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkMik7Ci0KLQkJY29sbGFwc2VCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNDb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJY29sbGFwc2VCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJjb2xsYXBzZWFsbC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQljb2xsYXBzZUJ1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfQ29sbGFwc2VBbGwpOyAKLQkJY29sbGFwc2VCdXR0b24uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbCkpOwotCQkKLQkJZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQotCQljb2xsYXBzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkMik7Ci0JCQotCQljcmVhdGVMaW5lKGNvbXBvc2l0ZSwgMyk7Ci0JCWNyZWF0ZVZpZXdlckxhYmVsKGNvbXBvc2l0ZSk7Ci0JCS8vIGNyZWF0ZSBhIHRyZWV2aWV3ZXIgYXJlYS4KLQkJY3JlYXRlVmlld2VyKGNvbXBvc2l0ZSk7Ci0KLQkJcmVzdG9yZUxhc3RTZXR0aW5ncygpOwotCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uKTsgCi0JCWN0cmxfYnJpZWZfZGVzYyA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5XUkFQCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQkJewotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJCWdkLmhlaWdodEhpbnQgPSA2MDsKLQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRMYXlvdXREYXRhKGdkKTsKLQkJfQotCQkvLyBSZXN0b3JlIHRoZSBsYXN0IHN0YXRlCi0JCWNyZWF0ZUxpbmUoY29tcG9zaXRlLCAzKTsKLQotCQkvLyBSZXR1cm4gcmVzdWx0cy4KLQkJYWRkTGlzdGVuZXIoKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgdmlld2VyIGluIHRoZSBwYXJlbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAodmlld2VyU2VsZWN0aW9uU2luZ2xlKSB7Ci0JCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMCi0JCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCX0gZWxzZSB7Ci0JCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwKLQkJCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJfQotCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQotCQkvLyBTZXQgdGhlIGlucHV0IHRvIHRyZWVWaWV3ZXIKLQkJdHJlZVZpZXdlci5zZXRJbnB1dChnZXRJbnB1dCgpKTsKLQotCQl0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJdHJlZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKHRoaXMpOwotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0JCWlmICh0YWJTdHIuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTKSkgeyAKLQkJCXRyZWVWaWV3ZXIuc2V0U29ydGVyKG5ldyBGaWx0ZXJTb3J0ZXJGb3JBbGwoKSk7Ci0JCX0gZWxzZSB7Ci0JCQl0cmVlVmlld2VyLnNldFNvcnRlcihuZXcgRmlsdGVyU29ydGVyKCkpOwotCQl9Ci0KLQkJR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQl7Ci0JCQlzcGVjLndpZHRoSGludCA9IDMwMDsKLQkJCXNwZWMuaGVpZ2h0SGludCA9IDMwMDsKLQkJCXNwZWMuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShzcGVjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgaW5wdXQgaWYgZXh0ZXJuYWxseSBzZXQgYnkgc2V0SW5wdXQgaW52b2tlci4KLQkgKiBFbHNlLCBjYWxjdWxhdGVzIHRoZSBpbnB1dCBiYXNlZCBvbiB0aGUgT2JqZWN0IHNldCB0byB0aGUgZGlhbG9nLgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldElucHV0KCl7Ci0JCWlmKGlucHV0ICE9IG51bGwpewotCQkJcmV0dXJuIGlucHV0OwotCQl9ZWxzZXsKLQkJCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCQkJUHJvY2VzcyBwcm9jZXNzID0gKFByb2Nlc3MpY29udGVudEVsZW1lbnQ7Ci0JCQkJCQlpZiAocHJvY2Vzcy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQkJaWYgKCEodGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0UpCi0JCQkJCQkJCQl8fCB0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ST0FETUFQKSAKLQkJCQkJCQkJCXx8IHRhYlN0ci5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTKSkpIHsKLQkJCQkJCQlyZXR1cm4gcHJvY2Vzcy5lQ29udGFpbmVyKCk7Ci0JCQkJCQl9IGVsc2UKLQkJCQkJCQlyZXR1cm4gcHJvY2VzczsKLQkJCQkJCX0KLQkJCQl9IAotCQkJCXJldHVybiBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0gCi0JCQlyZXR1cm4gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVMaW5lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBuY29sKSB7Ci0JCUxhYmVsIGxpbmUgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwKLQkJCQl8IFNXVC5CT0xEKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBuY29sOwotCQlsaW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVWaWV3ZXJMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAJCWlmICh2aWV3ZXJMYWJlbCAhPSBudWxsKSB7Ci0gICAJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQodmlld2VyTGFiZWwpOwotICAgCQl9Ci0gICAJfQotCQotCXB1YmxpYyB2b2lkIHNldFZpZXdlclNlbGVjdGlvblNpbmdsZShib29sZWFuIHNpbmdsZSkgewotCQl2aWV3ZXJTZWxlY3Rpb25TaW5nbGUgPSBzaW5nbGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyI2RvdWJsZUNsaWNrKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQlPYmplY3QgZWxlbWVudCA9IHMuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWVsZW1lbnQgPSBMaWJyYXJ5VXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQgfHwgZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MKLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudAotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50Ci0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlzZWxlY3RlZExpc3QuYWRkKGVsZW1lbnQpOwotCQl9IAotCQlzYXZlTGFzdFNldHRpbmdzKCk7Ci0JCWNsb3NlKCk7Ci0JCWlmKGNvbXBvc2VkQWRhcHRlckZhY3RvcnkgIT0gbnVsbCl7Ci0JCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGlhbG9nIHN0b3JlIHRvIGNhY2hlIHZhbHVlcyBpbnRvCi0JICovCi0JcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpIHsKLQkJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSAoRGlhbG9nU2V0dGluZ3MpIEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gKERpYWxvZ1NldHRpbmdzKSBkaWFsb2dTZXR0aW5ncwotCQkJCS5nZXRTZWN0aW9uKERJQUxPR19OQU1FICsgU1RPUkVfRVhQQU5ERURfTEVWRUxfSUQpOwotCQlpZiAoc2VjdGlvbiA9PSBudWxsKQotCQkJc2VjdGlvbiA9IChEaWFsb2dTZXR0aW5ncykgZGlhbG9nU2V0dGluZ3MuYWRkTmV3U2VjdGlvbihESUFMT0dfTkFNRQotCQkJCQkrIFNUT1JFX0VYUEFOREVEX0xFVkVMX0lEKTsKLQkJcmV0dXJuIHNlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogVXNlIHRoZSBkaWFsb2cgc2V0dGluZ3MgdG8gcmVzdG9yZSB3aWRnZXQgdmFsdWVzIHRvIHRoZSB2YWx1ZXMgdGhhdCB0aGV5Ci0JICogaGVsZCBsYXN0IHRpbWUgdGhpcyBkaWFsb2cgd2FzIHVzZWQgdG8gY29tcGxldGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlTGFzdFNldHRpbmdzKCkgewotCQlESUFMT0dfTkFNRSA9IHRhYlN0cjsKLQkJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSAoRGlhbG9nU2V0dGluZ3MpIGdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCVN0cmluZyB0ZW1wID0gZGlhbG9nU2V0dGluZ3MuZ2V0KERJQUxPR19OQU1FICsgUEFUVEVSTl9JRCk7IAotCQlpZiAodGVtcCAhPSBudWxsICYmIHRlbXAubGVuZ3RoKCkgPiAwKSB7IAotCQkJcGF0dGVybiA9IGRpYWxvZ1NldHRpbmdzLmdldChESUFMT0dfTkFNRSArIFBBVFRFUk5fSUQpOyAKLQkJCWZpbHRlclR5cGVTdHIgPSBkaWFsb2dTZXR0aW5ncy5nZXQoRElBTE9HX05BTUUgKyBUWVBFX0lEKTsgCi0JCQlmaWx0ZXJUeXBlLnNldFRleHQoZmlsdGVyVHlwZVN0cik7Ci0JCQlyZWdleFBhdHRlcm4gPSBnZXRSZWdFeChwYXR0ZXJuKTsKLQkJCQotCQkJLy9UcmltICIqIiBmcm9tIHBhdHRlcm4gc3RyaW5nIGJlZm9yZSBkaXNwbGF5LiBUaGlzIGFjdGlvbiBpcyBqdXN0IGZvciBkaXNwbGF5LgotLy8JCQlpZihwYXR0ZXJuICE9IG51bGwpewotLy8JCQkJaWYocGF0dGVybi5sYXN0SW5kZXhPZihGaWx0ZXJDb25zdGFudHMuQU5ZX1NUUklORykgCi0vLwkJCQkJCT09IHBhdHRlcm4ubGVuZ3RoKCktMSl7Ci0vLwkJCQkJcGF0dGVybiA9IHBhdHRlcm4uc3Vic3RyaW5nKDAsIHBhdHRlcm4ubGVuZ3RoKCktMSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJCWN0cmxfcGF0dGVybi5zZXRUZXh0KHBhdHRlcm4pOwotCQkJCi0JCQlpZiAoaGVscGVyICE9IG51bGwpIHsKLQkJCQloZWxwZXIuc2V0UGF0dGVybihwYXR0ZXJuKTsKLQkJCQloZWxwZXIuc2V0UmVnZXhQYXR0ZXJuKHJlZ2V4UGF0dGVybik7Ci0JCQkJaGVscGVyLnNldEZpbHRlclR5cGVTdHIoZmlsdGVyVHlwZVN0cik7Ci0JCQl9Ci0JCQlpbml0UHJvdmlkZXJGb3JUYWJzKCk7Ci0KLQkJfQotCQlMaXN0IGVsZW1lbnRzID0gKExpc3QpIEZpbHRlckNvbnN0YW50cy5oYXNoTWFwLmdldChESUFMT0dfTkFNRQotCQkJCSsgU1RPUkVfRVhQQU5ERURfTEVWRUxfSUQpOwotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCB8fCBlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCXRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCAmJiAhZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQl0cnkgewotCQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRFbGVtZW50cyhlbGVtZW50cy50b0FycmF5KCkpOwotCQkJCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0cmVlVmlld2VyLmV4cGFuZEFsbCgpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmF2ZXJzZVRyZWUoVHJlZUl0ZW1bXSBpdGVtcywgTGlzdCBsaXN0KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVRyZWVJdGVtW10gaXRlbXN4ID0gaXRlbXNbaV0uZ2V0SXRlbXMoKTsKLQkJCWlmIChpdGVtc3gubGVuZ3RoID4gMSkgewotCQkJCWxpc3QuYWRkKGl0ZW1zW2ldLmdldERhdGEoKSk7Ci0JCQkJdHJhdmVyc2VUcmVlKGl0ZW1zeCwgbGlzdCk7Ci0JCQl9IGVsc2UgewotCQkJCWxpc3QuYWRkKGl0ZW1zW2ldLmdldERhdGEoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaW5jZSBPSyB3YXMgcHJlc3NlZCwgd3JpdGUgd2lkZ2V0IHZhbHVlcyB0byB0aGUgZGlhbG9nIHN0b3JlIHNvIHRoYXQKLQkgKiB0aGV5IHdpbGwgcGVyc2lzdCBpbnRvIHRoZSBuZXh0IGludm9jYXRpb24gb2YgdGhpcyBkaWFsb2cKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlVmFsdWVzKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRyZWVWaWV3ZXIKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJT2JqZWN0W10gb2JqZWN0QXJyID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0QXJyLmxlbmd0aDsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChvYmplY3RBcnJbaV0pOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCAKLQkJCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MgCi0JCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50Ci0JCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQlzZWxlY3RlZExpc3QuYWRkKG9iaik7Ci0JCQkJfSAKLQkJCX0KLQkJfQotCQlzYXZlTGFzdFNldHRpbmdzKCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGxhc3Qgc2V0dGluZ3Mgb2YgZGlhbG9nLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVMYXN0U2V0dGluZ3MoKSB7Ci0KLQkJLy8gZWNsaXBzZSBkb2NzIGZvcklEaWFsb2dTZXR0aW5ncyBmb3IgdW5kZXJzdGFuZGluZy4KLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJRElBTE9HX05BTUUgPSB0YWJTdHI7Ci0JCU9iamVjdFtdIGV4cGFuZGVkRWxlbWVudHMgPSB0cmVlVmlld2VyLmdldEV4cGFuZGVkRWxlbWVudHMoKTsKLQkJTGlzdCBleHBhbmRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBTdHJpbmdbXSBleHBhbmRlZENhdGVnb3J5SWRzID0gbmV3IFN0cmluZ1tleHBhbmRlZEVsZW1lbnRzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwYW5kZWRFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGV4cGFuZGVkRWxlbWVudHNbaV07Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7Ci0JCQkJZXhwYW5kTGlzdC5hZGQoZXhwYW5kZWRFbGVtZW50c1tpXSk7Ci0JCQl9Ci0JCX0KLQkJc2V0dGluZ3MucHV0KERJQUxPR19OQU1FICsgUEFUVEVSTl9JRCwgcGF0dGVybik7Ci0JCXNldHRpbmdzLnB1dChESUFMT0dfTkFNRSArIFRZUEVfSUQsIGZpbHRlclR5cGVTdHIpOwotCQlGaWx0ZXJDb25zdGFudHMuaGFzaE1hcC5wdXQoRElBTE9HX05BTUUgKyBTVE9SRV9FWFBBTkRFRF9MRVZFTF9JRCwKLQkJCQlleHBhbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGF0IHRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBldmVudCBvYmplY3QgZGVzY3JpYmluZyB0aGUgY2hhbmdlCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJdXBkYXRlU2VsZWN0aW9uKGV2ZW50KTsKLQkJdXBkYXRlQnV0dG9ucygpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgYnV0dG9uIGVuYWJsZW1lbnQgc3RhdGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQnV0dG9ucygpIHsKLQkJLy8gb2tCdXR0b24uc2V0RW5hYmxlZChnZXRTZWxlY3Rpb24oKS5sZW5ndGggPiAwKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudE9iamVjdChPYmplY3QgY29udGVudEVsZW1lbnQpIHsKLQkJcmV0dXJuIE1ldGhvZEVsZW1lbnRVdGlsLmdldE1ldGhvZE1vZGVsKGNvbnRlbnRFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHNlbGVjdGlvbiBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VsZWN0aW9uKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkvLyBBcnJheUxpc3QgZGVzY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBzZWxlY3RlZCA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgfHwKLQkJCQlzZWxlY3RlZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIpewotCQkJT2JqZWN0IHVud3JhcCA9ICBUbmdVdGlsLnVud3JhcChzZWxlY3RlZCk7Ci0JCQlzZXRCcmllZkRlc2NyaXB0aW9uKHVud3JhcCk7Ci0JCX1lbHNlIHsKLQkJCXNldEJyaWVmRGVzY3JpcHRpb24oc2VsZWN0ZWQpOwotCQl9Ci0JfQotCS8qKgotCSAqIFNldCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gdG8gY29udHJvbAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRCcmllZkRlc2NyaXB0aW9uKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJU3RyaW5nIGRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChkZXNjKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZpbGxGaWx0ZXJUeXBlQ29tYm8oKSB7Ci0JCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uRmlsdGVyKSB7Ci0JCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nWzFdOwotCQkJc3RyWzBdID0gKFN0cmluZykgdGFiU3RyOwotCQkJZmlsdGVyVHlwZS5zZXRJdGVtcyhzdHIpOwotCQkJZmlsdGVyVHlwZVN0ciA9IHN0clswXTsKLQkJfSBlbHNlIGlmIChGaWx0ZXJDb25zdGFudHMuY2F0ZWdvcnlTdHJzLmNvbnRhaW5zKHRhYlN0cikpIHsKLQkJCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbMl07Ci0JCQlzdHJbMF0gPSAoU3RyaW5nKSB0YWJTdHI7Ci0JCQlzdHJbMV0gPSBGaWx0ZXJDb25zdGFudHMuTUVUSE9fUExVR0lOUzsKLQkJCWZpbHRlclR5cGUuc2V0SXRlbXMoc3RyKTsKLQkJCWZpbHRlclR5cGVTdHIgPSBzdHJbMF07Ci0JCX0gZWxzZSBpZiAoRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTLmVxdWFsc0lnbm9yZUNhc2UodGFiU3RyKSkgewotCQkJU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1syXTsKLQkJCXN0clswXSA9IChTdHJpbmcpIHRhYlN0cjsKLQkJCXN0clsxXSA9IEZpbHRlckNvbnN0YW50cy5NRVRIT19QTFVHSU5TOwotCQkJZmlsdGVyVHlwZS5zZXRJdGVtcyhzdHIpOwotCQkJZmlsdGVyVHlwZVN0ciA9IHN0clswXTsKLQkJfSBlbHNlIGlmIChGaWx0ZXJDb25zdGFudHMuYnJlYWtkb3duRWxlbWVudHMuY29udGFpbnModGFiU3RyKSkgewotCQkJU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1sxXTsKLQkJCXN0clswXSA9IChTdHJpbmcpIHRhYlN0cjsKLQkJCWZpbHRlclR5cGUuc2V0SXRlbXMoc3RyKTsKLQkJCWZpbHRlclR5cGVTdHIgPSBzdHJbMF07Ci0JCX0gZWxzZSBpZiAoRmlsdGVyQ29uc3RhbnRzLmNvbnRlbnRFbGVtZW50U3Rycy5jb250YWlucyh0YWJTdHIpKSB7Ci0JCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nWzNdOwotCQkJc3RyWzBdID0gdGFiU3RyOwotCQkJc3RyWzFdID0gRmlsdGVyQ29uc3RhbnRzLkNPTlRFTlRfUEFDS0FHRVM7Ci0JCQlzdHJbMl0gPSBGaWx0ZXJDb25zdGFudHMuTUVUSE9fUExVR0lOUzsKLQkJCWZpbHRlclR5cGUuc2V0SXRlbXMoc3RyKTsKLQkJCWZpbHRlclR5cGVTdHIgPSBzdHJbMF07Ci0JCX0gZWxzZSBpZiAoRmlsdGVyQ29uc3RhbnRzLkFMTF9FTEVNRU5UUy5lcXVhbHModGFiU3RyKSkgeyAvLyAxNzI5NTYKLQkJCVN0cmluZyBzcGFjZSA9ICItIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1syNl07Ci0JCQlpbnQgaSA9IDA7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5DT05URU5UX1BBQ0tBR0VTOwotCQkJc3RyW2krK10gPSBzcGFjZSArIEZpbHRlckNvbnN0YW50cy5ST0xFUzsKLQkJCXN0cltpKytdID0gc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuVEFTS1M7Ci0JCQlzdHJbaSsrXSA9IHNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUzsKLQkJCXN0cltpKytdID0gc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5DSEVDS0xJU1RTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuQ09OQ0VQVFM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5FWEFNUExFUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLkdVSURFTElORVM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5SRVVTQUJMRV9BU1NFVFM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLlRPT0xfTUVOVE9SUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLkVTVElNQVRFX0NPTlNJREVSQVRJT05TOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuUkVQT1JUUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLlRFTVBMQVRFUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLlRPT0xfTUVOVE9SUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLkVTVElNQVRFX0NPTlNJREVSQVRJT05TOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5ST0xFU0VUUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5ET01BSU5TOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuVE9PTFM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLlBST0NFU1NFUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLk1FVEhPX1BMVUdJTlM7Ci0JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHN0cik7Ci0JCQlmaWx0ZXJUeXBlU3RyID0gc3RyWzBdOwotCQl9IGVsc2UgaWYgKEZpbHRlckNvbnN0YW50cy5DT05GSUdfQ09OVEVOVF9FTEVNRU5ULmVxdWFscyh0YWJTdHIpKSB7Ci0JCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nWzFdOwotCQkJc3RyWzBdID0gKFN0cmluZykgdGFiU3RyOwotCQkJZmlsdGVyVHlwZS5zZXRJdGVtcyhzdHIpOwotCQkJZmlsdGVyVHlwZVN0ciA9IHN0clswXTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbMV07Ci0JCQlzdHJbMF0gPSAoU3RyaW5nKSB0YWJTdHI7Ci0JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHN0cik7Ci0JCQlmaWx0ZXJUeXBlU3RyID0gc3RyWzBdOwotCQl9Ci0JfQotCi0JcHVibGljIGxvbmcgZGVsYXkgPSA4MDA7Ci0JCi0JcHJpdmF0ZSBjbGFzcyBVcGRhdGVUcmVlSm9iIGV4dGVuZHMgSm9iIHsKLQotCQlwdWJsaWMgVXBkYXRlVHJlZUpvYihTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIobmFtZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0JCQkvLyBuZWVkIHRvIHJ1biB0aGlzIGluIFVJIHRocmVhZAotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKHRyZWVWaWV3ZXIgPT0gbnVsbCB8fCAKLQkJCQkJCQl0cmVlVmlld2VyLmdldENvbnRyb2woKSA9PSBudWxsIHx8Ci0JCQkJCQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuY2xlYXJBbGwodHJ1ZSk7Ci0JCQkJCWlmIChjdHJsX3BhdHRlcm4uZ2V0VGV4dCgpICE9IG51bGwKLQkJCQkJCQkmJiBjdHJsX3BhdHRlcm4uZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCXBhdHRlcm4gPSBjdHJsX3BhdHRlcm4uZ2V0VGV4dCgpLnRyaW0oKTsKLQkJCQkJCS8vIGlmKHBhdHRlcm4uaW5kZXhPZihGaWx0ZXJDb25zdGFudHMuQU5ZX1NUUklORyk+IC0xCi0JCQkJCQkvLyB8fCBwYXR0ZXJuLmluZGV4T2YoRmlsdGVyQ29uc3RhbnRzLkFOWV9DSEFSQUNURVIpID4KLQkJCQkJCS8vIC0xKXsKLQkJCQkJCS8vICAgICAgICAgICAgICAKLQkJCQkJCS8vIH1lbHNlewotCQkJCQkJLy8gcGF0dGVybiA9IHBhdHRlcm4rRmlsdGVyQ29uc3RhbnRzLkFOWV9TVFJJTkc7Ci0JCQkJCQkvLyB9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwYXR0ZXJuID0gRmlsdGVyQ29uc3RhbnRzLkFOWV9TVFJJTkc7Ci0JCQkJCQkvLyByZXR1cm47Ci0JCQkJCX0KLQkJCQkJcmVnZXhQYXR0ZXJuID0gZ2V0UmVnRXgocGF0dGVybik7Ci0JCQkJCWlmIChoZWxwZXIgIT0gbnVsbCkgewotCQkJCQkJaGVscGVyLnNldFBhdHRlcm4ocGF0dGVybik7Ci0JCQkJCQloZWxwZXIuc2V0UmVnZXhQYXR0ZXJuKHJlZ2V4UGF0dGVybik7Ci0JCQkJCQloZWxwZXIuc2V0RmlsdGVyVHlwZVN0cihmaWx0ZXJUeXBlU3RyKTsKLQkJCQkJCWhlbHBlci5zZXRUYWJTdHIoZmlsdGVyVHlwZVN0cik7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaFRyZWVWaWV3ZXIoKTsKLQkJCQl9Ci0KLQkJCX0pOwotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCX0KLQkKLQlwcml2YXRlIFVwZGF0ZVRyZWVKb2IgdHJlZUpvYiA9IG5ldyBVcGRhdGVUcmVlSm9iKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkl0ZW1zRmlsdGVyRGlhbG9nX1VwZGF0ZVRyZWVKb2JfbmFtZSk7Ci0JCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoKSB7Ci0JCWN0cmxfcGF0dGVybi5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkKLQkJCSAgaWYgKHRyZWVKb2IuZ2V0U3RhdGUoKSA9PSBKb2IuTk9ORSkgewotCQkJICAgIC8vIFdlIHNob3VsZCBzY2hlZHVsZSB0aGUgam9iIHRvIHJ1bgotCQkJICAgIHRyZWVKb2Iuc2NoZWR1bGUoZGVsYXkpOwotCQkJICB9IGVsc2UgaWYgKHRyZWVKb2IuZ2V0U3RhdGUoKSA9PSBKb2IuV0FJVElORyB8fAotCQkJCQkgIHRyZWVKb2IuZ2V0U3RhdGUoKSA9PSBKb2IuU0xFRVBJTkcpewotCQkJICAgIC8vIENhbmNlbCB0aGUgcHJldmlvdXMgam9iLCBhbmQgcmVzY2hlZHVsZQotCQkJICAgIHRyZWVKb2IuY2FuY2VsKCk7Ci0JCQkgICAgdHJlZUpvYi5zY2hlZHVsZShkZWxheSk7Ci0JCQkgIH0KLQkJCX0KLQkJfSk7Ci0KLQkJZmlsdGVyVHlwZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gdXBkYXRlRm9udExpc3QoKTsKLQkJCQlpZiAoZmlsdGVyVHlwZS5nZXRTZWxlY3Rpb25JbmRleCgpID4gLTEpIHsKLQkJCQkJZmlsdGVyVHlwZVN0ciA9IGZpbHRlclR5cGUuZ2V0SXRlbShmaWx0ZXJUeXBlCi0JCQkJCQkJLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJCX0KLQkJCQlmaWx0ZXJUeXBlU3RyLnRyaW0oKTsKLQkJCQlpZiAoaGVscGVyICE9IG51bGwpIHsKLQkJCQkJaGVscGVyLnNldFBhdHRlcm4ocGF0dGVybik7Ci0JCQkJCWhlbHBlci5zZXRSZWdleFBhdHRlcm4ocmVnZXhQYXR0ZXJuKTsKLQkJCQkJaGVscGVyLnNldEZpbHRlclR5cGVTdHIoZmlsdGVyVHlwZVN0cik7Ci0JCQkJCWhlbHBlci5zZXRUYWJTdHIoZmlsdGVyVHlwZVN0cik7Ci0JCQkJfQotCQkJCS8vIGluaXRQcm92aWRlckZvclRhYnMoKTsKLQkJCQlyZWZyZXNoVHJlZVZpZXdlcigpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgc2VsZWN0aW9uZXZlbnQpIHsKLQkJCX0KLQkJfSk7Ci0JCWV4cGFuZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsJCQkJCi0JCQkJZXhwYW5kT3JDb2xsYXBzZSh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbGxhcHNlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWV4cGFuZE9yQ29sbGFwc2UoZmFsc2UpOwotCQkJfQotCQl9KTsKLQotCX0KLQotCXB1YmxpYyBBcnJheUxpc3QgZ2V0U2VsZWN0ZWRJdGVtcygpIHsKLQkJcmV0dXJuIHNlbGVjdGVkTGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFByb3ZpZGVyRm9yVGFicygpIHsKLQotCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklGaWx0ZXIpIHsKLQkJCQlpZihmaWx0ZXIgaW5zdGFuY2VvZiBJQ2F0ZWdvcnlGaWx0ZXIpewotCQkJCQkvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciBjb250ZW50Y2F0ZWdvcnkuCi0JCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTc0NTIKLQkJCQkJaGVscGVyLnNldENvbnRlbnRDYXRlZ29yeVRhYlN0cih0YWJTdHIpOwotCQkJCX0KLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUZpbHRlcikgZmlsdGVyKQotCQkJCQkJLnNldEhlbHBlcihoZWxwZXIpOwotCQkJfSBlbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcikgewotCQkJCSgoRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIpIGZpbHRlcikuc2V0SGVscGVyKGhlbHBlcik7Ci0JCQl9ZWxzZSBpZiAoZmlsdGVyIGluc3RhbmNlb2YgRXhQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yKSB7Ci0JCQkJKChFeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IpIGZpbHRlcikuc2V0SGVscGVyKGhlbHBlcik7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElQcm9jZXNzRmlsdGVyKSB7Ci0JCQlpZiAodGFiU3RyCi0JCQkJCS5lcXVhbHNJZ25vcmVDYXNlKEZpbHRlckNvbnN0YW50cy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUlMpKSB7Ci0JCQkJYWRhcHRlckZhY3RvcnkgPVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpOwotCQkJCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLQkJCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCQlsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgaW5kZXgpIHsKLQkJCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgaW5kZXgpIHsKLQkJCQkJCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0gZWxzZSBpZiAodGFiU3RyCi0JCQkJCS5lcXVhbHNJZ25vcmVDYXNlKEZpbHRlckNvbnN0YW50cy5ST0xFX0RFU0NSSVBUT1JTKSkgewotCQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcik7IAotCQkJCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJY29tcG9zZWRBZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSl7Ci0JCQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgaW5kZXgpIHsKLQkJCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgaW5kZXgpIHsKLQkJCQkJCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpOyAKLQkJCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0SXRlbXNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhpc3RpbmdFbGVtZW50cyhMaXN0IGxpc3QpIHsKLQkJdGhpcy5hbHJlYWR5U2VsZWN0ZWRMaXN0ID0gbGlzdDsKLQkJaWYgKGhlbHBlciAhPSBudWxsKSB7Ci0JCQloZWxwZXIuc2V0QWxyZWFkeVNlbGVjdGVkTGlzdChsaXN0KTsKLQkJfQotCX0KLQotCXB1YmxpYyBGaWx0ZXJIZWxwZXIgZ2V0SGVscGVyKCkgewotCQlyZXR1cm4gdGhpcy5oZWxwZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldEZpbHRlclR5cGVBcnJheSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBzZXRzIHRoZSBDb250ZW50UHJvdmlkZXIgdXNlZCBieSBUcmVlVmlld2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRQcm92aWRlcihJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0JCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5jb250ZW50UHJvdmlkZXIgPSBjb250ZW50UHJvdmlkZXI7Ci0JCXRoaXMuY29tcG9zZWRBZGFwdGVyRmFjdG9yeSA9IGNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoKLQkgKiBQYXNzaW5nIFN0cmluZ1tdIGFycmF5IGZpbGxzIHRoZSBGaWx0ZXJUeXBlIGxpc3QgaW4gZHJvcGRvd24gY29tYm8gYm94LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGVzKFN0cmluZ1tdIHN0cikgewotCQl0aGlzLnR5cGVzID0gc3RyOwotCX0KLQotCS8qCi0JICogc2V0IHRoZSBGaWx0ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQlpZiAoaGVscGVyICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLmZpbHRlciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUZpbHRlcikgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JRmlsdGVyKSB0aGlzLmZpbHRlcikKLQkJCQkJCS5zZXRIZWxwZXIoaGVscGVyKTsKLQkJCX0gZWxzZSBpZiAodGhpcy5maWx0ZXIgaW5zdGFuY2VvZiBEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcikgewotCQkJCSgoRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIpIHRoaXMuZmlsdGVyKS5zZXRIZWxwZXIoaGVscGVyKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBpbnB1dCkgewotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyTGFiZWwoU3RyaW5nIHZpZXdlckxhYmVsKSB7Ci0JCXRoaXMudmlld2VyTGFiZWwgPSB2aWV3ZXJMYWJlbDsKLQl9Ci0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoVHJlZVZpZXdlcigpewotCQl0cnkgewotCQkJLy8gVG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBvZiBmaWx0ZXIsIGZpbHRlciBmaXJzdCBhbmQgcmVzZXQgdmlzaWJsZSB0bwotCQkJLy8gdHJ1ZS5UaGlzIHdpbGwgYXZvaWQgdGhlIGZsaWNrZXJpbmcgaW4gVUkgYXQgdGltZSBvZiBmaWx0ZXJpbmcKLQkJCS8vIGVsZW1lbnRzIGluIHRoZSB0cmVlIHN0cnVjdHVyZQotCQkJCi0JCQl0cmVlVmlld2VyLmdldFRyZWUoKS5jbGVhckFsbCh0cnVlKTsKLQkJCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldFZpc2libGUoZmFsc2UpOwotCQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQl0cmVlVmlld2VyLmV4cGFuZEFsbCgpOwotCQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGV4cGFuZE9yQ29sbGFwc2UoYm9vbGVhbiBleHBhbmQpewotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJaWYoZXhwYW5kKXsKLQkJCXRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCX1lbHNlewotCQkJdHJlZVZpZXdlci5jb2xsYXBzZUFsbCgpOwotCQl9Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCQotCXByaXZhdGUgUGF0dGVybiBnZXRSZWdFeChTdHJpbmcgcGF0dGVybil7Ci0JCXRyeXsKLQkJCXJldHVybiBQYXR0ZXJuQ29uc3RydWN0b3IuY3JlYXRlUGF0dGVybihwYXR0ZXJuLCBmYWxzZSwgZmFsc2UpOwotCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotCQkJcmV0dXJuIFBhdHRlcm5Db25zdHJ1Y3Rvci5jcmVhdGVQYXR0ZXJuKEZpbHRlckNvbnN0YW50cy5BTllfU1RSSU5HLCBmYWxzZSwgZmFsc2UpOyAKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvTWV0aG9kQWRkSW1hZ2VEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9NZXRob2RBZGRJbWFnZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTU4MDZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9NZXRob2RBZGRJbWFnZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3MuQWRkSW1hZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLQotLyoqCi0gKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIGltYWdlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIEhUTUwKLSAqIDxpbWc+IHRhZyBpbiB0aGUgUmljaCBUZXh0IEVkaXRvci4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEFkZEltYWdlRGlhbG9nIGV4dGVuZHMgQWRkSW1hZ2VEaWFsb2cgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9IRUlHSFQgPSA2MDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1dJRFRIID0gNjAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSEVJR0hUID0gMjAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfV0lEVEggPSAyMDA7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudDsKLQotCXByaXZhdGUgRmlsZSBmaWxlVG9Db3B5OwotCi0JcHJpdmF0ZSBTdHJpbmcgZWxlbWVudExvYzsKLQotCXByaXZhdGUgaW50IGhlaWdodCA9IERFRkFVTFRfSEVJR0hUOwotCi0JcHJpdmF0ZSBpbnQgd2lkdGggPSBERUZBVUxUX1dJRFRIOwotCi0JcHJpdmF0ZSBTdHJpbmcgYWx0VGFnID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVGV4dCBoZWlnaHRUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IHdpZHRoVGV4dDsKLQotCXByaXZhdGUgVGV4dCBhbHRUYWdUZXh0OwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotCQkJaWYgKG9rQnV0dG9uICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoZXZlbnQud2lkZ2V0ID09IHVybFRleHQpIHsKLQkJCQkJCUZpbGUgdXJsRmlsZSA9IG5ldyBGaWxlKHVybFRleHQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCQkJCQlpZiAodXJsRmlsZS5pc0Fic29sdXRlKCkpIHsKLQkJCQkJCQlmaWxlVG9Db3B5ID0gdXJsRmlsZTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZmlsZVRvQ29weSA9IG5ldyBGaWxlKGVsZW1lbnRMb2MsIHVybFRleHQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZmlsZVRvQ29weS5pc0ZpbGUoKSAmJiBmaWxlVG9Db3B5LmNhblJlYWQoKSkgewotCQkJCQkJCS8vIFRyeSB0byBnZXQgdGhlIGltYWdlIGluZm8uCi0JCQkJCQkJc2V0SW1hZ2VJbmZvKGZpbGVUb0NvcHkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWhlaWdodCA9IEludGVnZXIucGFyc2VJbnQoaGVpZ2h0VGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJCQkJd2lkdGggPSBJbnRlZ2VyLnBhcnNlSW50KHdpZHRoVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZChmaWxlVG9Db3B5LmlzRmlsZSgpICYmIGZpbGVUb0NvcHkuY2FuUmVhZCgpICYmIGhlaWdodCA+IDAKLQkJCQkJCQkmJiB3aWR0aCA+IDApOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlmIHRoZSBhYm92ZSBmYWlscywgbGV0IHRoZSB1c2VyIGNsaWNrIG9rIGlmIHRoZSBmaWxlIGlzIHJlYWRhYmxlCi0JCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmlsZVRvQ29weS5pc0ZpbGUoKSAmJiBmaWxlVG9Db3B5LmNhblJlYWQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBzaGVsbC4KLQkgKiBAcGFyYW0gbWV0aG9kRWxlbWVudAotCSAqICAgICAgICAgICAgQSBtZXRob2QgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQWRkSW1hZ2VEaWFsb2coU2hlbGwgcGFyZW50LCBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5tZXRob2RFbGVtZW50ID0gbWV0aG9kRWxlbWVudDsKLQkJZWxlbWVudExvYyA9IFJlc291cmNlSGVscGVyLmdldEZvbGRlckFic29sdXRlUGF0aChtZXRob2RFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLkJhc2VEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUKLQkgKiAgICAgIHBhcmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQkoKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDQ7Ci0JCSgoR3JpZERhdGEpIHVybFRleHQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJdXJsVGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcih1cmxUZXh0TGlzdGVuZXIpOwotCQl1cmxUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCQlicm93c2VCdXR0b24ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoYnJvd3NlU2VsZWN0aW9uQWRhcHRlcik7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkJLmdldEFjdGl2ZVNoZWxsKCksIFNXVC5PUEVOKTsKLQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChSZXNvdXJjZUhlbHBlci5nZXRGb2xkZXJBYnNvbHV0ZVBhdGgobWV0aG9kRWxlbWVudCkpOwotCQkJCVN0cmluZyBhdHRhY2hGaWxlID0gZGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAoYXR0YWNoRmlsZSAhPSBudWxsICYmIGF0dGFjaEZpbGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaWFsb2cuZ2V0RmlsdGVyUGF0aCgpLCBkaWFsb2cKLQkJCQkJCQkJLmdldEZpbGVOYW1lKCkpOwotCQkJCQkJdXJsVGV4dC5zZXRUZXh0KGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlMYWJlbCBoZWlnaHRMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJaGVpZ2h0TGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5oZWlnaHRMYWJlbF90ZXh0KTsgCi0KLQkJaGVpZ2h0VGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWhlaWdodFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCWhlaWdodFRleHQuc2V0VGV4dCgiIiArIERFRkFVTFRfSEVJR0hUKTsgLy8kTk9OLU5MUy0xJAotCQloZWlnaHRUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCQlMYWJlbCBpbWFnZVNpemVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJewotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdkLndpZHRoSGludCA9IDMwMDsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWdkLnZlcnRpY2FsU3BhbiA9IDI7Ci0JCQlnZC5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCQlpbWFnZVNpemVMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJfQotCQlpbWFnZVNpemVMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmltYWdlU2l6ZUxhYmVsX3RleHQpOyAKLQotCQlMYWJlbCB3aWR0aExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl3aWR0aExhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMud2lkdGhMYWJlbF90ZXh0KTsgCi0KLQkJd2lkdGhUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJd2lkdGhUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQl3aWR0aFRleHQuc2V0VGV4dCgiIiArIERFRkFVTFRfV0lEVEgpOyAvLyROT04tTkxTLTEkCi0JCXdpZHRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJTGFiZWwgYWx0TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWFsdExhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWx0VGFnTGFiZWxfdGV4dCk7IAotCQlhbHRUYWdUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJewotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJCWFsdFRhZ1RleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCX0KLQkJYWx0VGFnVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQkJYWx0VGFnID0gYWx0VGFnVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgdG8gYmUgY29waWVkIHRvIGEgcmVzb3VyY2UgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBGaWxlIGdldEZpbGVUb0NvcHkoKSB7Ci0JCXJldHVybiBmaWxlVG9Db3B5OwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRJbWFnZUluZm8oU3RyaW5nIGltYWdlTmFtZSkgewotCQlGaWxlIGltYWdlRmlsZSA9IG5ldyBGaWxlKGltYWdlTmFtZSk7Ci0JCWlmIChpbWFnZUZpbGUuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSW1hZ2VEYXRhIGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoaW1hZ2VOYW1lKTsKLQkJCQloZWlnaHRUZXh0LnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaW1hZ2VEYXRhLmhlaWdodCkpOwotCQkJCXdpZHRoVGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKGltYWdlRGF0YS53aWR0aCkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBzZXQgZGVmYXVsdCBoZWlnaHQvd2lkdGggaWYgd2UgY2FuJ3Qgb2J0YWluIEltYWdlRGF0YQotCQkJCWhlaWdodFRleHQuc2V0VGV4dChTdHJpbmcudmFsdWVPZihERUZBVUxUX0hFSUdIVCkpOwotCQkJCXdpZHRoVGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKERFRkFVTFRfV0lEVEgpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWhlaWdodFRleHQuc2V0VGV4dChTdHJpbmcudmFsdWVPZihERUZBVUxUX0hFSUdIVCkpOwotCQkJd2lkdGhUZXh0LnNldFRleHQoU3RyaW5nLnZhbHVlT2YoREVGQVVMVF9XSURUSCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgaGVpZ2h0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCkgewotCQlyZXR1cm4gTWF0aC5taW4oTUFYX0hFSUdIVCwgTWF0aC5tYXgoMTAsIGhlaWdodCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIHdpZHRoLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0V2lkdGgoKSB7Ci0JCXJldHVybiBNYXRoLm1pbihNQVhfV0lEVEgsIE1hdGgubWF4KDEwLCB3aWR0aCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIEFMVCB0YWcuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbHRUYWcoKSB7Ci0JCXJldHVybiBhbHRUYWc7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIE9LIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL01ldGhvZEFkZExpbmtEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9NZXRob2RBZGRMaW5rRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2N2IyNWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL01ldGhvZEFkZExpbmtEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5BZGRMaW5rRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuTmV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLkFkZExpbmtEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIGxpbmsgdHlwZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBIVE1MIDxhPgotICogdGFnIGluIHRoZSBSaWNoIFRleHQgRWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kQWRkTGlua0RpYWxvZyBleHRlbmRzIEFkZExpbmtEaWFsb2cgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJTktfVVJMID0gMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSU5LX0ZJTEUgPSBMSU5LX1VSTCArIDE7Ci0KLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElOS19FTEVNRU5UX0xJTksgPSBMSU5LX1VSTCArIDI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElOS19FTEVNRU5UX0xJTktfV0lUSF9UWVBFID0gTElOS19VUkwgKyAzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJTktfRUxFTUVOVF9MSU5LX1dJVEhfVVNFUl9URVhUID0gTElOS19VUkwgKyA0OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRUxFTUVOVF9UWVBFX0xBQkVMUyA9IHsKLQkJCUxpYnJhcnlVSVJlc291cmNlcy5saW5rVG9VUkxfbmFtZSwKLQkJCUxpYnJhcnlVSVJlc291cmNlcy5saW5rVG9GaWxlX25hbWUsCi0JCQlMaWJyYXJ5VUlSZXNvdXJjZXMuZWxlbWVudExpbmtfbmFtZSwKLQkJCUxpYnJhcnlVSVJlc291cmNlcy5lbGVtZW50TGlua1dpdGhUeXBlX25hbWUsCi0JCQlMaWJyYXJ5VUlSZXNvdXJjZXMuZWxlbWVudExpbmtXaXRoVXNlclRleHRfbmFtZSB9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9MSU5LX0lOX05FV19XSU5ET1dfQVRUUklCVVRFID0gInRhcmdldD1cIl9ibGFua1wiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgcmljaFRleHQ7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudDsKLQkKLQlwcml2YXRlIFN0cmluZyBlbGVtZW50TG9jOwotCi0JcHJpdmF0ZSBDb21ibyBsaW5rVHlwZUNvbWJvOwotCi0JcHJpdmF0ZSBCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gb3BlbkxpbmtDaGVja2JveDsKLQotCXByaXZhdGUgaW50IGxpbmtUeXBlOwotCi0JcHJpdmF0ZSBib29sZWFuIG9wZW5MaW5rSW5OZXdXaW5kb3cgPSB0cnVlOwotCi0JcHJpdmF0ZSBGaWxlIGZpbGVUb0NvcHk7Ci0JCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotCQkJaWYgKG9rQnV0dG9uICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAobGlua1R5cGUgPT0gTElOS19GSUxFICYmIGV2ZW50LndpZGdldCA9PSB1cmxUZXh0KSB7Ci0JCQkJCQlGaWxlIHVybEZpbGUgPSBuZXcgRmlsZSh1cmxUZXh0LmdldFRleHQoKS50cmltKCkpOwotCQkJCQkJaWYgKHVybEZpbGUuaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJCQkJZmlsZVRvQ29weSA9IHVybEZpbGU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWZpbGVUb0NvcHkgPSBuZXcgRmlsZShlbGVtZW50TG9jLCB1cmxUZXh0LmdldFRleHQoKS50cmltKCkpOwotCQkJCQkJfQotCQkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZChmaWxlVG9Db3B5LmlzRmlsZSgpICYmIGZpbGVUb0NvcHkuY2FuUmVhZCgpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQodXJsVGV4dC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgc2hlbGwuCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBBIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBNZXRob2RBZGRMaW5rRGlhbG9nKFNoZWxsIHBhcmVudCwgSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHBhcmVudCwgcmljaFRleHQuZ2V0QmFzZVBhdGgoKSk7Ci0JCXRoaXMucmljaFRleHQgPSByaWNoVGV4dDsKLQkJdGhpcy5tZXRob2RFbGVtZW50ID0gcmljaFRleHQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQllbGVtZW50TG9jID0gUmVzb3VyY2VIZWxwZXIuZ2V0Rm9sZGVyQWJzb2x1dGVQYXRoKG1ldGhvZEVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3MuQmFzZURpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZQotCSAqICAgICAgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQotCQlMYWJlbCBsaW5rVHlwZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsaW5rVHlwZUxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWRkTGlua0RpYWxvZ19saW5rVHlwZSk7Ci0JCWxpbmtUeXBlTGFiZWwubW92ZUFib3ZlKHVybExhYmVsKTsKLQkJCi0JCXVybFRleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodXJsVGV4dE1vZGlmeUxpc3RlbmVyKTsKLQkJdXJsVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQotCQlsaW5rVHlwZUNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBjb21ib0dyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWNvbWJvR3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsaW5rVHlwZUNvbWJvLnNldExheW91dERhdGEoY29tYm9HcmlkRGF0YSk7Ci0JCWxpbmtUeXBlQ29tYm8uc2V0SXRlbXMoRUxFTUVOVF9UWVBFX0xBQkVMUyk7Ci0JCWxpbmtUeXBlQ29tYm8uc2V0VGV4dChFTEVNRU5UX1RZUEVfTEFCRUxTWzBdKTsKLQkJbGlua1R5cGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWxpbmtUeXBlID0gbGlua1R5cGVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCWJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKGxpbmtUeXBlICE9IExJTktfVVJMKTsKLQkJCQl1cmxEaXNwbGF5TmFtZUxhYmVsLnNldEVuYWJsZWQobGlua1R5cGUgPT0gTElOS19VUkwpOwotCQkJCXVybERpc3BsYXlOYW1lVGV4dC5zZXRFbmFibGVkKGxpbmtUeXBlID09IExJTktfVVJMKTsKLQkJCQlpZiAobGlua1R5cGUgPT0gTElOS19VUkwpIHsKLQkJCQkJdXJsRGlzcGxheU5hbWVUZXh0Ci0JCQkJCQkJLnNldFRleHQocmljaFRleHQuZ2V0U2VsZWN0ZWQoKS5nZXRUZXh0KCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXVybERpc3BsYXlOYW1lVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlvcGVuTGlua0NoZWNrYm94LnNldEVuYWJsZWQobGlua1R5cGUgPT0gTElOS19VUkwKLQkJCQkJCXx8IGxpbmtUeXBlID09IExJTktfRklMRSk7Ci0JCQkJdXJsVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChsaW5rVHlwZSAhPSBMSU5LX0ZJTEUpIHsKLQkJCQkJZmlsZVRvQ29weSA9IG51bGw7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJfSk7Ci0JCWxpbmtUeXBlQ29tYm8ubW92ZUFib3ZlKHVybExhYmVsKTsKLQotCQlicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5CUk9XU0VfQlVUVE9OX1RFWFQpOwotCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGxpbmtUeXBlID09IExJTktfRklMRSkgewotCQkJCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCQkJLmdldEFjdGl2ZVNoZWxsKCksIFNXVC5PUEVOKTsKLQkJCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoYmFzZVBhdGgpOwotCQkJCQlTdHJpbmcgYXR0YWNoRmlsZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJCWlmIChhdHRhY2hGaWxlICE9IG51bGwgJiYgYXR0YWNoRmlsZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlhbG9nLmdldEZpbHRlclBhdGgoKSwgZGlhbG9nCi0JCQkJCQkJCQkuZ2V0RmlsZU5hbWUoKSk7Ci0JCQkJCQkJdXJsVGV4dC5zZXRUZXh0KGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gTWV0aG9kRWxlbWVudCBsaW5rCi0JCQkJZWxzZSB7Ci0JCQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IEFkZExpbmtGaWx0ZXIoKSB7Ci0JCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQlpZihvYmogaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHJldHVybiBmYWxzZTsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIG1ldGhvZEVsZW1lbnQsCi0JCQkJCQkJRmlsdGVyQ29uc3RhbnRzLkFMTF9FTEVNRU5UUyk7Ci0JCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTKTsKLQkJCQkJZmQub3BlbigpOwotCQkJCQlBcnJheUxpc3Qgc2VsID0gZmQuZ2V0U2VsZWN0ZWRJdGVtcygpOwotCQkJCQlpZiAoc2VsLnNpemUoKSA+IDApIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIHNlbAotCQkJCQkJCQkuZ2V0KDApOwotCQkJCQkJU3RyaW5nIHVybCA9IG51bGw7Ci0JCQkJCQlTdHJpbmcgaHJlZiA9IFJlc291cmNlSGVscGVyLmdldFVybChzZWxlY3RlZEVsZW1lbnQsCi0JCQkJCQkJCW1ldGhvZEVsZW1lbnQsICJodG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChsaW5rVHlwZSA9PSBMSU5LX0VMRU1FTlRfTElOS19XSVRIX1VTRVJfVEVYVCkgewotCQkJCQkJCVN0cmluZyBsaW5rTmFtZSA9ICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KQotCQkJCQkJCQkJLmdldFNlbGVjdGVkKCkuZ2V0VGV4dCgpOwotCQkJCQkJCWlmIChsaW5rTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCQkJCQkJbGlua05hbWUgPSBzZWxlY3RlZEVsZW1lbnQuZ2V0TmFtZSgpOwotCQkJCQkJCXVybCA9IFJlc291cmNlSGVscGVyCi0JCQkJCQkJCQkuZ2V0RWxlbWVudExpbmsoc2VsZWN0ZWRFbGVtZW50LCBsaW5rTmFtZSwKLQkJCQkJCQkJCQkJImZpbGU6Ly8iICsgaHJlZik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJYm9vbGVhbiB3aXRoVHlwZSA9IChsaW5rVHlwZSA9PSBMSU5LX0VMRU1FTlRfTElOS19XSVRIX1RZUEUpID8gdHJ1ZQotCQkJCQkJCQkJOiBmYWxzZTsKLQkJCQkJCQl1cmwgPSBSZXNvdXJjZUhlbHBlcgotCQkJCQkJCQkJLmdldEVsZW1lbnRMaW5rKHNlbGVjdGVkRWxlbWVudCwgd2l0aFR5cGUsCi0JCQkJCQkJCQkJCSJmaWxlOi8vIiArIGhyZWYpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQl1cmxUZXh0LnNldFRleHQodXJsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZUJ1dHRvbi5tb3ZlQWJvdmUodXJsRGlzcGxheU5hbWVMYWJlbCk7Ci0KLQkJb3BlbkxpbmtDaGVja2JveCA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlHcmlkRGF0YSBjaGVja0JveEdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWNoZWNrQm94R3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlvcGVuTGlua0NoZWNrYm94LnNldExheW91dERhdGEoY2hlY2tCb3hHcmlkRGF0YSk7Ci0JCW9wZW5MaW5rQ2hlY2tib3guc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5vcGVuTGlua0NoZWNrYm94X3RleHQpOwotCQlvcGVuTGlua0NoZWNrYm94LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJb3BlbkxpbmtDaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlvcGVuTGlua0luTmV3V2luZG93ID0gb3BlbkxpbmtDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJdXJsRGlzcGxheU5hbWVUZXh0LnNldFRleHQocmljaFRleHQuZ2V0U2VsZWN0ZWQoKS5nZXRUZXh0KCkpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZSB0byBiZSBjb3BpZWQgdG8gYSByZXNvdXJjZSBmb2xkZXIuCi0JICovCi0JcHVibGljIEZpbGUgZ2V0RmlsZVRvQ29weSgpIHsKLQkJcmV0dXJuIGZpbGVUb0NvcHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGluayBzaG91bGQgYmUgb3BlbmVkIGluIGEgbmV3IGJyb3dzZXIKLQkgKiB3aW5kb3cuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0T3BlbkxpbmtJbk5ld1dpbmRvdygpIHsKLQkJcmV0dXJuIG9wZW5MaW5rSW5OZXdXaW5kb3c7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIE9LIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCVN0cmluZyB1cmwgPSB1cmxUZXh0LmdldFRleHQoKTsKLQkJaWYgKHVybCAhPSBudWxsICYmIHVybC5sZW5ndGgoKSA+IDApIHsKLQkJCWlmIChsaW5rVHlwZSA9PSBMSU5LX1VSTCkgewotCQkJCVN0cmluZyB1cmxEaXNwbGF5TmFtZSA9IHVybERpc3BsYXlOYW1lVGV4dC5nZXRUZXh0KCk7Ci0JCQkJaWYgKHVybERpc3BsYXlOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXVybERpc3BsYXlOYW1lID0gdXJsOwotCQkJCX0KLQkJCQlTdHJpbmcgZnVsbFVSTCA9ICI8YSBocmVmPVwiIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXVybAotCQkJCQkJKyAiXCIiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJKG9wZW5MaW5rSW5OZXdXaW5kb3cgPyAiICIgKyBPUEVOX0xJTktfSU5fTkVXX1dJTkRPV19BVFRSSUJVVEUgOiAiIikgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCSI+IiArIHVybERpc3BsYXlOYW1lICsgIjwvYT4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlsaW5rLnNldFVSTChmdWxsVVJMKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbGluay5zZXRVUkwodXJsKTsKLQkJCX0KLQkJfQotCi0JCS8vIFNldCB3aWRnZXQgdGV4dCB0byBibGFuayBzbyBzdXBlci5va1ByZXNzZWQgZG9lc24ndCBvdmVyd3JpdGUgdGhlCi0JCS8vIGFib3ZlLgotCQl1cmxUZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJdXJsVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Nb3ZlRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvTW92ZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWVmNTlkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Nb3ZlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlZpZXdIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5TdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kLk1vdmVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogRGlhbG9nIGZvciBtb3ZpbmcgTWV0aG9kRWxlbWVudCB3aXRoaW4gTWV0aG9kTGlicmFyeS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1vdmVEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQotCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGVsZW1lbnRzOwotCi0JLy8gcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQlwcml2YXRlIGJvb2xlYW4gbG9ja2VkVUkgPSBmYWxzZTsKLQotCS8vIFRoZSBwcm9ncmVzcyBtb25pdG9yCi0JcHJpdmF0ZSBQcm9ncmVzc01vbml0b3JQYXJ0IHByb2dyZXNzTW9uaXRvclBhcnQ7Ci0KLQlwcml2YXRlIEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKLQotCXByaXZhdGUgT2JqZWN0IGRlc3RpbmF0aW9uOwotCi0JcHJpdmF0ZSBDdXJzb3Igd2FpdEN1cnNvcjsKLQotCXByaXZhdGUgYm9vbGVhbiBtb3Zpbmc7Ci0KLQlwdWJsaWMgTW92ZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgQ29sbGVjdGlvbiBlbGVtZW50c1RvTW92ZSwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbikgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMuZWRpdGluZ0RvbWFpbiA9IGVkaXRpbmdEb21haW47Ci0KLQkJLy8gZmlsdGVyIG91dCB0aGUgcHJlZGVmaW5lZCBlbGVtZW50cyB0byBwcmV2ZW50IHRoZW0gZnJvbSBnZXR0aW5nIG1vdmVkCi0JCS8vCi0JCWVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50c1RvTW92ZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCSYmIFRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBlKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ19kZXN0aW5hdGlvbl90ZXh0KTsgCi0JCUdyaWREYXRhIGxheW91dERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORyk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0KLQkJdHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCWFkYXB0ZXJGYWN0b3J5KSk7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlhZGFwdGVyRmFjdG9yeSkpOwotCQl0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJLy8gdHJlZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKHRoaXMpOwotCi0JCUdyaWREYXRhIHNwZWMgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJewotCQkJc3BlYy53aWR0aEhpbnQgPSAzMDA7Ci0JCQlzcGVjLmhlaWdodEhpbnQgPSAzMDA7Ci0JCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKHNwZWMpOwotCQl9Ci0KLQkJdHJlZVZpZXdlci5zZXRJbnB1dChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCi0JCS8vIEluc2VydCBhIHByb2dyZXNzIG1vbml0b3IKLQkJR3JpZExheW91dCBwbWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXBtbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlwcm9ncmVzc01vbml0b3JQYXJ0ID0gY3JlYXRlUHJvZ3Jlc3NNb25pdG9yUGFydChjb21wb3NpdGUsIHBtbGF5b3V0KTsKLQkJcHJvZ3Jlc3NNb25pdG9yUGFydAotCQkJCS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcHJvZ3Jlc3NNb25pdG9yUGFydC5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQl3YWl0Q3Vyc29yID0gcGFyZW50LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUN1cnNvcigKLQkJCQlTV1QuQ1VSU09SX1dBSVQpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIFByb2dyZXNzTW9uaXRvclBhcnQgY3JlYXRlUHJvZ3Jlc3NNb25pdG9yUGFydCgKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUsIEdyaWRMYXlvdXQgcG1sYXlvdXQpIHsKLQkJcmV0dXJuIG5ldyBQcm9ncmVzc01vbml0b3JQYXJ0KGNvbXBvc2l0ZSwgcG1sYXlvdXQsIFNXVC5ERUZBVUxUKSB7Ci0JCQlTdHJpbmcgY3VycmVudFRhc2sgPSBudWxsOwotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5Qcm9ncmVzc01vbml0b3JQYXJ0I3NldEJsb2NrZWQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHNldEJsb2NrZWQoSVN0YXR1cyByZWFzb24pIHsKLQkJCQlzdXBlci5zZXRCbG9ja2VkKHJlYXNvbik7Ci0JCQkJaWYgKCFsb2NrZWRVSSkvLyBEbyBub3Qgc2hvdyBibG9ja2VkIGlmIHdlIGFyZSBsb2NraW5nIHRoZSBVSQotCQkJCQlnZXRCbG9ja2VkSGFuZGxlcigpLnNob3dCbG9ja2VkKGdldFNoZWxsKCksIHRoaXMsIHJlYXNvbiwKLQkJCQkJCQljdXJyZW50VGFzayk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQjY2xlYXJCbG9ja2VkKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgY2xlYXJCbG9ja2VkKCkgewotCQkJCXN1cGVyLmNsZWFyQmxvY2tlZCgpOwotCQkJCWlmICghbG9ja2VkVUkpLy8gRG8gbm90IHZsZWFyIGlmIHdlIG5ldmVyIHNldCBpdAotCQkJCQlnZXRCbG9ja2VkSGFuZGxlcigpLmNsZWFyQmxvY2tlZCgpOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5Qcm9ncmVzc01vbml0b3JQYXJ0I2JlZ2luVGFzayhqYXZhLmxhbmcuU3RyaW5nLAotCQkJICogICAgICBpbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGJlZ2luVGFzayhTdHJpbmcgbmFtZSwgaW50IHRvdGFsV29yaykgewotCQkJCXN1cGVyLmJlZ2luVGFzayhuYW1lLCB0b3RhbFdvcmspOwotCQkJCWN1cnJlbnRUYXNrID0gbmFtZTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuUHJvZ3Jlc3NNb25pdG9yUGFydCNzZXRUYXNrTmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBzZXRUYXNrTmFtZShTdHJpbmcgbmFtZSkgewotCQkJCXN1cGVyLnNldFRhc2tOYW1lKG5hbWUpOwotCQkJCWN1cnJlbnRUYXNrID0gbmFtZTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuUHJvZ3Jlc3NNb25pdG9yUGFydCNzdWJUYXNrKGphdmEubGFuZy5TdHJpbmcpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHN1YlRhc2soU3RyaW5nIG5hbWUpIHsKLQkJCQlzdXBlci5zdWJUYXNrKG5hbWUpOwotCQkJCS8vIElmIHdlIGhhdmVuJ3QgZ290IGFueXRoaW5nIHlldCB1c2UgdGhpcyB2YWx1ZSBmb3IgbW9yZQotCQkJCS8vIGNvbnRleHQKLQkJCQlpZiAoY3VycmVudFRhc2sgPT0gbnVsbCkKLQkJCQkJY3VycmVudFRhc2sgPSBuYW1lOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCW5ld1NoZWxsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ19tb3ZlX3RleHQpOyAKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWRlc3RpbmF0aW9uID0gVG5nVXRpbC51bndyYXAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI29rUHJlc3NlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlpZiAoZG9Nb3ZlKCkpIHsKLQkJCXN1cGVyLm9rUHJlc3NlZCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWREZXN0aW5hdGlvbigpIHsKLQkJLy8gcHJldmVudGluZyBtb3ZpbmcgZWxlbWVudHMgdG8gY2F0ZWdvcnkKLQkJLy8KLQkJaWYgKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBkbyBub3QgYWxsb3cgbW92aW5nIGludG8gU3RhbmRhcmQgQ2F0ZWdvcmllcwotCQlpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGNoZWNrIGNvbnRhaW5lcnMgZm9yIGNvbXBhdGlibGUgdHlwZXMgd2lsbCBub3Qgd29yayBpZiB3ZSB3YW50IHRvIG1vdmUgYSBzdWItYXJ0aWZhY3QKLQkJLy8gdG8gYSBjb250ZW50IHBhY2thZ2UKLQkJLy8KLQkJCi0vLwkJLy8gZG8gbm90IGFsbG93IG1vdmUgaWYgZGVzdGluYXRpb24gaXMgbm90IHRoZSBzYW1lIHR5cGUgYXMgZXZlcnkKLS8vCQkvLyBlbGVtZW50cycgZUNvbnRhaW5lcgotLy8JCU9iamVjdCByZWFsRGVzdCA9IGRlc3RpbmF0aW9uOwotLy8JCWlmIChkZXN0aW5hdGlvbiBpbnN0YW5jZW9mIFRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKSB7Ci0vLwkJCXJlYWxEZXN0ID0gKChUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikgZGVzdGluYXRpb24pCi0vLwkJCQkJLmdldFRhcmdldCgpOwotLy8JCX0KLS8vCQlpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcikgewotLy8JCQlyZWFsRGVzdCA9ICgoVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIpIGRlc3RpbmF0aW9uKS5nZXRUYXJnZXQoKTsKLS8vCQl9CQkKLS8vCQl0cnkgewotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0vLwkJCQlpZiAoZSBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLS8vCQkJCQlpZiAoIXJlYWxEZXN0LmdldENsYXNzKCkuaXNJbnN0YW5jZSgKLS8vCQkJCQkJCSgoRU9iamVjdCkgZSkuZUNvbnRhaW5lcigpKSkKLS8vCQkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0JCQotCQkvL0RvIG5vdCBhbGxvdyBtb3ZpbmcgaW50byBhIGRlc3RpbmF0aW9uIHdoaWNoIGlzIAotCQkvL2xvY2tlZCB0aHJvdWdoIGV4dGVuZGVkIGxvY2tlci4KLQkJaWYoVmlld0hlbHBlci5pc0V4dGVuZGVkTG9ja2VkKGRlc3RpbmF0aW9uKSl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0JCi0JCWlmIChEZXBlbmRlbmN5Q2hlY2tlci5uZXdDaGVjaykgewotCQkJaWYgKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJaWYgKCEgRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckZvck1vdmluZ1ZhcmlhYmlsaXR5RWxlbWVudAotCQkJCQkJKChWYXJpYWJpbGl0eUVsZW1lbnQpIGRlc3RpbmF0aW9uLCBlbGVtZW50cykpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0JCQkKLQkJfQotCQkvLyBTdWIgQXJ0aWZhY3QgY2lyY3VsYXIgY2hlY2sgY29kZQotCQllbHNlIGlmKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgQXJ0aWZhY3QpewotCQkJcmV0dXJuIERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJGb3JBcnRpZmFjdHMoKEFydGlmYWN0KWRlc3RpbmF0aW9uLCAKLQkJCQkJZWxlbWVudHMpOwotCQl9CQkKLQkJCi0JCUNvbW1hbmQgYWRkQ29tbWFuZCA9IEFkZENvbW1hbmQuY3JlYXRlKGVkaXRpbmdEb21haW4sIGRlc3RpbmF0aW9uLAotCQkJCW51bGwsIGVsZW1lbnRzKTsKLQkJYm9vbGVhbiByZXN1bHQ7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBhZGRDb21tYW5kLmNhbkV4ZWN1dGUoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWFkZENvbW1hbmQuZGlzcG9zZSgpOwotCQl9Ci0JCWlmICghcmVzdWx0KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJZGVzdGluYXRpb24gPSAoKFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyKSBkZXN0aW5hdGlvbikKLQkJCQkJLmdldFRhcmdldCgpOwotCQl9Ci0KLQkJLy8gSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoKEVPYmplY3QpCi0JCS8vIGRlc3RpbmF0aW9uLCBnZXRTaGVsbCgpKTsKLQkJLy8gaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJLy8gcmV0dXJuIHRydWU7Ci0JCS8vIH0KLQkJLy8gZWxzZSB7Ci0JCS8vIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5KAotCQkvLyBBdXRob3JpbmdVSVJlc291cmNlcy5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJUGx1Z2luLm1vdmVEaWFsb2cudGl0bGUiKSwKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQkvLyBzdGF0dXMpOwotCQkvLyByZXR1cm4gZmFsc2U7Ci0JCS8vIH0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGRvTW92ZSgpIHsKLQkJaWYgKGRlc3RpbmF0aW9uID09IG51bGwpIHsKLQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlOyAKLQkJCVN0cmluZyBwcm9ibGVtID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ19ub21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c7IAotCQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1vdmVEaWFsb2dfc2VsZWN0ZGVzdGluYXRpb25fdGV4dDsgCi0JCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpOwotCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgcHJvYmxlbSwgbXNnKTsgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCFpc1ZhbGlkRGVzdGluYXRpb24oKSkgewotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGU7IAotCQkJU3RyaW5nIHByb2JsZW0gPSBBdXRob3JpbmdVSVJlc291cmNlcy5Nb3ZlRGlhbG9nX2ludmFsaWRfbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZzsgCi0JCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ192YWxpZGRlc3RpbmF0aW9uX3RleHQ7IAotCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIHByb2JsZW0sIG1zZyk7IAotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoCi0JCQkJCShFT2JqZWN0KSBkZXN0aW5hdGlvbiwgZ2V0U2hlbGwoKSk7Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZTsgCi0JCQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1vdmVEaWFsb2dfY2Fubm90TW9kaWZ5RGVzdGluYXRpb247IAotCQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIHN0YXR1cyk7IAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCW1vdmluZyA9IHRydWU7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQkJc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCi0JCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJcHJvZ3Jlc3NNb25pdG9yUGFydC5zZXRWaXNpYmxlKHRydWUpOwotCQlwcm9ncmVzc01vbml0b3JQYXJ0Ci0JCQkJLmJlZ2luVGFzaygKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLk1vdmVEaWFsb2dfbW92aW5nX3RleHQsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IAotCQlNb3ZlT3BlcmF0aW9uIG1vdmVPcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBjcmVhdGUgY29tbWFuZAotCQkJLy8KLQkJCUNvbW1hbmQgY29tbWFuZCA9IEFkZENvbW1hbmQuY3JlYXRlKGVkaXRpbmdEb21haW4sIGRlc3RpbmF0aW9uLAotCQkJCQludWxsLCBlbGVtZW50cyk7Ci0KLQkJCW1vdmVPcCA9IG5ldyBNb3ZlT3BlcmF0aW9uKGNvbW1hbmQsIHByb2dyZXNzTW9uaXRvclBhcnQsIHNoZWxsKTsKLQkJCW1vdmVPcC5ydW4oKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vdmluZyA9IGZhbHNlOwotCQkJcHJvZ3Jlc3NNb25pdG9yUGFydC5kb25lKCk7Ci0KLQkJCS8vIGNsZWFyIGN1cnNvcgotCQkJaWYgKHNoZWxsICE9IG51bGwgJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJCX0KLQkJfQotCi0JCWlmIChtb3ZlT3AgIT0gbnVsbCkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBtb3ZlT3AuZ2V0U3RhdHVzKCk7Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaWFsb2dzX01vdmVEaWFsb2dfZXJyb3JUaXRsZTsgCi0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaWFsb2dzX01vdmVEaWFsb2dfZXJyb3JNZXNzYWdlOyAKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJdGl0bGUsIG1lc3NhZ2UsIHN0YXR1cyk7Ci0JCQkJaWYgKG1vdmVPcC5yZWxvYWROZWVkZWQoKSkgewotCQkJCQlWaWV3SGVscGVyLnJlbG9hZEN1cnJlbnRMaWJyYXJ5KHNoZWxsLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJaWYgKG1vdmluZykKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvT3BlbkNvbmZpZ0RpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL09wZW5Db25maWdEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjMzg4OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvT3BlbkNvbmZpZ0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuQ29uZmlnRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0NPTkZJR19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuT3BlbkNvbmZpZ0RpYWxvZ25ld2NvbmZpZ190ZXh0OyAKLQotCS8vIENvbWJvIGNvbWJvX2NvbmZpZ3M7Ci0JU3RyaW5nIHNlZWxjdGVkTmFtZTsKLQotCUJ1dHRvbltdIGN0cmxfY29uZmlncyA9IG51bGw7Ci0KLQlUZXh0IGN0cmxfbmV3X2NvbmZpZyA9IG51bGw7Ci0KLQlwdWJsaWMgT3BlbkNvbmZpZ0RpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGFyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWZpbmFsIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWFyZWEuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQl7Ci0JCQlHcm91cCBnID0gbmV3IEdyb3VwKGFyZWEsIFNXVC5OT05FKTsKLQkJCXsKLQkJCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJCWcuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJCWcuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQl9Ci0KLQkJCVN0cmluZ1tdIG5hbWVzID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lcygKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJCWlmIChuYW1lcyAhPSBudWxsKSB7Ci0JCQkJY3RybF9jb25maWdzID0gbmV3IEJ1dHRvbltuYW1lcy5sZW5ndGggKyAxXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGN0cmxfY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJCQlTdHJpbmcgbmFtZSA9IE5FV19DT05GSUdfVEVYVDsKLQkJCQkJaWYgKGkgPCBuYW1lcy5sZW5ndGgpIHsKLQkJCQkJCW5hbWUgPSBuYW1lc1tpXTsKLQkJCQkJfQotCQkJCQljdHJsX2NvbmZpZ3NbaV0gPSBuZXcgQnV0dG9uKGcsIFNXVC5SQURJTyk7Ci0JCQkJCWN0cmxfY29uZmlnc1tpXS5zZXRUZXh0KG5hbWUpOwotCQkJCQl7Ci0JCQkJCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgKLQkJCQkJCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCQkJCWN0cmxfY29uZmlnc1tpXS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJY3RybF9uZXdfY29uZmlnID0gbmV3IFRleHQoZywgU1dULkJPUkRFUik7Ci0JCQl7Ci0JCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCQkJY3RybF9uZXdfY29uZmlnLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJfQotCi0JCQkvLyBzZXQgaW1hZ2UgYW5kIHRpdGxlCi0JCQlzdXBlcgotCQkJCQkuZ2V0U2hlbGwoKQotCQkJCQkuc2V0VGV4dCgKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5PcGVuQ29uZmlnRGlhbG9nb3BlbmNvbmZpZ190ZXh0KTsgCi0JCX0KLQotCQlyZXR1cm4gYXJlYTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJc2VlbGN0ZWROYW1lID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdHJsX2NvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjdHJsX2NvbmZpZ3NbaV0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlzZWVsY3RlZE5hbWUgPSBjdHJsX2NvbmZpZ3NbaV0uZ2V0VGV4dCgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKHNlZWxjdGVkTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoc2VlbGN0ZWROYW1lLmVxdWFscyhORVdfQ09ORklHX1RFWFQpKSB7Ci0JCQlzZWVsY3RlZE5hbWUgPSBjdHJsX25ld19jb25maWcuZ2V0VGV4dCgpOwotCQl9Ci0KLQkJaWYgKHNlZWxjdGVkTmFtZSA9PSBudWxsIHx8IHNlZWxjdGVkTmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0aW9uKCkgewotCQlpZiAoc3VwZXIub3BlbigpID09IERpYWxvZy5PSykgewotCQkJcmV0dXJuIHNlZWxjdGVkTmFtZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvU2VjdGlvbnNPcmRlckRpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1NlY3Rpb25zT3JkZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY0ZDYwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvU2VjdGlvbnNPcmRlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Nb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlNlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLQotCi0vKioKLSAqIERpYWxvZyB0byBvcmRlciB0aGUge0BsaW5rIFN0ZXB9cy4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VjdGlvbnNPcmRlckRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBiYXNlQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF91cCwgY3RybF9kb3duOwotCi0JcHJpdmF0ZSBUYWJsZSBjdHJsX3N0ZXBzOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBzdGVwc1RhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBTZWN0aW9uTGlzdCBhbGxTZWN0aW9uczsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgc3RlcHNWaWV3ZXJDb250ZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIHN0ZXBzVmlld2VyTGFiZWxQcm92aWRlcjsKLQotCS8vIHByaXZhdGUgVGFzayBjb250ZW50RWxlbWVudDsKLQlwcml2YXRlIENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50OwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGl0bGU7Ci0KLQlwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBjb21tYW5kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSA8Y29kZT5BZHZhbmNlZFNlYXJjaERpYWxvZzwvY29kZT4gZ2l2ZWIgdGhlIHBhcmVudCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgU2VjdGlvbnNPcmRlckRpYWxvZyhTaGVsbCBwYXJlbnQsIENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50LAotCQkJSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWFuYWdlciwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwKLQkJCVN0cmluZyBsYWJlbCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCXRoaXMuYWN0aW9uTWFuYWdlciA9IGFjdGlvbk1hbmFnZXI7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQlhbGxTZWN0aW9ucyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQliYXNlQ29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlmaW5hbCBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSA0OwotCQliYXNlQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJYmFzZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCBtZXNzYWdlLCA0KTsKLQotCQkvLyBFbXB0eSBsaW5lCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgNCk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCAiICIsIDEpOyAvLyROT04tTkxTLTEkCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsIGxhYmVsLCAzKTsKLQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCAiICIsIDEpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfc3RlcHMgPSBuZXcgVGFibGUoYmFzZUNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNDAwOwotCQkJY3RybF9zdGVwcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWluaXRQcm92aWRlcnMoKTsKLQotCQlzdGVwc1RhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfc3RlcHMpOwotCQlzdGVwc1RhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihzdGVwc1ZpZXdlckNvbnRlbnRQcm92aWRlcik7Ci0JCXN0ZXBzVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihzdGVwc1ZpZXdlckxhYmVsUHJvdmlkZXIpOwotCi0JCUNvbXBvc2l0ZSBvcmRlckJ1dHRvblBhbmUgPSBuZXcgQ29tcG9zaXRlKGJhc2VDb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJb3JkZXJCdXR0b25QYW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJb3JkZXJCdXR0b25QYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJfQotCi0JCWN0cmxfdXAgPSBjcmVhdGVCdXR0b24ob3JkZXJCdXR0b25QYW5lLCBBdXRob3JpbmdVSVRleHQuVVBfQlVUVE9OX1RFWFQpOwotCQljdHJsX3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWN0cmxfZG93biA9IGNyZWF0ZUJ1dHRvbihvcmRlckJ1dHRvblBhbmUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRPV05fQlVUVE9OX1RFWFQpOwotCQljdHJsX2Rvd24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCS8vIEVtcHR5IGxpbmUKLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgIiAiLCA0KTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxpbmUoYmFzZUNvbXBvc2l0ZSwgNCk7Ci0KLQkJc3VwZXIuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQkJbG9hZERhdGEoKTsKLQotCQlyZXR1cm4gYmFzZUNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTGluZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbmNvbCkgewotCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMCi0JCQkJfCBTV1QuQk9MRCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbmNvbDsKLQkJbGluZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0KLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgbkNvbCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbkNvbDsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkaWFsb2cgYnV0dG9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBPSyBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0JCQkJdHJ1ZSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBDYW5jZWwgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UHJvdmlkZXJzKCkgewotCQlzdGVwc1ZpZXdlckNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCWlmIChhbGxTZWN0aW9ucyA9PSBudWxsKSB7Ci0JCQkJCWFsbFNlY3Rpb25zID0gbmV3IFNlY3Rpb25MaXN0KGNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVNlY3Rpb25MaXN0LlNURVBTX0ZPUl9FTEVNRU5UX0FORF9QQVJFTlRTKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGFsbFNlY3Rpb25zLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQlzdGVwc1ZpZXdlckxhYmVsUHJvdmlkZXIgPSBuZXcgVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gIWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkKLQkJCQkJCS5jb250YWlucyhlbGVtZW50KTsKLQkJCX0KLQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3RlcHNUYWJsZVZpZXdlcgotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAKLQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMAotCQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpCi0JCQkJCQkJCQkmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCX0gZWxzZQotCQkJCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCQkJCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkKLQkJCQkJCQkJCSYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQl9IGVsc2UKLQkJCQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJY3RybF91cC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQotCQkJCUFycmF5TGlzdCBtb3ZlVXBJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlVXBJdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQlNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQgY21kID0gbmV3IE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCgKLQkJCQkJCWNvbnRlbnRFbGVtZW50LCBtb3ZlVXBJdGVtcywgYWxsU2VjdGlvbnMsIDEpOwotCQkJCWFjdGlvbk1hbmFnZXIuZXhlY3V0ZShjbWQpOwotCQkJCWNvbW1hbmRzLmFkZChjbWQpOwotCi0JCQkJc3RlcHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWlmIChzdGVwc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZG93bi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlBcnJheUxpc3QgbW92ZURvd25JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlRG93bkl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCU1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCBjbWQgPSBuZXcgTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kKAotCQkJCQkJY29udGVudEVsZW1lbnQsIG1vdmVEb3duSXRlbXMsIGFsbFNlY3Rpb25zLCAwKTsKLQkJCQlhY3Rpb25NYW5hZ2VyLmV4ZWN1dGUoY21kKTsKLQkJCQljb21tYW5kcy5hZGQoY21kKTsKLQotCQkJCXN0ZXBzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMAotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIGluaXRpYWwgZGF0YSBmcm9tIG1vZGVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWREYXRhKCkgewotCQlzdGVwc1RhYmxlVmlld2VyLnNldElucHV0KGNvbnRlbnRFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJYWxsU2VjdGlvbnMuYXBwbHkoKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2FuY2VsUHJlc3NlZCgpIHsKLQkJaWYgKCFjb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSBjb21tYW5kcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCU9iamVjdCBjbWQgPSBjb21tYW5kcy5nZXQoaSk7Ci0JCQkJaWYgKGNtZCBpbnN0YW5jZW9mIE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCkgewotCQkJCQkoKE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCkgY21kKS51bmRvKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1N3aXRjaENvbmZpZ0RpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1N3aXRjaENvbmZpZ0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGRhOGE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Td2l0Y2hDb25maWdEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5CcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLS8qKgotICogUHJvbXB0cyB0aGUgdXNlciB0byBzd2l0Y2ggdGhlIGN1cnJlbnQgQ29uZmlndXJhdGlvbiB0byBhIHJlY29tbWVuZGVkCi0gKiBDb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3dpdGNoQ29uZmlnRGlhbG9nIHsKLQotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0JCi0JcHJpdmF0ZSBJRWRpdG9yUGFydCBwYXJ0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgc2hlbGwuCi0JICogQHBhcmFtIHJlY29tbWVuZGVkQ29uZmlnCi0JICogICAgICAgICAgICBUaGUgcmVjb21tZW5kZWQgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3dpdGNoQ29uZmlnRGlhbG9nKFNoZWxsIHNoZWxsLCBJRWRpdG9yUGFydCBwYXJ0KSB7Ci0JCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQkJdGhpcy5wYXJ0ID0gcGFydDsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZGlhbG9nIGlmZiB0aGUgZ2l2ZW4gcmVjb21tZW5kZWRDb25maWcgaXMgZGlmZmVyZW50IHRoYW4gdGhlCi0JICogY3VycmVudGx5IHNlbGVjdGVkIGNvbmZpZwotCSAqIAotCSAqIHJldHVybnMgSURpYWxvZ0NvbnN0YW50cy5PS19JRCBpZiBkaWFsb2cgd2Fzbid0IHNob3duLCBvciBpZiBjb25maWcgd2FzCi0JICogc3dpdGNoZWQgcmV0dXJucyBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCBpZiBkaWFsb2cgd2FzIHNob3duIGFuZCB1c2VyCi0JICogZGlkIG5vdCBjbGljayBZZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbCAhPSBudWxsID8gc2hlbGwuZ2V0RGlzcGxheSgpIDogbnVsbDsKLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkgewotCQkJZGlzcGxheSA9IE1zZ0JveC5nZXREaXNwbGF5KCk7Ci0JCX0KLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkgewotCQkJLy8gY291bGQgbm90IGdldCBkaXNwbGF5Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCU9iamVjdCBvYmogPSBudWxsOwotCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKSB7Ci0JCQkJCWlmICgoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcilwYXJ0KS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgaW5wdXQgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSAoKElFZGl0b3JQYXJ0KSBwYXJ0KQotCQkJCQkJCS5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCQlpZiAoaW5wdXQuZ2V0U3VwcHJlc3Npb24oKS5nZXRQcm9jZXNzKCkgIT0gbnVsbCkgewotCQkJCQkJb2JqID0gaW5wdXQuZ2V0U3VwcHJlc3Npb24oKS5nZXRQcm9jZXNzKCkuZUNvbnRhaW5lcigpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChwYXJ0IGluc3RhbmNlb2YgUHJvY2Vzc0VkaXRvcikgewotCQkJCQlpZiAoKChQcm9jZXNzRWRpdG9yKXBhcnQpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCW9iaiA9IEVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5nZXRNZXRob2RFZGl0b3JJbnB1dChwYXJ0KTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiByZWNvbW1lbmRlZENvbmZpZyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqKS5nZXRQcm9jZXNzKCkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCQkJU3RyaW5nIHN3aXRjaENvbmZpZ1ByZWYgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRTd2l0Y2hDb25maWcoKTsKLQkJCQkJaWYgKE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLk5FVkVSLmVxdWFscyhzd2l0Y2hDb25maWdQcmVmKSkgewotCQkJCQkJLy8gQ2FsbCB0aGlzIHRvIHJlZnJlc2ggYWN0aXZlIHBhcnQgaWYgbmVlZGVkLgotCQkJCQkJLy8gVE9ETzogUmV2aWV3IGltcGxlbWVudGF0aW9uLgotLy8JCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKAotLy8JCQkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLS8vCQkJCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpICE9IHJlY29tbWVuZGVkQ29uZmlnKSB7Ci0JCQkJCQlmaW5hbCBTdHJpbmcgY29uZmlnTmFtZSA9IHJlY29tbWVuZGVkQ29uZmlnLmdldE5hbWUoKTsKLQkJCQkJCWlmIChNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5QUk9NUFQuZXF1YWxzKHN3aXRjaENvbmZpZ1ByZWYpKSB7Ci0JCQkJCQkJTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUgZGlhbG9nID0gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUKLQkJCQkJCQkub3Blblllc05vUXVlc3Rpb24oc2hlbGwsCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuc3dpdGNoQ29uZmlnRGlhbG9nX3RpdGxlLAotCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnN3aXRjaENvbmZpZ0RpYWxvZ190ZXh0LAotCQkJCQkJCQkJCQljb25maWdOYW1lKSwKLQkJCQkJCQkJCW51bGwsIGZhbHNlLCBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSwKLQkJCQkJCQkJCUxpYnJhcnlVSVByZWZlcmVuY2VzLmdldFN3aXRjaENvbmZpZ1ByZWZlcmVuY2VLZXkoKSk7Ci0JCQkJCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQpIHsKLQkJCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZQotCQkJCQkJCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwKLQkJCQkJCQkJCQkJCWNvbmZpZ05hbWUpOwotCQkJCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKAotCQkJCQkJCQkJCWNvbmZpZyk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gQ2FsbCB0aGlzIHRvIHJlZnJlc2ggYWN0aXZlIHBhcnQgaWYgbmVlZGVkLgotCQkJCQkJCQkvLyBUT0RPOiBSZXZpZXcgaW1wbGVtZW50YXRpb24uCi0JCQkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oCi0JCQkJCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCX0gZWxzZSBpZiAoTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuQUxXQVlTLmVxdWFscyhzd2l0Y2hDb25maWdQcmVmKSkgewotCQkJCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBjb25maWdOYW1lKTsKLQkJCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKAotCQkJCQkJCQkJY29uZmlnKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW4oU2hlbGwgc2hlbGwsIElFZGl0b3JQYXJ0IHBhcnQpIHsKLQkJU3dpdGNoQ29uZmlnRGlhbG9nIGRpYWxvZyA9IG5ldyBTd2l0Y2hDb25maWdEaWFsb2coRGlzcGxheQotCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgKElFZGl0b3JQYXJ0KXBhcnQpOwotCQlkaWFsb2cuZXhlY3V0ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1VzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1VzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODE4ZWUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc0d1aWRhbmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5HdWlkYW5jZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIERpYWxvZyB0byBhc3NpZ24gdXNlciBkZWZpbmVkIGRpYWdyYW0gdG8gcHJvY2VzcyBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwcml2YXRlIEJ1dHRvbiBhc3NpZ25BREltYWdlQnV0dG9uLCBhc3NpZ25BRERJbWFnZUJ1dHRvbiwKLQkJCWFzc2lnbldQREltYWdlQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gY2xlYXJBREltYWdlQnV0dG9uLCBjbGVhckFEREltYWdlQnV0dG9uLAotCQkJY2xlYXJXUERJbWFnZUJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIHVzZUFESW1hZ2VCdXR0b24sIHVzZUFEREltYWdlQnV0dG9uLCB1c2VXUERJbWFnZUJ1dHRvbjsKLQotCXByaXZhdGUgVGV4dCBhZEltYWdlVGV4dCwgYWRkSW1hZ2VUZXh0LCB3cGRJbWFnZVRleHQ7Ci0KLQlwcml2YXRlIElFZGl0b3JQYXJ0IGVkaXRvcjsKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBhcmVhOwotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGFiTmFtZSA9IEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIFN1cHBvcnRpbmdNYXRlcmlhbCBhY3Rpdml0eURpYWdyYW0sIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSwKLQkJCXdwZERpYWdyYW07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgYnV0dG9uV2lkdGhIaW50ID0gNjA7Ci0JCi0JcHJpdmF0ZSBTZXQgZXhpc3RpbmdMaXN0OwotCQotCXByaXZhdGUgYm9vbGVhbiBpc1dyYXBwZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGVkaXRvcgotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gaXNXcmFwcGVkCi0JICovCi0JcHVibGljIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZyhTaGVsbCBwYXJlbnQsIElFZGl0b3JQYXJ0IGVkaXRvciwKLQkJCUFjdGl2aXR5IGFjdGl2aXR5LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiBpc1dyYXBwZWQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQotCQl0aGlzLmVkaXRvciA9IGVkaXRvcjsKLQkJdGhpcy5pc1dyYXBwZWQgPSBpc1dyYXBwZWQ7Ci0JCQotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JCXRoaXMuZmlsdGVyID0gbmV3IFByb2Nlc3NHdWlkYW5jZUZpbHRlcihjb25maWcsIG51bGwsIHRhYk5hbWUpIHsKLQkJCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gKChHdWlkYW5jZUl0ZW1Qcm92aWRlcikgb2JqKS5nZXRUZXh0KG9iaik7Ci0JCQkJCWlmIChuYW1lCi0JCQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTKQotCQkJCQkJCSYmIAotCQkJCQkJCSEoKEd1aWRhbmNlSXRlbVByb3ZpZGVyKSBvYmopLmdldENoaWxkcmVuKG9iaikKLQkJCQkJCQkJCS5pc0VtcHR5KCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQkJCi0JCWV4aXN0aW5nTGlzdCA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJYXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJZmluYWwgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoNCwgZmFsc2UpOwotCQlhcmVhLnNldExheW91dChncmlkTGF5b3V0KTsKLQotCQkvLyBVc2UgQUQgSW1hZ2UgZm9yIHB1Ymxpc2hpbmcKLQkJTGFiZWwgYmxhbmtMYWJlbCA9IG5ldyBMYWJlbChhcmVhLCBTV1QuTk9ORSk7Ci0JCWJsYW5rTGFiZWwuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCQl1c2VBREltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuQ0hFQ0spOwotCQl1c2VBREltYWdlQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZUFESW1hZ2UpOyAKLQkJR3JpZERhdGEgYnV0dG9uR0QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJYnV0dG9uR0QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQl1c2VBREltYWdlQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uR0QpOwotCi0JCS8vIEFzc2lnbiBhY3Rpdml0eSBkaWFncmFtIGltYWdlCi0JCUxhYmVsIGFMYWJlbCA9IG5ldyBMYWJlbChhcmVhLCBTV1QuTk9ORSk7Ci0JCWFMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hZEltYWdlKTsgCi0KLQkJYWRJbWFnZVRleHQgPSBuZXcgVGV4dChhcmVhLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORwotCQkJCXwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2Qud2lkdGhIaW50ID0gMzAwOwotCQlhZEltYWdlVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlhc3NpZ25BREltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuTk9ORSk7Ci0JCWFzc2lnbkFESW1hZ2VCdXR0b24KLQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYXNzaWduQnV0dG9uKTsgCi0JCUdyaWREYXRhIGJ1dHRvbkdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORwotCQkJCXwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJYnV0dG9uR3JpZERhdGEud2lkdGhIaW50ID0gYnV0dG9uV2lkdGhIaW50OwotCQlhc3NpZ25BREltYWdlQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uR3JpZERhdGEpOwotCi0JCWNsZWFyQURJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24oYXJlYSwgU1dULk5PTkUpOwotCQljbGVhckFESW1hZ2VCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5jbGVhckJ1dHRvbl90ZXh0KTsgCi0JCWNsZWFyQURJbWFnZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkdyaWREYXRhKTsKLQotCQkvLyBVc2UgQUREIEltYWdlIGZvciBwdWJsaXNoaW5nCi0JCWJsYW5rTGFiZWwgPSBuZXcgTGFiZWwoYXJlYSwgU1dULk5PTkUpOwotCQlibGFua0xhYmVsLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJdXNlQURESW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uKGFyZWEsIFNXVC5DSEVDSyk7Ci0JCXVzZUFEREltYWdlQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZUFEREltYWdlKTsgCi0JCWJ1dHRvbkdEID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWJ1dHRvbkdELmhvcml6b250YWxTcGFuID0gMzsKLQkJdXNlQURESW1hZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25HRCk7Ci0KLQkJLy8gQXNzaWduIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtIGltYWdlCi0JCWFMYWJlbCA9IG5ldyBMYWJlbChhcmVhLCBTV1QuTk9ORSk7Ci0JCWFMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hZGRJbWFnZSk7IAotCi0JCWFkZEltYWdlVGV4dCA9IG5ldyBUZXh0KGFyZWEsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJYWRkSW1hZ2VUZXh0LnNldExheW91dERhdGEoZ2QpOwotCi0JCWFzc2lnbkFEREltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuTk9ORSk7Ci0JCWFzc2lnbkFEREltYWdlQnV0dG9uCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2Fzc2lnbkJ1dHRvbik7IAotCQlhc3NpZ25BRERJbWFnZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkdyaWREYXRhKTsKLQotCQljbGVhckFEREltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuTk9ORSk7Ci0JCWNsZWFyQURESW1hZ2VCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5jbGVhckJ1dHRvbl90ZXh0KTsgCi0JCWNsZWFyQURESW1hZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25HcmlkRGF0YSk7Ci0KLQkJLy8gVXNlIFdQRCBJbWFnZSBmb3IgcHVibGlzaGluZwotCQlibGFua0xhYmVsID0gbmV3IExhYmVsKGFyZWEsIFNXVC5OT05FKTsKLQkJYmxhbmtMYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXVzZVdQREltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuQ0hFQ0spOwotCQl1c2VXUERJbWFnZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VXUERJbWFnZSk7IAotCQlidXR0b25HRCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcgKTsKLQkJYnV0dG9uR0QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQl1c2VXUERJbWFnZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkdEKTsKLQotCQkvLyBBc3NpZ24gd29yayBwcm9kdWN0IGRlcGVuZGVuY3kgZGlhZ3JhbSBpbWFnZQotCQlhTGFiZWwgPSBuZXcgTGFiZWwoYXJlYSwgU1dULk5PTkUpOwotCQlhTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfd3BkSW1hZ2UpOyAKLQotCQl3cGRJbWFnZVRleHQgPSBuZXcgVGV4dChhcmVhLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCXdwZEltYWdlVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlhc3NpZ25XUERJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24oYXJlYSwgU1dULk5PTkUpOwotCQlhc3NpZ25XUERJbWFnZUJ1dHRvbgotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hc3NpZ25CdXR0b24pOyAKLQkJYXNzaWduV1BESW1hZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25HcmlkRGF0YSk7Ci0KLQkJY2xlYXJXUERJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24oYXJlYSwgU1dULk5PTkUpOwotCQljbGVhcldQREltYWdlQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2xlYXJCdXR0b25fdGV4dCk7IAotCQljbGVhcldQREltYWdlQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uR3JpZERhdGEpOwotCi0JCS8vIGxvYWREYXRhCi0JCWxvYWREYXRhKCk7Ci0JCQotCQkvLyBkaXNhYmxlQ29udHJvbHMKLQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQoYWN0aXZpdHkpIHx8IGlzV3JhcHBlZCl7Ci0JCQlkaXNhYmxlQ29udHJvbHMoKTsKLQkJfQotCi0JCS8vIGFkZCBsaXN0ZW5lcnMKLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJLy8gc2V0IGltYWdlIGFuZCB0aXRsZQotCQlzdXBlcgotCQkJCS5nZXRTaGVsbCgpCi0JCQkJLnNldFRleHQoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdGl0bGUpOyAKLQotCQlyZXR1cm4gYXJlYTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNhYmxlIGNvbnRyb2xzCi0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzYWJsZUNvbnRyb2xzKCkKLQl7Ci0JCXVzZUFESW1hZ2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXVzZUFEREltYWdlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl1c2VXUERJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCWFzc2lnbkFESW1hZ2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWFzc2lnbkFEREltYWdlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlhc3NpZ25XUERJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCWNsZWFyQURJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY2xlYXJBRERJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY2xlYXJXUERJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZHMgaW5pdGlhbCBkYXRhCi0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERhdGEoKSB7CQkKLQkJLy8JIGxvYWQgZXhpc3Rpbmcgc3VwcG9ydGluZyBtYXRlcmlhbHMgbGlzdAotCQlleGlzdGluZ0xpc3QuYWRkQWxsKGFjdGl2aXR5LmdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKSk7Ci0KLQkJCi0JCURpYWdyYW1JbmZvIGluZm8gPSBuZXcgRGlhZ3JhbUluZm8oYWN0aXZpdHkpOwotCQlpZiAoaW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKSAhPSBudWxsKSB7Ci0JCQlhZEltYWdlVGV4dC5zZXRUZXh0KFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChpbmZvCi0JCQkJCS5nZXRBY3Rpdml0eURpYWdyYW0oKSkpOwotCQkJYWN0aXZpdHlEaWFncmFtID0gaW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKTsKLQkJCQotCQkJZXhpc3RpbmdMaXN0LmFkZChhY3Rpdml0eURpYWdyYW0pOwotCQl9Ci0JCWlmIChpbmZvLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpICE9IG51bGwpIHsKLQkJCWFkZEltYWdlVGV4dC5zZXRUZXh0KFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChpbmZvCi0JCQkJCS5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKSkpOwotCQkJYWN0aXZpdHlEZXRhaWxEaWFncmFtID0gaW5mby5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKTsKLQkJCQotCQkJZXhpc3RpbmdMaXN0LmFkZChhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQl9Ci0JCWlmIChpbmZvLmdldFdQRERpYWdyYW0oKSAhPSBudWxsKSB7Ci0JCQl3cGRJbWFnZVRleHQKLQkJCQkJLnNldFRleHQoVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGluZm8uZ2V0V1BERGlhZ3JhbSgpKSk7Ci0JCQl3cGREaWFncmFtID0gaW5mby5nZXRXUEREaWFncmFtKCk7Ci0JCQkKLQkJCWV4aXN0aW5nTGlzdC5hZGQod3BkRGlhZ3JhbSk7Ci0JCX0KLQotCQl1c2VBREltYWdlQnV0dG9uLnNldFNlbGVjdGlvbihpbmZvLmNhblB1Ymxpc2hBREltYWdlKCkpOwotCQl1c2VBRERJbWFnZUJ1dHRvbi5zZXRTZWxlY3Rpb24oaW5mby5jYW5QdWJsaXNoQURESW1hZ2UoKSk7Ci0JCXVzZVdQREltYWdlQnV0dG9uLnNldFNlbGVjdGlvbihpbmZvLmNhblB1Ymxpc2hXUERJbWFnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJYXNzaWduQURJbWFnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0cnkgewotCQkJCQlTdXBwb3J0aW5nTWF0ZXJpYWwgc20gPSBvcGVuRmlsdGVyRGlhbG9nKCk7Ci0JCQkJCWlmIChzbSAhPSBudWxsKSB7Ci0JCQkJCQlhY3Rpdml0eURpYWdyYW0gPSBzbTsKLQkJCQkJCWFkSW1hZ2VUZXh0LnNldFRleHQoVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKHNtKSk7Ci0JCQkJCQlleGlzdGluZ0xpc3QuYWRkKGFjdGl2aXR5RGlhZ3JhbSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlhc3NpZ25BRERJbWFnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0cnkgewotCQkJCQlTdXBwb3J0aW5nTWF0ZXJpYWwgc20gPSBvcGVuRmlsdGVyRGlhbG9nKCk7Ci0JCQkJCWlmIChzbSAhPSBudWxsKSB7Ci0JCQkJCQlhY3Rpdml0eURldGFpbERpYWdyYW0gPSBzbTsKLQkJCQkJCWFkZEltYWdlVGV4dC5zZXRUZXh0KFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChzbSkpOwotCQkJCQkJZXhpc3RpbmdMaXN0LmFkZChhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJYXNzaWduV1BESW1hZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJU3VwcG9ydGluZ01hdGVyaWFsIHNtID0gb3BlbkZpbHRlckRpYWxvZygpOwotCQkJCQlpZiAoc20gIT0gbnVsbCkgewotCQkJCQkJd3BkRGlhZ3JhbSA9IHNtOwotCQkJCQkJd3BkSW1hZ2VUZXh0LnNldFRleHQoVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKHNtKSk7Ci0JCQkJCQlleGlzdGluZ0xpc3QuYWRkKHdwZERpYWdyYW0pOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY2xlYXJBREltYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWV4aXN0aW5nTGlzdC5yZW1vdmUoYWN0aXZpdHlEaWFncmFtKTsKLQkJCQlhZEltYWdlVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFjdGl2aXR5RGlhZ3JhbSA9IG51bGw7Ci0JCQl9Ci0JCX0pOwotCi0JCWNsZWFyQURESW1hZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZXhpc3RpbmdMaXN0LnJlbW92ZShhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQkJCWFkZEltYWdlVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFjdGl2aXR5RGV0YWlsRGlhZ3JhbSA9IG51bGw7Ci0JCQl9Ci0JCX0pOwotCi0JCWNsZWFyV1BESW1hZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZXhpc3RpbmdMaXN0LnJlbW92ZSh3cGREaWFncmFtKTsKLQkJCQl3cGRJbWFnZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl3cGREaWFncmFtID0gbnVsbDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBhIGZpbHRlciBkaWFsb2cKLQkgKi8KLQlwcml2YXRlIFN1cHBvcnRpbmdNYXRlcmlhbCBvcGVuRmlsdGVyRGlhbG9nKCkgewotCQotCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIGZpbHRlciwgYWN0aXZpdHksCi0JCQkJRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTLCBBcnJheXMuYXNMaXN0KGV4aXN0aW5nTGlzdC50b0FycmF5KCkpKTsKLQkJCi0JCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUyk7Ci0JCWZkLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZSh0cnVlKTsKLQkJZmQuc2V0SW5wdXQoVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KChFT2JqZWN0KSBhY3Rpdml0eSkpOwotCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZmQub3BlbigpOwotCi0JCUxpc3QgbGlzdCA9IGZkLmdldFNlbGVjdGVkSXRlbXMoKTsKLQkJaWYgKChsaXN0ICE9IG51bGwpICYmICghbGlzdC5pc0VtcHR5KCkpKSB7Ci0JCQlPYmplY3Qgb2JqID0gbGlzdC5nZXQoMCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJcmV0dXJuIChTdXBwb3J0aW5nTWF0ZXJpYWwpIG9iajsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChhY3Rpdml0eSkgfHwgaXNXcmFwcGVkKXsKLQkJCS8vIHRoZW4gZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4uIGp1c3QgcmV0dXJuCi0JCQlzdXBlci5va1ByZXNzZWQoKTsKLQkJfQotCQlib29sZWFuIGVkaXRvckRpcnR5ID0gZmFsc2U7Ci0JCURpYWdyYW1JbmZvIGluZm8gPSBuZXcgRGlhZ3JhbUluZm8oYWN0aXZpdHkpOwotCi0JCS8vIHNldCBhY3Rpdml0eSBkaWFncmFtCi0JCWlmIChhY3Rpdml0eURpYWdyYW0gIT0gaW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKSkgewotCQkJZWRpdG9yRGlydHkgPSB0cnVlOwotCQl9Ci0JCWluZm8uc2V0QWN0aXZpdHlEaWFncmFtKGFjdGl2aXR5RGlhZ3JhbSk7Ci0KLQkJLy8gc2V0IGFjdGl2aXR5IGRldGFpbCBkaWFncmFtCi0JCWlmICghZWRpdG9yRGlydHkpIHsKLQkJCWlmIChhY3Rpdml0eURldGFpbERpYWdyYW0gIT0gaW5mby5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKSkKLQkJCQllZGl0b3JEaXJ0eSA9IHRydWU7Ci0JCX0KLQkJaW5mby5zZXRBY3Rpdml0eURldGFpbERpYWdyYW0oYWN0aXZpdHlEZXRhaWxEaWFncmFtKTsKLQotCQkvLyBzZXQgd29yayBwcm9kdWN0IGRlcGVuZGVuY3kgZGlhZ3JhbQotCQlpZiAoIWVkaXRvckRpcnR5KSB7Ci0JCQlpZiAod3BkRGlhZ3JhbSAhPSBpbmZvLmdldFdQRERpYWdyYW0oKSkKLQkJCQllZGl0b3JEaXJ0eSA9IHRydWU7Ci0JCX0KLQkJaW5mby5zZXRXUEREaWFncmFtKHdwZERpYWdyYW0pOwotCi0JCS8vIHNldCBjYW4gcHVibGlzaCBmbGFnIGZvciBhY3Rpdml0eSBkaWFncmFtCi0JCWJvb2xlYW4gb2xkQ2FuUHVibGlzaEZsYWcgPSBpbmZvLmNhblB1Ymxpc2hBREltYWdlKCk7Ci0JCWJvb2xlYW4gbmV3Q2FuUHVibGlzaEZsYWcgPSB1c2VBREltYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQlpZiAoKCFlZGl0b3JEaXJ0eSkgJiYgKG9sZENhblB1Ymxpc2hGbGFnICE9IG5ld0NhblB1Ymxpc2hGbGFnKSkKLQkJCWVkaXRvckRpcnR5ID0gdHJ1ZTsKLQkJaW5mby5zZXRQdWJsaXNoQURJbWFnZSh1c2VBREltYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQotCQkvLyBzZXQgY2FuIHB1Ymxpc2ggZmxhZyBmb3IgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0KLQkJb2xkQ2FuUHVibGlzaEZsYWcgPSBpbmZvLmNhblB1Ymxpc2hBRERJbWFnZSgpOwotCQluZXdDYW5QdWJsaXNoRmxhZyA9IHVzZUFEREltYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQlpZiAoKCFlZGl0b3JEaXJ0eSkgJiYgKG9sZENhblB1Ymxpc2hGbGFnICE9IG5ld0NhblB1Ymxpc2hGbGFnKSkKLQkJCWVkaXRvckRpcnR5ID0gdHJ1ZTsKLQkJaW5mby5zZXRQdWJsaXNoQURESW1hZ2UodXNlQURESW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCi0JCS8vIHNldCBjYW4gcHVibGlzaCBmbGFnIGZvciB3b3JrIHByb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtCi0JCW9sZENhblB1Ymxpc2hGbGFnID0gaW5mby5jYW5QdWJsaXNoV1BESW1hZ2UoKTsKLQkJbmV3Q2FuUHVibGlzaEZsYWcgPSB1c2VXUERJbWFnZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCghZWRpdG9yRGlydHkpICYmIChvbGRDYW5QdWJsaXNoRmxhZyAhPSBuZXdDYW5QdWJsaXNoRmxhZykpCi0JCQllZGl0b3JEaXJ0eSA9IHRydWU7Ci0JCWluZm8uc2V0UHVibGlzaFdQREltYWdlKHVzZVdQREltYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVEaXRvciBkaXJ0eT0iICsgZWRpdG9yRGlydHkpOwotCQlpZiAoZWRpdG9yRGlydHkpIHsKLQotCQkJaWYgKCFwcm9tcHRTYXZlQWN0aXZlRWRpdG9yKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlzYXZlQWN0aXZlRWRpdG9yKCk7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwcm9tcHRTYXZlQWN0aXZlRWRpdG9yKCkgewotCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU7IAotCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMjsgCi0JCS8vIGlmIChlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbih0aXRsZSwgbWVzc2FnZSk7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVBY3RpdmVFZGl0b3IoKSB7Ci0JCS8vIHNhdmUgdGhlIGVkaXRvcgotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkoKFByb2Nlc3NFZGl0b3IpIGVkaXRvcikucmVzb3VyY2VzVG9TYXZlCi0JCQkJCQkJCS5hZGQoKChQcm9jZXNzQ29tcG9uZW50KSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgZWRpdG9yCi0JCQkJCQkJCQkJLmdldEVkaXRvcklucHV0KCkpLmdldE1ldGhvZEVsZW1lbnQoKSkKLQkJCQkJCQkJCQkuZ2V0UHJvY2VzcygpLmVSZXNvdXJjZSgpKTsKLQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic2F2aW5nLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWVkaXRvci5kb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNhdmluZyBkb25lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCi0JCQkJfSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvVmFyaWFiaWxpdHlTZWxlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9WYXJpYWJpbGl0eVNlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmNiZTA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9WYXJpYWJpbGl0eVNlbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5BbGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5Db250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIFRoZSBkaWFsb2cgZm9yIHNob3dpbmcgYW5kIHBvc3NpYmx5IHNlbGVjdGluZyBhbnkgdmFyaWFiaWxpdHkgcmVsYXRlZCB0byB0aGUKLSAqIGdpdmVuIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgVmFyaWFiaWxpdHlTZWxlY3Rpb24gewotCi0JcHJpdmF0ZSBIYXNoU2V0IGZpbHRlckVsZW1lbnRMaXN0ID0gbmV3IEhhc2hTZXQoKTsKLQotCXByaXZhdGUgY2xhc3MgVmFyaWFiaWxpdHlGaWx0ZXIgZXh0ZW5kcyBBbGxGaWx0ZXIgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50ID0gaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCk7Ci0JCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWlmIChvYmouZXF1YWxzKGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMoCi0JCQkJCQkJKChQcm9jZXNzQ29tcG9uZW50KSBvYmopLmdldFByb2Nlc3MoKSkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMob2JqKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCWlmIChUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgb2JqKSkgewotCQkJCQlpZiAoKChDdXN0b21DYXRlZ29yeSkgb2JqKS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkJCQkJCQkuaXNFbXB0eSgpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybihvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCWlmIChNZXRob2RFbGVtZW50VXRpbC5nZXRBbGxNb2RlbHMoY29udGVudEVsZW1lbnQpCi0JCQkJCQkJCS5jb250YWlucyhvYmopKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlDb2xsZWN0aW9uIGxpc3QgPSAoKENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCS5nZXRDaGlsZHJlbihvYmopOwotCQkJCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCS5nZXRDaGlsZHJlbihvYmopOwotCQkJCWZvciAoSXRlcmF0b3IgaW9yID0gbGlzdC5pdGVyYXRvcigpOyBpb3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqZWN0ID0gaW9yLm5leHQoKTsKLQkJCQkJaWYgKCgoQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iamVjdCkKLQkJCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCkpCi0JCQkJCQlpb3IucmVtb3ZlKCk7Ci0JCQkJfQotCQkJCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChjaGlsZEFjY2VwdChvYmopKQotCQkJCXJldHVybiB0cnVlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJaWYgKChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkKLQkJCQkJJiYgZmlsdGVyRWxlbWVudExpc3QuY29udGFpbnMob2JqKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIERpc3BsYXkgdmFyaWFiaWxpdHkgc2VsZWN0aW9uIGRpYWxvZyB3aGljaCBsaXN0cyBlbGVtZW50cyBhbmQgaXQncwotCSAqIHZhcmlhYmlsaXRpZXMuCi0JICogCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5U2VsZWN0aW9uKCkgewotCX0KLQotCS8qKgotCSAqIEl0IHNob3dzIGRpYWxvZyBib3ggZm9yIGFsbCB0aGUgY29udHJpYnV0b3JzLiBVc2VyIGlzIGV4cGVjdGVkIHRvIHNlbGVjdAotCSAqIG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKiAJCU9iamVjdCBzZWxlY3RlZCBieSB1c2VyCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTZWxlY3RlZFZhcmlhYmlsaXR5KFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50KSB7Ci0JCVNldCBlbGVtZW50U2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJZWxlbWVudFNldC5hZGQoZWxlbWVudCk7Ci0JCWVsZW1lbnRTZXQgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRWYXJpYWJpbGl0eUVsZW1lbnRzKGVsZW1lbnRTZXQsIHRydWUsIHRydWUpOwotCi0JCWZpbHRlckVsZW1lbnRMaXN0LmFkZEFsbChlbGVtZW50U2V0KTsKLQkJaWYgKCFlbGVtZW50U2V0LmlzRW1wdHkoKSkgewotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBlbGVtZW50U2V0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCUNvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBpdG9yLm5leHQoKTsKLQkJCQlMaXN0IGdyb3VwaW5ncyA9IG51bGw7Ci0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJCQlncm91cGluZ3MgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXREaXNjaXBsaW5lR3JvdXBzKChEaXNjaXBsaW5lKSBjb250ZW50RWxlbWVudCk7Ci0KLQkJCQl9Ci0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJCQlncm91cGluZ3MgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXRSb2xlU2V0R3JvdXBzKChSb2xlU2V0KSBjb250ZW50RWxlbWVudCk7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJCWdyb3VwaW5ncyA9IGdldEFuY2VzdG9ycygoQ3VzdG9tQ2F0ZWdvcnkpY29udGVudEVsZW1lbnQpOwotCQkJCX0KLQotCQkJCWlmICgoZ3JvdXBpbmdzICE9IG51bGwpICYmICghZ3JvdXBpbmdzLmlzRW1wdHkoKSkpCi0JCQkJCWZpbHRlckVsZW1lbnRMaXN0LmFkZEFsbChncm91cGluZ3MpOwotCi0JCQl9Ci0KLQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IFZhcmlhYmlsaXR5RmlsdGVyKCk7Ci0JCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nW10geyBGaWx0ZXJDb25zdGFudHMuQ09ORklHX0NPTlRFTlRfRUxFTUVOVCB9OwotCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZGxnID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkpOwotCQkJZGxnLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJZGxnLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5DT05GSUdfQ09OVEVOVF9FTEVNRU5UKTsKLQkJCWRsZy5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQlkbGcuc2V0VHlwZXMoc3RyKTsKLQkJCWRsZy5zZXRJbnB1dChVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGVsZW1lbnQpKTsKLQkJCWRsZy5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpKSwKLQkJCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRJdGVtc0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCi0JCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50Ci0JCQkJCSYmIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuaXNTaG93UHJlc2VudGF0aW9uTmFtZXMoKSkgewotCQkJCWlmICgoKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpLnRyaW0oKQotCQkJCQkJLmxlbmd0aCgpID4gMCkKLQkJCQkJZWxlbWVudE5hbWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudCkKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJfQotCQkJZGxnCi0JCQkJCS5zZXRWaWV3ZXJMYWJlbChBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLlZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ192aWV3ZXJMYWJlbCwgKG5ldyBTdHJpbmdbXSB7IGVsZW1lbnROYW1lIH0pKSk7Ci0KLQkJCVN0cmluZyB0aXRsZSA9IE1lc3NhZ2VGb3JtYXQKLQkJCQkJLmZvcm1hdCgKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5WYXJpYWJpbGl0eVNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGUsIAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IGVsZW1lbnROYW1lIH0pOwotCi0JCQlkbGcuc2V0VGl0bGUodGl0bGUpOwotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZGxnLm9wZW4oKTsKLQotCQkJTGlzdCByZXN1bHQgPSBkbGcuZ2V0U2VsZWN0ZWRJdGVtcygpOwotCQkJaWYgKChyZXN1bHQgPT0gbnVsbCkgfHwgKHJlc3VsdC5pc0VtcHR5KCkpKQotCQkJCXJldHVybiBudWxsOwotCQkJZWxzZQotCQkJCXJldHVybiByZXN1bHQuZ2V0KDApOwotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFuY2VzdG9ycyBmb3IgdGhlIGdpdmVuIEN1c3RvbSBDYXRlZ29yeS4KLQkgKiB0YWtlbiBmcm9tIGF1dGhvcmluZy51aS5DdXN0b21DYXRlZ29yeUFzc2lnblBhZ2UKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0QW5jZXN0b3JzKEN1c3RvbUNhdGVnb3J5IG1ldGhvZE9iamVjdCkgewotCQlMaXN0IGFuY2VzdG9yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBvYmpMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlvYmpMaXN0LmFkZChtZXRob2RPYmplY3QpOwotCQlnZXRBbmNlc3RvcnMoYW5jZXN0b3JMaXN0LCBvYmpMaXN0KTsKLQkJcmV0dXJuIGFuY2VzdG9yTGlzdDsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0QW5jZXN0b3JzKExpc3QgYW5jZXN0b3JMaXN0LCBMaXN0IG1ldGhvZE9iamVjdExpc3QpIHsKLQkJaWYgKG1ldGhvZE9iamVjdExpc3QuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGFuY2VzdG9yTGlzdDsKLQotCQlMaXN0IGFsbFBhcmVudEN1c3RDYXRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1ldGhvZE9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDdXN0b21DYXRlZ29yeSBlbGVtZW50ID0gKEN1c3RvbUNhdGVnb3J5KSBpdGVyLm5leHQoKTsKLQkJCUxpc3QgcGFyZW50TGlzdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldEN1c3RvbUNhdGVnb3JpZXMoZWxlbWVudCk7Ci0JCQlhbGxQYXJlbnRDdXN0Q2F0cy5hZGRBbGwocGFyZW50TGlzdCk7Ci0JCX0KLQotCQlhbmNlc3Rvckxpc3QuYWRkQWxsKG1ldGhvZE9iamVjdExpc3QpOwotCQlMaXN0IG5leHRDaGVja0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbFBhcmVudEN1c3RDYXRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghYW5jZXN0b3JMaXN0LmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJbmV4dENoZWNrTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZ2V0QW5jZXN0b3JzKGFuY2VzdG9yTGlzdCwgbmV4dENoZWNrTGlzdCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDM3MTE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBkaWFsb2dzIGZvciB0aGUgQXV0aG9yaW5nIFVJLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZG5kL0VkaXRpbmdEb21haW5UYWJsZVRyZWVWaWV3ZXJEcm9wQWRhcHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kbmQvRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OGQ1NzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kbmQvRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkRyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkRyYWdBbmREcm9wRmVlZGJhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0vKioKLSAqIERyb3AgYWRhcHRlciBmb3IgZHJhZyBhbmQgZHJvcAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyIGV4dGVuZHMKLQkJRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyIHsKLQotCXB1YmxpYyBFZGl0aW5nRG9tYWluVGFibGVUcmVlVmlld2VyRHJvcEFkYXB0ZXIoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKGRvbWFpbiwgdmlld2VyKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlciNkcmFnRW50ZXIob3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX05PTkUpIHsKLQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQkJc3VwZXIuZHJhZ0VudGVyKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIjZHJhZ092ZXIob3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfTk9ORSkgewotCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCi0JCXN1cGVyLmRyYWdPdmVyKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIjZHJvcEFjY2VwdChvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkcm9wQWNjZXB0KERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX05PTkUpIHsKLQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQotCQlzdXBlci5kcm9wQWNjZXB0KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIjaGVscGVyKG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhlbHBlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJVGFibGUgdGFibGUgPSBudWxsOwotCQlUYWJsZUl0ZW0gaXRlbSA9IG51bGw7Ci0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVRyZWVWaWV3ZXIpIHsKLQkJCXRhYmxlID0gKChUYWJsZVRyZWVWaWV3ZXIpIHZpZXdlcikuZ2V0VGFibGVUcmVlKCkuZ2V0VGFibGUoKTsKLQkJCWl0ZW0gPSB0YWJsZS5nZXRJdGVtKHRhYmxlLnRvQ29udHJvbChldmVudC54LCBldmVudC55KSk7Ci0JCQlldmVudC5pdGVtID0gaXRlbTsKLQkJfQotCi0JCXN1cGVySGVscGVyKGV2ZW50KTsKLQotCQlpZiAoaXRlbSAhPSBudWxsICYmIChldmVudC5mZWVkYmFjayAmIERORC5GRUVEQkFDS19TRUxFQ1QpICE9IDApIHsKLQkJCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10geyBpdGVtIH0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IGRyb3AgdGFyZ2V0Ci0JICogCi0JICogQHBhcmFtIGl0ZW0KLQkgKiBAcmV0dXJuIGRyb3AgdGFyZ2V0IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0RHJvcFRhcmdldChXaWRnZXQgaXRlbSkgewotCQlyZXR1cm4gZXh0cmFjdERyb3BUYXJnZXQoaXRlbSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBjYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZHJvcCBhY3Rpb24gc2hvdWxkIGJlIGludm9rZWQuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyI2Ryb3Aob3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJLy8gQSBjb21tYW5kIHdhcyBjcmVhdGVkIGlmIHRoZSBzb3VyY2Ugd2FzIGF2YWlsYWJsZSBlYXJseSwgYW5kIHRoZQotCQkvLyBpbmZvcm1hdGlvbiB1c2VkIHRvIGNyZWF0ZSBpdCB3YXMgY2FjaGVkLi4uCi0JCWlmIChkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbiAhPSBudWxsKSB7Ci0JCQkvLyBSZWNyZWF0ZSB0aGUgY29tbWFuZC4KLQkJCWNvbW1hbmQgPSBkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbi5jcmVhdGVDb21tYW5kKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBPdGhlcndpc2UsIHRoZSBzb3VyY2Ugc2hvdWxkIGJlIGF2YWlsYWJsZSBub3cgYXMgZXZlbnQuZGF0YSwgYW5kCi0JCQkvLyB3ZSBjYW4gY3JlYXRlIHRoZSBjb21tYW5kLgotCQkJc291cmNlID0gZXh0cmFjdERyYWdTb3VyY2UoZXZlbnQuZGF0YSk7Ci0JCQlPYmplY3QgdGFyZ2V0ID0gZ2V0RHJvcFRhcmdldChldmVudC5pdGVtKTsKLQkJCWNvbW1hbmQgPSBEcmFnQW5kRHJvcENvbW1hbmQuY3JlYXRlKGRvbWFpbiwgdGFyZ2V0LAotCQkJCQlnZXRMb2NhdGlvbihldmVudCksIGV2ZW50Lm9wZXJhdGlvbnMsIG9yaWdpbmFsT3BlcmF0aW9uLAotCQkJCQlzb3VyY2UpOwotCQl9Ci0KLQkJLy8gSWYgdGhlIGNvbW1hbmQgY2FuIGV4ZWN1dGUuLi4KLQkJaWYgKGNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQkvLyBFeGVjdXRlIGl0LgotCQkJZG9tYWluLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBPdGhlcndpc2UsIGxldCdzIGNhbGwgdGhlIHdob2xlIHRoaW5nIG9mZi4KLQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQljb21tYW5kLmRpc3Bvc2UoKTsKLQkJfQotCi0JCS8vIENsZWFuIHVwIHRoZSBzdGF0ZS4KLQkJY29tbWFuZCA9IG51bGw7Ci0JCWNvbW1hbmRUYXJnZXQgPSBudWxsOwotCQlzb3VyY2UgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0aGUgc2FtZSB3YXkgZm9yIGVhY2ggb2YgdGhlCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldExpc3RlbmVyfSBtZXRob2RzLCBleGNlcHQgZm9yIGxlYXZlCi0JICogYW5kIGRyb3AuIElmIHRoZSBzb3VyY2UgaXMgYXZhaWxhYmxlIGVhcmx5LCBpdCBjcmVhdGVzIG9yIHJldmFsaWRhdGVzIHRoZQotCSAqIHtAbGluayBEcmFnQW5kRHJvcENvbW1hbmR9LCBhbmQgdXBkYXRlcyB0aGUgZXZlbnQncyBkZXRhaWwgKG9wZXJhdGlvbikKLQkgKiBhbmQgZmVlZGJhY2sgKGRyYWcgdW5kZXIgZWZmZWN0KSwgYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdXBlckhlbHBlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJLy8gSWYgd2UgY2FuJ3QgZG8gYW55dGhpbmcgZWxzZSwgd2UnbGwgcHJvdmlkZSB0aGUgZGVmYXVsdCBzZWxlY3QKLQkJLy8gZmVlZGJhY2sgYW5kIGVuYWJsZSBhdXRvLXNjcm9sbCBhbmQgYXV0by1leHBhbmQgZWZmZWN0cy4KLQkJZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfU0VMRUNUIHwgZ2V0QXV0b0ZlZWRiYWNrKCk7Ci0KLQkJLy8gSWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIGl0LCB0cnkgdG8gZ2V0IHRoZSBzb3VyY2UgZWFybHkuIFdlIGNhbid0Ci0JCS8vIGdpdmUgZmVlZGJhY2sgaWYgaXQncyBub3QgYXZhaWxhYmxlIHlldCAodGhpcyBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQpLgotCQlpZiAoc291cmNlID09IG51bGwpIHsKLQkJCXNvdXJjZSA9IGdldERyYWdTb3VyY2UoZXZlbnQpOwotCQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEdldCB0aGUgdGFyZ2V0IG9iamVjdCBmcm9tIHRoZSBpdGVtIHdpZGdldCBhbmQgdGhlIG1vdXNlIGxvY2F0aW9uIGluCi0JCS8vIGl0LgotCQlPYmplY3QgdGFyZ2V0ID0gZ2V0RHJvcFRhcmdldChldmVudC5pdGVtKTsKLQkJZmxvYXQgbG9jYXRpb24gPSBnZXRMb2NhdGlvbihldmVudCk7Ci0KLQkJLy8gRGV0ZXJtaW5lIGlmIHdlIGNhbiBjcmVhdGUgYSB2YWxpZCBjb21tYW5kIGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uLgotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0KLQkJLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHByZXZpb3VzIGNhY2hlZCBjb21tYW5kLi4uCi0JCWlmIChjb21tYW5kID09IG51bGwpIHsKLQkJCS8vIFdlJ2xsIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgaW5mb3JtYXRpb24gd2UgdXNlIHRvIGNyZWF0ZSB0aGUKLQkJCS8vIGNvbW1hbmQsIHNvIHRoYXQgd2UgY2FuIHJlY3JlYXRlIGl0IGluIGRyb3AuCi0JCQlkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbiA9IG5ldyBEcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbigKLQkJCQkJZG9tYWluLCB0YXJnZXQsIGxvY2F0aW9uLCBldmVudC5vcGVyYXRpb25zLAotCQkJCQlvcmlnaW5hbE9wZXJhdGlvbiwgc291cmNlKTsKLQotCQkJLy8gUmVtZW1iZXIgdGhlIHRhcmdldDsgY3JlYXRlIHRoZSBjb21tYW5kIGFuZCB0ZXN0IGlmIGl0IGlzCi0JCQkvLyBleGVjdXRhYmxlLgotCQkJY29tbWFuZFRhcmdldCA9IHRhcmdldDsKLQkJCWNvbW1hbmQgPSBkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbi5jcmVhdGVDb21tYW5kKCk7Ci0JCQl2YWxpZCA9IGNvbW1hbmQuY2FuRXhlY3V0ZSgpOwotCQl9IGVsc2UgewotCQkJLy8gQ2hlY2sgaWYgdGhlIGNhY2hlZCBjb21tYW5kIGNhbiBwcm92aWRlIERORAotCQkJLy8gZmVlZGJhY2svcmV2YWxpZGF0aW9uLgotCQkJaWYgKHRhcmdldCA9PSBjb21tYW5kVGFyZ2V0Ci0JCQkJCSYmIGNvbW1hbmQgaW5zdGFuY2VvZiBEcmFnQW5kRHJvcEZlZWRiYWNrKSB7Ci0JCQkJLy8gSWYgc28sIHJldmFsaWRhdGUgdGhlIGNvbW1hbmQuCi0JCQkJdmFsaWQgPSAoKERyYWdBbmREcm9wRmVlZGJhY2spIGNvbW1hbmQpLnZhbGlkYXRlKHRhcmdldCwKLQkJCQkJCWxvY2F0aW9uLCBldmVudC5vcGVyYXRpb25zLCBvcmlnaW5hbE9wZXJhdGlvbiwgc291cmNlKTsKLQotCQkJCS8vIEtlZXAgdHJhY2sgb2YgYW55IGNoYW5nZXMgdG8gdGhlIGNvbW1hbmQgaW5mb3JtYXRpb24uCi0JCQkJZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24gPSBuZXcgRHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24oCi0JCQkJCQlkb21haW4sIHRhcmdldCwgbG9jYXRpb24sIGV2ZW50Lm9wZXJhdGlvbnMsCi0JCQkJCQlvcmlnaW5hbE9wZXJhdGlvbiwgc291cmNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gSWYgbm90LCBkaXNwb3NlIHRoZSBjdXJyZW50IGNvbW1hbmQgYW5kIGNyZWF0ZSBhIG5ldyBvbmUuCi0JCQkJZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24gPSBuZXcgRHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24oCi0JCQkJCQlkb21haW4sIHRhcmdldCwgbG9jYXRpb24sIGV2ZW50Lm9wZXJhdGlvbnMsCi0JCQkJCQlvcmlnaW5hbE9wZXJhdGlvbiwgc291cmNlKTsKLQkJCQljb21tYW5kVGFyZ2V0ID0gdGFyZ2V0OwotCQkJCWNvbW1hbmQuZGlzcG9zZSgpOwotCQkJCWNvbW1hbmQgPSBkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbi5jcmVhdGVDb21tYW5kKCk7Ci0JCQkJdmFsaWQgPSBjb21tYW5kLmNhbkV4ZWN1dGUoKTsKLQkJCX0KLQkJfQotCi0JCS8vIElmIHRoaXMgY29tbWFuZCBjYW4gcHJvdmlkZSBkZXRhaWxlZCBkcmFnIGFuZCBkcm9wIGZlZWRiYWNrLi4uCi0JCWlmIChjb21tYW5kIGluc3RhbmNlb2YgRHJhZ0FuZERyb3BGZWVkYmFjaykgewotCQkJLy8gVXNlIGl0IGZvciB0aGUgb3BlcmF0aW9uIGFuZCBkcmFnIHVuZGVyIGVmZmVjdC4KLQkJCURyYWdBbmREcm9wRmVlZGJhY2sgZHJhZ0FuZERyb3BGZWVkYmFjayA9IChEcmFnQW5kRHJvcEZlZWRiYWNrKSBjb21tYW5kOwotCQkJZXZlbnQuZGV0YWlsID0gZHJhZ0FuZERyb3BGZWVkYmFjay5nZXRPcGVyYXRpb24oKTsKLQkJCWV2ZW50LmZlZWRiYWNrID0gZHJhZ0FuZERyb3BGZWVkYmFjay5nZXRGZWVkYmFjaygpCi0JCQkJCXwgZ2V0QXV0b0ZlZWRiYWNrKCk7Ci0JCX0gZWxzZSBpZiAoIXZhbGlkKSB7Ci0JCQkvLyBUaGVyZSBpcyBubyBleGVjdXRhYmxlIGNvbW1hbmQsIHNvIHdlJ2QgYmV0dGVyIG5peCB0aGUgd2hvbGUKLQkJCS8vIGRlYWwuCi0JCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RuZC9MaWJyYXJ5Vmlld2VyRHJhZ0FkYXB0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZG5kL0xpYnJhcnlWaWV3ZXJEcmFnQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTI3YmMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZG5kL0xpYnJhcnlWaWV3ZXJEcmFnQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5WaWV3ZXJEcmFnQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuSFRNTFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFRoZSBkcmFnIGFkYXB0ZXIgZm9yIHRoZSBMaWJyYXJ5IFZpZXdlci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5Vmlld2VyRHJhZ0FkYXB0ZXIgZXh0ZW5kcyBWaWV3ZXJEcmFnQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVkaXRvckRyYWdBZGFwdGVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeVZpZXdlckRyYWdBZGFwdGVyKFZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIodmlld2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiBkcmFnZ2luZyBpcyBpbml0aWF0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQlzdXBlci5kcmFnU3RhcnQoZXZlbnQpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJLmdldFNlbGVjdGlvbigpOwotCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi50b0xpc3QoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmCi0JCQkJCSEoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgJiYKLQkJCQkJIShzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkpIHsKLQkJCQlldmVudC5kb2l0ID0gdHJ1ZTsKLQkJCX0KLQkJfQkJCi0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIHRyYW5zZmVyIHRoZSBkYXRhLgotCSAqLwotCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQlpZiAoSFRNTFRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSB8fAotCQkJCVRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQotCQkJU3RyaW5nIGxpbmtzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi50b0xpc3QoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJU3RyaW5nIGxpbmtUZXh0ID0gZ2V0SHlwZXJsaW5rKChNZXRob2RFbGVtZW50KSBzZWxlY3RlZEVsZW1lbnQpOwkJCQkJCi0JCQkJCWlmIChQbGF0Zm9ybS5nZXRPUygpLmVxdWFscyhQbGF0Zm9ybS5XU19XSU4zMikpIHsKLQkJCQkJCWlmIChsaW5rcy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlsaW5rcyArPSBTdHJVdGlsLkxJTkVfRkVFRDsKLQkJCQkJCX0KLQkJCQkJCWxpbmtzICs9IG5ldyBTdHJpbmcoU3RyVXRpbC5nZXRVVEY4Qnl0ZXMobGlua1RleHQpKTsJCQkJCQkKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChsaW5rcy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlsaW5rcyArPSBTdHJVdGlsLkxJTkVfRkVFRDsKLQkJCQkJCX0KLQkJCQkJCWxpbmtzICs9IGxpbmtUZXh0OwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfQotCQkJaWYgKGxpbmtzLmxlbmd0aCgpID4gMCkgewotCQkJCWV2ZW50LmRhdGEgPSBsaW5rczsKLQkJCX0KLQkJfQotCQlzdXBlci5kcmFnU2V0RGF0YShldmVudCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaHlwZXJsaW5rIGZvciB0aGUgZ2l2ZW4gTWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRIeXBlcmxpbmsoTWV0aG9kRWxlbWVudCBkcmFnRWxlbWVudCkgewotCQlNZXRob2RFbGVtZW50IGRyb3BFbGVtZW50ID0gbnVsbDsKLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IgPSBhY3RpdmVQYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQlpZiAoYWN0aXZlRWRpdG9yICE9IG51bGwpIHsKLQkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGFjdGl2ZUVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQkJZHJvcEVsZW1lbnQgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQpCi0JCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJfQotCQl9Ci0JCQotCQlpZihkcmFnRWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpewotCQkJZHJhZ0VsZW1lbnQgPSAoKFByb2Nlc3NDb21wb25lbnQpZHJhZ0VsZW1lbnQpLmdldFByb2Nlc3MoKTsKLQkJfQotCi0JCVN0cmluZyBocmVmID0gUmVzb3VyY2VIZWxwZXIuZ2V0VXJsKGRyYWdFbGVtZW50LCBkcm9wRWxlbWVudCwgIi5odG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vIG9iZXkgTGlicmFyeVZpZXdQcmVmUGFnZQotCQlTdHJpbmcgZGVmYXVsdExpbmtUeXBlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSUJfVklFV19ETkRfREVGQVVMVF9MSU5LVFlQRSk7Ci0JCVN0cmluZyB0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKFJlc291cmNlSGVscGVyLkVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGlua1dpdGhUeXBlLmVxdWFscyhkZWZhdWx0TGlua1R5cGUpKSB7Ci0JCQl0ZXh0ID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudExpbmtUZXh0KGRyYWdFbGVtZW50LCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXRleHQgPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50TGlua1RleHQoZHJhZ0VsZW1lbnQsIGZhbHNlKTsKLQkJfQotCQkKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRMaW5rKGRyYWdFbGVtZW50LCB0ZXh0LAotCQkJCSJmaWxlOi8vIiArIGhyZWYsIGRlZmF1bHRMaW5rVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZG5kL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZG5kL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg1N2Y1OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RuZC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBkcmFnIGFuZCBkcm9wIHN1cHBvcnQgZm9yIHRoZSBBdXRob3JpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0Fic3RyYWN0QmFzZUZvcm1FZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9BYnN0cmFjdEJhc2VGb3JtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZWZkYTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0Fic3RyYWN0QmFzZUZvcm1FZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLmVkaXRvcnMuSU1ldGhvZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIG1ldGhvZCBlZGl0b3JzLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCYXNlRm9ybUVkaXRvciBleHRlbmRzIEZvcm1FZGl0b3IgaW1wbGVtZW50cyBJTWV0aG9kRWRpdG9yIHsKLQotCS8vIEdsb2JhbCBtYXAgdXNlZCB0byByZWNvcmQgd2hpY2ggZWRpdG9yIG1vZGlmaWVzIHRoZSBzaGFyZWQgcmVzb3VyY2UKLQkvLyBmaXJzdC4KLQkvLyBUaGlzIGVuYWJsZXMgdGhlIGFwcHJvcHJpYXRlIGVkaXRvcnMgdG8gYmUgZmxhZ2dlZCBhcyBkaXJ0eS4KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE1hcCBTSEFSRURfUkVTT1VSQ0VfVE9fRURJVE9SU19NQVAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gSWYgdHJ1ZSwgZGVidWcgdHJhY2luZyBpcyBlbmFibGVkLgotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmlzRGVidWdnaW5nKCk7Ci0KLQkvLyBDb2xsZWN0aW9uIG9mIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZGVsIGRhdGEgYmVpbmcgZWRpdGVkIGJ5Ci0JLy8gdGhpcyBlZGl0b3IuCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gcmVzb3VyY2VzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RCYXNlRm9ybUVkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yI2FkZFBhZ2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRQYWdlcygpOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2F2ZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCSJFcnJvciBzYXZpbmcgbGlicmFyeToiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZUFzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydCNpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCXJldHVybiBtYW5hZ2VyICE9IG51bGwgPyBtYW5hZ2VyLmlzTWV0aG9kTGlicmFyeU1vZGlmaWVkKCkgOiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyB0aGUgb3BlcmF0aW5nIHN5c3RlbSByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgZWRpdG9yLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBlZGl0b3IncyBkaXJ0eSBzdGF0ZSBieSBhZGRpbmcgYSAiKiIgdG8gdGhlIGVkaXRvciB0YWIgYW5kCi0JICogZW5hYmxpbmcgdGhlIFNhdmUgYnV0dG9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZURpcnR5U3RhdHVzKCkgewotCQlzdXBlci5lZGl0b3JEaXJ0eVN0YXRlQ2hhbmdlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0Fic3RyYWN0RGlhZ3JhbUVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0Fic3RyYWN0RGlhZ3JhbUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDRkODYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9BYnN0cmFjdERpYWdyYW1FZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNoYW5nZUJvdW5kc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ3JlYXRlQmVuZHBvaW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DcmVhdGVMaW5rQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DcmVhdGVOb2RlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5Nb3ZlQmVuZHBvaW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkRlY2lzaW9uTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRGlhZ3JhbUFjdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5GcmVlVGV4dE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkxpbmtFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVDb250YWluZXJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LlN5bmNoQmFyTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuRnJlZVRleHRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkRpYWdyYW1QcmludEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlZpZXdIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5Qcm9jZXNzRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS5lZGl0b3JzLklNZXRob2RFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db250ZXh0TWVudVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLktleUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLktleVN0cm9rZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZG5kLlRlbXBsYXRlVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmRuZC5UZW1wbGF0ZVRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuU2NhbGFibGVGcmVlZm9ybVJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkNvcHlUZW1wbGF0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuR0VGQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYWxldHRlLlBhbGV0dGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhbGV0dGUuUGFsZXR0ZVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYWxldHRlLkZseW91dFBhbGV0dGVDb21wb3NpdGUuRmx5b3V0UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkdyYXBoaWNhbEVkaXRvcldpdGhGbHlvdXRQYWxldHRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5HcmFwaGljYWxWaWV3ZXJLZXlIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5TY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5UcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRm9udERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIGRpYWdyYW0gZWRpdG9ycwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBKaW0gVGhhcmlvCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REaWFncmFtRWRpdG9yIGV4dGVuZHMKLQkJR3JhcGhpY2FsRWRpdG9yV2l0aEZseW91dFBhbGV0dGUgaW1wbGVtZW50cyBJTWV0aG9kRWRpdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZSRVNIX0ZST01fQkFTRV9BQ1RJVklUWSA9ICJyZWZyZXNoX2Zyb21fYmFzZV9hY3Rpdml0eSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9IT1JaX0FWRVJBR0UgPQotCS8vICJhbGlnbl9ob3Jpem9udGFsX3RvX2F2ZXJhZ2UiOyAvLyROT04tTkxTLTEkCi0JLy8gcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fSE9SWl9GSVJTVF9TRUxFQ1RFRCA9Ci0JLy8gImFsaWduX2hvcml6b250YWxfdG9fZmlyc3Rfc2VsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCS8vIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOX1ZFUlRfQVZFUkFHRSA9Ci0JLy8gImFsaWduX3ZlcnRpY2FsX3RvX2F2ZXJhZ2UiOyAvLyROT04tTkxTLTEkCi0JLy8gcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fVkVSVF9GSVJTVF9TRUxFQ1RFRCA9Ci0JLy8gImFsaWduX3ZlcnRpY2FsX3RvX2ZpcnN0X3NlbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT05UX0RJQUxPRyA9ICJmb250X2RpYWxvZyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfTElOSyA9ICJjcmVhdGVfbGluayI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfTElOSyA9ICJzZWxlY3RfbGluayI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfQkVORF9QT0lOVCA9ICJjcmVhdGVfYmVuZF9wb2ludCI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfRlJFRV9URVhUID0gImNyZWF0ZV9mcmVlX3RleHQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT1ZFID0gIm1vdmUiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZSRVNIID0gInJlZnJlc2giOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9CRU5EX1BPSU5UID0gImFsaWduX2JlbmRfcG9pbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUxFVFRFX0RPQ0tfTE9DQVRJT04gPSAiRG9jayBsb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBTEVUVEVfU0laRSA9ICJQYWxldHRlIFNpemUiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUxFVFRFX1NUQVRFID0gIlBhbGV0dGUgc3RhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BBTEVUVEVfU0laRSA9IDEzMDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9ESUFHUkFNID0gImRlbGV0ZV9hY3R2aXR5X2RldGFpbF9kaWFncmFtIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBLZXlIYW5kbGVyIHNoYXJlZEtleUhhbmRsZXI7Ci0KLQlwcml2YXRlIFBhbGV0dGVSb290IHBhbGV0dGVSb290OwotCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGVkaXRQYXJ0OwotCi0JcHJpdmF0ZSBDb21tYW5kU3RhY2tFdmVudExpc3RlbmVyIGNtZFN0YWNrRXZlbnRMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBDcmVhdGlvbkZhY3RvcnkgZnJlZVR4dE5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0KLQlwcm90ZWN0ZWQgRGlhZ3JhbUFjdGlvblNlcnZpY2UgYWN0aW9uU2VydmljZSA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGlzcG9zZWQ7Ci0KLQkvKioKLQkgKiBUaGUgcGFyZW50IGlzIHRoZSBlZGl0b3IgZnJvbSB3aGVyZSB0aGUgdXNlciBvcGVuZWQgdGhpcyBlZGl0b3IuCi0JICovCi0JcHJvdGVjdGVkIElFZGl0b3JQYXJ0IHBhcmVudEVkaXRvciA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gbGlzdGVuIGZvciBvdXIgcGFyZW50IGVkaXRvciBhbmQgb3VyIG93biBjbG9zaW5nLiBXaGVuIGl0Ci0JICogZG9lcywgd2UgYXNrIHRoZSB1c2VyIGlmIHRoZXkgd2FudCB0byBjbG9zZSB0aGlzIGRpYWdyYW0gYXMgd2VsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnRMaXN0ZW5lciBwYXJ0TGlzdGVuZXIgPSBuZXcgSVBhcnRMaXN0ZW5lcigpIHsKLQkJSUVkaXRvclBhcnQgbWUgPSBBYnN0cmFjdERpYWdyYW1FZGl0b3IudGhpczsKLQotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCS8vIGNoZWNrIGlmIHRoZSBlZGl0b3IgY2xvc2VkIGFzIGEgcmVzdWx0IG9mIHVzZXIgYWN0aW9uIG9yIHRoZQotCQkJLy8gd29ya2JlbmNoIGNsb3NpbmcKLQkJCS8vIElXb3JrYmVuY2ggd2IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQkJaWYgKHBhcnQgPT0gbWUpIHsKLQkJCQlzZXRQYXJlbnRFZGl0b3IobnVsbCk7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IGdldFNpdGUoKS5nZXRQYWdlKCk7Ci0JCQkJcGFnZS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQkJCQkvLyByZW1vdmUgdGhpcyBkaWFncmFtIGlmIGl0IGlzIG5ldwotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSAoKEVkaXRQYXJ0KSBnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkJLmdldENvbnRlbnRzKCkpLmdldE1vZGVsKCk7Ci0JCQkJLy8gbWFrZSBzdXJlIHdlIHJlbW92ZSB0aGUgVU1BIGRpYWdyYW0gZnJvbSB0aGUgbW9kZWwgaWYgaXQgaXMKLQkJCQkvLyBuZXcgKG5ldmVyIHNhdmVkKQotCQkJCWlmIChkaWFncmFtLmlzTmV3KCkpIHsKLQkJCQkJaWYgKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpICE9IG51bGwpIHsKLQkJCQkJRWNvcmVVdGlsLnJlbW92ZShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCQkJCX0KLQkJCQkJaWYoaXNSZXNvdXJjZUNoYW5nZWRCeU90aGVyKCkpIHsKLQkJCQkJZG9TYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gZWxzZSBpZiAoIXdiLmlzQ2xvc2luZygpKSB7Ci0JCQkvLyAvLyBhcmUgd2UgYmVpbmcgbm90aWZpZWQgYWJvdXQgb3VyIHBhcmVudCBlZGl0b3Igb2JqZWN0PwotCQkJLy8gaWYgKGdldFBhcmVudEVkaXRvcigpICE9IG51bGwpIHsKLQkJCS8vIGlmIChwYXJ0ID09IGdldFBhcmVudEVkaXRvcigpKSB7Ci0JCQkvLyBJV29ya2JlbmNoUGFnZSBwYWdlID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLQkJCS8vIC8vIHllcywgYXNrIHRoZSB1c2VyIGlmIHRoZXkgd2FudCB0byBjbG9zZSB0aGlzCi0JCQkvLyAvLyBlZGl0b3IKLQkJCS8vIGlmIChBdXRob3JpbmdVSVBsdWdpbgotCQkJLy8gLmdldERlZmF1bHQoKQotCQkJLy8gLmdldE1zZ0RpYWxvZygpCi0JCQkvLyAuZGlzcGxheVByb21wdCgKLQkJCS8vIERpYWdyYW1VSVJlc291cmNlcwotCQkJLy8gLmdldFN0cmluZygiRGlhZ3JhbVVJLkFic3RyYWN0RGlhZ3JhbUVkaXRvci5QYXJlbnRFZGl0b3JDbG9zZS50aXRsZSIpLAotCQkJLy8gLy8kTk9OLU5MUy0xJAotCQkJLy8gRGlhZ3JhbVVJUmVzb3VyY2VzCi0JCQkvLyAuZm9ybWF0U3RyaW5nKAotCQkJLy8gIkRpYWdyYW1VSS5BYnN0cmFjdERpYWdyYW1FZGl0b3IuUGFyZW50RWRpdG9yQ2xvc2UudGV4dCIsCi0JCQkvLyBnZXRQYXJlbnRFZGl0b3IoKS5nZXRUaXRsZSgpLCBtZS5nZXRUaXRsZSgpKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gLy8geWVzLCBjbG9zZSB0aGlzIGRpYWdyYW0sIGFzayB0byBzYXZlIGNoYW5nZXMKLQkJCS8vIHBhZ2UuY2xvc2VFZGl0b3IobWUsIHRydWUpOwotCQkJLy8gfQotCQkJLy8gLy8gZWl0aGVyIHdheSwgb3VyIHBhcmVudCBpcyBjbG9zZWQgYW5kIHdlIGNhbiBzdG9wCi0JCQkvLyAvLyBsaXN0ZW5pbmcKLQkJCS8vIHBhZ2UucmVtb3ZlUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0JfTsKLQotCXByaXZhdGUgRm9udCBmb250OwotCi0JcHJpdmF0ZSBDb2xvciBjb2xvcjsKLQotCXByaXZhdGUgQ29tbWFuZCByZWZyZXNoRnJvbUJhc2VDb21tYW5kID0gbmV3IENvbW1hbmQoRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcnJlZnJlc2hmcm9tYmFzZSkgeyAKLQkJcHJpdmF0ZSBBcnJheUxpc3Qgb2xkQ29udGVudCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0KLQkJCS8vIGJhY2sgdXAgb2xkIGRpYWdyYW0gY29udGVudAotCQkJLy8KLQkJCW9sZENvbnRlbnQuY2xlYXIoKTsKLQkJCW9sZENvbnRlbnQuYWRkQWxsKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpLmdldENvbnRhaW5lZCgpKTsKLQotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5yZWZyZXNoRnJvbUJhc2UoZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJaWYgKGVkaXRQYXJ0LmlzQWN0aXZlKCkpIHsKLQkJCQllZGl0UGFydC5kZWFjdGl2YXRlKCk7Ci0JCQl9Ci0JCQlkaWFncmFtLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJY3JlYXRlRWRpdFBhcnQoKTsKLQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLnNldENvbnRlbnRzKGVkaXRQYXJ0KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCWRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpLmdldENvbnRhaW5lZCgpLmNsZWFyKCk7Ci0JCQlkaWFncmFtLmdldFVNQURpYWdyYW0oKS5nZXRDb250YWluZWQoKS5hZGRBbGwob2xkQ29udGVudCk7Ci0JCQlpZiAoZWRpdFBhcnQuaXNBY3RpdmUoKSkgewotCQkJCWVkaXRQYXJ0LmRlYWN0aXZhdGUoKTsKLQkJCX0KLQkJCWRpYWdyYW0ucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQljcmVhdGVFZGl0UGFydCgpOwotCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuc2V0Q29udGVudHMoZWRpdFBhcnQpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBNYXAgdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXA7Ci0JLyoqCi0JICogUmVjb3JkcyB0aW1lIHdoZW4gdGhlIG1vZGVsIGZpcnN0IGhhcyBiZWVuIGNoYW5nZWQgYnkgdGhpcyBlZGl0b3IuIFRoaXMgd2lsbCBiZSB1c2VkIGxhdGVyCi0JICogdG8gZGV0ZXJtaW5lIGlmIHNhdmUgaXMgbmVlZGVkIHRvIHJldmVyc2UgdGhlIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIGxvbmcgY2hhbmdlVGltZSA9IC0xOwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWc7Ci0KLQljbGFzcyBEaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciBleHRlbmRzIENvbnRleHRNZW51UHJvdmlkZXIgewotCi0JCXByaXZhdGUgQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnk7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgV29ya2Zsb3dDb250ZXh0TWVudVByb3ZpZGVyIGFzc29pY2F0ZWQgd2l0aCB0aGUgZ2l2ZW4KLQkJICogdmlld2VyIGFuZCBhY3Rpb24gcmVnaXN0cnkuCi0JCSAqIAotCQkgKiBAcGFyYW0gdmlld2VyCi0JCSAqICAgICAgICAgICAgdGhlIHZpZXdlcgotCQkgKiBAcGFyYW0gcmVnaXN0cnkKLQkJICogICAgICAgICAgICB0aGUgYWN0aW9uIHJlZ2lzdHJ5Ci0JCSAqLwotCQlwdWJsaWMgRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIoRWRpdFBhcnRWaWV3ZXIgdmlld2VyLAotCQkJCUFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCQlzdXBlcih2aWV3ZXIpOwotCQkJc2V0QWN0aW9uUmVnaXN0cnkocmVnaXN0cnkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgQ29udGV4dE1lbnVQcm92aWRlciNidWlsZENvbnRleHRNZW51KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBidWlsZENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCQlHRUZBY3Rpb25Db25zdGFudHMuYWRkU3RhbmRhcmRBY3Rpb25Hcm91cHMobWVudSk7Ci0KLQkJCUlBY3Rpb24gYWN0aW9uOwotCQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5VTkRPLmdldElkKCkpOwotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5HUk9VUF9VTkRPLCBhY3Rpb24pOwotCi0JCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSk7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLkdST1VQX1VORE8sIGFjdGlvbik7Ci0KLQkJCWJvb2xlYW4gY2FuTW9kaWZ5ID0gIWlzUmVhZE9ubHkoKTsKLQotCQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKQotCQkJCQkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpOwotCQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQlpZiAoIVRuZ1V0aWwuaXNMb2NrZWQoZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpKSkgewotCQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLkdST1VQX0VESVQsIGFjdGlvbik7Ci0JCQkJfQotCQkJfQotCi0JCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihSRUZSRVNIKTsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuR1JPVVBfVklFVywgYWN0aW9uKTsKLQotCQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oRk9OVF9ESUFMT0cpOwotCQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJCX0KLQotCQkJSUFjdGlvbiBjcmVhdGVGcmVlVGV4dEFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQlDUkVBVEVfRlJFRV9URVhUKTsKLQkJCWlmIChjcmVhdGVGcmVlVGV4dEFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJCWNyZWF0ZUZyZWVUZXh0QWN0aW9uKTsKLQkJCX0KLQotCQkJLy8gSUFjdGlvbiBtb3ZlQWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oTU9WRSk7Ci0JCQkvLyBpZihtb3ZlQWN0aW9uLmlzRW5hYmxlZCgpKXsKLQkJCS8vIG1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLG1vdmVBY3Rpb24pOwotCQkJLy8gfQotCQkJSUFjdGlvbiBsaW5rQWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0xJTkspOwotCQkJaWYgKGxpbmtBY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGxpbmtBY3Rpb24pOwotCQkJfQotCQkJSUFjdGlvbiBzZWxlY3RsaW5rQWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCVNFTEVDVF9MSU5LKTsKLQkJCWlmIChzZWxlY3RsaW5rQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQlzZWxlY3RsaW5rQWN0aW9uKTsKLQkJCX0KLQkJCUlBY3Rpb24gYmVuZHBvaW50QWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCUNSRUFURV9CRU5EX1BPSU5UKTsKLQkJCWlmIChiZW5kcG9pbnRBY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQliZW5kcG9pbnRBY3Rpb24pOwotCQkJfQotCQkJSUFjdGlvbiBhbGlnbmJlbmRwb2ludGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQlBTElHTl9CRU5EX1BPSU5UKTsKLQkJCWlmIChhbGlnbmJlbmRwb2ludGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJCWFsaWduYmVuZHBvaW50YWN0aW9uKTsKLQkJCX0KLQkJCQotCQkJLy9QcmludCBBY3Rpb24gZm9yIGRpYWdyYW0gdGhyb3VnaCBDb250ZXh0IE1lbnUuCi0JCQkvLyBFbmFibGUgdGhpcyBjb2RlIHdoZW4gcHJpbnQgcmVxdWlyZWQgZm9yIGRpYWdyYW0uCi0vLwkJCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuUFJJTlQuZ2V0SWQoKSk7Ci0vLwkJCWlmKGFjdGlvbi5pc0VuYWJsZWQoKSl7Ci0vLwkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLkdST1VQX1BSSU5ULCBhY3Rpb24pOwotLy8JCQl9Ci0JCQkKLQkJCWNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KG1lbnUpOwotCQl9Ci0KLQkJcHJpdmF0ZSBBY3Rpb25SZWdpc3RyeSBnZXRBY3Rpb25SZWdpc3RyeSgpIHsKLQkJCXJldHVybiBhY3Rpb25SZWdpc3RyeTsKLQkJfQotCi0JCS8qKgotCQkgKiBTZXRzIHRoZSBhY3Rpb24gcmVnaXN0cnkKLQkJICogCi0JCSAqIEBwYXJhbSByZWdpc3RyeQotCQkgKiAgICAgICAgICAgIHRoZSBhY3Rpb24gcmVnaXN0cnkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEFjdGlvblJlZ2lzdHJ5KEFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCQlhY3Rpb25SZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICoKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3REaWFncmFtRWRpdG9yKCkgewotCQlzdXBlcigpOwotCQlzZXRFZGl0RG9tYWluKG5ldyBEZWZhdWx0RWRpdERvbWFpbih0aGlzKSk7Ci0JCWdldEVkaXREb21haW4oKS5zZXRDb21tYW5kU3RhY2sobmV3IENvbW1hbmRTdGFjaygpIHsKLQkJCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCQkJQ29tbWFuZCBjbWQgPSBnZXRVbmRvQ29tbWFuZCgpOwotCQkJCWlmIChjbWQgIT0gbnVsbCAmJiAhY21kLmNhblVuZG8oKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5pc0RpcnR5KCk7Ci0JCQl9Ci0JCQkKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjayNleGVjdXRlKG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQkJCWlmKGNvbW1hbmQgPT0gbnVsbCB8fCAhY29tbWFuZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZihjaGFuZ2VUaW1lID09IC0xKSB7Ci0JCQkJCWNoYW5nZVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQl9Ci0JCQkJc3VwZXIuZXhlY3V0ZShjb21tYW5kKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gYWRkIENvbW1hbmRTdGFja0V2ZW50TGlzdGVuZXIKLQkJLy8KLQkJY21kU3RhY2tFdmVudExpc3RlbmVyID0gbmV3IENvbW1hbmRTdGFja0V2ZW50TGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHN0YWNrQ2hhbmdlZChDb21tYW5kU3RhY2tFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXREZXRhaWwoKSA9PSBDb21tYW5kU3RhY2suUE9TVF9FWEVDVVRFKSB7Ci0JCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQkJZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpLmFkZENvbW1hbmRTdGFja0V2ZW50TGlzdGVuZXIoCi0JCQkJY21kU3RhY2tFdmVudExpc3RlbmVyKTsKLQkJLy8gYWRkIG91ciBwYXJ0IGxpc3RlbmVyIGlmIGVpdGhlciBwYXJlbnQgb3IgdGhpcyBjbG9zZXMKLQkJSVdvcmtiZW5jaCB3YiA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luID0gd2IuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW4uZ2V0QWN0aXZlUGFnZSgpOwotCQlwYWdlLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkdyYXBoaWNhbEVkaXRvciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlnZXRDb21tYW5kU3RhY2soKQotCQkJCS5yZW1vdmVDb21tYW5kU3RhY2tFdmVudExpc3RlbmVyKGNtZFN0YWNrRXZlbnRMaXN0ZW5lcik7Ci0KLQkJaWYgKGlzRGlydHkoKSkgewotCQkJLy8gY2hhbmdlcyBkaXNjYXJkZWQsIHJldmVyc2UgdG8gc2F2ZWQKLQkJCS8vCi0JCQlyZXZlcnNlVG9TYXZlZCgpOwotCQl9Ci0KLQkJaWYgKGVkaXRQYXJ0ICE9IG51bGwpIHsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCWRpYWdyYW0ucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZm9udCAhPSBudWxsICYmICFmb250LmlzRGlzcG9zZWQoKSkgewotCQkJZm9udC5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGNvbG9yICE9IG51bGwgJiYgIWNvbG9yLmlzRGlzcG9zZWQoKSkgewotCQkJY29sb3IuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIucmVtb3ZlTGlzdGVuZXIobGlicmFyeUxpc3RlbmVyKTsKLQkJfQotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUxpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJZGlzcG9zZWQgPSB0cnVlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNSZXNvdXJjZUNoYW5nZWRCeU90aGVyKCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKS5lUmVzb3VyY2UoKTsKLQkJaWYocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRVUkkoKS5pc0ZpbGUoKSl7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlyZXR1cm4gZmlsZS5sYXN0TW9kaWZpZWQoKSA+IGNoYW5nZVRpbWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZXZlcnNlVG9TYXZlZCgpIHsKLQkJLy8gc2F2ZSB0aGUgdW5kb25lIGNoYW5nZXMgb25seSBpZiB0aGUgcmVzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHRoaXMgZWRpdG9yCi0JCS8vCi0JCWJvb2xlYW4gc2F2ZU5lZWRlZCA9IGdldENvbW1hbmRTdGFjaygpLmlzRGlydHkoKSAmJiBpc1Jlc291cmNlQ2hhbmdlZEJ5T3RoZXIoKTsKLQkJY2hhbmdlVGltZSA9IC0xOwotCQl3aGlsZSAoZ2V0Q29tbWFuZFN0YWNrKCkuaXNEaXJ0eSgpKSB7Ci0JCQlnZXRDb21tYW5kU3RhY2soKS51bmRvKCk7Ci0JCX0KLQkJaWYgKHNhdmVOZWVkZWQpIHsKLQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudFBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQl0cnkgewotCQkJCXBlcnNpc3Rlci5zYXZlKGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKS5lUmVzb3VyY2UoKSk7Ci0JCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlWaWV3SGVscGVyLnJlbG9hZEN1cnJlbnRMaWJyYXJ5KGdldFNpdGUoKS5nZXRTaGVsbCgpLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlVG9Db250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlib29sZWFuIGNhbk1vZGlmeSA9ICFpc1JlYWRPbmx5KCk7Ci0JCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJUkVGUkVTSF9GUk9NX0JBU0VfQUNUSVZJVFkpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQkJLy8gdGhlIGFsaWduIG1lbnUgaXMgYSBjYXNjYWRpbmcgbWVudQotCQlJQ29udHJpYnV0aW9uSXRlbSBjaSA9IGNyZWF0ZUFsaWduTWVudSgpOwotCQlpZiAoY2kuaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51Ci0JCQkJCS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQkJbmV3IFNlcGFyYXRvcigpKTsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBjaSk7Ci0JCQltZW51Ci0JCQkJCS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQkJbmV3IFNlcGFyYXRvcigpKTsKLQkJfQotCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihERUxFVEVfRElBR1JBTSk7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51Ci0JCQkJCS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQkJbmV3IFNlcGFyYXRvcigpKTsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQkJbWVudQotCQkJCQkuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLAotCQkJCQkJCW5ldyBTZXBhcmF0b3IoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRyaWJ1dGlvbkl0ZW0gY3JlYXRlQWxpZ25NZW51KCkgewotCQkvLyBjcmVhdGUgYSBuZXcgbWVudSBtYW5hZ2VyIGZvciB0aGUgY2FzY2FkaW5nIG1lbnUKLQkJTWVudU1hbmFnZXIgYWxpZ25NZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9yX2FsaWduTWVudV90ZXh0KSB7IAotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJaW50IHRvdGFsID0gMDsKLQkJCQkvLyBlbmFibGUgdGhlIG1lbnUgb25seSBpZiAyIG9yIG1vcmUgbm9kZXMgb3Igbm9kZSBjb250YWluZXJzCi0JCQkJLy8gYXJlIHNlbGVjdGVkCi0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCS8vIG5lZWQgYXQgbGVhc3QgdHdvIHRoaW5ncyBzZWxlY3RlZCB0byBhbGlnbgotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID4gMSkgewotCQkJCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoYSk7Ci0JCQkJCQkvLyB3ZSBjYW4gYWxpZ24gbm9kZXMgYW5kIGNvbnRhaW5lcnMKLQkJCQkJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIE5vZGVFZGl0UGFydAotCQkJCQkJCQl8fCBlZGl0UGFydCBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJCQkJCS8vIGFkZCB1cCB0aGUgZWxlbWVudHMgd2UgbmVlZCwgdGhlcmUgbWF5IGJlIG1vcmUKLQkJCQkJCQkvLyBlbGVtZW50cyBzZWxlY3RlZCAobGlua3MsIGV0Yy4pCi0JCQkJCQkJdG90YWwrKzsKLQkJCQkJCQlpZiAodG90YWwgPiAxKSB7Ci0JCQkJCQkJCS8vIHdlIG9ubHkgbmVlZCB0byBrbm93IHRoZXJlIGlzIG1vcmUgdGhhbiAxLCBzbwotCQkJCQkJCQkvLyB3ZSBjYW4gc3RvcCBoZXJlCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdG90YWwgPiAxOwotCQkJfQotCQl9OwotCQkvLyBhZGQgdGhlIGFjdGlvbnMgdG8gdGhpcyBtZW51Ci0JCWFsaWduTWVudU1hbmFnZXIuYWRkKGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlLkFMSUdOX0hPUlpfQVZFUkFHRSkpOwotCQlhbGlnbk1lbnVNYW5hZ2VyLmFkZChnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQlEaWFncmFtQWN0aW9uU2VydmljZS5BTElHTl9IT1JaX0ZJUlNUX1NFTEVDVEVEKSk7Ci0JCWFsaWduTWVudU1hbmFnZXIuYWRkKGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlLkFMSUdOX1ZFUlRfQVZFUkFHRSkpOwotCQlhbGlnbk1lbnVNYW5hZ2VyLmFkZChnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQlEaWFncmFtQWN0aW9uU2VydmljZS5BTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEKSk7Ci0JCXJldHVybiBhbGlnbk1lbnVNYW5hZ2VyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGcm9tQmFzZSgpIHsKLQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShyZWZyZXNoRnJvbUJhc2VDb21tYW5kKTsKLQotCQkvLyBEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJLy8gR3JhcGhpY2FsRGF0YUhlbHBlci5yZWZyZXNoRnJvbUJhc2UoZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkvLyBPYmplY3QgYWN0ID0gZGlhZ3JhbS5nZXRPYmplY3QoKTsKLQkJLy8gaWYoZWRpdFBhcnQuaXNBY3RpdmUoKSkgewotCQkvLyBlZGl0UGFydC5kZWFjdGl2YXRlKCk7Ci0JCS8vIH0KLQkJLy8gZGlhZ3JhbS5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJLy8gZWRpdFBhcnQgPSBjcmVhdGVFZGl0UGFydChhY3QpOwotCQkvLyBnZXRHcmFwaGljYWxWaWV3ZXIoKS5zZXRDb250ZW50cyhlZGl0UGFydCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsKLQkJc3VwZXIuY3JlYXRlQWN0aW9ucygpOwotCi0JCUFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0QWN0aW9uUmVnaXN0cnkoKTsKLQkJSUFjdGlvbiBhY3Rpb247Ci0KLQkJLy8gcmVwbGFjZSBkZWZhdWx0IGRlbGV0ZSBhY3Rpb24gd2l0aCBhIGN1c3RvbSBvbmUKLQkJLy8KLQkJYWN0aW9uID0gcmVnaXN0cnkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpOwotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCXJlZ2lzdHJ5LnJlbW92ZUFjdGlvbihhY3Rpb24pOwotCQkJZ2V0U2VsZWN0aW9uQWN0aW9ucygpLnJlbW92ZShhY3Rpb24pOwotCQl9Ci0JCWFjdGlvbiA9IG5ldyBEZWxldGVBY3Rpb24oKElXb3JrYmVuY2hQYXJ0KSB0aGlzKSB7Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuV29ya2JlbmNoUGFydEFjdGlvbiNpc0VuYWJsZWQoKQotCQkJICovCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmlzRW5hYmxlZCgpOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkRlbGV0ZUFjdGlvbiNjYWxjdWxhdGVFbmFibGVkKCkKLQkJCSAqLwotCQkJLy8gcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRW5hYmxlZCgpIHsKLQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGdldFNlbGVjdGVkT2JqZWN0cygpLml0ZXJhdG9yKCk7Ci0JCQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkJCS8vIE9iamVjdCBlZGl0UGFydCA9IGl0ZXIubmV4dCgpOwotCQkJLy8gaWYoZWRpdFBhcnQgaW5zdGFuY2VvZiBFZGl0UGFydCkgewotCQkJLy8gT2JqZWN0IG9iaiA9ICgoRWRpdFBhcnQpZWRpdFBhcnQpLmdldE1vZGVsKCk7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBOYW1lZE5vZGUpIHsKLQkJCS8vIE9iamVjdCBlbGVtZW50ID0gKChOYW1lZE5vZGUpb2JqKS5nZXRPYmplY3QoKTsKLQkJCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkvLyByZXR1cm4gZmFsc2U7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyByZXR1cm4gc3VwZXIuY2FsY3VsYXRlRW5hYmxlZCgpOwotCQkJLy8gfQotCQkJLy8gVE9ETzogdW5jb21tZW50IHRoaXMgY29kZSBpZiB3ZSBhcmUgcmVhZHkgdG8gdGVzdCBkZWxldGluZwotCQkJLy8gQnJlYWtkb3duRWxlbWVudCBub2RlCi0JCQkvLwotCQkJLy8gLyogKG5vbi1KYXZhZG9jKQotCQkJLy8gKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkRlbGV0ZUFjdGlvbiNydW4oKQotCQkJLy8gKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFNlbGVjdGVkT2JqZWN0cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlZGl0UGFydCA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBFZGl0UGFydCkgewotCQkJCQkJT2JqZWN0IG9iaiA9ICgoRWRpdFBhcnQpIGVkaXRQYXJ0KS5nZXRNb2RlbCgpOwotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gKChOYW1lZE5vZGUpIG9iaikuZ2V0T2JqZWN0KCk7Ci0JCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCQkJUHJvY2Vzc0RlbGV0ZUFjdGlvbiBkZWxldGVBY3Rpb24gPSBuZXcgUHJvY2Vzc0RlbGV0ZUFjdGlvbigpIHsKLQkJCQkJCS8qCi0JCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCQkgKiAKLQkJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24jY3JlYXRlQ29tbWFuZChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkJCQkJCSAqLwotCQkJCQkJcHVibGljIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kIGNyZWF0ZUNvbW1hbmQoCi0JCQkJCQkJCUNvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJCQkJZG9tYWluID0gbnVsbDsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCQkJCWRvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJCQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQkJCW5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChkb21haW4gPT0gbnVsbCkgewotCQkJCQkJCQlkb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJCQluZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBzdXBlci5jcmVhdGVDb21tYW5kKHNlbGVjdGlvbik7Ci0JCQkJCQl9Ci0KLQkJCQkJfTsKLQkJCQkJZGVsZXRlQWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCQllbGVtZW50cykpOwotCQkJCQlkZWxldGVBY3Rpb24ucnVuKCk7Ci0JCQkJCWlmIChkZWxldGVBY3Rpb24uaXNEZWxldGlvbkNvbmZpcm1lZCgpKSB7Ci0JCQkJCQlzdXBlci5ydW4oKTsKLQotCQkJCQkJLy8gc2F2ZSB0aGUgZWRpdG9yCi0JCQkJCQkvLyAKLQkJCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpCi0JCQkJCQkJCS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJZG9TYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0KLQkJCQl9IGVsc2UgewotCQkJCQlzdXBlci5ydW4oKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCWdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCi0JCWFjdGlvbiA9IG5ldyBDb3B5VGVtcGxhdGVBY3Rpb24odGhpcyk7Ci0JCXJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJLy8gcmVmcmVzaCBkaWFncmFtIGZyb20gYmFzZSBhY3Rpb24KLQkJLy8KLQkJYWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9yX3JlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQpIHsgCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBSRUZSRVNIX0ZST01fQkFTRV9BQ1RJVklUWTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJlZnJlc2hGcm9tQmFzZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCk7Ci0JCQkJcmV0dXJuIGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQkvLyBhY3Rpb24gPSBuZXcgTWF0Y2hXaWR0aEFjdGlvbih0aGlzKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0KLQkJLy8gYWN0aW9uID0gbmV3IE1hdGNoSGVpZ2h0QWN0aW9uKHRoaXMpOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQotCQkvLyBhY3Rpb24gPSBuZXcgTG9naWNQYXN0ZVRlbXBsYXRlQWN0aW9uKHRoaXMpOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQotCQkvLyBhY3Rpb24gPSBuZXcgSW5jcmVtZW50RGVjcmVtZW50QWN0aW9uKHRoaXMsIHRydWUpOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQkJLy8KLQkJLy8gYWN0aW9uID0gbmV3IEluY3JlbWVudERlY3JlbWVudEFjdGlvbih0aGlzLCBmYWxzZSk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCQkvLwotCQkvLyBhY3Rpb24gPSBuZXcgRGlyZWN0RWRpdEFjdGlvbigoSVdvcmtiZW5jaFBhcnQpdGhpcyk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCQkvLwotCQkvLyBhY3Rpb24gPSBuZXcgQWxpZ25tZW50QWN0aW9uKChJV29ya2JlbmNoUGFydCl0aGlzLAotCQkvLyBQb3NpdGlvbkNvbnN0YW50cy5MRUZUKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0JCS8vCi0JCS8vIGFjdGlvbiA9IG5ldyBBbGlnbm1lbnRBY3Rpb24oKElXb3JrYmVuY2hQYXJ0KXRoaXMsCi0JCS8vIFBvc2l0aW9uQ29uc3RhbnRzLlJJR0hUKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0JCS8vCi0JCS8vIGFjdGlvbiA9IG5ldyBBbGlnbm1lbnRBY3Rpb24oKElXb3JrYmVuY2hQYXJ0KXRoaXMsCi0JCS8vIFBvc2l0aW9uQ29uc3RhbnRzLlRPUCk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCQkvLwotCQkvLyBhY3Rpb24gPSBuZXcgQWxpZ25tZW50QWN0aW9uKChJV29ya2JlbmNoUGFydCl0aGlzLAotCQkvLyBQb3NpdGlvbkNvbnN0YW50cy5CT1RUT00pOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQkJLy8KLQkJLy8gYWN0aW9uID0gbmV3IEFsaWdubWVudEFjdGlvbigoSVdvcmtiZW5jaFBhcnQpdGhpcywKLQkJLy8gUG9zaXRpb25Db25zdGFudHMuQ0VOVEVSKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0JCS8vCi0JCS8vIGFjdGlvbiA9IG5ldyBBbGlnbm1lbnRBY3Rpb24oKElXb3JrYmVuY2hQYXJ0KXRoaXMsCi0JCS8vIFBvc2l0aW9uQ29uc3RhbnRzLk1JRERMRSk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCi0JCUlBY3Rpb24gYWN0aW9uMSA9IG5ldyBBY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dCkgeyAKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIEZPTlRfRElBTE9HOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUVkaXRQYXJ0IHNlbGVjdGVkRWRpdFBhcnQgPSAoRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJCS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLmdldCgwKTsKLQkJCQkJCQotCQkJCQkJRm9udERpYWxvZyBmZCA9IG5ldyBGb250RGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCS5nZXRTaGVsbCgpKTsKLQkJCQkJCS8vIFJlc3RvcmluZyBvbGQgdmFsdWVzLgotCQkJCQkJaWYoc2VsZWN0ZWRFZGl0UGFydCAhPSBudWxsKXsKLQkJCQkJCQlyZXN0b3JlRm9udERhdGEoc2VsZWN0ZWRFZGl0UGFydCwgZmQpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQlpZiAoc2VsZWN0ZWRFZGl0UGFydCBpbnN0YW5jZW9mIEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KSB7Ci0JCQkJCQkJaWYgKGZkLmdldEZvbnRMaXN0KCkgIT0gbnVsbCkgewotCQkJCQkJCQlGb250RGF0YSBmRGF0YSA9IGZkLmdldEZvbnRMaXN0KClbMF07Ci0JCQkJCQkJCWlmIChmRGF0YSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpZiAoZm9udCAhPSBudWxsICYmICFmb250LmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQkJCWZvbnQuZGlzcG9zZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJLy8gaWYoY29sb3IgIT0gbnVsbCAmJiAhZm9udC5pc0Rpc3Bvc2VkKCkpewotCQkJCQkJCQkJLy8gY29sb3IuZGlzcG9zZSgpOwotCQkJCQkJCQkJLy8gfQotCQkJCQkJCQkJZm9udCA9IG5ldyBGb250KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCQkJCQkJLmdldERpc3BsYXkoKSwgZkRhdGEpOwotCQkJCQkJCQkJCi0JCQkJCQkJCQlpZihmZC5nZXRSR0IoKSAhPSBudWxsKQotCQkJCQkJCQkJY29sb3IgPSBuZXcgQ29sb3IobnVsbCwgZmQuZ2V0UkdCKCkpOwotCQkJCQkJCQkJCi0JCQkJCQkJCQkoKEZyZWVUZXh0RmlndXJlKSAoKEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KSBzZWxlY3RlZEVkaXRQYXJ0KQotCQkJCQkJCQkJCQkuZ2V0RmlndXJlKCkpLnNldEZvbnQoZm9udCk7Ci0JCQkJCQkJCQkKLQkJCQkJCQkJCWlmKGNvbG9yICE9IG51bGwpCi0JCQkJCQkJCQkoKEZyZWVUZXh0RmlndXJlKSAoKEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KSBzZWxlY3RlZEVkaXRQYXJ0KQotCQkJCQkJCQkJCQkuZ2V0RmlndXJlKCkpCi0JCQkJCQkJCQkJCS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCi0JCQkJCQkJCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gKChOb2RlKSBzZWxlY3RlZEVkaXRQYXJ0Ci0JCQkJCQkJCQkJCS5nZXRNb2RlbCgpKS5nZXRHcmFwaE5vZGUoKTsKLQkJCQkJCQkJCUxpc3QgbGlzdCA9IGdyYXBoTm9kZQotCQkJCQkJCQkJCQkuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLQotCQkJCQkJCQkJU3RyaW5nIHRleHQgPSAoKEZyZWVUZXh0RmlndXJlKSAoKEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KSBzZWxlY3RlZEVkaXRQYXJ0KQotCQkJCQkJCQkJCQkuZ2V0RmlndXJlKCkpLmdldFRleHQoKTsKLQkJCQkJCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gZ2V0UHJvcGVydHlCeUtleSgKLQkJCQkJCQkJCQkJbGlzdCwKLQkJCQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX0ZSRUVfVEVYVCk7Ci0JCQkJCQkJCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCQkJCQkJCXByb3BlcnR5LnNldFZhbHVlKHRleHQpOwotCQkJCQkJCQkJCWxpc3QuYWRkKHByb3BlcnR5KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCXNldFByb3BlcnR5KAotCQkJCQkJCQkJCQlsaXN0LAotCQkJCQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX05BTUUsCi0JCQkJCQkJCQkJCWZEYXRhLmdldE5hbWUoKSk7Ci0JCQkJCQkJCQlzZXRQcm9wZXJ0eSgKLQkJCQkJCQkJCQkJbGlzdCwKLQkJCQkJCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9TVFlMRSwKLQkJCQkJCQkJCQkJbmV3IEludGVnZXIoZkRhdGEuZ2V0U3R5bGUoKSkKLQkJCQkJCQkJCQkJCQkudG9TdHJpbmcoKSk7Ci0JCQkJCQkJCQlzZXRQcm9wZXJ0eSgKLQkJCQkJCQkJCQkJbGlzdCwKLQkJCQkJCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9IRUlHSFQsCi0JCQkJCQkJCQkJCW5ldyBJbnRlZ2VyKGZEYXRhLmdldEhlaWdodCgpKQotCQkJCQkJCQkJCQkJCS50b1N0cmluZygpKTsKLQkJCQkJCQkJCWlmKGZkLmdldFJHQigpICE9IG51bGwpewotCQkJCQkJCQkJc2V0UHJvcGVydHkoCi0JCQkJCQkJCQkJCWxpc3QsCi0JCQkJCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfUkVELAotCQkJCQkJCQkJCQluZXcgSW50ZWdlcihmZC5nZXRSR0IoKS5yZWQpCi0JCQkJCQkJCQkJCQkJLnRvU3RyaW5nKCkpOwotCQkJCQkJCQkJc2V0UHJvcGVydHkoCi0JCQkJCQkJCQkJCWxpc3QsCi0JCQkJCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfQkxVRSwKLQkJCQkJCQkJCQkJbmV3IEludGVnZXIoZmQuZ2V0UkdCKCkuYmx1ZSkKLQkJCQkJCQkJCQkJCQkudG9TdHJpbmcoKSk7Ci0JCQkJCQkJCQlzZXRQcm9wZXJ0eSgKLQkJCQkJCQkJCQkJbGlzdCwKLQkJCQkJCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9HUkVFTiwKLQkJCQkJCQkJCQkJbmV3IEludGVnZXIoZmQuZ2V0UkdCKCkuZ3JlZW4pCi0JCQkJCQkJCQkJCQkJLnRvU3RyaW5nKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJc2VsZWN0ZWRFZGl0UGFydC5yZWZyZXNoKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCi0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgIT0gMSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDApOwotCQkJCWlmIChlZGl0UGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJCXJldHVybiAoKChUeXBlZE5vZGUpIGVkaXRQYXJ0LmdldE1vZGVsKCkpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuRlJFRV9URVhUKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgUHJvcGVydHkgZ2V0UHJvcGVydHlCeUtleShMaXN0IGxpc3QsIFN0cmluZyBrZXkpIHsKLQkJCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXJvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXJvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IChQcm9wZXJ0eSkgaXJvci5uZXh0KCk7Ci0JCQkJCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCQkJCWlmIChwcm9wZXJ0eS5nZXRLZXkoKS5lcXVhbHMoa2V5KSkgewotCQkJCQkJCQlyZXR1cm4gcHJvcGVydHk7Ci0JCQkJCQkJfSAKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0UHJvcGVydHkoTGlzdCBsaXN0LCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQotCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gZ2V0UHJvcGVydHlCeUtleShsaXN0LCBrZXkpOwotCQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJCXByb3BlcnR5LnNldFZhbHVlKHZhbHVlKTsKLQotCQkJCX0gZWxzZSB7Ci0JCQkJCXByb3BlcnR5ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHkoKTsKLQkJCQkJcHJvcGVydHkuc2V0S2V5KGtleSk7Ci0JCQkJCXByb3BlcnR5LnNldFZhbHVlKHZhbHVlKTsKLQkJCQl9Ci0JCQkJbGlzdC5hZGQocHJvcGVydHkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgcmVzdG9yZUZvbnREYXRhKEVkaXRQYXJ0IHNlbGVjdGVkRWRpdFBhcnQsIEZvbnREaWFsb2cgZmQpewotCQkJCUdyYXBoTm9kZSBncmFwaE5vZGUgPSAoKE5vZGUpIHNlbGVjdGVkRWRpdFBhcnQKLQkJCQkJCS5nZXRNb2RlbCgpKS5nZXRHcmFwaE5vZGUoKTsKLQkJCQkJTGlzdCBsaXN0ID0gZ3JhcGhOb2RlCi0JCQkJCQkuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLQkJCQkJaWYobGlzdCAhPSBudWxsICYmICFsaXN0LmlzRW1wdHkoKSl7Ci0JCQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IG51bGw7Ci0JCQkJCQlTdHJpbmcgZm9udG5hbWUgPSBudWxsLCBmb250U3R5bGUgPSBudWxsLCBmb250SGVpZ2h0ID0gbnVsbCwgcmVkID0gbnVsbCwgYmx1ZSA9IG51bGwsIGdyZWVuID0gbnVsbDsKLQotCQkJCQkJcHJvcGVydHkgPSBnZXRQcm9wZXJ0eUJ5S2V5KGxpc3QsIFRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfTkFNRSk7Ci0JCQkJCQlpZihwcm9wZXJ0eSAhPSBudWxsICl7Ci0JCQkJCQkJZm9udG5hbWUgPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQkJCQkJfWVsc2V7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlwcm9wZXJ0eSA9IGdldFByb3BlcnR5QnlLZXkobGlzdCwgVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9TVFlMRSk7Ci0JCQkJCQlpZihwcm9wZXJ0eSAhPSBudWxsICl7Ci0JCQkJCQkJZm9udFN0eWxlID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJCX0KLQkJCQkJCXByb3BlcnR5ID0gZ2V0UHJvcGVydHlCeUtleShsaXN0LCBUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0hFSUdIVCk7Ci0JCQkJCQlpZihwcm9wZXJ0eSAhPSBudWxsKXsKLQkJCQkJCQlmb250SGVpZ2h0ID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJCX0KLQkJCQkJCXByb3BlcnR5ID0gZ2V0UHJvcGVydHlCeUtleShsaXN0LCBUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX1JFRCk7Ci0JCQkJCQlpZihwcm9wZXJ0eSAhPSBudWxsKXsKLQkJCQkJCQlyZWQgPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQkJCQkJfQotCQkJCQkJcHJvcGVydHkgPSBnZXRQcm9wZXJ0eUJ5S2V5KGxpc3QsIFRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfQkxVRSk7Ci0JCQkJCQlpZihwcm9wZXJ0eSAhPSBudWxsKXsKLQkJCQkJCQlibHVlID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJCX0KLQkJCQkJCXByb3BlcnR5ID0gZ2V0UHJvcGVydHlCeUtleShsaXN0LCBUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0dSRUVOKTsKLQkJCQkJCWlmKHByb3BlcnR5ICE9IG51bGwpewotCQkJCQkJCWdyZWVuID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJRm9udERhdGEgZkRhdGEgPSBuZXcgRm9udERhdGEoKTsKLQkJCQkJCWZEYXRhLnNldE5hbWUoZm9udG5hbWUpOwotCQkJCQkJZkRhdGEuc2V0SGVpZ2h0KChuZXcgSW50ZWdlcihmb250SGVpZ2h0KSkuaW50VmFsdWUoKSk7Ci0JCQkJCQlmRGF0YS5zZXRTdHlsZSgobmV3IEludGVnZXIoZm9udFN0eWxlKSkuaW50VmFsdWUoKSk7Ci0JCQkJCQkKLQkJCQkJCS8vLCAobmV3IEludGVnZXIoZm9udFN0eWxlKSkuaW50VmFsdWUoKSwgKG5ldyBJbnRlZ2VyKGZvbnRIZWlnaHQpKS5pbnRWYWx1ZSgpKTsKLQkJCQkJCWlmKCByZWQgIT0gbnVsbCAmJiBibHVlICE9IG51bGwgJiYgZ3JlZW4gIT0gbnVsbCl7Ci0JCQkJCQkJUkdCIHJnYiA9IG5ldyBSR0IobmV3IEludGVnZXIocmVkKS5pbnRWYWx1ZSgpLAotCQkJCQkJCQkJbmV3IEludGVnZXIoZ3JlZW4pLmludFZhbHVlKCksCi0JCQkJCQkJCQkgbmV3IEludGVnZXIoYmx1ZSkuaW50VmFsdWUoKQotCQkJCQkJCQkJICk7Ci0JCQkJCQkJZmQuc2V0UkdCKHJnYik7Ci0vLwkJCQkJCQlpZihyZ2IgIT0gbnVsbCl7Ci0vLwkJCQkJCQkJcmdiLnJlZCA9IG5ldyBJbnRlZ2VyKHJlZCkuaW50VmFsdWUoKTsKLS8vCQkJCQkJCQlyZ2IuYmx1ZSA9IG5ldyBJbnRlZ2VyKGJsdWUpLmludFZhbHVlKCk7Ci0vLwkJCQkJCQkJcmdiLmdyZWVuID0gbmV3IEludGVnZXIoZ3JlZW4pLmludFZhbHVlKCk7Ci0vLwkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlmZC5zZXRGb250TGlzdChuZXcgRm9udERhdGFbXXtmRGF0YX0pOwotCQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uMSk7Ci0KLQkJLy8gSmluaHVhIFhpCi0JCS8vIGFkZGVkIHRoaXMgdG8gY29uc29saWRhdGUgY29tbW9uIGFjdGlvbnMgaW50byBhIHNlcnZpY2UgY2xhc3MKLQkJYWN0aW9uU2VydmljZSA9IG5ldyBEaWFncmFtQWN0aW9uU2VydmljZShnZXRHcmFwaGljYWxWaWV3ZXIoKSwKLQkJCQlnZXRFZGl0RG9tYWluKCksIHJlZ2lzdHJ5KTsKLQkJYWN0aW9uU2VydmljZS5yZWdpc3Rlckhvcml6b250YWxBbGlnbkF2ZXJhZ2VBY3Rpb24oKTsKLQkJYWN0aW9uU2VydmljZS5yZWdpc3Rlckhvcml6b250YWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKTsKLQkJYWN0aW9uU2VydmljZS5yZWdpc3RlclZlcnRpY2FsQWxpZ25BdmVyYWdlQWN0aW9uKCk7Ci0JCWFjdGlvblNlcnZpY2UucmVnaXN0ZXJWZXJ0aWNhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbigpOwotCi0JCS8vIC8vIGFsaWduIGhvcml6b250YWxseSB0byBhdmVyYWdlIHktdmFsdWUgb2YgYWxsIG5vZGVzCi0JCS8vIElBY3Rpb24gaEFsaWduQXZlcmFnZUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCS8vIERpYWdyYW1VSVJlc291cmNlcwotCQkvLyAuZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWJzdHJhY3REaWFncmFtRWRpdG9yLmhBbGlnbkF2ZXJhZ2VBY3Rpb24udGV4dCIpKQotCQkvLyB7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcHVibGljIHZvaWQgcnVuKCkgewotCQkvLyBob3JpekFsaWduVG9BdmVyYWdlU2VsZWN0ZWQoKTsKLQkJLy8gfQotCQkvLwotCQkvLyBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkvLyByZXR1cm4gQUxJR05fSE9SWl9BVkVSQUdFOwotCQkvLyB9Ci0JCS8vIH07Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oaEFsaWduQXZlcmFnZUFjdGlvbik7Ci0JCS8vCi0JCS8vIC8vIGFsaWduIGhvcml6b250YWxseSB0byB5LXZhbHVlIG9mIGZpcnN0IHNlbGVjdGVkIG5vZGUKLQkJLy8gSUFjdGlvbiBoQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJLy8gRGlhZ3JhbVVJUmVzb3VyY2VzCi0JCS8vIC5nZXRTdHJpbmcoIkRpYWdyYW1VSS5BYnN0cmFjdERpYWdyYW1FZGl0b3IuaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbi50ZXh0IikpCi0JCS8vIHsgLy8kTk9OLU5MUy0xJAotCQkvLyBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCS8vIGhvcnpBbGlnblRvRmlyc3RTZWxlY3RlZCgpOwotCQkvLyB9Ci0JCS8vCi0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCS8vIHJldHVybiBBTElHTl9IT1JaX0ZJUlNUX1NFTEVDVEVEOwotCQkvLyB9Ci0JCS8vIH07Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbik7Ci0JCS8vCi0JCS8vIC8vIGFsaWduIHZlcnRpY2FsbHkgdG8gYXZlcmFnZSB4LXZhbHVlIG9mIGFsbCBzZWxlY3RlZCBub2RlcwotCQkvLyBJQWN0aW9uIHZBbGlnbkF2ZXJhZ2VBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkvLyBEaWFncmFtVUlSZXNvdXJjZXMKLQkJLy8gLmdldFN0cmluZygiRGlhZ3JhbVVJLkFic3RyYWN0RGlhZ3JhbUVkaXRvci52QWxpZ25BdmVyYWdlQWN0aW9uLnRleHQiKSkKLQkJLy8geyAvLyROT04tTkxTLTEkCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLy8gdmVydGljYWxBbGlnblRvQXZlcmFnZVNlbGVjdGVkKCk7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJLy8gcmV0dXJuIEFMSUdOX1ZFUlRfQVZFUkFHRTsKLQkJLy8gfQotCQkvLyB9OwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHZBbGlnbkF2ZXJhZ2VBY3Rpb24pOwotCQkvLwotCQkvLyAvLyBhbGlnbiB2ZXJ0aWNhbGx5IHRvIHgtdmFsdWUgb2YgZmlyc3Qgc2VsZWN0ZWQgbm9kZQotCQkvLyBJQWN0aW9uIHZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkvLyBEaWFncmFtVUlSZXNvdXJjZXMKLQkJLy8gLmdldFN0cmluZygiRGlhZ3JhbVVJLkFic3RyYWN0RGlhZ3JhbUVkaXRvci52QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uLnRleHQiKSkKLQkJLy8geyAvLyROT04tTkxTLTEkCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLy8gdmVydGljYWxBbGlnblRvRmlyc3RTZWxlY3RlZCgpOwotCQkvLyB9Ci0JCS8vCi0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCS8vIHJldHVybiBBTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEOwotCQkvLyB9Ci0JCS8vIH07Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24odkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbik7Ci0KLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90ZXh0LCBmcmVlVHh0Tm9kZUNyZWF0aW9uRmFjdG9yeSwgCi0JCQkJQ1JFQVRFX0ZSRUVfVEVYVCwKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXAsIAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnJlZXRleHRfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQlhY3Rpb24gPSBuZXcgQWN0aW9uKERpYWdyYW1VSVJlc291cmNlcy5tb3ZlQWN0aW9uX2xhYmVsKSB7IAotCi0JCQlwdWJsaWMgdm9pZCBzZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yIG5ld0ltYWdlKSB7Ci0JCQkJc3VwZXIuc2V0SW1hZ2VEZXNjcmlwdG9yKG5ld0ltYWdlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJc3VwZXIucnVuV2l0aEV2ZW50KGV2ZW50KTsKLQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc3VwZXIucnVuKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgPiAwKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIE1PVkU7Ci0JCQl9Ci0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCUlBY3Rpb24gbGlua0FjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9MaW5rX3RleHQpIHsgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDIpIHsKLQkJCQkJRWRpdFBhcnQgc291cmNlRWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMCk7Ci0JCQkJCUVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDEpOwotCQkJCQlMaXN0IHRhcmdldExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWlmIChzb3VyY2VFZGl0UGFydCBpbnN0YW5jZW9mIEZyZWVUZXh0Tm9kZUVkaXRQYXJ0Ci0JCQkJCQkJfHwgdGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBGcmVlVGV4dE5vZGVFZGl0UGFydCkKLQkJCQkJCXJldHVybjsKLQkJCQkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJCQl0YXJnZXRMaXN0ID0gKChOb2RlRWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQotCQkJCQkJCQkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCQkJCWlmICghdGFyZ2V0TGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB0YXJnZXRMaXN0Lml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCUxpbmtFZGl0UGFydCBvYmogPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYgKHRhcmdldEVkaXRQYXJ0LmVxdWFscyhvYmouZ2V0U291cmNlKCkpKQotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQlpZiAodGFyZ2V0RWRpdFBhcnQuZXF1YWxzKG9iai5nZXRUYXJnZXQoKSkpCi0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJdGFyZ2V0TGlzdCA9ICgoTm9kZUVkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkKLQkJCQkJCQkJLmdldFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQkJCQlpZiAoIXRhcmdldExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gdGFyZ2V0TGlzdC5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlMaW5rRWRpdFBhcnQgb2JqID0gKExpbmtFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmICh0YXJnZXRFZGl0UGFydC5lcXVhbHMob2JqLmdldFNvdXJjZSgpKSkKLQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJaWYgKHRhcmdldEVkaXRQYXJ0LmVxdWFscyhvYmouZ2V0VGFyZ2V0KCkpKQotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlMaW5rIGxpbmsgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmsoKTsKLQkJCQkJaWYgKHNvdXJjZUVkaXRQYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBOb2RlKQotCQkJCQkJbGluay5zZXRTb3VyY2UoKE5vZGUpIHNvdXJjZUVkaXRQYXJ0LmdldE1vZGVsKCkpOwotCQkJCQlpZiAodGFyZ2V0RWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIE5vZGUpCi0JCQkJCQlsaW5rLnNldFRhcmdldCgoTm9kZSkgdGFyZ2V0RWRpdFBhcnQuZ2V0TW9kZWwoKSk7Ci0JCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ3JlYXRlTGlua0NvbW1hbmQoCi0JCQkJCQkJbGluaywgKE5vZGUpIHNvdXJjZUVkaXRQYXJ0LmdldE1vZGVsKCkpOwotCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBlZGl0UGFydHMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBwYXJ0ID0gaXRvci5uZXh0KCk7Ci0JCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgRnJlZVRleHROb2RlRWRpdFBhcnQpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDIpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQ1JFQVRFX0xJTks7Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24obGlua0FjdGlvbik7Ci0KLQkJSUFjdGlvbiBzZWxlY3RMaW5rQWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0xpbmtfc2VsZWN0KSB7IAotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDEpIHsKLQkJCQkJRWRpdFBhcnQgcGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCUxpc3QgbGlzdCA9ICgoTm9kZUVkaXRQYXJ0KSBwYXJ0KQotCQkJCQkJCQkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCQkJCWlmIChsaXN0ICE9IG51bGwgJiYgIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJTGlua0VkaXRQYXJ0IGxpbmtwYXJ0ID0gKExpbmtFZGl0UGFydCkgbGlzdC5nZXQoMCk7Ci0JCQkJCQkJbGlua3BhcnQuc2V0U2VsZWN0ZWQoMSk7Ci0JCQkJCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuc2VsZWN0KGxpbmtwYXJ0KTsKLQkJCQkJCQkvLyBwYXJ0LnNldFNlbGVjdGVkKDApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDEpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gU0VMRUNUX0xJTks7Ci0JCQl9Ci0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihzZWxlY3RMaW5rQWN0aW9uKTsKLQotCQlJQWN0aW9uIGNyZWF0ZUJlbmRQb2ludEFjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9CZW5kUG9pbnRfY3JlYXRlKSB7IAotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDEpIHsKLQkJCQkJRWRpdFBhcnQgcGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBMaW5rRWRpdFBhcnQpIHsKLQkJCQkJCS8vIHJldHVybiB0cnVlOwotCQkJCQkJTGluayBsaW5rID0gKExpbmspICgoTGlua0VkaXRQYXJ0KSBwYXJ0KS5nZXRNb2RlbCgpOwotCQkJCQkJTGlzdCBiZW5kcG9pbnRzID0gbGluay5nZXRCZW5kcG9pbnRzKCk7Ci0JCQkJCQlpZiAoYmVuZHBvaW50cyA9PSBudWxsIHx8IGJlbmRwb2ludHMuc2l6ZSgpIDwgMSkgewotCQkJCQkJCVBvaW50IHNwID0gbGluay5nZXRTb3VyY2VFbmRQb2ludCgpOwotCQkJCQkJCVBvaW50IHRwID0gbGluay5nZXRUYXJnZXRFbmRQb2ludCgpOwotCQkJCQkJCWlmIChzcCA9PSBudWxsKSB7Ci0JCQkJCQkJCWlmIChsaW5rLmdldFNvdXJjZSgpID09IG51bGwpIHsKLQkJCQkJCQkJCXNwID0gKChOb2RlKSBsaW5rLmVDb250YWluZXIoKSkKLQkJCQkJCQkJCQkJLmdldExvY2F0aW9uKCk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlzcCA9IGxpbmsuZ2V0U291cmNlKCkuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAodHAgPT0gbnVsbCkgewotCQkJCQkJCQl0cCA9IGxpbmsuZ2V0VGFyZ2V0KCkuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCQl9Ci0JCQkJCQkJUG9pbnQgYlBvaW50ID0gbmV3IFBvaW50KCk7Ci0JCQkJCQkJYlBvaW50LnggPSAoc3AueCArIHRwLngpIC8gMjsKLQkJCQkJCQliUG9pbnQueSA9IChzcC55ICsgdHAueSkgLyAyOwotCQkJCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ3JlYXRlQmVuZHBvaW50Q29tbWFuZCgKLQkJCQkJCQkJCWxpbmssIGJQb2ludCwgMCk7Ci0JCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDEpIHsKLQkJCQkJRWRpdFBhcnQgcGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBMaW5rRWRpdFBhcnQpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQ1JFQVRFX0JFTkRfUE9JTlQ7Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oY3JlYXRlQmVuZFBvaW50QWN0aW9uKTsKLQotCQlJQWN0aW9uIHJlZnJlc2hBY3Rpb24gPSBuZXcgQWN0aW9uKERpYWdyYW1VSVJlc291cmNlcy5yZWZyZXNoQWN0aW9uX2xhYmVsKSB7IAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCWlmIChlZGl0UGFydC5pc0FjdGl2ZSgpKSB7Ci0JCQkJCWVkaXRQYXJ0LmRlYWN0aXZhdGUoKTsKLQkJCQl9Ci0JCQkJZGlhZ3JhbS5yZW1vdmVDb25zdW1lcihBYnN0cmFjdERpYWdyYW1FZGl0b3IudGhpcyk7Ci0JCQkJY3JlYXRlRWRpdFBhcnQoKTsKLQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5zZXRDb250ZW50cyhlZGl0UGFydCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIFJFRlJFU0g7Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24ocmVmcmVzaEFjdGlvbik7Ci0JCUlBY3Rpb24gZGVsZXRlRGlhZ3JhbUFjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbVVJUmVzb3VyY2VzLkRlbGV0ZURpYWdyYW1fdGV4dCkgeyAKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmIChBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkRlbGV0ZURpYWdyYW1fdGV4dCwgCi0JCQkJCQkJCURpYWdyYW1VSVJlc291cmNlcy5EZWxldGVEaWFncmFtX3Byb21wdCkpIHsgCi0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSAoKEVkaXRQYXJ0KSBnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkJCS5nZXRDb250ZW50cygpKS5nZXRNb2RlbCgpOwotCQkJCQlFY29yZVV0aWwucmVtb3ZlKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQkJZG9TYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKAotCQkJCQkJCWdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCksIGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlyZXR1cm4gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKS5zaXplKCkgPT0gMDsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gREVMRVRFX0RJQUdSQU07Ci0JCQl9Ci0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihkZWxldGVEaWFncmFtQWN0aW9uKTsKLQkJSUFjdGlvbiBhbGlnbkJlbmRQb2ludEFjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbVVJUmVzb3VyY2VzLmFsaWduX2JlbmRfcG9pbnRfdGV4dCkgeyAKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUVkaXRQYXJ0IHBhcnQgPSAoRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKS5nZXQoMCk7Ci0JCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBMaW5rRWRpdFBhcnQpIHsKLQkJCQkJTGlua0VkaXRQYXJ0IGxpbmtwYXJ0ID0gKChMaW5rRWRpdFBhcnQpIHBhcnQpOwotCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgbGlua3BhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJaWYgKGxpbmsuZ2V0QmVuZHBvaW50cygpLnNpemUoKSA+IDApIHsKLQotCQkJCQkJR3JhcGhpY2FsRWRpdFBhcnQgc3BhcnQgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBsaW5rcGFydAotCQkJCQkJCQkuZ2V0U291cmNlKCkpOwotCQkJCQkJR3JhcGhpY2FsRWRpdFBhcnQgdHBhcnQgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBsaW5rcGFydAotCQkJCQkJCQkuZ2V0VGFyZ2V0KCkpOwotCi0JCQkJCQlQb2ludCBzcCA9IHNwYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotCQkJCQkJUG9pbnQgdHAgPSB0cGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTsKLQotCQkJCQkJaWYgKHNwYXJ0IGluc3RhbmNlb2YgRGVjaXNpb25Ob2RlRWRpdFBhcnQKLQkJCQkJCQkJfHwgc3BhcnQgaW5zdGFuY2VvZiBTeW5jaEJhck5vZGVFZGl0UGFydCkgewotCQkJCQkJCXNwID0gKChUeXBlZE5vZGUpIHNwYXJ0LmdldE1vZGVsKCkpLmdldExvY2F0aW9uKCk7Ci0JCQkJCQkJTGlzdCBsaXN0ID0gKChOb2RlRWRpdFBhcnQpIHNwYXJ0KQotCQkJCQkJCQkJLmdldFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlMaW5rRWRpdFBhcnQgbHAgPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYgKGxwLmdldFRhcmdldCgpLmVxdWFscyh0cGFydCkpIHsKLQkJCQkJCQkJCVBvaW50IHNvdXJjZUVuZFBvaW50ID0gKChMaW5rKSBscAotCQkJCQkJCQkJCQkuZ2V0TW9kZWwoKSkuZ2V0U291cmNlRW5kUG9pbnQoKTsKLQkJCQkJCQkJCXNwID0gc3AuZ2V0VHJhbnNsYXRlZChzb3VyY2VFbmRQb2ludCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmICh0cGFydCBpbnN0YW5jZW9mIERlY2lzaW9uTm9kZUVkaXRQYXJ0Ci0JCQkJCQkJCXx8IHRwYXJ0IGluc3RhbmNlb2YgU3luY2hCYXJOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCQl0cCA9ICgoVHlwZWROb2RlKSB0cGFydC5nZXRNb2RlbCgpKS5nZXRMb2NhdGlvbigpOwotCQkJCQkJCUxpc3QgbGlzdCA9ICgoTm9kZUVkaXRQYXJ0KSB0cGFydCkKLQkJCQkJCQkJCS5nZXRUYXJnZXRDb25uZWN0aW9ucygpOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJTGlua0VkaXRQYXJ0IGxwID0gKExpbmtFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmIChscC5nZXRTb3VyY2UoKS5lcXVhbHMoc3BhcnQpKSB7Ci0JCQkJCQkJCQlQb2ludCB0YXJnZXRFbmRQb2ludCA9ICgoTGluaykgbHAKLQkJCQkJCQkJCQkJLmdldE1vZGVsKCkpLmdldFRhcmdldEVuZFBvaW50KCk7Ci0JCQkJCQkJCQl0cCA9IHRwLmdldFRyYW5zbGF0ZWQodGFyZ2V0RW5kUG9pbnQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5rLmdldEJlbmRwb2ludHMoKS5zaXplKCk7IGkrKykgewotCQkJCQkJCUFic29sdXRlQmVuZHBvaW50IG9sZGJwID0gKEFic29sdXRlQmVuZHBvaW50KSBsaW5rCi0JCQkJCQkJCQkuZ2V0QmVuZHBvaW50cygpLmdldChpKTsKLQkJCQkJCQlBYnNvbHV0ZUJlbmRwb2ludCBicCA9IG5ldyBBYnNvbHV0ZUJlbmRwb2ludCgKLQkJCQkJCQkJCW5ldyBQb2ludCgtMSwgLTEpKTsKLQkJCQkJCQlBYnNvbHV0ZUJlbmRwb2ludCBwcmV2aW91c2JwID0gbnVsbDsKLQkJCQkJCQlpbnQgZGVsdGEgPSA0MDsKLQkJCQkJCQlpbnQgcG9zaXRpb24gPSAwOwotCi0JCQkJCQkJaWYgKGkgPT0gMCkgewotCQkJCQkJCQlwb3NpdGlvbiA9IHNwLmdldFBvc2l0aW9uKG9sZGJwKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlwcmV2aW91c2JwID0gKEFic29sdXRlQmVuZHBvaW50KSBsaW5rCi0JCQkJCQkJCQkJLmdldEJlbmRwb2ludHMoKS5nZXQoaSAtIDEpOwotCQkJCQkJCQlwb3NpdGlvbiA9IHByZXZpb3VzYnAuZ2V0UG9zaXRpb24ob2xkYnApOwotCQkJCQkJCX0KLQotCQkJCQkJCWlmIChwb3NpdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSAotCQkJCQkJCQkJfHwgcG9zaXRpb24gPT0gUG9zaXRpb25Db25zdGFudHMuTk9SVEgpIHsKLQkJCQkJCQkJaWYgKGkgPT0gMCkgewotCQkJCQkJCQkJaWYgKHNwLnggLSBkZWx0YSA8IG9sZGJwLngKLQkJCQkJCQkJCQkJJiYgc3AueCArIGRlbHRhID4gb2xkYnAueAotCQkJCQkJCQkJCQkmJiAhKHNwLnggPT0gb2xkYnAueCkpIHsKLQkJCQkJCQkJCQlicC54ID0gc3AueDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWlmIChwcmV2aW91c2JwLnggLSBkZWx0YSA8IG9sZGJwLngKLQkJCQkJCQkJCQkJJiYgcHJldmlvdXNicC54ICsgZGVsdGEgPiBvbGRicC54Ci0JCQkJCQkJCQkJCSYmICEocHJldmlvdXNicC54ID09IG9sZGJwLngpKSB7Ci0JCQkJCQkJCQkJYnAueCA9IHByZXZpb3VzYnAueDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAobGluay5nZXRCZW5kcG9pbnRzKCkuc2l6ZSgpIC0gMSA9PSBpKSB7Ci0JCQkJCQkJCQlpZiAodHAueSAtIGRlbHRhIDwgb2xkYnAueQotCQkJCQkJCQkJCQkmJiB0cC55ICsgZGVsdGEgPiBvbGRicC55Ci0JCQkJCQkJCQkJCSYmICEodHAueSA9PSBvbGRicC55KSkgewotCQkJCQkJCQkJCWJwLnkgPSB0cC55OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJYnAueSA9IG9sZGJwLnk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHBvc2l0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLkVBU1QKLQkJCQkJCQkJCXx8IHBvc2l0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLldFU1QpIHsKLQotCQkJCQkJCQlpZiAoaSA9PSAwKSB7Ci0JCQkJCQkJCQlpZiAoc3AueSAtIGRlbHRhIDwgb2xkYnAueQotCQkJCQkJCQkJCQkmJiBzcC55ICsgZGVsdGEgPiBvbGRicC55Ci0JCQkJCQkJCQkJCSYmICEoc3AueSA9PSBvbGRicC55KSkgewotCQkJCQkJCQkJCWJwLnkgPSBzcC55OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJaWYgKHByZXZpb3VzYnAueSAtIGRlbHRhIDwgb2xkYnAueQotCQkJCQkJCQkJCQkmJiBwcmV2aW91c2JwLnkgKyBkZWx0YSA+IG9sZGJwLnkKLQkJCQkJCQkJCQkJJiYgIShwcmV2aW91c2JwLnkgPT0gb2xkYnAueSkpIHsKLQkJCQkJCQkJCQlicC55ID0gcHJldmlvdXNicC55OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChsaW5rLmdldEJlbmRwb2ludHMoKS5zaXplKCkgLSAxID09IGkpIHsKLQkJCQkJCQkJCWlmICh0cC54IC0gZGVsdGEgPCBvbGRicC54Ci0JCQkJCQkJCQkJCSYmIHRwLnggKyBkZWx0YSA+IG9sZGJwLngKLQkJCQkJCQkJCQkJJiYgISh0cC54ID09IG9sZGJwLngpKSB7Ci0JCQkJCQkJCQkJYnAueCA9IHRwLng7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlicC54ID0gb2xkYnAueDsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoYnAueCA9PSAtMSAmJiBicC55ICE9IC0xKSB7Ci0JCQkJCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgTW92ZUJlbmRwb2ludENvbW1hbmQoCi0JCQkJCQkJCQkJbGluaywgbmV3IFBvaW50KG9sZGJwLngsIGJwLnkpLCBpKTsKLQkJCQkJCQkJLy8gKChSb290RWRpdFBhcnQpZ2V0Um9vdCgpKS5nZXRWaWV3ZXIoKS5nZXRFZGl0RG9tYWluKCkuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGJwLnggIT0gLTEgJiYgYnAueSA9PSAtMSkgewotCQkJCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IE1vdmVCZW5kcG9pbnRDb21tYW5kKAotCQkJCQkJCQkJCWxpbmssIG5ldyBQb2ludChicC54LCBvbGRicC55KSwgaSk7Ci0JCQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChicC54ICE9IC0xICYmIGJwLnkgIT0gLTEpIHsKLQkJCQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBNb3ZlQmVuZHBvaW50Q29tbWFuZCgKLQkJCQkJCQkJCQlsaW5rLCBuZXcgUG9pbnQoYnAueCwgYnAueSksIGkpOwotCQkJCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCUxpc3QgbGlzdCA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGxpc3Quc2l6ZSgpID09IDEpIHsKLQkJCQkJaWYgKGxpc3QuZ2V0KDApIGluc3RhbmNlb2YgTGlua0VkaXRQYXJ0KSB7Ci0JCQkJCQlMaW5rRWRpdFBhcnQgcGFydCA9IChMaW5rRWRpdFBhcnQpIGxpc3QuZ2V0KDApOwotCQkJCQkJTGluayBsaW5rID0gKExpbmspIHBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJCWlmIChsaW5rLmdldEJlbmRwb2ludHMoKS5zaXplKCkgPiAwKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fQkVORF9QT0lOVDsKLQkJCX0KLQotCQl9OwotCQkKLQkJLy8gVmlld2VyIFByaW50IEFjdGlvbgotCQlhY3Rpb24gPSBuZXcgRGlhZ3JhbVByaW50QWN0aW9uKHRoaXMsIGdldEdyYXBoaWNhbFZpZXdlcigpKTsKLQkJcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhbGlnbkJlbmRQb2ludEFjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIElBY3Rpb24gY3JlYXRlQW5BY3Rpb24oU3RyaW5nIGFjdGlvbk5hbWUsCi0JCQlDcmVhdGlvbkZhY3RvcnkgY3JlYXRpb25GYWN0b3J5LCBTdHJpbmcgYWN0aW9uSWQsCi0JCQlTdHJpbmcgdG9vbHRpcFN0cmluZywgSW1hZ2VEZXNjcmlwdG9yIGltYWdlZGVzYykgewotCQlmaW5hbCBDcmVhdGlvbkZhY3RvcnkgZmFjdG9yeSA9IGNyZWF0aW9uRmFjdG9yeTsKLQkJZmluYWwgU3RyaW5nIGlkID0gYWN0aW9uSWQ7Ci0JCWZpbmFsIFN0cmluZyB0b29sdGlwID0gdG9vbHRpcFN0cmluZzsKLQkJZmluYWwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlZGVzY3JpcHRvciA9IGltYWdlZGVzYzsKLQkJcmV0dXJuIG5ldyBBY3Rpb24oYWN0aW9uTmFtZSkgeyAKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUNyZWF0ZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBDcmVhdGVSZXF1ZXN0KCk7Ci0JCQkJLy8gQ3JlYXRpb25GYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KHRlbXBsYXRlKTsKLQkJCQlpZiAoZmFjdG9yeSA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJcmVxdWVzdC5zZXRGYWN0b3J5KGZhY3RvcnkpOwotCQkJCXJlcXVlc3Quc2V0TG9jYXRpb24obmV3IFBvaW50KDEwLCAxMCkpOwotCi0JCQkJaWYgKHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCVBvaW50IGxvYyA9IHJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLQkJCQkJRGlhZ3JhbSBwYXJlbnQgPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDcmVhdGVOb2RlQ29tbWFuZCgKLQkJCQkJCQkoTm9kZSkgcmVxdWVzdC5nZXROZXdPYmplY3QoKSwgcGFyZW50LCBsb2MpOwotCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gaWQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCkpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9IGVsc2UKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCQkJcmV0dXJuIHRvb2x0aXA7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yIG5ld0ltYWdlKSB7Ci0JCQkJc3VwZXIuc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlZGVzY3JpcHRvcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQkJCXJldHVybiBpbWFnZWRlc2NyaXB0b3I7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFBhbGV0dGVWaWV3ZXJQcm92aWRlciBjcmVhdGVQYWxldHRlVmlld2VyUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgUGFsZXR0ZVZpZXdlclByb3ZpZGVyKGdldEVkaXREb21haW4oKSkgewotCQkJcHJpdmF0ZSBJTWVudUxpc3RlbmVyIG1lbnVMaXN0ZW5lcjsKLQotCQkJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlUGFsZXR0ZVZpZXdlcihQYWxldHRlVmlld2VyIHZpZXdlcikgewotCQkJCXN1cGVyLmNvbmZpZ3VyZVBhbGV0dGVWaWV3ZXIodmlld2VyKTsKLQkJCQkvLyBUT0RPIHZpZXdlci5zZXRDdXN0b21pemVyKG5ldyBMb2dpY1BhbGV0dGVDdXN0b21pemVyKCkpOwotCQkJCXZpZXdlcgotCQkJCQkJLmFkZERyYWdTb3VyY2VMaXN0ZW5lcihuZXcgVGVtcGxhdGVUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcigKLQkJCQkJCQkJdmlld2VyKSk7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGhvb2tQYWxldHRlVmlld2VyKFBhbGV0dGVWaWV3ZXIgdmlld2VyKSB7Ci0JCQkJc3VwZXIuaG9va1BhbGV0dGVWaWV3ZXIodmlld2VyKTsKLQkJCQlmaW5hbCBDb3B5VGVtcGxhdGVBY3Rpb24gY29weSA9IChDb3B5VGVtcGxhdGVBY3Rpb24pIGdldEFjdGlvblJlZ2lzdHJ5KCkKLQkJCQkJCS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCkpOwotCQkJCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoY29weSk7Ci0JCQkJaWYgKG1lbnVMaXN0ZW5lciA9PSBudWxsKQotCQkJCQltZW51TGlzdGVuZXIgPSBuZXcgSU1lbnVMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQkJCQkJCW1hbmFnZXIuYXBwZW5kVG9Hcm91cCgKLQkJCQkJCQkJCUdFRkFjdGlvbkNvbnN0YW50cy5HUk9VUF9DT1BZLCBjb3B5KTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQl2aWV3ZXIuZ2V0Q29udGV4dE1lbnUoKS5hZGRNZW51TGlzdGVuZXIobWVudUxpc3RlbmVyKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5HcmFwaGljYWxFZGl0b3JXaXRoRmx5b3V0UGFsZXR0ZSNnZXRQYWxldHRlUHJlZmVyZW5jZXMoKQotCSAqLwotCXByb3RlY3RlZCBGbHlvdXRQcmVmZXJlbmNlcyBnZXRQYWxldHRlUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBuZXcgRmx5b3V0UHJlZmVyZW5jZXMoKSB7Ci0JCQlwdWJsaWMgaW50IGdldERvY2tMb2NhdGlvbigpIHsKLQkJCQlyZXR1cm4gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJCQkuZ2V0SW50KFBBTEVUVEVfRE9DS19MT0NBVElPTik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0UGFsZXR0ZVN0YXRlKCkgewotCQkJCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkJCS5nZXRJbnQoUEFMRVRURV9TVEFURSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0UGFsZXR0ZVdpZHRoKCkgewotCQkJCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkJCS5nZXRJbnQoUEFMRVRURV9TSVpFKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0RG9ja0xvY2F0aW9uKGludCBsb2NhdGlvbikgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQkJCVBBTEVUVEVfRE9DS19MT0NBVElPTiwgbG9jYXRpb24pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXRQYWxldHRlU3RhdGUoaW50IHN0YXRlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKAotCQkJCQkJUEFMRVRURV9TVEFURSwgc3RhdGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXRQYWxldHRlV2lkdGgoaW50IHdpZHRoKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKAotCQkJCQkJUEFMRVRURV9TSVpFLCB3aWR0aCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIEtleUhhbmRsZXIgZ2V0Q29tbW9uS2V5SGFuZGxlcigpIHsKLQkJaWYgKHNoYXJlZEtleUhhbmRsZXIgPT0gbnVsbCkgewotCQkJc2hhcmVkS2V5SGFuZGxlciA9IG5ldyBLZXlIYW5kbGVyKCkgewotCi0JCQkJcHVibGljIGJvb2xlYW4ga2V5UHJlc3NlZChLZXlFdmVudCBldmVudCkgewotCQkJCQlpZiAoKGV2ZW50LnN0YXRlTWFzayA9PSBTV1QuQ1RSTCkKLQkJCQkJCQkmJiAoZXZlbnQua2V5Q29kZSA9PSBTV1QuQVJST1dfUklHSFQpKSB7Ci0JCQkJCQltb3ZlKDEpOwotCQkJCQl9Ci0JCQkJCWlmICgoZXZlbnQuc3RhdGVNYXNrID09IFNXVC5DVFJMKQotCQkJCQkJCSYmIChldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19ET1dOKSkgewotCQkJCQkJbW92ZSgyKTsKLQotCQkJCQl9Ci0JCQkJCWlmICgoZXZlbnQuc3RhdGVNYXNrID09IFNXVC5DVFJMKQotCQkJCQkJCSYmIChldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19VUCkpIHsKLQkJCQkJCW1vdmUoMyk7Ci0JCQkJCX0KLQkJCQkJaWYgKChldmVudC5zdGF0ZU1hc2sgPT0gU1dULkNUUkwpCi0JCQkJCQkJJiYgKGV2ZW50LmtleUNvZGUgPT0gU1dULkFSUk9XX0xFRlQpKSB7Ci0JCQkJCQltb3ZlKDQpOwotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIHN1cGVyLmtleVByZXNzZWQoZXZlbnQpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIG1vdmUoaW50IGRpcmVjdGlvbikgewotCQkJCQlMaXN0IGxpc3QgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCQlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBsaXN0LmdldCgwKTsKLQkJCQkJaWYgKHBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCQlQb2ludCBwb2ludCA9IG5vZGUuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCWludCBuZXd4ID0gcG9pbnQueDsKLQkJCQkJCWludCBuZXd5ID0gcG9pbnQueTsKLQkJCQkJCWludCBwcmVzc2xlbmd0aCA9IDE7Ci0JCQkJCQlzd2l0Y2ggKGRpcmVjdGlvbikgewotCQkJCQkJY2FzZSAxOgotCQkJCQkJCS8vIG5vZGUuc2V0TG9jYXRpb24obmV3IFBvaW50KHBvaW50LngrMTAscG9pbnQueSkpOwotCQkJCQkJCW5ld3ggPSBwb2ludC54ICsgcHJlc3NsZW5ndGg7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDI6Ci0JCQkJCQkJLy8gbm9kZS5zZXRMb2NhdGlvbihuZXcgUG9pbnQocG9pbnQueCxwb2ludC55KzEwKSk7Ci0JCQkJCQkJbmV3eSArPSBwcmVzc2xlbmd0aDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgMzoKLQkJCQkJCQkvLyBub2RlLnNldExvY2F0aW9uKG5ldyBQb2ludChwb2ludC54LHBvaW50LnktMTApKTsKLQkJCQkJCQluZXd5IC09IHByZXNzbGVuZ3RoOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSA0OgotCQkJCQkJCS8vIG5vZGUuc2V0TG9jYXRpb24obmV3IFBvaW50KHBvaW50LngtMTAscG9pbnQueSkpOwotCQkJCQkJCW5ld3ggLT0gcHJlc3NsZW5ndGg7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlkZWZhdWx0OgotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKAotCQkJCQkJCQlub2RlLCBuZXcgUG9pbnQobmV3eCwgbmV3eSksIG5vZGUuZ2V0V2lkdGgoKSk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQkJLy8gVE9ETy0gY2hlY2sgYWRkaW5nIG1vcmUgYmVuZHBvaW50LCBjYXB0dXJlIGJlbmRwb2ludAotCQkJCQkvLyBpbmRleCBvbiBmbHkKLQkJCQkJaWYgKHBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIExpbmspIHsKLQkJCQkJCUxpbmsgbGluayA9IChMaW5rKSBwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCQlMaXN0IGJsaXN0ID0gbGluay5nZXRCZW5kcG9pbnRzKCk7Ci0JCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQkJaWYgKGJsaXN0ICE9IG51bGwgJiYgYmxpc3Quc2l6ZSgpID4gMCkgewotCQkJCQkJCUFic29sdXRlQmVuZHBvaW50IHBvaW50ID0gKEFic29sdXRlQmVuZHBvaW50KSBibGlzdAotCQkJCQkJCQkJLmdldChpbmRleCk7Ci0JCQkJCQkJaW50IG5ld3ggPSBwb2ludC54OwotCQkJCQkJCWludCBuZXd5ID0gcG9pbnQueTsKLQkJCQkJCQlpbnQgcHJlc3NsZW5ndGggPSA1OwotCQkJCQkJCXN3aXRjaCAoZGlyZWN0aW9uKSB7Ci0JCQkJCQkJY2FzZSAxOgotCQkJCQkJCQkvLyBub2RlLnNldExvY2F0aW9uKG5ldwotCQkJCQkJCQkvLyBQb2ludChwb2ludC54KzEwLHBvaW50LnkpKTsKLQkJCQkJCQkJbmV3eCA9IHBvaW50LnggKyBwcmVzc2xlbmd0aDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAyOgotCQkJCQkJCQkvLyBub2RlLnNldExvY2F0aW9uKG5ldwotCQkJCQkJCQkvLyBQb2ludChwb2ludC54LHBvaW50LnkrMTApKTsKLQkJCQkJCQkJbmV3eSArPSBwcmVzc2xlbmd0aDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAzOgotCQkJCQkJCQkvLyBub2RlLnNldExvY2F0aW9uKG5ldwotCQkJCQkJCQkvLyBQb2ludChwb2ludC54LHBvaW50LnktMTApKTsKLQkJCQkJCQkJbmV3eSAtPSBwcmVzc2xlbmd0aDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSA0OgotCQkJCQkJCQkvLyBub2RlLnNldExvY2F0aW9uKG5ldwotCQkJCQkJCQkvLyBQb2ludChwb2ludC54LTEwLHBvaW50LnkpKTsKLQkJCQkJCQkJbmV3eCAtPSBwcmVzc2xlbmd0aDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgTW92ZUJlbmRwb2ludENvbW1hbmQoCi0JCQkJCQkJCQlsaW5rLCBuZXcgUG9pbnQobmV3eCwgbmV3eSksIGluZGV4KTsKLQkJCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQotCQkJfTsKLQkJCXNoYXJlZEtleUhhbmRsZXIKLQkJCQkJLnB1dChLZXlTdHJva2UuZ2V0UHJlc3NlZChTV1QuREVMLCAxMjcsIDApLAotCQkJCQkJCWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQkJCQkJQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSkpOwotCQkJc2hhcmVkS2V5SGFuZGxlci5wdXQoS2V5U3Ryb2tlLmdldFByZXNzZWQoU1dULkYyLCAwKSwKLQkJCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCQkJR0VGQWN0aW9uQ29uc3RhbnRzLkRJUkVDVF9FRElUKSk7Ci0KLQkJfQotCQlyZXR1cm4gc2hhcmVkS2V5SGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBncmFwaGljYWxWaWV3ZXIgZm9yIHRoaXMgRWRpdG9yUGFydC4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgZ3JhcGhpY2FsIHZpZXdlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEdyYXBoaWNhbFZpZXdlcihHcmFwaGljYWxWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyLnNldEdyYXBoaWNhbFZpZXdlcih2aWV3ZXIpOwotCQlpZiAoYWN0aW9uU2VydmljZSAhPSBudWxsKSB7Ci0JCQlhY3Rpb25TZXJ2aWNlLnNldEdyYXBoaWNhbFZpZXdlcih2aWV3ZXIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCkgewotCQlzdXBlci5jb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKTsKLQkJU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIpIGdldEdyYXBoaWNhbFZpZXdlcigpOwotCi0JCVNjYWxhYmxlRnJlZWZvcm1Sb290RWRpdFBhcnQgcm9vdCA9IG5ldyBTY2FsYWJsZUZyZWVmb3JtUm9vdEVkaXRQYXJ0KCk7Ci0KLQkJLy8gTGlzdCB6b29tTGV2ZWxzID0gbmV3IEFycmF5TGlzdCgzKTsKLQkJLy8gem9vbUxldmVscy5hZGQoWm9vbU1hbmFnZXIuRklUX0FMTCk7Ci0JCS8vIHpvb21MZXZlbHMuYWRkKFpvb21NYW5hZ2VyLkZJVF9XSURUSCk7Ci0JCS8vIHpvb21MZXZlbHMuYWRkKFpvb21NYW5hZ2VyLkZJVF9IRUlHSFQpOwotCQkvLyByb290LmdldFpvb21NYW5hZ2VyKCkuc2V0Wm9vbUxldmVsQ29udHJpYnV0aW9ucyh6b29tTGV2ZWxzKTsKLQkJLy8KLQkJLy8gSUFjdGlvbiB6b29tSW4gPSBuZXcgWm9vbUluQWN0aW9uKHJvb3QuZ2V0Wm9vbU1hbmFnZXIoKSk7Ci0JCS8vIElBY3Rpb24gem9vbU91dCA9IG5ldyBab29tT3V0QWN0aW9uKHJvb3QuZ2V0Wm9vbU1hbmFnZXIoKSk7Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oem9vbUluKTsKLQkJLy8gZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbih6b29tT3V0KTsKLQkJLy8gZ2V0U2l0ZSgpLmdldEtleUJpbmRpbmdTZXJ2aWNlKCkucmVnaXN0ZXJBY3Rpb24oem9vbUluKTsKLQkJLy8gZ2V0U2l0ZSgpLmdldEtleUJpbmRpbmdTZXJ2aWNlKCkucmVnaXN0ZXJBY3Rpb24oem9vbU91dCk7Ci0KLQkJdmlld2VyLnNldFJvb3RFZGl0UGFydChyb290KTsKLQotCQkvLyB2aWV3ZXIuc2V0RWRpdFBhcnRGYWN0b3J5KG5ldyBNZXRob2RFbGVtZW50RWRpdFBhcnRGYWN0b3J5KCkpOwotCQl2aWV3ZXIuc2V0RWRpdFBhcnRGYWN0b3J5KGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpKTsKLQotCQlDb250ZXh0TWVudVByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IERpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyKAotCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLCBnZXRBY3Rpb25SZWdpc3RyeSgpKTsKLQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuc2V0Q29udGV4dE1lbnUocHJvdmlkZXIpOwotCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudSgKLQkJCQkib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLndvcmtmbG93LmNvbnRleHRtZW51IiwgLy8kTk9OLU5MUy0xJAotCQkJCXByb3ZpZGVyLCBnZXRHcmFwaGljYWxWaWV3ZXIoKSk7Ci0KLQkJdmlld2VyLnNldEtleUhhbmRsZXIobmV3IEdyYXBoaWNhbFZpZXdlcktleUhhbmRsZXIodmlld2VyKQotCQkJCS5zZXRQYXJlbnQoZ2V0Q29tbW9uS2V5SGFuZGxlcigpKSk7Ci0KLQkJLy8gbG9hZFByb3BlcnRpZXMoKTsKLQotCQkvLyBBY3Rpb25zCi0JCS8vIElBY3Rpb24gc2hvd1J1bGVycyA9IG5ldwotCQkvLyBUb2dnbGVSdWxlclZpc2liaWxpdHlBY3Rpb24oZ2V0R3JhcGhpY2FsVmlld2VyKCkpOwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHNob3dSdWxlcnMpOwotCQkvLyAgICAJCi0JCS8vIElBY3Rpb24gc25hcEFjdGlvbiA9IG5ldwotCQkvLyBUb2dnbGVTbmFwVG9HZW9tZXRyeUFjdGlvbihnZXRHcmFwaGljYWxWaWV3ZXIoKSk7Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oc25hcEFjdGlvbik7Ci0JCS8vCi0JCS8vIElBY3Rpb24gc2hvd0dyaWQgPSBuZXcgVG9nZ2xlR3JpZEFjdGlvbihnZXRHcmFwaGljYWxWaWV3ZXIoKSk7Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oc2hvd0dyaWQpOwotCi0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQloYW5kbGVBY3RpdmF0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX07Ci0KLQkJZ2V0R3JhcGhpY2FsQ29udHJvbCgpLmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgbGlzdGVuZXIpOwotCQlnZXRHcmFwaGljYWxDb250cm9sKCkuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIGxpc3RlbmVyKTsKLQotCQlnZXRHcmFwaGljYWxDb250cm9sKCkuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG91YmxlQ2xpY2ssIG5ldyBMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQloYW5kbGVEb3VibGVDbGljayhldmVudCk7Ci0JCQl9Ci0KLQkJfSk7Ci0JCWlmIChnZXREaWFncmFtVHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTCkpCi0JCQlQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJCS5zZXRIZWxwKAotCQkJCQkJCWdldEdyYXBoaWNhbENvbnRyb2woKSwKLQkJCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5GT1JNX0VESVRPUl9BQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9DT05URVhUKTsKLQkJZWxzZSBpZiAoZ2V0RGlhZ3JhbVR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCVJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XT1JLRkxPVykpCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKAotCQkJCQlnZXRHcmFwaGljYWxDb250cm9sKCksIEF1dGhvcmluZ1VJSGVscENvbnRleHRzLkZPUk1fRURJVE9SX0FDVElWSVRZX0RJQUdSQU1fQ09OVEVYVCk7IAotCQllbHNlIGlmIChnZXREaWFncmFtVHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1kpKQotCQkJUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkuc2V0SGVscChnZXRHcmFwaGljYWxDb250cm9sKCksIEF1dGhvcmluZ1VJSGVscENvbnRleHRzLkZPUk1fRURJVE9SX1dQX0RFUEVOREVOQ1lfRElBR1JBTV9DT05URVhUKTsKLQotCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXRHcmFwaGljYWxDb250cm9sKCkuZ2V0RGlzcGxheSgpOwotCQlpZiAoIShkaXNwbGF5ID09IG51bGwgfHwgZGlzcGxheS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0UGFsZXR0ZVJvb3QoKSAhPSBudWxsKSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpOwotCQkJCQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQoKEVPYmplY3QpIG9iaikpIHsKLQkJCQkJCQlMaXN0IGxpc3QgPSBnZXRQYWxldHRlUm9vdCgpLmdldENoaWxkcmVuKCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlQYWxldHRlRW50cnkgZW50cnkgPSAoUGFsZXR0ZUVudHJ5KSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJZW50cnkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCQkJfQotCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUxpc3QgbGlzdCA9IGdldFBhbGV0dGVSb290KCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCVBhbGV0dGVFbnRyeSBlbnRyeSA9IChQYWxldHRlRW50cnkpIGl0b3IubmV4dCgpOwotCQkJCQkJCQllbnRyeS5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCQotCQljdXJyZW50Q29uZmlnID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkKLQkJLy8gbGlzdGVuIHRvIGNoYW5nZSBmb3IgY3VycmVudCBzZWxlY3Rpb24gb2YgTWV0aG9kQ29uZmlndXJhdGlvbiBvciBjaGFuZ2VzIGluIAotCQkvLyBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JCS8vCi0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIuYWRkTGlzdGVuZXIobGlicmFyeUxpc3RlbmVyKTsKLQkJfQotCQkKLQkJSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihBY3Rpb25GYWN0b3J5LlBSSU5ULmdldElkKCkpOwotCQlpZihhY3Rpb24gaW5zdGFuY2VvZiBEaWFncmFtUHJpbnRBY3Rpb24pewotCQkJKChEaWFncmFtUHJpbnRBY3Rpb24pYWN0aW9uKS5zZXRWaWV3ZXIodmlld2VyKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEb3VibGVDbGljayhFdmVudCBldmVudCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVHcmFwaGljYWxWaWV3ZXIoKTsKLQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuc2V0Q29udGVudHMoZWRpdFBhcnQpOwotCi0JCVRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyIGxpc3RlbmVyID0gY3JlYXRlRHJvcFRhcmdldExpc3RlbmVyKCk7Ci0JCWlmIChsaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5hZGREcm9wVGFyZ2V0TGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gQWJzdHJhY3RFZGl0UGFydFZpZXdlcgotCQkvLyBnZXRHcmFwaGljYWxWaWV3ZXIoKS5hZGREcm9wVGFyZ2V0TGlzdGVuZXIoCi0JCS8vIG5ldyBUZXh0VHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXIoZ2V0R3JhcGhpY2FsVmlld2VyKCksCi0JCS8vIFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNyZWF0aW9uRmFjdG9yaWVzKCkgewotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJaWYgKGZyZWVUeHROb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCQlmcmVlVHh0Tm9kZUNyZWF0aW9uRmFjdG9yeSA9IG5ldyBDcmVhdGlvbkZhY3RvcnkoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpIHsKLQkJCQkJVHlwZWROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVR5cGVkTm9kZSgpOwotCQkJCQlub2RlLnNldFR5cGUoVHlwZWROb2RlLkZSRUVfVEVYVCk7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkubmV3VHlwZWRHcmFwaE5vZGUoVHlwZWROb2RlLkZSRUVfVEVYVCkpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5GUkVFX1RFWFQ7Ci0JCQkJfQotCi0JCQl9OwotCQlDcmVhdGlvbkZhY3RvcnkgY3JlYXRpb25GYWN0b3J5ID0gZnJlZVR4dE5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3IjY3JlYXRlRHJvcFRhcmdldExpc3RlbmVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXIgY3JlYXRlRHJvcFRhcmdldExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRlbXBsYXRlVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXIoZ2V0R3JhcGhpY2FsVmlld2VyKCkpIHsKLQotCQkJcHJvdGVjdGVkIENyZWF0aW9uRmFjdG9yeSBnZXRGYWN0b3J5KE9iamVjdCB0ZW1wbGF0ZSkgewotCQkJCXJldHVybiAoQ3JlYXRpb25GYWN0b3J5KSB0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcAotCQkJCQkJLmdldCh0ZW1wbGF0ZSk7Ci0JCQl9Ci0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBY3RpdmF0aW9uQ2hhbmdlZChFdmVudCBldmVudCkgewotCQlJQWN0aW9uIGNvcHkgPSBudWxsOwotCQlpZiAoZXZlbnQudHlwZSA9PSBTV1QuRGVhY3RpdmF0ZSkKLQkJCWNvcHkgPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSk7Ci0JCWlmIChnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0JCQkJQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCkpICE9IGNvcHkpIHsKLQkJCWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCQkJQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksIGNvcHkpOwotCQkJZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKS51cGRhdGVBY3Rpb25CYXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5HcmFwaGljYWxFZGl0b3JXaXRoRmx5b3V0UGFsZXR0ZSNnZXRQYWxldHRlUm9vdCgpCi0JICovCi0JcHJvdGVjdGVkIFBhbGV0dGVSb290IGdldFBhbGV0dGVSb290KCkgewotCQlpZiAocGFsZXR0ZVJvb3QgPT0gbnVsbCkgewotCQkJY3JlYXRlUGFsZXR0ZVJvb3QoKTsKLQkJfQotCQlyZXR1cm4gcGFsZXR0ZVJvb3Q7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVBhbGV0dGVSb290KCkgewotCQlwYWxldHRlUm9vdCA9IG5ldyBQYWxldHRlUm9vdCgpOwotCQlwYWxldHRlUm9vdC5hZGRBbGwoY3JlYXRlQ2F0ZWdvcmllcyhwYWxldHRlUm9vdCkpOwotCX0KLQotCXByaXZhdGUgTGlzdCBjcmVhdGVDYXRlZ29yaWVzKFBhbGV0dGVSb290IHJvb3QpIHsKLQkJTGlzdCBjYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVBhbGV0dGVDb250YWluZXIgcGFsZXR0ZUNvbnRhaW5lciA9IGNyZWF0ZUNvbnRyb2xHcm91cChyb290KTsKLQkJaWYgKHBhbGV0dGVDb250YWluZXIgIT0gbnVsbCkgewotCQkJY2F0ZWdvcmllcy5hZGQocGFsZXR0ZUNvbnRhaW5lcik7Ci0JCX0KLQotCQlyZXR1cm4gY2F0ZWdvcmllczsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGFsZXR0ZUNvbnRhaW5lciBjcmVhdGVDb250cm9sR3JvdXAoUGFsZXR0ZVJvb3Qgcm9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCkgewotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCXJldHVybiAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgaW5wdXQpLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotCQkvLyBzYXZlRGlhZ3JhbSgpOwotCQkvLyBzYXZlU2NyZWVuKCk7Ci0KLQkJZmluYWwgTWV0aG9kRWxlbWVudCBlID0gZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpOwotCQlpZiAoZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTYWZlUnVubmFibGUucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3IKLQkJCQkJCQkuYmVnaW5UYXNrKAotCQkJCQkJCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX3RleHQsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IAotCQkJCQltb25pdG9yCi0JCQkJCQkJLnNldFRhc2tOYW1lKERpYWdyYW1VSVJlc291cmNlcy5iaW5kKERpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlCi0JCQkJCQkJCQksIGUuZVJlc291cmNlKCkuZ2V0VVJJKCkuaXNGaWxlKCkgPyBlLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpIDogZS5nZXROYW1lKCkpKTsgCi0JCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudFBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwZXJzaXN0ZXIuc2F2ZShlLmVSZXNvdXJjZSgpKTsKLQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSAoKEVkaXRQYXJ0KSBnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkJCQkuZ2V0Q29udGVudHMoKSkuZ2V0TW9kZWwoKTsKLQkJCQkJCWRpYWdyYW0uc2V0TmV3KGZhbHNlKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCS5sb2dFcnJvcihleCk7Ci0JCQkJCQkJVmlld0hlbHBlcgotCQkJCQkJCQkJLnJlbG9hZEN1cnJlbnRMaWJhcnlPblJvbGxiYWNrRXJyb3IoZ2V0U2l0ZSgpCi0JCQkJCQkJCQkJCS5nZXRTaGVsbCgpKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheVdhcm5pbmcoCi0JCQkJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0VGV4dCgpLAotCQkJCQkJCQkJCURpYWdyYW1VSVJlc291cmNlcy5kaWFncmFtX3NhdmVFcnJvcgotCQkJCQkJCQkJCSwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQkJLy8gUmVmcmVzaCB0aGUgbmVjZXNzYXJ5IHN0YXRlLgotCQkJCQkvLwotCQkJCQkvL2dldEVkaXREb21haW4oKS5nZXRDb21tYW5kU3RhY2soKS5tYXJrU2F2ZUxvY2F0aW9uKCk7Ci0JCQkJCWdldEVkaXREb21haW4oKS5nZXRDb21tYW5kU3RhY2soKS5mbHVzaCgpOwotCQkJCQljaGFuZ2VUaW1lID0gLTE7Ci0JCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKLQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKiogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZUFzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNEaXJ0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIGdldEVkaXREb21haW4oKS5nZXRDb21tYW5kU3RhY2soKS5pc0RpcnR5KCk7Ci0JfQotCi0JLyoqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNpc1NhdmVBc0FsbG93ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCWlmIChlZGl0UGFydCAhPSBudWxsKSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCXJldHVybiBkaWFncmFtICE9IG51bGwgJiYgZGlhZ3JhbS5pc1JlYWRPbmx5KCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVFZGl0UGFydCgpIHsKLQkJQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gKEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCkgZ2V0RWRpdG9ySW5wdXQoKTsKLQkJT2JqZWN0IG9iamVjdDsKLQkJaWYgKGVkaXRvcklucHV0LmdldFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0JCQlvYmplY3QgPSBlZGl0b3JJbnB1dC5nZXRXcmFwcGVyKCk7Ci0JCX0gZWxzZSB7Ci0JCQlvYmplY3QgPSBlZGl0b3JJbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCX0KLQkJCi0JCWNoYW5nZVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJZWRpdFBhcnQgPSBjcmVhdGVEaWFncmFtRWRpdFBhcnQoKTsKLQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCS8vIHBhc3MgYWxvbmcgdGhlIFN1cHByZXNzaW9uIGluc3RhbmNlIGZyb20gaW5wdXQgdG8gZGlhZ3JhbSBtb2RlbAotCQkvLwotCQlkaWFncmFtLnNldFN1cHByZXNzaW9uKGVkaXRvcklucHV0LmdldFN1cHByZXNzaW9uKCkpOwotCQlkaWFncmFtLnNldE9iamVjdChvYmplY3QpOwotCQlkaWFncmFtLmFkZENvbnN1bWVyKHRoaXMpOwotCQkKLQkJaWYoIWRpYWdyYW0uaXNOZXcoKSkgewotCQkJY2hhbmdlVGltZSA9IC0xOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjc2V0SW5wdXQob3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldElucHV0KElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5zZXRJbnB1dChpbnB1dCk7Ci0KLQkJTWV0aG9kRWxlbWVudCBlID0gZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpOwotCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQljcmVhdGVFZGl0UGFydCgpOwotCi0JCQlCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpOwotCQkJc2V0UGFydE5hbWUoZ2V0UGFydE5hbWVQcmVmaXgoKQotCQkJCQkrIGUuZ2V0TmFtZSgpCi0JCQkJCSsgIiwgIiArIGVkaXRvcklucHV0LmdldFN1cHByZXNzaW9uKCkuZ2V0UHJvY2VzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIHNldFRpdGxlSW1hZ2UoZ2V0VHlwZUltYWdlKGUpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBFZGl0UGFydCBjcmVhdGVEaWFncmFtRWRpdFBhcnQoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UGFydE5hbWVQcmVmaXgoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKTsKLQotCS8qKgotCSAqIEdldCBwYXJlbnQgZWRpdG9yCi0JICogQHJldHVybiBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgSUVkaXRvclBhcnQgZ2V0UGFyZW50RWRpdG9yKCkgewotCQlyZXR1cm4gcGFyZW50RWRpdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudEVkaXRvcihJRWRpdG9yUGFydCBwYXJlbnRFZGl0b3IpIHsKLQkJdGhpcy5wYXJlbnRFZGl0b3IgPSBwYXJlbnRFZGl0b3I7Ci0JfQotCQotCS8vQWRkaW5nIGxpYnJhcnljaG5hZ2VkIGxpc3RlbmVyLCBpZiBjb25maWd1cmF0aW9uIGdvdCBjaGFuZ2VkIGRpYWdyYW0gbmVlZHMgdG8gcmVmcmVzaAotCXByaXZhdGUgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaWJyYXJ5TGlzdGVuZXIgPSBuZXcgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQlzd2l0Y2ggKG9wdGlvbikgewotCQkJY2FzZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VEOiB7Ci0JCQkJaWYgKGNvbGxlY3Rpb24gIT0gbnVsbCAmJiBjb2xsZWN0aW9uLmNvbnRhaW5zKGN1cnJlbnRDb25maWcpKSB7Ci0JCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY3VycmVudENvbmZpZyk7CQkJCQkKLQkJCQkJCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oUkVGUkVTSCk7Ci0JCQkJCQlhY3Rpb24ucnVuKCk7Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQlQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJCQkJfQotCQkJCX0JCQotCQkJCWJyZWFrOwotCQkJfQotCQkJLy8gaGFuZGxlZCBieSBsaWJTdmNMaXN0ZW5lcgotCQkJLy8KLS8vCQkJY2FzZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DT05GSUdVUkFUSU9OX1NFTEVDVEVEOiB7Ci0vLwkJCQljb25maWdDaGFuZ2VkKCk7Ci0vLwkJCQlicmVhazsKLS8vCQkJfQotCQkJfQotCQl9Ci0JfTsKLQkKLQlwcml2YXRlIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpYlN2Y0xpc3RlbmVyID0gbmV3IElMaWJyYXJ5U2VydmljZUxpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCWNvbmZpZ0NoYW5nZWQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQl9CQkKLQl9OwotCQotCXByaXZhdGUgdm9pZCBjb25maWdDaGFuZ2VkKCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJaWYoY3VycmVudENvbmZpZyAhPSBjb25maWcpIHsKLQkJCS8vIHJlZnJlc2ggb25seSBpZiB0aGUgYWN0aXZlIHBhcnQgaXMgdGhpcyBkaWFncmFtIGVkaXRvciBvciBwcm9jZXNzIGVkaXRvciBvZiB0aGUgcHJvY2VzcwotCQkJLy8gdGhhdCBvd25zIHRoaXMgZGlhZ3JhbQotCQkJLy8KLQkJCUlXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFydFNlcnZpY2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQlib29sZWFuIHJlZnJlc2ggPSAgYWN0aXZlUGFydCA9PSB0aGlzOwotCQkJaWYoIXJlZnJlc2gpIHsKLQkJCQlpZihhY3RpdmVQYXJ0IGluc3RhbmNlb2YgUHJvY2Vzc0VkaXRvcikgewotCQkJCQlNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgaW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSAoKFByb2Nlc3NFZGl0b3IpYWN0aXZlUGFydCkuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQkJT2JqZWN0IHByb2NDb21wID0gaW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQlFT2JqZWN0IGRpYWdyYW0gPSAoKERpYWdyYW0pZWRpdFBhcnQuZ2V0TW9kZWwoKSkuZ2V0VU1BRGlhZ3JhbSgpOwotCQkJCQlyZWZyZXNoID0gVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KGRpYWdyYW0sIHByb2NDb21wKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZihyZWZyZXNoKSB7Ci0JCQkJY3VycmVudENvbmZpZyA9IGNvbmZpZzsKLQkJCQlJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKFJFRlJFU0gpOwotCQkJCWFjdGlvbi5ydW4oKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTZWxlY3Rpb25MaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICogb3ZlcnJpZGUgdG8gZG9ub3QgYWxsb3cgYW55IG5vZGUgc2VsZWN0aW9uIGluIEFjdGl2aXR5IERldGFpbCBEaWFncmFtIAotCSAqIGlmIGFjdGl2aXR5IGlzIGV4dGVuZHMuCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLnNlbGVjdGlvbkNoYW5nZWQocGFydCwgc2VsZWN0aW9uKTsKLQkJaWYoZWRpdFBhcnQgIT0gbnVsbCl7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSllZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJaWYoZGlhZ3JhbS5pc1JlYWRPbmx5KCkgfHwgVG5nVXRpbC5pc0xvY2tlZChnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCkpKXsKLQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5zZWxlY3QoZWRpdFBhcnQpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZnJlc2hEaWFncmFtKCl7Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKFJFRlJFU0gpLnJ1bigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0JCXJldHVybiBkaXNwb3NlZDsKLQl9Ci0KLQkKLS8vCS8qCi0vLwkgKiBNZXRob2Qgc2V0cyB0aGUgY29udGV4dCBtZW51IGNvbnRyaWJ1dGluZyBpdGVtcyBzdGF0ZS4KLS8vCSAqIFRoaXMgaXMgZWZmaWNpZW50IHdheSBpbnN0ZWFkIG9mIGRvaW5nIGF0IGVhY2ggYWN0aW9uLiAKLS8vCSAqIFVuY29tbWVudCB0aGlzIGNvZGUsIG9uY2UgYWxsIHRoZSBwbGFjZSBpc0VuYWJsZWQgQ29kZSBpcyByZW1vdmVkLgotLy8JICovCi0vLwlwdWJsaWMgdm9pZCBzZXRTdGF0ZU1lbnVDb250cmlidXRlSXRlbXMoKXsKLS8vCQkKLS8vCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0vLwkJaWYoZWRpdFBhcnRzLnNpemUoKSA9PSAwKXsKLS8vCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oREVMRVRFX0RJQUdSQU0pLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJfQotLy8JCWlmKGVkaXRQYXJ0cy5zaXplKCkgPT0gMSl7Ci0vLwkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KWVkaXRQYXJ0cy5nZXQoMCk7Ci0vLwkJCWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKFNFTEVDVF9MSU5LKS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQlpZiAoZWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotLy8JCQkJaWYoKChUeXBlZE5vZGUpIGVkaXRQYXJ0LmdldE1vZGVsKCkpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuRlJFRV9URVhUKQotLy8JCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oRk9OVF9ESUFMT0cpLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihTRUxFQ1RfTElOSykuc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJCX0KLS8vCQkJaWYoZWRpdFBhcnQgaW5zdGFuY2VvZiBMaW5rRWRpdFBhcnQpewotLy8JCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0JFTkRfUE9JTlQpLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQlMaW5rIGxpbmsgPSAoTGluayllZGl0UGFydC5nZXRNb2RlbCgpOwotLy8JCQkJaWYobGluay5nZXRCZW5kcG9pbnRzKCkuc2l6ZSgpID4gMCl7Ci0vLwkJCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQUxJR05fQkVORF9QT0lOVCkuc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQkKLS8vCQl9Ci0vLwkJaWYoZWRpdFBhcnRzLnNpemUoKSA9PSAyKXsKLS8vCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0xJTkspLnNldEVuYWJsZWQodHJ1ZSk7IAotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBlZGl0UGFydHMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlPYmplY3QgcGFydCA9IGl0b3IubmV4dCgpOwotLy8JCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBGcmVlVGV4dEVkaXRQYXJ0KQotLy8JCQkJCWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9MSU5LKS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJfQotLy8JCX0KLS8vCX0KLQkKLS8vCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotLy8JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLS8vCQlzdXBlci5zZXRGb2N1cygpOwotLy8JCS8vIFJlZnJlc2ggaXMgZXhwZW5zaXZlIG9wZXJhdGlvbi4KLS8vCQkvLyBUT0RPIC0gZmluZCBwcm9jZXNzIHNvbHV0aW9uIGZvciBub3RpZmljYXRpb24gYmV0d2VlbiAKLS8vCQkvLyBiYXNlIGRpYWdyYW0gYW5kIGV4dGVuZCBkaWFncmFtLiAgICAgCi0vLwkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpOwotLy8JCWlmKCgoRGlhZ3JhbSllZGl0UGFydC5nZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkpewotLy8JCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihSRUZSRVNIKS5ydW4oKTsKLS8vCQl9Ci0vLwkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KXsKLS8vCQkJaWYoKChWYXJpYWJpbGl0eUVsZW1lbnQpZWxlbWVudCkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgIT0gbnVsbCl7Ci0vLwkJCQlpZighKChWYXJpYWJpbGl0eUVsZW1lbnQpZWxlbWVudCkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkuZXF1YWxzKFZhcmlhYmlsaXR5VHlwZS5OQV9MSVRFUkFMKSl7Ci0vLwkJCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oUkVGUkVTSCkucnVuKCk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJCQotLy8JCX0KLS8vCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2FjYTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkRpYWdyYW1VcGRhdGVTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRnJlZVRleHROb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklBZGFwdGVyRmFjdG9yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLkNvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLk1hcnF1ZWVUb29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFubmluZ1NlbGVjdGlvblRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5Ub29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci0KLQotLyoqCi0gKiBBbiBlZGl0b3IgZm9yIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IgZXh0ZW5kcyBBYnN0cmFjdERpYWdyYW1FZGl0b3IgewotCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTRVRfRElBR1JBTV9MQVlPVVQgPSAicmVzZXRfZGlhZ3JhbV9sYXlvdXQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSByb2xlTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQotCXByaXZhdGUgQ3JlYXRpb25GYWN0b3J5IHRhc2tOb2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3Rvcnkgd3BkTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQotCXByaXZhdGUgYm9vbGVhbiBpbml0aWFsQ2xlYW5VcCA9IGZhbHNlOwotCXByaXZhdGUgQnJlYWtkb3duQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0KLQkvLyBhIGhhY2sKLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3IjY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgRWRpdFBhcnRGYWN0b3J5IGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydEZhY3RvcnkoKTsKLQkJLy8gcmV0dXJuIG5ldyBFZGl0UGFydEZhY3RvcnkoKSB7Ci0JCS8vCi0JCS8vIHB1YmxpYyBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpIHsKLQkJLy8gaWYobW9kZWwgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJLy8gcmV0dXJuIG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKQotCQkvLyBtb2RlbCk7Ci0JCS8vIH0KLQkJLy8gZWxzZSBpZihtb2RlbCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlKSB7Ci0JCS8vIHJldHVybiBuZXcgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCgoUm9sZVRhc2tDb21wb3NpdGUpIG1vZGVsKTsKLQkJLy8gfQotCQkvLyBlbHNlIGlmKG1vZGVsIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGUpewotCQkvLyByZXR1cm4gbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQoKFdvcmtQcm9kdWN0Q29tcG9zaXRlKQotCQkvLyBtb2RlbCk7Ci0JCS8vIH0KLQkJLy8gZWxzZSBpZihtb2RlbCBpbnN0YW5jZW9mIFJvbGVOb2RlCi0JCS8vIHx8IG1vZGVsIGluc3RhbmNlb2YgVGFza05vZGUKLQkJLy8gfHwgbW9kZWwgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlCi0JCS8vICkKLQkJLy8gewotCQkvLyByZXR1cm4gbmV3IERlc2NyaXB0b3JOb2RlRWRpdFBhcnQoKE5hbWVkTm9kZSkgbW9kZWwpOwotCQkvLyB9Ci0JCS8vIGVsc2UgaWYobW9kZWwgaW5zdGFuY2VvZiBMaW5rKSB7Ci0JCS8vIHJldHVybiBuZXcgTGlua0VkaXRQYXJ0KChMaW5rKSBtb2RlbCk7Ci0JCS8vIH0KLQkJLy8gaWYobW9kZWwgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJLy8gVHlwZWROb2RlIG5vZGUgPSAoVHlwZWROb2RlKSBtb2RlbDsKLQkJLy8gc3dpdGNoKG5vZGUuZ2V0VHlwZSgpKSB7Ci0JCS8vIGNhc2UgVHlwZWROb2RlLlNUQVJUOiByZXR1cm4gbmV3IFN0YXJ0Tm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkvLyBjYXNlIFR5cGVkTm9kZS5FTkQ6IHJldHVybiBuZXcgRW5kTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkvLyBjYXNlIFR5cGVkTm9kZS5ERUNJU0lPTjogcmV0dXJuIG5ldyBEZWNpc2lvbk5vZGVFZGl0UGFydChub2RlKTsKLQkJLy8gY2FzZSBUeXBlZE5vZGUuU1lOQ0hfQkFSOiByZXR1cm4gbmV3IFN5bmNoQmFyTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkvLyBjYXNlIFR5cGVkTm9kZS5GUkVFX1RFWFQ6IHJldHVybiBuZXcgRnJlZVRleHRFZGl0UGFydChub2RlKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIHJldHVybiBudWxsOwotCQkvLyB9Ci0JCS8vCQkJCi0JCS8vIH07Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjcmVhdGVEaWFncmFtRWRpdFBhcnQoKQotCSAqLwotCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVEaWFncmFtRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBuZXcgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQoTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVBY3Rpdml0eURldGFpbERpYWdyYW0oKSk7Ci0JfQotCi0vLwkvKgotLy8JICogKG5vbi1KYXZhZG9jKQotLy8JICogCi0vLwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3IjY3JlYXRlRWRpdFBhcnQoamF2YS5sYW5nLk9iamVjdCkKLS8vCSAqLwotLy8JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KE9iamVjdCBlKSB7Ci0vLwkJQWN0aXZpdHlEZXRhaWxEaWFncmFtIGRpYWdyYW0gPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0vLwkJCQkuY3JlYXRlQWN0aXZpdHlEZXRhaWxEaWFncmFtKCk7Ci0vLwkJZGlhZ3JhbS5zZXRPYmplY3QoZSk7Ci0vLwkJRWRpdFBhcnQgcGFydCA9IG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydChkaWFncmFtKTsKLS8vCQlwYXJ0LnNldE1vZGVsKGRpYWdyYW0pOwotLy8JCWRpYWdyYW0uYWRkQ29uc3VtZXIodGhpcyk7Ci0vLwkJcmV0dXJuIHBhcnQ7Ci0vLwl9Ci0JCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNnZXRQYXJ0TmFtZVByZWZpeCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0TmFtZVByZWZpeCgpIHsKLQkJcmV0dXJuIERpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURldGFpbERpYWdyYW1fcHJlZml4OyAKLQl9Ci0KLQlwcm90ZWN0ZWQgUGFsZXR0ZUNvbnRhaW5lciBjcmVhdGVDb250cm9sR3JvdXAoUGFsZXR0ZVJvb3Qgcm9vdCkgewotCQlpbml0aWFsaXplQ3JlYXRpb25GYWN0b3JpZXMoKTsKLQotCQlQYWxldHRlR3JvdXAgY29udHJvbEdyb3VwID0gbmV3IFBhbGV0dGVHcm91cCgiQ29udHJvbCBHcm91cCIpOyAvLyROT04tTkxTLTEkCi0KLQkJTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVRvb2xFbnRyeSB0b29sID0gbmV3IFBhbm5pbmdTZWxlY3Rpb25Ub29sRW50cnkoRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdG9vbHRpcAotCQkpOwotCQl0b29sLnNldFNtYWxsSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJzZWxlY3RfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXRvb2wuc2V0TGFyZ2VJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJInNlbGVjdF9wYWwyNC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZW50cmllcy5hZGQodG9vbCk7Ci0JCXJvb3Quc2V0RGVmYXVsdEVudHJ5KHRvb2wpOwotCi0JCXRvb2wgPSBuZXcgTWFycXVlZVRvb2xFbnRyeSgpOwotCQl0b29sLnNldFNtYWxsSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJtYXJxX3BhbDE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0b29sLnNldExhcmdlSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJtYXJxX3BhbDI0LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyaWVzLmFkZCh0b29sKTsKLQotCQlDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSBjb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQsIAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdG9vbHRpcCwgCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuRlJFRV9URVhULCBmcmVlVHh0Tm9kZUNyZWF0aW9uRmFjdG9yeSwKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZyZWV0ZXh0X3BhbDE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmcmVldGV4dF9wYWwyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbnRyb2xHcm91cC5hZGRBbGwoZW50cmllcyk7Ci0JCXJldHVybiBjb250cm9sR3JvdXA7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNyZWF0aW9uRmFjdG9yaWVzKCkgewotCQlzdXBlci5pbml0aWFsaXplQ3JlYXRpb25GYWN0b3JpZXMoKTsKLQotCQlpZiAocm9sZU5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkgewotCQkJcm9sZU5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCVJvbGVUYXNrQ29tcG9zaXRlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKCk7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlub2RlLnNldFVNQURpYWdyYW0oZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJCQlub2RlLnNldE9iamVjdChVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRvcigpKTsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRPYmplY3RUeXBlKCkgewotCQkJCQlyZXR1cm4gVGVtcGxhdGVDb25zdGFudHMuUk9MRV9ERVNDUklQVE9SOwotCQkJCX0KLQotCQkJfTsKLQkJfQotCQlDcmVhdGlvbkZhY3RvcnkgY3JlYXRpb25GYWN0b3J5ID0gcm9sZU5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQkJaWYgKHRhc2tOb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpIHsKLQkJCXRhc2tOb2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQlOYW1lZE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza05vZGUoKTsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCW5vZGUuc2V0VU1BRGlhZ3JhbShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKCkpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5UQVNLX0RFU0NSSVBUT1I7Ci0JCQkJfQotCi0JCQl9OwotCQl9Ci0JCWNyZWF0aW9uRmFjdG9yeSA9IHRhc2tOb2RlQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCi0JCWlmICh3cGROb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpIHsKLQkJCXdwZE5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCU5hbWVkTm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCk7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlub2RlLnNldFVNQURpYWdyYW0oZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJCQlub2RlLnNldE9iamVjdChVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLlRBU0tfREVTQ1JJUFRPUjsKLQkJCQl9Ci0KLQkJCX07Ci0JCX0KLQkJY3JlYXRpb25GYWN0b3J5ID0gd3BkTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBFZGl0b3IgSW5wdXQKLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRWRpdG9ySW5wdXQgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgewotCi0JCS8qKgotCQkgKiBAcGFyYW0gZQotCQkgKi8KLQkJcHVibGljIEVkaXRvcklucHV0KE9iamVjdCBlLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQkJc3VwZXIoZSwgc3VwcHJlc3Npb24pOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgZm9jdXMgb24gdGhlIGVkaXRvcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkdyYXBoaWNhbEVkaXRvciNzZXRGb2N1cygpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCXN1cGVyLnNldEZvY3VzKCk7Ci0JCWdldEdyYXBoaWNhbFZpZXdlcigpLmdldENvbnRlbnRzKCkucmVmcmVzaCgpOwotCQlpZiAoIWluaXRpYWxDbGVhblVwKSB7Ci0JCQljbGVhblVwRGlhZ3JhbSgpOwotCQkJaW5pdGlhbENsZWFuVXAgPSB0cnVlOwotCQkJLy8gTG9ja2VkIFBsdWdpbiBjYXNlOiBEaXNwbGF5IGdlbmVyYXRlZCBBREQgZGlhZ3JhbSwgUGVybWlzc2lvbiBkZW5pZWQgdG8gc2F2ZSwgIAotCQkJLy8gYW5kIE5vIGRpcnR5IGZsYWcgb24gZWRpdG9yLiAKLQkJCWlmKFRuZ1V0aWwuaXNMb2NrZWQoZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpKSl7Ci0JCQkJLy8gRmx1c2ggYWxsIGNvbW1hbmRzLCBtZWFucyB3aWxsIG5vdCBzYXZlLgotCQkJCWdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7Ci0JCQkJLy8gRmlyZSBkaXJ0eSBmbGFnIHByb3BlcnR5IGNoYW5nZSwgbm8gZGlydHkgZmxhZyBvbiBlZGl0b3IuCi0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFncmFtVHlwZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUw7Ci0JfQotCi0JLyoqCi0JICogQ2xlYW4gZGlhZ3JhbQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW5VcERpYWdyYW0oKSB7Ci0vLwkJTWV0aG9kRWxlbWVudCBvYmogPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgZ2V0RWRpdG9ySW5wdXQoKSkKLS8vCQkJCS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCURpYWdyYW1VcGRhdGVTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgRGlhZ3JhbVVwZGF0ZVNlcnZpY2UoCi0JCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCksIGdldEVkaXREb21haW4oKSwgZ2V0QWN0aW9uUmVnaXN0cnkoKSk7Ci0JCXNlcnZpY2UuY2xlYW5VcERpYWdyYW0oKTsKLQkJLy8gaWYgKFRuZ1V0aWwuaXNHZW5lcmFsaXplcihvYmosCi0JCS8vIGdldEV4dGVuZEFuZENvbnRyaWJ1dGVWYXJpYWJpbGl0eVR5cGVzKCkpCi0JCS8vICYmICFpbml0aWFsQ2xlYW5VcCkgewotCQkvLyBpbml0aWFsQ2xlYW5VcCA9IHRydWU7Ci0JCS8vIElBY3Rpb24gcmVzZXQgPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJLy8gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLlJFU0VUX0RJQUdSQU1fTEFZT1VUKTsKLQkJLy8gcmVzZXQucnVuKCk7Ci0JCS8vIGRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJLy8gfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjb250cmlidXRlVG9Db250ZXh0TWVudShvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KG1lbnUpOwotCi0JCWJvb2xlYW4gY2FuTW9kaWZ5ID0gIWlzUmVhZE9ubHkoKTsKLQotCQlJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKFJFU0VUX0RJQUdSQU1fTEFZT1VUKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCW1lbnUuaW5zZXJ0QmVmb3JlKERFTEVURV9ESUFHUkFNLCBhY3Rpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yI2NyZWF0ZUFjdGlvbnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLQkJQWN0aW9uIHJlc2V0TGF5b3V0QWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0KSB7IAotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oUkVGUkVTSCkucnVuKCk7Ci0JCQkJaWYgKGdldEdyYXBoaWNhbFZpZXdlcigpLmdldENvbnRlbnRzKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgewotCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCBkZXAgPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJLmdldENvbnRlbnRzKCk7Ci0JCQkJCUxpc3QgbG9jYWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWlmKGRlcC5nZXRDaGlsZHJlbigpICE9IG51bGwgJiYgIWRlcC5nZXRDaGlsZHJlbigpLmlzRW1wdHkoKSl7Ci0JCQkJCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBkZXAuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCQkJCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlpZighKG5leHQgaW5zdGFuY2VvZiBGcmVlVGV4dE5vZGVFZGl0UGFydCkpewotCQkJCQkJCQlsb2NhbC5hZGQobmV4dCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWRlcC5nZXRSZWNlbnRseUFkZGVkUGFydHMoKS5hZGRBbGwobG9jYWwpOwotCQkJCQljbGVhblVwRGlhZ3JhbSgpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCXJldHVybiBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLnNpemUoKSA9PSAwOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBSRVNFVF9ESUFHUkFNX0xBWU9VVDsKLQkJCX0KLQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHJlc2V0TGF5b3V0QWN0aW9uKTsKLQl9Ci0KLS8vCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb24gZXh0ZW5kQW5kQ29udHJpYnV0ZVZhcmlhYmlsaXR5VHlwZXMgPSBudWxsOwotCi0vLwlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIGdldEV4dGVuZEFuZENvbnRyaWJ1dGVWYXJpYWJpbGl0eVR5cGVzKCkgewotLy8JCWlmIChleHRlbmRBbmRDb250cmlidXRlVmFyaWFiaWxpdHlUeXBlcyA9PSBudWxsKSB7Ci0vLwkJCWV4dGVuZEFuZENvbnRyaWJ1dGVWYXJpYWJpbGl0eVR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQlleHRlbmRBbmRDb250cmlidXRlVmFyaWFiaWxpdHlUeXBlcwotLy8JCQkJCS5hZGQoVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCk7Ci0vLwkJCWV4dGVuZEFuZENvbnRyaWJ1dGVWYXJpYWJpbGl0eVR5cGVzCi0vLwkJCQkJLmFkZChWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTCk7Ci0vLwkJfQotLy8JCXJldHVybiBleHRlbmRBbmRDb250cmlidXRlVmFyaWFiaWxpdHlUeXBlczsKLS8vCX0KLQkKLQkvKioKLQkgKiBCcmVhayBkb3duIGFkYXB0ZXIgZmFjdG9yeSBjbGFzcwotCSAqLwotCXB1YmxpYyBjbGFzcyBCcmVha2Rvd25BZGFwdGVyRmFjdG9yeQotCXsKLQkJcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnkgd2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSB0YnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHdwYnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQotCQlwdWJsaWMgQnJlYWtkb3duQWRhcHRlckZhY3RvcnkoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcpCi0JCXsKLQkJCS8vIGNyZWF0ZSBhZGFwdCBmYWN0b3JpZXMKLQkJCXdic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5jcmVhdGVXQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQl0YnNBZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuY3JlYXRlVEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJd3Bic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5jcmVhdGVXUEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJY2JzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJCS8vIHNldCBjb25maWd1cmF0aW9uIGZpbHRlcgotCQkJRGlhZ3JhbUFkYXB0ZXJGYWN0b3J5RmlsdGVyIGNvbmZpZ3VyYXRvciA9IG5ldyBEaWFncmFtQWRhcHRlckZhY3RvcnlGaWx0ZXIoCi0JCQkJCW1ldGhvZENvbmZpZywgdGhpcyk7Ci0KLQkJCXdic0FkYXB0ZXJGYWN0b3J5LnNldEZpbHRlcihjb25maWd1cmF0b3IpOwotCQkJdGJzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7Ci0JCQl3cGJzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7Ci0JCQljYnNBZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIoY29uZmlndXJhdG9yKTsJCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGNsZWFyKCkKLQkJewotCQkJaWYgKHdic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQl3YnNBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQkJd2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQkJfQotCi0JCQlpZiAodGJzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXRic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCQl0YnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQl9Ci0KLQkJCWlmICh3cGJzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXdwYnNBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQkJd3Bic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJCX0KLQotCQkJaWYgKGNic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQljYnNBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQkJY2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIERpYWdyYW0gQWRhcHRlciBmYWN0b3J5IGZpbHRlcgotCSAqCi0JICovCi0JcHVibGljIGNsYXNzIERpYWdyYW1BZGFwdGVyRmFjdG9yeUZpbHRlciBleHRlbmRzIFByb2Nlc3NDb25maWd1cmF0b3IKLQkJCWltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5RmlsdGVyIHsKLQotCQlwcml2YXRlIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSBmYWN0b3J5OwotCi0JCS8qCi0JCSAqIENyZWF0ZSBhbiBpbnN0YW5jZQotCQkgKi8KLQkJcHVibGljIERpYWdyYW1BZGFwdGVyRmFjdG9yeUZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywKLQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQkJc3VwZXIobWV0aG9kQ29uZmlnKTsKLQkJCXRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIFdCUyBBZGFwdGVyIEZhY3RvcnkKLQkJICovCi0JCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRXQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJCXJldHVybiBmYWN0b3J5Lndic0FkYXB0ZXJGYWN0b3J5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBUZWFtIEFsbG9jYXRpb24gQWRhcHRlciBGYWN0b3J5Ci0JCSAqLwotCQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0VEJTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCQlyZXR1cm4gZmFjdG9yeS50YnNBZGFwdGVyRmFjdG9yeTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gV1AgVXNhZ2UgQWRhcHRlciBGYWN0b3J5Ci0JCSAqLwotCQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQkJcmV0dXJuIGZhY3Rvcnkud3Bic0FkYXB0ZXJGYWN0b3J5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBjb25zb2xpZGF0ZWQgdmlldyBhZGFwdGVyIGZhY3RvcnkKLQkJICovCi0JCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRDQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJCXJldHVybiBmYWN0b3J5LmNic0FkYXB0ZXJGYWN0b3J5OwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBzdXBlci5hY2NlcHQob2JqKTsKLQkJfQotCX0KLQkKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihmYWN0b3J5ICE9IG51bGwpewotCQkJZmFjdG9yeS5jbGVhcigpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9CcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9CcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMzMGU5OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSAqIEJyZWFrZG93biBFbGVtZW50IGlucHV0IGZvciBhbiBlZGl0b3IKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgNywgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0IGV4dGVuZHMgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IHsKLQotCXByaXZhdGUgU3VwcHJlc3Npb24gc3VwcHJlc3Npb247Ci0KLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIG9iamVjdAotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQoT2JqZWN0IG9iamVjdCwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJc3VwZXIoKE1ldGhvZEVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKG9iamVjdCkpOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCXdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iamVjdDsKLQkJfQotCQl0aGlzLnN1cHByZXNzaW9uID0gc3VwcHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBzdXBwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oKSB7Ci0JCXJldHVybiBzdXBwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdyYXBwZXIuCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGdldFdyYXBwZXIoKSB7Ci0JCXJldHVybiB3cmFwcGVyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGdldENsYXNzKCkuaXNJbnN0YW5jZShvYmopKSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgb3RoZXIgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSBvYmo7Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kRWxlbWVudCgpID09IG90aGVyLmdldE1ldGhvZEVsZW1lbnQoKQotCQkJCQkmJiBzdXBwcmVzc2lvbi5nZXRQcm9jZXNzKCkgPT0gb3RoZXIuZ2V0U3VwcHJlc3Npb24oKQotCQkJCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgcmVzdWx0ID0gc3VwZXIuaGFzaENvZGUoKTsKLQkJcmVzdWx0IF49IHN1cHByZXNzaW9uLmdldFByb2Nlc3MoKS5oYXNoQ29kZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Db2x1bW5EZXNjcmlwdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQ29sdW1uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGIzMmMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Db2x1bW5EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLS8qKgotICogQ29sdW1uIGRlc2NyaXB0b3JzIHVzZWQgZm9yIHByb2Nlc3MgZWRpdG9ycwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29sdW1uRGVzY3JpcHRvciBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU2NzE4NDc2OTg1OTcwOTk3TDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTExfRURJVE9SX1RZUEVfTk9ORSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRUxMX0VESVRPUl9UWVBFX1RFWFQgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VMTF9FRElUT1JfVFlQRV9DT01CT19CT09MRUFOID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTExfRURJVE9SX1RZUEVfQ0hFQ0tfQk9PTEVBTiA9IDM7Ci0KLQlwdWJsaWMgU3RyaW5nIGlkOwotCi0JcHVibGljIFN0cmluZyBsYWJlbDsKLQotCXB1YmxpYyBpbnQgd2lkdGg7Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXNpemFibGU7Ci0KLQlwdWJsaWMgaW50IGNlbGxFZGl0b3JUeXBlOwotCi0JcHVibGljIGludCB3ZWlnaHQ7Ci0KLQlwdWJsaWMgaW50IGFsaWdubWVudDsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqIAkJCUlEIG9mIHRoZSBjb2x1bW4KLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAJCQlDb2x1bW4gTmFtZQotCSAqIEBwYXJhbSB3ZWlnaHQKLQkgKiAJCQlDb2x1bW4gd2VpZ2h0Ci0JICogQHBhcmFtIHdpZHRoCi0JICogCQkJQ29sdW1uIFdpZHRoCi0JICogQHBhcmFtIHJlc2l6YWJsZQotCSAqIAkJCUZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBjb2x1bW4gaXMgcmVzaXphYmxlIG9yIG5vdAotCSAqIEBwYXJhbSBjZWxsRWRpdG9yVHlwZQotCSAqIAkJCUNvbHVtbiBjZWxsIGVkaXRvciB0eXBlCi0JICovCi0JcHVibGljIENvbHVtbkRlc2NyaXB0b3IoU3RyaW5nIGlkLCBTdHJpbmcgbGFiZWwsIGludCB3ZWlnaHQsIGludCB3aWR0aCwKLQkJCWJvb2xlYW4gcmVzaXphYmxlLCBpbnQgY2VsbEVkaXRvclR5cGUpIHsKLQkJdGhpcyhpZCwgbGFiZWwsIHdlaWdodCwgd2lkdGgsIHJlc2l6YWJsZSwgY2VsbEVkaXRvclR5cGUsIFNXVC5MRUZUKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogCQkJSUQgb2YgdGhlIGNvbHVtbgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIAkJCUNvbHVtbiBOYW1lCi0JICogQHBhcmFtIHdlaWdodAotCSAqIAkJCUNvbHVtbiB3ZWlnaHQKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiAJCQlDb2x1bW4gV2lkdGgKLQkgKiBAcGFyYW0gcmVzaWFibGUKLQkgKiAJCQlGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgY29sdW1uIGlzIHJlc2l6YWJsZSBvciBub3QKLQkgKiBAcGFyYW0gY2VsbEVkaXRvclR5cGUKLQkgKiAJCQlDb2x1bW4gY2VsbCBlZGl0b3IgdHlwZQotCSAqIEBwYXJhbSBhbGlnbm1lbnQKLQkgKiAJCQlDb2x1bW4gYWxpZ25tZW50Ci0JICovCi0JcHVibGljIENvbHVtbkRlc2NyaXB0b3IoU3RyaW5nIGlkLCBTdHJpbmcgbGFiZWwsIGludCB3ZWlnaHQsIGludCB3aWR0aCwKLQkJCWJvb2xlYW4gcmVzaWFibGUsIGludCBjZWxsRWRpdG9yVHlwZSwgaW50IGFsaWdubWVudCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJdGhpcy5yZXNpemFibGUgPSByZXNpYWJsZTsKLQkJdGhpcy53ZWlnaHQgPSB3ZWlnaHQ7Ci0JCXRoaXMud2lkdGggPSB3aWR0aDsKLQkJdGhpcy5jZWxsRWRpdG9yVHlwZSA9IGNlbGxFZGl0b3JUeXBlOwotCQl0aGlzLmFsaWdubWVudCA9IGFsaWdubWVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Db25maWd1cmF0aW9uRWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQ29uZmlndXJhdGlvbkVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmQ0YjFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Db25maWd1cmF0aW9uRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Db25maWdWaWV3UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkNvbmZpZ3VyYXRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZS5Db25maWd1cmF0aW9uQ2xvc3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci0KLQotLyoqCi0gKiBUaGUgTWV0aG9kIENvbmZpZ3VyYXRpb24gZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRWRpdG9yIGV4dGVuZHMgTWV0aG9kRWxlbWVudEVkaXRvciBpbXBsZW1lbnRzIElHb3RvTWFya2VyIHsKLQotCS8qKgotCSAqIFRoZSBlZGl0b3IgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0lEID0gQ29uZmlndXJhdGlvbkVkaXRvci5jbGFzcy5nZXROYW1lKCk7Ci0KLQlDb25maWd1cmF0aW9uUGFnZSBjb25maWdQYWdlID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25FZGl0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWRpdG9yLgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiAoKENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgc3VwZXIuZ2V0RWRpdG9ySW5wdXQoKSkKLQkJCQkuZ2V0Q29uZmlndXJhdGlvbigpOwotCX0KLQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCS8vIHByb2JhYmx5IG9wZW5lZCBmcm9tIFByb2JsZW1zIFZpZXcKLQkJCS8vIGNyZWF0ZSBhIENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dAotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2UoKChGaWxlRWRpdG9ySW5wdXQpaW5wdXQpLmdldEZpbGUoKSk7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQlpbnB1dCA9IG5ldyBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQoKE1ldGhvZENvbmZpZ3VyYXRpb24pZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvciNhZGRQYWdlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXRyeSB7Ci0JCQlhZGRQYWdlKG5ldyBDb25maWd1cmF0aW9uRGVzY3JpcHRpb24odGhpcykpOwotCQkJY29uZmlnUGFnZSA9IG5ldyBDb25maWd1cmF0aW9uUGFnZSh0aGlzKTsKLQkJCWFkZFBhZ2UoY29uZmlnUGFnZSk7Ci0JCQlhZGRQYWdlKG5ldyBDb25maWdWaWV3UGFnZSh0aGlzKSk7Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY2xvc3VyZSBmb3IgdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBjbG9zdXJlCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25DbG9zdXJlIGdldENsb3N1cmUoKSB7Ci0JCXJldHVybiBjb25maWdQYWdlLmdldENsb3N1cmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2NyZWF0ZUlucHV0KG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUVkaXRvcklucHV0IGNyZWF0ZUlucHV0KE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZihlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIExpc3Q8TGlzdGVuZXI+IHNldEZvY3VzTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxMaXN0ZW5lcj4oKTsKLQkKLQkKLQkvKioKLQkgKiBBZGQgZ2l2ZW4gbGlzdGVuZXIgdG8gbGlzdCBvZiBmb2N1cyBsaXN0ZW5lcnMKLQkgKiBAcGFyYW0gbGlzCi0JICovCi0JcHVibGljIHZvaWQgYWRkVG9TZXRGb2N1c0xpc2VuZXJzKExpc3RlbmVyIGxpcykgewotCQlzZXRGb2N1c0xpc3RlbmVycy5hZGQobGlzKTsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQjc2V0Rm9jdXMoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgeyAgICAJCi0gICAgCUV2ZW50IGUgPSBuZXcgRXZlbnQoKTsKLSAgICAJZS5kYXRhID0gZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCk7ICAgCQotICAgIAlmb3IgKGludCBpPTA7IGk8c2V0Rm9jdXNMaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAJCUxpc3RlbmVyIGxpcyA9IChMaXN0ZW5lcikgc2V0Rm9jdXNMaXN0ZW5lcnMuZ2V0KGkpOwotICAgIAkJbGlzLmhhbmRsZUV2ZW50KGUpOwotICAgIAl9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgewotICAgIAkvLyBhY3RpdmF0ZSBjb25maWcgcGFnZQotICAgIAlzZXRBY3RpdmVQYWdlKDEpOwotICAgIAlpZiAoY29uZmlnUGFnZSAhPSBudWxsKSB7Ci0gICAgCQljb25maWdQYWdlLmdvdG9NYXJrZXIobWFya2VyKTsKLSAgICAJfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkb1F1aWNrRml4KElNYXJrZXIgbWFya2VyKSB7Ci0gICAgCWNvbmZpZ1BhZ2UuZG9RdWlja0ZpeChtYXJrZXIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Db25maWd1cmF0aW9uRWRpdG9ySW5wdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Db25maWd1cmF0aW9uRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI3YWYzNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQ29uZmlndXJhdGlvbkVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLQotLyoqCi0gKiBBbiBlZGl0b3IgaW5wdXQgZm9yIHRoZSBjb25maWd1cmF0aW9uIGVkaXRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkVkaXRvcklucHV0IGV4dGVuZHMgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gY29uZmlnCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkvLyBtZXRob2RDb25maWd1cmF0aW9uID0gY29uZmlnOwotCQlzdXBlcihjb25maWcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgewotCQkvLyByZXR1cm4gbWV0aG9kQ29uZmlndXJhdGlvbjsKLQkJcmV0dXJuIChNZXRob2RDb25maWd1cmF0aW9uKSBzdXBlci5nZXRNZXRob2RFbGVtZW50KCk7Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRUb29sVGlwVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJcmV0dXJuIERpYWdyYW1VSVJlc291cmNlcy5Db25maWd1cmF0aW9uRWRpdG9ySW5wdXRfY29uZmlnZWRpdG9yMDsgCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0VkaXRvckNob29zZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9FZGl0b3JDaG9vc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NWM0NDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0VkaXRvckNob29zZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UuRGlhZ25vc3RpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5WaWV3SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0UHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS5lZGl0b3JzLklNZXRob2RFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIExhdW5jaGVzIGEgTWV0aG9kIGVkaXRvciB0aGF0IGlzIGFwcHJvcHJpYXRlIGZvciBhIGdpdmVuIG1ldGhvZCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0b3JDaG9vc2VyIGltcGxlbWVudHMgSUVkaXRvcktlZXBlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBFZGl0b3JDaG9vc2VyIHNpbmdsZXRvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc2luZ2xldG9uIGluc3RhbmNlCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBFZGl0b3JDaG9vc2VyIGdldEluc3RhbmNlKCkgewotCQlpZiAoc2luZ2xldG9uID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoRWRpdG9yQ2hvb3Nlci5jbGFzcykgewotCQkJCWlmIChzaW5nbGV0b24gPT0gbnVsbCkgewotCQkJCQlzaW5nbGV0b24gPSBuZXcgRWRpdG9yQ2hvb3NlcigpOwotCQkJCQlJRWRpdG9yS2VlcGVyLlJFRkVSRU5DRS5zZXRFZGl0b3JLZWVwZXIoc2luZ2xldG9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci0KLQlwdWJsaWMgRWRpdG9yQ2hvb3NlcigpIHsKLQkJCi0JfQotCQotCQotCS8qKgotCSAqIE9wZW5zIHRoZSByZXNwZWN0aXZlIGVkaXRvciBkZXBlbmRpbmcgb24gdGhlIGdpdmVuIE1ldGhvZCBlbGVtZW50IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBBIE1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIG9wZW5FZGl0b3IoT2JqZWN0IG9iaikgewotCQl0cnkgewotCQkJb2JqID0gVmlld0hlbHBlci5oYW5kbGVEYW5nbGluZyhvYmopOwotCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCXJldHVybjsKLQotCQkJb2JqID0gTGlicmFyeVV0aWwudW53cmFwKG9iaik7Ci0KLQkJCUFycmF5TGlzdCBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCVJlc291cmNlIHJlcyA9ICgoRU9iamVjdCkgb2JqKS5lUmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzICE9IG51bGwgJiYgIXJlcy5nZXRFcnJvcnMoKS5pc0VtcHR5KCkpIHsKLQkJCQkJZXJyb3JzLmFkZEFsbChyZXMuZ2V0RXJyb3JzKCkpOwotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJCVJlc291cmNlIHByZXNSZXMgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqKQotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKTsKLQkJCQkJaWYgKHByZXNSZXMgIT0gbnVsbCAmJiAhcHJlc1Jlcy5nZXRFcnJvcnMoKS5pc0VtcHR5KCkpIHsKLQkJCQkJCWVycm9ycy5hZGRBbGwocHJlc1Jlcy5nZXRFcnJvcnMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFlcnJvcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCWZpbmFsIE11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKAotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLAotCQkJCQkJCTAsCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWRpdG9yQ2hvb3Nlcl9SZXNvdXJjZXNFcnJvciwgbnVsbCk7IAotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlcnJvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlEaWFnbm9zdGljIGUgPSAoRGlhZ25vc3RpYykgaXRlci5uZXh0KCk7Ci0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLAotCQkJCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAwLCBlCi0JCQkJCQkJCQkJLmdldE1lc3NhZ2UoKSwgbnVsbCk7Ci0JCQkJCQltdWx0aVN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJaWYgKEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkVkaXRvckNob29zZXJfbG9hZGRFcnJvckRsZ1RpdGxlLAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkVkaXRvckNob29zZXJfUmVzb3VyY2VzRXJyb3IsIAotCQkJCQkJCQkJCW11bHRpU3RhdHVzKSA9PSBEaWFsb2cuQ0FOQ0VMKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCUVkaXRvck9wZW5lciBvcGVuZXIgPSBFZGl0b3JPcGVuZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0T3BlbmVyKG9iaik7Ci0JCQlpZiAoIG9wZW5lciAhPSBudWxsICYmIG9wZW5lci5jYW5PcGVuKG9iaikgKSB7Ci0JCQkJb3BlbmVyLm9wZW5FZGl0b3Iob2JqKTsKLQkJCX0gZWxzZSBpZiAoKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikKLQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB8fCAob2JqIGluc3RhbmNlb2YgUm9sZSkKLQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFRhc2spIHx8IChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkKLQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB8fCAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkKLQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykKLQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIERvbWFpbikKLQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkKLQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpIHx8IChvYmogaW5zdGFuY2VvZiBUb29sKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkpIHsKLQkJCQlvcGVuRWRpdG9yKChNZXRob2RFbGVtZW50KSBvYmosIE1ldGhvZEVsZW1lbnRFZGl0b3IuRURJVE9SX0lEKTsKLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlDdXN0b21DYXRlZ29yeSBjdXN0Q2F0ID0gKEN1c3RvbUNhdGVnb3J5KSBvYmo7Ci0JCQkJaWYoVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeShjdXN0Q2F0KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCW9wZW5FZGl0b3IoKE1ldGhvZEVsZW1lbnQpIG9iaiwgTWV0aG9kRWxlbWVudEVkaXRvci5FRElUT1JfSUQpOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJb3BlbkVkaXRvcigoTWV0aG9kRWxlbWVudCkgb2JqLCBQcm9jZXNzRWRpdG9yLkVESVRPUl9JRCk7Ci0KLQkJCQkvLyBvcGVuIHByb3BlcnRpZXMgdmlldyBieSBkZWZhdWx0IHdoZW4gd2Ugb3BlbiBQcm9jZXNzIEVkaXRvcgotCQkJCXRyeSB7Ci0JCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkuZ2V0QWN0aXZlUGFnZSgpLnNob3dWaWV3KAotCQkJCQkJCQkJIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiLCBudWxsLCBJV29ya2JlbmNoUGFnZS5WSUVXX1ZJU0lCTEUpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJCQlleGNlcHRpb24pOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCU9iamVjdCBjb250YWluZXIgPSAoKFByb2Nlc3MpIG9iaikuZUNvbnRhaW5lcigpOwotCQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCW9wZW5FZGl0b3IoKE1ldGhvZEVsZW1lbnQpIGNvbnRhaW5lciwKLQkJCQkJCQlQcm9jZXNzRWRpdG9yLkVESVRPUl9JRCk7Ci0JCQkJfQotCQkJfWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQlvcGVuRWRpdG9yKChNZXRob2RDb25maWd1cmF0aW9uKSBvYmosCi0JCQkJCQlDb25maWd1cmF0aW9uRWRpdG9yLkVESVRPUl9JRCk7Ci0JCQl9ZWxzZSBpZihvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KXsKLQkJCQlQcm9jZXNzIHByb2Nlc3MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpb2JqKTsKLQkJCQlPYmplY3QgY29udGFpbmVyID0gcHJvY2Vzcy5lQ29udGFpbmVyKCk7Ci0JCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJb3BlbkVkaXRvcigoTWV0aG9kRWxlbWVudCkgY29udGFpbmVyLAotCQkJCQkJCVByb2Nlc3NFZGl0b3IuRURJVE9SX0lEKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQl0LnByaW50U3RhY2tUcmFjZSgpOwotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX3RpdGxlOyAKLQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX21lc3NhZ2U7IAotCQkJU3RyaW5nIHJlYXNvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ19yZWFzb247IAotCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsIHJlYXNvbiwgdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGUgQ29uZmlndXJhdGlvbiBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSBlZGl0b3JJZAotCSAqLwotCXByaXZhdGUgdm9pZCBvcGVuRWRpdG9yKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgZWRpdG9ySWQpCi0JCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBuZXcgQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KAotCQkJCWNvbmZpZyk7Ci0JCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkub3BlbkVkaXRvcigKLQkJCQkJCWVkaXRvcklucHV0LCBlZGl0b3JJZCk7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgdGhlIE1ldGhvZCBlZGl0b3IgZm9yIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgQSBNZXRob2QgZWxlbWVudC4KLQkgKiBAcGFyYW0gZWRpdG9ySWQKLQkgKiAgICAgICAgICAgIFRoZSBlZGl0b3IgSUQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIG9wZW5FZGl0b3IoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgZWRpdG9ySWQpCi0JCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBuZXcgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KAotCQkJCWVsZW1lbnQpOwotCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLm9wZW5FZGl0b3IoCi0JCQkJCQllZGl0b3JJbnB1dCwgZWRpdG9ySWQpOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdHMgKGJyaW5ncyB0byBmcm9udCwgYnV0IGRvZXMgbm90IGdpdmUgZm9jdXMpIHRoZSBNZXRob2QgZWRpdG9yIGZvcgotCSAqIHRoZSBnaXZlbiBvYmplY3QuIElmIHRoZXJlIGlzIG5vIG9wZW4gZWRpdG9yIGZvciB0aGUgb2JqZWN0LCBkb2VzCi0JICogbm90aGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0RWRpdG9yKE9iamVjdCBvYmopIHsKLQkJdHJ5IHsKLQkJCW9iaiA9IFZpZXdIZWxwZXIuaGFuZGxlRGFuZ2xpbmcob2JqKTsKLQkJCWlmIChvYmogPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlvYmogPSBMaWJyYXJ5VXRpbC51bndyYXAob2JqKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCXQucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JCQllZGl0b3JJbnB1dCA9IG5ldyBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQoCi0JCQkJCShNZXRob2RDb25maWd1cmF0aW9uKSBvYmopOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KQotCQkJZWRpdG9ySW5wdXQgPSBuZXcgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KChNZXRob2RFbGVtZW50KSBvYmopOwotCQlpZiAoZWRpdG9ySW5wdXQgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHBhZ2UuZmluZEVkaXRvcihlZGl0b3JJbnB1dCk7Ci0JCQlpZiAoZWRpdG9yUGFydCAhPSBudWxsKQotCQkJCXBhZ2UuYnJpbmdUb1RvcChlZGl0b3JQYXJ0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIFJldHVybnMgc2VsZWN0ZWQgZWRpdG9yIGlucHV0Ci0JICogQHJldHVybiBUaGUgb2JqZWN0IHdoaWNoIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgTWV0aG9kIGVkaXRvciBpcyBlZGl0aW5nIChvcgotCSAqICAgICAgICAgbnVsbCBpZiB0aGVyZSBpcyBubyBlZGl0b3Igb3IgaWYgdGhlIGVkaXRvciBpcyBub3QgYSBNZXRob2QgZWRpdG9yKS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdGl2ZU1ldGhvZEVkaXRvcklucHV0KCkgewotCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJcmV0dXJuIGdldE1ldGhvZEVkaXRvcklucHV0KGVkaXRvclBhcnQpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TWV0aG9kRWRpdG9ySW5wdXQoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkgewotCQlpZiAoZWRpdG9yUGFydCAhPSBudWxsKSB7Ci0JCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBlZGl0b3JQYXJ0LmdldEVkaXRvcklucHV0KCk7Ci0JCQlpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpCi0JCQkJcmV0dXJuICgoQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KSBlZGl0b3JJbnB1dCkKLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpCi0JCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBlZGl0b3JJbnB1dCkKLQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2xvc2VzIHRoZSBNZXRob2QgZWRpdG9yIGZvciB0aGUgZ2l2ZW4gTWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqICAgICAgICAgICAgQSBNZXRob2QgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZUVkaXRvcihPYmplY3Qgb2JqKSB7Ci0JCXRyeSB7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBmaW5kRWRpdG9yKG9iaik7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkKLQkJCQkJCS5jbG9zZUVkaXRvcihlZGl0b3IsIGZhbHNlKTsKLQkJCX0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBJRWRpdG9yUGFydCBmaW5kRWRpdG9yKE9iamVjdCBvYmopIHsKLQkJdHJ5IHsKLQkJCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQoCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmopOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZmluZEVkaXRvcigKLQkJCQkJCQllZGl0b3JJbnB1dCk7Ci0JCQlyZXR1cm4gZWRpdG9yOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBsaXN0IG9mIGRpcnR5IGVkaXRvcnMgZm9yIHRoZSBnaXZlbiBlbGVtZW50cwotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEByZXR1cm4JTGlzdCBvZiBkaXJ0eSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFbGVtZW50c1dpdGhEaXJ0eUVkaXRvcihDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCS8vIEFycmF5TGlzdCBjbG9zZUVkaXRvclJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCAmJiBlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCQkJZWxlbWVudCA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dCkKLQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIHsKLQkJCQkJZWxlbWVudCA9ICgoQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KSBpbnB1dCkKLQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbigpOwotCQkJCX0KLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChlID09IGVsZW1lbnQgfHwgVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KGVsZW1lbnQsIGUpKSB7Ci0JCQkJCQkJcmVzdWx0LmFkZChlbGVtZW50KTsKLQkJCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIGFsbCBvcGVuIE1ldGhvZCBlZGl0b3JzIG9mb3IgdGhlIGdpdmVuIChkZWxldGVkKSBlbGVtZW50IGFuZAotCSAqIGFsbCBvZiBpdHMgY2hpbGRyZW4gYW5kIGdyYW5kIGNoaWxkcmVuLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICB0aGUgZGVsZXRlZCBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgY2xvc2VFZGl0b3JzT25EZWxldGlvbihPYmplY3QgZSkgewotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJQXJyYXlMaXN0IGNsb3NlRWRpdG9yUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCQkJZWxlbWVudCA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dCkKLQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIHsKLQkJCQkJZWxlbWVudCA9ICgoQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KSBpbnB1dCkKLQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbigpOwotCQkJCX0KLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsCi0JCQkJCQkmJiAoZWxlbWVudC5lQ29udGFpbmVyKCkgPT0gbnVsbCB8fCBVbWFVdGlsCi0JCQkJCQkJCS5pc0NvbnRhaW5lZEJ5KGVsZW1lbnQsIGUpKSkgewotCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWludCBzaXplID0gY2xvc2VFZGl0b3JSZWZzLnNpemUoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgSUVkaXRvclJlZmVyZW5jZVtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlZmVyZW5jZXNbaV0gPSAoSUVkaXRvclJlZmVyZW5jZSkgY2xvc2VFZGl0b3JSZWZzLmdldChpKTsKLQkJfQotCQl3b3JrYmVuY2hQYWdlLmNsb3NlRWRpdG9ycyhyZWZlcmVuY2VzLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIENsb3NlcyBhbGwgTWV0aG9kIEVkaXRvcnMgd2l0aG91dCBzYXZpbmcuCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZUFsbE1ldGhvZEVkaXRvcnMoKSB7Ci0JCWZpbmFsIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJd29ya2JlbmNoLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJTGlzdDxJRWRpdG9yUmVmZXJlbmNlPiBjbG9zZUVkaXRvclJlZnMgPSBnZXRPcGVuTWV0aG9kRWRpdG9ycygpOwotCQkJCQl3b3JrYmVuY2hQYWdlLmNsb3NlRWRpdG9ycyhjbG9zZUVkaXRvclJlZnMudG9BcnJheShuZXcgSUVkaXRvclJlZmVyZW5jZVtjbG9zZUVkaXRvclJlZnMuc2l6ZSgpXSksIGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBhbGwgb3BlbiBNZXRob2QgRWRpdG9ycwotCSAqLwotCXB1YmxpYyBMaXN0PElFZGl0b3JSZWZlcmVuY2U+IGdldE9wZW5NZXRob2RFZGl0b3JzKCkgewotCQlmaW5hbCBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCWZpbmFsIExpc3Q8SUVkaXRvclJlZmVyZW5jZT4gbWV0aG9kRWRpdG9yUmVmcyA9IG5ldyBBcnJheUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4oKTsKLQkJd29ya2JlbmNoLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQkJCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCQkJCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKGZhbHNlKTsKLQkJCQkJCVN0cmluZyBlZGl0b3JJZCA9IHJlZmVyZW5jZS5nZXRJZCgpOwotCQkJCQkJaWYgKGVkaXRvcklkLnN0YXJ0c1dpdGgoIm9yZy5lY2xpcHNlLmVwZiIpIHx8IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJZWRpdG9yUGFydCBpbnN0YW5jZW9mIElNZXRob2RFZGl0b3IpIHsKLQkJCQkJCQltZXRob2RFZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJcmV0dXJuIG1ldGhvZEVkaXRvclJlZnM7Ci0JfQotCi0JLyoqCi0JICogQ2xvc2UgYWxsIE1ldGhvZEVkaXRvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBQbHVnaW4uCi0JICogV2lsbCBjYXVzZSBhIHVzZXItcHJvbXB0IGZvciBlYWNoIGRpcnR5IGVkaXRvcgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlTWV0aG9kRWRpdG9yc0ZvclBsdWdpbkVsZW1lbnRzKE1ldGhvZFBsdWdpbiBtZXRob2RwbHVnaW4pIHsKLQkJaWYgKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSAhPSBudWxsCi0JCQkJJiYgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJTGlzdDxJRWRpdG9yUmVmZXJlbmNlPiBsaXN0ID0gZ2V0T3Blbk1ldGhvZEVkaXRvcnMoKTsKLQkJCUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4gZWRpdG9yUmVmc1RvQ2xvc2UgPSBuZXcgQXJyYXlMaXN0PElFZGl0b3JSZWZlcmVuY2U+KCk7Ci0JCQlmb3IgKElFZGl0b3JSZWZlcmVuY2UgZWRpdG9yUmVmZXJlbmNlIDogbGlzdCkgewotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IGVkaXRvclJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCQkJCWVsZW1lbnQgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgaW5wdXQpCi0JCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIHsKLQkJCQkJCWVsZW1lbnQgPSAoKENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgaW5wdXQpCi0JCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCQkJCX0gZWxzZSBpZihpbnB1dCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KXsKLQkJCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBlSW5wdXQgPSAoKERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KWlucHV0KS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCQkJCWVsZW1lbnQgPSBlSW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQkJaWYoZWxlbWVudCA9PSBudWxsKXsKLQkJCQkJCQlpZihlSW5wdXQuZ2V0V3JhcHBlcigpICE9IG51bGwpewotCQkJCQkJCQllbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpVG5nVXRpbC51bndyYXAoZUlucHV0LmdldFdyYXBwZXIoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChlbGVtZW50ICE9IG51bGwKLQkJCQkJCQkmJiAoZWxlbWVudC5lQ29udGFpbmVyKCkgPT0gbnVsbCB8fCBVbWFVdGlsCi0JCQkJCQkJCQkuaXNDb250YWluZWRCeShlbGVtZW50LCBtZXRob2RwbHVnaW4pKSkgewotCQkJCQkJaWYgKCFlbGVtZW50LmVxdWFscyhtZXRob2RwbHVnaW4pKQotCQkJCQkJCWVkaXRvclJlZnNUb0Nsb3NlLmFkZChlZGl0b3JSZWZlcmVuY2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJd29ya2JlbmNoUGFnZS5jbG9zZUVkaXRvcnMoZWRpdG9yUmVmc1RvQ2xvc2UudG9BcnJheShuZXcgSUVkaXRvclJlZmVyZW5jZVtlZGl0b3JSZWZzVG9DbG9zZS5zaXplKCldKSwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvRWRpdG9yT3BlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvRWRpdG9yT3BlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiY2Q0ZjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0VkaXRvck9wZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi0vKioKLSAqIGFic3RyYWN0IGNsYXNzIGZvciBlZGl0b3Igb3BlbmVuciBleHRlbnNpb24KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFZGl0b3JPcGVuZXIgewotCi0JcHVibGljIEVkaXRvck9wZW5lcigpIHsKLQkJCi0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNhbk9wZW4oT2JqZWN0IG9iaik7Ci0JcHVibGljIGFic3RyYWN0IHZvaWQgb3BlbkVkaXRvcihPYmplY3Qgb2JqKSB0aHJvd3MgRXhjZXB0aW9uIDsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9FZGl0b3JPcGVuZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvRWRpdG9yT3BlbmVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjFhZjhiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9FZGl0b3JPcGVuZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIEVkaXRvciBPcGVuZW5yIEV4dGVuc2lvbnMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVkaXRvck9wZW5lckZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FID0gIkVkaXRvck9wZW5lciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAiY2xhc3MiIGF0dHJpYnV0ZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0FUVFJJQl9OQU1FID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICJpZCIgYXR0cmlidXRlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQVRUUklCX05BTUUgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEVkaXRvck9wZW5lckZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0JLy8gQSBtYXAgb2YgbGlicmFyeSBtYW5hZ2VyIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMuCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBFZGl0b3JPcGVuZXJFbGVtZW50PiBvcGVuZXJFbGVtZW50cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgRWRpdG9yT3BlbmVyRWxlbWVudD4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBFZGl0b3JPcGVuZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgRWRpdG9yT3BlbmVyRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWRpdG9yT3BlbmVyRmFjdG9yeSgpIHsKLQkJaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJLy8gUHJvY2VzcyB0aGUgIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxpYnJhcnlNYW5hZ2VycyIgZXh0ZW5zaW9uIHBvaW50Ci0JCS8vIGNvbnRyaWJ1dG9ycy4KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSwgRVhURU5TSU9OX1BPSU5UX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoQ0xBU1NfQVRUUklCX05BTUUpOwotCQkJCQkJU3RyaW5nIGlkID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKElEX0FUVFJJQl9OQU1FKTsKLQkJCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCAmJiBjbGFzc05hbWUudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiBpZCAhPSBudWxsICYmIGlkLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsJCQkJCQkJCi0JCQkJCQkJRWRpdG9yT3BlbmVyRWxlbWVudCBwcm92aWRlciA9IG9wZW5lckVsZW1lbnRzLmdldChpZCk7Ci0JCQkJCQkJaWYocHJvdmlkZXIgPT0gbnVsbCApIHsKLQkJCQkJCQkJcHJvdmlkZXIgPSBuZXcgRWRpdG9yT3BlbmVyRWxlbWVudCgKLQkJCQkJCQkJCQlidW5kbGUsIGNsYXNzTmFtZSwgaWQpOwotCQkJCQkJCQlvcGVuZXJFbGVtZW50cy5wdXQoaWQsIHByb3ZpZGVyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBFZGl0b3JPcGVuZXIgZ2V0T3BlbmVyKE9iamVjdCBvYmopIHsKLQkJaWYgKCBvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICkgewotCQkJTWV0aG9kRWxlbWVudCBlID0gKChNZXRob2RFbGVtZW50KW9iaik7Ci0JCQkKLQkJCXdoaWxlIChlICE9IG51bGwgKSB7Ci0JCQkJTGlzdCBwcm9wcyA9IGUuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0JCQkJaWYgKCBwcm9wcyAhPSBudWxsICYmIHByb3BzLnNpemUoKSA+IDAgKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRwID0gcHJvcHMuaXRlcmF0b3IoKTsgaXRwLmhhc05leHQoKTsgKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpaXRwLm5leHQoKTsKLQkJCQkJCVN0cmluZyBpZCA9IHByb3AuZ2V0TmFtZSgpOwotCQkJCQkJRWRpdG9yT3BlbmVyIG9wZW5lcj0gY3JlYXRlRXh0ZW5zaW9uKGlkKTsKLQkJCQkJCWlmICggb3BlbmVyICE9IG51bGwgKSB7CQkJCQkJCi0JCQkJCQkJcmV0dXJuIG9wZW5lcjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0JCi0JCQkJCi0JCQkJaWYgKCBlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkKLQkJCQkvLyB0cnkgaWYgdGhlIGlkIGlzIGRlZmluZWQgaW4gdGhlIHBsdWdpbgotCQkJCWUgPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzRXh0ZW5zaW9uKFN0cmluZyBpZCkgewotCQlyZXR1cm4gb3BlbmVyRWxlbWVudHMuY29udGFpbnNLZXkoaWQpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGxheW91dCBleHRlbnNpb24uCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBleHRlbnNpb24gaWQKLQkgKiBAcmV0dXJuIExheW91dEV4dGVuc2lvbgotCSAqLwotCXByaXZhdGUgRWRpdG9yT3BlbmVyIGNyZWF0ZUV4dGVuc2lvbihTdHJpbmcgaWQpIHsKLQkJCi0JCWlmICggIWhhc0V4dGVuc2lvbihpZCkgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJRWRpdG9yT3BlbmVyRWxlbWVudCBwcm92aWRlciA9IChFZGl0b3JPcGVuZXJFbGVtZW50KSBvcGVuZXJFbGVtZW50cy5nZXQoaWQpOwotCQl0cnkgewotCQkJQ2xhc3MgY2xhenogPSBwcm92aWRlci5idW5kbGUubG9hZENsYXNzKHByb3ZpZGVyLmNsYXNzTmFtZSk7Ci0JCQlyZXR1cm4gKEVkaXRvck9wZW5lcikgY2xhenoubmV3SW5zdGFuY2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEVkaXRvck9wZW5lckVsZW1lbnQgewotCQlCdW5kbGUgYnVuZGxlOwotCQlTdHJpbmcgY2xhc3NOYW1lOwotCQlTdHJpbmcgaWQ7Ci0JCXByaXZhdGUgRWRpdG9yT3BlbmVyRWxlbWVudChCdW5kbGUgYnVuZGxlLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgaWQpIHsKLQkJCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCQl0aGlzLmlkID0gaWQ7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvR3JhcGhpY2FsV1BEZXBlbmRlbmN5RWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvR3JhcGhpY2FsV1BEZXBlbmRlbmN5RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OTFiMjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0dyYXBoaWNhbFdQRGVwZW5kZW5jeUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LldQRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5Db21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5Db25uZWN0aW9uQ3JlYXRpb25Ub29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuTWFycXVlZVRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYW5uaW5nU2VsZWN0aW9uVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkdFRkFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLQotCi0vKioKLSAqIEFuIGVkaXRvciBmb3IgZ3JhcGhpY2FsIHdvcmsgcHJvZHVjdCBkZXBlbmVkZW5jeSBkaWFncmFtCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wIAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhpY2FsV1BEZXBlbmRlbmN5RWRpdG9yIGV4dGVuZHMgQWJzdHJhY3REaWFncmFtRWRpdG9yIHsKLQotCXByaXZhdGUgQ3JlYXRpb25GYWN0b3J5IHdwTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQotLy8JcHJpdmF0ZSBJUHJvcGVydHlTaGVldEVudHJ5IHJvb3RFbnRyeTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfV1BfTk9ERSA9ICJjcmVhdGVfd29ya3Byb2R1Y3RfZGVzY3JpcHRvcl9ub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgR3JhcGhpY2FsV1BEZXBlbmRlbmN5RWRpdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDcmVhdGlvbkZhY3RvcmllcygpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUNyZWF0aW9uRmFjdG9yaWVzKCk7Ci0KLQkJaWYgKHdwTm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQl3cE5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQlXb3JrUHJvZHVjdE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlV29ya1Byb2R1Y3ROb2RlKCk7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlub2RlLnNldFVNQURpYWdyYW0oZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCk7Ci0JCQkJCW5vZGUuc2V0RGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJbm9kZS5zZXRPYmplY3Qod3BkKTsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRPYmplY3RUeXBlKCkgewotCi0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5XT1JLX1BST0RVQ1Q7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlDcmVhdGlvbkZhY3RvcnkgY3JlYXRpb25GYWN0b3J5ID0gd3BOb2RlQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVRvQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvQ29udGV4dE1lbnUobWVudSk7Ci0KLQkJYm9vbGVhbiBjYW5Nb2RpZnkgPSAhaXNSZWFkT25seSgpOwotCi0JCS8vIElBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oUFJPUEVSVElFU19QQUdFKTsKLQkJLy8gaWYoYWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCS8vIG1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQkvLyB9Ci0JCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX1dQX05PREUpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQlzdXBlci5jcmVhdGVBY3Rpb25zKCk7Ci0JCS8vIEFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0QWN0aW9uUmVnaXN0cnkoKTsKLQkJLy8gSUFjdGlvbiBhY3Rpb247Ci0JCS8vCi0JCS8vIGFjdGlvbiA9IG5ldyBBY3Rpb24oIlNob3cgJlByb3BlcnRpZXMgVmlldyIpIHsKLQkJLy8gcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJLy8gcmV0dXJuIFBST1BFUlRJRVNfUEFHRTsKLQkJLy8gfQotCQkvLyBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCS8vIHRyeSB7Ci0JCS8vCi0JCS8vIGdldFNpdGUoKS5nZXRQYWdlKCkuc2hvd1ZpZXcoCi0JCS8vICJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7Ci0JCS8vIC8vIHNldElkKCJTaG93X1Byb3BlcnRpZXMiKTsKLQkJLy8gfQotCQkvLyBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCS8vIC8vQXV0aG9yaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleGNlcHRpb24pOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkvLyBMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCS8vIHJldHVybiAoZWRpdFBhcnRzLnNpemUoKSA9PSAxICYmIGVkaXRQYXJ0cy5nZXQoMCkgaW5zdGFuY2VvZgotCQkvLyBFZGl0UGFydCk7Ci0JCS8vIH0KLQkJLy8gfTsKLQkJLy8JCQotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCUlBY3Rpb24gYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dCwgd3BOb2RlQ3JlYXRpb25GYWN0b3J5LCAKLQkJCQlDUkVBVEVfV1BfTk9ERSwKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90b29sdGlwLCAKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgUGFsZXR0ZUNvbnRhaW5lciBjcmVhdGVDb250cm9sR3JvdXAoUGFsZXR0ZVJvb3Qgcm9vdCkgewotCQlpbml0aWFsaXplQ3JlYXRpb25GYWN0b3JpZXMoKTsKLQkJUGFsZXR0ZUdyb3VwIGNvbnRyb2xHcm91cCA9IG5ldyBQYWxldHRlR3JvdXAoIkNvbnRyb2wgR3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCi0JCUxpc3QgZW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlUb29sRW50cnkgdG9vbCA9IG5ldyBQYW5uaW5nU2VsZWN0aW9uVG9vbEVudHJ5KERpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3RleHQsIAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3Rvb2x0aXAKLQkJKTsKLQkJdG9vbC5zZXRTbWFsbEljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkic2VsZWN0X3BhbDE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0b29sLnNldExhcmdlSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJzZWxlY3RfcGFsMjQuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWVudHJpZXMuYWRkKHRvb2wpOwotCQlyb290LnNldERlZmF1bHRFbnRyeSh0b29sKTsKLQotCQl0b29sID0gbmV3IE1hcnF1ZWVUb29sRW50cnkoKTsKLQkJdG9vbC5zZXRTbWFsbEljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkibWFycV9wYWwxNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdG9vbC5zZXRMYXJnZUljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkibWFycV9wYWwyNC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZW50cmllcy5hZGQodG9vbCk7Ci0KLQkJdG9vbCA9IG5ldyBDb25uZWN0aW9uQ3JlYXRpb25Ub29sRW50cnkoCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9MaW5rX3RleHQsIERpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fTGlua190b29sdGlwLCAKLQkJCQludWxsLCBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImxpbmtfcGFsMTYuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImxpbmtfcGFsMjQuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKHRvb2wpOwotCQlDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSBjb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQsIAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdG9vbHRpcCwgCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuRlJFRV9URVhULCBmcmVlVHh0Tm9kZUNyZWF0aW9uRmFjdG9yeSwKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZyZWV0ZXh0X3BhbDE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmcmVldGV4dF9wYWwyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCVBhbGV0dGVTZXBhcmF0b3Igc2VwID0gbmV3IFBhbGV0dGVTZXBhcmF0b3IoCi0JCQkJR3JhcGhpY2FsV1BEZXBlbmRlbmN5RWRpdG9yLmNsYXNzLmdldE5hbWUoKSArICJzZXAxIik7IC8vJE5PTi1OTFMtMSQKLQkJc2VwCi0JCQkJLnNldFVzZXJNb2RpZmljYXRpb25QZXJtaXNzaW9uKFBhbGV0dGVFbnRyeS5QRVJNSVNTSU9OX05PX01PRElGSUNBVElPTik7Ci0JCWVudHJpZXMuYWRkKHNlcCk7IAotCi0JCWNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQsIAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3Rvb2x0aXAsIAotCQkJCVRlbXBsYXRlQ29uc3RhbnRzLldPUktfUFJPRFVDVCwgd3BOb2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZChjb21iaW5lZCk7Ci0JCWNvbnRyb2xHcm91cC5hZGRBbGwoZW50cmllcyk7Ci0JCXJldHVybiBjb250cm9sR3JvdXA7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXRQYXJ0RmFjdG9yeSBjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgV1BEaWFncmFtRWRpdFBhcnRGYWN0b3J5KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjcmVhdGVEaWFncmFtRWRpdFBhcnQoKQotCSAqLwotCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVEaWFncmFtRWRpdFBhcnQoKSB7Ci0JCSBEaWFncmFtRWRpdFBhcnQgZWRpdFBhcnQgPSBuZXcgRGlhZ3JhbUVkaXRQYXJ0KE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpKTsKLQkJIGVkaXRQYXJ0Lm1hcmtEaXJ0eSh0cnVlKTsKLQkJIHJldHVybiBlZGl0UGFydDsKLQl9Ci0JCi0vLwlwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoT2JqZWN0IGUpIHsKLS8vCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIGRpYWdyYW0gPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0vLwkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpOwotLy8JCWRpYWdyYW0uc2V0T2JqZWN0KGUpOwotLy8JCUVkaXRQYXJ0IHBhcnQgPSBuZXcgRGlhZ3JhbUVkaXRQYXJ0KGRpYWdyYW0pOwotLy8JCXBhcnQuc2V0TW9kZWwoZGlhZ3JhbSk7Ci0vLwkJZGlhZ3JhbS5hZGRDb25zdW1lcih0aGlzKTsKLS8vCQlyZXR1cm4gcGFydDsKLS8vCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydE5hbWVQcmVmaXgoKSB7Ci0JCXJldHVybiBEaWFncmFtVUlSZXNvdXJjZXMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV9wcmVmaXg7IAotCX0KLQotCS8qKgotCSAqIEFuIGVkaXRvciBpbnB1dCAKLQkgKgotCSAqCi0JICovCi0JLyoqCi0JICogQGF1dGhvciBzaGlscGF0Ci0JICoKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJRWRpdG9ySW5wdXQgewotCi0JCS8qKgotCQkgKiBAcGFyYW0gZQotCQkgKi8KLQkJcHVibGljIEVkaXRvcklucHV0KE1ldGhvZEVsZW1lbnQgZSkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2V4aXN0cygpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0SW1hZ2VEZXNjcmlwdG9yKCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0TmFtZSgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRQZXJzaXN0YWJsZSgpCi0JCSAqLwotCQlwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFRvb2xUaXBUZXh0KCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIHR5cGUpIHsKLQkJCS8vIGlmICh0eXBlLmVxdWFscyhJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpKSB7Ci0JCQkvLyByZXR1cm4gZ2V0UHJvcGVydHlTaGVldFBhZ2UoKTsKLQkJCS8vIH1lbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0vLwkJcHJpdmF0ZSBPYmplY3QgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7Ci0vLwotLy8JCQlpZiAocm9vdEVudHJ5ID09IG51bGwpIHsKLS8vCQkJCS8vIGNyZWF0ZSBhIG5ldyByb290Ci0vLwkJCQlQcm9wZXJ0eVNoZWV0RW50cnkgcm9vdCA9IG5ldyBQcm9wZXJ0eVNoZWV0RW50cnkoKTsKLS8vCQkJCXJvb3RFbnRyeSA9IHJvb3Q7Ci0vLwkJCX0KLS8vCQkJaWYgKHJvb3RFbnRyeSBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXRFbnRyeSkgewotLy8JCQkJLy8gPSB3cEVkaXRQYXJ0LmdldFZpZXdlcigpOwotLy8JCQkJLy8gSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gbmV3Ci0vLwkJCQkvLyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihXUCk7Ci0vLwkJCQkvLyAoKFByb3BlcnR5U2hlZXRFbnRyeSkgcm9vdEVudHJ5KS5zZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKCk7Ci0vLwkJCX0KLS8vCQkJcmV0dXJuIHJvb3RFbnRyeTsKLS8vCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFncmFtVHlwZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9HcmFwaGljYWxXb3JrZmxvd0VkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0dyYXBoaWNhbFdvcmtmbG93RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OGEzNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0dyYXBoaWNhbFdvcmtmbG93RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQWN0aXZpdHlEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5BY3Rpdml0eURpYWdyYW1FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuQ29ubmVjdGlvbkNyZWF0aW9uVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLk1hcnF1ZWVUb29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVTZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFubmluZ1NlbGVjdGlvblRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5Ub29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5HRUZBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotCi0KLS8qKgotICogQW4gZWRpdG9yIGZvciBncmFwaGljYWwgd29ya2Zsb3cKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoaWNhbFdvcmtmbG93RWRpdG9yIGV4dGVuZHMgQWJzdHJhY3REaWFncmFtRWRpdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX1dPUktGTE9XX0RFVEFJTF9ESUFHUkFNID0gIm9wZW5fd29ya2Zsb3dfZGV0YWlsX2RpYWdyYW0iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX1NUQVJUX05PREUgPSAiY3JlYXRlX3N0YXJ0X25vZGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0VORF9OT0RFID0gImNyZWF0ZV9lbmRfbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfU1lOQ19CQVIgPSAiY3JlYXRlX3N5bmNfYmFyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9ERUNJU0lPTl9CQVIgPSAiY3JlYXRlX2RlY2lzaW9uX2JhciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfQUNUSVZJVFkgPSAiY3JlYXRlX2FjdGl2aXR5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9QSEFTRSA9ICJjcmVhdGVfcGhhc2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0lURVJBVElPTiA9ICJjcmVhdGVfaXRlcmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9UQVNLX0RFU0NSSVBUT1IgPSAiY3JlYXRlX3Rhc2tfZGVzY3JpcHRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ3JlYXRpb25GYWN0b3J5IGFjdGl2aXR5Tm9kZUNyZWF0aW9uRmFjdG9yeTsKLQotCXByaXZhdGUgQ3JlYXRpb25GYWN0b3J5IHBoYXNlTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQotCXByaXZhdGUgQ3JlYXRpb25GYWN0b3J5IGl0ZXJhdGlvbk5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSBzeW5jaEJhckNyZWF0aW9uRmFjdG9yeTsKLQotCXByaXZhdGUgQ3JlYXRpb25GYWN0b3J5IGRlY2lzaW9uTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQotCXByaXZhdGUgQ3JlYXRpb25GYWN0b3J5IHN0YXJ0Tm9kZUNyZWF0aW9uRmFjdG9yeTsKLQotCXByaXZhdGUgQ3JlYXRpb25GYWN0b3J5IGVuZE5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSB0YXNrRGVzY3JpcHRvck5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNyZWF0aW9uRmFjdG9yaWVzKCkgewotCQlzdXBlci5pbml0aWFsaXplQ3JlYXRpb25GYWN0b3JpZXMoKTsKLQotCQlpZiAoYWN0aXZpdHlOb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCQlhY3Rpdml0eU5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCS8vIEFjdGl2aXR5Tm9kZSBub2RlID0KLQkJCQkJLy8gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eU5vZGUoKTsKLQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpOwotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJbm9kZS5zZXRVTUFEaWFncmFtKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQkJbm9kZS5zZXREaWFncmFtKGRpYWdyYW0pOwotCQkJCQlub2RlLnNldE9iamVjdChVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eSgpKTsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRPYmplY3RUeXBlKCkgewotCQkJCQlyZXR1cm4gVGVtcGxhdGVDb25zdGFudHMuQUNUSVZJVFk7Ci0JCQkJfQotCi0JCQl9OwotCQlDcmVhdGlvbkZhY3RvcnkgY3JlYXRpb25GYWN0b3J5ID0gYWN0aXZpdHlOb2RlQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCi0JCWlmIChwaGFzZU5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJCXBoYXNlTm9kZUNyZWF0aW9uRmFjdG9yeSA9IG5ldyBDcmVhdGlvbkZhY3RvcnkoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpIHsKLQkJCQkJLy8gQWN0aXZpdHlOb2RlIG5vZGUgPQotCQkJCQkvLyBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5Tm9kZSgpOwotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKCk7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlub2RlLnNldFVNQURpYWdyYW0oZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJCQlub2RlLnNldERpYWdyYW0oZGlhZ3JhbSk7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBoYXNlKCkpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5QSEFTRTsKLQkJCQl9Ci0KLQkJCX07Ci0JCWNyZWF0aW9uRmFjdG9yeSA9IHBoYXNlTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQotCQlpZiAoaXRlcmF0aW9uTm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkJaXRlcmF0aW9uTm9kZUNyZWF0aW9uRmFjdG9yeSA9IG5ldyBDcmVhdGlvbkZhY3RvcnkoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpIHsKLQkJCQkJLy8gQWN0aXZpdHlOb2RlIG5vZGUgPQotCQkJCQkvLyBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5Tm9kZSgpOwotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKCk7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlub2RlLnNldFVNQURpYWdyYW0oZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJCQlub2RlLnNldERpYWdyYW0oZGlhZ3JhbSk7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUl0ZXJhdGlvbigpKTsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRPYmplY3RUeXBlKCkgewotCQkJCQlyZXR1cm4gVGVtcGxhdGVDb25zdGFudHMuSVRFUkFUSU9OOwotCQkJCX0KLQotCQkJfTsKLQkJY3JlYXRpb25GYWN0b3J5ID0gaXRlcmF0aW9uTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQotCQlpZiAoc3luY2hCYXJDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJCXN5bmNoQmFyQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQlUeXBlZE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHlwZWROb2RlKCk7Ci0JCQkJCW5vZGUuc2V0VHlwZShUeXBlZE5vZGUuU1lOQ0hfQkFSKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCS5uZXdUeXBlZEdyYXBoTm9kZShUeXBlZE5vZGUuU1lOQ0hfQkFSKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLlNZTkNIX0JBUjsKLQkJCQl9Ci0KLQkJCX07Ci0JCWNyZWF0aW9uRmFjdG9yeSA9IHN5bmNoQmFyQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCi0JCWlmIChkZWNpc2lvbk5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJCWRlY2lzaW9uTm9kZUNyZWF0aW9uRmFjdG9yeSA9IG5ldyBDcmVhdGlvbkZhY3RvcnkoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpIHsKLQkJCQkJVHlwZWROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVR5cGVkTm9kZSgpOwotCQkJCQlub2RlLnNldFR5cGUoVHlwZWROb2RlLkRFQ0lTSU9OKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCS5uZXdUeXBlZEdyYXBoTm9kZShUeXBlZE5vZGUuREVDSVNJT04pKTsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRPYmplY3RUeXBlKCkgewotCQkJCQlyZXR1cm4gVGVtcGxhdGVDb25zdGFudHMuREVDSVNJT05fTk9ERTsKLQkJCQl9Ci0KLQkJCX07Ci0JCWNyZWF0aW9uRmFjdG9yeSA9IGRlY2lzaW9uTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQotCQlpZiAoc3RhcnROb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCQlzdGFydE5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCVR5cGVkTm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUeXBlZE5vZGUoKTsKLQkJCQkJbm9kZS5zZXRUeXBlKFR5cGVkTm9kZS5TVEFSVCk7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkubmV3VHlwZWRHcmFwaE5vZGUoVHlwZWROb2RlLlNUQVJUKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLlNUQVJUX05PREU7Ci0JCQkJfQotCi0JCQl9OwotCQljcmVhdGlvbkZhY3RvcnkgPSBzdGFydE5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQkJaWYgKGVuZE5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJCWVuZE5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCVR5cGVkTm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUeXBlZE5vZGUoKTsKLQkJCQkJbm9kZS5zZXRUeXBlKFR5cGVkTm9kZS5FTkQpOwotCQkJCQlub2RlLnNldE9iamVjdChHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJLm5ld1R5cGVkR3JhcGhOb2RlKFR5cGVkTm9kZS5FTkQpKTsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRPYmplY3RUeXBlKCkgewotCQkJCQlyZXR1cm4gVGVtcGxhdGVDb25zdGFudHMuRU5EX05PREU7Ci0JCQkJfQotCi0JCQl9OwotCQljcmVhdGlvbkZhY3RvcnkgPSBlbmROb2RlQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCi0JCWlmICh0YXNrRGVzY3JpcHRvck5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJCXRhc2tEZXNjcmlwdG9yTm9kZUNyZWF0aW9uRmFjdG9yeSA9IG5ldyBDcmVhdGlvbkZhY3RvcnkoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpIHsKLQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpOwotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJbm9kZS5zZXRVTUFEaWFncmFtKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQkJbm9kZS5zZXREaWFncmFtKGRpYWdyYW0pOwotCQkJCQlub2RlLnNldE9iamVjdChVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrRGVzY3JpcHRvcigpKTsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRPYmplY3RUeXBlKCkgewotCQkJCQlyZXR1cm4gVGVtcGxhdGVDb25zdGFudHMuVEFTS19ERVNDUklQVE9SOwotCQkJCX0KLQotCQkJfTsKLQkJY3JlYXRpb25GYWN0b3J5ID0gdGFza0Rlc2NyaXB0b3JOb2RlQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KG1lbnUpOwotCi0JCWJvb2xlYW4gY2FuTW9kaWZ5ID0gIWlzUmVhZE9ubHkoKTsKLQotCQltZW51Lmluc2VydEFmdGVyKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIG5ldyBTZXBhcmF0b3IoCi0JCQkJR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCi0JCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJT1BFTl9XT1JLRkxPV19ERVRBSUxfRElBR1JBTSk7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQl9Ci0JCW1lbnUuaW5zZXJ0QWZ0ZXIoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgbmV3IFNlcGFyYXRvcigKLQkJCQlHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0KLQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX1NUQVJUX05PREUpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQotCQkvLyBhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfRlJFRV9URVhUKTsKLQkJLy8gaWYoYWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCS8vIG1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQkvLyB9Ci0KLQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX1NZTkNfQkFSKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQl9Ci0KLQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0RFQ0lTSU9OX0JBUik7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJfQotCi0JCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9FTkRfTk9ERSk7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJfQotCQltZW51Lmluc2VydEFmdGVyKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIG5ldyBTZXBhcmF0b3IoCi0JCQkJR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCi0JCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9BQ1RJVklUWSk7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJfQotCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfSVRFUkFUSU9OKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQl9Ci0KLQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX1BIQVNFKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQl9Ci0KLQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX1RBU0tfREVTQ1JJUFRPUik7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLQotCQkvLyBPcGVuIHdvcmtmbG93IGRldGFpbCBhY3Rpb24KLQkJLy8KLQkJSUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0KSB7IAotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gT1BFTl9XT1JLRkxPV19ERVRBSUxfRElBR1JBTTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlFZGl0UGFydCBzZWxlY3RlZEVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkJCQkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKS5nZXQoMCk7Ci0JCQkJCQlJRWRpdG9yUGFydCBwYXJlbnQgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpCi0JCQkJCQkJCS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IuRWRpdG9ySW5wdXQoCi0JCQkJCQkJCShNZXRob2RFbGVtZW50KSAoKE5vZGUpIHNlbGVjdGVkRWRpdFBhcnQKLQkJCQkJCQkJCQkuZ2V0TW9kZWwoKSkuZ2V0T2JqZWN0KCksCi0JCQkJCQkJCSgoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKSkKLQkJCQkJCQkJCQkuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJCQlJRWRpdG9yUGFydCBwYXJ0ID0gZ2V0U2l0ZSgpCi0JCQkJCQkJCS5nZXRQYWdlKCkKLQkJCQkJCQkJLm9wZW5FZGl0b3IoCi0JCQkJCQkJCQkJaW5wdXQsCi0JCQkJCQkJCQkJUHJvY2Vzc0VkaXRvci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9FRElUT1JfSUQpOwotCQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHsKLQkJCQkJCQlBYnN0cmFjdERpYWdyYW1FZGl0b3IgZWRpdG9yID0gKEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgcGFydDsKLQkJCQkJCQllZGl0b3Iuc2V0UGFyZW50RWRpdG9yKHBhcmVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpICE9IDEpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJCQlyZXR1cm4gKGVkaXRQYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgJiYgKChMaW5rZWRPYmplY3QpIGVkaXRQYXJ0Ci0JCQkJCQkuZ2V0TW9kZWwoKSkuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBBY3Rpdml0eSk7Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQkvLyBJQWN0aW9uIHN0YXJ0Tm9kZUFjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbVVJUmVzb3VyY2VzLgotCQkvLyBnZXRTdHJpbmcoIkRpYWdyYW1VSS5BY3Rpdml0eURpYWdyYW0uU3RhcnROb2RlLnRleHQiKSl7IC8vJE5PTi1OTFMtMSQKLQkJLy8JCQkKLQkJLy8gcHVibGljIHZvaWQgcnVuKCl7Ci0JCS8vIENyZWF0ZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBDcmVhdGVSZXF1ZXN0KCk7Ci0JCS8vIC8vQ3JlYXRpb25GYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KHRlbXBsYXRlKTsKLQkJLy8gaWYgKHN0YXJ0Tm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkvLyByZXR1cm47Ci0JCS8vIHJlcXVlc3Quc2V0RmFjdG9yeShzdGFydE5vZGVDcmVhdGlvbkZhY3RvcnkpOwotCQkvLyByZXF1ZXN0LnNldExvY2F0aW9uKG5ldyBQb2ludCgxMCwxMCkpOwotCQkvLwkJCQkKLQkJLy8gaWYgKHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCS8vIFBvaW50IGxvYyA9IHJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLQkJLy8gLy8oKEdyYXBoaWNhbEVkaXRQYXJ0KWdldEhvc3QoKSkuZ2V0RmlndXJlKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShsb2MpOwotCQkvLyBEaWFncmFtIHBhcmVudCA9IChEaWFncmFtKWVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCS8vIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcKLQkJLy8gQ3JlYXRlTm9kZUNvbW1hbmQoKE5vZGUpcmVxdWVzdC5nZXROZXdPYmplY3QoKSwKLQkJLy8gcGFyZW50LCBsb2MpOwotCQkvLyBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gcHVibGljIFN0cmluZyBnZXRJZCgpewotCQkvLyByZXR1cm4gQ1JFQVRFX1NUQVJUX05PREU7Ci0JCS8vIH0KLQkJLy8gcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCl7Ci0JCS8vIHJldHVybiB0cnVlOwotCQkvLyB9Ci0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCS8vIHJldHVybgotCQkvLyBEaWFncmFtVUlSZXNvdXJjZXMuZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWN0aXZpdHlEaWFncmFtLlN0YXJ0Tm9kZS50b29sdGlwIik7Ci0JCS8vIH0KLQkJLy8JCQkKLQkJLy8gfTsKLQkJLy8gZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihzdGFydE5vZGVBY3Rpb24pOwotCQkvLwkJCi0JCS8vCQkKLQkJLy8gSUFjdGlvbiBlbmROb2RlQWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtVUlSZXNvdXJjZXMuCi0JCS8vIGdldFN0cmluZygiRGlhZ3JhbVVJLkFjdGl2aXR5RGlhZ3JhbS5FbmROb2RlLnRleHQiKSl7IC8vJE5PTi1OTFMtMSQKLQkJLy8JCQkKLQkJLy8gcHVibGljIHZvaWQgcnVuKCl7Ci0JCS8vIENyZWF0ZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBDcmVhdGVSZXF1ZXN0KCk7Ci0JCS8vIGlmIChlbmROb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCS8vIHJldHVybjsKLQkJLy8gcmVxdWVzdC5zZXRGYWN0b3J5KGVuZE5vZGVDcmVhdGlvbkZhY3RvcnkpOwotCQkvLyByZXF1ZXN0LnNldExvY2F0aW9uKG5ldyBQb2ludCgxMCwxMCkpOwotCQkvLwkJCQkKLQkJLy8gaWYgKHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCS8vIFBvaW50IGxvYyA9IHJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLQkJLy8gRGlhZ3JhbSBwYXJlbnQgPSAoRGlhZ3JhbSllZGl0UGFydC5nZXRNb2RlbCgpOwotCQkvLyBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3Ci0JCS8vIENyZWF0ZU5vZGVDb21tYW5kKChOb2RlKXJlcXVlc3QuZ2V0TmV3T2JqZWN0KCksCi0JCS8vIHBhcmVudCwgbG9jKTsKLQkJLy8gZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKXsKLQkJLy8gcmV0dXJuIENSRUFURV9FTkRfTk9ERTsKLQkJLy8gfQotCQkvLyBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKXsKLQkJLy8gcmV0dXJuIHRydWU7Ci0JCS8vIH0KLQkJLy8gcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJLy8gcmV0dXJuCi0JCS8vIERpYWdyYW1VSVJlc291cmNlcy5nZXRTdHJpbmcoIkRpYWdyYW1VSS5BY3Rpdml0eURpYWdyYW0uRW5kTm9kZS50b29sdGlwIik7Ci0JCS8vIH0KLQkJLy8gfTsKLQkJLy8gZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihlbmROb2RlQWN0aW9uKTsKLQkJLy8JCQotCQkvLyBJQWN0aW9uIHN5bmNCYXJBY3Rpb24gPSBuZXcgQWN0aW9uKERpYWdyYW1VSVJlc291cmNlcy4KLQkJLy8gZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWN0aXZpdHlEaWFncmFtLlN5bmNCYXIudGV4dCIpKXsgLy8kTk9OLU5MUy0xJAotCQkvLwkJCQotCQkvLyBwdWJsaWMgdm9pZCBydW4oKXsKLQkJLy8gQ3JlYXRlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IENyZWF0ZVJlcXVlc3QoKTsKLQkJLy8gLy9DcmVhdGlvbkZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkodGVtcGxhdGUpOwotCQkvLyBpZiAoc3luY2hCYXJDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJLy8gcmV0dXJuOwotCQkvLyByZXF1ZXN0LnNldEZhY3Rvcnkoc3luY2hCYXJDcmVhdGlvbkZhY3RvcnkpOwotCQkvLyByZXF1ZXN0LnNldExvY2F0aW9uKG5ldyBQb2ludCgxMCwxMCkpOwotCQkvLwkJCQkKLQkJLy8gaWYgKHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCS8vIFBvaW50IGxvYyA9IHJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLQkJLy8gLy8oKEdyYXBoaWNhbEVkaXRQYXJ0KWdldEhvc3QoKSkuZ2V0RmlndXJlKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShsb2MpOwotCQkvLyBEaWFncmFtIHBhcmVudCA9IChEaWFncmFtKWVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCS8vIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcKLQkJLy8gQ3JlYXRlTm9kZUNvbW1hbmQoKE5vZGUpcmVxdWVzdC5nZXROZXdPYmplY3QoKSwKLQkJLy8gcGFyZW50LCBsb2MpOwotCQkvLyBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gcHVibGljIFN0cmluZyBnZXRJZCgpewotCQkvLyByZXR1cm4gQ1JFQVRFX1NZTkNfQkFSOwotCQkvLyB9Ci0JCS8vIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpewotCQkvLyByZXR1cm4gdHJ1ZTsKLQkJLy8gfQotCQkvLyBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQkvLyByZXR1cm4KLQkJLy8gRGlhZ3JhbVVJUmVzb3VyY2VzLmdldFN0cmluZygiRGlhZ3JhbVVJLkFjdGl2aXR5RGlhZ3JhbS5TeW5jQmFyLnRvb2x0aXAiKTsKLQkJLy8gfQotCQkvLwkJCQotCQkvLyB9OwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHN5bmNCYXJBY3Rpb24pOwotCQkvLwkJCi0JCS8vCQkKLQkJLy8gSUFjdGlvbiBkZWNpc2lvbkJhckFjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbVVJUmVzb3VyY2VzLgotCQkvLyBnZXRTdHJpbmcoIkRpYWdyYW1VSS5BY3Rpdml0eURpYWdyYW0uRGVjaXNpb25CYXIudGV4dCIpKXsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQkvLwkJCQotCQkvLyBwdWJsaWMgdm9pZCBydW4oKXsKLQkJLy8gQ3JlYXRlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IENyZWF0ZVJlcXVlc3QoKTsKLQkJLy8gLy9DcmVhdGlvbkZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkodGVtcGxhdGUpOwotCQkvLyBpZiAoZGVjaXNpb25Ob2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCS8vIHJldHVybjsKLQkJLy8gcmVxdWVzdC5zZXRGYWN0b3J5KGRlY2lzaW9uTm9kZUNyZWF0aW9uRmFjdG9yeSk7Ci0JCS8vIHJlcXVlc3Quc2V0TG9jYXRpb24obmV3IFBvaW50KDEwLDEwKSk7Ci0JCS8vCQkJCQotCQkvLyBpZiAocmVxdWVzdC5nZXROZXdPYmplY3QoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJLy8gUG9pbnQgbG9jID0gcmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCQkvLyAvLygoR3JhcGhpY2FsRWRpdFBhcnQpZ2V0SG9zdCgpKS5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGxvYyk7Ci0JCS8vIERpYWdyYW0gcGFyZW50ID0gKERpYWdyYW0pZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJLy8gb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldwotCQkvLyBDcmVhdGVOb2RlQ29tbWFuZCgoTm9kZSlyZXF1ZXN0LmdldE5ld09iamVjdCgpLAotCQkvLyBwYXJlbnQsIGxvYyk7Ci0JCS8vIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBwdWJsaWMgU3RyaW5nIGdldElkKCl7Ci0JCS8vIHJldHVybiBDUkVBVEVfREVDSVNJT05fQkFSOwotCQkvLyB9Ci0JCS8vIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpewotCQkvLyByZXR1cm4gdHJ1ZTsKLQkJLy8gfQotCQkvLyBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQkvLyByZXR1cm4KLQkJLy8gRGlhZ3JhbVVJUmVzb3VyY2VzLmdldFN0cmluZygiRGlhZ3JhbVVJLkFjdGl2aXR5RGlhZ3JhbS5EZWNpc2lvbkJhci50b29sdGlwIik7Ci0JCS8vIH0KLQkJLy8JCQkKLQkJLy8gfTsKLQkJLy8gZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihkZWNpc2lvbkJhckFjdGlvbik7Ci0KLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdGV4dCwgc3RhcnROb2RlQ3JlYXRpb25GYWN0b3J5LCAKLQkJCQlDUkVBVEVfU1RBUlRfTk9ERSwKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90b29sdGlwLCAKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJInN0bm9kZV9wYWwxNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dCwgZnJlZVR4dE5vZGVDcmVhdGlvbkZhY3RvcnksIAotCQkJCUNSRUFURV9GUkVFX1RFWFQsCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwLCAKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZyZWV0ZXh0X3BhbDE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3RleHQsIHN5bmNoQmFyQ3JlYXRpb25GYWN0b3J5LCAKLQkJCQlDUkVBVEVfU1lOQ19CQVIsIERpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90b29sdGlwCi0JCQkJLCBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJInN5bmNiYXJfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90ZXh0LCBkZWNpc2lvbk5vZGVDcmVhdGlvbkZhY3RvcnksIAotCQkJCUNSRUFURV9ERUNJU0lPTl9CQVIsCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdG9vbHRpcAotCQkJCSwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJkZWNub2RlX3BhbDE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3RleHQsIGVuZE5vZGVDcmVhdGlvbkZhY3RvcnksIAotCQkJCUNSRUFURV9FTkRfTk9ERSwgRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3Rvb2x0aXAKLQkJCQksIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZW5kbm9kZV9wYWwxNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dCwgYWN0aXZpdHlOb2RlQ3JlYXRpb25GYWN0b3J5LCAKLQkJCQlDUkVBVEVfQUNUSVZJVFksCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90b29sdGlwCi0JCQkJLCBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImFjdGl2aXR5MTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0LCBpdGVyYXRpb25Ob2RlQ3JlYXRpb25GYWN0b3J5LCAKLQkJCQlDUkVBVEVfSVRFUkFUSU9OLAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3Rvb2x0aXAKLQkJCQksIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiSXRlcmF0aW9uMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BoYXNlX3RleHQsIHBoYXNlTm9kZUNyZWF0aW9uRmFjdG9yeSwgCi0JCQkJQ1JFQVRFX1BIQVNFLCBEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BoYXNlX3Rvb2x0aXAKLQkJCQksIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiUGhhc2UxNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdGV4dCwgdGFza0Rlc2NyaXB0b3JOb2RlQ3JlYXRpb25GYWN0b3J5LCAKLQkJCQlDUkVBVEVfVEFTS19ERVNDUklQVE9SLAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdG9vbHRpcAotCQkJCSwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJUYXNrRGVzY3JpcHRvci5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURvdWJsZUNsaWNrKEV2ZW50IGV2ZW50KSB7Ci0JCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQotCQkvLyBkbyBub3RoaW5nIGlmIDAgb3IgbW9yZSB0aGFuIDEgZWRpdCBwYXJ0cyBhcmUgc2VsZWN0ZWQKLQkJLy8KLQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgIT0gMSkKLQkJCXJldHVybjsKLQotCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIG5vZGUgPSBudWxsOwotCQlpZiAoZWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZQotCQkJCSYmIChub2RlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgZWRpdFBhcnQuZ2V0TW9kZWwoKSkuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJLy8gb3BlbiBhY3Rpdml0eSBkaWFncmFtIG9mIHRoZSBzZWxlY3RlZCBhY3Rpdml0eSBpbiBhIG5ldyBlZGl0b3IKLQkJCS8vCi0JCQl0cnkgewotCQkJCXRyeSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IChCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpIGdldEVkaXRvcklucHV0KCk7Ci0JCQkJCU9iamVjdCBvYmplY3QgPSBub2RlLmlzUmVhZE9ubHkoKSA/IG5vZGUuZ2V0V3JhcHBlcigpIDogbm9kZS5nZXRPYmplY3QoKTsKLQkJCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IEVkaXRvcklucHV0KG9iamVjdCwgZWRpdG9ySW5wdXQuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJCUlFZGl0b3JQYXJ0IHBhcmVudCA9IGdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJCUlFZGl0b3JQYXJ0IHBhcnQgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpLm9wZW5FZGl0b3IoaW5wdXQsCi0JCQkJCQkJUHJvY2Vzc0VkaXRvci5XT1JLRkxPV19FRElUT1JfSUQpOwotCQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCQkJQWJzdHJhY3REaWFncmFtRWRpdG9yIGVkaXRvciA9IChBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHBhcnQ7Ci0JCQkJCQllZGl0b3Iuc2V0UGFyZW50RWRpdG9yKHBhcmVudCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgUGFsZXR0ZUNvbnRhaW5lciBjcmVhdGVDb250cm9sR3JvdXAoUGFsZXR0ZVJvb3Qgcm9vdCkgewotCQlpbml0aWFsaXplQ3JlYXRpb25GYWN0b3JpZXMoKTsKLQotCQlQYWxldHRlR3JvdXAgY29udHJvbEdyb3VwID0gbmV3IFBhbGV0dGVHcm91cCgiQ29udHJvbCBHcm91cCIpOyAvLyROT04tTkxTLTEkCi0KLQkJTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVRvb2xFbnRyeSB0b29sID0gbmV3IFBhbm5pbmdTZWxlY3Rpb25Ub29sRW50cnkoRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdG9vbHRpcAotCQkpOwotCQl0b29sLnNldFNtYWxsSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJzZWxlY3RfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXRvb2wuc2V0TGFyZ2VJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJInNlbGVjdF9wYWwyNC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZW50cmllcy5hZGQodG9vbCk7Ci0JCXJvb3Quc2V0RGVmYXVsdEVudHJ5KHRvb2wpOwotCi0JCXRvb2wgPSBuZXcgTWFycXVlZVRvb2xFbnRyeSgpOwotCQl0b29sLnNldFNtYWxsSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJtYXJxX3BhbDE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0b29sLnNldExhcmdlSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJtYXJxX3BhbDI0LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyaWVzLmFkZCh0b29sKTsKLQotCQl0b29sID0gbmV3IENvbm5lY3Rpb25DcmVhdGlvblRvb2xFbnRyeShEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0xpbmtfdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9MaW5rX3Rvb2x0aXAsIAotCQkJCW51bGwsIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkibGlua19wYWwxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkibGlua19wYWwyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQodG9vbCk7Ci0KLQkJQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnkgY29tYmluZWQgPSBuZXcgQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnkoCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdG9vbHRpcCwgCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuU1RBUlRfTk9ERSwgc3RhcnROb2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkic3Rub2RlX3BhbDE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJzdG5vZGVfcGFsMjQuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKGNvbWJpbmVkKTsKLQotCQljb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQsIAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdG9vbHRpcCwgCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuRlJFRV9URVhULCBmcmVlVHh0Tm9kZUNyZWF0aW9uRmFjdG9yeSwKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZyZWV0ZXh0X3BhbDE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmcmVldGV4dF9wYWwyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90ZXh0LCAKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdG9vbHRpcCwgCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuU1lOQ0hfQkFSLCBzeW5jaEJhckNyZWF0aW9uRmFjdG9yeSwKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJInN5bmNiYXJfcGFsMTYuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJInN5bmNiYXJfcGFsMjQuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKGNvbWJpbmVkKTsKLQotCQljb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90ZXh0LCAKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90b29sdGlwLCAKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5ERUNJU0lPTl9OT0RFLCBkZWNpc2lvbk5vZGVDcmVhdGlvbkZhY3RvcnksCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJkZWNub2RlX3BhbDE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJkZWNub2RlX3BhbDI0LmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZChjb21iaW5lZCk7Ci0KLQkJY29tYmluZWQgPSBuZXcgQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnkoCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3RleHQsIAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90b29sdGlwLCAKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5FTkRfTk9ERSwgZW5kTm9kZUNyZWF0aW9uRmFjdG9yeSwKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImVuZG5vZGVfcGFsMTYuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImVuZG5vZGVfcGFsMjQuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKGNvbWJpbmVkKTsKLQotCQlQYWxldHRlU2VwYXJhdG9yIHNlcCA9IG5ldyBQYWxldHRlU2VwYXJhdG9yKAotCQkJCUdyYXBoaWNhbFdvcmtmbG93RWRpdG9yLmNsYXNzLmdldE5hbWUoKSArICJzZXAxIik7IC8vJE5PTi1OTFMtMSQKLQkJc2VwCi0JCQkJLnNldFVzZXJNb2RpZmljYXRpb25QZXJtaXNzaW9uKFBhbGV0dGVFbnRyeS5QRVJNSVNTSU9OX05PX01PRElGSUNBVElPTik7Ci0JCWVudHJpZXMuYWRkKHNlcCk7IAotCi0JCWNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90b29sdGlwLCAKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5BQ1RJVklUWSwgYWN0aXZpdHlOb2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiYWN0aXZpdHkxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiYWN0aXZpdHkyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQsIAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3Rvb2x0aXAsIAotCQkJCVRlbXBsYXRlQ29uc3RhbnRzLklURVJBVElPTiwgaXRlcmF0aW9uTm9kZUNyZWF0aW9uRmFjdG9yeSwKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJIkl0ZXJhdGlvbjE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJhY3Rpdml0eTI0LmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZChjb21iaW5lZCk7Ci0KLQkJY29tYmluZWQgPSBuZXcgQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnkoRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXh0LCAKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BoYXNlX3Rvb2x0aXAsIAotCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBIQVNFLCBwaGFzZU5vZGVDcmVhdGlvbkZhY3RvcnksCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJQaGFzZTE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJhY3Rpdml0eTI0LmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZChjb21iaW5lZCk7Ci0KLQkJY29tYmluZWQgPSBuZXcgQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnkoCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90ZXh0LCAKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3Rvb2x0aXAsIAotCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlRBU0tfREVTQ1JJUFRPUiwKLQkJCQl0YXNrRGVzY3JpcHRvck5vZGVDcmVhdGlvbkZhY3RvcnksIEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigiVGFza0Rlc2NyaXB0b3IuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImFjdGl2aXR5MjQuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKGNvbWJpbmVkKTsKLQotCQljb250cm9sR3JvdXAuYWRkQWxsKGVudHJpZXMpOwotCQlyZXR1cm4gY29udHJvbEdyb3VwOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydE5hbWVQcmVmaXgoKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpKQotCQkJCS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXJldHVybiBnZXRUeXBlTmFtZSgoQWN0aXZpdHkpIGUpICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yI2NyZWF0ZURpYWdyYW1FZGl0UGFydCgpCi0JICovCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZURpYWdyYW1FZGl0UGFydCgpIHsKLQkJQWN0aXZpdHlEaWFncmFtRWRpdFBhcnQgYWRFZGl0UGFydCA9IG5ldyBBY3Rpdml0eURpYWdyYW1FZGl0UGFydChNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUFjdGl2aXR5RGlhZ3JhbSgpKTsKLQkJYWRFZGl0UGFydC5tYXJrRGlydHkodHJ1ZSk7Ci0JCXJldHVybiBhZEVkaXRQYXJ0OwotCX0KLQotLy8JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KE9iamVjdCBlKSB7Ci0vLwkJQWN0aXZpdHlEaWFncmFtIGRpYWdyYW0gPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0vLwkJCQkuY3JlYXRlQWN0aXZpdHlEaWFncmFtKCk7Ci0vLwkJZGlhZ3JhbS5zZXRPYmplY3QoZSk7Ci0vLwkJRWRpdFBhcnQgcGFydCA9IG5ldyBBY3Rpdml0eURpYWdyYW1FZGl0UGFydChkaWFncmFtKTsKLS8vCQlwYXJ0LnNldE1vZGVsKGRpYWdyYW0pOwotLy8JCWRpYWdyYW0uYWRkQ29uc3VtZXIodGhpcyk7Ci0vLwkJcmV0dXJuIHBhcnQ7Ci0vLwl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoQWN0aXZpdHkgYWN0KSB7Ci0JCWlmIChhY3QgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCXJldHVybiBEaWFncmFtVUlSZXNvdXJjZXMuQWN0dml0aXZpdHlEaWFncmFtX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0OyAKLQkJfSBlbHNlIGlmIChhY3QgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJcmV0dXJuIERpYWdyYW1VSVJlc291cmNlcy5BY3R2aXRpdml0eURpYWdyYW1fQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dDsgCi0JCX0gZWxzZSBpZiAoYWN0IGluc3RhbmNlb2YgUGhhc2UpIHsKLQkJCXJldHVybiBEaWFncmFtVUlSZXNvdXJjZXMuQWN0dml0aXZpdHlEaWFncmFtX1BoYXNlX3RleDsgCi0JCX0gZWxzZSBpZiAoYWN0IGluc3RhbmNlb2YgSXRlcmF0aW9uKSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dDsgCi0JCX0KLQkJcmV0dXJuIERpYWdyYW1VSVJlc291cmNlcy5BY3R2aXRpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dDsgCi0JfQotCi0vLwlwcml2YXRlIHN0YXRpYyBJbWFnZSBnZXRUeXBlSW1hZ2UoT2JqZWN0IG9iamVjdCkgewotLy8JCUlJdGVtTGFiZWxQcm92aWRlciBhZGFwdGVyID0gKElJdGVtTGFiZWxQcm92aWRlcikgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLS8vCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KG9iamVjdCwKLS8vCQkJCQkJSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLS8vCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0vLwkJCS8vIHJldHVybiBuZXcgSW1hZ2UoRGlzcGxheS5nZXRDdXJyZW50KCksCi0vLwkJCS8vICgoVVJMKWFkYXB0ZXIuZ2V0SW1hZ2Uob2JqZWN0KSkuZ2V0Q29udGVudCgpKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIG51bGw7Ci0vLwl9Ci0KLQkvKioKLQkgKiBBbiBlZGl0b3IgaW5wdXQgZm9yIGdyYWhpY2FsIHdvcmtmbG93IGVkaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRWRpdG9ySW5wdXQgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgewotCi0JCS8qKgotCQkgKiBAcGFyYW0gZQotCQkgKi8KLQkJcHVibGljIEVkaXRvcklucHV0KE9iamVjdCBlLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQkJc3VwZXIoZSwgc3VwcHJlc3Npb24pOwotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3IjY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgRWRpdFBhcnRGYWN0b3J5IGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eURpYWdyYW1FZGl0UGFydEZhY3RvcnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWdyYW1UeXBlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0lFZGl0b3JLZWVwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9JRWRpdG9yS2VlcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2OTc2ODUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0lFZGl0b3JLZWVwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2Ugd2hpY2ggbWFuYWdlcyBvcGVuaW5nL2Nsb3Npbmcgb2YgYW4gZWRpdG9yCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVkaXRvcktlZXBlciB7Ci0KLQkvKioKLQkgKiBSZWZlcmVuY2UgY2xhc3MgZm9yIGVkaXRvciBrZWVwZXIKLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUmVmZXJlbmNlIHsKLQkJcHJpdmF0ZSBJRWRpdG9yS2VlcGVyIGVkaXRvcktlZXBlcjsKLQotCQlwcml2YXRlIFJlZmVyZW5jZSgpIHsKLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0RWRpdG9yS2VlcGVyKElFZGl0b3JLZWVwZXIgZWRpdG9yS2VlcGVyKSB7Ci0JCQl0aGlzLmVkaXRvcktlZXBlciA9IGVkaXRvcktlZXBlcjsKLQkJfQotCi0JCXB1YmxpYyBJRWRpdG9yS2VlcGVyIGdldEVkaXRvcktlZXBlcigpIHsKLQkJCXJldHVybiBlZGl0b3JLZWVwZXI7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJlZmVyZW5jZSBSRUZFUkVOQ0UgPSBuZXcgUmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBPcGVuIGFuIGVkaXRvciBmb3IgdGhlIGdpdmVuIGVsZW1lbnQKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICovCi0Jdm9pZCBvcGVuRWRpdG9yKE9iamVjdCBvYmplY3QpOwotCi0JLyoqCi0JICogQ2xvc2VzIGFuIG9wZW4gZWRpdG9yIGlmIGVsZW1lbnQgaXMgZGVsZXRlZAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKi8KLQl2b2lkIGNsb3NlRWRpdG9yc09uRGVsZXRpb24oT2JqZWN0IG9iamVjdCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RFbGVtZW50RWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kRWxlbWVudEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmMxMzRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RFbGVtZW50RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWYWxpZGF0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkNoZWNrbGlzdEl0ZW1zUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkNvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQ29udGVudFBhY2thZ2VEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5DdXN0b21DYXRlZ29yeUFzc2lnblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5DdXN0b21DYXRlZ29yeURlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRpc2NpcGxpbmVEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EaXNjaXBsaW5lR3JvdXBpbmdEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGlzY2lwbGluZVRhc2tzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRvbWFpbkRlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRvbWFpbldvcmtQcm9kdWN0c1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuSUV4dGVuc2lvbkZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuSVJlZnJlc2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5NZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5QcmFjdGljZURlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlByYWN0aWNlUmVmZXJlbmNlc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Sb2xlQ2F0ZWdvcmllc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Sb2xlRGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUm9sZVNldERlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlJvbGVTZXRHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlJvbGVTZXRHcm91cGluZ1JvbGVTZXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUm9sZVNldFJvbGVzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlJvbGVXb3JrUHJvZHVjdHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuVGFza0NhdGVnb3JpZXNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuVGFza0Rlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlRhc2tSb2xlc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5UYXNrU3RlcHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuVGFza1dvcmtQcm9kdWN0c1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Ub29sRGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuVG9vbFRvb2xNZW50b3JzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLldvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Xb3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuV29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Xb3JrUHJvZHVjdFR5cGVEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Xb3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWwuTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWRpdG9yUGFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLk1ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5FbGVtZW50SFRNTFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuVmlld0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuUGVyc3BlY3RpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5zeW5jaC5JU3luY2hyb25pemF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLkxpYnJhcnlTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci0KLS8qKgotICogVGhlIE1ldGhvZCBFbGVtZW50IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRFZGl0b3IgZXh0ZW5kcyBBYnN0cmFjdEJhc2VGb3JtRWRpdG9yIGltcGxlbWVudHMKLQkJSVNlbGVjdGlvblByb3ZpZGVyLCBJR290b01hcmtlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFJlc291cmNlSW5mbyB7Ci0JCWxvbmcgbW9kaWZpY2F0aW9uU3RhbXA7Ci0JCWxvbmcgbG9hZFN0YW1wOwkJCi0JCWJvb2xlYW4gb3ZlcndyaXRlOwotCQlib29sZWFuIGFkanVzdExvY2F0aW9uOyAKLQkJCi0JCXByaXZhdGUgUmVzb3VyY2UgcmVzb3VyY2U7CQkKLQkJCi0JCVJlc291cmNlSW5mbyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOwotCQkJcmVmcmVzaCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQkJbW9kaWZpY2F0aW9uU3RhbXAgPSBJU3luY2hyb25pemF0aW9uSGVscGVyLklOU1RBTkNFLmdldE1vZGlmaWNhdGlvblN0YW1wKHJlc291cmNlKTsKLQkJCWlmKHJlc291cmNlIGluc3RhbmNlb2YgSUxpYnJhcnlSZXNvdXJjZSkgewotCQkJCWxvYWRTdGFtcCA9ICgoSUxpYnJhcnlSZXNvdXJjZSlyZXNvdXJjZSkuZ2V0TG9hZFN0YW1wKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlsb2FkU3RhbXAgPSBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGUgZWRpdG9yIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9JRCA9IE1ldGhvZEVsZW1lbnRFZGl0b3IuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJvdGVjdGVkIGludCBwcmV2aWV3X3BhZ2VfaW5kZXggPSAtMTsKLQotCXByb3RlY3RlZCBFbGVtZW50SFRNTFZpZXdlciBwcmV2aWV3ZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgZWxlbWVudE9iaiA9IG51bGw7Ci0KLQkvLyBUaGUgcmljaCB0ZXh0IGNvbnRyb2wgb3IgZWRpdG9yIHdob3NlIGNvbnRlbnQgd2FzIGxhc3QgbW9kaWZpZWQgYmVmb3JlCi0JLy8gdGhlIFNhdmUgb3IgU2F2ZSBBbGwgYnV0dG9uIGtleSBpcyBzZWxlY3RlZC4KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IG1vZGlmaWVkUmljaFRleHQgPSBudWxsOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXIgbmFtZUNoYW5nZWRMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24gbXNnKSB7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTWV0aG9kRWxlbWVudC5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTkFNRToKLQkJCQluYW1lQ2hhbmdlZCgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+KCk7Ci0KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQotCXByb3RlY3RlZCBBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCXByaXZhdGUgYm9vbGVhbiBkaXJ0eTsKLQotCXByaXZhdGUgRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlcjsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjxPYmplY3Q+IHdpZGdldHNUb1Jlc3RvcmVWYWx1ZSA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQotCXByaXZhdGUgbG9uZyBjaGFuZ2VUaW1lID0gLTE7Ci0KLQlwdWJsaWMgT2JqZWN0IHdpZGdldFRvQ2hlY2s7Ci0KLQlwcml2YXRlIE9iamVjdCBjdXJyZW50RmVhdHVyZUVkaXRvcjsKLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGN1cnJlbnRFZGl0ZWRGZWF0dXJlOwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdDxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQkKLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIgZk1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyID0gbnVsbDsKLQkKLQkvKioKLQkgKiBMaXN0ZW5zIGZvciB3b3Jrc3BhY2UgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLnJlc291cmNlQ2hhbmdlZCgpOiBldmVudCA9ICIgKyBldmVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKGVsZW1lbnRPYmouZUlzUHJveHkoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJdHJ5IHsKLQkJCQljbGFzcyBSZXNvdXJjZURlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JCQkJCXByb3RlY3RlZCBNYXAgVVJJVG9Vc2VkUmVzb3VyY2VNYXAgPSBnZXRVUklUb1VzZWRSZXNvdXJjZU1hcCgpOwotCi0JCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQotCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCQkJCWlmIChkZWx0YS5nZXRGbGFncygpICE9IElSZXNvdXJjZURlbHRhLk1BUktFUlMKLQkJCQkJCQkJJiYgZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQkJCQlpZiAoKGRlbHRhLmdldEtpbmQoKSAmIChJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIHwgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkpICE9IDApIHsKLQkJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIFVSSVRvVXNlZFJlc291cmNlTWFwCi0JCQkJCQkJCQkJLmdldChVUkkuY3JlYXRlRmlsZVVSSShkZWx0YQotCQkJCQkJCQkJCQkJLmdldFJlc291cmNlKCkuZ2V0TG9jYXRpb24oKQotCQkJCQkJCQkJCQkJLnRvU3RyaW5nKCkpKTsKLQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmICgoZGVsdGEuZ2V0S2luZCgpICYgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgIT0gMCkgewotCQkJCQkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRDaGFuZ2VkUmVzb3VyY2VzKCkgewotCQkJCQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVtb3ZlZFJlc291cmNlcygpIHsKLQkJCQkJCXJldHVybiByZW1vdmVkUmVzb3VyY2VzOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpOwotCQkJCWRlbHRhLmFjY2VwdCh2aXNpdG9yKTsKLQotCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpKTsKLQkJCQlpZiAoIXZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpLmlzRW1wdHkoKSAmJiAhaXNEaXJ0eSgpKSB7Ci0JCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcy5kaXNwb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQotCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX07Ci0KLQljbGFzcyBBY3RpdmF0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBJUGFydExpc3RlbmVyLCBJV2luZG93TGlzdGVuZXIgewotCi0JCS8qKiBDYWNoZSBvZiB0aGUgYWN0aXZlIHdvcmtiZW5jaCBwYXJ0LiAqLwotCQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IGZBY3RpdmVQYXJ0OwotCi0JCS8qKiBJbmRpY2F0ZXMgd2hldGhlciBhY3RpdmF0aW9uIGhhbmRsaW5nIGlzIGN1cnJlbnRseSBiZSBkb25lLiAqLwotCQlwcml2YXRlIGJvb2xlYW4gZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIFRoZSBwYXJ0IHNlcnZpY2UuCi0JCSAqIAotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwcml2YXRlIElQYXJ0U2VydmljZSBmUGFydFNlcnZpY2U7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgdGhpcyBhY3RpdmF0aW9uIGxpc3RlbmVyLgotCQkgKiAKLQkJICogQHBhcmFtIHBhcnRTZXJ2aWNlCi0JCSAqICAgICAgICAgICAgdGhlIHBhcnQgc2VydmljZSBvbiB3aGljaCB0byBhZGQgdGhlIHBhcnQgbGlzdGVuZXIKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHVibGljIEFjdGl2YXRpb25MaXN0ZW5lcihJUGFydFNlcnZpY2UgcGFydFNlcnZpY2UpIHsKLQkJCWZQYXJ0U2VydmljZSA9IHBhcnRTZXJ2aWNlOwotCQkJZlBhcnRTZXJ2aWNlLmFkZFBhcnRMaXN0ZW5lcih0aGlzKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuYWRkV2luZG93TGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQkvKioKLQkJICogRGlzcG9zZXMgdGhpcyBhY3RpdmF0aW9uIGxpc3RlbmVyLgotCQkgKiAKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWZQYXJ0U2VydmljZS5yZW1vdmVQYXJ0TGlzdGVuZXIodGhpcyk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLnJlbW92ZVdpbmRvd0xpc3RlbmVyKHRoaXMpOwotCQkJZlBhcnRTZXJ2aWNlID0gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0QWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlmQWN0aXZlUGFydCA9IHBhcnQ7Ci0JCQloYW5kbGVBY3RpdmF0aW9uKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydEJyb3VnaHRUb1RvcChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRDbG9zZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0RGVhY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJZkFjdGl2ZVBhcnQgPSBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRPcGVuZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWlmIChwYXJ0ID09IE1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcykgewotCQkJCWlmICghaXNJbnB1dFZhbGlkKCkpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlJbmZvKAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JUaXRsZSwgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfaW52YWxpZEVkaXRvck1zZyk7IAotCQkJCQlNZXRob2RFbGVtZW50RWRpdG9yLnRoaXMuY2xvc2UoZmFsc2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHVzZWRSZXNvdXJjZXMgPSBnZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJaWYgKFJlc291cmNlVXRpbC5oYXNPdXRPZlN5bmNoKHVzZWRSZXNvdXJjZXMpKSB7Ci0JCQkJCWhhbmRsZUZpbGVDaGFuZ2VkKHVzZWRSZXNvdXJjZXMpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXNldFJlc291cmNlSW5mb3ModXNlZFJlc291cmNlcyk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogSGFuZGxlcyB0aGUgYWN0aXZhdGlvbiB0cmlnZ2VyaW5nIGEgZWxlbWVudCBzdGF0ZSBjaGVjayBpbiB0aGUKLQkJICogZWRpdG9yLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGhhbmRsZUFjdGl2YXRpb24oKSB7Ci0JCQlpZiAoZklzSGFuZGxpbmdBY3RpdmF0aW9uIHx8IE1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcy5kaXNwb3NlZCkKLQkJCQlyZXR1cm47Ci0KLQkJCWlmIChmQWN0aXZlUGFydCA9PSBNZXRob2RFbGVtZW50RWRpdG9yLnRoaXMpIHsKLQkJCQlmSXNIYW5kbGluZ0FjdGl2YXRpb24gPSB0cnVlOwotCQkJCXRyeSB7Ci0JCQkJCWhhbmRsZUFjdGl2YXRlKGZBY3RpdmVQYXJ0KTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlmSXNIYW5kbGluZ0FjdGl2YXRpb24gPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lciN3aW5kb3dBY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHVibGljIHZvaWQgd2luZG93QWN0aXZhdGVkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCQlpZiAod2luZG93ID09IGdldEVkaXRvclNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKSkgewotCQkJCS8qCi0JCQkJICogV29ya2Fyb3VuZCBmb3IgcHJvYmxlbSBkZXNjcmliZWQgaW4KLQkJCQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNzMxIFdpbGwgYmUKLQkJCQkgKiByZW1vdmVkIHdoZW4gU1dUIGhhcyBzb2x2ZWQgdGhlIHByb2JsZW0uCi0JCQkJICovCi0JCQkJd2luZG93LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWhhbmRsZUFjdGl2YXRpb24oKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXIjd2luZG93RGVhY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHVibGljIHZvaWQgd2luZG93RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyI3dpbmRvd0Nsb3NlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyI3dpbmRvd09wZW5lZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aW5kb3dPcGVuZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJfQotCX0KLQotCXByaXZhdGUgQWN0aXZhdGlvbkxpc3RlbmVyIGFjdGl2YXRpb25MaXN0ZW5lcjsKLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0ZpbGVDaGFuZ2VkUmVxdWlyZWQgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBIYXNoU2V0PFJlc291cmNlPiBsYXN0VXNlZFJlc291cmNlczsKLQotCXByaXZhdGUgYm9vbGVhbiBkaXNwb3NlZDsKLQotCXByb3RlY3RlZCBIYXNoTWFwPFJlc291cmNlLCBSZXNvdXJjZUluZm8+IHJlc291cmNlSW5mb01hcDsKLQotCXByaXZhdGUgSUZpbGUgZWxlbWVudEZpbGU7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEVkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQkJCi0JCS8vIG1vdmVkIHRoZSBkZXRhaWxzIG91dCBzbyB0aGF0IHVzZXIgY2FuIG92ZXJyaWRlIHRoZSB0aWNrIHVwZGF0b3IKLQkJLy8gSmluaHVhIFhpIDMvMTUvMjAwNwotCQljcmVhdGVFZGl0b3JFcnJvclRpY2tVcGRhdGVyKCk7Ci0JCWNyZWF0ZUFjdGlvbk1hbmFnZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdG9yRXJyb3JUaWNrVXBkYXRlcigpIHsKLQkJCi0JCXRoaXMuZk1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyID0gbmV3IE1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyKHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25NYW5hZ2VyKCkgewotCQlhY3Rpb25NZ3IgPSBuZXcgQWN0aW9uTWFuYWdlcigpIHsKLQotCQkJcHJvdGVjdGVkIEZ1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjayBjcmVhdGVDb21tYW5kU3RhY2soKSB7Ci0JCQkJcmV0dXJuIG5ldyBGdWxseVJldmVydGlibGVDb21tYW5kU3RhY2sodGhpcykgewotCQkJCQlwdWJsaWMgYm9vbGVhbiBkb0V4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQkJCQkvLyBDaGVjayBtb2RpZnkgZmlyc3QuCi0JCQkJCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCQkJCUNvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMgPSAoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgY29tbWFuZCkKLQkJCQkJCQkJCS5nZXRNb2RpZmllZFJlc291cmNlcygpOwotCQkJCQkJCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsCi0JCQkJCQkJCQkmJiAhKG1vZGlmaWVkUmVzb3VyY2VzLmlzRW1wdHkoKSkpIHsKLQkJCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJCQkJCQkuY2hlY2tNb2RpZnkobW9kaWZpZWRSZXNvdXJjZXMsCi0JCQkJCQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQkJCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCQkJTWV0aG9kRWxlbWVudEVkaXRvci50aGlzCi0JCQkJCQkJCQkJCS5oYW5kbGVFcnJvcihzdGF0dXMpOwotCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlFT2JqZWN0IG93bmVyID0gVG5nVXRpbC5nZXRPd25lcihjb21tYW5kKTsKLQkJCQkJCQlpZiAob3duZXIgIT0gbnVsbCkgewotCQkJCQkJCQlJU3RhdHVzIHN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KG93bmVyLAotCQkJCQkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCQkuZGlzcGxheSgKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdERpYWxvZ19tc2dDYW5ub3RFZGl0LCAKLQkJCQkJCQkJCQkJCQlzdGF0dXMpOwotCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlpZiAoY2hhbmdlVGltZSA9PSAtMSkgewotCQkJCQkJCWNoYW5nZVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJCX0KLQkJCQkJCWJvb2xlYW4gcmV0ID0gc3VwZXIuZG9FeGVjdXRlKGNvbW1hbmQpOwotCQkJCQkJaWYgKCFyZXQgJiYgY2hhbmdlVGltZSAhPSAtMSkgewotCQkJCQkJCWNoYW5nZVRpbWUgPSAtMTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiByZXQ7Ci0JCQkJCX0KLQotCQkJCX07Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGRvQWN0aW9uKGludCBhY3Rpb25UeXBlLCBFT2JqZWN0IG9iamVjdCwKLQkJCQkJb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQkJCWZpbmFsIElTdGF0dXMgc3RhdHVzID0gVG5nVXRpbAotCQkJCQkJLmNoZWNrRWRpdChvYmplY3QsIGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJCQlyZXR1cm4gc3VwZXIuZG9BY3Rpb24oYWN0aW9uVHlwZSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQkJCQlpbmRleCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gdGhpcyBtaWdodCBiZSBjYWxsZWQgZnJvbSBhIG5vbi1VSSB0aHJlYWQKLQkJCQkJLy8gc28gbWFrZSBzdXJlIHRoZSBtZXNzYWdlIGRpYWxvZyB3aWxsIGJlIHNob3duIGluIGEgVUkgdGhyZWFkCi0JCQkJCS8vCi0JCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXREaWFsb2dfbXNnQ2Fubm90RWRpdCwgCi0JCQkJCQkJCQlzdGF0dXMpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX0pOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQlwcm90ZWN0ZWQgdm9pZCBzYXZlKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCQkJLy8gZG9uJ3Qgc2F2ZSByZXNvdXJjZSB0aGF0IGlzIGNoYW5nZWQgb3V0c2lkZSBvZiB0aGlzIGVkaXRvcgotCQkJCS8vCi0JCQkJaWYgKGNoYW5nZWRSZXNvdXJjZXMuY29udGFpbnMocmVzb3VyY2UpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJCi0JCQkJYm9vbGVhbiBjYW5TYXZlOwotCQkJCWlmKHJlc291cmNlLmdldFVSSSgpLmlzRmlsZSgpKSB7Ci0JCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQkJY2FuU2F2ZSA9IGZpbGUubGFzdE1vZGlmaWVkKCkgPiBjaGFuZ2VUaW1lOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY2FuU2F2ZSA9IHRydWU7Ci0JCQkJfQkJCQkKLQkJCQl0cnkgewotCQkJCQlpZihjYW5TYXZlKSB7Ci0JCQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gZ2V0UGVyc2lzdGVyKCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJVmlld0hlbHBlcgotCQkJCQkJCQkucmVsb2FkQ3VycmVudExpYmFyeU9uUm9sbGJhY2tFcnJvcihnZXRFZGl0b3JTaXRlKCkKLQkJCQkJCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJY2hhbmdlVGltZSA9IC0xOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlhY3Rpb25NZ3IuZ2V0Q29tbWFuZFN0YWNrKCkuYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIoCi0JCQkJbmV3IENvbW1hbmRTdGFja0xpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQltYW5hZ2VyLnN0YXJ0TGlzdGVuaW5nVG8oYWN0aW9uTWdyLmdldENvbW1hbmRTdGFjaygpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBuYW1lQ2hhbmdlZCgpIHsKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXNldFBhcnROYW1lKCk7Ci0JCQkJaWYgKHBhZ2VzICE9IG51bGwpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGFnZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgcGFnZSA9IGl0ZXIubmV4dCgpOwotCi0JCQkJCQlpZiAocGFnZSBpbnN0YW5jZW9mIElSZWZyZXNoYWJsZSkgewotCQkJCQkJCSgoSVJlZnJlc2hhYmxlKSBwYWdlKS5yZWZyZXNoTmFtZShlbGVtZW50T2JqCi0JCQkJCQkJCQkuZ2V0TmFtZSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIElBY3Rpb25NYW5hZ2VyIGdldEFjdGlvbk1hbmFnZXIoKSB7Ci0JCXJldHVybiBhY3Rpb25NZ3I7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvciNpbml0KElFZGl0b3JTaXRlLAotCSAqICAgICAgSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KQotCQkJdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJc2V0U2l0ZShzaXRlKTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KSB7Ci0JCQkvLyBwcm9iYWJseSBvcGVuZWQgZnJvbSBQcm9ibGVtcyBWaWV3Ci0JCQkvLyBjcmVhdGUgYSBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQKLQkJCWVsZW1lbnRGaWxlID0gKChGaWxlRWRpdG9ySW5wdXQpaW5wdXQpLmdldEZpbGUoKTsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KAotCQkJCQllbGVtZW50RmlsZSwKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKS4KLQkJCQkJCWdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpbnB1dCA9IG5ldyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQoCi0JCQkJCWVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXNldElucHV0KGlucHV0KTsKLQkJc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcih0aGlzKTsKLQkJYWN0aXZhdGlvbkxpc3RlbmVyID0gbmV3IEFjdGl2YXRpb25MaXN0ZW5lcihzaXRlLmdldFdvcmtiZW5jaFdpbmRvdygpCi0JCQkJLmdldFBhcnRTZXJ2aWNlKCkpOwotCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQlJbWFnZSB0aXRsZUltYWdlID0gbGFiZWxQcm92aWRlci5nZXRJbWFnZShlbGVtZW50T2JqKTsKLQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCXNldFRpdGxlSW1hZ2UodGl0bGVJbWFnZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjc2V0SW5wdXQob3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldElucHV0KElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5zZXRJbnB1dChpbnB1dCk7Ci0KLQkJLy8gR2V0IG1ldGhvZCBlbGVtZW50IG9iamVjdCBmcm9tIEVkaXRvciBpbnB1dC4KLQkJLy8KLQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IG1ldGhvZEVsZW1lbnRJbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0OwotCQllbGVtZW50T2JqID0gbWV0aG9kRWxlbWVudElucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQotCQlzZXRQYXJ0TmFtZSgpOwotCQllbGVtZW50T2JqLmVBZGFwdGVycygpLmFkZChuYW1lQ2hhbmdlZExpc3RlbmVyKTsKLQkJCi0JCWlmIChmTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIgIT0gbnVsbCkKLQkJCWZNZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlci51cGRhdGVFZGl0b3JJbWFnZShlbGVtZW50T2JqKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZVJlc291cmNlSW5mb3MoQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzKSB7Ci0JCWlmKHJlc291cmNlSW5mb01hcCA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZUluZm9NYXAgPSBuZXcgSGFzaE1hcDxSZXNvdXJjZSwgUmVzb3VyY2VJbmZvPigpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCVJlc291cmNlSW5mbyBpbmZvID0gcmVzb3VyY2VJbmZvTWFwLmdldChyZXNvdXJjZSk7Ci0JCQlpZihpbmZvID09IG51bGwpIHsKLQkJCQlpbmZvID0gbmV3IFJlc291cmNlSW5mbyhyZXNvdXJjZSk7Ci0JCQkJcmVzb3VyY2VJbmZvTWFwLnB1dChyZXNvdXJjZSwgaW5mbyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbmZvLnJlZnJlc2goKTsKLQkJCX0KLQkJfQotCQljaGVja0ZpbGVDaGFuZ2VkUmVxdWlyZWQgPSB0cnVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBvdmV3cml0ZVJlc291cmNlcyhDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJUmVzb3VyY2VJbmZvIGluZm8gPSByZXNvdXJjZUluZm9NYXAuZ2V0KHJlc291cmNlKTsKLQkJCWlmKGluZm8gIT0gbnVsbCkgewotCQkJCWluZm8ub3ZlcndyaXRlID0gdHJ1ZTsKLQkJCX0KLQkJfQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlSW5mb3MoQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzKSB7Ci0JCWlmKHJlc291cmNlSW5mb01hcCAhPSBudWxsICYmICFyZXNvdXJjZUluZm9NYXAuaXNFbXB0eSgpKSB7Ci0JCQlyZXNvdXJjZUluZm9NYXAuY2xlYXIoKTsKLQkJfQotCQl1cGRhdGVSZXNvdXJjZUluZm9zKHJlc291cmNlcyk7Ci0JfQotCQotCXByaXZhdGUgbG9uZyBnZXRMb2FkU3RhbXAoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJUmVzb3VyY2VJbmZvIGluZm8gPSByZXNvdXJjZUluZm9NYXAuZ2V0KHJlc291cmNlKTsKLQkJcmV0dXJuIGluZm8gIT0gbnVsbCA/IGluZm8ubG9hZFN0YW1wIDogSVJlc291cmNlLk5VTExfU1RBTVA7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZXJlIGlzIGFueSByZXNvdXJjZSBpbiB0aGUgZ2l2ZW4gPGNvZGU+dXNlZFJlc291cmNlczwvY29kZT4KLQkgKiB0aGF0IGhhcyBiZWVuIHJlbG9hZGVkIHNpbmNlIGxhc3QgdXBkYXRlIG9mIGxvYWQgdGltZSBzdGFtcHMgYnkgdGhpcwotCSAqIGVkaXRvcgotCSAqIAotCSAqIEBwYXJhbSB1c2VkUmVzb3VyY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrUmVsb2FkZWQoQ29sbGVjdGlvbiB1c2VkUmVzb3VyY2VzKSB7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZ2V0UmVzb3VyY2VTZXQodXNlZFJlc291cmNlcyk7Ci0JCWJvb2xlYW4geG1pID0gcmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlU2V0IAotCQkJJiYgKChJTGlicmFyeVJlc291cmNlU2V0KXJlc291cmNlU2V0KS5nZXRQZXJzaXN0ZW5jZVR5cGUoKS5lcXVhbHMoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB1c2VkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlKSB7Ci0JCQkJbG9uZyBvbGRTdGFtcCA9IGdldExvYWRTdGFtcChyZXNvdXJjZSk7Ci0JCQkJbG9uZyBjdXJyZW50U3RhbXAgPSAoKElMaWJyYXJ5UmVzb3VyY2UpcmVzb3VyY2UpLmdldExvYWRTdGFtcCgpOwotCQkJCWlmIChvbGRTdGFtcCAhPSBjdXJyZW50U3RhbXApIHsKLQkJCQkJaWYoeG1pKSB7Ci0JCQkJCQlJUmVzb3VyY2Ugd3NSZXMgPSBGaWxlTWFuYWdlci5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKHJlc291cmNlCi0JCQkJCQkJCS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJCQlpZiAod3NSZXMgIT0gbnVsbCkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldChDb2xsZWN0aW9uIHJlc291cmNlcykgewotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCXJlc291cmNlU2V0ID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCWlmIChyZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlU2V0OwotCX0KLQkKLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldE91dE9mU3luY1Jlc291cmNlcyhDb2xsZWN0aW9uPFJlc291cmNlPiB1c2VkUmVzb3VyY2VzKSB7Ci0JCUNvbGxlY3Rpb248UmVzb3VyY2U+IG91dE9mU3luY1Jlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiB1c2VkUmVzb3VyY2VzKSB7Ci0JCQlpZihpc091dE9mU3luYyhyZXNvdXJjZSkpIHsKLQkJCQlvdXRPZlN5bmNSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb3V0T2ZTeW5jUmVzb3VyY2VzOwotCX0KLQotCQotCXByaXZhdGUgYm9vbGVhbiBpc091dE9mU3luYyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQlSZXNvdXJjZUluZm8gaW5mbyA9IHJlc291cmNlSW5mb01hcC5nZXQocmVzb3VyY2UpOwotCQlsb25nIHN0YW1wID0gSVN5bmNocm9uaXphdGlvbkhlbHBlci5JTlNUQU5DRS5nZXRNb2RpZmljYXRpb25TdGFtcChyZXNvdXJjZSk7Ci0JCWlmKHN0YW1wICE9IElSZXNvdXJjZS5OVUxMX1NUQU1QKSB7Ci0JCQlpZihpbmZvID09IG51bGwgfHwgaW5mby5tb2RpZmljYXRpb25TdGFtcCAhPSBzdGFtcCkgewotCQkJCWlmKElTeW5jaHJvbml6YXRpb25IZWxwZXIuSU5TVEFOQ0UuaXNTeW5jaHJvbml6ZWQocmVzb3VyY2UpKSB7Ci0JCQkJCS8vIHJlZnJlc2ggdGhlIGNhY2hlZCBzdGFtcAotCQkJCQkvLwotCQkJCQlpZihpbmZvID09IG51bGwpIHsKLQkJCQkJCXJlc291cmNlSW5mb01hcC5wdXQocmVzb3VyY2UsIG5ldyBSZXNvdXJjZUluZm8ocmVzb3VyY2UpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWluZm8ubW9kaWZpY2F0aW9uU3RhbXAgPSBJU3luY2hyb25pemF0aW9uSGVscGVyLklOU1RBTkNFLmdldE1vZGlmaWNhdGlvblN0YW1wKHJlc291cmNlKTsgCi0JCQkJCX0JCQkJCQkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAhSVN5bmNocm9uaXphdGlvbkhlbHBlci5JTlNUQU5DRS5pc1N5bmNocm9uaXplZChyZXNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tGaWxlQ2hhbmdlZChDb2xsZWN0aW9uIHVzZWRSZXNvdXJjZXMpIHsKLQkJLy8gY2hlY2sgcmVzb3VyY2Ugc2V0IHR5cGUgYW5kIGNvbnRpbnVlIHRvIGNoZWNrIGZvciBjaGFuZ2VkIGZpbGUgaWYgdGhlCi0JCS8vIHR5cGUgaXMgWE1JCi0JCS8vCi0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZ2V0UmVzb3VyY2VTZXQodXNlZFJlc291cmNlcyk7Ci0JCWlmIChyZXNvdXJjZVNldCBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2VTZXQKLQkJCQkmJiAoKElMaWJyYXJ5UmVzb3VyY2VTZXQpIHJlc291cmNlU2V0KS5nZXRQZXJzaXN0ZW5jZVR5cGUoKS5lcXVhbHMoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB1c2VkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQlpZihpc091dE9mU3luYyhyZXNvdXJjZSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9tcHRSZWxvYWRGaWxlcygpIHsKLQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfdGl0bGU7Ci0JCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY19tZXNzYWdlOwotCQlyZXR1cm4gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlQcm9tcHQoCi0JCQkJdGl0bGUsIG1zZyk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBoYW5kbGVGaWxlQ2hhbmdlZChmaW5hbCBDb2xsZWN0aW9uPFJlc291cmNlPiB1c2VkUmVzb3VyY2VzKSB7Ci0JCWJvb2xlYW4gcmV0ID0gcHJvbXB0UmVsb2FkRmlsZXMoKTsKLQkJaWYgKHJldCkgewotCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMTApOyAvLyROT04tTkxTLTEkCi0JCQkJCW1vbml0b3Iuc3ViVGFzayhBdXRob3JpbmdVSVJlc291cmNlcy5yZWZyZXNoX3RleHQpOyAKLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCXRyeSB7Ci0KLQkJCQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCQkJCQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IHVzZWRSZXNvdXJjZXMpIHsKLQkJCQkJCQlpZiAoIW5ldyBGaWxlKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKQotCQkJCQkJCQkJLmV4aXN0cygpKSB7Ci0JCQkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gcmVzb3VyY2VJbmZvTWFwICE9IG51bGwgPyAKLQkJCQkJCQkJZ2V0T3V0T2ZTeW5jUmVzb3VyY2VzKHVzZWRSZXNvdXJjZXMpIDoKLQkJCQkJCQkJUmVzb3VyY2VVdGlsLmdldE91dE9mU3luY1Jlc291cmNlcyh1c2VkUmVzb3VyY2VzKTsKLQkJCQkJCW1vbml0b3Iud29ya2VkKDIpOwotCi0JCQkJCQkvLyB1bmxvYWQgdGhlIHJlbW92ZWQgcmVzb3VyY2VzCi0JCQkJCQkvLwotCQkJCQkJUGVyc2lzdGVuY2VVdGlsLnVubG9hZChyZW1vdmVkUmVzb3VyY2VzKTsKLQkJCQkJCW1vbml0b3Iud29ya2VkKDIpOwotCi0JCQkJCQkvLyBSZWxvYWQgdGhlIGNoYW5nZWQgcmVzb3VyY2VzLgotCQkJCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJCQlDb2xsZWN0aW9uPFJlc291cmNlPiByZWxvYWRlZFJlc291cmNlcyA9IG1hbmFnZXIKLQkJCQkJCQkJCS5yZWxvYWRSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlcyk7Ci0JCQkJCQkJaWYgKCFyZWxvYWRlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJLmdldFJlbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcygpCi0JCQkJCQkJCQkJLmFkZEFsbChyZWxvYWRlZFJlc291cmNlcyk7Ci0JCQkJCQkJfQotCi0JCQkJCQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKQotCQkJCQkJCQkJfHwgIXJlbG9hZGVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCQkJCQkvLyBzYXZlIGNoYW5nZWQgcmVzb3VyY2VzIGJlZm9yZSByZWZyZXNoIHNvCi0JCQkJCQkJCS8vIGFjdGlvbgotCQkJCQkJCQkvLyBtYW5hZ2VyIHdpbGwgbm90IHRyeSB0byBzYXZlIHRoZXNlIGNoYW5nZWQKLQkJCQkJCQkJLy8gcmVzb3VyY2VzCi0JCQkJCQkJCS8vCi0JCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcy5jaGFuZ2VkUmVzb3VyY2VzCi0JCQkJCQkJCQkJLmFkZEFsbChyZWxvYWRlZFJlc291cmNlcyk7Ci0JCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcy5sYXN0VXNlZFJlc291cmNlcwotCQkJCQkJCQkJCS5yZW1vdmVBbGwocmVtb3ZlZFJlc291cmNlcyk7Ci0JCQkJCQkJCXJlZnJlc2godHJ1ZSk7Ci0JCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcy5jaGFuZ2VkUmVzb3VyY2VzCi0JCQkJCQkJCQkJLmNsZWFyKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJbW9uaXRvci53b3JrZWQoNCk7Ci0KLQkJCQkJCS8vIHJlZnJlc2ggb3V0LW9mLXN5bmNoIHJlc291cmNlcwotCQkJCQkJLy8KLQkJCQkJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBjaGFuZ2VkUmVzb3VyY2VzKSB7Ci0JCQkJCQkJRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWZyZXNoKHJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX07Ci0KLQkJCXRyeSB7Ci0JCQkJZ2V0U2l0ZSgpCi0JCQkJCQkuZ2V0V29ya2JlbmNoV2luZG93KCkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkJLmdldFByb2dyZXNzU2VydmljZSgpCi0JCQkJCQkucnVuSW5VSSgKLQkJCQkJCQkJbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSksCi0JCQkJCQkJCXJ1bm5hYmxlLCBuZXcgTGlicmFyeVNjaGVkdWxpbmdSdWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JUaXRsZTsgCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCXRpdGxlLCBlLnRvU3RyaW5nKCksIGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJY2hlY2tGaWxlQ2hhbmdlZFJlcXVpcmVkID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJ0TmFtZSgpIHsKLQkJU3RyaW5nIHBhcnROYW1lID0gZWxlbWVudE9iai5nZXROYW1lKCk7Ci0JCWlmIChwYXJ0TmFtZSA9PSBudWxsKSB7Ci0JCQlwYXJ0TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJc2V0UGFydE5hbWUocGFydE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNyZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLQkJCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjZ2V0U2VsZWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBjdXJyZW50U2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjc2V0U2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQotCQlmb3IgKEl0ZXJhdG9yIGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycykKLQkJCQkuaXRlcmF0b3IoKTsgbGlzdGVuZXJzLmhhc05leHQoKTspIHsKLQkJCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikgbGlzdGVuZXJzCi0JCQkJCS5uZXh0KCk7Ci0JCQlsaXN0ZW5lcgotCQkJCQkuc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIHNlbGVjdGlvbikpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvciNhZGRQYWdlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQlhZGRQYWdlKG5ldyBNZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZSh0aGlzKSk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlhZGRQYWdlKG5ldyBNZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50T2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlhZGRQYWdlKG5ldyBDb250ZW50UGFja2FnZURlc2NyaXB0aW9uUGFnZSh0aGlzKSk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQkJYWRkUGFnZShuZXcgUm9sZURlc2NyaXB0aW9uUGFnZSh0aGlzKSk7Ci0JCQkJYWRkUGFnZShuZXcgUm9sZVdvcmtQcm9kdWN0c1BhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKHRoaXMpKTsKLQkJCQlhZGRQYWdlKG5ldyBSb2xlQ2F0ZWdvcmllc1BhZ2UodGhpcykpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50T2JqIGluc3RhbmNlb2YgVGFzaykgewotCQkJCWFkZFBhZ2UobmV3IFRhc2tEZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IFRhc2tTdGVwc1BhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IFRhc2tSb2xlc1BhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IFRhc2tXb3JrUHJvZHVjdHNQYWdlKHRoaXMpKTsKLQkJCQlhZGRQYWdlKG5ldyBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZSh0aGlzKSk7Ci0JCQkJYWRkUGFnZShuZXcgVGFza0NhdGVnb3JpZXNQYWdlKHRoaXMpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJYWRkUGFnZShuZXcgV29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCWlmIChlbGVtZW50T2JqIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJYWRkUGFnZShuZXcgV29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZSh0aGlzKSk7Ci0JCQkJfQotCQkJCWFkZFBhZ2UobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKHRoaXMpKTsKLQkJCQlhZGRQYWdlKG5ldyBXb3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlKHRoaXMpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNBbGxvd2VkQXR0YWNobWVudHMoZWxlbWVudE9iaikpIHsKLQkJCQkJYWRkUGFnZShuZXcgR3VpZGFuY2VXaXRoQXR0YWNobWVudHNEZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCX0gZWxzZSBpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQkJCWFkZFBhZ2UobmV3IFByYWN0aWNlRGVzY3JpcHRpb25QYWdlKHRoaXMpKTsKLQkJCQkJYWRkUGFnZShuZXcgUHJhY3RpY2VSZWZlcmVuY2VzUGFnZSh0aGlzKSk7Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50T2JqIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWFkZFBhZ2UobmV3IEd1aWRhbmNlRGVzY3JpcHRpb25QYWdlKHRoaXMpKTsKLQkJCQkJYWRkUGFnZShuZXcgQ2hlY2tsaXN0SXRlbXNQYWdlKHRoaXMpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlhZGRQYWdlKG5ldyBHdWlkYW5jZURlc2NyaXB0aW9uUGFnZSh0aGlzKSk7Ci0JCQkJfQotCQkJCWlmICghKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBQcmFjdGljZSkpCi0JCQkJCWFkZFBhZ2UobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKHRoaXMpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCQlhZGRQYWdlKG5ldyBEaXNjaXBsaW5lRGVzY3JpcHRpb25QYWdlKHRoaXMpKTsKLQkJCQlhZGRQYWdlKG5ldyBEaXNjaXBsaW5lVGFza3NQYWdlKHRoaXMpKTsKLQkJCQlhZGRQYWdlKG5ldyBEaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlKHRoaXMpKTsKLQkJCQlhZGRQYWdlKG5ldyBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZSh0aGlzKSk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpIHsKLQkJCQlhZGRQYWdlKG5ldyBEaXNjaXBsaW5lR3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IERpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZSh0aGlzKSk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCQlhZGRQYWdlKG5ldyBEb21haW5EZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IERvbWFpbldvcmtQcm9kdWN0c1BhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKHRoaXMpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkgewotCQkJCWFkZFBhZ2UobmV3IFdvcmtQcm9kdWN0VHlwZURlc2NyaXB0aW9uUGFnZSh0aGlzKSk7Ci0JCQkJYWRkUGFnZShuZXcgV29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZSh0aGlzKSk7Ci0JCQkJYWRkUGFnZShuZXcgQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UodGhpcykpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50T2JqIGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJCWFkZFBhZ2UobmV3IFJvbGVTZXREZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IFJvbGVTZXRSb2xlc1BhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKHRoaXMpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykgewotCQkJCWFkZFBhZ2UobmV3IFJvbGVTZXRHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZSh0aGlzKSk7Ci0JCQkJYWRkUGFnZShuZXcgUm9sZVNldEdyb3VwaW5nUm9sZVNldHModGhpcykpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50T2JqIGluc3RhbmNlb2YgVG9vbCkgewotCQkJCWFkZFBhZ2UobmV3IFRvb2xEZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IFRvb2xUb29sTWVudG9yc1BhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKHRoaXMpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJYWRkUGFnZShuZXcgQ3VzdG9tQ2F0ZWdvcnlEZXNjcmlwdGlvblBhZ2UodGhpcykpOwotCQkJCWFkZFBhZ2UobmV3IEN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZSh0aGlzKSk7Ci0JCQl9Ci0KLQkJCXNldFBhcnROYW1lKGVsZW1lbnRPYmouZ2V0TmFtZSgpKTsKLQotCQkJaWYgKCEoZWxlbWVudE9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlIHx8IGVsZW1lbnRPYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKQotCQkJCWNyZWF0ZVByZXZpZXdQYWdlKCk7Ci0KLQkJCWlmIChlbGVtZW50T2JqIGluc3RhbmNlb2YgVGFzaykgewotCQkJCS8vIGNoZWNrIGZvciBleHRlbnN0aW9uIHBvaW50IGFuZCBhZGQgdGhlIHBhZ2UgaWYgdGhlcmUKLQkJCQlMaXN0PD8+IHBhZ2VQcm92aWRlcnMgPSBNZXRob2RFZGl0b3JQYWdlUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldFBhZ2VQcm92aWRlcnMoKTsKLQotCQkJCWlmIChwYWdlUHJvdmlkZXJzICE9IG51bGwgJiYgcGFnZVByb3ZpZGVycy5zaXplKCkgPiAwKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VQcm92aWRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQlPYmplY3QgcGFnZSA9IHBhZ2VQcm92aWRlcnMuZ2V0KGkpOwotCQkJCQkJCWlmIChwYWdlIGluc3RhbmNlb2YgSUV4dGVuc2lvbkZvcm1QYWdlKSB7Ci0JCQkJCQkJCUlFeHRlbnNpb25Gb3JtUGFnZSBmb3JtUGFnZSA9IChJRXh0ZW5zaW9uRm9ybVBhZ2UpIHBhZ2U7Ci0JCQkJCQkJCWZvcm1QYWdlLnNldEVkaXRvcih0aGlzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IodCk7Ci0JCQlkaXNwb3NlKCk7Ci0JCQlpZih0IGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotCQkJCXRocm93IChSdW50aW1lRXhjZXB0aW9uKXQ7Ci0JCQl9Ci0JCQlpZih0IGluc3RhbmNlb2YgRXJyb3IpIHsKLQkJCQl0aHJvdyAoRXJyb3IpIHQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdEJhc2VGb3JtRWRpdG9yI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRyeSB7Ci0JCQkvLyBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigKLQkJCS8vIHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCi0JCQlpZiAoYWN0aXZhdGlvbkxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQlhY3RpdmF0aW9uTGlzdGVuZXIuZGlzcG9zZSgpOwotCQkJfQotCi0JCQltb2RpZmllZFJpY2hUZXh0ID0gbnVsbDsKLQotCQkJZGlzcG9zZUVkaXRvckVycm9yVGlja1VwZGF0ZXIoKTsKLQkJCQotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQltYW5hZ2VyLnN0b3BMaXN0ZW5pbmdUbyhhY3Rpb25NZ3IuZ2V0Q29tbWFuZFN0YWNrKCkpOwotCQkJfQotCi0JCQlpZiAoaXNEaXJ0eSgpKSB7Ci0JCQkJYWN0aW9uTWdyLnVuZG9BbGwoKTsKLQkJCX0KLQkJCWFjdGlvbk1nci5kaXNwb3NlKCk7Ci0JCQllbGVtZW50T2JqLmVBZGFwdGVycygpLnJlbW92ZShuYW1lQ2hhbmdlZExpc3RlbmVyKTsKLQkJCQotCQkJaWYocmVzb3VyY2VJbmZvTWFwICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZUluZm9NYXAuY2xlYXIoKTsKLQkJCQlyZXNvdXJjZUluZm9NYXAgPSBudWxsOwkJCQkKLQkJCX0KLQkJCQotCQkJaWYoY2hhbmdlZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOwotCQkJCWNoYW5nZWRSZXNvdXJjZXMgPSBudWxsOwotCQkJfQotCQkJCi0JCQlpZihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmNsZWFyKCk7Ci0JCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG51bGw7Ci0JCQl9Ci0JCQkKLQkJCWlmKFBlcnNwZWN0aXZlVXRpbC5pc0FjdGl2ZVBlcnNwZWN0aXZlKEF1dGhvcmluZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKSkgewotCQkJCS8vIHVubG9hZCBhbGwgcmVzb3VyY2VzIG9mIGNvbnRlbnQgZGVzY3JpcHRpb24gdGhhdCBhcmUgbm90IHVzZWQgYnkgCi0JCQl9Ci0JCQkKLQkJCWlmKGxhc3RVc2VkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCQlsYXN0VXNlZFJlc291cmNlcy5jbGVhcigpOwotCQkJCWxhc3RVc2VkUmVzb3VyY2VzID0gbnVsbDsKLQkJCX0JCQkJCQkgCi0JCX0gZmluYWxseSB7Ci0JCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQlkaXNwb3NlZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlRWRpdG9yRXJyb3JUaWNrVXBkYXRlcigpCi0JewotCQlpZiAoIGZNZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlciAhPSBudWxsICkgewotCQkJZk1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyLmRpc3Bvc2UoKTsKLQkJCWZNZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdEJhc2VGb3JtRWRpdG9yI2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCWlmIChkaXJ0eSkKLQkJCXJldHVybiB0cnVlOwotCQlkaXJ0eSA9IGFjdGlvbk1nci5pc1NhdmVOZWVkZWQoKTsKLQkJcmV0dXJuIGRpcnR5OwotCX0KLQotCXB1YmxpYyBGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgZ2V0UGVyc2lzdGVyKCkgewotCQlpZiAocGVyc2lzdGVyID09IG51bGwpIHsKLQkJCXBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJfQotCQlyZXR1cm4gcGVyc2lzdGVyOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIGFjdGlvbk1nci5nZXRNb2RpZmllZFJlc291cmNlcygpOwotCX0KLQotCS8qKgotCSAqIFNldCBtb2RpZmllZCByaWNoIHRleHQgZmllbGQKLQkgKiBAcGFyYW0gbW9kaWZpZWRSaWNoVGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVkUmljaFRleHQoSU1ldGhvZFJpY2hUZXh0IG1vZGlmaWVkUmljaFRleHQpIHsKLQkJdGhpcy5tb2RpZmllZFJpY2hUZXh0ID0gbW9kaWZpZWRSaWNoVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIG1vZGlmaWVkIHJpY2ggdGV4dCAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTW9kaWZpZWRSaWNoVGV4dChJTWV0aG9kUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwgJiYgIXJpY2hUZXh0LmlzRGlzcG9zZWQoKQotCQkJCSYmIHJpY2hUZXh0LmdldE1vZGlmaWVkKCkpIHsKLQkJCUVPYmplY3QgbW9kYWxPYmplY3QgPSByaWNoVGV4dC5nZXRNb2RhbE9iamVjdCgpOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIG1vZGFsT2JqZWN0RmVhdHVyZSA9IHJpY2hUZXh0Ci0JCQkJCS5nZXRNb2RhbE9iamVjdEZlYXR1cmUoKTsKLQkJCWlmIChtb2RhbE9iamVjdCAhPSBudWxsICYmIG1vZGFsT2JqZWN0RmVhdHVyZSAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IG9sZENvbnRlbnQgPSBtb2RhbE9iamVjdC5lR2V0KG1vZGFsT2JqZWN0RmVhdHVyZSk7Ci0JCQkJaWYgKCFtdXN0UmVzdG9yZVZhbHVlKHJpY2hUZXh0LCBvbGRDb250ZW50KSkgewotCQkJCQlPYmplY3QgbmV3Q29udGVudCA9IHJpY2hUZXh0LmdldFRleHQoKTsKLQkJCQkJcmljaFRleHQuc2V0SW5pdGlhbFRleHQoKFN0cmluZyluZXdDb250ZW50KTsKLQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgbW9kYWxPYmplY3QsCi0JCQkJCQkJCW1vZGFsT2JqZWN0RmVhdHVyZSwgbmV3Q29udGVudCwgLTEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZSBsYXN0IG1vZGlmaWVkIHJpY2ggdGV4dCAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTW9kaWZpZWRSaWNoVGV4dCgpIHsKLQkJc2F2ZU1vZGlmaWVkUmljaFRleHQobW9kaWZpZWRSaWNoVGV4dCk7Ci0JfQotCQotCXByb3RlY3RlZCBMaWJyYXJ5VmFsaWRhdGVBY3Rpb24gY3JlYXRlVmFsaWRhdGVSZXNvdXJjZUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBMaWJyYXJ5VmFsaWRhdGVBY3Rpb24oZmFsc2UpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWYWxpZGF0ZUFjdGlvbiNyZWZyZXNoVmlld3MoKQotCQkJICovCi0JCQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlld3MoKSB7Ci0JCQkJTGlicmFyeVZpZXcuZ2V0VmlldygpLnJlZnJlc2hWaWV3cygpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJlc291cmNlcyhDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCUFycmF5TGlzdDxFT2JqZWN0PiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8RU9iamVjdD4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCQllbGVtZW50cy5hZGRBbGwocmVzb3VyY2UuZ2V0Q29udGVudHMoKSk7Ci0JCQl9Ci0JCX0KLQkJTGlicmFyeVZhbGlkYXRlQWN0aW9uIHZhbGlkYXRlQWN0aW9uID0gY3JlYXRlVmFsaWRhdGVSZXNvdXJjZUFjdGlvbigpOwotCQl2YWxpZGF0ZUFjdGlvbi51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWxlbWVudHMpKTsKLQkJdmFsaWRhdGVBY3Rpb24ucnVuKCk7Ci0JCXJldHVybiB2YWxpZGF0ZUFjdGlvbi5pc1N1Y2Nlc3NmdWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdEJhc2VGb3JtRWRpdG9yI2RvU2F2ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5kb1NhdmU6IHNhdmluZyBjaGFuZ2VzIHRvIG1ldGhvZCBsaWJyYXJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXNhdmVNb2RpZmllZFJpY2hUZXh0KG1vZGlmaWVkUmljaFRleHQpOwotCi0JCWdldFBlcnNpc3RlcigpOwotCQl0cnkgewotCQkJLy8gY2hlY2sgZm9yIG1vZGlmaWFibGUKLQkJCS8vCi0JCQlDb2xsZWN0aW9uPFJlc291cmNlPiBtb2RpZmllZFJlc291cmNlcyA9IGdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCQkKLQkJCUFycmF5TGlzdDxSZXNvdXJjZT4gcmVzb3VyY2VzVG9TYXZlID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4obW9kaWZpZWRSZXNvdXJjZXMpOwotCi0JCQkvLyB1cGRhdGUgdmVyc2lvbiBpbmZvIGluIGxpYnJhcnkgcmVzb3VyY2UgaWYgbmVlZGVkIGJ5IGFkZGluZwotCQkJLy8gbGlicmFyeSByZXNvdXJjZSB0byBjb2xsZWN0aW9uCi0JCQkvLyBvZiBtb2RpZmllZCByZXNvdXJjZXMKLQkJCS8vCi0JCQlIYXNoU2V0PFJlc291cmNlPiByZXNvdXJjZXNUb1VwZGF0ZVZlcnNpb25JbmZvID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCQlpZiAoIW1vZGlmaWVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IFBlcnNpc3RlbmNlVXRpbAotCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJCQkJaWYgKG1lICE9IG51bGwpIHsKLQkJCQkJCU1ldGhvZExpYnJhcnkgbGliID0gVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KG1lKTsKLQkJCQkJCWlmIChsaWIgIT0gbnVsbCkgewotCQkJCQkJCVJlc291cmNlIGxpYlJlc291cmNlID0gbGliLmVSZXNvdXJjZSgpOwotCQkJCQkJCWlmIChsaWJSZXNvdXJjZSAhPSBudWxsCi0JCQkJCQkJCQkmJiAhbW9kaWZpZWRSZXNvdXJjZXMuY29udGFpbnMobGliUmVzb3VyY2UpCi0JCQkJCQkJCQkmJiAhcmVzb3VyY2VzVG9VcGRhdGVWZXJzaW9uSW5mbwotCQkJCQkJCQkJCQkuY29udGFpbnMobGliUmVzb3VyY2UpCi0JCQkJCQkJCQkmJiBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJCQkJCQkJLmNoZWNrVG9vbFZlcnNpb24obGliUmVzb3VyY2UpICE9IDApIHsKLQkJCQkJCQkJcmVzb3VyY2VzVG9VcGRhdGVWZXJzaW9uSW5mby5hZGQobGliUmVzb3VyY2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXNvdXJjZXNUb1NhdmUuYWRkQWxsKHJlc291cmNlc1RvVXBkYXRlVmVyc2lvbkluZm8pOwotCQkJfQotCi0JCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeSgKLQkJCQkJcmVzb3VyY2VzVG9TYXZlLCBnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQloYW5kbGVFcnJvcihzdGF0dXMpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gY2hlY2sgZm9yIG91dC1vZi1zeW5jaAotCQkJLy8KLQkJCWlmIChjaGVja0ZpbGVDaGFuZ2VkKHJlc291cmNlc1RvU2F2ZSkpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy51cGRhdGVfb3V0b2ZzeW5jaF90aXRsZTsKLQkJCQlTdHJpbmcgbXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudXBkYXRlX291dG9mc3luY2hfbXNnOwotCQkJCWlmICghQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheVByb21wdCh0aXRsZSwgbXNnKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBmbGFnIHRoZSByZXNvdXJjZXMgdG8gdXBkYXRlIHZlcnNpb24gaW5mbyBhcyBtb2RpZmllZCBzbyB0aGV5Ci0JCQkvLyB3aWxsIGJlIHNhdmVkCi0JCQkvLwotCQkJaWYgKCFyZXNvdXJjZXNUb1VwZGF0ZVZlcnNpb25JbmZvLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlc1RvVXBkYXRlVmVyc2lvbkluZm8uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQlyZXNvdXJjZS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKGlzVmFsaWRhdGVSZXNvdXJjZXNCZWZvcmVTYXZlUmVxdWlyZWQoKSkgewotCQkJCS8vIHZhbGlkYXRlCi0JCQkJLy8KLQkJCQlpZighdmFsaWRhdGVSZXNvdXJjZXMobW9kaWZpZWRSZXNvdXJjZXMpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBubyB2YWxpZGF0aW9uIGJlZm9yZSBzYXZlCi0JCQkJLy8gcmVtb3ZlIGFsbCB2YWxpZGF0aW9uIGVycm9ycyBtYXJrZXJzIGFzc29jaWF0ZWQgd2l0aCBjdXJyZW50IG1ldGhvZCBlbGVtZW50Ci0JCQkJLy8KLQkJCQlpZihMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlci5JTlNUQU5DRS5oYXNNYXJrZXJzKGVsZW1lbnRPYmopKSB7Ci0JCQkJCUxpYnJhcnlWYWxpZGF0aW9uTWFya2VySGVscGVyLklOU1RBTkNFLmRlbGV0ZU1hcmtlcnMoZWxlbWVudE9iaik7Ci0JCQkJCQotCQkJCQkvLyByZWZyZXNoIGxpYnJhcnkgdmlldwotCQkJCQkvLwotCQkJCQlMaWJyYXJ5VmlldyB2aWV3ID0gTGlicmFyeVZpZXcuZ2V0VmlldygpOwotCQkJCQlpZih2aWV3ICE9IG51bGwpIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvci5jbGVhckRlY29yYXRpb25DYWNoZSgpOwotCQkJCQkJdmlldy5nZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCQotCQkJLy8gU2F2ZS4KLQkJCS8vCi0JCQlPYmplY3Qgb2xkVmFsdWUgPSBwZXJzaXN0ZXIuZ2V0U2F2ZU9wdGlvbnMoKS5nZXQoCi0JCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5PUFRJT05TX09WRVJXUklUQUJMRV9SRVNPVVJDRVMpOyAKLQotCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzVG9BZGp1c3RMb2NhdGlvbiA9IG51bGw7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJcGVyc2lzdGVyLmdldFNhdmVPcHRpb25zKCkucHV0KAotCQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLk9QVElPTlNfT1ZFUldSSVRBQkxFX1JFU09VUkNFUywgCi0JCQkJCQlnZXRPdmVyd3JpdGFibGVSZXNvdXJjZXMoKSk7Ci0JCQkKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXNUb1NhdmUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZTsgCi0JCQkJCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UxOyAKLQkJCQkJCVN0cmluZyByZWFzb24gPSBlLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjEKLQkJCQkJCQkJOiBlLmdldE1lc3NhZ2UoKTsgCi0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJCQl0aXRsZSwgbXNnLCByZWFzb24sIGUpOwotCQkJCQkJdGhyb3cgZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJZGlydHkgPSBmYWxzZTsKLQkJCQkJYWN0aW9uTWdyLnNhdmVJc0RvbmUoKTsKLQkJCQkJY2hhbmdlVGltZSA9IC0xOwotCQkJCQlyZXNvdXJjZXNUb0FkanVzdExvY2F0aW9uID0gZ2V0UmVzb3VyY2VUb0FkanVzdExvY2F0aW9uKCk7CQotCQkJCQlzZXRSZXNvdXJjZUluZm9zKGdldFVzZWRSZXNvdXJjZXMoKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3RyaW5nIHJlYXNvbiA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCQlpZiAoU3RyVXRpbC5pc0JsYW5rKHJlYXNvbikpIHsKLQkJCQkJCXJlYXNvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24yOyAKLQkJCQkJfQotCQkJCQlTdHJpbmdXcml0ZXIgZGV0YWlscyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKGRldGFpbHMpKTsKLQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclRpdGxlOyAKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTI7IAotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJCXRpdGxlLCBtZXNzYWdlLCByZWFzb24sIGRldGFpbHMudG9TdHJpbmcoKSwgZSk7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJcGVyc2lzdGVyLmdldFNhdmVPcHRpb25zKCkucHV0KAotCQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLk9QVElPTlNfT1ZFUldSSVRBQkxFX1JFU09VUkNFUywKLQkJCQkJCW9sZFZhbHVlKTsKLQkJCX0KLQotCQkJLy8gUmVuYW1lCi0JCQkvLwotCQkJLy9Db2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXNUb0FkanVzdExvY2F0aW9uID0gZ2V0UmVzb3VyY2VUb0FkanVzdExvY2F0aW9uKCk7CQkJCQkJCi0JCQlpZiAocmVzb3VyY2VzVG9BZGp1c3RMb2NhdGlvbiAhPSBudWxsICYmICFyZXNvdXJjZXNUb0FkanVzdExvY2F0aW9uLmlzRW1wdHkoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5hZGp1c3RMb2NhdGlvbihyZXNvdXJjZXNUb0FkanVzdExvY2F0aW9uKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JUaXRsZTsgCi0JCQkJCVN0cmluZyB0ZW1wbGF0ZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvck1lc3NhZ2UxOyAKLQkJCQkJU3RyaW5nQnVmZmVyIGZpbGVMaXN0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXNUb0FkanVzdExvY2F0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJT2JqZWN0IG9iaiA9IEZpbGVNYW5hZ2VyLnRvRmlsZVN0cmluZyhyZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCQkJCQlpZihvYmogPT0gbnVsbCkgewotCQkJCQkJCW9iaiA9IHJlc291cmNlOwotCQkJCQkJfQotCQkJCQkJZmlsZUxpc3QuYXBwZW5kKG9iaikuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHRlbXBsYXRlLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IGZpbGVMaXN0IH0pOwotCQkJCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24xCi0JCQkJCQkJOiBlLmdldE1lc3NhZ2UoKTsgCi0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJdGl0bGUsIG1zZywgcmVhc29uLCBlKTsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0KLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3RyaW5nIHJlYXNvbiA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCQlpZiAoU3RyVXRpbC5pc0JsYW5rKHJlYXNvbikpIHsKLQkJCQkJCXJlYXNvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24yOyAKLQkJCQkJfQotCQkJCQlTdHJpbmdXcml0ZXIgZGV0YWlscyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKGRldGFpbHMpKTsKLQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yVGl0bGU7IAotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMjsgCi0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJdGl0bGUsIG1lc3NhZ2UsIHJlYXNvbiwgZGV0YWlscy50b1N0cmluZygpLCBlKTsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0KLQkJCQlyZXNvdXJjZXNUb0FkanVzdExvY2F0aW9uLmNsZWFyKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl0cnkgewotCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQlWaWV3SGVscGVyLnJlbG9hZEN1cnJlbnRMaWJhcnlPblJvbGxiYWNrRXJyb3IoZ2V0U2l0ZSgpCi0JCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldE92ZXJ3cml0YWJsZVJlc291cmNlcygpIHsKLQkJaWYocmVzb3VyY2VJbmZvTWFwID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCUFycmF5TGlzdDxSZXNvdXJjZT4gcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VJbmZvTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2VJbmZvIGluZm8gPSAoUmVzb3VyY2VJbmZvKSBpdGVyLm5leHQoKTsKLQkJCWlmKGluZm8ub3ZlcndyaXRlKSB7Ci0JCQkJcmVzb3VyY2VzLmFkZChpbmZvLnJlc291cmNlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVzb3VyY2VUb0FkanVzdExvY2F0aW9uKCkgewotCQlpZihyZXNvdXJjZUluZm9NYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJQXJyYXlMaXN0PFJlc291cmNlPiByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZUluZm9NYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZUluZm8gaW5mbyA9IChSZXNvdXJjZUluZm8pIGl0ZXIubmV4dCgpOwotCQkJaWYoaW5mby5hZGp1c3RMb2NhdGlvbikgewotCQkJCXJlc291cmNlcy5hZGQoaW5mby5yZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZGF0ZVJlc291cmNlc0JlZm9yZVNhdmVSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5pc01vZGlmaWVkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJZ2V0UGVyc2lzdGVyKCkuc2F2ZShyZXNvdXJjZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZTsgCi0JCQkJU3RyaW5nIHRlbXBsYXRlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UxOyAKLQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQodGVtcGxhdGUsCi0JCQkJCQluZXcgT2JqZWN0W10geyByZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSB9KTsKLQkJCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24xCi0JCQkJCQk6IGUuZ2V0TWVzc2FnZSgpOyAKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJdGl0bGUsIG1zZywgcmVhc29uLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVByZXZpZXdQYWdlKCkgewotCQlDb21wb3NpdGUgcGFyZW50ID0gZ2V0Q29udGFpbmVyKCk7Ci0JCUNvbXBvc2l0ZSBwcmV2aWV3Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcHJldmlld0NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJUHJldmlld1BhZ2UgcGFnZSA9IG5ldyBQcmV2aWV3UGFnZShwcmV2aWV3Q29tcG9zaXRlKTsKLQkJcHJldmlld2VyID0gcGFnZS5nZXRQcmV2aWV3Vmlld2VyKCk7Ci0KLQkJcHJldmlld19wYWdlX2luZGV4ID0gYWRkUGFnZShwcmV2aWV3Q29tcG9zaXRlKTsKLQkJc2V0UGFnZVRleHQocHJldmlld19wYWdlX2luZGV4LCBBdXRob3JpbmdVSVJlc291cmNlcy5wcmV2aWV3UGFnZV90aXRsZSk7IAotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGxpc3RlbiB0byB0aGUgdGFiIGNoYW5nZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYWdlQ2hhbmdlKGludCBuZXdQYWdlSW5kZXgpIHsKLQkJc3VwZXIucGFnZUNoYW5nZShuZXdQYWdlSW5kZXgpOwotCi0JCWlmIChwcmV2aWV3X3BhZ2VfaW5kZXggPT0gbmV3UGFnZUluZGV4ICYmIHByZXZpZXdlciAhPSBudWxsKSB7Ci0JCQkvLyBVc2UgdGhlIGRlZmF1bHQgbGF5b3V0IG1hbmFnZXIuCi0JCQkvL3ByZXZpZXdlci5zZXRMYXlvdXRNYW5hZ2VyKG51bGwpOwotCQkJcHJldmlld2VyLnNob3dFbGVtZW50Q29udGVudChlbGVtZW50T2JqKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpcnR5KCkgewotCQlkaXJ0eSA9IHRydWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlIHZhbHVlIG9mIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuCi0JICogCQlib29sZWFuIHZhbHVlIHRvIGluZGljYXRlIHdoZXRoZXIgY29udHJvbCB3YXMgcmVzdG9yZWQgb3Igbm90Ci0JICovCi0JcHVibGljIGJvb2xlYW4gbXVzdFJlc3RvcmVWYWx1ZShPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh3aWRnZXRUb0NoZWNrID09IGNvbnRyb2wpIHsKLQkJCS8vIHRoZSBjb250cm9sIGlzIGN1cnJlbnRseSBiZWluZyBjaGVja2VkIGZvciBlZGl0YWJsZSwgYnV0IHRoZXJlIGlzCi0JCQkvLyBzdGlsbCBmb2N1cyBsb3N0Ci0JCQkvLyBldmVudCBpcyBiZWluZyBzZW50IG91dCBldmVuIHRoZSBjaGVjayBpcyBub3QgY29tcGxldGVkIHlldC4KLQkJCS8vIHJldHVybiB0cnVlIHNvIHRoZSBmb2N1c0xvc3QoKSB3aWxsIG5vdCBtYWtlIGFueSBjaGFuZ2UgdG8gdGhlCi0JCQkvLyBjb250cm9sLgotCQkJLy8KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJT2JqZWN0IGVkaXRDb250cm9sID0gY29udHJvbDsKLQkJaWYgKGVkaXRDb250cm9sIGluc3RhbmNlb2YgTWV0aG9kUmljaFRleHRFZGl0b3IpIHsKLQkJCWVkaXRDb250cm9sID0gKChNZXRob2RSaWNoVGV4dEVkaXRvcikgY29udHJvbCkuZ2V0UmljaFRleHRDb250cm9sKCk7Ci0JCX0KLQkJYm9vbGVhbiByZXN0b3JlID0gd2lkZ2V0c1RvUmVzdG9yZVZhbHVlLmNvbnRhaW5zKGVkaXRDb250cm9sKTsKLQkJaWYgKCFyZXN0b3JlKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHdpZGdldHNUb1Jlc3RvcmVWYWx1ZSkgewotCQkJCXJlc3RvcmUgPSB3aWRnZXRzVG9SZXN0b3JlVmFsdWUuY29udGFpbnMoZWRpdENvbnRyb2wpOwotCQkJfQotCQl9Ci0JCWlmIChyZXN0b3JlKSB7Ci0JCQlpZiAoZWRpdENvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJVGV4dCB0ZXh0ID0gKChUZXh0KSBlZGl0Q29udHJvbCk7Ci0JCQkJdGV4dC5zZXRUZXh0KChTdHJpbmcpIHZhbHVlKTsKLQkJCX0gZWxzZSBpZiAoZWRpdENvbnRyb2wgaW5zdGFuY2VvZiBJTWV0aG9kUmljaFRleHQpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgcmljaFRleHQgPSAoSU1ldGhvZFJpY2hUZXh0KSBlZGl0Q29udHJvbDsKLQkJCQlyaWNoVGV4dC5zZXRUZXh0KChTdHJpbmcpIHZhbHVlKTsKLQkJCX0KLQkJCXdpZGdldHNUb1Jlc3RvcmVWYWx1ZS5yZW1vdmUoZWRpdENvbnRyb2wpOwotCQl9Ci0JCXJldHVybiByZXN0b3JlOwotCX0KLQotCS8qKgotCSAqIE1vZGlmeSBMaXN0ZW5lciAKLQkgKgotCSAqLwotCXB1YmxpYyBjbGFzcyBNb2RpZnlMaXN0ZW5lciBpbXBsZW1lbnRzCi0JCQlvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyIHsKLQotCQlwcml2YXRlIEVPYmplY3QgZWxlbWVudDsKLQotCQlwcml2YXRlIGJvb2xlYW4gY2hlY2tDb250YWluZXJSZXNvdXJjZTsKLQotCQlwcml2YXRlIGJvb2xlYW4gZGlzYWJsZWQgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkJICovCi0JCXB1YmxpYyBNb2RpZnlMaXN0ZW5lcihFT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gY2hlY2tDb250YWluZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQljaGVja0NvbnRhaW5lclJlc291cmNlID0gY2hlY2tDb250YWluZXI7Ci0JCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHJlc3RvcmVUZXh0KE9iamVjdCBjb250cm9sLCBTdHJpbmcgdHh0KSB7Ci0JCQlib29sZWFuIG9sZCA9IGRpc2FibGVkOwotCQkJdHJ5IHsKLQkJCQlkaXNhYmxlZCA9IHRydWU7Ci0JCQkJT2JqZWN0IGVkaXRDb250cm9sID0gY29udHJvbDsKLQkJCQlpZiAoZWRpdENvbnRyb2wgaW5zdGFuY2VvZiBNZXRob2RSaWNoVGV4dEVkaXRvcikgewotCQkJCQllZGl0Q29udHJvbCA9ICgoTWV0aG9kUmljaFRleHRFZGl0b3IpIGNvbnRyb2wpCi0JCQkJCQkJLmdldFJpY2hUZXh0Q29udHJvbCgpOwotCQkJCX0KLQkJCQlpZiAoZWRpdENvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJCVRleHQgdGV4dCA9ICgoVGV4dCkgZWRpdENvbnRyb2wpOwotCQkJCQl0ZXh0LnNldFRleHQodHh0KTsKLQkJCQl9IGVsc2UgaWYgKGVkaXRDb250cm9sIGluc3RhbmNlb2YgSU1ldGhvZFJpY2hUZXh0KSB7Ci0JCQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IChJTWV0aG9kUmljaFRleHQpIGVkaXRDb250cm9sOwotCQkJCQlyaWNoVGV4dC5zZXRUZXh0KHR4dCk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlkaXNhYmxlZCA9IG9sZDsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBjaGVja0VkaXQoRU9iamVjdCBlbGVtZW50LCBPYmplY3QgY29udHJvbCwKLQkJCQlib29sZWFuIGNoZWNrQ29udGFpbmVyUmVzb3VyY2UpIHsKLQkJCS8vIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgd2lkZ2V0IHNvIG11c3RSZXN0b3JlVmFsdWUoKSBjYW4KLQkJCS8vIHVzZSBpdCB0byBjaGVjawotCQkJLy8gd2hldGhlciBhIGZvY3VzIGxvc3QgZXZlbnQgaXMgdHJpZ2dlcmVkIGR1cmluZyBhIGNoZWNrRWRpdC4KLQkJCS8vIG11c3RSZXN0b3JlVmFsdWUoKSB0aGVuCi0JCQkvLyByZXR1cm5zIHRydWUgc28gZm9jdXNMb3N0KCkgd2lsbCBub3QgdHJ5IHRvIG1ha2UgY2hhbmdlIHRvIHRoZQotCQkJLy8gdmFsdWUgYm91bmQgdG8gdGhlIHdpZGdldAotCQkJLy8KLQkJCXdpZGdldFRvQ2hlY2sgPSBjb250cm9sOwotCQkJdHJ5IHsKLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLmNoZWNrRWRpdDogZW50ZXIsIGNvbnRyb2w9IiArIGNvbnRyb2wpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJCQlpZiAod2lkZ2V0c1RvUmVzdG9yZVZhbHVlLmNvbnRhaW5zKGNvbnRyb2wpKSB7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5jaGVja0VkaXQ6IHdpZGdldCBmb3VuZCBpbiB3aWRnZXRzVG9SZXN0b3JlVmFsdWUsIGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlzeW5jaHJvbml6ZWQgKHdpZGdldHNUb1Jlc3RvcmVWYWx1ZSkgewotCQkJCQlpZiAod2lkZ2V0c1RvUmVzdG9yZVZhbHVlLmNvbnRhaW5zKGNvbnRyb2wpKSB7Ci0JCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5jaGVja0VkaXQ6IHdpZGdldCBmb3VuZCBpbiB3aWRnZXRzVG9SZXN0b3JlVmFsdWUsIGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkJc3RhdHVzID0gVG5nVXRpbC5jaGVja0VkaXQoZWxlbWVudCwgZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCi0JCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBJUmljaFRleHQpIHsKLQkJCQkJCQkoKElSaWNoVGV4dCkgY29udHJvbCkucmVzdG9yZVRleHQoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaWYgKGNvbnRyb2wgPT0gY3VycmVudEZlYXR1cmVFZGl0b3IpIHsKLQkJCQkJCQkJcmVzdG9yZVRleHQoY29udHJvbCwgKFN0cmluZykgZWxlbWVudAotCQkJCQkJCQkJCS5lR2V0KGN1cnJlbnRFZGl0ZWRGZWF0dXJlKSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gQWRkIHRoZSBjb250cm9sIHRvIHRoZSBsaXN0IG9mIHdpZGdldHMgd2hvc2UKLQkJCQkJCQkJLy8gdmFsdWUgbmVlZHMKLQkJCQkJCQkJLy8gdG8gYmUgcmVzdG9yZWQgdG8gdGhlIG9yaWdpbmFsIG9uZS4uCi0JCQkJCQkJCXdpZGdldHNUb1Jlc3RvcmVWYWx1ZS5hZGQoY29udHJvbCk7Ci0JCQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5jaGVja0VkaXQ6IGFkZGVkIHdpZGdldCB0byB3aWRnZXRzVG9SZXN0b3JlVmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKGNoZWNrQ29udGFpbmVyUmVzb3VyY2UpIHsKLQkJCQkJCWlmIChlbGVtZW50LmVDb250YWluZXIoKSAhPSBudWxsCi0JCQkJCQkJCSYmIGVsZW1lbnQuZUNvbnRhaW5lcigpLmVSZXNvdXJjZSgpICE9IGVsZW1lbnQKLQkJCQkJCQkJCQkuZVJlc291cmNlKCkpIHsKLQkJCQkJCQlzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChlbGVtZW50LmVDb250YWluZXIoKSwKLQkJCQkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQkJLy8gLy8gQWRkIHRoZSBjb250cm9sIHRvIHRoZSBsaXN0IG9mIHdpZGdldHMKLQkJCQkJCQkJLy8gd2hvc2UgdmFsdWUKLQkJCQkJCQkJLy8gLy8gbmVlZHMgdG8gYmUgcmVzdG9yZWQgdG8gdGhlIG9yaWdpbmFsIG9uZS4KLQkJCQkJCQkJLy8gaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCS8vIFN5c3RlbS5vdXQKLQkJCQkJCQkJLy8gLnByaW50bG4oIk1ldGhvZEVsZW1lbnRFZGl0b3IuY2hlY2tFZGl0OgotCQkJCQkJCQkvLyBhZGRlZCB3aWRnZXQgdG8gd2lkZ2V0c1RvUmVzdG9yZVZhbHVlIik7Ci0JCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJLy8gfQotCQkJCQkJCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIElSaWNoVGV4dCkgewotCQkJCQkJCQkJKChJUmljaFRleHQpIGNvbnRyb2wpLnJlc3RvcmVUZXh0KCk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlpZiAoY29udHJvbCA9PSBjdXJyZW50RmVhdHVyZUVkaXRvcikgewotCQkJCQkJCQkJCXJlc3RvcmVUZXh0KGNvbnRyb2wsIChTdHJpbmcpIGVsZW1lbnQKLQkJCQkJCQkJCQkJCS5lR2V0KGN1cnJlbnRFZGl0ZWRGZWF0dXJlKSk7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCXdpZGdldHNUb1Jlc3RvcmVWYWx1ZS5hZGQoY29udHJvbCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQsIAotCQkJCQkJCXN0YXR1cyk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJLy8gY2xlYXIgdGhlIHJlZmVyZW5jZSB3aGVuIHRoZSBjaGVjayBpcyBkb25lCi0JCQkJLy8KLQkJCQl3aWRnZXRUb0NoZWNrID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXIjbW9kaWZ5VGV4dChNb2RpZnlFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIk1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIubW9kaWZ5VGV4dDogZW50ZXIsIGRpc2FibGVkPSIgKyBkaXNhYmxlZCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmICghZGlzYWJsZWQgJiYgZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKGUud2lkZ2V0ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCU9iamVjdCB3aWRnZXQgPSBlLndpZGdldDsKLQkJCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgQnJvd3NlcikgewotCQkJCQl3aWRnZXQgPSAoKEJyb3dzZXIpIHdpZGdldCkKLQkJCQkJCQkuZ2V0RGF0YShJTWV0aG9kUmljaFRleHQuUFJPUEVSVFlfTkFNRSk7Ci0JCQkJCWlmICh3aWRnZXQgPT0gbnVsbCkgewotCQkJCQkJd2lkZ2V0ID0gZS53aWRnZXQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lci5tb2RpZnlUZXh0OiB3aWRnZXQ9IiArIHdpZGdldCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCQlpZiAod2lkZ2V0c1RvUmVzdG9yZVZhbHVlLmNvbnRhaW5zKHdpZGdldCkpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyLm1vZGlmeVRleHQ6IHdpZGdldCBmb3VuZCBpbiB3aWRnZXRzVG9SZXN0b3JlVmFsdWUsIGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlpZiAoIWNoZWNrRWRpdChlbGVtZW50LCB3aWRnZXQsIGNoZWNrQ29udGFpbmVyUmVzb3VyY2UpKSB7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lci5tb2RpZnlUZXh0OiBjaGVja0VkaXQgZmFpbGVkLCBleGl0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIElNZXRob2RSaWNoVGV4dCkgewotCQkJCQlJTWV0aG9kUmljaFRleHQgcmljaFRleHQgPSAoSU1ldGhvZFJpY2hUZXh0KSB3aWRnZXQ7Ci0JCQkJCXNldE1vZGlmaWVkUmljaFRleHQocmljaFRleHQpOwotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIk1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIubW9kaWZ5VGV4dDogYWRkaW5nIHRvIG1vZGlmaWVkUmljaFRleHRzIGxpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lci5tb2RpZnlUZXh0OiBtYXJraW5nIGVkaXRvciBhcyBkaXJ0eSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXNldERpcnR5KCk7Ci0JCQl9Ci0KLQkJCWlmIChERUJVRykgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyLm1vZGlmeVRleHQ6IGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFNldHMgdGhlIHVuZGVybHlpbmcgbW9kZWwgZWxlbWVudC4KLQkJICogCi0JCSAqIEBwYXJhbSBlbGVtZW50Ci0JCSAqICAgICAgICAgICAgQSBtZXRob2QgZWxlbWVudC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEVsZW1lbnQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNldHMgdGhlIGRpc2FibGUgZmxhZy4KLQkJICogCi0JCSAqIEBwYXJhbSBkaXNhYmxlZAotCQkgKiAgICAgICAgICAgIElmIDxjb2RlPnRydWU8L2NvZGU+LCBpZ25vcmUgdGhlIG1vZGlmeSBldmVudHMuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXREaXNhYmxlKGJvb2xlYW4gZGlzYWJsZWQpIHsKLQkJCXRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gbmV3IGluc3RhbmNlIG9mIE1vZGlmeUxpc3RlbmVyIHRoYXQgc3VwcG9ydHMgdGVhbSBhbmQgQ00KLQkgKiBpbnRlZ3JhdGlvbiBBbnkgY29udHJvbCBpbiB0aGUgZWRpdG9yLCBpZiBpdCBuZWVkcyBhIE1vZGlmeUxpc3RlbmVyLCBtdXN0Ci0JICogdXNlIG9uZSBjcmVhdGVkIGJ5IHRoaXMgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVPYmoKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1vZGlmeUxpc3RlbmVyIGNyZWF0ZU1vZGlmeUxpc3RlbmVyKEVPYmplY3QgZU9iaikgewotCQlyZXR1cm4gY3JlYXRlTW9kaWZ5TGlzdGVuZXIoZU9iaiwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gbmV3IGluc3RhbmNlIG9mIE1vZGlmeUxpc3RlbmVyIHRoYXQgc3VwcG9ydHMgdGVhbSBhbmQgQ00KLQkgKiBpbnRlZ3JhdGlvbiBBbnkgY29udHJvbCBpbiB0aGUgZWRpdG9yLCBpZiBpdCBuZWVkcyBhIE1vZGlmeUxpc3RlbmVyLCBtdXN0Ci0JICogdXNlIG9uZSBjcmVhdGVkIGJ5IHRoaXMgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVPYmoKLQkgKiBAcGFyYW0gY2hlY2tDb250YWluZXIKLQkgKiAgICAgICAgICAgIGlmIHRydWUgd2lsbCBjaGVjayB0aGUgY29udGFpbmVyIG9mIHRoZSBnaXZlbiBvYmplY3QgZm9yCi0JICogICAgICAgICAgICBlZGl0YWJsZSBhcyB3ZWxsIHdoZW4gY2hlY2tpbmcgdGhlIGdpdmVuIG9iamVjdCBmb3IgZWRpdGFibGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQlNb2RpZnkgTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgTW9kaWZ5TGlzdGVuZXIgY3JlYXRlTW9kaWZ5TGlzdGVuZXIoRU9iamVjdCBlT2JqLAotCQkJYm9vbGVhbiBjaGVja0NvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IE1vZGlmeUxpc3RlbmVyKGVPYmosIGNoZWNrQ29udGFpbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzcGVjaWZpZWQgY29udHJvbCB0byBiZSB0aGUgY3VycmVudCBlZGl0b3Igb2YgdGhlIHNwZWNpZmllZAotCSAqIGZlYXR1cmUuCi0JICogCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKE9iamVjdCBjb250cm9sLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJY3VycmVudEZlYXR1cmVFZGl0b3IgPSBjb250cm9sOwotCQljdXJyZW50RWRpdGVkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbW9uaXRvckNoYW5nZSgpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcmVnaXN0cnkKLQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoIm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnJlZnJlc2hQcm92aWRlcnMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocG9pbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBwb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oImV4dGVuc2lvbjogVUlEPSIgKyBleHRlbnNpb24uZ2V0VW5pcXVlSWRlbnRpZmllcigpICsgIiwgIiArIGV4dGVuc2lvbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgTWFwPFJlc291cmNlLCBSZXNvdXJjZUluZm8+IGdldFJlc291cmNlSW5mb01hcCgpIHsKLQkJaWYocmVzb3VyY2VJbmZvTWFwID09IG51bGwpIHsKLQkJCXJlc291cmNlSW5mb01hcCA9IG5ldyBIYXNoTWFwPFJlc291cmNlLCBSZXNvdXJjZUluZm8+KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlSW5mb01hcDsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgcmVzb3VyY2UgdG8gYWRqdXN0IGxvY2F0aW9uCi0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgYWRkUmVzb3VyY2VUb0FkanVzdExvY2F0aW9uKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCVJlc291cmNlSW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VJbmZvTWFwKCkuZ2V0KHJlc291cmNlKTsKLQkJaWYoaW5mbyA9PSBudWxsKSB7Ci0JCQlpbmZvID0gbmV3IFJlc291cmNlSW5mbyhyZXNvdXJjZSk7Ci0JCQlnZXRSZXNvdXJjZUluZm9NYXAoKS5wdXQocmVzb3VyY2UsIGluZm8pOwotCQl9Ci0JCWluZm8uYWRqdXN0TG9jYXRpb24gPSB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldFVzZWRGZWF0dXJlcygpIHsKLQkJcmV0dXJuIGVsZW1lbnRPYmouZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCX0KLQotCS8qKgotCSAqIEdldHMgcmVzb3VyY2VzIHRoYXQgYXJlIGN1cnJlbnRseSBiZWluZyB1c2VkIGJ5IHRoaXMgZWRpdG9ycwotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCWxpc3Qgb2YgdXNlZCByZXNvdXJjZXMKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0VXNlZFJlc291cmNlcygpIHsKLQkJSGFzaFNldDxSZXNvdXJjZT4gcmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZWxlbWVudE9iai5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQl9Ci0JCUxpc3QgYWxsRmVhdHVyZXMgPSBnZXRVc2VkRmVhdHVyZXMoKTsKLQkJZm9yIChpbnQgaSA9IGFsbEZlYXR1cmVzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGFsbEZlYXR1cmVzCi0JCQkJCS5nZXQoaSk7Ci0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUxpc3QgdmFsdWVzID0gKExpc3QpIGVsZW1lbnRPYmouZUdldChmZWF0dXJlKTsKLQkJCQlmb3IgKGludCBqID0gdmFsdWVzLnNpemUoKSAtIDE7IGogPiAtMTsgai0tKSB7Ci0JCQkJCUVPYmplY3QgdmFsdWUgPSAoRU9iamVjdCkgdmFsdWVzLmdldChqKTsKLQkJCQkJaWYgKHZhbHVlLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJCXJlc291cmNlcy5hZGQodmFsdWUuZVJlc291cmNlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50T2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRU9iamVjdAotCQkJCQkJJiYgKHJlc291cmNlID0gKChFT2JqZWN0KSB2YWx1ZSkuZVJlc291cmNlKCkpICE9IG51bGwpIHsKLQkJCQkJcmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWxhc3RVc2VkUmVzb3VyY2VzID0gcmVzb3VyY2VzOwotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCXByaXZhdGUgTWFwIGdldFVSSVRvVXNlZFJlc291cmNlTWFwKCkgewotCQlIYXNoTWFwPFVSSSwgUmVzb3VyY2U+IG1hcCA9IG5ldyBIYXNoTWFwPFVSSSwgUmVzb3VyY2U+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFVzZWRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCW1hcC5wdXQocmVzb3VyY2UuZ2V0VVJJKCksIHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUVycm9yKElTdGF0dXMgc3RhdHVzKSB7Ci0JCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5KAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQsIAotCQkJCXN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyB0aGUgYWN0aXZhdGlvbiBvZiB0aGlzIHZpZXcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGUoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkvLyBUT0RPOiBSZXZpZXcgaW1wbGVtZW50YXRpb24uCi0JCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBtZXRob2QgbGlicmFyeSBvcGVuIGlzIG5vdCBjbG9zZWQuCi0JCVhNSUxpYnJhcnlVdGlsLm9wZW5NZXRob2RMaWJyYXJ5UHJvamVjdChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkKLQkJCQkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJaWYgKGNoZWNrRmlsZUNoYW5nZWRSZXF1aXJlZCkgewotCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gdXNlZFJlc291cmNlcyA9IGdldFVzZWRSZXNvdXJjZXMoKTsKLQkJCWlmIChjaGVja0ZpbGVDaGFuZ2VkKHVzZWRSZXNvdXJjZXMpKSB7Ci0JCQkJaGFuZGxlRmlsZUNoYW5nZWQodXNlZFJlc291cmNlcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyBhIGRpYWxvZyB0aGF0IGFza3MgaWYgY29uZmxpY3RpbmcgY2hhbmdlcyBzaG91bGQgYmUgZGlzY2FyZGVkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZURpcnR5Q29uZmxpY3QoKSB7Ci0JCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9GaWxlQ29uZmxpY3RfbGFiZWw7Ci0JCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5fV0FSTl9GaWxlQ29uZmxpY3Q7Ci0JCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheVByb21wdCgKLQkJCQl0aXRsZSwgbXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGNoYW5nZWQgcmVzb3VyY2VzIHdoZW4gdGhpcyB2aWV3IGlzIGFjdGl2YXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCkgewotCQlpZiAoKGVsZW1lbnRPYmouZUlzUHJveHkoKSB8fCAhY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpCi0JCQkJJiYgKCFpc0RpcnR5KCkgfHwgaGFuZGxlRGlydHlDb25mbGljdCgpKSkgewotCQkJLy8gZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5mbHVzaCgpOwotCi0JCQkvLyBmb3IgKEl0ZXJhdG9yIGkgPSBjaGFuZ2VkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJLy8gUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGkubmV4dCgpOwotCQkJLy8gaWYgKHJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCS8vIGlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQkvLyB0cnkgewotCQkJLy8gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzb3VyY2UpLnJlbG9hZChudWxsKTsKLQkJCS8vIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIGVsc2UgewotCQkJLy8gcmVzb3VyY2UudW5sb2FkKCk7Ci0JCQkvLyB0cnkgewotCQkJLy8gcmVzb3VyY2UubG9hZChDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQkJLy8gfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgaW5wdXQgaXMgdmFsaWQgb3Igbm90Ci0JICogQHJldHVybiBib29sZWFuIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnB1dFZhbGlkKCkgewotCQlpZiAoZWxlbWVudE9iaiAhPSBudWxsICYmIGVsZW1lbnRPYmouZUlzUHJveHkoKSkgewotCQkJRU9iamVjdCBlID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc29sdmUoZWxlbWVudE9iaik7Ci0JCQlyZXR1cm4gKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmICFlLmVJc1Byb3h5KCkgJiYgVW1hVXRpbAotCQkJCQkuZ2V0TWV0aG9kTGlicmFyeShlKSA9PSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQYWdlcygpIHsKLQkJd2hpbGUgKGdldFBhZ2VDb3VudCgpID4gMCkgewotCQkJcmVtb3ZlUGFnZSgwKTsKLQkJfQotCQlhZGRQYWdlcygpOwotCX0KLQotCXByb3RlY3RlZCBJRWRpdG9ySW5wdXQgY3JlYXRlSW5wdXQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KGUpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWZyZXNoKGZpbmFsIGJvb2xlYW4gZm9yY2UpIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlDb2xsZWN0aW9uPFJlc291cmNlPiB1c2VkUmVzb3VyY2VzID0gbGFzdFVzZWRSZXNvdXJjZXM7Ci0JCQkJCQlpZiAoIWZvcmNlICYmICFlbGVtZW50T2JqLmVJc1Byb3h5KCkKLQkJCQkJCQkJJiYgIWNoZWNrUmVsb2FkZWQodXNlZFJlc291cmNlcykpIHsKLQkJCQkJCQkvLyBubyByZXNvdXJjZSByZWxvYWRlZCwgbm8gbmVlZCB0byByZWZyZXNoCi0JCQkJCQkJLy8KLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlpbnQgYWN0aXZlUGFnZUluZGV4ID0gZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQkJbW9kaWZpZWRSaWNoVGV4dCA9IG51bGw7Ci0JCQkJCQlpZiAoaXNEaXJ0eSgpKSB7Ci0JCQkJCQkJYWN0aW9uTWdyLnVuZG9BbGwoKTsKLQkJCQkJCQlkaXJ0eSA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQkJaWYgKGVsZW1lbnRPYmouZUlzUHJveHkoKSkgewotCQkJCQkJCWVsZW1lbnRPYmouZUFkYXB0ZXJzKCkucmVtb3ZlKG5hbWVDaGFuZ2VkTGlzdGVuZXIpOwotCQkJCQkJCUVPYmplY3QgZSA9IFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNvbHZlKAotCQkJCQkJCQkJZWxlbWVudE9iaik7Ci0JCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCQkJCQkmJiAhZS5lSXNQcm94eSgpCi0JCQkJCQkJCQkmJiBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZSkgPT0gTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpIHsKLQkJCQkJCQkJc2V0SW5wdXQoY3JlYXRlSW5wdXQoKE1ldGhvZEVsZW1lbnQpIGUpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBpbnB1dCBlbGVtZW50IGlzIGludmFsaWQsIGNsb3NlIHRoZSBlZGl0b3IKLQkJCQkJCQkJLy8KLQkJCQkJCQkJY2xvc2UoZmFsc2UpOwotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJc2V0UmVzb3VyY2VJbmZvcyh1c2VkUmVzb3VyY2VzKTsKLQkJCQkJCXVwZGF0ZVBhZ2VzKCk7Ci0JCQkJCQlpZiAoYWN0aXZlUGFnZUluZGV4ICE9IC0xKSB7Ci0JCQkJCQkJc2V0QWN0aXZlUGFnZShhY3RpdmVQYWdlSW5kZXgpOwotCQkJCQkJfQotCQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOwotCQkJCQl9Ci0KLQkJCQl9KTsKLQotCX0KLQotCS8qKgotCSAqIFJlZnJlc2hlcyB0aGUgZWRpdG9yCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJcmVmcmVzaChSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzKSB7Ci0JCS8vIHNhdmUgY2hhbmdlZCByZXNvdXJjZXMgYmVmb3JlIHJlZnJlc2ggc28gYWN0aW9uIG1hbmFnZXIgd2lsbCBub3QgdHJ5Ci0JCS8vIHRvIHNhdmUgdGhlc2UgY2hhbmdlZCByZXNvdXJjZXMKLQkJLy8KLQkJdGhpcy5jaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbChjaGFuZ2VkUmVzb3VyY2VzKTsKLQkJcmVmcmVzaChmYWxzZSk7Ci0JCXRoaXMuY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOwkJCi0JfQotCi0KLQkvKioKLQkgKiBQdWJsaWMgbWV0aG9kIHRvIHJlZnJlc2ggZWRpdG9yIHRpdGxlIGltYWdlIG9uIGNlcnRhaW4gYWN0aW9uLgotCSAqIGUuZy4gSWYgbWV0aG9kUGx1Z2luIGlzIGxvY2tlZCwgZWRpdG9yIHRpdGxlIGltYWdlIHNob3VsZCBiZSBncmV5LWVkIG91dC4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hUaXRsZUltYWdlKCkgewotCQlpZiAoZk1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyICE9IG51bGwpCi0JCQlmTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIudXBkYXRlRWRpdG9ySW1hZ2UoZWxlbWVudE9iaik7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlZFRpdGxlSW1hZ2UoSW1hZ2UgaW1hZ2UpIHsKLQkJc2V0VGl0bGVJbWFnZShpbWFnZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQkJaWYobWFya2VyLmdldFJlc291cmNlKCkgPT0gZWxlbWVudEZpbGUpIHsKLQkJCXRyeSB7Ci0JCQkJT2JqZWN0IHZhbCA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIuR1VJRCk7Ci0JCQkJaWYodmFsIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgdmFsOwotCQkJCQlNZXRob2RFbGVtZW50IGUgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQkJCWlmKGUgIT0gZWxlbWVudE9iaikgewotCQkJCQkJLy8gd3JvbmcgZWxlbWVudCBpcyBvcGVuZWQgYmVjYXVzZSBlbGVtZW50IGZyb20gdGhlCi0JCQkJCQkvLyBtYXJrZXIgaXMgbm90IHRoZSB0b3AgZWxlbWVudCBpbiBpdHMgcmVzb3VyY2UKLQkJCQkJCS8vIGNsb3NlIHRoaXMgZWRpdG9yIGFuZCBvcGVuIHRoZSByaWdodCBvbmUKLQkJCQkJCS8vCi0JCQkJCQljbG9zZShmYWxzZSk7Ci0JCQkJCQlJRWRpdG9yS2VlcGVyLlJFRkVSRU5DRS5nZXRFZGl0b3JLZWVwZXIoKS5vcGVuRWRpdG9yKGUpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0KLQkJCX0KLQkJfQotCQkKLQkJLy8gb3BlbiBkZXNjcmlwdGlvbiBwYWdlCi0JCXNldEFjdGl2ZVBhZ2UoMCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCgpIHsKLQkJcmV0dXJuIGRpc3Bvc2VkOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZhOThiNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kRWxlbWVudEVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5JTWV0aG9kRWxlbWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBBbiBlZGl0b3IgaW5wdXQgZm9yIG1ldGhvZCBlbGVtZW50IGVkaXRvcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElFZGl0b3JJbnB1dCwgSU1ldGhvZEVsZW1lbnRQcm92aWRlciB7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudDsKLQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0KLQkvLyB0aGUgY3VycmVudCBvYmplY3QgYmVpbmcgZWRpdGVkIGJ5IHRoZSBSVEUKLQlwcml2YXRlIEVPYmplY3QgZk1vZGFsT2JqZWN0OwotCi0JLy8gdGhlIGN1cnJlbnQgZmVhdHVyZSBiZWluZyBlZGl0ZWQgYnkgdGhlIFJURQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZNb2RhbE9iamVjdEZlYXR1cmU7Ci0KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KE1ldGhvZEVsZW1lbnQgZSkgewotCQltZXRob2RFbGVtZW50ID0gZTsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNleGlzdHMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldEltYWdlRGVzY3JpcHRvcigpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudC5nZXROYW1lKCk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gTmFtZSBvZiBtZXRob2QgZWxlbWVudCArICIuIiArIG5hbWUgb2YgZmVhdHVyZSBiZWluZyBlZGl0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gZ2V0TmFtZSgpOwotCQlpZiAoZk1vZGFsT2JqZWN0RmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgKz0gIi4iOwotCQkJcmVzdWx0ICs9IGZNb2RhbE9iamVjdEZlYXR1cmUuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0UGVyc2lzdGFibGUoKQotCSAqLwotCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRUb29sVGlwVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChnZXRDbGFzcygpLmlzSW5zdGFuY2Uob2JqKSkgewotCQkJcmV0dXJuIG1ldGhvZEVsZW1lbnQgPT0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIG9iaikuZ2V0TWV0aG9kRWxlbWVudCgpICYmCi0JCQlmTW9kYWxPYmplY3QgPT0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIG9iaikuZ2V0TW9kYWxPYmplY3QoKSAmJgotCQkJZk1vZGFsT2JqZWN0RmVhdHVyZSA9PSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgb2JqKS5nZXRNb2RhbE9iamVjdEZlYXR1cmUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCByZXN1bHQgPSBtZXRob2RFbGVtZW50Lmhhc2hDb2RlKCk7Ci0JCWlmIChmTW9kYWxPYmplY3QgIT0gbnVsbCkgewotCQkJcmVzdWx0IF49IGZNb2RhbE9iamVjdC5oYXNoQ29kZSgpOwotCQl9Ci0JCWlmIChmTW9kYWxPYmplY3RGZWF0dXJlICE9IG51bGwpIHsKLQkJCXJlc3VsdCBePSBmTW9kYWxPYmplY3RGZWF0dXJlLmhhc2hDb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRNb2RhbE9iamVjdCgpIHsKLQkJcmV0dXJuIGZNb2RhbE9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2RhbE9iamVjdChFT2JqZWN0IG9iamVjdCkgewotCQlmTW9kYWxPYmplY3QgPSBvYmplY3Q7Ci0JfQotCi0JCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRNb2RhbE9iamVjdEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmTW9kYWxPYmplY3RGZWF0dXJlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZGFsT2JqZWN0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlmTW9kYWxPYmplY3RGZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RFbGVtZW50RWRpdG9yTWF0Y2hpbmdTdHJhdGVneS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZEVsZW1lbnRFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNWI4YTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZEVsZW1lbnRFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yTWF0Y2hpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotCi0vKioKLSAqIGltcGxlbWVudHMgSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgZm9yIE1ldGhvZEVsZW1lbnRFZGl0b3IKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5IGltcGxlbWVudHMgSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgewotCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhJRWRpdG9yUmVmZXJlbmNlIGVkaXRvclJlZiwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCS8vIGluc3BlY3QgaW5wdXQKLQkJTWV0aG9kRWxlbWVudCBpbnB1dEVsZW1lbnQgPSBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KGlucHV0KTsKLQkJaWYgKGlucHV0RWxlbWVudCA9PSBudWxsKSB7Ci0JCQkvLyBubyBNZXRob2RFbGVtZW50IGluIGluY29taW5nIGlucHV0Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0gICAgICAgIElFZGl0b3JJbnB1dCBleGlzdGluZ0VkaXRvcklucHV0OwotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBlZGl0b3JSZWYuZ2V0RWRpdG9yKGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghKGVkaXRvciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IpKSB7Ci0gICAgICAgIAkvLyBleGlzdGluZyBlZGl0b3IgaXMgbm90IGEgTWV0aG9kRWxlbWVudEVkaXRvcgotICAgICAgICAJcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV4aXN0aW5nRWRpdG9ySW5wdXQgPSBlZGl0b3JSZWYuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBNZXRob2RFbGVtZW50IGV4aXN0aW5nRWRpdG9ySW5wdXRFbGVtZW50ID0gZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dChleGlzdGluZ0VkaXRvcklucHV0KTsKLQkJaWYgKGV4aXN0aW5nRWRpdG9ySW5wdXRFbGVtZW50ID09IG51bGwpIHsKLQkJCS8vIG5vIE1ldGhvZEVsZW1lbnQgaW4gZXhpc3RpbmcgZWRpdG9yCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLSAgICAgICAgCi0gICAgICAgIGlmIChleGlzdGluZ0VkaXRvcklucHV0RWxlbWVudC5lcXVhbHMoaW5wdXRFbGVtZW50KSkgewotICAgICAgICAJLy8gZWRpdG9yIGlzIGVkaXRpbmcgdGhlIE1ldGhvZEVsZW1lbnQgcmVwcmVzZW50ZWQgYnkgdGhlIGlucHV0Ci0gICAgICAgIAlyZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJTWV0aG9kRWxlbWVudCBpbnB1dEVsZW1lbnQgPSBudWxsOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCS8vIHByb2JhYmx5IG9wZW5lZCBmcm9tIFByb2JsZW1zIFZpZXcKLQkJCWlucHV0RWxlbWVudCA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KCgoRmlsZUVkaXRvcklucHV0KWlucHV0KS5nZXRGaWxlKCksCi0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuCi0JCQkJCWdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJfQotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCWlucHV0RWxlbWVudCA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KWlucHV0KS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGlucHV0RWxlbWVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kTGlicmFyeUVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZExpYnJhcnlFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ1ZDg0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kTGlicmFyeUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLk1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZUlPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci0KLS8qKgotICogVGhlIG1ldGhvZCBsaWJyYXJ5IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeUVkaXRvciBleHRlbmRzIE1ldGhvZEVsZW1lbnRFZGl0b3IgewotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3Ijc2V0UGFydE5hbWUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcnROYW1lKCkgewotCQlTdHJpbmcgcGFydE5hbWUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5NZXRob2RMaWJyYXJ5RWRpdG9yX3RpdGxlOyAKLQkJaWYgKGVsZW1lbnRPYmouZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCXBhcnROYW1lICs9IGVsZW1lbnRPYmouZ2V0TmFtZSgpOwotCQkJOwotCQl9Ci0JCXNldFBhcnROYW1lKHBhcnROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2FkZFBhZ2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYWdlcygpIHsKLQkJdHJ5IHsKLQkJCWFkZFBhZ2UobmV3IE1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlKHRoaXMpKTsKLQkJCWNyZWF0ZVByZXZpZXdQYWdlKCk7Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIENsb3NlIGFsbCB0aGUgZWRpdG9ycy4KLQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUFsbEVkaXRvcnMoZmFsc2UpOwotCi0JCS8vIENsZWFyIHRoZSBMaWJyYXJ5IFZpZXcuCi0JCUxpYnJhcnlWaWV3LmdldFZpZXcoKS5zZXRJbnB1dEZvclZpZXdlcihudWxsKTsKLQotCQl0cnkgewotCQkJLy8gQ2xvc2UgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmNsb3NlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2RvU2F2ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3IKLQkJCQkJLmJlZ2luVGFzaygKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5NZXRob2RMaWJyYXJ5RWRpdG9yX3NhdmVtb2RlbGxpYnJhcnksIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IAotCi0JCQl0cnkgewotCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2F2ZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJU3RyaW5nIGVyck1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1ldGhvZExpYnJhcnlFZGl0b3JfZXJyX3NhdmU7IAotCQkJCVN0cmluZyBlcnJEZXRhaWxzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoZXguZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCQkJZXJyRGV0YWlscyA9IGV4LmdldE1lc3NhZ2UoKTsgCi0JCQkJfQotCQkJCWlmIChleCBpbnN0YW5jZW9mIE11bHRpRmlsZUlPRXhjZXB0aW9uKSB7Ci0JCQkJCU9iamVjdCB0cm91YmxlT2JqID0gKChNdWx0aUZpbGVJT0V4Y2VwdGlvbikgZXgpCi0JCQkJCQkJLmdldFRyb3VibGVPYmplY3QoKTsKLQkJCQkJaWYgKHRyb3VibGVPYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQllcnJEZXRhaWxzID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWV0aG9kTGlicmFyeUVkaXRvcl90cm91Ymxlb2JqZWN0ICsgTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UGF0aCgoTWV0aG9kRWxlbWVudCkgdHJvdWJsZU9iaik7IAotCQkJCQl9Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJvcl9kaWFsb2dfdGl0bGU7IAotCQkJCVN0cmluZyBwcm9ibGVtID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c7IAotCQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBwcm9ibGVtLCBlcnJNc2csIGVyckRldGFpbHMpOyAKLQkJCX0gZmluYWxseSB7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJcmV0dXJuIG1hbmFnZXIgIT0gbnVsbCA/IG1hbmFnZXIuaXNNZXRob2RMaWJyYXJ5TW9kaWZpZWQoKSA6IGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZFJpY2hUZXh0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kUmljaFRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1NjQwYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kUmljaFRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQmFzZUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5NZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLmh0bWwuSFRNTEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuUmljaFRleHRDb250ZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuQ29udHJvbERlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRmllbGREZWNvcmF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotLyoqCi0gKiBBIE1ldGhvZCBFZGl0b3IgUmljaCBUZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RSaWNoVGV4dCBleHRlbmRzIFJpY2hUZXh0IGltcGxlbWVudHMgSU1ldGhvZFJpY2hUZXh0IHsKLQotCS8vIFRoZSBtZXRob2QgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudDsKLQkKLQkvLyB0aGUgTWV0aG9kRWxlbWVudCdzIENvbnRlbnREZXNjcmlwdGlvbgotCXByaXZhdGUgQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbjsKLQotCS8vIFRoZSBtb2RhbCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JcHJpdmF0ZSBFT2JqZWN0IG1vZGFsT2JqZWN0OwotCi0JLy8gVGhlIG1vZGFsIG9iamVjdCBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIG1vZGFsT2JqZWN0RmVhdHVyZTsKLQotCS8vIFRoZSByZXNvdXJjZSBiZWluZyBlZGl0ZWQgICAgICAgCi0JcHJvdGVjdGVkIFJlc291cmNlIHJlc291cmNlOwotCQotCS8vIHRoZSBkZWNvcmF0ZWRGaWVsZCBsYWJlbAotCXByb3RlY3RlZCBMYWJlbCBsYWJlbDsKLQkKLQlwcm90ZWN0ZWQgQ29udHJvbERlY29yYXRpb24gY29udHJvbERlY29yYXRpb247Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEltYWdlIGVycm9yRmllbGREZWNvcmF0aW9uSW1hZ2UgPSBGaWVsZERlY29yYXRpb25SZWdpc3RyeS5nZXREZWZhdWx0KCkuZ2V0RmllbGREZWNvcmF0aW9uKEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LkRFQ19FUlJPUikuZ2V0SW1hZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JLy8gRmllbGQgbmFtZSBiZWluZyBlZGl0ZWQKLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBGaWVsZCBuYW1lIGJlaW5nIGVkaXRlZCB3aXRoIHRoZSB0cmFpbGluZyA6IHJlbW92ZWQgICAgIAotCXByb3RlY3RlZCBTdHJpbmcgZmllbGROYW1lVHJpbTsKLQkKLQkvLyBtYXJrZXIgaGVscGVyCi0JcHJvdGVjdGVkIE1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyIG1hcmtlckhlbHBlcjsKLQkKLS8vCS8vIG1hcmtlciBhdHRyaWJ1dGUKLS8vCXByaXZhdGUgc3RhdGljIFN0cmluZyBNRVRIT0RfRklFTEROQU1FID0gIk1ldGhvZEZpZWxkTmFtZSI7Ci0KLS8vCS8vIG1hcmtlciBJRAotLy8JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS0VSX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubWV0aG9kUmljaFRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLiAgTXVzdCBjYWxsIGluaXQoLi4pIGJlZm9yZSB1c2luZyB0aGlzIHdpZGdldC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kUmljaFRleHQoKSB7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250cm9sLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIGluaXRpYWwgc3R5bGUgZm9yIHRoZSBlZGl0b3IuCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICBUaGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBocmVmcy4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kUmljaFRleHQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBTdHJpbmcgYmFzZVBhdGgpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSwgYmFzZVBhdGgpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHByZXNlbnRhdGlvbiBuYW1lcyBvZiBhbGwgZWxlbWVudCBsaW5rcy4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgUmljaCB0ZXh0IGVuY29kZWQgaW4gSFRNTCBmb3JtYXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyB0aWR5VGV4dChTdHJpbmcgdGV4dCkgewotCQkvKgotCQkgKiAgdGhpcyB3aWxsIGRvIHRoZSBmb2xsb3dpbmcgdG8gdGhlIEhUTUw6Ci0JCSAqICAxLiAgdXBkYXRlIEVsZW1lbnQgTGlua3MKLQkJICogIDIuICBjaGFuZ2UgPEEgLi4+IHRvIDxhIC4uPgotCQkgKiAgMy4gIGNoYW5nZSA8L0E+IHRvIDwvYT4KLQkJICogIDQuICBhZGQgZG91YmxlLXF1b3RlcyAoIikgYXJvdW5kIGFsbCBhdHRyaWJ1dGUgdmFsdWVzIGlmIHRoZXkgYXJlIG1pc3NpbmcKLQkJICovCi0JCQotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIudmFsaWRhdGVSaWNoVGV4dENvbnRlbnQobWV0aG9kRWxlbWVudCwgdGV4dCwKLQkJCQluZXcgUmljaFRleHRDb250ZW50VmFsaWRhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1ldGhvZCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kRWxlbWVudChNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQpIHsKLQkJdGhpcy5tZXRob2RFbGVtZW50ID0gbWV0aG9kRWxlbWVudDsKLQkJaWYgKHRoaXMubWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXRoaXMubWV0aG9kRWxlbWVudCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgdGhpcy5tZXRob2RFbGVtZW50KS5nZXRQcm9jZXNzKCk7Ci0JCX0KLQkJaWYgKHRoaXMubWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgeyAKLQkJCXRoaXMuY29udGVudERlc2NyaXB0aW9uID0gKChEZXNjcmliYWJsZUVsZW1lbnQpdGhpcy5tZXRob2RFbGVtZW50KS5nZXRQcmVzZW50YXRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRNb2RhbE9iamVjdCgpIHsKLQkJcmV0dXJuIG1vZGFsT2JqZWN0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RhbE9iamVjdChFT2JqZWN0IG1vZGFsT2JqZWN0KSB7Ci0JCXRoaXMubW9kYWxPYmplY3QgPSBtb2RhbE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG1vZGFsIG9iamVjdCBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0TW9kYWxPYmplY3RGZWF0dXJlKCkgewotCQlyZXR1cm4gbW9kYWxPYmplY3RGZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGFsIG9iamVjdCBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGFsT2JqZWN0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgbW9kYWxPYmplY3RGZWF0dXJlKSB7Ci0JCXRoaXMubW9kYWxPYmplY3RGZWF0dXJlID0gbW9kYWxPYmplY3RGZWF0dXJlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCkgewotCQlyZXR1cm4gZmllbGROYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlY29yYXRlZEZpZWxkTGFiZWwoTGFiZWwgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJT2JqZWN0IGRhdGEgPSBsYWJlbC5nZXREYXRhKEJhc2VGb3JtUGFnZS5MQUJFTF9ERUNPUkFUT1JfS0VZKTsKLQkJCWlmIChkYXRhIGluc3RhbmNlb2YgQ29udHJvbERlY29yYXRpb24pIHsKLQkJCQljb250cm9sRGVjb3JhdGlvbiA9IChDb250cm9sRGVjb3JhdGlvbilkYXRhOwotCQkJCWNvbnRyb2xEZWNvcmF0aW9uLnNldEltYWdlKGVycm9yRmllbGREZWNvcmF0aW9uSW1hZ2UpOwotCQkJCWNvbnRyb2xEZWNvcmF0aW9uLmhpZGUoKTsKLQkJCX0KLQkJCXVwZGF0ZUZpZWxkTmFtZUZyb21MYWJlbChsYWJlbCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRlRmllbGROYW1lRnJvbUxhYmVsKExhYmVsIGxhYmVsKSB7Ci0JCWlmIChsYWJlbCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZmllbGROYW1lID0gbGFiZWwuZ2V0VGV4dCgpOwotCQkJaWYgKCF0aGlzLmZpZWxkTmFtZS5lcXVhbHMoZmllbGROYW1lKSkgewotCQkJCXRoaXMuZmllbGROYW1lID0gZmllbGROYW1lOwotCQkJCWludCBjb2xvbkluZGV4ID0gZmllbGROYW1lLmluZGV4T2YoJzonKTsKLQkJCQlpZiAoY29sb25JbmRleCA9PSAtMSkKLQkJCQkJY29sb25JbmRleCA9IGZpZWxkTmFtZS5sZW5ndGgoKTsKLQkJCQl0aGlzLmZpZWxkTmFtZVRyaW0gPSBmaWVsZE5hbWUuc3Vic3RyaW5nKDAsIGNvbG9uSW5kZXgpLnRyaW0oKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRFbGVtZW50QW5kTGFiZWwoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBMYWJlbCBsYWJlbCkgewotCQlzZXRNZXRob2RFbGVtZW50KGVsZW1lbnQpOwotCQlzZXREZWNvcmF0ZWRGaWVsZExhYmVsKGxhYmVsKTsKLQkJbWFya2VySGVscGVyID0gTWV0aG9kUmljaFRleHRNYXJrZXJIZWxwZXIuSU5TVEFOQ0U7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZm9ybWF0SFRNTChTdHJpbmcgdGV4dCkgewotCQlTdHJpbmcgZm9ybWF0dGVkVGV4dDsKLQkJdHJ5IHsKLQkJCS8vIGNsZWFyIG1hcmtlcnMgZmlyc3QKLQkJCWNsZWFyTWFya2VycygpOwotCQkJLy8gQ2FsbCBKVGlkeSB0byBmb3JtYXQgdGhlIHNvdXJjZSB0byBYSFRNTC4KLQkJCWZvcm1hdHRlZFRleHQgPSBodG1sRm9ybWF0dGVyLmZvcm1hdEhUTUwodGV4dCk7Ci0JCQlpZiAoaHRtbEZvcm1hdHRlci5nZXRMYXN0RXJyb3JTdHIoKSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGVycm9yU3RyaW5nID0gaHRtbEZvcm1hdHRlci5nZXRMYXN0RXJyb3JTdHIoKTsKLQkJCQkvLyBjcmVhdGUgbWFya2VycwotCQkJCXRyeSB7Ci0JCQkJCWNyZWF0ZU1hcmtlcihlcnJvclN0cmluZyk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZXgpIHsKLQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKGNleCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZvcm1hdHRlZFRleHQ7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjbGVhck1hcmtlcnMoKSB7Ci0JCW1hcmtlckhlbHBlci5kZWxldGVNYXJrZXJzKGNvbnRlbnREZXNjcmlwdGlvbiwgZmllbGROYW1lVHJpbSk7Ci0JCXNldEVycm9yRGVzY3JpcHRpb24oIiIpOyAvLyROT04tTkxTLTEkCi0JCWhpZGVFcnJvckRlY29yYXRpb24oKTsKLQkJcmVmcmVzaERlY29yYXRvcnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXJyb3JEZXNjcmlwdGlvbihTdHJpbmcgdGV4dCkgewotCQlpZiAoY29udHJvbERlY29yYXRpb24gIT0gbnVsbCkgewotCQkJY29udHJvbERlY29yYXRpb24uc2V0RGVzY3JpcHRpb25UZXh0KHRleHQpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hEZWNvcmF0b3JzKCkgewotCQkvLyByZWZyZXNoCi0vLwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkudXBkYXRlKE1ldGhvZEVsZW1lbnRMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yLkRFQ09SQVRPUl9JRCk7Ci0JfQotCQotCQotCS8qCi0JICogVE9ETzoKLQkgKiBoYWQgdG8gdW5kbyBjaGFuZ2UgaW4gRGVzY3JpYmFibGVFbGVtZW50SW1wbCB0byBzZXQgcHJlc2VudGF0aW9uIG9uIGFueSBuZXcgb2JqCi0JICogc28gZWRpdG9yIHdpbGwgbmVlZCB0byBhc3NpZ24gcHJlc2VudGF0aW9uIHdoZW4gZmllbGQgaXMgZWRpdGVkIHNvIHRoYXQgdGhlIG1hcmtlcgotCSAqIGNhbiBiZSBhZGRlZCB0byB0aGUgcHJlc2VudGF0aW9uJ3MgcmVzb3VyY2UKLQkgKi8KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNYXJrZXIoU3RyaW5nIGZ1bGxFcnJNc2cpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbi5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCU1hdGNoZXIgbSA9IEhUTUxGb3JtYXR0ZXIualRpZHlFcnJvclBhcnNlci5tYXRjaGVyKGZ1bGxFcnJNc2cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQlpZiAobS5maW5kKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCVN0cmluZyBsb2NhdGlvbiA9IG0uZ3JvdXAoMSk7Ci0JCQkJU3RyaW5nIGVycm9yTXNnID0gbS5ncm91cCg0KTsKLQkJCQlCYXNpY0RpYWdub3N0aWMgZGlhZ25vc3RpY3MgPSAKLQkJCSAgICAgICAgICBuZXcgQmFzaWNEaWFnbm9zdGljCi0JCQkgICAgICAgICAgICAoSFRNTEZvcm1hdHRlci5ESUFHTk9TVElDX1NPVVJDRSwKLQkJCSAgICAgICAgICAgICAwLCAiIiwgLy8kTk9OLU5MUy0xJAotCQkJICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IGNvbnRlbnREZXNjcmlwdGlvbiwgZmllbGROYW1lVHJpbSB9KTsKLQkKLQkJCQlkaWFnbm9zdGljcy5hZGQoIAotCQkJCQluZXcgQmFzaWNEaWFnbm9zdGljKERpYWdub3N0aWMuRVJST1IsCi0JCQkJCQlsb2NhdGlvbiwgMCwgZXJyb3JNc2csCi0JCQkJCQluZXcgT2JqZWN0W10geyBjb250ZW50RGVzY3JpcHRpb24sIGZpZWxkTmFtZVRyaW0gfSkpOwotCQotCQkgICAgICAgIG1hcmtlckhlbHBlci5jcmVhdGVNYXJrZXJzKGRpYWdub3N0aWNzKTsKLQkJICAgICAgICBzZXRFcnJvckRlc2NyaXB0aW9uKGVycm9yTXNnKTsKLQkJICAgICAgICBzaG93RXJyb3JEZWNvcmF0aW9uKCk7Ci0JCQkJcmVmcmVzaERlY29yYXRvcnMoKTsKLQkJCX0KLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJY2xlYXJNYXJrZXJzKCk7Ci0JCXJlZnJlc2hEZWNvcmF0b3JzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNob3dFcnJvckRlY29yYXRpb24oKSB7Ci0gICAgICAgIGlmIChjb250cm9sRGVjb3JhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgIAljb250cm9sRGVjb3JhdGlvbi5zaG93KCk7Ci0gICAgICAgIH0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBoaWRlRXJyb3JEZWNvcmF0aW9uKCkgewotICAgICAgICBpZiAoY29udHJvbERlY29yYXRpb24gIT0gbnVsbCkgewotICAgICAgICAJY29udHJvbERlY29yYXRpb24uaGlkZSgpOwotICAgICAgICB9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJLy8gY2hlY2sgaWYgbGFiZWwgdGV4dCB3YXMgY2hhbmdlZCAodGhpcyBoYXBwZW5zIHdoZW4gUlRFIGlzIGV4cGFuZGVkKQotCQkvLyB0aGlzIGlzIGNhbGxlZCB3aGVuIFJURSBpcyB0b2dnbGVkIGluIGVkaXRvciAtIHJlYWQgbmV3IGZpZWxkTmFtZQotCQlpZiAodXBkYXRlRmllbGROYW1lRnJvbUxhYmVsKGxhYmVsKSkKLQkJCWhpZGVFcnJvckRlY29yYXRpb24oKTsKLQkJc3VwZXIuc2V0VGV4dCh0ZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kUmljaFRleHRFZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RSaWNoVGV4dEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzVlODFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RSaWNoVGV4dEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk1ldGhvZEFkZEltYWdlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5NZXRob2RBZGRMaW5rQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dFRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkFkZE9yZGVyZWRMaXN0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkFkZFRhYmxlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkFkZFVub3JkZXJlZExpc3RBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQm9sZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5DbGVhckNvbnRlbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQ29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5DdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRmluZFJlcGxhY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRm9udE5hbWVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRm9udFNpemVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRm9udFN0eWxlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkluZGVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5JdGFsaWNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuT3V0ZGVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5QYXN0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5TdWJzY3JpcHRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuU3VwZXJzY3JpcHRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuVGlkeUFjdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlVuZGVybGluZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotCi0vKioKLSAqIEEgUmljaCBUZXh0IGVkaXRvciB3aXRoIGFkZGVkIGV4dGVuc2lvbnMgdG8gc3VwcG9ydCBNZXRob2QgYnJvd3NpbmcgYW5kCi0gKiBhdXRob3JpbmcuIEluY2x1ZGVzIGEgdG9vbCBiYXIgYW5kIGFuIGludGVncmF0ZWQgSFRNTCBzb3VyY2UgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUmljaFRleHRFZGl0b3IgZXh0ZW5kcyBSaWNoVGV4dEVkaXRvciBpbXBsZW1lbnRzCi0JCUlNZXRob2RSaWNoVGV4dEVkaXRvciB7Ci0KLQkvLyBUaGUgbWV0aG9kIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQ7Ci0KLQkvLyBUaGUgbW9kYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCXByaXZhdGUgRU9iamVjdCBtb2RhbE9iamVjdDsKLQotCS8vIFRoZSBtb2RhbCBvYmplY3QgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBtb2RhbE9iamVjdEZlYXR1cmU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLiAgTXVzdCBjYWxsIGluaXQoLi4pIGJlZm9yZSB1c2luZyB0aGlzIHdpZGdldC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kUmljaFRleHRFZGl0b3IoKSB7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250cm9sLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIGluaXRpYWwgc3R5bGUgZm9yIHRoZSBlZGl0b3IuCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICBUaGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBocmVmcy4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kUmljaFRleHRFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBTdHJpbmcgYmFzZVBhdGgsCi0JCQlNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQsIExhYmVsIGxhYmVsLCBJRWRpdG9yU2l0ZSBlZGl0b3JTaXRlKSB7Ci0JCWluaXQocGFyZW50LCBzdHlsZSwgYmFzZVBhdGgsIGVkaXRvclNpdGUsIG1ldGhvZEVsZW1lbnQsIGxhYmVsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFN0cmluZyBiYXNlUGF0aCwKLQkJCUlFZGl0b3JTaXRlIGVkaXRvclNpdGUsIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCwgTGFiZWwgbGFiZWwpIHsKLQkJc3VwZXIuaW5pdChwYXJlbnQsIHN0eWxlLCBiYXNlUGF0aCwgZWRpdG9yU2l0ZSk7Ci0JCXRoaXMubWV0aG9kRWxlbWVudCA9IG1ldGhvZEVsZW1lbnQ7Ci0JCWluaXRFbGVtZW50QW5kTGFiZWwobWV0aG9kRWxlbWVudCwgbGFiZWwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHVuZGVybHlpbmcgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgc3R5bGUgZm9yIHRoaXMgY29udHJvbC4KLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBsaW5rcy4KLQkgKi8KLQlwcm90ZWN0ZWQgSVJpY2hUZXh0IGNyZWF0ZVJpY2hUZXh0Q29udHJvbChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsCi0JCQlTdHJpbmcgYmFzZVBhdGgpIHsKLQkJcmV0dXJuIE1ldGhvZFJpY2hUZXh0RmFjdG9yeS5jcmVhdGVNZXRob2RSaWNoVGV4dChwYXJlbnQsIHN0eWxlLCBiYXNlUGF0aCk7Ci0JfQotCi0JLyoqCi0JICogRmlsbHMgdGhlIFJpY2ggVGV4dCBlZGl0b3IgdG9vbCBiYXIgd2l0aCBhY3Rpb24gaXRlbXMuCi0JICogCi0JICogQHBhcmFtIHRvb2xCYXIKLQkgKiAgICAgICAgICAgIFRoZSBSaWNoIHRleHQgZWRpdG9yIHRvb2wgYmFyLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxUb29sQmFyKElSaWNoVGV4dFRvb2xCYXIgdG9vbEJhcikgewotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgRm9udFN0eWxlQWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEZvbnROYW1lQWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEZvbnRTaXplQWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsJCQotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQ3V0QWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IENvcHlBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgUGFzdGVBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQ2xlYXJDb250ZW50QWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEJvbGRBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgSXRhbGljQWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IFVuZGVybGluZUFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBTdWJzY3JpcHRBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgU3VwZXJzY3JpcHRBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgVGlkeUFjdGlvbkdyb3VwKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEFkZE9yZGVyZWRMaXN0QWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEFkZFVub3JkZXJlZExpc3RBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgT3V0ZGVudEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBJbmRlbnRBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgRmluZFJlcGxhY2VBY3Rpb24odGhpcykgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQkJCXJpY2hUZXh0LmdldEZpbmRSZXBsYWNlQWN0aW9uKCkuZXhlY3V0ZShyaWNoVGV4dCk7Ci0JCQl9Ci0JCX0pOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgTWV0aG9kQWRkTGlua0FjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBNZXRob2RBZGRJbWFnZUFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBBZGRUYWJsZUFjdGlvbih0aGlzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0aG9kIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudCgpIHsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldE1vZGFsT2JqZWN0KCkgewotCQlyZXR1cm4gbW9kYWxPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGFsT2JqZWN0KEVPYmplY3QgbW9kYWxPYmplY3QpIHsKLQkJdGhpcy5tb2RhbE9iamVjdCA9IG1vZGFsT2JqZWN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgbW9kYWwgb2JqZWN0IGZlYXR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRNb2RhbE9iamVjdEZlYXR1cmUoKSB7Ci0JCXJldHVybiBtb2RhbE9iamVjdEZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kYWwgb2JqZWN0IGZlYXR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kYWxPYmplY3RGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBtb2RhbE9iamVjdEZlYXR1cmUpIHsKLQkJdGhpcy5tb2RhbE9iamVjdEZlYXR1cmUgPSBtb2RhbE9iamVjdEZlYXR1cmU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdEVsZW1lbnRBbmRMYWJlbChNZXRob2RFbGVtZW50IGVsZW1lbnQsIExhYmVsIGxhYmVsKSB7Ci0JCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIElNZXRob2RSaWNoVGV4dCkKLQkJCSgoSU1ldGhvZFJpY2hUZXh0KXJpY2hUZXh0KS5pbml0RWxlbWVudEFuZExhYmVsKG1ldGhvZEVsZW1lbnQsIGxhYmVsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kUmljaFRleHRGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kUmljaFRleHRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOTA5OTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZFJpY2hUZXh0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZXRob2RSaWNoVGV4dEZhY3RvcnkgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtZXRob2RSaWNoVGV4dEV4dGVuc2lvblBvaW50TmFtZSA9ICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm1ldGhvZFJpY2hUZXh0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtZXRob2RSaWNoVGV4dEVkaXRvckV4dGVuc2lvblBvaW50TmFtZSA9ICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm1ldGhvZFJpY2hUZXh0RWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIElDb25maWd1cmF0aW9uRWxlbWVudCBtZXRob2RSaWNoVGV4dEV4dGVuc2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IG1ldGhvZFJpY2hUZXh0RWRpdG9yRXh0ZW5zaW9uID0gbnVsbDsKLQkKLQlwdWJsaWMgc3RhdGljIElNZXRob2RSaWNoVGV4dCBjcmVhdGVNZXRob2RSaWNoVGV4dChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFN0cmluZyBiYXNlUGF0aCkgewotCQlJTWV0aG9kUmljaFRleHQgbWV0aG9kUmljaFRleHQgPSBnZXRNZXRob2RSaWNoVGV4dCgpOwotCQlpZiAobWV0aG9kUmljaFRleHQgIT0gbnVsbCkgewotCQkJbWV0aG9kUmljaFRleHQuaW5pdChwYXJlbnQsIHN0eWxlLCBiYXNlUGF0aCk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFJpY2hUZXh0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElNZXRob2RSaWNoVGV4dEVkaXRvciBjcmVhdGVNZXRob2RSaWNoVGV4dEVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFN0cmluZyBiYXNlUGF0aCwgSUVkaXRvclNpdGUgZWRpdG9yU2l0ZSwgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50LCBMYWJlbCBsYWJlbCkgewotCQlJTWV0aG9kUmljaFRleHRFZGl0b3IgbWV0aG9kUmljaFRleHRFZGl0b3IgPSBnZXRNZXRob2RSaWNoVGV4dEVkaXRvcigpOwotCQlpZiAobWV0aG9kUmljaFRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJbWV0aG9kUmljaFRleHRFZGl0b3IuaW5pdChwYXJlbnQsIHN0eWxlLCBiYXNlUGF0aCwgZWRpdG9yU2l0ZSwgbWV0aG9kRWxlbWVudCwgbGFiZWwpOwotCQl9Ci0JCXJldHVybiBtZXRob2RSaWNoVGV4dEVkaXRvcjsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSU1ldGhvZFJpY2hUZXh0IGdldE1ldGhvZFJpY2hUZXh0KCkgewotCQlpZiAobWV0aG9kUmljaFRleHRFeHRlbnNpb24gPT0gbnVsbCkgewotCQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IobWV0aG9kUmljaFRleHRFeHRlbnNpb25Qb2ludE5hbWUpOwotCi0JCQlpbnQgdmVyc2lvbiA9IC0xOwotCQkJCi0JCQlmb3IgKGludCBpPTA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBleHRlbnNpb25zW2ldOwotCQkJCWludCBvdGhlclZlcnNpb24gPSBwYXJzZVZlcnNpb24oZWxlbWVudC5nZXRBdHRyaWJ1dGUoInZlcnNpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZihvdGhlclZlcnNpb24gPiB2ZXJzaW9uKSB7Ci0JCQkJCW1ldGhvZFJpY2hUZXh0RXh0ZW5zaW9uID0gZWxlbWVudDsKLQkJCQkJdmVyc2lvbiA9IG90aGVyVmVyc2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlyZXR1cm4gKElNZXRob2RSaWNoVGV4dCltZXRob2RSaWNoVGV4dEV4dGVuc2lvbi5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElNZXRob2RSaWNoVGV4dEVkaXRvciBnZXRNZXRob2RSaWNoVGV4dEVkaXRvcigpIHsKLQkJaWYgKG1ldGhvZFJpY2hUZXh0RWRpdG9yRXh0ZW5zaW9uID09IG51bGwpIHsKLQkJCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKG1ldGhvZFJpY2hUZXh0RWRpdG9yRXh0ZW5zaW9uUG9pbnROYW1lKTsKLQkKLQkJCWludCB2ZXJzaW9uID0gLTE7Ci0JCQkKLQkJCWZvciAoaW50IGk9MDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJaW50IG90aGVyVmVyc2lvbiA9IHBhcnNlVmVyc2lvbihlbGVtZW50LmdldEF0dHJpYnV0ZSgidmVyc2lvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmKG90aGVyVmVyc2lvbiA+IHZlcnNpb24pIHsKLQkJCQkJbWV0aG9kUmljaFRleHRFZGl0b3JFeHRlbnNpb24gPSBlbGVtZW50OwotCQkJCQl2ZXJzaW9uID0gb3RoZXJWZXJzaW9uOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0cnkgewotCQkJaWYgKGlzRGVidWcoKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kUmljaFRleHRGYWN0b3J5IHVzaW5nICIgKyBtZXRob2RSaWNoVGV4dEVkaXRvckV4dGVuc2lvbi5nZXRBdHRyaWJ1dGUoImNsYXNzIikpOwotCQkJfQotCQkJcmV0dXJuIChJTWV0aG9kUmljaFRleHRFZGl0b3IpbWV0aG9kUmljaFRleHRFZGl0b3JFeHRlbnNpb24uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCQotCXB1YmxpYyBzdGF0aWMgaW50IHBhcnNlVmVyc2lvbihTdHJpbmcgc3RyKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChzdHIpOwotCQl9Ci0JCWNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQkJCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1ByZXZpZXdQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJldmlld1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVlZjU3Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJldmlld1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5FbGVtZW50SFRNTFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WaWV3Rm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotCi0vKioKLSAqIFRoZSBQcmV2aWV3IHBhZ2UgaW4gdGhlIE1ldGhvZCBFZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByZXZpZXdQYWdlIHsKLQotCXByaXZhdGUgRWxlbWVudEhUTUxWaWV3ZXIgcHJldmlld2VyID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZQotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgUHJldmlld1BhZ2UoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkvLyBVc2UgdGhlIFZpZXdGb3JtIGNvbnRyb2wgdG8gZ2l2ZSBpdCB0aGUgRWNsaXBzZSBXb3JrYmVuY2ggd2luZG93Ci0JCS8vIGxvb2sgJiBmZWVsLgotCQlWaWV3Rm9ybSB2aWV3Rm9ybSA9IG5ldyBWaWV3Rm9ybShjb21wb3NpdGUsIFNXVC5ERUZBVUxUKTsKLQkJdmlld0Zvcm0ubWFyZ2luSGVpZ2h0ID0gMDsKLQkJdmlld0Zvcm0ubWFyZ2luV2lkdGggPSAwOwotCQl2aWV3Rm9ybS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXZpZXdGb3JtLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIFNldCB0b29sYmFyCi0JCUNvbnRyb2wgdG9vbGJhciA9IGNyZWF0ZVRvb2xiYXIodmlld0Zvcm0pOwotCQl2aWV3Rm9ybS5zZXRUb3BSaWdodCh0b29sYmFyKTsKLQotCQkvLyBTZXQgY29udGVudAotCQlDb250cm9sIGNvbnRlbnQgPSBjcmVhdGVDb250ZW50KHZpZXdGb3JtKTsKLQkJdmlld0Zvcm0uc2V0Q29udGVudChjb250ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgcHJldmlldyBjb250ZW50Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIENvbnRyb2wgY3JlYXRlQ29udGVudChWaWV3Rm9ybSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRlbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJY29udGVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29udGVudC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlwcmV2aWV3ZXIgPSBuZXcgRWxlbWVudEhUTUxWaWV3ZXIoY29udGVudCk7Ci0JCXJldHVybiAoQ29udHJvbCkgY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gRWxlbWVudFZpZXdlcgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCQlWaWV3ZXIKLQkgKi8KLQlwdWJsaWMgRWxlbWVudEhUTUxWaWV3ZXIgZ2V0UHJldmlld1ZpZXdlcigpIHsKLQkJcmV0dXJuIHByZXZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgVG9vbGJhciBJdCBoYXMgR28gYmFjaywgR28gZm9yd2FyZCwgU3RvcCBhbmQgcmVmcmVzaCBidXR0b25zCi0JICogCi0JICogQHBhcmFtIFZpZXdGb3JtCi0JICogICAgICAgICAgICBwYXJlbnQKLQkgKiBAcmV0dXJuIFRvb2xiYXIKLQkgKi8KLQlwcml2YXRlIFRvb2xCYXIgY3JlYXRlVG9vbGJhcihWaWV3Rm9ybSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBicm93c2VyIG5hdmlnYXRpb24gdG9vbGJhci4KLQkJVG9vbEJhciB0b29sYmFyID0gbmV3IFRvb2xCYXIocGFyZW50LCBTV1QuRkxBVCk7Ci0KLQkJLy8gQWRkIHRoZSBCYWNrIGJ1dHRvbi4KLQkJVG9vbEl0ZW0gYmFja0J1dHRvbiA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuTk9ORSk7Ci0JCWJhY2tCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0JBQ0spOwotCQliYWNrQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJhY2tCdXR0b25fdGV4dCk7IAotCQliYWNrQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlCcm93c2VyIGJyb3dzZXIgPSBwcmV2aWV3ZXIuZ2V0QnJvd3NlcigpOwotCQkJCWlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCQkJYnJvd3Nlci5iYWNrKCk7Ci0JCQkJfQotCQkJfTsKLQkJfSk7Ci0KLQkJLy8gQWRkIHRoZSBGb3dhcmQgYnV0dG9uLgotCQlUb29sSXRlbSBmb3J3YXJkQnV0dG9uID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5OT05FKTsKLQkJZm9yd2FyZEJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfRk9SV0FSRCk7Ci0JCWZvcndhcmRCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuZm9yd2FyZEJ1dHRvbl90ZXh0KTsgCi0JCWZvcndhcmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUJyb3dzZXIgYnJvd3NlciA9IHByZXZpZXdlci5nZXRCcm93c2VyKCk7Ci0JCQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJCQlicm93c2VyLmZvcndhcmQoKTsKLQkJCQl9Ci0JCQl9OwotCQl9KTsKLQotCQkvLyBBZGQgdGhlIFN0b3AgYnV0dG9uLgotCQlUb29sSXRlbSBzdG9wQnV0dG9uID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5OT05FKTsKLQkJc3RvcEJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfU1RPUCk7Ci0JCXN0b3BCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RvcEJ1dHRvbl90ZXh0KTsgCi0JCXN0b3BCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUJyb3dzZXIgYnJvd3NlciA9IHByZXZpZXdlci5nZXRCcm93c2VyKCk7Ci0JCQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJCQlicm93c2VyLnN0b3AoKTsKLQkJCQl9Ci0JCQl9OwotCQl9KTsKLQotCQkvLyBBZGQgdGhlIFJlZnJlc2ggYnV0dG9uLgotCQlUb29sSXRlbSByZWZyZXNoQnV0dG9uID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5OT05FKTsKLQkJcmVmcmVzaEJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfUkVGUkVTSCk7Ci0JCXJlZnJlc2hCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVmcmVzaEJ1dHRvbl90ZXh0KTsgCi0JCXJlZnJlc2hCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCS8vIEJyb3dzZXIgYnJvd3NlciA9IHByZXZpZXdlci5nZXRCcm93c2VyKCk7Ci0JCQkJLy8gaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJCS8vIGJyb3dzZXIucmVmcmVzaCgpOwotCQkJCS8vIH0KLQotCQkJCXByZXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9OwotCQl9KTsKLQotCQkvLyBBZGQgdGhlIFByaW50IGJ1dHRvbi4KLQkJVG9vbEl0ZW0gcHJpbnRCdXR0b24gPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULk5PTkUpOwotCQlwcmludEJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfUFJJTlQpOwotCQlwcmludEJ1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5wcmludEJ1dHRvbl90ZXh0KTsgCi0JCXByaW50QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlwcmV2aWV3ZXIucHJpbnQoKTsKLQkJCX07Ci0JCX0pOwotCi0JCXJldHVybiB0b29sYmFyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1Byb2Nlc3NFZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Qcm9jZXNzRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZjZhY2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1Byb2Nlc3NFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5TZXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuTG9jYWxUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuVmlld2VyRHJhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JV29ya2JlbmNoUGFydEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeVZhbGlkYXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZG5kLkVkaXRpbmdEb21haW5UYWJsZVRyZWVWaWV3ZXJEcm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuSUV4dGVuc2lvbkZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5FUEZQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5Qcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuUHJvY2Vzc1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0UHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZS5EaWFncmFtRWRpdG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklBZGFwdGVyRmFjdG9yeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkNvbW1hbmRTdGFja0NoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklBY3Rpb25UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkVkaXRpbmdEb21haW5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMuUHJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuZG9tYWluLlRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5MaWJyYXJ5RVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuSUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBFZGl0b3IgZm9yIHByb2Nlc3MgYXV0aG9yaW5nLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRWRpdG9yIGV4dGVuZHMgTWV0aG9kRWxlbWVudEVkaXRvciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluUHJvdmlkZXIsIElNZW51TGlzdGVuZXIsIElTZWxlY3Rpb25Qcm92aWRlciwKLQkJSVZpZXdlclByb3ZpZGVyLCBJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciB7Ci0KLQkvKioKLQkgKiBUaGUgZWRpdG9yIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9JRCA9IFByb2Nlc3NFZGl0b3IuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS0ZMT1dfRURJVE9SX0lEID0gR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9FRElUT1JfSUQgPSBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUERFUEVOREVOQ1lfRURJVE9SX0lEID0gR3JhcGhpY2FsV1BEZXBlbmRlbmN5RWRpdG9yLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JLyoqIENvbHVtbiBkZXNjcmlwdG9yIGNvbnN0YW50cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19OQU1FID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUsIFByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRSksCi0JCQkzLCAyMDAsIHRydWUsIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19JRCA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCwgUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCksCi0JCQkwLCA0MCwgdHJ1ZSwgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX05PTkUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX1BSRUZJWCA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVGSVgsCi0JCQlQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCksIDAsIDgwLCB0cnVlLAotCQkJQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX01PREVMX0lORk8gPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTywKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTyksIDAsIDEyMCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9OT05FKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfVFlQRSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFLCBQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUpLAotCQkJMCwgODAsIHRydWUsIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9OT05FKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19QUkVERUNFU1NPUlMgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlMpLCAyLCAxMDAsIHRydWUsCi0JCQlDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVCk7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX0lTX1JFUEVBVEFCTEUgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSwKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSksIDEsIDYwLCB0cnVlLAotCQkJQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NIRUNLX0JPT0xFQU4pOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19JU19PTkdPSU5HID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcsCi0JCQlQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcpLCAxLCA2MCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19JU19FVkVOVF9EUklWRU4gPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4pLCAxLCA2MCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfVEVBTSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9URUFNUywgUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9URUFNUyksCi0JCQkxLCAxMDAsIHRydWUsIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19FTlRSWV9TVEFURSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURSwKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfRU5UUllfU1RBVEUpLCAxLCA2MCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfRVhJVF9TVEFURSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFKSwgMSwgNjAsIHRydWUsCi0JCQlDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVCk7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX1BSRVNFTlRBVElPTl9OQU1FID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSksIDMsIDIwMCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfREVMSVZFUkFCTEUgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfREVMSVZFUkFCTEUsCi0JCQlQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFKSwgMSwgMTAwLCB0cnVlLAotCQkJQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQpOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19JU19PUFRJT05BTCA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PUFRJT05BTCwKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUwpLCAxLCA2MCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfSVNfUExBTk5FRCA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19QTEFOTkVELAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19QTEFOTkVEKSwgMSwgNjAsIHRydWUsCi0JCQlDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ0hFQ0tfQk9PTEVBTik7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTKSwgMSwgNjAsCi0JCQl0cnVlLCBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ0hFQ0tfQk9PTEVBTik7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0JTX0ZPUk1fSUQgPSAid2JzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFfRk9STV9JRCA9ICJ0YnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUEJTX0ZPUk1fSUQgPSAid3BicyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNPTElEQVRFRF9GT1JNX0lEID0gImNvbnNvbGlkYXRlZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlEaWFncmFtRWRpdG9ySGVscGVyIGRpYWdyYW1FZGl0b3JIZWxwZXIgPSBudWxsOwotCi0JLy8gY2hhbmdlIHRoZSBkZWZhdWx0IG9yZGVyIGJhc2VkIG9uIDE1Mjg2NyAtIFB1Ymxpc2ggb3B0aW9uIGFuZCBwcmVmcmVuY2VzCi0JLyogV0JTOiBQcmVzZW50YXRpb24gTmFtZSwgSW5kZXgsIFByZWRlY2Vzc29ycywgTW9kZWwgSW5mbywgVHlwZSwgUGxhbm5lZCwKLQkJCVJlcGVhdGFibGUsIE11bHRpcGxlIE9jY3VycmVuY2VzLCBPbmdvaW5nLCBFdmVudC1kcml2ZW4sIE9wdGlvbmFsCi0JCVRBOiBQcmVzZW50YXRpb24gTmFtZSwgTW9kZWwgSW5mbywgVGVhbSwgVHlwZSwgUGxhbm5lZCwgTXVsdGlwbGUKLQkJCU9jY3VycmVuY2VzLCBPcHRpb25hbAotCQlXb3JrIFByb2R1Y3QgVXNhZ2U6IFByZXNlbnRhdGlvbiBOYW1lLCBNb2RlbCBJbmZvLCBFbnRyeSBTdGF0ZSwgRXhpdCBTdGF0ZSwgCi0JCQlEZWxpdmVyYWJsZSwgVHlwZSwgUGxhbm5lZCwgTXVsdGlwbGUgT2NjdXJyZW5jZXMsIE9wdGlvbmFsCi0JKi8KLQkvLyBKaW5odWEgWGksIDA4LzIxLzIwMDYKLQkKLQkvLyB0aGUgZGVmYXVsdCBsaXN0IG11c3QgYmUgYXZhaWxhYmxlIGluIHRoZSBsaWJyYXJ5IHBsdWdpbiBhcyB3ZWxsLgotCS8vIGR1cGxpY2F0ZSBkZWZpbml0aW9uIGZvciBub3csIHdpbGwgbmVlZCB0byBtZXJnZSB0b2dldGhlciBsYXRlcgotCS8vIHNlZSBQcmVmZXJlbmNlQ29uc3RhbnRzLm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PENvbHVtbkRlc2NyaXB0b3I+IERFRkFVTFRfVEJTX0NPTFVNTlMgPSBBcnJheXMKLQkJCS5hc0xpc3QobmV3IENvbHVtbkRlc2NyaXB0b3JbXSB7Ci0JCQkJCUNPTF9ERVNDX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJCQkvLyBDT0xfREVTQ19JRCwKLQkJCQkJLy9DT0xfREVTQ19QUkVGSVgsIAotCQkJCQlDT0xfREVTQ19NT0RFTF9JTkZPLCBDT0xfREVTQ19URUFNLCBDT0xfREVTQ19UWVBFLAotCQkJCQlDT0xfREVTQ19JU19QTEFOTkVELAotCQkJCQlDT0xfREVTQ19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMsIENPTF9ERVNDX0lTX09QVElPTkFMIH0pOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IERFRkFVTFRfV1BCU19DT0xVTU5TID0gQXJyYXlzCi0JCQkuYXNMaXN0KG5ldyBDb2x1bW5EZXNjcmlwdG9yW10gewotCQkJCQlDT0xfREVTQ19QUkVTRU5UQVRJT05fTkFNRSwKLQkJCQkJLy8gQ09MX0RFU0NfSUQsCi0JCQkJCS8vQ09MX0RFU0NfUFJFRklYLCAKLQkJCQkJQ09MX0RFU0NfTU9ERUxfSU5GTywgQ09MX0RFU0NfRU5UUllfU1RBVEUsCi0JCQkJCUNPTF9ERVNDX0VYSVRfU1RBVEUsIAotCQkJCQlDT0xfREVTQ19ERUxJVkVSQUJMRSwgQ09MX0RFU0NfVFlQRSwgCi0JCQkJCUNPTF9ERVNDX0lTX1BMQU5ORUQsIENPTF9ERVNDX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywgQ09MX0RFU0NfSVNfT1BUSU9OQUwgfSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8Q29sdW1uRGVzY3JpcHRvcj4gREVGQVVMVF9XQlNfQ09MVU1OUyA9IEFycmF5cwotCQkJLmFzTGlzdChuZXcgQ29sdW1uRGVzY3JpcHRvcltdIHsgQ09MX0RFU0NfUFJFU0VOVEFUSU9OX05BTUUsCi0JCQkJCUNPTF9ERVNDX0lELCAKLQkJCQkJLy9DT0xfREVTQ19QUkVGSVgsIAotCQkJCQlDT0xfREVTQ19QUkVERUNFU1NPUlMsIENPTF9ERVNDX01PREVMX0lORk8sCi0JCQkJCUNPTF9ERVNDX1RZUEUsIENPTF9ERVNDX0lTX1BMQU5ORUQsIAotCQkJCQlDT0xfREVTQ19JU19SRVBFQVRBQkxFLCBDT0xfREVTQ19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMsIENPTF9ERVNDX0lTX09OR09JTkcsCi0JCQkJCUNPTF9ERVNDX0lTX0VWRU5UX0RSSVZFTiwgQ09MX0RFU0NfSVNfT1BUSU9OQUwKLQkJCQkJIH0pOwotCi0JIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxDb2x1bW5EZXNjcmlwdG9yPiBBTExfV0JTX0NPTFVNTlMgPSBuZXcgQXJyYXlMaXN0PENvbHVtbkRlc2NyaXB0b3I+KAotCQkJREVGQVVMVF9XQlNfQ09MVU1OUyk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8Q29sdW1uRGVzY3JpcHRvcj4gQUxMX1RCU19DT0xVTU5TID0gbmV3IEFycmF5TGlzdDxDb2x1bW5EZXNjcmlwdG9yPigKLQkJCURFRkFVTFRfVEJTX0NPTFVNTlMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PENvbHVtbkRlc2NyaXB0b3I+IEFMTF9XUEJTX0NPTFVNTlMgPSBuZXcgQXJyYXlMaXN0PENvbHVtbkRlc2NyaXB0b3I+KAotCQkJREVGQVVMVF9XUEJTX0NPTFVNTlMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBDb2x1bW5EZXNjcmlwdG9yPiBpZFRvQ29sdW1uRGVzY3JpcHRvck1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ29sdW1uRGVzY3JpcHRvcj4oKTsKLQlzdGF0aWMgewotCQlBTExfV0JTX0NPTFVNTlMuYWRkKENPTF9ERVNDX1BSRUZJWCk7Ci0JCUFMTF9UQlNfQ09MVU1OUy5hZGQoQ09MX0RFU0NfUFJFRklYKTsKLQkJQUxMX1dQQlNfQ09MVU1OUy5hZGQoQ09MX0RFU0NfUFJFRklYKTsKLQkJCi0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX05BTUUuaWQsCi0JCQkJQ09MX0RFU0NfTkFNRSk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX0lELmlkLCBDT0xfREVTQ19JRCk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX1BSRUZJWC5pZCwKLQkJCQlDT0xfREVTQ19QUkVGSVgpOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19NT0RFTF9JTkZPLmlkLAotCQkJCUNPTF9ERVNDX01PREVMX0lORk8pOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19UWVBFLmlkLAotCQkJCUNPTF9ERVNDX1RZUEUpOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19QUkVERUNFU1NPUlMuaWQsCi0JCQkJQ09MX0RFU0NfUFJFREVDRVNTT1JTKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfSVNfUkVQRUFUQUJMRS5pZCwKLQkJCQlDT0xfREVTQ19JU19SRVBFQVRBQkxFKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfSVNfT05HT0lORy5pZCwKLQkJCQlDT0xfREVTQ19JU19PTkdPSU5HKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfSVNfRVZFTlRfRFJJVkVOLmlkLAotCQkJCUNPTF9ERVNDX0lTX0VWRU5UX0RSSVZFTik7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX1RFQU0uaWQsCi0JCQkJQ09MX0RFU0NfVEVBTSk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX0VOVFJZX1NUQVRFLmlkLAotCQkJCUNPTF9ERVNDX0VOVFJZX1NUQVRFKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfRVhJVF9TVEFURS5pZCwKLQkJCQlDT0xfREVTQ19FWElUX1NUQVRFKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoCi0JCQkJQ09MX0RFU0NfUFJFU0VOVEFUSU9OX05BTUUuaWQsIENPTF9ERVNDX1BSRVNFTlRBVElPTl9OQU1FKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfREVMSVZFUkFCTEUuaWQsCi0JCQkJQ09MX0RFU0NfREVMSVZFUkFCTEUpOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19JU19PUFRJT05BTC5pZCwKLQkJCQlDT0xfREVTQ19JU19PUFRJT05BTCk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX0lTX1BMQU5ORUQuaWQsCi0JCQkJQ09MX0RFU0NfSVNfUExBTk5FRCk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KAotCQkJCUNPTF9ERVNDX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUy5pZCwKLQkJCQlDT0xfREVTQ19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMpOwotCi0JCUFMTF9XQlNfQ09MVU1OUy5hZGQoQ09MX0RFU0NfTkFNRSk7Ci0JCUFMTF9UQlNfQ09MVU1OUy5hZGQoQ09MX0RFU0NfTkFNRSk7Ci0JCUFMTF9XUEJTX0NPTFVNTlMuYWRkKENPTF9ERVNDX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBhZGRBZGFwdGVyRmFjdG9yeUxpc3RlbmVycyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBjbGFzcyBQcm9jZXNzRWRpdG9yRHJvcEFkYXB0ZXIgZXh0ZW5kcwotCQkJRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyIHsKLQotCQkvKioKLQkJICogQHBhcmFtIGRvbWFpbgotCQkgKiBAcGFyYW0gdmlld2VyCi0JCSAqLwotCQlwdWJsaWMgUHJvY2Vzc0VkaXRvckRyb3BBZGFwdGVyKEVkaXRpbmdEb21haW4gZG9tYWluLCBWaWV3ZXIgdmlld2VyKSB7Ci0JCQlzdXBlcihkb21haW4sIHZpZXdlcik7Ci0JCX0KLQotCQkvKiogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kbmQuRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyI2dldERyb3BUYXJnZXQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0KQotCQkgKi8KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXREcm9wVGFyZ2V0KFdpZGdldCBpdGVtKSB7Ci0JCQlPYmplY3QgdGFyZ2V0ID0gc3VwZXIuZ2V0RHJvcFRhcmdldChpdGVtKTsKLQkJCWlmICh0YXJnZXQgPT0gbnVsbCAmJiBzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQgIT0gbnVsbCkgewotCQkJCXRhcmdldCA9IHNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudC5nZXRQcm9jZXNzKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGFyZ2V0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kbmQuRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyI2Ryb3Aob3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGN1cnJlbnRWaWV3ZXIgaW5zdGFuY2VvZiBJQWN0aW9uVHlwZVByb3ZpZGVyKSB7Ci0JCQkJKChJQWN0aW9uVHlwZVByb3ZpZGVyKSBjdXJyZW50Vmlld2VyKS5zZXRJbnB1dERhdGEobmV3IFBvaW50KAotCQkJCQkJZXZlbnQueCwgZXZlbnQueSkpOwotCQkJfQotCQkJc3VwZXIuZHJvcChldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKLQotCXByb3RlY3RlZCBWaWV3ZXIgY3VycmVudFZpZXdlcjsKLQotCXByb3RlY3RlZCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbiB2aWV3U2VsZWN0aW9uOwotCi0JcHJvdGVjdGVkIFByb2Nlc3NDb21wb25lbnQgc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50OwotCi0JcHJvdGVjdGVkIFByb2Nlc3Mgc2VsZWN0ZWRQcm9jZXNzOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXIgcHJvY2Vzc0NvbXBvbmVudExpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoUHJvY2Vzc0NvbXBvbmVudC5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fTkFNRToKLQkJCQlTdHJpbmcgbmFtZSA9IG1zZy5nZXROZXdTdHJpbmdWYWx1ZSgpOwotCQkJCWlmIChuYW1lID09IG51bGwpCi0JCQkJCW5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCXNldFBhcnROYW1lKG5hbWUpOwotCi0JCQkJaWYgKHBhZ2VzICE9IG51bGwpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGFnZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgcGFnZSA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBQcm9jZXNzRGVzY3JpcHRpb24pIHsKLQkJCQkJCQkoKFByb2Nlc3NEZXNjcmlwdGlvbikgcGFnZSkKLQkJCQkJCQkJCS5yZWZyZXNoRWxlbWVudE5hbWUobmFtZSk7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBwcm9wQ29udGVudFByb3ZpZGVyOwotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZzsKLQotCXByb3RlY3RlZCBJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpYnJhcnlMaXN0ZW5lciA9IG5ldyBJTGlicmFyeUNoYW5nZUxpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlDaGFuZ2VkKGludCBvcHRpb24sIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQkJc3dpdGNoIChvcHRpb24pIHsKLQkJCS8vIGNhc2UgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTE9BREVEOgotCQkJLy8gLy8gY2xvc2UgYWxsIG9wZW4gZGlhZ3JhbSBlZGl0b3JzCi0JCQkvLyAvLwotCQkJLy8gSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZnMgPQotCQkJLy8gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCS8vIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBlZGl0b3JSZWZzW2ldLmdldEVkaXRvcihmYWxzZSk7Ci0JCQkvLyBpZihlZGl0b3JQYXJ0IGluc3RhbmNlb2YgR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IKLQkJCS8vIHx8IGVkaXRvclBhcnQgaW5zdGFuY2VvZiBQcm9jZXNzRm9ybUVkaXRvcikgewotCQkJLy8gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihlZGl0b3JQYXJ0LCB0cnVlKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIGdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoUHJvY2Vzc0Zvcm1FZGl0b3IudGhpcywgdHJ1ZSk7Ci0JCQljYXNlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQ6IHsKLQkJCQlpZiAoY29sbGVjdGlvbiAhPSBudWxsICYmIGNvbGxlY3Rpb24uY29udGFpbnMoY3VycmVudENvbmZpZykpIHsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFCi0JCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0UKLQkJCQkJCQkJLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY3VycmVudENvbmZpZyk7Ci0JCQkJCQlyZWZyZXNoQWxsKCk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFCi0JCQkJCQkJCS5zZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkJLy8gaGFuZGxlZCBieSBsaWJTdmNMaXN0ZW5lcgotCQkJCS8vIGNhc2UgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ09ORklHVVJBVElPTl9TRUxFQ1RFRDogewotCQkJCS8vIGNvbmZpZ0NoYW5nZWQoKTsKLQkJCQkvLyBicmVhazsKLQkJCQkvLyB9Ci0KLQkJCX0KLQotCQl9Ci0KLQl9OwotCi0JcHJvdGVjdGVkIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpYlN2Y0xpc3RlbmVyID0gbmV3IElMaWJyYXJ5U2VydmljZUxpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCWNvbmZpZ0NoYW5nZWQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQl9Ci0KLQl9OwotCi0JcHJvdGVjdGVkIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBXQlNUYWI7Ci0KLQlwcm90ZWN0ZWQgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlIE9CU1RhYjsKLQotCXByb3RlY3RlZCBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgUEJTVGFiOwotCi0JcHJvdGVjdGVkIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBwcm9jVGFiOwotCi0JcHJvdGVjdGVkIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZVtdIGV4dGVuc2lvblRhYnMgPSBudWxsOwotCi0JcHJvdGVjdGVkIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZVtdIGJzUGFnZXM7Ci0KLQlwcm90ZWN0ZWQgRVBGUHJvcGVydHlTaGVldFBhZ2UgcHJvcGVydHlTaGVldFBhZ2U7Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiByZXNvdXJjZXNUb1NhdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyBwcml2YXRlIGJvb2xlYW4gZmlyc3RFeHBhbmRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogYSBsaXN0ZW5lciB0aGF0IGlzIGludGVyZXN0ZWQgaW4gcGFydCBhY3RpdmF0aW9uIGV2ZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnRMaXN0ZW5lciBwYXJ0QWN0aXZhdGlvbkxpc3RlbmVyID0gbmV3IElQYXJ0TGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlpZiAocGFydCBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXQpIHsKLQkJCQlyZW1vdmVQcm9wZXJ0aWVzRHJvcERvd25NZW51KHBhcnQpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQkvLyBpZighZmlyc3RFeHBhbmRlZCkgewotCQkJLy8gc3luY2hyb25pemVkKFByb2Nlc3NGb3JtRWRpdG9yLnRoaXMpIHsKLQkJCS8vIGlmKGZpcnN0RXhwYW5kZWQpIHsKLQkJCS8vICgoQWJzdHJhY3RUcmVlVmlld2VyKSBXQlNUYWIuZ2V0Vmlld2VyKCkpLmV4cGFuZEFsbCgpOwotCQkJLy8gKChBYnN0cmFjdFRyZWVWaWV3ZXIpIE9CU1RhYi5nZXRWaWV3ZXIoKSkuZXhwYW5kQWxsKCk7Ci0JCQkvLyAoKEFic3RyYWN0VHJlZVZpZXdlcikgUEJTVGFiLmdldFZpZXdlcigpKS5leHBhbmRBbGwoKTsKLQkJCS8vIGZpcnN0RXhwYW5kZWQgPSB0cnVlOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlpZiAocGFydCBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXQpIHsKLQkJCQlwcm9wZXJ0eVNoZWV0UGFnZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlpZiAocGFydCBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXQpIHsKLQkJCQlyZW1vdmVQcm9wZXJ0aWVzRHJvcERvd25NZW51KHBhcnQpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIgcHJlZlN0b3JlTGlzdGVuZXI7Ci0KLQkvLyBwcml2YXRlIFByb2Nlc3NDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotCi0JcHJvdGVjdGVkIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3luY2hyb25pemluZ1NlbGVjdGlvbjsKLQotCXByb3RlY3RlZCBib29sZWFuIGlucHV0Q2hhbmdlZDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIgYWRhcHRlckZhY3RvcnlQcm92aWRlciA9IG5ldyBJQWRhcHRlckZhY3RvcnlQcm92aWRlcigpIHsKLQotCQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0Q0JTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCQlyZXR1cm4gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfQotCi0JCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRUQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJCXJldHVybiBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0KLQkJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFdCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQkJcmV0dXJuIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQotCQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQkJcmV0dXJuIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQl9OwotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2lzVmFsaWRhdGVSZXNvdXJjZXNCZWZvcmVTYXZlUmVxdWlyZWQoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRhdGVSZXNvdXJjZXNCZWZvcmVTYXZlUmVxdWlyZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciNjcmVhdGVWYWxpZGF0ZVJlc291cmNlQWN0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlicmFyeVZhbGlkYXRlQWN0aW9uIGNyZWF0ZVZhbGlkYXRlUmVzb3VyY2VBY3Rpb24oKSB7Ci0JCUxpYnJhcnlWYWxpZGF0ZUFjdGlvbiB2YWxpZGF0ZUFjdGlvbiA9IHN1cGVyLmNyZWF0ZVZhbGlkYXRlUmVzb3VyY2VBY3Rpb24oKTsKLQkJdmFsaWRhdGVBY3Rpb24ucHV0Q29udGV4dERhdGEoTGlicmFyeUVWYWxpZGF0b3IuQ1RYX0FEQVBURVJfRkFDVE9SWV9QUk9WSURFUiwKLQkJCQlhZGFwdGVyRmFjdG9yeVByb3ZpZGVyKTsKLQkJcmV0dXJuIHZhbGlkYXRlQWN0aW9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbnB1dENoYW5nZWQoT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWlucHV0Q2hhbmdlZCA9IGZhbHNlOwotCQlpZiAoIShuZXdJbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkpCi0JCQlyZXR1cm47Ci0JCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBtZXRob2RFbGVtZW50SW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBuZXdJbnB1dDsKLQotCQlPYmplY3Qgb2JqID0gbWV0aG9kRWxlbWVudElucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KSBvYmo7Ci0JCQlzZWxlY3RlZFByb2Nlc3MgPSBnZXRUb3BCcmVha2Rvd25FbGVtZW50KHNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQlzdXBwcmVzc2lvbiA9IGdldFN1cHByZXNzaW9uKHNlbGVjdGVkUHJvY2Vzcyk7Ci0KLQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHBhZ2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJLy8gT2JqZWN0IHBhZ2UgPSBpdGVyLm5leHQoKTsKLQkJCS8vIGlmKHBhZ2UgaW5zdGFuY2VvZiBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpIHsKLQkJCS8vICgoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKXBhZ2UpLnNldFByb2Nlc3MocHJvYyk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0KLQkJCWlmIChXQlNUYWIgIT0gbnVsbCkgewotCQkJCVdCU1RhYi5zZXRQcm9jZXNzKHNlbGVjdGVkUHJvY2Vzcyk7Ci0JCQl9Ci0JCQkKLQkJCWlmICggT0JTVGFiICE9IG51bGwgKSB7Ci0JCQkJT0JTVGFiLnNldFByb2Nlc3Moc2VsZWN0ZWRQcm9jZXNzKTsKLQkJCX0KLQkJCQotCQkJaWYgKCBQQlNUYWIgIT0gbnVsbCApIHsKLQkJCQlQQlNUYWIuc2V0UHJvY2VzcyhzZWxlY3RlZFByb2Nlc3MpOwotCQkJfQotCQkJCi0JCQlpZiAoIHByb2NUYWIgIT0gbnVsbCApIHsKLQkJCQlwcm9jVGFiLnNldFByb2Nlc3Moc2VsZWN0ZWRQcm9jZXNzKTsKLQkJCX0KLQkJCQotCQkJaWYgKGV4dGVuc2lvblRhYnMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uVGFicy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZXh0ZW5zaW9uVGFic1tpXSAhPSBudWxsKSB7Ci0JCQkJCQlleHRlbnNpb25UYWJzW2ldLnNldFByb2Nlc3Moc2VsZWN0ZWRQcm9jZXNzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzICBnZXRUb3BCcmVha2Rvd25FbGVtZW50KFByb2Nlc3NDb21wb25lbnQgc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCXJldHVybiAoUHJvY2VzcykgUHJvY2Vzc1V0aWwuZ2V0VG9wQnJlYWtkb3duRWxlbWVudChzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQpOwotCX0KLQkKLQkgICAvKioKLSAgICAgKiBAcGFyYW0gc2VsZWN0ZWRQcm9jZXNzCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbihQcm9jZXNzIHNlbGVjdGVkUHJvY2VzcykgewotICAgICAgICByZXR1cm4gU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24oc2VsZWN0ZWRQcm9jZXNzKTsKLSAgICB9Ci0KLSAgICAKLQkvLyBwcml2YXRlIFN0cmluZyBnZXRUaXRsZVByZWZpeCgpIHsKLQkvLyBJRWRpdG9ySW5wdXQgaW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOwotCS8vIGlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgewotCS8vIE9iamVjdCBvYmogPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgaW5wdXQpLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkvLyBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCS8vIFByb2Nlc3NDb21wb25lbnQgcGMgPSAoUHJvY2Vzc0NvbXBvbmVudCkgb2JqOwotCS8vIFByb2Nlc3MgcHJvYyA9IHBjLmdldFByb2Nlc3MoKTsKLQkvLyBpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JLy8gcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9DQVBBQklMSVRZX1BBVFRFUk47Ci0JLy8gfSBlbHNlIGlmIChwcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JLy8gcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9ERUxJVkVSWV9QUk9DRVNTOwotCS8vIH0gZWxzZSBpZiAocHJvYyBpbnN0YW5jZW9mIFByb2Nlc3NDb250cmlidXRpb24pIHsKLQkvLyByZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX1BST0NFU1NfQ09OVFJJQlVUSU9OOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcwotCS8vIC5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLlByb2Nlc3NFZGl0b3IuVGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCS8vIH0KLQotCXByb3RlY3RlZCBJbWFnZSBnZXRQcm9jVGl0bGVJbWFnZSgpIHsKLQkJSUVkaXRvcklucHV0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQlPYmplY3Qgb2JqID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0KS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcGMgPSAoUHJvY2Vzc0NvbXBvbmVudCkgb2JqOwotCQkJCVByb2Nlc3MgcHJvYyA9IHBjLmdldFByb2Nlc3MoKTsKLQkJCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJCXJldHVybiBMaWJyYXJ5VUlJbWFnZXMuSU1HX0NBUEFCSUxJVFlfUEFUVEVSTjsKLQkJCQl9IGVsc2UgaWYgKHByb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfREVMSVZFUllfUFJPQ0VTUzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfUFJPQ0VTUzsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgUHJvcGVydGllcyB2aWV3IGRyb3AgZG93biBtZW51Ci0JICogCi0JICogQHBhcmFtIHBhcnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVQcm9wZXJ0aWVzRHJvcERvd25NZW51KElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0KSB7Ci0JCQlJVmlld1NpdGUgdmlldyA9ICgoUHJvcGVydHlTaGVldCkgcGFydCkuZ2V0Vmlld1NpdGUoKTsKLQotCQkJSU1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSB2aWV3LmdldEFjdGlvbkJhcnMoKS5nZXRNZW51TWFuYWdlcigpOwotCQkJLy8gSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IG1lbnVNZ3IuZ2V0SXRlbXMoKTsKLQkJCS8vIGZvciAoaW50IGk9MDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQotCQkJLy8gewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJJZCA9IiArIGkgKyAiICIgKyBpdGVtc1tpXS5nZXRJZCgpICsgIiQiKTsKLQkJCS8vIH0KLQkJCW1lbnVNZ3IucmVtb3ZlQWxsKCk7Ci0JCQltZW51TWdyLnVwZGF0ZUFsbCh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3IjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkKLQkJCXRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCi0JCS8vIFRPRE86IG5lZWQgcmV2aXNpdAotCQkvLyBzaXRlLnNldFNlbGVjdGlvblByb3ZpZGVyKG5ldyBGb3JtRWRpdG9yU2VsZWN0aW9uUHJvdmlkZXIodGhpcykpOwotCQkvLyBhY3Rpb25NYW5hZ2VyID0gZ2V0QWN0aW9uTWFuYWdlcigpOwotCi0JCUxpc3QgZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQkJYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShmYWN0b3JpZXMpOwotCi0JCS8vIENyZWF0ZSB0aGUgY29tbWFuZCBzdGFjayB0aGF0IHdpbGwgbm90aWZ5IHRoaXMgZWRpdG9yIGFzIGNvbW1hbmRzIGFyZQotCQkvLyBleGVjdXRlZC4KLQkJLy8KLQkJQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IGFjdGlvbk1nci5nZXRDb21tYW5kU3RhY2soKTsgLy8gbmV3Ci0JCS8vIEJhc2ljQ29tbWFuZFN0YWNrKCk7Ci0KLQkJLy8gQWRkIGEgbGlzdGVuZXIgdG8gc2V0IHRoZSBtb3N0IHJlY2VudCBjb21tYW5kJ3MgYWZmZWN0ZWQgb2JqZWN0cyB0bwotCQkvLyBiZSB0aGUgc2VsZWN0aW9uIG9mIHRoZSB2aWV3ZXIgd2l0aCBmb2N1cy4KLQkJLy8KLQkJY29tbWFuZFN0YWNrLmFkZENvbW1hbmRTdGFja0xpc3RlbmVyKG5ldyBDb21tYW5kU3RhY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoZmluYWwgRXZlbnRPYmplY3QgZXZlbnQpIHsKLQkJCQlib29sZWFuIHJ1biA9IGZhbHNlOwotCQkJCWlmIChldmVudCBpbnN0YW5jZW9mIENvbW1hbmRTdGFja0NoYW5nZWRFdmVudCkgewotCQkJCQlzd2l0Y2ggKCgoQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50KSBldmVudCkuZ2V0VHlwZSgpKSB7Ci0JCQkJCWNhc2UgQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50LkVYRUNVVEVEOgotCQkJCQljYXNlIENvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5VTkRPOgotCQkJCQkJcnVuID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcnVuID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKHJ1bikgewotCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKLQotCQkJCQkJCS8vIFRyeSB0byBzZWxlY3QgdGhlIGFmZmVjdGVkIG9iamVjdHMuCi0JCQkJCQkJLy8KLQkJCQkJCQlDb21tYW5kIG1vc3RSZWNlbnRDb21tYW5kID0gKChDb21tYW5kU3RhY2spIGV2ZW50Ci0JCQkJCQkJCQkuZ2V0U291cmNlKCkpLmdldE1vc3RSZWNlbnRDb21tYW5kKCk7Ci0JCQkJCQkJaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmICghKFRuZ1V0aWwudW53cmFwKG1vc3RSZWNlbnRDb21tYW5kKSBpbnN0YW5jZW9mIFNldENvbW1hbmQpKSB7Ci0JCQkJCQkJCQkJc2V0U2VsZWN0aW9uVG9WaWV3ZXIobW9zdFJlY2VudENvbW1hbmQKLQkJCQkJCQkJCQkJCS5nZXRBZmZlY3RlZE9iamVjdHMoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZiAobW9zdFJlY2VudENvbW1hbmQgaW5zdGFuY2VvZiBDcmVhdGVDaGlsZENvbW1hbmQKLQkJCQkJCQkJCQkJJiYgY3VycmVudFZpZXdlciBpbnN0YW5jZW9mIFByb2Nlc3NWaWV3ZXIpIHsKLQkJCQkJCQkJCQlPYmplY3RbXSBhcnIgPSBtb3N0UmVjZW50Q29tbWFuZAotCQkJCQkJCQkJCQkJLmdldEFmZmVjdGVkT2JqZWN0cygpLnRvQXJyYXkoKTsKLQkJCQkJCQkJCQlpZiAoYXJyLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCQkJCQkJCVByb2Nlc3NWaWV3ZXIgdmlld2VyID0gKFByb2Nlc3NWaWV3ZXIpIGN1cnJlbnRWaWV3ZXI7Ci0JCQkJCQkJCQkJCXZpZXdlci5lZGl0RWxlbWVudChhcnJbMF0sIDApOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJLy8gaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKLQkJCQkJCQkvLyBwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7Ci0JCQkJCQkJLy8gfQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIENyZWF0ZSB0aGUgZWRpdGluZyBkb21haW4gd2l0aCBhIHNwZWNpYWwgY29tbWFuZCBzdGFjay4KLQkJZWRpdGluZ0RvbWFpbiA9IG5ldyBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjayk7Ci0KLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcihsaWJTdmNMaXN0ZW5lcik7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5hZGRMaXN0ZW5lcihsaWJyYXJ5TGlzdGVuZXIpOwotCQkJbWFuYWdlci5zdGFydExpc3RlbmluZ1RvKGFjdGlvbk1nci5nZXRDb21tYW5kU3RhY2soKSk7Ci0KLQkJCS8vIFRPRE86IG5lZWQgdG8gcmV2aXNpdCB0aGlzIGNvZGUKLQkJCWlmICghYWRkQWRhcHRlckZhY3RvcnlMaXN0ZW5lcnMpIHsKLQkJCQlhZGRBZGFwdGVyRmFjdG9yeUxpc3RlbmVycyA9IHRydWU7Ci0JCQkJbWFuYWdlci5zdGFydExpc3RlbmluZ1RvKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJbWFuYWdlci5zdGFydExpc3RlbmluZ1RvKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJbWFuYWdlci5zdGFydExpc3RlbmluZ1RvKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvL3NldFBhcnROYW1lKGlucHV0LmdldE5hbWUoKSk7Ci0JCS8vc2V0VGl0bGVJbWFnZShnZXRQcm9jVGl0bGVJbWFnZSgpKTsKLQotCQlzZXRQYXJ0RmFjYWRlKGlucHV0KTsKLQotCQkvLyBnZXQgbWV0aG9kIGVsZW1lbnQgb2JqZWN0IGZyb20gRWRpdG9yIGlucHV0Ci0JCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBtZXRob2RFbGVtZW50SW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dDsKLQkJZWxlbWVudE9iaiA9IG1ldGhvZEVsZW1lbnRJbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0KLQkJaWYgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQgPSAoKFByb2Nlc3NDb21wb25lbnQpIGVsZW1lbnRPYmopOwotCQkJc2VsZWN0ZWRQcm9jZXNzID0gc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50LmdldFByb2Nlc3MoKTsKLQkJfQotCi0JCWlmIChzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQgIT0gbnVsbCkgewotCQkJc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50LmVBZGFwdGVycygpLmFkZChwcm9jZXNzQ29tcG9uZW50TGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gbGlzdGVuIHRvIHJlc291cmNlIGNoYW5nZSB0byB1cGRhdGUgZGlydHkgZmxhZwotCQkvLwotCQkvLyBhZGRSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcigpOwotCi0JCS8vIGFkZCBwYXJ0IGxpc3RlbmVyIHRvIGxpc3RlbiB0byBwcm9wZXJ0eVNoZWV0IGNsb3NlIGV2ZW50Ci0JCWdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLmFkZFBhcnRMaXN0ZW5lcigKLQkJCQlwYXJ0QWN0aXZhdGlvbkxpc3RlbmVyKTsKLQotCQkvLyBpbnB1dENoYW5nZWQoaW5wdXQpOwotCi0JCS8vIGxpc3RlbiB0byB0aGUgY2hhbmdlIG9mIGNvbHVtbiBsaXN0IGluIHByZWZlcmVuY2Ugc3RvcmUKLQkJLy8KLQkJaWYgKHByZWZTdG9yZUxpc3RlbmVyID09IG51bGwpIHsKLQkJCXByZWZTdG9yZUxpc3RlbmVyID0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcigpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKElQcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlciBldmVudCkgewotCQkJCQlQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgcGFnZSA9IG51bGw7Ci0JCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscygKLQkJCQkJCQlBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUykpIHsKLQkJCQkJCXBhZ2UgPSBXQlNUYWI7Ci0JCQkJCX0gZWxzZSBpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoCi0JCQkJCQkJQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMpKSB7Ci0JCQkJCQlwYWdlID0gT0JTVGFiOwotCQkJCQl9IGVsc2UgaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKAotCQkJCQkJCUFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUykpIHsKLQkJCQkJCXBhZ2UgPSBQQlNUYWI7Ci0JCQkJCX0KLQkJCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCQkJQ29sdW1uRGVzY3JpcHRvcltdIGNvbHMgPSB0b0NvbHVtbkRlc2NyaXB0b3JzKGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQkJCQkJCQlldmVudC5nZXRQcm9wZXJ0eSgpKSk7Ci0JCQkJCQlwYWdlLnVwZGF0ZUNvbHVtbnMoY29scyk7Ci0JCQkJCQlpZiAocGFnZSA9PSBXQlNUYWIgfHwgcGFnZSA9PSBPQlNUYWIpIHsKLQkJCQkJCQkvLyB1cGRhdGUgY29uc29saWRhdGVkIHZpZXcgYXMgd2VsbAotCQkJCQkJCS8vCi0JCQkJCQkJLy8gZ2V0IFdCUyBjb2x1bW5zCi0JCQkJCQkJTGlzdCBsaXN0ID0gdG9Db2x1bW5EZXNjcmlwdG9yTGlzdChnZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCQkJCQkJLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUykpOwotCi0JCQkJCQkJLy8gZ2V0IFRCUyBjb2x1bW5zIAotCQkJCQkJCUNvbHVtbkRlc2NyaXB0b3JbXSB0ZWFtQ29sdW1uRGVzY3JpcHRvcnMgPSB0b0NvbHVtbkRlc2NyaXB0b3JzKGdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJCQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1RCU19DT0xVTU5TKSk7Ci0KLQkJCQkJCQkvLyBpZiBUQlMgY29sdW1ucyBoYXMgVEVBTSBjb2x1bW4gdGhlbiBhZGQgdG8gY29uc29saWRhdGVkIHZpZXcKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRlYW1Db2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQlDb2x1bW5EZXNjcmlwdG9yIGNvbERlc2MgPSB0ZWFtQ29sdW1uRGVzY3JpcHRvcnNbaV07Ci0JCQkJCQkJCWlmIChjb2xEZXNjID09IENPTF9ERVNDX1RFQU0pIHsKLQkJCQkJCQkJCWxpc3QuYWRkKGNvbERlc2MpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJQ29sdW1uRGVzY3JpcHRvcltdIGNvbHVtbnMgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcltsaXN0LnNpemUoKV07Ci0JCQkJCQkJbGlzdC50b0FycmF5KGNvbHVtbnMpOwotCQkJCQkJCXByb2NUYWIudXBkYXRlQ29sdW1ucyhjb2x1bW5zKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfTsKLQkJfQotCi0JCWdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJlZlN0b3JlTGlzdGVuZXIpOwotCQkKLQkJZGlhZ3JhbUVkaXRvckhlbHBlciA9IG5ldyBEaWFncmFtRWRpdG9ySGVscGVyKCk7Ci0KLQl9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gaW5wdXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRQYXJ0RmFjYWRlKElFZGl0b3JJbnB1dCBpbnB1dCkgewotICAgICAgICBzZXRQYXJ0TmFtZShpbnB1dC5nZXROYW1lKCkpOwotICAgICAgICBzZXRUaXRsZUltYWdlKGdldFByb2NUaXRsZUltYWdlKCkpOwotICAgIH0KLQotCS8qKgotCSAqIFRoaXMgc2V0cyB0aGUgc2VsZWN0aW9uIGludG8gd2hpY2hldmVyIHZpZXdlciBpcyBhY3RpdmUuIAotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsICYmIGNvbGxlY3Rpb24gIT0gbnVsbCAmJiAhY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgaXRlbXMgaW4gdGhlIGN1cnJlbnQgY29udGVudCB2aWV3ZXIgb2YKLQkJCQkJLy8gdGhlIGVkaXRvci4KLQkJCQkJLy8KLQkJCWN1cnJlbnRWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQljb2xsZWN0aW9uLnRvQXJyYXkoKSksIHRydWUpOwotCQl9Ci0JfQotCi0JcHVibGljIEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpIHsKLQkJcmV0dXJuIChFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IpIGdldEVkaXRvclNpdGUoKQotCQkJCS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGNsb3NlIGFsbCBkaWFncmFtIGVkaXRvcnMgb2YgdGhpcyBwcm9jZXNzCi0JCS8vCi0JCWNsb3NlQWxsRGlhZ3JhbUVkaXRvcnMoKTsKLQkJCi0JCWdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJlZlN0b3JlTGlzdGVuZXIpOwotCi0JCS8vIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCQkvLwotCQkvLyBnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCi0JCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQotCQlpZiAoZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5nZXRBY3RpdmVFZGl0b3IoKSA9PSB0aGlzKSB7Ci0JCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihudWxsKTsKLQkJfQotCi0JCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZS5kaXNwb3NlKCk7Ci0JCX0KLQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIucmVtb3ZlTGlzdGVuZXIobGlicmFyeUxpc3RlbmVyKTsKLQkJCW1hbmFnZXIuc3RvcExpc3RlbmluZ1RvKGVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpOwotCQl9Ci0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVtb3ZlTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCi0JCWlmIChzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQgIT0gbnVsbCkgewotCQkJc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50LmVBZGFwdGVycygpLnJlbW92ZSgKLQkJCQkJcHJvY2Vzc0NvbXBvbmVudExpc3RlbmVyKTsKLQkJfQotCi0JCS8vIHJlbW92ZVJlc291cmNlQ2hhbmdlZExpc3RlbmVyKCk7Ci0KLQkJZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFBhcnRTZXJ2aWNlKCkucmVtb3ZlUGFydExpc3RlbmVyKAotCQkJCXBhcnRBY3RpdmF0aW9uTGlzdGVuZXIpOwotCi0JCWJvb2xlYW4gc2F2ZU5lZWRlZCA9IGlzRGlydHkoKTsKLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJCi0JCWlmKGRpYWdyYW1FZGl0b3JIZWxwZXIgIT0gbnVsbCkKLQkJCWRpYWdyYW1FZGl0b3JIZWxwZXIuZGlzcG9zZSgpOwotCi0KLQkJLy8gY2FsbCB0aGlzIHRvIHNldCBtb2RpZmllZCBmbGFnIG9mIHN1cHByZXNzaW9uIHRvIGZhbHNlCi0JCS8vCi0JCXN1cHByZXNzaW9uLnNhdmVJc0RvbmUoKTsKLQotCQlpZiAoc2F2ZU5lZWRlZCkgewotCQkJLy8gdXNlciBkaXNjYXJkZWQgYWxsIHRoZSBjaGFuZ2VzLCBzYXZlIHRoZSByZXNvdXJjZXMgYWZ0ZXIgY2hhbmdlcwotCQkJLy8gYXJlIHVuZG9uZS4KLQkJCS8vIFRPRE86IHJlbG9hZCB0aGUgcHJvY2VzcyBjb21wb25lbnQgcmVzb3VyY2UgaW5zdGVhZCBzaW5jZSBpdCBpcwotCQkJLy8gbm90IHNoYXJlZC4KLQkJCS8vCi0JCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkvLyBSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkvLyBzYXZlUmVzb3VyY2UocmVzb3VyY2UpOwotCQkJLy8gfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsb3NlQWxsRGlhZ3JhbUVkaXRvcnMoKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZih3b3JrYmVuY2hQYWdlID09IG51bGwpIHsKLQkJCS8vIHdvcmtiZW5jaCBpcyBjbG9zaW5nLCBhbGwgZWRpdG9yIHdpbGwgYmUgY2xvc2VkIHNvIG5vIG5lZWQgdG8gY2xvc2UgdGhlIGRpYWdyYW0gZWRpdG9yIGhlcmUKLQkJCS8vCi0JCQlyZXR1cm47Ci0JCX0KLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJQXJyYXlMaXN0PElFZGl0b3JSZWZlcmVuY2U+IGRpYWdyYW1FZGl0b3JSZWZzID0gbmV3IEFycmF5TGlzdDxJRWRpdG9yUmVmZXJlbmNlPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSB7Ci0JCQkJRGlhZ3JhbUVkaXRvcklucHV0IGRpYWdyYW1JbnB1dCA9ICgoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIGlucHV0KQotCQkJCS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCQlpZiAoZGlhZ3JhbUlucHV0ICE9IG51bGwpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gZGlhZ3JhbUlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50Ci0JCQkJCQkJJiYgc2VsZWN0ZWRQcm9jZXNzID09IFRuZ1V0aWwKLQkJCQkJCQkuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudCkpIHsKLQkJCQkJCWRpYWdyYW1FZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKCFkaWFncmFtRWRpdG9yUmVmcy5pc0VtcHR5KCkpIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2VbXSByZWZzID0gbmV3IElFZGl0b3JSZWZlcmVuY2VbZGlhZ3JhbUVkaXRvclJlZnMuc2l6ZSgpXTsKLQkJCWRpYWdyYW1FZGl0b3JSZWZzLnRvQXJyYXkocmVmcyk7Ci0JCQl3b3JrYmVuY2hQYWdlLmNsb3NlRWRpdG9ycyhyZWZzLCB0cnVlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0aW9uUGFnZSgpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCWlmIChzZWxlY3RlZFByb2Nlc3MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCS8vIERlbGl2ZXJ5IFByb2Nlc3MKLQkJCWFkZFBhZ2UoMCwgbmV3IERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKHRoaXMpKTsKLQkJfSBlbHNlIHsKLQkJCS8vIENhcGFiaWxpdHkgUGF0dGVybgotCQkJLy8gUHJvY2VzcyBDb250cmlidXRpb24KLQkJCWFkZFBhZ2UoMCwgbmV3IFByb2Nlc3NEZXNjcmlwdGlvbih0aGlzKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yI2FkZFBhZ2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYWdlcygpIHsKLQkJdHJ5IHsKLQkJCWFkZERlc2NyaXB0aW9uUGFnZSgpOwotCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCQkJLy8gY3JlYXRlIERORCB0cmFuc2ZlciBvYmplY3RzCi0JCQkvLyBpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9MSU5LOwotCQkJLy8gVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXQotCQkJLy8ge0xvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OwotCi0JCQkvLyBwcmVmZXJlbmNlIGlzIG1hbmFnZWQgYnkgbGlicmFyeSBwbHVnaW4sCi0JCQkvLyBzaW5jZSB0aGlzIHByZWZlcmVuY2VzIGlzIGFsc28gdXNlZCBmb3IgYnJvd3NpbmcgYW5kIHB1Ymxpc2hpbmcKLQkJCS8vIEppbmh1YSBYaSAwOC8yMS8yMDA2Ci0JCQkvLyBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkvLyAuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQlQcmVmZXJlbmNlVXRpbC52YWxpZGF0ZVByZWZlcmVuY2VzKCk7Ci0JCQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkJCi0JCQlMaXN0IHBhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQkvLyBXQlMgdGFiCi0JCQlXQlNUYWIgPSBuZXcgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKHRoaXMsIFdCU19GT1JNX0lELAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1dvcmtCcmVha2Rvd25TdHJ1Y3R1cmUpOyAKLQkJCUNvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5EZXNjcmlwdG9ycyA9IHRvQ29sdW1uRGVzY3JpcHRvcnMoc3RvcmUKLQkJCQkJLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUykpOwotCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCWN1cnJlbnRDb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRQotCQkJCQkuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjdXJyZW50Q29uZmlnKTsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJLnNldEZpbHRlcihQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFKTsKLQkJCX0KLQkJCVdCU1RhYi5zZXRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7Ci0JCQlXQlNUYWIuc2V0Q29sdW1uRGVzY3JpcHRvcnMoY29sdW1uRGVzY3JpcHRvcnMpOwotCQkJaW50IGlkID0gYWRkUGFnZShXQlNUYWIuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSkpOwotCQkJc2V0UGFnZVRleHQoaWQsIFdCU1RhYi5nZXRUaXRsZSgpKTsKLQkJCVdCU1RhYi5zZXRUYWJJbmRleChpZCk7Ci0JCQlTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSBXQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQljcmVhdGVDb250ZXh0TWVudUZvcih2aWV3ZXIpOwotCQkJcGFnZXMuYWRkKFdCU1RhYik7Ci0JCQkvLyB2aWV3ZXIuYWRkRHJvcFN1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcKLQkJCS8vIFByb2Nlc3NFZGl0b3JEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKLQkJCS8vIHZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpCi0JCQkvLyB7Ci0JCQkvLyBwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KQotCQkJLy8gewotCQkJLy8gVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkuaGFuZGxlRG91YmxlQ2xpY2tFdmVudChldmVudCk7Ci0JCQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oImRvdWJsZSBjbGlja2VkIC4uLiIpOwotCQkJLy8gLy8KLQkJCS8vIC8vIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQkvLyBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigic2VsIitzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJLy8gLy8KLQkJCS8vIFByb2R1Y3RFZGl0b3JWaWV3LmdldFZpZXcoKS5nZXRQcm9kdWN0Vmlld2VyKCkuc2V0SW5wdXQoc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCS8vIH0KLQkJCS8vIH0pOwotCQkJLy8gYWRkUGFnZShXQlNUYWIpOwotCi0JCQkvLyBPQlMgdGFiCi0JCQlPQlNUYWIgPSBuZXcgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKHRoaXMsIFRBX0ZPUk1fSUQsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfVGVhbUFsbG9jYXRpb24pOyAKLQkJCWNvbHVtbkRlc2NyaXB0b3JzID0gdG9Db2x1bW5EZXNjcmlwdG9ycyhzdG9yZQotCQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1RCU19DT0xVTU5TKSk7Ci0JCQkvLyBzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQWRhcHRlckZhY3RvcmllcygpLAotCQkJLy8gY29sdW1uRGVzY3JpcHRvcnMpOwotCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJLnNldEZpbHRlcihQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFKTsKLQkJCX0KLQkJCU9CU1RhYi5zZXRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7Ci0JCQlPQlNUYWIuc2V0Q29sdW1uRGVzY3JpcHRvcnMoY29sdW1uRGVzY3JpcHRvcnMpOwotCQkJaWQgPSBhZGRQYWdlKE9CU1RhYi5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKSk7Ci0JCQlzZXRQYWdlVGV4dChpZCwgT0JTVGFiLmdldFRpdGxlKCkpOwotCQkJT0JTVGFiLnNldFRhYkluZGV4KGlkKTsKLQkJCXZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSBPQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQljcmVhdGVDb250ZXh0TWVudUZvcih2aWV3ZXIpOwotCQkJcGFnZXMuYWRkKE9CU1RhYik7Ci0JCQkvLyB2aWV3ZXIuYWRkRHJvcFN1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcKLQkJCS8vIFByb2Nlc3NFZGl0b3JEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKLQkJCS8vIGFkZFBhZ2UoT0JTVGFiKTsKLQotCQkJLy8gUEJTIHRhYgotCQkJUEJTVGFiID0gbmV3IFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSh0aGlzLCBXUEJTX0ZPUk1fSUQsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfV29ya1Byb2R1Y3RVc2FnZSk7IAotCQkJY29sdW1uRGVzY3JpcHRvcnMgPSB0b0NvbHVtbkRlc2NyaXB0b3JzKHN0b3JlCi0JCQkJCS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV1BCU19DT0xVTU5TKSk7Ci0JCQkvLyBzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNfQWRhcHRlckZhY3RvcmllcygpLAotCQkJLy8gY29sdW1uRGVzY3JpcHRvcnMpOwotCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJLnNldEZpbHRlcihQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFKTsKLQkJCX0KLQkJCVBCU1RhYi5zZXRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7Ci0JCQlQQlNUYWIuc2V0Q29sdW1uRGVzY3JpcHRvcnMoY29sdW1uRGVzY3JpcHRvcnMpOwotCQkJaWQgPSBhZGRQYWdlKFBCU1RhYi5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKSk7Ci0JCQlzZXRQYWdlVGV4dChpZCwgUEJTVGFiLmdldFRpdGxlKCkpOwotCQkJUEJTVGFiLnNldFRhYkluZGV4KGlkKTsKLQkJCXZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSBQQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQljcmVhdGVDb250ZXh0TWVudUZvcih2aWV3ZXIpOwotCQkJcGFnZXMuYWRkKFBCU1RhYik7Ci0JCQkvLyB2aWV3ZXIuYWRkRHJvcFN1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcKLQkJCS8vIFByb2Nlc3NFZGl0b3JEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKLQkJCS8vIGFkZFBhZ2UoUEJTVGFiKTsKLQotCQkJLy8gY29uc29saWRhdGVkIHRhYgotCQkJcHJvY1RhYiA9IG5ldyBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UodGhpcywKLQkJCQkJQ09OU09MSURBVEVEX0ZPUk1fSUQsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQ29uc29saWRhdGVkVmlldyk7IAotCQkJcHJvY1RhYi5zZXRSZWFkT25seSh0cnVlKTsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCS5zZXRGaWx0ZXIoUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRSk7Ci0JCQl9Ci0JCQlwcm9jVGFiLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLS8vCQkJY29sdW1uRGVzY3JpcHRvcnMgPSB0b0NvbHVtbkRlc2NyaXB0b3JzKHN0b3JlCi0vLwkJCQkJLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUykpOwotLy8JCQkKLQkJCS8vIGdldCBXQlMgY29sdW1ucwotCQkJTGlzdCBsaXN0ID0gdG9Db2x1bW5EZXNjcmlwdG9yTGlzdChzdG9yZQotCQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKSk7Ci0KLQkJCS8vIGdldCBUQlMgY29sdW1ucyAKLQkJCUNvbHVtbkRlc2NyaXB0b3JbXSB0ZWFtQ29sdW1uRGVzY3JpcHRvcnMgPSB0b0NvbHVtbkRlc2NyaXB0b3JzKHN0b3JlCi0JCQkJCS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMpKTsKLQotCQkJLy8gaWYgVEJTIGNvbHVtbnMgaGFzIFRFQU0gY29sdW1uIHRoZW4gYWRkIHRvIGNvbnNvbGlkYXRlZCB2aWV3Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRlYW1Db2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCUNvbHVtbkRlc2NyaXB0b3IgY29sRGVzYyA9IHRlYW1Db2x1bW5EZXNjcmlwdG9yc1tpXTsKLQkJCQlpZiAoY29sRGVzYyA9PSBDT0xfREVTQ19URUFNKSB7Ci0JCQkJCWxpc3QuYWRkKGNvbERlc2MpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUNvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5zID0gbmV3IENvbHVtbkRlc2NyaXB0b3JbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KGNvbHVtbnMpOwotCQkJcHJvY1RhYi5zZXRDb2x1bW5EZXNjcmlwdG9ycyhjb2x1bW5zKTsKLQkJCQotCQkJaWQgPSBhZGRQYWdlKHByb2NUYWIuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSkpOwotCQkJc2V0UGFnZVRleHQoaWQsIHByb2NUYWIuZ2V0VGl0bGUoKSk7Ci0JCQlwcm9jVGFiLnNldFRhYkluZGV4KGlkKTsKLQkJCXZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSBwcm9jVGFiLmdldFZpZXdlcigpOwotCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Iodmlld2VyKTsKLQkJCXBhZ2VzLmFkZChwcm9jVGFiKTsKLQotCQkJLy8gY2hlY2sgZm9yIGV4dGVuc3Rpb24gcG9pbnQgYW5kIGFkZCB0aGUgcGFnZSBpZiB0aGVyZQotCQkJTGlzdCBwYWdlUHJvdmlkZXJzID0gUHJvY2Vzc0VkaXRvclBhZ2VQcm92aWRlci5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRQYWdlUHJvdmlkZXJzKCk7Ci0KLQkJCWlmIChwYWdlUHJvdmlkZXJzICE9IG51bGwgJiYgcGFnZVByb3ZpZGVycy5zaXplKCkgPiAwKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZXh0ZW5zaW9uVGFicyA9IG5ldyBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2VbcGFnZVByb3ZpZGVycwotCQkJCQkJCS5zaXplKCldOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VQcm92aWRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCU9iamVjdCBwYWdlID0gcGFnZVByb3ZpZGVycy5nZXQoaSk7Ci0JCQkJCQlpZiAocGFnZSBpbnN0YW5jZW9mIElFeHRlbnNpb25Gb3JtUGFnZSkgewotCi0JCQkJCQkJSUV4dGVuc2lvbkZvcm1QYWdlIGZvcm1QYWdlID0gKElFeHRlbnNpb25Gb3JtUGFnZSkgcGFnZTsKLQkJCQkJCQlJRm9ybVBhZ2UgY29udHJvbCA9IGZvcm1QYWdlLnNldEVkaXRvcih0aGlzKTsKLQkJCQkJCQlmb3JtUGFnZS5zZXRJbnB1dChzZWxlY3RlZFByb2Nlc3MpOwotCQkJCQkJCVByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBleHRlbmRlZFBhZ2UgPSBudWxsOwotCQkJCQkJCWlmIChjb250cm9sIGluc3RhbmNlb2YgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSB7Ci0JCQkJCQkJCWV4dGVuZGVkUGFnZSA9IChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpIGNvbnRyb2w7Ci0JCQkJCQkJCWV4dGVuc2lvblRhYnNbaV0gPSBleHRlbmRlZFBhZ2U7Ci0JCQkJCQkJfQotCi0JCQkJCQkJaWQgPSBhZGRQYWdlKGV4dGVuZGVkUGFnZQotCQkJCQkJCQkJLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpKTsKLQkJCQkJCQlzZXRQYWdlVGV4dChpZCwgZXh0ZW5kZWRQYWdlLmdldFRpdGxlKCkpOwotCQkJCQkJCWV4dGVuZGVkUGFnZS5zZXRUYWJJbmRleChpZCk7Ci0JCQkJCQkJdmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIGV4dGVuZGVkUGFnZQotCQkJCQkJCQkJLmdldFZpZXdlcigpOwotCQkJCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHZpZXdlcik7Ci0KLQkJCQkJCQlwYWdlcy5hZGQoZXh0ZW5kZWRQYWdlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlic1BhZ2VzID0gbmV3IFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZVtwYWdlcy5zaXplKCldOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5zaXplKCk7IGkrKykgewotCQkJCWJzUGFnZXNbaV0gPSAoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSBwYWdlcy5nZXQoaSk7Ci0JCQl9Ci0KLQkJCS8vIGJzUGFnZXMgPSBuZXcgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlW10geyBXQlNUYWIsCi0JCQkvLyBPQlNUYWIsCi0JCQkvLyBQQlNUYWIsIHByb2NUYWIgfTsKLQotCQkJLy8gaWYoZ2V0RWRpdG9ySW5wdXQoKSBpbnN0YW5jZW9mIFByb2Nlc3NFZGl0b3JJbnB1dCkgewotCQkJLy8gaW50IHBhZ2VJZCA9Ci0JCQkvLyAoKFByb2Nlc3NFZGl0b3JJbnB1dClnZXRFZGl0b3JJbnB1dCgpKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkvLyBpZihwYWdlSWQgIT0gLTEpIHsKLQkJCS8vIHNldEFjdGl2ZVBhZ2UoMCk7Ci0JCQkvLyBzZXRBY3RpdmVQYWdlKHBhZ2VJZCk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0KLQkJCWlucHV0Q2hhbmdlZChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEFjdGl2ZVBhZ2UoaW50IHBhZ2VJbmRleCkgewotCQlzdXBlci5zZXRBY3RpdmVQYWdlKHBhZ2VJbmRleCk7Ci0KLQkJLy8gd29yayBhcm91bmQgZm9yIGFjdGl2ZSBwYWdlIHRoYXQgaXMgbm90IGEgZm9ybSBwYWdlLiBTdXBlciBtZXRob2QKLQkJLy8gZG9lcyBub3QgY2FsbCBwYWdlQ2hhbmdlKCkgaW4gdGhpcyBjYXNlCi0JCS8vCi0JCWhhbmRsZVBhZ2VDaGFuZ2UoKTsKLQkJaWYgKHBhZ2VJbmRleCA+IDAgJiYgYnNQYWdlcy5sZW5ndGggPD0gcGFnZUluZGV4KSB7Ci0JCQlWaWV3ZXIgdmlld2VyID0gYnNQYWdlc1twYWdlSW5kZXhdLmdldFZpZXdlcigpOwotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCUlTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbiA9IG51bGw7Ci0JCQkJaWYgKGdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9ySW5wdXQpIHsKLQkJCQkJaW5pdGlhbFNlbGVjdGlvbiA9ICgoUHJvY2Vzc0VkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpKQotCQkJCQkJCS5nZXRJbml0aWFsU2VsZWN0aW9uKCk7Ci0JCQkJfQotCQkJCWlmIChpbml0aWFsU2VsZWN0aW9uID09IG51bGwpIHsKLQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWRQcm9jZXNzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzZWxlY3Rpb24gPSBpbml0aWFsU2VsZWN0aW9uOwotCQkJCX0KLQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3Ijc2V0QWN0aXZlUGFnZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJRm9ybVBhZ2Ugc2V0QWN0aXZlUGFnZShTdHJpbmcgcGFnZUlkKSB7Ci0JCWludCBpZCA9IC0xOwotCQlJRm9ybVBhZ2UgYWN0aXZlUGFnZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBwYWdlID0gcGFnZXMuZ2V0KGkpOwotCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBJRm9ybVBhZ2UpIHsKLQkJCQlJRm9ybVBhZ2UgZnBhZ2UgPSAoSUZvcm1QYWdlKSBwYWdlOwotCQkJCWlmIChmcGFnZS5nZXRJZCgpLmVxdWFscyhwYWdlSWQpKSB7Ci0JCQkJCWlkID0gaTsKLQkJCQkJYWN0aXZlUGFnZSA9IGZwYWdlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYoaWQgPT0gLTEpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnNQYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCVByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBwYWdlID0gYnNQYWdlc1tpXTsKLQkJCQlpZiAocGFnZS5nZXRJZCgpLmVxdWFscyhwYWdlSWQpKSB7Ci0JCQkJCWlkID0gcGFnZS5nZXRUYWJJbmRleCgpOwotCQkJCQlhY3RpdmVQYWdlID0gcGFnZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKGlkID09IC0xICYmIGV4dGVuc2lvblRhYnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25UYWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlIHBhZ2UgPSBleHRlbnNpb25UYWJzW2ldOwotCQkJCWlmIChwYWdlLmdldElkKCkuZXF1YWxzKHBhZ2VJZCkpIHsKLQkJCQkJaWQgPSBwYWdlLmdldFRhYkluZGV4KCk7Ci0JCQkJCWFjdGl2ZVBhZ2UgPSBwYWdlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZihhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCXNldEFjdGl2ZVBhZ2UoaWQpOwotCQkJcmV0dXJuIGFjdGl2ZVBhZ2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVBhZ2VDaGFuZ2UoKSB7Ci0JCWludCBpZCA9IGdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKGlkICE9IC0xKSB7Ci0JCQlPYmplY3QgcGFnZSA9IHBhZ2VzLmdldChpZCk7Ci0JCQlpZiAocGFnZSBpbnN0YW5jZW9mIFByb2Nlc3NEZXNjcmlwdGlvbikgewotCQkJCSgoUHJvY2Vzc0Rlc2NyaXB0aW9uKSBwYWdlKS5zZXRGb3JtVGV4dCgpOwotCQkJfQotCQkJaWYgKFdCU1RhYiAhPSBudWxsICYmIGlkID09IFdCU1RhYi5nZXRUYWJJbmRleCgpKSB7Ci0JCQkJc2V0Q3VycmVudFZpZXdlcihXQlNUYWIuZ2V0Vmlld2VyKCkpOwotCQkJfSBlbHNlIGlmIChPQlNUYWIgIT0gbnVsbCAmJiBpZCA9PSBPQlNUYWIuZ2V0VGFiSW5kZXgoKSkgewotCQkJCXNldEN1cnJlbnRWaWV3ZXIoT0JTVGFiLmdldFZpZXdlcigpKTsKLQkJCX0gZWxzZSBpZiAoUEJTVGFiICE9IG51bGwgJiYgaWQgPT0gUEJTVGFiLmdldFRhYkluZGV4KCkpIHsKLQkJCQlzZXRDdXJyZW50Vmlld2VyKFBCU1RhYi5nZXRWaWV3ZXIoKSk7Ci0JCQl9IGVsc2UgaWYgKHByb2NUYWIgIT0gbnVsbCAmJiBpZCA9PSBwcm9jVGFiLmdldFRhYkluZGV4KCkpIHsKLQkJCQlzZXRDdXJyZW50Vmlld2VyKHByb2NUYWIuZ2V0Vmlld2VyKCkpOwotCQkJfSBlbHNlIGlmIChleHRlbnNpb25UYWJzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvblRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGV4dGVuc2lvblRhYnNbaV0gIT0gbnVsbCAmJiBpZCA9PSBleHRlbnNpb25UYWJzW2ldLmdldFRhYkluZGV4KCkpCi0JCQkJCQlzZXRDdXJyZW50Vmlld2VyKGV4dGVuc2lvblRhYnNbaV0uZ2V0Vmlld2VyKCkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc2V0Q3VycmVudFZpZXdlcihudWxsKTsKLQkJCX0KLQotCQkJaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKLQkJCQlwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwYWdlQ2hhbmdlKGludCBuZXdQYWdlSW5kZXgpIHsKLQkJc3VwZXIucGFnZUNoYW5nZShuZXdQYWdlSW5kZXgpOwotCQloYW5kbGVQYWdlQ2hhbmdlKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGNvbnRleHQgbWVudSBmb3IgdGhlIGdpdmUgdmlld2VyCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRleHRNZW51Rm9yKGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7Ci0JCU1lbnVNYW5hZ2VyIGNvbnRleHRNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wVXAiKTsgLy8kTk9OLU5MUy0xJAotCQljb250ZXh0TWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQljb250ZXh0TWVudS5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsKLQkJTWVudSBtZW51ID0gY29udGV4dE1lbnUuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKLQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoY29udGV4dE1lbnUsIHZpZXdlcik7Ci0KLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCXNldFNlbGVjdGlvbihzZWwpOwotCQkJfQotCQl9KTsKLQotCQlpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0xJTksgfCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRTsKLQkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IExvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OwotCQl2aWV3ZXIuYWRkRHJvcFN1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLAotCQkJCW5ldyBQcm9jZXNzRWRpdG9yRHJvcEFkYXB0ZXIoZWRpdGluZ0RvbWFpbiwgdmlld2VyKSk7Ci0JCQotCQlkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0NPUFk7Ci0JCXRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHsgTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07Ci0JCXZpZXdlci5hZGREcmFnU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBWaWV3ZXJEcmFnQWRhcHRlcih2aWV3ZXIpKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEN1cnJlbnRWaWV3ZXIoVmlld2VyIHZpZXdlcikgewotCQkvLyBJZiBpdCBpcyBjaGFuZ2luZy4uLgotCQkvLwotCQlpZiAoY3VycmVudFZpZXdlciAhPSB2aWV3ZXIpIHsKLQkJCWlmIChzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJCS8vIENyZWF0ZSB0aGUgbGlzdGVuZXIgb24gZGVtYW5kLgotCQkJCS8vCi0JCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCS8vIFRoaXMganVzdCBub3RpZmllcyB0aG9zZSB0aGluZ3MgdGhhdCBhcmUgYWZmZWN0ZWQgYnkgdGhlCi0JCQkJCS8vIHNlY3Rpb24uCi0JCQkJCS8vCi0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoCi0JCQkJCQkJU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IHNlbGVjdGlvbkNoYW5nZWRFdmVudCkgewotCQkJCQkJc2V0U2VsZWN0aW9uKHNlbGVjdGlvbkNoYW5nZWRFdmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCi0JCQkvLyBTdG9wIGxpc3RlbmluZyB0byB0aGUgb2xkIG9uZS4KLQkJCS8vCi0JCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7Ci0JCQkJY3VycmVudFZpZXdlcgotCQkJCQkJLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOwotCQkJfQotCi0JCQkvLyBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG5ldyBvbmUuCi0JCQkvLwotCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOwotCQkJfQotCi0JCQkvLyBSZW1lbWJlciBpdC4KLQkJCS8vCi0JCQljdXJyZW50Vmlld2VyID0gdmlld2VyOwotCi0JCQkvLyBTZXQgYWRhcHRlciBmYWN0b3J5IG9mIGVkaXRpbmdEb21haW4gdG8gdGhhdCBvZiB0aGUgY3VycmVudCB2aWV3Ci0JCQkvLwotCQkJaWYgKGN1cnJlbnRWaWV3ZXIgaW5zdGFuY2VvZiBQcm9jZXNzVmlld2VyKSB7Ci0JCQkJSUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSAoKFByb2Nlc3NWaWV3ZXIpIGN1cnJlbnRWaWV3ZXIpCi0JCQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCQkJaWYgKGNvbnRlbnRQcm92aWRlciBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKSB7Ci0JCQkJCUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyID0gKChBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcikgY29udGVudFByb3ZpZGVyKTsKLQkJCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcgotCQkJCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBFZGl0aW5nRG9tYWluQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJCQkJKChFZGl0aW5nRG9tYWluQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5zZXRFZGl0aW5nRG9tYWluKGVkaXRpbmdEb21haW4pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZWRpdGluZ0RvbWFpbi5zZXRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJCX0KLQotCQkJCQlpZiAocHJvcENvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJCQlwcm9wQ29udGVudFByb3ZpZGVyLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gU2V0IHRoZSBlZGl0b3JzIHNlbGVjdGlvbiBiYXNlZCBvbiB0aGUgY3VycmVudCB2aWV3ZXIncwotCQkJLy8gc2VsZWN0aW9uLgotCQkJLy8KLQkJCXNldFNlbGVjdGlvbihjdXJyZW50Vmlld2VyID09IG51bGwgPyBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZCi0JCQkJCTogY3VycmVudFZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHkgZ2V0UGFyZW50QWN0aXZpdHkoQnJlYWtkb3duRWxlbWVudCBlLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJQWN0aXZpdHkgYWN0ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eShlKTsKLQkJaWYgKGFjdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWN0OwotCQl9Ci0KLQkJLy8gVE9ETzogaGFuZGxlIGVsZW1lbnQgdGhhdCBkb2VzIG5vdCBkaXJlY3RseSBiZWxvbmcgdG8gYW4gYWN0aXZpdHkKLQkJLy8gKGxpa2UgZGVsaXZlcmFibGUgcGFydCBvZiBhIGRlbGl2ZXJhYmxlIGRlc2NyaXB0b3IpCi0JCS8vCi0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeShTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgewotCQlyZXR1cm4gKChBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcikgdmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpKQotCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihWaWV3ZXIgdmlld2VyLAotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gb3RoZXJTZWwsIGJvb2xlYW4gYWx0ZXJuYXRlU2VsZWN0aW9uKSB7Ci0JCWlmIChhbHRlcm5hdGVTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCU9iamVjdCBjdXJyZW50U2VsZWN0aW9uID0gbnVsbDsKLQkJCWlmIChzZWwuc2l6ZSgpID09IDEpIHsKLQkJCQljdXJyZW50U2VsZWN0aW9uID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmIChjdXJyZW50U2VsZWN0aW9uIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQlBY3Rpdml0eSBhY3QgPSBnZXRQYXJlbnRBY3Rpdml0eSgKLQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgY3VycmVudFNlbGVjdGlvbiwKLQkJCQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgoU3RydWN0dXJlZFZpZXdlcikgdmlld2VyKSk7Ci0JCQkJCWlmIChhY3QgIT0gb3RoZXJTZWwuZ2V0Rmlyc3RFbGVtZW50KCkpIHsKLQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24ob3RoZXJTZWwsIHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG90aGVyU2VsLCB0cnVlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXZpZXdlci5zZXRTZWxlY3Rpb24ob3RoZXJTZWwsIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNzZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc3luY2hyb25pemluZ1NlbGVjdGlvbikgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gLy8gY2hlY2sgaWYgdGhlIHJlc291cmNlcyBvZiBzZWxlY3RlZCBvYmplY3RzIGFyZSBvdXQgb2Ygc3luY2ggb3IgYW55Ci0JCS8vIG9mIHRoZSBzZWxlY3RlZCBvYmplY3RzCi0JCS8vIC8vIGJlY2FtZSBwcm94eSB0aGVuIHJlZnJlc2ggdGhlbSBpZiBuZWVkZWQKLQkJLy8gLy8KLQkJLy8gaWYocmVmcmVzaE91dE9mU3luY2goc2VsZWN0aW9uKSkgewotCQkvLyByZXR1cm47Ci0JCS8vIH0KLQotCQl2aWV3U2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlBcnJheUxpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdChzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVyTGlzdC5zaXplKCk7IGkrKykgewotCQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBsaXN0ZW5lckxpc3QKLQkJCQkJLmdldChpKTsKLQkJCWxpc3RlbmVyCi0JCQkJCS5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgc2VsZWN0aW9uKSk7Ci0JCX0KLQotCQkvLyBzeW5jaHJvbml6ZSBzZWxlY3Rpb24gaW4gYWxsIEJTIHZpZXdzIGlmIG9ubHkgb25lIGVsZW1lbnQgaXMgc2VsZWN0ZWQKLQkJLy8KLQkJc3luY2hyb25pemVTZWxlY3Rpb24oc2VsZWN0aW9uLCBjdXJyZW50Vmlld2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlZnJlc2hPdXRPZlN5bmNoKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCWJvb2xlYW4gcmVmcmVzaFJlcXVpcmVkID0gZmFsc2U7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCUhhc2hTZXQ8UmVzb3VyY2U+IHJlc291cmNlcyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQlFT2JqZWN0IGVPYmplY3QgPSAoKEVPYmplY3QpIGUpOwotCQkJCQlpZiAoZU9iamVjdC5lSXNQcm94eSgpKSB7Ci0JCQkJCQllT2JqZWN0ID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc29sdmUoZU9iamVjdCk7Ci0JCQkJCQlyZWZyZXNoUmVxdWlyZWQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gZU9iamVjdC5lUmVzb3VyY2UoKTsKLQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCXJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFyZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQkJQXJyYXlMaXN0PFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQkJCQlBcnJheUxpc3Q8UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCQkJCVJlc291cmNlVXRpbC5jaGVja091dE9mU3luY2hSZXNvdXJjZXMocmVzb3VyY2VzLAotCQkJCQkJcmVtb3ZlZFJlc291cmNlcywgY2hhbmdlZFJlc291cmNlcyk7Ci0JCQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSB8fCAhY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJYm9vbGVhbiByZXQgPSBwcm9tcHRSZWxvYWRGaWxlcygpOwotCQkJCQlpZiAocmV0KSB7Ci0JCQkJCQkvLyB1bmxvYWQgdGhlIHJlbW92ZWQgcmVzb3VyY2VzCi0JCQkJCQkvLwotCQkJCQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCQkJCVBlcnNpc3RlbmNlVXRpbC51bmxvYWQocmVtb3ZlZFJlc291cmNlcyk7Ci0JCQkJCQl9Ci0KLQkJCQkJCUNvbGxlY3Rpb24gcmVsb2FkZWRSZXNvdXJjZXMgPSBudWxsOwotCQkJCQkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCQkJCS8vIFJlbG9hZCB0aGUgY2hhbmdlZCByZXNvdXJjZXMuCi0JCQkJCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQkJCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQkJCQlyZWxvYWRlZFJlc291cmNlcyA9IG1hbmFnZXIKLQkJCQkJCQkJCQkucmVsb2FkUmVzb3VyY2VzKGNoYW5nZWRSZXNvdXJjZXMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKQotCQkJCQkJCQl8fCByZWxvYWRlZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJCQkJcmVmcmVzaFJlcXVpcmVkID0gdHJ1ZTsKLQkJCQkJCX0KLQotCQkJCQkJLy8gcmVmcmVzaCBvdXQtb2Ytc3luY2ggcmVzb3VyY2VzCi0JCQkJCQkvLwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hhbmdlZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWZyZXNoKAotCQkJCQkJCQkJKFJlc291cmNlKSBpdGVyLm5leHQoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocmVmcmVzaFJlcXVpcmVkKSB7Ci0JCQkJY3VycmVudFZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBWaWV3ZXIgY3VycmVudFZpZXdlcikgewotCQl0cnkgewotCQkJc3luY2hyb25pemluZ1NlbGVjdGlvbiA9IHRydWU7Ci0JCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsCi0JCQkJCSYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJaWYgKHNlbC5zaXplKCkgPT0gMSkgewotCQkJCQlPYmplY3Qgc2VsZWN0ZWQgPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIG90aGVyU2VsID0gbnVsbDsKLQkJCQkJYm9vbGVhbiBhbHRlcm5hdGVTZWxlY3Rpb24gPSBmYWxzZTsKLQkJCQkJQXJyYXlMaXN0IHNlbGVjdGVkUGF0aCA9IG51bGw7Ci0JCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnkoKFN0cnVjdHVyZWRWaWV3ZXIpIGN1cnJlbnRWaWV3ZXIpOwotCQkJCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJaWYgKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHNlbGVjdGVkKQotCQkJCQkJCQkuaXNSZWFkT25seSgpKSB7Ci0JCQkJCQkJaWYgKGFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQkJCQkJLy8gZ2V0IHBhdGgKLQkJCQkJCQkJLy8KLQkJCQkJCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChzZWxlY3RlZCk7Ci0JCQkJCQkJCXNlbGVjdGVkUGF0aCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBzZWxlY3RlZDsKLQkJCQkJCQkJZG8gewotCQkJCQkJCQkJc2VsZWN0ZWRQYXRoLmFkZCgwLCBlKTsKLQkJCQkJCQkJCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChlKTsKLQkJCQkJCQkJCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHBhcmVudDsKLQkJCQkJCQkJCQllID0gVG5nVXRpbC51bndyYXAocGFyZW50KTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJCQkJCQkuYWRhcHQoCi0JCQkJCQkJCQkJCQkJCXBhcmVudCwKLQkJCQkJCQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCQkJCQllID0gcGFyZW50OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IHdoaWxlICh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgaWYgKHByb2NUYWIuZ2V0Vmlld2VyKCkgPT0gY3VycmVudFZpZXdlcikgewotCQkJCQkJCXNlbGVjdGVkID0gVG5nVXRpbC51bndyYXAoc2VsZWN0ZWQpOwotCQkJCQkJCXNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGVkKTsKLQkJCQkJCX0gZWxzZSBpZiAoZXh0ZW5zaW9uVGFicyAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25UYWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCWlmIChleHRlbnNpb25UYWJzW2ldLmdldFZpZXdlcigpID09IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQkJCXNlbGVjdGVkID0gVG5nVXRpbC51bndyYXAoc2VsZWN0ZWQpOwotCQkJCQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQkJCQkJCXNlbGVjdGVkKTsKLQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCWlmIChwcm9jVGFiLmdldFZpZXdlcigpICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQlwcm9jVGFiLmdldFZpZXdlcigpLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIGZhbHNlKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChleHRlbnNpb25UYWJzICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvblRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJaWYgKGV4dGVuc2lvblRhYnNbaV0uZ2V0Vmlld2VyKCkgIT0gY3VycmVudFZpZXdlcikKLQkJCQkJCQkJCWV4dGVuc2lvblRhYnNbaV0uZ2V0Vmlld2VyKCkuc2V0U2VsZWN0aW9uKAotCQkJCQkJCQkJCQlzZWxlY3Rpb24sIGZhbHNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkJCXx8IHNlbGVjdGVkIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQkJCQkJb3RoZXJTZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJQWN0aXZpdHkgYWN0ID0gZ2V0UGFyZW50QWN0aXZpdHkoCi0JCQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgc2VsZWN0ZWQsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQkJCQlpZiAoYWN0ICE9IG51bGwpIHsKLQkJCQkJCQkJb3RoZXJTZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihhY3QpOwotCQkJCQkJCQlhbHRlcm5hdGVTZWxlY3Rpb24gPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAob3RoZXJTZWwgIT0gbnVsbCkgewotCQkJCQkJLy8gb3duIGVsZW1lbnQgaXMgc2VsZWN0ZWQKLQkJCQkJCS8vCi0JCQkJCQlWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQotCQkJCQkJaWYgKCBXQlNUYWIgIT0gbnVsbCApIHsKLQkJCQkJCQl2aWV3ZXIgPSBXQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCAmJiB2aWV3ZXIgIT0gY3VycmVudFZpZXdlcikgewotCQkJCQkJCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJc2V0U2VsZWN0aW9uVG9WaWV3ZXIodmlld2VyLCBvdGhlclNlbCwKLQkJCQkJCQkJCQlhbHRlcm5hdGVTZWxlY3Rpb24pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJaWYgKCBPQlNUYWIgIT0gbnVsbCApIHsKLQkJCQkJCQl2aWV3ZXIgPSBPQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCAmJiB2aWV3ZXIgIT0gY3VycmVudFZpZXdlcikgewotCQkJCQkJCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJc2V0U2VsZWN0aW9uVG9WaWV3ZXIodmlld2VyLCBvdGhlclNlbCwKLQkJCQkJCQkJCQlhbHRlcm5hdGVTZWxlY3Rpb24pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJaWYgKCBQQlNUYWIgIT0gbnVsbCApIHsKLQkJCQkJCQl2aWV3ZXIgPSBQQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCAmJiB2aWV3ZXIgIT0gY3VycmVudFZpZXdlcikgewotCQkJCQkJCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXNldFNlbGVjdGlvblRvVmlld2VyKHZpZXdlciwgb3RoZXJTZWwsCi0JCQkJCQkJCQkJYWx0ZXJuYXRlU2VsZWN0aW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoc2VsZWN0ZWRQYXRoICE9IG51bGwpIHsKLQkJCQkJCS8vIGluaGVyaXRlZCBlbGVtZW50IGlzIHNlbGVjdGVkCi0JCQkJCQkvLwotCQkJCQkJVmlld2VyIHZpZXdlciA9IG51bGw7Ci0JCQkJCQlpZiAoIFdCU1RhYiAhPSBudWxsICkgewotCQkJCQkJCXZpZXdlciA9IFdCU1RhYi5nZXRWaWV3ZXIoKTsKLQkJCQkJCQlpZiAodmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmluZFNlbGVjdGlvbigKLQkJCQkJCQkJCQlzZWxlY3RlZFBhdGgsIFdCU1RhYi5nZXRBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCQkJCQkJCi0JCQkJCQlpZiAoIE9CU1RhYiAhPSBudWxsICkgewotCQkJCQkJCXZpZXdlciA9IE9CU1RhYi5nZXRWaWV3ZXIoKTsJCQkJCQkKLQkJCQkJCQlpZiAodmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmluZFNlbGVjdGlvbigKLQkJCQkJCQkJCQlzZWxlY3RlZFBhdGgsIE9CU1RhYi5nZXRBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZiAoIFBCU1RhYiAhPSBudWxsICkgewotCQkJCQkJCXZpZXdlciA9IFBCU1RhYi5nZXRWaWV3ZXIoKTsJCQkJCQkKLQkJCQkJCQlpZiAodmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmluZFNlbGVjdGlvbigKLQkJCQkJCQkJCQlzZWxlY3RlZFBhdGgsIFBCU1RhYi5nZXRBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZiAoIHByb2NUYWIgIT0gbnVsbCApIHsKLQkJCQkJCQl2aWV3ZXIgPSBwcm9jVGFiLmdldFZpZXdlcigpOwotCQkJCQkJCWlmICh2aWV3ZXIgIT0gY3VycmVudFZpZXdlcikgewotCQkJCQkJCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmaW5kU2VsZWN0aW9uKAotCQkJCQkJCQkJCXNlbGVjdGVkUGF0aCwgcHJvY1RhYi5nZXRBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZiAoZXh0ZW5zaW9uVGFicyAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25UYWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCXZpZXdlciA9IGV4dGVuc2lvblRhYnNbaV0uZ2V0Vmlld2VyKCk7Ci0JCQkJCQkJCWlmICh2aWV3ZXIgIT0gY3VycmVudFZpZXdlcikgewotCQkJCQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQkJCQkJCWZpbmRTZWxlY3Rpb24oCi0JCQkJCQkJCQkJCQkJc2VsZWN0ZWRQYXRoLAotCQkJCQkJCQkJCQkJCWV4dGVuc2lvblRhYnNbaV0KLQkJCQkJCQkJCQkJCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCQkJCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJc3luY2hyb25pemluZ1NlbGVjdGlvbiA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZmluZFNlbGVjdGlvbihMaXN0IHNlbGVjdGVkUGF0aCwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWludCBzaXplID0gc2VsZWN0ZWRQYXRoLnNpemUoKTsKLQkJaWYgKHNpemUgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJT2JqZWN0IGUgPSBzZWxlY3RlZFBhdGguZ2V0KDApOwotCQlPYmplY3Qgc2VsZWN0aW9uID0gZTsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbihlKTsKLQkJZmluZF9zZWxlY3Rpb246IGZvciAoaW50IGkgPSAxOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQllID0gc2VsZWN0ZWRQYXRoLmdldChpKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQkJCWlmIChlbGVtZW50ID09IGUpIHsKLQkJCQkJc2VsZWN0aW9uID0gY2hpbGQ7Ci0JCQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdCgKLQkJCQkJCQljaGlsZCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJY2hpbGRyZW4gPSBhZGFwdGVyLmdldENoaWxkcmVuKGUpOwotCQkJCQljb250aW51ZSBmaW5kX3NlbGVjdGlvbjsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhayBmaW5kX3NlbGVjdGlvbjsKLQkJfQotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQotCS8vIEltcGxlbWVudHMgSVNlbGVjdGlvblByb3ZpZGVyCi0JLy8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNnZXRTZWxlY3Rpb24oKQotCSAqLwotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHZpZXdTZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlciNnZXRFZGl0aW5nRG9tYWluKCkKLQkgKi8KLQlwdWJsaWMgRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotCQlyZXR1cm4gZWRpdGluZ0RvbWFpbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlciNnZXRWaWV3ZXIoKQotCSAqLwotCXB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gY3VycmVudFZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhZGFwdGVyIGZhY3Rvcnkgb2YgdGhlIGN1cnJlbnQgcGFnZSBpZiB0aGVyZSBpcyBhbnkKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQlBZGFwdGVyIEZhY3Rvcnkgb2YgdGhlIGN1cnJlbnQgcGFnZSBvZiB0aGUgZWRpdG9yCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlJRm9ybVBhZ2UgcGFnZSA9IGdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOwotCQlpZiAocGFnZSBpbnN0YW5jZW9mIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSBwYWdlKQotCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXIjbWVudUFib3V0VG9TaG93KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQkoKElNZW51TGlzdGVuZXIpIGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpKQotCQkJCS5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOwotCQkKLQkJLy8gcG9wdWxhdGUgY29udHJpYnV0ZWQgbWVudSBpdGVtcwotCQkvLwotCQlJRm9ybVBhZ2UgYWN0aXZlUGFnZSA9IGdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOwotCQlpZihhY3RpdmVQYWdlIGluc3RhbmNlb2YgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSB7Ci0JCQlJQWN0aW9uW10gYWN0aW9ucyA9ICgoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKWFjdGl2ZVBhZ2UpLmdldEFkZGl0aW9uYWxBY3Rpb25zKCk7Ci0JCQlpZihhY3Rpb25zICE9IG51bGwgJiYgYWN0aW9ucy5sZW5ndGggPiAwKSB7Ci0JCQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlBY3Rpb24gYWN0aW9uID0gYWN0aW9uc1tpXTsKLQkJCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgYWN0aW9uIGluc3RhbmNlb2YgQmFzZVNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uKSB7Ci0JCQkJCQkoKEJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbilhY3Rpb24pLnNlbGVjdGlvbkNoYW5nZWQoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pOwotCQkJCQl9Ci0JCQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBJV29ya2JlbmNoUGFydEFjdGlvbikgewotCQkJCQkJKChJV29ya2JlbmNoUGFydEFjdGlvbikgYWN0aW9uKQotCQkJCQkJCQkuc2V0QWN0aXZlV29ya2JlbmNoUGFydCh0aGlzKTsKLQkJCQkJfQotCQkJCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gcHJvcGVydHkgc2hlZXQgcGFnZQotCSAqIEByZXR1cm4KLQkgKiAJCQlQcm9wZXJ0eVNoZWV0IFBhZ2UKLQkgKi8KLQlwdWJsaWMgSVByb3BlcnR5U2hlZXRQYWdlIGdldFByb3BlcnR5U2hlZXRQYWdlKCkgewotCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgPT0gbnVsbCkgewotCQkJcHJvcGVydHlTaGVldFBhZ2UgPSAoRVBGUHJvcGVydHlTaGVldFBhZ2UpIGNyZWF0ZVByb3BlcnR5U2hlZXRQYWdlKCk7Ci0KLQkJCS8vIHsKLQkJCS8vIHB1YmxpYyB2b2lkIG1ha2VDb250cmlidXRpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlciwKLQkJCS8vIElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciwgSVN0YXR1c0xpbmVNYW5hZ2VyCi0JCQkvLyBzdGF0dXNMaW5lTWFuYWdlcikgewotCQkJLy8gc3VwZXIubWFrZUNvbnRyaWJ1dGlvbnMobWVudU1hbmFnZXIsIHRvb2xCYXJNYW5hZ2VyLAotCQkJLy8gc3RhdHVzTGluZU1hbmFnZXIpOwotCQkJLy8gfQotCQkJLy8KLQkJCS8vIHB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQkJLy8gc3VwZXIuc2V0QWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKLQkJCS8vIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2hhcmVHbG9iYWxBY3Rpb25zKHRoaXMsIGFjdGlvbkJhcnMpOwotCQkJLy8gfQotCQkJLy8gfTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2V0dGluZyBwcm92aWRlciAiKTsKLQkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsKLQkJCQlBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSAoQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpICgoUHJvY2Vzc1ZpZXdlcikgY3VycmVudFZpZXdlcikKLQkJCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCQlwcm9wQ29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQkJY29udGVudFByb3ZpZGVyLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJCXByb3BlcnR5U2hlZXRQYWdlCi0JCQkJCQkuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihwcm9wQ29udGVudFByb3ZpZGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvcGVydHlTaGVldFBhZ2U7Ci0JfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIGNyZWF0ZVByb3BlcnR5U2hlZXRQYWdlKCkgewotICAgICAgICByZXR1cm4gbmV3IEVQRlByb3BlcnR5U2hlZXRQYWdlKHRoaXMpOwotICAgIH0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsKLQkJaWYgKGtleS5lcXVhbHMoSVByb3BlcnR5U2hlZXRQYWdlLmNsYXNzKSkgewotCQkJcmV0dXJuIGdldFByb3BlcnR5U2hlZXRQYWdlKCk7Ci0JCX0gZWxzZSBpZiAoa2V5LmVxdWFscyhJR290b01hcmtlci5jbGFzcykpIHsKLQkJCXJldHVybiB0aGlzOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoa2V5KTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciNnZXRDb250cmlidXRvcklkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRyaWJ1dG9ySWQoKSB7Ci0JCXJldHVybiBnZXRTaXRlKCkuZ2V0SWQoKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBSZXR1cm4gY29sdW1uIGRlc2NyaXB0b3IgbGlzdCBmb3IgZ2l2ZW4gc3RyaW5nCi0JICogQHBhcmFtIHN0cgotCSAqIEByZXR1cm4KLQkgKiAJCQlsaXN0IG9mIGNvbHVtbiBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgRUxpc3QgdG9Db2x1bW5EZXNjcmlwdG9yTGlzdChTdHJpbmcgc3RyKSB7Ci0JCUVMaXN0IGNvbHVtbkRlc2NyaXB0b3JzID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCk7Ci0JCQlPYmplY3QgY29sdW1uRGVzY3JpcHRvciA9IFByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAKLQkJCQkJLmdldCh0b2tlbik7Ci0JCQlpZiAoY29sdW1uRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJY29sdW1uRGVzY3JpcHRvcnMuYWRkKGNvbHVtbkRlc2NyaXB0b3IpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb2x1bW5EZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYXJyYXkgb2YgY29sdW1uIGRlc2NyaXB0b3JzIGZvciB0aGUgZ2l2ZW4gc3RyaW5nCi0JICogQHBhcmFtIHN0cgotCSAqIEByZXR1cm4KLQkgKiAJCQlsaXN0IG9mIGNvbHVtbiBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sdW1uRGVzY3JpcHRvcltdIHRvQ29sdW1uRGVzY3JpcHRvcnMoU3RyaW5nIHN0cikgewotCQlMaXN0IGxpc3QgPSB0b0NvbHVtbkRlc2NyaXB0b3JMaXN0KHN0cik7Ci0JCUNvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5zID0gbmV3IENvbHVtbkRlc2NyaXB0b3JbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkoY29sdW1ucyk7Ci0JCXJldHVybiBjb2x1bW5zOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3IjZ2V0Q3VycmVudFBhZ2UoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q3VycmVudFBhZ2UoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDdXJyZW50UGFnZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBzdXBwcmVzc2lvbiBpbmZvCi0JICovCi0JcHVibGljIFN1cHByZXNzaW9uIGdldFN1cHByZXNzaW9uKCkgewotCQlyZXR1cm4gc3VwcHJlc3Npb247Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlnQ2hhbmdlZCgpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCWlmIChjb25maWcgIT0gY3VycmVudENvbmZpZykgewotCQkJLy8gcmVmcmVzaCBvbmx5IGlmIHRoZSBhY3RpdmUgcGFydCBpcyB0aGlzIGVkaXRvciBvciBkaWFncmFtIGVkaXRvcgotCQkJLy8gb2YgYW55IGFjdGl2aXR5IGluIHRoaXMgcHJvY2VzcwotCQkJLy8KLQkJCUlXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkKLQkJCQkJLmdldFBhcnRTZXJ2aWNlKCkuZ2V0QWN0aXZlUGFydCgpOwotCQkJYm9vbGVhbiByZWZyZXNoID0gYWN0aXZlUGFydCA9PSB0aGlzOwotCQkJaWYgKCFyZWZyZXNoKSB7Ci0JCQkJaWYgKGFjdGl2ZVBhcnQgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHsKLQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0ID0gKChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkoKElFZGl0b3JQYXJ0KSBhY3RpdmVQYXJ0KQotCQkJCQkJCS5nZXRFZGl0b3JJbnB1dCgpKS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCQkJcmVmcmVzaCA9IGlucHV0LmdldFN1cHByZXNzaW9uKCkuZ2V0UHJvY2VzcygpID09IHNlbGVjdGVkUHJvY2VzczsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocmVmcmVzaCkgewotCQkJCWN1cnJlbnRDb25maWcgPSBjb25maWc7Ci0JCQkJcmVmcmVzaEFsbCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciNzZXRJbnB1dChvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW5wdXQoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCAhPSBnZXRFZGl0b3JJbnB1dCgpKSB7Ci0JCQlpbnB1dENoYW5nZWQgPSB0cnVlOwotCQl9Ci0JCXN1cGVyLnNldElucHV0KGlucHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI3VwZGF0ZVBhZ2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQYWdlcygpIHsKLQkJLy8gcmVtb3ZlIGFuZCBhZGQgZGVzY3JpcHRpb24gcGFnZSBpZiB0aGUgbW9kZWwueG1pIG9yIGNvbnRlbnQueG1pIG9mCi0JCS8vIHRoZSBwcm9jZXNzIGhhdmUgYmVlbiBjaGFuZ2VkCi0JCS8vCi0JCVJlc291cmNlIG1vZGVsUmVzb3VyY2UgPSBzZWxlY3RlZFByb2Nlc3MuZVJlc291cmNlKCk7Ci0JCVJlc291cmNlIGNvbnRlbnRSZXNvdXJjZSA9IHNlbGVjdGVkUHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKQotCQkJCS5lUmVzb3VyY2UoKTsKLQkJaWYgKGNoYW5nZWRSZXNvdXJjZXMuY29udGFpbnMobW9kZWxSZXNvdXJjZSkKLQkJCQl8fCAoY29udGVudFJlc291cmNlICE9IG51bGwgJiYgY2hhbmdlZFJlc291cmNlcwotCQkJCQkJLmNvbnRhaW5zKGNvbnRlbnRSZXNvdXJjZSkpKSB7Ci0JCQlyZW1vdmVQYWdlKDApOwotCQkJdHJ5IHsKLQkJCQlhZGREZXNjcmlwdGlvblBhZ2UoKTsKLQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JUaXRsZSwgCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvck1zZywgZSk7IAotCQkJfQotCQl9Ci0JCWlmIChpbnB1dENoYW5nZWQpIHsKLQkJCWlucHV0Q2hhbmdlZChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7Ci0JCQkJcHJvcGVydHlTaGVldFBhZ2UucmVmcmVzaCgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmVmcmVzaEFsbCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEFsbCgpIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlkb1JlZnJlc2hBbGwodHJ1ZSk7Ci0JCQkJCX0KLQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2ggYWxsIHZpZXdlcnMgCi0JICogQHBhcmFtIHVwZGF0ZUlEcwotCSAqIAkJCWlmIHRydWUsIHRoZW4gcmVmcmVzaCBhbGwgaW5kZXggaW4gdmlld2VycwotCSAqLwotCXB1YmxpYyB2b2lkIGRvUmVmcmVzaEFsbChib29sZWFuIHVwZGF0ZUlEcykgewotLy8JCWlmICh1cGRhdGVJRHMpIHsKLS8vCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotLy8JCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotLy8JCQlQcm9jZXNzVXRpbC51cGRhdGVJRHMoYWRhcHRlckZhY3RvcnksIHNlbGVjdGVkUHJvY2Vzcyk7Ci0vLwkJCVByb2Nlc3NVdGlsLnJlZnJlc2hQcmVkZWNjZXNzb3JMaXN0cyhhZGFwdGVyRmFjdG9yeSwKLS8vCQkJCQlzZWxlY3RlZFByb2Nlc3MpOwotLy8KLS8vCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotLy8JCQkJCS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotLy8JCQlQcm9jZXNzVXRpbC51cGRhdGVJRHMoYWRhcHRlckZhY3RvcnksIHNlbGVjdGVkUHJvY2Vzcyk7Ci0vLwkJfQotCi0JCXVwZGF0ZUlEcyh1cGRhdGVJRHMpOwotCQkKLSAgICAgICAgaWYgKFdCU1RhYiAhPSBudWxsICYmIFdCU1RhYi5nZXRWaWV3ZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBXQlNUYWIuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoT0JTVGFiICE9IG51bGwgJiYgT0JTVGFiLmdldFZpZXdlcigpICE9IG51bGwpIHsKLSAgICAgICAgCU9CU1RhYi5nZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFBCU1RhYiAhPSBudWxsICYmIFBCU1RhYi5nZXRWaWV3ZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgIAlQQlNUYWIuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9jVGFiICE9IG51bGwgJiYgcHJvY1RhYi5nZXRWaWV3ZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgIAlwcm9jVGFiLmdldFZpZXdlcigpLnJlZnJlc2goKTsKLSAgICAgICAgfQotCi0JCQotCQlpZiAoZXh0ZW5zaW9uVGFicyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvblRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCQlleHRlbnNpb25UYWJzW2ldLmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7Ci0JCX0KLQl9Ci0JCi0JCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHVwZGF0ZUlEcwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUlEcyhib29sZWFuIHVwZGF0ZUlEcykgewotICAgICAgICBpZiAodXBkYXRlSURzKSB7Ci0gICAgICAgICAgICBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoV0JTVGFiICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0gICAgICAgICAgICAgICAgUHJvY2Vzc1V0aWwudXBkYXRlSURzKGFkYXB0ZXJGYWN0b3J5LCBzZWxlY3RlZFByb2Nlc3MpOwotICAgICAgICAgICAgICAgIFByb2Nlc3NVdGlsLnJlZnJlc2hQcmVkZWNjZXNzb3JMaXN0cyhhZGFwdGVyRmFjdG9yeSwgc2VsZWN0ZWRQcm9jZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwcm9jVGFiICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0gICAgICAgICAgICAgICAgUHJvY2Vzc1V0aWwudXBkYXRlSURzKGFkYXB0ZXJGYWN0b3J5LCBzZWxlY3RlZFByb2Nlc3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLQkvKioKLQkgKiBSZWZyZXNoIGFsbCBvcGVuIHByb2Nlc3MgZWRpdG9ycwotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hBbGxQcm9jZXNzRWRpdG9ycygpIHsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIFByb2Nlc3NFZGl0b3IpIHsKLQkJCQkoKFByb2Nlc3NFZGl0b3IpIGVkaXRvcikuZG9SZWZyZXNoQWxsKGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3IjZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgSUZvcm1QYWdlIGdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpIHsKLQkJaW50IGluZGV4ID0gZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGJzUGFnZXNbaW5kZXggLSAxXTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlcyA9IHN1cGVyLmdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCWlmIChzdXBwcmVzc2lvbi5pc1NhdmVOZWVkZWQoKQotCQkJCSYmICFtb2RpZmllZFJlc291cmNlcy5jb250YWlucyhzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQKLQkJCQkJCS5lUmVzb3VyY2UoKSkpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQuZVJlc291cmNlKCkpOwotCQl9Ci0JCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbChyZXNvdXJjZXNUb1NhdmUpOwotCi0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2RvU2F2ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXN1cHByZXNzaW9uLnNhdmVUb01vZGVsKCk7Ci0JCXN1cGVyLmRvU2F2ZShtb25pdG9yKTsKLQkJc3VwcHJlc3Npb24uc2F2ZUlzRG9uZSgpOwotCQlyZXNvdXJjZXNUb1NhdmUuY2xlYXIoKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IjaXNEaXJ0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJaWYgKHN1cHByZXNzaW9uLmlzU2F2ZU5lZWRlZCgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNEaXJ0eSgpOwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2ZpcmVQcm9wZXJ0eUNoYW5nZShpbnQpCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKGludCBwcm9wZXJ0eUlkKSB7Ci0JCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eUlkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2dldFVzZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRVc2VkUmVzb3VyY2VzKCkgewotCQlIYXNoU2V0PFJlc291cmNlPiB1c2VkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0KLQkJLy8gbW9kZWwueG1pCi0JCS8vCi0JCVJlc291cmNlIHJlc291cmNlID0gZWxlbWVudE9iai5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXVzZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJfQotCi0JCS8vIGNvbnRlbnQueG1pCi0JCS8vCi0JCXJlc291cmNlID0gc2VsZWN0ZWRQcm9jZXNzLmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJdXNlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQl9Ci0KLQkJLy8gY29uZmlndXJhdGlvbi54bWkKLQkJLy8KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBzZWxlY3RlZFByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZSA9IGNvbmZpZy5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJdXNlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0KLQkJLy8gcmVzb3VyY2VzIG9mIG90aGVyIHByb2Nlc3NlcyB0aGF0IHRoaXMgcHJvY2VzcyBpcyBkZXBlbmRpbmcgb24KLQkJLy8KLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeUZyb21UYWIoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGFkYXB0ZXJGYWN0b3J5LAotCQkJCXNlbGVjdGVkUHJvY2Vzcyk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJcmVzb3VyY2UgPSAoKEVPYmplY3QpIG9iaikuZVJlc291cmNlKCk7Ci0JCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJdXNlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWxhc3RVc2VkUmVzb3VyY2VzID0gdXNlZFJlc291cmNlczsKLQotCQlyZXR1cm4gdXNlZFJlc291cmNlczsKLQl9Ci0KLQkvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5RnJvbVRhYigpIHsKLSAgICAgICAgcmV0dXJuIFdCU1RhYi5nZXRBZGFwdGVyRmFjdG9yeSgpOwotICAgIH0KLQotICAgIAotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgc2VsZWN0ZWQgb2JqZWN0cyBjYW4gYmUgcmV2ZWFsZWQgb3Igbm90IGFuZCByZXR1bnMgcmVzdWx0Ci0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIAkJCUxpc3Qgb2Ygb2JqZWN0cwotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIAkJCUFkYXB0ZXIgZmFjdG9yeSBvZiB0aGUgc2VsZWN0ZWQgb2JqZWN0cwotCSAqIEBwYXJhbSBzdXBwcmVzc2lvbgotCSAqIAkJCVN1cHByZXNzaW9uIGluZm9ybWF0aW9uCi0JICogQHJldHVybgotCSAqIAkJQm9vbGVhbiB2YWx1ZSB0byBpbmRpY2F0ZSB3aGV0aGVyIHNlbGVjdGVkIG9iamVjdHMgY2FuIGJlIHJldmVhbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhblJldmVhbChDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbiwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQkvLyBOTyBtb3JlIGNoZWNrIGZvciBkdXBsaWNhdGlvbiBvZiBuYW1lIGFuZCBwcmVzZW50YXRpb24gbmFtZQotCQkvLwotLy8JCS8vIGNoZWNrIGlmIHJldmVhbGluZyB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgd2lsbCBjYXVzZSBuYW1lIGR1cGxpY2F0aW9uCi0vLwkJLy8KLS8vCQlTdHJpbmcgbXNnID0gc3VwcHJlc3Npb24uY2hlY2tEdXBsaWNhdGVOYW1lQWZ0ZXJSZXZlYWwoc2VsZWN0aW9uLAotLy8JCQkJYWRhcHRlckZhY3RvcnkpOwotLy8JCWlmIChtc2cgIT0gbnVsbCkgewotLy8JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotLy8JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfUmV2ZWFsX1RpdGxlLCAvLyROT04tTkxTLTEkIAotLy8JCQkJCW1zZyk7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0vLwotLy8JCS8vIGNoZWNrIGlmIHJldmVhbGluZyB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgd2lsbCBjYXVzZSBkdXBsaWNhdGUKLS8vCQkvLyBkZXNjcmlwdG9ycy4KLS8vCQkvLyBJZiBzbywgcHJvbXB0IHVzZXIgdG8gZGVsZXRlIHRoZSBkdXBsaWNhdGVzIGJlZm9yZSBjb250aW51aW5nLgotLy8JCS8vCi0vLwkJQ29sbGVjdGlvbiBkdXBsaWNhdGVzID0gUHJvY2Vzc1V0aWwKLS8vCQkJCS5nZXREdXBsaWNhdGVEZXNjcmlwdG9yc0FmdGVyUmV2ZWFsKHNlbGVjdGlvbik7Ci0vLwkJaWYgKCFkdXBsaWNhdGVzLmlzRW1wdHkoKSkgewotLy8JCQlNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0vLwkJCQkJLmdldElkKCksIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkdXBsaWNhdGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJRGVzY3JpcHRvciBkZXNjID0gKERlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotLy8JCQkJU3RyaW5nIGRlc2NUeHQgPSBUbmdVdGlsLmdldFR5cGVUZXh0KGRlc2MpCi0vLwkJCQkJCSsgIjogIiArIGRlc2MuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOyAvLyROT04tTkxTLTEkCi0vLwkJCQlzdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBBdXRob3JpbmdVSVBsdWdpbgotLy8JCQkJCQkuZ2V0RGVmYXVsdCgpLmdldElkKCksIDAsIGRlc2NUeHQsIG51bGwpKTsKLS8vCQkJfQotLy8JCQlpZiAoQXV0aG9yaW5nVUlQbHVnaW4KLS8vCQkJCQkuZ2V0RGVmYXVsdCgpCi0vLwkJCQkJLmdldE1zZ0RpYWxvZygpCi0vLwkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0vLwkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1JldmVhbF9UaXRsZSwgLy8kTk9OLU5MUy0xJCAKLS8vCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfcHJvbXB0VG9EZWxldGVCZWZvcmVSZXZlYWwsIC8vJE5PTi1OTFMtMSQKLS8vCQkJCQkJCXN0YXR1cykgPT0gRGlhbG9nLkNBTkNFTCkgewotLy8JCQkJcmV0dXJuIGZhbHNlOwotLy8JCQl9Ci0vLwotLy8JCQkvLyBkZWxldGUgZHVwbGljYXRlIGRlc2NyaXB0b3JzCi0vLwkJCXRyeSB7Ci0vLwkJCQlQcm9jZXNzRGVsZXRlQWN0aW9uLmRlbGV0ZShkdXBsaWNhdGVzKTsKLS8vCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotLy8JCQkJcmV0dXJuIGZhbHNlOwotLy8JCQl9Ci0vLwkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNJbmhlcml0ZWQoQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChQcm9jZXNzVXRpbC5pc0luaGVyaXRlZChlbGVtZW50KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQkvLyBwcmVmZXJlbmNlIGlzIG1hbmFnZWQgYnkgbGlicmFyeSBwbHVnaW4sCi0JCS8vIHNpbmNlIHRoaXMgcHJlZmVyZW5jZXMgaXMgYWxzbyB1c2VkIGZvciBicm93c2luZyBhbmQgcHVibGlzaGluZwotCQkvLyBKaW5odWEgWGkgMDgvMjEvMjAwNgotCQkvLyBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCS8vIC5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgc3RvcmUgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlyZXR1cm4gc3RvcmU7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ3JhbUVkaXRvckhlbHBlciBnZXREaWFncmFtRWRpdG9ySGVscGVyKCl7Ci0JCWlmKGRpYWdyYW1FZGl0b3JIZWxwZXIgPT0gbnVsbCl7Ci0JCQlkaWFncmFtRWRpdG9ySGVscGVyID0gbmV3IERpYWdyYW1FZGl0b3JIZWxwZXIoKTsKLQkJCWRpYWdyYW1FZGl0b3JIZWxwZXIuZ2V0RGlhZ3JhbU1hbmFnZXIoc2VsZWN0ZWRQcm9jZXNzKTsKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbUVkaXRvckhlbHBlcjsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGUgd2l0aG91dCBhbnkgY29kZSBjaGFuZ2UganVzdCBmb3Ige0BsaW5rIFByb2Nlc3NFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcn0gdG8gYWNjZXNzIGl0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgZ2V0QWN0aXZlUGFnZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFjdGl2ZVBhZ2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1Byb2Nlc3NFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1Byb2Nlc3NFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTUwZDZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Qcm9jZXNzRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlBhc3RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLklNb2RpZnlpbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLklXb3JrYmVuY2hQYXJ0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JbmRlbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk1ldGhvZExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTW92ZURvd25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk1vdmVVcEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuT3V0ZGVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuU3luY2hyb25pemF0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5VcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5EaWFsb2dIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRVBGUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlByb2Nlc3NWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5WaWV3SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFESW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5BRERJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2UuRGlhZ3JhbUVkaXRvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BEREltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuUmVzb3VyY2VBd2FyZVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5BY3Rpdml0eURyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkNvbnRyaWJ1dGVUb0FjdGl2aXR5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Mb2NhbGx5UmVwbGFjZUFuZERlZXBDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5SZXBsYWNlQWN0aXZpdHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuSUFjdGlvblR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRGlhZ3JhbU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4cG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uLlN1cHByZXNzaW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLlByb2Nlc3NEZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbi5UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5JRm9ybVBhZ2U7Ci0KLS8qKgotICogQWN0aW9uIGJhciBjb250cmlidHV0b3IgZm9yIHByb2Nlc3MgZWRpdG9yCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzCi0JCU1ldGhvZExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciB7Ci0JcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gcmVnaXN0ZXJlZEFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElBY3Rpb24+KCk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsb2NrZWQ7Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiByb2xsdXBBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbFVwKSB7Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJYm9vbGVhbiB3YXNSb2xsZWRVcCA9IGJzSXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCWJzSXRlbVByb3ZpZGVyLnNldFJvbGxlZFVwKCFic0l0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCkpOwotCQkJKChJQ2hhbmdlTm90aWZpZXIpIGJzSXRlbVByb3ZpZGVyKQotCQkJCQkuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbigKLQkJCQkJCQluZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCQkJCQkoSW50ZXJuYWxFT2JqZWN0KSBzZWxlY3RlZEFjdGl2aXR5LAotCQkJCQkJCQkJTm90aWZpY2F0aW9uLkFERCwgbnVsbCwgbnVsbCwgbnVsbCwgZmFsc2UpLAotCQkJCQkJCXNlbGVjdGVkQWN0aXZpdHksIHRydWUsIGZhbHNlKSk7Ci0KLQkJCWlmIChic0l0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJLy8gUmVmcmVzaGluZyBmb3IgZ3JlZW4gYWN0aXZpdGllcyBkdXJpbmcgcm9sbHVwCi0JCQkJRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSAoRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIpIGJzSXRlbVByb3ZpZGVyOwotCQkJCXByb3ZpZGVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24oCi0JCQkJCQluZXcgTm90aWZpY2F0aW9uSW1wbChOb3RpZmljYXRpb24uU0VULCBwcm92aWRlciwKLQkJCQkJCQkJcHJvdmlkZXIpLCBwcm92aWRlciwgdHJ1ZSwgZmFsc2UpKTsKLQkJCX0KLQkJCWlmICh3YXNSb2xsZWRVcCkgewotCQkJCVByb2Nlc3NWaWV3ZXIgdmlld2VyID0gKFByb2Nlc3NWaWV3ZXIpICgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKS5jdXJyZW50Vmlld2VyOwotCQkJCXZpZXdlci5leHBhbmRUb0xldmVsKHNlbGVjdGVkQWN0aXZpdHksCi0JCQkJCQlBYnN0cmFjdFRyZWVWaWV3ZXIuQUxMX0xFVkVMUyk7Ci0KLQkJCQkvLyBldmVudGhvdWdoIHdlIHN3aXRjaGVkIG9mZiBjcmVhdGluZyBuZXcgYWN0aXZpdGllcyBpbgotCQkJCS8vIFdCUywKLQkJCQkvLyB1c2VyIGNhbiBzdGlsbCBjcmVhdGUgdGhydSBBRC4gSGVuY2Ugd2UgbmVlZCB0byB1cGRhdGUKLQkJCQkvLyBJRHMKLQkJCQkvLyBhZnRlcndhcmRzCi0JCQkJZG9SZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQotCX07Ci0KLQlwcm90ZWN0ZWQgTW92ZVVwQWN0aW9uIG1vdmVVcEFjdGlvbiA9IG5ldyBNb3ZlVXBBY3Rpb24oKSB7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQlpZighaXNFZGl0aW5nQWxsb3dlZCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmFjY2VwdChzZWxlY3Rpb24pOwotCQl9CQkKLQl9OwotCi0JcHJvdGVjdGVkIE1vdmVEb3duQWN0aW9uIG1vdmVEb3duQWN0aW9uID0gbmV3IE1vdmVEb3duQWN0aW9uKCkgewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJaWYoIWlzRWRpdGluZ0FsbG93ZWQoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5hY2NlcHQoc2VsZWN0aW9uKTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIElBY3Rpb24gcHJlZmVyZW5jZUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9QcmVmZXJlbmNlcykgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkvLyBvcGVuIHByb2Nlc3MgcHJlZmVyZW5jZSBwYWdlCi0JCQlvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbAotCQkJCQkuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKAotCQkJCQkJCWdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLAotCQkJCQkJCSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLlByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQludWxsLCBudWxsKS5vcGVuKCk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElBY3Rpb24gb3BlbkJhc2VBY3Rpdml0eSA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQmFzZUFjdGl2aXR5KSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gc2VsZWN0ZWRBY3Rpdml0eQotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBiYXNlKTsKLQkJCXRyeSB7Ci0JCQkJaW50IGlkID0gKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGJhc2UpOwotCi0JCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCgKLQkJCQkJCShNZXRob2RFbGVtZW50KSBwcm9jLmVDb250YWluZXIoKSk7Ci0JCQkJUHJvY2Vzc0VkaXRvciBlZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgZ2V0UGFnZSgpLm9wZW5FZGl0b3IoCi0JCQkJCQlpbnB1dCwgUHJvY2Vzc0VkaXRvci5FRElUT1JfSUQpOwotCQkJCWVkaXRvci5zZXRBY3RpdmVQYWdlKGlkKTsKLQkJCQllZGl0b3IuYnNQYWdlc1tpZCAtIDFdLmdldFZpZXdlcigpCi0JCQkJCQkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJQWN0aW9uIG9wZW5Xb3JrZmxvd0VkaXRvckFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEaWFncmFtKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSUVkaXRvclBhcnQgcGFyZW50ID0gZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IuRWRpdG9ySW5wdXQoCi0JCQkJCQkJc2VsZWN0ZWRPYmplY3QsIGdldFN1cHByZXNzaW9uKCkpOwotCQkJCQlJRWRpdG9yUGFydCBwYXJ0ID0gZ2V0UGFnZSgpLm9wZW5FZGl0b3IoaW5wdXQsCi0JCQkJCQkJUHJvY2Vzc0VkaXRvci5XT1JLRkxPV19FRElUT1JfSUQpOwotCQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCQkJQWJzdHJhY3REaWFncmFtRWRpdG9yIGVkaXRvciA9IChBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHBhcnQ7Ci0JCQkJCQllZGl0b3Iuc2V0UGFyZW50RWRpdG9yKHBhcmVudCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkJCWV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JfTsKLQkKLQlwcml2YXRlIGNsYXNzIE9wZW5EaWFncmFtRWRpdG9yQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQotCQlwcml2YXRlIGludCBkaWFncmFtVHlwZTsKLQotCQlwdWJsaWMgT3BlbkRpYWdyYW1FZGl0b3JBY3Rpb24oU3RyaW5nIHRleHQsIGludCBkaWFncmFtVHlwZSkgewotCQkJc3VwZXIodGV4dCk7Ci0JCQl0aGlzLmRpYWdyYW1UeXBlID0gZGlhZ3JhbVR5cGU7Ci0JCQlzZXRJbWFnZURlc2NyaXB0b3IoZ2V0SW1hZ2VEZXNjcmlwdG9yKGRpYWdyYW1UeXBlKSk7Ci0JCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihnZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihkaWFncmFtVHlwZSkpOwotCQl9Ci0JCQotCQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoaW50IGRpYWdyYW1UeXBlKSB7Ci0JCQlzd2l0Y2goZGlhZ3JhbVR5cGUpIHsKLQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQkJcmV0dXJuIEFESW1hZ2VzLklNR19ERVNDX0VESVRPUjsKLQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJCXJldHVybiBBRERJbWFnZXMuSU1HX0RFU0NfRURJVE9SOwotCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCQlyZXR1cm4gV1BEREltYWdlcy5JTUdfREVTQ19FRElUT1I7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZ2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoaW50IGRpYWdyYW1UeXBlKSB7Ci0JCQlzd2l0Y2goZGlhZ3JhbVR5cGUpIHsKLQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQkJcmV0dXJuIEFESW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0VESVRPUjsKLQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJCXJldHVybiBBRERJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfRURJVE9SOwotCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCQlyZXR1cm4gV1BEREltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19FRElUT1I7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaWYoIVByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKHNlbGVjdGVkT2JqZWN0KSkgewotCQkJCQltZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShnZXRQcm9jZXNzKCksIHRoaXMpOwotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IG1nci5nZXRSZXNvdXJjZSgpOwotCQkJCQlpZihtZ3IuaXNOZXdSZXNvdXJjZSgpICYmICFuZXcgRmlsZShGaWxlTWFuYWdlci50b0ZpbGVTdHJpbmcocmVzb3VyY2UuZ2V0VVJJKCkpKS5leGlzdHMoKSkgewotCQkJCQkJYm9vbGVhbiByZXN1bHQgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5OZXdEaWFncmFtRmlsZV90aXRsZSwKLQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvbXB0Q3JlYXRlTmV3RGlhZ3JhbUZpbGVfbXNnKTsKLQkJCQkJCWlmKHJlc3VsdCkgewotCQkJCQkJCXJlc291cmNlLnNhdmUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQotCQkJCQkJCS8vIHN0aWxsIGtlZXAgdGhlIGZsYWcgcmVzb3VyY2VJc05ldyBzZXQgc28gZWRpdG9yIHdpbGwgYmUgbWFya2VkIGRpcnR5Ci0JCQkJCQkJLy8KLQkJCQkJCQltZ3Iuc2V0UmVzb3VyY2VJc05ldyh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlvcGVuRGlhZ3JhbShkaWFncmFtVHlwZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkJZXhjZXB0aW9uKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmKG1nciAhPSBudWxsKSB7Ci0JCQkJCW1nci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJQWN0aW9uIG5ld0FjdGl2aXR5RGlhZ3JhbUVkaXRvciA9IG5ldyBPcGVuRGlhZ3JhbUVkaXRvckFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURpYWdyYW0sIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKTsKLQotCXByaXZhdGUgSUFjdGlvbiBuZXdBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IgPSBuZXcgT3BlbkRpYWdyYW1FZGl0b3JBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtLCBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pOwotCi0JcHJpdmF0ZSBJQWN0aW9uIG5ld1dQRGlhZ3JhbUVkaXRvciA9IG5ldyBPcGVuRGlhZ3JhbUVkaXRvckFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtLAotCQkJSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0pOwotCi0JLy8gT3BlbiB3b3JrZmxvdyBkZXRhaWwgYWN0aW9uCi0JLy8KLQlwcm90ZWN0ZWQgSUFjdGlvbiBvcGVuV29ya2Zsb3dEZXRhaWxFZGl0b3JBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCXRyeSB7Ci0JCQkJCUlFZGl0b3JQYXJ0IHBhcmVudCA9IGdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5FZGl0b3JJbnB1dCgKLQkJCQkJCQlzZWxlY3RlZE9iamVjdCwgZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJCUlFZGl0b3JQYXJ0IHBhcnQgPSBnZXRQYWdlKCkub3BlbkVkaXRvcihpbnB1dCwKLQkJCQkJCQlQcm9jZXNzRWRpdG9yLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX0VESVRPUl9JRCk7Ci0JCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKSB7Ci0JCQkJCQlBYnN0cmFjdERpYWdyYW1FZGl0b3IgZWRpdG9yID0gKEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgcGFydDsKLQkJCQkJCWVkaXRvci5zZXRQYXJlbnRFZGl0b3IocGFyZW50KTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJQWN0aW9uIG9wZW5XUERlcGVuZGVuY3lFZGl0b3JBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQl0cnkgewotCQkJCQlJRWRpdG9yUGFydCBwYXJlbnQgPSBnZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQoCi0JCQkJCQkJc2VsZWN0ZWRPYmplY3QsIGdldFN1cHByZXNzaW9uKCkpIHsKLQkJCQkJfTsKLQkJCQkJSUVkaXRvclBhcnQgcGFydCA9IGdldFBhZ2UoKS5vcGVuRWRpdG9yKGlucHV0LAotCQkJCQkJCVByb2Nlc3NFZGl0b3IuV1BERVBFTkRFTkNZX0VESVRPUl9JRCk7Ci0JCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKSB7Ci0JCQkJCQlBYnN0cmFjdERpYWdyYW1FZGl0b3IgZWRpdG9yID0gKEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgcGFydDsKLQkJCQkJCWVkaXRvci5zZXRQYXJlbnRFZGl0b3IocGFyZW50KTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiByZXBsYWNlQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1JlcGxhY2UpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJSVJlc291cmNlQXdhcmVDb21tYW5kIGNtZCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWNtZCA9IG5ldyBSZXBsYWNlQWN0aXZpdHlDb21tYW5kKAotCQkJCQkJKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBic0l0ZW1Qcm92aWRlcik7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoY21kICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNtZC5kaXNwb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElBY3Rpb24gbG9jYWxSZXBsYWNlbWVudEFuZERlZXBDb3B5ID0gbmV3IEFjdGlvbigKLQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmxvY2FsUmVwbGFjZW1lbnRBbmREZWVwQ29weV90ZXh0KSB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCBjbWQgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJY21kID0gbmV3IExvY2FsbHlSZXBsYWNlQW5kRGVlcENvcHlDb21tYW5kKAotCQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGJzSXRlbVByb3ZpZGVyKTsKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlpZiAoY21kICE9IG51bGwpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQljbWQuZGlzcG9zZSgpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX07Ci0KLQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5JblVJKHJ1bm5hYmxlLCBnZXRUZXh0KCkpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJQWN0aW9uIGNvbnRyaWJ1dGVBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29udHJpYnV0ZSkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY21kID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJY21kID0gbmV3IENvbnRyaWJ1dGVUb0FjdGl2aXR5Q29tbWFuZCgKLQkJCQkJCShCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgYnNJdGVtUHJvdmlkZXIpOwotCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJLy8gUHJvY2Vzc1V0aWwuY29udHJpYnV0ZVRvQWN0aXZpdHkoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWJzSXRlbVByb3ZpZGVyLAotCQkJCS8vICgoUHJvY2Vzc0Zvcm1FZGl0b3IpYWN0aXZlRWRpdG9yKS5lZGl0aW5nRG9tYWluLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChjbWQgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJY21kLmRpc3Bvc2UoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIGNsYXNzIEVkaXRvclN1cHByZXNzaW9uQ29tbWFuZCBleHRlbmRzIFN1cHByZXNzaW9uQ29tbWFuZCB7Ci0JCUVkaXRvclN1cHByZXNzaW9uQ29tbWFuZChTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgTGlzdCBzZWxlY3Rpb24sCi0JCQkJYm9vbGVhbiBzdXBwcmVzc2VkKSB7Ci0JCQlzdXBlcihzdXBwcmVzc2lvbiwgc2VsZWN0aW9uLCBzdXBwcmVzc2VkKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCByZWZyZXNoKCkgewotCQkJaWYgKCFnZXRSZXN1bHQoKS5pc0VtcHR5KCkpIHsKLQkJCQlQcm9jZXNzRWRpdG9yIGVkaXRvciA9IChQcm9jZXNzRWRpdG9yKSBnZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoaXNSZWFkT25seUVsZW1lbnRBZmZlY3RlZCgpKSB7Ci0JCQkJCWlmIChQcm9jZXNzRWRpdG9yLmhhc0luaGVyaXRlZChzZWxlY3Rpb24pKSB7Ci0JCQkJCQllZGl0b3IucmVmcmVzaEFsbFByb2Nlc3NFZGl0b3JzKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllZGl0b3IuZG9SZWZyZXNoQWxsKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllZGl0b3IuZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOwotCi0JCQkJLy8gRG8gRGlhZ3JhbSBFZGl0b3JzIHJlZnJlc2gKLQkJCQlMaXN0PElFZGl0b3JSZWZlcmVuY2U+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElFZGl0b3JSZWZlcmVuY2U+KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQlEaWFncmFtRWRpdG9ySGVscGVyLmNsb3NlRGlhZ3JhbUVkaXRvcnMoZWxlbWVudCwgbGlzdCk7Ci0JCQkJCURpYWdyYW1FZGl0b3JIZWxwZXIucmVmcmVzaFBhcmVudERpYWdyYW1FZGl0b3JzKGVsZW1lbnQsCi0JCQkJCQkJbGlzdCwgdHJ1ZSk7Ci0JCQkJCWxpc3QuY2xlYXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb24uU3VwcHJlc3Npb25Db21tYW5kI2RpZEV4ZWN1dGUoKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgZGlkRXhlY3V0ZSgpIHsKLQkJCXJlZnJlc2goKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbi5TdXBwcmVzc2lvbkNvbW1hbmQjZGlkVW5kbygpCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBkaWRVbmRvKCkgewotCQkJcmVmcmVzaCgpOwotCQl9Ci0KLQl9Ci0KLQkvL1RPRE86IG1vdmUgdGhpcyBhY3Rpb24gdG8gaXRzIG93biBDb21tYW5kQWN0aW9uSGFuZGxlciBjbGFzcywgc2VlIEluZGVuQWN0aW9uCi0JcHJpdmF0ZSBJQWN0aW9uIHN1cHByZXNzVGFza0FjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc19UYXNrKSB7Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJLy8gY2hlY2sgaWYgc3VwcHJlc3NpbmcgdGhlIHNlbGVjdGVkIGVsZW1lbnRzIHdpbGwgY2F1c2UKLQkJCS8vIGR1cGxpY2F0ZSBkZXNjcmlwdG9ycy4KLQkJCS8vIElmIHNvLCBwcm9tcHQgdXNlciB0byBkZWxldGUgdGhlIGR1cGxpY2F0ZXMgYmVmb3JlCi0JCQkvLyBjb250aW51aW5nLgotCQkJLy8KLQotCQkJZmluYWwgTGlzdCB0YXNrRGVzY3JpcHRvcnMgPSBQcm9jZXNzVXRpbAotCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JzKHNlbGVjdGlvbik7Ci0JCQkKLQkJCS8vIE5PIE1PUkUgQ0hFQ0sgRk9SIERVUExJQ0FUSU9OIE9GIE5BTUUsIFBSRVNFTlRBVElPTiBOQU1FLCBPUiBMSU5LRUQgRUxFTUVOVAotCi0JCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRBY3RpdmVFZGl0b3IoKS5nZXRFZGl0b3JTaXRlKCkKLQkJCQkJLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCUVkaXRvclN1cHByZXNzaW9uQ29tbWFuZCBjbWQgPSBuZXcgRWRpdG9yU3VwcHJlc3Npb25Db21tYW5kKAotCQkJCQkJCWdldFN1cHByZXNzaW9uKCksIHRhc2tEZXNjcmlwdG9ycywgdHJ1ZSk7Ci0JCQkJCWNtZC5zZXRMYWJlbChnZXRUZXh0KCkpOwotCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCX0KLQkJCX0pOwotCi0JCQlib29sZWFuIHNob3cgPSB0cnVlOwotCQkJLy8gdXBkYXRlIGNvbnRleHQgYmFyIG1lbnUgYWZ0ZXIgcGVyZm9ybWluZyBzdXBwcmVzcwotCQkJaWYgKGdldEFkYXB0ZXJGYWN0b3J5KCkgPT0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5zaXplKCk7IGkrKykgewotCQkJCQlpZiAoIShzZWxlY3Rpb24uZ2V0KGkpIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgc2VsZWN0aW9uCi0JCQkJCQkJLmdldChpKSBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikpCi0JCQkJCQlzaG93ID0gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJc2hvdyA9IGZhbHNlOwotCi0JCQlyZXZlYWxUYXNrQWN0aW9uLnNldEVuYWJsZWQoc2hvdyk7Ci0JCQlzdXBwcmVzc1Rhc2tBY3Rpb24uc2V0RW5hYmxlZChzaG93KTsKLQotCQkJLy8gZW5hYmxlIHN5bmNocm9uaXplIGFjdGlvbnMgY29ycmVjdGx5Ci0JCQlhdXRvU3luY2hyb25pemUuc2V0RW5hYmxlZChhdXRvU3luY2hyb25pemUKLQkJCQkJLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb24KLQkJCQkJCQkudG9BcnJheSgpKSkpOwotCQkJbWFudWFsU3luY2hyb25pemVBY3Rpb24uc2V0RW5hYmxlZChtYW51YWxTeW5jaHJvbml6ZUFjdGlvbgotCQkJCQkudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbgotCQkJCQkJCS50b0FycmF5KCkpKSk7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBJQWN0aW9uIHN1cHByZXNzQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzKSB7Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJLy8gTk8gTU9SRSBDSEVDSyBGT1IgRFVQTElDQVRJT04gT0YgTkFNRSwgUFJFU0VOVEFUSU9OIE5BTUUsIE9SIExJTktFRCBFTEVNRU5UCi0JCQkKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvclNpdGUoKQotCQkJCQkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJLy8gaWYgKGdldFN1cHByZXNzaW9uKCkuc3VwcHJlc3Moc2VsZWN0aW9uKSkgewotCQkJCQkvLyBpZiAoaGFzSW5oZXJpdGVkKHNlbGVjdGlvbikpIHsKLQkJCQkJLy8gZWRpdG9yLnJlZnJlc2hBbGxQcm9jZXNzRWRpdG9ycygpOwotCQkJCQkvLyB9IGVsc2UgewotCQkJCQkvLyBlZGl0b3IuZG9SZWZyZXNoQWxsKGZhbHNlKTsKLQkJCQkJLy8gfQotCQkJCQkvLyB9Ci0JCQkJCS8vIGVkaXRvci5maXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSk7Ci0KLQkJCQkJRWRpdG9yU3VwcHJlc3Npb25Db21tYW5kIGNtZCA9IG5ldyBFZGl0b3JTdXBwcmVzc2lvbkNvbW1hbmQoCi0JCQkJCQkJZ2V0U3VwcHJlc3Npb24oKSwgc2VsZWN0aW9uLCB0cnVlKTsKLQkJCQkJY21kLnNldExhYmVsKGdldFRleHQoKSk7Ci0JCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJfQotCi0JCQl9KTsKLQotCQkJLy8gdXBkYXRlIGNvbnRleHQgYmFyIG1lbnUgYWZ0ZXIgcGVyZm9ybWluZyBzdXBwcmVzcwotCQkJcmV2ZWFsQWN0aW9uLnNldEVuYWJsZWQoZ2V0U3VwcHJlc3Npb24oKS5jYW5SZXZlYWwoc2VsZWN0aW9uKSk7Ci0JCQlzdXBwcmVzc0FjdGlvbi5zZXRFbmFibGVkKGdldFN1cHByZXNzaW9uKCkuY2FuU3VwcHJlc3Moc2VsZWN0aW9uKSk7Ci0KLQkJCS8vIGVuYWJsZSBzeW5jaHJvbml6ZSBhY3Rpb25zIGNvcnJlY3RseQotCQkJYXV0b1N5bmNocm9uaXplLnNldEVuYWJsZWQoYXV0b1N5bmNocm9uaXplCi0JCQkJCS51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uCi0JCQkJCQkJLnRvQXJyYXkoKSkpKTsKLQkJCW1hbnVhbFN5bmNocm9uaXplQWN0aW9uLnNldEVuYWJsZWQobWFudWFsU3luY2hyb25pemVBY3Rpb24KLQkJCQkJLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb24KLQkJCQkJCQkudG9BcnJheSgpKSkpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBVcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uIHVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24gPSBuZXcgVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbigpOwotCi0JcHJvdGVjdGVkIElBY3Rpb24gcmV2ZWFsQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbCkgewotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmIChQcm9jZXNzRWRpdG9yLmNhblJldmVhbChzZWxlY3Rpb24sIGdldEFkYXB0ZXJGYWN0b3J5KCksIGdldFN1cHByZXNzaW9uKCkpKSB7Ci0JCQkJLy8gZmluYWwgUHJvY2Vzc0VkaXRvciBlZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikKLQkJCQkvLyBnZXRBY3RpdmVFZGl0b3IoKTsKLQotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvclNpdGUoKQotCQkJCQkJLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJLy8gaWYgKGdldFN1cHByZXNzaW9uKCkucmV2ZWFsKHNlbGVjdGlvbikpIHsKLQkJCQkJCS8vIGlmIChoYXNJbmhlcml0ZWQoc2VsZWN0aW9uKSkgewotCQkJCQkJLy8gZWRpdG9yLnJlZnJlc2hBbGxQcm9jZXNzRWRpdG9ycygpOwotCQkJCQkJLy8gfSBlbHNlIHsKLQkJCQkJCS8vIGVkaXRvci5kb1JlZnJlc2hBbGwoZmFsc2UpOwotCQkJCQkJLy8gfQotCQkJCQkJLy8gfQotCQkJCQkJLy8gZWRpdG9yLmZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQotCQkJCQkJRWRpdG9yU3VwcHJlc3Npb25Db21tYW5kIGNtZCA9IG5ldyBFZGl0b3JTdXBwcmVzc2lvbkNvbW1hbmQoCi0JCQkJCQkJCWdldFN1cHByZXNzaW9uKCksIHNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJY21kLnNldExhYmVsKGdldFRleHQoKSk7Ci0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCQl9Ci0KLQkJCQl9KTsKLQkJCQkvLyB1cGRhdGUgY29udGV4dCBiYXIgbWVudSBhZnRlciBwZXJmb3JtaW5nIHJldmVhbAotCQkJCXJldmVhbEFjdGlvbi5zZXRFbmFibGVkKGdldFN1cHByZXNzaW9uKCkuY2FuUmV2ZWFsKHNlbGVjdGlvbikpOwotCQkJCXN1cHByZXNzQWN0aW9uLnNldEVuYWJsZWQoZ2V0U3VwcHJlc3Npb24oKS5jYW5TdXBwcmVzcygKLQkJCQkJCXNlbGVjdGlvbikpOwotCQkJCS8vIGVuYWJsZSBzeW5jaHJvbml6ZSBhY3Rpb25zIGNvcnJlY3RseQotCQkJCWF1dG9TeW5jaHJvbml6ZS5zZXRFbmFibGVkKGF1dG9TeW5jaHJvbml6ZQotCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb24KLQkJCQkJCQkJLnRvQXJyYXkoKSkpKTsKLQkJCQltYW51YWxTeW5jaHJvbml6ZUFjdGlvbi5zZXRFbmFibGVkKG1hbnVhbFN5bmNocm9uaXplQWN0aW9uCi0JCQkJCQkudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbgotCQkJCQkJCQkudG9BcnJheSgpKSkpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUFjdGlvbiByZXZlYWxUYXNrQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbF9UYXNrKSB7Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJZmluYWwgTGlzdCB0YXNrRGVzY3JpcHRvcnMgPSBQcm9jZXNzVXRpbAotCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JzKHNlbGVjdGlvbik7Ci0JCQlpZiAoUHJvY2Vzc0VkaXRvci5jYW5SZXZlYWwodGFza0Rlc2NyaXB0b3JzLCBnZXRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQlnZXRTdXBwcmVzc2lvbigpKSkgewotCi0JCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJCQkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlFZGl0b3JTdXBwcmVzc2lvbkNvbW1hbmQgY21kID0gbmV3IEVkaXRvclN1cHByZXNzaW9uQ29tbWFuZCgKLQkJCQkJCQkJZ2V0U3VwcHJlc3Npb24oKSwgdGFza0Rlc2NyaXB0b3JzLCBmYWxzZSk7Ci0JCQkJCQljbWQuc2V0TGFiZWwoZ2V0VGV4dCgpKTsKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJCX0KLQotCQkJCX0pOwotCi0JCQkJLy8gZW5hYmxlIHN5bmNocm9uaXplIGFjdGlvbnMgY29ycmVjdGx5Ci0JCQkJYXV0b1N5bmNocm9uaXplLnNldEVuYWJsZWQoYXV0b1N5bmNocm9uaXplCi0JCQkJCQkudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbgotCQkJCQkJCQkudG9BcnJheSgpKSkpOwotCQkJCW1hbnVhbFN5bmNocm9uaXplQWN0aW9uLnNldEVuYWJsZWQobWFudWFsU3luY2hyb25pemVBY3Rpb24KLQkJCQkJCS51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uCi0JCQkJCQkJCS50b0FycmF5KCkpKSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElCU0l0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQWN0aXZpdHkgc2VsZWN0ZWRBY3Rpdml0eSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudCBzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQgPSBudWxsOwotCi0JcHJvdGVjdGVkIExpc3Qgc2VsZWN0aW9uOwotCi0JcHJvdGVjdGVkIElBY3Rpb24gc3VwcHJlc3NEaWFncmFtQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzMikgewotCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQlpZiAoIXN1cGVyLmlzRW5hYmxlZCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuICEoYnNJdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciAmJiAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBic0l0ZW1Qcm92aWRlcikKLQkJCQkJLmlzUmVhZE9ubHkoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAoIXByb21wdFNhdmVBY3RpdmVFZGl0b3IoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCk7Ci0KLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQlUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJCQlyZXR1cm4gR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCS5nZXREaWFncmFtVHlwZVRleHQoKERpYWdyYW0pIG9iamVjdCk7Ci0JCQkJfQotCQkJfTsKLQotCQkJQ29sbGVjdGlvbiBkaWFncmFtcyA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJLmdldERpYWdyYW1zKHNlbGVjdGVkQWN0aXZpdHkpOwotCQkJQXJyYXlMaXN0IHVuc3VwcHJlc3NlZERpYWdyYW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGl0ZXIubmV4dCgpOwotCQkJCWlmICghZGlhZ3JhbS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJdW5zdXBwcmVzc2VkRGlhZ3JhbXMuYWRkKGRpYWdyYW0pOwotCQkJCX0KLQkJCX0KLQotCQkJTGlzdFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgTGlzdFNlbGVjdGlvbkRpYWxvZyhhY3RpdmVFZGl0b3IKLQkJCQkJLmdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCBkaWFncmFtcywgY29udGVudFByb3ZpZGVyLAotCQkJCQlsYWJlbFByb3ZpZGVyLAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX01lc3NhZ2UpOwotCQkJZGxnLnNldEluaXRpYWxFbGVtZW50U2VsZWN0aW9ucyh1bnN1cHByZXNzZWREaWFncmFtcyk7Ci0JCQlkbGcKLQkJCQkJLnNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfU3VwcHJlc3NEaWFsb2dfVGl0bGUpOwotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZGxnLm9wZW4oKTsKLQotCQkJT2JqZWN0W10gZGlhZ3JhbXNUb1JldmVhbCA9IGRsZy5nZXRSZXN1bHQoKTsKLQotCQkJaWYgKGRpYWdyYW1zVG9SZXZlYWwgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJYm9vbGVhbiBjaGFuZ2VkID0gdHJ1ZTsKLQotCQkJLy8gY2hlY2sgaWYgdGhlcmUgaXMgcmVhbGx5IGFueSBjaGFuZ2UKLQkJCS8vCi0JCQlpZiAoZGlhZ3JhbXNUb1JldmVhbC5sZW5ndGggPT0gdW5zdXBwcmVzc2VkRGlhZ3JhbXMuc2l6ZSgpKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaWFncmFtc1RvUmV2ZWFsLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICghdW5zdXBwcmVzc2VkRGlhZ3JhbXMuY29udGFpbnMoZGlhZ3JhbXNUb1JldmVhbFtpXSkpIHsKLQkJCQkJCWNoYW5nZWQgPSBmYWxzZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoY2hhbmdlZCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgaXRlci5uZXh0KCk7Ci0JCQkJCWRpYWdyYW0uc2V0U3VwcHJlc3NlZChCb29sZWFuLlRSVUUpOwotCQkJCX0KLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlhZ3JhbXNUb1JldmVhbC5sZW5ndGg7IGkrKykgewotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZGlhZ3JhbXNUb1JldmVhbFtpXTsKLQkJCQkJZGlhZ3JhbS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4uRkFMU0UpOwotCQkJCX0KLQotCQkJCS8vIHNhdmUgdGhlIGVkaXRvcgotCQkJCS8vCi0JCQkJc2F2ZUFjdGl2ZUVkaXRvcigpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUFjdGlvbiBuZXdTdXBwcmVzc0RpYWdyYW1BY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3MyKSB7Ci0JCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCWlmICghc3VwZXIuaXNFbmFibGVkKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gIShic0l0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyICYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGJzSXRlbVByb3ZpZGVyKQotCQkJCQkuaXNSZWFkT25seSgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmICghcHJvbXB0U2F2ZUFjdGl2ZUVkaXRvcigpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKTsKLQotCQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJCVRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJCS8vIFRPRE86IENoYW5nZSB0byBleGFjdCBzdHJpbmcuCi0JCQkJCXJldHVybiBEaWFncmFtRWRpdG9ySGVscGVyCi0JCQkJCQkJLmdldERpYWdyYW1UeXBlU3RyaW5nKChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtKSBvYmplY3QpOwotCQkJCX0KLQkJCX07Ci0KLQkJCUNvbGxlY3Rpb24gZGlhZ3JhbXMgPSAoKFByb2Nlc3NFZGl0b3IpIGdldEFjdGl2ZUVkaXRvcigpKQotCQkJCQkuZ2V0RGlhZ3JhbUVkaXRvckhlbHBlcigpLmdldERpYWdyYW1zKHNlbGVjdGVkQWN0aXZpdHkpOwotCQkJQXJyYXlMaXN0PG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0+IHB1Ymxpc2hEaWFncmFtcyA9IG5ldyBBcnJheUxpc3Q8b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbT4oKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSBkaWFncmFtID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0pIGl0ZXIKLQkJCQkJCS5uZXh0KCk7Ci0JCQkJc3dpdGNoIChEaWFncmFtRWRpdG9ySGVscGVyLmdldERpYWdyYW1UeXBlKGRpYWdyYW0pKSB7Ci0JCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCQkJaWYgKERpYWdyYW1PcHRpb25zLmlzUHVibGlzaEFEKHNlbGVjdGVkQWN0aXZpdHkpKSB7Ci0JCQkJCQlwdWJsaXNoRGlhZ3JhbXMuYWRkKGRpYWdyYW0pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJCQlpZiAoRGlhZ3JhbU9wdGlvbnMuaXNQdWJsaXNoQUREKHNlbGVjdGVkQWN0aXZpdHkpKSB7Ci0JCQkJCQlwdWJsaXNoRGlhZ3JhbXMuYWRkKGRpYWdyYW0pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQkJCWlmIChEaWFncmFtT3B0aW9ucy5pc1B1Ymxpc2hXUEREKHNlbGVjdGVkQWN0aXZpdHkpKSB7Ci0JCQkJCQlwdWJsaXNoRGlhZ3JhbXMuYWRkKGRpYWdyYW0pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJTGlzdFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgTGlzdFNlbGVjdGlvbkRpYWxvZyhhY3RpdmVFZGl0b3IKLQkJCQkJLmdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCBkaWFncmFtcywgY29udGVudFByb3ZpZGVyLAotCQkJCQlsYWJlbFByb3ZpZGVyLAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX01lc3NhZ2UpOwotCQkJZGxnLnNldEluaXRpYWxFbGVtZW50U2VsZWN0aW9ucyhwdWJsaXNoRGlhZ3JhbXMpOwotCQkJZGxnCi0JCQkJCS5zZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX1RpdGxlKTsKLQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWRsZy5vcGVuKCk7Ci0KLQkJCU9iamVjdFtdIGRpYWdyYW1zVG9SZXZlYWwgPSBkbGcuZ2V0UmVzdWx0KCk7Ci0KLQkJCWlmIChkaWFncmFtc1RvUmV2ZWFsID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWJvb2xlYW4gY2hhbmdlZCA9IHRydWU7Ci0KLQkJCS8vIGNoZWNrIGlmIHRoZXJlIGlzIHJlYWxseSBhbnkgY2hhbmdlCi0JCQkvLwotCQkJaWYgKGRpYWdyYW1zVG9SZXZlYWwubGVuZ3RoID09IHB1Ymxpc2hEaWFncmFtcy5zaXplKCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpYWdyYW1zVG9SZXZlYWwubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKCFwdWJsaXNoRGlhZ3JhbXMuY29udGFpbnMoZGlhZ3JhbXNUb1JldmVhbFtpXSkpIHsKLQkJCQkJCWNoYW5nZWQgPSBmYWxzZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoY2hhbmdlZCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtIGRpYWdyYW0gPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSkgaXRlcgotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCXN3aXRjaCAoRGlhZ3JhbUVkaXRvckhlbHBlci5nZXREaWFncmFtVHlwZShkaWFncmFtKSkgewotCQkJCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJCQkJRGlhZ3JhbU9wdGlvbnMuc2V0UHVibGlzaEFEKHNlbGVjdGVkQWN0aXZpdHksIGZhbHNlKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCQkJCURpYWdyYW1PcHRpb25zLnNldFB1Ymxpc2hBREQoc2VsZWN0ZWRBY3Rpdml0eSwgZmFsc2UpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQkJCQlEaWFncmFtT3B0aW9ucy5zZXRQdWJsaXNoV1BERChzZWxlY3RlZEFjdGl2aXR5LCBmYWxzZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlhZ3JhbXNUb1JldmVhbC5sZW5ndGg7IGkrKykgewotCQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtIGRpYWdyYW0gPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSkgZGlhZ3JhbXNUb1JldmVhbFtpXTsKLQkJCQkJc3dpdGNoIChEaWFncmFtRWRpdG9ySGVscGVyLmdldERpYWdyYW1UeXBlKGRpYWdyYW0pKSB7Ci0JCQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQkJCQlEaWFncmFtT3B0aW9ucy5zZXRQdWJsaXNoQUQoc2VsZWN0ZWRBY3Rpdml0eSwgdHJ1ZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQkJCQlEaWFncmFtT3B0aW9ucy5zZXRQdWJsaXNoQUREKHNlbGVjdGVkQWN0aXZpdHksIHRydWUpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQkJCQlEaWFncmFtT3B0aW9ucy5zZXRQdWJsaXNoV1BERChzZWxlY3RlZEFjdGl2aXR5LCB0cnVlKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIHNhdmUgdGhlIGVkaXRvcgotCQkJCS8vCi0JCQkJc2F2ZUFjdGl2ZUVkaXRvcigpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUFjdGlvbiBuZXdBc3NpZ25Vc2VyRGlhZ3JhbSA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Bc3NpZ25Vc2VyRGlhZ3JhbSkgewotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkvLyBUT0RPOiBuZWNlc3NhcnkgY2hhbmdlcyBVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2cncyBEaWFncmFtSW5mby4KLQkJCVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZyBkaWFsb2cgPSBuZXcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nKAotCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBhY3RpdmVFZGl0b3IsCi0JCQkJCXNlbGVjdGVkQWN0aXZpdHksIGdldFByb2Nlc3MoKS5nZXREZWZhdWx0Q29udGV4dCgpLCBUbmdVdGlsCi0JCQkJCQkJLmlzV3JhcHBlZChzZWxlY3RlZE9iamVjdCkpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIElBY3Rpb24gZGlhZ3JhbVB1Ymxpc2hOb25lID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzQWxsKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXB1Ymxpc2hEaWFncmFtc0ZvclByb2Nlc3MoZmFsc2UpOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUFjdGlvbiBkaWFncmFtc1B1Ymxpc2hBbGwgPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsQWxsKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXB1Ymxpc2hEaWFncmFtc0ZvclByb2Nlc3ModHJ1ZSk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElBY3Rpb24gc3VwcHJlc3NBbGxEaWFncmFtcyA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc0FsbCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlzZXRBbGxEaWFncmFtU3VwcHJlc3NlZCh0cnVlKTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiByZXZlYWxBbGxEaWFncmFtcyA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxBbGwpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJc2V0QWxsRGlhZ3JhbVN1cHByZXNzZWQoZmFsc2UpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJQWN0aW9uIGFkZEFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGQpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCQlpZiAoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZQotCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJCQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQkJCQkJY29uZmlnID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKAotCQkJCQkJCQkJc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50KQotCQkJCQkJCQkJLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCQlMaXN0IHNlbGVjdGlvbiA9IERpYWxvZ0hlbHBlci5zZWxlY3RFbGVtZW50c0ZvcigKLQkJCQkJCQkJc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50LCBjb25maWcsCi0JCQkJCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLQotCQkJCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0KLQkJCQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJCQkJCXNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCwKLQkJCQkJCQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY21kID0gKChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpCi0JCQkJCQkJCQkuY3JlYXRlRHJvcENvbW1hbmQoCi0JCQkJCQkJCQkJCXNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCwgc2VsZWN0aW9uKTsKLQkJCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQl9KTsKLQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJQWN0aW9uIGNvcHlBY3Rpdml0eUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Db3B5KSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJCWNvbmZpZyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhzZWxlY3RlZEFjdGl2aXR5KQotCQkJCQkJLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQl9Ci0JCQlMaXN0IHNlbGVjdGlvbiA9IERpYWxvZ0hlbHBlci5zZWxlY3RBY3Rpdml0aWVzRm9yKHNlbGVjdGVkQWN0aXZpdHksCi0JCQkJCWNvbmZpZywgSUFjdGlvblR5cGVQcm92aWRlci5DT1BZKTsKLQotCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG8gPSBpdG9yLm5leHQoKTsKLQotCQkJCQlpZiAobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG87Ci0KLQkJCQkJCS8vIFByb2Nlc3MgcHJvYyA9Ci0JCQkJCQkvLyBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Moc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50KTsKLQkJCQkJCS8vIGlmIChEZXBlbmRlbmN5Q2hlY2tlci5oYXNDeWNsaWNEZXBlbmRlbmN5KGFjdCwgcHJvYykpCi0JCQkJCQkvLyB7Ci0JCQkJCQkvLyBPYmplY3RbXSBhcmdzID0geyBzZWxlY3RlZEFjdGl2aXR5LmdldE5hbWUoKSwKLQkJCQkJCS8vIGFjdC5nZXROYW1lKCkgfTsKLQkJCQkJCS8vIFN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCS8vIC5iaW5kKAotCQkJCQkJLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXBwbHlfcGF0dGVybl9lcnJvcl9tc2csCi0JCQkJCQkvLyBhcmdzKTsKLQkJCQkJCS8vCi0JCQkJCQkvLyBTdHJpbmcgdGl0bGUgPQotCQkJCQkJLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXBwbHlfcGF0dGVybl9lcnJvcl90aXRsZTsKLQkJCQkJCS8vIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLy8gLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBpdG9yLnJlbW92ZSgpOwotCQkJCQkJLy8gfQotCQkJCQkJLy8gZWxzZSBpZiAoUHJvY2Vzc1V0aWwuaGFzQ29udHJpYnV0b3JPclJlcGxhY2VyKGFjdCkpIHsKLQkJCQkJCS8vIE9iamVjdFtdIGFyZ3MgPSB7IHNlbGVjdGVkQWN0aXZpdHkuZ2V0TmFtZSgpLAotCQkJCQkJLy8gYWN0LmdldE5hbWUoKSB9OwotCQkJCQkJLy8gU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJLy8gLmJpbmQoCi0JCQkJCQkvLyBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2csCi0JCQkJCQkvLyBhcmdzKTsKLQkJCQkJCS8vCi0JCQkJCQkvLyBTdHJpbmcgdGl0bGUgPQotCQkJCQkJLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJCQkvLyBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS8vIC5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8KLQkJCQkJCS8vIGl0b3IucmVtb3ZlKCk7Ci0JCQkJCQkvLyByZXR1cm47Ci0JCQkJCQkvLyB9Ci0KLQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gRGVwZW5kZW5jeUNoZWNrZXIKLQkJCQkJCQkJLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdCwgc2VsZWN0ZWRBY3Rpdml0eSk7Ci0JCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJCQkJCWl0b3IucmVtb3ZlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJQWN0aXZpdHlEcm9wQ29tbWFuZCBjbWQgPSBuZXcgQWN0aXZpdHlEcm9wQ29tbWFuZChzZWxlY3RlZEFjdGl2aXR5LAotCQkJCQlzZWxlY3Rpb24sIG51bGwsIGdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJSVN0YXR1cyBzdGF0dXMgPSBjbWQuY2hlY2tDb3B5KCk7Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJdGl0bGUsIHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWNtZC5zZXRUeXBlKElBY3Rpb25UeXBlUHJvdmlkZXIuQ09QWSk7Ci0JCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJQWN0aW9uIGV4dGVuZEFjdGl2aXR5QWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX0V4dGVuZCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCQljb25maWcgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Moc2VsZWN0ZWRBY3Rpdml0eSkKLQkJCQkJCS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJfQotCQkJTGlzdCBzZWxlY3Rpb24gPSBEaWFsb2dIZWxwZXIuc2VsZWN0QWN0aXZpdGllc0ZvcihzZWxlY3RlZEFjdGl2aXR5LAotCQkJCQljb25maWcsIElBY3Rpb25UeXBlUHJvdmlkZXIuRVhURU5EKTsKLQotCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG8gPSBpdG9yLm5leHQoKTsKLQotCQkJCQlpZiAobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG87Ci0KLQkJCQkJCS8vIFByb2Nlc3MgcHJvYyA9Ci0JCQkJCQkvLyBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Moc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50KTsKLQkJCQkJCS8vIGlmIChEZXBlbmRlbmN5Q2hlY2tlci5oYXNDeWNsaWNEZXBlbmRlbmN5KGFjdCwgcHJvYykpCi0JCQkJCQkvLyB7Ci0JCQkJCQkvLyBPYmplY3RbXSBhcmdzID0geyBzZWxlY3RlZEFjdGl2aXR5LmdldE5hbWUoKSwKLQkJCQkJCS8vIGFjdC5nZXROYW1lKCkgfTsKLQkJCQkJCS8vIFN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCS8vIC5iaW5kKAotCQkJCQkJLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXBwbHlfcGF0dGVybl9lcnJvcl9tc2csCi0JCQkJCQkvLyBhcmdzKTsKLQkJCQkJCS8vCi0JCQkJCQkvLyBTdHJpbmcgdGl0bGUgPQotCQkJCQkJLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXBwbHlfcGF0dGVybl9lcnJvcl90aXRsZTsKLQkJCQkJCS8vIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLy8gLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBpdG9yLnJlbW92ZSgpOwotCQkJCQkJLy8gfQotCQkJCQkJLy8gZWxzZSBpZiAoUHJvY2Vzc1V0aWwuaGFzQ29udHJpYnV0b3JPclJlcGxhY2VyKGFjdCkpIHsKLQkJCQkJCS8vIE9iamVjdFtdIGFyZ3MgPSB7IHNlbGVjdGVkQWN0aXZpdHkuZ2V0TmFtZSgpLAotCQkJCQkJLy8gYWN0LmdldE5hbWUoKSB9OwotCQkJCQkJLy8gU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJLy8gLmJpbmQoCi0JCQkJCQkvLyBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2csCi0JCQkJCQkvLyBhcmdzKTsKLQkJCQkJCS8vCi0JCQkJCQkvLyBTdHJpbmcgdGl0bGUgPQotCQkJCQkJLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJCQkvLyBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS8vIC5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8KLQkJCQkJCS8vIGl0b3IucmVtb3ZlKCk7Ci0JCQkJCQkvLyByZXR1cm47Ci0JCQkJCQkvLyB9Ci0KLQkJCQkJCS8qCi0JCQkJCQkgKiBJU3RhdHVzIHN0YXR1cyA9IERlcGVuZGVuY3lDaGVja2VyLm5ld0NoZWNrQWN0ID8KLQkJCQkJCSAqIERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5QWZ0ZXJGaWx0ZXJTZWxlY3Rpb24KLQkJCQkJCSAqIChhY3QsIHNlbGVjdGVkQWN0aXZpdHksCi0JCQkJCQkgKiBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKSA6Ci0JCQkJCQkgKiBEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRGVwZW5kZW5jeShhY3QsCi0JCQkJCQkgKiBzZWxlY3RlZEFjdGl2aXR5KTsKLQkJCQkJCSAqLwotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBEZXBlbmRlbmN5Q2hlY2tlci5uZXdDaGVja0FjdCA/IERlcGVuZGVuY3lDaGVja2VyCi0JCQkJCQkJCS5jaGVja0NpcmN1bGFyRm9yQXBwbHlpbmdWYXJpYWJpbGl0eUVsZW1lbnQoCi0JCQkJCQkJCQkJc2VsZWN0ZWRBY3Rpdml0eSwgYWN0LCB0cnVlKQotCQkJCQkJCQk6IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KAotCQkJCQkJCQkJCWFjdCwgc2VsZWN0ZWRBY3Rpdml0eSk7Ci0JCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIHN0YXR1cyk7Ci0JCQkJCQkJaXRvci5yZW1vdmUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJQWN0aXZpdHlEcm9wQ29tbWFuZCBjbWQgPSBuZXcgQWN0aXZpdHlEcm9wQ29tbWFuZChzZWxlY3RlZEFjdGl2aXR5LAotCQkJCQlzZWxlY3Rpb24sIG51bGwsIGdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJSVN0YXR1cyBzdGF0dXMgPSBjbWQuY2hlY2tFeHRlbmQoKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQl0aXRsZSwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJY21kLnNldFR5cGUoSUFjdGlvblR5cGVQcm92aWRlci5FWFRFTkQpOwotCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiBkZWVwQ29weUFjdGl2aXR5QWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfYWN0aW9uX2RlZXBDb3B5KSB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQkJCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJCQkJY29uZmlnID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHNlbGVjdGVkQWN0aXZpdHkpCi0JCQkJCQkJCS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJCQl9Ci0JCQkJCUxpc3Qgc2VsZWN0aW9uID0gRGlhbG9nSGVscGVyLnNlbGVjdEFjdGl2aXRpZXNGb3IoCi0JCQkJCQkJc2VsZWN0ZWRBY3Rpdml0eSwgY29uZmlnLAotCQkJCQkJCUlBY3Rpb25UeXBlUHJvdmlkZXIuREVFUF9DT1BZKTsKLQotCQkJCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgbyA9IGl0b3IubmV4dCgpOwotCi0JCQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG87Ci0KLQkJCQkJCQkJLy8gUHJvY2VzcyBwcm9jID0KLQkJCQkJCQkJLy8gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJCQkJCS8vIGlmIChQcm9jZXNzVXRpbC5oYXNDeWNsaWNEZXBlbmRlbmN5KGFjdCwKLQkJCQkJCQkJLy8gcHJvYykpIHsKLQkJCQkJCQkJLy8gT2JqZWN0W10gYXJncyA9IHsgc2VsZWN0ZWRBY3Rpdml0eS5nZXROYW1lKCksCi0JCQkJCQkJCS8vIGFjdC5nZXROYW1lKCkgfTsKLQkJCQkJCQkJLy8gU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkvLyAuYmluZCgKLQkJCQkJCQkJLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXBwbHlfcGF0dGVybl9lcnJvcl9tc2csCi0JCQkJCQkJCS8vIGFyZ3MpOwotCQkJCQkJCQkvLwotCQkJCQkJCQkvLyBTdHJpbmcgdGl0bGUgPQotCQkJCQkJCQkvLyBBdXRob3JpbmdVSVJlc291cmNlcy5hcHBseV9wYXR0ZXJuX2Vycm9yX3RpdGxlOwotCQkJCQkJCQkvLyBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLy8gLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOwotCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCS8vIGl0b3IucmVtb3ZlKCk7Ci0JCQkJCQkJCS8vIH0KLQotCQkJCQkJCQlJU3RhdHVzIHN0YXR1cyA9IERlcGVuZGVuY3lDaGVja2VyCi0JCQkJCQkJCQkJLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdCwKLQkJCQkJCQkJCQkJCXNlbGVjdGVkQWN0aXZpdHkpOwotCQkJCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsCi0JCQkJCQkJCQkJCQkJc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkJCQlpdG9yLnJlbW92ZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlBY3Rpdml0eURyb3BDb21tYW5kIGNtZCA9IG5ldyBBY3Rpdml0eURyb3BDb21tYW5kKAotCQkJCQkJCXNlbGVjdGVkQWN0aXZpdHksIHNlbGVjdGlvbiwgbnVsbCwKLQkJCQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpLG5ldyBBY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKGNvbmZpZykpOwotCQkJCQljbWQuc2V0VHlwZShJQWN0aW9uVHlwZVByb3ZpZGVyLkRFRVBfQ09QWSk7Ci0JCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHNlbGVjdGVkT2JqZWN0OwotCi0JcHJvdGVjdGVkIElBY3Rpb24gZXhwYW5kQWxsQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NGb3JtRWRpdG9yX2V4cGFuQWxsQWN0aW9uTGFiZWwpIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlWaWV3ZXIgdmlld2VyID0gKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpLmN1cnJlbnRWaWV3ZXI7Ci0JCQlpZiAodmlld2VyIGluc3RhbmNlb2YgVHJlZVZpZXdlcikgewotCQkJCSgoVHJlZVZpZXdlcikgdmlld2VyKS5leHBhbmRUb0xldmVsKHNlbGVjdGVkT2JqZWN0LAotCQkJCQkJQWJzdHJhY3RUcmVlVmlld2VyLkFMTF9MRVZFTFMpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJQWN0aW9uIGNvbGxhcHNlQWxsQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NGb3JtRWRpdG9yX2NvbGxhcHNlQWxsQWN0aW9uTGFiZWwpIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlWaWV3ZXIgdmlld2VyID0gKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpLmN1cnJlbnRWaWV3ZXI7Ci0JCQlpZiAodmlld2VyIGluc3RhbmNlb2YgVHJlZVZpZXdlcikgewotCQkJCSgoVHJlZVZpZXdlcikgdmlld2VyKS5jb2xsYXBzZVRvTGV2ZWwoc2VsZWN0ZWRPYmplY3QsCi0JCQkJCQlBYnN0cmFjdFRyZWVWaWV3ZXIuQUxMX0xFVkVMUyk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIFN5bmNocm9uaXphdGlvbkFjdGlvbiBtYW51YWxTeW5jaHJvbml6ZUFjdGlvbiA9IG5ldyBTeW5jaHJvbml6YXRpb25BY3Rpb24oKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXN1cGVyLnJ1bigpOwotCi0JCQkvLyByZWZyZXNoIHByb3BlcnRpZXMgdmlldyBhZnRlciBzeW5jaAotCQkJRVBGUHJvcGVydHlTaGVldFBhZ2UgcGFnZSA9IChFUEZQcm9wZXJ0eVNoZWV0UGFnZSkgKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpCi0JCQkJCS5nZXRQcm9wZXJ0eVNoZWV0UGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCXBhZ2UucmVmcmVzaCgpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBQcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uIGF1dG9TeW5jaHJvbml6ZSA9IG5ldyBQcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uKCkgewotCQlwcml2YXRlIHZvaWQgc3VwZXJSdW4oKSB7Ci0JCQlzdXBlci5ydW4oKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBydW5uZXIgPSBuZXcgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKTsKLQkJCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQlpZiAoIUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9kZWZhdWx0U3luY2hyb25pemF0aW9uLAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9jb25maXJtQXV0b1N5bmNoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCS8vICgoU3luY2hyb25pemVDb21tYW5kKWNvbW1hbmQpLnNldFVJQ29udGV4dChnZXRBY3RpdmVFZGl0b3IoKS5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQkJCXN1cGVyUnVuKCk7Ci0KLQkJCQkJLy8gcmVmcmVzaCBwcm9wZXJ0aWVzIHZpZXcgYWZ0ZXIgc3luY2gKLQkJCQkJRVBGUHJvcGVydHlTaGVldFBhZ2UgcGFnZSA9IChFUEZQcm9wZXJ0eVNoZWV0UGFnZSkgKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpCi0JCQkJCQkJLmdldFByb3BlcnR5U2hlZXRQYWdlKCk7Ci0JCQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQkJCXBhZ2UucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0KLQkJfQotCX07Ci0KLQlwcml2YXRlIElBY3Rpb24gc2hvd0luTGlicmFyeVZpZXcgPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU2hvd0xpbmtlZEVsZW1lbnRpbkxpYnJhcnlWaWV3LAotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJImZ1bGwvZXRvb2wxNi9zaG93X2xpbmtlZF9lbGVtZW50LmdpZiIpKSB7IC8vJE5PTi1OTFMtMSQgICAvLykgCi0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJZmluYWwgT2JqZWN0IGxpbmtlZEVsZW1lbnQgPSBQcm9jZXNzVXRpbAotCQkJCQkuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIHNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAobGlua2VkRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlMaWJyYXJ5Vmlldy5nZXRWaWV3KCkuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoCi0JCQkJCQkJCWxpbmtlZEVsZW1lbnQpOwotCQkJCQl9Ci0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCi0JfTsKLQotCXByaXZhdGUgSUFjdGlvbiBhc3NpZ25Vc2VyRGlhZ3JhbSA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Bc3NpZ25Vc2VyRGlhZ3JhbSkgewotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2cgZGlhbG9nID0gbmV3IFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZygKLQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgYWN0aXZlRWRpdG9yLAotCQkJCQlzZWxlY3RlZEFjdGl2aXR5LCBnZXRQcm9jZXNzKCkuZ2V0RGVmYXVsdENvbnRleHQoKSwgVG5nVXRpbAotCQkJCQkJCS5pc1dyYXBwZWQoc2VsZWN0ZWRPYmplY3QpKTsKLQotCQkJZGlhbG9nLm9wZW4oKTsKLQkJfQotCX07Ci0KLQkvLyBwcml2YXRlIElBY3Rpb24gYWN0aXZpdHlEZXRhaWxEaWFncmFtSW5mbyA9IG5ldwotCS8vIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUluZm9BY3Rpb24oKXsKLQkvLyBwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkvLyByZXR1cm4gc2VsZWN0ZWRBY3Rpdml0eTsKLQkvLyB9Ci0JLy8gcHVibGljIElXb3JrYmVuY2hQYWdlIGdldFBhZ2V4KCkgewotCS8vIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkvLyByZXR1cm4gZ2V0UGFnZSgpOwotCS8vIH0KLQkvLyB9OwotCi0JcHJpdmF0ZSBib29sZWFuIG9sZExvY2tlZDsKLQotCXByaXZhdGUgSW5kZW50QWN0aW9uIGluZGVudEFjdGlvbiA9IG5ldyBJbmRlbnRBY3Rpb24oKSB7Ci0JCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCWlmICghaXNFZGl0aW5nQWxsb3dlZCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgT3V0ZGVudEFjdGlvbiBvdXRkZW50QWN0aW9uID0gbmV3IE91dGRlbnRBY3Rpb24oKSB7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQlpZiAoIWlzRWRpdGluZ0FsbG93ZWQoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgUHJvY2Vzc0VkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgewotCQlzdXBlcihBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yKTsKLQotCQkvLyBkb24ndCBzaG93IHZhbGlkYXRlIGFjdGlvbgotCQkvLwotCQl2YWxpZGF0ZUFjdGlvbiA9IG51bGw7Ci0KLQkJLy8gc2V0IGRpc2FibGVkIGltYWdlIGRlc2NyaXB0b3JzCi0JCXNob3dJbkxpYnJhcnlWaWV3LnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC9ldG9vbDE2L3Nob3dfbGlua2VkX2VsZW1lbnRfZGlzYWJsZWQuZ2lmIikpOyAvLyROT04tTkxTLTEkCQkJCi0JfQotCi0JcHVibGljIFByb2Nlc3NFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcihTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuRGlhZ3JhbShpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJdHJ5IHsKLQkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBEaWFncmFtRWRpdG9ySW5wdXQoCi0JCQkJCXNlbGVjdGVkT2JqZWN0LCBnZXRTdXBwcmVzc2lvbigpLCBkaWFncmFtVHlwZSk7Ci0JCQlEaWFncmFtRWRpdG9yVXRpbC5vcGVuRGlhZ3JhbUVkaXRvcihnZXRQYWdlKCksIGlucHV0LAotCQkJCQlEaWFncmFtRWRpdG9ySGVscGVyLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoZGlhZ3JhbVR5cGUpLAotCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckFjdGlvbihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwgJiYgIXJlZ2lzdGVyZWRBY3Rpb25zLmNvbnRhaW5zKGFjdGlvbikpIHsKLQkJCXJlZ2lzdGVyZWRBY3Rpb25zLmFkZChhY3Rpb24pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJBY3Rpb25zKCkgewotCQlyZWdpc3RlckFjdGlvbihhdXRvU3luY2hyb25pemUpOwotCQlyZWdpc3RlckFjdGlvbihtYW51YWxTeW5jaHJvbml6ZUFjdGlvbik7Ci0JCXJlZ2lzdGVyQWN0aW9uKHVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24pOwotCQlyZWdpc3RlckFjdGlvbihpbmRlbnRBY3Rpb24pOwotCQlyZWdpc3RlckFjdGlvbihvdXRkZW50QWN0aW9uKTsKLQkJcmVnaXN0ZXJBY3Rpb24obW92ZURvd25BY3Rpb24pOwotCQlyZWdpc3RlckFjdGlvbihtb3ZlVXBBY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciN1cGRhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0KLQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlRWRpdG9yIGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlRWRpdG9yCi0JCQkJOiBhY3RpdmVFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiA/IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uCi0JCQkJOiBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCi0JCWJvb2xlYW4gZWRpdGluZ0FsbG93ZWQgPSBpc0VkaXRpbmdBbGxvd2VkKCk7Ci0JCWZvciAoSUFjdGlvbiBhY3Rpb24gOiByZWdpc3RlcmVkQWN0aW9ucykgewotCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIENvbW1hbmRBY3Rpb25IYW5kbGVyKSB7Ci0JCQkJYWN0aW9uLnNldEVuYWJsZWQoKChDb21tYW5kQWN0aW9uSGFuZGxlcikgYWN0aW9uKQotCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChhY3Rpb24gaW5zdGFuY2VvZiBJTW9kaWZ5aW5nQWN0aW9uKSB7Ci0JCQkJYWN0aW9uLnNldEVuYWJsZWQoZWRpdGluZ0FsbG93ZWQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yI2FjdGl2YXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJbWFudWFsU3luY2hyb25pemVBY3Rpb24uc2V0UHJvY2VzcyhnZXRQcm9jZXNzKCkpOwotCQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSBhY3RpdmVFZGl0b3IgaW5zdGFuY2VvZiBJU2VsZWN0aW9uUHJvdmlkZXIgPyAoSVNlbGVjdGlvblByb3ZpZGVyKSBhY3RpdmVFZGl0b3IKLQkJCQk6IGFjdGl2ZUVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVnaXN0ZXJlZEFjdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgYWN0aW9uID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgSVdvcmtiZW5jaFBhcnRBY3Rpb24pIHsKLQkJCQkoKElXb3JrYmVuY2hQYXJ0QWN0aW9uKSBhY3Rpb24pCi0JCQkJCQkuc2V0QWN0aXZlV29ya2JlbmNoUGFydChhY3RpdmVFZGl0b3IpOwotCQkJfQotCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIHsKLQkJCQlzZWxlY3Rpb25Qcm92aWRlcgotCQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikgYWN0aW9uKTsKLQkJCX0KLQkJfQotCQlzdXBlci5hY3RpdmF0ZSgpOwotCi0JCS8vIGNhbGwgc2V0IEFjdGl2ZSBwYWdlIGV4cGxpY2l0bHkgaW4gb3JkZXIgdG8gZ2V0IGNvcnJlY3QgYWN0aW9uCi0JCS8vIGJhcnMKLQkJc2V0QWN0aXZlUGFnZShhY3RpdmVFZGl0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciNkZWFjdGl2YXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0KLQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlRWRpdG9yIGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlRWRpdG9yCi0JCQkJOiBhY3RpdmVFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVnaXN0ZXJlZEFjdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgYWN0aW9uID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgSVdvcmtiZW5jaFBhcnRBY3Rpb24pIHsKLQkJCQkoKElXb3JrYmVuY2hQYXJ0QWN0aW9uKSBhY3Rpb24pLnNldEFjdGl2ZVdvcmtiZW5jaFBhcnQobnVsbCk7Ci0JCQl9Ci0JCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikgewotCQkJCXNlbGVjdGlvblByb3ZpZGVyCi0JCQkJCQkucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBhY3Rpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTWV0aG9kTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI2luaXQob3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnMpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCXN1cGVyLmluaXQoYWN0aW9uQmFycyk7Ci0JCXJlZ2lzdGVyQWN0aW9ucygpOwotCQljb250cmlidXRlVG9Ub29sQmFyKGFjdGlvbkJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGdldEFjdGlvbk1hbmFnZXIoKSB7Ci0JCXJldHVybiAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGFjdGl2ZUVkaXRvcikuZ2V0QWN0aW9uTWFuYWdlcigpOwotCX0KLQotCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuICgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEFsbERpYWdyYW1TdXBwcmVzc2VkKGZpbmFsIGJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU7Ci0JCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UxOwotCi0JCWlmICghQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJdGl0bGUsIG1lc3NhZ2UpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShhY3RpdmVFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCkKLQkJCQkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLnNldEFsbERpYWdyYW1TdXBwcmVzc2VkKGdldFByb2Nlc3MoKSwKLQkJCQkJCXN1cHByZXNzZWQpOwotCQkJCWRvU2F2ZUFjdGl2ZUVkaXRvcigpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBwdWJsaXNoRGlhZ3JhbXNGb3JQcm9jZXNzKGZpbmFsIGJvb2xlYW4gcHVibGlzaCkgewotCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU7Ci0JCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UxOwotCi0JCWlmICghQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJdGl0bGUsIG1lc3NhZ2UpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShhY3RpdmVFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCkKLQkJCQkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGdldFByb2Nlc3MoKSkgewotCi0JCQkJCS8qKgotCQkJCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJCQkgKi8KLQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTYxODk0OTAxNDQ3NjM3MTExNEw7Ci0KLQkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgb2JqZWN0OwotCQkJCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQkJCX0KLQotCQkJCX07Ci0JCQkJdHJ5IHsKLQkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCURpYWdyYW1PcHRpb25zLnNldFB1Ymxpc2hBRChhY3Rpdml0eSwgcHVibGlzaCk7Ci0JCQkJCQlEaWFncmFtT3B0aW9ucy5zZXRQdWJsaXNoQUREKGFjdGl2aXR5LCBwdWJsaXNoKTsKLQkJCQkJCURpYWdyYW1PcHRpb25zLnNldFB1Ymxpc2hXUEREKGFjdGl2aXR5LCBwdWJsaXNoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQkJZG9TYXZlQWN0aXZlRWRpdG9yKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwcm9tcHRTYXZlQWN0aXZlRWRpdG9yKCkgewotCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU7Ci0JCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UyOwotCQlpZiAoYWN0aXZlRWRpdG9yLmlzRGlydHkoKSkgewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbih0aXRsZSwgbWVzc2FnZSk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZUFjdGl2ZUVkaXRvcigpIHsKLQkJLy8gc2F2ZSB0aGUgZWRpdG9yCi0JCS8vCi0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGFjdGl2ZUVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKQotCQkJCS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRvU2F2ZUFjdGl2ZUVkaXRvcigpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvU2F2ZUFjdGl2ZUVkaXRvcigpIHsKLQkJKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpLnJlc291cmNlc1RvU2F2ZS5hZGQoZ2V0UHJvY2VzcygpCi0JCQkJLmVSZXNvdXJjZSgpKTsKLQkJYWN0aXZlRWRpdG9yLmRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGVsZXRlQWN0aW9uIGNyZWF0ZURlbGV0ZUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBQcm9jZXNzRGVsZXRlQWN0aW9uKCkgewotCQkJcHJvdGVjdGVkIHZvaWQgc2F2ZUN1cnJlbnRFZGl0b3IoKSB7Ci0JCQkJaWYgKGFjdGl2ZUVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoYWN0aXZlRWRpdG9yLmdldEVkaXRvclNpdGUoKQotCQkJCQkJCS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJYWN0aXZlRWRpdG9yLmRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCX0KLQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlJRm9ybVBhZ2UgYWN0aXZlUGFnZSA9ICgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKQotCQkJCQkJLmdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOwotCQkJCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGlkID0gYWN0aXZlUGFnZS5nZXRJZCgpOwotCQkJCQlpZiAoaWQgPT0gUHJvY2Vzc0VkaXRvci5XQlNfRk9STV9JRAotCQkJCQkJCXx8IGlkID09IFByb2Nlc3NFZGl0b3IuVEFfRk9STV9JRAotCQkJCQkJCXx8IGlkID09IFByb2Nlc3NFZGl0b3IuV1BCU19GT1JNX0lECi0JCQkJCQkJfHwgaWQgPT0gUHJvY2Vzc0VkaXRvci5DT05TT0xJREFURURfRk9STV9JRCkgewotCQkJCQkJLy8gZm9yIGFsbCBvdGhlciBwYWdlcywgZGlzYWJsZSBERUxFVEUKLQkJCQkJCXN1cGVyLnJ1bigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBDdXRBY3Rpb24gY3JlYXRlQ3V0QWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IEN1dEFjdGlvbigpIHsKLQkJCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQlyZXR1cm4gc3VwZXIudXBkYXRlU2VsZWN0aW9uKFByb2Nlc3NEZWxldGVBY3Rpb24KLQkJCQkJCS5maWx0ZXJTZWxlY3Rpb24oc2VsZWN0aW9uKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCWJvb2xlYW4gdW5leGVjdXRhYmxlID0gZmFsc2U7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQl1bmV4ZWN1dGFibGUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICh1bmV4ZWN1dGFibGUpIHsKLQkJCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbW1hbmQoc2VsZWN0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFBhc3RlQWN0aW9uIGNyZWF0ZVBhc3RlQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBhc3RlQWN0aW9uKCkgewotCQkJcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oUHJvY2Vzc0RlbGV0ZUFjdGlvbgotCQkJCQkJLmZpbHRlclNlbGVjdGlvbihzZWxlY3Rpb24pKTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBPdmVycmlkZWQgdG8gdXNlIFJlc291cmNlQXdhcmVQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlBhc3RlQWN0aW9uI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5SZXNvdXJjZUF3YXJlUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZAotCQkJICovCi0JCQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQlyZXR1cm4gbmV3IFJlc291cmNlQXdhcmVQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKGRvbWFpbiwKLQkJCQkJCQlzZWxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCksIG51bGwsCi0JCQkJCQkJQ29tbWFuZFBhcmFtZXRlci5OT19JTkRFWCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBDb3B5QWN0aW9uIGNyZWF0ZUNvcHlBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgQ29weUFjdGlvbigpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmIChkb21haW4gaW5zdGFuY2VvZiBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCQkJKChUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGRvbWFpbikKLQkJCQkJCQkucmVzZXRDb3B5TWFwcygpOwotCQkJCX0KLQkJCQlzdXBlci5ydW4oKTsKLQkJCX0KLQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciNhZGRHbG9iYWxBY3Rpb25zKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkR2xvYmFsQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJc3VwZXIuYWRkR2xvYmFsQWN0aW9ucyhtZW51TWFuYWdlcik7Ci0JCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMiLCBuZXcgU2VwYXJhdG9yKCJmaXhlZC1hZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkvLyBtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImZpeGVkLWFkZGl0aW9ucyIsCi0JCS8vIGluc2VydE5ld1BoYXNlQWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCQlzdXBlci5jb250cmlidXRlVG9Ub29sQmFyKHRvb2xCYXJNYW5hZ2VyKTsKLQotCQlzaG93SW5MaWJyYXJ5VmlldwotCQkJCS5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TaG93TGlua2VkRWxlbWVudGluTGlicmFyeVZpZXcpOwotCQl0b29sQmFyTWFuYWdlci5hZGQobW92ZVVwQWN0aW9uKTsKLQkJdG9vbEJhck1hbmFnZXIuYWRkKG1vdmVEb3duQWN0aW9uKTsKLQkJdG9vbEJhck1hbmFnZXIuYWRkKGluZGVudEFjdGlvbik7Ci0JCXRvb2xCYXJNYW5hZ2VyLmFkZChvdXRkZW50QWN0aW9uKTsKLQkJdG9vbEJhck1hbmFnZXIuYWRkKHNob3dJbkxpYnJhcnlWaWV3KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRpbmdBbGxvd2VkKCkgewotCQlJRm9ybVBhZ2UgYWN0aXZlUGFnZSA9ICgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKQotCQkJCS5nZXRBY3RpdmVQYWdlSW5zdGFuY2UoKTsKLQkJcmV0dXJuICEoYWN0aXZlUGFnZSBpbnN0YW5jZW9mIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSAmJiAoKFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSkgYWN0aXZlUGFnZSkKLQkJCQkuYmFzaWNJc1JlYWRPbmx5KCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXIjbWVudUFib3V0VG9TaG93KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQlJRm9ybVBhZ2UgYWN0aXZlUGFnZSA9ICgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKQotCQkJCS5nZXRBY3RpdmVQYWdlSW5zdGFuY2UoKTsKLQkJaWYgKCFpc0VkaXRpbmdBbGxvd2VkKCkpIHsKLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKAotCQkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQkJbWVudU1hbmFnZXIuYWRkKHNob3dJbkxpYnJhcnlWaWV3KTsKLQkJCWlmIChic0l0ZW1Qcm92aWRlciAhPSBudWxsCi0JCQkvLyAmJiAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikKLQkJCS8vIGJzSXRlbVByb3ZpZGVyKS5oYXNDaGlsZHJlbihzZWxlY3RlZE9iamVjdCkKLQkJCSkgewotCQkJCW1lbnVNYW5hZ2VyLmFkZChleHBhbmRBbGxBY3Rpb24pOwotCQkJCW1lbnVNYW5hZ2VyLmFkZChjb2xsYXBzZUFsbEFjdGlvbik7Ci0JCQl9Ci0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCXJlZnJlc2hWaWV3ZXJBY3Rpb24uc2V0RW5hYmxlZChyZWZyZXNoVmlld2VyQWN0aW9uLmlzRW5hYmxlZCgpKTsKLQkJCW1lbnVNYW5hZ2VyLmFkZChyZWZyZXNoVmlld2VyQWN0aW9uKTsKLQkJCW1lbnVNYW5hZ2VyLmFkZChzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24pOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlRWRpdG9yOwotCi0JCWlmIChzZWxlY3RlZEFjdGl2aXR5ID09IG51bGwKLQkJCQkmJiAoc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkgPT0gbnVsbCB8fCBzZWxlY3Rpb25Qcm92aWRlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkpIHsKLQkJCS8vIGZha2UgYSBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50IHdpdGggdGhlIHByb2Nlc3Mgc2VsZWN0ZWQgaWYgbm8KLQkJCS8vIGVsZW1lbnQgaXMgc2VsZWN0ZWQgeWV0LgotCQkJLy8KLQkJCXNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChzZWxlY3Rpb25Qcm92aWRlciwKLQkJCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZ2V0UHJvY2VzcygpKSkpOwotCQl9Ci0JCS8vIGRpc2FibGUgYWxsIG5ldyBhY3Rpb24gaWYgaXQncyByb2xsZWQgdXAKLQkJYm9vbGVhbiBpc1JvbGxlZFVQID0gYnNJdGVtUHJvdmlkZXIgIT0gbnVsbAotCQkJCSYmIGJzSXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJc3VwZXIuc2V0RW5hYmxlZCghaXNSb2xsZWRVUCk7Ci0JCXN1cGVyLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7Ci0KLQkJLy8gYWRkIG1hcmtlcnMKLQkJLy8KLQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImZpeGVkLWFkZGl0aW9ucyIsIG5ldyBTZXBhcmF0b3IoInByZWZlcmVuY2UiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkKLQkJbWVudU1hbmFnZXIuYXBwZW5kVG9Hcm91cCgicHJlZmVyZW5jZSIsIHByZWZlcmVuY2VBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0KLQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImZpeGVkLWFkZGl0aW9ucyIsIG5ldyBTZXBhcmF0b3IoIm9wZW4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWlmIChic0l0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyCi0JCQkJJiYgVG5nVXRpbC51bndyYXAoYnNJdGVtUHJvdmlkZXIpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZShJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJY29udHJpYnV0ZUFjdGlvbik7Ci0JCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCXJlcGxhY2VBY3Rpb24pOwotCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLAotCQkJCQlsb2NhbFJlcGxhY2VtZW50QW5kRGVlcENvcHkpOwotCQl9Ci0KLQkJaWYgKCFpc1JvbGxlZFVQKSB7Ci0JCQlpZiAoY3JlYXRlQ2hpbGRBY3Rpb25zICE9IG51bGwgJiYgIWNyZWF0ZUNoaWxkQWN0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoCi0JCQkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWRkQWN0aW9uKTsKLQkJCX0KLQkJfQotCi0JCWlmIChyZXZlYWxBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZml4ZWQtYWRkaXRpb25zIiwgcmV2ZWFsQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKHN1cHByZXNzQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImZpeGVkLWFkZGl0aW9ucyIsIHN1cHByZXNzQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICghaXNSb2xsZWRVUCkgewotCQkJaWYgKHN1cHByZXNzVGFza0FjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZml4ZWQtYWRkaXRpb25zIiwgc3VwcHJlc3NUYXNrQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKHJldmVhbFRhc2tBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImZpeGVkLWFkZGl0aW9ucyIsIHJldmVhbFRhc2tBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJaWYgKHVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgKLQkJCQkJImZpeGVkLWFkZGl0aW9ucyIsIHVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoKHNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCAhPSBudWxsKSAmJiAoYnNJdGVtUHJvdmlkZXIgIT0gbnVsbCkpIHsKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZml4ZWQtYWRkaXRpb25zIiwgbW92ZVVwQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJmaXhlZC1hZGRpdGlvbnMiLCBtb3ZlRG93bkFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIEluZGVudC9vdXRkZW50Ci0JCS8vCi0JCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZml4ZWQtYWRkaXRpb25zIiwgaW5kZW50QWN0aW9uKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJmaXhlZC1hZGRpdGlvbnMiLCBvdXRkZW50QWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1lbnVNYW5hZ2VyLmFwcGVuZFRvR3JvdXAoIm9wZW4iLCBzaG93SW5MaWJyYXJ5Vmlldyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoKHNlbGVjdGVkQWN0aXZpdHkgIT0gbnVsbCkgJiYgKGJzSXRlbVByb3ZpZGVyICE9IG51bGwpKSB7Ci0JCQlpZiAoYnNJdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpKSB7Ci0JCQkJcm9sbHVwQWN0aW9uCi0JCQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Sb2xsRG93bik7Ci0JCQl9IGVsc2UgewotCQkJCXJvbGx1cEFjdGlvbgotCQkJCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbFVwKTsKLQkJCX0KLQkJCW1lbnVNYW5hZ2VyLmFwcGVuZFRvR3JvdXAoIm9wZW4iLCByb2xsdXBBY3Rpb24pOyAvLyROT04tTkxTLTEkCQkJCQotCQl9Ci0KLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCS8vICJSZXVzZSIgbWVudQotCQkJLy8KLQkJCU1lbnVNYW5hZ2VyIHJldXNlU3ViTWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXBwbHlQYXR0ZXJuKTsKLQkJCXJldXNlU3ViTWVudS5hZGQoY29weUFjdGl2aXR5QWN0aW9uKTsKLQkJCXJldXNlU3ViTWVudS5hZGQoZXh0ZW5kQWN0aXZpdHlBY3Rpb24pOwotCQkJcmV1c2VTdWJNZW51LmFkZChkZWVwQ29weUFjdGl2aXR5QWN0aW9uKTsKLQotCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLAotCQkJCQlyZXVzZVN1Yk1lbnUpOwotCQl9Ci0KLQkJaWYgKGF1dG9TeW5jaHJvbml6ZS5pc0VuYWJsZWQoKSkgewotCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLAotCQkJCQlhdXRvU3luY2hyb25pemUpOwotCQl9Ci0JCWlmIChtYW51YWxTeW5jaHJvbml6ZUFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLAotCQkJCQltYW51YWxTeW5jaHJvbml6ZUFjdGlvbik7Ci0JCX0KLQotCQlpZiAoIShzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBNaWxlc3RvbmUpKSB7Ci0JCQkvLyBNZW51TWFuYWdlciBkaWFncmFtU3ViTWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCS8vIEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX0RpYWdyYW1zKTsKLQkJCWlmIChzZWxlY3RlZEFjdGl2aXR5ICE9IG51bGwpIHsKLQkJCQlpZiAoc2VsZWN0ZWRBY3Rpdml0eS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQltZW51TWFuYWdlci5hcHBlbmRUb0dyb3VwKCJvcGVuIiwgb3BlbkJhc2VBY3Rpdml0eSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCQkvLyBkaWFncmFtU3ViTWVudS5hZGQob3BlbldvcmtmbG93RWRpdG9yQWN0aW9uKTsKLQkJCQkvLyBkaWFncmFtU3ViTWVudS5hZGQob3BlbldvcmtmbG93RGV0YWlsRWRpdG9yQWN0aW9uKTsKLQkJCQkvLyBkaWFncmFtU3ViTWVudS5hZGQob3BlbldQRGVwZW5kZW5jeUVkaXRvckFjdGlvbik7Ci0JCQkJLy8gZGlhZ3JhbVN1Yk1lbnUuYWRkKHN1cHByZXNzRGlhZ3JhbUFjdGlvbik7Ci0JCQkJLy8gZGlhZ3JhbVN1Yk1lbnUuYWRkKGFzc2lnblVzZXJEaWFncmFtKTsKLQkJCX0KLQkJCS8vIGlmIChzZWxlY3RlZEFjdGl2aXR5ID09IGdldFByb2Nlc3MoKSkgewotCQkJLy8gZGlhZ3JhbVN1Yk1lbnUuYWRkKHN1cHByZXNzQWxsRGlhZ3JhbXMpOwotCQkJLy8gZGlhZ3JhbVN1Yk1lbnUuYWRkKHJldmVhbEFsbERpYWdyYW1zKTsKLQkJCS8vIH0KLQkJCS8vIEVuYWJsZSB0aGlzIGNvZGUgaWYgQWN0aXZpdHlEZXRhaWxEaWFncmFtSW5mb0RpYWxvZyBpcyBuZWVkLgotCQkJLy8gaWYoc2VsZWN0ZWRBY3Rpdml0eSAhPSBudWxsKXsKLQkJCS8vIGRpYWdyYW1TdWJNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQkJLy8gZGlhZ3JhbVN1Yk1lbnUuYWRkKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbUluZm8pOwotCQkJLy8gfQotCQkJLy8gbWVudU1hbmFnZXIuYXBwZW5kVG9Hcm91cCgib3BlbiIsIGRpYWdyYW1TdWJNZW51KTsgLy8kTk9OLU5MUy0xJAotCi0JCQlNZW51TWFuYWdlciBuZXdEaWFncmFtU3ViTWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRGlhZ3JhbXMpOyAKLQkJCWlmIChzZWxlY3RlZEFjdGl2aXR5ICE9IG51bGwpIHsKLQkJCQluZXdEaWFncmFtU3ViTWVudS5hZGQobmV3QWN0aXZpdHlEaWFncmFtRWRpdG9yKTsKLQkJCQluZXdEaWFncmFtU3ViTWVudS5hZGQobmV3QWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yKTsKLQkJCQluZXdEaWFncmFtU3ViTWVudS5hZGQobmV3V1BEaWFncmFtRWRpdG9yKTsKLQkJCQluZXdEaWFncmFtU3ViTWVudS5hZGQobmV3U3VwcHJlc3NEaWFncmFtQWN0aW9uKTsKLQkJCQluZXdEaWFncmFtU3ViTWVudS5hZGQobmV3QXNzaWduVXNlckRpYWdyYW0pOwotCi0JCQl9Ci0KLQkJCWlmIChzZWxlY3RlZEFjdGl2aXR5ID09IGdldFByb2Nlc3MoKSkgewotCQkJCW5ld0RpYWdyYW1TdWJNZW51LmFkZChkaWFncmFtc1B1Ymxpc2hBbGwpOwotCQkJCW5ld0RpYWdyYW1TdWJNZW51LmFkZChkaWFncmFtUHVibGlzaE5vbmUpOwotCQkJfQotCQkJbWVudU1hbmFnZXIuYXBwZW5kVG9Hcm91cCgib3BlbiIsIG5ld0RpYWdyYW1TdWJNZW51KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKGJzSXRlbVByb3ZpZGVyICE9IG51bGwKLQkJLy8gdGhpcyBpcyBhbiBleHBlbnNpdmUgY2hlY2ssIHJlbW92ZWQgaXQKLQkJLy8KLQkJLy8gJiYgKChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpCi0JCS8vIGJzSXRlbVByb3ZpZGVyKS5oYXNDaGlsZHJlbihzZWxlY3RlZE9iamVjdCkKLQkJKSB7Ci0JCQltZW51TWFuYWdlci5hcHBlbmRUb0dyb3VwKCJvcGVuIiwgZXhwYW5kQWxsQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJbWVudU1hbmFnZXIuYXBwZW5kVG9Hcm91cCgib3BlbiIsIGNvbGxhcHNlQWxsQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCXJldHVybiAoKFByb2Nlc3NDb21wb25lbnQpICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBhY3RpdmVFZGl0b3IKLQkJCQkuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0TWV0aG9kRWxlbWVudCgpKS5nZXRQcm9jZXNzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN1cHByZXNzaW9uIGdldFN1cHByZXNzaW9uKCkgewotCQlyZXR1cm4gKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpLnN1cHByZXNzaW9uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlcG9wdWxhdGVEeW5hbWljTWVudUl0ZW1zKCkgewotCQkvLyBSZW1vdmUgYW55IG1lbnUgaXRlbXMgZm9yIG9sZCBzZWxlY3Rpb24uCi0JCS8vCi0JCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucyk7Ci0JCX0KLQkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zKTsKLQkJfQotCQljcmVhdGVDaGlsZEFjdGlvbnMgPSBudWxsOwotCQljcmVhdGVTaWJsaW5nQWN0aW9ucyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFjdGlvbiBzdGF0ZSB0byBlbmFibGVkIG9yIGRpc2FibGVkCi0JICogCi0JICogQHBhcmFtIGxvY2tlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEFjdGlvblN0YXRlKCkgewotCQlpZiAobG9ja2VkKSB7Ci0JCQkvLyBkaXNhYmxlIG1vZGlmeWluZyBhY3Rpb25zCi0JCQlwYXN0ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWN1dEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWRlbGV0ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQotCQkJZm9yKElBY3Rpb24gYWN0aW9uIDogcmVnaXN0ZXJlZEFjdGlvbnMpIHsKLQkJCQlpZihhY3Rpb24gaW5zdGFuY2VvZiBJTW9kaWZ5aW5nQWN0aW9uKSB7Ci0JCQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoIW9sZExvY2tlZCkgewotCQkJLy8gdXBkYXRlIHN0YXRlIG9mIG1vZGlmeWluZyBhY3Rpb25zCi0JCQkvLwotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb25Qcm92aWRlcgotCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQljdXRBY3Rpb24uc2V0RW5hYmxlZChjdXRBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbikpOwotCQkJcGFzdGVBY3Rpb24uc2V0RW5hYmxlZChwYXN0ZUFjdGlvbi51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKSk7Ci0JCQlkZWxldGVBY3Rpb24uc2V0RW5hYmxlZChkZWxldGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbikpOwotCQkJCi0JCQlmb3IoSUFjdGlvbiBhY3Rpb24gOiByZWdpc3RlcmVkQWN0aW9ucykgewotCQkJCWlmKGFjdGlvbiBpbnN0YW5jZW9mIElNb2RpZnlpbmdBY3Rpb24pIHsKLQkJCQkJYWN0aW9uLnNldEVuYWJsZWQoYWN0aW9uIGluc3RhbmNlb2YgQ29tbWFuZEFjdGlvbkhhbmRsZXIgPyAKLQkJCQkJCQkoKENvbW1hbmRBY3Rpb25IYW5kbGVyKWFjdGlvbikudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbikgOiB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlib29sZWFuIGVuYWJsZWQgPSAhbG9ja2VkOwotCi0JCWFkZEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQljb250cmlidXRlQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0KLQkJLy8gc3RhdGUgb2YgdGhlc2UgYWN0aW9ucyBpcyBzZXQgaW4gdXBkYXRlQWN0aW9ucygpCi0JCS8vCi0JCS8vIG1vdmVEb3duQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCS8vIG1vdmVVcEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkvLyByZXZlYWxBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJLy8gc3VwcHJlc3NBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJcmVwbGFjZUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlsb2NhbFJlcGxhY2VtZW50QW5kRGVlcENvcHkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJcmV2ZWFsQWxsRGlhZ3JhbXMuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJc3VwcHJlc3NBbGxEaWFncmFtcy5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlzdXBwcmVzc0RpYWdyYW1BY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJY29weUFjdGl2aXR5QWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWV4dGVuZEFjdGl2aXR5QWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWRlZXBDb3B5QWN0aXZpdHlBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLAotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGxvY2tlZCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKGRlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMoQ29sbGVjdGlvbiBkZXNjcmlwdG9ycywKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChsb2NrZWQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKGRlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk1ldGhvZExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCUlTZWxlY3Rpb24gc2VsID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsOwotCQkJb2xkTG9ja2VkID0gbG9ja2VkOwotCQkJbG9ja2VkID0gVmlld0hlbHBlci5pc0xvY2tlZChzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQotCQkJc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsKS50b0xpc3QoKTsKLQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQlzZWxlY3RlZE9iamVjdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKHNlbGVjdGVkT2JqZWN0KTsKLQkJCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQlzZWxlY3RlZEVsZW1lbnQgPSBvYmo7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCXNlbGVjdGVkQWN0aXZpdHkgPSAoQWN0aXZpdHkpIG9iajsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBkZXBvcHVsYXRlRHluYW1pY01lbnVJdGVtcygpOwotCQkJCQkvLyBic0l0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCQkJCXNlbGVjdGVkQWN0aXZpdHkgPSBudWxsOwotCQkJCX0KLQkJCQlBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZG9tYWluID0gKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSBhY3RpdmVFZGl0b3JQYXJ0KQotCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJCQlPYmplY3QgcHJvdmlkZXJPYmogPSBkb21haW4uZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdCgKLQkJCQkJCXNlbGVjdGVkT2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChwcm92aWRlck9iaiBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikKLQkJCQkJYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBwcm92aWRlck9iajsKLQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCXNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBvYmo7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50ID0gbnVsbDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWRlcG9wdWxhdGVEeW5hbWljTWVudUl0ZW1zKCk7Ci0JCQkJYnNJdGVtUHJvdmlkZXIgPSBudWxsOwotCQkJCXNlbGVjdGVkRWxlbWVudCA9IG51bGw7Ci0JCQkJc2VsZWN0ZWRBY3Rpdml0eSA9IG51bGw7Ci0JCQkJc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50ID0gbnVsbDsKLQkJCQlzZWxlY3RlZE9iamVjdCA9IG51bGw7Ci0JCQl9Ci0KLQkJCXVwZGF0ZUFjdGlvbnMoKTsKLQotCQl9IGVsc2UgewotCQkJZGVwb3B1bGF0ZUR5bmFtaWNNZW51SXRlbXMoKTsKLQkJCWJzSXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJCXNlbGVjdGVkRWxlbWVudCA9IG51bGw7Ci0JCQlzZWxlY3RlZEFjdGl2aXR5ID0gbnVsbDsKLQkJCXNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCA9IG51bGw7Ci0JCX0KLQotCQkvLyAvLyB0ZXN0IGNvZGUKLQkJLy8gLy8KLQkJLy8gaWYoc2VsZWN0ZWRBY3Rpdml0eSAhPSBudWxsKSB7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9Ci0JCS8vIHNlbGVjdGVkQWN0aXZpdHkuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSkgaXRlci5uZXh0KCk7Ci0JCS8vIGlmKFN0cmluZy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGF0dHJpYi5nZXRFQXR0cmlidXRlVHlwZSgpLmdldEluc3RhbmNlQ2xhc3MoKSkpCi0JCS8vIHsKLQkJLy8gTGlzdCB2YWx1ZXMgPQotCQkvLyBDb25maWd1cmF0aW9uSGVscGVyLmdldFN0cmluZ0F0dHJpYnV0ZShzZWxlY3RlZEFjdGl2aXR5LCBhdHRyaWIpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGF0dHJpYi5nZXROYW1lKCkgKyAiOiAiICsgdmFsdWVzKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIGFjdGlvbnMgaW5jbHVkaW5nIGVuYWJsaW5nL2Rpc2FibGluZyB0aGVtIGJhc2VkIG9uIHNlbGVjdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUFjdGlvbnMoKSB7Ci0JCXNob3dJbkxpYnJhcnlWaWV3Ci0JCQkJLnNldEVuYWJsZWQoc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvcgotCQkJCQkJJiYgUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQpICE9IG51bGwpOwotCi0JCWlmICghbG9ja2VkICYmIHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7CQkJCQotCQkJCU9iamVjdCBvID0gc2VsZWN0aW9uLmdldCgwKTsKLQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJaWYoUHJvY2Vzc1V0aWwuaXNSb2xsZWRVcERlc2NyaXB0b3IobywgYWRhcHRlckZhY3RvcnkpKSB7Ci0JCQkJCXJldmVhbEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJc3VwcHJlc3NBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoZ2V0U3VwcHJlc3Npb24oKS5jYW5SZXZlYWwoc2VsZWN0aW9uKSkgewotCQkJCQkJcmV2ZWFsQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQlzdXBwcmVzc0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfSBlbHNlIGlmIChnZXRTdXBwcmVzc2lvbigpLmNhblN1cHByZXNzKHNlbGVjdGlvbikpIHsKLQkJCQkJCXN1cHByZXNzQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQlyZXZlYWxBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXZlYWxBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQlzdXBwcmVzc0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV2ZWFsQWN0aW9uLnNldEVuYWJsZWQoZ2V0U3VwcHJlc3Npb24oKS5jYW5SZXZlYWwoc2VsZWN0aW9uKSk7Ci0JCQkJc3VwcHJlc3NBY3Rpb24uc2V0RW5hYmxlZChnZXRTdXBwcmVzc2lvbigpLmNhblN1cHByZXNzKAotCQkJCQkJc2VsZWN0aW9uKSk7Ci0JCQl9Ci0KLQkJCS8vIEFjdGlvbiBFbmFibGUvRGlzYWJsZSBmb3IgU3VwcHJlc3MgVGFzay9SZXZlYWwgVGFzayBjb250ZXh0IG1lbnUKLQkJCWJvb2xlYW4gc2hvdyA9IHRydWU7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5zaXplKCk7IGkrKykgewotCQkJCWlmIChnZXRBZGFwdGVyRmFjdG9yeSgpID09IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCi0JCQkJCWlmICghKHNlbGVjdGlvbi5nZXQoaSkgaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBzZWxlY3Rpb24KLQkJCQkJCQkuZ2V0KGkpIGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSkgewotCQkJCQkJc2hvdyA9IGZhbHNlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9IGVsc2UKLQkJCQkJc2hvdyA9IGZhbHNlOwotCQkJfQotCQkJaWYgKHNob3cpIHsKLQkJCQlMaXN0IHRhc2tEZXNjcmlwdG9ycyA9IFByb2Nlc3NVdGlsCi0JCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JzKHNlbGVjdGlvbik7Ci0JCQkJc3VwcHJlc3NUYXNrQWN0aW9uLnNldEVuYWJsZWQoZ2V0U3VwcHJlc3Npb24oKS5jYW5TdXBwcmVzcygKLQkJCQkJCXRhc2tEZXNjcmlwdG9ycykpOwotCQkJCXJldmVhbFRhc2tBY3Rpb24uc2V0RW5hYmxlZChnZXRTdXBwcmVzc2lvbigpLmNhblJldmVhbCgKLQkJCQkJCXRhc2tEZXNjcmlwdG9ycykpOwotCQkJfSBlbHNlIHsKLQkJCQlzdXBwcmVzc1Rhc2tBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJcmV2ZWFsVGFza0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQotCQkJLy8gYm9vbGVhbiBoYXNJbmhlcml0ZWQgPSBmYWxzZTsKLQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCS8vIE9iamVjdCBpdGVtID0gaXRlci5uZXh0KCk7Ci0JCQkvLyBpZiAoaXRlbSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyCi0JCQkvLyAmJiAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBpdGVtKQotCQkJLy8gLmlzUmVhZE9ubHkoKSkgewotCQkJLy8gaGFzSW5oZXJpdGVkID0gdHJ1ZTsKLQkJCS8vIGJyZWFrOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gdXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbi5zZXRFbmFibGVkKGhhc0luaGVyaXRlZCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXZlYWxBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlzdXBwcmVzc0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXN1cHByZXNzVGFza0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXJldmVhbFRhc2tBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotCQkvLyBTZXQgQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gQWN0aW9uIGVuYWJsZSBzdGF0ZS4KLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQl8fCBzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJc2V0QWN0aW9uU3RhdGVGb3JBREQoKTsKLQkJCXNldERpYWdyYW1zQ29udGV4dE1lbnVTdGF0ZSgpOwotCQl9Ci0KLQkJLy8gY2hhbmdlIGFjdGlvbiBzdGF0ZSBmb3IgbG9ja2VkIHBsdWdpbgotCQlzZXRBY3Rpb25TdGF0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhZ2UoSUVkaXRvclBhcnQgcGFydCkgewotCQlpZiAodGhpcy5hY3RpdmVFZGl0b3IgIT0gbnVsbCkgewotCQkJaW50IHBhZ2UgPSAoKFByb2Nlc3NFZGl0b3IpIHRoaXMuYWN0aXZlRWRpdG9yKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlJQWN0aW9uQmFycyBhY3Rpb25CYXJzID0gdGhpcy5hY3RpdmVFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJCS5nZXRBY3Rpb25CYXJzKCk7Ci0KLQkJCS8vIFRPRE8gLSBuZWVkIHRvIGdldCBJRm9ybVBhZ2UgYW5kIGNvbXBhcmUgb24gdGhhdCByYXRoZXIgdGhhbgotCQkJLy8gaW50ZWdlciBwYWdlIGlkLiBUaGVzZSBpZCB3aWxsIGNoYW5nZSBpZiB3ZSByZXBvc2l0aW9uIHBhZ2VzLgotCQkJaWYgKHBhZ2UgPT0gMCkgewkJCQotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpLAotCQkJCQkJbnVsbCk7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ1VULmdldElkKCksCi0JCQkJCQludWxsKTsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksCi0JCQkJCQludWxsKTsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpLAotCQkJCQkJbnVsbCk7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLAotCQkJCQkJbnVsbCk7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUkVETy5nZXRJZCgpLAotCQkJCQkJbnVsbCk7Ci0JCQl9IGVsc2UgaWYgKHBhZ2UgPT0gNCkgewotCQkJCWFjdGlvbkJhcnMuY2xlYXJHbG9iYWxBY3Rpb25IYW5kbGVycygpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksCi0JCQkJCQlkZWxldGVBY3Rpb24pOwotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpLAotCQkJCQkJY3V0QWN0aW9uKTsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksCi0JCQkJCQljb3B5QWN0aW9uKTsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpLAotCQkJCQkJcGFzdGVBY3Rpb24pOwotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlVORE8uZ2V0SWQoKSwKLQkJCQkJCXVuZG9BY3Rpb24pOwotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSwKLQkJCQkJCXJlZG9BY3Rpb24pOwotCQkJfQotCQkJYWN0aW9uQmFycy51cGRhdGVBY3Rpb25CYXJzKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN1cGVyRG9SZWZyZXNoKCkgewotCQlzdXBlci5kb1JlZnJlc2goKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1JlZnJlc2goKSB7Ci0JCWlmIChhY3RpdmVFZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKSB7Ci0JCQlEaXNwbGF5IGRpc3BsYXkgPSBhY3RpdmVFZGl0b3JQYXJ0LmdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKTsKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGRpc3BsYXksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJLy8gdXBkYXRlIElEcwotCQkJCQkvLwotCQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJCWlmIChhZGFwdGVyRmFjdG9yeSA9PSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JCQkJCQkJfHwgYWRhcHRlckZhY3RvcnkgPT0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJCQlQcm9jZXNzIHByb2MgPSBnZXRQcm9jZXNzKCk7Ci0JCQkJCQlQcm9jZXNzVXRpbC51cGRhdGVJRHMoYWRhcHRlckZhY3RvcnksIHByb2MpOwotLy8JCQkJCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJCVByb2Nlc3NVdGlsLnJlZnJlc2hQcmVkZWNjZXNzb3JMaXN0cyhhZGFwdGVyRmFjdG9yeSwgcHJvYyk7Ci0vLwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVmcmVzaFByZWRlY2Nlc3Nvckxpc3RzKCkgdG9vazogIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpKTsKLQkJCQkJfQotCi0JCQkJCXN1cGVyRG9SZWZyZXNoKCk7Ci0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogU2V0IEFjdGlvbiBzdGF0ZSBmb3IgQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gaW4gQ29udGV4dCBNZW51IG9uIHNlbGVjdGlvbgotCSAqIG9mIEFjdGl2aXR5LiBJZiBhbiBBY3Rpdml0eSBjb25zaXN0IGF0bGVhc3Qgb25lIHRhc2tkZXNjcmlwdG9yIGFuZCBpdHMKLQkgKiBwcmltYXJ5IHBlcmZvcm1lciBpbiBjdXJyZW50IGNvbmZpZ3VyYXRpb24sIHRoZW4gc3RhdGUgaXMgZW5hYmxlZCBlbHNlCi0JICogc3RhdGUgaXMgZGlzYWJsZWQgaW4gY29udGV4dCBtZW51IChwcm9jZXNzIGVkaXRvcikuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0QWN0aW9uU3RhdGVGb3JBREQoKSB7Ci0KLQkJLy8gc2V0IEFERCBBY3Rpb24gc3RhdGUgZmFsc2UKLQkJb3BlbldvcmtmbG93RGV0YWlsRWRpdG9yQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCS8vIHNldCBBRCBBY3Rpb24gc3RhdGUgdHJ1ZSBhbHdheXMKLQkJb3BlbldvcmtmbG93RWRpdG9yQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJLy8gc2V0IFdQRCBEaWFncmFtIE1lbnUgQWN0aW9uIHN0YXRlIHRydSBhbHdheXMKLQkJb3BlbldQRGVwZW5kZW5jeUVkaXRvckFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCi0JCWlmIChzZWxlY3RlZE9iamVjdCAhPSBudWxsKSB7Ci0KLQkJCWlmIChnZXRTdXBwcmVzc2lvbigpLmlzU3VwcHJlc3NlZChzZWxlY3RlZE9iamVjdCkpIHsKLQkJCQlvcGVuV29ya2Zsb3dEZXRhaWxFZGl0b3JBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJb3BlbldvcmtmbG93RWRpdG9yQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCW9wZW5XUERlcGVuZGVuY3lFZGl0b3JBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IG51bGw7Ci0JCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJYWN0aXZpdHkgPSBzZWxlY3RlZEFjdGl2aXR5OwotCQkJfSBlbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCWFjdGl2aXR5ID0gKEFjdGl2aXR5KSAoKEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgc2VsZWN0ZWRPYmplY3QpCi0JCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJCWlmIChhY3Rpdml0eSA9PSBudWxsKQotCQkJCXJldHVybjsKLQotCQkJd2hpbGUgKCFhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKS5lcXVhbHMoCi0JCQkJCVZhcmlhYmlsaXR5VHlwZS5OQSkpIHsKLQotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGFjdGl2aXR5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkvLyBJZiBBY3Rpdml0eSBpcyBzZXQgdG8gbG9jYWwgY29udHJpYnV0aW9uLAotCQkJCS8vIG5lZWQgdG8gZ2V0IGJyZWFrZG93biBlbGVtZW50cyBvZiBsb2NhbCBjb250cmlidXRlZAotCQkJCS8vIGFjdGl2aXR5ICsgYmFzZSBhY3Rpdml0eS4gQW5kIGJhc2UgYWN0aXZpdHkgYnJlYWtkb3duCi0JCQkJLy8gZWxlbWVudHMKLQkJCQkvLyBhcmUgY29sbGVjdGVkIGFmdGVyIHdoaWxlIGxvb3AgZW5kcykKLQkJCQkvLyBpZiAoVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwuZXF1YWxzKGFjdGl2aXR5Ci0JCQkJLy8gLmdldFZhcmlhYmlsaXR5VHlwZSgpKSkgewotCQkJCS8vIGxpc3QuYWRkQWxsKGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkpOwotCQkJCS8vIH0KLQkJCQlsaXN0LmFkZEFsbChhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKTsKLQotCQkJCWlmICgodmUgIT0gbnVsbCkgJiYgKHZlIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQkJCWFjdGl2aXR5ID0gKEFjdGl2aXR5KSB2ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIEZvciBBRCBkaWFncmFtIG1lbnUgb3B0aW9uLCBpZiBCYXNlIEFjdGl2aXR5IGRvbm90IGhhdmUgYW55Ci0JCQkvLyBBRCBkaWFncmFtLCBkb25vdCBzaG93IEFEIGRpYWdyYW0gb3B0aW9uIGluIGNvbnRleHQgbWVudSBmb3IKLQkJCS8vIHJlYWRvbmx5IGFjdGl2aXR5LgotCQkJRGlhZ3JhbSBkaWFncmFtID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRVTUFEaWFncmFtKAotCQkJCQlhY3Rpdml0eSwgR3JhcGhpY2FsRGF0YUhlbHBlci5BQ1RJVklUWV9ESUFHUkFNLCBmYWxzZSk7Ci0JCQlpZiAoZGlhZ3JhbSA9PSBudWxsCi0JCQkJCSYmIHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJb3BlbldvcmtmbG93RWRpdG9yQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCi0JCQkvLyBGb3IgV1BEIGRpYWdyYW0gbWVudSBvcHRpb24sIGlmIEJhc2UgQWN0aXZpdHkgZG9ub3QgaGF2ZSBhbnkKLQkJCS8vIFdQRCBkaWFncmFtLCBkb25vdCBzaG93IFdQRCBkaWFncmFtIG9wdGlvbiBpbiBjb250ZXh0IG1lbnUKLQkJCS8vIGZvciByZWFkb25seSBhY3Rpdml0eS4KLQkJCWRpYWdyYW0gPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFVNQURpYWdyYW0oCi0JCQkJCWFjdGl2aXR5LAotCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0sIGZhbHNlKTsKLQkJCWlmIChkaWFncmFtID09IG51bGwKLQkJCQkJJiYgc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlvcGVuV1BEZXBlbmRlbmN5RWRpdG9yQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCi0JCQkvLyBDb2xsZWN0IHRoZSBicmVha2Rvd24gZWxlbWVudHMgdG8gdmVyaWZ0eSB0YXNrZGVzY3JpcHRvcnMgYXJlCi0JCQkvLyBub3QuCi0JCQlsaXN0LmFkZEFsbChhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKTsKLQotCQkJLy8gRm9yIEFERCBkaWFncmFtIG1lbnUgb3B0aW9uLCBpZiBCYXNlIEFjdGl2aXR5IGRvbm90IGhhdmUgYW55Ci0JCQkvLyBBREQgZGlhZ3JhbSwgZG9ub3Qgc2hvdyBBREQgZGlhZ3JhbSBvcHRpb24gaW4gY29udGV4dCBtZW51Ci0JCQkvLyBmb3IKLQkJCS8vIHJlYWRvbmx5IGFjdGl2aXR5LgotCQkJZGlhZ3JhbSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0VU1BRGlhZ3JhbSgKLQkJCQkJYWN0aXZpdHksIEdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0sCi0JCQkJCWZhbHNlKTsKLQkJCWlmIChkaWFncmFtID09IG51bGwKLQkJCQkJJiYgc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlvcGVuV29ya2Zsb3dEZXRhaWxFZGl0b3JBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgTGlzdCwgdG8gZmluZCB0YXNrZGVzY3JpcHRvciBhbmQgaGFzCi0JCQkJLy8gcHJpbWFyeSByb2xlIHdpdGhpbiBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JCQkJLy8gdGhlbiBlbmFibGUgdGhlIGFjdGlvbi4KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQkJaWYgKCFnZXRTdXBwcmVzc2lvbigpLmlzU3VwcHJlc3NlZChvYmopKSB7Ci0JCQkJCQkJT2JqZWN0IGUgPSAoKFRhc2tEZXNjcmlwdG9yKSBvYmopCi0JCQkJCQkJCQkuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQkJCQkJCQlBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZG9tYWluID0gKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSBhY3RpdmVFZGl0b3JQYXJ0KQotCQkJCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJCQkJCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gZG9tYWluLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJCQkJaWYgKGZhY3RvcnkgaW5zdGFuY2VvZiBFeHBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkJCQkJSUZpbHRlciBmaWx0ZXIgPSAoKEV4cG9zZWRBZGFwdGVyRmFjdG9yeSkgZmFjdG9yeSkKLQkJCQkJCQkJCQkuZ2V0RmlsdGVyKCk7Ci0JCQkJCQkJCWlmIChmaWx0ZXIgIT0gbnVsbCAmJiBmaWx0ZXIuYWNjZXB0KGUpCi0JCQkJCQkJCQkJJiYgIWdldFN1cHByZXNzaW9uKCkuaXNTdXBwcmVzc2VkKGUpKSB7Ci0JCQkJCQkJCQlvcGVuV29ya2Zsb3dEZXRhaWxFZGl0b3JBY3Rpb24KLQkJCQkJCQkJCQkJLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogU2V0IEFjdGlvbiBzdGF0ZSBmb3IgT3BlbiBEaWFncmFtIEFjdGlvbnMgaW4gQ29udGV4dCBNZW51IG9uCi0JICogc2VsZWN0aW9uIG9mIEFjdGl2aXR5LiBDaGVja2luZyBjb25kaXRpb24gdG8gaGFuZGxlIGlmIGFjdGl2aXR5IHN1cHByZXNzZWQsIGlmIGFjdGl2aXR5IGRvbid0IGhhdmUKLQkgKiBhbnkgdGFza2Rlc2NyaXB0b3IgYW5kIHByaW1hcnkgcGVyZm9ybWVyLCBpZiBiYXNlIGFjdGl2aXR5IGRvbid0IGhhdmUgZGlhZ3JhbS4gCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldERpYWdyYW1zQ29udGV4dE1lbnVTdGF0ZSgpIHsKLQotCQkvLyBzZXQgQUREIEFjdGlvbiBzdGF0ZSBmYWxzZQotCQluZXdBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJLy8gc2V0IEFEIEFjdGlvbiBzdGF0ZSB0cnVlIGFsd2F5cwotCQluZXdBY3Rpdml0eURpYWdyYW1FZGl0b3Iuc2V0RW5hYmxlZCh0cnVlKTsKLQotCQkvLyBzZXQgV1BEIERpYWdyYW0gTWVudSBBY3Rpb24gc3RhdGUgdHJ1IGFsd2F5cwotCQluZXdXUERpYWdyYW1FZGl0b3Iuc2V0RW5hYmxlZCh0cnVlKTsKLQotCQlpZiAoc2VsZWN0ZWRPYmplY3QgIT0gbnVsbCkgewotCi0JCQlpZiAoZ2V0U3VwcHJlc3Npb24oKS5pc1N1cHByZXNzZWQoc2VsZWN0ZWRPYmplY3QpKSB7Ci0JCQkJbmV3QWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCW5ld0FjdGl2aXR5RGlhZ3JhbUVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQluZXdXUERpYWdyYW1FZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlPYmplY3QgdW53cmFwcGVkID0gVG5nVXRpbC51bndyYXAoc2VsZWN0ZWRPYmplY3QpOwotCQkJaWYoISh1bndyYXBwZWQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgdW53cmFwcGVkOwotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCi0JCQkvL1RPRE86IGNoZWNrIGZvciBleGlzdGluZyBkaWFncmFtcyBpbiBpbW1lZGlhdGUgYmFzZSBpbnN0ZWFkIG9mIHJvb3QgYmFzZQotCQkJCi0JCQl3aGlsZSAoIWFjdGl2aXR5LmdldFZhcmlhYmlsaXR5VHlwZSgpLmVxdWFscygKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLk5BKSkgewotCi0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWxpc3QuYWRkQWxsKGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkpOwotCi0JCQkJaWYgKCh2ZSAhPSBudWxsKSAmJiAodmUgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCQkJYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHZlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSBkaWFncmFtID0gKChQcm9jZXNzRWRpdG9yKSBnZXRBY3RpdmVFZGl0b3IoKSkKLQkJCQkJLmdldERpYWdyYW1FZGl0b3JIZWxwZXIoKS5nZXREaWFncmFtKGFjdGl2aXR5LAotCQkJCQkJCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKTsKLQkJCWlmIChkaWFncmFtID09IG51bGwKLQkJCQkJJiYgc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQluZXdBY3Rpdml0eURpYWdyYW1FZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCS8vIEZvciBXUEQgZGlhZ3JhbSBtZW51IG9wdGlvbiwgaWYgQmFzZSBBY3Rpdml0eSBkb25vdCBoYXZlIGFueQotCQkJLy8gV1BEIGRpYWdyYW0sIGRvbm90IHNob3cgV1BEIGRpYWdyYW0gb3B0aW9uIGluIGNvbnRleHQgbWVudQotCQkJLy8gZm9yIHJlYWRvbmx5IGFjdGl2aXR5LgotCQkJZGlhZ3JhbSA9ICgoUHJvY2Vzc0VkaXRvcikgZ2V0QWN0aXZlRWRpdG9yKCkpCi0JCQkJCS5nZXREaWFncmFtRWRpdG9ySGVscGVyKCkuZ2V0RGlhZ3JhbShhY3Rpdml0eSwKLQkJCQkJCQlJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSk7Ci0JCQlpZiAoZGlhZ3JhbSA9PSBudWxsCi0JCQkJCSYmIHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJbmV3V1BEaWFncmFtRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCi0JCQkvLyBDb2xsZWN0IHRoZSBicmVha2Rvd24gZWxlbWVudHMgdG8gdmVyaWZ0eSB0YXNrZGVzY3JpcHRvcnMgYXJlCi0JCQkvLyBub3QuCi0JCQlsaXN0LmFkZEFsbChhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKTsKLQotCQkJLy8gRm9yIEFERCBkaWFncmFtIG1lbnUgb3B0aW9uLCBpZiBCYXNlIEFjdGl2aXR5IGRvbm90IGhhdmUgYW55Ci0JCQkvLyBBREQgZGlhZ3JhbSwgZG9ub3Qgc2hvdyBBREQgZGlhZ3JhbSBvcHRpb24gaW4gY29udGV4dCBtZW51Ci0JCQkvLyBmb3IKLQkJCS8vIHJlYWRvbmx5IGFjdGl2aXR5LgotCQkJZGlhZ3JhbSA9ICgoUHJvY2Vzc0VkaXRvcikgZ2V0QWN0aXZlRWRpdG9yKCkpCi0JCQkJCS5nZXREaWFncmFtRWRpdG9ySGVscGVyKCkuZ2V0RGlhZ3JhbShhY3Rpdml0eSwKLQkJCQkJCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pOwotCi0JCQlpZiAoZGlhZ3JhbSA9PSBudWxsCi0JCQkJCSYmIHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJbmV3QWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBJdGVyYXRlIHRocm91Z2ggdGhlIExpc3QsIHRvIGZpbmQgdGFza2Rlc2NyaXB0b3IgYW5kIGhhcwotCQkJCS8vIHByaW1hcnkgcm9sZSB3aXRoaW4gY3VycmVudCBjb25maWd1cmF0aW9uLgotCQkJCS8vIHRoZW4gZW5hYmxlIHRoZSBhY3Rpb24uCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCWlmICghZ2V0U3VwcHJlc3Npb24oKS5pc1N1cHByZXNzZWQob2JqKSkgewotCQkJCQkJCU9iamVjdCBlID0gKChUYXNrRGVzY3JpcHRvcikgb2JqKQotCQkJCQkJCQkJLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCQkJCQkJQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGRvbWFpbiA9IChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgYWN0aXZlRWRpdG9yUGFydCkKLQkJCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCQkJCQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGRvbWFpbi5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCQkJCWlmIChmYWN0b3J5IGluc3RhbmNlb2YgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJCQkJCUlGaWx0ZXIgZmlsdGVyID0gKChFeHBvc2VkQWRhcHRlckZhY3RvcnkpIGZhY3RvcnkpCi0JCQkJCQkJCQkJLmdldEZpbHRlcigpOwotCQkJCQkJCQlpZiAoZmlsdGVyICE9IG51bGwgJiYgZmlsdGVyLmFjY2VwdChlKQotCQkJCQkJCQkJCSYmICFnZXRTdXBwcmVzc2lvbigpLmlzU3VwcHJlc3NlZChlKSkgewotCQkJCQkJCQkJbmV3QWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yCi0JCQkJCQkJCQkJCS5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJvY2Vzc0VkaXRvcklucHV0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJvY2Vzc0VkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YzU3OGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1Byb2Nlc3NFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLQotLyoqCi0gKiBBbiBlZGl0b3IgaW5wdXQgZm9yIHByb2Nlc3MgZWRpdG9yCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRWRpdG9ySW5wdXQgZXh0ZW5kcyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgewotCXByaXZhdGUgSVNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uOwotCXByaXZhdGUgaW50IGFjdGl2ZVBhZ2UgPSAtMTsKLQotCXB1YmxpYyBQcm9jZXNzRWRpdG9ySW5wdXQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhY3RpdmUgcGFnZSBvZiB0aGUgZWRpdG9yCi0JICovCi0JcHVibGljIGludCBnZXRBY3RpdmVQYWdlKCkgewotCQlyZXR1cm4gYWN0aXZlUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYWN0aXZlIHBhZ2UgZm9yIHRoZSBlZGl0b3IKLQkgKiBAcGFyYW0gYWN0aXZlUGFnZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhZ2UoaW50IGFjdGl2ZVBhZ2UpIHsKLQkJdGhpcy5hY3RpdmVQYWdlID0gYWN0aXZlUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gaW5pdGlhbCBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICogCQkJU2VsZWN0aW9uCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0SW5pdGlhbFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGluaXRpYWxTZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogU2V0IGluaXRpYWwgc2VsZWN0aW9uIAotCSAqIEBwYXJhbSBpbml0aWFsU2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihJU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb24pIHsKLQkJdGhpcy5pbml0aWFsU2VsZWN0aW9uID0gaW5pdGlhbFNlbGVjdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyNzI1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgbWV0aG9kLCBwcm9jZXNzIGFuZCBhY3Rpdml0eSBkaWFncmFtIGVkaXRvcnMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0Fic3RyYWN0QmFzZUZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0Fic3RyYWN0QmFzZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWIyMzRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BYnN0cmFjdEJhc2VGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVySGVscGVyOwotCi0vKioKLSAqIFRoZSBiYXNlIGNsYXNzIGZvciBVSSBmaWx0ZXJzLiBTdXBwb3J0cyBtdWx0aXBsZSBmaWx0ZXJzLgotICogU3VwcG9ydCBmaWx0ZXJpbmcgdGhlIGVsZW1lbnQgYmFzZWQgb24gdGhlIHBhdHRlcm4gYW5kIHR5cGUuIAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdEJhc2VGaWx0ZXIgewotCi0JcHJvdGVjdGVkIEZpbHRlckhlbHBlciBoZWxwZXI7Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlcltdIGFkZGl0aW9uYWxGaWx0ZXJzID0gbnVsbDsKLQotCS8qKgotCSAqIGFkZGVkIGZvciBmdXRoZXIgZmlsdGVyaW5nLiBGb3IgZXhhbXBsZSwgd2UgbWF5IHNldCBhIGZpbGVyIHRvIHByZXZlbnQKLQkgKiBnZW5lcmFsaXplcnMgYXMgYmFzZSBlbGVtZW50IHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3kKLQkgKiAKLQkgKiBAcGFyYW0gYWRkaXRpb25hbEZpbHRlcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsRmlsdGVycyhJRmlsdGVyW10gYWRkaXRpb25hbEZpbHRlcnMpIHsKLQkJdGhpcy5hZGRpdGlvbmFsRmlsdGVycyA9IGFkZGl0aW9uYWxGaWx0ZXJzOwotCX0KLQotCXB1YmxpYyBGaWx0ZXJIZWxwZXIgZ2V0SGVscGVyKCkgewotCQlyZXR1cm4gaGVscGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhlbHBlcihGaWx0ZXJIZWxwZXIgaGVscGVyKSB7Ci0JCXRoaXMuaGVscGVyID0gaGVscGVyOwotCX0KLQotCS8qCi0JICogc3ViY2xhc3MgbWV0aG9kIHNob3VsZCBjYWxsIHRoaXMgYmVmb3JlIHJldHVybmluZyB0cnVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0KLQkJLy8gSmluaHVhIFhpLCBhZGRlZCBmb3IgZnV0aGVyIGZpbHRlcmluZy4KLQkJLy8gRm9yIGV4YW1wbGUsIHdlIG1heSBzZXQgYSBmaWxlciB0byBwcmV2ZW50IGdlbmVyYWxpemVycyBhcyBiYXNlCi0JCS8vIGVsZW1lbnQgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeQotCQlpZiAoYWRkaXRpb25hbEZpbHRlcnMgIT0gbnVsbCAmJiBhZGRpdGlvbmFsRmlsdGVycy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFkZGl0aW9uYWxGaWx0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGFkZGl0aW9uYWxGaWx0ZXJzW2ldLmFjY2VwdChvYmopID09IGZhbHNlKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BY3Rpdml0eVZhcmlhYmlsaXR5RmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWN0aXZpdHlWYXJpYWJpbGl0eUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmJkZTU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BY3Rpdml0eVZhcmlhYmlsaXR5RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5Qcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci0KLS8qKgotICogQWN0aXZpdHkgdmFyaWFiaWxpdHkgZmlsdGVyCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5VmFyaWFiaWxpdHlGaWx0ZXIgZXh0ZW5kcyBFeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IgewotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eSA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBMaXN0IHRyZWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTGlzdCBnZW5lcmFsaXplcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBMaXN0IGJhc2VlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIExpc3QgYmFkZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgQWN0aXZpdHlWYXJpYWJpbGl0eUZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCVRhYmxlVmlld2VyIHZpZXdlciwgU3RyaW5nIHRhYk5hbWUsIEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCXN1cGVyKGNvbmZpZywgdmlld2VyKTsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCQkKLQkJLy8gbG9hZCB0aGUgcGFyZW50bGlzdAotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJRmlsdGVyVXRpbC5nZXRTdWJUcmVlKGFkYXB0ZXIsIGFjdGl2aXR5LCB0cmVlTGlzdCk7Ci0JCUZpbHRlclV0aWwuZ2V0R2VuZXJhbGl6ZXJzKHRyZWVMaXN0LCBnZW5lcmFsaXplcnMpOwotCQlGaWx0ZXJVdGlsLmdldFZhcmlhYmlsaXR5QmFzZSh0cmVlTGlzdCwgYmFzZWVsZW1lbnRzKTsKLQkJCi0JCUZpbHRlclV0aWwuZ2V0U3ViVHJlZShhZGFwdGVyLCBnZW5lcmFsaXplcnMsIGJhZGVsZW1lbnRzKTsKLQkJRmlsdGVyVXRpbC5nZXRTdWJUcmVlKGFkYXB0ZXIsIGJhc2VlbGVtZW50cywgYmFkZWxlbWVudHMpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCWlmICghc3VwZXIuYWNjZXB0KG9iaikpIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGNoaWxkQWNjZXB0KG9iaik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiB0cnVlOwotCi0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgfHwgb2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCWlmICgob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpKXsKLQkJCQlpZih0aGlzLmFjdGl2aXR5LmVxdWFscygoQWN0aXZpdHkpIG9iaikpIAotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoKEFjdGl2aXR5KW9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmKGUgIT0gbnVsbCAmJiBhY3Rpdml0eS5lcXVhbHMoZSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJUHJvY2VzcyBzcmNQcm9jID0gVG5nVXRpbAotCQkJCQkJLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIG9iaik7Ci0JCQkJUHJvY2VzcyB0YXJnZXRQcm9jID0gVG5nVXRpbAotCQkJCQkJLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIHRoaXMuYWN0aXZpdHkpOwotCQkJCWlmIChzcmNQcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzCi0JCQkJCQkmJiB0YXJnZXRQcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlmKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQlpZihUbmdVdGlsLmNvbnRhaW5zKGdlbmVyYWxpemVycywgb2JqKSAKLQkJCQkvL0NvbW1lbnQgdGhpcyBvdXQgZHVlIHRvIDE4MjUzMSwgb3RoZXIgY2FzZXMgbWlzc2luZyB0aGlzIGNoZWNrIGhlcmUKLQkJCQkvL3Nob3VsZCBiZSBjb21wZW5zYXRlZCBieSBjaXJjdWxhciBjaGVjayBhZnRlciBmaWx0ZXIgc2VsZWN0aW9uLgotCQkJCS8vQmV0dGVyIGZpeCBpcyB0byBpbmNsdWRlIHRoZSBjaXJjdWxhciBjaGVjayBpbnRvIHRoZSBmaWx0ZXIgbG9naWMuCQkKLQkJCQkvLyB8fCBUbmdVdGlsLmNvbnRhaW5zKGJhc2VlbGVtZW50cywgb2JqKQkJCQkJCQotCQkJCS8vCQl8fFRuZ1V0aWwuY29udGFpbnMoYmFkZWxlbWVudHMsIG9iaikKLQkJCQkJCSl7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLS8vCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLS8vCQkJCVByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSBvYmo7Ci0vLwkJCQlpZiAocHJvYy5lcXVhbHMoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHRoaXMuYWN0aXZpdHkpKSkKLS8vCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCX0KLS8vCQkJaWYob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpewotLy8JCQkJaWYoVG5nVXRpbC5jb250YWlucyhjb250cmlidXRvcnMsIG9iaikpIHJldHVybiBmYWxzZTsKLS8vCQkJCWlmKFRuZ1V0aWwuY29udGFpbnModmFyaWFiaWxpdHliYXNlcywgb2JqKSkgcmV0dXJuIGZhbHNlOwotLy8JCQkJaWYob2JqLmVxdWFscyhGaWx0ZXJVdGlsLmdldFBhcmVudEFjdGl2aXR5KFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIAotLy8JCQkJCQlhY3Rpdml0eSkpKSByZXR1cm4gZmFsc2U7Ci0vLwkJCX0KLQkJCQotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BZGRMaW5rRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWRkTGlua0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZThmMDRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BZGRMaW5rRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkNvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLlBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi0vKioKLSAqIEZpbHRlciBmb3IgQWRkTGluayBpbiBSaWNoVGV4dEVkaXRvci4KLSAqIAotICovCi0KLXB1YmxpYyBjbGFzcyBBZGRMaW5rRmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RCYXNlRmlsdGVyIGltcGxlbWVudHMgSUFsbEZpbHRlciB7Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkKLQkJLy8gaWYgY2FuJ3QgYmUgYWNjZGVwdGVkIGJ5IHN1cGVyLCByZXR1cm4uCi0JCWlmKG9iaiA9PSBudWxsIClyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAoIXN1cGVyLmFjY2VwdChvYmopKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlTdHJpbmcgZmlsdGVyVHlwZVN0cmluZyA9IGhlbHBlci5nZXRGaWx0ZXJUeXBlU3RyKCk7Ci0JCU9iamVjdCBjb250ZW50RWxlbWVudCA9IGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpOwotCi0JCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpICE9IG51bGwpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMoCi0JCQkJCQkoKFByb2Nlc3NDb21wb25lbnQpIG9iaikuZ2V0UHJvY2VzcygpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucyhvYmopKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbAotCQkJCSYmICEob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCB8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSkgewotCQkJaWYgKG9iai5lcXVhbHMoaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChmaWx0ZXJUeXBlU3RyaW5nID09IG51bGwKLQkJCQl8fCBmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTKQotCQkJCXx8IGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5NRVRIT19QTFVHSU5TKSkgewotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlpZiAoVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaikpIHsKLQkJCQkJaWYgKCgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaikuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJCQkJLmlzRW1wdHkoKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGlvciA9IGxpc3QuaXRlcmF0b3IoKTsgaW9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iamVjdCA9IGlvci5uZXh0KCk7Ci0JCQkJCWlmICgoKENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmplY3QpCi0JCQkJCQkJLmdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpKQotCQkJCQkJaW9yLnJlbW92ZSgpOwotCQkJCX0KLQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChjaGlsZEFjY2VwdChvYmopKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBhY2NlcHRDYXRlZ29yaWVzR3JvdXAob2JqLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSB7Ci0JCQkJcmV0dXJuICEoKERpc2NpcGxpbmVHcm91cGluZykgb2JqKS5nZXREaXNjaXBsaW5lcygpLmlzRW1wdHkoKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ly8gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZUdyb3VwcygoRGlzY2lwbGluZSlvYmopLmlzRW1wdHkoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKG9iaiwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpIHsKLQkJCQlyZXR1cm4gISgoUm9sZVNldEdyb3VwaW5nKSBvYmopLmdldFJvbGVTZXRzKCkuaXNFbXB0eSgpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsvLyBBc3NvY2lhdGlvbkhlbHBlci5nZXRSb2xlU2V0R3JvdXBzKChSb2xlU2V0KW9iaikuaXNFbXB0eSgpOwotCQkJfQotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFRZUEVTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCi0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuRE9NQUlOUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBhY2NlcHRDYXRlZ29yaWVzR3JvdXAob2JqLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBEb21haW4pCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlRPT0xTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVG9vbHNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUb29sKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ST0xFUykpIHsgCi0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlRBU0tTKSkgeyAKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVGFzaykKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTKSkgeyAKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFKSkgeyAKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQ0hFQ0tMSVNUUykpIHsgLy8xNzI5NTYKLQkJCQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ2hlY2tsaXN0KQotCQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkNPTkNFUFRTKSkgewotCQkJCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb25jZXB0KQotCQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkVYQU1QTEVTKSkgewotCQkJCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBFeGFtcGxlKQotCQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkdVSURFTElORVMpKSB7Ci0JCQkKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRlbGluZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfWVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5DT05DRVBUUykpIHsKLQkJCQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29uY2VwdCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfWVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5FU1RJTUFURV9DT05TSURFUkFUSU9OUykpIHsKLQkJCQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKQotCQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlBSQUNUSUNFUykpIHsKLQkJCQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJhY3RpY2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUkVQT1JUUykpIHsKLQkJCQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUmVwb3J0KQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5SRVVTQUJMRV9BU1NFVFMpKSB7Ci0JCQkKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlJPQURNQVApKSB7Ci0JCQkKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvYWRtYXApCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTKSkgewotCQkJCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlRFTVBMQVRFUykpIHsKLQkJCQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVGVtcGxhdGUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlRFUk1fREVGSU5JVElPTlMpKSB7Ci0JCQkKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5UT09MX01FTlRPUlMpKSB7Ci0JCQkKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLldISVRFX1BBUEVSUykpIHsKLQkJCQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV2hpdGVwYXBlcikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQ09OVEVOVF9QQUNLQUdFUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlIHx8IG9iaiBpbnN0YW5jZW9mIFRhc2sKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QgfHwgb2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkgcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlBST0NFU1NFUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGlvciA9IGxpc3QuaXRlcmF0b3IoKTsgaW9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iamVjdCA9IGlvci5uZXh0KCk7Ci0JCQkJCWlmICgoKENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmplY3QpCi0JCQkJCQkJLmdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpKQotCQkJCQkJaW9yLnJlbW92ZSgpOwotCQkJCX0KLQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdENhdGVnb3JpZXNHcm91cChPYmplY3Qgb2JqLCBTdHJpbmcgdHlwZSkgewotCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCS5nZXRDaGlsZHJlbihvYmopOwotCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmICgoKENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VGV4dChvYmopLmVxdWFscygKLQkJCQkJdHlwZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWxsRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWxsRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYmFhMWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0FsbEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5DdXN0b21DYXRlZ29yeUFzc2lnblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkNhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklBbGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5Qcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBGaWx0ZXIgZm9yIGFsbCBlbGVtZW50cyBlZzogdXNlZCBpbiB7QGxpbmsgQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlfSAKLSAqIAotICogQGF1dGhvciBMb2thbmF0aCBKYWdnYQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxGaWx0ZXIgZXh0ZW5kcyBBYnN0cmFjdEJhc2VGaWx0ZXIgaW1wbGVtZW50cyBJQWxsRmlsdGVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUFsbEZpbHRlciNnZXRPYmplY3QoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYob2JqID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIGlmIGNhbid0IGJlIGFjY2RlcHRlZCBieSBzdXBlciwgcmV0dXJuLgotCQlpZiAoIXN1cGVyLmFjY2VwdChvYmopKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlTdHJpbmcgZmlsdGVyVHlwZVN0cmluZyA9IGhlbHBlci5nZXRGaWx0ZXJUeXBlU3RyKCk7Ci0JCU9iamVjdCBjb250ZW50RWxlbWVudCA9IGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpOwotCi0JCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpICE9IG51bGwpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMoCi0JCQkJCQkoKFByb2Nlc3NDb21wb25lbnQpIG9iaikuZ2V0UHJvY2VzcygpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucyhvYmopKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbAotCQkJCSYmICEob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCB8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSkgewotCQkJaWYob2JqID09IG51bGwpewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqLmVxdWFscyhoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGZpbHRlclR5cGVTdHJpbmcgPT0gbnVsbAotCQkJCXx8IGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFMpCi0JCQkJfHwgZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLk1FVEhPX1BMVUdJTlMpCi0JCQkJfHwgZmlsdGVyVHlwZVN0cmluZwotCQkJCQkJLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuT05MWV9DT05URU5UX0VMRU1FTlRTKSkgewotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlpZiAoVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaikpIHsKLQkJCQkJaWYgKCgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaikuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJCQkJLmlzRW1wdHkoKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKSByZXR1cm4gZmFsc2U7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoTWV0aG9kRWxlbWVudFV0aWwuZ2V0QWxsTW9kZWxzKGNvbnRlbnRFbGVtZW50KQotCQkJCQkJCQkuY29udGFpbnMob2JqKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGlvciA9IGxpc3QuaXRlcmF0b3IoKTsgaW9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iamVjdCA9IGlvci5uZXh0KCk7Ci0JCQkJCWlmICgoKENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmplY3QpCi0JCQkJCQkJLmdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpKQotCQkJCQkJaW9yLnJlbW92ZSgpOwotCQkJCX0KLQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlpZiAoY2hpbGRBY2NlcHQob2JqKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCS8vCQkKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpIHsKLQkJCQlyZXR1cm4gISgoRGlzY2lwbGluZUdyb3VwaW5nKSBvYmopLmdldERpc2NpcGxpbmVzKCkuaXNFbXB0eSgpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsvLyBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lR3JvdXBzKChEaXNjaXBsaW5lKW9iaikuaXNFbXB0eSgpOwotCQkJfQotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ST0xFU0VUUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKG9iaiwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpIHsKLQkJCQlyZXR1cm4gISgoUm9sZVNldEdyb3VwaW5nKSBvYmopLmdldFJvbGVTZXRzKCkuaXNFbXB0eSgpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsvLyBBc3NvY2lhdGlvbkhlbHBlci5nZXRSb2xlU2V0R3JvdXBzKChSb2xlU2V0KW9iaikuaXNFbXB0eSgpOwotCQkJfQotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFRZUEVTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBhY2NlcHRDYXRlZ29yaWVzR3JvdXAob2JqLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRG9tYWluc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERvbWFpbikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuVE9PTFMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVG9vbHNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUb29sKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ST0xFUykpIHsgCi0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5UQVNLUykpIHsgCi0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFMpKSB7IAotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFKSkgeyAKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5DSEVDS0xJU1RTKSkgeyAvLzE3Mjk1NgotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDaGVja2xpc3QpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQ09OQ0VQVFMpKSB7Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbmNlcHQpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkVYQU1QTEVTKSkgewotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBFeGFtcGxlKQotCQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkdVSURFTElORVMpKSB7Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRlbGluZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfWVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5DT05DRVBUUykpIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29uY2VwdCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfWVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5FU1RJTUFURV9DT05TSURFUkFUSU9OUykpIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKQotCQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlBSQUNUSUNFUykpIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJhY3RpY2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUkVQT1JUUykpIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUmVwb3J0KQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5SRVVTQUJMRV9BU1NFVFMpKSB7Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlJPQURNQVApKSB7Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvYWRtYXApCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTKSkgewotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlRFTVBMQVRFUykpIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVGVtcGxhdGUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlRFUk1fREVGSU5JVElPTlMpKSB7Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5UT09MX01FTlRPUlMpKSB7Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLldISVRFX1BBUEVSUykpIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV2hpdGVwYXBlcikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQ09OVEVOVF9QQUNLQUdFUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZSB8fCBvYmogaW5zdGFuY2VvZiBUYXNrCi0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0IHx8IG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKQotCQkJCXJldHVybiB0cnVlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUFJPQ0VTU0VTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGlvciA9IGxpc3QuaXRlcmF0b3IoKTsgaW9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iamVjdCA9IGlvci5uZXh0KCk7Ci0JCQkJCWlmICgoKENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmplY3QpCi0JCQkJCQkJLmdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpKQotCQkJCQkJaW9yLnJlbW92ZSgpOwotCQkJCX0KLQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpCi0JCQkJLy9yZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gY2hpbGRBY2NlcHQob2JqKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYob2JqIGluc3RhbmNlb2YgTWlsZXN0b25lKSByZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vIHB1YmxpYyBGaWx0ZXJIZWxwZXIgZ2V0SGVscGVyKCkgewotCS8vIHJldHVybiBoZWxwZXI7Ci0JLy8gfQotCS8vCi0JLy8JCi0JLy8gcHVibGljIHZvaWQgc2V0SGVscGVyKEZpbHRlckhlbHBlciBoZWxwZXIpIHsKLQkvLyB0aGlzLmhlbHBlciA9IGhlbHBlcjsKLQkvLyB9Ci0JcHJvdGVjdGVkIExpc3QgZ2V0QW5jZXN0b3JzKEN1c3RvbUNhdGVnb3J5IG1ldGhvZE9iamVjdCkgewotCQlMaXN0IGFuY2VzdG9yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlMaXN0IG9iakxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCW9iakxpc3QuYWRkKG1ldGhvZE9iamVjdCk7Ci0KLQkJZ2V0QW5jZXN0b3JzKGFuY2VzdG9yTGlzdCwgb2JqTGlzdCk7Ci0KLQkJcmV0dXJuIGFuY2VzdG9yTGlzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRBbmNlc3RvcnMoTGlzdCBhbmNlc3Rvckxpc3QsIExpc3QgbWV0aG9kT2JqZWN0TGlzdCkgewotCQlpZiAobWV0aG9kT2JqZWN0TGlzdC5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gYW5jZXN0b3JMaXN0OwotCi0JCUxpc3QgYWxsUGFyZW50Q3VzdENhdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbWV0aG9kT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUN1c3RvbUNhdGVnb3J5IGVsZW1lbnQgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0ZXIubmV4dCgpOwotCQkJTGlzdCBwYXJlbnRMaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhlbGVtZW50KTsKLQkJCWFsbFBhcmVudEN1c3RDYXRzLmFkZEFsbChwYXJlbnRMaXN0KTsKLQotCQl9Ci0KLQkJYW5jZXN0b3JMaXN0LmFkZEFsbChtZXRob2RPYmplY3RMaXN0KTsKLQkJTGlzdCBuZXh0Q2hlY2tMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbGxQYXJlbnRDdXN0Q2F0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIWFuY2VzdG9yTGlzdC5jb250YWlucyhlbGVtZW50KSkKLQkJCQluZXh0Q2hlY2tMaXN0LmFkZChlbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBnZXRBbmNlc3RvcnMoYW5jZXN0b3JMaXN0LCBuZXh0Q2hlY2tMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRNZXRob2RQbHVnaW4oT2JqZWN0IG9iaiwgT2JqZWN0IGNvbnRlbnRFbGVtZW50KSB7Ci0JCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAoTWV0aG9kRWxlbWVudFV0aWwuZ2V0QWxsTW9kZWxzKGNvbnRlbnRFbGVtZW50KS5jb250YWlucyhvYmopKQotCQkJCXJldHVybiB0cnVlOwotCQkJZWxzZQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKE9iamVjdCBvYmosIFN0cmluZyB0eXBlKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQlDb2xsZWN0aW9uIGxpc3QgPSAoKENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKCgoQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgb2JqKS5nZXRUZXh0KG9iaikuZXF1YWxzKAotCQkJCQl0eXBlKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQ2F0ZWdvcnlGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9DYXRlZ29yeUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2Y4Y2EwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9DYXRlZ29yeUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotCi0vKioKLSAqIEZpbHRlciBmb3Ige0BsaW5rIENvbnRlbnRDYXRlZ29yeX0KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeUZpbHRlciBleHRlbmRzIEFic3RyYWN0QmFzZUZpbHRlciBpbXBsZW1lbnRzCi0JCUlDYXRlZ29yeUZpbHRlciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDYXRlZ29yeUZpbHRlciNnZXRDYXRlZ29yeVBhY2thZ2VQYXRoKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q2F0ZWdvcnlQYWNrYWdlUGF0aCgpIHsKLQkJcmV0dXJuIGhlbHBlci5nZXRQYXRoQmFzZWRPblRhYlN0cmluZyhoZWxwZXIuZ2V0Q29udGVudENhdGVnb3J5VGFiU3RyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUNhdGVnb3J5RmlsdGVyI2dldE9iamVjdCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJLy8gaWYgY2FuJ3QgYmUgYWNjZGVwdGVkIGJ5IHN1cGVyLCByZXR1cm4uCi0JCWlmICghc3VwZXIuYWNjZXB0KG9iaikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmICghaGVscGVyLmNoZWNrT2JqZWN0QWNjZXB0ZWQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlyZXR1cm4gaGVscGVyLmFjY2VwdE1ldGhvZFBsdWdpbihvYmopOwotCQl9Ci0JCWlmIChjaGlsZEFjY2VwdChvYmopKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQ29udGVudEZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0NvbnRlbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ2OTA0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQ29udGVudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQ29udGVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0KLS8qKgotICogRmlsdGVyIGltcGxlbWVudHMge0BsaW5rIElDb250ZW50RmlsdGVyfS4gRmlsdGVyIGNvbnRlbnQgZWxlbWVudCBpbiBjb250ZW50IHBhY2thZ2UuIAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RCYXNlRmlsdGVyIGltcGxlbWVudHMgSUNvbnRlbnRGaWx0ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQ29udGVudEZpbHRlciNnZXRDb250ZW50UGFja2FnZVBhdGgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb250ZW50UGFja2FnZVBhdGgoKSB7Ci0JCXJldHVybiBoZWxwZXIuZ2V0UGF0aEJhc2VkT25UYWJTdHJpbmcoaGVscGVyLmdldFRhYlN0cigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDb250ZW50RmlsdGVyI2dldE9iamVjdCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJLy8gaWYgY2FuJ3QgYmUgYWNjZGVwdGVkIGJ5IHN1cGVyLCByZXR1cm4uCi0JCWlmICghc3VwZXIuYWNjZXB0KG9iaikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGZ1cnRoZXIgZmlsdGVyaW5nCi0JCWlmICghaGVscGVyLmNoZWNrT2JqZWN0QWNjZXB0ZWQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlyZXR1cm4gaGVscGVyLmFjY2VwdE1ldGhvZFBsdWdpbihvYmopOwotCQl9Ci0KLQkJaWYgKGNoaWxkQWNjZXB0KG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCXJldHVybiBoZWxwZXIuYWNjZXB0Q29udGVudFBhY2thZ2Uob2JqKTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9DdXN0b21DYXRlZ29yeUZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0N1c3RvbUNhdGVnb3J5RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NTQwZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0N1c3RvbUNhdGVnb3J5RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDdXN0b21GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotCi0vKioKLSAqIEZpbHRlciBzcGVjaWZpYyBmb3Ige0BsaW5rIEN1c3RvbUNhdGVnb3J5fSBlbGVtZW50cy4gCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXIgZXh0ZW5kcyBBYnN0cmFjdEJhc2VGaWx0ZXIgaW1wbGVtZW50cwotCQlJQ3VzdG9tRmlsdGVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUN1c3RvbUZpbHRlciNnZXRDb250ZW50UGFja2FnZVBhdGgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb250ZW50UGFja2FnZVBhdGgoKSB7Ci0JCXJldHVybiBoZWxwZXIuZ2V0UGF0aEJhc2VkT25UYWJTdHJpbmcoaGVscGVyLmdldFRhYlN0cigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDdXN0b21GaWx0ZXIjZ2V0T2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkJcmV0dXJuIGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUN1c3RvbUZpbHRlciNnZXRTdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJLy8gaWYgY2FuJ3QgYmUgYWNjZGVwdGVkIGJ5IHN1cGVyLCByZXR1cm4uCi0JCWlmICghc3VwZXIuYWNjZXB0KG9iaikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmICghaGVscGVyLmNoZWNrT2JqZWN0QWNjZXB0ZWQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlyZXR1cm4gaGVscGVyLmFjY2VwdE1ldGhvZFBsdWdpbihvYmopOwotCQl9Ci0KLQkJaWYgKGNoaWxkQWNjZXB0KG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9EZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTFmNzYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9EZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotCi0vKioKLSAqICBNZXRob2QgY29uZmlndXJhdGlvbiBzcGVjaWZpYyBmaWx0ZXIgZm9yIGZpbHRlcmluZyBlbGVtZW50cyBiYXNlZCBvbiBmaWx0ZXIgcGF0dGVybgotICogIGFuZCB0eXBlIGFmdGVyIGVsZW1lbnRzIGFyZSByZWFsaXplZCB3aXRoaW4gdGhlIHNwZWNpZmllZCBjb25maWd1cmFpdG9uLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyIGV4dGVuZHMgQ29uZmlndXJhdGlvbkZpbHRlciB7Ci0KLQlTdHJpbmcgZmlsdGVyU3RyOwotCi0JTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWd1cmF0aW9uOwotCi0JcHJvdGVjdGVkIEZpbHRlckhlbHBlciBoZWxwZXI7Ci0KLQlwcm90ZWN0ZWQgVmlld2VyIHZpZXdlcjsKLQkKLQkvKioKLQkgKiBAcGFyYW0gbWV0aG9kQ29uZmlnCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyBEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywKLQkJCVZpZXdlciB2aWV3ZXIsIFN0cmluZyBmaWx0ZXJTdHIpIHsKLQkJc3VwZXIobWV0aG9kQ29uZmlnKTsKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JCXRoaXMuZmlsdGVyU3RyID0gZmlsdGVyU3RyOwotCQl0aGlzLm1ldGhvZENvbmZpZ3VyYXRpb24gPSBtZXRob2RDb25maWc7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmICh2aWV3ZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlyZXR1cm4gbWV0aG9kQ29uZmlndXJhdGlvbi5lcXVhbHMob2JqKTsKLQkJfQotCi0JCWlmICghc3VwZXIuYWNjZXB0KG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmKGhlbHBlciAhPSBudWxsKSB7Ci0JCQlpZiAoaGVscGVyLmlzU2hvd1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybk9uUHJlc2VudGF0aW9uTmFtZShvYmopKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybihvYmopKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoIWhlbHBlci5pc09iamVjdEluU2VsZWN0ZWRJdGVtcyhvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoY2hpbGRBY2NlcHQob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0KLQl9Ci0KLQlwdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iaiwKLQkJCW9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlKSB7Ci0JCS8vIHJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmosIGNoaWxkRmVhdHVyZSk7Ci0JCS8vIE1vZGlmaWVkIGNvZGUgdG8gaGFuZGxlIHRoZSBmaWx0ZXJpbmcKLQkJLy8gdG8gY2hlY2sgaWYgdGhlIHZhcmlhYmlsaXR5IG9mIHBhcmVudCBpcyBub3QgTi9BLCBmaWx0ZXIgb3V0IGFscmVhZHkKLQkJLy8gZXhpc2l0bmcKLQkJLy8gZWxlbWVudCBmcm9tIGNoaWxkcmVuIGxpc3QuCi0JCUNvbGxlY3Rpb24gY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqLCBjaGlsZEZlYXR1cmUpOwotCQlpZihjb2wgIT0gbnVsbCl7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGNvbC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAoIWFjY2VwdChlbGVtZW50KSkKLQkJCQlpdG9yLnJlbW92ZSgpOwotCQl9Ci0JCX1lbHNlewotCQkJY29sID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCi0JCXJldHVybiBjb2w7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SGVscGVyKEZpbHRlckhlbHBlciBoZWxwZXIpIHsKLQkJdGhpcy5oZWxwZXIgPSBoZWxwZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpCi0JewotCQlzdXBlci5zZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCXRoaXMubWV0aG9kQ29uZmlndXJhdGlvbiA9IGNvbmZpZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9EZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0Rlc2NyaXB0b3JQcm9jZXNzRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YTIwNmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0Rlc2NyaXB0b3JQcm9jZXNzRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSVByb2Nlc3NGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci0KLQotLyoqCi0gKiB7QGxpbmsgUHJvY2Vzc30gZmlsdGVyIGZvciBmaWx0ZXJpbmcge0BsaW5rIFByb2Nlc3N9IGVsZW1lbnRzLiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXIgZXh0ZW5kcyBBYnN0cmFjdEJhc2VGaWx0ZXIgaW1wbGVtZW50cwotCQlJUHJvY2Vzc0ZpbHRlciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklGaWx0ZXIjZ2V0T2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkJcmV0dXJuIGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlciNhY2NlcHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyBpZiBjYW4ndCBiZSBhY2NkZXB0ZWQgYnkgc3VwZXIsIHJldHVybi4KLQkJaWYgKCFzdXBlci5hY2NlcHQob2JqKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCFoZWxwZXIuaXNPYmplY3RJblNlbGVjdGVkSXRlbXMob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFtYXRjaFBhdHRlcm4ob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGNoaWxkQWNjZXB0KG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hQYXR0ZXJuKE9iamVjdCBvYmopIHsKLQkJLy8gaWYgbm8gdmFsaWQgZmlsdGVyIHR5cGUgb3IgcGF0dGVybiwgYWx3YXlzIHJldHVybiB0cnVlCi0JCVN0cmluZyBmaWx0ZXJUeXBlU3RyID0gaGVscGVyLmdldEZpbHRlclR5cGVTdHIoKTsKLQkJLy8gU3RyaW5nIHBhdHRlcm4gPSBoZWxwZXIuZ2V0UGF0dGVybigpOwotCQlTdHJpbmcgdGFiU3RyID0gaGVscGVyLmdldFRhYlN0cigpOwotCQlQYXR0ZXJuIHJlZ2V4UGF0dGVybiA9IGhlbHBlci5nZXRSZWdleFBhdHRlcm4oKTsKLQkJaWYgKGhlbHBlci5nZXRGaWx0ZXJUeXBlU3RyKCkgPT0gbnVsbCB8fCBoZWxwZXIuZ2V0UGF0dGVybigpID09IG51bGwKLQkJCQl8fCBoZWxwZXIuZ2V0UGF0dGVybigpLmVxdWFsc0lnbm9yZUNhc2UoIiIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAoZmlsdGVyVHlwZVN0ci5lcXVhbHNJZ25vcmVDYXNlKHRhYlN0cikpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlNYXRjaGVyIG0gPSByZWdleFBhdHRlcm4ubWF0Y2hlcigoKEJyZWFrZG93bkVsZW1lbnQpIG9iaikKLQkJCQkJCS5nZXROYW1lKCkpOwotCQkJCWJvb2xlYW4gZm91bmQgPSBtLm1hdGNoZXMoKTsKLQkJCQlpZiAoZm91bmQpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBlbHNlIGZvciBhbGwgb3RoZXIgdHlwZXMgb2YgZWxlbWVudHMKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlCi0JCQkvLyB0aGUgQWxsIGNhc2UKLQkJCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdldEFjdGl2aXRpZXNJblNjb3BlKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50LCBMaXN0IGFjdGl2aXR5TGlzdCkgewotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCWFjdGl2aXR5TGlzdC5hZGQocGFyZW50KTsKLQkJCWdldEFjdGl2aXRpZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCAoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50LAotCQkJCQlhY3Rpdml0eUxpc3QpOwotCQl9Ci0JfQotCXB1YmxpYyBEZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFByb2Nlc3NDb25maWd1cmF0b3IoY29uZmlnKSB9KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9FeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9FeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlhMjY0NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvRXhQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZmlsdGVyIHRoYXQgc3RpbGwgc2hvd3MgY2VydGFpbiBlbGVtZW50cyBkdXJpbmcgcHJvY2VzcyBhdXRob3JpbmcgdGhhdAotICogUHJvY2Vzc0NvbmZpZ3VyYXRvciBkb2VzIG5vdCBzaG93LiBGaWx0ZXIgZWxlbWVudHMgYmFzZWQgb24gc2VhcmNoIHBhdHRlcm4gYW5kIHR5cGUuCi0gKiBAYXV0aG9yIHNrYW5ub29yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRXhQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yIGV4dGVuZHMKLQkJUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvciB7Ci0KLQlTdHJpbmcgZmlsdGVyU3RyOwotCi0JTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWd1cmF0aW9uOwotCVZpZXdlciB2aWV3ZXI7Ci0JCi0JcHJvdGVjdGVkIEZpbHRlckhlbHBlciBoZWxwZXI7Ci0JLyoqCi0JICogQHBhcmFtIG1ldGhvZENvbmZpZwotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgRXhQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yKE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLAotCQkJVmlld2VyIHZpZXdlcikgewotCQlzdXBlcihtZXRob2RDb25maWcpOwotCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQkJLy90aGlzLmZpbHRlclN0ciA9IGZpbHRlclN0cjsKLQkJdGhpcy5tZXRob2RDb25maWd1cmF0aW9uID0gbWV0aG9kQ29uZmlnOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmICh2aWV3ZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0KLQkJaWYob2JqID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlyZXR1cm4gbWV0aG9kQ29uZmlndXJhdGlvbi5lcXVhbHMob2JqKTsKLQkJfQotCi0vLwkJaWYgKCFzdXBlci5hY2NlcHQob2JqKSkKLS8vCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobWV0aG9kQ29uZmlnID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlvYmogPSBMaWJyYXJ5VXRpbC51bndyYXAob2JqKTsKLQotLy8JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0vLwkJCXJldHVybiBtZXRob2RDb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKG9iaik7Ci0vLwkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0vLwkJCXJldHVybiB0cnVlOwotLy8JCX0gZWxzZSB7Ci0vLwkJCWlmKExvZy5ERUJVRykgewotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCJPYmplY3QgZmlsdGVyZWQ6ICIgKyAob2JqID09IG51bGwgPyBudWxsIDogb2JqLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAotLy8JCQl9Ci0vLwkJfQotCQlpZiAoaGVscGVyLmlzU2hvd1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuT25QcmVzZW50YXRpb25OYW1lKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICghaGVscGVyLmlzT2JqZWN0SW5TZWxlY3RlZEl0ZW1zKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChjaGlsZEFjY2VwdChvYmopKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhlbHBlcihGaWx0ZXJIZWxwZXIgaGVscGVyKSB7Ci0JCXRoaXMuaGVscGVyID0gaGVscGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKQotCXsKLQkJc3VwZXIuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwotCQl0aGlzLm1ldGhvZENvbmZpZ3VyYXRpb24gPSBjb25maWc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0d1aWRhbmNlRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvR3VpZGFuY2VGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQzZDhiYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvR3VpZGFuY2VGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVySW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotCi0vKioKLSAqIEZpbHRlciBmb3Ige0BsaW5rIEd1aWRhbmNlfSB0eXBlIGVsZW1lbnRzLgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZUZpbHRlciBleHRlbmRzIENvbnRlbnRGaWx0ZXIgewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotLy8JCSBXaGVuIHR5cGUgaXMgc2VsZWN0ZWQgYWxsb3cgdGhvc2UgQ2xhc3MgdHlwZXMgdG8gZGlzcGxheS4KLQkJQ2xhc3MgY2xzID0gRmlsdGVySW5pdGlhbGl6ZXIuZ2V0SW5zdGFuY2UoKS4KLQkJCQkJCWdldENsYXNzRm9yVHlwZShoZWxwZXIuZ2V0RmlsdGVyVHlwZVN0cigpKTsKLQkJaWYoY2xzICE9IG51bGwpewotCQkJaWYoY2xzLmlzSW5zdGFuY2Uob2JqKSl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9ZWxzZXsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJLy8gRm9yIGFsbCBDb250ZW50RWxlbWVudCAtIHRoZXNlIGd1aWRhbmNlcyBhcmUgYXNzb2NpYXRlZAotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2hlY2tsaXN0IHx8IG9iaiBpbnN0YW5jZW9mIENvbmNlcHQKLQkJCQl8fCBvYmogaW5zdGFuY2VvZiBFeGFtcGxlIHx8IG9iaiBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbAotCQkJCXx8IG9iaiBpbnN0YW5jZW9mIEd1aWRlbGluZSB8fCBvYmogaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KQkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJLy8gRm9yIHRhc2sgZXh0cmEgZ3VpZGFuY2VzCi0JCWlmKGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpIGluc3RhbmNlb2YgVGFzayl7Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yIAotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gRm9yIHdvcmtQcm9kdWN0IEV4dHJhIGd1aWRhbmNlcy4KLQkJaWYoaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCl7Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBSZXBvcnQgfHwgb2JqIGluc3RhbmNlb2YgVGVtcGxhdGUKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvciAKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc0FjdGl2aXR5RmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc0FjdGl2aXR5RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTE1NzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NBY3Rpdml0eUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuSUFjdGlvblR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotCi0vKioKLSAqIEFjdGl2aXR5IEZpbHRlciBmb3IgZG9pbmcgUHJvY2VzcyBjb3B5L2V4dGVuZAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0FjdGl2aXR5RmlsdGVyIGV4dGVuZHMgRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIgewotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eSA9IG51bGw7Ci0KLQlwcml2YXRlIGludCBjb21tYW5kID0gMDsKLQotCXByaXZhdGUgQWN0aXZpdHlWYXJpYWJpbGl0eUZpbHRlciBkZWxlZ2F0ZUZpbHRlcjsKLQotCXB1YmxpYyBQcm9jZXNzQWN0aXZpdHlGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlUYWJsZVZpZXdlciB2aWV3ZXIsIFN0cmluZyB0YWJOYW1lLCBBY3Rpdml0eSBhY3Rpdml0eSwgaW50IGNvbW1hbmQpIHsKLQkJc3VwZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUpOwotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JCXRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0JCWRlbGVnYXRlRmlsdGVyID0gbmV3IEFjdGl2aXR5VmFyaWFiaWxpdHlGaWx0ZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUsIGFjdGl2aXR5KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkRlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyI3NldEhlbHBlcihvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckhlbHBlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIZWxwZXIoRmlsdGVySGVscGVyIGhlbHBlcikgewotCQlzdXBlci5zZXRIZWxwZXIoaGVscGVyKTsKLQkJZGVsZWdhdGVGaWx0ZXIuc2V0SGVscGVyKGhlbHBlcik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlciNhY2NlcHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyBhbnkgYWN0aXZpdHkgY2FuIGJlIGRlZXAtY29waWVkCi0JCS8vCi0JCWlmKGNvbW1hbmQgPT0gSUFjdGlvblR5cGVQcm92aWRlci5ERUVQX0NPUFkgJiYgCi0JCQkJKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuYWNjZXB0KG9iaik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiB0cnVlOwotCi0JCX0KLQkJCi0vLwkJaWYgKChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgfHwgb2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLS8vCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLS8vCQkJCS8vIGlmIHNvdXJjZSBhbmQgdGFnZXQgaXMgc2FtZSBwcm9jZXNzLCBibG9jayBpdAotLy8JCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBvYmopLmdldFByb2Nlc3MoKTsKLS8vCQkJCWlmICghKHRoaXMuY29tbWFuZCA9PSBJQWN0aW9uVHlwZVByb3ZpZGVyLkNPUFkpKSB7Ci0vLwkJCQkJaWYgKHByb2MuZXF1YWxzKHRoaXMuYWN0aXZpdHkpKQotLy8JCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLS8vCQkJCS8vIGlmIHNvdXJjZSBhbmQgdGFnZXQgaXMgc2FtZSBwcm9jZXNzLCBibG9jayBpdAotLy8JCQkJUHJvY2VzcyBwcm9jID0gKFByb2Nlc3MpIG9iajsKLS8vCQkJCWlmICghKHRoaXMuY29tbWFuZCA9PSBJQWN0aW9uVHlwZVByb3ZpZGVyLkNPUFkpKSB7Ci0vLwkJCQkJaWYgKHByb2MuZXF1YWxzKHRoaXMuYWN0aXZpdHkpKQotLy8JCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCi0vLwkJCWlmIChvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0vLwkJCQlQcm9jZXNzIHNyY1Byb2MgPSBUbmdVdGlsCi0vLwkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBvYmopOwotLy8JCQkJUHJvY2VzcyB0YXJnZXRQcm9jID0gVG5nVXRpbAotLy8JCQkJCQkuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgdGhpcy5hY3Rpdml0eSk7Ci0vLwkJCQlpZiAoc3JjUHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcwotLy8JCQkJCQkmJiB0YXJnZXRQcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLS8vCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLS8vCQkJCVByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSBvYmo7Ci0vLwkJCQlpZiAocHJvYy5lcXVhbHModGhpcy5hY3Rpdml0eSkpCi0vLwkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQl9Ci0vLwotLy8JCQlyZXR1cm4gdHJ1ZTsKLS8vCQl9IGVsc2UKLS8vCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgb2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCXN3aXRjaChjb21tYW5kKSB7Ci0JCQkJY2FzZSBJQWN0aW9uVHlwZVByb3ZpZGVyLkVYVEVORDoKLQkJCQkJcmV0dXJuIGRlbGVnYXRlRmlsdGVyLmFjY2VwdChvYmopOwotCQkJCWNhc2UgSUFjdGlvblR5cGVQcm92aWRlci5DT1BZOgotCQkJCQkvLyBkaXNhbGxvdyBjb3B5aW5nIGZyb20gZGVsaXZlcnkgcHJvY2VzcyB0byBjYXBhYmlsaXR5IHBhdHRlcm4KLQkJCQkJLy8KLQkJCQkJUHJvY2VzcyBzcmNQcm9jID0gbnVsbDsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCS8vIGlmIHNvdXJjZSBhbmQgdGFnZXQgaXMgc2FtZSBwcm9jZXNzLCBibG9jayBpdAotCQkJCQkJc3JjUHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqKS5nZXRQcm9jZXNzKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJQnJlYWtkb3duRWxlbWVudCBiZSA9IChCcmVha2Rvd25FbGVtZW50KSBvYmo7Ci0JCQkJCQlzcmNQcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGJlKTsKLQkJCQkJfQotCQkJCQlpZihzcmNQcm9jICE9IG51bGwpIHsKLQkJCQkJCVByb2Nlc3MgdGFyZ2V0UHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyh0aGlzLmFjdGl2aXR5KTsKLQkJCQkJCWlmIChzcmNQcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzCi0JCQkJCQkJCSYmIHRhcmdldFByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc0d1aWRhbmNlRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc0d1aWRhbmNlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZDRlNTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NHdWlkYW5jZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci0KLQotLyoqCi0gKiBHdWlkYW5jZSBGaWx0ZXIgZm9yIFdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZS4gCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NHdWlkYW5jZUZpbHRlciBleHRlbmRzIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyIHsKLQotCXB1YmxpYyBQcm9jZXNzR3VpZGFuY2VGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlUYWJsZVZpZXdlciB2aWV3ZXIsIFN0cmluZyB0YWJOYW1lKSB7Ci0JCXN1cGVyKGNvbmZpZywgdmlld2VyLCB0YWJOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gc3VwZXIuYWNjZXB0KG9iaik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlSXRlbVByb3ZpZGVyKSkgewotCQkJQ29sbGVjdGlvbiBjb2wgPSAoKEd1aWRhbmNlSXRlbVByb3ZpZGVyKSBvYmopLmdldENoaWxkcmVuKG9iaik7Ci0JCQlpZiAoY29sLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NSb2xlRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1JvbGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNiZWNhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1JvbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LlJvbGVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotCi0vKioKLSAqIEZpbHRlcnMge0BsaW5rIFJvbGVTZXR9LCB7QGxpbmsgUm9sZVNldEdyb3VwaW5nfSBpbiBzcGVjaWZpYyB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0KLSAqIGJhc2VkIG9uIHNlYXJjaCBwYXR0ZXJuLiAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUm9sZUZpbHRlciBleHRlbmRzIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyIHsKLQotCXB1YmxpYyBQcm9jZXNzUm9sZUZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgVGFibGVWaWV3ZXIgdmlld2VyLAotCQkJU3RyaW5nIHRhYk5hbWUpIHsKLQkJc3VwZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIHsKLQkJCWlmICgoKENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VGV4dChvYmopLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgUm9sZUl0ZW1Qcm92aWRlcikgfHwgKG9iaiBpbnN0YW5jZW9mIFJvbGUpCi0JCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIpKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlpZihvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpewotCQkJSXRlcmF0b3IgaXRlciA9IChUbmdVdGlsLmdldENvbnRyaWJ1dG9ycygoVmFyaWFiaWxpdHlFbGVtZW50KW9iaikpOwotCQkJaWYoaXRlciAhPSBudWxsKXsKLQkJCQl3aGlsZShpdGVyLmhhc05leHQoKSl7Ci0JCQkJCVJvbGVTZXRHcm91cGluZyBncm91cGluZyA9IChSb2xlU2V0R3JvdXBpbmcpaXRlci5uZXh0KCk7Ci0JCQkJCS8vIFRPRE8gOiBDaGVjayBmb3IgKHJlY3Vyc2l2ZSlSb2xlU2V0cyBpcyBlbXB0eSwgCi0JCQkJCS8vIGlmIHJvbGVzZXQncyByb2xlcyBhcmUgZW1wdHkgZG9ub3Qgc2hvdyBEaXNjaXBsaW5lIGdyb3VwaW5nIAotCQkJCQlpZighZ3JvdXBpbmcuZ2V0Um9sZVNldHMoKS5pc0VtcHR5KCkpIHJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCS8vIFRPRE8gOiBDaGVjayBmb3IgKHJlY3Vyc2l2ZSlSb2xlU2V0cyBpcyBlbXB0eSwgCi0JCQkvLyBpZiByb2xlc2V0J3Mgcm9sZXMgYXJlIGVtcHR5IGRvbm90IHNob3cgRGlzY2lwbGluZSBncm91cGluZyAKLQkJCXJldHVybiAhKChSb2xlU2V0R3JvdXBpbmcpb2JqKS5nZXRSb2xlU2V0cygpLmlzRW1wdHkoKTsKLQkJfQotCQlpZihvYmogaW5zdGFuY2VvZiBSb2xlU2V0KXsKLQkJCXJldHVybiAhKChSb2xlU2V0KW9iaikuZ2V0Um9sZXMoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzU3BlY2lmaWNXb3JrUHJvZHVjdEZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NTcGVjaWZpY1dvcmtQcm9kdWN0RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NWI5NzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NTcGVjaWZpY1dvcmtQcm9kdWN0RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotCi0KLS8qKgotICogRmlsdGVycyB7QGxpbmsgV29ya1Byb2R1Y3R9cyBiYXNlZCBvbiB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0gYW5kIHNlYXJjaCBwYXR0ZXJuLgotICogYW5kIHtAbGluayBXb3JrUHJvZHVjdFR5cGV9ICAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzU3BlY2lmaWNXb3JrUHJvZHVjdEZpbHRlciBleHRlbmRzIFByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlciB7Ci0KLQlDbGFzcyB3b3JrUHJvZHVjdFR5cGUgPSBudWxsOwotCi0JcHVibGljIFByb2Nlc3NTcGVjaWZpY1dvcmtQcm9kdWN0RmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJVGFibGVWaWV3ZXIgdmlld2VyLCBTdHJpbmcgdGFiTmFtZSwgQ2xhc3MgdHlwZSkgewotCQlzdXBlcihjb25maWcsIHZpZXdlciwgdGFiTmFtZSk7Ci0JCXRoaXMud29ya1Byb2R1Y3RUeXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChzdXBlci5jaGlsZEFjY2VwdChvYmopKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQlpZiAod29ya1Byb2R1Y3RUeXBlID09IG51bGwpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UgaWYgKG9iai5nZXRDbGFzcygpLmVxdWFscyh0aGlzLndvcmtQcm9kdWN0VHlwZSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NUYXNrRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1Rhc2tGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM5Y2I3MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1Rhc2tGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LlRhc2tJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotCi0vKioKLSAqIEZpbHRlcnMge0BsaW5rIFRhc2t9cyBpbiB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0gYmFzZWQgb24gc2VhcmNoIHBhdHRlcm4uCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1Rhc2tGaWx0ZXIgZXh0ZW5kcyBEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlciB7Ci0KLQlwdWJsaWMgUHJvY2Vzc1Rhc2tGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFRhYmxlVmlld2VyIHZpZXdlciwKLQkJCVN0cmluZyB0YWJOYW1lKSB7Ci0JCXN1cGVyKGNvbmZpZywgdmlld2VyLCB0YWJOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSB7Ci0JCQlpZiAoKChDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSBvYmopLmdldFRleHQob2JqKS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lc19ncm91cCIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgVGFza0l0ZW1Qcm92aWRlcikgfHwgKG9iaiBpbnN0YW5jZW9mIFRhc2spCi0JCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZyl7Ci0JCQlJdGVyYXRvciBpdGVyID0gKFRuZ1V0aWwuZ2V0Q29udHJpYnV0b3JzKChWYXJpYWJpbGl0eUVsZW1lbnQpb2JqKSk7Ci0JCQlpZihpdGVyICE9IG51bGwpewotCQkJCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKXsKLQkJCQkJRGlzY2lwbGluZUdyb3VwaW5nIGdyb3VwaW5nID0gKERpc2NpcGxpbmVHcm91cGluZylpdGVyLm5leHQoKTsKLQkJCQkJLy8gVE9ETyA6IENoZWNrIGZvciAocmVjdXJzaXZlKURpc2NpcGxpbmUgaXMgZW1wdHksIAotCQkJCQkvLyBpZiBkaXNjaXBsaW5lJ3MgdGFza3MgYXJlIGVtcHR5IGRvbm90IHNob3cgRGlzY2lwbGluZSBncm91cGluZyAKLQkJCQkJaWYoIWdyb3VwaW5nLmdldERpc2NpcGxpbmVzKCkuaXNFbXB0eSgpKSByZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBUT0RPIDogQ2hlY2sgZm9yIChyZWN1cnNpdmUpRGlzY2lwbGluZSBpcyBlbXB0eSwgCi0JCQkvLyBpZiBkaXNjaXBsaW5lJ3MgdGFza3MgYXJlIGVtcHR5IGRvbm90IHNob3cgRGlzY2lwbGluZSBncm91cGluZyAKLQkJCXJldHVybiAhKChEaXNjaXBsaW5lR3JvdXBpbmcpb2JqKS5nZXREaXNjaXBsaW5lcygpLmlzRW1wdHkoKTsKLQkJfQotCQlpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKXsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSAoVG5nVXRpbC5nZXRDb250cmlidXRvcnMoKFZhcmlhYmlsaXR5RWxlbWVudClvYmopKTsKLQkJCWlmKGl0ZXIgIT0gbnVsbCl7Ci0JCQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpewotCQkJCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSlpdGVyLm5leHQoKTsKLQkJCQkJLy8gVE9ETyA6IENoZWNrIGZvciAocmVjdXJzaXZlKURpc2NpcGxpbmUgaXMgZW1wdHksIAotCQkJCQkvLyBpZiBkaXNjaXBsaW5lJ3MgdGFza3MgYXJlIGVtcHR5IGRvbm90IHNob3cgRGlzY2lwbGluZSAKLQkJCQkJaWYoIWRpc2NpcGxpbmUuZ2V0VGFza3MoKS5pc0VtcHR5KCkpIHJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAhKChEaXNjaXBsaW5lKW9iaikuZ2V0VGFza3MoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzVmlld0ZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NWaWV3RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NDY1MjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NWaWV3RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0KLS8qKgotICogRmlsdGVyIHtAbGluayBQcm9jZXNzfWVzIHdpdGhpbiB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0gdXNlZCBpbgotICoge0BsaW5rIEl0ZW1zRmlsdGVyRGlhbG9nfS4KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1ZpZXdGaWx0ZXIgZXh0ZW5kcyBEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlciB7Ci0KLQlwdWJsaWMgUHJvY2Vzc1ZpZXdGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIFZpZXdlciB2aWV3ZXIsCi0JCQlTdHJpbmcgZmlsdGVyU3RyKSB7Ci0JCXN1cGVyKG1ldGhvZENvbmZpZywgdmlld2VyLCBmaWx0ZXJTdHIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIGZpbHRlclR5cGUgPSBoZWxwZXIuZ2V0RmlsdGVyVHlwZVN0cigpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGZpbHRlclR5cGUuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFMpKSB7Ci0JCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQgfHwgb2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVTKSkgewotCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lIHx8IG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZyk7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKEZpbHRlckNvbnN0YW50cy5ET01BSU5TKSkgewotCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBEb21haW4pOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGUKLQkJCQkuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RUWVBFUykpIHsKLQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLlRPT0xTKSkgewotCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBUb29sKTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlCi0JCQkJLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTKSkgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5OwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGUuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTKSkgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQgfHwgb2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZQotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBEb21haW4gfHwgb2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlCi0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFRvb2wgfHwgb2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nCi0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZzsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZmYzMGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NXb3JrUHJvZHVjdEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5VbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5Xb3JrUHJvZHVjdEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotCi0KLS8qKgotICogRmlsdGVycyB7QGxpbmsgV29ya1Byb2R1Y3R9cyB3aXRoIGluIHtAbGluayBNZXRob2RDb25maWd1cmF0aW9ufS4gCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyIGV4dGVuZHMgRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIgewotCi0JcHVibGljIFByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCVRhYmxlVmlld2VyIHZpZXdlciwgU3RyaW5nIHRhYk5hbWUpIHsKLQkJc3VwZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIHsKLQkJCWlmICgoKENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VGV4dChvYmopLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXAiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCQkJaWYgKCgoQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgb2JqKS5nZXRUZXh0KG9iaikuZXF1YWxzSWdub3JlQ2FzZSgKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRG9tYWluc19ncm91cCIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIpCi0JCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KQotCQkJCXx8IChvYmogaW5zdGFuY2VvZiBVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKQotCQkJCXx8IChvYmogaW5zdGFuY2VvZiBEb21haW4pCi0JCQkJfHwgKG9iaiBpbnN0YW5jZW9mIERvbWFpbkl0ZW1Qcm92aWRlcikKLQkJCQl8fCAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKSkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1JlZmVyZW5jZVdvcmtGbG93RmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUmVmZXJlbmNlV29ya0Zsb3dGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJhMDFkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUmVmZXJlbmNlV29ya0Zsb3dGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkNhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUFsbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotCi0KLS8qKgotICogRmlsdGVycyB0aGUge0BsaW5rIFByb2Nlc3N9cyBmb3IgcmVmZXJlbmNlIHdvcmtmbG93cyBvZiB7QGxpbmsgRGlzY2lwbGluZX0uIAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZmVyZW5jZVdvcmtGbG93RmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RCYXNlRmlsdGVyIGltcGxlbWVudHMKLQkJSUFsbEZpbHRlciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklBbGxGaWx0ZXIjZ2V0T2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyI2FjY2VwdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCS8vIGlmIGNhbid0IGJlIGFjY2RlcHRlZCBieSBzdXBlciwgcmV0dXJuLgotCQlpZiAoIXN1cGVyLmFjY2VwdChvYmopKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlPYmplY3QgY29udGVudEVsZW1lbnQgPSBoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmIChvYmouZXF1YWxzKGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKSAhPSBudWxsKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKAotCQkJCQkJKChQcm9jZXNzQ29tcG9uZW50KSBvYmopLmdldFByb2Nlc3MoKSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoTWV0aG9kRWxlbWVudFV0aWwuZ2V0QWxsTW9kZWxzKGNvbnRlbnRFbGVtZW50KQotCQkJCQkJLmNvbnRhaW5zKG9iaikpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQlDb2xsZWN0aW9uIGxpc3QgPSAoKFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqKS5nZXRDaGlsZHJlbihvYmopOwotCQkJZm9yIChJdGVyYXRvciBpb3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGlvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGlvci5uZXh0KCk7Ci0JCQkJaWYgKCgoQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iamVjdCkuZ2V0Q2hpbGRyZW4oCi0JCQkJCQlvYmplY3QpLmlzRW1wdHkoKSkKLQkJCQkJaW9yLnJlbW92ZSgpOwotCQkJfQotCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSkgewotCQkJCWlmICgoKFByb2Nlc3NQYWNrYWdlKSBvYmopLmdldFByb2Nlc3NFbGVtZW50cygpLmlzRW1wdHkoKQotCQkJCQkJJiYgKChQcm9jZXNzUGFja2FnZSkgb2JqKS5nZXRDaGlsZFBhY2thZ2VzKCkuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUm9sZUZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1JvbGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTljYzQzYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUm9sZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotCi0KLS8qKgotICogRmlsdGVycyB7QGxpbmsgUm9sZX0gCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVGaWx0ZXIgZXh0ZW5kcyBBbGxGaWx0ZXIgewotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50ID0gZ2V0SGVscGVyKCkuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmIChvYmouZXF1YWxzKGNvbnRlbnRFbGVtZW50KSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZ2V0SGVscGVyKCkuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpICE9IG51bGwpIHsKLQkJCWlmIChnZXRIZWxwZXIoKS5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCFnZXRIZWxwZXIoKS5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCWlmIChNZXRob2RFbGVtZW50VXRpbC5nZXRBbGxNb2RlbHMoY29udGVudEVsZW1lbnQpCi0JCQkJCQkJLmNvbnRhaW5zKG9iaikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1ZhcmlhYmlsaXR5UHJvY2Vzc1JvbGVGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9WYXJpYWJpbGl0eVByb2Nlc3NSb2xlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZDBlOTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1ZhcmlhYmlsaXR5UHJvY2Vzc1JvbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUHJvY2Vzc0NvbW1hbmRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotCi0vKioKLSAqIEZpbHRlcnMge0BsaW5rIFByb2Nlc3N9J3Mge0BsaW5rIFJvbGV9IHdpdGhpbiB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWYXJpYWJpbGl0eVByb2Nlc3NSb2xlRmlsdGVyIGV4dGVuZHMgUHJvY2Vzc1JvbGVGaWx0ZXIgewotCi0JQWN0aXZpdHkgYWN0aXZpdHkgPSBudWxsOwotCi0JcHVibGljIFZhcmlhYmlsaXR5UHJvY2Vzc1JvbGVGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlUYWJsZVZpZXdlciB2aWV3ZXIsIFN0cmluZyB0YWJOYW1lLCBBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlzdXBlcihjb25maWcsIHZpZXdlciwgdGFiTmFtZSk7Ci0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChzdXBlci5jaGlsZEFjY2VwdChvYmopKSB7Ci0vLwkJCWlmIChQcm9jZXNzVXRpbC5nZXRWYXJpYWJpbGl0eUVsZW1lbnQodGhpcy5hY3Rpdml0eSkuY29udGFpbnMob2JqKSkgewotLy8JCQkJcmV0dXJuIGZhbHNlOwotLy8JCQl9IGVsc2UKLS8vCQkJCXJldHVybiB0cnVlOwotCQkJcmV0dXJuIFByb2Nlc3NDb21tYW5kVXRpbC5nZXRWYWxpZERlc2NyaXB0b3Iob2JqLCBhY3Rpdml0eSwgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgPT0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1ZhcmlhYmlsaXR5UHJvY2Vzc1Rhc2tGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9WYXJpYWJpbGl0eVByb2Nlc3NUYXNrRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOGM2OTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1ZhcmlhYmlsaXR5UHJvY2Vzc1Rhc2tGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUHJvY2Vzc0NvbW1hbmRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotCi0vKioKLSAqIEZpbHRlcnMge0BsaW5rIFByb2Nlc3N9J3Mge0BsaW5rIFRhc2t9IHdpdGhpbiB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmFyaWFiaWxpdHlQcm9jZXNzVGFza0ZpbHRlciBleHRlbmRzIFByb2Nlc3NUYXNrRmlsdGVyIHsKLQotCUFjdGl2aXR5IGFjdGl2aXR5ID0gbnVsbDsKLQotCXB1YmxpYyBWYXJpYWJpbGl0eVByb2Nlc3NUYXNrRmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJVGFibGVWaWV3ZXIgdmlld2VyLCBTdHJpbmcgdGFiTmFtZSwgQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJc3VwZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUpOwotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkgewotLy8JCQlpZiAoUHJvY2Vzc1V0aWwuZ2V0VmFyaWFiaWxpdHlFbGVtZW50KHRoaXMuYWN0aXZpdHkpLmNvbnRhaW5zKG9iaikpIHsKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfSBlbHNlCi0vLwkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0VmFsaWREZXNjcmlwdG9yKG9iaiwgYWN0aXZpdHksIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpID09IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9WYXJpYWJpbGl0eVByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1ZhcmlhYmlsaXR5UHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MmMyYmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1ZhcmlhYmlsaXR5UHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlByb2Nlc3NDb21tYW5kVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotCi0KLS8qKgotICogRmlsdGVycyB7QGxpbmsgUHJvY2Vzc30ncyB7QGxpbmsgV29ya1Byb2R1Y3R9IHdpdGhpbiB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmFyaWFiaWxpdHlQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIgZXh0ZW5kcwotCQlQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIgewotCi0JQWN0aXZpdHkgYWN0aXZpdHkgPSBudWxsOwotCi0JcHVibGljIFZhcmlhYmlsaXR5UHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJVGFibGVWaWV3ZXIgdmlld2VyLCBTdHJpbmcgdGFiTmFtZSwgQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJc3VwZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUpOwotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkgewotLy8JCQlpZiAoUHJvY2Vzc1V0aWwuZ2V0VmFyaWFiaWxpdHlFbGVtZW50KHRoaXMuYWN0aXZpdHkpLmNvbnRhaW5zKG9iaikpIHsKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfSBlbHNlCi0vLwkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0VmFsaWREZXNjcmlwdG9yKG9iaiwgYWN0aXZpdHksIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpID09IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Xb3JrUHJvZHVjdEZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1dvcmtQcm9kdWN0RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNjIxMzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1dvcmtQcm9kdWN0RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotCi0vKioKLSAqIEZpbHRlcnMge0BsaW5rIFdvcmtQcm9kdWN0fSBiYXNlZCBvbiBzZWFyY2ggcGF0dGVybgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdEZpbHRlciBleHRlbmRzIENvbnRlbnRGaWx0ZXIgewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOThkNDc1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBmaWx0ZXJzIGZvciB0aGUgbWV0aG9kIGFuZCBwcm9jZXNzIGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQXNzb2NpYXRpb25Gb3JtUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Bc3NvY2lhdGlvbkZvcm1QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNTk5MWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Bc3NvY2lhdGlvbkZvcm1QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkVkaXRvcnNDb250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Nb3ZlSW5DYXRlZ29yeUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNhdGVnb3J5U29ydEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29udGVudEVsZW1lbnRPcmRlckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotCi0KLS8qKgotICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBBc3NvY2lhdGlvbiB0eXBlIGZvcm0gcGFnZXMgaW4gdGhlIE1ldGhvZCBlZGl0b3JzLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NvY2lhdGlvbkZvcm1QYWdlIGV4dGVuZHMgQmFzZUZvcm1QYWdlIGltcGxlbWVudHMgSU1lbnVMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX1BSRUZJWCA9ICJBdXRob3JpbmdVSV8iOyAvLyROT04tTkxTLTEkCQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlclNlbGVjdGVkOwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChvYmplY3QpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXJTZWxlY3RlZDI7Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlclNlbGVjdGVkMiA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChvYmplY3QpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXJTZWxlY3RlZDM7Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlclNlbGVjdGVkMyA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChvYmplY3QpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBTZWN0aW9uIGFTZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIHZpZXdlcl9zZWxlY3RlZCwgdmlld2VyX3NlbGVjdGVkMiwgdmlld2VyX3NlbGVjdGVkMzsKLQotCXByb3RlY3RlZCBUYWJsZSBjdHJsX3NlbGVjdGVkLCBjdHJsX3NlbGVjdGVkMiwgY3RybF9zZWxlY3RlZDM7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfYWRkLCBjdHJsX3JlbW92ZSwgY3RybF9hZGQyLCBjdHJsX3JlbW92ZTIsIGN0cmxfYWRkMywKLQkJCWN0cmxfcmVtb3ZlMzsKLQotCXByb3RlY3RlZCBCdXR0b24gY3RybF91cDEsIGN0cmxfZG93bjEsIGN0cmxfdXAyLCBjdHJsX2Rvd24yLCBjdHJsX3VwMywKLQkJCWN0cmxfZG93bjM7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjdHJsX2JyaWVmRGVzYzsKLQotCXByb3RlY3RlZCBCdXR0b24gY3RybF9zZWxlY3QsIGN0cmxfY2xlYXI7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IHVzZWRDYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIExhYmVsIGxhYmVsX0NhdGVnb3J5LCBsYWJlbF9DYXRlZ29yeTIsIGxhYmVsX0NhdGVnb3J5MzsKLQotCXByaXZhdGUgYm9vbGVhbiB1c2VDYXRlZ29yeTEgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIHVzZUNhdGVnb3J5MiA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdXNlQ2F0ZWdvcnkzID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBhbGxvd0NoYW5nZTEgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIGFsbG93Q2hhbmdlMiA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gYWxsb3dDaGFuZ2UzID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDIgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDMgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24yID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjMgPSBmYWxzZTsKLQotCXByaXZhdGUgTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbiBsaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uOwotCS8vIHN0cmluZ3MgdXNlZCBpbiB0aGUgZm9ybQotCXByb3RlY3RlZCBTdHJpbmcgZm9ybU5hbWVQcmVmaXggPSAiRm9ybSBwcmVmaXgiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlY3Rpb25OYW1lID0gIlNlY3Rpb24gbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBTdHJpbmcgc2VjdGlvbkRlc2MgPSAiU2VjdGlvbiBkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBTdHJpbmcgc2VsZWN0ZWRMYWJlbCA9ICJTZWxlY3RlZCBMYWJlbCAxIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBzZWxlY3RlZExhYmVsMiA9ICJTZWxlY3RlZCBMYWJlbCAyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBzZWxlY3RlZExhYmVsMyA9ICJTZWxlY3RlZCBMYWJlbCAzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gRGF0YSBtb2RlbCBtZXRob2RzLgotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IG5ld0l0ZW1zKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QgbmV3SXRlbXMpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwzKEFycmF5TGlzdCBuZXdJdGVtcykgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMihBcnJheUxpc3Qgcm1JdGVtcykgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMyhBcnJheUxpc3Qgcm1JdGVtcykgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1vdmVVcEl0ZW1zSW5TZWxlY3RlZEl0ZW1zMShBcnJheUxpc3QgbW92ZVVwSXRlbXMpIHsKLQkJaWYgKCFtb3ZlVXBJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0Q29udGVudENhdGVnb3J5T3JkZXJGZWF0dXJlKCk7Ci0JCQlDb250ZW50RWxlbWVudE9yZGVyTGlzdCBvcmRlckxpc3QgPSBnZXRDb250ZW50RWxlbWVudE9yZGVyTGlzdCgpOwotCQkJU3RyaW5nW10gcGF0aCA9IGdldE1vZGVsU3RydWN0dXJlUGF0aCgpOwotCQkJaWYgKGZlYXR1cmUgIT0gbnVsbCAmJiBvcmRlckxpc3QgIT0gbnVsbCAmJiBwYXRoICE9IG51bGwpIHsKLQkJCQlNb3ZlSW5DYXRlZ29yeUNvbW1hbmQgY21kID0gbmV3IE1vdmVJbkNhdGVnb3J5Q29tbWFuZCgKLQkJCQkJCShDb250ZW50Q2F0ZWdvcnkpIGNvbnRlbnRFbGVtZW50LCBtb3ZlVXBJdGVtcywgb3JkZXJMaXN0LAotCQkJCQkJZmVhdHVyZSwgcGF0aCwgMSk7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1vdmVEb3duSXRlbXNJblNlbGVjdGVkSXRlbXMxKEFycmF5TGlzdCBtb3ZlRG93bkl0ZW1zKSB7Ci0JCWlmICghbW92ZURvd25JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0Q29udGVudENhdGVnb3J5T3JkZXJGZWF0dXJlKCk7Ci0JCQlDb250ZW50RWxlbWVudE9yZGVyTGlzdCBvcmRlckxpc3QgPSBnZXRDb250ZW50RWxlbWVudE9yZGVyTGlzdCgpOwotCQkJU3RyaW5nW10gcGF0aCA9IGdldE1vZGVsU3RydWN0dXJlUGF0aCgpOwotCQkJaWYgKGZlYXR1cmUgIT0gbnVsbCAmJiBvcmRlckxpc3QgIT0gbnVsbCAmJiBwYXRoICE9IG51bGwpIHsKLQkJCQlNb3ZlSW5DYXRlZ29yeUNvbW1hbmQgY21kID0gbmV3IE1vdmVJbkNhdGVnb3J5Q29tbWFuZCgKLQkJCQkJCShDb250ZW50Q2F0ZWdvcnkpIGNvbnRlbnRFbGVtZW50LCBtb3ZlRG93bkl0ZW1zLCBvcmRlckxpc3QsCi0JCQkJCQlmZWF0dXJlLCBwYXRoLCAwKTsKLQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJfQotCQl9Ci0JfQotCQotCS8vIFZpZXdlciBtZXRob2RzLgotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDMoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGdldENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldE1vZGVsU3RydWN0dXJlUGF0aCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gImNvbnRlbnRlbGVtZW50Ijt9IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nMigpIHsKLQkJcmV0dXJuIGdldFRhYlN0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nMygpIHsKLQkJcmV0dXJuIGdldFRhYlN0cmluZygpOwotCX0KLQotCS8qCi0JICogZ2V0RmlsdGVyVHlwZXMgc2hvdWxkIGJlIG92ZXJyaWRlIHRvIHBhc3MgdHlwZXMuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlclR5cGVzKCl7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKgotCSAqIGdldEZpbHRlclR5cGVzIHNob3VsZCBiZSBvdmVycmlkZSB0byBwYXNzIHR5cGVzLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJUeXBlczIoKXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qCi0JICogZ2V0RmlsdGVyVHlwZXMgc2hvdWxkIGJlIG92ZXJyaWRlIHRvIHBhc3MgdHlwZXMuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlclR5cGVzMygpewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0KLQkvLyBGaWx0ZXIgaW5mby4KLQlwcm90ZWN0ZWQgSUZpbHRlciBmaWx0ZXIsIGZpbHRlcjIsIGZpbHRlcjM7Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyMigpIHsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIzKCkgewotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCS8vIE9yZGVyaW5nIG9mIGNvbnRyaWJ1dGVkIGNhdGVnb3JpemVkIGVsZW1lbnRzIGluIGN1c3RvbQotCS8vIGNhdGVnb3JpZXMKLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfb3JkZXJpbmc7Ci0KLQlwcm90ZWN0ZWQgQ29tYm9WaWV3ZXIgdmlld2VyX3NvcnQxOwotCQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXJTb3J0ID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCUxpc3Q8U3RyaW5nPiBzb3J0VHlwZXNMaXN0ID0gQ2F0ZWdvcnlTb3J0SGVscGVyLmdldENhdGVnb3J5U29ydFR5cGVzKCk7Ci0JCQlyZXR1cm4gc29ydFR5cGVzTGlzdC50b0FycmF5KCk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXJTb3J0ID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCVN0cmluZyBzdHIgPSAoKFN0cmluZylvYmplY3QpOwotCQkJCXJldHVybiBDYXRlZ29yeVNvcnRIZWxwZXIuZ2V0U29ydFR5cGVEaXNwbGF5TmFtZShzdHIpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9OwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFzc29jaWF0aW9uRm9ybVBhZ2UoRm9ybUVkaXRvciBlZGl0b3IsIFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoZWRpdG9yLCBpZCwgbmFtZSk7Ci0JCXRoaXMuZWRpdG9yVGFiTmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkJhc2VGb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQlzdXBlci5jcmVhdGVGb3JtQ29udGVudChtYW5hZ2VkRm9ybSk7Ci0KLQkJVUlIZWxwZXIuc2V0Rm9ybVRleHQoZm9ybSwgY29udGVudEVsZW1lbnQpOwotCQkKLQkJLy8gQ3JlYXRlIGEgc2VjdGlvbi4KLQkJYVNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksIFNlY3Rpb24uVElUTEVfQkFSCi0JCQkJfCBTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRCk7Ci0JCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCWFTZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQlhU2VjdGlvbi5zZXRUZXh0KGdldFNlY3Rpb25OYW1lKCkpOwotCQlhU2VjdGlvbi5zZXREZXNjcmlwdGlvbihnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCWFTZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlhQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoYVNlY3Rpb24pOwotCQlhQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlhQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlhU2VjdGlvbi5zZXRDbGllbnQoYUNvbXBvc2l0ZSk7Ci0KLQkJaW50IG51bVRhYmxlc1VzZWQgPSAwOwotCi0JCWlmICh1c2VDYXRlZ29yeTEpCi0JCQludW1UYWJsZXNVc2VkKys7Ci0JCWlmICh1c2VDYXRlZ29yeTIpCi0JCQludW1UYWJsZXNVc2VkKys7Ci0JCWlmICh1c2VDYXRlZ29yeTMpCi0JCQludW1UYWJsZXNVc2VkKys7Ci0KLQkJaWYgKHVzZUNhdGVnb3J5MSkgewotCQkJQ29tcG9zaXRlIHBhbmUxID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGFDb21wb3NpdGUsIDEpOwotCQkJbGFiZWxfQ2F0ZWdvcnkgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMSwgZ2V0U2VsZWN0ZWRMYWJlbCgpKTsKLQotCQkJaWYgKGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xKQotCQkJCWN0cmxfc2VsZWN0ZWQgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSwgU0lOR0xFX1JPVyk7Ci0JCQllbHNlIHsKLQkJCQlpZiAobnVtVGFibGVzVXNlZCA9PSAxKQotCQkJCQljdHJsX3NlbGVjdGVkID0gY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTEsIExBUkdFX1NJWkUpOwotCQkJCWVsc2UgaWYgKG51bVRhYmxlc1VzZWQgPT0gMikKLQkJCQkJY3RybF9zZWxlY3RlZCA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUxLCBNRURJVU1fU0laRSk7Ci0JCQkJZWxzZQotCQkJCQljdHJsX3NlbGVjdGVkID0gY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTEsIFNNQUxMX1NJWkUpOwotCQkJfQotCi0JCQlsaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uID0gbmV3IExpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdik7IAotCQkJdmlld2VyX3NlbGVjdGVkID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfc2VsZWN0ZWQpOwotCQkJdmlld2VyX3NlbGVjdGVkLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlclNlbGVjdGVkKTsKLQkJCWluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpOwotCQkJdmlld2VyX3NlbGVjdGVkLnNldElucHV0KGNvbnRlbnRFbGVtZW50KTsKLQkJCWlmICghaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKQotCQkJCXZpZXdlcl9zZWxlY3RlZC5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpKTsKLQotCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Iodmlld2VyX3NlbGVjdGVkKTsKLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQotCQkJQ29tcG9zaXRlIHBhbmUyID0gY3JlYXRlQ29tcG9zaXRlRm9yQnV0dG9ucyh0b29sa2l0LCBhQ29tcG9zaXRlKTsKLQkJCWlmIChhbGxvd0NoYW5nZTEpIHsKLQkJCQljdHJsX2FkZCA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQkJCShjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMSkgPyBTRUxFQ1RfQlVUVE9OCi0JCQkJCQkJCTogQUREX0JVVFRPTik7Ci0JCQkJY3RybF9yZW1vdmUgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCQkoY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEpID8gQ0xFQVJfQlVUVE9OCi0JCQkJCQkJCTogUkVNT1ZFX0JVVFRPTik7Ci0KLQkJCQlpZiAoaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKSB7Ci0JCQkJCWN0cmxfdXAxID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBVUF9CVVRUT04pOwotCQkJCQljdHJsX2Rvd24xID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBET1dOX0JVVFRPTik7Ci0JCQkJCWN0cmxfb3JkZXJpbmcgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIE9SREVSX0JVVFRPTik7Ci0JCQkJCWN0cmxfb3JkZXJpbmcuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJQ29tYm8gY3RybF9zb3J0MSA9IGNyZWF0ZUNvbWJvV2l0aExhYmVsKHRvb2xraXQsIHBhbmUyLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5Tb3J0VHlwZV9MYWJlbCk7Ci0JCQkJCXZpZXdlcl9zb3J0MSA9IG5ldyBDb21ib1ZpZXdlcihjdHJsX3NvcnQxKTsKLQkJCQkJdmlld2VyX3NvcnQxLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTb3J0KTsKLQkJCQkJdmlld2VyX3NvcnQxLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlclNvcnQpOwotCQkJCQl2aWV3ZXJfc29ydDEuc2V0SW5wdXQoY29udGVudEVsZW1lbnQpOwotCQkJCQkvLyBzZXQgaW5pdGlhbCBzZWxlY3Rpb24KLQkJCQkJU3RyaW5nIHNvcnRUeXBlID0gQ2F0ZWdvcnlTb3J0SGVscGVyLmdldENhdGVnb3J5U29ydFZhbHVlKGNvbnRlbnRFbGVtZW50KTsKLQkJCQkJdmlld2VyX3NvcnQxLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzb3J0VHlwZSksIHRydWUpOwotCi0JCQkJCS8vIGN0cmxfb3JkZXJpbmcuc2V0TGF5b3V0RGF0YShuZXcKLQkJCQkJLy8gR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJCQl9Ci0JCQl9Ci0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMik7Ci0JCX0KLQotCQlpZiAodXNlQ2F0ZWdvcnkyKSB7Ci0JCQlDb21wb3NpdGUgcGFuZTMgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgYUNvbXBvc2l0ZSwgMSk7Ci0JCQlsYWJlbF9DYXRlZ29yeTIgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMywgZ2V0U2VsZWN0ZWRMYWJlbDIoKSk7Ci0JCQlpZiAoY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjIpCi0JCQkJY3RybF9zZWxlY3RlZDIgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMywgU0lOR0xFX1JPVyk7Ci0JCQllbHNlIHsKLQkJCQlpZiAobnVtVGFibGVzVXNlZCA9PSAxKQotCQkJCQljdHJsX3NlbGVjdGVkMiA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUzLCBMQVJHRV9TSVpFKTsKLQkJCQllbHNlIGlmIChudW1UYWJsZXNVc2VkID09IDIpCi0JCQkJCWN0cmxfc2VsZWN0ZWQyID0gY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTMsIE1FRElVTV9TSVpFKTsKLQkJCQllbHNlCi0JCQkJCWN0cmxfc2VsZWN0ZWQyID0gY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTMsIFNNQUxMX1NJWkUpOwotCQkJfQotCQkJdmlld2VyX3NlbGVjdGVkMiA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3NlbGVjdGVkMik7Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlclNlbGVjdGVkMik7Ci0JCQlpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCk7Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldElucHV0KGNvbnRlbnRFbGVtZW50KTsKLQkJCXZpZXdlcl9zZWxlY3RlZDIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSk7Ci0JCQljcmVhdGVDb250ZXh0TWVudUZvcih2aWV3ZXJfc2VsZWN0ZWQyKTsKLQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTMpOwotCi0JCQlDb21wb3NpdGUgcGFuZTQgPSBjcmVhdGVDb21wb3NpdGVGb3JCdXR0b25zKHRvb2xraXQsIGFDb21wb3NpdGUpOwotCQkJaWYgKGFsbG93Q2hhbmdlMikgewotCQkJCWN0cmxfYWRkMiA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lNCwgQUREX0JVVFRPTik7Ci0JCQkJY3RybF9yZW1vdmUyID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU0LCBSRU1PVkVfQlVUVE9OKTsKLQotCQkJCWlmIChpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDIpIHsKLQkJCQkJY3RybF91cDIgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTQsIFVQX0JVVFRPTik7Ci0JCQkJCWN0cmxfZG93bjIgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTQsIERPV05fQlVUVE9OKTsKLQkJCQl9Ci0JCQl9Ci0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lNCk7Ci0JCX0KLQotCQlpZiAodXNlQ2F0ZWdvcnkzKSB7Ci0JCQlDb21wb3NpdGUgcGFuZTUgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgYUNvbXBvc2l0ZSwgMSk7Ci0JCQlsYWJlbF9DYXRlZ29yeTMgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lNSwgZ2V0U2VsZWN0ZWRMYWJlbDMoKSk7Ci0JCQlpZiAoY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjMpCi0JCQkJY3RybF9zZWxlY3RlZDMgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lNSwgU0lOR0xFX1JPVyk7Ci0JCQllbHNlIHsKLQkJCQlpZiAobnVtVGFibGVzVXNlZCA9PSAxKQotCQkJCQljdHJsX3NlbGVjdGVkMyA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmU1LCBMQVJHRV9TSVpFKTsKLQkJCQllbHNlIGlmIChudW1UYWJsZXNVc2VkID09IDIpCi0JCQkJCWN0cmxfc2VsZWN0ZWQzID0gY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTUsIE1FRElVTV9TSVpFKTsKLQkJCQllbHNlCi0JCQkJCWN0cmxfc2VsZWN0ZWQzID0gY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTUsIFNNQUxMX1NJWkUpOwotCQkJfQotCQkJdmlld2VyX3NlbGVjdGVkMyA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3NlbGVjdGVkMyk7Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQzLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlclNlbGVjdGVkMyk7Ci0JCQlpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQzKCk7Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQzLnNldElucHV0KGNvbnRlbnRFbGVtZW50KTsKLQkJCXZpZXdlcl9zZWxlY3RlZDMuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSk7Ci0JCQljcmVhdGVDb250ZXh0TWVudUZvcih2aWV3ZXJfc2VsZWN0ZWQzKTsKLQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTUpOwotCi0JCQlDb21wb3NpdGUgcGFuZTYgPSBjcmVhdGVDb21wb3NpdGVGb3JCdXR0b25zKHRvb2xraXQsIGFDb21wb3NpdGUpOwotCQkJaWYgKGFsbG93Q2hhbmdlMykgewotCQkJCWN0cmxfYWRkMyA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lNiwgQUREX0JVVFRPTik7Ci0JCQkJY3RybF9yZW1vdmUzID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU2LCBSRU1PVkVfQlVUVE9OKTsKLQotCQkJCWlmIChpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDMpIHsKLQkJCQkJY3RybF91cDMgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTYsIFVQX0JVVFRPTik7Ci0JCQkJCWN0cmxfZG93bjMgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTYsIERPV05fQlVUVE9OKTsKLQkJCQl9Ci0JCQl9Ci0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lNik7Ci0JCX0KLQotCQlzZXRFbmFibGVkQWRkQnV0dG9ucyh0cnVlKTsKLQotCQlzZXRXaWRnZXRXaWR0aHMoKTsKLQkJQ29tcG9zaXRlIHBhbmU3ID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGFDb21wb3NpdGUsCi0JCQkJR3JpZERhdGEuRklMTF9CT1RILCAxLCAxLCAxKTsKLQkJY3RybF9icmllZkRlc2MgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbExhcmdlKAotCQkJCXRvb2xraXQsCi0JCQkJcGFuZTcsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXNzb2NpYXRpb25Gb3JtUGFnZV9CcmllZkRlc2NyaXB0aW9uTGFiZWwpOyAKLQkJY3RybF9icmllZkRlc2Muc2V0RWRpdGFibGUoZmFsc2UpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lNyk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGFDb21wb3NpdGUpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRleHRIZWxwKCk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbmFibGVkQWRkQnV0dG9ucyhib29sZWFuIHZhbHVlKSB7Ci0JCWlmIChhbGxvd0NoYW5nZTEpCi0JCQljdHJsX2FkZC5zZXRFbmFibGVkKHZhbHVlKTsKLQkJaWYgKHVzZUNhdGVnb3J5MiAmJiBhbGxvd0NoYW5nZTIpCi0JCQljdHJsX2FkZDIuc2V0RW5hYmxlZCh2YWx1ZSk7Ci0JCWlmICh1c2VDYXRlZ29yeTMgJiYgYWxsb3dDaGFuZ2UzKQotCQkJY3RybF9hZGQzLnNldEVuYWJsZWQodmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVuYWJsZWRSZW1vdmVCdXR0b25zKGJvb2xlYW4gdmFsdWUpIHsKLQkJaWYgKGFsbG93Q2hhbmdlMSkKLQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQodmFsdWUpOwotCQlpZiAodXNlQ2F0ZWdvcnkyICYmIGFsbG93Q2hhbmdlMikKLQkJCWN0cmxfcmVtb3ZlMi5zZXRFbmFibGVkKHZhbHVlKTsKLQkJaWYgKHVzZUNhdGVnb3J5MyAmJiBhbGxvd0NoYW5nZTMpCi0JCQljdHJsX3JlbW92ZTMuc2V0RW5hYmxlZCh2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzYWJsZUJ1dHRvbnNBbmREZXNlbGVjdFRhYmxlcygpIHsKLQkJLy8gc2V0RW5hYmxlZEFkZEJ1dHRvbnMoZmFsc2UpOwotCQlzZXRFbmFibGVkUmVtb3ZlQnV0dG9ucyhmYWxzZSk7Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCWlmICh1c2VDYXRlZ29yeTIpCi0JCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJaWYgKHVzZUNhdGVnb3J5MykKLQkJCXZpZXdlcl9zZWxlY3RlZDMuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQljdHJsX2JyaWVmRGVzYy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaWV3ZXJzKCkgewotCi0JCXZpZXdlcl9zZWxlY3RlZC5yZWZyZXNoKCk7Ci0JCS8vIENoZWNrIGlmIGV4aXN0aW5nIGVsZW1lbnQgaXMgY29udHJpYnV0b3IvY29udHJpYnV0ZXMgZm9yIHN0YW5kYXJkCi0JCS8vIGNhdGVnb3JpZXMKLQkJLy8gc2hvdWxkIG5vdCBzaG93biBpbiB0aGUgdGFibGV2aWV3ZXIuCi0JCS8vIENvbW1lbnRlZCBiZWxvdyB0byBhbGxvdyBjb250cmlidXRvcnMgdG8gZGlzcGxheSBpbiB0aGUgbGlzdCBib3gKLQkJLy8gaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpewotCQkvLyBpZighKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpKXsKLQkJLy8gT2JqZWN0W10gZWxlbWVudHMgPQotCQkvLyBjb250ZW50UHJvdmlkZXJTZWxlY3RlZC5nZXRFbGVtZW50cyhjb250ZW50RWxlbWVudCk7Ci0JCS8vIGZvcihpbnQgaT0wOyBpPGVsZW1lbnRzLmxlbmd0aDsgaSsrKXsKLQkJLy8gT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KXsKLQkJLy8gaWYoVUlIZWxwZXIuaXNDb250cmlidXRvcigoQ29udGVudEVsZW1lbnQpZWxlbWVudCkpewotCQkvLyB2aWV3ZXJfc2VsZWN0ZWQucmVtb3ZlKGVsZW1lbnQpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQotCQlpZiAodXNlQ2F0ZWdvcnkyKSB7Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQyLnJlZnJlc2goKTsKLQkJCS8vIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KXsKLQkJCS8vIE9iamVjdFtdIGVsZW1lbnRzID0KLQkJCS8vIGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMi5nZXRFbGVtZW50cyhjb250ZW50RWxlbWVudCk7Ci0JCQkvLyBmb3IoaW50IGk9MDsgaTxlbGVtZW50cy5sZW5ndGg7IGkrKyl7Ci0JCQkvLyBPYmplY3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KXsKLQkJCS8vIGlmKFVJSGVscGVyLmlzQ29udHJpYnV0b3IoKENvbnRlbnRFbGVtZW50KWVsZW1lbnQpKXsKLQkJCS8vIHZpZXdlcl9zZWxlY3RlZDIucmVtb3ZlKGVsZW1lbnQpOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gfQotCi0JCX0KLQkJaWYgKHVzZUNhdGVnb3J5MykgewotCQkJdmlld2VyX3NlbGVjdGVkMy5yZWZyZXNoKCk7Ci0JCQkvLyBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSl7Ci0JCQkvLyBPYmplY3RbXSBlbGVtZW50cyA9Ci0JCQkvLyBjb250ZW50UHJvdmlkZXJTZWxlY3RlZDMuZ2V0RWxlbWVudHMoY29udGVudEVsZW1lbnQpOwotCQkJLy8gZm9yKGludCBpPTA7IGk8ZWxlbWVudHMubGVuZ3RoOyBpKyspewotCQkJLy8gT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCl7Ci0JCQkvLyBpZihVSUhlbHBlci5pc0NvbnRyaWJ1dG9yKChDb250ZW50RWxlbWVudCllbGVtZW50KSl7Ci0JCQkvLyB2aWV3ZXJfc2VsZWN0ZWQzLnJlbW92ZShlbGVtZW50KTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQkJfQotCQljdHJsX2JyaWVmRGVzYy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycwotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWZvcm0uYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKGZvcm0gIT0gbnVsbCAmJiAhZm9ybS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJVUlIZWxwZXIuc2V0Rm9ybVRleHQoZm9ybSwgY29udGVudEVsZW1lbnQpOwotCQkJCX0KLQkJCQlyZWZyZXNoVmlld2VycygpOwotCQkJCWlmIChUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQllbmFibGVDb250cm9scyhmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZW5hYmxlQ29udHJvbHModHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCWZvcm0uYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAoZm9ybSAhPSBudWxsICYmICFmb3JtLmlzRGlzcG9zZWQoKSkgewotCQkJCQlVSUhlbHBlci5zZXRGb3JtVGV4dChmb3JtLCBjb250ZW50RWxlbWVudCk7Ci0JCQkJfQotCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWVuYWJsZUNvbnRyb2xzKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQllbmFibGVDb250cm9scyh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWlmICh1c2VDYXRlZ29yeTEpIHsKLQkJCS8vIEFkZCBmb2N1cyBsaXN0ZW5lciBvbiBwcmltYXJ5IHRhc2tzIGxpc3QKLQkJCWN0cmxfc2VsZWN0ZWQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlkaXNhYmxlQnV0dG9uc0FuZERlc2VsZWN0VGFibGVzKCk7Ci0KLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChhbGxvd0NoYW5nZTEgJiYgc2VsZWN0aW9uLnNpemUoKSA+IDAKLQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJdmlld2VyX3NlbGVjdGVkCi0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQlsaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCQkJCWlmIChhbGxvd0NoYW5nZTEgJiYgc2VsZWN0aW9uLnNpemUoKSA+IDAKLQkJCQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQkJCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCQllbmFibGVVcERvd25CdXR0b25zMSgpOwotCi0JCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJCQlTdHJpbmcgZGVzYyA9ICgoTWV0aG9kRWxlbWVudCkgc2VsZWN0aW9uCi0JCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKQotCQkJCQkJCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJCQkJCWlmIChkZXNjID09IG51bGwpIHsKLQkJCQkJCQkJCWRlc2MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWN0cmxfYnJpZWZEZXNjLnNldFRleHQoZGVzYyk7Ci0JCQkJCQkJfSBlbHNlIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJCQkJCQljdHJsX2JyaWVmRGVzYwotCQkJCQkJCQkJCS5zZXRUZXh0KGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oc2VsZWN0aW9uCi0JCQkJCQkJCQkJCQkuc2l6ZSgpKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCX0pOwotCi0JCQlpZiAoYWxsb3dDaGFuZ2UxKSB7Ci0JCQkJY3RybF9hZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdmlld2VyX3NlbGVjdGVkLmdldFRhYmxlKCkKLQkJCQkJCQkJLmdldEl0ZW1zKCk7Ci0JCQkJCQlMaXN0IHNlbGVjdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlzZWxlY3RlZExpc3QuYWRkKGl0ZW1zW2ldLmdldERhdGEoKSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChnZXRGaWx0ZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coCi0JCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0U2hlbGwoKSwgZ2V0RmlsdGVyKCksCi0JCQkJCQkJCQlnZXRDb250ZW50RWxlbWVudCgpLCBnZXRUYWJTdHJpbmcoKSk7Ci0JCQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCQkJZmQuc2V0VGl0bGUoZ2V0VGFiU3RyaW5nKCkpOwotCQkJCQkJCWlmKGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xKXsKLQkJCQkJCQkJZmQuc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCQlmZC5zZXRFeGlzdGluZ0VsZW1lbnRzKHNlbGVjdGVkTGlzdCk7Ci0JCQkJCQkJaWYoZ2V0RmlsdGVyVHlwZXMoKSAhPSBudWxsKXsKLQkJCQkJCQkJZmQuc2V0VHlwZXMoZ2V0RmlsdGVyVHlwZXMoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCQlhZGRJdGVtc1RvTW9kZWwxKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyB2aWV3ZXJfc2VsZWN0ZWQucmVmcmVzaCgpOwotCQkJCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX3JlbW92ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQkJCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCQkJcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKHJtSXRlbXMpOwotCQkJCQkJCS8vIHZpZXdlcl9zZWxlY3RlZC5yZWZyZXNoKCk7Ci0JCQkJCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQkJCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCQkJdmlld2VyX3NlbGVjdGVkLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJCQkJCQljdHJsX2JyaWVmRGVzYy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCi0JCWlmICh1c2VDYXRlZ29yeTIpIHsKLQkJCS8vIEFkZCBmb2N1cyBsaXN0ZW5lciBvbiBwcmltYXJ5IHRhc2tzIGxpc3QKLQkJCWN0cmxfc2VsZWN0ZWQyLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJZGlzYWJsZUJ1dHRvbnNBbmREZXNlbGVjdFRhYmxlcygpOwotCi0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkMgotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKGFsbG93Q2hhbmdlMiAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQkJY3RybF9yZW1vdmUyLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJdmlld2VyX3NlbGVjdGVkMgotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkMgotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJCQkJaWYgKGFsbG93Q2hhbmdlMiAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQkJCWN0cmxfcmVtb3ZlMi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQkJCVN0cmluZyBkZXNjID0gKChNZXRob2RFbGVtZW50KSBzZWxlY3Rpb24KLQkJCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpCi0JCQkJCQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJCQkJZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJY3RybF9icmllZkRlc2Muc2V0VGV4dChkZXNjKTsKLQkJCQkJCQl9IGVsc2UgaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJCQkJCWN0cmxfYnJpZWZEZXNjCi0JCQkJCQkJCQkJLnNldFRleHQoZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihzZWxlY3Rpb24KLQkJCQkJCQkJCQkJCS5zaXplKCkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJfSk7Ci0KLQkJCWlmIChhbGxvd0NoYW5nZTIpIHsKLQkJCQljdHJsX2FkZDIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdmlld2VyX3NlbGVjdGVkMi5nZXRUYWJsZSgpCi0JCQkJCQkJCS5nZXRJdGVtcygpOwotCQkJCQkJTGlzdCBzZWxlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJc2VsZWN0ZWRMaXN0LmFkZChpdGVtc1tpXS5nZXREYXRhKCkpOwotCQkJCQkJfQotCQkJCQkJaWYgKGdldEZpbHRlcjIoKSAhPSBudWxsKSB7Ci0JCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coCi0JCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0U2hlbGwoKSwgZ2V0RmlsdGVyMigpLAotCQkJCQkJCQkJZ2V0Q29udGVudEVsZW1lbnQoKSwgZ2V0VGFiU3RyaW5nMigpKTsKLQkJCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCQlmZC5zZXRUaXRsZShnZXRUYWJTdHJpbmcyKCkpOwotCQkJCQkJCWZkLnNldEV4aXN0aW5nRWxlbWVudHMoc2VsZWN0ZWRMaXN0KTsKLQkJCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQkJYWRkSXRlbXNUb01vZGVsMihmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJfQotCQkJCQkJdmlld2VyX3NlbGVjdGVkMi5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfcmVtb3ZlMi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQyCi0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJCXJlbW92ZUl0ZW1zRnJvbU1vZGVsMihybUl0ZW1zKTsKLQkJCQkJCQl2aWV3ZXJfc2VsZWN0ZWQyLnJlZnJlc2goKTsKLQotCQkJCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJCQkJCQljdHJsX2JyaWVmRGVzYy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJY3RybF9yZW1vdmUyLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHVzZUNhdGVnb3J5MykgewotCQkJLy8gQWRkIGZvY3VzIGxpc3RlbmVyIG9uIHByaW1hcnkgdGFza3MgbGlzdAotCQkJY3RybF9zZWxlY3RlZDMuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlkaXNhYmxlQnV0dG9uc0FuZERlc2VsZWN0VGFibGVzKCk7Ci0KLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQzCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoYWxsb3dDaGFuZ2UzICYmIHNlbGVjdGlvbi5zaXplKCkgPiAwCi0JCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQljdHJsX3JlbW92ZTMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQl2aWV3ZXJfc2VsZWN0ZWQzCi0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQzCi0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJbGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQkJCQlpZiAoYWxsb3dDaGFuZ2UzICYmIHNlbGVjdGlvbi5zaXplKCkgPiAwCi0JCQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJCQkJY3RybF9yZW1vdmUzLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCQkJU3RyaW5nIGRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIHNlbGVjdGlvbgotCQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSkKLQkJCQkJCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCQlkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQljdHJsX2JyaWVmRGVzYy5zZXRUZXh0KGRlc2MpOwotCQkJCQkJCX0gZWxzZSBpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDEpIHsKLQkJCQkJCQkJY3RybF9icmllZkRlc2MKLQkJCQkJCQkJCQkuc2V0VGV4dChnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKHNlbGVjdGlvbgotCQkJCQkJCQkJCQkJLnNpemUoKSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQl9KTsKLQotCQkJaWYgKGFsbG93Q2hhbmdlMykgewotCQkJCWN0cmxfYWRkMy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJVGFibGVJdGVtW10gaXRlbXMgPSB2aWV3ZXJfc2VsZWN0ZWQzLmdldFRhYmxlKCkKLQkJCQkJCQkJLmdldEl0ZW1zKCk7Ci0JCQkJCQlMaXN0IHNlbGVjdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlzZWxlY3RlZExpc3QuYWRkKGl0ZW1zW2ldLmdldERhdGEoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZ2V0RmlsdGVyMygpICE9IG51bGwpIHsKLQkJCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZygKLQkJCQkJCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCQkJCS5nZXRTaGVsbCgpLCBnZXRGaWx0ZXIzKCksCi0JCQkJCQkJCQlnZXRDb250ZW50RWxlbWVudCgpLCBnZXRUYWJTdHJpbmczKCkpOwotCQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJCWZkLnNldFRpdGxlKGdldFRhYlN0cmluZzMoKSk7Ci0JCQkJCQkJZmQuc2V0RXhpc3RpbmdFbGVtZW50cyhzZWxlY3RlZExpc3QpOwotCQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCQlhZGRJdGVtc1RvTW9kZWwzKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCQl9Ci0JCQkJCQl2aWV3ZXJfc2VsZWN0ZWQzLnJlZnJlc2goKTsKLQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX3JlbW92ZTMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkMwotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCQlyZW1vdmVJdGVtc0Zyb21Nb2RlbDMocm1JdGVtcyk7Ci0JCQkJCQkJdmlld2VyX3NlbGVjdGVkMy5yZWZyZXNoKCk7Ci0KLQkJCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCQkJdmlld2VyX3NlbGVjdGVkMy5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCQkJY3RybF9icmllZkRlc2Muc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWN0cmxfcmVtb3ZlMy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0KLQkJaWYgKGFsbG93Q2hhbmdlMSAmJiBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEpIHsKLQkJCWN0cmxfdXAxLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJQXJyYXlMaXN0IG1vdmVVcEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJbW92ZVVwSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCQltb3ZlVXBJdGVtc0luU2VsZWN0ZWRJdGVtczEobW92ZVVwSXRlbXMpOwotCQkJCQl9Ci0JCQkJCS8vIHZpZXdlcl9zZWxlY3RlZC5yZWZyZXNoKCk7Ci0JCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0JCQkJCWVuYWJsZVVwRG93bkJ1dHRvbnMxKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWN0cmxfZG93bjEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZAotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQlBcnJheUxpc3QgbW92ZURvd25JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCW1vdmVEb3duSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCQltb3ZlRG93bkl0ZW1zSW5TZWxlY3RlZEl0ZW1zMShtb3ZlRG93bkl0ZW1zKTsKLQkJCQkJfQotCQkJCQkvLyB2aWV3ZXJfc2VsZWN0ZWQucmVmcmVzaCgpOwotCQkJCQlyZWZyZXNoVmlld2VycygpOwotCQkJCQllbmFibGVVcERvd25CdXR0b25zMSgpOwotCQkJCX0KLQkJCX0pOwotCi0JCQljdHJsX29yZGVyaW5nLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2cgZGxnID0gbmV3IENvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nKAotCQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJCQkJY29udGVudEVsZW1lbnQsIGdldEFjdGlvbk1hbmFnZXIoKSk7Ci0JCQkJCWRsZy5zZXRGZWF0dXJlKGdldENvbnRlbnRDYXRlZ29yeU9yZGVyRmVhdHVyZSgpKTsKLQkJCQkJZGxnLm9wZW4oKTsKLQkJCQkJaWYgKGFsbG93Q2hhbmdlMSAmJiBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEpIHsKLQkJCQkJCVN0cmluZyBzb3J0VHlwZSA9IENhdGVnb3J5U29ydEhlbHBlci5nZXRDYXRlZ29yeVNvcnRWYWx1ZShjb250ZW50RWxlbWVudCk7Ci0JCQkJCQl2aWV3ZXJfc29ydDEuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNvcnRUeXBlKSwgdHJ1ZSk7Ci0JCQkJCQl2aWV3ZXJfc29ydDEucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCXZpZXdlcl9zb3J0MS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc29ydDEKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCVN0cmluZyBzb3J0VHlwZSA9IChTdHJpbmcpc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlpZiAoIUNhdGVnb3J5U29ydEhlbHBlci5nZXRDYXRlZ29yeVNvcnRWYWx1ZShjb250ZW50RWxlbWVudCkuZXF1YWxzKHNvcnRUeXBlKSkgewotCQkJCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSBDYXRlZ29yeVNvcnRIZWxwZXIuZ2V0Q2F0ZWdvcnlTb3J0UHJvcGVydHkoY29udGVudEVsZW1lbnQpOwotCQkJCQkJCi0JCQkJCQlpZiAocHJvcCA9PSBudWxsKSB7CQkJCi0JCQkJCQkJcHJvcCA9IENhdGVnb3J5U29ydEhlbHBlci5jcmVhdGVOZXdTb3J0UHJvcGVydHkoc29ydFR5cGUpOwotCQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfTWV0aG9kRWxlbWVudFByb3BlcnR5KCksCi0JCQkJCQkJCQlwcm9wLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQlwcm9wLAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHlfVmFsdWUoKSwKLQkJCQkJCQkJCQlzb3J0VHlwZSwgLTEpOwotCQkJCQkJfQotCQkJCQkJTGlicmFyeVZpZXcuZ2V0VmlldygpLnJlZnJlc2hWaWV3cygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0JCQkJCWVuYWJsZVVwRG93bkJ1dHRvbnMxKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENvbnRlbnRDYXRlZ29yeU9yZGVyRmVhdHVyZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVDb250cm9scyhib29sZWFuIGVkaXRhYmxlKSB7Ci0JCWlmICh1c2VDYXRlZ29yeTEpIHsKLQkJCWlmIChhbGxvd0NoYW5nZTEpIHsKLQkJCQljdHJsX2FkZC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZAotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChhbGxvd0NoYW5nZTEgJiYgc2VsZWN0aW9uLnNpemUoKSA+IDAKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKHVzZUNhdGVnb3J5MikgewotCQkJaWYgKGFsbG93Q2hhbmdlMikgewotCQkJCWN0cmxfYWRkMi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZDIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoYWxsb3dDaGFuZ2UyICYmIHNlbGVjdGlvbi5zaXplKCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJY3RybF9yZW1vdmUyLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF9yZW1vdmUyLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh1c2VDYXRlZ29yeTMpIHsKLQkJCWlmIChhbGxvd0NoYW5nZTMpIHsKLQkJCQljdHJsX2FkZDMuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQzCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKGFsbG93Q2hhbmdlMyAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWN0cmxfcmVtb3ZlMy5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfcmVtb3ZlMy5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJCX0KLQkJCX0KLQkJfQotCQllbmFibGVVcERvd25CdXR0b25zMSgpOwotCQlpZiAoaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKSB7Ci0JCQlpZiAoIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJdmlld2VyX3NvcnQxLmdldENvbWJvKCkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmlld2VyX3NvcnQxLmdldENvbWJvKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIHNldERpcnR5KGJvb2xlYW4gYikgewotCQkvLyBQaG9uZyAoMDMvMDcvMjAwNSk6IHRoZSBkaXJ0eSBzdGF0ZSBvZiB0aGUgZWRpdG9yIGlzIGFscmVhZHkgdGFrZW4KLQkJLy8gY2FyZSBpbiBNZXRob2RFbGVtZW50RWRpdG9yLCB0cmFuc3BhcmVudCBmcm9tIHVzZXIKLQkJLy8gaW50ZXJhY3Rpb24uIE5vIGZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKSBzaG91bGQgYmUgY2FsbGVkCi0JCS8vIHNvbWV3aGVyZSBlbHNlLgotCQkvLyBOT1RFOiB1bm5lY2Vzc2FyeSBjYWxscyB0byBmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSkgd2lsbCBjYXVzZQotCQkvLyBwZXJmb3JtYW5jZSBwcm9ibGVtLgotCQkvLyBmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHVzZWRDYXRlZ29yaWVzLnNpemUoKSA+IDApCi0JCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbGVhc2VDYXRlZ29yaWVzKGNvbnRlbnRFbGVtZW50LAotCQkJCQl1c2VkQ2F0ZWdvcmllcyk7Ci0KLQkJaWYgKGxhYmVsUHJvdmlkZXJTZWxlY3RlZCAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyU2VsZWN0ZWQuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChsYWJlbFByb3ZpZGVyU2VsZWN0ZWQyICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXJTZWxlY3RlZDIuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChsYWJlbFByb3ZpZGVyU2VsZWN0ZWQzICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXJTZWxlY3RlZDMuZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWN0aW9uIG5hbWUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VjdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJLy8gVFZUIGlzc3VlIHNpbmdsZSBxdW90ZSAKLQkJLy8gRm9ybWF0IHNob3VsZCBiZSBkb25lIG9ubHkgZm9yIENhdGVnb3J5R3VpZGFuY2VQYWdlLCBBdXRob3JpbmdVSS5jYXRlZ29yeUd1aWRhbmNlc1BhZ2Uuc2VjdGlvbkRlc2NyaXB0aW9uIGtleSAKLQkJLy8gaGF2ZSBoYXMgcmVwbGFjZW1lbnQgdmFyaWFibGUgaW4gaXRzIHZhbHVlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBjaGVjayBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQkgICAvKiAKLQkgICAgKiBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQkgICAgU3RyaW5ncyB3aGljaCBjb250YWluIHJlcGxhY2VtZW50IHZhcmlhYmxlcyBhcmUgcHJvY2Vzc2VkIGJ5IHRoZSAgCi0JICAgIE1lc3NhZ2VGb3JtYXQgY2xhc3MgKHNpbmdsZSBxdW90ZSBtdXN0IGJlIGNvZGVkIGFzIDIgY29uc2VjdXRpdmUgc2luZ2xlICAKLQkgICAgcXVvdGVzICcnKS4gU3RyaW5ncyB3aGljaCBkbyBOT1QgY29udGFpbiByZXBsYWNlbWVudCB2YXJpYWJsZXMgYXJlIE5PVCAgIAotCSAgICBwcm9jZXNzZWQgYnkgdGhlIE1lc3NhZ2VGb3JtYXQgY2xhc3MgKHNpbmdsZSBxdW90ZSBtdXN0IGJlIGNvZGVkIGFzIDEKLQkJc2luZ2xlIHF1b3RlICcpLiovCi0JCQotCQlpZiAobWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50Ci0JCQkJJiYgImNhdGVnb3J5R3VpZGFuY2VzUGFnZSIuZXF1YWxzSWdub3JlQ2FzZShnZXRJZCgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gTkxTLmJpbmQoZ2V0SWQoKSArICJfc2VjdGlvbkRlc2NyaXB0aW9uIiwgTGlicmFyeVVJVGV4dC5nZXRVSVRleHRMb3dlcihtZXRob2RFbGVtZW50KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBzZWxlY3RlZCBsYWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCS8vIGlmIChtZXRob2RFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCS8vIHJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5mb3JtYXRTdHJpbmcoUEFDS0FHRV9QUkVGSVggKyBnZXRJZCgpICsKLQkJLy8gIi5zZWxlY3RlZExhYmVsIiwgTGlicmFyeVVJVGV4dC5nZXRVSVRleHQobWV0aG9kRWxlbWVudCkpOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vIH0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2Vjb25kIHNlbGVjdGVkIGxhYmxlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRoaXJkIHNlbGVjdGVkIGxhYmxlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG11bHRpcGxlIHNlY3Rpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvblN0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG11bHRpcGxlIHNlY3Rpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQobWVzc2FnZSwgbmV3IEludGVnZXIoY291bnQpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uU3RyaW5nKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZUNhdGVnb3JpZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0IGRlc2NyaXB0aW9uIGZvciBzZWN0aW9uCi0JICogQHBhcmFtIHNlY3Rpb25EZXNjCi0JICogCQkJRGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWN0aW9uRGVzYyhTdHJpbmcgc2VjdGlvbkRlc2MpIHsKLQkJdGhpcy5zZWN0aW9uRGVzYyA9IHNlY3Rpb25EZXNjOwotCX0KLQotCS8qKgotCSAqIFNldCBmaXJzdCBsYWJlbAotCSAqIEBwYXJhbSBzZWxlY3RlZExhYmVsMQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkTGFiZWwoU3RyaW5nIHNlbGVjdGVkTGFiZWwxKSB7Ci0JCXRoaXMuc2VsZWN0ZWRMYWJlbCA9IHNlbGVjdGVkTGFiZWwxOwotCX0KLQotCS8qKgotCSAqIFNldCBzZWNvbmQgbGFiZWwKLQkgKiBAcGFyYW0gc2VsZWN0ZWRMYWJlbDIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZExhYmVsMihTdHJpbmcgc2VsZWN0ZWRMYWJlbDIpIHsKLQkJdGhpcy5zZWxlY3RlZExhYmVsMiA9IHNlbGVjdGVkTGFiZWwyOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGlyZCBsYWJlbAotCSAqIEBwYXJhbSBzZWxlY3RlZExhYmVsMwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkTGFiZWwzKFN0cmluZyBzZWxlY3RlZExhYmVsMykgewotCQl0aGlzLnNlbGVjdGVkTGFiZWwzID0gc2VsZWN0ZWRMYWJlbDM7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiBmb3IgdGhlIGZpcnN0IGNhdGVnb3J5IHRvIGJlIGVpdGhlciBzaW5nbGUgc2VsZWN0aW9uIG9yIG11bHRpcGxlIHNlbGVjdGlvbgotCSAqIEBwYXJhbSBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xKGJvb2xlYW4gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEpIHsKLQkJdGhpcy5jYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMSA9IGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xOwotCX0KLQotCS8qKgotCSAqIFNldCBhbiBvcHRpb24gZm9yIHRoZSBzZWNvbmQgY2F0ZWdvcnkgdG8gYmUgZWl0aGVyIHNpbmdsZSBzZWxlY3Rpb24gb3IgbXVsdGlwbGUgc2VsZWN0aW9uCi0JICogQHBhcmFtIGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24yCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjIoYm9vbGVhbiBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMikgewotCQl0aGlzLmNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24yID0gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjI7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiBmb3IgdGhlIHRoaXJkIGNhdGVnb3J5IHRvIGJlIGVpdGhlciBzaW5nbGUgc2VsZWN0aW9uIG9yIG11bHRpcGxlIHNlbGVjdGlvbgotCSAqIEBwYXJhbSBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24zKGJvb2xlYW4gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjMpIHsKLQkJdGhpcy5jYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMyA9IGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24zOwotCX0KLQotCS8qKgotCSAqIFNldCBhbiBvcHRpb24gdG8gdXNlIGZpcnN0IGNhdGVnb3J5Ci0JICogQHBhcmFtIHVzZUNhdGVnb3J5MQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzZUNhdGVnb3J5MShib29sZWFuIHVzZUNhdGVnb3J5MSkgewotCQl0aGlzLnVzZUNhdGVnb3J5MSA9IHVzZUNhdGVnb3J5MTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYW4gb3B0aW9uIHRvIHVzZSBzZWNvbmQgY2F0ZWdvcnkKLQkgKiBAcGFyYW0gdXNlQ2F0ZWdvcnkyCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlQ2F0ZWdvcnkyKGJvb2xlYW4gdXNlQ2F0ZWdvcnkyKSB7Ci0JCXRoaXMudXNlQ2F0ZWdvcnkyID0gdXNlQ2F0ZWdvcnkyOwotCX0KLQotCQotCS8qKgotCSAqIFNldCBhbiBvcHRpb24gdG8gdXNlIHRoaXJkIGNhdGVnb3J5Ci0JICogQHBhcmFtIHVzZUNhdGVnb3J5MwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzZUNhdGVnb3J5Myhib29sZWFuIHVzZUNhdGVnb3J5MykgewotCQl0aGlzLnVzZUNhdGVnb3J5MyA9IHVzZUNhdGVnb3J5MzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYW4gb3B0aW9uIHRvIGFsbG93IGNoYW5nZXMgZm9yIGZpcnN0IHRhYmxlIGluIFVJCi0JICogQHBhcmFtIGFsbG93Q2hhbmdlMQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsbG93Q2hhbmdlMShib29sZWFuIGFsbG93Q2hhbmdlMSkgewotCQl0aGlzLmFsbG93Q2hhbmdlMSA9IGFsbG93Q2hhbmdlMTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYW4gb3B0aW9uIHRvIGFsbG93IGNoYW5nZXMgZm9yIHRoZSBzZWNvbmQgdGFibGUgaW4gVUkKLQkgKiBAcGFyYW0gYWxsb3dDaGFuZ2UyCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxsb3dDaGFuZ2UyKGJvb2xlYW4gYWxsb3dDaGFuZ2UyKSB7Ci0JCXRoaXMuYWxsb3dDaGFuZ2UyID0gYWxsb3dDaGFuZ2UyOwotCX0KLQotCS8qKgotCSAqIFNldCBhbiBvcHRpb24gdG8gYWxsb3cgY2hhbmdlcyBmb3IgdGhpcmQgdGFibGUuCi0JICogQHBhcmFtIGFsbG93Q2hhbmdlMwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsbG93Q2hhbmdlMyhib29sZWFuIGFsbG93Q2hhbmdlMykgewotCQl0aGlzLmFsbG93Q2hhbmdlMyA9IGFsbG93Q2hhbmdlMzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYW4gb3B0aW9uIHRvIHNob3cgZmlyc3Qgc2V0IG9mIHVwL2Rvd24gYnV0dG9ucwotCSAqIEBwYXJhbSBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEoCi0JCQlib29sZWFuIGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSkgewotCQl0aGlzLmlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSA9IGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYW4gb3B0aW9uIHRvIHNob3cgc2Vjb25kIHNldCBvZiB1cC9kb3duIGJ1dHRvbnMKLQkgKiBAcGFyYW0gaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQyCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQyKAotCQkJYm9vbGVhbiBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDIpIHsKLQkJdGhpcy5pc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDIgPSBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDI7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiB0byBzaG93IHRoaXJkIHNldCBvZiB1cC9kb3duIGJ1dHRvbnMuCi0JICogQHBhcmFtIGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMwotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMygKLQkJCWJvb2xlYW4gaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQzKSB7Ci0JCXRoaXMuaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQzID0gaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQzOwotCX0KLQotCS8vIGNhbGN1bGF0ZSB3aWR0aHMgZm9yIGxhYmVscyBhbmQgdGFibGVzLCBiYXNlZCBvbiB3aWR0aCBvZiBsYWJlbHMKLQlwcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXRXaWR0aHMoKSB7Ci0JCWludCBhbGxDYXRlZ29yaWVzV2lkdGggPSAwLCBjYXRlZ29yeVdpZHRoID0gMCwgY2F0ZWdvcnkyV2lkdGggPSAwLCBjYXRlZ29yeTNXaWR0aCA9IDA7Ci0JCWludCBsYXJnZXN0V2lkdGggPSAwOwotCQkvLyBpZiAodXNlQ2F0ZWdvcnkxKSBhbGxDYXRlZ29yaWVzV2lkdGggPQotCQkvLyBsYWJlbF9hbGxDYXRlZ29yaWVzLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueDsKLQkJaWYgKHVzZUNhdGVnb3J5MSkKLQkJCWNhdGVnb3J5V2lkdGggPSBsYWJlbF9DYXRlZ29yeQotCQkJCQkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54OwotCQlpZiAodXNlQ2F0ZWdvcnkyKQotCQkJY2F0ZWdvcnkyV2lkdGggPSBsYWJlbF9DYXRlZ29yeTIuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsCi0JCQkJCVNXVC5ERUZBVUxUKS54OwotCQlpZiAodXNlQ2F0ZWdvcnkzKQotCQkJY2F0ZWdvcnkzV2lkdGggPSBsYWJlbF9DYXRlZ29yeTMuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsCi0JCQkJCVNXVC5ERUZBVUxUKS54OwotCi0JCWlmICh1c2VDYXRlZ29yeTEpCi0JCQlsYXJnZXN0V2lkdGggPSBNYXRoLm1heChhbGxDYXRlZ29yaWVzV2lkdGgsIGNhdGVnb3J5V2lkdGgpOwotCQlpZiAodXNlQ2F0ZWdvcnkyKQotCQkJbGFyZ2VzdFdpZHRoID0gTWF0aC5tYXgobGFyZ2VzdFdpZHRoLCBjYXRlZ29yeTJXaWR0aCk7Ci0JCWlmICh1c2VDYXRlZ29yeTMpCi0JCQlsYXJnZXN0V2lkdGggPSBNYXRoLm1heChsYXJnZXN0V2lkdGgsIGNhdGVnb3J5M1dpZHRoKTsKLQotCQlpZiAodXNlQ2F0ZWdvcnkxKSB7Ci0JCQkvLyAoKEdyaWREYXRhKWxhYmVsX2FsbENhdGVnb3JpZXMuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPQotCQkJLy8gbGFyZ2VzdFdpZHRoOwotCQkJLy8gKChHcmlkRGF0YSljdHJsX2FsbEF2YWlsYWJsZS5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9Ci0JCQkvLyBsYXJnZXN0V2lkdGg7Ci0JCQkoKEdyaWREYXRhKSBsYWJlbF9DYXRlZ29yeS5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGxhcmdlc3RXaWR0aDsKLQkJCSgoR3JpZERhdGEpIGN0cmxfc2VsZWN0ZWQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBsYXJnZXN0V2lkdGg7Ci0JCX0KLQkJaWYgKHVzZUNhdGVnb3J5MikgewotCQkJKChHcmlkRGF0YSkgbGFiZWxfQ2F0ZWdvcnkyLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbGFyZ2VzdFdpZHRoOwotCQkJKChHcmlkRGF0YSkgY3RybF9zZWxlY3RlZDIuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBsYXJnZXN0V2lkdGg7Ci0JCX0KLQkJaWYgKHVzZUNhdGVnb3J5MykgewotCQkJKChHcmlkRGF0YSkgbGFiZWxfQ2F0ZWdvcnkzLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbGFyZ2VzdFdpZHRoOwotCQkJKChHcmlkRGF0YSkgY3RybF9zZWxlY3RlZDMuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBsYXJnZXN0V2lkdGg7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgZ2V0QWN0aW9uTWFuYWdlcigpIHsKLQkJRm9ybUVkaXRvciBlZGl0b3IgPSBnZXRFZGl0b3IoKTsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IpIHsKLQkJCXJldHVybiAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDb250ZXh0SGVscCgpIHsKLQkJLy8gaW4gdGhlIGZ1dHVyZSwgd2Ugc2hvdWxkIGNoZWNrIHRoZSBzdWJjbGFzcyB0eXBlIHRvIHNldCB1cCBhCi0JCS8vIGRpZmZlcmVudAotCQkvLyBjb250ZXh0IHBhZ2UgZm9yIGVjaCB0eXBlIG9mIGFzc29jaWF0aW9ucwotCQlFZGl0b3JzQ29udGV4dEhlbHBlci5zZXRIZWxwKGdldFBhcnRDb250cm9sKCksIGdldENvbnRlbnRFbGVtZW50KCkpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgY29udGV4dCBtZW51IGZvciB0aGUgZ2l2ZW4gdmlld2VyCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRleHRNZW51Rm9yKGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7Ci0JCU1lbnVNYW5hZ2VyIGNvbnRleHRNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wVXAiKTsgLy8kTk9OLU5MUy0xJAotCQljb250ZXh0TWVudS5hZGQobmV3IFNlcGFyYXRvcihvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQljb250ZXh0TWVudS5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsKLQkJTWVudSBtZW51ID0gY29udGV4dE1lbnUuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKLQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoY29udGV4dE1lbnUsIHZpZXdlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lciNtZW51QWJvdXRUb1Nob3cob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShsaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVVwRG93bkJ1dHRvbnMxKCkgewotCQlpZiAoY3RybF91cDEgIT0gbnVsbCkgewotCQkJaWYgKGlzU2hvdWxkRW5hYmxlVXAxKCkpIHsKLQkJCQljdHJsX3VwMS5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQljdHJsX3VwMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfQotCQlpZiAoY3RybF9kb3duMSAhPSBudWxsKSB7Ci0JCQlpZiAoaXNTaG91bGRFbmFibGVEb3duMSgpKSB7Ci0JCQkJY3RybF9kb3duMS5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQljdHJsX2Rvd24xLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzU2hvdWxkRW5hYmxlVXAxKCkgewotCQlpZiAodmlld2VyX3NlbGVjdGVkICE9IG51bGwgJiYgY29udGVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxICYmCi0JCQkJCXNlbGVjdGlvbi5zaXplKCkgPT0gMSAmJgotCQkJCQl2aWV3ZXJfc2VsZWN0ZWQuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMCAmJgotCQkJCQkhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkgJiYgCi0JCQkJCUNhdGVnb3J5U29ydEhlbHBlci5pc01hbnVhbENhdGVnb3J5U29ydChjb250ZW50RWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSAKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Nob3VsZEVuYWJsZURvd24xKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZAotCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxICYmCi0JCQkJc2VsZWN0aW9uLnNpemUoKSA9PSAxICYmCi0JCQkJKHZpZXdlcl9zZWxlY3RlZC5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCB2aWV3ZXJfc2VsZWN0ZWQKLQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxKSAmJgotCQkJCSFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSAmJgotCQkJCUNhdGVnb3J5U29ydEhlbHBlci5pc01hbnVhbENhdGVnb3J5U29ydChjb250ZW50RWxlbWVudCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Jhc2VGb3JtUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9CYXNlRm9ybVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNhYjMzOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Jhc2VGb3JtUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkNvbnRyb2xEZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5JbWFnZUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0KLS8qKgotICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBNZXRob2QgZWRpdG9yIGZvcm0gcGFnZXMuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqIGZpeCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NjM4MgotICovCi1wdWJsaWMgY2xhc3MgQmFzZUZvcm1QYWdlIGV4dGVuZHMgRm9ybVBhZ2UgewotCi0JLyoqCi0JICogQnV0dG9uIHR5cGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERF9CVVRUT04gPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX0JVVFRPTiA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUF9CVVRUT04gPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9XTl9CVVRUT04gPSAzOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgT1JERVJfQlVUVE9OID0gNDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNFTEVDVF9CVVRUT04gPSA1OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ0xFQVJfQlVUVE9OID0gNjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEFUVEFDSF9CVVRUT04gPSA3OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgREVUQUNIX0JVVFRPTiA9IDg7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQVRUQUNIX1VSTF9CVVRUT04gPSA5OwotCQotCS8qKgotCSAqIFRhYmxlIHR5cGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNNQUxMX1NJWkUgPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVESVVNX1NJWkUgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFSR0VfU0laRSA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU5HTEVfUk9XID0gMzsKLQotCXByb3RlY3RlZCBib29sZWFuIGRlYnVnOwotCi0JcHJvdGVjdGVkIFNjcm9sbGVkRm9ybSBmb3JtOwotCi0JcHJvdGVjdGVkIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGVkaXRvclRhYk5hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGVkaXRvck5hbWU7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kVW5pdCBtZXRob2RVbml0OwotCQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQgPSBudWxsOwotCi0JcHJvdGVjdGVkIFN0cmluZyBjb250ZW50RWxlbWVudFBhdGg7Ci0KLQlwcml2YXRlIGludCBTRUNUSU9OX0lEOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfREVDT1JBVE9SX0tFWSA9ICJsYWJlbENvbnRyb2xEZWNvcmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGVkaXRvcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBmb3JtIGVkaXRvci4KLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIFRoZSB1bmlxdWUgSUQgZm9yIHRoZSBmb3JtIHBhZ2UuCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBmb3JtIHBhZ2UuCi0JICovCi0JcHVibGljIEJhc2VGb3JtUGFnZShGb3JtRWRpdG9yIGVkaXRvciwgU3RyaW5nIGlkLCBTdHJpbmcgdGl0bGUpIHsKLQkJc3VwZXIoZWRpdG9yLCBpZCwgdGl0bGUpOwotCQlkZWJ1ZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzZXRTaXRlKHNpdGUpOwotCQlzZXRJbnB1dChpbnB1dCk7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIENvbnRlbnRFbGVtZW50IG9iamVjdCBmcm9tIHRoZSBlZGl0b3IgaW5wdXQuCi0JCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBtZXRob2RFbGVtZW50SW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dDsKLQkJbWV0aG9kRWxlbWVudCA9IG1ldGhvZEVsZW1lbnRJbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCU1ldGhvZEVsZW1lbnQgZWxlbWVudE9mUGF0aCA9ICBtZXRob2RFbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCA/Ci0JCQkJKChQcm9jZXNzQ29tcG9uZW50KSBtZXRob2RFbGVtZW50KS5nZXRQcm9jZXNzKCkgOiBtZXRob2RFbGVtZW50OwotCQljb250ZW50RWxlbWVudFBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRGb2xkZXJBYnNvbHV0ZVBhdGgoZWxlbWVudE9mUGF0aCk7Ci0JCWlmIChtZXRob2RFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kVW5pdCkgewotCQkJbWV0aG9kVW5pdCA9IChNZXRob2RVbml0KW1ldGhvZEVsZW1lbnQ7Ci0JCX0KLQkJaWYgKG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJY29udGVudEVsZW1lbnQgPSAoQ29udGVudEVsZW1lbnQpIG1ldGhvZEVsZW1lbnQ7Ci0JCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gY29udGVudEVsZW1lbnQKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCQkJbWV0aG9kVW5pdCA9IGNvbnRlbnREZXNjcmlwdGlvbjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLmNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQkJZm9ybS5nZXRCb2R5KCkuc2V0TGF5b3V0KG5ldyBUYWJsZVdyYXBMYXlvdXQoKSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIGV4cGFuZC9jb2xsYXBzZSBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBUaGUgYXNzb2NpYXRlZCBldmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0b2dnbGUoSHlwZXJsaW5rRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgZXhwYW5kL2NvbGxhcHNlIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIFRoZSBhc3NvY2lhdGVkIGV2ZW50LgotCSAqIEBwYXJhbSBvCi0JICogICAgICAgICAgICA/Pz8KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0b2dnbGUoSHlwZXJsaW5rRXZlbnQgZXZlbnQsIGludCBvKSB7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZSBmb3IgdGhlIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdG9yTmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0b3JOYW1lKFN0cmluZyBlZGl0b3JOYW1lKSB7Ci0JCXRoaXMuZWRpdG9yTmFtZSA9IGVkaXRvck5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgTWV0aG9kIGVsZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIEEgVGFibGVWaWV3ZXIuCi0JICogQHJldHVybiBBIGxpc3Qgb2YgTWV0aG9kIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBMaXN0PD8+IHJldHJpZXZlVGFibGVWaWV3ZXJDb250ZW50cyhUYWJsZVZpZXdlciB2aWV3ZXIpIHsKLQkJT2JqZWN0W10gZWxlbWVudHMgPSAoKElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKSB2aWV3ZXIKLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCkpLmdldEVsZW1lbnRzKHZpZXdlci5nZXRJbnB1dCgpKTsKLQkJTGlzdDxPYmplY3Q+IGVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0JCQllbGVtZW50TGlzdC5hZGQoZWxlbWVudHNbaV0pOwotCQlyZXR1cm4gZWxlbWVudExpc3Q7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNlY3Rpb24gb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBzZWN0aW9uIG5hbWUuCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBUaGUgc2VjdGlvbiBkZXNjcmlwdGlvbi4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBTZWN0aW9uIGNyZWF0ZVNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihwYXJlbnQsIFNlY3Rpb24uREVTQ1JJUFRJT04KLQkJCQl8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQgfCBTZWN0aW9uLlRJVExFX0JBUik7Ci0JCUdyaWREYXRhIHRkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCXNlY3Rpb24uc2V0VGV4dCh0aXRsZSk7Ci0vLwkJU3RyaW5nIHRleHQgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChkZXNjcmlwdGlvbiwKLS8vCQkJCW5ldyBTdHJpbmdbXSB7IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0TG93ZXIobWV0aG9kRWxlbWVudCkgfSk7Ci0vLwkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbih0ZXh0KTsKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IGZvciB0aGUgbGFiZWwuCi0JICogQHBhcmFtIGdyaWREYXRhU3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBHcmlkRGF0YSBzdHlsZS4KLQkgKiBAcGFyYW0gaG9yaXpvbnRhbFNwYW4KLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRha2VuIHVwIGJ5IHRoZSBMYWJlbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkxhYmVsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExhYmVsIGNyZWF0ZUxhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgdGV4dCwgaW50IGdyaWREYXRhU3R5bGUsIGludCBob3Jpem9udGFsU3BhbikgewotCQlMYWJlbCBsYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwocGFyZW50LCB0ZXh0LCBTV1QuV1JBUAotCQkJCXwgU1dULkxFRlRfVE9fUklHSFQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkRGF0YVN0eWxlKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuVE9QOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAoaG9yaXpvbnRhbFNwYW4gPT0gMikgPyAxMTUgOiAxMDA7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCBvbiBhIGZvcm0gcGFnZSB3aXRob3V0IHdyYXAgYW5kIG5vIHdpZHRoSGludC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcGFyYW0gZ3JpZERhdGFTdHlsZQotCSAqICAgICAgICAgICAgVGhlIEdyaWREYXRhIHN0eWxlLgotCSAqIEBwYXJhbSBob3Jpem9udGFsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGFrZW4gdXAgYnkgdGhlIExhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+TGFiZWw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWxXaXRoTm9XcmFwKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgdGV4dCwgaW50IGdyaWREYXRhU3R5bGUsIGludCBob3Jpem9udGFsU3BhbikgewotCQlMYWJlbCBsYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwocGFyZW50LCB0ZXh0LCBTV1QuTEVGVF9UT19SSUdIVCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWREYXRhU3R5bGUpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0JCS8vZ3JpZERhdGEud2lkdGhIaW50ID0gKGhvcml6b250YWxTcGFuID09IDIpID8gMTE1IDogMTAwOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkxhYmVsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExhYmVsIGNyZWF0ZUxhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCB0ZXh0LCBHcmlkRGF0YS5CRUdJTk5JTkcsIDEpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcGFyYW0gaG9yaXpvbnRhbFNwYW4KLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRha2VuIHVwIGJ5IHRoZSBMYWJlbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkxhYmVsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExhYmVsIGNyZWF0ZUxhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgdGV4dCwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCXJldHVybiBjcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIHRleHQsIEdyaWREYXRhLkJFR0lOTklORywKLQkJCQlob3Jpem9udGFsU3Bhbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGJsYW5rIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBob3Jpem9udGFsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGFrZW4gdXAgYnkgdGhlIExhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+TGFiZWw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTGFiZWwgY3JlYXRlQmxhbmtMYWJlbChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCXJldHVybiBjcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsCi0JCQkJIiIsIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgaG9yaXpvbnRhbFNwYW4pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRleHQgY29udHJvbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBUZXh0IHN0eWxlLgotCSAqIEBwYXJhbSBncmlkRGF0YVN0eWxlCi0JICogICAgICAgICAgICBUaGUgR3JpZERhdGEgc3R5bGUuCi0JICogQHBhcmFtIGhlaWd0aAotCSAqICAgICAgICAgICAgVGhlIGhlaWdodCBvZiB0aGUgY29udHJvbC4KLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiAgICAgICAgICAgIFRoZSB3aWR0aCBvZiB0aGUgdGV4dCBjb250cm9sLgotCSAqIEBwYXJhbSBob3Jpem9udGFsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGFrZW4gdXAgYnkgdGhlIFRleHQgY29udHJvbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHRFZGl0KEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgc3R5bGUsIGludCBncmlkRGF0YVN0eWxlLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsCi0JCQlpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJVGV4dCBjb250cm9sID0gdG9vbGtpdC5jcmVhdGVUZXh0KHBhcmVudCwgIiIsIHN0eWxlKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkRGF0YVN0eWxlKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGhlaWdodDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzaW5nbGUtbGluZSB0ZXh0IGNvbnRyb2wgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0RWRpdChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuV1JBUCwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIFNXVC5ERUZBVUxULCAxMDAsIDEpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB0ZXh0IGNvbnRyb2wgd2l0aCBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSB0ZXh0U3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBUZXh0IHN0eWxlLgotCSAqIEBwYXJhbSBncmlkRGF0YVN0eWxlCi0JICogICAgICAgICAgICBUaGUgR3JpZERhdGEgc3R5bGUuCi0JICogQHBhcmFtIGhlaWdodAotCSAqICAgICAgICAgICAgVGhlIGhlaWdodCBvZiB0aGUgY29udHJvbC4KLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiAgICAgICAgICAgIFRoZSB3aWR0aCBvZiB0aGUgdGV4dCBjb250cm9sLgotCSAqIEBwYXJhbSBob3Jpem9udGFsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGFrZW4gdXAgYnkgdGhlIFRleHQgY29udHJvbC4KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCB0ZXh0U3R5bGUsIGludCBncmlkRGF0YVN0eWxlLCBpbnQgaGVpZ2h0LAotCQkJaW50IHdpZHRoLCBpbnQgaG9yaXpvbnRhbFNwYW4sIFN0cmluZyB0ZXh0TGFiZWwpIHsKLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCB0ZXh0TGFiZWwpOwotCQlyZXR1cm4gY3JlYXRlVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCB0ZXh0U3R5bGUsIGdyaWREYXRhU3R5bGUsCi0JCQkJaGVpZ2h0LCB3aWR0aCwgaG9yaXpvbnRhbFNwYW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzaW5nbGUtbGluZSB0ZXh0IGNvbnRyb2wgd2l0aCBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCwgMik7Ci0JCXJldHVybiBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBkb3VibGUtbGluZSB0ZXh0IGNvbnRyb2wgd2l0aCBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDIoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQpIHsKLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCBsYWJlbFRleHQsIDIpOwotCQlyZXR1cm4gY3JlYXRlVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMLCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCwgNDAsIDMwMCwgMSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNpbmdsZSBvciBtdWx0aS1saW5lIHRleHQgY29udHJvbCB3aXRoIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsMyhGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCwgaW50IGhlaWdodCwgaW50IHNpbmdsZU9yTXVsdGkpIHsKLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCBsYWJlbFRleHQsIDIpOwotCQlyZXR1cm4gY3JlYXRlVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCBzaW5nbGVPck11bHRpIHwgU1dULldSQVAKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwsIGhlaWdodCwKLQkJCQkzMDAsIDIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzaW5nbGUgb3IgbXVsdGktbGluZSB0ZXh0IGNvbnRyb2wgd2l0aCBhIGxhYmVsIGluIGEgY29tcG9zaXRlLgotCSAqIAotCSAqIEBhdXRob3IgaG9wZXNoYXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDQoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQsIGludCBoZWlnaHQsIGludCBzaW5nbGVPck11bHRpLCBTdHJpbmcgZmlsbFRleHQpIHsKLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCBsYWJlbFRleHQsIDIpOwotCQkKLQkJaW50IGhvcml6b250YWxTcGFuID0gY2FsY3VsYXRlU3BhbihmaWxsVGV4dCk7Ci0JCQotCQlpZihob3Jpem9udGFsU3Bhbj09MSl7Ci0JCQlUZXh0IHRleHQgPSBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIHNpbmdsZU9yTXVsdGkgfCBTV1QuV1JBUAotCQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMLCBoZWlnaHQsIDIwMCwgMSk7Ci0JCQlUZXh0IHRleHQyID0gY3JlYXRlVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCBzaW5nbGVPck11bHRpIHwgU1dULldSQVAKLQkJCQkJfCBTV1QuVl9TQ1JPTEwsIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCwgaGVpZ2h0LCAxMDAsIDEpOwotCQkJdGV4dDIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsCi0JCQkJCSIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRleHQ7Ci0JCX1lbHNlewotCQkJcmV0dXJuIGNyZWF0ZVRleHRFZGl0KHRvb2xraXQsIHBhcmVudCwgc2luZ2xlT3JNdWx0aSB8IFNXVC5XUkFQCi0JCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULlRSQVZFUlNFX1RBQl9ORVhULAotCQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwsIGhlaWdodCwKLQkJCQkJMzAwLCAzKTsKLQkJfQotCX0KLQkKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgZG91YmxlLWxpbmUgdGV4dCBjb250cm9sIHdpdGggYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiBAYXV0aG9yIGhvcGVzaGFyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWw1KEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCWNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgbGFiZWxUZXh0LCAyKTsKLQkJcmV0dXJuIGNyZWF0ZVRleHRFZGl0KHRvb2xraXQsIHBhcmVudCwgU1dULk1VTFRJIHwgU1dULldSQVAKLQkJCQl8IFNXVC5WX1NDUk9MTCwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwsIDQwLCAzMDAsIDIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgc2luZ2xlIG9yIG11bHRpLWxpbmUgdGV4dCBjb250cm9sIHdpdGggYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiBAYXV0aG9yIGhvcGVzaGFyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWw1KEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0LCBpbnQgaGVpZ2h0LCBpbnQgc2luZ2xlT3JNdWx0aSkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCwgMik7Ci0JCXJldHVybiBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIHNpbmdsZU9yTXVsdGkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULlRSQVZFUlNFX1RBQl9ORVhULAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCwgaGVpZ2h0LAotCQkJCTMwMCwgMyk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21ib2JveCBjb250cm9sIHdpdGggYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAYXV0aG9yIGhvcGVzaGFyZWQKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCBmb3IgdGhlIExhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tYm9ib3g8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBDb21ibyBjcmVhdGVDb21ib1dpdGhMYWJlbDMoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBsYWJlbFRleHQpIHsKLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCBsYWJlbFRleHQsIDIpOwotCQlyZXR1cm4gY3JlYXRlQ29tYm8ocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkZMQVQgfCBTV1QuUkVBRF9PTkxZIHxTV1QuVFJBVkVSU0VfVEFCX05FWFQsCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsY3VsYXRlIHRoZSB0ZXh0J3MgaG9yaXpvbnRhbCBzcGFuLgotCSAqIAotCSAqIEBhdXRob3IgaG9wZXNoYXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgaW50IGNhbGN1bGF0ZVNwYW4oU3RyaW5nIGZpbGxUZXh0KXsKLQkJaW50IGxlbmd0aCA9IGZpbGxUZXh0Lmxlbmd0aCgpOwotCi0JCWlmKGxlbmd0aCA8IDYwKQotCQkJcmV0dXJuIDE7Ci0JCXJldHVybiAyOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhcmdlIHRleHQgY29udHJvbCB3aXRoIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogPHA+Ci0JICogVXNlZCBmb3IgdGhlIEJyaWVmIERlc2NyaXB0aW9uIGJveC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWxMYXJnZShGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IGNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgbGFiZWxUZXh0KTsKLQkJKChHcmlkRGF0YSkgbGFiZWwuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBTV1QuREVGQVVMVDsKLQkJcmV0dXJuIGNyZWF0ZVRleHRFZGl0KHRvb2xraXQsIHBhcmVudCwgU1dULk1VTFRJIHwgU1dULldSQVAKLQkJCQl8IFNXVC5WX1NDUk9MTCwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwsIDgwLCBTV1QuREVGQVVMVCwgMyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBoeXBlcmxpbmsgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IGZvciB0aGUgaHlwZXJsaW5rLgotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgVGhlIGh5cGVybGluayBpbWFnZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkltYWdlSHlwZXJsaW5rPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2VIeXBlcmxpbmsgY3JlYXRlSW1hZ2VIeXBlcmxpbmsoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBJbWFnZSBpbWFnZSkgewotCQlJbWFnZUh5cGVybGluayBsaW5rID0gdG9vbGtpdC5jcmVhdGVJbWFnZUh5cGVybGluayhwYXJlbnQsIFNXVC5MRUZUCi0JCQkJfCBTV1QuVE9QKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuVE9QOwotCQlsaW5rLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlsaW5rLnNldEltYWdlKGltYWdlKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkKLQkJCWxpbmsuc2V0VGV4dCh0ZXh0KTsKLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBoeXBlcmxpbmsgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHNlY3Rpb25JZAotCSAqICAgICAgICAgICAgVGhlIHNjdGlvbiBJRC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkltYWdlSHlwZXJsaW5rPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2VIeXBlcmxpbmsgY3JlYXRlSHlwZXJMaW5rKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgZXhwYW5kZWRDb21wb3NpdGUsIGludCBzZWN0aW9uSUQpIHsKLQkJU0VDVElPTl9JRCA9IHNlY3Rpb25JRDsKLQkJSW1hZ2VIeXBlcmxpbmsgZXhwYW5kTGluayA9IHRvb2xraXQuY3JlYXRlSW1hZ2VIeXBlcmxpbmsoCi0JCQkJZXhwYW5kZWRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZXhwYW5kTGluay5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfRVhQQU5ERUQpOwotCQlleHBhbmRMaW5rLnNldFVuZGVybGluZWQoZmFsc2UpOwotCQlleHBhbmRMaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJdG9nZ2xlKGUsIFNFQ1RJT05fSUQpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGV4cGFuZExpbms7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJpY2ggdGV4dCBjb250cm9sIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIHJpY2ggdGV4dCBzdHlsZS4KLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICogICAgICAgICAgICBUaGUgaGVpZ2h0IG9mIHRoZSBjb250cm9sLgotCSAqIEBwYXJhbSB3aWR0aAotCSAqICAgICAgICAgICAgVGhlIHdpZHRoIG9mIHRoZSB0ZXh0IGNvbnRyb2wuCi0JICogQHBhcmFtIGhvcml6b250YWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0YWtlbiB1cCBieSB0aGUgVGV4dCBjb250cm9sLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SU1ldGhvZFJpY2hUZXh0PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGNyZWF0ZVJpY2hUZXh0RWRpdChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBpbnQgZ3JpZERhdGFTdHlsZSwgaW50IGhlaWdodCwKLQkJCWludCB3aWR0aCwgaW50IGhvcml6b250YWxTcGFuLCBMYWJlbCBsYWJlbCkgewotCQlJTWV0aG9kUmljaFRleHQgcmljaFRleHQgPSBNZXRob2RGb3JtVG9vbGtpdC5jcmVhdGVSaWNoVGV4dCh0b29sa2l0LAotCQkJCXBhcmVudCwgIiIsIHN0eWxlLCBjb250ZW50RWxlbWVudFBhdGgsIG1ldGhvZEVsZW1lbnQsIGxhYmVsKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkRGF0YVN0eWxlKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGhlaWdodDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCXJpY2hUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gcmljaFRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJpY2ggdGV4dCBjb250cm9sIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SU1ldGhvZFJpY2hUZXh0PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGNyZWF0ZVJpY2hUZXh0RWRpdChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlUmljaFRleHRFZGl0KHRvb2xraXQsIHBhcmVudCwgU1dULk1VTFRJIHwgU1dULldSQVAKLQkJCQl8IFNXVC5WX1NDUk9MTCwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCBTV1QuREVGQVVMVCwKLQkJCQlTV1QuREVGQVVMVCwgMSwgbnVsbCk7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlRGVjb3JhdGVkTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGRlY29yYXRlZExhYmVsID0gY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCB0ZXh0KTsKLQkJaW50IG1hcmdpbiA9IEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKS5nZXRNYXhpbXVtRGVjb3JhdGlvbldpZHRoKCk7IAotCQkoKEdyaWREYXRhKWRlY29yYXRlZExhYmVsLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbEluZGVudCA9IG1hcmdpbjsKLQkJQ29udHJvbERlY29yYXRpb24gbGFiZWxDb250cm9sRGVjb3JhdGlvbiA9IG5ldyBDb250cm9sRGVjb3JhdGlvbihkZWNvcmF0ZWRMYWJlbCwgU1dULkxFRlQgfCBTV1QuQk9UVE9NKTsKLQkJZGVjb3JhdGVkTGFiZWwuc2V0RGF0YShMQUJFTF9ERUNPUkFUT1JfS0VZLCBsYWJlbENvbnRyb2xEZWNvcmF0aW9uKTsKLQkJcmV0dXJuIGRlY29yYXRlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgcmljaCB0ZXh0IGNvbnRyb2wgd2l0aCBhIGltYWdlIGh5cGVyTGluayBhbmQgbGFiZWwgb24gYSBmb3JtCi0JICogcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEBwYXJhbSBzZWN0aW9uSWQKLQkgKiAgICAgICAgICAgIFRoZSBzZWN0aW9uIElELgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SVJpY2hNZXRob2RUZXh0PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rKAotCQkJRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCwKLQkJCWludCBoZWlnaHQsIGludCB3aWR0aCwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCUltYWdlSHlwZXJsaW5rIGxpbmsgPSBjcmVhdGVJbWFnZUh5cGVybGluayh0b29sa2l0LCBwYXJlbnQsIG51bGwsCi0JCQkJQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0NPTExBUFNFRCk7Ci0JCWxpbmsuc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMub3BlblJURSk7Ci0JCS8vIGNyZWF0ZSBsYWJlbCB3aXRoIENvbnRyb2xEZWNvcmF0aW9uIGhlcmUgZm9yIG1hcmtlcnMKLQkJTGFiZWwgZGVjb3JhdGVkTGFiZWwgPSBjcmVhdGVEZWNvcmF0ZWRMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCk7Ci0KLQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBjcmVhdGVSaWNoVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEkKLQkJCQl8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMLCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIGhlaWdodCwKLQkJCQl3aWR0aCwgaG9yaXpvbnRhbFNwYW4sIGRlY29yYXRlZExhYmVsKTsKLQotCQlsaW5rLnNldEhyZWYoY29udHJvbCk7Ci0JCWxpbmsuc2V0RGF0YSgiVGl0bGUiLCBsYWJlbFRleHQpOyAvLyROT04tTkxTLTEkCi0JCWxpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQl0b2dnbGUoZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBjb250cm9sOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJpY2ggdGV4dCBjb250cm9sIHdpdGggYSBpbWFnZSBoeXBlckxpbmsgYW5kIGxhYmVsIG9uIGEgZm9ybQotCSAqIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcGFyYW0gc2VjdGlvbklkCi0JICogICAgICAgICAgICBUaGUgc2VjdGlvbiBJRC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPklSaWNoTWV0aG9kVGV4dDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24oCi0JCQlGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0LAotCQkJaW50IGhlaWdodCwgaW50IHdpZHRoLCBpbnQgc2VjdGlvbklEKSB7Ci0JCWZpbmFsIGludCBTRUNUSU9OX0lEID0gc2VjdGlvbklEOwotCQlJbWFnZUh5cGVybGluayBsaW5rID0gY3JlYXRlSW1hZ2VIeXBlcmxpbmsodG9vbGtpdCwgcGFyZW50LCBudWxsLAotCQkJCUF1dGhvcmluZ1VJSW1hZ2VzLklNR19DT0xMQVBTRUQpOwotCQlsaW5rLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLm9wZW5SVEUpOwotCi0JCS8vIGNyZWF0ZSBsYWJlbCB3aXRoIENvbnRyb2xEZWNvcmF0aW9uIGhlcmUgZm9yIG1hcmtlcnMKLQkJTGFiZWwgZGVjb3JhdGVkTGFiZWwgPSBjcmVhdGVEZWNvcmF0ZWRMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCk7Ci0KLQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBjcmVhdGVSaWNoVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEkKLQkJCQl8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMLCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIGhlaWdodCwKLQkJCQl3aWR0aCwgMSwgZGVjb3JhdGVkTGFiZWwpOwotCi0JCWxpbmsuc2V0SHJlZihjb250cm9sKTsKLQkJbGluay5zZXREYXRhKCJUaXRsZSIsIGxhYmVsVGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJbGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJCXRvZ2dsZShlLCBTRUNUSU9OX0lEKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJpY2ggdGV4dCBlZGl0b3Igb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgcmljaCB0ZXh0IHN0eWxlLgotCSAqIEBwYXJhbSBoZWlnaHQKLQkgKiAgICAgICAgICAgIFRoZSBoZWlnaHQgb2YgdGhlIGNvbnRyb2wuCi0JICogQHBhcmFtIHdpZHRoCi0JICogICAgICAgICAgICBUaGUgd2lkdGggb2YgdGhlIHRleHQgY29udHJvbC4KLQkgKiBAcGFyYW0gaG9yaXpvbnRhbFNwYW4KLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRha2VuIHVwIGJ5IHRoZSBUZXh0IGNvbnRyb2wuCi0JICogQHJldHVybiBUaGUgbmV3IDxjb2RlPklNZXRob2RSaWNoVGV4dEVkaXRvcjwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dEVkaXRvciBjcmVhdGVSaWNoVGV4dEVkaXRvcihGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBpbnQgZ3JpZERhdGFTdHlsZSwgaW50IGhlaWdodCwKLQkJCWludCB3aWR0aCwgaW50IGhvcml6b250YWxTcGFuLCBMYWJlbCBsYWJlbCkgewotCQlJTWV0aG9kUmljaFRleHRFZGl0b3IgZWRpdG9yID0gTWV0aG9kRm9ybVRvb2xraXQuY3JlYXRlUmljaFRleHRFZGl0b3IoCi0JCQkJdG9vbGtpdCwgcGFyZW50LCAiIiwgc3R5bGUsIGNvbnRlbnRFbGVtZW50UGF0aCwgbWV0aG9kRWxlbWVudCwgbGFiZWwsIGdldEVkaXRvcigpLmdldEVkaXRvclNpdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZERhdGFTdHlsZSk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBoZWlnaHQ7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IHdpZHRoOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQllZGl0b3Iuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBlZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbWJvYm94IGNvbnRyb2wgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgQ29tYm9ib3ggc3R5bGUuCi0JICogQHBhcmFtIGdyaWREYXRhU3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBHcmlkRGF0YSBzdHlsZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbWJvYm94PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBpbnQgZ3JpZERhdGFTdHlsZSkgewotCQlDb21ibyBjb250cm9sID0gbmV3IENvbWJvKHBhcmVudCwgc3R5bGUpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tYm9ib3ggY29udHJvbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbWJvYm94PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlQ29tYm8ocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkZMQVQgfCBTV1QuUkVBRF9PTkxZLAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbWJvYm94IGNvbnRyb2wgd2l0aCBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IGZvciB0aGUgTGFiZWwuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgQ29tYm9ib3ggc3R5bGUuCi0JICogQHBhcmFtIGdyaWREYXRhU3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBHcmlkRGF0YSBzdHlsZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbWJvYm94PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tYm8gY3JlYXRlQ0NvbWJvV2l0aExhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dExhYmVsLCBpbnQgc3R5bGUsIGludCBncmlkRGF0YVN0eWxlKSB7Ci0JCWNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgdGV4dExhYmVsKTsKLQkJcmV0dXJuIGNyZWF0ZUNvbWJvKHBhcmVudCwgc3R5bGUsIGdyaWREYXRhU3R5bGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21ib2JveCBjb250cm9sIHdpdGggYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCBmb3IgdGhlIExhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tYm9ib3g8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBDb21ibyBjcmVhdGVDb21ib1dpdGhMYWJlbChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGxhYmVsVGV4dCkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCk7Ci0JCXJldHVybiBjcmVhdGVDb21ibyhwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuRkxBVCB8IFNXVC5SRUFEX09OTFksCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tcG9zaXRlIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBzZWN0aW9uCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IHNlY3Rpb24uCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqLwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoRm9ybVRvb2xraXQgdG9vbGtpdCwgU2VjdGlvbiBzZWN0aW9uKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbXBvc2l0ZSBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gZ3JpZERhdGFTdHlsZQotCSAqICAgICAgICAgICAgVGhlIEdyaWREYXRhIHN0eWxlLgotCSAqIEBwYXJhbSB2ZXJ0aWNhbFNwYW4KLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2Ygcm93IGNlbGxzIHRha2VuIHVwIGJ5IHRoZSBDb21wb3NpdGUuCi0JICogQHBhcmFtIGhvcml6b250YWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0YWtlbiB1cCBieSB0aGUgQ29tcG9zaXRlLgotCSAqIEBwYXJhbSBudW1Db2x1bW5zCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGdyaWQuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IGdyaWREYXRhU3R5bGUsIGludCB2ZXJ0aWNhbFNwYW4sCi0JCQlpbnQgaG9yaXpvbnRhbFNwYW4sIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZERhdGFTdHlsZSk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IHZlcnRpY2FsU3BhbjsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KG51bUNvbHVtbnMsIGZhbHNlKSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbXBvc2l0ZSBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gdmVydGljYWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJvdyBjZWxscyB0YWtlbiB1cCBieSB0aGUgQ29tcG9zaXRlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCB2ZXJ0aWNhbFNwYW4pIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBwYXJlbnQsIEdyaWREYXRhLkZJTExfQk9USCwKLQkJCQl2ZXJ0aWNhbFNwYW4sIDEsIDEpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21wb3NpdGUgZm9yIGRpc3BsYXlpbmcgYnV0dG9ucyBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgVGhlIENvbXBvc2l0ZSB0eXBlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGVGb3JCdXR0b25zKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgcGFyZW50LCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSLCBTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIDEpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBleHBhbmRlZCBjb21wb3NpdGUgaW4gdGhlIGZvcm0KLQkgKiA8cD4KLQkgKiBVc2VkIHRvIGhvbGQgYW4gZXhwYW5kZWQgcmljaCB0ZXh0IGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVFeHBhbmRlZENvbXBvc2l0ZShGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZXhwYW5kZWRDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWV4cGFuZGVkQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJcmV0dXJuIGV4cGFuZGVkQ29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB0YWJsZSBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBUYWJsZSBzdHlsZS4KLQkgKiBAcGFyYW0gZ3JpZERhdGFTdHlsZQotCSAqICAgICAgICAgICAgVGhlIEdyaWREYXRhIHN0eWxlLgotCSAqIEBwYXJhbSBoZWlnaHQKLQkgKiAgICAgICAgICAgIFRoZSBoZWlnaHQgb2YgdGhlIFRhYmxlLgotCSAqIEBwYXJhbSB3aWR0aAotCSAqICAgICAgICAgICAgVGhlIHdpZHRoIG9mIHRoZSBUYWJsZS4KLQkgKiBAcGFyYW0gdmVydGljYWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJvdyBjZWxscyB0YWtlbiB1cCBieSB0aGUgVGFibGUuCi0JICogQHBhcmFtIGhvcml6b250YWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0YWtlbiB1cCBieSB0aGUgVGFibGUuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UYWJsZTwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUYWJsZSBjcmVhdGVUYWJsZShGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IHN0eWxlLCBpbnQgZ3JpZERhdGFTdHlsZSwgaW50IGhlaWdodCwgaW50IHdpZHRoLAotCQkJaW50IHZlcnRpY2FsU3BhbiwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCVRhYmxlIHRhYmxlID0gdG9vbGtpdC5jcmVhdGVUYWJsZShwYXJlbnQsIHN0eWxlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZERhdGFTdHlsZSk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBoZWlnaHQ7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IHdpZHRoOwotCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSB2ZXJ0aWNhbFNwYW47Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCXRhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRhYmxlIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICBUaGUgdGFibGUgdGFibGUuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UYWJsZTwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUYWJsZSBjcmVhdGVUYWJsZShGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IHR5cGUpIHsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgU01BTExfU0laRToKLQkJCXJldHVybiBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCQk1NiwgMjAwLCAxLCAxKTsKLQkJY2FzZSBNRURJVU1fU0laRToKLQkJCXJldHVybiBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCQkxMTIsIDIwMCwgMSwgMSk7Ci0JCWNhc2UgTEFSR0VfU0laRToKLQkJCXJldHVybiBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCQkyMDAsIDIwMCwgMSwgMSk7Ci0JCWNhc2UgU0lOR0xFX1JPVzoKLQkJCXJldHVybiBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSwKLQkJCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCAyMCwgMjAwLCAxLCAxKTsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBidXR0b24gb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIFRoZSBidXR0b24gdHlwZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkJ1dHRvbjwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBCdXR0b24gY3JlYXRlQnV0dG9uKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgdHlwZSkgewotCQlCdXR0b24gYnV0dG9uOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBBRERfQlVUVE9OOgotCQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlBdXRob3JpbmdVSVRleHQuQUREX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCQlicmVhazsKLQkJY2FzZSBSRU1PVkVfQlVUVE9OOgotCQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlBdXRob3JpbmdVSVRleHQuUkVNT1ZFX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCQlicmVhazsKLQkJY2FzZSBVUF9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5VUF9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRE9XTl9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5ET1dOX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUkRFUl9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5PUkRFUl9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0VMRUNUX0JVVFRPTjoKLQkJCWJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0LlNFTEVDVF9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0xFQVJfQlVUVE9OOgotCQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlBdXRob3JpbmdVSVRleHQuQ0xFQVJfQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJCWJyZWFrOwotCQljYXNlIEFUVEFDSF9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5BVFRBQ0hfQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJCWJyZWFrOwotCQljYXNlIEFUVEFDSF9VUkxfQlVUVE9OOgotCQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlBdXRob3JpbmdVSVRleHQuQVRUQUNIX1VSTF9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQkJYnJlYWs7CQkKLQkJY2FzZSBERVRBQ0hfQlVUVE9OOgotCQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlBdXRob3JpbmdVSVRleHQuREVUQUNIX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGhlaWdodCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcmV0dXJuCi0JICogCQlIZWlnaHQgb2YgdGhlIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIGludCBnZXRSaWNoVGV4dEVkaXRvckhlaWdodCgpIHsKLQkJcmV0dXJuIGZvcm0uZ2V0Qm91bmRzKCkuaGVpZ2h0IC0gMyAqIDMyOwotCX0KLQotCS8qKgotCSAqIEdldCB3aWR0aCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcmV0dXJuCi0JICogCQlXaWR0aCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKSB7Ci0JCXJldHVybiBmb3JtLmdldEJvdW5kcygpLndpZHRoIC0gMiAqIDMyOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NhdGVnb3J5R3VpZGFuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NhdGVnb3J5R3VpZGFuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOGFmN2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9DYXRlZ29yeUd1aWRhbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkd1aWRhbmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBHdWlkYW5jZSBwYWdlIGluIHRoZSBjb250ZW50IGVsZW1lbnQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICogVE9ETyAtIGNoYW5nZSBuYW1lIG9mIGNsYXNzIHRvIENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeUd1aWRhbmNlUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJjYXRlZ29yeUd1aWRhbmNlc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDYXRlZ29yeUd1aWRhbmNlUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkdVSURBTkNFX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTIodHJ1ZSk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJTGlzdCBsaXN0ID0gTWV0aG9kRWxlbWVudFV0aWwKLQkJCQkJCS5nZXRTZWxlY3RlZEd1aWRhbmNlcyhjb250ZW50RWxlbWVudCk7Ci0JCQkJTGlzdCBsb2NhbCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFByYWN0aWNlCi0JCQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IgJiYgY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUb29sKSB8fCBvYmoKLQkJCQkJCQkuZXF1YWxzKGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSkpIHsKLQkJCQkJCWxvY2FsLmFkZChvYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBsb2NhbC50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUd1aWRhbmNlIGl0ZW0gPSAoR3VpZGFuY2UpIGl0Lm5leHQoKTsKLQotCQkJCS8vIEd1aWRhbmNlIGZvciBjb250ZW50IGVsZW1lbnQuCi0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCShDaGVja2xpc3QpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQkoQ29uY2VwdCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwKLQkJCQkJCQkoRXhhbXBsZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwKLQkJCQkJCQkoU3VwcG9ydGluZ01hdGVyaWFsKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJCQkoR3VpZGVsaW5lKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCQkJCQkoUmV1c2FibGVBc3NldCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gYWRkIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkidG8gIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgY29udGVudEVsZW1lbnQuZ2V0VHlwZSgpCi0JCQkJCQkJCQkJCQkJLmdldE5hbWUoKQotCQkJCQkJCQkJCQkrICI6IiArIGNvbnRlbnRFbGVtZW50LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBHdWlkYW5jZSBmb3IgdGhlIG1ldGhvZCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksCi0JCQkJCQkJKENvbmNlcHQpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksCi0JCQkJCQkJKEV4YW1wbGUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCQkJKEd1aWRlbGluZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksCi0JCQkJCQkJKFJldXNhYmxlQXNzZXQpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkiVW5hYmxlIHRvIHJlbW92ZSBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJImZyb20gIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgY29udGVudEVsZW1lbnQuZ2V0VHlwZSgpCi0JCQkJCQkJCQkJCQkJLmdldE5hbWUoKQotCQkJCQkJCQkJCQkrICI6IiArIGNvbnRlbnRFbGVtZW50LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJfQotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgR3VpZGFuY2VGaWx0ZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ2hlY2tsaXN0SXRlbXNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NoZWNrbGlzdEl0ZW1zUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODZjOGRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ2hlY2tsaXN0SXRlbXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLlNlY3Rpb25zT3JkZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5FZGl0b3JzQ29udGV4dEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuVUlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5BZGRUb1NlY3Rpb25MaXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuUmVtb3ZlRnJvbVNlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMuSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkltYWdlSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci0KLQotLyoqCi0gKiBUaGUgQ2hlY2sgSXRlbSBwYWdlIGluIHRoZSBDaGVja2xpc3QgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENoZWNrbGlzdEl0ZW1zUGFnZSBleHRlbmRzIEJhc2VGb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImNoZWNrbGlzdENoZWNrSXRlbXNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfbmFtZTsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfYWRkLCBjdHJsX2RlbGV0ZSwgY3RybF91cCwgY3RybF9kb3duLCBjdHJsX29yZGVyOwotCi0JcHJpdmF0ZSBUYWJsZSBjdHJsX2NoZWNrSXRlbXM7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIGNoZWNrSXRlbXNUYWJsZVZpZXdlcjsKLQotCXByaXZhdGUgU2VjdGlvbkxpc3QgYWxsY2hlY2tJdGVtczsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGFjdGl2ZUNvbnRyb2w7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGVzY0V4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0RWRpdG9yIGN0cmxfZXhwYW5kZWQ7Ci0KLQlwcml2YXRlIEltYWdlSHlwZXJsaW5rIGV4cGFuZExpbms7Ci0KLQlwcml2YXRlIExhYmVsIGV4cGFuZExhYmVsOwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gZm9ybVNlY3Rpb247Ci0JcHJpdmF0ZSBTZWN0aW9uIGdlbmVyYWxTZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlOwotCXByaXZhdGUgQ29tcG9zaXRlIGdlbmVyYWxDb21wb3NpdGU7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBleHBhbmRlZENvbXBvc2l0ZTsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfbWFpbmRlc2M7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNoZWNrSXRlbXNWaWV3ZXJDb250ZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGNoZWNrSXRlbXNWaWV3ZXJMYWJlbFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBDaGVja2xpc3QgY2hlY2tsaXN0OwotCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24gY3VycmVudEl0ZW07Ci0KLQlwcml2YXRlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGliTGlzdGVuZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBjb250ZW50TW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENoZWNrbGlzdEl0ZW1zUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkNIRUNLX0lURU1TX1RFWFQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5CYXNlRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgbWV0aG9kRWxlbWVudElucHV0ID0gKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCWNoZWNrbGlzdCA9IChDaGVja2xpc3QpIG1ldGhvZEVsZW1lbnRJbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGZvcm0gY29udGVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQlzdXBlci5jcmVhdGVGb3JtQ29udGVudChtYW5hZ2VkRm9ybSk7Ci0KLQkJU3RyaW5nIGVsZW1lbnRMYWJlbCA9IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0KG1ldGhvZEVsZW1lbnQpOwotCQlmb3JtLnNldFRleHQoTGlicmFyeVVJVGV4dC5URVhUX0dVSURBTkNFCi0JCQkJKyAiICgiICsgZWxlbWVudExhYmVsICsgIik6ICIgKyBtZXRob2RFbGVtZW50LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkKLQkJZm9ybVNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksIFNlY3Rpb24uTk9fVElUTEUpOwotCQl7Ci0JCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQkJZm9ybVNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRMYXlvdXQobmV3IFRhYmxlV3JhcExheW91dCgpKTsKLQkJfQotCQkvLyBDcmVhdGUgdGhlIGNvbXBvc2l0ZSBmb3IgdGhlIHNlY3Rpb25zLgotCQlzZWN0aW9uQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZm9ybVNlY3Rpb24sIFNXVC5OT05FKTsKLQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKSk7Ci0JCXNlY3Rpb25Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBUYWJsZVdyYXBMYXlvdXQoKSk7Ci0JCWZvcm1TZWN0aW9uLnNldENsaWVudChzZWN0aW9uQ29tcG9zaXRlKTsKLQotCQkvLyBDcmVhdGUgdGhlIEdlbmVyYWwgSW5mb3JtYXRpb24gc2VjdGlvbi4KLQkJZ2VuZXJhbFNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQlTZWN0aW9uLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUKLQkJCQkJCXwgU2VjdGlvbi5FWFBBTkRFRCk7Ci0JCWdlbmVyYWxTZWN0aW9uCi0JCQkJLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuQ0hFQ0tfSVRFTVNfU0VDVElPTl9OQU1FKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlUZXh0LkNIRUNLX0lURU1TX1NFQ1RJT05fREVTQyk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlnZW5lcmFsQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZ2VuZXJhbFNlY3Rpb24pOwotCQlnZW5lcmFsQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlnZW5lcmFsQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCg0LCBmYWxzZSkpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRDbGllbnQoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0KLQkJRWRpdG9yc0NvbnRleHRIZWxwZXIuc2V0SGVscChnZW5lcmFsQ29tcG9zaXRlLmdldFBhcmVudCgpLCBjaGVja2xpc3QpOwotCi0JCUNvbXBvc2l0ZSBwYW5lMSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxDb21wb3NpdGUpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEudmVydGljYWxTcGFuID0gMTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJCXBhbmUxLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJcGFuZTEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQl9Ci0KLQkJTGFiZWwgbF9uYW1lID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYW5lMSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQ0hFQ0tfSVRFTVNfVEVYVCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQlsX25hbWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQljdHJsX2NoZWNrSXRlbXMgPSB0b29sa2l0LmNyZWF0ZVRhYmxlKHBhbmUxLCBTV1QuTVVMVEkpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDE1MDsKLQkJCWN0cmxfY2hlY2tJdGVtcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWluaXRQcm92aWRlcnMoKTsKLQotCQljaGVja0l0ZW1zVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9jaGVja0l0ZW1zKTsKLQkJY2hlY2tJdGVtc1RhYmxlVmlld2VyCi0JCQkJLnNldENvbnRlbnRQcm92aWRlcihjaGVja0l0ZW1zVmlld2VyQ29udGVudFByb3ZpZGVyKTsKLQkJY2hlY2tJdGVtc1RhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIoY2hlY2tJdGVtc1ZpZXdlckxhYmVsUHJvdmlkZXIpOwotCi0JCUNvbXBvc2l0ZSBwYW5lMiA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxDb21wb3NpdGUpOwotCQlwYW5lMi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKSk7Ci0JCXBhbmUyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQljdHJsX2FkZCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhbmUyLCBBdXRob3JpbmdVSVRleHQuQUREX0JVVFRPTl9URVhULAotCQkJCVNXVC5OT05FKTsKLQkJY3RybF9hZGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3RybF9kZWxldGUgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYW5lMiwKLQkJCQlBdXRob3JpbmdVSVRleHQuREVMRVRFX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCWN0cmxfZGVsZXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljdHJsX2RlbGV0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQljdHJsX3VwID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFuZTIsIEF1dGhvcmluZ1VJVGV4dC5VUF9CVVRUT05fVEVYVCwKLQkJCQlTV1QuTk9ORSk7Ci0JCWN0cmxfdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJY3RybF9kb3duID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFuZTIsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRPV05fQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJY3RybF9kb3duLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJY3RybF9vcmRlciA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhbmUyLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5PUkRFUl9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQljdHJsX29yZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCS8vIG5hbWUKLQkJTGFiZWwgbmFtZUxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5OQU1FX1RFWFQpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQkJbmFtZUxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCWN0cmxfbmFtZSA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIiwgU1dULlNJTkdMRSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gNDsKLQkJCWN0cmxfbmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWNyZWF0ZUJsYW5rTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgNCk7Ci0JCQotCQljdHJsX21haW5kZXNjID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmsoCi0JCQkJdG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1RFWFQsCi0JCQkJMjUwLCAzMDAsIDQpOwotCi0JCWNyZWF0ZVJpY2hUZXh0RWRpdG9yU2VjdGlvbigpOwotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTIpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihnZW5lcmFsQ29tcG9zaXRlKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZXhwYW5kZWRDb21wb3NpdGUpOwotCi0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQkJbG9hZERhdGEoKTsKLQkJZW5hYmxlQ29udHJvbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlicmFyeSBhbmQgc2VsZWN0aW9uIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlmaW5hbCBNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQkJY29udGVudE1vZGlmeUxpc3RlbmVyID0gZWRpdG9yLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKGN1cnJlbnRJdGVtKTsKLQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCS5zZXREaXNhYmxlKHRydWUpOwotCi0JCWZvcm0uYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0vLwkJCQlJU3RhdHVzIHN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KChFT2JqZWN0KSBjaGVja2xpc3QsCi0vLwkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLS8vCQkJCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0vLwkJCQkJbG9hZERhdGEoKTsKLS8vCQkJCX0KLQkJCQlpZiAoZm9ybSAhPSBudWxsICYmICFmb3JtLmlzRGlzcG9zZWQoKSkgewotCQkJCQlVSUhlbHBlci5zZXRGb3JtVGV4dChmb3JtLCBjb250ZW50RWxlbWVudCk7Ci0JCQkJfQotCQkJCWxvYWREYXRhKCk7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWVuYWJsZUNvbnRyb2xzKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX2FkZC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQljaGVja1NlbGVjdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZm9ybS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWRlYWN0aXZhdGUoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZm9ybS5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJaWYgKGN0cmxfZXhwYW5kZWQgIT0gbnVsbCkgewotCQkJCQkoKEdyaWREYXRhKSBjdHJsX2V4cGFuZGVkLmdldExheW91dERhdGEoKSkuaGVpZ2h0SGludCA9IGdldFJpY2hUZXh0RWRpdG9ySGVpZ2h0KCk7Ci0JCQkJCSgoR3JpZERhdGEpIGN0cmxfZXhwYW5kZWQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCk7Ci0JCQkJfQotCQkJCWZvcm1TZWN0aW9uLmxheW91dCh0cnVlLCB0cnVlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY29udHJvbE1vdmVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX25hbWUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWlmIChjdXJyZW50SXRlbSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGROYW1lID0gY3VycmVudEl0ZW0uZ2V0TmFtZSgpOwotCQkJCQlTdHJpbmcgbmV3TmFtZSA9IGN0cmxfbmFtZS5nZXRUZXh0KCk7Ci0JCQkJCS8vbmV3TmFtZSA9IFN0clV0aWwubWFrZVZhbGlkRmlsZU5hbWUobmV3TmFtZSk7Ci0JCQkJCWlmIChjdHJsX25hbWUuZ2V0VGV4dCgpID09IG51bGwKLQkJCQkJCQl8fCBjdHJsX25hbWUuZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lRGlhbG9nX3RpdGxlLCBMaWJyYXJ5VUlUZXh0LlRFWFRfQ0hFQ0tfSVRFTSk7IAotCQkJCQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZywgU3RyVXRpbC50b0xvd2VyKExpYnJhcnlVSVRleHQuVEVYVF9DSEVDS19JVEVNKSk7IAotCQkJCQkJaWYgKG9sZE5hbWUgIT0gbnVsbCAmJiBvbGROYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJCQkJCQkuZ2V0QWN0aW9uQmFycygpCi0JCQkJCQkJCQkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKQotCQkJCQkJCQkJLnNldEVycm9yTWVzc2FnZSgKLQkJCQkJCQkJCQkJUGxhdGZvcm1VSQotCQkJCQkJCQkJCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkJCS5nZXRTaGFyZWRJbWFnZXMoKQotCQkJCQkJCQkJCQkJCS5nZXRJbWFnZSgKLQkJCQkJCQkJCQkJCQkJCUlTaGFyZWRJbWFnZXMuSU1HX09CSlNfRVJST1JfVFNLKSwKLQkJCQkJCQkJCQkJbXNnKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmICghb2xkTmFtZS5lcXVhbHMobmV3TmFtZSkpIHsKLQkJCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQljdXJyZW50SXRlbSwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJCQkJCQkJbmV3TmFtZSwgLTEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX21haW5kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfbWFpbmRlc2MuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlzYXZlTWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNoZWNrSXRlbXNUYWJsZVZpZXdlcgotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQljaGVja1NlbGVjdGlvbigpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJY3RybF9hZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uIGNoaWxkID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVTZWN0aW9uKCk7Ci0JCQkJU3RyaW5nIG5ld05hbWUgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCUF1dGhvcmluZ1VJVGV4dC5ORVdfRUxFTUVOVF9URVhULAotCQkJCQkJbmV3IFN0cmluZ1tdIHsgTGlicmFyeVVJVGV4dC5URVhUX0NIRUNLX0lURU0gfSk7Ci0JCQkJY2hpbGQuc2V0TmFtZShuZXdOYW1lKTsKLQkJCQlBZGRUb1NlY3Rpb25MaXN0Q29tbWFuZCBjbWQgPSBuZXcgQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQoCi0JCQkJCQljaGVja2xpc3QsIGNoaWxkLCBhbGxjaGVja0l0ZW1zKTsKLQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCWNoZWNrSXRlbXNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJY2hlY2tJdGVtc1RhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCWNoaWxkKSk7Ci0JCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJY3RybF9uYW1lLnNldFNlbGVjdGlvbigwLCBuZXdOYW1lLmxlbmd0aCgpKTsKLQkJCQlnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkKLQkJCQkJCS5zZXRFcnJvck1lc3NhZ2UoIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZGVsZXRlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKQotCQkJCQkJLnNldEVycm9yTWVzc2FnZSgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNoZWNrSXRlbXNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi50b0xpc3QoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbikgewotCQkJCQkJUmVtb3ZlRnJvbVNlY3Rpb25MaXN0IGNtZCA9IG5ldyBSZW1vdmVGcm9tU2VjdGlvbkxpc3QoCi0JCQkJCQkJCWNoZWNrbGlzdCwgKG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbikgbywKLQkJCQkJCQkJYWxsY2hlY2tJdGVtcyk7Ci0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNoZWNrSXRlbXNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJZWRpdEl0ZW0obnVsbCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfdXAuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjaGVja0l0ZW1zVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQotCQkJCUFycmF5TGlzdCBtb3ZlVXBJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlVXBJdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQlNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQgY21kID0gbmV3IE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCgKLQkJCQkJCWNoZWNrbGlzdCwgbW92ZVVwSXRlbXMsIGFsbGNoZWNrSXRlbXMsIDEpOwotCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0KLQkJCQljaGVja0l0ZW1zVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKGNoZWNrSXRlbXNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjaGVja2xpc3QpKSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQlpZiAoY2hlY2tJdGVtc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IGNoZWNrSXRlbXNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjaGVja2xpc3QpKSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZG93bi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNoZWNrSXRlbXNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCUFycmF5TGlzdCBtb3ZlRG93bkl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vdmVEb3duSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQoCi0JCQkJCQljaGVja2xpc3QsIG1vdmVEb3duSXRlbXMsIGFsbGNoZWNrSXRlbXMsIDApOwotCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0KLQkJCQljaGVja0l0ZW1zVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKGNoZWNrSXRlbXNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjaGVja2xpc3QpKSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQlpZiAoY2hlY2tJdGVtc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IGNoZWNrSXRlbXNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjaGVja2xpc3QpKSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfb3JkZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU2VjdGlvbnNPcmRlckRpYWxvZyBkbGcgPSBuZXcgU2VjdGlvbnNPcmRlckRpYWxvZygKLQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJCQljaGVja2xpc3QsCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5DaGVja2xpc3RPcmRlcl90aXRsZSwgCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5DaGVja2xpc3RPcmRlcl9kZXNjcmlwdGlvbiwgCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5DaGVja2xpc3RPcmRlcl9jaGVja2xpc3RpdGVtc190ZXh0KTsgCi0JCQkJZGxnLm9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlQ29udHJvbHMoYm9vbGVhbiBlZGl0YWJsZSkgewotCQljdHJsX25hbWUuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX21haW5kZXNjLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9hZGQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfZGVsZXRlLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljdHJsX3VwLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljdHJsX2Rvd24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfb3JkZXIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJaWYgKGN0cmxfZXhwYW5kZWQgIT0gbnVsbCkgewotCQkJY3RybF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCS8vIFNhdmUgdGhlIEl0ZW0gb3JkZXIuCi0JCWlmIChhbGxjaGVja0l0ZW1zICE9IG51bGwpIHsKLQkJCWFsbGNoZWNrSXRlbXMuYXBwbHkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBjb250cm9scyB3aXRoIGRhdGEgZnJvbSB0aGUgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWREYXRhKCkgewotCQlhbGxjaGVja0l0ZW1zID0gbnVsbDsKLQkJY2hlY2tJdGVtc1RhYmxlVmlld2VyLnNldElucHV0KGNoZWNrbGlzdCk7Ci0JCWNoZWNrSXRlbXNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCWVkaXRJdGVtKGN1cnJlbnRJdGVtKTsKLQl9Ci0KLQkvKioKLQkgKiBFZGl0IGN1cnJlbnQgSXRlbS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZWRpdEl0ZW0ob3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uIGl0ZW0pIHsKLQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0KLQkJaWYgKGN0cmxfbWFpbmRlc2MuZ2V0TW9kaWZpZWQoKSkgewotCQkJc2F2ZU1haW5EZXNjcmlwdGlvbigpOwotCQl9Ci0KLQkJY3VycmVudEl0ZW0gPSBpdGVtOwotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGN1cnJlbnRJdGVtICE9IG51bGwpIHsKLQkJCW5hbWUgPSBjdXJyZW50SXRlbS5nZXROYW1lKCk7Ci0JCQlkZXNjID0gY3VycmVudEl0ZW0uZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCk7Ci0JCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKQotCQkJCQkuc2V0RXJyb3JNZXNzYWdlKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWN0cmxfbmFtZS5zZXRUZXh0KG5hbWUgPT0gbnVsbCA/ICIiIDogbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9tYWluZGVzYy5zZXRUZXh0KGRlc2MgPT0gbnVsbCA/ICIiIDogZGVzYyk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9tYWluZGVzYy5zZXRNb2RhbE9iamVjdChjdXJyZW50SXRlbSk7Ci0JCWN0cmxfbWFpbmRlc2Muc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNlY3Rpb25fU2VjdGlvbkRlc2NyaXB0aW9uKCkpOwotCQlpZiAoaXRlbSA9PSBudWxsKSB7Ci0JCQkvLyBjbG9zZSBhbnkgRmluZC9SZXBsYWNlIGRpYWxvZyBvcGVuIGluIHRoZSBSVEUKLQkJCWN0cmxfbWFpbmRlc2MuZ2V0RmluZFJlcGxhY2VBY3Rpb24oKS5kaXNwb3NlKCk7Ci0JCX0KLQotCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkuc2V0RWxlbWVudChjdXJyZW50SXRlbSk7Ci0JCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCS5zZXREaXNhYmxlKGN1cnJlbnRJdGVtID09IG51bGwpOwotCi0JCWVuYWJsZUNvbnRyb2xzKCk7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlIG5hbWUgYW5kIGRlc2NyaXB0aW9uIGNvbnRyb2xzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZUNvbnRyb2xzKCkgewotCQlpZiAoY2hlY2tsaXN0LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuY29udGFpbnMoY3VycmVudEl0ZW0pKSB7Ci0JCQlpZiAoIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJY3RybF9uYW1lLnNldEVkaXRhYmxlKHRydWUpOwotCQkJCWN0cmxfbWFpbmRlc2Muc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQljdHJsX25hbWUuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJY3RybF9tYWluZGVzYy5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIGxpc3RlbmVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGxpYkxpc3RlbmVyICE9IG51bGwpIHsKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQltYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKGxpYkxpc3RlbmVyKTsKLQkJCX0KLQkJCWxpYkxpc3RlbmVyID0gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVSaWNoVGV4dEVkaXRvclNlY3Rpb24oKSB7Ci0JCWV4cGFuZGVkQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZm9ybVNlY3Rpb24sIFNXVC5OT05FKTsKLQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJLy8gSHlwZXJsaW5rIGRlc2MKLQkJZXhwYW5kTGluayA9IHRvb2xraXQuY3JlYXRlSW1hZ2VIeXBlcmxpbmsoZXhwYW5kZWRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZXhwYW5kTGluay5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfRVhQQU5ERUQpOwotCQlleHBhbmRMaW5rLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNsb3NlUlRFKTsgCi0JCWV4cGFuZExpbmsuc2V0VW5kZXJsaW5lZChmYWxzZSk7Ci0JCWV4cGFuZExpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQl0b2dnbGUoZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWV4cGFuZExhYmVsID0gY3JlYXRlRGVjb3JhdGVkTGFiZWwodG9vbGtpdCwgZXhwYW5kZWRDb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRvZ2dsZSBEZXNjcmlwdGlvbiBjb250cm9sIHRvIGV4cGFuZCBhbmQgY29udHJvbCBzdGF0ZQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5CYXNlRm9ybVBhZ2UjdG9nZ2xlKG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0b2dnbGUoSHlwZXJsaW5rRXZlbnQgZSkgewotCQlpZiAoY3VycmVudEl0ZW0gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGN0cmxfZXhwYW5kZWQgPT0gbnVsbCkgewotCQkJY3RybF9leHBhbmRlZCA9IGNyZWF0ZVJpY2hUZXh0RWRpdG9yKHRvb2xraXQsIGV4cGFuZGVkQ29tcG9zaXRlLAotCQkJCQlTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCQlnZXRSaWNoVGV4dEVkaXRvckhlaWdodCgpLCBnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCksIDIsIGV4cGFuZExhYmVsKTsKLQkJCWN0cmxfZXhwYW5kZWQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJfQotCi0JCWlmIChkZXNjRXhwYW5kRmxhZykgewotCQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRDbGllbnQoc2VjdGlvbkNvbXBvc2l0ZSk7Ci0JCQlJTWV0aG9kUmljaFRleHQgcmljaFRleHQgPSBnZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woKTsKLQkJCXJpY2hUZXh0LnNldFRleHQoY3RybF9leHBhbmRlZC5nZXRUZXh0KCkpOwotCQkJZm9yIChJdGVyYXRvciBpID0gcmljaFRleHQuZ2V0TGlzdGVuZXJzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoUmljaFRleHRMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJY3RybF9leHBhbmRlZC5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSwgbGlzdGVuZXIKLQkJCQkJCS5nZXRMaXN0ZW5lcigpKTsKLQkJCX0KLQkJCWlmIChjdHJsX2V4cGFuZGVkLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCQkJLnNhdmVNb2RpZmllZFJpY2hUZXh0KGN0cmxfZXhwYW5kZWQpOwotCQkJfQotCQkJcmljaFRleHQuc2V0Rm9jdXMoKTsKLQkJfSBlbHNlIHsKLQkJCXNlY3Rpb25Db21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJZm9ybVNlY3Rpb24uc2V0Q2xpZW50KGV4cGFuZGVkQ29tcG9zaXRlKTsKLQkJCWV4cGFuZExhYmVsLnNldFRleHQoY3VycmVudEl0ZW0uZ2V0TmFtZSgpICsKLQkJCQkJIiAtICIgKyAoU3RyaW5nKSAoKEltYWdlSHlwZXJsaW5rKSBlLmdldFNvdXJjZSgpKS5nZXREYXRhKCJUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlJTWV0aG9kUmljaFRleHQgcmljaFRleHQgPSAoSU1ldGhvZFJpY2hUZXh0KSBlLmdldEhyZWYoKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0SW5pdGlhbFRleHQocmljaFRleHQuZ2V0VGV4dCgpKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QocmljaFRleHQuZ2V0TW9kYWxPYmplY3QoKSk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0RmVhdHVyZShyaWNoVGV4dAotCQkJCQkuZ2V0TW9kYWxPYmplY3RGZWF0dXJlKCkpOwotCQkJY3RybF9leHBhbmRlZC5zZXRGaW5kUmVwbGFjZUFjdGlvbihyaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpKTsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHJpY2hUZXh0LmdldExpc3RlbmVycygpOyBpLmhhc05leHQoKTspIHsKLQkJCQlSaWNoVGV4dExpc3RlbmVyIGxpc3RlbmVyID0gKFJpY2hUZXh0TGlzdGVuZXIpIGkubmV4dCgpOwotCQkJCWN0cmxfZXhwYW5kZWQuYWRkTGlzdGVuZXIobGlzdGVuZXIuZ2V0RXZlbnRUeXBlKCksIGxpc3RlbmVyCi0JCQkJCQkuZ2V0TGlzdGVuZXIoKSk7Ci0JCQl9Ci0JCQlib29sZWFuIGVkaXRhYmxlID0gIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpOwotCQkJY3RybF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQlpZiAoZWRpdGFibGUpIHsKLQkJCQljdHJsX2V4cGFuZGVkLnNldEZvY3VzKCk7Ci0JCQl9Ci0JCQlzZXRBY3RpdmVSaWNoVGV4dENvbnRyb2wocmljaFRleHQpOwotCQl9Ci0KLQkJZm9ybS5nZXRCb2R5KCkubGF5b3V0KHRydWUsIHRydWUpOwotCQlkZXNjRXhwYW5kRmxhZyA9ICFkZXNjRXhwYW5kRmxhZzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0QWN0aXZlUmljaFRleHRDb250cm9sKElNZXRob2RSaWNoVGV4dCBlZGl0b3IpIHsKLQkJYWN0aXZlQ29udHJvbCA9IGVkaXRvcjsKLQl9Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBnZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woKSB7Ci0JCXJldHVybiBhY3RpdmVDb250cm9sOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UHJvdmlkZXJzKCkgewotCQljaGVja0l0ZW1zVmlld2VyQ29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYgKG9iamVjdCAhPSBjaGVja2xpc3QpCi0JCQkJCXJldHVybiBzdXBlci5nZXRFbGVtZW50cyhvYmplY3QpOwotCQkJCWlmIChhbGxjaGVja0l0ZW1zID09IG51bGwpIHsKLQkJCQkJYWxsY2hlY2tJdGVtcyA9IG5ldyBTZWN0aW9uTGlzdChjaGVja2xpc3QsCi0JCQkJCQkJU2VjdGlvbkxpc3QuU1RFUFNfRk9SX0VMRU1FTlRfT05MWSk7Ci0JCQkJfQotCQkJCXJldHVybiBhbGxjaGVja0l0ZW1zLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQljaGVja0l0ZW1zVmlld2VyTGFiZWxQcm92aWRlciA9IG5ldyBWYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gIWNoZWNrbGlzdC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmNvbnRhaW5zKAotCQkJCQkJZWxlbWVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVNYWluRGVzY3JpcHRpb24oKSB7Ci0JCWlmIChjdXJyZW50SXRlbSAhPSBudWxsKSB7Ci0JCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQk6IGN0cmxfbWFpbmRlc2M7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gY3VycmVudEl0ZW0uZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZShjb250cm9sLAotCQkJCQlvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgY3VycmVudEl0ZW0sCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN0aW9uX1NlY3Rpb25EZXNjcmlwdGlvbigpLAotCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGdldEFjdGlvbk1hbmFnZXIoKSB7Ci0JCUZvcm1FZGl0b3IgZWRpdG9yID0gZ2V0RWRpdG9yKCk7Ci0JCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yKSB7Ci0JCQlyZXR1cm4gKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tTZWxlY3Rpb24oKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY2hlY2tJdGVtc1RhYmxlVmlld2VyCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY2hlY2tsaXN0KSkgewotCQkJY3RybF9kZWxldGUuc2V0RW5hYmxlZCh0cnVlKTsKLQotCQkJaWYgKGNoZWNrSXRlbXNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNoZWNrbGlzdCkgJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCi0JCQlpZiAoY2hlY2tJdGVtc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IGNoZWNrSXRlbXNUYWJsZVZpZXdlcgotCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY2hlY2tsaXN0KSAmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCWVkaXRJdGVtKChvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24pIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db25maWdWaWV3UGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db25maWdWaWV3UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODVmZDZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29uZmlnVmlld1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkNvbmZpZ3VyYXRpb25BZGRWaWV3c0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuQ29uZmlndXJhdGlvbk9yZGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db25maWd1cmF0aW9uRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db25maWd1cmF0aW9uRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NWaWV3RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkNvbmZpZ3VyYXRpb25MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXdGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuRm9ybUNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TY3JvbGxlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotCi0KLS8qKgotICogUGFnZSBmb3IgY3VzdG9taXppbmcgcHVibGlzaGluZyB2aWV3cwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIGZpeCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MzgyNwotICogZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc0MjYwCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdWaWV3UGFnZSBleHRlbmRzIEZvcm1QYWdlIHsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgZm9ybVByZWZpeCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb247IAotCi0JcHJpdmF0ZSBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJpdmF0ZSBDVGFiRm9sZGVyIHRhYkZvbGRlcjsKLQlwcml2YXRlIENUYWJJdGVtIHRhYkRlZmF1bHR2aWV3SXRlbTsKLQotCXByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbiwgbWFrZURlZmF1bHRCdXR0b24sIG9yZGVyQnV0dG9uOwotCi0JcHJpdmF0ZSBPYmplY3Qgc2VsZWN0ZWRJdGVtID0gbnVsbDsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyID0gbnVsbDsKLQotCXByaXZhdGUgTG9nZ2VyIGxvZ2dlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIGVkaXRvcgotCSAqLwotCXB1YmxpYyBDb25maWdWaWV3UGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcigKLQkJCQllZGl0b3IsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdzLCBBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZV92aWV3cyk7IAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzZXRTaXRlKHNpdGUpOwotCQlzZXRJbnB1dChpbnB1dCk7Ci0KLQkJQ29uZmlndXJhdGlvbkVkaXRvcklucHV0IGNvbmZpZ0lucHV0ID0gKENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCWNvbmZpZyA9IGNvbmZpZ0lucHV0LmdldENvbmZpZ3VyYXRpb24oKTsKLQotCQlhY3Rpb25NZ3IgPSAoKENvbmZpZ3VyYXRpb25FZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0KLQkJLy8gZ2V0IHBsdWdpbiBsb2dnZXIKLQkJbG9nZ2VyID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2NyZWF0ZUZvcm1Db250ZW50KG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJU2Nyb2xsZWRGb3JtIGZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0JCWZvcm0uc2V0VGV4dChmb3JtUHJlZml4ICsgY29uZmlnLmdldE5hbWUoKSk7Ci0JCXRvb2xraXQgPSBtYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCk7Ci0JCWZvcm0uZ2V0Qm9keSgpLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQkvLyBDcmVhdGUgdGhlIHZpZXcgc2VjdGlvbi4KLQkJU2VjdGlvbiB2aWV3U2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwKLQkJCQlTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRAotCQkJCQkJfCBTZWN0aW9uLlRJVExFX0JBUik7Ci0JCUdyaWREYXRhIHRkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXZpZXdTZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQl2aWV3U2VjdGlvbgotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvblRpdGxlKTsgCi0JCXZpZXdTZWN0aW9uCi0JCQkJLnNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvbk1lc3NhZ2UpOyAKLQkJdmlld1NlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCUNvbXBvc2l0ZSBwYXJlbnQgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZSh2aWV3U2VjdGlvbik7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJdmlld1NlY3Rpb24uc2V0Q2xpZW50KHBhcmVudCk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQuZ2V0UGFyZW50KCksCi0JCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuQ09ORklHVVJBVElPTl9FRElUT1JfQUxMX0NPTlRFWFQpOwotCi0JCS8vIGNyZWF0ZSBidXR0b24gcGFuZQotCQljcmVhdGVCdXR0b25QYW5lKHBhcmVudCk7Ci0KLQkJLy8gY3JlYXRlIHRhYmZvbGRlciBwYW5lCi0JCWNyZWF0ZVRhYlBhbmUocGFyZW50KTsKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYXJlbnQpOwotCQlsb2FkRGF0YSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFiUGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRhYkZvbGRlciA9IG5ldyBDVGFiRm9sZGVyKHBhcmVudCwgU1dULkZMQVQgfCBTV1QuVE9QIHwgU1dULkJPUkRFUik7Ci0JCXRhYkZvbGRlci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXRhYkZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBzZXQgdGFiZm9sZGVyIGJhY2tncm91bmQgY29sb3IKLQkJQ29sb3Igc2VsZWN0ZWRDb2xvciA9IHRvb2xraXQuZ2V0Q29sb3JzKCkuZ2V0Q29sb3IoRm9ybUNvbG9ycy5UQl9CRyk7Ci0JCXRhYkZvbGRlci5zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKG5ldyBDb2xvcltdIHsgc2VsZWN0ZWRDb2xvciwgdG9vbGtpdC5nZXRDb2xvcnMoKS5nZXRCYWNrZ3JvdW5kKCkgfSwgbmV3IGludFtdIHsgNTAgfSk7Ci0JCQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcih0YWJGb2xkZXIpOwotCi0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVCdXR0b25QYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGJ1dHRvblBhbmUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotCQlidXR0b25QYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlidXR0b25QYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCg0LCBmYWxzZSkpOwotCi0JCUJ1dHRvbiBhZGRCdXR0b24gPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUJ1dHRvbigKLQkJCQkJCWJ1dHRvblBhbmUsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZV9hZGRWaWV3QnV0dG9uVGV4dCwgU1dULk5PTkUpOyAKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2cgZmQgPSBuZXcKLQkJCQkvLyBDb25maWdQcm9jZXNzVmlld0RpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJLy8gY29uZmlnKTsKLQkJCQkvLyBDb25maWdQcm9jZXNzVmlld0RpYWxvZy5zZXREZWZhdWx0SW1hZ2UoRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKS5nZXRJbWFnZSgpKTsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBQcm9jZXNzVmlld0ZpbHRlcihjb25maWcsIG51bGwsCi0JCQkJCQlGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTKTsKLQkJCQlDb25maWd1cmF0aW9uQWRkVmlld3NEaWFsb2cgZmQgPSBuZXcgQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nKAotCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQkJZmQuc2V0VHlwZXMoZ2V0VHlwZXMoKSk7Ci0JCQkJZmQKLQkJCQkJCS5zZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWdQcm9jZXNzVmlld0RpYWxvZ19TZWxlY3RDYXRlZ29yaWVzKTsgCi0JCQkJZmQuc2V0SW5wdXQoY29uZmlnKTsKLQkJCQlmZC5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCQlmZC5zZXRFeGlzdGluZ0VsZW1lbnRzKGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKSk7Ci0JCQkJZmQuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpKSwKLQkJCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0SXRlbXNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlmZC5vcGVuKCk7Ci0JCQkJTGlzdCB2aWV3cyA9IGZkLmdldFNlbGVjdGVkSXRlbXMoKTsKLQotCQkJCS8vIGFkZCB2aWV3IHRvIGNvbmZpZ3VyYXRpb24KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB2aWV3cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0KLQkJCQkJCWlmIChjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCkuY29udGFpbnMoCi0JCQkJCQkJCShDb250ZW50Q2F0ZWdvcnkpIG9iaikpIHsKLQkJCQkJCQlTdHJpbmcgbmFtZSA9ICgoQ29udGVudENhdGVnb3J5KSBvYmopLmdldE5hbWUoKTsKLQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZVZpZXdFeGlzdHNEaWFsb2dfdGl0bGU7IAotCQkJCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZVZpZXdFeGlzdHNEaWFsb2dfbWVzc2FnZSwgbmFtZSk7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheVdhcm5pbmcodGl0bGUsIG1lc3NhZ2UpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCWNvbmZpZywKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpLAotCQkJCQkJCQkJKENvbnRlbnRDYXRlZ29yeSkgb2JqLCAtMSk7Ci0JCQkJCQkJaWYoc3RhdHVzKXsKLQkJCQkJCQkJYWRkVmlldygoQ29udGVudENhdGVnb3J5KSBvYmopOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJLy8gcmVtb3ZlIGJ1dHRvbgotCQlyZW1vdmVCdXR0b24gPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUJ1dHRvbigKLQkJCQkJCWJ1dHRvblBhbmUsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZV9yZW1vdmVWaWV3QnV0dG9uVGV4dCwgU1dULk5PTkUpOyAKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlyZW1vdmVWaWV3KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIG1ha2UgZGVmYXVsdCBidXR0b24KLQkJbWFrZURlZmF1bHRCdXR0b24gPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUJ1dHRvbigKLQkJCQkJCWJ1dHRvblBhbmUsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZV9tYWtlRGVmYXVsdEJ1dHRvblRleHQsIFNXVC5OT05FKTsgCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQltYWtlRGVmYXVsdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQltYWtlRGVmYXVsdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJbWFrZURlZmF1bHRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbWFrZURlZmF1bHRWaWV3KCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJb3JkZXJCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbigKLQkJCQlidXR0b25QYW5lLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm9yZGVyQnV0dG9uX3RleHQsIFNXVC5OT05FKTsgCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlyZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJb3JkZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlDb25maWd1cmF0aW9uT3JkZXJEaWFsb2cgZGxnID0gbmV3IENvbmZpZ3VyYXRpb25PcmRlckRpYWxvZygKLQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJCQljb25maWcsCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkpOwotCQkJCWludCByZXQgPSBkbGcub3BlbigpOwotCQkJCWlmKHJldCA9PSBXaW5kb3cuT0spIHJlZnJlc2goKTsKLQkJCX0KLQkJfSk7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoYnV0dG9uUGFuZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzZWxlY3RlZCB2aWV3Ci0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVZpZXcoKSB7Ci0JCUNUYWJJdGVtIGl0ZW0gPSB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChpdGVtID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQkvLyBkb24ndCBjaGFuZ2UgZGVmYXVsdCB2aWV3IGlmIHRoZSB2aWV3IGlzIG5vdCByZW1vdmVkLgotCQkvLyAxNTUwMjUgLSBlcnJvciB3aGVuIHJlbW92aW5nIHRoZSB2aWV3IGluIGNvbmZpZ3VyYXRpb24KLQkJU3RyaW5nIGl0ZW1UZXh0ID0gaXRlbS5nZXRUZXh0KCk7CQkKLQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX3RpdGxlOyAKLQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ19tZXNzYWdlLCBpdGVtIAotCQkuZ2V0VGV4dCgpKTsKLQkJYm9vbGVhbiByZXQgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbih0aXRsZSwgbWVzc2FnZSk7Ci0KLQkJaWYgKCFyZXQpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJYm9vbGVhbiByZW1vdmVEZWZhdWx0ID0gZmFsc2U7Ci0JCWlmICh0YWJEZWZhdWx0dmlld0l0ZW0gIT0gbnVsbCAmJiBpdGVtID09IHRhYkRlZmF1bHR2aWV3SXRlbSkgewotCQkJcmVtb3ZlRGVmYXVsdCA9IHRydWU7Ci0JCX0KLQotCQkJTGlzdCB2aWV3cyA9IGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKTsKLQkJCS8vIGlmIHRoZXJlIGlzIGEgZGVmYXVsdCB2aWV3IHRhYiwgYW5kIGl0J3MgdGhlIG9uZSBzbGVjdGVkIHRvIGJlIHJlbW92ZWQKLQkJCWlmIChyZW1vdmVEZWZhdWx0KSB7Ci0JCQkJU3RyaW5nIGRlZmF1bHRUZXh0ID0gIiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fZGVmYXVsdDsgCi0JCQkJaW50IGlkeCA9IGl0ZW1UZXh0Lmxhc3RJbmRleE9mKGRlZmF1bHRUZXh0KTsKLQkJCQlpZiAoaWR4ID4gMCkgewotCQkJCQlpdGVtVGV4dCA9IGl0ZW1UZXh0LnN1YnN0cmluZygwLGlkeCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB2aWV3cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ29udGVudENhdGVnb3J5KSBpdG9yLm5leHQoKTsKLQkJCQkKLQkJCQlpZiAoY2F0ZWdvcnkuZ2V0TmFtZSgpLmVxdWFscyhpdGVtVGV4dCkpIHsKLQkJCQkJLy8gcmVtb3ZlIGl0IGZyb20gdmlld3MKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgY29uZmlnLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlld3MoKSwKLQkJCQkJCQljYXRlZ29yeSwgLTEpOwotCi0JCQkJCUNvbnRlbnRDYXRlZ29yeSBkZWZhdWx0VmlldyA9IGNvbmZpZy5nZXREZWZhdWx0VmlldygpOwotCi0JCQkJCWlmICgoZGVmYXVsdFZpZXcgIT0gbnVsbCkgJiYgKGRlZmF1bHRWaWV3LmVxdWFscyhjYXRlZ29yeSkpKSB7Ci0JCQkJCQlpZiAodmlld3Muc2l6ZSgpID4gMCkgewotCQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCWNvbmZpZywKLQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpLAotCQkJCQkJCQkJCQkoQ29udGVudENhdGVnb3J5KSB2aWV3cy5nZXQoMCksIC0xKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQkJY29uZmlnLAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCksCi0JCQkJCQkJCQkJCW51bGwsIC0xKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyByZW1vdmUgdGFiIGl0ZW0KLQkJCQkJaXRlbS5kaXNwb3NlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQl2aWV3cyA9IGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKTsKLQkJaWYgKCh2aWV3cyA9PSBudWxsKSB8fCAodmlld3Muc2l6ZSgpIDw9IDApKSB7Ci0JCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQltYWtlRGVmYXVsdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCQkKLQkJLy8gbWFrZSB0aGUgMXN0IHRhYiBhcyB0aGUgZGVmYXVsdCB2aWV3IGlmIHRoZSBkZWZhdWx0IG9uZSBpcyByZW1vdmVkCi0JCWlmIChyZW1vdmVEZWZhdWx0KSB7Ci0JCQlDb250cm9sW10gdGFiTGlzdCA9IHRhYkZvbGRlci5nZXRUYWJMaXN0KCk7Ci0JCQlpZiAodGFiTGlzdCAhPSBudWxsICYmIHRhYkxpc3QubGVuZ3RoID4gMCkgewotCQkJCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oMCk7Ci0JCQkJbWFrZURlZmF1bHRWaWV3KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdmlldwotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVmlldyhDb250ZW50Q2F0ZWdvcnkgb2JqKSB7Ci0JCXNlbGVjdGVkSXRlbSA9IG9iajsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCVRyZWVWaWV3ZXIgdHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGNvbXBvc2l0ZSwgU1dULkhfU0NST0xMCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlJRmlsdGVyIGNvbmZpZ0ZpbHRlciA9IG5ldyBDb25maWd1cmF0aW9uVmlld0ZpbHRlcihjb25maWcsIHRyZWVWaWV3ZXIpOwotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldENvbmZpZ3VyYXRpb25WaWV3X0FkYXB0ZXJGYWN0b3J5KGNvbmZpZ0ZpbHRlcik7Ci0KLQkJQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCWFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCS8vIEdldCB0aGUgYWRhcHRlciBmcm9tIHRoZSBmYWN0b3J5LgotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJLmFkYXB0KHNlbGVjdGVkSXRlbSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQotCQkJCXJldHVybiBpdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oc2VsZWN0ZWRJdGVtKS50b0FycmF5KCk7Ci0JCQkJLy8gcmV0dXJuIGl0ZW1Qcm92aWRlci5nZXRFbGVtZW50cyhzZWxlY3RlZEl0ZW0pLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IENvbmZpZ3VyYXRpb25MYWJlbFByb3ZpZGVyKGNvbmZpZywKLQkJCQlhZGFwdGVyRmFjdG9yeSkpOwotCQl0cnkgewotCQkJdHJlZVZpZXdlci5zZXRJbnB1dChjb25maWcpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcigiRXJyb3IgY3JlYXRpbmcgdHJlZXZpZXdlciBmb3IgY29uZmlnIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlDVGFiSXRlbSBpdGVtID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlciwgU1dULlRPUCk7Ci0JCWl0ZW0uc2V0VGV4dCgoKENvbnRlbnRDYXRlZ29yeSkgb2JqKS5nZXROYW1lKCkpOwotCQlpdGVtLnNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQkvLyBtYWtlIGFsbCBidXR0b25zIGVuYWJsZWQKLQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCW1ha2VEZWZhdWx0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlKTsKLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbihpdGVtKTsKLQl9Ci0KLQkvKioKLQkgKiBNYWtlIHNlbGVjdGVkIGFzIGRlZmF1bHQgdmlldwotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBtYWtlRGVmYXVsdFZpZXcoKSB7Ci0JCUNUYWJJdGVtIGl0ZW0gPSB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCUxpc3Qgdmlld3MgPSBjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHZpZXdzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJQ29udGVudENhdGVnb3J5IGNhdGVnb3J5ID0gKENvbnRlbnRDYXRlZ29yeSkgaXRvci5uZXh0KCk7Ci0JCQlpZiAoY2F0ZWdvcnkuZ2V0TmFtZSgpLmVxdWFscyhpdGVtLmdldFRleHQoKSkpIHsKLQkJCQljbGVhckRlZmF1bHRWaWV3SW5kaWNhdG9yKCk7Ci0JCQkJLy8gbWFrZSB0aGF0IHZpZXcgZGVmYXVsdAotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGNvbmZpZywKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCksCi0JCQkJCQljYXRlZ29yeSwgLTEpOwotCQkJCXNldERlZmF1bHRWaWV3SW5kaWNhdG9yKGl0ZW0pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZCBpbml0aWFsIGRhdGEKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERhdGEoKSB7Ci0JCS8vIGdldCBwcm9jZXNzIHZpZXdzCi0JCUxpc3Qgdmlld3MgPSBjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHZpZXdzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJLy8gY3JlYXRlIHZpZXcgaW4gVUkKLQkJCWFkZFZpZXcoKENvbnRlbnRDYXRlZ29yeSkgaXRvci5uZXh0KCkpOwotCQl9Ci0KLQkJLy8gZ2V0IGRlZmF1bHQgdmlldwotCQlDb250ZW50Q2F0ZWdvcnkgZGVmYXVsdFZpZXcgPSBjb25maWcuZ2V0RGVmYXVsdFZpZXcoKTsKLQkJaW50IGNudCA9IHRhYkZvbGRlci5nZXRJdGVtQ291bnQoKTsKLQkJaWYgKGRlZmF1bHRWaWV3ICE9IG51bGwpIHsKLQkJCS8vIGlmIGRlZmF1bHQgdmlldyBpcyBkZWZpbmVkLCBzZWxlY3QgdGhhdCB2aWV3Ci0JCQlDVGFiSXRlbVtdIGl0ZW1zID0gdGFiRm9sZGVyLmdldEl0ZW1zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBpdGVtc1tpXS5nZXRUZXh0KCk7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKGRlZmF1bHRWaWV3LmdldE5hbWUoKSkpIHsKLQkJCQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbihpdGVtc1tpXSk7Ci0JCQkJCXNldERlZmF1bHRWaWV3SW5kaWNhdG9yKGl0ZW1zW2ldKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGNudCA+IDApIHsKLQkJCS8vIGVsc2Ugc2VsZWN0IGZpcnN0IHZpZXcKLQkJCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oMCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2goKXsKLQkJQ29udGVudENhdGVnb3J5IGRlZmF1bHRWaWV3ID0gY29uZmlnLmdldERlZmF1bHRWaWV3KCk7Ci0JCVN0cmluZyBkZWZhdWx0Vmlld05hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZihkZWZhdWx0VmlldyE9bnVsbCkgewotCQkJZGVmYXVsdFZpZXdOYW1lID0gZGVmYXVsdFZpZXcuZ2V0TmFtZSgpOwotCQkJY2xlYXJEZWZhdWx0Vmlld0luZGljYXRvcigpOwotCQl9Ci0JCVN0cmluZyBzZWxlY3RlZFZpZXcgPSB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkuZ2V0VGV4dCgpOwotCQlNYXAgb3JpZ1ZpZXdzID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yKGludCBpPTA7aTx0YWJGb2xkZXIuZ2V0SXRlbUNvdW50KCk7aSsrKXsKLQkJCUNUYWJJdGVtIGl0ZW0gPSB0YWJGb2xkZXIuZ2V0SXRlbShpKTsKLQkJCW9yaWdWaWV3cy5wdXQoaXRlbS5nZXRUZXh0KCksIGl0ZW0uZ2V0Q29udHJvbCgpKTsKLQkJfQotCQlMaXN0IHZpZXdzID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpOwotCQlpbnQgaW5kZXggPSAwOwotCQlpbnQgc2VsZWN0ZWRJbmRleCA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHZpZXdzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpICYmIGluZGV4PHRhYkZvbGRlci5nZXRJdGVtQ291bnQoKTspIHsKLQkJCVN0cmluZyB2aWV3ID0gKChDb250ZW50Q2F0ZWdvcnkpaXRvci5uZXh0KCkpLmdldE5hbWUoKTsKLQkJCUNUYWJJdGVtIGl0ZW0gPSB0YWJGb2xkZXIuZ2V0SXRlbShpbmRleCsrKTsKLQkJCWl0ZW0uc2V0VGV4dCh2aWV3KTsKLQkJCWl0ZW0uc2V0Q29udHJvbCgoQ29udHJvbClvcmlnVmlld3MuZ2V0KHZpZXcpKTsKLQkJCWlmKHZpZXcuZXF1YWxzKGRlZmF1bHRWaWV3TmFtZSkpIHNldERlZmF1bHRWaWV3SW5kaWNhdG9yKGl0ZW0pOwotCQkJaWYodmlldy5lcXVhbHMoc2VsZWN0ZWRWaWV3KSkgc2VsZWN0ZWRJbmRleCA9IGluZGV4LTE7Ci0JCX0KLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbihzZWxlY3RlZEluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZW1vdmVzIHRoZSBhcHBlbmRlZCAiKGRlZmF1bHQpIiBmcm9tIHRoZSB0YWIgZm9yIHRoZSBkZWZhdWx0Ci0JICogdmlldy4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNoYW5naW5nIHRoZSBkZWZhdWx0IHZpZXchCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRGVmYXVsdFZpZXdJbmRpY2F0b3IoKSB7Ci0JCUNvbnRlbnRDYXRlZ29yeSBkZWZhdWx0VmlldyA9IGNvbmZpZy5nZXREZWZhdWx0VmlldygpOwotCQlpZiAoZGVmYXVsdFZpZXcgIT0gbnVsbCkgewotCQkJU3RyaW5nIGRlZmF1bHRWaWV3VGFiTmFtZSA9IGRlZmF1bHRWaWV3LmdldE5hbWUoKQotCQkJCQkrICIgIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Rlc2NyaXB0aW9uX2RlZmF1bHQ7IAotCQkJQ1RhYkl0ZW1bXSBpdGVtcyA9IHRhYkZvbGRlci5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gaXRlbXNbaV0uZ2V0VGV4dCgpOwotCQkJCWlmIChuYW1lLmVxdWFscyhkZWZhdWx0Vmlld1RhYk5hbWUpKSB7Ci0JCQkJCWl0ZW1zW2ldLnNldFRleHQoZGVmYXVsdFZpZXcuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYXBwZW5kcyAiKGRlZmF1bHQpIiB0byB0aGUgdGFiIG9mIHRoZSBkZWZhdWx0IHZpZXcuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRWaWV3SW5kaWNhdG9yKENUYWJJdGVtIGl0ZW0pIHsKLQkJdGFiRGVmYXVsdHZpZXdJdGVtID0gaXRlbTsKLQkJCi0JCVN0cmluZyBuYW1lID0gaXRlbS5nZXRUZXh0KCkKLQkJCQkrICIgIiAvLyROT04tTkxTLTEkCi0JCQkJKyBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fZGVmYXVsdDsgCi0JCWl0ZW0uc2V0VGV4dChuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGdldFR5cGVzKCkgewotCQlTdHJpbmdbXSBDYXRlZ29yaWVzID0gbmV3IFN0cmluZ1tdIHsgRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTLAotCQkJCUZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFMsIEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUywKLQkJCQlGaWx0ZXJDb25zdGFudHMuRE9NQUlOUywgRmlsdGVyQ29uc3RhbnRzLlJPTEVTRVRTLAotCQkJCUZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFRZUEVTLCBGaWx0ZXJDb25zdGFudHMuVE9PTFMgfTsKLQkJcmV0dXJuIENhdGVnb3JpZXM7Ci0JfQotCQotCXByb3RlY3RlZCBJQWN0aW9uTWFuYWdlciBnZXRBY3Rpb25NYW5hZ2VyKCkgewotCQlyZXR1cm4gYWN0aW9uTWdyOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZThhYWZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29uZmlndXJhdGlvbkVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29uZmlndXJhdGlvbkVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgaW4gdGhlIENvbmZpZ3VyYXRpb24gZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbiBleHRlbmRzIEZvcm1QYWdlIGltcGxlbWVudHMgSVJlZnJlc2hhYmxlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BSRUZJWCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkZvcm1QcmVmaXg7IAotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0KLQlwcml2YXRlIFNjcm9sbGVkRm9ybSBmb3JtID0gbnVsbDsKLQotCXByaXZhdGUgVGV4dCBuYW1lVGV4dDsKLQotCXByaXZhdGUgVGV4dCBkZXNwVGV4dDsKLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgbW9kZWxNb2RpZnlMaXN0ZW5lcjsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKAotCQkJCWVkaXRvciwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbiwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb24pOyAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc2V0U2l0ZShzaXRlKTsKLQkJc2V0SW5wdXQoaW5wdXQpOwotCQlDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQgY29uZmlnSW5wdXQgPSAoQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KSBpbnB1dDsKLQkJY29uZmlnID0gY29uZmlnSW5wdXQuZ2V0Q29uZmlndXJhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLmNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJZm9ybS5zZXRUZXh0KEZPUk1fUFJFRklYICsgY29uZmlnLmdldE5hbWUoKSk7Ci0JCUZvcm1Ub29sa2l0IHRvb2xraXQgPSBtYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCk7Ci0KLQkJVGFibGVXcmFwTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZVdyYXBMYXlvdXQoKTsKLQkJZm9ybS5nZXRCb2R5KCkuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJU2VjdGlvbiBnZW5TZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGZvcm0uZ2V0Qm9keSgpLAotCQkJCVNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVECi0JCQkJCQl8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJY3JlYXRlR2VuZXJhbENvbnRlbnQodG9vbGtpdCwgZ2VuU2VjdGlvbik7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGdlbmVyYWwgY29udGVudCBmb3IgdGhlIGRlc2NyaXB0aW9uIHBhZ2UKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqIEBwYXJhbSBzZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlR2VuZXJhbENvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCwgU2VjdGlvbiBzZWN0aW9uKSB7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCQlzZWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uR2VuZXJhbEluZm8pOyAKLQkJc2VjdGlvbgotCQkJCS5zZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbl90ZXh0KTsgCi0KLQkJQ29tcG9zaXRlIHNlY3Rpb25DbGllbnQgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJVGFibGVXcmFwTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZVdyYXBMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlzZWN0aW9uQ2xpZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCXRvb2xraXQKLQkJCQkuY3JlYXRlTGFiZWwoCi0JCQkJCQlzZWN0aW9uQ2xpZW50LAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uTmFtZSwgU1dULk5PTkUpOyAKLQkJbmFtZVRleHQgPSB0b29sa2l0LmNyZWF0ZVRleHQoc2VjdGlvbkNsaWVudCwgIiIsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQluYW1lVGV4dC5zZXRMYXlvdXREYXRhKHRkKTsKLQkJbmFtZVRleHQuc2V0VGV4dChjb25maWcuZ2V0TmFtZSgpKTsKLQotCQlMYWJlbCBkZXNwTGFiZWwgPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUxhYmVsKAotCQkJCQkJc2VjdGlvbkNsaWVudCwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uTGFiZWwsIFNXVC5OT05FKTsgCi0JCVRhYmxlV3JhcERhdGEgdHdkMCA9IG5ldyBUYWJsZVdyYXBEYXRhKCk7Ci0JCWRlc3BMYWJlbC5zZXRMYXlvdXREYXRhKHR3ZDApOwotCi0JCWRlc3BUZXh0ID0gdG9vbGtpdC5jcmVhdGVUZXh0KHNlY3Rpb25DbGllbnQsCi0JCQkJIiIsIFNXVC5OT05FIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULldSQVApOyAvLyROT04tTkxTLTEkCi0JCVRhYmxlV3JhcERhdGEgdHdkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQl0d2QuaGVpZ2h0SGludCA9IDUwOwotCQlkZXNwVGV4dC5zZXRMYXlvdXREYXRhKHR3ZCk7Ci0JCWRlc3BUZXh0LnNldFRleHQoY29uZmlnLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0KLQkJc2VjdGlvbi5zZXRDbGllbnQoc2VjdGlvbkNsaWVudCk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHNlY3Rpb25DbGllbnQpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoCi0JCQkJc2VjdGlvbkNsaWVudC5nZXRQYXJlbnQoKSwgQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuQ09ORklHVVJBVElPTl9FRElUT1JfQUxMX0NPTlRFWFQpOyAKLQotCQlEaXNwbGF5IGRpc3BsYXkgPSBmb3JtLmdldEJvZHkoKS5nZXREaXNwbGF5KCk7Ci0JCWlmICghKGRpc3BsYXkgPT0gbnVsbCB8fCBkaXNwbGF5LmlzRGlzcG9zZWQoKSkpIHsKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCW5hbWVUZXh0LnNldEZvY3VzKCk7Ci0JCQkJCW5hbWVUZXh0LnNldFNlbGVjdGlvbigwLCBuYW1lVGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJZmluYWwgQ29uZmlndXJhdGlvbkVkaXRvciBlZGl0b3IgPSAoQ29uZmlndXJhdGlvbkVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0JCW1vZGVsTW9kaWZ5TGlzdGVuZXIgPSBlZGl0b3IuY3JlYXRlTW9kaWZ5TGlzdGVuZXIoY29uZmlnKTsKLQotCQlhY3Rpb25NZ3IgPSAoKENvbmZpZ3VyYXRpb25FZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0KLQkJbmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCW5hbWVUZXh0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXIjZm9jdXNHYWluZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb25maWcuZ2V0TmFtZSgpOwotCQkJCWZpbmFsIE1ldGhvZENvbmZpZ3VyYXRpb24gaUNvbmZpZyA9IGNvbmZpZzsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmIChpc1RleHROb25FbXB0eShuYW1lVGV4dCkpIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBuYW1lVGV4dC5nZXRUZXh0KCk7Ci0JCQkJCQotCQkJCQkvLyAxNzg0NjIKLQkJCQkJU3RyaW5nIG1zZyA9IG51bGw7Ci0JCQkJCWlmIChvbGRDb250ZW50LmluZGV4T2YoIiYiKSA8IDAgJiYgbmFtZS5pbmRleE9mKCImIikgPiAtMSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCW1zZyA9IE5MUwotCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjRfbXNnLAotCQkJCQkJCQkJCW5hbWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkuY3JlYXRlTmFtZVZhbGlkYXRvcihjb25maWcuZUNvbnRhaW5lcigpLAotCQkJCQkJCQkJCWNvbmZpZyk7Ci0JCQkJCQltc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChuYW1lKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQkJbXNnKTsKLQkJCQkJCW5hbWVUZXh0LmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJbmFtZVRleHQuc2V0VGV4dChpQ29uZmlnLmdldE5hbWUoKSk7Ci0JCQkJCQkJCW5hbWVUZXh0LnNlbGVjdEFsbCgpOwotCQkJCQkJCQluYW1lVGV4dC5zZXRGb2N1cygpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCW5hbWUgPSBuYW1lLnRyaW0oKTsJCQkvLzE2Njc1NQotCQkJCQkKLQkJCQkJaWYgKCFuYW1lLmVxdWFscyhjb25maWcuZ2V0TmFtZSgpKSkgewotCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQljb25maWcsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCksIG5hbWUsIC0xKTsKLQkJCQkJCWlmIChzdGF0dXMpIHsKLQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNvbmZpZy5lUmVzb3VyY2UoKTsKLQkJCQkJCQlpZihyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlICE9IGNvbmZpZy5lQ29udGFpbmVyKCkuZVJlc291cmNlKCkpIHsKLQkJCQkJCQkJZWRpdG9yLmFkZFJlc291cmNlVG9BZGp1c3RMb2NhdGlvbihjb25maWcuZVJlc291cmNlKCkpOwotCQkJCQkJCX0KLQkJCQkJCQlmb3JtLnNldFRleHQoRk9STV9QUkVGSVggKyBjb25maWcuZ2V0TmFtZSgpKTsKLQkJCQkJCQluYW1lVGV4dC5zZXRUZXh0KG5hbWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2csIFN0clV0aWwudG9Mb3dlcihMaWJyYXJ5VUlUZXh0LlRFWFRfTUVUSE9EX0NPTkZJR1VSQVRPTikpKTsgCi0JCQkJCW5hbWVUZXh0LnNldFRleHQoY29uZmlnLmdldE5hbWUoKSk7Ci0JCQkJCW5hbWVUZXh0LmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCW5hbWVUZXh0LnNldEZvY3VzKCk7Ci0JCQkJCQkJbmFtZVRleHQuc2V0U2VsZWN0aW9uKDAsIG5hbWVUZXh0LmdldFRleHQoKQotCQkJCQkJCQkJLmxlbmd0aCgpKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCi0JCWRlc3BUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQlkZXNwVGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29uZmlnLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBkZXNjMSA9IGRlc3BUZXh0LmdldFRleHQoKTsKLQkJCQlpZiAoIWRlc2MxLmVxdWFscyhjb25maWcuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBjb25maWcsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSwKLQkJCQkJCQlkZXNjMSwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gVGV4dCBjb250cm9sIGNvbnRhaW4gY2hhcmFjdGVycwotCSAqIG90aGVyIHRoYW4gc3BhY2VzLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgVGV4dCBjb250cm9sLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIFRleHQgY29udHJvbCBjb250YWluIGNoYXJhY3RlcnMKLQkgKiAgICAgICAgIG90aGVyIHRoYW4gc3BhY2VzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUZXh0Tm9uRW1wdHkoVGV4dCB0KSB7Ci0JCVN0cmluZyBzID0gdC5nZXRUZXh0KCk7Ci0JCWlmICgocyAhPSBudWxsKSAmJiAocy50cmltKCkubGVuZ3RoKCkgPiAwKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5JUmVmcmVzaGFibGUjcmVmcmVzaE5hbWUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoTmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAobmV3TmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoKG5hbWVUZXh0ICE9IG51bGwpICYmICEobmFtZVRleHQuaXNEaXNwb3NlZCgpKSkgewotCQkJCW5hbWVUZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQkJCW5hbWVUZXh0LnNldFRleHQobmV3TmFtZSk7Ci0JCQkJbmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJZm9ybS5zZXRUZXh0KEZPUk1fUFJFRklYICsgY29uZmlnLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbmZpZ3VyYXRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbmZpZ3VyYXRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNmNhM2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db25maWd1cmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklWaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5DYXRlZ29yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5DYXRlZ29yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuQ2F0ZWdvcnlUcmVlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5BdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkNvbmZpZ3VyYXRpb25NYXJrZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5DYXRlZ29yeVRyZWVWaWV3ZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuQ2xvc3VyZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZS5Db25maWd1cmF0aW9uQ2xvc3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuRWxlbWVudERlcGVuZGVuY3lFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuSUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklQbHVnaW5VSVBhY2thZ2VDb250ZXh0Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUGx1Z2luVUlQYWNrYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Db250ZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLk1ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLlBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlVmlld2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVFeHBhbnNpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci0KLS8qKgotICogVGhlIENvbmZpZ3VyYXRpb24gcGFnZSBpbiB0aGUgTWV0aG9kIENvbmZpZ3VyYXRpb24gZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblBhZ2UgZXh0ZW5kcyBGb3JtUGFnZSBpbXBsZW1lbnRzIElTZWxlY3Rpb25Qcm92aWRlciB7Ci0JTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCi0JQ29uZmlndXJhdGlvbkNsb3N1cmUgY2xvc3VyZSA9IG51bGw7Ci0KLQlDb25maWd1cmF0aW9uVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyIGNvbnRQcm92aWRlcjsKLQotCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0gbnVsbDsKLQkKLQlwcm90ZWN0ZWQgQ2F0ZWdvcnlUcmVlVmlld2VyV3JhcHBlciBhZGRDYXRlZ29yeVZpZXdlcjsKLQkKLQlwcm90ZWN0ZWQgQ2F0ZWdvcnlUcmVlVmlld2VyV3JhcHBlciBzdWJDYXRlZ29yeVZpZXdlcjsKLQkKLQlwcm90ZWN0ZWQgQ2F0ZWdvcnlUcmVlRmlsdGVyIGFkZENhdGVnb3J5VHJlZUZpbHRlcjsKLQotCXByb3RlY3RlZCBDYXRlZ29yeVRyZWVGaWx0ZXIgc3ViQ2F0ZWdvcnlUcmVlRmlsdGVyOwotCi0JU2Nyb2xsZWRGb3JtIGZvcm0gPSBudWxsOwotCi0JYm9vbGVhbiBpc0RpcnR5ID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIG5lZWRVcGRhdGUgPSBmYWxzZTsKLQotCXByaXZhdGUgU3RyaW5nIGZvcm1QcmVmaXggPSBBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9Gb3JtUHJlZml4OyAKLQotCS8vIHByaXZhdGUgRU9iamVjdCBjdXJyZW50Um9vdE5vZGU7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgZXhwYW5kZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIHByaXZhdGUgVGV4dCBjdHJsX25hbWU7Ci0KLQkvLyBwcml2YXRlIFRleHQgY3RybF9icmllZl9kZXNjOwotCi0JcHJpdmF0ZSBMaXN0IG1vZGlmaWVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjbG9zdXJlQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gZml4V2FybmluZ0J1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIHJlZnJlc2hCdXR0b247Ci0KLQkvLyBwcml2YXRlIEJ1dHRvbiBkZXBlbmRlbnRCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBoaWRlQnV0dG9uOwotCi0JLy8gcHJpdmF0ZSBUZXh0IGRlc3BUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IGVsZW1EZXNwQ29udGVudFRleHQ7Ci0KLQkvLyBwcml2YXRlIFRleHQgbmFtZVRleHQ7Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHBhcmVudFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbmZpZ3VyYXRpb25NYXJrZXJIZWxwZXIgbWFya2VySGVscGVyID0gQ29uZmlndXJhdGlvbk1hcmtlckhlbHBlci5JTlNUQU5DRTsKLQotCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbXNnVmlld0xpc3RlbmVyID0gbnVsbDsKLQotCXByaXZhdGUgQ29uZmlnVHJlZUZpbHRlciBjb25maWdGaWx0ZXI7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCXByaXZhdGUgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaWJMaXN0ZW5lciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlciBjb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsb3N1cmVMaXN0ZW5lciBjbG9zdXJlTGlzdGVuZXIgPSBuZXcgQ2xvc3VyZUxpc3RlbmVyKCkgewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgZXJyb3JBZGRlZChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgSUNvbmZpZ3VyYXRpb25FcnJvciBlcnJvcikgewotCQkJbWFya2VySGVscGVyLmNyZWF0ZU1hcmtlcihjb25maWcsIGVycm9yKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBlcnJvclJlbW92ZWQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIElDb25maWd1cmF0aW9uRXJyb3IgZXJyb3IpIHsKLQkJCW1hcmtlckhlbHBlci5kZWxldGVNYXJrZXIoY29uZmlnLCBlcnJvcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgZXJyb3JVcGRhdGVkKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBJQ29uZmlndXJhdGlvbkVycm9yIGVycm9yKSB7Ci0JCQltYXJrZXJIZWxwZXIuYWRqdXN0TWFya2VyKG51bGwsIGNvbmZpZywgZXJyb3IpOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgSVBsdWdpblVJUGFja2FnZUNvbnRleHRDaGFuZ2VkTGlzdGVuZXIgbGF5b3V0TGlzdGVuZXIgPSBuZXcgSVBsdWdpblVJUGFja2FnZUNvbnRleHRDaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGxheW91dENoYW5nZWQoYm9vbGVhbiBpc0ZsYXQpIHsKLQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoCi0JCQkJZWRpdG9yLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24yKTsgCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXNldFNpdGUoc2l0ZSk7Ci0JCXNldElucHV0KGlucHV0KTsKLQotCQlDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQgY29uZmlnSW5wdXQgPSAoQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KSBpbnB1dDsKLQkJY29uZmlnID0gY29uZmlnSW5wdXQuZ2V0Q29uZmlndXJhdGlvbigpOwotCQlhY3Rpb25NZ3IgPSAoKENvbmZpZ3VyYXRpb25FZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0KLQkJCi0JCWNvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKAotCQkJCQlvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24gbXNnKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgY2F0Y2hlZCBtb2RpZnkgY29uZmlnIG5vdGlmaWNhdGlvbiA9Ci0JCQkJLy8gIiArIG1zZyk7Ci0JCQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCQkJaWYgKAl0eXBlID09IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbi5BREQKLQkJCQkJCXx8IHR5cGUgPT0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uLkFERF9NQU5ZCi0JCQkJCQl8fCB0eXBlID09IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbi5SRU1PVkUKLQkJCQkJCXx8ICAgdHlwZSA9PSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24uUkVNT1ZFX01BTlkpIHsJCQkJCQotCQkJCQluZWVkVXBkYXRlID0gdHJ1ZTsKLQkJCQkJCi0vLwkJCQkJVGhpcyB3YXMgZG9uZSB0byByZWZyZXNoIGNvbmZpZ3VyYXRpb24gcGx1Z2luLXBhY2thZ2Ugc2VjdGlvbiBwYWdlLiBCdXQgaXRzIG5vdCBwZXJmZWN0Ci0vLwkJCQkJc29sdXRpb24uIERvZXNudCBjb3ZlciBhbGwgdGhlIHNjZW5hcmlvcy4gU28gY29tbWVudGluZyBpdCBvdXQuCi0vLwkJCQkJV2lsbCBoYXZlIHRvIHRoaW5rIG9mIGFsdGVybmF0ZSB3YXkgdG8gcmVmcmVzaCBwbHVnaW4vcGFja2FnZSBjb25maWd1cmF0aW9uIHBhZ2UuCi0vLwkJCQkJTG93IFByaW9yaXR5Ci0vLwkJCQkJCXx8IHR5cGUgPT0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uLlJFTU9WRQotLy8JCQkJCQl8fCB0eXBlID09IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSApIHsKLS8vCQkJCQkKLQkJCQkJCi0vLwkJCQkJaWYgKHRyZWVWaWV3ZXIgIT0gbnVsbCkJewotLy8JCQkJCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLS8vCQkJCQkJdXBkYXRlQ2hlY2tTdGF0ZXMoKTsKLS8vCQkJCQkJc2hvd0Vycm9ycygpOwotLy8JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWNvbmZpZy5lQWRhcHRlcnMoKS5hZGQoY29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVJbml0aWFsaXplQ29uZmlnRmFjdG9yeSgpIHsKLQkJLy8gdGhlIGZvbGxvd2luZyBtYXkgbm90IGJlIHRoZSBtb3N0IGVmZmljaWVudCB3YXkKLQkJLy8gbmVlZCBhIGZhc3Qgd2F5IHRvIHVwZGF0ZSB0aGUgY2xvc3VyZQotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHJlSW5pdCBjbG9zdXJlIGZvciBjb25maWcgYWRkIG5vdGlmaWNhdGlvbiEiKTsKLQotCQljcmVhdGVDb25maWd1cmF0aW9uQ2xvc3VyZSgpOwotCQlDb25maWdUcmVlRmlsdGVyIG9sZCA9IGNvbmZpZ0ZpbHRlcjsKLQkJY29uZmlnRmlsdGVyID0gbmV3IENvbmZpZ1RyZWVGaWx0ZXIoY2xvc3VyZSk7Ci0JCWlmICh0cmVlVmlld2VyICE9ICBudWxsICYmIG9sZCAhPSBudWxsKSB7Ci0JCQl0cmVlVmlld2VyLnJlbW92ZUZpbHRlcihvbGQpOwotCQl9Ci0JCXRyZWVWaWV3ZXIuYWRkRmlsdGVyKGNvbmZpZ0ZpbHRlcik7Ci0JfQotCi0JLyoqCi0JICogU2V0IGlucHV0IGZvciBjb25uZmlndXJhdGlvbiB2aWV3ZXIKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpIHsKLQkJdHJlZVZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0JCWFkZENhdGVnb3J5Vmlld2VyLnNldFJvb3QoaW5wdXQpOwotCQlzdWJDYXRlZ29yeVZpZXdlci5zZXRSb290KGlucHV0KTsKLQotCQkvLyBpbml0aWFsbHkgZXhwYW5kIHRoZSB3aG9sZSB0cmVlIGJlZm9yZSB1cGRhdGluZyB0aGUgdHJlZQotCQkvLyB0aGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgdGhlIGNvbnRlbnQgcHJvdmlkZXIgdG8gYnVpbGQgdGhlIGNoaWxkIC0KLQkJLy8gcGFyZW50IGxvb2t1cCBtYXAKLQkJdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQkJdHJlZVZpZXdlci5jb2xsYXBzZUFsbCgpOwotCQlhZGRDYXRlZ29yeVZpZXdlci5leHBhbmRBbGwoKTsKLQkJYWRkQ2F0ZWdvcnlWaWV3ZXIuY29sbGFwc2VBbGwoKTsKLQkJc3ViQ2F0ZWdvcnlWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCXN1YkNhdGVnb3J5Vmlld2VyLmNvbGxhcHNlQWxsKCk7Ci0JCQotCQkvLyB1cGRhdGUgdGhlIHRyZWUgd2l0aCB0aGUgZGVmYXVsdCBjbG9zdXJlIHNlbGVjdGlvbgotCQl1cGRhdGVDaGVja1N0YXRlcygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2NyZWF0ZUZvcm1Db250ZW50KG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJLy8gY3JlYXRlIGZvcm0gdG9vbGtpdAotCQlmb3JtID0gbWFuYWdlZEZvcm0uZ2V0Rm9ybSgpOwotCQlmb3JtLnNldFRleHQoZm9ybVByZWZpeCArIGNvbmZpZy5nZXROYW1lKCkpOwotCQlGb3JtVG9vbGtpdCB0b29sa2l0ID0gbWFuYWdlZEZvcm0uZ2V0VG9vbGtpdCgpOwotCi0JCVRhYmxlV3JhcExheW91dCBsYXlvdXQgPSBuZXcgVGFibGVXcmFwTGF5b3V0KCk7Ci0JCWZvcm0uZ2V0Qm9keSgpLnNldExheW91dChsYXlvdXQpOwotCi0JCVNlY3Rpb24gdHJlZVNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksCi0JCQkJU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQKLQkJCQkJCXwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQljcmVhdGVUcmVlQ29udGVudCh0b29sa2l0LCB0cmVlU2VjdGlvbik7Ci0JCQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQkvLyBmaW5hbGx5IHNldCB0aGUgaW5wdXQuCi0JCS8vIFJvb3RDb250ZW50IGlucHV0Tm9kZSA9IG5ldyBSb290Q29udGVudChjbG9zdXJlCi0JCS8vIC5nZXRDb25maWd1cmF0aW9uRmFjdG9yeSgpLmdldE1ldGhvZFBsdWdpbnMoKSk7Ci0JCXNldElucHV0KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCQotCQlpbml0aWFsaXplQ2F0ZWdvcmllc1ZpZXdlcnMoKTsKLQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgdHJlZSBjb250ZW50Ci0JICogQHBhcmFtIHRvb2xraXQKLQkgKiBAcGFyYW0gc2VjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVRyZWVDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQsIFNlY3Rpb24gc2VjdGlvbikgewotCQlzZWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfQ29uZmlnQ29udGVudCk7IAotCQlzZWN0aW9uCi0JCQkJLnNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnREZXNjcmlwdGlvbik7IAotCQlzZWN0aW9uLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKLQotCQlDb21wb3NpdGUgc2VjdGlvbkNsaWVudCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQlzZWN0aW9uLnNldENsaWVudChzZWN0aW9uQ2xpZW50KTsKLQkJR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXNlY3Rpb25DbGllbnQuc2V0TGF5b3V0KGdsKTsKLQkJZ2wubnVtQ29sdW1ucyA9IDY7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCgKLQkJCQlzZWN0aW9uQ2xpZW50LmdldFBhcmVudCgpLAotCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkNPTkZJR1VSQVRJT05fRURJVE9SX0FMTF9DT05URVhUKTsKLQotCQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbkNsaWVudCk7Ci0JCXsKLQkJCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSA2OwotCQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDY7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gMzsKLQkJCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQl9Ci0KLQkJaGlkZUJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgIiIsIFNXVC5QVVNIIC8vJE5PTi1OTFMtMSQKLQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJaGlkZUJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImhpZGVVbmNoZWNrZWRFbGVtLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQloaWRlQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX2hpZGVUb29sVGlwKTsgCi0JCWhpZGVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5EKSk7Ci0JCWhpZGVCdXR0b24uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX2hpZGVUb29sVGlwKSk7Ci0JCQotCQlmaXhXYXJuaW5nQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCAiIiwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkCi0JCWZpeFdhcm5pbmdCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFNoYXJlZEltYWdlKCJhZGRyZWZfY28uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWZpeFdhcm5pbmdCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfQWRkTWlzc2luZ1Rvb2xUaXApOyAKLQkJZml4V2FybmluZ0J1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQpKTsKLQkJZml4V2FybmluZ0J1dHRvbi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfQWRkTWlzc2luZ1Rvb2xUaXApKTsKLQotCQkvLyBBZGQgdGhlIGNsb3N1cmUgYnV0dG9uLgotCQljbG9zdXJlQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCAiIiwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkCi0JCWNsb3N1cmVCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJjbG9zdXJlX2NvLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQljbG9zdXJlQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX01ha2VDbG9zdXJlVG9vbFRpcCk7IAotCQljbG9zdXJlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCkpOwotCQljbG9zdXJlQnV0dG9uLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9NYWtlQ2xvc3VyZVRvb2xUaXApKTsKLQkJLy8gY2xvc3VyZUJ1dHRvbi5zZXRUZXh0KCIiKTsKLQotCQlyZWZyZXNoQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCAiIiwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkCi0JCXJlZnJlc2hCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX1JFRlJFU0gpOwotCQlyZWZyZXNoQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlZnJlc2hCdXR0b25fdGV4dCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORAotCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJCWdkLmhvcml6b250YWxBbGlnbm1lbnQgPSAzOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJcmVmcmVzaEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJfQotCQlyZWZyZXNoQnV0dG9uLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5yZWZyZXNoQnV0dG9uX3RleHQpKTsKLQotCQkvLyBDcmVhdGUgVmlld2VyIGFuZCBIYW5kbGUgTGlzdGVuZXIgZm9yIHRoZSB2aWV3ZXIuCi0JCWNyZWF0ZVZpZXdlcnModG9vbGtpdCwgc2VjdGlvbkNsaWVudCk7Ci0KLQkJTGFiZWwgZWxlbURlc3BMYWJlbCA9IHRvb2xraXQKLQkJCQkuY3JlYXRlTGFiZWwoc2VjdGlvbkNsaWVudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24pOyAKLQkJR3JpZERhdGEgZ2QxID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkMS5ob3Jpem9udGFsU3BhbiA9IDY7Ci0JCWVsZW1EZXNwTGFiZWwuc2V0TGF5b3V0RGF0YShnZDEpOwotCi0JCWVsZW1EZXNwQ29udGVudFRleHQgPSB0b29sa2l0LmNyZWF0ZVRleHQoc2VjdGlvbkNsaWVudCwgIiIsIFNXVC5OT05FIC8vJE5PTi1OTFMtMSQKLQkJCQl8IFNXVC5NVUxUSSB8IFNXVC5SRUFEX09OTFkgfCBTV1QuV1JBUCk7Ci0JCUdyaWREYXRhIGdkMiA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZDIuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdkMi5ob3Jpem9udGFsU3BhbiA9IDY7Ci0JCWdkMi5oZWlnaHRIaW50ID0gNTA7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3Ioc2VjdGlvbkNsaWVudCk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGJ1dHRvbkNvbXBvc2l0ZSk7Ci0JCWVsZW1EZXNwQ29udGVudFRleHQuc2V0TGF5b3V0RGF0YShnZDIpOwotCQkKLQkJLy8gc2V0IHRleHQgd2lkZ2V0IHRvIENhdGVnb3J5IHZpZXdlcnMgc28gdGhleSBjYW4gdXBkYXRlIGRlc2NyaXB0aW9uIGZpZWxkCi0JCWFkZENhdGVnb3J5Vmlld2VyLnNldFRleHRXaWRnZXQoZWxlbURlc3BDb250ZW50VGV4dCk7Ci0JCXN1YkNhdGVnb3J5Vmlld2VyLnNldFRleHRXaWRnZXQoZWxlbURlc3BDb250ZW50VGV4dCk7Ci0KLQkJaGlkZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQloaWRlQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7Ci0JCXJlZnJlc2hCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmVmcmVzaEJ1dHRvbi5zZXRWaXNpYmxlKHRydWUpOwotCQlmaXhXYXJuaW5nQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWZpeFdhcm5pbmdCdXR0b24uc2V0VmlzaWJsZSh0cnVlKTsKLQkJY2xvc3VyZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQljbG9zdXJlQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb25maWd1cmF0aW9uQ2xvc3VyZSgpIHsKLQkJLy8gcmVmcmVzaCBjb25maWd1cmF0aW9uIGZyb20gZWRpdG9yCi0JCS8vCi0JCUZvcm1FZGl0b3IgZWRpdG9yID0gZ2V0RWRpdG9yKCk7Ci0JCWlmKGVkaXRvciAhPSBudWxsKSB7Ci0JCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmKGlucHV0IGluc3RhbmNlb2YgQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KSB7Ci0JCQkJY29uZmlnID0gKChDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpaW5wdXQpLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCX0KLQkJfQotCQkKLQkJY2xvc3VyZSA9IG5ldyBDb25maWd1cmF0aW9uQ2xvc3VyZShhY3Rpb25NZ3IsIGNvbmZpZyk7Ci0JCWNsb3N1cmUuYWRkTGlzdGVuZXIoY2xvc3VyZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gZmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVDb25maWdGYWN0b3J5KCkgewotCQkvLyBsb2FkaW5nIHRoZSBjb25maWd1cmF0aW9uIGNsb3N1cmUgbWlnaHQgYmUgc2xvdywKLQkJLy8gZGlzcGxheSBhIHByb2dyZXNzIGJhcgotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCWNyZWF0ZUNvbmZpZ3VyYXRpb25DbG9zdXJlKCk7Ci0JCQl9Ci0KLQkJfTsKLQotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9Mb2FkaW5nTWVzc2FnZSk7IAotCi0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCS8vIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gY29uZmlnRmFjdG9yeS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQljb250UHJvdmlkZXIgPSBuZXcgQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlcigvL2NvbmZpZ0ZhY3RvcnksCi0JCQkJYWRhcHRlckZhY3RvcnkpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250UHJvdmlkZXIpOwotCQl0cmVlVmlld2VyCi0JCQkJLnNldExhYmVsUHJvdmlkZXIobmV3IENvbmZpZ1BhY2thZ2VMYWJlbFByb3ZpZGVyKGNvbnRQcm92aWRlcikpOwotCi0JCWNvbmZpZ0ZpbHRlciA9IG5ldyBDb25maWdUcmVlRmlsdGVyKGNsb3N1cmUpOwotCQl0cmVlVmlld2VyLmFkZEZpbHRlcihjb25maWdGaWx0ZXIpOwotCQkKLQkJYWRkQ2F0ZWdvcnlUcmVlRmlsdGVyID0gbmV3IENhdGVnb3J5VHJlZUZpbHRlcihhZGRDYXRlZ29yeVZpZXdlcik7Ci0JCWFkZENhdGVnb3J5Vmlld2VyLmFkZFRyZWVGaWx0ZXIoYWRkQ2F0ZWdvcnlUcmVlRmlsdGVyKTsKLQkJc3ViQ2F0ZWdvcnlUcmVlRmlsdGVyID0gbmV3IENhdGVnb3J5VHJlZUZpbHRlcihzdWJDYXRlZ29yeVZpZXdlcik7Ci0JCXN1YkNhdGVnb3J5Vmlld2VyLmFkZFRyZWVGaWx0ZXIoc3ViQ2F0ZWdvcnlUcmVlRmlsdGVyKTsKLQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQ2F0ZWdvcmllc1ZpZXdlcnMoKSB7Ci0JCS8vIHJlYWQgZnJvbSBjb25maWcgYW5kIGNoZWNrIHRoZSBhcHByb3ByaWF0ZSBpdGVtcyBpbiB0aGUgQ0Mgdmlld2VycwotICAgIAlMaXN0IGFkZENhdHMgPSBuZXcgQXJyYXlMaXN0KGNvbmZpZy5nZXRBZGRlZENhdGVnb3J5KCkpOwotICAgIAlpbml0aWFsaXplQ0NWaWV3ZXIoYWRkQ2F0ZWdvcnlWaWV3ZXIsIGFkZENhdHMpOwotICAgIAlMaXN0IHN1YkNhdHMgPSBuZXcgQXJyYXlMaXN0KGNvbmZpZy5nZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKSk7Ci0gICAgCWluaXRpYWxpemVDQ1ZpZXdlcihzdWJDYXRlZ29yeVZpZXdlciwgc3ViQ2F0cyk7Ci0gICAgCQotCQlhZGRDYXRlZ29yeVZpZXdlci5hYm91dFRvT3BlbigpOwotCQlzdWJDYXRlZ29yeVZpZXdlci5hYm91dFRvT3BlbigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUNDVmlld2VyKENhdGVnb3J5VHJlZVZpZXdlcldyYXBwZXIgdmlld2VyLCBMaXN0IGVsZW1lbnRzKSB7Ci0JCWlmICghZWxlbWVudHMuaXNFbXB0eSgpKQotCQkJdmlld2VyLnVwZGF0ZVNlbGVjdGlvbnMoZWxlbWVudHMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVWaWV3ZXJzKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBzZWN0aW9uQ2xpZW50KSB7Ci0JCUxhYmVsIHRyZWVUaXRsZUxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChzZWN0aW9uQ2xpZW50LAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX1RyZWVUaXRsZUxhYmVsKTsKLQkJewotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HCi0JCQkJCXwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRU5EKTsKLQkJCXRyZWVUaXRsZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQl9Ci0KLQkJTGFiZWwgYWRkQ0NUaXRsZUxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChzZWN0aW9uQ2xpZW50LAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX0FkZENhdGVnb3JpZXNUaXRsZUxhYmVsKTsKLQkJewotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HCi0JCQkJCXwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRU5EKTsKLQkJCWFkZENDVGl0bGVMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMTsKLQkJfQotCQlzZWN0aW9uQ2xpZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpOwotCQlzZWN0aW9uQ2xpZW50LnNldExheW91dChsYXlvdXQpOwotCQkvLyBjcmVhdGUgdGhlIGxpYnJhcnkgdHJlZSB2aWV3ZXIKLQkJdHJlZVZpZXdlciA9IG5ldyBDb25maWd1cmF0aW9uVmlld2VyKHNlY3Rpb25DbGllbnQpOwotCQkvLyB0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RICi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSAyMDA7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAzOwotCQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQlhZGRDYXRlZ29yeVZpZXdlciA9IG5ldyBDYXRlZ29yeVRyZWVWaWV3ZXJXcmFwcGVyKHNlY3Rpb25DbGllbnQsIDIwMCwKLQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksCi0JCQkJbmV3IENhdGVnb3J5Q29udGVudFByb3ZpZGVyKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGNvbmZpZyksCi0JCQkJbmV3IENhdGVnb3J5TGFiZWxQcm92aWRlcihUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSwgY29uZmlnKTsKLQotCQlMYWJlbCBzdWJDQ1RpdGxlTGFiZWwgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKHNlY3Rpb25DbGllbnQsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfU3ViQ2F0ZWdvcmllc1RpdGxlTGFiZWwpOwotCQl7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcKLQkJCQkJfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9FTkQpOwotCQkJc3ViQ0NUaXRsZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQl9Ci0JCXN1YkNhdGVnb3J5Vmlld2VyID0gbmV3IENhdGVnb3J5VHJlZVZpZXdlcldyYXBwZXIoc2VjdGlvbkNsaWVudCwgMjAwLAotCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwKLQkJCQluZXcgQ2F0ZWdvcnlDb250ZW50UHJvdmlkZXIoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgY29uZmlnKSwKLQkJCQluZXcgQ2F0ZWdvcnlMYWJlbFByb3ZpZGVyKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpLCBjb25maWcpOwotCi0JCQotCQkvLyBhZGQgbGlzdGVuZXIgc28gdGhlIDIgQ2F0ZWdvcnkgdmlld2VycyBhcmUgaW4gc3luYwotCQkvLyB0aGF0IGlzLCB3aGVuIGFuIGl0ZW0gaXMgY2hlY2tlZCBpbiBvbmUsIGl0IGlzIHVuY2hlY2tlZCBpbiB0aGUgb3RoZXIKLQkJYWRkQ2F0ZWdvcnlWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoZmluYWwgQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCS8vUG90ZW50aWFsbHkgbG9uZyBvcGVyYXRpb24gLSBzaG93IGEgYnVzeSBjdXJzb3IKLQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShzdWJDYXRlZ29yeVZpZXdlci5nZXRUcmVlKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChldmVudC5nZXRDaGVja2VkKCkpCi0JCQkJCQkJc3ViQ2F0ZWdvcnlWaWV3ZXIuc2VsZWN0VHJlZUNoZWNrKGV2ZW50LmdldEVsZW1lbnQoKSwgZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXN1YkNhdGVnb3J5Vmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKGZpbmFsIENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkvL1BvdGVudGlhbGx5IGxvbmcgb3BlcmF0aW9uIC0gc2hvdyBhIGJ1c3kgY3Vyc29yCi0JCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoYWRkQ2F0ZWdvcnlWaWV3ZXIuZ2V0VHJlZSgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoZXZlbnQuZ2V0Q2hlY2tlZCgpKQotCQkJCQkJCWFkZENhdGVnb3J5Vmlld2VyLnNlbGVjdFRyZWVDaGVjayhldmVudC5nZXRFbGVtZW50KCksIGZhbHNlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9KTsKLQkJCi0JCWluaXRpYWxpemVDb25maWdGYWN0b3J5KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJYWRkRWRpdG9yU2V0Rm9jdXNMaXNlbmVycygpOwkJCi0JCQotCQkvLyBuYW1lVGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCS8vIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJLy8gaWYgKGlzVGV4dE5vbkVtcHR5KG5hbWVUZXh0KSkgewotCQkvLyBTdHJpbmcgbmFtZSA9IFN0clV0aWwubWFrZVZhbGlkRmlsZU5hbWUobmFtZVRleHQuZ2V0VGV4dCgpKTsKLQkJLy8gaWYgKCFuYW1lLmVxdWFscyhjb25maWcuZ2V0TmFtZSgpKSkgewotCQkvLyBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBjb25maWcsCi0JCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksCi0JCS8vIG5hbWUsIC0xKTsKLQkJLy8gZm9ybS5zZXRUZXh0KGZvcm1QcmVmaXggKyBjb25maWcuZ2V0TmFtZSgpKTsKLQkJLy8gbmFtZVRleHQuc2V0VGV4dChuYW1lKTsKLQkJLy8gfQotCQkvLyB9IGVsc2UgewotCQkvLyAvLyBEaXNwbGF5IGEgd2FybmluZyBkaWFsb2cgZm9yIGVtcHR5IE5hbWUuCi0JCS8vIG5hbWVUZXh0LnNldFRleHQoY29uZmlnLmdldE5hbWUoKSk7Ci0JCS8vIE1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkvLyAuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJLy8gIkVudGVyIENvbmZpZ3VyYXRpb24gTmFtZSIsCi0JCS8vICJOYW1lIGZpZWxkIGNhbm5vdCBiZSBlbXB0eSEiKTsKLQkJLy8gfQotCQkvLyAvLyBjb25maWcuc2V0TmFtZShTdHJVdGlsLm1ha2VWYWxpZEZpbGVOYW1lKG5hbWVUZXh0LmdldFRleHQoKSkpOwotCQkvLyAvLyBmb3JtLnNldFRleHQoZm9ybVByZWZpeCArIGNvbmZpZy5nZXROYW1lKCkpOwotCQkvLyB9Ci0JCS8vIH0pOwotCQkvLyBkZXNwVGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCS8vIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJLy8gLy8gY29uZmlnLnNldEJyaWVmRGVzY3JpcHRpb24oU3RyVXRpbC5nZXRQbGFpblRleHQoZGVzcFRleHQKLQkJLy8gLy8gLmdldFRleHQoKSkpOwotCQkvLyBTdHJpbmcgZGVzYzEgPSBkZXNwVGV4dC5nZXRUZXh0KCk7Ci0JCS8vIGlmICghZGVzYzEuZXF1YWxzKGNvbmZpZy5nZXRCcmllZkRlc2NyaXB0aW9uKCkpKSB7Ci0JCS8vIGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGNvbmZpZywKLQkJLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJLy8gLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpLAotCQkvLyBkZXNjMSwgLTEpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfSk7Ci0JCWNsb3N1cmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGZvcm0uZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCW1ha2VDbG9zdXJlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX07Ci0JCX0pOwotCQlmaXhXYXJuaW5nQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShmb3JtLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlmaXhXYXJuaW5nKCk7Ci0JCQkJCX0KLQkJCQl9KTsJCQkJCi0JCQl9OwotCQl9KTsKLQkJcmVmcmVzaEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZm9ybS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJc2hvd0Vycm9ycygpOwotCQkJCQl9Ci0JCQkJfSk7CQkJCQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQkJaGlkZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2hvd0hpZGVFbGVtZW50cygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQkJdHJlZVZpZXdlci5hZGRUcmVlTGlzdGVuZXIobmV3IElUcmVlVmlld2VyTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB0cmVlQ29sbGFwc2VkKFRyZWVFeHBhbnNpb25FdmVudCBldmVudCkgewotCQkJCU9iamVjdCBlbGVtZW50ID0gZXZlbnQuZ2V0RWxlbWVudCgpOwotCQkJCWV4cGFuZGVkRWxlbWVudHMucmVtb3ZlKGVsZW1lbnQpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB0cmVlRXhwYW5kZWQoVHJlZUV4cGFuc2lvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBldmVudC5nZXRFbGVtZW50KCk7Ci0JCQkJZXhwYW5kZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0KLQkJCQkvLyAvLyB0aGlzIGlzIGEgcXVpY2sgZGlydHkgZml4IGZvciBjaGVjayBzdGF0ZSBpbml0aWFsaXplIGlzc3VlCi0JCQkJLy8gLy8gYmV0dGVyIHNvbHV0aW9uIGxhdGVyLiBqeGkgMDcvMDEvMDUKLQkJCQkvLyB1cGRhdGVUcmVlKCk7Ci0JCQkJLy8JCQkJCi0JCQkJLy8gLy8gcmVzdG9yZSB0aGUgY2hlY2sgc3RhdGUgb2YgdGhlIFVJIGVsZW1lbnRzCi0JCQkJLy8gT2JqZWN0IG9iaiA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLQkJCQkvLyBib29sZWFuIHBhcmVudFN0YXRlID0gdHJlZVZpZXdlci5nZXRDaGVja2VkKG9iaik7Ci0JCQkJLy8JCQkJCi0JCQkJLy8gQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlciBjcCA9Ci0JCQkJLy8gKENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIpdHJlZVZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCQkvLyBPYmplY3RbXSBjaGlsZHJlbiA9IGNwLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJLy8gaWYgKCBjaGlsZHJlbiAhPSBudWxsICkKLQkJCQkvLyB7Ci0JCQkJLy8gZm9yICggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0JCQkJLy8gewotCQkJCS8vIGJvb2xlYW4gY2hlY2sgPSBmYWxzZTsKLQkJCQkvLyAvLyBpZiB0aGUgZm9sZGVyIGlzIGEgVUkgZm9sZGVyLCBrZWVwIHRoZSBjaGVjayBzdGF0ZQotCQkJCS8vIGlmICggY2hpbGRyZW5baV0gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gKQotCQkJCS8vIHsKLQkJCQkvLyBjaGVjayA9Ci0JCQkJLy8gY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmNvbnRhaW5zKGNoaWxkcmVuW2ldKTsKLQkJCQkvLyB9Ci0JCQkJLy8gZWxzZSBpZiAoIGNoaWxkcmVuW2ldIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSApCi0JCQkJLy8gewotCQkJCS8vIGNoZWNrID0KLQkJCQkvLyBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKGNoaWxkcmVuW2ldKTsKLQkJCQkvLyB9Ci0JCQkJLy8gZWxzZQotCQkJCS8vIHsKLQkJCQkvLyBjaGVjayA9IHBhcmVudFN0YXRlOwotCQkJCS8vIH0KLQkJCQkvLwkJCQkJCQotCQkJCS8vIGJvb2xlYW4gcmV0ID0gdHJlZVZpZXdlci5zZXRDaGVja2VkKGNoaWxkcmVuW2ldLCBjaGVjayk7Ci0JCQkJLy8gaWYgKCByZXQgPT0gZmFsc2UpCi0JCQkJLy8gewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FuJ3Qgc2V0IHN0YXRlIik7Ci0JCQkJLy8gfQotCQkJCS8vCi0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCX0KLQkJfSk7Ci0KLQkJLy8gbGlzdGVuIHRvIHRoZSBzZWxlY3Rpb24gY2hhbmdlIG9mIHRoZSBjdXJyZW50IHRyZWUgdmlld2VyCi0JCWlmIChzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJLy8gQ3JlYXRlIHRoZSBsaXN0ZW5lcgotCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJLy8gVGhpcyBqdXN0IG5vdGlmaWVzIHRob3NlIHRoaW5ncyB0aGF0IGFyZSBhZmZlY3RlZCBieSB0aGUKLQkJCQkvLyBzZWN0aW9uLgotCQkJCS8vCi0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLS8vCQkJCQlTeXN0ZW0ub3V0Ci0vLwkJCQkJCQkucHJpbnRsbihBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9TZWxlY3RlZCArIGV2ZW50LmdldFNlbGVjdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX07Ci0KLQkJCXRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyBhZGQgYSBjaGVjayBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXIKLQkJdHJlZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2dCkgewotCQkJCQotCQkJCWZpbmFsIENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQgPSBldnQ7Ci0JCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZm9ybS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQotCQkJCS8vIEJFR0lOCi0JCQkJbW9kaWZpZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlib29sZWFuIGNoZWNrZWQgPSBldmVudC5nZXRDaGVja2VkKCk7Ci0JCQkJdXBkYXRlQ2hlY2tTdGF0ZXMoZXZlbnQuZ2V0RWxlbWVudCgpLCBjaGVja2VkKTsKLQotCQkJCS8qCi0JCQkJICogLy8gc2F2ZSB0aGUgcHJldmlvdXMgaW52YWxpZCBlbGVtZW50cyBMaXN0IGludmFsaWQgPQotCQkJCSAqIGNsb3N1cmUuZ2V0SW52YWxpZEVsZW1lbnRzKCk7Ci0JCQkJICogCi0JCQkJICogY2xvc3VyZS5zZXRTZWxlY3Rpb25zKHRyZWVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpOwotCQkJCSAqIAotCQkJCSAqIGlmICggY29uZmlnRmlsdGVyLmlzSGlkaW5nKCkgKSB7IHRyZWVWaWV3ZXIucmVmcmVzaCgpOyB9IGVsc2UgeyAvLwotCQkJCSAqIGdldCB0aGUgbmV3IGVycm9yIGVsZW1lbnRzLCBhZGQgdG8gdGhlIHByZXZpb3VzIGVycm9yCi0JCQkJICogZWxlbWVudHMsIC8vIGFuZCB1cGRhdGUgdGhlbSB0byB1cGRhdGUgdGhlIGVycm9yL3dhcm5pbmcKLQkJCQkgKiBpbWFnZXMgaW52YWxpZC5hZGRBbGwoY2xvc3VyZS5nZXRJbnZhbGlkRWxlbWVudHMoKSk7IC8vIGFsc28KLQkJCQkgKiBhZGQgdGhlIFVJIGZvbGRlcnMgQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlciBjcCA9Ci0JCQkJICogKENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIpdHJlZVZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCQkgKiBpbnZhbGlkLmFkZEFsbChjcC5nZXRVSUVsZW1lbnRzKCkpOwotCQkJCSAqIAotCQkJCSAqIHRyZWVWaWV3ZXIudXBkYXRlKGludmFsaWQudG9BcnJheSgpLCBudWxsKTsgfQotCQkJCSAqLwotCQkJCQotCQkJCS8vIG5lZWQgdG8gc2F2ZSB0aGUgY29uZmlnIGJlZm9yZSBzaG93aW5nIGVycm9yCi0JCQkJLy8gc2luY2UgdGhlIGVycm9yIGhhbmRsaW5nIG5lZWRzIHRvIGNoZWNrIHRoZSBjb25maWcKLQkJCQlib29sZWFuIHNhdmVkID0gc2F2ZUNvbmZpZ3VyYXRpb24oKTsKLQkJCQlyZWZyZXNoQ2F0ZWdvcnlWaWV3ZXJzKCk7Ci0JCQkJc2F2ZWQgPSBzYXZlZCAmIHNhdmVDb250ZW50Q2F0ZWdvcnlTZWxlY3Rpb25zVG9Db25maWd1cmF0aW9uKCk7Ci0JCQkJc2hvd0Vycm9ycygpOwotCQkJCQotCQkJCWlmICghc2F2ZWQpIHsKLQkJCQkJdXBkYXRlQ2hlY2tTdGF0ZXMoZXZlbnQuZ2V0RWxlbWVudCgpLCBmYWxzZSk7Ci0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RpZmllZEVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQl0cmVlVmlld2VyLnNldENoZWNrZWQobW9kaWZpZWRFbGVtZW50cy5nZXQoaSksIGZhbHNlKTsKLQkJCQkJfQotCi0JCQkJfQotCQkJCQotCQkJCS8vIEVORAotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJCi0JCQl9Ci0JCX0pOwotCQkKLQkJSUNoZWNrU3RhdGVMaXN0ZW5lciBjYXRzQ2hlY2tTdGF0ZUxpc3RlbmVyID0gbmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCi0JCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZm9ybS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQotCQkJCQkJc2F2ZUNvbnRlbnRDYXRlZ29yeVNlbGVjdGlvbnNUb0NvbmZpZ3VyYXRpb24oKTsKLQkJCQkJCQotCQkJCQkJLy8gdXBkYXRlIHRoZSBjbG9zdXJlIGVycm9yCi0JCQkJCQlzaG93RXJyb3JzKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfTsKLQkJCi0JCWFkZENhdGVnb3J5Vmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihjYXRzQ2hlY2tTdGF0ZUxpc3RlbmVyKTsKLQkJc3ViQ2F0ZWdvcnlWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKGNhdHNDaGVja1N0YXRlTGlzdGVuZXIpOwotCi0JCS8vIHRyZWVWaWV3ZXIuYWRkVHJlZUxpc3RlbmVyKG5ldyBJVHJlZVZpZXdlckxpc3RlbmVyKCl7Ci0JCS8vCi0JCS8vIHB1YmxpYyB2b2lkIHRyZWVDb2xsYXBzZWQoVHJlZUV4cGFuc2lvbkV2ZW50IGV2ZW50KSB7Ci0JCS8vCQkJCQotCQkvLyB9Ci0JCS8vCi0JCS8vIHB1YmxpYyB2b2lkIHRyZWVFeHBhbmRlZChUcmVlRXhwYW5zaW9uRXZlbnQgZXZlbnQpIHsKLQkJLy8gLy91cGRhdGVDb25maWdTZWxlY3Rpb24oKTsKLQkJLy8KLQkJLy8gLy8gcmVzdG9yZSB0aGUgY2hlY2sgc3RhdGUgb2YgdGhlIFVJIGVsZW1lbnRzCi0JCS8vIE9iamVjdCBvYmogPSBldmVudC5nZXRFbGVtZW50KCk7Ci0JCS8vIGJvb2xlYW4gcGFyZW50U3RhdGUgPSB0cmVlVmlld2VyLmdldENoZWNrZWQob2JqKTsKLQkJLy8JCQkJCi0JCS8vIENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIgY3AgPQotCQkvLyAoQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlcil0cmVlVmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpOwotCQkvLyBPYmplY3RbXSBjaGlsZHJlbiA9IGNwLmdldENoaWxkcmVuKG9iaik7Ci0JCS8vIGlmICggY2hpbGRyZW4gIT0gbnVsbCApCi0JCS8vIHsKLQkJLy8gZm9yICggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0JCS8vIHsKLQkJLy8gYm9vbGVhbiBjaGVjayA9IGZhbHNlOwotCQkvLyAvLyBpZiB0aGUgZm9sZGVyIGlzIGEgVUkgZm9sZGVyLCBrZWVwIHRoZSBjaGVjayBzdGF0ZQotCQkvLyBpZiAoIGNoaWxkcmVuW2ldIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luICkKLQkJLy8gewotCQkvLyBjaGVjayA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5jb250YWlucyhjaGlsZHJlbltpXSk7Ci0JCS8vIH0KLQkJLy8gZWxzZSBpZiAoIGNoaWxkcmVuW2ldIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSApCi0JCS8vIHsKLQkJLy8gY2hlY2sgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKGNoaWxkcmVuW2ldKTsKLQkJLy8gfQotCQkvLyBlbHNlCi0JCS8vIHsKLQkJLy8gY2hlY2sgPSBwYXJlbnRTdGF0ZTsKLQkJLy8gfQotCQkvLwkJCQkJCQotCQkvLyBib29sZWFuIHJldCA9IHRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChjaGlsZHJlbltpXSwgY2hlY2spOwotCQkvLyBpZiAoIHJldCA9PSBmYWxzZSkKLQkJLy8gewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNhbid0IHNldCBzdGF0ZSIpOwotCQkvLyB9Ci0JCS8vCi0JCS8vIH0KLQkJLy8gfQotCQkvLwkJCQkKLQkJLy8gfX0pOwotCi0JCS8vIGxpc3RlbiB0byB0aGUgbGlicmFyeSBjaGFuZ2VzIGFuZCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSB0aGUKLQkJLy8gY29uZmlndXJhdGlvbiB2aWV3Ci0JCWxpYkxpc3RlbmVyID0gbmV3IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2hhbmdlZChpbnQgb3B0aW9uLCBDb2xsZWN0aW9uIGNoYW5nZWRJdGVtcykgewotCQkJCS8vIGZvciBwZXJmb3JtYW5jZSByZWFzb24sIHdlIHNob3VsZCBub3QgcmVzcG9uc2UgdG8gZXZlcnkKLQkJCQkvLyBsaWJyYXJ5IGNoYW5nZQotCQkJCS8vIG9ubHkgY292ZXIgcGFja2FnZSBhbmQgcGx1Z2luIGNoYW5nZXMKLQkJCQlpZiAob3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0RFTEVURUQKLQkJCQkJCXx8IG9wdGlvbiA9PSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ORVdDSElMRAotCQkJCQkJfHwgb3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX05FV0NISUxEKSB7Ci0JCQkJCWlmIChjaGFuZ2VkSXRlbXMgIT0gbnVsbCAmJiBjaGFuZ2VkSXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCQkJT2JqZWN0IG8gPSBjaGFuZ2VkSXRlbXMudG9BcnJheSgpWzBdOwotCQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4KLQkJCQkJCQkJfHwgbyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQKLQkJCQkJCQkJfHwgbyBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UKLQkJCQkJCQkJfHwgbyBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJCQkJcmVJbml0aWFsaXplQ29uZmlnRmFjdG9yeSgpOwotCQkJCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0JCQkJCQkJdXBkYXRlQ2hlY2tTdGF0ZXMoKTsKLQkJCQkJCQlzaG93RXJyb3JzKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQltYW5hZ2VyLmFkZExpc3RlbmVyKGxpYkxpc3RlbmVyKTsKLQkJfQotCQkKLQkJLy8gbGlzdGVuIHRvIHBsdWdpbiBwcmVzZW50YXRpb24gbGF5b3V0IGNoYW5nZXMKLQkJUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5JTlNUQU5DRS5hZGRMaXN0ZW5lcihsYXlvdXRMaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2hvd0hpZGVFbGVtZW50cygpIHsKLQkJY29uZmlnRmlsdGVyLnNldEhpZGUoKTsKLQkJYWRkQ2F0ZWdvcnlUcmVlRmlsdGVyLnRvZ2dsZUhpZGVVbmNoZWNrZWQoKTsKLQkJc3ViQ2F0ZWdvcnlUcmVlRmlsdGVyLnRvZ2dsZUhpZGVVbmNoZWNrZWQoKTsKLS8vCQlpbml0aWFsaXplQ0NWaWV3ZXJzKCk7Ci0JCXJlZnJlc2hWaWV3ZXJzKCk7Ci0JCXVwZGF0ZUNoZWNrU3RhdGVzKCk7IC8vIG5lZGVkIHRvIGhhdmUgdGhpcyB0byB1cGRhdGUgdGhlIGNoZWNrIHN0YXR1cwotCX0KLQotCS8qKgotCSAqIHRoZSBVSSBzZWxlY3Rpb25zIGNvbnRhaW5zIFVJIGZvbGRlcnMsIG5lZWQgdG8gY29udmVydCB0byB0aGUKLQkgKiBjb3JyZXNwb25kaW5nIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbnMKLQkgKiAKLQkgKiBAcmV0dXJuIE9iamVjdFtdIHRoZSBjb252ZXJ0ZWQgc2VsZWN0aW9ucwotCSAqLwotCXByb3RlY3RlZCBPYmplY3RbXSBnZXRDb252ZXJ0ZWRTZWxlY3Rpb25zKCkgewotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlPYmplY3RbXSBzZWxzID0gdHJlZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQotCQlDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyIGNwID0gKENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIpIHRyZWVWaWV3ZXIKLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2Vscy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IHNlbCA9IGNwLmdldFVJVGFyZ2V0RWxlbWVudChzZWxzW2ldKTsKLQkJCWlmIChzZWwgIT0gbnVsbCAmJiAhaXRlbXMuY29udGFpbnMoc2VsKSkgewotCQkJCWl0ZW1zLmFkZChzZWwpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGl0ZW1zLnRvQXJyYXkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzaG93RXJyb3JzKCkgewotCQkvLyBDb25maWd1cmF0aW9uQ2xvc3VyZSBjID0gY2xvc3VyZTsKLQkJLy8gYy5zZXRTZWxlY3Rpb25zKHRyZWVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpOwotCi0JCS8vIHNhdmUgdGhlIHByZXZpb3VzIGludmFsaWQgZWxlbWVudHMKLQkJTGlzdCBpbnZhbGlkID0gY2xvc3VyZS5nZXRJbnZhbGlkRWxlbWVudHMoKTsKLQotCQkvLyBjb252ZXJ0IHNlbGVjdGlvbnMgdG8gbWV0aG9kIHBsdWdpbnMgYW5kIG1ldGhvZCBwYWNrYWdlcwotCQkvL2Nsb3N1cmUuc2V0U2VsZWN0aW9ucyhnZXRDb252ZXJ0ZWRTZWxlY3Rpb25zKCkpOwotCQljbG9zdXJlLmNoZWNrRXJyb3IoKTsKLQkJCi0JCWlmIChjb25maWdGaWx0ZXIuaXNIaWRpbmcoKSkgewotCQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBnZXQgdGhlIG5ldyBlcnJvciBlbGVtZW50cywgYWRkIHRvIHRoZSBwcmV2aW91cyBlcnJvciBlbGVtZW50cywKLQkJCS8vIGFuZCB1cGRhdGUgdGhlbSB0byB1cGRhdGUgdGhlIGVycm9yL3dhcm5pbmcgaW1hZ2VzCi0JCQlpbnZhbGlkLmFkZEFsbChjbG9zdXJlLmdldEludmFsaWRFbGVtZW50cygpKTsKLQotCQkJLy8gYWxzbyBhZGQgdGhlIFVJIGZvbGRlcnMKLQkJCUNvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIgY3AgPSAoQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlcgotCQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCQlpbnZhbGlkLmFkZEFsbChjcC5nZXRVSUVsZW1lbnRzKCkpOwotCi0JCQl0cmVlVmlld2VyLnVwZGF0ZShpbnZhbGlkLnRvQXJyYXkoKSwgbnVsbCk7Ci0JCX0KLQotCQl0aGlzLm5lZWRVcGRhdGUgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2FkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2dldFNlbGVjdGlvbigpCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gY3VycmVudFNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI3NldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWN1cnJlbnRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0KLQkJZm9yIChJdGVyYXRvciBsaXN0ZW5lcnMgPSBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGxpc3RlbmVycwotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGxpc3RlbmVycwotCQkJCQkubmV4dCgpOwotCQkJbGlzdGVuZXIKLQkJCQkJLnNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBzZWxlY3Rpb24pKTsKLQkJfQotCi0JCS8vIHVwZGF0ZSB0aGUgZGVzY3JpcHRpb24gZmllbGQKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCU9iamVjdCBvID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCVN0cmluZyBicmllZkRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIG8pLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCWVsZW1EZXNwQ29udGVudFRleHQuc2V0VGV4dChicmllZkRlc2MgIT0gbnVsbCA/IGJyaWVmRGVzYyA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBNYWtlIGNvbmZpZ3VyYXRpb24gY2xvc3VyZQotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbWFrZUNsb3N1cmUoKSB7Ci0JCWNsb3N1cmUuZml4RXJyb3JzKCk7Ci0JCXJlZnJlc2hWaWV3ZXJzKCk7Ci0JCXVwZGF0ZUNoZWNrU3RhdGVzKCk7Ci0JCXNhdmVDb25maWd1cmF0aW9uKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBGaXggYWxsIHdhcm5pbmdzIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpeFdhcm5pbmcoKSB7Ci0KLQkJY2xvc3VyZS5maXhQcm9ibGVtcygpOwotCQlyZWZyZXNoVmlld2VycygpOwkKLQkJdXBkYXRlQ2hlY2tTdGF0ZXMoKTsKLQkJc2F2ZUNvbmZpZ3VyYXRpb24oKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVDaGVja1N0YXRlcyhPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBjaGVja2VkKSB7Ci0KLQkJLy8gT2JqZWN0IGVsZW1lbnQgPSBldmVudC5nZXRFbGVtZW50KCk7Ci0KLQkJaWYgKGNoZWNrZWQgPT0gdHJ1ZSkgewotCQkJSVRyZWVDb250ZW50UHJvdmlkZXIgY3AgPSAoSVRyZWVDb250ZW50UHJvdmlkZXIpIHRyZWVWaWV3ZXIKLQkJCQkJLmdldENvbnRlbnRQcm92aWRlcigpOwotCQkJY2hlY2tQYXJlbnQoY3AsIGVsZW1lbnQpOwotCQkJLy8gdHJlZVZpZXdlci5zZXRDaGVja2VkKGVsZW1lbnQsIHRydWUpOwotCQl9IGVsc2UKLQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChlbGVtZW50LCBmYWxzZSk7Ci0KLQkJc2VsZWN0aW9uQ2hpbGRyZW4oZWxlbWVudCwgY2hlY2tlZCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3QvdW5zZWxlY3QgYWxsIHRoZSBjaGlsZHJlbiBmb3IgdGhlIGdpdmVuIGVsZW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjaGVja2VkCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gY2hlY2tlZCkgewotCQlJVHJlZUNvbnRlbnRQcm92aWRlciBjcCA9IChJVHJlZUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlcgotCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJT2JqZWN0W10gY2hpbGRzID0gY3AuZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cmVlVmlld2VyLnNldENoZWNrZWQoY2hpbGRzW2ldLCBjaGVja2VkKTsKLQkJCXNlbGVjdGlvbkNoaWxkcmVuKGNoaWxkc1tpXSwgY2hlY2tlZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2hlY2tTdGF0ZXMoKSB7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldFZpc2libGUoZmFsc2UpOwotCQkvLyB0cmVlVmlld2VyLmV4cGFuZEFsbCgpOwotCi0JCXRyeSB7Ci0JCQlPYmplY3QgY29udGVudCA9IHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKTsKLQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCi0JCQkJLy8gc2V0IHRoZSBzZWxlY3Rpb24gc2luY2UgdGhlIGNvbHN1cmUgbWF5IGNoYW5nZWQgd2l0aCBtYWtlCi0JCQkJLy8gY2xvc3VyZSBvciBmaXggZXJyb3IKLQkJCQkvLyB0cmVlVmlld2VyLnNldENoZWNrZWRFbGVtZW50cyhjbG9zdXJlCi0JCQkJLy8gLmdldFNlbGVjdGlvbigpKTsKLQkJCQlPYmplY3RbXSBzZWxlY3Rpb25MaXN0ID0gY2xvc3VyZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyIGNwID0gKENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIpIHRyZWVWaWV3ZXIKLQkJCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IHNlbGVjdGlvbkxpc3RbaV07Ci0KLQkJCQkJY2hlY2tQYXJlbnQoY3AsIGVsZW1lbnQpOwotCQkJCQl0cmVlVmlld2VyLnNldENoZWNrZWQoZWxlbWVudCwgdHJ1ZSk7Ci0JCQkJfQotCi0JCQkJLy8gYWxzbyBzZXQgdGhlIFVJIGZvbGRlcnMgaWYgdGhlIGNvcnJlc3BvbmRpbmcgcGFja2FnZSBpcwotCQkJCS8vIHNlbGVjdGVkCi0JCQkJZm9yIChJdGVyYXRvciBpdCA9IG5ldyBBcnJheUxpc3QoY3AuZ2V0VUlFbGVtZW50cygpKS5pdGVyYXRvcigpOyBpdAotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQkJCU9iamVjdCBvID0gY3AuZ2V0VUlUYXJnZXRFbGVtZW50KGVsZW1lbnQpOwotCQkJCQlpZiAobyAhPSBudWxsICYmIGNsb3N1cmUuaXNTZWxlY3RlZChvKSkgewotCQkJCQkJY2hlY2tQYXJlbnQoY3AsIGVsZW1lbnQpOwotCQkJCQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKGVsZW1lbnQsIHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gcmVzdG9yZSB0aGUgZXhwYW5kIHN0YXRlCi0JCQkJLy90cmVlVmlld2VyLnNldEV4cGFuZGVkRWxlbWVudHMoZXhwYW5kZWRFbGVtZW50cy50b0FycmF5KCkpOwotCi0JCQl9Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1BhcmVudChJVHJlZUNvbnRlbnRQcm92aWRlciBjcCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSAvKgotCQkJCQkJCQkJCQkJCQkJCSAqIHx8IGVsZW1lbnQgPT0KLQkJCQkJCQkJCQkJCQkJCQkgKiBjdXJyZW50Um9vdE5vZGUKLQkJCQkJCQkJCQkJCQkJCQkgKi8pIHsKLQkJCXJldHVybjsKLQkJfQotCQltb2RpZmllZEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJT2JqZWN0IHBhcmVudCA9IExpYnJhcnlVdGlsLnVud3JhcChjcC5nZXRQYXJlbnQoZWxlbWVudCkpOwotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChwYXJlbnQsIHRydWUpOwotCQkJLy8gY29uZmlnRmFjdG9yeS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmFkZCgoRU9iamVjdClwYXJlbnQsCi0JCQkvLyBmYWxzZSk7Ci0JCQljaGVja1BhcmVudChjcCwgcGFyZW50KTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogR2V0IGFsbCBwYXJlbnRzCi0JICogQHBhcmFtIGxpc3QKLQkgKiBAcGFyYW0gcGtnCi0JICovCi0JcHVibGljIHZvaWQgZ2V0QWxsUGFyZW50cyhMaXN0IGxpc3QsIE1ldGhvZFBhY2thZ2UgcGtnKSB7Ci0JCU1ldGhvZFBhY2thZ2UgcGFyZW50UGtnID0gKChNZXRob2RQYWNrYWdlKSBwa2cpLmdldFBhcmVudFBhY2thZ2UoKTsKLQkJaWYgKHBhcmVudFBrZyAhPSBudWxsKSB7Ci0JCQlsaXN0LmFkZChwYXJlbnRQa2cpOwotCQkJZ2V0QWxsUGFyZW50cyhsaXN0LCBwYXJlbnRQa2cpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgcGFyZW50cyBmb3IgdGhlIGdpdmVuIGVsZW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyBib29sZWFuIHNldFBhcmVudHNDaGVja2VkKE9iamVjdCBlbGVtZW50KSB7Ci0JCVdpZGdldCB3aWRnZXQgPSB0cmVlVmlld2VyLnRlc3RGaW5kSXRlbShlbGVtZW50KTsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRyZWVJdGVtKSB7Ci0JCQlUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKSB3aWRnZXQ7Ci0JCQlpdGVtID0gaXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0JCQl3aGlsZSAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJaXRlbS5zZXRDaGVja2VkKHRydWUpOwotCQkJCWl0ZW0gPSBpdGVtLmdldFBhcmVudEl0ZW0oKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIHJldHVybiBpc0RpcnR5OwotCX0KLQotCS8qKgotCSAqIFNldCBkaXJ0eSBmbGFnCi0JICogQHBhcmFtIGRpcnR5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGlydHkoYm9vbGVhbiBkaXJ0eSkgewotCQlpc0RpcnR5ID0gZGlydHk7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudCBwcm92aWRlciBmb3IgY29uZmlndXJhdGlvbiBwYWNrYWdlcwotCSAqLwotCXB1YmxpYyBjbGFzcyBDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMKLQkJCUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIHsKLQkJLy9wcml2YXRlIENvbmZpZ3VyYXRpb25GYWN0b3J5IGNvbmZpZ0ZhY3Rvcnk7Ci0KLQkJLy8gcHJpdmF0ZSBib29sZWFuIHNob3dNZXRob2RNb2RlbE9ubHkgPSBmYWxzZTsKLQotCQkvLyB0aGVyZSBpcyBhIHByb2JsZW0gaW4gdGhlIHBhc3NlZCBpbiBBZGFwdGVyRmFjdG9yeQotCQkvLyBpdCBjYW4ndCBmaW5kIHRoZSBjb3JyZWN0IHBhcmVudCBmcm9tIHRoZSBjaGlsZAotCQkvLyBuZWVkIHRvIGJ1aWxkIGEgbWFwIG9mIGNoaWxkIHRvIGl0J3MgcGFyZW50IGlmIHRoZSBjaGlsZCBpcyBhIFVJCi0JCS8vIGZvbGRlcgotCQkvLyBjbGVhciB0aGUgbWFwIHdoZW4gdGhlIGlucHV0IGlzIHNldAotCQlNYXAgY2hpbGRVSVBhcmVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJTGlzdCB1aUZvbGRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHVibGljIExpc3QgZ2V0VUlFbGVtZW50cygpIHsKLQkJCXJldHVybiB1aUZvbGRlcnM7Ci0JCX0KLQotCQkvKioKLQkJICogQ3JlYXRlIGFuIGluc3RhbmNlCi0JCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCQkgKi8KLQkJcHVibGljIENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIoLy9Db25maWd1cmF0aW9uRmFjdG9yeSBjb25maWdGYWN0b3J5LAotCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LyogLCBib29sZWFuIHNob3dNZXRob2RNb2RlbE9ubHkgKi8pIHsKLQkJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCS8vIHRoaXMuc2hvd01ldGhvZE1vZGVsT25seSA9IHNob3dNZXRob2RNb2RlbE9ubHk7Ci0JCX0KLQotCQkvKgotCQlwdWJsaWMgQ29uZmlndXJhdGlvbkZhY3RvcnkgZ2V0Q29uZmlnRmFjdG9yeSgpIHsKLQkJCXJldHVybiBjb25maWdGYWN0b3J5OwotCQl9Ci0JCSovCi0KLQkJLy8gcHVibGljIHZvaWQgc2V0U2hvd01ldGhvZE1vZGVsT25seShib29sZWFuIHNob3dPbmx5KSB7Ci0JCS8vIHNob3dNZXRob2RNb2RlbE9ubHkgPSBzaG93T25seTsKLQkJLy8gfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCS8vIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgUm9vdENvbnRlbnQpIHsKLQkJCS8vIHJldHVybiAoKFJvb3RDb250ZW50KSBwYXJlbnRFbGVtZW50KS5nZXRDaGlsZHJlbigpOwotCQkJLy8gfSBlbHNlIHsKLQkJCS8vIGlmIChzaG93TWV0aG9kTW9kZWxPbmx5KSB7Ci0JCQkvLyByZXR1cm4gbnVsbDsKLQkJCS8vIH0gZWxzZSB7Ci0JCQlPYmplY3RbXSBpdGVtcyA9IGdldFZhbGlkSXRlbXMocGFyZW50RWxlbWVudCwgc3VwZXIKLQkJCQkJLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpKTsKLQkJCXJldHVybiBpdGVtczsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJLy8gaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIFJvb3RDb250ZW50KSB7Ci0JCQkvLyByZXR1cm4gKChSb290Q29udGVudCkgaW5wdXRFbGVtZW50KS5nZXRDaGlsZHJlbigpOwotCQkJLy8gfSBlbHNlIHsKLQotCQkJT2JqZWN0W10gaXRlbXMgPSBnZXRWYWxpZEl0ZW1zKGlucHV0RWxlbWVudCwgc3VwZXIKLQkJCQkJLmdldEVsZW1lbnRzKGlucHV0RWxlbWVudCkpOwotCi0JCQkvLyBpZiAoc2hvd01ldGhvZE1vZGVsT25seSAmJiBpdGVtcyAhPSBudWxsKSB7Ci0JCQkvLyBMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJLy8gaWYgKGl0ZW1zW2ldIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkvLyBlbGVtZW50cy5hZGQoaXRlbXNbaV0pOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gcmV0dXJuIGVsZW1lbnRzLnRvQXJyYXkoKTsKLQkJCS8vCi0JCQkvLyB9IGVsc2UgewotCQkJcmV0dXJuIGl0ZW1zOwotCQkJLy8gfQotCQkJLy8gfQotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGlzVUlGb2xkZXIoT2JqZWN0IGUpIHsKLQkJCXJldHVybiAoZSBpbnN0YW5jZW9mIENvbnRlbnRJdGVtUHJvdmlkZXIKLQkJCQkJfHwgZSBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlciB8fCBlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZXNJdGVtUHJvdmlkZXIgfHwKLQkJCQkJZSBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIKLQkJCS8qCi0JCQkgKiB8fCBlIGluc3RhbmNlb2YgU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIHx8IGUgaW5zdGFuY2VvZgotCQkJICogRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIgfHwgZSBpbnN0YW5jZW9mCi0JCQkgKiBEb21haW5zSXRlbVByb3ZpZGVyIHx8IGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyIHx8Ci0JCQkgKiBlIGluc3RhbmNlb2YgUm9sZVNldHNJdGVtUHJvdmlkZXIgfHwgZSBpbnN0YW5jZW9mCi0JCQkgKiBUb29sc0l0ZW1Qcm92aWRlciB8fCAoZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSAmJgotCQkJICogVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpZSkKLQkJCSAqLwotCQkJKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0VUlUYXJnZXRFbGVtZW50KE9iamVjdCBlKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJcmV0dXJuICgoQ3VzdG9tQ2F0ZWdvcnkpIGUpLmVDb250YWluZXIoKTsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZTsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnRJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gKChDb250ZW50SXRlbVByb3ZpZGVyKSBlKS5nZXRQYXJlbnQobnVsbCk7Ci0JCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gKChQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIGUpLmdldFBhcmVudChudWxsKTsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQlPYmplY3QgdGFyZ2V0ID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBlKS5nZXRUYXJnZXQoKTsKLQkJCQlpZiAodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlyZXR1cm4gdGFyZ2V0OwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwcml2YXRlIE9iamVjdFtdIGdldFZhbGlkSXRlbXMoT2JqZWN0IHBhcmVudCwgT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnRzOwotCQkJfQotCi0JCQlMaXN0IHBrZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJT2JqZWN0IGUgPSBMaWJyYXJ5VXRpbC51bndyYXAoZWxlbWVudHNbaV0pOwotCQkJCWJvb2xlYW4gdWlGb2xkZXIgPSBpc1VJRm9sZGVyKGUpOwotCQkJCWlmICh1aUZvbGRlciB8fCBlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZQotCQkJCQkJfHwgZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlwa2dzLmFkZChlKTsKLQotCQkJCQlpZiAodWlGb2xkZXIpIHsKLQkJCQkJCXVpRm9sZGVycy5hZGQoZSk7Ci0JCQkJCX0KLQotCQkJCQkvLyBpZiB0aGUgcGFyZW50IGlzIGEgVUkgZm9sZGVyLCBtYXAgdGhlIGNoaWxkIHRvIHRoZSBwYXJlbnQKLQkJCQkJLy8gc28gdGhhdCB3ZSBjYW4gZ2V0IHRoZSBwYXJlbnQgbGF0ZXIKLQkJCQkJLy8gaWYgKCAhKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpICkKLQkJCQkJewotCQkJCQkJY2hpbGRVSVBhcmVudE1hcC5wdXQoZSwgcGFyZW50KTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCTsgLy8gU3lzdGVtLm91dC5wcmludGxuKCJJZ25vcmVkOiAiICsgZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gcGtncy50b0FycmF5KCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkvLyBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvb3RDb250ZW50KSB7Ci0JCQkvLyByZXR1cm4gbnVsbDsKLQkJCS8vIH0gZWxzZQotCQkJaWYgKGNoaWxkVUlQYXJlbnRNYXAuY29udGFpbnNLZXkoZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gY2hpbGRVSVBhcmVudE1hcC5nZXQoZWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCS8vIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9vdENvbnRlbnQpIHsKLQkJCS8vIHJldHVybiB0cnVlOwotCQkJLy8gfSBlbHNlCi0JCQkvLyBpZiAoc2hvd01ldGhvZE1vZGVsT25seSkgewotCQkJLy8gcmV0dXJuIGZhbHNlOwotCQkJLy8gfSBlbHNlIHsKLQkJCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCQlyZXR1cm4gKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCk7Ci0KLQkJCS8vIHJldHVybiB0cmVlTm9kZVByb3ZpZGVyLmhhc0NoaWxkcmVuKGVsZW1lbnQpOwotCQkJLy8gcmV0dXJuIHN1cGVyLmhhc0NoaWxkcmVuKGVsZW1lbnQpOwotCQkJLy8gfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQlzdXBlci5pbnB1dENoYW5nZWQodmlld2VyLCBvbGRJbnB1dCwgbmV3SW5wdXQpOwotCQkJY2hpbGRVSVBhcmVudE1hcC5jbGVhcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQotCQkJaWYgKChub3RpZmljYXRpb24gaW5zdGFuY2VvZiBJVmlld2VyTm90aWZpY2F0aW9uKSkgewotCQkJCWZpbmFsIElWaWV3ZXJOb3RpZmljYXRpb24gdm50ID0gKElWaWV3ZXJOb3RpZmljYXRpb24pIG5vdGlmaWNhdGlvbjsKLQkJCQlmaW5hbCBPYmplY3QgZWxlbWVudCA9IHZudC5nZXRFbGVtZW50KCk7Ci0JCQkJZmluYWwgQ29uZmlndXJhdGlvblZpZXdlciBjdHJsID0gKChDb25maWd1cmF0aW9uVmlld2VyKSBzdXBlci52aWV3ZXIpOwotCQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgKHZudC5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQURECi0JCQkJCQkvKnx8IHZudC5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUKi8pKSB7Ci0KLQkJCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWN0cmwuc2V0Q2hlY2tlZChlbGVtZW50LCB0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQkJdWlGb2xkZXJzLmNsZWFyKCk7Ci0JCQljaGlsZFVJUGFyZW50TWFwLmNsZWFyKCk7Ci0JCQkvL2NvbmZpZ0ZhY3RvcnkgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGFiZWwgcHJvdmlkZXIgZm9yIGNvbmZpZ3VyYXRpb24gcGFja2FnZXMKLQkgKi8KLQlwdWJsaWMgY2xhc3MgQ29uZmlnUGFja2FnZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkJQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0KLQkJLy9Db25maWd1cmF0aW9uRmFjdG9yeSBjb25maWdGYWN0b3J5OwotCi0JCUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBhZlByb3ZpZGVyOwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JCSAqIEBwYXJhbSBjb250ZW50UHJvdmlkZXIKLQkJICovCi0JCXB1YmxpYyBDb25maWdQYWNrYWdlTGFiZWxQcm92aWRlcigKLQkJCQlDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQkJdGhpcy5jb250ZW50UHJvdmlkZXIgPSBjb250ZW50UHJvdmlkZXI7Ci0JCQlhZlByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihjb250ZW50UHJvdmlkZXIKLQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJLy90aGlzLmNvbmZpZ0ZhY3RvcnkgPSBjb250ZW50UHJvdmlkZXIuZ2V0Q29uZmlnRmFjdG9yeSgpOwotCQl9Ci0KLQkJcHJpdmF0ZSBFbGVtZW50RGVwZW5kZW5jeUVycm9yIGdldEZpcnN0Q2hpbGRFcnJvcihPYmplY3QgZSkgewotCQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IG51bGw7Ci0JCQlPYmplY3RbXSBjaGlsZHJlbiA9IGNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbihlKTsKLQkJCWlmIChjaGlsZHJlbiA9PSBudWxsIHx8IGNoaWxkcmVuLmxlbmd0aCA9PSAwKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gY2hpbGRyZW5baV07Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQkJcmV0dXJuIGdldEZpcnN0Q2hpbGRFcnJvcihvYmplY3QpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVycm9yID0gY2xvc3VyZS5nZXRFcnJvcihvYmplY3QpOwotCQkJCQlpZiAoZXJyb3IgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGVycm9yOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLQotCQkvKioKLQkJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBJTGFiZWxQcm92aWRlcn0uZ2V0SW1hZ2UgYnkgZm9yd2FyZGluZyBpdCB0bwotCQkgKiBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzCi0JCSAqIHtAbGluayBJSXRlbUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UgSUl0ZW1MYWJlbFByb3ZpZGVyLmdldEltYWdlfQotCQkgKi8KLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJCS8vIGRpc2FibGUgZm9yIG5vdyB0aWxsIGl0IHdvcmtzCi0JCQlDb25maWd1cmF0aW9uQ2xvc3VyZSBjb25maWcxID0gY2xvc3VyZTsKLQkJCWlmIChjb25maWcxICE9IG51bGwpIHsKLQkJCQkvLyBubywgdGhpcyB3aWxsIHNob3cgdGhlIGVycm9yIG1hcmsgZXZlbiBpZiB0aGUgY2hpbGQgaGFzIG5vCi0JCQkJLy8gZXJyb3IsIG5vdCBnb29kCi0JCQkJLy8gc2hvdyB0aGUgZXJyb3IgaWYgdGhlcmUgaXMgY2hpbGQgZXJyb3IKLQkJCQkvLyB3aGlsZSAoIG9iamVjdCBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpCi0JCQkJLy8gewotCQkJCS8vIG9iamVjdCA9IGNvbnRlbnRQcm92aWRlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJCQkvLyB9Ci0KLQkJCQlFbGVtZW50RGVwZW5kZW5jeUVycm9yIGVycm9yID0gbnVsbDsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQllcnJvciA9IGdldEZpcnN0Q2hpbGRFcnJvcihvYmplY3QpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVycm9yID0gY2xvc3VyZS5nZXRFcnJvcihvYmplY3QpOwotCQkJCX0KLQotCQkJCWlmIChlcnJvciAhPSBudWxsKSB7Ci0JCQkJCWlmIChlcnJvci5pc0Vycm9yKCkgfHwgZXJyb3IuaXNDaGlsZEVycm9yKCkpIHsKLQkJCQkJCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpCi0JCQkJCQkJCS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0VSUk9SX1RTSyk7IAotCQkJCQl9IGVsc2UgaWYgKGVycm9yLmlzV2FybmluZygpIHx8IGVycm9yLmlzQ2hpbGRXYXJuaW5nKCkpIHsKLQkJCQkJCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpCi0JCQkJCQkJCS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX1dBUk5fVFNLKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIGFmUHJvdmlkZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCi0JCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZUZyb21PYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIEV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQotCQkvKioKLQkJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBJTGFiZWxQcm92aWRlcn0uZ2V0VGV4dCBieSBmb3J3YXJkaW5nIGl0IHRvCi0JCSAqIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMKLQkJICoge0BsaW5rIElJdGVtTGFiZWxQcm92aWRlciNnZXRUZXh0IElJdGVtTGFiZWxQcm92aWRlci5nZXRUZXh0fQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJLy8gcmV0dXJuCi0JCQkJLy8gKChQcm9jZXNzQ29tcG9uZW50KW9iamVjdCkuZ2V0UHJvY2VzcygpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQlQcm9jZXNzIHByb2MgPSAoUHJvY2VzcykgKChQcm9jZXNzQ29tcG9uZW50KSBvYmplY3QpCi0JCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJCWlmIChwcm9jICE9IG51bGwpCi0JCQkJCXJldHVybiBwcm9jLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQllbHNlCi0JCQkJCS8vIGlmIHByb2Nlc3MgaXMgbnVsbCwgcmV0dXJuIHByb2Nlc3Njb21wb25lbnQgbmFtZQotCQkJCQlyZXR1cm4gKChQcm9jZXNzQ29tcG9uZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJCX0gZWxzZQotCQkJCXJldHVybiBhZlByb3ZpZGVyLmdldFRleHQob2JqZWN0KTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJCWNvbnRlbnRQcm92aWRlciA9IG51bGw7Ci0JCQlhZlByb3ZpZGVyID0gbnVsbDsKLQkJCS8vY29uZmlnRmFjdG9yeSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaWx0ZXIgZm9yIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKgotCSAqLwotCXB1YmxpYyBjbGFzcyBDb25maWdUcmVlRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLQkJYm9vbGVhbiBoaWRlVW5jaGVja2VkTm9kZXMgPSBmYWxzZTsKLQotCQlDaGVja2JveFRyZWVWaWV3ZXIgY2hlY2tUcmVlID0gbnVsbDsKLQotCQlDb25maWd1cmF0aW9uQ2xvc3VyZSBjbG9zdXJlID0gbnVsbDsKLQotCQlDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyIGNwID0gbnVsbDsKLQotCQlwdWJsaWMgQ29uZmlnVHJlZUZpbHRlcihDb25maWd1cmF0aW9uQ2xvc3VyZSBjbG9zdXJlKSB7Ci0JCQl0aGlzLmNsb3N1cmUgPSBjbG9zdXJlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0SGlkZSgpIHsKLQkJCWhpZGVVbmNoZWNrZWROb2RlcyA9IGhpZGVVbmNoZWNrZWROb2RlcyA9PSB0cnVlID8gZmFsc2UgOiB0cnVlOwotCQkJCi0JCQlpZiAoIGNoZWNrVHJlZSAhPSBudWxsICkgewotCQkJCWNoZWNrVHJlZS5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsCi0JCQkJT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChjaGVja1RyZWUgPT0gbnVsbCkgewotCQkJCWNoZWNrVHJlZSA9IChDaGVja2JveFRyZWVWaWV3ZXIpIHZpZXdlcjsKLQkJCQljcCA9IChDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyKSBjaGVja1RyZWUKLQkJCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCX0KLQotCQkJaWYgKGhpZGVVbmNoZWNrZWROb2RlcykgewotCQkJCU9iamVjdCBvID0gY3AuZ2V0VUlUYXJnZXRFbGVtZW50KGVsZW1lbnQpOwotCQkJCXJldHVybiBjbG9zdXJlLmlzU2VsZWN0ZWQobyk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzSGlkaW5nKCkgewotCQkJcmV0dXJuIGhpZGVVbmNoZWNrZWROb2RlczsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQljaGVja1RyZWUgPSBudWxsOwotCQkJY3AgPSBudWxsOwotCQkJY2xvc3VyZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuCi0JICogCQlUcnVlIGlmIGNvbmZpZ3VyYXRpb24gaXMgc2F2ZSBzdWNjZXNzZnVsbHksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhdmVDb25maWd1cmF0aW9uKCkgewotCQlDb25maWd1cmF0aW9uRGF0YSBjb25maWdEYXRhID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uTWFuYWdlcihjb25maWcpCi0JCQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkRhdGEoKTsKLQkJCi0JCWNvbmZpZ0RhdGEuc2V0RW5hYmxlVXBkYXRlKGZhbHNlKTsKLQkJYm9vbGVhbiByZXQgPSBzYXZlQ29uZmlndXJhdGlvbl8oKTsKLQkJY29uZmlnRGF0YS5zZXRFbmFibGVVcGRhdGUodHJ1ZSk7Ci0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHNhdmVDb25maWd1cmF0aW9uXygpIHsKLQotCQlib29sZWFuIG9sZE5vdGlmeSA9IGNvbmZpZy5lRGVsaXZlcigpOwotCSAgICB0cnkKLQkgICAgewotCSAgICAJLy9jb25maWcuZVNldERlbGl2ZXIoZmFsc2UpOwotCSAgICAJCi0JCQkvLyByZW1vdmUgdGhlIG9sZCBlbnRyaWVzCi0JCQlMaXN0IHBrZ0xpc3QgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQkJTGlzdCBwbGdMaXN0ID0gY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCQotCQkJaWYgKENvbmZpZ3VyYXRpb25VdGlsLnJlbW92ZUNvbGxGcm9tTWV0aG9kUGx1Z2luTGlzdChhY3Rpb25NZ3IsIGNvbmZpZywgcGxnTGlzdCkgPT0gZmFsc2UpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKENvbmZpZ3VyYXRpb25VdGlsLnJlbW92ZUNvbGxGcm9tTWV0aG9kUGFja2FnZUxpc3QoYWN0aW9uTWdyLCBjb25maWcsIHBrZ0xpc3QpID09IGZhbHNlKQotCQkJCXJldHVybiBmYWxzZTsKLQkKLQkJCS8vIGFkZCB0aGUgbmV3IGVudHJpZXMKLQkJCXBrZ0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlwbGdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQotCQkJLy8gd2UgY2hhbmdlZCB0byBsZXQgdGhlIENvbmZpZ3VyYXRpb25DbG9zdXJlIHRvIGRlcGVuZHMgb24gdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkJCS8vIHNvIHNob3VsZCBnZXQgdGhlIHNlbGVjdGlvbiBmcm9tIHRoZSB2aWV3ZXIgY2hlY2tzIGluc3RlYWQgb2YgdGhlIGNsb3N1cmUKLQkJCU9iamVjdFtdIG9ianMgPSB0cmVlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQkJLy8gLy9tb2RpZmllZExpc3QudG9BcnJheSgpOwotCQkJLy9PYmplY3RbXSBvYmpzID0gY2xvc3VyZS5nZXRTZWxlY3Rpb24oKTsKLQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2Jqcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICggKG9ianNbaV0gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pICYmICFwbGdMaXN0LmNvbnRhaW5zKG9ianNbaV0pICkgewkJCQkKLQkJCQkJcGxnTGlzdC5hZGQob2Jqc1tpXSk7Ci0JCQkJCQotLy8JCQkJCS8vIGFkZCBhbGwgc3lzdGVtIHBhY2thZ2VzIGludG8gdGhlIHBhY2thZ2Ugc2VsZWN0aW9uCi0vLwkJCQkJTGlzdCBwa2dzID0gVG5nVXRpbC5nZXRBbGxTeXN0ZW1QYWNrYWdlcygoTWV0aG9kUGx1Z2luKW9ianNbaV0pOwotLy8JCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwa2dzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLS8vCQkJCQkJT2JqZWN0IHBrZyA9IGl0Lm5leHQoKTsKLS8vCQkJCQkJaWYgKCFwa2dMaXN0LmNvbnRhaW5zKHBrZykpIHsKLS8vCQkJCQkJCXBrZ0xpc3QuYWRkKHBrZyk7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCAob2Jqc1tpXSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpICYmICFwa2dMaXN0LmNvbnRhaW5zKG9ianNbaV0pICkgewotCQkJCQlwa2dMaXN0LmFkZChvYmpzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChDb25maWd1cmF0aW9uVXRpbC5hZGRDb2xsVG9NZXRob2RQbHVnaW5MaXN0KGFjdGlvbk1nciwgY29uZmlnLCBwbGdMaXN0KSA9PSBmYWxzZSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoQ29uZmlndXJhdGlvblV0aWwuYWRkQ29sbFRvTWV0aG9kUGFja2FnZUxpc3QoYWN0aW9uTWdyLCBjb25maWcsIHBrZ0xpc3QpID09IGZhbHNlKQotCQkJCXJldHVybiBmYWxzZTsKLQkKLQkgICAgCS8vIHZhbGlkYXRlIGJlZm9yZSBzYXZlCi0JICAgIAlUbmdVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihhY3Rpb25NZ3IsIGNvbmZpZyk7Ci0KLQkJCXJldHVybiB0cnVlOwotCQkKLQkJfSBmaW5hbGx5IHsKLQkJCWNvbmZpZy5lU2V0RGVsaXZlcihvbGROb3RpZnkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNhdmUgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4KLQkgKiAJCVRydWUgaWYgY29uZmlndXJhdGlvbiBpcyBzYXZlIHN1Y2Nlc3NmdWxseSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2F2ZUNvbnRlbnRDYXRlZ29yeVNlbGVjdGlvbnNUb0NvbmZpZ3VyYXRpb24oKSB7Ci0JCQotICAgIAlMaXN0IG9sZEFkZENhdHMgPSBuZXcgQXJyYXlMaXN0KGNvbmZpZy5nZXRBZGRlZENhdGVnb3J5KCkpOwotICAgIAlMaXN0IG9sZFN1YkNhdHMgPSBuZXcgQXJyYXlMaXN0KGNvbmZpZy5nZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKSk7Ci0gICAgCQotICAgIAlTZXQ8Q29udGVudENhdGVnb3J5PiBuZXdBZGRDYXRzID0gYWRkQ2F0ZWdvcnlWaWV3ZXIuZ2V0Q2hlY2tlZENvbnRlbnRDYXRlZ29yaWVzKCk7Ci0gICAgCVNldDxDb250ZW50Q2F0ZWdvcnk+IG5ld1N1YkNhdHMgPSBzdWJDYXRlZ29yeVZpZXdlci5nZXRDaGVja2VkQ29udGVudENhdGVnb3JpZXMoKTsKLSAgICAJCi0gICAgCW9sZEFkZENhdHMucmVtb3ZlQWxsKG5ld0FkZENhdHMpOwotICAgIAlvbGRTdWJDYXRzLnJlbW92ZUFsbChuZXdTdWJDYXRzKTsKLSAgICAJCi0gICAgCW5ld0FkZENhdHMucmVtb3ZlQWxsKGNvbmZpZy5nZXRBZGRlZENhdGVnb3J5KCkpOwotICAgIAluZXdTdWJDYXRzLnJlbW92ZUFsbChjb25maWcuZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkpOwotCQkKLQkJaWYgKENvbmZpZ3VyYXRpb25VdGlsLnJlbW92ZUNvbGxGcm9tQWRkZWRDYXRlZ29yeUxpc3QoYWN0aW9uTWdyLCBjb25maWcsIG9sZEFkZENhdHMpID09IGZhbHNlKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKCFuZXdBZGRDYXRzLmlzRW1wdHkoKSkgewotCQkJaWYgKENvbmZpZ3VyYXRpb25VdGlsLmFkZENvbGxUb0FkZGVkQ2F0ZWdvcnlMaXN0KGFjdGlvbk1nciwgY29uZmlnLCBuZXdBZGRDYXRzKSA9PSBmYWxzZSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJCU1hcCBwbHVnaW5NYXAgPSBNZXRob2RFbGVtZW50VXRpbC5idWlsZE1hcChjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkpOwotCQkJSGFzaFNldCBuZXdBZGRlZFBsdWdpbnMgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChJdGVyYXRvcjxDb250ZW50Q2F0ZWdvcnk+IGl0ID0gbmV3QWRkQ2F0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCUNvbnRlbnRDYXRlZ29yeSBjYXQgPSBpdC5uZXh0KCk7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNhdCk7Ci0JCQkJaWYgKCEgcGx1Z2luTWFwLmNvbnRhaW5zS2V5KHBsdWdpbi5nZXRHdWlkKCkpKSB7Ci0JCQkJCWlmICghIG5ld0FkZGVkUGx1Z2lucy5jb250YWlucyhwbHVnaW4pKSB7Ci0JCQkJCQluZXdBZGRlZFBsdWdpbnMuYWRkKHBsdWdpbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoISBuZXdBZGRlZFBsdWdpbnMuaXNFbXB0eSgpKSB7Ci0JCQkJaWYgKENvbmZpZ3VyYXRpb25VdGlsLmFkZENvbGxUb01ldGhvZFBsdWdpbkxpc3QoYWN0aW9uTWdyLCBjb25maWcsIG5ld0FkZGVkUGx1Z2lucykgPT0gZmFsc2UpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oYWN0aW9uTWdyLCBjb25maWcpOwotCQkJfQotCQkJCi0JCX0KLQkJaWYgKENvbmZpZ3VyYXRpb25VdGlsLnJlbW92ZUNvbGxGcm9tU3VidHJhY3RlZENhdGVnb3J5TGlzdChhY3Rpb25NZ3IsIGNvbmZpZywgb2xkU3ViQ2F0cykgPT0gZmFsc2UpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAoQ29uZmlndXJhdGlvblV0aWwuYWRkQ29sbFRvU3VidHJhY3RlZENhdGVnb3J5TGlzdChhY3Rpb25NZ3IsIGNvbmZpZywgbmV3U3ViQ2F0cykgPT0gZmFsc2UpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJaWYgKGxpYkxpc3RlbmVyICE9IG51bGwpIHsKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQltYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKGxpYkxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGxheW91dExpc3RlbmVyICE9IG51bGwpIHsKLQkJCVBsdWdpblVJUGFja2FnZUNvbnRleHQuSU5TVEFOQ0UucmVtb3ZlTGlzdGVuZXIobGF5b3V0TGlzdGVuZXIpOwotCQl9Ci0KLQkJaWYgKGNvbmZpZ0ZpbHRlciAhPSBudWxsKSB7Ci0JCQljb25maWdGaWx0ZXIuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYgKGNsb3N1cmUgIT0gbnVsbCkgewotCQkJY2xvc3VyZS5kaXNwb3NlKCk7Ci0JCQljbG9zdXJlID0gbnVsbDsKLQkJfQotCi0JCWNvbmZpZy5lQWRhcHRlcnMoKS5yZW1vdmUoY29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogR2V0IGNvbmZpZ3VyYXRpb24gY2xvc3VyZQotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uQ2xvc3VyZSBnZXRDbG9zdXJlKCkgewotCQlyZXR1cm4gY2xvc3VyZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEVkaXRvclNldEZvY3VzTGlzZW5lcnMoKSB7Ci0JCWlmIChnZXRFZGl0b3IoKSBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25FZGl0b3IpIHsKLQkJCUxpc3RlbmVyIGxpcyA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKGV2ZW50LmRhdGEgPT0gQ29uZmlndXJhdGlvblBhZ2UudGhpcyAmJiBuZWVkVXBkYXRlICYmIHRyZWVWaWV3ZXIgIT0gbnVsbCkJewotCQkJCQkJcmVJbml0aWFsaXplQ29uZmlnRmFjdG9yeSgpOwotCQkJCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQkJCQkJCXVwZGF0ZUNoZWNrU3RhdGVzKCk7Ci0JCQkJCQlzaG93RXJyb3JzKCk7Ci0JCQkJCQluZWVkVXBkYXRlID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJKChDb25maWd1cmF0aW9uRWRpdG9yKSBnZXRFZGl0b3IoKSkuYWRkVG9TZXRGb2N1c0xpc2VuZXJzKGxpcyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hWaWV3ZXJzKCkgewotCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLQkJcmVmcmVzaENhdGVnb3J5Vmlld2VycygpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWZyZXNoQ2F0ZWdvcnlWaWV3ZXJzKCkgewotCQlhZGRDYXRlZ29yeVZpZXdlci5yZWZyZXNoKCk7Ci0JCXN1YkNhdGVnb3J5Vmlld2VyLnJlZnJlc2goKTsKLQkJYWRkQ2F0ZWdvcnlWaWV3ZXIuYWJvdXRUb09wZW4oKTsKLQkJc3ViQ2F0ZWdvcnlWaWV3ZXIuYWJvdXRUb09wZW4oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9RdWlja0ZpeChJTWFya2VyIG1hcmtlcikgewotCQlpZiAoIG1hcmtlciA9PSBudWxsICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG1hcmtlckhlbHBlci5nZXRDYXVzZU1ldGhvZEVsZW1lbnQobWFya2VyKTsJCi0JCWlmICggZWxlbWVudCA9PSBudWxsICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoIGNsb3N1cmUuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uRGF0YSgpLmlzRWxlbWVudEluU3VidHJhY3RlZENhdGVnb3J5KGVsZW1lbnQpKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25QYWdlX1F1aWNrZml4RXJyb3JfcmVhc29uMSwgCi0JCQkJCShuZXcgU3RyaW5nW10ge0xpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpfSkpOwotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJLmRpc3BsYXlXYXJuaW5nKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uZmlndXJhdGlvblBhZ2VfcXVpY2tmaXhFcnJvcl90aXRsZSwgCi0JCQkJCQltZXNzYWdlKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJT2JqZWN0IG93bmVyID0gTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlbGVtZW50KTsKLQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKG93bmVyLCB0cnVlKTsKLQkJdXBkYXRlQ2hlY2tTdGF0ZXMob3duZXIsIHRydWUpOwotCQlzYXZlQ29uZmlndXJhdGlvbigpOwotCQlzaG93RXJyb3JzKCk7CQkJCQkKLQkJdXBkYXRlQ2hlY2tTdGF0ZXMoKTsKLQotICAgfQotCQotCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQkJLy8gc2VsZWN0IHByb2JsZW0gaW4gbWFpbiB2aWV3ZXIKLQkJCi0JCU1ldGhvZEVsZW1lbnQgZSA9IENvbmZpZ3VyYXRpb25NYXJrZXJIZWxwZXIuSU5TVEFOQ0UuZ2V0RXJyb3JNZXRob2RFbGVtZW50KG1hcmtlcik7Ci0KLQkJaWYgKGUgIT0gbnVsbCAmJiB0cmVlVmlld2VyICE9IG51bGwpIHsKLQkJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKExpYnJhcnlVdGlsCi0JCQkJCS5nZXRTZWxlY3RhYmxlKGUpKTsKLQkJfQotCi0vLwkJbXNnVmlld0xpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0vLwkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0vLwkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0vLwkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLS8vCQkJCU9iamVjdFtdIHNlbE9ianMgPSBzZWwudG9BcnJheSgpOwotLy8JCQkJaWYgKChzZWxPYmpzICE9IG51bGwpICYmIChzZWxPYmpzLmxlbmd0aCA+IDApKSB7Ci0vLwkJCQkJRU9iamVjdCBub2RlID0gbnVsbDsKLS8vCQkJCQlpZiAoc2VsT2Jqc1swXSBpbnN0YW5jZW9mIEVsZW1lbnREZXBlbmRlbmN5RXJyb3IpIHsKLS8vCQkJCQkJbm9kZSA9IChFT2JqZWN0KSAoKEVsZW1lbnREZXBlbmRlbmN5RXJyb3IpIHNlbE9ianNbMF0pCi0vLwkJCQkJCQkJLmdldEVycm9yRWxlbWVudCgpOwotLy8JCQkJCX0gZWxzZSBpZiAoc2VsT2Jqc1swXSBpbnN0YW5jZW9mIEVycm9ySW5mbykgewotLy8JCQkJCQlFcnJvckluZm8gaW5mbyA9IChFcnJvckluZm8pIHNlbE9ianNbMF07Ci0vLwkJCQkJCS8vIG5vZGUgPSAoRU9iamVjdCkgaW5mby5nZXRPd25lckVsZW1lbnQoKTsKLS8vCi0vLwkJCQkJCS8vIHNob3cgdGhlIGNhdXNlIGVsZW1lbnQKLS8vCQkJCQkJbm9kZSA9IChFT2JqZWN0KSBpbmZvLmdldENhdXNlRWxlbWVudCgpOwotLy8KLS8vCQkJCQl9Ci0vLwotLy8JCQkJCWVsc2UgaWYgKHNlbE9ianNbMF0gaW5zdGFuY2VvZiBFbGVtZW50UmVmZXJlbmNlKSB7Ci0vLwkJCQkJCW5vZGUgPSAoRU9iamVjdCkgKChFbGVtZW50UmVmZXJlbmNlKSBzZWxPYmpzWzBdKQotLy8JCQkJCQkJCS5nZXRSZWZFbGVtZW50KCk7Ci0vLwkJCQkJCWlmIChub2RlICE9IG51bGwpIHsKLS8vCQkJCQkJCW5vZGUgPSBub2RlLmVDb250YWluZXIoKTsKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCi0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9OwotLy8KLS8vCX0KLQkJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE5NzhjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkd1aWRhbmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0vKioKLSAqIENsYXNzIGZvciBHdWlkYW5jZSB0YWIgcGFnZSBpbiB0aGUgY29udGVudCBlbGVtZW50IGVkaXRvci4KLSAqIENsYXNzIENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlIHJlcGxhY2VzIENhdGVnb3J5R3VpZGFuY2VQYWdlIGFuZCBoYW5kbGVzCi0gKiBhbGwgY29udGVudGVsZW1lbnQncyBndWlkYW5jZSB0YWIgZmVhdHVyZS4gIAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAiY2F0ZWdvcnlHdWlkYW5jZXNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5HVUlEQU5DRV9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQkJc2V0QWxsb3dDaGFuZ2UyKHRydWUpOwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCUxpc3QgbGlzdCA9IE1ldGhvZEVsZW1lbnRVdGlsCi0JCQkJCQkuZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoY29udGVudEVsZW1lbnQpOwotCQkJCUxpc3QgbG9jYWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJCQlpZiAoIShvYmogaW5zdGFuY2VvZiBQcmFjdGljZQotCQkJCQkJCXx8IChvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yICYmIGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVG9vbCkgfHwgb2JqCi0JCQkJCQkJLmVxdWFscyhjb250ZW50RWxlbWVudAotCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkpKSB7Ci0JCQkJCQlsb2NhbC5hZGQob2JqKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gbG9jYWwudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBDb25zb2xpZGF0aW5nIHRoZSBzZXBhcmF0ZSBmb3JtIHBhZ2UgY29kZQotCQkJCS8vIHRvIGFjY29tb2RhdGUgYmV0dGVyIGZpbHRlcmluZy4KLQkJCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrKSB7Ci0vLwkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBFc3RpbWF0ZSkgewotLy8JCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLS8vCQkJCQkJCQljb250ZW50RWxlbWVudCwKLS8vCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0VzdGltYXRlKCksCi0vLwkJCQkJCQkJKEVzdGltYXRlKSBpdGVtLCAtMSk7Ci0vLwkJCQkJfSBlbHNlIAotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1Rvb2xNZW50b3JzKCksCi0JCQkJCQkJCShUb29sTWVudG9yKSBpdGVtLCAtMSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKSB7Ci0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCBjb250ZW50RWxlbWVudCwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwKLQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gSW4gY2FzZSBvZiBXb3JrUHJvZHVjdCwgV29ya1Byb2R1Y3QgaXMgYXNzb2NpYXRlZCB0byBUb29sTWVudG9yLAotCQkJCS8vIEVzdGltYXRlLCBSZXBvcnQgYW5kIFRlbXBsYXRlIGd1aWRhbmNlCi0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBUZW1wbGF0ZSkgewotCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGVzKCksCi0JCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCBjb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCksCi0JCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJlcG9ydCkgewotCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKSwKLQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0gCi0vLwkJCQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEVzdGltYXRlKSB7Ci0vLwkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGNvbnRlbnRFbGVtZW50LAotLy8JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X0VzdGltYXRlKCksCi0vLwkJCQkJCQkJaXRlbSwgLTEpOwotLy8JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucykgewotCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLAotCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIEd1aWRhbmNlIGZvciBjb250ZW50IGVsZW1lbnQuCi0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCShDaGVja2xpc3QpIGl0ZW0sIC0xKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksCi0JCQkJCQkJKENvbmNlcHQpIGl0ZW0sIC0xKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCQkJCShFeGFtcGxlKSBpdGVtLCAtMSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwKLQkJCQkJCQkoU3VwcG9ydGluZ01hdGVyaWFsKSBpdGVtLCAtMSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCQkJKEd1aWRlbGluZSkgaXRlbSwgLTEpOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCQkJCShSZXVzYWJsZUFzc2V0KSBpdGVtLCAtMSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gYWRkIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkidG8gIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgY29udGVudEVsZW1lbnQuZ2V0VHlwZSgpCi0JCQkJCQkJCQkJCQkJLmdldE5hbWUoKQotCQkJCQkJCQkJCQkrICI6IiArIGNvbnRlbnRFbGVtZW50LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJfQotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gSW4gY2FzZSBvZiBUYXNrLCBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gVG9vbE1lbnRvciBhbmQKLQkJCQkvLyBFc3RpbWF0ZSBndWlkYW5jZQotCQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1Rvb2xNZW50b3JzKCksCi0JCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9IAotLy8JCQkJCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFc3RpbWF0ZSkgewotLy8JCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLS8vCQkJCQkJCQljb250ZW50RWxlbWVudCwKLS8vCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0VzdGltYXRlKCksIG51bGwsCi0vLwkJCQkJCQkJLTEpOwotLy8JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucykgewotCQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLCBpdGVtLAotCQkJCQkJCQktMSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBJbiBjYXNlIG9mIFdvcmtQcm9kdWN0LCBXb3JrUHJvZHVjdCBpcyBhc3NvY2lhdGVkIHRvIFRvb2xNZW50b3IsCi0JCQkJLy8gRXN0aW1hdGUsIFJlcG9ydCBhbmQgVGVtcGxhdGUgZ3VpZGFuY2UKLQkJCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFJlcG9ydCkgewotCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJY29udGVudEVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKSwgaXRlbSwgLTEpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFRlbXBsYXRlKSB7Ci0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQljb250ZW50RWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGVzKCksIGl0ZW0sIC0xKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJCQljb250ZW50RWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9ycygpLAotCQkJCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9IAotLy8JCQkJCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFc3RpbWF0ZSkgewotLy8JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBjb250ZW50RWxlbWVudCwKLS8vCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpLAotLy8JCQkJCQkJCW51bGwsIC0xKTsKLS8vCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpIHsKLQkJCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksIGl0ZW0sCi0JCQkJCQkJCS0xKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIEd1aWRhbmNlIGZvciB0aGUgbWV0aG9kIGVsZW1lbnQuCi0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksCi0JCQkJCQkJKENvbmNlcHQpIGl0ZW0sIC0xKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCQkJCShFeGFtcGxlKSBpdGVtLCAtMSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwKLQkJCQkJCQkoU3VwcG9ydGluZ01hdGVyaWFsKSBpdGVtLCAtMSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCQkJKEd1aWRlbGluZSkgaXRlbSwgLTEpOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCQkJCShSZXVzYWJsZUFzc2V0KSBpdGVtLCAtMSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gcmVtb3ZlIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkiZnJvbSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyBjb250ZW50RWxlbWVudC5nZXRUeXBlKCkKLQkJCQkJCQkJCQkJCQkuZ2V0TmFtZSgpCi0JCQkJCQkJCQkJCSsgIjoiICsgY29udGVudEVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gY29udGVudEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBHdWlkYW5jZUZpbHRlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldEZpbHRlclR5cGVzKCkKLQkgKiAgICAgIFR5cGVzIGFyZSByZXR1cm5lZCBpbiBvcmRlciB0byBkaXNwbGF5IGluIHRoZSBmaWx0ZXIgZGlhbG9nIGZvcgotCSAqICAgICAgc2VhcmNoIGJhc2VkIG9uIHR5cGUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlclR5cGVzKCkgewotCQkKLQkJU3RyaW5nW10gc3RyOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQlzdHIgPSBuZXcgU3RyaW5nWzExXTsKLQkJfSBlbHNlIGlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQlzdHIgPSBuZXcgU3RyaW5nWzEzXTsKLQkJfSBlbHNlCi0JCQlzdHIgPSBuZXcgU3RyaW5nWzldOwotCQlpbnQgaSA9IDA7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5DSEVDS0xJU1RTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5DT05DRVBUUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuRVhBTVBMRVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkdVSURFTElORVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlJFVVNBQkxFX0FTU0VUUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFM7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRPT0xfTUVOVE9SUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkVTVElNQVRFX0NPTlNJREVSQVRJT05TOwotCQkJLy8gVE9ETyBFc3RpbWF0ZSBjb250ZW50ZWxlbWVudAotCQl9IGVsc2UgaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlJFUE9SVFM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5URU1QTEFURVM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5UT09MX01FTlRPUlM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5FU1RJTUFURV9DT05TSURFUkFUSU9OUzsKLQkJCS8vIFRPRE8gRXN0aW1hdGUgY29udGVudGVsZW1lbnQKLQkJfQotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5DT05URU5UX1BBQ0tBR0VTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5NRVRIT19QTFVHSU5TOwotCQlyZXR1cm4gc3RyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5jYXRlZ29yeUd1aWRhbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJvbGVTZXQpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVzZXRzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrcHJvZHVjdHR5cGVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBEb21haW4pewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRvbWFpbnNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRvb2wpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRhc2spewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRvb2wpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBXaGl0ZXBhcGVyKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53aGl0ZXBhcGVyX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBDb25jZXB0KXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5jb25jZXB0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBDaGVja2xpc3QpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNoZWNrbGlzdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRXhhbXBsZSl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXhhbXBsZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgR3VpZGVsaW5lKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5ndWlkZWxpbmVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3VwcG9ydGluZ21hdGVyaWFsX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSb2FkbWFwKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2FkbWFwX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBQcmFjdGljZSl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlcG9ydCl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwb3J0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yZXVzYWJsZWFzc2V0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUZW1wbGF0ZSl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGVtcGxhdGVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50ZXJtZGVmaW5pdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVG9vbE1lbnRvcil7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbG1lbnRvcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmN1c3RvbWNhdGVnb3J5X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJCi0JCWlmKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uLCBjb250ZW50RWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkpOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29udGVudFBhY2thZ2VEZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29udGVudFBhY2thZ2VEZXNjcmlwdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM5YjhiZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbnRlbnRQYWNrYWdlRGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0KLS8qKgotICogVGhlIGRlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBDb250ZW50IFBhY2thZ2UgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50UGFja2FnZURlc2NyaXB0aW9uUGFnZSBleHRlbmRzIEZvcm1QYWdlIGltcGxlbWVudHMgSVJlZnJlc2hhYmxlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BSRUZJWCA9IExpYnJhcnlVSVRleHQuVEVYVF9DT05URU5UX1BBQ0tBR0UKLQkJCSsgIjogIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfbmFtZTsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmX2Rlc2M7Ci0KLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgY3RybF9kZXBlbmRlbmN5OwotCi0JcHJpdmF0ZSBTY3JvbGxlZEZvcm0gZm9ybTsKLQotCXByaXZhdGUgQ29udGVudFBhY2thZ2UgY29udGVudFBhY2thZ2U7Ci0KLQlwcml2YXRlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyIG1vZGVsTW9kaWZ5TGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb250ZW50UGFja2FnZURlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIENvbnRlbnRQYWNrYWdlIG9iamVjdCBmcm9tIHRoZSBFZGl0b3IgaW5wdXQuCi0JCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBtZXRob2RFbGVtZW50SW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dDsKLQkJT2JqZWN0IG9iaiA9IG1ldGhvZEVsZW1lbnRJbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCWNvbnRlbnRQYWNrYWdlID0gKENvbnRlbnRQYWNrYWdlKSBvYmo7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQkvLyBDcmVhdGUgdGhlIGZvcm0gdG9vbGtpdC4KLQkJZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQkJZm9ybS5zZXRUZXh0KEZPUk1fUFJFRklYICsgY29udGVudFBhY2thZ2UuZ2V0TmFtZSgpKTsKLQkJVGFibGVXcmFwTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZVdyYXBMYXlvdXQoKTsKLQkJZm9ybS5nZXRCb2R5KCkuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBHZW5lcmFsIEluZm9ybWFpdG9uIHNlY3Rpb24uCi0JCVNlY3Rpb24gZ2VuZXJhbFNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksCi0JCQkJU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQKLQkJCQkJCXwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuR0VORVJBTF9JTkZPX1NFQ1RJT05fTkFNRSk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCUF1dGhvcmluZ1VJVGV4dC5HRU5FUkFMX0lORk9fU0VDVElPTl9ERVNDLAotCQkJCW5ldyBTdHJpbmdbXSB7IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0TG93ZXIoY29udGVudFBhY2thZ2UpIH0pKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCUNvbXBvc2l0ZSBnZW5lcmFsQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZ2VuZXJhbFNlY3Rpb24pOwotCQlnZW5lcmFsQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlnZW5lcmFsQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRDbGllbnQoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCgKLQkJCQlnZW5lcmFsQ29tcG9zaXRlLmdldFBhcmVudCgpLmdldFBhcmVudCgpLAotCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkNPTlRFTlRfUEFDS0FHRV9FRElUT1JfQUxMX0NPTlRFWFQpOyAKLQotCQkvLyBuYW1lCi0JCUxhYmVsIGxfbmFtZSA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuTkFNRV9URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWxfbmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfbmFtZSA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWN0cmxfbmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCS8vIGJyaWVmIGRlc2MKLQkJTGFiZWwgbF9icmllZl9kZXNjID0gdG9vbGtpdC5jcmVhdGVMYWJlbChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWxfYnJpZWZfZGVzYy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfYnJpZWZfZGVzYyA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCSIiLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA0MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCVNlY3Rpb24gZGVwZW5kZW5jeVNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksCi0JCQkJU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQKLQkJCQkJCXwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQlUYWJsZVdyYXBEYXRhIHRkMSA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJZGVwZW5kZW5jeVNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZDEpOwotCQlkZXBlbmRlbmN5U2VjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5ERVBFTkRFTkNJRVNfU0VDVElPTl9OQU1FKTsKLQkJZGVwZW5kZW5jeVNlY3Rpb24KLQkJCQkuc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlUZXh0LkRFUEVOREVOQ0lFU19TRUNUSU9OX0RFU0MpOwotCQlkZXBlbmRlbmN5U2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJQ29tcG9zaXRlIGRlcGVuZGVuY3lDb21wb3NpdGUgPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUNvbXBvc2l0ZShkZXBlbmRlbmN5U2VjdGlvbik7Ci0JCWRlcGVuZGVuY3lDb21wb3NpdGUKLQkJCQkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWRlcGVuZGVuY3lDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWRlcGVuZGVuY3lTZWN0aW9uLnNldENsaWVudChkZXBlbmRlbmN5Q29tcG9zaXRlKTsKLQotCQkKLQkJVGFibGUgY3RybF90YWJsZSA9IHRvb2xraXQuY3JlYXRlVGFibGUoZGVwZW5kZW5jeUNvbXBvc2l0ZSwgU1dULlZfU0NST0xMCi0JCQkJfCBTV1QuQ0hFQ0sgfCBTV1QuUkVBRF9PTkxZIHwgU1dULkNPTE9SX0JMVUUpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcKLQkJCQkJfCBHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDEwMDsKLQkJCWN0cmxfdGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQljdHJsX2RlcGVuZGVuY3kgPSBuZXcgQ2hlY2tib3hUYWJsZVZpZXdlcihjdHJsX3RhYmxlKTsKLQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoKENvbnRlbnRQYWNrYWdlKWVsZW1lbnQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQljdHJsX2RlcGVuZGVuY3kuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJY3RybF9kZXBlbmRlbmN5LnNldENvbnRlbnRQcm92aWRlcihuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LAotCQkJCQlPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQkJCQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQkJcmV0dXJuIGdldERlcGVuZGVuY2llc1BhY2thZ2VzKGNvbnRlbnRQYWNrYWdlKS50b0FycmF5KCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QudG9BcnJheSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWN0cmxfZGVwZW5kZW5jeS5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpKTsKLQkJY3RybF9kZXBlbmRlbmN5LnNldElucHV0KGNvbnRlbnRQYWNrYWdlKTsKLQotCQljdHJsX2RlcGVuZGVuY3kuc2V0QWxsQ2hlY2tlZCh0cnVlKTsKLQkJY3RybF9kZXBlbmRlbmN5LnNldEFsbEdyYXllZCh0cnVlKTsKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihnZW5lcmFsQ29tcG9zaXRlKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZGVwZW5kZW5jeUNvbXBvc2l0ZSk7Ci0KLQkJLy8gbG9hZCBkYXRhCi0JCWxvYWREYXRhKCk7Ci0JCWFkZExpc3RlbmVycygpOwotCi0JCS8vIHNldCBmb2N1cyBvbiB0aGUgbmFtZSBhdHRyaWJ1dGUKLQkJRGlzcGxheSBkaXNwbGF5ID0gZm9ybS5nZXRCb2R5KCkuZ2V0RGlzcGxheSgpOwotCQlpZiAoIShkaXNwbGF5ID09IG51bGwgfHwgZGlzcGxheS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCQkJY3RybF9uYW1lLnNldFNlbGVjdGlvbigwLCBjdHJsX25hbWUuZ2V0VGV4dCgpLmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlmaW5hbCBNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQkJbW9kZWxNb2RpZnlMaXN0ZW5lciA9IGVkaXRvci5jcmVhdGVNb2RpZnlMaXN0ZW5lcihjb250ZW50UGFja2FnZSk7Ci0KLQkJZm9ybS5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkvLyByZWZyZXNoVmlld2VycygpOwotCQkJCWN0cmxfZGVwZW5kZW5jeS5yZWZyZXNoKCk7Ci0JCQkJY3RybF9kZXBlbmRlbmN5LnNldEFsbENoZWNrZWQodHJ1ZSk7Ci0JCQkJY3RybF9kZXBlbmRlbmN5LnNldEFsbEdyYXllZCh0cnVlKTsKLQkJCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChjb250ZW50UGFja2FnZSkpIHsKLQkJCQkJZW5hYmxlQ29udHJvbHMoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVuYWJsZUNvbnRyb2xzKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX25hbWUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWZpbmFsIENvbGxlY3Rpb24gZUNsYXNzZXMgPSBDb2xsZWN0aW9ucwotCQkJCQkJLnNpbmdsZXRvbihVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlKCkpOwotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudFBhY2thZ2UuZ2V0TmFtZSgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJZS53aWRnZXQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG1zZyA9IG51bGwgOwotCQkJCVN0cmluZyBuZXdOYW1lID0gY3RybF9uYW1lLmdldFRleHQoKTsKLQkJCQlpZihuZXdOYW1lICE9IG51bGwpIHsKLQkJCQkJbmV3TmFtZSA9IG5ld05hbWUudHJpbSgpOwkJCQkJCi0JCQkJCS8vIDE3ODQ2MgotCQkJCQlpZiAob2xkQ29udGVudC5pbmRleE9mKCImIikgPCAwICYmIG5ld05hbWUuaW5kZXhPZigiJiIpID4gLTEpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQltc2cgPSBOTFMKLQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZEVsZW1lbnROYW1lRXJyb3I0X21zZywKLQkJCQkJCQkJCQluZXdOYW1lKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCW1zZyA9IFRuZ1V0aWwuY2hlY2tOYW1lKGNvbnRlbnRQYWNrYWdlLCBuZXdOYW1lLAotCQkJCQkJCQllQ2xhc3Nlcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQkJCWlmICghbmV3TmFtZS5lcXVhbHMoY29udGVudFBhY2thZ2UuZ2V0TmFtZSgpKSkgewotCQkJCQkJY3RybF9uYW1lLnNldFRleHQobmV3TmFtZSk7Ci0JCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJY29udGVudFBhY2thZ2UsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksCi0JCQkJCQkJCW5ld05hbWUsIC0xKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVEaWFsb2dfdGl0bGUsIG1zZyk7IAotCQkJCQljdHJsX25hbWUuc2V0VGV4dChjb250ZW50UGFja2FnZS5nZXROYW1lKCkpOwotCQkJCQljdHJsX25hbWUuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJCQkJY3RybF9uYW1lLnNlbGVjdEFsbCgpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYnJpZWZfZGVzYy5hZGRNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9icmllZl9kZXNjLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50UGFja2FnZS5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3TmFtZSA9IGN0cmxfYnJpZWZfZGVzYy5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdOYW1lLmVxdWFscyhjb250ZW50UGFja2FnZS5nZXRCcmllZkRlc2NyaXB0aW9uKCkpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCWNvbnRlbnRQYWNrYWdlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCksCi0JCQkJCQkJbmV3TmFtZSwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcykgewotCQkJCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQobmV3TmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZGVwZW5kZW5jeS5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGV2ZW50LmdldFNvdXJjZSgpOwotCQkJCSgoQ2hlY2tib3hUYWJsZVZpZXdlcikgb2JqKS5zZXRBbGxDaGVja2VkKHRydWUpOwotCQkJfQotCQl9KTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZUNvbnRyb2xzKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJY3RybF9uYW1lLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9icmllZl9kZXNjLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyBpbml0aWFsIGRhdGEgZnJvbSBtb2RlbAotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkRGF0YSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBjb250ZW50UGFja2FnZS5nZXROYW1lKCk7Ci0JCVN0cmluZyBkZXNjID0gY29udGVudFBhY2thZ2UuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCi0KLQkJY3RybF9uYW1lLnNldFRleHQobmFtZSA9PSBudWxsID8gIiIgOiBuYW1lKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX25hbWUuc2VsZWN0QWxsKCk7Ci0JCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KGRlc2MgPT0gbnVsbCA/ICIiIDogZGVzYyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgZGVwZW5kZW5jeSBwYWNrYWdlcyBmb3IgdGhlIGdpdmVuIGNvbnRlbnQgcGFja2FnZQotCSAqIEByZXR1cm4KLQkgKiAJCUxpc3Qgb2YgZGVwZW5kZW5jeSBwYWNrYWdlcwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPENvbnRlbnRQYWNrYWdlPiBnZXREZXBlbmRlbmNpZXNQYWNrYWdlcyhDb250ZW50UGFja2FnZSBjb250ZW50UGFja2FnZSkgewotCi0JCUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRlbnRQYWNrYWdlLmdldENvbnRlbnRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQgPSAoQ29udGVudEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGNvbnRlbnRFbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJZWxlbWVudHMuYWRkKChDb250ZW50RWxlbWVudCkgY29udGVudEVsZW1lbnQKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQkJfQotCQkJZWxlbWVudHMuYWRkQWxsKE1ldGhvZEVsZW1lbnRVdGlsCi0JCQkJCS5nZXRTZWxlY3RlZEd1aWRhbmNlcyhjb250ZW50RWxlbWVudCkpOwotCi0JCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlKSB7Ci0vKgkJCQlpZiAoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCS5nZXRNb2RpZmllZFdvcmtQcm9kdWN0cygoUm9sZSkgY29udGVudEVsZW1lbnQpICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudHMuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldE1vZGlmaWVkV29ya1Byb2R1Y3RzKChSb2xlKSBjb250ZW50RWxlbWVudCkpOwotCQkJCX0KLQkJCQlpZiAoQXNzb2NpYXRpb25IZWxwZXIuZ2V0UHJpbWFyeVRhc2tzKChSb2xlKSBjb250ZW50RWxlbWVudCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cy5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0UHJpbWFyeVRhc2tzKChSb2xlKSBjb250ZW50RWxlbWVudCkpOwotCQkJCX0KLQkJCQlpZiAoQXNzb2NpYXRpb25IZWxwZXIuZ2V0U2Vjb25kYXJ5VGFza3MoKFJvbGUpIGNvbnRlbnRFbGVtZW50KSAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXRTZWNvbmRhcnlUYXNrcygoUm9sZSkgY29udGVudEVsZW1lbnQpKTsKLQkJCQl9Ki8KLQkJCX0KLQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCQlpZiAoKChUYXNrKSBjb250ZW50RWxlbWVudCkuZ2V0UGVyZm9ybWVkQnkoKSAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbCgoKFRhc2spIGNvbnRlbnRFbGVtZW50KS5nZXRQZXJmb3JtZWRCeSgpKTsKLQkJCQl9Ci0JCQkJaWYgKCgoVGFzaykgY29udGVudEVsZW1lbnQpLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cy5hZGRBbGwoKChUYXNrKSBjb250ZW50RWxlbWVudCkKLQkJCQkJCQkuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCQkJfQotCQkJCWlmICgoKFRhc2spIGNvbnRlbnRFbGVtZW50KS5nZXRNYW5kYXRvcnlJbnB1dCgpICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudHMKLQkJCQkJCQkuYWRkQWxsKCgoVGFzaykgY29udGVudEVsZW1lbnQpLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQkJCX0KLQkJCQlpZiAoKChUYXNrKSBjb250ZW50RWxlbWVudCkuZ2V0T3B0aW9uYWxJbnB1dCgpICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudHMuYWRkQWxsKCgoVGFzaykgY29udGVudEVsZW1lbnQpLmdldE9wdGlvbmFsSW5wdXQoKSk7Ci0JCQkJfQotCQkJCWlmICgoKFRhc2spIGNvbnRlbnRFbGVtZW50KS5nZXRPdXRwdXQoKSAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbCgoKFRhc2spIGNvbnRlbnRFbGVtZW50KS5nZXRPdXRwdXQoKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLS8qCQkJCWlmIChBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJLmdldE1vZGlmaWVkQnkoKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cy5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0TW9kaWZpZWRCeSgoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50KSk7Ci0JCQkJfQotCQkJCWlmIChBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJLmdldE1hbmRhdG9yeUlucHV0VG9UYXNrcygoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50KSAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzCi0JCQkJCQkJLmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCQkJLmdldE1hbmRhdG9yeUlucHV0VG9UYXNrcygoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50KSk7Ci0JCQkJfQotCQkJCWlmIChBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJLmdldE91dHB1dHRpbmdUYXNrcygoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50KSAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXRPdXRwdXR0aW5nVGFza3MoKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudCkpOwotCQkJCX0KLQkJCQlMaXN0IGxpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRSZXNwb25zaWJsZVJvbGVzKChXb3JrUHJvZHVjdCkgY29udGVudEVsZW1lbnQpOwotCQkJCWlmIChsaXN0ICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudHMuYWRkQWxsKGxpc3QpOwotCQkJCX0qLwotCQkJfQotCi0JCX0KLQotCQlMaXN0PENvbnRlbnRQYWNrYWdlPiBjcExpc3QgPSBuZXcgQXJyYXlMaXN0PENvbnRlbnRQYWNrYWdlPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gKChDb250ZW50RWxlbWVudCkgZWxlbWVudHMuZ2V0KGkpKS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlpZiAoIWNvbnRlbnRQYWNrYWdlLmVxdWFscyhvYmplY3QpKSB7Ci0JCQkJCWlmICghY3BMaXN0LmNvbnRhaW5zKChDb250ZW50UGFja2FnZSlvYmplY3QpKSB7Ci0JCQkJCQljcExpc3QuYWRkKChDb250ZW50UGFja2FnZSlvYmplY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjcExpc3Q7Ci0JfQkKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5JUmVmcmVzaGFibGUjcmVmcmVzaE5hbWUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoTmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAobmV3TmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoKGN0cmxfbmFtZSAhPSBudWxsKSAmJiAhKGN0cmxfbmFtZS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQkJY3RybF9uYW1lLnJlbW92ZU1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQkJCWN0cmxfbmFtZS5zZXRUZXh0KG5ld05hbWUpOwotCQkJCWN0cmxfbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJCQlVSUhlbHBlci5zZXRGb3JtVGV4dChmb3JtLCBjb250ZW50UGFja2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0N1c3RvbUNhdGVnb3J5QXNzaWduUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjM4MmQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWaWV3RGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5BbGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Nb3ZlSW5DYXRlZ29yeUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNhdGVnb3J5U29ydEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29udGVudEVsZW1lbnRPcmRlckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLk1lc3NhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIEFzc2lnbiBwYWdlIGluIHRoZSBDdXN0b20gQ2F0ZWdvcnkgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnk7Ci0KLQkvL3ByaXZhdGUgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgYWxsU3RlcHM7Ci0JcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBhbGxTdGVwczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkFTU0lHTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCWNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBjb250ZW50RWxlbWVudDsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCQlzZXRJc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYgKGFsbFN0ZXBzID09IG51bGwpIHsKLQkJCQkJYWxsU3RlcHMgPSBuZXcgQ29udGVudEVsZW1lbnRPcmRlckxpc3QoCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJQ29udGVudEVsZW1lbnRPcmRlckxpc3QuQ09OVEVOVF9FTEVNRU5UU19fRk9SX0VMRU1FTlRfT05MWSwKLQkJCQkJCQlnZXRDb250ZW50Q2F0ZWdvcnlPcmRlckZlYXR1cmUoKSk7Ci0JCQkJfQotCQkJCUxpc3QgcmV0dXJuTGlzdCA9IENhdGVnb3J5U29ydEhlbHBlci5zb3J0Q2F0ZWdvcnlFbGVtZW50cyhjb250ZW50RWxlbWVudCwgYWxsU3RlcHMudG9BcnJheSgpKTsKLQkJCQlyZXR1cm4gcmV0dXJuTGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCWJvb2xlYW4gb2sgPSBEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRm9yTW92aW5nVmFyaWFiaWxpdHlFbGVtZW50KGNhdGVnb3J5LCBhZGRJdGVtcyk7Ci0JCWlmKCEgb2spIHsKLQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNpcmN1bGFyX2RlcGVuZGVuY3lfZXJyb3JfdGl0bGU7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5jaXJjdWxhcl9kZXBlbmRlbmN5X2Vycm9yX21zZyk7CQkJCQkJCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUxpc3Q8T2JqZWN0PiBhbmNlc3RvcnMgPSBnZXRBbmNlc3RvcnMoY2F0ZWdvcnkpOwotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RFbGVtZW50IGN1c3RvbUNhdGVnb3J5ID0gKE1ldGhvZEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQlpZiAoY3VzdG9tQ2F0ZWdvcnkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeQotCQkJCQkJJiYgVG5nVXRpbAotCQkJCQkJCQkuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBjdXN0b21DYXRlZ29yeSkpIHsKLQkJCQl9IGVsc2UgaWYgKGFuY2VzdG9ycy5jb250YWlucyhjdXN0b21DYXRlZ29yeSkpIHsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoY3VzdG9tQ2F0ZWdvcnkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IG9iamVjdCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgY3VzdG9tQ2F0ZWdvcnkpCi0JCQkJCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvQ3VzdG9tQ2F0ZWdvcnkoCi0JCQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgY2F0ZWdvcnksIG9iamVjdCwgdXNlZENhdGVnb3JpZXMpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRUb0N1c3RvbUNhdGVnb3J5KAotCQkJCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIGNhdGVnb3J5LCBjdXN0b21DYXRlZ29yeSwgdXNlZENhdGVnb3JpZXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlBcnJheUxpc3Q8TWV0aG9kRWxlbWVudD4gY3VzdG9tQ2F0ZWdvcmllc1RvRGVsZXRlID0gbmV3IEFycmF5TGlzdDxNZXRob2RFbGVtZW50PigpOwotCQkJTWV0aG9kUGx1Z2luIGN1cnJlbnRQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjYXRlZ29yeSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0vLwkJCQkJQWRhcHRlciBhZGFwdGVyID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLS8vCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdCgKLS8vCQkJCQkJCQkJY2F0ZWdvcnksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0vLwkJCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbAotLy8JCQkJCQkJJiYgYWRhcHRlciBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLS8vCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyKQotLy8JCQkJCQkJCS5nZXRDaGlsZHJlbihjYXRlZ29yeSkuaXRlcmF0b3IoKTsgaXRlcgotLy8JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotLy8JCQkJCQkJaWYgKFRuZ1V0aWwudW53cmFwKG8pID09IGUpIHsKLS8vCQkJCQkJCQljdXN0b21DYXRlZ29yaWVzVG9EZWxldGUuYWRkKG8pOwotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJfQotCQkJCQkKLQkJCQkJLy8gd2lsbCBkZWxldGUgZSBpZiBpdCBpcyBpbiB0aGUgY3VycmVudCBwbHVnaW4gYW5kCi0JCQkJCS8vIHRoZSBsYXN0IHN1cGVyIGN1c3RvbSBjYXRlZ29yeSBvZiBlIGluIHRoZSBjdXJyZW50IHBsdWdpbgotCQkJCQkvLwotCQkJCQlpZihUbmdVdGlsLmlzSW5QbHVnaW5XaXRoTGVzc1RoYW5PbmVTdXBlckN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgZSwgY3VycmVudFBsdWdpbikpIHsKLQkJCQkJCWN1c3RvbUNhdGVnb3JpZXNUb0RlbGV0ZS5hZGQoZSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0JCQkJCi0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVGcm9tQ3VzdG9tQ2F0ZWdvcnkoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIGNhdGVnb3J5LCBlLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0KLQkJCWlmIChjdXN0b21DYXRlZ29yaWVzVG9EZWxldGUuc2l6ZSgpID4gMCkgewotCQkJCWludCBpID0gMDsKLQkJCQlTdHJpbmdCdWZmZXIgZWxlbWVudFN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZEVsZW1lbnQ+IGl0ID0gY3VzdG9tQ2F0ZWdvcmllc1RvRGVsZXRlLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKGl0Lm5leHQoKSk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJCQllbGVtZW50U3RyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJZWxlbWVudFN0ci5hcHBlbmQoKChNZXRob2RFbGVtZW50KSBvYmopLmdldE5hbWUoKSk7Ci0KLQkJCQkJCWkrKzsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZighQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlDb25maXJtYXRpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVtb3ZlX3RleHQsCi0JCQkJCQlOTFMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5wcm9tcHREZWxldGVDdXN0b21DYXRlZ29yeUJlZm9yZVJlbW92ZUxhc3RSZWZUb0l0LCBlbGVtZW50U3RyKSkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlMaWJyYXJ5Vmlld0RlbGV0ZUFjdGlvbiBkZWxldGVBY3Rpb24gPSBuZXcgTGlicmFyeVZpZXdEZWxldGVBY3Rpb24oKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yVGl0bGU7IAotCQkJCQkJY29uZmlybSA9IGZhbHNlOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzdXBlci5ydW4oKTsKLQkJCQkJCX0gY2F0Y2ggKE1lc3NhZ2VFeGNlcHRpb24gZSkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlTdHJpbmcgZGV0YWlscyA9IFRuZ1V0aWwudG9TdGFja1RyYWNlU3RyaW5nKGUpOwotCQkJCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JNZXNzYWdlOyAKLQkJCQkJCQlTdHJpbmcgcmVhc29uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JSZWFzb247IAotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgcmVhc29uLAotCQkJCQkJCQkJCQlkZXRhaWxzLCBlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUZhaWxlZCgpIHsKLQkJCQkJCS8vIGxpYnJhcnkgbmVlZCB0byBiZSByZWxvYWRlZAotCQkJCQkJU3RyaW5nIGxpYkRpciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKTsKLQkJCQkJCUxpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5vcGVuTGlicmFyeShsaWJEaXIpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX07Ci0JCQkJZGVsZXRlQWN0aW9uLnNldEVkaXRpbmdEb21haW4oTGlicmFyeVZpZXcuZ2V0VmlldygpCi0JCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpKTsKLQkJCQlkZWxldGVBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCWN1c3RvbUNhdGVnb3JpZXNUb0RlbGV0ZSkpOwotCQkJCWRlbGV0ZUFjdGlvbi5ydW4oKTsKLQkJCX0KLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYW5jZXN0b3JzIGZvciB0aGUgZ2l2ZW4gQ3VzdG9tIENhdGVnb3J5LgotCSAqLwotCXByaXZhdGUgTGlzdDxPYmplY3Q+IGdldEFuY2VzdG9ycyhDdXN0b21DYXRlZ29yeSBtZXRob2RPYmplY3QpIHsKLQkJTGlzdDxPYmplY3Q+IGFuY2VzdG9yTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlMaXN0PE9iamVjdD4gb2JqTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlvYmpMaXN0LmFkZChtZXRob2RPYmplY3QpOwotCQlnZXRBbmNlc3RvcnMoYW5jZXN0b3JMaXN0LCBvYmpMaXN0KTsKLQkJcmV0dXJuIGFuY2VzdG9yTGlzdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8T2JqZWN0PiBnZXRBbmNlc3RvcnMoTGlzdDxPYmplY3Q+IGFuY2VzdG9yTGlzdCwgTGlzdDxPYmplY3Q+IG1ldGhvZE9iamVjdExpc3QpIHsKLQkJaWYgKG1ldGhvZE9iamVjdExpc3QuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGFuY2VzdG9yTGlzdDsKLQotCQlMaXN0IGFsbFBhcmVudEN1c3RDYXRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBpdGVyID0gbWV0aG9kT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUN1c3RvbUNhdGVnb3J5IGVsZW1lbnQgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0ZXIubmV4dCgpOwotCQkJTGlzdCBwYXJlbnRMaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhlbGVtZW50KTsKLQkJCWFsbFBhcmVudEN1c3RDYXRzLmFkZEFsbChwYXJlbnRMaXN0KTsKLQkJfQotCi0JCWFuY2VzdG9yTGlzdC5hZGRBbGwobWV0aG9kT2JqZWN0TGlzdCk7Ci0JCUxpc3Q8T2JqZWN0PiBuZXh0Q2hlY2tMaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbFBhcmVudEN1c3RDYXRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghYW5jZXN0b3JMaXN0LmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJbmV4dENoZWNrTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZ2V0QW5jZXN0b3JzKGFuY2VzdG9yTGlzdCwgbmV4dENoZWNrTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBjYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkFMTF9FTEVNRU5UUzsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEN1c3RvbUNhdGVnb3J5QXNzaWduRmlsdGVyIGV4dGVuZHMgQWxsRmlsdGVyIHsKLQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBNaWxlc3RvbmUpewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBvYmopKSB7Ci0JCQkJCXJldHVybiAhKCgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaikuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJCQkJLmlzRW1wdHkoKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCS8vIGlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKXsKLQkJCQkvLyByZXR1cm4KLQkJCQkvLyBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lR3JvdXBzKChEaXNjaXBsaW5lKW9iaikuaXNFbXB0eSgpOwotCQkJCS8vIH0KLQkJCQkvLyBpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldCl7Ci0JCQkJLy8gcmV0dXJuCi0JCQkJLy8gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Um9sZVNldEdyb3VwcygoUm9sZVNldClvYmopLmlzRW1wdHkoKTsKLQkJCQkvLyB9Ci0JCQkJcmV0dXJuICEoZ2V0SGVscGVyKCkuaXNDb250cmlidXRvcigoQ29udGVudEVsZW1lbnQpIG9iaikpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IEN1c3RvbUNhdGVnb3J5QXNzaWduRmlsdGVyKCk7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENvbnRlbnRDYXRlZ29yeU9yZGVyRmVhdHVyZSgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldE1vZGVsU3RydWN0dXJlUGF0aCgpIHsKLQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgZ2V0Q29udGVudEVsZW1lbnRPcmRlckxpc3QoKSB7Ci0JCXJldHVybiBhbGxTdGVwczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0N1c3RvbUNhdGVnb3J5RGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0N1c3RvbUNhdGVnb3J5RGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMjU4MDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9DdXN0b21DYXRlZ29yeURlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkN1c3RvbUNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBmb3IgdGhlIERvbWFpbiBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUNhdGVnb3J5RGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImN1c3RvbUNhdGVnb3J5RGVzY3JpcHRpb25QYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBDdXN0b21DYXRlZ29yeSBjYXRlZ29yeTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEN1c3RvbUNhdGVnb3J5RGVzY3JpcHRpb25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQljYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgY29udGVudEVsZW1lbnQ7Ci0JCXB1Ymxpc2hDYXRlZ29yeU9uID0gdHJ1ZTsKLQkJc2V0SWNvblNlY3Rpb25Pbih0cnVlKTsKLQkJCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBjYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXIoKTsKLQkJLy8gc2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcKLQkJKChDdXN0b21DYXRlZ29yeUZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQljYXRlZ29yeSkgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmN1c3RvbWNhdGVnb3J5X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmN1c3RvbWNhdGVnb3J5X2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmN1c3RvbWNhdGVnb3J5X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jdXN0b21jYXRlZ29yeV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmN1c3RvbWNhdGVnb3J5X0ljb25TZWN0aW9uX2Rlc2M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YjlmYjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBEZXNjcmlwdGlvbiBwYWdlIGZvciBkZWxpdmVyeSBwcm9jZXNzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIGV4dGVuZHMgUHJvY2Vzc0Rlc2NyaXB0aW9uIHsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfc2NhbGUsIGN0cmxfcHJvamVjdF9jaGFyYWN0ZXJpc3RpY3M7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX3Jpc2tfbGV2ZWwsIGN0cmxfZXN0aW1hdGluZ190ZWNobmlxdWVzOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9wcm9qZWN0X21lbWJlcl9leHBlcnRpc2UsCi0JCQljdHJsX3R5cGVfb2ZfY29udHJhY3Q7Ci0KLQlwcml2YXRlIERlbGl2ZXJ5UHJvY2VzcyBkZWxpdmVyeVByb2Nlc3M7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIGVkaXRvcgotCSAqLwotCXB1YmxpYyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbihGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlkZWxpdmVyeVByb2Nlc3MgPSAoRGVsaXZlcnlQcm9jZXNzKSBwcm9jZXNzOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlByb2Nlc3NEZXNjcmlwdGlvbiNjcmVhdGVEZXRhaWxTZWN0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZXRhaWxTZWN0aW9uKCkgewotCQlzdXBlci5jcmVhdGVEZXRhaWxTZWN0aW9uKCk7Ci0KLQkJLy8gc2NhbGUKLQkJY3RybF9zY2FsZSA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc19TY2FsZSwgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAKLQotCQkvLyBwcm9qZWN0IGNoYXJhY3RlcmlzdGljcwotCQljdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKAotCQkJCXRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljcywgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAKLQotCQkvLyByaXNrIGxldmVsCi0JCWN0cmxfcmlza19sZXZlbCA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX1Jpc2tMZXZlbCwgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAKLQotCQkvLyBFc3RpbWF0aW5nIHRlY2huaXF1ZQotCQljdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlcyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX0VzdGltYXRpbmdUZWNobmlxdWUsIDQwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsgCi0KLQkJLy8gUHJvamVjdCBNZW1iZXIgZXhwZXJ0aXNlCi0JCWN0cmxfcHJvamVjdF9tZW1iZXJfZXhwZXJ0aXNlID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKAotCQkJCXRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NfUHJvamVjdE1lbWJlckV4cGVydGlzZSwgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAKLQotCQkvLyBUeXBlIG9mIGNvbnRyYWN0Ci0JCWN0cmxfdHlwZV9vZl9jb250cmFjdCA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX1R5cGVPZkNvbnRyYWN0LCA0MCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7IAotCi0JfQotCi0JLyoqCi0JICogTG9hZHMgaW5pdGlhbCBkYXRhIGZyb20gbW9kZWwKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0Rlc2NyaXB0aW9uI2xvYWREYXRhKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkRGF0YSgpIHsKLQkJc3VwZXIubG9hZERhdGEoKTsKLQotCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIGNvbnRlbnQgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbikgZGVsaXZlcnlQcm9jZXNzCi0JCQkJLmdldFByZXNlbnRhdGlvbigpOwotCQlTdHJpbmcgc2NhbGUgPSBjb250ZW50LmdldFNjYWxlKCk7Ci0JCVN0cmluZyBwcm9qZWN0Q2hhciA9IGNvbnRlbnQuZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCQlTdHJpbmcgZXN0aW1hdGluZ1RlY2huaXF1ZSA9IGNvbnRlbnQuZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpOwotCQlTdHJpbmcgcmlza0xldmVsID0gY29udGVudC5nZXRSaXNrTGV2ZWwoKTsKLQkJU3RyaW5nIHByb2plY3RNZW1iZXJFeHBlcnRpZXNlID0gY29udGVudC5nZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0JCVN0cmluZyB0eXBlT2ZDb250cmFjdCA9IGNvbnRlbnQuZ2V0VHlwZU9mQ29udHJhY3QoKTsKLQotCQljdHJsX3NjYWxlLnNldFRleHQoc2NhbGUgPT0gbnVsbCA/ICIiIDogc2NhbGUpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfcHJvamVjdF9jaGFyYWN0ZXJpc3RpY3MKLQkJCQkuc2V0VGV4dChwcm9qZWN0Q2hhciA9PSBudWxsID8gIiIgOiBwcm9qZWN0Q2hhcik7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9lc3RpbWF0aW5nX3RlY2huaXF1ZXMKLQkJCQkuc2V0VGV4dChlc3RpbWF0aW5nVGVjaG5pcXVlID09IG51bGwgPyAiIiA6IGVzdGltYXRpbmdUZWNobmlxdWUpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfcmlza19sZXZlbC5zZXRUZXh0KHJpc2tMZXZlbCA9PSBudWxsID8gIiIgOiByaXNrTGV2ZWwpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfcHJvamVjdF9tZW1iZXJfZXhwZXJ0aXNlCi0JCQkJLnNldFRleHQocHJvamVjdE1lbWJlckV4cGVydGllc2UgPT0gbnVsbCA/ICIiIDogcHJvamVjdE1lbWJlckV4cGVydGllc2UpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfdHlwZV9vZl9jb250cmFjdAotCQkJCS5zZXRUZXh0KHR5cGVPZkNvbnRyYWN0ID09IG51bGwgPyAiIiA6IHR5cGVPZkNvbnRyYWN0KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0Rlc2NyaXB0aW9uI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQkJTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKTsKLQkJZmluYWwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJZmluYWwgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBjb250ZW50ID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pIGRlbGl2ZXJ5UHJvY2VzcwotCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQotCQljdHJsX3NjYWxlLnNldE1vZGFsT2JqZWN0KGRlbGl2ZXJ5UHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfc2NhbGUuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCkpOwotCQljdHJsX3NjYWxlLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfc2NhbGUuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX3NjYWxlOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldFNjYWxlKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBkZWxpdmVyeVByb2Nlc3MKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCksIG5ld0NvbnRlbnQsCi0JCQkJCQkJLTEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9wcm9qZWN0X2NoYXJhY3RlcmlzdGljcy5zZXRNb2RhbE9iamVjdChkZWxpdmVyeVByb2Nlc3MKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkpOwotCQljdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfcHJvamVjdF9jaGFyYWN0ZXJpc3RpY3MuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsCi0JCQkJbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCQk6IGN0cmxfcHJvamVjdF9jaGFyYWN0ZXJpc3RpY3M7Ci0JCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCk7Ci0JCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCQkJLm11c3RSZXN0b3JlVmFsdWUoY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCWRlbGl2ZXJ5UHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpLAotCQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQljdHJsX3Jpc2tfbGV2ZWwuc2V0TW9kYWxPYmplY3QoZGVsaXZlcnlQcm9jZXNzLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9yaXNrX2xldmVsLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKSk7Ci0JCWN0cmxfcmlza19sZXZlbC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3Jpc2tfbGV2ZWwuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX3Jpc2tfbGV2ZWw7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0Umlza0xldmVsKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBkZWxpdmVyeVByb2Nlc3MKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Jpc2tMZXZlbCgpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZXN0aW1hdGluZ190ZWNobmlxdWVzLnNldE1vZGFsT2JqZWN0KGRlbGl2ZXJ5UHJvY2VzcwotCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfZXN0aW1hdGluZ190ZWNobmlxdWVzLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCkpOwotCQljdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlcy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlcy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfZXN0aW1hdGluZ190ZWNobmlxdWVzOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldEVzdGltYXRpbmdUZWNobmlxdWUoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCWRlbGl2ZXJ5UHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCksCi0JCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX3Byb2plY3RfbWVtYmVyX2V4cGVydGlzZS5zZXRNb2RhbE9iamVjdChkZWxpdmVyeVByb2Nlc3MKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3Byb2plY3RfbWVtYmVyX2V4cGVydGlzZQotCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkpOwotCQljdHJsX3Byb2plY3RfbWVtYmVyX2V4cGVydGlzZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3Byb2plY3RfbWVtYmVyX2V4cGVydGlzZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwKLQkJCQluZXcgTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJCTogY3RybF9wcm9qZWN0X21lbWJlcl9leHBlcnRpc2U7Ci0JCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0JCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCQkJLm11c3RSZXN0b3JlVmFsdWUoY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCWRlbGl2ZXJ5UHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdE1lbWJlckV4cGVydGlzZSgpLAotCQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQljdHJsX3R5cGVfb2ZfY29udHJhY3Quc2V0TW9kYWxPYmplY3QoZGVsaXZlcnlQcm9jZXNzLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF90eXBlX29mX2NvbnRyYWN0LnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpKTsKLQkJY3RybF90eXBlX29mX2NvbnRyYWN0LmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfdHlwZV9vZl9jb250cmFjdC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfdHlwZV9vZl9jb250cmFjdDsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRUeXBlT2ZDb250cmFjdCgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZGVsaXZlcnlQcm9jZXNzCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzRGVzY3JpcHRpb24jcmVmcmVzaChib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goYm9vbGVhbiBlZGl0YWJsZSkgewotCQlzdXBlci5yZWZyZXNoKGVkaXRhYmxlKTsKLQkJY3RybF9lc3RpbWF0aW5nX3RlY2huaXF1ZXMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9wcm9qZWN0X21lbWJlcl9leHBlcnRpc2Uuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX3Jpc2tfbGV2ZWwuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX3NjYWxlLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF90eXBlX29mX2NvbnRyYWN0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGVzY3JpcHRpb25Gb3JtUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EZXNjcmlwdGlvbkZvcm1QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMTFiMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EZXNjcmlwdGlvbkZvcm1QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5JdGVtc0ZpbHRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkNvbHVtbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuRGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkVkaXRvcnNDb250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLk1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudXRpbC5Db252ZXJ0R3VpZGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5JbWFnZUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5EYXRlRm9ybWF0OwotCi0KLS8qKgotICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBEZXNjcmlwdGlvbiBwYWdlcyBpbiB0aGUgTWV0aG9kIGVkaXRvcnMuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2MzgyCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZXNjcmlwdGlvbkZvcm1QYWdlIGV4dGVuZHMgQmFzZUZvcm1QYWdlIGltcGxlbWVudHMgSVJlZnJlc2hhYmxlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9XSURUSCA9IDE1MDsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfQVBQTElDQUJMRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubm90QXBwbGljYWJsZV90ZXh0OyAKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUklCVVRFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29udHJpYnV0ZXNfdGV4dDsgCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX0NPTlRSSUJVVEVTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5sb2NhbENvbnRyaWJ1dGVzX3RleHQ7ICAKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVORFNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4dGVuZHNfdGV4dDsgCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBMQUNFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwbGFjZXNfdGV4dDsgCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfUkVQTEFDRVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmxvY2FsUmVwbGFjZXNfdGV4dDsgCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5EU19SRVBMQUNFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXh0ZW5kc1JlcGxhY2VzX3RleHQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSk7Ci0JCi0JLy8gQ29tcG9zaXRlcyBhbmQgc2VjdGlvbnMuCi0JcHJvdGVjdGVkIFNlY3Rpb24gZm9ybVNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHNlY3Rpb25Db21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGV4cGFuZGVkQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gZ2VuZXJhbFNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiB2YXJpYWJpbGl0eVNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGdlbmVyYWxDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHZhcmlhYmlsaXR5Q29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gdmVyc2lvblNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHZlcnNpb25Db21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBpY29uU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgaWNvbkNvbXBvc2l0ZTsKLQotCXByaXZhdGUgQ2FudmFzIHBhbmUxOwotCi0JcHJpdmF0ZSBDYW52YXMgcGFuZTM7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBkZXRhaWxTZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBkZXRhaWxDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBub3RhdGlvblNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIG5vdGF0aW9uQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gdGFpbG9yaW5nU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgdGFpbG9yaW5nQ29tcG9zaXRlOwotCi0JLy8gRWRpdCBjb250cm9scy4KLQlwcm90ZWN0ZWQgVGV4dCBjdHJsX25hbWU7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lOwotCi0JcHJvdGVjdGVkIExhYmVsIGN0cmxfdHlwZV9sYWJlbDsKLQotCXByb3RlY3RlZCBCdXR0b24gY3RybF90eXBlX2J1dHRvbjsKLQotCXByb3RlY3RlZCBUZXh0IGN0cmxfYnJpZWZfZGVzYzsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgY3RybF9mdWxsX2Rlc2M7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGN0cmxfa2V5OwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dEVkaXRvciBjdHJsX2V4cGFuZGVkOwotCi0JcHJvdGVjdGVkIENvbWJvVmlld2VyIHZpZXdlcl92YXJpYWJpbGl0eTsKLQotCXByb3RlY3RlZCBDb21ibyBjdHJsX3ZhcmlhYmlsaXR5OwotCi0JcHJvdGVjdGVkIExhYmVsIGxhYmVsX2Jhc2U7Ci0KLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgYmFzZV92aWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgVGFibGUgY3RybF9iYXNlOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX2Jhc2VfYnV0dG9uOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgYWN0aXZlQ29udHJvbDsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2F1dGhvcnM7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjdHJsX2NoYW5nZV9kYXRlOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfY2hhbmdlX2Rlc2M7Ci0KLQlwcml2YXRlIFRleHQgY3RybF92ZXJzaW9uOwotCi0JcHJvdGVjdGVkIExhYmVsIGxhYmVsX2NvcHlyaWdodDsKLQotCXByb3RlY3RlZCBUYWJsZVZpZXdlciBjb3B5cmlnaHRfdmlld2VyOwotCi0JcHJvdGVjdGVkIFRhYmxlIGN0cmxfY29weXJpZ2h0OwotCi0JcHJpdmF0ZSBCdXR0b24gY29weXJpZ2h0X2J1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGNvcHlyaWdodF9idXR0b25fZGVzZWxlY3Q7Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VIeXBlcmxpbmsgZXhwYW5kRGV0YWlsTGluazsKLQotCXByb3RlY3RlZCBMYWJlbCBleHBhbmREZXRhaWxMYWJlbDsKLQotCXByb3RlY3RlZCBJbWFnZUh5cGVybGluayBleHBhbmROb3RhdGlvbkxpbms7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgZXhwYW5kTm90YXRpb25MYWJlbDsKLQotCXByb3RlY3RlZCBJbWFnZUh5cGVybGluayBleHBhbmRUYWlsb3JpbmdMaW5rOwotCi0JcHJvdGVjdGVkIExhYmVsIGV4cGFuZFRhaWxvcmluZ0xhYmVsOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBjdHJsX3B1cnBvc2U7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjdHJsX2V4dGVybmFsX2lkOwotCi0JcHJpdmF0ZSBJbWFnZSBzaGFwZUltYWdlOwotCi0JcHJpdmF0ZSBJbWFnZSBub2RlSW1hZ2U7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfc2VsZWN0X3NoYXBlSWNvbl9idXR0b247Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfY2xlYXJfc2hhcGVJY29uX2J1dHRvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gY3RybF9zZWxlY3Rfbm9kZUljb25fYnV0dG9uOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX2NsZWFyX25vZGVJY29uX2J1dHRvbjsKLQkKLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfcHVibGlzaF9jYXRlZ29yaWVzX2J1dHRvbjsKLQotCXByb3RlY3RlZCBJbWFnZUh5cGVybGluayBleHBhbmRWZXJzaW9uTGluazsKLQotCXByb3RlY3RlZCBMYWJlbCBleHBhbmRWZXJzaW9uTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VIeXBlcmxpbmsgZXhwYW5kTGluazsKLQotCXByb3RlY3RlZCBMYWJlbCBleHBhbmRMYWJlbDsKLQkKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyVmFyaWFiaWxpdHk7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyQmFzZTsKLQkKLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlclZhcmlhYmlsaXR5ID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkJVmFyaWFiaWxpdHlUeXBlIHZhck9iamVjdCA9IChWYXJpYWJpbGl0eVR5cGUpIG9iamVjdDsKLQkJCWlmICh2YXJPYmplY3QgPT0gVmFyaWFiaWxpdHlUeXBlLk5BKQotCQkJCXJldHVybiBOT1RfQVBQTElDQUJMRV9URVhUOwotCQkJaWYgKHZhck9iamVjdCA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpCi0JCQkJcmV0dXJuIENPTlRSSUJVVEVTX1RFWFQ7Ci0JCQlpZiAodmFyT2JqZWN0ID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pCi0JCQkJcmV0dXJuIExPQ0FMX0NPTlRSSUJVVEVTX1RFWFQ7Ci0JCQlpZiAodmFyT2JqZWN0ID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKQotCQkJCXJldHVybiBFWFRFTkRTX1RFWFQ7Ci0JCQlpZiAodmFyT2JqZWN0ID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUykKLQkJCQlyZXR1cm4gUkVQTEFDRVNfVEVYVDsKLQkJCWlmICh2YXJPYmplY3QgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKQotCQkJCXJldHVybiBMT0NBTF9SRVBMQUNFU19URVhUOwotCQkJaWYgKHZhck9iamVjdCA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19SRVBMQUNFUykKLQkJCQlyZXR1cm4gRVhURU5EU19SRVBMQUNFU19URVhUOwotCQkJCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlckJhc2UgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgob2JqZWN0KTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvcHlyaWdodENvbnRlbnRQcm92aWRlcjsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgY29weXJpZ2h0TGFiZWxQcm92aWRlckJhc2UgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBtb2RlbE1vZGlmeUxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcjsKLQkKLQlwcm90ZWN0ZWQgRm9jdXNBZGFwdGVyIG5hbWVGb2N1c0xpc3RlbmVyID0gbmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9IG1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpIDsKLQkJCVN0cmluZyBuYW1lID0gY3RybF9uYW1lLmdldFRleHQoKS50cmltKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJZS53aWRnZXQsIG1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChuYW1lLmVxdWFscyhtZXRob2RFbGVtZW50LmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQkvLyAxNzg0NjIKLQkJCVN0cmluZyBtc2cgPSBudWxsOwotCQkJaWYgKG9sZENvbnRlbnQuaW5kZXhPZigiJiIpIDwgMCAmJiBuYW1lLmluZGV4T2YoIiYiKSA+IC0xKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCW1zZyA9IE5MUy5iaW5kKAotCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZEVsZW1lbnROYW1lRXJyb3I0X21zZywKLQkJCQkJCW5hbWUpOwotCQkJfSBlbHNlIHsKLQkJCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IGdldE5hbWVWYWxpZGF0b3IoKTsKLQkJCQlpZih2YWxpZGF0b3IgPT0gbnVsbCl7Ci0JCQkJCXZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuY3JlYXRlTmFtZVZhbGlkYXRvcigKLQkJCQkJCQkJbWV0aG9kRWxlbWVudCwKLQkJCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJCX0KLQkJCQltc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChuYW1lKTsKLQkJCX0KLQkJCWlmIChtc2cgPT0gbnVsbCAmJiAhbmFtZS5lcXVhbHMobWV0aG9kRWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQkJaWYobmFtZS5pbmRleE9mKCImIikgPiAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCW1zZyA9IE5MUy5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmludmFsaWRFbGVtZW50TmFtZUVycm9yNF9tc2csCi0JCQkJCQkJbmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQkJbmFtZSA9IFN0clV0aWwubWFrZVZhbGlkRmlsZU5hbWUoY3RybF9uYW1lLmdldFRleHQoKSk7Ci0JCQkJY3RybF9uYW1lLnNldFRleHQobmFtZSk7IC8vMTgzMDg0Ci0JCQkJaWYgKCFuYW1lLmVxdWFscyhtZXRob2RFbGVtZW50LmdldE5hbWUoKSkpIHsJCQkJCQkKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwgbWV0aG9kRWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkJCQkJCW5hbWUsIC0xKTsKLQkJCQkJaWYgKCFzdWNjZXNzKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJaWYgKENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkJCQkuaGFzUHJlc2VudGF0aW9uKG1ldGhvZEVsZW1lbnQpKSB7Ci0JCQkJCQlSZXNvdXJjZSBjb250ZW50UmVzb3VyY2UgPSBjb250ZW50RWxlbWVudAotCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCk7Ci0JCQkJCQlpZiAoY29udGVudFJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCQkJCQkJLmFkZFJlc291cmNlVG9BZGp1c3RMb2NhdGlvbihjb250ZW50UmVzb3VyY2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXNldEZvcm1UZXh0V2l0aFZhcmlhYmxlSW5mbygpOwotCQkJCQljdHJsX25hbWUuc2V0VGV4dChuYW1lKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vRml4IG1pc3NpbmcgIiYiIGluIGVycm9yIGRpYWxvZwotCQkJCWlmIChtc2cuaW5kZXhPZigiJiIpID49IDApIHsvLyROT04tTkxTLTEkCi0JCQkJCW1zZyA9IG1zZy5yZXBsYWNlKCImIiwgIiYmIik7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lRXJyb3JfdGl0bGUsIAotCQkJCQkJCQltc2cpOwotCQkJCWN0cmxfbmFtZS5zZXRUZXh0KG1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkJCQljdHJsX25hbWUuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJCQkJY3RybF9uYW1lLnNlbGVjdEFsbCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLy8gRWRpdGluZyBhbmQgZGlzcGxheSBmbGFncy4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZXNjRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhbFNlY3Rpb25FeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZXRhaWxTZWN0aW9uRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbm90YXRpb25TZWN0aW9uRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGFpbG9yaW5nU2VjdGlvbkV4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIHZlcnNpb25TZWN0aW9uRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWxlbWVudFNlY3Rpb25FeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpY29uU2VjdGlvbkV4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGZ1bGxEZXNjT24gPSB0cnVlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4ga2V5Q29uc2lkZXJhdGlvbk9uID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGJyaWVmRGVzY09uID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGVsZW1lbnRUeXBlT24gPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGNvbnRlbnRGaWVsZE9uID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJzaW9uU2VjdGlvbk9uID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGFueUF0dHJpYnV0ZU1vZGlmaWVkID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmFsU2VjdGlvbk9uID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBib29sZWFuIG5vdGF0aW9uU2VjdGlvbk9uID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZXRhaWxTZWN0aW9uT24gPSB0cnVlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGFpbG9yaW5nU2VjdGlvbk9uID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YXJpYWJpbGl0eVNlY3Rpb25PbiA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwdXJwb3NlT24gPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGV4dGVybmFsSWRPbiA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaWNvblNlY3Rpb25PbiA9IGZhbHNlOwotCQotCXByb3RlY3RlZCBib29sZWFuIHB1Ymxpc2hDYXRlZ29yeU9uID0gZmFsc2U7Ci0KLQkvLyBjb21tZW50ZWQgYmVjYXVzZSB0aGVzZSB2YXJpYWJsZXMgYXJlIG5vdCBpbiB1c2UKLQkvLyBwcm90ZWN0ZWQgU3RyaW5nIHZhcmlhYmlsaXR5VHlwZU5vbmUgPSBOT1RfQVBQTElDQUJMRV9URVhUOwotCS8vIHByb3RlY3RlZCBTdHJpbmcgdmFyaWFiaWxpdHlUeXBlQ29udHJpYnV0ZXMgPSBDT05UUklCVVRFU19URVhUOwotCS8vIHByb3RlY3RlZCBTdHJpbmcgdmFyaWFiaWxpdHlUeXBlRXh0ZW5kcyA9IEVYVEVORFNfVEVYVDsKLQkvLyBwcm90ZWN0ZWQgU3RyaW5nIHZhcmlhYmlsaXR5VHlwZVJlcGxhY2VzID0gUkVQTEFDRVNfVEVYVDsKLQotCS8vIEludGVybmFsIElEcyBmb3IgdGhlIHNlY3Rpb25zLgotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEdFTkVSQUxfU0VDVElPTl9JRCA9IDE7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBERVRBSUxfU0VDVElPTl9JRCA9IDI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OX1NFQ1RJT05fSUQgPSAzOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTk9UQVRJT05fU0VDVElPTl9JRCA9IDQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUQUlMT1JJTkdfU0VDVElPTl9JRCA9IDU7Ci0KLQlwcml2YXRlIGludCB3YXJuaW5nQ291bnQgPSAxOwotCi0JcHJpdmF0ZSBpbnQgU0VDVElPTlMgPSAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IFNIQVBFSUNPTl9XSURUSF9NQVggPSAzMjsKLQotCXByaXZhdGUgc3RhdGljIGludCBTSEFQRUlDT05fSEVJR0hUX01BWCA9IDMyOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE5PREVJQ09OX1dJRFRIX01BWCA9IDE2OwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE5PREVJQ09OX0hFSUdIVF9NQVggPSAxNjsKLQotCXByb3RlY3RlZCBJRmlsdGVyIGZpbHRlcjsKLQotCXByaXZhdGUgYm9vbGVhbiBkaXNwb3NlZDsKLQotCS8vIFRvIGhhbmRsZSB0aGUgaTExOG4gcHJvcGVybHkgYW5kIGF2b2lkIHN0cmluZyBjb25jYXRlbmF0aW9uLgotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgU3RyaW5nIGRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgU3RyaW5nIHRhaWxvcmluZ1NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgU3RyaW5nIG5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBTdHJpbmcgdmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIFN0cmluZyBpY29uU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBTdHJpbmcgdmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXByaXZhdGUgTGFiZWwgbm9kZUljb25QYXRoOwotCi0JcHJpdmF0ZSBMYWJlbCBzaGFwZUljb25QYXRoOwotCQotCXByaXZhdGUgU3RyaW5nW10gaW1hZ2VUeXBlcyA9IG5ldyBTdHJpbmdbXSB7ICIqLmdpZjsqLmpwZzsqLnBuZzsqLmljbzsqLmJtcCIgfTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nW10gaW1hZ2VOYW1lcyA9IG5ldyBTdHJpbmdbXSB7ICJJbWFnZSAoZ2lmLCBqcGVnLCBwbmcsIGljbywgYm1wKSIgfTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQ29udGVudCBmaWx0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQ29udGVudCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhZ2UuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRtZXRob2RFbGVtZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyQmFzZSgpIHsKLQkJY29udGVudFByb3ZpZGVyQmFzZSA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCUFycmF5TGlzdCBiYXNlX3NlbGVjdGVkX2xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKGNvbnRlbnRFbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKQotCQkJCQliYXNlX3NlbGVjdGVkX2xpc3QuYWRkKGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSk7Ci0JCQkJcmV0dXJuIGJhc2Vfc2VsZWN0ZWRfbGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChWYXJpYWJpbGl0eUVsZW1lbnQuY2xhc3MpKSB7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWJhc2Vfdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJCYXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgZm9ybSBlZGl0b3IuCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBUaGUgdW5pcXVlIElEIGZvciB0aGUgZm9ybSBwYWdlLgotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZm9ybSBwYWdlLgotCSAqLwotCXB1YmxpYyBEZXNjcmlwdGlvbkZvcm1QYWdlKEZvcm1FZGl0b3IgZWRpdG9yLCBTdHJpbmcgaWQsIFN0cmluZyB0aXRsZSkgewotCQlzdXBlcihlZGl0b3IsIGlkLCB0aXRsZSk7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgVmFyaWFiaWxpdHlUeXBlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgewotCi0JCXByaXZhdGUgVmFyaWFiaWxpdHlUeXBlW10gdHlwZXM7Ci0KLQkJcHVibGljIFZhcmlhYmlsaXR5VHlwZUNvbnRlbnRQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgVmFyaWFiaWxpdHlUeXBlW10gdHlwZXMpIHsKLQkJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCXRoaXMudHlwZXMgPSB0eXBlczsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gdHlwZXM7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSA9PSBtZXRob2RFbGVtZW50Ci0JCQkJCSYmIG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUCi0JCQkJCSYmIG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFKSB7Ci0JCQkJdmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkJhc2VGb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCQotCQlWYXJpYWJpbGl0eVR5cGVbXSB0eXBlczsKLQkJaWYgKG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJCXR5cGVzID0gbmV3IFZhcmlhYmlsaXR5VHlwZVtdIHsKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLk5BLAotCQkJCQlWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMsCi0JCQkJCVZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUywKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMKLQkJCX07Ci0JCX0gZWxzZSB7Ci0JCQl0eXBlcyA9IG5ldyBWYXJpYWJpbGl0eVR5cGVbXSB7Ci0JCQkJCVZhcmlhYmlsaXR5VHlwZS5OQSwKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTLAotCQkJCQlWYXJpYWJpbGl0eVR5cGUuRVhURU5EUywKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTLAotCQkJCQlWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19SRVBMQUNFUwotCQkJfTsKLQkJfQotCQljb250ZW50UHJvdmlkZXJWYXJpYWJpbGl0eSA9IG5ldyBWYXJpYWJpbGl0eVR5cGVDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgdHlwZXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLmNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJc3VwZXIuY3JlYXRlRm9ybUNvbnRlbnQobWFuYWdlZEZvcm0pOwotCQljcmVhdGVFZGl0b3JDb250ZW50KHRvb2xraXQpOwotCQlzZXRDb250ZXh0SGVscCgpOwotCQlzZXRGb3JtVGV4dFdpdGhWYXJpYWJsZUluZm8oKTsKLQkJbG9hZERhdGEoKTsKLQkJYWRkTGlzdGVuZXJzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEZvcm1UZXh0V2l0aFZhcmlhYmxlSW5mbygpIHsKLQkJVUlIZWxwZXIuc2V0Rm9ybVRleHQoZm9ybSwgbWV0aG9kRWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKiBAc2VlIFRuZ1V0aWwjZ2V0TGFiZWwgQ29kZSBtb3ZlZCB0byBUbmdVdGlsLmdldExhYmVsKGJlbG93IG1vcmUgc3BlY2lmaWMKLQkgKiAgICAgIG1ldGhvZClyZXR1cm5zIGxhYmVsIHdpdGggdmFyaWFiaWxpdHlJbmZvCi0JICogICAgICA8Y29kZT5UbmdVdGlsLmdldExhYmVsKFZhcmlhYmlsaXR5RWxlbWVudCBvYmplY3QsIFN0cmluZyBhbHRlcm5hdGl2ZUxhYmVsLCBib29sZWFuIHByZWZlckJhc2UpPC9jb2RlPgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoVmFyaWFiaWxpdHlFbGVtZW50IG9iamVjdCwgU3RyaW5nIGFsdGVybmF0aXZlTGFiZWwsCi0JCQlib29sZWFuIHByZWZlckJhc2UpIHsKLQkJU3RyaW5nIGxhYmVsID0gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGFsdGVybmF0aXZlTGFiZWwpOwotCQlpZiAocHJlZmVyQmFzZSAmJiBvYmplY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gb2JqZWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJU3RyaW5nIHZhcmlhYmlsaXR5VHh0ID0gbnVsbDsKLQkJCWlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUykgewotCQkJCXZhcmlhYmlsaXR5VHh0ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCS5jb250cmlidXRlc190b190ZXh0OyAKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OKSB7Ci0JCQkJdmFyaWFiaWxpdHlUeHQgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkubG9jYWxDb250cmlidXRlc190ZXh0OyAJCQkKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUykgewkJCQkJCi0JCQkJdmFyaWFiaWxpdHlUeHQgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJLmV4dGVuZHNfdGV4dDsKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpIHsKLQkJCQl2YXJpYWJpbGl0eVR4dCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkucmVwbGFjZXNfdGV4dDsgCi0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKSB7Ci0JCQkJdmFyaWFiaWxpdHlUeHQgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJLmxvY2FsUmVwbGFjZXNfdGV4dDsgCi0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfUkVQTEFDRVMpIHsKLQkJCQl2YXJpYWJpbGl0eVR4dCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJLmV4dGVuZHNSZXBsYWNlc190ZXh0OyAKLQkJCX0KLQkJCWlmICh2YXJpYWJpbGl0eVR4dCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIobGFiZWwpCi0JCQkJCQkuYXBwZW5kKCIgKCIpLmFwcGVuZCh2YXJpYWJpbGl0eVR4dCkuYXBwZW5kKCIgJyIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJLmFwcGVuZCgKLQkJCQkJCQkJVG5nVXRpbC5nZXRMYWJlbChvYmplY3QKLQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLAotCQkJCQkJCQkJCWFsdGVybmF0aXZlTGFiZWwpKS5hcHBlbmQoIiciKTsgLy8kTk9OLU5MUy0xJAotCQkJCU1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ob2JqZWN0Ci0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJCQlpZiAoYmFzZVBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJCXN0ckJ1ZgotCQkJCQkJCS5hcHBlbmQoIiBpbiAnIikuYXBwZW5kKGJhc2VQbHVnaW4uZ2V0TmFtZSgpKS5hcHBlbmQoIicpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlsYWJlbCA9IHN0ckJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGVkaXRvciB0YWIgY29udGVudAotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQljcmVhdGVGb3JtQ29tcG9zaXRlcyh0b29sa2l0KTsKLQkJbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpOwotCQkvLyBDcmVhdGUgdGhlIEdlbmVyYWwgc2VjdGlvbi4KLQkJaWYgKGdlbmVyYWxTZWN0aW9uT24pIHsKLQkJCWNyZWF0ZUdlbmVyYWxTZWN0aW9uKHRvb2xraXQpOwotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCQlTRUNUSU9OUysrOwotCQl9Ci0KLQkJLy8gQ3JlYXRlIHRoZSBEZXRhaWwgc2VjdGlvbi4KLQkJaWYgKGRldGFpbFNlY3Rpb25PbikgewotCQkJY3JlYXRlRGV0YWlsU2VjdGlvbih0b29sa2l0KTsKLQkJCVNFQ1RJT05TKys7Ci0JCX0KLQotCQkvLyBDcmVhdGUgdGhlIE5vdGF0aW9uIHNlY3Rpb24uCi0JCWlmIChub3RhdGlvblNlY3Rpb25PbikgewotCQkJY3JlYXRlTm90YXRpb25TZWN0aW9uKHRvb2xraXQpOwotCQkJU0VDVElPTlMrKzsKLQkJfQotCi0JCS8vIENyZWF0ZSB0aGUgVGFpbG9yaW5nIFNlY3Rpb24uCi0JCWlmICh0YWlsb3JpbmdTZWN0aW9uT24pIHsKLQkJCWNyZWF0ZVRhaWxvcmluZ1NlY3Rpb24odG9vbGtpdCk7Ci0JCQlTRUNUSU9OUysrOwotCQl9Ci0KLQkJLy8gQ3JlYXRlIHRoZSBWZXJzaW9uIHNlY3Rpb24uCi0JCWlmICh2ZXJzaW9uU2VjdGlvbk9uKSB7Ci0JCQljcmVhdGVWZXJzaW9uU2VjdGlvbih0b29sa2l0KTsKLQkJCWNyZWF0ZVZlcnNpb25TZWN0aW9uQ29udGVudCgpOwotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IodmVyc2lvbkNvbXBvc2l0ZSk7Ci0JCQlTRUNUSU9OUysrOwotCQl9Ci0KLQkJaWYgKHZhcmlhYmlsaXR5U2VjdGlvbk9uKSB7Ci0JCQljcmVhdGVWYXJpYWJpbGl0eVNlY3Rpb24odG9vbGtpdCk7Ci0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcih2YXJpYWJpbGl0eUNvbXBvc2l0ZSk7Ci0JCQlTRUNUSU9OUysrOwotCQl9Ci0KLQkJLy8gSWNvbiBTZWN0aW9uCi0JCWlmIChpY29uU2VjdGlvbk9uKSB7Ci0JCQljcmVhdGVJY29uU2VjdGlvbih0b29sa2l0KTsKLQkJCWNyZWF0ZUljb25TZWN0aW9uQ29udGVudCgpOwotCQkJU0VDVElPTlMrKzsKLQkJfQotCi0JCWlmIChleHBhbmRlZENvbXBvc2l0ZSAhPSBudWxsKQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZXhwYW5kZWRDb21wb3NpdGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JtQ29tcG9zaXRlcyhGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCS8vIENyZWF0ZSB0aGUgbWFpbiBzZWN0aW9uICh1c2VkIGZvciBzd2FwcGluZyBkaXNwbGF5IG9mCi0JCS8vIHNlY3Rpb25Db21wb3NpdGUgYW5kIGV4cGFuZGVkQ29tcG9zaXRlKS4KLQkJZm9ybVNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksIFNlY3Rpb24uTk9fVElUTEUpOwotCQl7Ci0JCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQkJZm9ybVNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRMYXlvdXQobmV3IFRhYmxlV3JhcExheW91dCgpKTsKLQkJfQotCi0JCS8vIENyZWF0ZSB0aGUgY29tcG9zaXRlIGZvciB0aGUgc2VjdGlvbnMuCi0JCUNvbXBvc2l0ZSBtYWluQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZm9ybVNlY3Rpb24sIFNXVC5OT05FKTsKLQkJewotCQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJCW1haW5Db21wb3NpdGUuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCQlGb3JtTGF5b3V0IGxheW91dCA9IG5ldyBGb3JtTGF5b3V0KCk7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQltYWluQ29tcG9zaXRlLnNldExheW91dCggbGF5b3V0KTsKLQkJCWZvcm1TZWN0aW9uLnNldENsaWVudChtYWluQ29tcG9zaXRlKTsKLQkJfQotCQkKLQkKLQkJLy8gY2hlY2sgZm9yIGV4dGVuc3Rpb24gcG9pbnQgYW5kIGFkZCB0aGUgcGFnZSBpZiB0aGVyZQotCQlMaXN0PD8+IGNvbHVtblByb3ZpZGVycyA9IERlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q29sdW1uUHJvdmlkZXJzKCk7Ci0KLQkJaWYgKGNvbHVtblByb3ZpZGVycyA9PSBudWxsIHx8IGNvbHVtblByb3ZpZGVycy5zaXplKCkgPT0gMCkgewotCQkJY3JlYXRlU2VjdGlvbkNvbXBvc2l0ZShtYWluQ29tcG9zaXRlLCAwLCAxMDApOwotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtblByb3ZpZGVycy5zaXplKCk7IGkrKykgewotCQkJCQlDb2x1bW5FbGVtZW50IGNvbHVtbiA9IChDb2x1bW5FbGVtZW50KSBjb2x1bW5Qcm92aWRlcnMuZ2V0KGkpOwotCQkJCQlJQ29sdW1uUHJvdmlkZXIgcHJvdmlkZXJDbGFzcyA9IChJQ29sdW1uUHJvdmlkZXIpIGNvbHVtbi5nZXRDb250cmlidXRvckNsYXNzKCk7Ci0JCQkJCWludCB3aWR0aCA9IGNvbHVtbi5nZXRXaWR0aCgpOwotCQkJCQlTdHJpbmcgYWxpZ25tZW50ID0gY29sdW1uLmdldEFsaWdubWVudCgpOwotCQkJCQkKLQkJCQkJaWYgKHByb3ZpZGVyQ2xhc3MgaW5zdGFuY2VvZiBJQ29sdW1uUHJvdmlkZXIpIHsKLQkJCQkJCUlDb2x1bW5Qcm92aWRlciBjb2x1bW5Qcm92aWRlciA9IChJQ29sdW1uUHJvdmlkZXIpIHByb3ZpZGVyQ2xhc3M7Ci0JCQkJCQkKLQkJCQkJCWlmIChhbGlnbm1lbnQuZXF1YWxzKCJsZWZ0IikpIHsKLQkJCQkJCQljcmVhdGVTZWN0aW9uQ29tcG9zaXRlKG1haW5Db21wb3NpdGUsIHdpZHRoLAotCQkJCQkJCQkJMTAwKTsKLQotCQkJCQkJCUNvbXBvc2l0ZSBjb2x1bW5Db21wb3NpdGUgPSBjb2x1bW5Qcm92aWRlcgotCQkJCQkJCQkJLnNldENvbHVtbih0b29sa2l0LCBtYWluQ29tcG9zaXRlKTsKLQkJCQkJCQl7CQkJCQkJCQotCQkJCQkJCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQkJCQkJCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQkJCQkJCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNSk7Ci0JCQkJCQkJCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUpOwotCQkJCQkJCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KAotCQkJCQkJCQkJCXNlY3Rpb25Db21wb3NpdGUsIDApOwotCQkJCQkJCQljb2x1bW5Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQkJCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJCQkJCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCQkJCQkJY29sdW1uQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkJCQkJCX0JCQkJCQkKLQkJCQkJCX0KLQkJCQkJCWlmIChhbGlnbm1lbnQuZXF1YWxzKCJyaWdodCIpKSB7Ci0JCQkJCQkJY3JlYXRlU2VjdGlvbkNvbXBvc2l0ZShtYWluQ29tcG9zaXRlLCAwLAotCQkJCQkJCQkJMTAwIC0gd2lkdGgpOwotCi0JCQkJCQkJQ29tcG9zaXRlIGNvbHVtbkNvbXBvc2l0ZSA9IGNvbHVtblByb3ZpZGVyCi0JCQkJCQkJCQkuc2V0Q29sdW1uKHRvb2xraXQsIG1haW5Db21wb3NpdGUpOwotCQkJCQkJCXsKLQkJCQkJCQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJCQkJCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJCQkJCQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KAotCQkJCQkJCQkJCXNlY3Rpb25Db21wb3NpdGUsIDUpOwotCQkJCQkJCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01KTsKLQkJCQkJCQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQkJCQkJCQljb2x1bW5Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQkJCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJCQkJCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCQkJCQkJY29sdW1uQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gQ3JlYXRlIHRoZSBjb21wb3NpdGUgZm9yIHRoZSBSaWNoVGV4dEVkaXRvci4KLQkJZXhwYW5kZWRDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShmb3JtU2VjdGlvbiwgU1dULk5PTkUpOwotCQl7Ci0JCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0KLQkJLy8gQWRkIHRoZSBleHBhbmQvY29sbGFwc2UgaHlwZXJsaW5rIGltYWdlLgotCQlleHBhbmRMaW5rID0gdG9vbGtpdC5jcmVhdGVJbWFnZUh5cGVybGluayhleHBhbmRlZENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlleHBhbmRMaW5rLnNldEltYWdlKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19FWFBBTkRFRCk7Ci0JCWV4cGFuZExpbmsuc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2xvc2VSVEUpOwotCQlleHBhbmRMaW5rLnNldFVuZGVybGluZWQoZmFsc2UpOwotCQlleHBhbmRMaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJdG9nZ2xlKGUpOwotCQkJfQotCQl9KTsKLQotCQkvLyBBZGQgdGhlIGV4cGFuZC9jb2xsYXBzZSBoeXBlcmxpbmsgdGV4dC4KLQkJZXhwYW5kTGFiZWwgPSBjcmVhdGVEZWNvcmF0ZWRMYWJlbCh0b29sa2l0LCBleHBhbmRlZENvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBFUEYgTWFpbiBzZWN0aW9uIGNvbXBvc2l0ZSB3aGVyZSBhbGwgZ2VuZXJhbCwgZGV0YWlsIHNlY3Rpb24gcmVzaWRlcwotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWN0aW9uQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBsZWZ0TWFyZ2luLAotCQkJaW50IHJpZ2h0TWFyZ2luKSB7Ci0JCS8vIENyZWF0ZSB0aGUgY29tcG9zaXRlIGZvciB0aGUgc2VjdGlvbnMuCi0JCXNlY3Rpb25Db21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJewotCQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobGVmdE1hcmdpbiwgMCk7Ci0JCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01KTsKLQkJCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocmlnaHRNYXJnaW4sIC01KTsKLQkJCXNlY3Rpb25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBHZW5lcmFsIHNlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlnZW5lcmFsU2VjdGlvbiA9IGNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuR0VORVJBTF9JTkZPX1NFQ1RJT05fTkFNRSwKLQkJCQlnZXRHZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uKCkpOwotCQlnZW5lcmFsQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGdlbmVyYWxTZWN0aW9uKTsKLQkJKChHcmlkTGF5b3V0KSBnZW5lcmFsQ29tcG9zaXRlLmdldExheW91dCgpKS5udW1Db2x1bW5zID0gNDsKLQkJY3JlYXRlR2VuZXJhbFNlY3Rpb25Db250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgR2VuZXJhbCBzZWN0aW9uIGNvbnRlbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUdlbmVyYWxTZWN0aW9uQ29udGVudCgpIHsKLQkJLy8gQWRkIHRoZSBOYW1lIGxhYmVsIGFuZCB0ZXh0IGNvbnRyb2wuCi0JCWN0cmxfbmFtZSA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsMyh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5OQU1FX1RFWFQsIFNXVC5ERUZBVUxULCBTV1QuU0lOR0xFKTsKLQotCQkvLyBBZGQgdGhlIFByZXNlbnRhdGlvbiBuYW1lIGxhYmVsIGFuZCB0ZXh0IGNvbnRyb2wuCi0JCWN0cmxfcHJlc2VudGF0aW9uX25hbWUgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDModG9vbGtpdCwKLQkJCQlnZW5lcmFsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuUFJFU0VOVEFUSU9OX05BTUVfVEVYVCwKLQkJCQlTV1QuREVGQVVMVCwgU1dULlNJTkdMRSk7Ci0KLQkJaWYgKGVsZW1lbnRUeXBlT24pIHsKLQkJCWNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5UWVBFX1RFWFQsIDIpOwotCQkJY3RybF90eXBlX2xhYmVsID0gY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQkJY3RybF90eXBlX2xhYmVsLnNldEJhY2tncm91bmQoRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJCS5nZXRTeXN0ZW1Db2xvcigxOSkpOwotCQkJCWN0cmxfdHlwZV9sYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCX0KLQkJCWlmIChtZXRob2RFbGVtZW50IGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQljdHJsX3R5cGVfYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQkJCUF1dGhvcmluZ1VJVGV4dC5DSEFOR0VfVFlQRV9CVVRUT05fVEVYVCwgU1dULlBVU0gpOwotCQkJCXsKLQkJCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJCQljdHJsX3R5cGVfYnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJCX0KLQkJCQlpZiAoQ29udmVydEd1aWRhbmNlVHlwZQotCQkJCQkJLmdldFZhbGlkTmV3R3VpZGFuY2VUeXBlcygoR3VpZGFuY2UpIG1ldGhvZEVsZW1lbnQpID09IG51bGwpIHsKLQkJCQkJY3RybF90eXBlX2J1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZXh0ZXJuYWxJZE9uKSB7Ci0JCQljdHJsX2V4dGVybmFsX2lkID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWwzKHRvb2xraXQsCi0JCQkJCWdlbmVyYWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5VTklRVUVfSURfVEVYVCwKLQkJCQkJU1dULkRFRkFVTFQsIFNXVC5TSU5HTEUpOwotCQl9Ci0KLQkJaWYgKGJyaWVmRGVzY09uKSB7Ci0JCQljdHJsX2JyaWVmX2Rlc2MgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDModG9vbGtpdCwKLQkJCQkJZ2VuZXJhbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkJSSUVGX0RFU0NSSVBUSU9OX1RFWFQsCi0JCQkJCTQwLCBTV1QuTVVMVEkgfCBTV1QuVFJBVkVSU0VfVEFCX05FWFQpOwotCQl9CQkKLQotCQlpZiAocHVibGlzaENhdGVnb3J5T24pIHsKLQkJCWN0cmxfcHVibGlzaF9jYXRlZ29yaWVzX2J1dHRvbiA9IHRvb2xraXQKLQkJCS5jcmVhdGVCdXR0b24oCi0JCQkJCWdlbmVyYWxDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5QVUJMSVNIX0NBVEVHT1JJRVNfVEVYVCwgU1dULkNIRUNLKTsgCi0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJCWN0cmxfcHVibGlzaF9jYXRlZ29yaWVzX2J1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgQ29udGVudCBWYXJpYWJpbGl0eSBzZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVZhcmlhYmlsaXR5U2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCXZhcmlhYmlsaXR5U2VjdGlvbiA9IGNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuVkFSSUFCSUxJVFlfU0VDVElPTl9OQU1FLAotCQkJCWdldFZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uKCkpOwotCQkKLQkJdmFyaWFiaWxpdHlDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZSh2YXJpYWJpbGl0eVNlY3Rpb24pOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5CRUdJTk5JTkcgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDI0OwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotCQkJdmFyaWFiaWxpdHlDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJdmFyaWFiaWxpdHlDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDUsIGZhbHNlKSk7Ci0JCXZhcmlhYmlsaXR5U2VjdGlvbi5zZXRDbGllbnQodmFyaWFiaWxpdHlDb21wb3NpdGUpOwotCi0JCWN0cmxfdmFyaWFiaWxpdHkgPSBjcmVhdGVDb21ib1dpdGhMYWJlbDModG9vbGtpdCwgdmFyaWFiaWxpdHlDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlZBUklBQklMSVRZX1RZUEVfVEVYVCk7Ci0KLQkJdmlld2VyX3ZhcmlhYmlsaXR5ID0gbmV3IENvbWJvVmlld2VyKGN0cmxfdmFyaWFiaWxpdHkpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5CRUdJTk5JTkcgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDI0OwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotCQkJdmlld2VyX3ZhcmlhYmlsaXR5LmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJWYXJpYWJpbGl0eSk7Ci0JCXZpZXdlcl92YXJpYWJpbGl0eS5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXJWYXJpYWJpbGl0eSk7Ci0JCXZpZXdlcl92YXJpYWJpbGl0eS5zZXRJbnB1dChtZXRob2RFbGVtZW50KTsKLQotCQl0b29sa2l0LmNyZWF0ZUxhYmVsKHZhcmlhYmlsaXR5Q29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy9TdHJpbmcgYmFzZUVsZW1lbnQgPSBMaWJyYXJ5VUlUZXh0LmdldFVJVGV4dExvd2VyKG1ldGhvZEVsZW1lbnQpOwotCQlsYWJlbF9iYXNlID0gY3JlYXRlTGFiZWwodG9vbGtpdCwgdmFyaWFiaWxpdHlDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkJBU0VfRUxFTUVOVF9URVhULCAyKTsKLQkJY3RybF9iYXNlID0gY3JlYXRlVGFibGUodG9vbGtpdCwgdmFyaWFiaWxpdHlDb21wb3NpdGUsIFNXVC5TSU5HTEUKLQkJCQl8IFNXVC5SRUFEX09OTFksIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkJFR0lOTklORywgNSwgMzAwLCAxLCAyKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSAyNDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJCWN0cmxfYmFzZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWJhc2Vfdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfYmFzZSk7Ci0JCWluaXRDb250ZW50UHJvdmlkZXJCYXNlKCk7Ci0JCWJhc2Vfdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlckJhc2UpOwotCQliYXNlX3ZpZXdlci5zZXRJbnB1dChtZXRob2RFbGVtZW50KTsKLQotCQlDb21wb3NpdGUgYmFzZUJ1dHRvblBhbmUgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgdmFyaWFiaWxpdHlDb21wb3NpdGUsIAotCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORywgMSwgMSwgMSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCQliYXNlQnV0dG9uUGFuZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQljdHJsX2Jhc2VfYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYmFzZUJ1dHRvblBhbmUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlNFTEVDVF9CVVRUT05fVEVYVCwgU1dULlNJTVBMRSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSBCVVRUT05fV0lEVEg7Ci0JCQljdHJsX2Jhc2VfYnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJLy8gU2V0IGZvY3VzIG9uIHRoZSBOYW1lIHRleHQgY29udHJvbC4KLQkJRGlzcGxheSBkaXNwbGF5ID0gZm9ybS5nZXRCb2R5KCkuZ2V0RGlzcGxheSgpOwotCQlpZiAoIShkaXNwbGF5ID09IG51bGwgfHwgZGlzcGxheS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZihjdHJsX25hbWUuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCQotCQkJCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCQkJaWYgKG1ldGhvZFVuaXQgIT0gbnVsbCAmJiBtZXRob2RVbml0LmdldENoYW5nZURhdGUoKSA9PSBudWxsKQotCQkJCQkJY3RybF9uYW1lLnNldFNlbGVjdGlvbigwLCBjdHJsX25hbWUuZ2V0VGV4dCgpLmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goYm9vbGVhbiBlZGl0YWJsZSkgewotCQljdHJsX25hbWUuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQotCQlpZiAoYnJpZWZEZXNjT24pIHsKLQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKHB1cnBvc2VPbikgewotCQkJY3RybF9wdXJwb3NlLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAoZnVsbERlc2NPbikgewotCQkJY3RybF9mdWxsX2Rlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmIChrZXlDb25zaWRlcmF0aW9uT24pIHsKLQkJCWN0cmxfa2V5LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAoZXh0ZXJuYWxJZE9uKSB7Ci0JCQljdHJsX2V4dGVybmFsX2lkLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAoZWxlbWVudFR5cGVPbikgewotCQkJY3RybF90eXBlX2J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAodmFyaWFiaWxpdHlTZWN0aW9uT24pIHsKLQkJCWN0cmxfdmFyaWFiaWxpdHkuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQljdHJsX2Jhc2VfYnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJaWYgKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl92YXJpYWJpbGl0eS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJLmdldEZpcnN0RWxlbWVudCgpID09IFZhcmlhYmlsaXR5VHlwZS5OQSkgewotCQkJCWN0cmxfYmFzZV9idXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHZlcnNpb25TZWN0aW9uT24pIHsKLQkJCWN0cmxfY2hhbmdlX2RhdGUuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJY3RybF9jaGFuZ2VfZGVzYy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQljdHJsX2F1dGhvcnMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJY3RybF92ZXJzaW9uLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCWNvcHlyaWdodF9idXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQlzZXRDb3B5cmlnaHRCdXR0b25EZXNlbGVjdCgpOwotCQl9Ci0JCWlmIChpY29uU2VjdGlvbk9uKSB7Ci0JCQljdHJsX3NlbGVjdF9zaGFwZUljb25fYnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJY3RybF9jbGVhcl9zaGFwZUljb25fYnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUKLQkJCQkJJiYgY29udGVudEVsZW1lbnQuZ2V0U2hhcGVpY29uKCkgIT0gbnVsbCk7Ci0JCQljdHJsX3NlbGVjdF9ub2RlSWNvbl9idXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQljdHJsX2NsZWFyX25vZGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlCi0JCQkJCSYmIGNvbnRlbnRFbGVtZW50LmdldE5vZGVpY29uKCkgIT0gbnVsbCk7Ci0JCX0KLQkJaWYgKGN0cmxfZXhwYW5kZWQgIT0gbnVsbCkgewotCQkJY3RybF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJCi0JCWlmIChwdWJsaXNoQ2F0ZWdvcnlPbikgewotCQkJY3RybF9wdWJsaXNoX2NhdGVnb3JpZXNfYnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBEZXRhaWwgc2VjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZXRhaWxTZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJZGV0YWlsU2VjdGlvbiA9IGNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuREVUQUlMX1NFQ1RJT05fTkFNRSwKLQkJCQlnZXREZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCWRldGFpbENvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBkZXRhaWxTZWN0aW9uKTsKLQkJY3JlYXRlRGV0YWlsU2VjdGlvbkNvbnRlbnQoKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZGV0YWlsQ29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBEZXRhaWwgc2VjdGlvbiBjb250ZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVEZXRhaWxTZWN0aW9uQ29udGVudCgpIHsKLQkJaWYgKHB1cnBvc2VPbikgewotCQkJY3RybF9wdXJwb3NlID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LlBVUlBPU0VfVEVYVCwgNDAsIDQwMCwKLQkJCQkJREVUQUlMX1NFQ1RJT05fSUQpOwotCQl9Ci0KLQkJaWYgKGZ1bGxEZXNjT24pIHsKLQkJCWN0cmxfZnVsbF9kZXNjID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0Lk1BSU5fREVTQ1JJUFRJT05fVEVYVCwKLQkJCQkJMTAwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsKLQotCQl9Ci0KLQkJaWYgKGtleUNvbnNpZGVyYXRpb25PbikgewotCQkJY3RybF9rZXkgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuS0VZX0NPTlNJREVSQVRJT05TX1RFWFQsCi0JCQkJCTQwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIE5vdGF0aW9uIHNlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTm90YXRpb25TZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJbm90YXRpb25TZWN0aW9uID0gY3JlYXRlU2VjdGlvbih0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5OT1RBVElPTl9TRUNUSU9OX05BTUUsCi0JCQkJZ2V0Tm90YXRpb25TZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCW5vdGF0aW9uQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIG5vdGF0aW9uU2VjdGlvbik7Ci0JCWNyZWF0ZU5vdGF0aW9uU2VjdGlvbkNvbnRlbnQoKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3Iobm90YXRpb25Db21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIE5vdGF0aW9uIHNlY3Rpb24gY29udGVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVOb3RhdGlvblNlY3Rpb25Db250ZW50KCkgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhaWxvcmluZyBzZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhaWxvcmluZ1NlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQl0YWlsb3JpbmdTZWN0aW9uID0gY3JlYXRlU2VjdGlvbih0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5UQUlMT1JJTkdfU0VDVElPTl9OQU1FLAotCQkJCWdldFRhaWxvcmluZ1NlY3Rpb25EZXNjcmlwdGlvbigpKTsKLQkJdGFpbG9yaW5nQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHRhaWxvcmluZ1NlY3Rpb24pOwotCQljcmVhdGVUYWlsb3JpbmdTZWN0aW9uQ29udGVudCgpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcih0YWlsb3JpbmdDb21wb3NpdGUpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFpbG9yaW5nU2VjdGlvbkNvbnRlbnQoKSB7Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycyB0byBtb25pdG9yIGZvY3VzIGFuZCBtb2RpZmljYXRpb24gY2hhbmdlcyBpbiB0aGUgZWRpdAotCSAqIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJZmluYWwgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0KLQkJbW9kZWxNb2RpZnlMaXN0ZW5lciA9IGVkaXRvci5jcmVhdGVNb2RpZnlMaXN0ZW5lcihtZXRob2RFbGVtZW50KTsKLQkJY29udGVudE1vZGlmeUxpc3RlbmVyID0gZWRpdG9yLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKG1ldGhvZFVuaXQpOwotCQlhY3Rpb25NZ3IgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpOwotCi0JCWZvcm0uYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCWlmIChjdHJsX2V4cGFuZGVkICE9IG51bGwpIHsKLQkJCQkJKChHcmlkRGF0YSkgY3RybF9leHBhbmRlZC5nZXRMYXlvdXREYXRhKCkpLmhlaWdodEhpbnQgPSBnZXRSaWNoVGV4dEVkaXRvckhlaWdodCgpOwotCQkJCQkoKEdyaWREYXRhKSBjdHJsX2V4cGFuZGVkLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JXaWR0aCgpOwotCQkJCX0KLQkJCQlmb3JtU2VjdGlvbi5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xNb3ZlZChDb250cm9sRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlmb3JtLmdldFBhcmVudCgpLmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZihkaXNwb3NlZCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCQotCQkJCXJlZnJlc2goIVRuZ1V0aWwuaXNMb2NrZWQobWV0aG9kRWxlbWVudCkpOwotCQkJCXNldEZvcm1UZXh0V2l0aFZhcmlhYmxlSW5mbygpOwotCQkJCQotCQkJCS8vIGRvIHJlZnJlc2ggdmFyaWFiaWxpdHkgYW5kIGNvcHlyaWdodCB2aWV3ZXIKLQkJCQlpZih2YXJpYWJpbGl0eVNlY3Rpb25PbikKLQkJCQkJYmFzZV92aWV3ZXIucmVmcmVzaCgpOwotCQkJCWlmKHZlcnNpb25TZWN0aW9uT24pCi0JCQkJCWNvcHlyaWdodF92aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQotCQlpZiAoZ2VuZXJhbFNlY3Rpb25PbikgewotCQkJYWRkR2VuZXJhbFNlY3Rpb25MaXN0ZW5lcnMoKTsKLQkJfQotCi0JCWlmIChkZXRhaWxTZWN0aW9uT24pIHsKLQkJCWFkZERldGFpbFNlY3Rpb25MaXN0ZW5lcnMoKTsKLQkJfQotCi0JCWlmICh2ZXJzaW9uU2VjdGlvbk9uKSB7Ci0JCQlhZGRWZXJzaW9uU2VjdGlvbkxpc3RlbmVycygpOwotCQl9Ci0KLQkJaWYgKGljb25TZWN0aW9uT24pIHsKLQkJCWFkZEljb25TZWN0aW9uTGlzdGVuZXJzKCk7Ci0JCX0KLQotCQlpZiAodmFyaWFiaWxpdHlTZWN0aW9uT24pIHsKLQkJCXZpZXdlcl92YXJpYWJpbGl0eQotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl92YXJpYWJpbGl0eQotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQotCQkJCQkJCWlmIChjb250ZW50RWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJCQlib29sZWFuIHN0YXR1cyA9IGVkaXRvcgotCQkJCQkJCQkJCS5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCQltZXRob2RFbGVtZW50LAotCQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKSwKLQkJCQkJCQkJCQkJCShWYXJpYWJpbGl0eVR5cGUpIHNlbGVjdGlvbgotCQkJCQkJCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCksIC0xKTsKLQkJCQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpID09IFZhcmlhYmlsaXR5VHlwZS5OQSkgewotCQkJCQkJCQlpZiAoY29udGVudEVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gZWRpdG9yCi0JCQkJCQkJCQkJCS5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQkJCQltZXRob2RFbGVtZW50LAotCQkJCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwKLQkJCQkJCQkJCQkJCQludWxsLCAtMSk7Ci0JCQkJCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQljdHJsX2Jhc2VfYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJCQliYXNlX3ZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJTGlzdCBzZWxlY3Rpb25CYXNlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBjb250ZW50RWxlbWVudAotCQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCQkJCXNlbGVjdGlvbkJhc2VMaXN0LmFkZChiYXNlKTsKLQkJCQkJCQkJY3RybF9iYXNlX2J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCQliYXNlX3ZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCQkJfQotCQkJCQkJCXNldEZvcm1UZXh0V2l0aFZhcmlhYmxlSW5mbygpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkKLQkJCWN0cmxfYmFzZV9idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlmaWx0ZXIgPSBnZXRGaWx0ZXIoKTsKLQkJCQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBnZXRtZXRob2RFbGVtZW50KCksCi0JCQkJCQkJCUxpYnJhcnlVSVRleHQuZ2V0VUlUZXh0KG1ldGhvZEVsZW1lbnQsIHRydWUpKTsKLQkJCQkJCWZkLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZSh0cnVlKTsKLQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJZmQuc2V0VGl0bGUoTGlicmFyeVVJVGV4dC5nZXRVSVRleHQobWV0aG9kRWxlbWVudCwgdHJ1ZSkpOwotCQkJCQkJZmQub3BlbigpOwotCQkJCQkJZmQuZ2V0U2VsZWN0ZWRJdGVtcygpOwotCQkJCQkJaWYgKGZkLmdldFNlbGVjdGVkSXRlbXMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJSVN0YXR1cyBpc3RhdHVzID0gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3lBZnRlckZpbHRlclNlbGVjdGlvbigKLQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LCAoVmFyaWFiaWxpdHlFbGVtZW50KSBmZC5nZXRTZWxlY3RlZEl0ZW1zKCkuZ2V0KDApKTsKLQkJCQkJCQlpZighaXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsIGlzdGF0dXMuZ2V0TWVzc2FnZSgpKTsJCQkJCQkKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCQlib29sZWFuIHN0YXR1cyA9IGVkaXRvcgotCQkJCQkJCQkJLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCW1ldGhvZEVsZW1lbnQsCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksCi0JCQkJCQkJCQkJCShWYXJpYWJpbGl0eUVsZW1lbnQpIGZkCi0JCQkJCQkJCQkJCQkJLmdldFNlbGVjdGVkSXRlbXMoKS5nZXQoMCksIC0xKTsKLQkJCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJCXN0YXR1cyA9IGVkaXRvcgotCQkJCQkJCQkJLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCW1ldGhvZEVsZW1lbnQsCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKSwKLQkJCQkJCQkJCQkJKFZhcmlhYmlsaXR5VHlwZSkgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3ZhcmlhYmlsaXR5Ci0JCQkJCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpKQotCQkJCQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSwgLTEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXNldEZvcm1UZXh0V2l0aFZhcmlhYmxlSW5mbygpOwotCQkJCQlpZiAoKGN0cmxfYmFzZSAhPSBudWxsKSAmJiAoIShjdHJsX2Jhc2UuaXNEaXNwb3NlZCgpKSkpCi0JCQkJCQljdHJsX2Jhc2UucmVkcmF3KCk7Ci0JCQkJCWlmICgoYmFzZV92aWV3ZXIgIT0gbnVsbCkKLQkJCQkJCQkmJiAoIShiYXNlX3ZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSkpCi0JCQkJCQliYXNlX3ZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkR2VuZXJhbFNlY3Rpb25MaXN0ZW5lcnMoKSB7Ci0JCWN0cmxfbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9uYW1lLmFkZEZvY3VzTGlzdGVuZXIobmFtZUZvY3VzTGlzdGVuZXIpOwotCi0JCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gbWV0aG9kRWxlbWVudC5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkKLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IFN0clV0aWwuZ2V0UGxhaW5UZXh0KGN0cmxfcHJlc2VudGF0aW9uX25hbWUKLQkJCQkJCS5nZXRUZXh0KCkpOwkJCQkKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJbWV0aG9kRWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLnNldFRleHQobmV3Q29udGVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbiB3aGVuIHRoZSBmb2N1cyBvZiB0aGUgY29tcG9uZW50IGlzIGxvc3QgCi0JCQkJaWYoY3RybF9wcmVzZW50YXRpb25fbmFtZS5nZXRTZWxlY3Rpb25Db3VudCgpID4gMCl7Ci0JCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuY2xlYXJTZWxlY3Rpb24oKTsKLQkJCQl9ICAgIAotCQkJfQotCQkJCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyI2ZvY3VzR2FpbmVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJCQkvLyB3aGVuIHVzZXIgdGFiIHRvIHRoaXMgZmllbGQsIHNlbGVjdCBhbGwgdGV4dAotCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuc2VsZWN0QWxsKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWlmIChicmllZkRlc2NPbikgewotCQkJY3RybF9icmllZl9kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQkJY3RybF9icmllZl9kZXNjLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCkpOwotCQkJCX0KLQotCQkJCS8qIChub24tSmF2YWRvYykKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyI2ZvY3VzTG9zdChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQpCi0JCQkJICovCi0JCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IG1ldGhvZEVsZW1lbnQuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGN0cmxfYnJpZWZfZGVzYy5nZXRUZXh0KCk7Ci0JCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1nci5kb0FjdGlvbigKLQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULCBtZXRob2RFbGVtZW50LAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSwKLQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJaWYgKGVsZW1lbnRUeXBlT24pIHsKLQkJCWlmIChtZXRob2RFbGVtZW50IGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQljdHJsX3R5cGVfYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWZpbmFsIE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCQkJCQkJaWYgKGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ190aXRsZTsgCi0JCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMTsgCi0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheVdhcm5pbmcodGl0bGUsIG1lc3NhZ2UpOwotCQkJCQkJfSBlbHNlIGlmIChtZXRob2RFbGVtZW50IGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQkJCQlNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uIGRlbGV0ZUFjdGlvbiA9IG5ldyBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uKCk7Ci0JCQkJCQkJZGVsZXRlQWN0aW9uLnNldEVkaXRpbmdEb21haW4oTGlicmFyeVZpZXcuZ2V0VmlldygpCi0JCQkJCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpKTsKLQkJCQkJCQlkZWxldGVBY3Rpb24KLQkJCQkJCQkJCS5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJCQkJCQltZXRob2RFbGVtZW50KSk7Ci0JCQkJCQkJQ29tbWFuZCBjbWQgPSBkZWxldGVBY3Rpb24KLQkJCQkJCQkJCS5jcmVhdGVDb21tYW5kKENvbGxlY3Rpb25zCi0JCQkJCQkJCQkJCS5zaW5nbGV0b24obWV0aG9kRWxlbWVudCkpOwotCQkJCQkJCWlmIChjbWQgaW5zdGFuY2VvZiBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCkgewotCQkJCQkJCQlHdWlkYW5jZSBuZXdHdWlkYW5jZTsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCW5ld0d1aWRhbmNlID0gQ29udmVydEd1aWRhbmNlVHlwZQotCQkJCQkJCQkJCS5jb252ZXJ0R3VpZGFuY2UoCi0JCQkJCQkJCQkJCQkoR3VpZGFuY2UpIG1ldGhvZEVsZW1lbnQsCi0JCQkJCQkJCQkJCQludWxsLAotCQkJCQkJCQkJCQkJKERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKSBjbWQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQkJdHJ5IHsgY21kLmRpc3Bvc2UoKTsgfSBjYXRjaChFeGNlcHRpb24gZSkge30KLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAobmV3R3VpZGFuY2UgIT0gbnVsbCkgewotCQkJCQkJCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLmNsb3NlRWRpdG9yKAotCQkJCQkJCQkJCQltZXRob2RFbGVtZW50KTsKLQkJCQkJCQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRWRpdG9yKAotCQkJCQkJCQkJCQluZXdHdWlkYW5jZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgaWYgKGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ190aXRsZTsgCi0JCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMjsgCi0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheVdhcm5pbmcodGl0bGUsIG1lc3NhZ2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChwdWJsaXNoQ2F0ZWdvcnlPbikJewotCQkJY3RybF9wdWJsaXNoX2NhdGVnb3JpZXNfYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewkJCQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsJCQkJCi0JCQkJCVN0cmluZyB2YWwgPSBuZXcgQm9vbGVhbihjdHJsX3B1Ymxpc2hfY2F0ZWdvcmllc19idXR0b24uZ2V0U2VsZWN0aW9uKCkpLnRvU3RyaW5nKCk7CQkJCQotCQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IFRuZ1V0aWwuZ2V0UHVibGlzaENhdGVnb3J5UHJvcGVydHkobWV0aG9kRWxlbWVudCk7Ci0JCQkJCQkJCQkJCi0JCQkJCWlmIChwcm9wID09IG51bGwpIHsJCQkKLQkJCQkJCXByb3AgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJCQkJCXByb3Auc2V0TmFtZShUbmdVdGlsLlBVQkxJU0hfQ0FURUdPUllfUFJPUEVSVFkpOwotCQkJCQkJcHJvcC5zZXRWYWx1ZSh2YWwpOwotCQkJCQkJCQkKLQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCW1ldGhvZEVsZW1lbnQsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfTWV0aG9kRWxlbWVudFByb3BlcnR5KCksCi0JCQkJCQkJCXByb3AsIC0xKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJcHJvcCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eV9WYWx1ZSgpLAotCQkJCQkJCXZhbCwgLTEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVZhbGlkYXRvciBnZXROYW1lVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRGV0YWlsU2VjdGlvbkxpc3RlbmVycygpIHsKLQkJaWYgKGZ1bGxEZXNjT24pIHsKLQkJCWN0cmxfZnVsbF9kZXNjLnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCWN0cmxfZnVsbF9kZXNjLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpKTsKLQkJCWN0cmxfZnVsbF9kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQljdHJsX2Z1bGxfZGVzYy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQk6IGN0cmxfZnVsbF9kZXNjOwotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIkRlc2NyaXB0aW9uRm9ybVBhZ2UuY3RybF9mdWxsX2Rlc2MuZGVhY3RpdmF0ZUxpc3RlbmVyOiBjb250cm9sPSIgKyBjb250cm9sKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2Z1bGxfZGVzYy5kZWFjdGl2YXRlTGlzdGVuZXI6IGNvbnRlbnQgbm90IG1vZGlmaWVkLCBleGl0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpCi0JCQkJCQkJLmdldE1haW5EZXNjcmlwdGlvbigpOwotCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIkRlc2NyaXB0aW9uRm9ybVBhZ2UuY3RybF9mdWxsX2Rlc2MuZGVhY3RpdmF0ZUxpc3RlbmVyOiByZXN0b3JlZCBvbGQgY29udGVudCwgZXhpdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIkRlc2NyaXB0aW9uRm9ybVBhZ2UuY3RybF9mdWxsX2Rlc2MuZGVhY3RpdmF0ZUxpc3RlbmVyOiBzYXZpbmcgbW9kaWZpZWQgY29udGVudCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSwKLQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2Z1bGxfZGVzYy5kZWFjdGl2YXRlTGlzdGVuZXI6IHNhdmVkIHN0YXR1cz0iICsgc3VjY2Vzcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2Z1bGxfZGVzYy5kZWFjdGl2YXRlTGlzdGVuZXI6IGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQlpZiAoa2V5Q29uc2lkZXJhdGlvbk9uKSB7Ci0JCQljdHJsX2tleS5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQljdHJsX2tleS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpKTsKLQkJCWN0cmxfa2V5LmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQljdHJsX2tleS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQk6IGN0cmxfa2V5OwotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIkRlc2NyaXB0aW9uRm9ybVBhZ2UuY3RybF9rZXkuZGVhY3RpdmF0ZUxpc3RlbmVyOiBjb250cm9sPSIgKyBjb250cm9sKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2tleS5kZWFjdGl2YXRlTGlzdGVuZXI6IGNvbnRlbnQgbm90IG1vZGlmaWVkLCBleGl0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpCi0JCQkJCQkJLmdldEtleUNvbnNpZGVyYXRpb25zKCk7Ci0JCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2tleS5kZWFjdGl2YXRlTGlzdGVuZXI6IHJlc3RvcmVkIG9sZCBjb250ZW50LCBleGl0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpLAotCQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJEZXNjcmlwdGlvbkZvcm1QYWdlLmN0cmxfa2V5LmRlYWN0aXZhdGVMaXN0ZW5lcjogc2F2ZWQgc3RhdHVzPSIgKyBzdWNjZXNzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJEZXNjcmlwdGlvbkZvcm1QYWdlLmN0cmxfa2V5LmRlYWN0aXZhdGVMaXN0ZW5lcjogZXhpdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBjb250cm9scyB3aXRoIGRhdGEgZnJvbSB0aGUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERhdGEoKSB7Ci0JCWlmIChnZW5lcmFsU2VjdGlvbk9uKSB7Ci0JCQlsb2FkR2VuZXJhbFNlY3Rpb25EYXRhKCk7Ci0JCX0KLQkJaWYgKGRldGFpbFNlY3Rpb25PbikgewotCQkJbG9hZERldGFpbFNlY3Rpb25EYXRhKCk7Ci0JCX0KLQkJaWYgKG5vdGF0aW9uU2VjdGlvbk9uKSB7Ci0JCQlsb2FkTm90YXRpb25TZWN0aW9uRGF0YSgpOwotCQl9Ci0JCWlmICh0YWlsb3JpbmdTZWN0aW9uT24pIHsKLQkJCWxvYWRUYWlsb3JpbmdTZWN0aW9uRGF0YSgpOwotCQl9Ci0JCWlmICh2ZXJzaW9uU2VjdGlvbk9uKSB7Ci0JCQlsb2FkVmVyc2lvblNlY3Rpb25EYXRhKCk7Ci0JCX0KLQkJaWYgKGljb25TZWN0aW9uT24pIHsKLQkJCWxvYWRJY29uU2VjdGlvbkRhdGEoKTsKLQkJfQotCQlpZiAodmFyaWFiaWxpdHlTZWN0aW9uT24pIHsKLQkJCXZhcmlhYmlsaXR5U2VjdGlvbkRhdGEoKTsKLQkJfQotCQlmb3JtLmdldEJvZHkoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRHZW5lcmFsU2VjdGlvbkRhdGEoKSB7Ci0JCVN0cmluZyBuYW1lID0gbWV0aG9kRWxlbWVudC5nZXROYW1lKCk7Ci0JCVN0cmluZyBwcmVzZW50YXRpb25OYW1lID0gKG1ldGhvZEVsZW1lbnQpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJY3RybF9uYW1lLnNldFRleHQobmFtZSA9PSBudWxsID8gIiIgOiBuYW1lKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lCi0JCQkJLnNldFRleHQocHJlc2VudGF0aW9uTmFtZSA9PSBudWxsID8gIiIgOiBwcmVzZW50YXRpb25OYW1lKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChlbGVtZW50VHlwZU9uKSB7Ci0JCQkvLyBTdHJpbmcgdHlwZSA9IG1ldGhvZEVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKTsKLQkJCVN0cmluZyB0eXBlID0gTGlicmFyeVVJVGV4dC5nZXRVSVRleHQobWV0aG9kRWxlbWVudCk7Ci0JCQljdHJsX3R5cGVfbGFiZWwuc2V0VGV4dCh0eXBlID09IG51bGwgPyAiIiA6IHR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGJyaWVmRGVzY09uKSB7Ci0JCQlTdHJpbmcgYnJpZWZfZGVzYyA9IG1ldGhvZEVsZW1lbnQuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoYnJpZWZfZGVzYyA9PSBudWxsID8gIiIgOiBicmllZl9kZXNjKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlpZiAocHVibGlzaENhdGVnb3J5T24pIHsKLQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gVG5nVXRpbC5nZXRQdWJsaXNoQ2F0ZWdvcnlQcm9wZXJ0eShtZXRob2RFbGVtZW50KTsKLQkJCWlmIChwcm9wICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdmFsID0gcHJvcC5nZXRWYWx1ZSgpOwotCQkJCWN0cmxfcHVibGlzaF9jYXRlZ29yaWVzX2J1dHRvbi5zZXRTZWxlY3Rpb24oKG5ldyBCb29sZWFuKHZhbCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkRGV0YWlsU2VjdGlvbkRhdGEoKSB7Ci0JCWlmIChmdWxsRGVzY09uKSB7Ci0JCQlTdHJpbmcgZnVsbF9kZXNjID0gKGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKQotCQkJCQkuZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQljdHJsX2Z1bGxfZGVzYy5zZXRUZXh0KGZ1bGxfZGVzYyA9PSBudWxsID8gIiIgOiBmdWxsX2Rlc2MpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGtleUNvbnNpZGVyYXRpb25PbikgewotCQkJU3RyaW5nIGtleUNvbnNpZGVyYXRpb25zID0gKGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKQotCQkJCQkuZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKTsKLQkJCWN0cmxfa2V5Ci0JCQkJCS5zZXRUZXh0KGtleUNvbnNpZGVyYXRpb25zID09IG51bGwgPyAiIiA6IGtleUNvbnNpZGVyYXRpb25zKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRUYWlsb3JpbmdTZWN0aW9uRGF0YSgpIHsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZE5vdGF0aW9uU2VjdGlvbkRhdGEoKSB7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhcmlhYmlsaXR5U2VjdGlvbkRhdGEoKSB7Ci0JCVZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSBjb250ZW50RWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJTGlzdCBzZWxlY3Rpb25WYXJpYWJpbGl0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXNlbGVjdGlvblZhcmlhYmlsaXR5TGlzdC5hZGQodmFyaWFiaWxpdHlUeXBlKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gbmV3VmFyaWFiaWxpdHlTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQlzZWxlY3Rpb25WYXJpYWJpbGl0eUxpc3QpOwotCQl2aWV3ZXJfdmFyaWFiaWxpdHkuc2V0U2VsZWN0aW9uKG5ld1ZhcmlhYmlsaXR5U2VsZWN0aW9uLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBUb2dnbGUgRGVzY3JpcHRpb24gY29udHJvbCB0byBleHBhbmQgYW5kIGNvbnRyb2wgc3RhdGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdG9nZ2xlKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJaWYgKGN0cmxfZXhwYW5kZWQgPT0gbnVsbCkgewotCQkJY3RybF9leHBhbmRlZCA9IGNyZWF0ZVJpY2hUZXh0RWRpdG9yKHRvb2xraXQsIGV4cGFuZGVkQ29tcG9zaXRlLAotCQkJCQlTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCQlnZXRSaWNoVGV4dEVkaXRvckhlaWdodCgpLCBnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCksIDIsCi0JCQkJCWV4cGFuZExhYmVsKTsKLQkJCWN0cmxfZXhwYW5kZWQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJfQotCi0JCWlmIChkZXNjRXhwYW5kRmxhZykgewotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlzZWN0aW9uQ29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRDbGllbnQoc2VjdGlvbkNvbXBvc2l0ZSk7Ci0JCQllbmFibGVTZWN0aW9ucyh0cnVlKTsKLQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IGdldEFjdGl2ZVJpY2hUZXh0Q29udHJvbCgpOwotCQkJcmljaFRleHQuc2V0VGV4dChjdHJsX2V4cGFuZGVkLmdldFRleHQoKSk7Ci0JCQlyaWNoVGV4dC5zZXRGaW5kUmVwbGFjZUFjdGlvbihjdHJsX2V4cGFuZGVkLmdldEZpbmRSZXBsYWNlQWN0aW9uKCkpOwotCQkJZm9yIChJdGVyYXRvciBpID0gcmljaFRleHQuZ2V0TGlzdGVuZXJzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoUmljaFRleHRMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJY3RybF9leHBhbmRlZC5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSwgbGlzdGVuZXIKLQkJCQkJCS5nZXRMaXN0ZW5lcigpKTsKLQkJCX0KLQkJCWlmIChjdHJsX2V4cGFuZGVkLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCQkJLnNhdmVNb2RpZmllZFJpY2hUZXh0KGN0cmxfZXhwYW5kZWQpOwotCQkJfQotCQkJcmljaFRleHQuc2V0Rm9jdXMoKTsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dClpbnB1dCkuc2V0TW9kYWxPYmplY3QobnVsbCk7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpaW5wdXQpLnNldE1vZGFsT2JqZWN0RmVhdHVyZShudWxsKTsKLQkJCX0KLQotCQl9IGVsc2UgewotCQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRDbGllbnQoZXhwYW5kZWRDb21wb3NpdGUpOwotCQkJZW5hYmxlU2VjdGlvbnMoZmFsc2UpOwotCQkJZXhwYW5kTGFiZWwuc2V0VGV4dCgoU3RyaW5nKSAoKEltYWdlSHlwZXJsaW5rKSBlLmdldFNvdXJjZSgpKQotCQkJCQkuZ2V0RGF0YSgiVGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IChJTWV0aG9kUmljaFRleHQpIGUuZ2V0SHJlZigpOwotCQkJY3RybF9leHBhbmRlZC5zZXRJbml0aWFsVGV4dChyaWNoVGV4dC5nZXRUZXh0KCkpOwotCQkJY3RybF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChyaWNoVGV4dC5nZXRNb2RhbE9iamVjdCgpKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKHJpY2hUZXh0Ci0JCQkJCS5nZXRNb2RhbE9iamVjdEZlYXR1cmUoKSk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEZpbmRSZXBsYWNlQWN0aW9uKHJpY2hUZXh0LmdldEZpbmRSZXBsYWNlQWN0aW9uKCkpOwotCQkJZm9yIChJdGVyYXRvciBpID0gcmljaFRleHQuZ2V0TGlzdGVuZXJzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoUmljaFRleHRMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJY3RybF9leHBhbmRlZC5hZGRMaXN0ZW5lcihsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSwgbGlzdGVuZXIKLQkJCQkJCS5nZXRMaXN0ZW5lcigpKTsKLQkJCX0KLQkJCWJvb2xlYW4gZWRpdGFibGUgPSAhVG5nVXRpbC5pc0xvY2tlZChtZXRob2RFbGVtZW50KTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJaWYgKGVkaXRhYmxlKSB7Ci0JCQkJY3RybF9leHBhbmRlZC5zZXRGb2N1cygpOwotCQkJfQotCQkJc2V0QWN0aXZlUmljaFRleHRDb250cm9sKHJpY2hUZXh0KTsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dClpbnB1dCkuc2V0TW9kYWxPYmplY3QocmljaFRleHQuZ2V0TW9kYWxPYmplY3QoKSk7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpaW5wdXQpLnNldE1vZGFsT2JqZWN0RmVhdHVyZShyaWNoVGV4dC5nZXRNb2RhbE9iamVjdEZlYXR1cmUoKSk7Ci0JCQl9Ci0JCX0KLQkJZm9ybS5nZXRCb2R5KCkubGF5b3V0KHRydWUsIHRydWUpOwotCQlkZXNjRXhwYW5kRmxhZyA9ICFkZXNjRXhwYW5kRmxhZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGFjdGl2ZSByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0QWN0aXZlUmljaFRleHRDb250cm9sKElNZXRob2RSaWNoVGV4dCBjdHJsKSB7Ci0JCWFjdGl2ZUNvbnRyb2wgPSBjdHJsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFjdGl2ZSByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBnZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woKSB7Ci0JCXJldHVybiBhY3RpdmVDb250cm9sOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJyaWVmRGVzY09uKGJvb2xlYW4gYnJpZWZEZXNjT24pIHsKLQkJdGhpcy5icmllZkRlc2NPbiA9IGJyaWVmRGVzY09uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZ1bGxEZXNjT24oYm9vbGVhbiBmdWxsRGVzY09uKSB7Ci0JCXRoaXMuZnVsbERlc2NPbiA9IGZ1bGxEZXNjT247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0S2V5Q29uc2lkZXJhdGlvbk9uKGJvb2xlYW4ga2V5Q29uc2lkZXJhdGlvbk9uKSB7Ci0JCXRoaXMua2V5Q29uc2lkZXJhdGlvbk9uID0ga2V5Q29uc2lkZXJhdGlvbk9uOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50VHlwZU9uCi0JICogICAgICAgICAgICBUaGUgZWxlbWVudFR5cGVPbiB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudFR5cGVPbihib29sZWFuIGVsZW1lbnRUeXBlT24pIHsKLQkJdGhpcy5lbGVtZW50VHlwZU9uID0gZWxlbWVudFR5cGVPbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGFueUF0dHJpYnV0ZU1vZGlmaWVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQW55QXR0cmlidXRlTW9kaWZpZWQoKSB7Ci0JCXJldHVybiBhbnlBdHRyaWJ1dGVNb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhpcyBpZiBhbnkgYXR0cmlidXRlIGlzIG1vZGlmaWVkLiBUaGlzIGlzIHJlcXVpcmVkIGZvciB0aGUgY2hhbmdlCi0JICogZGF0ZSBmaWVsZCBpbiB2ZXJzaW9uIHNlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGFueUF0dHJpYnV0ZU1vZGlmaWVkCi0JICogICAgICAgICAgICBUaGUgYW55QXR0cmlidXRlTW9kaWZpZWQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFueUF0dHJpYnV0ZU1vZGlmaWVkKGJvb2xlYW4gYW55QXR0cmlidXRlTW9kaWZpZWQpIHsKLQkJdGhpcy5hbnlBdHRyaWJ1dGVNb2RpZmllZCA9IGFueUF0dHJpYnV0ZU1vZGlmaWVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmVyc2lvblNlY3Rpb25Pbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb25TZWN0aW9uT24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uU2VjdGlvbk9uOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2ZXJzaW9uU2VjdGlvbk9uCi0JICogICAgICAgICAgICBUaGUgdmVyc2lvblNlY3Rpb25PbiB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvblNlY3Rpb25Pbihib29sZWFuIHZlcnNpb25TZWN0aW9uT24pIHsKLQkJdGhpcy52ZXJzaW9uU2VjdGlvbk9uID0gdmVyc2lvblNlY3Rpb25PbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBWZXJzaW9uIEluZm9ybWF0aW9uIHNlY3Rpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVZlcnNpb25TZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJdmVyc2lvblNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQlTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRAotCQkJCQkJfCBTZWN0aW9uLlRJVExFX0JBUik7Ci0JCUdyaWREYXRhIHRkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXZlcnNpb25TZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQl2ZXJzaW9uU2VjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5WRVJTSU9OX0lORk9fU0VDVElPTl9OQU1FKTsKLQkJdmVyc2lvblNlY3Rpb24uc2V0RGVzY3JpcHRpb24oZ2V0VmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbigpKTsKLQkJdmVyc2lvblNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCXZlcnNpb25Db21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZSh2ZXJzaW9uU2VjdGlvbik7Ci0JCXZlcnNpb25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXZlcnNpb25Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDUsIGZhbHNlKSk7Ci0JCXZlcnNpb25TZWN0aW9uLnNldENsaWVudCh2ZXJzaW9uQ29tcG9zaXRlKTsKLQl9Ci0JCi0JCi0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIFZlcnNpb24gc2VjdGlvbiBjb250ZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVZlcnNpb25TZWN0aW9uQ29udGVudCgpIHsKLQkJU3RyaW5nIGZpbGxUZXh0ID0gKG1ldGhvZFVuaXQuZ2V0VmVyc2lvbigpID09IG51bGwgPyAiIiA6IG1ldGhvZFVuaXQuZ2V0VmVyc2lvbigpKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3ZlcnNpb24gPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDQodG9vbGtpdCwgdmVyc2lvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuVkVSU0lPTl9URVhULCBTV1QuREVGQVVMVCwgU1dULlNJTkdMRSwgZmlsbFRleHQpOwotCi0JCWZpbGxUZXh0ID0gbWV0aG9kVW5pdC5nZXRDaGFuZ2VEYXRlKCkgPT0gbnVsbCA/ICIiIC8vJE5PTi1OTFMtMSQKLQkJCQk6IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKERhdGVGb3JtYXQuRlVMTCkuZm9ybWF0KAotCQkJCQkJbWV0aG9kVW5pdC5nZXRDaGFuZ2VEYXRlKCkpOwotCQljdHJsX2NoYW5nZV9kYXRlID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWw0KHRvb2xraXQsIHZlcnNpb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkNIQU5HRV9EQVRFX1RFWFQsIFNXVC5ERUZBVUxULCBTV1QuU0lOR0xFLCBmaWxsVGV4dCk7Ci0JCWN0cmxfY2hhbmdlX2RhdGUuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0JCWN0cmxfY2hhbmdlX2Rlc2MgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDUodG9vbGtpdCwgdmVyc2lvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQ0hBTkdFX0RFU0NSSVBUSU9OX1RFWFQsIDQwLCBTV1QuTVVMVEkpOwotCi0JCWN0cmxfYXV0aG9ycyA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsNSh0b29sa2l0LCB2ZXJzaW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5BVVRIT1JTX1RFWFQsIDQwLCBTV1QuTVVMVEkpOwotCi0JCWxhYmVsX2NvcHlyaWdodCA9IGNyZWF0ZUxhYmVsKHRvb2xraXQsIHZlcnNpb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkNPUFlSSUdIVF9URVhULCAyKTsKLQkJY3RybF9jb3B5cmlnaHQgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCB2ZXJzaW9uQ29tcG9zaXRlLCBTV1QuU0lOR0xFCi0JCQkJfCBTV1QuUkVBRF9PTkxZLCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5CRUdJTk5JTkcgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMLAotCQkJCTUsIDQwMCwgMSwgMik7Ci0KLQkJY29weXJpZ2h0X3ZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX2NvcHlyaWdodCk7Ci0JCWluaXRDb250ZW50UHJvdmlkZXJDb3B5cmlnaHQoKTsKLQkJY29weXJpZ2h0X3ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGNvcHlyaWdodExhYmVsUHJvdmlkZXJCYXNlKTsKLQkJY29weXJpZ2h0X3ZpZXdlci5zZXRJbnB1dChtZXRob2RFbGVtZW50KTsKLQkJQ29tcG9zaXRlIGJ1dHRvbnBhbmUgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgdmVyc2lvbkNvbXBvc2l0ZSwKLQkJCQlHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCwgMSwgMSwgMSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJCWJ1dHRvbnBhbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY29weXJpZ2h0X2J1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvbnBhbmUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlNFTEVDVF9CVVRUT05fVEVYVCwgU1dULlNJTVBMRSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IEJVVFRPTl9XSURUSDsKLQkJCWNvcHlyaWdodF9idXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY29weXJpZ2h0X2J1dHRvbl9kZXNlbGVjdCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvbnBhbmUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRFU0VMRUNUX0JVVFRPTl9URVhULCBTV1QuU0lNUExFKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gQlVUVE9OX1dJRFRIOwotCQkJY29weXJpZ2h0X2J1dHRvbl9kZXNlbGVjdC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCXNldENvcHlyaWdodEJ1dHRvbkRlc2VsZWN0KCk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBleHBhbmRlZCBjb21wb3NpdGUuCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHZlcnNpb25Db21wb3NpdGUpOwotCQkvL3Rvb2xraXQucGFpbnRCb3JkZXJzRm9yKGJ1dHRvbnBhbmUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyQ29weXJpZ2h0KCkgewotCQljb3B5cmlnaHRDb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKG1ldGhvZFVuaXQuZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQlsaXN0LmFkZChtZXRob2RVbml0Ci0JCQkJCQkJLmdldENvcHlyaWdodFN0YXRlbWVudCgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGxpc3QudG9BcnJheSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCX0KLQkJfTsKLQkJY29weXJpZ2h0X3ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29weXJpZ2h0Q29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWZXJzaW9uU2VjdGlvbkxpc3RlbmVycygpIHsKLQkJY3RybF92ZXJzaW9uLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfdmVyc2lvbi5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfVmVyc2lvbigpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gbWV0aG9kVW5pdAotCQkJCQkJLmdldFZlcnNpb24oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gU3RyVXRpbAotCQkJCQkJLmdldFBsYWluVGV4dChjdHJsX3ZlcnNpb24uZ2V0VGV4dCgpKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQltZXRob2RVbml0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfVmVyc2lvbigpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN0YXR1cykgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2F1dGhvcnMuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9hdXRob3JzLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBtZXRob2RVbml0Ci0JCQkJCQkuZ2V0QXV0aG9ycygpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJZS53aWRnZXQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBTdHJVdGlsCi0JCQkJCQkuZ2V0UGxhaW5UZXh0KGN0cmxfYXV0aG9ycy5nZXRUZXh0KCkpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCW1ldGhvZFVuaXQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3RhdHVzKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWNvcHlyaWdodF9idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgQ29udGVudEZpbHRlcigpIHsKLQkJCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlMaXN0IGFscmVhZHlFeHN0aW5nID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWlmIChjdHJsX2NvcHlyaWdodC5nZXRJdGVtQ291bnQoKSA+IDApIHsKLQkJCQkJVGFibGVJdGVtIGl0ZW0gPSBjdHJsX2NvcHlyaWdodC5nZXRJdGVtcygpWzBdOwotCQkJCQlpZiAoaXRlbS5nZXREYXRhKCkgIT0gbnVsbCkKLQkJCQkJCWFscmVhZHlFeHN0aW5nLmFkZChpdGVtLmdldERhdGEoKSk7Ci0JCQkJfQotCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQkJZmlsdGVyLCBtZXRob2RFbGVtZW50LAotCQkJCQkJRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTLCBhbHJlYWR5RXhzdGluZyk7Ci0JCQkJZmQuc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKHRydWUpOwotCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUyk7Ci0JCQkJZmQub3BlbigpOwotCQkJCWZkLmdldFNlbGVjdGVkSXRlbXMoKTsKLQkJCQlpZiAoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpLnNpemUoKSA+IDApIHsKLQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCW1ldGhvZFVuaXQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpLAotCQkJCQkJCShTdXBwb3J0aW5nTWF0ZXJpYWwpIGZkLmdldFNlbGVjdGVkSXRlbXMoKS5nZXQoMCksCi0JCQkJCQkJLTEpOwotCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNvcHlyaWdodF92aWV3ZXIucmVmcmVzaCgpOwotCQkJCXNldENvcHlyaWdodEJ1dHRvbkRlc2VsZWN0KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfY2hhbmdlX2Rlc2MuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9jaGFuZ2VfZGVzYy5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IG1ldGhvZFVuaXQKLQkJCQkJCS5nZXRDaGFuZ2VEZXNjcmlwdGlvbigpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJZS53aWRnZXQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjdHJsX2NoYW5nZV9kZXNjLmdldFRleHQoKTsKLQkJCQluZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKFN0clV0aWwuTElORV9GRUVELCBBdXRob3JpbmdVSVJlc291cmNlcy5DaGFuZ2VIaXN0b3J5RGlhbG9nX2RlbGltaXRlcik7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULCBtZXRob2RVbml0LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCksIG5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY29weXJpZ2h0X2J1dHRvbl9kZXNlbGVjdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQltZXRob2RVbml0LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHRTdGF0ZW1lbnQoKSwgbnVsbCwgLTEpOwotCQkJCWlmIChzdGF0dXMpIHsKLQkJCQkJY29weXJpZ2h0X3ZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCXNldENvcHlyaWdodEJ1dHRvbkRlc2VsZWN0KCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKgotCSAqIHVwZGF0ZSB0aGUgY2hhbmdlIGRhdGUgaWYgYW55IGF0dHJpYnV0ZSBpcyBtb2RpZmllZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDaGFuZ2VEYXRlKCkgewotCi0JCURhdGUgY2hhbmdlRGF0ZSA9IG1ldGhvZFVuaXQuZ2V0Q2hhbmdlRGF0ZSgpOwotCQlEYXRlRm9ybWF0IGRmID0gRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoRGF0ZUZvcm1hdC5GVUxMKTsKLQotCQlTdHJpbmcgb2xkQ29udGVudCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChjaGFuZ2VEYXRlICE9IG51bGwpIHsKLQkJCW9sZENvbnRlbnQgPSBkZi5mb3JtYXQoY2hhbmdlRGF0ZSk7Ci0JCX0KLQotCQlEYXRlIGN1cnJlbnREYXRlID0gbmV3IERhdGUoKTsKLQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBkZi5mb3JtYXQoY3VycmVudERhdGUpOwotCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCW1ldGhvZFVuaXQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpLCBjdXJyZW50RGF0ZSwgLTEpOwotCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgewotCQkJCWN0cmxfY2hhbmdlX2RhdGUuc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRWZXJzaW9uU2VjdGlvbkRhdGEoKSB7Ci0KLQkJY3RybF92ZXJzaW9uCi0JCQkJLnNldFRleHQobWV0aG9kVW5pdC5nZXRWZXJzaW9uKCkgPT0gbnVsbCA/ICIiIDogbWV0aG9kVW5pdC5nZXRWZXJzaW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfYXV0aG9ycwotCQkJCS5zZXRUZXh0KG1ldGhvZFVuaXQuZ2V0QXV0aG9ycygpID09IG51bGwgPyAiIiA6IG1ldGhvZFVuaXQuZ2V0QXV0aG9ycygpKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY2hhbmdlRGVzYyA9IG1ldGhvZFVuaXQuZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSA9PSBudWxsID8gIiIgOiBtZXRob2RVbml0LmdldENoYW5nZURlc2NyaXB0aW9uKCk7IC8vJE5PTi1OTFMtMSQKLQkJY2hhbmdlRGVzYyA9IGNoYW5nZURlc2MucmVwbGFjZShBdXRob3JpbmdVSVJlc291cmNlcy5DaGFuZ2VIaXN0b3J5RGlhbG9nX2RlbGltaXRlciwgU3RyVXRpbC5MSU5FX0ZFRUQpOwotCQljdHJsX2NoYW5nZV9kZXNjLnNldFRleHQoY2hhbmdlRGVzYyk7Ci0JCWN0cmxfY2hhbmdlX2RhdGUKLQkJCQkuc2V0VGV4dChtZXRob2RVbml0LmdldENoYW5nZURhdGUoKSA9PSBudWxsID8gIiIgLy8kTk9OLU5MUy0xJAotCQkJCQkJOiBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZShEYXRlRm9ybWF0LkZVTEwpLmZvcm1hdCgKLQkJCQkJCQkJbWV0aG9kVW5pdC5nZXRDaGFuZ2VEYXRlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBUb2dnbGUgRGVzY3JpcHRpb24gY29udHJvbCB0byBleHBhbmQgYW5kIGNvbnRyb2wgc3RhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0b2dnbGUoSHlwZXJsaW5rRXZlbnQgZSwgaW50IGlkKSB7Ci0JCS8vIFRPRE8tIHdlIHNob3VsZCBjb21iaW5lIHRoZXNlIG1ldGhvZHMgaW50byBvbmUuIE9uZSB3YXkgdG8gZG8gaXQsCi0JCS8vIGRpc3BvaW5nCi0JCS8vIGN0cmxfZXhwYW5kZWQgZXZlcnkgdGltZSBpdCBjb2xsYXBzZXMgYW5kIGNyZWF0aW5nIGl0IHdoZW4gd2UgZXhwYW5kLgotCQkvLyBBdCBwcmVzZW50LCB0aGVyZSBpcyBubyBtZXRob2QgdG8gZGlzcG9zZQotCQl0b2dnbGUoZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpY29uU2VjdGlvbk9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSWNvblNlY3Rpb25PbigpIHsKLQkJcmV0dXJuIGljb25TZWN0aW9uT247Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGljb25TZWN0aW9uT24KLQkgKiAgICAgICAgICAgIFRoZSBpY29uU2VjdGlvbk9uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJY29uU2VjdGlvbk9uKGJvb2xlYW4gaWNvblNlY3Rpb25PbikgewotCQl0aGlzLmljb25TZWN0aW9uT24gPSBpY29uU2VjdGlvbk9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIEljb24gc2VjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVJY29uU2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCWljb25TZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQKLQkJCQkJCXwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQlHcmlkRGF0YSB0ZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlpY29uU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJaWNvblNlY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuSUNPTl9TRUNUSU9OX05BTUUpOwotCQlpY29uU2VjdGlvbi5zZXREZXNjcmlwdGlvbihnZXRJY29uU2VjdGlvbkRlc2NyaXB0aW9uKCkpOwotCQlpY29uU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJaWNvbkNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGljb25TZWN0aW9uKTsKLQkJaWNvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJaWNvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgdHJ1ZSkpOwotCQlpY29uU2VjdGlvbi5zZXRDbGllbnQoaWNvbkNvbXBvc2l0ZSk7Ci0JfQotCXByaXZhdGUgdm9pZCBjcmVhdGVJY29uU2VjdGlvbkNvbnRlbnQoKSB7Ci0JCUNvbXBvc2l0ZSBzaGFwZUljb25Db21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgaWNvbkNvbXBvc2l0ZSwKLQkJCQkxKTsKLQkJc2hhcGVJY29uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQlzaGFwZUljb25Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLS8vCQljcmVhdGVMYWJlbCgKLS8vCQkJCXRvb2xraXQsCi0vLwkJCQlzaGFwZUljb25Db21wb3NpdGUsCi0vLwkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfTGFiZWwsIDIpOyAvLyROT04tTkxTLTEkCi0JCS8vIE5vIHdyYXAgbmVlZGVkCi0JCWNyZWF0ZUxhYmVsV2l0aE5vV3JhcCgKLQkJCQl0b29sa2l0LAotCQkJCXNoYXBlSWNvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfTGFiZWwsCi0JCQkJR3JpZERhdGEuQkVHSU5OSU5HLAotCQkJCTIpOyAKLQkJCi0JCXBhbmUxID0gbmV3IENhbnZhcyhzaGFwZUljb25Db21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCi0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNjA7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSA2MDsKLQkJCWdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDE7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlwYW5lMS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCXBhbmUxLnNldEJhY2tncm91bmQoQ29sb3JDb25zdGFudHMubGlnaHRHcmF5KTsKLQkJfQotCQkvLyBwYW5lMS5zZXRTaXplKDMwLDMwKTsKLQkJQ29tcG9zaXRlIHBhbmUyID0gY3JlYXRlQ29tcG9zaXRlRm9yQnV0dG9ucyh0b29sa2l0LCBzaGFwZUljb25Db21wb3NpdGUpOwotCQljdHJsX3NlbGVjdF9zaGFwZUljb25fYnV0dG9uID0gdG9vbGtpdAotCQkJCS5jcmVhdGVCdXR0b24oCi0JCQkJCQlwYW5lMiwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19TZWxlY3RCdXR0b25MYWJlbCwgU1dULk5PTkUpOyAKLQkJY3RybF9jbGVhcl9zaGFwZUljb25fYnV0dG9uID0gdG9vbGtpdAotCQkJCS5jcmVhdGVCdXR0b24oCi0JCQkJCQlwYW5lMiwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19DbGVhckJ1dHRvbkxhYmVsLCBTV1QuTk9ORSk7IAotCQlpZiAoY29udGVudEVsZW1lbnQuZ2V0U2hhcGVpY29uKCkgPT0gbnVsbCkKLQkJCWN0cmxfY2xlYXJfc2hhcGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZWxzZQotCQkJY3RybF9jbGVhcl9zaGFwZUljb25fYnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJQ29tcG9zaXRlIG5vZGVJY29uQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGljb25Db21wb3NpdGUsIDEpOwotCQlub2RlSWNvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbm9kZUljb25Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0vLwkJY3JlYXRlTGFiZWwoCi0vLwkJCQl0b29sa2l0LAotLy8JCQkJbm9kZUljb25Db21wb3NpdGUsCi0vLwkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19MYWJlbCwgMik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gTm8gd3JhcCBuZWVkIGZvciAKLQkJY3JlYXRlTGFiZWxXaXRoTm9XcmFwKAotCQkJCXRvb2xraXQsCi0JCQkJbm9kZUljb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfTGFiZWwsCi0JCQkJR3JpZERhdGEuQkVHSU5OSU5HLAotCQkJCTIpOyAKLQkJcGFuZTMgPSBuZXcgQ2FudmFzKG5vZGVJY29uQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDQwOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNDA7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAxOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJcGFuZTMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQlwYW5lMy5zZXRCYWNrZ3JvdW5kKENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSk7Ci0JCX0KLQkJQ29tcG9zaXRlIHBhbmU0ID0gY3JlYXRlQ29tcG9zaXRlRm9yQnV0dG9ucyh0b29sa2l0LCBub2RlSWNvbkNvbXBvc2l0ZSk7Ci0JCWN0cmxfc2VsZWN0X25vZGVJY29uX2J1dHRvbiA9IHRvb2xraXQKLQkJCQkuY3JlYXRlQnV0dG9uKAotCQkJCQkJcGFuZTQsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19TZWxlY3RCdXR0b25MYWJlbCwgU1dULk5PTkUpOyAKLQkJY3RybF9jbGVhcl9ub2RlSWNvbl9idXR0b24gPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUJ1dHRvbigKLQkJCQkJCXBhbmU0LAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbCwgU1dULk5PTkUpOyAKLQkJaWYgKGNvbnRlbnRFbGVtZW50LmdldE5vZGVpY29uKCkgPT0gbnVsbCkKLQkJCWN0cmxfY2xlYXJfbm9kZUljb25fYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQllbHNlCi0JCQljdHJsX2NsZWFyX25vZGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkKLQkJbmV3IExhYmVsKGljb25Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJc2hhcGVJY29uUGF0aCA9IGNyZWF0ZUxhYmVsV2l0aE5vV3JhcCh0b29sa2l0LAotCQkJCWljb25Db21wb3NpdGUsICIiLCBHcmlkRGF0YS5CRUdJTk5JTkcsIDEpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uUGF0aCA9IGNyZWF0ZUxhYmVsV2l0aE5vV3JhcCh0b29sa2l0LAotCQkJCWljb25Db21wb3NpdGUsICIiLCBHcmlkRGF0YS5CRUdJTk5JTkcsIDIpOyAvLyROT04tTkxTLTEkCi0vLwkJCW5ldyBMYWJlbChub2RlSWNvbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotLy8JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLS8vCQlkYXRhLmhvcml6b250YWxTcGFuID0yOwotLy8JCW5vZGVJY29uUGF0aC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTIpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMyk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmU0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJY29uU2VjdGlvbkxpc3RlbmVycygpIHsKLQotCQljdHJsX3NlbGVjdF9zaGFwZUljb25fYnV0dG9uCi0JCQkJLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotLy8JCQkJCUZpbGUgbGliRGlyRmlsZSA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLS8vCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSk7Ci0KLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJamF2YS5uZXQuVVJJIHNoYXBlSWNvblVyaSA9IG51bGw7Ci0JCQkJCQlGaWxlRGlhbG9nIGZpbGVDaG9vc2VyID0gbmV3IEZpbGVEaWFsb2coRGlzcGxheQotCQkJCQkJCQkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIFNXVC5PUEVOKTsKLQkJCQkJCWZpbGVDaG9vc2VyLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9JY29uRmlsZUNob29zZXJEaWFsb2dfdGl0bGUpOyAKLQkJCQkJCWZpbGVDaG9vc2VyLnNldEZpbHRlckV4dGVuc2lvbnMoaW1hZ2VUeXBlcyk7IAotCQkJCQkJZmlsZUNob29zZXIuc2V0RmlsdGVyTmFtZXMoaW1hZ2VOYW1lcyk7IAotCQkJCQkJU3RyaW5nIGltYWdlRmlsZSA9IG51bGw7Ci0JCQkJCQlTdHJpbmcgZmlsZW5hbWUgPSBudWxsOwotCQkJCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkJCQlpbWFnZUZpbGUgPSBmaWxlQ2hvb3Nlci5vcGVuKCk7Ci0JCQkJCQkJZmlsZW5hbWUgPSBmaWxlQ2hvb3Nlci5nZXRGaWxlTmFtZSgpOwotCQkJCQkJCWlmIChpbWFnZUZpbGUgIT0gbnVsbCkgewotCQkJCQkJCQlpZiAobmV3IEZpbGUoaW1hZ2VGaWxlKS5leGlzdHMoKSkgewotLy8JCQkJCQkJCQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YSgKLS8vCQkJCQkJCQkJCQlpbWFnZUZpbGUpOwotLy8JCQkJCQkJCQlpZiAoaW1hZ2VEYXRhLndpZHRoID4gU0hBUEVJQ09OX1dJRFRIX01BWAotLy8JCQkJCQkJCQkJCXx8IGltYWdlRGF0YS5oZWlnaHQgPiBTSEFQRUlDT05fSEVJR0hUX01BWCkgewotLy8JCQkJCQkJCQkJLy8gbXNnIHVzZXIgLSBpbWFnZSB0b28gYmlnCi0vLwkJCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotLy8JCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0vLwkJCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotLy8JCQkJCQkJCQkJCQkuZGlzcGxheUVycm9yKAotLy8JCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGl0bGUsIC8vJE5PTi1OTFMtMSQgCi0vLwkJCQkJCQkJCQkJCQkJTWVzc2FnZUZvcm1hdAotLy8JCQkJCQkJCQkJCQkJCQkJLmZvcm1hdCgKLS8vCQkJCQkJCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZVRvb0JpZ0RpYWxvZ190ZW1wbGF0ZSwgLy8kTk9OLU5MUy0xJAotLy8JCQkJCQkJCQkJCQkJCQkJCQluZXcgT2JqZWN0W10gewotLy8JCQkJCQkJCQkJCQkJCQkJCQkJCWltYWdlRmlsZSwKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQluZXcgSW50ZWdlcigKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVNIQVBFSUNPTl9XSURUSF9NQVgpLAotLy8JCQkJCQkJCQkJCQkJCQkJCQkJCW5ldyBJbnRlZ2VyKAotLy8JCQkJCQkJCQkJCQkJCQkJCQkJCQkJU0hBUEVJQ09OX0hFSUdIVF9NQVgpIH0pKTsKLS8vCQkJCQkJCQkJfSBlbHNlIHsKLS8vCQkJCQkJCQkJCWJyZWFrOwotLy8JCQkJCQkJCQl9Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCS8vIG1zZyB1c2VyIC0gZmlsZSBkb2Vzbid0IGV4aXN0Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQkJCQkJTWVzc2FnZUZvcm1hdAotCQkJCQkJCQkJCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RlbXBsYXRlLCAKLQkJCQkJCQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgaW1hZ2VGaWxlIH0pKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoaW1hZ2VGaWxlICE9IG51bGwgJiYgaW1hZ2VGaWxlLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCVN0cmluZyB1cmwgPSBjb3B5UmVzb3VyY2VUb0xpYihjdHJsX3NlbGVjdF9zaGFwZUljb25fYnV0dG9uLmdldFNoZWxsKCksIGZpbGVuYW1lLAotCQkJCQkJCQkJCWZpbGVDaG9vc2VyLmdldEZpbHRlclBhdGgoKSwKLQkJCQkJCQkJCQltZXRob2RFbGVtZW50KTsKLQkJCQkJCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh1cmwpOwotCQkJCQkJCQkJc2hhcGVJY29uVXJpID0gbmV3IFVSSShOZXRVdGlsCi0JCQkJCQkJCQkJCS5lbmNvZGVGaWxlVVJMKEZpbGVVdGlsCi0JCQkJCQkJCQkJCQkJLmdldFJlbGF0aXZlUGF0aChmaWxlLAotCQkJCQkJCQkJCQkJCQkJbmV3IEZpbGUoZ2V0UGx1Z2luUGF0aChtZXRob2RFbGVtZW50KSkpKSk7Ci0JCQkJCQkJCQlpZiAoc2hhcGVJY29uVXJpICE9IG51bGwpIHsKLQkJCQkJCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1ncgotCQkJCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCQkJCW1ldGhvZEVsZW1lbnQsCi0JCQkJCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKSwKLQkJCQkJCQkJCQkJCQkJc2hhcGVJY29uVXJpLCAtMSk7Ci0JCQkJCQkJCQkJaWYgKCFzdGF0dXMpCi0JCQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCXNoYXBlSW1hZ2UgPSBuZXcgSW1hZ2UoCi0JCQkJCQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLCBmaWxlCi0JCQkJCQkJCQkJCQkJLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCQkJCXNoYXBlSWNvblBhdGguc2V0VGV4dChzaGFwZUljb25VcmkuZ2V0UGF0aCgpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCQlzaGFwZUljb25VcmkgPSBudWxsOwotCQkJCQkJCQlzaGFwZUltYWdlID0gbnVsbDsKLQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJLmxvZ0Vycm9yKGV4KTsKLQkJCQkJCQkJaWYgKGV4IGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyX2NvcHlpbmdfZmlsZV90aXRsZSwgCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyX2NvcHlpbmdfZmlsZV9lcnJvciwgCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyX2NvcHlpbmdfZmlsZV9yZWFzb24sIAotCQkJCQkJCQkJCQkJCWV4LmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycl9wcm9jZXNzaW5nX2ZpbGVfdGl0bGUsIAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycl9wcm9jZXNzaW5nX2ZpbGVfZGVzY3JpcHRpb24sIGV4KTsgCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoc2hhcGVJbWFnZSAhPSBudWxsKSB7Ci0JCQkJCQkJcGFuZTEucmVkcmF3KCk7Ci0JCQkJCQkJY3RybF9jbGVhcl9zaGFwZUljb25fYnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWN0cmxfY2xlYXJfc2hhcGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJY3RybF9jbGVhcl9zaGFwZUljb25fYnV0dG9uCi0JCQkJLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCW1ldGhvZEVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKSwKLQkJCQkJCQkJbnVsbCwgLTEpOwotCQkJCQkJaWYgKCFzdGF0dXMpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJcGFuZTEucmVkcmF3KCk7Ci0JCQkJCQljdHJsX2NsZWFyX3NoYXBlSWNvbl9idXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQlzaGFwZUljb25QYXRoLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9KTsKLQotCQljdHJsX3NlbGVjdF9ub2RlSWNvbl9idXR0b24KLQkJCQkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0vLwkJCQkJRmlsZSBsaWJEaXJGaWxlID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotLy8JCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpKTsKLQotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlqYXZhLm5ldC5VUkkgbm9kZUljb25VcmkgPSBudWxsOwotCQkJCQkJRmlsZURpYWxvZyBmaWxlQ2hvb3NlciA9IG5ldyBGaWxlRGlhbG9nKERpc3BsYXkKLQkJCQkJCQkJLmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuT1BFTik7Ci0JCQkJCQlmaWxlQ2hvb3Nlci5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfSWNvbkZpbGVDaG9vc2VyRGlhbG9nX3RpdGxlKTsgCi0JCQkJCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJFeHRlbnNpb25zKGltYWdlVHlwZXMpOyAKLQkJCQkJCWZpbGVDaG9vc2VyLnNldEZpbHRlck5hbWVzKGltYWdlTmFtZXMpOyAKLQkJCQkJCVN0cmluZyBpbWFnZUZpbGUgPSBudWxsOwotCQkJCQkJU3RyaW5nIGZpbGVuYW1lID0gbnVsbDsKLQkJCQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCQkJaW1hZ2VGaWxlID0gZmlsZUNob29zZXIub3BlbigpOwotCQkJCQkJCWZpbGVuYW1lID0gZmlsZUNob29zZXIuZ2V0RmlsZU5hbWUoKTsKLQkJCQkJCQlpZiAoaW1hZ2VGaWxlICE9IG51bGwpIHsKLQkJCQkJCQkJaWYgKG5ldyBGaWxlKGltYWdlRmlsZSkuZXhpc3RzKCkpIHsKLQkJCQkJCQkJCUltYWdlRGF0YSBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKAotCQkJCQkJCQkJCQlpbWFnZUZpbGUpOwotCQkJCQkJCQkJaWYgKGltYWdlRGF0YS53aWR0aCA+IE5PREVJQ09OX1dJRFRIX01BWAotCQkJCQkJCQkJCQl8fCBpbWFnZURhdGEuaGVpZ2h0ID4gTk9ERUlDT05fSEVJR0hUX01BWCkgewotCQkJCQkJCQkJCS8vIG1zZyB1c2VyIC0gaW1hZ2UgdG9vIGJpZwotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGl0bGUsIAotCQkJCQkJCQkJCQkJCQlNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJCQkJCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGVtcGxhdGUsIAotCQkJCQkJCQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQkJCQkJCQkJaW1hZ2VGaWxlLAotCQkJCQkJCQkJCQkJCQkJCQkJCQluZXcgSW50ZWdlcigKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlOT0RFSUNPTl9XSURUSF9NQVgpLAotCQkJCQkJCQkJCQkJCQkJCQkJCQluZXcgSW50ZWdlcigKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlOT0RFSUNPTl9IRUlHSFRfTUFYKSB9KSk7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJLy8gbXNnIHVzZXIgLSBmaWxlIGRvZXNuJ3QgZXhpc3QKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCQkJCQlNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJCQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGVtcGxhdGUsIAotCQkJCQkJCQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyBpbWFnZUZpbGUgfSkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChpbWFnZUZpbGUgIT0gbnVsbCAmJiBpbWFnZUZpbGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJU3RyaW5nIHVybCA9IGNvcHlSZXNvdXJjZVRvTGliKGN0cmxfc2VsZWN0X25vZGVJY29uX2J1dHRvbi5nZXRTaGVsbCgpLCBmaWxlbmFtZSwKLQkJCQkJCQkJCQlmaWxlQ2hvb3Nlci5nZXRGaWx0ZXJQYXRoKCksCi0JCQkJCQkJCQkJbWV0aG9kRWxlbWVudCk7Ci0JCQkJCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodXJsKTsKLQkJCQkJCQkJCW5vZGVJY29uVXJpID0gbmV3IFVSSShOZXRVdGlsCi0JCQkJCQkJCQkJCS5lbmNvZGVGaWxlVVJMKEZpbGVVdGlsCi0JCQkJCQkJCQkJCQkJLmdldFJlbGF0aXZlUGF0aChmaWxlLAotCQkJCQkJCQkJCQkJCQkJbmV3IEZpbGUoZ2V0UGx1Z2luUGF0aChtZXRob2RFbGVtZW50KSkpKSk7Ci0JCQkJCQkJCQlpZiAobm9kZUljb25VcmkgIT0gbnVsbCkgewotCQkJCQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQkJCQkJbWV0aG9kRWxlbWVudCwKLQkJCQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCksCi0JCQkJCQkJCQkJCQkJCW5vZGVJY29uVXJpLCAtMSk7Ci0JCQkJCQkJCQkJaWYgKCFzdGF0dXMpCi0JCQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCW5vZGVJbWFnZSA9IG5ldyBJbWFnZShEaXNwbGF5LmdldEN1cnJlbnQoKSwKLQkJCQkJCQkJCQkJZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCQkJCQlub2RlSWNvblBhdGguc2V0VGV4dChub2RlSWNvblVyaS5nZXRQYXRoKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCW5vZGVJY29uVXJpID0gbnVsbDsKLQkJCQkJCQkJbm9kZUltYWdlID0gbnVsbDsKLQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJLmxvZ0Vycm9yKGV4KTsKLQkJCQkJCQkJaWYgKGV4IGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyX2NvcHlpbmdfZmlsZV90aXRsZSwgCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyX2NvcHlpbmdfZmlsZV9lcnJvciwgCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyX2NvcHlpbmdfZmlsZV9yZWFzb24sIAotCQkJCQkJCQkJCQkJCWV4LmdldE1lc3NhZ2UoKSk7Ci0KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyX3Byb2Nlc3NpbmdfZmlsZV90aXRsZSwgCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyX3Byb2Nlc3NpbmdfZmlsZV9kZXNjcmlwdGlvbiwgZXgpOyAKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChub2RlSW1hZ2UgIT0gbnVsbCkgewotCQkJCQkJCXBhbmUzLnJlZHJhdygpOwotCQkJCQkJCWN0cmxfY2xlYXJfbm9kZUljb25fYnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWN0cmxfY2xlYXJfbm9kZUljb25fYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJY3RybF9jbGVhcl9ub2RlSWNvbl9idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJbWV0aG9kRWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpLCBudWxsLCAtMSk7Ci0JCQkJaWYgKCFzdGF0dXMpCi0JCQkJCXJldHVybjsKLQkJCQlwYW5lMy5yZWRyYXcoKTsKLQkJCQljdHJsX2NsZWFyX25vZGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlub2RlSWNvblBhdGguc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIHRoZSBzZWxlY3RlZCBzaGFwZU5vZGVJY29uIGFuZCBub2RlSWNvbiB0byByZXNvdXJjZXMgZm9sZGVyIG9mCi0JICogY29udGVudCBlbGVtZW50LiBQcm9tcHRzIHRvIG92ZXJ3cml0ZSBpZiBmaWxlIGFscmVhZHkgZXhpc3RzLgotCSAqIEBwYXJhbSBzRmlsZU5hbWUKLQkgKiBAcGFyYW0gc0ZpbGVQYXRoCi0JICogQHBhcmFtIG1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29weVJlc291cmNlVG9MaWIoU2hlbGwgc2hlbGwsIFN0cmluZyBzRmlsZU5hbWUsIFN0cmluZyBzRmlsZVBhdGgsCi0JCQlNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgbmV3RmlsZSA9IExpYnJhcnlVSVV0aWwuY29weVJlc291cmNlVG9MaWIoc2hlbGwsIG5ldyBGaWxlKHNGaWxlUGF0aCwgc0ZpbGVOYW1lKSwgbWV0aG9kRWxlbWVudCk7Ci0JCWlmIChuZXdGaWxlICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJZWxzZSAKLQkJCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRJY29uU2VjdGlvbkRhdGEoKSB7Ci0JCXBhbmUxLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQkJLy8gcGFpbnQgdGhlIGdyZXkgYmFja2dyb3VuZAotCQkJCVJlY3RhbmdsZSBjbGllbnRSZWN0ID0gcGFuZTEuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCWUuZ2Muc2V0Q2xpcHBpbmcoY2xpZW50UmVjdCk7Ci0JCQkJZS5nYy5zZXRCYWNrZ3JvdW5kKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFN5c3RlbUNvbG9yKDE1KSk7Ci0JCQkJZS5nYy5maWxsUmVjdGFuZ2xlKGNsaWVudFJlY3QpOwotCi0JCQkJamF2YS5uZXQuVVJJIHVyaSA9IGNvbnRlbnRFbGVtZW50LmdldFNoYXBlaWNvbigpOwotCQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcGF0aCA9IGNvbnRlbnRFbGVtZW50LmdldFNoYXBlaWNvbigpLmdldFBhdGgoKTsKLQkJCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmICghZmlsZS5pc0Fic29sdXRlKCkpIHsKLQkJCQkJCQkJCS8vIENoZWNrIGZvciB0aGUgdXJpIGNvbnRhaW5zIHRoZSByZWxhdGl2ZSB0byBsaWJyYXJ5LgotCQkJCQkJCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKG1ldGhvZEVsZW1lbnQpOwotCQkJCQkJCQkJaWYocGF0aC5pbmRleE9mKHBsdWdpbi5nZXROYW1lKCkpID4gLTEpewotCQkJCQkJCQkJCXBhdGggPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKQotCQkJCQkJCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyBwYXRoOwkKLQkJCQkJCQkJCX1lbHNlewotCQkJCQkJCQkJCXBhdGggPSBnZXRQbHVnaW5QYXRoKG1ldGhvZEVsZW1lbnQpCi0JCQkJCQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIHBhdGg7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQkKLQkJCQkJCQkJfQotCQkJCQkJCQlmaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkJCWlmIChzaGFwZUltYWdlID09IG51bGwpIHsKLQkJCQkJCQkJCXNoYXBlSW1hZ2UgPSBuZXcgSW1hZ2UoCi0JCQkJCQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLCBwYXRoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZihjb250ZW50RWxlbWVudC5nZXRTaGFwZWljb24oKSAhPSBudWxsKXsKLQkJCQkJCQkJCXNoYXBlSWNvblBhdGguc2V0VGV4dChjb250ZW50RWxlbWVudC5nZXRTaGFwZWljb24oKS5nZXRQYXRoKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNsaWVudFJlY3QgPSBwYW5lMS5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJCQkJCWUuZ2Muc2V0Q2xpcHBpbmcoY2xpZW50UmVjdCk7Ci0JCQkJCQkJCWUuZ2Muc2V0QmFja2dyb3VuZChEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkJCQkJCS5nZXRTeXN0ZW1Db2xvcigxNSkpOwotCQkJCQkJCQllLmdjLmZpbGxSZWN0YW5nbGUoY2xpZW50UmVjdCk7Ci0JCQkJCQkJCWUuZ2MuZHJhd0ltYWdlKHNoYXBlSW1hZ2UsIHNoYXBlSW1hZ2UKLQkJCQkJCQkJCQkuZ2V0Qm91bmRzKCkueCwKLQkJCQkJCQkJCQlzaGFwZUltYWdlLmdldEJvdW5kcygpLnksIHNoYXBlSW1hZ2UKLQkJCQkJCQkJCQkJCS5nZXRCb3VuZHMoKS53aWR0aCwgc2hhcGVJbWFnZQotCQkJCQkJCQkJCQkJLmdldEJvdW5kcygpLmhlaWdodCwgcGFuZTEKLQkJCQkJCQkJCQkJCS5nZXRDbGllbnRBcmVhKCkueCwgcGFuZTEKLQkJCQkJCQkJCQkJCS5nZXRDbGllbnRBcmVhKCkueSwgcGFuZTEKLQkJCQkJCQkJCQkJCS5nZXRDbGllbnRBcmVhKCkud2lkdGgsIHBhbmUxCi0JCQkJCQkJCQkJCQkuZ2V0Q2xpZW50QXJlYSgpLmhlaWdodCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaWYgKHdhcm5pbmdDb3VudCA9PSAxKSB7Ci0JCQkJCQkJCQl3YXJuaW5nQ291bnQrKzsKLQkJCQkJCQkJCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbldhcm5pbmcsIChuZXcgT2JqZWN0W10geyBtZXRob2RFbGVtZW50LmdldE5hbWUoKSwgcGF0aCB9KSk7IAotCQkJCQkJCQkJTXNnQm94LnNob3dXYXJuaW5nKG1zZyk7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWRTaGFwZUljb25FcnJvciwgKG5ldyBPYmplY3RbXSB7IGV4LmdldE1lc3NhZ2UoKSB9KSkpOyAKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9KTsKLQkJcGFuZTEucmVkcmF3KCk7Ci0JCWlmKGNvbnRlbnRFbGVtZW50LmdldFNoYXBlaWNvbigpICE9IG51bGwpewotCQkJc2hhcGVJY29uUGF0aC5zZXRUZXh0KGNvbnRlbnRFbGVtZW50LmdldFNoYXBlaWNvbigpLmdldFBhdGgoKSk7Ci0JCX0KLQkJCi0JCXBhbmUzLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQkJLy8gcGFpbnQgdGhlIGdyZXkgYmFja2dyb3VuZAotCQkJCVJlY3RhbmdsZSBjbGllbnRSZWN0ID0gcGFuZTMuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCWUuZ2Muc2V0Q2xpcHBpbmcoY2xpZW50UmVjdCk7Ci0JCQkJZS5nYy5zZXRCYWNrZ3JvdW5kKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFN5c3RlbUNvbG9yKDE1KSk7Ci0JCQkJZS5nYy5maWxsUmVjdGFuZ2xlKGNsaWVudFJlY3QpOwotCi0JCQkJamF2YS5uZXQuVVJJIHVyaSA9IGNvbnRlbnRFbGVtZW50LmdldE5vZGVpY29uKCk7Ci0JCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gY29udGVudEVsZW1lbnQuZ2V0Tm9kZWljb24oKS5nZXRQYXRoKCk7Ci0JCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJCQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4obWV0aG9kRWxlbWVudCk7Ci0JCQkJCQkJCQlpZihwYXRoLmluZGV4T2YocGx1Z2luLmdldE5hbWUoKSkgPiAtMSl7Ci0JCQkJCQkJCQkJcGF0aCA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpCi0JCQkJCQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIHBhdGg7CQotCQkJCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCQkJcGF0aCA9IGdldFBsdWdpblBhdGgobWV0aG9kRWxlbWVudCkKLQkJCQkJCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgcGF0aDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlmaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkJCWlmIChub2RlSW1hZ2UgPT0gbnVsbCkgewotCQkJCQkJCQkJbm9kZUltYWdlID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0Q3VycmVudCgpLAotCQkJCQkJCQkJCQlwYXRoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZihjb250ZW50RWxlbWVudC5nZXROb2RlaWNvbigpICE9IG51bGwpewotCQkJCQkJCQkJbm9kZUljb25QYXRoLnNldFRleHQoY29udGVudEVsZW1lbnQuZ2V0Tm9kZWljb24oKS5nZXRQYXRoKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNsaWVudFJlY3QgPSBwYW5lMy5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJCQkJCWUuZ2Muc2V0Q2xpcHBpbmcoY2xpZW50UmVjdCk7Ci0JCQkJCQkJCWUuZ2Muc2V0QmFja2dyb3VuZChEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkJCQkJCS5nZXRTeXN0ZW1Db2xvcigxNSkpOwotCQkJCQkJCQllLmdjLmZpbGxSZWN0YW5nbGUoY2xpZW50UmVjdCk7Ci0JCQkJCQkJCWUuZ2MuZHJhd0ltYWdlKG5vZGVJbWFnZSwKLQkJCQkJCQkJCQlub2RlSW1hZ2UuZ2V0Qm91bmRzKCkueCwgbm9kZUltYWdlCi0JCQkJCQkJCQkJCQkuZ2V0Qm91bmRzKCkueSwgbm9kZUltYWdlCi0JCQkJCQkJCQkJCQkuZ2V0Qm91bmRzKCkud2lkdGgsIG5vZGVJbWFnZQotCQkJCQkJCQkJCQkJLmdldEJvdW5kcygpLmhlaWdodCwgcGFuZTMKLQkJCQkJCQkJCQkJCS5nZXRDbGllbnRBcmVhKCkueCwgcGFuZTMKLQkJCQkJCQkJCQkJCS5nZXRDbGllbnRBcmVhKCkueSwgcGFuZTMKLQkJCQkJCQkJCQkJCS5nZXRDbGllbnRBcmVhKCkud2lkdGgsIHBhbmUzCi0JCQkJCQkJCQkJCQkuZ2V0Q2xpZW50QXJlYSgpLmhlaWdodCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaWYgKHdhcm5pbmdDb3VudCA9PSAxKSB7Ci0JCQkJCQkJCQl3YXJuaW5nQ291bnQrKzsKLQkJCQkJCQkJCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uV2FybmluZywgKG5ldyBPYmplY3RbXSB7IG1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpLCBwYXRoIH0pKTsgCi0JCQkJCQkJCQlNc2dCb3guc2hvd1dhcm5pbmcobXNnKTsKLQkJCQkJCQkJfQotCi0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uRXJyb3IsIChuZXcgT2JqZWN0W10geyBleC5nZXRNZXNzYWdlKCkgfSkpKTsgCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfSk7Ci0JCXBhbmUzLnJlZHJhdygpOwotCQlpZihjb250ZW50RWxlbWVudC5nZXROb2RlaWNvbigpICE9IG51bGwpewotCQkJbm9kZUljb25QYXRoLnNldFRleHQoY29udGVudEVsZW1lbnQuZ2V0Tm9kZWljb24oKS5nZXRQYXRoKCkpOwotCQl9Ci0JfQotCi0JCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlU2VjdGlvbnMoYm9vbGVhbiBlbmFibGUpIHsKLQkJaWYgKGdlbmVyYWxTZWN0aW9uT24pIHsKLQkJCWdlbmVyYWxTZWN0aW9uLnNldFZpc2libGUoZW5hYmxlKTsKLQkJCWlmIChlbmFibGUpIHsKLQkJCQlnZW5lcmFsU2VjdGlvbi5zZXRFeHBhbmRlZChnZW5lcmFsU2VjdGlvbkV4cGFuZEZsYWcpOwotCQkJfSBlbHNlIHsKLQkJCQlnZW5lcmFsU2VjdGlvbkV4cGFuZEZsYWcgPSBnZW5lcmFsU2VjdGlvbi5pc0V4cGFuZGVkKCk7Ci0JCQkJZ2VuZXJhbFNlY3Rpb24uc2V0RXhwYW5kZWQoZW5hYmxlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChkZXRhaWxTZWN0aW9uT24pIHsKLQkJCWRldGFpbFNlY3Rpb24uc2V0VmlzaWJsZShlbmFibGUpOwotCQkJaWYgKGVuYWJsZSkgewotCQkJCWRldGFpbFNlY3Rpb24uc2V0RXhwYW5kZWQoZGV0YWlsU2VjdGlvbkV4cGFuZEZsYWcpOwotCQkJfSBlbHNlIHsKLQkJCQlkZXRhaWxTZWN0aW9uRXhwYW5kRmxhZyA9IGRldGFpbFNlY3Rpb24uaXNFeHBhbmRlZCgpOwotCQkJCWRldGFpbFNlY3Rpb24uc2V0RXhwYW5kZWQoZW5hYmxlKTsKLQkJCX0KLQkJfQotCQlpZiAobm90YXRpb25TZWN0aW9uT24pIHsKLQkJCW5vdGF0aW9uU2VjdGlvbi5zZXRWaXNpYmxlKGVuYWJsZSk7Ci0JCQlpZiAoZW5hYmxlKSB7Ci0JCQkJbm90YXRpb25TZWN0aW9uLnNldEV4cGFuZGVkKG5vdGF0aW9uU2VjdGlvbkV4cGFuZEZsYWcpOwotCQkJfSBlbHNlIHsKLQkJCQlub3RhdGlvblNlY3Rpb25FeHBhbmRGbGFnID0gbm90YXRpb25TZWN0aW9uLmlzRXhwYW5kZWQoKTsKLQkJCQlub3RhdGlvblNlY3Rpb24uc2V0RXhwYW5kZWQoZW5hYmxlKTsKLQkJCX0KLQkJfQotCQlpZiAodGFpbG9yaW5nU2VjdGlvbk9uKSB7Ci0JCQl0YWlsb3JpbmdTZWN0aW9uLnNldFZpc2libGUoZW5hYmxlKTsKLQkJCWlmIChlbmFibGUpIHsKLQkJCQl0YWlsb3JpbmdTZWN0aW9uLnNldEV4cGFuZGVkKHRhaWxvcmluZ1NlY3Rpb25FeHBhbmRGbGFnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGFpbG9yaW5nU2VjdGlvbkV4cGFuZEZsYWcgPSB0YWlsb3JpbmdTZWN0aW9uLmlzRXhwYW5kZWQoKTsKLQkJCQl0YWlsb3JpbmdTZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHZlcnNpb25TZWN0aW9uT24pIHsKLQkJCXZlcnNpb25TZWN0aW9uLnNldFZpc2libGUoZW5hYmxlKTsKLQkJCWlmIChlbmFibGUpIHsKLQkJCQl2ZXJzaW9uU2VjdGlvbi5zZXRFeHBhbmRlZCh2ZXJzaW9uU2VjdGlvbkV4cGFuZEZsYWcpOwotCQkJfSBlbHNlIHsKLQkJCQl2ZXJzaW9uU2VjdGlvbkV4cGFuZEZsYWcgPSB2ZXJzaW9uU2VjdGlvbi5pc0V4cGFuZGVkKCk7Ci0JCQkJdmVyc2lvblNlY3Rpb24uc2V0RXhwYW5kZWQoZW5hYmxlKTsKLQkJCX0KLQkJfQotCQlpZiAoaWNvblNlY3Rpb25PbikgewotCQkJaWNvblNlY3Rpb24uc2V0VmlzaWJsZShlbmFibGUpOwotCQkJaWYgKGVuYWJsZSkgewotCQkJCWljb25TZWN0aW9uLnNldEV4cGFuZGVkKGljb25TZWN0aW9uRXhwYW5kRmxhZyk7Ci0JCQl9IGVsc2UgewotCQkJCWljb25TZWN0aW9uRXhwYW5kRmxhZyA9IGljb25TZWN0aW9uLmlzRXhwYW5kZWQoKTsKLQkJCQlpY29uU2VjdGlvbi5zZXRFeHBhbmRlZChlbmFibGUpOwotCQkJfQotCQl9Ci0JCWlmICh2YXJpYWJpbGl0eVNlY3Rpb25PbikgewotCQkJdmFyaWFiaWxpdHlTZWN0aW9uLnNldFZpc2libGUoZW5hYmxlKTsKLQkJCWlmIChlbmFibGUpIHsKLQkJCQl2YXJpYWJpbGl0eVNlY3Rpb24uc2V0RXhwYW5kZWQoZWxlbWVudFNlY3Rpb25FeHBhbmRGbGFnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZWxlbWVudFNlY3Rpb25FeHBhbmRGbGFnID0gdmFyaWFiaWxpdHlTZWN0aW9uLmlzRXhwYW5kZWQoKTsKLQkJCQl2YXJpYWJpbGl0eVNlY3Rpb24uc2V0RXhwYW5kZWQoZW5hYmxlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChzaGFwZUltYWdlICE9IG51bGwpIHsKLQkJCXNoYXBlSW1hZ2UuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChub2RlSW1hZ2UgIT0gbnVsbCkgewotCQkJbm9kZUltYWdlLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAobGFiZWxQcm92aWRlclZhcmlhYmlsaXR5ICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXJWYXJpYWJpbGl0eS5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGNvbnRlbnRQcm92aWRlclZhcmlhYmlsaXR5ICE9IG51bGwpIHsKLQkJCWNvbnRlbnRQcm92aWRlclZhcmlhYmlsaXR5LmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAobGFiZWxQcm92aWRlckJhc2UgIT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlckJhc2UuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChjb3B5cmlnaHRMYWJlbFByb3ZpZGVyQmFzZSAhPSBudWxsKSB7Ci0JCQljb3B5cmlnaHRMYWJlbFByb3ZpZGVyQmFzZS5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCQkKLQkJZGlzcG9zZWQgPSB0cnVlOwotCX0JCQotCi0JcHJpdmF0ZSB2b2lkIHNldENvcHlyaWdodEJ1dHRvbkRlc2VsZWN0KCkgewotCQlpZiAobWV0aG9kVW5pdC5nZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0Ci0JCQkJCS5zZXRFbmFibGVkKChtZXRob2RVbml0Ci0JCQkJCQkJLmdldENvcHlyaWdodFN0YXRlbWVudCgpLmdldE5hbWUoKSA9PSBudWxsKSA/IGZhbHNlCi0JCQkJCQkJOiB0cnVlKTsKLQkJfSBlbHNlCi0JCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0LnNldEVuYWJsZWQoZmFsc2UpOwotCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChtZXRob2RFbGVtZW50KSkKLQkJCWNvcHlyaWdodF9idXR0b25fZGVzZWxlY3Quc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29udGV4dEhlbHAoKSB7Ci0JCWlmIChzZWN0aW9uQ29tcG9zaXRlICE9IG51bGwpIHsKLQkJCUVkaXRvcnNDb250ZXh0SGVscGVyLnNldEhlbHAoc2VjdGlvbkNvbXBvc2l0ZS5nZXRQYXJlbnQoKSwKLQkJCQkJZ2V0bWV0aG9kRWxlbWVudCgpKTsKLQkJfQotCQlpZiAoZXhwYW5kZWRDb21wb3NpdGUgIT0gbnVsbCkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCgKLQkJCQkJZXhwYW5kZWRDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLlJJQ0hfVEVYVF9FRElUT1JfQ09OVEVYVF9JRCk7Ci0JCX0KLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuSVJlZnJlc2hhYmxlI3JlZnJlc2hOYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKG5ld05hbWUgIT0gbnVsbCkgewotCQkJaWYgKChjdHJsX25hbWUgIT0gbnVsbCkgJiYgIShjdHJsX25hbWUuaXNEaXNwb3NlZCgpKSkgewotCQkJCWN0cmxfbmFtZS5yZW1vdmVNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJCQljdHJsX25hbWUuc2V0VGV4dChuZXdOYW1lKTsKLQkJCQljdHJsX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJc2V0Rm9ybVRleHRXaXRoVmFyaWFibGVJbmZvKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpewotCQkKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24oKXsKLQkJaWYoZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIGRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbjsKLQkJfQotCQlyZXR1cm4gQXV0aG9yaW5nVUlUZXh0LkRFVEFJTF9TRUNUSU9OX0RFU0M7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0R2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbigpewotCQlpZihnZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uIT0gbnVsbCl7Ci0JCQlyZXR1cm4gZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbjsKLQkJfQotCQlyZXR1cm4gQXV0aG9yaW5nVUlUZXh0LkdFTkVSQUxfSU5GT19TRUNUSU9OX0RFU0M7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFpbG9yaW5nU2VjdGlvbkRlc2NyaXB0aW9uKCl7Ci0JCWlmKHRhaWxvcmluZ1NlY3Rpb25EZXNjcmlwdGlvbiAhPSBudWxsKXsKLQkJCXJldHVybiB0YWlsb3JpbmdTZWN0aW9uRGVzY3JpcHRpb247Ci0JCX0KLQkJcmV0dXJuIEF1dGhvcmluZ1VJVGV4dC5UQUlMT1JJTkdfU0VDVElPTl9ERVNDOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uKCl7Ci0JCWlmKG5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIG5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uOwotCQl9Ci0JCXJldHVybiBBdXRob3JpbmdVSVRleHQuTk9UQVRJT05fU0VDVElPTl9ERVNDOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uKCl7Ci0JCWlmKHZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIHZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uOwotCQl9Ci0JCXJldHVybiBBdXRob3JpbmdVSVRleHQuVkFSSUFCSUxJVFlfU0VDVElPTl9ERVNDOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRJY29uU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHVicwotCQlpZihpY29uU2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIGljb25TZWN0aW9uRGVzY3JpcHRpb247Ci0JCX0KLQkJcmV0dXJuIEF1dGhvcmluZ1VJVGV4dC5JQ09OX1NFQ1RJT05fREVTQzsKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlpZih2ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIHZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb247Ci0JCX0KLQkJcmV0dXJuIEF1dGhvcmluZ1VJVGV4dC5WRVJTSU9OX0lORk9fU0VDVElPTl9ERVNDOwotCX0KLQotCS8qKiAKLQkgKiBGb2xsb3dpbmcgbWV0aG9kcyBiZWxvdyBleHBvc2VkIHB1YmxpYyBpbiBvcmRlciB0byBhbGxvdyAKLQkgKiB0ZXN0IGF1dG9tYXRpb24gdG8gYWNjZXNzIHRoZSBmb3JtIG9iamVjdHMgdGhyb3VnaCB0ZXN0IG9iamVjdHMKLQkgKiBvZiBhbnkgYXV0b21hdGlvbiB0b29scy4KLQkgKi8KLQkKLQkvKioKLQkgKiBHZXQgYnJpZWYgZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN0cmxfYnJpZWZfZGVzYy4KLQkgKi8KLQlwdWJsaWMgVGV4dCBnZXRDdHJsX2JyaWVmX2Rlc2MoKSB7Ci0JCXJldHVybiBjdHJsX2JyaWVmX2Rlc2M7Ci0JfQotCi0JLyoqCi0JICogU2V0IGJyaWVmIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGN0cmxfYnJpZWZfZGVzYyBUaGUgY3RybF9icmllZl9kZXNjIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdHJsX2JyaWVmX2Rlc2MoVGV4dCBjdHJsX2JyaWVmX2Rlc2MpIHsKLQkJdGhpcy5jdHJsX2JyaWVmX2Rlc2MgPSBjdHJsX2JyaWVmX2Rlc2M7Ci0JfQotCi0JLyoqCi0JICogR2V0IG1haW4gZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN0cmxfZnVsbF9kZXNjLgotCSAqLwotCXB1YmxpYyBJTWV0aG9kUmljaFRleHQgZ2V0Q3RybF9mdWxsX2Rlc2MoKSB7Ci0JCXJldHVybiBjdHJsX2Z1bGxfZGVzYzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgbWFpbiBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBjdHJsX2Z1bGxfZGVzYyBUaGUgY3RybF9mdWxsX2Rlc2MgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN0cmxfZnVsbF9kZXNjKElNZXRob2RSaWNoVGV4dCBjdHJsX2Z1bGxfZGVzYykgewotCQl0aGlzLmN0cmxfZnVsbF9kZXNjID0gY3RybF9mdWxsX2Rlc2M7Ci0JfQotCi0JLyoqCi0JICogR2V0IHByZXNlbnRhdGlvbiBuYW1lCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lLgotCSAqLwotCXB1YmxpYyBUZXh0IGdldEN0cmxfcHJlc2VudGF0aW9uX25hbWUoKSB7Ci0JCXJldHVybiBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lOwotCX0KLQotCS8qKgotCSAqIFNldCBwcmVzZW50YXRpb24gbmFtZQotCSAqIEBwYXJhbSBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lIFRoZSBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdHJsX3ByZXNlbnRhdGlvbl9uYW1lKFRleHQgY3RybF9wcmVzZW50YXRpb25fbmFtZSkgewotCQl0aGlzLmN0cmxfcHJlc2VudGF0aW9uX25hbWUgPSBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lOwotCX0KLQotCS8qKgotCSAqIEdldCBleHBhbmRlZCByaWNoIHRleHQgY29udHJvbAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3RybF9leHBhbmRlZC4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFJpY2hUZXh0RWRpdG9yIGdldEN0cmxfZXhwYW5kZWQoKSB7Ci0JCXJldHVybiBjdHJsX2V4cGFuZGVkOwotCX0KLQotCS8qKgotCSAqIFNldCBleHBhbmRlZCByaWNoIHRleHQgY29udHJvbAotCSAqIEBwYXJhbSBjdHJsX2V4cGFuZGVkIFRoZSBjdHJsX2V4cGFuZGVkIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdHJsX2V4cGFuZGVkKElNZXRob2RSaWNoVGV4dEVkaXRvciBjdHJsX2V4cGFuZGVkKSB7Ci0JCXRoaXMuY3RybF9leHBhbmRlZCA9IGN0cmxfZXhwYW5kZWQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHJpY2ggdGV4dCBjb250cm9sCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjdHJsX2tleS4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFJpY2hUZXh0IGdldEN0cmxfa2V5KCkgewotCQlyZXR1cm4gY3RybF9rZXk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHJpY2ggdGV4dCBjb250cm9sCi0JICogQHBhcmFtIGN0cmxfa2V5IFRoZSBjdHJsX2tleSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3RybF9rZXkoSU1ldGhvZFJpY2hUZXh0IGN0cmxfa2V5KSB7Ci0JCXRoaXMuY3RybF9rZXkgPSBjdHJsX2tleTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5QYXRoKE1ldGhvZEVsZW1lbnQgZSl7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuZ2V0Rm9sZGVyQWJzb2x1dGVQYXRoKHBsdWdpbik7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVEZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZURlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWM2Y2QyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZURlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgRG9tYWluIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVEZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAiZGlzY2lwbGluZURlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRGlzY2lwbGluZSBkaXNjaXBsaW5lOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZURlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKSBjb250ZW50RWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGRpc2NpcGxpbmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpOwotCQkJfQotCQl9OwotCi0JCS8vIHNldCBhZGRpdGlvbmFsIGZpbHRlciBmb3IgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IGNoZWNraW5nCi0JCSgoQ2F0ZWdvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJZGlzY2lwbGluZSkgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lR3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZUdyb3VwaW5nRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNTAwZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lR3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgRGlzY2lwbGluZSBHcm91cGluZyBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZSBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJkaXNjaXBsaW5lR3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIERpc2NpcGxpbmVHcm91cGluZyBkaXNjaXBsaW5lR3JvdXBpbmc7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lR3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCWRpc2NpcGxpbmVHcm91cGluZyA9IChEaXNjaXBsaW5lR3JvdXBpbmcpIGNvbnRlbnRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gZGlzY2lwbGluZUdyb3VwaW5nOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gU2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcuCi0JCSgoQ2F0ZWdvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJZGlzY2lwbGluZUdyb3VwaW5nKSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZWdyb3VwaW5nX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lZ3JvdXBpbmdfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWZhYmZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgRGlzY2lwbGluZXMgcGFnZSBpbiB0aGUgRGlzY2lwbGluZSBHcm91cGluZyBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAiZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgRGlzY2lwbGluZUdyb3VwaW5nIGRpc2NpcGxpbmVHcm91cGluZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRJU0NJUExJTkVTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZGlzY2lwbGluZUdyb3VwaW5nID0gKERpc2NpcGxpbmVHcm91cGluZykgY29udGVudEVsZW1lbnQ7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gKChEaXNjaXBsaW5lR3JvdXBpbmcpIG9iamVjdCkuZ2V0RGlzY2lwbGluZXMoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLAotCQkJCQlkaXNjaXBsaW5lR3JvdXBpbmcsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpLAotCQkJCQlhZGRJdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwKLQkJCQkJZGlzY2lwbGluZUdyb3VwaW5nLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZXMoKSwKLQkJCQkJcm1JdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBkaXNjaXBsaW5lR3JvdXBpbmc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWYzZjUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUmVmZXJlbmNlV29ya0Zsb3dGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgUmVmZXJlbmNlIFdvcmtmbG93IHBhZ2UgaW4gdGhlIERpc2NpcGxpbmUgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJkaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBEaXNjaXBsaW5lIGRpc2NpcGxpbmU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELAotCQkJCUF1dGhvcmluZ1VJVGV4dC5SRUZFUkVOQ0VfV09SS0ZMT1dfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlkaXNjaXBsaW5lID0gKERpc2NpcGxpbmUpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMih0cnVlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZGlzY2lwbGluZS5nZXRSZWZlcmVuY2VXb3JrZmxvd3MoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJLy8gT2JqZWN0IG9iamVjdCA9IGl0b3IubmV4dCgpOwotCQkJLy8gaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCS8vIFByb2Nlc3MgcHJvY2VzcyA9Ci0JCQkvLyAoUHJvY2VzcykoKFByb2Nlc3NDb21wb25lbnQpb2JqZWN0KS5nZXRQcm9jZXNzKCk7Ci0JCQkvLyBpZiAocHJvY2VzcyAhPSBudWxsKSB7Ci0JCQkvLyBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCS8vIGRpc2NpcGxpbmUsCi0JCQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93cygpLCBwcm9jZXNzLAotCQkJLy8gLTEpOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gZWxzZSB7Ci0JCQkvLyBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCS8vIGRpc2NpcGxpbmUsCi0JCQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93cygpLCBvYmplY3QsCi0JCQkvLyAtMSk7Ci0JCQkvLyB9Ci0JCQlNZXRob2RFbGVtZW50IG9iamVjdCA9IChNZXRob2RFbGVtZW50KSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJb2JqZWN0ID0gKChQcm9jZXNzQ29tcG9uZW50KSBvYmplY3QpLmdldFByb2Nlc3MoKTsKLQkJCX0KLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93cygpOwotCQkJCWlmIChVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnlPcHBvc2l0ZShkaXNjaXBsaW5lLAotCQkJCQkJZmVhdHVyZSwgb2JqZWN0KSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQlkaXNjaXBsaW5lLCBmZWF0dXJlLCBvYmplY3QsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLAotCQkJCQlkaXNjaXBsaW5lLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93cygpLAotCQkJCQlybUl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGRpc2NpcGxpbmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5QUk9DRVNTRVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgUmVmZXJlbmNlV29ya0Zsb3dGaWx0ZXIoKTsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZVRhc2tzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lVGFza3NQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZWY4OWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lVGFza3NQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Nb3ZlSW5DYXRlZ29yeUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNhdGVnb3J5U29ydEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29udGVudEVsZW1lbnRPcmRlckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgVGFza3MgcGFnZSBpbiB0aGUgRGlzY2lwbGluZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgTG9rYW5hdGggSmFnZ2EKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lVGFza3NQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImRpc2NpcGxpbmVUYXNrc1BhZ2UiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBEaXNjaXBsaW5lIGRpc2NpcGxpbmU7Ci0JCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBhbGxTdGVwczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVUYXNrc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5UQVNLU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCWRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgY29udGVudEVsZW1lbnQ7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQkJc2V0SXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJLy9yZXR1cm4gKChEaXNjaXBsaW5lKSBvYmplY3QpLmdldFRhc2tzKCkudG9BcnJheSgpOwotCQkJCWlmIChhbGxTdGVwcyA9PSBudWxsKSB7Ci0JCQkJCWFsbFN0ZXBzID0gbmV3IENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCUNvbnRlbnRFbGVtZW50T3JkZXJMaXN0LkNPTlRFTlRfRUxFTUVOVFNfX0ZPUl9FTEVNRU5UX09OTFksCi0JCQkJCQkJZ2V0Q29udGVudENhdGVnb3J5T3JkZXJGZWF0dXJlKCkpOwotCQkJCX0KLQkJCQlMaXN0IHJldHVybkxpc3QgPSBDYXRlZ29yeVNvcnRIZWxwZXIuc29ydENhdGVnb3J5RWxlbWVudHMoY29udGVudEVsZW1lbnQsIAotCQkJCQkJYWxsU3RlcHMudG9BcnJheSgpKTsKLQkJCQlyZXR1cm4gcmV0dXJuTGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJCi0JCQkJLy8JY2hlY2sgdG8gbWFpbnRhaW4gbWFueS10by1vbmUgcnVsZSBmb3IgZG9tYWluLXdvcmtwcm9kdWN0Ci0vLwkJCQlMaXN0IGRpc2NpcGxpbmVzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZXModGFzayk7Ci0vLwkJCQlpZiAoZGlzY2lwbGluZXMgIT0gbnVsbCAmJiBkaXNjaXBsaW5lcy5zaXplKCkgPiAwKQl7Ci0vLwkJCQkJT2JqZWN0IGFzc29jaWF0ZWREaXNjaXBsaW5lID0gZGlzY2lwbGluZXMuZ2V0KDApOwotLy8JCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0Ci0vLwkJCQkJLmZvcm1hdCgKLS8vCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLlVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHMsCi0vLwkJCQkJCQluZXcgT2JqZWN0W10gewotLy8JCQkJCQkJCQl0YXNrLmdldE5hbWUoKSwKLS8vCQkJCQkJCQkJVG5nVXRpbAotLy8JCQkJCQkJCQkJCS5nZXRMYWJlbFdpdGhQYXRoKGFzc29jaWF0ZWREaXNjaXBsaW5lKSwKLS8vCQkJCQkJCQkJZGlzY2lwbGluZS5nZXROYW1lKCkgfSk7Ci0vLwkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dXYXJuaW5nKAotLy8JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsIG1zZyk7Ci0vLwkJCQkJcmV0dXJuOwotLy8JCQkJfQotCQkJCQotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9EaXNjaXBsaW5lKAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBkaXNjaXBsaW5lLCB0YXNrLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUZyb21EaXNjaXBsaW5lKAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBkaXNjaXBsaW5lLCB0YXNrLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGRpc2NpcGxpbmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5UQVNLUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDb250ZW50RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQlpZiAoZ2V0SGVscGVyKCkuaXNDb250cmlidXRvcigoQ29udGVudEVsZW1lbnQpIG9iaikpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgVGFzayk7Ci0JCQl9Ci0JCX07Ci0JfQotCQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q29udGVudENhdGVnb3J5T3JkZXJGZWF0dXJlKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9UYXNrcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TW9kZWxTdHJ1Y3R1cmVQYXRoKCkgewotCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGg7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBnZXRDb250ZW50RWxlbWVudE9yZGVyTGlzdCgpIHsKLQkJcmV0dXJuIGFsbFN0ZXBzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Eb21haW5EZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRG9tYWluRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1OGZmNGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Eb21haW5EZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgRG9tYWluIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImRvbWFpbkRlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRG9tYWluIGRvbWFpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERvbWFpbkRlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZG9tYWluID0gKERvbWFpbikgY29udGVudEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBkb21haW47Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIERvbWFpbik7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gc2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcKLQkJKChDYXRlZ29yeUZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQlkb21haW4pIH0pOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRvbWFpbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5fZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG9tYWluX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0RvbWFpbldvcmtQcm9kdWN0c1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRG9tYWluV29ya1Byb2R1Y3RzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGUxOGM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRG9tYWluV29ya1Byb2R1Y3RzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuV29ya1Byb2R1Y3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1vdmVJbkNhdGVnb3J5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ2F0ZWdvcnlTb3J0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db250ZW50RWxlbWVudE9yZGVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFdvcmsgUHJvZHVjdHMgcGFnZSBpbiB0aGUgRG9tYWluIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBMb2thbmF0aCBKYWdnYQotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIHJlbW92ZSB0aGUgdG8tb25lIFVJIHJlc3RyaWN0aW9uIG9uIHdwLWRvbWlhbiAoUjM5NTM5MCkgMjAwNy0wOC0zMAotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluV29ya1Byb2R1Y3RzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJkb21haW5Xb3JrUHJvZHVjdHNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBEb21haW4gZG9tYWluOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0JCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBhbGxTdGVwczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERvbWFpbldvcmtQcm9kdWN0c1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5XT1JLX1BST0RVQ1RTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZG9tYWluID0gKERvbWFpbikgY29udGVudEVsZW1lbnQ7Ci0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0SXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCS8vcmV0dXJuICgoRG9tYWluKSBvYmplY3QpLmdldFdvcmtQcm9kdWN0cygpLnRvQXJyYXkoKTsKLQkJCQlpZiAoYWxsU3RlcHMgPT0gbnVsbCkgewotCQkJCQlhbGxTdGVwcyA9IG5ldyBDb250ZW50RWxlbWVudE9yZGVyTGlzdCgKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlDb250ZW50RWxlbWVudE9yZGVyTGlzdC5DT05URU5UX0VMRU1FTlRTX19GT1JfRUxFTUVOVF9PTkxZLAotCQkJCQkJCWdldENvbnRlbnRDYXRlZ29yeU9yZGVyRmVhdHVyZSgpKTsKLQkJCQl9Ci0JCQkJTGlzdCByZXR1cm5MaXN0ID0gQ2F0ZWdvcnlTb3J0SGVscGVyLnNvcnRDYXRlZ29yeUVsZW1lbnRzKAotCQkJCQkJY29udGVudEVsZW1lbnQsIGFsbFN0ZXBzLnRvQXJyYXkoKSk7Ci0JCQkJcmV0dXJuIHJldHVybkxpc3QudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVdXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCQkvLyBjaGVjayB0byBtYWludGFpbiBtYW55LXRvLW9uZSBydWxlIGZvciBkb21haW4td29ya3Byb2R1Y3QKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlMaXN0IGRvbWFpbnMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXREb21haW5zKChXb3JrUHJvZHVjdCkgZWxlbWVudCk7Ci0JCQkJaWYgKGRvbWFpbnMgIT0gbnVsbCAmJiBkb21haW5zLnNpemUoKSA+IDApCXsKLQkJCQkJT2JqZWN0IGFzc29jaWF0ZWREb21haW4gPSBkb21haW5zLmdldCgwKTsKLS8vCQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdAotLy8JCQkJCS5mb3JtYXQoCi0vLwkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzLAotLy8JCQkJCQkJbmV3IE9iamVjdFtdIHsKLS8vCQkJCQkJCQkJZWxlbWVudC5nZXROYW1lKCksCi0vLwkJCQkJCQkJCVRuZ1V0aWwKLS8vCQkJCQkJCQkJCQkuZ2V0TGFiZWxXaXRoUGF0aChhc3NvY2lhdGVkRG9tYWluKSwKLS8vCQkJCQkJCQkJZG9tYWluLmdldE5hbWUoKSB9KTsKLS8vCQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd1dhcm5pbmcoCi0vLwkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwgbXNnKTsKLS8vCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCS8vIGNoZWNrIGlmIHRoaXMgb3BlcmF0aW9uIHdpbGwgbW9kaWZ5IHRoZSBlbGVtZW50IGluIG9wcG9zaXRlCi0JCQkJLy8gZmVhdHVyZSB2YWx1ZQotCQkJCS8vCQotLy8JCQkJaWYgKCFVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnlPcHBvc2l0ZShkb21haW4sCi0vLwkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKSwgZWxlbWVudCkpIHsKLS8vCQkJCQlyZXR1cm47Ci0vLwkJCQl9Ci0JCQl9Ci0KLQkJCWFjdGlvbk1ncgotCQkJCQkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGRvbWFpbiwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW5fV29ya1Byb2R1Y3RzKCksCi0JCQkJCQkJYWRkSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgZG9tYWluLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW5fV29ya1Byb2R1Y3RzKCksIHJtSXRlbXMsIC0xKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGRvbWFpbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBXb3JrUHJvZHVjdEZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQkJaWYgKGdldEhlbHBlcigpLmlzQ29udHJpYnV0b3IoKENvbnRlbnRFbGVtZW50KSBvYmopKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5Xb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENvbnRlbnRDYXRlZ29yeU9yZGVyRmVhdHVyZSgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldE1vZGVsU3RydWN0dXJlUGF0aCgpIHsKLQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGdldENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KCkgewotCQlyZXR1cm4gYWxsU3RlcHM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0d1aWRhbmNlRGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0d1aWRhbmNlRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYWY0YzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9HdWlkYW5jZURlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgaW4gYSBHdWlkYW5jZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImd1aWRhbmNlRGVzY3JpcHRpb25QYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIEd1aWRhbmNlIGd1aWRhbmNlOwotCi0JcHJpdmF0ZSBTdHJpbmcgZWxlbWVudExhYmVsOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9jb250ZW50OwotCi0JcHJpdmF0ZSBpbnQgY29udGVudEZpZWxkSGVpZ2h0ID0gNDAwOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCWd1aWRhbmNlID0gKEd1aWRhbmNlKSBjb250ZW50RWxlbWVudDsKLQkJZWxlbWVudExhYmVsID0gTGlicmFyeVVJVGV4dC5nZXRVSVRleHQoZ3VpZGFuY2UpOwotCQlzZXRFbGVtZW50VHlwZU9uKHRydWUpOwotCQlpZiAoZ3VpZGFuY2UgaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbikKLQkJCXNldEJyaWVmRGVzY09uKGZhbHNlKTsKLQkJc2V0RnVsbERlc2NPbihmYWxzZSk7Ci0JCXNldEtleUNvbnNpZGVyYXRpb25PbihmYWxzZSk7Ci0JCXNldEljb25TZWN0aW9uT24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Rm9ybVByZWZpeCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGb3JtUHJlZml4KCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcihMaWJyYXJ5VUlUZXh0LlRFWFRfR1VJREFOQ0UpCi0JCQkJLmFwcGVuZCgiICgiKS5hcHBlbmQoZWxlbWVudExhYmVsKS5hcHBlbmQoIik6ICIpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBlZGl0b3IgdGFiIGNvbnRlbnQKLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdG9yQ29udGVudCh0b29sa2l0KTsKLQkJY3RybF9jb250ZW50ID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuTUFJTl9ERVNDUklQVElPTl9URVhULAotCQkJCWNvbnRlbnRGaWVsZEhlaWdodCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCi0JCWZpbmFsIE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCi0JCWN0cmxfY29udGVudC5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfY29udGVudC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpKTsKLQkJY3RybF9jb250ZW50LmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfY29udGVudC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfY29udGVudDsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gZ3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCkKLQkJCQkJCS5nZXRNYWluRGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjcmVmcmVzaChib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goYm9vbGVhbiBlZGl0YWJsZSkgewotCQlzdXBlci5yZWZyZXNoKGVkaXRhYmxlKTsKLQkJY3RybF9jb250ZW50LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkRGF0YSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERhdGEoKSB7Ci0JCXN1cGVyLmxvYWREYXRhKCk7Ci0JCWlmIChndWlkYW5jZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY29udGVudCA9IG51bGw7Ci0JCQlpZiAoZ3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCkgIT0gbnVsbCkgewotCQkJCWNvbnRlbnQgPSBndWlkYW5jZS5nZXRQcmVzZW50YXRpb24oKS5nZXRNYWluRGVzY3JpcHRpb24oKTsKLQkJCX0KLQkJCWN0cmxfY29udGVudC5zZXRUZXh0KGNvbnRlbnQgPT0gbnVsbCA/ICIiIDogY29udGVudCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gZ3VpZGFuY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaGVpZ2h0IG9mIHRoZSBNYWluIERlc2NyaXB0aW9uIHRleHQgYm94LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudEZpZWxkSGVpZ2h0KCkgewotCQlyZXR1cm4gY29udGVudEZpZWxkSGVpZ2h0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGhlaWdodCBvZiB0aGUgTWFpbiBEZXNjcmlwdGlvbiB0ZXh0IGJveC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50RmllbGRIZWlnaHQoaW50IGNvbnRlbnRGaWVsZEhlaWdodCkgewotCQl0aGlzLmNvbnRlbnRGaWVsZEhlaWdodCA9IGNvbnRlbnRGaWVsZEhlaWdodDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgQ29udGVudEZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQkJcmV0dXJuICgoKENvbnRlbnRFbGVtZW50KSBvYmopLmdldFR5cGUoKQotCQkJCQkJCS5lcXVhbHMoKChHdWlkYW5jZSkgY29udGVudEVsZW1lbnQpLmdldFR5cGUoKSkpOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gU2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcuCi0JCSgoQ29udGVudEZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQlndWlkYW5jZSkgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgV2hpdGVwYXBlcil7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy53aGl0ZXBhcGVyX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy53aGl0ZXBhcGVyX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy53aGl0ZXBhcGVyX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMud2hpdGVwYXBlcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLndoaXRlcGFwZXJfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29uY2VwdCl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb25jZXB0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb25jZXB0X2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb25jZXB0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uY2VwdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmNlcHRfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ2hlY2tsaXN0KXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNoZWNrbGlzdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hlY2tsaXN0X2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGVja2xpc3RfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGVja2xpc3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGVja2xpc3RfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRXhhbXBsZSl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5leGFtcGxlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5leGFtcGxlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5leGFtcGxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXhhbXBsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4YW1wbGVfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgR3VpZGVsaW5lKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmd1aWRlbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ3VpZGVsaW5lX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5ndWlkZWxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5ndWlkZWxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5ndWlkZWxpbmVfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVzdGltYXRpb25jb25zaWRlcmF0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVzdGltYXRpb25jb25zaWRlcmF0aW9uX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFByYWN0aWNlKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdXBwb3J0aW5nbWF0ZXJpYWxfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN1cHBvcnRpbmdtYXRlcmlhbF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3VwcG9ydGluZ21hdGVyaWFsX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3VwcG9ydGluZ21hdGVyaWFsX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3VwcG9ydGluZ21hdGVyaWFsX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlcG9ydCl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXBvcnRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlcG9ydF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwb3J0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwb3J0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwb3J0X2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJvYWRtYXApewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9hZG1hcF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9hZG1hcF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9hZG1hcF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvYWRtYXBfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2FkbWFwX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRlbXBsYXRlKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlbXBsYXRlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50ZW1wbGF0ZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50ZW1wbGF0ZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlbXBsYXRlX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlcm1kZWZpbml0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50ZXJtZGVmaW5pdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGVybWRlZmluaXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50ZXJtZGVmaW5pdGlvbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlcm1kZWZpbml0aW9uX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVzdWFibGVhc3NldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVzdWFibGVhc3NldF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVzdWFibGVhc3NldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlc3VhYmxlYXNzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXVzYWJsZWFzc2V0X2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRvb2xNZW50b3IpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbG1lbnRvcl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbG1lbnRvcl9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbG1lbnRvcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xtZW50b3JfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50b29sbWVudG9yX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0d1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0d1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMThjYzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9HdWlkYW5jZVdpdGhBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuTmV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLkFkZExpbmtEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBpbiBhIEd1aWRhbmNlICh3aXRoIGF0dGFjaG1lbnRzKSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgTG9rYW5hdGggSmFnZ2EKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZVdpdGhBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZSBleHRlbmRzIEd1aWRhbmNlRGVzY3JpcHRpb25QYWdlIHsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfYXR0YWNoLCBjdHJsX2RldGFjaCwgY3RybF9hdHRhY2hfdXJsIDsgLy9jdHJsX3JlbW92ZSA7Ci0KLQlwcml2YXRlIExpc3QgY3RybF9hdHRhY2hlZF9maWxlczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlEQU5DRV9BVFRBQ0hNRU5UX0xBU1RfRElSRUNUT1JZX0JST1dTRURfUFJFRiA9ICJndWlkYW5jZV9hdHRhY2htZW50X2xhc3RfZGlyX2Jyb3dzZWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBHdWlkYW5jZVdpdGhBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZSNjcmVhdGVFZGl0b3JDb250ZW50KG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRvckNvbnRlbnQodG9vbGtpdCk7Ci0KLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQVRUQUNIRURfRklMRV9URVhULCAyKTsKLQkJY3RybF9hdHRhY2hlZF9maWxlcyA9IG5ldyBMaXN0KGdlbmVyYWxDb21wb3NpdGUsIFNXVC5TSU5HTEUKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGxpc3RHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuQkVHSU5OSU5HLAotCQkJCXRydWUsIHRydWUpOwotCQlsaXN0R3JpZERhdGEuaGVpZ2h0SGludCA9IDMwOwotCQlsaXN0R3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotCQljdHJsX2F0dGFjaGVkX2ZpbGVzLnNldExheW91dERhdGEobGlzdEdyaWREYXRhKTsKLQotCQljdHJsX2F0dGFjaGVkX2ZpbGVzLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLAotCQkJCUZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQotCQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJZ3JpZERhdGEudmVydGljYWxTcGFuID0gMTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQotCQljdHJsX2F0dGFjaCA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBidXR0b25Db21wb3NpdGUsIEFUVEFDSF9CVVRUT04pOwotCQljdHJsX2F0dGFjaF91cmwgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgYnV0dG9uQ29tcG9zaXRlLCBBVFRBQ0hfVVJMX0JVVFRPTik7Ci0JCWN0cmxfZGV0YWNoID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIGJ1dHRvbkNvbXBvc2l0ZSwgREVUQUNIX0JVVFRPTik7Ci0JCQotCQlsYWJlbF9iYXNlLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LkJBU0VfRUxFTUVOVF9URVhUKTsKLQotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCi0JCWZpbmFsIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJLmdldEFjdGlvbk1hbmFnZXIoKTsKLQotCQljdHJsX2F0dGFjaC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpKTsKLQkJCQlkaWFsb2cKLQkJCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmF0dGFjaEd1aWRhbmNlRmlsZURpYWxvZ190aXRsZSk7IAotCQkJCVN0cmluZyBsYXN0RGlyID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCQkJLmdldFN0cmluZygKLQkJCQkJCQkJR1VJREFOQ0VfQVRUQUNITUVOVF9MQVNUX0RJUkVDVE9SWV9CUk9XU0VEX1BSRUYpOwotCQkJCWlmIChsYXN0RGlyICE9IG51bGwgJiYgbGFzdERpci50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGxhc3REaXIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKFJlc291cmNlSGVscGVyLmdldEZvbGRlckFic29sdXRlUGF0aChndWlkYW5jZSkpOwotCQkJCX0KLQkJCQlkaWFsb2cub3BlbigpOwotCQkJCWlmIChkaWFsb2cuZ2V0RmlsZU5hbWUoKSAhPSBudWxsICYmIGRpYWxvZy5nZXRGaWxlTmFtZSgpICE9ICIiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdHJ5IHsKLQkJCQkJCUZpbGUgZmlsZVRvQXR0YWNoID0gbmV3IEZpbGUoZGlhbG9nLmdldEZpbHRlclBhdGgoKSwKLQkJCQkJCQkJZGlhbG9nLmdldEZpbGVOYW1lKCkpOwotCQkJCQkJU3RyaW5nIGZpbGVVcmwgPSBMaWJyYXJ5VUlVdGlsLmdldFVSTEZvckF0dGFjaG1lbnQoY3RybF9hdHRhY2guZ2V0U2hlbGwoKSwKLQkJCQkJCQkJZmlsZVRvQXR0YWNoLCBndWlkYW5jZSwgdHJ1ZSk7Ci0JCQkJCQlpZiAoZmlsZVVybCA9PSBudWxsKSB7Ci0JCQkJCQkJLy8gdXNlciBoaXQgY2FuY2VsIG9uIFJlbmFtZUZpbGVDb25mbGljdERpYWxvZwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCWlmIChjdHJsX2F0dGFjaGVkX2ZpbGVzLmluZGV4T2YoZmlsZVVybCkgIT0gLTEpIHsKLQkJCQkJCQkvLyBmaWxlIGlzIGFscmVhZHkgYW4gYXR0YWNobWVudAotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXR0YWNobWVudERpYWxvZ2F0dGFjaEZpbGVfdGV4dCwgCi0JCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1zX0d1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlX2FscmVhZHlBdHRhY2hlZF9tc2cpOyAKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQljdHJsX2F0dGFjaGVkX2ZpbGVzLmFkZChmaWxlVXJsKTsKLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJZ3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKSwKLQkJCQkJCQkJZ2V0RmlsZXNGcm9tTGlzdEN0cmwoKSwgLTEpOwotCQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkJCQkJCS5zZXRWYWx1ZSgKLQkJCQkJCQkJCQkJR1VJREFOQ0VfQVRUQUNITUVOVF9MQVNUX0RJUkVDVE9SWV9CUk9XU0VEX1BSRUYsCi0JCQkJCQkJCQkJCWRpYWxvZy5nZXRGaWx0ZXJQYXRoKCkpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gVE9ETzogRGlzcGxheSBhbiBlcnJvciBkaWFsb2cuCi0JCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9hdHRhY2hfdXJsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUFkZExpbmtEaWFsb2cgZGlhbG9nID0gbmV3IEFkZExpbmtEaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJCQotCQkJCQlpZiggZGlhbG9nLmdldExpbmsoKSAhPSBudWxsKSB7IAotCQkJCQkJCi0JCQkJCQl0cnkgewotCQkJCQkJCVN0cmluZyBsaW5rVXJsID0gZGlhbG9nLmdldExpbmsoKS5nZXRVUkwoKTsKLQkJCQkJCQlTdHJpbmcgbGlua05hbWUgPSBkaWFsb2cuZ2V0TGluaygpLmdldE5hbWUoKTsKLQkJCQkJCQlpZiAobGlua05hbWUgPT0gbnVsbCB8fCBsaW5rTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCQlsaW5rTmFtZSA9IEZpbGVVdGlsLmdldEZpbGVOYW1lKGxpbmtVcmwpOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlVUkwgdXJsID0gbmV3IFVSTChsaW5rVXJsKTsKLQkJCQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSB7Ci0JCQkJCQkJCWlmIChtdWUuZ2V0TWVzc2FnZSgpLnN0YXJ0c1dpdGgoIm5vIHByb3RvY29sIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJbGlua1VybCA9IE5ldFV0aWwuSFRUUF9VUklfUFJFRklYICsgbGlua1VybDsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlTdHJpbmcgdXJsU3RyaW5nID0gIjxhIGhyZWY9XCIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKFBsYXRmb3JtLmdldE9TKCkuZXF1YWxzKFBsYXRmb3JtLldTX1dJTjMyKSkgewotCQkJCQkJCQl1cmxTdHJpbmcgKz0gTmV0VXRpbAotCQkJCQkJCQkJCS5lbmNvZGVGaWxlVVJMKGxpbmtVcmwpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXVybFN0cmluZyArPSBOZXRVdGlsLmVuY29kZUZpbGVVUkwobGlua1VybCk7Ci0JCQkJCQkJfQotCQkJCQkJCXVybFN0cmluZyArPSAiXCI+IiArIGxpbmtOYW1lICsgIjwvYT4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQlsaW5rVXJsID0gdXJsU3RyaW5nOwotCQkJCQkJCS8vU3RyaW5nIGxpbmtEaXNwbGF5TmFtZSA9IGRpYWxvZy5nZXRMaW5rKCkuZ2V0TmFtZSgpOwkJCQkJCQkKLQkJCQkJCQkKLQkJCQkJCQlpZiAobGlua1VybCA9PSBudWxsKSB7Ci0JCQkJCQkJCS8vIHVzZXIgaGl0IGNhbmNlbCBvbiBBZGRMaW5rRGlhbG9nCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGN0cmxfYXR0YWNoZWRfZmlsZXMuaW5kZXhPZihsaW5rVXJsKSAhPSAtMSkgewotCQkJCQkJCQkvLyBJZiBsaW5rIGFscmVhZHkgZXhpc3RzCi0JCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkF0dGFjaG1lbnREaWFsb2dhdHRhY2hVcmxfdGV4dCwgCi0JCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5mb3Jtc19HdWlkYW5jZVdpdGhVcmxBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnKTsgCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQkJY3RybF9hdHRhY2hlZF9maWxlcy5hZGQobGlua1VybCk7Ci0JCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJZ3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50cygpLAotCQkJCQkJCQkJZ2V0RmlsZXNGcm9tTGlzdEN0cmwoKSwgLTEpOwotCQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkvLyBUT0RPOiBEaXNwbGF5IGFuIGVycm9yIGRpYWxvZy4KLQkJCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQljdHJsX2RldGFjaC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljdHJsX2F0dGFjaGVkX2ZpbGVzLnJlbW92ZShjdHJsX2F0dGFjaGVkX2ZpbGVzCi0JCQkJCQkuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJZ3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCksCi0JCQkJCQlnZXRGaWxlc0Zyb21MaXN0Q3RybCgpLCAtMSk7Ci0KLQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkvLyBjdHJsX2F0dGFjaGVkX2ZpbGVzLnNldFRleHQob2xkQ29udGVudCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGN0cmxfcmVtb3ZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCS8vIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJLy8gLy9jdHJsX2F0dGFjaGVkX2ZpbGVzLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIFN0cmluZyBvbGRDb250ZW50ID0KLQkJLy8gKChHdWlkYW5jZURlc2NyaXB0aW9uKWd1aWRhbmNlLmdldFByZXNlbnRhdGlvbigpKS5nZXRBdHRhY2htZW50cygpOwotCQkvLyBjdHJsX2F0dGFjaGVkX2ZpbGVzLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJLy8gZ3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCksCi0JCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKSwKLQkJLy8gY3RybF9hdHRhY2hlZF9maWxlcy5nZXRUZXh0KCksIC0xKTsKLQkJLy8gaWYoIXN0YXR1cyl7Ci0JCS8vIC8vY3RybF9hdHRhY2hlZF9maWxlcy5zZXRUZXh0KG9sZENvbnRlbnQpOwotCQkvLyByZXR1cm47Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjcmVmcmVzaChib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goYm9vbGVhbiBlZGl0YWJsZSkgewotCQlzdXBlci5yZWZyZXNoKGVkaXRhYmxlKTsKLQkJY3RybF9hdHRhY2guc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfYXR0YWNoX3VybC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF9kZXRhY2guc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQotCQkvLyBjdHJsX3JlbW92ZS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIGluaXRpYWwgZGF0YSBmcm9tIG1vZGVsCi0JICoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjbG9hZERhdGEoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWREYXRhKCkgewotCQlzdXBlci5sb2FkRGF0YSgpOwotCQlpZiAoZ3VpZGFuY2UgIT0gbnVsbCkgewotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQ29udGVudERlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQlTdHJpbmcgdGhpcmRwYXJ0eWZvcm1hdCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uKSBjb250ZW50KQotCQkJCQkuZ2V0QXR0YWNobWVudHMoKTsKLQkJCXNldEZpbGVzVG9MaXN0Q3RybCh0aGlyZHBhcnR5Zm9ybWF0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgc3RyaW5nIG9mIGZpbGVzLCBhZGQgdGhlIGZpbGVzIHRvIHRoZSBMaXN0IGNvbnRyb2wKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0RmlsZXNUb0xpc3RDdHJsKFN0cmluZyBmaWxlU3RyaW5nKSB7Ci0JCWphdmEudXRpbC5MaXN0IGF0dGFjaG1lbnRMaXN0ID0gVG5nVXRpbAotCQkJCS5jb252ZXJ0R3VpZGFuY2VBdHRhY2htZW50c1RvTGlzdChmaWxlU3RyaW5nKTsKLQkJY3RybF9hdHRhY2hlZF9maWxlcy5yZW1vdmVBbGwoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRhY2htZW50TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBhdHRhY2htZW50ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQljdHJsX2F0dGFjaGVkX2ZpbGVzLmFkZChhdHRhY2htZW50KTsKLQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyB0aGUgbGlzdCBvZiBmaWxlcyBhcyBhIHN0cmluZwotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRGaWxlc0Zyb21MaXN0Q3RybCgpIHsKLQkJU3RyaW5nIGZpbGVzW10gPSBjdHJsX2F0dGFjaGVkX2ZpbGVzLmdldEl0ZW1zKCk7Ci0JCXJldHVybiBUbmdVdGlsLmNvbnZlcnRHdWlkYW5jZUF0dGFjaG1lbnRzVG9TdHJpbmcoQXJyYXlzLmFzTGlzdChmaWxlcykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9JQ29sdW1uUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvSUNvbHVtblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNzBmY2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9JQ29sdW1uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gYmUgdXNlZCBhZGQgY29sdW1ucyBvbiBkZXNjcmlwdGlvbiB0YWIgb2YgYWxsIGVkaXRvcnMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29sdW1uUHJvdmlkZXIgICB7Ci0KLQkvKioKLQkgKiBTZXQgY29tcG9zaXRlIGZvciBjb2x1bW4KLQkgKiBAcGFyYW0gcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgc2V0Q29sdW1uKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQpOwotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9JRXh0ZW5zaW9uRm9ybVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvSUV4dGVuc2lvbkZvcm1QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZTJlYzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9JRXh0ZW5zaW9uRm9ybVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuSUZvcm1QYWdlOwotCi0vKioKLSAqIEludGVyZmFjZSB0byBiZSB1c2VkIGZvciBhbGwgcGFnZXMgYWRkZWQgdGhyb3VnaCBleHRlbnNpb24gcG9pbnRzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUV4dGVuc2lvbkZvcm1QYWdlICAgewotCi0JLyoqCi0JICogU2V0IGVkaXRvciBmb3IgZm9ybSBwYWdlCi0JICogQHBhcmFtIGVkaXRvcgotCSAqLwotCXB1YmxpYyBJRm9ybVBhZ2Ugc2V0RWRpdG9yKEZvcm1FZGl0b3IgZWRpdG9yKSA7Ci0JCi0JLyoqCi0JICogU2V0IGlucHV0IGZvciBmb3JtIHBhZ2UKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9JUmVmcmVzaGFibGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvSVJlZnJlc2hhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYTZhNDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9JUmVmcmVzaGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLS8qKgotICogSW50ZXJmYWNlIHVzZWQgdG8gcmVmcmVzaCBhIGZvcm0gdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW4gY2FzZSBvZiBtb2RlbCBjaGFuZ2Ugb3V0c2lkZSBvZiB0aGUgZm9ybQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZnJlc2hhYmxlIHsKLQkKLQkvKioKLQkgKiBSZWZyZXNoIG5hbWUgb2YgdGhlIGZvcm0KLQkgKiBAcGFyYW0gbmV3TmFtZQotCSAqLwotCXZvaWQgcmVmcmVzaE5hbWUoU3RyaW5nIG5ld05hbWUpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9NZXRob2RGb3JtVG9vbGtpdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9NZXRob2RGb3JtVG9vbGtpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjQ1MmE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvTWV0aG9kRm9ybVRvb2xraXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZFJpY2hUZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLQotLyoqCi0gKiBBIGhlbHAgY2xhc3MgZm9yIGNyZWF0aW5nIFVJIHdpZGdldHMgYWRhcHRlZCBhZGFwdGVkIHRvIHdvcmsgaW4gRWNsaXBzZQotICogZm9ybXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRm9ybVRvb2xraXQgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIFJpY2ggVGV4dCBjb250cm9sIGFuZCBhZGFwdHMgaXQgdG8gYmUgdXNlZCBpbiBhIGZvcm0uCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250cm9sLgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgaW5pdGlhbCB0ZXh0IGZvciB0aGUgdmlld2VyLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIGluaXRpYWwgc3R5bGUgZm9yIHRoZSB2aWV3ZXIuCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICBUaGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBocmVmcy4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPklNZXRob2RSaWNoVGV4dDwvY29kZT4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJTWV0aG9kUmljaFRleHQgY3JlYXRlUmljaFRleHQoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUsIFN0cmluZyBiYXNlUGF0aCwKLQkJCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCwgTGFiZWwgbGFiZWwpIHsKLQkJSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0ID0gTWV0aG9kUmljaFRleHRGYWN0b3J5LmNyZWF0ZU1ldGhvZFJpY2hUZXh0KHBhcmVudCwgc3R5bGUsIGJhc2VQYXRoKTsKLQkJcmljaFRleHQuaW5pdEVsZW1lbnRBbmRMYWJlbChtZXRob2RFbGVtZW50LCBsYWJlbCk7Ci0JCXJpY2hUZXh0LmdldENvbnRyb2woKS5zZXREYXRhKEZvcm1Ub29sa2l0LktFWV9EUkFXX0JPUkRFUiwKLQkJCQlGb3JtVG9vbGtpdC5URVhUX0JPUkRFUik7Ci0JCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldEluaXRpYWxUZXh0KHRleHQpOwotCQl9Ci0JCXJldHVybiByaWNoVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgUmljaCBUZXh0IGVkaXRvciBhbmQgYWRhcHRzIGl0IHRvIGJlIHVzZWQgaW4gYSBmb3JtLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udHJvbC4KLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIGluaXRpYWwgdGV4dCBmb3IgdGhlIHZpZXdlci4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBpbml0aWFsIHN0eWxlIGZvciB0aGUgdmlld2VyLgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgaHJlZnMuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5JTWV0aG9kUmljaFRleHRFZGl0b3I8L2NvZGU+IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1ldGhvZFJpY2hUZXh0RWRpdG9yIGNyZWF0ZVJpY2hUZXh0RWRpdG9yKAotCQkJRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzdHlsZSwKLQkJCVN0cmluZyBiYXNlUGF0aCwgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50LCBMYWJlbCBsYWJlbCwgSUVkaXRvclNpdGUgZWRpdG9yU2l0ZSkgewotCQlJTWV0aG9kUmljaFRleHRFZGl0b3IgZWRpdG9yID0gTWV0aG9kUmljaFRleHRGYWN0b3J5LmNyZWF0ZU1ldGhvZFJpY2hUZXh0RWRpdG9yKHBhcmVudCwgc3R5bGUsCi0JCQkJYmFzZVBhdGgsIGVkaXRvclNpdGUsIG1ldGhvZEVsZW1lbnQsIGxhYmVsKTsKLQkJZWRpdG9yLmdldENvbnRyb2woKS5zZXREYXRhKEZvcm1Ub29sa2l0LktFWV9EUkFXX0JPUkRFUiwKLQkJCQlGb3JtVG9vbGtpdC5URVhUX0JPUkRFUik7Ci0JCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCWVkaXRvci5zZXRJbml0aWFsVGV4dCh0ZXh0KTsKLQkJfQotCQlyZXR1cm4gZWRpdG9yOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmY3YzM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TY3JvbGxlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcExheW91dDsKLQotCi0vKioKLSAqIERlc2NyaXB0aW9uIHBhZ2UgZm9yIG1ldGhvZCBsaWJyYXJ5Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZSBleHRlbmRzIEZvcm1QYWdlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQgPSAyOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfbmFtZTsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmX2Rlc2M7Ci0KLQlwcml2YXRlIFNlY3Rpb24gZ2VuZXJhbFNlY3Rpb247Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBnZW5lcmFsQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGxpYnJhcnk7Ci0KLQlwcml2YXRlIFRleHQgdGV4dEF1dGhvcnM7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9jaGFuZ2VfZGF0ZTsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2NoYW5nZV9kZXNjOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfdmVyc2lvbjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2NvcHlyaWdodDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKAotCQkJCWVkaXRvciwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvblBhZ2VfdGl0bGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlc2NyaXB0aW9uUGFnZV90aXRsZSk7IAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQotCQkvLyBnZXQgTWV0aG9kTGlicmFyeSBvYmplY3QgZnJvbSBFZGl0b3IgaW5wdXQKLQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IG1ldGhvZEVsZW1lbnRJbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0OwotCi0JCU9iamVjdCBvYmogPSBtZXRob2RFbGVtZW50SW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJbGlicmFyeSA9IChNZXRob2RMaWJyYXJ5KSBvYmo7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBmb3JtIGNvbnRlbnQuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjY3JlYXRlRm9ybUNvbnRlbnQob3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQkvLyBjcmVhdGUgZm9ybSB0b29sa2l0Ci0JCVNjcm9sbGVkRm9ybSBmb3JtID0gbWFuYWdlZEZvcm0uZ2V0Rm9ybSgpOwotCQlGb3JtVG9vbGtpdCB0b29sa2l0ID0gbWFuYWdlZEZvcm0uZ2V0VG9vbGtpdCgpOwotCQlmb3JtLnNldFRleHQoZ2V0RWRpdG9yKCkuZ2V0UGFydE5hbWUoKSk7Ci0KLQkJVGFibGVXcmFwTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZVdyYXBMYXlvdXQoKTsKLQkJZm9ybS5nZXRCb2R5KCkuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gQ3JlYXRlIGVkaXRvciBjb250ZW50Ci0JCWNyZWF0ZUVkaXRvckNvbnRlbnQodG9vbGtpdCwgZm9ybS5nZXRCb2R5KCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlZGl0b3IgdGFiIGNvbnRlbnQKLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqIEBwYXJhbSBlZGl0b3JDb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIGVkaXRvckNvbXBvc2l0ZSkgewotCQkvLyBDcmVhdGUgR2VuZXJhbCBJbmZvcm1hdGlvbiBzZWN0aW9uCi0JCWdlbmVyYWxTZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGVkaXRvckNvbXBvc2l0ZSwKLQkJCQlTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRAotCQkJCQkJfCBTZWN0aW9uLlRJVExFX0JBUik7Ci0JCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQlnZW5lcmFsU2VjdGlvbgotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fdGl0bGUpOyAKLQkJZ2VuZXJhbFNlY3Rpb24KLQkJCQkuc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl9kZXNjcmlwdGlvbik7IAotCQlnZW5lcmFsU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJZ2VuZXJhbENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxTZWN0aW9uKTsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0Q2xpZW50KGdlbmVyYWxDb21wb3NpdGUpOwotCi0JCS8vIG5hbWUKLQkJTGFiZWwgbF9uYW1lID0gdG9vbGtpdC5jcmVhdGVMYWJlbChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5hbWVfdGV4dCk7IAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWxfbmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfbmFtZSA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIiwgU1dULlNJTkdMRSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQljdHJsX25hbWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQkvLyBicmllZiBkZXNjCi0JCUxhYmVsIGxfYnJpZWZfZGVzYyA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvbl90ZXh0KTsgCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJbF9icmllZl9kZXNjLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9icmllZl9kZXNjID0gdG9vbGtpdC5jcmVhdGVUZXh0KGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJIiIsIFNXVC5NVUxUSSB8IFNXVC5XUkFQKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDQwOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNDAwOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCS8vIEF1dGhvcnMKLQkJTGFiZWwgbGFiZWwgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXV0aG9yc190ZXh0KTsgCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQl0ZXh0QXV0aG9ycyA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCSIiLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA0MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQl0ZXh0QXV0aG9ycy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCS8vIENoYW5nZSBEYXRlCi0JCUxhYmVsIGxfY2hhbmdlZGF0ZSA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJbF9jaGFuZ2VkYXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9jaGFuZ2VfZGF0ZSA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCSIiLCBTV1QuUkVBRF9PTkxZKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWN0cmxfY2hhbmdlX2RhdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQkvLyBBdXRob3JzCi0JCUxhYmVsIGxfY2hhbmdlX2Rlc2MgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkNIQU5HRV9ERVNDUklQVElPTl9URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQlsX2NoYW5nZV9kZXNjLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9jaGFuZ2VfZGVzYyA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIiwgU1dULk1VTFRJKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDQwOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWN0cmxfY2hhbmdlX2Rlc2Muc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQkvLyBWZXJzaW9uCi0JCUxhYmVsIGxfdmVyc2lvbiA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuVkVSU0lPTl9URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQlsX3ZlcnNpb24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQljdHJsX3ZlcnNpb24gPSB0b29sa2l0LmNyZWF0ZVRleHQoZ2VuZXJhbENvbXBvc2l0ZSwgIiIsIFNXVC5NVUxUSSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQljdHJsX3ZlcnNpb24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJTGFiZWwgbF9jb3B5cmlnaHQgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29weXJpZ2h0X3RleHQpOyAKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQlsX2NvcHlyaWdodC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQljdHJsX2NvcHlyaWdodCA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA0MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQljdHJsX2NvcHlyaWdodC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGdlbmVyYWxDb21wb3NpdGUpOwotCi0JCWFkZExpc3RlbmVycygpOwotCQlsb2FkRGF0YSgpOwotCi0JCS8vIFNldCBmb2N1cyBvbiB0aGUgbmFtZSBhdHRyaWJ1dGUKLQkJRGlzcGxheSBkaXNwbGF5ID0gZWRpdG9yQ29tcG9zaXRlLmdldERpc3BsYXkoKTsKLQkJaWYgKCEoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgaW5pdGlhbCBkYXRhIGZyb20gbW9kZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERhdGEoKSB7Ci0JCVN0cmluZyBuYW1lID0gbGlicmFyeS5nZXROYW1lKCk7Ci0JCVN0cmluZyBicmllZl9kZXNjID0gbGlicmFyeS5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0KLQkJY3RybF9uYW1lLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwobmFtZSkpOwotCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChicmllZl9kZXNjKSk7Ci0JCXRleHRBdXRob3JzLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwobGlicmFyeS5nZXRBdXRob3JzKCkpKTsKLQkJaWYgKGxpYnJhcnkuZ2V0Q2hhbmdlRGF0ZSgpICE9IG51bGwpIHsKLQkJCWN0cmxfY2hhbmdlX2RhdGUuc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChsaWJyYXJ5LmdldENoYW5nZURhdGUoKQotCQkJCQkudG9Mb2NhbGVTdHJpbmcoKSkpOwotCQl9Ci0JCWN0cmxfY2hhbmdlX2Rlc2Muc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChsaWJyYXJ5Ci0JCQkJLmdldENoYW5nZURlc2NyaXB0aW9uKCkpKTsKLQkJY3RybF92ZXJzaW9uLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwobGlicmFyeS5nZXRWZXJzaW9uKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgZm9jdXMgbGlzdGVuZXJzCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJY3RybF9uYW1lLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlsaWJyYXJ5LnNldE5hbWUoY3RybF9uYW1lLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYnJpZWZfZGVzYy5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJbGlicmFyeS5zZXRCcmllZkRlc2NyaXB0aW9uKGN0cmxfYnJpZWZfZGVzYy5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQotCQl0ZXh0QXV0aG9ycy5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJbGlicmFyeS5zZXRBdXRob3JzKHRleHRBdXRob3JzLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfY2hhbmdlX2Rlc2MuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWxpYnJhcnkuc2V0Q2hhbmdlRGVzY3JpcHRpb24oY3RybF9jaGFuZ2VfZGVzYy5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX3ZlcnNpb24uYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWxpYnJhcnkuc2V0VmVyc2lvbihjdHJsX3ZlcnNpb24uZ2V0VGV4dCgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9jb3B5cmlnaHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9NZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvTWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YzdlN2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9NZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuVmlld0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlJlbW92ZVJlZmVyZW5jZXNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWlzYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5QbHVnaW5SZWZlcmVuY2VDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotCi0vKioKLSAqIERlc2NyaXB0aW9uIHBhZ2UgZm9yIG1ldGhvZCBwbHVnaW4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIGZpeCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NjM4MgotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSBpbXBsZW1lbnRzIElSZWZyZXNoYWJsZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QUkVGSVggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfTUVUSE9EX1BMVUdJTgotCQkJKyAiOiAiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFRleHQgY3RybF9yX2JyaWVmX2Rlc2M7Ci0KLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgY3RybF9yZWZNb2RlbDsKLQotCXByaXZhdGUgU2VjdGlvbiByZWZNb2RlbFNlY3Rpb247Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSByZWZNb2RlbENvbXBvc2l0ZTsKLQotCXByaXZhdGUgTWV0aG9kUGx1Z2luIHBsdWdpbjsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfY2hhbmdlYWJsZTsKLQotCXB1YmxpYyBib29sZWFuIG5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXIgdXNlckNoYW5nZWFibGVBZGFwdGVyOwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBuYW1lTW9kaWZ5TGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSwKLQkJCQlBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0KLQkJdXNlckNoYW5nZWFibGVBZGFwdGVyID0gbmV3IFVzZXJDaGFuZ2VhYmxlQWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5CYXNlRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBtZXRob2RFbGVtZW50OwotCQlpZiAodXNlckNoYW5nZWFibGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCXBsdWdpbi5lQWRhcHRlcnMoKS5hZGQodXNlckNoYW5nZWFibGVBZGFwdGVyKTsKLQkJfQotCQlkZXRhaWxTZWN0aW9uT24gPSBmYWxzZTsKLQkJZnVsbERlc2NPbiA9IGZhbHNlOwotCQlrZXlDb25zaWRlcmF0aW9uT24gPSBmYWxzZTsKLQkJdmFyaWFiaWxpdHlTZWN0aW9uT24gPSBmYWxzZTsKLQkJCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdG9yQ29udGVudCh0b29sa2l0KTsKLQkJY3JlYXRlUmVmZXJlbmNlQ29udGVudCh0b29sa2l0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlUmVmZXJlbmNlQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCS8vIFJlZiBNb2RlbCBTZWN0aW9uCi0JCXJlZk1vZGVsU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihzZWN0aW9uQ29tcG9zaXRlLAotCQkJCVNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVECi0JCQkJCQl8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJR3JpZERhdGEgdGQxID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXJlZk1vZGVsU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkMSk7Ci0JCXJlZk1vZGVsU2VjdGlvbgotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5SRUZFUkVOQ0VEX1BMVUdJTlNfU0VDVElPTl9OQU1FKTsKLQkJcmVmTW9kZWxTZWN0aW9uCi0JCQkJLnNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJVGV4dC5SRUZFUkVOQ0VEX1BMVUdJTlNfU0VDVElPTl9ERVNDKTsKLQkJcmVmTW9kZWxTZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlyZWZNb2RlbENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHJlZk1vZGVsU2VjdGlvbik7Ci0JCXJlZk1vZGVsQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZWZNb2RlbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJcmVmTW9kZWxTZWN0aW9uLnNldENsaWVudChyZWZNb2RlbENvbXBvc2l0ZSk7Ci0KLQkJVGFibGUgY3RybF90YWJsZSA9IHRvb2xraXQuY3JlYXRlVGFibGUocmVmTW9kZWxDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORwotCQkJCQl8IEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMTAwOwotCQkJY3RybF90YWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfcmVmTW9kZWwgPSBuZXcgQ2hlY2tib3hUYWJsZVZpZXdlcihjdHJsX3RhYmxlKTsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIHBsdWdpbi5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JCWN0cmxfcmVmTW9kZWwuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQotCQlMYWJlbCBsX3JfYnJpZWZfZGVzYyA9IHRvb2xraXQuY3JlYXRlTGFiZWwocmVmTW9kZWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkJSSUVGX0RFU0NSSVBUSU9OX1RFWFQpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJbF9yX2JyaWVmX2Rlc2Muc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQljdHJsX3JfYnJpZWZfZGVzYyA9IHRvb2xraXQuY3JlYXRlVGV4dChyZWZNb2RlbENvbXBvc2l0ZSwKLQkJCQkiIiwgU1dULk1VTFRJIHwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDgwOwotCQkJY3RybF9yX2JyaWVmX2Rlc2Muc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihyZWZNb2RlbENvbXBvc2l0ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENoZWNrYm94Rm9yQ3VycmVudEJhc2UoTGlzdDxNZXRob2RQbHVnaW4+IGN1cnJlbnRCYXNlTGlzdCkgewotCQljdHJsX3JlZk1vZGVsLnNldEFsbENoZWNrZWQoZmFsc2UpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRCYXNlTGlzdC5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIG1vZGVsID0gKE1ldGhvZFBsdWdpbikgY3VycmVudEJhc2VMaXN0LmdldChpKTsKLQkJCWN0cmxfcmVmTW9kZWwuc2V0Q2hlY2tlZChtb2RlbCwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQotCQlmaW5hbCBNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQotCQlmb3JtLmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCS8vIENsZWFyIHRoZSBvbGQgaXRlbXMgYW5kIGFkZCB0aGUgbmV3bHkgYWxsb3dhYmxlIGl0ZW1zLgotCQkJCWN0cmxfcmVmTW9kZWwuZ2V0VGFibGUoKS5jbGVhckFsbCgpOwotCQkJCWN0cmxfcmVmTW9kZWwucmVmcmVzaCgpOwotCi0JCQkJTGlzdCBhbGxvd2FibGVMaXN0ID0gUGx1Z2luUmVmZXJlbmNlQ2hlY2tlcgotCQkJCQkJLmdldEFwcGxpY2FibGVCYXNlUGx1Z2lucyhwbHVnaW4pOwotCQkJCUNvbGxlY3Rpb25zLjxPYmplY3Q+c29ydChhbGxvd2FibGVMaXN0LCBDb21wYXJhdG9ycy5QTFVHSU5QQUNLQUdFX0NPTVBBUkFUT1IpOwotCQkJCWN0cmxfcmVmTW9kZWwuYWRkKGFsbG93YWJsZUxpc3QudG9BcnJheSgpKTsKLQotCQkJCUxpc3Q8TWV0aG9kUGx1Z2luPiBjdXJyZW50QmFzZUxpc3QgPSBwbHVnaW4uZ2V0QmFzZXMoKTsKLQkJCQlzZXRDaGVja2JveEZvckN1cnJlbnRCYXNlKGN1cnJlbnRCYXNlTGlzdCk7Ci0KLQkJCQlpZiAoIXBsdWdpbi5nZXRVc2VyQ2hhbmdlYWJsZSgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCXJlZnJlc2goZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlZnJlc2godHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX25hbWUucmVtb3ZlRm9jdXNMaXN0ZW5lcihuYW1lRm9jdXNMaXN0ZW5lcik7Ci0JCW5hbWVNb2RpZnlMaXN0ZW5lciA9IGVkaXRvci5jcmVhdGVNb2RpZnlMaXN0ZW5lcihwbHVnaW4sIHRydWUpOwotCQljdHJsX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobmFtZU1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9uYW1lLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBwbHVnaW4uZ2V0TmFtZSgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJZS53aWRnZXQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKGN0cmxfbmFtZS5nZXRUZXh0KCkuZXF1YWxzKHBsdWdpbi5nZXROYW1lKCkpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQkvLyBDaGVjayBpbnZhbGlkIGNoYXJhY3RlcnMgZmlyc3QuCi0JCQkJCi0JCQkJLy8gMTc4NDYyCi0JCQkJU3RyaW5nIG1zZyA9IG51bGw7Ci0JCQkJU3RyaW5nIG5hbWUgPSBjdHJsX25hbWUuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChvbGRDb250ZW50LmluZGV4T2YoIiYiKSA8IDAgJiYgbmFtZS5pbmRleE9mKCImIikgPiAtMSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCW1zZyA9IE5MUwotCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjRfbXNnLAotCQkJCQkJCQkJCW5hbWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbXNnID0gTGlicmFyeVV0aWwuY2hlY2tQbHVnaW5OYW1lKG51bGwsIG5hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCVN0cmluZyB2YWxpZE5hbWUgPSBTdHJVdGlsLm1ha2VWYWxpZEZpbGVOYW1lKGN0cmxfbmFtZQotCQkJCQkJLmdldFRleHQoKSk7Ci0JCQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQkJCS8vIENoZWNrIGR1cGxpY2F0ZSBwbHVnLWluIG5hbWUuCi0JCQkJCW1zZyA9IExpYnJhcnlVdGlsLmNoZWNrUGx1Z2luTmFtZShwbHVnaW4sIHZhbGlkTmFtZSk7Ci0JCQkJfQotCQkJCWlmIChtc2cgPT0gbnVsbCkgewotCQkJCQlpZiAoIXZhbGlkTmFtZS5lcXVhbHMocGx1Z2luLmdldE5hbWUoKSkpIHsKLQkJCQkJCVNoZWxsIHNoZWxsID0gZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCQkJCQltc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jb25maXJtUmVuYW1lLCAobmV3IE9iamVjdFtdIHsgcGx1Z2luLmdldE5hbWUoKSwgY3RybF9uYW1lLmdldFRleHQoKSB9KSk7IAotCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWVfdGl0bGU7IAotCQkJCQkJaWYgKCFNZXNzYWdlRGlhbG9nLm9wZW5Db25maXJtKHNoZWxsLCB0aXRsZSwgbXNnKSkgewotCQkJCQkJCWN0cmxfbmFtZS5zZXRUZXh0KHBsdWdpbi5nZXROYW1lKCkpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQotCQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5jbG9zZU1ldGhvZEVkaXRvcnNGb3JQbHVnaW5FbGVtZW50cyhwbHVnaW4pOwotCQkJCQkJY3RybF9uYW1lLnNldFRleHQodmFsaWROYW1lKTsKLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJcGx1Z2luLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLCB2YWxpZE5hbWUsIC0xKTsKLQotCQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlmb3JtLnNldFRleHQoRk9STV9QUkVGSVggKyBwbHVnaW4uZ2V0TmFtZSgpKTsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQotCQkJCQkJLy8gYWRqdXN0IHBsdWdpbiBsb2NhdGlvbiBhbmQgc2F2ZSB0aGUgZWRpdG9yCi0JCQkJCQkvLwotCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0U2l0ZSgpLmdldFNoZWxsKCkKLQkJCQkJCQkJLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0JCQkJCQkJCWVkaXRvci5kb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBlZGl0b3IKLQkJCQkJCQkJCQkuZ2V0UGVyc2lzdGVyKCk7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlwZXJzaXN0ZXIKLQkJCQkJCQkJCQkJLmFkanVzdExvY2F0aW9uKHBsdWdpbi5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkJCS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJCQkJCQkJVmlld0hlbHBlcgotCQkJCQkJCQkJCQkJLnJlbG9hZEN1cnJlbnRMaWJhcnlPblJvbGxiYWNrRXJyb3IoZ2V0U2l0ZSgpCi0JCQkJCQkJCQkJCQkJCS5nZXRTaGVsbCgpKTsKLQkJCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCQkuZGlzcGxheVdhcm5pbmcoCi0JCQkJCQkJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkKLQkJCQkJCQkJCQkJCQkJCS5nZXRUZXh0KCksCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2Nhbm5vdFJlbmFtZVBsdWdpbkZvbGRlcgotCQkJCQkJCQkJCQkJCSwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX25hbWUuc2V0VGV4dChwbHVnaW4uZ2V0TmFtZSgpKTsKLQkJCQkJU2hlbGwgc2hlbGwgPSBnZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlzaGVsbC5nZXRUZXh0KCksIG1zZyk7Ci0JCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCQljdHJsX25hbWUuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJCQkJY3RybF9uYW1lLnNlbGVjdEFsbCgpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQljdHJsX25hbWUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQotCQljdHJsX3JlZk1vZGVsCi0JCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0ZWRMaXN0ID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCU1ldGhvZFBsdWdpbiBzZWxlY3RlZE9iaiA9IChNZXRob2RQbHVnaW4pIHNlbGVjdGVkTGlzdAotCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCQlpZiAoc2VsZWN0ZWRPYmogPT0gbnVsbCkKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQljdHJsX3JfYnJpZWZfZGVzYy5zZXRUZXh0KHNlbGVjdGVkT2JqCi0JCQkJCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCQkJCQl9Ci0KLQkJCQl9KTsKLQotCQljdHJsX3JlZk1vZGVsLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlPYmplY3Qgb2JqID0gZXZlbnQuZ2V0RWxlbWVudCgpOwotCi0JCQkJY3RybF9yX2JyaWVmX2Rlc2Muc2V0VGV4dCgoKE1ldGhvZFBsdWdpbikgb2JqKQotCQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0KLQkJCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChwbHVnaW4pKSB7Ci0JCQkJCWN0cmxfcmVmTW9kZWwuc2V0Q2hlY2tlZChvYmosICFldmVudC5nZXRDaGVja2VkKCkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaWYgKGV2ZW50LmdldENoZWNrZWQoKSkgewotCQkJCQkvLyBUT0RPOiBDaGFuZ2UgdGhpcyB0byBiZSBub3QgdW4tZG9hYmxlIGR1ZSB0byB0aGUgY2lyY3VsYXIKLQkJCQkJLy8gZGVwZW5kZW5jeSBjaGVjay4KLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgcGx1Z2luLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9CYXNlcygpLAotCQkJCQkJCShNZXRob2RQbHVnaW4pIG9iaiwgLTEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZpbmFsIE1ldGhvZFBsdWdpbiBiYXNlID0gKE1ldGhvZFBsdWdpbikgb2JqOwotCQkJCQkKLQkJCQkJaWYocmVtb3ZlQWxsUmVmZXJlbmNlcyhiYXNlKSl7Ci0JCQkJCQljdHJsX3JlZk1vZGVsLnNldENoZWNrZWQoYmFzZSwgZmFsc2UpOwotCQkJCQl9ZWxzZXsKLQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQljdHJsX3JlZk1vZGVsLnNldENoZWNrZWQoYmFzZSwgdHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJLy8gY2hhbmdlIHRoaXMgdG8gYmUgbm90IHVuLWRvYWJsZSBkdWUgdG8gdGhlIGNpcmN1bGFyCi0JCQkJCS8vIGRlcGVuZGVuY3kgY2hlY2sKLQkJCQkJLy8gcGx1Z2luLmdldEJhc2VzKCkucmVtb3ZlKG9iaik7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHBsdWdpbiwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fQmFzZXMoKSwKLQkJCQkJCQkoTWV0aG9kUGx1Z2luKSBvYmosIC0xKTsKLQkJCQl9Ci0KLQkJCQkvLyBkb3VibGUgY2hlY2sgY2lyY3VsYXIgZGVwZW5kZW5jeSwgbm90IG5lY2Vzc2FyeSBoZXJlCi0JCQkJUGx1Z2luUmVmZXJlbmNlQ2hlY2tlci5oYXNDaXJjdWxhckNvbmZsaWN0V2l0aFBsdWdpbihwbHVnaW4pOwotCi0JCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goYm9vbGVhbiBlZGl0YWJsZSkgewotCQlzdXBlci5yZWZyZXNoKGVkaXRhYmxlKTsKLQkJY3RybF9yX2JyaWVmX2Rlc2Muc2V0RWRpdGFibGUoZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIFZlcnNpb24gc2VjdGlvbiBjb250ZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVZlcnNpb25TZWN0aW9uQ29udGVudCgpIHsKLQkJc3VwZXIuY3JlYXRlVmVyc2lvblNlY3Rpb25Db250ZW50KCk7Ci0KLQkJY3RybF9jaGFuZ2VhYmxlID0gdG9vbGtpdAotCQkJCS5jcmVhdGVCdXR0b24oCi0JCQkJCQl2ZXJzaW9uQ29tcG9zaXRlLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5MYWJlbCwgU1dULkNIRUNLKTsgCi0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFZlcnNpb25TZWN0aW9uTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRWZXJzaW9uU2VjdGlvbkxpc3RlbmVycygpOwotCi0JCWN0cmxfY2hhbmdlYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQotCQkJCQotCQkJCUlTdGF0dXMgc3RhdHVzID0gVG5nVXRpbC5jaGVja0VkaXQocGx1Z2luLCBnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCi0JCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luX21lc3NhZ2UsCi0JCQkJCQkJCQlwbHVnaW4uZ2V0TmFtZSgpKTsKLQkJCQkJU2hlbGwgc2hlbGwgPSBnZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQkJCQkJaWYgKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKHNoZWxsLmdldFRleHQoKSwgbWVzc2FnZSkpIHsKLQkJCQkJCS8vIGNsb3NlIGVkaXRvcnMgb24gYW55IGNoYW5nZSBpbiBjdHJsX2NoYW5nZWFibGUKLQkJCQkJCS8vIGlmIChjdHJsX2NoYW5nZWFibGUuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5jbG9zZU1ldGhvZEVkaXRvcnNGb3JQbHVnaW5FbGVtZW50cyhwbHVnaW4pOwotCQkJCQkJYm9vbGVhbiByZXQgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQlwbHVnaW4sIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpLAotCQkJCQkJCQluZXcgQm9vbGVhbighY3RybF9jaGFuZ2VhYmxlLmdldFNlbGVjdGlvbigpKSwKLQkJCQkJCQkJLTEpOwotCQkJCQkJLy8gaW4gY2FzZSBvZiByZWFkb25seSBmaWxlLCByb2xsIGJhY2sgY2hhbmdlcy4KLQkJCQkJCWlmICghcmV0KSB7Ci0JCQkJCQkJY3RybF9jaGFuZ2VhYmxlLnNldFNlbGVjdGlvbighY3RybF9jaGFuZ2VhYmxlCi0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQotCQkJCQkJLy8gfQotCQkJCQkJcmVmcmVzaCghY3RybF9jaGFuZ2VhYmxlLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGFjdGlvbk1nci51bmRvKCk7Ci0JCQkJCQljdHJsX2NoYW5nZWFibGUuc2V0U2VsZWN0aW9uKCFjdHJsX2NoYW5nZWFibGUKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJCXJlZnJlc2goIWN0cmxfY2hhbmdlYWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCQkvLyByZXR1cm47Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXREaWFsb2dfdGl0bGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdERpYWxvZ19tc2dDYW5ub3RFZGl0LAotCQkJCQkJCXN0YXR1cyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJY29weXJpZ2h0X3ZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCi0JCQkJLy8gcmVmcmVzaCBlZGl0b3IgdGl0bGUgaW1hZ2UuIAotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcilnZXRFZGl0b3IoKSkucmVmcmVzaFRpdGxlSW1hZ2UoKTsKLQkJCX0KLQotCQkJCi0JCX0pOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZFZlcnNpb25TZWN0aW9uRGF0YSgpIHsKLQkJc3VwZXIubG9hZFZlcnNpb25TZWN0aW9uRGF0YSgpOwotCQljdHJsX2NoYW5nZWFibGUKLQkJCQkuc2V0U2VsZWN0aW9uKCFwbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFVzZXJDaGFuZ2VhYmxlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTWV0aG9kUGx1Z2luLmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJc2V0VXNlckNoYW5nZWFibGUoYi5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXNlckNoYW5nZWFibGUoYm9vbGVhbiB1c2VyQ2hhbmdlYWJsZSkgewotCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCQlyZXR1cm47Ci0JCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJcGx1Z2luLnNldFVzZXJDaGFuZ2VhYmxlKEJvb2xlYW4udmFsdWVPZih1c2VyQ2hhbmdlYWJsZSkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXBsdWdpbi5lQWRhcHRlcnMoKS5yZW1vdmUodXNlckNoYW5nZWFibGVBZGFwdGVyKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIE1ldGhvZFBsdWdpbiA8Y29kZT5iYXNlPC9jb2RlPiBpcyBvbmUgaW4gdGhlIGdpdmVuCi0JICogcGx1Z2lucyBjb2xsZWN0aW9uIG9yIGJhc2Ugb2YgYW55IHBsdWdpbiBpbiB0aGUgY29sbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZQotCSAqIEBwYXJhbSBwbHVnaW5zCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNPbmVPckJhc2VPZihNZXRob2RQbHVnaW4gYmFzZSwgQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnMpIHsKLQkJZm9yIChNZXRob2RQbHVnaW4gcGx1Z2luIDogcGx1Z2lucykgewotCQkJaWYoYmFzZSA9PSBwbHVnaW4gfHwgTWlzYy5pc0Jhc2VPZihiYXNlLCBwbHVnaW4pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiByZW1vdmVBbGxSZWZlcmVuY2VzKE1ldGhvZFBsdWdpbiB1bkNoZWNrZWRQbHVnaW4pIHsKLQkJQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4gcmVtb3ZlZEJhc2VzID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0JCXJlbW92ZWRCYXNlcy5hZGQodW5DaGVja2VkUGx1Z2luKTsKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RQbHVnaW4+IGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3I8TWV0aG9kUGx1Z2luPih1bkNoZWNrZWRQbHVnaW4sIGZhbHNlKSB7Ci0JCQotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBNZXRob2RQbHVnaW4+IGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJcmV0dXJuICgoTWV0aG9kUGx1Z2luKW9iamVjdCkuZ2V0QmFzZXMoKS5pdGVyYXRvcigpOwotCQkJCX0KLQkJCQlDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RQbHVnaW4+IGVtcHR5ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCQkJcmV0dXJuIGVtcHR5Lml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQotCQl9OyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBiYXNlID0gaXRlci5uZXh0KCk7Ci0JCQlBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPiBwbHVnaW5zID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KHBsdWdpbi5nZXRCYXNlcygpKTsKLQkJCXBsdWdpbnMucmVtb3ZlKHVuQ2hlY2tlZFBsdWdpbik7Ci0JCQlpZighaXNPbmVPckJhc2VPZihiYXNlLCBwbHVnaW5zKSkgewotCQkJCXJlbW92ZWRCYXNlcy5hZGQoYmFzZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUFycmF5TGlzdDxNZXRob2RQbHVnaW4+IGFmZmVjdGVkUGx1Z2lucyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPigpOwotCQkKLQkJLy8gZ2V0IGFsbCBwbHVnLWlucyBpbiBsaWJyYXJ5IHRoYXQgZXh0ZW5kIHRoaXMgcGx1Zy1pbgotCQkvLwotCQlMaXN0PD8+IHBsdWdpbnMgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCQkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gbXAgPSAoTWV0aG9kUGx1Z2luKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihtcCAhPSBwbHVnaW4gJiYgTWlzYy5pc0Jhc2VPZihwbHVnaW4sIG1wKSkgewkJCQkKLQkJCQlhZmZlY3RlZFBsdWdpbnMuYWRkKG1wKTsKLQkJCX0KLQkJfQotCQkKLQkJQXJyYXlMaXN0PFJlbW92ZVJlZmVyZW5jZXNDb21tYW5kPiBjb21tYW5kcyA9IG5ldyBBcnJheUxpc3Q8UmVtb3ZlUmVmZXJlbmNlc0NvbW1hbmQ+KCk7Ci0JCWZvciAoTWV0aG9kUGx1Z2luIGJhc2UgOiByZW1vdmVkQmFzZXMpIHsJCQkKLQkJCWlmKFVtYVV0aWwuaGFzUmVmZXJlbmNlKHBsdWdpbiwgYmFzZSkpIHsKLQkJCQljb21tYW5kcy5hZGQobmV3IFJlbW92ZVJlZmVyZW5jZXNDb21tYW5kKHBsdWdpbiwgYmFzZSkpOwotCQkJfQotCQkJZm9yIChNZXRob2RQbHVnaW4gbXAgOiBhZmZlY3RlZFBsdWdpbnMpIHsKLQkJCQlBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPiBiYXNlcyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPihtcC5nZXRCYXNlcygpKTsKLQkJCQliYXNlcy5yZW1vdmUoYmFzZSk7Ci0JCQkJaWYoIWlzT25lT3JCYXNlT2YoYmFzZSwgYmFzZXMpICYmIFVtYVV0aWwuaGFzUmVmZXJlbmNlKG1wLCBiYXNlKSkgewotCQkJCQljb21tYW5kcy5hZGQobmV3IFJlbW92ZVJlZmVyZW5jZXNDb21tYW5kKG1wLCBiYXNlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFjb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMubWV0aG9kUGx1Z2luRGVzY3JpcHRpb25SZW1vdmVSZWZDb25maXJtX21lc3NhZ2UsCi0JCQkJCQkJcGx1Z2luLmdldE5hbWUoKSk7Ci0JCQlTaGVsbCBzaGVsbCA9IGdldFNpdGUoKS5nZXRTaGVsbCgpOwotCQkJaWYgKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbihzaGVsbC5nZXRUZXh0KCksIG1lc3NhZ2UpKSB7Ci0JCQkJaW50IGkgPSAwOwotCQkJCXRyeSB7Ci0JCQkJCWZvciAoUmVtb3ZlUmVmZXJlbmNlc0NvbW1hbmQgY21kIDogY29tbWFuZHMpIHsKLQkJCQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCQkJCQlpKys7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJLy8gdW5kbyB0aGUgZXhlY3V0ZWQgY29tbWFuZHMKLQkJCQkJZm9yICg7IGkgPiAwOyBpLS0pIHsKLQkJCQkJCWFjdGlvbk1nci51bmRvKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5wbHVnaW5fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnBsdWdpbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1ByYWN0aWNlRGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1ByYWN0aWNlRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZWIwNWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9QcmFjdGljZURlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgaW4gYSBQcmFjdGljZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmFjdGljZURlc2NyaXB0aW9uUGFnZSBleHRlbmRzIEd1aWRhbmNlRGVzY3JpcHRpb25QYWdlIHsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfYWRkaXRpb25hbF9pbmZvLCBjdHJsX3Byb2JsZW0sCi0JCQljdHJsX2JhY2tncm91bmQ7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX2dvYWxzLCBjdHJsX2FwcGxpY2F0aW9uLCBjdHJsX2xldmVsc19hZG9wdGlvbjsKLQotCXByaXZhdGUgUHJhY3RpY2UgZ3VpZGFuY2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcmFjdGljZURlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCWd1aWRhbmNlID0gKFByYWN0aWNlKSBjb250ZW50RWxlbWVudDsKLQkJc2V0Q29udGVudEZpZWxkSGVpZ2h0KDIwMCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlRGVzY3JpcHRpb25QYWdlI2NyZWF0ZUVkaXRvckNvbnRlbnQob3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdG9yQ29udGVudCh0b29sa2l0KTsKLQotCQljdHJsX2FkZGl0aW9uYWxfaW5mbyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkFERElUSU9OQUxfSU5GT19URVhULCA0MCwgNDAwLAotCQkJCURFVEFJTF9TRUNUSU9OX0lEKTsKLQkJY3RybF9nb2FscyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkdPQUxTX1RFWFQsIDQwLCA0MDAsCi0JCQkJREVUQUlMX1NFQ1RJT05fSUQpOwotCQljdHJsX2FwcGxpY2F0aW9uID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuQVBQTElDQVRJT05fVEVYVCwgNDAsIDQwMCwKLQkJCQlERVRBSUxfU0VDVElPTl9JRCk7Ci0JCWN0cmxfcHJvYmxlbSA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LlBST0JMRU1fVEVYVCwgNDAsIDQwMCwKLQkJCQlERVRBSUxfU0VDVElPTl9JRCk7Ci0JCWN0cmxfYmFja2dyb3VuZCA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkJBQ0tHUk9VTkRfVEVYVCwgNDAsIDQwMCwKLQkJCQlERVRBSUxfU0VDVElPTl9JRCk7Ci0JCWN0cmxfbGV2ZWxzX2Fkb3B0aW9uID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuTEVWRUxfT0ZfQURPUFRJT05fVEVYVCwgNDAsCi0JCQkJNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7Ci0KLQkJbGFiZWxfYmFzZS5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5CQVNFX0VMRU1FTlRfVEVYVCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycwotCSAqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlRGVzY3JpcHRpb25QYWdlI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQkJZmluYWwgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0KLQkJZmluYWwgTW9kaWZ5TGlzdGVuZXIgY29udGVudE1vZGlmeUxpc3RlbmVyID0gZWRpdG9yCi0JCQkJLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKGd1aWRhbmNlLmdldFByZXNlbnRhdGlvbigpKTsKLQotCQljdHJsX2FkZGl0aW9uYWxfaW5mbwotCQkJCS5zZXRNb2RhbE9iamVjdCgob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9hZGRpdGlvbmFsX2luZm8uc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKSk7Ci0JCWN0cmxfYWRkaXRpb25hbF9pbmZvLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfYWRkaXRpb25hbF9pbmZvLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9hZGRpdGlvbmFsX2luZm87Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRBZGRpdGlvbmFsSW5mbygpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYXBwbGljYXRpb24KLQkJCQkuc2V0TW9kYWxPYmplY3QoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfYXBwbGljYXRpb24uc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKSk7Ci0JCWN0cmxfYXBwbGljYXRpb24uYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9hcHBsaWNhdGlvbi5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfYXBwbGljYXRpb247Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRBcHBsaWNhdGlvbigpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZ29hbHMuc2V0TW9kYWxPYmplY3QoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2dvYWxzLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCkpOwotCQljdHJsX2dvYWxzLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfZ29hbHMuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX2dvYWxzOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0R29hbHMoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpLAotCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX3Byb2JsZW0uc2V0TW9kYWxPYmplY3QoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3Byb2JsZW0uc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpKTsKLQkJY3RybF9wcm9ibGVtLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfcHJvYmxlbS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfcHJvYmxlbTsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRQcm9ibGVtKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2JhY2tncm91bmQKLQkJCQkuc2V0TW9kYWxPYmplY3QoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfYmFja2dyb3VuZC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCkpOwotCQljdHJsX2JhY2tncm91bmQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9iYWNrZ3JvdW5kLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9iYWNrZ3JvdW5kOwotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldEJhY2tncm91bmQoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCShvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfbGV2ZWxzX2Fkb3B0aW9uCi0JCQkJLnNldE1vZGFsT2JqZWN0KChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2xldmVsc19hZG9wdGlvbi5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCkpOwotCQljdHJsX2xldmVsc19hZG9wdGlvbi5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2xldmVsc19hZG9wdGlvbi5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfbGV2ZWxzX2Fkb3B0aW9uOwotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldExldmVsc09mQWRvcHRpb24oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQuZ2V0VGV4dCgpCi0JCQkJCQk6IGN0cmxfbGV2ZWxzX2Fkb3B0aW9uLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCShvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZSNyZWZyZXNoKGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChib29sZWFuIGVkaXRhYmxlKSB7Ci0JCXN1cGVyLnJlZnJlc2goZWRpdGFibGUpOwotCQljdHJsX2FkZGl0aW9uYWxfaW5mby5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfYXBwbGljYXRpb24uc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2dvYWxzLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9wcm9ibGVtLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9sZXZlbHNfYWRvcHRpb24uc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2JhY2tncm91bmQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCS8qKgotCSAqIExvYWQgaW5pdGlhbCBkYXRhIGZyb20gbW9kZWwKLQkgKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZSNsb2FkRGF0YSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERhdGEoKSB7Ci0JCXN1cGVyLmxvYWREYXRhKCk7Ci0JCWlmIChndWlkYW5jZSAhPSBudWxsKSB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24gZ3VpZGFuY2VEZXNjcmlwdGlvbiA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCWN0cmxfYWRkaXRpb25hbF9pbmZvCi0JCQkJCS5zZXRUZXh0KGd1aWRhbmNlRGVzY3JpcHRpb24uZ2V0QWRkaXRpb25hbEluZm8oKSA9PSBudWxsID8gIiIgOiBndWlkYW5jZURlc2NyaXB0aW9uLmdldEFkZGl0aW9uYWxJbmZvKCkpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX3Byb2JsZW0KLQkJCQkJLnNldFRleHQoZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRQcm9ibGVtKCkgPT0gbnVsbCA/ICIiIDogZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRQcm9ibGVtKCkpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX2JhY2tncm91bmQKLQkJCQkJLnNldFRleHQoZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRCYWNrZ3JvdW5kKCkgPT0gbnVsbCA/ICIiIDogZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRCYWNrZ3JvdW5kKCkpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX2FwcGxpY2F0aW9uCi0JCQkJCS5zZXRUZXh0KGd1aWRhbmNlRGVzY3JpcHRpb24uZ2V0QXBwbGljYXRpb24oKSA9PSBudWxsID8gIiIgOiBndWlkYW5jZURlc2NyaXB0aW9uLmdldEFwcGxpY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX2dvYWxzCi0JCQkJCS5zZXRUZXh0KGd1aWRhbmNlRGVzY3JpcHRpb24uZ2V0R29hbHMoKSA9PSBudWxsID8gIiIgOiBndWlkYW5jZURlc2NyaXB0aW9uLmdldEdvYWxzKCkpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX2xldmVsc19hZG9wdGlvbgotCQkJCQkuc2V0VGV4dChndWlkYW5jZURlc2NyaXB0aW9uLmdldExldmVsc09mQWRvcHRpb24oKSA9PSBudWxsID8gIiIgOiBndWlkYW5jZURlc2NyaXB0aW9uLmdldExldmVsc09mQWRvcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGd1aWRhbmNlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJhY3RpY2VSZWZlcmVuY2VzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9QcmFjdGljZVJlZmVyZW5jZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNzQxNzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9QcmFjdGljZVJlZmVyZW5jZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFJlZmVyZW5jZXMgcGFnZSBpbiB0aGUgUHJhY3RpY2UgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmFjdGljZVJlZmVyZW5jZXNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInByYWN0aWNlUmVmZXJlbmNlc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFByYWN0aWNlIHByYWN0aWNlOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcmFjdGljZVJlZmVyZW5jZXNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuUkVGRVJFTkNFU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXByYWN0aWNlID0gKFByYWN0aWNlKSBjb250ZW50RWxlbWVudDsKLQkJYWN0aW9uTWdyID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlsaXN0LmFkZEFsbChwcmFjdGljZS5nZXRDb250ZW50UmVmZXJlbmNlcygpKTsKLQkJCQlsaXN0LmFkZEFsbChwcmFjdGljZS5nZXRBY3Rpdml0eVJlZmVyZW5jZXMoKSk7Ci0JCQkJcmV0dXJuIGxpc3QudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHByYWN0aWNlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSwgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHByYWN0aWNlLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlcygpLAotCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHByYWN0aWNlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSwgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHByYWN0aWNlLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlcygpLAotCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gcHJhY3RpY2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5PTkxZX0NPTlRFTlRfRUxFTUVOVFM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgQWxsRmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmKG9iaiBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgcmV0dXJuIGZhbHNlOwotCQkJCWlmKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50Ci0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIAotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldEZpbHRlclR5cGVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsdGVyVHlwZXMoKSB7Ci0JCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbMTRdOwotCQlpbnQgaSA9IDA7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkFMTF9FTEVNRU5UUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuUk9MRVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRBU0tTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLlRPT0xTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuUFJPQ0VTU0VTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5DT05URU5UX1BBQ0tBR0VTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5NRVRIT19QTFVHSU5TOwotCQlyZXR1cm4gc3RyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZVJlZmVyZW5jZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMTQ1NTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2VsbGVkaXRvcnMuQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9ycy5Qcm9jZXNzQ2hlY2tCb3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db2x1bW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkV4cG9zZWRBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuUHJvY2Vzc1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklDb2x1bW5Bd2FyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJlZGVjZXNzb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9Cb3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29sb3JQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0KLS8qKgotICogQnJlYWRvd24gc3RydWN0dXJlIGVkaXRvcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBleHRlbmRzIFByb2Nlc3NGb3JtUGFnZQotCQlpbXBsZW1lbnRzIElWaWV3ZXJQcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWFRfVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFhUX0ZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uPEVDbGFzcz4gRUNMQVNTRVM7Ci0JCi0JcHJpdmF0ZSBpbnQgdGFiSW5kZXggPSAwOwotCQotCXN0YXRpYyB7Ci0JCUVDTEFTU0VTID0gbmV3IEFycmF5TGlzdDxFQ2xhc3M+KCk7Ci0JCUVDTEFTU0VTLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlKCkpOwotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFByb2Nlc3NBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgZXh0ZW5kcwotCQkJVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElDb2xvclByb3ZpZGVyIHsKLQotCQlwcml2YXRlIERlY29yYXRpbmdMYWJlbFByb3ZpZGVyIGRlY29yYXRpbmdMYWJlbFByb3ZpZGVyOwotCQkKLQkJLyoqCi0JCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCQkgKi8KLQkJcHVibGljIFByb2Nlc3NBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCWRlY29yYXRpbmdMYWJlbFByb3ZpZGVyID0gbmV3IERlY29yYXRpbmdMYWJlbFByb3ZpZGVyKAotCQkJCQluZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSwKLQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXN1cGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCWRlY29yYXRpbmdMYWJlbFByb3ZpZGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewkJCQotCQkJc3VwZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJZGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JCQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCWlmKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCQlyZXR1cm4gZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXRDb2x1bW5JbWFnZShvYmplY3QsIGNvbHVtbkluZGV4KTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBkZWNvcmF0aW5nTGFiZWxQcm92aWRlci5nZXRJbWFnZShvYmplY3QpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXIjZ2V0Rm9yZWdyb3VuZChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIENvbG9yIGdldEZvcmVncm91bmQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChpc1N1cHByZXNzZWQoZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gQ29sb3JzLlNVUFJFU1NFRF9FTEVNRU5UX0xBQkVMOwotCQkJfQotCQkJZWxzZSBpZiAoaXNFeHRlcm5hbChlbGVtZW50KSkgewotCQkJCXJldHVybiBDb2xvcnMuSU5IRVJJVEVEX0VMRU1FTlRfTEFCRUw7Ci0JCQl9CQkJCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBpc1N1cHByZXNzZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXJldHVybiBnZXRTdXBwcmVzc2lvbigpCi0JCQkJCQkuaXNTdXBwcmVzc2VkKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50KTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGdldFN1cHByZXNzaW9uKCkuaXNTdXBwcmVzc2VkKAotCQkJCQkJKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50KTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXByaXZhdGUgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oKSB7Ci0JCQlyZXR1cm4gKChQcm9jZXNzRWRpdG9yKSBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UudGhpcwotCQkJCQkuZ2V0RWRpdG9yKCkpLmdldFN1cHByZXNzaW9uKCk7Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29sb3JQcm92aWRlciNnZXRCYWNrZ3JvdW5kKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgQ29sb3IgZ2V0QmFja2dyb3VuZChPYmplY3QgZWxlbWVudCkgewotCQkJLy8gbGV0IE9TIHRha2UgY29udHJvbCBvdmVyIHRyZWUgd2lkZ2V0IGJhY2tncm91bmQKLQkJCS8vIHJhdGhlciB0aGFuIHNlbmRpbmcgb25lIGZpeGVkIGJhY2tncm91bmQuCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC51dGlsLlZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIjaXNFeHRlcm5hbChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIFByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKGVsZW1lbnQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQudXRpbC5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyI2dldEZvbnQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBGb250IGdldEZvbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChpc0V4dGVybmFsKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIGl0YWxpY0ZvbnQ7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVndWxhckZvbnQ7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWRlY29yYXRpbmdMYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCWRlY29yYXRpbmdMYWJlbFByb3ZpZGVyID0gbnVsbDsKLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgZXh0ZW5kcyBUZXh0Q2VsbEVkaXRvciB7Ci0JCXByb3RlY3RlZCBPYmplY3QgbGFzdEludmFsaWRFbGVtZW50OwotCi0JCXByaXZhdGUgaW50IGNvbHVtbkluZGV4OwotCi0JCS8qKgotCQkgKiBAcGFyYW0gcGFyZW50Ci0JCSAqLwotCQlwdWJsaWMgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKHBhcmVudCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRDb2x1bW5JbmRleChpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXRoaXMuY29sdW1uSW5kZXggPSBjb2x1bW5JbmRleDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Q29sdW1uSW5kZXgoKSB7Ci0JCQlyZXR1cm4gY29sdW1uSW5kZXg7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldExhc3RJbnZhbGlkRWxlbWVudCgpIHsKLQkJCXJldHVybiBsYXN0SW52YWxpZEVsZW1lbnQ7Ci0JCX0KLQotCQlTdHJpbmcgaXNWYWxpZChTdHJpbmcgdHh0KSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJT2JqZWN0IGUgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG1zZyA9IGlzVmFsaWQoZSwgdHh0KTsKLQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJbGFzdEludmFsaWRFbGVtZW50ID0gZTsKLQkJCQl9IGVsc2UgewotCQkJCQlsYXN0SW52YWxpZEVsZW1lbnQgPSBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gbXNnOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IGUsIFN0cmluZyB0eHQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBDZWxsRWRpdG9yVmFsaWRhdG9yIGltcGxlbWVudHMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgewotCi0JCXByaXZhdGUgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIGNlbGxFZGl0b3I7Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHVibGljIENlbGxFZGl0b3JWYWxpZGF0b3IoVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIGNlbGxFZGl0b3IpIHsKLQkJCXRoaXMuY2VsbEVkaXRvciA9IGNlbGxFZGl0b3I7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChPYmplY3QgdmFsdWUpIHsKLQkJCXJldHVybiBjZWxsRWRpdG9yLmlzVmFsaWQoKFN0cmluZykgdmFsdWUpOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgVmFsaWRhdGluZ0RlYWN0aXZhdGVMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQkJcHJpdmF0ZSBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgY2VsbEVkaXRvcjsKLQotCQlwdWJsaWMgVmFsaWRhdGluZ0RlYWN0aXZhdGVMaXN0ZW5lcihWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgY2VsbEVkaXRvcikgewotCQkJdGhpcy5jZWxsRWRpdG9yID0gY2VsbEVkaXRvcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoY2VsbEVkaXRvci5nZXRMYXN0SW52YWxpZEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRQcm9jZXNzRWxlbWVudEVycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCQljZWxsRWRpdG9yLmdldEVycm9yTWVzc2FnZSgpKTsKLQkJCQkJCXZpZXdlci5lZGl0RWxlbWVudChjZWxsRWRpdG9yLmdldExhc3RJbnZhbGlkRWxlbWVudCgpLAotCQkJCQkJCQljZWxsRWRpdG9yLmdldENvbHVtbkluZGV4KCkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCX0KLQotCS8vIHByaXZhdGUgY2xhc3MgVmFsaWRhdGluZ0ZvY3VzQWRhcHRlciBleHRlbmRzIEZvY3VzQWRhcHRlciB7Ci0JLy8gcHJpdmF0ZSBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgY2VsbEVkaXRvcjsKLQkvLwotCS8vIFZhbGlkYXRpbmdGb2N1c0FkYXB0ZXIoVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIGNlbGxFZGl0b3IpIHsKLQkvLyB0aGlzLmNlbGxFZGl0b3IgPSBjZWxsRWRpdG9yOwotCS8vIH0KLQkvLwotCS8vIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkvLyBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCS8vCi0JLy8gcHVibGljIHZvaWQgcnVuKCkgewotCS8vIGlmIChjZWxsRWRpdG9yLmdldExhc3RJbnZhbGlkRWxlbWVudCgpICE9IG51bGwpIHsKLQkvLyBBdXRob3JpbmdVSVBsdWdpbgotCS8vIC5nZXREZWZhdWx0KCkKLQkvLyAuZ2V0TXNnRGlhbG9nKCkKLQkvLyAuZGlzcGxheUVycm9yKAotCS8vIEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JLy8gLmdldFN0cmluZygiQXV0aG9yaW5nVUkuZWRpdFByb2Nlc3NFbGVtZW50RXJyb3JEaWFsb2cudGl0bGUiKSwKLQkvLyAvLyROT04tTkxTLTEkCi0JLy8gY2VsbEVkaXRvci5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0JLy8gdmlld2VyLmVkaXRFbGVtZW50KGNlbGxFZGl0b3IuZ2V0TGFzdEludmFsaWRFbGVtZW50KCksCi0JLy8gY2VsbEVkaXRvci5nZXRDb2x1bW5JbmRleCgpKTsKLQkvLyB9Ci0JLy8gfQotCS8vCi0JLy8gfSk7Ci0JLy8gfQotCS8vIH0KLQotCS8vIHByaXZhdGUgQ29tcG9zaXRlIHBhcmVudCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQ29sdW1uRGVzY3JpcHRvcltdIGNvbHVtbkRlc2NyaXB0b3JzOwotCi0JLy8gcHJpdmF0ZSBib29sZWFuIHZhbGlkTmFtZVByb21wdGVkID0gZmFsc2U7Ci0JLy8gcHJpdmF0ZSBpbnQgcHJvbXB0Q291bnQgPSAwOwotCi0JLy8gcHJpdmF0ZSBNZXRob2RFbGVtZW50IHByb21wdGVkRWxlbWVudDsKLQotCS8vIHByaXZhdGUgVGFibGVUcmVlVmlld2VyIHRhYmxlVHJlZVZpZXdlcjsKLQotCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCS8vIHByaXZhdGUgaW50IHRhYkluZGV4OwotCi0JLy8gcHJpdmF0ZSBPYmplY3QgdGFiRm9sZGVyOwotCi0JcHJvdGVjdGVkIFByb2Nlc3NWaWV3ZXIgdmlld2VyOwotCi0JcHJvdGVjdGVkIFRleHRDZWxsRWRpdG9yIHRleHRDZWxsRWRpdG9yOwotCi0JcHJvdGVjdGVkIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBuYW1lQ2VsbEVkaXRvcjsKLQotCXByb3RlY3RlZCBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgcHJlZExpc3RDZWxsRWRpdG9yOwotCi0JcHJvdGVjdGVkIENvbWJvQm94Q2VsbEVkaXRvciBjb21ib0JveENlbGxFZGl0b3I7Ci0KLQlwcm90ZWN0ZWQgQ2hlY2tib3hDZWxsRWRpdG9yIGNoZWNrQm94Q2VsbEVkaXRvcjsKLQotCXByb3RlY3RlZCBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgcHJlc2VudGF0aW9uTmFtZUNlbGxFZGl0b3I7Ci0KLQkvLyBwcml2YXRlIEhhc2hNYXAgY29sdW1uSW5kZXhUb05hbWVNYXA7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWFkT25seTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIHRpdGxlCi0JICovCi0JcHVibGljIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZShGb3JtRWRpdG9yIGVkaXRvciwgU3RyaW5nIGlkLAotCQkJU3RyaW5nIHRpdGxlKSB7Ci0JCXN1cGVyKGVkaXRvciwgaWQsIHRpdGxlKTsKLQl9Ci0JCi0JLyoqCi0JICogSWYgcmV0dXJucyB0cnVlLCBlZGl0aW5nIGlzIGRpc2FibGVkIG9yIG5vdCBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzIAotCSAqIGJyZWFrZG93biBzdHJ1Y3R1cmUuCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJaWYgKGlzUmVhZE9ubHkpIHsKLQkJCXJldHVybiBpc1JlYWRPbmx5OwotCQl9Ci0JCXJldHVybiBUbmdVdGlsLmlzTG9ja2VkKHByb2Nlc3MpOwotCX0KLQkKLQkvKioKLQkgKiBJZiByZXR1cm5zIHRydWUsIGVkaXRpbmcgaXMgZGlzYWJsZWQgb3Igbm90IGF2YWlsYWJsZSBmb3IgdGhlIHByb2Nlc3MgCi0JICogYnJlYWtkb3duIHN0cnVjdHVyZS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBiYXNpY0lzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiBpc1JlYWRPbmx5OwotCX0KLQotCS8qKgotCSAqIEVuYWJsZXMvZGlzYWJsZSBtb2RpZnlpbmcgcHJvY2VzcyBicmVha2Rvd24gc3RydWN0dXJlCi0JICogCi0JICogQHBhcmFtIGlzUmVhZE9ubHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIGlzUmVhZE9ubHkpIHsKLQkJdGhpcy5pc1JlYWRPbmx5ID0gaXNSZWFkT25seTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGFkYXB0ZXIgZmFjdG9yeSB0byBjcmVhdGUgaXRlbSBwcm92aWRlciBmb3IgZWFjaCBlbGVtZW50IGluIAotCSAqIHRoZSBicmVha2Rvd24gc3RydWN0dXJlCi0JICoKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZGFwdGVyRmFjdG9yeShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBjb2x1bW4gZGVzY3JpcHRvcnMgdG8gZGVmaW5lIHRoZSBjb2x1bW5zIG9mIHRoZSB0cmVlLgotCSAqIAotCSAqIEBwYXJhbSBjb2x1bW5EZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtbkRlc2NyaXB0b3JzKENvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5EZXNjcmlwdG9ycykgewotCQl0aGlzLmNvbHVtbkRlc2NyaXB0b3JzID0gY29sdW1uRGVzY3JpcHRvcnM7Ci0KLQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSUNvbHVtbkF3YXJlKSB7Ci0JCQlNYXA8SW50ZWdlciwgU3RyaW5nPiBjb2x1bW5JbmRleFRvTmFtZU1hcCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQljb2x1bW5JbmRleFRvTmFtZU1hcC5wdXQobmV3IEludGVnZXIoaSksCi0JCQkJCQljb2x1bW5EZXNjcmlwdG9yc1tpXS5pZCk7Ci0JCQl9Ci0JCQkoKElDb2x1bW5Bd2FyZSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCS5zZXRDb2x1bW5JbmRleFRvTmFtZU1hcChjb2x1bW5JbmRleFRvTmFtZU1hcCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGV4dChCcmVha2Rvd25FbGVtZW50IGUsIFN0cmluZyBwcm9wLCBTdHJpbmcgdHh0KSB7Ci0JCUlBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlMpIHsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHdiZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZTsKLQkJCUxpc3Q8V29ya09yZGVyPiBhZGRMaXN0ID0gbmV3IEFycmF5TGlzdDxXb3JrT3JkZXI+KCk7Ci0JCQlMaXN0PFdvcmtPcmRlcj4gcHJlZFRvQmVEZWxldGVkID0gbmV3IEFycmF5TGlzdDxXb3JrT3JkZXI+KCk7Ci0JCQlpZihQcmVkZWNlc3Nvckxpc3QucHJlcGFyZVVwZGF0ZVByZWRlY2Vzc29ycyhhZGFwdGVyRmFjdG9yeSwgd2JlLCB0eHQsIGFkZExpc3QsIHByZWRUb0JlRGVsZXRlZCkpIHsKLQkJCQlpZighcHJlZFRvQmVEZWxldGVkLmlzRW1wdHkoKSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksCi0JCQkJCQkJd2JlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCksCi0JCQkJCQkJcHJlZFRvQmVEZWxldGVkLCAtMSk7Ci0JCQkJfQotCQkJCWlmKCFhZGRMaXN0LmlzRW1wdHkoKSkgewotCQkJCQlhY3Rpb25NZ3IKLQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLAotCQkJCQkJCXdiZSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCksCi0JCQkJCQkJYWRkTGlzdCwgLTEpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlQcm9jZXNzVXRpbC5zZXRBdHRyaWJ1dGUoYWN0aW9uTWdyLCBlLCBwcm9wLCB0eHQpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGV4dChCcmVha2Rvd25FbGVtZW50IGUsIFN0cmluZyBwcm9wKSB7Ci0JCS8vIGhhbmRsZSBlZGl0aW5nIHByZXNlbnRhdGlvbiBuYW1lIG9mIGV4dGVuZGluZy9jb250cmlidXRpbmcgYWN0aXZpdHkKLQkJLy8gc3BlY2lhbGx5Ci0JCS8vCi0JCWlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUKLQkJCQkmJiBQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhlKSkgewotCQkJcmV0dXJuICgoRGVzY3JpYmFibGVFbGVtZW50KSBlKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCX0KLQotCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGUsCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJcmV0dXJuIGFkYXB0ZXIuZ2V0QXR0cmlidXRlKGUsIHByb3ApOwotCX0KLQotCS8qKgotCSAqIFNldCB0YWIgaW5kZXggZm9yIHRoZSBmb3JtIHBhZ2UKLQkgKiBAcGFyYW0gaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWJJbmRleChpbnQgaWQpIHsKLQkJIHRhYkluZGV4ID0gaWQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0YWIgaW5kZXggZm9yIHRoZSBmb3JtIHBhZ2UKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRhYkluZGV4KCkgewotCQlyZXR1cm4gdGFiSW5kZXg7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRhYiBmb2xkZXIKLQkgKiBAcGFyYW0gdGFiRm9sZGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFiRm9sZGVyKENUYWJGb2xkZXIgdGFiRm9sZGVyKSB7Ci0JCS8vIHRoaXMudGFiRm9sZGVyID0gdGFiRm9sZGVyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2NyZWF0ZUZvcm1Db250ZW50KG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJLy8gY3JlYXRlIGZvcm0gdG9vbGtpdAotCQlTY3JvbGxlZEZvcm0gZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQkJZm9ybS5zZXRUZXh0KGdldEVkaXRvcigpLmdldFBhcnROYW1lKCkpOwotCi0JCVRhYmxlV3JhcExheW91dCBsYXlvdXQgPSBuZXcgVGFibGVXcmFwTGF5b3V0KCk7Ci0JCWZvcm0uZ2V0Qm9keSgpLnNldExheW91dChsYXlvdXQpOwotCi0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwKLQkJCQlTZWN0aW9uLkVYUEFOREVEIHwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIsCi0JCQkJVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQlzZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQlzZWN0aW9uCi0JCQkJLnNldFRleHQoZ2V0VGl0bGUoKQotCQkJCQkJKyAiICIgKyBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2VfQlNFZGl0b3IpOyAvLyROT04tTkxTLTEkIAotCQlzZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCS8vIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlzZWN0aW9uLnNldENsaWVudChjb21wb3NpdGUpOwotCQlDb250cm9sIGNvbnRyb2wgPSBjcmVhdGVDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCXRvb2xraXQuYWRhcHQoY29udHJvbCwgdHJ1ZSwgdHJ1ZSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gMTA7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSA2MDA7Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJUHJvY2Vzc0VkaXRvciBlZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgZ2V0RWRpdG9yKCk7Ci0JCS8vIGVkaXRvci5jcmVhdGVDb250ZXh0TWVudUZvcih0YWJsZVRyZWVWaWV3ZXIpOwotCQllZGl0b3IuY3JlYXRlQ29udGV4dE1lbnVGb3Iodmlld2VyKTsKLQotCQlzZXRJbnB1dChwcm9jZXNzKTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZSBjb250cm9sCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4KLQkgKiAJCQlDb250cm9sCi0JICovCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIHRoaXMucGFyZW50ID0gcGFyZW50OwotCQkvLyBUaGlzIGlzIHRoZSBwYWdlIGZvciB0aGUgdGFibGUgdHJlZSB2aWV3ZXIuCi0JCS8vCi0JCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HIHwgR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29tcC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCXZpZXdlciA9IG5ldyBQcm9jZXNzVmlld2VyKGNvbXAsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXZpZXdlci5zZXR1cENvbHVtbnMoY29sdW1uRGVzY3JpcHRvcnMpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFByb2Nlc3NBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKLQotCi0JCXZpZXdlci5zZXRBY3Rpb25NYW5hZ2VyKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkuZ2V0QWN0aW9uTWFuYWdlcigpKTsKLQotCQl0ZXh0Q2VsbEVkaXRvciA9IG5ldyBUZXh0Q2VsbEVkaXRvcih2aWV3ZXIuZ2V0Q2VsbEVkaXRvclBhcmVudCgpKTsKLQkJY29tYm9Cb3hDZWxsRWRpdG9yID0gbmV3IENvbWJvQm94Q2VsbEVkaXRvcih2aWV3ZXIKLQkJCQkuZ2V0Q2VsbEVkaXRvclBhcmVudCgpLCBuZXcgU3RyaW5nW10geyBUWFRfVFJVRSwgVFhUX0ZBTFNFIH0pOwotCQljaGVja0JveENlbGxFZGl0b3IgPSBuZXcgQ2hlY2tib3hDZWxsRWRpdG9yKHZpZXdlcgotCQkJCS5nZXRDZWxsRWRpdG9yUGFyZW50KCkpOwotCi0JCS8vc2V0IGFsbCBlZGl0b3JzIGFuZCBtb2RpZmllcnMKLQkJc2V0QWxsRWRpdG9yc0FuZE1vZGlmaWVycygpOwotCQkKLQkJdmlld2VyLnNldEF1dG9FeHBhbmRMZXZlbCgzKTsKLQkJdmlld2VyLnNldElucHV0KHByb2Nlc3MpOwotCi0vLwkJIGludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgOwotLy8JCSBUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHsgVE5HT2JqVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKQotLy8JCSB9OwotLy8JCSB0YWJsZVRyZWVWaWV3ZXIuYWRkRHJvcFN1cHBvcnQoRE5ELkRST1BfTU9WRSwgdHJhbnNmZXJzLCBuZXcKLS8vCQkgQlNUYWJEcm9wQWRhcHRlcih0YWJsZVRyZWVWaWV3ZXIpKTsKLQotCQkvLyBCU0VkaXRvclZpZXcuZ2V0VmlldygpLmNyZWF0ZUNvbnRleHRNZW51Rm9yKHRhYmxlVHJlZVZpZXdlcik7Ci0JCS8vIHJldHVybiB0YWJsZVRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpOwotCi0JCXNldENvbnRleHRIZWxwKHZpZXdlci5nZXRDb250cm9sKCkpOwotCi0JCXJldHVybiBjb21wOwotCi0JfQotCi0JCi0JLyoqCi0JICogU2V0IGFsbCBlZGl0b3JzIGFuZCBtb2RpZmllcnMgZm9yIHRoZSB2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0QWxsRWRpdG9yc0FuZE1vZGlmaWVycygpCi0JewotCQlzZXRDZWxsRWRpdG9ycygpOwotCQlzZXRDaGVja0JveENlbGxFZGl0b3JzKCk7Ci0KLQkJLy8gU2V0IHRoZSBjZWxsIG1vZGlmaWVyCi0JCXZpZXdlci5zZXRDZWxsTW9kaWZpZXIobmV3IElDZWxsTW9kaWZpZXIoKSB7Ci0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyI2Nhbk1vZGlmeShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQotCQkJICovCi0JCQlwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY2FuTW9kaWZ5OiBlbGVtZW50PSIrZWxlbWVudCsiLAotCQkJCS8vIHByb3BlcnR5PSIrcHJvcGVydHkpOwotCi0JCQkJaWYgKGlzUmVhZE9ubHkoKSB8fAotCQkJCQkJKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciAmJiAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50KS5pc1JlYWRPbmx5KCkpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLS8vCQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KQotLy8JCQkJCQkmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciAmJiAhKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudCkKLS8vCQkJCQkJCQkuaXNSZWFkT25seSgpKSkgewotLy8JCQkJCUNvbGxlY3Rpb24gdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCQkJdHlwZXMuYWRkKFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpOwotLy8JCQkJCWlmIChUbmdVdGlsCi0vLwkJCQkJCQkuaXNHZW5lcmFsaXplcigKLS8vCQkJCQkJCQkJKFZhcmlhYmlsaXR5RWxlbWVudCkgKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudCkKLS8vCQkJCQkJCQkJCQkuZ2V0T3duZXIoKSwgdHlwZXMpKQotLy8JCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCQl9Ci0JCQkJCi0JCQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSUQKLQkJCQkJCXx8IHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfVFlQRQotCQkJCQkJfHwgcHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPCi0JCQkJCQl8fCBwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQllbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikKLQkJCQkJCSYmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0VOVFJZX1NUQVRFIHx8IHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfRVhJVF9TVEFURSkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpCi0JCQkJCQkmJiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlMpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllciNnZXRWYWx1ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQotCQkJICovCi0JCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImdldFZhbHVlOiBlbGVtZW50PSIrZWxlbWVudCsiLAotCQkJCS8vIHByb3BlcnR5PSIrcHJvcGVydHkpOwotCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCQlTdHJpbmcgdmFsID0gZ2V0VGV4dChlLCBwcm9wZXJ0eSk7Ci0JCQkJc3dpdGNoIChnZXRDZWxsRWRpdG9yVHlwZShwcm9wZXJ0eSkpIHsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DT01CT19CT09MRUFOOgotCQkJCQlpZiAoVFhUX1RSVUUuZXF1YWxzSWdub3JlQ2FzZSh2YWwpKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IEludGVnZXIoMCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gbmV3IEludGVnZXIoMSk7Ci0JCQkJCX0KLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUOgotCQkJCQlyZXR1cm4gdmFsOwotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NIRUNLX0JPT0xFQU46Ci0JCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gdmFsOwotCQkJCX0KLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllciNtb2RpZnkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgbW9kaWZ5KGZpbmFsIE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksCi0JCQkJCU9iamVjdCB2YWx1ZSkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigibW9kaWZ5OiBlbGVtZW50PSIrZWxlbWVudCsiLAotCQkJCS8vIHByb3BlcnR5PSIrcHJvcGVydHkrIiwgdmFsdWU9Iit2YWx1ZSk7Ci0JCQkJV2lkZ2V0IGl0ZW0gPSAoV2lkZ2V0KSBlbGVtZW50OwotCQkJCUJyZWFrZG93bkVsZW1lbnQgYmUgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAoaXRlbQotCQkJCQkJLmdldERhdGEoKSk7Ci0KLQkJCQlmaW5hbCBpbnQgY29sdW1uSW5kZXggPSBnZXRDb2x1bW5JbmRleChwcm9wZXJ0eSk7Ci0JCQkJQ2VsbEVkaXRvciBjZWxsRWRpdG9yID0gdmlld2VyLmdldENlbGxFZGl0b3JzKClbY29sdW1uSW5kZXhdOwotCQkJCVN0cmluZyBlcnJNc2cgPSBjZWxsRWRpdG9yLmdldEVycm9yTWVzc2FnZSgpOwotCQkJCWlmIChlcnJNc2cgIT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHR4dDsKLQkJCQlzd2l0Y2ggKGdldENlbGxFZGl0b3JUeXBlKHByb3BlcnR5KSkgewotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQ6Ci0JCQkJCXR4dCA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DT01CT19CT09MRUFOOgotCQkJCQlpbnQgaW5kZXggPSAoKE51bWJlcikgdmFsdWUpLmludFZhbHVlKCk7Ci0JCQkJCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkJCQl0eHQgPSBUWFRfVFJVRTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXR4dCA9IFRYVF9GQUxTRTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOOgotCQkJCQl0eHQgPSB2YWx1ZS50b1N0cmluZygpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQl0eHQgPSBUbmdVdGlsLmNoZWNrTnVsbCh2YWx1ZS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJc2V0VGV4dChiZSwgcHJvcGVydHksIHR4dCk7Ci0JCQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUKLQkJCQkJCSYmIFN0clV0aWwuaXNCbGFuayhiZS5nZXROYW1lKCkpKSB7Ci0JCQkJCWJlLnNldE5hbWUodHh0KTsKLQkJCQl9Ci0JCQkJCi0JCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCQotCS8qKgotCSAqIEdldCBjZWxsIGVkaXRvciBmb3IgdGhlIGdpdmVuIGNvbHVtbgotCSAqIEBwYXJhbSBjb2x1bW5JRAotCSAqIEBwYXJhbSBjb2x1bW5JbmRleAotCSAqIEByZXR1cm4KLQkgKiAJCQlDZWxsIEVkaXRvcgotCSAqLwotCXB1YmxpYyBDZWxsRWRpdG9yIGdldENlbGxFZGl0b3IoU3RyaW5nIGNvbHVtbklELCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYgKGNvbHVtbklEID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUpIHsKLQkJCWlmIChwcmVzZW50YXRpb25OYW1lQ2VsbEVkaXRvciA9PSBudWxsKSB7Ci0JCQkJcHJlc2VudGF0aW9uTmFtZUNlbGxFZGl0b3IgPSBuZXcgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yKAotCQkJCQkJdmlld2VyLmdldENlbGxFZGl0b3JQYXJlbnQoKSkgewotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IGUsIFN0cmluZyB0eHQpIHsKLQkJCQkJCWUgPSBUbmdVdGlsLnVud3JhcChlKTsKLQkJCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gKChQcm9jZXNzRWRpdG9yKWdldEVkaXRvcigpKS5nZXRTdXBwcmVzc2lvbigpOwotCQkJCQkJYm9vbGVhbiBpZ25vcmVTdXBwcmVzc2VkID0gdHJ1ZTsKLQkJCQkJCXJldHVybiBQcm9jZXNzVXRpbAotCQkJCQkJCQkuY2hlY2tCcmVha2Rvd25FbGVtZW50UHJlc2VudGF0aW9uTmFtZSgKLQkJCQkJCQkJCQlhZGFwdGVyRmFjdG9yeSwgKEJyZWFrZG93bkVsZW1lbnQpIGUsCi0JCQkJCQkJCQkJdHh0LCBzdXBwcmVzc2lvbiwgaWdub3JlU3VwcHJlc3NlZCk7Ci0JCQkJCX0KLQkJCQl9OwotCi0JCQkJcHJlc2VudGF0aW9uTmFtZUNlbGxFZGl0b3IKLQkJCQkJCS5zZXRWYWxpZGF0b3IobmV3IENlbGxFZGl0b3JWYWxpZGF0b3IoCi0JCQkJCQkJCXByZXNlbnRhdGlvbk5hbWVDZWxsRWRpdG9yKSk7Ci0JCQkJLy8gcHJlc2VudGF0aW9uTmFtZUNlbGxFZGl0b3IuZ2V0Q29udHJvbCgpLmFkZEZvY3VzTGlzdGVuZXIobmV3Ci0JCQkJLy8gVmFsaWRhdGluZ0ZvY3VzQWRhcHRlcihwcmVzZW50YXRpb25OYW1lQ2VsbEVkaXRvcikpOwotCQkJCXByZXNlbnRhdGlvbk5hbWVDZWxsRWRpdG9yLmdldENvbnRyb2woKS5hZGRMaXN0ZW5lcigKLQkJCQkJCVNXVC5EZWFjdGl2YXRlLAotCQkJCQkJbmV3IFZhbGlkYXRpbmdEZWFjdGl2YXRlTGlzdGVuZXIoCi0JCQkJCQkJCXByZXNlbnRhdGlvbk5hbWVDZWxsRWRpdG9yKSk7Ci0JCQl9Ci0JCQlwcmVzZW50YXRpb25OYW1lQ2VsbEVkaXRvci5zZXRDb2x1bW5JbmRleChjb2x1bW5JbmRleCk7Ci0KLQkJCXJldHVybiBwcmVzZW50YXRpb25OYW1lQ2VsbEVkaXRvcjsKLQkJfSBlbHNlIGlmIChjb2x1bW5JRCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUpIHsKLQkJCWlmIChuYW1lQ2VsbEVkaXRvciA9PSBudWxsKSB7Ci0JCQkJbmFtZUNlbGxFZGl0b3IgPSBuZXcgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yKHZpZXdlcgotCQkJCQkJLmdldENlbGxFZGl0b3JQYXJlbnQoKSkgewotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IGUsIFN0cmluZyB0eHQpIHsKLQkJCQkJCWUgPSBUbmdVdGlsLnVud3JhcChlKTsKLQkJCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gKChQcm9jZXNzRWRpdG9yKWdldEVkaXRvcigpKS5nZXRTdXBwcmVzc2lvbigpOwotCQkJCQkJcmV0dXJuIFRuZ1V0aWwKLQkJCQkJCQkJLmNoZWNrQWN0aXZpdHlOYW1lKGFkYXB0ZXJGYWN0b3J5LCBlLCB0eHQsIHN1cHByZXNzaW9uKTsKLQkJCQkJfQotCQkJCX07Ci0JCQkJbmFtZUNlbGxFZGl0b3Iuc2V0VmFsaWRhdG9yKG5ldyBDZWxsRWRpdG9yVmFsaWRhdG9yKAotCQkJCQkJbmFtZUNlbGxFZGl0b3IpKTsKLQkJCQkvLyBuYW1lQ2VsbEVkaXRvci5nZXRDb250cm9sKCkuYWRkRm9jdXNMaXN0ZW5lcihuZXcKLQkJCQkvLyBWYWxpZGF0aW5nRm9jdXNBZGFwdGVyKG5hbWVDZWxsRWRpdG9yKSk7Ci0JCQkJbmFtZUNlbGxFZGl0b3IuZ2V0Q29udHJvbCgpLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCQkJbmV3IFZhbGlkYXRpbmdEZWFjdGl2YXRlTGlzdGVuZXIobmFtZUNlbGxFZGl0b3IpKTsKLQkJCX0KLQkJCW5hbWVDZWxsRWRpdG9yLnNldENvbHVtbkluZGV4KGNvbHVtbkluZGV4KTsKLQotCQkJcmV0dXJuIG5hbWVDZWxsRWRpdG9yOwotCQl9IGVsc2UgaWYgKGNvbHVtbklEID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTKSB7Ci0JCQlpZiAocHJlZExpc3RDZWxsRWRpdG9yID09IG51bGwpIHsKLQkJCQlwcmVkTGlzdENlbGxFZGl0b3IgPSBuZXcgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yKHZpZXdlcgotCQkJCQkJLmdldENlbGxFZGl0b3JQYXJlbnQoKSkgewotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IGUsIFN0cmluZyB0eHQpIHsKLQkJCQkJCWUgPSBUbmdVdGlsLnVud3JhcChlKTsKLQkJCQkJCXJldHVybiBQcm9jZXNzVXRpbC5jaGVja1ByZWRlY2Vzc29yTGlzdCgKLQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBlLCB0eHQsIGFkYXB0ZXJGYWN0b3J5LAotCQkJCQkJCQlwcm9jZXNzLCBudWxsKTsKLQkJCQkJfQotCQkJCX07Ci0JCQkJcHJlZExpc3RDZWxsRWRpdG9yLnNldFZhbGlkYXRvcihuZXcgQ2VsbEVkaXRvclZhbGlkYXRvcigKLQkJCQkJCXByZWRMaXN0Q2VsbEVkaXRvcikpOwotCQkJCS8vIHByZWRMaXN0Q2VsbEVkaXRvci5nZXRDb250cm9sKCkuYWRkRm9jdXNMaXN0ZW5lcihuZXcKLQkJCQkvLyBWYWxpZGF0aW5nRm9jdXNBZGFwdGVyKHByZWRMaXN0Q2VsbEVkaXRvcikpOwotCQkJCXByZWRMaXN0Q2VsbEVkaXRvci5nZXRDb250cm9sKCkuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsCi0JCQkJCQluZXcgVmFsaWRhdGluZ0RlYWN0aXZhdGVMaXN0ZW5lcihwcmVkTGlzdENlbGxFZGl0b3IpKTsKLQkJCX0KLQkJCXByZWRMaXN0Q2VsbEVkaXRvci5zZXRDb2x1bW5JbmRleChjb2x1bW5JbmRleCk7Ci0KLQkJCXJldHVybiBwcmVkTGlzdENlbGxFZGl0b3I7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0IGNlbGwgZWRpdG9ycyBmb3IgYWxsIGNvbHVtbnMgCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2VsbEVkaXRvcnMoKSB7Ci0JCUNlbGxFZGl0b3JbXSBjZWxsRWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yW2NvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCUNlbGxFZGl0b3IgY2VsbEVkaXRvciA9IGdldENlbGxFZGl0b3IoY29sdW1uRGVzY3JpcHRvcnNbaV0uaWQsIGkpOwotCQkJaWYgKGNlbGxFZGl0b3IgIT0gbnVsbCkgewotCQkJCWNlbGxFZGl0b3JzW2ldID0gY2VsbEVkaXRvcjsKLQkJCX0gZWxzZSB7Ci0JCQkJc3dpdGNoIChjb2x1bW5EZXNjcmlwdG9yc1tpXS5jZWxsRWRpdG9yVHlwZSkgewotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NPTUJPX0JPT0xFQU46Ci0JCQkJCWNlbGxFZGl0b3JzW2ldID0gY29tYm9Cb3hDZWxsRWRpdG9yOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUOgotCQkJCQljZWxsRWRpdG9yc1tpXSA9IHRleHRDZWxsRWRpdG9yOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOOgotCQkJCQljZWxsRWRpdG9yc1tpXSA9IGNoZWNrQm94Q2VsbEVkaXRvcjsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJY2VsbEVkaXRvcnNbaV0gPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQl2aWV3ZXIuc2V0Q2VsbEVkaXRvcnMoY2VsbEVkaXRvcnMpOwotCX0KLQkKLQkKLQkKLQotCS8qKgotCSAqIFNldCBpbnB1dCBmb3Igdmlld2VyCi0JICogQHBhcmFtIG5ld0lucHV0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCXByb2Nlc3MgPSAoUHJvY2VzcykgbmV3SW5wdXQ7Ci0JCQlpZiAocHJvY2Vzcy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJdmlld2VyLnNldElucHV0KHByb2Nlc3MuZUNvbnRhaW5lcigpKTsKLQkJCQkvLyB2aWV3ZXIuZXhwYW5kQWxsKCk7Ci0vLwkJCQl2aWV3ZXIucmV2ZWFsKHByb2Nlc3MpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQl2aWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRDb2x1bW5JbmRleChTdHJpbmcgcHJvcGVydHkpIHsKLQkJT2JqZWN0W10gY29sUHJvcHMgPSB2aWV3ZXIuZ2V0Q29sdW1uUHJvcGVydGllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbFByb3BzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29sUHJvcHNbaV0gPT0gcHJvcGVydHkpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0Q2VsbEVkaXRvclR5cGUoU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCUNvbHVtbkRlc2NyaXB0b3IgZGVzYyA9IGNvbHVtbkRlc2NyaXB0b3JzW2ldOwotCQkJaWYgKGRlc2MuaWQgPT0gcHJvcGVydHkpIHsKLQkJCQlyZXR1cm4gZGVzYy5jZWxsRWRpdG9yVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX05PTkU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHZpZXdlcgotCSAqLwotCXB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCS8qKgotCSAqIFNldCBwcm9jZXNzIGFzIGlucHV0Ci0JICogQHBhcmFtIHByb2MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzKFByb2Nlc3MgcHJvYykgewotCQlpZiAocHJvY2VzcyAhPSBwcm9jKSB7Ci0JCQlzZXRJbnB1dChwcm9jKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFkYXB0ZXJGYWN0b3J5LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBjb2x1bW5zIHdpdGggbmV3IGNvbHVtbiBkZXNjcmlwdG9ycwotCSAqIEBwYXJhbSBuZXdDb2x1bW5EZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbHVtbnMoQ29sdW1uRGVzY3JpcHRvcltdIG5ld0NvbHVtbkRlc2NyaXB0b3JzKSB7Ci0JCXNldENvbHVtbkRlc2NyaXB0b3JzKG5ld0NvbHVtbkRlc2NyaXB0b3JzKTsKLQkJdmlld2VyLnNldHVwQ29sdW1ucyhuZXdDb2x1bW5EZXNjcmlwdG9ycyk7CQotCQlzZXRBbGxFZGl0b3JzQW5kTW9kaWZpZXJzKCk7Ci0JCXZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gaWYoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSB7Ci0JCS8vICgoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZGlzcG9zZSgpOwotCQkvLyB9Ci0KLQkJaWYgKHZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKSAhPSBudWxsKSB7Ci0JCQl2aWV3ZXIuZ2V0Q29udGVudFByb3ZpZGVyKCkuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYgKHZpZXdlci5nZXRMYWJlbFByb3ZpZGVyKCkgIT0gbnVsbCkgewotCQkJdmlld2VyLmdldExhYmVsUHJvdmlkZXIoKS5kaXNwb3NlKCk7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29udGV4dEhlbHAoQ29udHJvbCBjb250cm9sKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWMgPSBnZXRBZGFwdGVyRmFjdG9yeSgpOwotCQlBZGFwdGVyRmFjdG9yeSBhbGxGYWMgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlBZGFwdGVyRmFjdG9yeSB3YnNGYWMgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlBZGFwdGVyRmFjdG9yeSBvYnNGYWMgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlBZGFwdGVyRmFjdG9yeSBwYnNGYWMgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIERFQlVHOiBjdXJyZW50IGRhZHB0ZXIgZmFjID0gIiArIGFkYXB0ZXJGYWMpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBERUJVRzogYWxsIGRhZHB0ZXIgZmFjID0gIiArIGFsbEZhYyk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIERFQlVHOiB3YnMgZGFkcHRlciBmYWMgPSAiICsgd2JzRmFjKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgREVCVUc6IG9icyBkYWRwdGVyIGZhYyA9ICIgKyBvYnNGYWMpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBERUJVRzogcGJzIGRhZHB0ZXIgZmFjID0gIiArIHBic0ZhYyk7Ci0KLQkJaWYgKGFkYXB0ZXJGYWMgPT0gd2JzRmFjKQotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb250cm9sLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5GT1JNX0VESVRPUl9QUk9DRVNTX1dCU19DT05URVhUKTsKLQkJZWxzZSBpZiAoYWRhcHRlckZhYyA9PSBvYnNGYWMpCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbnRyb2wsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkZPUk1fRURJVE9SX1BST0NFU1NfT0JTX0NPTlRFWFQpOwotCQllbHNlIGlmIChhZGFwdGVyRmFjID09IHBic0ZhYykKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29udHJvbCwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRk9STV9FRElUT1JfUFJPQ0VTU19QQlNfQ09OVEVYVCk7Ci0JCWVsc2UgaWYgKGFkYXB0ZXJGYWMgPT0gYWxsRmFjKQotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb250cm9sLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5GT1JNX0VESVRPUl9QUk9DRVNTX0FMTEJTX0NPTlRFWFQpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGFkZGl0aW9uYWwgYWN0aW9ucyB0byBjb250cmlidXRlIHRvIHRoZSBjb250ZXh0IG1lbnUuCi0JICogCi0JICogQHJldHVybgotCSAqIAkJCUFjdGlvbnMKLQkgKi8KLQlwdWJsaWMgSUFjdGlvbltdIGdldEFkZGl0aW9uYWxBY3Rpb25zKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IGNoZWNrIGJveCBjZWxsIGVkaXRvcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGVja0JveENlbGxFZGl0b3JzKCkgewotCQlBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzID0gbmV3IEFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yW2NvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCXN3aXRjaCAoY29sdW1uRGVzY3JpcHRvcnNbaV0uY2VsbEVkaXRvclR5cGUpIHsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOOgotCQkJCQljZWxsRWRpdG9yc1tpXSA9IG5ldyBQcm9jZXNzQ2hlY2tCb3hDZWxsRWRpdG9yKHZpZXdlcgotCQkJCQkJCS5nZXRDZWxsRWRpdG9yUGFyZW50KCkpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQljZWxsRWRpdG9yc1tpXSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJKChQcm9jZXNzVmlld2VyKSB2aWV3ZXIpLnNldENoZWNrQm94Q2VsbEVkaXRvcnMoY2VsbEVkaXRvcnMpOwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NEZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUwOWI5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5FZGl0b3JzQ29udGV4dEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuVUlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLkNvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5JbWFnZUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBwcm9jZXNzIGRlc2NyaXB0aW9uLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogCi0gKiBUT0RPOiBSZW5hbWUgdGhpcyBjbGFzcyB0byBQcm9jZXNzRGVzY3JpcHRpb25QYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRGVzY3JpcHRpb24gZXh0ZW5kcyBQcm9jZXNzRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJwcm9jZXNzRGVzY3JpcHRpb25QYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UID0gMjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEdFTkVSQUxfU0VDVElPTl9JRCA9IDE7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBERVRBSUxfU0VDVElPTl9JRCA9IDI7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCX07Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQotCXByb3RlY3RlZCBTZWN0aW9uIGZvcm1TZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgZXhwYW5kZWRDb21wb3NpdGU7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9uYW1lOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfcHJlc2VudGF0aW9uX25hbWU7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9icmllZl9kZXNjLCBjdHJsX2V4dGVybmFsX2lkOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9wdXJwb3NlOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9mdWxsX2Rlc2M7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX3Njb3BlLCBjdHJsX3VzYWdlX25vdGVzOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9hbHRlcm5hdGl2ZXMsIGN0cmxfaG93X3RvX3N0YWZmLAotCQkJY3RybF9rZXlfY29uc2lkZXJhdGlvbjsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGFjdGl2ZUNvbnRyb2w7Ci0KLQlwcml2YXRlIFNlY3Rpb24gZ2VuZXJhbFNlY3Rpb24sIGRldGFpbFNlY3Rpb24sIGNvbmZpZ1NlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGdlbmVyYWxDb21wb3NpdGUsIGRldGFpbENvbXBvc2l0ZSwgY29uZmlnQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVzY0V4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGdlbmVyYWxTZWN0aW9uRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGV0YWlsU2VjdGlvbkV4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGNvbmZpZ1NlY3Rpb25FeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0RWRpdG9yIGN0cmxfZXhwYW5kZWQ7Ci0KLQlwcml2YXRlIEltYWdlSHlwZXJsaW5rIGV4cGFuZExpbms7Ci0KLQlwcml2YXRlIExhYmVsIGV4cGFuZExhYmVsOwotCi0JLy8gcHJpdmF0ZSBTdHJpbmdbXSB2YXJpYWJpbGl0eVR5cGVzID0gbmV3IFN0cmluZ1tdIHsiTi9BIiwgIkNvbnRyaWJ1dGVzIiwKLQkvLyAiRXh0ZW5kcyIsICJSZXBsYWNlcyJ9OwotCS8vIHByaXZhdGUgSGFzaE1hcCB2YXJpYWJpbGl0eUVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0IGxpc3RfY29uZmlndXJhdGlvbnM7Ci0KLQlwcml2YXRlIExpc3RWaWV3ZXIgY29uZmlnTGlzdFZpZXdlcjsKLQotCXByb3RlY3RlZCBCdXR0b24gYnV0dG9uQWRkOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBidXR0b25SZW1vdmU7Ci0KLQkvLyBwcml2YXRlIEJ1dHRvbiBidXR0b25FZGl0OwotCXByb3RlY3RlZCBCdXR0b24gYnV0dG9uTWFrZURlZmF1bHQ7Ci0KLQlwcml2YXRlIFRleHQgdGV4dENvbmZpZ0Rlc2NyaXB0aW9uOwotCi0JcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGNvbmZpZ0xpc3RBZGFwdGVyOwotCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcjsKLQotLy8JcHJpdmF0ZSBBZGFwdGVyIHByb2Nlc3NMaXN0ZW5lcjsKLQotCXByaXZhdGUgU3RyaW5nIHByb2Nlc3NUeXBlOwotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvcjsKLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgbmFtZU1vZGlmeUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBib29sZWFuIGRpc3Bvc2VkOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0Rlc2NyaXB0aW9uKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvblBhZ2VfdGl0bGUpOyAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5jcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JCS8vIGNyZWF0ZSBmb3JtIHRvb2xraXQKLQkJc3VwZXIuY3JlYXRlRm9ybUNvbnRlbnQobWFuYWdlZEZvcm0pOwotCi0JCXByb2Nlc3NUeXBlID0gTGlicmFyeVVJVGV4dC5nZXRVSVRleHRMb3dlcihwcm9jZXNzKTsKLQkJc2V0Rm9ybVRleHQoKTsKLQotCQkvLyBjcmVhdGUgZWRpdG9yIGNvbnRlbnQKLQkJY3JlYXRlRWRpdG9yQ29udGVudCh0b29sa2l0KTsKLQotLy8JCS8vIGFkZCBsaXN0ZW5lciB0byBsaXN0ZW4gdG8gY2hhbmdlIGluIHByb2Nlc3MncyBkYXRhCi0vLwkJaWYgKHByb2Nlc3NMaXN0ZW5lciA9PSBudWxsKSB7Ci0vLwkJCXByb2Nlc3NMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLS8vCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotLy8JCQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChQcm9jZXNzLmNsYXNzKSkgewotLy8JCQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19OQU1FOgotLy8JCQkJCQlyZWZyZXNoRWxlbWVudE5hbWUobXNnLmdldE5ld1N0cmluZ1ZhbHVlKCkpOwotLy8JCQkJCQlicmVhazsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX07Ci0vLwkJfQotLy8JCXByb2Nlc3MuZUFkYXB0ZXJzKCkuYWRkKHByb2Nlc3NMaXN0ZW5lcik7Ci0KLQkJbG9hZERhdGEoKTsKLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJRWRpdG9yc0NvbnRleHRIZWxwZXIuc2V0SGVscChnZXRQYXJ0Q29udHJvbCgpLCBwcm9jZXNzVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZWRpdG9yIHRhYiBjb250ZW50Ci0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCWNyZWF0ZUZvcm1Db21wb3NpdGVzKCk7Ci0JCWNyZWF0ZUdlbmVyYWxTZWN0aW9uKCk7Ci0JCWNyZWF0ZURldGFpbFNlY3Rpb24oKTsKLQkJY3JlYXRlQ29uZmlndXJhdGlvblNlY3Rpb24oKTsKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihnZW5lcmFsQ29tcG9zaXRlKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZGV0YWlsQ29tcG9zaXRlKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29uZmlnQ29tcG9zaXRlKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZXhwYW5kZWRDb21wb3NpdGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JtQ29tcG9zaXRlcygpIHsKLQkJZm9ybVNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksIFNlY3Rpb24uTk9fVElUTEUpOwotCQl7Ci0JCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQkJZm9ybVNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRMYXlvdXQobmV3IFRhYmxlV3JhcExheW91dCgpKTsKLQkJfQotCi0JCS8vIGNyZWF0ZSB0aGUgY29tcG9zaXRlIGZvciB0aGUgc2VjdGlvbnMKLQkJc2VjdGlvbkNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGZvcm1TZWN0aW9uLCBTV1QuTk9ORSk7Ci0JCXNlY3Rpb25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YSgpKTsKLQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IFRhYmxlV3JhcExheW91dCgpKTsKLQkJZm9ybVNlY3Rpb24uc2V0Q2xpZW50KHNlY3Rpb25Db21wb3NpdGUpOwotCi0JCWV4cGFuZGVkQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZm9ybVNlY3Rpb24sIFNXVC5OT05FKTsKLQkJewotCQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJCWV4cGFuZGVkQ29tcG9zaXRlLnNldExheW91dERhdGEodGQpOwotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZXhwYW5kZWRDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuUklDSF9URVhUX0VESVRPUl9DT05URVhUX0lEKTsKLQotCQkvLyBBZGQgdGhlIGV4cGFuZC9jb2xsYXBzZSBoeXBlcmxpbmsgaW1hZ2UuCi0JCWV4cGFuZExpbmsgPSB0b29sa2l0LmNyZWF0ZUltYWdlSHlwZXJsaW5rKGV4cGFuZGVkQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWV4cGFuZExpbmsuc2V0SW1hZ2UoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0VYUEFOREVEKTsKLQkJZXhwYW5kTGluay5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5jbG9zZVJURSk7Ci0JCWV4cGFuZExpbmsuc2V0VW5kZXJsaW5lZChmYWxzZSk7Ci0JCWV4cGFuZExpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQl0b2dnbGUoZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIEFkZCB0aGUgZXhwYW5kL2NvbGxhcHNlIGh5cGVybGluayB0ZXh0LgotCQlleHBhbmRMYWJlbCA9IGNyZWF0ZURlY29yYXRlZExhYmVsKHRvb2xraXQsIGV4cGFuZGVkQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBnZW5lcmFsIHNlY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHZW5lcmFsU2VjdGlvbigpIHsKLQkJLy8gY3JlYXRlIEdlbmVyYWwgSW5mb3JtYXRpb24gc2VjdGlvbgotCQlnZW5lcmFsU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwKLQkJCQlTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRAotCQkJCQkJfCBTZWN0aW9uLlRJVExFX0JBUik7Ci0JCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5HRU5FUkFMX0lORk9fU0VDVElPTl9OQU1FKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0RGVzY3JpcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkdFTkVSQUxfSU5GT19TRUNUSU9OX0RFU0MsCi0JCQkJbmV3IFN0cmluZ1tdIHsgcHJvY2Vzc1R5cGUgfSkpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJZ2VuZXJhbENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxTZWN0aW9uKTsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0Q2xpZW50KGdlbmVyYWxDb21wb3NpdGUpOwotCi0JCS8vIG5hbWUKLQkJY3RybF9uYW1lID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuTkFNRV9URVhUKTsKLQotCQkvLyBQcmVzZW50YXRpb24gbmFtZQotCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWwodG9vbGtpdCwKLQkJCQlnZW5lcmFsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuUFJFU0VOVEFUSU9OX05BTUVfVEVYVCk7Ci0KLQkJLy8gYnJpZWYgZGVzYwotCQljdHJsX2JyaWVmX2Rlc2MgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDIodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQlJJRUZfREVTQ1JJUFRJT05fVEVYVCk7Ci0KLQkJLy8gRXh0ZXJuYWwgSWQKLQkJY3RybF9leHRlcm5hbF9pZCA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc19FeHRlcm5hbElEKTsgCi0KLQkJLy8gUHVycG9zZQotCQljdHJsX3B1cnBvc2UgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24oCi0JCQkJdG9vbGtpdCwKLQkJCQlnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NfUHVycG9zZSwgNDAsIDQwMCwgR0VORVJBTF9TRUNUSU9OX0lEKTsgCi0KLQkJLy8gLy8gY3JlYXRlIGV4cGFuZGVkIGNvbXBvc2l0ZQotCQkvLyBleHBhbmRHZW5lcmFsQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZ2VuZXJhbFNlY3Rpb24pOwotCQkvLyBleHBhbmRHZW5lcmFsQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3Ci0JCS8vIEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkvLyBleHBhbmRHZW5lcmFsQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQkvLyBleHBhbmRHZW5lcmFsQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCQkvLwkJCi0JCS8vIC8vIEh5cGVybGluayBkZXNjCi0JCS8vIGV4cGFuZEdlbmVyYWxMaW5rID0KLQkJLy8gdG9vbGtpdC5jcmVhdGVJbWFnZUh5cGVybGluayhleHBhbmRHZW5lcmFsQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCS8vIGV4cGFuZEdlbmVyYWxMaW5rLnNldEltYWdlKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19FWFBBTkRFRCk7Ci0JCS8vIGV4cGFuZEdlbmVyYWxMaW5rLnNldFVuZGVybGluZWQoZmFsc2UpOwotCQkvLyBleHBhbmRHZW5lcmFsTGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpCi0JCS8vIHsKLQkJLy8gcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKQotCQkvLyB7Ci0JCS8vIHRvZ2dsZShlLCBHRU5FUkFMX1NFQ1RJT05fSUQpOwotCQkvLyB9Ci0JCS8vIH0pOwotCQkvLwkJCi0JCS8vIGV4cGFuZEdlbmVyYWxMYWJlbCA9IGNyZWF0ZUxhYmVsKHRvb2xraXQsIGV4cGFuZEdlbmVyYWxDb21wb3NpdGUsCi0JCS8vICIiKTsKLQotCQkvLyBzZXQgZm9jdXMgb24gdGhlIG5hbWUgYXR0cmlidXRlCi0JCURpc3BsYXkgZGlzcGxheSA9IGZvcm0uZ2V0Qm9keSgpLmdldERpc3BsYXkoKTsKLQkJaWYgKCEoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBkZXRhaWwgc2VjdGlvbgotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGV0YWlsU2VjdGlvbigpIHsKLQkJLy8gY3JlYXRlIGRldGFpbCBzZWN0aW9uCi0JCWRldGFpbFNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksCi0JCQkJU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQKLQkJCQkJCXwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQlkZXRhaWxTZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQlkZXRhaWxTZWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LkRFVEFJTF9TRUNUSU9OX05BTUUpOwotCQlkZXRhaWxTZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ERVRBSUxfU0VDVElPTl9ERVNDLAotCQkJCW5ldyBTdHJpbmdbXSB7IHByb2Nlc3NUeXBlIH0pKTsKLQkJZGV0YWlsU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJZGV0YWlsQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZGV0YWlsU2VjdGlvbik7Ci0JCWRldGFpbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJZGV0YWlsQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlkZXRhaWxTZWN0aW9uLnNldENsaWVudChkZXRhaWxDb21wb3NpdGUpOwotCi0JCS8vIGZ1bGwgZGVzY3JpcHRpb24KLQkJY3RybF9mdWxsX2Rlc2MgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5NQUlOX0RFU0NSSVBUSU9OX1RFWFQsIDEwMCwKLQkJCQk0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsKLQotCQkvLyBzY29wZQotCQljdHJsX3Njb3BlID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX1Njb3BlLCA0MCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7IAotCi0JCS8vIHVzYWdlIG5vdGVzCi0JCWN0cmxfdXNhZ2Vfbm90ZXMgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24oCi0JCQkJdG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc19Vc2FnZU5vdGVzLCA0MCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7IAotCi0JCS8vIGFsdGVybmF0aXZlcwotCQljdHJsX2FsdGVybmF0aXZlcyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX0FsdGVybmF0aXZlcywgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAKLQotCQkvLyBob3cgdG8gc3RhZmYKLQkJY3RybF9ob3dfdG9fc3RhZmYgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24oCi0JCQkJdG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc19Ib3dUb1N0YWZmLCA0MCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7IAotCi0JCS8vIGtleSBjb25zaWRlcmF0aW9uCi0JCWN0cmxfa2V5X2NvbnNpZGVyYXRpb24gPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24oCi0JCQkJdG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc19LZXlDb25zaWRlcmF0aW9uLCA0MCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7IAotCi0JCS8vIC8vIGNyZWF0ZSBleHBhbmRlZCBjb21wb3NpdGUKLQkJLy8gZXhwYW5kRGV0YWlsQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZGV0YWlsU2VjdGlvbik7Ci0JCS8vIGV4cGFuZERldGFpbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldwotCQkvLyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJLy8gZXhwYW5kRGV0YWlsQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQkvLyBleHBhbmREZXRhaWxDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCS8vCQkKLQkJLy8gLy8gSHlwZXJsaW5rIGRlc2MKLQkJLy8gZXhwYW5kRGV0YWlsTGluayA9Ci0JCS8vIHRvb2xraXQuY3JlYXRlSW1hZ2VIeXBlcmxpbmsoZXhwYW5kRGV0YWlsQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCS8vIGV4cGFuZERldGFpbExpbmsuc2V0SW1hZ2UoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0VYUEFOREVEKTsKLQkJLy8gZXhwYW5kRGV0YWlsTGluay5zZXRVbmRlcmxpbmVkKGZhbHNlKTsKLQkJLy8gZXhwYW5kRGV0YWlsTGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpCi0JCS8vIHsKLQkJLy8gcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKQotCQkvLyB7Ci0JCS8vIHRvZ2dsZShlLCBERVRBSUxfU0VDVElPTl9JRCk7Ci0JCS8vIH0KLQkJLy8gfSk7Ci0JCS8vCQkKLQkJLy8gZXhwYW5kRGV0YWlsTGFiZWwgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCBleHBhbmREZXRhaWxDb21wb3NpdGUsICIiKTsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBjb25maWd1cmF0aW9uIHNlY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb25maWd1cmF0aW9uU2VjdGlvbigpIHsKLQkJLy8gY3JlYXRlIENvbmZpZ3VyYXRpb24gc2VjdGlvbgotCQljb25maWdTZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGZvcm0uZ2V0Qm9keSgpLAotCQkJCVNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVECi0JCQkJCQl8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJVGFibGVXcmFwRGF0YSB0ZDEgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCWNvbmZpZ1NlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZDEpOwotCQljb25maWdTZWN0aW9uCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uVGl0bGUpOyAKLQkJY29uZmlnU2VjdGlvbgotCQkJCS5zZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25NZXNzYWdlKTsgCi0JCWNvbmZpZ1NlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWNvbmZpZ0NvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGNvbmZpZ1NlY3Rpb24pOwotCQljb25maWdDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWNvbmZpZ0NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJY29uZmlnU2VjdGlvbi5zZXRDbGllbnQoY29uZmlnQ29tcG9zaXRlKTsKLQotCQlMYWJlbCBsX2VsZW1lbnQgPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUxhYmVsKAotCQkJCQkJY29uZmlnQ29tcG9zaXRlLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25zKTsgCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5FTkQsIHRydWUsCi0JCQkJCXRydWUsIDIsIDEpOwotCQkJbF9lbGVtZW50LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJbGlzdF9jb25maWd1cmF0aW9ucyA9IFVJSGVscGVyLmNyZWF0ZUxpc3QodG9vbGtpdCwgY29uZmlnQ29tcG9zaXRlLAotCQkJCVNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gODA7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0JCQlsaXN0X2NvbmZpZ3VyYXRpb25zLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCWNvbmZpZ0xpc3RWaWV3ZXIgPSBuZXcgTGlzdFZpZXdlcihsaXN0X2NvbmZpZ3VyYXRpb25zKTsKLQkJY29uZmlnTGlzdFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJY29uZmlnTGlzdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50ID09IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKSkgewotCQkJCQlyZXR1cm4gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCQkJCSJpY29ucy9jaGVja2VkLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgdHh0ID0gbGFiZWxQcm92aWRlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJCWlmIChlbGVtZW50ID09IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKSkgewotCQkJCQl0eHQgPSB0eHQKLQkJCQkJCQkrICIgIiArIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NEZXNjcmlwdGlvbl9kZWZhdWx0OyAvLyROT04tTkxTLTEkIAotCQkJCX0KLQkJCQlyZXR1cm4gdHh0OwotCQkJfQotCQl9KTsKLQotCQlDb21wb3NpdGUgYnV0dG9uUGFuZWwgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShjb25maWdDb21wb3NpdGUpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCBmYWxzZSwKLQkJCQkJZmFsc2UpOwotCQkJLy8gZ3JpZERhdGEud2lkdGhIaW50ID0gODA7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gNDsKLQkJCWJ1dHRvblBhbmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJYnV0dG9uUGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCX0KLQkJLy8gQWRkIGJ1dHRvbgotCQlCdXR0b24gYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uUGFuZWwsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFkZEJ1dHRvbl90ZXh0LCBTV1QuTk9ORSk7IAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJYnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCWJ1dHRvbkFkZCA9IGJ1dHRvbjsKLQotCQkvLyBSZW1vdmUgYnV0dG9uCi0JCWJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvblBhbmVsLCBBdXRob3JpbmdVSVJlc291cmNlcy5yZW1vdmVCdXR0b25fdGV4dCwgU1dULk5PTkUpOyAKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlidXR0b25SZW1vdmUgPSBidXR0b247Ci0KLQkJLy8gLy8gRWRpdCBidXR0b24KLQkJLy8gYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uUGFuZWwsICJFZGl0Li4uIiwgU1dULk5PTkUpOwotCQkvLyB7Ci0JCS8vIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCS8vIGdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQgKiA2OwotCQkvLyBidXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCS8vIH0KLQkJLy8gYnV0dG9uRWRpdCA9IGJ1dHRvbjsKLQkJLy8JCQotCQkvLwkJCi0JCS8vIE1ha2UgRGVmYXVsdCBidXR0b24KLQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uUGFuZWwsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLm1ha2VEZWZhdWx0QnV0dG9uX3RleHQsIFNXVC5OT05FKTsgCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlidXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJYnV0dG9uTWFrZURlZmF1bHQgPSBidXR0b247Ci0KLQkJLy8gY29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbgotCQlMYWJlbCBsYWJlbCA9IHRvb2xraXQKLQkJCQkuY3JlYXRlTGFiZWwoCi0JCQkJCQljb25maWdDb21wb3NpdGUsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbkRlc2NyaXB0aW9uKTsgCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5FTkQsIHRydWUsCi0JCQkJCWZhbHNlLCAyLCAxKTsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJdGV4dENvbmZpZ0Rlc2NyaXB0aW9uID0gdG9vbGtpdC5jcmVhdGVUZXh0KGNvbmZpZ0NvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDgwOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNDAwOwotCQkJdGV4dENvbmZpZ0Rlc2NyaXB0aW9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCXRleHRDb25maWdEZXNjcmlwdGlvbi5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLS8vCQlpZiAocHJvY2Vzc0xpc3RlbmVyICE9IG51bGwpIHsKLS8vCQkJcHJvY2Vzcy5lQWRhcHRlcnMoKS5yZW1vdmUocHJvY2Vzc0xpc3RlbmVyKTsKLS8vCQl9Ci0KLQkJaWYgKGNvbmZpZ0xpc3RBZGFwdGVyICE9IG51bGwpIHsKLQkJCWNvbmZpZ0xpc3RBZGFwdGVyLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCWRpc3Bvc2VkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50IHByb3ZpZGVyIGZvciBjb25maWd1cmF0aW9ucwotCSAqCi0JICovCi0JY2xhc3MgQ29uZmlnTGlzdEl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cwotCQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyIHsKLQkJCi0JCS8qKgotCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCQkgKi8KLQkJcHVibGljIENvbmZpZ0xpc3RJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCXByb2Nlc3MuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gZGVmYXVsdENvbmZpZyA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQotCQkJaWYgKGRlZmF1bHRDb25maWcgIT0gbnVsbAotCQkJCQkmJiAhcHJvY2Vzcy5nZXRWYWxpZENvbnRleHQoKS5jb250YWlucyhkZWZhdWx0Q29uZmlnKSkgewotCQkJCXByb2Nlc3MuZ2V0VmFsaWRDb250ZXh0KCkuYWRkKDAsIGRlZmF1bHRDb25maWcpOwotCQkJfQotCQkJcmV0dXJuIHByb2Nlc3MuZ2V0VmFsaWRDb250ZXh0KCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24gbXNnKSB7Ci0JCQlib29sZWFuIHJlZnJlc2ggPSBmYWxzZTsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChQcm9jZXNzLmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQ6Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQlyZWZyZXNoID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOgotCQkJCXJlZnJlc2ggPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHJlZnJlc2gpCi0JCQkJY29uZmlnTGlzdFZpZXdlci5yZWZyZXNoKCk7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZU1vZGVsQ29udHJvbHMoKSB7Ci0JCWlmICgoY3RybF9uYW1lICE9IG51bGwpICYmICghY3RybF9uYW1lLmlzRGlzcG9zZWQoKSkpIHsKLQkJCXVwZGF0ZUNvbnRyb2woY3RybF9uYW1lLCBwcm9jZXNzLmdldE5hbWUoKSk7Ci0JCX0KLQkJaWYgKChjdHJsX2JyaWVmX2Rlc2MgIT0gbnVsbCkgJiYgKCFjdHJsX2JyaWVmX2Rlc2MuaXNEaXNwb3NlZCgpKSkgewotCQkJdXBkYXRlQ29udHJvbChjdHJsX2JyaWVmX2Rlc2MsIHByb2Nlc3MuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJfQotCQlpZiAoKGN0cmxfcHJlc2VudGF0aW9uX25hbWUgIT0gbnVsbCkKLQkJCQkmJiAoIWN0cmxfcHJlc2VudGF0aW9uX25hbWUuaXNEaXNwb3NlZCgpKSkgewotCQkJdXBkYXRlQ29udHJvbChjdHJsX3ByZXNlbnRhdGlvbl9uYW1lLCBwcm9jZXNzLmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBUZXh0IGNvbnRyb2wgaWZmIHRoZSBuZXdUZXh0IGlzIGRpZmZlcmVudCB0aGFuIHdoYXQncyB0aGVyZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIG5ld1RleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHVwZGF0ZUNvbnRyb2woVGV4dCB0ZXh0LCBTdHJpbmcgbmV3VGV4dCkgewotCQlpZiAoIXRleHQuZ2V0VGV4dCgpLmVxdWFscyhUbmdVdGlsLmNoZWNrTnVsbChuZXdUZXh0KSkpIHsKLQkJCXRleHQuc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChuZXdUZXh0KSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBJTWV0aG9kUmljaFRleHQgY29udHJvbCBpZmYgdGhlIG5ld1RleHQgaXMgZGlmZmVyZW50IHRoYW4gd2hhdCdzIHRoZXJlCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRlQ29udHJvbChJTWV0aG9kUmljaFRleHQgdGV4dCwgU3RyaW5nIG5ld1RleHQpIHsKLQkJaWYgKCF0ZXh0LmdldFRleHQoKS5lcXVhbHMoVG5nVXRpbC5jaGVja051bGwobmV3VGV4dCkpKSB7Ci0JCQl0ZXh0LnNldFRleHQoVG5nVXRpbC5jaGVja051bGwobmV3VGV4dCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyBpbml0aWFsIGRhdGEgZnJvbSBtb2RlbAotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWREYXRhKCkgewotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiBjb250ZW50ID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uKSBwcm9jZXNzCi0JCQkJLmdldFByZXNlbnRhdGlvbigpOwotCi0JCVN0cmluZyBleHRlcm5hbElEID0gY29udGVudC5nZXRFeHRlcm5hbElkKCk7Ci0JCVN0cmluZyBwdXJwb3NlID0gY29udGVudC5nZXRQdXJwb3NlKCk7Ci0JCVN0cmluZyBmdWxsRGVzYyA9IGNvbnRlbnQuZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZyBzY29wZSA9IGNvbnRlbnQuZ2V0U2NvcGUoKTsKLQkJU3RyaW5nIHVzYWdlTm90ZXMgPSBjb250ZW50LmdldFVzYWdlTm90ZXMoKTsKLQkJU3RyaW5nIGFsdGVybmF0aXZlcyA9IGNvbnRlbnQuZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCVN0cmluZyBob3dUb1N0YWZmID0gY29udGVudC5nZXRIb3d0b1N0YWZmKCk7Ci0JCVN0cmluZyBrZXlDb25zaWRlcmF0aW9uID0gY29udGVudC5nZXRLZXlDb25zaWRlcmF0aW9ucygpOwotCi0JCXVwZGF0ZU1vZGVsQ29udHJvbHMoKTsKLQotCQl1cGRhdGVDb250cm9sKGN0cmxfZXh0ZXJuYWxfaWQsIGV4dGVybmFsSUQpOwotCQl1cGRhdGVDb250cm9sKGN0cmxfcHVycG9zZSwgcHVycG9zZSk7Ci0JCXVwZGF0ZUNvbnRyb2woY3RybF9mdWxsX2Rlc2MsIGZ1bGxEZXNjKTsKLQkJdXBkYXRlQ29udHJvbChjdHJsX3Njb3BlLCBzY29wZSk7Ci0JCXVwZGF0ZUNvbnRyb2woY3RybF91c2FnZV9ub3RlcywgdXNhZ2VOb3Rlcyk7Ci0JCXVwZGF0ZUNvbnRyb2woY3RybF9hbHRlcm5hdGl2ZXMsIGFsdGVybmF0aXZlcyk7Ci0JCXVwZGF0ZUNvbnRyb2woY3RybF9ob3dfdG9fc3RhZmYsIGhvd1RvU3RhZmYpOwotCQl1cGRhdGVDb250cm9sKGN0cmxfa2V5X2NvbnNpZGVyYXRpb24sIGtleUNvbnNpZGVyYXRpb24pOwotCi0JCWlmIChjb25maWdMaXN0QWRhcHRlciA9PSBudWxsKSB7Ci0JCQljb25maWdMaXN0QWRhcHRlciA9IG5ldyBDb25maWdMaXN0SXRlbVByb3ZpZGVyKAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCX0KLQotCQljb25maWdMaXN0Vmlld2VyLnNldElucHV0KGNvbmZpZ0xpc3RBZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQl0aGlzLmVkaXRvciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpOwotCQlmaW5hbCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlmaW5hbCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiBjb250ZW50ID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uKSBwcm9jZXNzCi0JCQkJLmdldFByZXNlbnRhdGlvbigpOwotCQltb2RpZnlMaXN0ZW5lciA9IGVkaXRvci5jcmVhdGVNb2RpZnlMaXN0ZW5lcihwcm9jZXNzKTsKLQkJY29udGVudE1vZGlmeUxpc3RlbmVyID0gZWRpdG9yLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKHByb2Nlc3MKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCi0JCWZvcm0uYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCWlmICghZGVzY0V4cGFuZEZsYWcpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAoY3RybF9leHBhbmRlZCAhPSBudWxsKSB7Ci0JCQkJCSgoR3JpZERhdGEpIGN0cmxfZXhwYW5kZWQuZ2V0TGF5b3V0RGF0YSgpKS5oZWlnaHRIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JIZWlnaHQoKTsKLQkJCQkJKChHcmlkRGF0YSkgY3RybF9leHBhbmRlZC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKTsKLQkJCQl9Ci0JCQkJZm9ybVNlY3Rpb24ubGF5b3V0KHRydWUsIHRydWUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjb250cm9sTW92ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJZm9ybS5nZXRQYXJlbnQoKS5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChwcm9jZXNzKSkgewotCQkJCQlyZWZyZXNoKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZWZyZXNoKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQluYW1lTW9kaWZ5TGlzdGVuZXIgPSBlZGl0b3IuY3JlYXRlTW9kaWZ5TGlzdGVuZXIocHJvY2Vzcy5lQ29udGFpbmVyKCksCi0JCQkJdHJ1ZSk7Ci0JCWN0cmxfbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihuYW1lTW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX25hbWUuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IHByb2Nlc3MuZ2V0TmFtZSgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJZS53aWRnZXQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld05hbWUgPSBjdHJsX25hbWUuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJCQlpZiAobmV3TmFtZS5lcXVhbHMocHJvY2Vzcy5nZXROYW1lKCkpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wID0gKFByb2Nlc3NDb21wb25lbnQpIHByb2Nlc3MuZUNvbnRhaW5lcigpOwotCQkJCQotCQkJCVN0cmluZyBtc2cgPSBudWxsOwotCQkJCWlmIChuZXdOYW1lLmluZGV4T2YoJyYnKSA+IC0xKSB7IC8vRklYTUU6IHRoaXMgbXVzdCBnbyB0byB2YWxpZGF0b3IgY29kZQotCQkJCQltc2cgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjRfbXNnLCBuZXdOYW1lKTsKLQkJCQl9IGVsc2UgewotCQkJCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5jcmVhdGVOYW1lVmFsaWRhdG9yKAotCQkJCQkJCXByb2NDb21wLAotCQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJCQltc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChuZXdOYW1lKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX3RpdGxlOyAKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV9tZXNzYWdlOyAKLQkJCQkJaWYgKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKHRpdGxlLCBtZXNzYWdlKSkgewotCQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQotCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQlwcm9jZXNzLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLCBjdHJsX25hbWUKLQkJCQkJCQkJCQkuZ2V0VGV4dCgpLCAtMSk7Ci0JCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCWN0cmxfbmFtZS5zZXRUZXh0KHByb2Nlc3MuZ2V0TmFtZSgpKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBwcm9jQ29tcCwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJCQkJCQkJY3RybF9uYW1lLmdldFRleHQoKSwgLTEpOwotCi0JCQkJCQlzZXRGb3JtVGV4dCgpOwotCi0JCQkJCQkvLyBhZGp1c3QgcGx1Z2luIGxvY2F0aW9uIGFuZCBzYXZlIHRoZSBlZGl0b3IKLQkJCQkJCS8vCi0JCQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRTaXRlKCkuZ2V0U2hlbGwoKQotCQkJCQkJCQkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQkJCQkJCQkJZWRpdG9yCi0JCQkJCQkJCQkJLmRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCQkJaWYoZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCQkJCQkJLy8gc2F2ZSBmYWlsZWQKLQkJCQkJCQkJCS8vCi0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCX0KLQkJCQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IGVkaXRvcgotCQkJCQkJCQkJCS5nZXRQZXJzaXN0ZXIoKTsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCXBlcnNpc3Rlci5hZGp1c3RMb2NhdGlvbihwcm9jZXNzCi0JCQkJCQkJCQkJCQkJLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCQkJCXRocm93IGU7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJLy8gYWRqdXN0IGRpYWdyYW0gcmVzb3VyY2UgYXMgd2VsbAotCQkJCQkJCQkvLwotCQkJCQkJCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShwcm9jZXNzLCB0aGlzKTsKLQkJCQkJCQkJaWYobWdyICE9IG51bGwpIHsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJbWdyLnVwZGF0ZVJlc291cmNlVVJJKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQkJCW1nci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY3RybF9uYW1lLnNldFRleHQocHJvY2Vzcy5nZXROYW1lKCkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ190aXRsZSwgbXNnKTsgCi0JCQkJCWN0cmxfbmFtZS5zZXRUZXh0KHByb2Nlc3MuZ2V0TmFtZSgpKTsKLQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCWN0cmxfbmFtZS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCQkJCQljdHJsX25hbWUuc2VsZWN0QWxsKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWN0cmxfbmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBwcm9jZXNzLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmICgoY3RybF9wcmVzZW50YXRpb25fbmFtZS5nZXRUZXh0KCkgIT0gbnVsbCkKLQkJCQkJCSYmICghY3RybF9wcmVzZW50YXRpb25fbmFtZS5nZXRUZXh0KCkuZXF1YWxzKCIiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQkJCWlmICghY3RybF9wcmVzZW50YXRpb25fbmFtZS5nZXRUZXh0KCkuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0KLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJcHJvY2VzcywKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLAotCQkJCQkJCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuZ2V0VGV4dCgpLCAtMSk7Ci0JCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuc2V0VGV4dChvbGRDb250ZW50KTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0vLwkJCQkJCUxpYnJhcnlWaWV3IGVsZW1lbnRzVmlldyA9IExpYnJhcnlWaWV3LmdldFZpZXcoKTsKLS8vCQkJCQkJaWYgKGVsZW1lbnRzVmlldyAhPSBudWxsKQotLy8JCQkJCQkJZWxlbWVudHNWaWV3LmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHJlc3RvcmUgdGhlIG9sZCBuYW1lIGZpcnN0LCB0aGVuIHByZXNlbnQgdGhlIGVycm9yCi0JCQkJCS8vIG1lc3NhZ2UgYm94Ci0JCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuc2V0VGV4dChwcm9jZXNzCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmludmFsaWRQcmVzZW50YXRpb25OYW1lRXJyb3JfbXNnKTsgCi0JCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLmdldERpc3BsYXkoKS5hc3luY0V4ZWMoCi0JCQkJCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpOwotCQkJCS8vIHdoZW4gdXNlciB0YWIgdG8gdGhpcyBmaWVsZCwgc2VsZWN0IGFsbCB0ZXh0Ci0JCQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5zZWxlY3RBbGwoKTsKLQotCQkJfQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24gd2hlbiB0aGUgZm9jdXMgb2YgdGhlIGNvbXBvbmVudCBpcyBsb3N0IAotCQkJCWlmKGN0cmxfcHJlc2VudGF0aW9uX25hbWUuZ2V0U2VsZWN0aW9uQ291bnQoKSA+IDApewotCQkJCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLmNsZWFyU2VsZWN0aW9uKCk7Ci0JCQkJfSB9Ci0JCX0pOwotCi0JCWN0cmxfYnJpZWZfZGVzYy5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfYnJpZWZfZGVzYy5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gcHJvY2Vzcy5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGN0cmxfYnJpZWZfZGVzYy5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCXByb2Nlc3MsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcykgewotCQkJCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQobmV3Q29udGVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZXh0ZXJuYWxfaWQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9leHRlcm5hbF9pZC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldEV4dGVybmFsSWQoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWN0cmxfZXh0ZXJuYWxfaWQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjdHJsX2V4dGVybmFsX2lkLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJcHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQkJCWN0cmxfZXh0ZXJuYWxfaWQuc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9KTsKLQotCQljdHJsX3B1cnBvc2Uuc2V0TW9kYWxPYmplY3QocHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfcHVycG9zZS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCkpOwotCQljdHJsX3B1cnBvc2UuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9wdXJwb3NlLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9wdXJwb3NlOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldFB1cnBvc2UoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWN0cmxfcHVycG9zZSwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgcHJvY2VzcwotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCksIG5ld0NvbnRlbnQsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZnVsbF9kZXNjLnNldE1vZGFsT2JqZWN0KHByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2Z1bGxfZGVzYy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpKTsKLQkJY3RybF9mdWxsX2Rlc2MuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9mdWxsX2Rlc2MuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX2Z1bGxfZGVzYzsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRNYWluRGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWN0cmxfZnVsbF9kZXNjLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBwcm9jZXNzCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9zY29wZS5zZXRNb2RhbE9iamVjdChwcm9jZXNzLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9zY29wZS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCkpOwotCQljdHJsX3Njb3BlLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfc2NvcGUuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX3Njb3BlOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldFNjb3BlKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljdHJsX3Njb3BlLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBwcm9jZXNzCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKSwgbmV3Q29udGVudCwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF91c2FnZV9ub3Rlcy5zZXRNb2RhbE9iamVjdChwcm9jZXNzLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF91c2FnZV9ub3Rlcy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1VzYWdlTm90ZXMoKSk7Ci0JCWN0cmxfdXNhZ2Vfbm90ZXMuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF91c2FnZV9ub3Rlcy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfdXNhZ2Vfbm90ZXM7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0VXNhZ2VOb3RlcygpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY3RybF91c2FnZV9ub3Rlcywgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgcHJvY2VzcwotCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCksCi0JCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2FsdGVybmF0aXZlcy5zZXRNb2RhbE9iamVjdChwcm9jZXNzLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9hbHRlcm5hdGl2ZXMuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkpOwotCQljdHJsX2FsdGVybmF0aXZlcy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2FsdGVybmF0aXZlcy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfYWx0ZXJuYXRpdmVzOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldEFsdGVybmF0aXZlcygpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY3RybF9hbHRlcm5hdGl2ZXMsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHByb2Nlc3MKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCksIG5ld0NvbnRlbnQsCi0JCQkJCQkJLTEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9ob3dfdG9fc3RhZmYuc2V0TW9kYWxPYmplY3QocHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfaG93X3RvX3N0YWZmLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKSk7Ci0JCWN0cmxfaG93X3RvX3N0YWZmLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfaG93X3RvX3N0YWZmLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9ob3dfdG9fc3RhZmY7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0SG93dG9TdGFmZigpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY3RybF9ob3dfdG9fc3RhZmYsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHByb2Nlc3MKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93dG9TdGFmZigpLCBuZXdDb250ZW50LAotCQkJCQkJCS0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfa2V5X2NvbnNpZGVyYXRpb24uc2V0TW9kYWxPYmplY3QocHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfa2V5X2NvbnNpZGVyYXRpb24uc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpKTsKLQkJY3RybF9rZXlfY29uc2lkZXJhdGlvbi5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2tleV9jb25zaWRlcmF0aW9uLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9rZXlfY29uc2lkZXJhdGlvbjsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRLZXlDb25zaWRlcmF0aW9ucygpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY3RybF9rZXlfY29uc2lkZXJhdGlvbiwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgcHJvY2VzcwotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY29uZmlnTGlzdFZpZXdlcgotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbmZpZ0xpc3RWaWV3ZXIKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKChNZXRob2RDb25maWd1cmF0aW9uKSBzZWxlY3Rpb24KLQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQkJCQkJaWYgKGNvbmZpZyA9PSBwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkpIHsKLQkJCQkJCQkJYnV0dG9uUmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWJ1dHRvblJlbW92ZS5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCQlTdHJpbmcgZGVzYyA9IGNvbmZpZy5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJCQlkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJdGV4dENvbmZpZ0Rlc2NyaXB0aW9uLnNldFRleHQoZGVzYyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlidXR0b25BZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlNZXRob2RMaWJyYXJ5IGxpYiA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeShwcm9jZXNzKTsKLQotCQkJCWZpbmFsIENvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyIGlucHV0ID0gbmV3IENvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyKAotCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJbGliLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCUxpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IExpc3RTZWxlY3Rpb25EaWFsb2coCi0JCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJaW5wdXQsCi0JCQkJCQljb250ZW50UHJvdmlkZXIsCi0JCQkJCQlsYWJlbFByb3ZpZGVyLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0Rlc2NyaXB0aW9uX3NlbGVjdENvbmZpZ3VyYXRpb24pIHsgCi0JCQkJCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCQkJQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkJCQkJZ2V0Vmlld2VyKCkuYWRkRmlsdGVyKG5ldyBWaWV3ZXJGaWx0ZXIoKSB7Ci0KLQkJCQkJCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwKLQkJCQkJCQkJCU9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotCQkJCQkJCQkvLyBpbnQgY291bnQgPQotCQkJCQkJCQkvLyBjb25maWdMaXN0Vmlld2VyLmdldExpc3QoKS5nZXRJdGVtQ291bnQoKTsKLQkJCQkJCQkJLy8gZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQkJCQkJLy8gaWYoZWxlbWVudCA9PQotCQkJCQkJCQkvLyBjb25maWdMaXN0Vmlld2VyLmdldEVsZW1lbnRBdChpKSkgcmV0dXJuCi0JCQkJCQkJCS8vIGZhbHNlOwotCQkJCQkJCQkvLyB9Ci0JCQkJCQkJCS8vIHJldHVybiB0cnVlOwotCQkJCQkJCQlyZXR1cm4gIXByb2Nlc3MuZ2V0VmFsaWRDb250ZXh0KCkuY29udGFpbnMoCi0JCQkJCQkJCQkJZWxlbWVudCk7Ci0JCQkJCQkJfQotCi0JCQkJCQl9KTsKLQkJCQkJCXJldHVybiBjb250cm9sOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCQkJCQlpbnB1dC5kaXNwb3NlKCk7Ci0JCQkJCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQkJCQkJfQotCQkJCX07Ci0JCQkJaWYgKGRsZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJCU9iamVjdCBvYnNbXSA9IGRsZy5nZXRSZXN1bHQoKTsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JCQkJCS8vIGdldCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLS8vCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb25maWcgPSBwcm9jZXNzCi0vLwkJCQkJCQkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBvYnNbaV07Ci0JCQkJCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLS8vCQkJCQkJCQl8fCBjaGVja1ZhbGlkaXR5Rm9yU3VwZXJTZXQoZGVmYXVsdENvbmZpZywKLS8vCQkJCQkJCQkJCWNvbmZpZykpIHsKLQkJCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCBwcm9jZXNzLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCksIGNvbmZpZywKLQkJCQkJCQkJCS0xKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWRkQ29uZmlnRXJyb3JEaWFsb2dfdGl0bGUsIAotCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmludmFsaWRDb25maWdFcnJvcl9tc2csIGNvbmZpZy5nZXROYW1lKCkpKTsgCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWJ1dHRvblJlbW92ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29uZmlnTGlzdFZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgcHJvY2VzcywKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCksCi0JCQkJCQlzZWxlY3Rpb24udG9MaXN0KCksIC0xKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYnV0dG9uTWFrZURlZmF1bHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbmZpZ0xpc3RWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IHByb2Nlc3MKLQkJCQkJCQkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQotCQkJCQlpZiAoY3VycmVudENvbmZpZyAhPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpIHsKLQkJCQkJCWJvb2xlYW4gaXNWYWxpZCA9IHRydWU7Ci0JCQkJCQlMaXN0IHZhbGlkQ29udGV4dCA9IHByb2Nlc3MuZ2V0VmFsaWRDb250ZXh0KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB2YWxpZENvbnRleHQuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0b3IKLQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJaWYgKCEoY2hlY2tWYWxpZGl0eUZvclN1cGVyU2V0KAotCQkJCQkJCQkJKE1ldGhvZENvbmZpZ3VyYXRpb24pIHNlbGVjdGlvbgotCQkJCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCksIGNvbmZpZykpKSB7Ci0JCQkJCQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGlzVmFsaWQpIHsKLQkJCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwgcHJvY2VzcywKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCksCi0JCQkJCQkJCQlzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCksIC0xKTsKLQkJCQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCWJ1dHRvblJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJU3RyaW5nIHNlbGVjdGVkQ29uZmlnTmFtZSA9ICgoTWV0aG9kQ29uZmlndXJhdGlvbikgc2VsZWN0aW9uCi0JCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpLmdldE5hbWUoKTsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zZXREZWZhdWx0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGUsIAotCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNldERlZmF1bHRDb25maWdFcnJvcl9tc2csIHNlbGVjdGVkQ29uZmlnTmFtZSkpOyAKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaCBhbGwgdGhlIGNvbnRyb2xzCi0JICogCi0JICogQHBhcmFtIGVkaXRhYmxlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChib29sZWFuIGVkaXRhYmxlKSB7Ci0JCWlmICghY3RybF9uYW1lLmlzRGlzcG9zZWQoKSkgewotCQkJY3RybF9uYW1lLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAoIWN0cmxfcHJlc2VudGF0aW9uX25hbWUuaXNEaXNwb3NlZCgpKSB7Ci0JCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAoIWN0cmxfYnJpZWZfZGVzYy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKCFjdHJsX3B1cnBvc2UuaXNEaXNwb3NlZCgpKSB7Ci0JCQljdHJsX3B1cnBvc2Uuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmICghY3RybF9mdWxsX2Rlc2MuaXNEaXNwb3NlZCgpKSB7Ci0JCQljdHJsX2Z1bGxfZGVzYy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKCFjdHJsX2FsdGVybmF0aXZlcy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWN0cmxfYWx0ZXJuYXRpdmVzLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAoIWN0cmxfZXh0ZXJuYWxfaWQuaXNEaXNwb3NlZCgpKQotCQkJY3RybF9leHRlcm5hbF9pZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWlmICghY3RybF9rZXlfY29uc2lkZXJhdGlvbi5pc0Rpc3Bvc2VkKCkpCi0JCQljdHJsX2tleV9jb25zaWRlcmF0aW9uLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJaWYgKCFjdHJsX2hvd190b19zdGFmZi5pc0Rpc3Bvc2VkKCkpCi0JCQljdHJsX2hvd190b19zdGFmZi5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWlmICghY3RybF9zY29wZS5pc0Rpc3Bvc2VkKCkpCi0JCQljdHJsX3Njb3BlLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJaWYgKCFjdHJsX3VzYWdlX25vdGVzLmlzRGlzcG9zZWQoKSkKLQkJCWN0cmxfdXNhZ2Vfbm90ZXMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQlpZiAoY3RybF9leHBhbmRlZCAhPSBudWxsICYmICFjdHJsX2V4cGFuZGVkLmlzRGlzcG9zZWQoKSkgewotCQkJY3RybF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKCFidXR0b25BZGQuaXNEaXNwb3NlZCgpKQotCQkJYnV0dG9uQWRkLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlpZiAoIWJ1dHRvbk1ha2VEZWZhdWx0LmlzRGlzcG9zZWQoKSkKLQkJCWJ1dHRvbk1ha2VEZWZhdWx0LnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlpZiAoIWJ1dHRvblJlbW92ZS5pc0Rpc3Bvc2VkKCkpCi0JCQlidXR0b25SZW1vdmUuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogVG9nZ2xlIERlc2NyaXB0aW9uIGNvbnRyb2wgdG8gZXhwYW5kIGFuZCBjb250cm9sIHN0YXRlCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdG9nZ2xlKEh5cGVybGlua0V2ZW50IGUsIGludCBpZCkgewotCQkvLyBUT0RPLSB3ZSBzaG91bGQgY29tYmluZSB0aGVzZSBtZXRob2RzIGludG8gb25lLiBPbmUgd2F5IHRvIGRvIGl0LAotCQkvLyBkaXNwb2luZwotCQkvLyBjdHJsX2V4cGFuZGVkIGV2ZXJ5IHRpbWUgaXQgY29sbGFwc2VzIGFuZCBjcmVhdGluZyBpdCB3aGVuIHdlIGV4cGFuZC4KLQkJLy8gQXQgcHJlc2VudCwgdGhlcmUgaXMgbm8gbWV0aG9kIHRvIGRpc3Bvc2UKLQkJdG9nZ2xlKGUpOwotCQkvLyBpZiAoaWQgPT0gR0VORVJBTF9TRUNUSU9OX0lEKQotCQkvLyB7Ci0JCS8vIHRvZ2dsZUdlbmVyYWxTZWN0aW9uKGUpOwotCQkvLyB9Ci0JCS8vIGlmIChpZCA9PSBERVRBSUxfU0VDVElPTl9JRCkKLQkJLy8gewotCQkvLyB0b2dnbGVEZXRhaWxTZWN0aW9uKGUpOwotCQkvLyB9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdG9nZ2xlKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJaWYgKGN0cmxfZXhwYW5kZWQgPT0gbnVsbCkgewotCQkJY3RybF9leHBhbmRlZCA9IGNyZWF0ZVJpY2hUZXh0RWRpdG9yKHRvb2xraXQsIGV4cGFuZGVkQ29tcG9zaXRlLAotCQkJCQlTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCwKLQkJCQkJR3JpZERhdGEuRklMTF9WRVJUSUNBTCwgZ2V0UmljaFRleHRFZGl0b3JIZWlnaHQoKSwKLQkJCQkJZ2V0UmljaFRleHRFZGl0b3JXaWR0aCgpLCAyLAotCQkJCQlleHBhbmRMYWJlbCk7Ci0JCQljdHJsX2V4cGFuZGVkLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCX0KLQotCQlpZiAoZGVzY0V4cGFuZEZsYWcpIHsKLQkJCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJZm9ybVNlY3Rpb24uc2V0Q2xpZW50KHNlY3Rpb25Db21wb3NpdGUpOwotCQkJZW5hYmxlU2VjdGlvbnModHJ1ZSk7Ci0JCQlJTWV0aG9kUmljaFRleHQgcmljaFRleHQgPSBnZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woKTsKLQkJCXJpY2hUZXh0LnNldFRleHQoY3RybF9leHBhbmRlZC5nZXRUZXh0KCkpOwotCQkJZm9yIChJdGVyYXRvciBpID0gcmljaFRleHQuZ2V0TGlzdGVuZXJzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoUmljaFRleHRMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJY3RybF9leHBhbmRlZC5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSwgbGlzdGVuZXIKLQkJCQkJCS5nZXRMaXN0ZW5lcigpKTsKLQkJCX0KLQkJCWlmIChjdHJsX2V4cGFuZGVkLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCQkJLnNhdmVNb2RpZmllZFJpY2hUZXh0KGN0cmxfZXhwYW5kZWQpOwotCQkJfQotCQkJZWRpdG9yLnNldEZvY3VzKCk7Ci0JCX0gZWxzZSB7Ci0JCQlzZWN0aW9uQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWZvcm1TZWN0aW9uLnNldENsaWVudChleHBhbmRlZENvbXBvc2l0ZSk7Ci0JCQllbmFibGVTZWN0aW9ucyhmYWxzZSk7Ci0JCQlleHBhbmRMYWJlbC5zZXRUZXh0KChTdHJpbmcpICgoSW1hZ2VIeXBlcmxpbmspIGUuZ2V0U291cmNlKCkpCi0JCQkJCS5nZXREYXRhKCJUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0ID0gKElNZXRob2RSaWNoVGV4dCkgZS5nZXRIcmVmKCk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEluaXRpYWxUZXh0KHJpY2hUZXh0LmdldFRleHQoKSk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KHJpY2hUZXh0LmdldE1vZGFsT2JqZWN0KCkpOwotCQkJY3RybF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdEZlYXR1cmUocmljaFRleHQKLQkJCQkJLmdldE1vZGFsT2JqZWN0RmVhdHVyZSgpKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0RmluZFJlcGxhY2VBY3Rpb24ocmljaFRleHQuZ2V0RmluZFJlcGxhY2VBY3Rpb24oKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByaWNoVGV4dC5nZXRMaXN0ZW5lcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmljaFRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IChSaWNoVGV4dExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQljdHJsX2V4cGFuZGVkLmFkZExpc3RlbmVyKGxpc3RlbmVyLmdldEV2ZW50VHlwZSgpLCBsaXN0ZW5lcgotCQkJCQkJLmdldExpc3RlbmVyKCkpOwotCQkJfQotCQkJYm9vbGVhbiBlZGl0YWJsZSA9ICFUbmdVdGlsLmlzTG9ja2VkKHByb2Nlc3MpOwotCQkJY3RybF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQlpZiAoZWRpdGFibGUpIHsKLQkJCQljdHJsX2V4cGFuZGVkLnNldEZvY3VzKCk7Ci0JCQl9Ci0JCQlzZXRBY3RpdmVSaWNoVGV4dENvbnRyb2wocmljaFRleHQpOwotCQl9Ci0JCWZvcm0uZ2V0Qm9keSgpLmxheW91dCh0cnVlLCB0cnVlKTsKLQkJZGVzY0V4cGFuZEZsYWcgPSAhZGVzY0V4cGFuZEZsYWc7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgZGVmYXVsdCBjb25maWd1cmF0aW9uIGlzIHN1cGVyc2V0IG9mIHNlbGVjdGVkCi0JICogY29uZmlndXJhdGlvbiBvciBub3QKLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGVja1ZhbGlkaXR5Rm9yU3VwZXJTZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29uZmlnLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJLy8gZ2V0IGRlZmF1bHQgcGx1Z2lucyBhbmQgcGFja2FnZXMKLQkJTGlzdCBkZWZhdWx0UGx1Z2lucyA9IGRlZmF1bHRDb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0JCUxpc3QgZGVmYXVsdFBhY2thZ2VzID0gZGVmYXVsdENvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0KLQkJLy8gZ2V0IGNvbmZpdWdyYXRpb24gcGx1Z2lucyBhbmQgcGFjYWtnZXMKLQkJTGlzdCBwYWNrYWdlcyA9IGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCUxpc3QgcGx1Z2lucyA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJYm9vbGVhbiBwbHVnaW5Db250YWlucyA9IGZhbHNlOwotCQlib29sZWFuIHBhY2thZ2VDb250YWlucyA9IGZhbHNlOwotCQlpZiAoKHBsdWdpbnMgIT0gbnVsbCkgKSB7Ci0JCQlwbHVnaW5Db250YWlucyA9IGRlZmF1bHRQbHVnaW5zLmNvbnRhaW5zQWxsKHBsdWdpbnMpOwotCQl9Ci0JCWlmICgocGFja2FnZXMgIT0gbnVsbCkgKSB7Ci0JCQlwYWNrYWdlQ29udGFpbnMgPSBkZWZhdWx0UGFja2FnZXMuY29udGFpbnNBbGwocGFja2FnZXMpOwotCQl9Ci0KLQkJcmV0dXJuIChwbHVnaW5Db250YWlucykgJiYgKHBhY2thZ2VDb250YWlucyk7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFjdGl2ZSByaWNoIHRleHQgY29udHJvbAotCSAqIAotCSAqIEBwYXJhbSBjdHJsCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEFjdGl2ZVJpY2hUZXh0Q29udHJvbChJTWV0aG9kUmljaFRleHQgY3RybCkgewotCQlhY3RpdmVDb250cm9sID0gY3RybDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgQWN0aXZlIFJpY2ggdGV4dCBjb250cm9sCi0JICogCi0JICogQHJldHVybgotCSAqIAkJUmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBnZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woKSB7Ci0JCXJldHVybiBhY3RpdmVDb250cm9sOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVNlY3Rpb25zKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldFZpc2libGUoZW5hYmxlKTsKLQkJaWYgKGVuYWJsZSkgewotCQkJZ2VuZXJhbFNlY3Rpb24uc2V0RXhwYW5kZWQoZ2VuZXJhbFNlY3Rpb25FeHBhbmRGbGFnKTsKLQkJfSBlbHNlIHsKLQkJCWdlbmVyYWxTZWN0aW9uRXhwYW5kRmxhZyA9IGdlbmVyYWxTZWN0aW9uLmlzRXhwYW5kZWQoKTsKLQkJCWdlbmVyYWxTZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCX0KLQotCQlkZXRhaWxTZWN0aW9uLnNldFZpc2libGUoZW5hYmxlKTsKLQkJaWYgKGVuYWJsZSkgewotCQkJZGV0YWlsU2VjdGlvbi5zZXRFeHBhbmRlZChkZXRhaWxTZWN0aW9uRXhwYW5kRmxhZyk7Ci0JCX0gZWxzZSB7Ci0JCQlkZXRhaWxTZWN0aW9uRXhwYW5kRmxhZyA9IGRldGFpbFNlY3Rpb24uaXNFeHBhbmRlZCgpOwotCQkJZGV0YWlsU2VjdGlvbi5zZXRFeHBhbmRlZChlbmFibGUpOwotCQl9Ci0JCWNvbmZpZ1NlY3Rpb24uc2V0VmlzaWJsZShlbmFibGUpOwotCQlpZiAoZW5hYmxlKSB7Ci0JCQljb25maWdTZWN0aW9uLnNldEV4cGFuZGVkKGNvbmZpZ1NlY3Rpb25FeHBhbmRGbGFnKTsKLQkJfSBlbHNlIHsKLQkJCWNvbmZpZ1NlY3Rpb25FeHBhbmRGbGFnID0gY29uZmlnU2VjdGlvbi5pc0V4cGFuZGVkKCk7Ci0JCQljb25maWdTZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgbmFtZSBmb3IgdGhlIGZvcm0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JtVGV4dCgpIHsKLQotCQlmb3JtLnNldFRleHQoTGlicmFyeVVJVGV4dC5nZXRVSVRleHQocHJvY2VzcykKLQkJCQkrICI6ICIgKyBtZXRob2RFbGVtZW50LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoIGZvcm0gbmFtZQotCSAqIEBwYXJhbSBuZXdOYW1lCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaEVsZW1lbnROYW1lKGZpbmFsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmIChuZXdOYW1lICE9IG51bGwpIHsKLQkJCWlmICgoY3RybF9uYW1lICE9IG51bGwpICYmICEoY3RybF9uYW1lLmlzRGlzcG9zZWQoKSkpIHsKLQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQljdHJsX25hbWUucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobmFtZU1vZGlmeUxpc3RlbmVyKTsKLQkJCQkJCWN0cmxfbmFtZS5zZXRUZXh0KG5ld05hbWUpOwotCQkJCQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5hbWVNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCQlzZXRGb3JtVGV4dCgpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX07Ci0JCQkJaWYgKGN0cmxfbmFtZS5nZXREaXNwbGF5KCkuZ2V0VGhyZWFkKCkgPT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSkgewotCQkJCQlydW5uYWJsZS5ydW4oKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX25hbWUuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKHJ1bm5hYmxlKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJvY2Vzc0Zvcm1QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NGb3JtUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWFkNWIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJvY2Vzc0Zvcm1QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgUHJvY2VzcyBmb3JtIHBhZ2VzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRm9ybVBhZ2UgZXh0ZW5kcyBCYXNlRm9ybVBhZ2UgewotCi0JcHJvdGVjdGVkIFByb2Nlc3MgcHJvY2VzczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGVkaXRvcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBmb3JtIGVkaXRvci4KLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIFRoZSB1bmlxdWUgSUQgZm9yIHRoZSBmb3JtIHBhZ2UuCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBmb3JtIHBhZ2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NGb3JtUGFnZShGb3JtRWRpdG9yIGVkaXRvciwgU3RyaW5nIGlkLCBTdHJpbmcgdGl0bGUpIHsKLQkJc3VwZXIoZWRpdG9yLCBpZCwgdGl0bGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5CYXNlRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCi0JCS8vIEdldCB0aGUgUHJvY2VzcyBvYmplY3QgZnJvbSB0aGUgZWRpdG9yIGlucHV0LgotCQlNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgbWV0aG9kRWxlbWVudElucHV0ID0gKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0KLQkJT2JqZWN0IG9iaiA9IG1ldGhvZEVsZW1lbnRJbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlwcm9jZXNzID0gKChQcm9jZXNzQ29tcG9uZW50KSBvYmopLmdldFByb2Nlc3MoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzRm9ybVV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJvY2Vzc0Zvcm1VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMGQxYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzRm9ybVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29sdW1uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3IgdGhlIFByb2Nlc3MgZWRpdG9yIGZvcm0gcGFnZXMuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRm9ybVV0aWwgewotCi0JLyoqCi0JICogQ29udmVydHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGludG8gY29sdW1uIGRlc2NyaXB0b3JzIGxpc3QKLQkgKiBAcGFyYW0gc3RyCi0JICogQHJldHVybgotCSAqIAkJTGlzdCBvZiBjb2x1bW4gZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVMaXN0IHRvQ29sdW1uRGVzY3JpcHRvckxpc3QoU3RyaW5nIHN0cikgewotCQlFTGlzdCBjb2x1bW5EZXNjcmlwdG9ycyA9IG5ldyBCYXNpY0VMaXN0KCk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0ciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5zLm5leHRUb2tlbigpOwotCQkJT2JqZWN0IGNvbHVtbkRlc2NyaXB0b3IgPSBQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwCi0JCQkJCS5nZXQodG9rZW4pOwotCQkJaWYgKGNvbHVtbkRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCWNvbHVtbkRlc2NyaXB0b3JzLmFkZChjb2x1bW5EZXNjcmlwdG9yKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29sdW1uRGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGludG8gY29sdW1uIGRlc2NyaXB0b3JzIGFycmF5IGxpc3QKLQkgKiBAcGFyYW0gc3RyCi0JICogQHJldHVybgotCSAqIAkJQXJyYXkgaXN0IG9mIGNvbHVtbiBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sdW1uRGVzY3JpcHRvcltdIHRvQ29sdW1uRGVzY3JpcHRvcnMoU3RyaW5nIHN0cikgewotCQlMaXN0IGxpc3QgPSB0b0NvbHVtbkRlc2NyaXB0b3JMaXN0KHN0cik7Ci0JCUNvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5zID0gbmV3IENvbHVtbkRlc2NyaXB0b3JbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkoY29sdW1ucyk7Ci0JCXJldHVybiBjb2x1bW5zOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlQ2F0ZWdvcmllc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZUNhdGVnb3JpZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MDU3MDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlQ2F0ZWdvcmllc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBDYXRlZ29yaWVzIHBhZ2UgaW4gdGhlIFJvbGUgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZUNhdGVnb3JpZXNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInJvbGVDYXRlZ29yaWVzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUm9sZSByb2xlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZUNhdGVnb3JpZXNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuQ0FURUdPUklFU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXJvbGUgPSAoUm9sZSkgY29udGVudEVsZW1lbnQ7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQkJc2V0QWxsb3dDaGFuZ2UyKHRydWUpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRDYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMShmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldFJvbGVTZXRzKChSb2xlKSBvYmplY3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJUm9sZVNldCByb2xlU2V0ID0gKFJvbGVTZXQpIGl0Lm5leHQoKTsKLQkJCQkvLyBUT0RPOiBUZXN0IG9uLXRoZS1mbHkgY3JlYXRpb24gb2YgY2F0ZWdvcnkgY29udHJpYnV0b3IKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvUm9sZVNldChnZXRBY3Rpb25NYW5hZ2VyKCksCi0JCQkJCQlyb2xlU2V0LCByb2xlLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJUm9sZVNldCByb2xlU2V0ID0gKFJvbGVTZXQpIGl0Lm5leHQoKTsKLQkJCQkvLyBUT0RPOiBUZXN0IG9uLXRoZS1mbHkgY3JlYXRpb24gb2YgY2F0ZWdvcnkgY29udHJpYnV0b3IKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUZyb21Sb2xlU2V0KAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCByb2xlU2V0LCByb2xlLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZDIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcygoUm9sZSkgb2JqZWN0KQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwyKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlDdXN0b21DYXRlZ29yeSBjdXN0b21DYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9DdXN0b21DYXRlZ29yeSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgY3VzdG9tQ2F0ZWdvcnksIHJvbGUsIHVzZWRDYXRlZ29yaWVzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlDdXN0b21DYXRlZ29yeSBjdXN0b21DYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbUN1c3RvbUNhdGVnb3J5KAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBjdXN0b21DYXRlZ29yeSwgcm9sZSwgdXNlZENhdGVnb3JpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiByb2xlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcyKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgUm9sZVNldCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyMigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyMigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDdXN0b21DYXRlZ29yeUZpbHRlcigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uU3RyaW5nKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZUNhdGVnb3JpZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZURlc2NyaXB0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YjM1MGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlRGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNvbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBSb2xlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0aW9uUGFnZSBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJyb2xlRGVzY3JpcHRpb25QYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfUk9MRSA9IEF1dGhvcmluZ1VJVGV4dC5CQVNFX0VMRU1FTlRfVEVYVDsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfc2tpbGxzOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9hc3NpZ247Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX3N5bm9ueW1zOwotCi0JcHJpdmF0ZSBSb2xlIHJvbGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRpb25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlyb2xlID0gKFJvbGUpIGNvbnRlbnRFbGVtZW50OwotCQlub3RhdGlvblNlY3Rpb25PbiA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdG9yQ29udGVudCh0b29sa2l0KTsKLQkJbGFiZWxfYmFzZS5zZXRUZXh0KEJBU0VfUk9MRSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgU3RhZmZpbmcgc2VjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVOb3RhdGlvblNlY3Rpb25Db250ZW50KCkgewotCQlzdXBlci5jcmVhdGVOb3RhdGlvblNlY3Rpb25Db250ZW50KCk7Ci0JCW5vdGF0aW9uU2VjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5TVEFGRklOR19TRUNUSU9OX05BTUUpOwotCQlub3RhdGlvblNlY3Rpb24uc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlUZXh0LlNUQUZGSU5HX1NFQ1RJT05fREVTQyk7Ci0JCWN0cmxfc2tpbGxzID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJbm90YXRpb25Db21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5TS0lMTFNfVEVYVCwgNDAsIDQwMCwKLQkJCQlOT1RBVElPTl9TRUNUSU9OX0lEKTsKLQkJY3RybF9hc3NpZ24gPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQlub3RhdGlvbkNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkFTU0lHTk1FTlRfQVBQUk9BQ0hFU19URVhULAotCQkJCTQwLCA0MDAsIE5PVEFUSU9OX1NFQ1RJT05fSUQpOwotCQljdHJsX3N5bm9ueW1zID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJbm90YXRpb25Db21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5TWU5PTllNU19URVhULCA0MCwgNDAwLAotCQkJCU5PVEFUSU9OX1NFQ1RJT05fSUQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQotCQlmaW5hbCBNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQotCQlpZiAobm90YXRpb25TZWN0aW9uT24pIHsKLQkJCWN0cmxfc2tpbGxzLnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCWN0cmxfc2tpbGxzLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpKTsKLQkJCWN0cmxfc2tpbGxzLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQljdHJsX3NraWxscy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQk6IGN0cmxfc2tpbGxzOwotCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbikgcm9sZQotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0U2tpbGxzKCk7Ci0JCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpLAotCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQljdHJsX2Fzc2lnbi5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQljdHJsX2Fzc2lnbi5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpKTsKLQkJCWN0cmxfYXNzaWduLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQljdHJsX2Fzc2lnbi5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQk6IGN0cmxfYXNzaWduOwotCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbikgcm9sZQotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKTsKLQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRSb2xlRGVzY3JpcHRpb25fQXNzaWdubWVudEFwcHJvYWNoZXMoKSwKLQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJY3RybF9zeW5vbnltcy5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQljdHJsX3N5bm9ueW1zLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCkpOwotCQkJY3RybF9zeW5vbnltcy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJY3RybF9zeW5vbnltcy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQk6IGN0cmxfc3lub255bXM7Ci0JCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uKSByb2xlCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRTeW5vbnltcygpOwotCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdGlvbl9TeW5vbnltcygpLAotCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjcmVmcmVzaChib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goYm9vbGVhbiBlZGl0YWJsZSkgewotCQlzdXBlci5yZWZyZXNoKGVkaXRhYmxlKTsKLQkJCi0JCWlmIChub3RhdGlvblNlY3Rpb25PbikgewotCQkJY3RybF9za2lsbHMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJY3RybF9hc3NpZ24uc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJY3RybF9zeW5vbnltcy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkRGF0YSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERhdGEoKSB7Ci0JCXN1cGVyLmxvYWREYXRhKCk7Ci0KLQkJaWYgKG5vdGF0aW9uU2VjdGlvbk9uKSB7Ci0JCQlTdHJpbmcgc2tpbGxzID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbikgcm9sZS5nZXRQcmVzZW50YXRpb24oKSkKLQkJCQkJLmdldFNraWxscygpOwotCQkJU3RyaW5nIGFzc2lnbiA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24pIHJvbGUuZ2V0UHJlc2VudGF0aW9uKCkpCi0JCQkJCS5nZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpOwotCQkJU3RyaW5nIHN5bm9ueW1zID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbikgcm9sZS5nZXRQcmVzZW50YXRpb24oKSkKLQkJCQkJLmdldFN5bm9ueW1zKCk7Ci0JCi0JCQljdHJsX3NraWxscy5zZXRUZXh0KHNraWxscyA9PSBudWxsID8gIiIgOiBza2lsbHMpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX2Fzc2lnbi5zZXRUZXh0KGFzc2lnbiA9PSBudWxsID8gIiIgOiBhc3NpZ24pOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX3N5bm9ueW1zLnNldFRleHQoc3lub255bXMgPT0gbnVsbCA/ICIiIDogc3lub255bXMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHJvbGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ST0xFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IENvbnRlbnRGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBSb2xlKTsKLQkJCX0KLQkJfTsKLQotCQkvLyBTZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZy4KLQkJKChDb250ZW50RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLnNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcigKLQkJCQkJCXJvbGUpIH0pOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQkKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVHdWlkYW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZUd1aWRhbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjE3NDRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZUd1aWRhbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkd1aWRhbmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIEd1aWRhbmNlIHBhZ2UgaW4gdGhlIFJvbGUgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlR3VpZGFuY2VQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInJvbGVHdWlkYW5jZVBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFJvbGUgcm9sZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJvbGVHdWlkYW5jZVBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5HVUlEQU5DRV9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXJvbGUgPSAoUm9sZSkgY29udGVudEVsZW1lbnQ7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQkJc2V0QWxsb3dDaGFuZ2UyKHRydWUpOwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBVSUhlbHBlci5nZXRTZWxlY3RlZEd1aWRhbmNlcyhyb2xlKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gR3VpZGFuY2UgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQuCi0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCXJvbGUsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLAotCQkJCQkJCQkJKENoZWNrbGlzdCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJcm9sZSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksCi0JCQkJCQkJKENvbmNlcHQpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCXJvbGUsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwKLQkJCQkJCQkoRXhhbXBsZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCShQcmFjdGljZSkgaXRlbSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCksIHJvbGUsIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJcm9sZSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwKLQkJCQkJCQkoU3VwcG9ydGluZ01hdGVyaWFsKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQlyb2xlLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCQkJCQkJCShHdWlkZWxpbmUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCXJvbGUsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksCi0JCQkJCQkJKFJldXNhYmxlQXNzZXQpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkiVW5hYmxlIHRvIGFkZCBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJInRvICIgKyByb2xlLmdldFR5cGUoKS5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkrICI6IiArIHJvbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBHdWlkYW5jZSBmb3IgdGhlIG1ldGhvZCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQlyb2xlLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCShDaGVja2xpc3QpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCXJvbGUsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJCQkJCShDb25jZXB0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQlyb2xlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksCi0JCQkJCQkJKEV4YW1wbGUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQcmFjdGljZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkoUHJhY3RpY2UpIGl0ZW0sCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpLCByb2xlLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCXJvbGUsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJcm9sZSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJCQkoR3VpZGVsaW5lKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQlyb2xlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCQkJCShSZXVzYWJsZUFzc2V0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJIlVuYWJsZSB0byByZW1vdmUgZ3VpZGFuY2UgIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSJmcm9tICIgKyByb2xlLmdldFR5cGUoKS5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkrICI6IiArIHJvbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gcm9sZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IEd1aWRhbmNlRmlsdGVyKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlU2V0RGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXREZXNjcmlwdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIyNTVlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXREZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBmb3IgdGhlIERvbWFpbiBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXREZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicm9sZVNldERlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUm9sZVNldCByb2xlU2V0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVNldERlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJcm9sZVNldCA9IChSb2xlU2V0KSBjb250ZW50RWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHJvbGVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpOwotCQkJfQotCQl9OwotCi0JCS8vIHNldCBhZGRpdGlvbmFsIGZpbHRlciBmb3IgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IGNoZWNraW5nCi0JCSgoQ2F0ZWdvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJcm9sZVNldCkgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFM7Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZXNldF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlU2V0R3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVNldEdyb3VwaW5nRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OWRkN2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlU2V0R3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgRG9tYWluIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEdyb3VwaW5nRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInJvbGVTZXRHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUm9sZVNldEdyb3VwaW5nIHJvbGVTZXRHcm91cGluZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJvbGVTZXRHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJcm9sZVNldEdyb3VwaW5nID0gKFJvbGVTZXRHcm91cGluZykgY29udGVudEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiByb2xlU2V0R3JvdXBpbmc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ST0xFU0VUUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKTsKLQkJCX0KLQkJfTsKLQotCQkvLyBzZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZwotCQkoKENhdGVnb3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLnNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcigKLQkJCQkJCXJvbGVTZXRHcm91cGluZykgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVzZXRncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlc2V0Z3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZXNldGdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlc2V0Z3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXRHcm91cGluZ1JvbGVTZXRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXRHcm91cGluZ1JvbGVTZXRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMmYyODQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlU2V0R3JvdXBpbmdSb2xlU2V0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFJvbGUgU2V0cyBwYWdlIGluIHRoZSBSb2xlIFNldCBHcm91cGluZyBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqIFRPRE86IFJlbmFtZSB0aGlzIGNsYXNzIHRvIFJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZSBhbmQgbW92ZSBpdCB0byB0aGUKLSAqIG9tLmlibS5ybWMuYXV0aG9yaW5nLnVpLnV0aWwuZm9ybXMgcGFja2FnZQotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEdyb3VwaW5nUm9sZVNldHMgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBSb2xlU2V0R3JvdXBpbmcgcm9sZVNldEdyb3VwaW5nOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVNldEdyb3VwaW5nUm9sZVNldHMoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ST0xFX1NFVFNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlyb2xlU2V0R3JvdXBpbmcgPSAoUm9sZVNldEdyb3VwaW5nKSBjb250ZW50RWxlbWVudDsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKFJvbGVTZXRHcm91cGluZykgb2JqZWN0KS5nZXRSb2xlU2V0cygpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksCi0JCQkJCXJvbGVTZXRHcm91cGluZywKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCksCi0JCQkJCWFkZEl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLAotCQkJCQlyb2xlU2V0R3JvdXBpbmcsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0cygpLAotCQkJCQlybUl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHJvbGVTZXRHcm91cGluZzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlJPTEVTRVRTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgUm9sZVNldCk7Ci0JCQl9Ci0JCX07Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlU2V0Um9sZXNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXRSb2xlc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJkOWU0Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXRSb2xlc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ29udGVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1vdmVJbkNhdGVnb3J5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ2F0ZWdvcnlTb3J0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db250ZW50RWxlbWVudE9yZGVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgUm9sZXMgcGFnZSBpbiB0aGUgUm9sZSBTZXQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIExva2FuYXRoIEphZ2dhCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldFJvbGVzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJyb2xlU2V0Um9sZXNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBSb2xlU2V0IHJvbGVTZXQ7Ci0JCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBhbGxTdGVwczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJvbGVTZXRSb2xlc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ST0xFU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXJvbGVTZXQgPSAoUm9sZVNldCkgY29udGVudEVsZW1lbnQ7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldElzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQkvL3JldHVybiAoKFJvbGVTZXQpIG9iamVjdCkuZ2V0Um9sZXMoKS50b0FycmF5KCk7Ci0JCQkJaWYgKGFsbFN0ZXBzID09IG51bGwpIHsKLQkJCQkJYWxsU3RlcHMgPSBuZXcgQ29udGVudEVsZW1lbnRPcmRlckxpc3QoCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJQ29udGVudEVsZW1lbnRPcmRlckxpc3QuQ09OVEVOVF9FTEVNRU5UU19fRk9SX0VMRU1FTlRfT05MWSwKLQkJCQkJCQlnZXRDb250ZW50Q2F0ZWdvcnlPcmRlckZlYXR1cmUoKSk7Ci0JCQkJfQotCQkJCUxpc3QgcmV0dXJuTGlzdCA9IENhdGVnb3J5U29ydEhlbHBlci5zb3J0Q2F0ZWdvcnlFbGVtZW50cyhjb250ZW50RWxlbWVudCwgCi0JCQkJCQlhbGxTdGVwcy50b0FycmF5KCkpOwotCQkJCXJldHVybiByZXR1cm5MaXN0LnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksCi0JCQkJCXJvbGVTZXQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZXMoKSwgYWRkSXRlbXMsCi0JCQkJCS0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksCi0JCQkJCXJvbGVTZXQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZXMoKSwgcm1JdGVtcywKLQkJCQkJLTEpOwotCQl9Ci0JfQotCQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHJvbGVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ST0xFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDb250ZW50RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQlpZiAoZ2V0SGVscGVyKCkuaXNDb250cmlidXRvcigoQ29udGVudEVsZW1lbnQpIG9iaikpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgUm9sZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVTZXRSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlU2V0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVTZXRSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDb250ZW50Q2F0ZWdvcnlPcmRlckZlYXR1cmUoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGVzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldE1vZGVsU3RydWN0dXJlUGF0aCgpIHsKLQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGg7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBnZXRDb250ZW50RWxlbWVudE9yZGVyTGlzdCgpIHsKLQkJcmV0dXJuIGFsbFN0ZXBzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlVGFza3NQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVUYXNrc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUxZjMzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVUYXNrc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNvbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgVGFza3MgcGFnZSBpbiB0aGUgUm9sZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrc1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicm9sZVRhc2tzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUm9sZSByb2xlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVRhc2tzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LlRBU0tTX1BBR0VfVElUTEUpOyAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXJvbGUgPSAoUm9sZSkgY29udGVudEVsZW1lbnQ7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldEFsbG93Q2hhbmdlMShmYWxzZSk7Ci0JCXNldEFsbG93Q2hhbmdlMihmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrcygoUm9sZSkgb2JqZWN0KQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSByZXRyaWV2ZVRhYmxlVmlld2VyQ29udGVudHModmlld2VyX3NlbGVjdGVkMik7Ci0JCQlmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnModGFzaykpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJdGFzaywgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpLAotCQkJCQkJCXJvbGUsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLS8vCQkJZm9yIChqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLS8vCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0vLwkJCQl0YXNrLnNldFBlcmZvcm1lZEJ5KG51bGwpOwotLy8JCQl9Ci0JCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIHJvbGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSwgcm1JdGVtcywgLTEpOwotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZDIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0U2Vjb25kYXJ5VGFza3MoKFJvbGUpIG9iamVjdCkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSByZXRyaWV2ZVRhYmxlVmlld2VyQ29udGVudHModmlld2VyX3NlbGVjdGVkKTsKLQkJCWZvciAoamF2YS51dGlsLkl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucyh0YXNrKSkgewotCQkJCQl0YXNrLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuYWRkKHJvbGUpOwotCQkJCX0KLQkJCX0KLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCXRhc2suZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5yZW1vdmUocm9sZSk7Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gcm9sZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlRBU0tTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IENvbnRlbnRGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBUYXNrKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVRhc2tzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlVGFza3NQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlVGFza3NQYWdlX3NlbGVjdGVkTGFiZWwyOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVdvcmtQcm9kdWN0c1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVdvcmtQcm9kdWN0c1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEyMTBiYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVXb3JrUHJvZHVjdHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Xb3JrUHJvZHVjdEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBXb3JrIFByb2R1Y3RzIHBhZ2UgaW4gdGhlIFJvbGUgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlV29ya1Byb2R1Y3RzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJyb2xlV29ya1Byb2R1Y3RzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUm9sZSByb2xlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVdvcmtQcm9kdWN0c1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5XT1JLX1BST0RVQ1RTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJcm9sZSA9IChSb2xlKSBjb250ZW50RWxlbWVudDsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTIodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQlzdXBlci5jcmVhdGVGb3JtQ29udGVudChtYW5hZ2VkRm9ybSk7Ci0JCWN0cmxfYWRkMi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJY3RybF9yZW1vdmUyLnNldFZpc2libGUoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKFJvbGUpIG9iamVjdCkuZ2V0UmVzcG9uc2libGVGb3IoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgcm9sZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLCBhZGRJdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IHJtSXRlbXMuc2l6ZSgpOyBpKyspIHsKLS8vCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuc2V0UmVzcG9uc2libGVSb2xlKAotLy8JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIChXb3JrUHJvZHVjdCkgcm1JdGVtcy5nZXQoaSksIG51bGwpOwotLy8JCQl9Ci0JCQkKLQkJCWdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgcm9sZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLCBybUl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZDIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0TW9kaWZpZWRXb3JrUHJvZHVjdHMoKFJvbGUpIG9iamVjdCkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiByb2xlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IFdvcmtQcm9kdWN0RmlsdGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrQ2F0ZWdvcmllc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza0NhdGVnb3JpZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNGE0YmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrQ2F0ZWdvcmllc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgQ2F0ZWdvcmllcyBwYWdlIGluIHRoZSBUYXNrIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tDYXRlZ29yaWVzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ0YXNrQ2F0ZWdvcmllc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFRhc2sgdGFzazsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRhc2tDYXRlZ29yaWVzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkNBVEVHT1JJRVNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl0YXNrID0gKFRhc2spIGNvbnRlbnRFbGVtZW50OwotLy8JCXNldENhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMih0cnVlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZXMoKFRhc2spIG9iamVjdCkudG9BcnJheSgpOwkJCQkKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkJCU9iamVjdCBkaXNjaXBsaW5lID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmKGRpc2NpcGxpbmUgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKXsKLS8vCQkJCQlMaXN0IGRpc2NpcGxpbmVzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZXModGFzayk7Ci0vLwkJCQkJaWYgKGRpc2NpcGxpbmVzICE9IG51bGwgJiYgZGlzY2lwbGluZXMuc2l6ZSgpID4gMCkJewotLy8JCQkJCQlPYmplY3QgYXNzb2NpYXRlZERpc2NpcGxpbmUgPSBkaXNjaXBsaW5lcy5nZXQoMCk7Ci0vLwkJCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0Ci0vLwkJCQkJCS5mb3JtYXQoCi0vLwkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuVXNlckludGVyYWN0aW9uSGVscGVyX2VyclJlbGF0aW9uc2hpcEV4aXN0cywKLS8vCQkJCQkJCQluZXcgT2JqZWN0W10gewotLy8JCQkJCQkJCQkJdGFzay5nZXROYW1lKCksCi0vLwkJCQkJCQkJCQlUbmdVdGlsCi0vLwkJCQkJCQkJCQkJCS5nZXRMYWJlbFdpdGhQYXRoKGFzc29jaWF0ZWREaXNjaXBsaW5lKSwKLS8vCQkJCQkJCQkJCSgoRGlzY2lwbGluZSkgZGlzY2lwbGluZSkuZ2V0TmFtZSgpIH0pOwotLy8JCQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd1dhcm5pbmcoCi0vLwkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsIG1zZyk7Ci0vLwkJCQkJCXJldHVybjsKLS8vCQkJCQl9Ci0KLQkJCQkJCi0JCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9EaXNjaXBsaW5lKGdldEFjdGlvbk1hbmFnZXIoKSwKLQkJCQkJCShEaXNjaXBsaW5lKSBkaXNjaXBsaW5lLCB0YXNrLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCURpc2NpcGxpbmUgZGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKSBpdC5uZXh0KCk7Ci0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVGcm9tRGlzY2lwbGluZSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgZGlzY2lwbGluZSwgdGFzaywgdXNlZENhdGVnb3JpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldEN1c3RvbUNhdGVnb3JpZXMoKFRhc2spIG9iamVjdCkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY3VzdG9tQ2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0Lm5leHQoKTsKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvQ3VzdG9tQ2F0ZWdvcnkoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIGN1c3RvbUNhdGVnb3J5LCB0YXNrLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMihBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY3VzdG9tQ2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0Lm5leHQoKTsKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUZyb21DdXN0b21DYXRlZ29yeSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgY3VzdG9tQ2F0ZWdvcnksIHRhc2ssIHVzZWRDYXRlZ29yaWVzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZzIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nMigpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyMigpIHsKLQkJcmV0dXJuIGZpbHRlcjIgPSBuZXcgQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb25TdHJpbmcoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrQ2F0ZWdvcmllc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza0Rlc2NyaXB0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZjVhNjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrRGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNvbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBUYXNrIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0aW9uUGFnZSBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ0YXNrRGVzY3JpcHRpb25QYWdlIjsgLy8kTk9OLU5MUy0xJAkJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9UQVNLID0gQXV0aG9yaW5nVUlUZXh0LkJBU0VfRUxFTUVOVF9URVhUOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9hbHRlcm5hdGl2ZXM7Ci0KLQlwcml2YXRlIFRhc2sgdGFzazsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRhc2tEZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXRhc2sgPSAoVGFzaykgY29udGVudEVsZW1lbnQ7Ci0JCXB1cnBvc2VPbiA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdG9yQ29udGVudCh0b29sa2l0KTsKLQkJY3RybF9hbHRlcm5hdGl2ZXMgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5BTFRFUk5BVElWRVNfVEVYVCwgNDAsIDQwMCwKLQkJCQlERVRBSUxfU0VDVElPTl9JRCk7Ci0JCWxhYmVsX2Jhc2Uuc2V0VGV4dChCQVNFX1RBU0spOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWREYXRhKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGF0YSgpIHsKLQkJc3VwZXIubG9hZERhdGEoKTsKLQkJU3RyaW5nIHB1cnBvc2UgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uKSB0YXNrLmdldFByZXNlbnRhdGlvbigpKQotCQkJCS5nZXRQdXJwb3NlKCk7Ci0JCVN0cmluZyBhbHRlcm5hdGl2ZXMgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uKSB0YXNrCi0JCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRBbHRlcm5hdGl2ZXMoKTsKLQkJY3RybF9wdXJwb3NlLnNldFRleHQocHVycG9zZSA9PSBudWxsID8gIiIgOiBwdXJwb3NlKTsgLy8kTk9OLU5MUy0xJAkKLQkJY3RybF9hbHRlcm5hdGl2ZXMuc2V0VGV4dChhbHRlcm5hdGl2ZXMgPT0gbnVsbCA/ICIiIDogYWx0ZXJuYXRpdmVzKTsgLy8kTk9OLU5MUy0xJAkKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0JCWZpbmFsIE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCi0JCWN0cmxfcHVycG9zZS5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfcHVycG9zZS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKSk7Ci0JCWN0cmxfcHVycG9zZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3B1cnBvc2UuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX3B1cnBvc2U7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24pIHRhc2sKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0UHVycG9zZSgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYWx0ZXJuYXRpdmVzLnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9hbHRlcm5hdGl2ZXMuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSk7Ci0JCWN0cmxfYWx0ZXJuYXRpdmVzLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfYWx0ZXJuYXRpdmVzLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9hbHRlcm5hdGl2ZXM7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24pIHRhc2sKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI3JlZnJlc2goYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJc3VwZXIucmVmcmVzaChlZGl0YWJsZSk7Ci0JCWN0cmxfYWx0ZXJuYXRpdmVzLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5UQVNLUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IENvbnRlbnRGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBUYXNrKTsKLQkJCX0KLQkJfTsKLQotCQkvLyBTZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZy4KLQkJKChDb250ZW50RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLnNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcigKLQkJCQkJCXRhc2spIH0pOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza0d1aWRhbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrR3VpZGFuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiODQ1NGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrR3VpZGFuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuR3VpZGFuY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIEd1aWRhbmNlIHBhZ2UgaW4gdGhlIFRhc2sgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrR3VpZGFuY2VQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInRhc2tHdWlkYW5jZVBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFRhc2sgdGFzazsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRhc2tHdWlkYW5jZVBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5HVUlEQU5DRV9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXRhc2sgPSAoVGFzaykgY29udGVudEVsZW1lbnQ7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gVUlIZWxwZXIuZ2V0U2VsZWN0ZWRHdWlkYW5jZXModGFzayk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUd1aWRhbmNlIGl0ZW0gPSAoR3VpZGFuY2UpIGl0Lm5leHQoKTsKLQotCQkJCS8vIEd1aWRhbmNlcyBmb3IgY29udGVudCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQl0YXNrLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCShDaGVja2xpc3QpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCXRhc2ssCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJCQkJCShDb25jZXB0KSBpdGVtLCAtMSk7Ci0JCQkJfSAKLQkJCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQl0YXNrLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksCi0JCQkJCQkJKEV4YW1wbGUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQcmFjdGljZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkoUHJhY3RpY2UpIGl0ZW0sCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpLCB0YXNrLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCXRhc2ssCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJdGFzaywKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJCQkoR3VpZGVsaW5lKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQl0YXNrLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1Rvb2xNZW50b3JzKCksCi0JCQkJCQkJKFRvb2xNZW50b3IpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCXRhc2ssCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksCi0JCQkJCQkJKFJldXNhYmxlQXNzZXQpIGl0ZW0sIC0xKTsKLQkJCQl9IAotCQkJCWVsc2UgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkiVW5hYmxlIHRvIGFkZCBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJInRvICIgKyB0YXNrLmdldFR5cGUoKS5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkrICI6IiArIHRhc2suZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBHdWlkYW5jZSBmb3IgdGhlIG1ldGhvZCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQl0YXNrLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCShDaGVja2xpc3QpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCXRhc2ssCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJCQkJCShDb25jZXB0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQl0YXNrLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksCi0JCQkJCQkJKEV4YW1wbGUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQcmFjdGljZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkoUHJhY3RpY2UpIGl0ZW0sCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpLCB0YXNrLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCXRhc2ssCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJdGFzaywKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJCQkoR3VpZGVsaW5lKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQl0YXNrLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1Rvb2xNZW50b3JzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJdGFzaywKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCQkJCQkoUmV1c2FibGVBc3NldCkgaXRlbSwgLTEpOwotCQkJCX0gCi0vLwkJCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXN0aW1hdGUpIHsKLS8vCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLS8vCQkJCQkJCXRhc2ssIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfRXN0aW1hdGUoKSwKLS8vCQkJCQkJCW51bGwsIC0xKTsKLS8vCQkJCX0gCi0JCQkJZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gcmVtb3ZlIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkiZnJvbSAiICsgdGFzay5nZXRUeXBlKCkuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyAiOiIgKyB0YXNrLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJfQotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBHdWlkYW5jZUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tSb2xlc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza1JvbGVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGNiNGVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza1JvbGVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNvbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBSb2xlcyBwYWdlIGluIHRoZSBUYXNrIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFza1JvbGVzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ0YXNrUm9sZXNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUYXNrIHRhc2s7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRhc2tSb2xlc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ST0xFU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXRhc2sgPSAoVGFzaykgY29udGVudEVsZW1lbnQ7Ci0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTIodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuICgoVGFzaykgb2JqZWN0KS5nZXRQZXJmb3JtZWRCeSgpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsJCQotCQkJTGlzdCBlbGVtZW50TGlzdCA9IHJldHJpZXZlVGFibGVWaWV3ZXJDb250ZW50cyh2aWV3ZXJfc2VsZWN0ZWQpOwotCQkJTGlzdCBhZGRJdGVtc0ZpbHRlcmVkID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRJdGVtcy5zaXplKCk7IGkrKykgewotCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnMoKChSb2xlKSBhZGRJdGVtcy5nZXQoaSkpKSkgewotCQkJCQlhZGRJdGVtc0ZpbHRlcmVkLmFkZChhZGRJdGVtcy5nZXQoaSkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChhZGRJdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCB0YXNrLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpLAotCQkJCQkJYWRkSXRlbXNGaWx0ZXJlZCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgdGFzaywgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFRhc2tfUGVyZm9ybWVkQnkoKSwgbnVsbCwgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuICgoVGFzaykgb2JqZWN0KS5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwyKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwyKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJTGlzdCBlbGVtZW50TGlzdCA9IHJldHJpZXZlVGFibGVWaWV3ZXJDb250ZW50cyh2aWV3ZXJfc2VsZWN0ZWQpOwotCQkJTGlzdCBhZGRJdGVtc0ZpbHRlcmVkID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRJdGVtcy5zaXplKCk7IGkrKykgewotCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnMoKChSb2xlKSBhZGRJdGVtcy5nZXQoaSkpKSkgewotCQkJCQlhZGRJdGVtc0ZpbHRlcmVkLmFkZChhZGRJdGVtcy5nZXQoaSkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChhZGRJdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCB0YXNrLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAotCQkJCQkJYWRkSXRlbXNGaWx0ZXJlZCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCB0YXNrLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksCi0JCQkJCXJtSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlJPTEVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0JbmV3IENvbnRlbnRGaWx0ZXIgKCl7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYodGFzay5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpICE9IG51bGwpewotCQkJCQlMaXN0IGxpc3QgPSB0YXNrLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0JCQkJCWZvcihJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyl7Ci0JCQkJCQlPYmplY3QgbmV4dCA9IGl0Lm5leHQoKTsKLQkJCQkJCWlmKG5leHQgaW5zdGFuY2VvZiBSb2xlKXsKLQkJCQkJCQlpZihvYmogPT0gbmV4dCkgcmV0dXJuIGZhbHNlOwotCQkJCQkJCWlmKCFjaGVja0NvbnRyaWJ1dGlvbigoVmFyaWFiaWxpdHlFbGVtZW50KW5leHQsIG9iaikpCi0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFJvbGUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcjIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcjIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgQ29udGVudEZpbHRlciAoKXsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZih0YXNrLmdldFBlcmZvcm1lZEJ5KCkgIT0gbnVsbCl7Ci0JCQkJCQotCQkJCQlMaXN0IGxpc3QgPSB0YXNrLmdldFBlcmZvcm1lZEJ5KCk7Ci0JCQkJCWZvcihJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyl7Ci0JCQkJCQlPYmplY3QgbmV4dCA9IGl0Lm5leHQoKTsKLQkJCQkJCWlmKG5leHQgaW5zdGFuY2VvZiBSb2xlKXsKLQkJCQkJCQlpZihvYmogPT0gbmV4dCkgcmV0dXJuIGZhbHNlOwotCQkJCQkJCWlmKCFjaGVja0NvbnRyaWJ1dGlvbigoUm9sZSluZXh0LCBvYmopKQotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBSb2xlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSb2xlIGZpbHRlcgotCSAqCi0JICovCi0JcHVibGljIGNsYXNzIFJvbGVGaWx0ZXIgZXh0ZW5kcyBDb250ZW50RmlsdGVyIHsKLQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJaWYodGFzay5nZXRQZXJmb3JtZWRCeSgpICE9IG51bGwpewotCQkJCUxpc3QgbGlzdCA9IHRhc2suZ2V0UGVyZm9ybWVkQnkoKTsKLQkJCQlmb3IoSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspewotCQkJCQlPYmplY3QgbmV4dCA9IGl0Lm5leHQoKTsKLQkJCQkJaWYobmV4dCBpbnN0YW5jZW9mIFJvbGUpewotCQkJCQkJaWYob2JqID09IG5leHQpIHJldHVybiBmYWxzZTsKLQkJCQkJCWlmKCFjaGVja0NvbnRyaWJ1dGlvbigoUm9sZSluZXh0LCBvYmopKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgUm9sZSk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ2hlY2sgY29udHJpYnV0aW9uCi0JICogQHBhcmFtIGNvbnRyaWJ1dG9yCi0JICogQHBhcmFtIG9iagotCSAqLwotCXB1YmxpYyBib29sZWFuIGNoZWNrQ29udHJpYnV0aW9uKFZhcmlhYmlsaXR5RWxlbWVudCBjb250cmlidXRvciwgT2JqZWN0IG9iail7Ci0JCWlmKFRuZ1V0aWwuaXNDb250cmlidXRvcihjb250cmlidXRvcikgJiYgb2JqIGluc3RhbmNlb2YgUm9sZSl7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgZSA9IGNvbnRyaWJ1dG9yLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmKGUgIT0gbnVsbCl7Ci0JCQkJaWYoZS5lcXVhbHMob2JqKSkgcmV0dXJuIGZhbHNlOwotCQkJCWlmKFRuZ1V0aWwuaXNDb250cmlidXRvcihlKSkKLQkJCQkJcmV0dXJuIGNoZWNrQ29udHJpYnV0aW9uKGUsIG9iaik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrUm9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrU3RlcHNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tTdGVwc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M4ZTRjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tTdGVwc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuU2VjdGlvbnNPcmRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLlZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkVkaXRvcnNDb250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Nb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlJlbW92ZUZyb21TZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU2VjdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5JbWFnZUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0KLS8qKgotICogVGhlIFN0ZXBzIHBhZ2UgaW4gdGhlIFRhc2sgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrU3RlcHNQYWdlIGV4dGVuZHMgQmFzZUZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAidGFza1N0ZXBzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVGV4dCBjdHJsX25hbWU7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZCwgY3RybF9kZWxldGUsIGN0cmxfdXAsIGN0cmxfZG93biwgY3RybF9vcmRlcmluZzsKLQotCXByaXZhdGUgVGFibGUgY3RybF9zdGVwczsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgc3RlcHNUYWJsZVZpZXdlcjsKLQotCXByaXZhdGUgU2VjdGlvbkxpc3QgYWxsU3RlcHM7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGFjdGl2ZUNvbnRyb2w7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZXNjRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dEVkaXRvciBjdHJsX2V4cGFuZGVkOwotCi0JcHJvdGVjdGVkIEltYWdlSHlwZXJsaW5rIGV4cGFuZExpbms7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgZXhwYW5kTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBmb3JtU2VjdGlvbjsKLQotCXByb3RlY3RlZCBTZWN0aW9uIGdlbmVyYWxTZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlOwotCQotCXByb3RlY3RlZCBDb21wb3NpdGUgZ2VuZXJhbENvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgZXhwYW5kZWRDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGN0cmxfbWFpbmRlc2M7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHN0ZXBzVmlld2VyQ29udGVudFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBzdGVwc1ZpZXdlckxhYmVsUHJvdmlkZXI7Ci0KLQlwcml2YXRlIFRhc2sgdGFzazsKLQotCXByaXZhdGUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uIGN1cnJlbnRTdGVwOwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBjb250ZW50TW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRhc2tTdGVwc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5TVEVQU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQmFzZUZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IG1ldGhvZEVsZW1lbnRJbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0OwotCQl0YXNrID0gKFRhc2spIG1ldGhvZEVsZW1lbnRJbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtCi0JICogICAgICBtYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJc3VwZXIuY3JlYXRlRm9ybUNvbnRlbnQobWFuYWdlZEZvcm0pOwotCi0JCWZvcm0uc2V0VGV4dChMaWJyYXJ5VUlUZXh0LmdldFVJVGV4dCh0YXNrKSArICI6ICIgKyB0YXNrLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3JtU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwgU2VjdGlvbi5OT19USVRMRSk7Ci0JCXsKLQkJCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCQlmb3JtU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJCWZvcm1TZWN0aW9uLnNldExheW91dChuZXcgVGFibGVXcmFwTGF5b3V0KCkpOwotCQl9Ci0JCS8vIENyZWF0ZSB0aGUgY29tcG9zaXRlIGZvciB0aGUgc2VjdGlvbnMuCi0JCXNlY3Rpb25Db21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShmb3JtU2VjdGlvbiwgU1dULk5PTkUpOwotCQlzZWN0aW9uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKLQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IFRhYmxlV3JhcExheW91dCgpKTsKLQkJZm9ybVNlY3Rpb24uc2V0Q2xpZW50KHNlY3Rpb25Db21wb3NpdGUpOwotCi0JCS8vIENyZWF0ZSB0aGUgR2VuZXJhbCBJbmZvcm1hdGlvbiBzZWN0aW9uLgotCQlnZW5lcmFsU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihzZWN0aW9uQ29tcG9zaXRlLAotCQkJCVNlY3Rpb24uVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRQotCQkJCQkJfCBTZWN0aW9uLkVYUEFOREVEKTsKLQkJZ2VuZXJhbFNlY3Rpb24KLQkJCQkuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5TVEVQU19TRUNUSU9OX05BTUUpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVRleHQuU1RFUFNfU0VDVElPTl9ERVNDKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWdlbmVyYWxDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShnZW5lcmFsU2VjdGlvbik7Ci0JCWdlbmVyYWxDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWdlbmVyYWxDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDQsIGZhbHNlKSk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldENsaWVudChnZW5lcmFsQ29tcG9zaXRlKTsKLQotCQlFZGl0b3JzQ29udGV4dEhlbHBlci5zZXRIZWxwKGdlbmVyYWxDb21wb3NpdGUuZ2V0UGFyZW50KCksIHRhc2spOwotCi0JCUNvbXBvc2l0ZSBwYW5lMSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxDb21wb3NpdGUpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEudmVydGljYWxTcGFuID0gMTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJCXBhbmUxLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJcGFuZTEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQl9Ci0KLQkJTGFiZWwgbF9uYW1lID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYW5lMSwgQXV0aG9yaW5nVUlUZXh0LlNURVBTX1RFWFQpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJbF9uYW1lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9zdGVwcyA9IHRvb2xraXQuY3JlYXRlVGFibGUocGFuZTEsIFNXVC5NVUxUSSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMTUwOwotCQkJY3RybF9zdGVwcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWluaXRQcm92aWRlcnMoKTsKLQotCQlzdGVwc1RhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfc3RlcHMpOwotCQlzdGVwc1RhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihzdGVwc1ZpZXdlckNvbnRlbnRQcm92aWRlcik7Ci0JCXN0ZXBzVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihzdGVwc1ZpZXdlckxhYmVsUHJvdmlkZXIpOwotCi0JCUNvbXBvc2l0ZSBwYW5lMiA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxDb21wb3NpdGUpOwotCQlwYW5lMi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKSk7Ci0JCXBhbmUyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQljdHJsX2FkZCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhbmUyLCBBdXRob3JpbmdVSVRleHQuQUREX0JVVFRPTl9URVhULAotCQkJCVNXVC5OT05FKTsKLQkJY3RybF9hZGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3RybF9kZWxldGUgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYW5lMiwKLQkJCQlBdXRob3JpbmdVSVRleHQuREVMRVRFX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCWN0cmxfZGVsZXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljdHJsX2RlbGV0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQljdHJsX3VwID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFuZTIsIEF1dGhvcmluZ1VJVGV4dC5VUF9CVVRUT05fVEVYVCwKLQkJCQlTV1QuTk9ORSk7Ci0JCWN0cmxfdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJY3RybF9kb3duID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFuZTIsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRPV05fQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJY3RybF9kb3duLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJY3RybF9vcmRlcmluZyA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhbmUyLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5PUkRFUl9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQljdHJsX29yZGVyaW5nLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCS8vIG5hbWUKLQkJTGFiZWwgbmFtZUxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5TVEVQX05BTUVfVEVYVCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0JCQluYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY3RybF9uYW1lID0gdG9vbGtpdC5jcmVhdGVUZXh0KGdlbmVyYWxDb21wb3NpdGUsICIiLCBTV1QuU0lOR0xFKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQkJY3RybF9uYW1lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3JlYXRlQmxhbmtMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCA0KTsKLQotCQljdHJsX21haW5kZXNjID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmsoCi0JCQkJdG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1RFWFQsCi0JCQkJMjUwLCAzMDAsIDQpOwotCi0JCWNyZWF0ZVJpY2hUZXh0RWRpdG9yU2VjdGlvbigpOwotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTIpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihnZW5lcmFsQ29tcG9zaXRlKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZXhwYW5kZWRDb21wb3NpdGUpOwotCi0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQkJbG9hZERhdGEoKTsKLQkJZW5hYmxlQ29udHJvbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzIHRvIG1vbml0b3IgZm9jdXMgYW5kIG1vZGlmaWNhdGlvbiBjaGFuZ2VzIGluIHRoZSBlZGl0Ci0JICogY29udHJvbHMuCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlmaW5hbCBNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQkJY29udGVudE1vZGlmeUxpc3RlbmVyID0gZWRpdG9yLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKGN1cnJlbnRTdGVwKTsKLQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCS5zZXREaXNhYmxlKHRydWUpOwotCi0JCWZvcm0uYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0vLwkJCQlJU3RhdHVzIHN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KChFT2JqZWN0KSB0YXNrLCBnZXRTaXRlKCkKLS8vCQkJCQkJLmdldFNoZWxsKCkpOwotLy8JCQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLS8vCQkJCQlsb2FkRGF0YSgpOwotLy8JCQkJfQotCQkJCWlmIChmb3JtICE9IG51bGwgJiYgIWZvcm0uaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCVVJSGVscGVyLnNldEZvcm1UZXh0KGZvcm0sIGNvbnRlbnRFbGVtZW50KTsKLQkJCQl9Ci0JCQkJbG9hZERhdGEoKTsKLQkJCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJZW5hYmxlQ29udHJvbHMoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCWNoZWNrU2VsZWN0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmb3JtLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJZGVhY3RpdmF0ZSgpOwotCQkJfQotCQl9KTsKLQotCQlmb3JtLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlpZiAoY3RybF9leHBhbmRlZCAhPSBudWxsKSB7Ci0JCQkJCSgoR3JpZERhdGEpIGN0cmxfZXhwYW5kZWQuZ2V0TGF5b3V0RGF0YSgpKS5oZWlnaHRIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JIZWlnaHQoKTsKLQkJCQkJKChHcmlkRGF0YSkgY3RybF9leHBhbmRlZC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKTsKLQkJCQl9Ci0JCQkJZm9ybVNlY3Rpb24ubGF5b3V0KHRydWUsIHRydWUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjb250cm9sTW92ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfbmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJaWYgKGN1cnJlbnRTdGVwICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjdXJyZW50U3RlcC5nZXROYW1lKCk7Ci0JCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY3RybF9uYW1lLmdldFRleHQoKTsKLQkJCQkJaWYgKGN0cmxfbmFtZS5nZXRUZXh0KCkgPT0gbnVsbAotCQkJCQkJCXx8IGN0cmxfbmFtZS5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVEaWFsb2dfdGl0bGUsIExpYnJhcnlVSVRleHQuVEVYVF9TVEVQKTsgCi0JCQkJCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnLCBTdHJVdGlsLnRvTG93ZXIoTGlicmFyeVVJVGV4dC5URVhUX1NURVApKTsgCi0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnKTsKLQkJCQkJCWN0cmxfbmFtZS5zZXRTZWxlY3Rpb24oMCwgb2xkQ29udGVudC5sZW5ndGgoKSk7Ci0JCQkJCX0gZWxzZSBpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBjdXJyZW50U3RlcCwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX21haW5kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfbWFpbmRlc2MuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlzYXZlTWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJY2hlY2tTZWxlY3Rpb24oKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCWN0cmxfYWRkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiBjaGlsZCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlU2VjdGlvbigpOwotCQkJCVN0cmluZyBuZXdOYW1lID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQlBdXRob3JpbmdVSVRleHQuTkVXX0VMRU1FTlRfVEVYVCwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7IExpYnJhcnlVSVRleHQuVEVYVF9TVEVQIH0pOwotCQkJCWNoaWxkLnNldE5hbWUobmV3TmFtZSk7Ci0JCQkJQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQgY21kID0gbmV3IEFkZFRvU2VjdGlvbkxpc3RDb21tYW5kKHRhc2ssCi0JCQkJCQljaGlsZCwgYWxsU3RlcHMpOwotCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJc3RlcHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJc3RlcHNUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY2hpbGQpKTsKLQkJCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCQljdHJsX25hbWUuc2V0U2VsZWN0aW9uKDAsIG5ld05hbWUubGVuZ3RoKCkpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX2RlbGV0ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24udG9MaXN0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24pIHsKLQkJCQkJCVJlbW92ZUZyb21TZWN0aW9uTGlzdCBjbWQgPSBuZXcgUmVtb3ZlRnJvbVNlY3Rpb25MaXN0KAotCQkJCQkJCQl0YXNrLCAob3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uKSBvLCBhbGxTdGVwcyk7Ci0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXN0ZXBzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCWVkaXRTdGVwKG51bGwpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX3VwLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCi0JCQkJQXJyYXlMaXN0IG1vdmVVcEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vdmVVcEl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCU1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCBjbWQgPSBuZXcgTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kKAotCQkJCQkJdGFzaywgbW92ZVVwSXRlbXMsIGFsbFN0ZXBzLCAxKTsKLQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCi0JCQkJc3RlcHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZCh0YXNrKSkgewotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZCh0YXNrKSkgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2Rvd24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJQXJyYXlMaXN0IG1vdmVEb3duSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbW92ZURvd25JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQlNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQgY21kID0gbmV3IE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCgKLQkJCQkJCXRhc2ssIG1vdmVEb3duSXRlbXMsIGFsbFN0ZXBzLCAwKTsKLQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCi0JCQkJc3RlcHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZCh0YXNrKSkgewotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZCh0YXNrKSkgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX29yZGVyaW5nLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVNlY3Rpb25zT3JkZXJEaWFsb2cgZGxnID0gbmV3IFNlY3Rpb25zT3JkZXJEaWFsb2coCi0JCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJdGFzaywKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlN0ZXBzT3JkZXJEaWFsb2dfdGl0bGUsIAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuU3RlcHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbiwgCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zdGVwc190ZXh0KTsgCi0JCQkJZGxnLm9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlQ29udHJvbHMoYm9vbGVhbiBlZGl0YWJsZSkgewotCQljdHJsX25hbWUuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX21haW5kZXNjLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9hZGQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfZGVsZXRlLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljdHJsX3VwLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljdHJsX2Rvd24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfb3JkZXJpbmcuc2V0RW5hYmxlZCh0cnVlKTsKLQkJaWYgKGN0cmxfZXhwYW5kZWQgIT0gbnVsbCkgewotCQkJY3RybF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWFjdGl2YXRlKCkgewotCQkvLyBTYXZlIHRoZSBzdGVwIG9yZGVyLgotCQlpZiAoYWxsU3RlcHMgIT0gbnVsbCkgewotCQkJYWxsU3RlcHMuYXBwbHkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBjb250cm9scyB3aXRoIGRhdGEgZnJvbSB0aGUgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWREYXRhKCkgewotCQlhbGxTdGVwcyA9IG51bGw7Ci0JCXN0ZXBzVGFibGVWaWV3ZXIuc2V0SW5wdXQodGFzayk7Ci0JCXN0ZXBzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQllZGl0U3RlcChjdXJyZW50U3RlcCk7Ci0JfQotCi0JLyoqCi0JICogRWRpdCBjdXJyZW50IHN0ZXAuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVkaXRTdGVwKG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiBzdGVwKSB7Ci0JCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCS5zZXREaXNhYmxlKHRydWUpOwotCi0JCWlmIChjdHJsX21haW5kZXNjLmdldE1vZGlmaWVkKCkpIHsKLQkJCXNhdmVNYWluRGVzY3JpcHRpb24oKTsKLQkJfQotCi0JCWN1cnJlbnRTdGVwID0gc3RlcDsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChjdXJyZW50U3RlcCAhPSBudWxsKSB7Ci0JCQluYW1lID0gY3VycmVudFN0ZXAuZ2V0TmFtZSgpOwotCQkJZGVzYyA9IGN1cnJlbnRTdGVwLmdldFNlY3Rpb25EZXNjcmlwdGlvbigpOwotCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCX0KLQkJY3RybF9uYW1lLnNldFRleHQobmFtZSA9PSBudWxsID8gIiIgOiBuYW1lKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX21haW5kZXNjLnNldFRleHQoZGVzYyA9PSBudWxsID8gIiIgOiBkZXNjKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX21haW5kZXNjLnNldE1vZGFsT2JqZWN0KGN1cnJlbnRTdGVwKTsKLQkJY3RybF9tYWluZGVzYy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2VjdGlvbl9TZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCWlmIChzdGVwID09IG51bGwpIHsKLQkJCS8vIGNsb3NlIGFueSBGaW5kL1JlcGxhY2UgZGlhbG9nIG9wZW4gaW4gdGhlIFJURQotCQkJY3RybF9tYWluZGVzYy5nZXRGaW5kUmVwbGFjZUFjdGlvbigpLmRpc3Bvc2UoKTsKLQkJfQotCi0JCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCS5zZXRFbGVtZW50KGN1cnJlbnRTdGVwKTsKLQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJLnNldERpc2FibGUoY3VycmVudFN0ZXAgPT0gbnVsbCk7Ci0KLQkJZW5hYmxlQ29udHJvbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUgbmFtZSBhbmQgZGVzY3JpcHRpb24gY29udHJvbHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5hYmxlQ29udHJvbHMoKSB7Ci0JCWlmICh0YXNrLmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuY29udGFpbnMoY3VycmVudFN0ZXApKSB7Ci0JCQlpZiAoIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJY3RybF9uYW1lLnNldEVkaXRhYmxlKHRydWUpOwotCQkJCWN0cmxfbWFpbmRlc2Muc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQljdHJsX25hbWUuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJY3RybF9tYWluZGVzYy5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIGxpc3RlbmVyCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlUmljaFRleHRFZGl0b3JTZWN0aW9uKCkgewotCQlleHBhbmRlZENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGZvcm1TZWN0aW9uLCBTV1QuTk9ORSk7Ci0JCWV4cGFuZGVkQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKLQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCi0KLQkJLy8gSHlwZXJsaW5rIGRlc2MKLQkJZXhwYW5kTGluayA9IHRvb2xraXQuY3JlYXRlSW1hZ2VIeXBlcmxpbmsoZXhwYW5kZWRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZXhwYW5kTGluay5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfRVhQQU5ERUQpOwotCQlleHBhbmRMaW5rLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNsb3NlUlRFKTsgCi0JCWV4cGFuZExpbmsuc2V0VW5kZXJsaW5lZChmYWxzZSk7Ci0JCWV4cGFuZExpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQl0b2dnbGUoZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWV4cGFuZExhYmVsID0gY3JlYXRlRGVjb3JhdGVkTGFiZWwodG9vbGtpdCwgZXhwYW5kZWRDb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRvZ2dsZSBEZXNjcmlwdGlvbiBjb250cm9sIHRvIGV4cGFuZCBhbmQgY29udHJvbCBzdGF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0b2dnbGUoSHlwZXJsaW5rRXZlbnQgZSkgewotCQlpZiAoY3VycmVudFN0ZXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGN0cmxfZXhwYW5kZWQgPT0gbnVsbCkgewotCQkJY3RybF9leHBhbmRlZCA9IGNyZWF0ZVJpY2hUZXh0RWRpdG9yKHRvb2xraXQsIGV4cGFuZGVkQ29tcG9zaXRlLAotCQkJCQlTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCQlnZXRSaWNoVGV4dEVkaXRvckhlaWdodCgpLCBnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCksIDIsIGV4cGFuZExhYmVsKTsKLQkJCWN0cmxfZXhwYW5kZWQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJfQotCi0JCWlmIChkZXNjRXhwYW5kRmxhZykgewotCQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRDbGllbnQoc2VjdGlvbkNvbXBvc2l0ZSk7Ci0JCQlJTWV0aG9kUmljaFRleHQgcmljaFRleHQgPSBhY3RpdmVDb250cm9sOwotCQkJcmljaFRleHQuc2V0VGV4dChjdHJsX2V4cGFuZGVkLmdldFRleHQoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByaWNoVGV4dC5nZXRMaXN0ZW5lcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmljaFRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IChSaWNoVGV4dExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQljdHJsX2V4cGFuZGVkLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyLmdldEV2ZW50VHlwZSgpLCBsaXN0ZW5lcgotCQkJCQkJLmdldExpc3RlbmVyKCkpOwotCQkJfQotCQkJaWYgKGN0cmxfZXhwYW5kZWQuZ2V0TW9kaWZpZWQoKSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkuc2F2ZU1vZGlmaWVkUmljaFRleHQoY3RybF9leHBhbmRlZCk7Ci0JCQl9Ci0JCQlyaWNoVGV4dC5zZXRGb2N1cygpOwotCQl9IGVsc2UgewotCQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRDbGllbnQoZXhwYW5kZWRDb21wb3NpdGUpOwotCQkJZXhwYW5kTGFiZWwuc2V0VGV4dChjdXJyZW50U3RlcC5nZXROYW1lKCkgKwotCQkJCQkiIC0gIiArIChTdHJpbmcpICgoSW1hZ2VIeXBlcmxpbmspIGUuZ2V0U291cmNlKCkpLmdldERhdGEoIlRpdGxlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IChJTWV0aG9kUmljaFRleHQpIGUuZ2V0SHJlZigpOwotCQkJY3RybF9leHBhbmRlZC5zZXRJbml0aWFsVGV4dChyaWNoVGV4dC5nZXRUZXh0KCkpOwotCQkJY3RybF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChyaWNoVGV4dC5nZXRNb2RhbE9iamVjdCgpKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKHJpY2hUZXh0Ci0JCQkJCS5nZXRNb2RhbE9iamVjdEZlYXR1cmUoKSk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEZpbmRSZXBsYWNlQWN0aW9uKHJpY2hUZXh0LmdldEZpbmRSZXBsYWNlQWN0aW9uKCkpOwotCQkJZm9yIChJdGVyYXRvciBpID0gcmljaFRleHQuZ2V0TGlzdGVuZXJzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoUmljaFRleHRMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJY3RybF9leHBhbmRlZC5hZGRMaXN0ZW5lcihsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSwgbGlzdGVuZXIKLQkJCQkJCS5nZXRMaXN0ZW5lcigpKTsKLQkJCX0KLQkJCWJvb2xlYW4gZWRpdGFibGUgPSAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCWlmIChlZGl0YWJsZSkgewotCQkJCWN0cmxfZXhwYW5kZWQuc2V0Rm9jdXMoKTsKLQkJCX0KLQkJCWFjdGl2ZUNvbnRyb2wgPSByaWNoVGV4dDsKLQkJfQotCi0JCWZvcm0uZ2V0Qm9keSgpLmxheW91dCh0cnVlLCB0cnVlKTsKLQkJZGVzY0V4cGFuZEZsYWcgPSAhZGVzY0V4cGFuZEZsYWc7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRQcm92aWRlcnMoKSB7Ci0JCXN0ZXBzVmlld2VyQ29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYgKGFsbFN0ZXBzID09IG51bGwpIHsKLQkJCQkJYWxsU3RlcHMgPSBuZXcgU2VjdGlvbkxpc3QodGFzaywKLQkJCQkJCQlTZWN0aW9uTGlzdC5TVEVQU19GT1JfRUxFTUVOVF9PTkxZKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGFsbFN0ZXBzLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQlzdGVwc1ZpZXdlckxhYmVsUHJvdmlkZXIgPSBuZXcgVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuICF0YXNrLmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuY29udGFpbnMoZWxlbWVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVNYWluRGVzY3JpcHRpb24oKSB7Ci0JCWlmIChjdXJyZW50U3RlcCAhPSBudWxsKSB7Ci0JCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQk6IGN0cmxfbWFpbmRlc2M7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gY3VycmVudFN0ZXAuZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZShjb250cm9sLAotCQkJCQlvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgY3VycmVudFN0ZXAsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN0aW9uX1NlY3Rpb25EZXNjcmlwdGlvbigpLAotCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGdldEFjdGlvbk1hbmFnZXIoKSB7Ci0JCUZvcm1FZGl0b3IgZWRpdG9yID0gZ2V0RWRpdG9yKCk7Ci0JCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yKSB7Ci0JCQlyZXR1cm4gKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tTZWxlY3Rpb24oKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc3RlcHNUYWJsZVZpZXdlcgotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmICFUbmdVdGlsLmlzTG9ja2VkKHRhc2spKSB7Ci0JCQljdHJsX2RlbGV0ZS5zZXRFbmFibGVkKHRydWUpOwotCi0JCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKHRhc2spICYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQotCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQodGFzaykgJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJY3RybF9kb3duLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfQotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQllZGl0U3RlcCgob3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza1dvcmtQcm9kdWN0c1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza1dvcmtQcm9kdWN0c1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTllZDVjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tXb3JrUHJvZHVjdHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Xb3JrUHJvZHVjdEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBXb3JrIFByb2R1Y3RzIHBhZ2UgaW4gdGhlIFRhc2sgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrV29ya1Byb2R1Y3RzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ0YXNrV29ya1Byb2R1Y3RzUGFnZSI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIFRhc2sgdGFzazsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGFza1dvcmtQcm9kdWN0c1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5XT1JLX1BST0RVQ1RTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJdGFzayA9IChUYXNrKSBjb250ZW50RWxlbWVudDsKLQkJYWN0aW9uTWdyID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMih0cnVlKTsKLQkJc2V0QWxsb3dDaGFuZ2UzKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLmNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuICgoVGFzaykgb2JqZWN0KS5nZXRNYW5kYXRvcnlJbnB1dCgpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSByZXRyaWV2ZVRhYmxlVmlld2VyQ29udGVudHModmlld2VyX3NlbGVjdGVkMik7Ci0JCQlMaXN0IGFkZEl0ZW1zRmlsdGVyZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFkZEl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucygoKFdvcmtQcm9kdWN0KSBhZGRJdGVtcy5nZXQoaSkpKSkgewotCQkJCQlhZGRJdGVtc0ZpbHRlcmVkLmFkZChhZGRJdGVtcy5nZXQoaSkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChhZGRJdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCB0YXNrLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpLAotCQkJCQkJYWRkSXRlbXNGaWx0ZXJlZCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCB0YXNrLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCksIHJtSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkMiA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKFRhc2spIG9iamVjdCkuZ2V0T3B0aW9uYWxJbnB1dCgpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwyKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwyKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJTGlzdCBlbGVtZW50TGlzdCA9IHJldHJpZXZlVGFibGVWaWV3ZXJDb250ZW50cyh2aWV3ZXJfc2VsZWN0ZWQpOwotCQkJTGlzdCBhZGRJdGVtc0ZpbHRlcmVkID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRJdGVtcy5zaXplKCk7IGkrKykgewotCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnMoKChXb3JrUHJvZHVjdCkgYWRkSXRlbXMuZ2V0KGkpKSkpIHsKLQkJCQkJYWRkSXRlbXNGaWx0ZXJlZC5hZGQoYWRkSXRlbXMuZ2V0KGkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYWRkSXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgdGFzaywKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpLAotCQkJCQkJYWRkSXRlbXNGaWx0ZXJlZCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCB0YXNrLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwgcm1JdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMygpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQzID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuICgoVGFzaykgb2JqZWN0KS5nZXRPdXRwdXQoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDMuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMyhBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCB0YXNrLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrX091dHB1dCgpLCBhZGRJdGVtcywgLTEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMihBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwzKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgdGFzaywKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpLCBybUl0ZW1zLCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0YXNrOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IFdvcmtQcm9kdWN0RmlsdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyMigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyMigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBXb3JrUHJvZHVjdEZpbHRlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcjMoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcjMoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgV29ya1Byb2R1Y3RGaWx0ZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza1dvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Ub29sRGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rvb2xEZXNjcmlwdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4ZGIwNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rvb2xEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBmb3IgdGhlIERvbWFpbiBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRvb2xEZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAidG9vbERlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIFRvb2wgdG9vbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRvb2xEZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXRvb2wgPSAoVG9vbCkgY29udGVudEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0b29sOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgQ2F0ZWdvcnlGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBUb29sKTsKLQkJCX0KLQkJfTsKLQotCQkvLyBzZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZwotCQkoKENhdGVnb3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLnNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcigKLQkJCQkJCXRvb2wpIH0pOwotCQlyZXR1cm4gZmlsdGVyOwotCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuVE9PTFM7Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50b29sX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50b29sX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Ub29sVG9vbE1lbnRvcnNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rvb2xUb29sTWVudG9yc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1NjU3Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rvb2xUb29sTWVudG9yc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkd1aWRhbmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTW92ZUluQ2F0ZWdvcnlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5DYXRlZ29yeVNvcnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbnRlbnRFbGVtZW50T3JkZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFRvb2wgTWVudG9ycyBwYWdlIGluIHRoZSBUb29sIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBMb2thbmF0aCBKYWdnYQotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRvb2xUb29sTWVudG9yc1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAidG9vbFRvb2xNZW50b3JzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVG9vbCB0b29sOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0JCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBhbGxTdGVwczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRvb2xUb29sTWVudG9yc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5UT09MX01FTlRPUlNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl0b29sID0gKFRvb2wpIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldElzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQkvL3JldHVybiB0b29sLmdldFRvb2xNZW50b3JzKCkudG9BcnJheSgpOwotCQkJCWlmIChhbGxTdGVwcyA9PSBudWxsKSB7Ci0JCQkJCWFsbFN0ZXBzID0gbmV3IENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCUNvbnRlbnRFbGVtZW50T3JkZXJMaXN0LkNPTlRFTlRfRUxFTUVOVFNfX0ZPUl9FTEVNRU5UX09OTFksCi0JCQkJCQkJZ2V0Q29udGVudENhdGVnb3J5T3JkZXJGZWF0dXJlKCkpOwotCQkJCX0KLQkJCQlMaXN0IHJldHVybkxpc3QgPSBDYXRlZ29yeVNvcnRIZWxwZXIuc29ydENhdGVnb3J5RWxlbWVudHMoCi0JCQkJCQljb250ZW50RWxlbWVudCwgYWxsU3RlcHMudG9BcnJheSgpKTsKLQkJCQlyZXR1cm4gcmV0dXJuTGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBjaGVjayBpZiB0aGlzIG9wZXJhdGlvbiB3aWxsIG1vZGlmeSB0aGUgZWxlbWVudCBpbiBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKCFVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnlPcHBvc2l0ZSh0b29sLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbF9Ub29sTWVudG9ycygpLCBlbGVtZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCB0b29sLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sX1Rvb2xNZW50b3JzKCksIGFkZEl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIHRvb2wsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2xfVG9vbE1lbnRvcnMoKSwgcm1JdGVtcywgLTEpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gdG9vbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlRPT0xfTUVOVE9SUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBHdWlkYW5jZUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy50b29sVG9vbE1lbnRvcnNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xUb29sTWVudG9yc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDb250ZW50Q2F0ZWdvcnlPcmRlckZlYXR1cmUoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sX1Rvb2xNZW50b3JzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldE1vZGVsU3RydWN0dXJlUGF0aCgpIHsKLQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGg7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBnZXRDb250ZW50RWxlbWVudE9yZGVyTGlzdCgpIHsKLQkJcmV0dXJuIGFsbFN0ZXBzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4ODhkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgQ2F0ZWdvcmllcyBwYWdlIGluIHRoZSBXb3JrIFByb2R1Y3QgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogcmVtb3ZlIHRoZSB0by1vbmUgVUkgcmVzdHJpY3Rpb24gb24gd3AtZG9taWFuIChSMzk1MzkwKSAyMDA3LTA4LTMwCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gIndvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkNBVEVHT1JJRVNfUEFHRV9USVRMRSk7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRVc2VDYXRlZ29yeTModHJ1ZSk7Ci0JCXNldENhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXREb21haW5zKChXb3JrUHJvZHVjdCkgb2JqZWN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3QgZG9tYWluID0gYWRkSXRlbXMuZ2V0KDApOwotCQkJTGlzdCBkb21haW5zID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RG9tYWlucyh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAoZG9tYWlucyAhPSBudWxsICYmIGRvbWFpbnMuc2l6ZSgpID4gMCkJewotCQkJCU9iamVjdCBhc3NvY2lhdGVkRG9tYWluID0gZG9tYWlucy5nZXQoMCk7Ci0vLwkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdAotLy8JCQkJLmZvcm1hdCgKLS8vCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuVXNlckludGVyYWN0aW9uSGVscGVyX2VyclJlbGF0aW9uc2hpcEV4aXN0cywKLS8vCQkJCQkJbmV3IE9iamVjdFtdIHsKLS8vCQkJCQkJCQl3b3JrUHJvZHVjdC5nZXROYW1lKCksCi0vLwkJCQkJCQkJVG5nVXRpbAotLy8JCQkJCQkJCQkJLmdldExhYmVsV2l0aFBhdGgoYXNzb2NpYXRlZERvbWFpbiksCi0vLwkJCQkJCQkJKChEb21haW4pIGRvbWFpbikuZ2V0TmFtZSgpIH0pOwotLy8JCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dXYXJuaW5nKAotLy8JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwgbXNnKTsKLS8vCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRUb0RvbWFpbihnZXRBY3Rpb25NYW5hZ2VyKCksCi0JCQkJCShEb21haW4pIGRvbWFpbiwgd29ya1Byb2R1Y3QsIHVzZWRDYXRlZ29yaWVzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlEb21haW4gZG9tYWluID0gKERvbWFpbikgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbURvbWFpbigKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgZG9tYWluLCB3b3JrUHJvZHVjdCwgdXNlZENhdGVnb3JpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldFdvcmtQcm9kdWN0VHlwZXMoCi0JCQkJCQkoV29ya1Byb2R1Y3QpIG9iamVjdCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdFR5cGUgd3BUeXBlID0gKFdvcmtQcm9kdWN0VHlwZSkgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9Xb3JrUHJvZHVjdFR5cGUoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIHdwVHlwZSwgd29ya1Byb2R1Y3QsIHVzZWRDYXRlZ29yaWVzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdFR5cGUgd3BUeXBlID0gKFdvcmtQcm9kdWN0VHlwZSkgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbVdvcmtQcm9kdWN0VHlwZSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgd3BUeXBlLCB3b3JrUHJvZHVjdCwgdXNlZENhdGVnb3JpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMygpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQzID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldEN1c3RvbUNhdGVnb3JpZXMoCi0JCQkJCQkoV29ya1Byb2R1Y3QpIG9iamVjdCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQzLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDMoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDMoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlDdXN0b21DYXRlZ29yeSBjdXN0b21DYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9DdXN0b21DYXRlZ29yeSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgY3VzdG9tQ2F0ZWdvcnksIHdvcmtQcm9kdWN0LCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDMoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMyhBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUN1c3RvbUNhdGVnb3J5IGN1c3RvbUNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBpdC5uZXh0KCk7Ci0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVGcm9tQ3VzdG9tQ2F0ZWdvcnkoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIGN1c3RvbUNhdGVnb3J5LCB3b3JrUHJvZHVjdCwgdXNlZENhdGVnb3JpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcyKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmczKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgRG9tYWluKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIyKCkgewotCQlyZXR1cm4gZmlsdGVyMiA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyMygpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyMygpIHsKLQkJcmV0dXJuIGZpbHRlcjMgPSBuZXcgQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXIoKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwzOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb25TdHJpbmcoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGVlZDZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLldvcmtQcm9kdWN0RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgRGVsaXZlcmFibGUgUGFydHMgcGFnZSBpbiB0aGUgV29yayBQcm9kdWN0IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAid29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV29ya1Byb2R1Y3Qgd29ya1Byb2R1Y3Q7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRFTElWRVJBQkxFX1BBUlRTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJRGVsaXZlcmFibGUgd3AgPSAoRGVsaXZlcmFibGUpIHdvcmtQcm9kdWN0OwotCQkJCXJldHVybiB3cC5nZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVdvcmtQcm9kdWN0IGl0ZW0gPSAoV29ya1Byb2R1Y3QpIGl0Lm5leHQoKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB3b3JrUHJvZHVjdCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSwgaXRlbSwKLQkJCQkJCS0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdCBpdGVtID0gKFdvcmtQcm9kdWN0KSBpdC5uZXh0KCk7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgd29ya1Byb2R1Y3QsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCksIGl0ZW0sCi0JCQkJCQktMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgV29ya1Byb2R1Y3RGaWx0ZXIoKSB7Ci0JCQkvKgotCQkJICogQXJyYXlMaXN0KGJhZGxpc3QpIGlzIHVzZWQgdG8gc3RvcmUgYWxsCi0JCQkgKiBnZW5lcmFsaXplci9iYXNldmFyaWFiaWxpdHkgZm9yIHN1YnBhcnRzIG9mCi0JCQkgKiBnZW5lcmFsaXplci9iYXNldmFyaWFiaWxpdHkgY2FuIGJlIHJlamVjdGVkLiBEZWxpdmVyYWJsZSBjYW5ub3QKLQkJCSAqIGhvbGQgaW5mb3JtYXRpb24gdG8gd2hvIGl0c2VsZiBpcyBhY3RpbmcgYXMgZGVsaXZlcmFibGUgcGFydC4KLQkJCSAqLwotCQkJTGlzdCBiYWRsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCQkvKiAKLQkJCQkJICogQ2hlY2sgRGVsaXZlcmFibGUgYW5kIERlbGl2ZXJhYmxlUGFydHMgYXNzb2NpYXRpb24KLQkJCQkJICogY2lyY3VsYXIgZGVwZW5kZW5jeS4KLQkJCQkJKi8KLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlCi0JCQkJCQkJJiYgd29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCQkJLyoKLQkJCQkJCSAqIENoZWNrIHBhc3NlZCBvYmplY3QncyBjaGFpbmVkIGRlbGl2ZXJhYmxlIHBhcnRzCi0JCQkJCQkgKiAodHJlZSkgY29udGFpbiB3b3JrUHJvZHVjdCAoZWRpdG9yIG9iamVjdCkuCi0JCQkJCQkgKi8KLQkJCQkJCWlmICghVUlIZWxwZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcygKLQkJCQkJCQkJKERlbGl2ZXJhYmxlKSBvYmosIChEZWxpdmVyYWJsZSkgd29ya1Byb2R1Y3QpKSB7Ci0JCQkJCQkJYmFkbGlzdC5hZGQob2JqKTsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoIWNoZWNrVmFyaWFiaWxpdHkoKERlbGl2ZXJhYmxlKSBvYmosIGJhZGxpc3QpKSB7Ci0JCQkJCQkJYmFkbGlzdC5hZGQob2JqKTsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBicm93c2UgdGhyb3VnaCBiYWRsaXN0IGFuZCBpdHMgZGVsaXZlcmFibGUgcGFydHMuCi0JCQkJCQlMaXN0IHRlbXBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGJhZGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgYmFkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCVVJSGVscGVyLmRlbGl2ZXJhYmxlUGFydHNDaGFpbigoRGVsaXZlcmFibGUpIGJhZCwgdGVtcGxpc3QpOwotCQkJCQkJfQotCQkJCQkJaWYgKHRlbXBsaXN0LmNvbnRhaW5zKG9iaikpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCS8qCi0JCQkJCSAqIHJldHVybiB0cnVlIGlmIGFib3ZlIGNvbmRpdGlvbiBhcmUgc3VjY2Vzc2Z1bAotCQkJCQkgKi8KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja1ZhcmlhYmlsaXR5KERlbGl2ZXJhYmxlIGUsIExpc3QgYmFkbGlzdCkgewotCi0JCS8qCi0JCSAqIENoZWNrIGVkaXRvciBvYmplY3QncyB2YXJpYWJpbGl0eSBiYXNlIG9iamVjdCBpcyBjaGlsZCBpbgotCQkgKiBEZWxpdmVyYWJsZShlKSB0cmVlLiB0aGVuIERlbGl2ZXJhYmxlKGUpc2hvdWxkbm90IGJlIGFjY2VwdGVkLiBEMSAtPgotCQkgKiBEMiAtPiBEMyAoIC0+IGluZGljYXRlcyBkZWxpdmVyYWJsZSBwYXJ0IHJlbGF0aW9uc2hpcCkgRDYgY29udHJpYnV0ZXMKLQkJICogRDMuIEQ2IGNhbm5vdCBzZWxlY3QgRDEsRDIgYXMgZGVsaXZlcmFibGUgcGFydC4KLQkJICovCi0JCWlmICh3b3JrUHJvZHVjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJT2JqZWN0IG9iaiA9IHdvcmtQcm9kdWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmICghVUlIZWxwZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcyhlLCAoRGVsaXZlcmFibGUpIG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLyoKLQkJICogQ2hlY2sgZWRpdG9yIERlbGl2ZXJhYmxlJ3MgZ2VuZXJhbGl6ZXIsIGlmIGdlbmVyYWxpemVyJ3Mgc3VicGFydHMKLQkJICogKHRyZWUpIGNvbnRhaW5zIHBhc3NlZCBkZWxpdmVyYWJsZS4gUmV0dXJuIGZhbHNlLgotCQkgKi8KLQotCQlJdGVyYXRvciBpdCA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKHdvcmtQcm9kdWN0KTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotCQkJaWYgKHZlICE9IG51bGwpIHsKLQkJCQkvKgotCQkJCSAqIGdlbmVyYWxpemVyIGlzIGFkZGVkIHRvIGJhZGxpc3QsIGJlY2F1c2UgaWYgdmFyaWFiaWxpdHkgYmFzZQotCQkJCSAqIGlzIGZpbHRlcmVkIGJlZm9yZSBjb21pbmcgdG8gY2hpbGRBY2NlcHQob2JqZWN0KSBtZXRob2QsIHRoaXMKLQkJCQkgKiB3aWxsIHByZXZlbnRzIGFueSBzdWJwYXJ0cyBvZiBnZW5lcmFsaXplciB0byBiZSBhZGRlZCBhcyBhCi0JCQkJICogZGVsaXZlcmFibGUgcGFydCBvZiBEZWxpdmVyYWJsZSAoRWRpdG9yIG9iamVjdCBvciBsb2NhbAotCQkJCSAqIGRlZmluZWQgdmFyaWFibGUid29ya1Byb2R1Y3QiKS4KLQkJCQkgKiAKLQkJCQkgKiBlZzogRDEgLT4gRDIgLT4gRDMuICgtPiBpbmRpY2F0ZXMgZGVsaXZlcmFibGUgcGFydCkuIEQxCi0JCQkJICogY29udHJpYnV0ZXMgRDUuIGFuZCBENSdzIGRlbGl2ZXJhYmxlIHBhcnRzIGFzc2lnbiBmaWx0ZXIKLQkJCQkgKiBzaG91bGRub3Qgc2hvdyBEMiBhbmQgRDMuCi0JCQkJICogCi0JCQkJICovCi0JCQkJYmFkbGlzdC5hZGQodmUpOwotCQkJCWlmICh2ZS5lcXVhbHMoZSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAoIVVJSGVscGVyLmNoZWNrQ2lyY3VsYXJEZWxpdmVyYWJsZXMoZSwgKERlbGl2ZXJhYmxlKSB2ZSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQl9Ci0JCS8qCi0JCSAqIAotCQkgKi8KLQkJaWYgKGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCU9iamVjdCBvYmogPSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmICghVUlIZWxwZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcygoRGVsaXZlcmFibGUpIG9iaiwKLQkJCQkJKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8qCi0JCSAqIENoZWNrIHBhc3NlZCBvYmplY3QncyBnZW5lcmFsaXplcidzIGRlbGl2ZXJhYmxlIHBhcnRzIGxpc3QgZG9ub3QgaGF2ZQotCQkgKiB3b3JrUHJvZHVjdC4KLQkJICovCi0JCUl0ZXJhdG9yIGl0MSA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKGUpOwotCQl3aGlsZSAoaXQxLmhhc05leHQoKSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQxLm5leHQoKTsKLQkJCWlmICh2ZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHZlLmVxdWFscyhlKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmICghVUlIZWxwZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcygoRGVsaXZlcmFibGUpIHZlLAotCQkJCQkJKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQl9Ci0KLQkJLyoKLQkJICogQ2hlY2sgd29ya1Byb2R1Y3Qgb2JqZWN0IChlZGl0b3Igb2JqZWN0KSdzIHZhcmlhYmlsaXR5IGFuZCBpdHMKLQkJICogZGVsaXZlcmFibGVzIHNob3VsZCBub3QgY29udGFpbiBwYXNzZWQgb2JqZWN0LgotCQkgKi8KLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlkZWxpdmVyYWJsZVBhcnRzVmFyaWFiaWxpdHkoKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCwgbGlzdCk7Ci0JCWlmIChsaXN0LmNvbnRhaW5zKGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8qCi0JCSAqIENoZWNrIHBhc3NlZCBvYmplY3QgdmFyaWFiaWxpdHkgYW5kIGl0cyBkZWxpdmVyYWJsZXMgc2hvdWxkIG5vdAotCQkgKiBjb250YWluIHdvcmtwcm9kdWN0KGRlbGl2ZXJhYmxlIG9yIGVkaXRvciBvYmplY3QpLiBJZiBpdCBjb250YWlucywKLQkJICogcGFzc2VkIG9iamVjdCBzaG91bGRub3QgYmUgYWNjZXB0ZWQuCi0JCSAqLwotCQlkZWxpdmVyYWJsZVBhcnRzVmFyaWFiaWxpdHkoKERlbGl2ZXJhYmxlKSBlLCBsaXN0KTsKLQkJaWYgKGxpc3QuY29udGFpbnMod29ya1Byb2R1Y3QpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVsaXZlcmFibGVQYXJ0c1ZhcmlhYmlsaXR5KERlbGl2ZXJhYmxlIGUsIExpc3Qgcm9vdHMpIHsKLQkJTGlzdCBsaXN0ID0gKChEZWxpdmVyYWJsZSkgZSkuZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCk7Ci0JCWlmIChsaXN0ICE9IG51bGwgJiYgbGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJaWYgKCgoRGVsaXZlcmFibGUpIG9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCXJvb3RzLmFkZCgoKERlbGl2ZXJhYmxlKSBvYmopCi0JCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJSXRlcmF0b3IgaXQxID0gVG5nVXRpbC5nZXRHZW5lcmFsaXplcnMoZSk7Ci0JCQkJCQl3aGlsZSAoaXQxLmhhc05leHQoKSkgewotCQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0MQotCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQlVSUhlbHBlci5kZWxpdmVyYWJsZVBhcnRzQ2hhaW4oKERlbGl2ZXJhYmxlKSB2ZSwgcm9vdHMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWRlbGl2ZXJhYmxlUGFydHNWYXJpYWJpbGl0eSgoRGVsaXZlcmFibGUpIG9iaiwgcm9vdHMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQlJdGVyYXRvciBpdDEgPSBUbmdVdGlsLmdldEdlbmVyYWxpemVycyhlKTsKLQkJCXdoaWxlIChpdDEuaGFzTmV4dCgpKSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQxLm5leHQoKTsKLQkJCQlVSUhlbHBlci5kZWxpdmVyYWJsZVBhcnRzQ2hhaW4oKERlbGl2ZXJhYmxlKSB2ZSwgcm9vdHMpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2U1MmRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Xb3JrUHJvZHVjdEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuVUlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgaW4gYSBXb3JrIFByb2R1Y3QgKEFydGlmYWN0LCBEZWxpdmVyYWJsZSBhbmQgT3V0Y29tZSkKLSAqIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAid29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9pbXBhY3Q7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX3JlYXNvbjsKLQotCS8vIEZvciBBcnRpZmFjdAotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfYnJpZWZfb3V0bGluZTsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfcmVwcmVzZW50YXRpb25fb3B0aW9uczsKLQotCS8vIEZvciBEZWxpdmVyYWJsZQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfZXh0ZXJuYWxfZGVzYywgY3RybF9wYWNrYWdpbmdfZ3VpZGFuY2U7Ci0JCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9yZXByZXNlbnRhdGlvbjsKLQkKLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX25vdGF0aW9uOwotCi0JcHJpdmF0ZSBXb3JrUHJvZHVjdCB3b3JrUHJvZHVjdDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl3b3JrUHJvZHVjdCA9IChXb3JrUHJvZHVjdCkgY29udGVudEVsZW1lbnQ7Ci0JCXB1cnBvc2VPbiA9IHRydWU7Ci0JCWV4dGVybmFsSWRPbiA9IHRydWU7Ci0JCWlmICghKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgT3V0Y29tZSkpIHsKLQkJCW5vdGF0aW9uU2VjdGlvbk9uID0gdHJ1ZTsKLQkJfQotCQl0YWlsb3JpbmdTZWN0aW9uT24gPSB0cnVlOwotCQlpY29uU2VjdGlvbk9uID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNjcmVhdGVOb3RhdGlvblNlY3Rpb25Db250ZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVOb3RhdGlvblNlY3Rpb25Db250ZW50KCkgewotCQlzdXBlci5jcmVhdGVOb3RhdGlvblNlY3Rpb25Db250ZW50KCk7Ci0JCQotCQkKLQkJCi0JCWlmICh3b3JrUHJvZHVjdCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQljdHJsX2JyaWVmX291dGxpbmUgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQkJbm90YXRpb25Db21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5CUklFRl9PVVRMSU5FX1RFWFQsIDQwLAotCQkJCQk0MDAsIE5PVEFUSU9OX1NFQ1RJT05fSUQpOwotCQkJY3RybF9yZXByZXNlbnRhdGlvbiA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCQlub3RhdGlvbkNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0LlJFUFJFU0VOVEFUSU9OX1RFWFQsIDQwLCA0MDAsCi0JCQkJCU5PVEFUSU9OX1NFQ1RJT05fSUQpOwotCQkJY3RybF9ub3RhdGlvbiA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCQlub3RhdGlvbkNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0Lk5PVEFUSU9OX1RFWFQsIDQwLCA0MDAsCi0JCQkJCU5PVEFUSU9OX1NFQ1RJT05fSUQpOwotCQl9IGVsc2UgaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCWN0cmxfZXh0ZXJuYWxfZGVzYyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCQlub3RhdGlvbkNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0LkVYVEVSTkFMX0RFU0NSSVBUSU9OX1RFWFQsIDQwLCA0MDAsCi0JCQkJCU5PVEFUSU9OX1NFQ1RJT05fSUQpOwotCQkJY3RybF9wYWNrYWdpbmdfZ3VpZGFuY2UgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24oCi0JCQkJCXRvb2xraXQsIG5vdGF0aW9uQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSVRleHQuUEFDS0FHSU5HX0dVSURBTkNFX1RFWFQsIDQwLCA0MDAsCi0JCQkJCU5PVEFUSU9OX1NFQ1RJT05fSUQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjY3JlYXRlVGFpbG9yaW5nU2VjdGlvbkNvbnRlbnQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhaWxvcmluZ1NlY3Rpb25Db250ZW50KCkgewotCQlzdXBlci5jcmVhdGVUYWlsb3JpbmdTZWN0aW9uQ29udGVudCgpOwotCQljdHJsX2ltcGFjdCA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCXRhaWxvcmluZ0NvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LklNUEFDVF9PRl9OT1RfSEFWSU5HX1RFWFQsCi0JCQkJNDAsIDQwMCwgVEFJTE9SSU5HX1NFQ1RJT05fSUQpOwotCQljdHJsX3JlYXNvbiA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCXRhaWxvcmluZ0NvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuUkVBU09OX0ZPUl9OT1RfTkVFRElOR19URVhULCA0MCwgNDAwLAotCQkJCVRBSUxPUklOR19TRUNUSU9OX0lEKTsKLQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWN0cmxfcmVwcmVzZW50YXRpb25fb3B0aW9ucyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQkJdG9vbGtpdCwgdGFpbG9yaW5nQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSVRleHQuUkVQUkVTRU5UQVRJT05fT1BUSU9OU19URVhULCA0MCwgNDAwLAotCQkJCQlOT1RBVElPTl9TRUNUSU9OX0lEKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlmaW5hbCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0KLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0KLQkJaWYgKHB1cnBvc2VPbikgewotCQkJY3RybF9wdXJwb3NlLnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCWN0cmxfcHVycG9zZS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpKTsKLQkJCWN0cmxfcHVycG9zZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJY3RybF9wdXJwb3NlLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCTogY3RybF9wdXJwb3NlOwotCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24pIHdvcmtQcm9kdWN0Ci0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRQdXJwb3NlKCk7Ci0JCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpLAotCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJaWYgKGV4dGVybmFsSWRPbikgewotCQkJY3RybF9leHRlcm5hbF9pZC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJY3RybF9leHRlcm5hbF9pZC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCkpOwotCQkJCX0KLQkKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24pIHdvcmtQcm9kdWN0Ci0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRFeHRlcm5hbElkKCk7Ci0JCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJCWN0cmxfZXh0ZXJuYWxfaWQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjdHJsX2V4dGVybmFsX2lkLmdldFRleHQoKTsKLQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCksCi0JCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQlpZiAodGFpbG9yaW5nU2VjdGlvbk9uKSB7Ci0JCQljdHJsX2ltcGFjdC5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQljdHJsX2ltcGFjdC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKSk7Ci0JCQljdHJsX2ltcGFjdC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJY3RybF9pbXBhY3QuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJOiBjdHJsX2ltcGFjdDsKLQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKTsKLQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKSwKLQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQljdHJsX3JlYXNvbi5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQljdHJsX3JlYXNvbi5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKSk7Ci0JCQljdHJsX3JlYXNvbi5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJY3RybF9yZWFzb24uYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJOiBjdHJsX3JlYXNvbjsKLQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKSwKLQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQlpZiAod29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCWN0cmxfcmVwcmVzZW50YXRpb25fb3B0aW9ucy5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQljdHJsX3JlcHJlc2VudGF0aW9uX29wdGlvbnMKLQkJCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCkpOwotCQkJCWN0cmxfcmVwcmVzZW50YXRpb25fb3B0aW9ucwotCQkJCQkJLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJY3RybF9yZXByZXNlbnRhdGlvbl9vcHRpb25zLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCQluZXcgTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQkJCTogY3RybF9yZXByZXNlbnRhdGlvbl9vcHRpb25zOwotCQkJCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbikgd29ya1Byb2R1Y3QKLQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkKLQkJCQkJCQkJCS5nZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKTsKLQkJCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCQkJCS5tdXN0UmVzdG9yZVZhbHVlKGNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1ncgotCQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50Ci0JCQkJCQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uT3B0aW9ucygpLAotCQkJCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCX0KLQkJfQotCi0JCWlmIChub3RhdGlvblNlY3Rpb25PbikgewotCQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQljdHJsX2JyaWVmX291dGxpbmUuc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJCWN0cmxfYnJpZWZfb3V0bGluZS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpKTsKLQkJCQljdHJsX2JyaWVmX291dGxpbmUuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQljdHJsX2JyaWVmX291dGxpbmUuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQkJOiBjdHJsX2JyaWVmX291dGxpbmU7Ci0JCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24pIHdvcmtQcm9kdWN0Ci0JCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0QnJpZWZPdXRsaW5lKCk7Ci0JCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCQkuZ2V0VGV4dCgpIDogY3RybF9icmllZl9vdXRsaW5lLmdldFRleHQoKTsKLQkJCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsIGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpLAotCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkKLQkJCQkKLQkJCQkKLQkJCQljdHJsX3JlcHJlc2VudGF0aW9uLnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQljdHJsX3JlcHJlc2VudGF0aW9uLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKSk7Ci0JCQkJY3RybF9yZXByZXNlbnRhdGlvbi5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCWN0cmxfcmVwcmVzZW50YXRpb24uYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQkJOiBjdHJsX3JlcHJlc2VudGF0aW9uOwotCQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldFJlcHJlc2VudGF0aW9uKCk7Ci0JCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCQkuZ2V0VGV4dCgpIDogY3RybF9yZXByZXNlbnRhdGlvbi5nZXRUZXh0KCk7Ci0JCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULCBjb250ZW50RWxlbWVudAotCQkJCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkKLQkJCQljdHJsX25vdGF0aW9uLnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQljdHJsX25vdGF0aW9uLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fTm90YXRpb24oKSk7Ci0JCQkJY3RybF9ub3RhdGlvbi5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCWN0cmxfbm90YXRpb24uYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQkJOiBjdHJsX25vdGF0aW9uOwotCQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldE5vdGF0aW9uKCk7Ci0JCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCQkuZ2V0VGV4dCgpIDogY3RybF9ub3RhdGlvbi5nZXRUZXh0KCk7Ci0JCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULCBjb250ZW50RWxlbWVudAotCQkJCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9Ob3RhdGlvbigpLAotCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQljdHJsX2V4dGVybmFsX2Rlc2Muc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJCWN0cmxfZXh0ZXJuYWxfZGVzYy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKSk7Ci0JCQkJY3RybF9leHRlcm5hbF9kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJY3RybF9leHRlcm5hbF9kZXNjLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJCTogY3RybF9leHRlcm5hbF9kZXNjOwotCQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldEV4dGVybmFsRGVzY3JpcHRpb24oKTsKLQkJCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyCi0JCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpLAotCQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQotCQkJCWN0cmxfcGFja2FnaW5nX2d1aWRhbmNlLnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJCWN0cmxfcGFja2FnaW5nX2d1aWRhbmNlLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKSk7Ci0JCQkJY3RybF9wYWNrYWdpbmdfZ3VpZGFuY2UuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQljdHJsX3BhY2thZ2luZ19ndWlkYW5jZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCQk6IGN0cmxfcGFja2FnaW5nX2d1aWRhbmNlOwotCQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldFBhY2thZ2luZ0d1aWRhbmNlKCk7Ci0JCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1ncgotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX1BhY2thZ2luZ0d1aWRhbmNlKCksCi0JCQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNyZWZyZXNoKGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChib29sZWFuIGVkaXRhYmxlKSB7Ci0JCXN1cGVyLnJlZnJlc2goZWRpdGFibGUpOwotCQlpZiAodGFpbG9yaW5nU2VjdGlvbk9uKSB7Ci0JCQljdHJsX2ltcGFjdC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQljdHJsX3JlYXNvbi5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQlpZiAod29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBBcnRpZmFjdCkKLQkJCQljdHJsX3JlcHJlc2VudGF0aW9uX29wdGlvbnMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmIChub3RhdGlvblNlY3Rpb25PbikgewotCQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQljdHJsX2JyaWVmX291dGxpbmUuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJCWN0cmxfcmVwcmVzZW50YXRpb24uc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJCWN0cmxfbm90YXRpb24uc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJfQotCQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQljdHJsX2V4dGVybmFsX2Rlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJCWN0cmxfcGFja2FnaW5nX2d1aWRhbmNlLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWREYXRhKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGF0YSgpIHsKLQkJc3VwZXIubG9hZERhdGEoKTsKLQotCQlvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24gY29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCi0JCWlmIChwdXJwb3NlT24pIHsKLQkJCVN0cmluZyBwdXJwb3NlID0gY29udGVudC5nZXRQdXJwb3NlKCk7Ci0JCQljdHJsX3B1cnBvc2Uuc2V0VGV4dChwdXJwb3NlID09IG51bGwgPyAiIiA6IHB1cnBvc2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHRhaWxvcmluZ1NlY3Rpb25PbikgewotCQkJU3RyaW5nIGltcGFjdCA9IGNvbnRlbnQuZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKTsKLQkJCVN0cmluZyByZWFzb24gPSBjb250ZW50LmdldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCk7Ci0JCQljdHJsX2ltcGFjdC5zZXRUZXh0KGltcGFjdCA9PSBudWxsID8gIiIgOiBpbXBhY3QpOyAvLyROT04tTkxTLTEkCQotCQkJY3RybF9yZWFzb24uc2V0VGV4dChyZWFzb24gPT0gbnVsbCA/ICIiIDogcmVhc29uKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQljdHJsX3JlcHJlc2VudGF0aW9uX29wdGlvbnMKLQkJCQkuc2V0VGV4dCgoKEFydGlmYWN0RGVzY3JpcHRpb24pIGNvbnRlbnQpCi0JCQkJCQkuZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkgPT0gbnVsbCA/ICIiIDogKChBcnRpZmFjdERlc2NyaXB0aW9uKSBjb250ZW50KS5nZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCWlmIChleHRlcm5hbElkT24pIHsKLQkJCVN0cmluZyBleHRlcm5hbF9pZCA9IGNvbnRlbnQuZ2V0RXh0ZXJuYWxJZCgpOwotCQkJY3RybF9leHRlcm5hbF9pZC5zZXRUZXh0KGV4dGVybmFsX2lkID09IG51bGwgPyAiIiA6IGV4dGVybmFsX2lkKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKG5vdGF0aW9uU2VjdGlvbk9uKSB7Ci0JCQlpZiAod29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCWN0cmxfYnJpZWZfb3V0bGluZQotCQkJCQkJLnNldFRleHQoKChBcnRpZmFjdERlc2NyaXB0aW9uKSBjb250ZW50KS5nZXRCcmllZk91dGxpbmUoKSA9PSBudWxsID8gIiIgOiAoKEFydGlmYWN0RGVzY3JpcHRpb24pIGNvbnRlbnQpLmdldEJyaWVmT3V0bGluZSgpKTsgLy8kTk9OLU5MUy0xJAkJCQotCQkJCWN0cmxfcmVwcmVzZW50YXRpb24uc2V0VGV4dCgoKEFydGlmYWN0RGVzY3JpcHRpb24pIGNvbnRlbnQpLmdldFJlcHJlc2VudGF0aW9uKCkgPT0gbnVsbCA/ICIiIDogKChBcnRpZmFjdERlc2NyaXB0aW9uKSBjb250ZW50KS5nZXRSZXByZXNlbnRhdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWN0cmxfbm90YXRpb24uc2V0VGV4dCgoKEFydGlmYWN0RGVzY3JpcHRpb24pIGNvbnRlbnQpLmdldE5vdGF0aW9uKCkgPT0gbnVsbCA/ICIiIDogKChBcnRpZmFjdERlc2NyaXB0aW9uKSBjb250ZW50KS5nZXROb3RhdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmICh3b3JrUHJvZHVjdCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJY3RybF9leHRlcm5hbF9kZXNjCi0JCQkJCQkuc2V0VGV4dCgoKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24pIGNvbnRlbnQpCi0JCQkJCQkJCS5nZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkgPT0gbnVsbCA/ICIiIDogKChEZWxpdmVyYWJsZURlc2NyaXB0aW9uKSBjb250ZW50KS5nZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJY3RybF9wYWNrYWdpbmdfZ3VpZGFuY2UKLQkJCQkJCS5zZXRUZXh0KCgoRGVsaXZlcmFibGVEZXNjcmlwdGlvbikgY29udGVudCkKLQkJCQkJCQkJLmdldFBhY2thZ2luZ0d1aWRhbmNlKCkgPT0gbnVsbCA/ICIiIDogKChEZWxpdmVyYWJsZURlc2NyaXB0aW9uKSBjb250ZW50KS5nZXRQYWNrYWdpbmdHdWlkYW5jZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IFdvcmtQcm9kdWN0RmlsdGVyKCkgewotCQkJTGlzdCBiYWRsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKHN1cGVyLmNoaWxkQWNjZXB0KG9iaikpIHsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QKLQkJCQkJCQkJJiYgKChDb250ZW50RWxlbWVudCkgZ2V0SGVscGVyKCkKLQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnQoKSkuZ2V0VHlwZSgpLmVxdWFscygKLQkJCQkJCQkJCQkoKENvbnRlbnRFbGVtZW50KSBvYmopLmdldFR5cGUoKSkpIHsKLQkJCQkJCQkvLyBwcmV2ZW50IGNpcmN1bGFyIGRlcGVuZGVuY3kgZnJvbSBkZWxpdmVyYWJsZQotCQkJCQkJCS8vIHBhcnRzIGFuZCB2YXJpYWJpbGl0eQotCQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZWxpdmVyYWJsZQotCQkJCQkJCQkJJiYgd29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCQkJCQlpZiAoIVVJSGVscGVyLmNoZWNrQ2lyY3VsYXJEZWxpdmVyYWJsZXMoCi0JCQkJCQkJCQkJKERlbGl2ZXJhYmxlKSBvYmosCi0JCQkJCQkJCQkJKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCkpIHsKLQkJCQkJCQkJCWJhZGxpc3QuYWRkKG9iaik7Ci0JCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKCgoRGVsaXZlcmFibGUpIG9iaikKLQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmICghVUlIZWxwZXIKLQkJCQkJCQkJCQkJLmNoZWNrQ2lyY3VsYXJEZWxpdmVyYWJsZXMoCi0JCQkJCQkJCQkJCQkJKERlbGl2ZXJhYmxlKSAoKERlbGl2ZXJhYmxlKSBvYmopCi0JCQkJCQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLAotCQkJCQkJCQkJCQkJCShEZWxpdmVyYWJsZSkgd29ya1Byb2R1Y3QpKSB7Ci0JCQkJCQkJCQkJYmFkbGlzdC5hZGQob2JqKTsKLQkJCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJSXRlcmF0b3IgaXQxID0gVG5nVXRpbAotCQkJCQkJCQkJCS5nZXRHZW5lcmFsaXplcnMoKERlbGl2ZXJhYmxlKSBvYmopOwotCQkJCQkJCQl3aGlsZSAoaXQxLmhhc05leHQoKSkgewotCQkJCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQxCi0JCQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCQlpZiAodmUgIT0gbnVsbCkgewotCQkJCQkJCQkJCWlmICh2ZS5lcXVhbHMob2JqKSkKLQkJCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQkJCWlmICghVUlIZWxwZXIKLQkJCQkJCQkJCQkJCS5jaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKAotCQkJCQkJCQkJCQkJCQkoRGVsaXZlcmFibGUpIHZlLAotCQkJCQkJCQkJCQkJCQkoRGVsaXZlcmFibGUpIHdvcmtQcm9kdWN0KSkgewotCQkJCQkJCQkJCQliYWRsaXN0LmFkZChvYmopOwotCQkJCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCi0JCQkJCQkJCX0KLQkJCQkJCQkJLy8gYnJvd3NlIHRocm91Z2ggYmFkbGlzdCBhbmQgaXRzIGRlbGl2ZXJhYmxlCi0JCQkJCQkJCS8vIHBhcnRzLgotCQkJCQkJCQlMaXN0IHRlbXBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYmFkbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQlPYmplY3QgYmFkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQkJVUlIZWxwZXIuZGVsaXZlcmFibGVQYXJ0c0NoYWluKAotCQkJCQkJCQkJCQkoRGVsaXZlcmFibGUpIGJhZCwgdGVtcGxpc3QpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmICh0ZW1wbGlzdC5jb250YWlucyhvYmopKQotCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCX0KLQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQotCQkvLyBzZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZwotCQkoKENvbnRlbnRGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJd29ya1Byb2R1Y3QpIH0pOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQkKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEFydGlmYWN0KXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFydGlmYWN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5hcnRpZmFjdF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXJ0aWZhY3RfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5hcnRpZmFjdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMubm90YXRpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5hcnRpZmFjdF9ub3RhdGlvblNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudGFpbG9yaW5nU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXJ0aWZhY3RfdGFpbG9yaW5nU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXJ0aWZhY3RfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIE91dGNvbWUpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMub3V0Y29tZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMub3V0Y29tZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMub3V0Y29tZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm91dGNvbWVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLm5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMub3V0Y29tZV9ub3RhdGlvblNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudGFpbG9yaW5nU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMub3V0Y29tZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5vdXRjb21lX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZWxpdmVyYWJsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsaXZlcmFibGVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGl2ZXJhYmxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsaXZlcmFibGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLm5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsaXZlcmFibGVfbm90YXRpb25TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnRhaWxvcmluZ1NlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGl2ZXJhYmxlX3RhaWxvcmluZ1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGl2ZXJhYmxlX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE4ZTM4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0R3VpZGFuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuR3VpZGFuY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIEd1aWRhbmNlIHBhZ2UgaW4gdGhlIFdvcmsgUHJvZHVjdCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdEd1aWRhbmNlUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ3b3JrUHJvZHVjdEd1aWRhbmNlUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV29ya1Byb2R1Y3Qgd29ya1Byb2R1Y3Q7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuR1VJREFOQ0VfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl3b3JrUHJvZHVjdCA9IChXb3JrUHJvZHVjdCkgY29udGVudEVsZW1lbnQ7Ci0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gVUlIZWxwZXIuZ2V0U2VsZWN0ZWRHdWlkYW5jZXMod29ya1Byb2R1Y3QpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBUaGUgZ3VpZGFuY2UgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQuCi0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLAotCQkJCQkJCQkJKENoZWNrbGlzdCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB3b3JrUHJvZHVjdCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgKFByYWN0aWNlKSBpdGVtLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSwKLQkJCQkJCQl3b3JrUHJvZHVjdCwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJlcG9ydCkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB3b3JrUHJvZHVjdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9SZXBvcnRzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB3b3JrUHJvZHVjdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgVGVtcGxhdGUpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGVzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcnMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJIlVuYWJsZSB0byBhZGQgZ3VpZGFuY2UgIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSJ0byAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyB3b3JrUHJvZHVjdC5nZXRUeXBlKCkuZ2V0TmFtZSgpCi0JCQkJCQkJCQkJCSsgIjoiICsgd29ya1Byb2R1Y3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gVGhlIGd1aWRhbmNlIGZvciB0aGUgY29udGVudCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB3b3JrUHJvZHVjdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIChQcmFjdGljZSkgaXRlbSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCksCi0JCQkJCQkJd29ya1Byb2R1Y3QsIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXBvcnQpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFRlbXBsYXRlKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gcmVtb3ZlIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkiZnJvbSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyB3b3JrUHJvZHVjdC5nZXRUeXBlKCkuZ2V0TmFtZSgpCi0JCQkJCQkJCQkJCSsgIjoiICsgd29ya1Byb2R1Y3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgR3VpZGFuY2VGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKHN1cGVyLmNoaWxkQWNjZXB0KG9iaikpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUZW1wbGF0ZSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJlcG9ydCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0Um9sZXNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0Um9sZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MTk1NjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFJvbGVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgUm9sZXMgcGFnZSBpbiB0aGUgV29yayBQcm9kdWN0IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogCi0gKiBUT0RPOiBSZW5hbWUgdGhpcyBjbGFzcyB0byBXb3JrUHJvZHVjdFJvbGVzRm9ybVBhZ2UKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Um9sZXNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gIndvcmtQcm9kdWN0Um9sZXNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBXb3JrUHJvZHVjdCB3b3JrUHJvZHVjdDsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RSb2xlc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ST0xFU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXdvcmtQcm9kdWN0ID0gKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudDsKLQkJYWN0aW9uTWdyID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRDYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMSh0cnVlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UyKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVzcG9uc2libGVSb2xlcygoV29ya1Byb2R1Y3QpIG9iamVjdCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJUm9sZSByb2xlID0gKFJvbGUpIGFkZEl0ZW1zLmdldCgwKTsKLQkJCWlmIChVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnlPcHBvc2l0ZShyb2xlLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksIHdvcmtQcm9kdWN0KSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHJvbGUsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksCi0JCQkJCQl3b3JrUHJvZHVjdCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotLy8JCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLnNldFJlc3BvbnNpYmxlUm9sZShnZXRBY3Rpb25NYW5hZ2VyKCksCi0vLwkJCQkJd29ya1Byb2R1Y3QsIG51bGwpOwotCQkJCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJvbGUgcm9sZSA9IChSb2xlKSBpdGVyLm5leHQoKTsKLQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCByb2xlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksIHdvcmtQcm9kdWN0LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZDIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0TW9kaWZpZWRCeSgoV29ya1Byb2R1Y3QpIG9iamVjdCkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0VGFza3NQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0VGFza3NQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NjU5ODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFRhc2tzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBUYXNrcyBwYWdlIGluIHRoZSBXb3JrIFByb2R1Y3QgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdFRhc2tzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ3b3JrUHJvZHVjdFRhc2tzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV29ya1Byb2R1Y3Qgd29ya1Byb2R1Y3Q7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0VGFza3NQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuVEFTS1NfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl3b3JrUHJvZHVjdCA9IChXb3JrUHJvZHVjdCkgY29udGVudEVsZW1lbnQ7Ci0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UyKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0TWFuZGF0b3J5SW5wdXRUb1Rhc2tzKAotCQkJCQkJKFdvcmtQcm9kdWN0KSBvYmplY3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSByZXRyaWV2ZVRhYmxlVmlld2VyQ29udGVudHModmlld2VyX3NlbGVjdGVkMik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucyh0YXNrKSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB0YXNrLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwKLQkJCQkJCQl3b3JrUHJvZHVjdCwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHRhc2ssCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCksCi0JCQkJCQl3b3JrUHJvZHVjdCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJTGlzdCBzZWxlY3RlZFRhc2tzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUxpc3QgYXZhaWxhYmxlVGFza3NMaXN0ID0gTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEF2YWlsYWJsZVRhc2tzKHdvcmtQcm9kdWN0KTsKLQkJCQlpZiAoYXZhaWxhYmxlVGFza3NMaXN0ICE9IG51bGwgJiYgYXZhaWxhYmxlVGFza3NMaXN0LnNpemUoKSA+IDApIHsKLQkJCQkJZm9yIChqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSBhdmFpbGFibGVUYXNrc0xpc3QuaXRlcmF0b3IoKTsgaXQKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQkJCWlmICh0YXNrLmdldE9wdGlvbmFsSW5wdXQoKS5jb250YWlucyh3b3JrUHJvZHVjdCkpCi0JCQkJCQkJc2VsZWN0ZWRUYXNrcy5hZGQodGFzayk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHNlbGVjdGVkVGFza3MudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gcmV0cmlldmVUYWJsZVZpZXdlckNvbnRlbnRzKHZpZXdlcl9zZWxlY3RlZCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucyh0YXNrKSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB0YXNrLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpLAotCQkJCQkJCXdvcmtQcm9kdWN0LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgdGFzaywKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpLAotCQkJCQkJd29ya1Byb2R1Y3QsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDMoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkMyA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRPdXRwdXR0aW5nVGFza3MoCi0JCQkJCQkoV29ya1Byb2R1Y3QpIG9iamVjdCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQzLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDMoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDMoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgdGFzaywKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCksIHdvcmtQcm9kdWN0LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDMoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMyhBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB0YXNrLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKSwgd29ya1Byb2R1Y3QsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5Xb3JrUHJvZHVjdF9UYXNrc19NdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLldvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLldvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLldvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFR5cGVEZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RUeXBlRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MjlmMDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFR5cGVEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgV29yayBwcm9kdWN0IFR5cGUgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdFR5cGVEZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAid29ya1Byb2R1Y3RUeXBlRGVzY3JpcHRpb25QYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBXb3JrUHJvZHVjdFR5cGUgd29ya1Byb2R1Y3RUeXBlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RUeXBlRGVzY3JpcHRpb25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl3b3JrUHJvZHVjdFR5cGUgPSAoV29ya1Byb2R1Y3RUeXBlKSBjb250ZW50RWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKTsKLQkJCX0KLQkJfTsKLQotCQkvLyBzZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZwotCQkoKENhdGVnb3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLnNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcigKLQkJCQkJCXdvcmtQcm9kdWN0VHlwZSkgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RUWVBFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrcHJvZHVjdHR5cGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya3Byb2R1Y3R0eXBlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtwcm9kdWN0dHlwZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya3Byb2R1Y3R0eXBlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMjhkYmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLldvcmtQcm9kdWN0RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTW92ZUluQ2F0ZWdvcnlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5DYXRlZ29yeVNvcnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbnRlbnRFbGVtZW50T3JkZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBXb3JrIFByb2R1Y3RzIHBhZ2UgaW4gdGhlIFdvcmsgUHJvZHVjdCBUeXBlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAid29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV29ya1Byb2R1Y3RUeXBlIHdvcmtQcm9kdWN0VHlwZTsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCQotCXByaXZhdGUgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgYWxsU3RlcHM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuV09SS19QUk9EVUNUU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXdvcmtQcm9kdWN0VHlwZSA9IChXb3JrUHJvZHVjdFR5cGUpIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldElzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQkvL3JldHVybiAoKFdvcmtQcm9kdWN0VHlwZSkgb2JqZWN0KS5nZXRXb3JrUHJvZHVjdHMoKS50b0FycmF5KCk7Ci0JCQkJaWYgKGFsbFN0ZXBzID09IG51bGwpIHsKLQkJCQkJYWxsU3RlcHMgPSBuZXcgQ29udGVudEVsZW1lbnRPcmRlckxpc3QoCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJQ29udGVudEVsZW1lbnRPcmRlckxpc3QuQ09OVEVOVF9FTEVNRU5UU19fRk9SX0VMRU1FTlRfT05MWSwKLQkJCQkJCQlnZXRDb250ZW50Q2F0ZWdvcnlPcmRlckZlYXR1cmUoKSk7Ci0JCQkJfQotCQkJCUxpc3QgcmV0dXJuTGlzdCA9IENhdGVnb3J5U29ydEhlbHBlci5zb3J0Q2F0ZWdvcnlFbGVtZW50cyhjb250ZW50RWxlbWVudCwgCi0JCQkJCQlhbGxTdGVwcy50b0FycmF5KCkpOwotCQkJCXJldHVybiByZXR1cm5MaXN0LnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgd29ya1Byb2R1Y3RUeXBlLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3RzKCksCi0JCQkJCWFkZEl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIHdvcmtQcm9kdWN0VHlwZSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0cygpLAotCQkJCQlybUl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdFR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgV29ya1Byb2R1Y3RGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCWlmIChnZXRIZWxwZXIoKS5pc0NvbnRyaWJ1dG9yKChDb250ZW50RWxlbWVudCkgb2JqKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENvbnRlbnRDYXRlZ29yeU9yZGVyRmVhdHVyZSgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TW9kZWxTdHJ1Y3R1cmVQYXRoKCkgewotCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgZ2V0Q29udGVudEVsZW1lbnRPcmRlckxpc3QoKSB7Ci0JCXJldHVybiBhbGxTdGVwczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNzM3MTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBmb3JtIHBhZ2VzIGZvciB0aGUgbWV0aG9kIGFuZCBwcm9jZXNzIGVkaXRvcnMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9JUHJvYmxlbUNoYW5nZWRMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9JUHJvYmxlbUNoYW5nZWRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGM4ZTkzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci0KLS8qKgotICogCi0gKiBDb2RlIHRha2VuIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnZpZXdzdXBwb3J0LklQcm9ibGVtQ2hhbmdlZExpc3RlbmVyCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9ibGVtQ2hhbmdlZExpc3RlbmVyIHsKLQkKLQkvKioKLQkgKiBDYWxsZWQgd2hlbiBwcm9ibGVtcyBjaGFuZ2VkLiBUaGlzIGNhbGwgaXMgcG9zdGVkIGluIGFuIGF5bmNoIGV4ZWMsIHRoZXJlZm9yZSBwYXNzZWQKLQkgKiByZXNvdXJjZXMgbXVzdCBub3QgZXhpc3QuCi0JICogQHBhcmFtIGNoYW5nZWRSZXNvdXJjZXMgIEEgc2V0IHdpdGggZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+IHRoYXQKLQkgKiBkZXNjcmliZSB0aGUgcmVzb3VyY2VzIHRoYXQgaGFkIGFuIHByb2JsZW0gY2hhbmdlLgotCSAqIEBwYXJhbSBpc01hcmtlckNoYW5nZSBJZiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBjaGFuZ2Ugd2FzIGEgbWFya2VyIGNoYW5nZSwgaWYKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSBjaGFuZ2UgY2FtZSBmcm9tIGFuIGFubm90YXRpb24gbW9kZWwgbW9kaWZpY2F0aW9uLgotCSAqLwotCXZvaWQgcHJvYmxlbXNDaGFuZ2VkKElSZXNvdXJjZVtdIGNoYW5nZWRSZXNvdXJjZXMsIGJvb2xlYW4gaXNNYXJrZXJDaGFuZ2UpOwotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9JbWFnZURlc2NyaXB0b3JSZWdpc3RyeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9JbWFnZURlc2NyaXB0b3JSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjM4NTI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiAKLSAqIENvZGUgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudmlld3N1cHBvcnQuSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSB7Ci0KLQlwcml2YXRlIEhhc2hNYXA8SW1hZ2VEZXNjcmlwdG9yLCBJbWFnZT4gZlJlZ2lzdHJ5PSBuZXcgSGFzaE1hcDxJbWFnZURlc2NyaXB0b3IsIEltYWdlPigxMCk7Ci0JcHJpdmF0ZSBEaXNwbGF5IGZEaXNwbGF5OwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhlIGN1cnJlbnQgb3IgZGVmYXVsdCBkaXNwbGF5LAotCSAqIHJlc3BlY3RpdmVseS4KLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKSB7Ci0JCXRoaXMoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0U3RhbmRhcmREaXNwbGF5KCkpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoZSBnaXZlbiBkaXNwbGF5LiBBbGwgaW1hZ2VzCi0JICogbWFuYWdlZCBieSB0aGlzIHJlZ2lzdHJ5IHdpbGwgYmUgZGlzcG9zZWQgd2hlbiB0aGUgZGlzcGxheSBnZXRzIGRpc3Bvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBkaXNwbGF5IHRoZSBkaXNwbGF5IHRoZSBpbWFnZXMgbWFuYWdlZCBieSB0aGlzIHJlZ2lzdHJ5IGFyZSBhbGxvY2F0ZWQgZm9yIAotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeShEaXNwbGF5IGRpc3BsYXkpIHsKLQkJZkRpc3BsYXk9IGRpc3BsYXk7Ci0JCUFzc2VydC5pc05vdE51bGwoZkRpc3BsYXkpOwotCQlob29rRGlzcGxheSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGltYWdlIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0b3IgdGhlIGltYWdlIGRlc2NyaXB0b3IgZm9yIHdoaWNoIHRoZSByZWdpc3RyeSBtYW5hZ2VzIGFuIGltYWdlCi0JICogQHJldHVybiB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbWFnZSBkZXNjcmlwdG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogIGlmIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGNhbid0IGNyZWF0ZSB0aGUgcmVxdWVzdGVkIGltYWdlLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXQoSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkKLQkJCWRlc2NyaXB0b3I9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQkKLQkJSW1hZ2UgcmVzdWx0PSAoSW1hZ2UpZlJlZ2lzdHJ5LmdldChkZXNjcmlwdG9yKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkKLQkJQXNzZXJ0LmlzVHJ1ZShmRGlzcGxheSA9PSBBdXRob3JpbmdVSVBsdWdpbi5nZXRTdGFuZGFyZERpc3BsYXkoKSwgIkFsbG9jYXRpbmcgaW1hZ2UgZm9yIHdyb25nIGRpc3BsYXkuIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0PSBkZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCWZSZWdpc3RyeS5wdXQoZGVzY3JpcHRvciwgcmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBhbGwgaW1hZ2VzIG1hbmFnZWQgYnkgdGhpcyByZWdpc3RyeS4KLQkgKi8JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyPSBmUmVnaXN0cnkudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJSW1hZ2UgaW1hZ2U9IChJbWFnZSlpdGVyLm5leHQoKTsKLQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJfQotCQlmUmVnaXN0cnkuY2xlYXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhvb2tEaXNwbGF5KCkgewotCQlmRGlzcGxheS5kaXNwb3NlRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZGlzcG9zZSgpOwotCQkJfQkKLQkJfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvSW1hZ2VJbWFnZURlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvSW1hZ2VJbWFnZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc4NjRkYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL0ltYWdlSW1hZ2VEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotCi0vKioKLSAqIENvZGUgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudmlld3N1cHBvcnQuSW1hZ2VJbWFnZURlc2NyaXB0b3IKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBJbWFnZUltYWdlRGVzY3JpcHRvciBleHRlbmRzIEltYWdlRGVzY3JpcHRvciB7Ci0KLQlwcml2YXRlIEltYWdlIGZJbWFnZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBJbWFnSW1hZ2VEZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBJbWFnZUltYWdlRGVzY3JpcHRvcihJbWFnZSBpbWFnZSkgewotCQlzdXBlcigpOwotCQlmSW1hZ2U9IGltYWdlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIEltYWdlRGVzY3JpcHRvciNnZXRJbWFnZURhdGEoKQotCSAqLwotCXB1YmxpYyBJbWFnZURhdGEgZ2V0SW1hZ2VEYXRhKCkgewotCQlyZXR1cm4gZkltYWdlLmdldEltYWdlRGF0YSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiAob2JqICE9IG51bGwpICYmIGdldENsYXNzKCkuZXF1YWxzKG9iai5nZXRDbGFzcygpKSAmJiBmSW1hZ2UuZXF1YWxzKCgoSW1hZ2VJbWFnZURlc2NyaXB0b3Ipb2JqKS5mSW1hZ2UpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIE9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGZJbWFnZS5oYXNoQ29kZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9NZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9NZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGU3ODFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLk1ldGhvZEVsZW1lbnRVSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuUHJvYmxlbXNMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotCi0vKioKLSAqIENvZGUgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuamF2YWVkaXRvci5KYXZhRWRpdG9yRXJyb3JUaWNrVXBkYXRlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyIGltcGxlbWVudHMgSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50RWRpdG9yIGZNZXRob2RFbGVtZW50RWRpdG9yOwotCXByaXZhdGUgTWV0aG9kRWxlbWVudFVJTGFiZWxQcm92aWRlciBmTGFiZWxQcm92aWRlcjsKLQotCXB1YmxpYyBNZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlcihNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvcikgewotCQlBc3NlcnQuaXNOb3ROdWxsKGVkaXRvcik7Ci0JCWZNZXRob2RFbGVtZW50RWRpdG9yPSBlZGl0b3I7Ci0JCWZMYWJlbFByb3ZpZGVyPSBuZXcgTWV0aG9kRWxlbWVudFVJTGFiZWxQcm92aWRlcigpOwotCQlmTGFiZWxQcm92aWRlci5hZGRMYWJlbERlY29yYXRvcihuZXcgUHJvYmxlbXNMYWJlbERlY29yYXRvcihudWxsKSk7Ci0JCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcm9ibGVtTWFya2VyTWFuYWdlcigpLmFkZExpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElQcm9ibGVtQ2hhbmdlZExpc3RlbmVyI3Byb2JsZW1zQ2hhbmdlZChJUmVzb3VyY2VbXSwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9ibGVtc0NoYW5nZWQoSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcywgYm9vbGVhbiBpc01hcmtlckNoYW5nZSkgewotCQlpZiAoIWlzTWFya2VyQ2hhbmdlKQotCQkJcmV0dXJuOwotCi0JCUlFZGl0b3JJbnB1dCBpbnB1dD0gZk1ldGhvZEVsZW1lbnRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSB7IC8vIG1pZ2h0IHJ1biBhc3luYywgdGVzdHMgbmVlZGVkCi0JCQlNZXRob2RFbGVtZW50IG1lbGVtZW50ID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpaW5wdXQpLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCWlmIChtZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQltZWxlbWVudCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgbWVsZW1lbnQpLmdldFByb2Nlc3MoKTsKLQkJCX0KLQkJCWlmIChtZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0V29ya3NwYWNlUmVzb3VyY2UobWVsZW1lbnQpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlZFJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoY2hhbmdlZFJlc291cmNlc1tpXS5lcXVhbHMocmVzb3VyY2UpKSB7Ci0JCQkJCQl1cGRhdGVFZGl0b3JJbWFnZShtZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVFZGl0b3JJbWFnZShNZXRob2RFbGVtZW50IG1lbGVtZW50KSB7Ci0JCUltYWdlIHRpdGxlSW1hZ2U9IGZNZXRob2RFbGVtZW50RWRpdG9yLmdldFRpdGxlSW1hZ2UoKTsKLQkJaWYgKHRpdGxlSW1hZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUltYWdlIG5ld0ltYWdlOwotCQluZXdJbWFnZT0gZkxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UobWVsZW1lbnQpOwotCQlpZiAodGl0bGVJbWFnZSAhPSBuZXdJbWFnZSkgewotCQkJcG9zdEltYWdlQ2hhbmdlKG5ld0ltYWdlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3N0SW1hZ2VDaGFuZ2UoZmluYWwgSW1hZ2UgbmV3SW1hZ2UpIHsKLQkJU2hlbGwgc2hlbGw9IGZNZXRob2RFbGVtZW50RWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpOwotCQlpZiAoc2hlbGwgIT0gbnVsbCAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlzaGVsbC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZk1ldGhvZEVsZW1lbnRFZGl0b3IudXBkYXRlZFRpdGxlSW1hZ2UobmV3SW1hZ2UpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZkxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvYmxlbU1hcmtlck1hbmFnZXIoKS5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQotfQotCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvTWV0aG9kRWxlbWVudEltYWdlRGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9NZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ODIyMmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9NZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db21wb3NpdGVJbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotLyoqCi0gKiBDb2RlIHRha2VuIGZyb20gb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudEltYWdlRGVzY3JpcHRvciBleHRlbmRzIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciB7Ci0JCi0JLyoqIEZsYWcgdG8gcmVuZGVyIHRoZSBlcnJvciBhZG9ybm1lbnQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRVJST1I9CQkJMHgwNDA7Ci0KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBmQmFzZUltYWdlOwotCXByaXZhdGUgaW50IGZGbGFnczsKLQlwcml2YXRlIFBvaW50IGZTaXplOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBNZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlSW1hZ2UgYW4gaW1hZ2UgZGVzY3JpcHRvciB1c2VkIGFzIHRoZSBiYXNlIGltYWdlCi0JICogQHBhcmFtIGZsYWdzIGZsYWdzIGluZGljYXRpbmcgd2hpY2ggYWRvcm5tZW50cyBhcmUgdG8gYmUgcmVuZGVyZWQuIFNlZSA8Y29kZT5zZXRBZG9ybm1lbnRzPC9jb2RlPgotCSAqIAlmb3IgdmFsaWQgdmFsdWVzLgotCSAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcgaW1hZ2UKLQkgKiBAc2VlICNzZXRBZG9ybm1lbnRzKGludCkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IgYmFzZUltYWdlLCBpbnQgZmxhZ3MsIFBvaW50IHNpemUpIHsKLQkJZkJhc2VJbWFnZT0gYmFzZUltYWdlOwotCQlBc3NlcnQuaXNOb3ROdWxsKGZCYXNlSW1hZ2UpOwotCQlmRmxhZ3M9IGZsYWdzOwotCQlBc3NlcnQuaXNUcnVlKGZGbGFncyA+PSAwKTsKLQkJZlNpemU9IHNpemU7Ci0JCUFzc2VydC5pc05vdE51bGwoZlNpemUpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBkZXNjcmlwdG9ycyBhZG9ybm1lbnRzLiBWYWxpZCB2YWx1ZXMgYXJlOiA8Y29kZT5BQlNUUkFDVDwvY29kZT4sIDxjb2RlPkZJTkFMPC9jb2RlPiwKLQkgKiA8Y29kZT5TWU5DSFJPTklaRUQ8L2NvZGU+LCA8L2NvZGU+U1RBVElDPGNvZGU+LCA8L2NvZGU+UlVOTkFCTEU8Y29kZT4sIDwvY29kZT5XQVJOSU5HPGNvZGU+LCAKLQkgKiA8L2NvZGU+RVJST1I8Y29kZT4sIDwvY29kZT5PVkVSUklEREVTPGNvZGU+LCA8Y29kZT5JTVBMRU1FTlRTPC9jb2RlPiwgPGNvZGU+Q09OU1RSVUNUT1I8L2NvZGU+LAotCSAqIDxjb2RlPkRFUFJFQ0FURUQ8L2NvZGU+LCAgb3IgYW55IGNvbWJpbmF0aW9uIG9mIHRob3NlLgotCSAqIAotCSAqIEBwYXJhbSBhZG9ybm1lbnRzIHRoZSBpbWFnZSBkZXNjcmlwdG9ycyBhZG9ybm1lbnRzCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWRvcm5tZW50cyhpbnQgYWRvcm5tZW50cykgewotCQlBc3NlcnQuaXNUcnVlKGFkb3JubWVudHMgPj0gMCk7Ci0JCWZGbGFncz0gYWRvcm5tZW50czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFkb3JubWVudHMuCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCBhZG9ybm1lbnRzCi0JICovCi0JcHVibGljIGludCBnZXRBZHJvbm1lbnRzKCkgewotCQlyZXR1cm4gZkZsYWdzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNpemUgb2YgdGhlIGltYWdlIGNyZWF0ZWQgYnkgY2FsbGluZyA8Y29kZT5jcmVhdGVJbWFnZSgpPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2UgcmV0dXJuZWQgZnJvbSBjYWxsaW5nIDxjb2RlPmNyZWF0ZUltYWdlKCk8L2NvZGU+Ci0JICogQHNlZSBJbWFnZURlc2NyaXB0b3IjY3JlYXRlSW1hZ2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlU2l6ZShQb2ludCBzaXplKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoc2l6ZSk7Ci0JCUFzc2VydC5pc1RydWUoc2l6ZS54ID49IDAgJiYgc2l6ZS55ID49IDApOwotCQlmU2l6ZT0gc2l6ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2UgY3JlYXRlZCBieSBjYWxsaW5nIDxjb2RlPmNyZWF0ZUltYWdlKCk8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGltYWdlIGNyZWF0ZWQgYnkgY2FsbGluZyA8Y29kZT5jcmVhdGVJbWFnZSgpPC9jb2RlPgotCSAqIEBzZWUgSW1hZ2VEZXNjcmlwdG9yI2NyZWF0ZUltYWdlKCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0SW1hZ2VTaXplKCkgewotCQlyZXR1cm4gbmV3IFBvaW50KGZTaXplLngsIGZTaXplLnkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIGluIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvcgotCSAqLwotCXByb3RlY3RlZCBQb2ludCBnZXRTaXplKCkgewotCQlyZXR1cm4gZlNpemU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgb24gT2JqZWN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCB8fCAhTWV0aG9kRWxlbWVudEltYWdlRGVzY3JpcHRvci5jbGFzcy5lcXVhbHMob2JqZWN0LmdldENsYXNzKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCU1ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3Igb3RoZXI9IChNZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yKW9iamVjdDsKLQkJcmV0dXJuIChmQmFzZUltYWdlLmVxdWFscyhvdGhlci5mQmFzZUltYWdlKSAmJiBmRmxhZ3MgPT0gb3RoZXIuZkZsYWdzICYmIGZTaXplLmVxdWFscyhvdGhlci5mU2l6ZSkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIE9iamVjdC4KLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZkJhc2VJbWFnZS5oYXNoQ29kZSgpIHwgZkZsYWdzIHwgZlNpemUuaGFzaENvZGUoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBpbiBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3Q29tcG9zaXRlSW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCUltYWdlRGF0YSBiZz0gZ2V0SW1hZ2VEYXRhKGZCYXNlSW1hZ2UpOwotCQkJCi0JCQotCQlkcmF3SW1hZ2UoYmcsIDAsIDApOwotCQkJCQotCQlkcmF3VG9wUmlnaHQoKTsKLQkJZHJhd0JvdHRvbVJpZ2h0KCk7Ci0JCWRyYXdCb3R0b21MZWZ0KCk7Ci0JCQotCi0JfQotCQotCXByaXZhdGUgSW1hZ2VEYXRhIGdldEltYWdlRGF0YShJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlJbWFnZURhdGEgZGF0YT0gZGVzY3JpcHRvci5nZXRJbWFnZURhdGEoKTsgLy8gc2VlIGJ1ZyA1MTk2NTogZ2V0SW1hZ2VEYXRhIGNhbiByZXR1cm4gbnVsbAotCQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCQlkYXRhPSBERUZBVUxUX0lNQUdFX0RBVEE7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIkltYWdlIGRhdGEgbm90IGF2YWlsYWJsZTogIiArIGRlc2NyaXB0b3IudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZGF0YTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGRyYXdUb3BSaWdodCgpIHsJCQotCX0JCQotCQotCXByaXZhdGUgdm9pZCBkcmF3Qm90dG9tUmlnaHQoKSB7Ci0JfQkJCi0JCi0JcHJpdmF0ZSB2b2lkIGRyYXdCb3R0b21MZWZ0KCkgewotCQlQb2ludCBzaXplPSBnZXRTaXplKCk7Ci0JCWludCB4PSAwOwotCQlpZiAoKGZGbGFncyAmIEVSUk9SKSAhPSAwKSB7Ci0JCQlJbWFnZURhdGEgZGF0YT0gZ2V0SW1hZ2VEYXRhKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19ERVNDX09WUl9FUlJPUik7Ci0JCQlkcmF3SW1hZ2UoZGF0YSwgeCwgc2l6ZS55IC0gZGF0YS5oZWlnaHQpOwotCQkJeCs9IGRhdGEud2lkdGg7Ci0JCX0KLQl9CQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvUHJvYmxlbU1hcmtlck1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvUHJvYmxlbU1hcmtlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YyMjMwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL1Byb2JsZW1NYXJrZXJNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBMaXN0ZW5zIHRvIHJlc291cmNlIGRlbHRhcyBhbmQgZmlsdGVycyBmb3IgbWFya2VyIGNoYW5nZXMgb2YgdHlwZSBJTWFya2VyLlBST0JMRU0KLSAqIFZpZXdlcnMgc2hvd2luZyBlcnJvciB0aWNrcyBzaG91bGQgcmVnaXN0ZXIgYXMgbGlzdGVuZXIgdG8KLSAqIHRoaXMgdHlwZS4KLSAqIAotICogQ29kZSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS52aWV3c3VwcG9ydC5Qcm9ibGVtTWFya2VyTWFuYWdlcgotICovCi1wdWJsaWMgY2xhc3MgUHJvYmxlbU1hcmtlck1hbmFnZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBWaXNpdG9ycyB1c2VkIHRvIGxvb2sgaWYgdGhlIGVsZW1lbnQgY2hhbmdlIGRlbHRhIGNvbnRhaW5zIGEgbWFya2VyIGNoYW5nZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm9qZWN0RXJyb3JWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQotCQlwcml2YXRlIEhhc2hTZXQ8SVJlc291cmNlPiBmQ2hhbmdlZEVsZW1lbnRzOyAKLQkJCi0JCXB1YmxpYyBQcm9qZWN0RXJyb3JWaXNpdG9yKEhhc2hTZXQ8SVJlc291cmNlPiBjaGFuZ2VkRWxlbWVudHMpIHsKLQkJCWZDaGFuZ2VkRWxlbWVudHM9IGNoYW5nZWRFbGVtZW50czsKLQkJfQotCQkJCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJUmVzb3VyY2UgcmVzPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJaWYgKHJlcyBpbnN0YW5jZW9mIElQcm9qZWN0ICYmIGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdD0gKElQcm9qZWN0KSByZXM7Ci0JCQkJaWYgKCFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCS8vIG9ubHkgdHJhY2sgb3BlbiBKYXZhIHByb2plY3RzCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQljaGVja0ludmFsaWRhdGUoZGVsdGEsIHJlcyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGNoZWNrSW52YWxpZGF0ZShJUmVzb3VyY2VEZWx0YSBkZWx0YSwgSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCQlpbnQga2luZD0gZGVsdGEuZ2V0S2luZCgpOwotCQkJaWYgKGtpbmQgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCB8fCBraW5kID09IElSZXNvdXJjZURlbHRhLkFEREVEIHx8IChraW5kID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgJiYgaXNFcnJvckRlbHRhKGRlbHRhKSkpIHsKLQkJCQkvLyBpbnZhbGlkYXRlIHRoZSByZXNvdXJjZSBhbmQgYWxsIHBhcmVudHMKLQkJCQl3aGlsZSAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5ST09UICYmIGZDaGFuZ2VkRWxlbWVudHMuYWRkKHJlc291cmNlKSkgewotCQkJCQlyZXNvdXJjZT0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCQkJfQotCQkJfSAKLQkJfQkKLQkJCi0JCXByaXZhdGUgYm9vbGVhbiBpc0Vycm9yRGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsJCi0JCQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSAhPSAwKSB7Ci0JCQkJSU1hcmtlckRlbHRhW10gbWFya2VyRGVsdGFzPSBkZWx0YS5nZXRNYXJrZXJEZWx0YXMoKTsKLQkJCQlmb3IgKGludCBpPSAwOyBpIDwgbWFya2VyRGVsdGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChtYXJrZXJEZWx0YXNbaV0uaXNTdWJ0eXBlT2YoSU1hcmtlci5QUk9CTEVNKSkgewotCQkJCQkJaW50IGtpbmQ9IG1hcmtlckRlbHRhc1tpXS5nZXRLaW5kKCk7Ci0JCQkJCQlpZiAoa2luZCA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCB8fCBraW5kID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQlpbnQgc2V2ZXJpdHk9IG1hcmtlckRlbHRhc1tpXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgLTEpOwotCQkJCQkJaW50IG5ld1NldmVyaXR5PSBtYXJrZXJEZWx0YXNbaV0uZ2V0TWFya2VyKCkuZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIC0xKTsKLQkJCQkJCWlmIChuZXdTZXZlcml0eSAhPSBzZXZlcml0eSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsgCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3RlbmVyTGlzdCBmTGlzdGVuZXJzOwotCQotCQotCXB1YmxpYyBQcm9ibGVtTWFya2VyTWFuYWdlcigpIHsKLQkJZkxpc3RlbmVycz0gbmV3IExpc3RlbmVyTGlzdCgpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQKLQkgKi8JCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCUhhc2hTZXQ8SVJlc291cmNlPiBjaGFuZ2VkRWxlbWVudHM9IG5ldyBIYXNoU2V0PElSZXNvdXJjZT4oKTsKLQkJCi0JCXRyeSB7Ci0JCQlJUmVzb3VyY2VEZWx0YSBkZWx0YT0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCWlmIChkZWx0YSAhPSBudWxsKQotCQkJCWRlbHRhLmFjY2VwdChuZXcgUHJvamVjdEVycm9yVmlzaXRvcihjaGFuZ2VkRWxlbWVudHMpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQotCQlpZiAoIWNoYW5nZWRFbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCUlSZXNvdXJjZVtdIGNoYW5nZXM9IChJUmVzb3VyY2VbXSkgY2hhbmdlZEVsZW1lbnRzLnRvQXJyYXkobmV3IElSZXNvdXJjZVtjaGFuZ2VkRWxlbWVudHMuc2l6ZSgpXSk7Ci0JCQlmaXJlQ2hhbmdlcyhjaGFuZ2VzLCB0cnVlKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJQW5ub3RhdGlvbk1vZGVsTGlzdGVuZXIjbW9kZWxDaGFuZ2VkKElBbm5vdGF0aW9uTW9kZWwpCi0JICovCi0JcHVibGljIHZvaWQgbW9kZWxDaGFuZ2VkKElBbm5vdGF0aW9uTW9kZWwgbW9kZWwpIHsKLQkJLy8gbm8gYWN0aW9uCi0JfQkKLQkKLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgZm9yIHByb2JsZW0gbWFya2VyIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGZMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7IAotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJZkxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSA8Y29kZT5JUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcjwvY29kZT4uCi0JICovCQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElQcm9ibGVtQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJaWYgKGZMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZmlyZUNoYW5nZXMoZmluYWwgSVJlc291cmNlW10gY2hhbmdlcywgZmluYWwgYm9vbGVhbiBpc01hcmtlckNoYW5nZSkgewotCQlEaXNwbGF5IGRpc3BsYXk9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlpZiAoZGlzcGxheSAhPSBudWxsICYmICFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsJCQotCQkJCQlPYmplY3RbXSBsaXN0ZW5lcnM9IGZMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCQkJCWZvciAoaW50IGk9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlQcm9ibGVtQ2hhbmdlZExpc3RlbmVyIGN1cnI9IChJUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcikgbGlzdGVuZXJzW2ldOwotCQkJCQkJY3Vyci5wcm9ibGVtc0NoYW5nZWQoY2hhbmdlcywgaXNNYXJrZXJDaGFuZ2UpOwotCQkJCQl9CQotCQkJCX0KLQkJCX0pOwotCQl9CQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC93aXphcmRzL05ld0xpYnJhcnlNYWluUGFnZTIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdMaWJyYXJ5TWFpblBhZ2UyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYTUxYmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC93aXphcmRzL05ld0xpYnJhcnlNYWluUGFnZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5TWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5OZXdMaWJyYXJ5V2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLk5ld0xpYnJhcnlXaXphcmRQYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIGVudGVyIHRoZSBuYW1lLCBicmllZiBkZXNjcmlwdGlvbiBhbmQKLSAqIHR5cGUgZm9yIGEgbmV3IG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdMaWJyYXJ5TWFpblBhZ2UyIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIHBhZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBOZXdMaWJyYXJ5TWFpblBhZ2UyLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfSUQgPSAidHlwZUlkIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgVGV4dCBuYW1lVGV4dDsKLQotCXByaXZhdGUgVGV4dCBicmllZkRlc2NUZXh0OwotCi0JcHJpdmF0ZSBCdXR0b25bXSByYWRpb0J1dHRvbnM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdMaWJyYXJ5TWFpblBhZ2UyKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5V2l6YXJkTWFpblBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5V2l6YXJkTWFpblBhZ2VfZGVzY3JpcHRpb24pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vTmV3LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQotCQlMYWJlbCBuYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9STUFMKTsKLQkJbmFtZUxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0Lk5BTUVfVEVYVCk7Ci0KLQkJbmFtZVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQluYW1lVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJKChHcmlkRGF0YSkgbmFtZVRleHQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJTGFiZWwgYnJpZWZEZXNjTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9STUFMKTsKLQkJYnJpZWZEZXNjTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fVEVYVCk7Ci0KLQkJYnJpZWZEZXNjVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5XUkFQCi0JCQkJfCBTV1QuVl9TQ1JPTEwpOwotCQlicmllZkRlc2NUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkoKEdyaWREYXRhKSBicmllZkRlc2NUZXh0LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkoKEdyaWREYXRhKSBicmllZkRlc2NUZXh0LmdldExheW91dERhdGEoKSkuaGVpZ2h0SGludCA9IDcwOwotCQkoKEdyaWREYXRhKSBicmllZkRlc2NUZXh0LmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gNDgwOwotCi0JCUxhYmVsIGxpYnJhcnlUeXBlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9STUFMKTsKLQkJbGlicmFyeVR5cGVMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmxpYnJhcnlUeXBlTGFiZWxfdGV4dCk7Ci0KLQkJQ29tcG9zaXRlIHR5cGVDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PUk1BTCk7Ci0JCXR5cGVDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCXR5cGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTWFwIHR5cGVzID0gTGlicmFyeU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0TGlicmFyeVR5cGVzKCk7Ci0JCXJhZGlvQnV0dG9ucyA9IG5ldyBCdXR0b25bdHlwZXMuc2l6ZSgpXTsKLQkJaW50IHJhZGlvQnV0dG9uSW5kZXggPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdHlwZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHR5cGVJZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyB0eXBlTmFtZSA9IChTdHJpbmcpIHR5cGVzLmdldCh0eXBlSWQpOwotCQkJQnV0dG9uIHJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbih0eXBlQ29tcG9zaXRlLCBTV1QuUkFESU8pOwotCQkJcmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlyYWRpb0J1dHRvbi5zZXRUZXh0KHR5cGVOYW1lKTsKLQkJCXJhZGlvQnV0dG9uLnNldERhdGEoVFlQRV9JRCwgdHlwZUlkKTsKLQkJCXJhZGlvQnV0dG9uc1tyYWRpb0J1dHRvbkluZGV4KytdID0gcmFkaW9CdXR0b247Ci0JCX0KLQotCQlpZiAocmFkaW9CdXR0b25zLmxlbmd0aCA+IDApIHsKLQkJCXJhZGlvQnV0dG9uc1swXS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJTmV3TGlicmFyeVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IE5ld0xpYnJhcnlXaXphcmRQYWdlRmFjdG9yeQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldFdpemFyZFBhZ2UoZ2V0TGlicmFyeVR5cGUoKSk7Ci0JCWlmICh3aXphcmRQYWdlICE9IG51bGwpIHsKLQkJCXdpemFyZFBhZ2Uub25FbnRlclBhZ2UoZ2V0TGlicmFyeU5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHdpemFyZFBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCXJldHVybiBnZXRMaWJyYXJ5TmFtZSgpLmxlbmd0aCgpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGxpc3RlbmVycyB0byB0aGUgd2l6YXJkIGNvbnRyb2xzLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCW5hbWVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpYnJhcnkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlOYW1lKCkgewotCQlyZXR1cm4gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaWJyYXJ5IHR5cGUgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5VHlwZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByYWRpb0J1dHRvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUJ1dHRvbiByYWRpb0J1dHRvbiA9IHJhZGlvQnV0dG9uc1tpXTsKLQkJCWlmIChyYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCXJldHVybiAoU3RyaW5nKSByYWRpb0J1dHRvbi5nZXREYXRhKFRZUEVfSUQpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoU3RyaW5nKSByYWRpb0J1dHRvbnNbMF0uZ2V0RGF0YShUWVBFX0lEKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkMi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC93aXphcmRzL05ld0xpYnJhcnlXaXphcmQyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjN2QyMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC93aXphcmRzL05ld0xpYnJhcnlXaXphcmQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld0xpYnJhcnlNYWluUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuU2F2ZUFsbEVkaXRvcnNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5QZXJzcGVjdGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLk5ld0xpYnJhcnlXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogQSB3aXphcmQgdGhhdCBndWlkZXMgdGhlIHVzZXIgdG8gY3JlYXRlIGEgbmV3IG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdMaWJyYXJ5V2l6YXJkMiBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfSUQgPSBOZXdMaWJyYXJ5V2l6YXJkMi5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvLyBUaGUgbWFpbiB3aXphcmQgcGFnZS4KLQlwcml2YXRlIE5ld0xpYnJhcnlNYWluUGFnZSBtYWluUGFnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0xpYnJhcnlXaXphcmQyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2V0V2luZG93VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeVdpemFyZF90aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJU2F2ZUFsbEVkaXRvcnNQYWdlLmFkZFBhZ2VJZk5lZWRlZCh0aGlzLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKTsKLQkJbWFpblBhZ2UgPSBuZXcgTmV3TGlicmFyeU1haW5QYWdlKCk7Ci0JCWFkZFBhZ2UobWFpblBhZ2UpOwotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRMaWJyYXJ5VHlwZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgcGVyc2lzdGVuY2VJZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBwYWdlSWQgPSBwZXJzaXN0ZW5jZUlkICsgIlBhZ2UiOyAvLyROT04tTkxTLTEkCi0JCQlOZXdMaWJyYXJ5V2l6YXJkUGFnZSBwYWdlID0gTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5Ci0JCQkJCS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVdpemFyZFBhZ2UocGFnZUlkLCBwZXJzaXN0ZW5jZUlkKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlwYWdlLnNldEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvd2l6YmFuL05ldy5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQkJCQotCQkJCWFkZFBhZ2UocGFnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLQkJc3VwZXIuY3JlYXRlUGFnZUNvbnRyb2xzKHBhZ2VDb250YWluZXIpOwotCQlwYWdlQ29udGFpbmVyLmdldFNoZWxsKCkuc2V0SW1hZ2UoCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCQkJImZ1bGwvb2JqMTYvTWV0aG9kTGlicmFyeS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCUlXaXphcmRQYWdlW10gcGFnZXMgPSBnZXRQYWdlcygpOwotCQlmb3IgKGludCBpID0gMTsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIXBhZ2VzW2ldLmlzUGFnZUNvbXBsZXRlKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCkgIT0gbWFpblBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCVN0cmluZyBuYW1lID0gbWFpblBhZ2UuZ2V0TGlicmFyeU5hbWUoKTsKLQkJU3RyaW5nIHR5cGUgPSBtYWluUGFnZS5nZXRMaWJyYXJ5VHlwZSgpOwotCQlOZXdMaWJyYXJ5V2l6YXJkUGFnZSBwYWdlID0gTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5LmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0V2l6YXJkUGFnZSh0eXBlKTsKLQkJdHJ5IHsKLQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmNyZWF0ZU1ldGhvZExpYnJhcnkobmFtZSwgdHlwZSwgcGFnZS5nZXRTZWxlY3Rpb25zKCkpOwotCQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJCWFkZFJlY2VudGx5T3BlbmVkTGlicmFyeShsaWJyYXJ5KTsKLQkJCQlQZXJzcGVjdGl2ZVV0aWwKLQkJCQkJCS5vcGVuUGVyc3BlY3RpdmUoQXV0aG9yaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIHJlYXNvbiA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJaWYgKHJlYXNvbiA9PSBudWxsKSB7Ci0JCQkJcmVhc29uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeUludGVybmxFcnJvcl9yZWFzb247Ci0JCQl9Ci0JCQlyZWFzb24gKz0gIlxuXG4iICsgQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeUVycm9yX2FkdmljZTsgIC8vJE5PTi1OTFMtMSQKLQkJCWlmIChlLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeUVycm9yX21zZywgcmVhc29uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeUVycm9yX21zZywgcmVhc29uLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbmV3bHkgb3BlbmVkIG9yIGNyZWF0ZWQgbWV0aG9kIGxpYnJhcnkgdG8gdGhlIHJlY2VudGx5IG9wZW5lZAotCSAqIG1ldGhvZCBsaWJyYXJpZXMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlY2VudGx5T3BlbmVkTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJU3RyaW5nIGxpYnJhcnlVUkkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldExpYnJhcnlNYW5hZ2VyKAotCQkJCQlsaWJyYXJ5KS5nZXRNZXRob2RMaWJyYXJ5VVJJKCkudG9TdHJpbmcoKTsKLQkJCUxpYnJhcnlVSVByZWZlcmVuY2VzLmFkZE9wZW5MaWJyYXJ5VVJJKGxpYnJhcnlVUkkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWViYjAwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgVUkgc2VydmljZXMgZm9yIHRoZSBBdXRob3JpbmcgYW5kIEJyb3dzaW5nIHBlcnNwZWN0aXZlcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0FwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgwNWVlZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0FwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLlByZWZlcmVuY2VDb25zdGFudHM7Ci0KLS8qKgotICogCi0gKiBQcmVmZXJlbmNlIGNvbnN0YW50cyBmb3IgYXBwbGljYXRpb24KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMgaW1wbGVtZW50cyBQcmVmZXJlbmNlQ29uc3RhbnRzIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0VOQUJMRV9QUk9DRVNTX0NPTlRSSUJVVElPTiA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLlBSRUZfRU5BQkxFX1BST0NFU1NfQ09OVFJJQlVUSU9OOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9JTkhFUklUX1NVUFBSRVNTSU9OX1NUQVRFID0gTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9JTkhFUklUX1NVUFBSRVNTSU9OX1NUQVRFOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfTElCX1ZJRVdfTEFZT1VUID0gImxheW91dCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0xJQl9WSUVXX0RORF9ERUZBVUxUX0xJTktUWVBFID0gImxpYlZpZXdETkREZWZhdWx0TGlua1R5cGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTYXZlcyB0aGUgVVJJIG9mIHRoZSBtZXRob2QgbGlicmFyeSB0aGF0IHdhcyBvcGVuZWQgaW4gdGhlIGxhc3Qgc2Vzc2lvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0TGF5b3V0KFN0cmluZyB2YWx1ZSkgewotCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoCi0JCQkJUFJFRl9MSUJfVklFV19MQVlPVVQsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0eXBlIG9mIHRoZSBtZXRob2QgbGlicmFyeSB0aGF0IHdhcyBvcGVuZWQgaW4gdGhlIGxhc3Qgc2Vzc2lvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMYXlvdXQoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCVBSRUZfTElCX1ZJRVdfTEFZT1VUKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9BdXRob3JpbmdQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQXV0aG9yaW5nUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMGFkMTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9BdXRob3JpbmdQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLQotLyoqCi0gKiBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZm9yIEF1dGhvcmluZ1BsdWdpbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEF1dGhvcmluZ1ByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzCi0JCUFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJLy8gV2UgZG9uJ3QgbmVlZCBpdCBoZXJlLiBJdCdzIGJlZW4gbW92ZWQgdG8gbGlicmFyeVBsdWdpbgotLy8JCXN0b3JlLnNldERlZmF1bHQoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMsCi0vLwkJCQlQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2UKLS8vCQkJCQkJLnRvU3RyaW5nKFByb2Nlc3NFZGl0b3IuREVGQVVMVF9XQlNfQ09MVU1OUykpOwotLy8JCXN0b3JlLnNldERlZmF1bHQoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMsCi0vLwkJCQlQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2UKLS8vCQkJCQkJLnRvU3RyaW5nKFByb2Nlc3NFZGl0b3IuREVGQVVMVF9UQlNfQ09MVU1OUykpOwotLy8JCXN0b3JlLnNldERlZmF1bHQoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV1BCU19DT0xVTU5TLAotLy8JCQkJUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlCi0vLwkJCQkJCS50b1N0cmluZyhQcm9jZXNzRWRpdG9yLkRFRkFVTFRfV1BCU19DT0xVTU5TKSk7Ci0vLwkJc3RvcmUuc2V0RGVmYXVsdCgKLS8vCQkJCUFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0lOSEVSSVRfU1VQUFJFU1NJT05fU1RBVEUsCi0vLwkJCQl0cnVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQXV0aG9yaW5nUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQXV0aG9yaW5nUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVhYjU3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0F1dGhvcmluZ1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuQ29tbW9uUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZlcmVuY2VzLkxpYnJhcnlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLnByZWZlcmVuY2VzLkJhc2VQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogVGhlIEF1dGhvcmluZyBwcmVmZXJlbmNlIHBhZ2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQXV0aG9yaW5nUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBCYXNlUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cwotCQlNb2RpZnlMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgTUlOX1BSRUZFUkVOQ0VfSElTVE9SWV9TSVpFID0gMTsKLQotCXByaXZhdGUgc3RhdGljIGludCBNQVhfUFJFRkVSRU5DRV9ISVNUT1JZX1NJWkUgPSAyMDsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByaXZhdGUgVGV4dCBkZWZhdWx0TGlicmFyeVBhdGhUZXh0OwotCi0JcHJpdmF0ZSBCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gZGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzQ2hlY2tib3g7Ci0KLQlwcml2YXRlIEJ1dHRvbiB1c2VOZXdFeHRlbmRzU2VtYW50aWNzQ2hlY2tib3g7Ci0KLQlwcml2YXRlIEJ1dHRvbiBlbmFibGVMaWJyYXJ5VmFsaWRhdGlvbkNoZWNrYm94OwotCi0JcHJpdmF0ZSBUZXh0IHByZWZlcmVuY2VIaXN0b3J5U2l6ZVRleHQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBTV1QgY29udHJvbCBmb3IgdGhlIGN1c3RvbWl6ZWQgYm9keSBvZiB0aGlzCi0JICogcHJlZmVyZW5jZSBwYWdlIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQgY29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiB0aGUgbmV3IGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUocGFyZW50LCAxKTsKLQotCQkvLyBDcmVhdGUgdGhlIE1ldGhvZCBsaWJyYXJ5IGdyb3VwLgotCQlHcm91cCBsaWJyYXJ5R3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm1ldGhvZExpYnJhcnlHcm91cF90ZXh0LCAzKTsKLQotCQljcmVhdGVMYWJlbChsaWJyYXJ5R3JvdXAsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlZmF1bHRQYXRoTGFiZWxfdGV4dCk7Ci0JCWRlZmF1bHRMaWJyYXJ5UGF0aFRleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQobGlicmFyeUdyb3VwKTsKLQkJYnJvd3NlQnV0dG9uID0gY3JlYXRlQnV0dG9uKGxpYnJhcnlHcm91cCwKLQkJCQlBdXRob3JpbmdVSVRleHQuQlJPV1NFX0JVVFRPTl9URVhUKTsKLQotCQlkaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXNDaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KGxpYnJhcnlHcm91cCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjYXJkdW5yZXNvbHZlZHJlZiwgMyk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBNb2RlbGluZyBncm91cC4KLQkJR3JvdXAgbW9kZWxpbmdHcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubW9kZWxpbmdHcm91cF90ZXh0LCAxKTsKLQotCQl1c2VOZXdFeHRlbmRzU2VtYW50aWNzQ2hlY2tib3ggPSBjcmVhdGVDaGVja2JveChtb2RlbGluZ0dyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4dGVuZF9zZW1hbnRpY3NfYnV0dG9uX3RleHQpOwotCi0JCS8vIENyZWF0ZSB0aGUgVUkgZ3JvdXAuCi0JCUdyb3VwIHVzZXJJbnRlcmZhY2VHcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMudXNlckludGVyZmFjZUdyb3VwX3RleHQsIDIpOwotCi0JCWNyZWF0ZUxhYmVsKHVzZXJJbnRlcmZhY2VHcm91cCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kZWZhdWx0X2xpc3RfbGVuZ3RoX2xhYmVsKTsKLQkJcHJlZmVyZW5jZUhpc3RvcnlTaXplVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dCh1c2VySW50ZXJmYWNlR3JvdXAsCi0JCQkJIiIsIDI1KTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIENyZWF0ZSB0aGUgZGVidWcgZ3JvdXAuCi0JCUdyb3VwIGRlYnVnR3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlYnVnR3JvdXBfdGV4dCwgMik7Ci0KLQkJZW5hYmxlTGlicmFyeVZhbGlkYXRpb25DaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KGRlYnVnR3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZW5hYmxlTGlicmFyeVZhbGlkYXRpb25DaGVja2JveF90ZXh0KTsKLQotCQlpbml0Q29udHJvbHMoKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMgd2l0aCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250cm9scygpIHsKLQkJZGVmYXVsdExpYnJhcnlQYXRoVGV4dC5zZXRUZXh0KExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLmdldERlZmF1bHRMaWJyYXJ5UGF0aCgpKTsKLQotCQlkaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXNDaGVja2JveC5zZXRTZWxlY3Rpb24oTGlicmFyeVByZWZlcmVuY2VzCi0JCQkJLmdldERpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlcygpKTsKLQotCQl1c2VOZXdFeHRlbmRzU2VtYW50aWNzQ2hlY2tib3guc2V0U2VsZWN0aW9uKExpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5nZXRVc2VOZXdFeHRlbmRzU2VtYW50aWNzKCkpOwotCi0JCXByZWZlcmVuY2VIaXN0b3J5U2l6ZVRleHQuc2V0VGV4dCgiIiAvLyROT04tTkxTLTEkCi0JCQkJKyBDb21tb25QcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlSGlzdG9yeVNpemUoKSk7IAotCi0JCWVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uQ2hlY2tib3guc2V0U2VsZWN0aW9uKEF1dGhvcmluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RW5hYmxlTGlicmFyeVZhbGlkYXRpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHByZWZlcmVuY2UgcGFnZSBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlvcGVuRGlyZWN0b3J5RGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXByZWZlcmVuY2VIaXN0b3J5U2l6ZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyI21vZGlmeVRleHQoTW9kaWZ5RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJc2V0VmFsaWQodHJ1ZSk7Ci0KLQkJaW50IHZhbHVlID0gMDsKLQkJaWYgKGUud2lkZ2V0ID09IHByZWZlcmVuY2VIaXN0b3J5U2l6ZVRleHQpIHsKLQkJCXZhbHVlID0gZ2V0UHJlZmVyZW5jZUhpc3RvcnlTaXplKCk7Ci0JCQlpZiAodmFsdWUgPCBNSU5fUFJFRkVSRU5DRV9ISVNUT1JZX1NJWkUKLQkJCQkJfHwgdmFsdWUgPiBNQVhfUFJFRkVSRU5DRV9ISVNUT1JZX1NJWkUpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCS5iaW5kKAotCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5pbnZhbGlkUHJlZmVyZW5jZUhpc3RvcnlTaXplRXJyb3JfbXNnLAotCQkJCQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJCQkJCW5ldyBJbnRlZ2VyKE1JTl9QUkVGRVJFTkNFX0hJU1RPUllfU0laRSksCi0JCQkJCQkJCQkJbmV3IEludGVnZXIoTUFYX1BSRUZFUkVOQ0VfSElTVE9SWV9TSVpFKSB9KSk7Ci0JCQkJc2V0VmFsaWQoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgc3BlY2lhbCBwcm9jZXNzaW5nIHdoZW4gdGhpcyBwYWdlJ3MgRGVmYXVsdHMgYnV0dG9uIGhhcyBiZWVuCi0JICogcHJlc3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCi0JCVN0cmluZyBkZWZhdWx0TGlicmFyeVBhdGggPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXRJbml0aWFsRGVmYXVsdExpYnJhcnlQYXRoKCk7Ci0JCUxpYnJhcnlVSVByZWZlcmVuY2VzLnNldERlZmF1bHRMaWJyYXJ5UGF0aChkZWZhdWx0TGlicmFyeVBhdGgpOwotCQlkZWZhdWx0TGlicmFyeVBhdGhUZXh0LnNldFRleHQoZGVmYXVsdExpYnJhcnlQYXRoKTsKLQotCQlib29sZWFuIGRpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlcyA9IExpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5nZXREZWZhdWx0RGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzKCk7Ci0JCUxpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5zZXREaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXMoZGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzKTsKLQkJZGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzQ2hlY2tib3gKLQkJCQkuc2V0U2VsZWN0aW9uKGRpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlcyk7Ci0KLQkJYm9vbGVhbiB1c2VOZXdFeHRlbmRzU2VtYW50aWNzID0gTGlicmFyeVByZWZlcmVuY2VzCi0JCQkJLmdldERlZmF1bHRVc2VOZXdFeHRlbmRzU2VtYW50aWNzKCk7Ci0JCUxpYnJhcnlQcmVmZXJlbmNlcy5zZXRVc2VOZXdFeHRlbmRzU2VtYW50aWNzKHVzZU5ld0V4dGVuZHNTZW1hbnRpY3MpOwotCQl1c2VOZXdFeHRlbmRzU2VtYW50aWNzQ2hlY2tib3guc2V0U2VsZWN0aW9uKHVzZU5ld0V4dGVuZHNTZW1hbnRpY3MpOwotCi0JCWludCBwcmVmZXJlbmNlSGlzdG9yeVNpemUgPSBDb21tb25QcmVmZXJlbmNlcwotCQkJCS5nZXREZWZhdWx0UHJlZmVyZW5jZUhpc3RvcnlTaXplKCk7Ci0JCUNvbW1vblByZWZlcmVuY2VzLnNldFByZWZlcmVuY2VIaXN0b3J5U2l6ZShwcmVmZXJlbmNlSGlzdG9yeVNpemUpOwotCQlwcmVmZXJlbmNlSGlzdG9yeVNpemVUZXh0LnNldFRleHQoIiIgKyBwcmVmZXJlbmNlSGlzdG9yeVNpemUpOyAvLyROT04tTkxTLTEkCi0KLQkJYm9vbGVhbiBlbmFibGVMaWJyYXJ5VmFsaWRhdGlvbiA9IEF1dGhvcmluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGVmYXVsdEVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uKCk7Ci0JCUF1dGhvcmluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuc2V0RW5hYmxlTGlicmFyeVZhbGlkYXRpb24oZW5hYmxlTGlicmFyeVZhbGlkYXRpb24pOwotCQllbmFibGVMaWJyYXJ5VmFsaWRhdGlvbkNoZWNrYm94LnNldFNlbGVjdGlvbihlbmFibGVMaWJyYXJ5VmFsaWRhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5zZXREZWZhdWx0TGlicmFyeVBhdGgoZ2V0RGVmYXVsdExpYnJhcnlQYXRoKCkpOwotCQlMaWJyYXJ5UHJlZmVyZW5jZXMKLQkJCQkuc2V0RGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzKGdldERpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlcygpKTsKLQkJTGlicmFyeVByZWZlcmVuY2VzCi0JCQkJLnNldFVzZU5ld0V4dGVuZHNTZW1hbnRpY3MoZ2V0VXNlTmV3RXh0ZW5kc1NlbWFudGljcygpKTsKLQkJQ29tbW9uUHJlZmVyZW5jZXMuc2V0UHJlZmVyZW5jZUhpc3RvcnlTaXplKGdldFByZWZlcmVuY2VIaXN0b3J5U2l6ZSgpKTsKLQkJQXV0aG9yaW5nVUlQcmVmZXJlbmNlcwotCQkJLnNldEVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uKGdldEVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uKCkpOwotCQkKLQkJLy8gdXBkYXRlIHRoZSBzZXR0aW5ncyBmb3IgYnJvd3NpbmcKLQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS51cGRhdGVMYXlvdXRTZXR0aW5ncygpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGRlZmF1bHQgbWV0aG9kIGxpYnJhcnkgcGF0aC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRMaWJyYXJ5UGF0aCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRMaWJyYXJ5UGF0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBkaXNjYXJkIHVucmVzb2x2ZWQgcmVmZXJlbmNlcyBwcmVmZXJlbmNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldERpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIGRpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlc0NoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHVzZSBuZXcgZXh0ZW5kcyBzZW1hbnRpY3MgcHJlZmVyZW5jZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRVc2VOZXdFeHRlbmRzU2VtYW50aWNzKCkgewotCQlyZXR1cm4gdXNlTmV3RXh0ZW5kc1NlbWFudGljc0NoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHByZWZlZnJlbmNlIGhpc3Rvcnkgc2l6ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFByZWZlcmVuY2VIaXN0b3J5U2l6ZSgpIHsKLQkJcmV0dXJuIFN0clV0aWwuZ2V0SW50VmFsdWUocHJlZmVyZW5jZUhpc3RvcnlTaXplVGV4dC5nZXRUZXh0KCkudHJpbSgpLAotCQkJCTApOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBlbmFibGVkIGxpYnJhcnkgdmFsaWRhdGlvbiBwcmVmZXJlbmNlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldEVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uKCkgewotCQlyZXR1cm4gZW5hYmxlTGlicmFyeVZhbGlkYXRpb25DaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGUgZGlyZWN0b3J5IGRpYWxvZy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgb3BlbkRpcmVjdG9yeURpYWxvZygpIHsKLQkJdHJ5IHsKLQkJCURpcmVjdG9yeURpYWxvZyBkZCA9IG5ldyBEaXJlY3RvcnlEaWFsb2coY29tcG9zaXRlLmdldFNoZWxsKCksCi0JCQkJCVNXVC5OT05FKTsKLQkJCVN0cmluZyBwYXRoID0gZGQub3BlbigpOwotCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCWRlZmF1bHRMaWJyYXJ5UGF0aFRleHQuc2V0VGV4dChwYXRoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9BdXRob3JpbmdVSVByZWZlcmVuY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0F1dGhvcmluZ1VJUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdmNzRkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0F1dGhvcmluZ1VJUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBBdXRob3JpbmcgVUkgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQXV0aG9yaW5nVUlQcmVmZXJlbmNlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVfTElCUkFSWV9WQUxJREFUSU9OID0gImVuYWJsZWRMaWJyYXJ5VmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVGQVVMVF9FTkFCTEVfTElCUkFSWV9WQUxJREFUSU9OID0gZmFsc2U7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBzcGVjaWZpYyBwcmVmZXJlbmNlIHN0b3JlLgotCXByaXZhdGUgc3RhdGljIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0Jc3RhdGljIHsKLQkJLy8gSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoRU5BQkxFX0xJQlJBUllfVkFMSURBVElPTiwKLQkJCQlERUZBVUxUX0VOQUJMRV9MSUJSQVJZX1ZBTElEQVRJT04pOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgZW5hYmxlIG1ldGhvZCBsaWJyYXJ5IHZhbGlkYXRpb24gcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RGVmYXVsdEVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uKCkgewotCQlyZXR1cm4gREVGQVVMVF9FTkFCTEVfTElCUkFSWV9WQUxJREFUSU9OOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1ldGhvZCBsaWJyYXJ5IHZhbGlkYXRpb24gcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RW5hYmxlTGlicmFyeVZhbGlkYXRpb24oKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihFTkFCTEVfTElCUkFSWV9WQUxJREFUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtZXRob2QgbGlicmFyeSB2YWxpZGF0aW9uIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKEVOQUJMRV9MSUJSQVJZX1ZBTElEQVRJT04sIHZhbHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQnJlYWtkb3duRWxlbWVudFByZWZQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0JyZWFrZG93bkVsZW1lbnRQcmVmUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTY0NDY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQnJlYWtkb3duRWxlbWVudFByZWZQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLlByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLnByZWZlcmVuY2VzLkJhc2VQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgZm9yIGJyZWFrZG93biBlbGVtZW50IGF0dHJpYnV0ZXMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudFByZWZQYWdlIGV4dGVuZHMgQmFzZVByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlLCBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0KLQlDb21wb3NpdGUgY29tcG9zaXRlOwotCi0JcHJpdmF0ZSBCdXR0b24gd29ya0JyZWFrZG93bkVsZW1lbnRPcHRpb25hbEJ1dHRvbiwKLQkJCXdvcmtCcmVha2Rvd25FbGVtZW50TXVsdGlwbGVPY2N1cnJhbmNlc0J1dHRvbiwKLQkJCXdvcmtCcmVha2Rvd25FbGVtZW50UGxhbm5lZEJ1dHRvbiwKLQkJCXdvcmtCcmVha2Rvd25FbGVtZW50RXZlbnREcml2ZW5CdXR0b24sCi0JCQl3b3JrQnJlYWtkb3duRWxlbWVudE9uZ29pbmdCdXR0b24sCi0JCQl3b3JrQnJlYWtkb3duRWxlbWVudFJlcGV0YWJsZUJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGRlc2NyaXB0b3JPcHRpb25hbEJ1dHRvbiwKLQkJCWRlc2NyaXB0b3JNdWx0aXBsZU9jY3VycmFuY2VzQnV0dG9uLCBkZXNjcmlwdG9yUGxhbm5lZEJ1dHRvbiwKLQkJCWRlc2NyaXB0b3JFdmVudERyaXZlbkJ1dHRvbiwgZGVzY3JpcHRvck9uZ29pbmdCdXR0b24sCi0JCQlkZXNjcmlwdG9yUmVwZXRhYmxlQnV0dG9uOwotCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnRQcmVmUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5wcmVmZXJlbmNlX2JyZWFrRG93bkVsZW1lbnRfRGVzY3JpcHRpb24pOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gY3JlYXRlIGdyb3VwIGZvciBhY3Rpdml0eSBlbGVtZW50cwotCQlHcm91cCB3b3JrQnJlYWtkb3duRWxlbWVudEdyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5wcmVmZXJlbmNlX1dvcmtCcmVha2Rvd25FbGVtZW50cywgMSwgdHJ1ZSk7Ci0KLQkJd29ya0JyZWFrZG93bkVsZW1lbnRPcHRpb25hbEJ1dHRvbiA9IGNyZWF0ZUNoZWNrYm94KAotCQkJCXdvcmtCcmVha2Rvd25FbGVtZW50R3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9PcHRpb25hbCk7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50TXVsdGlwbGVPY2N1cnJhbmNlc0J1dHRvbiA9IGNyZWF0ZUNoZWNrYm94KAotCQkJCXdvcmtCcmVha2Rvd25FbGVtZW50R3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRQbGFubmVkQnV0dG9uID0gY3JlYXRlQ2hlY2tib3goCi0JCQkJd29ya0JyZWFrZG93bkVsZW1lbnRHcm91cCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1BsYW5uZWQpOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudEV2ZW50RHJpdmVuQnV0dG9uID0gY3JlYXRlQ2hlY2tib3goCi0JCQkJd29ya0JyZWFrZG93bkVsZW1lbnRHcm91cCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0V2ZW50RHJpdmVuKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRPbmdvaW5nQnV0dG9uID0gY3JlYXRlQ2hlY2tib3goCi0JCQkJd29ya0JyZWFrZG93bkVsZW1lbnRHcm91cCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX09uZ29pbmcpOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudFJlcGV0YWJsZUJ1dHRvbiA9IGNyZWF0ZUNoZWNrYm94KAotCQkJCXdvcmtCcmVha2Rvd25FbGVtZW50R3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9SZXBldGFibGUpOwotCi0JCS8vIGNyZWF0ZSBncm91cCBmb3IgZGVzY3JpcHRvciBlbGVtZW50cwotCQlHcm91cCBkZXNjcmlwdG9yR3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnByZWZlcmVuY2VfRGVzY3JpcHRvckVsZW1lbnRzLCAxLCB0cnVlKTsKLQkJZGVzY3JpcHRvck9wdGlvbmFsQnV0dG9uID0gY3JlYXRlQ2hlY2tib3goZGVzY3JpcHRvckdyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfT3B0aW9uYWwpOwotCQlkZXNjcmlwdG9yTXVsdGlwbGVPY2N1cnJhbmNlc0J1dHRvbiA9IGNyZWF0ZUNoZWNrYm94KGRlc2NyaXB0b3JHcm91cCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX011bHRpcGxlT2NjdXJyZW5jZXMpOwotCQlkZXNjcmlwdG9yUGxhbm5lZEJ1dHRvbiA9IGNyZWF0ZUNoZWNrYm94KGRlc2NyaXB0b3JHcm91cCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1BsYW5uZWQpOwotCQlkZXNjcmlwdG9yRXZlbnREcml2ZW5CdXR0b24gPSBjcmVhdGVDaGVja2JveChkZXNjcmlwdG9yR3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9FdmVudERyaXZlbik7Ci0JCWRlc2NyaXB0b3JPbmdvaW5nQnV0dG9uID0gY3JlYXRlQ2hlY2tib3goZGVzY3JpcHRvckdyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfT25nb2luZyk7Ci0JCWRlc2NyaXB0b3JSZXBldGFibGVCdXR0b24gPSBjcmVhdGVDaGVja2JveChkZXNjcmlwdG9yR3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9SZXBldGFibGUpOwotCi0JCS8vIEluaXRpYWxpemUgdmFsdWVzCi0JCWluaXRpYWxpemVWYWx1ZXMoKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCWluaXRpYWxpemVEZWZhdWx0cygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gUHJlZmVyZW5jZVBhZ2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXN0b3JlVmFsdWVzKCk7Ci0JCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCUxpYnJhcnlVSVByZWZlcmVuY2VzLmFwcGx5RGVmYXVsdFZhbHVlc0ZvckJyZWFrZG93bkVsZW1lbnRBdHRyaWJ1dGVzKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSBjb250cm9scyBiYWNrIHRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJLy8KLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuc2V0V29ya0JyZWFrZG93bkVsZW1lbnRPcHRpb25hbCh3b3JrQnJlYWtkb3duRWxlbWVudE9wdGlvbmFsQnV0dG9uCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5zZXRXb3JrQnJlYWtkb3duRWxlbWVudE11bHRpcGxlT2NjdXJyYW5jZXMod29ya0JyZWFrZG93bkVsZW1lbnRNdWx0aXBsZU9jY3VycmFuY2VzQnV0dG9uCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5zZXRXb3JrQnJlYWtkb3duRWxlbWVudFBsYW5uZWQod29ya0JyZWFrZG93bkVsZW1lbnRQbGFubmVkQnV0dG9uCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5zZXRXb3JrQnJlYWtkb3duRWxlbWVudEV2ZW50RHJpdmVuKHdvcmtCcmVha2Rvd25FbGVtZW50RXZlbnREcml2ZW5CdXR0b24KLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCUxpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLnNldFdvcmtCcmVha2Rvd25FbGVtZW50T25nb2luZyh3b3JrQnJlYWtkb3duRWxlbWVudE9uZ29pbmdCdXR0b24KLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCUxpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLnNldFdvcmtCcmVha2Rvd25FbGVtZW50UmVwZWF0YWJsZSh3b3JrQnJlYWtkb3duRWxlbWVudFJlcGV0YWJsZUJ1dHRvbgotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5zZXREZXNjcmlwdG9yT3B0aW9uYWwoZGVzY3JpcHRvck9wdGlvbmFsQnV0dG9uCi0JCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuc2V0RGVzY3JpcHRvck11bHRpcGxlT2NjdXJyYW5jZXMoZGVzY3JpcHRvck11bHRpcGxlT2NjdXJyYW5jZXNCdXR0b24KLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCUxpYnJhcnlVSVByZWZlcmVuY2VzLnNldERlc2NyaXB0b3JQbGFubmVkKGRlc2NyaXB0b3JQbGFubmVkQnV0dG9uCi0JCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuc2V0RGVzY3JpcHRvckV2ZW50RHJpdmVuKGRlc2NyaXB0b3JFdmVudERyaXZlbkJ1dHRvbgotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2V0RGVzY3JpcHRvck9uZ29pbmcoZGVzY3JpcHRvck9uZ29pbmdCdXR0b24KLQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5zZXREZXNjcmlwdG9yUmVwZWF0YWJsZShkZXNjcmlwdG9yUmVwZXRhYmxlQnV0dG9uCi0JCQkJLmdldFNlbGVjdGlvbigpKTsKLQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRlZmF1bHQgc3RhdGVzIG9mIHRoZSBjb250cm9scyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRGVmYXVsdHMoKSB7Ci0JCQotCQl3b3JrQnJlYWtkb3duRWxlbWVudE9wdGlvbmFsQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50TXVsdGlwbGVPY2N1cnJhbmNlc0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudFBsYW5uZWRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudEV2ZW50RHJpdmVuQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50T25nb2luZ0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudFJlcGV0YWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCi0JCWRlc2NyaXB0b3JPcHRpb25hbEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQlkZXNjcmlwdG9yTXVsdGlwbGVPY2N1cnJhbmNlc0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQlkZXNjcmlwdG9yUGxhbm5lZEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQlkZXNjcmlwdG9yRXZlbnREcml2ZW5CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJZGVzY3JpcHRvck9uZ29pbmdCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJZGVzY3JpcHRvclJlcGV0YWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRPcHRpb25hbEJ1dHRvbi5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0V29ya0JyZWFrRG93bkVsZW1lbnRPcHRpb25hbCgpKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRNdWx0aXBsZU9jY3VycmFuY2VzQnV0dG9uCi0JCQkJLnNldFNlbGVjdGlvbihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCQkJLmdldFdvcmtCcmVha0Rvd25FbGVtZW50TXVsdGlwbGVPY2N1cnJhbmNlcygpKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRQbGFubmVkQnV0dG9uLnNldFNlbGVjdGlvbihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXRXb3JrQnJlYWtEb3duRWxlbWVudFBsYW5uZWQoKSk7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50RXZlbnREcml2ZW5CdXR0b24uc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLmdldFdvcmtCcmVha0Rvd25FbGVtZW50RXZlbnREcml2ZW4oKSk7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50T25nb2luZ0J1dHRvbi5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0V29ya0JyZWFrRG93bkVsZW1lbnRPbmdvaW5nKCkpOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudFJlcGV0YWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0V29ya0JyZWFrRG93bkVsZW1lbnRSZXBlYXRhYmxlKCkpOwotCi0JCWRlc2NyaXB0b3JPcHRpb25hbEJ1dHRvbi5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGVzY3JpcHRvck9wdGlvbmFsKCkpOwotCQlkZXNjcmlwdG9yTXVsdGlwbGVPY2N1cnJhbmNlc0J1dHRvbi5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGVzY3JpcHRvck11bHRpcGxlT2NjdXJyYW5jZXMoKSk7Ci0JCWRlc2NyaXB0b3JQbGFubmVkQnV0dG9uLnNldFNlbGVjdGlvbihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZXNjcmlwdG9yUGxhbm5lZCgpKTsKLQkJZGVzY3JpcHRvckV2ZW50RHJpdmVuQnV0dG9uLnNldFNlbGVjdGlvbihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZXNjcmlwdG9yRXZlbnREcml2ZW4oKSk7Ci0JCWRlc2NyaXB0b3JPbmdvaW5nQnV0dG9uLnNldFNlbGVjdGlvbihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZXNjcmlwdG9yT25nb2luZygpKTsKLQkJZGVzY3JpcHRvclJlcGV0YWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGVzY3JpcHRvclJlcGVhdGFibGUoKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQ29tbW9uUHJlZlBhZ2UjZG9HZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciB3cmFwcGVyID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWlmICggd3JhcHBlciBpbnN0YW5jZW9mIFByZWZlcmVuY2VTdG9yZVdyYXBwZXIgKSB7Ci0JCQlyZXR1cm4gKChQcmVmZXJlbmNlU3RvcmVXcmFwcGVyKXdyYXBwZXIpLmdldFN0b3JlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0NvbW1vblByZWZQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0NvbW1vblByZWZQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MWJlNTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9Db21tb25QcmVmUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFByZWZlcmVuY2UgcGFnZSBmb3IgY29tbW9uIG9wdGlvbnMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25QcmVmUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBkbyBub3RoaW5nIGluIHRoaXMgY29tbW9uIHByZWZlcmVuY2UgcGFnZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUdyaWRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvLyBHcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuRGlyZWN0b3J5RGlhbG9nKENvbXBvc2l0ZSBwYXJlbnQsIFRleHQgcGF0aF9jdHIpIHsKLQkJdHJ5IHsKLQkJCURpcmVjdG9yeURpYWxvZyBkZCA9IG5ldyBEaXJlY3RvcnlEaWFsb2cocGFyZW50LmdldFNoZWxsKCksCi0JCQkJCVNXVC5OT05FKTsKLQotCQkJU3RyaW5nIGRlc3RpbmF0aW9uID0gZGQub3BlbigpOwotCQkJaWYgKGRlc3RpbmF0aW9uICE9IG51bGwpIHsKLQkJCQlwYXRoX2N0ci5zZXRUZXh0KGRlc3RpbmF0aW9uKTsKLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHRvIGNyZWF0ZSBhIExhYmVsCi0JICogQHBhcmFtIHBhcmVudCBwYXJlbnQgY29tcG9zaXRlIG9mIHRoZSBMYWJlbAotCSAqIEBwYXJhbSB0ZXh0IExhYmVsIHRleHQKLQkgKiBAcGFyYW0gc3BhbiBob3Jpem9udGFsIHNwYW4KLQkgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIExhYmVsCi0JICovCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3BhbikgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0byBjcmVhdGUgYSByYWRpbyBidXR0b24KLQkgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBjb21wb3NpdGUgb2YgdGhlIGJ1dHRvbgotCSAqIEBwYXJhbSBsYWJlbCB0aGUgYnV0dG9uIGxhYmVsCi0JICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBSYWRpbyBCdXR0b24KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyB8IFNXVC5MRUZUKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0byBjcmVhdGUgYSBsaW5lCi0JICogQHBhcmFtIHBhcmVudCBwYXJlbnQgY29tcG9zaXRlIG9mIHRoZSBsaW5lCi0JICogQHBhcmFtIG5jb2wgaG9yaXpvbnRhbCBzcGFuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTGluZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbmNvbCkgewotCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMCi0JCQkJfCBTV1QuQk9MRCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbmNvbDsKLQkJbGluZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIHByZWZlcmVuY2Ugc3RvcmUKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQotCQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciB3cmFwcGVyID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWlmICggd3JhcHBlciBpbnN0YW5jZW9mIFByZWZlcmVuY2VTdG9yZVdyYXBwZXIgKSB7Ci0JCQlyZXR1cm4gKChQcmVmZXJlbmNlU3RvcmVXcmFwcGVyKXdyYXBwZXIpLmdldFN0b3JlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JCS8vIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0xpYnJhcnlMb2NhdGlvbkRhdGEuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTGlicmFyeUxvY2F0aW9uRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzY2YjQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTGlicmFyeUxvY2F0aW9uRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQ29tbW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcy5MaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogTG9jYXRpb24gRGF0YSBmb3IgbGlicmFyeSAKLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKiBmaXggZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTc0MDEKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlMb2NhdGlvbkRhdGEgewotCi0JcHJpdmF0ZSBTdHJpbmcgcGFyZW50Rm9sZGVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGliTmFtZTsKLQotCXByaXZhdGUgU3RyaW5nIGxpYkJyaWVmRGVzY3JpcHRpb247Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTaW5nbGVMaWJGaWxlOwotCi0JcHJpdmF0ZSBib29sZWFuIGRlZkxpYkRpckNoZWNrZWQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBsaWJyYXJ5RmlsZSA9ICJsaWJyYXJ5LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNPa1ByZXNzZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPa1ByZXNzZWQoKSB7Ci0JCXJldHVybiBpc09rUHJlc3NlZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXNPa1ByZXNzZWQKLQkgKiAgICAgICAgICAgIFRoZSBpc09rUHJlc3NlZCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0T2tQcmVzc2VkKGJvb2xlYW4gaXNPa1ByZXNzZWQpIHsKLQkJdGhpcy5pc09rUHJlc3NlZCA9IGlzT2tQcmVzc2VkOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc09rUHJlc3NlZDsKLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNTaW5nbGVMaWJGaWxlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2luZ2xlTGliRmlsZSgpIHsKLQkJcmV0dXJuIGlzU2luZ2xlTGliRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXNTaW5nbGVMaWJGaWxlCi0JICogICAgICAgICAgICBUaGUgaXNTaW5nbGVMaWJGaWxlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaW5nbGVMaWJGaWxlKGJvb2xlYW4gaXNTaW5nbGVMaWJGaWxlKSB7Ci0JCXRoaXMuaXNTaW5nbGVMaWJGaWxlID0gaXNTaW5nbGVMaWJGaWxlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbGliTmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYk5hbWUoKSB7Ci0JCXJldHVybiBsaWJOYW1lOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gRnVsbCBwYXRoIG9mIGxpYnJhcnkueG1pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5RmlsZSgpIHsKLQkJcmV0dXJuIGdldFBhcmVudEZvbGRlcigpICsgRmlsZS5zZXBhcmF0b3IgKyBsaWJyYXJ5RmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGliTmFtZQotCSAqICAgICAgICAgICAgVGhlIGxpYk5hbWUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpYk5hbWUoU3RyaW5nIGxpYk5hbWUpIHsKLQkJdGhpcy5saWJOYW1lID0gbGliTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhcmVudEZvbGRlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudEZvbGRlcigpIHsKLQkJcmV0dXJuIHBhcmVudEZvbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Rm9sZGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50Rm9sZGVyIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRGb2xkZXIoU3RyaW5nIHBhcmVudEZvbGRlcikgewotCQl0aGlzLnBhcmVudEZvbGRlciA9IHBhcmVudEZvbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxpYkJyaWVmRGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJCcmllZkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gbGliQnJpZWZEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGliQnJpZWZEZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgVGhlIGxpYkJyaWVmRGVzY3JpcHRpb24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpYkJyaWVmRGVzY3JpcHRpb24oU3RyaW5nIGxpYkJyaWVmRGVzY3JpcHRpb24pIHsKLQkJdGhpcy5saWJCcmllZkRlc2NyaXB0aW9uID0gbGliQnJpZWZEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlZkxpYkRpckNoZWNrZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZMaWJEaXJDaGVja2VkKCkgewotCQlyZXR1cm4gZGVmTGliRGlyQ2hlY2tlZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVmTGliRGlyQ2hlY2tlZAotCSAqICAgICAgICAgICAgVGhlIGRlZkxpYkRpckNoZWNrZWQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZkxpYkRpckNoZWNrZWQoYm9vbGVhbiBkZWZMaWJEaXJDaGVja2VkKSB7Ci0JCXRoaXMuZGVmTGliRGlyQ2hlY2tlZCA9IGRlZkxpYkRpckNoZWNrZWQ7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgcHJlZmVyZW5jZXMgZnJvbSB0aGUgc3RvcmUKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRGcm9tUHJlZmVyZW5jZVN0b3JlKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBzdG9yZSA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JCVN0cmluZyBsYXN0RGlyID0gc3RvcmUKLQkJCQkuZ2V0U3RyaW5nKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTEFTVF9MSUJSQVJZX1BBUkVOVF9ESVJFQ1RPUlkpOwotCQl0aGlzLnNldFBhcmVudEZvbGRlcihsYXN0RGlyKTsKLQotCQlib29sZWFuIGxhc3RDaGVja2VkID0gc3RvcmUKLQkJCQkuZ2V0Qm9vbGVhbihMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xBU1RfREVGQVVMVF9ESVJFQ1RPUllfQ0hFQ0tFRCk7Ci0JCS8vIHRoZSBjb250YWlucyBtZXRob2QgZG9lcyBub3Qgc2VlbSB0byB3b3JrIHNvIHVzZSBsYXN0IGRpciBhcyBhbgotCQkvLyBhcHByb3hpbWF0aW9uIGlmCi0JCS8vIChzdG9yZS5jb250YWlucyhMaWJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTEFTVF9ERUZBVUxUX0RJUkVDVE9SWV9DSEVDS0VEKSkKLQkJaWYgKGxhc3REaXIgPT0gbnVsbCB8fCBsYXN0RGlyLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotCQkJdGhpcy5zZXREZWZMaWJEaXJDaGVja2VkKHRydWUpOwotCQllbHNlCi0JCQl0aGlzLnNldERlZkxpYkRpckNoZWNrZWQobGFzdENoZWNrZWQpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIGRpYWxvZyBjaG9pY2VzIHRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlVG9QcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRoaXMuZ2V0UGFyZW50Rm9sZGVyKCkpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5zZXRTYXZlZExpYnJhcnlQYXRoKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlzdG9yZS5zZXRWYWx1ZSgKLQkJCQlMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xBU1RfTElCUkFSWV9QQVJFTlRfRElSRUNUT1JZLAotCQkJCWZpbGUuZ2V0UGFyZW50KCkpOwotCQlzdG9yZS5zZXRWYWx1ZSgKLQkJCQlMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xBU1RfREVGQVVMVF9ESVJFQ1RPUllfQ0hFQ0tFRCwKLQkJCQl0aGlzLmlzRGVmTGliRGlyQ2hlY2tlZCgpKTsKLQotCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNmMWMyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0xpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMuUHJlZmVyZW5jZUNvbnN0YW50czsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIENvbnN0YW50cyBmb3IgbGlicmFyeQotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMgZXh0ZW5kcyBQcmVmZXJlbmNlQ29uc3RhbnRzIHsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0xpYnJhcnlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFkMjQ3OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0xpYnJhcnlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLkxpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBJbml0aWFsaXplciBmb3IgbGlicmFyeSBwcmVmZXJlbmNlcwotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5UHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgc3RvcmUgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1JBRElPX1NBVkVfQ0hPSUNFLCAxKTsKLQkJCi0JCXN0b3JlLnNldERlZmF1bHQoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMsCi0JCQkJUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlCi0JCQkJCQkudG9TdHJpbmcoUHJvY2Vzc0VkaXRvci5ERUZBVUxUX1dCU19DT0xVTU5TKSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMsCi0JCQkJUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlCi0JCQkJCQkudG9TdHJpbmcoUHJvY2Vzc0VkaXRvci5ERUZBVUxUX1RCU19DT0xVTU5TKSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV1BCU19DT0xVTU5TLAotCQkJCVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZQotCQkJCQkJLnRvU3RyaW5nKFByb2Nlc3NFZGl0b3IuREVGQVVMVF9XUEJTX0NPTFVNTlMpKTsKLQkJc3RvcmUuc2V0RGVmYXVsdCgKLQkJCQlBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9JTkhFUklUX1NVUFBSRVNTSU9OX1NUQVRFLAotCQkJCXRydWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5Vmlld1ByZWZQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0xpYnJhcnlWaWV3UHJlZlBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhiOWM0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0xpYnJhcnlWaWV3UHJlZlBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5pbnRlcm5hbC5wYWdlc2V0dXAuRGVmYXVsdFZhbHVlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmludGVybmFsLnByb3BlcnRpZXMuV29ya3NwYWNlVmlld2VyUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUmFkaW9Hcm91cEZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBMaWJyYXJ5IHZpZXcgb3B0aW9ucyBwcmVmZXJlbmNlIHBhZ2UKLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5Vmlld1ByZWZQYWdlIGV4dGVuZHMgRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0JCi0JcHVibGljIExpYnJhcnlWaWV3UHJlZlBhZ2UoKSB7Ci0JCXN1cGVyKEdSSUQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlDb21wb3NpdGUgcGFyZW50ID0gZ2V0RmllbGRFZGl0b3JQYXJlbnQoKTsKLQkJUmFkaW9Hcm91cEZpZWxkRWRpdG9yIGRlZmF1bHRMaW5rVHlwZUVkaXRvciA9IG5ldyBSYWRpb0dyb3VwRmllbGRFZGl0b3IoCi0JICAgIAkgICAgIAkJCUFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJQl9WSUVXX0RORF9ERUZBVUxUX0xJTktUWVBFLAotCSAgICAJICAgICAJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kZWZhdWx0TGlua1R5cGVQcmVmTGFiZWwsIDEsCi0JICAgIAkgICAgIAkJCW5ldyBTdHJpbmdbXVtdIHsKLQkgICAgCSAgICAgCQkJCQl7TGlicmFyeVVJUmVzb3VyY2VzLmVsZW1lbnRMaW5rX25hbWUsIFJlc291cmNlSGVscGVyLkVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGlua30sCi0JICAgIAkgICAgIAkJCQkJe0xpYnJhcnlVSVJlc291cmNlcy5lbGVtZW50TGlua1dpdGhUeXBlX25hbWUsIFJlc291cmNlSGVscGVyLkVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGlua1dpdGhUeXBlfSwKLQkgICAgCSAgICAgCQkJCQl7TGlicmFyeVVJUmVzb3VyY2VzLmVsZW1lbnRMaW5rV2l0aFVzZXJUZXh0X25hbWUsIFJlc291cmNlSGVscGVyLkVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGlua1dpdGhVc2VyVGV4dH0KLQkgICAgCSAgICAgCQkJfSwgcGFyZW50LCB0cnVlKTsKLQkJZGVmYXVsdExpbmtUeXBlRWRpdG9yLnNldFByZWZlcmVuY2VTdG9yZShkb0dldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJYWRkRmllbGQoZGVmYXVsdExpbmtUeXBlRWRpdG9yKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCX0KLQkKLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgcHJpbnRpbmcgcHJlZmVyZW5jZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXREZWZhdWx0cyhJUHJlZmVyZW5jZVN0b3JlIHN0b3JlKSB7Ci0JCXN0b3JlLnNldERlZmF1bHQoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElCX1ZJRVdfRE5EX0RFRkFVTFRfTElOS1RZUEUsCi0JCQkJUmVzb3VyY2VIZWxwZXIuRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkN2JlZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db2x1bW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5QcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0U2VsZWN0aW9uRGlhbG9nOwotCi0vKioKLSAqIFByZWZlcmVuY2UgcGFnZSBmb3IgUHJvY2Vzc0VkaXRvcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzCi0JCUlXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgU2VsZWN0aW9uTGlzdGVuZXIsIE1vZGlmeUxpc3RlbmVyIHsKLQotCS8vIHByaXZhdGUgVGV4dCBsaW5lV2lkdGhUZXh0OwotCS8vIHByaXZhdGUgQnV0dG9uIGluZGVudENoZWNrYm94OwotCS8vIHByaXZhdGUgVGV4dCBpbmRlbnRTaXplVGV4dDsKLQkvLyBwcml2YXRlIENvbWJvIGJzQ29tYm87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdCU19UWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1dvcmtCcmVha2Rvd25TdHJ1Y3R1cmU7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRCU19UWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1RlYW1BbGxvY2F0aW9uOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXUEJTX1RYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfV29ya1Byb2R1Y3RVc2FnZTsgCi0KLQlwcml2YXRlIExpc3RWaWV3ZXIgc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyOwotCi0JLy8gcHJpdmF0ZSBMaXN0Vmlld2VyIHRic1NlbGVjdGVkQ29sTGlzdDsKLQkvLyBwcml2YXRlIExpc3RWaWV3ZXIgd3Bic1NlbGVjdGVkQ29sTGlzdDsKLQlwcml2YXRlIGphdmEudXRpbC5MaXN0IHdic0NvbHVtbkRlc2NyaXB0b3JzOwotCi0JcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCB0YnNDb2x1bW5EZXNjcmlwdG9yczsKLQotCXByaXZhdGUgamF2YS51dGlsLkxpc3Qgd3Bic0NvbHVtbkRlc2NyaXB0b3JzOwotCi0JcHJpdmF0ZSBCdXR0b24gYWRkQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gcmVtb3ZlQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gZG93bkJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIHVwQnV0dG9uOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQlNfTkFNRVMgPSBuZXcgU3RyaW5nW10geyBXQlNfVFhULCBUQlNfVFhULAotCQkJV1BCU19UWFQgfTsKLQotCXByaXZhdGUgTGlzdFtdIGNvbHVtbkRlc2NyaXB0b3JMaXN0czsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3RbXSBBTExfQ09MVU1OX0RFU0NSSVBUT1JfTElTVFMgPSBuZXcgTGlzdFtdIHsKLQkJCVByb2Nlc3NFZGl0b3IuQUxMX1dCU19DT0xVTU5TLCBQcm9jZXNzRWRpdG9yLkFMTF9UQlNfQ09MVU1OUywKLQkJCVByb2Nlc3NFZGl0b3IuQUxMX1dQQlNfQ09MVU1OUyB9OwotCi0JLy8gY29uZmlndXJhdGlvbiBzd2l0Y2hpbmcgcHJlZmVyZW5jZQotCXByaXZhdGUgQnV0dG9uIGNvbmZpZ1N3aXRjaEFsd2F5c0J1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGNvbmZpZ1N3aXRjaE5ldmVyQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gY29uZmlnU3dpdGNoUHJvbXB0QnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gaW5oZXJpdFN1cHByZXNzaW9uQnV0dG9uOwotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29sdW1uRGVzY3JpcHRvclByb3ZpZGVyIGltcGxlbWVudHMKLQkJCUlUcmVlQ29udGVudFByb3ZpZGVyLCBJTGFiZWxQcm92aWRlciB7Ci0KLQkJcHVibGljIENvbHVtbkRlc2NyaXB0b3JQcm92aWRlcigpIHsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCXJldHVybiAoKGphdmEudXRpbC5MaXN0KSBpbnB1dEVsZW1lbnQpLnRvQXJyYXkoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotCQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiAoKENvbHVtbkRlc2NyaXB0b3IpIGVsZW1lbnQpLmxhYmVsOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjZG9HZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciB3cmFwcGVyID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWlmICggd3JhcHBlciBpbnN0YW5jZW9mIFByZWZlcmVuY2VTdG9yZVdyYXBwZXIgKSB7Ci0JCQlyZXR1cm4gKChQcmVmZXJlbmNlU3RvcmVXcmFwcGVyKXdyYXBwZXIpLmdldFN0b3JlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXREYXRhKCk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUNvbXBvc2l0ZSBjb2x1bW5zQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJY29sdW1uc0NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJY29sdW1uc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb2x1bW5zQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29sdW1uc2VsZWN0aW9uX3RleHQpOyAKLQotCQlmaW5hbCBDb21ibyBic0NvbWJvID0gbmV3IENvbWJvKGNvbHVtbnNDb21wb3NpdGUsIFNXVC5SRUFEX09OTFkKLQkJCQl8IFNXVC5CT1JERVIpOwotCQlic0NvbWJvLnNldEl0ZW1zKEJTX05BTUVTKTsKLQkJYnNDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlDb21ibyBjb21ibyA9IChDb21ibykgZS5nZXRTb3VyY2UoKTsKLQkJCQlpbnQgaWQgPSBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCWlmIChpZCAhPSAtMSkgewotCQkJCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIKLQkJCQkJCQkuc2V0SW5wdXQoY29sdW1uRGVzY3JpcHRvckxpc3RzW2lkXSk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCi0JCQl9Ci0KLQkJfSk7Ci0JCWJzQ29tYm8uc2VsZWN0KDApOwotCi0JCUNvbXBvc2l0ZSBsaXN0Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxpc3RDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWxpc3RDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQ29tcG9zaXRlIHN1YkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUobGlzdENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXN1YkNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc3ViQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKHN1YkNvbXBvc2l0ZSwgU1dULk1VTFRJCi0JCQkJfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJZmluYWwgQ29sdW1uRGVzY3JpcHRvclByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yUHJvdmlkZXIoKTsKLQkJc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihpdGVtUHJvdmlkZXIpOwotCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihpdGVtUHJvdmlkZXIpOwotCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIuc2V0SW5wdXQod2JzQ29sdW1uRGVzY3JpcHRvcnMpOwotCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCl7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdCByZW1vdmVMaXN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpLnRvTGlzdCgpOwotCQkJCWlmIChyZW1vdmVMaXN0LmNvbnRhaW5zKFByb2Nlc3NFZGl0b3IuQ09MX0RFU0NfSUQpCi0JCQkJCQl8fCByZW1vdmVMaXN0Ci0JCQkJCQkJCS5jb250YWlucyhQcm9jZXNzRWRpdG9yLkNPTF9ERVNDX1BSRVNFTlRBVElPTl9OQU1FKSkgewotCQkJCQkvLyBpZiBwcmVzZW50IG5hbWUgb3IgaWQgc2VsZWN0ZWQsIAotCQkJCQkvLyBkaXNhYmxlICJyZW1vdmUiLCJ1cCIgYW5kICJkb3duIiBidXR0b24KLQkJCQkJLy8KLQkJCQkJaWYocmVtb3ZlQnV0dG9uLmlzRW5hYmxlZCgpKSByZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCWlmKHVwQnV0dG9uLmlzRW5hYmxlZCgpKSB1cEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJaWYoZG93bkJ1dHRvbi5pc0VuYWJsZWQoKSkgZG93bkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZighcmVtb3ZlQnV0dG9uLmlzRW5hYmxlZCgpKSByZW1vdmVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJaWYoIXVwQnV0dG9uLmlzRW5hYmxlZCgpKSB1cEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQlpZighZG93bkJ1dHRvbi5pc0VuYWJsZWQoKSkgZG93bkJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCQotCQl9KTsKLQkJCi0JCi0JCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gd2JzU2VsZWN0ZWRDb2x1bW5zVGFibGUuc2V0SXRlbXMobmV3IFN0cmluZ1tdIHsKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCwKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4sCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORywKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8sCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRSwKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlMsCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUsCi0JCS8vIH0pOwotCi0JCS8vIENUYWJJdGVtIHRhYkl0ZW0gPSBuZXcgQ1RhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCS8vIHRhYkl0ZW0uc2V0VGV4dCgiV29yayBCcmVha2Rvd24gU3RydWN0dXJlIik7Ci0JCS8vIHRhYkl0ZW0uc2V0Q29udHJvbCh3YnNTZWxlY3RlZENvbHVtbnNUYWJsZS5nZXRDb250cm9sKCkpOwotCi0JCS8vIHRic1NlbGVjdGVkQ29sTGlzdCA9IG5ldyBMaXN0Vmlld2VyKGNvbHVtbnNDb21wb3NpdGUsIFNXVC5DSEVDSyB8Ci0JCS8vIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQkvLyB0YnNTZWxlY3RlZENvbExpc3Quc2V0Q29udGVudFByb3ZpZGVyKGl0ZW1Qcm92aWRlcik7Ci0JCS8vIHRic1NlbGVjdGVkQ29sTGlzdC5zZXRMYWJlbFByb3ZpZGVyKGl0ZW1Qcm92aWRlcik7Ci0JCS8vIHRic1NlbGVjdGVkQ29sTGlzdC5zZXRJbnB1dCh0YnNDb2x1bW5EZXNjcmlwdG9ycyk7Ci0JCS8vIHRic1NlbGVjdGVkQ29sTGlzdC5zZXRJdGVtcyhuZXcgU3RyaW5nW10gewotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX0lELAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8sCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRSwKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVGSVgsCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfVFlQRSwKLQkJLy8gfSk7Ci0JCS8vIHRhYkl0ZW0gPSBuZXcgQ1RhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCS8vIHRhYkl0ZW0uc2V0VGV4dCgiVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIik7Ci0JCS8vIHRhYkl0ZW0uc2V0Q29udHJvbCh0YnNTZWxlY3RlZENvbExpc3QuZ2V0Q29udHJvbCgpKTsKLQotCQkvLyB3cGJzU2VsZWN0ZWRDb2xMaXN0ID0gbmV3IExpc3RWaWV3ZXIoY29sdW1uc0NvbXBvc2l0ZSwgU1dULkNIRUNLIHwKLQkJLy8gU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCS8vIHdwYnNTZWxlY3RlZENvbExpc3Quc2V0Q29udGVudFByb3ZpZGVyKGl0ZW1Qcm92aWRlcik7Ci0JCS8vIHdwYnNTZWxlY3RlZENvbExpc3Quc2V0TGFiZWxQcm92aWRlcihpdGVtUHJvdmlkZXIpOwotCQkvLyB3cGJzU2VsZWN0ZWRDb2xMaXN0LnNldElucHV0KHdwYnNDb2x1bW5EZXNjcmlwdG9ycyk7Ci0JCS8vIHRhYkl0ZW0gPSBuZXcgQ1RhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCS8vIHRhYkl0ZW0uc2V0VGV4dCgiV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUiKTsKLQkJLy8gdGFiSXRlbS5zZXRDb250cm9sKHdwYnNTZWxlY3RlZENvbExpc3QuZ2V0Q29udHJvbCgpKTsKLQotCQlDb21wb3NpdGUgYnV0dG9uc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUobGlzdENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlidXR0b25zQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMTAwOwotCQlidXR0b25zQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCUdyaWREYXRhIGxheW91dERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCi0JCWFkZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlhZGRCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuQUREX0JVVFRPTl9URVhUKTsKLQkJYWRkQnV0dG9uLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCWFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpbnQgaWQgPSBic0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJT2JqZWN0IGlucHV0ID0gQUxMX0NPTFVNTl9ERVNDUklQVE9SX0xJU1RTW2lkXTsKLQkJCQlmaW5hbCBMaXN0IHNlbGVjdGVkQ29sdW1ucyA9IGNvbHVtbkRlc2NyaXB0b3JMaXN0c1tpZF07Ci0JCQkJTGlzdFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgTGlzdFNlbGVjdGlvbkRpYWxvZygKLQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJCQlpbnB1dCwKLQkJCQkJCWl0ZW1Qcm92aWRlciwKLQkJCQkJCWl0ZW1Qcm92aWRlciwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNlbGVjdENvbHVtbnN0b0FkZF90ZXh0KSB7IAotCQkJCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCQkJCUNvbnRyb2wgY29udHJvbCA9IHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJCQkJCWdldFZpZXdlcigpLmFkZEZpbHRlcihuZXcgVmlld2VyRmlsdGVyKCkgewotCi0JCQkJCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsCi0JCQkJCQkJCQlPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJCQkJcmV0dXJuICFzZWxlY3RlZENvbHVtbnMuY29udGFpbnMoZWxlbWVudCk7Ci0JCQkJCQkJfQotCi0JCQkJCQl9KTsKLQkJCQkJCXJldHVybiBjb250cm9sOwotCQkJCQl9Ci0KLQkJCQl9OwotCQkJCWlmIChkbGcub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCQlzZWxlY3RlZENvbHVtbnMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZGxnLmdldFJlc3VsdCgpKSk7Ci0JCQkJCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0pOwotCi0JCXJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlyZW1vdmVCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5yZW1vdmVCdXR0b25fdGV4dCk7IAotCQlyZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJamF2YS51dGlsLkxpc3QgY29sdW1ucyA9IChqYXZhLnV0aWwuTGlzdCkgc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyCi0JCQkJCQkuZ2V0SW5wdXQoKTsKLQkJCQlMaXN0IHJlbW92ZUxpc3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSkudG9MaXN0KCk7Ci0JCQkJaWYgKHJlbW92ZUxpc3QuY29udGFpbnMoUHJvY2Vzc0VkaXRvci5DT0xfREVTQ19JRCkKLQkJCQkJCXx8IHJlbW92ZUxpc3QKLQkJCQkJCQkJLmNvbnRhaW5zKFByb2Nlc3NFZGl0b3IuQ09MX0RFU0NfUFJFU0VOVEFUSU9OX05BTUUpKSB7Ci0JCQkJCS8vIGNhbm5vdCByZW1vdmUgbmFtZSBvciBJRCBjb2x1bW4KLQkJCQkJLy8KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQljb2x1bW5zLnJlbW92ZUFsbChyZW1vdmVMaXN0KTsKLQkJCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCi0JCX0pOwotCi0JCXVwQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXVwQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LlVQX0JVVFRPTl9URVhUKTsKLQkJdXBCdXR0b24uc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJdXBCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkKLQkJCQkJcmV0dXJuOwotCQkJCUVMaXN0IGNvbHVtbnMgPSAoRUxpc3QpIHNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5nZXRJbnB1dCgpOwotCQkJCU9iamVjdCBzZWxlY3RlZCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlpbnQgaWQgPSBjb2x1bW5zLmluZGV4T2Yoc2VsZWN0ZWQpOwotCQkJCWlmIChic0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMCAmJiBpZCA8IDMpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAoYnNDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID4gMCAmJiBpZCA8IDIpCi0JCQkJCXJldHVybjsKLQkJCQljb2x1bW5zLm1vdmUoaWQgLSAxLCBpZCk7Ci0JCQkJc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyLnJlZnJlc2goKTsKLQkJCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJc2VsZWN0ZWQpLCB0cnVlKTsKLQkJCX0KLQotCQl9KTsKLQotCQlkb3duQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWRvd25CdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuRE9XTl9CVVRUT05fVEVYVCk7Ci0JCWRvd25CdXR0b24uc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJZG93bkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKQotCQkJCQlyZXR1cm47Ci0JCQkJRUxpc3QgY29sdW1ucyA9IChFTGlzdCkgc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyLmdldElucHV0KCk7Ci0JCQkJT2JqZWN0IHNlbGVjdGVkID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWludCBpZCA9IGNvbHVtbnMuaW5kZXhPZihzZWxlY3RlZCk7Ci0JCQkJCi0JCQkJaWYgKGlkID09IGNvbHVtbnMuc2l6ZSgpIC0gMSB8fCAoYnNDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID09IDAgJiYgaWQgPCAyKSkKLQkJCQkJcmV0dXJuOwotCQkJCWlmIChpZCA9PSBjb2x1bW5zLnNpemUoKSAtIDEgfHwgKGJzQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAgJiYgaWQgPCAxKSkKLQkJCQkJcmV0dXJuOwotCQkJCWNvbHVtbnMubW92ZShpZCArIDEsIGlkKTsKLQkJCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIucmVmcmVzaCgpOwotCQkJCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQlzZWxlY3RlZCksIHRydWUpOwotCQkJfQotCi0JCX0pOwotCi0JCUdyb3VwIGNvbmZpZ1N3aXRjaEdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULlNIQURPV19PVVQpOwotCQljb25maWdTd2l0Y2hHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJY29uZmlnU3dpdGNoR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWNvbmZpZ1N3aXRjaEdyb3VwCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N3aXRjaENvbmZpZ3VyYXRpb24pOyAKLQotCQljb25maWdTd2l0Y2hBbHdheXNCdXR0b24gPSBuZXcgQnV0dG9uKGNvbmZpZ1N3aXRjaEdyb3VwLCBTV1QuUkFESU8pOwotCQljb25maWdTd2l0Y2hBbHdheXNCdXR0b24uc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMuYWx3YXlzQnV0dG9uX3RleHQpOwotCQljb25maWdTd2l0Y2hOZXZlckJ1dHRvbiA9IG5ldyBCdXR0b24oY29uZmlnU3dpdGNoR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWNvbmZpZ1N3aXRjaE5ldmVyQnV0dG9uLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLm5ldmVyQnV0dG9uX3RleHQpOwotCQljb25maWdTd2l0Y2hQcm9tcHRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbmZpZ1N3aXRjaEdyb3VwLCBTV1QuUkFESU8pOwotCQljb25maWdTd2l0Y2hQcm9tcHRCdXR0b24uc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMucHJvbXB0QnV0dG9uX3RleHQpOwotCi0JCXNldFN3aXRjaENvbmZpZ0J1dHRvbihMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRTd2l0Y2hDb25maWcoKSk7Ci0KLQkJLy8gaW5oZXJpdCBzdXBwcmVzc2lvbiBzdGF0ZXMKLQkJR3JvdXAgc3VwcHJlc3Npb25Hcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5TSEFET1dfT1VUKTsKLQkJc3VwcHJlc3Npb25Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXN1cHByZXNzaW9uR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXN1cHByZXNzaW9uR3JvdXAKLQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3VwcHJlc3Npb25Hcm91cFRpdGxlKTsgCi0KLQkJaW5oZXJpdFN1cHByZXNzaW9uQnV0dG9uID0gbmV3IEJ1dHRvbihzdXBwcmVzc2lvbkdyb3VwLCBTV1QuQ0hFQ0spOwotCQlpbmhlcml0U3VwcHJlc3Npb25CdXR0b24KLQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfaW5oZXJpdFN1cHByZXNzaW9uU3RhdGUpOyAKLQotCQlpbmhlcml0U3VwcHJlc3Npb25CdXR0b24uc2V0U2VsZWN0aW9uKGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oCi0JCQkJQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfSU5IRVJJVF9TVVBQUkVTU0lPTl9TVEFURSkpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIExvYWRzIGRhdGEgZnJvbSBwcmVmZXJlbmNlIHN0b3JlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXREYXRhKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJU3RyaW5nIHN0ciA9IHN0b3JlCi0JCQkJLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUyk7Ci0JCWlmIChzdHIgPT0gbnVsbCkgewotCQkJc3RyID0gc3RvcmUKLQkJCQkJLmdldERlZmF1bHRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpOwotCQl9Ci0JCXdic0NvbHVtbkRlc2NyaXB0b3JzID0gUHJvY2Vzc0VkaXRvci50b0NvbHVtbkRlc2NyaXB0b3JMaXN0KHN0cik7Ci0KLQkJc3RyID0gc3RvcmUuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1RCU19DT0xVTU5TKTsKLQkJaWYgKHN0ciA9PSBudWxsKSB7Ci0JCQlzdHIgPSBzdG9yZQotCQkJCQkuZ2V0RGVmYXVsdFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUyk7Ci0JCX0KLQkJdGJzQ29sdW1uRGVzY3JpcHRvcnMgPSBQcm9jZXNzRWRpdG9yLnRvQ29sdW1uRGVzY3JpcHRvckxpc3Qoc3RyKTsKLQotCQlzdHIgPSBzdG9yZS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV1BCU19DT0xVTU5TKTsKLQkJaWYgKHN0ciA9PSBudWxsKSB7Ci0JCQlzdHIgPSBzdG9yZQotCQkJCQkuZ2V0RGVmYXVsdFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XUEJTX0NPTFVNTlMpOwotCQl9Ci0JCXdwYnNDb2x1bW5EZXNjcmlwdG9ycyA9IFByb2Nlc3NFZGl0b3IudG9Db2x1bW5EZXNjcmlwdG9yTGlzdChzdHIpOwotCi0JCS8vIGxvYWQgYW5kIHNldCB0byB0aGUgZGVmYXVsdCBpZiBub3RoaW5nIGluIHRoZSBzdG9yZQotCQkvLyAxNTQ3NTggLSBQcm9jZXNzZXM6IFdCUyBpcyBibGFuayBhcyBkZWZhdWx0IHByZWZlcmVuY2UgaXMgbm90IHNldCBmb3IgdGhlIGZpcnN0IHRpbWUKLQkJaWYgKCB3YnNDb2x1bW5EZXNjcmlwdG9ycy5zaXplKCkgPT0gMCApIHsKLQkJCXdic0NvbHVtbkRlc2NyaXB0b3JzLmFkZEFsbChQcm9jZXNzRWRpdG9yLkRFRkFVTFRfV0JTX0NPTFVNTlMpOwotCQkJc3RvcmUuc2V0VmFsdWUoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMsCi0JCQkJCXRvU3RyaW5nKHdic0NvbHVtbkRlc2NyaXB0b3JzKSk7Ci0JCQotCQl9Ci0JCQotCQlpZiAoIHRic0NvbHVtbkRlc2NyaXB0b3JzLnNpemUoKSA9PSAwICkgewotCQkJdGJzQ29sdW1uRGVzY3JpcHRvcnMuYWRkQWxsKFByb2Nlc3NFZGl0b3IuREVGQVVMVF9UQlNfQ09MVU1OUyk7Ci0JCQlzdG9yZS5zZXRWYWx1ZShBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUywKLQkJCQkJdG9TdHJpbmcodGJzQ29sdW1uRGVzY3JpcHRvcnMpKTsKLQkJfQotCQkKLQkJaWYgKCB3cGJzQ29sdW1uRGVzY3JpcHRvcnMuc2l6ZSgpID09IDAgKSB7Ci0JCQl3cGJzQ29sdW1uRGVzY3JpcHRvcnMuYWRkQWxsKFByb2Nlc3NFZGl0b3IuREVGQVVMVF9XUEJTX0NPTFVNTlMpOwotCQkJc3RvcmUuc2V0VmFsdWUoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV1BCU19DT0xVTU5TLAotCQkJCQl0b1N0cmluZyh3cGJzQ29sdW1uRGVzY3JpcHRvcnMpKTsKLQkJfQotCQkKLQkJY29sdW1uRGVzY3JpcHRvckxpc3RzID0gbmV3IExpc3RbXSB7IHdic0NvbHVtbkRlc2NyaXB0b3JzLAotCQkJCXRic0NvbHVtbkRlc2NyaXB0b3JzLCB3cGJzQ29sdW1uRGVzY3JpcHRvcnMgfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UucGVyZm9ybURlZmF1bHRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQotCQl3YnNDb2x1bW5EZXNjcmlwdG9ycy5jbGVhcigpOwotCQl3YnNDb2x1bW5EZXNjcmlwdG9ycy5hZGRBbGwoUHJvY2Vzc0VkaXRvci5ERUZBVUxUX1dCU19DT0xVTU5TKTsKLQotCQl0YnNDb2x1bW5EZXNjcmlwdG9ycy5jbGVhcigpOwotCQl0YnNDb2x1bW5EZXNjcmlwdG9ycy5hZGRBbGwoUHJvY2Vzc0VkaXRvci5ERUZBVUxUX1RCU19DT0xVTU5TKTsKLQotCQl3cGJzQ29sdW1uRGVzY3JpcHRvcnMuY2xlYXIoKTsKLQkJd3Bic0NvbHVtbkRlc2NyaXB0b3JzLmFkZEFsbChQcm9jZXNzRWRpdG9yLkRFRkFVTFRfV1BCU19DT0xVTU5TKTsKLQotCQlpbmhlcml0U3VwcHJlc3Npb25CdXR0b24KLQkJCQkuc2V0U2VsZWN0aW9uKGdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJCQkuZ2V0RGVmYXVsdEJvb2xlYW4oCi0JCQkJCQkJCUFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0lOSEVSSVRfU1VQUFJFU1NJT05fU1RBVEUpKTsKLQotCQlzZXRTd2l0Y2hDb25maWdCdXR0b24oTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuUFJPTVBUKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlzdG9yZS5zZXRWYWx1ZShBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUywKLQkJCQl0b1N0cmluZyh3YnNDb2x1bW5EZXNjcmlwdG9ycykpOwotCQlzdG9yZS5zZXRWYWx1ZShBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUywKLQkJCQl0b1N0cmluZyh0YnNDb2x1bW5EZXNjcmlwdG9ycykpOwotCQlzdG9yZS5zZXRWYWx1ZShBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XUEJTX0NPTFVNTlMsCi0JCQkJdG9TdHJpbmcod3Bic0NvbHVtbkRlc2NyaXB0b3JzKSk7Ci0JCXN0b3JlLnNldFZhbHVlKAotCQkJCUFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0lOSEVSSVRfU1VQUFJFU1NJT05fU1RBVEUsCi0JCQkJaW5oZXJpdFN1cHByZXNzaW9uQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJLy8gc3dpdGNoIGNvbmZpZyBwcmVmZXJlbmNlIGlzIGluIGxpYnJhcnkudWkKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2V0U3dpdGNoQ29uZmlnKGdldFN3aXRjaENvbmZpZ1ZhbHVlKCkpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIGdpdmVuIGxpc3QgaW50byBzdHJpbmcgcmVwcmVzZW50YXRpb24KLQkgKiBAcGFyYW0gY29sdW1uRGVzY3JpcHRvcnMKLQkgKiBAcmV0dXJuIAotCSAqIAkJCVN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gbGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGphdmEudXRpbC5MaXN0IGNvbHVtbkRlc2NyaXB0b3JzKSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBtYXggPSBjb2x1bW5EZXNjcmlwdG9ycy5zaXplKCkgLSAxOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlzdHJCdWYuYXBwZW5kKCgoQ29sdW1uRGVzY3JpcHRvcikgY29sdW1uRGVzY3JpcHRvcnMuZ2V0KGkpKS5pZCkKLQkJCQkJLmFwcGVuZCgnLCcpOwotCQl9Ci0JCXN0ckJ1Zi5hcHBlbmQoKChDb2x1bW5EZXNjcmlwdG9yKSBjb2x1bW5EZXNjcmlwdG9ycy5nZXQobWF4KSkuaWQpOwotCQlyZXR1cm4gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyI21vZGlmeVRleHQoTW9kaWZ5RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3dpdGNoQ29uZmlnVmFsdWUoKSB7Ci0JCWlmIChjb25maWdTd2l0Y2hBbHdheXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0JCQlyZXR1cm4gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuQUxXQVlTOwotCQlpZiAoY29uZmlnU3dpdGNoTmV2ZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0JCQlyZXR1cm4gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuTkVWRVI7Ci0JCWlmIChjb25maWdTd2l0Y2hQcm9tcHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0JCQlyZXR1cm4gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuUFJPTVBUOwotCi0JCS8vIHJldHVybiBQcm9tcHQgdmFsdWUgYXMgYSBkZWZhdWx0Ci0JCXJldHVybiBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5QUk9NUFQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFN3aXRjaENvbmZpZ0J1dHRvbihTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLkFMV0FZUy5lcXVhbHModmFsdWUpKSB7Ci0JCQljb25maWdTd2l0Y2hBbHdheXNCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJY29uZmlnU3dpdGNoTmV2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWNvbmZpZ1N3aXRjaFByb21wdEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9IGVsc2UgaWYgKE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLk5FVkVSLmVxdWFscyh2YWx1ZSkpIHsKLQkJCWNvbmZpZ1N3aXRjaEFsd2F5c0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJY29uZmlnU3dpdGNoTmV2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJY29uZmlnU3dpdGNoUHJvbXB0QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0gZWxzZSB7IC8vIE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLlBST01QVAotCQkJY29uZmlnU3dpdGNoQWx3YXlzQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQljb25maWdTd2l0Y2hOZXZlckJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJY29uZmlnU3dpdGNoUHJvbXB0QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwdWJsaWMgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCQotCQkvLyBjaGFuZ2UgdG8gdXNlIExpYnJhcnlQbHVnaW4gc3RvcmUKLQkJLy8gd2UgbmVlZCB0byBzaGFyZSB0aGUgcHJlZmVyZW5jZSBpbiBMaWJyYXJ5IGJyb3dzaW5nIGFuZCBwdWJsaXNoaW5nCi0JCS8vIEppbmh1YSBYaSAwOC8xOS8yMDA2Ci0JCS8vIGNoYW5nZWQgdG8gdXNlIENvbW1vblVJUGx1Z2luIHN0b3JlCi0JCUlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHdyYXBwZXIgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJaWYgKCB3cmFwcGVyIGluc3RhbmNlb2YgUHJlZmVyZW5jZVN0b3JlV3JhcHBlciApIHsKLQkJCXJldHVybiAoKFByZWZlcmVuY2VTdG9yZVdyYXBwZXIpd3JhcHBlcikuZ2V0U3RvcmUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL1Jvb3RQcmVmUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9Sb290UHJlZlBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTllZGUzNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL1Jvb3RQcmVmUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQ29tbW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5QcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotCi0vKioKLSAqIFJvb3QgcHJlZmVyZW5jZSBwYWdlCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9vdFByZWZQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cwotCQlJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29tcG9zaXRlX3RhYjsKLQotCS8vIHByaXZhdGUgSVdvcmtiZW5jaCB3b3JrYmVuY2g7Ci0KLQkvLyBEaXNhYmxlaW5nIGVuYWJsZSBwcm9jZXNzIGNvbnRyaWJ1dGlvbiBwcmVmZXJlbmNlIGZvciBub3cuCi0JLy8gcHJpdmF0ZSBCdXR0b24gZW5hYmxlUHJvY2Vzc0NvbnRyaWJ1dGlvbjsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCS8vIGNvbXBvc2l0ZV90YWIgPDwgcGFyZW50Ci0JCWNvbXBvc2l0ZV90YWIgPSBjcmVhdGVDb21wb3NpdGUocGFyZW50LCAzKTsKLQotCQkvLyBlbmFibGVQcm9jZXNzQ29udHJpYnV0aW9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGVfdGFiLCBTV1QuQ0hFQ0spOwotCQkvLyBlbmFibGVQcm9jZXNzQ29udHJpYnV0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS5Sb290UHJlZlBhZ2UuZW5hYmxlcHJvY2Vzc2NvbnRyaWJ1dGlvbi50ZXh0IikpOwotCQkvLyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdGlhbGl6ZVZhbHVlcygpOwotCi0JCS8vIGZvbnQgPSBudWxsOwotCQlyZXR1cm4gY29tcG9zaXRlX3RhYjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQkvLyB0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFByZWZlcmVuY2VQYWdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJc3RvcmVWYWx1ZXMoKTsKLQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNkb0dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHdyYXBwZXIgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJaWYgKCB3cmFwcGVyIGluc3RhbmNlb2YgUHJlZmVyZW5jZVN0b3JlV3JhcHBlciApIHsKLQkJCXJldHVybiAoKFByZWZlcmVuY2VTdG9yZVdyYXBwZXIpd3JhcHBlcikuZ2V0U3RvcmUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTdG9yZXMgdGhlIHZhbHVlcyBvZiB0aGUgY29udHJvbHMgYmFjayB0byB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyB1c2luZyBkZWZhdWx0IHZhbHVlcyBpbiB0aGUgcHJlZmVyZW5jZQotCSAqIHN0b3JlLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRGVmYXVsdHMoKSB7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvLyBwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3BhbikgewotCS8vIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCS8vIGxhYmVsLnNldFRleHQodGV4dCk7Ci0JLy8gR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCS8vIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCS8vIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JLy8gbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkvLyByZXR1cm4gbGFiZWw7Ci0JLy8gfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGI1MzkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgcHJlZmVyZW5jZSBzdXBwb3J0IGZvciB0aGUgQXV0aG9yaW5nIFVJLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BYnN0cmFjdFNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BYnN0cmFjdFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY2N2UxMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWJzdHJhY3RTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMuSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllcy50YWJiZWQudmlldy5UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgYSBzZWN0aW9uIGluIGEgdGFiIGluIHRoZSBwcm9wZXJ0aWVzIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5U2VjdGlvbiBpbXBsZW1lbnRzCi0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlZGl0YWJsZSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHBhZ2U7Ci0KLQlwcm90ZWN0ZWQgUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSBuZXcgUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcigKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0KLQlwcm90ZWN0ZWQgTG9nZ2VyIGxvZ2dlcjsKLQotCS8qCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlCi0JICovCi0JcHVibGljIEFic3RyYWN0U2VjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQotCQkvLyBsaXN0ZW4gdG8gY2hhbmdlIGZvciBjdXJyZW50IHNlbGVjdGlvbiBvZiBNZXRob2RDb25maWd1cmF0aW9uCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5hZGRMaXN0ZW5lcihsaWJyYXJ5TGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gZ2V0IGxvZ2dlcgotCQlsb2dnZXIgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5BYnN0cmFjdFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wLCBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKGNvbXAsIHBhZ2UpOwotCQl0aGlzLnBhZ2UgPSBwYWdlOwotCX0KLQotCXByaXZhdGUgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaWJyYXJ5TGlzdGVuZXIgPSBuZXcgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2hhbmdlZChpbnQgb3B0aW9uLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJCXN3aXRjaCAob3B0aW9uKSB7Ci0JCQljYXNlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQ6IHsKLQkJCQlzZWN0aW9uUmVmcmVzaCgpOwotCQkJfQotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIFJlZnJlc2ggdGhlIGN1cnJlbnQgc2VjdGlvbgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBzZWN0aW9uUmVmcmVzaCgpIHsKLQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJVGFiIHRhYiA9IHBhZ2UuZ2V0Q3VycmVudFRhYigpOwotCQkJaWYgKHRhYiAhPSBudWxsKSB7Ci0JCQkJSVNlY3Rpb24gc2VjdGlvbiA9IHRhYi5nZXRTZWN0aW9uQXRJbmRleCgwKTsKLQotCQkJCWlmICgoc2VjdGlvbiAhPSBudWxsKQotCQkJCQkJJiYgKHNlY3Rpb24gaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24pKSB7Ci0JCQkJCXNlY3Rpb24ucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24jZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAobGlicmFyeUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQltYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKGxpYnJhcnlMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24jc2V0SW5wdXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlci5zZXRJbnB1dChwYXJ0LCBzZWxlY3Rpb24pOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNldElucHV0OjpzZWxlY3Rpb24gLSAiK3NlbGVjdGlvbik7Ci0JCUFzc2VydC5pc1RydWUoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQlPYmplY3QgaW5wdXQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCi0JCWluaXRFbGVtZW50RGF0YShpbnB1dCk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdEVsZW1lbnREYXRhKE9iamVjdCBpbnB1dCkgewotCi0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCXRoaXMuZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBpbnB1dDsKLQkJCWlmIChUbmdVdGlsLmlzTG9ja2VkKHRoaXMuZWxlbWVudCkpCi0JCQkJdGhpcy5lZGl0YWJsZSA9IGZhbHNlOwotCQkJZWxzZSB7Ci0JCQkJdGhpcy5lZGl0YWJsZSA9IHRydWU7Ci0KLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJCQlpZiAoKHJvbGVEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpCi0JCQkJCQkJfHwgKHJvbGVEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpKQotCQkJCQkJdGhpcy5lZGl0YWJsZSA9IGZhbHNlOwotCQkJCQllbHNlCi0JCQkJCQl0aGlzLmVkaXRhYmxlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJdGhpcy5lbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIExpYnJhcnlVdGlsLnVud3JhcChpbnB1dCk7Ci0JCQl0aGlzLmVkaXRhYmxlID0gZmFsc2U7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFJldHVybiBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBFUEZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gZmlyc3QgZWxlbWVudCBmcm9tIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW5wdXQoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJT2JqZWN0IGlucHV0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCXJldHVybiBpbnB1dDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gcHJvY2VzcyBlZGl0b3IKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQlwcm9jZXNzIGVkaXRvcgotCSAqLwotCXB1YmxpYyBQcm9jZXNzRWRpdG9yIGdldEVkaXRvcigpIHsKLQkJcmV0dXJuIEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEVkaXRvcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBJdGVtUHJvdmlkZXIKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQkJYWRhcHRlcgotCSAqLwotCXB1YmxpYyBJdGVtUHJvdmlkZXJBZGFwdGVyIGdldEFkYXB0ZXIoKSB7Ci0JCXRyeSB7Ci0JCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgcHJvdmlkZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgZmFjdG9yeS5hZGFwdCgKLQkJCQkJZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXJldHVybiBwcm92aWRlcjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBBZGFwdGVyIGZhY3RvcnkKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQkJYWRhcHRlciBmYWN0b3J5Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IEVQRlByb3BlcnR5U2hlZXRQYWdlCi0JCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGVsZW1lbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCU9iamVjdCBpbnB1dCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImdldEVsZW1lbnQ6OnNlbGVjdGlvbiAtICIrc2VsZWN0aW9uKTsKLQkJCXRyeSB7Ci0JCQkJaW5pdEVsZW1lbnREYXRhKGlucHV0KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJbG9nZ2VyCi0JCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCSJFcnJvciBnZXR0aW5nIGVsZW1lbnQgZnJvbSB0aGUgc2VsZWN0aW9uICIgKyBlbGVtZW50LCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHByb3BlcnR5IHNoZWV0IHBhZ2UKLQkgKiBAcmV0dXJuCi0JICogCQkJcHJvcGVydHkgc2hlZXQgcGFnZQotCSAqLwotCXB1YmxpYyBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcm9lcHJ0eUNoYW5nZUV2ZW50IiArIGV2dCk7Ci0JCXJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gZmlsdGVyIGxpc3Qgb2YgZWxlbWVudHMuIEZpbHRlciBpcyBiYXNlZCBvbiBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGxpc3QKLQkgKiAJCQlPcmlnaW5hbCBsaXN0Ci0JICogQHJldHVybgotCSAqIAkJCWZpbHRlcmVkIGxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRGaWx0ZXJlZExpc3QoTGlzdCBsaXN0KSB7Ci0JCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCWlmIChjb25maWd1cmF0b3IgIT0gbnVsbCkgewotCQkJCU9iamVjdCBvYmogPSAoT2JqZWN0KSBpdG9yLm5leHQoKTsKLQkJCQljb25maWd1cmF0b3Iuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZQotCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJaWYgKGNvbmZpZ3VyYXRvci5hY2NlcHQob2JqKSkgewotCQkJCQluZXdMaXN0LmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3TGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgZGVmYXVsdCBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gCi0JICogCQkJZGVmYXVsdCBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGdldERlZmF1bHRDb25maWd1cmF0aW9uKCkgewotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgZ2V0QWRhcHRlcigpOwotCQlPYmplY3QgcGFyZW50ID0gbnVsbDsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCUlCU0l0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXI7Ci0JCQlwYXJlbnQgPSBic0l0ZW1Qcm92aWRlci5nZXRUb3BJdGVtKCk7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSBwYXJlbnQpCi0JCQkJCS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJcmV0dXJuIGNvbmZpZzsKLQkJfSBlbHNlIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoIkFic3RyYWN0U2VjdGlvbjo6Z2V0RGVmYXVsdENvbmZpZ3VyYXRpb24gLSBJQlNJdGVtUHJvdmlkZXIgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHJldHVybgotCSAqIAkJCWN1cnJlbnQgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQkvLyBpZiBjb25maWd1cmF0aW9uIGlzIG5vdCBzZWxlY3RlZCwgdXNlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCQkJcmV0dXJuIGdldERlZmF1bHRDb25maWd1cmF0aW9uKCk7Ci0JCX0KLQotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCi0JLy8gcHVibGljIHZvaWQgdXBkYXRlVGl0bGUoT2JqZWN0IG9iaikKLQkvLyB7Ci0JLy8gU3RyaW5nIG5hbWUgPSBnZXROYW1lUHJlZml4KCkgKyAoKEJyZWFrZG93bkVsZW1lbnQpb2JqKS5nZXROYW1lKCk7Ci0JLy8gVGFiYmVkUHJvcGVydHlDb21wb3NpdGUgY29tcCA9IChUYWJiZWRQcm9wZXJ0eUNvbXBvc2l0ZSkKLQkvLyBwYWdlLmdldENvbnRyb2woKTsKLQkvLyBUYWJiZWRQcm9wZXJ0eVRpdGxlIHRpdGxlID0gY29tcC5nZXRUaXRsZSgpOwotCS8vIGlmICh0aXRsZUltYWdlID09IG51bGwpCi0JLy8gewotCS8vIHRpdGxlSW1hZ2UgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLmdldEltYWdlKCk7Ci0JLy8gfQotCS8vIHRpdGxlLnNldFRpdGxlKG5hbWUsIHRpdGxlSW1hZ2UpOwotCS8vIH0KLQkKLQkKLQkKLQkvKioKLQkgKiBHZXQgbmFtZSBwcmVmaXggZm9yIHRoZSBlbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lUHJlZml4KCkgewotCQlyZXR1cm4gIlByb2Nlc3NFbGVtZW50OiAiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5RG9jdW1lbnRTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlEb2N1bWVudFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFiZDhhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlEb2N1bWVudFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuUmljaFRleHRJbWFnZUxpbmtDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLnZpZXcuVGFiYmVkUHJvcGVydHlDb21wb3NpdGU7Ci0KLQotLyoqCi0gKiBUaGUgZG9jdW1lbnQgdGFiIGZvciBBY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURvY3VtZW50U2VjdGlvbiBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24gewotCi0JcHJvdGVjdGVkIEFjdGl2aXR5IGVsZW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IG1haW5EZXNjVGV4dDsKLQkKLQlwcm90ZWN0ZWQgUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIgbWFpbkRlc2NDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IHB1cnBvc2VUZXh0OwotCQotCXByb3RlY3RlZCBSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lciBwdXJwb3NlQ29udGFpbmVyOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBhbHRlcm5hdGl2ZXNUZXh0OwotCQotCXByb3RlY3RlZCBSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lciBhbHRlcm5hdGl2ZXNDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGhvd1RvU3RhZmZUZXh0OwotCQotCXByb3RlY3RlZCBSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lciBob3dUb1N0YWZmQ29udGFpbmVyOwotCi0JcHJpdmF0ZSBMaXN0ZW5lciBwdXJwb3NlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZXhwYW5kRmxhZyA/IGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJOiBwdXJwb3NlVGV4dDsKLQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKEFjdGl2aXR5RGVzY3JpcHRpb24pIGVsZW1lbnQKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRQdXJwb3NlKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJcHVycG9zZVRleHQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlbGVtZW50Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCksIG5ld0NvbnRlbnQsIC0xKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIExpc3RlbmVyIG1haW5EZXNjTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZXhwYW5kRmxhZyA/IGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJOiBtYWluRGVzY1RleHQ7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChBY3Rpdml0eURlc2NyaXB0aW9uKSBlbGVtZW50Ci0JCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJbWFpbkRlc2NUZXh0LCBvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSwgbmV3Q29udGVudCwKLQkJCQkJCS0xKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIExpc3RlbmVyIGFsdGVybmF0aXZlc0xpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0JCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGV4cGFuZEZsYWcgPyBjdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCTogYWx0ZXJuYXRpdmVzVGV4dDsKLQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKEFjdGl2aXR5RGVzY3JpcHRpb24pIGVsZW1lbnQKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRBbHRlcm5hdGl2ZXMoKTsKLQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQlhbHRlcm5hdGl2ZXNUZXh0LCBvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCksIG5ld0NvbnRlbnQsIC0xKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIExpc3RlbmVyIGhvd1RvU3RhZmZMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZWxlbWVudCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBleHBhbmRGbGFnID8gY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQk6IGhvd1RvU3RhZmZUZXh0OwotCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9ICgoQWN0aXZpdHlEZXNjcmlwdGlvbikgZWxlbWVudAotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldEhvd3RvU3RhZmYoKTsKLQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQlob3dUb1N0YWZmVGV4dCwgb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKSwgbmV3Q29udGVudCwgLTEpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNjcmVhdGVEb2N1bWVudFNlY3Rpb24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURvY3VtZW50U2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWludCBtYWluRGVzY2hlaWdodEhpbnQgPSAxMDA7Ci0KLQkJc3VwZXIuY3JlYXRlRG9jdW1lbnRTZWN0aW9uKGNvbXBvc2l0ZSk7Ci0KLQkJLy8gbWFpbiBkZXNjcmlwdGlvbgotCQltYWluRGVzY0NvbnRhaW5lciA9IEZvcm1VSS5jcmVhdGVSaWNoVGV4dFdpdGhMaW5rKHRvb2xraXQsCi0JCQkJZG9jdW1lbnRDb21wb3NpdGUsIG1haW5EZXNjaGVpZ2h0SGludCwgY29udGVudEVsZW1lbnRQYXRoLCBlbGVtZW50LAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19tYWluRGVzY3JpcHRpb24pOwotCQlhZGRIeXBlckxpbmtMaXN0ZW5lcihtYWluRGVzY0NvbnRhaW5lci5saW5rKTsKLQkJbWFpbkRlc2NUZXh0ID0gbWFpbkRlc2NDb250YWluZXIucmljaFRleHQ7Ci0KLQkJLy8gcHVycG9zZQotCQlwdXJwb3NlQ29udGFpbmVyID0gRm9ybVVJLmNyZWF0ZVJpY2hUZXh0V2l0aExpbmsodG9vbGtpdCwKLQkJCQlkb2N1bWVudENvbXBvc2l0ZSwgaGVpZ2h0SGludCwgY29udGVudEVsZW1lbnRQYXRoLCBlbGVtZW50LAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19wdXJwb3NlKTsKLQkJYWRkSHlwZXJMaW5rTGlzdGVuZXIocHVycG9zZUNvbnRhaW5lci5saW5rKTsKLQkJcHVycG9zZVRleHQgPSBwdXJwb3NlQ29udGFpbmVyLnJpY2hUZXh0OwotCi0JCS8vIGNyZWF0ZSBhbHRlcm5hdGl2ZXMKLQkJYWx0ZXJuYXRpdmVzQ29udGFpbmVyID0gRm9ybVVJLmNyZWF0ZVJpY2hUZXh0V2l0aExpbmsodG9vbGtpdCwKLQkJCQlkb2N1bWVudENvbXBvc2l0ZSwgaGVpZ2h0SGludCwgY29udGVudEVsZW1lbnRQYXRoLCBlbGVtZW50LAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfYWx0ZXJuYXRpdmVzKTsKLQkJYWRkSHlwZXJMaW5rTGlzdGVuZXIoYWx0ZXJuYXRpdmVzQ29udGFpbmVyLmxpbmspOwotCQlhbHRlcm5hdGl2ZXNUZXh0ID0gYWx0ZXJuYXRpdmVzQ29udGFpbmVyLnJpY2hUZXh0OwotCQkKLQkJLy8gY3JlYXRlIGhvd3RvU3RhZmYKLQkJaG93VG9TdGFmZkNvbnRhaW5lciA9IEZvcm1VSS5jcmVhdGVSaWNoVGV4dFdpdGhMaW5rKHRvb2xraXQsCi0JCQkJZG9jdW1lbnRDb21wb3NpdGUsIGhlaWdodEhpbnQsIGNvbnRlbnRFbGVtZW50UGF0aCwgZWxlbWVudCwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X2hvd1RvU3RhZmYpOwotCQlhZGRIeXBlckxpbmtMaXN0ZW5lcihob3dUb1N0YWZmQ29udGFpbmVyLmxpbmspOwotCQlob3dUb1N0YWZmVGV4dCA9IGhvd1RvU3RhZmZDb250YWluZXIucmljaFRleHQ7Ci0JCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCQkKLQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQkKLQkJcHVycG9zZVRleHQuc2V0TW9kYWxPYmplY3QoZWxlbWVudCk7Ci0JCXB1cnBvc2VUZXh0LnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpKTsKLQkJcHVycG9zZVRleHQuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIHB1cnBvc2VMaXN0ZW5lcik7Ci0JCQotCQltYWluRGVzY1RleHQuc2V0TW9kYWxPYmplY3QoZWxlbWVudCk7Ci0JCW1haW5EZXNjVGV4dC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpKTsKLQkJbWFpbkRlc2NUZXh0LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBtYWluRGVzY0xpc3RlbmVyKTsKLQkJCQkKLQkJYWx0ZXJuYXRpdmVzVGV4dC5zZXRNb2RhbE9iamVjdChlbGVtZW50KTsKLQkJYWx0ZXJuYXRpdmVzVGV4dC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSk7Ci0JCWFsdGVybmF0aXZlc1RleHQuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIGFsdGVybmF0aXZlc0xpc3RlbmVyKTsKLQkJCi0JCWhvd1RvU3RhZmZUZXh0LnNldE1vZGFsT2JqZWN0KGVsZW1lbnQpOwotCQlob3dUb1N0YWZmVGV4dC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3d0b1N0YWZmKCkpOwotCQlob3dUb1N0YWZmVGV4dC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgaG93VG9TdGFmZkxpc3RlbmVyKTsKLQl9Ci0JCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jdXBkYXRlQ29udHJvbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlzdXBlci51cGRhdGVDb250cm9scygpOwotCQlwdXJwb3NlVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCW1haW5EZXNjVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWFsdGVybmF0aXZlc1RleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQlob3dUb1N0YWZmVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCS8vIGhpZGUgZmllbGRzIGZvciB0b3AtbGV2ZWwgcHJvY2Vzc2VzOgotCQlpZiAoUHJvY2Vzc1V0aWwuaXNUb3BQcm9jZXNzKGVsZW1lbnQpKSB7Ci0JCQlicmllZkRlc2NMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWJyaWVmRGVzY1RleHQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlleHRlcm5hbElETGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlleHRlcm5hbElEVGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWtleUNvbnNpZGVyYXRpb25zQ29udGFpbmVyLnNldFZpc2libGUoZmFsc2UpOwotCQkJbWFpbkRlc2NDb250YWluZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlwdXJwb3NlQ29udGFpbmVyLnNldFZpc2libGUoZmFsc2UpOwotCQkJYWx0ZXJuYXRpdmVzQ29udGFpbmVyLnNldFZpc2libGUoZmFsc2UpOwotCQkJaG93VG9TdGFmZkNvbnRhaW5lci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQotCQkJLy8gbW92ZSB1c2FnZSBndWlkYW5jZSB0byBiZSByaWdodCBhZnRlciBwcmVmaXggZmllbGQKLQkJCXVzYWdlR3VpZGFuY2VDb250YWluZXIubW92ZUJlbG93KHByZWZpeFRleHQpOwotCQkJCi0JCX0gZWxzZSB7Ci0JCQlicmllZkRlc2NMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJYnJpZWZEZXNjVGV4dC5zZXRWaXNpYmxlKHRydWUpOwotCQkJZXh0ZXJuYWxJRExhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlleHRlcm5hbElEVGV4dC5zZXRWaXNpYmxlKHRydWUpOwotCQkJa2V5Q29uc2lkZXJhdGlvbnNDb250YWluZXIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCW1haW5EZXNjQ29udGFpbmVyLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlwdXJwb3NlQ29udGFpbmVyLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlhbHRlcm5hdGl2ZXNDb250YWluZXIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWhvd1RvU3RhZmZDb250YWluZXIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCS8vIG1vdmUgdXNhZ2UgZ3VpZGFuY2UgdG8gYmUgcmlnaHQgYWZ0ZXIgZXh0ZXJuYWxJRCBmaWVsZAotCQkJdXNhZ2VHdWlkYW5jZUNvbnRhaW5lci5tb3ZlQmVsb3coZXh0ZXJuYWxJRFRleHQpOwotCQl9Ci0JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0JCS8vIG1ha2UgcGFyZW50IGJlIHRvdGFsbHkgcmVwYWludGVkCi0JCXBhcmVudC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJcGFyZW50LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2F2ZU1vZGlmaWVkUmljaFRleHQoKTsKLQotCQkJCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQkJCQlBY3Rpdml0eURlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQWN0aXZpdHlEZXNjcmlwdGlvbikgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCi0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCW1haW5EZXNjVGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCQlwdXJwb3NlVGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCQlhbHRlcm5hdGl2ZXNUZXh0Ci0JCQkJCQkJLnJlbW92ZU1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCWhvd1RvU3RhZmZUZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJfQotCQkJCQotCQkJCXN1cGVyLnJlZnJlc2goKTsKLQotCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJCS5zZXRFbGVtZW50KGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJCS5zZXREaXNhYmxlKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJbWFpbkRlc2NUZXh0LnNldFRleHQoY29udGVudC5nZXRNYWluRGVzY3JpcHRpb24oKSk7Ci0JCQkJcHVycG9zZVRleHQuc2V0VGV4dChjb250ZW50LmdldFB1cnBvc2UoKSk7Ci0JCQkJYWx0ZXJuYXRpdmVzVGV4dC5zZXRUZXh0KGNvbnRlbnQuZ2V0QWx0ZXJuYXRpdmVzKCkpOwotCQkJCWhvd1RvU3RhZmZUZXh0LnNldFRleHQoY29udGVudC5nZXRIb3d0b1N0YWZmKCkpOwotCi0JCQkJaWYgKGV4cGFuZEZsYWcpIHsKLQkJCQkJaWYgKGV4cGFuZERvY3VtZW50TGFiZWwuZ2V0VGV4dCgpLmVxdWFscygKLQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfbWFpbkRlc2NyaXB0aW9uKSkgeyAKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0VGV4dChjb250ZW50Ci0JCQkJCQkJCS5nZXRNYWluRGVzY3JpcHRpb24oKSk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFNlbGVjdGlvbigwKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpKTsKLQotCQkJCQl9IGVsc2UgaWYgKGV4cGFuZERvY3VtZW50TGFiZWwuZ2V0VGV4dCgpLmVxdWFscygKLQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfcHVycG9zZSkpIHsgCi0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFRleHQoY29udGVudC5nZXRQdXJwb3NlKCkpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJCQkJLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKSk7Ci0JCQkJCX0gZWxzZSBpZiAoZXhwYW5kRG9jdW1lbnRMYWJlbC5nZXRUZXh0KCkuZXF1YWxzKAotCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfYWx0ZXJuYXRpdmVzKSkgeyAKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0VGV4dChjb250ZW50Ci0JCQkJCQkJCS5nZXRBbHRlcm5hdGl2ZXMoKSk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQkJCQkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkpOwotCQkJCQl9IGVsc2UgaWYgKGV4cGFuZERvY3VtZW50TGFiZWwuZ2V0VGV4dCgpLmVxdWFscygKLQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X2hvd1RvU3RhZmYpKSB7IAotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRUZXh0KGNvbnRlbnQuZ2V0SG93dG9TdGFmZigpKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3d0b1N0YWZmKCkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUoZmFsc2UpOwotCQkJCX0KLQotCQkJCW1haW5EZXNjVGV4dC5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQltYWluRGVzY1RleHQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpKTsKLQkJCQltYWluRGVzY1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQotCQkJCXB1cnBvc2VUZXh0LnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCXB1cnBvc2VUZXh0LnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpKTsKLQkJCQlwdXJwb3NlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCi0JCQkJYWx0ZXJuYXRpdmVzVGV4dC5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQlhbHRlcm5hdGl2ZXNUZXh0LnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkpOwotCQkJCWFsdGVybmF0aXZlc1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQotCQkJCWhvd1RvU3RhZmZUZXh0LnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCWhvd1RvU3RhZmZUZXh0LnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93dG9TdGFmZigpKTsKLQkJCQlob3dUb1N0YWZmVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcigKLQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgYWN0aXZpdHkgZG9jdW1lbnRhdGlvbiBzZWN0aW9uIDoiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eUdlbmVyYWxTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlHZW5lcmFsU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGM5NjY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eUdlbmVyYWxTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5CcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkFjdGl2aXR5VmFyaWFiaWxpdHlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Qcm9jZXNzVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzLlNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzVmFyaWFiaWxpdHlDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5BY3Rpdml0eVZhcmlhYmlsaXR5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzLkNvbnZlcnRBY3Rpdml0eURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBUaGUgZ2VuZXJhbCB0YWIgc2VjdGlvbiBmb3IgQWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5R2VuZXJhbFNlY3Rpb24gZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgQWN0aXZpdHkgZWxlbWVudDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfQVBQTElDQUJMRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubm90QXBwbGljYWJsZV90ZXh0OyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUklCVVRFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29udHJpYnV0ZXNfdGV4dDsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5EU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXh0ZW5kc190ZXh0OyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBMQUNFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwbGFjZXNfdGV4dDsgCi0KLQlwcml2YXRlIFRleHQgbW9kZWxJbmZvVGV4dDsKLQotCXByaXZhdGUgTGFiZWwgYWN0aXZpdHlUeXBlTGFiZWw7Ci0KLQlwcml2YXRlIFRleHQgY3RybF90eXBlX3RleHQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX3R5cGVfYnV0dG9uOwotCi0JcHJpdmF0ZSBDb21ibyBjdHJsX3ZhcmlhYmlsaXR5OwotCi0JcHJpdmF0ZSBDb21ib1ZpZXdlciB2aWV3ZXJfdmFyaWFiaWxpdHk7Ci0KLQlwcml2YXRlIFRleHQgYmFzZVRleHQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBzZWxlY3RCdXR0b247Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgdmFyaWFiaWxpdHlMYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkJVmFyaWFiaWxpdHlUeXBlIHZhck9iamVjdCA9IChWYXJpYWJpbGl0eVR5cGUpIG9iamVjdDsKLQkJCWlmICh2YXJPYmplY3QgPT0gVmFyaWFiaWxpdHlUeXBlLk5BKQotCQkJCXJldHVybiBOT1RfQVBQTElDQUJMRV9URVhUOwotCQkJaWYgKHZhck9iamVjdCA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpCi0JCQkJcmV0dXJuIENPTlRSSUJVVEVTX1RFWFQ7Ci0JCQlpZiAodmFyT2JqZWN0ID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKQotCQkJCXJldHVybiBFWFRFTkRTX1RFWFQ7Ci0JCQlpZiAodmFyT2JqZWN0ID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUykKLQkJCQlyZXR1cm4gUkVQTEFDRVNfVEVYVDsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUNvbnRlbnRQcm92aWRlciB2YXJpYWJpbGl0eUNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJTGlzdCB2YXJpYWJpbGl0eVR5cGVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXZhcmlhYmlsaXR5VHlwZXNMaXN0LmFkZChWYXJpYWJpbGl0eVR5cGUuTkEpOwotCQkJdmFyaWFiaWxpdHlUeXBlc0xpc3QuYWRkKFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUyk7Ci0JCQl2YXJpYWJpbGl0eVR5cGVzTGlzdC5hZGQoVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpOwotCQkJdmFyaWFiaWxpdHlUeXBlc0xpc3QuYWRkKFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUyk7Ci0JCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlc0xpc3QudG9BcnJheSgpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLldvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQkvLyBnZXQgYWN0aXZpdHkgb2JqZWN0Ci0JCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2NyZWF0ZUdlbmVyYWxTZWN0aW9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHZW5lcmFsU2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXN1cGVyLmNyZWF0ZUdlbmVyYWxTZWN0aW9uKGNvbXBvc2l0ZSk7Ci0KLQkJLy8gTW9kZWwgSW5mbwotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X01vZGVsSW5mbyk7IAotCi0JCW1vZGVsSW5mb1RleHQgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCVNXVC5ERUZBVUxULCBob3Jpem9udGFsU3Bhbik7Ci0JCW1vZGVsSW5mb1RleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCW1vZGVsSW5mb1RleHQuc2V0VGV4dChnZXRNb2RlbEluZm8oKSk7Ci0KLQkJLy8gVHlwZSBvZiBhbiBBY3Rpdml0eQotCQlhY3Rpdml0eVR5cGVMYWJlbCA9IEZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfVHlwZSk7Ci0JCQotCQljdHJsX3R5cGVfdGV4dCA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIiwgU1dULlJFQURfT05MWSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HIHwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCWN0cmxfdHlwZV90ZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCWN0cmxfdHlwZV9idXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5DSEFOR0VfVFlQRV9CVVRUT05fVEVYVCwgU1dULlBVU0gpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJY3RybF90eXBlX2J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlpZiAoQ29udmVydEFjdGl2aXR5RGlhbG9nLmdldFZhbGlkTmV3QWN0aXZpdHlUeXBlcyhlbGVtZW50KSA9PSBudWxsKSB7Ci0JCQljdHJsX3R5cGVfYnV0dG9uLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0KLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFZhcmlhYmlsaXR5IFR5cGUKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlZBUklBQklMSVRZX1RZUEVfVEVYVCk7Ci0KLQkJY3RybF92YXJpYWJpbGl0eSA9IEZvcm1VSS5jcmVhdGVDb21ibyh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCAyKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCWN0cmxfdmFyaWFiaWxpdHkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQl2aWV3ZXJfdmFyaWFiaWxpdHkgPSBuZXcgQ29tYm9WaWV3ZXIoY3RybF92YXJpYWJpbGl0eSk7Ci0JCXZpZXdlcl92YXJpYWJpbGl0eS5nZXRDb21ibygpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKDEpKTsKLQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldENvbnRlbnRQcm92aWRlcih2YXJpYWJpbGl0eUNvbnRlbnRQcm92aWRlcik7Ci0JCXZpZXdlcl92YXJpYWJpbGl0eS5zZXRMYWJlbFByb3ZpZGVyKHZhcmlhYmlsaXR5TGFiZWxQcm92aWRlcik7Ci0JCXZpZXdlcl92YXJpYWJpbGl0eS5zZXRJbnB1dChlbGVtZW50KTsKLQotCQlMYWJlbCBibGFua0xhYmVsID0gRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJYmxhbmtMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCS8vIEJhc2UgZWxlbWVudHMKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkJBU0VfRUxFTUVOVF9URVhUKTsKLQotCQliYXNlVGV4dCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUpOwotCQl7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcKLQkJCQkJfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJYmFzZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCX0KLQkJYmFzZVRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJLy8gQnV0dG9uIHRvIHNlbGVjdAotCQlzZWxlY3RCdXR0b24gPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlNFTEVDVF9CVVRUT05fVEVYVCk7Ci0JfQotCQotCXByaXZhdGUgTGlzdDxBYnN0cmFjdERpYWdyYW1FZGl0b3I+IGdldERpcnR5RGlhZ3JhbUVkaXRvcnMoKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvY2VzcyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlbGVtZW50KTsgCi0JCUFycmF5TGlzdDxBYnN0cmFjdERpYWdyYW1FZGl0b3I+IGRpcnR5RWRpdG9ycyA9IG5ldyBBcnJheUxpc3Q8QWJzdHJhY3REaWFncmFtRWRpdG9yPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yICYmIGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgewotCQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgZGlhZ3JhbUlucHV0ID0gKChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgaW5wdXQpLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJCQlpZiAoZGlhZ3JhbUlucHV0ICE9IG51bGwpIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IGRpYWdyYW1JbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCAmJiBwcm9jZXNzID09IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCllbGVtZW50KSkgewotCQkJCQkJCWRpcnR5RWRpdG9ycy5hZGQoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgZWRpdG9yKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZGlydHlFZGl0b3JzOwotCX0KLQotCS8qKgotCSAqIGFkZCBsaXN0ZW5lcnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCQljdHJsX3R5cGVfYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWZpbmFsIFByb2Nlc3NFZGl0b3IgZWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpIGdldEVkaXRvcigpOwotCQkJCS8vIGFsbG93IGNoYW5naW5nIHR5cGUgb25seSBpZiB0aGUgcHJvY2VzcyBlZGl0b3IgYW5kIGFsbCBvZiBpdHMgZGlhZ3JhbSBlZGl0b3JzIGFyZSBub3QgZGlydHkKLQkJCQkvLwotCQkJCWlmIChlZGl0b3IuaXNEaXJ0eSgpIHx8ICFnZXREaXJ0eURpYWdyYW1FZGl0b3JzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNoYW5nZUFjdGl2aXR5VHlwZVdhcm5pbmdEaWFsb2dfdGl0bGU7IAotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UxOyAKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlXYXJuaW5nKHRpdGxlLCBtZXNzYWdlKTsKLQkJCQl9IGVsc2UgIHsKLQkJCQkJbmFtZVRleHQucmVtb3ZlTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsCi0JCQkJCQkJbmFtZURlYWN0aXZhdGVMaXN0ZW5lcik7Ci0JCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LnJlbW92ZUxpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCQkJCXByZXNlbnRhdGlvbk5hbWVEZWFjdGl2YXRlTGlzdGVuZXIpOwotCi0JCQkJCUFjdGl2aXR5IG5ld0FjdGl2aXR5ID0gQ29udmVydEFjdGl2aXR5RGlhbG9nCi0JCQkJCS5xdWVyeVVzZXJBbmRDb252ZXJ0KChBY3Rpdml0eSkgZWxlbWVudCwgbnVsbCwgbnVsbCk7Ci0JCQkJCQotCQkJCQlpZiAobmV3QWN0aXZpdHkgIT0gbnVsbCkgewotCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQkJCW5ld0FjdGl2aXR5KTsKLQkJCQkJCS8vIGRlYWwgd2l0aCBwcm9wZXJ0eSBzaGVldCBkaXJlY3RseS4KLQkJCQkJCWdldFByb3BlcnR5U2hlZXRQYWdlKCkuc2VsZWN0aW9uQ2hhbmdlZChnZXRQYXJ0KCksCi0JCQkJCQkJCXNlbCk7Ci0JCQkJCQkvLyBnZXRFZGl0b3IoKS5zZXRTZWxlY3Rpb24oc2VsKTsKLQkJCQkJCXJlZnJlc2goKTsKLQkJCQkJCSgoUHJvY2Vzc1ZpZXdlcikgKChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpIGdldEVkaXRvcigpCi0JCQkJCQkJCS5nZXRBY3RpdmVQYWdlSW5zdGFuY2UoKSkuZ2V0Vmlld2VyKCkpCi0JCQkJCQkJCS5leHBhbmRUb0xldmVsKG5ld0FjdGl2aXR5LCAzKTsKLQkJCQkJfQotCQkJCQluYW1lVGV4dC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwKLQkJCQkJCQluYW1lRGVhY3RpdmF0ZUxpc3RlbmVyKTsKLQkJCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsCi0JCQkJCQkJcHJlc2VudGF0aW9uTmFtZURlYWN0aXZhdGVMaXN0ZW5lcik7Ci0KLQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCS8vIHJlZnJlc2ggYW55IGRpcnR5IGRpYWdyYW0gZWRpdG9yIGFuZCBjbGVhciB0aGUgZGlydHkgZmxhZwotCQkJCQkJCS8vCi0JCQkJCQkJTGlzdDxBYnN0cmFjdERpYWdyYW1FZGl0b3I+IGRpcnR5RGlhZ3JhbUVkaXRvcnMgPSBnZXREaXJ0eURpYWdyYW1FZGl0b3JzKCk7Ci0JCQkJCQkJZm9yIChBYnN0cmFjdERpYWdyYW1FZGl0b3IgZGlhZ3JhbUVkaXRvciA6IGRpcnR5RGlhZ3JhbUVkaXRvcnMpIHsKLQkJCQkJCQkJZGlhZ3JhbUVkaXRvci5yZWZyZXNoKCk7Ci0JCQkJCQkJCUlEb2N1bWVudFByb3ZpZGVyIGRvY1Byb3ZpZGVyID0gZGlhZ3JhbUVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCQkJCQkJCWlmKGRvY1Byb3ZpZGVyIGluc3RhbmNlb2YgU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcikgewotCQkJCQkJCQkJKChTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKWRvY1Byb3ZpZGVyKS5tYXJrRG9jdW1lbnRBc1NhdmVkKChJRmlsZUVkaXRvcklucHV0KSBkaWFncmFtRWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJCQkJCQl9CQkJCi0JCQkJCQkJfQkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfdmFyaWFiaWxpdHkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3ZhcmlhYmlsaXR5Ci0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBlbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSA9IChWYXJpYWJpbGl0eVR5cGUpIHNlbGVjdGlvbgotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCi0JCQkJaWYgKHZlICE9IG51bGwgJiB2ZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0vLwkJCQkJaWYodHlwZS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTX0xJVEVSQUwpCi0vLwkJCQkJCQkmJiB2ZSBpbnN0YW5jZW9mIFByb2Nlc3MpewotLy8JCQkJCQlPYmplY3RbXSBhcmdzID0geyBlbGVtZW50LmdldE5hbWUoKSB9OwotLy8JCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0vLwkJCQkJCS5iaW5kKAotLy8JCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzEsCi0vLwkJCQkJCQkJYXJncyk7Ci0vLwotLy8JCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLS8vCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0vLwkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCAiIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCQkJVmFyaWFiaWxpdHlUeXBlIHZ0eXBlID0gZWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLS8vCQkJCQkJaWYodnR5cGUgIT0gbnVsbCl7Ci0vLwkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih2dHlwZSk7Ci0vLwkJCQkJCQl2aWV3ZXJfdmFyaWFiaWxpdHkuc2V0U2VsZWN0aW9uKHNlbCk7Ci0vLwkJCQkJCX0KLS8vCQkJCQkJcmV0dXJuOwotLy8JCQkJCX0KLS8vCQkJCQlpZiAoUHJvY2Vzc1V0aWwuaGFzQ29udHJpYnV0b3JPclJlcGxhY2VyKChBY3Rpdml0eSkgdmUpCi0vLwkJCQkJCQkmJiB0eXBlLmVxdWFscyhWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKSkgewotLy8JCQkJCQlPYmplY3RbXSBhcmdzID0geyBlbGVtZW50LmdldE5hbWUoKSwKLS8vCQkJCQkJCQkoKEFjdGl2aXR5KSB2ZSkuZ2V0TmFtZSgpIH07Ci0vLwkJCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLS8vCQkJCQkJCQkuYmluZCgKLS8vCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZywKLS8vCQkJCQkJCQkJCWFyZ3MpOwotLy8KLS8vCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0vLwkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotLy8JCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQkJCQkJVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IGVsZW1lbnQKLS8vCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0vLwkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIG5ld1ZhcmlhYmlsaXR5U2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0vLwkJCQkJCQkJdmFyaWFiaWxpdHlUeXBlKTsKLS8vCQkJCQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldFNlbGVjdGlvbigKLS8vCQkJCQkJCQluZXdWYXJpYWJpbGl0eVNlbGVjdGlvbiwgdHJ1ZSk7Ci0vLwotLy8JCQkJCQlyZXR1cm47Ci0vLwkJCQkJfQotCQkJCQkKLQkJCQkJaWYodHlwZSAhPSBWYXJpYWJpbGl0eVR5cGUuTkEpIHsKLQkJCQkJCUlTdGF0dXMgc3RhdGUgPSBEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRGVwZW5kZW5jeUFmdGVyRmlsdGVyU2VsZWN0aW9uKGVsZW1lbnQsIChBY3Rpdml0eSkgdmUsIHR5cGUpOwotCQkJCQkJaWYoIXN0YXRlLmlzT0soKSkgewotCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsIHN0YXRlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkJCi0JCQkJCQkJLy8gc2V0IHZhcmlhYmlsaXR5IHRvIGJhY2sgd2hhdGV2ZXIgaXQgd2FzIGZvciBVSQotCQkJCQkJCVZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSBlbGVtZW50LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIG5ld1ZhcmlhYmlsaXR5U2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQkJCQl2YXJpYWJpbGl0eVR5cGUpOwotCQkJCQkJCXZpZXdlcl92YXJpYWJpbGl0eS5zZXRTZWxlY3Rpb24obmV3VmFyaWFiaWxpdHlTZWxlY3Rpb24sIHRydWUpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCksCi0JCQkJCQkJdHlwZSwgLTEpOwotCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJaWYgKGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpID09IG51bGwKLQkJCQkJCQkJfHwgZWxlbWVudC5nZXRQcmVzZW50YXRpb25OYW1lKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKHR5cGUuZXF1YWxzKFZhcmlhYmlsaXR5VHlwZS5OQSkpCi0JCQkJCQkJCWVsZW1lbnQuc2V0UHJlc2VudGF0aW9uTmFtZShlbGVtZW50LmdldE5hbWUoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJaWYgKGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpID09IG51bGwKLQkJCQkJCQl8fCBlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmICh0eXBlLmVxdWFscyhWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpCi0JCQkJCQkJCXx8IHR5cGUuZXF1YWxzKFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUykKLQkJCQkJCQkJfHwgdHlwZS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLk5BKSkKLQkJCQkJCQllbGVtZW50LnNldFByZXNlbnRhdGlvbk5hbWUoZWxlbWVudC5nZXROYW1lKCkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLk5BKSB7Ci0JCQkJCWlmICh2ZSAhPSBudWxsKSB7Ci0JCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLAotCQkJCQkJCQkJCW51bGwsIC0xKTsKLQotCQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJc2VsZWN0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQliYXNlVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSB7Ci0JCQkJCUxpc3Qgc2VsZWN0aW9uQmFzZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gZWxlbWVudAotCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCXNlbGVjdGlvbkJhc2VMaXN0LmFkZChiYXNlKTsKLQkJCQkJc2VsZWN0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJCQl9Ci0JCQkJLy8gc2V0Rm9ybVRleHRXaXRoVmFyaWFibGVJbmZvKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXNlbGVjdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldENvbmZpZ3VyYXRpb24oKTsKLQkJCQlTdHJpbmcgdGFiTmFtZSA9IEZpbHRlckNvbnN0YW50cy5BQ1RJVklUSUVTOwotCi0JCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSAoVmFyaWFiaWxpdHlUeXBlKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfdmFyaWFiaWxpdHkKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBBY3Rpdml0eVZhcmlhYmlsaXR5RmlsdGVyKGNvbmZpZywgbnVsbCwKLQkJCQkJCXRhYk5hbWUsIGVsZW1lbnQpOwotCi0JCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCQlmaWx0ZXIsIHRhYk5hbWUsIG51bGwsIGNvbmZpZyk7Ci0JCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZmQuc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKHRydWUpOwotCQkJCWZkLnNldFRpdGxlKHRhYk5hbWUpOwotCQkJCWZkLm9wZW4oKTsKLQotCQkJCUxpc3Qgc2VsZWN0ZWRJdGVtcyA9IGZkLmdldFNlbGVjdGVkSXRlbXMoKTsKLQotCQkJCWlmIChzZWxlY3RlZEl0ZW1zICE9IG51bGwgJiYgIXNlbGVjdGVkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQkJCU9iamVjdCBvID0gc2VsZWN0ZWRJdGVtcy5nZXQoMCk7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLS8vCQkJCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBvOwotLy8JCQkJCQlpZiAoaXNEaXJlY3RQYXJlbnQoYWN0KQotLy8JCQkJCQkJCXx8ICgoYWN0IGluc3RhbmNlb2YgUHJvY2VzcykgJiYgdHlwZS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTX0xJVEVSQUwpCi0vLwkJCQkJCQkJCQkmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSkpIAotLy8JCQkJCQl7Ci0vLwkJCQkJCQlPYmplY3RbXSBhcmdzID0geyBlbGVtZW50LmdldE5hbWUoKSB9OwotLy8JCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotLy8JCQkJCQkJCQkuYmluZCgKLS8vCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cxLAotLy8JCQkJCQkJCQkJCWFyZ3MpOwotLy8KLS8vCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotLy8JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0vLwkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQkJCQkJCXJldHVybjsKLS8vCQkJCQkJfQotLy8JCQkJCQlpZiAoaXNDaXJjdWxhckRlcGVuZGVuY3koYWN0KSkgewotLy8JCQkJCQkJT2JqZWN0W10gYXJncyA9IHsgZWxlbWVudC5nZXROYW1lKCksIGFjdC5nZXROYW1lKCkgfTsKLS8vCQkJCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLS8vCQkJCQkJCQkJLmJpbmQoCi0vLwkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMiwKLS8vCQkJCQkJCQkJCQlhcmdzKTsKLS8vCi0vLwkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLS8vCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotLy8JCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCAiIik7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwkJCQkJCQlyZXR1cm47Ci0vLwkJCQkJCX0KLS8vCQkJCQkJLy8gYmxvY2sgZm9yIGNoaWxkcmVuCi0vLwkJCQkJCWlmIChQcm9jZXNzVXRpbC5oYXNDb250cmlidXRvck9yUmVwbGFjZXIoYWN0KQotLy8JCQkJCQkJCSYmIHR5cGUuZXF1YWxzKFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpKSB7Ci0vLwkJCQkJCQlPYmplY3RbXSBhcmdzID0geyBlbGVtZW50LmdldE5hbWUoKSwgYWN0LmdldE5hbWUoKSB9OwotLy8JCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotLy8JCQkJCQkJCQkuYmluZCgKLS8vCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2csCi0vLwkJCQkJCQkJCQkJYXJncyk7Ci0vLwotLy8JCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0vLwkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLS8vCQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0vLwotLy8JCQkJCQkJcmV0dXJuOwotLy8JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3lBZnRlckZpbHRlclNlbGVjdGlvbihlbGVtZW50LCAoQWN0aXZpdHkpIG8sIHR5cGUpOwotCQkJCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLCBzdGF0dXMuZ2V0TWVzc2FnZSgpKTsJCQkJCQkKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIG87Ci0KLQkJCQkJCUlDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IFByb2Nlc3NWYXJpYWJpbGl0eUNvbmZpZ3VyYXRvcigKLQkJCQkJCQkJZ2V0RGVmYXVsdENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJCQlBY3Rpdml0eVZhcmlhYmlsaXR5Q29tbWFuZCBjbWQgPSBuZXcgQWN0aXZpdHlWYXJpYWJpbGl0eUNvbW1hbmQoCi0JCQkJCQkJCWVsZW1lbnQsIHZlLCB0eXBlLCBjb25maWd1cmF0b3IpOwotCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCi0JCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQotCQkJCQkJYmFzZVRleHQuc2V0VGV4dChUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgodmUpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgbW9kZWwgaW5mb3JtYXRpb24gZm9yIHRoZSBhY3Rpdml0eQotCSAqIEByZXR1cm4KLQkgKiAJCQltb2RlbCBpbmZvIHN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldE1vZGVsSW5mbygpIHsKLQkJU3RyaW5nIGluZm8gPSBudWxsOwotCi0JCXRyeSB7Ci0JCQlPYmplY3QgbyA9IGdldEFkYXB0ZXIoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBvOwotCQkJCWluZm8gPSBhZGFwdGVyLmdldEF0dHJpYnV0ZShlbGVtZW50LAotCQkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHByaW50IGV4Y2VwdGlvbgotCQl9Ci0JCWlmICghKFN0clV0aWwuaXNCbGFuayhpbmZvKSkpCi0JCQlyZXR1cm4gaW5mbzsKLQkJZWxzZQotCQkJcmV0dXJuIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Ob25lOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiN1cGRhdGVDb250cm9scygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCXN1cGVyLnVwZGF0ZUNvbnRyb2xzKCk7Ci0KLQkJY3RybF90eXBlX2J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF92YXJpYWJpbGl0eS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJc2VsZWN0QnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCi0JCWN0cmxfdmFyaWFiaWxpdHkuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmICgoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfdmFyaWFiaWxpdHkuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJLmdldEZpcnN0RWxlbWVudCgpID09IFZhcmlhYmlsaXR5VHlwZS5OQSkgewotCQkJc2VsZWN0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlzdXBlci5yZWZyZXNoKCk7Ci0KLQkJCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0KLQkJCQltb2RlbEluZm9UZXh0LnNldFRleHQoZ2V0TW9kZWxJbmZvKCkpOwotCi0JCQkJY3RybF90eXBlX3RleHQuc2V0VGV4dChQcm9wZXJ0aWVzVXRpbC5nZXRUeXBlKGVsZW1lbnQpKTsKLQotCQkJCS8vIGhpZGUvc2hvdyBjb21ibwotCQkJCWlmICgoZWxlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykKLQkJCQkJCSYmIChlbGVtZW50LmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwgfHwgZWxlbWVudAotCQkJCQkJCQkuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkpIHsKLQkJCQkJYWN0aXZpdHlUeXBlTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCWN0cmxfdHlwZV90ZXh0LnNldFZpc2libGUoZmFsc2UpOwotCQkJCQljdHJsX3R5cGVfYnV0dG9uLnNldFZpc2libGUoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFjdGl2aXR5VHlwZUxhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCWN0cmxfdHlwZV90ZXh0LnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCWN0cmxfdHlwZV9idXR0b24uc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQl9Ci0KLQkJCQlWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gZWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBuZXdWYXJpYWJpbGl0eVNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJdmFyaWFiaWxpdHlUeXBlKTsKLQkJCQl2aWV3ZXJfdmFyaWFiaWxpdHkuc2V0U2VsZWN0aW9uKG5ld1ZhcmlhYmlsaXR5U2VsZWN0aW9uLCB0cnVlKTsKLQotCQkJCWlmIChlbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKQotCQkJCQliYXNlVGV4dC5zZXRUZXh0KFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtZW50Ci0JCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkpOwotCQkJCWVsc2UKLQkJCQkJYmFzZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJCQkvLyBtYWtlIHZhcmlhYmlsaXR5IHR5cGUgY29tYm8gZGlzYWJsZWQgaW5jYXNlIHR5cGUgaXMgZWl0aGVyIGxvY2FsIGNvbnRyaWJ1dGVzIG9yIGxvY2FsIHJlcGxhY2VzLgotCQkJCWlmICh2YXJpYWJpbGl0eVR5cGUKLQkJCQkJCS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTikKLQkJCQkJCXx8ICh2YXJpYWJpbGl0eVR5cGUKLQkJCQkJCQkJLmVxdWFscyhWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlQpKSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCQlWYXJpYWJpbGl0eVR5cGUuTkEpOwotCQkJCQl2aWV3ZXJfdmFyaWFiaWxpdHkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQkJCWN0cmxfdmFyaWFiaWxpdHkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWN0cmxfdmFyaWFiaWxpdHkuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBBY3Rpdml0eSBnZW5lcmFsIHNlY3Rpb24gOiAiICsgZWxlbWVudCwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2dldE5hbWVQcmVmaXgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZVByZWZpeCgpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9DQVBBQklMSVRZX1BBVFRFUk4gKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9ERUxJVkVSWV9QUk9DRVNTICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQaGFzZSkgewotCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9QSEFTRSArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSXRlcmF0aW9uKSB7Ci0JCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX0lURVJBVElPTiArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlCi0JCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX0FDVElWSVRZICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5R3VpZGFuY2VTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlHdWlkYW5jZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcyNzRiYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlHdWlkYW5jZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NHdWlkYW5jZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5HdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5HdWlkYW5jZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQWRkR3VpZGFuY2VUb0JyZWFrZG93bkVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLS8qKgotICogVGhlIGFjdGl2aXR5IGd1aWRhbmNlIHNlY3Rpb24uIEl0IGxpc3QgYWxsIGF2YWlhYmxlIGd1aWRhbmNlcyBvZiBhbiBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUd1aWRhbmNlU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQotCXByaXZhdGUgRm9ybVRvb2xraXQgdG9vbGtpdDsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfYWRkXzEsIGN0cmxfcmVtb3ZlXzEsIGN0cmxfYWRkXzIsIGN0cmxfcmVtb3ZlXzI7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZF8zLCBjdHJsX3JlbW92ZV8zLCBjdHJsX2FkZF80LCBjdHJsX3JlbW92ZV80OwotCi0JcHJpdmF0ZSBUYWJsZSBjdHJsX3RhYmxlXzEsIGN0cmxfdGFibGVfMiwgY3RybF90YWJsZV8zLCBjdHJsX3RhYmxlXzQ7Ci0KLQlwcml2YXRlIFNlY3Rpb24gY29tbXVuaWNhdGlvbk1hdGVyaWFsU2VjdGlvbiwgZWR1Y2F0aW9uTWF0ZXJpYWxTZWN0aW9uOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciB2aWV3ZXJfMSwgdmlld2VyXzIsIHZpZXdlcl8zLCB2aWV3ZXJfNDsKLQotCS8vIGVsZW1lbnQKLQlwcml2YXRlIEFjdGl2aXR5IGVsZW1lbnQ7Ci0KLQkvLyBhY3Rpb24gbWFuYWdlcgotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JcHVibGljIGZpbmFsIFN0cmluZyB0YWJOYW1lID0gRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCi0JcHJpdmF0ZSBJRmlsdGVyIHJvYWRNYXBGaWx0ZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGdlbmVyYWxHdWlkYW5jZUZpbHRlciA9IG51bGw7Ci0KLQlwcml2YXRlIElGaWx0ZXIgc3VwcG9ydGluZ01hdGVyaWFsRmlsdGVyID0gbnVsbDsKLQotCS8qKgotCSAqIEdldCByb2FkIG1hcCBndWlkYW5jZSBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRSb2FkTWFwRmlsdGVyKCkgewotCQlpZiAocm9hZE1hcEZpbHRlciA9PSBudWxsKSB7Ci0JCQlyb2FkTWFwRmlsdGVyID0gbmV3IFByb2Nlc3NHdWlkYW5jZUZpbHRlcihnZXRDb25maWd1cmF0aW9uKCksIG51bGwsCi0JCQkJCXRhYk5hbWUpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZUl0ZW1Qcm92aWRlcikgewotCQkJCQkJU3RyaW5nIG5hbWUgPSAoKEd1aWRhbmNlSXRlbVByb3ZpZGVyKSBvYmopLmdldFRleHQob2JqKTsKLQkJCQkJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19Sb2FkbWFwIikpICYmIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJISgoR3VpZGFuY2VJdGVtUHJvdmlkZXIpIG9iaikuZ2V0Q2hpbGRyZW4ob2JqKQotCQkJCQkJCQkJCS5pc0VtcHR5KCkpCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCWlmICgob2JqIGluc3RhbmNlb2YgUm9hZG1hcCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX07Ci0JCX0gZWxzZSB7Ci0JCQkoKFByb2Nlc3NHdWlkYW5jZUZpbHRlcikgcm9hZE1hcEZpbHRlcikuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihnZXRDb25maWd1cmF0aW9uKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHJvYWRNYXBGaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0IEdlbmVyYWwgZ3VpZGFuY2UgZmlsdGVyCi0JICogCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0R2VuZXJhbEd1aWRhbmNlRmlsdGVyKCkgewotCQlpZiAoZ2VuZXJhbEd1aWRhbmNlRmlsdGVyID09IG51bGwpIHsKLQkJCWdlbmVyYWxHdWlkYW5jZUZpbHRlciA9IG5ldyBQcm9jZXNzR3VpZGFuY2VGaWx0ZXIoCi0JCQkJCWdldENvbmZpZ3VyYXRpb24oKSwgbnVsbCwgdGFiTmFtZSkgewotCQkJCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkJaWYgKHN1cGVyLmNoaWxkQWNjZXB0KG9iaikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlpZiAoKChHdWlkYW5jZUl0ZW1Qcm92aWRlcikgb2JqKS5nZXRDaGlsZHJlbihvYmopCi0JCQkJCQkJCS5pc0VtcHR5KCkpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJCUNsYXNzIGNscyA9IEZpbHRlckluaXRpYWxpemVyLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q2xhc3NGb3JUeXBlKGhlbHBlci5nZXRGaWx0ZXJUeXBlU3RyKCkpOwotCQkJCQlpZiAoY2xzICE9IG51bGwpIHsKLQkJCQkJCWlmIChjbHMuaXNJbnN0YW5jZShvYmopKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoKG9iaiBpbnN0YW5jZW9mIENoZWNrbGlzdCkgfHwgKG9iaiBpbnN0YW5jZW9mIENvbmNlcHQpCi0JCQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIEV4YW1wbGUpCi0JCQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIEd1aWRlbGluZSkKLQkJCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkKLQkJCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCi0JCQkJCXJldHVybiBmYWxzZTsKLQotCQkJCX0KLQkJCX07Ci0JCX1lbHNlIHsKLQkJCSgoUHJvY2Vzc0d1aWRhbmNlRmlsdGVyKSBnZW5lcmFsR3VpZGFuY2VGaWx0ZXIpLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJfQotCQlyZXR1cm4gZ2VuZXJhbEd1aWRhbmNlRmlsdGVyOwotCX0KLQotCS8qKgotCSAqIEdldCBTdXBwb3J0aW5nIG1hdGVyaWNhbCBndWlkYW5jZSBmaWx0ZXIKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRTdXBwb3J0aW5nTWF0ZXJpYWxGaWx0ZXIoKSB7Ci0JCWlmIChzdXBwb3J0aW5nTWF0ZXJpYWxGaWx0ZXIgPT0gbnVsbCkgewotCQkJc3VwcG9ydGluZ01hdGVyaWFsRmlsdGVyID0gbmV3IFByb2Nlc3NHdWlkYW5jZUZpbHRlcigKLQkJCQkJZ2V0Q29uZmlndXJhdGlvbigpLCBudWxsLCB0YWJOYW1lKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlpZiAoKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlSXRlbVByb3ZpZGVyKQotCQkJCQkJCXx8IChvYmogaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9OwotCQl9IGVsc2UgewotCQkJKChQcm9jZXNzR3VpZGFuY2VGaWx0ZXIpIHN1cHBvcnRpbmdNYXRlcmlhbEZpbHRlcikuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihnZXRDb25maWd1cmF0aW9uKCkpOwotCQl9Ci0JCXJldHVybiBzdXBwb3J0aW5nTWF0ZXJpYWxGaWx0ZXI7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LAotCQkJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpIHsKLQotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQkJaW5pdCgpOwotCi0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBjcmVhdGUgZ3VpZGFuY2Ugc2VjdGlvbgotCQljcmVhdGVHdWlkYW5jZVNlY3Rpb24ocGFyZW50KTsKLQotCQkvLyBhZGQgbGlzdGVuZXJzCi0JCWFkZExpc3RlbmVycygpOwotCi0JCS8vIHVwZGF0ZSBjb250cm9scwotCQl1cGRhdGVDb250cm9scygpOwotCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZQotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQkvLyBnZXQgYWN0aXZpdHkgb2JqZWN0Ci0JCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQotCQkvLyBnZXQgdG9vbGtpdAotCQl0b29sa2l0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpOwotCi0JCS8vIGdldCBhY3Rpb24gbWFuYWdlcgotCQlhY3Rpb25NZ3IgPSBFUEZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRvZ2dsZVNlY3Rpb24oKSB7Ci0JCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpKSB7Ci0JCQlpZiAoY29tbXVuaWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5pc0V4cGFuZGVkKCkpCi0JCQkJY29tbXVuaWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JCQlpZiAoZWR1Y2F0aW9uTWF0ZXJpYWxTZWN0aW9uLmlzRXhwYW5kZWQoKSkKLQkJCQllZHVjYXRpb25NYXRlcmlhbFNlY3Rpb24uc2V0RXhwYW5kZWQoZmFsc2UpOwotCi0JCQlpZiAoY29tbXVuaWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5pc1Zpc2libGUoKSkKLQkJCQljb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uLnNldFZpc2libGUoZmFsc2UpOwotCQkJaWYgKGVkdWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5pc1Zpc2libGUoKSkKLQkJCQllZHVjYXRpb25NYXRlcmlhbFNlY3Rpb24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIWNvbW11bmljYXRpb25NYXRlcmlhbFNlY3Rpb24uaXNFeHBhbmRlZCgpKQotCQkJCWNvbW11bmljYXRpb25NYXRlcmlhbFNlY3Rpb24uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JCQlpZiAoIWVkdWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5pc0V4cGFuZGVkKCkpCi0JCQkJZWR1Y2F0aW9uTWF0ZXJpYWxTZWN0aW9uLnNldEV4cGFuZGVkKHRydWUpOwotCi0JCQlpZiAoIWNvbW11bmljYXRpb25NYXRlcmlhbFNlY3Rpb24uaXNWaXNpYmxlKCkpCi0JCQkJY29tbXVuaWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5zZXRWaXNpYmxlKHRydWUpOwotCQkJaWYgKCFlZHVjYXRpb25NYXRlcmlhbFNlY3Rpb24uaXNWaXNpYmxlKCkpCi0JCQkJZWR1Y2F0aW9uTWF0ZXJpYWxTZWN0aW9uLnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqICBVcGRhdGUgY29udHJvbHMgYmFzZWQgb24gZWRpdGFibGUgZmxhZy4gQ29udHJvbHMgY2FuIGJlY29tZSBlZGl0YWJsZSBvciB1bi1lZGl0YWJsZQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQljdHJsX2FkZF8xLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljdHJsX2FkZF8yLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljdHJsX2FkZF8zLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljdHJsX2FkZF80LnNldEVuYWJsZWQoZWRpdGFibGUpOwotCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzEKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiBlZGl0YWJsZSkgewotCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKHRydWUpOwotCQl9IGVsc2UgewotCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0JCXNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiBlZGl0YWJsZSkgewotCQkJY3RybF9yZW1vdmVfMi5zZXRFbmFibGVkKHRydWUpOwotCQl9IGVsc2UgewotCQkJY3RybF9yZW1vdmVfMi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0JCXNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzMuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiBlZGl0YWJsZSkgewotCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKHRydWUpOwotCQl9IGVsc2UgewotCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0JCXNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzQuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiBlZGl0YWJsZSkgewotCQkJY3RybF9yZW1vdmVfNC5zZXRFbmFibGVkKHRydWUpOwotCQl9IGVsc2UgewotCQkJY3RybF9yZW1vdmVfNC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5BYnN0cmFjdFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJZWxlbWVudCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCi0JCQkJdmlld2VyXzEucmVmcmVzaCgpOwotCQkJCXZpZXdlcl8yLnJlZnJlc2goKTsKLQkJCQl2aWV3ZXJfMy5yZWZyZXNoKCk7Ci0JCQkJdmlld2VyXzQucmVmcmVzaCgpOwotCi0JCQkJLy8gaGlkZS9zaG93IGNlcnRhaW4gc2VjdGlvbnMuCi0JCQkJdG9nZ2xlU2VjdGlvbigpOwotCi0JCQkJLy8gaGlkZS9zaG93IGNvbnRyb2xzCi0JCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcigiRXJyb3IgcmVmcmVzaGluZyBhY3Rpdml0eSBndWlkYW5jZSBzZWN0aW9uOiAiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZ3VpZGFuY2Ugc2VjdGlvbiBvbiB0aGUgZ2l2ZW4gY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVHdWlkYW5jZVNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpbnQgdGFibGVIZWlnaHQgPSA1MDsKLQkJU3RyaW5nIHNlY3Rpb25UaXRsZSA9IG51bGw7Ci0JCVN0cmluZyBzZWN0aW9uRGVzYyA9IG51bGw7Ci0JCVN0cmluZyB0YWJsZVRpdGxlID0gbnVsbDsKLQkJLy8gTGFiZWwgdGFibGVMYWJlbCA9IG51bGw7Ci0KLQkJLy8gUk9BRE1BUAotCQl7Ci0JCQlzZWN0aW9uVGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1JvYWRtYXBUaXRsZTsgCi0JCQlzZWN0aW9uRGVzYyA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfUm9hZG1hcERlc2NyaXB0aW9uOyAKLQkJCXRhYmxlVGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1NlbGVjdGVkX1JvYWRtYXA7IAotCi0JCQlTZWN0aW9uIHNlY3Rpb24gPSBGb3JtVUkuY3JlYXRlU2VjdGlvbih0b29sa2l0LCBjb21wb3NpdGUsCi0JCQkJCXNlY3Rpb25UaXRsZSwgc2VjdGlvbkRlc2MpOwotCi0JCQkvLyBjcmVhdGUgY29tcG9zaXRlCi0JCQlDb21wb3NpdGUgc2VjdGlvbkNvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwKLQkJCQkJc2VjdGlvbiwgMiwgZmFsc2UpOwotCi0JCQlDb21wb3NpdGUgcGFuZTEgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTEsIHRhYmxlVGl0bGUpOwotCi0JCQljdHJsX3RhYmxlXzEgPSBGb3JtVUkuY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTEsIHRhYmxlSGVpZ2h0KTsKLQkJCXZpZXdlcl8xID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdGFibGVfMSk7Ci0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KGVsZW1lbnQuZ2V0Um9hZG1hcHMoKSkudG9BcnJheSgpOwotCQkJCX0KLQkJCX07Ci0KLQkJCXZpZXdlcl8xLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQkJdmlld2VyXzEuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJCXZpZXdlcl8xLnNldElucHV0KGVsZW1lbnQpOwotCi0JCQkvLyBjcmVhdGUgYnV0dG9ucyBmb3IgdGFibGUxCi0JCQlDb21wb3NpdGUgcGFuZTIgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCi0JCQljdHJsX2FkZF8xID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZCk7Ci0JCQljdHJsX3JlbW92ZV8xID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1JlbW92ZSk7Ci0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQkJfQotCi0JCS8vIEdFTkVSQUwgR1VJREFOQ0UKLQkJewotCQkJc2VjdGlvblRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9HZW5lcmFsR3VpZGFuY2VUaXRsZTsgCi0JCQlzZWN0aW9uRGVzYyA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlRGVzY3JpcHRpb247IAotCQkJdGFibGVUaXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfU2VsZWN0ZWRfR2VuZXJhbEd1aWRhbmNlOyAKLQotCQkJU2VjdGlvbiBzZWN0aW9uID0gRm9ybVVJLmNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgY29tcG9zaXRlLAotCQkJCQlzZWN0aW9uVGl0bGUsIHNlY3Rpb25EZXNjKTsKLQotCQkJLy8gY3JlYXRlIGNvbXBvc2l0ZQotCQkJQ29tcG9zaXRlIHNlY3Rpb25Db21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsCi0JCQkJCXNlY3Rpb24sIDIsIGZhbHNlKTsKLQotCQkJQ29tcG9zaXRlIHBhbmUxID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUxLCB0YWJsZVRpdGxlKTsKLQotCQkJY3RybF90YWJsZV8yID0gRm9ybVVJLmNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUxLCB0YWJsZUhlaWdodCk7Ci0JCQl2aWV3ZXJfMiA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3RhYmxlXzIpOwotCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdChnZXRTZWxlY3RlZEd1aWRhbmNlcygpKS50b0FycmF5KCk7Ci0JCQkJfQotCQkJfTsKLQotCQkJdmlld2VyXzIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCQl2aWV3ZXJfMi5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQkJdmlld2VyXzIuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTIKLQkJCUNvbXBvc2l0ZSBwYW5lMiA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0KLQkJCWN0cmxfYWRkXzIgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsKLQkJCWN0cmxfcmVtb3ZlXzIgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsKLQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTEpOwotCQl9Ci0KLQkJLy8gQ09NTVVOSUNBVElPTiBNQVRFUklBTAotCQl7Ci0JCQlzZWN0aW9uVGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbFRpdGxlOyAKLQkJCXNlY3Rpb25EZXNjID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbjsgCi0JCQl0YWJsZVRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9TZWxlY3RlZF9Db21tdW5pY2F0aW9uTWF0ZXJpYWw7IAotCi0JCQlTZWN0aW9uIHNlY3Rpb24gPSBGb3JtVUkuY3JlYXRlU2VjdGlvbih0b29sa2l0LCBjb21wb3NpdGUsCi0JCQkJCXNlY3Rpb25UaXRsZSwgc2VjdGlvbkRlc2MpOwotCi0JCQkvLyBjcmVhdGUgY29tcG9zaXRlCi0JCQlDb21wb3NpdGUgc2VjdGlvbkNvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwKLQkJCQkJc2VjdGlvbiwgMiwgZmFsc2UpOwotCi0JCQlDb21wb3NpdGUgcGFuZTEgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTEsIHRhYmxlVGl0bGUpOwotCi0JCQljdHJsX3RhYmxlXzMgPSBGb3JtVUkuY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTEsIHRhYmxlSGVpZ2h0KTsKLQkJCXZpZXdlcl8zID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdGFibGVfMyk7Ci0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdCgKLQkJCQkJCQkJKChEZWxpdmVyeVByb2Nlc3MpIGVsZW1lbnQpCi0JCQkJCQkJCQkJLmdldENvbW11bmljYXRpb25zTWF0ZXJpYWxzKCkpCi0JCQkJCQkJCS50b0FycmF5KCk7Ci0JCQkJCX0gZWxzZQotCQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QudG9BcnJheSgpOwotCQkJCX0KLQkJCX07Ci0KLQkJCXZpZXdlcl8zLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQkJdmlld2VyXzMuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJCXZpZXdlcl8zLnNldElucHV0KGVsZW1lbnQpOwotCi0JCQkvLyBjcmVhdGUgYnV0dG9ucyBmb3IgdGFibGUyCi0JCQlDb21wb3NpdGUgcGFuZTIgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCi0JCQljdHJsX2FkZF8zID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZCk7Ci0JCQljdHJsX3JlbW92ZV8zID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1JlbW92ZSk7Ci0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQotCQkJY29tbXVuaWNhdGlvbk1hdGVyaWFsU2VjdGlvbiA9IHNlY3Rpb247Ci0KLQkJfQotCi0JCS8vIEVEVUNBVElPTiBNQVRFUklBTAotCQl7Ci0JCQlzZWN0aW9uVGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsVGl0bGU7IAotCQkJc2VjdGlvbkRlc2MgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb247IAotCQkJdGFibGVUaXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfU2VsZWN0ZWRfRWR1Y2F0aW9uTWF0ZXJpYWw7IAotCi0JCQlTZWN0aW9uIHNlY3Rpb24gPSBGb3JtVUkuY3JlYXRlU2VjdGlvbih0b29sa2l0LCBjb21wb3NpdGUsCi0JCQkJCXNlY3Rpb25UaXRsZSwgc2VjdGlvbkRlc2MpOwotCi0JCQkvLyBjcmVhdGUgY29tcG9zaXRlCi0JCQlDb21wb3NpdGUgc2VjdGlvbkNvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwKLQkJCQkJc2VjdGlvbiwgMiwgZmFsc2UpOwotCi0JCQlDb21wb3NpdGUgcGFuZTEgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTEsIHRhYmxlVGl0bGUpOwotCi0JCQljdHJsX3RhYmxlXzQgPSBGb3JtVUkuY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTEsIHRhYmxlSGVpZ2h0KTsKLQkJCXZpZXdlcl80ID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdGFibGVfNCk7Ci0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdCgKLQkJCQkJCQkJKChEZWxpdmVyeVByb2Nlc3MpIGVsZW1lbnQpCi0JCQkJCQkJCQkJLmdldEVkdWNhdGlvbk1hdGVyaWFscygpKS50b0FycmF5KCk7Ci0JCQkJCX0gZWxzZQotCQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QudG9BcnJheSgpOwotCQkJCX0KLQkJCX07Ci0KLQkJCXZpZXdlcl80LnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQkJdmlld2VyXzQuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJCXZpZXdlcl80LnNldElucHV0KGVsZW1lbnQpOwotCi0JCQkvLyBjcmVhdGUgYnV0dG9ucyBmb3IgdGFibGUyCi0JCQlDb21wb3NpdGUgcGFuZTIgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCi0JCQljdHJsX2FkZF80ID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZCk7Ci0JCQljdHJsX3JlbW92ZV80ID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1JlbW92ZSk7Ci0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQotCQkJZWR1Y2F0aW9uTWF0ZXJpYWxTZWN0aW9uID0gc2VjdGlvbjsKLQotCQl9Ci0KLQkJLy8gaGlkZS9zaG93IGNlcnRhaW4gc2VjdGlvbnMKLQkJdG9nZ2xlU2VjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgZ2V0QWRhcHRlcigpOwotCQlPYmplY3QgcGFyZW50ID0gbnVsbDsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCUlCU0l0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXI7Ci0JCQlwYXJlbnQgPSBic0l0ZW1Qcm92aWRlci5nZXRUb3BJdGVtKCk7Ci0JCX0gZWxzZSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKCJBY3Rpdml0eUd1aWRhbmNlU2VjdGlvbjo6YWRkTGlzdGVuZXJzIC0gSUJTSXRlbVByb3ZpZGVyIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJewotCQkJY3RybF90YWJsZV8xLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMQotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXZpZXdlcl8xCi0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzEKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJfQotCQkJCQl9KTsKLQotCQkJY3RybF9hZGRfMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCUlGaWx0ZXIgZmlsdGVyID0gZ2V0Um9hZE1hcEZpbHRlcigpOwotCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJLmdldFNoZWxsKCksIGZpbHRlciwgZWxlbWVudCwKLQkJCQkJCQlGaWx0ZXJDb25zdGFudHMuUk9BRE1BUCwgZWxlbWVudC5nZXRSb2FkbWFwcygpKTsKLQotCQkJCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuUk9BRE1BUCk7Ci0JCQkJCWZkLnNldElucHV0KFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeSgoRU9iamVjdCkgZWxlbWVudCkpOwotCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJZmQub3BlbigpOwotCQkJCQlhZGRHdWlkYW5jZXMoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJdmlld2VyXzEucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0pOwotCi0JCQljdHJsX3JlbW92ZV8xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMQotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCQlyZW1vdmVHdWlkYW5jZXMocm1JdGVtcyk7Ci0JCQkJCQl2aWV3ZXJfMS5yZWZyZXNoKCk7Ci0KLQkJCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJCXZpZXdlcl8xLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJCQkJfQotCQkJCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJewotCQkJY3RybF90YWJsZV8yLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMgotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXZpZXdlcl8yCi0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzIKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCQkJY3RybF9yZW1vdmVfMi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJfQotCQkJCQl9KTsKLQotCQkJY3RybF9hZGRfMi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCUlGaWx0ZXIgZmlsdGVyID0gZ2V0R2VuZXJhbEd1aWRhbmNlRmlsdGVyKCk7Ci0JCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBlbGVtZW50LAotCQkJCQkJCUZpbHRlckNvbnN0YW50cy5HVUlEQU5DRSwgZ2V0RXhpc3RpbmdFbGVtZW50cygpKTsgCi0KLQkJCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFKTsKLQkJCQkJZmQuc2V0SW5wdXQoVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KChFT2JqZWN0KSBlbGVtZW50KSk7Ci0JCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQlmZC5zZXRUeXBlcyhnZXRGaWx0ZXJUeXBlcygpKTsKLQkJCQkJZmQub3BlbigpOwotCQkJCQlhZGRHdWlkYW5jZXMoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJdmlld2VyXzIucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0pOwotCi0JCQljdHJsX3JlbW92ZV8yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMgotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCQlyZW1vdmVHdWlkYW5jZXMocm1JdGVtcyk7Ci0JCQkJCQl2aWV3ZXJfMi5yZWZyZXNoKCk7Ci0KLQkJCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJCXZpZXdlcl8yLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJCQkJfQotCQkJCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJewotCQkJY3RybF90YWJsZV8zLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMwotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQljdHJsX3JlbW92ZV8zLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXZpZXdlcl8zCi0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzMKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJfQotCQkJCQl9KTsKLQotCQkJY3RybF9hZGRfMy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCQlEZWxpdmVyeVByb2Nlc3MgcHJvYyA9IChEZWxpdmVyeVByb2Nlc3MpIGVsZW1lbnQ7Ci0KLQkJCQkJCUlGaWx0ZXIgZmlsdGVyID0gZ2V0U3VwcG9ydGluZ01hdGVyaWFsRmlsdGVyKCk7Ci0JCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBwcm9jLAotCQkJCQkJCQlGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFMsIHByb2MKLQkJCQkJCQkJCQkuZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKSk7Ci0KLQkJCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRSk7Ci0JCQkJCQlmZAotCQkJCQkJCQkuc2V0SW5wdXQoVW1hVXRpbAotCQkJCQkJCQkJCS5nZXRNZXRob2RMaWJyYXJ5KChFT2JqZWN0KSBlbGVtZW50KSk7Ci0JCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCWZkLm9wZW4oKTsKLQotCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwKLQkJCQkJCQkJCQlwcm9jLAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWxzKCksCi0JCQkJCQkJCQkJZmQuZ2V0U2VsZWN0ZWRJdGVtcygpLCAtMSk7Ci0JCQkJCX0KLQotCQkJCQl2aWV3ZXJfMy5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWN0cmxfcmVtb3ZlXzMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8zCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJCQlEZWxpdmVyeVByb2Nlc3MgcHJvYyA9IChEZWxpdmVyeVByb2Nlc3MpIGVsZW1lbnQ7Ci0JCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLAotCQkJCQkJCQkJCQlwcm9jLAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKSwKLQkJCQkJCQkJCQkJcm1JdGVtcywgLTEpOwotCQkJCQkJfQotCQkJCQkJdmlld2VyXzMucmVmcmVzaCgpOwotCi0JCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCQl2aWV3ZXJfMy5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCXsKLQkJCWN0cmxfdGFibGVfNC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzQKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJY3RybF9yZW1vdmVfNC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0pOwotCi0JCQl2aWV3ZXJfNAotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl80Ci0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCWN0cmxfYWRkXzQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQkJRGVsaXZlcnlQcm9jZXNzIHByb2MgPSAoRGVsaXZlcnlQcm9jZXNzKSBlbGVtZW50OwotCi0JCQkJCQlJRmlsdGVyIGZpbHRlciA9IGdldFN1cHBvcnRpbmdNYXRlcmlhbEZpbHRlcigpOwotCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJLmdldFNoZWxsKCksIGZpbHRlciwgcHJvYywKLQkJCQkJCQkJRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTLCBwcm9jCi0JCQkJCQkJCQkJLmdldEVkdWNhdGlvbk1hdGVyaWFscygpKTsKLQotCQkJCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFKTsKLQkJCQkJCWZkCi0JCQkJCQkJCS5zZXRJbnB1dChVbWFVdGlsCi0JCQkJCQkJCQkJLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGVsZW1lbnQpKTsKLQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJZmQub3BlbigpOwotCi0JCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLAotCQkJCQkJCQkJCXByb2MsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWxzKCksCi0JCQkJCQkJCQkJZmQuZ2V0U2VsZWN0ZWRJdGVtcygpLCAtMSk7Ci0KLQkJCQkJCXZpZXdlcl80LnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQljdHJsX3JlbW92ZV80LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfNAotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQkJCURlbGl2ZXJ5UHJvY2VzcyBwcm9jID0gKERlbGl2ZXJ5UHJvY2VzcykgZWxlbWVudDsKLQkJCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksCi0JCQkJCQkJCQkJCXByb2MsCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbHMoKSwKLQkJCQkJCQkJCQkJcm1JdGVtcywgLTEpOwotCQkJCQkJfQotCQkJCQkJdmlld2VyXzQucmVmcmVzaCgpOwotCi0JCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCQl2aWV3ZXJfNC5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0KLQkJCQkJfQotCQkJCQljdHJsX3JlbW92ZV80LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgZ3VpZGFuY2VzIHRvIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIGFkZEl0ZW1zCi0JICogCQkJCWxpc3Qgb2YgZ3VpZGFuY2VzIHRvIGFkZAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRHdWlkYW5jZXMoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJQWRkR3VpZGFuY2VUb0JyZWFrZG93bkVsZW1lbnRDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkR3VpZGFuY2VUb0JyZWFrZG93bkVsZW1lbnRDb21tYW5kKAotCQkJCWVsZW1lbnQsIGFkZEl0ZW1zKTsKLQkJYWN0aW9uTWdyLmV4ZWN1dGUoY29tbWFuZCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGd1aWRhbmNlcyBmcm9tIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIHJtSXRlbXMKLQkgKiAJCQkJbGlzdCBvZiBndWlkYW5jZXMgdG8gcmVtb3ZlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUd1aWRhbmNlcyhBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBndWlkYW5jZXMgZm9yIGFjdGl2aXR5Ci0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfQ29uY2VwdHMoKSwgaXRlbSwKLQkJCQkJCQktMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfRXhhbXBsZXMoKSwgaXRlbSwKLQkJCQkJCQktMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwgaXRlbSwKLQkJCQkJCQktMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1JldXNhYmxlQXNzZXRzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJvYWRtYXApIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Sb2FkbWFwcygpLCBpdGVtLAotCQkJCQkJCS0xKTsKLQkJCQl9IGVsc2UgewotCQkJCQlsb2dnZXIKLQkJCQkJCQkubG9nRXJyb3IoIkNhbid0IHJlbW92ZSBHdWlkYW5jZTogIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IGV4aXN0aW5nIGd1aWRhbmNlcyBvZiB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKiAJCQlsaXN0IG9mIGV4aXN0aW5nIGd1aWRhbmNlcy4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50cygpIHsKLQotCQlMaXN0IGl0ZW1MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldENoZWNrbGlzdHMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldENvbmNlcHRzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRFeGFtcGxlcygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0R3VpZGVsaW5lcygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0UmV1c2FibGVBc3NldHMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKSk7Ci0KLQkJRGlhZ3JhbUluZm8gaW5mbyA9IG5ldyBEaWFncmFtSW5mbygoQWN0aXZpdHkpIGVsZW1lbnQpOwotCQlpZiAoaW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKSAhPSBudWxsKQotCQkJaXRlbUxpc3QuYWRkKGluZm8uZ2V0QWN0aXZpdHlEaWFncmFtKCkpOwotCQlpZiAoaW5mby5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKSAhPSBudWxsKQotCQkJaXRlbUxpc3QuYWRkKGluZm8uZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkpOwotCQlpZiAoaW5mby5nZXRXUEREaWFncmFtKCkgIT0gbnVsbCkKLQkJCWl0ZW1MaXN0LmFkZChpbmZvLmdldFdQRERpYWdyYW0oKSk7Ci0KLQkJcmV0dXJuIGl0ZW1MaXN0OwotCX0KLQotCS8qKgotCSAqIEdldCBzZWxlY3RlZCBndWlkYW5jZXMKLQkgKiBAcmV0dXJuCi0JICogCQkJbGlzdCBvZiBzZWxlY3RlZCBndWlkYW5jZXMKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoKSB7Ci0JCUxpc3QgaXRlbUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0Q2hlY2tsaXN0cygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0Q29uY2VwdHMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldEV4YW1wbGVzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRHdWlkZWxpbmVzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRSZXVzYWJsZUFzc2V0cygpKTsKLQkJTGlzdCBzdXBwb3J0aW5nTWF0ZXJpYWxzID0gZWxlbWVudC5nZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCk7Ci0JCURpYWdyYW1JbmZvIGluZm8gPSBuZXcgRGlhZ3JhbUluZm8oKEFjdGl2aXR5KSBlbGVtZW50KTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gc3VwcG9ydGluZ01hdGVyaWFscy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpCi0JCQkJaWYgKCFpbmZvLmlzRGlhZ3JhbSgoU3VwcG9ydGluZ01hdGVyaWFsKSBvYmopKSB7Ci0JCQkJCWl0ZW1MaXN0LmFkZChvYmopOwotCQkJCX0KLQkJfQotCi0JCXJldHVybiBpdGVtTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gbGlzdCBvZiBmaWx0ZXIgdHlwZXMKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsdGVyVHlwZXMoKSB7Ci0JCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbMTRdOwotCQlpbnQgaSA9IDA7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5DSEVDS0xJU1RTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5DT05DRVBUUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkrIEZpbHRlckNvbnN0YW50cy5FU1RJTUFURV9DT05TSURFUkFUSU9OUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuRVhBTVBMRVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkdVSURFTElORVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlBSQUNUSUNFUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuUkVQT1JUUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuUkVVU0FCTEVfQVNTRVRTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuVEVNUExBVEVTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5UT09MX01FTlRPUlM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLldISVRFX1BBUEVSUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuVEVSTV9ERUZJTklUSU9OUzsKLQkJcmV0dXJuIHN0cjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5Um9sbHVwU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5Um9sbHVwU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjZlMDBhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eVJvbGx1cFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db2x1bW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkV4cG9zZWRBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlByb2Nlc3NWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklDb2x1bW5Bd2FyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSByb2xsdXAgc2VjdGlvbiBmb3IgYWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWN0aXZpdHlSb2xsdXBTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQkvLyBjb250cm9scwotCXByaXZhdGUgRm9ybVRvb2xraXQgdG9vbGtpdDsKLQotCXByb3RlY3RlZCBTZWN0aW9uIHNlY3Rpb247Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSByb2xsdXBDb21wb3NpdGU7Ci0KLQlwcml2YXRlIFByb2Nlc3NWaWV3ZXIgdmlld2VyOwotCi0JLy8gcHJpdmF0ZSBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCS8vIGVsZW1lbnQKLQlwcml2YXRlIEFjdGl2aXR5IGVsZW1lbnQ7Ci0KLQkvLyBhY3Rpb24gbWFuYWdlcgotCS8vIHByb3RlY3RlZCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgc3RvcmU7Ci0KLQlwcm90ZWN0ZWQgQ29sdW1uRGVzY3JpcHRvcltdIGNvbHVtbkRlc2NyaXB0b3JzOwotCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0KLQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZQotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQkvLyBnZXQgQWN0aXZpdHkgb2JqZWN0Ci0JCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQotCQkvLyBnZXQgdG9vbGtpdAotCQl0b29sa2l0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpOwotCi0JCS8vIGdldCBwcmVmZXJlbmNlIHN0b3JlCi0JCXN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCQlpbml0KCk7Ci0KLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIGNyZWF0ZSByb2xsdXAgc2VjdGlvbgotCQljcmVhdGVSb2xsdXBTZWN0aW9uKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHJvbGx1cCBzZWN0aW9uIG9uIHRoZSBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJvbGx1cFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkvLyBjcmVhdGUgc2VjdGlvbgotCQlzZWN0aW9uID0gRm9ybVVJCi0JCQkJLmNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgY29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1dvcmtSb2xsdXAsIAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9Xb3JrUm9sbHVwRGVzY3JpcHRpb24pOyAKLQotCQkvLyBjcmVhdGUgcm9sbHVwIGNvbXBvc2l0ZQotCQlyb2xsdXBDb21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb24sIDIsIGZhbHNlKTsKLQotCQkvLyBzZXQgc2VjdGlvbiBsYWJlbHMKLQkJc2V0U2VjdGlvbkxhYmVscygpOwotCi0JCS8vIGNyZWF0ZSB2aWV3ZXIKLQkJdmlld2VyID0gbmV3IFByb2Nlc3NWaWV3ZXIocm9sbHVwQ29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IDEwOwotCQkvLyBncmlkRGF0YS5oZWlnaHRIaW50ID0gNjAwOwotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIGluaXRBZGFwdGVyRmFjdG9yeQotCQlpbml0QWRhcHRlckZhY3RvcnkoKTsKLQotCQkvLyBzZXQgdXAgY29sdW1ucwotCQl2aWV3ZXIuc2V0dXBDb2x1bW5zKGNvbHVtbkRlc2NyaXB0b3JzKTsKLQkJc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoYWRhcHRlckZhY3RvcnksIGNvbHVtbkRlc2NyaXB0b3JzKTsKLQotCQkvLyBzZXQgdXAgcHJvdmlkZXJzCi0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlhZGFwdGVyRmFjdG9yeSkpOwotCQl2aWV3ZXIKLQkJCQkuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQkJYWRhcHRlckZhY3RvcnkpKTsKLQotCQkvLyBkbyByb2xsIHVwCi0JCXJvbGxVcCgpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJvbGxVcCgpIHsKLQkJLy8gc2V0IHVwIGNvbHVtbnMKLQkJdmlld2VyLnNldElucHV0KGVsZW1lbnQpOwotCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCWVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWFkYXB0ZXIuc2V0Um9sbGVkVXAodHJ1ZSk7Ci0JCXZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LAotCQkJQ29sdW1uRGVzY3JpcHRvcltdIGNvbHVtbkRlc2NyaXB0b3JzKSB7Ci0JCU1hcCBjb2x1bW5JbmRleFRvTmFtZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbHVtbkluZGV4VG9OYW1lTWFwLnB1dChuZXcgSW50ZWdlcihpKSwgY29sdW1uRGVzY3JpcHRvcnNbaV0uaWQpOwotCQl9Ci0JCSgoSUNvbHVtbkF3YXJlKSBmYWN0b3J5KS5zZXRDb2x1bW5JbmRleFRvTmFtZU1hcChjb2x1bW5JbmRleFRvTmFtZU1hcCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCS8vIGdldCBBY3Rpdml0eSBvYmplY3QKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQotCQkJCXJvbGxVcCgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcigKLQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgYWN0aXZpdHkgd29yayByb2xsIHVwIHNlY3Rpb24iLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgYWRhcHRlciBmYWN0b3J5Ci0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0QWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIFNldCBsYWJlbCBmb3IgdGhlIHNlY3Rpb24KLQkgKgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNldFNlY3Rpb25MYWJlbHMoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eVRlYW1Sb2xsdXBTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlUZWFtUm9sbHVwU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTUyZmZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eVRlYW1Sb2xsdXBTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlByb2Nlc3NGb3JtVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotCi0KLS8qKgotICogVGhlIHRlYW0gcm9sbHVwIHNlY3Rpb24gZm9yIGFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5VGVhbVJvbGx1cFNlY3Rpb24gZXh0ZW5kcyBBY3Rpdml0eVJvbGx1cFNlY3Rpb24gewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlSb2xsdXBTZWN0aW9uI2luaXRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEFkYXB0ZXJGYWN0b3J5KCkgewotCQkvLyBnZXQgY29sdW1uIGRlc2NyaXB0b3JzCi0JCWNvbHVtbkRlc2NyaXB0b3JzID0gUHJvY2Vzc0Zvcm1VdGlsLnRvQ29sdW1uRGVzY3JpcHRvcnMoc3RvcmUKLQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1RCU19DT0xVTU5TKSk7Ci0KLQkJLy8gY3JlYXRlIGFkYXB0ZXIgZmFjdG9yeQotCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVRCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJLnNldEZpbHRlcihjb25maWd1cmF0b3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlSb2xsdXBTZWN0aW9uI3NldFNlY3Rpb25MYWJlbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNlY3Rpb25MYWJlbHMoKSB7Ci0JCXNlY3Rpb24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1RlYW1Sb2xsdXApOyAKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1RlYW1Sb2xsdXBEZXNjcmlwdGlvbik7IAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eVdvcmtQcm9kdWN0c1JvbGx1cFNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eVdvcmtQcm9kdWN0c1JvbGx1cFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcxOWMxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlXb3JrUHJvZHVjdHNSb2xsdXBTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlByb2Nlc3NGb3JtVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotCi0KLS8qKgotICogVGhlIHdvcmsgcHJvZHVjdHMgcm9sbHVwIHNlY3Rpb24gZm9yIGFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5V29ya1Byb2R1Y3RzUm9sbHVwU2VjdGlvbiBleHRlbmRzIEFjdGl2aXR5Um9sbHVwU2VjdGlvbiB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BY3Rpdml0eVJvbGx1cFNlY3Rpb24jaW5pdEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCS8vIGdldCBjb2x1bW4gZGVzY3JpcHRvcnMKLQkJY29sdW1uRGVzY3JpcHRvcnMgPSBQcm9jZXNzRm9ybVV0aWwudG9Db2x1bW5EZXNjcmlwdG9ycyhzdG9yZQotCQkJCS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV1BCU19DT0xVTU5TKSk7Ci0KLQkJLy8gY3JlYXRlIGFkYXB0ZXIgZmFjdG9yeQotCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVdQQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCSgoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCS5zZXRGaWx0ZXIoY29uZmlndXJhdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFjdGl2aXR5Um9sbHVwU2VjdGlvbiNzZXRTZWN0aW9uTGFiZWxzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZWN0aW9uTGFiZWxzKCkgewotCQlzZWN0aW9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9Xb3JrUHJvZHVjdHNSb2xsdXApOyAKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cERlc2NyaXB0aW9uKTsgCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5V29ya1JvbGx1cFNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eVdvcmtSb2xsdXBTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMDNmZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5V29ya1JvbGx1cFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29sdW1uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLQotLyoqCi0gKiBUaGUgd29yayByb2xsdXAgc2VjdGlvbiBmb3IgYWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlXb3JrUm9sbHVwU2VjdGlvbiBleHRlbmRzIEFjdGl2aXR5Um9sbHVwU2VjdGlvbiB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BY3Rpdml0eVJvbGx1cFNlY3Rpb24jaW5pdEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCS8vIGdldCBjb2x1bW4gZGVzY3JpcHRvcnMKLQkJY29sdW1uRGVzY3JpcHRvcnMgPSBnZXRDb2x1bW5EZXNjcmlwdG9ycygpOwotCi0JCS8vIGNyZWF0ZSBhZGFwdGVyIGZhY3RvcnkKLQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVXQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJLnNldEZpbHRlcihjb25maWd1cmF0b3IpOwotCQl9Ci0KLQl9Ci0JCi0JcHJpdmF0ZSBDb2x1bW5EZXNjcmlwdG9yW10gZ2V0Q29sdW1uRGVzY3JpcHRvcnMoKSB7Ci0JCUNvbHVtbkRlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IHRvQ29sdW1uRGVzY3JpcHRvcnMoc3RvcmUKLQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKSk7Ci0JCQotCQkvLyBkb24ndCBzaG93IGNvbHVtbiAiUHJlZGVjZXNzb3JzIgotCQkvLwotCQlpbnQgaW5kZXggPSAtMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJaWYoZGVzY3JpcHRvcnNbaV0gPT0gUHJvY2Vzc0VkaXRvci5DT0xfREVTQ19QUkVERUNFU1NPUlMpIHsKLQkJCQlpbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9CQkJCi0JCX0KLQkJaWYoaW5kZXggIT0gLTEpIHsKLQkJCUNvbHVtbkRlc2NyaXB0b3JbXSBjb2xEZXNjcmlwdG9ycyA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yW2Rlc2NyaXB0b3JzLmxlbmd0aCAtIDFdOwotCQkJaWYoaW5kZXggPiAwKSB7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShkZXNjcmlwdG9ycywgMCwgY29sRGVzY3JpcHRvcnMsIDAsIGluZGV4KTsKLQkJCX0KLQkJCWludCBsZW4gPSBkZXNjcmlwdG9ycy5sZW5ndGggLSAxIC0gaW5kZXg7Ci0JCQlpZihsZW4gPiAwKSB7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShkZXNjcmlwdG9ycywgaW5kZXggKyAxLCBjb2xEZXNjcmlwdG9ycywgaW5kZXgsIGxlbik7Ci0JCQl9Ci0JCQlyZXR1cm4gY29sRGVzY3JpcHRvcnM7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgc3RyaW5nIGludG8gY29sdW0gZGVzY3JpcHRvciBsaXN0Ci0JICogQHBhcmFtIHN0cgotCSAqIEByZXR1cm4KLQkgKiAJCUxpc3Qgb2YgY29sdW1uIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBFTGlzdCB0b0NvbHVtbkRlc2NyaXB0b3JMaXN0KFN0cmluZyBzdHIpIHsKLQkJRUxpc3QgY29sdW1uRGVzY3JpcHRvcnMgPSBuZXcgQmFzaWNFTGlzdCgpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKLQkJCS8vIERPTiJUIFBVVCBJTkRFWCBDT0xVTU4KLQkJCWlmICghKHRva2VuLmVxdWFscyhQcm9jZXNzRWRpdG9yLkNPTF9ERVNDX0lELmlkKSkpIHsKLQkJCQlPYmplY3QgY29sdW1uRGVzY3JpcHRvciA9IFByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAKLQkJCQkJCS5nZXQodG9rZW4pOwotCQkJCWlmIChjb2x1bW5EZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJY29sdW1uRGVzY3JpcHRvcnMuYWRkKGNvbHVtbkRlc2NyaXB0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29sdW1uRGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBzdHJpbmcgaW50byBjb2x1bW4gZGVzY3JpcHRvcnMKLQkgKiBAcGFyYW0gc3RyCi0JICogQHJldHVybgotCSAqIAkJbGlzdCBvZiBjb2x1bW4gZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbHVtbkRlc2NyaXB0b3JbXSB0b0NvbHVtbkRlc2NyaXB0b3JzKFN0cmluZyBzdHIpIHsKLQkJTGlzdCBsaXN0ID0gdG9Db2x1bW5EZXNjcmlwdG9yTGlzdChzdHIpOwotCQlDb2x1bW5EZXNjcmlwdG9yW10gY29sdW1ucyA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KGNvbHVtbnMpOwotCQlyZXR1cm4gY29sdW1uczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BY3Rpdml0eVJvbGx1cFNlY3Rpb24jc2V0U2VjdGlvbkxhYmVscygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VjdGlvbkxhYmVscygpIHsKLQkJc2VjdGlvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfV29ya1JvbGx1cCk7IAotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfV29ya1JvbGx1cERlc2NyaXB0aW9uKTsgCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0JyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlM2JlZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0JyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5CYXNlRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5NZXRob2RGb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuUmljaFRleHRJbWFnZUxpbmtDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkltYWdlSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSBicmVha2Rvd24gZWxlbWVudCBkb2N1bWVudGF0aW9uIHNlY3Rpb24KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0KLQkvLyBjb250cm9scwotCXByb3RlY3RlZCBUZXh0IHByZWZpeFRleHQ7Ci0JCi0JcHJvdGVjdGVkIExhYmVsIHByZWZpeExhYmVsOwotCi0JcHJvdGVjdGVkIFRleHQgYnJpZWZEZXNjVGV4dDsKLQkKLQlwcm90ZWN0ZWQgTGFiZWwgYnJpZWZEZXNjTGFiZWw7Ci0JCi0JcHJvdGVjdGVkIFRleHQgZXh0ZXJuYWxJRFRleHQ7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgZXh0ZXJuYWxJRExhYmVsOwotCi0JcHJvdGVjdGVkIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBkb2N1bWVudFNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHBhcmVudDsKLQkKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGRvY3VtZW50Q29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBleHBhbmREb2N1bWVudENvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHRFZGl0b3IgY3RybF9kb2N1bWVudF9leHBhbmRlZDsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgdXNhZ2VHdWlkYW5jZTsKLQkKLQlwcm90ZWN0ZWQgUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIgdXNhZ2VHdWlkYW5jZUNvbnRhaW5lcjsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQga2V5Q29uc2lkZXJhdGlvbnM7Ci0JCi0JcHJvdGVjdGVkIFJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyIGtleUNvbnNpZGVyYXRpb25zQ29udGFpbmVyOwotCi0JcHJvdGVjdGVkIFRleHQgY3RybF9kb2N1bWVudF9leHBhbmRlZF9UZXh0OwotCi0JcHJvdGVjdGVkIEltYWdlSHlwZXJsaW5rIGV4cGFuZERvY3VtZW50TGluazsKLQotCXByb3RlY3RlZCBMYWJlbCBleHBhbmREb2N1bWVudExhYmVsOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhwYW5kRmxhZ1RleHQgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgYWN0aXZlQ29udHJvbDsKLQotCXByb3RlY3RlZCBUZXh0IGFjdGl2ZUNvbnRyb2xUZXh0OwotCi0JLy8gZWxlbWVudAotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQ7Ci0KLQkvLyBhY3Rpb24gbWFuYWdlcgotCXByb3RlY3RlZCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvLyBtb2RpZnkgbGlzdGVuZXIKLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgbW9kZWxNb2RpZnlMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBjb250ZW50TW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnRlbnRFbGVtZW50UGF0aDsKLQotCXByb3RlY3RlZCBTdHJpbmcgdHlwZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnRlbnRFbGVtZW50TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgaW50IGhlaWdodEhpbnQgPSA0MDsKLQkKLQlwcml2YXRlIExpc3RlbmVyIHVzYWdlR3VpZGFuY2VMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGV4cGFuZEZsYWcgPyBjdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCTogdXNhZ2VHdWlkYW5jZTsKLQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbikgZWxlbWVudAotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldFVzYWdlR3VpZGFuY2UoKTsKLQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQl1c2FnZUd1aWRhbmNlLCBvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCksCi0JCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBMaXN0ZW5lciBrZXlDb25zaWRlcmF0aW9uc0xpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZXhwYW5kRmxhZyA/IGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJOiBrZXlDb25zaWRlcmF0aW9uczsKLQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKENvbnRlbnREZXNjcmlwdGlvbikgZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSkKLQkJCQkJLmdldEtleUNvbnNpZGVyYXRpb25zKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJa2V5Q29uc2lkZXJhdGlvbnMsIG9sZENvbnRlbnQpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlbGVtZW50Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCksIG5ld0NvbnRlbnQsCi0JCQkJCQktMSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCS8vIGdldCBCcmVha2Rvd25FbGVtZW50IG9iamVjdAotCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQotCQkvLyBnZXQgdG9vbGtpdAotCQl0b29sa2l0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpOwotCi0JCS8vIGdldCBhY3Rpb24gbWFuYWdlcgotCQlhY3Rpb25NZ3IgPSBFUEZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0KLQkJLy8gc2V0IGNvbnRlbnQgZWxlbWVudCBwYXRoCi0JCWNvbnRlbnRFbGVtZW50UGF0aCA9IFJlc291cmNlSGVscGVyLmdldEZvbGRlckFic29sdXRlUGF0aChlbGVtZW50KTsgCi0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LAotCQkJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCQlpbml0KCk7Ci0KLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIGNyZWF0ZSBEb2NtZW50IHNlY3Rpb24KLQkJY3JlYXRlRG9jdW1lbnRTZWN0aW9uKHBhcmVudCk7Ci0KLQkJLy8gYWRkIGxpc3RlbmVycwotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQkvLyB1cGRhdGUgY29udHJvbHMKLQkJdXBkYXRlQ29udHJvbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCi0JCXBhcmVudC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJaWYgKGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQgIT0gbnVsbCkgewotCQkJCQkoKEdyaWREYXRhKSBjdHJsX2RvY3VtZW50X2V4cGFuZGVkLmdldExheW91dERhdGEoKSkuaGVpZ2h0SGludCA9IGdldFJpY2hUZXh0RWRpdG9ySGVpZ2h0KCk7Ci0JCQkJCSgoR3JpZERhdGEpIGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCk7Ci0JCQkJfQotCQkJCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xNb3ZlZChDb250cm9sRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQkKLQkJcHJlZml4VGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlZml4KCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBlbGVtZW50LmdldFByZWZpeCgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJcHJlZml4VGV4dCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IFN0clV0aWwuZ2V0UGxhaW5UZXh0KHByZWZpeFRleHQuZ2V0VGV4dCgpKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQllbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlZml4KCksIG5ld0NvbnRlbnQsCi0JCQkJCQkJLTEpOwotCQkJCQlpZiAoc3RhdHVzKSB7Ci0JCQkJCQlwcmVmaXhUZXh0LnNldFRleHQobmV3Q29udGVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWJyaWVmRGVzY1RleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGVsZW1lbnQuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJYnJpZWZEZXNjVGV4dCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IFN0clV0aWwuZ2V0UGxhaW5UZXh0KGJyaWVmRGVzY1RleHQKLQkJCQkJCS5nZXRUZXh0KCkpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCWVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3RhdHVzKSB7Ci0JCQkJCQlicmllZkRlc2NUZXh0LnNldFRleHQobmV3Q29udGVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJCi0JCWV4dGVybmFsSURUZXh0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsJCQkJCi0JCQkJCi0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBlbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldEV4dGVybmFsSWQoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWV4dGVybmFsSURUZXh0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gU3RyVXRpbC5nZXRQbGFpblRleHQoZXh0ZXJuYWxJRFRleHQKLQkJCQkJCS5nZXRUZXh0KCkpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCWVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdGF0dXMpIHsKLQkJCQkJCWV4dGVybmFsSURUZXh0LnNldFRleHQobmV3Q29udGVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJCi0JCXVzYWdlR3VpZGFuY2Uuc2V0TW9kYWxPYmplY3QoZWxlbWVudCk7Ci0JCXVzYWdlR3VpZGFuY2Uuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCkpOwotCQl1c2FnZUd1aWRhbmNlLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCB1c2FnZUd1aWRhbmNlTGlzdGVuZXIpOwotCQkKLQkJa2V5Q29uc2lkZXJhdGlvbnMuc2V0TW9kYWxPYmplY3QoZWxlbWVudCk7Ci0JCWtleUNvbnNpZGVyYXRpb25zLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKSk7Ci0JCWtleUNvbnNpZGVyYXRpb25zCi0JCQkJLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBrZXlDb25zaWRlcmF0aW9uc0xpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgZG9jdW1lbnRhdGlvbiBzZWN0aW9uIG9uIHRoZSBnaXZlbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRG9jdW1lbnRTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJaW50IGhvcml6b250YWxTcGFuID0gMjsKLQotCQkvLyBjcmVhdGUgZG9jdW1lbnQgc2VjdGlvbgotCQlkb2N1bWVudFNlY3Rpb24gPSBGb3JtVUkKLQkJCQkuY3JlYXRlU2VjdGlvbigKLQkJCQkJCXRvb2xraXQsCi0JCQkJCQljb21wb3NpdGUsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfRG9jdW1lbnRJbmZvcm1hdGlvblRpdGxlLCAKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuYmluZChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uLCBQcm9wZXJ0aWVzVXRpbC5nZXRUeXBlTG93ZXIoZWxlbWVudCkpKTsgCi0KLQkJLy8gY3JlYXRlIGRvY3VtZW50IGNvbXBvc2l0ZQotCQlkb2N1bWVudENvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgZG9jdW1lbnRTZWN0aW9uLCAzLAotCQkJCWZhbHNlKTsKLQotCQkvLyBwcmVmaXgKLQkJcHJlZml4TGFiZWwgPSBGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZG9jdW1lbnRDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19wcmVmaXgsIGhvcml6b250YWxTcGFuKTsgCi0JCXByZWZpeFRleHQgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBkb2N1bWVudENvbXBvc2l0ZSwgaGVpZ2h0SGludCk7Ci0KLQkJLy8gYnJpZWYgZGVzY3JpcHRpb24KLQkJYnJpZWZEZXNjTGFiZWwgPSBGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZG9jdW1lbnRDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19icmllZkRlc2NyaXB0aW9uLCBob3Jpem9udGFsU3Bhbik7IAotCQlicmllZkRlc2NUZXh0ID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZG9jdW1lbnRDb21wb3NpdGUsCi0JCQkJaGVpZ2h0SGludCk7Ci0JCQotCQkvLyBleHRlcm5hbCBJRAotCQlleHRlcm5hbElETGFiZWwgPSBGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZG9jdW1lbnRDb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NfRXh0ZXJuYWxJRCwgaG9yaXpvbnRhbFNwYW4pOyAKLQkJZXh0ZXJuYWxJRFRleHQgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBkb2N1bWVudENvbXBvc2l0ZSk7Ci0KLQkJLy8gY3JlYXRlIHVzYWdlIGd1aWRhbmNlCi0JCXVzYWdlR3VpZGFuY2VDb250YWluZXIgPSBGb3JtVUkuY3JlYXRlUmljaFRleHRXaXRoTGluayh0b29sa2l0LAotCQkJCWRvY3VtZW50Q29tcG9zaXRlLCBoZWlnaHRIaW50LCBjb250ZW50RWxlbWVudFBhdGgsIGVsZW1lbnQsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX3VzYWdlR3VpZGFuY2UpOwotCQlhZGRIeXBlckxpbmtMaXN0ZW5lcih1c2FnZUd1aWRhbmNlQ29udGFpbmVyLmxpbmspOwotCQl1c2FnZUd1aWRhbmNlID0gdXNhZ2VHdWlkYW5jZUNvbnRhaW5lci5yaWNoVGV4dDsKLQotCQkvLyBjcmVhdGUga2V5IGNvbnNpZGVyYXRpb25zCi0JCWtleUNvbnNpZGVyYXRpb25zQ29udGFpbmVyID0gRm9ybVVJLmNyZWF0ZVJpY2hUZXh0V2l0aExpbmsodG9vbGtpdCwKLQkJCQlkb2N1bWVudENvbXBvc2l0ZSwgaGVpZ2h0SGludCwgY29udGVudEVsZW1lbnRQYXRoLCBlbGVtZW50LAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuQnJlYWtkb3duRWxlbWVudF9rZXlDb25zaWRlcmF0aW9ucyk7Ci0JCWFkZEh5cGVyTGlua0xpc3RlbmVyKGtleUNvbnNpZGVyYXRpb25zQ29udGFpbmVyLmxpbmspOwotCQlrZXlDb25zaWRlcmF0aW9ucyA9IGtleUNvbnNpZGVyYXRpb25zQ29udGFpbmVyLnJpY2hUZXh0OwotCi0JCS8vIGNyZWF0ZSBleHBhbmRlZCBjb21wb3NpdGUKLQkJZXhwYW5kRG9jdW1lbnRDb21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsCi0JCQkJZG9jdW1lbnRTZWN0aW9uLCAyLCB0cnVlKTsKLQotCQkvLyBIeXBlcmxpbmsgZGVzYwotCQlleHBhbmREb2N1bWVudExpbmsgPSBGb3JtVUkuY3JlYXRlSW1hZ2VIeXBlckxpbmsodG9vbGtpdCwKLQkJCQlleHBhbmREb2N1bWVudENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0VYUEFOREVELAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmNsb3NlUlRFKTsgCi0JCWFkZEh5cGVyTGlua0xpc3RlbmVyKGV4cGFuZERvY3VtZW50TGluayk7Ci0KLQkJLy8gZXhwYW5kIGxhYmVsCi0JCWV4cGFuZERvY3VtZW50TGFiZWwgPSBCYXNlRm9ybVBhZ2UuY3JlYXRlRGVjb3JhdGVkTGFiZWwodG9vbGtpdCwgZXhwYW5kRG9jdW1lbnRDb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEh5cGVyTGlua0xpc3RlbmVyKEltYWdlSHlwZXJsaW5rIGxpbmspIHsKLQkJbGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJCXRvZ2dsZShlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dEVkaXRvciB0b2dnbGUoSHlwZXJsaW5rRXZlbnQgZSkgewotCQlJTWV0aG9kUmljaFRleHQgY3RybCA9IChJTWV0aG9kUmljaFRleHQpIGUuZ2V0SHJlZigpOwotCQlpZiAoY3RybF9kb2N1bWVudF9leHBhbmRlZCA9PSBudWxsKSB7Ci0JCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkID0gTWV0aG9kRm9ybVRvb2xraXQuY3JlYXRlUmljaFRleHRFZGl0b3IoCi0JCQkJCXRvb2xraXQsIGV4cGFuZERvY3VtZW50Q29tcG9zaXRlLAotCQkJCQkiIiwgU1dULk1VTFRJIHwgU1dULldSQVAsIGNvbnRlbnRFbGVtZW50UGF0aCwgZWxlbWVudCwgZXhwYW5kRG9jdW1lbnRMYWJlbCwgZ2V0RWRpdG9yKCkuZ2V0RWRpdG9yU2l0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGdldFJpY2hUZXh0RWRpdG9ySGVpZ2h0KCk7Ci0JCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JXaWR0aCgpOwotCQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJCS8vIGRvZXNuJ3Qgc2VlbSB0byB3b3JrIC0gUlRFIGlzIG5vdCBwcm9wZXIgd2lkdGggdW50aWwgd2luZG93IGlzIHJlc2l6ZWQKLS8vCQkJCSgoR3JpZERhdGEpZXhwYW5kRG9jdW1lbnRDb21wb3NpdGUuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCk7Ci0vLwkJCQkoKEdyaWREYXRhKXBhcmVudC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKTsKLS8vCQkJCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0JCQl9Ci0KLQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJfQotCi0JCWlmIChleHBhbmRGbGFnKSB7Ci0JCQlkb2N1bWVudENvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJZG9jdW1lbnRTZWN0aW9uLnNldENsaWVudChkb2N1bWVudENvbXBvc2l0ZSk7Ci0KLQkJCWV4cGFuZERvY3VtZW50Q29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCi0JCQljdHJsID0gZ2V0QWN0aXZlUmljaFRleHRDb250cm9sKCk7Ci0JCQljdHJsLnNldFRleHQoY3RybF9kb2N1bWVudF9leHBhbmRlZC5nZXRUZXh0KCkpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBjdHJsLmdldExpc3RlbmVycygpOyBpLmhhc05leHQoKTspIHsKLQkJCQlSaWNoVGV4dExpc3RlbmVyIGxpc3RlbmVyID0gKFJpY2hUZXh0TGlzdGVuZXIpIGkubmV4dCgpOwotCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIuZ2V0RXZlbnRUeXBlKCksCi0JCQkJCQlsaXN0ZW5lci5nZXRMaXN0ZW5lcigpKTsKLQkJCX0KLQotCQkJaWYgKGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuZ2V0TW9kaWZpZWQoKSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkuc2F2ZU1vZGlmaWVkUmljaFRleHQoY3RybF9kb2N1bWVudF9leHBhbmRlZCk7Ci0JCQl9Ci0KLQkJCWN0cmwuc2V0Rm9jdXMoKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGV4cGFuZGVkCi0JCQlkb2N1bWVudENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWRvY3VtZW50U2VjdGlvbi5zZXRDbGllbnQoZXhwYW5kRG9jdW1lbnRDb21wb3NpdGUpOwotCi0JCQlleHBhbmREb2N1bWVudENvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotCi0JCQlleHBhbmREb2N1bWVudExhYmVsLnNldFRleHQoKFN0cmluZykgKChJbWFnZUh5cGVybGluaykgZQotCQkJCQkuZ2V0U291cmNlKCkpLmdldERhdGEoIlRpdGxlIikpOyAvLyROT04tTkxTLTEkCi0JCQlzZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woY3RybCk7Ci0JCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldEluaXRpYWxUZXh0KGN0cmwuZ2V0VGV4dCgpKTsKLQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QoY3RybC5nZXRNb2RhbE9iamVjdCgpKTsKLQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKGN0cmwKLQkJCQkJLmdldE1vZGFsT2JqZWN0RmVhdHVyZSgpKTsKLQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0RmluZFJlcGxhY2VBY3Rpb24oY3RybC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpKTsKLQotCQkJZm9yIChJdGVyYXRvciBpID0gY3RybC5nZXRMaXN0ZW5lcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmljaFRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IChSaWNoVGV4dExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLmFkZExpc3RlbmVyKGxpc3RlbmVyLmdldEV2ZW50VHlwZSgpLAotCQkJCQkJbGlzdGVuZXIuZ2V0TGlzdGVuZXIoKSk7Ci0JCQl9Ci0KLQkJfQotCi0JCWRvY3VtZW50U2VjdGlvbi5sYXlvdXQodHJ1ZSk7Ci0KLQkJLy8gc2V0IGVkaXRhYmxlCi0JCWlmIChjdHJsX2RvY3VtZW50X2V4cGFuZGVkICE9IG51bGwpCi0JCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQotCQlleHBhbmRGbGFnID0gIWV4cGFuZEZsYWc7Ci0JCXJldHVybiBjdHJsX2RvY3VtZW50X2V4cGFuZGVkOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5BYnN0cmFjdFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zYXZlTW9kaWZpZWRSaWNoVGV4dCgpOwotCi0JCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQkJQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKSBlbGVtZW50Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0KLQkJCQkvLyB1cGRhdGUgc2VjdGlvbiBuYW1lCi0JCQkJZG9jdW1lbnRTZWN0aW9uCi0JCQkJCQkuc2V0RGVzY3JpcHRpb24oUHJvcGVydGllc1Jlc291cmNlcy5iaW5kKFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb24sIFByb3BlcnRpZXNVdGlsLmdldFR5cGVMb3dlcihlbGVtZW50KSkpOyAKLQotCQkJCWlmIChtb2RlbE1vZGlmeUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJcHJlZml4VGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJCQkJYnJpZWZEZXNjVGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJCQkJCi0JCQkJfQotCi0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCWV4dGVybmFsSURUZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCXVzYWdlR3VpZGFuY2UucmVtb3ZlTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQkJa2V5Q29uc2lkZXJhdGlvbnMKLQkJCQkJCQkucmVtb3ZlTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQl9Ci0KLQkJCQltb2RlbE1vZGlmeUxpc3RlbmVyID0gZ2V0RWRpdG9yKCkuY3JlYXRlTW9kaWZ5TGlzdGVuZXIoZWxlbWVudCk7Ci0JCQkJY29udGVudE1vZGlmeUxpc3RlbmVyID0gZ2V0RWRpdG9yKCkuY3JlYXRlTW9kaWZ5TGlzdGVuZXIoCi0JCQkJCQllbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQotCQkJCWlmIChtb2RlbE1vZGlmeUxpc3RlbmVyICE9IG51bGwKLQkJCQkJCSYmIG1vZGVsTW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgbW9kZWxNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBtb2RlbE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKHRydWUpOwotCQkJCX0KLQotCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgIT0gbnVsbAotCQkJCQkJJiYgY29udGVudE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RWxlbWVudChlbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0JCQkJfQotCi0JCQkJcHJlZml4VGV4dC5zZXRUZXh0KGVsZW1lbnQuZ2V0UHJlZml4KCkpOwotCQkJCWJyaWVmRGVzY1RleHQuc2V0VGV4dChlbGVtZW50LmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCQkJZXh0ZXJuYWxJRFRleHQuc2V0VGV4dChjb250ZW50LmdldEV4dGVybmFsSWQoKSk7Ci0KLQkJCQl1c2FnZUd1aWRhbmNlLnNldFRleHQoY29udGVudC5nZXRVc2FnZUd1aWRhbmNlKCkpOwotCQkJCWtleUNvbnNpZGVyYXRpb25zLnNldFRleHQoY29udGVudC5nZXRLZXlDb25zaWRlcmF0aW9ucygpKTsKLQotCQkJCWlmIChleHBhbmRGbGFnKSB7Ci0JCQkJCWlmIChleHBhbmREb2N1bWVudExhYmVsLmdldFRleHQoKS5lcXVhbHMoCi0JCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX3VzYWdlR3VpZGFuY2UpKSAKLQkJCQkJewotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRUZXh0KGNvbnRlbnQKLQkJCQkJCQkJLmdldFVzYWdlR3VpZGFuY2UoKSk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFNlbGVjdGlvbigwKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKSk7Ci0JCQkJCX0gZWxzZSBpZiAoZXhwYW5kRG9jdW1lbnRMYWJlbC5nZXRUZXh0KCkKLQkJCQkJCQkuZXF1YWxzKAotCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5CcmVha2Rvd25FbGVtZW50X2tleUNvbnNpZGVyYXRpb25zKSkgCi0JCQkJCXsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0VGV4dChjb250ZW50Ci0JCQkJCQkJCS5nZXRLZXlDb25zaWRlcmF0aW9ucygpKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJdXBkYXRlQ29udHJvbHMoKTsKLQotCQkJCWlmIChtb2RlbE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIG1vZGVsTW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUoZmFsc2UpOwotCQkJCX0KLQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZShmYWxzZSk7Ci0JCQkJfQotCi0JCQkJcHJlZml4VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJCQlicmllZkRlc2NUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQkJCQotCQkJCWV4dGVybmFsSURUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJdXNhZ2VHdWlkYW5jZS5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQl1c2FnZUd1aWRhbmNlLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCkpOwotCQkJCXVzYWdlR3VpZGFuY2UuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQotCQkJCWtleUNvbnNpZGVyYXRpb25zLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCWtleUNvbnNpZGVyYXRpb25zLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpKTsKLQkJCQlrZXlDb25zaWRlcmF0aW9ucy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgYnJlYWtkb3duIGVsZW1lbnQgZG9jdW1lbnRhdGlvbiBzZWN0aW9uIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJcHJlZml4VGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWJyaWVmRGVzY1RleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQlleHRlcm5hbElEVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCXVzYWdlR3VpZGFuY2Uuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQlrZXlDb25zaWRlcmF0aW9ucy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYWN0aXZlICJ1bmV4cGFuZGVkIiByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0QWN0aXZlUmljaFRleHRDb250cm9sKElNZXRob2RSaWNoVGV4dCBjdHJsKSB7Ci0JCWFjdGl2ZUNvbnRyb2wgPSBjdHJsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFjdGl2ZSAidW5leHBhbmRlZCIgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgZ2V0QWN0aXZlUmljaFRleHRDb250cm9sKCkgewotCQlyZXR1cm4gYWN0aXZlQ29udHJvbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGhlaWdodCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcmV0dXJuCi0JICogCQlIZWlnaHQgb2YgdGhlIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIGludCBnZXRSaWNoVGV4dEVkaXRvckhlaWdodCgpIHsKLQkJcmV0dXJuIHBhcmVudC5nZXRCb3VuZHMoKS5oZWlnaHQgLSAzICogMzI7Ci0JfQotCi0JLyoqCi0JICogR2V0IHdpZHRoIG9mIHRoZSByaWNoIHRleHQgY29udHJvbAotCSAqIEByZXR1cm4KLQkgKiAJCVdpZHRoIG9mIHRoZSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmljaFRleHRFZGl0b3JXaWR0aCgpIHsKLQkJcmV0dXJuIHBhcmVudC5nZXRCb3VuZHMoKS53aWR0aCAtIDIgKiAzMjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNzMwMjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLnZpZXcuVGFiYmVkUHJvcGVydHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllcy50YWJiZWQudmlldy5UYWJiZWRQcm9wZXJ0eVRpdGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIGdlbmVyYWwgdGFiIHNlY3Rpb24gZm9yIGJyZWFrZG93bkVsZW1lbnQKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQkvLyBjb250cm9scwotCXByb3RlY3RlZCBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gZ2VuZXJhbFNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGdlbmVyYWxDb21wb3NpdGUsIGNoZWNrQm94Q29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIFRleHQgbmFtZVRleHQ7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBwcmVzZW50YXRpb25OYW1lVGV4dDsKLQotCXByaXZhdGUgQnV0dG9uIG11bHRpcGxlQnV0dG9uLCBvcHRpb25hbEJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIHBsYW5uZWRCdXR0b24sIHN1cHJlc3NlZEJ1dHRvbjsKLQotCXByb3RlY3RlZCBpbnQgbnVtT2ZDb2x1bW5zID0gNDsKLQotCXByb3RlY3RlZCBpbnQgaG9yaXpvbnRhbFNwYW4gPSAzOwotCi0JLy8gcHJpdmF0ZSBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCS8vIGVsZW1lbnQKLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudCBlbGVtZW50OwotCi0JLy8gYWN0aW9uIG1hbmFnZXIKLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLy8gbW9kaWZ5IGxpc3RlbmVyCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIG1vZGVsTW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgbmFtZU1vZGlmeUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCi0JZmluYWwgYm9vbGVhbiBpZ25vcmVTdXBwcmVzc2VkID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBMaXN0ZW5lciBuYW1lRGVhY3RpdmF0ZUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IEVQRlByb3BlcnR5U2hlZXRQYWdlCi0JCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCi0JCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCVN0cmluZyBvbGRDb250ZW50ID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJbmFtZVRleHQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlTdHJpbmcgbWVzc2FnZSA9IG51bGw7Ci0JCQlpZiAoIVN0clV0aWwuaXNCbGFuayhlbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEVkaXRvcigpCi0JCQkJCQkuZ2V0U3VwcHJlc3Npb24oKTsKLQkJCQltZXNzYWdlID0gUHJvY2Vzc1V0aWwuY2hlY2tCcmVha2Rvd25FbGVtZW50TmFtZSgKLQkJCQkJCWFkYXB0ZXJGYWN0b3J5LCBlbGVtZW50LCBuYW1lVGV4dC5nZXRUZXh0KCksCi0JCQkJCQlzdXBwcmVzc2lvbiwgaWdub3JlU3VwcHJlc3NlZCk7Ci0JCQl9Ci0JCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQkJaWYgKCFuYW1lVGV4dC5nZXRUZXh0KCkuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWlmICgoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KQotCQkJCQkJCSYmIChlbGVtZW50LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpKSB7Ci0JCQkJCQlQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wID0gKFByb2Nlc3NDb21wb25lbnQpIGVsZW1lbnQKLQkJCQkJCQkJLmVDb250YWluZXIoKTsKLQkJCQkJCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmNyZWF0ZU5hbWVWYWxpZGF0b3IoCi0JCQkJCQkJCQkJcHJvY0NvbXAsCi0JCQkJCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJCQlTdHJpbmcgbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQobmFtZVRleHQuZ2V0VGV4dCgpKTsKLQotCQkJCQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQkJCQkJbXNnID0gUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1JlbmFtZV9NZXNzYWdlOyAKLQotCQkJCQkJCWlmIChBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1JlbmFtZV9UaXRsZSwgbXNnKSkgeyAKLQkJCQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oCi0JCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULCBlbGVtZW50LAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJCQkJCQkJCQluYW1lVGV4dC5nZXRUZXh0KCksIC0xKTsKLQkJCQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJCS8vIG5hbWVUZXh0LnNldFRleHQoZWxlbWVudC5nZXROYW1lKCkpOwotCi0JCQkJCQkJCX0KLQkJCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQlwcm9jQ29tcCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkJCQkJCQkJCW5hbWVUZXh0LmdldFRleHQoKSwgLTEpOwotCQkJCQkJCQlnZXRFZGl0b3IoKS5zZXRQYXJ0TmFtZSgpOwotCi0JCQkJCQkJCS8vIGFkanVzdCBwbHVnaW4gbG9jYXRpb24gYW5kIHNhdmUgdGhlCi0JCQkJCQkJCS8vIGVkaXRvcgotCQkJCQkJCQkvLwotCQkJCQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5Ci0JCQkJCQkJCQkJLmdldERlZmF1bHQoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0JCQkJCQkJCQkJZWRpdG9yCi0JCQkJCQkJCQkJCQkuZG9TYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQkJCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBlZGl0b3IKLQkJCQkJCQkJCQkJCS5nZXRQZXJzaXN0ZXIoKTsKLQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQlwZXJzaXN0ZXIKLQkJCQkJCQkJCQkJCQkuYWRqdXN0TG9jYXRpb24oZWxlbWVudAotCQkJCQkJCQkJCQkJCQkJLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCQkJCQkJdGhyb3cgZTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJLy8JIGFkanVzdCBkaWFncmFtIHJlc291cmNlIGFzIHdlbGwKLQkJCQkJCQkJCQkvLwotCQkJCQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCQkJCQkJCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZSgoUHJvY2VzcykgZWxlbWVudCwgdGhpcyk7Ci0JCQkJCQkJCQkJCWlmKG1nciAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQkJCW1nci51cGRhdGVSZXNvdXJjZVVSSSgpOwotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQkJCQkJCQltZ3IucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0KLQkJCQkJCQkJfSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gcmVwbGFjZSB3aXRoIGV4aXN0aW5nIG5hbWUKLQkJCQkJCQkJbmFtZVRleHQuc2V0VGV4dChvbGRDb250ZW50KTsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gcmVzdG9yZSB0aGUgb2xkIG5hbWUgZmlyc3QsIHRoZW4gcHJlc2VudCB0aGUKLQkJCQkJCQkvLyBlcnJvciBtZXNzYWdlIGJveAotCQkJCQkJCW5hbWVUZXh0LnNldFRleHQob2xkQ29udGVudCk7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0ludmFsaWROYW1lVGl0bGUsIG1zZyk7IAotCQkJCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCQkJCW5hbWVUZXh0LmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQluYW1lVGV4dC5zZXRGb2N1cygpOwotCQkJCQkJCQkJbmFtZVRleHQuc2VsZWN0QWxsKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlbGVtZW50LAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJCQkJCQkJCQluYW1lVGV4dC5nZXRUZXh0KCksIC0xKTsKLQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyByZXN0b3JlIHRoZSBvbGQgbmFtZSBmaXJzdCwgdGhlbiBwcmVzZW50IHRoZSBlcnJvcgotCQkJCS8vIG1lc3NhZ2UgYm94Ci0JCQkJbmFtZVRleHQuc2V0VGV4dChvbGRDb250ZW50KTsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfSW52YWxpZE5hbWVUaXRsZSwgbWVzc2FnZSk7IAotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCW5hbWVUZXh0LmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQluYW1lVGV4dC5zZXRGb2N1cygpOwotCQkJCQkJbmFtZVRleHQuc2VsZWN0QWxsKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJfQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBMaXN0ZW5lciBwcmVzZW50YXRpb25OYW1lRGVhY3RpdmF0ZUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IEVQRlByb3BlcnR5U2hlZXRQYWdlCi0JCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCi0JCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCVN0cmluZyBvbGRDb250ZW50ID0gZWxlbWVudC5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJcHJlc2VudGF0aW9uTmFtZVRleHQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlTdHJpbmcgbWVzc2FnZSA9IG51bGw7Ci0JCQkKLQkJCS8vIHlvdSBjYW4gaGF2ZSBibGFuayBwcmVzZW50YXRpb24gbmFtZSBmb3IgYWN0aXZpdHkgdGhhdCBleHRlbmRzIAotCQkJaWYgKFN0clV0aWwuaXNCbGFuayhwcmVzZW50YXRpb25OYW1lVGV4dC5nZXRUZXh0KCkpCi0JCQkJCSYmIGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50OwotCQkJCWlmICh2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbAotCQkJCQkJJiYgdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkuZXF1YWxzKAotCQkJCQkJCQlWYXJpYWJpbGl0eVR5cGUuRVhURU5EUykpIHsKLQkJCQkJCi0JCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQkJCWlmICghcHJlc2VudGF0aW9uTmFtZVRleHQuZ2V0VGV4dCgpLmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksCi0JCQkJCQkJCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuZ2V0VGV4dCgpLCAtMSk7Ci0JCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKCFTdHJVdGlsLmlzQmxhbmsoZWxlbWVudC5nZXRQcmVzZW50YXRpb25OYW1lKCkpKSB7Ci0JCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBFUEZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRFZGl0b3IoKQotCQkJCQkJLmdldFN1cHByZXNzaW9uKCk7Ci0JCQkJbWVzc2FnZSA9IFByb2Nlc3NVdGlsCi0JCQkJCQkuY2hlY2tCcmVha2Rvd25FbGVtZW50UHJlc2VudGF0aW9uTmFtZSgKLQkJCQkJCQkJYWRhcHRlckZhY3RvcnksIGVsZW1lbnQsCi0JCQkJCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LmdldFRleHQoKSwgc3VwcHJlc3Npb24sIGlnbm9yZVN1cHByZXNzZWQpOwotCQkJfQotCi0JCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCQlpZiAoIXByZXNlbnRhdGlvbk5hbWVUZXh0LmdldFRleHQoKS5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLAotCQkJCQkJCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuZ2V0VGV4dCgpLCAtMSk7Ci0JCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIHJlc3RvcmUgdGhlIG9sZCBuYW1lIGZpcnN0LCB0aGVuIHByZXNlbnQgdGhlIGVycm9yCi0JCQkJLy8gbWVzc2FnZSBib3gKLQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5zZXRUZXh0KGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQotCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19JbnZhbGlkTmFtZVRpdGxlLCBtZXNzYWdlKTsgCi0JCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LnNldEZvY3VzKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX07Ci0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJLy8gZ2V0IEJyZWFrZG93bkVsZW1lbnQgb2JqZWN0Ci0JCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCi0JCS8vIGdldCB0b29sa2l0Ci0JCXRvb2xraXQgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0KLQkJLy8gZ2V0IGFjdGlvbiBtYW5hZ2VyCi0JCWFjdGlvbk1nciA9IEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEFjdGlvbk1hbmFnZXIoKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQkJaW5pdCgpOwotCQkvLyB0aGlzLnRhYmJlZFByb3BlcnR5U2hlZXRQYWdlID0gdGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIGNyZWF0ZSBnZW5lcmFsIHNlY3Rpb24KLQkJY3JlYXRlR2VuZXJhbFNlY3Rpb24ocGFyZW50KTsKLQotCQkvLyBhZGRMaXN0ZW5lcnMKLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRyb2xzCi0JCXVwZGF0ZUNvbnRyb2xzKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiAgQWRkIGxpc3RlbmVycwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJbmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZXZlbnQud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JCW5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuYW1lRGVhY3RpdmF0ZUxpc3RlbmVyKTsKLQotCQlwcmVzZW50YXRpb25OYW1lVGV4dC5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihldmVudC53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQl9Ci0JCQkKLQkJfSk7CQkKLQkJcHJlc2VudGF0aW9uTmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIHByZXNlbnRhdGlvbk5hbWVEZWFjdGl2YXRlTGlzdGVuZXIpOwotCQlwcmVzZW50YXRpb25OYW1lVGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkvLyB3aGVuIHVzZXIgdGFiIHRvIHRoaXMgZmllbGQsIHNlbGVjdCBhbGwgdGV4dAotCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LnNlbGVjdEFsbCgpOwotCQkJCSAgCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbiB3aGVuIHRoZSBmb2N1cyBvZiB0aGUgY29tcG9uZW50IGlzIGxvc3QgCi0JCQkJaWYocHJlc2VudGF0aW9uTmFtZVRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSA+IDApewotCQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5jbGVhclNlbGVjdGlvbigpOwotCSAgICAgICAgICAgIH0gCi0JCQl9Ci0JCX0pOwotCQkKLQkJbXVsdGlwbGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCi0JCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpLAotCQkJCQkJQm9vbGVhbi52YWx1ZU9mKG11bHRpcGxlQnV0dG9uLmdldFNlbGVjdGlvbigpKSwgLTEpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCQltdWx0aXBsZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudAotCQkJCQkJCS5nZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkuYm9vbGVhblZhbHVlKCkpOwotCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCW9wdGlvbmFsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQllbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCksIEJvb2xlYW4KLQkJCQkJCQkJLnZhbHVlT2Yob3B0aW9uYWxCdXR0b24uZ2V0U2VsZWN0aW9uKCkpLCAtMSk7Ci0JCQkJaWYgKCFzdGF0dXMpCi0JCQkJCW9wdGlvbmFsQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50LmdldElzT3B0aW9uYWwoKQotCQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJcGxhbm5lZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCksIEJvb2xlYW4KLQkJCQkJCQkJLnZhbHVlT2YocGxhbm5lZEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSksIC0xKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJcGxhbm5lZEJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRJc1BsYW5uZWQoKQotCQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCXN1cHJlc3NlZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCS8vIHJldmVhbGluZwotCQkJCQlQcm9jZXNzRWRpdG9yIGVkaXRvciA9IGdldEVkaXRvcigpOwotCQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IGVkaXRvci5nZXRTdXBwcmVzc2lvbigpOwotCQkJCQlib29sZWFuIGNhblJldmVhbCA9IFByb2Nlc3NFZGl0b3IuY2FuUmV2ZWFsKAotCQkJCQkJCUFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHsgZWxlbWVudCB9KSwKLQkJCQkJCQlFUEZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCXN1cHByZXNzaW9uKTsKLQkJCQkKLQkJCQkJaWYgKCFjYW5SZXZlYWwpCQkJCQkKLQkJCQkJCXN1cHJlc3NlZEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7CQotCQkJCQllbHNlCi0JCQkJCQlzdXByZXNzZWRCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQl9Ci0JCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfU3VwcHJlc3NlZCgpLCBCb29sZWFuCi0JCQkJCQkJCS52YWx1ZU9mKHN1cHJlc3NlZEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSksIC0xKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJc3VwcmVzc2VkQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50LmdldFN1cHByZXNzZWQoKQotCQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBnZW5lcmFsIHNlY3Rpb24gb24gdGhlIGdpdmVuIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHZW5lcmFsU2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCS8vIGNyZWF0ZSBnZW5lcmFsIHNlY3Rpb24KLQkJZ2VuZXJhbFNlY3Rpb24gPSBGb3JtVUkKLQkJCQkuY3JlYXRlU2VjdGlvbigKLQkJCQkJCXRvb2xraXQsCi0JCQkJCQljb21wb3NpdGUsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uVGl0bGUsIAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5iaW5kKFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbiwgUHJvcGVydGllc1V0aWwuZ2V0VHlwZUxvd2VyKGVsZW1lbnQpKSk7IAotCi0JCS8vIGNyZWF0ZSBnZW5lcmFsIGNvbXBvc2l0ZQotCQlnZW5lcmFsQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBnZW5lcmFsU2VjdGlvbiwKLQkJCQludW1PZkNvbHVtbnMsIGZhbHNlKTsKLQotCQkvLyBuYW1lCi0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfbmFtZSk7IAotCQluYW1lVGV4dCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIFNXVC5ERUZBVUxULAotCQkJCWhvcml6b250YWxTcGFuKTsKLQotCQkvLyBwcmVzZW50YXRpb24gbmFtZQotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9wcmVzZW50YXRpb25OYW1lKTsgCi0JCXByZXNlbnRhdGlvbk5hbWVUZXh0ID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlTV1QuREVGQVVMVCwgaG9yaXpvbnRhbFNwYW4pOwotCi0JCS8vIGNyZWF0ZSBjb21wb3NpdGUgZm9yIGNoZWNrYm94Ci0JCWNoZWNrQm94Q29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgbnVtT2ZDb2x1bW5zLCB0cnVlKTsKLQotCQkvLyBvcHRpb25hbAotCQlvcHRpb25hbEJ1dHRvbiA9IEZvcm1VSS5jcmVhdGVDaGVja0J1dHRvbih0b29sa2l0LCBjaGVja0JveENvbXBvc2l0ZSwKLQkJCQkxKTsKLQkJb3B0aW9uYWxCdXR0b24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLkJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX09wdGlvbmFsKTsgCi0KLQkJLy8gTXVsdGlwbGUgT2N1cnJhbmNlcwotCQltdWx0aXBsZUJ1dHRvbiA9IEZvcm1VSS5jcmVhdGVDaGVja0J1dHRvbih0b29sa2l0LCBjaGVja0JveENvbXBvc2l0ZSwKLQkJCQkxKTsKLQkJbXVsdGlwbGVCdXR0b24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLkJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX011bHRpcGxlT2N1cnJhbmNlKTsgCi0KLQkJLy8gcGxhbm5lZAotCQlwbGFubmVkQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUNoZWNrQnV0dG9uKHRvb2xraXQsIGNoZWNrQm94Q29tcG9zaXRlLAotCQkJCTEpOwotCQlwbGFubmVkQnV0dG9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5CcmVha2Rvd25FbGVtZW50X09wdGlvbl9QbGFubmVkKTsgCi0KLQkJLy8gc3VwcmVzc2VkCi0JCXN1cHJlc3NlZEJ1dHRvbiA9IEZvcm1VSS5jcmVhdGVDaGVja0J1dHRvbih0b29sa2l0LCBjaGVja0JveENvbXBvc2l0ZSwKLQkJCQkxKTsKLQkJc3VwcmVzc2VkQnV0dG9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5CcmVha2Rvd25FbGVtZW50X09wdGlvbl9TdXByZXNzZWQpOyAKLQkJc3VwcmVzc2VkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGdlbmVyYWxDb21wb3NpdGUpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihjaGVja0JveENvbXBvc2l0ZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnkgbGlzdG5lciBmb3IgbmFtZSBhbmQgcHJlc2VudGF0aW9uIG5hbWUKLQkgKgotCSAqLwotCXB1YmxpYyBjbGFzcyBOYW1lTW9kaWZ5TGlzdGVuZXIgZXh0ZW5kcyBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyIHsKLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JCSAqLwotCi0JCXB1YmxpYyBOYW1lTW9kaWZ5TGlzdGVuZXIoRU9iamVjdCBlbGVtZW50LCBib29sZWFuIGNoZWNrQ29udGFpbmVyKSB7Ci0KLQkJCWdldEVkaXRvcigpLnN1cGVyKGVsZW1lbnQsIGNoZWNrQ29udGFpbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJc3VwZXIubW9kaWZ5VGV4dChlKTsKLQotCQkJdXBkYXRlVGl0bGUobmFtZVRleHQuZ2V0VGV4dCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBuYW1lIG1vZGlmeSBsaXN0ZW5lciBmb3IgdGhlIGdpdmVuIG9iamVjdAotCSAqIEBwYXJhbSBlT2JqCi0JICogQHJldHVybgotCSAqIAkJCWxpc3RlbmVyCi0JICovCi0JcHVibGljIE1vZGlmeUxpc3RlbmVyIGNyZWF0ZU5hbWVNb2RpZnlMaXN0ZW5lcihFT2JqZWN0IGVPYmopIHsKLQkJcmV0dXJuIGNyZWF0ZU5hbWVNb2RpZnlMaXN0ZW5lcihlT2JqLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIE1vZGlmeUxpc3RlbmVyIGNyZWF0ZU5hbWVNb2RpZnlMaXN0ZW5lcihFT2JqZWN0IGVPYmosCi0JCQlib29sZWFuIGNoZWNrQ29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgTmFtZU1vZGlmeUxpc3RlbmVyKGVPYmosIGNoZWNrQ29udGFpbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGl0bGUgb2YgdGhlIHByb3BlcnRpZXMgcGFnZQotCSAqIEBwYXJhbSB0eHQKLQkgKiAJCQluZXcgdGl0bGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVUaXRsZShTdHJpbmcgdHh0KSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0TmFtZVByZWZpeCgpICsgdHh0OwotCQlUYWJiZWRQcm9wZXJ0eUNvbXBvc2l0ZSBjb21wID0gKFRhYmJlZFByb3BlcnR5Q29tcG9zaXRlKSBwYWdlCi0JCQkJLmdldENvbnRyb2woKTsKLQkJVGFiYmVkUHJvcGVydHlUaXRsZSB0aXRsZSA9IGNvbXAuZ2V0VGl0bGUoKTsKLQotCQl0aXRsZS5zZXRUaXRsZShuYW1lLCBnZXRJbWFnZShlbGVtZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChsYWJlbFByb3ZpZGVyID09IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQlUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KTsKLQkJfQotCQlJbWFnZSB0aXRsZUltYWdlID0gbGFiZWxQcm92aWRlci5nZXRJbWFnZShvYmopOwotCQlyZXR1cm4gdGl0bGVJbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkvLyBnZXQgQnJlYWtkb3duRWxlbWVudCBvYmplY3QKLQkJCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQotCQkJCS8vIHVwZGF0ZSBzZWN0aW9uIG5hbWUKLQkJCQlnZW5lcmFsU2VjdGlvbgotCQkJCQkJLnNldERlc2NyaXB0aW9uKFByb3BlcnRpZXNSZXNvdXJjZXMuYmluZChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb24sIFByb3BlcnRpZXNVdGlsLmdldFR5cGVMb3dlcihlbGVtZW50KSkpOyAKLQotCQkJCS8vIE1vZGVsIE1vZGlmeSBsaXN0ZW5lciBmb3IgcHJlc2VudGF0aW9uIG5hbWUKLQkJCQlpZiAobW9kZWxNb2RpZnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0Ci0JCQkJCQkJLnJlbW92ZU1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQkJCX0KLQkJCQltb2RlbE1vZGlmeUxpc3RlbmVyID0gZ2V0RWRpdG9yKCkuY3JlYXRlTW9kaWZ5TGlzdGVuZXIoZWxlbWVudCk7Ci0KLQkJCQkvLyBNb2RpZnkgbGlzdGVuZXIgZm9yIG5hbWUKLQkJCQlpZiAobmFtZU1vZGlmeUxpc3RlbmVyICE9IG51bGwpCi0JCQkJCW5hbWVUZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKG5hbWVNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCQkJbmFtZU1vZGlmeUxpc3RlbmVyID0gY3JlYXRlTmFtZU1vZGlmeUxpc3RlbmVyKAotCQkJCQkJCSgoUHJvY2VzcykgZWxlbWVudCkuZUNvbnRhaW5lcigpLCB0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQluYW1lTW9kaWZ5TGlzdGVuZXIgPSBjcmVhdGVOYW1lTW9kaWZ5TGlzdGVuZXIoZWxlbWVudCk7Ci0JCQkJfQotCi0JCQkJaWYgKG1vZGVsTW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgbW9kZWxNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBtb2RlbE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKHRydWUpOwotCQkJCX0KLQkJCQlpZiAobmFtZU1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIG5hbWVNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQkJCQl9Ci0KLQkJCQluYW1lVGV4dC5zZXRUZXh0KGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5zZXRUZXh0KGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQotCQkJCWlmIChtb2RlbE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIG1vZGVsTW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUoZmFsc2UpOwotCQkJCX0KLQkJCQlpZiAobmFtZU1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIG5hbWVNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZShmYWxzZSk7Ci0JCQkJfQotCi0JCQkJbmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmFtZU1vZGlmeUxpc3RlbmVyKTsKLQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQotCQkJCW11bHRpcGxlQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50LmdldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlvcHRpb25hbEJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRJc09wdGlvbmFsKCkKLQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcGxhbm5lZEJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRJc1BsYW5uZWQoKQotCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQkvLyBnZXQgc2VsZWN0ZWQgb3JpZ2luYWwgaW5wdXQgb2JqZWN0Ci0JCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlpZiAoZ2V0RWRpdG9yKCkuZ2V0U3VwcHJlc3Npb24oKS5pc0luU3VwcHJlc3NlZExpc3QoCi0JCQkJCQkJKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBpbnB1dCkpIHsKLQkJCQkJCXN1cHJlc3NlZEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzdXByZXNzZWRCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0gZWxzZQotCQkJCXN1cHJlc3NlZEJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRTdXBwcmVzc2VkKCkKLQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0KLQkJCQl1cGRhdGVDb250cm9scygpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgYnJlYWtkb3duIGVsZW1lbnQgZ2VuZXJhbCBzZWN0aW9uIiArIGVsZW1lbnQsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCW5hbWVUZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJcHJlc2VudGF0aW9uTmFtZVRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQluYW1lVGV4dC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJcHJlc2VudGF0aW9uTmFtZVRleHQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0KLQkJbXVsdGlwbGVCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCW9wdGlvbmFsQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlwbGFubmVkQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotLy8JCXN1cHJlc3NlZEJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQnJlYWtkb3duRWxlbWVudEd1aWRhbmNlU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0JyZWFrZG93bkVsZW1lbnRHdWlkYW5jZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUxMzA5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQnJlYWtkb3duRWxlbWVudEd1aWRhbmNlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Qcm9jZXNzR3VpZGFuY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkd1aWRhbmNlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVySW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5BZGRHdWlkYW5jZVRvQnJlYWtkb3duRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLS8qKgotICogVGhlIGJyZWFrZG93biBlbGVtZW50IGd1aWRhbmNlIHNlY3Rpb24uIEl0IGxpc3QgYWxsIGF2YWlsYWJsZSBndWlkYW5jZXMgZm9yIGFuIGJyZWFrZG93biBlbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEJyZWFrZG93bkVsZW1lbnRHdWlkYW5jZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQlwcml2YXRlIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZF8xLCBjdHJsX3JlbW92ZV8xOwotCi0JcHJpdmF0ZSBUYWJsZSBjdHJsX3RhYmxlXzE7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIHZpZXdlcl8xOwotCi0JLy8gZWxlbWVudAotCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudCBlbGVtZW50OwotCi0JLy8gYWN0aW9uIG1hbmFnZXIKLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgdGFiTmFtZSA9IEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQotCXByaXZhdGUgSUZpbHRlciBnZW5lcmFsR3VpZGFuY2VGaWx0ZXIgPSBudWxsOwotCi0JCi0KLQkvKioKLQkgKiBHZXQgR2VuZXJhbCBndWlkYW5jZSBmaWx0ZXIKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRHZW5lcmFsR3VpZGFuY2VGaWx0ZXIoKSB7Ci0JCWlmIChnZW5lcmFsR3VpZGFuY2VGaWx0ZXIgPT0gbnVsbCkgewotCQkJZ2VuZXJhbEd1aWRhbmNlRmlsdGVyID0gbmV3IFByb2Nlc3NHdWlkYW5jZUZpbHRlcigKLQkJCQkJZ2V0Q29uZmlndXJhdGlvbigpLCBudWxsLCB0YWJOYW1lKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2VJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCWlmICgoKEd1aWRhbmNlSXRlbVByb3ZpZGVyKSBvYmopLmdldENoaWxkcmVuKG9iaikKLQkJCQkJCQkJLmlzRW1wdHkoKSkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQkJQ2xhc3MgY2xzID0gRmlsdGVySW5pdGlhbGl6ZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDbGFzc0ZvclR5cGUoaGVscGVyLmdldEZpbHRlclR5cGVTdHIoKSk7Ci0JCQkJCWlmIChjbHMgIT0gbnVsbCkgewotCQkJCQkJaWYgKGNscy5pc0luc3RhbmNlKG9iaikpIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICgob2JqIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB8fCAob2JqIGluc3RhbmNlb2YgQ29uY2VwdCkKLQkJCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgRXhhbXBsZSkKLQkJCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgR3VpZGVsaW5lKQotCQkJCQkJCXx8IChvYmogaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KQotCQkJCQkJCXx8IChvYmogaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkJfQotCQkJfTsKLQkJfWVsc2UgewotCQkJKChQcm9jZXNzR3VpZGFuY2VGaWx0ZXIpIGdlbmVyYWxHdWlkYW5jZUZpbHRlcikuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihnZXRDb25maWd1cmF0aW9uKCkpOwotCQl9Ci0JCXJldHVybiBnZW5lcmFsR3VpZGFuY2VGaWx0ZXI7Ci0JfQotCi0JCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LAotCQkJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpIHsKLQotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQkJaW5pdCgpOwotCi0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBjcmVhdGUgZ3VpZGFuY2Ugc2VjdGlvbgotCQljcmVhdGVHdWlkYW5jZVNlY3Rpb24ocGFyZW50KTsKLQotCQkvLyBhZGQgbGlzdGVuZXJzCi0JCWFkZExpc3RlbmVycygpOwotCi0JCS8vIHVwZGF0ZSBjb250cm9scwotCQl1cGRhdGVDb250cm9scygpOwotCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZQotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQkvLyBnZXQgYWN0aXZpdHkgb2JqZWN0Ci0JCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCi0JCS8vIGdldCB0b29sa2l0Ci0JCXRvb2xraXQgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0KLQkJLy8gZ2V0IGFjdGlvbiBtYW5hZ2VyCi0JCWFjdGlvbk1nciA9IEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEFjdGlvbk1hbmFnZXIoKTsKLQl9Ci0KLQotCS8qKgotCSAqICBVcGRhdGUgY29udHJvbHMgYmFzZWQgb24gZWRpdGFibGUgZmxhZy4gQ29udHJvbHMgY2FuIGJlY29tZSBlZGl0YWJsZSBvciB1bi1lZGl0YWJsZQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQljdHJsX2FkZF8xLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMQotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCi0JCQkJdmlld2VyXzEucmVmcmVzaCgpOwotCi0JCQkJLy8gaGlkZS9zaG93IGNvbnRyb2xzCi0JCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcigiRXJyb3IgcmVmcmVzaGluZyBhY3Rpdml0eSBndWlkYW5jZSBzZWN0aW9uOiAiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZ3VpZGFuY2Ugc2VjdGlvbiBvbiB0aGUgZ2l2ZW4gY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVHdWlkYW5jZVNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpbnQgdGFibGVIZWlnaHQgPSA1MDsKLQkJU3RyaW5nIHNlY3Rpb25UaXRsZSA9IG51bGw7Ci0JCVN0cmluZyBzZWN0aW9uRGVzYyA9IG51bGw7Ci0JCVN0cmluZyB0YWJsZVRpdGxlID0gbnVsbDsKLQotCQkvLyBHRU5FUkFMIEdVSURBTkNFCi0JCXsKLQkJCXNlY3Rpb25UaXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlVGl0bGU7IAotCQkJc2VjdGlvbkRlc2MgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZURlc2NyaXB0aW9uOyAKLQkJCXRhYmxlVGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1NlbGVjdGVkX0dlbmVyYWxHdWlkYW5jZTsgCi0KLQkJCVNlY3Rpb24gc2VjdGlvbiA9IEZvcm1VSS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQkJc2VjdGlvblRpdGxlLCBzZWN0aW9uRGVzYyk7Ci0KLQkJCS8vIGNyZWF0ZSBjb21wb3NpdGUKLQkJCUNvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LAotCQkJCQlzZWN0aW9uLCAyLCBmYWxzZSk7Ci0KLQkJCUNvbXBvc2l0ZSBwYW5lMSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMSwgdGFibGVUaXRsZSk7Ci0KLQkJCWN0cmxfdGFibGVfMSA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSwgdGFibGVIZWlnaHQpOwotCQkJdmlld2VyXzEgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF90YWJsZV8xKTsKLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoKSkudG9BcnJheSgpOwotCQkJCX0KLQkJCX07Ci0KLQkJCXZpZXdlcl8xLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQkJdmlld2VyXzEuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJCXZpZXdlcl8xLnNldElucHV0KGVsZW1lbnQpOwotCi0JCQkvLyBjcmVhdGUgYnV0dG9ucyBmb3IgdGFibGUyCi0JCQlDb21wb3NpdGUgcGFuZTIgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCi0JCQljdHJsX2FkZF8xID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZCk7Ci0JCQljdHJsX3JlbW92ZV8xID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1JlbW92ZSk7Ci0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgZ2V0QWRhcHRlcigpOwotCQlPYmplY3QgcGFyZW50ID0gbnVsbDsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCUlCU0l0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXI7Ci0JCQlwYXJlbnQgPSBic0l0ZW1Qcm92aWRlci5nZXRUb3BJdGVtKCk7Ci0JCX0gZWxzZSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKCJBY3Rpdml0eUd1aWRhbmNlU2VjdGlvbjo6YWRkTGlzdGVuZXJzIC0gSUJTSXRlbVByb3ZpZGVyIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJewotCQkJY3RybF90YWJsZV8xLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMQotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXZpZXdlcl8xCi0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzEKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJfQotCQkJCQl9KTsKLQotCQkJY3RybF9hZGRfMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCUlGaWx0ZXIgZmlsdGVyID0gZ2V0R2VuZXJhbEd1aWRhbmNlRmlsdGVyKCk7Ci0JCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBlbGVtZW50LAotCQkJCQkJCUZpbHRlckNvbnN0YW50cy5HVUlEQU5DRSwgZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoKSk7Ci0KLQkJCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLlJPQURNQVApOwotCQkJCQlmZC5zZXRJbnB1dChVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGVsZW1lbnQpKTsKLQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCWZkLm9wZW4oKTsKLQkJCQkJYWRkR3VpZGFuY2VzKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCXZpZXdlcl8xLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJY3RybF9yZW1vdmVfMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzEKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJcmVtb3ZlR3VpZGFuY2VzKHJtSXRlbXMpOwotCQkJCQkJdmlld2VyXzEucmVmcmVzaCgpOwotCi0JCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCQl2aWV3ZXJfMS5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBndWlkYW5jZXMgdG8gdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gYWRkSXRlbXMKLQkgKiAJCQkJbGlzdCBvZiBndWlkYW5jZXMgdG8gYWRkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEd1aWRhbmNlcyhMaXN0PEd1aWRhbmNlPiBhZGRJdGVtcykgewotCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCUFkZEd1aWRhbmNlVG9CcmVha2Rvd25FbGVtZW50Q29tbWFuZCBjb21tYW5kID0gbmV3IEFkZEd1aWRhbmNlVG9CcmVha2Rvd25FbGVtZW50Q29tbWFuZCgKLQkJCQllbGVtZW50LCBhZGRJdGVtcyk7Ci0JCWFjdGlvbk1nci5leGVjdXRlKGNvbW1hbmQpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBndWlkYW5jZXMgZnJvbSB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBybUl0ZW1zCi0JICogCQkJCWxpc3Qgb2YgZ3VpZGFuY2VzIHRvIHJlbW92ZQotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVHdWlkYW5jZXMoTGlzdDxHdWlkYW5jZT4gcm1JdGVtcykgewotCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBndWlkYW5jZXMgZm9yIGFjdGl2aXR5Ci0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfQ29uY2VwdHMoKSwgaXRlbSwKLQkJCQkJCQktMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfRXhhbXBsZXMoKSwgaXRlbSwKLQkJCQkJCQktMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwgaXRlbSwKLQkJCQkJCQktMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1JldXNhYmxlQXNzZXRzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxvZ2dlcgotCQkJCQkJCS5sb2dFcnJvcigiQ2FuJ3QgcmVtb3ZlIEd1aWRhbmNlOiAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBHZXQgc2VsZWN0ZWQgZ3VpZGFuY2VzCi0JICogQHJldHVybgotCSAqIAkJCWxpc3Qgb2YgZXhpc3Rpbmcgc2VsZWN0ZWQgZ3VpZGFuY2VzCi0JICovCi0JcHJpdmF0ZSBMaXN0PEd1aWRhbmNlPiBnZXRTZWxlY3RlZEd1aWRhbmNlcygpIHsKLQkJTGlzdDxHdWlkYW5jZT4gaXRlbUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0Q2hlY2tsaXN0cygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0Q29uY2VwdHMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldEV4YW1wbGVzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRHdWlkZWxpbmVzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRSZXVzYWJsZUFzc2V0cygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpKTsKLQotCQlyZXR1cm4gaXRlbUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGxpc3Qgb2YgZmlsdGVyIHR5cGVzCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlclR5cGVzKCkgewotCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nWzE0XTsKLQkJaW50IGkgPSAwOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuQ0hFQ0tMSVNUUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuQ09OQ0VQVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJKyBGaWx0ZXJDb25zdGFudHMuRVNUSU1BVEVfQ09OU0lERVJBVElPTlM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkVYQU1QTEVTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5HVUlERUxJTkVTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5QUkFDVElDRVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlJFUE9SVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlJFVVNBQkxFX0FTU0VUUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRFTVBMQVRFUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuVE9PTF9NRU5UT1JTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5XSElURV9QQVBFUlM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRFUk1fREVGSU5JVElPTlM7Ci0JCXJldHVybiBzdHI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Db21wb3NpdGVSb2xlUm9sZVNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Db21wb3NpdGVSb2xlUm9sZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmYTIwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQ29tcG9zaXRlUm9sZVJvbGVTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5JdGVtc0ZpbHRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIGNvbXBvc2l0ZSByb2xlIC0gcm9sZSBzZWN0aW9uCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZVJvbGVSb2xlU2VjdGlvbiBleHRlbmRzIE9CU1JlbGF0aW9uU2VjdGlvbiB7Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNpbml0Q29udGVudFByb3ZpZGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQllbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoCi0JCQkJCQkoKENvbXBvc2l0ZVJvbGUpIGVsZW1lbnQpLmdldEFnZ3JlZ2F0ZWRSb2xlcygpKQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJZWxlbWVudCA9IChDb21wb3NpdGVSb2xlKSBlbGVtZW50OwotCi0JCVN0cmluZyB0aXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25UaXRsZTsKLQkJU3RyaW5nIGRlc2MgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkNvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb247Ci0JCVN0cmluZyB0YWJsZTEgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkNvbXBvc2l0ZVJvbGVfUm9sZV9UYWJsZTE7Ci0JCXNldFRhYkRhdGEodGl0bGUsIGRlc2MsIHRhYmxlMSk7IAotCQlzaG93QWRkRnJvbVByb2Nlc3NCdXR0b24gPSB0cnVlOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJCXN1cGVyLnJlZnJlc2goKTsKLQotCQkJCWVsZW1lbnQgPSAoQ29tcG9zaXRlUm9sZSkgZ2V0RWxlbWVudCgpOwotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKAotCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBDb21wb3NpdGUgcm9sZSAtIHJvbGUgc2VjdGluICIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIGNvbXBvc2l0ZSByb2xlcyAKLQkgKiBAcGFyYW0gaXRlbXMKLQkgKiAJCUxpc3Qgb2Ygcm9sZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkKExpc3QgaXRlbXMpIHsKLQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQlpZiAoaXRlbXMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJKENvbXBvc2l0ZVJvbGUpIGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKSwKLQkJCQkJCQkoUm9sZSkgb2JqLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQlSb2xlIHJvbGUgPSAoKFJvbGVEZXNjcmlwdG9yKSBvYmopLmdldFJvbGUoKTsKLQkJCQkJaWYgKHJvbGUgIT0gbnVsbCkKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCShDb21wb3NpdGVSb2xlKSBlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlcygpLAotCQkJCQkJCQlyb2xlLCAtMSk7Ci0JCQkJCWVsc2UgewotCQkJCQkJTWVzc2FnZUZvcm1hdCBtZiA9IG5ldyBNZXNzYWdlRm9ybWF0KAotCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQ29tcG9zaXRlUm9sZUFzc2lnbkVycm9yKTsgCi0JCQkJCQlPYmplY3RbXSBhcmdzID0geyAoKFJvbGVEZXNjcmlwdG9yKSBvYmopLmdldE5hbWUoKSwKLQkJCQkJCQkJKChDb21wb3NpdGVSb2xlKSBlbGVtZW50KS5nZXROYW1lKCkgfTsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQXNzaWdubWVudEluZm9UaXRsZSwgbWYuZm9ybWF0KGFyZ3MpKTsgCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jcmVtb3ZlKGphdmEudXRpbC5BcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlSb2xlIHJvbGUgPSAoUm9sZSkgaXRvci5uZXh0KCk7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCShDb21wb3NpdGVSb2xlKSBlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKSwgcm9sZSwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI29wZW5BZGREaWFsb2coKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9wZW5BZGREaWFsb2coKSB7Ci0JCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9ICgoQ29tcG9zaXRlUm9sZSkgZWxlbWVudCkuZ2V0QWdncmVnYXRlZFJvbGVzKCk7Ci0JCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgZ2V0RmlsdGVyKCksIGVsZW1lbnQsCi0JCQkJRmlsdGVyQ29uc3RhbnRzLlJPTEVTLCBleGlzdGluZ0VsZW1lbnRzKTsKLQotCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLlJPTEVTKTsKLQkJZmQub3BlbigpOwotCQlhZGQoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jb3BlbkFkZEZyb21Qcm9jZXNzRGlhbG9nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQWRkRnJvbVByb2Nlc3NEaWFsb2coKSB7Ci0JCVN0cmluZyB0YWJOYW1lID0gRmlsdGVyQ29uc3RhbnRzLlJPTEVfREVTQ1JJUFRPUlM7Ci0JCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IGdldEV4aXN0aW5nRWxlbWVudHMoKTsKLQkJUHJvY2VzcyBwcm9jZXNzID0gKFByb2Nlc3MpIGdldFByb2Nlc3MoZWxlbWVudCk7Ci0JCUlGaWx0ZXIgZGVzY3JpcHRvckZpbHRlciA9IGdldERlc2NyaXB0b3JGaWx0ZXIoKTsKLQkJaWYgKGRlc2NyaXB0b3JGaWx0ZXIgIT0gbnVsbCAmJiBwcm9jZXNzICE9IG51bGwpIHsKLQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCWRlc2NyaXB0b3JGaWx0ZXIsIHByb2Nlc3MsIHRhYk5hbWUsIGV4aXN0aW5nRWxlbWVudHMpOwotCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuUk9MRV9ERVNDUklQVE9SUyk7Ci0JCQlmZC5vcGVuKCk7Ci0JCQlhZGQoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQgRmluZCBwYXJlbnQgdW50aWwgaXQncyBhY3Rpdml0eS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKiAJCXByb2Nlc3Mgb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9jZXNzKEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCkgewotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQllbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZ2V0UHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBkZXNjcmlwdG9yIHByb2Nlc3MgZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RGVzY3JpcHRvckZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBEZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcihnZXRDb25maWd1cmF0aW9uKCkpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJLy8gTGlzdCBsaXN0ID0gKChBY3Rpdml0eSlvYmopLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZ2V0QWN0aXZpdGllc0luU2NvcGUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgZWxlbWVudCwgbGlzdCk7Ci0JCQkJCWlmIChsaXN0LmNvbnRhaW5zKG9iaikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJCQlpZiAob2JqLmVxdWFscyhlbGVtZW50KSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0Rlc2NyaXB0b3JEb2N1bWVudFNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9EZXNjcmlwdG9yRG9jdW1lbnRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMzc4ZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0Rlc2NyaXB0b3JEb2N1bWVudFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuUmljaFRleHRJbWFnZUxpbmtDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLQotLyoqCi0gKiBUaGUgZG9jdW1lbnQgdGFiIHNlY3Rpb24gZm9yIERlc2NyaXB0b3IKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvckRvY3VtZW50U2VjdGlvbiBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24gewotCi0JcHJvdGVjdGVkIERlc2NyaXB0b3IgZWxlbWVudDsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IHJlZmluZWREZXNjOwotCi0JcHJpdmF0ZSBMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZWxlbWVudCA9IChEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGV4cGFuZEZsYWcgPyBjdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCTogcmVmaW5lZERlc2M7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChEZXNjcmlwdG9yRGVzY3JpcHRpb24pIGVsZW1lbnQKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRSZWZpbmVkRGVzY3JpcHRpb24oKTsKLQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQlyZWZpbmVkRGVzYywgb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCksCi0JCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCWVsZW1lbnQgPSAoRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jY3JlYXRlRG9jdW1lbnRTZWN0aW9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEb2N1bWVudFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlzdXBlci5jcmVhdGVEb2N1bWVudFNlY3Rpb24oY29tcG9zaXRlKTsKLQkJaW50IGhlaWdodEhpbnQgPSAyMDA7Ci0KLQkJLy8gcmVmaW5lZCBkZXNjcmlwdGlvbgotCQlSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lciByZWZpbmVkQ29udGFpbmVyID0gRm9ybVVJLmNyZWF0ZVJpY2hUZXh0V2l0aExpbmsodG9vbGtpdCwKLQkJCQlkb2N1bWVudENvbXBvc2l0ZSwgaGVpZ2h0SGludCwgY29udGVudEVsZW1lbnRQYXRoLCBlbGVtZW50LAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuRGVzY3JpcHRvcl9SZWZpbmVkRGVzY3JpcHRpb24pOwotCQlhZGRIeXBlckxpbmtMaXN0ZW5lcihyZWZpbmVkQ29udGFpbmVyLmxpbmspOwotCQlyZWZpbmVkRGVzYyA9IHJlZmluZWRDb250YWluZXIucmljaFRleHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0JCXJlZmluZWREZXNjLnNldE1vZGFsT2JqZWN0KGdldEVsZW1lbnQoKSk7Ci0JCXJlZmluZWREZXNjLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKSk7Ci0JCXJlZmluZWREZXNjLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiN1cGRhdGVDb250cm9scygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCXN1cGVyLnVwZGF0ZUNvbnRyb2xzKCk7Ci0JCXJlZmluZWREZXNjLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2F2ZU1vZGlmaWVkUmljaFRleHQoKTsKLQotCQkJCWVsZW1lbnQgPSAoRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQkJCURlc2NyaXB0b3JEZXNjcmlwdGlvbiBjb250ZW50ID0gKERlc2NyaXB0b3JEZXNjcmlwdGlvbikgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCi0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCXJlZmluZWREZXNjLnJlbW92ZU1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7CQkKLQkJCQl9Ci0JCQkKLQkJCQlzdXBlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCQkuc2V0RWxlbWVudChlbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkKLQkJCQlyZWZpbmVkRGVzYy5zZXRUZXh0KGNvbnRlbnQuZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkpOwotCi0JCQkJaWYgKGV4cGFuZEZsYWcpIHsKLQkJCQkJaWYgKGV4cGFuZERvY3VtZW50TGFiZWwuZ2V0VGV4dCgpCi0JCQkJCQkJLmVxdWFscygKLQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuRGVzY3JpcHRvcl9SZWZpbmVkRGVzY3JpcHRpb24pKSB7IAotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRUZXh0KGNvbnRlbnQKLQkJCQkJCQkJLmdldFJlZmluZWREZXNjcmlwdGlvbigpKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0U2VsZWN0aW9uKDApOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJCQkJLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUoZmFsc2UpOwotCQkJCX0KLQotCQkJCXJlZmluZWREZXNjLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCXJlZmluZWREZXNjLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKSk7Ci0JCQkJcmVmaW5lZERlc2MuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciB3aGlsZSByZWZyZXNoaW5nIGRlc2NyaXB0b3IgZG9jdW1lbnRhdGlvbiBzZWN0aW9uIDoiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E3YjE5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotCi0vKioKLSAqIFRoZSBnZW5lcmFsIHRhYiBzZWN0aW9uIGZvciBEZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiB7Ci0JcHJvdGVjdGVkIERlc2NyaXB0b3IgZWxlbWVudDsKLQotCXByaXZhdGUgQnV0dG9uIHN5bmNocm9uaXplZEJ1dHRvbjsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0KLQkJLy8gZ2V0IERlc2NyaXB0b3Igb2JqZWN0Ci0JCWVsZW1lbnQgPSAoRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2NyZWF0ZUdlbmVyYWxTZWN0aW9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHZW5lcmFsU2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXN1cGVyLmNyZWF0ZUdlbmVyYWxTZWN0aW9uKGNvbXBvc2l0ZSk7Ci0KLQkJLy8gY3JlYXRlIGNvbXBvc2l0ZSBmb3IgY2hlY2tib3gKLQkJY2hlY2tCb3hDb21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCBudW1PZkNvbHVtbnMsIHRydWUpOwotCi0JCXN5bmNocm9uaXplZEJ1dHRvbiA9IEZvcm1VSS5jcmVhdGVDaGVja0J1dHRvbih0b29sa2l0LCBjaGVja0JveENvbXBvc2l0ZSwKLQkJCQkxKTsKLQkJc3luY2hyb25pemVkQnV0dG9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5CcmVha2Rvd25FbGVtZW50X09wdGlvbl9TeW5jaHJvbml6ZWQpOyAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCi0JCXN5bmNocm9uaXplZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlbGVtZW50LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2Yoc3luY2hyb25pemVkQnV0dG9uLmdldFNlbGVjdGlvbigpKSwgLTEpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jdXBkYXRlQ29udHJvbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlzdXBlci51cGRhdGVDb250cm9scygpOwotCQlzeW5jaHJvbml6ZWRCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJZWxlbWVudCA9IChEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0KLQkJCQlzeW5jaHJvbml6ZWRCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQKLQkJCQkJCS5nZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciByZWZyZXNoaW5nIERlc2NyaXB0b3IgZ2VuZXJhbCBzZWN0aW9uOiAiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNnZXROYW1lUHJlZml4KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVQcmVmaXgoKSB7Ci0JCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfREVTQ1JJUFRPUiArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0VQRlByb3BlcnR5U2hlZXRQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRVBGUHJvcGVydHlTaGVldFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E4Y2I2YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRVBGUHJvcGVydHlTaGVldFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5JRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHByb3BlcnR5IHNoZWV0IHBhZ2UgZm9yIHByb2Nlc3MgZWxlbWVudHMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRVBGUHJvcGVydHlTaGVldFBhZ2UgZXh0ZW5kcyBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB7Ci0KLQlwcml2YXRlIElQcm9wZXJ0eVNoZWV0RW50cnkgcm9vdEVudHJ5OwotCi0JcHJpdmF0ZSBzdGF0aWMgSVByb3BlcnR5U291cmNlUHJvdmlkZXIgc291cmNlUHJvdmlkZXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQlwcml2YXRlIHN0YXRpYyBQcm9jZXNzRWRpdG9yIHByb2Nlc3NFZGl0b3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtUGFnZUlEID0gbnVsbDsKLQkKLQlwcml2YXRlIHN0YXRpYyBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgZm9ybVBhZ2UgPSBudWxsOwotCi0JcHVibGljIEVQRlByb3BlcnR5U2hlZXRQYWdlKFByb2Nlc3NFZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKChJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcikgZWRpdG9yKTsKLQotCQlhY3Rpb25NZ3IgPSAoKFByb2Nlc3NFZGl0b3IpIGVkaXRvcikuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlwcm9jZXNzRWRpdG9yID0gZWRpdG9yOwotCi0JfQotCi0JLyoqCi0JICogR2V0IGFjdGlvbiBtYW5hZ2VyCi0JICogQHJldHVybgotCSAqIAkJCUFjdGlvbiBNYW5hZ2VyCi0JICovCi0JcHVibGljIHN0YXRpYyBJQWN0aW9uTWFuYWdlciBnZXRBY3Rpb25NYW5hZ2VyKCkgewotCQlyZXR1cm4gYWN0aW9uTWdyOwotCX0KLQotCS8qKgotCSAqIEdldCBlZGl0b3IgYXNzb2NpYXRlZCB3aXRoIHByb3BlcnR5IHNoZWV0IHBhZ2UKLQkgKiBAcmV0dXJuCi0JICogCQkJUHJvY2VzcyBFZGl0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb2Nlc3NFZGl0b3IgZ2V0RWRpdG9yKCkgewotCQlyZXR1cm4gcHJvY2Vzc0VkaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBnaXZlbiBwcm9wZXJ0eSBzb3VyY2UgcHJvdmlkZXIgYXMgdGhlIHByb3BlcnR5IHNvdXJjZSBwcm92aWRlci4KLQkgKiA8cD4KLQkgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGlzIG9ubHkgdmFsaWQgaWYgeW91IGFyZSB1c2luZyB0aGlzIHBhZ2UncyBkZWZhdWx0Ci0JICogcm9vdCBlbnRyeS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG5ld1Byb3ZpZGVyCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgc291cmNlIHByb3ZpZGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihJUHJvcGVydHlTb3VyY2VQcm92aWRlciBuZXdQcm92aWRlcikgewotCQlzb3VyY2VQcm92aWRlciA9IG5ld1Byb3ZpZGVyOwotCQlpZiAocm9vdEVudHJ5ID09IG51bGwpIHsKLQkJCS8vIGNyZWF0ZSBhIG5ldyByb290Ci0JCQlQcm9wZXJ0eVNoZWV0RW50cnkgcm9vdCA9IG5ldyBQcm9wZXJ0eVNoZWV0RW50cnkoKTsKLQotCQkJcm9vdEVudHJ5ID0gcm9vdDsKLQkJfQotCQlpZiAoc291cmNlUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJLy8gc2V0IHRoZSBwcm9wZXJ0eSBzb3VyY2UgcHJvdmlkZXIgZm9yIHJvb3QgZW50cnkKLQkJCWlmIChyb290RW50cnkgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0RW50cnkpIHsKLQkJCQkoKFByb3BlcnR5U2hlZXRFbnRyeSkgcm9vdEVudHJ5KQotCQkJCQkJLnNldFByb3BlcnR5U291cmNlUHJvdmlkZXIoc291cmNlUHJvdmlkZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHByb3BlcnR5IHNvdXJjZSBwcm92aWRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb3BlcnR5U291cmNlUHJvdmlkZXIgZ2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcigpIHsKLQkJcmV0dXJuIHNvdXJjZVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBzZWxlY3Rpb24gb2YgdGhlIG9iamVjdCBmcm9tIGJyZWFrZG93biBzdHJ1Y3R1cmUgb2YgdGhlIHByb2Nlc3MgZWRpdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2Ujc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWwpIHsKLQkJc2VsZWN0aW9uID0gc2VsOwotCi0JCWlmIChwYXJ0IGluc3RhbmNlb2YgUHJvY2Vzc0VkaXRvcikgewotCQkJcHJvY2Vzc0VkaXRvciA9IChQcm9jZXNzRWRpdG9yKSBwYXJ0OwotCQkJYWN0aW9uTWdyID0gcHJvY2Vzc0VkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCQlJRm9ybVBhZ2UgYWN0aXZlUGFnZSA9IHByb2Nlc3NFZGl0b3IuZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCk7Ci0JCQlpZiAoYWN0aXZlUGFnZSBpbnN0YW5jZW9mIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSkKLQkJCQlmb3JtUGFnZSA9IChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpIGFjdGl2ZVBhZ2U7Ci0JCQlmb3JtUGFnZUlEID0gYWN0aXZlUGFnZSAhPSBudWxsID8gYWN0aXZlUGFnZS5nZXRJZCgpIDogbnVsbDsKLQkJfQotCi0JCXN1cGVyLnNlbGVjdGlvbkNoYW5nZWQocGFydCwgc2VsZWN0aW9uKTsKLQkJCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSNoYW5kbGVQYXJ0QWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZVBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlpZiAocGFydCBpbnN0YW5jZW9mIFByb2Nlc3NFZGl0b3IpIHsKLQkJCXByb2Nlc3NFZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgcGFydDsKLQkJCXNlbGVjdGlvbiA9IHByb2Nlc3NFZGl0b3IuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlhY3Rpb25NZ3IgPSBwcm9jZXNzRWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJCUlGb3JtUGFnZSBhY3RpdmVQYWdlID0gcHJvY2Vzc0VkaXRvci5nZXRBY3RpdmVQYWdlSW5zdGFuY2UoKTsKLQkJCWlmIChhY3RpdmVQYWdlIGluc3RhbmNlb2YgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKQotCQkJCWZvcm1QYWdlID0gKFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSkgYWN0aXZlUGFnZTsKLQkJCWZvcm1QYWdlSUQgPSBhY3RpdmVQYWdlICE9IG51bGwgPyBhY3RpdmVQYWdlLmdldElkKCkgOiBudWxsOwotCQl9Ci0KLQkJc3VwZXIuaGFuZGxlUGFydEFjdGl2YXRlZChwYXJ0KTsKLQkJCi0JCXRoaXMucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIEdldCBjdXJyZW50IGFkYXB0ZXIgZmFjdG9yeSBvZiBlZGl0b3IKLQkgKiBAcmV0dXJuCi0JICogCQkJQWRhcHRlciBGYWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGZvcm1QYWdlLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCi0JCS8vIHdpbGwgc2VlIGlmIHRoaXMgd29ya3MuLgotCQl0cnkgewotCQkJc3VwZXIucmVmcmVzaCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0JCX0KLQkJCi0vLyBUT0RPIC0gZ2V0IHJpZCBvZiBpbnRlcm5hbCBBUElzLgotLy8JCWlmICh0aGlzLmdldEN1cnJlbnRUYWIoKSAhPSBudWxsKSB7Ci0vLwkJCXRoaXMuZ2V0Q3VycmVudFRhYigpLnJlZnJlc2goKTsKLS8vCi0vLwkJCS8vIGFsc28gcmVmcmVzaCBzZWN0aW9uCi0vLwkJCUlTZWN0aW9uIHNlY3Rpb24gPSB0aGlzLmdldEN1cnJlbnRUYWIoKS5nZXRTZWN0aW9uQXRJbmRleCgwKTsKLS8vCQkJaWYgKHNlY3Rpb24gIT0gbnVsbCkgewotLy8JCQkJc2VjdGlvbi5yZWZyZXNoKCk7Ci0vLwkJCX0KLS8vCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRWxlbWVudExhYmVsUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9FbGVtZW50TGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTRkZTdmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9FbGVtZW50TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUeXBlTWFwcGVyOwotCi0KLS8qKgotICogTGFiZWwgcHJvdmlkZXIgZm9yIHRoZSB0aXRsZSBiYXIgZm9yIHRoZSB0YWJiZWQgcHJvcGVydHkgc2hlZXQgcGFnZS4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0KLQlwcml2YXRlIElUeXBlTWFwcGVyIHR5cGVNYXBwZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlCi0JICovCi0JcHVibGljIEVsZW1lbnRMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCQl0eXBlTWFwcGVyID0gbmV3IEVsZW1lbnRUeXBlTWFwcGVyKCk7Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdHMpIHsKLQkJaWYgKG9iamVjdHMgPT0gbnVsbCB8fCBvYmplY3RzLmVxdWFscyhTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSW1hZ2UgaW1hZ2UgPSBMaWJyYXJ5VUlJbWFnZXMuSU1HX1BST0NFU1M7Ci0JCWZpbmFsIGJvb2xlYW4gbXVsdGlwbGVbXSA9IHsgZmFsc2UgfTsKLQkJZmluYWwgT2JqZWN0IG9iamVjdCA9IGdldE9iamVjdChvYmplY3RzLCBtdWx0aXBsZSk7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCB8fCAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBvYmplY3RzKS5zaXplKCkgPiAxKSB7Ci0JCQlyZXR1cm4gaW1hZ2U7Ci0JCX0gZWxzZSB7Ci0JCQlPYmplY3Qgb2JqID0gTGlicmFyeVV0aWwudW53cmFwKG9iamVjdCk7Ci0JCQlpZiAobGFiZWxQcm92aWRlciA9PSBudWxsKSB7Ci0JCQkJbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSk7Ci0JCQl9Ci0JCQlJbWFnZSB0aXRsZUltYWdlID0gbGFiZWxQcm92aWRlci5nZXRJbWFnZShvYmopOwotCi0JCQlyZXR1cm4gdGl0bGVJbWFnZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0cykgewotCQlpZiAob2JqZWN0cyA9PSBudWxsIHx8IG9iamVjdHMuZXF1YWxzKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpKSB7Ci0JCQlyZXR1cm4gUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX05vSXRlbXM7IAotCQl9Ci0JCWZpbmFsIGJvb2xlYW4gbXVsdGlwbGVbXSA9IHsgZmFsc2UgfTsKLQkJZmluYWwgT2JqZWN0IG9iamVjdCA9IGdldE9iamVjdChvYmplY3RzLCBtdWx0aXBsZSk7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCB8fCAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBvYmplY3RzKS5zaXplKCkgPiAxKSB7Ci0JCQlPYmplY3Qgc2l6ZSA9IG5ldyBJbnRlZ2VyKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIG9iamVjdHMpLnNpemUoKSk7Ci0JCQlTdHJpbmcgbXNnID0gUHJvcGVydGllc1Jlc291cmNlcy5iaW5kKFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19JdGVtc1NlbGVjdGVkLCAobmV3IE9iamVjdFtdIHsgc2l6ZSB9KSk7IAotCQkJcmV0dXJuIG1zZzsKLQkJfSBlbHNlIHsKLQotCQkJT2JqZWN0IG9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChvYmplY3QpOwotCQkJcmV0dXJuIGdldE5hbWUob2JqKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE5hbWUoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0KLQkJU3RyaW5nIHByZWZpeCA9IFByb3BlcnRpZXNVdGlsLmdldFR5cGUob2JqKTsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJbmFtZSA9IHByZWZpeCArICIgOiAiICsgKChCcmVha2Rvd25FbGVtZW50KSBvYmopLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJbmFtZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Ob1Byb3BlcnRpZXNBdmFpbGFibGU7IAotCQl9Ci0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIGlmIGEgbXVsdGlwbGUgb2JqZWN0IHNlbGVjdGlvbiBoYXMgYmVlbiBwYXNzZWQgdG8gdGhlIGxhYmVsCi0JICogcHJvdmlkZXIuIElmIHRoZSBvYmplY3RzIGlzIGEgSVN0cnVjdHVyZWRTZWxlY3Rpb24sIHNlZSBpZiBhbGwgdGhlCi0JICogb2JqZWN0cyBpbiB0aGUgc2VsZWN0aW9uIGFyZSB0aGUgc2FtZSBhbmQgaWYgc28sIHdlIHdhbnQgdG8gcHJvdmlkZQotCSAqIGxhYmVscyBmb3IgdGhlIGNvbW1vbiBzZWxlY3RlZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3RzCi0JICogICAgICAgICAgICBhIHNpbmdsZSBvYmplY3Qgb3IgYSBJU3RydWN0dXJlZFNlbGVjdGlvbi4KLQkgKiBAcGFyYW0gbXVsdGlwbGUKLQkgKiAgICAgICAgICAgIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGFycmF5IGlzIHRydWUgaWYgdGhlcmUgaXMgbXVsdGlwbGUKLQkgKiAgICAgICAgICAgIHVuZXF1YWwgc2VsZWN0ZWQgZWxlbWVudHMgaW4gYSBJU3RydWN0dXJlZFNlbGVjdGlvbi4KLQkgKiBAcmV0dXJuIHRoZSBvYmplY3QgdG8gZ2V0IGxhYmVscyBmb3IuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0T2JqZWN0KE9iamVjdCBvYmplY3RzLCBib29sZWFuIG11bHRpcGxlW10pIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChvYmplY3RzKTsKLQkJT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0JCWlmIChvYmplY3RzIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgb2JqZWN0czsKLQkJCW9iamVjdCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkvLyBvbmUgZWxlbWVudCBzZWxlY3RlZAotCQkJCW11bHRpcGxlWzBdID0gZmFsc2U7Ci0JCQkJcmV0dXJuIG9iamVjdDsKLQkJCX0KLQkJCS8vIG11bHRpcGxlIGVsZW1lbnRzIHNlbGVjdGVkCi0JCQltdWx0aXBsZVswXSA9IHRydWU7Ci0vLwkJCUNsYXNzIGZpcnN0Q2xhc3MgPSB0eXBlTWFwcGVyLm1hcFR5cGUob2JqZWN0LCBvYmplY3QuZ2V0Q2xhc3MoKSk7Ci0JCQlDbGFzcyBmaXJzdENsYXNzID0gdHlwZU1hcHBlci5tYXBUeXBlKG9iamVjdCk7Ci0JCQkvLyBkZXRlcm1pbmUgaWYgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBzZWxlY3Rpb24gYXJlIHRoZSBzYW1lIHR5cGUKLQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJCWZvciAoSXRlcmF0b3IgaSA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG5leHQgPSBpLm5leHQoKTsKLS8vCQkJCQlDbGFzcyBuZXh0Q2xhc3MgPSB0eXBlTWFwcGVyLm1hcFR5cGUobmV4dCwgbmV4dAotLy8JCQkJCQkJLmdldENsYXNzKCkpOwotCQkJCQlDbGFzcyBuZXh0Q2xhc3MgPSB0eXBlTWFwcGVyLm1hcFR5cGUobmV4dCk7Ci0JCQkJCWlmICghbmV4dENsYXNzLmVxdWFscyhmaXJzdENsYXNzKSkgewotCQkJCQkJLy8gdHdvIGVsZW1lbnRzIG5vdCBlcXVhbCA9PSBtdWx0aXBsZSBzZWxlY3RlZCB1bmVxdWFsCi0JCQkJCQltdWx0aXBsZVswXSA9IGZhbHNlOwotCQkJCQkJb2JqZWN0ID0gbnVsbDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJbXVsdGlwbGVbMF0gPSBmYWxzZTsKLQkJCW9iamVjdCA9IG9iamVjdHM7Ci0JCX0KLQkJcmV0dXJuIG9iamVjdDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRWxlbWVudFR5cGVNYXBwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9FbGVtZW50VHlwZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGVjMDU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9FbGVtZW50VHlwZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUeXBlTWFwcGVyOwotCi0KLS8qKgotICogVHlwZSBtYXBwZXIgZm9yIHRoZSBsb2dpYyBleGFtcGxlLiBXZSB3YW50IHRvIGdldCB0aGUgR0VGIG1vZGVsIG9iamVjdCBmcm9tCi0gKiB0aGUgc2VsZWN0ZWQgZWxlbWVudCBpbiB0aGUgb3V0bGluZSB2aWV3IGFuZCB0aGUgZGlhZ3JhbS4gV2UgY2FuIHRoZW4gZmlsdGVyCi0gKiBvbiB0aGUgbW9kZWwgb2JqZWN0IHR5cGUuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRUeXBlTWFwcGVyIGltcGxlbWVudHMgSVR5cGVNYXBwZXIgewotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUeXBlTWFwcGVyI21hcFR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgbWFwVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0vLwkJQ2xhc3MgdHlwZSA9IGVmZmVjdGl2ZVR5cGU7Ci0JCUNsYXNzIHR5cGUgPSBudWxsOwotCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCXR5cGUgPSBvYmplY3QuZ2V0Q2xhc3MoKTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJdHlwZSA9ICgoQnJlYWtkb3duRWxlbWVudCkgb2JqZWN0KS5nZXRDbGFzcygpOwotCQkJfQotCQl9Ci0JCi0JCXJldHVybiB0eXBlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRm9ybVVJLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRm9ybVVJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZWQyYzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0Zvcm1VSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkJhc2VGb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLk1ldGhvZEZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5SaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5JbWFnZUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci0KLQotLyoqCi0gKiBUaGUgVUkgdXRpbCBjbGFzcyB0YWlsb3JlZCBmb3IgcHJvcGVydGllcyB2aWV3IGZvciBwcm9jZXNzIGF1dGhvcmluZwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JtVUkgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfV0lEVEggPSAzMDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBMYWJlbCBfY3JlYXRlTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBzdHIsIGludCBncmlkRGF0YVN0eWxlLCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJTGFiZWwgbGFiZWwgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKHBhcmVudCwgc3RyKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZERhdGFTdHlsZSk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIHN0cikgewotCQkvLyBtYWtlIGhvcml6b25hdGFsU3BhbiAxCi0JCXJldHVybiBfY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCBzdHIsIEdyaWREYXRhLkJFR0lOTklORywgMSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIHN0ciwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCS8vIG1ha2UgaG9yaXpvbmF0YWxTcGFuIDIKLQkJcmV0dXJuIF9jcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIHN0ciwgR3JpZERhdGEuQkVHSU5OSU5HLAotCQkJCWhvcml6b250YWxTcGFuKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUZXh0IF9jcmVhdGVUZXh0KEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgdGV4dFN0eWxlLCBpbnQgZ3JpZERhdGFTdHlsZSwgaW50IGhlaWdodCwgaW50IHdpZHRoLAotCQkJaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCVRleHQgY29udHJvbCA9IHRvb2xraXQuY3JlYXRlVGV4dChwYXJlbnQsICIiLCB0ZXh0U3R5bGUpOyAvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWREYXRhU3R5bGUpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHQoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gX2NyZWF0ZVRleHQodG9vbGtpdCwgcGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULldSQVAsCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCBTV1QuREVGQVVMVCwgREVGQVVMVF9XSURUSCwKLQkJCQlTV1QuREVGQVVMVCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHQoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBoZWlnaHQpIHsKLQkJcmV0dXJuIF9jcmVhdGVUZXh0KHRvb2xraXQsIHBhcmVudCwgU1dULk1VTFRJIHwgU1dULldSQVAsCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCBoZWlnaHQsIERFRkFVTFRfV0lEVEgsIFNXVC5ERUZBVUxUKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlVGV4dChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IGhlaWdodCwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCXJldHVybiBfY3JlYXRlVGV4dCh0b29sa2l0LCBwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuV1JBUCwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIGhlaWdodCwgREVGQVVMVF9XSURUSCwgaG9yaXpvbnRhbFNwYW4pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElNZXRob2RSaWNoVGV4dCBfY3JlYXRlUmljaFRleHQoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCBoZWlnaHQsIGludCB3aWR0aCwgU3RyaW5nIHBhdGgsCi0JCQlNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQsIExhYmVsIGxhYmVsKSB7Ci0JCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gTWV0aG9kRm9ybVRvb2xraXQuY3JlYXRlUmljaFRleHQodG9vbGtpdCwKLQkJCQlwYXJlbnQsCi0JCQkJIiIsIFNXVC5NVUxUSSB8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMLCBwYXRoLCBtZXRob2RFbGVtZW50LCBsYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGhlaWdodDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIgY3JlYXRlUmljaFRleHRXaXRoTGluayhGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IGhlaWdodCwgU3RyaW5nIHBhdGgsCi0JCQlNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQsIFN0cmluZyBsYWJlbFRleHQpIHsKLQkJSW1hZ2VIeXBlcmxpbmsgbGluayA9IGNyZWF0ZUltYWdlSHlwZXJMaW5rKHRvb2xraXQsIHBhcmVudCwgQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0NPTExBUFNFRCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5vcGVuUlRFKTsKLQkJbGluay5zZXREYXRhKCJUaXRsZSIsIGxhYmVsVGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJTGFiZWwgZGVjb3JhdGVkTGFiZWwgPSBCYXNlRm9ybVBhZ2UuY3JlYXRlRGVjb3JhdGVkTGFiZWwodG9vbGtpdCwgcGFyZW50LCBsYWJlbFRleHQpOwotCQkoKEdyaWREYXRhKWRlY29yYXRlZExhYmVsLmdldExheW91dERhdGEoKSkudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCi0JCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gX2NyZWF0ZVJpY2hUZXh0KHRvb2xraXQsIHBhcmVudCwgaGVpZ2h0LCBERUZBVUxUX1dJRFRILCBwYXRoLAotCQkJCW1ldGhvZEVsZW1lbnQsIGRlY29yYXRlZExhYmVsKTsKLQkJbGluay5zZXRIcmVmKGNvbnRyb2wpOwotCi0JCXJldHVybiBuZXcgUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIoY29udHJvbCwgbGluaywgZGVjb3JhdGVkTGFiZWwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2VIeXBlcmxpbmsgY3JlYXRlSW1hZ2VIeXBlckxpbmsoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIEltYWdlIGltYWdlLCBTdHJpbmcgdG9vbFRpcCkgewotCQlJbWFnZUh5cGVybGluayBsaW5rID0gdG9vbGtpdC5jcmVhdGVJbWFnZUh5cGVybGluayhwYXJlbnQsIFNXVC5MRUZUCi0JCQkJfCBTV1QuVE9QKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJbGluay5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJbGluay5zZXRJbWFnZShpbWFnZSk7Ci0JCWxpbmsuc2V0VG9vbFRpcFRleHQodG9vbFRpcCk7Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU2VjdGlvbiBjcmVhdGVTZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlTZWN0aW9uIHNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBTZWN0aW9uLkRFU0NSSVBUSU9OCi0JCQkJfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVEKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VjdGlvbi5zZXRUZXh0KHRpdGxlKTsKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCXRvb2xraXQuY3JlYXRlQ29tcG9zaXRlU2VwYXJhdG9yKHNlY3Rpb24pOwotCQlzZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJcmV0dXJuIHNlY3Rpb247Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU2VjdGlvbiBjcmVhdGVTZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbiwgaW50IGdkU3R5bGUpIHsKLQkJU2VjdGlvbiBzZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKHBhcmVudCwgU2VjdGlvbi5ERVNDUklQVElPTgotCQkJCXwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKGdkU3R5bGUpOwotCQlzZWN0aW9uLnNldExheW91dERhdGEoZ2QpOwotCQlzZWN0aW9uLnNldFRleHQodGl0bGUpOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJdG9vbGtpdC5jcmVhdGVDb21wb3NpdGVTZXBhcmF0b3Ioc2VjdGlvbik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCVNlY3Rpb24gc2VjdGlvbiwgaW50IG51bU9mQ29sdW1ucywgYm9vbGVhbiBleHBhbmRlZCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dChudW1PZkNvbHVtbnMsIGZhbHNlKSk7Ci0JCWlmICghZXhwYW5kZWQpCi0JCQlzZWN0aW9uLnNldENsaWVudChjb21wb3NpdGUpOwotCQllbHNlCi0JCQljb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IGdyaWRTdHlsZSkgewotCQlDb21wb3NpdGUgcGFuZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkU3R5bGUpOwotCQlwYW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJcmV0dXJuIHBhbmU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgZ3JpZFN0eWxlLCBpbnQgbnVtT2ZDb2x1bW5zLAotCQkJYm9vbGVhbiBlcXVhbFNpemVDb2x1bW4pIHsKLQkJQ29tcG9zaXRlIHBhbmUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZFN0eWxlKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBudW1PZkNvbHVtbnM7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQobnVtT2ZDb2x1bW5zLCBlcXVhbFNpemVDb2x1bW4pOwotCQlsYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpblJpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJcGFuZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJcmV0dXJuIHBhbmU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQnV0dG9uIF9jcmVhdGVCdXR0b24oRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBidXR0b25TdHIsIGludCBzdHlsZSwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCUJ1dHRvbiBjb250cm9sID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LCBidXR0b25TdHIsIHN0eWxlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQnV0dG9uIF9jcmVhdGVCdXR0b24oRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBidXR0b25TdHIsIGludCBzdHlsZSkgewotCQlCdXR0b24gY29udHJvbCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwgYnV0dG9uU3RyLCBzdHlsZSk7Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQkKLQkKLQotCXByaXZhdGUgc3RhdGljIENvbWJvIF9jcmVhdGVDb21ibyhGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IHN0eWxlLCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBzdHlsZSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCWNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVDb21ibyhGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCXJldHVybiBfY3JlYXRlQ29tYm8odG9vbGtpdCwgcGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkZMQVQKLQkJCQl8IFNXVC5SRUFEX09OTFksIGhvcml6b250YWxTcGFuKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQnV0dG9uKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgYnV0dG9uU3RyKSB7Ci0JCXJldHVybiBfY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhcmVudCwgYnV0dG9uU3RyLCBTV1QuTk9ORSk7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVCdXR0b24oRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBzdHlsZSwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCXJldHVybiBfY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhcmVudCwgIiIsIHN0eWxlLCBob3Jpem9udGFsU3Bhbik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQ2hlY2tCdXR0b24oRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwgaW50IGhvcml6b250YWxTcGFuKQotCXsKLQkJQnV0dG9uIGNvbnRyb2wgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsICIiLCBTV1QuQ0hFQ0spOwkJLy8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQljb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUYWJsZSBfY3JlYXRlVGFibGUoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCB0YWJsZVN0eWxlLCBpbnQgZ3JpZFN0eWxlLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsCi0JCQlpbnQgdmVydGljYWxTcGFuLCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJVGFibGUgdGFibGUgPSB0b29sa2l0LmNyZWF0ZVRhYmxlKHBhcmVudCwgdGFibGVTdHlsZSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWRTdHlsZSk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBoZWlnaHQ7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IHdpZHRoOwotCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSB2ZXJ0aWNhbFNwYW47Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCXRhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUYWJsZSBjcmVhdGVUYWJsZShGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBfY3JlYXRlVGFibGUodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEksIEdyaWREYXRhLkZJTExfQk9USCwKLQkJCQkyMDAsIDIwMCwgMSwgMSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUYWJsZSBjcmVhdGVUYWJsZShGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IGhlaWdodCkgewotCQlyZXR1cm4gX2NyZWF0ZVRhYmxlKHRvb2xraXQsIHBhcmVudCwgU1dULk1VTFRJLCBHcmlkRGF0YS5GSUxMX0JPVEgsCi0JCQkJaGVpZ2h0LCAyMDAsIDEsIDEpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9NaWxlc3RvbmVEb2N1bWVudFNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9NaWxlc3RvbmVEb2N1bWVudFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc4ZTU0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvTWlsZXN0b25lRG9jdW1lbnRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0KLS8qKgotICogVGhlIGRvY3VtZW50IHRhYiBzZWN0aW9uIGZvciBNaWxlc3RvbmUKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWlsZXN0b25lRG9jdW1lbnRTZWN0aW9uIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudCBlbGVtZW50OwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgbWFpbkRlc2M7Ci0KLQlwcml2YXRlIExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZXhwYW5kRmxhZyA/IGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJOiBtYWluRGVzYzsKLQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKENvbnRlbnREZXNjcmlwdGlvbikgZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSkKLQkJCQkJLmdldE1haW5EZXNjcmlwdGlvbigpOwotCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUobWFpbkRlc2MsCi0JCQkJCW9sZENvbnRlbnQpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlbGVtZW50Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpLCBuZXdDb250ZW50LAotCQkJCQkJLTEpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jY3JlYXRlRG9jdW1lbnRTZWN0aW9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEb2N1bWVudFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlzdXBlci5jcmVhdGVEb2N1bWVudFNlY3Rpb24oY29tcG9zaXRlKTsKLQkJaW50IGhlaWdodEhpbnQgPSAyMDA7Ci0KLQkJLy8gbWFpbiBkZXNjcmlwdGlvbgotCQlSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lciBtYWluRGVzY0NvbnRhaW5lciA9IEZvcm1VSS5jcmVhdGVSaWNoVGV4dFdpdGhMaW5rKHRvb2xraXQsCi0JCQkJZG9jdW1lbnRDb21wb3NpdGUsIGhlaWdodEhpbnQsIGNvbnRlbnRFbGVtZW50UGF0aCwgZWxlbWVudCwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfbWFpbkRlc2NyaXB0aW9uKTsKLQkJYWRkSHlwZXJMaW5rTGlzdGVuZXIobWFpbkRlc2NDb250YWluZXIubGluayk7Ci0JCW1haW5EZXNjID0gbWFpbkRlc2NDb250YWluZXIucmljaFRleHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0JCW1haW5EZXNjLnNldE1vZGFsT2JqZWN0KGdldEVsZW1lbnQoKSk7Ci0JCW1haW5EZXNjLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSk7Ci0JCW1haW5EZXNjLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiN1cGRhdGVDb250cm9scygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCXN1cGVyLnVwZGF0ZUNvbnRyb2xzKCk7Ci0JCW1haW5EZXNjLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCXN1cGVyLnJlZnJlc2goKTsKLQotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zYXZlTW9kaWZpZWRSaWNoVGV4dCgpOwotCi0JCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQ29udGVudERlc2NyaXB0aW9uKSBlbGVtZW50Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0KLQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJbWFpbkRlc2MucmVtb3ZlTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsJCQotCQkJCX0KLQkJCQotCQkJCXN1cGVyLnJlZnJlc2goKTsKLQotCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJCS5zZXRFbGVtZW50KGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJCS5zZXREaXNhYmxlKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCW1haW5EZXNjLnNldFRleHQoY29udGVudC5nZXRNYWluRGVzY3JpcHRpb24oKSk7Ci0KLQkJCQlpZiAoZXhwYW5kRmxhZykgewotCQkJCQlpZiAoZXhwYW5kRG9jdW1lbnRMYWJlbC5nZXRUZXh0KCkuZXF1YWxzKAotCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19tYWluRGVzY3JpcHRpb24pKSAKLQkJCQkJewotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRUZXh0KGNvbnRlbnQKLQkJCQkJCQkJLmdldE1haW5EZXNjcmlwdGlvbigpKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0U2VsZWN0aW9uKDApOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJCQkJLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUoZmFsc2UpOwotCQkJCX0KLQotCQkJCW1haW5EZXNjLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCW1haW5EZXNjLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSk7Ci0JCQkJbWFpbkRlc2MuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciB3aGlsZSByZWZyZXNoaW5nIG1pbGVzdG9uZSBkb2N1bWVudGF0aW9uIHNlY3Rpb24gOiIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL09CU1JlbGF0aW9uU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL09CU1JlbGF0aW9uU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjdiNDgxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9PQlNSZWxhdGlvblNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NSb2xlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotLyoqCi0gKiBUaGUgYmFzZSBPQlMgcmVsYXRpb24gc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNSZWxhdGlvblNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQlwcml2YXRlIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZF8xLCBjdHJsX2FkZF8yLCBjdHJsX3JlbW92ZTsKLQotCXByaXZhdGUgVGFibGUgY3RybF9zZWxlY3RlZDsKLQotCXByb3RlY3RlZCBUYWJsZVZpZXdlciB2aWV3ZXI7Ci0KLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQkKLQlwcml2YXRlIFN0cmluZyBkZXNjOwotCQotCXByaXZhdGUgU3RyaW5nIHRhYmxlMTsKLQotCS8vIGVsZW1lbnQKLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudCBlbGVtZW50OwotCi0JLy8gYWN0aW9uIG1hbmFnZXIKLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLy8gYnkgZGVmYXVsdCB0aGlzIGJ1dHRvbiBpcyBmYWxzZQotCXByb3RlY3RlZCBib29sZWFuIHNob3dBZGRGcm9tUHJvY2Vzc0J1dHRvbiA9IGZhbHNlOwotCi0JLy8gZmlsdGVyCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlciA9IG51bGw7Ci0KLQlwdWJsaWMgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWlmIChmaWx0ZXIgPT0gbnVsbCkgewotCQkJZmlsdGVyID0gbmV3IFByb2Nlc3NSb2xlRmlsdGVyKGdldENvbmZpZ3VyYXRpb24oKSwgbnVsbCwKLQkJCQkJRmlsdGVyQ29uc3RhbnRzLlJPTEVTKTsKLQkJfQotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0KLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JCWluaXQoKTsKLQotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gY3JlYXRlIHNlY3Rpb24KLQkJY3JlYXRlU2VjdGlvbihwYXJlbnQpOwotCi0JCS8vIGFkZCBsaXN0ZW5lcnMKLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRyb2xzCi0JCXVwZGF0ZUNvbnRyb2xzKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJLy8gZ2V0IGJyZWFrZG93bmVsZW1lbnQgb2JqZWN0Ci0JCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCi0JCS8vIGdldCB0b29sa2l0Ci0JCXRvb2xraXQgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0KLQkJLy8gZ2V0IGFjdGlvbiBtYW5hZ2VyCi0JCWFjdGlvbk1nciA9IEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEFjdGlvbk1hbmFnZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWJEYXRhKFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2MsIFN0cmluZyB0YWJsZTEpIHsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQl0aGlzLmRlc2MgPSBkZXNjOwotCQl0aGlzLnRhYmxlMSA9IHRhYmxlMTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBzZWN0aW9uCi0JCVNlY3Rpb24gYVNlY3Rpb24gPSBGb3JtVUkuY3JlYXRlU2VjdGlvbih0b29sa2l0LCBwYXJlbnQsCi0JCQkJdGl0bGUsIGRlc2MpOwotCi0JCS8vIGNyZWF0ZSBnZW5lcmFsIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBhU2VjdGlvbiwgMiwKLQkJCQlmYWxzZSk7Ci0KLQkJLy8gY3JlYXRlIHRhYmxlIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgcGFuZTEgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQlHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTEsIHRhYmxlMSk7Ci0KLQkJY3RybF9zZWxlY3RlZCA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSk7Ci0JCXZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3NlbGVjdGVkKTsKLQotCQlpbml0Q29udGVudFByb3ZpZGVyKCk7Ci0KLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXZpZXdlci5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkvLyBjcmVhdGUgYnV0dG9uIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgcGFuZTIgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCi0JCS8vIGNyZWF0ZSBidXR0b25zCi0JCWN0cmxfYWRkXzEgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsgCi0JCWlmIChzaG93QWRkRnJvbVByb2Nlc3NCdXR0b24pIHsKLQkJCWN0cmxfYWRkXzIgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkRnJvbVByb2Nlc3MpOyAKLQkJfQotCQljdHJsX3JlbW92ZSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW1vdmUpOyAKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcihjb21wb3NpdGUpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUyKTsKLQotCX0KLQotCS8qKgotCSAqIEdldCBEZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXREZWZhdWx0Q29uZmlndXJhdGlvbigpIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGdldEFkYXB0ZXIoKTsKLQkJT2JqZWN0IHBhcmVudCA9IG51bGw7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQkJcGFyZW50ID0gYnNJdGVtUHJvdmlkZXIuZ2V0VG9wSXRlbSgpOwotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgcGFyZW50KQotCQkJCQkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCXJldHVybiBjb25maWc7Ci0JCX0gZWxzZSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKCJPQlNSZWxhdGlvblNlY3Rpb246OmdldERlZmF1bHRDb25maWd1cmF0aW9uIC0gSUJTSXRlbVByb3ZpZGVyIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJLy8gQWRkIGZvY3VzIGxpc3RlbmVyIG9uIHByaW1hcnkgdGFza3MgbGlzdAotCQljdHJsX3NlbGVjdGVkLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9hZGRfMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlvcGVuQWRkRGlhbG9nKCk7Ci0JCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCX0KLQkJfSk7Ci0KLQkJaWYgKHNob3dBZGRGcm9tUHJvY2Vzc0J1dHRvbikgewotCQkJY3RybF9hZGRfMi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCW9wZW5BZGRGcm9tUHJvY2Vzc0RpYWxvZygpOwotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJY3RybF9yZW1vdmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJcmVtb3ZlKHJtSXRlbXMpOwotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJCQl9Ci0JCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVsZW1lbnQgIitlbGVtZW50LmdldE5hbWUoKSArCi0JCS8vICJFZGl0YWJsZS0iK2VkaXRhYmxlKTsKLQkJaWYgKGN0cmxfYWRkXzEgIT0gbnVsbCkKLQkJCWN0cmxfYWRkXzEuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmIChjdHJsX2FkZF8yICE9IG51bGwpCi0JCQljdHJsX2FkZF8yLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgZWRpdGFibGUpIHsKLQkJCWlmIChjdHJsX3JlbW92ZSAhPSBudWxsKQotCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChjdHJsX3JlbW92ZSAhPSBudWxsKQotCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdXBkYXRlQ29udHJvbHMoKTsKLQotCQlzdXBlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHBhcmVudCBhY3Rpdml0eQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCS8vIHByb3RlY3RlZCBBY3Rpdml0eSBnZXRQYXJlbnRBY3Rpdml0eShCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQpCi0JLy8gewotCS8vIEFjdGl2aXR5IGFjdGl2aXR5ID0gbnVsbDsKLQkvLyBBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9Ci0JLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkvLyBJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikKLQkvLyBhRmFjdG9yeS5hZGFwdChlbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCS8vIE9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChlbGVtZW50KTsKLQkvLyBpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpCi0JLy8gewotCS8vIGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JLy8gfQotCS8vCQkKLQkvLyByZXR1cm4gYWN0aXZpdHk7Ci0JLy8gfQotCQotCS8qKgotCSAqIEluaXRpYWxpemUgY29udGVudCBwcm92aWRlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBVSSBEaWFsb2cgdG8gYWRkIG1ldGhvZCBlbGVtZW50cwotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkFkZERpYWxvZygpIHsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIFVJIERpYWxvZyB0byBhZGQgZGVzY3JpcHRvciBlbGVtZW50cwotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkFkZEZyb21Qcm9jZXNzRGlhbG9nKCkgewotCX0KLQotCS8vIHByb3RlY3RlZCB2b2lkIGFkZChPYmplY3RbXSBpdGVtcykge30KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQljb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1ByZWRlY2Vzc29yRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUHJlZGVjZXNzb3JEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ0ZjMyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUHJlZGVjZXNzb3JEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotCi0vKioKLSAqIERpYWxvZyBmb3IgYWRkaW5nIHByZWRlY2Vzc29yIGRlcGVuZGVuY3kKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByZWRlY2Vzc29yRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCXByaXZhdGUgVGV4dCBwcmVkSWRUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IHByZXNlbnRhdGlvbk5hbWU7Ci0KLQlwcml2YXRlIENvbWJvIGRlcGVuZGVuY3k7Ci0KLQkvKiogRGVwZW5kZW5jeSBMaXRlcmFscyAqICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTklTSF9UT19TVEFSVCA9IFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fU1RBUlQ7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTklTSF9UT19GSU5JU0ggPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtPcmRlclR5cGVfRklOSVNIX1RPX0ZJTklTSDsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVE9fU1RBUlQgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtPcmRlclR5cGVfU1RBUlRfVE9fU1RBUlQ7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RPX0ZJTklTSCA9IFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya09yZGVyVHlwZV9TVEFSVF9UT19GSU5JU0g7IAotCi0JcHJpdmF0ZSBTdHJpbmdbXSBkZXBlbmRlbmN5TGlzdCA9IG5ldyBTdHJpbmdbXSB7IEZJTklTSF9UT19TVEFSVCwKLQkJCUZJTklTSF9UT19GSU5JU0gsIFNUQVJUX1RPX1NUQVJULCBTVEFSVF9UT19GSU5JU0ggfTsKLQotCXByaXZhdGUgV29ya0JyZWFrZG93bkVsZW1lbnQgZWxlbWVudDsKLQotCXByaXZhdGUgT2JqZWN0IHByb2Nlc3M7Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBMaXN0IHByZWRlY2Vzc29ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgTGlzdCBwcmVkTWFwTGlzdDsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JcHJpdmF0ZSBQcmVkZWNlc3Nvck1hcCBwcmVkTWFwOwotCi0JLyoqCi0JICogRGlhbG9nIGZvciBzZXR0aW5nIHByZWRlY2Vzc29yIGZvciB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqIAkJCVRoZSBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIAkJCVdvcmsgQnJlYWsgZG93biBFbGVtZW50Ci0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiAJCQlQcm9jZXNzIG9mIHRoZSB3b3JrYnJlYWtkb3duIGVsZW1lbnQKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiAJCQlBZGFwdGVyIEZhY3RvcnkgCi0JICogQHBhcmFtIHByZWRNYXAKLQkgKiAJCQlQcmVkZWNlc3NvciBNYXAKLQkgKiBAcGFyYW0gcHJlZE1hcExpc3QKLQkgKiAJCQlQcmVkZWNlc3NvciBNYXAgbGlzdAotCSAqIEBwYXJhbSBhY3Rpb25NZ3IKLQkgKiAJCQlBY3Rpb24gTWFuYWdlcgotCSAqLwotCXB1YmxpYyBQcmVkZWNlc3NvckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgV29ya0JyZWFrZG93bkVsZW1lbnQgZWxlbWVudCwKLQkJCU9iamVjdCBwcm9jZXNzLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCVByZWRlY2Vzc29yTWFwIHByZWRNYXAsIExpc3QgcHJlZE1hcExpc3QsIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0KLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5wcm9jZXNzID0gcHJvY2VzczsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCQl0aGlzLnByZWRNYXAgPSBwcmVkTWFwOwotCQl0aGlzLnByZWRNYXBMaXN0ID0gcHJlZE1hcExpc3Q7Ci0JCXRoaXMuYWN0aW9uTWdyID0gYWN0aW9uTWdyOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIGRpYWxvZyBoZWFkZXIKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5QcmVkZWNlc3NvckRpYWxvZ19IZWFkZXJNZXNzYWdlKTsgCi0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJLy8gYmxhbmsgbGFiZWwKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJLy8gUHJlZGVjZXNzb3IgSUQgaW5kZXgKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5QcmVkZWNlc3NvckRpYWxvZ19JbmRleCk7IAotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlwcmVkSWRUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMTAwOwotCQlwcmVkSWRUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlwcmVkSWRUZXh0LnNldFRleHQobmV3IEludGVnZXIocHJlZE1hcC5nZXRJZCgpKS50b1N0cmluZygpKTsKLQkJLy8gcHJlZElkVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQkJLy8gUHJlc2VudGFpb24gTmFtZQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByZWRlY2Vzc29yRGlhbG9nX1ByZXNlbnRhdGlvbk5hbWUpOyAKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJcHJlc2VudGF0aW9uTmFtZSA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJcHJlc2VudGF0aW9uTmFtZS5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCXByZXNlbnRhdGlvbk5hbWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJV29ya09yZGVyIHdvID0gcHJlZE1hcC5nZXRXb3JrT3JkZXIoKTsKLQkJcHJlc2VudGF0aW9uTmFtZS5zZXRUZXh0KFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUod28uZ2V0UHJlZCgpKSk7Ci0KLQkJLy8gRGVwZW5kZW5jeQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByZWRlY2Vzc29yRGlhbG9nX0RlcGVuZGVuY3kpOyAKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJZGVwZW5kZW5jeSA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJZGVwZW5kZW5jeS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJZGVwZW5kZW5jeS5zZXRJdGVtcyhkZXBlbmRlbmN5TGlzdCk7Ci0KLQkJU3RyaW5nIGRlcGVkZW5jeU5hbWUgPSB3by5nZXRMaW5rVHlwZSgpLmdldE5hbWUoKTsKLQkJaWYgKHdvLmdldExpbmtUeXBlKCkgPT0gV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fRklOSVNIKSB7Ci0JCQlkZXBlZGVuY3lOYW1lID0gRklOSVNIX1RPX0ZJTklTSDsKLQkJfSBlbHNlIGlmICh3by5nZXRMaW5rVHlwZSgpID09IFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX1NUQVJUKSB7Ci0JCQlkZXBlZGVuY3lOYW1lID0gRklOSVNIX1RPX1NUQVJUOwotCQl9IGVsc2UgaWYgKHdvLmdldExpbmtUeXBlKCkgPT0gV29ya09yZGVyVHlwZS5TVEFSVF9UT19GSU5JU0gpIHsKLQkJCWRlcGVkZW5jeU5hbWUgPSBTVEFSVF9UT19GSU5JU0g7Ci0JCX0gZWxzZSBpZiAod28uZ2V0TGlua1R5cGUoKSA9PSBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX1NUQVJUKSB7Ci0JCQlkZXBlZGVuY3lOYW1lID0gU1RBUlRfVE9fU1RBUlQ7Ci0JCX0KLQkJZGVwZW5kZW5jeS5zZXRUZXh0KGRlcGVkZW5jeU5hbWUpOwotCi0JCUxhYmVsIGxpbmUgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwKLQkJCQl8IFNXVC5CT0xEKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsaW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXByZWRJZFRleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZXZlbnQpIHsKLQkJCQlpbnQgbmV3SWQ7Ci0JCQkJdHJ5IHsKLQkJCQkJbmV3SWQgPSBuZXcgSW50ZWdlcihwcmVkSWRUZXh0LmdldFRleHQoKSkuaW50VmFsdWUoKTsKLQkJCQkJaWYgKG5ld0lkIDwgMCkKLQkJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheVdhcm5pbmcoCi0JCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyVGl0bGUsIAotCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlck1lc3NhZ2UpOyAKLQotCQkJCQlwcmVkSWRUZXh0LnNldFRleHQobmV3IEludGVnZXIocHJlZE1hcC5nZXRJZCgpKS50b1N0cmluZygpKTsKLQkJCQkJcHJlZElkVGV4dC5zZXRGb2N1cygpOwotCQkJCQlwcmVkSWRUZXh0LnNlbGVjdEFsbCgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaWYgKGFscmVhZHlFeGlzdHMobmV3SWQpKSB7Ci0JCQkJCXByZWRJZFRleHQuc2V0VGV4dChuZXcgSW50ZWdlcihwcmVkTWFwLmdldElkKCkpLnRvU3RyaW5nKCkpOwotCi0JCQkJCXByZWRJZFRleHQuc2VsZWN0QWxsKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlTdHJpbmcgcHJlZElETGlzdCA9IGdldFByZWRJZChuZXdJZCk7Ci0JCQkJaWYgKHByZWRJRExpc3QgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCi0JCQkJU3RyaW5nIHN0ciA9IFByb2Nlc3NVdGlsLmNoZWNrUHJlZGVjZXNzb3JMaXN0KGVsZW1lbnQsCi0JCQkJCQlwcmVkSURMaXN0LCBhZGFwdGVyRmFjdG9yeSwgcHJvY2VzcywgcHJlZGVjZXNzb3JzKTsKLQkJCQlpZiAoc3RyICE9IG51bGwpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvckRpYWxvZ1RpdGxlLCBzdHIpOyAKLQkJCQkJcHJlZElkVGV4dC5zZXRUZXh0KG5ldyBJbnRlZ2VyKHByZWRNYXAuZ2V0SWQoKSkudG9TdHJpbmcoKSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJcHJlc2VudGF0aW9uTmFtZS5zZXRUZXh0KGdldE5hbWUobmV3SWQpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgcHJlc2VudGF0aW9uIG5hbWUvbmFtZSBmb3IgdGhpcyBwcmVkZWNlc3NvciBpZAotCSAqIAotCSAqIEBwYXJhbSBuZXdJZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXROYW1lKGludCBuZXdJZCkgewotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihhZGFwdGVyRmFjdG9yeSwKLQkJCQlwcm9jZXNzKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KG9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCUludGVnZXIgaWQgPSBuZXcgSW50ZWdlcihpdGVtUHJvdmlkZXIuZ2V0SWQoKSk7Ci0JCQlvYmogPSBUbmdVdGlsLnVud3JhcChvYmopOwotCi0JCQlpZiAobmV3SWQgPT0gaWQuaW50VmFsdWUoKSkgewotCQkJCW5hbWUgPSAoKEJyZWFrZG93bkVsZW1lbnQpIG9iaikuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJCWlmIChTdHJVdGlsLmlzQmxhbmsobmFtZSkpIHsKLQkJCQkJbmFtZSA9ICgoQnJlYWtkb3duRWxlbWVudCkgb2JqKS5nZXROYW1lKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIENoZWNrIHRvIHNlZSB3aGV0aGVyIHByZWRlY2Vzc29yIElkIGFscmVhZHkgZXhpc3RzCi0JICogCi0JICogQHBhcmFtIG5ld0lkCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBhbHJlYWR5RXhpc3RzKGludCBuZXdJZCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBwcmVkTWFwTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCVByZWRlY2Vzc29yTWFwIG1hcCA9IChQcmVkZWNlc3Nvck1hcCkgaXRvci5uZXh0KCk7Ci0JCQlpZiAoKG1hcC5nZXRJZCgpID09IG5ld0lkKSAmJiAocHJlZE1hcC5nZXRJZCgpICE9IG5ld0lkKSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvckRpYWxvZ1RpdGxlLCAKLQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yTWVzc2FnZSk7IAotCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEdldCBjb21tYW5kIHNlcGFyYXRlZCBsaXN0IG9mIGFsbCBwcmVkZWNlc3NvcgotCSAqIAotCSAqIEBwYXJhbSBuZXdJZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQcmVkSWQoaW50IG5ld0lkKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdG9yID0gcHJlZE1hcExpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlQcmVkZWNlc3Nvck1hcCBtYXAgPSAoUHJlZGVjZXNzb3JNYXApIGl0b3IubmV4dCgpOwotCQkJaWYgKHByZWRNYXAuZ2V0SWQoKSA9PSBtYXAuZ2V0SWQoKSkgewotCQkJCWJ1Zi5hcHBlbmQobmV3SWQpOwotCQkJfSBlbHNlIHsKLQkJCQlidWYuYXBwZW5kKG1hcC5nZXRJZCgpKTsKLQkJCX0KLQotCQkJYnVmLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwocGFyZW50KTsKLQkJcGFyZW50Ci0JCQkJLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5QcmVkZWNlc3NvckRpYWxvZ19UaXRsZSk7IAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjb2tQcmVzc2VkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCS8vIG5ldyBpZAotCQlpbnQgbmV3SWQgPSBuZXcgSW50ZWdlcihwcmVkSWRUZXh0LmdldFRleHQoKSkuaW50VmFsdWUoKTsKLQkJLy8gbmUgbGluayB0eXBlCi0JCVdvcmtPcmRlclR5cGUgd29ya09yZGVyVHlwZSA9IGdldFdvcmtPcmRlclR5cGUoKTsKLQotCQlpZiAoKG5ld0lkICE9IHByZWRNYXAuZ2V0SWQoKSkKLQkJCQl8fCAoIXdvcmtPcmRlclR5cGUuZXF1YWxzKHByZWRNYXAuZ2V0V29ya09yZGVyKCkuZ2V0TGlua1R5cGUoKSkpKSB7Ci0JCQlTdHJpbmcgcHJlZElETGlzdCA9IGdldFByZWRJZChuZXdJZCk7Ci0JCQlpZiAocHJlZElETGlzdCA9PSBudWxsKQotCQkJCXJldHVybjsKLQotCQkJU3RyaW5nIHN0ciA9IFByb2Nlc3NVdGlsLmNoZWNrUHJlZGVjZXNzb3JMaXN0KGVsZW1lbnQsIHByZWRJRExpc3QsCi0JCQkJCWFkYXB0ZXJGYWN0b3J5LCBwcm9jZXNzLCBwcmVkZWNlc3NvcnMpOwotCQkJaWYgKHN0ciAhPSBudWxsKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yRGlhbG9nVGl0bGUsIHN0cik7IAotCQkJCXByZWRJZFRleHQuc2V0VGV4dChuZXcgSW50ZWdlcihwcmVkTWFwLmdldElkKCkpLnRvU3RyaW5nKCkpOwotCQkJfQotCi0JCQkvLyByZW1vdmUgaXQKLQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSwKLQkJCQkJcHJlZE1hcC5nZXRXb3JrT3JkZXIoKSwgLTEpOwotCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQljbG9zZSgpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCXByZWRNYXBMaXN0LnJlbW92ZShwcmVkTWFwKTsKLQotCQkJaW50IHNpemUgPSBwcmVkZWNlc3NvcnMuc2l6ZSgpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHByZWRlY2Vzc29ycwotCQkJCQkJLmdldChpKTsKLQotCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQlmaW5kX3ByZWQ6IGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50Ci0JCQkJCQkuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVdvcmtPcmRlciB3byA9IChXb3JrT3JkZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKHdvLmdldFByZWQoKSA9PSBlKSB7Ci0JCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQlicmVhayBmaW5kX3ByZWQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFmb3VuZCkgewotCQkJCQlXb3JrT3JkZXIgd28gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrT3JkZXIoKTsKLQkJCQkJd28uc2V0UHJlZChlKTsKLQkJCQkJd28uc2V0TGlua1R5cGUod29ya09yZGVyVHlwZSk7Ci0JCQkJCWJvb2xlYW4gc3RhdCA9IGFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSwKLQkJCQkJCQkJCXdvLCAtMSk7Ci0JCQkJCWlmICghc3RhdCkKLQkJCQkJCXJldHVybjsKLQotCQkJCQlwcmVkTWFwLnNldElkKG5ld0lkKTsKLQkJCQkJcHJlZE1hcC5zZXRXb3JrT3JkZXIod28pOwotCQkJCQlwcmVkTWFwTGlzdC5hZGQocHJlZE1hcCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHdvcmsgb3JkZXIgbGluayB0eXBlIGZyb20gVUkKLQkgKiAKLQkgKiBAcmV0dXJuIAotCSAqIAkJCVdvcmsgT3JkZXIgdHlwZQotCSAqLwotCXByaXZhdGUgV29ya09yZGVyVHlwZSBnZXRXb3JrT3JkZXJUeXBlKCkgewotCQlpbnQgaW5kZXggPSBkZXBlbmRlbmN5LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCVdvcmtPcmRlclR5cGUgdHlwZTsKLQkJaWYgKGluZGV4ID09IDApIHsKLQkJCXR5cGUgPSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVDsKLQkJfSBlbHNlIGlmIChpbmRleCA9PSAxKSB7Ci0JCQl0eXBlID0gV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fRklOSVNIOwotCQl9IGVsc2UgaWYgKGluZGV4ID09IDIpIHsKLQkJCXR5cGUgPSBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX1NUQVJUOwotCQl9IGVsc2UgewotCQkJdHlwZSA9IFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fRklOSVNIOwotCQl9Ci0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjbG9zZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0KLQkJcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1ByZWRlY2Vzc29yTWFwLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUHJlZGVjZXNzb3JNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVkNTAyZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUHJlZGVjZXNzb3JNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotCi0vKioKLSAqIE1hcCBvZiBwcmVkZWNlc3NvciBJRCBhbmQgY29ycmVzcG9uZGluZyB3b3JrIG9yZGVyCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFByZWRlY2Vzc29yTWFwIHsKLQlwcml2YXRlIGludCBpZDsKLQotCXByaXZhdGUgV29ya09yZGVyIHdvOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogCQlQcmVkZWNlc3NvciBJRAotCSAqIEBwYXJhbSB3bwotCSAqIAkJV29ya09yZGVyIG9iamVjdAotCSAqLwotCXB1YmxpYyBQcmVkZWNlc3Nvck1hcChpbnQgaWQsIFdvcmtPcmRlciB3bykgewotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMud28gPSB3bzsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgcHJlZGVjZXNzb3IgSUQKLQkgKiBAcmV0dXJuCi0JICogCQkJUHJlZGVjZXNzb3IgSUQKLQkgKi8KLQlwdWJsaWMgaW50IGdldElkKCkgewotCQlyZXR1cm4gdGhpcy5pZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgUHJlZGVjZXNzb3IgSUQKLQkgKiBAcGFyYW0gaWQKLQkgKiAJCQlQcmVkZWNlc3NvciBJRAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKGludCBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCQotCS8qKgotCSAqIEdldCB3b3JrIG9yZGVyCi0JICogQHJldHVybgotCSAqIAkJV29yayBPcmRlcgotCSAqLwotCXB1YmxpYyBXb3JrT3JkZXIgZ2V0V29ya09yZGVyKCkgewotCQlyZXR1cm4gdGhpcy53bzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgV29yayBPcmRlcgotCSAqIEBwYXJhbSB3bwotCSAqIAkJCVdvcmsgT3JkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrT3JkZXIoV29ya09yZGVyIHdvKSB7Ci0JCXRoaXMud28gPSB3bzsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUHJvcGVydGllc1Jlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4MmRkZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUHJvcGVydGllc1Jlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotLyoqCi0gKiBQcm9wZXJ0aWVzIHJlc291cmNlcwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvcGVydGllc1Jlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkKLQkJCQkJCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIFByb3BlcnRpZXNSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Eb2N1bWVudEluZm9ybWF0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfZ3VpZGFuY2VJbmZvcm1hdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyZWFrZG93bkVsZW1lbnRfb3B0aW9uSW5mb3JtYXRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRvcl9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pbGVzdG9uZV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNaWxlc3RvbmVfZGV0YWlsSW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtCcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcmVha2Rvd25FbGVtZW50X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Eb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRvcl9kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Ob25lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1ByZXNlbnRhdGlvbk5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19icmllZkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfbWFpbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfcHVycG9zZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX3ByZWZpeDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcmVha2Rvd25FbGVtZW50X1R5cGVfTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1R5cGVfVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1R5cGVfUm9sZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1R5cGVfV29ya1Byb2R1Y3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3RfVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Nb2RlbEluZm87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9wcmVzZW50YXRpb25OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X2FsdGVybmF0aXZlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9ob3dUb1N0YWZmOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyZWFrZG93bkVsZW1lbnRfa2V5Q29uc2lkZXJhdGlvbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc191c2FnZUd1aWRhbmNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1JvYWRtYXBUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Sb2FkbWFwRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfQ29tbXVuaWNhdGlvbk1hdGVyaWFsVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfQ29tbXVuaWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfRWR1Y2F0aW9uTWF0ZXJpYWxUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1NlbGVjdGVkX1JvYWRtYXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfU2VsZWN0ZWRfR2VuZXJhbEd1aWRhbmNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1NlbGVjdGVkX0NvbW11bmljYXRpb25NYXRlcmlhbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9TZWxlY3RlZF9FZHVjYXRpb25NYXRlcmlhbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9EaWFncmFtVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfRGlhZ3JhbURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0FESW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfQURESW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfV1BESW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfVXNlQURJbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Vc2VBRERJbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Vc2VXUERJbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Bc3NpZ247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfV29ya1JvbGx1cDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9UZWFtUm9sbHVwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Xb3JrUm9sbHVwRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfVGVhbVJvbGx1cERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX011bHRpcGxlT2N1cnJhbmNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX09wdGlvbmFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1BsYW5uZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3VwcmVzc2VkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtCcmVha2Rvd25FbGVtZW50X0V2ZW50RHJpdmVuOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtCcmVha2Rvd25FbGVtZW50X09uZ29pbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfUmVwZWF0YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9QcmVkZWNlc3NvcnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9JRF9URVhUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX1BSRVNFTlRBVElPTl9OQU1FX1RFWFQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfREVQRU5ERU5DWV9URVhUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQWRkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfRWRpdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X1JlbW92ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19TVEFSVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19GSU5JU0g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya09yZGVyVHlwZV9TVEFSVF9UT19GSU5JU0g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya09yZGVyVHlwZV9TVEFSVF9UT19TVEFSVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcmVha2Rvd25FbGVtZW50X09wdGlvbl9TeW5jaHJvbml6ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRvcl9SZWZpbmVkRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZF9TdGVwczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1Rhc2tzX1NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfVGFibGUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3REZXNjcmlwdG9yX1R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9TZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9TZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9UYWJsZTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZURlc2NyaXB0b3JfVGVhbV9UYWJsZTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXBvc2l0ZVJvbGVfUm9sZV9UYWJsZTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGVhbVByb2ZpbGVfUm9sZV9UYWJsZTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19SaWNoVGV4dF9Db2xsYXBzZUltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfUmljaFRleHRfRXhwYW5kSW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19BZGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19BZGRGcm9tUHJvY2VzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1JlbmFtZV9NZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfUmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfVXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Eb3duOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19CdXR0b25fTGlua01ldGhvZEVsZW1lbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19CdXR0b25fQ2xlYXJNZXRob2RFbGVtZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfSW52YWxpZE5hbWVUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0ludmFsaWROYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfUmVuYW1lX1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfSW52YWxpZFByZXNlbnRhdGlvbk5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19MaW5rTWV0aG9kRWxlbWVudFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfSW52YWxpZExpbmtNZXRob2RFbGVtZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfQXNzaWdubWVudEluZm9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1RlYW1Bc3NpZ25FcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1RlYW1EaWFsb2dNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfVGVhbURpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfRGVsaXZlcmFibGVBc3NpZ25FcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0NvbXBvc2l0ZVJvbGVBc3NpZ25FcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlck1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX05vSXRlbXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19JdGVtc1NlbGVjdGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfTm9Qcm9wZXJ0aWVzQXZhaWxhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWRlY2Vzc29yRGlhbG9nX1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWRlY2Vzc29yRGlhbG9nX0hlYWRlck1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZGVjZXNzb3JEaWFsb2dfSW5kZXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZGVjZXNzb3JEaWFsb2dfUHJlc2VudGF0aW9uTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVkZWNlc3NvckRpYWxvZ19EZXBlbmRlbmN5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JEaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfdGV4dEVkaXRDZWxsX3Byb2JsZW1fbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc19jZWxsRWRpdG9yX2ludmFsaWRQcmVkY2Vzc29yX3Byb2JsZW1fbXNnOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgUHJvcGVydGllc1Jlc291cmNlcy5jbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2Uga2V5IGFuZCBmb3JtYXR0ZWQKLQkgKiB3aXRoIGEgZ2l2ZW4gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIEEgcmVzb3VyY2Uga2V5LgotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBBbiBvYmplY3QuCi0JICogQHJldHVybiBBIGZvcm1hdHRlZCBsb2NhbGl6ZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGtleSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKGtleSwgbmV3IE9iamVjdFtdIHsgZGF0YSB9KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUHJvcGVydGllc1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAzZWYwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUHJvcGVydGllc1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHByb3BlcnRpZXMgCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnRpZXNVdGlsIHsKLQotCS8qKgotCSAqIFJldHVybnMgdHlwZSBvZiB0aGUgb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4KLQkgKiAJCVR5cGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIHByZWZpeCA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQnJlYWtkb3duRWxlbWVudF9UeXBlX05hbWU7IAotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX0NBUEFCSUxJVFlfUEFUVEVSTjsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCXByZWZpeCA9IExpYnJhcnlVSVRleHQuVEVYVF9ERUxJVkVSWV9QUk9DRVNTOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCXByZWZpeCA9IExpYnJhcnlVSVRleHQuVEVYVF9QUk9DRVNTOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFBoYXNlKSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfUEhBU0U7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSXRlcmF0aW9uKSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfSVRFUkFUSU9OOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfQUNUSVZJVFk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCXByZWZpeCA9IExpYnJhcnlVSVRleHQuVEVYVF9UQVNLX0RFU0NSSVBUT1I7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCXByZWZpeCA9IExpYnJhcnlVSVRleHQuVEVYVF9ST0xFX0RFU0NSSVBUT1I7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfV09SS19QUk9EVUNUX0RFU0NSSVBUT1I7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfTUlMRVNUT05FOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfVEVBTV9QUk9GSUxFOwotCQl9Ci0KLQkJcmV0dXJuIHByZWZpeDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHR5cGUgb2YgdGhlIG9iamVjdCBpbiBsb3dlciBjYXNlCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4KLQkgKiAJCVR5cGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlTG93ZXIoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgdHlwZSA9IGdldFR5cGUob2JqKTsKLQkJCi0JCXJldHVybiBTdHJVdGlsLnRvTG93ZXIodHlwZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUHJvcGVydGllc1ZpZXdDb25zdGFudHMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Qcm9wZXJ0aWVzVmlld0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODY3NTA1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Qcm9wZXJ0aWVzVmlld0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi0vKioKLSAqIENvbnN0YW50cyBmb3IgcHJvcGVydGllcyB2aWV3Ci0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzVmlld0NvbnN0YW50cyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX0RFU0NSSVBUT1IgPSAiUm9sZURlc2NyaXB0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLUFJPRFVDVFMgPSAiV29ya1Byb2R1Y3RzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19ERVNDUklQVE9SID0gIlRhc2tEZXNjcmlwdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRVMgPSAiUm9sZXMiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZWxhdGlvblNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZWxhdGlvblNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc0OWVhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVsYXRpb25TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5JdGVtc0ZpbHRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotLyoqCi0gKiBUaGUgYmFzZSBjbGFzcyB1c2VkIHRvIGRpc3BsYXkgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGRlc2NyaXB0b3JzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJlbGF0aW9uU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG51bGw7Ci0KLQkvLyBlbGVtZW50Ci0JcHJvdGVjdGVkIERlc2NyaXB0b3IgZWxlbWVudDsKLQotCS8vIGFjdGlvbiBtYW5hZ2VyCi0JcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCXByaXZhdGUgRm9ybVRvb2xraXQgdG9vbGtpdDsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfYWRkXzEsIGN0cmxfYWRkXzIsIGN0cmxfYWRkXzMsIGN0cmxfYWRkXzQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX3JlbW92ZV8xLCBjdHJsX3JlbW92ZV8yLCBjdHJsX3JlbW92ZV8zLCBjdHJsX3JlbW92ZV80OwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9hZGRfcHJvY18xLCBjdHJsX2FkZF9wcm9jXzIsIGN0cmxfYWRkX3Byb2NfMywKLQkJCWN0cmxfYWRkX3Byb2NfNDs7Ci0KLQlwcml2YXRlIFRhYmxlIGN0cmxfdGFibGVfMSwgY3RybF90YWJsZV8yLCBjdHJsX3RhYmxlXzMsIGN0cmxfdGFibGVfNDsKLQotCXByb3RlY3RlZCBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjEsIHRhYmxlVmlld2VyMiwgdGFibGVWaWV3ZXIzLAotCQkJdGFibGVWaWV3ZXI0OwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYnJpZWZfZGVzYzsKLQotCXByaXZhdGUgU3RyaW5nIHRhYlN0cmluZzsKLQkKLQlwcml2YXRlIFN0cmluZyB0aXRsZSwgZGVzYywgdGFibGUxLCB0YWJsZTIsIHRhYmxlMywgdGFibGU0OwotCi0JcHJpdmF0ZSBpbnQgdGFibGVDb3VudDsKLQotCXByaXZhdGUgYm9vbGVhbltdIGNoYW5nZXNBbGxvd2VkOwotCi0JUHJvY2VzcyBwcm9jZXNzOwotCi0JSUZpbHRlciBkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlcjsKLQotCXByb3RlY3RlZCBQcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCXJldHVybiBwcm9jZXNzOwotCX0KLQotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlckZvckRlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdG9yVGFiTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LAotCQkJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpIHsKLQotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQkJaW5pdCgpOwotCi0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBjcmVhdGUgc2VjdGlvbgotCQljcmVhdGVTZWN0aW9uKHBhcmVudCk7Ci0KLQkJLy8gYWRkIGxpc3RlbmVycwotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQkvLyB1cGRhdGUgY29udHJvbHMKLQkJdXBkYXRlQ29udHJvbHMoKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRhYkRhdGEoU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzYywgU3RyaW5nIHRhYmxlMSwgU3RyaW5nIHRhYmxlMiwgU3RyaW5nIHRhYmxlMywgU3RyaW5nIHRhYmxlNCwgU3RyaW5nIHRhYlN0cmluZykgewotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXRoaXMuZGVzYyA9IGRlc2M7Ci0JCXRoaXMudGFibGUxID0gdGFibGUxOwotCQl0aGlzLnRhYmxlMiA9IHRhYmxlMjsKLQkJdGhpcy50YWJsZTMgPSB0YWJsZTM7Ci0JCXRoaXMudGFibGU0ID0gdGFibGU0OwotCQkKLQkJdGhpcy50YWJTdHJpbmcgPSB0YWJTdHJpbmc7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFibGVEYXRhKGludCB0YWJsZUNvdW50LCBib29sZWFuW10gY2hhbmdlc0FsbG93ZWQpIHsKLQkJdGhpcy50YWJsZUNvdW50ID0gdGFibGVDb3VudDsKLQkJdGhpcy5jaGFuZ2VzQWxsb3dlZCA9IGNoYW5nZXNBbGxvd2VkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCS8vIGdldCBkZXNjcmlwdG9yIG9iamVjdAotCQllbGVtZW50ID0gKERlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQotCQkvLyBnZXQgdG9vbGtpdAotCQl0b29sa2l0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpOwotCi0JCS8vIGdldCBhY3Rpb24gbWFuYWdlcgotCQlhY3Rpb25NZ3IgPSBFUEZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5BYnN0cmFjdFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQllbGVtZW50ID0gKERlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQotCQkJCWluaXRDb250ZW50UHJvdmlkZXIxKCk7Ci0JCQkJaW5pdENvbnRlbnRQcm92aWRlcjIoKTsKLQkJCQlpbml0Q29udGVudFByb3ZpZGVyMygpOwotCQkJCWluaXRDb250ZW50UHJvdmlkZXI0KCk7Ci0KLQkJCQkvLyBoaWRlL3Nob3cgY29udHJvbHMgYmFzZWQgb24gZWRpdGFibGUKLQkJCQl1cGRhdGVDb250cm9scygpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgZGVzY3JpcHRvciByZWxhdGlvbiBzZWN0aW9uOiAiICsgZWxlbWVudCwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgY29udHJvbHMgYmFzZWQgb24gZWRpdGFibGUgYm9vbGVhbiB2YWx1ZS4gQ29udHJvbHMgY291bGQgYmUKLQkgKiBlZGl0YWJsZSBvciByZWFkLW9ubHkgYWZ0ZXIgdGhpcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJFbGVtZW50ICIrZWxlbWVudC5nZXROYW1lKCkgKwotCQkvLyAiRWRpdGFibGUtIitlZGl0YWJsZSk7Ci0JCWlmIChjdHJsX2FkZF8xICE9IG51bGwpCi0JCQljdHJsX2FkZF8xLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlpZiAoY3RybF9hZGRfMiAhPSBudWxsKQotCQkJY3RybF9hZGRfMi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKGN0cmxfYWRkXzMgIT0gbnVsbCkKLQkJCWN0cmxfYWRkXzMuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmIChjdHJsX2FkZF80ICE9IG51bGwpCi0JCQljdHJsX2FkZF80LnNldEVuYWJsZWQoZWRpdGFibGUpOwotCi0JCWlmIChjdHJsX2FkZF9wcm9jXzEgIT0gbnVsbCkKLQkJCWN0cmxfYWRkX3Byb2NfMS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKGN0cmxfYWRkX3Byb2NfMiAhPSBudWxsKQotCQkJY3RybF9hZGRfcHJvY18yLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlpZiAoY3RybF9hZGRfcHJvY18zICE9IG51bGwpCi0JCQljdHJsX2FkZF9wcm9jXzMuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmIChjdHJsX2FkZF9wcm9jXzQgIT0gbnVsbCkKLQkJCWN0cmxfYWRkX3Byb2NfNC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMQotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQkJaWYgKHRhYmxlVmlld2VyMiAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMi5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiBlZGl0YWJsZSkgewotCQkJCQlpZiAoY3RybF9yZW1vdmVfMiAhPSBudWxsKQotCQkJCWN0cmxfcmVtb3ZlXzIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChjdHJsX3JlbW92ZV8yICE9IG51bGwpCi0JCQkJY3RybF9yZW1vdmVfMi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCWlmICh0YWJsZVZpZXdlcjMgIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjMuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgZWRpdGFibGUpIHsKLQkJCQljdHJsX3JlbW92ZV8zLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWN0cmxfcmVtb3ZlXzMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGFibGVWaWV3ZXI0ICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXI0LmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQkJY3RybF9yZW1vdmVfNC5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQljdHJsX3JlbW92ZV80LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZSBhbGwgbGFiZWwgYW5kIGNvbnRlbnQgcHJvdmlkZXJzCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBmaXJzdCB0YWJsZSBpbiBwcm9wZXJ0aWVzIHZpZXcKLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIxKCkgewotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgY29udGVudCBwcm92aWRlciBmb3IgdGhlIHNlY29uZCB0YWJsZSBpbiBwcm9wZXJ0aWVzIHZpZXcKLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIyKCkgewotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgY29udGVudCBwcm92aWRlciBmb3IgdGhlIHRoaXJkIHRhYmxlIGluIHByb3BlcnRpZXMgdmlldwotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcjMoKSB7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgZm91cnRoIHRhYmxlIGluIHByb3BlcnRpZXMgdmlldwotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcjQoKSB7Ci0JfQotCi0JLyoqCi0JICogR2V0IGxpc3Qgb2YgZGVzY3JpcHRvcnMgZnJvbSB0aGUgcHJvY2VzcwotCSAqIEByZXR1cm4KLQkgKiAJCQlMaXN0IG9mIGRlc2NyaXB0b3JzCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RGVzY3JpcHRvcnNGcm9tUHJvY2VzcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBmaWx0ZXIgd2hpY2ggYWxsb3dzIGZpbHRlcmluZyBlbGVtZW50IGJhc2VkIG9uIG1ldGhvZCBjb25maWd1cmF0aW9uIAotCSAqIEByZXR1cm4KLQkgKiAJCUZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWludCB0YWJsZUhlaWdodCA9IDgwOwotCi0JCS8vIGNyZWF0ZSBzZWN0aW9uCi0JCVNlY3Rpb24gYVNlY3Rpb24gPSBGb3JtVUkuY3JlYXRlU2VjdGlvbih0b29sa2l0LCBjb21wb3NpdGUsCi0JCQkJdGl0bGUsIGRlc2MpOwotCi0JCS8vIGNyZWF0ZSBjb21wb3NpdGUKLQkJQ29tcG9zaXRlIHNlY3Rpb25Db21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGFTZWN0aW9uLAotCQkJCTIsIGZhbHNlKTsKLQotCQkvLyBjcmVhdGUgdGFibGUgMQotCQlpbnQgY291bnQgPSAwOwotCQl7Ci0JCQlDb21wb3NpdGUgcGFuZTEgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTEsIHRhYmxlMSk7Ci0KLQkJCWN0cmxfdGFibGVfMSA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSwgdGFibGVIZWlnaHQpOwotCQkJdGFibGVWaWV3ZXIxID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdGFibGVfMSk7Ci0JCQlpbml0Q29udGVudFByb3ZpZGVyMSgpOwotCi0JCQl0YWJsZVZpZXdlcjEuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJCXRhYmxlVmlld2VyMS5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkJLy8gY3JlYXRlIGJ1dHRvbnMgZm9yIHRhYmxlMQotCQkJQ29tcG9zaXRlIHBhbmUyID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQotCQkJaWYgKGNoYW5nZXNBbGxvd2VkW2NvdW50XSkgewotCQkJCWN0cmxfYWRkXzEgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZCk7IAotCQkJCWN0cmxfYWRkX3Byb2NfMSA9IEZvcm1VSQotCQkJCQkJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZEZyb21Qcm9jZXNzKTsgCi0JCQkJY3RybF9yZW1vdmVfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsgCi0JCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQkJfQotCQljb3VudCsrOwotCi0JCS8vIGNyZWF0ZSB0YWJsZTIKLQkJaWYgKGNvdW50IDwgdGFibGVDb3VudCkgewotCQkJQ29tcG9zaXRlIHBhbmUzID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUzLCB0YWJsZTIpOwotCi0JCQljdHJsX3RhYmxlXzIgPSBGb3JtVUkuY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTMsIHRhYmxlSGVpZ2h0KTsKLQkJCXRhYmxlVmlld2VyMiA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3RhYmxlXzIpOwotCQkJaW5pdENvbnRlbnRQcm92aWRlcjIoKTsKLQotCQkJdGFibGVWaWV3ZXIyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQl0YWJsZVZpZXdlcjIuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTIKLQkJCUNvbXBvc2l0ZSBwYW5lNCA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0JCQlpZiAoY2hhbmdlc0FsbG93ZWRbY291bnRdKSB7Ci0JCQkJY3RybF9hZGRfMiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTQsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsgCi0JCQkJY3RybF9hZGRfcHJvY18yID0gRm9ybVVJCi0JCQkJCQkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU0LCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkRnJvbVByb2Nlc3MpOyAKLQkJCQljdHJsX3JlbW92ZV8yID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lNCwKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW1vdmUpOyAKLQkJCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTMpOwotCQl9Ci0KLQkJY291bnQrKzsKLQotCQkvLyBDcmVhdGUgdGFibGUzCi0JCWlmIChjb3VudCA8IHRhYmxlQ291bnQpIHsKLQkJCUNvbXBvc2l0ZSBwYW5lNSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lNSwgdGFibGUzKTsKLQotCQkJY3RybF90YWJsZV8zID0gRm9ybVVJLmNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmU1LCB0YWJsZUhlaWdodCk7Ci0JCQl0YWJsZVZpZXdlcjMgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF90YWJsZV8zKTsKLQkJCWluaXRDb250ZW50UHJvdmlkZXIzKCk7Ci0KLQkJCXRhYmxlVmlld2VyMy5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQkJdGFibGVWaWV3ZXIzLnNldElucHV0KGVsZW1lbnQpOwotCi0JCQkvLyBjcmVhdGUgYnV0dG9ucyBmb3IgdGFibGUyCi0JCQlDb21wb3NpdGUgcGFuZTYgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCQkJaWYgKChuZXcgQm9vbGVhbihjaGFuZ2VzQWxsb3dlZFtjb3VudF0pKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCWN0cmxfYWRkXzMgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU2LAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZCk7IAotCQkJCWN0cmxfYWRkX3Byb2NfMyA9IEZvcm1VSQotCQkJCQkJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lNiwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZEZyb21Qcm9jZXNzKTsgCi0JCQkJY3RybF9yZW1vdmVfMyA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTYsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsgCi0JCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmU1KTsKLQkJfQotCQljb3VudCsrOwotCi0JCWlmIChjb3VudCA8IHRhYmxlQ291bnQpIHsKLQkJCUNvbXBvc2l0ZSBwYW5lNyA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lNywgdGFibGU0KTsKLQotCQkJY3RybF90YWJsZV80ID0gRm9ybVVJLmNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmU3LCB0YWJsZUhlaWdodCk7Ci0JCQl0YWJsZVZpZXdlcjQgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF90YWJsZV80KTsKLQkJCWluaXRDb250ZW50UHJvdmlkZXI0KCk7Ci0KLQkJCXRhYmxlVmlld2VyNC5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQkJdGFibGVWaWV3ZXI0LnNldElucHV0KGVsZW1lbnQpOwotCi0JCQkvLyBjcmVhdGUgYnV0dG9ucyBmb3IgdGFibGU0Ci0JCQlDb21wb3NpdGUgcGFuZTggPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCQkJaWYgKChuZXcgQm9vbGVhbihjaGFuZ2VzQWxsb3dlZFtjb3VudF0pKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCWN0cmxfYWRkXzQgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU4LAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZCk7IAotCQkJCWN0cmxfYWRkX3Byb2NfNCA9IEZvcm1VSQotCQkJCQkJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lOCwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZEZyb21Qcm9jZXNzKTsgCi0JCQkJY3RybF9yZW1vdmVfNCA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTgsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsgCi0JCQkJY3RybF9yZW1vdmVfNC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmU4KTsKLQotCQl9Ci0KLQkJLy8gY3JlYXRlIGJyaWVmIGRlc2NyaXB0aW9uCi0JCWludCBoZWlnaHRIaW50ID0gNDA7Ci0JCS8vIGludCBob3Jpem9udGFsU3BhbiA9IDI7Ci0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfYnJpZWZEZXNjcmlwdGlvbiwgaGVpZ2h0SGludCk7IAotCQljdHJsX2JyaWVmX2Rlc2MgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCWhlaWdodEhpbnQsIGhlaWdodEhpbnQpOwotCQljdHJsX2JyaWVmX2Rlc2Muc2V0RWRpdGFibGUoZmFsc2UpOwotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHNlY3Rpb25Db21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIGFkZExpc3RlcmVycwotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJLyoqCi0JCSAqIEZpcnN0IHNldCBvZiBsaXN0ZW5lcnMKLQkJICovCi0JCWludCBjb3VudCA9IDA7Ci0JCWlmIChjb3VudCA8IHRhYmxlQ291bnQpIHsKLQkJCWN0cmxfdGFibGVfMS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIxCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJdGFibGVWaWV3ZXIxCi0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIxCi0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiBlZGl0YWJsZSkKLQkJCQkJCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCQkJU3RyaW5nIGRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIHNlbGVjdGlvbgotCQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSkKLQkJCQkJCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCQlkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChkZXNjKTsKLQkJCQkJCQl9IGVsc2UgaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJCQkJCWN0cmxfYnJpZWZfZGVzYwotCQkJCQkJCQkJCS5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19NdWx0aXBsZVNlbGVjdGlvbiArICIgLSAiICsgc2VsZWN0aW9uLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9KTsKLQotCQkJaWYgKGNoYW5nZXNBbGxvd2VkW2NvdW50XSkgewotCQkJCWN0cmxfYWRkXzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCUlGaWx0ZXIgZmlsdGVyID0gZ2V0RmlsdGVyKCk7Ci0JCQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBQcm9jZXNzVXRpbAotCQkJCQkJCQkuZ2V0QXNzb2NpYXRlZEVsZW1lbnRMaXN0KGdldEV4aXN0aW5nRWxlbWVudHMxKCkpOwotCi0JCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBlbGVtZW50LCB0YWJTdHJpbmcsCi0JCQkJCQkJCWV4aXN0aW5nRWxlbWVudHMpOwotCi0JCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCWZkLnNldFRpdGxlKHRhYlN0cmluZyk7Ci0JCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQlhZGRJdGVtczEoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJCXRhYmxlVmlld2VyMS5yZWZyZXNoKCk7Ci0KLQkJCQkJfQotCQkJCX0pOwotCi0JCQkJY3RybF9hZGRfcHJvY18xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciA9IGdldEZpbHRlckZvckRlc2NyaXB0b3JzKCk7Ci0JCQkJCQlwcm9jZXNzID0gZ2V0UHJvY2VzcygpOwotCQkJCQkJaWYgKGRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyICE9IG51bGwgJiYgcHJvY2VzcyAhPSBudWxsKSB7Ci0JCQkJCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gZ2V0RXhpc3RpbmdFbGVtZW50czEoKTsKLQkJCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZygKLQkJCQkJCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCQkJCS5nZXRTaGVsbCgpLAotCQkJCQkJCQkJZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIsIHByb2Nlc3MsCi0JCQkJCQkJCQlnZXREZXNjcmlwdG9yVGFiTmFtZSgpLCBleGlzdGluZ0VsZW1lbnRzKTsKLQotCQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCQlhZGRGcm9tUHJvY2Vzc0l0ZW1zMShmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJCXRhYmxlVmlld2VyMS5yZWZyZXNoKCk7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0pOwotCi0JCQkJY3RybF9yZW1vdmVfMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjEKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQkJCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCQkJcmVtb3ZlSXRlbXMxKHJtSXRlbXMpOwotCQkJCQkJCXRhYmxlVmlld2VyMS5yZWZyZXNoKCk7Ci0KLQkJCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCQkJdGFibGVWaWV3ZXIxLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJCQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCQljb3VudCsrOwotCi0JCS8qKgotCQkgKiBTZWNvbmQgc2V0IG9mIGxpc3RlbmVycwotCQkgKi8KLQkJaWYgKGNvdW50IDwgdGFibGVDb3VudCkgewotCQkJY3RybF90YWJsZV8yLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjIKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKSB7Ci0JCQkJCQlpZiAoY3RybF9yZW1vdmVfMiAhPSBudWxsKQotCQkJCQkJCWN0cmxfcmVtb3ZlXzIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQl0YWJsZVZpZXdlcjIKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjIKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkgewotCQkJCQkJCQlpZiAoY3RybF9yZW1vdmVfMiAhPSBudWxsKQotCQkJCQkJCQkJY3RybF9yZW1vdmVfMi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQkJCVN0cmluZyBkZXNjID0gKChNZXRob2RFbGVtZW50KSBzZWxlY3Rpb24KLQkJCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpCi0JCQkJCQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJCQkJZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoZGVzYyk7Ci0JCQkJCQkJfSBlbHNlIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJCQkJCQljdHJsX2JyaWVmX2Rlc2MKLQkJCQkJCQkJCQkuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb24gKyAiIC0gIiArIHNlbGVjdGlvbi5zaXplKCkpOyAvLyROT04tTkxTLTEkIAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCWlmIChjaGFuZ2VzQWxsb3dlZFtjb3VudF0pIHsKLQkJCQljdHJsX2FkZF8yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJRmlsdGVyIGZpbHRlciA9IGdldEZpbHRlcigpOwotCQkJCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50TGlzdChnZXRFeGlzdGluZ0VsZW1lbnRzMigpKTsKLQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIGVsZW1lbnQsIHRhYlN0cmluZywKLQkJCQkJCQkJZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJZmQuc2V0VGl0bGUodGFiU3RyaW5nKTsKLQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCWFkZEl0ZW1zMihmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJdGFibGVWaWV3ZXIyLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCQkJY3RybF9hZGRfcHJvY18yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciA9IGdldEZpbHRlckZvckRlc2NyaXB0b3JzKCk7Ci0JCQkJCQlwcm9jZXNzID0gZ2V0UHJvY2VzcygpOwotCQkJCQkJaWYgKGRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyICE9IG51bGwgJiYgcHJvY2VzcyAhPSBudWxsKSB7Ci0JCQkJCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gZ2V0RXhpc3RpbmdFbGVtZW50czIoKTsKLQkJCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZygKLQkJCQkJCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCQkJCS5nZXRTaGVsbCgpLAotCQkJCQkJCQkJZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIsIHByb2Nlc3MsCi0JCQkJCQkJCQlnZXREZXNjcmlwdG9yVGFiTmFtZSgpLCBleGlzdGluZ0VsZW1lbnRzKTsKLQotCQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCQlhZGRGcm9tUHJvY2Vzc0l0ZW1zMihmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJCXRhYmxlVmlld2VyMi5yZWZyZXNoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfcmVtb3ZlXzIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIyCi0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJCXJlbW92ZUl0ZW1zMihybUl0ZW1zKTsKLQkJCQkJCQl0YWJsZVZpZXdlcjIucmVmcmVzaCgpOwotCi0JCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJCXRhYmxlVmlld2VyMi5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQkJY291bnQrKzsKLQotCQkvKioKLQkJICogVGhpcmQgc2V0IG9mIGxpc3RlbmVycwotCQkgKi8KLQkJaWYgKGNvdW50IDwgdGFibGVDb3VudCkgewotCQkJY3RybF90YWJsZV8zLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjMKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0pOwotCi0JCQl0YWJsZVZpZXdlcjMKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjMKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCQkJU3RyaW5nIGRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIHNlbGVjdGlvbgotCQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSkKLQkJCQkJCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCQlkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChkZXNjKTsKLQkJCQkJCQl9IGVsc2UgaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJCQkJCWN0cmxfYnJpZWZfZGVzYwotCQkJCQkJCQkJCS5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19NdWx0aXBsZVNlbGVjdGlvbiArICIgLSAiICsgc2VsZWN0aW9uLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9KTsKLQotCQkJaWYgKChuZXcgQm9vbGVhbihjaGFuZ2VzQWxsb3dlZFtjb3VudF0pKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCWN0cmxfYWRkXzMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCUlGaWx0ZXIgZmlsdGVyID0gZ2V0RmlsdGVyKCk7Ci0JCQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBQcm9jZXNzVXRpbAotCQkJCQkJCQkuZ2V0QXNzb2NpYXRlZEVsZW1lbnRMaXN0KGdldEV4aXN0aW5nRWxlbWVudHMzKCkpOwotCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJLmdldFNoZWxsKCksIGZpbHRlciwgZWxlbWVudCwgdGFiU3RyaW5nLAotCQkJCQkJCQlleGlzdGluZ0VsZW1lbnRzKTsKLQotCQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCQlmZC5zZXRUaXRsZSh0YWJTdHJpbmcpOwotCQkJCQkJZmQub3BlbigpOwotCQkJCQkJYWRkSXRlbXMzKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCQl0YWJsZVZpZXdlcjMucmVmcmVzaCgpOwotCi0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfYWRkX3Byb2NfMy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIgPSBnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpOwotCQkJCQkJcHJvY2VzcyA9IGdldFByb2Nlc3MoKTsKLQkJCQkJCWlmIChkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciAhPSBudWxsICYmIHByb2Nlc3MgIT0gbnVsbCkgewotCQkJCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IGdldEV4aXN0aW5nRWxlbWVudHMzKCk7Ci0JCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coCi0JCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0U2hlbGwoKSwKLQkJCQkJCQkJCWRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyLCBwcm9jZXNzLAotCQkJCQkJCQkJZ2V0RGVzY3JpcHRvclRhYk5hbWUoKSwgZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQkJYWRkRnJvbVByb2Nlc3NJdGVtczMoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJCQl0YWJsZVZpZXdlcjMucmVmcmVzaCgpOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfcmVtb3ZlXzMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIzCi0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJCXJlbW92ZUl0ZW1zMyhybUl0ZW1zKTsKLQkJCQkJCQl0YWJsZVZpZXdlcjMucmVmcmVzaCgpOwotCi0JCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJCXRhYmxlVmlld2VyMy5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQljdHJsX3JlbW92ZV8zLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQkJY291bnQrKzsKLQotCQkvKioKLQkJICogRm91dGggc2V0IG9mIGxpc3RlbmVycwotCQkgKi8KLQkJaWYgKGNvdW50IDwgdGFibGVDb3VudCkgewotCQkJY3RybF90YWJsZV80LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjQKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJY3RybF9yZW1vdmVfNC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0pOwotCi0JCQl0YWJsZVZpZXdlcjQKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjQKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCQkJY3RybF9yZW1vdmVfNC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCQkJU3RyaW5nIGRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIHNlbGVjdGlvbgotCQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSkKLQkJCQkJCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCQlkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChkZXNjKTsKLQkJCQkJCQl9IGVsc2UgaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJCQkJCWN0cmxfYnJpZWZfZGVzYwotCQkJCQkJCQkJCS5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19NdWx0aXBsZVNlbGVjdGlvbiArICIgLSAiICsgc2VsZWN0aW9uLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9KTsKLQotCQkJaWYgKChuZXcgQm9vbGVhbihjaGFuZ2VzQWxsb3dlZFtjb3VudF0pKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCWN0cmxfYWRkXzQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCUlGaWx0ZXIgZmlsdGVyID0gZ2V0RmlsdGVyKCk7Ci0JCQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBQcm9jZXNzVXRpbAotCQkJCQkJCQkuZ2V0QXNzb2NpYXRlZEVsZW1lbnRMaXN0KGdldEV4aXN0aW5nRWxlbWVudHM0KCkpOwotCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJLmdldFNoZWxsKCksIGZpbHRlciwgZWxlbWVudCwgdGFiU3RyaW5nLAotCQkJCQkJCQlleGlzdGluZ0VsZW1lbnRzKTsKLQotCQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCQlmZC5zZXRUaXRsZSh0YWJTdHJpbmcpOwotCQkJCQkJZmQub3BlbigpOwotCQkJCQkJYWRkSXRlbXM0KGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCQl0YWJsZVZpZXdlcjQucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX2FkZF9wcm9jXzQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCWRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyID0gZ2V0RmlsdGVyRm9yRGVzY3JpcHRvcnMoKTsKLQkJCQkJCXByb2Nlc3MgPSBnZXRQcm9jZXNzKCk7Ci0JCQkJCQlpZiAoZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIgIT0gbnVsbCAmJiBwcm9jZXNzICE9IG51bGwpIHsKLQkJCQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBnZXRFeGlzdGluZ0VsZW1lbnRzNCgpOwotCQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKAotCQkJCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJCQkJLmdldFNoZWxsKCksCi0JCQkJCQkJCQlkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciwgcHJvY2VzcywKLQkJCQkJCQkJCWdldERlc2NyaXB0b3JUYWJOYW1lKCksIGV4aXN0aW5nRWxlbWVudHMpOwotCi0JCQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCQkJZmQub3BlbigpOwotCQkJCQkJCWFkZEZyb21Qcm9jZXNzSXRlbXM0KGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCQkJdGFibGVWaWV3ZXI0LnJlZnJlc2goKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCi0JCQkJY3RybF9yZW1vdmVfNC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjQKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQkJCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCQkJcmVtb3ZlSXRlbXM0KHJtSXRlbXMpOwotCQkJCQkJCXRhYmxlVmlld2VyNC5yZWZyZXNoKCk7Ci0KLQkJCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCQkJdGFibGVWaWV3ZXI0LnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJCQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zMShMaXN0IGxpc3QpIHsKLQl9OwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMyKExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtczMoTGlzdCBsaXN0KSB7Ci0JfTsKLQotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zNChMaXN0IGxpc3QpIHsKLQl9OwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczEoTGlzdCBsaXN0KSB7Ci0JfTsKLQotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXMyKExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zMyhMaXN0IGxpc3QpIHsKLQl9OwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczQoTGlzdCBsaXN0KSB7Ci0JfTsKLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMShMaXN0IGxpc3QpIHsKLQl9OwotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXMyKExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtczMoTGlzdCBsaXN0KSB7Ci0JfTsKLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zNChMaXN0IGxpc3QpIHsKLQl9OwotCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czEoKSB7Ci0JCXJldHVybiBudWxsOwotCX07Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzMigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfTsKLQotCXByb3RlY3RlZCBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9OwotCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czQoKSB7Ci0JCXJldHVybiBudWxsOwotCX07Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZW1vdmVEZXNjcmlwdG9yQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTIzZGI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZW1vdmVEZXNjcmlwdG9yQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlJlZmVyZW5jZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5Qcm9jZXNzRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBDb21tYW5kIHRvIHJlbW92ZSBkZXNjcmlwdG9ycwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBMaXN0IGVsZW1lbnRzOwotCi0JcHJpdmF0ZSBEZXNjcmlwdG9yIGRlc2M7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIENvbW1hbmQgZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kID0gbnVsbDsKLQotCXByaXZhdGUgaW50IGZlYXR1cmVJRDsKLQotCXByaXZhdGUgTGlzdCByZWZlcmVuY2VzOwotCi0JLyoqCi0JICogUmVtb3ZlIHJlbGF0aW9uc2hpcHMKLQkgKi8KLQlwdWJsaWMgUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQoRGVzY3JpcHRvciBkZXNjLCBMaXN0IGVsZW1lbnRzLCBpbnQgZmVhdHVyZUlEKSB7Ci0KLQkJc3VwZXIoKTsKLQotCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7Ci0JCXRoaXMuZGVzYyA9IGRlc2M7Ci0JCXRoaXMuZmVhdHVyZUlEID0gZmVhdHVyZUlEOwotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCi0JCUxpc3Qgbm90VXNlZFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCURlc2NyaXB0b3IgbyA9IChEZXNjcmlwdG9yKSBlbGVtZW50cy5nZXQoaSk7Ci0KLQkJCWJvb2xlYW4gY2hlY2tSZWY7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikKLQkJCXsKLQkJCQljaGVja1JlZiA9IFByb2Nlc3NVdGlsLmNoZWNrV29ya1Byb2R1Y3REZXNjcmlwdG9yUmVmZXJlbmNlcyhDb2xsZWN0aW9ucwotCQkJCS5zaW5nbGV0b24oZGVzYyksIChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG8sIHRydWUsIGZlYXR1cmVJRCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJY2hlY2tSZWYgPSBQcm9jZXNzVXRpbC5jaGVja0Rlc2NyaXB0b3JSZWZlcmVuY2VzKGRlc2MsIG8pOwotCQkJCi0JCQlpZiAoIWNoZWNrUmVmKSB7Ci0JCQkJQWN0aXZpdHkgYWN0ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eShkZXNjKTsKLQkJCQlpZiAoYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuY29udGFpbnMobykpCi0JCQkJCW5vdFVzZWRSZWZlcmVuY2VzLmFkZChvKTsKLQkJCX0KLQkJfQotCQlpZiAoIShub3RVc2VkUmVmZXJlbmNlcy5pc0VtcHR5KCkpKSB7Ci0JCQlPYmplY3RbXSByZWZUb0JlRGVsZXRlZCA9IFJlZmVyZW5jZVNlbGVjdGlvbgotCQkJCQkuZ2V0UmVmZXJlbmNlcyhub3RVc2VkUmVmZXJlbmNlcyk7Ci0JCQlyZWZlcmVuY2VzID0gQXJyYXlzLmFzTGlzdChyZWZUb0JlRGVsZXRlZCk7Ci0JCX0KLQkJCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJaWYgKGRlc2MgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikKLQkJewotCQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0vLwkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5zZXRQZXJmb3JtZWRQcmltYXJpbHlCeShudWxsKTsKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpLnJlbW92ZUFsbCgKLQkJCQkJCWVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5yZW1vdmVBbGwoCi0JCQkJCQllbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWToKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRBc3Npc3RlZEJ5KCkucmVtb3ZlQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRNYW5kYXRvcnlJbnB1dCgpLnJlbW92ZUFsbChlbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRFeHRlcm5hbElucHV0KCkucmVtb3ZlQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldE9wdGlvbmFsSW5wdXQoKS5yZW1vdmVBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldE91dHB1dCgpLnJlbW92ZUFsbChlbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZGVzYyBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKQotCQl7Ci0JCQlzd2l0Y2ggKGZlYXR1cmVJRCl7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJKChSb2xlRGVzY3JpcHRvcikgZGVzYykuZ2V0UmVzcG9uc2libGVGb3IoKS5yZW1vdmVBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJlZmVyZW5jZXMgIT0gbnVsbCAmJiAhcmVmZXJlbmNlcy5pc0VtcHR5KCkpIHsKLQkJCWlmIChkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgPT0gbnVsbCkgewotCQkJCWRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCA9IG5ldyBEZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQoCi0JCQkJCQlyZWZlcmVuY2VzLCBmYWxzZSwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCkgewotCi0JCQkJCXByb3RlY3RlZCBDb21tYW5kIGRlbGV0ZShMaXN0IGVsZW1lbnRzKSB7Ci0JCQkJCQlyZXR1cm4gUHJvY2Vzc0RlbGV0ZUFjdGlvbi5kZWxldGUoZWxlbWVudHMpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJCWRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQotCQlpZiAoIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJCi0JCQlpZiAoZGVzYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGRlc2MuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQkJLy8gYmFzaWNhbGx5IHJlbW92ZSBmcm9tIGNvbmZpZ3VyYXRpb24gaWYgYW55dGhpbmcgd2FzIGFkZGVkCi0KLQkJaWYgKGRlc2MgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikKLQkJewotCQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0vLwkJCQlPYmplY3QgbyA9IGVsZW1lbnRzLmdldCgwKTsKLS8vCQkJCWlmIChvIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpCi0vLwkJCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKFJvbGVEZXNjcmlwdG9yKW8pOwotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkuYWRkQWxsKAotCQkJCQkJZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmFkZEFsbCgKLQkJCQkJCWVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldEFzc2lzdGVkQnkoKS5hZGRBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldEV4dGVybmFsSW5wdXQoKS5hZGRBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQ6Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0T3B0aW9uYWxJbnB1dCgpLmFkZEFsbChlbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0T3V0cHV0KCkuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChkZXNjIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpCi0JCXsKLQkJCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJKChSb2xlRGVzY3JpcHRvcikgZGVzYykuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGRBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJlZmVyZW5jZXMgIT0gbnVsbCAmJiAhcmVmZXJlbmNlcy5pc0VtcHR5KCkpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCAhPSBudWxsKQotCQkJCQlkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQudW5kbygpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQotCQkJfQotCQl9Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JewotCQlpZiAoZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kICE9IG51bGwpCi0JCQlkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuZGlzcG9zZSgpOwotCQlpZihyZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCXJlZmVyZW5jZXMuY2xlYXIoKTsKLQkJfQotCQlpZihtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5jbGVhcigpOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3ByZXBhcmUoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRiMDhjYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uVGl0bGU9R2VuZXJhbCBJbmZvcm1hdGlvbgotUHJvY2Vzc19Eb2N1bWVudEluZm9ybWF0aW9uVGl0bGU9RG9jdW1lbnRhdGlvbiBJbmZvcm1hdGlvbgotQWN0aXZpdHlfZ3VpZGFuY2VJbmZvcm1hdGlvblRpdGxlPUd1aWRhbmNlCi1CcmVha2Rvd25FbGVtZW50X29wdGlvbkluZm9ybWF0aW9uVGl0bGU9QnJlYWtkb3duIE9wdGlvbnMKLVRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvblRpdGxlPVN0ZXBzCi0KLVRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVNwZWNpZnkgdGhlIHN0ZXBzIHRvIHBlcmZvcm0gdGhpcyB0YXNrIGRlc2NyaXB0b3IuCi0KLVByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgezB9LgotUHJvY2Vzc19kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBkb2N1bWVudGF0aW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgezB9LgotCi1EZXNjcmlwdG9yX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRlc2NyaXB0b3IuCi1EZXNjcmlwdG9yX2RldGFpbEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRlc2NyaXB0b3IuCi1NaWxlc3RvbmVfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbWlsZXN0b25lLgotTWlsZXN0b25lX2RldGFpbEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG1pbGVzdG9uZS4KLQotQnJlYWtkb3duRWxlbWVudF9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBicmVha2Rvd24gZWxlbWVudC4KLVdvcmtCcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQuCi1EZXNjcmlwdG9yX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0b249UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGVzY3JpcHRvci4KLUFjdGl2aXR5X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGFjdGl2aXR5LgotCi1CcmVha2Rvd25FbGVtZW50X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGRvY3VtZW50YXRpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBicmVha2Rvd24gZWxlbWVudC4KLUFjdGl2aXR5X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGRvY3VtZW50YXRpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhY3Rpdml0eS4KLURlc2NyaXB0b3JfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZG9jdW1lbnRhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRlc2NyaXB0b3IuCi1Qcm9jZXNzX05vbmU9PDwgTk9ORSA+PgotUHJvY2Vzc19uYW1lPU5hbWU6Ci1Qcm9jZXNzX1ByZXNlbnRhdGlvbk5hbWU9UHJlc2VudGF0aW9uIG5hbWU6Ci1Qcm9jZXNzX2JyaWVmRGVzY3JpcHRpb249QnJpZWYgZGVzY3JpcHRpb246Ci1Qcm9jZXNzX21haW5EZXNjcmlwdGlvbj0gTWFpbiBkZXNjcmlwdGlvbjoKLVByb2Nlc3NfcHVycG9zZT1QdXJwb3NlOgotUHJvY2Vzc19wcmVmaXg9UHJlZml4OgotCi1CcmVha2Rvd25FbGVtZW50X1R5cGVfTmFtZT1CcmVha2Rvd24gRWxlbWVudAotCi1Qcm9jZXNzX1R5cGVfVGFzaz1NZXRob2QgdGFzazoKLVByb2Nlc3NfVHlwZV9Sb2xlPU1ldGhvZCByb2xlOgotUHJvY2Vzc19UeXBlX1dvcmtQcm9kdWN0PU1ldGhvZCB3b3JrIHByb2R1Y3Q6Ci0KLVdvcmtQcm9kdWN0X1R5cGU9V29yayBQcm9kdWN0IFR5cGU6Ci0KLUFjdGl2aXR5X01vZGVsSW5mbz1Nb2RlbCBpbmZvcm1hdGlvbjoKLUFjdGl2aXR5X1R5cGU9QWN0aXZpdHkgVHlwZToKLUFjdGl2aXR5X3ByZXNlbnRhdGlvbk5hbWU9UHJlc2VudGF0aW9uIG5hbWU6Ci1BY3Rpdml0eV9hbHRlcm5hdGl2ZXM9QWx0ZXJuYXRpdmVzOgotQWN0aXZpdHlfaG93VG9TdGFmZj1Ib3cgdG8gc3RhZmY6Ci1CcmVha2Rvd25FbGVtZW50X2tleUNvbnNpZGVyYXRpb25zPUtleSBjb25zaWRlcmF0aW9uczoKLVByb2Nlc3NfdXNhZ2VHdWlkYW5jZT1Vc2FnZSBndWlkYW5jZToKLQotQWN0aXZpdHlfUm9hZG1hcFRpdGxlPVJvYWRtYXBzCi1BY3Rpdml0eV9Sb2FkbWFwRGVzY3JpcHRpb249UHJvdmlkZSBsaW5rcyB0byBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRoZSBmb3JtIG9mIHJvYWRtYXBzLgotQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlVGl0bGU9R2VuZXJhbCBHdWlkYW5jZQotQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlRGVzY3JpcHRpb249UHJvdmlkZSBsaW5rcyB0byBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRoZSBmb3JtIG9mIGd1aWRhbmNlLgotQWN0aXZpdHlfQ29tbXVuaWNhdGlvbk1hdGVyaWFsVGl0bGU9Q29tbXVuaWNhdGlvbiBNYXRlcmlhbHMKLUFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uPVByb3ZpZGUgbGlua3MgdG8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybSBvZiBjb21tdW5pY2F0aW9uIG1hdGVyaWFscy4KLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsVGl0bGU9RWR1Y2F0aW9uIE1hdGVyaWFscwotQWN0aXZpdHlfRWR1Y2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbj1Qcm92aWRlIGxpbmtzIHRvIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm0gb2YgZWR1Y2F0aW9uIG1hdGVyaWFscy4KLQotQWN0aXZpdHlfU2VsZWN0ZWRfUm9hZG1hcD1Sb2FkbWFwczoKLUFjdGl2aXR5X1NlbGVjdGVkX0dlbmVyYWxHdWlkYW5jZT1HdWlkYW5jZToKLUFjdGl2aXR5X1NlbGVjdGVkX0NvbW11bmljYXRpb25NYXRlcmlhbD1Db21tdW5pY2F0aW9uIE1hdGVyaWFsczoKLUFjdGl2aXR5X1NlbGVjdGVkX0VkdWNhdGlvbk1hdGVyaWFsPUVkdWNhdGlvbiBNYXRlcmlhbHM6Ci0KLUFjdGl2aXR5X0RpYWdyYW1UaXRsZT1EaWFncmFtCi1BY3Rpdml0eV9EaWFncmFtRGVzY3JpcHRpb24gPSBQcm92aWRlIGRpYWdyYW0gaW1hZ2VzIGZvciB0aGlzIHswfS4KLUFjdGl2aXR5X0FESW1hZ2U9QWN0aXZpdHkgRGlhZ3JhbQotQWN0aXZpdHlfQURESW1hZ2U9QWN0aXZpdHkgRGV0YWlsIERpYWdyYW0KLUFjdGl2aXR5X1dQREltYWdlPVdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0KLUFjdGl2aXR5X1VzZUFESW1hZ2U9VXNlIEFjdGl2aXR5IERpYWdyYW0gZm9yIHB1Ymxpc2hpbmcKLUFjdGl2aXR5X1VzZUFEREltYWdlPVVzZSBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBmb3IgcHVibGlzaGluZwotQWN0aXZpdHlfVXNlV1BESW1hZ2U9VXNlIFdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0gZm9yIHB1Ymxpc2hpbmcKLUFjdGl2aXR5X0Fzc2lnbj1Bc3NpZ24uLi4KLQotVGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRfU3RlcHM9U3RlcHM6Ci1UYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nVGl0bGU9U3RlcHMKLVRhc2tEZXNjcmlwdG9yX1N0ZXBEaWFsb2dNZXNzYWdlPVNlbGVjdCBzdGVwcwotCi1BY3Rpdml0eV9Xb3JrUm9sbHVwPVdvcmsgUm9sbHVwCi1BY3Rpdml0eV9UZWFtUm9sbHVwPVRlYW0gUm9sbHVwCi1BY3Rpdml0eV9Xb3JrUHJvZHVjdHNSb2xsdXA9V29yayBQcm9kdWN0cyBSb2xsdXAKLUFjdGl2aXR5X1dvcmtSb2xsdXBEZXNjcmlwdGlvbj1SZXZpZXcgdGhlIHdvcmsgcm9sbC11cCBmb3IgdGhpcyBhY3Rpdml0eSBpbiB0aGlzIHNlY3Rpb24uCi1BY3Rpdml0eV9UZWFtUm9sbHVwRGVzY3JpcHRpb249UmV2aWV3IHRoZSB0ZWFtIHJvbGwtdXAgZm9yIHRoaXMgYWN0aXZpdHkgaW4gdGhpcyBzZWN0aW9uLgotQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwRGVzY3JpcHRpb249UmV2aWV3IHRoZSB3b3JrIHByb2R1Y3Qgcm9sbC11cCBmb3IgdGhpcyBhY3Rpdml0eSBpbiB0aGlzIHNlY3Rpb24uCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9NdWx0aXBsZU9jdXJyYW5jZT1NdWx0aXBsZSBPY2N1cnJlbmNlcwotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fT3B0aW9uYWw9T3B0aW9uYWwKLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1BsYW5uZWQ9UGxhbm5lZAotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3VwcmVzc2VkPVN1cHByZXNzZWQKLQotV29ya0JyZWFrZG93bkVsZW1lbnRfRXZlbnREcml2ZW49RXZlbnQgRHJpdmVuCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9PbmdvaW5nPU9uZ29pbmcKLVdvcmtCcmVha2Rvd25FbGVtZW50X1JlcGVhdGFibGU9UmVwZWF0YWJsZQotV29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3JzPVByZWRlY2Vzc29yczoKLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3k9RGVwZW5kZW5jeToKLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0lEX1RFWFQ9SW5kZXgKLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX1BSRVNFTlRBVElPTl9OQU1FX1RFWFQ9UHJlc2VudGF0aW9uIE5hbWUKLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0RFUEVOREVOQ1lfVEVYVD1EZXBlbmRlbmN5Ci1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0FkZD1BZGQKLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfRWRpdD1FZGl0Ci1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X1JlbW92ZT1SZW1vdmUKLQotV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fU1RBUlQ9RmluaXNoIFRvIFN0YXJ0Ci1Xb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19GSU5JU0g9RmluaXNoIFRvIEZpbmlzaAotV29ya09yZGVyVHlwZV9TVEFSVF9UT19GSU5JU0g9U3RhcnQgVG8gRmluaXNoCi1Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX1NUQVJUPVN0YXJ0IFRvIFN0YXJ0Ci0KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N5bmNocm9uaXplZD1TeW5jaHJvbml6ZWQgd2l0aCBzb3VyY2UKLQotRGVzY3JpcHRvcl9SZWZpbmVkRGVzY3JpcHRpb249UmVmaW5lZCBkZXNjcmlwdGlvbjoKLQotVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvblRpdGxlPVJvbGVzCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uRGVzY3JpcHRpb249QXNzaWduIHRoZSByb2xlIGRlc2NyaXB0b3JzIHRvIHBlcmZvcm0gdGhpcyB0YXNrIGRlc2NyaXB0b3IuCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTE9UHJpbWFyeSBQZXJmb3JtZXJzOgotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUyPUFkZGl0aW9uYWwgUGVyZm9ybWVyczoKLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMz1Bc3Npc3RlZCBCeToKLQotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25UaXRsZT1Xb3JrIFByb2R1Y3RzCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvbkRlc2NyaXB0aW9uPVNwZWNpZnkgdGhlIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIGZvciB0aGlzIHRhc2sgZGVzY3JpcHRvci4KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTE9TWFuZGF0b3J5IElucHV0OgotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMj1PcHRpb25hbCBJbnB1dDoKLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTM9RXh0ZXJuYWwgSW5wdXQ6Ci1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGU0PU91dHB1dDoKLQotUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvblRpdGxlPVRhc2tzCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19TZWN0aW9uRGVzY3JpcHRpb249VGhpcyByb2xlIGRlc2NyaXB0b3IgaXMgcGVyZm9ybWVyIG9mIGZvbGxvd2luZyB0YXNrIGRlc2NyaXB0b3JzLgotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUxPVByaW1hcnkgUGVyZm9ybWVyOgotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUyPUFkZGl0aW9uYWwgUGVyZm9ybWVyczoKLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMz1Bc3Npc3RlZCBCeToKLQotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25UaXRsZT1Xb3JrIFByb2R1Y3RzCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvbkRlc2NyaXB0aW9uPVRoaXMgcm9sZSBkZXNjcmlwdG9yIGlzIHJlc3BvbnNpYmxlIGZvciBhbmQgbW9kaWZpZXMgZm9sbG93aW5nIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycy4KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTE9UmVzcG9uc2libGUgZm9yOgotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMj1Nb2RpZmllczoKLQotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZT1Sb2xlcwotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25EZXNjcmlwdGlvbj1UaGUgZm9sbG93aW5nIHJvbGUgZGVzY3JpcHRvcnMgYXJlIHJlc3BvbnNpYmxlIGZvciBhbmQgbW9kaWZpZXMgdGhpcyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvci4KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19UYWJsZTE9UmVzcG9uc2libGUgZm9yOgotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMj1Nb2RpZmllZCBieToKLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9UeXBlPVR5cGU6Ci1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlPUFjdGl2aXR5IEVudHJ5IFN0YXRlOgotV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlPUFjdGl2aXR5IEV4aXQgU3RhdGU6Ci0KLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvblRpdGxlPURlbGl2ZXJhYmxlIFBhcnRzCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25EZXNjcmlwdGlvbj1UaGUgZGVsaXZlcmFibGUgaGFzIGZvbGxvd2luZyBkZWxpdmVyYWJsZSBwYXJ0cy4KLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfVGFibGUxPURlbGl2ZXJhYmxlIFBhcnRzCi0KLVJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvblRpdGxlPVRlYW1zCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25EZXNjcmlwdGlvbj1UaGlzIHJvbGUgZGVzY3JpcHRvciByZWZlcnMgdG8gZm9sbG93aW5nIHRlYW1zLgotUm9sZURlc2NyaXB0b3JfVGVhbV9UYWJsZTE9VGVhbXM6Ci0KLUNvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uVGl0bGU9Um9sZXMKLUNvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb249VGhpcyBjb21wb3NpdGUgcm9sZSBoYXMgZm9sbG93aW5nIGFnZ3JlZ2F0ZWQgcm9sZXMuCi1Db21wb3NpdGVSb2xlX1JvbGVfVGFibGUxPUFnZ3JlZ2F0ZWQgUm9sZXM6Ci0KLVRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvblRpdGxlPVJvbGVzCi1UZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbj1BZGQgb3IgcmVtb3ZlIHJvbGVzIHRvL2Zyb20gdGhlIHRlYW0gcHJvZmlsZS4KLVRlYW1Qcm9maWxlX1JvbGVfVGFibGUxPVJvbGVzOgotCi1Qcm9jZXNzX1JpY2hUZXh0X0NvbGxhcHNlSW1hZ2U9Y29sbGFwc2VkLmdpZgotUHJvY2Vzc19SaWNoVGV4dF9FeHBhbmRJbWFnZT1leHBhbmRlZC5naWYKLVByb2Nlc3NfQWRkPUFkZC4uLgotUHJvY2Vzc19BZGRGcm9tUHJvY2Vzcz1BZGQgZnJvbSBQcm9jZXNzLi4uCi1Qcm9jZXNzX1JlbmFtZV9NZXNzYWdlPVlvdSBhcmUgYWJvdXQgdG8gY2hhbmdlIHRoZSBuYW1lIG9mIHRoaXMgcHJvY2Vzcy4gVGhpcyB3aWxsIHNhdmUgdGhpcyBlZGl0b3IgYW5kIHJlbmFtZSB0aGUgcHJvY2VzcyBmb2xkZXIgdG8gdGhlIG5ldyBuYW1lLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLVByb2Nlc3NfUmVtb3ZlPVJlbW92ZQotUHJvY2Vzc19VcD1VcAotUHJvY2Vzc19Eb3duPURvd24KLVByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb249TXVsdGlwbGUgU2VsZWN0aW9uCi1Qcm9jZXNzX0J1dHRvbl9MaW5rTWV0aG9kRWxlbWVudD1MaW5rIE1ldGhvZCBFbGVtZW50Li4uCi1Qcm9jZXNzX0J1dHRvbl9DbGVhck1ldGhvZEVsZW1lbnQ9Q2xlYXIKLQotIyMgRXJyb3IvV2FybmluZwotUHJvY2Vzc19JbnZhbGlkTmFtZVRpdGxlPUludmFsaWQgbmFtZQotUHJvY2Vzc19JbnZhbGlkTmFtZT1JVVBBMDA4MUU6IFRoZSBuYW1lIGNhbm5vdCBiZSBlbXB0eS4gUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBuYW1lLgotUHJvY2Vzc19SZW5hbWVfVGl0bGU9UmVuYW1lCi1Qcm9jZXNzX0ludmFsaWRQcmVzZW50YXRpb25OYW1lPUlVUEEwMDgyRTogVGhlIHByZXNlbnRhdGlvbiBuYW1lIGNhbm5vdCBiZSBlbXB0eS4gUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBwcmVzZW50YXRpb24gbmFtZS4KLVByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZT1MaW5rIE1ldGhvZCBFbGVtZW50Ci1Qcm9jZXNzX0ludmFsaWRMaW5rTWV0aG9kRWxlbWVudD1JVVBBMDA4M0U6IENhbm5vdCBsaW5rIHRvICcnezB9Jycgc2luY2UgdGhpcyBNZXRob2RFbGVtZW50IGlzIGFscmVhZHkgYmVpbmcgdXNlZCBmb3IgYW5vdGhlciBkZXNjcmlwdG9yIHVuZGVyIHRoZSBzYW1lIHBhcmVudC4KLVByb2Nlc3NfQXNzaWdubWVudEluZm9UaXRsZT1JbmZvcm1hdGlvbgotUHJvY2Vzc19UZWFtQXNzaWduRXJyb3I9SVVQQTAwODRFOiBDYW5ub3QgYWRkICcnezB9JycgdG8gdGhlIHRlYW0gJyd7MX0nJyBcblxuUm9sZSBkZXNjcmlwdG9yKHMpIG11c3QgaGF2ZSBtZXRob2QgZWxlbWVudCByb2xlIGFzc29jaWF0ZWQgd2l0aCBpdCB0byBiZSBhc3NpZ25lZCB0byB0ZWFtLlxuXG4gRml4IHRoZSBhc3NvY2lhdGlvbiBmaXJzdCBhbmQgdHJ5IGFnYWluLgotUHJvY2Vzc19UZWFtRGlhbG9nTWVzc2FnZT1TZWxlY3QgdGVhbXMKLVByb2Nlc3NfVGVhbURpYWxvZ1RpdGxlPVRlYW1zCi0KLVByb2Nlc3NfRGVsaXZlcmFibGVBc3NpZ25FcnJvcj1JVVBBMDA4NUU6IENhbm5vdCBhZGQgJyd7MH0nJyB0byB0aGUgZGVsaXZlcmFibGUgJyd7MX0nJyBzaW5jZSBpdCBkb2VzIG5vdCBoYXZlIG1ldGhvZCBlbGVtZW50IHdvcmtwcm9kdWN0IGFzc29jaWF0ZWQgd2l0aCBpdC4KLVByb2Nlc3NfQ29tcG9zaXRlUm9sZUFzc2lnbkVycm9yPUlVUEEwMDg2RTogQ2Fubm90IGFkZCAgJyd7MH0nJyB0byB0aGUgQ29tcG9zaXRlIHJvbGUgJyd7MX0nJyBzaW5jZSBpdCBkb2VzIG5vdCBoYXZlIG1ldGhvZCBlbGVtZW50IHJvbGUgYXNzb2NpYXRlZCB3aXRoIGl0LgotUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJNZXNzYWdlPUlVUEEwMDg3VzogUGxlYXNlIGVudGVyIHZhbGlkIG51bWJlciBmb3IgcHJlZGVjZXNzb3JzLgotUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJUaXRsZT1JbnZhbGlkIFByZWRlY2Vzc29yIElkCi0KLVByb2Nlc3NfTm9JdGVtcz1ObyBpdGVtcyBzZWxlY3RlZAotUHJvY2Vzc19JdGVtc1NlbGVjdGVkPXswfSBpdGVtcyBzZWxlY3RlZAotUHJvY2Vzc19Ob1Byb3BlcnRpZXNBdmFpbGFibGU9Tm8gUHJvcGVydGllcyBhdmFpbGFibGUKLQotUHJlZGVjZXNzb3JEaWFsb2dfVGl0bGU9UHJlZGVjZXNzb3IgRGVwZW5kZW5jeQotUHJlZGVjZXNzb3JEaWFsb2dfSGVhZGVyTWVzc2FnZT1FbnRlciBkZXBlbmRlbmN5IHR5cGUgZm9yIHByZWRlY2Vzc29yOgotUHJlZGVjZXNzb3JEaWFsb2dfSW5kZXg9SW5kZXg6Ci1QcmVkZWNlc3NvckRpYWxvZ19QcmVzZW50YXRpb25OYW1lPVByZXNlbnRhdGlvbiBOYW1lOgotUHJlZGVjZXNzb3JEaWFsb2dfRGVwZW5kZW5jeT1EZXBlbmRlbmN5OgotUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvckRpYWxvZ1RpdGxlPVByZWRlY2Vzc29yCi1QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yTWVzc2FnZT1JVVBBMDA4OEU6IFByZWRlY2Vzc29yIHdpdGggdGhhdCBJZCBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyB3b3JrIGJyZWFrZG93biBlbGVtZW50LgotCi1Qcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfdGV4dEVkaXRDZWxsX3Byb2JsZW1fbXNnPUlVUEEwMDkwRTogVGhlcmUgd2FzIGFuIGVycm9yIGVkaXRpbmcgYSBwcm9wZXJ0eS4KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc19jZWxsRWRpdG9yX2ludmFsaWRQcmVkY2Vzc29yX3Byb2JsZW1fbXNnPUlVUEEwMDg5VzogSW52YWxpZCBwcmVkZWNlc3NvciBsaXN0CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUm9sZURlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JvbGVEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQxNmM3ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUm9sZURlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5JdGVtc0ZpbHRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc1JvbGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5MaW5rTWV0aG9kRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotLyoqCi0gKiBUaGUgZ2VuZXJhbCB0YWIgc2VjdGlvbiBmb3IgUm9sZSBEZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24gZXh0ZW5kcyBEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24gewotCXByb3RlY3RlZCBSb2xlRGVzY3JpcHRvciBlbGVtZW50OwotCi0JcHJpdmF0ZSBMYWJlbCBjdHJsX21ldGhvZF9lbGVtZW50X2xhYmVsOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfbWV0aG9kX2VsZW1lbnQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBsaW5rQnV0dG9uOwotCQotCXByaXZhdGUgQnV0dG9uIGNsZWFyQnV0dG9uOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCS8vIGdldCBSb2xlRGVzY3JpcHRvciBvYmplY3QKLQkJZWxlbWVudCA9IChSb2xlRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jY3JlYXRlR2VuZXJhbFNlY3Rpb24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdlbmVyYWxTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJc3VwZXIuY3JlYXRlR2VuZXJhbFNlY3Rpb24oY29tcG9zaXRlKTsKLQotCQkvLyBtZXRob2QgZWxlbWVudAotCQljdHJsX21ldGhvZF9lbGVtZW50X2xhYmVsID0gRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsCi0JCQkJZ2VuZXJhbENvbXBvc2l0ZSwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1R5cGVfUm9sZSk7IAotCi0JCWN0cmxfbWV0aG9kX2VsZW1lbnQgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCVNXVC5ERUZBVUxULCAxKTsKLQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRUZXh0KGdldE1ldGhvZEVsZW1lbnROYW1lKGVsZW1lbnQpKTsKLQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LAotCQkJCWdlbmVyYWxDb21wb3NpdGUsIFNXVC5OT05FLCAyLCB0cnVlKTsKLQkJbGlua0J1dHRvbiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCwgMSk7Ci0JCWxpbmtCdXR0b24KLQkJCQkuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQnV0dG9uX0xpbmtNZXRob2RFbGVtZW50KTsgCi0KLQkJY2xlYXJCdXR0b24gPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gsIDEpOwotCQljbGVhckJ1dHRvbgotCQkJCS5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19CdXR0b25fQ2xlYXJNZXRob2RFbGVtZW50KTsgCi0KLQkJLy8gc2hvdy9oaWRlIG1ldGhvZCByb2xlCi0JCXRvZ2dsZU1ldGhvZFJvbGUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdG9nZ2xlTWV0aG9kUm9sZSgpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQljdHJsX21ldGhvZF9lbGVtZW50X2xhYmVsLnNldFZpc2libGUoZmFsc2UpOwotCQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWxpbmtCdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQljbGVhckJ1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWN0cmxfbWV0aG9kX2VsZW1lbnRfbGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWxpbmtCdXR0b24uc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWNsZWFyQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQotCQlsaW5rQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IFByb2Nlc3NSb2xlRmlsdGVyKAotCQkJCQkJZ2V0Q29uZmlndXJhdGlvbigpLCBudWxsLCBGaWx0ZXJDb25zdGFudHMuUk9MRVMpOwotCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpZiAoZWxlbWVudC5nZXRSb2xlKCkgIT0gbnVsbCkgewotCQkJCQlleGlzdGluZ0VsZW1lbnRzLmFkZChlbGVtZW50LmdldFJvbGUoKSk7Ci0JCQkJfQotCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQkJZmlsdGVyLCBlbGVtZW50LCBGaWx0ZXJDb25zdGFudHMuUk9MRVMsCi0JCQkJCQlleGlzdGluZ0VsZW1lbnRzKTsKLQotCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWZkLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZSh0cnVlKTsKLQkJCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuUk9MRVMpOwotCQkJCWZkLm9wZW4oKTsKLQkJCQlzZXRNZXRob2RFbGVtZW50KGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0KLQkJCQkvLyB1cGRhdGUgbWV0aG9kIGVsZW1lbnQgY29udHJvbAotCQkJCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50TmFtZShlbGVtZW50KSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlMSkgewotCQkJfQotCQl9KTsKLQkJCi0JCWNsZWFyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0Um9sZURlc2NyaXB0b3JfUm9sZSgpLAotCQkJCQkJbnVsbCwgLTEpOwotCQkJCS8vIHVwZGF0ZSBtZXRob2QgZWxlbWVudCBjb250cm9sCi0JCQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRUZXh0KGdldE1ldGhvZEVsZW1lbnROYW1lKGVsZW1lbnQpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUxKSB7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRNZXRob2RFbGVtZW50KExpc3QgaXRlbXMpIHsKLQkJaWYgKChpdGVtcyAhPSBudWxsKSAmJiAoaXRlbXMuc2l6ZSgpID49IDEpKSB7Ci0JCQlpZiAoaXRlbXMuZ2V0KDApIGluc3RhbmNlb2YgUm9sZSkgewotCQkJCVJvbGUgcm9sZSA9IChSb2xlKSBpdGVtcy5nZXQoMCk7Ci0KLS8vCQkJCUxpc3QgbGlzdCA9IFByb2Nlc3NVdGlsCi0vLwkJCQkJCS5nZXRTaWJsaW5ncyhUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotLy8JCQkJCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBnZXRBZGFwdGVyKCksCi0vLwkJCQkJCQkJZWxlbWVudCk7Ci0JCQkJYm9vbGVhbiBjYW5Bc3NpZ24gPSB0cnVlOwotLy8JCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLS8vCQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0vLwkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0vLwkJCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBvYmo7Ci0vLwkJCQkJCWlmICgoIXJvbGVEZXNjLmVxdWFscyhlbGVtZW50KSkKLS8vCQkJCQkJCQkmJiAoIXJvbGVEZXNjLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkpIHsKLS8vCQkJCQkJCVJvbGUgZXhpc2luZ1JvbGUgPSByb2xlRGVzYy5nZXRSb2xlKCk7Ci0vLwkJCQkJCQlpZiAocm9sZS5lcXVhbHMoZXhpc2luZ1JvbGUpKSB7Ci0vLwkJCQkJCQkJY2FuQXNzaWduID0gZmFsc2U7Ci0vLwkJCQkJCQkJYnJlYWs7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0JCQkJaWYgKGNhbkFzc2lnbikgewotCQkJCQlMaW5rTWV0aG9kRWxlbWVudENvbW1hbmQgY21kID0gbmV3IExpbmtNZXRob2RFbGVtZW50Q29tbWFuZCgKLQkJCQkJCQllbGVtZW50LCByb2xlLCBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRSk7Ci0JCQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0KLQkJCQkJLy8gc2V0IHNlbGVjdGlvbiB0byBzYW1lIGVsZW1lbnQgdG8gZW5hYmxlIGNvcnJlY3QgYWN0aW9ucwotCQkJCQlnZXRFZGl0b3IoKS5zZXRTZWxlY3Rpb24oZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCU1lc3NhZ2VGb3JtYXQgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfSW52YWxpZExpbmtNZXRob2RFbGVtZW50KTsgCi0JCQkJCU9iamVjdFtdIGFyZ3MgPSB7IHJvbGUuZ2V0TmFtZSgpIH07Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19MaW5rTWV0aG9kRWxlbWVudFRpdGxlLCBtZi5mb3JtYXQoYXJncykpOyAKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNZXRob2RFbGVtZW50TmFtZShSb2xlRGVzY3JpcHRvciBlbGVtZW50KSB7Ci0JCVN0cmluZyBzdHIgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTm9uZTsgCi0JCWlmIChlbGVtZW50LmdldFJvbGUoKSAhPSBudWxsKSB7Ci0JCQlzdHIgPSBlbGVtZW50LmdldFJvbGUoKS5nZXROYW1lKCk7Ci0JCX0KLQotCQlyZXR1cm4gc3RyOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jdXBkYXRlQ29udHJvbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlzdXBlci51cGRhdGVDb250cm9scygpOwotCi0JCWxpbmtCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWNsZWFyQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlPYmplY3Qgb2JqID0gZ2V0RWxlbWVudCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBvYmo7Ci0JCQlpZiAoKHJvbGVEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpCi0JCQkJCXx8IChyb2xlRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSkgewotCQkJCW5hbWVUZXh0LnNldEVkaXRhYmxlKHRydWUpOwotCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LnNldEVkaXRhYmxlKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQluYW1lVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCXN1cGVyLnJlZnJlc2goKTsKLQotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJZWxlbWVudCA9IChSb2xlRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQkJCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50TmFtZShlbGVtZW50KSk7Ci0KLQkJCQkvLyBzaG93L2hpZGUgbWV0aG9kIHJvbGUKLQkJCQl0b2dnbGVNZXRob2RSb2xlKCk7Ci0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoCi0JCQkJCSJFcnJvciByZWZyZXNoaW5nIFJvbGVEZXNjcmlwdG9yIGdlbmVyYWwgc2VjdGlvbjogIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI2dldE5hbWVQcmVmaXgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZVByZWZpeCgpIHsKLQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfQ09NUE9TSVRFX1JPTEUgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9ST0xFX0RFU0NSSVBUT1IgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JvbGVEZXNjcmlwdG9yVGVhbVNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Sb2xlRGVzY3JpcHRvclRlYW1TZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczN2I0MDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JvbGVEZXNjcmlwdG9yVGVhbVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotLyoqCi0gKiBUaGUgUm9sZSBkZXNjcmlwdG9yIC0gdGVhbSBwcm9maWxlIHNlY3Rpb24KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0b3JUZWFtU2VjdGlvbiBleHRlbmRzIE9CU1JlbGF0aW9uU2VjdGlvbiB7Ci0JcHJpdmF0ZSBJbWFnZSB0aXRsZUltYWdlID0gbnVsbDsKLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNpbml0Q29udGVudFByb3ZpZGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZ2V0U2VsZWN0ZWRUZWFtcyhlbGVtZW50KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCWVsZW1lbnQgPSAoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQ7Ci0KLQkJCi0JCXNldFRhYkRhdGEoUHJvcGVydGllc1Jlc291cmNlcy5Sb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25UaXRsZSwgCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Sb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25EZXNjcmlwdGlvbiwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlJvbGVEZXNjcmlwdG9yX1RlYW1fVGFibGUxKTsgCi0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQlzdXBlci5yZWZyZXNoKCk7Ci0KLQkJCQllbGVtZW50ID0gKFJvbGVEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoCi0JCQkJCSJFcnJvciByZWZyZXNoaW5nIFJvbGUgRGVzY3JpcHRvciB0ZWFtIHNlY3Rpb24gIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkKE9iamVjdFtdIGl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJaWYgKGl0ZW1zICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBpdGVtc1tpXTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCQkJQ29tcG9zaXRlUm9sZSBjb21wUm9sZSA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJLmNyZWF0ZUNvbXBvc2l0ZVJvbGUoKENvbXBvc2l0ZVJvbGUpIGVsZW1lbnQpOwotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB0ZWFtLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLAotCQkJCQkJCWNvbXBSb2xlLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJUm9sZSByb2xlID0gKChSb2xlRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0Um9sZSgpOwotCQkJCQlpZiAocm9sZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoIWlzUGFydE9mVGVhbShyb2xlLCB0ZWFtKSkgewotCQkJCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJCS5jcmVhdGVSb2xlRGVzY3JpcHRvcihyb2xlKTsKLQkJCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB0ZWFtLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLAotCQkJCQkJCQkJcm9sZURlc2MsIC0xKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCU1lc3NhZ2VGb3JtYXQgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdCgKLQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1RlYW1Bc3NpZ25FcnJvcik7IAotCQkJCQkJT2JqZWN0W10gYXJncyA9IHsgZWxlbWVudC5nZXROYW1lKCksIHRlYW0uZ2V0TmFtZSgpIH07Ci0JCQkJCQlTdHJpbmcgbWVzc2FnZSA9IG1mLmZvcm1hdChhcmdzKTsKLQkJCQkJCVN0cmluZyB0aXRsZSA9IGdldEVkaXRvcigpLmdldFRpdGxlKCk7Ci0JCQkJCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHRlYW0sCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCWVsZW1lbnQsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNyZW1vdmUoamF2YS51dGlsLkFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIGl0b3IubmV4dCgpOwotCQkJCVJvbGUgcm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFJvbGUoKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB0ZWFtLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJCQllbGVtZW50LCAtMSk7Ci0KLQkJCQkvLyBHZXQgdGhlIGxpc3Qgb2Ygcm9sZURlc2NyaXB0b3JzIGZyb20gdGVhbSBwcm9maWxlIHdoaWNoCi0JCQkJLy8gaGFzIHNhbWUgcm9sZSBvcmlnaW5hbCByb2xlIGRlc2NyaXB0b3IKLQkJCQlMaXN0IHRlYW1Sb2xlcyA9IHRlYW0uZ2V0VGVhbVJvbGVzKCk7Ci0JCQkJTGlzdCByb2xlRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZWFtUm9sZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIHRlYW1Sb2xlcy5nZXQoaSk7Ci0KLQkJCQkJaWYgKHJvbGVEZXNjLmdldFJvbGUoKS5lcXVhbHMocm9sZSkpCi0JCQkJCXsKLQkJCQkJCXJvbGVEZXNjTGlzdC5hZGQocm9sZURlc2MpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gaWYgcm9sZURlc2NyaXBvciBqdXN0IGhhcyBvbmUgZWxlbWVudCwgZGVsZXRlIHRoYXQgb25lIHRvby4KLQkJCQkvLyBzaW5jZSB0aGF0IHdvdWxkIGJlIHRoZSBsYXN0IG9uZQotCQkJCWlmIChyb2xlRGVzY0xpc3Quc2l6ZSgpID09IDEpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgdGVhbSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCQkoUm9sZURlc2NyaXB0b3IpIHJvbGVEZXNjTGlzdC5nZXQoMCksIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBib29sZWFuIGlzUGFydE9mVGVhbShSb2xlIHJvbGUsIFRlYW1Qcm9maWxlIHRlYW0pIHsKLQkJTGlzdCB0ZWFtUm9sZXMgPSB0ZWFtLmdldFRlYW1Sb2xlcygpOwotCQlMaXN0IHJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB0ZWFtUm9sZXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgaXRvci5uZXh0KCk7Ci0JCQlyb2xlcy5hZGQocm9sZURlc2MuZ2V0Um9sZSgpKTsKLQkJfQotCi0JCWlmIChyb2xlcy5jb250YWlucyhyb2xlKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jb3BlbkFkZERpYWxvZygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkFkZERpYWxvZygpIHsKLQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgdGVhbUNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCUxpc3QgaXRlbXMgPSBnZXRUZWFtcygpOwotCQkJCWl0ZW1zLnJlbW92ZUFsbChnZXRTZWxlY3RlZFRlYW1zKGVsZW1lbnQpKTsKLQkJCQlyZXR1cm4gaXRlbXMudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCUlMYWJlbFByb3ZpZGVyIHRlYW1MYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQotCQlMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBMaXN0U2VsZWN0aW9uRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgZWxlbWVudCwKLQkJCQl0ZWFtQ29udGVudFByb3ZpZGVyLCB0ZWFtTGFiZWxQcm92aWRlciwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1RlYW1EaWFsb2dNZXNzYWdlKTsgCi0JCXRpdGxlSW1hZ2UgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLmdldEltYWdlKCk7Ci0JCUxpc3RTZWxlY3Rpb25EaWFsb2cuc2V0RGVmYXVsdEltYWdlKHRpdGxlSW1hZ2UpOwotCi0JCWRsZy5zZXRUaXRsZShQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfVGVhbURpYWxvZ1RpdGxlKTsgCi0JCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGxnLm9wZW4oKTsKLQkJYWRkKGRsZy5nZXRSZXN1bHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJY29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKiAJCVBhcmVudCBvZiB0aGUgZWxlbWVudAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0UGFyZW50KEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCkgewotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQllbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgVGVhbXMgZnJvbSBwYXJlbnQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQkJTGlzdCBvZiB0ZWFtcwotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRUZWFtcygpIHsKLQkJQXJyYXlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KGVsZW1lbnQpOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgcGFyZW50OwotCQkJCUxpc3QgYnJlYWtkb3duRWxlbWVudHMgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYnJlYWtkb3duRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgaXQubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBlbGVtZW50OwotCQkJCQkJaXRlbXMuYWRkKHRlYW0pOwotCQkJCQkJLy8gYWRkIGFueSBzdWIgdGVhbXMgaWYgdGhlcmUKLQkJCQkJCUxpc3Qgc3ViVGVhbXMgPSB0ZWFtLmdldFN1YlRlYW0oKTsKLQkJCQkJCWl0ZW1zLmFkZEFsbChzdWJUZWFtcyk7Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcGFyZW50ID0gZ2V0UGFyZW50KChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQpOwotCQl9Ci0KLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQotCS8qKgotCSAqIEdldCBzZWxlY3RlZCB0ZWFtcyBmb3IgdGhhdCByb2xlIGRlc2NyaXB0b3IKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqIAkJTGlzdCBvZiBzZWxlY3RlZCB0ZWFtIAotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRTZWxlY3RlZFRlYW1zKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiBQcm9jZXNzVXRpbAotCQkJCQkuZ2V0VGVhbVByb2ZpbGVzKChSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIGlucHV0KTsKLQkJfSBlbHNlIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBvYmplY3Q7Ci0JCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0VGVhbVByb2ZpbGVzKHJvbGVEZXNjLCBnZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJfQotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Sb2xlRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JvbGVEZXNjcmlwdG9yV29ya1Byb2R1Y3RTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNWZlYTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JvbGVEZXNjcmlwdG9yV29ya1Byb2R1Y3RTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQXNzaWduV1BUb1JvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLklBY3Rpb25UeXBlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotLyoqCi0gKiBSb2xlIERlc2NyaXB0b3IgLSB3b3JrIHByb2R1Y3Qgc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbiBleHRlbmRzIFJlbGF0aW9uU2VjdGlvbiB7Ci0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXQgcHJvY2VzcyB3b3JrIHByb2R1Y3QgZmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCWZpbHRlciA9IG5ldyBQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpLAotCQkJCQludWxsLCBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTKTsKLQkJfQotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0KLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXIxKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMSgpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdCgKLQkJCQkJCSgoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFJlc3BvbnNpYmxlRm9yKCkpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl0YWJsZVZpZXdlcjEuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXIyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMigpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdCgoKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRNb2RpZmllcygpKQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdGFibGVWaWV3ZXIyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0KLQkJbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQkJaW50IG51bU9mVGFibGVzID0gMjsKLQkJCi0JCXNldFRhYkRhdGEoUHJvcGVydGllc1Jlc291cmNlcy5Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbiwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTEsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyLAotCQkJCW51bGwsCi0JCQkJbnVsbCwKLQkJCQlGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTKTsgCi0KLQkJYm9vbGVhbltdIGNoYW5nZXNBbGxvd2VkID0geyB0cnVlLCBmYWxzZSB9OwotCQlzZXRUYWJsZURhdGEobnVtT2ZUYWJsZXMsIGNoYW5nZXNBbGxvd2VkKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCWVsZW1lbnQgPSAoUm9sZURlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJfQotCQlzdXBlci5yZWZyZXNoKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RGVzY3JpcHRvcnNGcm9tUHJvY2VzcygpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RGVzY3JpcHRvcnNGcm9tUHJvY2VzcygpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldEVsZW1lbnRzSW5TY29wZShnZXRBZGFwdGVyRmFjdG9yeSgpLCBlbGVtZW50LAotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRJdGVtczEoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMxKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUFzc2lnbldQVG9Sb2xlRGVzY3JpcHRvciBjbWQgPSBuZXcgQXNzaWduV1BUb1JvbGVEZXNjcmlwdG9yKAotCQkJCQkoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQsIGl0ZW1zLAotCQkJCQlJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfUkVTUE9OU0lCTEVfRk9SLCBnZXRDb25maWd1cmF0aW9uKCkpOwotCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jcmVtb3ZlSXRlbXMxKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMShMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZCBjbWQgPSBuZXcgUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQoZWxlbWVudCwKLQkJCQkJaXRlbXMsIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1IpOwotCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIExpc3QgZ2V0V29ya1Byb2R1Y3RzKExpc3QgaXRlbXMpIHsKLQkJTGlzdCB3cExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJd3BMaXN0LmFkZCgoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgaXRlbXMuZ2V0KGkpKQotCQkJCQkJLmdldFdvcmtQcm9kdWN0KCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHdwTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RXhpc3RpbmdFbGVtZW50czEoKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMxKCkgewotCQlyZXR1cm4gZ2V0V29ya1Byb2R1Y3RzKCgoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFJlc3BvbnNpYmxlRm9yKCkpOwotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0UHJvY2VzcygpCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IG9iaiA9IFByb2Nlc3NVdGlsLmdldFJvb3RQcm9jZXNzKGFGYWN0b3J5LCBhZGFwdGVyLCBlbGVtZW50KTsKLQkJcmV0dXJuIChQcm9jZXNzKSBvYmo7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEZpbHRlckZvckRlc2NyaXB0b3JzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBEZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcihnZXRDb25maWd1cmF0aW9uKCkpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlnZXRBY3Rpdml0aWVzSW5TY29wZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBlbGVtZW50LCBsaXN0KTsKLQkJCQkJaWYgKGxpc3QuY29udGFpbnMob2JqKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCS8vIFVuY29tbWVudCB0byBzaG93IGV4dGVuZGVkIGFjdGl2aXR5J3Mgd29ya3Byb2R1Y3RzCi0JCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJLy8gT2JqZWN0IG9iamVjdCA9Ci0JCQkJLy8gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilvYmopLmdldFBhcmVudChvYmopOwotCQkJCS8vIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkvLyBnZXRBY3Rpdml0aWVzSW5TY29wZSgKLQkJCQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCS8vIGVsZW1lbnQsIGxpc3QpOwotCQkJCS8vIGlmKGxpc3QuY29udGFpbnMob2JqZWN0KSkgcmV0dXJuIHRydWU7Ci0JCQkJLy8gfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RGVzY3JpcHRvclRhYk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRvclRhYk5hbWUoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRGcm9tUHJvY2Vzc0l0ZW1zMShqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zMShMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGVsZW1lbnQsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCksCi0JCQkJCWl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UYXNrRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZGUxMDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NUYXNrRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuTGlua01ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIFRoZSBnZW5lcmFsIHRhYiBzZWN0aW9uIGZvciBUYXNrIERlc2NyaXB0b3IKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiBleHRlbmRzCi0JCVdvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24gewotCXByb3RlY3RlZCBUYXNrRGVzY3JpcHRvciBlbGVtZW50OwotCi0JcHJpdmF0ZSBCdXR0b24gc3luY2hyb25pemVkQnV0dG9uOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfbWV0aG9kX2VsZW1lbnQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBsaW5rQnV0dG9uOwotCQotCXByaXZhdGUgQnV0dG9uIGNsZWFyQnV0dG9uOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCS8vIGdldCBUYXNrRGVzY3JpcHRvciBvYmplY3QKLQkJZWxlbWVudCA9IChUYXNrRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLldvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jY3JlYXRlR2VuZXJhbFNlY3Rpb24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdlbmVyYWxTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJc3VwZXIuY3JlYXRlR2VuZXJhbFNlY3Rpb24oY29tcG9zaXRlKTsKLQotCQkvLyBjcmVhdGUgY29tcG9zaXRlIGZvciBjaGVja2JveAotCQljaGVja0JveENvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIG51bU9mQ29sdW1ucywgdHJ1ZSk7Ci0KLQkJLy8gc3luY2hyb25pemVkIHdpdGggc291cmNlCi0JCXN5bmNocm9uaXplZEJ1dHRvbiA9IEZvcm1VSS5jcmVhdGVDaGVja0J1dHRvbih0b29sa2l0LCBjaGVja0JveENvbXBvc2l0ZSwKLQkJCQkxKTsKLQkJc3luY2hyb25pemVkQnV0dG9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5CcmVha2Rvd25FbGVtZW50X09wdGlvbl9TeW5jaHJvbml6ZWQpOyAKLQotCQkvLyBtZXRob2QgZWxlbWVudAotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1R5cGVfVGFzayk7IAotCQljdHJsX21ldGhvZF9lbGVtZW50ID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlTV1QuREVGQVVMVCwgMSk7Ci0KLQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRUZXh0KGdldE1ldGhvZEVsZW1lbnROYW1lKGVsZW1lbnQpKTsKLQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LAotCQkJCWdlbmVyYWxDb21wb3NpdGUsIFNXVC5OT05FLCAyLCB0cnVlKTsKLQkJbGlua0J1dHRvbiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCwgMSk7Ci0JCWxpbmtCdXR0b24KLQkJCQkuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQnV0dG9uX0xpbmtNZXRob2RFbGVtZW50KTsgCi0KLQkJY2xlYXJCdXR0b24gPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gsIDEpOwotCQljbGVhckJ1dHRvbgotCQkJCS5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19CdXR0b25fQ2xlYXJNZXRob2RFbGVtZW50KTsgCi0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRNZXRob2RFbGVtZW50KExpc3QgaXRlbXMpIHsKLQkJaWYgKChpdGVtcyAhPSBudWxsKSAmJiAoaXRlbXMuc2l6ZSgpID49IDEpKSB7Ci0JCQlpZiAoaXRlbXMuZ2V0KDApIGluc3RhbmNlb2YgVGFzaykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdGVtcy5nZXQoMCk7Ci0KLS8vCQkJCUxpc3Qgc2libGluZ3MgPSBQcm9jZXNzVXRpbAotLy8JCQkJCQkuZ2V0U2libGluZ3MoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLS8vCQkJCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgZ2V0QWRhcHRlcigpLAotLy8JCQkJCQkJCWVsZW1lbnQpOwotCQkJCWJvb2xlYW4gY2FuQXNzaWduID0gdHJ1ZTsKLS8vCQkJCi0vLwotLy8JCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLS8vCQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0vLwkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0vLwkJCQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gKFRhc2tEZXNjcmlwdG9yKSBvYmo7Ci0vLwkJCQkJCWlmICgoIXRhc2tEZXNjLmVxdWFscyhlbGVtZW50KSkKLS8vCQkJCQkJCQkmJiAoIXRhc2tEZXNjLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkpIHsKLS8vCQkJCQkJCVRhc2sgZXhpc2luZ1Rhc2sgPSB0YXNrRGVzYy5nZXRUYXNrKCk7Ci0vLwkJCQkJCQlpZiAodGFzay5lcXVhbHMoZXhpc2luZ1Rhc2spKSB7Ci0vLwkJCQkJCQkJY2FuQXNzaWduID0gZmFsc2U7Ci0vLwkJCQkJCQkJYnJlYWs7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0JCQkJaWYgKGNhbkFzc2lnbikgewotCQkJCQlMaW5rTWV0aG9kRWxlbWVudENvbW1hbmQgY21kID0gbmV3IExpbmtNZXRob2RFbGVtZW50Q29tbWFuZCgKLQkJCQkJCQllbGVtZW50LCB0YXNrLCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSyk7Ci0JCQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0KLQkJCQkJLy8gc2V0IHNlbGVjdGlvbiB0byBzYW1lIGVsZW1lbnQgdG8gZW5hYmxlIGNvcnJlY3QgYWN0aW9ucwotCQkJCQlnZXRFZGl0b3IoKS5zZXRTZWxlY3Rpb24oZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCU1lc3NhZ2VGb3JtYXQgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfSW52YWxpZExpbmtNZXRob2RFbGVtZW50KTsgCi0JCQkJCU9iamVjdFtdIGFyZ3MgPSB7IHRhc2suZ2V0TmFtZSgpIH07Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19MaW5rTWV0aG9kRWxlbWVudFRpdGxlLCBtZi5mb3JtYXQoYXJncykpOyAKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNZXRob2RFbGVtZW50TmFtZShUYXNrRGVzY3JpcHRvciBlbGVtZW50KSB7Ci0JCVN0cmluZyBzdHIgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTm9uZTsgCi0JCWlmIChlbGVtZW50LmdldFRhc2soKSAhPSBudWxsKSB7Ci0JCQlzdHIgPSBlbGVtZW50LmdldFRhc2soKS5nZXROYW1lKCk7Ci0JCX0KLQotCQlyZXR1cm4gc3RyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLldvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCi0JCXN5bmNocm9uaXplZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlbGVtZW50LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2Yoc3luY2hyb25pemVkQnV0dG9uLmdldFNlbGVjdGlvbigpKSwgLTEpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlsaW5rQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IFByb2Nlc3NUYXNrRmlsdGVyKAotCQkJCQkJZ2V0Q29uZmlndXJhdGlvbigpLCBudWxsLCBGaWx0ZXJDb25zdGFudHMuVEFTS1MpOwotCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpZiAoZWxlbWVudC5nZXRUYXNrKCkgIT0gbnVsbCkgewotCQkJCQlleGlzdGluZ0VsZW1lbnRzLmFkZChlbGVtZW50LmdldFRhc2soKSk7Ci0JCQkJfQotCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQkJZmlsdGVyLCBlbGVtZW50LCBGaWx0ZXJDb25zdGFudHMuVEFTS1MsCi0JCQkJCQlleGlzdGluZ0VsZW1lbnRzKTsKLQotCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWZkLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZSh0cnVlKTsKLQkJCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuVEFTS1MpOwotCQkJCWZkLm9wZW4oKTsKLQkJCQlzZXRNZXRob2RFbGVtZW50KGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0KLQkJCQkvLyB1cGRhdGUgbWV0aG9kIGVsZW1lbnQgY29udHJvbAotCQkJCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50TmFtZShlbGVtZW50KSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlMSkgewotCQkJfQotCQl9KTsKLQkJCi0JCQotCQljbGVhckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlbGVtZW50LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX1Rhc2soKSwKLQkJCQkJCW51bGwsIC0xKTsKLQkJCQkvLyB1cGRhdGUgbWV0aG9kIGVsZW1lbnQgY29udHJvbAotCQkJCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50TmFtZShlbGVtZW50KSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlMSkgewotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI3VwZGF0ZUNvbnRyb2xzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJc3VwZXIudXBkYXRlQ29udHJvbHMoKTsKLQkJc3luY2hyb25pemVkQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlsaW5rQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljbGVhckJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQlzdXBlci5yZWZyZXNoKCk7Ci0KLQkJCQllbGVtZW50ID0gKFRhc2tEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JCQkJc3luY2hyb25pemVkQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50Ci0JCQkJCQkuZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkuYm9vbGVhblZhbHVlKCkpOwotCQkJCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50TmFtZShlbGVtZW50KSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBUYXNrRGVzY3JpcHRvciBnZW5lcmFsIHNlY3Rpb246ICIgKyBlbGVtZW50LCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLldvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jZ2V0TmFtZVByZWZpeCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lUHJlZml4KCkgewotCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX1RBU0tfREVTQ1JJUFRPUiArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JSb2xlU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yUm9sZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYzZDQxOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JSb2xlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkRlc2NyaXB0b3JQcm9jZXNzRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Qcm9jZXNzUm9sZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuSUFjdGlvblR5cGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSBUYXNrIGRlc2NyaXB0b3IgLSByb2xlIHRhYiBzZWN0aW9uCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdG9yUm9sZVNlY3Rpb24gZXh0ZW5kcyBSZWxhdGlvblNlY3Rpb24gewotCXByaXZhdGUgSUZpbHRlciByb2xlRmlsdGVyID0gbnVsbDsKLQotCS8qKgotCSAqIEdldCBwcm9jZXNzIHJvbGVkZXNjcmlwdG9yIGZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJaWYgKHJvbGVGaWx0ZXIgPT0gbnVsbCkgewotCQkJcm9sZUZpbHRlciA9IG5ldyBQcm9jZXNzUm9sZUZpbHRlcihnZXRDb25maWd1cmF0aW9uKCksIG51bGwsCi0JCQkJCUZpbHRlckNvbnN0YW50cy5ST0xFUyk7Ci0JCX0KLQkJcmV0dXJuIHJvbGVGaWx0ZXI7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LAotCQkJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpIHsKLQotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcjEoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIxKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyMS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcjIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIyKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcjMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIzKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0QXNzaXN0ZWRCeSgpKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyMy5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCi0JCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCWludCBudW1PZlRhYmxlcyA9IDM7Ci0JCQotCQlzZXRUYWJEYXRhKFByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvblRpdGxlLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUxLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUyLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUzLAotCQkJCW51bGwsCi0JCQkJRmlsdGVyQ29uc3RhbnRzLlJPTEVTKTsKLQkJCi0JCWJvb2xlYW5bXSBjaGFuZ2VzQWxsb3dlZCA9IHsgdHJ1ZSwgdHJ1ZSwgdHJ1ZSB9OwotCQlzZXRUYWJsZURhdGEobnVtT2ZUYWJsZXMsIGNoYW5nZXNBbGxvd2VkKTsKLQotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJZWxlbWVudCA9IChUYXNrRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXN1cGVyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RGVzY3JpcHRvcnNGcm9tUHJvY2VzcygpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RGVzY3JpcHRvcnNGcm9tUHJvY2VzcygpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldEVsZW1lbnRzSW5TY29wZShnZXRBZGFwdGVyRmFjdG9yeSgpLCBlbGVtZW50LAotCQkJCVJvbGVEZXNjcmlwdG9yLmNsYXNzLCBpdGVtcyk7Ci0KLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0Um9sZXMoTGlzdCBpdGVtcykgewotCQlMaXN0IHJvbGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotCQkJCXJvbGVMaXN0LmFkZCgoKFJvbGVEZXNjcmlwdG9yKSBpdGVtcy5nZXQoaSkpLmdldFJvbGUoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcm9sZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEl0ZW1zMShqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtczEoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJTGlzdCBlbGVtZW50TGlzdCA9IGdldFJvbGVzKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJCWVsZW1lbnRMaXN0LmFkZEFsbChnZXRSb2xlcygoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0QXNzaXN0ZWRCeSgpKSk7Ci0KLQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlbXMuZ2V0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQkJCVJvbGUgcm9sZSA9IChSb2xlKSBvYmo7Ci0JCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnMocm9sZSkpCi0JCQkJCQluZXdMaXN0LmFkZChyb2xlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChuZXdMaXN0LnNpemUoKSA+IDApIHsKLQkJCQlBc3NpZ25Sb2xlVG9UYXNrRGVzY3JpcHRvciBjbWQgPSBuZXcgQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3IoCi0JCQkJCQkoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQsIG5ld0xpc3QsCi0JCQkJCQlJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfUFJJTUFSWV9QRVJGT1JNRVIsIGdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkSXRlbXMyKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zMihMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gZ2V0Um9sZXMoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkpOwotCQkJZWxlbWVudExpc3QuYWRkQWxsKGdldFJvbGVzKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRBc3Npc3RlZEJ5KCkpKTsKLQkJCi0KLQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlbXMuZ2V0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQkJCVJvbGUgcm9sZSA9IChSb2xlKSBvYmo7Ci0JCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnMocm9sZSkpCi0JCQkJCQluZXdMaXN0LmFkZChyb2xlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobmV3TGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3IgY21kID0gbmV3IEFzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yKAotCQkJCQkJKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50LCBuZXdMaXN0LAotCQkJCQkJSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0FERElUSU9OQUxfUEVSRk9STUVSLCBnZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEl0ZW1zMyhqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtczMoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJTGlzdCBlbGVtZW50TGlzdCA9IGdldFJvbGVzKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpKTsKLQkJCWVsZW1lbnRMaXN0LmFkZEFsbChnZXRSb2xlcygoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSkpOwotCi0JCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZW1zLmdldChpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZSkgewotCQkJCQlSb2xlIHJvbGUgPSAoUm9sZSkgb2JqOwotCQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKHJvbGUpKQotCQkJCQkJbmV3TGlzdC5hZGQocm9sZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5ld0xpc3Quc2l6ZSgpID4gMCkgewotCQkJCUFzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yIGNtZCA9IG5ldyBBc3NpZ25Sb2xlVG9UYXNrRGVzY3JpcHRvcigKLQkJCQkJCShUYXNrRGVzY3JpcHRvcikgZWxlbWVudCwgbmV3TGlzdCwKLQkJCQkJCUlBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9BU1NJU1RFRF9CWSwgZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRGcm9tUHJvY2Vzc0l0ZW1zMShqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zMShMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlpdGVtcy5yZW1vdmVBbGwoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpOwotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldEFzc2lzdGVkQnkoKSk7Ci0KLQkJCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCBlbGVtZW50LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksCi0JCQkJCQlpdGVtcywgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEZyb21Qcm9jZXNzSXRlbXMyKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXMyKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWl0ZW1zLnJlbW92ZUFsbCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRBc3Npc3RlZEJ5KCkpOwotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkpOwotCi0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGVsZW1lbnQsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksCi0JCQkJCWl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkRnJvbVByb2Nlc3NJdGVtczMoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczMoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJCWl0ZW1zLnJlbW92ZUFsbCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpKTsKLQotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCBlbGVtZW50LAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCksIGl0ZW1zLAotCQkJCQktMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jcmVtb3ZlSXRlbXMxKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMShMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZCBjbWQgPSBuZXcgUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQoZWxlbWVudCwKLQkJCQkJaXRlbXMsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZKTsKLQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI3JlbW92ZUl0ZW1zMihqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtczIoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQgY21kID0gbmV3IFJlbW92ZURlc2NyaXB0b3JDb21tYW5kKGVsZW1lbnQsCi0JCQkJCWl0ZW1zLAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSk7Ci0JCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNyZW1vdmVJdGVtczMoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXMzKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCVJlbW92ZURlc2NyaXB0b3JDb21tYW5kIGNtZCA9IG5ldyBSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZChlbGVtZW50LAotCQkJCQlpdGVtcywgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZKTsKLQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEV4aXN0aW5nRWxlbWVudHMxKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzMSgpIHsKLQkJcmV0dXJuICgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRFeGlzdGluZ0VsZW1lbnRzMigpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czIoKSB7Ci0JCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RXhpc3RpbmdFbGVtZW50czMoKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMzKCkgewotCQlyZXR1cm4gKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0QXNzaXN0ZWRCeSgpOwotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RmlsdGVyRm9yRGVzY3JpcHRvcnMoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlckZvckRlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gbmV3IERlc2NyaXB0b3JQcm9jZXNzRmlsdGVyKGdldENvbmZpZ3VyYXRpb24oKSkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWdldEFjdGl2aXRpZXNJblNjb3BlKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGVsZW1lbnQsIGxpc3QpOwotCQkJCQlpZiAobGlzdC5jb250YWlucyhvYmopKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldFByb2Nlc3MoKQotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCWVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBvYmogPSBQcm9jZXNzVXRpbC5nZXRSb290UHJvY2VzcyhhRmFjdG9yeSwgYWRhcHRlciwgZWxlbWVudCk7Ci0JCXJldHVybiAoUHJvY2Vzcykgb2JqOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXREZXNjcmlwdG9yVGFiTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdG9yVGFiTmFtZSgpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ST0xFX0RFU0NSSVBUT1JTOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UYXNrRGVzY3JpcHRvclN0ZXBTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JTdGVwU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWZhYzdmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UYXNrRGVzY3JpcHRvclN0ZXBTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0aW9uQXBwbGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIHRhc2sgZGVzY3JpcHRvciAtIHN0ZXAgc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRvclN0ZXBTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQlwcml2YXRlIFRhc2tEZXNjcmlwdG9yIGVsZW1lbnQ7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCXByaXZhdGUgRm9ybVRvb2xraXQgdG9vbGtpdDsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfYWRkLCBjdHJsX3JlbW92ZSwgY3RybF91cCwgY3RybF9kb3duOwotCi0JcHJpdmF0ZSBUYWJsZSBjdHJsX3NlbGVjdGVkOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciB2aWV3ZXI7Ci0KLQkvLyBwcml2YXRlIFRleHQgY3RybF9icmllZl9kZXNjOwotCXByaXZhdGUgSW1hZ2UgdGl0bGVJbWFnZTsKLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCQlpbml0KCk7Ci0KLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIGNyZWF0ZSBzdGVwcyBzZWN0aW9uCi0JCWNyZWF0ZVN0ZXBTZWN0aW9uKHBhcmVudCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplCi0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJLy8gZ2V0IGFjdGl2aXR5IG9iamVjdAotCQllbGVtZW50ID0gKFRhc2tEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0KLQkJLy8gZ2V0IHRvb2xraXQKLQkJdG9vbGtpdCA9IGdldFdpZGdldEZhY3RvcnkoKTsKLQotCQkvLyBnZXQgYWN0aW9uIG1hbmFnZXIKLQkJYWN0aW9uTWdyID0gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0QWN0aW9uTWFuYWdlcigpOwotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCWVsZW1lbnQgPSAoVGFza0Rlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJLy8gaGlkZS9yZWZyZXNoIGNvbnRyb2xzCi0JCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoIkVycm9yIHJlZnJlc2hpbmcgVGFza0Rlc2NyaXB0b3Igc3RlcCBzZWN0aW9uIiArIGVsZW1lbnQsIGV4KTsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGNvbnRyb2xzIGJhc2VkIG9uIGVkaXRhYmxlIGZsYWcuIENvbnRyb2xzIHdpbGwgYmUgZWl0aGVyIGVkaXRhYmxlIAotCSAqIG9yIHJlYWQtb25seSBhZnRlciB1cGRhdGluZyB0aGlzLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQljdHJsX2FkZC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKGVsZW1lbnQuZ2V0VGFzaygpID09IG51bGwpCi0JCQljdHJsX2FkZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZWxzZSB7Ci0JCQlMaXN0IHN0ZXBzID0gZ2V0U3RlcHMoKTsKLQkJCWlmIChzdGVwcyAhPSBudWxsICYmIHN0ZXBzLnNpemUoKSA+IDApIAotCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQllbHNlIAotCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JCQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCWN0cmxfdXAuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQljdHJsX2Rvd24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBTdGVwIHNlY3Rpb24gb24gdGhlIGdpdmVuIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlU3RlcFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkvLyBjcmVhdGUgc3RlcCBzZWN0aW9uCi0JCVNlY3Rpb24gc3RlcFNlY3Rpb24gPSBGb3JtVUkKLQkJCQkuY3JlYXRlU2VjdGlvbigKLQkJCQkJCXRvb2xraXQsCi0JCQkJCQljb21wb3NpdGUsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvblRpdGxlLCAKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3Jfc3RlcEluZm9ybWF0aW9uRGVzY3JpcHRpb24pOyAKLQotCQkvLyBjcmVhdGUgc3RlcCBjb21wb3NpdGUKLQkJQ29tcG9zaXRlIHN0ZXBDb21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHN0ZXBTZWN0aW9uLAotCQkJCTIsIGZhbHNlKTsKLQotCQkvLyBjcmVhdGUgdGFibGUgY29tcG9zaXRlCi0JCUNvbXBvc2l0ZSBwYW5lMSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc3RlcENvbXBvc2l0ZSwKLQkJCQlHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTEsIFByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRfU3RlcHMpOyAKLQotCQljdHJsX3NlbGVjdGVkID0gRm9ybVVJLmNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUxKTsKLQkJdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfc2VsZWN0ZWQpOwotCi0JCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBlbGVtZW50LmdldFNlbGVjdGVkU3RlcHMoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJdmlld2VyLnNldElucHV0KGVsZW1lbnQpOwotCi0JCS8vIGNyZWF0ZSBidXR0b24gY29tcG9zaXRlCi0JCUNvbXBvc2l0ZSBwYW5lMiA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc3RlcENvbXBvc2l0ZSwKLQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCi0JCS8vIGNyZWF0ZSBidXR0b25zCi0JCWN0cmxfYWRkID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZCk7Ci0JCWN0cmxfYWRkLnNldEVuYWJsZWQoZmFsc2UpOwotCQljdHJsX3JlbW92ZSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW1vdmUpOyAKLQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWN0cmxfdXAgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfVXApOyAKLQkJY3RybF9kb3duID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0Rvd24pOyAKLQotCQlpZiAoZWxlbWVudC5nZXRUYXNrKCkgIT0gbnVsbCkgewotCQkJTGlzdCBzdGVwcyA9IGdldFN0ZXBzKCk7Ci0JCQlpZiAoc3RlcHMgIT0gbnVsbCAmJiBzdGVwcy5zaXplKCkgPiAwKSB7Ci0JCQkJY3RybF9hZGQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJfQotCQkvLyBjcmVhdGUgYnJpZWYgZGVzY3JpcHRpb24KLQkJLy8gaW50IGhlaWdodEhpbnQgPSA0MDsKLQkJLy8gaW50IGhvcml6b250YWxTcGFuID0gMjsKLQkJLy8gTGFiZWwgbGFiZWwgPSBGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgc3RlcENvbXBvc2l0ZSwKLQkJLy8gUHJvcGVydGllc1Jlc291cmNlcy5nZXRTdHJpbmcoIlByb2Nlc3MuYnJpZWZEZXNjcmlwdGlvbiIpLAotCQkvLyBoZWlnaHRIaW50KTsKLQkJLy8gY3RybF9icmllZl9kZXNjID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgc3RlcENvbXBvc2l0ZSwKLQkJLy8gaGVpZ2h0SGludCwgaGVpZ2h0SGludCk7Ci0JCS8vIGN0cmxfYnJpZWZfZGVzYy5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCS8vCQkKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3Ioc3RlcENvbXBvc2l0ZSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQkvLyBBZGQgZm9jdXMgbGlzdGVuZXIgb24gcHJpbWFyeSB0YXNrcyBsaXN0Ci0JCWN0cmxfc2VsZWN0ZWQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkgewotCQkJCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKSB7Ci0JCQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJCQkJaWYgKHZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkJJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0gZWxzZQotCQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJCQlpZiAodmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHZpZXdlcgotCQkJCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkJCSYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0gZWxzZQotCQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCQkJfQotCi0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQlTdHJpbmcgZGVzYyA9ICgoTWV0aG9kRWxlbWVudCkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKQotCQkJCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJCWlmIChkZXNjID09IG51bGwpIHsKLQkJCQkJCWRlc2MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCS8vIGN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KGRlc2MpOwotCQkJCX0gZWxzZSBpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDEpIHsKLQkJCQkJLy8gY3RybF9icmllZl9kZXNjLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5nZXRTdHJpbmcoIlByb2Nlc3MuTXVsdGlwbGVTZWxlY3Rpb24iKQotCQkJCQkvLyArICIgLSAiICsgc2VsZWN0aW9uLnNpemUoKSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2FkZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBzdGVwQ29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0KLQkJCQkJCXJldHVybiBnZXRTdGVwcygpLnRvQXJyYXkoKTsKLS8vCQkJCQkJLy8gZ2V0IGFsbCBzdGVwcwotLy8JCQkJCQlJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlnQXBwbGljYXRvciA9IFByb3ZpZGVycwotLy8JCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpOwotLy8JCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygKLS8vCQkJCQkJCQllbGVtZW50KS5nZXREZWZhdWx0Q29udGV4dCgpOwotLy8JCQkJCQlMaXN0IHN0ZXBzID0gKExpc3QpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKAotLy8JCQkJCQkJCWVsZW1lbnQuZ2V0VGFzaygpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotLy8JCQkJCQkJCQkJLmdldFRhc2tfU3RlcHMoKSwgY29uZmlnKTsKLS8vCi0vLwkJCQkJCS8vIHJlbW92ZSBhbHJlYWR5IGV4aXN0aW5nIHN0ZXBzCi0vLwkJCQkJCXN0ZXBzLnJlbW92ZUFsbChlbGVtZW50LmdldFNlbGVjdGVkU3RlcHMoKSk7Ci0vLwkJCQkJCXJldHVybiBzdGVwcy50b0FycmF5KCk7Ci0JCQkJCX0KLQkJCQl9OwotCi0JCQkJSUxhYmVsUHJvdmlkZXIgc3RlcExhYmVsUHJvdmlkZXIgPSBuZXcgVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlcigKLQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCi0JCQkJCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoT2JqZWN0IG9iaikgewotCi0JCQkJCQlib29sZWFuIGZsYWcgPSAhZWxlbWVudC5nZXRUYXNrKCkuZ2V0UHJlc2VudGF0aW9uKCkKLQkJCQkJCQkJLmdldFNlY3Rpb25zKCkuY29udGFpbnMob2JqKTsKLQkJCQkJCXJldHVybiBmbGFnOwotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCUxpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IExpc3RTZWxlY3Rpb25EaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCQllbGVtZW50LmdldFRhc2soKSwgc3RlcENvbnRlbnRQcm92aWRlciwKLQkJCQkJCXN0ZXBMYWJlbFByb3ZpZGVyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1N0ZXBEaWFsb2dNZXNzYWdlKTsgCi0JCQkJdGl0bGVJbWFnZSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCkuZ2V0SW1hZ2UoKTsKLQkJCQlMaXN0U2VsZWN0aW9uRGlhbG9nLnNldERlZmF1bHRJbWFnZSh0aXRsZUltYWdlKTsKLQkJCQlkbGcuc2V0VGl0bGUoUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nVGl0bGUpOwotCQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlkbGcub3BlbigpOwotCi0JCQkJYWRkU3RlcHMoZGxnLmdldFJlc3VsdCgpKTsKLQkJCQkKLQkJCQkvLyBlbmFibGUvZGlzYWJsZSBhZGQgYnV0dG9uCi0JCQkJTGlzdCBzdGVwcyA9IGdldFN0ZXBzKCk7Ci0JCQkJaWYgKHN0ZXBzICE9IG51bGwgJiYgc3RlcHMuc2l6ZSgpID4gMCkgCi0JCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZWxzZSAKLQkJCQkJY3RybF9hZGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCi0JCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9yZW1vdmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJcmVtb3ZlU3RlcHMocm1JdGVtcyk7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQkvLyBjdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dCgiIik7Ci0JCQkJfQotCQkJCS8vIGN0cmxfcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQotCQkJCS8vIGVuYWJsZS9kaXNhYmxlIGFkZCBidXR0b24KLQkJCQlMaXN0IHN0ZXBzID0gZ2V0U3RlcHMoKTsKLQkJCQlpZiAoc3RlcHMgIT0gbnVsbCAmJiBzdGVwcy5zaXplKCkgPiAwKSAKLQkJCQkJY3RybF9hZGQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQllbHNlIAotCQkJCQljdHJsX2FkZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF91cC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlBcnJheUxpc3Qgc3RlcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJQXJyYXlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlpdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJQmFzaWNFTGlzdCBzdGVwTGlzdCA9IChCYXNpY0VMaXN0KSBlbGVtZW50Ci0JCQkJCQkJLmdldFNlbGVjdGVkU3RlcHMoKTsKLQotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLQkJCQkJCWludCBpbmRleCA9IHN0ZXBMaXN0LmluZGV4T2Yob2JqZWN0KTsKLQkJCQkJCWlmIChpbmRleCA+IDApCi0JCQkJCQkJc3RlcExpc3QubW92ZShpbmRleCAtIDEsIG9iamVjdCk7Ci0KLQkJCQkJfQotCQkJCQlzdGVwcy5hZGRBbGwoc3RlcExpc3QpOwotCQkJCQkvLyBUT0RPIC0gd3JpdGUgYSBjb21tYW5kLiAKLQkJCQkJLy8gYWN0aXZhdGUgZGlydHkgZmxhZwotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCksCi0JCQkJCQkJc3RlcExpc3QsIC0xKTsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpLCBzdGVwcywKLQkJCQkJCQktMSk7Ci0KLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0KLQkJCQlpZiAodmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAgJiYgZWRpdGFibGUpCi0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQllbHNlCi0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJCQlpZiAodmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHZpZXdlci5nZXRUYWJsZSgpCi0JCQkJCQkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCQkmJiBlZGl0YWJsZSkKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZWxzZQotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJY3RybF9kb3duLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUFycmF5TGlzdCBzdGVwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQlBcnJheUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQlCYXNpY0VMaXN0IHN0ZXBMaXN0ID0gKEJhc2ljRUxpc3QpIGVsZW1lbnQKLQkJCQkJCQkuZ2V0U2VsZWN0ZWRTdGVwcygpOwotCi0JCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOwotCQkJCQkJaW50IGluZGV4ID0gc3RlcExpc3QuaW5kZXhPZihvYmplY3QpOwotCi0JCQkJCQlpZiAoaW5kZXggPCBzdGVwTGlzdC5zaXplKCkgLSAxKQotCQkJCQkJCXN0ZXBMaXN0Lm1vdmUoaW5kZXggKyBpdGVtcy5zaXplKCksIG9iamVjdCk7Ci0KLQkJCQkJfQotCQkJCQlzdGVwcy5hZGRBbGwoc3RlcExpc3QpOwotCi0JCQkJCS8vIFRPRE8gLSB3cml0ZSBhIGNtbWFuZC4gSGFja2luZyBpdCBmb3Igbm93IHRvIGFjdGl2YXRlCi0JCQkJCS8vIGRpcnR5IGZsYWcKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpLAotCQkJCQkJCXN0ZXBMaXN0LCAtMSk7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSwgc3RlcHMsCi0JCQkJCQkJLTEpOwotCi0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCi0JCQkJaWYgKHZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwICYmIGVkaXRhYmxlKQotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZWxzZQotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCQkJaWYgKHZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCB2aWV3ZXIuZ2V0VGFibGUoKQotCQkJCQkJLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkJJiYgZWRpdGFibGUpCi0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCWVsc2UKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCQl9Ci0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQXNzaWduIFN0ZXBzIHRvIHRhc2sgZGVzY3JpcHRvcgotCSAqIEBwYXJhbSBhZGRJdGVtcwotCSAqIAkJCUxpc3Qgb2Ygc3RlcHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkU3RlcHMoT2JqZWN0W10gYWRkSXRlbXMpIHsKLQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQlpZiAoYWRkSXRlbXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiBpdGVtID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbikgYWRkSXRlbXNbaV07Ci0KLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCBlbGVtZW50LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpLAotCQkJCQkJaXRlbSwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFzc2lnbmVkIHN0ZXBzIGZvciB0aGUgdGFzayBkZXNjcmlwdG9yCi0JICogQHBhcmFtIHJtSXRlbXMKLQkgKiAJCQlMaXN0IG9mIHN0ZXBzIAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVTdGVwcyhMaXN0IHJtSXRlbXMpIHsKLQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uIGl0ZW0gPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uKSBpdC5uZXh0KCk7Ci0KLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpLAotCQkJCQkJaXRlbSwgLTEpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldCBzdGVwcyB0aGF0IGNvdWxkIGJlIGFzc2lnbmVkIHRvIHRoaXMgdGFzayBkZXNjcmlwdG9yCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRTdGVwcygpewotCQkvLwlnZXQgYWxsIHN0ZXBzCi0JCUlDb25maWd1cmF0aW9uQXBwbGljYXRvciBjb25maWdBcHBsaWNhdG9yID0gUHJvdmlkZXJzCi0JCQkJLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCk7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKAotCQkJCWVsZW1lbnQpLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCUxpc3Qgc3RlcHMgPSAoTGlzdCkgY29uZmlnQXBwbGljYXRvci5nZXRSZWZlcmVuY2UoCi0JCQkJZWxlbWVudC5nZXRUYXNrKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0VGFza19TdGVwcygpLCBjb25maWcpOwotCi0JCS8vIHJlbW92ZSBhbHJlYWR5IGV4aXN0aW5nIHN0ZXBzCi0JCXN0ZXBzLnJlbW92ZUFsbChlbGVtZW50LmdldFNlbGVjdGVkU3RlcHMoKSk7Ci0JCXJldHVybiBzdGVwczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yV29ya1Byb2R1Y3RTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JXb3JrUHJvZHVjdFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjMWIxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JXb3JrUHJvZHVjdFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Bc3NpZ25XUFRvVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuSUFjdGlvblR5cGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIHRhc2sgZGVzY3JpcHRvciAtIHdvcmsgcHJvZHVjdCBzZWN0aW9uCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdG9yV29ya1Byb2R1Y3RTZWN0aW9uIGV4dGVuZHMgUmVsYXRpb25TZWN0aW9uIHsKLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyID0gbnVsbDsKLQotCS8qKgotCSAqIEdldCBwcm9jZXNzIHdvcmsgcHJvZHVjdCBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWlmIChmaWx0ZXIgPT0gbnVsbCkgewotCQkJZmlsdGVyID0gbmV3IFByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlcihnZXRDb25maWd1cmF0aW9uKCksIG51bGwsCi0JCQkJCUZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFMpOwotCQl9Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LAotCQkJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpIHsKLQotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNpbml0Q29udGVudFByb3ZpZGVyMSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcjEoKSB7Ci0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoCi0JCQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRNYW5kYXRvcnlJbnB1dCgpKQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdGFibGVWaWV3ZXIxLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNpbml0Q29udGVudFByb3ZpZGVyMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcjIoKSB7Ci0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoCi0JCQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRPcHRpb25hbElucHV0KCkpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl0YWJsZVZpZXdlcjIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXIzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMygpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdCgKLQkJCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldEV4dGVybmFsSW5wdXQoKSkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyMy5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcjQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXI0KCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldE91dHB1dCgpKQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdGFibGVWaWV3ZXI0LnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0KLQkJbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQkJaW50IG51bU9mVGFibGVzID0gNDsKLQkJc2V0VGFiRGF0YShQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGUsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvbkRlc2NyaXB0aW9uLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMSwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTIsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUzLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlNCwKLQkJCQlGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTKTsKLQkJCi0JCWJvb2xlYW5bXSBjaGFuZ2VzQWxsb3dlZCA9IHsgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSB9OwotCQlzZXRUYWJsZURhdGEobnVtT2ZUYWJsZXMsIGNoYW5nZXNBbGxvd2VkKTsKLQotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJZWxlbWVudCA9IChUYXNrRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXN1cGVyLnJlZnJlc2goKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXREZXNjcmlwdG9yc0Zyb21Qcm9jZXNzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXREZXNjcmlwdG9yc0Zyb21Qcm9jZXNzKCkgewotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0RWxlbWVudHNJblNjb3BlKGdldEFkYXB0ZXJGYWN0b3J5KCksIGVsZW1lbnQsCi0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCBpdGVtcyk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFdvcmtQcm9kdWN0cyhMaXN0IGl0ZW1zKSB7Ci0JCUxpc3Qgd3BMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotCQkJCXdwTGlzdC5hZGQoKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0ZW1zLmdldChpKSkKLQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB3cExpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEl0ZW1zMShqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtczEoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJTGlzdCBlbGVtZW50TGlzdCA9IGdldFdvcmtQcm9kdWN0cygoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0T3B0aW9uYWxJbnB1dCgpKTsKLQkJCWVsZW1lbnRMaXN0LmFkZEFsbChnZXRXb3JrUHJvZHVjdHMoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldEV4dGVybmFsSW5wdXQoKSkpOwotCQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBpdGVtcy5nZXQoaSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBvYmo7Ci0JCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnMod3ApKQotCQkJCQkJbmV3TGlzdC5hZGQod3ApOwotCQkJCX0KLQkJCX0KLQkJCWlmIChuZXdMaXN0LnNpemUoKSA+IDApIHsKLQkJCQlBc3NpZ25XUFRvVGFza0Rlc2NyaXB0b3IgY21kID0gbmV3IEFzc2lnbldQVG9UYXNrRGVzY3JpcHRvcigKLQkJCQkJCShUYXNrRGVzY3JpcHRvcikgZWxlbWVudCwgbmV3TGlzdCwKLQkJCQkJCUlBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9NQU5EQVRPUllfSU5QVVQsCi0JCQkJCQlnZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEl0ZW1zMihqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtczIoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJTGlzdCBlbGVtZW50TGlzdCA9IGdldFdvcmtQcm9kdWN0cygoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0TWFuZGF0b3J5SW5wdXQoKSk7Ci0JCQllbGVtZW50TGlzdC5hZGRBbGwoZ2V0V29ya1Byb2R1Y3RzKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRFeHRlcm5hbElucHV0KCkpKTsKLQotCQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBpdGVtcy5nZXQoaSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBvYmo7Ci0JCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnMod3ApKQotCQkJCQkJbmV3TGlzdC5hZGQod3ApOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG5ld0xpc3Quc2l6ZSgpID4gMCkgewotCQkJCUFzc2lnbldQVG9UYXNrRGVzY3JpcHRvciBjbWQgPSBuZXcgQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yKAotCQkJCQkJKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50LCBuZXdMaXN0LAotCQkJCQkJSUFjdGlvblR5cGVDb25zdGFudHMuQUREX09QVElPTkFMX0lOUFVULAotCQkJCQkJZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRJdGVtczMoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMzKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSBnZXRXb3JrUHJvZHVjdHMoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQkJZWxlbWVudExpc3QuYWRkQWxsKGdldFdvcmtQcm9kdWN0cygoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0T3B0aW9uYWxJbnB1dCgpKSk7Ci0KLQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlbXMuZ2V0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgb2JqOwotCQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKHdwKSkKLQkJCQkJCW5ld0xpc3QuYWRkKHdwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobmV3TGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yIGNtZCA9IG5ldyBBc3NpZ25XUFRvVGFza0Rlc2NyaXB0b3IoCi0JCQkJCQkoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQsIG5ld0xpc3QsCi0JCQkJCQlJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfRVhURVJOQUxfSU5QVVQsCi0JCQkJCQlnZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEl0ZW1zNChqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtczQoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yIGNtZCA9IG5ldyBBc3NpZ25XUFRvVGFza0Rlc2NyaXB0b3IoCi0JCQkJCShUYXNrRGVzY3JpcHRvcikgZWxlbWVudCwgaXRlbXMsCi0JCQkJCUlBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9PVVRQVVQsIGdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNyZW1vdmVJdGVtczEoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXMxKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCVJlbW92ZURlc2NyaXB0b3JDb21tYW5kIGNtZCA9IG5ldyBSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZChlbGVtZW50LAotCQkJCQlpdGVtcywgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVCk7Ci0JCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNyZW1vdmVJdGVtczIoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXMyKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCVJlbW92ZURlc2NyaXB0b3JDb21tYW5kIGNtZCA9IG5ldyBSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZChlbGVtZW50LAotCQkJCQlpdGVtcywgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUKTsKLQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI3JlbW92ZUl0ZW1zMyhqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtczMoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQgY21kID0gbmV3IFJlbW92ZURlc2NyaXB0b3JDb21tYW5kKGVsZW1lbnQsCi0JCQkJCWl0ZW1zLCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQpOwotCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jcmVtb3ZlSXRlbXM0KGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zNChMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZCBjbWQgPSBuZXcgUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQoZWxlbWVudCwKLQkJCQkJaXRlbXMsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQpOwotCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RXhpc3RpbmdFbGVtZW50czEoKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMxKCkgewotCQlyZXR1cm4gKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0TWFuZGF0b3J5SW5wdXQoKTsKLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEV4aXN0aW5nRWxlbWVudHMyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzMigpIHsKLQkJcmV0dXJuICgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldE9wdGlvbmFsSW5wdXQoKTsKLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEV4aXN0aW5nRWxlbWVudHMzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzMygpIHsKLQkJcmV0dXJuICgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldEV4dGVybmFsSW5wdXQoKTsKLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEV4aXN0aW5nRWxlbWVudHM0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzNCgpIHsKLQkJcmV0dXJuICgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldE91dHB1dCgpOwotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0UHJvY2VzcygpCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IG9iaiA9IFByb2Nlc3NVdGlsLmdldFJvb3RQcm9jZXNzKGFGYWN0b3J5LCBhZGFwdGVyLCBlbGVtZW50KTsKLQkJcmV0dXJuIChQcm9jZXNzKSBvYmo7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEZpbHRlckZvckRlc2NyaXB0b3JzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBEZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcihnZXRDb25maWd1cmF0aW9uKCkpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJTGlzdCBsaXN0MSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZ2V0QWN0aXZpdGllc0luU2NvcGUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgZWxlbWVudCwgbGlzdDEpOwotCQkJCQlpZiAobGlzdDEuY29udGFpbnMob2JqKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkRnJvbVByb2Nlc3NJdGVtczEoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczEoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldE9wdGlvbmFsSW5wdXQoKSk7Ci0JCQlpdGVtcy5yZW1vdmVBbGwoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0RXh0ZXJuYWxJbnB1dCgpKTsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZWxlbWVudCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSwKLQkJCQkJaXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRGcm9tUHJvY2Vzc0l0ZW1zMihqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zMihMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlpdGVtcy5yZW1vdmVBbGwoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0TWFuZGF0b3J5SW5wdXQoKSk7Ci0JCQlpdGVtcy5yZW1vdmVBbGwoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0RXh0ZXJuYWxJbnB1dCgpKTsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZWxlbWVudCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpLAotCQkJCQlpdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEZyb21Qcm9jZXNzSXRlbXMzKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXMzKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWl0ZW1zLnJlbW92ZUFsbCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRNYW5kYXRvcnlJbnB1dCgpKTsKLQkJCWl0ZW1zLnJlbW92ZUFsbCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRPcHRpb25hbElucHV0KCkpOwotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCBlbGVtZW50LAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCksCi0JCQkJCWl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkRnJvbVByb2Nlc3NJdGVtczQoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczQoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCBlbGVtZW50LAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSwgaXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXREZXNjcmlwdG9yVGFiTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdG9yVGFiTmFtZSgpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUlM7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1RlYW1Qcm9maWxlUm9sZVNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UZWFtUHJvZmlsZVJvbGVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ODRhZjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1RlYW1Qcm9maWxlUm9sZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkRlc2NyaXB0b3JQcm9jZXNzRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQ29tcG9zaXRlUm9sZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5BZGRSb2xlVG9UZWFtQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotLyoqCi0gKiBUaGUgdGVhbSBwcm9maWxlIC0gcm9sZS9jb21wb3NpdGUgcm9sZSBzZWN0aW9uCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRlYW1Qcm9maWxlUm9sZVNlY3Rpb24gZXh0ZW5kcyBPQlNSZWxhdGlvblNlY3Rpb24gewotCi0JTGlzdCByb2xlTGlzdCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LAotCQkJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlMaXN0IHRlYW1Sb2xlcyA9ICgoVGVhbVByb2ZpbGUpIGVsZW1lbnQpLmdldFRlYW1Sb2xlcygpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHRlYW1Sb2xlcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0b3IubmV4dCgpOwotCQkJCQlpZiAoKHJvbGVEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpCi0JCQkJCQkJfHwgKHJvbGVEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpKQotCQkJCQkJbmV3TGlzdC5hZGQocm9sZURlc2MpOwotCQkJCX0KLQotCQkJCS8vIHJldHVybiAoKFRlYW1Qcm9maWxlKWVsZW1lbnQpLmdldFRlYW1Sb2xlcygpLnRvQXJyYXkoKTsKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KG5ld0xpc3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJZWxlbWVudCA9IChUZWFtUHJvZmlsZSkgZWxlbWVudDsKLQotCQlzZXRUYWJEYXRhKFByb3BlcnRpZXNSZXNvdXJjZXMuVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uVGl0bGUsIAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb24sCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5UZWFtUHJvZmlsZV9Sb2xlX1RhYmxlMSk7IAotCQlzaG93QWRkRnJvbVByb2Nlc3NCdXR0b24gPSB0cnVlOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQlzdXBlci5yZWZyZXNoKCk7Ci0JCQkJZWxlbWVudCA9IChUZWFtUHJvZmlsZSkgZ2V0RWxlbWVudCgpOwotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKCJFcnJvciByZWZyZXNoaW5nIFRlYW0gUHJvZmlsZSByb2xlIHNlY3Rpb24gIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNQYXJ0T2ZUZWFtKFJvbGUgcm9sZSwgVGVhbVByb2ZpbGUgdGVhbSkgewotCQlMaXN0IHRlYW1Sb2xlcyA9IHRlYW0uZ2V0VGVhbVJvbGVzKCk7Ci0JCUxpc3Qgcm9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHRlYW1Sb2xlcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdG9yLm5leHQoKTsKLQkJCXJvbGVzLmFkZChyb2xlRGVzYy5nZXRSb2xlKCkpOwotCQl9Ci0KLQkJaWYgKHJvbGVzLmNvbnRhaW5zKHJvbGUpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGQoTGlzdCBpdGVtcykgewotCQlpZiAoaXRlbXMgIT0gbnVsbCkgewotCQkJTGlzdCByb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCWlmICgob2JqIGluc3RhbmNlb2YgUm9sZSkKLQkJCQkJCSYmICghaXNQYXJ0T2ZUZWFtKChSb2xlKSBvYmosIChUZWFtUHJvZmlsZSkgZWxlbWVudCkpKSB7Ci0JCQkJCXJvbGVzLmFkZCgoUm9sZSkgb2JqKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghcm9sZXMuaXNFbXB0eSgpKSB7Ci0JCQkJQWRkUm9sZVRvVGVhbUNvbW1hbmQgY21kID0gbmV3IEFkZFJvbGVUb1RlYW1Db21tYW5kKAotCQkJCQkJKFRlYW1Qcm9maWxlKSBlbGVtZW50LCByb2xlcyk7Ci0JCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRGcm9tUHJvY2VzcyhMaXN0IGl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJaWYgKGl0ZW1zICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJCQlDb21wb3NpdGVSb2xlIGNvbXBSb2xlID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkuY3JlYXRlQ29tcG9zaXRlUm9sZSgoQ29tcG9zaXRlUm9sZSkgb2JqKTsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCQljb21wUm9sZSwgLTEpOwotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLAotCQkJCQkJCW9iaiwgLTEpOwotCQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJUm9sZSByb2xlID0gKChSb2xlRGVzY3JpcHRvcikgb2JqKS5nZXRSb2xlKCk7Ci0JCQkJCWlmIChyb2xlICE9IG51bGwpIHsKLQkJCQkJCWlmICghaXNQYXJ0T2ZUZWFtKHJvbGUsIChUZWFtUHJvZmlsZSkgZWxlbWVudCkpIHsKLQkJCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCQkuY3JlYXRlUm9sZURlc2NyaXB0b3Iocm9sZSk7Ci0JCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgZWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCQkJCXJvbGVEZXNjLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgZWxlbWVudCwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLAotCQkJCQkJCQkJCW9iaiwgLTEpOwotCi0JCQkJCQkvLyBmaXJlIE5vdGlmaWNhdGlvbgotCQkJCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCQkJCUFjdGl2aXR5IHBhcmVudCA9IChBY3Rpdml0eSkgZ2V0UGFyZW50QWN0aXZpdHkoZWxlbWVudCk7Ci0JCQkJCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBhZGFwdGVyLmdldENoaWxkcmVuKHBhcmVudCk7Ci0KLQkJCQkJCWZpcmVOb3RpZmljYXRpb24oY2hpbGRyZW4sIChSb2xlRGVzY3JpcHRvcikgb2JqKTsKLQotCQkJCQl9IGVsc2UgewotCQkJCQkJTWVzc2FnZUZvcm1hdCBtZiA9IG5ldyBNZXNzYWdlRm9ybWF0KAotCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfVGVhbUFzc2lnbkVycm9yKTsgCi0JCQkJCQlPYmplY3RbXSBhcmdzID0geyAoKFJvbGVEZXNjcmlwdG9yKSBvYmopLmdldE5hbWUoKSwKLQkJCQkJCQkJKChUZWFtUHJvZmlsZSkgZWxlbWVudCkuZ2V0TmFtZSgpIH07Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUluZm8oCi0JCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0Fzc2lnbm1lbnRJbmZvVGl0bGUsIG1mLmZvcm1hdChhcmdzKSk7IAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVOb3RpZmljYXRpb24oQ29sbGVjdGlvbiBjaGlsZHJlbiwgUm9sZURlc2NyaXB0b3Igcm9sZURlc2MpIHsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCS5hZGFwdCgoQWN0aXZpdHkpIG9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQljaGlsZHJlbiA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oKEFjdGl2aXR5KSBvYmopOwotCQkJCWZpcmVOb3RpZmljYXRpb24oY2hpbGRyZW4sIHJvbGVEZXNjKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlPYmplY3QgbzEgPSAoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VmFsdWUoKTsKLQkJCQlBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIgYWN0aXZpdHlBZGFwdGVyID0gKEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqOwotCQkJCWZpcmVOb3RpZmljYXRpb24oYWN0aXZpdHlBZGFwdGVyLmdldENoaWxkcmVuKG8xKSwgcm9sZURlc2MpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCVJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciBwcm92aWRlciA9IChSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIG9iajsKLQkJCQlpZiAoKChSb2xlRGVzY3JpcHRvcikgcHJvdmlkZXIuZ2V0VmFsdWUoKSkuZ2V0Um9sZSgpLmVxdWFscygKLQkJCQkJCXJvbGVEZXNjLmdldFJvbGUoKSkpIHsKLQkJCQkJcHJvdmlkZXIuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbigKLQkJCQkJCQluZXcgTm90aWZpY2F0aW9uSW1wbChOb3RpZmljYXRpb24uU0VULCBwcm92aWRlciwKLQkJCQkJCQkJCXByb3ZpZGVyKSwgcHJvdmlkZXIsIGZhbHNlLCB0cnVlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNyZW1vdmUoamF2YS51dGlsLkFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSAoT2JqZWN0KSBpdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCQkoUm9sZURlc2NyaXB0b3IpIG9iaiwgLTEpOwotCQkJCX0KLQotCQkJCS8vIGZpbmQgbWF0Y2hpbmcgcm9sZURlc2NyaXB0b3IgaW4gdGVhbSByb2xlcwotCQkJCUxpc3Qgcm9sZURlc2NMaXN0ID0gZmluZFJvbGVEZXNjcmlwdG9yKChPYmplY3QpIG9iaik7Ci0JCQkJZm9yIChJdGVyYXRvciByb2xlRGVzY0l0b3IgPSByb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgcm9sZURlc2NJdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgcm9sZURlc2NJdG9yCi0JCQkJCQkJLm5leHQoKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJCQlyb2xlRGVzYywgLTEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgTGlzdCBmaW5kUm9sZURlc2NyaXB0b3IoT2JqZWN0IG9iaikgewotCQlMaXN0IHRlYW1Sb2xlcyA9ICgoVGVhbVByb2ZpbGUpIGVsZW1lbnQpLmdldFRlYW1Sb2xlcygpOwotCQlMaXN0IHJvbGVEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gdGVhbVJvbGVzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0b3JPYmplY3QgPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQkJaWYgKGl0b3JPYmplY3QgaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQkJCUxpc3QgZmlyc3RPYmplY3RBZ2dSb2xlcyA9ICgoQ29tcG9zaXRlUm9sZSkgb2JqKQotCQkJCQkJCS5nZXRBZ2dyZWdhdGVkUm9sZXMoKTsKLQkJCQkJTGlzdCBzZWNvbmRPYmplY3RBZ2dSb2xlcyA9ICgoQ29tcG9zaXRlUm9sZSkgaXRvck9iamVjdCkKLQkJCQkJCQkuZ2V0QWdncmVnYXRlZFJvbGVzKCk7Ci0JCQkJCWlmIChmaXJzdE9iamVjdEFnZ1JvbGVzLmVxdWFscyhzZWNvbmRPYmplY3RBZ2dSb2xlcykpIHsKLQkJCQkJCXJvbGVEZXNjTGlzdC5hZGQoaXRvck9iamVjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKChpdG9yT2JqZWN0IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpCi0JCQkJCQkmJiAoIShpdG9yT2JqZWN0IGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkpKSB7Ci0JCQkJCU9iamVjdCBvYmpSb2xlID0gKChSb2xlRGVzY3JpcHRvcikgb2JqKS5nZXRSb2xlKCk7Ci0JCQkJCU9iamVjdCBpdG9yT2JqUm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIGl0b3JPYmplY3QpCi0JCQkJCQkJLmdldFJvbGUoKTsKLQkJCQkJaWYgKG9ialJvbGUuZXF1YWxzKGl0b3JPYmpSb2xlKSkgewotCQkJCQkJcm9sZURlc2NMaXN0LmFkZChpdG9yT2JqZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByb2xlRGVzY0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI29wZW5BZGREaWFsb2coKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9wZW5BZGREaWFsb2coKSB7Ci0JCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IFByb2Nlc3NVdGlsCi0JCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50TGlzdCgoKFRlYW1Qcm9maWxlKSBlbGVtZW50KQotCQkJCQkJLmdldFRlYW1Sb2xlcygpKTsKLQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBnZXRGaWx0ZXIoKSwgZWxlbWVudCwKLQkJCQlGaWx0ZXJDb25zdGFudHMuUk9MRV9ERVNDUklQVE9SUywgZXhpc3RpbmdFbGVtZW50cyk7Ci0JCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuUk9MRVMpOwotCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nW117RmlsdGVyQ29uc3RhbnRzLlJPTEVTfTsKLQkJZmQuc2V0VHlwZXMoc3RyKTsKLQkJZmQub3BlbigpOwotCQlhZGQoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jb3BlbkFkZEZyb21Qcm9jZXNzRGlhbG9nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQWRkRnJvbVByb2Nlc3NEaWFsb2coKSB7Ci0JCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9ICgoVGVhbVByb2ZpbGUpIGVsZW1lbnQpLmdldFRlYW1Sb2xlcygpOwotCQlQcm9jZXNzIHByb2Nlc3MgPSAoUHJvY2VzcykgZ2V0UHJvY2VzcyhlbGVtZW50KTsKLQkJSUZpbHRlciBkZXNjcmlwdG9yRmlsdGVyID0gZ2V0RGVzY3JpcHRvckZpbHRlcigpOwotCi0JCWlmIChkZXNjcmlwdG9yRmlsdGVyICE9IG51bGwgJiYgcHJvY2VzcyAhPSBudWxsKSB7Ci0JCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQlkZXNjcmlwdG9yRmlsdGVyLCBwcm9jZXNzLAotCQkJCQlGaWx0ZXJDb25zdGFudHMuUk9MRV9ERVNDUklQVE9SUywgZXhpc3RpbmdFbGVtZW50cyk7Ci0JCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5ST0xFX0RFU0NSSVBUT1JTKTsKLQkJCWZkLm9wZW4oKTsKLQkJCWFkZEZyb21Qcm9jZXNzKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgcGFyZW50IEZpbmQgcGFyZW50IHVudGlsIGl0J3MgYWN0aXZpdHkuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICogCQkJUHJvY2VzcwotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvY2VzcyhCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQpIHsKLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJcmV0dXJuIHBhcmVudDsKLQotCQl9IGVsc2UgewotCQkJcmV0dXJuIGdldFByb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgZGVzY3JpcHRvciBmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXREZXNjcmlwdG9yRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IERlc2NyaXB0b3JQcm9jZXNzRmlsdGVyKGdldENvbmZpZ3VyYXRpb24oKSkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJCUxpc3QgcGFyZW50c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWdldEFjdGl2aXRpZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCBlbGVtZW50LCBwYXJlbnRzTGlzdCk7Ci0JCQkJCWlmIChwYXJlbnRzTGlzdC5jb250YWlucyhvYmopKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWlmIChvYmouZXF1YWxzKGdldFBhcmVudEFjdGl2aXR5KGVsZW1lbnQpKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlMaXN0IGNoaWxkTGlzdCA9ICgoQWN0aXZpdHkpIG9iaikuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCQkJaWYgKGNoaWxkTGlzdC5jb250YWlucyhnZXRQYXJlbnRBY3Rpdml0eShlbGVtZW50KSkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJTGlzdCBsaXN0ID0gZ2V0QWxsb3dhYmxlQWN0aXZpdGllcygpOwotCQkJCQlpZiAobGlzdC5jb250YWlucyhvYmopKXsKLQkJCQkJCXJldHVybiB0cnVlOwotLy8JCQkJCQlMaXN0IGJlbGVtZW50cyA9ICgoQWN0aXZpdHkpb2JqKS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotLy8JCQkJCQlpZighYmVsZW1lbnRzLmlzRW1wdHkoKSl7Ci0vLwkJCQkJCQlpZihjb250YWluc1R5cGUoYmVsZW1lbnRzLCBSb2xlRGVzY3JpcHRvci5jbGFzcywKLS8vCQkJCQkJCQkJCQlnZXRIZWxwZXIoKSkpCi0vLwkJCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQlPYmplY3QgcGFyZW50QWN0aXZpdHkgPSBnZXRQYXJlbnRBY3Rpdml0eSgoQnJlYWtkb3duRWxlbWVudCkgb2JqKTsKLQkJCQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudEFjdGl2aXR5KGVsZW1lbnQpOwotCQkJCQlpZiAocGFyZW50LmVxdWFscyhwYXJlbnRBY3Rpdml0eSkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQotCQkJCQlpZiAocGFyZW50QWN0aXZpdHkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJaWYgKGdldEJhc2VBY3Rpdml0aWVzKChBY3Rpdml0eSkgcGFyZW50KS5jb250YWlucygKLQkJCQkJCQkJcGFyZW50QWN0aXZpdHkpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJaWYgKGdldEFsbG93YWJsZUFjdGl2aXRpZXMoKS5jb250YWlucyhwYXJlbnRBY3Rpdml0eSkpCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJT2JqZWN0IG9iamVjdCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCQkuZ2V0UGFyZW50KG9iaik7Ci0JCQkJCWlmIChnZXRQYXJlbnRBY3Rpdml0eShlbGVtZW50KS5lcXVhbHMob2JqZWN0KSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCQl8fCBvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQlvYmplY3QgPSAoKEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqZWN0KQotCQkJCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZ2V0QWxsb3dhYmxlQWN0aXZpdGllcygpLmNvbnRhaW5zKG9iamVjdCkpCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlPYmplY3QgcGFyZW50ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJCS5nZXRQYXJlbnQob2JqKTsKLQkJCQkJaWYgKGdldFBhcmVudEFjdGl2aXR5KGVsZW1lbnQpLmVxdWFscyhwYXJlbnQpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCU9iamVjdCBvYmplY3QgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJTGlzdCBsaXN0ID0gZ2V0QWxsb3dhYmxlQWN0aXZpdGllcygpOwotCQkJCQkJaWYgKGxpc3QuY29udGFpbnMob2JqZWN0KSl7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQkJCQlMaXN0IGJlbGVtZW50cyA9ICgoQWN0aXZpdHkpb2JqKS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotLy8JCQkJCQkJaWYoIWJlbGVtZW50cy5pc0VtcHR5KCkpewotLy8JCQkJCQkJCWlmKGNvbnRhaW5zVHlwZShiZWxlbWVudHMsIFJvbGVEZXNjcmlwdG9yLmNsYXNzLGdldEhlbHBlcigpKSkKLS8vCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCQotCXByaXZhdGUgTGlzdCBnZXRCYXNlQWN0aXZpdGllcyhBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlICghYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkJCQkuZXF1YWxzKFZhcmlhYmlsaXR5VHlwZS5OQSkpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGFjdGl2aXR5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCQkJaWYgKCh2ZSAhPSBudWxsKSAmJiAodmUgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQotCQkJCWxpc3QuYWRkKHZlKTsKLQotCQkJCWFjdGl2aXR5ID0gKEFjdGl2aXR5KSB2ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogR2V0IHBhcmVudCBhY3Rpdml0eSBmb3IgYnJlYWtkb3duZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBickVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICogCQkJUGFyZW50IGFjdGl2aXR5Ci0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0UGFyZW50QWN0aXZpdHkoQnJlYWtkb3duRWxlbWVudCBickVsZW1lbnQpIHsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoYnJFbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlickVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50OwotCQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChickVsZW1lbnQsCi0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYWxsIGNoaWxkcmVuIG9mIHRoZSBhY3Rpdml0eSBwYXJlbnQgcmVjdXJzaXZlbHkuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBhY3Rpdml0eUxpc3QKLQkgKi8KLQlwcml2YXRlIHZvaWQgZ2V0Q2hpbGRBY3Rpdml0aWVzSW5TY29wZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUFjdGl2aXR5IHBhcmVudCwgTGlzdCBhY3Rpdml0eUxpc3QpIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQotCQlPYmplY3QgbyA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJaWYgKG8gaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIG87Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJYWN0aXZpdHlMaXN0LmFkZChvYmopOwotCQkJCWdldENoaWxkQWN0aXZpdGllc0luU2NvcGUoYWRhcHRlckZhY3RvcnksIChBY3Rpdml0eSkgb2JqLAotCQkJCQkJYWN0aXZpdHlMaXN0KTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlPYmplY3QgbzEgPSAoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VmFsdWUoKTsKLQkJCQkJYWN0aXZpdHlMaXN0LmFkZChvMSk7Ci0JCQkJCWdldENoaWxkQWN0aXZpdGllc0luU2NvcGUoYWRhcHRlckZhY3RvcnksIChBY3Rpdml0eSkgbzEsCi0JCQkJCQkJYWN0aXZpdHlMaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbnNUeXBlKExpc3QgbGlzdCwgQ2xhc3MgY2xhc3MxLCBGaWx0ZXJIZWxwZXIgaGVscGVyKSB7Ci0JCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyl7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAKLQkJCQkJJiYgY2xhc3MxLmlzSW5zdGFuY2Uob2JqKQotCQkJCQkmJiBoZWxwZXIubWF0Y2hlcihvYmopKSAKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQlyZXR1cm4gY29udGFpbnNUeXBlKCgoQWN0aXZpdHkpb2JqKS5nZXRCcmVha2Rvd25FbGVtZW50cygpLAotCQkJCQkJY2xhc3MxLCBoZWxwZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYWxsIGFjdGl2aXRpZXMgaW4gc2NvcGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQlMaXN0IG9mIGFjdGl2aXRpZXMgaW4gc2NvcGUKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0QWxsb3dhYmxlQWN0aXZpdGllcygpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBwYXJlbnQgYWN0aXZpdHkKLQkJT2JqZWN0IG9iamVjdCA9IGdldFBhcmVudEFjdGl2aXR5KGVsZW1lbnQpOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkvLyBnZXQgYWxsIGNoaWxkIGFjdGl2aXRpZXMgaW4gc2NvcGUKLQkJCWdldENoaWxkQWN0aXZpdGllc0luU2NvcGUoYWRhcHRlckZhY3RvcnksIChBY3Rpdml0eSkgb2JqZWN0LCBsaXN0KTsKLQkJfQotCQkvLyBnZXQgYmFzZSBhY3Rpdml0aWVzIGZvciBhbGwgYWN0aXZpdGllcyBpbiBzY29wZQotCQlIYXNoU2V0IGJhc2VBY3RpdnRpZXMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJYmFzZUFjdGl2dGllcy5hZGRBbGwoZ2V0QmFzZUFjdGl2aXRpZXMoKEFjdGl2aXR5KSBvYmopKTsKLQkJCX0KLQkJfQotCi0JCS8vIHJldHVybiBjb21wbGV0ZSBsaXN0IG9mIGNoaWxkIGFjdGl2aXRpZXMgYW5kIGl0J3MgYmFzZSBhY3Rpdml0aWVzCi0JCWxpc3QuYWRkQWxsKGJhc2VBY3RpdnRpZXMpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1dvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4OWQyNjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1dvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5XcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db2x1bW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJlZGVjZXNzb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib0JveENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogVGhlIGdlbmVyYWwgdGFiIHNlY3Rpb24gZm9yIFdvcmtCcmVha2Rvd25FbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24gZXh0ZW5kcwotCQlCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24gewotCXByb3RlY3RlZCBXb3JrQnJlYWtkb3duRWxlbWVudCBlbGVtZW50OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBldmVudERyaXZlbkJ1dHRvbiwgb25nb2luZ0J1dHRvbiwgcmVwZWF0YWJsZUJ1dHRvbjsKLQotCS8vIHByb3RlY3RlZCBUZXh0IHByZWRlY2Vzc29yVGV4dDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGFkZEJ1dHRvbiwgZWRpdEJ1dHRvbiwgcmVtb3ZlQnV0dG9uOwotCi0JLy8gcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBldmVudERyaXZlbkJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyOwotCS8vIHByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgb25nb2luZ0J1dHRvblNlbGVjdGlvbkxpc3RlbmVyOwotCS8vIHByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgcmVwZWF0YWJsZUJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyOwotCi0JLy8gcHJpdmF0ZSBMaXN0ZW5lciBwcmVkZWNlc3NvcnNMaXN0ZW5lcjsKLQotCS8vIHByaXZhdGUgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdmlld2VyOwotCi0JLy8gcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQlwcml2YXRlIFRleHRDZWxsRWRpdG9yIHRleHRDZWxsRWRpdG9yOwotCi0JcHJpdmF0ZSBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgaWRDZWxsRWRpdG9yOwotCi0JcHJpdmF0ZSBDb21ib0JveENlbGxFZGl0b3IgY29tYm9Cb3hDZWxsRWRpdG9yOwotCi0JLy8gcHJlZGVjZXNzb3IgbWFwIGxpc3QKLQlwcml2YXRlIExpc3QgcHJlZE1hcExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGNsYXNzIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBleHRlbmRzIFRleHRDZWxsRWRpdG9yIHsKLQkJcHJvdGVjdGVkIE9iamVjdCBsYXN0SW52YWxpZEVsZW1lbnQ7Ci0KLQkJcHJpdmF0ZSBpbnQgY29sdW1uSW5kZXg7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBwYXJlbnQKLQkJICovCi0JCXB1YmxpYyBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIocGFyZW50KTsKLQkJfQotCi0JCXZvaWQgc2V0Q29sdW1uSW5kZXgoaW50IGNvbHVtbkluZGV4KSB7Ci0JCQl0aGlzLmNvbHVtbkluZGV4ID0gY29sdW1uSW5kZXg7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvbHVtbkluZGV4KCkgewotCQkJcmV0dXJuIGNvbHVtbkluZGV4OwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRMYXN0SW52YWxpZEVsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gbGFzdEludmFsaWRFbGVtZW50OwotCQl9Ci0KLQkJU3RyaW5nIGlzVmFsaWQoU3RyaW5nIHR4dCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCU9iamVjdCBlID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBtc2cgPSBpc1ZhbGlkKGUsIHR4dCk7Ci0JCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCWxhc3RJbnZhbGlkRWxlbWVudCA9IGU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbGFzdEludmFsaWRFbGVtZW50ID0gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIG1zZzsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFN0cmluZyBpc1ZhbGlkKE9iamVjdCBlLCBTdHJpbmcgdHh0KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKiBEZXBlbmRlbmN5IExpdGVyYWxzICogKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOSVNIX1RPX1NUQVJUID0gUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19TVEFSVDsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOSVNIX1RPX0ZJTklTSCA9IFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fRklOSVNIOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9UT19TVEFSVCA9IFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya09yZGVyVHlwZV9TVEFSVF9UT19TVEFSVDsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVE9fRklOSVNIID0gUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX0ZJTklTSDsgCi0KLQkvKiogQ29sdW1uIGlkcyAqICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9JRCA9IElCU0l0ZW1Qcm92aWRlci5DT0xfSUQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX1BSRVNFTlRBVElPTl9OQU1FID0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfREVQRU5ERU5DWSA9ICJkZXBlbmRlbmN5IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqIENvbHVtbiBkZXNjcmlwdG9yIGNvbnN0YW50cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19JRCA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJQ09MX0lELAotCQkJUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9JRF9URVhULCAwLCAxMDAsIHRydWUsIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhULCBTV1QuQ0VOVEVSKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfUFJFU0VOVEFUSU9OX05BTUUgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUNPTF9QUkVTRU5UQVRJT05fTkFNRSwKLQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfUFJFU0VOVEFUSU9OX05BTUVfVEVYVCwgMSwgMjUwLCB0cnVlLCBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfTk9ORSk7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX0RFUEVOREVOQ1kgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUNPTF9ERVBFTkRFTkNZLAotCQkJUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9ERVBFTkRFTkNZX1RFWFQsIDIsIDEwMCwgdHJ1ZSwgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NPTUJPX0JPT0xFQU4pOyAKLQotCUNvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5EZXNjcmlwdG9ycyA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yW10gewotCQkJQ09MX0RFU0NfSUQsIENPTF9ERVNDX1BSRVNFTlRBVElPTl9OQU1FLCBDT0xfREVTQ19ERVBFTkRFTkNZIH07Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDZWxsRWRpdG9yVmFsaWRhdG9yIGltcGxlbWVudHMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgewotCi0JCXByaXZhdGUgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIGNlbGxFZGl0b3I7Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHVibGljIENlbGxFZGl0b3JWYWxpZGF0b3IoVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIGNlbGxFZGl0b3IpIHsKLQkJCXRoaXMuY2VsbEVkaXRvciA9IGNlbGxFZGl0b3I7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKE9iamVjdCB2YWx1ZSkgewotCQkJcmV0dXJuIGNlbGxFZGl0b3IuaXNWYWxpZCgoU3RyaW5nKSB2YWx1ZSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgY2xhc3MgVmFsaWRhdGluZ0RlYWN0aXZhdGVMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQkJcHJpdmF0ZSBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgY2VsbEVkaXRvcjsKLQotCQlWYWxpZGF0aW5nRGVhY3RpdmF0ZUxpc3RlbmVyKFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBjZWxsRWRpdG9yKSB7Ci0JCQl0aGlzLmNlbGxFZGl0b3IgPSBjZWxsRWRpdG9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiVmFsaWRhdERlYWN0aXZhdGVlOjpydW4iKTsKLQkJCQkJaWYgKGNlbGxFZGl0b3IuZ2V0TGFzdEludmFsaWRFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBjZWxsRWRpdG9yLmdldEVycm9yTWVzc2FnZSgpOwotCQkJCQkJU3RyaW5nIHRpdGxlID0gZ2V0RWRpdG9yKCkuZ2V0VGl0bGUoKTsKLQkJCQkJCVN0cmluZyBwcm9ibGVtID0gUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfdGV4dEVkaXRDZWxsX3Byb2JsZW1fbXNnOyAKLQkJCQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpOwotCQkJCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgcHJvYmxlbSwgbWVzc2FnZSk7IAotCQkJCQkJdmlld2VyLmVkaXRFbGVtZW50KGNlbGxFZGl0b3IuZ2V0TGFzdEludmFsaWRFbGVtZW50KCksCi0JCQkJCQkJCWNlbGxFZGl0b3IuZ2V0Q29sdW1uSW5kZXgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQotCQkvLyBnZXQgd29ya2JyZWFrZG93bmVsZW1lbnQgb2JqZWN0Ci0JCWVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jY3JlYXRlR2VuZXJhbFNlY3Rpb24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdlbmVyYWxTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJc3VwZXIuY3JlYXRlR2VuZXJhbFNlY3Rpb24oY29tcG9zaXRlKTsKLQotCQkvLyBFdmVudCBEcml2ZW4KLQkJZXZlbnREcml2ZW5CdXR0b24gPSBGb3JtVUkuY3JlYXRlQ2hlY2tCdXR0b24odG9vbGtpdCwgY2hlY2tCb3hDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCWV2ZW50RHJpdmVuQnV0dG9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrQnJlYWtkb3duRWxlbWVudF9FdmVudERyaXZlbik7IAotCi0JCS8vIE9uZ29pbmcKLQkJb25nb2luZ0J1dHRvbiA9IEZvcm1VSS5jcmVhdGVDaGVja0J1dHRvbih0b29sa2l0LCBjaGVja0JveENvbXBvc2l0ZSwKLQkJCQkxKTsKLQkJb25nb2luZ0J1dHRvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya0JyZWFrZG93bkVsZW1lbnRfT25nb2luZyk7IAotCi0JCS8vIHJlcGVhdGFibGUKLQkJcmVwZWF0YWJsZUJ1dHRvbiA9IEZvcm1VSS5jcmVhdGVDaGVja0J1dHRvbih0b29sa2l0LCBjaGVja0JveENvbXBvc2l0ZSwKLQkJCQkyKTsKLQkJcmVwZWF0YWJsZUJ1dHRvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya0JyZWFrZG93bkVsZW1lbnRfUmVwZWF0YWJsZSk7IAotCi0JCS8vIHByZWRlY2Vzc29ycwotCQkvLyBGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJLy8gUHJvcGVydGllc1Jlc291cmNlcy5nZXRTdHJpbmcoIldvcmtCcmVha2Rvd25FbGVtZW50LlByZWRlY2Vzc29ycyIpKTsKLQkJLy8gcHJlZGVjZXNzb3JUZXh0ID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJLy8gU1dULkRFRkFVTFQsIGhvcml6b250YWxTcGFuKTsKLQkJLy8gcHJlZGVjZXNzb3JUZXh0LnNldFRleHQoZ2V0UHJlZGVjZXNzb3JzTGlzdCgpKTsKLQotCQkvLyBkZXBlbmVuY3kgdHlwZQotCi0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3kpOyAKLQotCQl0cnkgewotCQkJLy8gY3JlYXRlIHZpZXdlcgotCQkJY3JlYXRlVmlld2VyKGdlbmVyYWxDb21wb3NpdGUsIDIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkVycm9yIGNyZWF0aW5nIHZpZXdlciBmb3Igd29ya2JyZWFrZG93biBlbGVtZW50IGdlbmVyYWwgc2VjdGlvbjogIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBjcmVhdGUgYnV0dG9uIHBhbmUKLQkJQ29tcG9zaXRlIGJ1dHRvblBhbmUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShnZW5lcmFsQ29tcG9zaXRlKTsKLQkJYnV0dG9uUGFuZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKSk7Ci0JCWJ1dHRvblBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBidXR0b25QYW5lLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBidXR0b25QYW5lLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9BZGQpOyAKLQkJZWRpdEJ1dHRvbiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgYnV0dG9uUGFuZSwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfRWRpdCk7IAotCQlyZW1vdmVCdXR0b24gPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIGJ1dHRvblBhbmUsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X1JlbW92ZSk7IAotCQllZGl0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQotCQlldmVudERyaXZlbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2YoZXZlbnREcml2ZW5CdXR0b24uZ2V0U2VsZWN0aW9uKCkpLCAtMSk7Ci0JCQkJaWYgKCFzdGF0dXMpCi0JCQkJCWV2ZW50RHJpdmVuQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50LmdldElzRXZlbnREcml2ZW4oKQotCQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJb25nb2luZ0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKSwgQm9vbGVhbgotCQkJCQkJCQkudmFsdWVPZihvbmdvaW5nQnV0dG9uLmdldFNlbGVjdGlvbigpKSwgLTEpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCQlvbmdvaW5nQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50LmdldElzT25nb2luZygpCi0JCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlyZXBlYXRhYmxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllbGVtZW50ID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzUmVwZWF0YWJsZSgpLAotCQkJCQkJQm9vbGVhbi52YWx1ZU9mKHJlcGVhdGFibGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpLCAtMSk7Ci0JCQkJaWYgKCFzdGF0dXMpCi0JCQkJCXJlcGVhdGFibGVCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0SXNSZXBlYXRhYmxlKCkKLQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCWFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gTGlzdCBwcmVkTGlzdCA9IGVsZW1lbnQuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKTsKLQkJCQlXb3JrT3JkZXIgbyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtPcmRlcigpOwotCQkJCW8uc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fU1RBUlQpOwotCi0JCQkJLy8gcHJlZExpc3QuYWRkKG8pOwotCi0JCQkJUHJlZGVjZXNzb3JNYXAgbWFwID0gbmV3IFByZWRlY2Vzc29yTWFwKC0xLCAoV29ya09yZGVyKSBvKTsKLQkJCQlwcmVkTWFwTGlzdC5hZGQobWFwKTsKLQotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJdmlld2VyLmVkaXRFbGVtZW50KG1hcCwgMCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCWVkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGdldCBzZWxlY3Rpb24KLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQlQcmVkZWNlc3Nvck1hcCBwcmVkTWFwID0gKFByZWRlY2Vzc29yTWFwKSBzZWxlY3Rpb24KLQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0QlNBZGFwdGVyKCk7Ci0JCQkJCU9iamVjdCBwcm9jZXNzID0gYWRhcHRlci5nZXRUb3BJdGVtKCk7Ci0KLQkJCQkJUHJlZGVjZXNzb3JEaWFsb2cgZGxnID0gbmV3IFByZWRlY2Vzc29yRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkuZ2V0U2hlbGwoKSwgZWxlbWVudCwgcHJvY2VzcywgZ2V0QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQlwcmVkTWFwLCBwcmVkTWFwTGlzdCwgYWN0aW9uTWdyKTsKLQkJCQkJZGxnLm9wZW4oKTsKLQotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlyZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCVByZWRlY2Vzc29yTWFwIG1hcCA9IChQcmVkZWNlc3Nvck1hcCkgc2VsZWN0aW9uCi0JCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlwcmVkTWFwTGlzdC5yZW1vdmUobWFwKTsKLQotCQkJCQlXb3JrT3JkZXIgd28gPSBtYXAuZ2V0V29ya09yZGVyKCk7Ci0JCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHdiZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQl3YmUsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSwKLQkJCQkJCQkJCXdvLCAtMSk7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQl9Ci0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEgJiYgZWRpdGFibGUpIHsKLQkJCQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCWVkaXRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBwcmVkZWNlc3NvcnMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JLy8gcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZGVjZXNzb3JzTGlzdCgpCi0JLy8gewotCS8vIElCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0QlNBZGFwdGVyKCk7Ci0JLy8gcmV0dXJuIGFkYXB0ZXIuZ2V0QXR0cmlidXRlKGVsZW1lbnQsIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTKTsKLQkvLyB9Ci0JLy8gcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkKLQkvLyB7Ci0JLy8gc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0JLy8JCQotCS8vIGV2ZW50RHJpdmVuQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50RHJpdmVuQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIpOwotCS8vIG9uZ29pbmdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIob25nb2luZ0J1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQkvLyByZXBlYXRhYmxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHJlcGVhdGFibGVCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcik7Ci0JLy8gLy9wcmVkZWNlc3NvclRleHQuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIHByZWRlY2Vzc29yc0xpc3RlbmVyKTsKLQkvLyB9Ci0JLy8JCi0JLy8gcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTGlzdGVuZXJzKCkKLQkvLyB7Ci0JLy8gc3VwZXIucmVtb3ZlTGlzdGVuZXJzKCk7Ci0JLy8JCQkKLQkvLyBldmVudERyaXZlbkJ1dHRvbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihldmVudERyaXZlbkJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQkvLyBvbmdvaW5nQnV0dG9uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKG9uZ29pbmdCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcik7Ci0JLy8gcmVwZWF0YWJsZUJ1dHRvbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihyZXBlYXRhYmxlQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIpOwotCS8vIC8vcHJlZGVjZXNzb3JUZXh0LnJlbW92ZUxpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBwcmVkZWNlc3NvcnNMaXN0ZW5lcik7Ci0JLy8gfQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlzdXBlci51cGRhdGVDb250cm9scygpOwotCQlldmVudERyaXZlbkJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJb25nb2luZ0J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJcmVwZWF0YWJsZUJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJdmlld2VyLmdldFRhYmxlKCkuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWFkZEJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSAmJiBlZGl0YWJsZSkgewotCQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWVkaXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotLy8JCWlmICgoRVBGUHJvcGVydHlTaGVldFBhZ2UuZm9ybVBhZ2VJRAotLy8JCQkJLmVxdWFscyhQcm9jZXNzRWRpdG9yLlRBX0ZPUk1fSUQpKQotLy8JCQkJfHwgKEVQRlByb3BlcnR5U2hlZXRQYWdlLmZvcm1QYWdlSUQKLS8vCQkJCQkJLmVxdWFscyhQcm9jZXNzRWRpdG9yLldQQlNfRk9STV9JRCkpKSB7Ci0JCWlmICghKEVQRlByb3BlcnR5U2hlZXRQYWdlLmZvcm1QYWdlSUQuZXF1YWxzKFByb2Nlc3NFZGl0b3IuV0JTX0ZPUk1fSUQpIHx8IEVQRlByb3BlcnR5U2hlZXRQYWdlLmZvcm1QYWdlSUQKLQkJCQkuZXF1YWxzKFByb2Nlc3NFZGl0b3IuQ09OU09MSURBVEVEX0ZPUk1fSUQpKSkgewotCQkJYWRkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXZpZXdlci5nZXRUYWJsZSgpLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlzdXBlci5yZWZyZXNoKCk7Ci0JCQkJZWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCi0JCQkJZXZlbnREcml2ZW5CdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0SXNFdmVudERyaXZlbigpCi0JCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCQkJCW9uZ29pbmdCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0SXNPbmdvaW5nKCkKLQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmVwZWF0YWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRJc1JlcGVhdGFibGUoKQotCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQkvLyBwcmVkZWNlc3NvclRleHQuc2V0VGV4dChnZXRQcmVkZWNlc3NvcnNMaXN0KCkpOwotCi0JCQkJLy8gcmUtaW5pdGlhbGl6ZSBwcmVkTGlzdAotCQkJCXByZWRNYXBMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWluaXRpYWxpemVQcmVkTGlzdCgpOwotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciByZWZyZXNoaW5nIFdvcmticmVha2Rvd24gZWxlbWVudCBnZW5lcmFsIHNlY3Rpb246IiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBob3Jpem9udGFsU3BhbikgewotCQkvLyBjcmVhdGUgcHJvY2VzcyB2aWV3ZXIKLQkJdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gMTA7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSA1MDsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBzZXQgdXAgY29sdW1ucwotCQlTdHJpbmdbXSBjb2xQcm9wcyA9IG5ldyBTdHJpbmdbY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJY29sUHJvcHNbaV0gPSBjb2x1bW5EZXNjcmlwdG9yc1tpXS5pZDsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih2aWV3ZXIuZ2V0VGFibGUoKSwKLQkJCQkJY29sdW1uRGVzY3JpcHRvcnNbaV0uYWxpZ25tZW50KTsKLQkJCWNvbHVtbi5zZXRUZXh0KGNvbHVtbkRlc2NyaXB0b3JzW2ldLmxhYmVsKTsKLQkJCWNvbHVtbi5zZXRSZXNpemFibGUoY29sdW1uRGVzY3JpcHRvcnNbaV0ucmVzaXphYmxlKTsKLQkJCWNvbHVtbi5zZXRXaWR0aChjb2x1bW5EZXNjcmlwdG9yc1tpXS53aWR0aCk7Ci0KLQkJfQotCQl2aWV3ZXIuZ2V0VGFibGUoKS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl2aWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyhjb2xQcm9wcyk7Ci0KLQkJLy8gdGFibGUgPSB2aWV3ZXIuZ2V0VGFibGUoKTsKLQotCQkvLyBmaW5hbCBUYWJsZUN1cnNvciBjdXJzb3IgPSBuZXcgVGFibGVDdXJzb3IodGFibGUsIFNXVC5OT05FKTsKLQkJLy8gZmluYWwgQ29udHJvbEVkaXRvciBlZGl0b3IgPSBuZXcgQ29udHJvbEVkaXRvcihjdXJzb3IpOwotCQkvLyBlZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQkvLyBlZGl0b3IuZ3JhYlZlcnRpY2FsID0gdHJ1ZTsKLQotCQkvLyBmaW5hbCBUYWJsZUN1cnNvciBjdXJzb3IgPSBuZXcgVGFibGVDdXJzb3IodGFibGUsIFNXVC5OT05FKTsKLQkJLy8gLy8gY3JlYXRlIGFuIGVkaXRvciB0byBlZGl0IHRoZSBjZWxsIHdoZW4gdGhlIHVzZXIgaGl0cyAiRU5URVIiCi0JCS8vIC8vIHdoaWxlIG92ZXIgYSBjZWxsIGluIHRoZSB0YWJsZQotCQkvLyBmaW5hbCBDb250cm9sRWRpdG9yIGVkaXRvciA9IG5ldyBDb250cm9sRWRpdG9yKGN1cnNvcik7Ci0JCS8vIGVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCS8vIGVkaXRvci5ncmFiVmVydGljYWwgPSB0cnVlOwotCQkvLwotCQkvLyBjdXJzb3IuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCS8vIC8vIHdoZW4gdGhlIFRhYmxlRWRpdG9yIGlzIG92ZXIgYSBjZWxsLCBzZWxlY3QgdGhlIGNvcnJlc3BvbmRpbmcgcm93Ci0JCS8vIGluCi0JCS8vIC8vIHRoZSB0YWJsZQotCQkvLyBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCS8vIHRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10geyBjdXJzb3IuZ2V0Um93KCl9KTsKLQkJLy8gfQotCQkvLyAvLyB3aGVuIHRoZSB1c2VyIGhpdHMgIkVOVEVSIiBpbiB0aGUgVGFibGVDdXJzb3IsIHBvcCB1cCBhIHRleHQKLQkJLy8gZWRpdG9yIHNvIHRoYXQKLQkJLy8gLy8gdGhleSBjYW4gY2hhbmdlIHRoZSB0ZXh0IG9mIHRoZSBjZWxsCi0JCS8vIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCS8vIGZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KGN1cnNvciwgU1dULk5PTkUpOwotCQkvLyBUYWJsZUl0ZW0gcm93ID0gY3Vyc29yLmdldFJvdygpOwotCQkvLyBpbnQgY29sdW1uID0gY3Vyc29yLmdldENvbHVtbigpOwotCQkvLyB0ZXh0LnNldFRleHQocm93LmdldFRleHQoY29sdW1uKSk7Ci0JCS8vIHRleHQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCS8vIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkvLyAvLyBjbG9zZSB0aGUgdGV4dCBlZGl0b3IgYW5kIGNvcHkgdGhlIGRhdGEgb3ZlcgotCQkvLyAvLyB3aGVuIHRoZSB1c2VyIGhpdHMgIkVOVEVSIgotCQkvLyBpZiAoZS5jaGFyYWN0ZXIgPT0gU1dULkNSKSB7Ci0JCS8vIFRhYmxlSXRlbSByb3cgPSBjdXJzb3IuZ2V0Um93KCk7Ci0JCS8vIGludCBjb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uKCk7Ci0JCS8vIGlmIChjb2x1bW4gPT0gMSkgcmV0dXJuOwotCQkvLyByb3cuc2V0VGV4dChjb2x1bW4sIHRleHQuZ2V0VGV4dCgpKTsKLQkJLy8gdGV4dC5kaXNwb3NlKCk7Ci0JCS8vIH0KLQkJLy8gLy8gY2xvc2UgdGhlIHRleHQgZWRpdG9yIHdoZW4gdGhlIHVzZXIgaGl0cyAiRVNDIgotCQkvLyBpZiAoZS5jaGFyYWN0ZXIgPT0gU1dULkVTQykgewotCQkvLyB0ZXh0LmRpc3Bvc2UoKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0pOwotCQkvLyBlZGl0b3Iuc2V0RWRpdG9yKHRleHQpOwotCQkvLyB0ZXh0LnNldEZvY3VzKCk7Ci0JCS8vIH0KLQkJLy8gfSk7Ci0JCS8vIC8vIEhpZGUgdGhlIFRhYmxlQ3Vyc29yIHdoZW4gdGhlIHVzZXIgaGl0cyB0aGUgIkNUUkwiIG9yICJTSElGVCIga2V5LgotCQkvLyAvLyBUaGlzIGFsb3dzIHRoZSB1c2VyIHRvIHNlbGVjdCBtdWx0aXBsZSBpdGVtcyBpbiB0aGUgdGFibGUuCi0JCS8vIGN1cnNvci5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJLy8gcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCS8vIGlmIChlLmtleUNvZGUgPT0gU1dULkNUUkwKLQkJLy8gfHwgZS5rZXlDb2RlID09IFNXVC5TSElGVAotCQkvLyB8fCAoZS5zdGF0ZU1hc2sgJiBTV1QuQ09OVFJPTCkgIT0gMAotCQkvLyB8fCAoZS5zdGF0ZU1hc2sgJiBTV1QuU0hJRlQpICE9IDApIHsKLQkJLy8gY3Vyc29yLnNldFZpc2libGUoZmFsc2UpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfSk7Ci0JCS8vIC8vIFNob3cgdGhlIFRhYmxlQ3Vyc29yIHdoZW4gdGhlIHVzZXIgcmVsZWFzZXMgdGhlICJTSElGVCIgb3IgIkNUUkwiCi0JCS8vIGtleS4KLQkJLy8gLy8gVGhpcyBzaWduYWxzIHRoZSBlbmQgb2YgdGhlIG11bHRpcGxlIHNlbGVjdGlvbiB0YXNrLgotCQkvLyB0YWJsZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJLy8gcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkvLyBpZiAoZS5rZXlDb2RlID09IFNXVC5DT05UUk9MICYmIChlLnN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMCkKLQkJLy8gcmV0dXJuOwotCQkvLyBpZiAoZS5rZXlDb2RlID09IFNXVC5TSElGVCAmJiAoZS5zdGF0ZU1hc2sgJiBTV1QuQ09OVFJPTCkgIT0gMCkKLQkJLy8gcmV0dXJuOwotCQkvLyBpZiAoZS5rZXlDb2RlICE9IFNXVC5DT05UUk9MCi0JCS8vICYmIChlLnN0YXRlTWFzayAmIFNXVC5DT05UUk9MKSAhPSAwKQotCQkvLyByZXR1cm47Ci0JCS8vIGlmIChlLmtleUNvZGUgIT0gU1dULlNISUZUICYmIChlLnN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMCkKLQkJLy8gcmV0dXJuOwotCQkvLwotCQkvLyBUYWJsZUl0ZW1bXSBzZWxlY3Rpb24gPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJLy8gVGFibGVJdGVtIHJvdyA9IChzZWxlY3Rpb24ubGVuZ3RoID09IDApID8KLQkJLy8gdGFibGUuZ2V0SXRlbSh0YWJsZS5nZXRUb3BJbmRleCgpKSA6IHNlbGVjdGlvblswXTsKLQkJLy8gdGFibGUuc2hvd0l0ZW0ocm93KTsKLQkJLy8gY3Vyc29yLnNldFNlbGVjdGlvbihyb3csIDApOwotCQkvLyBjdXJzb3Iuc2V0VmlzaWJsZSh0cnVlKTsKLQkJLy8gY3Vyc29yLnNldEZvY3VzKCk7Ci0JCS8vIH0KLQkJLy8gfSk7Ci0KLQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcmVkTWFwTGlzdDo6IitwcmVkTWFwTGlzdCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJcmV0dXJuICgoTGlzdCkgcHJlZE1hcExpc3QpLnRvQXJyYXkoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0KLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iaiwgaW50IGkpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIldvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb246OmxhYmVsUHJvdmlkZXIKLQkJCQkvLyBPYmplY3QtICIgKyBvYmopOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcmVkZWNlc3Nvck1hcCkgewotCQkJCQlpbnQgaWQgPSAoKFByZWRlY2Vzc29yTWFwKSBvYmopLmdldElkKCk7Ci0JCQkJCVdvcmtPcmRlciB3byA9ICgoUHJlZGVjZXNzb3JNYXApIG9iaikuZ2V0V29ya09yZGVyKCk7Ci0KLQkJCQkJaWYgKGkgPT0gMCkgewotCQkJCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGlkKTsKLQkJCQkJfQotCQkJCQlpZiAoaSA9PSAxKSB7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAod28uZ2V0UHJlZCgpICE9IG51bGwpIHsKLQkJCQkJCQluYW1lID0gd28uZ2V0UHJlZCgpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQkJCQlpZiAoU3RyVXRpbC5pc0JsYW5rKG5hbWUpKSB7Ci0JCQkJCQkJCXJldHVybiB3by5nZXRQcmVkKCkuZ2V0TmFtZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXJldHVybiBuYW1lOwotCQkJCQl9Ci0JCQkJCWlmIChpID09IDIpIHsKLQkJCQkJCWlmICh3by5nZXRMaW5rVHlwZSgpID09IFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX0ZJTklTSCkKLQkJCQkJCQlyZXR1cm4gRklOSVNIX1RPX0ZJTklTSDsKLQkJCQkJCWVsc2UgaWYgKHdvLmdldExpbmtUeXBlKCkgPT0gV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fU1RBUlQpCi0JCQkJCQkJcmV0dXJuIEZJTklTSF9UT19TVEFSVDsKLQkJCQkJCWVsc2UgaWYgKHdvLmdldExpbmtUeXBlKCkgPT0gV29ya09yZGVyVHlwZS5TVEFSVF9UT19TVEFSVCkKLQkJCQkJCQlyZXR1cm4gU1RBUlRfVE9fU1RBUlQ7Ci0JCQkJCQllbHNlIGlmICh3by5nZXRMaW5rVHlwZSgpID09IFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fRklOSVNIKQotCQkJCQkJCXJldHVybiBTVEFSVF9UT19GSU5JU0g7Ci0JCQkJCQlyZXR1cm4gd28uZ2V0TGlua1R5cGUoKS5nZXROYW1lKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0KLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0KLQkJdGV4dENlbGxFZGl0b3IgPSBuZXcgVGV4dENlbGxFZGl0b3Iodmlld2VyLmdldFRhYmxlKCkpOwotCQljb21ib0JveENlbGxFZGl0b3IgPSBuZXcgQ29tYm9Cb3hDZWxsRWRpdG9yKHZpZXdlci5nZXRUYWJsZSgpLAotCQkJCW5ldyBTdHJpbmdbXSB7IEZJTklTSF9UT19TVEFSVCwgRklOSVNIX1RPX0ZJTklTSCwKLQkJCQkJCVNUQVJUX1RPX1NUQVJULCBTVEFSVF9UT19GSU5JU0ggfSk7Ci0KLQkJc2V0Q2VsbEVkaXRvcnMoKTsKLQkJc2V0Q2VsbE1vZGlmaWVycygpOwotCi0JCWluaXRpYWxpemVQcmVkTGlzdCgpOwotCQl2aWV3ZXIuc2V0SW5wdXQocHJlZE1hcExpc3QpOwotCQl2aWV3ZXIucmVmcmVzaCgpOwotCi0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0Q2VsbEVkaXRvclR5cGUoU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCUNvbHVtbkRlc2NyaXB0b3IgZGVzYyA9IGNvbHVtbkRlc2NyaXB0b3JzW2ldOwotCQkJaWYgKGRlc2MuaWQgPT0gcHJvcGVydHkpIHsKLQkJCQlyZXR1cm4gZGVzYy5jZWxsRWRpdG9yVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX05PTkU7Ci0JfQotCi0JcHVibGljIENlbGxFZGl0b3IgZ2V0Q2VsbEVkaXRvcihTdHJpbmcgY29sdW1uSUQsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoY29sdW1uSUQgPT0gQ09MX0lEKSB7Ci0JCQlpZiAoaWRDZWxsRWRpdG9yID09IG51bGwpIHsKLQkJCQlpZENlbGxFZGl0b3IgPSBuZXcgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yKHZpZXdlci5nZXRUYWJsZSgpKSB7Ci0JCQkJCXByb3RlY3RlZCBTdHJpbmcgaXNWYWxpZChPYmplY3QgZSwgU3RyaW5nIHR4dCkgewotCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3I6OmlzVmFsaWQiKTsKLQkJCQkJCWUgPSBUbmdVdGlsLnVud3JhcChlKTsKLQotCQkJCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXRCU0FkYXB0ZXIoKTsKLQkJCQkJCU9iamVjdCBwcm9jZXNzID0gYWRhcHRlci5nZXRUb3BJdGVtKCk7Ci0KLQkJCQkJCUxpc3QgcHJlZGVjZXNzb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgd2JlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQkJCQlTdHJpbmcgc3RyID0gZ2V0UHJlZElkKCk7Ci0JCQkJCQlTdHJpbmcgcmVzdWx0ID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmNoZWNrUHJlZGVjZXNzb3JMaXN0KHdiZSwgc3RyLAotCQkJCQkJCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCksIHByb2Nlc3MsCi0JCQkJCQkJCQkJcHJlZGVjZXNzb3JzKTsKLQotCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQkJfQotCQkJCX07Ci0KLQkJCQlpZENlbGxFZGl0b3IKLQkJCQkJCS5zZXRWYWxpZGF0b3IobmV3IENlbGxFZGl0b3JWYWxpZGF0b3IoaWRDZWxsRWRpdG9yKSk7Ci0JCQkJaWRDZWxsRWRpdG9yLmdldENvbnRyb2woKS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwKLQkJCQkJCW5ldyBWYWxpZGF0aW5nRGVhY3RpdmF0ZUxpc3RlbmVyKGlkQ2VsbEVkaXRvcikpOwotCQkJfQotCQkJaWRDZWxsRWRpdG9yLnNldENvbHVtbkluZGV4KGNvbHVtbkluZGV4KTsKLQotCQkJcmV0dXJuIGlkQ2VsbEVkaXRvcjsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDZWxsRWRpdG9ycygpIHsKLQkJQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzID0gbmV3IENlbGxFZGl0b3JbY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJQ2VsbEVkaXRvciBjZWxsRWRpdG9yID0gZ2V0Q2VsbEVkaXRvcihjb2x1bW5EZXNjcmlwdG9yc1tpXS5pZCwgaSk7Ci0JCQlpZiAoY2VsbEVkaXRvciAhPSBudWxsKSB7Ci0JCQkJY2VsbEVkaXRvcnNbaV0gPSBjZWxsRWRpdG9yOwotCQkJfSBlbHNlIHsKLQkJCQlzd2l0Y2ggKGNvbHVtbkRlc2NyaXB0b3JzW2ldLmNlbGxFZGl0b3JUeXBlKSB7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVDoKLQkJCQkJY2VsbEVkaXRvcnNbaV0gPSB0ZXh0Q2VsbEVkaXRvcjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ09NQk9fQk9PTEVBTjoKLQkJCQkJY2VsbEVkaXRvcnNbaV0gPSBjb21ib0JveENlbGxFZGl0b3I7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWNlbGxFZGl0b3JzW2ldID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdmlld2VyLnNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q2VsbE1vZGlmaWVycygpIHsKLQkJLy8gU2V0IHRoZSBjZWxsIG1vZGlmaWVyCi0JCXZpZXdlci5zZXRDZWxsTW9kaWZpZXIobmV3IElDZWxsTW9kaWZpZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY2FuTW9kaWZ5OiBlbGVtZW50PSIrZWxlbWVudCsiLAotCQkJCS8vIHByb3BlcnR5PSIrcHJvcGVydHkpOwotCQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBQcmVkZWNlc3Nvck1hcCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAocHJvcGVydHkgPT0gQ09MX1BSRVNFTlRBVElPTl9OQU1FKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJnZXRWYWx1ZTogZWxlbWVudD0iK2VsZW1lbnQrIiwKLQkJCQkvLyBwcm9wZXJ0eT0iK3Byb3BlcnR5KTsKLQotCQkJCVN0cmluZyB2YWwgPSBudWxsOwotCQkJCXN3aXRjaCAoZ2V0Q2VsbEVkaXRvclR5cGUocHJvcGVydHkpKSB7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVDoKLQkJCQkJdmFsID0gbmV3IEludGVnZXIoKChQcmVkZWNlc3Nvck1hcCkgZWxlbWVudCkuZ2V0SWQoKSkKLQkJCQkJCQkudG9TdHJpbmcoKTsKLQkJCQkJcmV0dXJuIHZhbDsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DT01CT19CT09MRUFOOgotCQkJCQlpbnQgdmFsdWUgPSAoKChQcmVkZWNlc3Nvck1hcCkgZWxlbWVudCkuZ2V0V29ya09yZGVyKCkpCi0JCQkJCQkJLmdldExpbmtUeXBlKCkuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX1NUQVJUX1ZBTFVFID09IHZhbHVlKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IEludGVnZXIoMCk7Ci0JCQkJCX0gZWxzZSBpZiAoV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fRklOSVNIX1ZBTFVFID09IHZhbHVlKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IEludGVnZXIoMSk7Ci0JCQkJCX0gZWxzZSBpZiAoV29ya09yZGVyVHlwZS5TVEFSVF9UT19TVEFSVF9WQUxVRSA9PSB2YWx1ZSkgewotCQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKDIpOwotCQkJCQl9IGVsc2UKLQkJCQkJCXJldHVybiBuZXcgSW50ZWdlcigzKTsKLQotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW9kaWZ5KGZpbmFsIE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksCi0JCQkJCU9iamVjdCB2YWx1ZSkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigibW9kaWZ5OiBlbGVtZW50PSIrZWxlbWVudCsiLAotCQkJCS8vIHByb3BlcnR5PSIrcHJvcGVydHkrIiwgdmFsdWU9Iit2YWx1ZSk7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKSBlbGVtZW50OwotCQkJCVByZWRlY2Vzc29yTWFwIHByZWRNYXAgPSAoUHJlZGVjZXNzb3JNYXApIGl0ZW0uZ2V0RGF0YSgpOwotCQkJCVdvcmtPcmRlciB3byA9IHByZWRNYXAuZ2V0V29ya09yZGVyKCk7Ci0KLQkJCQlpZiAocHJvcGVydHkuZXF1YWxzKENPTF9JRCkpIHsKLQkJCQkJaXRlbS5zZXRUZXh0KDAsIHZhbHVlLnRvU3RyaW5nKCkpOwotCi0JCQkJCWludCBwcmVkSWQ7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwcmVkSWQgPSBuZXcgSW50ZWdlcih2YWx1ZS50b1N0cmluZygpKS5pbnRWYWx1ZSgpOwotCQkJCQkJaWYgKHByZWRJZCA8IDApCi0JCQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlXYXJuaW5nKAotCQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJUaXRsZSwgCi0JCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlck1lc3NhZ2UpOyAKLQkJCQkJCXByZWRNYXBMaXN0LnJlbW92ZShwcmVkTWFwKTsKLQkJCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJcHJlZE1hcC5zZXRJZChwcmVkSWQpOwotCQkJCX0KLQotCQkJCWZpbmFsIGludCBjb2x1bW5JbmRleCA9IGdldENvbHVtbkluZGV4KHByb3BlcnR5KTsKLQkJCQlDZWxsRWRpdG9yIGNlbGxFZGl0b3IgPSB2aWV3ZXIuZ2V0Q2VsbEVkaXRvcnMoKVtjb2x1bW5JbmRleF07Ci0JCQkJU3RyaW5nIGVyck1zZyA9IGNlbGxFZGl0b3IuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCQkJaWYgKGVyck1zZyAhPSBudWxsKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlXb3JrT3JkZXJUeXBlIHR5cGU7Ci0JCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXRCU0FkYXB0ZXIoKTsKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQkKLQkJCQlzd2l0Y2ggKGdldENlbGxFZGl0b3JUeXBlKHByb3BlcnR5KSkgewotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQ6CQkJCQkKLQkJCQkJT2JqZWN0IHByb2Nlc3MgPSBhZGFwdGVyLmdldFRvcEl0ZW0oKTsKLQotCQkJCQlMaXN0PE9iamVjdD4gcHJlZGVjZXNzb3JzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CQkJCQkKLQkJCQkJU3RyaW5nIHN0ciA9IGdldFByZWRJZCgpOwotCQkJCQlTdHJpbmcgcmVzdWx0ID0gUHJvY2Vzc1V0aWwuY2hlY2tQcmVkZWNlc3Nvckxpc3Qod2JlLCBzdHIsCi0JCQkJCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSwgcHJvY2VzcywgcHJlZGVjZXNzb3JzKTsKLQotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJCUxpc3Q8V29ya09yZGVyPiBhZGRMaXN0ID0gbmV3IEFycmF5TGlzdDxXb3JrT3JkZXI+KCk7Ci0JCQkJCQlMaXN0PFdvcmtPcmRlcj4gcHJlZFRvQmVEZWxldGVkID0gbmV3IEFycmF5TGlzdDxXb3JrT3JkZXI+KCk7Ci0JCQkJCQlQcmVkZWNlc3Nvckxpc3QucHJlcGFyZVVwZGF0ZVByZWRlY2Vzc29ycyhnZXRBZGFwdGVyRmFjdG9yeSgpLCB3YmUsIHByZWRlY2Vzc29ycywgYWRkTGlzdCwgcHJlZFRvQmVEZWxldGVkKTsKLQkJCQkJCWlmKCFwcmVkVG9CZURlbGV0ZWQuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksCi0JCQkJCQkJCQl3YmUsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpLAotCQkJCQkJCQkJcHJlZFRvQmVEZWxldGVkLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZighYWRkTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1ncgotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwKLQkJCQkJCQkJCQkJd2JlLAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpLAotCQkJCQkJCQkJCQlhZGRMaXN0LCAtMSk7Ci0JCQkJCQkJaWYoc3RhdHVzKSB7Ci0JCQkJCQkJCS8vVE9ETzogcmV2aWV3IHRoaXMKLQkJCQkJCQkJcHJlZE1hcC5zZXRXb3JrT3JkZXIoYWRkTGlzdC5nZXQoYWRkTGlzdC5zaXplKCkgLSAxKSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcHJlZE1hcExpc3QucmVtb3ZlKHByZWRNYXApOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIHNob3cgZXJyb3IgbWVzc2FnZSBib3gKLQkJCQkJCVN0cmluZyB0aXRsZSA9IGdldEVkaXRvcigpLmdldFRpdGxlKCk7Ci0JCQkJCQlTdHJpbmcgcHJvYmxlbSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX2NlbGxFZGl0b3JfaW52YWxpZFByZWRjZXNzb3JfcHJvYmxlbV9tc2c7IAotCQkJCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQkJCQlkaWFsb2cuZGlzcGxheVdhcm5pbmcodGl0bGUsIHByb2JsZW0sIHJlc3VsdCk7IAotCQkJCQkJcHJlZE1hcExpc3QucmVtb3ZlKHByZWRNYXApOwotCQkJCQl9Ci0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ09NQk9fQk9PTEVBTjoKLQkJCQkJYm9vbGVhbiByZW1vdmVkID0gZmFsc2U7Ci0JCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHdiZUNvcHkgPSBudWxsOwotCQkJCQlXb3JrT3JkZXIgbyA9IG51bGw7Ci0JCQkJCWludCBpbmRleCA9ICgoTnVtYmVyKSB2YWx1ZSkuaW50VmFsdWUoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd2JlLmdldExpbmtUb1ByZWRlY2Vzc29yKCkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlvID0gKFdvcmtPcmRlcikgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoby5nZXRQcmVkKCkgPT0gd28uZ2V0UHJlZCgpKQotCQkJCQkJewkJCQkJCQkKLQkJCQkJCQlpZiAoby5nZXRMaW5rVHlwZSgpLmdldFZhbHVlKCkgIT0gaW5kZXgpIHsKLQkJCQkJCQkJd2JlQ29weSA9IG8uZ2V0UHJlZCgpOwotCQkJCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQkJCQlyZW1vdmVkID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0JCQkJCQotCQkJCQkJCQkJCQotCQkJCQlpZiAoaW5kZXggPT0gMCkgewotCQkJCQkJdHlwZSA9IFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX1NUQVJUOwotCQkJCQl9IGVsc2UgaWYgKGluZGV4ID09IDEpIHsKLQkJCQkJCXR5cGUgPSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0g7Ci0JCQkJCX0gZWxzZSBpZiAoaW5kZXggPT0gMikgewotCQkJCQkJdHlwZSA9IFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fU1RBUlQ7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0eXBlID0gV29ya09yZGVyVHlwZS5TVEFSVF9UT19GSU5JU0g7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmIChyZW1vdmVkICYmIHdiZUNvcHkgIT0gbnVsbCkgewkJCQkJCi0JCQkJCQl3by5zZXRQcmVkKHdiZUNvcHkpOwotCQkJCQkJd28uc2V0TGlua1R5cGUodHlwZSk7Ci0JCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJCXdiZSwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCksCi0JCQkJCQkJCQkJd28sIC0xKTsKLQkJCQkJCWlmIChzdGF0dXMpCi0JCQkJCQkJcHJlZE1hcC5zZXRXb3JrT3JkZXIobyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCB3bywKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya09yZGVyX0xpbmtUeXBlKCksIHR5cGUsCi0JCQkJCQkJCS0xKTsKLQkJCQkJfQkJCQkJCQotCQkJCQkKLQkJCQkJYnJlYWs7Ci0KLQkJCQlkZWZhdWx0OgotCQkJCQl0eXBlID0gV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fRklOSVNIOwotCQkJCX0KLQotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0pOwotCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyBsaXN0IG9mIGl0ZW0gcHJvdmlkZXJzIGZvciBwcmVkZWNlc3NvcnMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JLy8gcHJpdmF0ZSBPYmplY3QgZ2V0UHJlZEl0ZW1Qcm92aWRlcnMoKQotCS8vIHsKLQkvLyBJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGdldEJTQWRhcHRlcigpOwotCS8vIGlmIChhZGFwdGVyICE9IG51bGwpCi0JLy8gcmV0dXJuIGFkYXB0ZXIuZ2V0UHJlZGVjZXNzb3JzKCk7Ci0JLy8gICAgCQotCS8vIHJldHVybiBudWxsOwotCS8vIH0KLQlwcml2YXRlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZ2V0QlNBZGFwdGVyKCkgewotCQl0cnkgewotCQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGdldEFkYXB0ZXJGYWN0b3J5KCk7Ly8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCQkJZWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIHByb3ZpZGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGZhY3RvcnkuYWRhcHQoCi0JCQkJCWVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFJldHVybiBjb2x1bW4gaW5kZXggZm9yIHByb3BlcnR5Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGdldENvbHVtbkluZGV4KFN0cmluZyBwcm9wZXJ0eSkgewotCQlPYmplY3RbXSBjb2xQcm9wcyA9IHZpZXdlci5nZXRDb2x1bW5Qcm9wZXJ0aWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sUHJvcHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb2xQcm9wc1tpXSA9PSBwcm9wZXJ0eSkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2dldE5hbWVQcmVmaXgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZVByZWZpeCgpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9URUFNX1BST0ZJTEUgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9NSUxFU1RPTkUgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9XT1JLX1BST0RVQ1RfRUxFTUVOVCArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQcmVkSWQoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdG9yID0gcHJlZE1hcExpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlQcmVkZWNlc3Nvck1hcCBtYXAgPSAoUHJlZGVjZXNzb3JNYXApIGl0b3IubmV4dCgpOwotCQkJYnVmLmFwcGVuZChtYXAuZ2V0SWQoKSk7Ci0JCQlidWYuYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBwcmVkIGxpc3QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVByZWRMaXN0KCkgewotCQl0cnkgewotCQkJTGlzdCBwcmVkUHJvdmlkZXJzID0gbnVsbDsKLQotCQkJLy8gZ2V0IHdvcmsgYnJlYWtkb3duIGVsZW1lbnQKLQkJCWVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQotCQkJLy8gZ2V0IHByZWRlY2Vzc29yIGl0ZW0gcHJvdmlkZXJzCi0JCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgcHJvdmlkZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgZmFjdG9yeQotCQkJCQkJLmFkYXB0KGVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCXByZWRQcm92aWRlcnMgPSAoKElCU0l0ZW1Qcm92aWRlcikgcHJvdmlkZXIpCi0JCQkJCQkJLmdldFByZWRlY2Vzc29ycygpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gbmVlZCBmb2xsb3dpbmcgZm9yIHNwZWNpYWwgY2FzZSAoV3JhcHBlckl0ZW1Qcm92aWRlcnMpLgotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCU9iamVjdCBpbnB1dCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikKLQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlwcmVkUHJvdmlkZXJzID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgaW5wdXQpCi0JCQkJCQkJLmdldFByZWRlY2Vzc29ycygpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gZ2V0IGxpbmsgdG8gcHJlZGVjZXNzb3JzCi0JCQlpZiAoKGVsZW1lbnQgIT0gbnVsbCkgJiYgKHByZWRQcm92aWRlcnMgIT0gbnVsbCkpIHsKLQkJCQlMaXN0IHByZWRMaXN0ID0gZWxlbWVudC5nZXRMaW5rVG9QcmVkZWNlc3NvcigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlbUl0ZXJhdG9yID0gcHJlZFByb3ZpZGVycy5pdGVyYXRvcigpOyBpdGVtSXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJT2JqZWN0IGl0ZW1PYmogPSAoT2JqZWN0KSBpdGVtSXRlcmF0b3IubmV4dCgpOwotCQkJCQlPYmplY3QgdGFyZ2V0T2JqID0gbnVsbDsKLQkJCQkJaWYgKGl0ZW1PYmogaW5zdGFuY2VvZiBXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQl0YXJnZXRPYmogPSAoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIGl0ZW1PYmopLmdldFZhbHVlKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGl0ZW1PYmogaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJCQl0YXJnZXRPYmogPSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGl0ZW1PYmopLmdldFRhcmdldCgpOwotCQkJCQl9Ci0JCQkJCWlmICh0YXJnZXRPYmogIT0gbnVsbCkgewotCQkJCQkJaW50IGlkID0gKChJQlNJdGVtUHJvdmlkZXIpIGl0ZW1PYmopLmdldElkKCk7Ci0JCQkJCQlmb3VuZCA9IGFkZFByZWRlY2Vzc29yKHByZWRMaXN0LCBpZCwgdGFyZ2V0T2JqKTsKLQotCQkJCQkJaWYgKCghZm91bmQpCi0JCQkJCQkJCSYmICh0YXJnZXRPYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpKSB7Ci0JCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgdGFyZ2V0T2JqOwotCQkJCQkJCWlmICh2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWwgPSB2ZQotCQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCQkJCXRhcmdldE9iaiA9IGVsOwotCi0JCQkJCQkJCS8vIGFkZCBiYXNlIHZhcmlhYmlsaXR5IG9iamVjdAotCQkJCQkJCQlhZGRQcmVkZWNlc3NvcihwcmVkTGlzdCwgaWQsIHRhcmdldE9iaik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gZm9yIChJdGVyYXRvciBpdG9yPXByZWRMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykKLQkJCQkvLyB7Ci0JCQkJLy8gYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCS8vIE9iamVjdCBvID0gKE9iamVjdCkgaXRvci5uZXh0KCk7Ci0JCQkJLy8gaWYgKG8gaW5zdGFuY2VvZiBXb3JrT3JkZXIpCi0JCQkJLy8gewotCQkJCS8vIC8vU3lzdGVtLm91dC5wcmludGxuKCJnZXRFbGVtZW50OjpXb3JrT3JkZXIgPSAiKyAoKFdvcmtPcmRlcikKLQkJCQkvLyBvKS5nZXRQcmVkKCkpOwotCQkJCS8vIFdvcmtCcmVha2Rvd25FbGVtZW50IHdiZSA9ICgoV29ya09yZGVyKSBvKS5nZXRQcmVkKCk7Ci0JCQkJLy8gaWYgKHdiZSAhPSBudWxsKQotCQkJCS8vIHsKLQkJCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZW1JdGVyYXRvcj1wcmVkUHJvdmlkZXJzLml0ZXJhdG9yKCk7Ci0JCQkJLy8gaXRlbUl0ZXJhdG9yLmhhc05leHQoKTspCi0JCQkJLy8gewotCQkJCS8vIE9iamVjdCBpdGVtT2JqID0gKE9iamVjdCkgaXRlbUl0ZXJhdG9yLm5leHQoKTsKLQkJCQkvLyBPYmplY3QgdGFyZ2V0T2JqID0gbnVsbDsKLQkJCQkvLyBpZiAoaXRlbU9iaiBpbnN0YW5jZW9mIFdyYXBwZXJJdGVtUHJvdmlkZXIpCi0JCQkJLy8gewotCQkJCS8vIHRhcmdldE9iaiA9ICgoV3JhcHBlckl0ZW1Qcm92aWRlcikgaXRlbU9iaikuZ2V0VmFsdWUoKTsKLQkJCQkvLyB9Ci0JCQkJLy8gaWYgKGl0ZW1PYmogaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKQotCQkJCS8vIHsKLQkJCQkvLyB0YXJnZXRPYmogPSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpaXRlbU9iaikuZ2V0VGFyZ2V0KCk7Ci0JCQkJLy8gfQotCQkJCS8vIGlmICh0YXJnZXRPYmogIT0gbnVsbCkKLQkJCQkvLyB7Ci0JCQkJLy8gaWYgKHRhcmdldE9iai5lcXVhbHMod2JlKSkKLQkJCQkvLyB7Ci0JCQkJLy8gLy8gY3JlYXRlIG1hcE9iamVjdExpc3QKLQkJCQkvLyBpbnQgaWQgPSAoKElCU0l0ZW1Qcm92aWRlcikgaXRlbU9iaikuZ2V0SWQoKTsKLQkJCQkvLyBQcmVkZWNlc3Nvck1hcCBtYXAgPSBuZXcgUHJlZGVjZXNzb3JNYXAoaWQsIChXb3JrT3JkZXIpIG8pOwotCQkJCS8vIHByZWRNYXBMaXN0LmFkZChtYXApOwotCQkJCS8vCQkKLQkJCQkvLyBmb3VuZD10cnVlOwotCQkJCS8vIGJyZWFrOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIGlmICghZm91bmQpCi0JCQkJLy8gewotCQkJCS8vIC8vIGlmIHByb3ZpZGVyIGlzIG5vdCBmb3VuZCwgdGhlbiBhZGQgd2l0aCBpZD0wCi0JCQkJLy8gLy8gZG8gaXQgb25seSBmb3IgVGVhbUFsbG9jYXRpb24gYW5kIFdvcmtQcm9kdWN0VXNhZ2UgdmlldwotCQkJCS8vIC8vIGlmCi0JCQkJLy8gKChFUEZQcm9wZXJ0eVNoZWV0UGFnZS5mb3JtUGFnZUlELmVxdWFscyhQcm9jZXNzRm9ybUVkaXRvci5UQV9GT1JNX0lEKSkKLQkJCQkvLyB8fAotCQkJCS8vIC8vCi0JCQkJLy8gKEVQRlByb3BlcnR5U2hlZXRQYWdlLmZvcm1QYWdlSUQuZXF1YWxzKFByb2Nlc3NGb3JtRWRpdG9yLldQQlNfRk9STV9JRCkpKQotCQkJCS8vIHsKLQkJCQkvLyBQcmVkZWNlc3Nvck1hcCBtYXAgPSBuZXcgUHJlZGVjZXNzb3JNYXAoMCwgKFdvcmtPcmRlcikgbyk7Ci0JCQkJLy8gcHJlZE1hcExpc3QuYWRkKG1hcCk7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcigiSW5pdGlhbGl6aW5nIFByZWRlY2Vzc29yIExpc3QiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGFkZFByZWRlY2Vzc29yKExpc3QgcHJlZExpc3QsIGludCBpZCwgT2JqZWN0IHRhcmdldE9iaikgewotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBwcmVkTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gKE9iamVjdCkgaXRvci5uZXh0KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIFdvcmtPcmRlcikgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0RWxlbWVudDo6V29ya09yZGVyID0gIisgKChXb3JrT3JkZXIpCi0JCQkJLy8gbykuZ2V0UHJlZCgpKTsKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUgPSAoKFdvcmtPcmRlcikgbykuZ2V0UHJlZCgpOwotCi0JCQkJaWYgKHRhcmdldE9iai5lcXVhbHMod2JlKSkgewotCQkJCQkvLyBjcmVhdGUgbWFwT2JqZWN0TGlzdAotCQkJCQlQcmVkZWNlc3Nvck1hcCBtYXAgPSBuZXcgUHJlZGVjZXNzb3JNYXAoaWQsIChXb3JrT3JkZXIpIG8pOwotCQkJCQlwcmVkTWFwTGlzdC5hZGQobWFwKTsKLQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1dvcmtQcm9kdWN0RGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0N2MxNzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1dvcmtQcm9kdWN0RGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkRlc2NyaXB0b3JQcm9jZXNzRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Qcm9jZXNzU3BlY2lmaWNXb3JrUHJvZHVjdEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQXNzaWduV1BUb0RlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkxpbmtNZXRob2RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotLyoqCi0gKiBUaGUgZ2VuZXJhbCB0YWIgc2VjdGlvbiBmb3IgV29yayBQcm9kdWN0IERlc2NyaXB0b3IKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24gZXh0ZW5kcwotCQlEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24gewotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlc2NyaXB0b3IgZWxlbWVudDsKLQotCXByaXZhdGUgVGV4dCBjdHJsX21ldGhvZF9lbGVtZW50OwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfd29ya1Byb2R1Y3RfdHlwZTsKLQotCXByaXZhdGUgVGV4dCBhY3Rpdml0eUVudHJ5U3RhdGUsIGFjdGl2aXR5RXhpdFN0YXRlOwotCi0JcHJpdmF0ZSBCdXR0b24gbGlua0J1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGNsZWFyQnV0dG9uOwotCQotCXByaXZhdGUgVGFibGUgY3RybF90YWJsZV8xOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciB2aWV3ZXJfMTsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfYWRkXzEsIGN0cmxfYWRkX3Byb2NfMSwgY3RybF9yZW1vdmVfMTsKLQotCXByaXZhdGUgU2VjdGlvbiBkZWxpdmVyYWJsZVNlY3Rpb247Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIHdwTW9kZWxNb2RpZnlMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCS8vIGdldCBXb3JrUHJvZHVjdERlc2NyaXB0b3Igb2JqZWN0Ci0JCWVsZW1lbnQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHRvZ2dsZVNlY3Rpb24oKSB7Ci0JCWlmICghKGVsZW1lbnQuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSkgewotCQkJaWYgKGRlbGl2ZXJhYmxlU2VjdGlvbi5pc0V4cGFuZGVkKCkpCi0JCQkJZGVsaXZlcmFibGVTZWN0aW9uLnNldEV4cGFuZGVkKGZhbHNlKTsKLQkJCWlmIChkZWxpdmVyYWJsZVNlY3Rpb24uaXNWaXNpYmxlKCkpCi0JCQkJZGVsaXZlcmFibGVTZWN0aW9uLnNldFZpc2libGUoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaWYgKCFkZWxpdmVyYWJsZVNlY3Rpb24uaXNFeHBhbmRlZCgpKQotCQkJCWRlbGl2ZXJhYmxlU2VjdGlvbi5zZXRFeHBhbmRlZCh0cnVlKTsKLQkJCWlmICghZGVsaXZlcmFibGVTZWN0aW9uLmlzVmlzaWJsZSgpKQotCQkJCWRlbGl2ZXJhYmxlU2VjdGlvbi5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlbGl2ZXJhYmxlU2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCVN0cmluZyBzZWN0aW9uVGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLldQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvblRpdGxlOyAKLQkJU3RyaW5nIHNlY3Rpb25EZXNjID0gUHJvcGVydGllc1Jlc291cmNlcy5XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25EZXNjcmlwdGlvbjsgCi0JCVN0cmluZyB0YWJsZVRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1RhYmxlMTsgCi0KLQkJU2VjdGlvbiBzZWN0aW9uID0gRm9ybVVJLmNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgY29tcG9zaXRlLAotCQkJCXNlY3Rpb25UaXRsZSwgc2VjdGlvbkRlc2MpOwotCi0JCS8vIGNyZWF0ZSBjb21wb3NpdGUKLQkJQ29tcG9zaXRlIHNlY3Rpb25Db21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb24sCi0JCQkJMiwgZmFsc2UpOwotCi0JCUNvbXBvc2l0ZSBwYW5lMSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQlHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTEsIHRhYmxlVGl0bGUpOwotCi0JCWludCB0YWJsZUhlaWdodCA9IDgwOwotCQljdHJsX3RhYmxlXzEgPSBGb3JtVUkuY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTEsIHRhYmxlSGVpZ2h0KTsKLQkJdmlld2VyXzEgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF90YWJsZV8xKTsKLQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUxpc3QgZGVsaXZlcmFibGVQYXJ0cyA9IGVsZW1lbnQuZ2V0RGVsaXZlcmFibGVQYXJ0cygpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGRlbGl2ZXJhYmxlUGFydHMuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0b3IKLQkJCQkJCQkubmV4dCgpOwotCQkJCQlpZiAod3BEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwKLQkJCQkJCQl8fCB3cERlc2MuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkKLQkJCQkJCW5ld0xpc3QuYWRkKHdwRGVzYyk7Ci0JCQkJfQotCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QobmV3TGlzdCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQl2aWV3ZXJfMS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJdmlld2VyXzEuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJdmlld2VyXzEuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJLy8gY3JlYXRlIGJ1dHRvbnMgZm9yIHRhYmxlMgotCQlDb21wb3NpdGUgcGFuZTIgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQotCQljdHJsX2FkZF8xID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZCk7IAotCQljdHJsX2FkZF9wcm9jXzEgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGRGcm9tUHJvY2Vzcyk7IAotCQljdHJsX3JlbW92ZV8xID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1JlbW92ZSk7IAotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQotCQlkZWxpdmVyYWJsZVNlY3Rpb24gPSBzZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJLy8gaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJLy8gewotCQkvLyBsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJLy8gfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiNjcmVhdGVHZW5lcmFsU2VjdGlvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlzdXBlci5jcmVhdGVHZW5lcmFsU2VjdGlvbihjb21wb3NpdGUpOwotCi0JCS8vIG1ldGhvZCBlbGVtZW50Ci0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfVHlwZV9Xb3JrUHJvZHVjdCk7IAotCQljdHJsX21ldGhvZF9lbGVtZW50ID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlTV1QuREVGQVVMVCwgMSk7Ci0JCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50TmFtZShlbGVtZW50KSk7Ci0JCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwKLQkJCQlnZW5lcmFsQ29tcG9zaXRlLCBTV1QuTk9ORSwgMiwgdHJ1ZSk7Ci0JCWxpbmtCdXR0b24gPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gsIDEpOwotCQlsaW5rQnV0dG9uCi0JCQkJLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0J1dHRvbl9MaW5rTWV0aG9kRWxlbWVudCk7IAotCi0JCWNsZWFyQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBidXR0b25Db21wb3NpdGUsIFNXVC5QVVNILCAxKTsKLQkJY2xlYXJCdXR0b24KLQkJCQkuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQnV0dG9uX0NsZWFyTWV0aG9kRWxlbWVudCk7IAotCi0JCS8vIHR5cGUKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya1Byb2R1Y3RfVHlwZSk7IAotCQljdHJsX3dvcmtQcm9kdWN0X3R5cGUgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCVNXVC5ERUZBVUxULCBob3Jpem9udGFsU3Bhbik7Ci0JCWN0cmxfd29ya1Byb2R1Y3RfdHlwZS5zZXRUZXh0KGdldE1ldGhvZEVsZW1lbnRUeXBlKGVsZW1lbnQpKTsKLQkJY3RybF93b3JrUHJvZHVjdF90eXBlLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCS8vIGFjdGl2aXR5RW50cnlzdGF0ZQotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKTsgCi0JCWFjdGl2aXR5RW50cnlTdGF0ZSA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJU1dULkRFRkFVTFQsIGhvcml6b250YWxTcGFuKTsKLQotCQkvLyBhY3Rpdml0eUV4aXRzdGF0ZQotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUpOyAKLQkJYWN0aXZpdHlFeGl0U3RhdGUgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCVNXVC5ERUZBVUxULCBob3Jpem9udGFsU3Bhbik7Ci0KLQkJLy8gQ1JFQVRFIERFTElWRVJBQkxFIFNFQ1RJT04KLQkJY3JlYXRlRGVsaXZlcmFibGVTZWN0aW9uKGNvbXBvc2l0ZSk7Ci0JCXRvZ2dsZVNlY3Rpb24oKTsKLQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE1ldGhvZEVsZW1lbnROYW1lKFdvcmtQcm9kdWN0RGVzY3JpcHRvciBlbGVtZW50KSB7Ci0JCVN0cmluZyBzdHIgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTm9uZTsgCi0JCWlmIChlbGVtZW50LmdldFdvcmtQcm9kdWN0KCkgIT0gbnVsbCkgewotCQkJc3RyID0gZWxlbWVudC5nZXRXb3JrUHJvZHVjdCgpLmdldE5hbWUoKTsKLQkJfQotCi0JCXJldHVybiBzdHI7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWV0aG9kRWxlbWVudFR5cGUoV29ya1Byb2R1Y3REZXNjcmlwdG9yIGVsZW1lbnQpIHsKLQkJU3RyaW5nIHN0ciA9IFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Ob25lOyAKLQkJaWYgKGVsZW1lbnQuZ2V0V29ya1Byb2R1Y3QoKSAhPSBudWxsKSB7Ci0JCQlzdHIgPSBlbGVtZW50LmdldFdvcmtQcm9kdWN0KCkuZ2V0VHlwZSgpLmdldE5hbWUoKTsKLQkJfQotCi0JCXJldHVybiBzdHI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQotCQlhY3Rpdml0eUVudHJ5U3RhdGUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCkpOwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZWxlbWVudCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGVsZW1lbnQuZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQlhY3Rpdml0eUVudHJ5U3RhdGUsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBTdHJVdGlsLmdldFBsYWluVGV4dChhY3Rpdml0eUVudHJ5U3RhdGUKLQkJCQkJCS5nZXRUZXh0KCkpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKSwKLQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN0YXR1cykgewotCQkJCQkJYWN0aXZpdHlFbnRyeVN0YXRlLnNldFRleHQobmV3Q29udGVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWFjdGl2aXR5RXhpdFN0YXRlLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCkpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGVsZW1lbnQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBlbGVtZW50LmdldEFjdGl2aXR5RXhpdFN0YXRlKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQlhY3Rpdml0eUV4aXRTdGF0ZSwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IFN0clV0aWwuZ2V0UGxhaW5UZXh0KGFjdGl2aXR5RXhpdFN0YXRlCi0JCQkJCQkuZ2V0VGV4dCgpKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKSwKLQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN0YXR1cykgewotCQkJCQkJYWN0aXZpdHlFeGl0U3RhdGUuc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF90YWJsZV8xLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzEKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApCi0JCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9hZGRfMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIoCi0JCQkJCQlnZXRDb25maWd1cmF0aW9uKCksIG51bGwsIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFMpOyAKLQkJCQkvLyBibG9jayBpdCdzIGRlbGl2ZXJhYmxlIHBhcnRzCi0JCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWV4aXN0aW5nRWxlbWVudHMKLQkJCQkJCS5hZGRBbGwoUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50TGlzdCgoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJCQkJCQkuZ2V0RGVsaXZlcmFibGVQYXJ0cygpKSk7Ci0JCQkJLy8gYmxvY2sgaXRzZWxmCi0JCQkJZXhpc3RpbmdFbGVtZW50cy5hZGQoUHJvY2Vzc1V0aWwKLQkJCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KSk7Ci0JCQkJLy8gYWxzbyBibG9jayBpdCdzIHBhcmVudCB3b3JrIHByb2R1Y3RzLCBpZiBhbnkKLQkJCQlleGlzdGluZ0VsZW1lbnRzCi0JCQkJCQkuYWRkQWxsKChDb2xsZWN0aW9uKSBnZXRQYXJlbnRXb3JrUHJvZHVjdHMoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkpOwotCi0JCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCQlmaWx0ZXIsIGVsZW1lbnQsIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFMsCi0JCQkJCQlleGlzdGluZ0VsZW1lbnRzKTsKLQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTKTsKLQkJCQlmZC5vcGVuKCk7Ci0JCQkJYWRkSXRlbXMoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQl2aWV3ZXJfMS5yZWZyZXNoKCk7Ci0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9hZGRfcHJvY18xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN0cmluZyB0YWJOYW1lID0gRmlsdGVyQ29uc3RhbnRzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SUzsKLQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZXhpc3RpbmdFbGVtZW50cy5hZGRBbGwoKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCQkuZ2V0RGVsaXZlcmFibGVQYXJ0cygpKTsKLQkJCQlleGlzdGluZ0VsZW1lbnRzLmFkZChlbGVtZW50KTsKLQotCQkJCWV4aXN0aW5nRWxlbWVudHMKLQkJCQkJCS5hZGRBbGwoZ2V0UGFyZW50RGVsaXZlcmFibGVzKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpKTsKLQkJCQlQcm9jZXNzIHByb2Nlc3MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZWxlbWVudCk7Ci0KLQkJCQlJRmlsdGVyIGRlc2NyaXB0b3JGaWx0ZXIgPSBnZXREZXNjcmlwdG9yRmlsdGVyKCk7Ci0JCQkJaWYgKGRlc2NyaXB0b3JGaWx0ZXIgIT0gbnVsbCAmJiBwcm9jZXNzICE9IG51bGwpIHsKLQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCS5nZXRTaGVsbCgpLCBkZXNjcmlwdG9yRmlsdGVyLCBwcm9jZXNzLCB0YWJOYW1lLAotCQkJCQkJCWV4aXN0aW5nRWxlbWVudHMpOwotCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJZmQuc2V0VGl0bGUodGFiTmFtZSk7Ci0JCQkJCWZkLm9wZW4oKTsKLQkJCQkJYWRkRnJvbVByb2Nlc3NJdGVtcyhmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQl2aWV3ZXJfMS5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX3JlbW92ZV8xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzEKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJcmVtb3ZlSXRlbXMocm1JdGVtcyk7Ci0JCQkJCXZpZXdlcl8xLnJlZnJlc2goKTsKLQotCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCXZpZXdlcl8xLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJbGlua0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgdGFiTmFtZSA9IEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFM7IAotCQkJCUNsYXNzIHdvcmtQcm9kdWN0VHlwZSA9IG51bGw7Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0V29ya1Byb2R1Y3QoKSAhPSBudWxsKSB7Ci0JCQkJCXdvcmtQcm9kdWN0VHlwZSA9IGVsZW1lbnQuZ2V0V29ya1Byb2R1Y3QoKS5nZXRDbGFzcygpOwotCQkJCX0KLQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0V29ya1Byb2R1Y3QoKSAhPSBudWxsKSB7Ci0JCQkJCVdvcmtQcm9kdWN0IHdwID0gZWxlbWVudC5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQlleGlzdGluZ0VsZW1lbnRzLmFkZCh3cCk7Ci0JCQkJCWlmICh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCQlMaXN0IHN1YkFydGlmYWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWdldEFsbFN1YkFydGlmYWN0cygoQXJ0aWZhY3QpIHdwLCBzdWJBcnRpZmFjdHMsCi0JCQkJCQkJCSgoQXJ0aWZhY3QpIHdwKS5nZXRDb250YWluZWRBcnRpZmFjdHMoKSk7Ci0JCQkJCQlleGlzdGluZ0VsZW1lbnRzLmFkZEFsbChzdWJBcnRpZmFjdHMpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJTGlzdCBsaXN0ID0gUHJvY2Vzc1V0aWwKLQkJCQkJCS5nZXRTaWJsaW5ncyhUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgZ2V0QWRhcHRlcigpLAotCQkJCQkJCQllbGVtZW50KTsKLQotCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iajsKLQkJCQkJCWlmICgoIXdwRGVzYy5lcXVhbHMoZWxlbWVudCkpCi0JCQkJCQkJCSYmICghd3BEZXNjLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkpIHsKLQkJCQkJCQlXb3JrUHJvZHVjdCB3cCA9IHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpOwotCi0JCQkJCQkJaWYgKHdwICE9IG51bGwpIHsKLQkJCQkJCQkJZXhpc3RpbmdFbGVtZW50cy5hZGQod3ApOwotCi0JCQkJCQkJCWlmICh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCQkJCQlMaXN0IHN1YkFydGlmYWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJCWdldEFsbFN1YkFydGlmYWN0cygoQXJ0aWZhY3QpIHdwLAotCQkJCQkJCQkJCQlzdWJBcnRpZmFjdHMsICgoQXJ0aWZhY3QpIHdwKQotCQkJCQkJCQkJCQkJCS5nZXRDb250YWluZWRBcnRpZmFjdHMoKSk7Ci0JCQkJCQkJCQlleGlzdGluZ0VsZW1lbnRzLmFkZEFsbChzdWJBcnRpZmFjdHMpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IFByb2Nlc3NTcGVjaWZpY1dvcmtQcm9kdWN0RmlsdGVyKAotCQkJCQkJZ2V0Q29uZmlndXJhdGlvbigpLCBudWxsLCB0YWJOYW1lLCB3b3JrUHJvZHVjdFR5cGUpOwotCi0JCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCQlmaWx0ZXIsIGVsZW1lbnQsIHRhYk5hbWUsIGV4aXN0aW5nRWxlbWVudHMpOwotCi0JCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZmQuc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKHRydWUpOwotCQkJCWZkLnNldFRpdGxlKHRhYk5hbWUpOwotCQkJCWZkLm9wZW4oKTsKLQkJCQlzZXRNZXRob2RFbGVtZW50KGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0KLQkJCQkvLyB1cGRhdGUgbWV0aG9kIGVsZW1lbnQgY29udHJvbAotCQkJCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50TmFtZShlbGVtZW50KSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlMSkgewotCQkJfQotCQl9KTsKLQkJCi0JCWNsZWFyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCksCi0JCQkJCQludWxsLCAtMSk7Ci0JCQkJLy8gdXBkYXRlIG1ldGhvZCBlbGVtZW50IGNvbnRyb2wKLQkJCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZTEpIHsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldEFsbFN1YkFydGlmYWN0cyhBcnRpZmFjdCBhcnRpZmFjdCwgTGlzdCBzdWJBcnRpZmFjdHMsCi0JCQlMaXN0IGNvbnRhaW5lZEFydGlmYWN0cykgewotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjb250YWluZWRBcnRpZmFjdHMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gKE9iamVjdCkgaXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQlpZiAoIXN1YkFydGlmYWN0cy5jb250YWlucyhvYmopKQotCQkJCQlzdWJBcnRpZmFjdHMuYWRkKG9iaik7Ci0JCQkJZ2V0QWxsU3ViQXJ0aWZhY3RzKChBcnRpZmFjdCkgb2JqLCBzdWJBcnRpZmFjdHMsCi0JCQkJCQkoKEFydGlmYWN0KSBvYmopLmdldENvbnRhaW5lZEFydGlmYWN0cygpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiN1cGRhdGVDb250cm9scygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCXN1cGVyLnVwZGF0ZUNvbnRyb2xzKCk7Ci0JCWFjdGl2aXR5RW50cnlTdGF0ZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWFjdGl2aXR5RXhpdFN0YXRlLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJbGlua0J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY2xlYXJCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWFjdGl2aXR5RW50cnlTdGF0ZS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJYWN0aXZpdHlFeGl0U3RhdGUuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0KLQkJaWYgKGN0cmxfYWRkXzEgIT0gbnVsbCkKLQkJCWN0cmxfYWRkXzEuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmIChjdHJsX2FkZF9wcm9jXzEgIT0gbnVsbCkKLQkJCWN0cmxfYWRkX3Byb2NfMS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKGN0cmxfcmVtb3ZlXzEgIT0gbnVsbCkKLQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQllbGVtZW50ID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCi0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJLy8gTW9kZWwgTW9kaWZ5IGxpc3RlbmVyIGZvciBhY3Rpdml0eSBlbnRyeSBzdGF0ZSBhbmQgYWN0aXZpdHkKLQkJCQkvLyBleGl0IHN0YXRlCi0JCQkJaWYgKHdwTW9kZWxNb2RpZnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCWFjdGl2aXR5RW50cnlTdGF0ZQotCQkJCQkJCS5yZW1vdmVNb2RpZnlMaXN0ZW5lcih3cE1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQkJCQlhY3Rpdml0eUV4aXRTdGF0ZQotCQkJCQkJCS5yZW1vdmVNb2RpZnlMaXN0ZW5lcih3cE1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCi0JCQkJfQotCi0JCQkJd3BNb2RlbE1vZGlmeUxpc3RlbmVyID0gZ2V0RWRpdG9yKCkuY3JlYXRlTW9kaWZ5TGlzdGVuZXIoCi0JCQkJCQkoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KTsKLQotCQkJCWlmICh3cE1vZGVsTW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgd3BNb2RlbE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXRFbGVtZW50KGVsZW1lbnQpOwotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHdwTW9kZWxNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQkJCQl9Ci0KLQkJCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQkJCWN0cmxfd29ya1Byb2R1Y3RfdHlwZS5zZXRUZXh0KGdldE1ldGhvZEVsZW1lbnRUeXBlKGVsZW1lbnQpKTsKLQkJCQlhY3Rpdml0eUVudHJ5U3RhdGUuc2V0VGV4dChlbGVtZW50LmdldEFjdGl2aXR5RW50cnlTdGF0ZSgpKTsKLQkJCQlhY3Rpdml0eUV4aXRTdGF0ZS5zZXRUZXh0KGVsZW1lbnQuZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKSk7Ci0KLQkJCQlpZiAod3BNb2RlbE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHdwTW9kZWxNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZShmYWxzZSk7Ci0JCQkJfQotCi0JCQkJYWN0aXZpdHlFbnRyeVN0YXRlLmFkZE1vZGlmeUxpc3RlbmVyKHdwTW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJYWN0aXZpdHlFeGl0U3RhdGUuYWRkTW9kaWZ5TGlzdGVuZXIod3BNb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQotCQkJCWlmICh2aWV3ZXJfMSAhPSBudWxsKSB7Ci0JCQkJCXZpZXdlcl8xLnJlZnJlc2goKTsKLQkJCQl9Ci0KLQkJCQkvLyBoaWRlL3Nob3cgY2VydGFpbiBzZWN0aW9ucy4KLQkJCQl0b2dnbGVTZWN0aW9uKCk7Ci0KLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGdlbmVyYWwgc2VjdGlvbiA6ICIgKyBlbGVtZW50LCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRJdGVtcyhMaXN0IGl0ZW1zKSB7Ci0JCWlmIChpdGVtcyAhPSBudWxsKSB7Ci0JCQlMaXN0IHdwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCWlmICgob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpCi0JCQkJCQkmJiAoIWlzUGFydE9mRGVsaXZlcmFibGUoKFdvcmtQcm9kdWN0KSBvYmosCi0JCQkJCQkJCShXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpKSkgewotCQkJCQl3cHMuYWRkKChXb3JrUHJvZHVjdCkgb2JqKTsKLQotCQkJCX0KLQkJCX0KLQkJCWlmICghd3BzLmlzRW1wdHkoKSkgewotCQkJCUFzc2lnbldQVG9EZWxpdmVyYWJsZSBjbWQgPSBuZXcgQXNzaWduV1BUb0RlbGl2ZXJhYmxlKAotCQkJCQkJKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCwgd3BzKTsKLQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQkJfQotCQl9Ci0JCXZpZXdlcl8xLnJlZnJlc2goKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXREZXNjcmlwdG9yRmlsdGVyKCkgewotCi0JCXJldHVybiBuZXcgRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZ2V0QWN0aXZpdGllc0luU2NvcGUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgZWxlbWVudCwgbGlzdCk7Ci0JCQkJCWlmIChsaXN0LmNvbnRhaW5zKG9iaikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXMoTGlzdCBpdGVtcykgewotCQlpZiAoaXRlbXMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqKQotCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQlpZiAod3AgIT0gbnVsbCkgewotCQkJCQkJaWYgKCFpc1BhcnRPZkRlbGl2ZXJhYmxlKHdwLAotCQkJCQkJCQkoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KSkgewotCQkJCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSBQcm9jZXNzVXRpbAotCQkJCQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3cCk7Ci0JCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwKLQkJCQkJCQkJCQkJd3BEZXNjLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwKLQkJCQkJCQkJCQlvYmosIC0xKTsKLQkJCQkJCQotCQkJCQl9IGVsc2UgewotCQkJCQkJTWVzc2FnZUZvcm1hdCBtZiA9IG5ldyBNZXNzYWdlRm9ybWF0KAotCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfRGVsaXZlcmFibGVBc3NpZ25FcnJvcik7IAotCQkJCQkJT2JqZWN0W10gYXJncyA9IHsKLQkJCQkJCQkJKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaikuZ2V0TmFtZSgpLAotCQkJCQkJCQkoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0TmFtZSgpIH07Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUluZm8oCi0JCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0Fzc2lnbm1lbnRJbmZvVGl0bGUsIG1mLmZvcm1hdChhcmdzKSk7IAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlSXRlbXMoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IChPYmplY3QpIGl0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpLAotCQkJCQkJCQkJKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqLCAtMSk7Ci0JCQkJfQotCi0JCQkJLy8gZmluZCBtYXRjaGluZyBkZWxpdmVyYWJsZSBwYXJ0cwotCQkJCU9iamVjdCB3cERlc2MgPSBmaW5kRGVsaXZlcmFibGVQYXJ0cygoT2JqZWN0KSBvYmopOwotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwKLQkJCQkJCXdwRGVzYywgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZmluZERlbGl2ZXJhYmxlUGFydHMoT2JqZWN0IG9iaikgewotCQlMaXN0IHBhcnRzID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpLmdldERlbGl2ZXJhYmxlUGFydHMoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBwYXJ0cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBpdG9yT2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKGl0b3JPYmplY3QgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJT2JqZWN0IG9ialdQID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaikKLQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQkJT2JqZWN0IGl0b3JXUCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdG9yT2JqZWN0KQotCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQlpZiAob2JqV1AuZXF1YWxzKGl0b3JXUCkpIHsKLQkJCQkJCXJldHVybiBpdG9yT2JqZWN0OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRmluZCBwYXJlbnQgcHJvY2VzcwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvY2VzcyhCcmVha2Rvd25FbGVtZW50IGJyRWxlbWVudCkgewotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQlickVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSkgewotCQkJYnJFbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudDsKLQkJCWFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoYnJFbGVtZW50LAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQgZGVsaXZlcmFibGVzCi0JICogCi0JICogQHBhcmFtIGJyRWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0UGFyZW50RGVsaXZlcmFibGVzKEJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50KSB7Ci0JCUxpc3QgcGFyZW50RGVsaXZlcmFibGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQlickVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCWJyRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQ7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHBhcmVudDsKLQkJCQlpZiAod3BkZXNjLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCQlwYXJlbnREZWxpdmVyYWJsZXMuYWRkKHdwZGVzYyk7Ci0JCQkJfQotCQkJfQotCQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdChickVsZW1lbnQsCi0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBwYXJlbnREZWxpdmVyYWJsZXM7Ci0JfQotCS8qKgotCSAqIEZpbmQgYWxsIHNpYmxpbmcgd29yayBwcm9kdWN0cwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldFBhcmVudFdvcmtQcm9kdWN0cyhCcmVha2Rvd25FbGVtZW50IGJyRWxlbWVudCkgewotCQlIYXNoU2V0IHdvcmtQcm9kdWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJYnJFbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlickVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50OwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGRlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBwYXJlbnQ7Ci0JCQkJaWYgKHdwZGVzYy5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJd29ya1Byb2R1Y3RzLmFkZCh3cGRlc2MuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCQkJfQotCQkJfQotCQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdChickVsZW1lbnQsCi0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl9Ci0KLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlMaXN0IGJyRWxlbWVudHMgPSAoKEFjdGl2aXR5KSBwYXJlbnQpLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBickVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSAoT2JqZWN0KSBpdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCVdvcmtQcm9kdWN0IHdwID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaikKLQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQkJaWYgKHdwICE9IG51bGwpCi0JCQkJCQl3b3JrUHJvZHVjdHMuYWRkKHdwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdvcmtQcm9kdWN0czsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jZ2V0TmFtZVByZWZpeCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lUHJlZml4KCkgewotCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX1dPUktfUFJPRFVDVF9ERVNDUklQVE9SICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRNZXRob2RFbGVtZW50KExpc3QgaXRlbXMpIHsKLQkJaWYgKChpdGVtcyAhPSBudWxsKSAmJiAoaXRlbXMuc2l6ZSgpID49IDEpKSB7Ci0JCQlpZiAoaXRlbXMuZ2V0KDApIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgaXRlbXMuZ2V0KDApOwotCi0vLwkJCQlMaXN0IGxpc3QgPSBQcm9jZXNzVXRpbAotLy8JCQkJCQkuZ2V0U2libGluZ3MoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLS8vCQkJCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgZ2V0QWRhcHRlcigpLAotLy8JCQkJCQkJCWVsZW1lbnQpOwotCQkJCWJvb2xlYW4gY2FuQXNzaWduID0gdHJ1ZTsKLS8vCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotLy8JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLS8vCQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iajsKLS8vCQkJCQkJaWYgKCghd3BEZXNjLmVxdWFscyhlbGVtZW50KSkKLS8vCQkJCQkJCQkmJiAoIXdwRGVzYy5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpKSB7Ci0vLwkJCQkJCQlXb3JrUHJvZHVjdCBleGlzaW5nV1AgPSB3cERlc2MuZ2V0V29ya1Byb2R1Y3QoKTsKLS8vCQkJCQkJCWlmICh3cC5lcXVhbHMoZXhpc2luZ1dQKSkgewotLy8JCQkJCQkJCWNhbkFzc2lnbiA9IGZhbHNlOwotLy8JCQkJCQkJCWJyZWFrOwotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotCQkJCWlmIChjYW5Bc3NpZ24pIHsKLQkJCQkJTGlua01ldGhvZEVsZW1lbnRDb21tYW5kIGNtZCA9IG5ldyBMaW5rTWV0aG9kRWxlbWVudENvbW1hbmQoCi0JCQkJCQkJZWxlbWVudCwgd3AsCi0JCQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUKTsKLQkJCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQotCQkJCQkvLyBzZXQgc2VsZWN0aW9uIHRvIHNhbWUgZWxlbWVudCB0byBlbmFibGUgY29ycmVjdCBhY3Rpb25zCi0JCQkJCWdldEVkaXRvcigpLnNldFNlbGVjdGlvbihnZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTWVzc2FnZUZvcm1hdCBtZiA9IG5ldyBNZXNzYWdlRm9ybWF0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19JbnZhbGlkTGlua01ldGhvZEVsZW1lbnQpOyAKLQkJCQkJT2JqZWN0W10gYXJncyA9IHsgd3AuZ2V0TmFtZSgpIH07Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19MaW5rTWV0aG9kRWxlbWVudFRpdGxlLCBtZi5mb3JtYXQoYXJncykpOyAKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNQYXJ0T2ZEZWxpdmVyYWJsZShXb3JrUHJvZHVjdCB3cCwKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxpdmVyYWJsZSkgewotCi0JCUxpc3QgZGVsaXZlcmFibGVQYXJ0cyA9IFByb2Nlc3NVdGlsCi0JCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50TGlzdChkZWxpdmVyYWJsZS5nZXREZWxpdmVyYWJsZVBhcnRzKCkpOwotCQlpZiAoZGVsaXZlcmFibGVQYXJ0cy5jb250YWlucyh3cCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YWE3YzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRhYmJlZCBwYWdlcyBmb3IgdGhlIGJyZWFrZG93biBlbGVtZW50cyBQcm9wZXJ0aWVzIHZpZXcuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ2F0ZWdvcnlDb250ZW50UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NhdGVnb3J5Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOTYyOTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ2F0ZWdvcnlDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Eb21haW5zSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuUm9sZVNldHNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Ub29sc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LldvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogQ29udGVudCBwcm92aWRlciBmb3IgQ3VzdG9tIENhdGVnb3J5IHZpZXcgb2YgY29uZmlndXJhdGlvbiBwYWdlCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICovCi0KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIHsKLQotCS8vIHRoZXJlIGlzIGEgcHJvYmxlbSBpbiB0aGUgcGFzc2VkIGluIEFkYXB0ZXJGYWN0b3J5Ci0JLy8gaXQgY2FuJ3QgZmluZCB0aGUgY29ycmVjdCBwYXJlbnQgZnJvbSB0aGUgY2hpbGQKLQkvLyBuZWVkIHRvIGJ1aWxkIGEgbWFwIG9mIGNoaWxkIHRvIGl0J3MgcGFyZW50IGlmIHRoZSBjaGlsZCBpcyBhIFVJCi0JLy8gZm9sZGVyCi0JLy8gY2xlYXIgdGhlIG1hcCB3aGVuIHRoZSBpbnB1dCBpcyBzZXQKLQlwcml2YXRlIE1hcDxPYmplY3QsIE9iamVjdD4gY2hpbGRVSVBhcmVudE1hcCA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOwotCQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQ2F0ZWdvcnlDb250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCS8vIGFkZCBzdGFuZGFyZCBjYXRlZ29yaWVzIFVJIGZvbGRlcnMgYXMgYXBwcm9wcmlhdGUKLQkJCURpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIGRpc2NpcGxpbmVzID0gKERpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKVRuZ1V0aWwuZ2V0RGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIoKE1ldGhvZFBsdWdpbilwYXJlbnRFbGVtZW50KTsKLQkJCWlmIChkaXNjaXBsaW5lcyAhPSBudWxsICYmICFkaXNjaXBsaW5lcy5nZXRDaGlsZHJlbihkaXNjaXBsaW5lcykuaXNFbXB0eSgpKSB7Ci0JCQkJY2hpbGRyZW4uYWRkKGRpc2NpcGxpbmVzKTsKLQkJCX0KLQkJCURvbWFpbnNJdGVtUHJvdmlkZXIgZG9tYWlucyA9IChEb21haW5zSXRlbVByb3ZpZGVyKVRuZ1V0aWwuZ2V0RG9tYWluc0l0ZW1Qcm92aWRlcigoTWV0aG9kUGx1Z2luKXBhcmVudEVsZW1lbnQpOwotCQkJaWYgKGRvbWFpbnMgIT0gbnVsbCAmJiAhZG9tYWlucy5nZXRDaGlsZHJlbihkb21haW5zKS5pc0VtcHR5KCkpIHsKLQkJCQljaGlsZHJlbi5hZGQoZG9tYWlucyk7Ci0JCQl9Ci0JCQlXb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyIHdwVHlwZXMgPSAoV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlcilUbmdVdGlsLmdldFdvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIoKE1ldGhvZFBsdWdpbilwYXJlbnRFbGVtZW50KTsKLQkJCWlmICh3cFR5cGVzICE9IG51bGwgJiYgIXdwVHlwZXMuZ2V0Q2hpbGRyZW4od3BUeXBlcykuaXNFbXB0eSgpKSB7Ci0JCQkJY2hpbGRyZW4uYWRkKHdwVHlwZXMpOwotCQkJfQotCQkJUm9sZVNldHNJdGVtUHJvdmlkZXIgcm9sZVNldHMgPSAoUm9sZVNldHNJdGVtUHJvdmlkZXIpVG5nVXRpbC5nZXRSb2xlU2V0c0l0ZW1Qcm92aWRlcigoTWV0aG9kUGx1Z2luKXBhcmVudEVsZW1lbnQpOwotCQkJaWYgKHJvbGVTZXRzICE9IG51bGwgJiYgIXJvbGVTZXRzLmdldENoaWxkcmVuKHJvbGVTZXRzKS5pc0VtcHR5KCkpIHsKLQkJCQljaGlsZHJlbi5hZGQocm9sZVNldHMpOwotCQkJfQotCQkJVG9vbHNJdGVtUHJvdmlkZXIgdG9vbHMgPSAoVG9vbHNJdGVtUHJvdmlkZXIpVG5nVXRpbC5nZXRUb29sc0l0ZW1Qcm92aWRlcigoTWV0aG9kUGx1Z2luKXBhcmVudEVsZW1lbnQpOwotCQkJaWYgKHRvb2xzICE9IG51bGwgJiYgIXRvb2xzLmdldENoaWxkcmVuKHRvb2xzKS5pc0VtcHR5KCkpIHsKLQkJCQljaGlsZHJlbi5hZGQodG9vbHMpOwotCQkJfQotCQkJCi0JCQkvLyBhZGQgQ3VzdG9tQ2F0ZWdvcmllcyBwcm92aWRlcgotCQkJLy8gZ2V0IHJvb3QgQ0Mgb2YgcGx1Z2luCi0JCQlDdXN0b21DYXRlZ29yeSByb290Q0MgPSAoVG5nVXRpbC5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkoKE1ldGhvZFBsdWdpbilwYXJlbnRFbGVtZW50KSk7Ci0JCQlpZiAocm9vdENDICE9IG51bGwgJiYgIXJvb3RDQy5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJY2hpbGRyZW4uYWRkKHJvb3RDQyk7Ci0JCQl9Ci0vLwkJCWNoaWxkcmVuID0gdW53cmFwRlZXSVBzKGNoaWxkcmVuKTsKLS8vCQkJY2hpbGRyZW4gPSBmaWx0ZXJDYXRlZ29yeUVsZW1lbnRzKHBhcmVudEVsZW1lbnQsIGNoaWxkcmVuKTsKLQkJfSBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgewotCQkJY2hpbGRyZW4uYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCkpKTsKLQkJCWNoaWxkcmVuID0gZmlsdGVyUGx1Z2luKGNoaWxkcmVuKTsKLQkJfSBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQljaGlsZHJlbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdXBlci5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KSkpOwotLy8JCQljaGlsZHJlbiA9IHVud3JhcEZWV0lQcyhjaGlsZHJlbik7Ci0JCQljaGlsZHJlbiA9IGZpbHRlckNhdGVnb3J5RWxlbWVudHMocGFyZW50RWxlbWVudCwgY2hpbGRyZW4pOwotCQl9IGVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQljaGlsZHJlbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdXBlci5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KSkpOwotLy8JCQljaGlsZHJlbiA9IHVud3JhcEZWV0lQcyhjaGlsZHJlbik7Ci0JCQljaGlsZHJlbiA9IGZpbHRlckNhdGVnb3J5RWxlbWVudHMocGFyZW50RWxlbWVudCwgY2hpbGRyZW4pOwotCQl9IGVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQljaGlsZHJlbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdXBlci5nZXRFbGVtZW50cyhwYXJlbnRFbGVtZW50KSkpOwotCQkJY2hpbGRyZW4gPSBmaWx0ZXJQbHVnaW4oY2hpbGRyZW4pOwotCQl9IGVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJY2hpbGRyZW4uYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCkpKTsKLQkJfQotCQljcmVhdGVDaGlsZFBhcmVudE1hcChwYXJlbnRFbGVtZW50LCBjaGlsZHJlbik7Ci0JCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVDaGlsZFBhcmVudE1hcChPYmplY3QgcGFyZW50LCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsIHx8IGNoaWxkcmVuLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJLy8gaWYgdGhlIHBhcmVudCBpcyBhIFVJIGZvbGRlciwgbWFwIHRoZSBjaGlsZCB0byB0aGUgcGFyZW50Ci0JCQkvLyBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlIHBhcmVudCBsYXRlcgotCQkJLy8gaWYgKCAhKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpICkKLQkJCXsKLQkJCQljaGlsZFVJUGFyZW50TWFwLnB1dChjaGlsZCwgcGFyZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPE9iamVjdD4gZmlsdGVyUGx1Z2luKENvbGxlY3Rpb248T2JqZWN0PiBlbGVtZW50cykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJLy8gZmlsdGVyIG91dCBwbHVnaW5zIHRoYXQgaGF2ZSBubyBDQydzCi0JCQkJaWYgKCFoYXNDaGlsZHJlbigoTWV0aG9kUGx1Z2luKWVsZW1lbnQpIHx8ICFjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkJLy8gZmlsdGVyIG91dCBwbHVnaW4gcGFja2FnZXMgdGhhdCBoYXZlIG5vIHBsdWdpbnMgd2l0aCBDQydzCi0JCQkJaWYgKCFoYXNDaGlsZHJlbigoUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcillbGVtZW50KSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyKSB7Ci0JCQkJLy8gcmVtb3ZlICJDb25maWd1cmF0aW9ucyIgZm9sZGVyCi0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCQotCXByaXZhdGUgQ29sbGVjdGlvbjxPYmplY3Q+IGZpbHRlckNhdGVnb3J5RWxlbWVudHMoT2JqZWN0IHBhcmVudCwgQ29sbGVjdGlvbjxPYmplY3Q+IGVsZW1lbnRzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkpIHsKLQkJCQkvLyByZW1vdmUgbm9uLUNvbnRlbnRDYXRlZ29yeQotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQkKLS8vCXByaXZhdGUgQ29sbGVjdGlvbjxPYmplY3Q+IHVud3JhcEZWV0lQcyhDb2xsZWN0aW9uPE9iamVjdD4gZWxlbWVudHMpIHsKLS8vCQlDb2xsZWN0aW9uPE9iamVjdD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0vLwkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLS8vCQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotLy8JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0vLwkJCQlyZXN1bHQuYWRkKGdldEZpcnN0VHJlZUl0ZW1Gb3JDQygoQ3VzdG9tQ2F0ZWdvcnkpZWxlbWVudCkpOwotLy8JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLS8vCQkJCXJlc3VsdC5hZGQoZWxlbWVudCk7Ci0vLwkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlcikgewotLy8JCQkJcmVzdWx0LmFkZChlbGVtZW50KTsKLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gcmVzdWx0OwotLy8JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoY2hpbGRVSVBhcmVudE1hcC5jb250YWluc0tleShlbGVtZW50KSkgewotCQkJcmV0dXJuIGNoaWxkVUlQYXJlbnRNYXAuZ2V0KGVsZW1lbnQpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCQkvLyB0cnkgdG8gZGV0ZXJtaW5lIHBhcmVudAotLy8JCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotLy8JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UgJiYgCi0vLwkJCQkJZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotLy8JCQkJcmV0dXJuIExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbigoQ29udGVudENhdGVnb3J5KWVsZW1lbnQpOwotLy8JCQl9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0vLwkJCQlwYXJlbnQgPSBnZXRGaXJzdFRyZWVJdGVtRm9yQ0MoKEN1c3RvbUNhdGVnb3J5KXBhcmVudCk7Ci0vLwkJCX0KLS8vCQkJZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikgewotLy8JCQkJcGFyZW50ID0gVG5nVXRpbC51bndyYXAocGFyZW50KTsKLS8vCQkJfQotLy8JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0Rmlyc3RUcmVlSXRlbUZvckNDKEN1c3RvbUNhdGVnb3J5IGNjKSB7Ci0JCS8vIGdldCBJVHJlZUNvbnRlbnRQcm92aWRlciBhZGFwYXRlcgotCQlDdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyKSBnZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGNjLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGFwdGVyLmdldE5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBsaXN0ZW5lciA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCQkmJiBUbmdVdGlsLnVud3JhcChsaXN0ZW5lcikgPT0gY2MpIHsKLQkJCQlyZXR1cm4gKEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpbGlzdGVuZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNjOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uPE9iamVjdD4gZ2V0VHJlZUl0ZW1zKE9iamVjdCBpdGVtKSB7Ci0JCUxpc3Q8T2JqZWN0PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJLy8gZ2V0IElUcmVlQ29udGVudFByb3ZpZGVyIGFkYXBhdGVyCi0JCUxpc3Qgbm90aWZ5Q2hhbmdlZExpc3RlbmVycyA9IFRuZ1V0aWwuZ2V0Tm90aWZ5Q2hhbmdlZExpc3RlbmVycyhhZGFwdGVyRmFjdG9yeSwgaXRlbSk7Ci0JCWlmICghbm90aWZ5Q2hhbmdlZExpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBub3RpZnlDaGFuZ2VkTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgbGlzdGVuZXIgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYobGlzdGVuZXIgaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIKLQkJCQkJCSYmIFRuZ1V0aWwudW53cmFwKGxpc3RlbmVyKSA9PSBpdGVtKSB7Ci0JCQkJCXJlc3VsdC5hZGQobGlzdGVuZXIpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlc3VsdC5hZGQoaXRlbSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKGVsZW1lbnQpOwotCQlyZXR1cm4gKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCXN1cGVyLmlucHV0Q2hhbmdlZCh2aWV3ZXIsIG9sZElucHV0LCBuZXdJbnB1dCk7Ci0JCWNoaWxkVUlQYXJlbnRNYXAuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0KLQkJaWYgKChub3RpZmljYXRpb24gaW5zdGFuY2VvZiBJVmlld2VyTm90aWZpY2F0aW9uKSkgewotCQkJZmluYWwgSVZpZXdlck5vdGlmaWNhdGlvbiB2bnQgPSAoSVZpZXdlck5vdGlmaWNhdGlvbikgbm90aWZpY2F0aW9uOwotCQkJZmluYWwgT2JqZWN0IGVsZW1lbnQgPSB2bnQuZ2V0RWxlbWVudCgpOwotCQkJZmluYWwgQ2hlY2tib3hUcmVlVmlld2VyIGN0cmwgPSAoKENoZWNrYm94VHJlZVZpZXdlcikgc3VwZXIudmlld2VyKTsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgKHZudC5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQURECi0JCQkJCXx8IHZudC5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUKSkgewotCi0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQljdHJsLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWNoaWxkVUlQYXJlbnRNYXAuY2xlYXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9DYXRlZ29yeUxhYmVsUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NhdGVnb3J5TGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzRmNjc0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NhdGVnb3J5TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLS8qKgotICogTGFiZWwgcHJvdmlkZXIgZm9yIEN1c3RvbSBDYXRlZ29yeSB2aWV3IG9mIGNvbmZpZ3VyYXRpb24gcGFnZQotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqLwotCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcnlMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gY29udGVudFByb3ZpZGVyCi0JICovCi0JcHVibGljIENhdGVnb3J5TGFiZWxQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlRnJvbU9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgSUxhYmVsUHJvdmlkZXJ9LmdldFRleHQgYnkgZm9yd2FyZGluZyBpdCB0bwotCSAqIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSUl0ZW1MYWJlbFByb3ZpZGVyI2dldFRleHQgSUl0ZW1MYWJlbFByb3ZpZGVyLmdldFRleHR9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCVByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSAoKFByb2Nlc3NDb21wb25lbnQpIG9iamVjdCkKLQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCWlmIChwcm9jICE9IG51bGwpCi0JCQkJcmV0dXJuIHByb2MuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJZWxzZQotCQkJCS8vIGlmIHByb2Nlc3MgaXMgbnVsbCwgcmV0dXJuIHByb2Nlc3Njb21wb25lbnQgbmFtZQotCQkJCXJldHVybiAoKFByb2Nlc3NDb21wb25lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQl9IGVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NhdGVnb3J5VHJlZUZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ2F0ZWdvcnlUcmVlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYmMxZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ2F0ZWdvcnlUcmVlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNhdGVnb3J5VHJlZVZpZXdlcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci0KLS8qKgotICogRmlsdGVyIGZvciBDdXN0b20gQ2F0ZWdvcnkgdmlldyBvZiBjb25maWd1cmF0aW9uIHBhZ2UKLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKi8KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeVRyZWVGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewotCQotCUNhdGVnb3J5VHJlZVZpZXdlcldyYXBwZXIgQ0NWaWV3ZXI7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGhpZGVVbmNoZWNrZWQgPSBmYWxzZTsKLQkKLQlwdWJsaWMgQ2F0ZWdvcnlUcmVlRmlsdGVyKENhdGVnb3J5VHJlZVZpZXdlcldyYXBwZXIgQ0NWaWV3ZXIpIHsKLQkJdGhpcy5DQ1ZpZXdlciA9IENDVmlld2VyOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGhpZGVVbmNoZWNrZWQgJiYgIWlzQ2hlY2tlZChlbGVtZW50KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNIaWRlVW5jaGVja2VkKCkgewotCQlyZXR1cm4gaGlkZVVuY2hlY2tlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0b2dnbGVIaWRlVW5jaGVja2VkKCkgewotCQloaWRlVW5jaGVja2VkID0gIWhpZGVVbmNoZWNrZWQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc0NoZWNrZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJU2V0PE9iamVjdD4gY2hlY2tlZEl0ZW1zID0gQ0NWaWV3ZXIuZ2V0QWxsQ2hlY2tlZFRyZWVJdGVtcygpOwotCQlyZXR1cm4gY2hlY2tlZEl0ZW1zLmNvbnRhaW5zKGVsZW1lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NvbHVtbkVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NvbHVtbkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5MGE5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Db2x1bW5FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBNb2RlbHMgYSA8Y29sdW1uPiBlbGVtZW50IGluIHRoZSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlciIKLSAqIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGNsYXNzIENvbHVtbkVsZW1lbnQgewotCi0JLy8gcGx1Z2luIGJ1bmRsZQotCUJ1bmRsZSBidW5kbGU7Ci0JCi0JLy8gVGhlIGNvbHVtbiBJRC4KLQlwcml2YXRlIFN0cmluZyBpZDsKLQkKLQkvLyBUaGUgY29sdW1uIHdpZHRoLgotCXByaXZhdGUgaW50IHdpZHRoOwotCQotCS8vIFRoZSBjb2x1bW4gYWxpZ25tZW50Ci0JcHJpdmF0ZSBTdHJpbmcgYWxpZ25tZW50OwotCi0JLy8gVGhlIGNvbnRyaWJ1dG9yIGNsYXNzIGZvciB0aGUgY29sdW1uLgotCXByaXZhdGUgU3RyaW5nIGNvbnRyaWJ1dG9yQ2xhc3M7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYnVuZGxlCi0JICogCQkJICBJbnN0YWxsZWQgQnVuZGxlCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBUaGUgY29sdW1uIElELgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgd2lkdGggb2YgdGhlIGNvbHVtbiAgICAgCi0JICogQHBhcmFtIGNvbnRyaWJ1dG9yQ2xhc3MKLQkgKiAgICAgICAgICAgIFRoZSBjb2x1bW4gY29udHJpYnV0b3IgY2xhc3MuCi0JICovCi0JcHVibGljIENvbHVtbkVsZW1lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGlkLCBpbnQgd2lkdGgsIFN0cmluZyBhbGlnbm1lbnQsIFN0cmluZyBjb250cmlidXRvckNsYXNzKSB7Ci0JCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMud2lkdGggPSB3aWR0aDsKLQkJdGhpcy5hbGlnbm1lbnQgPSBhbGlnbm1lbnQ7Ci0JCXRoaXMuY29udHJpYnV0b3JDbGFzcyA9IGNvbnRyaWJ1dG9yQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sdW1uIElELgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGNvbHVtbiBJRC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbHVtbiB3aWR0aAotCSAqIAotCSAqIEByZXR1cm4gVGhlIGNvbHVtbiB3aWR0aAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0V2lkdGgoKSB7Ci0JCXJldHVybiB3aWR0aDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sdW1uIGFsaWdubWVudAotCSAqIAotCSAqIEByZXR1cm4gVGhlIGNvbHVtbiBhbGlnbm1lbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFsaWdubWVudCgpIHsKLQkJcmV0dXJuIGFsaWdubWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2x1bW4gY29udHJpYnV0b3IgY2xhc3MuCi0JICogCi0JICogQHJldHVybiBUaGUgY29sdW1uIGNvbnRyaWJ1dG9yIGNsYXNzLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29udHJpYnV0b3JDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJQ2xhc3MgY2xhenogPSBidW5kbGUubG9hZENsYXNzKGNvbnRyaWJ1dG9yQ2xhc3MpOwotCQlyZXR1cm4gY2xhenoubmV3SW5zdGFuY2UoKTsJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NvbmZpZ3VyYXRpb25MYWJlbFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Db25maWd1cmF0aW9uTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWM4YTI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NvbmZpZ3VyYXRpb25MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5Db2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIFRoZSBsYWJlbCBwcm92aWRlciBmb3IgdGhlIENvbmZpZ3VyYXRpb24gdmlldyB0cmVlLAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uTGFiZWxQcm92aWRlciBleHRlbmRzIFZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJQ29sb3JQcm92aWRlciB7Ci0JTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCi0JcHVibGljIENvbmZpZ3VyYXRpb25MYWJlbFByb3ZpZGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIElMYWJlbFByb3ZpZGVyfS5nZXRJbWFnZSBieSBmb3J3YXJkaW5nIGl0IHRvIGFuCi0JICogb2JqZWN0IHRoYXQgaW1wbGVtZW50cwotCSAqIHtAbGluayBJSXRlbUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UgSUl0ZW1MYWJlbFByb3ZpZGVyLmdldEltYWdlfQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHJldHVybiB0aGUgZGVmYXVsdCBpbWFnZQotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIElMYWJlbFByb3ZpZGVyfS5nZXRUZXh0IGJ5IGZvcndhcmRpbmcgaXQgdG8gYW4KLQkgKiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElJdGVtTGFiZWxQcm92aWRlciNnZXRUZXh0IElJdGVtTGFiZWxQcm92aWRlci5nZXRUZXh0fQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJZWxlbWVudCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmplY3QsIGNvbmZpZyk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJZWxlbWVudCA9ICgoRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqZWN0KQotCQkJCQkuZ2V0VmFsdWUoKTsKLQkJfQotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQllbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJfQotCQkKLQkJaWYoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQluYW1lID0gUHJvY2Vzc1V0aWwKLQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCW5hbWUgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZWxlbWVudCk7Ci0JCQl9Ci0KLQkJCS8vIG5hbWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldE5hbWUoKE1ldGhvZEVsZW1lbnQpb2JqZWN0LAotCQkJLy8gY29uZmlnKTsKLQkJfQotCi0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCW5hbWUgPSBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JCX0KLQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBpbmRleCkgewotCQlyZXR1cm4gZ2V0VGV4dChvYmplY3QpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBpbmRleCkgewotCQkvLyBieSBkZWZhdWx0LCByZXR1cm4gdGhlIGRlZmF1bHQgaW1hZ2UKLQkJcmV0dXJuIGdldEltYWdlKG9iamVjdCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWNvbmZpZyA9IG51bGw7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXIjZ2V0Rm9yZWdyb3VuZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xvciBnZXRGb3JlZ3JvdW5kKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChpc1N1cHByZXNzZWQoZWxlbWVudCkpIHsKLQkJCXJldHVybiBDb2xvcnMuU1VQUkVTU0VEX0VMRU1FTlRfTEFCRUw7Ci0JCX0KLQkJZWxzZSBpZiAoaXNFeHRlcm5hbChlbGVtZW50KSkgewotCQkJcmV0dXJuIENvbG9ycy5JTkhFUklURURfRUxFTUVOVF9MQUJFTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTdXBwcmVzc2VkKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQpOwotCQkJaWYocHJvYyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKHByb2MpLmlzU3VwcHJlc3NlZChlbGVtZW50KTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCU9iamVjdCB0b3AgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWVsZW1lbnQpLmdldFRvcEl0ZW0oKTsKLQkJCWlmKHRvcCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgewotCQkJCXJldHVybiBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbigoUHJvY2VzcykgdG9wKS5pc1N1cHByZXNzZWQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29sb3JQcm92aWRlciNnZXRCYWNrZ3JvdW5kKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbG9yIGdldEJhY2tncm91bmQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJLy8gbGV0IE9TIHRha2UgY29udHJvbCBvdmVyIHRyZWUgd2lkZ2V0IGJhY2tncm91bmQKLQkJLy8gcmF0aGVyIHRoYW4gc2VuZGluZyBvbmUgZml4ZWQgYmFja2dyb3VuZC4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyI2lzRXh0ZXJuYWwoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5pc0luaGVyaXRlZChlbGVtZW50KSB8fCBQcm9jZXNzVXRpbC5pc0NvbnRyaWJ1dGVkKGVsZW1lbnQpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlciNnZXRGb250KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEZvbnQgZ2V0Rm9udChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoUHJvY2Vzc1V0aWwuaXNJbmhlcml0ZWQoZWxlbWVudCkpIHsKLQkJCXJldHVybiBpdGFsaWNGb250OwotCQl9Ci0JCWVsc2UgaWYoUHJvY2Vzc1V0aWwuaXNDb250cmlidXRlZChlbGVtZW50KSkgewotCQkJcmV0dXJuIGJvbGRJdGFsaWNGb250OwotCQl9Ci0JCXJldHVybiByZWd1bGFyRm9udDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9EZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvRGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiYmVlNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9EZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgPENvbHVtbkVsZW1lbnQ+IGVsZW1lbnRzIGRlZmluZWQgdmlhIHRoZQotICogIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIiIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9QUk9WSURFUlNfRVhURU5TSU9OX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9QUk9WSURFUlNfRVhURU5TSU9OX05BTUUgPSAiZGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIEF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fUFJPVklERVJfRVhURU5TSU9OX0FUVFJfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fUFJPVklERVJfRVhURU5TSU9OX0FUVFJfV0lEVEggPSAid2lkdGgiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fUFJPVklERVJfRVhURU5TSU9OX0FUVFJfQUxJR05NRU5UID0gImFsaWduIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0RFRkFVTFRfV0lEVEggPSAyMDsgLy8kTk9OLU5MUy0xJAotCi0JLy8gQ29udGFpbnMgdGhlIGVkaXRvciBjb2x1bW4gcHJvdmlkZXJzIGxvYWRlZCB2aWEgdGhlCi0JLy8gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIiIGV4dGVuc2lvbiBwb2ludC4KLQlwcml2YXRlIEFycmF5TGlzdCBjb2x1bW5Qcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLwkgVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBEZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlciBpbnN0YW5jZSA9IG51bGw7Ci0JCi0JcHVibGljIHN0YXRpYyBEZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoRGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBEZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIERlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyKCkgewotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIGNvbHVtbiBwcm92aWRlcnMKLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCB0aGUgY29sdW1uIHByb3ZpZGVycy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDb2x1bW5Qcm92aWRlcnMoKSB7Ci0vLwkJTGlzdCBjb2x1bW5zID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uUHJvdmlkZXJzLnNpemUoKTsgaSsrKSB7Ci0vLwkJCUNvbHVtbkVsZW1lbnQgZWxlbWVudCA9IChDb2x1bW5FbGVtZW50KSBjb2x1bW5Qcm92aWRlcnMKLS8vCQkJCQkuZ2V0KGkpOwotLy8JCQlPYmplY3QgY29udHJpYnV0b3JDbGFzcyA9IG51bGw7Ci0vLwkJCXRyeSB7Ci0vLwkJCQljb250cmlidXRvckNsYXNzID0gZWxlbWVudC5nZXRDb250cmlidXRvckNsYXNzKCk7Ci0vLwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCX0KLS8vCQkJY29sdW1ucy5hZGQoY29udHJpYnV0b3JDbGFzcyk7Ci0vLwkJfQotLy8JCXJldHVybiBjb2x1bW5zOwotCQlyZXR1cm4gY29sdW1uUHJvdmlkZXJzOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkcyB0aGUgY29uZmlndXJhdGlvbiBwcm92aWRlcnMgc3BlY2lmaWVkIHZpYSB0aGUKLQkgKiAiZGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIiIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkUHJvdmlkZXJzKCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQlDT0xVTU5fUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FU1BBQ0UsCi0JCQkJQ09MVU1OX1BST1ZJREVSU19FWFRFTlNJT05fTkFNRSk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCQotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBpZCA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZShDT0xVTU5fUFJPVklERVJfRVhURU5TSU9OX0FUVFJfSUQpOwotCQkJCQkJU3RyaW5nIHdpZHRoU3RyID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKENPTFVNTl9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9XSURUSCk7Ci0JCQkJCQlpbnQgd2lkdGggPSBwYXJzZVdpZHRoKHdpZHRoU3RyKTsKLQkJCQkJCVN0cmluZyBhbGlnbm1lbnQgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShDT0xVTU5fUFJPVklERVJfRVhURU5TSU9OX0FUVFJfQUxJR05NRU5UKTsKLQkJCQkJCVN0cmluZyBjb250cmlidXRvckNsYXNzID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKENPTFVNTl9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9DTEFTUyk7IAotCQkJCQkJQ29sdW1uRWxlbWVudCBlbGVtZW50ID0gbmV3IENvbHVtbkVsZW1lbnQoYnVuZGxlLAotCQkJCQkJCQlpZCwgd2lkdGgsIGFsaWdubWVudCwgY29udHJpYnV0b3JDbGFzcyk7Ci0JCQkJCQljb2x1bW5Qcm92aWRlcnMuYWRkKGVsZW1lbnQpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkJCQkiRmFpbGVkIHRvIGxvYWQgRWRpdG9yIGNvbHVtbiBQcm92aWRlciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgaW50IHBhcnNlV2lkdGgoU3RyaW5nIHN0cikgewotCQl0cnkgewotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoc3RyKTsKLQkJfQotCQljYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJcmV0dXJuIENPTFVNTl9ERUZBVUxUX1dJRFRIOwotCQl9CQkKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9FZGl0b3JQYWdlRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvRWRpdG9yUGFnZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyMWY1My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9FZGl0b3JQYWdlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogTW9kZWxzIGEgPGVkaXRvclBhZ2U+IGVsZW1lbnQgaW4gdGhlICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkVkaXRvclBhZ2VQcm92aWRlciIKLSAqIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVkaXRvclBhZ2VFbGVtZW50IHsKLQotCS8vIHBsdWdpbiBidW5kbGUKLQlCdW5kbGUgYnVuZGxlOwotCQotCS8vIFRoZSBwYWdlIElELgotCXByaXZhdGUgU3RyaW5nIGlkOwotCQotCS8vIFRoZSBwYWdlIG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCS8vIFRoZSBjb250cmlidXRvciBjbGFzcyBmb3IgdGhlIHBhZ2UuCi0JcHJpdmF0ZSBTdHJpbmcgY29udHJpYnV0b3JDbGFzczsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiAJCQkgIEluc3RhbGxlZCBCdW5kbGUKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIFRoZSBwYWdlIElELgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgcGFnZSBuYW1lLiAgICAgICAgICAgIAotCSAqIEBwYXJhbSBjb250cmlidXRvckNsYXNzCi0JICogICAgICAgICAgICBUaGUgcGFnZSBjb250cmlidXRvciBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgRWRpdG9yUGFnZUVsZW1lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRyaWJ1dG9yQ2xhc3MpIHsKLQkJdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5jb250cmlidXRvckNsYXNzID0gY29udHJpYnV0b3JDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWdlIElELgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHBhZ2UgSUQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWdlIG5hbWUuCi0JICogCi0JICogQHJldHVybiBUaGUgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFnZSBjb250cmlidXRvciBjbGFzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBwYWdlIGNvbnRyaWJ1dG9yIGNsYXNzLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29udHJpYnV0b3JDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJQ2xhc3MgY2xhenogPSBidW5kbGUubG9hZENsYXNzKGNvbnRyaWJ1dG9yQ2xhc3MpOwotCQlyZXR1cm4gY2xhenoubmV3SW5zdGFuY2UoKTsJCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvRXhwb3NlZEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9FeHBvc2VkQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMwMTY0Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9FeHBvc2VkQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvc2VkQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZXh0ZW5kcwotCQlBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElWaWV3ZXJQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVkaXRvclBhZ2VQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWRpdG9yUGFnZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYjczMmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWRpdG9yUGFnZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSA8ZWRpdG9yUGFnZT4gZWxlbWVudHMgZGVmaW5lZCB2aWEgdGhlCi0gKiAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5FZGl0b3JQYWdlUHJvdmlkZXIiIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVkaXRvclBhZ2VQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX1BST1ZJREVSU19FWFRFTlNJT05fTkFNRVNQQUNFID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9QUk9WSURFUlNfRVhURU5TSU9OX05BTUUgPSAiVGFza0VkaXRvclBhZ2VQcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gQXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfUFJPVklERVJfRVhURU5TSU9OX0FUVFJfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX1BST1ZJREVSX0VYVEVOU0lPTl9BVFRSX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfUFJPVklERVJfRVhURU5TSU9OX0FUVFJfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBDb250YWlucyB0aGUgZWRpdG9yIHBhZ2UgcHJvdmlkZXJzIGxvYWRlZCB2aWEgdGhlCi0JLy8gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuTWV0aG9kRWRpdG9yUGFnZVByb3ZpZGVyIiBleHRlbnNpb24gcG9pbnQuCi0JcHJpdmF0ZSBBcnJheUxpc3QgcGFnZVByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vCSBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIE1ldGhvZEVkaXRvclBhZ2VQcm92aWRlciBpbnN0YW5jZSA9IG51bGw7Ci0JCi0JcHVibGljIHN0YXRpYyBNZXRob2RFZGl0b3JQYWdlUHJvdmlkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKE1ldGhvZEVkaXRvclBhZ2VQcm92aWRlci5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IE1ldGhvZEVkaXRvclBhZ2VQcm92aWRlcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE1ldGhvZEVkaXRvclBhZ2VQcm92aWRlcigpIHsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBwYWdlIHByb3ZpZGVycwotCSAqIAotCSAqIEByZXR1cm4gYWxsIHRoZSBwYWdlIHByb3ZpZGVycy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQYWdlUHJvdmlkZXJzKCkgewotCQlMaXN0IHBhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VQcm92aWRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCUVkaXRvclBhZ2VFbGVtZW50IHBhZ2VFbGVtZW50ID0gKEVkaXRvclBhZ2VFbGVtZW50KSBwYWdlUHJvdmlkZXJzCi0JCQkJCS5nZXQoaSk7Ci0JCQlPYmplY3QgY29udHJpYnV0b3JDbGFzcyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWNvbnRyaWJ1dG9yQ2xhc3MgPSBwYWdlRWxlbWVudC5nZXRDb250cmlidXRvckNsYXNzKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQkJcGFnZXMuYWRkKGNvbnRyaWJ1dG9yQ2xhc3MpOwotCQl9Ci0JCXJldHVybiBwYWdlczsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgY29uZmlndXJhdGlvbiBwcm92aWRlcnMgc3BlY2lmaWVkIHZpYSB0aGUKLQkgKiAiY29tLmlibS5wcm9jZXNzLnBhZ2VQcm92aWRlcnMiIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkUHJvdmlkZXJzKCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQlQQUdFX1BST1ZJREVSU19FWFRFTlNJT05fTkFNRVNQQUNFLAotCQkJCVBBR0VfUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0KLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgaWQgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoUEFHRV9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9JRCk7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZShQQUdFX1BST1ZJREVSX0VYVEVOU0lPTl9BVFRSX05BTUUpOwotCQkJCQkJU3RyaW5nIGNvbnRyaWJ1dG9yQ2xhc3MgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoUEFHRV9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9DTEFTUyk7IAotCi0JCQkJCQlFZGl0b3JQYWdlRWxlbWVudCBwYWdlRWxlbWVudCA9IG5ldyBFZGl0b3JQYWdlRWxlbWVudCgKLQkJCQkJCQkJYnVuZGxlLCBpZCwgbmFtZSwgY29udHJpYnV0b3JDbGFzcyk7Ci0JCQkJCQlwYWdlUHJvdmlkZXJzLmFkZChwYWdlRWxlbWVudCk7Ci0JCQkJCQkKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJCQkJIkZhaWxlZCB0byBsb2FkIEVkaXRvciBQYWdlIFByb3ZpZGVyIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWxlbWVudExhYmVsRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OGI2ZTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWxlbWVudExhYmVsRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklEZWNvcmF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogTGFiZWwgZGVjb3JhdG9yIGZvciBtZXRob2QgZWxlbWVudAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvciBpbXBsZW1lbnRzIElMYWJlbERlY29yYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgSUxhYmVsRGVjb3JhdG9yIGRlbGVnYXRlRGVjb3JhdG9yOwotCQotCXByaXZhdGUgc3RhdGljIElMYWJlbERlY29yYXRvciBnZXREZWxlZ2F0ZURlY29yYXRvcigpIHsKLQkJaWYgKGRlbGVnYXRlRGVjb3JhdG9yID09IG51bGwpIHsKLQkJCWRlbGVnYXRlRGVjb3JhdG9yID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKTsKLQkJfQotCQlyZXR1cm4gZGVsZWdhdGVEZWNvcmF0b3I7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElSZXNvdXJjZSBnZXRXb3Jrc3BhY2VSZXNvdXJjZShPYmplY3QgZWxlbWVudCkgewotCQllbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCS8vIGRvbid0IGRlY29yYXRlIGljb24gb2YgcHJlZGVmaW5lZCBlbGVtZW50cyBpbiBsaWJyYXJ5IHZpZXcgYi9jIHNvbWUgb2YgdGhlbSBhcmUgc2hvd24gYXMgVUkgZm9sZGVyCi0JCS8vCi0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIFRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBlbGVtZW50KSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIFBlcnNpc3RlbmNlVXRpbC5nZXRXb3Jrc3BhY2VSZXNvdXJjZShlbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIE1ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvcigpIHsKLQkJCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvciNkZWNvcmF0ZUltYWdlKG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZSwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZGVjb3JhdGVJbWFnZShJbWFnZSBpbWFnZSwgT2JqZWN0IGVsZW1lbnQpIHsJCQotCQlJUmVzb3VyY2Ugd3NSZXMgPSBnZXRXb3Jrc3BhY2VSZXNvdXJjZShlbGVtZW50KTsKLQkJaWYod3NSZXMgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBnZXREZWxlZ2F0ZURlY29yYXRvcigpLmRlY29yYXRlSW1hZ2UoaW1hZ2UsIHdzUmVzKTsKLQkJfQotCQlyZXR1cm4gZ2V0RGVsZWdhdGVEZWNvcmF0b3IoKS5kZWNvcmF0ZUltYWdlKGltYWdlLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yI2RlY29yYXRlVGV4dChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZGVjb3JhdGVUZXh0KFN0cmluZyB0ZXh0LCBPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWdldERlbGVnYXRlRGVjb3JhdG9yKCkuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCUlSZXNvdXJjZSB3c1JlcyA9IGdldFdvcmtzcGFjZVJlc291cmNlKGVsZW1lbnQpOwotCQlpZih3c1JlcyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZWdhdGVEZWNvcmF0b3IoKS5pc0xhYmVsUHJvcGVydHkod3NSZXMsIHByb3BlcnR5KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlnZXREZWxlZ2F0ZURlY29yYXRvcigpLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJEZWNvcmF0aW9uQ2FjaGUoKSB7Ci0JCUlEZWNvcmF0b3JNYW5hZ2VyIGRlY29yYXRvck1hbmFnZXIgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKTsKLQkJZGVjb3JhdG9yTWFuYWdlci51cGRhdGUoIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLk1ldGhvZEVsZW1lbnRMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9NZXRob2RFbGVtZW50TGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWxlbWVudExpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQxOTc0YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9NZXRob2RFbGVtZW50TGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5MaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuTWV0aG9kUmljaFRleHRNYXJrZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50TGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciBpbXBsZW1lbnRzCi0JCUlMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3Igb3ZlcmxheSA9IG51bGw7Ci0JCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUNPUkFUT1JfSUQgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWxlbWVudExpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yI2RlY29yYXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlY29yYXRlKE9iamVjdCBlbGVtZW50LCBJRGVjb3JhdGlvbiBkZWNvcmF0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlpZihMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlci5pc0ludmFsaWQoZWxlbWVudCkKLS8vCQkJCQl8fCBNZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlci5pc0ludmFsaWQoZWxlbWVudCkKLQkJCQkJKSB7Ci0JCQkJZGVjb3JhdGlvbi5hZGRPdmVybGF5KGdldEVycm9yT3ZlcmxheSgpKTsKLQkJCX0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQkKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0RXJyb3JPdmVybGF5KCkgewotCQlpZihvdmVybGF5ID09IG51bGwpIHsKLQkJCW92ZXJsYXkgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL292cjE2L2Vycm9yX292ci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBvdmVybGF5OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWxlbWVudFVJTGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWxlbWVudFVJTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2RiZTQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRVSUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQ29kZSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS52aWV3c3VwcG9ydC5KYXZhVUlMYWJlbFByb3ZpZGVyCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRVSUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciB7Ci0JCi0JcHJvdGVjdGVkIExpc3RlbmVyTGlzdCBmTGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCQotCUlMYWJlbFByb3ZpZGVyIGZMYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQotCXByaXZhdGUgQXJyYXlMaXN0PElMYWJlbERlY29yYXRvcj4gZkxhYmVsRGVjb3JhdG9yczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGFiZWwgcHJvdmlkZXIgd2l0aCBkZWZhdWx0IGZsYWdzLgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50VUlMYWJlbFByb3ZpZGVyKCkgewotCQlmTGFiZWxEZWNvcmF0b3JzPSBudWxsOyAKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyBhIGRlY29yYXRvciB0byB0aGUgbGFiZWwgcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMYWJlbERlY29yYXRvcihJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yKSB7Ci0JCWlmIChmTGFiZWxEZWNvcmF0b3JzID09IG51bGwpIHsKLQkJCWZMYWJlbERlY29yYXRvcnM9IG5ldyBBcnJheUxpc3Q8SUxhYmVsRGVjb3JhdG9yPigyKTsKLQkJfQotCQlmTGFiZWxEZWNvcmF0b3JzLmFkZChkZWNvcmF0b3IpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW1hZ2UgZGVjb3JhdGVJbWFnZShJbWFnZSBpbWFnZSwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGZMYWJlbERlY29yYXRvcnMgIT0gbnVsbCAmJiBpbWFnZSAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgZkxhYmVsRGVjb3JhdG9ycy5zaXplKCk7IGkrKykgewotCQkJCUlMYWJlbERlY29yYXRvciBkZWNvcmF0b3I9IChJTGFiZWxEZWNvcmF0b3IpIGZMYWJlbERlY29yYXRvcnMuZ2V0KGkpOwotCQkJCWltYWdlPSBkZWNvcmF0b3IuZGVjb3JhdGVJbWFnZShpbWFnZSwgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElMYWJlbFByb3ZpZGVyI2dldEltYWdlCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCUltYWdlIHJlc3VsdD0gZkxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCXJldHVybiBkZWNvcmF0ZUltYWdlKHJlc3VsdCwgZWxlbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBkZWNvcmF0ZVRleHQoU3RyaW5nIHRleHQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChmTGFiZWxEZWNvcmF0b3JzICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBmTGFiZWxEZWNvcmF0b3JzLnNpemUoKTsgaSsrKSB7Ci0JCQkJSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcj0gKElMYWJlbERlY29yYXRvcikgZkxhYmVsRGVjb3JhdG9ycy5nZXQoaSk7Ci0JCQkJdGV4dD0gZGVjb3JhdG9yLmRlY29yYXRlVGV4dCh0ZXh0LCBlbGVtZW50KTsKLQkJCX0KLQkJfQkKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJTGFiZWxQcm92aWRlciNnZXRUZXh0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCVN0cmluZyByZXN1bHQ9IGZMYWJlbFByb3ZpZGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCXJldHVybiBkZWNvcmF0ZVRleHQocmVzdWx0LCBlbGVtZW50KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChmTGFiZWxEZWNvcmF0b3JzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBmTGFiZWxEZWNvcmF0b3JzLnNpemUoKTsgaSsrKSB7Ci0JCQkJSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcj0gKElMYWJlbERlY29yYXRvcikgZkxhYmVsRGVjb3JhdG9ycy5nZXQoaSk7Ci0JCQkJZGVjb3JhdG9yLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWZMYWJlbERlY29yYXRvcnM9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZkxhYmVsRGVjb3JhdG9ycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgZkxhYmVsRGVjb3JhdG9ycy5zaXplKCk7IGkrKykgewotCQkJCUlMYWJlbERlY29yYXRvciBkZWNvcmF0b3I9IChJTGFiZWxEZWNvcmF0b3IpIGZMYWJlbERlY29yYXRvcnMuZ2V0KGkpOwotCQkJCWRlY29yYXRvci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQkJZkxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KE9iamVjdCwgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiB0cnVlOwkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChmTGFiZWxEZWNvcmF0b3JzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBmTGFiZWxEZWNvcmF0b3JzLnNpemUoKTsgaSsrKSB7Ci0JCQkJSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcj0gKElMYWJlbERlY29yYXRvcikgZkxhYmVsRGVjb3JhdG9ycy5nZXQoaSk7Ci0JCQkJZGVjb3JhdG9yLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCQlmTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElMYWJlbERlY29yYXRvcltdIGdldERlY29yYXRvcnMoYm9vbGVhbiBlcnJvcnRpY2ssIElMYWJlbERlY29yYXRvciBleHRyYSkgewotCQlpZiAoZXJyb3J0aWNrKSB7Ci0JCQlpZiAoZXh0cmEgPT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgSUxhYmVsRGVjb3JhdG9yW10ge307Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBuZXcgSUxhYmVsRGVjb3JhdG9yW10geyBleHRyYSB9OwotCQkJfQotCQl9Ci0JCWlmIChleHRyYSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElMYWJlbERlY29yYXRvcltdIHsgZXh0cmEgfTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogRmlyZXMgYSBsYWJlbCBwcm92aWRlciBjaGFuZ2VkIGV2ZW50IHRvIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycwotICAgICAqIE9ubHkgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgYXQgdGhlIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFyZSBub3RpZmllZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBldmVudCBhIGxhYmVsIHByb3ZpZGVyIGNoYW5nZWQgZXZlbnQKLSAgICAgKgotICAgICAqIEBzZWUgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciNsYWJlbFByb3ZpZGVyQ2hhbmdlZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpcmVMYWJlbFByb3ZpZGVyQ2hhbmdlZChmaW5hbCBMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIE9iamVjdFtdIGxpc3RlbmVycyA9IGZMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBmaW5hbCBJTGFiZWxQcm92aWRlckxpc3RlbmVyIGwgPSAoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikgbGlzdGVuZXJzW2ldOwotICAgICAgICAgICAgU2FmZVJ1bm5lci5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGwubGFiZWxQcm92aWRlckNoYW5nZWQoZXZlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Qcm9ibGVtc0xhYmVsRGVjb3JhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Qcm9ibGVtc0xhYmVsRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMWMzMmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvUHJvYmxlbXNMYWJlbERlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWwuSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbC5JbWFnZURlc2NyaXB0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsLkltYWdlSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWwuTWV0aG9kRWxlbWVudEltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotCi0vKioKLSAqIENvZGUgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5qZHQudWkuUHJvYmxlbXNMYWJlbERlY29yYXRvciAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9ibGVtc0xhYmVsRGVjb3JhdG9yIGltcGxlbWVudHMgSUxhYmVsRGVjb3JhdG9yLCBJTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciB7Ci0JCi0JLyoqCi0JICogVGhpcyBpcyBhIHNwZWNpYWwgPGNvZGU+TGFiZWxQcm92aWRlckNoYW5nZWRFdmVudDwvY29kZT4gY2FycnlpbmcgYWRkaXRpb25hbCAKLQkgKiBpbmZvcm1hdGlvbiB3aGV0aGVyIHRoZSBldmVudCBvcmlnaW5zIGZyb20gYSBtYWtlciBjaGFuZ2UuCi0JICogPHA+Ci0JICogPGNvZGU+UHJvYmxlbXNMYWJlbENoYW5nZWRFdmVudDwvY29kZT5zIGFyZSBvbmx5IGdlbmVyYXRlZCBieSA8Y29kZT4KLQkgKiBQcm9ibGVtc0xhYmVsRGVjb3JhdG9yPC9jb2RlPnMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvYmxlbXNMYWJlbENoYW5nZWRFdmVudCBleHRlbmRzIExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgewotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRD0gMUw7Ci0JCQotCQlwcml2YXRlIGJvb2xlYW4gZk1hcmtlckNoYW5nZTsKLQotCQkvKioKLQkJICogTm90ZTogVGhpcyBjb25zdHJ1Y3RvciBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgY29uc3RydWN0b3IuCi0JCSAqIAotCQkgKiBAcGFyYW0gZXZlbnRTb3VyY2UgdGhlIGJhc2UgbGFiZWwgcHJvdmlkZXIKLQkJICogQHBhcmFtIGNoYW5nZWRSZXNvdXJjZSB0aGUgY2hhbmdlZCByZXNvdXJjZXMKLQkJICogQHBhcmFtIGlzTWFya2VyQ2hhbmdlIDxjb2RlPnRydWU8Y29kZT4gaWYgdGhlIGNoYW5nZSBpcyBhIG1hcmtlciBjaGFuZ2U7IG90aGVyd2lzZQotCQkgKiAgPGNvZGU+ZmFsc2U8L2NvZGU+IAotCQkgKi8KLQkJcHVibGljIFByb2JsZW1zTGFiZWxDaGFuZ2VkRXZlbnQoSUJhc2VMYWJlbFByb3ZpZGVyIGV2ZW50U291cmNlLCBJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2UsIGJvb2xlYW4gaXNNYXJrZXJDaGFuZ2UpIHsKLQkJCXN1cGVyKGV2ZW50U291cmNlLCBjaGFuZ2VkUmVzb3VyY2UpOwotCQkJZk1hcmtlckNoYW5nZT0gaXNNYXJrZXJDaGFuZ2U7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBldmVudCBvcmlnaW5zIGZyb20gbWFya2VyIGNoYW5nZXMuIElmIDxjb2RlPmZhbHNlPC9jb2RlPiBhbiBhbm5vdGF0aW9uIAotCQkgKiBtb2RlbCBjaGFuZ2UgaXMgdGhlIG9yaWdpbi4gSW4gdGhpcyBjYXNlIHZpZXdlcnMgbm90IGRpc3BsYXlpbmcgd29ya2luZyBjb3BpZXMgY2FuIGlnbm9yZSB0aGVzZSAKLQkJICogZXZlbnRzLgotCQkgKiAKLQkJICogQHJldHVybiBpZiB0aGlzIGV2ZW50IG9yaWdpbnMgZnJvbSBhIG1hcmtlciBjaGFuZ2UuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc01hcmtlckNoYW5nZSgpIHsKLQkJCXJldHVybiBmTWFya2VyQ2hhbmdlOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JUSUNLX0VSUk9SPSBNZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLkVSUk9SOwkKLQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkgZlJlZ2lzdHJ5OwotCXByaXZhdGUgYm9vbGVhbiBmVXNlTmV3UmVnaXN0cnk9IGZhbHNlOwotCXByaXZhdGUgSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIgZlByb2JsZW1DaGFuZ2VkTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgZkxpc3RlbmVyczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UHJvYmxlbXNMYWJlbERlY29yYXRvcjwvY29kZT4uCi0JICovCi0JcHVibGljIFByb2JsZW1zTGFiZWxEZWNvcmF0b3IoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JCWZVc2VOZXdSZWdpc3RyeT0gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogTm90ZTogVGhpcyBjb25zdHJ1Y3RvciBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHJlZ2lzdHJ5IFRoZSByZWdpc3RyeSB0byB1c2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gdXNlIHRoZSBKYXZhIHBsdWdpbidzCi0JICogIGltYWdlIHJlZ2lzdHJ5Ci0JICovCi0JcHVibGljIFByb2JsZW1zTGFiZWxEZWNvcmF0b3IoSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJZlJlZ2lzdHJ5PSByZWdpc3RyeTsKLQkJZlByb2JsZW1DaGFuZ2VkTGlzdGVuZXI9IG51bGw7Ci0JfQotCQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB7Ci0JCWlmIChmUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJZlJlZ2lzdHJ5PSBmVXNlTmV3UmVnaXN0cnkgPyBuZXcgSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKSA6IEF1dGhvcmluZ1VJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGZSZWdpc3RyeTsKLQl9Ci0JCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJTGFiZWxEZWNvcmF0b3IjZGVjb3JhdGVUZXh0KFN0cmluZywgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZGVjb3JhdGVUZXh0KFN0cmluZyB0ZXh0LCBPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gdGV4dDsKLQl9CQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUxhYmVsRGVjb3JhdG9yI2RlY29yYXRlSW1hZ2UoSW1hZ2UsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZGVjb3JhdGVJbWFnZShJbWFnZSBpbWFnZSwgT2JqZWN0IG9iaikgewotCQlpbnQgYWRvcm5tZW50RmxhZ3M9IGNvbXB1dGVBZG9ybm1lbnRGbGFncyhvYmopOwotCQlpZiAoYWRvcm5tZW50RmxhZ3MgIT0gMCkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGJhc2VJbWFnZT0gbmV3IEltYWdlSW1hZ2VEZXNjcmlwdG9yKGltYWdlKTsKLQkJCVJlY3RhbmdsZSBib3VuZHM9IGltYWdlLmdldEJvdW5kcygpOwotCQkJcmV0dXJuIGdldFJlZ2lzdHJ5KCkuZ2V0KG5ldyBNZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yKGJhc2VJbWFnZSwgYWRvcm5tZW50RmxhZ3MsIG5ldyBQb2ludChib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpKSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIG9iaiB0aGUgZWxlbWVudCB0byBjb21wdXRlIHRoZSBmbGFncyBmb3IKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhZG9ybm1lbnQgZmxhZ3MKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNvbXB1dGVBZG9ybm1lbnRGbGFncyhPYmplY3Qgb2JqKSB7Ci0JCXRyeSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXJldHVybiBnZXRFcnJvclRpY2tzRnJvbU1hcmtlcnMoKE1ldGhvZEVsZW1lbnQpIG9iaiwgUGVyc2lzdGVuY2VVdGlsLmdldFdvcmtzcGFjZVJlc291cmNlKG9iaiksIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJCXJldHVybiBnZXRFcnJvclRpY2tzRnJvbU1hcmtlcnMobnVsbCwgKElSZXNvdXJjZSkgb2JqLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChlLmdldFN0YXR1cygpLmdldENvZGUoKSA9PSBJUmVzb3VyY2VTdGF0dXMuTUFSS0VSX05PVF9GT1VORCkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJCi0JCQlBdXRob3JpbmdVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0RXJyb3JUaWNrc0Zyb21NYXJrZXJzKE1ldGhvZEVsZW1lbnQgZSwgSVJlc291cmNlIHJlcywKLQkJCWludCBkZXB0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocmVzID09IG51bGwgfHwgIXJlcy5pc0FjY2Vzc2libGUoKSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaW50IGluZm8gPSAwOwotCi0JCUlNYXJrZXJbXSBtYXJrZXJzID0gcmVzLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwgZGVwdGgpOwotCQlpZiAobWFya2VycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoICYmIChpbmZvICE9IEVSUk9SVElDS19FUlJPUik7IGkrKykgewotCQkJCUlNYXJrZXIgY3VyciA9IG1hcmtlcnNbaV07Ci0JCQkJaW50IHByaW9yaXR5ID0gY3Vyci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgLTEpOwotCQkJCWlmIChwcmlvcml0eSA9PSBJTWFya2VyLlNFVkVSSVRZX0VSUk9SCi0JCQkJCQkmJiAoZSA9PSBudWxsIHx8IGUKLQkJCQkJCQkJLmdldEd1aWQoKQotCQkJCQkJCQkuZXF1YWxzKAotCQkJCQkJCQkJCWN1cnIKLQkJCQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIuR1VJRCkpKSkgewotCQkJCQlpbmZvID0gRVJST1JUSUNLX0VSUk9SOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChmUHJvYmxlbUNoYW5nZWRMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvYmxlbU1hcmtlck1hbmFnZXIoKS5yZW1vdmVMaXN0ZW5lcihmUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQlmUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcj0gbnVsbDsKLQkJfQotCQlpZiAoZlJlZ2lzdHJ5ICE9IG51bGwgJiYgZlVzZU5ld1JlZ2lzdHJ5KSB7Ci0JCQlmUmVnaXN0cnkuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShPYmplY3QsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZkxpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQlmTGlzdGVuZXJzPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JCX0KLQkJZkxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQlpZiAoZlByb2JsZW1DaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJZlByb2JsZW1DaGFuZ2VkTGlzdGVuZXI9IG5ldyBJUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9ibGVtc0NoYW5nZWQoSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcywgYm9vbGVhbiBpc01hcmtlckNoYW5nZSkgewotCQkJCQlmaXJlUHJvYmxlbXNDaGFuZ2VkKGNoYW5nZWRSZXNvdXJjZXMsIGlzTWFya2VyQ2hhbmdlKTsKLQkJCQl9Ci0JCQl9OwotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByb2JsZW1NYXJrZXJNYW5hZ2VyKCkuYWRkTGlzdGVuZXIoZlByb2JsZW1DaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0JfQkKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGZMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQkJaWYgKGZMaXN0ZW5lcnMuaXNFbXB0eSgpICYmIGZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyICE9IG51bGwpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvYmxlbU1hcmtlck1hbmFnZXIoKS5yZW1vdmVMaXN0ZW5lcihmUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQkJZlByb2JsZW1DaGFuZ2VkTGlzdGVuZXI9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpcmVQcm9ibGVtc0NoYW5nZWQoSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcywgYm9vbGVhbiBpc01hcmtlckNoYW5nZSkgewotCQlpZiAoZkxpc3RlbmVycyAhPSBudWxsICYmICFmTGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudD0gbmV3IFByb2JsZW1zTGFiZWxDaGFuZ2VkRXZlbnQodGhpcywgY2hhbmdlZFJlc291cmNlcywgaXNNYXJrZXJDaGFuZ2UpOwotCQkJT2JqZWN0W10gbGlzdGVuZXJzPSBmTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCSgoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikgbGlzdGVuZXJzW2ldKS5sYWJlbFByb3ZpZGVyQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IjZGVjb3JhdGUoamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRGVjb3JhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWNvcmF0ZShPYmplY3QgZWxlbWVudCwgSURlY29yYXRpb24gZGVjb3JhdGlvbikgeyAKLQkJaW50IGFkb3JubWVudEZsYWdzPSBjb21wdXRlQWRvcm5tZW50RmxhZ3MoZWxlbWVudCk7Ci0JCWlmIChhZG9ybm1lbnRGbGFncyA9PSBFUlJPUlRJQ0tfRVJST1IpIHsKLQkJCWRlY29yYXRpb24uYWRkT3ZlcmxheShBdXRob3JpbmdVSUltYWdlcy5JTUdfREVTQ19PVlJfRVJST1IpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Qcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Qcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNzc1NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvUHJvY2Vzc0VkaXRvclBhZ2VQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgPGVkaXRvclBhZ2U+IGVsZW1lbnRzIGRlZmluZWQgdmlhIHRoZQotICogIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuRWRpdG9yUGFnZVByb3ZpZGVyIiBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FU1BBQ0UgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX1BST1ZJREVSU19FWFRFTlNJT05fTkFNRSA9ICJQcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBBdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfUFJPVklERVJfRVhURU5TSU9OX0FUVFJfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIENvbnRhaW5zIHRoZSBlZGl0b3IgcGFnZSBwcm92aWRlcnMgbG9hZGVkIHZpYSB0aGUKLQkvLyAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5Qcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyIiBleHRlbnNpb24gcG9pbnQuCi0JcHJpdmF0ZSBBcnJheUxpc3QgcGFnZVByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vCSBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFByb2Nlc3NFZGl0b3JQYWdlUHJvdmlkZXIgaW5zdGFuY2UgPSBudWxsOwotCQotCXB1YmxpYyBzdGF0aWMgUHJvY2Vzc0VkaXRvclBhZ2VQcm92aWRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoUHJvY2Vzc0VkaXRvclBhZ2VQcm92aWRlci5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IFByb2Nlc3NFZGl0b3JQYWdlUHJvdmlkZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBQcm9jZXNzRWRpdG9yUGFnZVByb3ZpZGVyKCkgewotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIHBhZ2UgcHJvdmlkZXJzCi0JICogCi0JICogQHJldHVybiBhbGwgdGhlIHBhZ2UgcHJvdmlkZXJzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFBhZ2VQcm92aWRlcnMoKSB7Ci0JCUxpc3QgcGFnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZVByb3ZpZGVycy5zaXplKCk7IGkrKykgewotCQkJRWRpdG9yUGFnZUVsZW1lbnQgcGFnZUVsZW1lbnQgPSAoRWRpdG9yUGFnZUVsZW1lbnQpIHBhZ2VQcm92aWRlcnMKLQkJCQkJLmdldChpKTsKLQkJCU9iamVjdCBjb250cmlidXRvckNsYXNzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJY29udHJpYnV0b3JDbGFzcyA9IHBhZ2VFbGVtZW50LmdldENvbnRyaWJ1dG9yQ2xhc3MoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlwYWdlcy5hZGQoY29udHJpYnV0b3JDbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIHBhZ2VzOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkcyB0aGUgY29uZmlndXJhdGlvbiBwcm92aWRlcnMgc3BlY2lmaWVkIHZpYSB0aGUKLQkgKiAiY29tLmlibS5wcm9jZXNzLnBhZ2VQcm92aWRlcnMiIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkUHJvdmlkZXJzKCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQlQQUdFX1BST1ZJREVSU19FWFRFTlNJT05fTkFNRVNQQUNFLAotCQkJCVBBR0VfUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJCi0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIGlkID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKFBBR0VfUFJPVklERVJfRVhURU5TSU9OX0FUVFJfSUQpOwotCQkJCQkJU3RyaW5nIG5hbWUgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoUEFHRV9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9OQU1FKTsKLQkJCQkJCVN0cmluZyBjb250cmlidXRvckNsYXNzID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKFBBR0VfUFJPVklERVJfRVhURU5TSU9OX0FUVFJfQ0xBU1MpOyAKLQkJCQkJCUVkaXRvclBhZ2VFbGVtZW50IHBhZ2VFbGVtZW50ID0gbmV3IEVkaXRvclBhZ2VFbGVtZW50KGJ1bmRsZSwKLQkJCQkJCQkJaWQsIG5hbWUsIGNvbnRyaWJ1dG9yQ2xhc3MpOwotCQkJCQkJcGFnZVByb3ZpZGVycy5hZGQocGFnZUVsZW1lbnQpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkJCQkiRmFpbGVkIHRvIGxvYWQgRWRpdG9yIFBhZ2UgUHJvdmlkZXIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTcyN2NkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL1ZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUZvbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyIGV4dGVuZHMKLQkJQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUZvbnRQcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEZvbnQgcmVndWxhckZvbnQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEZvbnQgYm9sZEZvbnQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEZvbnQgaXRhbGljRm9udDsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIEZvbnQgYm9sZEl0YWxpY0ZvbnQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEZvbnQgc3RyaWtlb3V0Rm9udDsJCi0KLQlzdGF0aWMgewotCQlGb250IGRlZmF1bHRGb250ID0gSkZhY2VSZXNvdXJjZXMuZ2V0RGVmYXVsdEZvbnQoKTsKLQkJcmVndWxhckZvbnQgPSBkZWZhdWx0Rm9udDsKLQkJRm9udERhdGFbXSBmZHMgPSBKRmFjZVJlc291cmNlcy5nZXREZWZhdWx0Rm9udCgpLmdldEZvbnREYXRhKCk7Ci0JCWlmIChmZHMubGVuZ3RoID4gMCkgewotCQkJRm9udERhdGEgZmQgPSBmZHNbMF07Ci0JCQlpbnQgaCA9IGZkLmdldEhlaWdodCgpOwotCQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQlib2xkRm9udCA9IG5ldyBGb250KGRpc3BsYXksIGZkLmdldE5hbWUoKSwgaCwgZmQuZ2V0U3R5bGUoKQotCQkJCQl8IFNXVC5CT0xEKTsKLQkJCWl0YWxpY0ZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBmZC5nZXROYW1lKCksIGgsIGZkLmdldFN0eWxlKCkKLQkJCQkJfCBTV1QuSVRBTElDKTsKLQkJCWJvbGRJdGFsaWNGb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZmQuZ2V0TmFtZSgpLCBoLCBmZC5nZXRTdHlsZSgpCi0JCQkJCXwgU1dULkJPTEQgfCBTV1QuSVRBTElDKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9udCBnZXRJdGFsaWNGb250KCkgewotCQlyZXR1cm4gaXRhbGljRm9udDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvbnQgZ2V0RGVmYXVsdEZvbnQoKSB7Ci0JCXJldHVybiByZWd1bGFyRm9udDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIEZvbnQgZ2V0Rm9udChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoaXNFeHRlcm5hbChlbGVtZW50KSkgewotCQkJcmV0dXJuIGl0YWxpY0ZvbnQ7Ci0JCX0KLQkJcmV0dXJuIGJvbGRGb250OwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRXh0ZXJuYWwoT2JqZWN0IGVsZW1lbnQpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNmYzZTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZXh0ZW5zaW9uIHBvaW50IG1hbmFnZW1lbnQgZm9yIHRoZSBBdXRob3JpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9yaWNodGV4dC9JTWV0aG9kUmljaFRleHQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcmljaHRleHQvSU1ldGhvZFJpY2hUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYTExZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9yaWNodGV4dC9JTWV0aG9kUmljaFRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotCi0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBSaWNoIFRleHQgY29udHJvbCB1c2VkIGluIHRoZSBNZXRob2QgZWRpdG9ycy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZFJpY2hUZXh0IGV4dGVuZHMgSVJpY2hUZXh0IHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRNb2RhbE9iamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGFsT2JqZWN0KEVPYmplY3QgbW9kYWxPYmplY3QpOwotCi0JLyoqCi0JICogUmV0dXJucyBtb2RhbCBvYmplY3QgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE1vZGFsT2JqZWN0RmVhdHVyZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kYWwgb2JqZWN0IGZlYXR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kYWxPYmplY3RGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBtb2RhbE9iamVjdEZlYXR1cmUpOwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgTWV0aG9kUmljaFRleHQgd2l0aCB0aGUgZWRpdGVkIE1ldGhvZEVsZW1udCBhbmQgbmFtZSBvZiB0aGUgZmllbGQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBmaWVsZE5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0RWxlbWVudEFuZExhYmVsKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTGFiZWwgbGFiZWwpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L0lNZXRob2RSaWNoVGV4dEVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9yaWNodGV4dC9JTWV0aG9kUmljaFRleHRFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyMDdlZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L0lNZXRob2RSaWNoVGV4dEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dFRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIFJpY2ggVGV4dCBlZGl0b3IgdXNlZCBpbiB0aGUgTWV0aG9kIGVkaXRvcnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRob2RSaWNoVGV4dEVkaXRvciBleHRlbmRzIElNZXRob2RSaWNoVGV4dCwgSVJpY2hUZXh0RWRpdG9yIHsKLQotCS8qKgotCSAqIEZpbGxzIHRoZSBSaWNoIFRleHQgZWRpdG9yIHRvb2wgYmFyIHdpdGggYWN0aW9uIGl0ZW1zLgotCSAqIAotCSAqIEBwYXJhbSB0b29sQmFyCi0JICogICAgICAgICAgICBUaGUgUmljaCB0ZXh0IGVkaXRvciB0b29sIGJhci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsVG9vbEJhcihJUmljaFRleHRUb29sQmFyIHRvb2xCYXIpOwotCQotCS8qKgotCSAqIFNlbGVjdHMgdGhlIFJpY2ggVGV4dCBvciBIVE1MIHRhYi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIDAgZm9yIHRoZSBSaWNoIFRleHQgdGFiLCAxIGZvciB0aGUgSFRNTCB0YWIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKGludCBpbmRleCk7CQotCQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBNZXRob2QgUmljaCBUZXh0IEVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICogQHBhcmFtIGVkaXRvclNpdGUKLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiBAcGFyYW0gbWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBsYWJlbAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBTdHJpbmcgYmFzZVBhdGgsCi0JCQlJRWRpdG9yU2l0ZSBlZGl0b3JTaXRlLCBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQsIExhYmVsIGxhYmVsKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9yaWNodGV4dC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4ZWZmOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHJpY2ggdGV4dCBlZGl0aW5nIHN1cHBvcnQgZm9yIHRoZSBlZGl0b3JzIGFuZCBQcm9wZXJ0aWVzIHZpZXcuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0F1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0F1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjRiY2ZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9BdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlTGlzdGVuZXI7Ci0KLS8qKgotICogQWNjZXNzaWJsZSBsaXN0ZW5lciB3aGlsZSBhdXRob3JpbmcgdGhlIGNvbnRlbnQKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyIGltcGxlbWVudHMgQWNjZXNzaWJsZUxpc3RlbmVyIHsKLQkKLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoU3RyaW5nIG5hbWUpewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbil7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlTGlzdGVuZXIjZ2V0RGVzY3JpcHRpb24ob3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGdldERlc2NyaXB0aW9uKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCWUucmVzdWx0ID0gdGhpcy5kZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVMaXN0ZW5lciNnZXRIZWxwKG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRIZWxwKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVMaXN0ZW5lciNnZXRLZXlib2FyZFNob3J0Y3V0KG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRLZXlib2FyZFNob3J0Y3V0KEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlTGlzdGVuZXIjZ2V0TmFtZShvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewkJCi0JCWUucmVzdWx0ID0gdGhpcy5uYW1lOwotCX0KLQkKLQkKLQkvKioKLQkgKiBTZXQgbmFtZSBmb3IgdGhlIGxpc3RlbmVyCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKXsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvQ29uZmlndXJhdGlvbk1hcmtlckhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0NvbmZpZ3VyYXRpb25NYXJrZXJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0NjZhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvQ29uZmlndXJhdGlvbk1hcmtlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlLklDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLQotLyoqCi0gKiAgSGVscGVyIGNsYXNzIHRvIGhhbmRsZSBDb25maWd1cmF0aW9uIGVycm9yIG1hcmtlcnMKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uTWFya2VySGVscGVyIHsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb25maWd1cmF0aW9uTWFya2VySGVscGVyIElOU1RBTkNFID0gbmV3IENvbmZpZ3VyYXRpb25NYXJrZXJIZWxwZXIoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0VSUk9SX0lEID0gImVycm9ySUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DT05GSUdfR1VJRCA9ICJjb25maWdHdWlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRVJST1JfRUxFTUVOVF9HVUlEID0gImVsZW1lbnRHdWlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ0FVU0VfRUxFTUVOVF9HVUlEID0gImNhdXNlR3VpZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIG1hcmtlciBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktFUl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQkKLS8vCXByaXZhdGUgTWFwPEVsZW1lbnREZXBlbmRlbmN5RXJyb3IsIElNYXJrZXI+IGVycm9yTWFya2VyTWFwID0gbmV3IEhhc2hNYXA8RWxlbWVudERlcGVuZGVuY3lFcnJvciwgSU1hcmtlcj4oKTsKLQkKLQkvLyBwcml2YXRlIGNvbnN0cnVjdG9yCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uTWFya2VySGVscGVyKCkgewotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb250YWluZXJNYXAgZXh0ZW5kcyBIYXNoTWFwPE9iamVjdCwgSW50ZWdlcj4gewotCQkvKioKLQkJICogCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgQ29udGFpbmVyTWFwKCkgewotCQkJc3VwZXIoKTsKLQkJCWluaXRNYXAoKTsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobmV3IExpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQkJaW5pdE1hcCgpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCQljbGVhcigpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJCWluaXRNYXAoKTsKLQkJCQl9CQkJCQotCQkJfSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBpbml0TWFwKCkgewotCQkJY2xlYXIoKTsKLQkJCQotCQkJLy8gZmlsbCB0aGlzIHNldCB3aXRoIGNvbnRhaW5lcnMgb2YgbWFya2VkIG9iamVjdHMKLQkJCS8vCi0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCWlmKGxpYiAhPSBudWxsKSB7Ci0JCQkJSVByb2plY3QgcHJqID0gTWV0aG9kTGlicmFyeVByb2plY3QuZmluZFByb2plY3QobGliKTsKLQkJCQlpZihwcmogIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJSU1hcmtlcltdIG1hcmtlcnMgPSBwcmouZmluZE1hcmtlcnMoSU5TVEFOQ0UuZ2V0TWFya2VySUQoKSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKEFUVFJfQ09ORklHX0dVSUQpOwotCQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCQkJCQlpZihlICE9IG51bGwpIHsKLQkJCQkJCQkJLy8gcmVtb3ZlIGl0cyBjb250YWluZXJzIGZyb20gY29udGFpbmVyc09mTWFya2VkT2JqZWN0cwotCQkJCQkJCQkvLwotCQkJCQkJCQltYXJrQ29udGFpbmVycyhlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgaW5jcmVtZW50KE9iamVjdCBvYmplY3QpIHsKLQkJCUludGVnZXIgY291bnQ7Ci0JCQlpZiAoY29udGFpbnNLZXkob2JqZWN0KSkgewotCQkJCWNvdW50ID0gZ2V0KG9iamVjdCk7Ci0JCQl9IGVsc2UgewotCQkJCWNvdW50ID0gbmV3IEludGVnZXIoMCk7Ci0JCQl9Ci0JCQljb3VudCsrOwotCQkJcHV0KG9iamVjdCwgY291bnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGRlY3JlbWVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlpZiAoY29udGFpbnNLZXkob2JqZWN0KSkgewotCQkJCUludGVnZXIgY291bnQgPSBnZXQob2JqZWN0KTsKLQkJCQlpZiAoY291bnQgPT0gMSkgewotCQkJCQkvLyByZW1vdmUgb2JqZWN0Ci0JCQkJCXJlbW92ZShvYmplY3QpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvdW50LS07Ci0JCQkJCXB1dChvYmplY3QsIGNvdW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBtYXJrQ29udGFpbmVycyhNZXRob2RFbGVtZW50IGUpIHsKLQkJCWZvcihFT2JqZWN0IGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOyBjb250YWluZXIgIT0gbnVsbDsgY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKSkgewotCQkJCWluY3JlbWVudChjb250YWluZXIpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHVubWFya0NvbnRhaW5lcnMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCQlmb3IoRU9iamVjdCBjb250YWluZXIgPSBlLmVDb250YWluZXIoKTsgY29udGFpbmVyICE9IG51bGw7IGNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCkpIHsKLQkJCQlkZWNyZW1lbnQoY29udGFpbmVyKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBDb250YWluZXJNYXAgY29udGFpbmVyc09mTWFya2VkT2JqZWN0cyA9IG5ldyBDb250YWluZXJNYXAoKTsJCi0JCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXJrZXJJRCgpIHsKLQkJcmV0dXJuIE1BUktFUl9JRDsKLQl9Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLk1hcmtlckhlbHBlciNnZXRGaWxlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JcHJvdGVjdGVkIElGaWxlIGdldEZpbGUoVVJJIHVyaSkgewotCQlpZih1cmkuaXNGaWxlKCkpIHsKLQkJCXJldHVybiAoSUZpbGUpIEZpbGVNYW5hZ2VyLmdldFJlc291cmNlRm9yTG9jYXRpb24odXJpLnRvRmlsZVN0cmluZygpKTsKLQkJfQotCSAgICBTdHJpbmcgc2NoZW1lID0gdXJpLnNjaGVtZSgpOwotCSAgICBpZiAoInBsYXRmb3JtIi5lcXVhbHMoc2NoZW1lKSAmJiB1cmkuc2VnbWVudENvdW50KCkgPiAxICYmICJyZXNvdXJjZSIuZXF1YWxzKHVyaS5zZWdtZW50KDApKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JICAgIHsKLQkgICAgICBTdHJpbmdCdWZmZXIgcGxhdGZvcm1SZXNvdXJjZVBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JICAgICAgZm9yIChpbnQgaiA9IDEsIHNpemUgPSB1cmkuc2VnbWVudENvdW50KCk7IGogPCBzaXplOyArK2opCi0JICAgICAgewotCSAgICAgICAgcGxhdGZvcm1SZXNvdXJjZVBhdGguYXBwZW5kKCcvJyk7Ci0JICAgICAgICBwbGF0Zm9ybVJlc291cmNlUGF0aC5hcHBlbmQoVVJJLmRlY29kZSh1cmkuc2VnbWVudChqKSkpOwotCSAgICAgIH0KLQkgICAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKHBsYXRmb3JtUmVzb3VyY2VQYXRoLnRvU3RyaW5nKCkpKTsKLQkgICAgfQotCSAgICByZXR1cm4gbnVsbDsKLQl9Ci0JCQotCS8qKgotCSAqIFVzZWQgYnkgZGVjb3JhdG9ycyB0byBkZXRlcm1pbmUgdG8gcHV0IGFuIGVycm9yIHRpY2sgb24gdGhlIE9iamVjdAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW52YWxpZChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlcikgewotCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9ICgoQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXIpb2JqZWN0KS5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCQlpZihjb250YWluZXJzT2ZNYXJrZWRPYmplY3RzLmNvbnRhaW5zS2V5KG9iaikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQkJCQkKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQlpZiAoSU5TVEFOQ0UuaGFzTWFya2VycygoTWV0aG9kQ29uZmlndXJhdGlvbilvYmopKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlpZiAoSU5TVEFOQ0UuaGFzTWFya2VycygoTWV0aG9kQ29uZmlndXJhdGlvbilvYmplY3QpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMuY29udGFpbnNLZXkob2JqZWN0KTsKLQl9Ci0JCSAgICAKLSAgICBwdWJsaWMgdm9pZCBkZWxldGVNYXJrZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIElDb25maWd1cmF0aW9uRXJyb3IgZXJyb3IpIHsKLSAgICAJdHJ5IHsKLQkgICAgCUlNYXJrZXIgbWFya2VyID0gZ2V0TWFya2VyKGNvbmZpZywgZXJyb3IpOwotCSAgICAJaWYgKG1hcmtlciAhPSBudWxsKSB7Ci0JICAgIAkJbWFya2VyLmRlbGV0ZSgpOwotCSAgICAJCWNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMudW5tYXJrQ29udGFpbmVycyhjb25maWcpOwotCSAgICAJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotICAgIH0KLQkKLSAgICBwdWJsaWMgSU1hcmtlciBjcmVhdGVNYXJrZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIElDb25maWd1cmF0aW9uRXJyb3IgZXJyb3IpIHsKLS8vICAgIAlpZiAoZXJyb3IuZ2V0RXJyb3JNZXRob2RFbGVtZW50KCkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0vLyAgICAJaWYgKGVycm9yLmdldENhdXNlTWV0aG9kRWxlbWVudCgpID09IG51bGwpIHJldHVybiBudWxsOwotICAgIAkKLSAgICAJSU1hcmtlciBleGlzdGluZ01hcmtlciA9IGdldE1hcmtlcihjb25maWcsIGVycm9yKTsKLSAgICAJaWYgKGV4aXN0aW5nTWFya2VyICE9IG51bGwpIHsKLSAgICAJCWFkanVzdE1hcmtlcihleGlzdGluZ01hcmtlciwgY29uZmlnLCBlcnJvcik7Ci0gICAgCQlyZXR1cm4gZXhpc3RpbmdNYXJrZXI7Ci0gICAgCX0KLSAgICAJdHJ5IHsKLQkgICAgCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldElSZXNvdXJjZShjb25maWcpOwotCSAgICAJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpIHsKLQkgICAgCQlJTWFya2VyIG1hcmtlciA9IHJlc291cmNlLmNyZWF0ZU1hcmtlcihnZXRNYXJrZXJJRCgpKTsKLQkgICAgCQltYXJrZXIuc2V0QXR0cmlidXRlKElERS5FRElUT1JfSURfQVRUUiwgIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db25maWd1cmF0aW9uRWRpdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkgICAgCQlhZGp1c3RNYXJrZXIobWFya2VyLCBjb25maWcsIGVycm9yKTsKLQkgICAgCQljb250YWluZXJzT2ZNYXJrZWRPYmplY3RzLm1hcmtDb250YWluZXJzKGNvbmZpZyk7Ci0JICAgIAkJcmV0dXJuIG1hcmtlcjsKLQkgICAgCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkanVzdE1hcmtlcihJTWFya2VyIG1hcmtlciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIElDb25maWd1cmF0aW9uRXJyb3IgZXJyb3IpIHsKLSAgICAJaWYgKGNvbmZpZyA9PSBudWxsIHx8IGVycm9yID09IG51bGwpIHJldHVybjsKLSAgICAgICAJdHJ5IHsKLSAgICAgICAJCWlmIChtYXJrZXIgPT0gbnVsbCkgewotICAgICAgIAkJCS8vIHRyeSB0byBmaW5kIG1hcmtlcgotICAgICAgIAkJCW1hcmtlciA9IGdldE1hcmtlcihjb25maWcsIGVycm9yKTsKLSAgICAgICAJCX0KLSAgICAgICAJCWlmIChtYXJrZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBlcnJvci5nZXRTZXZlcml0eSgpKTsKLQkgICAgCVN0cmluZyBtZXNzYWdlID0gZ2V0TWVzc2FnZShlcnJvcik7Ci0JCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgbWVzc2FnZSk7Ci0JCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIsIDApOwotCQkJbWFya2VyLnNldEF0dHJpYnV0ZShBVFRSX0NPTkZJR19HVUlELCBjb25maWcuZ2V0R3VpZCgpKTsKLQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoQVRUUl9FUlJPUl9JRCwgZXJyb3IuZ2V0SWQoKSk7Ci0JICAgIAlpZiAoZXJyb3IuZ2V0RXJyb3JNZXRob2RFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MT0NBVElPTiwgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGVycm9yLmdldEVycm9yTWV0aG9kRWxlbWVudCgpKSk7Ci0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShBVFRSX0VSUk9SX0VMRU1FTlRfR1VJRCwgZXJyb3IuZ2V0RXJyb3JNZXRob2RFbGVtZW50KCkuZ2V0R3VpZCgpKTsKLQkgICAgCX0KLQkgICAgCWlmIChlcnJvci5nZXRDYXVzZU1ldGhvZEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JICAgIAkJbWFya2VyLnNldEF0dHJpYnV0ZShBVFRSX0NBVVNFX0VMRU1FTlRfR1VJRCwgZXJyb3IuZ2V0Q2F1c2VNZXRob2RFbGVtZW50KCkuZ2V0R3VpZCgpKTsKLQkgICAgCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLSAgIH0KLSAgICAJCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTWFya2VyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBJQ29uZmlndXJhdGlvbkVycm9yIGVycm9yKSB7Ci0JCWlmIChnZXRNYXJrZXIoY29uZmlnLCBlcnJvcikgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLSAgIAkJcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGEgbWFrZXIgd2l0aCBpZCBlcXVhbHMgdG8gdGhlIHJldHVybiBvZiB7QGxpbmsgI2dldE1hcmtlcklEKCl9ICAgICAgICAgICAgICAKLSAgICAgKiBpcyBhdmFpbGFibGUgaW4gdGhlIElSZXNvdXJjZSBjb21wdXRlZCBmcm9tIHRoZSBzcGVjaWZpZWQgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgKiBAcGFyYW0gb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNNYXJrZXJzKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldElSZXNvdXJjZShjb25maWcpOwotICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5leGlzdHMoKSkgewotICAgICAgICAJdHJ5IHsKLQkJCQlJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKGdldE1hcmtlcklEKCksIHRydWUsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQlyZXR1cm4gbWFya2Vycy5sZW5ndGggPiAwOwotCSAgCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSU1hcmtlciBnZXRNYXJrZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIElDb25maWd1cmF0aW9uRXJyb3IgZXJyb3IpIHsKLSAgICAJaWYgKGNvbmZpZyA9PSBudWxsIHx8IGVycm9yID09IG51bGwpIHsKLSAgICAJCXJldHVybiBudWxsOwotICAgIAl9Ci0gICAgCXRyeSB7Ci0JICAgIAlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRJUmVzb3VyY2UoY29uZmlnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoZ2V0TWFya2VySUQoKSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJCQlTdHJpbmcgbWFya2VyRXJyb3JJZCA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoQVRUUl9FUlJPUl9JRCk7Ci0JCQkJCWlmIChlcnJvci5nZXRJZCgpLmVxdWFscyhtYXJrZXJFcnJvcklkKSkgewotCQkJCQkJcmV0dXJuIG1hcmtlcjsKLQkJCQkJfQotCQkJCX0KLQkgICAgICAgIH0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2UoSUNvbmZpZ3VyYXRpb25FcnJvciBlcnJvcikgewotICAgIAlyZXR1cm4gZXJyb3IuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSVJlc291cmNlIGdldElSZXNvdXJjZShNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgIAlSZXNvdXJjZSByZXNvdXJjZSA9IGNvbmZpZy5lUmVzb3VyY2UoKTsKLSAgICAgICAgVVJJIHVyaSA9IHJlc291cmNlLmdldFVSSSgpOwotICAgICAgICB1cmkgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpOwotICAgICAgICByZXR1cm4gZ2V0RmlsZSh1cmkpOwotCi0gICAgfQotCQotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldENvbmZpZyhJTWFya2VyIG1hcmtlcikgewotCQlpZiAobWFya2VyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgY29uZmlnR3VpZCA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoQVRUUl9DT05GSUdfR1VJRCk7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldE1ldGhvZEVsZW1lbnQoY29uZmlnR3VpZCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQlyZXR1cm4gKE1ldGhvZENvbmZpZ3VyYXRpb24pZTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEVycm9yTWV0aG9kRWxlbWVudChJTWFya2VyIG1hcmtlcikgewotCQlpZiAobWFya2VyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgZXJyb3JHdWlkID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShBVFRSX0VSUk9SX0VMRU1FTlRfR1VJRCk7Ci0JCQlpZiAoZXJyb3JHdWlkICE9IG51bGwpIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldE1ldGhvZEVsZW1lbnQoZXJyb3JHdWlkKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIChNZXRob2RFbGVtZW50KWU7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRDYXVzZU1ldGhvZEVsZW1lbnQoSU1hcmtlciBtYXJrZXIpIHsKLQkJaWYgKG1hcmtlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQl0cnkgewotCQkJU3RyaW5nIGNhdXNlR3VpZCA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoQVRUUl9DQVVTRV9FTEVNRU5UX0dVSUQpOwotCQkJaWYgKGNhdXNlR3VpZCAhPSBudWxsKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKS5nZXRNZXRob2RFbGVtZW50KGNhdXNlR3VpZCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoTWV0aG9kRWxlbWVudCllOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvQ29uZmlndXJhdGlvbk1hcmtlclJlc29sdXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9Db25maWd1cmF0aW9uTWFya2VyUmVzb2x1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmMyNjUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9Db25maWd1cmF0aW9uTWFya2VyUmVzb2x1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db25maWd1cmF0aW9uRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uOwotCi0vKioKLSAqICBNYXJrZXJSZXNvbHV0aW9uIGZvciBDb25maWd1cmF0aW9uIGVycm9ycwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICoKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25NYXJrZXJSZXNvbHV0aW9uIGltcGxlbWVudHMgSU1hcmtlclJlc29sdXRpb24gewotCQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkKLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBlcnJvckVsZW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBjYXVzZUVsZW1lbnQ7Ci0KLQlwdWJsaWMgQ29uZmlndXJhdGlvbk1hcmtlclJlc29sdXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIE1ldGhvZEVsZW1lbnQgZXJyb3JFbGVtZW50LCBNZXRob2RFbGVtZW50IGNhdXNlRWxlbWVudCkgewotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJdGhpcy5lcnJvckVsZW1lbnQgPSBlcnJvckVsZW1lbnQ7Ci0JCXRoaXMuY2F1c2VFbGVtZW50ID0gY2F1c2VFbGVtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9yZXNvbHZlTWlzc2luZ1JlZmVyZW5jZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSU1hcmtlciBtYXJrZXIpIHsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInF1aWNrIGZpeCBtZSIpOwotCQl0cnkgewotCQkJICAgLy8gZ2V0IHRoZSBtYXJrZXIgcmVzb3VyY2UgZmlsZQotCSAgICAgICAgaWYgKChtYXJrZXIuZ2V0UmVzb3VyY2UoKSBpbnN0YW5jZW9mIElGaWxlKSkgewotCSAgICAgIAotCSAgICAgICAgCUlGaWxlIGZpbGUgPSAoSUZpbGUpIG1hcmtlci5nZXRSZXNvdXJjZSgpOwotCSAgICAgICAgCQotCSAgICAgICAgCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JICAgICAgICAJTWV0aG9kRWxlbWVudCBjb25maWcgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChmaWxlLCByZXNvdXJjZVNldCk7Ci0JICAgICAgICAJSUVkaXRvclBhcnQgZWRpdG9yID0gRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLmZpbmRFZGl0b3IoY29uZmlnKTsKLQkgICAgICAgIAlpZiAoIGVkaXRvciBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25FZGl0b3IgKSB7Ci0JICAgICAgICAJCSgoQ29uZmlndXJhdGlvbkVkaXRvcillZGl0b3IpLmRvUXVpY2tGaXgobWFya2VyKTsKLQkgICAgICAgIAl9Ci0JICAgICAgICAJCi0JICAgICAgICB9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCApIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCX0KLSAgICAgICAgCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvQ29uZmlndXJhdGlvbk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9Db25maWd1cmF0aW9uTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDk2ZDY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9Db25maWd1cmF0aW9uTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3I7Ci0KLS8qKgotICogR2VuZXJhdGVzIENvbmZpZ3VyYXRpb25NYXJrZXJSZXNvbHV0aW9uJ3MKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIGltcGxlbWVudHMgSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElNYXJrZXJSZXNvbHV0aW9uW10gRU1QVFlfUkVTT0xVVElPTlMgPSBuZXcgSU1hcmtlclJlc29sdXRpb25bMF07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25maWd1cmF0aW9uTWFya2VySGVscGVyIG1hcmtlckhlbHBlciA9IENvbmZpZ3VyYXRpb25NYXJrZXJIZWxwZXIuSU5TVEFOQ0U7Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciNnZXRSZXNvbHV0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyKQotCSAqLwotCXB1YmxpYyBJTWFya2VyUmVzb2x1dGlvbltdIGdldFJlc29sdXRpb25zKElNYXJrZXIgbWFya2VyKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbWFya2VySGVscGVyLmdldENvbmZpZyhtYXJrZXIpOwotCQlNZXRob2RFbGVtZW50IGVycm9yRWxlbWVudCA9IG1hcmtlckhlbHBlci5nZXRFcnJvck1ldGhvZEVsZW1lbnQobWFya2VyKTsKLQkJTWV0aG9kRWxlbWVudCBjYXVzZUVsZW1lbnQgPSBtYXJrZXJIZWxwZXIuZ2V0Q2F1c2VNZXRob2RFbGVtZW50KG1hcmtlcik7Ci0JCXRyeSB7Ci0JCQkKLQkJCS8vIGNyZWF0ZSBNYXJrZXJSZXNvbHV0aW9ucwotCQkJcmV0dXJuIG5ldyBJTWFya2VyUmVzb2x1dGlvbltdIHtuZXcgQ29uZmlndXJhdGlvbk1hcmtlclJlc29sdXRpb24oY29uZmlnLCBlcnJvckVsZW1lbnQsIGNhdXNlRWxlbWVudCl9OwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBFTVBUWV9SRVNPTFVUSU9OUzsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvRWRpdG9yc0NvbnRleHRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9FZGl0b3JzQ29udGV4dEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWMwZmI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9FZGl0b3JzQ29udGV4dEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBFZGl0b3JzIGNvbnRleHQgaGVscGVyCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEVkaXRvcnNDb250ZXh0SGVscGVyIHsKLQotCS8qKgotCSAqIFNldCBjb250ZXh0IGhlbHAgZm9yIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIHVpQ29tcG9zaXRlCi0JICogQHBhcmFtIG9iagotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRIZWxwKENvbnRyb2wgdWlDb21wb3NpdGUsIE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCW9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChvYmopOwotCi0JCWlmICgob2JqIGluc3RhbmNlb2YgUm9sZSkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9ST0xFX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBUYXNrKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX1RBU0tfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSkgewotCQkJUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkuc2V0SGVscCgKLQkJCQkJCQl1aUNvbXBvc2l0ZSwKLQkJCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfV09SS19QUk9EVUNUX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9HVUlEQU5DRV9DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9ESVNDSVBMSU5FX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpKSB7Ci0JCQlQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJCS5zZXRIZWxwKAotCQkJCQkJCXVpQ29tcG9zaXRlLAotCQkJCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9ESVNDSVBMSU5FX0dST1VQSU5HX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBEb21haW4pKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfRE9NQUlOX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpKSB7Ci0JCQlQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJCS5zZXRIZWxwKAotCQkJCQkJCXVpQ29tcG9zaXRlLAotCQkJCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9XT1JLX1BST0RVQ1RfVFlQRV9DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgUm9sZVNldCkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9ST0xFX1NFVF9DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKSkgewotCQkJUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkuc2V0SGVscCgKLQkJCQkJCQl1aUNvbXBvc2l0ZSwKLQkJCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfUk9MU0VfU0VUX0dST1VQSU5HX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBUb29sKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX1RPT0xfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoCi0JCQkJCQkJdWlDb21wb3NpdGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX0NVU1RPTV9DQVRFR09SWV9DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuUExVR0lOX0VESVRPUl9ERVNDUklQVElPTl9BTExfQ09OVEVYVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogU2V0IGNvbnRleHQgaGVscCBmb3IgcHJvY2VzcyB0eXBlCi0JICogCi0JICogQHBhcmFtIHVpQ29tcG9zaXRlCi0JICogQHBhcmFtIHByb2NUeXBlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEhlbHAoQ29udHJvbCB1aUNvbXBvc2l0ZSwgU3RyaW5nIHByb2NUeXBlKSB7Ci0JCWlmICgocHJvY1R5cGUgIT0gbnVsbCAmJiBwcm9jVHlwZQotCQkJCS5lcXVhbHNJZ25vcmVDYXNlKCJjYXBhYmlsaXR5IHBhdHRlcm4iKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkuc2V0SGVscCgKLQkJCQkJCQl1aUNvbXBvc2l0ZSwKLQkJCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfQ1BfREVTQ1JJUFRJT05fQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICgocHJvY1R5cGUgIT0gbnVsbCAmJiBwcm9jVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJkZWxpdmVyeSBwcm9jZXNzIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoCi0JCQkJCQkJdWlDb21wb3NpdGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX0RQX0RFU0NSSVBUSU9OX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9EUF9ERVNDUklQVElPTl9DT05URVhUX0hFTFBfSUQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0xpYnJhcnlWYWxpZGF0aW9uTWFya2VySGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc4YzE5OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlZhbGlkYXRlQWN0aW9uLkVjbGlwc2VSZXNvdXJjZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5UcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Db250ZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLk1ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLlByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMQotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIgZXh0ZW5kcyBFY2xpcHNlUmVzb3VyY2VzVXRpbCB7CQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIgSU5TVEFOQ0UgPSBuZXcgTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlEID0gImd1aWQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgaW50ZXJmYWNlIElQYXJlbnRQcm92aWRlciB7Ci0JCWZpbmFsIElQYXJlbnRQcm92aWRlciBjb250YWluZXJQcm92aWRlciA9IG5ldyBJUGFyZW50UHJvdmlkZXIoKSB7Ci0KLQkJCXB1YmxpYyBDb2xsZWN0aW9uPD8+IGdldFBhcmVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKCgoRU9iamVjdClvYmplY3QpLmVDb250YWluZXIoKSk7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJCX0KLQkJCQotCQl9OwotCQkKLQkJZmluYWwgSVBhcmVudFByb3ZpZGVyIHBhcmVudEN1c3RvbUNhdGVnb3J5UHJvdmlkZXIgPSBuZXcgSVBhcmVudFByb3ZpZGVyKCkgewotCi0JCQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXRQYXJlbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcygoQ3VzdG9tQ2F0ZWdvcnkpb2JqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQkJfQotCQkJCi0JCX07Ci0JCQotCQlmaW5hbCBJUGFyZW50UHJvdmlkZXIgcGFyZW50U3RhbmRhcmRDYXRlZ29yeVByb3ZpZGVyID0gbmV3IElQYXJlbnRQcm92aWRlcigpIHsKLQotCQkJcHVibGljIENvbGxlY3Rpb248Pz4gZ2V0UGFyZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgb2JqZWN0OwotCQkJCQlMaXN0IHBhcmVudERpc2NpcGxpbmVzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZShkaXNjaXBsaW5lKTsKLQkJCQkJTGlzdCBkaXNjaXBsaW5lR3JvdXBpbmdzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZUdyb3VwcyhkaXNjaXBsaW5lKTsKLQkJCQkJaWYoIXBhcmVudERpc2NpcGxpbmVzLmlzRW1wdHkoKSAmJiAhZGlzY2lwbGluZUdyb3VwaW5ncy5pc0VtcHR5KCkpIHsKLQkJCQkJCUNvbGxlY3Rpb248T2JqZWN0PiBwYXJlbnRzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KGRpc2NpcGxpbmVHcm91cGluZ3MpOwotCQkJCQkJcGFyZW50cy5hZGRBbGwocGFyZW50RGlzY2lwbGluZXMpOwotCQkJCQkJcmV0dXJuIHBhcmVudHM7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXR1cm4gcGFyZW50RGlzY2lwbGluZXMuaXNFbXB0eSgpID8gZGlzY2lwbGluZUdyb3VwaW5ncyA6IHBhcmVudERpc2NpcGxpbmVzOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Um9sZVNldEdyb3VwcygoUm9sZVNldCkgb2JqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQkJfQotCQkJCi0JCX07Ci0JCQotCQlDb2xsZWN0aW9uPD8+IGdldFBhcmVudHMoT2JqZWN0IG9iamVjdCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEVycm9yQ2FsY3VsYXRvciBleHRlbmRzIEhhc2hNYXA8TWV0aG9kUGx1Z2luLCBTZXQ8TWV0aG9kRWxlbWVudD4+IHsJCQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgRXJyb3JDYWxjdWxhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJCWluaXRpYWxpemUoKTsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobmV3IExpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQkJaW5pdGlhbGl6ZSgpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCQljbGVhcigpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJCWluaXRpYWxpemUoKTsKLQkJCQl9CQkJCQotCQkJfSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQkJY2xlYXIoKTsKLQkJCQotCQkJLy8gZmlsbCB0aGlzIHNldCB3aXRoIGNvbnRhaW5lcnMgb2YgbWFya2VkIG9iamVjdHMKLQkJCS8vCi0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCWlmKGxpYiAhPSBudWxsKSB7Ci0JCQkJSVdvcmtzcGFjZVJvb3Qgd3NSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCQl0cnkgewotCQkJCQlJTWFya2VyW10gbWFya2VycyA9IHdzUm9vdC5maW5kTWFya2VycyhJTlNUQU5DRS5nZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoR1VJRCk7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGUgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQkJCQlpZihlICE9IG51bGwpIHsKLQkJCQkJCQlpZihlLmVJc1Byb3h5KCkpIHsKLQkJCQkJCQkJZSA9IChNZXRob2RFbGVtZW50KSBQZXJzaXN0ZW5jZVV0aWwucmVzb2x2ZShlLAotCQkJCQkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQkJCQkJCQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIGFkZCB0aGUgZWxlbWVudCB0byB0aGlzIHNldAotCQkJCQkJCS8vCi0JCQkJCQkJYWRkRXJyb3IoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFkZEVycm9yKE1ldGhvZEVsZW1lbnQgZSkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGUpOwotCQkJaWYocGx1Z2luICE9IG51bGwpIHsKLQkJCQlTZXQ8TWV0aG9kRWxlbWVudD4gZWxlbWVudHMgPSBnZXQocGx1Z2luKTsKLQkJCQlpZihlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzID0gbmV3IEhhc2hTZXQ8TWV0aG9kRWxlbWVudD4oKTsKLQkJCQkJcHV0KHBsdWdpbiwgZWxlbWVudHMpOwotCQkJCX0KLQkJCQllbGVtZW50cy5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUVycm9yKE1ldGhvZEVsZW1lbnQgZSkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGUpOwotCQkJaWYocGx1Z2luICE9IG51bGwpIHsKLQkJCQlTZXQ8TWV0aG9kRWxlbWVudD4gZWxlbWVudHMgPSBnZXQocGx1Z2luKTsKLQkJCQlpZihlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLnJlbW92ZShlKTsKLQkJCQkJaWYoZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkJCQlyZW1vdmUocGx1Z2luKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaGFzRXJyb3JzKE1ldGhvZEVsZW1lbnQgZSkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGUpOwotCQkJaWYocGx1Z2luICE9IG51bGwpIHsKLQkJCQlTZXQ8TWV0aG9kRWxlbWVudD4gZWxlbWVudHMgPSBnZXQocGx1Z2luKTsKLQkJCQlpZihlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQkJCWlmKGVsZW1lbnRzLmNvbnRhaW5zKGUpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCi0JCQkJCS8vIGNoZWNrIGlmIGUgaXMgY29udGFpbmVyIG9mIGFueSBlcnJvciBlbGVtZW50Ci0JCQkJCS8vCi0JCQkJCUhhc2hTZXQ8T2JqZWN0PiBwcm9jZXNzZWRDaGlsZHJlbiA9IG51bGw7Ci0JCQkJCWZvciAoTWV0aG9kRWxlbWVudCBtZSA6IGVsZW1lbnRzKSB7Ci0JCQkJCQlpZihVbWFVdGlsLmlzQ29udGFpbmVkQnkobWUsIGUpKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCQlpZihtZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJCQkJaWYocHJvY2Vzc2VkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCQkJCQlwcm9jZXNzZWRDaGlsZHJlbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCXByb2Nlc3NlZENoaWxkcmVuLmNsZWFyKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmKGlzUGFyZW50T2YobWUsIGUsIElQYXJlbnRQcm92aWRlci5wYXJlbnRDdXN0b21DYXRlZ29yeVByb3ZpZGVyLCBwcm9jZXNzZWRDaGlsZHJlbikpIHsKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSBpZihtZSBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCQkJCQkJCS8vIG1lIG11c3QgYmUgYSBzdGFuZGFyZCBjYXRlZ29yeQotCQkJCQkJCS8vIGN1cnJlbnRseSBhbGwgY29udGVudCBwYWNrYWdlcyB0aGF0IGNvbnRhaW4KLQkJCQkJCQkvLyBzdGFuZGFyZCBjYXRlZ29yaWVzIGFyZSBub3QgY29udGFpbmVkIGJ5Ci0JCQkJCQkJLy8gcHJlZGVmaW5lZCBjb250ZW50IHBhY2thZ2UgIlN0YW5kYXJkIENhdGVnb3JpZXMiCi0JCQkJCQkJLy8gd2UgbmVlZCB0byBoYW5kbGUgdGhpcyBzcGVjaWFsbHkgaGVyZQotCQkJCQkJCS8vCi0JCQkJCQkJaWYoZSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlICYmIGUgPT0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnN0YW5kYXJkQ2F0ZWdvcnlQYXRoKSkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYocHJvY2Vzc2VkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCQkJCQlwcm9jZXNzZWRDaGlsZHJlbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCXByb2Nlc3NlZENoaWxkcmVuLmNsZWFyKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmKGlzUGFyZW50T2YobWUsIGUsIElQYXJlbnRQcm92aWRlci5wYXJlbnRTdGFuZGFyZENhdGVnb3J5UHJvdmlkZXIsIHByb2Nlc3NlZENoaWxkcmVuKSkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNQYXJlbnRPZihPYmplY3QgY2hpbGQsIE9iamVjdCBwYXJlbnQsIElQYXJlbnRQcm92aWRlciBwYXJlbnRQcm92aWRlciwgU2V0PE9iamVjdD4gcHJvY2Vzc2VkQ2hpbGRyZW4pIHsKLQkJCXByb2Nlc3NlZENoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlmb3IgKE9iamVjdCBteVBhcmVudCA6IHBhcmVudFByb3ZpZGVyLmdldFBhcmVudHMoY2hpbGQpKSB7CQkJCQotCQkJCWlmKG15UGFyZW50ID09IHBhcmVudCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYoIXByb2Nlc3NlZENoaWxkcmVuLmNvbnRhaW5zKG15UGFyZW50KSAmJiBpc1BhcmVudE9mKG15UGFyZW50LCBwYXJlbnQsIHBhcmVudFByb3ZpZGVyLCBwcm9jZXNzZWRDaGlsZHJlbikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQkJCQkKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBFcnJvckNhbGN1bGF0b3IgZXJyb3JDYWxjdWxhdG9yID0gbmV3IEVycm9yQ2FsY3VsYXRvcigpOwkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLk1hcmtlckhlbHBlciNnZXRGaWxlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JcHJvdGVjdGVkIElGaWxlIGdldEZpbGUoVVJJIHVyaSkgewotCQlpZih1cmkuaXNGaWxlKCkpIHsKLQkJCXJldHVybiAoSUZpbGUpIEZpbGVNYW5hZ2VyLmdldFJlc291cmNlRm9yTG9jYXRpb24odXJpLnRvRmlsZVN0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RmlsZSh1cmkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSU1hcmtlckhlbHBlciNhZGp1c3RNYXJrZXIob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlciwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWMpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRqdXN0TWFya2VyKElNYXJrZXIgbWFya2VyLCBEaWFnbm9zdGljIGRpYWdub3N0aWMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiByZXQgPSBzdXBlci5hZGp1c3RNYXJrZXIobWFya2VyLCBkaWFnbm9zdGljKTsKLQkJaWYoIWRpYWdub3N0aWMuZ2V0RGF0YSgpLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0IG8gPSBkaWFnbm9zdGljLmdldERhdGEoKS5nZXQoMCk7Ci0JCQlpZihvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoR1VJRCwgKChNZXRob2RFbGVtZW50KW8pLmdldEd1aWQoKSk7Ci0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkxPQ0FUSU9OLCBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgobykpOwotCSAgICAJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSURFLkVESVRPUl9JRF9BVFRSLCAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IiKTsgLy8kTk9OLU5MUy0xJAotCSAgICAJCWVycm9yQ2FsY3VsYXRvci5hZGRFcnJvcigoTWV0aG9kRWxlbWVudCkgbyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW52YWxpZChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJLy8gdGhpcyBpcyBhbiBVSSBvYmplY3Q6IFByb2Nlc3NlcwotCQkJLy8KLQkJCVByb2Nlc3Nlc0l0ZW1Qcm92aWRlciBpcCA9IChQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iamVjdDsKLQkJCU1ldGhvZEVsZW1lbnQgbzsJCQkKLQkJCXJldHVybiAoKG8gPSBpcC5nZXRDYXBhYmlsaXR5UGF0dGVyblBhY2thZ2UoKSkgIT0gbnVsbCAmJiBlcnJvckNhbGN1bGF0b3IuaGFzRXJyb3JzKG8pKQotCQkJCXx8ICgobyA9IGlwLmdldERlbGl2ZXJ5UHJvY2Vzc1BhY2thZ2UoKSkgIT0gbnVsbCAmJiBlcnJvckNhbGN1bGF0b3IuaGFzRXJyb3JzKG8pKTsKLQkJfQotCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkvLyB0aGlzIGlzIGFuIFVJIG9iamVjdAotCQkJLy8KLQkJCW9iamVjdCA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcilvYmplY3QpLmdldFRhcmdldCgpOwkJCQotCQl9Ci0JCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudEl0ZW1Qcm92aWRlcikgewotCQkJQ29udGVudFBhY2thZ2UgY29yZUNvbnRlbnRQa2cgPSAoKENvbnRlbnRJdGVtUHJvdmlkZXIpb2JqZWN0KS5nZXRDb3JlQ29udGVudFBhY2thZ2UoKTsKLQkJCWlmKGNvcmVDb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQlvYmplY3QgPSBjb3JlQ29udGVudFBrZy5lQ29udGFpbmVyKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikgewotCQkJLy8gdGhpcyBpcyBhbiBVSSBvYmplY3Q6IGVpdGhlciBUYXNrcywgUm9sZXMsIFdvcmsgUHJvZHVjdHMsIG9yIEd1aWRhbmNlCi0JCQkvLwotCQkJQ29sbGVjdGlvbjw/PiBjaGlsZHJlbiA9ICgoVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpb2JqZWN0KS5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBlcnJvckNhbGN1bGF0b3IuaGFzRXJyb3JzKChNZXRob2RFbGVtZW50KSBjaGlsZCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQkJCQkKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQlvYmplY3QgPSAoKFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyKW9iamVjdCkuZ2V0VGFyZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuICgob2JqZWN0ID0gVG5nVXRpbC51bndyYXAob2JqZWN0KSkgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIGVycm9yQ2FsY3VsYXRvcgotCQkJCS5oYXNFcnJvcnMoKE1ldGhvZEVsZW1lbnQpIG9iamVjdCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLk1hcmtlckhlbHBlciNoYXNNYXJrZXJzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTWFya2VycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsJCQkKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldEZpbGUob2JqZWN0KTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJU3RyaW5nIGd1aWQgPSAoKE1ldGhvZEVsZW1lbnQpb2JqZWN0KS5nZXRHdWlkKCk7Ci0JCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoZ2V0TWFya2VySUQoKSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCQlpZihndWlkLmVxdWFscyhtYXJrZXIuZ2V0QXR0cmlidXRlKEdVSUQpKSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5oYXNNYXJrZXJzKG9iamVjdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRmlsZSBnZXRGaWxlKE9iamVjdCBkYXR1bSkgewotCQl0cnkgewotCQkJcmV0dXJuIHN1cGVyLmdldEZpbGUoZGF0dW0pOwotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkZWxldGVNYXJrZXJzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0RmlsZShvYmplY3QpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgb2JqZWN0OwotCQkJCQlTdHJpbmcgZ3VpZCA9IGUuZ2V0R3VpZCgpOwotCQkJCQlJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKGdldE1hcmtlcklEKCksIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwkJCQkJCQotCQkJCQkJaWYoZ3VpZC5lcXVhbHMobWFya2VyLmdldEF0dHJpYnV0ZShHVUlEKSkpIHsKLQkJCQkJCQltYXJrZXIuZGVsZXRlKCk7Ci0JCQkJCQkJZXJyb3JDYWxjdWxhdG9yLnJlbW92ZUVycm9yKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3VwZXIuZGVsZXRlTWFya2VycyhvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZU1hcmtlcnMoSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIGluY2x1ZGVTdWJ0eXBlcywgaW50IGRlcHRoKSB7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQl0cnkgewkJCQkKLQkJCQlJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKGdldE1hcmtlcklEKCksIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKEdVSUQpOwotCQkJCQlNZXRob2RFbGVtZW50IGUgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQkJCWlmKGUgIT0gbnVsbCkgewotCQkJCQkJZXJyb3JDYWxjdWxhdG9yLnJlbW92ZUVycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkKLQkJCX0JCQkKLQkJfQotCQkJCi0JCXN1cGVyLmRlbGV0ZU1hcmtlcnMocmVzb3VyY2UsIGluY2x1ZGVTdWJ0eXBlcywgZGVwdGgpOwotCX0KLQotCS8vT3ZlcnJpZGUgdG8gc2VwZXJhdGUgZXJyb3IgbWVzc2FnZSBpbiBlcnJvciBkaWFsb2cgYW5kIHByb2JsZW1zIHZpZXcgKGJ1ZyAxNzQzNTEpCi0JLy9Ob3RlOiBiZXR0ZXIgZml4IGlzIHRvIGV4dGVuZCBCYXNpY0RpYWdub3N0aWMgdG8gZW5jYXBzdWxhdGUgYm90aCB0eXBlcyBvZiBtc2dzIC0+IHRvIGRvIGxhdGVyCi0JcHJvdGVjdGVkIFN0cmluZyBjb21wb3NlTWVzc2FnZShEaWFnbm9zdGljIGRpYWdub3N0aWMsIERpYWdub3N0aWMgcGFyZW50RGlhZ25vc3RpYykgewotCQlpbnQgaXggPSBkaWFnbm9zdGljLmdldE1lc3NhZ2UoKS5pbmRleE9mKExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnMik7Ci0JCWlmIChpeCA+IDApIHsKLQkJCXJldHVybiBkaWFnbm9zdGljLmdldE1lc3NhZ2UoKS5zdWJzdHJpbmcoMCwgaXgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jb21wb3NlTWVzc2FnZShkaWFnbm9zdGljLCBwYXJlbnREaWFnbm9zdGljKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL01hcmtlclJlc29sdXRpb25HZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQxMjU5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuV29ya2JlbmNoTWFya2VyUmVzb2x1dGlvbjsKLQotLyoqCi0gKiBDcmVhdGUgcmVzb2x1dGlvbnMgZm9yIHRoZSBnaXZlbiBtYXJrZXIKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIGltcGxlbWVudHMgSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIElNYXJrZXJSZXNvbHV0aW9uW10gRU1QVFlfUkVTT0xVVElPTlMgPSBuZXcgSU1hcmtlclJlc29sdXRpb25bMF07Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2hvd093bmVySW5MaWJyYXJ5VmlldyBpbXBsZW1lbnRzIElNYXJrZXJSZXNvbHV0aW9uIHsKLQotCQlwcml2YXRlIE9iamVjdCBvd25lcjsKLQotCQkvKioKLQkJICogQHBhcmFtIG93bmVyCi0JCSAqLwotCQlwcml2YXRlIFNob3dPd25lckluTGlicmFyeVZpZXcoT2JqZWN0IG93bmVyKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb24jZ2V0TGFiZWwoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3Nob3dPd25lckluTGlicmFyeVZpZXc7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbiNydW4ob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bihJTWFya2VyIG1hcmtlcikgewotCQkJTGlicmFyeVZpZXcuZ2V0VmlldygpLnNldFNlbGVjdGlvblRvVmlld2VyKG93bmVyKTsKLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWFya2VyUmVzb2x1dGlvbiBleHRlbmRzIFdvcmtiZW5jaE1hcmtlclJlc29sdXRpb24gewotCQlwcml2YXRlIElNYXJrZXIgY3VycmVudE1hcmtlcjsKLQkJcHJpdmF0ZSBSZWZlcmVuY2VJbmZvIHJlZmVyZW5jZUluZm87Ci0KLQkJcHVibGljIE1hcmtlclJlc29sdXRpb24oSU1hcmtlciBjdXJyZW50TWFya2VyLCBSZWZlcmVuY2VJbmZvIHJlZmVyZW5jZUluZm8pIHsKLQkJCXRoaXMuY3VycmVudE1hcmtlciA9IGN1cnJlbnRNYXJrZXI7Ci0JCQl0aGlzLnJlZmVyZW5jZUluZm8gPSByZWZlcmVuY2VJbmZvOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbiNnZXRMYWJlbCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3JfcmVtb3ZlVW5yZXNvbHZlZFJlZmVyZW5jZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKElNYXJrZXIgbWFya2VyKSB7Ci0JCQlSZWZlcmVuY2VJbmZvIHJlZkluZm8gPSBjdXJyZW50TWFya2VyLmVxdWFscyhtYXJrZXIpID8gcmVmZXJlbmNlSW5mbyA6IGdldFJlZmVyZW5jZUluZm8obWFya2VyKTsKLQkJCWlmKHJlZkluZm8gPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmKHJlZkluZm8ucmVmZXJlbmNlLmlzTWFueSgpKSB7Ci0JCQkJKChMaXN0PD8+KXJlZkluZm8ub3duZXIuZUdldChyZWZJbmZvLnJlZmVyZW5jZSkpLnJlbW92ZShyZWZJbmZvLmluZGV4KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlZkluZm8ub3duZXIuZVNldChyZWZJbmZvLnJlZmVyZW5jZSwgbnVsbCk7Ci0JCQl9Ci0JCQlib29sZWFuIHZhbGlkYXRlID0gZmFsc2U7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlZkluZm8ub3duZXIuZVJlc291cmNlKCk7Ci0JCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCS5nZXRQZXJzaXN0ZXJGb3IocmVzb3VyY2UpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQl0cnkgewotCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJdmFsaWRhdGUgPSB0cnVlOwotCQkJfQotCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQl9Ci0JCQlpZih2YWxpZGF0ZSkgeyAJCQkJCi0JCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCWlmKHJlc291cmNlU2V0IGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSB7Ci0JCQkJCSgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5nZXRNYXJrZXJNYW5hbmdlcigpLmRvVmFsaWRhdGVNYXJrZXJzKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIElNYXJrZXJbXSBmaW5kT3RoZXJNYXJrZXJzKElNYXJrZXJbXSBtYXJrZXJzKSB7Ci0JCQlBcnJheUxpc3Q8SU1hcmtlcj4gc2ltaWxhck1hcmtlckxpc3QgPSBuZXcgQXJyYXlMaXN0PElNYXJrZXI+KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJaWYoIWN1cnJlbnRNYXJrZXIuZXF1YWxzKG1hcmtlcikpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmKFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIuTUFSS0VSX0lELmVxdWFscyhtYXJrZXIuZ2V0VHlwZSgpKSkgewotCQkJCQkJCXNpbWlsYXJNYXJrZXJMaXN0LmFkZChtYXJrZXIpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlJTWFya2VyW10gc2ltaWxhck1hcmtlcnMgPSBuZXcgSU1hcmtlcltzaW1pbGFyTWFya2VyTGlzdC5zaXplKCldOwotCQkJc2ltaWxhck1hcmtlckxpc3QudG9BcnJheShzaW1pbGFyTWFya2Vycyk7Ci0JCQlyZXR1cm4gc2ltaWxhck1hcmtlcnM7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkJLy8gVE9ETyBwcm92aWRlIGRldGFpbGVkIGRlc2NyaXB0aW9uCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJCS8vIFRPRE8gcHJvdmlkZSBpbWFnZQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlZmVyZW5jZUluZm8gewotCQlwcml2YXRlIEVPYmplY3Qgb3duZXI7Ci0JCXByaXZhdGUgRVJlZmVyZW5jZSByZWZlcmVuY2U7Ci0JCXByaXZhdGUgaW50IGluZGV4OwotCQkKLQkJcHVibGljIFJlZmVyZW5jZUluZm8oRU9iamVjdCBvd25lciwgRVJlZmVyZW5jZSByZWZlcmVuY2UsIGludCBpbmRleCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMub3duZXIgPSBvd25lcjsKLQkJCXRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlOwotCQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQl9Ci0JCQkJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIFJlZmVyZW5jZUluZm8gZ2V0UmVmZXJlbmNlSW5mbyhJTWFya2VyIG1hcmtlcikgewotCQl0cnkgewotCQkJU3RyaW5nIHByb3h5VVJJID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyLlBST1hZX1VSSSk7Ci0JCQlTdHJpbmcgb3duZXJHVUlEID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyLk9XTkVSX0dVSUQpOwotCQkJaWYocHJveHlVUkkgIT0gbnVsbCAmJiBvd25lckdVSUQgIT0gbnVsbCkgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlKG1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCUVPYmplY3Qgb3duZXIgPSByZXNvdXJjZS5nZXRFT2JqZWN0KG93bmVyR1VJRCk7Ci0JCQkJCWlmKG93bmVyICE9IG51bGwpIHsKLQkJCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHByb3h5VVJJKTsKLQkJCQkJCS8vIGZpbmQgdGhlIHByb3h5Ci0JCQkJCQkvLwotCQkJCQkJaW50IGluZGV4ID0gLTE7Ci0JCQkJCQlFUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG51bGw7Ci0JCQkJCQlmaW5kX3Byb3h5X2xvb3A6Ci0JCQkJCQlmb3IgKEVSZWZlcmVuY2UgcmVmIDogb3duZXIuZUNsYXNzKCkuZ2V0RUFsbFJlZmVyZW5jZXMoKSkgewotCQkJCQkJCWlmKHJlZi5pc0NoYW5nZWFibGUoKSAmJiAhcmVmLmlzRGVyaXZlZCgpKSB7Ci0JCQkJCQkJCWlmKHJlZi5pc01hbnkoKSkgewotCQkJCQkJCQkJSW50ZXJuYWxFTGlzdCBsaXN0ID0gKEludGVybmFsRUxpc3QpIG93bmVyLmVHZXQocmVmKTsKLQkJCQkJCQkJCWludCBpZCA9IDA7Ci0JCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5iYXNpY0l0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJSW50ZXJuYWxFT2JqZWN0IG8gPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCQkJaWYoby5lSXNQcm94eSgpICYmIHVyaS5lcXVhbHMoby5lUHJveHlVUkkoKSkpIHsKLQkJCQkJCQkJCQkJaW5kZXggPSBpZDsKLQkJCQkJCQkJCQkJcmVmZXJlbmNlID0gcmVmOwotCQkJCQkJCQkJCQlicmVhayBmaW5kX3Byb3h5X2xvb3A7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWlkKys7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQlJbnRlcm5hbEVPYmplY3QgbyA9IChJbnRlcm5hbEVPYmplY3QpIG93bmVyLmVHZXQocmVmLCBmYWxzZSk7Ci0JCQkJCQkJCQlpZihvICE9IG51bGwgJiYgby5lSXNQcm94eSgpICYmIHVyaS5lcXVhbHMoby5lUHJveHlVUkkoKSkpIHsKLQkJCQkJCQkJCQlyZWZlcmVuY2UgPSByZWY7Ci0JCQkJCQkJCQkJYnJlYWsgZmluZF9wcm94eV9sb29wOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYocmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gbmV3IFJlZmVyZW5jZUluZm8ob3duZXIsIHJlZmVyZW5jZSwgaW5kZXgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IjZ2V0UmVzb2x1dGlvbnMob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcikKLQkgKi8KLQlwdWJsaWMgSU1hcmtlclJlc29sdXRpb25bXSBnZXRSZXNvbHV0aW9ucyhJTWFya2VyIG1hcmtlcikgewotCQlSZWZlcmVuY2VJbmZvIHJlZkluZm8gPSBnZXRSZWZlcmVuY2VJbmZvKG1hcmtlcik7Ci0JCWlmKHJlZkluZm8gIT0gbnVsbCkgewotCQkJT2JqZWN0IHNlbGVjdGFibGVPd25lciA9IGdldFNlbGVjdGFibGVPYmplY3QocmVmSW5mby5vd25lcik7Ci0JCQlJTWFya2VyUmVzb2x1dGlvbiBtYXJrZXJSZXNvbHV0aW9uID0gbmV3IE1hcmtlclJlc29sdXRpb24obWFya2VyLCByZWZJbmZvKTsKLQkJCWlmKHNlbGVjdGFibGVPd25lciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBJTWFya2VyUmVzb2x1dGlvbltdIHsKLQkJCQkJCW1hcmtlclJlc29sdXRpb24sCi0JCQkJCQluZXcgU2hvd093bmVySW5MaWJyYXJ5VmlldyhzZWxlY3RhYmxlT3duZXIpCi0JCQkJfTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBuZXcgSU1hcmtlclJlc29sdXRpb25bXSB7Ci0JCQkJCQltYXJrZXJSZXNvbHV0aW9uCi0JCQkJfTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRU1QVFlfUkVTT0xVVElPTlM7Ci0JfQotCi0JLyoqCi0JICogR2V0IHNlbGVjdGFibGUgb2JqZWN0IAotCSAqIEBwYXJhbSBvd25lcgotCSAqIEByZXR1cm4KLQkgKiAJCQlvYmplY3QgaXRzZWxmCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldFNlbGVjdGFibGVPYmplY3QoRU9iamVjdCBvd25lcikgewotCQlpZihvd25lciBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBvd25lciBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50IHx8IG93bmVyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UgCi0JCQkJfHwgb3duZXIgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlyZXR1cm4gb3duZXI7Ci0JCX0KLQkJaWYob3duZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wID0gVW1hVXRpbC5nZXRQcm9jZXNzQ29tcG9uZW50KChNZXRob2RFbGVtZW50KSBvd25lcik7Ci0JCQlpZihwcm9jQ29tcCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHByb2NDb21wOwotCQkJfQotCQl9Ci0JCWlmKG93bmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCXJldHVybiBvd25lcjsKLQkJfQotCQlpZihvd25lciBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbiAmJiBvd25lci5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJcmV0dXJuIG93bmVyLmVDb250YWluZXIoKTsgCi0JCX0KLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBvd25lci5lUmVzb3VyY2UoKTsKLQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQlpZihlICE9IG93bmVyKSB7Ci0JCQlyZXR1cm4gZ2V0U2VsZWN0YWJsZU9iamVjdChlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvTWV0aG9kUmljaFRleHRNYXJrZXJIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9NZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTRlNDNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9NZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVmFsaWRhdGVBY3Rpb24uRWNsaXBzZVJlc291cmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuQ29udGVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5NZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Qcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotCi0vKioKLSAqIGJhc2VkIG9uIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5MaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlciAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyIGV4dGVuZHMgRWNsaXBzZVJlc291cmNlc1V0aWwgewkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyIElOU1RBTkNFID0gbmV3IE1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJRCA9ICJndWlkIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gbWFya2VyIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS0VSX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubWV0aG9kUmljaFRleHQiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gbWFya2VyIGF0dHJpYnV0ZQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNRVRIT0RfRklFTEROQU1FID0gIk1ldGhvZEZpZWxkTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHByaXZhdGUgY29uc3RydWN0b3IKLQlwcml2YXRlIE1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyKCkgewotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb250YWluZXJNYXAgZXh0ZW5kcyBIYXNoTWFwPE9iamVjdCwgSW50ZWdlcj4gewotCQkvKioKLQkJICogCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgQ29udGFpbmVyTWFwKCkgewotCQkJc3VwZXIoKTsKLQkJCWluaXRNYXAoKTsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobmV3IExpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQkJaW5pdE1hcCgpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCQljbGVhcigpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJCWluaXRNYXAoKTsKLQkJCQl9CQkJCQotCQkJfSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBpbml0TWFwKCkgewotCQkJY2xlYXIoKTsKLQkJCQotCQkJLy8gZmlsbCB0aGlzIHNldCB3aXRoIGNvbnRhaW5lcnMgb2YgbWFya2VkIG9iamVjdHMKLQkJCS8vCi0vLwkJCU1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotLy8JCQlpZihsaWIgIT0gbnVsbCkgewotLy8JCQkJSVByb2plY3QgcHJqID0gTWV0aG9kTGlicmFyeVByb2plY3QuZmluZFByb2plY3QobGliKTsKLS8vCQkJCWlmKHByaiAhPSBudWxsKSB7Ci0vLwkJCQkJdHJ5IHsKLS8vCQkJCQkJSU1hcmtlcltdIG1hcmtlcnMgPSBwcmouZmluZE1hcmtlcnMoSU5TVEFOQ0UuZ2V0TWFya2VySUQoKSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0vLwkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotLy8JCQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotLy8JCQkJCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKEdVSUQpOwotLy8JCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKS5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotLy8JCQkJCQkJaWYoZSAhPSBudWxsKSB7Ci0vLwkJCQkJCQkJLy8gcmVtb3ZlIGl0cyBjb250YWluZXJzIGZyb20gY29udGFpbmVyc09mTWFya2VkT2JqZWN0cwotLy8JCQkJCQkJCS8vCi0vLwkJCQkJCQkJbWFya0NvbnRhaW5lcnMoZSk7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGluY3JlbWVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlJbnRlZ2VyIGNvdW50OwotCQkJaWYgKGNvbnRhaW5zS2V5KG9iamVjdCkpIHsKLQkJCQljb3VudCA9IGdldChvYmplY3QpOwotCQkJfSBlbHNlIHsKLQkJCQljb3VudCA9IG5ldyBJbnRlZ2VyKDApOwotCQkJfQotCQkJY291bnQrKzsKLQkJCXB1dChvYmplY3QsIGNvdW50KTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBkZWNyZW1lbnQoT2JqZWN0IG9iamVjdCkgewotCQkJaWYgKGNvbnRhaW5zS2V5KG9iamVjdCkpIHsKLQkJCQlJbnRlZ2VyIGNvdW50ID0gZ2V0KG9iamVjdCk7Ci0JCQkJaWYgKGNvdW50ID09IDEpIHsKLQkJCQkJLy8gcmVtb3ZlIG9iamVjdAotCQkJCQlyZW1vdmUob2JqZWN0KTsKLQkJCQl9IGVsc2UgewotCQkJCQljb3VudC0tOwotCQkJCQlwdXQob2JqZWN0LCBjb3VudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgbWFya0NvbnRhaW5lcnMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCQlmb3IoRU9iamVjdCBjb250YWluZXIgPSBlLmVDb250YWluZXIoKTsgY29udGFpbmVyICE9IG51bGw7IGNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCkpIHsKLQkJCQlpbmNyZW1lbnQoY29udGFpbmVyKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCB1bm1hcmtDb250YWluZXJzKE1ldGhvZEVsZW1lbnQgZSkgewotCQkJZm9yKEVPYmplY3QgY29udGFpbmVyID0gZS5lQ29udGFpbmVyKCk7IGNvbnRhaW5lciAhPSBudWxsOyBjb250YWluZXIgPSBjb250YWluZXIuZUNvbnRhaW5lcigpKSB7Ci0JCQkJZGVjcmVtZW50KGNvbnRhaW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQ29udGFpbmVyTWFwIGNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMgPSBuZXcgQ29udGFpbmVyTWFwKCk7CQotCQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWFya2VySUQoKSB7Ci0JCXJldHVybiBNQVJLRVJfSUQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuTWFya2VySGVscGVyI2dldEZpbGUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbGUgZ2V0RmlsZShVUkkgdXJpKSB7Ci0JCWlmKHVyaS5pc0ZpbGUoKSkgewotCQkJcmV0dXJuIChJRmlsZSkgRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbih1cmkudG9GaWxlU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRGaWxlKHVyaSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJTWFya2VySGVscGVyI2FkanVzdE1hcmtlcihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyLCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGp1c3RNYXJrZXIoSU1hcmtlciBtYXJrZXIsIERpYWdub3N0aWMgZGlhZ25vc3RpYykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlib29sZWFuIHJldCA9IHN1cGVyLmFkanVzdE1hcmtlcihtYXJrZXIsIGRpYWdub3N0aWMpOwotCQlpZighZGlhZ25vc3RpYy5nZXREYXRhKCkuaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3QgbyA9IGRpYWdub3N0aWMuZ2V0RGF0YSgpLmdldCgwKTsKLQkJCU9iamVjdCBzdHIgPSBkaWFnbm9zdGljLmdldERhdGEoKS5nZXQoMSk7Ci0JCQlpZihvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoR1VJRCwgKChNZXRob2RFbGVtZW50KW8pLmdldEd1aWQoKSk7Ci0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkxPQ0FUSU9OLCBUbmdVdGlsLmdldExhYmVsKG8pICsgIiwgIiArIHN0cik7IC8vJE5PTi1OTFMtMSQKLQkgICAgCQltYXJrZXIuc2V0QXR0cmlidXRlKElERS5FRElUT1JfSURfQVRUUiwgIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChzdHIgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKE1FVEhPRF9GSUVMRE5BTUUsIChTdHJpbmcpc3RyKTsKLQkJCX0KLQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ludmFsaWQoT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCS8vIHRoaXMgaXMgYW4gVUkgb2JqZWN0OiBQcm9jZXNzZXMKLQkJCS8vCi0JCQlQcm9jZXNzZXNJdGVtUHJvdmlkZXIgaXAgPSAoUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmplY3Q7Ci0JCQlPYmplY3QgbzsKLQkJCXJldHVybiAoKG8gPSBpcC5nZXRDYXBhYmlsaXR5UGF0dGVyblBhY2thZ2UoKSkgIT0gbnVsbCAmJiBjb250YWluZXJzT2ZNYXJrZWRPYmplY3RzLmNvbnRhaW5zS2V5KG8pKQotCQkJCXx8ICgobyA9IGlwLmdldERlbGl2ZXJ5UHJvY2Vzc1BhY2thZ2UoKSkgIT0gbnVsbCAmJiBjb250YWluZXJzT2ZNYXJrZWRPYmplY3RzLmNvbnRhaW5zS2V5KG8pKTsKLQkJfQotCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyCi0JCQkJfHwgb2JqZWN0IGluc3RhbmNlb2YgQ29udGVudEl0ZW1Qcm92aWRlcikgewotCQkJLy8gdGhpcyBpcyBhbiBVSSBvYmplY3QKLQkJCS8vCi0JCQlvYmplY3QgPSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpb2JqZWN0KS5nZXRUYXJnZXQoKTsKLQkJfQotCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIFRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKSB7Ci0JCQkvLyB0aGlzIGlzIGFuIFVJIG9iamVjdDogZWl0aGVyIFRhc2tzLCBSb2xlcywgV29yayBQcm9kdWN0cywgb3IgR3VpZGFuY2UKLQkJCS8vCi0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gKChUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcilvYmplY3QpLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYoY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy5jb250YWluc0tleShvYmopIHx8IElOU1RBTkNFLmhhc01hcmtlcnMob2JqKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9CQkJCQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBjb250YWluZXJzT2ZNYXJrZWRPYmplY3RzLmNvbnRhaW5zS2V5KG9iamVjdCkgfHwgSU5TVEFOQ0UuaGFzTWFya2VycyhvYmplY3QpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLk1hcmtlckhlbHBlciNoYXNNYXJrZXJzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTWFya2VycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldEZpbGUob2JqZWN0KTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJU3RyaW5nIGd1aWQgPSAoKE1ldGhvZEVsZW1lbnQpb2JqZWN0KS5nZXRHdWlkKCk7Ci0JCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoZ2V0TWFya2VySUQoKSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCQlpZihndWlkLmVxdWFscyhtYXJrZXIuZ2V0QXR0cmlidXRlKEdVSUQpKSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5oYXNNYXJrZXJzKG9iamVjdCk7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlZCB0byBoYW5kbGUgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIGlmIHRoZSBvYmplY3QgYWxyZWFkeSBoYXMgYmVlbiB1bmxvYWRlZAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlNYXJrZXJIZWxwZXIjZ2V0RmlsZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRmlsZSBnZXRGaWxlKE9iamVjdCBkYXR1bSkgewotCQl0cnkgewotCQkJcmV0dXJuIHN1cGVyLmdldEZpbGUoZGF0dW0pOwotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkZWxldGVNYXJrZXJzKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0RmlsZShvYmplY3QpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlTdHJpbmcgZ3VpZCA9ICgoTWV0aG9kRWxlbWVudClvYmplY3QpLmdldEd1aWQoKTsKLQkJCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhnZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJCWlmKGd1aWQuZXF1YWxzKG1hcmtlci5nZXRBdHRyaWJ1dGUoR1VJRCkpICYmIChmaWVsZE5hbWUgPT0gbnVsbCB8fAotCQkJCQkJCQlmaWVsZE5hbWUuZXF1YWxzKG1hcmtlci5nZXRBdHRyaWJ1dGUoTUVUSE9EX0ZJRUxETkFNRSkpKSkgewotCQkJCQkJCW1hcmtlci5kZWxldGUoKTsKLS8vCQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLS8vCQkJCQkJCWlmKGUgIT0gbnVsbCkgewotLy8JCQkJCQkJCS8vIHJlbW92ZSBpdHMgY29udGFpbmVycyBmcm9tIGNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMKLS8vCQkJCQkJCQkvLwotLy8JCQkJCQkJCWNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMudW5tYXJrQ29udGFpbmVycyhlKTsKLS8vCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJCXsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXN1cGVyLmRlbGV0ZU1hcmtlcnMob2JqZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVNYXJrZXJzKElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiBpbmNsdWRlU3VidHlwZXMsIGludCBkZXB0aCkgewotLy8JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0vLwkJCXRyeSB7CQkJCQotLy8JCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhnZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotLy8JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotLy8JCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShHVUlEKTsKLS8vCQkJCQlNZXRob2RFbGVtZW50IGUgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0vLwkJCQkJaWYoZSAhPSBudWxsKSB7Ci0vLwkJCQkJCS8vIHJlbW92ZSBpdHMgY29udGFpbmVycyBmcm9tIGNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMKLS8vCQkJCQkJLy8KLS8vCQkJCQkJY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy51bm1hcmtDb250YWluZXJzKGUpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCi0vLwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotLy8JCQkJCi0vLwkJCX0JCQkKLS8vCQl9Ci0JCQkKLQkJc3VwZXIuZGVsZXRlTWFya2VycyhyZXNvdXJjZSwgaW5jbHVkZVN1YnR5cGVzLCBkZXB0aCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU1hcmtlcnMoSVJlc291cmNlIHJlc291cmNlLCBEaWFnbm9zdGljIGRpYWdub3N0aWMsIERpYWdub3N0aWMgcGFyZW50RGlhZ25vc3RpYykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlci5jcmVhdGVNYXJrZXJzKHJlc291cmNlLCBkaWFnbm9zdGljLCBwYXJlbnREaWFnbm9zdGljKTsKLS8vCQlTdHJpbmcgZmllbGROYW1lID0gbnVsbDsKLS8vCQlpZighZGlhZ25vc3RpYy5nZXREYXRhKCkuaXNFbXB0eSgpICYmIGRpYWdub3N0aWMuZ2V0RGF0YSgpLnNpemUoKSA+IDEpIHsKLS8vCQkJZmllbGROYW1lID0gKFN0cmluZylkaWFnbm9zdGljLmdldERhdGEoKS5nZXQoMSk7Ci0vLwkJfQotLy8JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIGZpZWxkTmFtZSAhPSBudWxsKSB7Ci0vLwkJCXRyeSB7CQkJCQotLy8JCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhnZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotLy8JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotLy8JCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShHVUlEKTsKLS8vCQkJCQlpZihmaWVsZE5hbWUuZXF1YWxzKG1hcmtlci5nZXRBdHRyaWJ1dGUoTUVUSE9EX0ZJRUxETkFNRSkpKSB7Ci0vLwkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLS8vCQkJCQkJaWYoZSAhPSBudWxsKSB7Ci0vLwkJCQkJCQkvLyBhZGQgaXRzIGNvbnRhaW5lcnMgdG8gY29udGFpbmVyc09mTWFya2VkT2JqZWN0cwotLy8JCQkJCQkJLy8KLS8vCQkJCQkJCWNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMubWFya0NvbnRhaW5lcnMoZSk7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwotLy8JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLS8vCQkJCQotLy8JCQl9CQkJCi0vLwkJfQotCi0JfQotCQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcG9zZU1lc3NhZ2UoRGlhZ25vc3RpYyBkaWFnbm9zdGljLCBEaWFnbm9zdGljIHBhcmVudERpYWdub3N0aWMpCi0gICAgewotICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBkaWFnbm9zdGljLmdldE1lc3NhZ2UoKTsKLSAgICAgIGlmIChwYXJlbnREaWFnbm9zdGljICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwYXJlbnRNZXNzYWdlID0gcGFyZW50RGlhZ25vc3RpYy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGlmIChwYXJlbnRNZXNzYWdlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZSAhPSBudWxsID8gcGFyZW50TWVzc2FnZSArICIgIiArIG1lc3NhZ2UgOiBwYXJlbnRNZXNzYWdlOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBtZXNzYWdlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvUmVmcmVzaEhhbmRsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9SZWZyZXNoSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTIwYWFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9SZWZyZXNoSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuTGlicmFyeVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLQotLyoqCi0gKiBOb3RpZnkgY2hhbmdlcyBpbiByZXNvdXJjZXMgdG8gcmVmcmVzaAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVmcmVzaEhhbmRsZXIgaW1wbGVtZW50cyBJUmVmcmVzaEhhbmRsZXIgewotCQotCXByaXZhdGUgVmlld1BhcnQgdmlldzsKLQotCi0JcHVibGljIFJlZnJlc2hIYW5kbGVyKFZpZXdQYXJ0IHZpZXcpIHsKLQkJdGhpcy52aWV3ID0gdmlldzsKLQl9Ci0JCi0JcHJpdmF0ZSBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCWlmKHZpZXcgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsKLQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcil2aWV3KS5nZXRWaWV3ZXIoKTsKLQkJCWlmKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHZpZXdlci5nZXRDb250cm9sKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJQ29udHJvbCBjdHJsID0gZ2V0Q29udHJvbCgpOwotCQlpZiAoY3RybCA9PSBudWxsIHx8IGN0cmwuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0JCWlmIChjdHJsLmdldERpc3BsYXkoKS5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7Ci0JCQlkb1JlZnJlc2godmlldy5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWRvUmVmcmVzaChudWxsKTsKLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkb1JlZnJlc2goU2hlbGwgc2hlbGwpIHsKLQkJZmluYWwgYm9vbGVhbiByZWZyZXNoVmlld3MgPSAhUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFJlbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcygpLmlzRW1wdHkoKQotCQkJCXx8ICFSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0QWRkZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCk7Ci0JCUFycmF5TGlzdDxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRSZW1vdmVkUmVzb3VyY2VzKCkpOwotCQlBcnJheUxpc3Q8UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPihSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLQkJQXJyYXlMaXN0PElSZXNvdXJjZT4gYWRkZWRXc1Jlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8SVJlc291cmNlPihSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0QWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMoKSk7Ci0KLQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSB8fCAhY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkKLQkJCQl8fCAhYWRkZWRXc1Jlc291cmNlcy5pc0VtcHR5KCkgfHwgcmVmcmVzaFZpZXdzKSB7Ci0JCQlibG9ja2luZ1JlZnJlc2gocmVtb3ZlZFJlc291cmNlcywgY2hhbmdlZFJlc291cmNlcywKLQkJCQkJYWRkZWRXc1Jlc291cmNlcywgc2hlbGwpOwotCQl9Ci0KLQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlbW92ZWRSZXNvdXJjZXMoKS5yZW1vdmVBbGwoCi0JCQkJCXJlbW92ZWRSZXNvdXJjZXMpOwotCQl9Ci0JCWlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkucmVtb3ZlQWxsKAotCQkJCQljaGFuZ2VkUmVzb3VyY2VzKTsKLQkJfQotCQlpZiAoIWFkZGVkV3NSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0QWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMoKS5yZW1vdmVBbGwoCi0JCQkJCWFkZGVkV3NSZXNvdXJjZXMpOwotCQl9Ci0JCWlmIChyZWZyZXNoVmlld3MpIHsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRSZWxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMoKQotCQkJCQkuY2xlYXIoKTsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRBZGRlZFJlc291cmNlcygpLmNsZWFyKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJsb2NraW5nUmVmcmVzaChmaW5hbCBBcnJheUxpc3Q8UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMsCi0JCQlmaW5hbCBBcnJheUxpc3Q8UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMsCi0JCQlmaW5hbCBDb2xsZWN0aW9uPElSZXNvdXJjZT4gYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMsCi0JCQlTaGVsbCBzaGVsbCkgewotCQlmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCQkJbW9uaXRvcgotCQkJCQkJLnN1YlRhc2soQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtKTsKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl0cnkgewotCQkJCQkvLyBtb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJZG9SZWZyZXNoKHJlbW92ZWRSZXNvdXJjZXMsIGNoYW5nZWRSZXNvdXJjZXMsCi0JCQkJCQkJYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCi0JCUlSdW5uYWJsZUNvbnRleHQgY29udGV4dCA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpOwotCQl0cnkgewotCQkJdmlldy5nZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkKLQkJCQkJLnJ1bkluVUkoCi0JCQkJCQkJY29udGV4dCwKLQkJCQkJCQlydW5uYWJsZSwKLQkJCQkJCQluZXcgTGlicmFyeVNjaGVkdWxpbmdSdWxlKExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlOwotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwKLQkJCQkJZS50b1N0cmluZygpLCBlKTsKLQkJfQotCX0KLQotCQotCS8qKgotCSAqIE11c3QgYmUgc3luY2hyb25pemVkIHRvIGF2b2lkIHN0ZXBwaW5nIG9uIGVhY2ggb3RoZXIgaW4gcmVsb2FkaW5nCi0JICogcmVzb3VyY2VzL3JlZnJlc2hpbmcgVUkKLQkgKiAKLQkgKiBAcGFyYW0gcmVtb3ZlZFJlc291cmNlcwotCSAqIEBwYXJhbSBjaGFuZ2VkUmVzb3VyY2VzCi0JICogQHBhcmFtIGFkZGVkV29ya3NwYWNlUmVzb3VyY2VzCi0JICogICAgICAgICAgICBjb2xsZWN0aW9uIG9mIElSZXNvdXJjZSBvYmplY3RzIHRoYXQgYXJlIGp1c3QgbmV3bHkgYWRkZWQgdG8KLQkgKiAgICAgICAgICAgIHRoZSBsaWJyYXJ5Ci0JICogQHBhcmFtIHJlZnJlc2hWaWV3cwotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgZG9SZWZyZXNoKENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMsCi0JCQlDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzLCBDb2xsZWN0aW9uPElSZXNvdXJjZT4gYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMpIHsKLQkJSGFzaFNldDxJRWRpdG9yUGFydD4gZWRpdG9yc1RvUmVmcmVzaCA9IG5ldyBIYXNoU2V0PElFZGl0b3JQYXJ0PigpOwotCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQloYW5kbGVSZW1vdmVkUmVzb3VyY2VzKHJlbW92ZWRSZXNvdXJjZXMsIGVkaXRvcnNUb1JlZnJlc2gpOwotCQl9Ci0JCWlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCWhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlcywgZWRpdG9yc1RvUmVmcmVzaCk7Ci0JCX0KLQkJaWYgKGFkZGVkV29ya3NwYWNlUmVzb3VyY2VzICE9IG51bGwKLQkJCQkmJiAhYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlJTGlicmFyeU1hbmFnZXIgbWdyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWdyICE9IG51bGwpIHsKLQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG1nci5nZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCWlmIChyZXNvdXJjZVNldCBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgewotCQkJCQkoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2VTZXQpCi0JCQkJCQkJLmxvYWROZXdSZXNvdXJjZXMoYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMpOwotCQkJCQkoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2VTZXQpLmdldFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIoKS52YWxpZGF0ZUFsbE1hcmtlcnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKENvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMsCi0JCQlDb2xsZWN0aW9uPElFZGl0b3JQYXJ0PiBlZGl0b3JzVG9SZWZyZXNoKSB7Ci0JCXJldHVybiBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKGNoYW5nZWRSZXNvdXJjZXMsIG51bGwsIGVkaXRvcnNUb1JlZnJlc2gpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZW1vdmVkUmVzb3VyY2VzCi0JICogQHBhcmFtIGVkaXRvcnNUb1JlZnJlc2gKLQkgKiBAcmV0dXJuIHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiB1bmxvYWRlZAotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gaGFuZGxlUmVtb3ZlZFJlc291cmNlcyhDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzLAotCQkJQ29sbGVjdGlvbjxJRWRpdG9yUGFydD4gZWRpdG9yc1RvUmVmcmVzaCkgewotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gdmlldy5nZXRTaXRlKCkuZ2V0UGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlBcnJheUxpc3Q8SUVkaXRvclBhcnQ+IGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCA9IG5ldyBBcnJheUxpc3Q8SUVkaXRvclBhcnQ+KCk7Ci0JCUFycmF5TGlzdDxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlTGlzdCA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KHJlbW92ZWRSZXNvdXJjZXMpOwotCQlpZiAoZWRpdG9yc1RvUmVmcmVzaCA9PSBudWxsKSB7Ci0JCQllZGl0b3JzVG9SZWZyZXNoID0gbmV3IEFycmF5TGlzdDxJRWRpdG9yUGFydD4oKTsKLQkJfQotCQkvLyBmaW5kIGFsbCBlZGl0b3Igd2l0aCBkaXJ0eSBjb25mbGljdAotCQkvLwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvciAmJiBlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IGlucHV0ID0gKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgZWRpdG9yCi0JCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGlucHV0LmdldE1ldGhvZEVsZW1lbnQoKSAhPSBudWxsID8gaW5wdXQKLQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KCkuZVJlc291cmNlKCkgOiBudWxsOwotCQkJCWlmICghcmVtb3ZlZFJlc291cmNlcy5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gdXNlZFJlc291cmNlcyA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZWRpdG9yKQotCQkJCQkJCS5nZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJCWNoZWNrX3Jlc291cmNlOiBmb3IgKGludCBqID0gMDsgaiA8IHJlbW92ZWRSZXNvdXJjZUxpc3QKLQkJCQkJCQkuc2l6ZSgpOyBqKyspIHsKLQkJCQkJCXJlc291cmNlID0gKFJlc291cmNlKSByZW1vdmVkUmVzb3VyY2VMaXN0LmdldChqKTsKLQkJCQkJCWlmICh1c2VkUmVzb3VyY2VzLmNvbnRhaW5zKHJlc291cmNlKSkgewotCQkJCQkJCWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5hZGQoZWRpdG9yKTsKLQkJCQkJCQlicmVhayBjaGVja19yZXNvdXJjZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWVkaXRvcnNUb1JlZnJlc2guYWRkKGVkaXRvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QuaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBzZWxlY3RlZCA9IHNlbGVjdERpcnR5RWRpdG9ycyhkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJCWVkaXRvcnNUb1JlZnJlc2guYWRkKChJRWRpdG9yUGFydCkgc2VsZWN0ZWRbaV0pOwotCQkJfQotCQl9Ci0KLQkJLy8gVW5sb2FkIHRoZSByZW1vdmVkIHJlc291cmNlcy4KLQkJUGVyc2lzdGVuY2VVdGlsLnVubG9hZChyZW1vdmVkUmVzb3VyY2VzKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvciAmJiAhZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHVzZWRSZXNvdXJjZXMgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikKLQkJCQkJCS5nZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJY2hlY2tfcmVzb3VyY2U6IGZvciAoaW50IGogPSAwOyBqIDwgcmVtb3ZlZFJlc291cmNlTGlzdC5zaXplKCk7IGorKykgewotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgcmVtb3ZlZFJlc291cmNlTGlzdC5nZXQoaik7Ci0JCQkJCWlmICh1c2VkUmVzb3VyY2VzLmNvbnRhaW5zKHJlc291cmNlKSkgewotCQkJCQkJZWRpdG9yc1RvUmVmcmVzaC5hZGQoZWRpdG9yKTsKLQkJCQkJCWJyZWFrIGNoZWNrX3Jlc291cmNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlbW92ZWRSZXNvdXJjZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBSZWxvYWQgdGhlIGNoYW5nZWQgcmVzb3VyY2VzCi0JICogCi0JICogQHBhcmFtIGNoYW5nZWRSZXNvdXJjZXMKLQkgKiBAcGFyYW0gZWRpdG9yc05vdFRvUmVmcmVzaAotCSAqIEBwYXJhbSBlZGl0b3JzVG9SZWZyZXNoCi0JICogQHJldHVybiBMaXN0IG9mIGNoYW5nZWQgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHJlbG9hZGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcywKLQkJCUNvbGxlY3Rpb248SUVkaXRvclBhcnQ+IGVkaXRvcnNOb3RUb1JlZnJlc2gsIENvbGxlY3Rpb248SUVkaXRvclBhcnQ+IGVkaXRvcnNUb1JlZnJlc2gpIHsKLQkJQ29udHJvbCBjdHJsID0gZ2V0Q29udHJvbCgpOwotCQlpZiAoY3RybCA9PSBudWxsIHx8IGN0cmwuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCi0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSB2aWV3LmdldFNpdGUoKS5nZXRQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCUFycmF5TGlzdDxJRWRpdG9yUGFydD4gZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0ID0gbmV3IEFycmF5TGlzdDxJRWRpdG9yUGFydD4oKTsKLQkJQXJyYXlMaXN0PFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VMaXN0ID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oY2hhbmdlZFJlc291cmNlcyk7Ci0JCS8vIGZpbmQgYWxsIGVkaXRvciB3aXRoIGRpcnR5IGNvbmZsaWN0Ci0JCS8vCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yICYmIGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQlDb2xsZWN0aW9uPFJlc291cmNlPiB1c2VkUmVzb3VyY2VzID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpCi0JCQkJCQkuZ2V0VXNlZFJlc291cmNlcygpOwotCQkJCWNoZWNrX3Jlc291cmNlOiBmb3IgKGludCBqID0gMDsgaiA8IGNoYW5nZWRSZXNvdXJjZUxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGNoYW5nZWRSZXNvdXJjZUxpc3QuZ2V0KGopOwotCQkJCQlpZiAodXNlZFJlc291cmNlcy5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJCWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5hZGQoZWRpdG9yKTsKLQkJCQkJCWJyZWFrIGNoZWNrX3Jlc291cmNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gcmVzdWx0ID0gc2VsZWN0RGlydHlFZGl0b3JzKGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCk7Ci0JCQlpZihyZXN1bHQgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCU9iamVjdCBlZGl0b3IgPSByZXN1bHRbaV07Ci0JCQkJCWlmICgoZWRpdG9yc05vdFRvUmVmcmVzaCA9PSBudWxsIHx8ICFlZGl0b3JzTm90VG9SZWZyZXNoCi0JCQkJCQkJLmNvbnRhaW5zKGVkaXRvcikpCi0JCQkJCQkJJiYgKGVkaXRvcnNUb1JlZnJlc2ggPT0gbnVsbCB8fCAhZWRpdG9yc1RvUmVmcmVzaAotCQkJCQkJCQkJLmNvbnRhaW5zKGVkaXRvcikpKSB7Ci0JCQkJCQlkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QucmVtb3ZlKGVkaXRvcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyByZW1vdmUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IGRpcnR5IGVkaXRvcnMgd2l0aCBjb25mbGljdCBmcm9tIHRoZQotCQkJLy8gY29sbGVjdGlvbiBvZiBjaGFuZ2VkIHJlc291cmNlcyBhZnRlciB1cGRhdGluZyBjYWNoZWQgbW9kaWZpY2F0aW9uIHN0YW1wCi0JCQkvLyBzbyB0aGV5IHdpbGwgbm90IGJlIHByb21wdGVkIHRvIHJlbG9hZCBhZ2FpbiB1bnRpbCB0aGUgbmV4dCBleHRlcm5hbCBjaGFuZ2UKLQkJCS8vCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5zaXplKCk7IGkrKykgewotCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdAotCQkJCQkJLmdldChpKTsJCQkJCi0JCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gdXNlZFJlc291cmNlcyA9IGVkaXRvci5nZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJdXNlZFJlc291cmNlcy5yZXRhaW5BbGwoY2hhbmdlZFJlc291cmNlTGlzdCk7Ci0JCQkJZWRpdG9yLnVwZGF0ZVJlc291cmNlSW5mb3ModXNlZFJlc291cmNlcyk7Ci0JCQkJZWRpdG9yLm92ZXdyaXRlUmVzb3VyY2VzKHVzZWRSZXNvdXJjZXMpOwotCQkJCWNoYW5nZWRSZXNvdXJjZUxpc3QucmVtb3ZlQWxsKHVzZWRSZXNvdXJjZXMpOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VMaXN0LmlzRW1wdHkoKSkgewotCQkJLy8gUmVsb2FkIHRoZSBzZWxlY3RlZCBjaGFuZ2VkIHJlc291cmNlcy4KLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5yZWxvYWRSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlTGlzdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZUxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBzZWxlY3REaXJ0eUVkaXRvcnMoCi0JCQlBcnJheUxpc3Q8SUVkaXRvclBhcnQ+IGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCkgewotCQlyZXR1cm4gc2VsZWN0RGlydHlFZGl0b3JzKGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCwgdmlldy5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBzZWxlY3REaXJ0eUVkaXRvcnMoTGlzdDw/PiBkaXJ0eUVkaXRvcnMsIFNoZWxsIHNoZWxsKSB7Ci0JCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9GaWxlQ29uZmxpY3RfbGFiZWw7Ci0JCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zZWxlY3RFZGl0b3JzVG9EaXNjYXJkQ29uZmxpY3RDaGFuZ2VzOwotCQlyZXR1cm4gc2VsZWN0RWRpdG9ycyhkaXJ0eUVkaXRvcnMsIHRpdGxlLCBtc2csIHNoZWxsKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBPYmplY3RbXSBzZWxlY3RFZGl0b3JzKExpc3Q8Pz4gZWRpdG9ycywgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTaGVsbCBzaGVsbCkgewotCQkvLyBwcm9tcHQgdXNlciB0byBkaXNjYXJkIGNoYW5nZXMgaW4gZWRpdG9ycyB0aGF0IGNvbmZsaWN0IHdpdGggb3V0c2lkZQotCQkvLyBjaGFuZ2UKLQkJLy8KLQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJTGlzdDw/PiBmQ29udGVudHM7Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJaWYgKGZDb250ZW50cyAhPSBudWxsICYmIGZDb250ZW50cyA9PSBpbnB1dEVsZW1lbnQpCi0JCQkJCXJldHVybiBmQ29udGVudHMudG9BcnJheSgpOwotCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LAotCQkJCQlPYmplY3QgbmV3SW5wdXQpIHsKLQkJCQlpZiAobmV3SW5wdXQgaW5zdGFuY2VvZiBMaXN0KQotCQkJCQlmQ29udGVudHMgPSAoTGlzdDw/PikgbmV3SW5wdXQ7Ci0JCQkJZWxzZQotCQkJCQlmQ29udGVudHMgPSBudWxsOwotCi0JCQl9Ci0KLQkJfTsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0JCQkJCXJldHVybiAoKElFZGl0b3JQYXJ0KSBlbGVtZW50KS5nZXRUaXRsZSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotCQkJCQlyZXR1cm4gKChJRWRpdG9yUGFydCkgZWxlbWVudCkuZ2V0VGl0bGVJbWFnZSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCQl9Ci0JCX07Ci0JCUxpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IExpc3RTZWxlY3Rpb25EaWFsb2coc2hlbGwsCi0JCQkJZWRpdG9ycywgY29udGVudFByb3ZpZGVyLCBsYWJlbFByb3ZpZGVyLCBtc2cpOwotCQlkbGcuc2V0VGl0bGUodGl0bGUpOwotCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWRsZy5vcGVuKCk7Ci0JCXJldHVybiBkbGcuZ2V0UmVzdWx0KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9SaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTMwMjE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9SaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkltYWdlSHlwZXJsaW5rOwotCi0vKioKLSAqIFNpbXBsZSBjb250YWluZXIgY2xhc3MgdXNlZCBhcyBhIHJldHVybiB2YWx1ZSBmb3IgRm9ybVVJIGNvbnZlbmllbmNlIG1ldGhvZHMKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyIHsKLQlwdWJsaWMgSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0OwotCXB1YmxpYyBJbWFnZUh5cGVybGluayBsaW5rOwotCXB1YmxpYyBMYWJlbCBsYWJlbDsKLQkKLQlwdWJsaWMgUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIoSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0LCBJbWFnZUh5cGVybGluayBsaW5rLCBMYWJlbCBsYWJlbCkgewotCQl0aGlzLnJpY2hUZXh0ID0gcmljaFRleHQ7Ci0JCXRoaXMubGluayA9IGxpbms7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmdldENvbnRyb2woKS5zZXRWaXNpYmxlKHZpc2libGUpOwotCQl9Ci0JCWlmIChsaW5rICE9IG51bGwpIHsKLQkJCWxpbmsuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJfQotCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJbGFiZWwuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlQmVsb3coQ29udHJvbCBjb250cm9sKSB7Ci0JCWlmIChsaW5rICE9IG51bGwpIHsKLQkJCWxpbmsubW92ZUJlbG93KGNvbnRyb2wpOwotCQl9Ci0JCWlmIChsYWJlbCAhPSBudWxsKSB7Ci0JCQlsYWJlbC5tb3ZlQmVsb3cobGluayk7Ci0JCX0KLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmdldENvbnRyb2woKS5tb3ZlQmVsb3cobGFiZWwpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZHJhdygpIHsKLQkJaWYgKGxpbmsgIT0gbnVsbCkgewotCQkJbGluay5yZWRyYXcoKTsKLQkJfQotCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJbGFiZWwucmVkcmF3KCk7Ci0JCX0KLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmdldENvbnRyb2woKS5yZWRyYXcoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9VSUhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL1VJSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNjllYWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL1VJSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5CcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLkRpYWdyYW1FZGl0b3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsLkNvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JSW5wdXRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JbnB1dERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLQotCi0vKioKLSAqIEhlbHBlciBVdGlsaXR5IGNsYXNzIGZvciBVSQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVJSGVscGVyIHsKLQotCS8qKgotCSAqIFNldHRpbmcgaXRlbXMgaW4gYSB0YWJsZQotCSAqIAotCSAqIEBwYXJhbSB0YWJsZQotCSAqIEBwYXJhbSBpdGVtcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJdGVtcyhUYWJsZSB0YWJsZSwgQXJyYXlMaXN0IGl0ZW1zKSB7Ci0JCXRhYmxlLnJlbW92ZUFsbCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCgoU3RyaW5nKSBpdGVtcy5nZXQoaSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGxpc3Qgb24gdGhlIGdpdmVuIGNvbXBvc2l0ZSB3aXRoIGdpdmVuIHN0eWxlCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGNyZWF0ZUxpc3QoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBzdHlsZSkgewotCQlMaXN0IGxpc3QgPSBuZXcgTGlzdChwYXJlbnQsIHN0eWxlIHwgU1dULk5VTEwpOwotCQl0b29sa2l0LmFkYXB0KGxpc3QsIHRydWUsIHRydWUpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKgotCSAqIE1ldGhvZCB3aWxsIHJldHVybiBPYmplY3RbXSBvZiBndWlkYW5jZSBleGNsdWRpbmcgUHJhY3RpY2UuCi0JICogTWV0aG9kRWxlbWVudFV0aWwjZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoRU9iamVjdCkgY2FsY3VsYXRlcyBhbGwgZ3VpZGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBnZXRTZWxlY3RlZEd1aWRhbmNlcyhDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCkgewotCQlqYXZhLnV0aWwuTGlzdCBsaXN0ID0gTWV0aG9kRWxlbWVudFV0aWwKLQkJCQkuZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoY29udGVudEVsZW1lbnQpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByYWN0aWNlKQotCQkJCWl0LnJlbW92ZSgpOwotCQl9Ci0JCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Rm9ybVBhZ2VUaXRsZVByZWZpeEZvcihNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQpIHsKLQkJU3RyaW5nIGVsZW1lbnRMYWJlbCA9IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0KG1ldGhvZEVsZW1lbnQpOwotCQlpZiAobWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX1dPUktfUFJPRFVDVCArICIgKCIgKyBlbGVtZW50TGFiZWwgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGVsc2UgaWYgKG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9HVUlEQU5DRSArICIgKCIgKyBlbGVtZW50TGFiZWwgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVsZW1lbnRMYWJlbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGV4dCBmb3IgdGhlIGdpdmVuIGZvcm0gYmFzZWQgb24gdGhlIGdpdmVuIGVsZW1lbnQsIGluY2x1ZGluZyB2YXJpYWJsZSBpbmZvcm1hdGlvbiBvZiB0aGUgZWxlbWVudAotCSAqIGlmIHRoZXJlIGlzIGFueS4KLQkgKiAKLQkgKiBAcGFyYW0gZm9ybQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEZvcm1UZXh0KFNjcm9sbGVkRm9ybSBmb3JtLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGZvcm0gIT0gbnVsbCAmJiAhZm9ybS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBzdHIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzdHIuYXBwZW5kKGdldEZvcm1QYWdlVGl0bGVQcmVmaXhGb3IoZWxlbWVudCkpOwotCQkJc3RyLmFwcGVuZChBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JfdGl0bGVfY29sb25fd2l0aF9zcGFjZXMpOwotCQkJCi0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJc3RyLmFwcGVuZChUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQsCi0JCQkJCQkiIiwgdHJ1ZSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmKGVsZW1lbnQuZ2V0TmFtZSgpICE9IG51bGwpewotCQkJCXN0ci5hcHBlbmQoZWxlbWVudC5nZXROYW1lKCkpOwotCQkJfQotCQkJZm9ybS5zZXRUZXh0KHN0ci50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgZ2l2ZW4gZGVsaXZlcmFibGVzIGxlYWRzIHRvIGNpcmN1bGFyIGRlcGVuZGVuY3kKLQkgKiBAcGFyYW0gdG9CZVBhcnQKLQkgKiBAcGFyYW0gZGVsaXZlcmFibGUKLQkgKiBAcmV0dXJuCi0JICogCQkJQm9vbGVhbiB2YWx1ZSB0byBpbmRpY2F0ZSB3aGV0aGVyIGNpY3VsYXIgZGVwZW5kZW5jeSBpcyBkZXRlY3RlZAotCSAqIEBkZXByZWNhdGVkIG1vdmVkIHRvIHtAbGluayBEZXBlbmRlbmN5Q2hlY2tlciNjaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKERlbGl2ZXJhYmxlLCBEZWxpdmVyYWJsZSl9Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJEZWxpdmVyYWJsZXMoRGVsaXZlcmFibGUgdG9CZVBhcnQsCi0JCQlEZWxpdmVyYWJsZSBkZWxpdmVyYWJsZSkgewotCQlyZXR1cm4gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcyh0b0JlUGFydCwgZGVsaXZlcmFibGUpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgZGVsaXZlcmFibGUgcGFydHMgYXJlIGluIGNoYWluCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gcm9vdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaXZlcmFibGVQYXJ0c0NoYWluKERlbGl2ZXJhYmxlIGUsIGphdmEudXRpbC5MaXN0IHJvb3RzKSB7Ci0JCWphdmEudXRpbC5MaXN0IGxpc3QgPSBlLmdldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpOwotCQlpZiAobGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJCXJvb3RzLmFkZChvYmopOwotCQkJCQlkZWxpdmVyYWJsZVBhcnRzQ2hhaW4oKERlbGl2ZXJhYmxlKSBvYmosIHJvb3RzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0KLQkvKioKLQkgKiBSZXNvbHZlIGNvbnRlbnQgZWxlbWVudCBuYW1lIGNvbmZsaWN0cwotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSByZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlQ29udGVudEVsZW1lbnROYW1lQ29uZmxpY3QoRU9iamVjdCBjb250YWluZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRVJlZmVyZW5jZQotCQkJcmVmZXJlbmNlKSB7Ci0KLQkJZmluYWwgSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yKGNvbnRhaW5lcgotCQkJCSwgcmVmZXJlbmNlLAotCQkJCShDb250ZW50RWxlbWVudCkgZWxlbWVudCwgbmV3IFZhbGlkYXRvckZhY3RvcnkuVHlwZUZpbHRlcihlbGVtZW50KSk7Ci0JCQotCQlTdHJpbmcgbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQoZWxlbWVudC5nZXROYW1lKCkpOwotCQkKLQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZmVhdHVyZVR4dCA9IFRuZ1V0aWwuZ2V0RmVhdHVyZVRleHQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMucmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190aXRsZTsgCi0JCQlTdHJpbmcgZGxnTXNnID0gTkxTLmJpbmQoCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGV4dCwKLQkJCQkJU3RyVXRpbC50b0xvd2VyKGZlYXR1cmVUeHQpLCBlbGVtZW50LmdldE5hbWUoKSk7Ci0JCQlTdHJpbmcgY3VycmVudFZhbHVlID0gKFN0cmluZykgZWxlbWVudC5lR2V0KFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQotCQkJSUlucHV0VmFsaWRhdG9yIGlucHV0VmFsaWRhdG9yID0gbmV3IElJbnB1dFZhbGlkYXRvcigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJCQkJcmV0dXJuIHZhbGlkYXRvci5pc1ZhbGlkKG5ld1RleHQpOwotCQkJCX0KLQkJCX07Ci0KLQkJCUlucHV0RGlhbG9nIGlucHV0RGxnID0gbmV3IElucHV0RGlhbG9nKAotCQkJCQlNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCksIHRpdGxlLCBkbGdNc2csIGN1cnJlbnRWYWx1ZSwKLQkJCQkJaW5wdXRWYWxpZGF0b3IpOwotCQkJaWYgKGlucHV0RGxnLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gaW5wdXREbGcuZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRGlhZ3JhbSBlZGl0b3JzIG9mIG9iamVjdCBpdHNlbGYgd2lsbCBiZSBjbG9zZWQuIEFuZCBQYXJlbnQgZGlhZ3JhbSBlZGl0b3JzIAotCSAqIHdpbGwgYmUgcmVmcmVzaGVkLiAgCi0JICogIEBkZXByZWNhdGVkICAoc2VlOiAge0BsaW5rIERpYWdyYW1FZGl0b3JIZWxwZXJ9IC0gcmVmcmVzaFBhcmVudERpYWdyYW1FZGl0b3JzKCkpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hPcGVuRGlhZ3JhbUVkaXRvcnNPZlBhcmVudChPYmplY3QgcmVmcmVzaEVsZW1lbnQsIGphdmEudXRpbC5MaXN0IG9wZW5FZGl0b3JSZWZzKSB7Ci0JCW9wZW5FZGl0b3JSZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBOb3cgcmVmcmVzaCBvYmplY3QncyBwYXJlbnQncyBkaWFncmFtcy4KLQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0IGJpbnB1dCA9IChCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpaW5wdXQ7Ci0JCQkJCWlmIChiaW5wdXQuZ2V0V3JhcHBlcigpICE9IG51bGwpIHsKLQkJCQkJCWVsZW1lbnQgPSBiaW5wdXQuZ2V0V3JhcHBlcigpOwotCQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQlPYmplY3QgcGFyZW50ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcillbGVtZW50KS5nZXRQYXJlbnQobnVsbCk7Ci0JCQkJCQkJaWYocGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCQlpZihlbGVtZW50LmVxdWFscyhyZWZyZXNoRWxlbWVudCkpCi0JCQkJCQkJCQlyZWZyZXNoT3BlbkRpYWdyYW1FZGl0b3JzT2ZQYXJlbnQocGFyZW50LCBvcGVuRWRpdG9yUmVmcyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJZWxlbWVudCA9IGJpbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQl9IAotCQkJCWVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIHsKLQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGRpYWdyYW1JbnB1dCA9ICgoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIGlucHV0KS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCQkJaWYgKGRpYWdyYW1JbnB1dCAhPSBudWxsKSB7Ci0JCQkJCQllbGVtZW50ID0gZGlhZ3JhbUlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKQotCQkJCXsKLQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJCWlmKCgoQWN0aXZpdHkpZWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhyZWZyZXNoRWxlbWVudCkpCi0JCQkJCQkJb3BlbkVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQllbHNlIGlmKHJlZnJlc2hFbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCU9iamVjdCBsb2NhbFJlZnJlc2hFbGVtZW50ID0gcmVmcmVzaEVsZW1lbnQ7Ci0JCQkJCQkJd2hpbGUoKGxvY2FsUmVmcmVzaEVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikKLQkJCQkJCQkJCSYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpbG9jYWxSZWZyZXNoRWxlbWVudCkuZ2V0T3duZXIoKSE9IG51bGwpewotCQkJCQkJCQlpZigoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWxvY2FsUmVmcmVzaEVsZW1lbnQpLmdldE93bmVyKCkKLQkJCQkJCQkJCQkuZXF1YWxzKGVsZW1lbnQpKXsKLQkJCQkJCQkJCW9wZW5FZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWxvY2FsUmVmcmVzaEVsZW1lbnQgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWxvY2FsUmVmcmVzaEVsZW1lbnQpLmdldE93bmVyKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9ZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJQ29sbGVjdGlvbiBjID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcillbGVtZW50KS5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJCQkJCWlmKGMgIT0gbnVsbCAmJiBjLmNvbnRhaW5zKHJlZnJlc2hFbGVtZW50KSl7Ci0JCQkJCQkJb3BlbkVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JCWludCBzaXplID0gb3BlbkVkaXRvclJlZnMuc2l6ZSgpOwotCQkvL0lFZGl0b3JSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gbmV3IElFZGl0b3JSZWZlcmVuY2Vbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChJRWRpdG9yUmVmZXJlbmNlKSBvcGVuRWRpdG9yUmVmcy5nZXQoaSk7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYoZWRpdG9yIGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yICl7Ci0JCQkJKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpZWRpdG9yKS5yZWZyZXNoRGlhZ3JhbSgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIENsb3NlIGRpYWdyYW0gZWRpdG9ycyBpbmNsdWRpbmcgcGFyZW50IGVkaXRvcnMKLQkgKiBAcGFyYW0gY2xvc2VFbGVtZW50Ci0JICogQHBhcmFtIGNsb3NlRWRpdG9yUmVmcwotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlRGlhZ3JhbUVkaXRvcnNJbmNsdWRpbmdQYXJlbnQoT2JqZWN0IGNsb3NlRWxlbWVudCwgamF2YS51dGlsLkxpc3QgY2xvc2VFZGl0b3JSZWZzKSB7Ci0JCWNsb3NlRWRpdG9yUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0IGJpbnB1dCA9IChCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpaW5wdXQ7Ci0JCQkJCWlmIChiaW5wdXQuZ2V0V3JhcHBlcigpICE9IG51bGwpIHsKLQkJCQkJCWVsZW1lbnQgPSBiaW5wdXQuZ2V0V3JhcHBlcigpOwotCQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQlPYmplY3QgcGFyZW50ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcillbGVtZW50KS5nZXRQYXJlbnQobnVsbCk7Ci0JCQkJCQkJaWYocGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCQlpZihlbGVtZW50LmVxdWFscyhjbG9zZUVsZW1lbnQpKQotCQkJCQkJCQkJY2xvc2VEaWFncmFtRWRpdG9yc0luY2x1ZGluZ1BhcmVudChwYXJlbnQsIGNsb3NlRWRpdG9yUmVmcyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJZWxlbWVudCA9IGJpbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQl9IAotCQkJCWVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIHsKLQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGRpYWdyYW1JbnB1dCA9ICgoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIGlucHV0KS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCQkJaWYgKGRpYWdyYW1JbnB1dCAhPSBudWxsKSB7Ci0JCQkJCQllbGVtZW50ID0gZGlhZ3JhbUlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKQotCQkJCXsKLQkJCQkJCS8vY2xvc2VFZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCQkJaWYoZWxlbWVudC5lcXVhbHMoY2xvc2VFbGVtZW50KSkKLQkJCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkKLQkJCQkJCWlmKCgoQWN0aXZpdHkpZWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhjbG9zZUVsZW1lbnQpKQotCQkJCQkJCWNsb3NlRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCWVsc2UgaWYoY2xvc2VFbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCWlmKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpY2xvc2VFbGVtZW50KS5nZXRPd25lcigpCi0JCQkJCQkJCQkhPSBudWxsKQotCQkJCQkJCQlpZigoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWNsb3NlRWxlbWVudCkuZ2V0T3duZXIoKQotCQkJCQkJCQkJLmVxdWFscyhlbGVtZW50KSl7Ci0JCQkJCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJCWlmKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpY2xvc2VFbGVtZW50KS5nZXRPd25lcigpCi0JCQkJCQkJCQlpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQkJCWlmKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikKLQkJCQkJCQkJCQkJY2xvc2VFbGVtZW50KS5nZXRPd25lcigpKS5nZXRPd25lcigpLmVxdWFscyhlbGVtZW50KSkKLQkJCQkJCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX1lbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQlDb2xsZWN0aW9uIGMgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWVsZW1lbnQpLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCQkJCQkJaWYoYyAhPSBudWxsICYmIGMuY29udGFpbnMoY2xvc2VFbGVtZW50KSl7Ci0JCQkJCQkJY2xvc2VFZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWludCBzaXplID0gY2xvc2VFZGl0b3JSZWZzLnNpemUoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgSUVkaXRvclJlZmVyZW5jZVtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlZmVyZW5jZXNbaV0gPSAoSUVkaXRvclJlZmVyZW5jZSkgY2xvc2VFZGl0b3JSZWZzLmdldChpKTsKLQkJfQotCQl3b3JrYmVuY2hQYWdlLmNsb3NlRWRpdG9ycyhyZWZlcmVuY2VzLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIEdldCBiYXNlIGFjdGl2aXR5IGZvciB0aGUgZ2l2ZW4gYWN0aXZpdHkKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcmV0dXJuCi0JICogCQkJQmFzZSBhY3Rpdml0eQotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFyaWFiaWxpdHlFbGVtZW50IGdldEJhc2VBY3Rpdml0eShBY3Rpdml0eSBhY3Rpdml0eSl7Ci0JCXdoaWxlICghYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkuZXF1YWxzKAotCQkJCVZhcmlhYmlsaXR5VHlwZS5OQSkpIHsKLQotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gYWN0aXZpdHkKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmICgodmUgIT0gbnVsbCkgJiYgKHZlIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQkJYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHZlOwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWN0aXZpdHk7Ci0JfQotCQotCS8qKgotCSAqIENsb3NlIGRpYWdyYW0gZWRpdG9ycwotCSAqIAotCSAqIEBwYXJhbSBjbG9zZUVsZW1lbnQKLQkgKiBAcGFyYW0gY2xvc2VFZGl0b3JSZWZzCi0JICogIEBkZXByZWNhdGVkIChzZWU6ICB7QGxpbmsgRGlhZ3JhbUVkaXRvckhlbHBlcn0pCi0JICogIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZURpYWdyYW1FZGl0b3JzKE9iamVjdCBjbG9zZUVsZW1lbnQsIGphdmEudXRpbC5MaXN0IGNsb3NlRWRpdG9yUmVmcykgewotCQljbG9zZUVkaXRvclJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCBiaW5wdXQgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KWlucHV0OwotCQkJCQlpZiAoYmlucHV0LmdldFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQllbGVtZW50ID0gYmlucHV0LmdldFdyYXBwZXIoKTsKLQkJCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQkJT2JqZWN0IHBhcmVudCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpZWxlbWVudCkuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQkJCQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQkJaWYoZWxlbWVudC5lcXVhbHMoY2xvc2VFbGVtZW50KSkKLQkJCQkJCQkJCWNsb3NlRGlhZ3JhbUVkaXRvcnMocGFyZW50LCBjbG9zZUVkaXRvclJlZnMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVsZW1lbnQgPSBiaW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQl9Ci0JCQkJfSAKLQkJCQllbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSB7Ci0JCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBkaWFncmFtSW5wdXQgPSAoKERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSBpbnB1dCkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCk7Ci0JCQkJCWlmIChkaWFncmFtSW5wdXQgIT0gbnVsbCkgewotCQkJCQkJZWxlbWVudCA9IGRpYWdyYW1JbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQlpZiAoZWxlbWVudC5lcXVhbHMoY2xvc2VFbGVtZW50KSkgewotCQkJCQkJY2xvc2VFZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gY2hlY2sgd2hldGhlciBlbGVtZW50IGlzIGNoaWxkIG9mIGNsb3NlRWxlbWVudAotCQkJCQkJLy8gZGlyZWN0bHkvaW5kaXJlY3RseQotCQkJCQkJaWYgKGNsb3NlRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCVByb2Nlc3NVdGlsLmdldENoaWxkRWxlbWVudHMoCi0JCQkJCQkJCQkoQWN0aXZpdHkpIGNsb3NlRWxlbWVudCwgQWN0aXZpdHkuY2xhc3MsCi0JCQkJCQkJCQljb2xsZWN0aW9uKTsKLQkJCQkJCQlpZiAoY29sbGVjdGlvbi5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWludCBzaXplID0gY2xvc2VFZGl0b3JSZWZzLnNpemUoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgSUVkaXRvclJlZmVyZW5jZVtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlZmVyZW5jZXNbaV0gPSAoSUVkaXRvclJlZmVyZW5jZSkgY2xvc2VFZGl0b3JSZWZzLmdldChpKTsKLQkJfQotCQl3b3JrYmVuY2hQYWdlLmNsb3NlRWRpdG9ycyhyZWZlcmVuY2VzLCBmYWxzZSk7Ci0JCXJlZmVyZW5jZXMgPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBEaWFncmFtIGVkaXRvcnMgb2Ygb2JqZWN0IGl0c2VsZiB3aWxsIGJlIGNsb3NlZC4gQW5kIFBhcmVudCBkaWFncmFtIGVkaXRvcnMgCi0JICogd2lsbCBiZSByZWZyZXNoZWQuICBjb2RlIG5vdCB0ZXN0ZWQgdXNlIHJlZnJlc2hPcGVuRGlhZ3JhbUVkaXRvcnMgbWV0aG9kLgotCSAqIE5vdCB1c2VkIGN1cnJlbnRseQotCSAqIEBwYXJhbSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc3luY0RpYWdyYW1FZGl0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJamF2YS51dGlsLkxpc3QgY2xvc2VFZGl0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlqYXZhLnV0aWwuTGlzdCByZWZyZXNoRWRpdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlPYmplY3QgZWRpdG9yRWxlbWVudCA9IG51bGw7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCBiaW5wdXQgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KWlucHV0OwotCQkJCQlpZihiaW5wdXQuZ2V0V3JhcHBlcigpICE9IG51bGwpewotCQkJCQkJZWRpdG9yRWxlbWVudCA9IGJpbnB1dC5nZXRXcmFwcGVyKCk7Ci0JCQkJCX1lbHNlewotCQkJCQkJZWRpdG9yRWxlbWVudCA9IGJpbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgewotCQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgZGlhZ3JhbUlucHV0ID0gKChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgaW5wdXQpLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJCQlpZiAoZGlhZ3JhbUlucHV0ICE9IG51bGwpIHsKLQkJCQkJCWVkaXRvckVsZW1lbnQgPSBkaWFncmFtSW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKGVkaXRvckVsZW1lbnQgIT0gbnVsbCl7Ci0JCQkJCWlmKGVkaXRvckVsZW1lbnQuZXF1YWxzKG9iamVjdCkpewotCQkJCQkJY2xvc2VFZGl0b3JzLmFkZChyZWZlcmVuY2UpOwotCQkJCQl9ZWxzZXsKLQkJCQkJCWlmKGVkaXRvckVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJCQkJaWYoKChBY3Rpdml0eSllZGl0b3JFbGVtZW50KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmNvbnRhaW5zKG9iamVjdCkpCi0JCQkJCQkJCXJlZnJlc2hFZGl0b3JzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCQlPYmplY3QgbG9jYWwgPSBvYmplY3Q7Ci0JCQkJCQkJCXdoaWxlKChsb2NhbCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKQotCQkJCQkJCQkJCSYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpbG9jYWwpLmdldE93bmVyKCkhPSBudWxsKXsKLQkJCQkJCQkJCWlmKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpbG9jYWwpLmdldE93bmVyKCkKLQkJCQkJCQkJCQkJLmVxdWFscyhlZGl0b3JFbGVtZW50KSl7Ci0JCQkJCQkJCQkJcmVmcmVzaEVkaXRvcnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlsb2NhbCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpbG9jYWwpLmdldE93bmVyKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9ZWxzZSBpZihlZGl0b3JFbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCUNvbGxlY3Rpb24gYyA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpZWRpdG9yRWxlbWVudCkuZ2V0Q2hpbGRyZW4oZWRpdG9yRWxlbWVudCk7Ci0JCQkJCQkJaWYoYyAhPSBudWxsICYmIGMuY29udGFpbnMob2JqZWN0KSl7Ci0JCQkJCQkJCXJlZnJlc2hFZGl0b3JzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBDbG9zZSBlZGl0b3IgcmVmZXJlbmNlcyBhbmQgcmVmcmVzaCBlZGl0b3JzLgotCQlpbnQgc2l6ZSA9IGNsb3NlRWRpdG9ycy5zaXplKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gbmV3IElFZGl0b3JSZWZlcmVuY2Vbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlyZWZlcmVuY2VzW2ldID0gKElFZGl0b3JSZWZlcmVuY2UpIGNsb3NlRWRpdG9ycy5nZXQoaSk7Ci0JCX0KLQkJd29ya2JlbmNoUGFnZS5jbG9zZUVkaXRvcnMocmVmZXJlbmNlcywgZmFsc2UpOwotCQlyZWZlcmVuY2VzID0gbnVsbDsKLQkJCi0JCXNpemUgPSByZWZyZXNoRWRpdG9ycy5zaXplKCk7Ci0JCS8vSUVkaXRvclJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgSUVkaXRvclJlZmVyZW5jZVtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gKElFZGl0b3JSZWZlcmVuY2UpIHJlZnJlc2hFZGl0b3JzLmdldChpKTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZihlZGl0b3IgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IgKXsKLQkJCQkoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcillZGl0b3IpLnJlZnJlc2hEaWFncmFtKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzaG93UHJvYmxlbXNWaWV3KCkgewotIAkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIKLQkJLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkgIT0gbnVsbCAmJgotCQkJCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpICE9IG51bGwpIHsKLQkJCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJCUlWaWV3UGFydCB2aWV3ID0gcGFnZS5maW5kVmlldyhJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcpOwotCQkJCQkJaWYgKHZpZXcgPT0gbnVsbCkgewotCQkJCQkJCXBhZ2Uuc2hvd1ZpZXcoSVBhZ2VMYXlvdXQuSURfUFJPQkxFTV9WSUVXLCBudWxsLCBJV29ya2JlbmNoUGFnZS5WSUVXX1ZJU0lCTEUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gY291bGRuJ3Qgb3BlbiB0aGUKLQkJCQkJLy8gcHJvYmxlbSB2aWV3LCB0b28KLQkJCQkJLy8gYmFkLi4KLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL1VJTGF5b3V0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvVUlMYXlvdXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVmZTBjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvVUlMYXlvdXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuRm9ybUNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcExheW91dDsKLQotCi0vKioKLSAqIExheW91dCBIZWxwZXIgZm9yIFVJLiAKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVJTGF5b3V0SGVscGVyIHsKLQotCXByaXZhdGUgc3RhdGljIENvbXBvc2l0ZSBlZGl0b3JDb21wb3NpdGUsIHByZXZpZXdDb21wb3NpdGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBDVGFiRm9sZGVyIHRhYkZvbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZSB0YWJzIGluIGZvcm0gCi0JICogQHBhcmFtIGZvcm0KLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVUYWJzKFNjcm9sbGVkRm9ybSBmb3JtLCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCS8vIGNyZWF0ZSB0YWJmb2xkZXIKLQkJdGFiRm9sZGVyID0gbmV3IENUYWJGb2xkZXIoZm9ybS5nZXRCb2R5KCksIFNXVC5GTEFUIHwgU1dULlRPUCk7Ci0JCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCXRhYkZvbGRlci5zZXRMYXlvdXREYXRhKHRkKTsKLQotCQkvLyBzZXQgdGFiZm9sZGVyIGJhY2tncm91bmQgY29sb3IKLQkJQ29sb3Igc2VsZWN0ZWRDb2xvciA9IHRvb2xraXQuZ2V0Q29sb3JzKCkKLQkJCQkuZ2V0Q29sb3IoRm9ybUNvbG9ycy5TRVBBUkFUT1IpOwotCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uQmFja2dyb3VuZChuZXcgQ29sb3JbXSB7IHNlbGVjdGVkQ29sb3IsCi0JCQkJdG9vbGtpdC5nZXRDb2xvcnMoKS5nZXRCYWNrZ3JvdW5kKCkgfSwgbmV3IGludFtdIHsgNTAgfSk7Ci0KLQkJLy8gY3JlYXRlIGVkaXRvciB0YWIgaXRlbSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgY29tcG9zaXRlCi0JCUNUYWJJdGVtIGVkaXRvckl0ZW0gPSBuZXcgQ1RhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTlVMTCk7Ci0JCWVkaXRvckl0ZW0uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuRURJVE9SX1RFWFQpOwotCQllZGl0b3JDb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCk7Ci0JCWVkaXRvckl0ZW0uc2V0Q29udHJvbChlZGl0b3JDb21wb3NpdGUpOwotCi0JCS8vIGNyZWF0ZSBwcmV2aWV3IHRhYiBpdGVtIGFuZCB0aGUgY29ycmVzcG9uZGluZyBjb21wb3NpdGUKLQkJQ1RhYkl0ZW0gcHJldmlld0l0ZW0gPSBuZXcgQ1RhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTlVMTCk7Ci0JCXByZXZpZXdJdGVtLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LlBSRVZJRVdfUEFHRV9USVRMRSk7Ci0JCXByZXZpZXdDb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCk7Ci0JCXByZXZpZXdJdGVtLnNldENvbnRyb2wocHJldmlld0NvbXBvc2l0ZSk7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IodGFiRm9sZGVyKTsKLQotCQl0b29sa2l0LmFkYXB0KHRhYkZvbGRlciwgdHJ1ZSwgdHJ1ZSk7Ci0KLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbigwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgY29tcG9zaXRlIG9uIHRoZSBmb3JtCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiBAcmV0dXJuCi0JICogCQkJVUkgY29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZSh0YWJGb2xkZXIpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBUYWJsZVdyYXBMYXlvdXQoKSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gZWRpdG9yIGNvbXBvc2l0ZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCVVJIENvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlIGdldEVkaXRvckNvbXBvc2l0ZSgpIHsKLQkJcmV0dXJuIGVkaXRvckNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gcHJldmlldyBjb21wb3NpdGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQlQcmV2aWV3IGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlIGdldFByZXZpZXdDb21wb3NpdGUoKSB7Ci0JCXJldHVybiBwcmV2aWV3Q29tcG9zaXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NDU2NTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIHRoZSBBdXRob3JpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9BYnN0cmFjdEJhc2VWaWV3LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0Fic3RyYWN0QmFzZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiNmU1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0Fic3RyYWN0QmFzZVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuVUlBY3Rpb25EaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIE1ldGhvZCBMaWJyYXJ5IHZpZXdzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCYXNlVmlldyBleHRlbmRzIFNhdmVhYmxlTGlicmFyeVZpZXdQYXJ0Ci0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5Qcm92aWRlciwgSVNlbGVjdGlvblByb3ZpZGVyLAotCQlJTGlicmFyeVNlcnZpY2VMaXN0ZW5lciwgSU1lbnVMaXN0ZW5lciwgSVZpZXdlclByb3ZpZGVyLCBJR290b01hcmtlciB7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlTaGVldFBhZ2UgcHJvcGVydHlTaGVldFBhZ2U7Ci0KLQlwcm90ZWN0ZWQgVUlBY3Rpb25EaXNwYXRjaGVyIGFjdGlvbkRpc3BhdGNoZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JcHJvdGVjdGVkIElMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IgYWN0aW9uQmFyQ29udHJpYnV0b3I7Ci0KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgSVBhcnRMaXN0ZW5lciBwYXJ0TGlzdGVuZXIgPSBuZXcgSVBhcnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlpZiAocGFydCA9PSBBYnN0cmFjdEJhc2VWaWV3LnRoaXMpIHsKLQkJCQloYW5kbGVBY3RpdmF0ZShwYXJ0KTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQl9OwotCQkKLQkvKioKLQkgKiBIYW5kbGVzIHRoZSBhY3RpdmF0aW9uIG9mIHRoaXMgdmlldy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBY3RpdmF0ZShJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCS8vIFNldCB0aGUgcmlnaHQgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgZWRpdGluZyBkb21haW4uCi0JCWVkaXRpbmdEb21haW4uc2V0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotCi0JCS8vIFJlY29tcHV0ZSB0aGUgcmVhZCBvbmx5IHN0YXRlLgotCQlpZiAoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKSAhPSBudWxsKSB7Ci0JCQllZGl0aW5nRG9tYWluLmdldFJlc291cmNlVG9SZWFkT25seU1hcCgpLmNsZWFyKCk7Ci0KLQkJCS8vIFJlZnJlc2ggYW55IGFjdGlvbnMgdGhhdCBtYXkgYmVjb21lIGVuYWJsZWQgb3IgZGlzYWJsZWQuCi0JCQlzZXRTZWxlY3Rpb24oZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfQotCi0JLy8gdGhpcyB3aW5kb3cgbGlzdGVuZXIgaXMgZm9yIG9wZW5pbmcgdGhlIGxpYnJhcnkgd2hlbiB0aGUgCi0JLy8gdmlldyBmaXJzdCBiZWNvbWVzIHZpc2libGUKLQlwcml2YXRlIElXaW5kb3dMaXN0ZW5lciB3aW5kb3dMaXN0ZW5lciA9IG5ldyBJV2luZG93TGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgd2luZG93QWN0aXZhdGVkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpbmRvd0RlYWN0aXZhdGVkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aW5kb3dPcGVuZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJCXdpbmRvdy5nZXRXb3JrYmVuY2goKS5yZW1vdmVXaW5kb3dMaXN0ZW5lcih0aGlzKTsKLQkJCWJvb2xlYW4gaXNWaXNpYmxlID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5pc1BhcnRWaXNpYmxlKEFic3RyYWN0QmFzZVZpZXcudGhpcyk7Ci0JCQlpZiAoaXNWaXNpYmxlKSB7Ci0JCQkJTGlicmFyeVVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLnN0YXJ0dXBPcGVuTGlicmFyeSgpOwotCQkJfSBlbHNlIHsKLQkJCQlMaWJyYXJ5VUlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkTWV0aG9kVmlld1BhcnRMaXN0ZW5lcihnZXRWaWV3SWQoKSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogRGlzcGxheXMgYSBkaWFsb2cgdGhhdCBhc2tzIGlmIGNvbmZsaWN0aW5nIGNoYW5nZXMgc2hvdWxkIGJlIGRpc2NhcmRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkgewotCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfRmlsZUNvbmZsaWN0X2xhYmVsOyAKLQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLl9XQVJOX0ZpbGVDb25mbGljdDsgCi0JCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheVByb21wdCgKLQkJCQl0aXRsZSwgbXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGNoYW5nZWQgcmVzb3VyY2VzIHdoZW4gdGhpcyB2aWV3IGlzIGFjdGl2YXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXQoKTsKLQotCQlhY3Rpb25EaXNwYXRjaGVyID0gbmV3IFVJQWN0aW9uRGlzcGF0Y2hlcih0aGlzKTsKLQotCQkvLyBDcmVhdGUgdGhlIHZpZXdlci4KLQkJY3JlYXRlVmlld2VyKHBhcmVudCk7Ci0KLQkJLy8gQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yLgotCQl0cnkgewotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3IgPSBjcmVhdGVBY3Rpb25CYXJDb250cmlidXRvcigpOwotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3IuaW5pdChnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKSwgZ2V0U2l0ZSgpCi0JCQkJCS5nZXRQYWdlKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0KLQkJLy8gQWRkIGEgc2VsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciBmb3IgdGhlIHZpZXdlci4KLQkJVmlld2VyIHZpZXdlciA9IGdldFZpZXdlcigpOwotCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCWlmIChzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKAotCQkJCQkJCVNlbGVjdGlvbkNoYW5nZWRFdmVudCBzZWxlY3Rpb25DaGFuZ2VkRXZlbnQpIHsKLQkJCQkJCXNldFNlbGVjdGlvbihzZWxlY3Rpb25DaGFuZ2VkRXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKLQkJfQotCi0JCS8vIEFkZCBhIGxpYnJhcnkgc2VydmljZSBsaXN0ZW5lci4KLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcih0aGlzKTsKLQotCQlPYmplY3QgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJc2V0SW5wdXRGb3JWaWV3ZXIobGlicmFyeSk7Ci0JCQlMaWJyYXJ5VUlVdGlsLnVwZGF0ZVNoZWxsVGl0bGUoKTsKLQkJfQotCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKTsKLQkJaWYgKHdvcmtiZW5jaCAhPSBudWxsKSB7Ci0JCQl3b3JrYmVuY2guYWRkV2luZG93TGlzdGVuZXIod2luZG93TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJZWRpdGluZ0RvbWFpbiA9IG1hbmFnZXIuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQkJYWRhcHRlckZhY3RvcnkgPSAoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgZWRpdGluZ0RvbWFpbgotCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJfQotCi0JCUlWaWV3U2l0ZSBzaXRlID0gKElWaWV3U2l0ZSkgdGhpcy5nZXRTaXRlKCk7Ci0JCXNpdGUuc2V0U2VsZWN0aW9uUHJvdmlkZXIodGhpcyk7Ci0JCXNpdGUuZ2V0UGFnZSgpLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZXMgYSBjb250ZXh0IG1lbnUgZm9yIHRoZSB2aWV3ZXIKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udGV4dE1lbnVGb3IoZmluYWwgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKLQkJTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOyAvLyROT04tTkxTLTEkCi0JCWNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY29udGV4dE1lbnUuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotCQljb250ZXh0TWVudS5hZGRNZW51TGlzdGVuZXIodGhpcyk7Ci0JCU1lbnUgbWVudSA9IGNvbnRleHRNZW51LmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOwotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0JCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KGNvbnRleHRNZW51LCB2aWV3ZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXIjbWVudUFib3V0VG9TaG93KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQl0cnkgewotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlVmlldyh0aGlzKTsKLQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyI2dldEVkaXRpbmdEb21haW4oKQotCSAqLwotCXB1YmxpYyBFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlhY3Rpb25EaXNwYXRjaGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNyZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLQkJCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJYWN0aW9uRGlzcGF0Y2hlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2dldEFkYXB0ZXIoQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGtleSkgewotCQlpZiAoa2V5LmVxdWFscyhJR290b01hcmtlci5jbGFzcykpIHsKLQkJCXJldHVybiB0aGlzOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoa2V5KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjZ2V0U2VsZWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBhY3Rpb25EaXNwYXRjaGVyLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjc2V0U2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2V0U2VsZWN0aW9uKHRoaXMsIHNlbGVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uUHJvdmlkZXIgc291cmNlLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlhY3Rpb25EaXNwYXRjaGVyLnNldFNlbGVjdGlvbihzb3VyY2UsIHNlbGVjdGlvbik7Ci0JCVVJQWN0aW9uRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpLnNldFNlbGVjdGlvbihzb3VyY2UsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJc2V0SW5wdXRGb3JWaWV3ZXIobnVsbCk7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCSgoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeVNldChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXNldElucHV0Rm9yVmlld2VyKGxpYnJhcnkpOwotCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQlhY3Rpb25CYXJDb250cmlidXRvci5zZXRBY3RpdmVWaWV3KEFic3RyYWN0QmFzZVZpZXcudGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2NvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoCi0JCS8vIHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCi0JCWdldFNpdGUoKS5nZXRQYWdlKCkucmVtb3ZlUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0KLQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJKChDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYgKGFjdGlvbkJhckNvbnRyaWJ1dG9yLmdldEFjdGl2ZVZpZXcoKSA9PSB0aGlzKSB7Ci0JCQlhY3Rpb25CYXJDb250cmlidXRvci5zZXRBY3RpdmVWaWV3KG51bGwpOwotCQl9Ci0KLQkJaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKLQkJCXByb3BlcnR5U2hlZXRQYWdlLmRpc3Bvc2UoKTsKLQkJfQotCi0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCQlpZiAod29ya2JlbmNoICE9IG51bGwpIHsKLQkJCXdvcmtiZW5jaC5yZW1vdmVXaW5kb3dMaXN0ZW5lcih3aW5kb3dMaXN0ZW5lcik7Ci0JCX0KLQotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIHByb3BlcnR5IHNoZWV0LgotCSAqLwotCXB1YmxpYyBJUHJvcGVydHlTaGVldFBhZ2UgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7Ci0JCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsKSB7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZSA9IG5ldyBQcm9wZXJ0eVNoZWV0UGFnZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBtYWtlQ29udHJpYnV0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsCi0JCQkJCQlJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIsCi0JCQkJCQlJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIpIHsKLQkJCQkJc3VwZXIubWFrZUNvbnRyaWJ1dGlvbnMobWVudU1hbmFnZXIsIHRvb2xCYXJNYW5hZ2VyLAotCQkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJCQkJc3VwZXIuc2V0QWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKLQkJCQkJaWYgKGFjdGlvbkJhckNvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLAotCQkJCQkJCQlhY3Rpb25CYXJzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZQotCQkJCQkuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydHlTaGVldFBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXIjZ290b01hcmtlcihJTWFya2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQkJdHJ5IHsKLQkJCWlmIChtYXJrZXIuZ2V0VHlwZSgpLmVxdWFscyhFVmFsaWRhdG9yLk1BUktFUikpIHsKLQkJCQlTdHJpbmcgdXJpQXR0cmlidXRlID0gbWFya2VyLmdldEF0dHJpYnV0ZSgKLQkJCQkJCUVWYWxpZGF0b3IuVVJJX0FUVFJJQlVURSwgbnVsbCk7Ci0JCQkJaWYgKHVyaUF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVyaUF0dHJpYnV0ZSk7Ci0JCQkJCUVPYmplY3QgZU9iamVjdCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKQotCQkJCQkJCS5nZXRFT2JqZWN0KHVyaSwgdHJ1ZSk7Ci0JCQkJCWlmIChlT2JqZWN0ICE9IG51bGwpIHsKLQkJCQkJCXNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb25zCi0JCQkJCQkJCS5zaW5nbGV0b24oZWRpdGluZ0RvbWFpbi5nZXRXcmFwcGVyKGVPYmplY3QpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBzZWxlY3Rpb24gaW50byB3aGljaGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJZmluYWwgQ29sbGVjdGlvbiB0aGVTZWxlY3Rpb24gPSBjb2xsZWN0aW9uOwotCQlpZiAodGhlU2VsZWN0aW9uICE9IG51bGwgJiYgIXRoZVNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgaXRlbXMgaW4gdGhlIGN1cnJlbnQgY29udGVudCB2aWV3ZXIgb2YKLQkJCQkJLy8gdGhlIGVkaXRvci4KLQkJCQkJVmlld2VyIHZpZXdlciA9IGdldFZpZXdlcigpOwotCQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQkJCXRoZVNlbGVjdGlvbi50b0FycmF5KCkpLCB0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlydW5uYWJsZS5ydW4oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgVmlld2VyIGdldFZpZXdlcigpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdmlld2VyIGluIHRoZSBnaXZlbiBwYXJlbnQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JLyoqCi0JICogQHJldHVybiBhIG5ldyBhY3Rpb25CYXJDb250cmlidXRlcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIGNyZWF0ZUFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbnB1dCBmb3IgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBtb2RlbCBuZXcgaW5wdXQgZm9yIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRJbnB1dEZvclZpZXdlcihPYmplY3QgbW9kZWwpOwotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRWaWV3SWQoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQWJzdHJhY3RMb2NrZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQWJzdHJhY3RMb2NrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q2MDA0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0Fic3RyYWN0TG9ja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TG9ja2VyIHsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0xvY2tlZChPYmplY3Qgc2VsZWN0aW9uKTsgCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0NhdGVnb3J5VHJlZVZpZXdlcldyYXBwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQ2F0ZWdvcnlUcmVlVmlld2VyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjNhZDE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQ2F0ZWdvcnlUcmVlVmlld2VyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci0KLS8qKgotICogQ2hlY2tib3hUcmVlVmlld2VyIHdyYXBwZXIgdGhhdCBkb2VzIG5vdCBjaGVjayBwYXJlbnRzIHdoZW4gYWxsIGNoaWxkcmVuIGFyZSBjaGVja2VkLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeVRyZWVWaWV3ZXJXcmFwcGVyIGV4dGVuZHMKLQkJR3JheWluZ0NoZWNrYm94VHJlZVZpZXdlcldyYXBwZXIgewotCQotCXByb3RlY3RlZCBMaXN0PE9iamVjdD4gZlVzZXJDaGVja2VkU3RhdGVTdG9yZT0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCi0JcHJvdGVjdGVkIFRleHQgdGV4dFdpZGdldDsKLQkKLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDYXRlZ29yeVRyZWVWaWV3ZXJXcmFwcGVyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBoZWlnaHQsCi0JCQlPYmplY3Qgcm9vdE9iamVjdCwKLQkJCUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIHRyZWVDb250ZW50UHJvdmlkZXIsCi0JCQlBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgdHJlZUxhYmVsUHJvdmlkZXIsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzdXBlciAocGFyZW50LCBoZWlnaHQsIHJvb3RPYmplY3QsIHRyZWVDb250ZW50UHJvdmlkZXIsIHRyZWVMYWJlbFByb3ZpZGVyKTsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGRldGVybWluZVNob3VsZEJlV2hpdGVDaGVja2VkKE9iamVjdCB0cmVlRWxlbWVudCkgewotCQlyZXR1cm4gZlVzZXJDaGVja2VkU3RhdGVTdG9yZS5jb250YWlucyh0cmVlRWxlbWVudCk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGRldGVybWluZVNob3VsZEJlQXRMZWFzdEdyYXlDaGVja2VkKE9iamVjdCB0cmVlRWxlbWVudCkgewotCQkvLyBpZiBhbnkgY2hpbGRyZW4gb2YgdHJlZUVsZW1lbnQgYXJlIHN0aWxsIGdyYXktY2hlY2tlZCB0aGVuIHRyZWVFbGVtZW50Ci0JCS8vIG11c3QgcmVtYWluIGdyYXktY2hlY2tlZCBhcyB3ZWxsCi0JCU9iamVjdFtdIGNoaWxkcmVuPSBnZXRUcmVlQ2hpbGRyZW4odHJlZUVsZW1lbnQpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLQkJCWlmIChmQ2hlY2tlZFN0YXRlU3RvcmUuY29udGFpbnMoY2hpbGRyZW5baV0pIHx8IGZVc2VyQ2hlY2tlZFN0YXRlU3RvcmUuY29udGFpbnMoY2hpbGRyZW5baV0pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRUcmVlQ2hlY2tlZChPYmplY3QgdHJlZUVsZW1lbnQsIGJvb2xlYW4gc3RhdGUpIHsKLQkJaWYgKHN0YXRlKSB7Ci0JCQlmVXNlckNoZWNrZWRTdGF0ZVN0b3JlLmFkZCh0cmVlRWxlbWVudCk7Ci0JCX0gZWxzZQotCQkJZlVzZXJDaGVja2VkU3RhdGVTdG9yZS5yZW1vdmUodHJlZUVsZW1lbnQpOwotCQkKLQkJc3VwZXIuc2V0VHJlZUNoZWNrZWQodHJlZUVsZW1lbnQsIHN0YXRlKTsKLQl9Ci0KLQkKLQlwcml2YXRlIFNldDxUcmVlSXRlbT4gZ2V0QWxsVHJlZUl0ZW1zKFRyZWVJdGVtIHRyZWVJdGVtKSB7Ci0JCVNldDxUcmVlSXRlbT4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8VHJlZUl0ZW0+KCk7Ci0JCWlmICh0cmVlSXRlbSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuYWRkKHRyZWVJdGVtKTsKLQkJCVRyZWVJdGVtW10gY2hpbGRyZW4gPSB0cmVlSXRlbS5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCXJlc3VsdC5hZGRBbGwoZ2V0QWxsVHJlZUl0ZW1zKGNoaWxkcmVuW2ldKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlUcmVlSXRlbVtdIGNoaWxkcmVuID0gZlRyZWVWaWV3ZXIuZ2V0VHJlZSgpLmdldEl0ZW1zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcmVzdWx0LmFkZEFsbChnZXRBbGxUcmVlSXRlbXMoY2hpbGRyZW5baV0pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVVcGRhdGVTZWxlY3Rpb24oTGlzdCBpdGVtcykgewotCi0JCS8vIGl0ZXJhdGUgdGhydSBUcmVlSXRlbXMgdG8gZmluZCBzZWxlY3Rpb25zCi0JCUNvbGxlY3Rpb248VHJlZUl0ZW0+IGFsbFRyZWVJdGVtcyA9IGdldEFsbFRyZWVJdGVtcyhudWxsKTsKLQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNoZWNrZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkKLQkJZm9yIChJdGVyYXRvcjxUcmVlSXRlbT4gaXRlciA9IGFsbFRyZWVJdGVtcy5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJVHJlZUl0ZW0gdHJlZUl0ZW0gPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBpdGVtID0gdHJlZUl0ZW0uZ2V0RGF0YSgpOwotCQkJaWYgKGl0ZW1zLmNvbnRhaW5zKFRuZ1V0aWwudW53cmFwKGl0ZW0pKSkgewotCQkJCWNoZWNrZWRJdGVtcy5hZGQoaXRlbSk7Ci0JCQkJLy9SZXBsYWNlIHRoZSBpdGVtcyBpbiB0aGUgY2hlY2tlZCBzdGF0ZSBzdG9yZSB3aXRoIHRob3NlIGZyb20gdGhlIHN1cHBsaWVkIGl0ZW1zCi0JCQkJaWYgKCFmVXNlckNoZWNrZWRTdGF0ZVN0b3JlLmNvbnRhaW5zKGl0ZW0pKQotCQkJCQlmVXNlckNoZWNrZWRTdGF0ZVN0b3JlLmFkZChpdGVtKTsKLQkJCQlpZiAoIWZDaGVja2VkU3RhdGVTdG9yZS5jb250YWlucyhpdGVtKSkKLQkJCQkJZkNoZWNrZWRTdGF0ZVN0b3JlLmFkZChpdGVtKTsKLQkJCQkvLyBwcm9jZWVkIHVwIHRoZSB0cmVlIGVsZW1lbnQgaGllcmFyY2h5Ci0JCQkJT2JqZWN0IHBhcmVudD0gZlRyZWVDb250ZW50UHJvdmlkZXIuZ2V0UGFyZW50KGl0ZW0pOwotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQlhZGRUb0hpZXJhcmNoeVRvQ2hlY2tlZFN0b3JlKHBhcmVudCk7Ci0JCQkJfQotCQkJCQotCQkJfQotCQl9Ci0KLQkJLy9Ob3cgdXBkYXRlIGhpZXJhcmNoaWVzCi0JCUl0ZXJhdG9yPE9iamVjdD4gaXRlciA9IGNoZWNrZWRJdGVtcy5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGl0ZW09IGl0ZXIubmV4dCgpOwotCQkJdXBkYXRlSGllcmFyY2h5KGl0ZW0pOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTZXQ8Q29udGVudENhdGVnb3J5PiBnZXRDaGVja2VkQ29udGVudENhdGVnb3JpZXMoKSB7Ci0JCVNldDxDb250ZW50Q2F0ZWdvcnk+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PENvbnRlbnRDYXRlZ29yeT4oKTsKLQkJU2V0PE9iamVjdD4gY2hlY2tlZEl0ZW1zID0gZ2V0V2hpdGVDaGVja2VkVHJlZUl0ZW1zKCk7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBpdGVyID0gY2hlY2tlZEl0ZW1zLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgaXRlbSA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQkJaWYgKGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5jb250YWlucyhMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4oKENvbnRlbnRDYXRlZ29yeSlpdGVtKSkpIHsKLQkJCQkJcmVzdWx0LmFkZCgoQ29udGVudENhdGVnb3J5KWl0ZW0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKglIYW5kbGVzIHRoZSBzZWxlY3Rpb24gb2YgYW4gaXRlbSBpbiB0aGUgdHJlZSB2aWV3ZXIKLQkgKgotCSAqCUBwYXJhbSBldmVudCBJU2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChmaW5hbCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0VHJlZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQ9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlzZWxlY3RlZEVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChzZWxlY3RlZEVsZW1lbnQpOwotCQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgPT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfSBlbHNlIGlmICh0ZXh0V2lkZ2V0ICE9IG51bGwgJiYgc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkvLyBkaXNwbGF5IHNlbGVjdGVkIGVsZW1lbnQncyBkZXNjcmlwdGlvbgotCQkJCQlTdHJpbmcgYnJpZWZEZXNjID0gKChNZXRob2RFbGVtZW50KSBzZWxlY3RlZEVsZW1lbnQpLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJdGV4dFdpZGdldC5zZXRUZXh0KGJyaWVmRGVzYyAhPSBudWxsID8gYnJpZWZEZXNjIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0V2lkZ2V0KFRleHQgdGV4dFdpZGdldCkgewotCQl0aGlzLnRleHRXaWRnZXQgPSB0ZXh0V2lkZ2V0OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRyZWVJdGVtQ2hlY2tlZChPYmplY3QgdHJlZUVsZW1lbnQsIGJvb2xlYW4gc3RhdGUpIHsKLQkJLy8gdW5jaGVjayBwYXJlbnQgYnV0IG5vdCBzaWJsaW5ncwotCQlpZiAoIXN0YXRlKSB7Ci0JCQlPYmplY3QgcGFyZW50PSBmVHJlZUNvbnRlbnRQcm92aWRlci5nZXRQYXJlbnQodHJlZUVsZW1lbnQpOwotCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJZlVzZXJDaGVja2VkU3RhdGVTdG9yZS5yZW1vdmUocGFyZW50KTsKLQkJCX0KLQkJfQotCQkKLQkJc3VwZXIudHJlZUl0ZW1DaGVja2VkKHRyZWVFbGVtZW50LCBzdGF0ZSk7Ci0JCQotCQkvLyBub3cgY2hlY2sgYWxsIG90aGVyIGluc3RhbmNlcyBvZiB0aGUgZWxlbWVudAotCQlDb2xsZWN0aW9uIGl0ZW1zID0gZ2V0QWxsVHJlZUl0ZW1zKHRyZWVFbGVtZW50KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gaXRlbXMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCXN1cGVyLnRyZWVJdGVtQ2hlY2tlZChpdGVyLm5leHQoKSwgc3RhdGUpOwotCQl9Ci0JCQotCX0KLQkKLQlwcml2YXRlIENvbGxlY3Rpb248T2JqZWN0PiBnZXRBbGxUcmVlSXRlbXMoT2JqZWN0IHRyZWVFbGVtZW50KSB7Ci0JCWlmICh0cmVlRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuPE9iamVjdD5lbXB0eUxpc3QoKTsKLQkJfQotCQkvLyBpdGVyYXRlIHRocnUgVHJlZUl0ZW1zIHRvIGZpbmQgc2VsZWN0aW9ucwotCQlDb2xsZWN0aW9uPFRyZWVJdGVtPiBhbGxUcmVlSXRlbXMgPSBnZXRBbGxUcmVlSXRlbXMobnVsbCk7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCi0JCWZvciAoSXRlcmF0b3I8VHJlZUl0ZW0+IGl0ZXIgPSBhbGxUcmVlSXRlbXMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCVRyZWVJdGVtIHRyZWVJdGVtID0gaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgaXRlbSA9IHRyZWVJdGVtLmdldERhdGEoKTsKLQkJCWlmIChpdGVtICE9IHRyZWVFbGVtZW50ICYmIAotCQkJCQlUbmdVdGlsLnVud3JhcCh0cmVlRWxlbWVudCkuZXF1YWxzKFRuZ1V0aWwudW53cmFwKGl0ZW0pKSkgewotCQkJCXJlc3VsdC5hZGQoaXRlbSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db25maWd1cmF0aW9uVmlldy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db25maWd1cmF0aW9uVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmNlZjFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQ29uZmlndXJhdGlvblZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5JZGVudGl0eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db3B5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5Mb2NhbFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlBlcnNwZWN0aXZlTGlzdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5VSUFjdGlvbkRpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkNvbmZpZ3VyYXRpb25WaWV3RWRpdEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuSUxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5Vmlld0NvcHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kbmQuTGlicmFyeVZpZXdlckRyYWdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkNvbmZpZ3VyYXRpb25MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5DbGlwYm9hcmRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuSFRNTFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogRGlzcGxheXMgdGhlIGNvbnRlbnQgb2YgdGhlIGN1cnJlbnQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0gKiA8cD4KLSAqIFRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gaXMgc2V0IHZpYSB0aGUgQ29uZmlndXJhdGlvbiBjb21ib2JveCBpbiB0aGUgc3lzdGVtCi0gKiB0b29sYmFyLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblZpZXcgZXh0ZW5kcyBBYnN0cmFjdEJhc2VWaWV3IGltcGxlbWVudHMKLQkJSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBUaGUgdmlldyBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX0lEID0gQ29uZmlndXJhdGlvblZpZXcuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBTdHJpbmcgY29uZmlnTmFtZTsKLQotCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCi0JcHJpdmF0ZSBJRG91YmxlQ2xpY2tMaXN0ZW5lciBkb3VibGVDbGlja0xpc3RlbmVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblZpZXcoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0I2luaXQoSVZpZXdTaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdTaXRlIHNpdGUpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmluaXQoc2l0ZSk7Ci0JCWNyZWF0ZUFjdGlvbnMoc2l0ZSk7Ci0JCUxpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVQYXJ0Q29udHJvbChwYXJlbnQpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LAotCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkNPTkZJR1VSQVRJT05fVklFV19DT05URVhUKTsKLQotCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihhZGFwdGVyRmFjdG9yeSwKLQkJCQluZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gKENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGVkaXRpbmdEb21haW4KLQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQotCQkvLyBPcGVuIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JCXNldENvbmZpZ3VyYXRpb24obnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJc2V0SW5wdXRGb3JWaWV3ZXIobnVsbCk7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCSgoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeVNldChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXNldE1ldGhvZENvbmZpZ3VyYXRpb24obnVsbCk7Ci0JCS8vIEFkZCBhIGxpYnJhcnkgY2hhbmdlIGxpc3RlbmVyLgotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyI2xpYnJhcnlDaGFuZ2VkKGludCwKLQkgKiAgICAgIENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjaGFuZ2VkSXRlbXMpIHsKLQkJc3dpdGNoIChvcHRpb24pIHsKLQkJY2FzZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ERUxFVEVEOgotCQkJaWYgKGNoYW5nZWRJdGVtcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGNoYW5nZWRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXQubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQkJCWlmICgoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGVsZW1lbnQpLmdldE5hbWUoKS5lcXVhbHMoCi0JCQkJCQkJCWdldEN1cnJlbnRDb25maWcoKSkpIHsKLQkJCQkJCQlzZXRNZXRob2RDb25maWd1cmF0aW9uKG51bGwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJLy8gQnVnemlsbGEgZGVmZWN0IDE2NDczOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCWNhc2UgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRDogICAgICAgICAgICAgICAgICAgICAgIAotCQkJaWYgKGNoYW5nZWRJdGVtcyAhPSBudWxsKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjaGFuZ2VkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeyAgCi0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXQubmV4dCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsgICAgICAgICAgICAgICAKLQkJCQkJCWlmICgoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGVsZW1lbnQpICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJCQkJLmVxdWFscyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpICAgICAgICAgICAgICAgICAgCi0JCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkpKSB7ICAgICAgICAgICAgICAKLQkJCQkJCQlzZXRDb250ZW50RGVzY3JpcHRpb24oKChNZXRob2RDb25maWd1cmF0aW9uKSBlbGVtZW50KSAgIAotCQkJCQkJCQkJLmdldE5hbWUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IHZpZXdlZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50Q29uZmlnKCkgewotCQlyZXR1cm4gY29uZmlnTmFtZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNzZXRGb2N1cygpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWFjdGlvbkJhckNvbnRyaWJ1dG9yLnNldEFjdGl2ZVZpZXcodGhpcyk7Ci0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0ZWQgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0ZWQuaXNFbXB0eSgpKQotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3IuZGlzYWJsZUdsb2JhbEVkaXRNZW51KCk7Ci0JCWVsc2UKLQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yLmVuYWJsZUdsb2JhbEVkaXRNZW51KCk7Ci0KLQkJaWYgKHRyZWVWaWV3ZXIgIT0gbnVsbCkgewotCQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIGNvbnRyb2xzLgotCQlDb21wb3NpdGUgY29udGVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29udGVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoY29udGVudCk7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIEFkZCBkcmFnLWFuZC1kcm9wIHN1cHBvcnQuCi0JCWludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkU7Ci0JCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10geyBIVE1MVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwKLQkJCQlMb2NhbFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsKLQkJdHJlZVZpZXdlci5hZGREcmFnU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsCi0JCQkJbmV3IExpYnJhcnlWaWV3ZXJEcmFnQWRhcHRlcih0cmVlVmlld2VyKSk7Ci0KLQkJLy8gQWRkIGEgZG91YmxlIGNsaWNrIGxpc3RlbmVyLgotCQlkb3VibGVDbGlja0xpc3RlbmVyID0gbmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpLmhhbmRsZURvdWJsZUNsaWNrRXZlbnQoZXZlbnQpOwotCQkJfQotCQl9OwotCQl0cmVlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIoZG91YmxlQ2xpY2tMaXN0ZW5lcik7Ci0KLQkJY3JlYXRlQ29udGV4dE1lbnVGb3IodHJlZVZpZXdlcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgYWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVBY3Rpb25zKElWaWV3U2l0ZSB2aWV3U2l0ZSkgewotCQlJQWN0aW9uIGVkaXRBY3Rpb24gPSBuZXcgQWN0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbkxhYmVsX2VkaXQpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlVSUFjdGlvbkRpc3BhdGNoZXIuZWRpdENvbmZpZ3VyYXRpb24oY29uZmlnTmFtZSk7Ci0JCQl9Ci0JCX07Ci0JCWVkaXRBY3Rpb24KLQkJCQkuc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdENvbmZpZ3VyYXRpb25fdG9vbHRpcCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc2V0KCkgewotCQkvLyBQcmV2ZW50IG1lbW9yeSBsZWFrLgotCQljb25maWdOYW1lID0gbnVsbDsKLQkJaWYgKGFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElEaXNwb3NhYmxlKSB7Ci0JCQkJKChJRGlzcG9zYWJsZSkgYWRhcHRlckZhY3RvcnkpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJfQotCQllZGl0aW5nRG9tYWluLnNldEFkYXB0ZXJGYWN0b3J5KG51bGwpOwotCQlJQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IHRyZWVWaWV3ZXIuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJY29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCQlJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IHRyZWVWaWV3ZXIuZ2V0TGFiZWxQcm92aWRlcigpOwotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIGVtcHR5U2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLQkJYWN0aW9uRGlzcGF0Y2hlci5zZXRTZWxlY3Rpb24oZW1wdHlTZWxlY3Rpb24pOwotCQlVSUFjdGlvbkRpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKS5zZXRTZWxlY3Rpb24oZW1wdHlTZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGdpdmVuIE1ldGhvZCBDb25maWd1cmF0aW9uIGFzIHRoaXMgdmlld2VyJ3MgaW5wdXQKLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlDb250cm9sIGN0cmwgPSB0aGlzLmdldFZpZXdlcigpLmdldENvbnRyb2woKTsKLQkJaWYgKGN0cmwgPT0gbnVsbCB8fCBjdHJsLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSA9PSBjb25maWcpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyB0aXRsZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbmZpZ05hbWUgPSBjb25maWcuZ2V0TmFtZSgpOwotCQkJSUZpbHRlciBjb25maWdGaWx0ZXIgPSBuZXcgQ29uZmlndXJhdGlvblZpZXdGaWx0ZXIoY29uZmlnLCB0cmVlVmlld2VyKTsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldENvbmZpZ3VyYXRpb25WaWV3X0FkYXB0ZXJGYWN0b3J5KGNvbmZpZ0ZpbHRlcik7Ci0JCQllZGl0aW5nRG9tYWluLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQkJCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXIoY29uZmlnLAotCQkJCQlhZGFwdGVyRmFjdG9yeSkpOwotCQkJdGl0bGUgPSBjb25maWcuZ2V0TmFtZSgpOwotCQl9IGVsc2UgewotCQkJLy8gUHJldmVudCBtZW1vcnkgbGVhay4KLQkJCWNvbmZpZ05hbWUgPSBudWxsOwotCQkJaWYgKGFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJRGlzcG9zYWJsZSkgewotCQkJCQkoKElEaXNwb3NhYmxlKSBhZGFwdGVyRmFjdG9yeSkuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQlhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQl9Ci0JCQllZGl0aW5nRG9tYWluLnNldEFkYXB0ZXJGYWN0b3J5KG51bGwpOwotCQkJSUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSB0cmVlVmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpOwotCQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJY29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCUlCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gdHJlZVZpZXdlci5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIGVtcHR5U2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLQkJCWFjdGlvbkRpc3BhdGNoZXIuc2V0U2VsZWN0aW9uKGVtcHR5U2VsZWN0aW9uKTsKLQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpLnNldFNlbGVjdGlvbihlbXB0eVNlbGVjdGlvbik7Ci0JCX0KLQotCQl0cmVlVmlld2VyLnNldElucHV0KGNvbmZpZyk7Ci0JCXNldENvbnRlbnREZXNjcmlwdGlvbih0aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGlzIHZpZXdlcidzIGlucHV0IHRvIHRoZSBNZXRob2QgQ29uZmlndXJhdGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uKFN0cmluZyBuYW1lKSB7Ci0JCWNvbmZpZ05hbWUgPSBuYW1lOwotCi0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJCWNvbmZpZ05hbWUgPSBjb25maWcuZ2V0TmFtZSgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGNvbmZpZ05hbWUgIT0gbnVsbCkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBjb25maWdOYW1lKTsKLQkJCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJCXNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLmNvbmZpZ05hbWUgPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGRvdWJsZUNsaWNrTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJdHJlZVZpZXdlci5yZW1vdmVEb3VibGVDbGlja0xpc3RlbmVyKGRvdWJsZUNsaWNrTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgQ29uZmlndXJhdGlvblZpZXcgb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uVmlldyBnZXRWaWV3KCkgewotLy8JCXRyeSB7Ci0vLwkJCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0vLwkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLS8vCQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotLy8JCQkJSVZpZXdQYXJ0IHZpZXcgPSBhY3RpdmVQYWdlLmZpbmRWaWV3KFZJRVdfSUQpOwotLy8JCQkJaWYgKHZpZXcgPT0gbnVsbCkgewotLy8JCQkJCXZpZXcgPSBhY3RpdmVQYWdlLnNob3dWaWV3KFZJRVdfSUQpOwotLy8JCQkJfQotLy8JCQkJcmV0dXJuIChDb25maWd1cmF0aW9uVmlldykgdmlldzsKLS8vCQkJfQotLy8KLS8vCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0vLwkJfQotLy8KLS8vCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWJvb2xlYW4gc2hvdyA9IFZpZXdIZWxwZXIuaXNWaWV3SW5DdXJyZW50UGVyc3BlY3RpdmUoVklFV19JRCk7Ci0JCXJldHVybiAoQ29uZmlndXJhdGlvblZpZXcpVmlld0hlbHBlci5maW5kVmlldyhWSUVXX0lELCBzaG93KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNnZXRWaWV3ZXIoKQotCSAqLwotCXB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gdHJlZVZpZXdlcjsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIENvbmZpZ3VyYXRpb25WaWV3QWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcwotCQkJTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQotCQlwcml2YXRlIExpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24gbGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbjsKLQotCQlwdWJsaWMgQ29uZmlndXJhdGlvblZpZXdBY3Rpb25CYXJDb250cmlidXRvcihFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4pIHsKLQkJCXN1cGVyKGVkaXRpbmdEb21haW4pOwotCQkJCi0JCQkvLyBkb24ndCBzaG93IHZhbGlkYXRlIGFjdGlvbgotCQkJLy8KLQkJCXZhbGlkYXRlQWN0aW9uID0gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjaW5pdChJQWN0aW9uQmFycykKLQkJICovCi0JCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQkJSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRTaGFyZWRJbWFnZXMoKTsKLQkJCWNvcHlBY3Rpb24gPSBjcmVhdGVDb3B5QWN0aW9uKCk7Ci0JCQljb3B5QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0NPUFkpKTsKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwKLQkJCQkJY29weUFjdGlvbik7Ci0KLQkJCXZpZXdBY3Rpb25CYXJzID0gYWN0aW9uQmFyczsKLQkJCWNvbmZpZ1ZpZXdFZGl0QWN0aW9uID0gbmV3IENvbmZpZ3VyYXRpb25WaWV3RWRpdEFjdGlvbigKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uTGFiZWxfZWRpdCk7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0JCQkJCSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMub3BlbkVsZW1lbnQiLCAvLyROT04tTkxTLTEkCi0JCQkJCWNvbmZpZ1ZpZXdFZGl0QWN0aW9uKTsKLQkJCWxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24gPSBuZXcgTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbigKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdik7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0JCQkJCUxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24uQUNUSU9OX0lELAotCQkJCQlsaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjYWN0aXZhdGUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCQlhY3RpdmVWaWV3UGFydC5hZGRQcm9wZXJ0eUxpc3RlbmVyKHRoaXMpOwotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlVmlld1BhcnQgaW5zdGFuY2VvZiBJU2VsZWN0aW9uUHJvdmlkZXIgPyAoSVNlbGVjdGlvblByb3ZpZGVyKSBhY3RpdmVWaWV3UGFydAotCQkJCQk6IGFjdGl2ZVZpZXdQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGNvbmZpZ1ZpZXdFZGl0QWN0aW9uKTsKLQkJCXNlbGVjdGlvblByb3ZpZGVyCi0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbik7Ci0JCQljb3B5QWN0aW9uLnNldEVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbik7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoY29weUFjdGlvbik7Ci0JCQl1cGRhdGUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNkZWFjdGl2YXRlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCQlhY3RpdmVWaWV3UGFydC5yZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKHRoaXMpOwotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlVmlld1BhcnQgaW5zdGFuY2VvZiBJU2VsZWN0aW9uUHJvdmlkZXIgPyAoSVNlbGVjdGlvblByb3ZpZGVyKSBhY3RpdmVWaWV3UGFydAotCQkJCQk6IGFjdGl2ZVZpZXdQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJc2VsZWN0aW9uUHJvdmlkZXIKLQkJCQkJLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihjb25maWdWaWV3RWRpdEFjdGlvbik7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlcgotCQkJCQkucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24pOwotCQkJY29weUFjdGlvbi5zZXRFZGl0aW5nRG9tYWluKG51bGwpOwotCQkJc2VsZWN0aW9uUHJvdmlkZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGNvcHlBY3Rpb24pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI3VwZGF0ZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSBhY3RpdmVWaWV3UGFydCBpbnN0YW5jZW9mIElTZWxlY3Rpb25Qcm92aWRlciA/IChJU2VsZWN0aW9uUHJvdmlkZXIpIGFjdGl2ZVZpZXdQYXJ0Ci0JCQkJCTogYWN0aXZlVmlld1BhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uID8gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24KLQkJCQkJOiBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCQkJY29uZmlnVmlld0VkaXRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJCWxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJCWNvcHlBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI3NlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNkaXNhYmxlR2xvYmFsRWRpdE1lbnUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzYWJsZUdsb2JhbEVkaXRNZW51KCkgewotCQkJY29uZmlnVmlld0VkaXRBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjZW5hYmxlR2xvYmFsRWRpdE1lbnUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZW5hYmxlR2xvYmFsRWRpdE1lbnUoKSB7Ci0JCQljb25maWdWaWV3RWRpdEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI21lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCQkvLyBBZGQgb3VyIHN0YW5kYXJkIG1hcmtlcnMuCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiZWRpdCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBBZGQgb3VyIG90aGVyIHN0YW5kYXJkIG1hcmtlci4KLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMtZW5kIikpOyAvLyROT04tTkxTLTEkCi0KLQkJCWFkZEdsb2JhbEFjdGlvbnMobWVudU1hbmFnZXIpOwotCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShjb25maWdWaWV3RWRpdEFjdGlvbikpOwotCQkJaWYgKFBlcnNwZWN0aXZlTGlzdFV0aWwuaXNBdXRob3JpbmdQZXJzcGVjdGl2ZSgpKSB7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKAotCQkJCQkJbGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbikpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNjcmVhdGVDb3B5QWN0aW9uKCkKLQkJICovCi0JCXByb3RlY3RlZCBDb3B5QWN0aW9uIGNyZWF0ZUNvcHlBY3Rpb24oKSB7Ci0JCQlyZXR1cm4gbmV3IExpYnJhcnlWaWV3Q29weUFjdGlvbigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJCXJldHVybiBuZXcgSWRlbnRpdHlDb21tYW5kKHNlbGVjdGlvbik7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlTdHJpbmcgbGlua3MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKElkZW50aXR5Q29tbWFuZCkgY29tbWFuZCkKLQkJCQkJCQkuZ2V0UmVzdWx0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgaXRlbSA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdGVtOwotCQkJCQkJCVN0cmluZyBocmVmID0gUmVzb3VyY2VIZWxwZXIKLQkJCQkJCQkJCS5nZXRVcmwoZSwgbnVsbCwgImh0bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmIChsaW5rcy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJbGlua3MgKz0gU3RyVXRpbC5MSU5FX0ZFRUQ7Ci0JCQkJCQkJfQotCQkJCQkJCWxpbmtzICs9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRMaW5rKGUsIHRydWUsCi0JCQkJCQkJCQkiZmlsZTovLyIgKyBocmVmKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChsaW5rcy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCUNsaXBib2FyZFV0aWwuY29weVRleHRIVE1MVG9DbGlwYm9hcmQobGlua3MpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkFic3RyYWN0QmFzZVZpZXcjY3JlYXRlQWN0aW9uQmFyQ29udHJpYnV0b3IoKQotCSAqLwotCXB1YmxpYyBJTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIGNyZWF0ZUFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgewotCQlyZXR1cm4gbmV3IENvbmZpZ3VyYXRpb25WaWV3QWN0aW9uQmFyQ29udHJpYnV0b3IoZWRpdGluZ0RvbWFpbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkFic3RyYWN0QmFzZVZpZXcjc2V0SW5wdXRGb3JWaWV3ZXIoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElucHV0Rm9yVmlld2VyKE9iamVjdCBtb2RlbCkgewotCQlpZiAoKG1vZGVsID09IG51bGwpIHx8IChtb2RlbCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pKSB7Ci0JCQlzZXRNZXRob2RDb25maWd1cmF0aW9uKChNZXRob2RDb25maWd1cmF0aW9uKSBtb2RlbCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXNldCgpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRWaWV3SWQoKSB7Ci0JCXJldHVybiBWSUVXX0lEOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQ29uZmlndXJhdGlvblZpZXdGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQ29uZmlndXJhdGlvblZpZXdGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVhZWM0ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0NvbmZpZ3VyYXRpb25WaWV3RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25WaWV3RmlsdGVyIGV4dGVuZHMgQ29uZmlndXJhdGlvbkZpbHRlciB7Ci0KLQlwcm90ZWN0ZWQgVmlld2VyIHZpZXdlcjsKLQkKLQlwdWJsaWMgQ29uZmlndXJhdGlvblZpZXdGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIFZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIobWV0aG9kQ29uZmlnKTsKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoZmluYWwgTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAodmlld2VyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0NvbmZpZ3VyYXRpb25WaWV3ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQ29uZmlndXJhdGlvblZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmY5OGU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQ29uZmlndXJhdGlvblZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0vKioKLSAqIERpc3BsYXlzIHRoZSBzZWxlY3RhYmxlIHBsdWctaW5zIGFuZCBwYWNrYWdlcyBvZiBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIGEKLSAqIHRyZWUgdmlld2VyLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uVmlld2VyIGV4dGVuZHMgQ2hlY2tib3hUcmVlVmlld2VyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdHMgdGhlIGdpdmVuIGVsZW1lbnQgaW4gdGhlIHRyZWUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKE9iamVjdCBlbGVtZW50KSB7Ci0JCXN1cGVyLmV4cGFuZFRvTGV2ZWwoZWxlbWVudCwgMCk7Ci0JCVdpZGdldCBjdHJsID0gc3VwZXIuZmluZEl0ZW0oZWxlbWVudCk7Ci0JCWlmIChjdHJsICE9IG51bGwpIHsKLQkJCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpdGVtcy5hZGQoY3RybCk7Ci0JCQlzdXBlci5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCQkJdGhpcy5nZXRUcmVlKCkuc2V0Rm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlZnJlc2hlcyB0aGUgY29udGVudCBvZiB0aGUgdmlld2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goZmluYWwgT2JqZWN0IGVsZW1lbnQsIGZpbmFsIGJvb2xlYW4gdXBkYXRlTGFiZWxzKSB7Ci0JCU9iamVjdFtdIGNoZWNrZWQgPSB0aGlzLmdldENoZWNrZWRFbGVtZW50cygpOwotCQlzdXBlci5yZWZyZXNoKGVsZW1lbnQsIHVwZGF0ZUxhYmVscyk7Ci0JCXRoaXMuc2V0Q2hlY2tlZEVsZW1lbnRzKGNoZWNrZWQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db250ZW50Vmlldy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db250ZW50Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzg4YWI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQ29udGVudFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLkFjdGl2aXR5RGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5Ccm93c2luZ1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuVUlBY3Rpb25EaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5QZXJzcGVjdGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZS5EaWFncmFtSW1hZ2VTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMuSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0Lkh0bWxCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLQotLyoqCi0gKiBUaGUgQ29udGVudCB2aWV3LgotICogPHA+Ci0gKiBEaXNwbGF5cyB0aGUgSFRNTCByZXByZXNlbnRhdGlvbiBvZiBhIE1ldGhvZCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50VmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQotCS8qKgotCSAqIFRoZSB2aWV3IElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfSUQgPSBDb250ZW50Vmlldy5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIEVsZW1lbnRIVE1MVmlld2VyIGNvbnRlbnRWaWV3ZXI7Ci0KLQlwcml2YXRlIE9iamVjdCBkaXNwbGF5ZWRFbGVtZW50OwotCi0JcHJpdmF0ZSBJUGFydExpc3RlbmVyIHBhcnRMaXN0ZW5lciA9IG5ldyBJUGFydExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgQ29udGVudFZpZXcgJiYgcGFydCA9PSBDb250ZW50Vmlldy50aGlzKSB7Ci0JCQkJaGFuZGxlU2VsZWN0aW9uKFVJQWN0aW9uRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpLmdldFNlbGVjdGlvblNvdXJjZSgpLCBVSUFjdGlvbkRpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKQotCQkJCSAgICAgICAgLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQloYW5kbGVTZWxlY3Rpb24oZXZlbnQuZ2V0U291cmNlKCksIGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGlicmFyeUNoYW5nZUxpc3RlbmVyID0gbmV3IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGxpYnJhcnlDaGFuZ2VkKGludCBvcHRpb24sIENvbGxlY3Rpb24gY2hhbmdlZEl0ZW1zKSB7Ci0vLwkJCWlmIChvcHRpb24gPT0gSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTE9BREVECi0vLwkJCQkJfHwgb3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NSRUFURUQpIHsKLS8vCQkJCWlmIChjb250ZW50Vmlld2VyICE9IG51bGwpIHsKLS8vCQkJCQljb250ZW50Vmlld2VyLnNldEh0bWxCdWlsZGVyKG5ldyBIdG1sQnVpbGRlcigpKTsKLS8vCQkJCQljb250ZW50Vmlld2VyLmdldEJyb3dzZXIoKS5yZWRyYXcoKTsKLS8vCQkJCX0KLS8vCQkJfQotCi0JCQlpZiAoY2hhbmdlZEl0ZW1zICE9IG51bGwgJiYgZGlzcGxheWVkRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKGNoYW5nZWRJdGVtcy5jb250YWlucyhkaXNwbGF5ZWRFbGVtZW50KSkgewotCQkJCQlkaXNwbGF5ZWRFbGVtZW50ID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lciBsaWJTdmNMaXN0ZW5lciA9IG5ldyBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCQljb250ZW50Vmlld2VyLmdldEJyb3dzZXIoKS5zZXRVcmwoImFib3V0OmJsYW5rIik7IC8vJE5PTi1OTFMtMSQKLQkJCWRpc3BsYXllZEVsZW1lbnQgPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJY2xlYW51cCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCWNsZWFudXAoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCWNsZWFudXAoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBjbGVhbnVwKCkgewotCQkJaWYgKGNvbnRlbnRWaWV3ZXIgIT0gbnVsbCkgewotCQkJCWNvbnRlbnRWaWV3ZXIuc2V0SHRtbEJ1aWxkZXIobmV3IEh0bWxCdWlsZGVyKCkpOwotCQkJCWNvbnRlbnRWaWV3ZXIuZ2V0QnJvd3NlcigpLnJlZHJhdygpOwotCQkJfQotCQl9Ci0JfTsKLQkKLQkvLyBQYWdlIG5hdmlnYXRpb24gYWN0aW9ucy4KLQlwcml2YXRlIEFjdGlvbiBiYWNrQWN0aW9uOwotCi0JcHJpdmF0ZSBBY3Rpb24gZm9yd2FyZEFjdGlvbjsKLQotCXByaXZhdGUgQWN0aW9uIHN0b3BBY3Rpb247Ci0KLQlwcml2YXRlIEFjdGlvbiByZWZyZXNoQWN0aW9uOwotCi0JcHJpdmF0ZSBBY3Rpb24gcHJpbnRBY3Rpb247Ci0KLQkvLyBBIGhpZGRlbiBjb21wb3NpdGUgdG8gaG9sZCB0aGUgZGlhZ3JhbSB2aWV3ZXIgZm9yIGRpYWdyYW0gaW1hZ2UKLQkvLyBnZW5lcmF0aW9uLgotCXByaXZhdGUgQ29tcG9zaXRlIGRpYWdyYW1WaWV3ZXJIb2xkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb250ZW50VmlldygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQl0cnkgewotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQkJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotCQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCQljb250ZW50Vmlld2VyID0gbmV3IEVsZW1lbnRIVE1MVmlld2VyKHBhcmVudCk7Ci0JCQlkaWFncmFtVmlld2VySG9sZGVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoMSwgMSkpOyAvLyBzaXplCi0JCQkvLyBjYW4ndCBiZQotCQkJLy8gMCwwCi0JCQkvLyBvdGhlcndpc2UKLQkJCS8vIHRoZQotCQkJLy8gZGlhZ3JhbQotCQkJLy8gd2lsbCBub3QKLQkJCS8vIGJlCi0JCQkvLyBwYWludGVkCi0JCQlkaWFncmFtVmlld2VySG9sZGVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJCS8vIENyZWF0ZSB0aGUgcGFnZSBuYXZpZ2F0aW9uIHRvb2wgYnV0dG9ucy4KLQkJCWNyZWF0ZUFjdGlvbnMoKTsKLQotCQkJLy8gQWRkIGEgcGFydCBsaXN0ZW5lciB0byBtb25pdG9yIHBhcnQgYWN0aXZhdGlvbiBhbmQgdXBkYXRlIHRoaXMKLQkJCS8vIHZpZXcKLQkJCS8vIGFzIGFuZCB3aGVuIG5lZWRlZC4KLQkJCWdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLmFkZFBhcnRMaXN0ZW5lcigKLQkJCQkJcGFydExpc3RlbmVyKTsKLQotCQkJZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmFkZFBlcnNwZWN0aXZlTGlzdGVuZXIoCi0JCQkJCW5ldyBJUGVyc3BlY3RpdmVMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHBlcnNwZWN0aXZlQWN0aXZhdGVkKElXb3JrYmVuY2hQYWdlIHBhZ2UsCi0JCQkJCQkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgZGVzYykgewotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgdm9pZCBwZXJzcGVjdGl2ZUNoYW5nZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSwKLQkJCQkJCQkJSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBkZXNjLCBTdHJpbmcgaWQpIHsKLQkJCQkJCQlpZiAoZGVzYy5nZXRJZCgpLmVxdWFscygKLQkJCQkJCQkJCUJyb3dzaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpKSB7Ci0JCQkJCQkJCWlmIChpZAotCQkJCQkJCQkJCS5lcXVhbHMoSVdvcmtiZW5jaFBhZ2UuQ0hBTkdFX0VESVRPUl9BUkVBX1NIT1cpKSB7Ci0JCQkJCQkJCQlwYWdlLnNldEVkaXRvckFyZWFWaXNpYmxlKGZhbHNlKTsKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkJCS5kaXNwbGF5V2FybmluZygKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy53YXJuaW5nRGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5hZGRFZGl0b3JUb1BlcnNwZWN0aXZlV2FybmluZ19tc2cpOyAKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCS8vIEFkZCBzZWxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIHRvIHVwZGF0ZSB0aGlzIHZpZXcgYXMgYW5kIHdoZW4KLQkJCS8vIG5lZWRlZC4KLQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLQkJCQkJc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCi0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmFkZExpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCW1hbmFnZXIuYWRkTGlzdGVuZXIobGlicmFyeUNoYW5nZUxpc3RlbmVyKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE86IERpc3BsYXkgYW4gZXJyb3IgZGlhbG9nLgotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I3NldEZvY3VzCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWNvbnRlbnRWaWV3ZXIuc2V0Rm9jdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNkaXNwb3NlCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW1vdmVMaXN0ZW5lcihsaWJTdmNMaXN0ZW5lcik7Ci0KLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQltYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKGxpYnJhcnlDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQkJVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJCXNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLQkJZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFBhcnRTZXJ2aWNlKCkucmVtb3ZlUGFydExpc3RlbmVyKAotCQkJCXBhcnRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgYWN0aW9ucyBmb3IgdGhpcyB2aWV3LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCWJhY2tBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUJyb3dzZXIgYnJvd3NlciA9IGNvbnRlbnRWaWV3ZXIuZ2V0QnJvd3NlcigpOwotCQkJCWlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCQkJYnJvd3Nlci5iYWNrKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQliYWNrQWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmFja190ZXh0KTsgCi0JCWJhY2tBY3Rpb24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmFja190ZXh0KTsgCi0JCWJhY2tBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9CQUNLKSk7Ci0KLQkJZm9yd2FyZEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gY29udGVudFZpZXdlci5nZXRCcm93c2VyKCk7Ci0JCQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJCQlicm93c2VyLmZvcndhcmQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWZvcndhcmRBY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5mb3J3YXJkX3RleHQpOyAKLQkJZm9yd2FyZEFjdGlvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5mb3J3YXJkX3RleHQpOyAKLQkJZm9yd2FyZEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQlJU2hhcmVkSW1hZ2VzLklNR19UT09MX0ZPUldBUkQpKTsKLQotCQlzdG9wQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlCcm93c2VyIGJyb3dzZXIgPSBjb250ZW50Vmlld2VyLmdldEJyb3dzZXIoKTsKLQkJCQlpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkJCWJyb3dzZXIuc3RvcCgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJc3RvcEFjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN0b3BfdGV4dCk7IAotCQlzdG9wQWN0aW9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN0b3BfdGV4dCk7IAotCQlzdG9wQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSUltYWdlcy5JTUdfREVTQ19TVE9QKTsKLQotCQlyZWZyZXNoQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvLyBCcm93c2VyIGJyb3dzZXIgPSBjb250ZW50Vmlld2VyLmdldEJyb3dzZXIoKTsKLQkJCQkvLyBpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkJLy8gYnJvd3Nlci5yZWZyZXNoKCk7Ci0JCQkJLy8gfQotCi0JCQkJLy8gbmVlZCB0byByZWdlbmVyYXRlIHRoZSBjb250ZW50Ci0JCQkJY29udGVudFZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX07Ci0JCXJlZnJlc2hBY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5yZWZyZXNoX3RleHQpOyAKLQkJcmVmcmVzaEFjdGlvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5yZWZyZXNoX3RleHQpOyAKLQkJcmVmcmVzaEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0RFU0NfUkVGUkVTSCk7Ci0KLQkJcHJpbnRBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWNvbnRlbnRWaWV3ZXIucHJpbnQoKTsKLQkJCX0KLQkJfTsKLQkJcHJpbnRBY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5wcmludF90ZXh0KTsgCi0JCXByaW50QWN0aW9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByaW50X3RleHQpOyAKLQkJcHJpbnRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19ERVNDX1BSSU5UKTsKLQotCQlJQWN0aW9uQmFycyBiYXJzID0gZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCUlUb29sQmFyTWFuYWdlciBtYW5hZ2VyID0gYmFycy5nZXRUb29sQmFyTWFuYWdlcigpOwotCQltYW5hZ2VyLmFkZChiYWNrQWN0aW9uKTsKLQkJbWFuYWdlci5hZGQoZm9yd2FyZEFjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKHN0b3BBY3Rpb24pOwotCQltYW5hZ2VyLmFkZChyZWZyZXNoQWN0aW9uKTsKLQkJbWFuYWdlci5hZGQocHJpbnRBY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzVmlld1Zpc2libGUoKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkKLQkJLmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKGFjdGl2ZVBhZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlJVmlld1BhcnQgdmlldyA9IGFjdGl2ZVBhZ2UuZmluZFZpZXcoZ2V0Vmlld0lkKCkpOwotCQlpZiAodmlldyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGVzIHRoZSBnaXZlbiBzZWxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIExpYnJhcnkgb3IgQ29uZmlndXJhdGlvbiB2aWV3LgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIFRoZSBzZWxlY3Rpb24gaW4gdGhlIExpYnJhcnkgb3IgQ29uZmlndXJhdGlvbiB2aWV3LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNlbGVjdGlvbihPYmplY3Qgc291cmNlLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgIWlzVmlld1Zpc2libGUoKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJT2JqZWN0W10gc2VsZWN0ZWRFbGVtZW50cyA9IHNlbC50b0FycmF5KCk7Ci0JCQlpZiAoc2VsZWN0ZWRFbGVtZW50cyAhPSBudWxsICYmIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID4gMCkgewotCQkJCU9iamVjdCBlbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50c1swXTsKLQkJCQkKLQkJCQkvLyBkb24ndCB1bndyYXAgdGhlIG9iamVjdC4gCi0JCQkJLy8gRm9yIGFjdGl2aXR5LCB3ZSBuZWVkIHRvIHdyYXBwZWQgaXRlbSBwcm92aWRlciB0byBnZXQgdGhlIHN1cHByZXNzIHN0YXR1cy4KLQkJCQkvLyBPYmplY3QgZWxlbWVudCA9IExpYnJhcnlVdGlsLnVud3JhcChzZWxlY3RlZEVsZW1lbnQpOwotCQkJCWlmIChkaXNwbGF5ZWRFbGVtZW50ICE9IG51bGwgJiYgZGlzcGxheWVkRWxlbWVudCA9PSBlbGVtZW50KSB7Ci0JCQkJCWRpc3BsYXllZEVsZW1lbnQgPSBudWxsOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmIChkaXNwbGF5Q29udGVudFBhZ2Uoc291cmNlLCBlbGVtZW50KSkgewotCQkJCQlkaXNwbGF5ZWRFbGVtZW50ID0gZWxlbWVudDsKLQkJCQl9Ci0JCQl9ZWxzZXsKLQkJCQljb250ZW50Vmlld2VyLmdldEJyb3dzZXIoKS5zZXRVcmwoImFib3V0OmJsYW5rIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlkaXNwbGF5ZWRFbGVtZW50ID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQ29uZmlnU291cmNlKE9iamVjdCBzb3VyY2UpIHsKLQkJcmV0dXJuIChzb3VyY2UgIT0gbnVsbCkgJiYgKHNvdXJjZSBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25WaWV3KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGdldExheW91dE1ncigpIHsKLQkJcmV0dXJuIAlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0RWxlbWVudExheW91dE1hbmFnZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaWV3SWQoKSB7Ci0JCXJldHVybiBWSUVXX0lEOwotCX0KLQkKLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgY29udGVudCBwYWdlIGZvciB0aGUgZ2l2ZW4gQ29udGVudEVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIExpYnJhcnkgb3IgQ29uZmlndXJhdGlvbiB2aWV3LgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgc2VsZWN0ZWQgTWV0aG9kIGVsZW1lbnQuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29udGVudCBwYWdlIGlzIGRpc3BsYXllZAotCSAqICAgICAgICAgc3VjY2Vzc2Z1bGx5LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRpc3BsYXlDb250ZW50UGFnZShPYmplY3Qgc291cmNlLCBPYmplY3QgcmF3X2VsZW1lbnQpIHsKLQkJT2JqZWN0IGVsZW1lbnQgPSBMaWJyYXJ5VXRpbC51bndyYXAocmF3X2VsZW1lbnQpOwotCQllbGVtZW50ID0gVmlld0hlbHBlci5oYW5kbGVEYW5nbGluZyhlbGVtZW50KTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWdyID0gbnVsbDsKLQkJYm9vbGVhbiBpc0Jyb3dzaW5nID0gUGVyc3BlY3RpdmVVdGlsCi0JCQkJLmlzQWN0aXZlUGVyc3BlY3RpdmUoQnJvd3NpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCWJvb2xlYW4gaXNDb25maWdTb3VyY2UgPSBpc0NvbmZpZ1NvdXJjZShzb3VyY2UpOwotCi0JCS8vIGlmIGluIGJyb3dzaW5nIGJ1dCB0aGUgc291cmNlIGlzIG5vdCBmcm9tIGNvbmZpZ3J1YXRpb24gdmlldwotCQkvLyBpZ25vcmUgaXQKLQkJaWYgKGlzQnJvd3NpbmcgJiYgIWlzQ29uZmlnU291cmNlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoaXNDb25maWdTb3VyY2UpIHsKLQkJCS8vIEdldCB0aGUgRWxlbWVudCBMYXlvdXQgTWFuYWdlciBmb3IgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLQkJCWxheW91dE1nciA9IGdldExheW91dE1ncigpOwotCQkJaWYgKCBsYXlvdXRNZ3IgPT0gbnVsbCApIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCS8vIEFkZCB0aGUgYWN0aXZpdHkgZGlhZ3JhbSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGRpYWdyYW0gaW1hZ2VzLgotCQkJCi0JCQlTdHJpbmcgbmV3RGlhZ3JhbXMgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKCJQVUJMSVNIX05FV19ESUFHUkFNIik7IC8vJE5PTi1OTFMtMSQKLQkJCUJvb2xlYW4gbmV3RGlhZ3JhbSA9IG5ldyBCb29sZWFuKHRydWUpOwotCQkJaWYobmV3RGlhZ3JhbXMgIT0gbnVsbCAmJiBuZXdEaWFncmFtcy5sZW5ndGgoKSA+IDApewotCQkJCW5ld0RpYWdyYW0gPSBuZXcgQm9vbGVhbihuZXdEaWFncmFtcyk7Ci0JCQl9Ci0JCQlpZihuZXdEaWFncmFtLmJvb2xlYW5WYWx1ZSgpKXsKLQkJCQlEaWFncmFtSW1hZ2VTZXJ2aWNlIGRpYWdyYW1TZXJ2aWNlID0gKERpYWdyYW1JbWFnZVNlcnZpY2UpIGxheW91dE1ncgotCQkJCQkuZ2V0QWN0aXZpdHlEaWFncmFtU2VydmljZSgpOwotCQkJCWlmIChkaWFncmFtU2VydmljZSA9PSBudWxsKSB7Ci0JCQkJCWRpYWdyYW1TZXJ2aWNlID0gbmV3IERpYWdyYW1JbWFnZVNlcnZpY2UoCi0JCQkJCQlkaWFncmFtVmlld2VySG9sZGVyLAotCQkJCQkJbmV3IEZpbGUobGF5b3V0TWdyLmdldFB1Ymxpc2hEaXIoKSkpOwotCQkJCQlkaWFncmFtU2VydmljZS5zZXRDb25maWcobGF5b3V0TWdyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJCWxheW91dE1nci5zZXRBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKGRpYWdyYW1TZXJ2aWNlKTsKLQkJCQl9Ci0vLwkJCQkgRm9yIEFjdGl2aXR5IERldGFpbCBEaWFncmFtIAotCQkJCWJvb2xlYW4gb3B0aW9uID0gTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0UHVibGlzaFVub3BlbkFjdGl2aXR5ZGQoKTsKLQkJCQlkaWFncmFtU2VydmljZS5zZXRQdWJsaXNoZWRVbkNyZWF0ZWRBREQob3B0aW9uKTsKLQkJCQkKLQkJCQkvLyBGb3IgQWN0aXZpdHkgRGlhZ3JhbSAKLQkJCQlvcHRpb24gPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbigpOwotCQkJCWRpYWdyYW1TZXJ2aWNlLnNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKG9wdGlvbik7Ci0JCQl9ZWxzZXsKLS8vCQkJCSBBZGQgdGhlIGFjdGl2aXR5IGRpYWdyYW0gc2VydmljZSB0byBnZW5lcmF0ZSBkaWFncmFtIGltYWdlcy4KLQkJCQlBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIGRpYWdyYW1TZXJ2aWNlID0gKEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UpIGxheW91dE1ncgotCQkJCQkJLmdldEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoKTsKLQkJCQlpZiAoZGlhZ3JhbVNlcnZpY2UgPT0gbnVsbCkgewotCQkJCQlkaWFncmFtU2VydmljZSA9IG5ldyBBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKAotCQkJCQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIsCi0JCQkJCQkJbmV3IEZpbGUobGF5b3V0TWdyLmdldFB1Ymxpc2hEaXIoKSkpOwotCQkJCQlsYXlvdXRNZ3Iuc2V0QWN0aXZpdHlEaWFncmFtU2VydmljZShkaWFncmFtU2VydmljZSk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIEZvciBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSAKLQkJCQlib29sZWFuIG9wdGlvbiA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkKCk7Ci0JCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0UHVibGlzaGVkVW5DcmVhdGVkQUREKG9wdGlvbik7Ci0JCQkJCi0JCQkJLy8gRm9yIEFjdGl2aXR5IERpYWdyYW0gCi0JCQkJb3B0aW9uID0gTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oKTsKLQkJCQlkaWFncmFtU2VydmljZS5zZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihvcHRpb24pOwotCQkJfQotCQkJCi0JCQkKLQkJCQotCQl9Ci0KLQkJY29udGVudFZpZXdlci5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dE1ncik7Ci0JCWNvbnRlbnRWaWV3ZXIuc2hvd0VsZW1lbnRDb250ZW50KHJhd19lbGVtZW50KTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgSFRNTCBjb250ZW50IHBhZ2UgZm9yIGEgTWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIEEgTWV0aG9kIGVsZW1lbnQuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgSFRNTCBjb250ZW50IHBhZ2UgaXMgZGlzcGxheWVkCi0JICogICAgICAgICBzdWNjZXNzZnVsbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzcGxheUhUTUxDb250ZW50UGFnZShPYmplY3QgZWxlbWVudCkgewotCQllbGVtZW50ID0gTGlicmFyeVV0aWwudW53cmFwKGVsZW1lbnQpOwotCQllbGVtZW50ID0gVmlld0hlbHBlci5oYW5kbGVEYW5nbGluZyhlbGVtZW50KTsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJY29udGVudFZpZXdlci5zZXRMYXlvdXRNYW5hZ2VyKG51bGwpOwotCQkJY29udGVudFZpZXdlci5zaG93RWxlbWVudENvbnRlbnQoZWxlbWVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0VsZW1lbnRIVE1MVmlld2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0VsZW1lbnRIVE1MVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ODA5MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9FbGVtZW50SFRNTFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkJyb3dzaW5nTGF5b3V0U2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5IdG1sQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuT3BlbldpbmRvd0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlN0YXR1c1RleHRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5TdGF0dXNUZXh0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuV2luZG93RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi0vKioKLSAqIERpc3BsYXlzIHRoZSBIVE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgTWV0aG9kIGVsZW1lbnQgaW4gYSBTV1QgQnJvd3Nlci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudEhUTUxWaWV3ZXIgewotCi0vLwkvLyBUaGUgZGVmYXVsdCBIVE1MIHdyYXBwZXJzIGZvciBkaXNhYmxpbmcgdGhlICJEaXNwbGF5IFRyZWUgQnJvd3NlciIgbGluawotLy8JLy8gaW4gdGhlIEhUTUwgY29udGVudCBwYWdlcy4KLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTlRFTlRfV1JBUFBFUl9TVEFSVCA9ICI8aHRtbD48aGVhZD4gPG1ldGEgaHR0cC1lcXVpdj1cIkNvbnRlbnQtVHlwZVwiIGNvbnRlbnQ9XCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLThcIj48L2hlYWQ+PHRpdGxlPlJhdGlvbmFsIFVuZmllZCBQcm9jZXNzPC90aXRsZT4iIC8vJE5PTi1OTFMtMSQKLS8vCQkJKyAiPHNjcmlwdCBsYW5ndWFnZT1cImphdmFzY3JpcHRcIj5mdW5jdGlvbiBpbml0KCkgeyBwYXJlbnQub3J5X3RvYz1cImRpc2FibGVcIjsgcGFyZW50LmNvbnRlbnRmcmFtZS5sb2NhdGlvbj1cIiI7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT05URU5UX1dSQVBQRVJfRU5EID0gIlwiOyB9PC9zY3JpcHQ+PC9oZWFkPiIgLy8kTk9OLU5MUy0xJAotLy8JCQkrICI8ZnJhbWVzZXQgcm93cz1cIjEwMCUsKlwiIGZyYW1lYm9yZGVyPVwibm9cIiBib3JkZXI9XCIwXCIgZnJhbWVzcGFjaW5nPVwiMFwiIGlkPVwiY29udGVudGZyYW1lc2V0XCIgbmFtZT1cImNvbnRlbnRmcmFtZXNldFwiPiIgLy8kTk9OLU5MUy0xJAotLy8JCQkrICI8ZnJhbWUgc3JjPVwiYWJvdXQ6YmxhbmtcIiBpZD1cImNvbnRlbnRmcmFtZVwiIG5hbWU9XCJjb250ZW50ZnJhbWVcIiBzY3JvbGxpbmc9XCJhdXRvXCIvPiIgLy8kTk9OLU5MUy0xJAotLy8JCQkrICI8ZnJhbWUgc3JjPVwiYWJvdXQ6YmxhbmtcIiBpZD1cImJsYW5rZnJhbWVcIiBuYW1lPVwiYmxhbmtmcmFtZVwiIG9ubG9hZD1cImluaXQoKVwiLz4iIC8vJE5PTi1OTFMtMSQKLS8vCQkJKyAiPC9mcmFtZXNldD48L2h0bWw+IjsgLy8kTk9OLU5MUy0xJAotCi0vLwkvLyBUaGUgZGVmYXVsdCBIVE1MIHdyYXBwZXJzIGZvciBwcmludGluZyB0aGUgcHJvY2VzcyBjb250ZW50IHBhZ2VzLgotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUFJJTlRfV1JBUFBFUl9TVEFSVCA9IERFRkFVTFRfQ09OVEVOVF9XUkFQUEVSX1NUQVJUCi0vLwkJCSsgInByaW50KCk7IjsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BSSU5UX1dSQVBQRVJfRU5EID0gREVGQVVMVF9DT05URU5UX1dSQVBQRVJfRU5EOwotLy8KLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUklOVF9GSUxFID0gInByaW50Lmh0bWwiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgSFRNTCB3cmFwcGVycyBmb3IgZGlzYWJsaW5nIHRoZSAiRGlzcGxheSBUcmVlIEJyb3dzZXIiIGxpbmsgaW4gdGhlCi0JLy8gSFRNTCBjb250ZW50IHBhZ2VzLgotLy8JcHJpdmF0ZSBTdHJpbmcgY29udGVudFdyYXBwZXJTYXJ0OwotLy8KLS8vCXByaXZhdGUgU3RyaW5nIGNvbnRlbnRXcmFwcGVyRW5kOwotCi0vLwkvLyBUaGUgSFRNTCB3cmFwcGVycyBmb3IgcHJpbnRpbmcgdGhlIEhUTUwgY29udGVudCBwYWdlcy4KLS8vCXByaXZhdGUgU3RyaW5nIHByaW50V3JhcHBlclNhcnQ7Ci0vLwotLy8JcHJpdmF0ZSBTdHJpbmcgcHJpbnRXcmFwcGVyRW5kOwotLy8KLS8vCS8vIFRoZSBidWlsdC1pbiBicm93c2VyIGZvciBwcmludGluZyB0aGUgSFRNTCBwYWdlcy4KLS8vCS8vIGRvbid0IHVzZSBhIHNlY29uZCAKLS8vCXByaXZhdGUgQnJvd3NlciBwcmludEJyb3dzZXI7Ci0KLQlwcm90ZWN0ZWQgQnJvd3NlciBicm93c2VyID0gbnVsbDsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgcGFyZW50OwotCi0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudExvY2F0aW9uID0gbnVsbDsKLQotCS8vIHNhdmUgdGhlIGN1cnJlbnQgdGV4dCBmcm9tIHRoZSBzdGF0dXMgbGlzdGVuZXIKLQkvLyB3ZSBuZWVkIHRoaXMgdG8gb3BlbiBicm93c2VyIHdpdGggdGhpcyB1cmwgCi0JLy8gc2luY2UgdW5kZXIgbGludXggYnJvd3NlciBjYW4ndCBiZSBvcGVuZWQgYXV0b21hdGljYWxseSwgd2hpY2ggaXMgcmVhbGx5IGJhZAotCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRUZXh0ID0gbnVsbDsKLQlwcml2YXRlIEh0bWxCdWlsZGVyIGh0bWxCdWlsZGVyOwotCi0JcHJpdmF0ZSBDdXJzb3Igd2FpdEN1cnNvciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFbGVtZW50SFRNTFZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQlodG1sQnVpbGRlciA9IG5ldyBIdG1sQnVpbGRlcigpOwotCQljcmVhdGVDb250cm9sKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgU1dUIGJyb3dzZXIgY29udHJvbHMgZm9yIHZpZXdpbmcgYW5kIHByaW50aW5nIHRoZSBIVE1MCi0JICogY29udGVudCBwYWdlcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udHJvbCgpIHsKLQkJdHJ5IHsKLQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWJyb3dzZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIfEdyaWREYXRhLkdSQUJfVkVSVElDQUwpKTsKLQkJCWJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihuZXcgTG9jYXRpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBlKSB7Ci0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsb2NhdGlvbiBjaGFuZ2VkIik7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBlKSB7Ci0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsb2NhdGlvbiBjaGFuZ2luZy4uLiIpOwotCQkJCQkvLyBHZXQgdGhlIGN1cnJlbnQgbG9jYXRpb24uCi0JCQkJCVN0cmluZyBsb2NhdGlvbiA9IGdldEVsZW1lbnRVcmwoZS5sb2NhdGlvbik7Ci0JCQkJCWlmICggbG9jYXRpb24gPT0gbnVsbCB8fCBsb2NhdGlvbi5zdGFydHNXaXRoKFJlc291cmNlSGVscGVyLlVSTF9TVFJfSkFWQVNDUklQVCkpCi0JCQkJCXsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlpZiAoaXNMb2NhdGlvbkNoYW5nZWQobG9jYXRpb24pKSB7Ci0JCQkJCQkvLyBTYXZlIHRoZSBjdXJyZW50IGxvY2F0aW9uIGZvciBwcmludGluZyBwdXJwb3Nlcy4KLQkJCQkJCWN1cnJlbnRMb2NhdGlvbiA9IGxvY2F0aW9uOwotCQkJCQkJZ2VuZXJhdGVIdG1sKGN1cnJlbnRMb2NhdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJYnJvd3Nlci5hZGRTdGF0dXNUZXh0TGlzdGVuZXIobmV3IFN0YXR1c1RleHRMaXN0ZW5lcigpCi0JCQl7Ci0JCQkJcHVibGljIHZvaWQgY2hhbmdlZChTdGF0dXNUZXh0RXZlbnQgZXZlbnQpCi0JCQkJewotCQkJCQkvLyBHZXQgdGhlIGN1cnJlbnQgdGV4dC4KLQkJCQkJU3RyaW5nIHRleHQgPSBldmVudC50ZXh0OwotCQkJCQlpZiAodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwKQotCQkJCQl7Ci0JCQkJCQkvLyBTYXZlIHRoZSBjdXJyZW50IHRleHQgZm9yIGFwcGxpY2F0aW9uIGxhdW5jaGluZyBwdXJwb3Nlcy4KLQkJCQkJCWN1cnJlbnRUZXh0ID0gdGV4dDsKLQkJCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJTdGF0dXMgY2hhbmdlZDogIiArIHRleHQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCWJyb3dzZXIuYWRkT3BlbldpbmRvd0xpc3RlbmVyKG5ldyBPcGVuV2luZG93TGlzdGVuZXIoKXsKLQotCQkJCXB1YmxpYyB2b2lkIG9wZW4oV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQkJLy8gaGFuZGxlIG9wZW4gd2luZG93LgotCQkJCQkvLyB3aXRoIG1vemlsbGEgaW4gbGludXgsIG9wZW4gd2luZG93IGRvZXMgbm90IHdvcmsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIk9wZW4gd2luZG93IGV2ZW50OiAiICsgZXZlbnQpOwotCQkJCQkKLQkJCQkJLy8gd2luZG93cyBjYW4gbGF1bmNoIHRoZSBicm93c2VyIHdpdGhvdXQgcHJvYmxlbQotCQkJCQkvLyBsaW51eCBuZWVkcyBtb3JlIGNhcmUKLQkJCQkJaWYgKFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscygid2luMzIiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKQotCQkJCQl7Ci0JCQkJCSAgICBwdWJsaWMgdm9pZCBydW4oKQotCQkJCQkJewotCQkJCQkJCXRyeQotCQkJCQkJCXsKLS8vCQkJCQkJCQkvLyBpZiB0aGUgdXJsIGlzIGEgcmVzb3VyY2Ugd2l0aCByZWxhdGl2ZSBwYXRoLCBmaW5kIHRoZSBhYnNvbHV0ZSBwYXRoCi0vLwkJCQkJCQkJaWYgKCBjdXJyZW50VGV4dC5zdGFydHNXaXRoKCJmaWxlOiIpICkKLS8vCQkJCQkJCQl7Ci0vLwkJCQkJCQkJCS8vIGdldCB0aGUgZmlsZSBwYXRoIGZyb20gdGhlIAotLy8JCQkJCQkJCX0KLQkJCQkJCQkJCQkJCQkJCQkKLS8vCQkJCQkJCQkvLyBvcGVuIGFub3RoZXIgc3d0IGJyb3dzZXIgc2luY2Ugd2UgaGF2ZSBubyAoc2ltcGxlKSB3YXkgb2YgY3JlYXRpbmcgYSBzeXN0ZW0gZGVmYXVsdCBicm93c2VyCi0vLwkJCQkJCQkJLy8gdGhlIEVjbGlwc2UgZ3V5cyBoaWRlIGFsbCB0aGUgZ29vZCBhcGlzIGFzIGludGVybmFsCi0JCQkJCQkJCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKCk7Ci0JCQkJCQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCQkJCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQkJCQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQkJCQkJCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCQkJCQkJCQlCcm93c2VyIHBvcHVwX2Jyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQkJCQkJCQlwb3B1cF9icm93c2VyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USHxHcmlkRGF0YS5HUkFCX0hPUklaT05UQUx8R3JpZERhdGEuR1JBQl9WRVJUSUNBTCkpOwotCQkJCQkJCQlwb3B1cF9icm93c2VyLnNldFVybChjdXJyZW50VGV4dCk7Ci0JCQkJCQkJCQkJCQkJCQkJCi0JCQkJCQkJCXNoZWxsLm9wZW4oKTsKLQotCQkJCQkJCX0KLQkJCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpCi0JCQkJCQkJewotCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfX0pOwotCQkJCi0vLwkJCS8vIGRvbid0IHVzZSBhIHNlcGVyYXRlIGJyb3dzZXIgZm9yIHByaW50aW5nIHNpbmNlIHRoaXMgd2lsbCBsb3NlIHRoZSAKLS8vCQkJLy8gc3RhdGVzIG9mIHRoZSBjdXJyZW50IHBhZ2UsIGZvciBleGFtcGxlLCB0aGUgZXhwYW5kZWQgc2VjdGlvbnMsIGV0Yy4KLS8vCQkJLy8gSmluaHVhIFhpLCAgMy81LzIwMDcKLS8vCQkJLy8gQ3JlYXRlIHRoZSBoaWRkZW4gYnJvd3NlciB1c2VkIGZvciBwcmludGluZyB0aGUgSFRNTCBjb250ZW50Ci0vLwkJCS8vIHBhZ2VzLgotLy8JCQlwcmludEJyb3dzZXIgPSBuZXcgQnJvd3NlcihwYXJlbnQsIFNXVC5OT05FKTsKLS8vCQkJcHJpbnRCcm93c2VyLnNldFNpemUoMSwgMSk7Ci0vLwkJCXByaW50QnJvd3Nlci5zZXRWaXNpYmxlKGZhbHNlKTsKLS8vCi0vLwkJCS8vIExpbnV4OiBUaGVyZSBpcyB1bnVzZWQgc3BhY2UgaW4gcHJldmlldy9icm93c2luZywgd2hpY2ggaXMgaW4gZ3JleS4KLS8vCQkJLy8gdGhpcyBpcyBuZWVkZWQgZm9yIGxpbnV4Ci0vLwkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0vLwkJCWdkLmhlaWdodEhpbnQgPSAxOwotLy8JCQlwcmludEJyb3dzZXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQkKLQkJCQotCQkJLy8gUmVhZCB0aGUgSFRNTCB3cmFwcGVycyBmb3IgZGlzYWJsaW5nIHRoZSAiRGlzcGxheSBUcmVlIEJyb3dzZXIiCi0JCQkvLyBsaW5rIGluIHRoZSBIVE1MIGNvbnRlbnQgcGFnZXMuCi0vLwkJCWNvbnRlbnRXcmFwcGVyU2FydCA9IEhUTUxXcmFwcGVycwotLy8JCQkJCS5nZXRTdHJpbmcoIkNPTlRFTlRfV1JBUFBFUl9TVEFSVCIpOyAvLyROT04tTkxTLTEkCi0vLwkJCWlmIChjb250ZW50V3JhcHBlclNhcnQgPT0gbnVsbCkgewotLy8JCQkJY29udGVudFdyYXBwZXJTYXJ0ID0gREVGQVVMVF9DT05URU5UX1dSQVBQRVJfU1RBUlQ7Ci0vLwkJCX0KLS8vCQkJY29udGVudFdyYXBwZXJFbmQgPSBIVE1MV3JhcHBlcnMuZ2V0U3RyaW5nKCJDT05URU5UX1dSQVBQRVJfRU5EIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJaWYgKGNvbnRlbnRXcmFwcGVyRW5kID09IG51bGwpIHsKLS8vCQkJCWNvbnRlbnRXcmFwcGVyRW5kID0gREVGQVVMVF9DT05URU5UX1dSQVBQRVJfU1RBUlQ7Ci0vLwkJCX0KLQotLy8JCQkvLyBSZWFkIHRoZSBIVE1MIHdyYXBwZXJzIGZvciBwcmludGluZyB0aGUgSFRNTCBjb250ZW50IHBhZ2VzLgotLy8JCQlwcmludFdyYXBwZXJTYXJ0ID0gSFRNTFdyYXBwZXJzLmdldFN0cmluZygiUFJJTlRfV1JBUFBFUl9TVEFSVCIpOyAvLyROT04tTkxTLTEkCi0vLwkJCWlmIChwcmludFdyYXBwZXJTYXJ0ID09IG51bGwpIHsKLS8vCQkJCXByaW50V3JhcHBlclNhcnQgPSBERUZBVUxUX1BSSU5UX1dSQVBQRVJfU1RBUlQ7Ci0vLwkJCX0KLS8vCQkJcHJpbnRXcmFwcGVyRW5kID0gSFRNTFdyYXBwZXJzLmdldFN0cmluZygiUFJJTlRfV1JBUFBFUl9FTkQiKTsgLy8kTk9OLU5MUy0xJAotLy8JCQlpZiAocHJpbnRXcmFwcGVyRW5kID09IG51bGwpIHsKLS8vCQkJCXByaW50V3JhcHBlckVuZCA9IERFRkFVTFRfUFJJTlRfV1JBUFBFUl9FTkQ7Ci0vLwkJCX0KLQotCQkJd2FpdEN1cnNvciA9IHBhcmVudC5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1DdXJzb3IoCi0JCQkJCVNXVC5DVVJTT1JfV0FJVCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlicm93c2VyID0gbnVsbDsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0xvY2F0aW9uQ2hhbmdlZChTdHJpbmcgbG9jYXRpb24pIHsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwgfHwgY3VycmVudExvY2F0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChGaWxlLnNlcGFyYXRvckNoYXIgIT0gJy8nKSB7Ci0JCQlsb2NhdGlvbiA9IGxvY2F0aW9uLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotCQkJU3RyaW5nIG9sZExvY2F0aW9uID0gZ2V0VXJsKGN1cnJlbnRMb2NhdGlvbik7Ci0KLQkJCS8vIFNvbWUgdGltZXMgdGhlIGN1cnJlbnQgVVJMIGlzIGEgZnVsbCBwYXRoLCBzbyBqdXN0IGNvbXBhcmUgdGhlIGVuZC4KLQkJCQotCQkJLy8gIGJ1ZyBpbiBJRTYsIHRoZSBsb2NhdGlvbiBpbiB0aGUgbG9jYXRpb24gY2hhbmdlIGV2ZW50IG1pZ2h0IGJlIHRydW5jYXRlZCBpZiB0aGUgdXJsIGlzIHRvbyBsb25nLCAKLQkJCS8vIGNvdWxkIGJlIHVwIHRvIDE1OSBjaGFyYWN0ZXJzLgotCQkJCi0JCQlyZXR1cm4gb2xkTG9jYXRpb24uaW5kZXhPZihsb2NhdGlvbikgIT0gMDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAhbG9jYXRpb24uZW5kc1dpdGgoY3VycmVudExvY2F0aW9uKQotCQkJCQkmJiAhY3VycmVudExvY2F0aW9uLmVuZHNXaXRoKGxvY2F0aW9uKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgU1dUIGJyb3dzZXIgdGhhdCBkaXNwbGF5cyB0aGUgSFRNTCBjb250ZW50IHBhZ2VzLgotCSAqLwotCXB1YmxpYyBCcm93c2VyIGdldEJyb3dzZXIoKSB7Ci0JCXJldHVybiBicm93c2VyOwotCX0KLQotCS8qKgotCSAqIFNldHMgZm9jdXMgdG8gdGhpcyBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQlicm93c2VyLnNldEZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBIVE1MIEJ1aWxkZXIuCi0JICovCi0JcHVibGljIEh0bWxCdWlsZGVyIGdldEh0bWxCdWlsZGVyKCkgewotCQkKLQkJaWYgKCBodG1sQnVpbGRlciAhPSBudWxsICkgewotCQkJQnJvd3NpbmdMYXlvdXRTZXR0aW5ncy5JTlNUQU5DRS51cGRhdGUoaHRtbEJ1aWxkZXIpOwotCQl9Ci0JCXJldHVybiBodG1sQnVpbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBIVE1MIEJ1aWxkZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SHRtbEJ1aWxkZXIoSHRtbEJ1aWxkZXIgYnVpbGRlcikgewotCQl0aGlzLmh0bWxCdWlsZGVyID0gYnVpbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBFbGVtZW50IExheW91dCBNYW5hZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExheW91dE1hbmFnZXIoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWdyKSB7Ci0JCWh0bWxCdWlsZGVyLnNldExheW91dE1hbmFnZXIobGF5b3V0TWdyKTsKLQl9Ci0KLQotCQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBIVE1MIHJlcHJlc2VudGF0aW9uIGZvciBhIE1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dFbGVtZW50Q29udGVudChPYmplY3QgcmF3X2VsZW1lbnQpIHsKLQotCQlzdGFydFdhaXQoKTsKLQotCQl0cnkgewotCQkJSUVsZW1lbnRMYXlvdXQgbGF5b3V0ID0gbnVsbDsKLQkJCVN0cmluZyBmaWxlX3VybCA9ICJhYm91dDpibGFuayI7IC8vJE5PTi1OTFMtMSQKLQkJCU9iamVjdCBlbGVtZW50ID0gTGlicmFyeVV0aWwudW53cmFwKHJhd19lbGVtZW50KTsKLQkJCWlmICggcmF3X2VsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIgKSB7Ci0JCQkJQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKXJhd19lbGVtZW50OwotCQkJCU9iamVjdCBwcm9jID0gd3JhcHBlci5nZXRUb3BJdGVtKCk7Ci0JCQkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBwcm9jIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzICkgewotCQkJCQlTdHJpbmcgcGF0aCA9IEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQuZ2V0UGF0aCh3cmFwcGVyKTsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4odG9wSXRlbSk7Ci0JCQkJCWxheW91dCA9IGdldEh0bWxCdWlsZGVyKCkuZ2V0TGF5b3V0TWFuYWdlcigpCi0JCQkJCQkuY3JlYXRlTGF5b3V0KChNZXRob2RFbGVtZW50KWVsZW1lbnQsIAotCQkJCQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKXByb2MsIHBhdGgpOwotCQkJCQlmaWxlX3VybCA9IGdldEh0bWxCdWlsZGVyKCkuZ2VuZXJhdGVIdG1sKGxheW91dCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlmaWxlX3VybCA9IGdldEh0bWxCdWlsZGVyKCkuZ2VuZXJhdGVIdG1sKChNZXRob2RFbGVtZW50KWVsZW1lbnQpOwotCQkJfQotCQkJCi0JCQlpZiAoIGZpbGVfdXJsID09IG51bGwgKSB7Ci0JCQkJZmlsZV91cmwgPSAiYWJvdXQ6YmxhbmsiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkvLyBvbiBsaW51eCwgdGhlIGZpbGUgcGF0aCBuZWVkIHRvIGJlIHNwZWNpZmllZCBhcyBmaWxlLCBvdGhlcndpc2UgaXQgd2lsbCBiZSB0cmVhdGVkIGFzIHVybAotCQkJLy8gYW5kIGNhc3VpZ24gZW5jb2RpbmcvZGVjb2RpbmcgaXNzdWUKLQkJCS8vIExpbnV4OiBDb25maWd1cmF0aW9uIG5hbWVzIGNvbnRhaW5pbmcgYWNjZW50ZWQgY2hhcmFjdGVycyBjYW5ub3QgYmUgYnJvd3NlZC4KLQkJCWVsc2UgewkJCQotCQkJCWlmICghU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJ3aW4zMiIpICYmICFmaWxlX3VybC5zdGFydHNXaXRoKCJmaWxlOi8vIikgJiYgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCSFmaWxlX3VybC5lcXVhbHMoImFib3V0OmJsYW5rIikpIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCWZpbGVfdXJsID0gImZpbGU6Ly8iICsgZmlsZV91cmw7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gQnVnIDIwMTMzNSAtIFJlZnJlc2ggZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgZm9yIHByb2Nlc3MgcGFnZXMgaW4gYnJvd3NpbmcgbW9kZQotCQkJCS8vIG5lZWQgdG8gYXBwZW5kIHRoZSBxdWVyeSBzdHJpbmcKLQkJCQlpZiAoIGxheW91dCBpbnN0YW5jZW9mIEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQgKSB7Ci0JCQkJCWZpbGVfdXJsICs9ICgoQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dClsYXlvdXQpLmdldFF1ZXJ5U3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQkKLQkJCS8vIFNldCB0aGUgY3VycmVudCBsb2NhdGlvbiB0byBhdm9pZCByZS1nZW5lcmF0aW5nIHRoZSBIVE1MIGZpbGUgaW4KLQkJCS8vIHJlc3BvbmQgdG8gYSBsb2NhdGlvbiBjaGFuZ2UuCi0JCQljdXJyZW50TG9jYXRpb24gPSBmaWxlX3VybDsKLQkJCWJyb3dzZXIuc2V0VXJsKGZpbGVfdXJsKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQotCQllbmRXYWl0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSHRtbChTdHJpbmcgdXJsKSB7Ci0JCXN0YXJ0V2FpdCgpOwotCQl0cnkgewotCQkJZ2V0SHRtbEJ1aWxkZXIoKS5nZW5lcmF0ZUh0bWwodXJsKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQotCQllbmRXYWl0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWxlbWVudCBVUkwuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RWxlbWVudFVybChTdHJpbmcgbG9jYXRpb24pIHsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24ubGVuZ3RoKCkgPT0gMAotCQkJCXx8IGxvY2F0aW9uLmVxdWFscygiYWJvdXQ6YmxhbmsiKSAgLy8kTk9OLU5MUy0xJAotCQkJCXx8IGxvY2F0aW9uLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChSZXNvdXJjZUhlbHBlci5VUkxfU1RSX0pBVkFTQ1JJUFQpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWxvY2F0aW9uID0gZ2V0VXJsKGxvY2F0aW9uKTsKLQkJaWYgKGxvY2F0aW9uLmluZGV4T2YoUmVzb3VyY2VIZWxwZXIuTUlTU0lOR19QQUdFU19GT0xERVIpID49IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gbWFrZSBzdXJlIHRoZSB1cmwgaXMgYW4gZWxlbWVudCB1cmwsIGNoZWNrIHRoZSBndWlkCi0JCWlmICggUmVzb3VyY2VIZWxwZXIuZ2V0R3VpZEZyb21GaWxlTmFtZShsb2NhdGlvbikgPT0gbnVsbCApCi0JCXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkwgZm9yIHRoZSBnaXZlbiBsb2NhdGlvbi4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRVcmwoU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCVN0cmluZyBwdWJsaXNoX2RpciA9IGdldEh0bWxCdWlsZGVyKCkuZ2V0UHVibGlzaERpcigpOwotCQlTdHJpbmcgdXJsID0gZml4UGF0aChsb2NhdGlvbik7Ci0JCWludCBpbmRleCA9IHVybC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoCi0JCQkJZml4UGF0aChwdWJsaXNoX2RpcikudG9Mb3dlckNhc2UoKSk7Ci0JCWlmIChpbmRleCA+PSAwKSB7Ci0JCQl1cmwgPSB1cmwuc3Vic3RyaW5nKGluZGV4ICsgcHVibGlzaF9kaXIubGVuZ3RoKCkpOwotCQl9Ci0JCWluZGV4ID0gdXJsLmluZGV4T2YoIiMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQl1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGZpeFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJdHJ5IHsKLQkJCXBhdGggPSBVUkxEZWNvZGVyLmRlY29kZShwYXRoLCAidXRmLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKEZpbGUuc2VwYXJhdG9yQ2hhciAhPSAnLycpIHsKLQkJCQlyZXR1cm4gcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLQkJCX0KLQkJCXJldHVybiBwYXRoOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIHRoZSBjdXJyZW50IEhUTUwgcGFnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludCgpIHsKLQkJYm9vbGVhbiBiID0gdGhpcy5icm93c2VyLmV4ZWN1dGUoIndpbmRvdy5wcmludCgpOyIpOyAvLyROT04tTkxTLTEkCi0vLwkJaWYgKCAhYiApIHsKLS8vCQkJZmluYWwgU3RyaW5nIHByaW50RmlsZSA9IGh0bWxCdWlsZGVyLmdldFB1Ymxpc2hEaXIoKSArIFBSSU5UX0ZJTEU7Ci0vLwkJCWlmIChjdXJyZW50TG9jYXRpb24gIT0gbnVsbCkgewotLy8JCQkJU3RyaW5nQnVmZmVyIHdyYXBwZXJIVE1MID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotLy8JCQkJd3JhcHBlckhUTUwuYXBwZW5kKHByaW50V3JhcHBlclNhcnQpLmFwcGVuZChjdXJyZW50TG9jYXRpb24pCi0vLwkJCQkJCS5hcHBlbmQocHJpbnRXcmFwcGVyRW5kKTsKLS8vCQkJCVN0cmluZyBodG1sVGV4dCA9IHdyYXBwZXJIVE1MLnRvU3RyaW5nKCk7Ci0vLwkJCQlpZiAoRmlsZVV0aWwud3JpdGVVVEY4RmlsZShwcmludEZpbGUsIGh0bWxUZXh0KSkgewotLy8JCQkJCXByaW50QnJvd3Nlci5zZXRVcmwocHJpbnRGaWxlKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRXYWl0KCkgewotCQlwYXJlbnQuZ2V0U2hlbGwoKS5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuZFdhaXQoKSB7Ci0JCXBhcmVudC5nZXRTaGVsbCgpLnNldEN1cnNvcihudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhlIGNvbnRlbnQuCi0JICogPHA+Ci0JICogUmVnZW5lcmF0ZXMgdGhlIGNvbnRlbnQgYmVmb3JlIHJlZnJlc2hpbmcgdGhlIGJyb3dzZXIuCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJZ2VuZXJhdGVIdG1sKGN1cnJlbnRMb2NhdGlvbik7Ci0JCWJyb3dzZXIucmVmcmVzaCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9FbGVtZW50c1ZpZXdDb250ZXh0SGVscC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9FbGVtZW50c1ZpZXdDb250ZXh0SGVscC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWIyMDU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvRWxlbWVudHNWaWV3Q29udGV4dEhlbHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiAKLSAqIENvbnRleHQgSGVscCBmb3IgZWxlbWVudAotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50c1ZpZXdDb250ZXh0SGVscCB7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBoZWxwIG9mIHRoZSBnaXZlbiBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHBhcmFtIHVpQ29tcG9zaXRlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEhlbHAoSVNlbGVjdGlvbiBzZWxlY3Rpb24sIENvbXBvc2l0ZSB1aUNvbXBvc2l0ZSkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3RlZCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkvLyBpZiBtdWx0aXBsZSBpdGVtcyBzZWxlY3RlZCwgb25seSB0aGUgZmlyc3QgaXRlbSdzIGNvbnRleHQgaGVscCB3aWxsCi0JCS8vIGJlIGRpc3BsYXllZAotCQlPYmplY3Qgb2JqID0gc2VsZWN0ZWQuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIFNldHRpbmcgaGVscCBmb3IgdGhlIHNlbGVjdGlvbiBvYmogPSAiICsKLQkJLy8gb2JqKTsKLQkJc2V0SGVscChvYmosIHVpQ29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBoZWxwIG9mIHRoZSBvYmplY3QKLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIHVpQ29tcG9zaXRlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEhlbHAoT2JqZWN0IG9iaiwgQ29tcG9zaXRlIHVpQ29tcG9zaXRlKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlvYmogPSBMaWJyYXJ5VXRpbC51bndyYXAob2JqKTsKLQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgUm9sZSkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFRhc2spKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoCi0JCQkJCXVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBEb21haW4pKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgVG9vbCkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykpIHsKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoCi0JCQkJCQkJdWlDb21wb3NpdGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJCS5zZXRIZWxwKAotCQkJCQkJCXVpQ29tcG9zaXRlLAotCQkJCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvR3JheWluZ0NoZWNrYm94VHJlZVZpZXdlcldyYXBwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvR3JheWluZ0NoZWNrYm94VHJlZVZpZXdlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIwNmYyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0dyYXlpbmdDaGVja2JveFRyZWVWaWV3ZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlVmlld2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZUV4cGFuc2lvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci0KLS8qKgotICogV3JhcHBlciBhcm91bmQgYSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlciB0aGF0IHN1cHBvcnRzIGdyYXlpbmcgb2YKLSAqIHBhcmVudCBlbGVtZW50cyB3aXRoIHBhcnRpYWwgY2hpbGQgc2VsZWN0aW9ucwotICogCi0gKiBjb2RlIHRha2VuIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmphcnBhY2thZ2VyLkNoZWNrYm94VHJlZUFuZExpc3RHcm91cAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgR3JheWluZ0NoZWNrYm94VHJlZVZpZXdlcldyYXBwZXIgaW1wbGVtZW50cyBJQ2hlY2tTdGF0ZUxpc3RlbmVyLCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLCBJVHJlZVZpZXdlckxpc3RlbmVyIHsKLQkKLQlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZlRyZWVDb250ZW50UHJvdmlkZXI7Ci0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBmVHJlZUxhYmVsUHJvdmlkZXI7Ci0JCi0JcHJvdGVjdGVkIExpc3Q8T2JqZWN0PiBmRXhwYW5kZWRUcmVlTm9kZXM9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCXByb3RlY3RlZCBMaXN0PE9iamVjdD4gZkNoZWNrZWRTdGF0ZVN0b3JlPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQlwcm90ZWN0ZWQgTGlzdDxPYmplY3Q+IGZXaGl0ZUNoZWNrZWRUcmVlSXRlbXM9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCXByb3RlY3RlZCBMaXN0PElDaGVja1N0YXRlTGlzdGVuZXI+IGZMaXN0ZW5lcnM9IG5ldyBBcnJheUxpc3Q8SUNoZWNrU3RhdGVMaXN0ZW5lcj4oKTsKLQkKLQkvLyB3aWRnZXQKLQlwcm90ZWN0ZWQgQ2hlY2tib3hUcmVlVmlld2VyIGZUcmVlVmlld2VyOwotCQotCXByb3RlY3RlZCBPYmplY3QgZlJvb3Q7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBHcmF5aW5nQ2hlY2tib3hUcmVlVmlld2VyV3JhcHBlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgaGVpZ2h0LAotCQkJT2JqZWN0IHJvb3RPYmplY3QsCi0JCQlBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciB0cmVlQ29udGVudFByb3ZpZGVyLAotCQkJQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIHRyZWVMYWJlbFByb3ZpZGVyKSB7Ci0JCQotCQlmUm9vdCA9IHJvb3RPYmplY3Q7Ci0JCWZUcmVlQ29udGVudFByb3ZpZGVyID0gdHJlZUNvbnRlbnRQcm92aWRlcjsKLQkJZlRyZWVMYWJlbFByb3ZpZGVyID0gdHJlZUxhYmVsUHJvdmlkZXI7Ci0JCWNyZWF0ZUNvbnRlbnRzKHBhcmVudCwgaGVpZ2h0KTsKLQl9Ci0JCi0JLyoqCi0JICoJTGF5IG91dCBhbmQgaW5pdGlhbGl6ZSBzZWxmJ3MgdmlzdWFsIGNvbXBvbmVudHMuCi0JICoKLQkgKglAcGFyYW0gcGFyZW50IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQotCSAqCUBwYXJhbSB3aWR0aCBpbnQKLQkgKglAcGFyYW0gaGVpZ2h0IGludAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQsIGludCBoZWlnaHQpIHsKLQkJY3JlYXRlVHJlZVZpZXdlcihwYXJlbnQsIGhlaWdodCk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBoZWlnaHQpIHsKLQkJVHJlZSB0cmVlPSBuZXcgVHJlZShwYXJlbnQsIFNXVC5DSEVDSyB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBkYXRhPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJZGF0YS5oZWlnaHRIaW50PSBoZWlnaHQ7Ci0JCXRyZWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlmVHJlZVZpZXdlcj0gbmV3IENoZWNrYm94VHJlZVZpZXdlcih0cmVlKTsKLQkJZlRyZWVWaWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQkJZlRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGZUcmVlQ29udGVudFByb3ZpZGVyKTsKLQkJZlRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihmVHJlZUxhYmVsUHJvdmlkZXIpOwotCQlmVHJlZVZpZXdlci5hZGRUcmVlTGlzdGVuZXIodGhpcyk7Ci0JCWZUcmVlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJZlRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGp1c3QgYmVmb3JlIHRoaXMgd2luZG93IGJlY29tZXMgdmlzaWJsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhYm91dFRvT3BlbigpIHsKLQkJZGV0ZXJtaW5lV2hpdGVDaGVja2VkRGVzY2VuZGVudHMoZlJvb3QpOwotCQljaGVja05ld1RyZWVFbGVtZW50cyhnZXRUcmVlQ2hpbGRyZW4oZlJvb3QpKTsKLQotCQkvL3NlbGVjdCB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgbGlzdAotCQlPYmplY3RbXSBlbGVtZW50cz0gZ2V0VHJlZUNoaWxkcmVuKGZSb290KTsKLQkJT2JqZWN0IHByaW1hcnk9IGVsZW1lbnRzLmxlbmd0aCA+IDAgPyBlbGVtZW50c1swXSA6IG51bGw7Ci0JCWlmIChwcmltYXJ5ICE9IG51bGwpIHsKLQkJCWZUcmVlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihwcmltYXJ5KSk7Ci0JCX0KLQkJZlRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7Ci0JfQotCS8qKgotCSAqCUFkZHMgdGhlIHBhc3NlZCBsaXN0ZW5lciB0byBzZWxmJ3MgY29sbGVjdGlvbiBvZiBjbGllbnRzCi0JICoJdGhhdCBsaXN0ZW4gZm9yIGNoYW5nZXMgdG8gZWxlbWVudCBjaGVja2VkIHN0YXRlcwotCSAqCi0JICoJQHBhcmFtIGxpc3RlbmVyIElDaGVja1N0YXRlTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDaGVja1N0YXRlTGlzdGVuZXIoSUNoZWNrU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgdGhlIHJlY2VpdmVyIGFuZCBhbGwgb2YgaXQncyBhbmNlc3RvcnMgdG8gdGhlIGNoZWNrZWRTdGF0ZVN0b3JlIGlmIHRoZXkKLQkgKiBhcmUgbm90IGFscmVhZHkgdGhlcmUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9IaWVyYXJjaHlUb0NoZWNrZWRTdG9yZShPYmplY3QgdHJlZUVsZW1lbnQpIHsKLQotCQkvLyBpZiB0aGlzIHRyZWUgZWxlbWVudCBpcyBhbHJlYWR5IGdyYXkgdGhlbiBpdHMgYW5jZXN0b3JzIGFsbCBhcmUgYXMgd2VsbAotCQlpZiAoIWZDaGVja2VkU3RhdGVTdG9yZS5jb250YWlucyh0cmVlRWxlbWVudCkpCi0JCQlmQ2hlY2tlZFN0YXRlU3RvcmUuYWRkKHRyZWVFbGVtZW50KTsKLQotCQlPYmplY3QgcGFyZW50PSBmVHJlZUNvbnRlbnRQcm92aWRlci5nZXRQYXJlbnQodHJlZUVsZW1lbnQpOwotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlhZGRUb0hpZXJhcmNoeVRvQ2hlY2tlZFN0b3JlKHBhcmVudCk7Ci0JCWZUcmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUodHJlZUVsZW1lbnQsIHRydWUpOwotCX0KLQotCi0JLyoqCi0JICoJUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGFsbCBjaGlsZHJlbiBvZiB0aGUgcGFzc2VkIHRyZWUgZWxlbWVudAotCSAqCWFyZSBjdXJyZW50bHkgd2hpdGUtY2hlY2tlZAotCSAqCi0JICoJQHJldHVybiBib29sZWFuCi0JICoJQHBhcmFtIHRyZWVFbGVtZW50IGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhcmVBbGxDaGlsZHJlbldoaXRlQ2hlY2tlZChPYmplY3QgdHJlZUVsZW1lbnQpIHsKLQkJT2JqZWN0W10gY2hpbGRyZW49IGdldFRyZWVDaGlsZHJlbih0cmVlRWxlbWVudCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewotCQkJaWYgKCFmV2hpdGVDaGVja2VkVHJlZUl0ZW1zLmNvbnRhaW5zKGNoaWxkcmVuW2ldKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKglJdGVyYXRlcyB0aHJvdWdoIHRoZSBwYXNzZWQgZWxlbWVudHMgd2hpY2ggYXJlIGJlaW5nIHJlYWxpemVkIGZvciB0aGUgZmlyc3QKLQkgKgl0aW1lIGFuZCBjaGVjayBlYWNoIG9uZSBpbiB0aGUgdHJlZSB2aWV3ZXIgYXMgYXBwcm9wcmlhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja05ld1RyZWVFbGVtZW50cyhPYmplY3RbXSBlbGVtZW50cykgewotCQlmb3IgKGludCBpPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHsKLQkJCU9iamVjdCBjdXJyZW50RWxlbWVudD0gZWxlbWVudHNbaV07Ci0JCQlib29sZWFuIGNoZWNrZWQ9IGZDaGVja2VkU3RhdGVTdG9yZS5jb250YWlucyhjdXJyZW50RWxlbWVudCk7Ci0JCQlmVHJlZVZpZXdlci5zZXRDaGVja2VkKGN1cnJlbnRFbGVtZW50LCBjaGVja2VkKTsKLQkJCWZUcmVlVmlld2VyLnNldEdyYXllZCgKLQkJCQljdXJyZW50RWxlbWVudCwKLQkJCQljaGVja2VkICYmICFmV2hpdGVDaGVja2VkVHJlZUl0ZW1zLmNvbnRhaW5zKGN1cnJlbnRFbGVtZW50KSk7Ci0JCX0KLQl9Ci0JLyoqCi0JKglBbiBpdGVtIHdhcyBjaGVja2VkIGluIG9uZSBvZiBzZWxmJ3MgdHdvIHZpZXdzLiAgRGV0ZXJtaW5lIHdoaWNoCi0JKgl2aWV3IHRoaXMgb2NjdXJyZWQgaW4gYW5kIGRlbGVnYXRlIGFwcHJvcHJpYXRlbHkKLQkqCi0JKglAcGFyYW0gZXZlbnQgQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudAotCSovCi0JcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoZmluYWwgQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCi0JCS8vUG90ZW50aWFsbHkgbG9uZyBvcGVyYXRpb24gLSBzaG93IGEgYnVzeSBjdXJzb3IKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZlRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmIChldmVudC5nZXRDaGVja2FibGUoKS5lcXVhbHMoZlRyZWVWaWV3ZXIpKQotCQkJCQl0cmVlSXRlbUNoZWNrZWQoZXZlbnQuZ2V0RWxlbWVudCgpLCBldmVudC5nZXRDaGVja2VkKCkpOwotCi0JCQkJbm90aWZ5Q2hlY2tTdGF0ZUNoYW5nZUxpc3RlbmVycyhldmVudCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIGFuIGl0ZW0ncyBjaGVja2VkIHN0YXRlIGFzIGlmIHRoZSB1c2VyIGhhZCBjbGlja2VkIG9uIGl0Ci0JICogQHBhcmFtIHRyZWVFbGVtZW50Ci0JICogQHBhcmFtIHN0YXRlCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0VHJlZUNoZWNrKE9iamVjdCB0cmVlRWxlbWVudCwgYm9vbGVhbiBzdGF0ZSkgewotCQl0cmVlSXRlbUNoZWNrZWQodHJlZUVsZW1lbnQsIHN0YXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBhc3NlZCB0cmVlIGVsZW1lbnQgc2hvdWxkIGJlCi0JICogYXQgTEVBU1QgZ3JheS1jaGVja2VkLiAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGRvZXMgbm90IGNvbnNpZGVyIHdoZXRoZXIKLQkgKiBpdCBzaG91bGQgYmUgd2hpdGUtY2hlY2tlZCwgc28gYSBzcGVjaWZpZWQgdHJlZSBpdGVtIHdoaWNoIHNob3VsZCBiZQotCSAqIHdoaXRlLWNoZWNrZWQgd2lsbCByZXN1bHQgaW4gYSA8Y29kZT50cnVlPC9jb2RlPiBhbnN3ZXIgZnJvbSB0aGlzIG1ldGhvZC4KLQkgKiBUbyBkZXRlcm1pbmUgd2hldGhlciBhIHRyZWUgaXRlbSBzaG91bGQgYmUgd2hpdGUtY2hlY2tlZCB1c2UgbWV0aG9kCi0JICogI2RldGVybWluZVNob3VsZEJlV2hpdGVDaGVja2VkKE9iamVjdCkuCi0JICoKLQkgKiBAcGFyYW0gdHJlZUVsZW1lbnQgamF2YS5sYW5nLk9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBzZWUgI2RldGVybWluZVNob3VsZEJlV2hpdGVDaGVja2VkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGV0ZXJtaW5lU2hvdWxkQmVBdExlYXN0R3JheUNoZWNrZWQoT2JqZWN0IHRyZWVFbGVtZW50KSB7Ci0JCS8vIGlmIGFueSBjaGlsZHJlbiBvZiB0cmVlRWxlbWVudCBhcmUgc3RpbGwgZ3JheS1jaGVja2VkIHRoZW4gdHJlZUVsZW1lbnQKLQkJLy8gbXVzdCByZW1haW4gZ3JheS1jaGVja2VkIGFzIHdlbGwKLQkJT2JqZWN0W10gY2hpbGRyZW49IGdldFRyZWVDaGlsZHJlbih0cmVlRWxlbWVudCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewotCQkJaWYgKGZDaGVja2VkU3RhdGVTdG9yZS5jb250YWlucyhjaGlsZHJlbltpXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgcGFzc2VkIHRyZWUgaXRlbSBzaG91bGQgYmUKLQkgKiB3aGl0ZS1jaGVja2VkLgotCSAqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIHRyZWVFbGVtZW50IGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZXRlcm1pbmVTaG91bGRCZVdoaXRlQ2hlY2tlZChPYmplY3QgdHJlZUVsZW1lbnQpIHsKLQkJcmV0dXJuIGFyZUFsbENoaWxkcmVuV2hpdGVDaGVja2VkKHRyZWVFbGVtZW50KSAmJiBmQ2hlY2tlZFN0YXRlU3RvcmUuY29udGFpbnModHJlZUVsZW1lbnQpOwotCX0KLQkKLQkvKioKLQkgKglSZWN1cnNpdmVseSBhZGRzIGFwcHJvcHJpYXRlIHRyZWUgZWxlbWVudHMgdG8gdGhlIGNvbGxlY3Rpb24gb2YKLQkgKglrbm93biB3aGl0ZS1jaGVja2VkIHRyZWUgZWxlbWVudHMuCi0JICoKLQkgKglAcGFyYW0gdHJlZUVsZW1lbnQgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRldGVybWluZVdoaXRlQ2hlY2tlZERlc2NlbmRlbnRzKE9iamVjdCB0cmVlRWxlbWVudCkgewotCQkvLyBhbHdheXMgZ28gdGhyb3VnaCBhbGwgY2hpbGRyZW4gZmlyc3Qgc2luY2UgdGhlaXIgd2hpdGUtY2hlY2tlZAotCQkvLyBzdGF0dXNlcyB3aWxsIGJlIG5lZWRlZCB0byBkZXRlcm1pbmUgdGhlIHdoaXRlLWNoZWNrZWQgc3RhdHVzIGZvcgotCQkvLyB0aGlzIHRyZWUgZWxlbWVudAotCQlPYmplY3RbXSBjaGlsZHJlbj0gZ2V0VHJlZUNoaWxkcmVuKHRyZWVFbGVtZW50KTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKQotCQkJZGV0ZXJtaW5lV2hpdGVDaGVja2VkRGVzY2VuZGVudHMoY2hpbGRyZW5baV0pOwotCi0JCS8vIG5vdyBkZXRlcm1pbmUgdGhlIHdoaXRlLWNoZWNrZWQgc3RhdHVzIGZvciB0aGlzIHRyZWUgZWxlbWVudAotCQlpZiAoZGV0ZXJtaW5lU2hvdWxkQmVXaGl0ZUNoZWNrZWQodHJlZUVsZW1lbnQpKQotCQkJc2V0V2hpdGVDaGVja2VkKHRyZWVFbGVtZW50LCB0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2F1c2VzIHRoZSB0cmVlIHZpZXdlciB0byBleHBhbmQgYWxsIGl0cyBpdGVtcwotCSAqLwotCXB1YmxpYyB2b2lkIGV4cGFuZEFsbCgpIHsKLQkJZlRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JfQotCQotCS8qKgotCSAqIENhdXNlcyB0aGUgdHJlZSB2aWV3ZXIgdG8gY29sbGFwc2UgYWxsIGl0cyBpdGVtcwotCSAqLwotCXB1YmxpYyB2b2lkIGNvbGxhcHNlQWxsKCkgewotCQlmVHJlZVZpZXdlci5jb2xsYXBzZUFsbCgpOwotCX0KLQotCS8qKgotCSAqCUFuc3dlciBhIGNvbGxlY3Rpb24gb2YgYWxsIG9mIHRoZSBjaGVja2VkIGVsZW1lbnRzIGluIHRoZSB0cmVlIHBvcnRpb24KLQkgKglvZiBzZWxmCi0JICoKLQkgKglAcmV0dXJuIGphdmEudXRpbC5WZWN0b3IKLQkgKi8KLQlwdWJsaWMgU2V0PE9iamVjdD4gZ2V0QWxsQ2hlY2tlZFRyZWVJdGVtcygpIHsKLQkJcmV0dXJuIG5ldyBIYXNoU2V0PE9iamVjdD4oZkNoZWNrZWRTdGF0ZVN0b3JlKTsKLQl9Ci0JLyoqCi0JICoJQW5zd2VycyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGNoZWNrZWQgYnkgdGhlCi0JICoJdXNlci4KLQkgKgotCSAqCUByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRDaGVja2VkRWxlbWVudENvdW50KCkgewotCQlyZXR1cm4gZkNoZWNrZWRTdGF0ZVN0b3JlLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0cmVlIHRoYXQgZGlzcGxheXMgdGhlIGxpc3QgZm9yIGEgZm9sZGVyCi0JICogCi0JICogQHJldHVybiB0aGUgdHJlZSB1c2VkIHRvIHNob3cgdGhlIGZvbGRlcnMKLQkgKi8KLQlwdWJsaWMgVHJlZSBnZXRUcmVlKCkgewotCQlyZXR1cm4gZlRyZWVWaWV3ZXIuZ2V0VHJlZSgpOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBmaWx0ZXIgdG8gdGhlIHRyZWUgdmlld2VyIGFuZAotCSAqIHRyaWdnZXJzIHJlZmlsdGVyaW5nIGFuZCByZXNvcnRpbmcgb2YgdGhlIGVsZW1lbnRzLgotCSAqCi0JICogQHBhcmFtIGZpbHRlciBhIHZpZXdlciBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUcmVlRmlsdGVyKFZpZXdlckZpbHRlciBmaWx0ZXIpIHsKLQkJZlRyZWVWaWV3ZXIuYWRkRmlsdGVyKGZpbHRlcik7Ci0JfQotCi0JLyoqCi0JICoJTG9naWNhbGx5IGdyYXktY2hlY2sgYWxsIGFuY2VzdG9ycyBvZiB0cmVlSXRlbSBieSBlbnN1cmluZyB0aGF0IHRoZXkKLQkgKglhcHBlYXIgaW4gdGhlIGNoZWNrZWQgdGFibGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBncmF5Q2hlY2tIaWVyYXJjaHkoT2JqZWN0IHRyZWVFbGVtZW50KSB7Ci0KLQkJLy8gaWYgdGhpcyB0cmVlIGVsZW1lbnQgaXMgYWxyZWFkeSBncmF5IHRoZW4gaXRzIGFuY2VzdG9ycyBhbGwgYXJlIGFzIHdlbGwKLQkJaWYgKGZDaGVja2VkU3RhdGVTdG9yZS5jb250YWlucyh0cmVlRWxlbWVudCkpCi0JCQlyZXR1cm47IC8vIG5vIG5lZWQgdG8gcHJvY2VlZCB1cHdhcmRzIGZyb20gaGVyZQotCi0JCWZDaGVja2VkU3RhdGVTdG9yZS5hZGQodHJlZUVsZW1lbnQpOwotCQlpZiAoZGV0ZXJtaW5lU2hvdWxkQmVXaGl0ZUNoZWNrZWQodHJlZUVsZW1lbnQpKSB7Ci0JCQlzZXRXaGl0ZUNoZWNrZWQodHJlZUVsZW1lbnQsIHRydWUpOwotCQl9Ci0JCU9iamVjdCBwYXJlbnQ9IGZUcmVlQ29udGVudFByb3ZpZGVyLmdldFBhcmVudCh0cmVlRWxlbWVudCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCWdyYXlDaGVja0hpZXJhcmNoeShwYXJlbnQpOwotCX0KLQkKLQkvKioKLQkgKglTZXRzIHRoZSBpbml0aWFsIGNoZWNrZWQgc3RhdGUgb2YgdGhlIHBhc3NlZCBlbGVtZW50IHRvIHRydWUsCi0JICoJYXMgd2VsbCBhcyB0byBhbGwgb2YgaXRzIGNoaWxkcmVuIGFuZCBhc3NvY2lhdGVkIGxpc3QgZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsQ2hlY2tUcmVlSXRlbShPYmplY3QgZWxlbWVudCkgewotCQl0cmVlSXRlbUNoZWNrZWQoZWxlbWVudCwgdHJ1ZSk7Ci0JfQotCS8qKgotCSAqCUluaXRpYWxpemVzIHRoaXMgZ3JvdXAncyB2aWV3ZXJzIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGxhaWQgb3V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWZUcmVlVmlld2VyLnNldElucHV0KGZSb290KTsKLQl9Ci0KLQkvKioKLQkgKglOb3RpZmllcyBhbGwgY2hlY2tlZCBzdGF0ZSBsaXN0ZW5lcnMgdGhhdCB0aGUgcGFzc2VkIGVsZW1lbnQgaGFzIGhhZAotCSAqCWl0cyBjaGVja2VkIHN0YXRlIGNoYW5nZWQgdG8gdGhlIHBhc3NlZCBzdGF0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUNoZWNrU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQlJdGVyYXRvciBsaXN0ZW5lcnNFbnVtPSBmTGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChsaXN0ZW5lcnNFbnVtLmhhc05leHQoKSkKLQkJCSAoKElDaGVja1N0YXRlTGlzdGVuZXIpIGxpc3RlbmVyc0VudW0ubmV4dCgpKS5jaGVja1N0YXRlQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JLyoqCi0JICoJUmVtb3ZlcyB0aGUgcGFzc2VkIGxpc3RlbmVyIGZyb20gc2VsZidzIGNvbGxlY3Rpb24gb2YgY2xpZW50cwotCSAqCXRoYXQgbGlzdGVuIGZvciBjaGFuZ2VzIHRvIGVsZW1lbnQgY2hlY2tlZCBzdGF0ZXMKLQkgKgotCSAqCUBwYXJhbSBsaXN0ZW5lciBJQ2hlY2tTdGF0ZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hlY2tTdGF0ZUxpc3RlbmVyKElDaGVja1N0YXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKglIYW5kbGVzIHRoZSBzZWxlY3Rpb24gb2YgYW4gaXRlbSBpbiB0aGUgdHJlZSB2aWV3ZXIKLQkgKgotCSAqCUBwYXJhbSBldmVudCBJU2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChmaW5hbCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLS8vCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRUcmVlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLS8vCQkJcHVibGljIHZvaWQgcnVuKCkgewotLy8JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotLy8JCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudD0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotLy8JCQkJaWYgKHNlbGVjdGVkRWxlbWVudCA9PSBudWxsKSB7Ci0vLwkJCQkJcmV0dXJuOwotLy8JCQkJfSBlbHNlIHsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0pOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdHMgb3IgZGVzZWxlY3QgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgdHJlZSBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSBzZWxlY3Rpb24KLQkgKiBib29sZWFuLiBCZSBzdXJlIHRvIHVwZGF0ZSB0aGUgZGlzcGxheWVkIGZpbGVzIGFzIHdlbGwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxsU2VsZWN0aW9ucyhmaW5hbCBib29sZWFuIHNlbGVjdGlvbikgewotCi0JCS8vUG90ZW50aWFsbHkgbG9uZyBvcGVyYXRpb24gLSBzaG93IGEgYnVzeSBjdXJzb3IKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZlRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXNldFRyZWVDaGVja2VkKGZSb290LCBzZWxlY3Rpb24pOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByb290IG9mIHRoZSB3aWRnZXQgdG8gYmUgbmV3IFJvb3QuIFJlZ2VuZXJhdGUgYWxsIG9mIHRoZSB0YWJsZXMgYW5kIGxpc3RzIGZyb20gdGhpcwotCSAqIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBuZXdSb290IAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvb3QoT2JqZWN0IG5ld1Jvb3QpIHsKLQkJdGhpcy5mUm9vdD0gbmV3Um9vdDsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQkKLQkvKioKLQkgKglTZXRzIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBwYXNzZWQgdHJlZSBlbGVtZW50IGFwcHJvcHJpYXRlbHksIGFuZAotCSAqCWRvIHNvIHJlY3Vyc2l2ZWx5IHRvIGFsbCBvZiBpdHMgY2hpbGQgdHJlZSBlbGVtZW50cyBhcyB3ZWxsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VHJlZUNoZWNrZWQoT2JqZWN0IHRyZWVFbGVtZW50LCBib29sZWFuIHN0YXRlKSB7Ci0KLQkJaWYgKHN0YXRlKSB7Ci0JCQlmQ2hlY2tlZFN0YXRlU3RvcmUuYWRkKHRyZWVFbGVtZW50KTsKLQkJfSBlbHNlCi0JCQlmQ2hlY2tlZFN0YXRlU3RvcmUucmVtb3ZlKHRyZWVFbGVtZW50KTsKLQotCQlzZXRXaGl0ZUNoZWNrZWQodHJlZUVsZW1lbnQsIHN0YXRlKTsKLQkJZlRyZWVWaWV3ZXIuc2V0Q2hlY2tlZCh0cmVlRWxlbWVudCwgc3RhdGUpOwotCQlmVHJlZVZpZXdlci5zZXRHcmF5ZWQodHJlZUVsZW1lbnQsIGZhbHNlKTsKLQotCQkvLyBub3cgbG9naWNhbGx5IGNoZWNrL3VuY2hlY2sgYWxsIGNoaWxkcmVuIGFzIHdlbGwKLQkJT2JqZWN0W10gY2hpbGRyZW49IGdldFRyZWVDaGlsZHJlbih0cmVlRWxlbWVudCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewotCQkJc2V0VHJlZUNoZWNrZWQoY2hpbGRyZW5baV0sIHN0YXRlKTsKLQkJfQotCX0KLQkvKioKLQkgKglTZXRzIHRoZSB0cmVlIHZpZXdlcidzIHByb3ZpZGVycyB0byB0aG9zZSBwYXNzZWQKLQkgKgotCSAqCUBwYXJhbSBjb250ZW50UHJvdmlkZXIgSVRyZWVDb250ZW50UHJvdmlkZXIKLQkgKglAcGFyYW0gbGFiZWxQcm92aWRlciBJTGFiZWxQcm92aWRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyZWVQcm92aWRlcnMoCi0JCUlUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciwKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlmVHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJZlRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQl9Ci0JLyoqCi0JICoJU2V0cyB0aGUgc29ydGVyIHRoYXQgaXMgdG8gYmUgYXBwbGllZCB0byBzZWxmJ3MgdHJlZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmVlU29ydGVyKFZpZXdlclNvcnRlciBzb3J0ZXIpIHsKLQkJZlRyZWVWaWV3ZXIuc2V0U29ydGVyKHNvcnRlcik7Ci0JfQotCS8qKgotCSAqCUFkanVzdHMgdGhlIGNvbGxlY3Rpb24gb2YgcmVmZXJlbmNlcyB0byB3aGl0ZS1jaGVja2VkIHRyZWUgZWxlbWVudHMgYXBwcm9wcmlhdGVseS4KLQkgKgotCSAqCUBwYXJhbSB0cmVlRWxlbWVudCBqYXZhLmxhbmcuT2JqZWN0Ci0JICoJQHBhcmFtIGlzV2hpdGVDaGVja2VkIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRXaGl0ZUNoZWNrZWQoT2JqZWN0IHRyZWVFbGVtZW50LCBib29sZWFuIGlzV2hpdGVDaGVja2VkKSB7Ci0JCWlmIChpc1doaXRlQ2hlY2tlZCkgewotCQkJaWYgKCFmV2hpdGVDaGVja2VkVHJlZUl0ZW1zLmNvbnRhaW5zKHRyZWVFbGVtZW50KSkKLQkJCQlmV2hpdGVDaGVja2VkVHJlZUl0ZW1zLmFkZCh0cmVlRWxlbWVudCk7Ci0JCX0gZWxzZQotCQkJZldoaXRlQ2hlY2tlZFRyZWVJdGVtcy5yZW1vdmUodHJlZUVsZW1lbnQpOwotCX0KLQkvKioKLQkgKglIYW5kbGUgdGhlIGNvbGxhcHNpbmcgb2YgYW4gZWxlbWVudCBpbiBhIHRyZWUgdmlld2VyCi0JICovCi0JcHVibGljIHZvaWQgdHJlZUNvbGxhcHNlZChUcmVlRXhwYW5zaW9uRXZlbnQgZXZlbnQpIHsKLQkJLy8gV2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyB3aXRoIHRoaXMKLQl9Ci0KLQkvKioKLQkgKglIYW5kbGVzIHRoZSBleHBhbnNpb25zaW9uIG9mIGFuIGVsZW1lbnQgaW4gYSB0cmVlIHZpZXdlcgotCSAqLwotCXB1YmxpYyB2b2lkIHRyZWVFeHBhbmRlZChUcmVlRXhwYW5zaW9uRXZlbnQgZXZlbnQpIHsKLQotCQlPYmplY3QgaXRlbT0gZXZlbnQuZ2V0RWxlbWVudCgpOwotCi0JCS8vIEZpcnN0IHNlZSBpZiB0aGUgY2hpbGRyZW4gbmVlZCB0byBiZSBnaXZlbiB0aGVpciBjaGVja2VkIHN0YXRlIGF0IGFsbC4gIElmIHRoZXkndmUKLQkJLy8gYWxyZWFkeSBiZWVuIHJlYWxpemVkIHRoZW4gdGhpcyB3b24ndCBiZSBuZWNlc3NhcnkKLQkJaWYgKCFmRXhwYW5kZWRUcmVlTm9kZXMuY29udGFpbnMoaXRlbSkpIHsKLQkJCWZFeHBhbmRlZFRyZWVOb2Rlcy5hZGQoaXRlbSk7Ci0JCQljaGVja05ld1RyZWVFbGVtZW50cyhnZXRUcmVlQ2hpbGRyZW4oaXRlbSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIENhbGxiYWNrIHRoYXQncyBpbnZva2VkIHdoZW4gdGhlIGNoZWNrZWQgc3RhdHVzIG9mIGFuIGl0ZW0gaW4gdGhlIHRyZWUKLQkgKiAgaXMgY2hhbmdlZCBieSB0aGUgdXNlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmVlSXRlbUNoZWNrZWQoT2JqZWN0IHRyZWVFbGVtZW50LCBib29sZWFuIHN0YXRlKSB7Ci0KLQkJLy8gcmVjdXJzaXZlbHkgYWRqdXN0IGFsbCBjaGlsZCB0cmVlIGVsZW1lbnRzIGFwcHJvcHJpYXRlbHkKLQkJc2V0VHJlZUNoZWNrZWQodHJlZUVsZW1lbnQsIHN0YXRlKTsKLQotCQlPYmplY3QgcGFyZW50PSBmVHJlZUNvbnRlbnRQcm92aWRlci5nZXRQYXJlbnQodHJlZUVsZW1lbnQpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gbm93IHVwZGF0ZSB1cHdhcmRzIGluIHRoZSB0cmVlIGhpZXJhcmNoeSAKLQkJaWYgKHN0YXRlKQotCQkJZ3JheUNoZWNrSGllcmFyY2h5KHBhcmVudCk7Ci0JCWVsc2UKLQkJCXVuZ3JheUNoZWNrSGllcmFyY2h5KHBhcmVudCk7Ci0KLQkJdXBkYXRlSGllcmFyY2h5KHRyZWVFbGVtZW50KTsKLQl9Ci0JLyoqCi0JICoJTG9naWNhbGx5IHVuLWdyYXktY2hlY2sgYWxsIGFuY2VzdG9ycyBvZiB0cmVlSXRlbSBpZmYgYXBwcm9wcmlhdGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdW5ncmF5Q2hlY2tIaWVyYXJjaHkoT2JqZWN0IHRyZWVFbGVtZW50KSB7Ci0JCWlmICghZGV0ZXJtaW5lU2hvdWxkQmVBdExlYXN0R3JheUNoZWNrZWQodHJlZUVsZW1lbnQpKQotCQkJZkNoZWNrZWRTdGF0ZVN0b3JlLnJlbW92ZSh0cmVlRWxlbWVudCk7Ci0KLQkJT2JqZWN0IHBhcmVudD0gZlRyZWVDb250ZW50UHJvdmlkZXIuZ2V0UGFyZW50KHRyZWVFbGVtZW50KTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJdW5ncmF5Q2hlY2tIaWVyYXJjaHkocGFyZW50KTsKLQl9Ci0JLyoqCi0JICoJU2V0cyB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBzZWxmIGFuZCBhbGwgYW5jZXN0b3JzIGFwcHJvcHJpYXRlbHkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVIaWVyYXJjaHkoT2JqZWN0IHRyZWVFbGVtZW50KSB7Ci0KLQkJYm9vbGVhbiB3aGl0ZUNoZWNrZWQ9IGRldGVybWluZVNob3VsZEJlV2hpdGVDaGVja2VkKHRyZWVFbGVtZW50KTsKLQkJYm9vbGVhbiBzaG91bGRCZUF0TGVhc3RHcmF5PSBkZXRlcm1pbmVTaG91bGRCZUF0TGVhc3RHcmF5Q2hlY2tlZCh0cmVlRWxlbWVudCk7Ci0KLQkJZlRyZWVWaWV3ZXIuc2V0Q2hlY2tlZCh0cmVlRWxlbWVudCwgd2hpdGVDaGVja2VkIHx8IHNob3VsZEJlQXRMZWFzdEdyYXkpOwotCQlzZXRXaGl0ZUNoZWNrZWQodHJlZUVsZW1lbnQsIHdoaXRlQ2hlY2tlZCk7Ci0JCWlmICh3aGl0ZUNoZWNrZWQpCi0JCQlmVHJlZVZpZXdlci5zZXRHcmF5ZWQodHJlZUVsZW1lbnQsIGZhbHNlKTsKLQkJZWxzZQotCQkJZlRyZWVWaWV3ZXIuc2V0R3JheWVkKHRyZWVFbGVtZW50LCBzaG91bGRCZUF0TGVhc3RHcmF5KTsKLQotCQkvLyBwcm9jZWVkIHVwIHRoZSB0cmVlIGVsZW1lbnQgaGllcmFyY2h5Ci0JCU9iamVjdCBwYXJlbnQ9IGZUcmVlQ29udGVudFByb3ZpZGVyLmdldFBhcmVudCh0cmVlRWxlbWVudCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJdXBkYXRlSGllcmFyY2h5KHBhcmVudCk7Ci0JCQlpZiAod2hpdGVDaGVja2VkIHx8IHNob3VsZEJlQXRMZWFzdEdyYXkpCi0JCQkJZlRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShwYXJlbnQsIHRydWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBydW5uaW5nIHRoZSBnaXZlbiBlbGVtZW50cyB0aHJvdWdoIHRoZSBmaWx0ZXJzLgotCSAqCi0JICogQHBhcmFtIGVsZW1lbnRzIHRoZSBlbGVtZW50cyB0byBmaWx0ZXIKLQkgKiBAcmV0dXJuIG9ubHkgdGhlIGVsZW1lbnRzIHdoaWNoIGFsbCBmaWx0ZXJzIGFjY2VwdAotCSAqLwotCXByb3RlY3RlZCBPYmplY3RbXSBmaWx0ZXIoVmlld2VyRmlsdGVyW10gZmlsdGVycywgT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJaWYgKGZpbHRlcnMgIT0gbnVsbCkgewotCQkJQXJyYXlMaXN0PE9iamVjdD4gZmlsdGVyZWQgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oZWxlbWVudHMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlib29sZWFuIGFkZCA9IHRydWU7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmaWx0ZXJzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWFkZCA9IGZpbHRlcnNbal0uc2VsZWN0KGZUcmVlVmlld2VyLCBudWxsLCBlbGVtZW50c1tpXSk7Ci0JCQkJCWlmICghYWRkKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChhZGQpCi0JCQkJCWZpbHRlcmVkLmFkZChlbGVtZW50c1tpXSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmlsdGVyZWQudG9BcnJheSgpOwotCQl9Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0VHJlZUNoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBmaWx0ZXIoZlRyZWVWaWV3ZXIuZ2V0RmlsdGVycygpLCBmVHJlZUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbihlbGVtZW50KSk7Ci0vLwkJcmV0dXJuIGZUcmVlQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTZXQ8T2JqZWN0PiBnZXRXaGl0ZUNoZWNrZWRUcmVlSXRlbXMoKSB7Ci0JCXJldHVybiBuZXcgSGFzaFNldDxPYmplY3Q+KGZXaGl0ZUNoZWNrZWRUcmVlSXRlbXMpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdGhlIHNlbGVjdGlvbnMgb2YgdGhlIHRyZWUgZWxlbWVudHMgaW4gaXRlbXMgdG8gcmVmbGVjdCB0aGUgbmV3Ci0JICogc2VsZWN0aW9ucyBwcm92aWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gaXRlbXMgd2l0aCBrZXlzIG9mIE9iamVjdCAodGhlIHRyZWUgZWxlbWVudCkgYW5kIHZhbHVlcyBvZiBMaXN0ICh0aGUgc2VsZWN0ZWQKLQkgKiBsaXN0IGVsZW1lbnRzKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVTZWxlY3Rpb25zKGZpbmFsIExpc3QgaXRlbXMpIHsKLQotCQkvL1BvdGVudGlhbGx5IGxvbmcgb3BlcmF0aW9uIC0gc2hvdyBhIGJ1c3kgY3Vyc29yCi0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGZUcmVlVmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlmRXhwYW5kZWRUcmVlTm9kZXMuY2xlYXIoKTsKLQkJCQloYW5kbGVVcGRhdGVTZWxlY3Rpb24oaXRlbXMpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVVcGRhdGVTZWxlY3Rpb24oTGlzdCBpdGVtcykgewotCQlJdGVyYXRvciBpdGVyYXRvcj0gaXRlbXMuaXRlcmF0b3IoKTsKLQotCQkvL1VwZGF0ZSB0aGUgc3RvcmUgYmVmb3JlIHRoZSBoaWVyYXJjaHkgdG8gcHJldmVudCB1cGRhdGluZyBwYXJlbnRzIGJlZm9yZSBhbGwgb2YgdGhlIGNoaWxkcmVuIGFyZSBkb25lCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBpdGVtPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkvL1JlcGxhY2UgdGhlIGl0ZW1zIGluIHRoZSBjaGVja2VkIHN0YXRlIHN0b3JlIHdpdGggdGhvc2UgZnJvbSB0aGUgc3VwcGxpZWQgaXRlbXMKLQkJCWlmICghZkNoZWNrZWRTdGF0ZVN0b3JlLmNvbnRhaW5zKGl0ZW0pKQotCQkJCWZDaGVja2VkU3RhdGVTdG9yZS5hZGQoaXRlbSk7Ci0JCQkvLyBwcm9jZWVkIHVwIHRoZSB0cmVlIGVsZW1lbnQgaGllcmFyY2h5Ci0JCQlPYmplY3QgcGFyZW50PSBmVHJlZUNvbnRlbnRQcm92aWRlci5nZXRQYXJlbnQoaXRlbSk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQlhZGRUb0hpZXJhcmNoeVRvQ2hlY2tlZFN0b3JlKHBhcmVudCk7Ci0JCQl9Ci0JCX0KLQotCQkvL05vdyB1cGRhdGUgaGllcmFyY2hpZXMKLQkJaXRlcmF0b3I9IGl0ZW1zLml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGl0ZW09IGl0ZXJhdG9yLm5leHQoKTsKLQkJCXVwZGF0ZUhpZXJhcmNoeShpdGVtKTsKLQkJfQotCX0JCQotCQotCS8qKgotCSAqIENoZWNrcyBpZiBhbiBlbGVtZW50IGlzIGdyZXkgY2hlY2tlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1RyZWVJdGVtR3JleUNoZWNrZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZlRyZWVWaWV3ZXIuZ2V0R3JheWVkKG9iamVjdCk7CQotCX0JCi0KLQkvKioKLQkgKiBGb3IgYSBnaXZlbiBlbGVtZW50LCBleHBhbmQgaXRzIGNoaWRyZW4gdG8gYSBsZXZlbC4KLQkgKi8JCi0JcHVibGljIHZvaWQgZXhwYW5kVHJlZVRvTGV2ZWwoT2JqZWN0IG9iamVjdCwgaW50IGxldmVsKSB7Ci0JCWZUcmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwob2JqZWN0LCBsZXZlbCk7CQotCX0KLQkvKioKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJlZVNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlmVHJlZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSBjb250ZW50IG9mIHRoZSB2aWV3ZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJZkV4cGFuZGVkVHJlZU5vZGVzLmNsZWFyKCk7Ci0JCWZUcmVlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0hUTUxXcmFwcGVycy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9IVE1MV3JhcHBlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMyYzk5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0hUTUxXcmFwcGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIFRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBIVE1MIHdyYXBwZXJzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEhUTUxXcmFwcGVycyB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZQotCQkJLmdldEJ1bmRsZShIVE1MV3JhcHBlcnMuY2xhc3MuZ2V0TmFtZSgpKTsKLQotCS8qKgotCSAqIERlZmF1bHQgcHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZm9ybSBiZWluZwotCSAqIGluc3RhbnRpYXRlZC4KLQkgKi8KLQlwcml2YXRlIEhUTUxXcmFwcGVycygpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGdpdmVuIHRoZSByZXNvdXJjZSBrZXkuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlIGtleS4KLQkgKiBAcmV0dXJuIFRoZSBsb2NhbGl6ZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgZm9ybWF0dGVkIG1lc3NhZ2UgZm9yIHRoZSBnaXZlbiByZXNvdXJjZSBrZXkuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgVGhlIG1lc3NhZ2UgYXJndW1lbnRzLgotCSAqIEByZXR1cm4gVGhlIGxvY2FsaXplZCBmb3JtYXR0ZWQgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIGFyZ3MpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvSFRNTFdyYXBwZXJzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0hUTUxXcmFwcGVycy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTMwNjcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvSFRNTFdyYXBwZXJzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNPTlRFTlRfV1JBUFBFUl9TVEFSVD1cCi0gIDxodG1sPlwKLSAgPGhlYWQ+XAotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+XAotICA8L2hlYWQ+XAotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij5cCi0gIGZ1bmN0aW9uIGluaXQoKSB7IHBhcmVudC5vcnlfdG9jPSJkaXNhYmxlIjsgcGFyZW50LmNvbnRlbnRmcmFtZS5sb2NhdGlvbj0iCi0gIAotQ09OVEVOVF9XUkFQUEVSX0VORD1cCi0gICI7IH1cCi0gIDwvc2NyaXB0PlwKLSAgPC9oZWFkPlwKLSAgPGZyYW1lc2V0IHJvd3M9IjEwMCUsKiIgZnJhbWVib3JkZXI9Im5vIiBib3JkZXI9IjAiIGZyYW1lc3BhY2luZz0iMCIgaWQ9ImNvbnRlbnRmcmFtZXNldCIgbmFtZT0iY29udGVudGZyYW1lc2V0Ij5cCi0gIDxmcmFtZSBzcmM9ImFib3V0OmJsYW5rIiBpZD0iY29udGVudGZyYW1lIiBuYW1lPSJjb250ZW50ZnJhbWUiIHNjcm9sbGluZz0iYXV0byIvPlwKLSAgPGZyYW1lIHNyYz0iYWJvdXQ6YmxhbmsiIGlkPSJibGFua2ZyYW1lIiBuYW1lPSJibGFua2ZyYW1lIiBvbmxvYWQ9ImluaXQoKSIvPlwKLSAgPC9mcmFtZXNldD5cCi0gIDwvaHRtbD4KLQotUFJJTlRfV1JBUFBFUl9TVEFSVD1cCi0gIDxodG1sPlwKLSAgPGhlYWQ+XAotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+XAotICA8L2hlYWQ+XAotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij5cCi0gIGZ1bmN0aW9uIGluaXQoKSB7IHBhcmVudC5vcnlfdG9jPSJkaXNhYmxlIjsgfVwKLSAgPC9zY3JpcHQ+XAotICA8L2hlYWQ+XAotICA8ZnJhbWVzZXQgcm93cz0iMTAwJSwqIiBmcmFtZWJvcmRlcj0ibm8iIGJvcmRlcj0iMCIgZnJhbWVzcGFjaW5nPSIwIiBpZD0icHJpbnRmcmFtZXNldCIgbmFtZT0icHJpbnRmcmFtZXNldCIgb25sb2FkPSJqYXZhc2NyaXB0OnByaW50KCkiPlwKLSAgPGZyYW1lIHNyYz0iYWJvdXQ6YmxhbmsiIGlkPSJibGFua2ZyYW1lIiBuYW1lPSJibGFua2ZyYW1lIiBvbmxvYWQ9ImluaXQoKSIvPlwKLSAgPGZyYW1lIHNyYz0iCi0KLVBSSU5UX1dSQVBQRVJfRU5EPVwKLSAgIiBpZD0icHJpbnRmcmFtZSIgbmFtZT0icHJpbnRmcmFtZSIgc2Nyb2xsaW5nPSJhdXRvIiBvbmxvYWQ9ImphdmFzY3JpcHQ6cGFyZW50LnByaW50ZnJhbWUuZm9jdXMoKSIvPlwKLSAgPC9mcmFtZXNldD5cCi0gIDxodG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTGlicmFyeVZpZXcuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTGlicmFyeVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ0NzNlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0xpYnJhcnlWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjI3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvcHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkN1dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5QYXN0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuTG9jYWxUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5VSUFjdGlvbkRpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkNyZWF0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MYXlvdXRBY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5Vmlld0NvcHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWaWV3Q3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5Vmlld0RlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeVZpZXdQYXN0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTmV3UGx1Z2luQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5SZW5hbWVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLk1vdmVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLlN3aXRjaENvbmZpZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuVmFyaWFiaWxpdHlTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kbmQuTGlicmFyeVZpZXdlckRyYWdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5JRWRpdG9yS2VlcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BdXRob3JpbmdVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLk1ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlJlZnJlc2hIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlBsdWdpblVJUGFja2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLlBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLkxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuSW1wb3J0RXhwb3J0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5MaWJyYXJ5U2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuZG9tYWluLlRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLk1lc3NhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRlY29yYXRpbmdMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkhUTUxUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRleHRUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2hvd0luVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuU2hvd0luQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLmludGVybmFsLk1hcmtlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yLlJlc291cmNlTmF2aWdhdG9yOwotCi0vKioKLSAqIFRoZSBMaWJyYXJ5IHZpZXcuCi0gKiA8cD4KLSAqIERpc3BsYXlzIHRoZSBwaHlzaWNhbCByZXByZXNlbnRhdGlvbiBvZiBhIE1ldGhvZCBMaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlWaWV3IGV4dGVuZHMgQWJzdHJhY3RCYXNlVmlldyBpbXBsZW1lbnRzIElSZWZyZXNoSGFuZGxlciwKLQkJSVNob3dJblRhcmdldCB7Ci0KLQkvKioKLQkgKiBUaGUgdmlldyBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX0lEID0gTGlicmFyeVZpZXcuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JcHJvdGVjdGVkIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotCXByb3RlY3RlZCBJRG91YmxlQ2xpY2tMaXN0ZW5lciBkb3VibGVDbGlja0xpc3RlbmVyID0gbnVsbDsKLQotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JCi0JcHJpdmF0ZSBMYXlvdXRBY3Rpb25Hcm91cCBmTGF5b3V0QWN0aW9uU2V0OwotCQotCXByaXZhdGUgU3RyaW5nIFBFUkZPUk1fSUQgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy52aWV3LkxpYnJhcnlWaWV3LnBlcmZvcm1WYWxpZGF0b3JBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBJQWN0aW9uIHBlcmZvcm1MaWJyYXJ5VmFsaWRhdGlvbkFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5WYWxpZGF0ZV9tZXRob2RfbGlicmFyeSwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCSJmdWxsL2V0b29sMTYvdmFsaWRhdGVfbWV0aG9kX2xpYi5naWYiKSkgeyAvLyROT04tTkxTLTEkCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQlWaWV3SGVscGVyLmNoZWNrTGlicmFyeUhlYWx0aCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0JCQotCX07Ci0JCi0JLy8gTGlzdGVuIHRvIHByb2Nlc3MgZWRpdG9yIGFjdGl2YXRpb24gYW5kIHByb21wdCB0aGUgdXNlciB0byBsb2FkIHRoZQotCS8vIHRoZSBwcm9jZXNzJ3MgZGVmYXVsdCBDb25maWd1cmF0aW9uIGludG8gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLQlwcml2YXRlIElQYXJ0TGlzdGVuZXIgZWRpdG9yUGFydExpc3RlbmVyID0gbmV3IElQYXJ0TGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotCQkJCVN3aXRjaENvbmZpZ0RpYWxvZy5ydW4oRGlzcGxheQotCQkJCQkJLmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCAoSUVkaXRvclBhcnQpcGFydCk7Ci0JCQl9Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIGxvbmcgbGFzdFJlZnJlc2hUaW1lU3RhbXA7Ci0KLQlwcml2YXRlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc291cmNlTGlzdGVuZXIgPSBuZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UgfHwKLQkJCQkJZXZlbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUpIHsKLQkJCQkvLyBwcm9qZWN0IGFib3V0IHRvIGJlIGNsb3NlZCBvciBkZWxldGVkCi0JCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdClldmVudC5nZXRSZXNvdXJjZSgpOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChwcm9qZWN0LmV4aXN0cygpICYmIHByb2plY3QuaXNPcGVuKCkgJiYgcHJvamVjdC5oYXNOYXR1cmUoTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuTkFUVVJFX0lEKSkgewotCQkJCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLmNsb3NlQWxsTWV0aG9kRWRpdG9ycygpOwotCQkJCQkJSVByb2plY3QgY3VyclByb2plY3QgPSBNZXRob2RMaWJyYXJ5UHJvamVjdC5maW5kUHJvamVjdChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKSk7Ci0JCQkJCQlpZiAocHJvamVjdCA9PSBjdXJyUHJvamVjdCkgewotCQkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuY2xvc2VDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZXgpIHsKLQkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoY2V4KTsKLQkJCQl9IGNhdGNoIChMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiBsZXgpIHsKLQkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IobGV4KTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJCQotCQkJfQotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJCQkJCi0JCQl0cnkgewotCQkJCWNsYXNzIFJlc291cmNlRGVsdGFWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpCi0JCQkJCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTUFSS0VSUykgPT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUykgewotCQkJCQkJCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7Ci0JCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRDoKLQkJCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQ6Ci0JCQkJCQkJCS8vIHNob3cgUHJvYmxlbXMgVmlldwotCQkJCQkJCQlVSUhlbHBlci5zaG93UHJvYmxlbXNWaWV3KCk7Ci0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvLyB3YXRjaCBmb3IgcHJvamVjdCBtb3ZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCQllbHNlIGlmIChkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgeyAgCi0JCQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKSB7Ci0JCQkJCQkJCWlmICgoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRCkgPT0gMCkgJiYgICAgICAgICAgICAgICAgCi0JCQkJCQkJCQkJKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuREVTQ1JJUFRJT04pICE9IDApKSB7Ci0JCQkJCQkJCQkvLyB0ZXN0ZWQgdXNpbmcgdGhlIE1vdmUuLiBjb21tYW5kIGluIHRoZSBSZXNvdXJjZSBOYXZpZ2F0b3IgdmlldyAgICAgICAgICAgICAKLQkJCQkJCQkJCS8vIHRoZSBSRVBMQUNFRCBmbGFnIG9ubHkgc2VlbWVkIHRvIG9jY3VyIHdoZW4gdGhlIGxpYnJhcnkgd2FzIG1vdmVkICAgICAgICAgIAotCQkJCQkJCQkJLy8gb3V0c2lkZSBvZiBFUEYgYW5kIEVQRiB3YXMgcmUtc3RhcnRlZCwgc28gbWFrZSBzdXJlIGl0J3MgY2xlYXIsIG90aGVyd2lzZSAgCi0JCQkJCQkJCQkvLyB3ZSByZWxvYWQgdGhlIGxpYnJhcnkgcmlnaHQgYWZ0ZXIgbG9hZGluZyBpdCB3aGVuIHN0YXJ0aW5nIEVQRiAgICAgICAgICAgICAKLQkJCQkJCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJCQkJCQlJTGlicmFyeU1hbmFnZXIgbGliTWdyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCQkJCQkJCWlmKGxpYk1nciBpbnN0YW5jZW9mIFhNSUxpYnJhcnlNYW5hZ2VyKSB7Ci0JCQkJCQkJCQkJWE1JTGlicmFyeU1hbmFnZXIgeG1pTGliTWdyID0gKChYTUlMaWJyYXJ5TWFuYWdlcilsaWJNZ3IpOwotCQkJCQkJCQkJCWlmKHByb2plY3QuZXF1YWxzKHhtaUxpYk1nci5nZXRNZXRob2RMaWJyYXJ5UHJvamVjdCgpKSkgewkKLQkJCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQkJCQkJCQkJCXhtaUxpYk1nci5oYW5kbGVMaWJyYXJ5TW92ZWQoKTsKLQkJCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIGlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk9QRU4pICE9IDApIHsKLQkJCQkJCQkJCS8vIHByb2plY3QncyBvcGVuIHN0YXRlIHdhcyBjaGFuZ2VkCi0JCQkJCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCQkJCQkJaWYgKHByb2plY3QuaXNPcGVuKCkgJiYgcHJvamVjdC5oYXNOYXR1cmUoTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuTkFUVVJFX0lEKSAmJgotCQkJCQkJCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgPT0gbnVsbCkgewotCQkJCQkJCQkJCS8vIHByb2plY3QgaXMgbm93IG9wZW4sIG9wZW4gdGhlIGxpYnJhcnkKLQkJCQkJCQkJCQlqYXZhLm5ldC5VUkkgcHJvamVjdExvY2F0aW9uID0gcHJvamVjdC5nZXRMb2NhdGlvblVSSSgpOwotCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkub3Blbk1ldGhvZExpYnJhcnkoInhtaSIsIHByb2plY3RMb2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0JCQkJCi0JCQkJfTsKLQkJCQkKLQkJCQlSZXNvdXJjZURlbHRhVmlzaXRvciB2aXNpdG9yID0gbmV3IFJlc291cmNlRGVsdGFWaXNpdG9yKCk7Ci0JCQkJZGVsdGEuYWNjZXB0KHZpc2l0b3IpOwotCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJfQotCi0JCX0KLQotCX07Ci0KLQlwcml2YXRlIElSZWZyZXNoTGlzdGVuZXIgcmVmcmVzaExpc3RlbmVyID0gbmV3IElSZWZyZXNoTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgbm90aWZ5UmVmcmVzaGVkKElSZWZyZXNoRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5nZXRSZWZyZXNoZWRPYmplY3RzKCkgIT0gbnVsbAotCQkJCQkmJiAhZXZlbnQuZ2V0UmVmcmVzaGVkT2JqZWN0cygpLmlzRW1wdHkoKSkgewotCQkJCUNvbnRyb2wgY3RybCA9IGdldFZpZXdlcigpLmdldENvbnRyb2woKTsKLQkJCQlpZiAoY3RybCA9PSBudWxsIHx8IGN0cmwuaXNEaXNwb3NlZCgpKQotCQkJCQlyZXR1cm47Ci0KLQkJCQlpZiAoY3RybC5nZXREaXNwbGF5KCkuZ2V0VGhyZWFkKCkgPT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSkgewotCQkJCQlkb1JlZnJlc2goZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmwuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWRvUmVmcmVzaChudWxsKTsKLQkJCQkJCX0KLQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5VmlldygpIHsKLQkJLy8gcmVhZCBsYXlvdXQgcHJlZgotCQlpZiAoUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5GTEFUX0xBWU9VVC5lcXVhbHMoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLmdldExheW91dCgpKSkgewotCQkJUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5JTlNUQU5DRS5zZXRMYXlvdXRGbGF0KCk7Ci0JCX0gZWxzZSBpZiAoUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5ISUVSQVJDSElDQUxfTEFZT1VULmVxdWFscyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuZ2V0TGF5b3V0KCkpKSB7Ci0JCQlQbHVnaW5VSVBhY2thZ2VDb250ZXh0LklOU1RBTkNFLnNldExheW91dEhpZXJhcmNoaWNhbCgpOwotCQl9Ci0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlUGFydENvbnRyb2wocGFyZW50KTsKLQkJCi0JCW1ha2VBY3Rpb25zKCk7Ci0JCQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwKLQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX05BVklHQVRPUl9WSUVXX0NPTlRFWFQpOwotCi0JCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRSZWZyZXNoSGFuZGxlcih0aGlzKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG1ha2VBY3Rpb25zKCkgewotCQlmTGF5b3V0QWN0aW9uU2V0PSBuZXcgTGF5b3V0QWN0aW9uR3JvdXAodGhpcyk7Ci0JCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnM9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotCQlmTGF5b3V0QWN0aW9uU2V0LmZpbGxBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJLy8gVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIHRoZSBnbG9iYWwgZWRpdCBhY3Rpb24gd29yayB0aGUgZmlyc3QgdGltZS4KLQkJYWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlVmlldyh0aGlzKTsKLQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3RlZCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3RlZC5pc0VtcHR5KCkpCi0JCQlhY3Rpb25CYXJDb250cmlidXRvci5kaXNhYmxlR2xvYmFsRWRpdE1lbnUoKTsKLQkJZWxzZQotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3IuZW5hYmxlR2xvYmFsRWRpdE1lbnUoKTsKLQotCQlpZiAodHJlZVZpZXdlciAhPSBudWxsKSB7Ci0JCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB0cmVlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsKLQkJcmV0dXJuIHRyZWVWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdW5kZXJseWluZyB0cmVlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50KSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlciNoYW5kbGVMYWJlbFByb3ZpZGVyQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQpCi0JCQkgKi8KLQkJCXByb3RlY3RlZCB2b2lkIGhhbmRsZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKAotCQkJCQlMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElSZXNvdXJjZQotCQkJCQkJJiYgZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBJTGFiZWxEZWNvcmF0b3IpIHsKLQkJCQkJdGhpcy5yZWZyZXNoKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJc3VwZXIuaGFuZGxlTGFiZWxQcm92aWRlckNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9OwotCi0JCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBjb21tYW5kIHN0YWNrIHRoYXQgd2lsbCBub3RpZnkgdGhpcyBlZGl0b3IgYXMgY29tbWFuZHMgYXJlCi0JCS8vIGV4ZWN1dGVkLgotCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsKLQotCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBzZXQgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQncyBhZmZlY3RlZCBvYmplY3RzIHRvCi0JCS8vIGJlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHZpZXdlciB3aXRoIGZvY3VzLgotCQljb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIobmV3IENvbW1hbmRTdGFja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChmaW5hbCBFdmVudE9iamVjdCBldmVudCkgewotCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7Ci0KLQkJCQkJCS8vIFRyeSB0byBzZWxlY3QgdGhlIGFmZmVjdGVkIG9iamVjdHMuCi0JCQkJCQlDb21tYW5kIG1vc3RSZWNlbnRDb21tYW5kID0gKChDb21tYW5kU3RhY2spIGV2ZW50Ci0JCQkJCQkJCS5nZXRTb3VyY2UoKSkuZ2V0TW9zdFJlY2VudENvbW1hbmQoKTsKLQkJCQkJCWlmIChtb3N0UmVjZW50Q29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJCQkJc2V0U2VsZWN0aW9uVG9WaWV3ZXIobW9zdFJlY2VudENvbW1hbmQKLQkJCQkJCQkJCS5nZXRBZmZlY3RlZE9iamVjdHMoKSk7Ci0JCQkJCQkJCi0JCQkJCQkJaWYobW9zdFJlY2VudENvbW1hbmQgaW5zdGFuY2VvZiBDcmVhdGVNZXRob2RFbGVtZW50Q29tbWFuZCkgewkJCQkJCQkJCi0JCQkJCQkJCS8vIFdvcmstYXJvdW5kIHRvIHJlZnJlc2ggaWNvbnMgb2YgbmV3bHkgY3JlYXRlZCBlbGVtZW50cywgd2hvc2UgZGVjb3JhdGlvbgotCQkJCQkJCQkvLyBzb21ldGltZXMgZ290IG91dCBvZiBzeW5jLgotCQkJCQkJCQkvLwotCQkJCQkJCQlWaWV3ZXIgdmlld2VyID0gZ2V0Vmlld2VyKCk7Ci0JCQkJCQkJCWlmKHZpZXdlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRWaWV3ZXIpIHsKLQkJCQkJCQkJCU9iamVjdFtdIGVsZW1lbnRzID0gbW9zdFJlY2VudENvbW1hbmQKLQkJCQkJCQkJCQkJLmdldEFmZmVjdGVkT2JqZWN0cygpLnRvQXJyYXkoKTsKLQkJCQkJCQkJCSgoU3RydWN0dXJlZFZpZXdlcil2aWV3ZXIpLnVwZGF0ZShlbGVtZW50cywgbnVsbCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbAotCQkJCQkJCQkmJiBwcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkgIT0gbnVsbAotCQkJCQkJCQkmJiAhcHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKQotCQkJCQkJCQkmJiBwcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkuaXNWaXNpYmxlKCkpIHsKLQkJCQkJCQlwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSAhPSBudWxsKSB7Ci0JCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcnVubmFibGUucnVuKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyBDcmVhdGUgdGhlIGVkaXRpbmcgZG9tYWluIHdpdGggYSBzcGVjaWFsIGNvbW1hbmQgc3RhY2suCi0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gUGVyc2lzdGVuY2VTZXJ2aWNlLklOU1RBTkNFCi0JCQkJLmNyZWF0ZVJlc291cmNlU2V0KFNlcnZpY2VzLmdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVuY2VUeXBlKCkpOwotCi0JCWVkaXRpbmdEb21haW4gPSBuZXcgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCWFkYXB0ZXJGYWN0b3J5LCBjb21tYW5kU3RhY2ssIHJlc291cmNlU2V0KTsKLQotCi0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlhZGFwdGVyRmFjdG9yeSkpOwotCi0JCS8vIHRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcKLQkJLy8gQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIoCi0JCQkJbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSksCi0JCQkJbmV3IE1ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvcigpKSk7Ci0KLQkJLy8gQWRkIGEgZG91YmxlIGNsaWNrIGxpc3RlbmVyIGZvciBsYXVuY2hpbmcgdGhlIE1ldGhvZCBlZGl0b3JzLgotCQlkb3VibGVDbGlja0xpc3RlbmVyID0gbmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpLmhhbmRsZURvdWJsZUNsaWNrRXZlbnQoZXZlbnQpOwotCQkJfQotCQl9OwotCQl0cmVlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIoZG91YmxlQ2xpY2tMaXN0ZW5lcik7Ci0KLQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIoZWRpdG9yUGFydExpc3RlbmVyKTsKLQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkKLQkJCQkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUxpc3RlbmVyKTsKLQkJCi0JCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHRyZWVWaWV3ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I3NldElucHV0Rm9yVmlld2VyKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dEZvclZpZXdlcihPYmplY3QgbW9kZWwpIHsKLQkJQ29udHJvbCBjdHJsID0gdGhpcy5nZXRWaWV3ZXIoKS5nZXRDb250cm9sKCk7Ci0JCWlmIChjdHJsLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChtb2RlbCA9PSBudWxsIHx8IG1vZGVsIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJLy8gUHJldmVudCBtZW1vcnkgbGVhay4KLQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gZW1wdHlTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotCQkJYWN0aW9uRGlzcGF0Y2hlci5zZXRTZWxlY3Rpb24oZW1wdHlTZWxlY3Rpb24pOwotCQkJVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkuc2V0U2VsZWN0aW9uKGVtcHR5U2VsZWN0aW9uKTsKLQotCQkJZ2V0Vmlld2VyKCkuc2V0SW5wdXQobW9kZWwpOwotCQkJdXBkYXRlTGFzdFJlZnJlc2hUaW1lc3RhbXAoKTsKLQkJfSBlbHNlIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiTGlicmFyeSB2aWV3ZXIgaW5wdXQgaXMgbm90IGEgTWV0aG9kTGlicmFyeSBvYmplY3Q6ICIgKyBtb2RlbCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVMYXN0UmVmcmVzaFRpbWVzdGFtcCgpIHsKLQkJbGFzdFJlZnJlc2hUaW1lU3RhbXAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgdmlldy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpYnJhcnlWaWV3IGdldFZpZXcoKSB7Ci0vLwkJcmV0dXJuIChMaWJyYXJ5VmlldykgVmlld0hlbHBlci5vcGVuVmlldyhWSUVXX0lEKTsKLQkJYm9vbGVhbiBzaG93ID0gVmlld0hlbHBlci5pc1ZpZXdJbkN1cnJlbnRQZXJzcGVjdGl2ZShWSUVXX0lEKTsKLQkJcmV0dXJuIChMaWJyYXJ5VmlldylWaWV3SGVscGVyLmZpbmRWaWV3KFZJRVdfSUQsIHNob3cpOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkFic3RyYWN0QmFzZVZpZXcjc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCSgoTGlicmFyeVZpZXdBY3Rpb25CYXJDb250cmlidXRvcikgYWN0aW9uQmFyQ29udHJpYnV0b3IpCi0JCQkJLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCi0JCXN1cGVyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsJCQotCi0vLwkJKChMaWJyYXJ5Vmlld0FjdGlvbkJhckNvbnRyaWJ1dG9yKSBhY3Rpb25CYXJDb250cmlidXRvcikuY2hlY2tMb2NrZWQoKTsKLQkJCi0JCS8vIGlmIG9ubHkgb25lIGVsZW1lbnQgaXMgc2VsZWN0ZWQsIHNob3cgcGF0aCB0byBpdHMgZmlsZSBpbiBzdGF0dXMgbGluZQotCQkvLwotCQlJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKQotCQkJCS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCQlpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCWlmIChzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCU9iamVjdCBvID0gVG5nVXRpbC51bndyYXAoc3RydWN0dXJlZFNlbGVjdGlvbgotCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKEVPYmplY3QpIG8pLmVSZXNvdXJjZSgpOwotCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQlVUkkgdXJpID0gcmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCQkJCQkJaWYgKHVyaSAhPSBudWxsICYmIHVyaS5pc0ZpbGUoKSkgewotCQkJCQkJCQlwYXRoID0gdXJpLnRvRmlsZVN0cmluZygpOwotCQkJCQkJCQlpZiAobyBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9ICgoQ29udGVudEVsZW1lbnQpIG8pCi0JCQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCQkJCQkJCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCQkJCQkJCQlyZXNvdXJjZSA9IGNvbnRlbnQuZVJlc291cmNlKCk7Ci0JCQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJVVJJIGNvbnRlbnRVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCQkJCQkJCQkJaWYgKGNvbnRlbnRVUkkgIT0gbnVsbCkgewotCQkJCQkJCQkJCQkJcGF0aCA9IHBhdGgKLQkJCQkJCQkJCQkJCQkJKyAiLC4iICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgY29udGVudFVSSS5kZXJlc29sdmUodXJpKS50b0ZpbGVTdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShwYXRoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlyZWZyZXNoVmlld3MoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbGlicmFyeVNldChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJc3VwZXIubGlicmFyeVNldChsaWJyYXJ5KTsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5yZWdpc3RlckVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbik7Ci0JCQotCQkJbWFuYWdlci5hZGRQcm9wZXJ0eUxpc3RlbmVyKG5ldyBJUHJvcGVydHlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IHNvdXJjZSwgaW50IHByb3BJZCkgewotCQkJCQkvLyBUT0RPOiBSZXBsYWNlIGhhcmRjb2RlZCBjb25zdGFudCB3aXRoIHZhcmlhYmxlLgotCQkJCQlpZiAocHJvcElkID09IDEpIHsKLQkJCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGFjdGlvbiBiYXIgZm9yIHRoZSBsaWJyYXJ5IHZpZXcKLQkgKi8KLQljbGFzcyBMaWJyYXJ5Vmlld0FjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQotCQlwcml2YXRlIElBY3Rpb24gbmV3UGx1Z2luQWN0aW9uID0gbmV3IE5ld1BsdWdpbkFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdfcGx1Z2luKTsKLQotCQlwcml2YXRlIElBY3Rpb24gbW92ZUFjdGlvbiA9IG5ldyBBY3Rpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMubW92ZSkgewotCi0JCQlwcml2YXRlIHZvaWQgZG9Nb3ZlKCkgewotCQkJCUNvbGxlY3Rpb24gZWxlbWVudHNUb01vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBMaWJyYXJ5Vmlldy50aGlzLnNlbGVjdGlvbjsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJCXx8IChlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCkpIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJCS8vIEhhbmRsZSBDdXN0b21DYXRlZ29yeSBzcGVjaWFsbHkuCi0JCQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoRU9iamVjdCkgZWxlbWVudCkuZUNvbnRhaW5lcigpOwotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoCi0JCQkJCQkJCWNvbnRhaW5lciwgZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX21vdmVFcnJvciwKLQkJCQkJCQkJCQkJc3RhdHVzKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQllbGVtZW50c1RvTW92ZS5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBUT0RPOiBQcm9tcHQgdGhlIHVzZXIgdGhlIHNhdmUgZWRpdGluZyBjaGFuZ2VzIGZvcgotCQkJCS8vIGVsZW1lbnRzIHRoYXQgd2lsbCBiZSBtb3ZlZC4KLQotCQkJCS8vIFJlbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBtb3ZlIGxpc3QgaWYgdGhlaXIgY29udGFpbmVycyBhcmUKLQkJCQkvLyBhbHJlYWR5IGluIHRoZSBtb3ZlIGxpc3QuCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnRzVG9Nb3ZlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlib29sZWFuIGlzQ29udGFpbmVkID0gZmFsc2U7Ci0JCQkJCWNoZWNrX2NvbnRhaW5lZDogZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb01vdmUKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKFVtYVV0aWwuaXNDb250YWluZWRCeShlbGVtZW50LCBlKSkgewotCQkJCQkJCWlzQ29udGFpbmVkID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBjaGVja19jb250YWluZWQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGlzQ29udGFpbmVkKSB7Ci0JCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCU1vdmVEaWFsb2cgZGxnID0gbmV3IE1vdmVEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCksCi0JCQkJCQllbGVtZW50c1RvTW92ZSwgZWRpdGluZ0RvbWFpbik7Ci0JCQkJZGxnLm9wZW4oKTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBydW5uZXIgPSBuZXcgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKTsKLQkJCQlydW5uZXIuc2V0UHJvZ3Jlc3NNb25pdG9yKGdldEFjdGlvbkJhcnMoKQotCQkJCQkJLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCWRvTW92ZSgpOwotCQkJCQl9Ci0KLQkJCQl9KTsKLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIFJlbmFtZUFjdGlvbiByZW5hbWVBY3Rpb24gPSBuZXcgUmVuYW1lQWN0aW9uKCk7Ci0KLQkJcHJpdmF0ZSBJQWN0aW9uIHJlcGxhY2VBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld19yZXBsYWNlQWN0aW9uX3RleHQpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICghZ2V0UGFnZSgpLmNsb3NlQWxsRWRpdG9ycyh0cnVlKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJZmluYWwgUHJvY2Vzc0NvbXBvbmVudCBwcm9jQ29tcCA9IChQcm9jZXNzQ29tcG9uZW50KSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJUHJvY2VzcyBwcm9jID0gcHJvY0NvbXAuZ2V0UHJvY2VzcygpOwotCQkJCWZpbmFsIFN0cmluZyB0eXBlU3RyOwotCQkJCWlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQkJdHlwZVN0ciA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld18yMDsKLQkJCQl9IGVsc2UgaWYgKHByb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJdHlwZVN0ciA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld18yMTsKLQkJCQl9IGVsc2UgewotCQkJCQl0eXBlU3RyID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3XzIyOwotCQkJCX0KLQkJCQlEaXJlY3RvcnlEaWFsb2cgZGlyRGxnID0gbmV3IERpcmVjdG9yeURpYWxvZyhnZXRTaXRlKCkKLQkJCQkJCS5nZXRTaGVsbCgpKTsKLQkJCQlkaXJEbGcuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5FbGVtZW50c1ZpZXdfcmVwbGFjZV90ZXh0KTsKLQkJCQlkaXJEbGcKLQkJCQkJCS5zZXRNZXNzYWdlKE1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5FbGVtZW50c1ZpZXdfbWlncmF0aW9uX2Rpcl9kbGdfZGVzY3JpcHRpb25fdGV4dCwKLQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyB0eXBlU3RyIH0pKTsKLQkJCQlmaW5hbCBTdHJpbmcgZGlyID0gZGlyRGxnLm9wZW4oKTsKLQkJCQlpZiAoZGlyID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWJvb2xlYW4gcmV0ID0gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCQkucnVuV2l0aFByb2dyZXNzKAotCQkJCQkJCQluZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQlJbXBvcnRFeHBvcnRVdGlsLnJlcGxhY2UocHJvY0NvbXAsCi0JCQkJCQkJCQkJCQkJZGlyKTsKLQkJCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0sCi0JCQkJCQkJCU1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3X3JlcGxhY2Vpbmd3aXRoZm9ybWF0X3RleHQsCi0JCQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyB0eXBlU3RyIH0pKTsKLQotCQkJCWlmIChyZXQpIHsKLQkJCQkJLy8gUmVvcGVuIHRoZSBsaWJyYXJ5LgotCQkJCQlMaWJyYXJ5VUlNYW5hZ2VyLmdldEluc3RhbmNlKCkub3BlbkxpYnJhcnkoCi0JCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgSUFjdGlvbiBvcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld19vcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb25fdGV4dCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcCgoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmo7Ci0JCQkJCVZhcmlhYmlsaXR5U2VsZWN0aW9uIHZhcmlhYmlsaXR5U2VsZWN0aW9uID0gbmV3IFZhcmlhYmlsaXR5U2VsZWN0aW9uKCk7Ci0JCQkJCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IHZhcmlhYmlsaXR5U2VsZWN0aW9uCi0JCQkJCQkJLmdldFNlbGVjdGVkVmFyaWFiaWxpdHkoZWxlbWVudCk7Ci0JCQkJCWlmIChzZWxlY3RlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQkJCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkub3BlbkVkaXRvcihzZWxlY3RlZE9iamVjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGxvY2tlZDsKLQotCQlwcml2YXRlIGJvb2xlYW4gY2FuTW92ZTsKLQotCQlwcml2YXRlIElBY3Rpb24gc2hvd0luUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uX2xhYmVsKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVJlc291cmNlTmF2aWdhdG9yIG5hdmlnYXRvcjsKLQkJCQl0cnkgewotCQkJCQluYXZpZ2F0b3IgPSAoUmVzb3VyY2VOYXZpZ2F0b3IpIGdldFBhZ2UoKS5zaG93VmlldygKLQkJCQkJCQkib3JnLmVjbGlwc2UudWkudmlld3MuUmVzb3VyY2VOYXZpZ2F0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlPYmplY3Qgb2JqID0gVG5nVXRpbAotCQkJCQkJCS51bndyYXAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCQkJSVJlc291cmNlIHdzUmVzID0gUGVyc2lzdGVuY2VVdGlsLmdldFdvcmtzcGFjZVJlc291cmNlKG9iaik7Ci0JCQkJCWlmICh3c1JlcyAhPSBudWxsKSB7Ci0JCQkJCQluYXZpZ2F0b3IuZ2V0Vmlld2VyKCkuc2V0U2VsZWN0aW9uKAotCQkJCQkJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbih3c1JlcyksIHRydWUpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgYm9vbGVhbiBjYW5SZW5hbWU7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JCSAqLwotCQlwdWJsaWMgTGlicmFyeVZpZXdBY3Rpb25CYXJDb250cmlidXRvcihFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4pIHsKLQkJCXN1cGVyKGVkaXRpbmdEb21haW4pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNjcmVhdGVEZWxldGVBY3Rpb24oKQotCQkgKi8KLQkJcHJvdGVjdGVkIERlbGV0ZUFjdGlvbiBjcmVhdGVEZWxldGVBY3Rpb24oKSB7Ci0JCQlMaWJyYXJ5Vmlld0RlbGV0ZUFjdGlvbiBhY3Rpb24gPSBuZXcgTGlicmFyeVZpZXdEZWxldGVBY3Rpb24oKSB7Ci0JCQkJLyoqCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuRWxlbWVudHNWaWV3UGFzdGVBY3Rpb24jdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJCSAqLwotCQkJCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQkJaWYgKGxvY2tlZCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yVGl0bGU7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzdXBlci5ydW4oKTsKLQkJCQkJfSBjYXRjaCAoTWVzc2FnZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJU3RyaW5nIGRldGFpbHMgPSBUbmdVdGlsLnRvU3RhY2tUcmFjZVN0cmluZyhlKTsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JNZXNzYWdlOwotCQkJCQkJU3RyaW5nIHJlYXNvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yUmVhc29uOwotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsIHJlYXNvbiwgZGV0YWlscywKLQkJCQkJCQkJCQllKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUZhaWxlZCgpIHsKLQkJCQkJLy8gTGlicmFyeSBuZWVkIHRvIGJlIHJlbG9hZGVkLgotCQkJCQlWaWV3SGVscGVyLnJlbG9hZEN1cnJlbnRMaWJyYXJ5KGdldFNpdGUoKS5nZXRTaGVsbCgpLCBBdXRob3JpbmdVSVJlc291cmNlcy5tc2dfcmVsb2FkTGlicmFyeSk7Ci0KLQkJCQkJLy8gVXNlciB0cmllZCB0byBzZWxlY3QgdGhlIG9sZCBzZWxlY3Rpb24uCi0JCQkJCWlmIChhY3RpdmVWaWV3UGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgewotCQkJCQkJZmluYWwgQXJyYXlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJCQlTdHJpbmcgZ3VpZCA9ICgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0R3VpZCgpOwotCQkJCQkJCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQkJCQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG1hbmFnZXIKLQkJCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQkJCQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKCFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCQkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpIGFjdGl2ZVZpZXdQYXJ0KQotCQkJCQkJCQkJLmdldFZpZXdlcigpOwotCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQkJCQllbGVtZW50cyksIHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCWFjdGlvbi5zZXRQcm9ncmVzc01vbml0b3IoZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkKLQkJCQkJLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCXJldHVybiBhY3Rpb247Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI2NyZWF0ZUN1dEFjdGlvbigpCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ3V0QWN0aW9uIGNyZWF0ZUN1dEFjdGlvbigpIHsKLQkJCXJldHVybiBuZXcgTGlicmFyeVZpZXdDdXRBY3Rpb24oKSB7Ci0JCQkJLyoqCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuRWxlbWVudHNWaWV3UGFzdGVBY3Rpb24jdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJCSAqLwotCQkJCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQkJaWYgKGxvY2tlZCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNjcmVhdGVDb3B5QWN0aW9uKCkKLQkJICovCi0JCXByb3RlY3RlZCBDb3B5QWN0aW9uIGNyZWF0ZUNvcHlBY3Rpb24oKSB7Ci0JCQlyZXR1cm4gbmV3IExpYnJhcnlWaWV3Q29weUFjdGlvbigpewotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCQlpZiggVmlld0hlbHBlci5oYXNDdXN0b21pemVkTG9ja2VyKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKSAmJiBsb2NrZWQgKXsJCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJCX0KLQkJCQkKLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI2NyZWF0ZVBhc3RlQWN0aW9uKCkKLQkJICovCi0JCXByb3RlY3RlZCBQYXN0ZUFjdGlvbiBjcmVhdGVQYXN0ZUFjdGlvbigpIHsKLQkJCUxpYnJhcnlWaWV3UGFzdGVBY3Rpb24gYWN0aW9uID0gbmV3IExpYnJhcnlWaWV3UGFzdGVBY3Rpb24oKSB7Ci0JCQkJLyoqCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuRWxlbWVudHNWaWV3UGFzdGVBY3Rpb24jdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJCSAqLwotCQkJCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQkJaWYgKGxvY2tlZCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCQl9Ci0JCQl9OwotCQkJYWN0aW9uLnNldFByb2dyZXNzTW9uaXRvcihnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKQotCQkJCQkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJcmV0dXJuIGFjdGlvbjsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjaGVja0xvY2tlZCgpIHsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCWJvb2xlYW4gd2FzTG9ja2VkID0gbG9ja2VkOwotLy8JCQkJbG9ja2VkID0gVmlld0hlbHBlci5pc0xvY2tlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JCQkJaWYoVmlld0hlbHBlci5oYXNDdXN0b21pemVkTG9ja2VyKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKSApewkJCQkJCi0JCQkJCWxvY2tlZCA9IFZpZXdIZWxwZXIuaXNMb2NrZWRXaXRoQ3VzdG9taXplZExvY2tlcigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7CQkJCQkKLQkJCQl9ZWxzZXsKLQkJCQkJbG9ja2VkID0gVmlld0hlbHBlci5pc0xvY2tlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JCQkJfQotCQkJCWlmICh3YXNMb2NrZWQgIT0gbG9ja2VkKSB7Ci0JCQkJCWRlbGV0ZUFjdGlvbi5zZXRFbmFibGVkKGRlbGV0ZUFjdGlvbgotCQkJCQkJCS51cGRhdGVTZWxlY3Rpb24oKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pKTsKLQkJCQkJY3V0QWN0aW9uLnNldEVuYWJsZWQoY3V0QWN0aW9uCi0JCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikpOwotCQkJCQlwYXN0ZUFjdGlvbi5zZXRFbmFibGVkKHBhc3RlQWN0aW9uCi0JCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikpOwotCQkJCQlib29sZWFuIGVuYWJsZWQgPSAhbG9ja2VkOwotCQkJCQlyZW5hbWVBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCQkJbW92ZUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXZvaWQgdXBkYXRlU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CQkJCi0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQotCQkJcmVuYW1lQWN0aW9uLnNldEFjdGl2ZVdvcmtiZW5jaFBhcnQoTGlicmFyeVZpZXcudGhpcyk7Ci0JCQljYW5SZW5hbWUgPSByZW5hbWVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHNlbCk7Ci0KLS8vCQkJbG9ja2VkID0gVmlld0hlbHBlci5pc0xvY2tlZChzZWwpOwotCQkJaWYoVmlld0hlbHBlci5oYXNDdXN0b21pemVkTG9ja2VyKHNlbCkgKXsJCQkJCQotCQkJCWxvY2tlZCA9IFZpZXdIZWxwZXIuaXNMb2NrZWRXaXRoQ3VzdG9taXplZExvY2tlcihzZWwpOwotCQkJfWVsc2V7Ci0JCQkJbG9ja2VkID0gVmlld0hlbHBlci5pc0xvY2tlZChzZWwpOwotCQkJfQotCQkJCi0JCQlib29sZWFuIGVuYWJsZWQgPSAhbG9ja2VkOwotCQkJaWYoY2FuUmVuYW1lICYmICFlbmFibGVkKSB7Ci0JCQkJcmVuYW1lQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQl9Ci0JCQltb3ZlQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0KLQkJCWNhbk1vdmUgPSBjYW5Nb3ZlKHNlbCk7Ci0KLQkJCWlmICghbG9ja2VkICYmIHNlbC5zaXplKCkgPT0gMQotCQkJCQkmJiBzZWwuZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJcmVwbGFjZUFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXBsYWNlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCi0JCQlpZiAoc2VsLnNpemUoKSA9PSAxKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikKLQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQkJb3BlblZhcmlhYmlsaXR5RGlhbG9nQWN0aW9uCi0JCQkJCQkuc2V0RW5hYmxlZChvYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQKLQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBvYmopKTsKLQkJCQlzaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbgotCQkJCQkJLnNldEVuYWJsZWQob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjZW5hYmxlR2xvYmFsRWRpdE1lbnUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZW5hYmxlR2xvYmFsRWRpdE1lbnUoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yI2FkZEdsb2JhbEFjdGlvbnMoSU1lbnVNYW5hZ2VyKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgYWRkR2xvYmFsQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJCXN1cGVyLmFkZEdsb2JhbEFjdGlvbnMobWVudU1hbmFnZXIpOwotCQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImZpeGVkLWFkZGl0aW9ucyIsIG5ld1BsdWdpbkFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBjYW5Nb3ZlKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkKLQkJCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkKLQkJCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikKLQkJCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JCQkJCQkmJiAhVG5nVXRpbC5pc1ByZWRlZmluZWQoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGRzIFNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMgdG8gdGhlIHRvb2wgYmFyLgotCQkgKi8KLQkJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLS8vCQkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoIm1ldGhvZC1zZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAotLy8JCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigibWV0aG9kLWFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJcGVyZm9ybUxpYnJhcnlWYWxpZGF0aW9uQWN0aW9uLnNldElkKFBFUkZPUk1fSUQpOwotCQkJaWYgKEF1dGhvcmluZ1VJUHJlZmVyZW5jZXMuZ2V0RW5hYmxlTGlicmFyeVZhbGlkYXRpb24oKSkgewotCQkJCXRvb2xCYXJNYW5hZ2VyLmFkZChwZXJmb3JtTGlicmFyeVZhbGlkYXRpb25BY3Rpb24pOwotCQkJfQotCQkJCi0JCX0KLQkJCi0JCS8qKgotCQkgKiBAc2VlIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQkJY2hlY2tMb2NrZWQoKTsKLQkJCQotCQkJCi0KLQkJCS8vIEFkZCBvdXIgc3RhbmRhcmQgbWFya2VyLgotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImZpeGVkLWFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImZpeGVkLWFkZGl0aW9ucy1lbmQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJlZGl0IikpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIEFkZCB0aGUgZWRpdCBtZW51IGFjdGlvbnMuCi0JCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0obGlicmFyeVZpZXdFZGl0QWN0aW9uKSk7Ci0JCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oY29weUFjdGlvbikpOwotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKHBhc3RlQWN0aW9uKSk7Ci0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShkZWxldGVBY3Rpb24pKTsKLQkJCWlmIChjYW5SZW5hbWUpIHsKLQkJCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0ocmVuYW1lQWN0aW9uKSk7Ci0JCQl9Ci0JCQlpZiAoY2FuTW92ZSkgewotCQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShtb3ZlQWN0aW9uKSk7Ci0JCQl9Ci0KLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJ2aWV3IikpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAob3BlblZhcmlhYmlsaXR5RGlhbG9nQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKAotCQkJCQkJb3BlblZhcmlhYmlsaXR5RGlhbG9nQWN0aW9uKSk7Ci0JCQl9Ci0JCQlpZiAoc2hvd0luUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oCi0JCQkJCQlzaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbikpOwotCQkJfQotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLQkJCS8vIEFkZCBvdXIgb3RoZXIgc3RhbmRhcmQgbWFya2VyIHdoZXJlIG90aGVyIHBsdWdpbnMgd2lsbCBjb250cmlidXRlCi0JCQkvLyBtZW51Ci0JCQkvLwotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucy1lbmQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJYWRkR2xvYmFsQWN0aW9ucyhtZW51TWFuYWdlcik7Ci0KLQkJCWlmICghbG9ja2VkKSB7Ci0JCQkJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBudWxsOwotCQkJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbSk7Ci0JCQkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOwotCQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZml4ZWQtYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLS8vCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb24oIlRlc3QiKSB7Ci0vLwkJCQkvKgotLy8JCQkJICogKG5vbi1KYXZhZG9jKQotLy8JCQkJICoKLS8vCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotLy8JCQkJICovCi0vLwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0vLwkJCQkJLy8gcmVsb2FkCi0vLwkJCQkJLy8KLS8vLy8JCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7Ci0vLy8vCQkJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLS8vLy8JCQkJCQlPYmplY3Qgb2JqZWN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotLy8vLwkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLS8vLy8JCQkJCQlvYmplY3QgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotLy8vLwkJCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpIHsKLS8vLy8JCQkJCQkJSW50ZXJuYWxFT2JqZWN0IGUgPSAoKEludGVybmFsRU9iamVjdCkgb2JqZWN0KTsKLS8vLy8JCQkJCQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IChJTGlicmFyeVJlc291cmNlU2V0KSBlCi0vLy8vCQkJCQkJCS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotLy8vLwkJCQkJCQlyZXNvdXJjZVNldC51bmxvYWQoZSk7Ci0vLy8vCQkJCQkJCVVSSSB1cmkgPSBlLmVQcm94eVVSSSgpOwotLy8vLwkJCQkJCQlFT2JqZWN0IG5ld09iamVjdCA9IHJlc291cmNlU2V0LmdldEVPYmplY3QoZSwgdXJpLAotLy8vLwkJCQkJCQkJCXRydWUpOwotLy8vLwkJCQkJCQlyZWZyZXNoVmlld3MoKTsKLS8vLy8JCQkJCQl9Ci0vLy8vCQkJCQl9Ci0vLwkJCQkJCi0vLwkJCQkJLy8gcGx1Z2luL2NvbmZpZyBmb2xkZXIKLS8vCQkJCQkvLwotLy8JCQkJCUlMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCk7Ci0vLwkJCQkJaWYocGVyc2lzdGVyIGluc3RhbmNlb2YgSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpIHsKLS8vCQkJCQkJSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgZmlsZVBlcnNpc3RlciA9IChJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcikgcGVyc2lzdGVyOwotLy8JCQkJCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0vLwkJCQkJCXRyeSB7Ci0vLwkJCQkJCQlGaWxlIGZpbGUgPSBmaWxlUGVyc2lzdGVyLmNyZWF0ZU1ldGhvZFBsdWdpbkZvbGRlcigicGx1Z2luMTAwIiwgbGlicmFyeSk7Ci0vLwkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInBsdWdpbiBkaXI6ICIgKyBmaWxlKTsKLS8vCQkJCQkJfQotLy8JCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotLy8JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQkJCQkJfQotLy8JCQkJCQl0cnkgewotLy8JCQkJCQkJRmlsZSBmaWxlID0gZmlsZVBlcnNpc3Rlci5nZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihsaWJyYXJ5KTsKLS8vCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY29uZmlnIGRpcjogIiArIGZpbGUpOwotLy8JCQkJCQl9Ci0vLwkJCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9KTsKLQkJCQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI3JlZnJlc2hWaWV3ZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIpCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlld2VyKGZpbmFsIFZpZXdlciB2aWV3ZXIpIHsKLQkJCWlmICh2aWV3ZXIgPT0gTGlicmFyeVZpZXcudGhpcy5nZXRWaWV3ZXIoKSkgewotCQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCW1vbml0b3IKLQkJCQkJCQkJLnN1YlRhc2soQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtKTsKLQkJCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQkvLyBSZWZyZXNoIGFsbCBsb2FkZWQgcmVzb3VyY2VzIGFuZCBsb2FkIG5ld2x5IGFkZGVkIHJlc291cmNlcwotCQkJCQkJCS8vCi0JCQkJCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQkJCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG1hbmFnZXIKLQkJCQkJCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJCQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXQgbGliUmVzb3VyY2VTZXQ7Ci0JCQkJCQkJCWlmIChyZXNvdXJjZVNldCBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2VTZXQKLQkJCQkJCQkJCQkmJiAobGliUmVzb3VyY2VTZXQgPSAoSUxpYnJhcnlSZXNvdXJjZVNldCkgcmVzb3VyY2VTZXQpCi0JCQkJCQkJCQkJCQkuZ2V0UGVyc2lzdGVuY2VUeXBlKCkKLQkJCQkJCQkJCQkJCS5lcXVhbHMoCi0JCQkJCQkJCQkJCQkJCVNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFKSkgewotCQkJCQkJCQkJCi0JCQkJCQkJCQlsaWJSZXNvdXJjZVNldC5sb2FkTmV3UmVzb3VyY2VzKCk7Ci0JCQkJCQkJCQkKLQkJCQkJCQkJCUxpc3QgcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJCUxpc3QgY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3QoCi0JCQkJCQkJCQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlcygpKQotCQkJCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIKLQkJCQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCQkJU3RyaW5nIGxvYyA9IHJlc291cmNlLmdldFVSSSgpCi0JCQkJCQkJCQkJCQkudG9GaWxlU3RyaW5nKCk7Ci0JCQkJCQkJCQkJSVJlc291cmNlIHdzUmVzID0gRmlsZU1hbmFnZXIKLQkJCQkJCQkJCQkJCS5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKGxvYyk7Ci0JCQkJCQkJCQkJaWYgKHdzUmVzID09IG51bGwpIHsKLQkJCQkJCQkJCQkJcmVtb3ZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCQkJCX0gZWxzZSBpZiAoIXdzUmVzCi0JCQkJCQkJCQkJCQkuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKSB7Ci0JCQkJCQkJCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQltb25pdG9yLndvcmtlZCgyKTsKLQkJCQkJCQkJCWlmIChyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKQotCQkJCQkJCQkJCQkmJiBjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCQkJCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCWRvUmVmcmVzaChyZW1vdmVkUmVzb3VyY2VzLAotCQkJCQkJCQkJCQkJY2hhbmdlZFJlc291cmNlcywgbnVsbCwgZmFsc2UpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX07Ci0JCQkJSVJ1bm5hYmxlQ29udGV4dCBjb250ZXh0ID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaXRlKCkKLQkJCQkJCS5nZXRTaGVsbCgpKTsKLQkJCQl0cnkgewotCQkJCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCQkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkucnVuSW5VSShjb250ZXh0LCBydW5uYWJsZSwKLQkJCQkJCQkJCW51bGwpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JUaXRsZTsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQl0aXRsZSwgZS50b1N0cmluZygpLCBlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJc3VwZXIucmVmcmVzaFZpZXdlcih2aWV3ZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkFic3RyYWN0QmFzZVZpZXcjY3JlYXRlQWN0aW9uQmFyQ29udHJpYnV0b3IoKQotCSAqLwotCXB1YmxpYyBJTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIGNyZWF0ZUFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgewotCQlJTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIGFjdGlvbkJhciA9IG5ldyBMaWJyYXJ5Vmlld0FjdGlvbkJhckNvbnRyaWJ1dG9yKAotCQkJCWVkaXRpbmdEb21haW4pOwotCQlyZXR1cm4gYWN0aW9uQmFyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I2NyZWF0ZUNvbnRleHRNZW51Rm9yKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250ZXh0TWVudUZvcihmaW5hbCBTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgewotCQlzdXBlci5jcmVhdGVDb250ZXh0TWVudUZvcih2aWV3ZXIpOwotCQlpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTElOSzsKLQkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IEhUTUxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLAotCQkJCVRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLCBMb2NhbFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsKLQkJdmlld2VyLmFkZERyYWdTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywKLQkJCQluZXcgTGlicmFyeVZpZXdlckRyYWdBZGFwdGVyKHZpZXdlcikpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I21lbnVBYm91dFRvU2hvdyhvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJc3VwZXIubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1NpdGUgc2l0ZSkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJc3VwZXIuaW5pdChzaXRlKTsKLQkKLQkJLy8gYWRkIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmb3IgbGlicmFyeSB2YWxpZGF0aW9uIHByZWZlcmVuY2UKLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlpZiAoZXZlbnQKLQkJCQkJCQkJLmdldFByb3BlcnR5KCkKLQkJCQkJCQkJLmVxdWFscygKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVByZWZlcmVuY2VzLkVOQUJMRV9MSUJSQVJZX1ZBTElEQVRJT04pKSB7Ci0JCQkJCQkJQm9vbGVhbiBlbmFibGVkID0gKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQkJSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyID0gZ2V0Vmlld1NpdGUoKQotCQkJCQkJCQkuZ2V0QWN0aW9uQmFycygpLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCQkJCQotCQkJCQkJCWlmIChlbmFibGVkICE9IG51bGwgJiYgZW5hYmxlZC5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJCQlwZXJmb3JtTGlicmFyeVZhbGlkYXRpb25BY3Rpb24KLQkJCQkJCQkJCQkuc2V0SWQoUEVSRk9STV9JRCk7Ci0JCQkJCQkJCXRvb2xCYXJNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMiLCBwZXJmb3JtTGlicmFyeVZhbGlkYXRpb25BY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IHRvb2xCYXJNYW5hZ2VyLmdldEl0ZW1zKCk7Ci0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSAoSUNvbnRyaWJ1dGlvbkl0ZW0pIGl0ZW1zW2ldOwotCQkJCQkJCQkJaWYgKGl0ZW0uZ2V0SWQoKS5lcXVhbHMoUEVSRk9STV9JRCkpCi0JCQkJCQkJCQkJdG9vbEJhck1hbmFnZXIucmVtb3ZlKGl0ZW0pOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCXRvb2xCYXJNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRSZWZyZXNoSGFuZGxlcihudWxsKTsKLQotCQlpZiAoZkxheW91dEFjdGlvblNldCAhPSBudWxsKQkKLQkJCWZMYXlvdXRBY3Rpb25TZXQuZGlzcG9zZSgpOwotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGRvdWJsZUNsaWNrTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJdHJlZVZpZXdlci5yZW1vdmVEb3VibGVDbGlja0xpc3RlbmVyKGRvdWJsZUNsaWNrTGlzdGVuZXIpOwotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIEl0ZW1Qcm92aWRlcgotCSAqIEByZXR1cm4gUHJvY2Vzc0NvbXBvbmVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG9iagotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50IGdldFByb2Nlc3NDb21wb25lbnQoT2JqZWN0IG9iaikgewotCQlPYmplY3QgcGFyZW50OwotCQlmb3IgKHBhcmVudCA9IG9iajsgKHBhcmVudCAhPSBudWxsICYmICEocGFyZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkpOykgewotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChwYXJlbnQpOwotCQl9Ci0JCXJldHVybiAoUHJvY2Vzc0NvbXBvbmVudCkgcGFyZW50OwotCX0KLQotCXByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIFN0YXR1c1dvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBleHRlbmRzCi0JCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gewotCi0JCXByb3RlY3RlZCBTdHJpbmcgZXJyTXNnOwotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQkJcmV0dXJuIGVyck1zZzsKLQkJfQotCX0KLQotCS8qKgotCSAqIG9wZW5zIGEgTWV0aG9kIExpYnJhcnkKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgcGF0aCB0byB0aGUgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIG9wZW5MaWJyYXJ5KGZpbmFsIFN0cmluZyBwYXRoKSB7Ci0JCS8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24gYmVjYXVzZSB0aGlzIGlzIGEgbG9uZyBydW5uaW5nCi0JCS8vIGFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgdGhlIHdvcmtiZW5jaC4KLQkJU3RhdHVzV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBTdGF0dXNXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0KLQkJCS8vIFRoaXMgaXMgdGhlIG1ldGhvZCB0aGF0IGdldHMgaW52b2tlZCB3aGVuIHRoZSBvcGVyYXRpb24gcnVucy4KLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soQXV0aG9yaW5nVUlSZXNvdXJjZXMub3BlbmluZ0xpYnJhcnlUYXNrX25hbWUsCi0JCQkJCQkyKTsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jbG9zZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IFhNSUxpYnJhcnlVdGlsCi0JCQkJCQkJLm9wZW5NZXRob2RMaWJyYXJ5KHBhdGgpOwotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldEN1cnJlbnRNZXRob2RMaWJyYXJ5KAotCQkJCQkJCWxpYnJhcnkpOwotCQkJCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5zZXRTYXZlZExpYnJhcnlQYXRoKHBhdGgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlpZiAoZXggaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikgewotCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBleC5nZXRNZXNzYWdlKCk7Ci0JCQkJCQlpZiAobWVzc2FnZS5zdGFydHNXaXRoKCIjIyMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIHByb2plY3RGaWxlTmFtZSA9IG1lc3NhZ2Uuc3Vic3RyaW5nKDMpOwotCQkJCQkJCVN0cmluZyBwcm9tcHQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3XzM1LAotCQkJCQkJCQkJKG5ldyBPYmplY3RbXSB7IHByb2plY3RGaWxlTmFtZSB9KSk7Ci0JCQkJCQkJaWYgKE1zZ0JveC5wcm9tcHQocHJvbXB0LCBTV1QuUkVUUlkgfCBTV1QuQ0FOQ0VMKSA9PSBTV1QuUkVUUlkpIHsKLQkJCQkJCQkJb3BlbkxpYnJhcnkocGF0aCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX21zZywKLQkJCQkJCQkJCQlleCk7Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCS8vIFRoaXMgcnVucyB0aGUgb3B0aW9ucywgYW5kIHNob3dzIHByb2dyZXNzLgotCQkJbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSkucnVuKHRydWUsIGZhbHNlLAotCQkJCQlvcGVyYXRpb24pOwotCQkJaWYgKG9wZXJhdGlvbi5nZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsKSB7Ci0JCQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUFsbEVkaXRvcnMoZmFsc2UpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkFic3RyYWN0QmFzZVZpZXcjaGFuZGxlQWN0aXZhdGUob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGUoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlzdXBlci5oYW5kbGVBY3RpdmF0ZShwYXJ0KTsKLQotCQkvLyBUT0RPOiBSZXZpZXcgaW1wbGVtZW50YXRpb24uCi0JCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBtZXRob2QgbGlicmFyeSBvcGVuIGlzIG5vdCBjbG9zZWQuCi0JCVhNSUxpYnJhcnlVdGlsLm9wZW5NZXRob2RMaWJyYXJ5UHJvamVjdChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpCi0JCQkJLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5TYXZlYWJsZUxpYnJhcnlWaWV3UGFydCNpc1NhdmVBc0FsbG93ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJLy8gVGhpcyB2aWV3IHNob3VsZCBub3QgcGFydGljaXBhdGUgaW4gYWxsIHRoZSBzYXZlIGNvbW1hbmRzLgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlNhdmVhYmxlTGlicmFyeVZpZXdQYXJ0I2RvU2F2ZUFzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQl9Ci0JCi0JLyoqCi0JICogVXNlZCBieSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlua1dpdGhFZGl0b3IgR2l2ZW4gYW4KLQkgKiBvYmplY3QgdGhhdCBpcyBhIE1ldGhvZEVsZW1lbnQsIHNlbGVjdHMgdGhhdCBvYmplY3QgaW4gdGhlIExpYiBOYXYKLQkgKiAKLQkgKiBAcGFyYW0gbwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblRvVmlld2VyKE9iamVjdCBvYmplY3QpIHsKLQkJT2JqZWN0IG8gPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlpZiAoIShvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkpCi0JCQlyZXR1cm47Ci0JCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJc3VwZXIuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10geyBvIH0pKTsKLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChNZXRob2RFbGVtZW50KSBvKTsKLQotCQkJTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIHBsdWdpbkFkYXB0ZXIgPSAoTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJCS5nZXRBZGFwdGVyKHBsdWdpbiwgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQotCQkJTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciBsaWJyYXJ5QWRhcHRlciA9IChNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJCS5nZXRBZGFwdGVyKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0KLQkJCS8vIGV4cGFuZCBwbHVnaW4gcGFja2FnZXMKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgcGx1Z2luVHJlZUFkYXB0ZXIgPSBsaWJyYXJ5QWRhcHRlci5nZXRQbHVnaW5JdGVtUHJvdmlkZXIocGx1Z2luKTsKLQkJCXdoaWxlIChwbHVnaW5UcmVlQWRhcHRlciBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUocGx1Z2luVHJlZUFkYXB0ZXIsIHRydWUpOwotCQkJCXBsdWdpblRyZWVBZGFwdGVyID0gKChQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKXBsdWdpblRyZWVBZGFwdGVyKS5nZXRQbHVnaW5JdGVtUHJvdmlkZXIocGx1Z2luKTsKLQkJCX0KLQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShwbHVnaW4sIHRydWUpOwotCi0JCQkKLQkJCWlmIChvIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewkJCQkKLQkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpbyk7Ci0JCQkJaWYocHJvYyAhPSBudWxsKSB7Ci0JCQkJCW8gPSBwcm9jLmVDb250YWluZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQgfHwgbyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0KLQkJCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUocGx1Z2luQWRhcHRlci5nZXRDaGlsZHJlbihwbHVnaW4pCi0JCQkJCQkudG9BcnJheSgpWzFdLCB0cnVlKTsKLQkJCQkvLyBFeHBhbmQgdGhlIHByb2Nlc3MgcGFja2FnZXMuCi0JCQkJZXhwYW5kVHJlZVZpZXdlclBhY2thZ2VzKCgoTWV0aG9kRWxlbWVudCkgbykuZUNvbnRhaW5lcigpKTsKLQotCQkJfSBlbHNlIHsKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgbWV0aG9kQ29udGVudFBrZyA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHBsdWdpbkFkYXB0ZXIKLQkJCQkJCS5nZXRDaGlsZHJlbihwbHVnaW4pLnRvQXJyYXkoKVswXTsKLQkJCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUobWV0aG9kQ29udGVudFBrZywgdHJ1ZSk7Ci0KLQkJCQlpZiAobyBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7CQkJCQkKLQkJCQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdENDID0gVG5nVXRpbAotCQkJCQkJCS5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkocGx1Z2luKTsKLQkJCQkJCQkJCQkKLQkJCQkJLy8gZmluZCB0aGUgdHJlZSBwYXRoIHRvIHRoZSBjdXN0b20gY2F0ZWdvcnkgZnJvbSB0aGUgcm9vdCBjdXN0b20gY2F0ZWdvcnkKLQkJCQkJLy8KLQkJCQkJZmluYWwgTGlzdDxPYmplY3Q+IHRyZWVQYXRoID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQkJCWZvcihDdXN0b21DYXRlZ29yeSBjYyA9IChDdXN0b21DYXRlZ29yeSkgbzsgY2MgIT0gcm9vdENDOykgewotCQkJCQkJdHJlZVBhdGguYWRkKDAsIGNjKTsKLQkJCQkJCWNjID0gKEN1c3RvbUNhdGVnb3J5KSBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKGNjKS5nZXQoMCk7CQkJCQkJIAotCQkJCQl9Ci0JCQkJCQotCQkJCQlvID0gZXhwYW5kVHJlZShyb290Q0MsIHRyZWVQYXRoKTsKLQkJCQkJCi0JCQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQkJCU9iamVjdCBzdGRDYXRzID0gbWV0aG9kQ29udGVudFBrZy5nZXRDaGlsZHJlbihvKS50b0FycmF5KClbMV07Ci0JCQkJCQkJCQotCQkJCQkvLyBmaW5kIHRoZSB0cmVlIHBhdGggdG8gdGhlIGNhdGVnb3J5IGZyb20gdGhlIHJvb3QgIlN0YW5kYXJkIENhdGVnb3JpZXMiIGNhdGVnb3J5Ci0JCQkJCS8vCi0JCQkJCWZpbmFsIExpc3Q8T2JqZWN0PiB0cmVlUGF0aCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCQkJCS8vIGRpc2NpcGxpbmVzIGNhbiBuZXN0Ci0JCQkJCQlPYmplY3QgZGlzID0gbzsKLQkJCQkJCWRvIHsKLQkJCQkJCQl0cmVlUGF0aC5hZGQoMCwgZGlzKTsKLQkJCQkJCQlMaXN0IHBhcmVudERpc2MgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lKChEaXNjaXBsaW5lKWRpcyk7Ci0JCQkJCQkJaWYgKHBhcmVudERpc2MuaXNFbXB0eSgpKSBicmVhazsKLQkJCQkJCQlkaXMgPSBwYXJlbnREaXNjLmdldCgwKTsJCQkJCQkgCi0JCQkJCQl9IHdoaWxlICh0cnVlKTsKLQkJCQkJCS8vIGdldCBkaXNjaXBsaW5lIGdyb3VwCi0JCQkJCQlpZiAoIUFzc29jaWF0aW9uSGVscGVyLmdldERpc2NpcGxpbmVHcm91cHMoKERpc2NpcGxpbmUpZGlzKS5pc0VtcHR5KCkpIHsKLQkJCQkJCQlEaXNjaXBsaW5lR3JvdXBpbmcgZGcgPSAoRGlzY2lwbGluZUdyb3VwaW5nKSBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lR3JvdXBzKChEaXNjaXBsaW5lKWRpcykuZ2V0KDApOwotCQkJCQkJCXRyZWVQYXRoLmFkZCgwLCBkZyk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBnZXQgIkRpc2NpcGxpbmVzIgotCQkJCQkJdHJlZVBhdGguYWRkKDAsIFRuZ1V0aWwuZ2V0RGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIocGx1Z2luKSk7Ci0JCQkJCQlvID0gZXhwYW5kVHJlZShzdGRDYXRzLCB0cmVlUGF0aCk7Ci0JCQkJCX0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIFJvbGVTZXQpIHsKLQkJCQkJCS8vIHJvbGVzZXRzIGNhbm5vdCBuZXN0Ci0JCQkJCQl0cmVlUGF0aC5hZGQoMCwgbyk7Ci0JCQkJCQlSb2xlU2V0R3JvdXBpbmcgcnNnID0gKFJvbGVTZXRHcm91cGluZykgQXNzb2NpYXRpb25IZWxwZXIuZ2V0Um9sZVNldEdyb3VwcygoUm9sZVNldClvKS5nZXQoMCk7CQkJCQkJIAotCQkJCQkJdHJlZVBhdGguYWRkKDAsIHJzZyk7Ci0JCQkJCQkvLyBnZXQgIlJvbGVTZXRzIgotCQkJCQkJdHJlZVBhdGguYWRkKDAsIFRuZ1V0aWwuZ2V0Um9sZVNldHNJdGVtUHJvdmlkZXIocGx1Z2luKSk7Ci0JCQkJCQlvID0gZXhwYW5kVHJlZShzdGRDYXRzLCB0cmVlUGF0aCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUoc3RkQ2F0cywgdHJ1ZSk7Ci0JCQkJCX0KLQotCQkJCX0gZWxzZSB7Ci0JCQkJCU9iamVjdCBjb3JlQ29udGVudCA9IG1ldGhvZENvbnRlbnRQa2cuZ2V0Q2hpbGRyZW4obykKLQkJCQkJCQkudG9BcnJheSgpWzBdOwotCQkJCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUoY29yZUNvbnRlbnQsIHRydWUpOwotCi0JCQkJCS8vIEV4cGFuZCB0aGUgY29udGVudCBwYWNrYWdlcy4KLQkJCQkJZXhwYW5kVHJlZVZpZXdlclBhY2thZ2VzKCgoTWV0aG9kRWxlbWVudCkgbykuZUNvbnRhaW5lcigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJfQotCi0JCXN1cGVyLnNldFNlbGVjdGlvblRvVmlld2VyKEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHsgbyB9KSk7Ci0KLQkJaWYobyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQgJiYgb2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJLy8gb3BlbiB0aGUgcHJvY2VzcyBpbiBpdHMgZWRpdG9yIGFuZCBzZWxlY3QgdGhlIGJyZWFrZG93biBlbGVtZW50Ci0JCQkvLwotCQkJSUVkaXRvcktlZXBlci5SRUZFUkVOQ0UuZ2V0RWRpdG9yS2VlcGVyKCkub3BlbkVkaXRvcihvKTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IGdldFNpdGUoKS5nZXRQYWdlKCkuZmluZEVkaXRvcihuZXcgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KChNZXRob2RFbGVtZW50KSBvKSk7Ci0JCQlpZihlZGl0b3IgaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9yKSB7Ci0JCQkJUHJvY2Vzc0VkaXRvciBwcm9jRWRpdG9yID0gKChQcm9jZXNzRWRpdG9yKWVkaXRvcik7Ci0JCQkJU3RyaW5nIHBhZ2VJZDsKLQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvciB8fCBvYmplY3QgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCQlwYWdlSWQgPSBQcm9jZXNzRWRpdG9yLlRBX0ZPUk1fSUQ7Ci0JCQkJfQotCQkJCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCXBhZ2VJZCA9IFByb2Nlc3NFZGl0b3IuV1BCU19GT1JNX0lEOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcGFnZUlkID0gUHJvY2Vzc0VkaXRvci5XQlNfRk9STV9JRDsKLQkJCQl9Ci0JCQkJcHJvY0VkaXRvci5zZXRBY3RpdmVQYWdlKHBhZ2VJZCk7Ci0JCQkJcHJvY0VkaXRvci5zZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG9iamVjdCkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgT2JqZWN0IGV4cGFuZFRyZWUoT2JqZWN0IHJvb3QsIExpc3QgdHJlZVBhdGgpIHsKLQkJT2JqZWN0IHBhcmVudCA9IHJvb3Q7Ci0JCWludCBzaXplID0gdHJlZVBhdGguc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJT2JqZWN0IGUgPSB0cmVlUGF0aC5nZXQoaSk7Ci0JCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUocGFyZW50LCB0cnVlKTsKLQkJCS8vIGdldCB3cmFwcGVyCi0JCQkvLwotCQkJTGlzdCBub3RpZnlDaGFuZ2VkTGlzdGVuZXJzID0gVG5nVXRpbC5nZXROb3RpZnlDaGFuZ2VkTGlzdGVuZXJzKGFkYXB0ZXJGYWN0b3J5LCBlKTsKLQkJCWlmICghbm90aWZ5Q2hhbmdlZExpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCQlmaW5kX3dyYXBwZXI6Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbGlzdGVuZXIgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmKGxpc3RlbmVyIGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCQkJCSYmIFRuZ1V0aWwudW53cmFwKGxpc3RlbmVyKSA9PSBlKSB7Ci0JCQkJCQlGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikgbGlzdGVuZXI7Ci0JCQkJCQlmb3IoO3dyYXBwZXIgIT0gbnVsbCAmJiB3cmFwcGVyLmdldE93bmVyKCkgIT0gcGFyZW50OyAKLQkJCQkJCQl3cmFwcGVyID0gVG5nVXRpbC5nZXRXcmFwcGVyKHdyYXBwZXIuZ2V0Tm90aWZ5Q2hhbmdlZExpc3RlbmVycygpLCBlKSkgewkJCQkJCQkJCQotCQkJCQkJfQotCQkJCQkJaWYod3JhcHBlciAhPSBudWxsKSB7Ci0JCQkJCQkJcGFyZW50ID0gd3JhcHBlcjsKLQkJCQkJCQlicmVhayBmaW5kX3dyYXBwZXI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXBhcmVudCA9IGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhcmVudDsKLQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZXhwYW5kVHJlZVZpZXdlclBhY2thZ2VzKEVPYmplY3QgZSkgewotCQlpZiAoZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlIHx8IGUgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJZXhwYW5kVHJlZVZpZXdlclBhY2thZ2VzKGUuZUNvbnRhaW5lcigpKTsKLQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShlLCB0cnVlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuSVJlZnJlc2hIYW5kbGVyI3JlZnJlc2gob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaChmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJQ29udHJvbCBjdHJsID0gZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpOwotCQlpZiAoY3RybCA9PSBudWxsIHx8IGN0cmwuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0JCWlmIChjdHJsLmdldERpc3BsYXkoKS5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7Ci0JCQlkb1JlZnJlc2goZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQl9IGVsc2UgewotCQkJY3RybC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlkb1JlZnJlc2gobnVsbCk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGJsb2NraW5nUmVmcmVzaChmaW5hbCBBcnJheUxpc3QgcmVtb3ZlZFJlc291cmNlcywKLQkJCWZpbmFsIEFycmF5TGlzdCBjaGFuZ2VkUmVzb3VyY2VzLAotCQkJZmluYWwgQ29sbGVjdGlvbiBhZGRlZFdvcmtzcGFjZVJlc291cmNlcywKLQkJCWZpbmFsIGJvb2xlYW4gcmVmcmVzaFZpZXdzLCBTaGVsbCBzaGVsbCkgewotCQlmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCQkJbW9uaXRvcgotCQkJCQkJLnN1YlRhc2soQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtKTsKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl0cnkgewotCQkJCQkvLyBtb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJZG9SZWZyZXNoKHJlbW92ZWRSZXNvdXJjZXMsIGNoYW5nZWRSZXNvdXJjZXMsCi0JCQkJCQkJYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMsIHJlZnJlc2hWaWV3cyk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0KLQkJSVJ1bm5hYmxlQ29udGV4dCBjb250ZXh0ID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCk7Ci0JCXRyeSB7Ci0JCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkKLQkJCQkJLnJ1bkluVUkoCi0JCQkJCQkJY29udGV4dCwKLQkJCQkJCQlydW5uYWJsZSwKLQkJCQkJCQluZXcgTGlicmFyeVNjaGVkdWxpbmdSdWxlKExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlOwotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwKLQkJCQkJZS50b1N0cmluZygpLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE11c3QgYmUgc3luY2hyb25pemVkIHRvIGF2b2lkIHN0ZXBwaW5nIG9uIGVhY2ggb3RoZXIgaW4gcmVsb2FkaW5nCi0JICogcmVzb3VyY2VzL3JlZnJlc2hpbmcgVUkKLQkgKiAKLQkgKiBAcGFyYW0gcmVtb3ZlZFJlc291cmNlcwotCSAqIEBwYXJhbSBjaGFuZ2VkUmVzb3VyY2VzCi0JICogQHBhcmFtIGFkZGVkV29ya3NwYWNlUmVzb3VyY2VzCi0JICogICAgICAgICAgICBjb2xsZWN0aW9uIG9mIElSZXNvdXJjZSBvYmplY3RzIHRoYXQgYXJlIGp1c3QgbmV3bHkgYWRkZWQgdG8KLQkgKiAgICAgICAgICAgIHRoZSBsaWJyYXJ5Ci0JICogQHBhcmFtIHJlZnJlc2hWaWV3cwotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgZG9SZWZyZXNoKENvbGxlY3Rpb24gcmVtb3ZlZFJlc291cmNlcywKLQkJCUNvbGxlY3Rpb24gY2hhbmdlZFJlc291cmNlcywgQ29sbGVjdGlvbiBhZGRlZFdvcmtzcGFjZVJlc291cmNlcywKLQkJCWJvb2xlYW4gcmVmcmVzaFZpZXdzKSB7Ci0JCUhhc2hTZXQgZWRpdG9yc1RvUmVmcmVzaCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCWhhbmRsZVJlbW92ZWRSZXNvdXJjZXMocmVtb3ZlZFJlc291cmNlcywgZWRpdG9yc1RvUmVmcmVzaCk7Ci0JCQlyZWZyZXNoVmlld3MgPSB0cnVlOwotCQl9Ci0JCWlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCWhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlcywgZWRpdG9yc1RvUmVmcmVzaCwKLQkJCQkJcmVmcmVzaFZpZXdzKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChyZWZyZXNoVmlld3MpIHsKLQkJCQlyZWZyZXNoVmlld3MoKTsKLQkJCX0KLQotCQkJaWYgKCFlZGl0b3JzVG9SZWZyZXNoLmlzRW1wdHkoKSkgewotCQkJCS8vIHJlZnJlc2ggdGhlIGVkaXRvcnMgdGhhdCBoYW5kbGVSZW1vdmVkUmVzb3VyY2VzIHJlcXVlc3RlZAotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWRpdG9yc1RvUmVmcmVzaC5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWRpdG9yID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yKSB7Ci0JCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChhZGRlZFdvcmtzcGFjZVJlc291cmNlcyAhPSBudWxsCi0JCQkJJiYgIWFkZGVkV29ya3NwYWNlUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJSUxpYnJhcnlNYW5hZ2VyIG1nciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJaWYgKG1nciAhPSBudWxsKSB7Ci0JCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBtZ3IuZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHsKLQkJCQkJKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHJlc291cmNlU2V0KQotCQkJCQkJCS5sb2FkTmV3UmVzb3VyY2VzKGFkZGVkV29ya3NwYWNlUmVzb3VyY2VzKTsKLQkJCQkJKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHJlc291cmNlU2V0KS5nZXRVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyKCkudmFsaWRhdGVBbGxNYXJrZXJzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmlld09iamVjdChPYmplY3QgbykgewotCQlyZXR1cm4gbyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkmJiAhKG8gaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24KLQkJCQkJCXx8IG8gaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCB8fCAobyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlICYmIFVtYVV0aWwKLQkJCQkJCS5nZXRQcm9jZXNzQ29tcG9uZW50KChNZXRob2RFbGVtZW50KSBvKSA9PSBudWxsKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvUmVmcmVzaChJUmVmcmVzaEV2ZW50IGV2ZW50LCBTaGVsbCBzaGVsbCkgewotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIlJlZnJlc2hlZCBvYmplY3RzOiAiICsgZXZlbnQuZ2V0UmVmcmVzaGVkT2JqZWN0cygpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gcmVmcmVzaCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBldmVudC5nZXRSZWZyZXNoZWRPYmplY3RzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGlzVmlld09iamVjdChlKSkgewotCQkJCXJlZnJlc2ggPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChyZWZyZXNoKSB7Ci0JCQlyZWZyZXNoVmlld3MoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlZnJlc2hlcyB0aGUgTGlicmFyeSBWaWV3Ci0JICogCi0JICogQHBhcmFtIHNoZWxsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvUmVmcmVzaChTaGVsbCBzaGVsbCkgewotCQlmaW5hbCBib29sZWFuIHJlZnJlc2hWaWV3cyA9ICFSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UmVsb2FkZWRCZWZvcmVSZWZyZXNoUmVzb3VyY2VzKCkuaXNFbXB0eSgpCi0JCQkJfHwgIVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRBZGRlZFJlc291cmNlcygpLmlzRW1wdHkoKTsKLQkJQXJyYXlMaXN0IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRSZW1vdmVkUmVzb3VyY2VzKCkpOwotCQlBcnJheUxpc3QgY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7Ci0JCUFycmF5TGlzdCBhZGRlZFdzUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdChSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0QWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMoKSk7Ci0KLQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSB8fCAhY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkKLQkJCQl8fCAhYWRkZWRXc1Jlc291cmNlcy5pc0VtcHR5KCkgfHwgcmVmcmVzaFZpZXdzKSB7Ci0JCQlibG9ja2luZ1JlZnJlc2gocmVtb3ZlZFJlc291cmNlcywgY2hhbmdlZFJlc291cmNlcywKLQkJCQkJYWRkZWRXc1Jlc291cmNlcywgcmVmcmVzaFZpZXdzLCBzaGVsbCk7Ci0JCX0KLQotCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0UmVtb3ZlZFJlc291cmNlcygpLnJlbW92ZUFsbCgKLQkJCQkJcmVtb3ZlZFJlc291cmNlcyk7Ci0JCX0KLQkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldENoYW5nZWRSZXNvdXJjZXMoKS5yZW1vdmVBbGwoCi0JCQkJCWNoYW5nZWRSZXNvdXJjZXMpOwotCQl9Ci0JCWlmICghYWRkZWRXc1Jlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRBZGRlZFdvcmtzcGFjZVJlc291cmNlcygpLnJlbW92ZUFsbCgKLQkJCQkJYWRkZWRXc1Jlc291cmNlcyk7Ci0JCX0KLQkJaWYgKHJlZnJlc2hWaWV3cykgewotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcygpCi0JCQkJCS5jbGVhcigpOwotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldEFkZGVkUmVzb3VyY2VzKCkuY2xlYXIoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZW1vdmVkUmVzb3VyY2VzMgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiBoYW5kbGVSZW1vdmVkUmVzb3VyY2VzKENvbGxlY3Rpb24gcmVtb3ZlZFJlc291cmNlcywKLQkJCUNvbGxlY3Rpb24gZWRpdG9yc1RvUmVmcmVzaCkgewotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJQXJyYXlMaXN0IGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQXJyYXlMaXN0IHJlbW92ZWRSZXNvdXJjZUxpc3QgPSBuZXcgQXJyYXlMaXN0KHJlbW92ZWRSZXNvdXJjZXMpOwotCQlpZiAoZWRpdG9yc1RvUmVmcmVzaCA9PSBudWxsKSB7Ci0JCQllZGl0b3JzVG9SZWZyZXNoID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCS8vIGZpbmQgYWxsIGVkaXRvciB3aXRoIGRpcnR5IGNvbmZsaWN0Ci0JCS8vCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yICYmIGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQlNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgaW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBlZGl0b3IKLQkJCQkJCS5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCVJlc291cmNlIHJlc291cmNlID0gaW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpICE9IG51bGwgPyBpbnB1dAotCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoKS5lUmVzb3VyY2UoKSA6IG51bGw7Ci0JCQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmNvbnRhaW5zKHJlc291cmNlKSkgewotCQkJCQlDb2xsZWN0aW9uIHVzZWRSZXNvdXJjZXMgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikKLQkJCQkJCQkuZ2V0VXNlZFJlc291cmNlcygpOwotCQkJCQljaGVja19yZXNvdXJjZTogZm9yIChpbnQgaiA9IDA7IGogPCByZW1vdmVkUmVzb3VyY2VMaXN0Ci0JCQkJCQkJLnNpemUoKTsgaisrKSB7Ci0JCQkJCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgcmVtb3ZlZFJlc291cmNlTGlzdC5nZXQoaik7Ci0JCQkJCQlpZiAodXNlZFJlc291cmNlcy5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJCQlkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QuYWRkKGVkaXRvcik7Ci0JCQkJCQkJYnJlYWsgY2hlY2tfcmVzb3VyY2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQllZGl0b3JzVG9SZWZyZXNoLmFkZChlZGl0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gc2VsZWN0ZWQgPSBzZWxlY3REaXJ0eUVkaXRvcnMoZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCQllZGl0b3JzVG9SZWZyZXNoLmFkZChzZWxlY3RlZFtpXSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBVbmxvYWQgdGhlIHJlbW92ZWQgcmVzb3VyY2VzLgotCQlQZXJzaXN0ZW5jZVV0aWwudW5sb2FkKHJlbW92ZWRSZXNvdXJjZXMpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yICYmICFlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJQ29sbGVjdGlvbiB1c2VkUmVzb3VyY2VzID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpCi0JCQkJCQkuZ2V0VXNlZFJlc291cmNlcygpOwotCQkJCWNoZWNrX3Jlc291cmNlOiBmb3IgKGludCBqID0gMDsgaiA8IHJlbW92ZWRSZXNvdXJjZUxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIHJlbW92ZWRSZXNvdXJjZUxpc3QuZ2V0KGopOwotCQkJCQlpZiAodXNlZFJlc291cmNlcy5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJCWVkaXRvcnNUb1JlZnJlc2guYWRkKGVkaXRvcik7Ci0JCQkJCQlicmVhayBjaGVja19yZXNvdXJjZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZW1vdmVkUmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBjaGFuZ2VkUmVzb3VyY2VzCi0JICogQHJldHVybiByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gcmVsb2FkZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gaGFuZGxlQ2hhbmdlZFJlc291cmNlcyhDb2xsZWN0aW9uIGNoYW5nZWRSZXNvdXJjZXMsCi0JCQlDb2xsZWN0aW9uIGVkaXRvcnNUb1JlZnJlc2gsIGJvb2xlYW4gZm9yY2VSZWZyZXNoVmlld3MpIHsKLQkJaWYgKCFmb3JjZVJlZnJlc2hWaWV3cykgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hhbmdlZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUxpYnJhcnlSZXNvdXJjZQotCQkJCQkJJiYgKChJTGlicmFyeVJlc291cmNlKSByZXNvdXJjZSkuZ2V0TG9hZFN0YW1wKCkgPiBsYXN0UmVmcmVzaFRpbWVTdGFtcCkgewotCQkJCQlmb3JjZVJlZnJlc2hWaWV3cyA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaGFuZGxlQ2hhbmdlZFJlc291cmNlcyhjaGFuZ2VkUmVzb3VyY2VzLCBudWxsLAotCQkJCWZvcmNlUmVmcmVzaFZpZXdzLCBlZGl0b3JzVG9SZWZyZXNoKTsKLQl9Ci0KLQkvKioKLQkgKiB1cGRhdGVzIExpYnJhcnkgVmlldyB3aGVuIHJlc291cmNlcyBjaGFuZ2UKLQkgKiAKLQkgKiBAcGFyYW0gY2hhbmdlZFJlc291cmNlcwotCSAqIEBwYXJhbSBlZGl0b3JzTm90VG9SZWZyZXNoCi0JICogQHBhcmFtIGZvcmNlUmVmcmVzaFZpZXdzCi0JICogQHBhcmFtIGVkaXRvcnNUb1JlZnJlc2gKLQkgKiBAcmV0dXJuIExpc3Qgb2YgY2hhbmdlZCByZXNvdXJjZXMKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKENvbGxlY3Rpb24gY2hhbmdlZFJlc291cmNlcywKLQkJCUNvbGxlY3Rpb24gZWRpdG9yc05vdFRvUmVmcmVzaCwgYm9vbGVhbiBmb3JjZVJlZnJlc2hWaWV3cywKLQkJCUNvbGxlY3Rpb24gZWRpdG9yc1RvUmVmcmVzaCkgewotCQlDb250cm9sIGN0cmwgPSBnZXRWaWV3ZXIoKS5nZXRDb250cm9sKCk7Ci0JCWlmIChjdHJsID09IG51bGwgfHwgY3RybC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJQXJyYXlMaXN0PElFZGl0b3JQYXJ0PiBkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QgPSBuZXcgQXJyYXlMaXN0PElFZGl0b3JQYXJ0PigpOwotCQlBcnJheUxpc3Q8UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPihjaGFuZ2VkUmVzb3VyY2VzKTsKLQkJLy8gZmluZCBhbGwgZWRpdG9yIHdpdGggZGlydHkgY29uZmxpY3QKLQkJLy8KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IgJiYgZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHVzZWRSZXNvdXJjZXMgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikKLQkJCQkJCS5nZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJY2hlY2tfcmVzb3VyY2U6IGZvciAoaW50IGogPSAwOyBqIDwgY2hhbmdlZFJlc291cmNlTGlzdC5zaXplKCk7IGorKykgewotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgY2hhbmdlZFJlc291cmNlTGlzdC5nZXQoaik7Ci0JCQkJCWlmICh1c2VkUmVzb3VyY2VzLmNvbnRhaW5zKHJlc291cmNlKSkgewotCQkJCQkJZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LmFkZChlZGl0b3IpOwotCQkJCQkJYnJlYWsgY2hlY2tfcmVzb3VyY2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWwgQXJyYXlMaXN0IGVkaXRvckxpc3RUb1JlZnJlc2ggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChlZGl0b3JzVG9SZWZyZXNoICE9IG51bGwpIHsKLQkJCWVkaXRvckxpc3RUb1JlZnJlc2guYWRkQWxsKGVkaXRvcnNUb1JlZnJlc2gpOwotCQl9Ci0JCWlmICghZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gcmVzdWx0ID0gc2VsZWN0RGlydHlFZGl0b3JzKGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCk7Ci0JCQlpZihyZXN1bHQgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCU9iamVjdCBlZGl0b3IgPSByZXN1bHRbaV07Ci0JCQkJCWlmICgoZWRpdG9yc05vdFRvUmVmcmVzaCA9PSBudWxsIHx8ICFlZGl0b3JzTm90VG9SZWZyZXNoCi0JCQkJCQkJLmNvbnRhaW5zKGVkaXRvcikpCi0JCQkJCQkJJiYgKGVkaXRvcnNUb1JlZnJlc2ggPT0gbnVsbCB8fCAhZWRpdG9yc1RvUmVmcmVzaAotCQkJCQkJCQkJLmNvbnRhaW5zKGVkaXRvcikpKSB7Ci0JCQkJCQllZGl0b3JMaXN0VG9SZWZyZXNoLmFkZChlZGl0b3IpOwotCQkJCQkJZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LnJlbW92ZShlZGl0b3IpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gcmVtb3ZlIGFsbCByZXNvdXJjZXMgdXNlZCBieSBkaXJ0eSBlZGl0b3JzIHdpdGggY29uZmxpY3QgZnJvbSB0aGUKLQkJCS8vIGNvbGxlY3Rpb24gb2YgY2hhbmdlZCByZXNvdXJjZXMgYWZ0ZXIgdXBkYXRpbmcgY2FjaGVkIG1vZGlmaWNhdGlvbiBzdGFtcAotCQkJLy8gc28gdGhleSB3aWxsIG5vdCBiZSBwcm9tcHRlZCB0byByZWxvYWQgYWdhaW4gdW50aWwgdGhlIG5leHQgZXh0ZXJuYWwgY2hhbmdlCi0JCQkvLwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QKLQkJCQkJCS5nZXQoaSk7CQkJCQotCQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHVzZWRSZXNvdXJjZXMgPSBlZGl0b3IuZ2V0VXNlZFJlc291cmNlcygpOwotCQkJCXVzZWRSZXNvdXJjZXMucmV0YWluQWxsKGNoYW5nZWRSZXNvdXJjZUxpc3QpOwotCQkJCWVkaXRvci51cGRhdGVSZXNvdXJjZUluZm9zKHVzZWRSZXNvdXJjZXMpOwotCQkJCWVkaXRvci5vdmV3cml0ZVJlc291cmNlcyh1c2VkUmVzb3VyY2VzKTsKLQkJCQljaGFuZ2VkUmVzb3VyY2VMaXN0LnJlbW92ZUFsbCh1c2VkUmVzb3VyY2VzKTsKLQkJCX0KLQkJfQotCi0JCWJvb2xlYW4gcmVmcmVzaFZpZXdzID0gZmFsc2U7Ci0JCWlmICghY2hhbmdlZFJlc291cmNlTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yICYmICFlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHVzZWRSZXNvdXJjZXMgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikKLQkJCQkJCQkuZ2V0VXNlZFJlc291cmNlcygpOwotCQkJCQljaGVja19yZXNvdXJjZTogZm9yIChpbnQgaiA9IDA7IGogPCBjaGFuZ2VkUmVzb3VyY2VMaXN0Ci0JCQkJCQkJLnNpemUoKTsgaisrKSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgY2hhbmdlZFJlc291cmNlTGlzdAotCQkJCQkJCQkuZ2V0KGopOwotCQkJCQkJaWYgKHVzZWRSZXNvdXJjZXMuY29udGFpbnMocmVzb3VyY2UpKSB7Ci0JCQkJCQkJZWRpdG9yTGlzdFRvUmVmcmVzaC5hZGQoZWRpdG9yKTsKLQkJCQkJCQlicmVhayBjaGVja19yZXNvdXJjZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gUmVsb2FkIHRoZSBzZWxlY3RlZCBjaGFuZ2VkIHJlc291cmNlcy4KLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVsb2FkZWRSZXNvdXJjZXMgPSBtYW5hZ2VyCi0JCQkJCQkucmVsb2FkUmVzb3VyY2VzKGNoYW5nZWRSZXNvdXJjZUxpc3QpOwotCi0JCQkJcmVmcmVzaFZpZXdzID0gIXJlbG9hZGVkUmVzb3VyY2VzLmlzRW1wdHkoKTsKLQkJCX0KLQkJfQotCQlpZiAoZm9yY2VSZWZyZXNoVmlld3MgfHwgcmVmcmVzaFZpZXdzKSB7Ci0JCQlyZWZyZXNoVmlld3MoKTsKLQkJfQotCQlpZiAoIWVkaXRvckxpc3RUb1JlZnJlc2guaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvckxpc3RUb1JlZnJlc2guc2l6ZSgpOyBpKyspIHsKLQkJCQlNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3JMaXN0VG9SZWZyZXNoCi0JCQkJCQkuZ2V0KGkpOwotCQkJCXRyeSB7Ci0JCQkJCWVkaXRvci5yZWZyZXNoKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hhbmdlZFJlc291cmNlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgTGlicmFyeSBhbmQgQ29uZmlndXJhdGlvbiB2aWV3cyBpZiBuZWNlc3NhcnkKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVmcmVzaFZpZXdzKCkgewotCQlFT2JqZWN0IGlucHV0ID0gKEVPYmplY3QpIGdldFZpZXdlcigpLmdldElucHV0KCk7Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQuZUlzUHJveHkoKSkgewotCQkJCXNldElucHV0Rm9yVmlld2VyKFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNvbHZlKGlucHV0KSk7Ci0JCQl9IGVsc2UgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0Vmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCQkJCXVwZGF0ZUxhc3RSZWZyZXNoVGltZXN0YW1wKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQkJT2JqZWN0IG8gPSBudWxsOwotCQkJCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPT0gMQotCQkJCQkJCSYmIChvID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSkgaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJCQkJJiYgKChFT2JqZWN0KSBvKS5lSXNQcm94eSgpKSB7Ci0JCQkJCQlvID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc29sdmUoKEVPYmplY3QpIG8pOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzZXRTZWxlY3Rpb25Ub1ZpZXdlcihvKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCQkubG9nRXJyb3IoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlWaWV3SGVscGVyLnJlc3RvcmVTZWxlY3Rpb24oZ2V0Vmlld2VyKCksIHNlbGVjdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlDb25maWd1cmF0aW9uVmlldyBjb25maWdWaWV3ID0gQ29uZmlndXJhdGlvblZpZXcuZ2V0VmlldygpOwotCQlpZiAoY29uZmlnVmlldyAhPSBudWxsKSB7Ci0JCQlDb250cm9sIGN0cmwgPSBjb25maWdWaWV3LmdldFZpZXdlcigpLmdldENvbnRyb2woKTsKLQkJCWlmIChjdHJsICE9IG51bGwgJiYgIWN0cmwuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJaW5wdXQgPSAoRU9iamVjdCkgY29uZmlnVmlldy5nZXRWaWV3ZXIoKS5nZXRJbnB1dCgpOwotCQkJCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQkJCWlmIChpbnB1dC5lSXNQcm94eSgpKSB7Ci0JCQkJCQljb25maWdWaWV3LnNldElucHV0Rm9yVmlld2VyKFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkucmVzb2x2ZShpbnB1dCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBjb25maWdWaWV3LmdldFZpZXdlcigpCi0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCQkJCQkJVmlld0hlbHBlci5yZXN0b3JlU2VsZWN0aW9uKGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCksIHNlbGVjdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIHNlbGVjdERpcnR5RWRpdG9ycyhMaXN0PD8+IGRpcnR5RWRpdG9ycykgewotCQlyZXR1cm4gUmVmcmVzaEhhbmRsZXIuc2VsZWN0RGlydHlFZGl0b3JzKGRpcnR5RWRpdG9ycywgZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCX0KLQotCS8qKgotCSAqIHJlbmFtZSBhbiBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGVsZW1lbnQgdG8gcmVuYW1lCi0JICogQHBhcmFtIG5ld05hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5SZW5hbWUoZmluYWwgTmFtZWRFbGVtZW50IGUsIGZpbmFsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlSZW5hbWVBY3Rpb24uZG9SZW5hbWUoZSwgbmV3TmFtZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5JU2hvd0luVGFyZ2V0I3Nob3cob3JnLmVjbGlwc2UudWkucGFydC5TaG93SW5Db250ZXh0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3coU2hvd0luQ29udGV4dCBjb250ZXh0KSB7Ci0JCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIFNob3dJbkNvbnRleHQgZnJvbSBwcm9ibGVtcyB2aWV3Ci0JCS8vCi0JCWlmIChjb250ZXh0LmdldElucHV0KCkgaW5zdGFuY2VvZiBNYXJrZXJBZGFwdGVyKSB7Ci0JCQlJVmlld1BhcnQgdmlldyA9IGdldFZpZXdTaXRlKCkuZ2V0UGFnZSgpLmZpbmRWaWV3KAotCQkJCQkib3JnLmVjbGlwc2UudWkudmlld3MuUHJvYmxlbVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gdmlldy5nZXRWaWV3U2l0ZSgpCi0JCQkJCS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uUHJvdmlkZXIKLQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJT2JqZWN0IG8gPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIElNYXJrZXIpIHsKLQkJCQlJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKSBvOwotCQkJCXRyeSB7Ci0JCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgbWFya2VyCi0JCQkJCQkJLmdldEF0dHJpYnV0ZShMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlci5HVUlEKTsKLQkJCQkJaWYgKGd1aWQgIT0gbnVsbCkgewotCQkJCQkJSVJlc291cmNlIHdzUmVzID0gbWFya2VyLmdldFJlc291cmNlKCk7Ci0JCQkJCQlJTGlicmFyeU1hbmFnZXIgbGliTWdyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsJCQkJCQkKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gbGliTWdyLmdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpCi0JCQkJCQkJCS5nZXRSZXNvdXJjZSgKLQkJCQkJCQkJCQlVUkkuY3JlYXRlRmlsZVVSSSh3c1Jlcy5nZXRMb2NhdGlvbigpCi0JCQkJCQkJCQkJCQkudG9TdHJpbmcoKSksIGZhbHNlKTsKLQkJCQkJCU9iamVjdCBlbGVtZW50OwotCQkJCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCWVsZW1lbnQgPSByZXNvdXJjZS5nZXRFT2JqZWN0KGd1aWQpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJZWxlbWVudCA9IGxpYk1nci5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQkJCQkJfQotCQkJCQkJaWYoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJc2V0U2VsZWN0aW9uVG9WaWV3ZXIoZWxlbWVudCk7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlJU2VsZWN0aW9uIGNvbnRleHRTZWxlY3Rpb24gPSBjb250ZXh0LmdldFNlbGVjdGlvbigpOwotCQlpZiAoY29udGV4dC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIFRyZWVTZWxlY3Rpb24pIHsKLQkJCS8vIGZyb20gc2VhcmNoIHJlc3VsdHMgdmlldwotCQkJVHJlZVNlbGVjdGlvbiBzZWwgPSAoVHJlZVNlbGVjdGlvbiljb250ZXh0LmdldFNlbGVjdGlvbigpOwotCQkJc2V0U2VsZWN0aW9uVG9WaWV3ZXIoc2VsLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJfSBlbHNlIGlmIChjb250ZXh0U2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJLy8gZnJvbSBwcm9ibGVtcyB2aWV3LCBwZXJoYXBzIG90aGVycz8KLQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pY29udGV4dFNlbGVjdGlvbjsKLQkJCU9iamVjdCBmaXJzdE9iaiA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChmaXJzdE9iaiBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJCUlSZXNvdXJjZSB3c1JlcyA9IChJUmVzb3VyY2UpZmlyc3RPYmo7Ci0JCQkJSUxpYnJhcnlNYW5hZ2VyIGxpYk1nciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7CQkJCQkJCi0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBsaWJNZ3IuZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkKLQkJCQkJCS5nZXRSZXNvdXJjZSgKLQkJCQkJCQkJVVJJLmNyZWF0ZUZpbGVVUkkod3NSZXMuZ2V0TG9jYXRpb24oKQotCQkJCQkJCQkJCS50b1N0cmluZygpKSwgZmFsc2UpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJCWlmKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQlzZXRTZWxlY3Rpb25Ub1ZpZXdlcihlbGVtZW50KTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFZpZXdJZCgpIHsKLQkJcmV0dXJuIFZJRVdfSUQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Mb2NrZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0xvY2tlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5ODRlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0xvY2tlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgTG9ja2VyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUUgPSAiQ3VzdG9taXplZExvY2tlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAiY2xhc3MiIGF0dHJpYnV0ZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0FUVFJJQl9OQU1FID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICJpZCIgYXR0cmlidXRlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQVRUUklCX05BTUUgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIExvY2tlckZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0JLy8gQSBtYXAgb2YgbGlicmFyeSBtYW5hZ2VyIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMuCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBMb2NrZXJFbGVtZW50PiBsb2NrZXJFbGVtZW50cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTG9ja2VyRWxlbWVudD4oKTsKLQkKLQkvL0EgbWFwIHRvIG1hbmFnZSBpZCBhbmQgbG9ja2VyIHBhaXJzLgotCXByaXZhdGUgTWFwPFN0cmluZywgQWJzdHJhY3RMb2NrZXI+IGxvY2tlck1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQWJzdHJhY3RMb2NrZXI+KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBMb2NrZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZihpbnN0YW5jZSA9PSBudWxsKXsKLQkJCXN5bmNocm9uaXplZChMb2NrZXJGYWN0b3J5LmNsYXNzKXsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBMb2NrZXJGYWN0b3J5KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTG9ja2VyRmFjdG9yeSgpIHsKLQkJaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSwgRVhURU5TSU9OX1BPSU5UX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudAotCQkJCQkJLmdldEF0dHJpYnV0ZShDTEFTU19BVFRSSUJfTkFNRSk7Ci0JCQkJCQlTdHJpbmcgaWQgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkuZ2V0QXR0cmlidXRlKElEX0FUVFJJQl9OQU1FKTsKLQkJCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCAmJiBjbGFzc05hbWUudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiBpZCAhPSBudWxsICYmIGlkLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsJCQkJCQkJCi0JCQkJCQkJTG9ja2VyRWxlbWVudCBwcm92aWRlciA9IGxvY2tlckVsZW1lbnRzLmdldChpZCk7Ci0JCQkJCQkJaWYocHJvdmlkZXIgPT0gbnVsbCApIHsKLQkJCQkJCQkJcHJvdmlkZXIgPSBuZXcgTG9ja2VyRWxlbWVudCgKLQkJCQkJCQkJCQlidW5kbGUsIGNsYXNzTmFtZSwgaWQpOwotCQkJCQkJCQlsb2NrZXJFbGVtZW50cy5wdXQoaWQsIHByb3ZpZGVyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBBYnN0cmFjdExvY2tlciBnZXRMb2NrZXIoT2JqZWN0IG9iaikgewotCQlpZiAoIG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgKSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoKE1ldGhvZEVsZW1lbnQpb2JqKTsJCQkKLQkJCWlmIChlICE9IG51bGwgKSB7Ci0JCQkJTGlzdCBwcm9wcyA9IGUuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0JCQkJaWYgKCBwcm9wcyAhPSBudWxsICYmIHByb3BzLnNpemUoKSA+IDAgKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRwID0gcHJvcHMuaXRlcmF0b3IoKTsgaXRwLmhhc05leHQoKTsgKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpaXRwLm5leHQoKTsKLQkJCQkJCVN0cmluZyBpZCA9IHByb3AuZ2V0TmFtZSgpOwotCQkJCQkJQWJzdHJhY3RMb2NrZXIgbG9ja2VyPSBnZXRMb2NrZXIoaWQpOwotCQkJCQkJaWYgKCBsb2NrZXIgIT0gbnVsbCApIHsJCQkJCQkKLQkJCQkJCQlyZXR1cm4gbG9ja2VyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQkKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEFic3RyYWN0TG9ja2VyIGdldExvY2tlcihTdHJpbmcgaWQpIHsKLQotCQlpZiAoICFsb2NrZXJFbGVtZW50cy5jb250YWluc0tleShpZCkgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vcmV0dXJuIGNyZWF0ZWQgaW5zdGFuY2UKLQkJaWYobG9ja2VyTWFwLmNvbnRhaW5zS2V5KGlkKSApewotCQkJcmV0dXJuIGxvY2tlck1hcC5nZXQoaWQpOwotCQl9Ci0JCQotCQlMb2NrZXJFbGVtZW50IHByb3ZpZGVyID0gKExvY2tlckVsZW1lbnQpIGxvY2tlckVsZW1lbnRzLmdldChpZCk7Ci0JCXRyeSB7Ci0JCQlDbGFzcyBjbGF6eiA9IHByb3ZpZGVyLmJ1bmRsZS5sb2FkQ2xhc3MocHJvdmlkZXIuY2xhc3NOYW1lKTsKLQkJCUFic3RyYWN0TG9ja2VyIGxvY2tlckluc3RhbmNlID0gKEFic3RyYWN0TG9ja2VyKSBjbGF6ei5uZXdJbnN0YW5jZSgpOwotCQkJbG9ja2VyTWFwLnB1dChpZCwgbG9ja2VySW5zdGFuY2UpOwotCQkJcmV0dXJuIGxvY2tlckluc3RhbmNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIExvY2tlckVsZW1lbnQgewotCQlCdW5kbGUgYnVuZGxlOwotCQlTdHJpbmcgY2xhc3NOYW1lOwotCQlTdHJpbmcgaWQ7Ci0JCXByaXZhdGUgTG9ja2VyRWxlbWVudChCdW5kbGUgYnVuZGxlLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgaWQpIHsKLQkJCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCQl0aGlzLmlkID0gaWQ7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvUHJvY2Vzc1RyZWVWaWV3ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvUHJvY2Vzc1RyZWVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y3OGQ4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1Byb2Nlc3NUcmVlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db2x1bW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFjdGl2aXR5RHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5JQWN0aW9uVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uVmlld2VyRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVWaWV3ZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVFeHBhbnNpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgUHJvY2VzcyBlbGVtZW50cyBpbiBhIHRyZWUgdGFibGUgdmlld2VyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NUcmVlVmlld2VyIGV4dGVuZHMgVHJlZVZpZXdlciBpbXBsZW1lbnRzCi0JCUlBY3Rpb25UeXBlUHJvdmlkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT1BZX1RYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvcHlfdGV4dDsgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVORF9UWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5leHRlbmRfdGV4dDsgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRVBfQ09QWV9UWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZWVwQ29weV90ZXh0OyAKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uVGV4dChpbnQgYWN0aW9uVHlwZSkgewotCQlzd2l0Y2ggKGFjdGlvblR5cGUpIHsKLQkJY2FzZSBDT1BZOgotCQkJcmV0dXJuIENPUFlfVFhUOwotCQljYXNlIEVYVEVORDoKLQkJCXJldHVybiBFWFRFTkRfVFhUOwotCQljYXNlIERFRVBfQ09QWToKLQkJCXJldHVybiBERUVQX0NPUFlfVFhUOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgaW50IGFjdGlvblR5cGUgPSBJQWN0aW9uVHlwZVByb3ZpZGVyLkNPUFk7Ci0KLQlwcml2YXRlIE1lbnUgYWN0aW9uVHlwZVBvcHVwOwotCi0JcHJpdmF0ZSBQb2ludCBhY3Rpb25UeXBlUG9wdXBMb2NhdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQotCQlmaW5hbCBUcmVlIHRyZWUgPSBnZXRUcmVlKCk7Ci0JCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdHJlZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLQkJYWRkVHJlZUxpc3RlbmVyKG5ldyBJVHJlZVZpZXdlckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdHJlZUNvbGxhcHNlZChUcmVlRXhwYW5zaW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRJdGVtUHJvdmlkZXJFeHBhbmRlZChldmVudC5nZXRFbGVtZW50KCksIGZhbHNlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgdHJlZUV4cGFuZGVkKFRyZWVFeHBhbnNpb25FdmVudCBldmVudCkgewotCQkJCXNldEl0ZW1Qcm92aWRlckV4cGFuZGVkKGV2ZW50LmdldEVsZW1lbnQoKSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQWNjZXNzaWJsZSBhY2Nlc3NpYmxlID0gdHJlZS5nZXRBY2Nlc3NpYmxlKCk7Ci0JCWFjY2Vzc2libGUuYWRkQWNjZXNzaWJsZUxpc3RlbmVyIChuZXcgQWNjZXNzaWJsZUFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgZ2V0TmFtZSAoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQlzdXBlci5nZXROYW1lKGUpOwotCQkJCWlmIChlLmNoaWxkSUQgPj0gMCkgewotCQkJCQlUcmVlSXRlbVtdIGl0ZW1zID0gdHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMubGVuZ3RoID09IDEpIHsKLQkJCQkJCVN0cmluZyBzdHJpbmdUb1JlYWQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSkgaXRlbXNbMF07Ci0JCQkJCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJCQkJVHJlZUNvbHVtbltdIGNvbHVtbnMgPSB0cmVlLmdldENvbHVtbnMoKTsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJVHJlZUNvbHVtbiBjb2x1bW4gPSBjb2x1bW5zW2ldOwotCQkJCQkJCQlzdHJpbmdUb1JlYWQgKz0gY29sdW1uLmdldFRleHQoKSArICIgIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJKyBpdGVtLmdldFRleHQoaSk7Ci0JCQkJCQkJfQotCQkJCQkJCWUucmVzdWx0ID0gc3RyaW5nVG9SZWFkOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdXAgY29sdW5tcyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGFycmF5IG9mIGRlc2NyaXB0b3JzCi0JICogQHBhcmFtIGNvbHVtbkRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHZvaWQgc2V0dXBDb2x1bW5zKENvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5EZXNjcmlwdG9ycykgewotCQkvLyBSZW1vdmUgYWxsIG9sZCBUcmVlQ29sdW1ucy4KLQkJVHJlZUNvbHVtbltdIGNvbHMgPSBnZXRUcmVlKCkuZ2V0Q29sdW1ucygpOwotCQlpbnQgc2l6ZSA9IGNvbHMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJY29sc1tpXS5kaXNwb3NlKCk7Ci0JCX0KLQotCQlTdHJpbmdbXSBjb2xQcm9wcyA9IG5ldyBTdHJpbmdbY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJY29sUHJvcHNbaV0gPSBjb2x1bW5EZXNjcmlwdG9yc1tpXS5pZDsKLQkJCVRyZWVDb2x1bW4gY29sdW1uID0gbmV3IFRyZWVDb2x1bW4oZ2V0VHJlZSgpLAotCQkJCQljb2x1bW5EZXNjcmlwdG9yc1tpXS5hbGlnbm1lbnQpOwotCQkJY29sdW1uLnNldFRleHQoY29sdW1uRGVzY3JpcHRvcnNbaV0ubGFiZWwpOwotCQkJY29sdW1uLnNldFJlc2l6YWJsZShjb2x1bW5EZXNjcmlwdG9yc1tpXS5yZXNpemFibGUpOwotCQkJY29sdW1uLnNldFdpZHRoKGNvbHVtbkRlc2NyaXB0b3JzW2ldLndpZHRoKTsKLQkJfQotCi0JCXNldENvbHVtblByb3BlcnRpZXMoY29sUHJvcHMpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEl0ZW1Qcm92aWRlckV4cGFuZGVkKE9iamVjdCBlbGVtZW50LCBib29sZWFuIGV4cGFuZCkgewotCQlPYmplY3QgYWRhcHRlciA9IGdldEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoZWxlbWVudCwKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJKChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldEV4cGFuZGVkKEJvb2xlYW4udmFsdWVPZihleHBhbmQpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIEFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gZ2V0Q29udGVudFByb3ZpZGVyKCkgPT0gbnVsbCA/IG51bGwKLQkJCQk6ICgoQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpIGdldENvbnRlbnRQcm92aWRlcigpKQotCQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVHJlZVZpZXdlciNzZXRFeHBhbmRlZChJdGVtLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEV4cGFuZGVkKEl0ZW0gbm9kZSwgYm9vbGVhbiBleHBhbmQpIHsKLQkJc3VwZXIuc2V0RXhwYW5kZWQobm9kZSwgZXhwYW5kKTsKLQkJT2JqZWN0IGFkYXB0ZXIgPSBnZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KG5vZGUuZ2V0RGF0YSgpLAotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcik7Ci0JCQlpZiAoYnNJdGVtUHJvdmlkZXIuaXNFeHBhbmRlZCgpID09IG51bGwpIHsKLQkJCQlic0l0ZW1Qcm92aWRlci5zZXRFeHBhbmRlZCgoQm9vbGVhbi52YWx1ZU9mKGV4cGFuZCkpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRFeHBhbmRlZChJdGVtIGl0ZW0sIE9iamVjdCBlbGVtZW50KSB7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdChlbGVtZW50LAotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmKGFkYXB0ZXIuaGFzQ2hpbGRyZW4oZWxlbWVudCkpIHsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJQm9vbGVhbiBleHBhbmQgPSAoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcikuaXNFeHBhbmRlZCgpOwotCQkJCWlmIChleHBhbmQgIT0gbnVsbCkgewotCQkJCQlzZXRFeHBhbmRlZFN0YXRlKGl0ZW0sIGV4cGFuZC5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlciNpbnRlcm5hbFJlZnJlc2goV2lkZ2V0LAotCSAqICAgICAgT2JqZWN0LCBib29sZWFuLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGludGVybmFsUmVmcmVzaChXaWRnZXQgd2lkZ2V0LCBPYmplY3QgZWxlbWVudCwKLQkJCWJvb2xlYW4gZG9TdHJ1Y3QsIGJvb2xlYW4gdXBkYXRlTGFiZWxzKSB7Ci0JCXN1cGVyLmludGVybmFsUmVmcmVzaCh3aWRnZXQsIGVsZW1lbnQsIGRvU3RydWN0LCB1cGRhdGVMYWJlbHMpOwotCi0JCWlmIChkb1N0cnVjdCkgewotCQkJcHJlc2VydmVFeHBhbmRlZFN0YXRlKHdpZGdldCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHByZXNlcnZlRXhwYW5kZWRTdGF0ZShXaWRnZXQgd2lkZ2V0KSB7Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBJdGVtKSB7Ci0JCQlJdGVtIGl0ZW0gPSAoSXRlbSkgd2lkZ2V0OwotCQkJc2V0RXhwYW5kZWQoaXRlbSwgaXRlbS5nZXREYXRhKCkpOwotCQl9IGVsc2UgewotCQkJSXRlbVtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4od2lkZ2V0KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlJdGVtIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSXRlbSkgewotCQkJCQlJdGVtIGl0ZW0gPSAoSXRlbSkgY2hpbGQ7Ci0JCQkJCXNldEV4cGFuZGVkKGl0ZW0sIGl0ZW0uZ2V0RGF0YSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxJbml0aWFsaXplVHJlZShDb250cm9sIHdpZGdldCkgewotCQlzdXBlci5pbnRlcm5hbEluaXRpYWxpemVUcmVlKHdpZGdldCk7Ci0JCXByZXNlcnZlRXhwYW5kZWRTdGF0ZSh3aWRnZXQpOwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBjb21tYW5kOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklBY3Rpb25UeXBlUHJvdmlkZXIjZ2V0QWN0aW9uVHlwZSgpCi0JICovCi0vLwlwdWJsaWMgaW50IGdldEFjdGlvblR5cGUoKSB7Ci0vLwkJaWYgKGFjdGlvblR5cGVQb3B1cCA9PSBudWxsKSB7Ci0vLwkJCWNyZWF0ZUFjdGlvblR5cGVQb3B1cCgpOwotLy8JCX0KLS8vCi0vLwkJRGlzcGxheS5nZXRDdXJyZW50KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotLy8KLS8vCQkJcHVibGljIHZvaWQgcnVuKCkgewotLy8JCQkJYWN0aW9uVHlwZSA9IDA7Ci0vLwkJCQlhY3Rpb25UeXBlUG9wdXAuc2V0TG9jYXRpb24oYWN0aW9uVHlwZVBvcHVwTG9jYXRpb24pOwotLy8JCQkJYWN0aW9uVHlwZVBvcHVwLnNldFZpc2libGUodHJ1ZSk7Ci0vLwkJCX0KLS8vCi0vLwkJfSk7Ci0vLwotLy8JCXJldHVybiBhY3Rpb25UeXBlOwotLy8JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFjdGlvblR5cGVQb3B1cChpbnRbXSBjaG9pY2VzKSB7Ci0JCWFjdGlvblR5cGVQb3B1cCA9IG5ldyBNZW51KGdldENvbnRyb2woKSk7Ci0JCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlNZW51SXRlbSBpdGVtID0gKChNZW51SXRlbSkgZS5nZXRTb3VyY2UoKSk7Ci0JCQkJU3RyaW5nIHRleHQgPSBpdGVtLmdldFRleHQoKTsKLQkJCQlpZiAodGV4dCA9PSBDT1BZX1RYVCkgewotCQkJCQlQcm9jZXNzVHJlZVZpZXdlci50aGlzLmFjdGlvblR5cGUgPSBJQWN0aW9uVHlwZVByb3ZpZGVyLkNPUFk7Ci0JCQkJfSBlbHNlIGlmICh0ZXh0ID09IEVYVEVORF9UWFQpIHsKLQkJCQkJUHJvY2Vzc1RyZWVWaWV3ZXIudGhpcy5hY3Rpb25UeXBlID0gSUFjdGlvblR5cGVQcm92aWRlci5FWFRFTkQ7Ci0JCQkJfSBlbHNlIGlmICh0ZXh0ID09IERFRVBfQ09QWV9UWFQpIHsKLQkJCQkJUHJvY2Vzc1RyZWVWaWV3ZXIudGhpcy5hY3Rpb25UeXBlID0gREVFUF9DT1BZOwotCQkJCX0KLQotCQkJCWlmIChjb21tYW5kIGluc3RhbmNlb2YgQWN0aXZpdHlEcm9wQ29tbWFuZCkgewotCQkJCQlBY3Rpdml0eURyb3BDb21tYW5kIGNtZCA9ICgoQWN0aXZpdHlEcm9wQ29tbWFuZCkgY29tbWFuZCk7Ci0JCQkJCWNtZC5zZXRUeXBlKFByb2Nlc3NUcmVlVmlld2VyLnRoaXMuYWN0aW9uVHlwZSk7Ci0JCQkJCWNtZC5zZXRMYWJlbCh0ZXh0KTsKLQkJCQkJCi0JCQkJCWlmIChQcm9jZXNzVHJlZVZpZXdlci50aGlzLmFjdGlvblR5cGUgPT0gREVFUF9DT1BZICkgewotCQkJCQkJY21kLnNldEFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IobmV3IEFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IoKSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCi0JCQkJaWYgKGFjdGlvbk1hbmFnZXIgIT0gbnVsbAotCQkJCQkJJiYgY29tbWFuZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCQlhY3Rpb25NYW5hZ2VyLmV4ZWN1dGUoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgY29tbWFuZCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCQkJfQotCi0JCQkJYWN0aW9uVHlwZVBvcHVwLnNldFZpc2libGUoZmFsc2UpOwotCQkJfQotCi0JCX07Ci0JCQotCQlmb3IgKGludCBhY3Rpb25UeXBlIDogY2hvaWNlcykgewotCQkJTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0oYWN0aW9uVHlwZVBvcHVwLCBTV1QuQ0FTQ0FERSk7Ci0JCQltZW51SXRlbS5zZXRUZXh0KGdldEFjdGlvblRleHQoYWN0aW9uVHlwZSkpOwotCQkJbWVudUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklBY3Rpb25UeXBlUHJvdmlkZXIjc2V0SW5wdXREYXRhKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dERhdGEoT2JqZWN0IG9iamVjdCkgewotCQlhY3Rpb25UeXBlUG9wdXBMb2NhdGlvbiA9IChQb2ludCkgb2JqZWN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5JQWN0aW9uVHlwZVByb3ZpZGVyI2V4ZWN1dGUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNtZCwgaW50W10gY2hvaWNlcykgewotCQljcmVhdGVBY3Rpb25UeXBlUG9wdXAoY2hvaWNlcyk7Ci0KLQkJdGhpcy5jb21tYW5kID0gY21kOwotCQlhY3Rpb25UeXBlUG9wdXAuc2V0TG9jYXRpb24oYWN0aW9uVHlwZVBvcHVwTG9jYXRpb24pOwotCQlhY3Rpb25UeXBlUG9wdXAuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIGRlZmF1bHQgYmVoYXZpb3Igb2YgYWN0aXZhdGluZyB0ZXh0IGNlbGwgZWRpdG9yIGZyb20gc2luZ2xlIG1vdXNlIGNsaWNrIHRvIGRvdWJsZSBtb3VzZSBjbGljawotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhvb2tFZGl0aW5nU3VwcG9ydChDb250cm9sIGNvbnRyb2wpIHsKLQkJdHJ5IHsKLQkJCVRyZWVWaWV3ZXJFZGl0b3IuY3JlYXRlKHRoaXMsIG5ldyBDb2x1bW5WaWV3ZXJFZGl0b3JBY3RpdmF0aW9uU3RyYXRlZ3kodGhpcykgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdG9yQWN0aXZhdGlvbkV2ZW50KAotCQkJCQkJQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXJldHVybiBldmVudC5ldmVudFR5cGUgPT0gQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvbkV2ZW50Lk1PVVNFX0RPVUJMRV9DTElDS19TRUxFQ1RJT04KLQkJCQkJfHwgZXZlbnQuZXZlbnRUeXBlID09IENvbHVtblZpZXdlckVkaXRvckFjdGl2YXRpb25FdmVudC5QUk9HUkFNTUFUSUMKLQkJCQkJfHwgZXZlbnQuZXZlbnRUeXBlID09IENvbHVtblZpZXdlckVkaXRvckFjdGl2YXRpb25FdmVudC5UUkFWRVJTQUw7Ci0JCQkJfQotCQkJfSxDb2x1bW5WaWV3ZXJFZGl0b3IuREVGQVVMVCk7Ci0JCX0KLQkJY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJLy8gd29yay1hcm91bmQgZm9yIGEgYnVnIGluIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlckVkaXRvci5jcmVhdGUoVHJlZVZpZXdlciwgU1dURm9jdXNDZWxsTWFuYWdlciwgQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvblN0cmF0ZWd5LCBpbnQpCi0JCQkvLyB0aGF0IHRyaWVkIHRvIGNhbGwgU1dURm9jdXNDZWxsTWFuYWdlci5pbml0KCkgZXZlbiBTV1RGb2N1c0NlbGxNYW5hZ2VyIGlzIG51bGwJCQotCQl9Ci0JCXN1cGVyLmhvb2tFZGl0aW5nU3VwcG9ydChjb250cm9sKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuSUFjdGlvblR5cGVQcm92aWRlciNzZXRBY3Rpb25NYW5hZ2VyKElBY3Rpb25NYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGlvbk1hbmFnZXIoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCWFjdGlvbk1hbmFnZXIgPSBhY3Rpb25NZ3I7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Qcm9jZXNzVmlld2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1Byb2Nlc3NWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTczYmZiNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1Byb2Nlc3NWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9ycy5BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgUHJvY2VzcyBlbGVtZW50cyBpbiBhIHRyZWUgdGFibGUgdmlld2VyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NWaWV3ZXIgZXh0ZW5kcyBQcm9jZXNzVHJlZVZpZXdlciB7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXM7Ci0KLQlwcml2YXRlIEFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yW10gY2hlY2tCb3hDZWxsRWRpdG9ycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gcGFyZW50IC0gdW5kZXJseWluZyB0cmVlCi0JICogCi0JICogQHJldHVybiBwYXJlbnQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlIGdldENlbGxFZGl0b3JQYXJlbnQoKSB7Ci0JCXJldHVybiBnZXRUcmVlKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IGNoZWNrIGJveCBjZWxsIGVkaXRvcnMKLQkgKiAKLQkgKiBAcGFyYW0gY2hlY2tCb3hDZWxsRWRpdG9ycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoZWNrQm94Q2VsbEVkaXRvcnMoCi0JCQlBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvcltdIGNoZWNrQm94Q2VsbEVkaXRvcnMpIHsKLQkJdGhpcy5jaGVja0JveENlbGxFZGl0b3JzID0gY2hlY2tCb3hDZWxsRWRpdG9yczsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja0JveENlbGxFZGl0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciBlZGl0b3IgPSBjaGVja0JveENlbGxFZGl0b3JzW2ldOwotCQkJaWYgKGVkaXRvciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJZWRpdG9yLnNldENvbHVtbkluZGV4KGkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlByb2Nlc3NUcmVlVmlld2VyI2hvb2tDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaG9va0NvbnRyb2woQ29udHJvbCBjb250cm9sKSB7Ci0JCXN1cGVyLmhvb2tDb250cm9sKGNvbnRyb2wpOwotCQlnZXRUcmVlKCkuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJCW1vZGlmeUl0ZW0oZSk7Ci0JCQl9Ci0JCX0pOwotCQkvLyBnZXRUcmVlKCkuYWRkTW91c2VNb3ZlTGlzdGVuZXIobmV3IE1vdXNlTW92ZUxpc3RlbmVyKCl7Ci0JCS8vIHB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpewotCQkvLyBzZXRVbnNldEVkaXRvcihlKTsKLQkJLy8gfQotCQkvLyB9KTsKLQkJTGlzdGVuZXIgcGFpbnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuUGFpbnRJdGVtOiB7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZXZlbnQuaW5kZXggPSAiKyBldmVudC5pbmRleCk7Ci0JCQkJCUltYWdlIGltYWdlID0gZ2V0Q2hlY2tCb3hDZWxsRWRpdG9ySW1hZ2UoZXZlbnQpOwotCQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsKLQkJCQkJVHJlZUNvbHVtbiBjb2wgPSBnZXRUcmVlKCkuZ2V0Q29sdW1uKGV2ZW50LmluZGV4KTsKLQkJCQkJaW50IHggPSBldmVudC54ICsgY29sLmdldFdpZHRoKCkgLyAyOwotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQkJCQlpbnQgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgKGV2ZW50LmhlaWdodCAtIHJlY3QuaGVpZ2h0KSAvIDIpOwotCQkJCQlldmVudC5nYy5kcmF3SW1hZ2UoaW1hZ2UsIHggLSByZWN0LndpZHRoIC8gMiwgZXZlbnQueQotCQkJCQkJCSsgb2Zmc2V0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJZ2V0VHJlZSgpLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Qcm9jZXNzVHJlZVZpZXdlciNkb1VwZGF0ZUl0ZW0ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbSwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9VcGRhdGVJdGVtKEl0ZW0gaXRlbSwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJc3VwZXIuZG9VcGRhdGVJdGVtKGl0ZW0sIGVsZW1lbnQpOwotCi0JCWlmIChjaGVja0JveENlbGxFZGl0b3JzICE9IG51bGwgJiYgY29sdW1uUHJvcGVydGllcyAhPSBudWxsCi0JCQkJJiYgY29sdW1uUHJvcGVydGllcy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrQm94Q2VsbEVkaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciBlZGl0b3IgPSBjaGVja0JveENlbGxFZGl0b3JzW2ldOwotCQkJCWlmIChlZGl0b3IgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJKChUcmVlSXRlbSkgaXRlbSkuc2V0VGV4dChpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIEltYWdlIGdldENoZWNrQm94Q2VsbEVkaXRvckltYWdlKEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBnZXRDaGVja0JveENlbGxFZGl0b3JJbWFnZShldmVudC5pbmRleCwgKFRyZWVJdGVtKSBldmVudC5pdGVtKTsKLQl9Ci0KLQlwcml2YXRlIEltYWdlIGdldENoZWNrQm94Q2VsbEVkaXRvckltYWdlKGludCBjb2x1bW5JbmRleCwgVHJlZUl0ZW0gaXRlbSkgewotCQlpZiAoY2hlY2tCb3hDZWxsRWRpdG9ycyA9PSBudWxsCi0JCQkJfHwgY2hlY2tCb3hDZWxsRWRpdG9yc1tjb2x1bW5JbmRleF0gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gY2hlY2tCb3hDZWxsRWRpdG9yc1tjb2x1bW5JbmRleF0uZ2V0SW1hZ2UoaXRlbSwKLQkJCQljb2x1bW5Qcm9wZXJ0aWVzW2NvbHVtbkluZGV4XSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIjc2V0Q2VsbE1vZGlmaWVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDZWxsTW9kaWZpZXIoSUNlbGxNb2RpZmllciBtb2RpZmllcikgewotCQlzdXBlci5zZXRDZWxsTW9kaWZpZXIobW9kaWZpZXIpOwotCi0JCWlmIChjaGVja0JveENlbGxFZGl0b3JzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tCb3hDZWxsRWRpdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCUFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yIGVkaXRvciA9IGNoZWNrQm94Q2VsbEVkaXRvcnNbaV07Ci0JCQkJaWYgKGVkaXRvciA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQllZGl0b3Iuc2V0Q2VsbE1vZGlmaWVyKG1vZGlmaWVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIG1vdXNlIGRvd24gbGlzdGVuZXIKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgbW9kaWZ5SXRlbShNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCVBvaW50IHB0ID0gbmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpOwotCQlUcmVlSXRlbSBpdGVtID0gZ2V0VHJlZSgpLmdldEl0ZW0ocHQpOwotCQlpZiAoaXRlbSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0VHJlZSgpLmdldENvbHVtbkNvdW50KCk7IGkrKykgewotCQkJUmVjdGFuZ2xlIHJlY3QgPSBpdGVtLmdldEJvdW5kcyhpKTsKLQkJCWlmIChyZWN0LmNvbnRhaW5zKHB0KSkgewotCQkJCUltYWdlIGltYWdlID0gZ2V0Q2hlY2tCb3hDZWxsRWRpdG9ySW1hZ2UoaSwgaXRlbSk7Ci0JCQkJaWYgKGltYWdlID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlSZWN0YW5nbGUgaW1nUmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQkJCWludCBvZmZzZXQgPSBNYXRoLm1heCgwLCAocmVjdC5oZWlnaHQgLSBpbWdSZWN0LmhlaWdodCkgLyAyKTsKLQkJCQlpbnQgeCA9IHJlY3QueCArIHJlY3Qud2lkdGggLyAyIC0gaW1nUmVjdC53aWR0aCAvIDI7Ci0JCQkJaW50IHkgPSByZWN0LnkgKyBvZmZzZXQ7Ci0JCQkJaW1nUmVjdCA9IG5ldyBSZWN0YW5nbGUoeCwgeSwgaW1nUmVjdC53aWR0aCwgaW1nUmVjdC5oZWlnaHQpOwotCQkJCWlmIChpbWdSZWN0LmNvbnRhaW5zKHB0KSkgewotCQkJCQljaGVja0JveENlbGxFZGl0b3JzW2ldLm1vZGlmeShpdGVtLCBjb2x1bW5Qcm9wZXJ0aWVzW2ldKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyI3NldENvbHVtblByb3BlcnRpZXMoamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtblByb3BlcnRpZXMoU3RyaW5nW10gY29sdW1uUHJvcGVydGllcykgewotCQlzdXBlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotCQl0aGlzLmNvbHVtblByb3BlcnRpZXMgPSBjb2x1bW5Qcm9wZXJ0aWVzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1NhdmVhYmxlTGlicmFyeVZpZXdQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1NhdmVhYmxlTGlicmFyeVZpZXdQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZDM4ZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9TYXZlYWJsZUxpYnJhcnlWaWV3UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGNsYXNzIGZvciBhbGwgdmlld3MgdGhhdCByZXF1aXJlcyB0aGUgc3VwcG9ydCBvZiBzYXZpbmcgYSBNZXRob2QKLSAqIExpYnJhcnkgdmlhIHRoZSBTYXZlIGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTYXZlYWJsZUxpYnJhcnlWaWV3UGFydCBleHRlbmRzIFZpZXdQYXJ0IGltcGxlbWVudHMKLQkJSVNhdmVhYmxlUGFydCB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQltb25pdG9yCi0JCQkJCS5iZWdpblRhc2soCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2F2aW5nTGlicmFyeVRhc2tfbmFtZSwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgCi0JCQlTdHJpbmcgbGliUGF0aCA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKTsKLQkJCXRyeSB7Ci0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zYXZlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeVRvRXJyb3JfbXNnLCBsaWJQYXRoKSwgCi0JCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yX3JlYXNvbiwgCi0JCQkJCQkJCWUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNkb1NhdmVBcygpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlT25DbG9zZU5lZWRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlT25DbG9zZU5lZWRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1ZpZXdIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvVmlld0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmVjN2UyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvVmlld0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5QZXJzcGVjdGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1pc2M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciBtYW5hZ2luZyB0aGUgdmlld3MgYW5kIGVkaXRvcnMgaW4gdGhlIEF1dGhvcmluZwotICogcGVyc3BlY3RpdmUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWaWV3SGVscGVyIHsKLQotCS8qKgotCSAqIFByb21wdHMgdGhlIHVzZXIgdG8gc2F2ZSB0aGUgb3BlbiBsaWJyYXJ5IGlmIGl0IGhhcyBiZWVuIG1vZGlmaWVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTxjb2RlPiBpZiB0aGUgdXNlciBzYXZlZCBvciBkaXNjYXJkZWQgdGhlIGNoYW5nZSwKLQkgKiAJCSAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgdXNlciBjYW5jZWxsZWQgdGhlIGFjdGlvbiB0aGF0Ci0JICogICAgICAgICB0cmlnZ2VyZWQgdGhpcyBjYWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9tcHRTYXZlKCkgewotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwgJiYgbWFuYWdlci5pc01ldGhvZExpYnJhcnlNb2RpZmllZCgpKSB7Ci0JCQlpbnQgcmV0ID0gTXNnQm94LnByb21wdChBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeURpYWxvZ190aXRsZSwgCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RGlhbG9nX3RleHQsIAotCQkJCQlTV1QuWUVTIHwgU1dULk5PIHwgU1dULkNBTkNFTCk7Ci0JCQlzd2l0Y2ggKHJldCkgewotCQkJY2FzZSBTV1QuWUVTOgotCQkJCXRyeSB7Ci0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2F2ZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQkJZGlhbG9nCi0JCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RXJyb3JfbXNnLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yX3JlYXNvbiwgZSk7IAotCi0JCQkJCXJldHVybiBkaWFsb2cKLQkJCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RGlhbG9nX3RleHQpOyAKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNXVC5OTzoKLQkJCQkvLyBEaXNjYXJkIGFsbCBjaGFuZ2VzIGJ5IHJlc2V0dGluZyBhbGwgcmVzb3VyY2VzIGFzIHVuY2hhbmdlZC4KLQkJCQltYW5hZ2VyLmRpc2NhcmRNZXRob2RMaWJyYXJ5Q2hhbmdlcygpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1QuQ0FOQ0VMOgotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHNhdmUgdGhlIG9wZW4gbGlicmFyeSBpZiBpdCBoYXMgYmVlbiBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjaG9pY2UgdGhlIHVzZXIgbWFkZSB3aGVuIHByb21wdGVkIHRvIHNhdmUgLSBvbmUgb2YgU1dULllFUywgU1dULk5PLCBTV1QuQ0FOQ0VMCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgcHJvbXB0U2F2ZUludCgpIHsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsICYmIG1hbmFnZXIuaXNNZXRob2RMaWJyYXJ5TW9kaWZpZWQoKSkgewotCQkJaW50IHJldCA9IE1zZ0JveC5wcm9tcHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGUsIAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeURpYWxvZ190ZXh0LCAKLQkJCQkJU1dULllFUyB8IFNXVC5OTyB8IFNXVC5DQU5DRUwpOwotCQkJc3dpdGNoIChyZXQpIHsKLQkJCWNhc2UgU1dULllFUzoKLQkJCQl0cnkgewotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNhdmVDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQkJCWRpYWxvZwotCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeURpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeUVycm9yX21zZywgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvcl9yZWFzb24sIGUpOyAKLQkJCQl9Ci0JCQkJcmV0dXJuIFNXVC5ZRVM7Ci0JCQljYXNlIFNXVC5OTzoKLQkJCQkvLyBEaXNjYXJkIGFsbCBjaGFuZ2VzIGJ5IHJlc2V0dGluZyBhbGwgcmVzb3VyY2VzIGFzIHVuY2hhbmdlZC4KLQkJCQltYW5hZ2VyLmRpc2NhcmRNZXRob2RMaWJyYXJ5Q2hhbmdlcygpOwotCQkJCXJldHVybiBTV1QuTk87Ci0JCQljYXNlIFNXVC5DQU5DRUw6Ci0JCQkJcmV0dXJuIFNXVC5DQU5DRUw7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gU1dULkNBTkNFTDsKLQl9Ci0KLQkvKioKLQkgKiBjbG9zZXMgYWxsIGVkaXRvcnMgb24gdGhlIGFjdGl2ZSBwYWdlCi0JICoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VBbGxFZGl0b3JzKCkgewotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCS5jbG9zZUFsbEVkaXRvcnModHJ1ZSk7Ci0JfQotCi0vLwkvKioKLS8vCSAqIGNsb3NlcyB0aGUgTWVzc2FnZVZpZXcgKGVycm9yIHZpZXcpCi0vLwkgKgotLy8JICovCi0vLwlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VNZXNzYWdlVmlldygpIHsKLS8vCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotLy8JCQkJLmhpZGVWaWV3KE1lc3NhZ2VWaWV3LmdldFZpZXcoKSk7Ci0vLwl9Ci0KLQkvKioKLQkgKiBoYW5kbGVzIGEgZGFuZ2xpbmcgb2JqZWN0Ci0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKiAJCQlPYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBoYW5kbGVEYW5nbGluZyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJJiYgKChFT2JqZWN0KSBvYmplY3QpLmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5lbGVtZW50QWxyZWFkeURlbGV0ZWRFcnJvcl9tc2csICgoTWV0aG9kRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCkpKTsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCUZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3Q7Ci0JCQlPYmplY3QgdmFsdWUgPSBhZGFwdGVyLmdldFZhbHVlKCk7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCSYmICgoRU9iamVjdCkgdmFsdWUpLmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCQlPYmplY3Qgb3duZXIgPSBUbmdVdGlsLnVud3JhcChhZGFwdGVyLmdldFBhcmVudCh2YWx1ZSkpOwotCQkJCWlmIChvd25lciBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQkJLy8gVGhpcyBpcyBhIFVJIGl0ZW0gcHJvdmlkZXIuCi0JCQkJCW93bmVyID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBvd25lcikuZ2V0VGFyZ2V0KCk7Ci0JCQkJfQotCQkJCVN0cmluZyBvd25lck5hbWUgPSAoKE1ldGhvZEVsZW1lbnQpIG93bmVyKS5nZXROYW1lKCk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyLmdldEZlYXR1cmUoKTsKLQkJCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGV0ZURpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLlZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRjb25maXJtX3RleHQsICgoTWV0aG9kRWxlbWVudCkgdmFsdWUpCi0JCQkJCQkJCQkuZ2V0TmFtZSgpLCBvd25lck5hbWUpKSkgeyAKLQkJCQkJCS8vIFJlbW92ZSB0aGUgYXNzb2NpYXRpb24uCi0JCQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCSgoQ29sbGVjdGlvbikgKChFT2JqZWN0KSBvd25lcikuZUdldChmZWF0dXJlKSkKLQkJCQkJCQkJCS5yZW1vdmUodmFsdWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWxlbWVudEFscmVhZHlEZWxldGVkRXJyb3JfbXNnLCAoKE1ldGhvZEVsZW1lbnQpIHZhbHVlKQotCQkJCQkJCQkJLmdldE5hbWUoKSkpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb2JqZWN0OwotCX0KLQotCS8qIFRPRE86IElzIHRoaXMgc3RpbGwgbmVlZGVkPwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkQWxsQW5kU2F2ZUFsbCgpIHsKLQkJZmluYWwgTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZwotCQkvLyBhY3Rpdml0eSB0aGF0IG1vZGlmaWVzIHRoZSB3b3JrYmVuY2guCi0JCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotCQkJLy8gVGhpcyBpcyB0aGUgbWV0aG9kIHRoYXQgZ2V0cyBpbnZva2VkIHdoZW4gdGhlIG9wZXJhdGlvbiBydW5zLgotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQltb25pdG9yLmJlZ2luVGFzayhBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkudXBncmFkaW5nTGlicmFyeVRhc2submFtZSIpLCAzKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRyeSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJCW1vbml0b3IKLQkJCQkJCQkJLnNldFRhc2tOYW1lKEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkubG9hZGluZ0xpYnJhcnlFbGVtZW50c1Rhc2submFtZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJTW9kZWxTdG9yYWdlLmxvYWRBbGxQcm94aWVzKGxpYik7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS51cGdyYWRlTGlicmFyeURpYWxvZy50aXRsZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCS5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLnVwZ3JhZGVMaWJyYXJ5RXJyb3IubXNnIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkudXBncmFkZUxpYnJhcnlFcnJvci5yZWFzb24iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCWUpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJCW1vbml0b3IKLQkJCQkJCQkJLnNldFRhc2tOYW1lKEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkuc2F2aW5nVXBncmFkZWRFbGVtZW50c1Rhc2submFtZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgbGliCi0JCQkJCQkJCS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCQkJcmVzb3VyY2VTZXQuc2F2ZShMaWJyYXJ5UHJvY2Vzc29yLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJLmdldFNhdmVPcHRpb25zKCksIHRydWUpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkudXBncmFkZUxpYnJhcnlEaWFsb2cudGl0bGUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS51cGdyYWRlTGlicmFyeUVycm9yLm1zZyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCS5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLnNhdmVVcGdyYWRlZExpYnJhcnlFcnJvci5yZWFzb24iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCWUpOwotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQkvLyBSdW4gdGhlIG9wZXJhdGlvbiBhbmQgZGlzcGxheSB0aGUgcHJvZ3Jlc3MuCi0JCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCkpCi0JCQkJCS5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS51cGdyYWRlTGlicmFyeURpYWxvZy50aXRsZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCS5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLnVwZ3JhZGVMaWJyYXJ5RXJyb3IubXNnIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkuaW50ZXJuYWxFcnJvci5yZWFzb24iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWUpOwotCQl9Ci0JfQotCSovCi0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIGxvY2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb2NrZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQl3aGlsZSAoZWxlbWVudCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCWVsZW1lbnQgPSAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZWxlbWVudCkuZ2V0UGFyZW50KG51bGwpOwotCQkJfQotCQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJCSYmIFRuZ1V0aWwuaXNMb2NrZWQoKEVPYmplY3QpIGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEp1ZGdlIGlmIHRoZXJlIGlzIGEgZGVmaW5lZCBjdXN0b21pemVkIGxvY2tlcgotCSAqIEByZXR1cm4gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNDdXN0b21pemVkTG9ja2VyKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbil7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQl3aGlsZSAoZWxlbWVudCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCWVsZW1lbnQgPSAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZWxlbWVudCkuZ2V0UGFyZW50KG51bGwpOwotCQkJfQkJCQotCQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwkJCQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0ICkgewkKLQkJCQlBYnN0cmFjdExvY2tlciBsb2NrZXIgPSBudWxsOwotCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uICl7Ci0JCQkJCWxvY2tlciA9IExvY2tlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRMb2NrZXIoZWxlbWVudCk7CQotCQkJCX1lbHNlewotCQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpZWxlbWVudCk7Ci0JCQkJCWlmKHBsdWdpbiAhPSBudWxsICApewotCQkJCQkJbG9ja2VyID0gTG9ja2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldExvY2tlcihwbHVnaW4pOwkJCQkJCQotCQkJCQl9Ci0JCQkJfQkJCQkKLQkJCQlpZihsb2NrZXIgIT0gbnVsbCApewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9CQkJCQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIGxvY2tlZC4KLQkgKiBJZiB0aGVyZSBpcyBhIGN1c3RvbWl6ZWQgbG9ja2VyLCB1c2UgaXQsIG90aGVyd2lzZSBjaGVjayBpdCB3aXRoIHRoZSBsb2NrZWQgZmxhZyBvZiAKLQkgKiBNZXRob2QgcGx1Z2luCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb2NrZWRXaXRoQ3VzdG9taXplZExvY2tlcihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewkJCQotCQkJT2JqZWN0IHNlbGVjdGVkSXRlbSA9IGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IGVsZW1lbnQgPSBzZWxlY3RlZEl0ZW07Ci0JCQl3aGlsZSAoZWxlbWVudCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCWVsZW1lbnQgPSAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZWxlbWVudCkuZ2V0UGFyZW50KG51bGwpOwotCQkJfQkJCQotCQkJT2JqZWN0IHVud3JhcEVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCQotCQkJaWYgKHVud3JhcEVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0ICkgewkKLQkJCQkKLQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbiApewotCQkJCQlBYnN0cmFjdExvY2tlciBsb2NrZXIgPSBMb2NrZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0TG9ja2VyKGVsZW1lbnQpOwkJCQkJCi0JCQkJCWlmKGxvY2tlciAhPSBudWxsICl7Ci0JCQkJCQlpZiggbG9ja2VyLmlzTG9ja2VkKGVsZW1lbnQpKXsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpdW53cmFwRWxlbWVudCk7Ci0JCQkJaWYocGx1Z2luICE9IG51bGwgKXsKLQkJCQkJQWJzdHJhY3RMb2NrZXIgbG9ja2VyID0gTG9ja2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldExvY2tlcihwbHVnaW4pOwkJCQkJCi0JCQkJCWlmKGxvY2tlciAhPSBudWxsICl7Ci0JCQkJCQlpZiggbG9ja2VyLmlzTG9ja2VkKHNlbGVjdGVkSXRlbSkpewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9ZWxzZSBpZiggVG5nVXRpbC5pc0xvY2tlZCgoRU9iamVjdCkgdW53cmFwRWxlbWVudCkpewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVjayB3aGV0aGVyIHRoZSBkZXN0aW5hdGlvbiBpcyBsb2NrZWQgYnkgYSBjdXN0b21pemVkIGxvY2tlci4KLQkgKiBOb3RlOiBTb21lIGl0ZW0gY291bGQgYmUgbG9ja2VkIGJ5IGEgZXh0ZW50ZWQgbG9ja2VyLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHRlbmRlZExvY2tlZChPYmplY3QgZGVzdGluYXRpb24pIHsKLQkJdHJ5IHsKLQkJCWlmIChkZXN0aW5hdGlvbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJT2JqZWN0IGVsZW1lbnQgPSBkZXN0aW5hdGlvbjsKLQkJCXdoaWxlIChlbGVtZW50IGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJZWxlbWVudCA9ICgoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBlbGVtZW50KS5nZXRQYXJlbnQobnVsbCk7Ci0JCQl9Ci0JCQllbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbAotCQkJCS5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIGVsZW1lbnQpOwotCQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCQlBYnN0cmFjdExvY2tlciBsb2NrZXIgPSBMb2NrZXJGYWN0b3J5LmdldEluc3RhbmNlKCkKLQkJCQkJLmdldExvY2tlcihwbHVnaW4pOwotCQkJCQlpZiAobG9ja2VyICE9IG51bGwgJiYgbG9ja2VyLmlzTG9ja2VkKGRlc3RpbmF0aW9uKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEZpeGVzIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIEdVSURzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmaXhDb250ZW50RGVzY3JpcHRpb25HVUlEcygpIHsKLQkJZmluYWwgTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCUhhc2hTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUludGVybmFsRU9iamVjdCBlbGVtZW50ID0gKEludGVybmFsRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50LmVQcm94eVVSSSgpID09IG51bGwpIHsKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQkJCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQ29udGVudERlc2NyaXB0aW9uKSBlbGVtZW50OwotCQkJCQkJCURlc2NyaWJhYmxlRWxlbWVudCBjb250YWluZXIgPSAoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50Ci0JCQkJCQkJCQkuZUNvbnRhaW5lcigpOwotCQkJCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCQkJCQlTdHJpbmcgZ3VpZCA9IFVtYVV0aWwuZ2VuZXJhdGVHVUlEKGNvbnRhaW5lcgotCQkJCQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJCQkJCQlpZiAoIWd1aWQuZXF1YWxzKGNvbnRlbnQuZ2V0R3VpZCgpKSkgewotCQkJCQkJCQkJY29udGVudC5zZXRHdWlkKGd1aWQpOwotCQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNvbnRlbnQuZVJlc291cmNlKCkpOwotCQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMKLQkJCQkJCQkJCQkJLmFkZChjb250YWluZXIuZVJlc291cmNlKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCSJVbnJlc29sdmVkIHByb3h5IGluICciICsgZWxlbWVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSArICInOiAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCi0JCQkJbW9uaXRvci5zdWJUYXNrKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmluZ0ZpbGVzVGFza19uYW1lKTsKLQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldEN1cnJlbnRQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJCXRyeSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJbW9uaXRvci5zdWJUYXNrKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2F2aW5nVGFza19uYW1lLCByZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkpOwotCQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCS5ydW5XaXRoUHJvZ3Jlc3MoCi0JCQkJCQlydW5uYWJsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZpeGluZ0NvbnRlbnREZXNjcmlwdGlvbkdVSURzVGFza19uYW1lKTsgCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoZWNrUHJveHkoSW50ZXJuYWxFT2JqZWN0IGVsZW1lbnQsIEVSZWZlcmVuY2UgcmVmLAotCQkJT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkgewotCQkJSW50ZXJuYWxFT2JqZWN0IGVPYmogPSAoSW50ZXJuYWxFT2JqZWN0KSB2YWx1ZTsKLQkJCWlmIChlT2JqLmVJc1Byb3h5KCkpIHsKLQkJCQlFT2JqZWN0IHJlc29sdmVkID0gZWxlbWVudC5lUmVzb2x2ZVByb3h5KGVPYmopOwotCQkJCVN0cmluZyBlcnJNc2cgPSBudWxsOwotCQkJCWlmIChyZXNvbHZlZCA9PSBlT2JqKSB7Ci0JCQkJCWVyck1zZyA9ICJVbnJlc29sdmVkIHByb3h5IjsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSBpZiAoIXJlZi5nZXRFVHlwZSgpLmlzSW5zdGFuY2UocmVzb2x2ZWQpKSB7Ci0JCQkJCWVyck1zZyA9ICJJbnZhbGlkIGRhdGEiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWlmIChlcnJNc2cgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcGF0aDsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOYW1lZEVsZW1lbnQpIHsKLQkJCQkJCXBhdGggPSByZWYuZ2V0RVR5cGUoKS5nZXROYW1lKCkKLQkJCQkJCQkJKyAiKCIgKyBNaXNjLmdldFBhdGhSZWxhdGl2ZVRvTGlicmFyeSgoTmFtZWRFbGVtZW50KSBlbGVtZW50KSArICIpLiIgKyByZWYuZ2V0TmFtZSgpICsgIiA9ICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXR1cm4gZXJyTXNnCi0JCQkJCQkJKyAiIGluICciICsgZWxlbWVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSArICInOiAiICsgcGF0aCArIHJlc29sdmVkOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTGlicmFyeSBoZWFsdGggY2hlY2sKLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0xpYnJhcnlIZWFsdGgoKSB7Ci0JCWZpbmFsIE1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGliID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dJbmZvKAotCQkJCQkJIisrKysgTElCUkFSWSBIRUFMVEggQ0hFQ0sgUkVQT1JUIC0gU1RBUlQgKysrIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmdXcml0ZXIgc3RyV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJCVByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN0cldyaXRlcik7Ci0JCQkJcHJpbnRXcml0ZXIucHJpbnRsbigpOwotCQkJCXByaW50V3JpdGVyCi0JCQkJCQkucHJpbnRsbigiVU5SRVNPTFZFRC9JTlZBTElEIFBST1hJRVMgSU4gWC1SRUZFUkVOQ0VTIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlwcmludFdyaXRlcgotCQkJCQkJLnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJSW50ZXJuYWxFT2JqZWN0IGVsZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQuZVByb3h5VVJJKCkgPT0gbnVsbCkgewotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIGVsZW1lbnQ7Ci0JCQkJCQkJRGVzY3JpYmFibGVFbGVtZW50IGNvbnRhaW5lciA9IChEZXNjcmliYWJsZUVsZW1lbnQpIGVsZW1lbnQKLQkJCQkJCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQkJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCQkJCVN0cmluZyBndWlkID0gVW1hVXRpbC5nZW5lcmF0ZUdVSUQoY29udGFpbmVyCi0JCQkJCQkJCQkJLmdldEd1aWQoKSk7Ci0JCQkJCQkJCWlmICghZ3VpZC5lcXVhbHMoY29udGVudC5nZXRHdWlkKCkpKSB7Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJCQkJIkNvbnRlbnREZXNjcmlwdGlvbiB3aXRoIGludmFsaWQgR1VJRDogIiArIGNvbnRlbnQuZ2V0R3VpZCgpICsgIiBpbiAnIiArIGNvbnRlbnQuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCQkJIkNvbnRlbnREZXNjcmlwdGlvbiB3aXRob3V0IGEgY29udGFpbmVyOiAiICsgY29udGVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0KLQkJCQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbikgewotCQkJCQkJCQkvLyBjaGVjayBpZiB0aGUgY29udGVudC54bWkgb2YgdGhlIHByb2Nlc3MgaXMgaW4KLQkJCQkJCQkJLy8gdGhlIHJpZ2h0IHBsYWNlCi0JCQkJCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSBVbWFVdGlsCi0JCQkJCQkJCQkJLmdldFByb2Nlc3NDb21wb25lbnQoY29udGVudCk7Ci0JCQkJCQkJCWlmIChwcm9jQ29tcCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlTdHJpbmcgbW9kZWxQYXRoID0gcHJvY0NvbXAuZVJlc291cmNlKCkKLQkJCQkJCQkJCQkJLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJCQkJCQkJRmlsZSBkaXIgPSBuZXcgRmlsZShtb2RlbFBhdGgpCi0JCQkJCQkJCQkJCS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCQkJCQlTdHJpbmcgY29udGVudFBhdGggPSBjb250ZW50LmVSZXNvdXJjZSgpCi0JCQkJCQkJCQkJCS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQotCQkJCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJtb2RlbCBwYXRoOiAiICsKLQkJCQkJCQkJCS8vIG1vZGVsUGF0aCk7Ci0JCQkJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQgcGF0aDogIiArCi0JCQkJCQkJCQkvLyBjb250ZW50UGF0aCk7Ci0JCQkJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQotCQkJCQkJCQkJRmlsZSBjb250ZW50RGlyID0gbmV3IEZpbGUoY29udGVudFBhdGgpCi0JCQkJCQkJCQkJCS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCQkJCQlpZiAoIWRpci5lcXVhbHMoY29udGVudERpcikpIHsKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJCQkJCSJDb250ZW50IGZpbGUgb2YgIiArIGNvbnRhaW5lci5lQ2xhc3MoKS5nZXROYW1lKCkgKyAiICciICsgY29udGFpbmVyLmdldE5hbWUoKSArICInIGluICciICsgbW9kZWxQYXRoICsgIiBpcyBtaXNwbGFjZWQ6ICIgKyBjb250ZW50UGF0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJLy8gY2hlY2sgZm9yIHVucmVzb2x2ZWQgcHJveGllcyBpbiBjcm9zcyByZWZlcmVuY2VzCi0JCQkJCQlBcnJheUxpc3QgeFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnQuZUNsYXNzKCkKLQkJCQkJCQkJLmdldEVBbGxSZWZlcmVuY2VzKCkpOwotCQkJCQkJeFJlZmVyZW5jZXMucmVtb3ZlQWxsKGVsZW1lbnQuZUNsYXNzKCkKLQkJCQkJCQkJLmdldEVBbGxDb250YWlubWVudHMoKSk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0geFJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlFUmVmZXJlbmNlIHJlZiA9IChFUmVmZXJlbmNlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KHJlZiwgZmFsc2UpOwotCQkJCQkJCWlmIChyZWYuaXNNYW55KCkpIHsKLQkJCQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZXJuYWxFTGlzdCkgewotCQkJCQkJCQkJSW50ZXJuYWxFTGlzdCBsaXN0ID0gKEludGVybmFsRUxpc3QpIHZhbHVlOwotCQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IGxpc3QuYmFzaWNJdGVyYXRvcigpOyBpdGVyMQotCQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCVN0cmluZyBtc2cgPSBjaGVja1Byb3h5KGVsZW1lbnQsIHJlZiwKLQkJCQkJCQkJCQkJCWl0ZXIxLm5leHQoKSk7Ci0JCQkJCQkJCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCXByaW50V3JpdGVyLnByaW50bG4obXNnKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlTdHJpbmcgbXNnID0gY2hlY2tQcm94eShlbGVtZW50LCByZWYsIHZhbHVlKTsKLQkJCQkJCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQkJCQlwcmludFdyaXRlci5wcmludGxuKG1zZyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJIlVucmVzb2x2ZWQgcHJveHkgaW4gJyIgKyBlbGVtZW50LmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpICsgIic6ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQotCQkJCX0KLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQlzdHJXcml0ZXIudG9TdHJpbmcoKSk7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0luZm8oCi0JCQkJCQkiKysrKyBMSUJSQVJZIEhFQUxUSCBDSEVDSyBSRVBPUlQgLSBFTkQgKysrIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQl9OwotCQlpZiAoVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMudmlld0hlbHBlcl9wZXJmb3JtSGVhbHRoQ2hlY2spKSB7IAotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX3RpdGxlOyAKLQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX21lc3NhZ2U7IAotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlJbmZvKHRpdGxlLAotCQkJCQltZXNzYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHJlbW92ZXMgaW52YWxpZCByZWZlcmVuY2UgaW4gdGhlIG9wZW4gbGlicmFyeQotCSAqCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUludmFsaWRSZWZlcmVuY2VzKCkgewotCQlmaW5hbCBNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJSGFzaFNldCBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJSW50ZXJuYWxFT2JqZWN0IGVsZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQuZVByb3h5VVJJKCkgPT0gbnVsbCkgewotCQkJCQkJQXJyYXlMaXN0IHhSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdChlbGVtZW50LmVDbGFzcygpCi0JCQkJCQkJCS5nZXRFQWxsUmVmZXJlbmNlcygpKTsKLQkJCQkJCXhSZWZlcmVuY2VzLnJlbW92ZUFsbChlbGVtZW50LmVDbGFzcygpCi0JCQkJCQkJCS5nZXRFQWxsQ29udGFpbm1lbnRzKCkpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHhSZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnQuZUdldChyZWYsIGZhbHNlKTsKLQkJCQkJCQlpZiAocmVmLmlzTWFueSgpKSB7Ci0JCQkJCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVybmFsRUxpc3QpIHsKLQkJCQkJCQkJCUludGVybmFsRUxpc3QgbGlzdCA9IChJbnRlcm5hbEVMaXN0KSB2YWx1ZTsKLQkJCQkJCQkJCUFycmF5TGlzdCBpbnZhbGlkUHJveGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBsaXN0LmJhc2ljSXRlcmF0b3IoKTsgaXRlcjEKLQkJCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCQlPYmplY3QgdiA9IGl0ZXIxLm5leHQoKTsKLQkJCQkJCQkJCQlpZiAoaXNJbnZhbGlkUmVmZXJlbmNlKGVsZW1lbnQsIHJlZiwgdikpIHsKLQkJCQkJCQkJCQkJaW52YWxpZFByb3hpZXMuYWRkKHYpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmICghaW52YWxpZFByb3hpZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCQkJcmVtb3ZlSW52YWxpZFJlZmVyZW5jZXMoZWxlbWVudCwgbGlzdCwKLQkJCQkJCQkJCQkJCWludmFsaWRQcm94aWVzKTsKLQkJCQkJCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoZWxlbWVudAotCQkJCQkJCQkJCQkJLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmIChpc0ludmFsaWRSZWZlcmVuY2UoZWxlbWVudCwgcmVmLCB2YWx1ZSkpIHsKLQkJCQkJCQkJCWVsZW1lbnQuZVNldChyZWYsIG51bGwpOwotCQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCSJVbnJlc29sdmVkIHByb3h5IGluICciICsgZWxlbWVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSArICInOiAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCi0JCQkJbW9uaXRvci5zdWJUYXNrKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmluZ0ZpbGVzVGFza19uYW1lKTsgCi0JCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCQl0cnkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2RpZmllZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCW1vbml0b3Iuc3ViVGFzayhBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmluZ1Rhc2tfbmFtZSwgcmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpKTsKLQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQotCQkJcHJpdmF0ZSBib29sZWFuIGlzSW52YWxpZFJlZmVyZW5jZShJbnRlcm5hbEVPYmplY3QgZWxlbWVudCwKLQkJCQkJRVJlZmVyZW5jZSByZWYsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkgewotCQkJCQlJbnRlcm5hbEVPYmplY3QgZU9iaiA9IChJbnRlcm5hbEVPYmplY3QpIHZhbHVlOwotCQkJCQlpZiAoZU9iai5lSXNQcm94eSgpKSB7Ci0JCQkJCQlFT2JqZWN0IHJlc29sdmVkID0gZWxlbWVudC5lUmVzb2x2ZVByb3h5KGVPYmopOwotCQkJCQkJaWYgKCFyZWYuZ2V0RVR5cGUoKS5pc0luc3RhbmNlKHJlc29sdmVkKSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHJpdmF0ZSB2b2lkIHJlbW92ZUludmFsaWRSZWZlcmVuY2VzKEludGVybmFsRU9iamVjdCBlbGVtZW50LAotCQkJCQlJbnRlcm5hbEVMaXN0IHZhbHVlcywgQ29sbGVjdGlvbiBpbnZhbGlkUHJveGllcykgewotCQkJCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCh2YWx1ZXMuYmFzaWNMaXN0KCkpOwotCQkJCWxpc3QucmVtb3ZlQWxsKGludmFsaWRQcm94aWVzKTsKLQkJCQl2YWx1ZXMuY2xlYXIoKTsKLQkJCQlpbnQgbWF4ID0gbGlzdC5zaXplKCkgLSAxOwotCQkJCWZvciAoaW50IGkgPSBtYXg7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJCWxpc3Quc2V0KGksIGVsZW1lbnQuZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBsaXN0Ci0JCQkJCQkJLmdldChpKSkpOwotCQkJCX0KLQkJCQl2YWx1ZXMuYWRkQWxsKGxpc3QpOwotCQkJfQotCi0JCX07Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGV0aW5nSW52YWxpZFJlZmVyZW5jZXNUYXNrX25hbWUpOyAKLQotCX0KLQotCS8qKgotCSAqIHJlbG9hZHMgdGhlIGN1cnJlbnQgbGlicmFyeS4gIFVzZWQgb24gYSByb2xsYmFjayBlcnJvcgotCSAqIEBwYXJhbSBzaGVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWxvYWRDdXJyZW50TGliYXJ5T25Sb2xsYmFja0Vycm9yKFNoZWxsIHNoZWxsKSB7Ci0JCXJlbG9hZEN1cnJlbnRMaWJyYXJ5KHNoZWxsLCBBdXRob3JpbmdVSVJlc291cmNlcy5WaWV3SGVscGVyX3JlbG9hZExpYk9uUm9sbGJhY2tFcnJvcik7Ci0JfQotCi0JLyoqCi0JICogZGlzcGxheXMgdGhlIG1lc3NhZ2UgYW5kIHJlbG9hZHMgdGhlIGN1cnJlbnQgbGlicmFyeSAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWxvYWRDdXJyZW50TGlicmFyeShmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gTXNnQm94LmdldERpc3BsYXkoKTsKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlkb1JlbG9hZEN1cnJlbnRMaWJyYXJ5KHNoZWxsLCBtZXNzYWdlKTsgCi0JCQl9Ci0JCQkKLQkJfTsKLQkJaWYoZGlzcGxheSAhPSBudWxsKSB7Ci0JCQlkaXNwbGF5LmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlydW5uYWJsZS5ydW4oKTsKLQkJfQkJCi0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkb1JlbG9hZEN1cnJlbnRMaWJyYXJ5KFNoZWxsIHNoZWxsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoc2hlbGwgPT0gbnVsbCkgewotCQkJTXNnQm94LmdldERlZmF1bHRTaGVsbCgpOwotCQl9Ci0JCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbG9hZERpYWxvZ190aXRsZTsgCi0JCWlmIChtZXNzYWdlID09IG51bGwpIHsKLQkJCW1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZWxvYWREaWFsb2dfbWVzc2FnZTsgCi0JCX0KLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlJbmZvKHRpdGxlLAotCQkJCW1lc3NhZ2UpOwotCi0JCS8vIFRoZSBsaWJyYXJ5IG5lZWRzIHRvIGJlIHJlbG9hZGVkLgotCQlTdHJpbmcgbGliRGlyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCk7Ci0JCUxpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5vcGVuTGlicmFyeShsaWJEaXIpOwotCX0KLQotCS8qKgotCSAqIG9wZW5zIHRoZSBnaXZlbiB2aWV3SWQKLQkgKiBAcGFyYW0gdmlld0lkCi0JICogQHJldHVybgotCSAqIAkJCVZpZXcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaWV3UGFydCBvcGVuVmlldyhTdHJpbmcgdmlld0lkKSB7Ci0JCXJldHVybiBmaW5kVmlldyh2aWV3SWQsIHRydWUpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBvcGVucyB0aGUgZ2l2ZW4gdmlld0lkCi0JICogQHBhcmFtIHZpZXdJZAotCSAqIEByZXR1cm4KLQkgKiAJCQlWaWV3Ci0JICovCi0JcHVibGljIHN0YXRpYyBJVmlld1BhcnQgZmluZFZpZXcoU3RyaW5nIHZpZXdJZCwgYm9vbGVhbiBzaG93KSB7Ci0JCXRyeSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJCUlWaWV3UGFydCB2aWV3ID0gYWN0aXZlUGFnZS5maW5kVmlldyh2aWV3SWQpOwotCQkJCWlmICh2aWV3ID09IG51bGwpIHsKLQkJCQkJCi0JCQkJCS8vIGFsd2F5cyBjcmVhdGUgdGhlIHZpZXcKLQkJCQkJdmlldyA9IGFjdGl2ZVBhZ2Uuc2hvd1ZpZXcodmlld0lkKTsJCQkJCQotCQkJCX0KLQkJCQkKLQkJCQlpZiAoICFzaG93ICkgewotCQkJCQlhY3RpdmVQYWdlLmhpZGVWaWV3KHZpZXcpOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gdmlldzsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuaW50ZXJuYWxFcnJvcl9tc2csIAotCQkJCQllKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWaWV3SW5DdXJyZW50UGVyc3BlY3RpdmUoU3RyaW5nIHZpZXdJZCkgewkJCi0JCVN0cmluZyBwZXJzcGVjdGl2ZUlkID0gUGVyc3BlY3RpdmVVdGlsLmdldEFjdGl2ZVBlcnNwZWN0aXZlSWQoKTsKLQkJcmV0dXJuIGlzVmlld0luUGVyc3BlY3RpdmUodmlld0lkLCBwZXJzcGVjdGl2ZUlkKTsKLQl9Ci0JCi0JLyoqCi0JICogRGVjaWVkZSB3aGV0aGVyIHRoZSB2aWV3IGRlZmluZGVkIGluIHRoZSBwZXJzcGVjdGl2ZSBvciBub3QKLQkgKiAKLQkgKiBAYXV0aG9yIGRhdmlkIHpob25nd2VpCi0JICogQHBhcmFtIHZpZXdJZAotCSAqIEBwYXJhbSBwZXJwZWN0aXZlSWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmlld0luUGVyc3BlY3RpdmUoU3RyaW5nIHZpZXdJZCwgU3RyaW5nIHBlcnNwZWN0aXZlSWQpIHsKLQkJaWYgKHZpZXdJZCA9PSBudWxsIHx8IHBlcnNwZWN0aXZlSWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJZmluYWwgU3RyaW5nIE5BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS51aSI7Ly8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgRVhURU5TSU9OUE9JTlRfSUQgPSAicGVyc3BlY3RpdmVFeHRlbnNpb25zIjsvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBUQVJHRVRfSUQgPSAidGFyZ2V0SUQiOy8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIFZJRVcgPSAidmlldyI7Ly8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSUQgPSAiaWQiOy8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIFZJRVdTSE9SVENVVCA9ICJ2aWV3U2hvcnRjdXQiOy8vJE5PTi1OTFMtMSQKLQotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBudWxsOwotCQlpZiAoZXh0ZW5zaW9uUmVnaXN0cnkgIT0gbnVsbCkgewotCQkJZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChOQU1FU1BBQ0UsIEVYVEVOU0lPTlBPSU5UX0lEKTsKLQkJfQotCi0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgaWQgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShUQVJHRVRfSUQpOwotCQkJCQkJaWYgKHBlcnNwZWN0aXZlSWQuZXF1YWxzKGlkKSkgewotCi0JCQkJCQkJLy8gZGVjaWRlIHdoZXRoZXIgaXMgZGVmaW5lZCBpbiAidmlldyIKLQkJCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50c0ZvclZpZXcgPSBjb25maWdFbGVtZW50LmdldENoaWxkcmVuKFZJRVcpOwotCQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgY29uZmlnRWxlbWVudHNGb3JWaWV3Lmxlbmd0aDsgaysrKSB7Ci0JCQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzRm9yVmlld1trXTsKLQkJCQkJCQkJaWYgKHZpZXdJZC5lcXVhbHMoY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKElEKSkpIHsKLQkJCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCi0JCQkJCQkJLy8gZGVjaWRlIHdoZXRoZXIgaXMgZGVmaW5lZCBpbiAidmlld1Nob3J0Y3V0IgotCQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzRm9yVmlld1Nob3J0Y3V0ID0gY29uZmlnRWxlbWVudAotCQkJCQkJCSAgICAgICAgLmdldENoaWxkcmVuKFZJRVdTSE9SVENVVCk7Ci0JCQkJCQkJZm9yIChpbnQgbCA9IDA7IGwgPCBjb25maWdFbGVtZW50c0ZvclZpZXdTaG9ydGN1dC5sZW5ndGg7IGwrKykgewotCQkJCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQgPSBjb25maWdFbGVtZW50c0ZvclZpZXdTaG9ydGN1dFtsXTsKLQkJCQkJCQkJaWYgKHZpZXdJZC5lcXVhbHMoY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKElEKSkpIHsKLQkJCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFZpZXcoQWJzdHJhY3RCYXNlVmlldyBjb25maWdWaWV3KSB7Ci0JCUNvbnRyb2wgY3RybCA9IGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpOwotCQlpZiAoY3RybCAhPSBudWxsICYmICFjdHJsLmlzRGlzcG9zZWQoKSkgewotCQkJT2JqZWN0IGlucHV0ID0gIGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkuZ2V0SW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaW5wdXQ7Ci0JCQkJaWYgKGVPYmplY3QuZUlzUHJveHkoKSkgewotCQkJCQljb25maWdWaWV3LnNldElucHV0Rm9yVmlld2VyKFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5yZXNvbHZlKGVPYmplY3QpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCQkJCQlyZXN0b3JlU2VsZWN0aW9uKGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCksIHNlbGVjdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVzdG9yZVNlbGVjdGlvbihWaWV3ZXIgdmlld2VyLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWJvb2xlYW4gcmVzdG9yZSA9IGZhbHNlOwotCQkJQXJyYXlMaXN0IHJlc29sdmVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCQkJCWlmIChlT2JqLmVJc1Byb3h5KCkpIHsKLQkJCQkJCWVPYmogPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzb2x2ZShlT2JqKTsKLQkJCQkJCXJlc3RvcmUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWlmICghZU9iai5lSXNQcm94eSgpKSB7Ci0JCQkJCQlyZXNvbHZlZExpc3QuYWRkKGVPYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlc3RvcmUpIHsKLQkJCQl2aWV3ZXIKLQkJCQkJCS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocmVzb2x2ZWRMaXN0KSwKLQkJCQkJCQkJdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzM5YmM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdmlld3MgZm9yIHRoZSBBdXRob3JpbmcgYW5kIEJyb3dzaW5nIHBlcnNwZWN0aXZlcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL0NvbmZpZ3VyYXRpb25UYWJsZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFhOGRkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLS8qKgotICogVGhlIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgQ29uZmlndXJhdGlvbiB0YWJsZSBpbiB0aGUgT3BlbiBDb25maWd1cmF0aW9uCi0gKiB3aXphcmQuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBpbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBpbmRleCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBlbGVtZW50OwotCQlyZXR1cm4gY29uZmlnLmdldE5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYzN2JkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gZW50ZXIgYSBuYW1lIGFuZCBkZXNjcmlwdGlvbiBmb3IgYSBuZXcKLSAqIG1ldGhvZCBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5ld0NvbmZpZ3VyYXRpb25NYWluUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IE5ld0NvbmZpZ3VyYXRpb25NYWluUGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIFRleHQgbmFtZVRleHQ7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBicmllZkRlc2NUZXh0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL05ldy5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0NvbmZpZ3VyYXRpb25NYWluUGFnZSgpIHsKLQkJdGhpcyhQQUdFX05BTUUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIDMpOwotCi0JCWNyZWF0ZVZlcnRpY2FsbHlBbGlnbmVkTGFiZWwoY29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuTkFNRV9URVhUKTsKLQotCQluYW1lVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChjb21wb3NpdGUsIDIpOwotCi0JCWNyZWF0ZVZlcnRpY2FsbHlBbGlnbmVkTGFiZWwoY29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9URVhUKTsKLQotCQlicmllZkRlc2NUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KGNvbXBvc2l0ZSwgNDAwLCA4MCwgMik7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJU3RyaW5nIG5hbWUgPSAibmV3X2NvbmZpZyI7IC8vJE5PTi1OTFMtMSQKLQkJaWYobGliICE9IG51bGwpIHsKLQkJCW5hbWUgPSBUbmdVdGlsLmdldE5leHRBdmFpbGFibGVOYW1lKGxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSwgbmFtZSk7Ci0JCX0KLQkJbmFtZVRleHQuc2V0VGV4dChuYW1lKTsgCi0JfQotCi0JLyoqCi0JICogQWRkcyBldmVudCBoYW5kbGVycyB0byB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQluYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChuYW1lVGV4dCAhPSBudWxsKSB7Ci0JCQluYW1lVGV4dC5zZXRGb2N1cygpOwotCQkJbmFtZVRleHQuc2VsZWN0QWxsKCk7Ci0JCX0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShMaWJyYXJ5VUlSZXNvdXJjZXMubm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZyBjb25maWdOYW1lID0gZ2V0Q29uZmlndXJhdGlvbk5hbWUoKTsKLQotCQlpZiAoIXZhbGlkYXRlQ29uZmlndXJhdGlvbk5hbWUoY29uZmlnTmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChjb25maWd1cmF0aW9uRXhpc3RzKGNvbmZpZ05hbWUpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJfQotCi0JCXJldHVybiBnZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzCi0JICogaW4gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ05hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIGZvciBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHdpdGggdGhlIHNhbWUgbmFtZQotCSAqICAgICAgICAgYWxyZWFkeSBleGlzdHMKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25maWd1cmF0aW9uRXhpc3RzKFN0cmluZyBjb25maWdOYW1lKSB7Ci0JCVN0cmluZ1tdIGNvbmZpZ05hbWVzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lcyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb25maWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoY29uZmlnTmFtZXNbaV0pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyBhIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb25maWd1cmF0aW9uIG5hbWUgaXMgdmFsaWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUNvbmZpZ3VyYXRpb25OYW1lKFN0cmluZyBuYW1lKSB7Ci0JCS8vIFRPRE86IENhbGwgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSB2YWxpZGF0b3Igd2hlbiBpdCBpcyByZWFkeS4KLQkJU3RyaW5nIGVycm1zZyA9IFRuZ1V0aWwuY2hlY2tFbGVtZW50TmFtZShuYW1lLAotCQkJCUxpYnJhcnlVSVRleHQuVEVYVF9NRVRIT0RfQ09ORklHVVJBVE9OKTsKLQkJaWYgKGVycm1zZyAhPSBudWxsKSB7Ci0JCQllcnJtc2cgPSBlcnJtc2cucmVwbGFjZUFsbCgiXG5cbiIsICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXNldEVycm9yTWVzc2FnZShlcnJtc2cpOwotCQlyZXR1cm4gZXJybXNnID09IG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBmb3IgdGhlIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlndXJhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIG1ldGhvZCBjb25maWd1cmF0aW9uIGJyaWVmIGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJyaWVmIGRlc2NyaXB0aW9uIGZvciB0aGUgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCcmllZkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYnJpZWZEZXNjVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0NvbmZpZ3VyYXRpb25XaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdDb25maWd1cmF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MzlmYmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0NvbmZpZ3VyYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLkxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEEgd2l6YXJkIHRoYXQgZ3VpZGVzIHRoZSB1c2VyIHRvIGNyZWF0ZSBhIG5ldyBNZXRob2QgQ29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdDb25maWd1cmF0aW9uV2l6YXJkIGV4dGVuZHMgQmFzZVdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfSUQgPSBOZXdDb25maWd1cmF0aW9uV2l6YXJkLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogVGhlIE5ldyBNZXRob2QgQ29uZmlndXJhdGlvbiB3aXphcmQgZXh0ZW5zaW9uIHBvaW50IElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9FWFRFTlNJT05fUE9JTlRfSUQgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5uZXdDb25maWd1cmF0aW9uV2l6YXJkIjsgLy8kTk9OLU5MUy0xJAkKLQotCS8vIFRoZSBtYWluIHdpemFyZCBwYWdlLgotCXByb3RlY3RlZCBOZXdDb25maWd1cmF0aW9uTWFpblBhZ2UgbWFpblBhZ2U7Ci0KLQkvLyBUaGUgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0NvbmZpZ3VyYXRpb25XaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkI2dldFdpemFyZEV4dGVuZGVyRXh0ZW5zaW9uUG9pbnRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaXphcmRFeHRlbmRlckV4dGVuc2lvblBvaW50SWQoKSB7Ci0JCXJldHVybiBXSVpBUkRfRVhURU5TSU9OX1BPSU5UX0lEOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvbik7Ci0JCXNldFdpbmRvd1RpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWlmICh3aXphcmRFeHRlbmRlciA9PSBudWxsKSB7Ci0JCQltYWluUGFnZSA9IGNyZWF0ZU1haW5QYWdlKCk7Ci0JCQlzdXBlci5hZGRQYWdlKG1haW5QYWdlKTsKLQkJfSBlbHNlIHsKLQkJCUxpc3Q8SVdpemFyZFBhZ2U+IHdpemFyZFBhZ2VzID0gbmV3IEFycmF5TGlzdDxJV2l6YXJkUGFnZT4oKTsKLQotCQkJSVdpemFyZFBhZ2UgcGFnZSA9IHdpemFyZEV4dGVuZGVyCi0JCQkJCS5nZXRSZXBsYWNlV2l6YXJkUGFnZShOZXdDb25maWd1cmF0aW9uTWFpblBhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCW1haW5QYWdlID0gY3JlYXRlTWFpblBhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQobWFpblBhZ2UpOwotCQkJfQotCi0JCQlzdXBlci5nZXROZXdXaXphcmRQYWdlcyh3aXphcmRQYWdlcyk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB3aXphcmRQYWdlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJSVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IChJV2l6YXJkUGFnZSkgaXQubmV4dCgpOwotCQkJCXN1cGVyLmFkZFBhZ2Uod2l6YXJkUGFnZSk7Ci0JCQl9Ci0KLQkJCXdpemFyZEV4dGVuZGVyLmluaXRXaXphcmRQYWdlcyh3aXphcmRQYWdlcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtYWluIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1haW4gd2l6YXJkIHBhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlIGNyZWF0ZU1haW5QYWdlKCkgewotCQlyZXR1cm4gbmV3IE5ld0NvbmZpZ3VyYXRpb25NYWluUGFnZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCQkiZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIG1ldGhvZAotCSAqIGNvbmZpZ3VyYXRpb24gaXMgY3JlYXRlZCBpbiB0aGUgTGlicmFyeSB2aWV3IHZpYSB0aGUgY29udGV4dCBtZW51LiBVcG9uCi0JICogY29tcGxldGluZyB0aGlzIHdpemFyZCwgdGhlIG5ld2x5IGNyZWF0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gd2lsbCBiZQotCSAqIGluaXRpYWxpemVkIHdpdGggdGhlIG5hbWUgYW5kIGJyaWVmIGRlc2NyaXB0aW9uIGVudGVyZWQgYnkgdGhlIHVzZXIgaW4KLQkgKiB0aXMgd2l6YXJkLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZCNkb0ZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZG9GaW5pc2goKSB7Ci0JCWJvb2xlYW4gcmV0ID0gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbihtYWluUGFnZS5nZXRDb25maWd1cmF0aW9uTmFtZSgpLAotCQkJCW1haW5QYWdlLmdldEJyaWVmRGVzY3JpcHRpb24oKSwgbWFpblBhZ2UpOwotCQlpZihyZXQpIHsKLQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCS5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJcGVyc2lzdGVyLnNhdmUobGlicmFyeS5lUmVzb3VyY2UoKSk7Ci0JCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJfQotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3Q29uZmlndXJhdGlvbldpemFyZF90aXRsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmludGVybmFsRXJyb3JfbXNnLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIGZvciB0aGUgbmV3IGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gYnJpZWZEZXNjCi0JICogICAgICAgICAgICB0aGUgYnJpZWYgZGVzY3JpcHRpb24gZm9yIHRoZSBuZXcgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSB3aXphcmRQYWdlCi0JICogICAgICAgICAgICB0aGUgd2l6YXJkIHBhZ2UgdXNlZCBmb3IgZGlzcGxheWluZyBlcnJvciBtZXNzYWdlcwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGlzIGNyZWF0ZWQKLQkgKiAgICAgICAgIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBicmllZkRlc2MsCi0JCQlXaXphcmRQYWdlIHdpemFyZFBhZ2UpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGMgPSBjb25maWcgPT0gbnVsbCA/IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKSA6IGNvbmZpZzsKLQkJCWMuc2V0TmFtZShuYW1lKTsKLQkJCQotCQkJaWYgKCEgbmFtZUNoZWNrKG5hbWUsIHdpemFyZFBhZ2UsIGxpYnJhcnksIGMpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCQljb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbihuYW1lLCBsaWJyYXJ5KTsKLQkJCX0KLQotCQkJaWYgKGJyaWVmRGVzYyAhPSBudWxsKSB7Ci0JCQkJY29uZmlnLnNldEJyaWVmRGVzY3JpcHRpb24oYnJpZWZEZXNjKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGUsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmludGVybmFsRXJyb3JfbXNnLCBlKTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBuYW1lQ2hlY2soU3RyaW5nIG5hbWUsIFdpemFyZFBhZ2Ugd2l6YXJkUGFnZSwgCi0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnksIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnKSB7Ci0JCS8vIEZpeCBmb3IgYnVnemlsbGEgMTc4NDYyLgotCQlTdHJpbmcgZXJybXNnID0gbnVsbDsKLQkJaWYgKG5hbWUuaW5kZXhPZigiJiIpID4gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJZXJybXNnID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmludmFsaWRFbGVtZW50TmFtZUVycm9yNF9tc2csCi0JCQkJCQkJbmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5jcmVhdGVOYW1lVmFsaWRhdG9yKGxpYnJhcnksIG1ldGhvZENvbmZpZyk7Ci0JCQllcnJtc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChuYW1lKTsKLQkJfQotCi0JCWlmIChlcnJtc2cgIT0gbnVsbCkgewotCQkJd2l6YXJkUGFnZS5zZXRFcnJvck1lc3NhZ2UoZXJybXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuZXdseSBjcmVhdGVkIG1ldGhvZCBjb25mZ3VyYXRpb24uCi0JICogCi0JICogQHJldHVybiBhIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHN1cGVyUGVyZm9ybUZpbmlzaCgpIHsKLQkJcmV0dXJuIHN1cGVyLnBlcmZvcm1GaW5pc2goKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlmaW5hbCBib29sZWFuW10gcmVzdWx0SG9sZGVyID0gbmV3IGJvb2xlYW5bMV07Ci0JCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJcmVzdWx0SG9sZGVyWzBdID0gc3VwZXJQZXJmb3JtRmluaXNoKCk7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHRIb2xkZXJbMF07Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TGlicmFyeU1haW5QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TGlicmFyeU1haW5QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmFjOWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0xpYnJhcnlNYWluUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5TWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBlbnRlciB0aGUgbmFtZSBhbmQgYnJpZWYgZGVzY3JpcHRpb24KLSAqIGZvciBhIG5ldyBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdMaWJyYXJ5TWFpblBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIHBhZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBOZXdMaWJyYXJ5TWFpblBhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotCXByaXZhdGUgQ29tYm8gbGlicmFyeVBhdGhDb21ibzsKLQotCXByaXZhdGUgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCXByaXZhdGUgVGV4dCBicmllZkRlc2NUZXh0OwotCi0JcHJpdmF0ZSBTdHJpbmcgbGlicmFyeVR5cGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdMaWJyYXJ5TWFpblBhZ2UoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV9kZXNjcmlwdGlvbik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9OZXcuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMyk7Ci0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5saWJyYXJ5UGF0aExhYmVsX3RleHQpOwotCi0JCWxpYnJhcnlQYXRoQ29tYm8gPSBjcmVhdGVDb21ib2JveChjb21wb3NpdGUpOwotCi0JCWJyb3dzZUJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkJST1dTRV9CVVRUT05fVEVYVCk7Ci0KLQkJY3JlYXRlVmVydGljYWxseUFsaWduZWRMYWJlbChjb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1RFWFQpOwotCi0JCWJyaWVmRGVzY1RleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQoY29tcG9zaXRlLCA0MDAsIDgwLCAxKTsKLQotCQlNYXAgdHlwZXMgPSBMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRMaWJyYXJ5VHlwZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHR5cGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWxpYnJhcnlUeXBlID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpbml0Q29udHJvbHMoKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCVN0cmluZyBkZWZhdWx0TGlicmFyeVBhdGggPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZWZhdWx0TGlicmFyeVBhdGgoKTsKLQkJRmlsZSBkZWZhdWx0TGlicmFyeURpciA9IG5ldyBGaWxlKGRlZmF1bHRMaWJyYXJ5UGF0aCk7Ci0JCVN0cmluZyBuZXdMaWJyYXJ5UGF0aCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAxOzsgaSsrKSB7Ci0JCQlGaWxlIG5ld0xpYnJhcnlEaXIgPSBuZXcgRmlsZShkZWZhdWx0TGlicmFyeURpciwgIkxpYnJhcnkiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICghbmV3TGlicmFyeURpci5leGlzdHMoKSkgewotCQkJCW5ld0xpYnJhcnlQYXRoID0gbmV3TGlicmFyeURpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCUxpc3Q8U3RyaW5nPiBuZXdMaWJyYXJ5UGF0aHNMaXN0ID0gTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0TmV3TGlicmFyeVBhdGhzTGlzdCgpOwotCQlpZiAobmV3TGlicmFyeVBhdGggIT0gbnVsbCAmJiBuZXdMaWJyYXJ5UGF0aC5sZW5ndGgoKSA+IDApIHsKLQkJCW5ld0xpYnJhcnlQYXRoc0xpc3QuYWRkKDAsIG5ld0xpYnJhcnlQYXRoKTsKLQkJfQotCQlpZiAobmV3TGlicmFyeVBhdGhzTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlTdHJpbmdbXSBuZXdMaWJyYXJ5UGF0aHMgPSBuZXcgU3RyaW5nW25ld0xpYnJhcnlQYXRoc0xpc3Quc2l6ZSgpXTsKLQkJCW5ld0xpYnJhcnlQYXRoc0xpc3QudG9BcnJheShuZXdMaWJyYXJ5UGF0aHMpOwotCQkJbGlicmFyeVBhdGhDb21iby5zZXRJdGVtcyhuZXdMaWJyYXJ5UGF0aHMpOwotCQkJbGlicmFyeVBhdGhDb21iby5zZXRUZXh0KG5ld0xpYnJhcnlQYXRoc1swXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlsaWJyYXJ5UGF0aENvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWxpYnJhcnlQYXRoQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coc2hlbGwsIFNXVC5OT05FKTsKLQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChnZXRMaWJyYXJ5UGF0aCgpKTsKLQkJCQlTdHJpbmcgc2VsZWN0ZWREaXIgPSBkaWFsb2cub3BlbigpOwotCQkJCWlmIChzZWxlY3RlZERpciAhPSBudWxsKSB7Ci0JCQkJCWxpYnJhcnlQYXRoQ29tYm8uYWRkKHNlbGVjdGVkRGlyLCAwKTsKLQkJCQkJbGlicmFyeVBhdGhDb21iby5zZXRUZXh0KHNlbGVjdGVkRGlyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlyZXR1cm4gZ2V0TGlicmFyeU5hbWUoKS5sZW5ndGgoKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlicmFyeSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeU5hbWUoKSB7Ci0JCVN0cmluZyBsaWJQYXRoID0gZ2V0TGlicmFyeVBhdGgoKTsKLQkJU3RyaW5nIGxpYk5hbWUgPSBuZXcgRmlsZShsaWJQYXRoKS5nZXROYW1lKCk7Ci0JCWlmICghbGliUGF0aC5lcXVhbHMobGliTmFtZSkpIHsKLQkJCXJldHVybiBsaWJOYW1lOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBsaWJyYXJ5IHBhdGguCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5UGF0aCgpIHsKLQkJcmV0dXJuIGxpYnJhcnlQYXRoQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeSBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGJyaWVmRGVzY1RleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeSB0eXBlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeVR5cGUoKSB7Ci0JCXJldHVybiBsaWJyYXJ5VHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTBmYzY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuUGVyc3BlY3RpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogQSB3aXphcmQgdGhhdCBndWlkZXMgdGhlIHVzZXIgdG8gY3JlYXRlIGEgbmV3IG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5ld0xpYnJhcnlXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0lEID0gTmV3TGlicmFyeVdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvLyBUaGUgbWFpbiB3aXphcmQgcGFnZS4KLQlwcml2YXRlIE5ld0xpYnJhcnlNYWluUGFnZSBtYWluUGFnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0xpYnJhcnlXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRXaW5kb3dUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlTYXZlQWxsRWRpdG9yc1BhZ2UuYWRkUGFnZUlmTmVlZGVkKHRoaXMsIHRydWUsIG51bGwsIG51bGwsIG51bGwpOwotCQltYWluUGFnZSA9IG5ldyBOZXdMaWJyYXJ5TWFpblBhZ2UoKTsKLQkJYWRkUGFnZShtYWluUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkJCSJmdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgbmFtZSA9IG1haW5QYWdlLmdldExpYnJhcnlOYW1lKCk7Ci0JCQlTdHJpbmcgZGVzYyA9IG1haW5QYWdlLmdldExpYnJhcnlEZXNjcmlwdGlvbigpOwotCQkJU3RyaW5nIHR5cGUgPSBtYWluUGFnZS5nZXRMaWJyYXJ5VHlwZSgpOwotCQkJTWFwPFN0cmluZywgT2JqZWN0PiBvcHRpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCQlGaWxlIGxpYnJhcnlQYXRoID0gbmV3IEZpbGUobWFpblBhZ2UuZ2V0TGlicmFyeVBhdGgoKSk7Ci0JCQlvcHRpb25zLnB1dChYTUlMaWJyYXJ5TWFuYWdlci5BUkdfTElCUkFSWV9QQVRILCBsaWJyYXJ5UGF0aAotCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0JCQlpZiAoWE1JTGlicmFyeVV0aWwuY29udGFpbnNQbHVnaW5PckNvbmZpZ1NwZWNFeHBvcnRGaWxlKGxpYnJhcnlQYXRoCi0JCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKSkpIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX3JlYXNvbjQpOwotCQkJfQotCi0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5jcmVhdGVNZXRob2RMaWJyYXJ5KG5hbWUsIHR5cGUsIG9wdGlvbnMpOwotCQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJCWlmIChkZXNjLmxlbmd0aCgpID4gMCkgewotCQkJCQlsaWJyYXJ5LnNldEJyaWVmRGVzY3JpcHRpb24oZGVzYyk7Ci0JCQkJfQotCQkJCUxpYnJhcnlVSVByZWZlcmVuY2VzLmFkZE5ld0xpYnJhcnlQYXRoKGxpYnJhcnlQYXRoCi0JCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCVBlcnNwZWN0aXZlVXRpbAotCQkJCQkJLm9wZW5QZXJzcGVjdGl2ZShBdXRob3JpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQlpZiAocmVhc29uID09IG51bGwpIHsKLQkJCQlyZWFzb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5SW50ZXJubEVycm9yX3JlYXNvbjsKLQkJCX0KLQkJCXJlYXNvbiArPSAiXG5cbiIgKyBBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5RXJyb3JfYWR2aWNlOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlFcnJvcl9tc2csIHJlYXNvbik7Ci0JCQl9IGVsc2UgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlFcnJvcl9tc2csIHJlYXNvbiwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld1BsdWdpbk1haW5QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3UGx1Z2luTWFpblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVlMDQ3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3UGx1Z2luTWFpblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTW9kZWxTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBuYW1lLCBicmllZiBkZXNjcmlwdGlvbiwKLSAqIGF1dGhvcnMgYW5kIHJlZmVyZW5jZWQgbWF0aG9kIHBsdWctaW5zIGZvciBhIG5ldyBtZXRob2QgcGx1Zy1pbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdQbHVnaW5NYWluUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IE5ld1BsdWdpbk1haW5QYWdlLmNsYXNzLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBUZXh0IG5hbWVUZXh0OwotCi0JcHJvdGVjdGVkIFRleHQgYnJpZWZEZXNjVGV4dDsKLQotCXByb3RlY3RlZCBUZXh0IGF1dGhvcnNUZXh0OwotCi0JcHJvdGVjdGVkIENoZWNrYm94VGFibGVWaWV3ZXIgcmVmZXJlbmNlZFBsdWdpbnNWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgTGlzdDxNZXRob2RQbHVnaW4+IHBsdWdpbnM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdQbHVnaW5NYWluUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5uZXdQbHVnaW5XaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3UGx1Z2luV2l6YXJkUGFnZV90ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL05ldy5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdQbHVnaW5NYWluUGFnZSgpIHsKLQkJdGhpcyhQQUdFX05BTUUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUocGFyZW50LCAyKTsKLQotCQljcmVhdGVWZXJ0aWNhbGx5QWxpZ25lZExhYmVsKGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0Lk5BTUVfVEVYVCk7Ci0KLQkJbmFtZVRleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQoY29tcG9zaXRlKTsKLQotCQljcmVhdGVWZXJ0aWNhbGx5QWxpZ25lZExhYmVsKGNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQlJJRUZfREVTQ1JJUFRJT05fVEVYVCk7Ci0KLQkJYnJpZWZEZXNjVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChjb21wb3NpdGUsIDQwMCwgODAsIDEpOwotCi0JCWNyZWF0ZVZlcnRpY2FsbHlBbGlnbmVkTGFiZWwoY29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuQVVUSE9SU19URVhUKTsKLQotCQlhdXRob3JzVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChjb21wb3NpdGUsIDQwMCwgNDAsIDEpOwotCi0JCWNyZWF0ZVZlcnRpY2FsbHlBbGlnbmVkTGFiZWwoY29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5SRUZFUkVOQ0VEX1BMVUdJTlNfU0VDVElPTl9OQU1FKTsKLQotCQlyZWZlcmVuY2VkUGx1Z2luc1ZpZXdlciA9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KGNvbXBvc2l0ZSwKLQkJCQlTV1QuQk9SREVSIHwgU1dULkZJTEwgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCUdyaWREYXRhIHJlZmVyZW5jZWRQbHVnaW5zR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJcmVmZXJlbmNlZFBsdWdpbnNHcmlkRGF0YS5oZWlnaHRIaW50ID0gMTUwOwotCQlyZWZlcmVuY2VkUGx1Z2luc1ZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEoCi0JCQkJcmVmZXJlbmNlZFBsdWdpbnNHcmlkRGF0YSk7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlTdHJpbmcgbmFtZSA9ICJuZXdfcGx1Zy1pbiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSAhPSBudWxsKSB7Ci0JCQluYW1lID0gVG5nVXRpbC5nZXROZXh0QXZhaWxhYmxlTmFtZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLmdldE1ldGhvZFBsdWdpbnMoKSwgbmFtZSk7Ci0JCX0KLQkJbmFtZVRleHQuc2V0VGV4dChuYW1lKTsKLQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gTGlicmFyeVVJSW1hZ2VzLklNR19NRVRIT0RfUExVR0lOOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlyZXR1cm4gKChNZXRob2RQbHVnaW4pIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlyZWZlcmVuY2VkUGx1Z2luc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQlyZWZlcmVuY2VkUGx1Z2luc1ZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpKTsKLQotCQlwbHVnaW5zID0gTW9kZWxTdG9yYWdlLmdldEJhc2VNb2RlbHMoKTsKLQkJU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW3BsdWdpbnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgcGx1Z2lucy5nZXQoaSk7Ci0JCQlpdGVtc1tpXSA9IHBsdWdpbi5nZXROYW1lKCk7Ci0JCX0KLQotCQlpZiAocGx1Z2lucyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvcjxNZXRob2RQbHVnaW4+IGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCXJlZmVyZW5jZWRQbHVnaW5zVmlld2VyLmFkZChpdC5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJbmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNvbkVudGVyUGFnZShPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgb25FbnRlclBhZ2UoT2JqZWN0IG9iaikgewotCQlpZiAobmFtZVRleHQgIT0gbnVsbCkgewotCQkJbmFtZVRleHQuc2V0Rm9jdXMoKTsKLQkJCW5hbWVUZXh0LnNlbGVjdEFsbCgpOwotCQl9Ci0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSA9PSBudWxsKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLm5vT3BlbkxpYnJhcnlXYXJuaW5nX21zZyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdmFsaWRhdGVQbHVnaW5OYW1lKGdldFBsdWdpbk5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIGEgbWV0aG9kIHBsdWctaW4gbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgYSBtZXRob2QgcGx1Zy1pbgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBsdWctaW4gbmFtZSBpcyB2YWxpZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGx1Z2luTmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgZXJybXNnID0gTGlicmFyeVV0aWwuY2hlY2tQbHVnaW5OYW1lKG51bGwsIGdldFBsdWdpbk5hbWUoKSk7Ci0JCWlmIChlcnJtc2cgIT0gbnVsbCkgewotCQkJLy8gUmVtb3ZlIG5ld2xpbmUgY2hhcmFjdGVycyBmcm9tIHRoZSBtZXNzYWdlIHRvIGZpdCBpdCBpbiB0aGUgZXJyb3IKLQkJCS8vIG1lc3NhZ2UgYXJlYSBvZiB0aGUgd2l6YXJkIHBhZ2UuCi0JCQllcnJtc2cgPSBlcnJtc2cucmVwbGFjZUFsbCgiXG5cbiIsICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXNldEVycm9yTWVzc2FnZShlcnJtc2cpOwotCQlyZXR1cm4gZXJybXNnID09IG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgbWV0aG9kIHBsdWctaW4gbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIGZvciB0aGUgbmV3IG1ldGhvZCBwbHVnLWluCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5OYW1lKCkgewotCQlyZXR1cm4gbmFtZVRleHQuZ2V0VGV4dCgpICE9IG51bGwgPyBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBtZXRob2QgcGx1Zy1pbiBicmllZiBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBicmllZiBkZXNjcmlwdGlvbiBmb3IgdGhlIG5ldyBtZXRob2QgcGx1Zy1pbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QnJpZWZEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGJyaWVmRGVzY1RleHQuZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIG1ldGhvZCBwbHVnLWluIGF1dGhvcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgYXV0aG9ycyBmb3IgdGhlIG5ldyBtZXRob2QgcGx1Zy1pbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXV0aG9ycygpIHsKLQkJcmV0dXJuIGF1dGhvcnNUZXh0LmdldFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCByZWZlcmVuY2VkIG1ldGhvZCBwbHVnLWlucyBmb3IgdGhlIG5ldyBtZXRob2QKLQkgKiBwbHVnLWluLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHJlZmVyZW5jZWQgbWV0aG9kIHBsdWctaW5zIGZvciB0aGUgbmV3IG1ldGhvZAotCSAqICAgICAgICAgcGx1Zy1pbgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRSZWZlcmVuY2VkUGx1Z2lucygpIHsKLQkJcmV0dXJuIHJlZmVyZW5jZWRQbHVnaW5zVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld1BsdWdpbldpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld1BsdWdpbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjM1Y2Y4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdQbHVnaW5XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLkxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogQSB3aXphcmQgdGhhdCBndWlkZXMgdGhlIHVzZXIgdG8gY3JlYXRlIGEgbmV3IG1ldGhvZCBQbHVnLWluLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5ld1BsdWdpbldpemFyZCBleHRlbmRzIEJhc2VXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0lEID0gTmV3UGx1Z2luV2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQotCS8qKgotCSAqIFRoZSBOZXcgTWV0aG9kIFBsdWctaW4gd2l6YXJkIGV4dGVuc2lvbiBwb2ludCBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfRVhURU5TSU9OX1BPSU5UX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmV3UGx1Z2luV2l6YXJkIjsgLy8kTk9OLU5MUy0xJAkKLQotCS8vIFRoZSBtYWluIHdpemFyZCBwYWdlLgotCXByb3RlY3RlZCBOZXdQbHVnaW5NYWluUGFnZSBtYWluUGFnZTsKLQotCS8vIFRoZSBuZXcgbWV0aG9kIHBsdWctaW4uCi0JcHJvdGVjdGVkIE1ldGhvZFBsdWdpbiBuZXdQbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdQbHVnaW5XaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkI2dldFdpemFyZEV4dGVuZGVyRXh0ZW5zaW9uUG9pbnRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaXphcmRFeHRlbmRlckV4dGVuc2lvblBvaW50SWQoKSB7Ci0JCXJldHVybiBXSVpBUkRfRVhURU5TSU9OX1BPSU5UX0lEOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvbik7Ci0JCXNldFdpbmRvd1RpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbldpemFyZF90aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJaWYgKHdpemFyZEV4dGVuZGVyID09IG51bGwpIHsKLQkJCW1haW5QYWdlID0gY3JlYXRlTWFpblBhZ2UoKTsKLQkJCXN1cGVyLmFkZFBhZ2UobWFpblBhZ2UpOwotCQl9IGVsc2UgewotCQkJTGlzdDxJV2l6YXJkUGFnZT4gd2l6YXJkUGFnZXMgPSBuZXcgQXJyYXlMaXN0PElXaXphcmRQYWdlPigpOwotCi0JCQlJV2l6YXJkUGFnZSBwYWdlID0gd2l6YXJkRXh0ZW5kZXIKLQkJCQkJLmdldFJlcGxhY2VXaXphcmRQYWdlKE5ld1BsdWdpbk1haW5QYWdlLlBBR0VfTkFNRSk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHBhZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQltYWluUGFnZSA9IGNyZWF0ZU1haW5QYWdlKCk7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKG1haW5QYWdlKTsKLQkJCX0KLQotCQkJc3VwZXIuZ2V0TmV3V2l6YXJkUGFnZXMod2l6YXJkUGFnZXMpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gd2l6YXJkUGFnZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUlXaXphcmRQYWdlIHdpemFyZFBhZ2UgPSAoSVdpemFyZFBhZ2UpIGl0Lm5leHQoKTsKLQkJCQlzdXBlci5hZGRQYWdlKHdpemFyZFBhZ2UpOwotCQkJfQotCi0JCQl3aXphcmRFeHRlbmRlci5pbml0V2l6YXJkUGFnZXMod2l6YXJkUGFnZXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWFpbiB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtYWluIHdpemFyZCBwYWdlCi0JICovCi0JcHJvdGVjdGVkIE5ld1BsdWdpbk1haW5QYWdlIGNyZWF0ZU1haW5QYWdlKCkgewotCQlyZXR1cm4gbmV3IE5ld1BsdWdpbk1haW5QYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkJCSJmdWxsL29iajE2L01ldGhvZFBsdWdpbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmQjZG9GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGRvRmluaXNoKCkgewotCQl0cnkgewotCQkJbmV3UGx1Z2luID0gTGlicmFyeVNlcnZpY2VVdGlsLmNyZWF0ZU1ldGhvZFBsdWdpbihtYWluUGFnZQotCQkJCQkuZ2V0UGx1Z2luTmFtZSgpLCBtYWluUGFnZS5nZXRCcmllZkRlc2NyaXB0aW9uKCksIG1haW5QYWdlCi0JCQkJCS5nZXRBdXRob3JzKCksIG1haW5QYWdlLmdldFJlZmVyZW5jZWRQbHVnaW5zKCkpOwotCi0JCQlpbml0TWV0aG9kUGx1Z2luKG5ld1BsdWdpbik7Ci0KLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIHJlYXNvbiA9IGUuZ2V0TWVzc2FnZSgpICE9IG51bGwgPyBlLmdldE1lc3NhZ2UoKQotCQkJCQk6IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbkVycm9yX3JlYXNvbjsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbldpemFyZF90aXRsZSwKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3UGx1Z2luRXJyb3JfbXNnLCByZWFzb24sIGUpOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgbWV0aG9kIHBsdWctaW4gdG8gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnksIHVwZGF0ZXMgdGhlCi0JICogTGlicnJheSB2aWV3IGFuZCBvcGVucyB0aGUgbWV0aG9kIHBsdWctaW4gZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIGEgbmV3bHkgY3JlYXRlZCBtZXRob2QgcGx1Zy1pbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBsdWctaW4gaXMgaW5pdGlhbGl6ZWQgY29ycmVjdGx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaW5pdE1ldGhvZFBsdWdpbihmaW5hbCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCXRyeSB7Ci0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCW1hbmFnZXIuYWRkTWV0aG9kUGx1Z2luKHBsdWdpbik7Ci0JCQl9Ci0KLQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkvLyBTZWxlY3QgdGhlIG5ldyBtZXRob2QgcGx1Zy1pbiBpbiB0aGUgTGlicmFyeSB2aWV3LgotCQkJCQlMaXN0PE1ldGhvZFBsdWdpbj4gc2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0JCQkJCXNlbGVjdGlvbi5hZGQocGx1Z2luKTsKLQkJCQkJTGlicmFyeVZpZXcuZ2V0VmlldygpLnNldFNlbGVjdGlvblRvVmlld2VyKHNlbGVjdGlvbik7Ci0KLQkJCQkJLy8gT3BlbiB0aGUgbmV3IG1ldGhvZCBwbHVnLWluIGVkaXRvci4KLQkJCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLm9wZW5FZGl0b3IobmV3UGx1Z2luKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCSJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBtZXRob2QgcGx1Zy1pbiAnIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBwbHVnaW4uZ2V0TmFtZSgpICsgIiciLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBzdXBlclBlcmZvcm1GaW5pc2goKSB7Ci0JCXJldHVybiBzdXBlci5wZXJmb3JtRmluaXNoKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJZmluYWwgYm9vbGVhbltdIHJlc3VsdEhvbGRlciA9IG5ldyBib29sZWFuWzFdOwotCQlMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBydW5uZXIgPSBuZXcgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKTsKLQkJcnVubmVyLnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCXJlc3VsdEhvbGRlclswXSA9IHN1cGVyUGVyZm9ybUZpbmlzaCgpOwotCQkJfQotCQkJCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0SG9sZGVyWzBdOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU2F2ZUFsbEVkaXRvcnNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU2F2ZUFsbEVkaXRvcnNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMmNlMzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1NhdmVBbGxFZGl0b3JzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JUGFnZUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlBhZ2VDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBsaXN0cyB0aGUgY3VycmVudGx5IG9wZW4gZWRpdG9ycyBhbmQgcHJvbXB0cyB0aGUgdXNlciB0bwotICogc2F2ZSB0aGVtIGJlZm9yZSBwZXJmb3JtaW5nIGFuIGltcG9ydCBvciBleHBvcnQgb3BlcmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2F2ZUFsbEVkaXRvcnNQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfQU5EX0NMT1NFX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZVRpdGxlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfQU5EX0NMT1NFX1BBR0VfREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlRGVzY3JpcHRpb247Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVUaXRsZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX1BBR0VfREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlRGVzY3JpcHRpb247Ci0KLQlwcml2YXRlIGJvb2xlYW4gZG9DbG9zZTsKLQotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBjdHJsX2Noa2JveFRhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBCdXR0b24gc2VsZWN0QWxsOwotCi0JcHJpdmF0ZSBCdXR0b24gZGVzZWxlY3RBbGw7Ci0KLQkvKioKLQkgKiBBZGRzIHRoaXMgd2l6YXJkIHBhZ2UgdG8gYSB3aXphcmQgb25seSB3aGVuIG5lY2Vzc2FyeS4KLQkgKiBUaGlzIHBhZ2Ugd2lsbCBiZSBhZGRlZCBpZmYgdGhlcmUgYXJlIGRpcnR5IG1ldGhvZCBlZGl0b3JzLgotCSAqIGlmIGRvQ2xvc2UgaXMgdHJ1ZSBhbmQgdGhlcmUgYXJlIG5vIGRpcnR5IGVkaXRvcnMsIHRoaXMgbWV0aG9kIHdpbGwKLQkgKiBjbG9zZSBhbGwgbWV0aG9kIGVkaXRvcnMuCi0JICogCi0JICogQHBhcmFtIHdpemFyZAotCSAqICAgICAgICAgICAgVGhlIHdpemFyZCB0byB3aGljaCB0aGlzIHBhZ2UgbWlnaHQgYmUgYWRkZWQuCi0JICogQHBhcmFtIGRvQ2xvc2UKLQkgKiAgICAgICAgICAgIElmIDxjb2RlPnRydWU8L2NvZGU+LCB0aGlzIHBhZ2Ugd2lsbCBjbG9zZSBlZGl0b3JzIHdoZW4KLQkgKiAgICAgICAgICAgIG5leHQgaXMgY2xpY2tlZC4gCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGFnZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSB3aXphcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZFBhZ2VJZk5lZWRlZChXaXphcmQgd2l6YXJkLCBib29sZWFuIGRvQ2xvc2UpIHsKLQkJaWYgKGlzVW5zYXZlZEVkaXRvcigpKSB7Ci0JCQl3aXphcmQuYWRkUGFnZShuZXcgU2F2ZUFsbEVkaXRvcnNQYWdlKGRvQ2xvc2UpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybUNsb3NlKGRvQ2xvc2UpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGlzIHdpemFyZCBwYWdlIHRvIGEgd2l6YXJkIG9ubHkgd2hlbiBuZWNlc3NhcnkuCi0JICogVGhpcyBwYWdlIHdpbGwgYmUgYWRkZWQgaWZmIHRoZXJlIGFyZSBkaXJ0eSBtZXRob2QgZWRpdG9ycy4KLQkgKiBpZiBkb0Nsb3NlIGlzIHRydWUgYW5kIHRoZXJlIGFyZSBubyBkaXJ0eSBlZGl0b3JzLCB0aGlzIG1ldGhvZCB3aWxsCi0JICogY2xvc2UgYWxsIG1ldGhvZCBlZGl0b3JzLgotCSAqIAotCSAqIEBwYXJhbSB3aXphcmQKLQkgKiAgICAgICAgICAgIFRoZSB3aXphcmQgd2hpY2ggdGhpcyBwYWdlIG1pZ2h0IGJlIGFkZGVkLgotCSAqIEBwYXJhbSBkb0Nsb3NlCi0JICogICAgICAgICAgICBJZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhpcyBwYWdlIHdpbGwgY2xvc2UgZWRpdG9ycyB3aGVuCi0JICogICAgICAgICAgICBuZXh0IGlzIGNsaWNrZWQuIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBhZ2Ugd2lsbCBiZSBhZGRlZCB0byB0aGUgd2l6YXJkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRQYWdlSWZOZWVkZWQoV2l6YXJkIHdpemFyZCwgYm9vbGVhbiBkb0Nsb3NlLAotCQkJU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24sIEltYWdlRGVzY3JpcHRvciBpbWFnZSkgewotCQlpZiAoaXNVbnNhdmVkRWRpdG9yKCkpIHsKLQkJCVNhdmVBbGxFZGl0b3JzUGFnZSBwYWdlID0gbmV3IFNhdmVBbGxFZGl0b3JzUGFnZShkb0Nsb3NlKTsKLQkJCWlmICh0aXRsZSAhPSBudWxsKSB7Ci0JCQkJcGFnZS5zZXRUaXRsZSh0aXRsZSk7Ci0JCQl9Ci0JCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCXBhZ2Uuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCQkJfQotCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQlwYWdlLnNldEltYWdlRGVzY3JpcHRvcihpbWFnZSk7Ci0JCQl9Ci0JCQl3aXphcmQuYWRkUGFnZShwYWdlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybUNsb3NlKGRvQ2xvc2UpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnRhbmNlLgotCSAqLwotCXB1YmxpYyBTYXZlQWxsRWRpdG9yc1BhZ2UoYm9vbGVhbiBjbG9zZSkgewotCQlzdXBlcihTQVZFX1BBR0VfVElUTEUpOwotCQl0aGlzLmRvQ2xvc2UgPSBjbG9zZTsKLQkJaWYgKGRvQ2xvc2UpIHsKLQkJCXNldFRpdGxlKFNBVkVfQU5EX0NMT1NFX1BBR0VfVElUTEUpOwotCQkJc2V0RGVzY3JpcHRpb24oU0FWRV9BTkRfQ0xPU0VfUEFHRV9ERVNDKTsKLQkJfSBlbHNlIHsKLQkJCXNldFRpdGxlKFNBVkVfUEFHRV9USVRMRSk7Ci0JCQlzZXREZXNjcmlwdGlvbihTQVZFX1BBR0VfREVTQyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlciA9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KGNvbnRhaW5lciwKLQkJCQlTV1QuQk9SREVSIHwgU1dULkZJTEwgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKAotCQkJCW5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlJRWRpdG9yUmVmZXJlbmNlIHJlZiA9IChJRWRpdG9yUmVmZXJlbmNlKSBlbGVtZW50OwotCQkJCXJldHVybiByZWYuZ2V0RWRpdG9yKGZhbHNlKS5nZXRUaXRsZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlJRWRpdG9yUmVmZXJlbmNlIHJlZiA9IChJRWRpdG9yUmVmZXJlbmNlKSBlbGVtZW50OwotCQkJCXJldHVybiByZWYuZ2V0RWRpdG9yKGZhbHNlKS5nZXRUaXRsZUltYWdlKCk7Ci0JCQl9Ci0JCX0pOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0SW5wdXQoRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLmdldE9wZW5NZXRob2RFZGl0b3JzKCkudG9BcnJheSgpKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5hZGRGaWx0ZXIobmV3IFZpZXdlckZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElFZGl0b3JSZWZlcmVuY2UpIHsKLQkJCQkJaWYgKCgoSUVkaXRvclJlZmVyZW5jZSllbGVtZW50KS5pc0RpcnR5KCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9KTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRBbGxDaGVja2VkKHRydWUpOwotCi0JCUNvbXBvc2l0ZSBidXR0b25Db250YWluZXIgPSBuZXcgQ29tcG9zaXRlKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlidXR0b25Db250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpKTsKLQkJYnV0dG9uQ29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5ERUZBVUxULCBTV1QuQkVHSU5OSU5HLAotCQkJCWZhbHNlLCB0cnVlKSk7Ci0KLQkJc2VsZWN0QWxsID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5QVVNIKTsKLQkJc2VsZWN0QWxsCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX1NlbGVjdEFsbEJ1dHRvbkxhYmVsKTsKLQkJc2VsZWN0QWxsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQkVHSU5OSU5HLCBmYWxzZSwKLQkJCQl0cnVlKSk7Ci0KLQkJZGVzZWxlY3RBbGwgPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOwotCQlkZXNlbGVjdEFsbAotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9EZXNlbGVjdEFsbEJ1dHRvbkxhYmVsKTsKLQkJZGVzZWxlY3RBbGwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIGZhbHNlLAotCQkJCXRydWUpKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmcmVzaCAoKSB7Ci0JCWlmIChjdHJsX2Noa2JveFRhYmxlVmlld2VyICE9IG51bGwpIHsKLQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJaWYgKGN0cmxfY2hrYm94VGFibGVWaWV3ZXIuZ2V0VGFibGUoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKGN0cmxfY2hrYm94VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpICE9IG51bGwpIHsKLQkJCQkJaWYgKGN0cmxfY2hrYm94VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlpZiAoY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRDb250cm9sKCkgIT0gbnVsbCkKLQkJCQkJCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCXNlbGVjdEFsbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCWRlc2VsZWN0QWxsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRXaXphcmQoKSAhPSBudWxsKSB7Ci0JCQlJV2l6YXJkQ29udGFpbmVyIGNvbnRhaW5lciA9IGdldFdpemFyZCgpLmdldENvbnRhaW5lcigpOwotCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFdpemFyZERpYWxvZykgewotCQkJCSgoV2l6YXJkRGlhbG9nKWNvbnRhaW5lcikuYWRkUGFnZUNoYW5nZWRMaXN0ZW5lcihuZXcgSVBhZ2VDaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHBhZ2VDaGFuZ2VkKFBhZ2VDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCXJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JCXNlbGVjdEFsbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRBbGxDaGVja2VkKHRydWUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCi0JCX0pOwotCi0JCWRlc2VsZWN0QWxsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldEFsbENoZWNrZWQoZmFsc2UpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCi0JCX0pOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybSBvdXIgc2F2ZSAoYW5kIHBvc3NpYmx5IGNsb3NlKSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXBlcmZvcm1TYXZlQW5kQ2xvc2UoKTsKLQkJcmV0dXJuIHN1cGVyLmdldE5leHRQYWdlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1TYXZlQW5kQ2xvc2UoKSB7Ci0JCU9iamVjdFtdIGNoZWNrZWRBcnJheSA9IGN0cmxfY2hrYm94VGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tlZEFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCS5nZXRBY3RpdmVQYWdlKCkuc2F2ZUVkaXRvcigKLQkJCQkJCQkoKElFZGl0b3JSZWZlcmVuY2UpIGNoZWNrZWRBcnJheVtpXSkKLQkJCQkJCQkJCS5nZXRFZGl0b3IoZmFsc2UpLCBmYWxzZSk7Ci0JCX0KLQkJcGVyZm9ybUNsb3NlKGRvQ2xvc2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcGVyZm9ybUNsb3NlKGJvb2xlYW4gZG9DbG9zZSkgewotCQlpZiAoZG9DbG9zZSkgewotCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLmNsb3NlQWxsTWV0aG9kRWRpdG9ycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tlZCB3aGV0aGVyIHRoZXJlIGlzIGFueSB1bnNhdmVkIGVkaXRvciBvcGVuCi0JICogCi0JICogQHBhcmFtIGRvQ2xvc2UKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYW4gdW5zYXZlZCBlZGl0b3Igb3BlbgotCSAqIAl0cnVlIGlmIGRvQ2xvc2UgaXMgdHJ1ZSBhbmQgdGhlcmUgaXMgYW4gb3BlbiBlZGl0b3IKLQkgKiAgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Vuc2F2ZWRFZGl0b3IoKSB7Ci0JCWJvb2xlYW4gYW5FZGl0b3JJc0RpcnR5ID0gZmFsc2U7Ci0JCUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4gbWV0aG9kRWRpdG9ycyA9IEVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5nZXRPcGVuTWV0aG9kRWRpdG9ycygpOwotCQlmb3IgKEl0ZXJhdG9yPElFZGl0b3JSZWZlcmVuY2U+IGl0ZXJhdG9yID0gbWV0aG9kRWRpdG9ycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIGVkaXRvciA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJYW5FZGl0b3JJc0RpcnR5ID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCQotCQl9Ci0JCXJldHVybiBhbkVkaXRvcklzRGlydHk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNPcGVuRWRpdG9yKGJvb2xlYW4gZG9DbG9zZSkgewotCQlMaXN0PElFZGl0b3JSZWZlcmVuY2U+IG1ldGhvZEVkaXRvcnMgPSBFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuZ2V0T3Blbk1ldGhvZEVkaXRvcnMoKTsKLQkJcmV0dXJuIGRvQ2xvc2UgJiYgbWV0aG9kRWRpdG9ycy5zaXplKCkgPiAwOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbkNob2ljZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25DaG9pY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNTNhMmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbkNob2ljZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0vKioKLSAqIEl0IHN0b3JlcyBhbmQgbWFuYWdlcyBhbGwgY2hvaWNlcyBmb3Igc3luY2hyb25pemF0aW9uCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXphdGlvbkNob2ljZXMgewotCi0JcHVibGljIHN0YXRpYyBpbnQgU1lOQ19OT05FID0gMDsKLQlwdWJsaWMgc3RhdGljIGludCBTWU5DX0ZST01fQ09ORVROVCA9IDE7Ci0JcHVibGljIHN0YXRpYyBpbnQgU1lOQ19GUk9NX1BST0NFU1MgPSAyOwotCQotCXByaXZhdGUgUHJvY2VzcyBzZWxlY3RlZFByb2Nlc3M7Ci0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIHNlbGVjdGVkQ29uZmlnOwotCXByaXZhdGUgaW50IHN5bmNOYW1lPSBTWU5DX0ZST01fQ09ORVROVDsKLQlwcml2YXRlIGludCBzeW5jUHJlc05hbWU9IFNZTkNfRlJPTV9DT05FVE5UOwotCXByaXZhdGUgaW50IHN5bmNCcmllZkRlc2M9IFNZTkNfRlJPTV9DT05FVE5UOwotCXByaXZhdGUgaW50IHN5bmNPcHRJbnB1dD0gU1lOQ19GUk9NX0NPTkVUTlQ7Ci0JcHJpdmF0ZSBpbnQgc3luY01hbklucHV0PSBTWU5DX0ZST01fQ09ORVROVDsKLQlwcml2YXRlIGludCBzeW5jT3V0cHV0PSBTWU5DX0ZST01fQ09ORVROVDsKLQlwcml2YXRlIGludCBzeW5jUHJpbVBlcmZvcm1lcj0gU1lOQ19GUk9NX0NPTkVUTlQ7Ci0JcHJpdmF0ZSBpbnQgc3luY0FkZG5QZXJmb3JtZXI9IFNZTkNfRlJPTV9DT05FVE5UOwotCXByaXZhdGUgaW50IHN5bmNSZXNwUm9sZT0gU1lOQ19GUk9NX0NPTkVUTlQ7Ci0JcHJpdmF0ZSBpbnQgc3luY0NvbnRBcnRpZmFjdD0gU1lOQ19GUk9NX0NPTkVUTlQ7Ci0JcHJpdmF0ZSBpbnQgc3luY0RlbGl2UGFydD0gU1lOQ19GUk9NX0NPTkVUTlQ7Ci0JcHJpdmF0ZSBpbnQgc3luY1NlbFN0ZXA9IFNZTkNfRlJPTV9DT05FVE5UOwotCQotCXB1YmxpYyBib29sZWFuIGlzRmluaXNoUHJlc3NlZDsKLQotCS8qKgotCSAqIEdldCBzZWxlY3RlZCBwcm9jZXNzCi0JICovCi0JcHVibGljIFByb2Nlc3MgZ2V0U2VsZWN0ZWRQcm9jZXNzKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRQcm9jZXNzOwotCX0KLQotCS8qKgotCSAqIFNldCBzZWxlY3RlZCBwcm9jZXNzCi0JICogQHBhcmFtIHNlbGVjdGVkUHJvY2VzcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkUHJvY2VzcyhQcm9jZXNzIHNlbGVjdGVkUHJvY2VzcykgewotCQl0aGlzLnNlbGVjdGVkUHJvY2VzcyA9IHNlbGVjdGVkUHJvY2VzczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRTZWxlY3RlZENvbmZpZygpIHsKLQkJcmV0dXJuIHNlbGVjdGVkQ29uZmlnOwotCX0KLQotCS8qKgotCSAqIFNldCBzZWxlY3RlZCBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBzZWxlY3RlZENvbmZpZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkQ29uZmlnKE1ldGhvZENvbmZpZ3VyYXRpb24gc2VsZWN0ZWRDb25maWcpIHsKLQkJdGhpcy5zZWxlY3RlZENvbmZpZyA9IHNlbGVjdGVkQ29uZmlnOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBjb250YWluZWQgYXJ0aWZhY3RzCi0JICovCi0JcHVibGljIGludCBnZXRTeW5jQ29udEFydGlmYWN0KCkgewotCQlyZXR1cm4gc3luY0NvbnRBcnRpZmFjdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgb3B0aW9uIGZvciBzeW5jaHJvbml6aW5nIGNvbnRhaW5lZCBhcnRpZmFjdHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jQ29udEFydGlmYWN0KGludCBzeW5jQ29udEFydGlmYWN0KSB7Ci0JCXRoaXMuc3luY0NvbnRBcnRpZmFjdCA9IHN5bmNDb250QXJ0aWZhY3Q7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIGRlbGl2ZXJhYmxlIHBhcnRzCi0JICovCi0JcHVibGljIGludCBnZXRTeW5jRGVsaXZQYXJ0KCkgewotCQlyZXR1cm4gc3luY0RlbGl2UGFydDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgb3B0aW9uIGZvciBzeW5jaHJvbml6aW5nIGRlbGl2ZXJhYmxlIHBhcnRzCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY0RlbGl2UGFydChpbnQgc3luY0RlbGl2UGFydCkgewotCQl0aGlzLnN5bmNEZWxpdlBhcnQgPSBzeW5jRGVsaXZQYXJ0OwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBtYW5kYXRvcnkgaW5wdXQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN5bmNNYW5JbnB1dCgpIHsKLQkJcmV0dXJuIHN5bmNNYW5JbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgb3B0aW9uIGZvciBzeW5jaHJvbml6aW5nIG1hbmRhdG9yeSBpbnB1dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNNYW5JbnB1dChpbnQgc3luY01hbklucHV0KSB7Ci0JCXRoaXMuc3luY01hbklucHV0ID0gc3luY01hbklucHV0OwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBvcHRpb25hbCBpbnB1dAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY09wdElucHV0KCkgewotCQlyZXR1cm4gc3luY09wdElucHV0OwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgb3B0aW9uYWwgaW5wdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jT3B0SW5wdXQoaW50IHN5bmNPcHRJbnB1dCkgewotCQl0aGlzLnN5bmNPcHRJbnB1dCA9IHN5bmNPcHRJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3B0aW9uIG9mIHN5bmNocm9uaXppbmcgb3V0cHV0Ci0JICovCi0JcHVibGljIGludCBnZXRTeW5jT3V0cHV0KCkgewotCQlyZXR1cm4gc3luY091dHB1dDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgb3B0aW9uIGZvciBzeW5jaHJvbml6aW5nIG91dHB1dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNPdXRwdXQoaW50IHN5bmNPdXRwdXQpIHsKLQkJdGhpcy5zeW5jT3V0cHV0ID0gc3luY091dHB1dDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3B0aW9uIG9mIHN5bmNocm9uaXppbmcgcHJlc2VudGF0aW9uIG5hbWUKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN5bmNQcmVzTmFtZSgpIHsKLQkJcmV0dXJuIHN5bmNQcmVzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgb3B0aW9uIGZvciBzeW5jaHJvbml6aW5nIHByZXNldG5hdGlvbiBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY1ByZXNOYW1lKGludCBzeW5jUHJlc05hbWUpIHsKLQkJdGhpcy5zeW5jUHJlc05hbWUgPSBzeW5jUHJlc05hbWU7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIHJlc3BvbnNpYmxlIHJvbGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN5bmNSZXNwUm9sZSgpIHsKLQkJcmV0dXJuIHN5bmNSZXNwUm9sZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgb3B0aW9uIGZvciBzeW5jaHJvbml6aW5nIHJlc3BvbnNpYmxlIHJvbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jUmVzcFJvbGUoaW50IHN5bmNSZXNwUm9sZSkgewotCQl0aGlzLnN5bmNSZXNwUm9sZSA9IHN5bmNSZXNwUm9sZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3B0aW9uIG9mIHN5bmNocm9uaXppbmcgc3RlcHMKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN5bmNTZWxTdGVwKCkgewotCQlyZXR1cm4gc3luY1NlbFN0ZXA7Ci0JfQotCi0JLyoqCi0JICogU2V0IG9wdGlvbiBmb3Igc3luY2hyb25pemluZyBzdGVwcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNTZWxTdGVwKGludCBzeW5jU2VsU3RlcCkgewotCQl0aGlzLnN5bmNTZWxTdGVwID0gc3luY1NlbFN0ZXA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBib29sZWFuIHZhbHVlIGJhc2VkIG9uIHdpemFyZCBpcyBjb21wbGV0ZWQgb3Igbm90Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGaW5pc2hQcmVzc2VkKCkgewotCQlyZXR1cm4gaXNGaW5pc2hQcmVzc2VkOwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gYmFzZWQgb24gd2l6YXJkIGluIGNvbXBsZXRlZCBvciBub3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2hQcmVzc2VkKGJvb2xlYW4gaXNGaW5pc2hQcmVzc2VkKSB7Ci0JCXRoaXMuaXNGaW5pc2hQcmVzc2VkID0gaXNGaW5pc2hQcmVzc2VkOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBhZGRpdGlvbmFsIHBlcmZvcm1lcgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY0FkZG5QZXJmb3JtZXIoKSB7Ci0JCXJldHVybiBzeW5jQWRkblBlcmZvcm1lcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgb3B0aW9uIGZvciBzeW5jaHJvbml6aW5nIGFkZGl0aW9uYWwgcGVyZm9ybWVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY0FkZG5QZXJmb3JtZXIoaW50IHN5bmNBZGRuUGVyZm9ybWVyKSB7Ci0JCXRoaXMuc3luY0FkZG5QZXJmb3JtZXIgPSBzeW5jQWRkblBlcmZvcm1lcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3B0aW9uIG9mIHN5bmNocm9uaXppbmcgcHJpbWFyeSBwZXJmb3JtZXIKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN5bmNQcmltUGVyZm9ybWVyKCkgewotCQlyZXR1cm4gc3luY1ByaW1QZXJmb3JtZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0IG9wdGlvbiBmb3Igc3luY2hyb25pemluZyBwcmltYXJ5IHBlcmZvcm1lcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNQcmltUGVyZm9ybWVyKGludCBzeW5jUHJpbVBlcmZvcm1lcikgewotCQl0aGlzLnN5bmNQcmltUGVyZm9ybWVyID0gc3luY1ByaW1QZXJmb3JtZXI7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgYWxsIHN5bmNocm9uaXphdGlvbiBvcHRpb25zL2Nob2ljZXMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkKLQkJU3RyaW5nQnVmZmVyIHNidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNidWYuYXBwZW5kKCJbUHJvY2VzczoiICsgKChzZWxlY3RlZFByb2Nlc3MgIT0gbnVsbCk/c2VsZWN0ZWRQcm9jZXNzLmdldE5hbWUoKToibnVsbCIpICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJc2J1Zi5hcHBlbmQoIkNvbmZpZ3VyYXRpb246IiArICgoc2VsZWN0ZWRDb25maWcgIT0gbnVsbCk/c2VsZWN0ZWRDb25maWcuZ2V0TmFtZSgpOiJudWxsIikgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlzYnVmLmFwcGVuZCgiTmFtZToiICsgc3luY05hbWUgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2J1Zi5hcHBlbmQoIlByZXNOYW1lOiIgKyBzeW5jUHJlc05hbWUgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2J1Zi5hcHBlbmQoIkJyZWlmRGVzYzoiICsgc3luY0JyaWVmRGVzYyArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzYnVmLmFwcGVuZCgiT3B0SW5wdXQ6IiArIHN5bmNPcHRJbnB1dCArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzYnVmLmFwcGVuZCgiTWFuSW5wdXQ6IiArIHN5bmNNYW5JbnB1dCArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzYnVmLmFwcGVuZCgiT3V0cHV0OiIgKyBzeW5jT3V0cHV0ICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJQcmltUGVyZm9ybWVyOiIgKyBzeW5jUHJpbVBlcmZvcm1lciArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzYnVmLmFwcGVuZCgiQWRkblBlcmZvcm1lcnM6IiArIHN5bmNBZGRuUGVyZm9ybWVyICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJSZXNwUm9sZToiICsgc3luY1Jlc3BSb2xlICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJDb250QXJ0aWZhY3Q6IiArIHN5bmNDb250QXJ0aWZhY3QgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2J1Zi5hcHBlbmQoIkRlbGl2UGFydDoiICsgc3luY0RlbGl2UGFydCArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzYnVmLmFwcGVuZCgiU2VsU3RlcDoiICsgc3luY1NlbFN0ZXAgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlyZXR1cm4gc2J1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBicmllZiBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY0JyaWVmRGVzYygpIHsKLQkJcmV0dXJuIHN5bmNCcmllZkRlc2M7Ci0JfQotCi0JLyoqCi0JICogU2V0IG9wdGlvbiBmb3Igc3luY2hyb25pemluZyBicmllZiBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNCcmllZkRlc2MoaW50IHN5bmNCcmllZkRlc2MpIHsKLQkJdGhpcy5zeW5jQnJpZWZEZXNjID0gc3luY0JyaWVmRGVzYzsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3B0aW9uIG9mIHN5bmNocm9uaXppbmcgbmFtZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY05hbWUoKSB7Ci0JCXJldHVybiBzeW5jTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgb3B0aW9uIGZvciBzeW5jaHJvbml6aW5nIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jTmFtZShpbnQgc3luY05hbWUpIHsKLQkJdGhpcy5zeW5jTmFtZSA9IHN5bmNOYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25EZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25EZXNjcmlwdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyMDViNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uRGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFRoZSB3aXphcmQgcGFnZSB3aGljaCBkZXNjcmliZXMgY3VzdG9tIHN5bmNocm9uaXphdGlvbi4KLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemF0aW9uRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25DaG9pY2VzIHN5bmNDaG9pY2VzID0gbnVsbDsKLQkKLQlwcml2YXRlIFRleHQgY3RybF9leHBsYWluVGV4dDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6YXRpb25EZXNjcmlwdGlvblBhZ2UoU3RyaW5nIHBhZ2VOYW1lLAotCQkJU3luY2hyb25pemF0aW9uQ2hvaWNlcyBjaG9pY2VzKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90aXRsZSk7IAotCQlzZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RleHQpOyAKLQkJdGhpcy5zeW5jQ2hvaWNlcyA9IGNob2ljZXM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBjb21wb3NpdGUgdG8gaG9sZCB0aGUgd2lkZ2V0cy4KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJCi0JCVN0cmluZyBleHBsYWluVGV4dCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfZXhwbGFpblRleHQ7IAotCQljdHJsX2V4cGxhaW5UZXh0ID0gY3JlYXRlTXVsdGlMaW5lVGV4dChjb21wb3NpdGUsICIgIiwgNDAwLCAyNDAsIDEpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfZXhwbGFpblRleHQuc2V0VGV4dChleHBsYWluVGV4dCk7Ci0JCQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25PcGVyYXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25PcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVhNDBlZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLQotLyoqCi0gKiBSdW5zIHN5bmNob25pemF0aW9uIG9wZXJhdGlvbgotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6YXRpb25PcGVyYXRpb24gaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCi0JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25DaG9pY2VzIHN5bmNoQ2hvaWNlczsKLQlwcml2YXRlIENvbGxlY3Rpb24gZWxlbWVudHM7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIAkJCUxpc3Qgb2YgZWxlbWVudHMgdG8gYmUgc3luY2hyb25pemVkCi0JICogQHBhcmFtIGNob2ljZXMKLQkgKiAJCQlTeW5jaHJvbml6YXRpb24gb3B0aW9ucwotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6YXRpb25PcGVyYXRpb24oQ29sbGVjdGlvbiBlbGVtZW50cywgU3luY2hyb25pemF0aW9uQ2hvaWNlcyBjaG9pY2VzKSB7Ci0JCXRoaXMuc3luY2hDaG9pY2VzID0gY2hvaWNlczsKLQkJdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3MjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHdva2UgdXAgYWZ0ZXIgMSBzZWNvbmQgc2xlZXAsICMiICsgKGkrMSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uUHJldmlld1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25QcmV2aWV3UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjJhMTU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25QcmV2aWV3UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBUaGUgd2l6YXJkIHBhZ2Ugd2hpY2ggbGV0cyB5b3UgcHJldmlldyBlbGVtZW50cyB0byBiZSBzeW5jaG9uaXplZAotICogYW5kIGFsc28gYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXphdGlvblByZXZpZXdQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25DaG9pY2VzIHN5bmNDaG9pY2VzID0gbnVsbDsKLQkKLQlwcml2YXRlIFRleHQgY3RybF9wcmV2aWV3VGV4dDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6YXRpb25QcmV2aWV3UGFnZShTdHJpbmcgcGFnZU5hbWUsCi0JCQlTeW5jaHJvbml6YXRpb25DaG9pY2VzIGNob2ljZXMpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGl0bGUpOyAKLQkJc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RleHQpOyAKLQkJdGhpcy5zeW5jQ2hvaWNlcyA9IGNob2ljZXM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBjb21wb3NpdGUgdG8gaG9sZCB0aGUgd2lkZ2V0cy4KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJCi0JCVN0cmluZyBleHBsYWluVGV4dCA9ICJQcmV2aWV3IHRleHQgY29taW5nIGhlcmUuXG5cbiIgKwkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCSJcdFRoaXMgaGFzIHRvIGJlIGNvbWluZyBmcm9tIHNvbWUgdW5kZXJseWluIEFQSSBjYWxsLiBUaGlzIG1heSBiZSBjdXQgb2ZmIGlmIHRoZXJlIGlzIG5vdCBlbm91ZyB0aW1lLiI7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9wcmV2aWV3VGV4dCA9IGNyZWF0ZU11bHRpTGluZVRleHQoY29tcG9zaXRlLCAiICIsIDQwMCwgMjQwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3ByZXZpZXdUZXh0LnNldFRleHQoZXhwbGFpblRleHQpOwotCQkKLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvblNlbGVjdENvbmZpZ1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25TZWxlY3RDb25maWdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMTM4YTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvblNlbGVjdENvbmZpZ1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgd2l6YXJkIHBhZ2Ugd2hpY2ggbGV0IHVzZXIgc2VsZWN0IG1ldGhvZCBjb25maWd1cmF0aW9uIGR1cmluZwotICogc3luY2hyb25pemF0aW9uCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXphdGlvblNlbGVjdENvbmZpZ1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25DaG9pY2VzIHN5bmNDaG9pY2VzID0gbnVsbDsKLQkKLQlwcml2YXRlIENvbWJvVmlld2VyIGNvbmZpZ0NvbWJvVmlld2VyOwotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbltdIHZhbGlkQ29uZmlndXJhdGlvbnM7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemF0aW9uU2VsZWN0Q29uZmlnUGFnZShTdHJpbmcgcGFnZU5hbWUsCi0JCQlTeW5jaHJvbml6YXRpb25DaG9pY2VzIGNob2ljZXMpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90aXRsZSk7IAotCQlzZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0KTsgCi0JCXRoaXMuc3luY0Nob2ljZXMgPSBjaG9pY2VzOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgY29tcG9zaXRlIHRvIGhvbGQgdGhlIHdpZGdldHMuCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQl7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJfQotCQkKLQkJLy8gYWRkIGFuIGVtcHR5IGxpbmUKLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAiICIsIDIpOyAvLyROT04tTkxTLTEkCi0JCQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX2NvbmZpZ0xhYmVsKTsgCi0JCQotCQljb25maWdDb21ib1ZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJY29uZmlnQ29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKAotCQkJCW5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWNvbmZpZ0NvbWJvVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQotCQkvLyBnZXQgYWxsIHZhbGlkIGNvbmZpZ3VyYXRpb25zLCBhbmQgZGVmYXVsdCBvbmUsIGFuZCBzZWxlY3QgYW5kIHNob3cgdGhlIGRlZmF1bHQgb25lCi0JCVByb2Nlc3Mgc2VsZWN0ZWRQcm9jZXNzID0gc3luY0Nob2ljZXMuZ2V0U2VsZWN0ZWRQcm9jZXNzKCk7Ci0JCXZhbGlkQ29uZmlndXJhdGlvbnMgPSAoTWV0aG9kQ29uZmlndXJhdGlvbltdKXNlbGVjdGVkUHJvY2Vzcy5nZXRWYWxpZENvbnRleHQoKS50b0FycmF5KCk7Ci0JCWNvbmZpZ0NvbWJvVmlld2VyLmFkZCh2YWxpZENvbmZpZ3VyYXRpb25zKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29uZmlnID0gc2VsZWN0ZWRQcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCXN5bmNDaG9pY2VzLnNldFNlbGVjdGVkQ29uZmlnKGRlZmF1bHRDb25maWcpOwotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIGRlZmF1bHRTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihkZWZhdWx0Q29uZmlnKTsKLQkJY29uZmlnQ29tYm9WaWV3ZXIuc2V0U2VsZWN0aW9uKGRlZmF1bHRTZWxlY3Rpb24sIHRydWUpOwotCQkKLQkJYWRkTGlzdGVuZXJzKGNvbXBvc2l0ZSk7Ci0JCQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCQotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGluaXQgY29uZmlnID0iICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbGlzdGVuZXJzIGZvciB0aGUgY29udHJvbHMgb24gdGhpcyBwYWdlLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQljb25maWdDb21ib1ZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gY29uZmlnID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCXN5bmNDaG9pY2VzLnNldFNlbGVjdGVkQ29uZmlnKChNZXRob2RDb25maWd1cmF0aW9uKWNvbmZpZ1swXSk7Ci0JCX0gCi0JCQotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGNvbmZpZyA9IiArIHN5bmNDaG9pY2VzLnRvU3RyaW5nKCkpOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uU2VsZWN0RGV0YWlsc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25TZWxlY3REZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjE3NzUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25TZWxlY3REZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGUgd2l6YXJkIHBhZ2Ugd2hpY2ggbGV0IHVzZXIgc2VsZWN0IHByb3BlcnRpZXMgb2YgbWV0aG9kIGNvbnRlbnQgdG8gCi0gKiBiZSBjb25zaWRlcmVkIGZvciBzeW5jaG9uaXphdGlvbi4gCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXphdGlvblNlbGVjdERldGFpbHNQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIFN5bmNocm9uaXphdGlvbkNob2ljZXMgc3luY0Nob2ljZXMgPSBudWxsOwotCQotCXByaXZhdGUgQnV0dG9uIGJjX25hbWU7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfcHJlc05hbWU7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfYnJpZWZEZXNjOwotCXByaXZhdGUgQnV0dG9uIGJjX29wdElucHV0OwotCXByaXZhdGUgQnV0dG9uIGJjX21hbklucHV0OwotCXByaXZhdGUgQnV0dG9uIGJjX291dHB1dDsKLQlwcml2YXRlIEJ1dHRvbiBiY19wcmltUGVyZm9ybWVyOwotCXByaXZhdGUgQnV0dG9uIGJjX2FkZG5QZXJmb3JtZXI7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfcmVzcFJvbGU7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfY29udEFydGlmYWN0OwotCXByaXZhdGUgQnV0dG9uIGJjX2RlbGl2UGFydDsKLQlwcml2YXRlIEJ1dHRvbiBiY19zZWxTdGVwOwotCQotLy8JcHJpdmF0ZSBCdXR0b25bXSBicl9wcmVzTmFtZSA9IG5ldyBCdXR0b25bMl07Ci0vLwlwcml2YXRlIEJ1dHRvbltdIGJyX29wdElucHV0ID0gbmV3IEJ1dHRvblsyXTsKLS8vCXByaXZhdGUgQnV0dG9uW10gYnJfbWFuSW5wdXQgPSBuZXcgQnV0dG9uWzJdOwotLy8JcHJpdmF0ZSBCdXR0b25bXSBicl9vdXRwdXQgPSBuZXcgQnV0dG9uWzJdOwotLy8JcHJpdmF0ZSBCdXR0b25bXSBicl9yZXNwUm9sZSA9IG5ldyBCdXR0b25bMl07Ci0vLwlwcml2YXRlIEJ1dHRvbltdIGJyX2NvbnRBcnRpZmFjdCA9IG5ldyBCdXR0b25bMl07Ci0vLwlwcml2YXRlIEJ1dHRvbltdIGJyX2RlbGl2UGFydCA9IG5ldyBCdXR0b25bMl07Ci0vLwlwcml2YXRlIEJ1dHRvbltdIGJyX3NlbFN0ZXAgPSBuZXcgQnV0dG9uWzJdOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXphdGlvblNlbGVjdERldGFpbHNQYWdlKFN0cmluZyBwYWdlTmFtZSwKLQkJCVN5bmNocm9uaXphdGlvbkNob2ljZXMgY2hvaWNlcykgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90aXRsZSk7IAotCQlzZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGV4dCk7IAotCQl0aGlzLnN5bmNDaG9pY2VzID0gY2hvaWNlczsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIGNvbXBvc2l0ZSB0byBob2xkIHRoZSB3aWRnZXRzLgotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJewotLy8JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQl9Ci0JCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Byb3BlcnRpZXNfbGFibGUpOyAKLS8vCQljcmVhdGVMYWJlbChjb21wb3NpdGUsICJDb25ldG50IFRvIFByb2Nlc3MgICIpOwotLy8JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgIiAgUHJvY2VzcyBUbyBDb250ZW50Iik7Ci0JCQotCQliY19uYW1lID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbmFtZV9sYWJsZSk7IAotCQkKLQkJYmNfcHJlc05hbWUgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmVzZW50YXRpb25OYW1lX2xhYmxlKTsgCi0vLwkJY3JlYXRlVHdvUmFkaW9Hcm91cChjb21wb3NpdGUsIGJyX3ByZXNOYW1lKTsKLQkJCi0JCWJjX2JyaWVmRGVzYyA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2JyaWVmRGVzY19sYWJsZSk7IAotCQkKLQkJYmNfb3B0SW5wdXQgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9vcHRpb25hbElub3V0c19sYWJlbCk7IAotLy8JCWNyZWF0ZVR3b1JhZGlvR3JvdXAoY29tcG9zaXRlLCBicl9vcHRJbnB1dCk7Ci0JCQotCQliY19tYW5JbnB1dCA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX21hbmRhdG9yeUlucHV0c19sYWJsZSk7IAotLy8JCWNyZWF0ZVR3b1JhZGlvR3JvdXAoY29tcG9zaXRlLCBicl9tYW5JbnB1dCk7Ci0JCQotCQliY19vdXRwdXQgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9vdXRwdXRzX2xhYmVsKTsgCi0vLwkJY3JlYXRlVHdvUmFkaW9Hcm91cChjb21wb3NpdGUsIGJyX291dHB1dCk7Ci0JCQotCQliY19wcmltUGVyZm9ybWVyID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJpbWFyeVBlcmZvcm1lcl9sYWJlbCk7IAotCQliY19hZGRuUGVyZm9ybWVyID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYWRkblBlcmZvcm1lcnNfbGFibGUpOyAKLQkJCi0JCWJjX3Jlc3BSb2xlID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcmVzcG9uc2libGVSb2xlc19sYWJsZSk7IAotLy8JCWNyZWF0ZVR3b1JhZGlvR3JvdXAoY29tcG9zaXRlLCBicl9yZXNwUm9sZSk7Ci0JCQotCQliY19jb250QXJ0aWZhY3QgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9jb250bkFydGlmYWN0c19sYWJlbCk7IAotLy8JCWNyZWF0ZVR3b1JhZGlvR3JvdXAoY29tcG9zaXRlLCBicl9jb250QXJ0aWZhY3QpOwotCQkKLQkJYmNfZGVsaXZQYXJ0ID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfZGlsdmVkUGFydHNfbGFiZWwpOyAKLS8vCQljcmVhdGVUd29SYWRpb0dyb3VwKGNvbXBvc2l0ZSwgYnJfZGVsaXZQYXJ0KTsKLQkJCi0JCWJjX3NlbFN0ZXAgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9zZWxTdGVwc19sYWJlbCk7IAotLy8JCWNyZWF0ZVR3b1JhZGlvR3JvdXAoY29tcG9zaXRlLCBicl9zZWxTdGVwKTsKLQkJCi0JCWFkZExpc3RlbmVycyhjb21wb3NpdGUpOwotCQlzZXRBbGxDaGVja2VkKCk7Ci0JCQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCQotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGluaXQgZGV0YWlsID0iICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRBbGxDaGVja2VkKCkgewotCQliY19uYW1lLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYmNfcHJlc05hbWUuc2V0U2VsZWN0aW9uKHRydWUpOwotCQliY19icmllZkRlc2Muc2V0U2VsZWN0aW9uKHRydWUpOwotCQliY19vcHRJbnB1dC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX21hbklucHV0LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYmNfb3V0cHV0LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYmNfcHJpbVBlcmZvcm1lci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX2FkZG5QZXJmb3JtZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQliY19yZXNwUm9sZS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX2NvbnRBcnRpZmFjdC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX2RlbGl2UGFydC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX3NlbFN0ZXAuc2V0U2VsZWN0aW9uKHRydWUpOwkKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB0aGUgbGlzdGVuZXJzIGZvciB0aGUgY29udHJvbHMgb24gdGhpcyBwYWdlLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQliY19uYW1lLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGJjX25hbWUuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNOYW1lKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNOYW1lKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJYmNfcHJlc05hbWUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoYmNfcHJlc05hbWUuZ2V0U2VsZWN0aW9uKCkpIHsKLS8vCQkJCQlicl9wcmVzTmFtZVswXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWJyX3ByZXNOYW1lWzFdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJaWYgKGJyX3ByZXNOYW1lWzBdLmdldFNlbGVjdGlvbigpKQotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY1ByZXNOYW1lKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCQkJCWVsc2UKLS8vCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY1ByZXNOYW1lKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotCQkJCX0gZWxzZSB7Ci0vLwkJCQkJYnJfcHJlc05hbWVbMF0uc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJCQkJYnJfcHJlc05hbWVbMV0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNQcmVzTmFtZShTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfTk9ORSk7Ci0JCQkJfQotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgIiArIHN5bmNDaG9pY2VzLnRvU3RyaW5nKCkpOwotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCWJjX2JyaWVmRGVzYy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19icmllZkRlc2MuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNCcmllZkRlc2MoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY0JyaWVmRGVzYyhTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfTk9ORSk7Ci0JCQkJfQotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCWJjX29wdElucHV0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGJjX29wdElucHV0LmdldFNlbGVjdGlvbigpKSB7Ci0vLwkJCQkJYnJfb3B0SW5wdXRbMF0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlicl9vcHRJbnB1dFsxXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWlmIChicl9vcHRJbnB1dFswXS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNPcHRJbnB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQkJCQllbHNlCi0vLwkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNPcHRJbnB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLQkJCQl9IGVsc2UgewotLy8JCQkJCWJyX29wdElucHV0WzBdLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JCQkJCWJyX29wdElucHV0WzFdLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jT3B0SW5wdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX05PTkUpOwotCQkJCX0KLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkICIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYmNfbWFuSW5wdXQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoYmNfbWFuSW5wdXQuZ2V0U2VsZWN0aW9uKCkpIHsKLS8vCQkJCQlicl9tYW5JbnB1dFswXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWJyX21hbklucHV0WzFdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJaWYgKGJyX21hbklucHV0WzBdLmdldFNlbGVjdGlvbigpKQotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY01hbklucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCQkJCWVsc2UKLS8vCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY01hbklucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotLy8JCQkJCQotCQkJCX0gZWxzZSB7Ci0vLwkJCQkJYnJfbWFuSW5wdXRbMF0uc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJCQkJYnJfbWFuSW5wdXRbMV0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNNYW5JbnB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfTk9ORSk7Ci0JCQkJfQotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgIiArIHN5bmNDaG9pY2VzLnRvU3RyaW5nKCkpOwotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQliY19vdXRwdXQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoYmNfb3V0cHV0LmdldFNlbGVjdGlvbigpKSB7Ci0vLwkJCQkJYnJfb3V0cHV0WzBdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJYnJfb3V0cHV0WzFdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJaWYgKGJyX291dHB1dFswXS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNPdXRwdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJCQkJZWxzZQotLy8JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jT3V0cHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotCQkJCX0gZWxzZSB7Ci0vLwkJCQkJYnJfb3V0cHV0WzBdLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JCQkJCWJyX291dHB1dFsxXS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY091dHB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfTk9ORSk7Ci0JCQkJfQotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgIiArIHN5bmNDaG9pY2VzLnRvU3RyaW5nKCkpOwotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQliY19wcmltUGVyZm9ybWVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGJjX3ByaW1QZXJmb3JtZXIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY1ByaW1QZXJmb3JtZXIoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY1ByaW1QZXJmb3JtZXIoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX05PTkUpOwotCQkJCX0KLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYmNfYWRkblBlcmZvcm1lci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCQlpZiAoYmNfYWRkblBlcmZvcm1lci5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY0FkZG5QZXJmb3JtZXIoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jQWRkblBlcmZvcm1lcihTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfTk9ORSk7Ci0JCQkJCX0KLQkJCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCX0KLQkJfSk7Ci0JCQotCQliY19yZXNwUm9sZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19yZXNwUm9sZS5nZXRTZWxlY3Rpb24oKSkgewotLy8JCQkJCWJyX3Jlc3BSb2xlWzBdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJYnJfcmVzcFJvbGVbMV0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlpZiAoYnJfcmVzcFJvbGVbMF0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUmVzcFJvbGUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJCQkJZWxzZQotLy8JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUmVzcFJvbGUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0JCQkJfSBlbHNlIHsKLS8vCQkJCQlicl9yZXNwUm9sZVswXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJCQlicl9yZXNwUm9sZVsxXS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY1Jlc3BSb2xlKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWJjX2NvbnRBcnRpZmFjdC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19jb250QXJ0aWZhY3QuZ2V0U2VsZWN0aW9uKCkpIHsKLS8vCQkJCQlicl9jb250QXJ0aWZhY3RbMF0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlicl9jb250QXJ0aWZhY3RbMV0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlpZiAoYnJfY29udEFydGlmYWN0WzBdLmdldFNlbGVjdGlvbigpKQotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY0NvbnRBcnRpZmFjdChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQkJCQllbHNlCi0vLwkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNDb250QXJ0aWZhY3QoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0JCQkJfSBlbHNlIHsKLS8vCQkJCQlicl9jb250QXJ0aWZhY3RbMF0uc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJCQkJYnJfY29udEFydGlmYWN0WzFdLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jQ29udEFydGlmYWN0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWJjX2RlbGl2UGFydC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19kZWxpdlBhcnQuZ2V0U2VsZWN0aW9uKCkpIHsKLS8vCQkJCQlicl9kZWxpdlBhcnRbMF0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlicl9kZWxpdlBhcnRbMV0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlpZiAoYnJfZGVsaXZQYXJ0WzBdLmdldFNlbGVjdGlvbigpKQotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY0RlbGl2UGFydChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQkJCQllbHNlCi0vLwkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNEZWxpdlBhcnQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0JCQkJfSBlbHNlIHsKLS8vCQkJCQlicl9kZWxpdlBhcnRbMF0uc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJCQkJYnJfZGVsaXZQYXJ0WzFdLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jRGVsaXZQYXJ0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWJjX3NlbFN0ZXAuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoYmNfc2VsU3RlcC5nZXRTZWxlY3Rpb24oKSkgewotLy8JCQkJCWJyX3NlbFN0ZXBbMF0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlicl9zZWxTdGVwWzFdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJaWYgKGJyX3NlbFN0ZXBbMF0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jU2VsU3RlcChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQkJCQllbHNlCi0vLwkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNTZWxTdGVwKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotCQkJCX0gZWxzZSB7Ci0vLwkJCQkJYnJfc2VsU3RlcFswXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJCQlicl9zZWxTdGVwWzFdLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jU2VsU3RlcChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfTk9ORSk7Ci0JCQkJfQotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgIiArIHN5bmNDaG9pY2VzLnRvU3RyaW5nKCkpOwotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLS8vCQlicl9wcmVzTmFtZVswXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9vcHRJbnB1dFswXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9tYW5JbnB1dFswXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9vdXRwdXRbMF0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfcmVzcFJvbGVbMF0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfY29udEFydGlmYWN0WzBdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX2RlbGl2UGFydFswXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9zZWxTdGVwWzBdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCQotLy8JCWJyX3ByZXNOYW1lWzFdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX29wdElucHV0WzFdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX21hbklucHV0WzFdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX291dHB1dFsxXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9yZXNwUm9sZVsxXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9jb250QXJ0aWZhY3RbMV0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfZGVsaXZQYXJ0WzFdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX3NlbFN0ZXBbMV0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCi0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9wcmVzTmFtZVswXSAmJiBicl9wcmVzTmFtZVswXS5nZXRTZWxlY3Rpb24oKSkgeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY1ByZXNOYW1lKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX29wdElucHV0WzBdICYmIGJyX29wdElucHV0WzBdLmdldFNlbGVjdGlvbigpKSB7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jT3B0SW5wdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfbWFuSW5wdXRbMF0gJiYgYnJfbWFuSW5wdXRbMF0uZ2V0U2VsZWN0aW9uKCkpIHsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNNYW5JbnB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9vdXRwdXRbMF0gJiYgYnJfb3V0cHV0WzBdLmdldFNlbGVjdGlvbigpKSB7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jT3V0cHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX3Jlc3BSb2xlWzBdICYmIGJyX3Jlc3BSb2xlWzBdLmdldFNlbGVjdGlvbigpKSB7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUmVzcFJvbGUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfY29udEFydGlmYWN0WzBdICYmIGJyX2NvbnRBcnRpZmFjdFswXS5nZXRTZWxlY3Rpb24oKSkgewotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jQ29udEFydGlmYWN0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX2RlbGl2UGFydFswXSAmJiBicl9kZWxpdlBhcnRbMF0uZ2V0U2VsZWN0aW9uKCkpIHsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNEZWxpdlBhcnQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfc2VsU3RlcFswXSAmJiBicl9zZWxTdGVwWzBdLmdldFNlbGVjdGlvbigpKXsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNTZWxTdGVwKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCX0KLS8vCi0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9wcmVzTmFtZVsxXSAmJiBicl9wcmVzTmFtZVsxXS5nZXRTZWxlY3Rpb24oKSl7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUHJlc05hbWUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfb3B0SW5wdXRbMV0gJiYgYnJfb3B0SW5wdXRbMV0uZ2V0U2VsZWN0aW9uKCkpeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY09wdElucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX21hbklucHV0WzFdICYmIGJyX21hbklucHV0WzFdLmdldFNlbGVjdGlvbigpKXsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNNYW5JbnB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9vdXRwdXRbMV0gJiYgYnJfb3V0cHV0WzFdLmdldFNlbGVjdGlvbigpKXsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNPdXRwdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfcmVzcFJvbGVbMV0gJiYgYnJfcmVzcFJvbGVbMV0uZ2V0U2VsZWN0aW9uKCkpeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY1Jlc3BSb2xlKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX2NvbnRBcnRpZmFjdFsxXSAmJiBicl9jb250QXJ0aWZhY3RbMV0uZ2V0U2VsZWN0aW9uKCkpewotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jQ29udEFydGlmYWN0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX2RlbGl2UGFydFsxXSAmJiBicl9kZWxpdlBhcnRbMV0uZ2V0U2VsZWN0aW9uKCkpeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY0RlbGl2UGFydChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9zZWxTdGVwWzFdICYmIGJyX3NlbFN0ZXBbMV0uZ2V0U2VsZWN0aW9uKCkpewotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jU2VsU3RlcChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLS8vCQl9Ci0vLy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIERFQlVHOiAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCWlmIChzeW5jQ2hvaWNlcy5nZXRTeW5jTmFtZSgpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY1ByZXNOYW1lKCkgPiAwIHx8Ci0JCQlzeW5jQ2hvaWNlcy5nZXRTeW5jQnJpZWZEZXNjKCkgPiAwIHx8Ci0JCQlzeW5jQ2hvaWNlcy5nZXRTeW5jT3B0SW5wdXQoKSA+IDAgfHwKLQkJCXN5bmNDaG9pY2VzLmdldFN5bmNNYW5JbnB1dCgpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY091dHB1dCgpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY1ByaW1QZXJmb3JtZXIoKSA+IDAgfHwKLQkJCXN5bmNDaG9pY2VzLmdldFN5bmNBZGRuUGVyZm9ybWVyKCkgPiAwIHx8Ci0JCQlzeW5jQ2hvaWNlcy5nZXRTeW5jUmVzcFJvbGUoKSA+IDAgfHwKLQkJCXN5bmNDaG9pY2VzLmdldFN5bmNDb250QXJ0aWZhY3QoKSA+IDAgfHwKLQkJCXN5bmNDaG9pY2VzLmdldFN5bmNEZWxpdlBhcnQoKSA+IDAgfHwKLQkJCXN5bmNDaG9pY2VzLmdldFN5bmNTZWxTdGVwKCkgPiAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQl9Ci0JCi0vLwlwcml2YXRlIHZvaWQgY3JlYXRlVHdvUmFkaW9Hcm91cChDb21wb3NpdGUgcGFyZW50LCBCdXR0b25bXSByYnMpIHsKLS8vCQlDb21wb3NpdGUgYUdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLS8vCQkKLS8vCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLS8vCQlhR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0vLwkJCi0vLwkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLS8vCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0vLwkJYUdyb3VwLnNldExheW91dERhdGEoZ2QpOwotLy8JCQotLy8JCXJic1swXSA9IGNyZWF0ZVJhZGlvQnV0dG9uKGFHcm91cCwgIiIsIDEsIHRydWUpOyAvLyROT04tTkxTLTEkCi0vLwkJcmJzWzFdID0gY3JlYXRlUmFkaW9CdXR0b24oYUdyb3VwLCAiIiwgMSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0vLwkJCi0vLwkJcmJzWzBdLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JCXJic1sxXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbldpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjNjM2VhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLQotLyoqCi0gKiBUaGUgd2l6YXJkIHRoYXQgZ3VpZGVzIHVzZXIgdG8gZG8gY3VzdG9tIHN5bmNocm9uaXphdGlvbiBmb3IgcHJvY2VzcwotICogZGVzY3JpcHRvcnMgZnJvbSBtZXRob2QgZWxlbWVudHMuCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXphdGlvbldpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25EZXNjcmlwdGlvblBhZ2UgZGVzY1BhZ2U7Ci0JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25TZWxlY3RDb25maWdQYWdlIHNlbGVjdENvbmZpZ1BhZ2U7Ci0JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25TZWxlY3REZXRhaWxzUGFnZSBzZWxlY3REZXRhaWxzUGFnZTsKLS8vCXByaXZhdGUgU3luY2hyb25pemF0aW9uUHJldmlld1BhZ2UgcHJldmlld1BhZ2U7Ci0JCi0JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25DaG9pY2VzIHN5bmNDaG9pY2VzID0gbnVsbDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6YXRpb25XaXphcmQoU3luY2hyb25pemF0aW9uQ2hvaWNlcyBjaG9pY2VzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3luY0Nob2ljZXMgPSBjaG9pY2VzOwotCQlzZXRXaW5kb3dUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfdGl0bGVfdGV4dCk7IAotCX0KLQkKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL3dpemJhbi9zeW5jaHJvbml6YXRpb24uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCQlkZXNjUGFnZSA9IG5ldyBTeW5jaHJvbml6YXRpb25EZXNjcmlwdGlvblBhZ2UoCi0JCQkJIlN5bmNocm9uaXphdGlvbkRlc2NyaXB0aW9uUGFnZSIsIHN5bmNDaG9pY2VzKTsgLy8kTk9OLU5MUy0xJAotCQlkZXNjUGFnZS5zZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjcmlwdG9yKTsKLQkJYWRkUGFnZShkZXNjUGFnZSk7Ci0KLQkJc2VsZWN0Q29uZmlnUGFnZSA9IG5ldyBTeW5jaHJvbml6YXRpb25TZWxlY3RDb25maWdQYWdlKAotCQkJCSJTeW5jaHJvbml6YXRpb25TZWxlY3RDb25maWdQYWdlIiwgc3luY0Nob2ljZXMpOyAvLyROT04tTkxTLTEkCi0JCXNlbGVjdENvbmZpZ1BhZ2Uuc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvcik7Ci0JCWFkZFBhZ2Uoc2VsZWN0Q29uZmlnUGFnZSk7Ci0JCQotCQlzZWxlY3REZXRhaWxzUGFnZSA9IG5ldyBTeW5jaHJvbml6YXRpb25TZWxlY3REZXRhaWxzUGFnZSgKLQkJCQkiU3luY2hyb25pemF0aW9uU2VsZWN0RGV0YWlsc1BhZ2UiLCBzeW5jQ2hvaWNlcyk7IC8vJE5PTi1OTFMtMSQKLQkJc2VsZWN0RGV0YWlsc1BhZ2Uuc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvcik7Ci0JCWFkZFBhZ2Uoc2VsZWN0RGV0YWlsc1BhZ2UpOwotCQkKLS8vCQlwcmV2aWV3UGFnZSA9IG5ldyBTeW5jaHJvbml6YXRpb25QcmV2aWV3UGFnZSgKLS8vCQkJCSJTeW5jaHJvbml6YXRpb25QcmV2aWV3UGFnZSIsIHN5bmNDaG9pY2VzKTsgLy8kTk9OLU5MUy0xJAotLy8JCXByZXZpZXdQYWdlLnNldEltYWdlRGVzY3JpcHRvcihpbWFnZURlc2NyaXB0b3IpOwotLy8JCWFkZFBhZ2UocHJldmlld1BhZ2UpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2NhbkZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlyZXR1cm4gKHNlbGVjdERldGFpbHNQYWdlLmlzUGFnZUNvbXBsZXRlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJc3luY0Nob2ljZXMuc2V0RmluaXNoUHJlc3NlZCh0cnVlKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtQ2FuY2VsKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotCQlzeW5jQ2hvaWNlcy5zZXRGaW5pc2hQcmVzc2VkKGZhbHNlKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNTYwMGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHdpemFyZHMgZm9yIGF1dGhvcmluZyBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYmUwOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuYmFzZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YzFhNDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmZWF0dXJlUGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmJhc2U7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM5OTA4Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5pbmkgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNGY0ZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWZlYXR1cmVUZXh0Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1hcHBsaWNhdGlvbl8zMi5naWYKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi1hcHBOYW1lPSVmZWF0dXJlTmFtZQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLXdlbGNvbWVQYWdlPSRubCQvd2VsY29tZS54bWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2Fib3V0Lm1hcHBpbmdzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiODBiM2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLSMgVXN1YWxseSBnZW5lcmF0ZWQgYXQgYnVpbGQgdGltZS4KLQotMD1AYnVpbGQtSURACi0xPTEuMi4wLjIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDM2NzdhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIEJhc2UKLQotZmVhdHVyZVRleHQ9RVBGIEJhc2VcblwKLVxuXAotVmVyc2lvbjogezF9IFxuXAotQnVpbGQgTGFiZWw6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi1cblwKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hcHBsaWNhdGlvbl8zMi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hcHBsaWNhdGlvbl8zMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYXBwbGljYXRpb25fMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMDc0YjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYXBwbGljYXRpb25fMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIHdlbGNvbWUueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIG5sLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvZGEvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2RhL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNjlmNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvZGEvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgLSBiYXNpcwotCi1mZWF0dXJlVGV4dD1FUEYgQmFzZVxuXAotXG5cCi1WZXJzaW9uOiB7MX0gXG5cCi1CeWdnZWV0aWtldDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvZGUvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2RlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YTgxZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvZGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgLSBCYXNpcwotCi1mZWF0dXJlVGV4dD1FUEYgLSBCYXNpc1xuXAotXG5cCi1WZXJzaW9uOiB7MX0gXG5cCi1CdWlsZC1LZW5udW5nOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvZXMvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2VzL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZmI2MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvZXMvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgQmFzZQotCi1mZWF0dXJlVGV4dD1FUEYgQmFzZVxuXAotXG5cCi1WZXJzaVx1MDBmM246IHsxfSBcblwKLUV0aXF1ZXRhIGRlIGJ1aWxkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBDb2xhYm9yYWRvcmVzIGRlIEVjbGlwc2UgeSBvdHJvcyAyMDAwLCAyMDA3LiAgUmVzZXJ2YWRvcyB0b2RvcyBsb3MgZGVyZWNob3MuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9mci9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvZnIvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyNzAyZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9mci9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUJhc2UgRVBGCi0KLWZlYXR1cmVUZXh0PUVQRiBCYXNlXG5cCi1cblwKLVZlcnNpb24gOiB7MX0gXG5cCi1MaWJlbGxcdTAwZTkgZGUgdmVyc2lvbiA6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9pdC9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvaXQvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdkZGJkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9pdC9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBCYXNlCi0KLWZlYXR1cmVUZXh0PUVQRiBCYXNlXG5cCi1cblwKLVZlcnNpb25lOiB7MX0gXG5cCi1FdGljaGV0dGEgYnVpbGQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGUgYWx0cmkgMjAwMCwgMjAwNy4gIFR1dHRpIGkgZGlyaXR0aSByaXNlcnZhdGkuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9qYS9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvamEvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQwMWQ1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9qYS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBCYXNlCi0KLWZlYXR1cmVUZXh0PUVQRiBCYXNlXG5cCi1cblwKLVx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmMzogezF9IFxuXAotXHUzMGQzXHUzMGViXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGQ5XHUzMGViOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2Uvbmwva28vYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2tvL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YzY2ZjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2Uvbmwva28vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgXHVhZTMwXHViY2Y4Ci0KLWZlYXR1cmVUZXh0PUVQRiBcdWFlMzBcdWJjZjhcblwKLVxuXAotXHViYzg0XHVjODA0OiB7MX0gXG5cCi1cdWJlNGNcdWI0ZGMgXHViODA4XHVjNzc0XHViZTE0OiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvcHQvQlIvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL3B0L0JSL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZmM5ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvcHQvQlIvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1CYXNlIEVQRgotCi1mZWF0dXJlVGV4dD1CYXNlIEVQRlxuXAotXG5cCi1WZXJzXHUwMGUzbzogezF9IFxuXAotQ29uc3RydVx1MDBlN1x1MDBlM286IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IGNvbnRyaWJ1aWRvcmVzIEVjbGlwc2UgZSBvdXRyb3MgMjAwMCwgMjAwNy4gVG9kb3Mgb3MgRGlyZWl0b3MgUmVzZXJ2YWRvcy5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL3J1L2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9ydS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTdiOTJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL3J1L2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9XHUwNDExXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzYlx1MDQzNVx1MDQzYVx1MDQ0MiBFUEYKLQotZmVhdHVyZVRleHQ9XHUwNDExXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzYlx1MDQzNVx1MDQzYVx1MDQ0MiBFUEZcblwKLVxuXAotXHUwNDEyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDRmOiB7MX0gXG5cCi1cdTA0MWFcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2FcdTA0MzA6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIFx1MDQxMlx1MDQ0MVx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDQ5XHUwNDM4XHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDRiLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvemgvQ04vYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL3poL0NOL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NGFiMjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvemgvQ04vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgQmFzZQotCi1mZWF0dXJlVGV4dD1FUEYgQmFzZVxuXAotXG5cCi1cdTcyNDhcdTY3MmNcdWZmMWF7MX0gXG5cCi1cdTVkZTVcdTRmNWNcdTcyNDhcdTY3MmNcdTY4MDdcdTdiN2VcdWZmMWF7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuIFxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL3poL1RXL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC96aC9UVy9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTIwMTA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL3poL1RXL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIEJhc2UKLQotZmVhdHVyZVRleHQ9RVBGIEJhc2VcblwKLVxuXAotXHU3MjQ4XHU2NzJjXHVmZjFhezF9XG5cCi1cdTVlZmFcdTdmNmVcdTZhMTlcdTdjNjRcdWZmMWF7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3Mzg5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotZmVhdHVyZVBsdWdpbk5hbWU9RVBGIEJhc2UgRmVhdHVyZQotZmVhdHVyZVBsdWdpbk5hbWVOTD1FUEYgQmFzZSBGZWF0dXJlIChOTDEpCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS93ZWxjb21lLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL3dlbGNvbWUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjQwZDA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL3dlbGNvbWUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08d2VsY29tZVBhZ2UgCi0JdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsiPgotCi08aW50cm8+V2VsY29tZSB0byBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrCi08L2ludHJvPgotCi08aXRlbT48Yj5XaGF0IGlzIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms/PC9iPgotCQotPC9pdGVtPgotCi08aXRlbT48Yj5MZWFybiBNb3JlPC9iPgotCi08L2l0ZW0+Ci0KLTwvd2VsY29tZVBhZ2U+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzY2U2YTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5jb21tb24udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhOGE4NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI0ZyaSBKYW4gMDQgMTU6MDk6MDkgUFNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1wbHVnaW5Qcm9qZWN0LmV4dGVuc2lvbnM9ZmFsc2UKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZWQ3ZGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkNvbW1vblVJUGx1Z2luCi1JbXBvcnQtUGFja2FnZTogb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uO3Zpc2liaWxpdHk6PXJlZXhwb3J0Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkMmU0ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9BYnN0cmFjdFBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9BYnN0cmFjdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGZlMmI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvQWJzdHJhY3RQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ydW50aW1lLkludGVybmFsUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLklBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuSTE4blV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBFUEYgcGx1Zy1pbnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gaW1wbGVtZW50cyBJQWN0aXZhdG9yIHsKLQotCi0JLy8gVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGljb25zLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1BBVEggPSAiaWNvbnMvIjsgLy8kTk9OLU5MUy0xJDsKLQotCS8vIFRoZSBsb2dnZXIgaGFzaCBtYXAuCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgTG9nZ2VyPiBsb2dnZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMb2dnZXI+KCk7Ci0KLQkvLyBUaGUgbWVzc2FnZSBkaWFsb2cgaGFzaCBtYXAuCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgTXNnRGlhbG9nPiBtc2dEaWFsb2dzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNc2dEaWFsb2c+KCk7Ci0KLQkvLyBUaGUgc2hhcmVkIGltYWdlIGhhc2ggbWFwLgotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEltYWdlPiBzaGFyZWRJbWFnZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEltYWdlPigpOwotCi0JLy8gVGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhpcyBwbHVnLWluLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQkvLyBUaGlzIHBsdWctaW4gSUQuCi0JcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWQ7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBpbnN0YWxsIFVSTC4KLQlwcml2YXRlIFVSTCBpbnN0YWxsVVJMOwotCi0JLy8gVGhlIHBsdWctaW4gaW5zdGFsbCBwYXRoLgotCXByaXZhdGUgU3RyaW5nIGluc3RhbGxQYXRoOwotCi0JLy8gVGhlIHBsdWctaW4gaWNvbiBVUkwuCi0JcHJpdmF0ZSBVUkwgaWNvblVSTDsKLQotCS8vIFRoZSBwcm9maWxpbmcgZmxhZy4KLQlwcml2YXRlIGJvb2xlYW4gcHJvZmlsaW5nOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCi0JCWluaXQoY29udGV4dCk7Ci0KLQkJLy8gc2V0IHRoZSAKLQkJaWYgKGlzRGVidWdnaW5nKCkpIHsKLQkJCWdldExvZ2dlcigpLmxvZ0luZm8oIlN0YXJ0ZWQgIiArIHBsdWdpbklkKTsgLy8kTk9OLU5MUy0xJAkJCQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBGcmVlIHRoZSBzaGFyZWQgaW1hZ2VzLgotCQlmb3IgKEl0ZXJhdG9yIGltYWdlcyA9IHNoYXJlZEltYWdlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpbWFnZXMKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIGltYWdlcy5uZXh0KCk7Ci0JCQlpZiAoaW1hZ2UgIT0gbnVsbCAmJiAhaW1hZ2UuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0KLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQotCQlpZiAoaXNEZWJ1Z2dpbmcoKSkgewotCQkJZ2V0TG9nZ2VyKCkubG9nSW5mbygiU3RvcHBlZCAiICsgcGx1Z2luSWQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHBsdWctaW4uCi0JICogCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiAgICAgICAgICAgIFRoZSBidW5kbGUgY29udGV4dC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIEdldCB0aGUgYnVuZGxlIGZvciB0aGlzIHBsdWctaW4uCi0JCUJ1bmRsZSBidW5kbGUgPSBnZXRCdW5kbGUoKTsKLQotCQkvLyBHZXQgdGhlIHJlc291Y2UgYnVuZGxlIGZvciB0aGlzIHBsdWctaW4uCi0JCXJlc291cmNlQnVuZGxlID0gUGxhdGZvcm0uZ2V0UmVzb3VyY2VCdW5kbGUoYnVuZGxlKTsKLQotCQkvLyBHZXQgdGhlIElEIGZvciB0aGlzIHBsdWctaW4uCi0JCXBsdWdpbklkID0gYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpOwotCi0JCWlmIChpc0RlYnVnZ2luZygpKSB7Ci0JCQlnZXRMb2dnZXIoKS5sb2dJbmZvKCJJbml0aWFsaXppbmcgIiArIHBsdWdpbklkKTsgLy8kTk9OLU5MUy0xJAkJCi0JCX0KLQotCQkvLyBHZXQgdGhlIGluc3RhbGwgcGF0aCBvZiB0aGlzIHBsdWctaW4uCi0JCWluc3RhbGxVUkwgPSBidW5kbGUuZ2V0RW50cnkoIi8iKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRyeSB7Ci0JCQlpbnN0YWxsUGF0aCA9IEZpbGVMb2NhdG9yLnJlc29sdmUoaW5zdGFsbFVSTCkuZ2V0UGF0aCgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlpbnN0YWxsUGF0aCA9IFBsYXRmb3JtLmdldEluc3RhbGxMb2NhdGlvbigpLmdldFVSTCgpLmdldFBhdGgoKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlpY29uVVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLCBJQ09OX1BBVEgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlTdHJpbmcgc3ltYm9saWNOYW1lID0gYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpOwotCQlpZiAoc3ltYm9saWNOYW1lICE9IG51bGwpIHsKLQkJCVN0cmluZyBrZXkgPSBzeW1ib2xpY05hbWUgKyAiL3Byb2ZpbGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyB2YWx1ZSA9IEludGVybmFsUGxhdGZvcm0uZ2V0RGVmYXVsdCgpLmdldE9wdGlvbihrZXkpOwotCQkJcHJvZmlsaW5nID0gdmFsdWUgPT0gbnVsbCA/IGZhbHNlIDogdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoaXNEZWJ1Z2dpbmcoKSkgewotCQkJZ2V0TG9nZ2VyKCkubG9nSW5mbygKLQkJCQkJIkluaXRpYWxpemVkICIgKyBwbHVnaW5JZCArICIsIGluc3RhbGxQYXRoPSIgKyBpbnN0YWxsUGF0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUQgb2YgdGhpcyBwbHVnLWluLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIElEIG9mIHRoaXMgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gcGx1Z2luSWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5zdGFsbCBVUkwgb2YgdGhpcyBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBUaGUKLQkgKiAgICAgICAgICAgIGluc3RhbGwgVVJMIG9mIHRoaXMgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldEluc3RhbGxVUkwoKSB7Ci0JCXJldHVybiBpbnN0YWxsVVJMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbGwgcGF0aCBvZiB0aGlzIHBsdWctaW4uCi0JICogCi0JICogQHBhcmFtIFRoZQotCSAqICAgICAgICAgICAgaW5zdGFsbCBwYXRoIG9mIHRoaXMgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluc3RhbGxQYXRoKCkgewotCQlyZXR1cm4gaW5zdGFsbFBhdGg7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgYW5kIHJldHVybnMgdGhlIGxvY2FsaXplZCBwcm9wZXJ0aWVzIG9mIGEgSmF2YSBwcm9wZXJ0aWVzIGZpbGUuCi0JICogPHA+Ci0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwcm9wZXJ0aWVzIGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGx1Zy1pbiByb290LgotCSAqIEByZXR1cm4gQSA8Y29kZT5Qcm9wZXJ0aWVzPC9jb2RlPiBvYmplY3QuCi0JICovCi0JcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcyhTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWlmIChwYXRoID09IG51bGwpIHsKLQkJCXJldHVybiBwcm9wczsKLQkJfQotCi0JCVN0cmluZyBmaWxlUGF0aCA9IGdldExvY2FsaXplZEZpbGUocGF0aCwgdHJ1ZSk7Ci0JCWlmIChmaWxlUGF0aCAhPSBudWxsKSB7Ci0JCQlwcm9wcy5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZVBhdGgpKTsKLQkJfQotCi0JCXJldHVybiBwcm9wczsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGxvY2FsZSBzcGVjaWZpYyBhYnNvbHV0ZSBmaWxlIHBhdGggbmFtZSBvZiB0aGUgZ2l2ZW4gZmlsZSBpbiB0aGUKLQkgKiBwbHVnaW4uCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwcm9wZXJ0aWVzIGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGx1Zy1pbiByb290LgotCSAqIEByZXR1cm4gU3RyaW5nIHRoZSBsb2NhbGUgc3BlY2lmaWMgYWJzb2x1dGUgZmlsZSBwYXRoIG5hbWUgb2YgdGhlIGdpdmVuCi0JICogICAgICAgICBmaWxlLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsaXplZEZpbGUoU3RyaW5nIHBhdGgsIGJvb2xlYW4gdXNlRGVmYXVsdCkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmaWxlUGF0aCA9IG51bGw7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IEZpbGVVdGlsLmdldEZpbGVOYW1lKHBhdGgpOwotCQlpbnQgaW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKGZpbGVOYW1lKTsKLQkJU3RyaW5nIHBhdGhOYW1lID0gcGF0aC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCi0JCUxvY2FsZSBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotCi0JCUJ1bmRsZSBidW5kbGUgPSBnZXRCdW5kbGUoKTsKLQkJQnVuZGxlW10gYnVuZGxlcyA9IFBsYXRmb3JtLmdldEZyYWdtZW50cyhidW5kbGUpOwotCQlpZiAoYnVuZGxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlVUkwgZW50cnkgPSBidW5kbGVzW2ldLmdldEVudHJ5KHBhdGhOYW1lKTsKLQkJCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJCQlVUkwgdXJsID0gRmlsZUxvY2F0b3IucmVzb2x2ZShlbnRyeSk7Ci0JCQkJCWZpbGVQYXRoID0gSTE4blV0aWwuZ2V0TG9jYWxpemVkRmlsZSh1cmwuZ2V0UGF0aCgpCi0JCQkJCQkJKyBmaWxlTmFtZSwgbG9jYWxlKTsgCi0JCQkJCWlmIChmaWxlUGF0aCAhPSBudWxsKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChmaWxlUGF0aCA9PSBudWxsKSB7Ci0JCQlVUkwgZW50cnkgPSBidW5kbGUuZ2V0RW50cnkocGF0aCk7Ci0JCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJCVVSTCB1cmwgPSBGaWxlTG9jYXRvci5yZXNvbHZlKGVudHJ5KTsKLQkJCQlmaWxlUGF0aCA9IEkxOG5VdGlsLmdldExvY2FsaXplZEZpbGUodXJsLmdldFBhdGgoKSwgbG9jYWxlKTsKLQkJCQlpZiAoZmlsZVBhdGggPT0gbnVsbCAmJiB1c2VEZWZhdWx0KSB7Ci0JCQkJCWZpbGVQYXRoID0gdXJsLmdldFBhdGgoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmlsZVBhdGg7Ci0JfQotCi0JLyoqCi0JICogZm9yIHRoZSBnaXZlbiBwYXRoIGluIHRoZSBwbHVnaW4sIGZpbmQgdGhlIGxvY2FsaXplZCBmaWxlcyBmb3JtIHRoZSBubAotCSAqIGZyYWdlbWVuZXRzIGFuZCBjb3B5IHRoZSBsb2NhbGl6ZWQgZmlsZXMgdG8gdGhlIGRlc3RpbmF0aW9uIGZvbGRlcgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBTdHJpbmcgYSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBwbHVnaW4gcm9vdC4gVGhlIGZpbGVzIGluIHRoaXMKLQkgKiAgICAgICAgICAgIGZvbGRlciB3aWxsIGJlIGl0ZXJhdGVkIGFuZCB0aGVpciBsb2NhbGl6ZWQgZmlsZXMgd2lsbCBiZQotCSAqICAgICAgICAgICAgY29waWVkIG92ZXIKLQkgKiBAcGFyYW0gdG9EaXIKLQkgKiAgICAgICAgICAgIEZJbGUgdGhlIGRlc3RpbmF0aW9uIGZvbGRlcgotCSAqIEBwYXJhbSByZWN1cnNpdmUKLQkgKiAgICAgICAgICAgIGJvb2xlYW4gcmVjdXJpdmVseSBsb29raW5nIGZvciBmaWxlcyBpbnQgdGhlIHNwZWNpZmllZCBmb2xkZXIKLQkgKiBAcGFyYW0gdXNlTG9jYWxlRmlsZU5hbWUKLQkgKiAgICAgICAgICAgIGJvb2xlYW4gaWYgdHJ1ZSB0aGUgbG9jYWxlIHNwZWNpZmljIGZpbGUgbmFtZXMgd2lsbCBiZSB1c2VkIGluCi0JICogICAgICAgICAgICB0aGUgY29waWVkIGRlc3RpbmF0aW9uLCBvdGhlcndpc2UsIHRoZSBsb2NhbGUgc3BlY2lmaWMgZmlsZQotCSAqICAgICAgICAgICAgbmFtZSB3aWxsIGJlIHJlbmFtZWQgdG8gdGhlIGRlZmF1bHQgb25lIGluIHRoZSBkZXN0aW5hdGlvbgotCSAqICAgICAgICAgICAgZm9sZGVyCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlMb2NhbGl6ZWRGaWxlcyhTdHJpbmcgcGF0aCwgRmlsZSB0b0RpciwgYm9vbGVhbiByZWN1cnNpdmUsCi0JCQlib29sZWFuIHVzZUxvY2FsZUZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IGdldEluc3RhbGxQYXRoKCk7Ci0JCVVSSSBwbHVnaW5VcmkgPSBuZXcgRmlsZShwbHVnaW5QYXRoKS50b1VSSSgpOwotCQlVUkkgcGF0aFVyaSA9IG5ldyBGaWxlKHBsdWdpblBhdGgsIHBhdGgpLnRvVVJJKCk7Ci0KLQkJTGlzdDxGaWxlPiBmaWxlcyA9IG5ldyBBcnJheUxpc3Q8RmlsZT4oKTsKLQkJRmlsZSBmID0gbmV3IEZpbGUocGx1Z2luUGF0aCwgcGF0aCk7Ci0JCUZpbGVVdGlsLmdldEFsbEZpbGVzKGYsIGZpbGVzLCByZWN1cnNpdmUpOwotCi0JCS8vIGZvciBlYWNoIGZpbGUgZm91bmQgaW4gdGhlIHNwZWNpZmllZCBmb2xkZXIsIGdldCB0aGUgbG9jYWxpemVkIGZpbGUKLQkJZm9yIChJdGVyYXRvciBpdCA9IGZpbGVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVVSSSBzcmNVcmkgPSAoKEZpbGUpIGl0Lm5leHQoKSkudG9VUkkoKTsKLQotCQkJLy8gZ2V0IHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBmaWxlIHRvIHRoZSBwbHVnaW4gcm9vdCwgdGhlbiBmaW5kCi0JCQkvLyB0aGUgbG9jYWxpemVkIGZpbGUKLQkJCVN0cmluZyByZWxQYXRoID0gcGx1Z2luVXJpLnJlbGF0aXZpemUoc3JjVXJpKS5nZXRQYXRoKCk7Ci0KLQkJCS8vIG9ubHkgZ2V0IHRoZSBsb2NhbGUgc3BlY2lmaWMgZmlsZSwgZG9uJ3QgaW5jbHVkZSB0aGUgZGVmYXVsdCBvbmUKLQkJCVN0cmluZyBsb2NhbGl6ZWRGaWxlID0gZ2V0TG9jYWxpemVkRmlsZShyZWxQYXRoLCBmYWxzZSk7Ci0JCQlpZiAobG9jYWxpemVkRmlsZSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8vIG5lZWQgdG8gY2hhbmdlIHRoZSB0YXJnZXQgZmlsZSBwYXRoIHRvIHJlbGF0aXZlIHRvIHRoZSBwYXRoCi0JCQkvLyBpbnN0ZWFkIG9mIHRoZSBwbHVnaW4gcm9vdAotCQkJcmVsUGF0aCA9IHBhdGhVcmkucmVsYXRpdml6ZShzcmNVcmkpLmdldFBhdGgoKTsKLQkJCUZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKGxvY2FsaXplZEZpbGUpOwotCQkJRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUodG9EaXIsIHJlbFBhdGgpOwotCQkJRmlsZSB0YXJnZXRQYXJlbnQgPSB0YXJnZXRGaWxlLmdldFBhcmVudEZpbGUoKTsKLQotCQkJLy8gY29weSB0aGUgZmlsZSB0byB0aGUgZGVzaXRpbmF0aW9uCi0JCQkvLyBpZiB1c2VMb2NhbGVGaWxlTmFtZSBpcyB0cnVlLCB0aGUgZGVzdGluYXRpb24gZmlsZSBuYW1lIHNob3VsZAotCQkJLy8gYWxzbyB1c2UgdGhlIGxvY2FsZSBzcGVjaWZpYyBmaWxlIG5hbWUKLQkJCWlmICh1c2VMb2NhbGVGaWxlTmFtZSkgewotCQkJCVN0cmluZyBmaWxlTmFtZSA9IHNyY0ZpbGUuZ2V0TmFtZSgpOwotCQkJCXRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXRQYXJlbnQsIGZpbGVOYW1lKTsKLQkJCX0KLQotCQkJaWYgKGlzRGVidWdnaW5nKCkpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvcHlpbmcgbG9jYWxpemVkIGZpbGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTb3VyY2U6ICIgKyBzcmNGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGFyZ2V0OiAiICsgdGFyZ2V0RmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJaWYgKCF0YXJnZXRQYXJlbnQuZXhpc3RzKCkpIHsKLQkJCQkJdGFyZ2V0UGFyZW50Lm1rZGlycygpOwotCQkJCX0KLQotCQkJCWlmICghdGFyZ2V0RmlsZS5leGlzdHMoKSkgewotCQkJCQl0YXJnZXRGaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCQl9Ci0KLQkJCQlGaWxlVXRpbC5jb3B5RmlsZShzcmNGaWxlLCB0YXJnZXRGaWxlKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlIGtleS4KLQkgKiBAcmV0dXJuIFRoZSBsb2NhbGl6ZWQgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiAnWycgKyBrZXkgKyAnXSc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZm9ybWF0dGVkIGxvY2FsaXplZCBtZXNzYWdlIGdpdmVuIHRoZSByZXNvdXJjZSBrZXkgYW5kIHRoZQotCSAqIG1lc3NhZ2UgYXJndW1lbnQuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gYXJndW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlIGFyZ3VtZW50LgotCSAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBsb2NhbGl6ZWQgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGZvcm1hdE1lc3NhZ2UoU3RyaW5nIGtleSwgT2JqZWN0IGFyZ3VtZW50KSB7Ci0JCWlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBtc2cgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJCQlPYmplY3RbXSBhcmd1bWVudHMgPSB7IGFyZ3VtZW50IH07Ci0JCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1zZywgYXJndW1lbnRzKTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICdbJyArIGtleSArICddJzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBVUkwgZ2l2ZW4gdGhlIHJlbGF0aXZlIHBhdGguCi0JICogCi0JICogQHBhcmFtIHJlbGF0aXZlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGltYWdlJ3MgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGx1Zy1pbidzIHJvb3QuCi0JICogQHJldHVybiBUaGUgaW1hZ2UgVVJMLgotCSAqLwotCXB1YmxpYyBVUkwgZ2V0SW1hZ2VVUkwoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwoaWNvblVSTCwgcmVsYXRpdmVQYXRoKTsKLQkJCXJldHVybiBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGRlc2NyaXB0b3IgZ2l2ZW4gdGhlIHJlbGF0aXZlIHBhdGguCi0JICogCi0JICogQHBhcmFtIHJlbGF0aXZlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGltYWdlJ3MgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGx1Zy1pbidzIHJvb3QuCi0JICogQHJldHVybiBUaGUgaW1hZ2UgZGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTChpY29uVVJMLCByZWxhdGl2ZVBhdGgpOwotCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGdpdmVuIHRoZSByZWxhdGl2ZSBwYXRoLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSByZXR1cm5lZCBpbWFnZSBuZWVkIHRvIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCi0JICogCi0JICogQHBhcmFtIHJlbGF0aXZlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGltYWdlJ3MgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGx1Zy1pbidzIHJvb3QuCi0JICogQHJldHVybiBUaGUgaW1hZ2UuCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCi0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBnZXRJbWFnZURlc2NyaXB0b3IocmVsYXRpdmVQYXRoKTsKLQkJaWYgKGltYWdlRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZShmYWxzZSk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGltYWdlIGdpdmVuIHRoZSByZWxhdGl2ZSBwYXRoLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSByZXR1cm5lZCBpbWFnZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZnJlZWQgd2hlbiB0aGUgcGx1Zy1pbgotCSAqIHNodXRzIGRvd24uCi0JICogCi0JICogQHBhcmFtIHJlbGF0aXZlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGltYWdlJ3MgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGx1Zy1pbidzIHJvb3QuCi0JICogQHJldHVybiBUaGUgaW1hZ2UuCi0JICovCi0JcHVibGljIEltYWdlIGdldFNoYXJlZEltYWdlKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIHNoYXJlZEltYWdlcy5nZXQocmVsYXRpdmVQYXRoKTsKLQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCXJldHVybiBpbWFnZTsKLQkJfQotCi0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBnZXRJbWFnZURlc2NyaXB0b3IocmVsYXRpdmVQYXRoKTsKLQkJaWYgKGltYWdlRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZShmYWxzZSk7Ci0JCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCXNoYXJlZEltYWdlcy5wdXQocmVsYXRpdmVQYXRoLCBpbWFnZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvZmlsaW5nIGZsYWcuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBwcm9maWxpbmcgaXMgZW5hYmxlZCBmb3IgdGhpcyBwbHUtaW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb2ZpbGluZygpIHsKLQkJcmV0dXJuIHByb2ZpbGluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2dnZXIgZ2l2ZW4gdGhlIHBsdWctaW4gSUQuCi0JICogCi0JICogQHJldHVybiBUaGUgbmV3IG9yIGNhY2hlZCBsb2dnZXIuCi0JICovCi0JcHVibGljIExvZ2dlciBnZXRMb2dnZXIoKSB7Ci0JCUxvZ2dlciBsb2dnZXIgPSAoTG9nZ2VyKSBsb2dnZXJzLmdldChwbHVnaW5JZCk7Ci0JCWlmIChsb2dnZXIgPT0gbnVsbCkgewotCQkJbG9nZ2VyID0gbmV3IExvZ2dlcih0aGlzKTsKLQkJCWxvZ2dlcnMucHV0KHBsdWdpbklkLCBsb2dnZXIpOwotCQl9Ci0JCXJldHVybiBsb2dnZXI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1lc3NhZ2UgZGlhbG9nIGdpdmVuIHRoZSBwbHVnLWluIElELgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG5ldyBvciBjYWNoZWQgbWVzc2FnZSBkaWFsb2cuCi0JICovCi0JcHVibGljIHN0YXRpYyBNc2dEaWFsb2cgZ2V0TXNnRGlhbG9nKElBY3RpdmF0b3IgcGx1Z2luKSB7Ci0JCU1zZ0RpYWxvZyBtc2dEaWFsb2cgPSAoTXNnRGlhbG9nKSBtc2dEaWFsb2dzLmdldChwbHVnaW4uZ2V0SWQoKSk7Ci0JCWlmIChtc2dEaWFsb2cgPT0gbnVsbCkgewotCQkJbXNnRGlhbG9nID0gbmV3IE1zZ0RpYWxvZyhwbHVnaW4pOwotCQkJbXNnRGlhbG9ncy5wdXQocGx1Z2luLmdldElkKCksIG1zZ0RpYWxvZyk7Ci0JCX0KLQkJcmV0dXJuIG1zZ0RpYWxvZzsKLQl9Ci0KLQkKLQlwdWJsaWMgTXNnRGlhbG9nIGdldE1zZ0RpYWxvZygpIHsJCQotCQlyZXR1cm4gZ2V0TXNnRGlhbG9nKHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBkaXNwbGF5IHRvIGJlIHVzZWQuIFRoZSBtZXRob2QgZmlyc3QgY2hlY2tzLCBpZiB0aGUKLQkgKiB0aHJlYWQgY2FsbGluZyB0aGlzIG1ldGhvZCBoYXMgYW4gYXNzb2NpYXRlZCBkaXNhcGx5LiBJZiBzbywgdGhpcyBkaXNwbGF5Ci0JICogaXMgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgbWV0aG9kIHJldHVybnMgdGhlIGRlZmF1bHQgZGlzcGxheS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpc3BsYXkgZ2V0U3RhbmRhcmREaXNwbGF5KCkgewotCQlEaXNwbGF5IGRpc3BsYXk7Ci0JCWRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkKLQkJCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJcmV0dXJuIGRpc3BsYXk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL0NvbW1vblVJUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL0NvbW1vblVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyODA4NGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9Db21tb25VSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5JTWVzc2FnZUNhbGxiYWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBDb21tb25VSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBDb21tb25VSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb21tb25VSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCQotLy8JCS8vIHNldCB0aGUgcHJlZmVyZW5jZSBzdG9yZSBmb3IgdGhlIGNvbW1vbiBwbHVnaW4KLQkJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBzdG9yZVdyYXBwZXIgPSBuZXcgUHJlZmVyZW5jZVN0b3JlV3JhcHBlcihnZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuc2V0UHJlZmVyZW5jZVN0b3JlKHN0b3JlV3JhcHBlcik7Ci0JCQotCQkvLyBjcmVhdGUgdGhlIG1lc3NhZ2UgY2FsbGJhY2sgY29udGV4dCBmb3IgdGhlIG5vbi11aSBwbHVnaW5zCi0JCS8vIHRoaXMgaXMgdGhlIGNvbnRleHQgZm9yIG1lc3NhZ2UgY2FsbGJhY2sKLQkJLy8gZm9yIGVjbGlwc2UgY2xpZW50LCB0aGlzIGlzIHRoZSBTaGVsbCBvYmplY3QKLQkJLy8gc2hlbGwgb2JqZWN0IGNhbid0IGJlIHNoYXJlZCBhY3Jvb3NzIHRocmVhZCwgdXNlIGEgY29udGV4dCBwcm92aWRlciBpbnN0ZWFkCi0JCS8vQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5zZXRDb250ZXh0KE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSk7Ci0JCQotCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLnNldENvbnRleHRQcm92aWRlcihuZXcgQ29udGV4dFByb3ZpZGVyKCkpOwotCQotCQkvLyBjcmVhdGUgdGhlIE1lc3NhZ2VDYWxsYmFjayB0byBiZSBhY2Nlc3NpYmxlIHRvIHRoZSBub24tdWkgcGx1Z2luCi0JCUlNZXNzYWdlQ2FsbGJhY2sgbXNnQ2FsbGJhY2sgPSBuZXcgTWVzc2FnZUNhbGxiYWNrKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tbW9uVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9Db250ZXh0UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvQ29udGV4dFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YmYzYzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9Db250ZXh0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uSUNvbnRleHRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotCi0vKioKLSAqIGNvbnRlbnQgcHJvdmlkZXIgZm9yIG5vbi11aSBwbHVnaW5zCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29udGV4dFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbnRleHRQcm92aWRlciB7Ci0KLQlwdWJsaWMgT2JqZWN0IGdldENvbnRleHQoKSB7Ci0JCS8vVE9ETzogcmV2aXNpdAotCQlPYmplY3QgY3R4ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWN0eCA9IENvbW1vblVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJLy8KLQkJfQotCQlyZXR1cm4gY3R4ICE9IG51bGwgPyBjdHggOiBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL01lc3NhZ2VDYWxsYmFjay5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9NZXNzYWdlQ2FsbGJhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA4MzUxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL01lc3NhZ2VDYWxsYmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5BYnN0cmFjdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLklNZXNzYWdlQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLQotLyoqCi0gKiBtZXNzYWdlIGNhbGxiYWNrIGltcGxlbWVudGF0aW9uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUNhbGxiYWNrIGltcGxlbWVudHMgSU1lc3NhZ2VDYWxsYmFjayB7Ci0KLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhBYnN0cmFjdEFjdGl2YXRvciBwbHVnaW4sIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbikgewotCQlkaXNwbGF5V2FybmluZyhwbHVnaW4sIHRpdGxlLCBtc2csIHJlYXNvbiwgbnVsbCwgbnVsbCk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoQWJzdHJhY3RBY3RpdmF0b3IgcGx1Z2luLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLCBUaHJvd2FibGUgZXgpIHsKLQkJZGlzcGxheVdhcm5pbmcocGx1Z2luLCBtc2csIHJlYXNvbiwgbnVsbCwgZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3BsYXlXYXJuaW5nKEFic3RyYWN0QWN0aXZhdG9yIHBsdWdpbiwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwKLQkJCVN0cmluZyBkZXRhaWxzLCBUaHJvd2FibGUgZXgpIHsKLQkJU3RyaW5nIHRpdGxlID0gQ29tbW9uVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpLmdldFRleHQoKTsKLQkJZGlzcGxheVdhcm5pbmcocGx1Z2luLCB0aXRsZSwgbXNnLCByZWFzb24sIGRldGFpbHMsIGV4KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoQWJzdHJhY3RBY3RpdmF0b3IgcGx1Z2luLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sCi0JCQlTdHJpbmcgZGV0YWlscywgVGhyb3dhYmxlIGV4KSB7Ci0JCU1zZ0RpYWxvZyBkbGcgPSBDb21tb25VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKHBsdWdpbik7Ci0JCWRsZy5kaXNwbGF5V2FybmluZyh0aXRsZSwgbXNnLCByZWFzb24sIGRldGFpbHMsIGV4KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcGxheUVycm9yKEFic3RyYWN0QWN0aXZhdG9yIHBsdWdpbiwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCWRpc3BsYXlFcnJvcihwbHVnaW4sIHRpdGxlLCBtc2csIG51bGwsIG51bGwsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwbGF5RXJyb3IoQWJzdHJhY3RBY3RpdmF0b3IgcGx1Z2luLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFRocm93YWJsZSBleCkgewotCQlkaXNwbGF5RXJyb3IocGx1Z2luLCB0aXRsZSwgbXNnLCBudWxsLCBudWxsLCBleCk7Ci0JfQotCXB1YmxpYyB2b2lkIGRpc3BsYXlFcnJvcihBYnN0cmFjdEFjdGl2YXRvciBwbHVnaW4sIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGRldGFpbHMsIFRocm93YWJsZSBleCkgewotCQlNc2dEaWFsb2cgZGxnID0gQ29tbW9uVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZyhwbHVnaW4pOwotCQlkbGcuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIHJlYXNvbiwgZGV0YWlscywgZXgpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL1ByZWZlcmVuY2VTdG9yZVdyYXBwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvUHJlZmVyZW5jZVN0b3JlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWVlNDc1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvUHJlZmVyZW5jZVN0b3JlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiB3cmFwcGVyIGNsYXNzIGZvciBwcmVmZXJlbmNlIHN0b3JlCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBpbXBsZW1lbnRzIElQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHsKLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgc3RvcmU7Ci0JcHVibGljIFByZWZlcmVuY2VTdG9yZVdyYXBwZXIoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQl0aGlzLnN0b3JlID0gc3RvcmU7Ci0JfQotCQotCU1hcDxJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIsIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lck1hcCA9IG5ldyBIYXNoTWFwPElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlciwgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+KCk7Ci0JCi0JcHVibGljIElQcmVmZXJlbmNlU3RvcmUgZ2V0U3RvcmUoKSB7Ci0JCXJldHVybiBzdG9yZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZpbmFsIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlciBsaXN0ZW5lcikgewotCQkvLyBjcmVhdGUgYSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGFuZCBhZGQgdG8gdGhlIHN0b3JlCi0JCUlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHBjbCA9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpewotCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIgd3JhcHBlciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlcihldmVudCk7Ci0JCQkJbGlzdGVuZXIucHJvcGVydHlDaGFuZ2Uod3JhcHBlcik7Ci0JCQkJCi0JCQl9fTsKLQkJCi0JCWxpc3RlbmVyTWFwLnB1dChsaXN0ZW5lciwgcGNsKTsKLQkJc3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwY2wpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChTdHJpbmcgbmFtZSwgT2JqZWN0IG9sZFZhbHVlLAotCSAgICAgICAgICAgIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzdG9yZS5maXJlUHJvcGVydHlDaGFuZ2VFdmVudChuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyIGxpc3RlbmVyKSB7Ci0gICAgCUlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHBjbCA9IGxpc3RlbmVyTWFwLnJlbW92ZShsaXN0ZW5lcik7Ci0gICAgCWlmICggcGNsICE9IG51bGwgKSB7Ci0gICAgCQlzdG9yZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHBjbCk7Ci0gICAgCX0KLSAgICB9Ci0KLQkvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBib29sZWFuLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPmZhbHNlPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBjdXJyZW50IHZhbHVlIAotICAgICAqIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgYm9vbGVhbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgYm9vbGVhbi12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIG5hbWUpIHsKLSAgICAJcmV0dXJuIHN0b3JlLmdldEJvb2xlYW4obmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGJvb2xlYW4tdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+ZmFsc2U8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIGRlZmF1bHQgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgZGVmYXVsdCAKLSAgICAgKiB2YWx1ZSBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIGJvb2xlYW4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG5hbWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0Qm9vbGVhbihTdHJpbmcgbmFtZSkgewotICAgIAlyZXR1cm4gc3RvcmUuZ2V0RGVmYXVsdEJvb2xlYW4obmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGRvdWJsZS12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wLjA8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIGRlZmF1bHQgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgZGVmYXVsdCAKLSAgICAgKiB2YWx1ZSBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIGRvdWJsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBkb3VibGUgZ2V0RGVmYXVsdERvdWJsZShTdHJpbmcgbmFtZSkgewotICAgIAlyZXR1cm4gc3RvcmUuZ2V0RGVmYXVsdERvdWJsZShuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgZmxvYXQtdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MC4wZjwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gZGVmYXVsdCBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBkZWZhdWx0IAotICAgICAqIHZhbHVlIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgZmxvYXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG5hbWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZmxvYXQgZ2V0RGVmYXVsdEZsb2F0KFN0cmluZyBuYW1lKSB7Ci0gICAgCXJldHVybiBzdG9yZS5nZXREZWZhdWx0RmxvYXQobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGludGVnZXItdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MDwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gZGVmYXVsdCBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBkZWZhdWx0IAotICAgICAqIHZhbHVlIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGFuIGludGVnZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG5hbWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldERlZmF1bHRJbnQoU3RyaW5nIG5hbWUpIHsKLSAgICAJcmV0dXJuIHN0b3JlLmdldERlZmF1bHRJbnQobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGxvbmctdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MEw8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIGRlZmF1bHQgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgZGVmYXVsdCAKLSAgICAgKiB2YWx1ZSBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIGxvbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG5hbWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXREZWZhdWx0TG9uZyhTdHJpbmcgbmFtZSkgewotICAgIAlyZXR1cm4gc3RvcmUuZ2V0RGVmYXVsdExvbmcobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHN0cmluZy12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICh0aGUgZW1wdHkgc3RyaW5nIDxjb2RlPiIiPC9jb2RlPikgCi0gICAgICogaXMgbm8gZGVmYXVsdCBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBkZWZhdWx0IAotICAgICAqIHZhbHVlIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgc3RyaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBuYW1lZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0U3RyaW5nKFN0cmluZyBuYW1lKSB7Ci0gICAgCXJldHVybiBzdG9yZS5nZXREZWZhdWx0U3RyaW5nKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGRvdWJsZS12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wLjA8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGN1cnJlbnQgdmFsdWUgCi0gICAgICogY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBkb3VibGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGRvdWJsZS12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKFN0cmluZyBuYW1lKSB7Ci0gICAgCXJldHVybiBzdG9yZS5nZXREb3VibGUobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZmxvYXQtdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MC4wZjwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgY3VycmVudCB2YWx1ZSAKLSAgICAgKiBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIGZsb2F0LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBmbG9hdC12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdChTdHJpbmcgbmFtZSkgewotICAgIAlyZXR1cm4gc3RvcmUuZ2V0RmxvYXQobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgaW50ZWdlci12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBjdXJyZW50IHZhbHVlIAotICAgICAqIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGFuIGludGVndGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQtdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEludChTdHJpbmcgbmFtZSkgewotICAgIAlyZXR1cm4gc3RvcmUuZ2V0SW50KG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvbmctdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MEw8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGN1cnJlbnQgdmFsdWUgCi0gICAgICogY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBsb25nLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBsb25nLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0TG9uZyhTdHJpbmcgbmFtZSkgewotICAgIAlyZXR1cm4gc3RvcmUuZ2V0TG9uZyhuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzdHJpbmctdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAodGhlIGVtcHR5IHN0cmluZyA8Y29kZT4iIjwvY29kZT4pCi0gICAgICogaWYgdGhlcmUgaXMgbm8gcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgY3VycmVudCB2YWx1ZSAKLSAgICAgKiBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG5hbWUpIHsKLSAgICAJcmV0dXJuIHN0b3JlLmdldFN0cmluZyhuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZQotICAgICAqIGhhcyB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBoYXMgYSBrbm93biBkZWZhdWx0IHZhbHVlCi0gICAgICogYW5kIGl0cyBjdXJyZW50IHZhbHVlIGlzIHRoZSBzYW1lLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqIChpbmNsdWRpbmcgdGhlIGNhc2Ugd2hlcmUgdGhlIHByZWZlcmVuY2UgaXMgdW5rbm93biB0byB0aGlzIHN0b3JlKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdChTdHJpbmcgbmFtZSkgewotICAgIAlyZXR1cm4gc3RvcmUuaXNEZWZhdWx0KG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZXMgaW4gdGhpcyBwcm9wZXJ0eSBzdG9yZQotICAgICAqIHJlcXVpcmUgc2F2aW5nLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhdCBsZWFzdCBvbmUgb2YgdmFsdWVzIG9mIAotICAgICAqICB0aGUgcHJlZmVyZW5jZXMga25vd24gdG8gdGhpcyBzdG9yZSBoYXMgY2hhbmdlZCBhbmQgCi0gICAgICogIHJlcXVpcmVzIHNhdmluZywgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbmVlZHNTYXZpbmcoKSB7Ci0gICAgCXJldHVybiBzdG9yZS5uZWVkc1NhdmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSB0bwotICAgICAqIHRoZSBnaXZlbiBzdHJpbmcgdmFsdWUgd2l0aG91dCBzZW5kaW5nIGEgcHJvcGVydHkgY2hhbmdlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGZpcmUgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgYW5kIAotICAgICAqIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHNldHRpbmcgaW50ZXJuYWwgcHJlZmVyZW5jZXMgCi0gICAgICogdGhhdCBhcmUgbm90IG1lYW50IHRvIGJlIHByb2Nlc3NlZCBieSBsaXN0ZW5lcnMuCi0gICAgICogTm9ybWFsIGNsaWVudHMgc2hvdWxkIGluc3RlYWQgY2FsbCAjc2V0VmFsdWUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHV0VmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgIAlzdG9yZS5wdXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGRvdWJsZS12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuIAotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSBpcyBhZmZlY3RlZCBpZgotICAgICAqIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudCB2YWx1ZSB3YXMgaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpbiB3aGljaAotICAgICAqIGNhc2UgaXQgY2hhbmdlcyB0byB0aGUgbmV3IGRlZmF1bHQgdmFsdWUuIElmIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudAotICAgICAqIGlzIGRpZmZlcmVudCBmcm9tIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaXRzIGN1cnJlbnQgdmFsdWUgaXMKLSAgICAgKiB1bmFmZmVjdGVkLiBObyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGFyZSByZXBvcnRlZCBieSBjaGFuZ2luZyBkZWZhdWx0Ci0gICAgICogdmFsdWVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBkb3VibGUgdmFsdWUpIHsKLSAgICAJc3RvcmUuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGZsb2F0LXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4gCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIGlzIGFmZmVjdGVkIGlmCi0gICAgICogdGhlIHByZWZlcmVuY2UncyBjdXJyZW50IHZhbHVlIHdhcyBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGluIHdoaWNoCi0gICAgICogY2FzZSBpdCBjaGFuZ2VzIHRvIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZS4gSWYgdGhlIHByZWZlcmVuY2UncyBjdXJyZW50Ci0gICAgICogaXMgZGlmZmVyZW50IGZyb20gaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpdHMgY3VycmVudCB2YWx1ZSBpcwotICAgICAqIHVuYWZmZWN0ZWQuIE5vIHByb3BlcnR5IGNoYW5nZSBldmVudHMgYXJlIHJlcG9ydGVkIGJ5IGNoYW5naW5nIGRlZmF1bHQKLSAgICAgKiB2YWx1ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGZsb2F0IHZhbHVlKSB7Ci0gICAgCXN0b3JlLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBpbnRlZ2VyLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4gCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIGlzIGFmZmVjdGVkIGlmCi0gICAgICogdGhlIHByZWZlcmVuY2UncyBjdXJyZW50IHZhbHVlIHdhcyBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGluIHdoaWNoCi0gICAgICogY2FzZSBpdCBjaGFuZ2VzIHRvIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZS4gSWYgdGhlIHByZWZlcmVuY2UncyBjdXJyZW50Ci0gICAgICogaXMgZGlmZmVyZW50IGZyb20gaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpdHMgY3VycmVudCB2YWx1ZSBpcwotICAgICAqIHVuYWZmZWN0ZWQuIE5vIHByb3BlcnR5IGNoYW5nZSBldmVudHMgYXJlIHJlcG9ydGVkIGJ5IGNoYW5naW5nIGRlZmF1bHQKLSAgICAgKiB2YWx1ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotICAgIAlzdG9yZS5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgbG9uZy12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuIAotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSBpcyBhZmZlY3RlZCBpZgotICAgICAqIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudCB2YWx1ZSB3YXMgaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpbiB3aGljaAotICAgICAqIGNhc2UgaXQgY2hhbmdlcyB0byB0aGUgbmV3IGRlZmF1bHQgdmFsdWUuIElmIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudAotICAgICAqIGlzIGRpZmZlcmVudCBmcm9tIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaXRzIGN1cnJlbnQgdmFsdWUgaXMKLSAgICAgKiB1bmFmZmVjdGVkLiBObyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGFyZSByZXBvcnRlZCBieSBjaGFuZ2luZyBkZWZhdWx0Ci0gICAgICogdmFsdWVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB7Ci0gICAgCXN0b3JlLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBzdHJpbmctdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLiAKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UgaXMgYWZmZWN0ZWQgaWYKLSAgICAgKiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQgdmFsdWUgd2FzIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaW4gd2hpY2gKLSAgICAgKiBjYXNlIGl0IGNoYW5nZXMgdG8gdGhlIG5ldyBkZWZhdWx0IHZhbHVlLiBJZiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQKLSAgICAgKiBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGl0cyBjdXJyZW50IHZhbHVlIGlzCi0gICAgICogdW5hZmZlY3RlZC4gTm8gcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBhcmUgcmVwb3J0ZWQgYnkgY2hhbmdpbmcgZGVmYXVsdAotICAgICAqIHZhbHVlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSBkZWZhdWx0T2JqZWN0IHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBTdHJpbmcgZGVmYXVsdE9iamVjdCkgewotICAgIAlzdG9yZS5zZXREZWZhdWx0KG5hbWUsIGRlZmF1bHRPYmplY3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBib29sZWFuLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4gCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIGlzIGFmZmVjdGVkIGlmCi0gICAgICogdGhlIHByZWZlcmVuY2UncyBjdXJyZW50IHZhbHVlIHdhcyBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGluIHdoaWNoCi0gICAgICogY2FzZSBpdCBjaGFuZ2VzIHRvIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZS4gSWYgdGhlIHByZWZlcmVuY2UncyBjdXJyZW50Ci0gICAgICogaXMgZGlmZmVyZW50IGZyb20gaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpdHMgY3VycmVudCB2YWx1ZSBpcwotICAgICAqIHVuYWZmZWN0ZWQuIE5vIHByb3BlcnR5IGNoYW5nZSBldmVudHMgYXJlIHJlcG9ydGVkIGJ5IGNoYW5naW5nIGRlZmF1bHQKLSAgICAgKiB2YWx1ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLSAgICAJc3RvcmUuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGJhY2sKLSAgICAgKiB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIHByZWZlcnJlZCB3YXkgb2YgcmUtaW5pdGlhbGl6aW5nIGEgcHJlZmVyZW5jZSB0byB0aGUKLSAgICAgKiBhcHByb3ByaWF0ZSBkZWZhdWx0IHZhbHVlIGlzIHRvIGNhbGwgPGNvZGU+c2V0VG9EZWZhdWx0PC9jb2RlPi4KLSAgICAgKiBUaGlzIGlzIGltcGxlbWVudGVkIGJ5IHJlbW92aW5nIHRoZSBuYW1lZCB2YWx1ZSBmcm9tIHRoZSBzdG9yZSwgCi0gICAgICogdGhlcmVieSBleHBvc2luZyB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvRGVmYXVsdChTdHJpbmcgbmFtZSkgewotICAgIAlzdG9yZS5zZXRUb0RlZmF1bHQobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZG91YmxlLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHByb3BlcnR5IGNoYW5nZSBldmVudCBpcyByZXBvcnRlZCBpZiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgCi0gICAgICogcHJlZmVyZW5jZSBhY3R1YWxseSBjaGFuZ2VzIGZyb20gaXRzIHByZXZpb3VzIHZhbHVlLiBJbiB0aGUgZXZlbnQKLSAgICAgKiBvYmplY3QsIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlLCBhbmQgdGhlCi0gICAgICogb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgcHJlZmVycmVkIHdheSBvZiByZS1pbml0aWFsaXppbmcgYSBwcmVmZXJlbmNlIHRvIGl0cwotICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgdG8gY2FsbCA8Y29kZT5zZXRUb0RlZmF1bHQ8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBkb3VibGUgdmFsdWUpIHsKLSAgICAJc3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGZsb2F0LXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHByb3BlcnR5IGNoYW5nZSBldmVudCBpcyByZXBvcnRlZCBpZiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgCi0gICAgICogcHJlZmVyZW5jZSBhY3R1YWxseSBjaGFuZ2VzIGZyb20gaXRzIHByZXZpb3VzIHZhbHVlLiBJbiB0aGUgZXZlbnQKLSAgICAgKiBvYmplY3QsIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlLCBhbmQgdGhlCi0gICAgICogb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgcHJlZmVycmVkIHdheSBvZiByZS1pbml0aWFsaXppbmcgYSBwcmVmZXJlbmNlIHRvIGl0cwotICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgdG8gY2FsbCA8Y29kZT5zZXRUb0RlZmF1bHQ8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSkgewotICAgIAlzdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgaW50ZWdlci12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogQSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgaXMgcmVwb3J0ZWQgaWYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIAotICAgICAqIHByZWZlcmVuY2UgYWN0dWFsbHkgY2hhbmdlcyBmcm9tIGl0cyBwcmV2aW91cyB2YWx1ZS4gSW4gdGhlIGV2ZW50Ci0gICAgICogb2JqZWN0LCB0aGUgcHJvcGVydHkgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSwgYW5kIHRoZQotICAgICAqIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgd3JhcHBlZCBhcyBvYmplY3RzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIHByZWZlcnJlZCB3YXkgb2YgcmUtaW5pdGlhbGl6aW5nIGEgcHJlZmVyZW5jZSB0byBpdHMKLSAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIHRvIGNhbGwgPGNvZGU+c2V0VG9EZWZhdWx0PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7Ci0gICAgCXN0b3JlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBsb25nLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHByb3BlcnR5IGNoYW5nZSBldmVudCBpcyByZXBvcnRlZCBpZiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgCi0gICAgICogcHJlZmVyZW5jZSBhY3R1YWxseSBjaGFuZ2VzIGZyb20gaXRzIHByZXZpb3VzIHZhbHVlLiBJbiB0aGUgZXZlbnQKLSAgICAgKiBvYmplY3QsIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlLCBhbmQgdGhlCi0gICAgICogb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgcHJlZmVycmVkIHdheSBvZiByZS1pbml0aWFsaXppbmcgYSBwcmVmZXJlbmNlIHRvIGl0cwotICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgdG8gY2FsbCA8Y29kZT5zZXRUb0RlZmF1bHQ8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB7Ci0gICAgCXN0b3JlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzdHJpbmctdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIDxwPgotICAgICAqIEEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGlzIHJlcG9ydGVkIGlmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSAKLSAgICAgKiBwcmVmZXJlbmNlIGFjdHVhbGx5IGNoYW5nZXMgZnJvbSBpdHMgcHJldmlvdXMgdmFsdWUuIEluIHRoZSBldmVudAotICAgICAqIG9iamVjdCwgdGhlIHByb3BlcnR5IG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UsIGFuZCB0aGUKLSAgICAgKiBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHdyYXBwZWQgYXMgb2JqZWN0cy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlLWluaXRpYWxpemluZyBhIHByZWZlcmVuY2UgdG8gaXRzCi0gICAgICogZGVmYXVsdCB2YWx1ZSBpcyB0byBjYWxsIDxjb2RlPnNldFRvRGVmYXVsdDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgIAlzdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYm9vbGVhbi12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogQSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgaXMgcmVwb3J0ZWQgaWYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIAotICAgICAqIHByZWZlcmVuY2UgYWN0dWFsbHkgY2hhbmdlcyBmcm9tIGl0cyBwcmV2aW91cyB2YWx1ZS4gSW4gdGhlIGV2ZW50Ci0gICAgICogb2JqZWN0LCB0aGUgcHJvcGVydHkgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSwgYW5kIHRoZQotICAgICAqIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgd3JhcHBlZCBhcyBvYmplY3RzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIHByZWZlcnJlZCB3YXkgb2YgcmUtaW5pdGlhbGl6aW5nIGEgcHJlZmVyZW5jZSB0byBpdHMKLSAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIHRvIGNhbGwgPGNvZGU+c2V0VG9EZWZhdWx0PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotICAgIAlzdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9Qcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9Qcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjY5OGUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiB3cmFwcGVyIGNsYXNzIGZvciBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlciB7Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0JcHVibGljIFByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5ldmVudCA9IGV2ZW50OwotCX0KLQkKLQkgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmV3IHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qga25vd24KLSAgICAgKiAgb3Igbm90IHJlbGV2YW50IChmb3IgaW5zdGFuY2UgaWYgdGhlIHByb3BlcnR5IHdhcyByZW1vdmVkKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldE5ld1ZhbHVlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5ldmVudC5nZXROZXdWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBvbGQgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBrbm93bgotICAgICAqICBvciBub3QgcmVsZXZhbnQgKGZvciBpbnN0YW5jZSBpZiB0aGUgcHJvcGVydHkgd2FzIGp1c3QKLSAgICAgKiAgYWRkZWQgYW5kIHRoZXJlIHdhcyBubyBvbGQgdmFsdWUpLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0T2xkVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmV2ZW50LmdldE9sZFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkLgotICAgICAqIDxwPgotICAgICAqIFdhcm5pbmc6IHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBwcm9wZXJ0eSBuYW1lIHJldHVybmVkCi0gICAgICogaXMgYSBjb25zdGFudCBzdHJpbmcuICBDYWxsZXJzIG11c3QgY29tcGFyZSBwcm9wZXJ0eSBuYW1lcyB1c2luZwotICAgICAqIGVxdWFscywgbm90ID09LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgY2hhbmdlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmV2ZW50LmdldFByb3BlcnR5KCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL0NsaXBib2FyZFV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9DbGlwYm9hcmRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYmYwMjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL0NsaXBib2FyZFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkhUTUxUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRleHRUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciByZXRyaWV2aW5nIGRhdGEgZnJvbSB0aGUgY2xpcGJvYXJkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENsaXBib2FyZFV0aWwgewotCQotCS8qKgotCSAqIFRoZSBjdXJyZW50IGNsaXBib2FyZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBDbGlwYm9hcmQgY2xpcGJvYXJkOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9VUkwgPSAiU291cmNlVVJMOiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFRyYW5zZmVyIGh0bWxUcmFuc2ZlciA9IG51bGw7Ci0KLQlzdGF0aWMgewotCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJ3aW4zMiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtCi0JCQkJCQkuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4NiIpOyAvLyROT04tTkxTLTEkCi0JCQkJQ2xhc3MgYyA9IGJ1bmRsZQotCQkJCQkJLmxvYWRDbGFzcygib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi5XaW4zMkhUTUxUcmFuc2ZlciIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGMgIT0gbnVsbCkgewotCQkJCQlodG1sVHJhbnNmZXIgPSAoVHJhbnNmZXIpIGMubmV3SW5zdGFuY2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWh0bWxUcmFuc2ZlciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBIVE1MIHNvdXJjZSBVUkwgZnJvbSB0aGUgY3VycmVudCBjbGlwYm9hcmQuCi0JICogCi0JICogQHJldHVybiB0aGUgSFRNTCBzb3VyY2UgVVJMIG9yIDxjb2RlPm51bGw8L2NvZGU+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+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiYTk0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5jb21tb247c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiBjb21tb24uamFyLCBsaWIvanRpZHktOC4wLTIwMDYwODAxLjEzMTA1OS0zLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IGNvbS5pYm0uaWN1O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuYXBhY2hlLmFudAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uaHRtbCwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbiwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHksCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscywKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnhtbAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vYWJvdXQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI0MWJmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJJQk0gV2ViU3BoZXJlIFN0dWRpbyI+Ci08dGl0bGU+UGx1Zy1pbiBMaWNlbnNlIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08aDM+UGx1Zy1pbiBMaWNlbnNlIEFncmVlbWVudDwvaDM+Ci0KLTxwPlVzZSBvZiB0aGlzIFBsdWctaW4gaXMgc3ViamVjdCB0byB0aGUgc2FtZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB3aGljaCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgUHJvZHVjdCB3aGljaCBpbmNsdWRlZCB0aGlzIFBsdWctaW4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDgyNzUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLmNvbW1vbi5qYXIgPSBzcmMvCi1vdXRwdXQuY29tbW9uLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IGNvbW1vbi5qYXIsXAotICAgICAgICAgICAgICAgbGliLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL2xpYi9qdGlkeS04LjAtMjAwNjA4MDEuMTMxMDU5LTMuamFyIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9saWIvanRpZHktOC4wLTIwMDYwODAxLjEzMTA1OS0zLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdmYzk3MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL2xpYi9qdGlkeS04LjAtMjAwNjA4MDEuMTMxMDU5LTMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMGZlOWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgQ29tbW9uCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IyYTZmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InZlcnNpb24iIG5hbWU9IlZlcnNpb24iIHNjaGVtYT0ic2NoZW1hL29yZy5lY2xpcHNlLmVwZi5jb21tb24udmVyc2lvbi5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjb21tYW5kTGluZVJ1bm5lcnMiIG5hbWU9IkNvbW1hbmRMaW5lUnVubmVycyIgc2NoZW1hPSJzY2hlbWEvY29tbWFuZExpbmVSdW5uZXJzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJlcGYiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi52ZXJzaW9uIj4KLSAgICAgICAgIDx2ZXJzaW9ucwotICAgICAgICAgCWNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkVQRlZlcnNpb25zIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NjaGVtYS9jb21tYW5kTGluZVJ1bm5lcnMuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc2NoZW1hL2NvbW1hbmRMaW5lUnVubmVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmZjNzNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc2NoZW1hL2NvbW1hbmRMaW5lUnVubmVycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24iPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5jb21tb24iIGlkPSJjb21tYW5kTGluZVJ1bm5lcnMiIG5hbWU9IkNvbW1hbmRMaW5lUnVubmVycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBJQ29tbWFuZExpbmVSdW5uZXIgb2JqZWN0IHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGFuZCBydW4gZnJvbSBSdW5VdGlsLCBwcm92aWRlZCB3aXRoIHJ1bm5lcklkCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbW1hbmRMaW5lUnVubmVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbW1hbmRMaW5lUnVubmVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icnVubmVySWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5JQ29tbWFuZExpbmVSdW5uZXIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NjaGVtYS9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnZlcnNpb24uZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc2NoZW1hL29yZy5lY2xpcHNlLmVwZi5jb21tb24udmVyc2lvbi5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWUyNWE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc2NoZW1hL29yZy5lY2xpcHNlLmVwZi5jb21tb24udmVyc2lvbi5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24iPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5jb21tb24iIGlkPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnZlcnNpb24iIG5hbWU9IlZlcnNpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRGVmaW5lIHNjaGVtYS90b29sIHZlcnNpb25zCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InZlcnNpb25zIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJsaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ2ZXJzaW9ucyI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5WZXJzaW9ucyIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJsaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LklMaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL0Fic3RyYWN0QWN0aXZhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL0Fic3RyYWN0QWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZjdiN2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9BYnN0cmFjdEFjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucnVudGltZS5JbnRlcm5hbFBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5JMThuVXRpbDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgRVBGIHBsdWctaW5zLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBY3RpdmF0b3IgZXh0ZW5kcyBQbHVnaW4gaW1wbGVtZW50cyBJQWN0aXZhdG9yIHsKLQotCS8vIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBpY29ucy4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9QQVRIID0gImljb25zLyI7IC8vJE5PTi1OTFMtMSQ7Ci0KLQkvLyBUaGUgbG9nZ2VyIGhhc2ggbWFwLgotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIExvZ2dlcj4gbG9nZ2VycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTG9nZ2VyPigpOwotCi0JLy8gVGhlIG1lc3NhZ2UgZGlhbG9nIGhhc2ggbWFwLgotCS8vcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgTXNnRGlhbG9nPiBtc2dEaWFsb2dzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNc2dEaWFsb2c+KCk7Ci0KLQkvLyBUaGUgc2hhcmVkIGltYWdlIGhhc2ggbWFwLgotCS8vcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgSW1hZ2U+IHNoYXJlZEltYWdlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW1hZ2U+KCk7Ci0KLQkvLyBUaGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGlzIHBsdWctaW4uCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQotCS8vIFRoaXMgcGx1Zy1pbiBJRC4KLQlwcml2YXRlIFN0cmluZyBwbHVnaW5JZDsKLQotCS8vIFRoZSBwbHVnLWluIGluc3RhbGwgVVJMLgotCXByaXZhdGUgVVJMIGluc3RhbGxVUkw7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBpbnN0YWxsIHBhdGguCi0JcHJpdmF0ZSBTdHJpbmcgaW5zdGFsbFBhdGg7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBpY29uIFVSTC4KLQlwcm90ZWN0ZWQgVVJMIGljb25VUkw7Ci0KLQkvLyBUaGUgcHJvZmlsaW5nIGZsYWcuCi0JcHJpdmF0ZSBib29sZWFuIHByb2ZpbGluZzsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEFic3RyYWN0QWN0aXZhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQotCQlpbml0KGNvbnRleHQpOwotCi0JCS8vIHNldCB0aGUgCi0JCWlmIChpc0RlYnVnZ2luZygpKSB7Ci0JCQlnZXRMb2dnZXIoKS5sb2dJbmZvKCJTdGFydGVkICIgKyBwbHVnaW5JZCk7IC8vJE5PTi1OTFMtMSQJCQkKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gRnJlZSB0aGUgc2hhcmVkIGltYWdlcy4KLS8vCQlmb3IgKEl0ZXJhdG9yIGltYWdlcyA9IHNoYXJlZEltYWdlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpbWFnZXMKLS8vCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCUltYWdlIGltYWdlID0gKEltYWdlKSBpbWFnZXMubmV4dCgpOwotLy8JCQlpZiAoaW1hZ2UgIT0gbnVsbCAmJiAhaW1hZ2UuaXNEaXNwb3NlZCgpKSB7Ci0vLwkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0vLwkJCX0KLS8vCQl9Ci0KLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQotCQlpZiAoaXNEZWJ1Z2dpbmcoKSkgewotCQkJZ2V0TG9nZ2VyKCkubG9nSW5mbygiU3RvcHBlZCAiICsgcGx1Z2luSWQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHBsdWctaW4uCi0JICogCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiAgICAgICAgICAgIFRoZSBidW5kbGUgY29udGV4dC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIEdldCB0aGUgYnVuZGxlIGZvciB0aGlzIHBsdWctaW4uCi0JCUJ1bmRsZSBidW5kbGUgPSBnZXRCdW5kbGUoKTsKLQotCQkvLyBHZXQgdGhlIHJlc291Y2UgYnVuZGxlIGZvciB0aGlzIHBsdWctaW4uCi0JCXJlc291cmNlQnVuZGxlID0gUGxhdGZvcm0uZ2V0UmVzb3VyY2VCdW5kbGUoYnVuZGxlKTsKLQotCQkvLyBHZXQgdGhlIElEIGZvciB0aGlzIHBsdWctaW4uCi0JCXBsdWdpbklkID0gYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpOwotCi0JCWlmIChpc0RlYnVnZ2luZygpKSB7Ci0JCQlnZXRMb2dnZXIoKS5sb2dJbmZvKCJJbml0aWFsaXppbmcgIiArIHBsdWdpbklkKTsgLy8kTk9OLU5MUy0xJAkJCi0JCX0KLQotCQkvLyBHZXQgdGhlIGluc3RhbGwgcGF0aCBvZiB0aGlzIHBsdWctaW4uCi0JCWluc3RhbGxVUkwgPSBidW5kbGUuZ2V0RW50cnkoIi8iKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRyeSB7Ci0JCQlpbnN0YWxsUGF0aCA9IEZpbGVMb2NhdG9yLnJlc29sdmUoaW5zdGFsbFVSTCkuZ2V0UGF0aCgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlpbnN0YWxsUGF0aCA9IFBsYXRmb3JtLmdldEluc3RhbGxMb2NhdGlvbigpLmdldFVSTCgpLmdldFBhdGgoKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlpY29uVVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLCBJQ09OX1BBVEgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlTdHJpbmcgc3ltYm9saWNOYW1lID0gYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpOwotCQlpZiAoc3ltYm9saWNOYW1lICE9IG51bGwpIHsKLQkJCVN0cmluZyBrZXkgPSBzeW1ib2xpY05hbWUgKyAiL3Byb2ZpbGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyB2YWx1ZSA9IEludGVybmFsUGxhdGZvcm0uZ2V0RGVmYXVsdCgpLmdldE9wdGlvbihrZXkpOwotCQkJcHJvZmlsaW5nID0gdmFsdWUgPT0gbnVsbCA/IGZhbHNlIDogdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoaXNEZWJ1Z2dpbmcoKSkgewotCQkJZ2V0TG9nZ2VyKCkubG9nSW5mbygKLQkJCQkJIkluaXRpYWxpemVkICIgKyBwbHVnaW5JZCArICIsIGluc3RhbGxQYXRoPSIgKyBpbnN0YWxsUGF0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUQgb2YgdGhpcyBwbHVnLWluLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIElEIG9mIHRoaXMgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gcGx1Z2luSWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5zdGFsbCBVUkwgb2YgdGhpcyBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBUaGUKLQkgKiAgICAgICAgICAgIGluc3RhbGwgVVJMIG9mIHRoaXMgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldEluc3RhbGxVUkwoKSB7Ci0JCXJldHVybiBpbnN0YWxsVVJMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbGwgcGF0aCBvZiB0aGlzIHBsdWctaW4uCi0JICogCi0JICogQHBhcmFtIFRoZQotCSAqICAgICAgICAgICAgaW5zdGFsbCBwYXRoIG9mIHRoaXMgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluc3RhbGxQYXRoKCkgewotCQlyZXR1cm4gaW5zdGFsbFBhdGg7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgYW5kIHJldHVybnMgdGhlIGxvY2FsaXplZCBwcm9wZXJ0aWVzIG9mIGEgSmF2YSBwcm9wZXJ0aWVzIGZpbGUuCi0JICogPHA+Ci0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwcm9wZXJ0aWVzIGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGx1Zy1pbiByb290LgotCSAqIEByZXR1cm4gQSA8Y29kZT5Qcm9wZXJ0aWVzPC9jb2RlPiBvYmplY3QuCi0JICovCi0JcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcyhTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWlmIChwYXRoID09IG51bGwpIHsKLQkJCXJldHVybiBwcm9wczsKLQkJfQotCi0JCVN0cmluZyBmaWxlUGF0aCA9IGdldExvY2FsaXplZEZpbGUocGF0aCwgdHJ1ZSk7Ci0JCWlmIChmaWxlUGF0aCAhPSBudWxsKSB7Ci0JCQlwcm9wcy5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZVBhdGgpKTsKLQkJfQotCi0JCXJldHVybiBwcm9wczsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGxvY2FsZSBzcGVjaWZpYyBhYnNvbHV0ZSBmaWxlIHBhdGggbmFtZSBvZiB0aGUgZ2l2ZW4gZmlsZSBpbiB0aGUKLQkgKiBwbHVnaW4uCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwcm9wZXJ0aWVzIGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGx1Zy1pbiByb290LgotCSAqIEByZXR1cm4gU3RyaW5nIHRoZSBsb2NhbGUgc3BlY2lmaWMgYWJzb2x1dGUgZmlsZSBwYXRoIG5hbWUgb2YgdGhlIGdpdmVuCi0JICogICAgICAgICBmaWxlLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsaXplZEZpbGUoU3RyaW5nIHBhdGgsIGJvb2xlYW4gdXNlRGVmYXVsdCkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmaWxlUGF0aCA9IG51bGw7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IEZpbGVVdGlsLmdldEZpbGVOYW1lKHBhdGgpOwotCQlpbnQgaW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKGZpbGVOYW1lKTsKLQkJU3RyaW5nIHBhdGhOYW1lID0gcGF0aC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCi0JCUxvY2FsZSBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotCi0JCUJ1bmRsZSBidW5kbGUgPSBnZXRCdW5kbGUoKTsKLQkJQnVuZGxlW10gYnVuZGxlcyA9IFBsYXRmb3JtLmdldEZyYWdtZW50cyhidW5kbGUpOwotCQlpZiAoYnVuZGxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlVUkwgZW50cnkgPSBidW5kbGVzW2ldLmdldEVudHJ5KHBhdGhOYW1lKTsKLQkJCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJCQlVUkwgdXJsID0gRmlsZUxvY2F0b3IucmVzb2x2ZShlbnRyeSk7Ci0JCQkJCWZpbGVQYXRoID0gSTE4blV0aWwuZ2V0TG9jYWxpemVkRmlsZSh1cmwuZ2V0UGF0aCgpCi0JCQkJCQkJKyBmaWxlTmFtZSwgbG9jYWxlKTsgCi0JCQkJCWlmIChmaWxlUGF0aCAhPSBudWxsKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChmaWxlUGF0aCA9PSBudWxsKSB7Ci0JCQlVUkwgZW50cnkgPSBidW5kbGUuZ2V0RW50cnkocGF0aCk7Ci0JCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJCVVSTCB1cmwgPSBGaWxlTG9jYXRvci5yZXNvbHZlKGVudHJ5KTsKLQkJCQlmaWxlUGF0aCA9IEkxOG5VdGlsLmdldExvY2FsaXplZEZpbGUodXJsLmdldFBhdGgoKSwgbG9jYWxlKTsKLQkJCQlpZiAoZmlsZVBhdGggPT0gbnVsbCAmJiB1c2VEZWZhdWx0KSB7Ci0JCQkJCWZpbGVQYXRoID0gdXJsLmdldFBhdGgoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmlsZVBhdGg7Ci0JfQotCi0JLyoqCi0JICogZm9yIHRoZSBnaXZlbiBwYXRoIGluIHRoZSBwbHVnaW4sIGZpbmQgdGhlIGxvY2FsaXplZCBmaWxlcyBmb3JtIHRoZSBubAotCSAqIGZyYWdlbWVuZXRzIGFuZCBjb3B5IHRoZSBsb2NhbGl6ZWQgZmlsZXMgdG8gdGhlIGRlc3RpbmF0aW9uIGZvbGRlcgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBTdHJpbmcgYSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBwbHVnaW4gcm9vdC4gVGhlIGZpbGVzIGluIHRoaXMKLQkgKiAgICAgICAgICAgIGZvbGRlciB3aWxsIGJlIGl0ZXJhdGVkIGFuZCB0aGVpciBsb2NhbGl6ZWQgZmlsZXMgd2lsbCBiZQotCSAqICAgICAgICAgICAgY29waWVkIG92ZXIKLQkgKiBAcGFyYW0gdG9EaXIKLQkgKiAgICAgICAgICAgIEZJbGUgdGhlIGRlc3RpbmF0aW9uIGZvbGRlcgotCSAqIEBwYXJhbSByZWN1cnNpdmUKLQkgKiAgICAgICAgICAgIGJvb2xlYW4gcmVjdXJpdmVseSBsb29raW5nIGZvciBmaWxlcyBpbnQgdGhlIHNwZWNpZmllZCBmb2xkZXIKLQkgKiBAcGFyYW0gdXNlTG9jYWxlRmlsZU5hbWUKLQkgKiAgICAgICAgICAgIGJvb2xlYW4gaWYgdHJ1ZSB0aGUgbG9jYWxlIHNwZWNpZmljIGZpbGUgbmFtZXMgd2lsbCBiZSB1c2VkIGluCi0JICogICAgICAgICAgICB0aGUgY29waWVkIGRlc3RpbmF0aW9uLCBvdGhlcndpc2UsIHRoZSBsb2NhbGUgc3BlY2lmaWMgZmlsZQotCSAqICAgICAgICAgICAgbmFtZSB3aWxsIGJlIHJlbmFtZWQgdG8gdGhlIGRlZmF1bHQgb25lIGluIHRoZSBkZXN0aW5hdGlvbgotCSAqICAgICAgICAgICAgZm9sZGVyCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlMb2NhbGl6ZWRGaWxlcyhTdHJpbmcgcGF0aCwgRmlsZSB0b0RpciwgYm9vbGVhbiByZWN1cnNpdmUsCi0JCQlib29sZWFuIHVzZUxvY2FsZUZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IGdldEluc3RhbGxQYXRoKCk7Ci0JCVVSSSBwbHVnaW5VcmkgPSBuZXcgRmlsZShwbHVnaW5QYXRoKS50b1VSSSgpOwotCQlVUkkgcGF0aFVyaSA9IG5ldyBGaWxlKHBsdWdpblBhdGgsIHBhdGgpLnRvVVJJKCk7Ci0KLQkJTGlzdDxGaWxlPiBmaWxlcyA9IG5ldyBBcnJheUxpc3Q8RmlsZT4oKTsKLQkJRmlsZSBmID0gbmV3IEZpbGUocGx1Z2luUGF0aCwgcGF0aCk7Ci0JCUZpbGVVdGlsLmdldEFsbEZpbGVzKGYsIGZpbGVzLCByZWN1cnNpdmUpOwotCi0JCS8vIGZvciBlYWNoIGZpbGUgZm91bmQgaW4gdGhlIHNwZWNpZmllZCBmb2xkZXIsIGdldCB0aGUgbG9jYWxpemVkIGZpbGUKLQkJZm9yIChJdGVyYXRvciBpdCA9IGZpbGVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVVSSSBzcmNVcmkgPSAoKEZpbGUpIGl0Lm5leHQoKSkudG9VUkkoKTsKLQotCQkJLy8gZ2V0IHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBmaWxlIHRvIHRoZSBwbHVnaW4gcm9vdCwgdGhlbiBmaW5kCi0JCQkvLyB0aGUgbG9jYWxpemVkIGZpbGUKLQkJCVN0cmluZyByZWxQYXRoID0gcGx1Z2luVXJpLnJlbGF0aXZpemUoc3JjVXJpKS5nZXRQYXRoKCk7Ci0KLQkJCS8vIG9ubHkgZ2V0IHRoZSBsb2NhbGUgc3BlY2lmaWMgZmlsZSwgZG9uJ3QgaW5jbHVkZSB0aGUgZGVmYXVsdCBvbmUKLQkJCVN0cmluZyBsb2NhbGl6ZWRGaWxlID0gZ2V0TG9jYWxpemVkRmlsZShyZWxQYXRoLCBmYWxzZSk7Ci0JCQlpZiAobG9jYWxpemVkRmlsZSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8vIG5lZWQgdG8gY2hhbmdlIHRoZSB0YXJnZXQgZmlsZSBwYXRoIHRvIHJlbGF0aXZlIHRvIHRoZSBwYXRoCi0JCQkvLyBpbnN0ZWFkIG9mIHRoZSBwbHVnaW4gcm9vdAotCQkJcmVsUGF0aCA9IHBhdGhVcmkucmVsYXRpdml6ZShzcmNVcmkpLmdldFBhdGgoKTsKLQkJCUZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKGxvY2FsaXplZEZpbGUpOwotCQkJRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUodG9EaXIsIHJlbFBhdGgpOwotCQkJRmlsZSB0YXJnZXRQYXJlbnQgPSB0YXJnZXRGaWxlLmdldFBhcmVudEZpbGUoKTsKLQotCQkJLy8gY29weSB0aGUgZmlsZSB0byB0aGUgZGVzaXRpbmF0aW9uCi0JCQkvLyBpZiB1c2VMb2NhbGVGaWxlTmFtZSBpcyB0cnVlLCB0aGUgZGVzdGluYXRpb24gZmlsZSBuYW1lIHNob3VsZAotCQkJLy8gYWxzbyB1c2UgdGhlIGxvY2FsZSBzcGVjaWZpYyBmaWxlIG5hbWUKLQkJCWlmICh1c2VMb2NhbGVGaWxlTmFtZSkgewotCQkJCVN0cmluZyBmaWxlTmFtZSA9IHNyY0ZpbGUuZ2V0TmFtZSgpOwotCQkJCXRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXRQYXJlbnQsIGZpbGVOYW1lKTsKLQkJCX0KLQotCQkJaWYgKGlzRGVidWdnaW5nKCkpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvcHlpbmcgbG9jYWxpemVkIGZpbGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTb3VyY2U6ICIgKyBzcmNGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGFyZ2V0OiAiICsgdGFyZ2V0RmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJaWYgKCF0YXJnZXRQYXJlbnQuZXhpc3RzKCkpIHsKLQkJCQkJdGFyZ2V0UGFyZW50Lm1rZGlycygpOwotCQkJCX0KLQotCQkJCWlmICghdGFyZ2V0RmlsZS5leGlzdHMoKSkgewotCQkJCQl0YXJnZXRGaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCQl9Ci0KLQkJCQlGaWxlVXRpbC5jb3B5RmlsZShzcmNGaWxlLCB0YXJnZXRGaWxlKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlIGtleS4KLQkgKiBAcmV0dXJuIFRoZSBsb2NhbGl6ZWQgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiAnWycgKyBrZXkgKyAnXSc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZm9ybWF0dGVkIGxvY2FsaXplZCBtZXNzYWdlIGdpdmVuIHRoZSByZXNvdXJjZSBrZXkgYW5kIHRoZQotCSAqIG1lc3NhZ2UgYXJndW1lbnQuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gYXJndW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlIGFyZ3VtZW50LgotCSAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBsb2NhbGl6ZWQgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGZvcm1hdE1lc3NhZ2UoU3RyaW5nIGtleSwgT2JqZWN0IGFyZ3VtZW50KSB7Ci0JCWlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBtc2cgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJCQlPYmplY3RbXSBhcmd1bWVudHMgPSB7IGFyZ3VtZW50IH07Ci0JCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1zZywgYXJndW1lbnRzKTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICdbJyArIGtleSArICddJzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBVUkwgZ2l2ZW4gdGhlIHJlbGF0aXZlIHBhdGguCi0JICogCi0JICogQHBhcmFtIHJlbGF0aXZlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGltYWdlJ3MgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGx1Zy1pbidzIHJvb3QuCi0JICogQHJldHVybiBUaGUgaW1hZ2UgVVJMLgotCSAqLwotCXB1YmxpYyBVUkwgZ2V0SW1hZ2VVUkwoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwoaWNvblVSTCwgcmVsYXRpdmVQYXRoKTsKLQkJCXJldHVybiBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotLy8JLyoqCi0vLwkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGdpdmVuIHRoZSByZWxhdGl2ZSBwYXRoLgotLy8JICogCi0vLwkgKiBAcGFyYW0gcmVsYXRpdmVQYXRoCi0vLwkgKiAgICAgICAgICAgIFRoZSBpbWFnZSdzIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4ncyByb290LgotLy8JICogQHJldHVybiBUaGUgaW1hZ2UgZGVzY3JpcHRvci4KLS8vCSAqLwotLy8JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotLy8JCXRyeSB7Ci0vLwkJCVVSTCB1cmwgPSBuZXcgVVJMKGljb25VUkwsIHJlbGF0aXZlUGF0aCk7Ci0vLwkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotLy8JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotLy8JCX0KLS8vCX0KLS8vCi0vLwkvKioKLS8vCSAqIFJldHVybnMgdGhlIGltYWdlIGdpdmVuIHRoZSByZWxhdGl2ZSBwYXRoLgotLy8JICogPHA+Ci0vLwkgKiBOb3RlOiBUaGUgcmV0dXJuZWQgaW1hZ2UgbmVlZCB0byBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgotLy8JICogCi0vLwkgKiBAcGFyYW0gcmVsYXRpdmVQYXRoCi0vLwkgKiAgICAgICAgICAgIFRoZSBpbWFnZSdzIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4ncyByb290LgotLy8JICogQHJldHVybiBUaGUgaW1hZ2UuCi0vLwkgKi8KLS8vCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0vLwkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotLy8KLS8vCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKHJlbGF0aXZlUGF0aCk7Ci0vLwkJaWYgKGltYWdlRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0vLwkJCWltYWdlID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKGZhbHNlKTsKLS8vCQl9Ci0vLwotLy8JCXJldHVybiBpbWFnZTsKLS8vCX0KLS8vCi0vLwkvKioKLS8vCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbWFnZSBnaXZlbiB0aGUgcmVsYXRpdmUgcGF0aC4KLS8vCSAqIDxwPgotLy8JICogTm90ZTogVGhlIHJldHVybmVkIGltYWdlIHdpbGwgYmUgYXV0b21hdGljYWxseSBmcmVlZCB3aGVuIHRoZSBwbHVnLWluCi0vLwkgKiBzaHV0cyBkb3duLgotLy8JICogCi0vLwkgKiBAcGFyYW0gcmVsYXRpdmVQYXRoCi0vLwkgKiAgICAgICAgICAgIFRoZSBpbWFnZSdzIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4ncyByb290LgotLy8JICogQHJldHVybiBUaGUgaW1hZ2UuCi0vLwkgKi8KLS8vCXB1YmxpYyBJbWFnZSBnZXRTaGFyZWRJbWFnZShTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0vLwkJSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIHNoYXJlZEltYWdlcy5nZXQocmVsYXRpdmVQYXRoKTsKLS8vCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotLy8JCQlyZXR1cm4gaW1hZ2U7Ci0vLwkJfQotLy8KLS8vCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKHJlbGF0aXZlUGF0aCk7Ci0vLwkJaWYgKGltYWdlRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0vLwkJCWltYWdlID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKGZhbHNlKTsKLS8vCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLS8vCQkJCXNoYXJlZEltYWdlcy5wdXQocmVsYXRpdmVQYXRoLCBpbWFnZSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCXJldHVybiBpbWFnZTsKLS8vCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb2ZpbGluZyBmbGFnLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcHJvZmlsaW5nIGlzIGVuYWJsZWQgZm9yIHRoaXMgcGx1LWluCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9maWxpbmcoKSB7Ci0JCXJldHVybiBwcm9maWxpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9nZ2VyIGdpdmVuIHRoZSBwbHVnLWluIElELgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG5ldyBvciBjYWNoZWQgbG9nZ2VyLgotCSAqLwotCXB1YmxpYyBMb2dnZXIgZ2V0TG9nZ2VyKCkgewotCQlMb2dnZXIgbG9nZ2VyID0gKExvZ2dlcikgbG9nZ2Vycy5nZXQocGx1Z2luSWQpOwotCQlpZiAobG9nZ2VyID09IG51bGwpIHsKLQkJCWxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcyk7Ci0JCQlsb2dnZXJzLnB1dChwbHVnaW5JZCwgbG9nZ2VyKTsKLQkJfQotCQlyZXR1cm4gbG9nZ2VyOwotCX0KLQkJCi0JLyoqCi0JICogTG9ncyB0aGUgZ2l2ZW4gb2JqZWN0IG9yIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgbG9nKE9iamVjdCBsb2dFbnRyeSkgewotCQlpZiAobG9nRW50cnkgaW5zdGFuY2VvZiBUaHJvd2FibGUpIHsKLQkJCSgoVGhyb3dhYmxlKSBsb2dFbnRyeSkucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGxvZ0VudHJ5KTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5zdG9yZVdyYXBwZXI7Ci0JfQotCQotCQotCXB1YmxpYyBPYmplY3QgZ2V0Q29udGV4dCgpIHsKLQkJaWYgKCBDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmNvbnRleHRQcm92aWRlciAhPSBudWxsICkgewotCQkJcmV0dXJuIENvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuY29udGV4dFByb3ZpZGVyLmdldENvbnRleHQoKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBJTWVzc2FnZUNhbGxiYWNrIGdldE1zZ0NhbGxiYWNrKCkgewotCQlyZXR1cm4gQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5tc2dDYWxsYmFjazsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL0NvbW1vblBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9Db21tb25QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA0MGQ4Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL0NvbW1vblBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIENvbW1vbiBwbHVnLWluIGFjdGl2YXRvci4KLSAqLwotcHVibGljIGNsYXNzIENvbW1vblBsdWdpbiBleHRlbmRzIEFic3RyYWN0QWN0aXZhdG9yIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBDb21tb25QbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29tbW9uUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21tb25QbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLS8vCS8qKgotLy8JICogc2V0IHRoZSBzdG9yZSB3cmFwcGVyIGJlZm9yZSBpdCdzIGJlaW5nIHVzZWQuCi0vLwkgKiBAcGFyYW0gc3RvcmVXcmFwcGVyCi0vLwkgKi8KLQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBzdG9yZVdyYXBwZXIgPSBudWxsOwotCXB1YmxpYyB2b2lkIHNldFByZWZlcmVuY2VTdG9yZShJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBzdG9yZVdyYXBwZXIpIHsKLQkJdGhpcy5zdG9yZVdyYXBwZXIgPSBzdG9yZVdyYXBwZXI7Ci0JfQotCQotCS8vIHRoaXMgaXMgdGhlIGNvbnRleHQgZm9yIG1lc3NhZ2UgY2FsbGJhY2sKLQkvLyBmb3IgZWNsaXBzZSBjbGllbnQsIHRoaXMgaXMgdGhlIFNoZWxsIG9iamVjdAotCUlDb250ZXh0UHJvdmlkZXIgY29udGV4dFByb3ZpZGVyID0gbnVsbDsKLQotCXB1YmxpYyB2b2lkIHNldENvbnRleHRQcm92aWRlcihJQ29udGV4dFByb3ZpZGVyIGNvbnRleHRQcm92aWRlcikgewotCQl0aGlzLmNvbnRleHRQcm92aWRlciA9IGNvbnRleHRQcm92aWRlcjsKLQl9Ci0KLQlJTWVzc2FnZUNhbGxiYWNrIG1zZ0NhbGxiYWNrID0gbnVsbDsKLQlwdWJsaWMgdm9pZCBzZXRNc2dDYWxsYmFjayhJTWVzc2FnZUNhbGxiYWNrIG1zZ0NhbGxiYWNrKSB7Ci0JCXRoaXMubXNnQ2FsbGJhY2sgPSBtc2dDYWxsYmFjazsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9JQWN0aXZhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL0lBY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ4NDRmNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL0lBY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWN0aXZhdG9yIHsKLQlTdHJpbmcgZ2V0SWQoKTsKLQlMb2dnZXIgZ2V0TG9nZ2VyKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL0lDb250ZXh0UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vSUNvbnRleHRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTk3YTJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vSUNvbnRleHRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRleHRQcm92aWRlciB7Ci0JcHVibGljIE9iamVjdCBnZXRDb250ZXh0KCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL0lNZXNzYWdlQ2FsbGJhY2suamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vSU1lc3NhZ2VDYWxsYmFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODA3ZGQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vSU1lc3NhZ2VDYWxsYmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSU1lc3NhZ2VDYWxsYmFjayB7Ci0KLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhBYnN0cmFjdEFjdGl2YXRvciBwbHVnaW4sIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbik7Ci0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoQWJzdHJhY3RBY3RpdmF0b3IgcGx1Z2luLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLCBUaHJvd2FibGUgZXgpOwotCXB1YmxpYyB2b2lkIGRpc3BsYXlXYXJuaW5nKEFic3RyYWN0QWN0aXZhdG9yIHBsdWdpbiwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGRldGFpbHMsIFRocm93YWJsZSBleCk7Ci0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoQWJzdHJhY3RBY3RpdmF0b3IgcGx1Z2luLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sIFN0cmluZyBkZXRhaWxzLCBUaHJvd2FibGUgZXgpOwotCQotCXB1YmxpYyB2b2lkIGRpc3BsYXlFcnJvcihBYnN0cmFjdEFjdGl2YXRvciBwbHVnaW4sIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZyk7Ci0JcHVibGljIHZvaWQgZGlzcGxheUVycm9yKEFic3RyYWN0QWN0aXZhdG9yIHBsdWdpbiwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBUaHJvd2FibGUgZXgpOwotCXB1YmxpYyB2b2lkIGRpc3BsYXlFcnJvcihBYnN0cmFjdEFjdGl2YXRvciBwbHVnaW4sIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGRldGFpbHMsIFRocm93YWJsZSBleCk7Ci0JCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vaHRtbC9IVE1MRm9ybWF0dGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL2h0bWwvSFRNTEZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjg3NWNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vaHRtbC9IVE1MRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5odG1sOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcudzNjLnRpZHkuVGlkeTsKLQotLyoqCi0gKiBQcmV0dHktZm9ybWF0cyBIVE1MIHNvdXJjZSBhbmQgbWFrZXMgaXQgWEhUTUwgY29tcGxpYW50LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEhUTUxGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfQk9EWV9TVEFSVF9UQUcgPSAiPGJvZHkiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9CT0RZX0VORF9UQUcgPSAiPC9ib2R5PiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIVE1MX0JPRFlfU1RBUlRfVEFHX0xFTkdUSCA9IEhUTUxfQk9EWV9TVEFSVF9UQUcKLQkJCS5sZW5ndGgoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUdOT1NUSUNfU09VUkNFID0gIm9yZy5lY2xpcHNlLmVwZi5jb21tb24uSFRNTEZvcm1hdHRlciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgaW50IGxpbmVXaWR0aDsKLQotCXByaXZhdGUgYm9vbGVhbiBpbmRlbnQ7Ci0KLQlwcml2YXRlIGludCBpbmRlbnRTaXplOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGFzdEVycm9yU3RyOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF93aGl0ZXNwYWNlID0gUGF0dGVybi5jb21waWxlKCJeXFxzKyIsIFBhdHRlcm4uTVVMVElMSU5FKTsKLQotCS8qCi0JICogU3RyaW5nIGxvY2F0aW9uID0gbS5ncm91cCgxKTsKLQkgKiBTdHJpbmcgbGluZVN0ciA9IG0uZ3JvdXAoMik7Ci0JICogU3RyaW5nIGNvbHVtblN0ciA9IG0uZ3JvdXAoMyk7Ci0JICogU3RyaW5nIGVycm9yTXNnID0gbS5ncm91cCg0KTsKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4galRpZHlFcnJvclBhcnNlciA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiKGxpbmVcXHMrKFxcZCspXFxzK2NvbHVtblxccysoXFxkKykpXFxzKy1cXHMrKC4rKSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEhUTUxGb3JtYXR0ZXIoKSB7Ci0JCXRoaXMoMTMyLCB0cnVlLCA0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBIVE1MRm9ybWF0dGVyKGludCBsaW5lV2lkdGgsIGJvb2xlYW4gaW5kZW50LCBpbnQgaW5kZW50U2l6ZSkgewotCQl0aGlzLmxpbmVXaWR0aCA9IGxpbmVXaWR0aDsKLQkJdGhpcy5pbmRlbnQgPSBpbmRlbnQ7Ci0JCXRoaXMuaW5kZW50U2l6ZSA9IGluZGVudFNpemU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWF4aW11bSBjaGFyYWN0ZXIgd2lkdGggb2YgYSBsaW5lLgotCSAqIAotCSAqIEBwYXJhbSBsaW5lV2lkdGgKLQkgKiAgICAgICAgICAgIFRoZSBsaW5lIHdpZHRoIChpbiBudW1iZXIgb2YgY2hhcmFjdGVycykuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGluZVdpZHRoKGludCBsaW5lV2lkdGgpIHsKLQkJdGhpcy5saW5lV2lkdGggPSBsaW5lV2lkdGg7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlcyBvciBkaXNhYmxlcyB0YWdzIGluZGVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZW50Ci0JICogICAgICAgICAgICBJZiB0cnVlLCBpZGVudCB0aGUgdGFncy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmRlbnQoYm9vbGVhbiBpbmRlbnQpIHsKLQkJdGhpcy5pbmRlbnQgPSBpbmRlbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5kZW50IHNpemUuCi0JICogCi0JICogQHBhcmFtIGluZGVudFNpemUKLQkgKiAgICAgICAgICAgIFRoZSBpbmRlbnQgc2l6ZSAoaW4gbnVtYmVyIG9mIGNoYXJhY3RlcnMpLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluZGVudFNpemUoaW50IGluZGVudFNpemUpIHsKLQkJdGhpcy5pbmRlbnRTaXplID0gaW5kZW50U2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXRzIHRoZSBnaXZlbiBIVE1MIHNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gaHRtbAotCSAqICAgICAgICAgICAgVGhlIEhUTUwgc291cmNlLgotCSAqIEByZXR1cm4gVGhlIHByZXR0eS1mb3JtYXR0ZWQgSFRNTCBzb3VyY2UuCi0JICovCi0JcHVibGljIFN0cmluZyBmb3JtYXRIVE1MKFN0cmluZyBodG1sKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBmb3JtYXRIVE1MKGh0bWwsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXRzIHRoZSBnaXZlbiBIVE1MIHNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gaHRtbCBUaGUgSFRNTCBzb3VyY2UuCi0JICogQHBhcmFtIHJldHVybkJvZHlPbmx5IGlmIGZhbHNlLCByZXR1cm4gZnVsbCBIVE1MIGRvY3VtZW50IG9yIGJvZHkgY29udGVudCBiYXNlZCBvbiB3aGF0IGlzIHBhc3NlZCBpbi4gIGlmIHRydWUsIGFsd2F5cyByZXR1cm4gYm9keSBjb250ZW50IG9ubHkKLQkgKiBAcGFyYW0gZm9yY2VPdXRwdXQgaWYgdHJ1ZSwgcmV0dXJuIGNsZWFuZWQgSFRNTCBldmVuIGlmIGVycm9ycy4gaWYgZmFsc2UsIHdpbGwgY2xlYW4gbWlub3IgcHJvYmxlbXMgYW5kIHJldHVybiBjbGVhbiBIVE1MLCBidXQgb24gYSBtYWpvciBlcnJvciwgd2lsbCBzZXQgZ2V0TGFzdEVycm9yU3RyKCkgYW5kIHJldHVybiBwYXNzZWQtaW4gaHRtbAotCSAqIEBwYXJhbSBtYWtlQmFyZSBzZXQgdG8gdHJ1ZSBmb3IgY2xlYW5pbmcgTVMgSFRNTAotCSAqIEBwYXJhbSB3b3JkMjAwMCBzZXQgdG8gdHJ1ZSBmb3IgY2xlYW5pbmcgTVMgV29yZCAyMDAwIEhUTUwgCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZm9ybWF0SFRNTChTdHJpbmcgaHRtbCwgYm9vbGVhbiByZXR1cm5Cb2R5T25seSwgYm9vbGVhbiBmb3JjZU91dHB1dCwgYm9vbGVhbiBtYWtlQmFyZSwgYm9vbGVhbiB3b3JkMjAwMCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotCQlsYXN0RXJyb3JTdHIgPSBudWxsOwotCQlpZiAoaHRtbCA9PSBudWxsIHx8IGh0bWwubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGh0bWw7Ci0JCX0KLQkJCi0JCWh0bWwgPSByZW1vdmVMZWFkaW5nV2hpdGVzcGFjZShodG1sKTsKLQotCQlUaWR5IHRpZHkgPSBuZXcgVGlkeSgpOwotCQl0aWR5LnNldFhIVE1MKHRydWUpOwotCQl0aWR5LnNldERyb3BFbXB0eVBhcmFzKGZhbHNlKTsKLQkJdGlkeS5zZXREcm9wRm9udFRhZ3MoZmFsc2UpOwotCQl0aWR5LnNldFF1aWV0KHRydWUpOwotCQl0aWR5LnNldFNob3dXYXJuaW5ncyhmYWxzZSk7Ci0JCXRpZHkuc2V0U21hcnRJbmRlbnQoZmFsc2UpOwotCQl0aWR5LnNldFRpZHlNYXJrKGZhbHNlKTsKLQkJdGlkeS5zZXRXcmFwbGVuKGxpbmVXaWR0aCk7Ci0JCXRpZHkuc2V0SW5kZW50QXR0cmlidXRlcyhmYWxzZSk7Ci0JCXRpZHkuc2V0SW5kZW50Q29udGVudChpbmRlbnQpOwotCQl0aWR5LnNldFNwYWNlcyhpbmRlbnRTaXplKTsKLQkJdGlkeS5zZXRJbnB1dEVuY29kaW5nKCJVVEYtMTYiKTsgLy8kTk9OLU5MUy0xJAotCQl0aWR5LnNldE91dHB1dEVuY29kaW5nKCJVVEYtMTYiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyB0aGlzIHdpbGwgYWRkIDxwPiBhcm91bmQgZWFjaCB0ZXh0IGJsb2NrICg/dGhhdCBpc24ndCBpbiBhIGJsb2NrIGFscmVhZHk/KQotLy8JCXRpZHkuc2V0RW5jbG9zZUJsb2NrVGV4dCh0cnVlKTsKLQkJLy8gc2V0dGluZyB0aGlzIHNlZW1lZCB0byBwcmV2ZW50IEpUaWR5IGZyb20gaW5kZW50aW5nIHRoZSBzb3VyY2UKLS8vCQl0aWR5LnNldFByaW50Qm9keU9ubHkodHJ1ZSk7Ci0JCQotCQlpZiAoZm9yY2VPdXRwdXQpIHsKLQkJCS8vIG91dHB1dCBkb2N1bWVudCBldmVuIGlmIGVycm9ycyBhcmUgcHJlc2VudAotCQkJdGlkeS5zZXRGb3JjZU91dHB1dCh0cnVlKTsKLQkJfQotCQlpZiAobWFrZUJhcmUpIHsKLQkJCS8vIHJlbW92ZSBNUyBjbHV0dGVyCi0JCQl0aWR5LnNldE1ha2VCYXJlKHRydWUpOwotCQl9Ci0JCWlmICh3b3JkMjAwMCkgewotCQkJLy8gZHJhY29uaWFuIFdvcmQyMDAwIGNsZWFuaW5nCi0JCQl0aWR5LnNldFdvcmQyMDAwKHRydWUpOwotCQl9Ci0KLQkJUmVhZGVyIGlucHV0ID0gbmV3IFN0cmluZ1JlYWRlcihodG1sKTsKLQkJV3JpdGVyIG91dHB1dCA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQotCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQkJdGlkeS5zZXRFcnJvdXQocHcpOwotCQl0aWR5LnBhcnNlKGlucHV0LCBvdXRwdXQpOwotCQlTdHJpbmcgZXJyb3IgPSBzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotCQlpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5sZW5ndGgoKSA+IDAKLQkJCQkmJiBlcnJvci5zdGFydHNXaXRoKCJsaW5lIikgJiYgZXJyb3IuaW5kZXhPZigiY29sdW1uIikgPiAwKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbGFzdEVycm9yU3RyID0gZXJyb3I7Ci0JCQlpZiAoIWZvcmNlT3V0cHV0KSB7Ci0JCQkJLy8gaWYgZm9yY2VPdXRwdXQgaXMgdHJ1ZSwgSlRpZHkgd2lsbCByZXR1cm4gY2xlYW4gSFRNTCBzbyBkb24ndCByZXR1cm4gaGVyZQotCQkJCXJldHVybiBodG1sOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGZvcm1hdHRlZEhUTUwgPSBvdXRwdXQudG9TdHJpbmcoKTsKLQkJZm9ybWF0dGVkSFRNTCA9IFN0clV0aWwuZ2V0RXNjYXBlZEhUTUwoZm9ybWF0dGVkSFRNTCk7Ci0JCQotCQlTdHJpbmcgaHRtbFN0YXJ0VXBwZXIgPSBodG1sLnN1YnN0cmluZygwLCBNYXRoLm1pbigxMCwgaHRtbC5sZW5ndGgoKSkpLnRvVXBwZXJDYXNlKCk7Ci0KLQkJaWYgKHJldHVybkJvZHlPbmx5IHx8ICghaHRtbFN0YXJ0VXBwZXIuc3RhcnRzV2l0aCgiPCFET0NUWVBFIikgJiYgIWh0bWxTdGFydFVwcGVyLnN0YXJ0c1dpdGgoIjxIVE1MIikpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaW50IHN0YXJ0Qm9keVRhZyA9IGZvcm1hdHRlZEhUTUwuaW5kZXhPZihIVE1MX0JPRFlfU1RBUlRfVEFHKTsKLQkJCWludCBzdGFydCA9IC0xOwotCQkJaWYgKHN0YXJ0Qm9keVRhZyAhPSAtMSkgewotCQkJCXN0YXJ0ID0gZm9ybWF0dGVkSFRNTC5pbmRleE9mKCI+IixzdGFydEJvZHlUYWcpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgZW5kID0gZm9ybWF0dGVkSFRNTC5pbmRleE9mKEhUTUxfQk9EWV9FTkRfVEFHKTsKLQkJCWlmIChzdGFydCA9PSAtMSB8fCBlbmQgPT0gLTEpIHsKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXN0YXJ0ICs9IDE7Ci0JCQlpZiAoc3RhcnQgPj0gZW5kKSB7Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzdGFydCArPSBGaWxlVXRpbC5MSU5FX1NFUF9MRU5HVEg7Ci0JCQllbmQgLT0gRmlsZVV0aWwuTElORV9TRVBfTEVOR1RIOwotCQkJaWYgKGluZGVudCAmJiBpbmRlbnRTaXplID4gMCkgewotCQkJCWVuZCAtPSBpbmRlbnRTaXplOwotCQkJfQotCQkJaWYgKHN0YXJ0ID49IGVuZCkgewotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJU3RyaW5nIHJlc3VsdCA9IGZvcm1hdHRlZEhUTUwuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotCQkJaWYgKGluZGVudCAmJiBpbmRlbnRTaXplID4gMCkgewotCQkJCVN0cmluZyBpbmRlbnRTdHIgPSBnZXRJbmRlbnRTdHIoaW5kZW50U2l6ZSAqIDIpOwotCQkJCXJlc3VsdCA9IGZpeEluZGVudGF0aW9uKHJlc3VsdCwgaW5kZW50U3RyKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBmb3JtYXR0ZWRIVE1MOwotCX0KLQkJCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5kZW50IHN0cmluZy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SW5kZW50U3RyKGludCBpbmRlbnRMZW5ndGgpIHsKLQkJaWYgKGluZGVudExlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmdCdWZmZXIgaW5kZW50U3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudExlbmd0aDsgaSsrKSB7Ci0JCQlpbmRlbnRTdHIuYXBwZW5kKCcgJyk7Ci0JCX0KLQkJcmV0dXJuIGluZGVudFN0ci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRV9UQUdfU1RBUlQgPSAiPHByZT4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVfVEFHX0VORCA9ICI8L3ByZT4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVfVEFHX0VORF9MRU5HVEggPSBQUkVfVEFHX0VORC5sZW5ndGgoKTsKLQotCS8qKgotCSAqIFVuZG8gdGhlIEpUaWR5IGluZGVudCwgYnV0IGlnbm9yZSAmbHQ7cHJlJmd0OyB0YWdzCi0JICogCi0JICogQHBhcmFtIGh0bWwKLQkgKiBAcGFyYW0gaW5kZW50U3RyCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmaXhJbmRlbnRhdGlvbihTdHJpbmcgaHRtbCwgU3RyaW5nIGluZGVudFN0cikgewotCQlpZiAoaHRtbC5zdGFydHNXaXRoKGluZGVudFN0cikpIHsKLQkJCWh0bWwgPSBodG1sLnN1YnN0cmluZyhpbmRlbnRTdHIubGVuZ3RoKCkpOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBwcmVfaW5kZXggPSAtMTsKLQkJaW50IGxhc3RfcHJlX2VuZF9pbmRleCA9IC0xOwotCQl3aGlsZSAoKHByZV9pbmRleCA9IGh0bWwuaW5kZXhPZihQUkVfVEFHX1NUQVJULCBsYXN0X3ByZV9lbmRfaW5kZXgpKSAhPSAtMSkgewotCQkJc3RyQnVmLmFwcGVuZChodG1sLnN1YnN0cmluZygKLQkJCQkJbGFzdF9wcmVfZW5kX2luZGV4IDwgMCA/IDAgOiBsYXN0X3ByZV9lbmRfaW5kZXgKLQkJCQkJCQkrIFBSRV9UQUdfRU5EX0xFTkdUSCwgcHJlX2luZGV4KS5yZXBsYWNlQWxsKAotCQkJCQkiXHJcbiIgKyBpbmRlbnRTdHIsICJcclxuIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWxhc3RfcHJlX2VuZF9pbmRleCA9IGh0bWwuaW5kZXhPZihQUkVfVEFHX0VORCwgcHJlX2luZGV4KTsKLQkJCWlmIChsYXN0X3ByZV9lbmRfaW5kZXggIT0gLTEpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKGh0bWwuc3Vic3RyaW5nKHByZV9pbmRleCwgbGFzdF9wcmVfZW5kX2luZGV4Ci0JCQkJCQkrIFBSRV9UQUdfRU5EX0xFTkdUSCkpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBmb3VuZCA8cHJlPiwgYnV0IG5vIGVuZGluZyA8L3ByZT4gLSBzaG91bGRuJ3QgZXZlciBnZXQgaGVyZQotCQkJCS8vIGFwcGVuZCByZXN0IG9mIHN0cmluZyBhbmQgcmV0dXJuIGl0Ci0JCQkJc3RyQnVmLmFwcGVuZChodG1sLnN1YnN0cmluZyhwcmVfaW5kZXgpKTsKLQkJCQlyZXR1cm4gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJc3RyQnVmLmFwcGVuZChodG1sLnN1YnN0cmluZygKLQkJCQlsYXN0X3ByZV9lbmRfaW5kZXggPCAwID8gMCA6IGxhc3RfcHJlX2VuZF9pbmRleAotCQkJCQkJKyBQUkVfVEFHX0VORF9MRU5HVEgpLnJlcGxhY2VBbGwoIlxyXG4iICsgaW5kZW50U3RyLCAvLyROT04tTkxTLTEkCi0JCQkJIlxyXG4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdEVycm9yU3RyKCkgewotCQlyZXR1cm4gbGFzdEVycm9yU3RyOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVMZWFkaW5nV2hpdGVzcGFjZShTdHJpbmcgaW5wdXQpIHsKLQkJcmV0dXJuIHBfd2hpdGVzcGFjZS5tYXRjaGVyKGlucHV0KS5yZXBsYWNlQWxsKCIiKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL2h0bWwvSFRNTFBhcnNlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9odG1sL0hUTUxQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3MjQ4OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL2h0bWwvSFRNTFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uaHRtbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLnRpZHkuVGlkeTsKLQotLyoqCi0gKiBFeHRyYWN0cyB0aGUgdGl0bGUsIG1ldGEgdGFncyBhbmQgdGV4dCBmcm9tIGEgSFRNTCBmaWxlIG9yIHNvdXJjZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MUGFyc2VyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDQwOTY7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9TQ1JJUFRfVEFHID0gInNjcmlwdCI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9USVRMRV9UQUcgPSAidGl0bGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9NRVRBX1RBRyA9ICJtZXRhIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUaWR5IHRpZHk7Ci0KLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotCXByaXZhdGUgU3RyaW5nIHN1bW1hcnk7Ci0KLQlwcml2YXRlIFN0cmluZyB0ZXh0OwotCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIG1ldGFUYWdzOwotCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgaHRtbFRleHQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBIVE1MUGFyc2VyKCkgewotCQl0cnkgewotCQkJdGlkeSA9IG5ldyBUaWR5KCk7Ci0JCQl0aWR5LnNldFhIVE1MKHRydWUpOwotCQkJdGlkeS5zZXREcm9wRW1wdHlQYXJhcyh0cnVlKTsKLQkJCXRpZHkuc2V0RHJvcEZvbnRUYWdzKHRydWUpOwotCQkJdGlkeS5zZXRRdWlldCh0cnVlKTsKLQkJCXRpZHkuc2V0U2hvd1dhcm5pbmdzKGZhbHNlKTsKLQkJCXRpZHkuc2V0U21hcnRJbmRlbnQoZmFsc2UpOwotCQkJdGlkeS5zZXRUaWR5TWFyayhmYWxzZSk7Ci0JCQl0aWR5LnNldFdyYXBsZW4oMTMyKTsKLQkJCXRpZHkuc2V0SW5kZW50QXR0cmlidXRlcyhmYWxzZSk7Ci0JCQl0aWR5LnNldEluZGVudENvbnRlbnQoZmFsc2UpOwotCQkJdGlkeS5zZXRTcGFjZXMoMik7Ci0JCQl0aWR5LnNldElucHV0RW5jb2RpbmcoIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXRpZHkuc2V0T3V0cHV0RW5jb2RpbmcoIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRpZHkgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIHRoZSBnaXZlbiBIVE1MIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgcGFyc2UoRmlsZSBmaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHRpZHkgPT0gbnVsbCB8fCAhZmlsZS5leGlzdHMoKSB8fCAhZmlsZS5jYW5SZWFkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQlJbnB1dFN0cmVhbVJlYWRlciBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZmlzLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQlCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpc3IpOwotCi0JCVN0cmluZ0J1ZmZlciB0ZXh0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihCVUZGRVJfU0laRSk7Ci0JCWNoYXJbXSBidWZmZXIgPSBuZXcgY2hhcltCVUZGRVJfU0laRV07Ci0JCWludCBjaGFyc1JlYWQ7Ci0JCXdoaWxlICgoY2hhcnNSZWFkID0gYnIucmVhZChidWZmZXIsIDAsIEJVRkZFUl9TSVpFKSkgPiAwKSB7Ci0JCQl0ZXh0QnVmZmVyLmFwcGVuZChidWZmZXIsIDAsIGNoYXJzUmVhZCk7Ci0JCX0KLQotCQlwYXJzZSh0ZXh0QnVmZmVyLnRvU3RyaW5nKCkpOwotCi0JCWlmIChiciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWJyLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIGdpdmVuIEhUTUwgc291cmNlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBhcnNlKFN0cmluZyBodG1sU291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGl0bGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlzdW1tYXJ5ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCW1ldGFUYWdzID0gbmV3IFByb3BlcnRpZXMoKTsKLQotCQlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudChodG1sU291cmNlKTsKLQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQlodG1sVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoMTAyNCk7Ci0JCQlleHRyYWN0KGRvYy5nZXRDaGlsZE5vZGVzKCkpOwotCQkJdGV4dCA9IGh0bWxUZXh0LnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0aXRsZSB0ZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiB0aXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBIVE1MIG1ldGEgdGFncy4KLQkgKi8KLQlwdWJsaWMgUHJvcGVydGllcyBnZXRNZXRhVGFncygpIHsKLQkJcmV0dXJuIG1ldGFUYWdzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN1bW1hcnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdW1tYXJ5KCkgewotCQlyZXR1cm4gc3VtbWFyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBib2R5IHRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBET00gZG9jdW1lbnQgZm9yIHRoZSBnaXZlbiBIVE1MIHNvdXJjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoU3RyaW5nIGh0bWwpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoaHRtbCA9PSBudWxsIHx8IGh0bWwubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShodG1sCi0JCQkJLmdldEJ5dGVzKCJVVEYtOCIpKTsgLy8kTk9OLU5MUy0xJAkKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQkJdGlkeS5zZXRFcnJvdXQocHcpOwotCi0JCXJldHVybiB0aWR5LnBhcnNlRE9NKGlucHV0LCBvdXRwdXQpOwotCX0KLQotCS8qKgotCSAqIEV4dHJhY3RzIHRoZSB0aXRsZSwgbWV0YSB0YWdzIGFuZCBib2R5IHRleHQgZnJvbSB0aGUgZ2l2ZW4gbm9kZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXh0cmFjdChOb2RlTGlzdCBub2RlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgbm9kZU5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKLQkJCQlpZiAoIW5vZGVOYW1lLmVxdWFscyhIVE1MX1NDUklQVF9UQUcpKSB7Ci0JCQkJCU5hbWVkTm9kZU1hcCBhdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGF0dHJzLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJCU5vZGUgYXR0ck5vZGUgPSBhdHRycy5pdGVtKGopOwotCQkJCQkJU3RyaW5nIGF0dHJOb2RlTmFtZSA9IGF0dHJOb2RlLmdldE5vZGVOYW1lKCk7Ci0JCQkJCQlTdHJpbmcgYXR0ck5vZGVWYWx1ZSA9IGF0dHJOb2RlLmdldE5vZGVWYWx1ZSgpOwotCQkJCQkJaWYgKGF0dHJOb2RlTmFtZS5lcXVhbHMoSFRNTF9USVRMRV9UQUcpKSB7Ci0JCQkJCQkJdGl0bGUgPSBhdHRyTm9kZVZhbHVlOwotCQkJCQkJfSBlbHNlIGlmIChhdHRyTm9kZU5hbWUuZXF1YWxzKEhUTUxfTUVUQV9UQUcpKSB7Ci0JCQkJCQkJbWV0YVRhZ3MucHV0KGF0dHJOb2RlTmFtZSwgYXR0ck5vZGVWYWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJCQlpZiAoY2hpbGROb2RlcyAhPSBudWxsICYmIGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlleHRyYWN0KGNoaWxkTm9kZXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERToKLQkJCQlodG1sVGV4dC5hcHBlbmQobm9kZS5nZXROb2RlVmFsdWUoKSkuYXBwZW5kKCcgJyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vaHRtbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL2h0bWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzUyYmJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vaHRtbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBjb21tb24gSFRNTCBwYXJzaW5nIGFuZCBwcmV0dHktZm9ybWF0aW5nIHNlcnZpY2VzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZjg5M2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgYWN0aXZhdG9yIGZvciBtYW5hZ2luZyB0aGUgQ29tbW9uIHBsdWctaW4ncyBsaWZlIGN5Y2xlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vcGx1Z2luL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vcGx1Z2luL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxMjI2OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3BsdWdpbi9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBjb21tb24gc2VydmljZXMgZm9yIGFjY2Vzc2luZyBhIHBsdWctaW4ncyBpbnN0YWxsIHBhdGgsIGltYWdlcywgbG9nZ2VyIGFuZCByZXNvdXJjZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wcmVmZXJlbmNlcy9JUHJlZmVyZW5jZVN0b3JlV3JhcHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wcmVmZXJlbmNlcy9JUHJlZmVyZW5jZVN0b3JlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGYxODk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vcHJlZmVyZW5jZXMvSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXM7Ci0KLQotLyoqCi0gKiB3cmFwcGVyIGludGVyZmFjZSBmb3IgcHJlZmVyZW5jZSBzdG9yZQotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciB7Ci0KLQkvL3B1YmxpYyBPYmplY3QgZ2V0U3RvcmUoKTsKLQkKLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlciBsaXN0ZW5lcik7Ci0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoU3RyaW5nIG5hbWUsIE9iamVjdCBvbGRWYWx1ZSwKLQkgICAgICAgICAgICBPYmplY3QgbmV3VmFsdWUpOwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyIGxpc3RlbmVyKTsKLQotCS8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGJvb2xlYW4tdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+ZmFsc2U8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGN1cnJlbnQgdmFsdWUgCi0gICAgICogY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBib29sZWFuLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBib29sZWFuLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYm9vbGVhbi12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT5mYWxzZTwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gZGVmYXVsdCBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBkZWZhdWx0IAotICAgICAqIHZhbHVlIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgYm9vbGVhbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldERlZmF1bHRCb29sZWFuKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBkb3VibGUtdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MC4wPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBkZWZhdWx0IHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGRlZmF1bHQgCi0gICAgICogdmFsdWUgY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBkb3VibGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG5hbWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZG91YmxlIGdldERlZmF1bHREb3VibGUoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGZsb2F0LXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPjAuMGY8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIGRlZmF1bHQgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgZGVmYXVsdCAKLSAgICAgKiB2YWx1ZSBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIGZsb2F0LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBuYW1lZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGZsb2F0IGdldERlZmF1bHRGbG9hdChTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgaW50ZWdlci12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBkZWZhdWx0IHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGRlZmF1bHQgCi0gICAgICogdmFsdWUgY2Fubm90IGJlIHRyZWF0ZWQgYXMgYW4gaW50ZWdlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdEludChTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgbG9uZy12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wTDwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gZGVmYXVsdCBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBkZWZhdWx0IAotICAgICAqIHZhbHVlIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgbG9uZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldERlZmF1bHRMb25nKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBzdHJpbmctdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAodGhlIGVtcHR5IHN0cmluZyA8Y29kZT4iIjwvY29kZT4pIAotICAgICAqIGlzIG5vIGRlZmF1bHQgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgZGVmYXVsdCAKLSAgICAgKiB2YWx1ZSBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFN0cmluZyhTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBkb3VibGUtdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MC4wPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBjdXJyZW50IHZhbHVlIAotICAgICAqIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgZG91YmxlLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkb3VibGUtdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZShTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmbG9hdC12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wLjBmPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBjdXJyZW50IHZhbHVlIAotICAgICAqIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgZmxvYXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGZsb2F0LXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGZsb2F0IGdldEZsb2F0KFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGludGVnZXItdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MDwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgY3VycmVudCB2YWx1ZSAKLSAgICAgKiBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhbiBpbnRlZ3Rlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgaW50LXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRJbnQoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9uZy12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wTDwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgY3VycmVudCB2YWx1ZSAKLSAgICAgKiBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIGxvbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGxvbmctdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRMb25nKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHN0cmluZy12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICh0aGUgZW1wdHkgc3RyaW5nIDxjb2RlPiIiPC9jb2RlPikKLSAgICAgKiBpZiB0aGVyZSBpcyBubyBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBjdXJyZW50IHZhbHVlIAotICAgICAqIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgc3RyaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmctdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZQotICAgICAqIGhhcyB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBoYXMgYSBrbm93biBkZWZhdWx0IHZhbHVlCi0gICAgICogYW5kIGl0cyBjdXJyZW50IHZhbHVlIGlzIHRoZSBzYW1lLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqIChpbmNsdWRpbmcgdGhlIGNhc2Ugd2hlcmUgdGhlIHByZWZlcmVuY2UgaXMgdW5rbm93biB0byB0aGlzIHN0b3JlKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdChTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWVzIGluIHRoaXMgcHJvcGVydHkgc3RvcmUKLSAgICAgKiByZXF1aXJlIHNhdmluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXQgbGVhc3Qgb25lIG9mIHZhbHVlcyBvZiAKLSAgICAgKiAgdGhlIHByZWZlcmVuY2VzIGtub3duIHRvIHRoaXMgc3RvcmUgaGFzIGNoYW5nZWQgYW5kIAotICAgICAqICByZXF1aXJlcyBzYXZpbmcsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG5lZWRzU2F2aW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUgdG8KLSAgICAgKiB0aGUgZ2l2ZW4gc3RyaW5nIHZhbHVlIHdpdGhvdXQgc2VuZGluZyBhIHByb3BlcnR5IGNoYW5nZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBmaXJlIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGFuZCAKLSAgICAgKiBzaG91bGQgb25seSBiZSB1c2VkIGZvciBzZXR0aW5nIGludGVybmFsIHByZWZlcmVuY2VzIAotICAgICAqIHRoYXQgYXJlIG5vdCBtZWFudCB0byBiZSBwcm9jZXNzZWQgYnkgbGlzdGVuZXJzLgotICAgICAqIE5vcm1hbCBjbGllbnRzIHNob3VsZCBpbnN0ZWFkIGNhbGwgI3NldFZhbHVlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1dFZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGRvdWJsZS12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuIAotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSBpcyBhZmZlY3RlZCBpZgotICAgICAqIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudCB2YWx1ZSB3YXMgaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpbiB3aGljaAotICAgICAqIGNhc2UgaXQgY2hhbmdlcyB0byB0aGUgbmV3IGRlZmF1bHQgdmFsdWUuIElmIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudAotICAgICAqIGlzIGRpZmZlcmVudCBmcm9tIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaXRzIGN1cnJlbnQgdmFsdWUgaXMKLSAgICAgKiB1bmFmZmVjdGVkLiBObyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGFyZSByZXBvcnRlZCBieSBjaGFuZ2luZyBkZWZhdWx0Ci0gICAgICogdmFsdWVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBkb3VibGUgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGZsb2F0LXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4gCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIGlzIGFmZmVjdGVkIGlmCi0gICAgICogdGhlIHByZWZlcmVuY2UncyBjdXJyZW50IHZhbHVlIHdhcyBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGluIHdoaWNoCi0gICAgICogY2FzZSBpdCBjaGFuZ2VzIHRvIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZS4gSWYgdGhlIHByZWZlcmVuY2UncyBjdXJyZW50Ci0gICAgICogaXMgZGlmZmVyZW50IGZyb20gaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpdHMgY3VycmVudCB2YWx1ZSBpcwotICAgICAqIHVuYWZmZWN0ZWQuIE5vIHByb3BlcnR5IGNoYW5nZSBldmVudHMgYXJlIHJlcG9ydGVkIGJ5IGNoYW5naW5nIGRlZmF1bHQKLSAgICAgKiB2YWx1ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGZsb2F0IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBpbnRlZ2VyLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4gCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIGlzIGFmZmVjdGVkIGlmCi0gICAgICogdGhlIHByZWZlcmVuY2UncyBjdXJyZW50IHZhbHVlIHdhcyBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGluIHdoaWNoCi0gICAgICogY2FzZSBpdCBjaGFuZ2VzIHRvIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZS4gSWYgdGhlIHByZWZlcmVuY2UncyBjdXJyZW50Ci0gICAgICogaXMgZGlmZmVyZW50IGZyb20gaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpdHMgY3VycmVudCB2YWx1ZSBpcwotICAgICAqIHVuYWZmZWN0ZWQuIE5vIHByb3BlcnR5IGNoYW5nZSBldmVudHMgYXJlIHJlcG9ydGVkIGJ5IGNoYW5naW5nIGRlZmF1bHQKLSAgICAgKiB2YWx1ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgbG9uZy12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuIAotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSBpcyBhZmZlY3RlZCBpZgotICAgICAqIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudCB2YWx1ZSB3YXMgaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpbiB3aGljaAotICAgICAqIGNhc2UgaXQgY2hhbmdlcyB0byB0aGUgbmV3IGRlZmF1bHQgdmFsdWUuIElmIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudAotICAgICAqIGlzIGRpZmZlcmVudCBmcm9tIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaXRzIGN1cnJlbnQgdmFsdWUgaXMKLSAgICAgKiB1bmFmZmVjdGVkLiBObyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGFyZSByZXBvcnRlZCBieSBjaGFuZ2luZyBkZWZhdWx0Ci0gICAgICogdmFsdWVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBzdHJpbmctdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLiAKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UgaXMgYWZmZWN0ZWQgaWYKLSAgICAgKiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQgdmFsdWUgd2FzIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaW4gd2hpY2gKLSAgICAgKiBjYXNlIGl0IGNoYW5nZXMgdG8gdGhlIG5ldyBkZWZhdWx0IHZhbHVlLiBJZiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQKLSAgICAgKiBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGl0cyBjdXJyZW50IHZhbHVlIGlzCi0gICAgICogdW5hZmZlY3RlZC4gTm8gcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBhcmUgcmVwb3J0ZWQgYnkgY2hhbmdpbmcgZGVmYXVsdAotICAgICAqIHZhbHVlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSBkZWZhdWx0T2JqZWN0IHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBTdHJpbmcgZGVmYXVsdE9iamVjdCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYm9vbGVhbi12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuIAotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSBpcyBhZmZlY3RlZCBpZgotICAgICAqIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudCB2YWx1ZSB3YXMgaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpbiB3aGljaAotICAgICAqIGNhc2UgaXQgY2hhbmdlcyB0byB0aGUgbmV3IGRlZmF1bHQgdmFsdWUuIElmIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudAotICAgICAqIGlzIGRpZmZlcmVudCBmcm9tIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaXRzIGN1cnJlbnQgdmFsdWUgaXMKLSAgICAgKiB1bmFmZmVjdGVkLiBObyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGFyZSByZXBvcnRlZCBieSBjaGFuZ2luZyBkZWZhdWx0Ci0gICAgICogdmFsdWVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSBiYWNrCi0gICAgICogdG8gaXRzIGRlZmF1bHQgdmFsdWUuCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlLWluaXRpYWxpemluZyBhIHByZWZlcmVuY2UgdG8gdGhlCi0gICAgICogYXBwcm9wcmlhdGUgZGVmYXVsdCB2YWx1ZSBpcyB0byBjYWxsIDxjb2RlPnNldFRvRGVmYXVsdDwvY29kZT4uCi0gICAgICogVGhpcyBpcyBpbXBsZW1lbnRlZCBieSByZW1vdmluZyB0aGUgbmFtZWQgdmFsdWUgZnJvbSB0aGUgc3RvcmUsIAotICAgICAqIHRoZXJlYnkgZXhwb3NpbmcgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUb0RlZmF1bHQoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZG91YmxlLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHByb3BlcnR5IGNoYW5nZSBldmVudCBpcyByZXBvcnRlZCBpZiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgCi0gICAgICogcHJlZmVyZW5jZSBhY3R1YWxseSBjaGFuZ2VzIGZyb20gaXRzIHByZXZpb3VzIHZhbHVlLiBJbiB0aGUgZXZlbnQKLSAgICAgKiBvYmplY3QsIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlLCBhbmQgdGhlCi0gICAgICogb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgcHJlZmVycmVkIHdheSBvZiByZS1pbml0aWFsaXppbmcgYSBwcmVmZXJlbmNlIHRvIGl0cwotICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgdG8gY2FsbCA8Y29kZT5zZXRUb0RlZmF1bHQ8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBkb3VibGUgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZmxvYXQtdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIDxwPgotICAgICAqIEEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGlzIHJlcG9ydGVkIGlmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSAKLSAgICAgKiBwcmVmZXJlbmNlIGFjdHVhbGx5IGNoYW5nZXMgZnJvbSBpdHMgcHJldmlvdXMgdmFsdWUuIEluIHRoZSBldmVudAotICAgICAqIG9iamVjdCwgdGhlIHByb3BlcnR5IG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UsIGFuZCB0aGUKLSAgICAgKiBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHdyYXBwZWQgYXMgb2JqZWN0cy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlLWluaXRpYWxpemluZyBhIHByZWZlcmVuY2UgdG8gaXRzCi0gICAgICogZGVmYXVsdCB2YWx1ZSBpcyB0byBjYWxsIDxjb2RlPnNldFRvRGVmYXVsdDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGZsb2F0IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGludGVnZXItdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIDxwPgotICAgICAqIEEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGlzIHJlcG9ydGVkIGlmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSAKLSAgICAgKiBwcmVmZXJlbmNlIGFjdHVhbGx5IGNoYW5nZXMgZnJvbSBpdHMgcHJldmlvdXMgdmFsdWUuIEluIHRoZSBldmVudAotICAgICAqIG9iamVjdCwgdGhlIHByb3BlcnR5IG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UsIGFuZCB0aGUKLSAgICAgKiBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHdyYXBwZWQgYXMgb2JqZWN0cy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlLWluaXRpYWxpemluZyBhIHByZWZlcmVuY2UgdG8gaXRzCi0gICAgICogZGVmYXVsdCB2YWx1ZSBpcyB0byBjYWxsIDxjb2RlPnNldFRvRGVmYXVsdDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBsb25nLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHByb3BlcnR5IGNoYW5nZSBldmVudCBpcyByZXBvcnRlZCBpZiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgCi0gICAgICogcHJlZmVyZW5jZSBhY3R1YWxseSBjaGFuZ2VzIGZyb20gaXRzIHByZXZpb3VzIHZhbHVlLiBJbiB0aGUgZXZlbnQKLSAgICAgKiBvYmplY3QsIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlLCBhbmQgdGhlCi0gICAgICogb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgcHJlZmVycmVkIHdheSBvZiByZS1pbml0aWFsaXppbmcgYSBwcmVmZXJlbmNlIHRvIGl0cwotICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgdG8gY2FsbCA8Y29kZT5zZXRUb0RlZmF1bHQ8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHN0cmluZy12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogQSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgaXMgcmVwb3J0ZWQgaWYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIAotICAgICAqIHByZWZlcmVuY2UgYWN0dWFsbHkgY2hhbmdlcyBmcm9tIGl0cyBwcmV2aW91cyB2YWx1ZS4gSW4gdGhlIGV2ZW50Ci0gICAgICogb2JqZWN0LCB0aGUgcHJvcGVydHkgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSwgYW5kIHRoZQotICAgICAqIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgd3JhcHBlZCBhcyBvYmplY3RzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIHByZWZlcnJlZCB3YXkgb2YgcmUtaW5pdGlhbGl6aW5nIGEgcHJlZmVyZW5jZSB0byBpdHMKLSAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIHRvIGNhbGwgPGNvZGU+c2V0VG9EZWZhdWx0PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGJvb2xlYW4tdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIDxwPgotICAgICAqIEEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGlzIHJlcG9ydGVkIGlmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSAKLSAgICAgKiBwcmVmZXJlbmNlIGFjdHVhbGx5IGNoYW5nZXMgZnJvbSBpdHMgcHJldmlvdXMgdmFsdWUuIEluIHRoZSBldmVudAotICAgICAqIG9iamVjdCwgdGhlIHByb3BlcnR5IG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UsIGFuZCB0aGUKLSAgICAgKiBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHdyYXBwZWQgYXMgb2JqZWN0cy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlLWluaXRpYWxpemluZyBhIHByZWZlcmVuY2UgdG8gaXRzCi0gICAgICogZGVmYXVsdCB2YWx1ZSBpcyB0byBjYWxsIDxjb2RlPnNldFRvRGVmYXVsdDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wcmVmZXJlbmNlcy9JUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vcHJlZmVyZW5jZXMvSVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NjI0ZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wcmVmZXJlbmNlcy9JUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiB3cmFwcGVyIGludGVyZmFjZSBmb3IgcHJvcGVydHkgY2hhbmdlIGV2ZW50Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlciB7Ci0KLQkgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmV3IHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qga25vd24KLSAgICAgKiAgb3Igbm90IHJlbGV2YW50IChmb3IgaW5zdGFuY2UgaWYgdGhlIHByb3BlcnR5IHdhcyByZW1vdmVkKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldE5ld1ZhbHVlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvbGQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgb2xkIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qga25vd24KLSAgICAgKiAgb3Igbm90IHJlbGV2YW50IChmb3IgaW5zdGFuY2UgaWYgdGhlIHByb3BlcnR5IHdhcyBqdXN0Ci0gICAgICogIGFkZGVkIGFuZCB0aGVyZSB3YXMgbm8gb2xkIHZhbHVlKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9sZFZhbHVlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQuCi0gICAgICogPHA+Ci0gICAgICogV2FybmluZzogdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIHByb3BlcnR5IG5hbWUgcmV0dXJuZWQKLSAgICAgKiBpcyBhIGNvbnN0YW50IHN0cmluZy4gIENhbGxlcnMgbXVzdCBjb21wYXJlIHByb3BlcnR5IG5hbWVzIHVzaW5nCi0gICAgICogZXF1YWxzLCBub3QgPT0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wcmVmZXJlbmNlcy9JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vcHJlZmVyZW5jZXMvSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmN2JmNjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wcmVmZXJlbmNlcy9JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiB3cmFwcGVyIGludGVyZmFjZSBmb3IgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlciB7Ci0KLQkgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoSVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyIGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvRGVidWdUcmFjZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9EZWJ1Z1RyYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNmZmNDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9EZWJ1Z1RyYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eTsKLQotLyoqCi0gKiBIZWxwZXIgdXRpbGl0eSBmb3IgcHJpbnRpbmcgZGVidWcgdHJhY2VzIHRvIHRoZSBjb25zb2xlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlYnVnVHJhY2UgewotCi0JLyoqCi0JICogUHJpbnRzIGEgZGVidWcgdHJhY2UgdG8gdGhlIGNvbnNvbGUuCi0JICogCi0JICogQHBhcmFtIGluc3RhbmNlCi0JICogICAgICAgICAgICBhIGNsYXNzIGluc3RhbmNlCi0JICogQHBhcmFtIG1ldGhvZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgbmFtZQotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIGEgZGVidWcgbWVzc2FnZQotCSAqIEBwYXJhbSB0aAotCSAqICAgICAgICAgICAgYSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludChPYmplY3QgaW5zdGFuY2UsIFN0cmluZyBtZXRob2QsIFN0cmluZyBtc2csCi0JCQlUaHJvd2FibGUgdGgpIHsKLQkJU3RyaW5nQnVmZmVyIGRlYnVnTXNnID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAoaW5zdGFuY2UgIT0gbnVsbCkgewotCQkJZGVidWdNc2cuYXBwZW5kKGluc3RhbmNlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJCWRlYnVnTXNnLmFwcGVuZCgnLicpLmFwcGVuZChtZXRob2QpOwotCQkJfQotCQkJZGVidWdNc2cuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKG1zZyAhPSBudWxsICYmIG1zZy5sZW5ndGgoKSA+IDApIHsKLQkJCWRlYnVnTXNnLmFwcGVuZChtc2cpOyAKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oZGVidWdNc2cpOwotCQlpZiAodGggIT0gbnVsbCkgewotCQkJdGgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgYSBkZWJ1ZyB0cmFjZSB0byB0aGUgY29uc29sZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5zdGFuY2UKLQkgKiAgICAgICAgICAgIGEgY2xhc3MgaW5zdGFuY2UKLQkgKiBAcGFyYW0gbWV0aG9kCi0JICogICAgICAgICAgICBhIG1ldGhvZCBuYW1lCi0JICogQHBhcmFtIHRoCi0JICogICAgICAgICAgICBhIDxjb2RlPlRocm93YWJsZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50KE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIG1ldGhvZCwgVGhyb3dhYmxlIHRoKSB7Ci0JCXByaW50KGluc3RhbmNlLCBtZXRob2QsIG51bGwsIHRoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgYSBkZWJ1ZyB0cmFjZSB0byB0aGUgY29uc29sZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5zdGFuY2UKLQkgKiAgICAgICAgICAgIGEgY2xhc3MgaW5zdGFuY2UKLQkgKiBAcGFyYW0gbWV0aG9kCi0JICogICAgICAgICAgICBhIG1ldGhvZCBuYW1lCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgYSBkZWJ1ZyBtZXNzYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50KE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIG1ldGhvZCwgU3RyaW5nIG1zZykgewotCQlwcmludChpbnN0YW5jZSwgbWV0aG9kLCBtc2csIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBhIGRlYnVnIHRyYWNlIHRvIHRoZSBjb25zb2xlLgotCSAqIAotCSAqIEBwYXJhbSBpbnN0YW5jZQotCSAqICAgICAgICAgICAgYSBjbGFzcyBpbnN0YW5jZQotCSAqIEBwYXJhbSBtZXRob2QKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnQoT2JqZWN0IGluc3RhbmNlLCBTdHJpbmcgbWV0aG9kKSB7Ci0JCXByaW50KGluc3RhbmNlLCBtZXRob2QsIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBhIGRlYnVnIHRyYWNlIHRvIHRoZSBjb25zb2xlLgotCSAqIAotCSAqIEBwYXJhbSB0aAotCSAqICAgICAgICAgICAgYSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludChUaHJvd2FibGUgdGgpIHsKLQkJaWYgKHRoICE9IG51bGwpIHsKLQkJCXRoLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0VQRlZlcnNpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvRVBGVmVyc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzRkMGRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvRVBGVmVyc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHk7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBzaW5nbGUgdmVyc2lvbiBvZiBFUEYgQ29tcG9zZXIuCi0gKiBJdCBjb250YWlucyBhbGwgdGhlIHZlcnNpb25zIG9mIHRoZSBzdWItY29tcG9uZW50cyBvZiBFUEYuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpY25lIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRVBGVmVyc2lvbiB7Ci0KLQkvLyB0aGUgdG9vbCB2ZXJzaW9uCi0JcHJvdGVjdGVkIFZlcnNpb24gdG9vbFZlcnNpb247Ci0JCi0JLy8gdGhlIGxpYnJhcnkgdmVyc2lvbgotCXByb3RlY3RlZCBWZXJzaW9uIGxpYnJhcnlWZXJzaW9uOwotCQotCS8vIHRoZSBzY2hlbWEgdmVyc2lvbgotCXByb3RlY3RlZCBWZXJzaW9uIHhtbFNjaGVtYVZlcnNpb247Ci0JCi0JCi0JcHVibGljIEVQRlZlcnNpb24oKSB7Ci0JCXRoaXMudG9vbFZlcnNpb24gPSBWZXJzaW9uLmVtcHR5VmVyc2lvbjsKLQkJdGhpcy5saWJyYXJ5VmVyc2lvbiA9IFZlcnNpb24uZW1wdHlWZXJzaW9uOwotCQl0aGlzLnhtbFNjaGVtYVZlcnNpb24gPSBWZXJzaW9uLmVtcHR5VmVyc2lvbjsKLQl9OwotCQotCXB1YmxpYyBFUEZWZXJzaW9uKFN0cmluZyB0b29sVmVyc2lvbiwgU3RyaW5nIGxpYnJhcnlWZXJzaW9uLCBTdHJpbmcgeG1sU2NoZW1hVmVyc2lvbikgewotCQl0aGlzLnRvb2xWZXJzaW9uID0gbmV3IFZlcnNpb24odG9vbFZlcnNpb24pOwotCQl0aGlzLmxpYnJhcnlWZXJzaW9uID0gbmV3IFZlcnNpb24obGlicmFyeVZlcnNpb24pOwotCQl0aGlzLnhtbFNjaGVtYVZlcnNpb24gPSBuZXcgVmVyc2lvbih4bWxTY2hlbWFWZXJzaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB0b29sIHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgVmVyc2lvbiBnZXRUb29sVmVyc2lvbigpIHsKLQkJcmV0dXJuIHRvb2xWZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGxpYnJhcnkgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBWZXJzaW9uIGdldExpYnJhcnlWZXJzaW9uKCkgewotCQlyZXR1cm4gbGlicmFyeVZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgWE1MIHNjaGVtYSB2ZXJzaW9uCi0JICovCi0JcHVibGljIFZlcnNpb24gZ2V0WE1MU2NoZW1hVmVyc2lvbigpIHsKLQkJcmV0dXJuIHhtbFNjaGVtYVZlcnNpb247Ci0JfQotCQotCS8qKgotCSAqIENvbXBhcmVzIHRoZSBnaXZlbiB0b29sIHZlcnNpb24gdG8gdGhpcyBvbmUKLQkgKiAKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uI2NvbXBhcmVUbygpCi0JICogCi0JICogQHBhcmFtIHNjaGVtYVZlcnNpb24gVGhlIHNjaGVtYSB2ZXJzaW9uIHRvIGJlIGNvbXBhcmVkLgotCSAqIEByZXR1cm4gQSBuZWdhdGl2ZSBpbnRlZ2VyIGlmIHRoaXMgdG9vbCB2ZXJzaW9uIGlzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gb25lPGJyIC8+Ci0JICogWmVybyBpZiB0aGUgdGhpcyB0b29sIHZlcnNpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGdpdmVuIG9uZTxiciAvPgotCSAqIEEgcG9zaXRpdmUgaW50ZWdlciBpZiB0aGlzIHRvb2wgdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIG9uZTxiciAvPgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZVRvb2xWZXJzaW9uVG8oVmVyc2lvbiB0b29sVmVyc2lvbikgewotCQlpZiAoIVZlcnNpb25VdGlsLmlzVmVyc2lvbkNoZWNraW5nRGlzYWJsZWQoKSkKLQkJCXJldHVybiBnZXRUb29sVmVyc2lvbigpLmNvbXBhcmVUbyh0b29sVmVyc2lvbik7Ci0JCWVsc2UgCi0JCQlyZXR1cm4gMDsKLQl9Ci0JCi0JLyoqCi0JICogQ29tcGFyZXMgdGhlIGdpdmVuIGxpYnJhcnkgdmVyc2lvbiB0byB0aGlzIG9uZQotCSAqIAotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb24jY29tcGFyZVRvKCkKLQkgKiAKLQkgKiBAcGFyYW0gc2NoZW1hVmVyc2lvbiBUaGUgc2NoZW1hIHZlcnNpb24gdG8gYmUgY29tcGFyZWQuCi0JICogQHJldHVybiBBIG5lZ2F0aXZlIGludGVnZXIgaWYgdGhpcyBsaWJyYXJ5IHZlcnNpb24gaXMgbGVzcyB0aGFuIHRoZSBnaXZlbiBvbmU8YnIgLz4KLQkgKiBaZXJvIGlmIHRoZSB0aGlzIGxpYnJhcnkgdmVyc2lvbiBpcyB0aGUgc2FtZSBhcyB0aGUgZ2l2ZW4gb25lPGJyIC8+Ci0JICogQSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHRoaXMgbGlicmFyeSB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gb25lPGJyIC8+Ci0JICogCi0JICovCi0JcHVibGljIGludCBjb21wYXJlTGlicmFyeVZlcnNpb25UbyhWZXJzaW9uIGxpYnJhcnlWZXJzaW9uKSB7Ci0JCWlmICghVmVyc2lvblV0aWwuaXNWZXJzaW9uQ2hlY2tpbmdEaXNhYmxlZCgpKQotCQkJcmV0dXJuIGdldExpYnJhcnlWZXJzaW9uKCkuY29tcGFyZVRvKGxpYnJhcnlWZXJzaW9uKTsKLQkJZWxzZSAKLQkJCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIENvbXBhcmVzIHRoZSBnaXZlbiBYTUwgU2NoZW1hIHZlcnNpb24gdG8gdGhpcyBvbmUKLQkgKiAKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uI2NvbXBhcmVUbygpCi0JICogCi0JICogQHBhcmFtIHNjaGVtYVZlcnNpb24gVGhlIHNjaGVtYSB2ZXJzaW9uIHRvIGJlIGNvbXBhcmVkLgotCSAqIEByZXR1cm4gQSBuZWdhdGl2ZSBpbnRlZ2VyIGlmIHRoaXMgWE1MIFNjaGVtYSB2ZXJzaW9uIGlzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gb25lPGJyIC8+Ci0JICogWmVybyBpZiB0aGUgdGhpcyBYTUwgU2NoZW1hIHZlcnNpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGdpdmVuIG9uZTxiciAvPgotCSAqIEEgcG9zaXRpdmUgaW50ZWdlciBpZiB0aGlzIFhNTCBTY2hlbWEgdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIG9uZTxiciAvPgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZVhNTFNjaGVtYVZlcnNpb25UbyhWZXJzaW9uIFhNTFNjaGVtYVZlcnNpb24pIHsKLQkJaWYgKCFWZXJzaW9uVXRpbC5pc1ZlcnNpb25DaGVja2luZ0Rpc2FibGVkKCkpCi0JCQlyZXR1cm4gZ2V0WE1MU2NoZW1hVmVyc2lvbigpLmNvbXBhcmVUbyhYTUxTY2hlbWFWZXJzaW9uKTsKLQkJZWxzZSAKLQkJCXJldHVybiAwOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0VG9vbFZlcnNpb24oKS50b1N0cmluZygpICsgIiwiICsgLy8kTk9OLU5MUy0xJAotCQlnZXRMaWJyYXJ5VmVyc2lvbigpLnRvU3RyaW5nKCkgKyAiLCIgKyAvLyROT04tTkxTLTEkCi0JCWdldFhNTFNjaGVtYVZlcnNpb24oKS50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IHRoaXMpIHsgLy8gcXVpY2t0ZXN0Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIEVQRlZlcnNpb24pKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlFUEZWZXJzaW9uIG90aGVyID0gKEVQRlZlcnNpb24pIG9iamVjdDsKLQkJcmV0dXJuIChnZXRUb29sVmVyc2lvbigpLmVxdWFscyhvdGhlci5nZXRUb29sVmVyc2lvbigpKSkgJiYgKGdldExpYnJhcnlWZXJzaW9uKCkuZXF1YWxzKG90aGVyLmdldExpYnJhcnlWZXJzaW9uKCkpKQotCQkJCSYmIChnZXRYTUxTY2hlbWFWZXJzaW9uKCkuZXF1YWxzKG90aGVyLmdldFhNTFNjaGVtYVZlcnNpb24oKSkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgcmVzdWx0ID0gdG9vbFZlcnNpb24uaGFzaENvZGUoKTsKLQkJcmVzdWx0IF49IGxpYnJhcnlWZXJzaW9uLmhhc2hDb2RlKCk7Ci0JCXJlc3VsdCBePSB4bWxTY2hlbWFWZXJzaW9uLmhhc2hDb2RlKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9FUEZWZXJzaW9ucy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9FUEZWZXJzaW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGZmZWEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvRVBGVmVyc2lvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHN0b3JlcyBhbGwgb2YgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBrbm93biBFUEYgdmVyc2lvbnMuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRVBGVmVyc2lvbnMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTF9JRCA9ICJlcGYiOyAvLyROT04tTkxTLTEkCi0KLQkvLyB0aGUgbmFtZSBzcGFjZSBVUkkgc3RyaW5nIGZvciB0aGUgVE9PTF9JRAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBuc1VyaSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIEVQRiAxLjAKLQlwcml2YXRlIHN0YXRpYyBFUEZWZXJzaW9uIEVQRl8xMCA9IG5ldyBFUEZWZXJzaW9uKCIxLjAiLCAvLyROT04tTkxTLTEkICB0b29sIHZlcnNpb24KLQkJCSIxLjAuMy4wIiwgLy8kTk9OLU5MUy0xJCAgbGlicmFyeSB2ZXJzaW9uCi0JCQkiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJCAgeG1sIHNjaGVtYSB2ZXJzaW9uCi0KLQkvLyBFUEYgMS4xIC0gVGhpcyBpcyBFUEYgMS4yIEl0ZXJhdGlvbiAxCi0JcHJpdmF0ZSBzdGF0aWMgRVBGVmVyc2lvbiBFUEZfMTEgPSBuZXcgRVBGVmVyc2lvbigiMS4xIiwgLy8kTk9OLU5MUy0xJCAgdG9vbCB2ZXJzaW9uCi0JCQkiMS4wLjQuMCIsIC8vJE5PTi1OTFMtMSQgIGxpYnJhcnkgdmVyc2lvbgotCQkJIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQgIHhtbCBzY2hlbWEgdmVyc2lvbgotCi0JLy8gRVBGIDEuMiByZWxlYXNlCi0JcHJpdmF0ZSBzdGF0aWMgRVBGVmVyc2lvbiBFUEZfMTIgPSBuZXcgRVBGVmVyc2lvbigiMS4yIiwgLy8kTk9OLU5MUy0xJCAgdG9vbCB2ZXJzaW9uCi0JCQkiMS4wLjQuMSIsIC8vJE5PTi1OTFMtMSQgIGxpYnJhcnkgdmVyc2lvbgotCQkJIjEuMC4xIik7IC8vJE5PTi1OTFMtMSQgIHhtbCBzY2hlbWEgdmVyc2lvbgotCi0JcHJpdmF0ZSBzdGF0aWMgRVBGVmVyc2lvbiBjdXJyZW50VmVyc2lvbiA9IEVQRl8xMjsKLQotCXB1YmxpYyBFUEZWZXJzaW9uIGdldEN1cnJlbnRWZXJzaW9uKCkgewotCQlyZXR1cm4gY3VycmVudFZlcnNpb247Ci0JfQotCi0JcHVibGljIEVQRlZlcnNpb24gZ2V0VmVyc2lvbihTdHJpbmcgdG9vbFZlcnNpb24pIHsKLQkJaWYgKHRvb2xWZXJzaW9uICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldEFsbFZlcnNpb25zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRVBGVmVyc2lvbiB2ZXIgPSAoRVBGVmVyc2lvbikgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHZlci5nZXRUb29sVmVyc2lvbigpLmVxdWFscyhuZXcgVmVyc2lvbih0b29sVmVyc2lvbikpKSB7Ci0JCQkJCXJldHVybiB2ZXI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFsbFZlcnNpb25zKCkgewotCQlMaXN0PEVQRlZlcnNpb24+IHZlcnNpb25zID0gbmV3IEFycmF5TGlzdDxFUEZWZXJzaW9uPigpOwotCQl2ZXJzaW9ucy5hZGQoRVBGXzEwKTsKLQkJdmVyc2lvbnMuYWRkKEVQRl8xMSk7Ci0JCXZlcnNpb25zLmFkZChFUEZfMTIpOwotCQlyZXR1cm4gdmVyc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnlWZXJzaW9uCi0JICogQHJldHVybiB0aGUgbWluaW11bSB0b29sIHZlcnNpb24gdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgbGlicmFyeSB2ZXJzaW9uCi0JICovCi0JcHVibGljIEVQRlZlcnNpb24gZ2V0TWluVG9vbFZlcnNpb25Gb3JMaWJyYXJ5VmVyc2lvbihWZXJzaW9uIGxpYnJhcnlWZXJzaW9uKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldEFsbFZlcnNpb25zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFUEZWZXJzaW9uIHZlcnNpb25JbmZvID0gKEVQRlZlcnNpb24pIGl0ZXIubmV4dCgpOwotCQkJaWYgKHZlcnNpb25JbmZvLmdldExpYnJhcnlWZXJzaW9uKCkuY29tcGFyZVRvKGxpYnJhcnlWZXJzaW9uKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIHZlcnNpb25JbmZvOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1pbmltdW0gdG9vbCB2ZXJzaW9uIHRoYXQgdXNlcyB0aGUgY3VycmVudCBsaWJyYXJ5IHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgRVBGVmVyc2lvbiBnZXRNaW5Ub29sVmVyc2lvbkZvckN1cnJlbnRMaWJyYXJ5VmVyc2lvbigpIHsKLQkJVmVyc2lvbiBsaWJyYXJ5VmVyc2lvbiA9IGdldEN1cnJlbnRWZXJzaW9uKCkuZ2V0TGlicmFyeVZlcnNpb24oKTsKLQkJcmV0dXJuIGdldE1pblRvb2xWZXJzaW9uRm9yTGlicmFyeVZlcnNpb24obGlicmFyeVZlcnNpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB4bWxTY2hlbWFWZXJzaW9uCi0JICogQHJldHVybiB0aGUgbWluaW11bSB0b29sIHZlcnNpb24gdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgWE1MIFNjaGVtYQotCSAqICAgICAgICAgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBFUEZWZXJzaW9uIGdldE1pblRvb2xWZXJzaW9uRm9yWE1MU2NoZW1hVmVyc2lvbigKLQkJCVZlcnNpb24geG1sU2NoZW1hVmVyc2lvbikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRBbGxWZXJzaW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRVBGVmVyc2lvbiB2ZXJzaW9uSW5mbyA9IChFUEZWZXJzaW9uKSBpdGVyLm5leHQoKTsKLQkJCWlmICh2ZXJzaW9uSW5mby5nZXRYTUxTY2hlbWFWZXJzaW9uKCkuY29tcGFyZVRvKHhtbFNjaGVtYVZlcnNpb24pID09IDApIHsKLQkJCQlyZXR1cm4gdmVyc2lvbkluZm87Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgbWluaW11bSB0b29sIHZlcnNpb24gdGhhdCB1c2VzIHRoZSBjdXJyZW50IFhNTCBTY2hlbWEgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBFUEZWZXJzaW9uIGdldE1pblRvb2xWZXJzaW9uRm9yQ3VycmVudFhNTFNjaGVtYVZlcnNpb24oKSB7Ci0JCVZlcnNpb24geG1sU2NoZW1hVmVyc2lvbiA9IGdldEN1cnJlbnRWZXJzaW9uKCkuZ2V0WE1MU2NoZW1hVmVyc2lvbigpOwotCQlyZXR1cm4gZ2V0TWluVG9vbFZlcnNpb25Gb3JYTUxTY2hlbWFWZXJzaW9uKHhtbFNjaGVtYVZlcnNpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgc3BhY2UgVVJJIHN0cmluZyBmb3IgdGhlIFRPT0xfSUQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5zVVJJKCkgewotCQlyZXR1cm4gbnNVcmk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0lMaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0lMaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MjgzZmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9JTGlicmFyeUV4dGVuc2lvblZlcnNpb25DaGVjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuVmVyc2lvblV0aWwuVmVyc2lvbkNoZWNrSW5mbzsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBwZXJmb3JtaW5nIG1ldGhvZCBsaWJyYXJ5IHZlcnNpb24gY2hlY2suCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrIHsKLQotCS8qKgotCSAqIENoZWNrcyBhbmQgcmV0dXJucyB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYSBtZXRob2QKLQkgKiBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5IFhNSSBmaWxlCi0JICogQHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbGlicmFyeSBYTUkgZmlsZSBkb2VzIG5vdCBjb250YWluIHRoZQotCSAqICAgICAgICAgdmVyc2lvbiBpbmZvcm1hdGlvbiBvZiB0aGUgdG9vbCB0aGF0IGNyZWF0ZWQgaXQ7IG9yCi0JICogICAgICAgICA8Y29kZT5WZXJzaW9uQ2hlY2tJbmZvPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgVmVyc2lvbkNoZWNrSW5mbyBjaGVja0xpYnJhcnlWZXJzaW9uKEZpbGUgbGliUGF0aCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvTG9nZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjAzN2M1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotLyoqCi0gKiBHZW5lcmljIGxvZ2dlciB1c2VkIGZvciBsb2dnaW5nIHN0YXR1cyBtZXNzYWdlcywgd2FybmluZyBtZXNzYWdlcywgZXJyb3IKLSAqIG1lc3NhZ2VzLCBhbmQgZXhjZXB0aW9uIHN0YWNrIHRyYWNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCi0JLy8gVGhlIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBQbHVnaW4gcGx1Z2luOwotCi0JLy8gVGhlIHBsdWctaW4gSUQuCi0JcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWQ7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgPGNvZGU+TG9nZ2VyPC9jb2RlPiBnaXZlbiB0aGUgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBUaGUgcGx1Z2luIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMb2dnZXIoUGx1Z2luIHBsdWdpbikgewotCQl0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLQkJdGhpcy5wbHVnaW5JZCA9IHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsgLy9wbHVnaW4uZ2V0SWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtc2cpIHsKLQkJbG9nTXNnKElTdGF0dXMuRVJST1IsIG1zZywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgZ2l2ZW4gZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBleAotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihUaHJvd2FibGUgZXgpIHsKLQkJbG9nTXNnKElTdGF0dXMuRVJST1IsIG51bGwsIGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlIGFuZCBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIGV4Ci0JICogICAgICAgICAgICBUaGUgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtc2csIFRocm93YWJsZSBleCkgewotCQlsb2dNc2coSVN0YXR1cy5FUlJPUiwgbXNnLCBleCk7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgZ2l2ZW4gd2FybmluZyBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSB3YXJuaW5nIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgbXNnKSB7Ci0JCWxvZ01zZyhJU3RhdHVzLldBUk5JTkcsIG1zZywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgZ2l2ZW4gd2FybmluZyBtZXNzYWdlIGFuZCBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLQkgKiBAcGFyYW0gZXgKLQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgbXNnLCBUaHJvd2FibGUgZXgpIHsKLQkJbG9nTXNnKElTdGF0dXMuV0FSTklORywgbXNnLCBleCk7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgZ2l2ZW4gc3RhdHVzIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgc3RhdHVzIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgbG9nSW5mbyhTdHJpbmcgbXNnKSB7Ci0JCWxvZ01zZyhJU3RhdHVzLklORk8sIG1zZywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqICAgICAgICAgICAgVGhlIHNldmVyaXR5LgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlLgotCSAqIEBwYXJhbSBleAotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbG9nTXNnKGludCBzZXZlcml0eSwgU3RyaW5nIG1zZywgVGhyb3dhYmxlIGV4KSB7Ci0JCWlmIChtc2cgPT0gbnVsbCAmJiBleCAhPSBudWxsKSB7Ci0JCQltc2cgPSBleC5nZXRNZXNzYWdlKCk7IAotCQl9Ci0KLQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQltc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIHBsdWdpbklkLCBJU3RhdHVzLk9LLCBtc2csIGV4KTsKLQotCQkvLyBDYWxsIHRoZSBFY2xpcHNlIExvZ2dlci4KLQkJcGx1Z2luLmdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvVmVyc2lvbk1pc21hdGNoRXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L1ZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzczNDEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvVmVyc2lvbk1pc21hdGNoRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5OwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHRvb2wgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUKLSAqIG1ldGhvZCBsaWJyYXJ5IGl0IGlzIHRyeWluZyB0byBvcGVuLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQlwcml2YXRlIFZlcnNpb24gZXhwZWN0ZWQ7Ci0KLQlwcml2YXRlIFZlcnNpb24gYWN0dWFsOwotCi0JcHVibGljIFZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbihWZXJzaW9uIGV4cGVjdGVkLCBTdHJpbmcgYWN0dWFsKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZXhwZWN0ZWQgPSBleHBlY3RlZDsKLQkJaWYgKGFjdHVhbCA9PSBudWxsKSB7Ci0JCQl0aGlzLmFjdHVhbCA9IFZlcnNpb24uZW1wdHlWZXJzaW9uOwotCQl9IGVsc2UgewotCQkJdGhpcy5hY3R1YWwgPSBuZXcgVmVyc2lvbihhY3R1YWwpOwotCQl9Ci0JfQotCi0JcHVibGljIFZlcnNpb24gZ2V0QWN0dWFsKCkgewotCQlyZXR1cm4gYWN0dWFsOwotCX0KLQotCXB1YmxpYyBWZXJzaW9uIGdldEV4cGVjdGVkKCkgewotCQlyZXR1cm4gZXhwZWN0ZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9WZXJzaW9uVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9WZXJzaW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGZhZTIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvVmVyc2lvblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIFByb3ZpZGVzIHV0aWxpdGllcyB0byBxdWVyeSBhIG1ldGhvZCBsaWJyYXJ5IHNjaGVtYSBhbmQgdGhlIHZlcnNpb24gb2YgdGhlCi0gKiB0b29sIHRoYXQgY3JlYXRlZCBpdC4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWZXJzaW9uVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFZlcnNpb25DaGVja0luZm8gewotCQlwdWJsaWMgVmVyc2lvbkNoZWNrSW5mbyhTdHJpbmcgaWQsIFN0cmluZyB0b29sVmVyc2lvbiwKLQkJCQlTdHJpbmcgY3VycmVudE1pblRvb2xWZXJzaW9uLCBpbnQgcmVzdWx0KSB7Ci0JCQl0aGlzLnRvb2xJRCA9IGlkOwotCQkJdGhpcy50b29sVmVyc2lvbiA9IHRvb2xWZXJzaW9uOwotCQkJdGhpcy5jdXJyZW50TWluVG9vbFZlcnNpb24gPSBjdXJyZW50TWluVG9vbFZlcnNpb247Ci0JCQl0aGlzLnJlc3VsdCA9IHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9vbElEOwotCi0JCXB1YmxpYyBTdHJpbmcgdG9vbFZlcnNpb247Ci0KLQkJcHVibGljIFN0cmluZyBjdXJyZW50TWluVG9vbFZlcnNpb247Ci0KLQkJLyoqCi0JCSAqIDwgMDogZmlsZVRvb2xWZXJzaW9uIGlzIG9sZGVyIHRoYW4gY3VycmVudE1pblRvb2xWZXJzaW9uIDxici8+ID09IDA6Ci0JCSAqIG1hdGNoIDxici8+ID4gMCA6IGZpbGVUb29sVmVyc2lvbiBpcyBuZXdlciB0aGFuIGN1cnJlbnRNaW5Ub29sVmVyc2lvbgotCQkgKiA8YnIvPgotCQkgKi8KLQkJcHVibGljIGludCByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSA9IENvbW1vblBsdWdpbi5jbGFzcwotCQkJLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUUgPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9WRVJTSU9OU19JTkZPID0gInZlcnNpb25zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX0xJQl9FWFRFTlNJT05fQ0hFQ0sgPSAibGlicmFyeUV4dGVuc2lvblZlcnNpb25DaGVjayI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFX1ZFUlNJT05fQ0hFQ0tJTkdfUFJFRiA9ICJkaXNhYmxlX3ZlcnNpb25fY2hlY2tpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIEVQRlZlcnNpb25zPiB2ZXJzaW9ucyA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgRVBGVmVyc2lvbnM+KCk7Ci0KLQlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIElMaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrPiBsaWJFeHRDaGVja2VycyA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgSUxpYnJhcnlFeHRlbnNpb25WZXJzaW9uQ2hlY2s+KCk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gdmVyc2lvbkNoZWNraW5nRGlzYWJsZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIExpc3Qgb2YgdG9vbElEcyB0byBjaGVjaywgaW4gb3JkZXIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gdG9vbElEc0NoZWNrTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0Jc3RhdGljIHsKLQkJdG9vbElEc0NoZWNrTGlzdC5hZGQoRVBGVmVyc2lvbnMuVE9PTF9JRCk7Ci0KLQkJLy8gcmVhZCBwcm9wZXJ0aWVzIGZpbGUKLQkJdHJ5IHsKLQkJCQotCQkJLy8gcHJlZmVyZW5jZSBzdG9yZSBpcyBub3QgYWNjZXNzaWJsZSBoZXJlLAotCQkJLy8gc2hvdWxkIHBhc3MgdGhlIHdyYXBwZXIgaW4gd2hlbiBVSSBwbHVnaW4gaXMgYWN0aXZhdGVkLgotCQkJLy8gSmluaHVhIFhpLCAwMS8wMy8yMDA4Ci0JCQlTdHJpbmcgdmFsdWVTdHIgPSBDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJCS5nZXRTdHJpbmcoRElTQUJMRV9WRVJTSU9OX0NIRUNLSU5HX1BSRUYpOwotCQkJdmVyc2lvbkNoZWNraW5nRGlzYWJsZWQgPSBCb29sZWFuLnZhbHVlT2YodmFsdWVTdHIpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQl2ZXJzaW9uQ2hlY2tpbmdEaXNhYmxlZCA9IGZhbHNlOwotCQl9Ci0KLQkJLy8gUHJvY2VzcyB0aGUgIm9yZy5lY2xpcHNlLmVwZi5jb21tb24udmVyc2lvbiIgZXh0ZW5zaW9uIHBvaW50Ci0JCS8vIGNvbnRyaWJ1dG9ycy4KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSwgRVhURU5TSU9OX1BPSU5UX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJaW5pdEV4dGVuc2lvbihleHRlbnNpb24pOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaW5pdEV4dGVuc2lvbihJRXh0ZW5zaW9uIGV4dGVuc2lvbikgewotCQlTdHJpbmcgZXh0ZW5zaW9uSUQgPSBleHRlbnNpb24uZ2V0U2ltcGxlSWRlbnRpZmllcigpOwotCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQl0cnkgewotCQkJCWlmIChFWFRFTlNJT05fVkVSU0lPTlNfSU5GTy5lcXVhbHMoY29uZmlnRWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQkJCXZlcnNpb25zLnB1dChleHRlbnNpb25JRCwgKEVQRlZlcnNpb25zKSBidW5kbGUKLQkJCQkJCQkJLmxvYWRDbGFzcyhjbGFzc05hbWUpLm5ld0luc3RhbmNlKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKEVYVEVOU0lPTl9MSUJfRVhURU5TSU9OX0NIRUNLLmVxdWFscyhjb25maWdFbGVtZW50Ci0JCQkJCQkuZ2V0TmFtZSgpKSkgewotCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQlsaWJFeHRDaGVja2Vycy5wdXQoZXh0ZW5zaW9uSUQsCi0JCQkJCQkJCShJTGlicmFyeUV4dGVuc2lvblZlcnNpb25DaGVjaykgYnVuZGxlCi0JCQkJCQkJCQkJLmxvYWRDbGFzcyhjbGFzc05hbWUpLm5ld0luc3RhbmNlKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtYXAgb2YgVG9vbCBJRHMtdG8tVmVyc2lvbnMgY2xhc3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRWZXJzaW9uc01hcCgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh2ZXJzaW9ucyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBhIFNldCBvZiBhbGwga25vd24gVG9vbCBJRHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNldDxTdHJpbmc+IGdldEFsbFRvb2xJRHMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQodmVyc2lvbnMua2V5U2V0KCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB0b29sSUQKLQkgKiBAcmV0dXJuIFRoZSBWZXJzaW9ucyBjbGFzcyBmb3IgdGhlIGdpdmVuIFRvb2wgSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVQRlZlcnNpb25zIGdldFZlcnNpb25zKFN0cmluZyB0b29sSUQpIHsKLQkJcmV0dXJuIChFUEZWZXJzaW9ucykgdmVyc2lvbnMuZ2V0KHRvb2xJRCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmZiB2ZXJzaW9uIGNoZWNraW5nIGlzIGRpc2FibGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmVyc2lvbkNoZWNraW5nRGlzYWJsZWQoKSB7Ci0JCXJldHVybiB2ZXJzaW9uQ2hlY2tpbmdEaXNhYmxlZDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9YTUlWZXJzaW9uUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgKLQkJCSIoXFx3Kz8pOnZlcnNpb249XCIoLis/KVwiIiwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9YTUxWZXJzaW9uQXR0cmlidXRlUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgKLQkJCSJ0b29sPVwiKC4qPylcIiIsIFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfWE1JX0VMRU1FTlRfU1RBUlRfVEFHID0gUGF0dGVybgotCQkJLmNvbXBpbGUoIjw/eG1sIHZlcnNpb249XCIuKz9cIiBlbmNvZGluZz1cIi4rP1wiPz4iKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfRU5EX1RBRyA9ICI+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1JX0FUVFJJQlVURV9UQUcgPSAieG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfU1RBUlRfVEFHID0gIjx1bWE6TWV0aG9kTGlicmFyeSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9WRVJTSU9OU19TRVBBUkFUT1IgPSAiOyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UT09MX1ZFUlNJT05fU0VQQVJBVE9SID0gIj0iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBHaXZlbiBhbiBYTUwgZmlsZSwgd2lsbCByZWFkIHRoZSB0b29sPSJmb289YS5iLmMuZDtiYXI9dy54LnkueiIKLQkgKiBhdHRyaWJ1dGVzIGFuZCByZXR1cm4gYSBtYXAgb2YgdGhlIGlkLXRvLXZlcnNpb25zLgotCSAqIAotCSAqIEBwYXJhbSB4bWxGaWxlCi0JICogICAgICAgICAgICBmaWxlIHRvIHByb2Nlc3MKLQkgKiBAcmV0dXJuIG51bGwgaWYgbm8gdmVyc2lvbnMgZm91bmQ7IGEgbWFwIG9mIHRoZSBpZC10by12ZXJzaW9ucyBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1hcCByZWFkVmVyc2lvbnNGcm9tWE1MRmlsZShGaWxlIHhtbEZpbGUpIHsKLQkJTWFwPFN0cmluZywgU3RyaW5nPiB2ZXJzaW9ucyA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJ1ZiA9IEZpbGVVdGlsLnJlYWRGaWxlKHhtbEZpbGUsIEZpbGVVdGlsLkVOQ09ESU5HX1VURl84KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJfQotCQlpZiAoYnVmICE9IG51bGwpIHsKLQkJCWludCB4bWlFbGVtZW50U3RhcnRJZHggPSBidWYuaW5kZXhPZihYTUxfRUxFTUVOVF9TVEFSVF9UQUcpOwotCQkJaWYgKHhtaUVsZW1lbnRTdGFydElkeCAhPSAtMSkgewotCQkJCWludCB4bWlFbGVtZW50RW5kSWR4ID0gYnVmLmluZGV4T2YoWE1MX0VMRU1FTlRfRU5EX1RBRywKLQkJCQkJCXhtaUVsZW1lbnRTdGFydElkeCArIFhNTF9FTEVNRU5UX1NUQVJUX1RBRy5sZW5ndGgoKSk7Ci0JCQkJaWYgKHhtaUVsZW1lbnRFbmRJZHggIT0gLTEpIHsKLQkJCQkJU3RyaW5nIHJvb3RFbGVtZW50ID0gYnVmLnN1YnN0cmluZyh4bWlFbGVtZW50U3RhcnRJZHgsCi0JCQkJCQkJeG1pRWxlbWVudEVuZElkeCk7Ci0JCQkJCU1hdGNoZXIgbUF0dHJpYnV0ZSA9IHBfWE1MVmVyc2lvbkF0dHJpYnV0ZVBhdHRlcm4KLQkJCQkJCQkubWF0Y2hlcihyb290RWxlbWVudCk7Ci0JCQkJCWlmIChtQXR0cmlidXRlLmZpbmQoKSkgewotCQkJCQkJU3RyaW5nIHRvb2xzQXR0cmlidXRlID0gbUF0dHJpYnV0ZS5ncm91cCgxKTsKLQkJCQkJCWlmICh0b29sc0F0dHJpYnV0ZSAhPSBudWxsCi0JCQkJCQkJCSYmIHRvb2xzQXR0cmlidXRlLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCVN0cmluZ1tdIHZlcnNpb25zQXJyYXkgPSBTdHJVdGlsLnNwbGl0KAotCQkJCQkJCQkJdG9vbHNBdHRyaWJ1dGUsIFhNTF9WRVJTSU9OU19TRVBBUkFUT1IpOwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmVyc2lvbnNBcnJheS5sZW5ndGg7IGkrKykgewotCQkJCQkJCQlpZiAodmVyc2lvbnNBcnJheVtpXSAhPSBudWxsCi0JCQkJCQkJCQkJJiYgdmVyc2lvbnNBcnJheVtpXS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJCVN0cmluZ1tdIHZlcnNpb25JbmZvQXJyYXkgPSBTdHJVdGlsLnNwbGl0KAotCQkJCQkJCQkJCQl2ZXJzaW9uc0FycmF5W2ldLAotCQkJCQkJCQkJCQlYTUxfVE9PTF9WRVJTSU9OX1NFUEFSQVRPUik7Ci0JCQkJCQkJCQlpZiAodmVyc2lvbkluZm9BcnJheS5sZW5ndGggIT0gMikKLQkJCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQkJCVN0cmluZyB0b29sSUQgPSB2ZXJzaW9uSW5mb0FycmF5WzBdOwotCQkJCQkJCQkJU3RyaW5nIHRvb2xWZXJzaW9uID0gdmVyc2lvbkluZm9BcnJheVsxXTsKLQkJCQkJCQkJCWlmICh0b29sSUQgIT0gbnVsbAotCQkJCQkJCQkJCQkmJiB0b29sSUQudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkJCQkmJiB0b29sVmVyc2lvbiAhPSBudWxsCi0JCQkJCQkJCQkJCSYmIHRvb2xWZXJzaW9uLnRyaW0oKS5sZW5ndGgoKSA+IDApCi0JCQkJCQkJCQkJdmVyc2lvbnMucHV0KHRvb2xJRCwgdG9vbFZlcnNpb24pOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh2ZXJzaW9ucy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdmVyc2lvbnM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhbiBYTUkgZmlsZSwgd2lsbCByZWFkIHRoZSBmb286dmVyc2lvbj0ieC54LngiIGF0dHJpYnV0ZXMgYW5kCi0JICogcmV0dXJuIGEgbWFwIG9mIHRoZSBpZC10by12ZXJzaW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0geG1sRmlsZQotCSAqICAgICAgICAgICAgZmlsZSB0byBwcm9jZXNzCi0JICogQHJldHVybiBudWxsIGlmIG5vIHZlcnNpb25zIGZvdW5kOyBhIG1hcCBvZiB0aGUgaWQtdG8tdmVyc2lvbnMgb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBNYXAgcmVhZFZlcnNpb25zRnJvbVhNSUZpbGUoRmlsZSB4bWlGaWxlKSB7Ci0JCU1hcDxTdHJpbmcsIFN0cmluZz4gdmVyc2lvbnMgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlidWYgPSBGaWxlVXRpbC5yZWFkRmlsZSh4bWlGaWxlLCBGaWxlVXRpbC5FTkNPRElOR19VVEZfOCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCX0KLQkJaWYgKGJ1ZiAhPSBudWxsKSB7Ci0JCQlNYXRjaGVyIGRvY1N0YXJ0TWF0Y2hlciA9IHBfWE1JX0VMRU1FTlRfU1RBUlRfVEFHLm1hdGNoZXIoYnVmKTsKLQkJCWlmIChkb2NTdGFydE1hdGNoZXIuZmluZCgpKSB7Ci0JCQkJaW50IGRvY0hlYWRlckVuZElkeCA9IGRvY1N0YXJ0TWF0Y2hlci5lbmQoKTsKLQkJCQlpbnQgeG1pRWxlbWVudEVuZElkeCA9IGJ1Zi5pbmRleE9mKFhNTF9FTEVNRU5UX0VORF9UQUcsCi0JCQkJCQlkb2NIZWFkZXJFbmRJZHgpOwotCQkJCWlmICh4bWlFbGVtZW50RW5kSWR4ICE9IC0xKSB7Ci0JCQkJCVN0cmluZyByb290RWxlbWVudCA9IGJ1Zi5zdWJzdHJpbmcoZG9jSGVhZGVyRW5kSWR4LAotCQkJCQkJCXhtaUVsZW1lbnRFbmRJZHggKyAxKTsKLQkJCQkJTWF0Y2hlciBtID0gcF9YTUlWZXJzaW9uUGF0dGVybi5tYXRjaGVyKHJvb3RFbGVtZW50KTsKLQkJCQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQkJCQlTdHJpbmcgdG9vbElEID0gbS5ncm91cCgxKTsKLQkJCQkJCWlmICh0b29sSUQuZXF1YWxzKFhNSV9BVFRSSUJVVEVfVEFHKSkKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCVN0cmluZyB0b29sVmVyc2lvbiA9IG0uZ3JvdXAoMik7Ci0JCQkJCQlpZiAodG9vbElEICE9IG51bGwgJiYgdG9vbElELnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkJCQkJJiYgdG9vbFZlcnNpb24gIT0gbnVsbAotCQkJCQkJCQkmJiB0b29sVmVyc2lvbi50cmltKCkubGVuZ3RoKCkgPiAwKQotCQkJCQkJCXZlcnNpb25zLnB1dCh0b29sSUQsIHRvb2xWZXJzaW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAodmVyc2lvbnMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHZlcnNpb25zOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSBmaWxlLCB3aWxsIHJlYWQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgcmV0dXJuIGEgbWFwIG9mIHRoZQotCSAqIGlkLXRvLXZlcnNpb25zLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBmaWxlIHRvIHByb2Nlc3MKLQkgKiBAcmV0dXJuIG51bGwgaWYgbm8gdmVyc2lvbnMgZm91bmQ7IGEgbWFwIG9mIHRoZSBpZC10by12ZXJzaW9ucyBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCByZWFkVmVyc2lvbnNGcm9tRmlsZShGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUuZ2V0TmFtZSgpLnRvVXBwZXJDYXNlKCkuZW5kc1dpdGgoIlhNSSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiByZWFkVmVyc2lvbnNGcm9tWE1JRmlsZShmaWxlKTsKLQkJfSBlbHNlIGlmIChmaWxlLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpLmVuZHNXaXRoKCJYTUwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gcmVhZFZlcnNpb25zRnJvbVhNTEZpbGUoZmlsZSk7Ci0JCX0gZWxzZSB7Ci0JCQlNYXAgdmVyc2lvbnMgPSByZWFkVmVyc2lvbnNGcm9tWE1JRmlsZShmaWxlKTsKLQkJCWlmICh2ZXJzaW9ucyAhPSBudWxsKQotCQkJCXJldHVybiB2ZXJzaW9uczsKLQkJCXZlcnNpb25zID0gcmVhZFZlcnNpb25zRnJvbVhNTEZpbGUoZmlsZSk7Ci0JCQlpZiAodmVyc2lvbnMgIT0gbnVsbCkKLQkJCQlyZXR1cm4gdmVyc2lvbnM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSBmaWxlLCB3aWxsIGNvbXBhcmUgd2l0aCBjdXJyZW50IFhNTCBTY2hlbWEgdmVyc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4gbnVsbCBpZiBmaWxlIHRvb2wgdmVyc2lvbiBjYW4gbm90IGJlIGZvdW5kOyBhIFZlcnNpb25DaGVja0luZm8KLQkgKiAgICAgICAgIG9iamVjdCBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlcnNpb25DaGVja0luZm8gY2hlY2tYTUxWZXJzaW9uKEZpbGUgZmlsZSkgewotCQlNYXAgdmVyc2lvbk1hcCA9IFZlcnNpb25VdGlsLnJlYWRWZXJzaW9uc0Zyb21GaWxlKGZpbGUpOwotCQlpZiAodmVyc2lvbk1hcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCVZlcnNpb25DaGVja0luZm8gdmNpID0gbnVsbDsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRvb2xJRHNDaGVja0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIHRvb2xJRCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCWlmICh2ZXJzaW9uTWFwLmdldCh0b29sSUQpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHRvb2xWZXJzaW9uID0gKFN0cmluZykgdmVyc2lvbk1hcC5nZXQodG9vbElEKTsKLQkJCQkJdmNpID0gX2NoZWNrWE1MVmVyc2lvbih0b29sSUQsIHRvb2xWZXJzaW9uKTsKLQkJCQkJaWYgKHZjaSAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHZjaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVmVyc2lvbkNoZWNrSW5mbyBfY2hlY2tYTUxWZXJzaW9uKFN0cmluZyB0b29sSUQsCi0JCQlTdHJpbmcgdG9vbFZlcnNpb24pIHsKLQkJLy8gZ2V0IHRoZSBjbGFzcyB0aGF0IHN0b3JlcyBhbGwgdGhlIHZlcnNpb24gaW5mbyBmb3IgdGhpcyB0b29sIElECi0JCUVQRlZlcnNpb25zIHZlcnNpb25zID0gZ2V0VmVyc2lvbnModG9vbElEKTsKLQkJaWYgKHZlcnNpb25zICE9IG51bGwpIHsKLQkJCUVQRlZlcnNpb24gbWluQ3VyclZlcnNpb24gPSB2ZXJzaW9ucwotCQkJCQkuZ2V0TWluVG9vbFZlcnNpb25Gb3JDdXJyZW50WE1MU2NoZW1hVmVyc2lvbigpOwotCQkJaW50IHJlc3VsdCA9IG1pbkN1cnJWZXJzaW9uLmNvbXBhcmVUb29sVmVyc2lvblRvKG5ldyBWZXJzaW9uKAotCQkJCQl0b29sVmVyc2lvbikpOwotCQkJU3RyaW5nIGN1cnJlbnRNaW5Ub29sVmVyc2lvbiA9IG1pbkN1cnJWZXJzaW9uLmdldFRvb2xWZXJzaW9uKCkKLQkJCQkJLnRvU3RyaW5nKCk7Ci0JCQlyZXR1cm4gbmV3IFZlcnNpb25DaGVja0luZm8odG9vbElELCB0b29sVmVyc2lvbiwKLQkJCQkJY3VycmVudE1pblRvb2xWZXJzaW9uLCAtcmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIGZpbGUsIGNvbXBhcmVzIHdpdGggY3VycmVudCBsaWJyYXJ5IHNjaGVtYSB2ZXJzaW9uCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuIG51bGwgaWYgZmlsZSB0b29sIHZlcnNpb24gY2FuIG5vdCBiZSBmb3VuZDsgYSBWZXJzaW9uQ2hlY2tJbmZvCi0JICogICAgICAgICBvYmplY3Qgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBWZXJzaW9uQ2hlY2tJbmZvIGNoZWNrTGlicmFyeVZlcnNpb24oRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlLmdldE5hbWUoKS5lcXVhbHMoImxpYnJhcnkueG1pIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gY2hlY2sgbGlicmFyeSBleHRlbnNpb25zIGZpcnN0Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0b29sSURzQ2hlY2tMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyB0b29sSUQgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAobGliRXh0Q2hlY2tlcnMuZ2V0KHRvb2xJRCkgIT0gbnVsbCkgewotCQkJCQlWZXJzaW9uQ2hlY2tJbmZvIHZjaSA9IG51bGw7Ci0JCQkJCUlMaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrIGV4dENoZWNrID0gKElMaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrKSBsaWJFeHRDaGVja2VycwotCQkJCQkJCS5nZXQodG9vbElEKTsKLQkJCQkJdmNpID0gZXh0Q2hlY2suY2hlY2tMaWJyYXJ5VmVyc2lvbihmaWxlLmdldFBhcmVudEZpbGUoKSk7Ci0JCQkJCWlmICh2Y2kgIT0gbnVsbCkKLQkJCQkJCXJldHVybiB2Y2k7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCU1hcCB2ZXJzaW9uTWFwID0gVmVyc2lvblV0aWwucmVhZFZlcnNpb25zRnJvbUZpbGUoZmlsZSk7Ci0JCWlmICh2ZXJzaW9uTWFwID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgewotCQkJVmVyc2lvbkNoZWNrSW5mbyB2Y2kgPSBudWxsOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdG9vbElEc0NoZWNrTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgdG9vbElEID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHZlcnNpb25NYXAuZ2V0KHRvb2xJRCkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgdG9vbFZlcnNpb24gPSAoU3RyaW5nKSB2ZXJzaW9uTWFwLmdldCh0b29sSUQpOwotCQkJCQl2Y2kgPSBfY2hlY2tMaWJWZXJzaW9uKHRvb2xJRCwgdG9vbFZlcnNpb24pOwotCQkJCQlpZiAodmNpICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gdmNpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBWZXJzaW9uQ2hlY2tJbmZvIF9jaGVja0xpYlZlcnNpb24oU3RyaW5nIHRvb2xJRCwKLQkJCVN0cmluZyB0b29sVmVyc2lvbikgewotCQkvLyBnZXQgdGhlIGNsYXNzIHRoYXQgc3RvcmVzIGFsbCB0aGUgdmVyc2lvbiBpbmZvIGZvciB0aGlzIHRvb2wgSUQKLQkJRVBGVmVyc2lvbnMgdmVyc2lvbnMgPSBnZXRWZXJzaW9ucyh0b29sSUQpOwotCQlpZiAodmVyc2lvbnMgIT0gbnVsbCkgewotCQkJRVBGVmVyc2lvbiBtaW5DdXJyVmVyc2lvbiA9IHZlcnNpb25zCi0JCQkJCS5nZXRNaW5Ub29sVmVyc2lvbkZvckN1cnJlbnRMaWJyYXJ5VmVyc2lvbigpOwotCQkJaW50IHJlc3VsdCA9IG1pbkN1cnJWZXJzaW9uLmNvbXBhcmVUb29sVmVyc2lvblRvKG5ldyBWZXJzaW9uKAotCQkJCQl0b29sVmVyc2lvbikpOwotCQkJU3RyaW5nIGN1cnJlbnRNaW5Ub29sVmVyc2lvbiA9IG1pbkN1cnJWZXJzaW9uLmdldFRvb2xWZXJzaW9uKCkKLQkJCQkJLnRvU3RyaW5nKCk7Ci0JCQlyZXR1cm4gbmV3IFZlcnNpb25DaGVja0luZm8odG9vbElELCB0b29sVmVyc2lvbiwKLQkJCQkJY3VycmVudE1pblRvb2xWZXJzaW9uLCAtcmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCB0b29sSUQgdGhhdCBpcyBjaGVja2VkLiBJbiBtb3N0IGNhc2VzLCB0aGUgSUQgb2YgdGhlCi0JICogICAgICAgICBjdXJyZW50bHkgcnVubmluZyBhcHBsaWNhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByaW1hcnlUb29sSUQoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0b29sSURzQ2hlY2tMaXN0LmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgdG9vbCBJRCB0byB0aGUgb3JkZXIgb2YgdG9vbHMgdG8gY2hlY2suCi0JICogCi0JICogQHBhcmFtIHRvb2xJRAotCSAqICAgICAgICAgICAgdG9vbElEIHRvIGFkZAotCSAqIEBwYXJhbSB0b29sSURmb2xsb3dpbmcKLQkgKiAgICAgICAgICAgIGlmIG51bGwsIGFkZHMgdG9vbElEIHRvIGZyb250IG9mIGxpc3QuIG90aGVyd2lzZSwgYWRkcyB0b29sSUQKLQkgKiAgICAgICAgICAgIGJlZm9yZSB0aGUgc3BlY2lmaWVkIElECi0JICogQHJldHVybiBmYWxzZSBpZmYgdG9vbElEZm9sbG93aW5nIGlzIG5vdCBudWxsIGFuZCBjb3VsZCBub3QgYmUgZm91bmQgaW4KLQkgKiAgICAgICAgIGxpc3Q7IHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZFRvb2xJRChTdHJpbmcgdG9vbElELCBTdHJpbmcgdG9vbElEZm9sbG93aW5nKSB7Ci0JCWlmICh0b29sSURmb2xsb3dpbmcgIT0gbnVsbCkgewotCQkJaW50IGlkeCA9IHRvb2xJRHNDaGVja0xpc3QuaW5kZXhPZih0b29sSURmb2xsb3dpbmcpOwotCQkJaWYgKGlkeCAhPSAtMSkgewotCQkJCXRvb2xJRHNDaGVja0xpc3QuYWRkKGlkeCwgdG9vbElEKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXRvb2xJRHNDaGVja0xpc3QuYWRkKDAsIHRvb2xJRCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9WZXJzaW9uVXRpbC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9WZXJzaW9uVXRpbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGYyNmU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvVmVyc2lvblV0aWwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZlcnNpb25DaGVja2luZ0VuYWJsZWQ9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEzMzQ3Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGNvbW1vbiBlcnJvciBoYW5kbGluZywgbG9nZ2luZyBhbmQgdmVyc2lvbmluZyBzZXJ2aWNlcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0NvbW1hbmRMaW5lUnVuVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9Db21tYW5kTGluZVJ1blV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFlNWFhMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0NvbW1hbmRMaW5lUnVuVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBleGN1dGluZyBhIElDb21tYW5kTGluZVJ1bm5lciBvYmplY3QncyBleGVjdXRlIG1ldGhvZAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRMaW5lUnVuVXRpbCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQ29tbWFuZExpbmVSdW5VdGlsIGluc3RhbmNlID0gbmV3IENvbW1hbmRMaW5lUnVuVXRpbCgpOwotCXByaXZhdGUgYm9vbGVhbiBuZWVkVG9SdW4gPSBmYWxzZTsKLQkKLQlwdWJsaWMgc3RhdGljIENvbW1hbmRMaW5lUnVuVXRpbCBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQkKLQlwdWJsaWMgQ29tbWFuZExpbmVSdW5VdGlsKCkgewkJCi0JfQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKFN0cmluZ1tdIGFyZ3MpIHsKLQkJLy9Gb3IgZ2VuZXJhbCBjYXNlLCBhcmdzIHNob3VsZCBiZSBwYXJzZWQgaGVyZSB0byBjYWxsIG9uIHJpZ2h0IHJ1bm5lcklkLgotCQkvL2ZvciBub3csIGp1c3QgaGFyZCBjb2RlIGl0IHdpdGggImNvbW1hbmRMaW5lUGx1Z2luSW1wb3J0ZXIiCi0JCWV4ZWN1dGVDb21tYW5kUnVubmVyKGFyZ3MsICJjb21tYW5kTGluZVBsdWdpbkltcG9ydGVyIik7CS8vJE5PTi1OTFMtMSQgCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZUNvbW1hbmRSdW5uZXIoU3RyaW5nW10gYXJncywgU3RyaW5nIHJ1bm5lcklkKSB7Ci0JCUlDb21tYW5kTGluZVJ1bm5lciBydW5uZXIgPSBnZXRSdW5uZXIocnVubmVySWQpOwotCQlpZiAocnVubmVyICE9IG51bGwpIHsKLQkJCXJldHVybiBydW5uZXIuZXhlY3V0ZShhcmdzKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElDb21tYW5kTGluZVJ1bm5lciBnZXRSdW5uZXIoU3RyaW5nIGlkKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtCi0JCQkJLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5Ci0JCQkJLmdldEV4dGVuc2lvblBvaW50KAotCQkJCQkJIm9yZy5lY2xpcHNlLmVwZi5jb21tb24iLCAiY29tbWFuZExpbmVSdW5uZXJzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkJCQotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCVN0cmluZyBydW5uZXJJZCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJydW5uZXJJZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHJ1bm5lcklkID09IG51bGwpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXJ1bm5lcklkID0gcnVubmVySWQudHJpbSgpOwotCQkJCWlmICghIHJ1bm5lcklkLmVxdWFscyhpZCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChjbGFzc05hbWUgPT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRyaW0oKTsKLQkJCQl0cnkgewotCQkJCQlJQ29tbWFuZExpbmVSdW5uZXIgcnVubmVyID0gKElDb21tYW5kTGluZVJ1bm5lcikgYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQkJCXJldHVybiBydW5uZXI7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsJCQkJCQotCQkJCX0KLQkJCX0KLQkJfQkKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05lZWRUb1J1bigpIHsKLQkJcmV0dXJuIG5lZWRUb1J1bjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZWVkVG9SdW4oYm9vbGVhbiBuZWVkVG9SdW4pIHsKLQkJdGhpcy5uZWVkVG9SdW4gPSBuZWVkVG9SdW47Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEluc3RhbmNlKENvbW1hbmRMaW5lUnVuVXRpbCBpbnN0YW5jZSkgewotCQlDb21tYW5kTGluZVJ1blV0aWwuaW5zdGFuY2UgPSBpbnN0YW5jZTsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvQ29tbWFuZExpbmVSdW5uZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvQ29tbWFuZExpbmVSdW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkNzgwYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0NvbW1hbmRMaW5lUnVubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIEJhc2UgaW1wbGVtZW50YXRpb24gZm9yIElDb21tYW5kTGluZVJ1bm5lcgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRMaW5lUnVubmVyIGltcGxlbWVudHMgSUNvbW1hbmRMaW5lUnVubmVyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBGaWxlIGlucHV0RmlsZTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IENvbW1hbmRMaW5lUGx1Z2luSW1wb3J0ZXIuZXhlY3V0ZSwgYXJnczogIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGFyZ3NbIiArIGkgKyAiXTogIiArIGFyZ3NbaV0pOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChhcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoIi1iYXRjaCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoaSArIDEgPCBhcmdzLmxlbmd0aCkgewotCQkJCQlTdHJpbmcgcGF0aCA9IGFyZ3NbaSArIDFdOwotCQkJCQlpbnB1dEZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJCQkJaWYgKCFpbnB1dEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCVN0cmluZyBtc2cgPSAiQ2Fubm90IGZpbmUgdGhlIGZpbGU6ICIgKyBwYXRoOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yPiAiICsgbXNnKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkJCQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgRmlsZSBnZXRJbnB1dEZpbGUoKSB7Ci0JCXJldHVybiBpbnB1dEZpbGU7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9GaWxlVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9GaWxlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmY3NGIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvRmlsZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmlvLkNoYXJCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uTWFwcGVkQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlTG9jazsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5PdmVybGFwcGluZ0ZpbGVMb2NrRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXREZWNvZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ29kaW5nRXJyb3JBY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgbWFuYWdpbmcgZGlyZWN0b3JpZXMgYW5kIGZpbGVzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlVXRpbCB7Ci0KLQkvKioKLQkgKiBQbGF0Zm9ybS1zcGVjaWZpYyBsaW5lIHNlcGFyYXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NFUCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUGxhdGZvcm0tc3BlY2lmaWMgZmlsZSBzZXBhcmF0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9TRVAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBsYXRmb3JtLXNwZWNpZmljIGxpbmUgc2VwYXJhdG9yIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSU5FX1NFUF9MRU5HVEggPSBMSU5FX1NFUC5sZW5ndGgoKTsKLQotCS8qKgotCSAqIFVOQyBwYXRoIHByZWZpeC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkNfUEFUSF9QUkVGSVggPSAiXFxcXCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFVOQyBwYXRoIHByZWZpeCBsZW5ndGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5DX1BBVEhfUFJFRklYX0xFTkdUSCA9IFVOQ19QQVRIX1BSRUZJWC5sZW5ndGgoKTsKLQotCS8qKgotCSAqIElTTy04ODU5LTEgZW5jb2RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RJTkdfSVNPXzg4NTlfMSA9ICJJU08tODg1OS0xIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVVRGLTggZW5jb2RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RJTkdfVVRGXzggPSAiVVRGLTgiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLiBBbGwKLQkgKiBtZXRob2RzIGluIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHN0YXRpYy4KLQkgKi8KLQlwcml2YXRlIEZpbGVVdGlsKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggZm9yIGEgZmlsZSBvciBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIGEgZmlsZSBvciBkaXJlY3RvcnkKLQkgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlIG9yIGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFic29sdXRlUGF0aChGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkucmVwbGFjZSgnXFwnLCAnLycpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggZm9yIGEgZmlsZSBvciBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgcGF0aCB0byBhIGZpbGUgb3IgZGlyZWN0b3J5Ci0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlIG9yIGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFic29sdXRlUGF0aChTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gZ2V0QWJzb2x1dGVQYXRoKG5ldyBGaWxlKHBhdGgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIGZvciBhIFVSTC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICBhIFVSTAotCSAqIEByZXR1cm4gdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIFVSTAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFic29sdXRlUGF0aChVUkwgdXJsKSB7Ci0JCVN0cmluZyBwYXRoTmFtZSA9IHVybC5nZXRGaWxlKCkuc3Vic3RyaW5nKDEpOwotCQlTdHJpbmcgcmVzdWx0ID0gTmV0VXRpbC5kZWNvZGVVcmwocGF0aE5hbWUsIG51bGwpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgYSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHBhdGggbmFtZQotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHBhcmVudCBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXJlbnREaXJlY3RvcnkoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIChuZXcgRmlsZShwYXRoKSkuZ2V0UGFyZW50KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZSBuYW1lIGFuZCBleHRlbnNpb24gZnJvbSBhIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgcGF0aCBuYW1lCi0JICogQHJldHVybiB0aGUgZmlsZSBuYW1lIGluY2x1ZGluZyB0aGUgZmlsZSBleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlTmFtZShTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gZ2V0RmlsZU5hbWUocGF0aCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZSBuYW1lIGZyb20gYSBwYXRoLCB3aXRoIG9yIHdpdGhvdXQgdGhlIGZpbGUgZXh0ZW5zaW9uLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHBhdGggbmFtZQotCSAqIEBwYXJhbSB3aXRoRXh0ZW5zaW9uCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgaW5jbHVkZSB0aGUgZmlsZSBleHRlbnNpb24gaW4gdGhlCi0JICogICAgICAgICAgICByZXN1bHQKLQkgKiBAcmV0dXJuIHRoZSBmaWxlIG5hbWUgd2l0aCBvciB3aXRob3V0IHRoZSBmaWxlIGV4dGVuc2lvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVOYW1lKFN0cmluZyBwYXRoLCBib29sZWFuIHdpdGhFeHRlbnNpb24pIHsKLQkJU3RyaW5nIG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5yZXBsYWNlKCdcXCcsICcvJyk7Ci0KLQkJaW50IHByZWZpeExlbmd0aCA9IDA7Ci0JCWlmIChub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKE5ldFV0aWwuRklMRV9VUklfUFJFRklYKSkgewotCQkJcHJlZml4TGVuZ3RoID0gTmV0VXRpbC5GSUxFX1VSSV9QUkVGSVhfTEVOR1RIOwotCQl9IGVsc2UgaWYgKG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgoTmV0VXRpbC5IVFRQX1VSSV9QUkVGSVgpKSB7Ci0JCQlwcmVmaXhMZW5ndGggPSBOZXRVdGlsLkhUVFBfVVJJX1BSRUZJWF9MRU5HVEg7Ci0JCX0KLQotCQlTdHJpbmcgZmlsZU5hbWU7Ci0JCWludCBpbmRleCA9IG5vcm1hbGl6ZWRQYXRoLmxhc3RJbmRleE9mKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGluZGV4IDwgcHJlZml4TGVuZ3RoKSB7Ci0JCQlmaWxlTmFtZSA9IG5vcm1hbGl6ZWRQYXRoLnN1YnN0cmluZyhwcmVmaXhMZW5ndGgpOwotCQl9IGVsc2UgewotCQkJZmlsZU5hbWUgPSBwYXRoLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQl9Ci0KLQkJaWYgKHdpdGhFeHRlbnNpb24pIHsKLQkJCXJldHVybiBmaWxlTmFtZTsKLQkJfQotCi0JCWluZGV4ID0gZmlsZU5hbWUuaW5kZXhPZigiLiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAoaW5kZXggPiAwKSA/IGZpbGVOYW1lLnN1YnN0cmluZygwLCBpbmRleCkgOiBmaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWxhdGl2ZSBwYXRoIG9mIGEgcGF0aCBmcm9tIGEgYmFzZSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHBhdGgKLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBiYXNlIHBhdGgKLQkgKiBAcmV0dXJuIGEgcmVsYXRpdmUgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlbGF0aXZlUGF0aFRvQmFzZShGaWxlIHBhdGgsIEZpbGUgYmFzZVBhdGgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBkaXIgPSBwYXRoLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCVN0cmluZyBiYXNlRGlyID0gYmFzZVBhdGgudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOwotCQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWlmIChkaXIuaW5kZXhPZihiYXNlRGlyKSA9PSAwKSB7Ci0JCQkJU3RyaW5nIGRlbHRhID0gZGlyLnN1YnN0cmluZyhiYXNlRGlyLmxlbmd0aCgpKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhLmxlbmd0aCgpOyBpKyspIHsKLQkJCQkJaWYgKGRlbHRhLmNoYXJBdChpKSA9PSAnLycpIHsKLQkJCQkJCXJlc3VsdC5hcHBlbmQoIi4uLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlbGF0aXZlUGF0aChGaWxlIHBhdGgsIEZpbGUgYmFzZVBhdGgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBkaXIgPSBwYXRoLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCVN0cmluZyBiYXNlRGlyID0gYXBwZW5kU2VwYXJhdG9yKGJhc2VQYXRoLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKSwKLQkJCQkJIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXdoaWxlIChkaXIuaW5kZXhPZihiYXNlRGlyKSA9PSAtMSkgewotCQkJCWJhc2VQYXRoID0gYmFzZVBhdGguZ2V0UGFyZW50RmlsZSgpOwotCQkJCWJhc2VEaXIgPSBhcHBlbmRTZXBhcmF0b3IoYmFzZVBhdGgudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpLAotCQkJCQkJIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQoIi4uLyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoZGlyLmluZGV4T2YoYmFzZURpcikgPT0gMCkgewotCQkJCVN0cmluZyBkZWx0YSA9IGRpci5zdWJzdHJpbmcoYmFzZURpci5sZW5ndGgoKSk7Ci0JCQkJcmVzdWx0LmFwcGVuZChkZWx0YSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEFwcGVuZHMgdGhlIHBsYXRmb3JtIHNwZWNpZmljIHBhdGggc2VwYXJhdG9yIHRvIHRoZSBlbmQgb2YgYSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHBhdGggbmFtZQotCSAqIEByZXR1cm4gdGhlIHBhdGggbmFtZSBhcHBlbmRlZCB3aXRoIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBwYXRoIHNlcGFyYXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGVuZFNlcGFyYXRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gYXBwZW5kU2VwYXJhdG9yKHBhdGgsIEZpbGUuc2VwYXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmRzIHRoZSBnaXZlbiBwYXRoIHNlcGFyYXRvciB0byB0aGUgZW5kIG9mIGEgcGF0aAotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHBhdGggbmFtZQotCSAqIEBwYXJhbSBzZXBhcmF0b3IKLQkgKiAgICAgICAgICAgIGEgcGF0aCBzZXBhcmF0b3IKLQkgKiBAcmV0dXJuIHRoZSBwYXRoIG5hbWUgYXBwZW5kZWQgd2l0aCB0aGUgZ2l2ZW4gc2VwYXJhdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXBwZW5kU2VwYXJhdG9yKFN0cmluZyBwYXRoLCBTdHJpbmcgc2VwYXJhdG9yKSB7Ci0JCXJldHVybiBwYXRoLmVuZHNXaXRoKHNlcGFyYXRvcikgPyBwYXRoIDogcGF0aCArIHNlcGFyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBlbmRpbmcgcGF0aCBzZXBhcmF0b3IgZnJvbSBhIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgcGF0aCBuYW1lCi0JICogQHJldHVybiB0aGUgcGF0aCBuYW1lIG1pbnVzIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBwYXRoIHNlcGFyYXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZVNlcGFyYXRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gcGF0aC5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikgPyBwYXRoLnN1YnN0cmluZygwLAotCQkJCXBhdGgubGVuZ3RoKCkgLSAxKSA6IHBhdGg7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZW5kaW5nIHBhdGggc2VwYXJhdG9yIGZyb20gYSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHBhdGggbmFtZQotCSAqIEByZXR1cm4gdGhlIHBhdGggbmFtZSBtaW51cyB0aGUgcGF0aCBzZXBhcmF0b3IgIlxcIiBvciAiLyIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVBbGxTZXBhcmF0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIHBhdGguZW5kc1dpdGgoIi8iKSB8fCBwYXRoLmVuZHNXaXRoKCJcXCIpID8gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDEpIDogcGF0aDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZW5kaW5nIHBhdGggc2VwYXJhdG9yIGZyb20gYSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHBhdGggbmFtZQotCSAqIEBwYXJhbSBzZXBhcmF0b3IKLQkgKiAgICAgICAgICAgIGEgcGF0aCBzZXBhcmF0b3IKLQkgKiBAcmV0dXJuIHRoZSBwYXRoIG5hbWUgbWludXMgdGhlIHNlcGFyYXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZVNlcGFyYXRvcihTdHJpbmcgcGF0aCwgU3RyaW5nIHNlcGFyYXRvcikgewotCQlyZXR1cm4gcGF0aC5lbmRzV2l0aChzZXBhcmF0b3IpID8gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDEpCi0JCQkJOiBwYXRoOwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2VzIHRoZSBmaWxlIG5hbWUgd2l0aCBhbm90aGVyIGluIGEgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSBwYXRoIG5hbWUKLQkgKiBAcGFyYW0gb2xkRmlsZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBvbGQgZmlsZSBuYW1lCi0JICogQHBhcmFtIG5ld0ZpbGVOYW1lCi0JICogICAgICAgICAgICB0aGUgbmV3IGZpbGUgbmFtZQotCSAqIEByZXR1cm4gdGhlIG5ldyBwYXRoIG5hbWUgd2l0aCB0aGUgbmV3IGZpbGUgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VGaWxlTmFtZShTdHJpbmcgcGF0aCwgU3RyaW5nIG9sZEZpbGVOYW1lLAotCQkJU3RyaW5nIG5ld0ZpbGVOYW1lKSB7Ci0JCWludCBpbmRleCA9IHBhdGgubGFzdEluZGV4T2Yob2xkRmlsZU5hbWUpOwotCQlyZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgaW5kZXgpICsgbmV3RmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZXMgdGhlIGZpbGUgZXh0ZW5zaW9uIHdpdGggYW5vdGhlciBpbiBhIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgcGF0aCBuYW1lCi0JICogQHBhcmFtIG9sZEZpbGVFeHQKLQkgKiAgICAgICAgICAgIHJoZSBvbGQgZmlsZSBleHRlbnNpb24KLQkgKiBAcGFyYW0gbmV3RmlsZUV4dAotCSAqICAgICAgICAgICAgdGhlIG5ldyBmaWxlIGV4dGVuc2lvbgotCSAqIEByZXR1cm4gdGhlIG5ldyBwYXRoIHdpdGggdGhlIG5ldyBmaWxlIGV4dGVuc2lvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VFeHRlbnNpb24oU3RyaW5nIHBhdGgsIFN0cmluZyBvbGRFeHQsCi0JCQlTdHJpbmcgbmV3RXh0KSB7Ci0JCWludCBpbmRleCA9IHBhdGgubGFzdEluZGV4T2Yob2xkRXh0KTsKLQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIGluZGV4KSArIG5ld0V4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgcGF0aCBvZiBhIGJhc2UgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSBiYXNlIHBhdGggbmFtZQotCSAqIEBwYXJhbSBsb2NhbGVTdHIKLQkgKiAgICAgICAgICAgIGEgbG9jYWxlIHN0cmluZwotCSAqIEByZXR1cm4gdGhlIGxvY2FsZS1zcGVjaWZpYyBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYWxlUGF0aChTdHJpbmcgcGF0aCwgU3RyaW5nIGxvY2FsZVN0cikgewotCQlpZiAoU3RyVXRpbC5pc0JsYW5rKGxvY2FsZVN0cikpIHsKLQkJCXJldHVybiBwYXRoOwotCQl9Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKHBhdGgpOwotCQlyZXR1cm4gcmVwbGFjZUZpbGVOYW1lKHBhdGgsIGZpbGVOYW1lLCBsb2NhbGVTdHIgKyAiLyIgKyBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgcGF0aCBvZiBhIGJhc2UgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSBiYXNlIHBhdGggbmFtZQotCSAqIEBwYXJhbSBsb2NhbGUKLQkgKiAgICAgICAgICAgIGEgbG9jYWxlIG9iamVjdAotCSAqIEByZXR1cm4gdGhlIGxvY2FsZS1zcGVjaWZpYyBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYWxlUGF0aChTdHJpbmcgcGF0aCwgTG9jYWxlIGxvY2FsZSkgewotCQlyZXR1cm4gbG9jYWxlID09IG51bGwgPyBwYXRoIDogZ2V0TG9jYWxlUGF0aChwYXRoLCBsb2NhbGUudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIHRoZSBnaXZlbiB0ZXh0IHRvIGEgdGV4dCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqICAgICAgICAgICAgdGhlIHRhcmdldCBmaWxlIG5hbWUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgdG8gd3JpdGUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiB0ZXh0IGlzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5IHRvCi0JICogICAgICAgICBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHdyaXRlRmlsZShTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyB0ZXh0KSB7Ci0JCUZpbGVXcml0ZXIgd3JpdGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKGZpbGVuYW1lKTsKLQkJCXdyaXRlci53cml0ZSh0ZXh0KTsKLQkJCXdyaXRlci5mbHVzaCgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAod3JpdGVyICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQl3cml0ZXIuY2xvc2UoKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFdyaXRlIHRoZSBnaXZlbiB0ZXh0IHRvIGEgZmlsZSB3aXRoIFVURi04IGVuY29kaW5nLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqICAgICAgICAgICAgdGhlIHRhcmdldCBmaWxlIG5hbWUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgdG8gd3JpdGUKLQkgKiBAcGFyYW0gYXBwZW5kCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgYXBwZW5kIHRoZSB0ZXh0IHRvIHRoZSBlbmQgb2YgdGhlCi0JICogICAgICAgICAgICBmaWxlLCBpZiA8Y29kZT5mYWxzZTwvY29kZT4sIG92ZXJyaWRlIHRoZSBmaWxlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gdGV4dCBpcyB3cml0dGVuIHN1Y2Nlc3NmdWxseSB0bwotCSAqICAgICAgICAgZmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB3cml0ZVVURjhGaWxlKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIHdyaXRlVVRGOEZpbGUoZmlsZW5hbWUsIHRleHQsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSB0aGUgZ2l2ZW4gdGV4dCB0byBhIGZpbGUgd2l0aCBVVEYtOCBlbmNvZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgZmlsZSBuYW1lCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHRvIHdyaXRlCi0JICogQHBhcmFtIGFwcGVuZAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGFwcGVuZCB0aGUgdGV4dCB0byB0aGUgZW5kIG9mIHRoZQotCSAqICAgICAgICAgICAgZmlsZSwgaWYgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvdmVycmlkZSB0aGUgZmlsZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHRleHQgaXMgd3JpdHRlbiBzdWNjZXNzZnVsbHkgdG8KLQkgKiAgICAgICAgIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gd3JpdGVVVEY4RmlsZShTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyB0ZXh0LAotCQkJYm9vbGVhbiBhcHBlbmQpIHsKLQkJT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlciA9IG51bGw7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gZmlsZU91dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmaWxlT3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUsIGFwcGVuZCk7Ci0JCQl3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGZpbGVPdXQsIEVOQ09ESU5HX1VURl84KTsKLQkJCXdyaXRlci53cml0ZSh0ZXh0KTsKLQkJCXdyaXRlci5mbHVzaCgpOwotCQkJZmlsZU91dC5mbHVzaCgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHdyaXRlciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZpbGVPdXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWZpbGVPdXQuY2xvc2UoKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFdyaXRlIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBVUkkgdG8gYW4gb3V0cHV0IHN0cmVhbS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICB0aGUgc291cmNlIFVSSQotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgc3RyZWFtCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlRmlsZShTdHJpbmcgdXJpLCBPdXRwdXRTdHJlYW0gb3V0cHV0KQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnB1dCA9IE5ldFV0aWwuZ2V0SW5wdXRTdHJlYW0odXJpKTsKLQkJCWludCBieXRlc1JlYWQ7Ci0JCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbNDA5Nl07Ci0JCQl3aGlsZSAoKGJ5dGVzUmVhZCA9IGlucHV0LnJlYWQoYnVmLCAwLCA0MDk2KSkgPiAwKSB7Ci0JCQkJb3V0cHV0LndyaXRlKGJ1ZiwgMCwgYnl0ZXNSZWFkKTsKLQkJCX0KLQkJCW91dHB1dC5mbHVzaCgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogV3JpdGUgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIFVSSSB0byBhIDxjb2RlPlByaW50V3JpdGVyPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICB0aGUgc291cmNlIFVSSQotCSAqIEBwYXJhbSB3cml0ZXIKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5QcmludFdyaXRlcjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlRmlsZShTdHJpbmcgdXJpLCBQcmludFdyaXRlciBwdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJbnB1dFN0cmVhbVJlYWRlciBpbnB1dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnB1dCA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihOZXRVdGlsLmdldElucHV0U3RyZWFtKHVyaSkpOwotCQkJaW50IGNoYXJzUmVhZDsKLQkJCWNoYXJbXSBidWYgPSBuZXcgY2hhcls0MDk2XTsKLQkJCXdoaWxlICgoY2hhcnNSZWFkID0gaW5wdXQucmVhZChidWYsIDAsIDQwOTYpKSA+IDApIHsKLQkJCQlwdy53cml0ZShidWYsIDAsIGNoYXJzUmVhZCk7Ci0JCQl9Ci0JCQlwdy5mbHVzaCgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVjdXJzaXZlbHkgZGVsZXRlIGFsbCBzdWItZGlyZWN0b3JpZXMgYW5kIGZpbGVzIGluIGEgZGlyZWN0b3J5IGV4Y2VwdAotCSAqIGZvciB0aGUgZGlyZWN0b3J5IGl0c2VsZi4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHN1Yi1kaXJlY3RvcmllcyBhbmQgZmlsZXMKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkZWxldGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlQWxsRmlsZXMoU3RyaW5nIGRpcikgewotCQlib29sZWFuIHJldCA9IHRydWU7Ci0JCUZpbGUgdGFyZ2V0RGlyID0gbmV3IEZpbGUoZGlyKTsKLQkJRmlsZVtdIGZpbGVzID0gdGFyZ2V0RGlyLmxpc3RGaWxlcygpOwotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCXJldCA9IHJldCAmJiBkZWxldGVBbGxGaWxlcyhmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJfQotCQkJCXJldCA9IHJldCAmJiBmaWxlc1tpXS5kZWxldGUoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogUmVjdXJzaXZlbHkgZGVsZXRlIGFsbCBzdWItZGlyZWN0b3JpZXMgYW5kIGZpbGVzIGluIGEgZGlyZWN0b3J5IGV4Y2VwdAotCSAqIGZvciB0aGUgZGlyZWN0b3J5IGl0c2VsZiBhbmQgdGhlIHNwZWNpZmllZCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBkaXIKLQkgKiAgICAgICAgICAgIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgc3ViLWRpcmVjdG9yaWVzIGFuZCBmaWxlcwotCSAqIEBwYXJhbSBmaWxlc05vdFRvRGVsZXRlCi0JICogICAgICAgICAgICBhIGxpc3Qgb2YgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIG5vdCBiZSBkZWxldGVkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBkZWxldGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlQWxsRmlsZXMoU3RyaW5nIGRpciwgTGlzdDxGaWxlPiBmaWxlc05vdFRvRGVsZXRlKSB7Ci0JCWJvb2xlYW4gcmV0ID0gdHJ1ZTsKLQkJRmlsZSB0YXJnZXREaXIgPSBuZXcgRmlsZShkaXIpOwotCQlGaWxlW10gZmlsZXMgPSB0YXJnZXREaXIubGlzdEZpbGVzKCk7Ci0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCFmaWxlc05vdFRvRGVsZXRlLmNvbnRhaW5zKGZpbGVzW2ldKSkgewotCQkJCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCQkJcmV0ID0gcmV0Ci0JCQkJCQkJCSYmIGRlbGV0ZUFsbEZpbGVzKGZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpLAotCQkJCQkJCQkJCWZpbGVzTm90VG9EZWxldGUpOwotCQkJCQl9Ci0JCQkJCXJldCA9IHJldCAmJiBmaWxlc1tpXS5kZWxldGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIENvcGllcyB0aGUgY29udGVudCBvZiB0aGUgc291cmNlIGZpbGUgdG8gdGhlIHRhcmdldCBmaWxlLiBXaWxsIG92ZXJ3cml0ZQotCSAqIGFuIGV4aXN0aW5nIGZpbGUgaWYgaXQgaGFzIHdyaXRlIHBlcm1pc3Npb24KLQkgKiAKLQkgKiBAcGFyYW0gc3JjRmlsZQotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSBmaWxlIG9yIHBhdGgKLQkgKiBAcGFyYW0gdGd0RmlsZQotCSAqICAgICAgICAgICAgdGhlIHRhcmdldCBmaWxlIG9yIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29weUZpbGUoRmlsZSBzcmNGaWxlLCBGaWxlIHRndEZpbGUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBjb3B5ZmlsZShzcmNGaWxlLCB0Z3RGaWxlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIHRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZSB0byB0aGUgdGFyZ2V0IGZpbGUuCi0JICogCi0JICogQHBhcmFtIHNyY0ZpbGVOYW1lCi0JICogICAgICAgICAgICB0aGUgc291cmNlIGZpbGUgbmFtZQotCSAqIEBwYXJhbSB0Z3RGaWxlTmFtZQotCSAqICAgICAgICAgICAgdGhlIHRhcmdldCBmaWxlIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29weUZpbGUoU3RyaW5nIHNyY0ZpbGVOYW1lLCBTdHJpbmcgdGd0RmlsZU5hbWUpIHsKLQkJcmV0dXJuIGNvcHlGaWxlKG5ldyBGaWxlKHNyY0ZpbGVOYW1lKSwgbmV3IEZpbGUodGd0RmlsZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgb25lIGZpbGUgdG8gYW5vdGhlci4KLQkgKiA8cD4KLQkgKiBJZiBib3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJlIGRpcmVjdG9yaWVzLCBkZWxlZ2F0ZXMgdG8KLQkgKiBjb3B5ZGlyZWN0b3J5KCkuCi0JICogPHA+Ci0JICogc291cmNlIG11c3QgZXhpc3QgYW5kIGJlIHJlYWRhYmxlCi0JICogPHA+Ci0JICogY2Fubm90IGNvcHkgYSBkaXJlY3RvcnkgdG8gYSBmaWxlCi0JICogPHA+Ci0JICogd2lsbCBub3QgY29weSBpZiB0aW1lc3RhbXBzIGFuZCBmaWxlc2l6ZSBtYXRjaCwgd2lsbCBvdmVyd3JpdGUgb3RoZXJ3aXNlCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSBmaWxlCi0JICogQHBhcmFtIGRlc3QKLQkgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBmaWxlCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGNvcHkgb3BlcmF0aW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb3B5ZmlsZShGaWxlIHNvdXJjZSwgRmlsZSBkZXN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoc291cmNlLmVxdWFscyhkZXN0KSkKLQkJCS8vIGRvIG5vdCBjb3B5IGVxdWFsIGZpbGVzCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKCFzb3VyY2UuZXhpc3RzKCkgfHwgIXNvdXJjZS5jYW5SZWFkKCkpIHsKLQkJCS8vIHNvdXJjZSBkb2VzIG5vdCBleGlzdCBvciBjYW4ndCByZWFkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZGVzdC5leGlzdHMoKSAmJiAhZGVzdC5jYW5Xcml0ZSgpKSB7Ci0JCQkvLyBkZXN0IGV4aXN0cyBhbmQgY2Fubm90IGJlIHdyaXR0ZW4KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChzb3VyY2UuaXNEaXJlY3RvcnkoKSkgewotCQkJaWYgKGRlc3QuaXNGaWxlKCkpIHsKLQkJCQkvLyBjYW4ndCBjb3B5IGEgZGlyZWN0b3J5IHRvIGEgZmlsZQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gZGVsZWdhdGUgdG8gY29weWRpcmVjdG9yeQotCQkJCXJldHVybiBjb3B5ZGlyZWN0b3J5KHNvdXJjZSwgZGVzdCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBzb3VyY2UgaXMgYSBmaWxlCi0JCQlpZiAoZGVzdC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJU3RyaW5nIHNvdXJjZUZpbGVOYW1lID0gc291cmNlLmdldE5hbWUoKTsKLQkJCQlyZXR1cm4gY29weWZpbGUoc291cmNlLCBuZXcgRmlsZShkZXN0LCBzb3VyY2VGaWxlTmFtZSkpOwotCQkJfQotCQkJLy8gYm90aCBzb3VyY2UgYW5kIGRlc3QgYXJlIGZpbGVzCi0JCQlib29sZWFuIG5lZWRDb3B5ID0gdHJ1ZTsKLQkJCWlmIChkZXN0LmV4aXN0cygpKSB7Ci0JCQkJbmVlZENvcHkgPSAoZGVzdC5sYXN0TW9kaWZpZWQoKSAhPSBzb3VyY2UubGFzdE1vZGlmaWVkKCkpCi0JCQkJCQl8fCAoZGVzdC5sZW5ndGgoKSAhPSBzb3VyY2UubGVuZ3RoKCkpOwotCQkJfQotCi0JCQlpZiAobmVlZENvcHkpIHsKLQkJCQlGaWxlSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOwotCQkJCUZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbnVsbDsKLQotCQkJCXRyeSB7Ci0JCQkJCWlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2UpOwotCQkJCQlGaWxlQ2hhbm5lbCBpbiA9IGlucHV0LmdldENoYW5uZWwoKTsKLQkJCQkJaWYgKCFkZXN0LmV4aXN0cygpKSB7Ci0JCQkJCQlkZXN0LmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQkJCQkJfQotCQkJCQlvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0KTsKLQkJCQkJRmlsZUNoYW5uZWwgb3V0ID0gb3V0cHV0LmdldENoYW5uZWwoKTsKLQkJCQkJb3V0LnRyYW5zZmVyRnJvbShpbiwgMCwgc291cmNlLmxlbmd0aCgpKTsKLQkJCQkJZGVzdC5zZXRMYXN0TW9kaWZpZWQoc291cmNlLmxhc3RNb2RpZmllZCgpKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaW5wdXQuY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAob3V0cHV0ICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJb3V0cHV0LmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIGRpZCBub3QgY29weQotCQkJCS8vIHJldHVybiB0cnVlIGJlY2F1c2UgZGVzdCBmaWxlIGlzIHNhbWUgYXMgc291cmNlCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIGNvbnRlbnQgb2YgYSBkaXJlY3RvcnkgdG8gYW5vdGhlciBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIHNyY0Rpck5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgZGlyZWN0b3J5IG5hbWUKLQkgKiBAcGFyYW0gdGd0RGlyTmFtZQotCSAqICAgICAgICAgICAgdGhlIHRhcmdldCBkaXJlY3RvcnkgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb3B5RGlyKEZpbGUgc3JjRGlyLCBGaWxlIHRndERpcikgewotCQl0cnkgewotCQkJcmV0dXJuIGNvcHlkaXJlY3Rvcnkoc3JjRGlyLCB0Z3REaXIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIGNvbnRlbnQgb2YgYSBkaXJlY3RvcnkgdG8gYW5vdGhlciBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIHNyY0Rpck5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgZGlyZWN0b3J5IG5hbWUKLQkgKiBAcGFyYW0gdGd0RGlyTmFtZQotCSAqICAgICAgICAgICAgdGhlIHRhcmdldCBkaXJlY3RvcnkgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb3B5RGlyKFN0cmluZyBzcmNEaXJOYW1lLCBTdHJpbmcgdGd0RGlyTmFtZSkgewotCQlyZXR1cm4gY29weURpcihuZXcgRmlsZShzcmNEaXJOYW1lKSwgbmV3IEZpbGUodGd0RGlyTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBvbmUgZGlyZWN0b3J5IHRvIGFub3RoZXIgLSBvcGVyYXRlcyBPTkxZIG9uIGRpcmVjdG9yaWVzLgotCSAqIDxwPgotCSAqIEJvdGggc291cmNlIGFuZCBkZXN0IG11c3QgZXhpc3QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb3B5ZGlyZWN0b3J5KEZpbGUgc291cmNlRGlyLCBGaWxlIGRlc3REaXIpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoIXNvdXJjZURpci5leGlzdHMoKSB8fCAhZGVzdERpci5leGlzdHMoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCFzb3VyY2VEaXIuaXNEaXJlY3RvcnkoKSB8fCAhZGVzdERpci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlGaWxlW10gZmlsZXMgPSBzb3VyY2VEaXIubGlzdEZpbGVzKCk7Ci0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gY2FsYyBkZXN0aW5hdGlvbiBuYW1lCi0JCQkJU3RyaW5nIGRlc3ROYW1lID0gZGVzdERpcgotCQkJCQkJKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJKyBmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKS5zdWJzdHJpbmcoCi0JCQkJCQkJCXNvdXJjZURpci5nZXRBYnNvbHV0ZVBhdGgoKS5sZW5ndGgoKSArIDEpOwotCQkJCWlmIChmaWxlc1tpXS5pc0ZpbGUoKSkgewotCQkJCQkvLyBjb3B5IHRoZSBmaWxlCi0JCQkJCWNvcHlmaWxlKGZpbGVzW2ldLCBuZXcgRmlsZShkZXN0TmFtZSkpOwotCQkJCX0gZWxzZSBpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCQkvLyBjb3B5IGRpcmVjdG9yeSByZWN1cnNpdmVseQotCQkJCQlGaWxlIGRlc3RGaWxlID0gbmV3IEZpbGUoZGVzdE5hbWUpOwotCQkJCQlkZXN0RmlsZS5ta2RpcnMoKTsKLQkJCQkJY29weWRpcmVjdG9yeShmaWxlc1tpXSwgZGVzdEZpbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyBmb3Igc29tZSByZWFzb24sIHRoaXMgZ3V5IGxvY2tzIHRoZSBmaWxlLCBpZiB5b3UgdHJ5IHRvIHVwZGF0ZSB0aGUgZmlsZSwKLQkvLyBnb3QgdGhlIGZvbGxvd2luZyBleGNlcHRpb24KLQkvLyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjoKLQkvLyAoVGhlIHJlcXVlc3RlZCBvcGVyYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZCBvbiBhIGZpbGUgd2l0aCBhIHVzZXItbWFwcGVkCi0JLy8gc2VjdGlvbiBvcGVuKQotCS8vIG5lZWQgdG8gaGFuZGxlIGxhdGVyCi0JcHVibGljIHN0YXRpYyBDaGFyQnVmZmVyIHJlYWRGaWxlKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZUlucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQkJQ2hhckJ1ZmZlciBjaGFyQnVmZmVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJCUZpbGVDaGFubmVsIGluQ2hhbm5lbCA9IGlucHV0LmdldENoYW5uZWwoKTsKLQkJCWludCBsZW5ndGggPSAoaW50KSBpbkNoYW5uZWwuc2l6ZSgpOwotCQkJTWFwcGVkQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gaW5DaGFubmVsLm1hcCgKLQkJCQkJRmlsZUNoYW5uZWwuTWFwTW9kZS5SRUFEX09OTFksIDAsIGxlbmd0aCk7Ci0JCQlDaGFyc2V0IGNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoRU5DT0RJTkdfSVNPXzg4NTlfMSk7Ci0JCQlDaGFyc2V0RGVjb2RlciBkZWNvZGVyID0gY2hhcnNldC5uZXdEZWNvZGVyKCk7Ci0JCQljaGFyQnVmZmVyID0gZGVjb2Rlci5kZWNvZGUoYnl0ZUJ1ZmZlcik7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hhckJ1ZmZlcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciByZWFkRmlsZShGaWxlIGZpbGUsIFN0cmluZyBlbmNvZGluZykKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7Ci0JCUlucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0JCWludCBzaXplOwotCQl0cnkgewotCQkJQ2hhcnNldCBjcyA9IENoYXJzZXQuZm9yTmFtZShlbmNvZGluZyk7Ci0JCQlDaGFyc2V0RGVjb2RlciBjc2QgPSBjcy5uZXdEZWNvZGVyKCk7Ci0JCQljc2Qub25NYWxmb3JtZWRJbnB1dChDb2RpbmdFcnJvckFjdGlvbi5SRVBMQUNFKTsKLQkJCWNoYXJbXSBidWZmZXIgPSBuZXcgY2hhclsxMDI0XTsKLQkJCWZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCQlyZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZmlzLCBjc2QpOwotCQkJd2hpbGUgKChzaXplID0gcmVhZGVyLnJlYWQoYnVmZmVyLCAwLCAxMDI0KSkgPiAwKSB7Ci0JCQkJcmVzdWx0LmFwcGVuZChidWZmZXIsIDAsIHNpemUpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGVuY29kaW5nKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZmlzICE9IG51bGwpIHsKLQkJCQlmaXMuY2xvc2UoKTsKLQkJCX0KLQotCQkJaWYgKHJlYWRlciAhPSBudWxsKSB7Ci0JCQkJcmVhZGVyLmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGxvbmcgZ2V0U2l6ZShGaWxlIGZpbGUpIHsKLQkJRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQkJcmV0dXJuIGZpcy5nZXRDaGFubmVsKCkuc2l6ZSgpOwkJCQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlmaXMuY2xvc2UoKTsKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlcyBKYXZhIDEuNCdzIEZpbGVMb2NrIGNsYXNzIHRvIHRlc3QgZm9yIGEgZmlsZSBsb2NrCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmlsZUxvY2tlZChGaWxlIGZpbGUpIHsKLQkJYm9vbGVhbiBpc0xvY2tlZCA9IGZhbHNlOwotCQlGaWxlT3V0cHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQkJRmlsZUxvY2sgbG9jayA9IG51bGw7Ci0KLQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJdHJ5IHsKLQkJCWlucHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0JCQlGaWxlQ2hhbm5lbCBmaWxlQ2hhbm5lbCA9IGlucHV0LmdldENoYW5uZWwoKTsKLQotCQkJbG9jayA9IGZpbGVDaGFubmVsLnRyeUxvY2soKTsKLQotCQkJaWYgKGxvY2sgPT0gbnVsbCkKLQkJCQlpc0xvY2tlZCA9IHRydWU7Ci0JCQllbHNlCi0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFNlY3VyaXR5RXhjZXB0aW9uKQotCQkJCS8vIENhbid0IHdyaXRlIHRvIGZpbGUuCi0JCQkJaXNMb2NrZWQgPSB0cnVlOwotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbikKLQkJCQlpc0xvY2tlZCA9IGZhbHNlOwotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKQotCQkJCWlzTG9ja2VkID0gdHJ1ZTsKLQkJCS8vIE92ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb24gbWVhbnMgdGhhdCB0aGlzIEpWTSBoYXMgaXQgbG9ja2VkCi0JCQkvLyB0aGVyZWZvcmUgaXQgaXMgbm90IGxvY2tlZCB0byB1cwotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIE92ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb24pCi0JCQkJaXNMb2NrZWQgPSBmYWxzZTsKLQkJCS8vIENvdWxkIG5vdCBnZXQgYSBsb2NrIGZvciBzb21lIG90aGVyIHJlYXNvbi4KLQkJCWVsc2UKLQkJCQlpc0xvY2tlZCA9IHRydWU7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpc0xvY2tlZDsKLQl9Ci0KLQkvKioKLQkgKiBMb2NrcyBhIGZpbGUgZm9yIHRoZSBjdXJyZW50IEpWTS4gV2lsbCBjcmVhdGUgdGhlIGZpbGUgaWYgaXQgZG9lcyBub3QKLQkgKiBleGlzdAotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybiBhIEZpbGVMb2NrIG9iamVjdCwgb3IgbnVsbCBpZiBmaWxlIGNvdWxkIG5vdCBiZSBsb2NrZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGVMb2NrIGxvY2tGaWxlKEZpbGUgZmlsZSkgewotCQlGaWxlT3V0cHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQkJRmlsZUxvY2sgbG9jayA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnB1dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQkJRmlsZUNoYW5uZWwgZmlsZUNoYW5uZWwgPSBpbnB1dC5nZXRDaGFubmVsKCk7Ci0JCQlsb2NrID0gZmlsZUNoYW5uZWwudHJ5TG9jaygpOwotCi0JCQlpZiAobG9jay5pc1ZhbGlkKCkpCi0JCQkJcmV0dXJuIGxvY2s7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBDb3VsZCBub3QgZ2V0IGEgbG9jayBmb3Igc29tZSByZWFzb24uCi0JCQlyZXR1cm4gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGlucHV0ICE9IG51bGwgJiYgKGxvY2sgPT0gbnVsbCB8fCAhbG9jay5pc1ZhbGlkKCkpKSB7Ci0JCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgZmlsZXMgaW4gYSBzcGVjaWZpZWQgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYWJzb2x1dGUgcGF0aCBvZiBhIGZvbGRlcgotCSAqIEBwYXJhbSBmaWxlTGlzdAotCSAqICAgICAgICAgICAgYSBsaXN0IHRvIGNvbGxlY3QgdGhlIGZpbGVzCi0JICogQHBhcmFtIHJlY3Vyc2l2ZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGZpbmQgdGhlIGZpbGVzIGluIHN1YiBmb2xkZXJzIGFzIHdlbGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0QWxsRmlsZXMoRmlsZSBwYXRoLCBMaXN0PEZpbGU+IGZpbGVMaXN0LAotCQkJYm9vbGVhbiByZWN1cnNpdmUpIHsKLQkJaWYgKHBhdGguaXNEaXJlY3RvcnkoKSkgewotCQkJRmlsZVtdIGZpbGVzID0gcGF0aC5saXN0RmlsZXMoKTsKLQkJCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZmlsZXNbaV0uaXNGaWxlKCkpIHsKLQkJCQkJCWZpbGVMaXN0LmFkZChmaWxlc1tpXSk7Ci0JCQkJCX0gZWxzZSBpZiAocmVjdXJzaXZlKSB7Ci0JCQkJCQlnZXRBbGxGaWxlcyhmaWxlc1tpXSwgZmlsZUxpc3QsIHJlY3Vyc2l2ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIGRpcmVjdG9yeSBhbmQgZXh0ZW5zaW9uLCByZXR1cm5zIGFsbCBmaWxlcyAocmVjdXJzaXZlbHkpIHdob3NlCi0JICogZXh0ZW5zaW9uIHN0YXJ0cyB3aXRoIGEgZ2l2ZW4gZXh0ZW5zaW9uLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBhIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBleHRlbnNpb24KLQkgKiAgICAgICAgICAgIGEgZmlsZSBleHRlbnNpb24KLQkgKiBAcmV0dXJuIGEgY29sbGVjaXRvbiBvZiA8Y29kZT5GaWxlPC9jb2RlPiB3aXRoIHRoZSBnaXZlbiBleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8RmlsZT4gZmlsZUxpc3QoRmlsZSBmLCBTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0JCWV4dGVuc2lvbiA9IGV4dGVuc2lvbi50b1VwcGVyQ2FzZSgpOwotCQlMaXN0PEZpbGU+IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0JCXRyeSB7Ci0JCQlpZiAoZi5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJU3RyaW5nW10gZmxpc3QgPSBmLmxpc3QoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsaXN0Lmxlbmd0aDsgKytpKSB7Ci0JCQkJCUZpbGUgZmMgPSBuZXcgRmlsZShmLmdldFBhdGgoKSwgZmxpc3RbaV0pOwotCQkJCQlyZXR1cm5MaXN0LmFkZEFsbChmaWxlTGlzdChmYywgZXh0ZW5zaW9uKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBmLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpOwotCQkJCQlpZiAobmFtZS5sYXN0SW5kZXhPZigiLiIpICE9IC0xKSAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAobmFtZQotCQkJCQkJCQkuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpLnN0YXJ0c1dpdGgoZXh0ZW5zaW9uKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJcmV0dXJuTGlzdC5hZGQoZik7Ci0JCQkJCQl9Ci0JCQkJfSBlbHNlCi0JCQkJCXJldHVybkxpc3QuYWRkKGYpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gcmV0dXJuTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIGRpcmVjdG9yeSBhbmQgZXh0ZW5zaW9uLCByZXR1cm5zIGFsbCBmaWxlcyAocmVjdXJzaXZlbHkpIHdob3NlCi0JICogZXh0ZW5zaW9uIGRvZXMgbm90IHN0YXJ0cyB3aXRoIGEgZ2l2ZW4gZXh0ZW5zaW9uLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBhIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBleHRlbnNpb24KLQkgKiAgICAgICAgICAgIGEgZmlsZSBleHRlbnNpb24KLQkgKiBAcmV0dXJuIGEgY29sbGVjaXRvbiBvZiA8Y29kZT5GaWxlPC9jb2RlPiB3aXRob3V0IHRoZSBnaXZlbiBleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8RmlsZT4gZmlsZUxpc3RFeGNsdWRlRXh0KEZpbGUgZiwgU3RyaW5nIGV4dGVuc2lvbikgewotCQlMaXN0PEZpbGU+IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0JCXRyeSB7Ci0JCQlpZiAoZi5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJU3RyaW5nW10gZmxpc3QgPSBmLmxpc3QoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsaXN0Lmxlbmd0aDsgKytpKSB7Ci0JCQkJCUZpbGUgZmMgPSBuZXcgRmlsZShmLmdldFBhdGgoKSwgZmxpc3RbaV0pOwotCQkJCQlyZXR1cm5MaXN0LmFkZEFsbChmaWxlTGlzdEV4Y2x1ZGVFeHQoZmMsIGV4dGVuc2lvbikpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gZi5nZXROYW1lKCk7Ci0JCQkJCWlmIChuYW1lLmxhc3RJbmRleE9mKCIuIikgIT0gLTEpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmICghKG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpLnN0YXJ0c1dpdGgoZXh0ZW5zaW9uKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXJldHVybkxpc3QuYWRkKGYpOwotCQkJCQkJfQotCQkJCX0gZWxzZQotCQkJCQlyZXR1cm5MaXN0LmFkZChmKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgZmlsZSBwYXRocyBpbiB0aGUgc3BlY2lmaWVkIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgsCi0JICogICAgICAgICAgICBhYnNvbHV0ZSBwYXRoIG9mIGEgZm9sZGVyCi0JICogQHBhcmFtIHJlY3Vyc2l2ZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGZpbmQgdGhlIGZpbGVzIGluIHN1YiBmb2xkZXJzIGFzIHdlbGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFycmF5TGlzdDxTdHJpbmc+IGdldEFsbEZpbGVBYnNvbHV0ZVBhdGhzKEZpbGUgcGF0aCwKLQkJCWJvb2xlYW4gcmVjdXJzaXZlKSB7Ci0JCUFycmF5TGlzdDxGaWxlPiBmaWxlcyA9IG5ldyBBcnJheUxpc3Q8RmlsZT4oKTsKLQkJZ2V0QWxsRmlsZXMocGF0aCwgZmlsZXMsIHJlY3Vyc2l2ZSk7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IHBhdGhzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVN0cmluZyBhYnNQYXRoID0gKChGaWxlKSBmaWxlcy5nZXQoaSkpLmdldEFic29sdXRlUGF0aCgpOwotCQkJcGF0aHMuYWRkKGFic1BhdGgpOwotCQl9Ci0JCXJldHVybiBwYXRoczsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlcyBhIGZpbGUgZnJvbSBhIGRpcmVjdG9yeSB0byBhbm90aGVyLgotCSAqIDxwPgotCSAqIEF0dGVtcHRzIHRvIHJlbmFtZSB0aGUgZmlsZSBmaXJzdC4gSWYgdGhhdCBmYWlscywgd2lsbCBjb3B5IHRoZQotCSAqIHNvdXJjZUZpbGUgdG8gZGVzdEZpbGUgYW5kIGRlbGV0ZSB0aGUgc291cmNlRmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlRmlsZQotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSBmaWxlCi0JICogQHBhcmFtIGRlc3RGaWxlCi0JICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gZmlsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbW92ZUZpbGUoRmlsZSBzb3VyY2VGaWxlLCBGaWxlIGRlc3RGaWxlKSB7Ci0JCXRyeSB7Ci0JCQlkb01vdmVGaWxlKHNvdXJjZUZpbGUsIGRlc3RGaWxlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkb01vdmVGaWxlKEZpbGUgc291cmNlRmlsZSwgRmlsZSBkZXN0RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gVHJ5IHRvIHJlbmFtZSB0aGUgc291cmNlIGZpbGUgdG8gdGhlIGRlc3RpbmF0aW9uIGZpbGUuCi0JCWlmICghc291cmNlRmlsZS5yZW5hbWVUbyhkZXN0RmlsZSkpIHsKLQkJCS8vIFRyeSB0byBjb3B5IHRoZSBzb3VyY2UgZmlsZSB0byB0aGUgZGVzdGluYXRpb24gZmlsZSBhbmQKLQkJCS8vIGRlbGV0ZQotCQkJLy8gdGhlIHNvdXJjZSBmaWxlLgotCQkJY29weWZpbGUoc291cmNlRmlsZSwgZGVzdEZpbGUpOwotCQkJc291cmNlRmlsZS5kZWxldGUoKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0kxOG5VdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0kxOG5VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZjY2YjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9JMThuVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBIZWxwZXIgdXRpbHRpaWVzIGZvciBoYW5kbGluZyBpbnRlcm5hdGlvbmFsaXphdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJMThuVXRpbCB7Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4gQWxsCi0JICogbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHNob3VsZCBiZSBzdGF0aWMuCi0JICovCi0JcHJpdmF0ZSBJMThuVXRpbCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VCdW5kbGUKLQkgKiAgICAgICAgICAgIEEgcmVzb3VyY2UgYnVuZGxlLgotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIEEgcmVzb3VyY2Uga2V5LgotCSAqIEByZXR1cm4gQSBsb2NhbGl6ZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSwgU3RyaW5nIGtleSkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiAnWycgKyBrZXkgKyAnXSc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBrZXkgYW5kIGZvcm1hdHRlZAotCSAqIHdpdGggYSBnaXZlbiBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlQnVuZGxlCi0JICogICAgICAgICAgICBBIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgQW4gb2JqZWN0LgotCSAqIEByZXR1cm4gQSBmb3JtYXR0ZWQgbG9jYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXRTdHJpbmcoUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUsCi0JCQlTdHJpbmcga2V5LCBPYmplY3QgZGF0YSkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbG9jYWxpemVkU3RyID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQKLQkJCQkJCS5mb3JtYXQobG9jYWxpemVkU3RyLCBuZXcgT2JqZWN0W10geyBkYXRhIH0pOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gJ1snICsga2V5ICsgJ10nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2Uga2V5IGFuZCBmb3JtYXR0ZWQKLQkgKiB3aXRoIHR3byBnaXZlbiBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlQnVuZGxlCi0JICogICAgICAgICAgICBBIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YTEKLQkgKiAgICAgICAgICAgIEFuIG9iamVjdC4KLQkgKiBAcGFyYW0gZGF0YTIKLQkgKiAgICAgICAgICAgIEFuIG9iamVjdC4KLQkgKiBAcmV0dXJuIEEgZm9ybWF0dGVkIGxvY2FsaXplZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0U3RyaW5nKFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlLAotCQkJU3RyaW5nIGtleSwgT2JqZWN0IGRhdGExLCBPYmplY3QgZGF0YTIpIHsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGxvY2FsaXplZFN0ciA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChsb2NhbGl6ZWRTdHIsIG5ldyBPYmplY3RbXSB7IGRhdGExLAotCQkJCQkJZGF0YTIgfSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiAnWycgKyBrZXkgKyAnXSc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBrZXkgYW5kIGZvcm1hdHRlZAotCSAqIHdpdGggYSBnaXZlbiBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlQnVuZGxlCi0JICogICAgICAgICAgICBBIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgQW4gYXJyYXkgb2Ygb2JqZWN0cy4KLQkgKiBAcmV0dXJuIEEgZm9ybWF0dGVkIGxvY2FsaXplZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0U3RyaW5nKFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlLAotCQkJU3RyaW5nIGtleSwgT2JqZWN0W10gZGF0YSkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbG9jYWxpemVkU3RyID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGxvY2FsaXplZFN0ciwgZGF0YSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiAnWycgKyBrZXkgKyAnXSc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIGludGVnZXIgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2Uga2V5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBidW5kbGUuCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBrZXkuCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZQotCSAqICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSByZXNvdXJjZSBrZXkgY2Fubm90IGJlCi0JICogICAgICAgICAgICBsb2NhdGVkLgotCSAqIEByZXR1cm4gQSBsb2NhbGl6ZWQgaW50ZXJnZXIgdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50KFN0cmluZyBpbnRTdHJpbmcsCi0JCQlpbnQgZGVmYXVsdFZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoaW50U3RyaW5nICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChpbnRTdHJpbmcpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHZlcnNpb24gb2YgYSBVUyBFbmdsaXNoIHJlc291cmNlIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgcmVzb3VyY2UgZmlsZS4KLQkgKiBAcGFyYW0gbG9jYWxlCi0JICogICAgICAgICAgICBBIGxvY2FsZS4KLQkgKiBAcmV0dXJuIFRoZSBsb2NhbGl6ZWQgcmVzb3VyY2UgZmlsZS4gSWYgbm9uZSBleGlzdHMsIHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2FsaXplZEZpbGUoU3RyaW5nIHBhdGgsIExvY2FsZSBsb2NhbGUpIHsKLQkJaWYgKGxvY2FsZS5lcXVhbHMoTG9jYWxlLlVTKSB8fCBwYXRoID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gQnVpbGQgdGhlIGxvY2FsZSBzdHJpbmcgYXJyYXkuIFRoaXMgaXMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlCi0JCS8vIGxvY2FsaXplZCBmaWxlIG5hbWVzLgotCQlTdHJpbmcgbGFuZ3VhZ2UgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKLQkJU3RyaW5nIGNvdW50cnkgPSBsb2NhbGUuZ2V0Q291bnRyeSgpOwotCQlTdHJpbmcgdmFyaWFudCA9IGxvY2FsZS5nZXRWYXJpYW50KCk7Ci0KLQkJU3RyaW5nW10gbG9jYWxlU3RycyA9IG5ldyBTdHJpbmdbM107Ci0JCWlmICh2YXJpYW50ICE9IG51bGwgJiYgdmFyaWFudC5sZW5ndGgoKSA+IDApIHsKLQkJCWxvY2FsZVN0cnNbMF0gPSBsb2NhbGUudG9TdHJpbmcoKTsKLQkJfQotCQlpZiAoY291bnRyeSAhPSBudWxsICYmIGNvdW50cnkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlsb2NhbGVTdHJzWzFdID0gbGFuZ3VhZ2UgKyAiXyIgKyBjb3VudHJ5OyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxhbmd1YWdlICE9IG51bGwpIHsKLQkJCWxvY2FsZVN0cnNbMl0gPSBsYW5ndWFnZTsKLQkJfQotCi0JCVN0cmluZyBkaXIgPSBwYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJU3RyaW5nIGZpbGVOYW1lOwotCi0JCWludCBwYXRoSW5kZXggPSBkaXIubGFzdEluZGV4T2YoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocGF0aEluZGV4ID4gMCkgewotCQkJZGlyID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aEluZGV4ICsgMSk7Ci0JCQlmaWxlTmFtZSA9IHBhdGguc3Vic3RyaW5nKHBhdGhJbmRleCArIDEpOwotCQl9IGVsc2UgewotCQkJZmlsZU5hbWUgPSBkaXI7Ci0JCQlkaXIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJU3RyaW5nIGZpbGVFeHQgPSAiIjsgLy8kTk9OLU5MUy0xJAkJCi0JCWludCBleHRJbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGV4dEluZGV4ID4gMCkgewotCQkJZmlsZUV4dCA9IGZpbGVOYW1lLnN1YnN0cmluZyhleHRJbmRleCk7Ci0JCQlmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBleHRJbmRleCk7Ci0JCX0KLQotCQlmaWxlTmFtZSA9IGRpciArIGZpbGVOYW1lICsgIl8iOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gTG9vayBmb3IgdGhlIGxvY2FsaXplZCBmaWxlLgotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJaWYgKGxvY2FsZVN0cnNbaV0gIT0gbnVsbCkgewotCQkJCS8vIEdldHMgdGhlIGxvY2FsaXplZCBwYXRoIG5hbWUuCi0JCQkJU3RyaW5nIGZuYW1lID0gZmlsZU5hbWUgKyBsb2NhbGVTdHJzW2ldICsgZmlsZUV4dDsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmbmFtZSk7Ci0JCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJcmV0dXJuIGZuYW1lOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvSUNvbW1hbmRMaW5lUnVubmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0lDb21tYW5kTGluZVJ1bm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzQ3MzFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvSUNvbW1hbmRMaW5lUnVubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgZXhjdXRpbmcgYSBjb21tYW5kIGxpbmUKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbW1hbmRMaW5lUnVubmVyIHsKLQlib29sZWFuIGV4ZWN1dGUoU3RyaW5nW10gYXJncyk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0ltYWdlVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9JbWFnZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY3MGJhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0ltYWdlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuRm9udDsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljczJEOwotaW1wb3J0IGphdmEuYXd0LkltYWdlOwotaW1wb3J0IGphdmEuYXd0Lk1lZGlhVHJhY2tlcjsKLWltcG9ydCBqYXZhLmF3dC5mb250LkZvbnRSZW5kZXJDb250ZXh0OwotaW1wb3J0IGphdmEuYXd0LmZvbnQuTGluZUJyZWFrTWVhc3VyZXI7Ci1pbXBvcnQgamF2YS5hd3QuZm9udC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IGphdmEuYXd0LmZvbnQuVGV4dExheW91dDsKLWltcG9ydCBqYXZhLmF3dC5nZW9tLlBvaW50MkQ7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKLWltcG9ydCBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yOwotaW1wb3J0IGphdmEudGV4dC5BdHRyaWJ1dGVkU3RyaW5nOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgY3JlYXRpbmcgaW1hZ2UgZmlsZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VVdGlsIHsKLQotCS8vIFRoZSBCdWZmZXJlZEltYWdlIGNhY2hlLgotCXByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBCdWZmZXJlZEltYWdlPiBpbWFnZUNhY2hlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCdWZmZXJlZEltYWdlPigpOwotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQuIEFsbAotCSAqIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBzaG91bGQgYmUgc3RhdGljLgotCSAqLwotCXByaXZhdGUgSW1hZ2VVdGlsKCkgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSA8Y29kZT5CdWZmZXJlZEltYWdlPC9jb2RlPiBmcm9tIHRoZSBnaXZlbiBpbWFnZSBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGUKLQkgKiAgICAgICAgICAgIGFuIGltYWdlIGZpbGUKLQkgKiBAcGFyYW0gYwotCSAqICAgICAgICAgICAgYW4gQVdUIGNvbXBvbmVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQnVmZmVyZWRJbWFnZSBnZXRCdWZmZXJlZEltYWdlKFN0cmluZyBpbWFnZUZpbGUsIENvbXBvbmVudCBjKSB7Ci0JCWlmIChpbWFnZUZpbGUgPT0gbnVsbCB8fCBjID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQnVmZmVyZWRJbWFnZSBidWZmZXJlZEltYWdlID0gKEJ1ZmZlcmVkSW1hZ2UpIGltYWdlQ2FjaGUuZ2V0KGltYWdlRmlsZSk7Ci0JCWlmIChidWZmZXJlZEltYWdlICE9IG51bGwpIHsKLQkJCXJldHVybiBidWZmZXJlZEltYWdlOwotCQl9Ci0KLQkJSW1hZ2UgaW1hZ2UgPSBjLmdldFRvb2xraXQoKS5nZXRJbWFnZShpbWFnZUZpbGUpOwotCQlNZWRpYVRyYWNrZXIgdHJhY2tlciA9IG5ldyBNZWRpYVRyYWNrZXIoYyk7Ci0JCXRyYWNrZXIuYWRkSW1hZ2UoaW1hZ2UsIDApOwotCQl0cnkgewotCQkJdHJhY2tlci53YWl0Rm9yQWxsKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCWJ1ZmZlcmVkSW1hZ2UgPSBuZXcgQnVmZmVyZWRJbWFnZShpbWFnZS5nZXRXaWR0aChjKSwKLQkJCQlpbWFnZS5nZXRIZWlnaHQoYyksIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQik7Ci0KLQkJR3JhcGhpY3MyRCBnMmQgPSBidWZmZXJlZEltYWdlLmNyZWF0ZUdyYXBoaWNzKCk7Ci0JCWcyZC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIGMpOwotCQlpbWFnZUNhY2hlLnB1dChpbWFnZUZpbGUsIGJ1ZmZlcmVkSW1hZ2UpOwotCi0JCXJldHVybiBidWZmZXJlZEltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGltYWdlIGlzIGxvYWRlZCBzdWNjZXNzZnVsbHkuCi0JICogCi0JICogQHBhcmFtIGltYWdlCi0JICogICAgICAgICAgICBhbiBBV1QgaW1hZ2UKLQkgKiBAcGFyYW0gYwotCSAqICAgICAgICAgICAgYW4gQVdUIGNvbXBvbmVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB3YWl0Rm9ySW1hZ2UoSW1hZ2UgaW1hZ2UsIENvbXBvbmVudCBjKSB7Ci0JCU1lZGlhVHJhY2tlciB0cmFja2VyID0gbmV3IE1lZGlhVHJhY2tlcihjKTsKLQkJdHJhY2tlci5hZGRJbWFnZShpbWFnZSwgMCk7Ci0JCXRyeSB7Ci0JCQl0cmFja2VyLndhaXRGb3JBbGwoKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJfQotCQlyZXR1cm4gKCF0cmFja2VyLmlzRXJyb3JBbnkoKSk7Ci0JfQotCi0JLyoqCi0JICogRHJhd3MgdGhlIGdpdmVuIHRleHQuCi0JICogCi0JICogQHBhcmFtIGcyZAotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPkdyYXBoaWNzMkQ8L2NvZGU+IGNvbnRleHQKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgdG8gYmUgcmVuZGVyZWQKLQkgKiBAcGFyYW0gZm9udAotCSAqICAgICAgICAgICAgdGhlIGZvbnQgdXNlZCBmb3IgcmVuZGVyaW5nIHRoZSB0ZXh0Ci0JICogQHBhcmFtIGNvbG9yCi0JICogICAgICAgICAgICB0aGUgY29sb3IgdXNlZCBmb3IgcmVuZGVyaW5nIHRoZSB0ZXh0Ci0JICogQHBhcmFtIHgKLQkgKiAgICAgICAgICAgIHRoZSBob3Jpem9udGFsIGNvb3JkaW5hdGUgdXNlZCBmb3IgcmVuZGVyaW5nIHRoZSB0ZXh0Ci0JICogQHBhcmFtIHkKLQkgKiAgICAgICAgICAgIHRoZSB2ZXJ0aWNhbGNvb3JkaW5hdGUgdXNlZCBmb3IgcmVuZGVyaW5nIHRoZSB0ZXh0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRyYXdUZXh0KEdyYXBoaWNzMkQgZzJkLCBTdHJpbmcgdGV4dCwgRm9udCBmb250LAotCQkJQ29sb3IgY29sb3IsIGludCB4LCBpbnQgeSkgewotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWcyZC5zZXRDb2xvcihjb2xvcik7Ci0JCUZvbnRSZW5kZXJDb250ZXh0IGZyYyA9IGcyZC5nZXRGb250UmVuZGVyQ29udGV4dCgpOwotCQlUZXh0TGF5b3V0IHRleHRsYXlvdXQgPSBuZXcgVGV4dExheW91dCh0ZXh0LCBmb250LCBmcmMpOwotCQl0ZXh0bGF5b3V0LmRyYXcoZzJkLCB4LCB5KTsKLQl9Ci0KLQkvKioKLQkgKiBEcmF3cyB0aGUgZ2l2ZW4gdGV4dCBhbmQgd3JhcHMgaXQgYmFzZWQgb24gdGhlIGdpdmVuIHdpZHRoLgotCSAqIAotCSAqIEBwYXJhbSBnMmQKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5HcmFwaGljczJEPC9jb2RlPiBjb250ZXh0Ci0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHRvIGJlIHJlbmRlcmVkCi0JICogQHBhcmFtIGZvbnQKLQkgKiAgICAgICAgICAgIHRoZSBmb250IHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgdGV4dAotCSAqIEBwYXJhbSBjb2xvcgotCSAqICAgICAgICAgICAgdGhlIGNvbG9yIHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgdGV4dAotCSAqIEBwYXJhbSB4Ci0JICogICAgICAgICAgICB0aGUgaG9yaXpvbnRhbCBjb29yZGluYXRlIHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgdGV4dAotCSAqIEBwYXJhbSB5Ci0JICogICAgICAgICAgICB0aGUgdmVydGljYWxjb29yZGluYXRlIHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgdGV4dAotCSAqIEBwYXJhbSB3aWR0aAotCSAqICAgICAgICAgICAgdGhlIG1heGltdW0gd2lkdGggdXNlZCBmb3Igd3JhcHBpbmcgdGhlIHRleHQKLQkgKiBAcGFyYW0gbWF4TGluZQotCSAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmUgb2Ygd3JhcHBlZCB0ZXh0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRyYXdUZXh0KEdyYXBoaWNzMkQgZzJkLCBTdHJpbmcgdGV4dCwgRm9udCBmb250LAotCQkJQ29sb3IgY29sb3IsIGludCB4LCBpbnQgeSwgZmxvYXQgd2lkdGgsIGludCBtYXhMaW5lKSB7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmxvYXQgbWF4V3JhcFdpZHRoID0gd2lkdGggLSAxMDsKLQkJZzJkLnNldENvbG9yKGNvbG9yKTsKLQkJUG9pbnQyRC5GbG9hdCBwZW4gPSBuZXcgUG9pbnQyRC5GbG9hdCh4LCB5KTsKLQkJTWFwPFRleHRBdHRyaWJ1dGUsIEZvbnQ+IGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxUZXh0QXR0cmlidXRlLCBGb250PigpOwotCQlhdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLkZPTlQsIGZvbnQpOwotCQlBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IgdGV4dEl0ZXJhdG9yID0gbmV3IEF0dHJpYnV0ZWRTdHJpbmcodGV4dCwKLQkJCQlhdHRyaWJ1dGVzKS5nZXRJdGVyYXRvcigpOwotCQlGb250UmVuZGVyQ29udGV4dCBmcmMgPSBnMmQuZ2V0Rm9udFJlbmRlckNvbnRleHQoKTsKLQkJTGluZUJyZWFrTWVhc3VyZXIgbWVhc3VyZXIgPSBuZXcgTGluZUJyZWFrTWVhc3VyZXIodGV4dEl0ZXJhdG9yLCBmcmMpOwotCQlpbnQgbGluZSA9IDE7Ci0JCXdoaWxlIChsaW5lIDw9IG1heExpbmUpIHsKLQkJCVRleHRMYXlvdXQgbGF5b3V0ID0gbWVhc3VyZXIubmV4dExheW91dChtYXhXcmFwV2lkdGgpOwotCQkJaWYgKGxheW91dCA9PSBudWxsKQotCQkJCWJyZWFrOwotCQkJcGVuLnkgKz0gbGF5b3V0LmdldEFzY2VudCgpOwotCQkJZmxvYXQgZHggPSAwOwotCQkJaWYgKGxheW91dC5pc0xlZnRUb1JpZ2h0KCkpIHsKLQkJCQlkeCA9ICh3aWR0aCAtIGxheW91dC5nZXRBZHZhbmNlKCkpOwotCQkJfQotCQkJbGF5b3V0LmRyYXcoZzJkLCBwZW4ueCArIGR4IC8gMiwgcGVuLnkpOwotCQkJcGVuLnkgKz0gbGF5b3V0LmdldERlc2NlbnQoKSArIGxheW91dC5nZXRMZWFkaW5nKCkgLSAxOwotCQkJbGluZSsrOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL01hdGhVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL01hdGhVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMDc0ZmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9NYXRoVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBwZXJmb3JtaW5nIG1hdGggb3BlcmF0aW9ucy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1hdGhVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBjZWlsMTAwMChsb25nIGwpIHsKLQkJcmV0dXJuIChsIC0gKGwgJiA3KSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL05ldFV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvTmV0VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDJkMTUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvTmV0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7Ci0KLS8qKgotICogSW1wbGVtZW50cyBhIHV0aWxpdHkgY2xhc3MgZm9yIG1hbmFnaW5nIFVSTHMgYW5kIFVSSXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTmV0VXRpbCB7Ci0KLQkvKioKLQkgKiBGSUxFIHNjaGVtZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGSUxFX1NDSEVNRSA9ICJmaWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRmlsZSBVUkkgcHJlZml4LgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZJTEVfVVJJX1BSRUZJWCA9IEZJTEVfU0NIRU1FICsgIjovIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRmlsZSBVUkkgcHJlZml4IHNpemUuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRklMRV9VUklfUFJFRklYX0xFTkdUSCA9IEZJTEVfVVJJX1BSRUZJWC5sZW5ndGgoKTsKLQotCS8qKgotCSAqIEhUVFAgc2NoZW1lLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEhUVFBfU0NIRU1FID0gImh0dHAiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBIVFRQIFVSSSBwcmVmaXguCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSFRUUF9VUklfUFJFRklYID0gSFRUUF9TQ0hFTUUgKyAiOi8vIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSFRUUCBVUkkgcHJlZml4IHNpemUuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSFRUUF9VUklfUFJFRklYX0xFTkdUSCA9IEhUVFBfVVJJX1BSRUZJWC5sZW5ndGgoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJFRklYXzIgPSAiZmlsZTovLyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJFRklYXzMgPSAiZmlsZTovLy8iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIHRhYmxlIG9mIGhleCB2YWx1ZXMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gSEVYX1ZBTFVFUyA9IHsKLQkJCSIlMDAiLCAiJTAxIiwgIiUwMiIsICIlMDMiLCAiJTA0IiwgIiUwNSIsICIlMDYiLCAiJTA3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTA4IiwgIiUwOSIsICIlMEEiLCAiJTBCIiwgIiUwQyIsICIlMEQiLCAiJTBFIiwgIiUwRiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiUxMCIsICIlMTEiLCAiJTEyIiwgIiUxMyIsICIlMTQiLCAiJTE1IiwgIiUxNiIsICIlMTciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlMTgiLCAiJTE5IiwgIiUxQSIsICIlMUIiLCAiJTFDIiwgIiUxRCIsICIlMUUiLCAiJTFGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTIwIiwgIiUyMSIsICIlMjIiLCAiJTIzIiwgIiUyNCIsICIlMjUiLCAiJTI2IiwgIiUyNyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiUyOCIsICIlMjkiLCAiJTJBIiwgIiUyQiIsICIlMkMiLCAiJTJEIiwgIiUyRSIsICIlMkYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlMzAiLCAiJTMxIiwgIiUzMiIsICIlMzMiLCAiJTM0IiwgIiUzNSIsICIlMzYiLCAiJTM3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTM4IiwgIiUzOSIsICIlM0EiLCAiJTNCIiwgIiUzQyIsICIlM0QiLCAiJTNFIiwgIiUzRiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU0MCIsICIlNDEiLCAiJTQyIiwgIiU0MyIsICIlNDQiLCAiJTQ1IiwgIiU0NiIsICIlNDciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlNDgiLCAiJTQ5IiwgIiU0QSIsICIlNEIiLCAiJTRDIiwgIiU0RCIsICIlNEUiLCAiJTRGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTUwIiwgIiU1MSIsICIlNTIiLCAiJTUzIiwgIiU1NCIsICIlNTUiLCAiJTU2IiwgIiU1NyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU1OCIsICIlNTkiLCAiJTVBIiwgIiU1QiIsICIlNUMiLCAiJTVEIiwgIiU1RSIsICIlNUYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlNjAiLCAiJTYxIiwgIiU2MiIsICIlNjMiLCAiJTY0IiwgIiU2NSIsICIlNjYiLCAiJTY3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTY4IiwgIiU2OSIsICIlNkEiLCAiJTZCIiwgIiU2QyIsICIlNkQiLCAiJTZFIiwgIiU2RiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU3MCIsICIlNzEiLCAiJTcyIiwgIiU3MyIsICIlNzQiLCAiJTc1IiwgIiU3NiIsICIlNzciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlNzgiLCAiJTc5IiwgIiU3QSIsICIlN0IiLCAiJTdDIiwgIiU3RCIsICIlN0UiLCAiJTdGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTgwIiwgIiU4MSIsICIlODIiLCAiJTgzIiwgIiU4NCIsICIlODUiLCAiJTg2IiwgIiU4NyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU4OCIsICIlODkiLCAiJThBIiwgIiU4QiIsICIlOEMiLCAiJThEIiwgIiU4RSIsICIlOEYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlOTAiLCAiJTkxIiwgIiU5MiIsICIlOTMiLCAiJTk0IiwgIiU5NSIsICIlOTYiLCAiJTk3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTk4IiwgIiU5OSIsICIlOUEiLCAiJTlCIiwgIiU5QyIsICIlOUQiLCAiJTlFIiwgIiU5RiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVBMCIsICIlQTEiLCAiJUEyIiwgIiVBMyIsICIlQTQiLCAiJUE1IiwgIiVBNiIsICIlQTciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlQTgiLCAiJUE5IiwgIiVBQSIsICIlQUIiLCAiJUFDIiwgIiVBRCIsICIlQUUiLCAiJUFGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUIwIiwgIiVCMSIsICIlQjIiLCAiJUIzIiwgIiVCNCIsICIlQjUiLCAiJUI2IiwgIiVCNyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVCOCIsICIlQjkiLCAiJUJBIiwgIiVCQiIsICIlQkMiLCAiJUJEIiwgIiVCRSIsICIlQkYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlQzAiLCAiJUMxIiwgIiVDMiIsICIlQzMiLCAiJUM0IiwgIiVDNSIsICIlQzYiLCAiJUM3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUM4IiwgIiVDOSIsICIlQ0EiLCAiJUNCIiwgIiVDQyIsICIlQ0QiLCAiJUNFIiwgIiVDRiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVEMCIsICIlRDEiLCAiJUQyIiwgIiVEMyIsICIlRDQiLCAiJUQ1IiwgIiVENiIsICIlRDciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlRDgiLCAiJUQ5IiwgIiVEQSIsICIlREIiLCAiJURDIiwgIiVERCIsICIlREUiLCAiJURGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUUwIiwgIiVFMSIsICIlRTIiLCAiJUUzIiwgIiVFNCIsICIlRTUiLCAiJUU2IiwgIiVFNyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVFOCIsICIlRTkiLCAiJUVBIiwgIiVFQiIsICIlRUMiLCAiJUVEIiwgIiVFRSIsICIlRUYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlRjAiLCAiJUYxIiwgIiVGMiIsICIlRjMiLCAiJUY0IiwgIiVGNSIsICIlRjYiLCAiJUY3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUY4IiwgIiVGOSIsICIlRkEiLCAiJUZCIiwgIiVGQyIsICIlRkQiLCAiJUZFIiwgIiVGRiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JfTsKLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLiBBbGwKLQkgKiBtZXRob2RzIGluIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHN0YXRpYy4KLQkgKi8KLQlwcml2YXRlIE5ldFV0aWwoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJJIGZvciB0aGUgZ2l2ZW4gZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgVGhlIGlucHV0IGZpbGUuCi0JICogQHJldHVybiBUaGUgVVJJIGZvciB0aGUgZ2l2ZW4gZmlsZS4KLQkgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VyIHdoaWxlIGNvbnN0cnVjdGluZyB0aGUgVVJJIGZvciB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgICAgICBmaWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVyaShGaWxlIGZpbGUpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlTdHJpbmcgdXJsID0gZmlsZS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCB1cmxMZW5ndGggPSB1cmwubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJsTGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgY2ggPSB1cmwuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnICc6Ci0JCQkJc3RyQnVmLmFwcGVuZCgiJTIwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc3RyQnVmLmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJlc29sdmVzIHRoZSBnaXZlbiBVUkkgdXNpbmcgdGhlIGdpdmVuIHRoZSBiYXNlIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBUaGUgVVJJIHRvIHJlc29sdmUuCi0JICogQHBhcmFtIGJhc2VVcmkKLQkgKiAgICAgICAgICAgIFRoZSBiYXNlIFVSSS4KLQkgKiBAcmV0dXJuIEEgZnVsbHkgZm9ybWVkIFVSSS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlVXJpKFN0cmluZyB1cmksIFN0cmluZyBiYXNlVXJpKSB7Ci0JCWlmICh1cmkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAodXJpLnN0YXJ0c1dpdGgoIi4uLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChiYXNlVXJpLmVuZHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWJhc2VVcmkgPSBiYXNlVXJpLnN1YnN0cmluZygwLCBiYXNlVXJpLmxlbmd0aCgpIC0gMSk7Ci0JCQl9Ci0JCQl3aGlsZSAodXJpLnN0YXJ0c1dpdGgoIi4uLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl1cmkgPSB1cmkuc3Vic3RyaW5nKDMpOwotCQkJCWludCBpbmRleCA9IGJhc2VVcmkubGFzdEluZGV4T2YoJy8nKTsKLQkJCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQkJCWJhc2VVcmkgPSBiYXNlVXJpLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJfQotCQkJfQotCQkJdXJpID0gIi8iICsgdXJpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAodXJpLnN0YXJ0c1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gYmFzZVVyaS5lbmRzV2l0aCgiLyIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJPyBiYXNlVXJpICsgdXJpLnN1YnN0cmluZygxKSA6IGJhc2VVcmkgKyB1cmk7Ci0JCX0KLQotCQlpZiAodXJpLnN0YXJ0c1dpdGgoRklMRV9VUklfUFJFRklYKSB8fCB1cmkuc3RhcnRzV2l0aChIVFRQX1VSSV9QUkVGSVgpKSB7Ci0JCQlyZXR1cm4gdXJpOwotCQl9Ci0KLQkJcmV0dXJuIGJhc2VVcmkuZW5kc1dpdGgoIi8iKSA/IGJhc2VVcmkgKyB1cmkgOiBiYXNlVXJpICsgJy8nICsgdXJpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5wdXQgc3RyZWFtIGZvciB0aGUgZ2l2ZW4gVVJJLgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIFRoZSBzb3VyY2UgVVJJLgotCSAqIEByZXR1cm4gVGhlIGlucHV0IHN0cmVhbSBmb3IgdGhlIGdpdmVuIFVSSS4KLQkgKiBAdGhyb3cgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGlmIGEgZ2l2ZW4gWE1MIGRvY3VtZW50IFVSSSBpcyBpbnZhbGlkLgotCSAqIEB0aHJvdyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3Igb2NjdXIgd2hpbGUgYWNjZXNzaW5nIHRoZSBVUkkuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShTdHJpbmcgdXJpKQotCQkJdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZiAodXJpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKHVyaS5zdGFydHNXaXRoKEhUVFBfVVJJX1BSRUZJWCkpIHsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKHVyaSk7Ci0JCQlyZXR1cm4gdXJsLm9wZW5TdHJlYW0oKTsKLQkJfSBlbHNlIGlmICh1cmkuc3RhcnRzV2l0aChGSUxFX1VSSV9QUkVGSVgpKSB7Ci0JCQl1cmkgPSB1cmkuc3Vic3RyaW5nKEZJTEVfVVJJX1BSRUZJWF9MRU5HVEgpOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0oTmV0VXRpbC5kZWNvZGVVcmwodXJpLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSmF2YSBzdHJpbmcgcmVwcmVzZW50aW9uIChlbmNvZGVkIGluIFVURi0xNikgb2YgdGhlIGdpdmVuIFVSTAotCSAqIChlbmNvZGVkIGluIHRoZSBnaXZlbiBlbmNvZGluZyBhbmQgQVNDSUktZXNjYXBlZCkuCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgVGhlIFVSTCB0byBkZWNvZGUuCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICogICAgICAgICAgICBUaGUgZW5jb2Rpbmcgb2YgdGhlIFVSTC4KLQkgKiBAcmV0dXJuIFRoZSBKYXZhIFVURi0xNiBzdHJpbmcgcmVzcHJlc2VudGF0aW9uLgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIGdpdmVuIFVSTCBjb250YWluIGltcHJvcGVybHkgZXNjYXBlZCBjaGFyYWN0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZVVybChTdHJpbmcgdXJsLCBTdHJpbmcgZW5jb2RpbmcpIHsKLQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdXJsOwotCQl9Ci0JCQotCQlpbnQgbGVuID0gdXJsLmxlbmd0aCgpOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiB1cmw7Ci0JCX0KLQotCQkvLyBVbmVzY2FwZSB0aGUgdXJsLgotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGNoID0gdXJsLmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJysnOgotCQkJCXN0ckJ1Zi5hcHBlbmQoJyAnKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJyUnOgotCQkJCXRyeSB7Ci0JCQkJCXN0ckJ1Zi5hcHBlbmQoKGNoYXIpIEludGVnZXIucGFyc2VJbnQodXJsLnN1YnN0cmluZyhpICsgMSwKLQkJCQkJCQlpICsgMyksIDE2KSk7Ci0JCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlpICs9IDI7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXN0ckJ1Zi5hcHBlbmQoY2gpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJLy8gQ29udmVydCB0aGUgdW4tZXNjYXBlZCBieXRlIHZhbHVlcyB0byBKYXZhIFVURi0xNiBzdHJpbmcuCi0JCVN0cmluZyByZXN1bHQgPSBzdHJCdWYudG9TdHJpbmcoKTsKLQkJaWYgKGVuY29kaW5nICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJYnl0ZVtdIGJ5dGVzID0gcmVzdWx0LmdldEJ5dGVzKCI4ODU5XzEiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IG5ldyBTdHJpbmcoYnl0ZXMsIGVuY29kaW5nKTsKLQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBBU0NJSS1lc2NhcGVkIHJlcHJlc2VudGF0aW9uIChlbmNvZGVkIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBlbmNvZGluZykgb2YgdGhlIGdpdmVuIFVSTCAoZW5jb2RlZCBpbiBVVEYtMTYpLgotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIFRoZSBVUkwgdG8gZW5jb2RlLgotCSAqIEBwYXJhbSBlbmNvZGluZwotCSAqICAgICAgICAgICAgVGhlIGVuY29kaW5nIG9mIHRoZSBVUkwuCi0JICogQHJldHVybiB0aGUgQVNDSUktZXNjYXBlZCByZXNwcmVzZW50YXRpb24uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gVVJMIGNvbnRhaW4gaW1wcm9wZXJseSBlc2NhcGVkIGNoYXJhY3RlcnMuCi0JICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIGdpdmVuIGNvZGluZyBpcyB1bnN1cHBvcnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlVXJsKFN0cmluZyB1cmwsIFN0cmluZyBlbmNvZGluZykKLQkJCXRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdXJsOwotCQl9CQkKLQkJaW50IGxlbiA9IHVybC5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gdXJsOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlieXRlW10gYnl0ZXMgPSB1cmwuZ2V0Qnl0ZXMoZW5jb2RpbmcpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQljaGFyIGNoID0gKGNoYXIpIGJ5dGVzW2ldOwotCi0JCQlpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICd6JykgewotCQkJCXJlc3VsdC5hcHBlbmQoY2gpOwotCQkJfSBlbHNlIGlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKSB7Ci0JCQkJcmVzdWx0LmFwcGVuZChjaCk7Ci0JCQl9IGVsc2UgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKLQkJCQlyZXN1bHQuYXBwZW5kKGNoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3dpdGNoIChjaCkgewotCQkJCWNhc2UgJy0nOgotCQkJCWNhc2UgJ18nOgotCQkJCWNhc2UgJy4nOgotCQkJCWNhc2UgJyEnOgotCQkJCWNhc2UgJ34nOgotCQkJCWNhc2UgJyonOgotCQkJCWNhc2UgJ1wnJzoKLQkJCQljYXNlICcoJzoKLQkJCQljYXNlICcpJzoKLQkJCQkJcmVzdWx0LmFwcGVuZChjaCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJlc3VsdC5hcHBlbmQoSEVYX1ZBTFVFU1tjaCAmIDB4RkZdKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEFTQ0lJLWVzY2FwZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGZpbGUgVVJMLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlVVJMCi0JICogICAgICAgICAgICBUaGUgZmlsZSBVUkwgdG8gZW5jb2RlLgotCSAqIEByZXR1cm4gdGhlIEFTQ0lJLWVzY2FwZWQgcmVzcHJlc2VudGF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZUZpbGVVUkwoU3RyaW5nIGZpbGVVUkwpIHsKLQkJU3RyaW5nIHVybCA9IGZpbGVVUkw7Ci0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCB1cmxMZW5ndGggPSB1cmwubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJsTGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgY2ggPSB1cmwuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnICc6Ci0JCQkJc3RyQnVmLmFwcGVuZCgiJTIwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc3RyQnVmLmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEFTQ0lJLWVzY2FwZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGZpbGUgVVJMLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlVVJMCi0JICogICAgICAgICAgICBUaGUgZmlsZSBVUkwgdG8gZW5jb2RlLgotCSAqIEByZXR1cm4gdGhlIEFTQ0lJLWVzY2FwZWQgcmVzcHJlc2VudGF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZWRGaWxlVXJsKFN0cmluZyBmaWxlVVJMKSB7Ci0JCVN0cmluZyB1cmwgPSBmaWxlVVJMOwotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgdXJsTGVuZ3RoID0gdXJsLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybExlbmd0aDsgaSsrKSB7Ci0JCQljaGFyIGNoID0gdXJsLmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJyUnOgotCQkJCXRyeSB7Ci0JCQkJCXN0ckJ1Zi5hcHBlbmQoKGNoYXIpIEludGVnZXIucGFyc2VJbnQodXJsLnN1YnN0cmluZyhpICsgMSwKLQkJCQkJCQlpICsgMyksIDE2KSk7Ci0JCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlpICs9IDI7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXN0ckJ1Zi5hcHBlbmQoY2gpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlVVJMIChTdHJpbmcgdXJsKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0vLwkJdXJsID0gdXJsLnJlcGxhY2VBbGwoIlxcKyIsICIlMkIiKTsgLy8kTk9OLU5MUy0xJAotCQl1cmwgPSBVUkxEZWNvZGVyLmRlY29kZSh1cmwsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiB1cmw7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9Qcm9maWxpbmdVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1Byb2ZpbGluZ1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyOWFjYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1Byb2ZpbGluZ1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotCi0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgcHJvZmlsaW5nCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICovCi0KLXB1YmxpYyBjbGFzcyBQcm9maWxpbmdVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0cmFjZUZvb3RwcmludCA9IGZhbHNlOwotCQotCXByaXZhdGUgc3RhdGljIFByaW50U3RyZWFtIG91dHB1dCA9IFN5c3RlbS5vdXQ7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldE91dHB1dChQcmludFN0cmVhbSBwcykgewotCQlvdXRwdXQgPSBwczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGZ1bGxHQygpIHsKLQkJUnVudGltZSBydCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpOwotCQlsb25nIGlzRnJlZSA9IHJ0LmZyZWVNZW1vcnkoKTsKLQkJbG9uZyB3YXNGcmVlOwotCQlkbyB7Ci0JCQl3YXNGcmVlID0gaXNGcmVlOwotCQkJcnQucnVuRmluYWxpemF0aW9uKCk7Ci0JCQlydC5nYygpOwotCQkJaXNGcmVlID0gcnQuZnJlZU1lbW9yeSgpOwotCQl9IHdoaWxlIChpc0ZyZWUgPiB3YXNGcmVlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBsb25nIHRyYWNlVXNlZE1lbW9yeShTdHJpbmcgbG9jYXRpb24pIHsKLQkJUnVudGltZSBydCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpOwotCQlsb25nIHVzZWRNZW0gPSBydC50b3RhbE1lbW9yeSgpIC0gcnQuZnJlZU1lbW9yeSgpOwotCQlvdXRwdXQucHJpbnRsbigiRm9vdHByaW50PiAiICsgbG9jYXRpb24gKyAiOiAiICsgdXNlZE1lbS8xMDAwICsgIiBLIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCQotCQkJCQkJCQkJCQotCQlyZXR1cm4gdXNlZE1lbTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGxvbmcgdHJhY2VVc2VkTWVtb3J5RGlmZihTdHJpbmcgbG9jYXRpb25JbmZvLCBsb25nIGN1cnJVc2VkLCBsb25nIFByZXZVc2VkKSB7Ci0JCWxvbmcgZGlmZiA9IGN1cnJVc2VkIC0gUHJldlVzZWQ7Ci0JCW91dHB1dC5wcmludGxuKCJGb290cHJpbnQ+IERpZmYsICIgKyBsb2NhdGlvbkluZm8gKyAiOiAiICsgZGlmZi8xMDAwICsgIiBLXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCQkJCQkKLQkJcmV0dXJuIGRpZmY7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9TdHJVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1N0clV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UyMjBhNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1N0clV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LmxhbmcuVUNoYXJhY3RlcjsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3IgbWFudWlwdWxhdGluZyBzdHJpbmdzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQiA9ICJcdCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWFBfQU5ZX1NQRUNJQUxfQ0hBUlMgPSAiKGB8fnwhfEB8I3xcXCR8JXxcXF58JnxcXCp8XFwofFxcKXxcXCt8PXxcXFt8XFxdfFxcfHxcXDp8XCJ8PHw+fFxcP3wvfCd8XFxzfFxcXFwpKyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWFBfSU5WQUxJRF9QVUJMSVNIRURfUEFUSF9DSEFSUyA9ICIoXFxbfCN8XFwqfFxcP3xcInw8fD58XFx8fCF8JXwvfFxcXSkrIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYUF9JTlZBTElEX1BVQkxJU0hFRF9QQVRIX0NIQVJTX0xJTlVYID0gIihcXFt8I3xcXCp8XFw/fFwifDx8PnxcXHx8IXwlfFxcXSkrIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYUF9JTlZBTElEX0ZJTEVOQU1FX0NIQVJTID0gIihcXFt8I3wvfFxcXFx8XFw6fFxcKnxcXD98XCJ8PHw+fFxcfHxcXF18XFxzKSsiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gSEVYX0RJR0lUUyA9IHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywKLQkJCSc2JywgJzcnLCAnOCcsICc5JywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJyB9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9GRUVEID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFU0NBUEVEX0xGID0gIiYjeEE7IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVNDQVBFRF9DUiA9ICImI3hEOyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVTQ0FQRURfTElORV9GRUVEID0gTElORV9GRUVELnJlcGxhY2UoCi0JCQkiXG4iLCBFU0NBUEVEX0xGKS5yZXBsYWNlKCJcciIsIEVTQ0FQRURfQ1IpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfRkVFRF9SRUdFWCA9IExJTkVfRkVFRC5yZXBsYWNlQWxsKAotCQkJIlxcXFwiLCAiXFxcXCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVTQ0FQRURfTElORV9GRUVEX1JFR0VYID0gRVNDQVBFRF9MSU5FX0ZFRUQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0JSRUFLID0gIjxici8+IjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0NPUFkgPSAiJmNvcHk7IjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0VVUk8gPSAiJmV1cm87IjsvLyROT04tTkxTLTEkIAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfUkVHID0gIiZyZWc7IjsvLyROT04tTkxTLTEkIAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9UUkFERU1BUksgPSAiJnRyYWRlOyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQuIEFsbAotCSAqIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBzaG91bGQgYmUgc3RhdGljLgotCSAqLwotCXByaXZhdGUgU3RyVXRpbCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyBmb3IgbnVsbCBzdHJpbmcuCi0JICogPHA+Ci0JICogQSBudWxsIHN0cmluZyBpcyBkZWZpbmVkIGFzIG9uZSB0aGF0IGhhcyBhbiBlbXB0eSByZWZlcmVuY2Ugb3IgaGFzIHplcm8KLQkgKiBsZW5ndGguCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgYSBzdHJpbmcKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYSBudWxsIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc051bGwoU3RyaW5nIHN0cikgewotCQlyZXR1cm4gc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDA7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgZm9yIGJsYW5rIHN0cmluZy4KLQkgKiA8cD4KLQkgKiBBIGJsYW5rIHN0cmluZyBpcyBkZWZpbmVkIGFzIG9uZSB0aGF0IGhhcyBhbiBlbXB0eSByZWZlcmVuY2Ugb3IgaGFzIHplcm8KLQkgKiBsZW5ndGggYWZ0ZXIgdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlIGNoYXJhY3RlcnMgYXJlIHRyaW1tZWQuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgYSBzdHJpbmcKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYSBibGFuayBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCbGFuayhTdHJpbmcgc3RyKSB7Ci0JCXJldHVybiBzdHIgPT0gbnVsbCB8fCBzdHIudHJpbSgpLmxlbmd0aCgpID09IDA7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2UgY2hhcmFjdGVycyBmcm9tIGEgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nCi0JICogQHJldHVybiBhIHN0cmluZyB3aXRoIG5vIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlIGNoYXJhY3RlcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0cmltKFN0cmluZyBzdHIpIHsKLQkJcmV0dXJuIHN0ciA9PSBudWxsID8gbnVsbCA6IHN0ci50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgKFRBQiwgQ1IsIExGIGFuZCBTUEFDRSkgZnJvbSBhIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBhIHN0cmluZwotCSAqIEByZXR1cm4gYSBzdHJpbmcgd2l0aCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgcmVtb3ZlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZVdoaXRlU3BhY2VDaGFycyhTdHJpbmcgc3RyKSB7Ci0JCWludCBsZW4gPSAoc3RyID09IG51bGwpID8gMCA6IHN0ci5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJc3dpdGNoIChzdHIuY2hhckF0KGkpKSB7Ci0JCQljYXNlICdcdCc6Ci0JCQljYXNlICdccic6Ci0JCQljYXNlICdcbic6Ci0JCQljYXNlICcgJzoKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIHN0cjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBTcGxpdHMgYSBzdHJpbmcgaW50byBhbiBhcnJheSBvZiBzdHJpbmcgdG9rZW5zLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nCi0JICogQHBhcmFtIHNlcAotCSAqICAgICAgICAgICAgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgc3RyaW5nIHNlcGFyYXRvcnMKLQkgKiBAcGFyYW0gY291bnQKLQkgKiAgICAgICAgICAgIHRoZSBkZXNpcmVkIG51bWJlciBvZiBzdHJpbmcgdG9rZW5zCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBzdHJpbmcgdG9rZW5zCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBzcGxpdChTdHJpbmcgc3RyLCBTdHJpbmcgc2VwLCBpbnQgY291bnQpIHsKLQkJaWYgKHN0ciA9PSBudWxsIHx8IGNvdW50ID09IDAgfHwgY291bnQgPCAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHIsIHNlcCwKLQkJCQljb3VudCA9PSAtMSA/IGZhbHNlIDogdHJ1ZSk7Ci0KLQkJaWYgKGNvdW50ID09IC0xKSB7Ci0JCQljb3VudCA9IHRva2VuaXplci5jb3VudFRva2VucygpOwotCQl9Ci0KLQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tjb3VudF07Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJaWYgKGkgPCBjb3VudCkgewotCQkJCWlmICgodC5sZW5ndGgoKSA9PSAxKSAmJiAoc2VwLmluZGV4T2YodCkgIT0gLTEpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlyZXN1bHRbaSsrXSA9IHQ7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdFtjb3VudCAtIDFdICs9IHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTcGxpdHMgYSBzdHJpbmcgaW50byBhbiBhcnJheSBvZiBzdHJpbmcgdG9rZW5zLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nCi0JICogQHBhcmFtIHNlcAotCSAqICAgICAgICAgICAgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgc3RyaW5nIHNlcGFyYXRvcnMKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHN0cmluZyB0b2tlbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHNwbGl0KFN0cmluZyBzdHIsIFN0cmluZyBzZXApIHsKLQkJcmV0dXJuIHNwbGl0KHN0ciwgc2VwLCAtMSk7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZXMgYSBzdWJzdHJpbmcgd2l0aGluIGEgc3RyaW5nIHdpdGggYW5vdGhlciBzdWJzdHJpbmcuCi0JICogPHA+Ci0JICogTm90ZTogT25seSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3Vic3RyaW5nIHdpbGwgYmUgcmVwbGFjZWQuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgYSBzdHJpbmcKLQkgKiBAcGFyYW0gc3JjCi0JICogICAgICAgICAgICB0aGUgc3Vic3RyaW5nIHRvIHJlcGxhY2UKLQkgKiBAcGFyYW0gdGd0Ci0JICogICAgICAgICAgICB0aGUgc3Vic3RyaW5nIHRvIHVzZSBmb3IgdGhlIHJlcGxhY2VtZW50Ci0JICogQHJldHVybiBhIHN0cmluZyB3aXRoIHRoZSBmaXJzdCBzdWJzdHJpbmcgcmVwbGFjZWQKLQkgKiAKLQkgKiBUT0RPOiBSZXZpZXcgaW1wbGVtZW50YXRpb24uIENhbGwgU3RyaW5nLnJlcGxhY2VGaXJzdCgpIGluc3RlYWQ/Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZShTdHJpbmcgc3RyLCBTdHJpbmcgc3JjLCBTdHJpbmcgdGd0KSB7Ci0JCWlmICgoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApCi0JCQkJfHwgKHNyYyA9PSBudWxsIHx8IHNyYy5sZW5ndGgoKSA9PSAwKSkgewotCQkJcmV0dXJuIHN0cjsKLQkJfQotCi0JCVN0cmluZyB0bXBTdHIgPSBzdHI7Ci0JCWludCBpbmRleDsKLQkJd2hpbGUgKChpbmRleCA9IHRtcFN0ci5pbmRleE9mKHNyYykpICE9IC0xKSB7Ci0JCQl0bXBTdHIgPSB0bXBTdHIuc3Vic3RyaW5nKDAsIGluZGV4KSArIHRndAotCQkJCQkrIHRtcFN0ci5zdWJzdHJpbmcoaW5kZXggKyBzcmMubGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiB0bXBTdHI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW50ZWdlciB2YWx1ZSBvZiBhIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBhIHN0cmluZwotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKLQkgKiAgICAgICAgICAgIGEgZGVmYXVsdCBpbnRlZ2VyIHZhbHVlIGZvciB0aGUgc3RyaW5nCi0JICogQHJldHVybiB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGUgZ2l2ZW4gc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50VmFsdWUoU3RyaW5nIHN0ciwgaW50IGRlZmF1bHRWYWx1ZSkgewotCQlpZiAoU3RyVXRpbC5pc0JsYW5rKHN0cikpIHsKLQkJCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCX0KLQotCQl0cnkgewotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoc3RyKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgVVRGLTggZW5jb2Rpbmcgb2YgYSBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgYSBzdHJpbmcKLQkgKiBAcmV0dXJuIGEgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBVVEYtOCBlbmNvZGluZyBvZiB0aGUgZ2l2ZW4gc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlW10gZ2V0VVRGOEJ5dGVzKFN0cmluZyBzdHIpIHsKLQkJY2hhcltdIGMgPSBzdHIudG9DaGFyQXJyYXkoKTsKLQkJaW50IGxlbiA9IGMubGVuZ3RoOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpbnQgY2ggPSBjW2ldOwotCQkJaWYgKGNoIDw9IDB4N2YpIHsKLQkJCQljb3VudCsrOwotCQkJfSBlbHNlIGlmIChjaCA8PSAweDdmZikgewotCQkJCWNvdW50ICs9IDI7Ci0JCQl9IGVsc2UgewotCQkJCWNvdW50ICs9IDM7Ci0JCQl9Ci0JCX0KLQotCQlieXRlW10gYiA9IG5ldyBieXRlW2NvdW50XTsKLQkJaW50IG9mZiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWludCBjaCA9IGNbaV07Ci0JCQlpZiAoY2ggPD0gMHg3ZikgewotCQkJCWJbb2ZmKytdID0gKGJ5dGUpIGNoOwotCQkJfSBlbHNlIGlmIChjaCA8PSAweDdmZikgewotCQkJCWJbb2ZmKytdID0gKGJ5dGUpICgoY2ggPj4gNikgfCAweGMwKTsKLQkJCQliW29mZisrXSA9IChieXRlKSAoKGNoICYgMHgzZikgfCAweDgwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYltvZmYrK10gPSAoYnl0ZSkgKChjaCA+PiAxMikgfCAweGUwKTsKLQkJCQliW29mZisrXSA9IChieXRlKSAoKChjaCA+PiA2KSAmIDB4M2YpIHwgMHg4MCk7Ci0JCQkJYltvZmYrK10gPSAoYnl0ZSkgKChjaCAmIDB4M2YpIHwgMHg4MCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaGV4aWRlY2ltYWwgY2hhcmFjdGVyIHJlcHJlc2VudGF0aW9uIGZvciBhbiBpbnRlZ2VyLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgYW4gaW50ZWdlcgotCSAqIEByZXR1cm4gdGhlIGhleGlkZWNpbWFsIHJlcHJlc2VudGF0aW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhciB0b0hleChpbnQgdmFsdWUpIHsKLQkJcmV0dXJuIEhFWF9ESUdJVFNbKHZhbHVlICYgMHhGKV07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXNjYXBlZCBVbmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIGEgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nCi0JICogQHBhcmFtIHNraXBBU0NJSQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGF2b2lkIGVzY2FwaW5nIHRoZSBBU0NJSSBjaGFyYWN0ZXJzCi0JICogQHJldHVybiB0aGUgZXNjYXBlZCBVbmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0VzY2FwZWRVbmljb2RlKFN0cmluZyBzdHIsIGJvb2xlYW4gc2tpcEFTQ0lJKSB7Ci0JCWludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbiAqIDIpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBzdHIuY2hhckF0KGkpOwotCi0JCQlpZiAoc2tpcEFTQ0lJICYmIGNoIDwgMHgwMDdFKSB7Ci0JCQkJcmVzdWx0LmFwcGVuZChjaCk7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdC5hcHBlbmQoIlxcdSIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFwcGVuZCh0b0hleCgoY2ggPj4gMTIpICYgMHhGKSk7Ci0JCQkJcmVzdWx0LmFwcGVuZCh0b0hleCgoY2ggPj4gOCkgJiAweEYpKTsKLQkJCQlyZXN1bHQuYXBwZW5kKHRvSGV4KChjaCA+PiA0KSAmIDB4RikpOwotCQkJCXJlc3VsdC5hcHBlbmQodG9IZXgoY2ggJiAweEYpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlc2NhcGVkIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgYSBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIGh0bWwKLQkgKiAgICAgICAgICAgIGEgSFRNTCBzdHJpbmcKLQkgKiBAcmV0dXJuIHRoZSBlc2NhcGVkIFVuaWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIEhUTUwgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXNjYXBlZEhUTUwoU3RyaW5nIGh0bWwpIHsKLQkJaWYgKGh0bWwgPT0gbnVsbCB8fCBodG1sLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGxlbmd0aCA9IGh0bWwubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBodG1sLmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJyUnOgotCQkJCWlmIChpICsgNCA8IGxlbmd0aCkgewotCQkJCQlTdHJpbmcgaGV4U3RyID0gaHRtbC5zdWJzdHJpbmcoaSArIDEsIGkgKyA1KTsKLQkJCQkJYm9vbGVhbiB2YWxpZEhleHRTdHIgPSB0cnVlOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGhleFN0ci5sZW5ndGgoKTsgaisrKSB7Ci0JCQkJCQljaGFyIGMgPSBoZXhTdHIuY2hhckF0KGopOwotCQkJCQkJaWYgKCEoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHx8IChjID49ICdhJyAmJiBjIDw9ICdmJykpIHsKLQkJCQkJCQl2YWxpZEhleHRTdHIgPSBmYWxzZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAodmFsaWRIZXh0U3RyKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWludCBjb2RlUG9pbnQgPSBJbnRlZ2VyLnBhcnNlSW50KGhleFN0ciwgMTYpOwotCQkJCQkJCWNoYXJbXSBjID0gVUNoYXJhY3Rlci50b0NoYXJzKGNvZGVQb2ludCk7Ci0JCQkJCQkJcmVzdWx0LmFwcGVuZChjKTsKLQkJCQkJCQlpICs9IDQ7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJlc3VsdC5hcHBlbmQoY2gpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXHUwMGE5JzoKLQkJCQlyZXN1bHQuYXBwZW5kKEhUTUxfQ09QWSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcdTAwYWUnOgotCQkJCXJlc3VsdC5hcHBlbmQoSFRNTF9SRUcpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXHUyMGFjJzoKLQkJCQlyZXN1bHQuYXBwZW5kKEhUTUxfRVVSTyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcdTIxMjInOgotCQkJCXJlc3VsdC5hcHBlbmQoSFRNTF9UUkFERU1BUkspOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyZXN1bHQuYXBwZW5kKGNoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGxhaW4gdGV4dCBmcm9tIEhUTUwgdGV4dC4KLQkgKiA8cD4KLQkgKiBOb3RlOiBBbGwgSFRNTCB0YWdzIHdpbGwgYmUgc3RyaXBwZWQuCi0JICogCi0JICogQHBhcmFtIGh0bWwKLQkgKiAgICAgICAgICAgIHRoZSBIVE1MIHRleHQuCi0JICogQHJldHVybiB0aGUgcGxhaW4gdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gSFRNTCB0ZXh0Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGxhaW5UZXh0KFN0cmluZyBodG1sKSB7Ci0JCWlmIChodG1sID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJZmluYWwgUGF0dGVybiBwX3BsYWludGV4dF9maWx0ZXIgPSBQYXR0ZXJuLmNvbXBpbGUoCi0JCQkJIjxbXj5dKj8+IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFBhdHRlcm4gcF9wbGFpbnRleHRfZmlsdGVyMiA9IFBhdHRlcm4uY29tcGlsZSgKLQkJCQkiJi57MSw1fVteO107IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFBhdHRlcm4gcF9wbGFpbnRleHRfZmlsdGVyMyA9IFBhdHRlcm4uY29tcGlsZSgKLQkJCQkiXFxzKyIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyByZXN1bHQgPSBodG1sLnJlcGxhY2VBbGwocF9wbGFpbnRleHRfZmlsdGVyLnBhdHRlcm4oKSwgIiAiKSAvLyROT04tTkxTLTEkCi0JCQkJLnJlcGxhY2VBbGwocF9wbGFpbnRleHRfZmlsdGVyMi5wYXR0ZXJuKCksICIgIikgLy8kTk9OLU5MUy0xJAotCQkJCS5yZXBsYWNlQWxsKHBfcGxhaW50ZXh0X2ZpbHRlcjMucGF0dGVybigpLCAiICIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgYSBzdHJpbmcgaW50byBhIHZhbGlkIGZpbGUgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBhIHN0cmluZwotCSAqIEByZXR1cm4gYSB2YWxpZCBmaWxlIG5hbWUgZGVyaXZlZCBmcm9tIHRoZSBnaXZlbiBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlVmFsaWRGaWxlTmFtZShTdHJpbmcgc3RyKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBsYWluVGV4dChzdHIpCi0JCQkJLnJlcGxhY2VBbGwoUkVHRVhQX0lOVkFMSURfRklMRU5BTUVfQ0hBUlMsICIgIikudHJpbSgpOyAvLyROT04tTkxTLTEkIAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZVNwZWNpYWxDaGFyYWN0ZXJzKFN0cmluZyBzdHIpIHsKLQkJaWYgKHN0ciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGxhaW5UZXh0KHN0cikKLQkJCQkucmVwbGFjZUFsbChSRUdFWFBfQU5ZX1NQRUNJQUxfQ0hBUlMsICIgIikudHJpbSgpOyAvLyROT04tTkxTLTEkIAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGF0aCBkb2VzIG5vdCBjb250YWluIGFueSBpbnZhbGlkIGZpbGVuYW1lCi0JICogY2hhcmFjdGVycy4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIGZpbGUgcGF0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHBhdGggY29udGFpbnMgb25seSB2YWxpZAotCSAqICAgICAgICAgZmlsZW5hbWUgY2hhcmFjdGVycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkUHVibGlzaFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJLy8gcmV0dXJuIHBhdGgucmVwbGFjZUFsbChpbnZhbGlkUHVibGlzaFBhdGhDaGFyc1JlZ0V4cCwKLQkJLy8gIiIpLmVxdWFscyhwYXRoKTsKLQotCQlpZiAoUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoUGxhdGZvcm0uV1NfV0lOMzIpKSB7Ci0JCQlyZXR1cm4gcGF0aAotCQkJCQkucmVwbGFjZUFsbChSRUdFWFBfSU5WQUxJRF9QVUJMSVNIRURfUEFUSF9DSEFSUywgIiIpLmVxdWFscyhwYXRoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gZWxzZSBkZWZhdWx0IHRvIExpbnV4Ci0JCXJldHVybiBwYXRoCi0JCQkJLnJlcGxhY2VBbGwoUkVHRVhQX0lOVkFMSURfUFVCTElTSEVEX1BBVEhfQ0hBUlNfTElOVVgsICIiKS5lcXVhbHMocGF0aCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb3dlci1jYXNlIG9mIHN0ciB1bmxlc3MgdGhlIGN1cnJlbnQgbG9jYWxlIGlzIEdlcm1hbgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9Mb3dlcihTdHJpbmcgc3RyKSB7Ci0JCWlmIChQbGF0Zm9ybS5nZXROTCgpLnN0YXJ0c1dpdGgoImRlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHN0cjsKLQkJfQotCQlyZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCk7Ci0JfQotCi0JLyoqCi0JICogZXNjYXBlIHRoZSAiIGFuZCAnCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHN0cikgewotCQlyZXR1cm4gc3RyLnJlcGxhY2VBbGwoIiciLCAiXFxcXFwnIikucmVwbGFjZUFsbCgiXCIiLCAiXFxcXFwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIDxjb2RlPkxpc3Q8L2NvZGU+IHRvIGFuIFN0cmluZyBhcnJheS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdAotCSAqICAgICAgICAgICAgYSA8Y29kZT5MaXN0PC9jb2RlPgotCSAqIEByZXR1cm4gYSBTdHJpbmcgYXJyYXkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGNvbnZlcnRMaXN0VG9TdHJBcnJheShMaXN0IGxpc3QpIHsKLQkJaWYgKGxpc3QgIT0gbnVsbCkgewotCQkJaW50IGNudCA9IGxpc3Quc2l6ZSgpOwotCQkJU3RyaW5nW10gc3RyQXJyYXkgPSBuZXcgU3RyaW5nW2NudF07Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY250OyBpKyspIHsKLQkJCQlTdHJpbmcgc3RyID0gKFN0cmluZykgbGlzdC5nZXQoaSk7Ci0JCQkJc3RyQXJyYXlbaV0gPSBuZXcgU3RyaW5nKHN0cik7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RyQXJyYXk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkTmFtZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbmFtZS5yZXBsYWNlQWxsKFJFR0VYUF9BTllfU1BFQ0lBTF9DSEFSUywgIiIpLmVxdWFscyhuYW1lKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCi0JLyoqCi0JICogYWRkZWQgc29tZSB0ZXN0IGNvZGUKLQkgKiAKLQkgKiBAcGFyYW0gYXJncwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQlTdHJpbmcgdGV4dCA9ICJBJiUgICAgICBgJiMgICAgICAgICAgICR+IUAjJCVeJiooKV8tKz17fVtcIl06fFxcOjtcIic8LD4uPy8gXHRcclxuWiI7IC8vJE5PTi1OTFMtMSQKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlsiICsgdGV4dCArICJdIDw9PSB0ZXh0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlsiICsgdGV4dC5yZXBsYWNlQWxsKFJFR0VYUF9BTllfU1BFQ0lBTF9DSEFSUywgIiAiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkrICJdIDw9PSBBbGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlsiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIHRleHQucmVwbGFjZUFsbChSRUdFWFBfSU5WQUxJRF9GSUxFTkFNRV9DSEFSUywgIiAiKSAvLyROT04tTkxTLTEkCi0JCQkJKyAiXSA8PT0gRmlsZSBOYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJbIiAvLyROT04tTkxTLTEkCi0JCQkJKyB0ZXh0LnJlcGxhY2VBbGwoUkVHRVhQX0lOVkFMSURfUFVCTElTSEVEX1BBVEhfQ0hBUlMsICIgIikgLy8kTk9OLU5MUy0xJAotCQkJCSsgIl0gPD09IHBhdGgiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlsiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIHRleHQucmVwbGFjZUFsbChSRUdFWFBfSU5WQUxJRF9QVUJMSVNIRURfUEFUSF9DSEFSU19MSU5VWCwKLQkJCQkJCSIgIikgKyAiXSA8PT0gcGF0aCwgTGludXgiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIHRoZSBwbGF0Zm9ybSBsaW5lLXNlcGFyYXRvciAoXG4gb3IgXG5cciBvciBccikgdG8gJmx0O2JyLyZndDsKLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0TmV3bGluZXNUb0hUTUwoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJdGV4dCA9IHRleHQucmVwbGFjZUFsbChMSU5FX0ZFRURfUkVHRVgsIEhUTUxfQlJFQUsgKyBMSU5FX0ZFRUQpOwotCQkJdGV4dCA9IHRleHQucmVwbGFjZUFsbChFU0NBUEVEX0xJTkVfRkVFRF9SRUdFWCwgSFRNTF9CUkVBSwotCQkJCQkrIEVTQ0FQRURfTElORV9GRUVEKTsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSSSB0b1VSSShTdHJpbmcgcGF0aFN0cikgewotCQlpZiAocGF0aFN0ciAhPSBudWxsICYmIHBhdGhTdHIubGVuZ3RoKCkgPiAwKSB7Ci0JCQlJUGF0aCBwYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcocGF0aFN0cik7Ci0JCQl0cnkgewotCQkJCXJldHVybiBwYXRoLnRvRmlsZSgpLnRvVVJJKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9UaHJlYWRVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1RocmVhZFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTViNDIzYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1RocmVhZFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgaGFuZGxpbmcgdGhyZWFkcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUaHJlYWRVdGlsIHsKLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLiBBbGwKLQkgKiBtZXRob2RzIGluIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHN0YXRpYy4KLQkgKi8KLQlwcml2YXRlIFRocmVhZFV0aWwoKSB7Ci0JfQotCi0JLyoqCi0JICogUHV0cyB0aGUgY3VycmVudCB0aHJlYWQgdG8gc2xlZXAgZm9yIGEgZ2l2ZW4gZHVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHRpbWUKLQkgKiAgICAgICAgICAgIFRoZSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhdXNlKGxvbmcgdGltZSkgewotCQl0cnkgewotCQkJVGhyZWFkLnNsZWVwKHRpbWUpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvVGltZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvVGltZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlmMjk4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1RpbWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuQ2FsZW5kYXI7Ci0KLS8qKgotICogQSBzaW1wbGUgdGltZXIgZm9yIHRyYWNraW5nIHRpbWUuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUaW1lciB7Ci0KLQlwcml2YXRlIGxvbmcgaW5pdFRpbWU7Ci0KLQlwcml2YXRlIGxvbmcgc3RhcnRUaW1lOwotCi0JcHJpdmF0ZSBsb25nIGVuZFRpbWU7Ci0KLQlwdWJsaWMgVGltZXIoKSB7Ci0JCXN0YXJ0KCk7Ci0JCWluaXRUaW1lID0gc3RhcnRUaW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQlzdGFydFRpbWUgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCWVuZFRpbWUgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGltZSgpIHsKLQkJcmV0dXJuIChpbnQpIChlbmRUaW1lIC0gc3RhcnRUaW1lKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRvdGFsVGltZSgpIHsKLQkJcmV0dXJuIChpbnQpIChlbmRUaW1lIC0gaW5pdFRpbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9XYXJVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1dhclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkY2VmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1dhclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5XYXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLQotCi1wdWJsaWMgY2xhc3MgV2FyVXRpbCB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgd2FyIGZpbGUuCi0JICogCi0JICogQHBhcmFtIG91dHB1dFdhckZpbGUKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIHRhcmdldCB3YXIgZmlsZQotCSAqIEBwYXJhbSB3ZWJBcHBEaXJlY3RvcnkKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZmlsZXMgYW5kIHN1YgotCSAqICAgICAgICAgICAgZGlyZWN0b3JpZXMgdG8gYmUgd2FyZWQKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjcmVhdGluZyB0aGUgemlwIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYnVpbGRXYXJGaWxlKFN0cmluZyBvdXRwdXRXYXJGaWxlLCBTdHJpbmcgd2ViQXBwRGlyZWN0b3J5LAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCXRyeSB7Ci0JCQlQcm9qZWN0IGFudFByb2plY3QgPSBuZXcgUHJvamVjdCgpOwotCQkJYW50UHJvamVjdC5pbml0KCk7Ci0JCQlXYXIgd2FyVGFzayA9IG5ldyBXYXIoKTsKLQkJCXdhclRhc2suc2V0UHJvamVjdChhbnRQcm9qZWN0KTsKLQkJCXdhclRhc2suc2V0RGVzdEZpbGUobmV3IEZpbGUob3V0cHV0V2FyRmlsZSkpOwotCQkJd2FyVGFzay5zZXRXZWJ4bWwobmV3IEZpbGUod2ViQXBwRGlyZWN0b3J5ICsgRmlsZS5zZXBhcmF0b3IgKyAiV0VCLUlORiIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgIndlYi54bWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGVTZXQgd2ViRmlsZXMgPSBuZXcgRmlsZVNldCgpOwotCQkJd2ViRmlsZXMuc2V0RGlyKG5ldyBGaWxlKHdlYkFwcERpcmVjdG9yeSkpOwotCQkJd2FyVGFzay5hZGRGaWxlc2V0KHdlYkZpbGVzKTsKLQkJCXdhclRhc2suZXhlY3V0ZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1hNTFV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvWE1MVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjQ3NzhjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvWE1MVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBwcm9jZXNzaW5nIFhNTCBkb2N1bWVudHMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNTFV0aWwgewotCi0JLyoqCi0JICogWE1MIGRlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9ERUNMQVJBVElPTiA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBYTUwgRXNjYXBlIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX0FNUCA9ICImYW1wOyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9CQUNLU0xBU0ggPSAiJiM5MjsiOyAvLyROT04tTkxTLTEkCQotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX0FQT1MgPSAiJmFwb3M7IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX0NSID0gIiYjMTM7IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX0dUID0gIiZndDsiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfTFQgPSAiJmx0OyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9MRiA9ICImIzEwOyI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfUVVPVCA9ICImcXVvdDsiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfVEFCID0gIiYjOTsiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JMRiA9ICJcclxuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIENSTEZfQllURVMgPSBDUkxGLmdldEJ5dGVzKCk7Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4gQWxsCi0JICogbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHNob3VsZCBiZSBzdGF0aWMuCi0JICovCi0JcHJpdmF0ZSBYTUxVdGlsKCkgewotCX0KLQotCS8qKgotCSAqIENsb25lcyB0aGUgZ2l2ZW4gRE9NIG5vZGUgaW50byB0aGUgZ2l2ZW4gRE9NIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBUaGUgRE9NIG5vZGUgdG8gY2xvbmUuCi0JICogQHBhcmFtIGRvYwotCSAqICAgICAgICAgICAgVGhlIHRhcmdldCBET00gZG9jdW1lbnQuCi0JICogQHJldHVybiBUaGUgY2xvbmVkIG5vZGUgaW4gdGhlIHRhcmdldCBET00gZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBOb2RlIGNsb25lTm9kZShOb2RlIG5vZGUsIERvY3VtZW50IGRvYykgewotCQlOb2RlIGNsb25lID0gbnVsbDsKLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKLQkJCWNsb25lID0gZG9jLmNyZWF0ZUVsZW1lbnQobm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJCU5hbWVkTm9kZU1hcCBhdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJTm9kZSBhdHRyTm9kZSA9IGF0dHJzLml0ZW0oaSk7Ci0JCQkJQXR0ciBhdHRyQ2xvbmUgPSBkb2MuY3JlYXRlQXR0cmlidXRlKGF0dHJOb2RlLmdldE5vZGVOYW1lKCkpOwotCQkJCWF0dHJDbG9uZS5zZXROb2RlVmFsdWUoYXR0ck5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotCQkJCSgoRWxlbWVudCkgY2xvbmUpLnNldEF0dHJpYnV0ZU5vZGUoYXR0ckNsb25lKTsKLQkJCX0KLQotCQkJLy8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggY2hpbGQgbm9kZXMuCi0JCQlOb2RlTGlzdCBjaGlsZE5vZGVzID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlpZiAoY2hpbGROb2RlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJTm9kZSBjaGlsZE5vZGUgPSBjaGlsZE5vZGVzLml0ZW0oaSk7Ci0JCQkJCU5vZGUgY2hpbGRDbG9uZSA9IGNsb25lTm9kZShjaGlsZE5vZGUsIGRvYyk7Ci0JCQkJCWNsb25lLmFwcGVuZENoaWxkKGNoaWxkQ2xvbmUpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgTm9kZS5URVhUX05PREU6Ci0JCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREU6Ci0JCQljbG9uZSA9IGRvYy5jcmVhdGVUZXh0Tm9kZShub2RlLmdldE5vZGVOYW1lKCkpOwotCQkJY2xvbmUuc2V0Tm9kZVZhbHVlKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGNsb25lOwotCX0KLQotCS8qKgotCSAqIEVzY2FwZXMgYSBYTUwgYXR0cmlidXRlIHRvIG1ha2UgaXQgWE1MIHBhcnNlciBmcmllbmRseS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBUaGUgWE1MIGF0dHJpYnV0ZSBzdHJpbmcuCi0JICogQHJldHVybiBUaGUgZXNjYXBlZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlQXR0cihTdHJpbmcgc3RyKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBzdHIuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnPCc6Ci0JCQkJc2IuYXBwZW5kKFhNTF9MVCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICcmJzoKLQkJCQlzYi5hcHBlbmQoWE1MX0FNUCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICciJzoKLQkJCQlzYi5hcHBlbmQoWE1MX1FVT1QpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzYi5hcHBlbmQoY2gpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEVzY2FwZXMgdGhlIGdpdmVuIHN0cmluZyB0byBtYWtlIGl0IFhNTCBwYXJzZXIgZnJpZW5kbHkuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgVGhlIHNvdXJjZSBzdHJpbmcuCi0JICogQHJldHVybiBUaGUgZXNjYXBlZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyBzdHIpIHsKLQkJaWYgKHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGxlbiA9IHN0ci5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjaCA9IHN0ci5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICc8JzoKLQkJCQlzYi5hcHBlbmQoWE1MX0xUKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJz4nOgotCQkJCXNiLmFwcGVuZChYTUxfR1QpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnJic6Ci0JCQkJc2IuYXBwZW5kKFhNTF9BTVApOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnIic6Ci0JCQkJc2IuYXBwZW5kKFhNTF9RVU9UKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1wnJzoKLQkJCQlzYi5hcHBlbmQoWE1MX0FQT1MpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXHInOgotCQkJCXNiLmFwcGVuZChYTUxfQ1IpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXG4nOgotCQkJCXNiLmFwcGVuZChYTUxfTEYpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXFwnOgotCQkJCXNiLmFwcGVuZChYTUxfQkFDS1NMQVNIKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc2IuYXBwZW5kKGNoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBFc2NhcGVzIHRoZSBnaXZlbiBzdHJpbmcgdG8gbWFrZSBpdCBYTUwgcGFyc2VyIGZyaWVuZGx5LgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIFRoZSBzb3VyY2Ugc3RyaW5nLgotCSAqIEBwYXJhbSBpZ25vcmVDUkxGCi0JICogICAgICAgICAgICBJZiB0cnVlLCBkbyBub3QgZXNjYXBlIHRoZSBDUiBhbmQgTEYgY2hhcmFjdGVycy4KLQkgKiBAcmV0dXJuIFRoZSBlc2NhcGVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHN0ciwgYm9vbGVhbiBpZ25vcmVDUkxGKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBzdHIuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnPCc6Ci0JCQkJc2IuYXBwZW5kKFhNTF9MVCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICc+JzoKLQkJCQlzYi5hcHBlbmQoWE1MX0dUKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJyYnOgotCQkJCS8vIFRoaXMgaXMgdG8gYXZvaWQgdGhlIGRvdWJsZSBlc2NhcGluZyAoc2VlIEJ1Z3ppbGxhIDE3OTkyMSkKLQkJCQlpZiAoIXN0ci5zdGFydHNXaXRoKFhNTF9MVCsicC8iLCBpKSAmJiAhc3RyLnN0YXJ0c1dpdGgoWE1MX0FQT1MsIGkpIC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkmJiAhc3RyLnN0YXJ0c1dpdGgoWE1MX0FNUCwgaSkpCi0JCQkJCXNiLmFwcGVuZChYTUxfQU1QKTsKLQkJCQllbHNlCi0JCQkJCXNiLmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICciJzoKLQkJCQlzYi5hcHBlbmQoWE1MX1FVT1QpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXCcnOgotCQkJCXNiLmFwcGVuZChYTUxfQVBPUyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdccic6Ci0JCQkJaWYgKGlnbm9yZUNSTEYpCi0JCQkJCXNiLmFwcGVuZChjaCk7Ci0JCQkJZWxzZQotCQkJCQlzYi5hcHBlbmQoWE1MX0NSKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xuJzoKLQkJCQlpZiAoaWdub3JlQ1JMRikKLQkJCQkJc2IuYXBwZW5kKGNoKTsKLQkJCQllbHNlCi0JCQkJCXNiLmFwcGVuZChYTUxfTEYpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzYi5hcHBlbmQoY2gpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFVuZXNjYXBlcyB0aGUgZ2l2ZW4gWE1MIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBUaGUgc291cmNlIHN0cmluZy4KLQkgKiBAcmV0dXJuIFRoZSBlc2NhcGVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmVzY2FwZShTdHJpbmcgc3RyKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBzdHIuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnJic6Ci0JCQkJaWYgKHN0ci5zdGFydHNXaXRoKFhNTF9MVCwgaSkpIHsKLQkJCQkJc2IuYXBwZW5kKCc8Jyk7Ci0JCQkJCWkgKz0gMzsKLQkJCQl9IGVsc2UgaWYgKHN0ci5zdGFydHNXaXRoKFhNTF9HVCwgaSkpIHsKLQkJCQkJc2IuYXBwZW5kKCc+Jyk7Ci0JCQkJCWkgKz0gMzsKLQkJCQl9IGVsc2UgaWYgKHN0ci5zdGFydHNXaXRoKFhNTF9BTVAsIGkpKSB7Ci0JCQkJCXNiLmFwcGVuZCgnJicpOwotCQkJCQlpICs9IDQ7Ci0JCQkJfSBlbHNlIGlmIChzdHIuc3RhcnRzV2l0aChYTUxfUVVPVCwgaSkpIHsKLQkJCQkJc2IuYXBwZW5kKCciJyk7Ci0JCQkJCWkgKz0gNTsKLQkJCQl9IGVsc2UgaWYgKHN0ci5zdGFydHNXaXRoKFhNTF9BUE9TLCBpKSkgewotCQkJCQlzYi5hcHBlbmQoIlwnIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaSArPSA1OwotCQkJCX0gZWxzZSBpZiAoc3RyLnN0YXJ0c1dpdGgoWE1MX0NSLCBpKSkgewotCQkJCQlzYi5hcHBlbmQoJ1xyJyk7Ci0JCQkJCWkgKz0gNDsKLQkJCQl9IGVsc2UgaWYgKHN0ci5zdGFydHNXaXRoKFhNTF9MRiwgaSkpIHsKLQkJCQkJc2IuYXBwZW5kKCdcbicpOwotCQkJCQlpICs9IDQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2IuYXBwZW5kKGNoKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXNiLmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBET00gZG9jdW1lbnQgdG8gdGhlIG91dHB1dCBzdHJlYW0uCi0JICogCi0JICogQHBhcmFtIHhtbERvYwotCSAqICAgICAgICAgICAgVGhlIERPTSBkb2N1bWVudC4KLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHN0cmVhbS4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VyIHdoaWxlIGFjY2Vzc2luZyB0aGUgb3V0cHV0IHN0cmVhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVEb2N1bWVudChEb2N1bWVudCB4bWxEb2MsIE91dHB1dFN0cmVhbSBvdXRwdXQpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG91dHB1dCk7Ci0JCXdyaXRlTm9kZSh4bWxEb2MsICIiLCBvdXQpOyAvLyROT04tTkxTLTEkCi0JCW91dC5mbHVzaCgpOwotCX0KLQotCS8qKgotCSAqIFdyaXRlcyB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gRE9NIGRvY3VtZW50IHRvIHRoZSBQcmludFdyaXRlci4KLQkgKiAKLQkgKiBAcGFyYW0geG1sRG9jCi0JICogICAgICAgICAgICBUaGUgRE9NIGRvY3VtZW50LgotCSAqIEBwYXJhbSBwdwotCSAqICAgICAgICAgICAgVGhlIFByaW50V3JpdGVyIG9iamVjdC4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VyIHdoaWxlIGFjY2Vzc2luZyB0aGUgb3V0cHV0IHN0cmVhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVEb2N1bWVudChEb2N1bWVudCB4bWxEb2MsIFByaW50V3JpdGVyIHB3KQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG9zKTsKLQkJd3JpdGVOb2RlKHhtbERvYywgIiIsIG91dCk7IC8vJE5PTi1OTFMtMSQKLQkJb3V0LmZsdXNoKCk7Ci0JCS8vIEZJWE1FISBOZWVkIHRvIHNwZWNpZnkgZW5jb2Rpbmc/Ci0JCVN0cmluZyBzID0gb3MudG9TdHJpbmcoKTsKLQkJcHcud3JpdGUocyk7Ci0JCXB3LmZsdXNoKCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIERPTSBkb2N1bWVudCB0byBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB4bWxEb2MKLQkgKiAgICAgICAgICAgIFRoZSBET00gZG9jdW1lbnQuCi0JICogQHBhcmFtIHhtbEZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgZmlsZS4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VyIHdoaWxlIGFjY2Vzc2luZyB0aGUgb3V0cHV0IHN0cmVhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZURvY3VtZW50KERvY3VtZW50IHhtbERvYywgU3RyaW5nIHhtbEZpbGUpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKAotCQkJCXhtbEZpbGUpKTsKLQkJd3JpdGVOb2RlKHhtbERvYywgIiIsIG91dCk7IC8vJE5PTi1OTFMtMSQKLQkJb3V0LmZsdXNoKCk7Ci0JCW91dC5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBnaXZlbiBYTUwgc3RyaW5nIHRvIHRoZSBnaXZlbiBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc3RyaW5nLgotCSAqIEBwYXJhbSB4bWxGaWxlCi0JICogICAgICAgICAgICBUaGUgWE1MIGZpbGUuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1ciB3aGlsZSBhY2Nlc3NpbmcgdGhlIG91dHB1dCBzdHJlYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVEb2N1bWVudChTdHJpbmcgeG1sU3RyLCBTdHJpbmcgeG1sRmlsZSkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCURhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oCi0JCQkJeG1sRmlsZSkpOwotCQlvdXQud3JpdGUoeG1sU3RyLmdldEJ5dGVzKCkpOwotCQlvdXQuZmx1c2goKTsKLQkJb3V0LmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIHRoZSBnaXZlbiBET00gdHJlZSBub2RlIHRvIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBUaGUgRE9NIG5vZGUuCi0JICogQHBhcmFtIGluZGVudAotCSAqICAgICAgICAgICAgVGhlIHN0cmluZyBpbmRlbnRhdGlvbiAoY29udGFpbmluZyBzcGFjZSBjaGFyYWN0ZXJzKS4KLQkgKiBAcGFyYW0gb3V0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHN0cmVhbS4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VyIHdoaWxlIGFjY2Vzc2luZyB0aGUgb3V0cHV0IHN0cmVhbS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlTm9kZShOb2RlIG5vZGUsIFN0cmluZyBpbmRlbnQsIERhdGFPdXRwdXRTdHJlYW0gb3V0KQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRleHQ7Ci0KLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJY2FzZSBOb2RlLkRPQ1VNRU5UX05PREU6Ci0JCQkvLyBXcml0ZSB0aGUgWE1MIGZpbGUgc2lnbmF0dXJlLgotCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKFhNTF9ERUNMQVJBVElPTikpOwotCQkJb3V0LndyaXRlKENSTEZfQllURVMpOwotCi0JCQkvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBjaGlsZCBub2Rlcy4KLQkJCU5vZGVMaXN0IG5vZGVzID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlpZiAobm9kZXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQl3cml0ZU5vZGUobm9kZXMuaXRlbShpKSwgIiIsIG91dCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFOgotCQkJU3RyaW5nIG5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQlvdXQud3JpdGUoU3RyVXRpbC5nZXRVVEY4Qnl0ZXMoaW5kZW50ICsgIjwiICsgbmFtZSkpOyAvLyROT04tTkxTLTEkCi0JCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCU5vZGUgYXR0ck5vZGUgPSBhdHRycy5pdGVtKGkpOwotCQkJCW91dC53cml0ZShTdHJVdGlsLmdldFVURjhCeXRlcygiICIgKyBhdHRyTm9kZS5nZXROb2RlTmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgIj1cIiIgKyBlc2NhcGUoYXR0ck5vZGUuZ2V0Tm9kZVZhbHVlKCkpICsgIlwiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCW91dC53cml0ZShTdHJVdGlsLmdldFVURjhCeXRlcygiPiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJb3V0LndyaXRlKENSTEZfQllURVMpOwotCi0JCQkvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBjaGlsZCBub2Rlcy4KLQkJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCWlmIChjaGlsZE5vZGVzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQl3cml0ZU5vZGUoY2hpbGROb2Rlcy5pdGVtKGkpLCBpbmRlbnQsIG91dCk7Ci0JCQkJfQotCQkJfQotCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKGluZGVudCArICI8LyIgKyBuYW1lICsgIj4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJb3V0LndyaXRlKENSTEZfQllURVMpOwotCi0JCQlicmVhazsKLQotCQljYXNlIE5vZGUuVEVYVF9OT0RFOgotCQkJdGV4dCA9IFN0clV0aWwucmVtb3ZlV2hpdGVTcGFjZUNoYXJzKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotCQkJaWYgKHRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKGVzY2FwZSh0ZXh0KSkpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERToKLQkJCXRleHQgPSBTdHJVdGlsLnJlbW92ZVdoaXRlU3BhY2VDaGFycyhub2RlLmdldE5vZGVWYWx1ZSgpKTsKLQkJCWlmICh0ZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJCW91dC53cml0ZShTdHJVdGlsLmdldFVURjhCeXRlcygiPCFbQ0RBVEFbIikpOyAvLyROT04tTkxTLTEkCi0JCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKHRleHQpKTsKLQkJCQlvdXQud3JpdGUoU3RyVXRpbC5nZXRVVEY4Qnl0ZXMoIl1dPiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCW91dC53cml0ZShDUkxGX0JZVEVTKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6Ci0JCQlvdXQud3JpdGUoU3RyVXRpbC5nZXRVVEY4Qnl0ZXMoIjw/IiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCSsgIiAiICsgbm9kZS5nZXROb2RlVmFsdWUoKSArICI/PiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlvdXQud3JpdGUoQ1JMRl9CWVRFUyk7Ci0JCQlicmVhazsKLQotCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFOgotCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKCImIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICI7IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZSBsb2NhdGlvbiB3aGVyZSB0aGUgZ2l2ZW4gU0FYIGV4Y2VwdGlvbiBvY2N1cnJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgVGhlIFNBWCBwYXJzZSBleGNlcHRpb24uCi0JICogQHJldHVybiBBIHN0cmluZyBjb250YWluaW5nIHRoZSBmaWxlIGxvY2F0aW9uIHdoZXJlIHRoZSBleGNlcHRpb24KLQkgKiAgICAgICAgIG9jY3VycmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2F0aW9uT2ZFeGNlcHRpb24oU0FYUGFyc2VFeGNlcHRpb24gZSkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZCgicm93ICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChlLmdldExpbmVOdW1iZXIoKSk7Ci0JCXNiLmFwcGVuZCgiLCBjb2wgIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKGUuZ2V0Q29sdW1uTnVtYmVyKCkpOwotCi0JCVN0cmluZyBzeXN0ZW1JZCA9IGUuZ2V0U3lzdGVtSWQoKTsKLQkJaWYgKHN5c3RlbUlkICE9IG51bGwpIHsKLQkJCWludCBpbmRleCA9IHN5c3RlbUlkLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQlzeXN0ZW1JZCA9IHN5c3RlbUlkLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJfQotCQkJc2IuYXBwZW5kKCIgb2YgWE1MIGRvY3VtZW50ICIpOyAvLyROT04tTkxTLTEkCi0JCQlzYi5hcHBlbmQoc3lzdGVtSWQpOwotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudCBsb2FkWG1sKEZpbGUgZmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCURvY3VtZW50QnVpbGRlckZhY3RvcnkgYnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Ci0JCQkJLm5ld0luc3RhbmNlKCk7Ci0JCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gYnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0KLQkJcmV0dXJuIGJ1aWxkZXIucGFyc2UoZmlsZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudCBjcmVhdGVEb2N1bWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeQotCQkJCS5uZXdJbnN0YW5jZSgpOwotCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQlyZXR1cm4gYnVpbGRlci5uZXdEb2N1bWVudCgpOwotCX0KLQotCS8qKgotCSAqIHRleHQgb2YgYSBsZWFmIG5vZGUsIHdpdGhvdXQgY2hpbGQgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSB0YWcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5vZGVUZXh0KEVsZW1lbnQgdGFnKSB7Ci0JCVN0cmluZyB0ZXh0ID0gdGFnLnRvU3RyaW5nKCk7Ci0JCWludCBpID0gdGV4dC5pbmRleE9mKCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGogPSB0ZXh0Lmxhc3RJbmRleE9mKCI8LyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpIDwgMCB8fCBqIDwgMCB8fCBqIDwgaSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcoaSArIDEsIGopOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENoaWxkVGV4dChFbGVtZW50IHRhZywgU3RyaW5nIGNoaWxkVGFnTmFtZSkgewotCQlFbGVtZW50IGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCh0YWcsIGNoaWxkVGFnTmFtZSk7Ci0JCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0Tm9kZVRleHQoY2hpbGQpOwotCQl9Ci0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBFbGVtZW50IGdldEZpcnN0Q2hpbGQoRWxlbWVudCB0YWcsIFN0cmluZyBjaGlsZFRhZ05hbWUpIHsKLQkJTm9kZUxpc3Qgbm9kZXMgPSB0YWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoY2hpbGRUYWdOYW1lKTsKLQkJaWYgKG5vZGVzID09IG51bGwgfHwgbm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gKEVsZW1lbnQpIG5vZGVzLml0ZW0oMCk7Ci0JfQotCi0JLyoqCi0JICogaXRlcmF0b3Igb2YgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSB0YWcKLQkgKiBAcmV0dXJuIEl0ZXJhdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvciBjaGlsZEl0ZXJhdG9yKEVsZW1lbnQgdGFnKSB7Ci0JCU5vZGVMaXN0IG5vZGVzID0gdGFnLmdldENoaWxkTm9kZXMoKTsKLQotCQkvLyBOb2RlTGlzdCBjb250YWlucyBubyBFbGVtZW50IG5vZGVzIHN1Y2ggYXMgdGV4dCBub2RlcywgaWdub3JlIHRob3NlCi0JCUxpc3Q8Tm9kZT4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7Ci0JCWlmIChub2RlcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IG5vZGVzLmdldExlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKGkpOwotCQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCQllbGVtZW50cy5hZGQobm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9kZUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCQlpbnQgY3VycmVudEluZGV4ID0gLTE7Ci0KLQkJaW50IHNpemUgPSAwOwotCi0JCU5vZGVMaXN0IG5vZGVzID0gbnVsbDsKLQotCQlwdWJsaWMgTm9kZUl0ZXJhdG9yKE5vZGVMaXN0IG5vZGVzKSB7Ci0JCQl0aGlzLm5vZGVzID0gbm9kZXM7Ci0JCQlpZiAobm9kZXMgIT0gbnVsbCkKLQkJCQlzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQkvLyBEbyBub3RoaW5nLCB0aGlzIGlzIGEgcmVhZG9ubHkgaXRlcmF0b3IuCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIGN1cnJlbnRJbmRleCArIDEgPCBzaXplOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJaWYgKGhhc05leHQoKSkgewotCQkJCXJldHVybiBub2Rlcy5pdGVtKCsrY3VycmVudEluZGV4KTsKLQkJCX0KLQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBpdGVyYXRvciBvZiBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIHRhZwotCSAqIEByZXR1cm4gSXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGNoaWxkSXRlcmF0b3IoRWxlbWVudCB0YWcsIFN0cmluZyBjaGlsZFRhZ05hbWUpIHsKLQkJTm9kZUxpc3Qgbm9kZXMgPSB0YWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoY2hpbGRUYWdOYW1lKTsKLQkJcmV0dXJuIG5ldyBOb2RlSXRlcmF0b3Iobm9kZXMpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvWmlwVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9aaXBVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YjczMGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9aaXBVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyB6aXAgZmlsZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgWmlwVXRpbCB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgemlwIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHppcEZpbGVQYXRoCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB0YXJnZXQgemlwIGZpbGUKLQkgKiBAcGFyYW0gY29udGVudFBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZmlsZXMgYW5kIHN1YgotCSAqICAgICAgICAgICAgZGlyZWN0b3JpZXMgdG8gYmUgemlwcGVkCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhlIHppcCBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVppcEZpbGUoU3RyaW5nIHppcEZpbGVQYXRoLCBTdHJpbmcgY29udGVudFBhdGgsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVppcE91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotCQl0cnkgewotCQkJb3V0ID0gbmV3IFppcE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgKLQkJCQkJemlwRmlsZVBhdGgpKTsKLQkJCUZpbGUgY29udGVudERpciA9IG5ldyBGaWxlKGNvbnRlbnRQYXRoKTsKLQkJCXBvcHVsYXRlWmlwRmlsZShvdXQsIGNvbnRlbnREaXIuZ2V0QWJzb2x1dGVQYXRoKCksIGNvbnRlbnREaXIsCi0JCQkJCW1vbml0b3IpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChvdXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCW91dC5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgYSB6aXAgZmlsZSB3aXRoIGRpcmVjdG9yaWVzIGFuZCBmaWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gb3V0Ci0JICogICAgICAgICAgICBhIHppcCBmaWxlIG91dHB1dCBzdHJlYW0KLQkgKiBAcGFyYW0gcm9vdFBhdGgKLQkgKiAgICAgICAgICAgIGEgcm9vdCBwYXRoIHRoYXQgaXMgdXNlZCB0byBjb21wdXRlIHRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUKLQkgKiAgICAgICAgICAgIHppcCBjb250ZW50Ci0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIGEgZmlsZSBvciBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBvcHVsYXRlWmlwRmlsZShaaXBPdXRwdXRTdHJlYW0gb3V0LCBTdHJpbmcgcm9vdFBhdGgsCi0JCQlGaWxlIGZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZVtdIGZpbGVzID0gZmlsZS5saXN0RmlsZXMoKTsKLQkJaWYgKGZpbGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCQlwb3B1bGF0ZVppcEZpbGUob3V0LCByb290UGF0aCwgZmlsZXNbaV0sIG1vbml0b3IpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN0cmluZyBmaWxlUGF0aCA9IGZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpOwotCQkJCQlGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVQYXRoKTsKLQkJCQkJU3RyaW5nIHJlbGF0aXZlUGF0aCA9IGZpbGVQYXRoCi0JCQkJCQkJLnN1YnN0cmluZyhyb290UGF0aC5sZW5ndGgoKSArIDEpOwotCQkJCQlvdXQucHV0TmV4dEVudHJ5KG5ldyBaaXBFbnRyeShyZWxhdGl2ZVBhdGgpKTsKLQkJCQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwMjRdOwotCQkJCQlpbnQgbGVuOwotCQkJCQl3aGlsZSAoKGxlbiA9IGluLnJlYWQoYnVmZmVyKSkgPiAwKSB7Ci0JCQkJCQlvdXQud3JpdGUoYnVmZmVyLCAwLCBsZW4pOwotCQkJCQl9Ci0JCQkJCW91dC5jbG9zZUVudHJ5KCk7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjE2YmFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgY29tbW9uIGNsaXBib2FyZCwgZmlsZSwgSTE4TiwgaW1hZ2UsIG5ldHdvcmtpbmcsIHN0cmluZyBtYW5pcHVsYXRpb24gYW5kIHRocmVhZGluZyBzZXJ2aWNlcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3htbC9BYnN0cmFjdFNBWFBhcnNlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi94bWwvQWJzdHJhY3RTQVhQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM5MWExZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3htbC9BYnN0cmFjdFNBWFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ueG1sOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogQW4gYWJzdHJhY3QgU0FYIHBhcnNlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHBhcnNlIGEgc2luZ2xlIFhNTCBmaWxlIG9yIGEKLSAqIGRpcmVjdG9yeSBvZiBYTUwgZmlsZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTQVhQYXJzZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7Ci0KLQkvKioKLQkgKiBUaGUgbG9nZ2VyIHVzZWQgZm9yIGxvZ2dpbmcgd2FybmluZ3MsIGVycm9ycyBhbmQgZXhjZXB0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgTG9nZ2VyIGxvZ2dlcjsKLQotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IFhNTCBmaWxlIGJlaW5nIHBhcnNlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHhtbEZpbGU7Ci0KLQkvKioKLQkgKiBUaGUgU3RyaW5nIGJ1ZmZlciBmb3IgYWNjdW11bGF0aW5nIHRleHQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciBzdHJCdWY7Ci0KLQkvKioKLQkgKiBUaGUgWE1MIHZhbGlkYXRpbmcgZmxhZy4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGluZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+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+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGQ0ZGQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmpmYWNlLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS51aS52aWV3cywKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWksCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWksCi0gb3JnLmVjbGlwc2UuZ2VmO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5wcm9wZXJ0aWVzO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuaWRlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVuZGVyO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvcjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLnByb3ZpZGVycywKLSBvcmcuZWNsaXBzZS51bWwyLnVtbDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS51bWwyLnVtbC5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZHJhdzJkO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi51bWEsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnksCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5nZW9zaGFwZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZSwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZywKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLnJlbmRlciwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYTUzZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL2FjdGl2aXR5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vYWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzM5M2U2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vYWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZGlhZ3JhbS9pdGVyYXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZGlhZ3JhbS9pdGVyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWM4YTE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vaXRlcmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vbWlsZXN0b25lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vbWlsZXN0b25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2ZmY5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL21pbGVzdG9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL3BoYXNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vcGhhc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWNiM2NkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vcGhhc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZGlhZ3JhbS90YXNrZGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL3Rhc2tkZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1ZDY1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL3Rhc2tkZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vdGFza2Rlc2NyaXB0b3IxLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vdGFza2Rlc2NyaXB0b3IxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1ZDY1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL3Rhc2tkZXNjcmlwdG9yMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL2R0b29sMTYvQURFZGl0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9kdG9vbDE2L0FERWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUwZmFmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL2R0b29sMTYvQURFZGl0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9ldG9vbDE2L0FERWRpdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvZXRvb2wxNi9BREVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNTZmMTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9ldG9vbDE2L0FERWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5RmluYWxOb2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlGaW5hbE5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDQ5NzI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlGaW5hbE5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eVBhcnRpdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5UGFydGl0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE2OGRjMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5UGFydGl0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvQ29udHJvbEZsb3cuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9Db250cm9sRmxvdy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMGMyMjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9Db250cm9sRmxvdy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0RlY2lzaW9uTm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0RlY2lzaW9uTm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YTYwMWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9EZWNpc2lvbk5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9Gb3JrTm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0ZvcmtOb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdjMjBiMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0ZvcmtOb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvSW5pdGlhbE5vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9Jbml0aWFsTm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NWNmNzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9Jbml0aWFsTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0l0ZXJhdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0l0ZXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMTFlNDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9JdGVyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9Kb2luTm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0pvaW5Ob2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhjM2EzOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0pvaW5Ob2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvTWVyZ2VOb2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvTWVyZ2VOb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0Y2I5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L01lcmdlTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NjE1ZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9NaWxlc3RvbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9QaGFzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L1BoYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRlYjlkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L1BoYXNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjBmYjI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTRlMjZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9kZWxldGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9kZWxldGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjkyMmFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvZGVsZXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL29iajE2L1VNTERpYWdyYW1GaWxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL29iajE2L1VNTERpYWdyYW1GaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdhYTJkZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9vYmoxNi9VTUxEaWFncmFtRmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy93aXpiYW4vTmV3VU1MV2l6YXJkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL3dpemJhbi9OZXdVTUxXaXphcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2UwM2JmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL3dpemJhbi9OZXdVTUxXaXphcmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbWVzc2FnZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOGUwOWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU1RBUlQgTk8gVFJBTlNMQVRJT04KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRPRE86IG1hbnVhbGx5IHB1dCBrZXlzIGFuZCB2YWx1ZXMKLVVNTERpYWdyYW1FZGl0b3JVdGlsX09wZW5Nb2RlbFJlc291cmNlRXJyb3JEaWFsb2dUaXRsZT1FcnJvcgotVU1MRGlhZ3JhbUVkaXRvclV0aWxfT3Blbk1vZGVsUmVzb3VyY2VFcnJvckRpYWxvZ01lc3NhZ2U9RmFpbGVkIHRvIGxvYWQgbW9kZWwgZmlsZSB7MH0KLVVNTERpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Qcm9ncmVzc1Rhc2s9Q3JlYXRpbmcgZGlhZ3JhbSBhbmQgbW9kZWwgZmlsZXMKLVVNTERpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Db21tYW5kTGFiZWw9Q3JlYXRpbmcgZGlhZ3JhbSBhbmQgbW9kZWwKLVVNTERvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlPVVwZGF0aW5nIGNhY2hlIGZhaWxlZAotVU1MRG9jdW1lbnRQcm92aWRlcl9oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQ9RmFpbGVkIHRvIHJlZnJlc2ggaGllcmFyY2h5IGZvciBjaGFuZ2VkIHJlc291cmNlCi1VTUxEb2N1bWVudFByb3ZpZGVyX0luY29ycmVjdElucHV0RXJyb3I9ezF9Ci1VTUxEb2N1bWVudFByb3ZpZGVyX1VuYWJsZVRvTG9hZFJlc291cmNlRXJyb3I9VW5hYmxlIHRvIGxvYWQgZGlhZ3JhbSByZXNvdXJjZQotVU1MRG9jdW1lbnRQcm92aWRlcl9Ob0RpYWdyYW1JblJlc291cmNlRXJyb3I9RGlhZ3JhbSBpcyBub3QgcHJlc2VudCBpbiByZXNvdXJjZQotVU1MRG9jdW1lbnRQcm92aWRlcl9EaWFncmFtTG9hZGluZ0Vycm9yPUVycm9yIGxvYWRpbmcgZGlhZ3JhbQotVU1MRG9jdW1lbnRQcm92aWRlcl9VbnN5bmNocm9uaXplZEZpbGVTYXZlRXJyb3I9VGhlIGZpbGUgaGFzIGJlZW4gY2hhbmdlZCBvbiB0aGUgZmlsZSBzeXN0ZW0KLVVNTERvY3VtZW50UHJvdmlkZXJfU2F2ZURpYWdyYW1UYXNrPVNhdmluZyBkaWFncmFtCi1VTUxEb2N1bWVudFByb3ZpZGVyX1NhdmVOZXh0UmVzb3VyY2VUYXNrPVNhdmluZyB7MH0KLVVNTEluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVSZXNvdXJjZUVycm9yRGlhbG9nVGl0bGU9RXJyb3IKLVVNTEluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVSZXNvdXJjZUVycm9yRGlhbG9nTWVzc2FnZT1Nb2RlbCBmaWxlIGxvYWRpbmcgZmFpbGVkCi1VTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlV2l6YXJkVGl0bGU9SW5pdGlhbGl6ZSBuZXcgezB9IGRpYWdyYW0gZmlsZQotVU1MSW5pdERpYWdyYW1GaWxlQWN0aW9uX09wZW5Nb2RlbEZpbGVEaWFsb2dUaXRsZT1TZWxlY3QgZG9tYWluIG1vZGVsCi1VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VOYW1lPUluaXRpYWxpemUgbmV3IGRpYWdyYW0gZmlsZQotVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlVGl0bGU9RGlhZ3JhbSBmaWxlCi1VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VEZXNjcmlwdGlvbj1DcmVhdGUgbmV3IGRpYWdyYW0gYmFzZWQgb24gezB9IG1vZGVsIGNvbnRlbnQKLVVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlTmFtZT1TZWxlY3QgZGlhZ3JhbSByb290IGVsZW1lbnQKLVVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlVGl0bGU9RGlhZ3JhbSByb290IGVsZW1lbnQKLVVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlRGVzY3JpcHRpb249U2VsZWN0IHNlbWFudGljIG1vZGVsIGVsZW1lbnQgdG8gYmUgZGVwaWN0ZWQgb24gZGlhZ3JhbQotVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VTZWxlY3Rpb25UaXRsZT1TZWxlY3QgZGlhZ3JhbSByb290IGVsZW1lbnQ6Ci1VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5vU2VsZWN0aW9uTWVzc2FnZT1EaWFncmFtIHJvb3QgZWxlbWVudCBpcyBub3Qgc2VsZWN0ZWQKLVVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlSW52YWxpZFNlbGVjdGlvbk1lc3NhZ2U9SW52YWxpZCBkaWFncmFtIHJvb3QgZWxlbWVudCBpcyBzZWxlY3RlZAotVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5pdERpYWdyYW1Db21tYW5kPUluaXRpYWxpemluZyBkaWFncmFtIGNvbnRlbnRzCi1VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9JbmNvcnJlY3RSb290RXJyb3I9SW5jb3JyZWN0IG1vZGVsIG9iamVjdCBzdG9yZWQgYXMgYSByb290IHJlc291cmNlIG9iamVjdAotRmxvd3MxR3JvdXBfdGl0bGU9Rmxvd3MKLUZsb3dzMUdyb3VwX2Rlc2M9Q3JlYXRpb24gdG9vbCBmb3IgZmxvd3MKLU5vZGVzMkdyb3VwX3RpdGxlPU5vZGVzCi1Ob2RlczJHcm91cF9kZXNjPUNyZWF0aW9uIHRvb2wgZ3JvdXAgZm9yIG5vZGVzCi1Db250cm9sRmxvdzFDcmVhdGlvblRvb2xfdGl0bGU9Q29udHJvbCBGbG93Ci1Db250cm9sRmxvdzFDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IENvbnRyb2wgRmxvdwotQWN0aXZpdHlQYXJ0aXRpb24xQ3JlYXRpb25Ub29sX3RpdGxlPUFjdGl2aXR5IFBhcnRpdGlvbgotQWN0aXZpdHlQYXJ0aXRpb24xQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBBY3Rpdml0eSBQYXJ0aXRpb24KLVN0YXJ0Tm9kZTJDcmVhdGlvblRvb2xfdGl0bGU9U3RhcnQgTm9kZQotU3RhcnROb2RlMkNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgU3RhcnQgTm9kZQotRm9ya05vZGUzQ3JlYXRpb25Ub29sX3RpdGxlPUZvcmsgTm9kZQotRm9ya05vZGUzQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBGb3JrIE5vZGUKLU1lcmdlTm9kZTRDcmVhdGlvblRvb2xfdGl0bGU9TWVyZ2UgTm9kZQotTWVyZ2VOb2RlNENyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgTWVyZ2UgTm9kZQotRGVjaXNpb25Ob2RlNUNyZWF0aW9uVG9vbF90aXRsZT1EZWNpc2lvbiBOb2RlCi1EZWNpc2lvbk5vZGU1Q3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBEZWNpc2lvbiBOb2RlCi1FbmROb2RlNkNyZWF0aW9uVG9vbF90aXRsZT1FbmQgTm9kZQotRW5kTm9kZTZDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IEVuZCBOb2RlCi1Kb2luTm9kZTdDcmVhdGlvblRvb2xfdGl0bGU9Sm9pbiBOb2RlCi1Kb2luTm9kZTdDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IEpvaW4gTm9kZQotQWN0aXZpdHk5Q3JlYXRpb25Ub29sX3RpdGxlPUFjdGl2aXR5Ci1BY3Rpdml0eTlDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IEFjdGl2aXR5Ci1QaGFzZTEwQ3JlYXRpb25Ub29sX3RpdGxlPVBoYXNlCi1QaGFzZTEwQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBQaGFzZQotSXRlcmF0aW9uMTFDcmVhdGlvblRvb2xfdGl0bGU9SXRlcmF0aW9uCi1JdGVyYXRpb24xMUNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgSXRlcmF0aW9uCi1UYXNrRGVzY3JpcHRvcjEyQ3JlYXRpb25Ub29sX3RpdGxlPVRhc2sgRGVzY3JpcHRvcgotVGFza0Rlc2NyaXB0b3IxMkNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgVGFzayBEZXNjcmlwdG9yCi1NaWxlc3RvbmUxM0NyZWF0aW9uVG9vbF90aXRsZT1NaWxlc3RvbmUKLU1pbGVzdG9uZTEzQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBNaWxlc3RvbmUKLUFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydF90aXRsZT1QYXJ0aXRpb25DYW1wYXJ0bWVudAotQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydF90aXRsZT1QYXJ0aXRpb25DYW1wYXJ0bWVudAotQ29tbWFuZE5hbWVfT3BlbkRpYWdyYW09T3BlbiBEaWFncmFtCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBFTkQgTk8gVFJBTlNMQVRJT04KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbW9kZWwvZXBmZGlhZ3JhbS5nbWZnZW4gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tb2RlbC9lcGZkaWFncmFtLmdtZmdlbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlOTZkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tb2RlbC9lcGZkaWFncmFtLmdtZmdlbgorKysgL2Rldi9udWxsCkBAIC0xLDkyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZmdlbjpHZW5FZGl0b3JHZW5lcmF0b3IgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczpnbWZnZW49Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDYvR2VuTW9kZWwiIHBhY2thZ2VOYW1lUHJlZml4PSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZCIKLSAgICBtb2RlbElEPSJBRCIKLSAgICBzYW1lRmlsZUZvckRpYWdyYW1BbmRNb2RlbD0idHJ1ZSIKLSAgICBkaWFncmFtRmlsZUV4dGVuc2lvbj0ieG1pIgotICAgIHRlbXBsYXRlRGlyZWN0b3J5PSIiCi0gICAgY29weXJpZ2h0VGV4dD0iIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mI3hEOyYjeEE7IEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMmI3hEOyYjeEE7IGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCYjeEQ7JiN4QTsgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQmI3hEOyYjeEE7IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJiN4RDsmI3hBOyYjeEQ7JiN4QTsgQ29udHJpYnV0b3JzOiYjeEQ7JiN4QTsgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiYjeEQ7JiN4QTsiPgotICA8ZGlhZ3JhbQotICAgICAgdmlzdWFsSUQ9Ijc5IgotICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5RWRpdFBhcnQiCi0gICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVZpZXdGYWN0b3J5IgotICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgaWNvblByb3ZpZGVyUHJpb3JpdHk9IkxvdyIKLSAgICAgIGNyZWF0aW9uV2l6YXJkSWNvblBhdGg9Imljb25zL2RpYWdyYW0vYWN0aXZpdHkuZ2lmIgotICAgICAgdmFsaWRhdGlvblByb3ZpZGVyQ2xhc3NOYW1lPSJWYWxpZGF0aW9uUHJvdmlkZXIiCi0gICAgICBtZXRyaWNQcm92aWRlckNsYXNzTmFtZT0iTWV0cmljUHJvdmlkZXIiCi0gICAgICB2YWxpZGF0aW9uRGVjb3JhdG9yUHJvdmlkZXJDbGFzc05hbWU9IlZhbGlkYXRpb25EZWNvcmF0b3JQcm92aWRlciI+Ci0gICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRGlhZ3JhbSIvPgotICAgIDxlbGVtZW50VHlwZQotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkFjdGl2aXR5RWRpdEhlbHBlciIvPgotICAgIDx2aWV3bWFwCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllciIvPgotICAgIDxkb21haW5EaWFncmFtRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkiLz4KLSAgICA8Y2hpbGROb2RlcwotICAgICAgICB2aXN1YWxJRD0iMjAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbjJJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbjJWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb24yQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgY29tcGFydG1lbnRzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IgotICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMCI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIgotICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNy9AZWxlbWVudFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckFkdmljZUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyQWR2aWNlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgbGF5b3V0VHlwZT0iWFlfTEFZT1VUIgotICAgICAgICAgIGNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuWFlMYXlvdXQgbXlHZW5MYXlvdXRNYW5hZ2VyID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dCgpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0TGF5b3V0TWFuYWdlcihteUdlbkxheW91dE1hbmFnZXIpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuYmxhY2smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihBQ1RJVklUWVBBUlRJVElPTkZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMzAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg2MDApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDMwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNjAwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJvcmRlcigmI3hEOyYjeEE7bmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyKCkmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmUGFydGl0aW9uTGFiZWxGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmUGFydGl0aW9uTGFiZWxGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmUGFydGl0aW9uTGFiZWxGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBBQ1RJVklUWVBBUlRJVElPTkZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMjU1KTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlQYXJ0aXRpb24iLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eVBhcnRpdGlvbi9zdWJwYXJ0aXRpb24iLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eVBhcnRpdGlvbi9zdWJwYXJ0aXRpb24iLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwNiIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25OYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbk5hbWVWaWV3RmFjdG9yeSIKLSAgICAgICAgICBlbGVtZW50SWNvbj0idHJ1ZSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2NoaWxkTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJFbmROb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEVuZE5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uZmlndXJlcy5FbmROb2RlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBFbmROb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmRhcmtCbHVlJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRU5ETk9ERUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMjQpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDI0KSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgyNCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMjQpKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgRU5ETk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCA0NSwgODUsIDEzMCk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5RmluYWxOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkV4dGVybmFsTm9kZUxhYmVsIgotICAgICAgICAgIHZpc3VhbElEPSI0MDAxIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIj4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49IiIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9Ik1lcmdlTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNZXJnZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJNZXJnZU5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iTWVyZ2VOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9Ik1lcmdlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9Ik1lcmdlTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkRlY2lzaW9uRGlhbW9uZEZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uZmlndXJlcy5EZWNpc2lvbk5vZGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5kYXJrQmx1ZSYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKERFQ0lTSU9ORElBTU9OREZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVEaWFtb25kTGFiZWwoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZEaWFtb25kTGFiZWw7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVEaWFtb25kTGFiZWwoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkRpYW1vbmRMYWJlbDsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVEaWFtb25kTGFiZWwob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmRGlhbW9uZExhYmVsID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgREVDSVNJT05ESUFNT05ERklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDE4NSwgMjA1LCAyMzApOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEZvcmVncm91bmQ9InRydWUiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9NZXJnZU5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDAyIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJNZXJnZU5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTWVyZ2VOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTWVyZ2VOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgICBjbGFzc05hbWU9Ik5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgTm9kZU5hbWVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIE5vZGVOYW1lRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFRleHQoJnF1b3Q7JnF1b3Q7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDMiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJGb3JrTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJGb3JrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkZvcmtOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkZvcmtOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkZvcmtOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iRm9ya05vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJGb3JrTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBGb3JrTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEZvcmtOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKEZPUktOT0RFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIEZPUktOT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDQ1LCA4NSwgMTMwKTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlJlc2l6ZUNvbnN0cmFpbnRzIgotICAgICAgICAgICAgcmVzaXplSGFuZGxlcz0iMjQiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9Gb3JrTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDA0IgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iSW5pdGlhbE5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iSW5pdGlhbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJJbml0aWFsTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJJbml0aWFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJJbml0aWFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkluaXRpYWxOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iSW5pdGlhbE5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgSW5pdGlhbE5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuRWxsaXBzZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgSW5pdGlhbE5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUmI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihJTklUSUFMTk9ERUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMjApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBJTklUSUFMTk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCA0NSwgODUsIDEzMCk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0luaXRpYWxOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkV4dGVybmFsTm9kZUxhYmVsIgotICAgICAgICAgIHZpc3VhbElEPSI0MDAzIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJJbml0aWFsTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJJbml0aWFsTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkluaXRpYWxOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIj4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49IiIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+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+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+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+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2xpbmtzPgotICAgIDxjb21wYXJ0bWVudHMKLSAgICAgICAgdmlzdWFsSUQ9IjUwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Vmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiCi0gICAgICAgIHRpdGxlPSJQYXJ0aXRpb25DYW1wYXJ0bWVudCIKLSAgICAgICAgY2FuQ29sbGFwc2U9ImZhbHNlIgotICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSIKLSAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy43IgotICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIj4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgIDwvY29tcGFydG1lbnRzPgotICAgIDxjb21wYXJ0bWVudHMKLSAgICAgICAgdmlzdWFsSUQ9IjUwMDIiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIgotICAgICAgICB0aXRsZT0iUGFydGl0aW9uQ2FtcGFydG1lbnQiCi0gICAgICAgIGNhbkNvbGxhcHNlPSJmYWxzZSIKLSAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiCi0gICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIKLSAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8cGFsZXR0ZT4KLSAgICAgIDxncm91cHMKLSAgICAgICAgICB0aXRsZT0iRmxvd3MiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0aW9uIHRvb2wgZm9yIGZsb3dzIgotICAgICAgICAgIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkNvbnRyb2wgRmxvdyIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IENvbnRyb2wgRmxvdyIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Db250cm9sRmxvdy5naWYiCi0gICAgICAgICAgICBnZW5MaW5rcz0iLy9AZGlhZ3JhbS9AbGlua3MuMCIvPgotICAgICAgPC9ncm91cHM+Ci0gICAgICA8Z3JvdXBzCi0gICAgICAgICAgdGl0bGU9Ik5vZGVzIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGlvbiB0b29sIGdyb3VwIGZvciBub2RlcyIKLSAgICAgICAgICBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJBY3Rpdml0eSBQYXJ0aXRpb24iCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBBY3Rpdml0eSBQYXJ0aXRpb24iCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlQYXJ0aXRpb24uZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IlN0YXJ0IE5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBTdGFydCBOb2RlIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0luaXRpYWxOb2RlLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjMiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkZvcmsgTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEZvcmsgTm9kZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Gb3JrTm9kZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4yIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJNZXJnZSBOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgTWVyZ2UgTm9kZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9NZXJnZU5vZGUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iRGVjaXNpb24gTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IERlY2lzaW9uIE5vZGUiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvRGVjaXNpb25Ob2RlLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjQiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkVuZCBOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgRW5kIE5vZGUiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlGaW5hbE5vZGUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iSm9pbiBOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgSm9pbiBOb2RlIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0pvaW5Ob2RlLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjUiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U2VwYXJhdG9yIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJBY3Rpdml0eSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEFjdGl2aXR5IgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjYiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IlBoYXNlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgUGhhc2UiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvUGhhc2UuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOSIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iSXRlcmF0aW9uIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgSXRlcmF0aW9uIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0l0ZXJhdGlvbi5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xMCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iVGFzayBEZXNjcmlwdG9yIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgVGFzayBEZXNjcmlwdG9yIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjgiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9Ik1pbGVzdG9uZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IE1pbGVzdG9uZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9NaWxlc3RvbmUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMTEiLz4KLSAgICAgIDwvZ3JvdXBzPgotICAgIDwvcGFsZXR0ZT4KLSAgPC9kaWFncmFtPgotICA8cGx1Z2luCi0gICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQiCi0gICAgICBuYW1lPSJFUEYgQWN0aXZpdHkgRGlhZ3JhbSIKLSAgICAgIHByb3ZpZGVyPSJFY2xpcHNlLm9yZyIKLSAgICAgIHZlcnNpb249IjEuMi4wLnF1YWxpZmllciIKLSAgICAgIHByaW50aW5nRW5hYmxlZD0idHJ1ZSIKLSAgICAgIGFjdGl2YXRvckNsYXNzTmFtZT0iQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luIi8+Ci0gIDxlZGl0b3IKLSAgICAgIGNsYXNzTmFtZT0iQWN0aXZpdHlEaWFncmFtRWRpdG9yIi8+Ci0gIDxkb21haW5HZW5Nb2RlbAotICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8iLz4KLSAgPGV4cHJlc3Npb25Qcm92aWRlcnM+Ci0gICAgPHByb3ZpZGVycwotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkphdmFFeHByZXNzaW9uUHJvdmlkZXIiCi0gICAgICAgIGV4cHJlc3Npb25zPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjYvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudFNlbGVjdG9yIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNi9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIvQGluaXRpYWxpemVycy4wIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOC9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50U2VsZWN0b3IgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy44L0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRJbml0aWFsaXplci9AaW5pdGlhbGl6ZXJzLjAgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy45L0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRTZWxlY3RvciAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjkvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudEluaXRpYWxpemVyL0Bpbml0aWFsaXplcnMuMCAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEwL0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRTZWxlY3RvciAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEwL0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRJbml0aWFsaXplci9AaW5pdGlhbGl6ZXJzLjAgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xMS9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50U2VsZWN0b3IgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xMS9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIvQGluaXRpYWxpemVycy4wIi8+Ci0gIDwvZXhwcmVzc2lvblByb3ZpZGVycz4KLTwvZ21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvcj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0uZ21mZ3JhcGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tb2RlbC9lcGZkaWFncmFtLmdtZmdyYXBoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjJmOGRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0uZ21mZ3JhcGgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZncmFwaDpDYW52YXMgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczpnbWZncmFwaD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNi9HcmFwaGljYWxEZWZpbml0aW9uIiBuYW1lPSJ1bWwiPgotICA8ZmlndXJlcwotICAgICAgbmFtZT0iRGVmYXVsdCI+Ci0gICAgPGRlc2NyaXB0b3JzCi0gICAgICAgIG5hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUiPgotICAgICAgPGFjdHVhbEZpZ3VyZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSZWN0YW5nbGUiCi0gICAgICAgICAgbmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSIKLSAgICAgICAgICBvdXRsaW5lPSJmYWxzZSI+Ci0gICAgICAgIDxjaGlsZHJlbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxhYmVsIgotICAgICAgICAgICAgbmFtZT0iTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICB0ZXh0PSIiLz4KLSAgICAgIDwvYWN0dWFsRmlndXJlPgotICAgICAgPGFjY2Vzc29ycwotICAgICAgICAgIGZpZ3VyZT0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy4wL0BhY3R1YWxGaWd1cmUvQGNoaWxkcmVuLjAiLz4KLSAgICA8L2Rlc2NyaXB0b3JzPgotICAgIDxkZXNjcmlwdG9ycwotICAgICAgICBuYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSI+Ci0gICAgICA8YWN0dWFsRmlndXJlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJlY3RhbmdsZSIKLSAgICAgICAgICBuYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSI+Ci0gICAgICAgIDxsYXlvdXREYXRhCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6WFlMYXlvdXREYXRhIj4KLSAgICAgICAgICA8c2l6ZQotICAgICAgICAgICAgICBkeD0iMTAwIgotICAgICAgICAgICAgICBkeT0iMjAwIi8+Ci0gICAgICAgIDwvbGF5b3V0RGF0YT4KLSAgICAgICAgPGxheW91dAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlhZTGF5b3V0Ii8+Ci0gICAgICAgIDxmb3JlZ3JvdW5kQ29sb3IKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpDb25zdGFudENvbG9yIgotICAgICAgICAgICAgdmFsdWU9ImJsYWNrIi8+Ci0gICAgICAgIDxiYWNrZ3JvdW5kQ29sb3IKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSR0JDb2xvciIKLSAgICAgICAgICAgIHJlZD0iMjU1IgotICAgICAgICAgICAgZ3JlZW49IjI1NSIKLSAgICAgICAgICAgIGJsdWU9IjI1NSIvPgotICAgICAgICA8cHJlZmVycmVkU2l6ZQotICAgICAgICAgICAgZHg9IjMwMCIKLSAgICAgICAgICAgIGR5PSI2MDAiLz4KLSAgICAgICAgPGJvcmRlcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxpbmVCb3JkZXIiLz4KLSAgICAgICAgPHNpemUKLSAgICAgICAgICAgIHg9IjMwMCIKLSAgICAgICAgICAgIHk9IjYwMCIvPgotICAgICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMYWJlbCIKLSAgICAgICAgICAgIG5hbWU9IlBhcnRpdGlvbkxhYmVsRmlndXJlIi8+Ci0gICAgICA8L2FjdHVhbEZpZ3VyZT4KLSAgICAgIDxhY2Nlc3NvcnMKLSAgICAgICAgICBmaWd1cmU9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuMS9AYWN0dWFsRmlndXJlL0BjaGlsZHJlbi4wIi8+Ci0gICAgPC9kZXNjcmlwdG9ycz4KLSAgICA8ZGVzY3JpcHRvcnMKLSAgICAgICAgbmFtZT0iQ29udHJvbEZsb3dGaWd1cmUiPgotICAgICAgPGFjdHVhbEZpZ3VyZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpQb2x5bGluZUNvbm5lY3Rpb24iCi0gICAgICAgICAgbmFtZT0iQ29udHJvbEZsb3dGaWd1cmUiCi0gICAgICAgICAgdGFyZ2V0RGVjb3JhdGlvbj0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy4yL0BhY3R1YWxGaWd1cmUvQGNoaWxkcmVuLjAiPgotICAgICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpQb2x5bGluZURlY29yYXRpb24iCi0gICAgICAgICAgICBuYW1lPSJPcGVuQXJyb3ciPgotICAgICAgICAgIDx0ZW1wbGF0ZQotICAgICAgICAgICAgICB4PSItMSIKLSAgICAgICAgICAgICAgeT0iMSIvPgotICAgICAgICAgIDx0ZW1wbGF0ZS8+Ci0gICAgICAgICAgPHRlbXBsYXRlCi0gICAgICAgICAgICAgIHg9Ii0xIgotICAgICAgICAgICAgICB5PSItMSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMYWJlbCIKLSAgICAgICAgICAgIG5hbWU9IkNvbnRyb2xGbG93TGFiZWxGaWd1cmUiCi0gICAgICAgICAgICB0ZXh0PSIiLz4KLSAgICAgIDwvYWN0dWFsRmlndXJlPgotICAgICAgPGFjY2Vzc29ycwotICAgICAgICAgIGZpZ3VyZT0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy4yL0BhY3R1YWxGaWd1cmUvQGNoaWxkcmVuLjEiLz4KLSAgICA8L2Rlc2NyaXB0b3JzPgotICAgIDxkZXNjcmlwdG9ycwotICAgICAgICBuYW1lPSJGb3JrTm9kZUZpZ3VyZSI+Ci0gICAgICA8YWN0dWFsRmlndXJlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJlY3RhbmdsZSIKLSAgICAgICAgICBuYW1lPSJGb3JrTm9kZUZpZ3VyZSI+Ci0gICAgICAgIDxiYWNrZ3JvdW5kQ29sb3IKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSR0JDb2xvciIKLSAgICAgICAgICAgIHJlZD0iNDUiCi0gICAgICAgICAgICBncmVlbj0iODUiCi0gICAgICAgICAgICBibHVlPSIxMzAiLz4KLSAgICAgICAgPHByZWZlcnJlZFNpemUKLSAgICAgICAgICAgIGR4PSIxMDAiCi0gICAgICAgICAgICBkeT0iNSIvPgotICAgICAgICA8c2l6ZQotICAgICAgICAgICAgeD0iMTAwIgotICAgICAgICAgICAgeT0iNSIvPgotICAgICAgPC9hY3R1YWxGaWd1cmU+Ci0gICAgPC9kZXNjcmlwdG9ycz4KLSAgICA8ZGVzY3JpcHRvcnMKLSAgICAgICAgbmFtZT0iRW5kTm9kZUZpZ3VyZSI+Ci0gICAgICA8YWN0dWFsRmlndXJlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkN1c3RvbUZpZ3VyZSIKLSAgICAgICAgICBuYW1lPSJFbmROb2RlRmlndXJlIgotICAgICAgICAgIHF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXMuRW5kTm9kZUZpZ3VyZSI+Ci0gICAgICAgIDxmb3JlZ3JvdW5kQ29sb3IKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpDb25zdGFudENvbG9yIgotICAgICAgICAgICAgdmFsdWU9ImRhcmtCbHVlIi8+Ci0gICAgICAgIDxiYWNrZ3JvdW5kQ29sb3IKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSR0JDb2xvciIKLSAgICAgICAgICAgIHJlZD0iNDUiCi0gICAgICAgICAgICBncmVlbj0iODUiCi0gICAgICAgICAgICBibHVlPSIxMzAiLz4KLSAgICAgICAgPHByZWZlcnJlZFNpemUKLSAgICAgICAgICAgIGR4PSIyNCIKLSAgICAgICAgICAgIGR5PSIyNCIvPgotICAgICAgICA8c2l6ZQotICAgICAgICAgICAgeD0iMjQiCi0gICAgICAgICAgICB5PSIyNCIvPgotICAgICAgPC9hY3R1YWxGaWd1cmU+Ci0gICAgPC9kZXNjcmlwdG9ycz4KLSAgICA8ZGVzY3JpcHRvcnMKLSAgICAgICAgbmFtZT0iRGVjaXNpb25EaWFtb25kRmlndXJlIj4KLSAgICAgIDxhY3R1YWxGaWd1cmUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6Q3VzdG9tRmlndXJlIgotICAgICAgICAgIG5hbWU9IkRlY2lzaW9uRGlhbW9uZEZpZ3VyZSIKLSAgICAgICAgICBxdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5maWd1cmVzLkRlY2lzaW9uTm9kZUZpZ3VyZSI+Ci0gICAgICAgIDxmb3JlZ3JvdW5kQ29sb3IKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpDb25zdGFudENvbG9yIgotICAgICAgICAgICAgdmFsdWU9ImRhcmtCbHVlIi8+Ci0gICAgICAgIDxiYWNrZ3JvdW5kQ29sb3IKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSR0JDb2xvciIKLSAgICAgICAgICAgIHJlZD0iMTg1IgotICAgICAgICAgICAgZ3JlZW49IjIwNSIKLSAgICAgICAgICAgIGJsdWU9IjIzMCIvPgotICAgICAgICA8cHJlZmVycmVkU2l6ZQotICAgICAgICAgICAgZHg9IjUwIgotICAgICAgICAgICAgZHk9IjUwIi8+Ci0gICAgICAgIDxzaXplCi0gICAgICAgICAgICB4PSI1MCIKLSAgICAgICAgICAgIHk9IjUwIi8+Ci0gICAgICAgIDxjaGlsZHJlbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxhYmVsIgotICAgICAgICAgICAgbmFtZT0iRGlhbW9uZExhYmVsIi8+Ci0gICAgICA8L2FjdHVhbEZpZ3VyZT4KLSAgICA8L2Rlc2NyaXB0b3JzPgotICAgIDxkZXNjcmlwdG9ycwotICAgICAgICBuYW1lPSJJbml0aWFsTm9kZUZpZ3VyZSI+Ci0gICAgICA8YWN0dWFsRmlndXJlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkVsbGlwc2UiCi0gICAgICAgICAgbmFtZT0iSW5pdGlhbE5vZGVGaWd1cmUiPgotICAgICAgICA8Zm9yZWdyb3VuZENvbG9yCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6Q29uc3RhbnRDb2xvciIKLSAgICAgICAgICAgIHZhbHVlPSJkYXJrQmx1ZSIvPgotICAgICAgICA8YmFja2dyb3VuZENvbG9yCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UkdCQ29sb3IiCi0gICAgICAgICAgICByZWQ9IjQ1IgotICAgICAgICAgICAgZ3JlZW49Ijg1IgotICAgICAgICAgICAgYmx1ZT0iMTMwIi8+Ci0gICAgICAgIDxwcmVmZXJyZWRTaXplCi0gICAgICAgICAgICBkeD0iMjAiCi0gICAgICAgICAgICBkeT0iMjAiLz4KLSAgICAgICAgPHNpemUKLSAgICAgICAgICAgIHg9IjIwIgotICAgICAgICAgICAgeT0iMjAiLz4KLSAgICAgIDwvYWN0dWFsRmlndXJlPgotICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgPGRlc2NyaXB0b3JzCi0gICAgICAgIG5hbWU9IkdlbmVyaWNMYWJlbEZpZ3VyZSI+Ci0gICAgICA8YWN0dWFsRmlndXJlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxhYmVsIgotICAgICAgICAgIG5hbWU9IkdlbmVyaWNMYWJlbEZpZ3VyZSIvPgotICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgPGRlc2NyaXB0b3JzCi0gICAgICAgIG5hbWU9IlJlc2l6ZWFibGVDb21wYXJ0bWVudEZpZ3VyZUV4Ij4KLSAgICAgIDxhY3R1YWxGaWd1cmUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6Q3VzdG9tRmlndXJlIgotICAgICAgICAgIG5hbWU9IlJlc2l6ZWFibGVDb21wYXJ0bWVudEZpZ3VyZUV4IgotICAgICAgICAgIHF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIi8+Ci0gICAgPC9kZXNjcmlwdG9ycz4KLSAgICA8ZGVzY3JpcHRvcnMKLSAgICAgICAgbmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIj4KLSAgICAgIDxhY3R1YWxGaWd1cmUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UmVjdGFuZ2xlIgotICAgICAgICAgIG5hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSIKLSAgICAgICAgICBvdXRsaW5lPSJmYWxzZSI+Ci0gICAgICAgIDxjaGlsZHJlbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxhYmVsIgotICAgICAgICAgICAgbmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsIi8+Ci0gICAgICA8L2FjdHVhbEZpZ3VyZT4KLSAgICAgIDxhY2Nlc3NvcnMKLSAgICAgICAgICBmaWd1cmU9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuOS9AYWN0dWFsRmlndXJlL0BjaGlsZHJlbi4wIi8+Ci0gICAgPC9kZXNjcmlwdG9ycz4KLSAgPC9maWd1cmVzPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUiCi0gICAgICBmaWd1cmU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJBY3Rpdml0eVBhcnRpdGlvbiIKLSAgICAgIGZpZ3VyZT0iQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJJbml0aWFsTm9kZSIKLSAgICAgIGZpZ3VyZT0iSW5pdGlhbE5vZGVGaWd1cmUiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJGb3JrTm9kZSIKLSAgICAgIGZpZ3VyZT0iRm9ya05vZGVGaWd1cmUiCi0gICAgICByZXNpemVDb25zdHJhaW50PSJFQVNUX1dFU1QiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJNZXJnZU5vZGUiCi0gICAgICBmaWd1cmU9IkRlY2lzaW9uRGlhbW9uZEZpZ3VyZSIvPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IkRlY2lzaW9uTm9kZSIKLSAgICAgIGZpZ3VyZT0iRGVjaXNpb25EaWFtb25kRmlndXJlIi8+Ci0gIDxub2RlcwotICAgICAgbmFtZT0iQWN0aXZpdHlGaW5hbE5vZGUiCi0gICAgICBmaWd1cmU9IkVuZE5vZGVGaWd1cmUiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJKb2luTm9kZSIKLSAgICAgIGZpZ3VyZT0iRm9ya05vZGVGaWd1cmUiCi0gICAgICByZXNpemVDb25zdHJhaW50PSJFQVNUX1dFU1QiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUiCi0gICAgICBmaWd1cmU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSIvPgotICA8Y29ubmVjdGlvbnMKLSAgICAgIG5hbWU9IkNvbnRyb2xGbG93IgotICAgICAgZmlndXJlPSJDb250cm9sRmxvd0ZpZ3VyZSIvPgotICA8Y29tcGFydG1lbnRzCi0gICAgICBuYW1lPSJQYXJ0aXRpb25DYW1wYXJ0bWVudCIKLSAgICAgIGZpZ3VyZT0iUmVzaXplYWJsZUNvbXBhcnRtZW50RmlndXJlRXgiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iTm9kZU5hbWUiCi0gICAgICBmaWd1cmU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUiCi0gICAgICBhY2Nlc3Nvcj0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy4wL0BhY2Nlc3NvcnMuMCIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJQYXJ0aXRpb25OYW1lIgotICAgICAgZmlndXJlPSJBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSIKLSAgICAgIGFjY2Vzc29yPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjEvQGFjY2Vzc29ycy4wIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IkNvbnRyb2xGbG93TGFiZWwiCi0gICAgICBmaWd1cmU9IkNvbnRyb2xGbG93RmlndXJlIgotICAgICAgcmVzaXplQ29uc3RyYWludD0iRUFTVF9XRVNUIgotICAgICAgYWNjZXNzb3I9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuMi9AYWNjZXNzb3JzLjAiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iTWVyZ2VOb2RlUG9seWdvbkxhYmVsIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IkdlbmVyaWNMYWJlbCIKLSAgICAgIGZpZ3VyZT0iR2VuZXJpY0xhYmVsRmlndXJlIgotICAgICAgcmVzaXplQ29uc3RyYWludD0iRUFTVF9XRVNUIgotICAgICAgZWxlbWVudEljb249ImZhbHNlIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IkFjdGl2aXR5Tm9kZU5hbWUiCi0gICAgICBmaWd1cmU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUiCi0gICAgICBlbGVtZW50SWNvbj0iZmFsc2UiCi0gICAgICBhY2Nlc3Nvcj0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy4wL0BhY2Nlc3NvcnMuMCIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJJbml0aWFsTm9kZU5hbWUiCi0gICAgICBmaWd1cmU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUiCi0gICAgICBlbGVtZW50SWNvbj0iZmFsc2UiCi0gICAgICBhY2Nlc3Nvcj0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy4wL0BhY2Nlc3NvcnMuMCIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJGb3JrTm9kZU5hbWUiCi0gICAgICBmaWd1cmU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUiCi0gICAgICBlbGVtZW50SWNvbj0iZmFsc2UiCi0gICAgICBhY2Nlc3Nvcj0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy4wL0BhY2Nlc3NvcnMuMCIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJEZWNpc2lvbk5vZGVOYW1lIgotICAgICAgZmlndXJlPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIgotICAgICAgZWxlbWVudEljb249ImZhbHNlIgotICAgICAgYWNjZXNzb3I9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuMC9AYWNjZXNzb3JzLjAiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZSIKLSAgICAgIGZpZ3VyZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIgotICAgICAgZWxlbWVudEljb249ImZhbHNlIgotICAgICAgYWNjZXNzb3I9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuOS9AYWNjZXNzb3JzLjAiLz4KLTwvZ21mZ3JhcGg6Q2FudmFzPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbW9kZWwvZXBmZGlhZ3JhbS5nbWZtYXAgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tb2RlbC9lcGZkaWFncmFtLmdtZm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM0Njk1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tb2RlbC9lcGZkaWFncmFtLmdtZm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZm1hcDpNYXBwaW5nIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z21mbWFwPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA2L21hcHBpbmdzIgotICAgIHhtbG5zOmdtZnRvb2w9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvVG9vbERlZmluaXRpb24iPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eUZpbmFsTm9kZSIvPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciCi0gICAgICAgICAgdmlld1BhdHRlcm49IiI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjR2VuZXJpY0xhYmVsIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy41Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5RmluYWxOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9NZXJnZU5vZGUiLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIgotICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0RlY2lzaW9uTm9kZU5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjMiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjTWVyZ2VOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9Gb3JrTm9kZSIvPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjIiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjRm9ya05vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0luaXRpYWxOb2RlIi8+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyIKLSAgICAgICAgICB2aWV3UGF0dGVybj0iIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNHZW5lcmljTGFiZWwiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjEiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjSW5pdGlhbE5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0RlY2lzaW9uTm9kZSIvPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciCi0gICAgICAgICAgdmlld1BhdHRlcm49IiI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjRGVjaXNpb25Ob2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuNCIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNEZWNpc2lvbk5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0pvaW5Ob2RlIi8+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuNiIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNKb2luTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgICAgPGRvbWFpblNwZWNpYWxpemF0aW9uCi0gICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9BY3Rpdml0eSIKLSAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgPGRvbWFpbkluaXRpYWxpemVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX0FjdGl2aXR5JiN4RDsmI3hBOyIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgPC9kb21haW5Jbml0aWFsaXplcj4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eU5vZGVOYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy44Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L2dyb3VwIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eVBhcnRpdGlvbiIvPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciCi0gICAgICAgICAgdmlld1BhdHRlcm49IiI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjUGFydGl0aW9uTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMCIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eVBhcnRpdGlvbiIvPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgY29tcGFydG1lbnQ9Ii8vQG5vZGVzLjcvQG93bmVkQ2hpbGQvQGNvbXBhcnRtZW50cy4wIgotICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuNy9Ab3duZWRDaGlsZCI+Ci0gICAgICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5UGFydGl0aW9uL3N1YnBhcnRpdGlvbiIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjb21wYXJ0bWVudHMKLSAgICAgICAgICBjaGlsZHJlbj0iLy9Abm9kZXMuNy9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uMCI+Ci0gICAgICAgIDxjb21wYXJ0bWVudAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNQYXJ0aXRpb25DYW1wYXJ0bWVudCIvPgotICAgICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eVBhcmFtZXRlck5vZGUiLz4KLSAgICAgIDxkb21haW5TcGVjaWFsaXphdGlvbgotICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfVGFza0Rlc2NyaXB0b3IiCi0gICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgIDxkb21haW5Jbml0aWFsaXplcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9UYXNrRGVzY3JpcHRvciIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgPC9kb21haW5Jbml0aWFsaXplcj4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy4xMSIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eVBhcmFtZXRlck5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICAgIDxkb21haW5TcGVjaWFsaXphdGlvbgotICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfUGhhc2UiCi0gICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgIDxkb21haW5Jbml0aWFsaXplcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9QaGFzZSIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgPC9kb21haW5Jbml0aWFsaXplcj4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eU5vZGVOYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy45Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICAgIDxkb21haW5TcGVjaWFsaXphdGlvbgotICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfSXRlcmF0aW9uIgotICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICA8ZG9tYWluSW5pdGlhbGl6ZXIKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVZhbHVlU3BlYyIKLSAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfSXRlcmF0aW9uIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICA8L2RvbWFpbkluaXRpYWxpemVyPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5Tm9kZU5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjEwIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5UGFyYW1ldGVyTm9kZSIvPgotICAgICAgPGRvbWFpblNwZWNpYWxpemF0aW9uCi0gICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9NaWxlc3RvbmUiCi0gICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgIDxkb21haW5Jbml0aWFsaXplcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9NaWxlc3RvbmUiCi0gICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgIDwvZG9tYWluSW5pdGlhbGl6ZXI+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMTIiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bGlua3M+Ci0gICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0NvbnRyb2xGbG93Ii8+Ci0gICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIgotICAgICAgICB2aWV3UGF0dGVybj0iIj4KLSAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0NvbnRyb2xGbG93TGFiZWwiLz4KLSAgICAgIDxmZWF0dXJlcwotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgPC9sYWJlbE1hcHBpbmdzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS9lZGdlIi8+Ci0gICAgPHRvb2wKLSAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuMCIvPgotICAgIDxkaWFncmFtTGluawotICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0NvbnRyb2xGbG93Ii8+Ci0gICAgPHNvdXJjZU1ldGFGZWF0dXJlCi0gICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eUVkZ2Uvc291cmNlIi8+Ci0gICAgPGxpbmtNZXRhRmVhdHVyZQotICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHlFZGdlL3RhcmdldCIvPgotICA8L2xpbmtzPgotICA8ZGlhZ3JhbT4KLSAgICA8ZGlhZ3JhbUNhbnZhcwotICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI3VtbCIvPgotICAgIDxkb21haW5Nb2RlbAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLyIvPgotICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eSIvPgotICAgIDxwYWxldHRlCi0gICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlIi8+Ci0gIDwvZGlhZ3JhbT4KLTwvZ21mbWFwOk1hcHBpbmc+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tb2RlbC9lcGZkaWFncmFtLmdtZnRvb2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tb2RlbC9lcGZkaWFncmFtLmdtZnRvb2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZTQ2OTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbW9kZWwvZXBmZGlhZ3JhbS5nbWZ0b29sCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mdG9vbDpUb29sUmVnaXN0cnkgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczpnbWZ0b29sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L1Rvb2xEZWZpbml0aW9uIj4KLSAgPHBhbGV0dGU+Ci0gICAgPHRvb2xzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOlRvb2xHcm91cCIKLSAgICAgICAgdGl0bGU9IkZsb3dzIgotICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRpb24gdG9vbCBmb3IgZmxvd3MiCi0gICAgICAgIGNvbGxhcHNpYmxlPSJ0cnVlIj4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iQ29udHJvbCBGbG93IgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IENvbnRyb2wgRmxvdyI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9Db250cm9sRmxvdy5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgPC90b29scz4KLSAgICA8dG9vbHMKLSAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6VG9vbEdyb3VwIgotICAgICAgICB0aXRsZT0iTm9kZXMiCi0gICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGlvbiB0b29sIGdyb3VwIGZvciBub2RlcyIKLSAgICAgICAgY29sbGFwc2libGU9InRydWUiCi0gICAgICAgIGFjdGl2ZT0iLy9AcGFsZXR0ZS9AdG9vbHMuMSI+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IkFjdGl2aXR5IFBhcnRpdGlvbiIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBBY3Rpdml0eSBQYXJ0aXRpb24iPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlQYXJ0aXRpb24uZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJTdGFydCBOb2RlIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFN0YXJ0IE5vZGUiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvSW5pdGlhbE5vZGUuZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJGb3JrIE5vZGUiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgRm9yayBOb2RlIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L0ZvcmtOb2RlLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iTWVyZ2UgTm9kZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBNZXJnZSBOb2RlIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L01lcmdlTm9kZS5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IkRlY2lzaW9uIE5vZGUiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgRGVjaXNpb24gTm9kZSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9EZWNpc2lvbk5vZGUuZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJFbmQgTm9kZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBFbmQgTm9kZSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eUZpbmFsTm9kZS5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IkpvaW4gTm9kZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBKb2luIE5vZGUiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvSm9pbk5vZGUuZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6UGFsZXR0ZVNlcGFyYXRvciIvPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJBY3Rpdml0eSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBBY3Rpdml0eSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IlBoYXNlIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFBoYXNlIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L1BoYXNlLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iSXRlcmF0aW9uIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEl0ZXJhdGlvbiI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9JdGVyYXRpb24uZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IlRhc2sgRGVzY3JpcHRvciIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBUYXNrIERlc2NyaXB0b3IiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IuZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJNaWxlc3RvbmUiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgTWlsZXN0b25lIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L01pbGVzdG9uZS5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgPC90b29scz4KLSAgPC9wYWxldHRlPgotPC9nbWZ0b29sOlRvb2xSZWdpc3RyeT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0yLmdtZmdlbiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0yLmdtZmdlbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUwNzJjYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tb2RlbC9lcGZkaWFncmFtMi5nbWZnZW4KKysrIC9kZXYvbnVsbApAQCAtMSw5MjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZnZW46R2VuRWRpdG9yR2VuZXJhdG9yIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6Z21mZ2VuPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L0dlbk1vZGVsLzIuMCIgcGFja2FnZU5hbWVQcmVmaXg9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkIgotICAgIG1vZGVsSUQ9IkFEIgotICAgIHNhbWVGaWxlRm9yRGlhZ3JhbUFuZE1vZGVsPSJ0cnVlIgotICAgIGRpYWdyYW1GaWxlRXh0ZW5zaW9uPSJ4bWkiCi0gICAgdGVtcGxhdGVEaXJlY3Rvcnk9IiIKLSAgICBjb3B5cmlnaHRUZXh0PSIgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiYjeEQ7JiN4QTsgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyYjeEQ7JiN4QTsgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wJiN4RDsmI3hBOyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCYjeEQ7JiN4QTsgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmI3hEOyYjeEE7JiN4RDsmI3hBOyBDb250cmlidXRvcnM6JiN4RDsmI3hBOyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uJiN4RDsmI3hBOyI+Ci0gIDxkaWFncmFtCi0gICAgICB2aXN1YWxJRD0iNzkiCi0gICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlFZGl0UGFydCIKLSAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5SXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5Vmlld0ZhY3RvcnkiCi0gICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICBpY29uUHJvdmlkZXJQcmlvcml0eT0iTG93IgotICAgICAgY3JlYXRpb25XaXphcmRJY29uUGF0aD0iaWNvbnMvZGlhZ3JhbS9hY3Rpdml0eS5naWYiCi0gICAgICB2YWxpZGF0aW9uUHJvdmlkZXJDbGFzc05hbWU9IlZhbGlkYXRpb25Qcm92aWRlciIKLSAgICAgIG1ldHJpY1Byb3ZpZGVyQ2xhc3NOYW1lPSJNZXRyaWNQcm92aWRlciIKLSAgICAgIHZhbGlkYXRpb25EZWNvcmF0b3JQcm92aWRlckNsYXNzTmFtZT0iVmFsaWRhdGlvbkRlY29yYXRvclByb3ZpZGVyIj4KLSAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9EaWFncmFtIi8+Ci0gICAgPGVsZW1lbnRUeXBlCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iQWN0aXZpdHlFZGl0SGVscGVyIi8+Ci0gICAgPHZpZXdtYXAKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyIi8+Ci0gICAgPGRvbWFpbkRpYWdyYW1FbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eSIvPgotICAgIDxjaGlsZE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIyMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uMlZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbjJDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xIgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb24yR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiCi0gICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4wIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiCi0gICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy43L0BlbGVtZW50VHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQWR2aWNlQ2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXJBZHZpY2UiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBsYXlvdXRUeXBlPSJYWV9MQVlPVVQiCi0gICAgICAgICAgY2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dCBteUdlbkxheW91dE1hbmFnZXIgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0KCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRMYXlvdXRNYW5hZ2VyKG15R2VuTGF5b3V0TWFuYWdlcik7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5ibGFjayYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKEFDVElWSVRZUEFSVElUSU9ORklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgzMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDYwMCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMzAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg2MDApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0Qm9yZGVyKCYjeEQ7JiN4QTtuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLkxpbmVCb3JkZXIoKSYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZQYXJ0aXRpb25MYWJlbEZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZQYXJ0aXRpb25MYWJlbEZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZQYXJ0aXRpb25MYWJlbEZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIEFDVElWSVRZUEFSVElUSU9ORklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAyNTUpOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEZvcmVncm91bmQ9InRydWUiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eVBhcnRpdGlvbiIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5UGFydGl0aW9uL3N1YnBhcnRpdGlvbiIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5UGFydGl0aW9uL3N1YnBhcnRpdGlvbiIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDA2IgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbk5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uTmFtZVZpZXdGYWN0b3J5IgotICAgICAgICAgIGVsZW1lbnRJY29uPSJ0cnVlIj4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49InswfSIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvY2hpbGROb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkVuZE5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgRW5kTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5maWd1cmVzLkVuZE5vZGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEVuZE5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUmI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihFTkROT0RFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgyNCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMjQpKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDI0KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyNCkpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBFTkROT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDQ1LCA4NSwgMTMwKTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlGaW5hbE5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRXh0ZXJuYWxOb2RlTGFiZWwiCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDEiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9IgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDAyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTWVyZ2VOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9Ik1lcmdlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9Ik1lcmdlTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJNZXJnZU5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iTWVyZ2VOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iTWVyZ2VOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iRGVjaXNpb25EaWFtb25kRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5maWd1cmVzLkRlY2lzaW9uTm9kZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgRGVjaXNpb25EaWFtb25kRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmRhcmtCbHVlJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoREVDSVNJT05ESUFNT05ERklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZURpYW1vbmRMYWJlbChmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZkRpYW1vbmRMYWJlbDsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZURpYW1vbmRMYWJlbCgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmRGlhbW9uZExhYmVsOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZURpYW1vbmRMYWJlbChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZEaWFtb25kTGFiZWwgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBERUNJU0lPTkRJQU1PTkRGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMTg1LCAyMDUsIDIzMCk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL01lcmdlTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDIiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9Ik1lcmdlTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNZXJnZU5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJNZXJnZU5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0iTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBOb2RlTmFtZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgTm9kZU5hbWVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0VGV4dCgmcXVvdDsmcXVvdDspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH0iPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMyIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkZvcmtOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkZvcmtOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iRm9ya05vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iRm9ya05vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iRm9ya05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJGb3JrTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkZvcmtOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEZvcmtOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgRm9ya05vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRk9SS05PREVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgRk9SS05PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgNDUsIDg1LCAxMzApOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UmVzaXplQ29uc3RyYWludHMiCi0gICAgICAgICAgICByZXNpemVIYW5kbGVzPSIyNCIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0ZvcmtOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDQiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJJbml0aWFsTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJJbml0aWFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkluaXRpYWxOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkluaXRpYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkluaXRpYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iSW5pdGlhbE5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJJbml0aWFsTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBJbml0aWFsTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5FbGxpcHNlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBJbml0aWFsTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5kYXJrQmx1ZSYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKElOSVRJQUxOT0RFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMjApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIElOSVRJQUxOT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDQ1LCA4NSwgMTMwKTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvSW5pdGlhbE5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRXh0ZXJuYWxOb2RlTGFiZWwiCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDMiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkluaXRpYWxOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iSW5pdGlhbE5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9IgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDA1IgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iRGVjaXNpb25Ob2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkRlY2lzaW9uTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkRlY2lzaW9uTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iRGVjaXNpb25Ob2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iRGVjaXNpb25Ob2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iRGVjaXNpb25EaWFtb25kRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5maWd1cmVzLkRlY2lzaW9uTm9kZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgRGVjaXNpb25EaWFtb25kRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmRhcmtCbHVlJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoREVDSVNJT05ESUFNT05ERklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZURpYW1vbmRMYWJlbChmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZkRpYW1vbmRMYWJlbDsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZURpYW1vbmRMYWJlbCgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmRGlhbW9uZExhYmVsOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZURpYW1vbmRMYWJlbChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZEaWFtb25kTGFiZWwgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBERUNJU0lPTkRJQU1PTkRGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMTg1LCAyMDUsIDIzMCk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0RlY2lzaW9uTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDQiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkRlY2lzaW9uTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0iTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBOb2RlTmFtZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgTm9kZU5hbWVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0VGV4dCgmcXVvdDsmcXVvdDspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwNiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkpvaW5Ob2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkpvaW5Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iSm9pbk5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iSm9pbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iSm9pbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJKb2luTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkZvcmtOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEZvcmtOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgRm9ya05vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRk9SS05PREVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgRk9SS05PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgNDUsIDg1LCAxMzApOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UmVzaXplQ29uc3RyYWludHMiCi0gICAgICAgICAgICByZXNpemVIYW5kbGVzPSIyNCIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0pvaW5Ob2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDciCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7ZmlnXzAuc2V0VGV4dCgmcXVvdDsmcXVvdDspOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZOb2RlTmFtZUZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZOb2RlTmFtZUZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZOb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRTZWxlY3RvcgotICAgICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9BY3Rpdml0eSIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRJbml0aWFsaXplcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX0FjdGl2aXR5JiN4RDsmI3hBOyIKLSAgICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUvRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgICAgPC9tb2RlbEVsZW1lbnRJbml0aWFsaXplcj4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwNSIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZU5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDA4IgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25JdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjAiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGxheW91dFR5cGU9IlhZX0xBWU9VVCIKLSAgICAgICAgICBjbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0IG15R2VuTGF5b3V0TWFuYWdlciA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuWFlMYXlvdXQoKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldExheW91dE1hbmFnZXIobXlHZW5MYXlvdXRNYW5hZ2VyKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmJsYWNrJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoQUNUSVZJVFlQQVJUSVRJT05GSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDMwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNjAwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgzMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDYwMCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCb3JkZXIoJiN4RDsmI3hBO25ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcigpJiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZlBhcnRpdGlvbkxhYmVsRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlBhcnRpdGlvbkxhYmVsRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZlBhcnRpdGlvbkxhYmVsRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgQUNUSVZJVFlQQVJUSVRJT05GSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDI1NSk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5UGFydGl0aW9uIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvZ3JvdXAiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ncm91cCIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDA3IgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25OYW1lMlZpZXdGYWN0b3J5IgotICAgICAgICAgIGVsZW1lbnRJY29uPSJ0cnVlIj4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49InswfSIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwOSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbChmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbDsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5UGFyYW1ldGVyTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRTZWxlY3RvcgotICAgICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9UYXNrRGVzY3JpcHRvciIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRJbml0aWFsaXplcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX1Rhc2tEZXNjcmlwdG9yIgotICAgICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZS9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgICA8L21vZGVsRWxlbWVudEluaXRpYWxpemVyPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDA4IgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDEwIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMlZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiCi0gICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy42L0BlbGVtZW50VHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQWR2aWNlQ2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlckFkdmljZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBO2ZpZ18wLnNldFRleHQoJnF1b3Q7JnF1b3Q7KTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZU5vZGVOYW1lRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmTm9kZU5hbWVGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmTm9kZU5hbWVGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlTm9kZU5hbWVGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmTm9kZU5hbWVGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8bW9kZWxFbGVtZW50U2VsZWN0b3IKLSAgICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfUGhhc2UiCi0gICAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgICA8bW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRmVhdHVyZVZhbHVlU3BlYyIKLSAgICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9QaGFzZSIKLSAgICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUvRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgICAgPC9tb2RlbEVsZW1lbnRJbml0aWFsaXplcj4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwOSIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUySXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZU5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDExIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM1ZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0Nhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0dyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiCi0gICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy42L0BlbGVtZW50VHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQWR2aWNlQ2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRIZWxwZXJBZHZpY2UiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTtmaWdfMC5zZXRUZXh0KCZxdW90OyZxdW90Oyk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZk5vZGVOYW1lRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZk5vZGVOYW1lRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZU5vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7Zk5vZGVOYW1lRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudFNlbGVjdG9yCi0gICAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX0l0ZXJhdGlvbiIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRJbml0aWFsaXplcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX0l0ZXJhdGlvbiIKLSAgICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUvRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgICAgPC9tb2RlbEVsZW1lbnRJbml0aWFsaXplcj4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAxMCIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZU5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDEyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMlZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIgotICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOC9AZWxlbWVudFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckFkdmljZUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlckFkdmljZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWw7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudFNlbGVjdG9yCi0gICAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX01pbGVzdG9uZSIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRJbml0aWFsaXplcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX01pbGVzdG9uZSIKLSAgICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUvRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgICAgPC9tb2RlbEVsZW1lbnRJbml0aWFsaXplcj4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAxMSIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIi8+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8bGlua3MKLSAgICAgICAgdmlzdWFsSUQ9IjMwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDb250cm9sRmxvd0VkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb250cm9sRmxvd0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNvbnRyb2xGbG93Vmlld0ZhY3RvcnkiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9FZGdlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iQ29udHJvbEZsb3dFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJDb250cm9sRmxvd0ZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBDb250cm9sRmxvd0ZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLlBvbHlsaW5lQ29ubmVjdGlvbkV4IHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBDb250cm9sRmxvd0ZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRUYXJnZXREZWNvcmF0aW9uKGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbiBjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkgeyYjeEQ7JiN4QTtvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uIGRmID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24oKTsmI3hEOyYjeEE7Ly8gZGlzcGF0Y2hOZXh0PyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QgcGwgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdCgpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoLTEsIDEpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoMCwgMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgtMSwgLTEpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZGYuc2V0VGVtcGxhdGUocGwpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZGYuc2V0U2NhbGUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg3KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgzKSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGRmOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlR5cGVMaW5rTW9kZWxGYWNldCI+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9Db250cm9sRmxvdyIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUvZWRnZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUvZWRnZSIvPgotICAgICAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eUVkZ2Uvc291cmNlIi8+Ci0gICAgICAgIDx0YXJnZXRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5RWRnZS90YXJnZXQiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAxMiIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29udHJvbEZsb3dOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDb250cm9sRmxvd05hbWVWaWV3RmFjdG9yeSIKLSAgICAgICAgICBlbGVtZW50SWNvbj0idHJ1ZSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJDb250cm9sRmxvd0xhYmVsRmlndXJlIgotICAgICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dMYWJlbEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgQ29udHJvbEZsb3dMYWJlbEZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRUZXh0KCZxdW90OyZxdW90Oyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkxhYmVsT2Zmc2V0QXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgeT0iNDAiLz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49InswfSIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvbGlua3M+Ci0gICAgPGNvbXBhcnRtZW50cwotICAgICAgICB2aXN1YWxJRD0iNTAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIKLSAgICAgICAgdGl0bGU9IlBhcnRpdGlvbkNhbXBhcnRtZW50IgotICAgICAgICBjYW5Db2xsYXBzZT0iZmFsc2UiCi0gICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIgotICAgICAgICBub2RlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjciCi0gICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPGNvbXBhcnRtZW50cwotICAgICAgICB2aXN1YWxJRD0iNTAwMiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiCi0gICAgICAgIHRpdGxlPSJQYXJ0aXRpb25DYW1wYXJ0bWVudCIKLSAgICAgICAgY2FuQ29sbGFwc2U9ImZhbHNlIgotICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSIKLSAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIgotICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIj4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgIDwvY29tcGFydG1lbnRzPgotICAgIDxwYWxldHRlPgotICAgICAgPGdyb3VwcwotICAgICAgICAgIHRpdGxlPSJGbG93cyIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRpb24gdG9vbCBmb3IgZmxvd3MiCi0gICAgICAgICAgY29sbGFwc2U9InRydWUiPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iQ29udHJvbCBGbG93IgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQ29udHJvbCBGbG93IgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0NvbnRyb2xGbG93LmdpZiIKLSAgICAgICAgICAgIGdlbkxpbmtzPSIvL0BkaWFncmFtL0BsaW5rcy4wIi8+Ci0gICAgICA8L2dyb3Vwcz4KLSAgICAgIDxncm91cHMKLSAgICAgICAgICB0aXRsZT0iTm9kZXMiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0aW9uIHRvb2wgZ3JvdXAgZm9yIG5vZGVzIgotICAgICAgICAgIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkFjdGl2aXR5IFBhcnRpdGlvbiIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEFjdGl2aXR5IFBhcnRpdGlvbiIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eVBhcnRpdGlvbi5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy43IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iU3RhcnQgTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFN0YXJ0IE5vZGUiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvSW5pdGlhbE5vZGUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMyIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iRm9yayBOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgRm9yayBOb2RlIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0ZvcmtOb2RlLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjIiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9Ik1lcmdlIE5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBNZXJnZSBOb2RlIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L01lcmdlTm9kZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJEZWNpc2lvbiBOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgRGVjaXNpb24gTm9kZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9EZWNpc2lvbk5vZGUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iRW5kIE5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBFbmQgTm9kZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eUZpbmFsTm9kZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJKb2luIE5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBKb2luIE5vZGUiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvSm9pbk5vZGUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNSIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTZXBhcmF0b3IiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkFjdGl2aXR5IgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQWN0aXZpdHkiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNiIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iUGhhc2UiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBQaGFzZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9QaGFzZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy45Ii8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJJdGVyYXRpb24iCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBJdGVyYXRpb24iCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvSXRlcmF0aW9uLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEwIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJUYXNrIERlc2NyaXB0b3IiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBUYXNrIERlc2NyaXB0b3IiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iTWlsZXN0b25lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgTWlsZXN0b25lIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xMSIvPgotICAgICAgPC9ncm91cHM+Ci0gICAgPC9wYWxldHRlPgotICA8L2RpYWdyYW0+Ci0gIDxwbHVnaW4KLSAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZCIKLSAgICAgIG5hbWU9IkVQRiBBY3Rpdml0eSBEaWFncmFtIgotICAgICAgcHJvdmlkZXI9IkVjbGlwc2Uub3JnIgotICAgICAgdmVyc2lvbj0iMS4yLjAucXVhbGlmaWVyIgotICAgICAgcHJpbnRpbmdFbmFibGVkPSJ0cnVlIgotICAgICAgYWN0aXZhdG9yQ2xhc3NOYW1lPSJBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4iLz4KLSAgPGVkaXRvcgotICAgICAgY2xhc3NOYW1lPSJBY3Rpdml0eURpYWdyYW1FZGl0b3IiLz4KLSAgPGRvbWFpbkdlbk1vZGVsCi0gICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLyIvPgotICA8ZXhwcmVzc2lvblByb3ZpZGVycz4KLSAgICA8cHJvdmlkZXJzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuSmF2YUV4cHJlc3Npb25Qcm92aWRlciIKLSAgICAgICAgZXhwcmVzc2lvbnM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNi9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50U2VsZWN0b3IgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy42L0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRJbml0aWFsaXplci9AaW5pdGlhbGl6ZXJzLjAgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy44L0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRTZWxlY3RvciAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjgvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudEluaXRpYWxpemVyL0Bpbml0aWFsaXplcnMuMCAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjkvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudFNlbGVjdG9yIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOS9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIvQGluaXRpYWxpemVycy4wIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMTAvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudFNlbGVjdG9yIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMTAvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudEluaXRpYWxpemVyL0Bpbml0aWFsaXplcnMuMCAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjExL0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRTZWxlY3RvciAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjExL0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRJbml0aWFsaXplci9AaW5pdGlhbGl6ZXJzLjAiLz4KLSAgPC9leHByZXNzaW9uUHJvdmlkZXJzPgotPC9nbWZnZW46R2VuRWRpdG9yR2VuZXJhdG9yPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbW9kZWwvZXBmZGlhZ3JhbTIuZ21mbWFwIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbW9kZWwvZXBmZGlhZ3JhbTIuZ21mbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDIxMGVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0yLmdtZm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZm1hcDpNYXBwaW5nIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z21mbWFwPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L21hcHBpbmdzLzIuMCIKLSAgICB4bWxuczpnbWZ0b29sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L1Rvb2xEZWZpbml0aW9uIj4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHlGaW5hbE5vZGUiLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIgotICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjR2VuZXJpY0xhYmVsIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy41Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5RmluYWxOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9NZXJnZU5vZGUiLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIgotICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0RlY2lzaW9uTm9kZU5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjMiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjTWVyZ2VOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9Gb3JrTm9kZSIvPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjIiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjRm9ya05vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0luaXRpYWxOb2RlIi8+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyIKLSAgICAgICAgICB2aWV3UGF0dGVybj0iIgotICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0dlbmVyaWNMYWJlbCIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMSIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNJbml0aWFsTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vRGVjaXNpb25Ob2RlIi8+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyIKLSAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNEZWNpc2lvbk5vZGVOYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy40Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0RlY2lzaW9uTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vSm9pbk5vZGUiLz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy42Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0pvaW5Ob2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgICA8ZG9tYWluU3BlY2lhbGl6YXRpb24KLSAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX0FjdGl2aXR5IgotICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICA8ZG9tYWluSW5pdGlhbGl6ZXIKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVZhbHVlU3BlYyIKLSAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfQWN0aXZpdHkmI3hEOyYjeEE7IgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICA8L2RvbWFpbkluaXRpYWxpemVyPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5Tm9kZU5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjgiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvZ3JvdXAiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5UGFydGl0aW9uIi8+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyIKLSAgICAgICAgICB2aWV3UGF0dGVybj0iIgotICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI1BhcnRpdGlvbk5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjAiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlQYXJ0aXRpb24iLz4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIGNvbXBhcnRtZW50PSIvL0Bub2Rlcy43L0Bvd25lZENoaWxkL0Bjb21wYXJ0bWVudHMuMCIKLSAgICAgICAgICByZWZlcmVuY2VkQ2hpbGQ9Ii8vQG5vZGVzLjcvQG93bmVkQ2hpbGQiPgotICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eVBhcnRpdGlvbi9zdWJwYXJ0aXRpb24iLz4KLSAgICAgIDwvY2hpbGRyZW4+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+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5UGFyYW1ldGVyTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPGxpbmtzPgotICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9Db250cm9sRmxvdyIvPgotICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyIKLSAgICAgICAgdmlld1BhdHRlcm49IiIKLSAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNDb250cm9sRmxvd0xhYmVsIi8+Ci0gICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUvZWRnZSIvPgotICAgIDx0b29sCi0gICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjAvQHRvb2xzLjAiLz4KLSAgICA8ZGlhZ3JhbUxpbmsKLSAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNDb250cm9sRmxvdyIvPgotICAgIDxzb3VyY2VNZXRhRmVhdHVyZQotICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHlFZGdlL3NvdXJjZSIvPgotICAgIDxsaW5rTWV0YUZlYXR1cmUKLSAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5RWRnZS90YXJnZXQiLz4KLSAgPC9saW5rcz4KLSAgPGRpYWdyYW0+Ci0gICAgPGRpYWdyYW1DYW52YXMKLSAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCN1bWwiLz4KLSAgICA8ZG9tYWluTW9kZWwKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8iLz4KLSAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkiLz4KLSAgICA8cGFsZXR0ZQotICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZSIvPgotICA8L2RpYWdyYW0+Ci08L2dtZm1hcDpNYXBwaW5nPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZiMjk1Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFNUQVJUIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJlZmVyZW5jZXMuZ2VuZXJhbD1BRCBEaWFncmFtCi1wcmVmZXJlbmNlcy5hcHBlYXJhbmNlPUFwcGVhcmFuY2UKLXByZWZlcmVuY2VzLmNvbm5lY3Rpb25zPUNvbm5lY3Rpb25zCi1wcmVmZXJlbmNlcy5wcmludGluZz1QcmludGluZwotcHJlZmVyZW5jZXMucnVsZXJzQW5kR3JpZD1SdWxlcnMgJiBHcmlkCi1wcmVmZXJlbmNlcy5wYXRobWFwcz1QYXRoIE1hcHMKLQotZWRpdG9yTmFtZT1BRCBEaWFncmFtIEVkaXRvcgotbmV3V2l6YXJkTmFtZT1BRCBEaWFncmFtCi1uZXdXaXphcmREZXNjPUNyZWF0ZXMgQUQgZGlhZ3JhbS4KLQotaW5pdERpYWdyYW1BY3Rpb25MYWJlbD1Jbml0aWFsaXplIHhtaSBkaWFncmFtIGZpbGUKLWxvYWRSZXNvdXJjZUFjdGlvbkxhYmVsPUxvYWQgUmVzb3VyY2UuLi4KLQotbmF2aWdhdG9yQ29udGVudE5hbWU9Ki54bWkgZGlhZ3JhbSBjb250ZW50cwotCi1tZXRhdHlwZS5uYW1lLkFjdGl2aXR5Xzc5PVVuZGVmaW5lZAotbWV0YXR5cGUubmFtZS5BY3Rpdml0eUZpbmFsTm9kZV8xMDAxPUFjdGl2aXR5RmluYWxOb2RlCi1tZXRhdHlwZS5uYW1lLk1lcmdlTm9kZV8xMDAyPU1lcmdlTm9kZQotbWV0YXR5cGUubmFtZS5Gb3JrTm9kZV8xMDAzPUZvcmtOb2RlCi1tZXRhdHlwZS5uYW1lLkluaXRpYWxOb2RlXzEwMDQ9SW5pdGlhbE5vZGUKLW1ldGF0eXBlLm5hbWUuRGVjaXNpb25Ob2RlXzEwMDU9RGVjaXNpb25Ob2RlCi1tZXRhdHlwZS5uYW1lLkpvaW5Ob2RlXzEwMDY9Sm9pbk5vZGUKLW1ldGF0eXBlLm5hbWUuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3PVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUKLW1ldGF0eXBlLm5hbWUuQWN0aXZpdHlQYXJ0aXRpb25fMTAwOD1BY3Rpdml0eVBhcnRpdGlvbgotbWV0YXR5cGUubmFtZS5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOT1BY3Rpdml0eVBhcmFtZXRlck5vZGUKLW1ldGF0eXBlLm5hbWUuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwPVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUKLW1ldGF0eXBlLm5hbWUuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExPVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUKLW1ldGF0eXBlLm5hbWUuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTI9QWN0aXZpdHlQYXJhbWV0ZXJOb2RlCi1tZXRhdHlwZS5uYW1lLkFjdGl2aXR5UGFydGl0aW9uXzIwMDE9QWN0aXZpdHlQYXJ0aXRpb24KLW1ldGF0eXBlLm5hbWUuQ29udHJvbEZsb3dfMzAwMT1Db250cm9sRmxvdwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRU5EIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0KLXBsdWdpbk5hbWU9RVBGIEFjdGl2aXR5IERpYWdyYW0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jTmVlZHMgVHJhbnNsYXRpb24KLW9wZW5fYWRkX3RleHQ9T3BlbiBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbQotZWxlbWVudF90eXBlX2FjdGl2aXR5X3BhcnRpdGlvbj1BY3Rpdml0eSBQYXJ0aXRpb24KLWVsZW1lbnRfdHlwZV9lbmRfbm9kZT1FbmQgTm9kZQotZWxlbWVudF90eXBlX21lcmdlX25vZGU9TWVyZ2UgTm9kZQotZWxlbWVudF90eXBlX2Zvcmtfbm9kZT1Gb3JrIE5vZGUKLWVsZW1lbnRfdHlwZV9zdGFydF9ub2RlPVN0YXJ0IE5vZGUKLWVsZW1lbnRfdHlwZV9kZWNpc2lvbl9ub2RlPURlY2lzaW9uIE5vZGUKLWVsZW1lbnRfdHlwZV9qb2luX25vZGU9Sm9pbiBOb2RlCi1lbGVtZW50X3R5cGVfYWN0aXZpdHk9QWN0aXZpdHkKLWVsZW1lbnRfdHlwZV9waGFzZT1QaGFzZQotZWxlbWVudF90eXBlX2l0ZXJhdGlvbj1JdGVyYXRpb24KLWVsZW1lbnRfdHlwZV90YXNrX2Rlc2NyaXB0b3I9VGFzayBEZXNjcmlwdG9yCi1lbGVtZW50X3R5cGVfbWlsZXN0b25lPU1pbGVzdG9uZQotZWxlbWVudF90eXBlX2NvbnRyb2xfZmxvdz1Db250cm9sIEZsb3cKLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzZmVmMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTwhLS0KLSBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLQotIENvbnRyaWJ1dG9yczoKLSBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0KLS0tPgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLSAgICAgIDxpbml0aWFsaXplciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxEaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUuZmlsZVR5cGVzIj4KLSAgICAgIDxmaWxlVHlwZXMKLSAgICAgICAgIHR5cGU9InRleHQiCi0gICAgICAgICBleHRlbnNpb249InhtaSI+Ci0gICAgICA8L2ZpbGVUeXBlcz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5leHRlbnNpb25fcGFyc2VyIj4KLSAgICAgIDxwYXJzZXIKLSAgICAgICAgIHR5cGU9InhtaSIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5yZXNvdXJjZXMuR01GUmVzb3VyY2VGYWN0b3J5Ij4KLSAgICAgIDwvcGFyc2VyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotICAgICA8ZWRpdG9yCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvcklEIgotICAgICAgICBuYW1lPSJBY3Rpdml0eSBEaWFncmFtIEVkaXRvciIKLSAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L0FERWRpdG9yLmdpZiIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yIgotICAgICAgICBtYXRjaGluZ1N0cmF0ZWd5PSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTE1hdGNoaW5nU3RyYXRlZ3kiCi0gICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yIj4KLSAgICAgPC9lZGl0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLQotICA8IS0tIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAJICA8d2l6YXJkCi0gIAkgICAgIG5hbWU9IkFjdGl2aXR5IERpYWdyYW0iCi0gIAkgICAgIGljb249Imljb25zL29iajE2L1VNTERpYWdyYW1GaWxlLmdpZiIKLSAgCSAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLkV4YW1wbGVzIgotICAJICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxDcmVhdGlvbldpemFyZCIKLSAgCSAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MQ3JlYXRpb25XaXphcmRJRCI+Ci0gIAkgIAkgPGRlc2NyaXB0aW9uPgotICAJICAJCUNyZWF0ZXMgQWN0aXZpdHkgZGlhZ3JhbS4KLSAgCSAgCSA8L2Rlc2NyaXB0aW9uPiAgCi0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPiAtLT4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgIAk8IS0tIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC51aS5vYmplY3RDb250cmlidXRpb24uSUZpbGUxIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi51bWwiCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IkluaXRpYWxpemUgeG1pIGRpYWdyYW0gZmlsZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTEluaXREaWFncmFtRmlsZUFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MSW5pdERpYWdyYW1GaWxlQWN0aW9uSUQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gIAotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgYWRhcHRhYmxlPSJmYWxzZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC51aS5vYmplY3RDb250cmlidXRpb24uQWN0aXZpdHlFZGl0UGFydDIiCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTExvYWRSZXNvdXJjZUFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxMb2FkUmVzb3VyY2VBY3Rpb25JRCIKLSAgICAgICAgICAgICAgIGxhYmVsPSJMb2FkIFJlc291cmNlLi4uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAKLSAtLT4KLSAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5hY3Rpb24uY29udHJpYnV0aW9uSXRlbVByb3ZpZGVycyI+Ci0gIAkgPGNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLkRpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9IkxvdyI+Ci0gICAgICAgICA8L1ByaW9yaXR5PgotICAgICAgICAgPHBhcnRDb250cmlidXRpb24gaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPHBhcnRBY3Rpb24gbWVudWJhclBhdGg9Ii9maWxlL3ByaW50IiBpZD0icHJpbnRQcmV2aWV3QWN0aW9uIj4KLSAgICAgICAgICAgIDwvcGFydEFjdGlvbj4KLSAgICAgICAgIDwvcGFydENvbnRyaWJ1dGlvbj4KLSAgICAgIDwvY29udHJpYnV0aW9uSXRlbVByb3ZpZGVyPgotICAgICAgPGNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIiCi0gICAgICAgICAgICBjaGVja1BsdWdpbkxvYWRlZD0iZmFsc2UiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9IkxvdyIvPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tTW9kZWxBY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLk1lcmdlTm9kZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLk1lcmdlTm9kZU5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Gb3JrTm9kZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkluaXRpYWxOb2RlRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbU1vZGVsQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSm9pbk5vZGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQiLz4KLQkJCTxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+IAotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21Nb2RlbEFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgPC9jb250cmlidXRpb25JdGVtUHJvdmlkZXI+IAotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5hY3Rpb24uZ2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVycyI+Ci0gICAgICA8R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlciIKLSAgICAgICAgIGlkPSJBRFByZXNlbnRhdGlvbiI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Vmlld0lkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvcklEIj4KLSAgICAgICAgICAgIDxFbGVtZW50VHlwZSBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ij4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0iZGVsZXRlIi8+Ci0gICAgICAgICAgICA8L0VsZW1lbnRUeXBlPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJzYXZlIi8+Ci0gICAgICAgICAgICA8L0VsZW1lbnRUeXBlPgotICAgICAgICAgPC9WaWV3SWQ+Ci0gICAgICA8L0dsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcj4KLSAgICAgICA8R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZy5yZW5kZXIucHJvdmlkZXJzLkRpYWdyYW1XaXRoUHJpbnRHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIiCi0gICAgICAgICBpZD0iQURQcmVzZW50YXRpb25QcmludCI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Vmlld0lkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvcklEIj4KLSAgICAgICAgICAgIDxFbGVtZW50VHlwZSBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ij4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0icHJpbnQiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICA8L1ZpZXdJZD4KLSAgICAgIDwvR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyPgotICAgICAgPEdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLmlkZS5wcm92aWRlcnMuRGlhZ3JhbUlERUdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlciIKLSAgICAgICAgIGlkPSJBRFByZXNlbnRhdGlvbklERSI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Vmlld0lkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvcklEIj4KLSAgICAgICAgICAgIDxFbGVtZW50VHlwZSBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ij4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0iYm9va21hcmsiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICA8L1ZpZXdJZD4KLSAgICAgIDwvR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyPgotICAgICAgPCEtLQotICAgICAgPEdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVuZGVyLnByb3ZpZGVycy5EaWFncmFtVUlSZW5kZXJHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIiCi0gICAgICAgICAgICBpZD0iQURSZW5kZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPFZpZXdJZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JJRCI+Ci0gICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydCI+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9ImN1dCIvPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJjb3B5Ii8+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9InBhc3RlIi8+Ci0gICAgICAgICAgICA8L0VsZW1lbnRUeXBlPgotICAgICAgICAgPC9WaWV3SWQ+Ci0gICAgICA8L0dsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcj4KLSAgICAgIC0tPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS52aWV3UHJvdmlkZXJzIj4KLSAgICAgIDx2aWV3UHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxWaWV3UHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPGNvbnRleHQgdmlld0NsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtIiBzZW1hbnRpY0hpbnRzPSJBRCIvPgotICAgICAgICAgPGNvbnRleHQgdmlld0NsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIiBzZW1hbnRpY0hpbnRzPSIiLz4KLSAgICAgICAgIDxjb250ZXh0IHZpZXdDbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZSIgc2VtYW50aWNIaW50cz0iIi8+Ci0gICAgICA8L3ZpZXdQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0UHJvdmlkZXJzIj4KLSAgICAgIDxlZGl0cGFydFByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWRpdFBhcnRQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICA8L2VkaXRwYXJ0UHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYWxldHRlUHJvdmlkZXJzIj4KLSAgICAgIDxwYWxldHRlUHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxQYWxldHRlUHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPGVkaXRvciBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JJRCIvPgotICAgICAgPC9wYWxldHRlUHJvdmlkZXI+Ci0gICAgICA8cGFsZXR0ZVByb3ZpZGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGVmYXVsdFBhbGV0dGVQcm92aWRlciI+Ci0gICAgICAgIDxQcmlvcml0eSBuYW1lPSJNZWRpdW0iLz4KLSAgICAgICAgPGVkaXRvciBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JJRCIvPgotICAgICAgICA8Y29udHJpYnV0aW9uPgotICAgICAgICAgICAgPHByZWRlZmluZWRFbnRyeSAgICAKLSAgICAgICAgICAgIAlpZD0iZ2Vvc2hhcGVEcmF3ZXIiIHBhdGg9Ii8iPgotICAgICAgICAgICAgIDwvcHJlZGVmaW5lZEVudHJ5PiAKLSAgICAgICAgPC9jb250cmlidXRpb24+Ci0gICAgICA8L3BhbGV0dGVQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkubW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlcnMiPgotICAgICAgPG1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxNb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgIDwvbW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucHJvcGVydGllcy5wcm9wZXJ0aWVzUHJvdmlkZXJzIj4KLSAgICAgIDxQcm9wZXJ0aWVzUHJvdmlkZXIKLSAgICAgICAgICAgIHZlcmlmeVBsdWdpbkxvYWRlZD0iZmFsc2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTFByb3BlcnR5UHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgPC9Qcm9wZXJ0aWVzUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmljb25Qcm92aWRlcnMiPgotICAgICAgPEljb25Qcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEljb25Qcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93Ii8+Ci0gICAgICA8L0ljb25Qcm92aWRlcj4KLSAgICAgIDxJY29uUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmdlb3NoYXBlcy5pbnRlcm5hbC5wcm92aWRlcnMuR2VvU2hhcGVJY29uUHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5Ci0gICAgICAgICAgICAgICBuYW1lPSJNZWRpdW0iPgotICAgICAgICAgPC9Qcmlvcml0eT4KLSAgICAgICAgIDxvYmplY3QgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXcob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24pIiBpZD0iR2VvU2hhcGUiPgotICAgICAgICAJIDxtZXRob2QgbmFtZT0iZ2V0VHlwZSgpIiB2YWx1ZT0ib3ZhbCx0cmlhbmdsZSxyZWN0YW5nbGUsc2hhZG93UmVjdGFuZ2xlLHJlY3RhbmdsZTNELHJvdW5kUmVjdGFuZ2xlLGhleGFnb24sb2N0YWdvbixwZW50YWdvbixkaWFtb25kLGN5bGluZGVyLGxpbmUiLz4KLQkgICAgIDwvb2JqZWN0PgotICAgICAgICAgPGNvbnRleHQgZWxlbWVudHM9Ikdlb1NoYXBlIj4KLSAgICAgICAgIDwvY29udGV4dD4KLSAgICAgIDwvSWNvblByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXJQcm92aWRlcnMiPgotICAgICAgPFBhcnNlclByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MUGFyc2VyUHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgPC9QYXJzZXJQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVsZW1lbnRUeXBlcyI+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjEuMC9VTUwiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eV83OSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IkFjdGl2aXR5IgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzLkFjdGl2aXR5RWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iNzkiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4xLjAvVU1MIj4KLSAgICAgICAgIDxzcGVjaWFsaXphdGlvblR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eVBhcnRpdGlvbl8yMDAxIgotICAgICAgICAgICAgICAgbmFtZT0iJWVsZW1lbnRfdHlwZV9hY3Rpdml0eV9wYXJ0aXRpb24iCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcmFkdmljZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzLkFjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlckFkdmljZSI+Ci0gICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5UGFydGl0aW9uXzEwMDgiLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIyMDAxIi8+Ci0gICAgICAgICA8L3NwZWNpYWxpemF0aW9uVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4xLjAvVU1MIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlGaW5hbE5vZGVfMTAwMSIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfZW5kX25vZGUiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJBY3Rpdml0eUZpbmFsTm9kZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVycy5BY3Rpdml0eUZpbmFsTm9kZUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMDEiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4xLjAvVU1MIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuTWVyZ2VOb2RlXzEwMDIiCi0gICAgICAgICAgICAgICBuYW1lPSIlZWxlbWVudF90eXBlX21lcmdlX25vZGUiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJNZXJnZU5vZGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnMuTWVyZ2VOb2RlRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAwMiIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjEuMC9VTUwiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5Gb3JrTm9kZV8xMDAzIgotICAgICAgICAgICAgICAgbmFtZT0iJWVsZW1lbnRfdHlwZV9mb3JrX25vZGUiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJGb3JrTm9kZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVycy5Gb3JrTm9kZUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMDMiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4xLjAvVU1MIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuSW5pdGlhbE5vZGVfMTAwNCIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfc3RhcnRfbm9kZSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IkluaXRpYWxOb2RlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzLkluaXRpYWxOb2RlRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAwNCIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjEuMC9VTUwiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5EZWNpc2lvbk5vZGVfMTAwNSIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfZGVjaXNpb25fbm9kZSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IkRlY2lzaW9uTm9kZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVycy5EZWNpc2lvbk5vZGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDA1Ii8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMS4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkpvaW5Ob2RlXzEwMDYiCi0gICAgICAgICAgICAgICBuYW1lPSIlZWxlbWVudF90eXBlX2pvaW5fbm9kZSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IkpvaW5Ob2RlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzLkpvaW5Ob2RlRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAwNiIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjEuMC9VTUwiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDciCi0gICAgICAgICAgICAgICBuYW1lPSIlZWxlbWVudF90eXBlX2FjdGl2aXR5IgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVycy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAwNyIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjEuMC9VTUwiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eVBhcnRpdGlvbl8xMDA4IgotICAgICAgICAgICAgICAgbmFtZT0iJWVsZW1lbnRfdHlwZV9hY3Rpdml0eV9wYXJ0aXRpb24iCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJBY3Rpdml0eVBhcnRpdGlvbiIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVycy5BY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMDgiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4xLjAvVU1MIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkiCi0gICAgICAgICAgICAgICBuYW1lPSIlZWxlbWVudF90eXBlX3Rhc2tfZGVzY3JpcHRvciIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVycy5BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDA5Ii8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMS4wL1VNTCI+Ci0gICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwIgotICAgICAgICAgICAgICAgbmFtZT0iJWVsZW1lbnRfdHlwZV9waGFzZSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyYWR2aWNlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRIZWxwZXJBZHZpY2UiPgotICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDciLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDEwIi8+Ci0gICAgICAgICA8L3NwZWNpYWxpemF0aW9uVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4xLjAvVU1MIj4KLSAgICAgICAgIDxzcGVjaWFsaXphdGlvblR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEiCi0gICAgICAgICAgICAgICBuYW1lPSIlZWxlbWVudF90eXBlX2l0ZXJhdGlvbiIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyYWR2aWNlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0SGVscGVyQWR2aWNlIj4KLSAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3Ii8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAxMSIvPgotICAgICAgICAgPC9zcGVjaWFsaXphdGlvblR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMS4wL1VNTCI+Ci0gICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIiCi0gICAgICAgICAgICAgICBuYW1lPSIlZWxlbWVudF90eXBlX21pbGVzdG9uZSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyYWR2aWNlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlckFkdmljZSI+Ci0gICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5Ii8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAxMiIvPgotICAgICAgICAgPC9zcGVjaWFsaXphdGlvblR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMS4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkNvbnRyb2xGbG93XzMwMDEiCi0gICAgICAgICAgICAgICBuYW1lPSIlZWxlbWVudF90eXBlX2NvbnRyb2xfZmxvdyIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IkNvbnRyb2xGbG93IgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzLkNvbnRyb2xGbG93RWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzAwMSIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5lbGVtZW50VHlwZUJpbmRpbmdzIj4KLSAgICAgIDxjbGllbnRDb250ZXh0IGlkPSJBRENsaWVudENvbnRleHQiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLmVkaXRpbmdEb21haW4iCi0gICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uRWRpdGluZ0RvbWFpbiIvPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9jbGllbnRDb250ZXh0PiAKLSAgICAgIDxiaW5kaW5nIGNvbnRleHQ9IkFEQ2xpZW50Q29udGV4dCI+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eV83OSIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlQYXJ0aXRpb25fMjAwMSIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlGaW5hbE5vZGVfMTAwMSIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuTWVyZ2VOb2RlXzEwMDIiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkZvcmtOb2RlXzEwMDMiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkluaXRpYWxOb2RlXzEwMDQiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkRlY2lzaW9uTm9kZV8xMDA1Ii8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5Kb2luTm9kZV8xMDA2Ii8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDciLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5UGFydGl0aW9uXzEwMDgiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5Ii8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkNvbnRyb2xGbG93XzMwMDEiLz4KLSAgICAgICAgIDxhZHZpY2UgcmVmPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuYWR2aWNlLm5vdGF0aW9uRGVwZGVuZGVudHMiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSBwYXR0ZXJuPSIuKiIvPgotICAgICAgPC9iaW5kaW5nPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uZXN0ZWRDb21tYW5kUHJvdmlkZXJzIj4KLSAgICAgIDxuZXN0ZWRDb21tYW5kUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jb21tYW5kcy5OZXN0ZWRDb21tYW5kUHJvdmlkZXIiPgotICAgICAgPC9uZXN0ZWRDb21tYW5kUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvQURJbWFnZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9BREltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGI4YTUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9BREltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL0NvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy9hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vL0NvbnRyaWJ1dG9yczoKLS8vSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEFESW1hZ2VzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTENMMTYgPSAiZnVsbC9lbGNsMTYvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERMQ0wxNiA9ICJmdWxsL2RsY2wxNi8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVRPT0wxNiA9ICJmdWxsL2V0b29sMTYvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERUT09MMTYgPSAiZnVsbC9kdG9vbDE2LyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9FRElUT1IgPSBFVE9PTDE2ICsgIkFERWRpdG9yLmdpZiI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9FRElUT1IgPSBEVE9PTDE2ICsgIkFERWRpdG9yLmdpZiI7IC8vJE5PTi1OTFMtMSQJCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfRURJVE9SID0gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9FRElUT1IpOwkJCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfRURJVE9SID0gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9FRElUT1IpOwkJCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9BY3Rpdml0eURpYWdyYW1QbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9BY3Rpdml0eURpYWdyYW1QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg1YTEwMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvQWN0aXZpdHlEaWFncmFtUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURpYWdyYW1QbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBBY3Rpdml0eURpYWdyYW1QbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW1QbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eURpYWdyYW1QbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jb21tYW5kcy9OZXN0ZWRDb21tYW5kUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jb21tYW5kcy9OZXN0ZWRDb21tYW5kUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQzODVlMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY29tbWFuZHMvTmVzdGVkQ29tbWFuZFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL0NvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy9hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vL0NvbnRyaWJ1dG9yczoKLS8vSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSU5lc3RlZENvbW1hbmRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnV0aWwuVHlwZUNvbnZlcnRlci5UeXBlQ29udmVyc2lvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgTmVzdGVkQ29tbWFuZFByb3ZpZGVyIGltcGxlbWVudHMgSU5lc3RlZENvbW1hbmRQcm92aWRlciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JTmVzdGVkQ29tbWFuZFByb3ZpZGVyI2NyZWF0ZU5lc3RlZENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQpCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlTmVzdGVkQ29tbWFuZChDb21tYW5kIGNvbW1hbmQpIHsKLQkJaWYoY29tbWFuZCBpbnN0YW5jZW9mIFR5cGVDb252ZXJzaW9uQ29tbWFuZCkgewotCQkJcmV0dXJuIGNyZWF0ZU5lc3RlZENvbW1hbmRGb3JUeXBlQ29udmVyc2lvbihjb21tYW5kKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgY3JlYXRlTmVzdGVkQ29tbWFuZEZvclR5cGVDb252ZXJzaW9uKENvbW1hbmQgY29tbWFuZCkgewotCQkvLyBjaGFuZ2UgdHlwZSBvZiBhY3Rpdml0eSBub2RlIGluIGRpYWdyYW0KLQkJLy8KLQkJQ29sbGVjdGlvbjw/PiByZXN1bHQgPSBjb21tYW5kLmdldFJlc3VsdCgpOwotCQlBY3Rpdml0eSBhY3Rpdml0eSA9IG51bGw7Ci0JCWlmKCFyZXN1bHQuaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3QgZSA9IHJlc3VsdC5pdGVyYXRvcigpLm5leHQoKTsKLQkJCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWFjdGl2aXR5ID0gKEFjdGl2aXR5KSBlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJaWYoYWN0aXZpdHkgIT0gbnVsbCkgewotCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdGl2aXR5KTsKLQkJCWlmKHByb2MgIT0gbnVsbCkgewotCQkJCURpYWdyYW1NYW5hZ2VyIG1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKHByb2MsIHRoaXMpOwotCQkJCXRyeSB7Ci0JCQkJCVN0cmluZyBuZXdUeXBlID0gQnJpZGdlSGVscGVyLmdldFR5cGUoYWN0aXZpdHkpOwkJCQkJCi0JCQkJCUxpc3Q8RGlhZ3JhbT4gZGlhZ3JhbXMgPSBtZ3IuZ2V0RGlhZ3JhbXMoYWN0aXZpdHkuZ2V0U3VwZXJBY3Rpdml0aWVzKCksIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKTsKLQkJCQkJU2V0VHlwZUNvbW1hbmQgY21kID0gbmV3IFNldFR5cGVDb21tYW5kKCk7Ci0JCQkJCWZvciAoRGlhZ3JhbSBkaWFncmFtIDogZGlhZ3JhbXMpIHsKLQkJCQkJCW9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5IHVtbEFjdCA9IChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgZGlhZ3JhbS5nZXRFbGVtZW50KCk7Ci0JCQkJCQlmb3IgKEFjdGl2aXR5Tm9kZSBub2RlIDogdW1sQWN0LmdldE5vZGVzKCkpIHsKLQkJCQkJCQlTdHJpbmcgdXJpU3RyID0gQnJpZGdlSGVscGVyLmdldEVBbm5vdGF0aW9uRGV0YWlsKG5vZGUsIEJyaWRnZUhlbHBlci5VTUFfVVJJKTsKLQkJCQkJCQlpZih1cmlTdHIgIT0gbnVsbCkgewotCQkJCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSSh1cmlTdHIpOwotCQkJCQkJCQlTdHJpbmcgZ3VpZCA9IHVyaS5mcmFnbWVudCgpOwotCQkJCQkJCQlpZihhY3Rpdml0eS5nZXRHdWlkKCkuZXF1YWxzKGd1aWQpKSB7Ci0JCQkJCQkJCQlWaWV3IHZpZXcgPSBCcmlkZ2VIZWxwZXIuZ2V0VmlldyhkaWFncmFtLCBub2RlKTsKLQkJCQkJCQkJCWNtZC5wcmVwYXJlKHZpZXcsIG5vZGUsIG5ld1R5cGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmKGNtZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQkJCXJldHVybiBjbWQ7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVSZWxhdGVkT2JqZWN0cyhDb2xsZWN0aW9uIGNyZWF0ZWRFbGVtZW50cywKLQkJCUNvbW1hbmQgY3JlYXRlQ29tbWFuZCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZCByZW1vdmVSZWxhdGVkT2JqZWN0cyhDb2xsZWN0aW9uIGRlbGV0ZWRFbGVtZW50cywKLQkJCUNvbW1hbmQgZGVsZXRlQ29tbWFuZCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jb21tYW5kcy9TZXRUeXBlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2NvbW1hbmRzL1NldFR5cGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNGNlNGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2NvbW1hbmRzL1NldFR5cGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5UeFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRUeXBlQ29tbWFuZCBleHRlbmRzIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCXByaXZhdGUgTWFwPEVNb2RlbEVsZW1lbnQsIFN0cmluZz4gZWxlbWVudFRvTmV3VHlwZU1hcCA9IG5ldyBIYXNoTWFwPEVNb2RlbEVsZW1lbnQsIFN0cmluZz4oKTsKLQlwcml2YXRlIE1hcDxFTW9kZWxFbGVtZW50LCBTdHJpbmc+IGVsZW1lbnRUb09sZFR5cGVNYXA7Ci0JcHJpdmF0ZSBNYXA8VmlldywgU3RyaW5nPiB2aWV3VG9OZXdUeXBlTWFwID0gbmV3IEhhc2hNYXA8VmlldywgU3RyaW5nPigpOwotCXByaXZhdGUgTWFwPFZpZXcsIFN0cmluZz4gdmlld1RvT2xkVHlwZU1hcDsKLQotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJSGFzaFNldDxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJZm9yIChFTW9kZWxFbGVtZW50IGUgOiBlbGVtZW50VG9OZXdUeXBlTWFwLmtleVNldCgpKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IGUuZVJlc291cmNlKCk7Ci0JCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJaWYoZWxlbWVudFRvT2xkVHlwZU1hcCA9PSBudWxsKSB7Ci0JCQllbGVtZW50VG9PbGRUeXBlTWFwID0gbmV3IEhhc2hNYXA8RU1vZGVsRWxlbWVudCwgU3RyaW5nPigpOwotCQl9Ci0JCWVsc2UgewotCQkJZWxlbWVudFRvT2xkVHlwZU1hcC5jbGVhcigpOwotCQl9Ci0JCWZvciAoTWFwLkVudHJ5PEVNb2RlbEVsZW1lbnQsIFN0cmluZz4gZW50cnkgOiBlbGVtZW50VG9OZXdUeXBlTWFwLmVudHJ5U2V0KCkpIHsKLQkJCWZpbmFsIEVNb2RlbEVsZW1lbnQgZSA9IGVudHJ5LmdldEtleSgpOwotCQkJZmluYWwgU3RyaW5nIHR5cGUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgb2xkVHlwZSA9IEJyaWRnZUhlbHBlci5nZXRFQW5ub3RhdGlvbkRldGFpbChlLCBCcmlkZ2VIZWxwZXIuVU1BX1RZUEUpOwotCQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGUsIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb25UeXBlKGUsIHR5cGUpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0pOwotCQkJCWVsZW1lbnRUb09sZFR5cGVNYXAucHV0KGUsIG9sZFR5cGUpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCX0KLQkJaWYoIXZpZXdUb05ld1R5cGVNYXAuaXNFbXB0eSgpKSB7Ci0JCQlpZih2aWV3VG9PbGRUeXBlTWFwID09IG51bGwpIHsKLQkJCQl2aWV3VG9PbGRUeXBlTWFwID0gbmV3IEhhc2hNYXA8VmlldywgU3RyaW5nPigpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdmlld1RvT2xkVHlwZU1hcC5jbGVhcigpOwotCQkJfQotCQkJZm9yIChNYXAuRW50cnk8VmlldywgU3RyaW5nPiBlbnRyeSA6IHZpZXdUb05ld1R5cGVNYXAuZW50cnlTZXQoKSkgewotCQkJCWZpbmFsIFZpZXcgdmlldyA9IGVudHJ5LmdldEtleSgpOwotCQkJCWZpbmFsIFN0cmluZyBuZXdUeXBlID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlmaW5hbCBTdHJpbmcgb2xkVHlwZSA9IHZpZXcuZ2V0VHlwZSgpOwotCQkJCXRyeSB7Ci0JCQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKHZpZXcsIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCVN0cmluZyBuZXdOYW1lVHlwZSA9IFN0cmluZy52YWx1ZU9mKGdldFZpZXdOYW1lVHlwZShJbnRlZ2VyLnBhcnNlSW50KG5ld1R5cGUpKSk7Ci0JCQkJCQkJU3RyaW5nIG9sZE5hbWVUeXBlID0gU3RyaW5nLnZhbHVlT2YoZ2V0Vmlld05hbWVUeXBlKEludGVnZXIucGFyc2VJbnQob2xkVHlwZSkpKTsKLQkJCQkJCQl2aWV3LnNldFR5cGUobmV3VHlwZSk7Ci0JCQkJCQkJLy8gc2V0IG5ldyB0eXBlIGZvciBub2RlIG5hbWVzCi0JCQkJCQkJLy8KLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlWaWV3IGNoaWxkID0gKFZpZXcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYoY2hpbGQuZ2V0VHlwZSgpLmVxdWFscyhvbGROYW1lVHlwZSkpIHsKLQkJCQkJCQkJCWNoaWxkLnNldFR5cGUobmV3TmFtZVR5cGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX0pOwotCQkJCQl2aWV3VG9PbGRUeXBlTWFwLnB1dCh2aWV3LCBvbGRUeXBlKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoZWxlbWVudFRvT2xkVHlwZU1hcCAhPSBudWxsICYmICFlbGVtZW50VG9PbGRUeXBlTWFwLmlzRW1wdHkoKSkgewotCQkJZm9yIChNYXAuRW50cnk8RU1vZGVsRWxlbWVudCwgU3RyaW5nPiBlbnRyeSA6IGVsZW1lbnRUb09sZFR5cGVNYXAKLQkJCQkJLmVudHJ5U2V0KCkpIHsKLQkJCQlmaW5hbCBFTW9kZWxFbGVtZW50IGUgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlmaW5hbCBTdHJpbmcgdHlwZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uVHlwZShlLCB0eXBlKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZXgpOwotCQkJCX0KLQkJCX0KLQkJCWVsZW1lbnRUb09sZFR5cGVNYXAuY2xlYXIoKTsKLQkJfQotCQlpZih2aWV3VG9PbGRUeXBlTWFwICE9IG51bGwgJiYgIXZpZXdUb09sZFR5cGVNYXAuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKE1hcC5FbnRyeTxWaWV3LCBTdHJpbmc+IGVudHJ5IDogdmlld1RvT2xkVHlwZU1hcC5lbnRyeVNldCgpKSB7Ci0JCQkJZmluYWwgVmlldyB2aWV3ID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJZmluYWwgU3RyaW5nIG9sZFR5cGUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCXRyeSB7Ci0JCQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKHZpZXcsIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCVN0cmluZyBuZXdOYW1lVHlwZSA9IFN0cmluZy52YWx1ZU9mKGdldFZpZXdOYW1lVHlwZShJbnRlZ2VyLnBhcnNlSW50KHZpZXcuZ2V0VHlwZSgpKSkpOwotCQkJCQkJCVN0cmluZyBvbGROYW1lVHlwZSA9IFN0cmluZy52YWx1ZU9mKGdldFZpZXdOYW1lVHlwZShJbnRlZ2VyLnBhcnNlSW50KG9sZFR5cGUpKSk7Ci0JCQkJCQkJdmlldy5zZXRUeXBlKG9sZFR5cGUpOwotCQkJCQkJCS8vIHJlc3RvcmUgb2xkIHR5cGUgZm9yIG5vZGUgbmFtZXMKLQkJCQkJCQkvLwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCVZpZXcgY2hpbGQgPSAoVmlldykgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQlpZihjaGlsZC5nZXRUeXBlKCkuZXF1YWxzKG5ld05hbWVUeXBlKSkgewotCQkJCQkJCQkJY2hpbGQuc2V0VHlwZShvbGROYW1lVHlwZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJfSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCQl2aWV3VG9PbGRUeXBlTWFwLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiAhZWxlbWVudFRvTmV3VHlwZU1hcC5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJlcGFyZShWaWV3IHZpZXcsIEVNb2RlbEVsZW1lbnQgZSwgU3RyaW5nIHR5cGUpIHsKLQkJZWxlbWVudFRvTmV3VHlwZU1hcC5wdXQoZSwgdHlwZSk7Ci0JCWludCB2aWV3VHlwZSA9IGdldFZpZXdUeXBlKHR5cGUpOwotCQlpZih2aWV3VHlwZSAhPSAtMSkgewotCQkJdmlld1RvTmV3VHlwZU1hcCAucHV0KHZpZXcsIFN0cmluZy52YWx1ZU9mKHZpZXdUeXBlKSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoZWxlbWVudFRvTmV3VHlwZU1hcCAhPSBudWxsKSB7Ci0JCQllbGVtZW50VG9OZXdUeXBlTWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYoZWxlbWVudFRvT2xkVHlwZU1hcCAhPSBudWxsKSB7Ci0JCQllbGVtZW50VG9PbGRUeXBlTWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYodmlld1RvTmV3VHlwZU1hcCAhPSBudWxsKSB7Ci0JCQl2aWV3VG9OZXdUeXBlTWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYodmlld1RvT2xkVHlwZU1hcCAhPSBudWxsKSB7Ci0JCQl2aWV3VG9PbGRUeXBlTWFwLmNsZWFyKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Vmlld1R5cGUoU3RyaW5nIGVsZW1lbnRUeXBlKSB7Ci0JCWlmKEJyaWRnZUhlbHBlci5VTUFfQUNUSVZJVFkuZXF1YWxzKGVsZW1lbnRUeXBlKSkgewotCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCX0KLQkJZWxzZSBpZihCcmlkZ2VIZWxwZXIuVU1BX1BIQVNFLmVxdWFscyhlbGVtZW50VHlwZSkpIHsKLQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJfQotCQllbHNlIGlmKEJyaWRnZUhlbHBlci5VTUFfSVRFUkFUSU9OLmVxdWFscyhlbGVtZW50VHlwZSkpIHsKLQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJfQotCQllbHNlIGlmKEJyaWRnZUhlbHBlci5VTUFfTUlMRVNUT05FLmVxdWFscyhlbGVtZW50VHlwZSkpIHsKLQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOwkJCQotCQl9Ci0JCWVsc2UgaWYoQnJpZGdlSGVscGVyLlVNQV9UQVNLX0RFU0NSSVBUT1IuZXF1YWxzKGVsZW1lbnRUeXBlKSkgewotCQkJcmV0dXJuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQkKLQkKLQlwdWJsaWMgc3RhdGljIGludCBnZXRWaWV3TmFtZVR5cGUoaW50IHZpZXdUeXBlKSB7Ci0JCXN3aXRjaCh2aWV3VHlwZSkgewotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEOwotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsJCQkKLQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2NvbW1hbmRzL0FjdGl2aXR5UGFydGl0aW9uRGVzdHJveUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vY29tbWFuZHMvQWN0aXZpdHlQYXJ0aXRpb25EZXN0cm95Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmE0YjhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vY29tbWFuZHMvQWN0aXZpdHlQYXJ0aXRpb25EZXN0cm95Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkNyb3NzUmVmZXJlbmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJ0aXRpb247Ci0KLS8qKgotICogRGVzdHJveUNvbW1hbmQgdG8gZGVzdHJveSBBY3Rpdml0eVBhcnRpdGlvbiBhbmQgYWxsIHRoZSBlbGVtZW50cyBpbnNpZGUgdGhlIHBhcnRpdGlvbnMuCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkRlc3Ryb3lDb21tYW5kIGV4dGVuZHMgRGVzdHJveUVsZW1lbnRDb21tYW5kIHsKLQotCQotCXByaXZhdGUgRWRpdFBhcnQgaG9zdDsKLQotCS8qKgotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICovCi0JcHVibGljIEFjdGl2aXR5UGFydGl0aW9uRGVzdHJveUNvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QsIEVkaXRQYXJ0IGhvc3QpIHsKLQkJc3VwZXIocmVxdWVzdCk7Ci0JCXRoaXMuaG9zdCA9IGhvc3Q7Ci0JfQotCQotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0Rlc3Ryb3koKSB7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBob3N0LmdldE1vZGVsKCk7Ci0JCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCXJldHVybiB2aWV3OwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRFbGVtZW50VG9EZXN0cm95KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duSW5jb21pbmdSZWZlcmVuY2VzKEVPYmplY3QgZGVzdHJ1Y3RlZSkgewotCQkKLS8vCQltb3ZlQ2hpbGRyZW5zVG9QYXJlbnQoZGVzdHJ1Y3RlZSk7Ci0JCQotCQlDcm9zc1JlZmVyZW5jZUFkYXB0ZXIgY3Jvc3NSZWZlcmVuY2VyID0gQ3Jvc3NSZWZlcmVuY2VBZGFwdGVyCi0JCQkJLmdldEV4aXN0aW5nQ3Jvc3NSZWZlcmVuY2VBZGFwdGVyKGRlc3RydWN0ZWUpOwotCQlpZiAoY3Jvc3NSZWZlcmVuY2VyICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gaW52ZXJzZVJlZmVyZW5jZXMgPSBjcm9zc1JlZmVyZW5jZXIKLQkJCQkJLmdldEludmVyc2VSZWZlcmVuY2VzKGRlc3RydWN0ZWUpOwotCQkJaWYgKGludmVyc2VSZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IGludmVyc2VSZWZlcmVuY2VzLnNpemUoKTsKLQkJCQlpZiAoc2l6ZSA+IDApIHsKLQkJCQkJU2V0dGluZyBzZXR0aW5nOwotCQkJCQlFUmVmZXJlbmNlIGVSZWY7Ci0JCQkJCVNldHRpbmdbXSBzZXR0aW5ncyA9IChTZXR0aW5nW10pIGludmVyc2VSZWZlcmVuY2VzCi0JCQkJCQkJLnRvQXJyYXkobmV3IFNldHRpbmdbc2l6ZV0pOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotCQkJCQkJc2V0dGluZyA9IHNldHRpbmdzW2ldOwotCQkJCQkJZVJlZiA9IChFUmVmZXJlbmNlKSBzZXR0aW5nCi0JCQkJCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJCQkJCWlmIChlUmVmLmlzQ2hhbmdlYWJsZSgpCi0JCQkJCQkJCSYmIChlUmVmLmlzRGVyaXZlZCgpID09IGZhbHNlKQotCQkJCQkJCQkmJiAoZVJlZi5pc0NvbnRhaW5tZW50KCkgPT0gZmFsc2UpCi0JCQkJCQkJCSYmIChlUmVmLmlzQ29udGFpbmVyKCkgPT0gZmFsc2UpKSB7Ci0vLwkJCQkJCQlFY29yZVV0aWwucmVtb3ZlKHNldHRpbmcuZ2V0RU9iamVjdCgpKTsKLQkJCQkJCQlFY29yZVV0aWwucmVtb3ZlKHNldHRpbmcuZ2V0RU9iamVjdCgpLCBlUmVmLAotCQkJCQkJCQkJZGVzdHJ1Y3RlZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbW92ZUNoaWxkcmVuc1RvUGFyZW50KEVPYmplY3QgZGVzdHJ1Y3RlZSkgewotCQlpZihkZXN0cnVjdGVlIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb24pewotCQkJQWN0aXZpdHlQYXJ0aXRpb24gcGFydGl0aW9uID0gKEFjdGl2aXR5UGFydGl0aW9uKWRlc3RydWN0ZWU7Ci0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IHBhcnRpdGlvbi5nZXRJbkFjdGl2aXR5KCk7Ci0JCQlMaXN0IG5vZGVzID0gcGFydGl0aW9uLmdldE5vZGVzKCk7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUFjdGl2aXR5Tm9kZSBub2RlID0gKEFjdGl2aXR5Tm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJYWN0aXZpdHkuZ2V0Tm9kZXMoKS5hZGQobm9kZSk7Ci0JCQkJbm9kZS5nZXRJblBhcnRpdGlvbnMoKS5yZW1vdmUocGFydGl0aW9uKTsKLQkJCQkvL2l0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYXJ0aXRpb24uZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpdml0eUVkZ2UgZWRnZSA9IChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJCWFjdGl2aXR5LmdldEVkZ2VzKCkuYWRkKGVkZ2UpOwotCQkJCWVkZ2UuZ2V0SW5QYXJ0aXRpb25zKCkucmVtb3ZlKHBhcnRpdGlvbik7Ci0JCQkJLy9pdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2NvbW1hbmRzL0NyZWF0ZUFjdGl2aXR5Tm9kZUluQWN0aXZpdHlQYXJ0aXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vY29tbWFuZHMvQ3JlYXRlQWN0aXZpdHlOb2RlSW5BY3Rpdml0eVBhcnRpdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmMwYjQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vY29tbWFuZHMvQ3JlYXRlQWN0aXZpdHlOb2RlSW5BY3Rpdml0eVBhcnRpdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5QYWNrYWdlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFydGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVBY3Rpdml0eU5vZGVJbkFjdGl2aXR5UGFydGl0aW9uIGV4dGVuZHMgQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JCi0KLQkvKioKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqLwotCXB1YmxpYyBDcmVhdGVBY3Rpdml0eU5vZGVJbkFjdGl2aXR5UGFydGl0aW9uKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJc3VwZXIocmVxdWVzdCk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQl9OwotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJLmdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJfQotCQlpZihjb250YWluZXIgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbil7Ci0JCQljb250YWluZXIgPSBjb250YWluZXIuZUNvbnRhaW5lcigpOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBzdXBlci5jYW5FeGVjdXRlKCk7Ci0JfQotCQotCS8qKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCNkb0V4ZWN1dGUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIGRvRXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJc3RhdHVzID0gc3VwZXIuZG9FeGVjdXRlKG1vbml0b3IsIGluZm8pOwotCQlFT2JqZWN0IG5ld0VsZW1lbnQgPSBnZXROZXdFbGVtZW50KCk7Ci0JCQotCQlpZiAobmV3RWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgCi0JCXsKLQkJCUVPYmplY3Qgb2JqID0gZ2V0T3JpZ2luYWxDb250YWluZXIoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbikgewotCQkJCS8vIHNldCBpbnBhcnRpdGlvbiAKLQkJCQkoKEFjdGl2aXR5Tm9kZSkgbmV3RWxlbWVudCkuZ2V0SW5QYXJ0aXRpb25zKCkuYWRkKChBY3Rpdml0eVBhcnRpdGlvbikgb2JqKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkKLQkKLQotCS8qKgotCSAqIEBjdXN0b20KLQkgKi8KLQlwcml2YXRlIEVPYmplY3QgZ2V0T3JpZ2luYWxDb250YWluZXIoKQotCXsKLQkJcmV0dXJuICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuZ2V0Q29udGFpbmVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRhaW5tZW50IGZlYXR1cmUgZm9yIHRoZSBuZXcgZWxlbWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb250YWlubWVudCBmZWF0dXJlCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgewotCi0JCS8qKgotCQkgKiBUaGUgY29udGFpbm1lbnQgZmVhdHVyZSBpbiB3aGljaCB0aGUgbmV3IGVsZW1lbnQgd2lsbCBiZSBjcmVhdGVkLgotCQkgKi8KLQkJRVJlZmVyZW5jZSBjb250YWlubWVudEZlYXR1cmU9bnVsbDsKLQkJaWYgKGNvbnRhaW5tZW50RmVhdHVyZSA9PSBudWxsKSB7Ci0JCQlFQ2xhc3MgY2xhc3NUb0VkaXQgPSBnZXRFQ2xhc3NUb0VkaXQoKTsKLQotCQkJaWYgKGNsYXNzVG9FZGl0ICE9IG51bGwpIHsKLQkJCQlJRWxlbWVudFR5cGUgdHlwZSA9IGdldEVsZW1lbnRUeXBlKCk7Ci0KLQkJCQlpZiAodHlwZSAhPSBudWxsICYmIHR5cGUuZ2V0RUNsYXNzKCkgIT0gbnVsbCkgewotCQkJCQljb250YWlubWVudEZlYXR1cmUgPSBQYWNrYWdlVXRpbC5maW5kRmVhdHVyZShjbGFzc1RvRWRpdCwKLQkJCQkJCQl0eXBlLmdldEVDbGFzcygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY29udGFpbm1lbnRGZWF0dXJlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJRU9iamVjdCBuZXdFbGVtZW50ID0gc3VwZXIuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCWlmKG5ld0VsZW1lbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlCi0JCQkJfHwgbmV3RWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5UGFyYW1ldGVyTm9kZSl7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJQnJpZGdlSGVscGVyLnNldERlZmF1bHROYW1lKChBY3Rpdml0eU5vZGUpbmV3RWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVJlcXVlc3QoKTsKLQkJCi0JCWlmKFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcgPT0gcmVxdWVzdC5nZXRFbGVtZW50VHlwZSgpKXsKLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlVTUxFbGVtZW50VHlwZXMuSW5pdGlhbGl6ZXJzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNwotCQkJCQkJLmluaXQobmV3RWxlbWVudCk7Ci0JCQl9Ci0JCX1lbHNlIGlmKFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAgPT0gcmVxdWVzdAotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpewotCQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJCVVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsaXplcnMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwCi0JCQkJCQkuaW5pdChuZXdFbGVtZW50KTsKLQkJCX0KLQkJfWVsc2UgaWYoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSA9PSByZXF1ZXN0Ci0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSl7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJVU1MRWxlbWVudFR5cGVzLkluaXRpYWxpemVycy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEKLQkJCQkJCS5pbml0KG5ld0VsZW1lbnQpOwotCQkJfQotCQl9ZWxzZSBpZihVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkgPT0gcmVxdWVzdAotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpewotCQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJCVVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsaXplcnMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkKLQkJCQkJCS5pbml0KG5ld0VsZW1lbnQpOwotCQkJfQotCQl9ZWxzZSBpZihVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIgPT0gcmVxdWVzdAotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpewotCQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJCVVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsaXplcnMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIKLQkJCQkJCS5pbml0KG5ld0VsZW1lbnQpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbmV3RWxlbWVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2NvbW1hbmRzL0NyZWF0ZUluY29taW5nQ29udHJvbEZsb3dDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2NvbW1hbmRzL0NyZWF0ZUluY29taW5nQ29udHJvbEZsb3dDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMWI1YzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9jb21tYW5kcy9DcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3dDb21tYW5kIGV4dGVuZHMgQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCB7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIENyZWF0ZUluY29taW5nQ29udHJvbEZsb3dDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxdWVzdCwKLQkJCUVPYmplY3QgZWxlbWVudCkgewotCQlzdXBlcihyZXF1ZXN0KTsKLQkJc2V0RWxlbWVudFRvRWRpdChlbGVtZW50KTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvd0NvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXN1cGVyKHJlcXVlc3QpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotLy8JCWlmKGdldFNvdXJjZSgpID09IG51bGwpCi0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQkKLS8vCQlpZiAoZ2V0RUNsYXNzVG9FZGl0KCkgPT0gbnVsbCkgewotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJfQotLy8KLS8vCQlpZiAoZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgIT0gbnVsbCkgewotLy8JCQlFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA9IGdldENvbnRhaW5tZW50RmVhdHVyZSgpLmdldEVUeXBlKCk7Ci0vLwkJCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLS8vCi0vLwkJCWlmIChlQ2xhc3NpZmllciBpbnN0YW5jZW9mIEVDbGFzcykgewotLy8JCQkJcmVzdWx0ID0gKChFQ2xhc3MpIGVDbGFzc2lmaWVyKS5pc1N1cGVyVHlwZU9mKGdldEVsZW1lbnRUeXBlKCkKLS8vCQkJCQkJLmdldEVDbGFzcygpKTsKLS8vCQkJfQotLy8KLS8vCQkJcmVzdWx0ID0gcmVzdWx0Ci0vLwkJCQkJJiYgUGFja2FnZVV0aWwuY2FuUmVmZXJlbmNlKGdldEVDbGFzc1RvRWRpdCgpLAotLy8JCQkJCQkJZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCksIGdldEVsZW1lbnRUeXBlKCkKLS8vCQkJCQkJCQkJLmdldEVDbGFzcygpKTsKLS8vCi0vLwkJCXJldHVybiByZXN1bHQ7Ci0vLwkJfQotLy8JCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0JcHJvdGVjdGVkIEVPYmplY3QgZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCkgewotCQlDb250cm9sRmxvdyBuZXdFbGVtZW50ID0gKENvbnRyb2xGbG93KSBzdXBlci5kb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKTsKLQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJbmV3RWxlbWVudC5zZXRUYXJnZXQoKEFjdGl2aXR5Tm9kZSkgZ2V0VGFyZ2V0KCkpOwotCQkJbmV3RWxlbWVudC5zZXRTb3VyY2UoKEFjdGl2aXR5Tm9kZSkgZ2V0U291cmNlKCkpOwotCQl9Ci0JCXJldHVybiBuZXdFbGVtZW50OwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vY29tbWFuZHMvQ3JlYXRlT3V0Z29pbmdDb250cm9sRmxvd0NvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vY29tbWFuZHMvQ3JlYXRlT3V0Z29pbmdDb250cm9sRmxvd0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4NDc2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2NvbW1hbmRzL0NyZWF0ZU91dGdvaW5nQ29udHJvbEZsb3dDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLlBhY2thZ2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlT3V0Z29pbmdDb250cm9sRmxvd0NvbW1hbmQgZXh0ZW5kcyBDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kIHsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgQ3JlYXRlT3V0Z29pbmdDb250cm9sRmxvd0NvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXF1ZXN0LAotCQkJRU9iamVjdCBlbGVtZW50KSB7Ci0JCXN1cGVyKHJlcXVlc3QpOwotCQlzZXRFbGVtZW50VG9FZGl0KGVsZW1lbnQpOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqLwotCXB1YmxpYyBDcmVhdGVPdXRnb2luZ0NvbnRyb2xGbG93Q29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJc3VwZXIocmVxdWVzdCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5Tm9kZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlpZihnZXRTb3VyY2UoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKGdldEVDbGFzc1RvRWRpdCgpID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChnZXRDb250YWlubWVudEZlYXR1cmUoKSAhPSBudWxsKSB7Ci0JCQlFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA9IGdldENvbnRhaW5tZW50RmVhdHVyZSgpLmdldEVUeXBlKCk7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLQkJCWlmIChlQ2xhc3NpZmllciBpbnN0YW5jZW9mIEVDbGFzcykgewotCQkJCXJlc3VsdCA9ICgoRUNsYXNzKSBlQ2xhc3NpZmllcikuaXNTdXBlclR5cGVPZihnZXRFbGVtZW50VHlwZSgpCi0JCQkJCQkuZ2V0RUNsYXNzKCkpOwotCQkJfQotCi0JCQlyZXN1bHQgPSByZXN1bHQKLQkJCQkJJiYgUGFja2FnZVV0aWwuY2FuUmVmZXJlbmNlKGdldEVDbGFzc1RvRWRpdCgpLAotCQkJCQkJCWdldENvbnRhaW5tZW50RmVhdHVyZSgpLCBnZXRFbGVtZW50VHlwZSgpCi0JCQkJCQkJCQkuZ2V0RUNsYXNzKCkpOwotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQkJLy9yZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCS8vIFRPRE86IFJlc29sdmUgdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IHByb3Blcmx5LgotCQlDb250cm9sRmxvdyBuZXdFbGVtZW50ID0gKENvbnRyb2xGbG93KSBzdXBlci5kb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKTsKLQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJbmV3RWxlbWVudC5zZXRUYXJnZXQoKEFjdGl2aXR5Tm9kZSkgZ2V0VGFyZ2V0KCkpOwotCQkJbmV3RWxlbWVudC5zZXRTb3VyY2UoKEFjdGl2aXR5Tm9kZSkgZ2V0U291cmNlKCkpOwotCQl9Ci0JCXJldHVybiBuZXdFbGVtZW50OwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vZmlndXJlcy9CcmVha2Rvd25FbGVtZW50Tm9kZUZpZ3VyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9maWd1cmVzL0JyZWFrZG93bkVsZW1lbnROb2RlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwY2ZjODMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9maWd1cmVzL0JyZWFrZG93bkVsZW1lbnROb2RlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotCi0vKioKLSAqIEN1c3RvbWl6ZWQgZmlndXJlIGZvciB0aGUgQnJlYWtkb3duRWxlbWVudCBmaWd1cmVzIHRvIHNob3cgb3ZlcmxhcHBlZCBwb3J0aW9uLiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudE5vZGVGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnROb2RlRmlndXJlKCkgewotCQl0aGlzLnNldE91dGxpbmUoZmFsc2UpOwotCQl0aGlzLnNldE9wYXF1ZShmYWxzZSk7Ci0JCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7Ci0JCWZpZ18wLnNldFRleHQoRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX05ld19JdGVyYXRpb24pOwotCi0JCURpYWdyYW1Db3JlVXRpbC5zZXRMYWJlbFByb3BlcnRpZXMoZmlnXzApOwotCi0JCXNldEZpZ3VyZU5vZGVOYW1lRmlndXJlKGZpZ18wKTsKLQotCQlPYmplY3QgbGF5RGF0YTAgPSBudWxsOwotCi0JCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZOb2RlTmFtZUZpZ3VyZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkgewotCQlyZXR1cm4gZk5vZGVOYW1lRmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoCi0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKSB7Ci0JCWZOb2RlTmFtZUZpZ3VyZSA9IGZpZzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJaWYoaXNPcGFxdWUoKSkKLQkJCXN1cGVyLnBhaW50RmlndXJlKGdyYXBoaWNzKTsKLQkJcmV0dXJuOwotCX0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2ZpZ3VyZXMvRGVjaXNpb25Ob2RlRmlndXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2ZpZ3VyZXMvRGVjaXNpb25Ob2RlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NjY1ODMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9maWd1cmVzL0RlY2lzaW9uTm9kZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5maWd1cmVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5JUG9seWdvbkFuY2hvcmFibGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQWRvcHRlZCBmcm9tIEdNRidzIEdlb1NoYXBlcwotICovCi1wdWJsaWMgY2xhc3MgRGVjaXNpb25Ob2RlRmlndXJlIGV4dGVuZHMgRGVmYXVsdFNpemVOb2RlRmlndXJlIGltcGxlbWVudHMKLQkJSVBvbHlnb25BbmNob3JhYmxlRmlndXJlIHsKLQotCXByaXZhdGUgaW50IHNwYWNpbmc7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBjcmVhdGUgYSBkZWNpc2lvbiBmaWd1cmUKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGVjaXNpb25Ob2RlRmlndXJlKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHNwYWNpbmcpIHsKLQkJc3VwZXIod2lkdGgsIGhlaWdodCk7Ci0JCXRoaXMuc3BhY2luZyA9IHNwYWNpbmc7Ci0JCWNyZWF0ZUZpZ3VyZSh3aWR0aCwgaGVpZ2h0KTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGRlZlNpemUKLQkgKi8KLQlwdWJsaWMgRGVjaXNpb25Ob2RlRmlndXJlKERpbWVuc2lvbiBkZWZTaXplKSB7Ci0JCXN1cGVyKGRlZlNpemUpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICovCi0JcHVibGljIERlY2lzaW9uTm9kZUZpZ3VyZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJc3VwZXIod2lkdGgsIGhlaWdodCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLklQb2x5Z29uQW5jaG9yYWJsZUZpZ3VyZSNnZXRQb2x5Z29uUG9pbnRzKCkKLQkgKi8KLQlwdWJsaWMgUG9pbnRMaXN0IGdldFBvbHlnb25Qb2ludHMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGdldFBvaW50cygpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBnKSB7Ci0JCVBvaW50TGlzdCBwb2ludHMgPSBnZXRQb2ludExpc3QoZ2V0Qm91bmRzKCkuZ2V0Q29weSgpKTsKLQkJZy5maWxsUG9seWdvbihwb2ludHMpOwotCQlnLmRyYXdQb2x5Z29uKHBvaW50cyk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgc2hhcGVzIHBvbHlnb24gcG9pbnRzLgotCSAqIFRoaXMgaXMgY3VycmVudGx5IGJhc2VkIG9uIHRoZSBzaGFwZXMgYm91bmRpbmcgYm94LgotCSAqIAotCSAqIEBwYXJhbSByZWN0IHRoZSByZWN0YW5nbGUgdGhhdCB0aGUgc2hhcGUgd2lsbCBmaXQgaW4KLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnRMaXN0IGdldFBvaW50TGlzdChSZWN0YW5nbGUgcmVjdCkgewotCQlQb2ludExpc3QgcG9pbnRzID0gbmV3IFBvaW50TGlzdCgpOwotCQkKLQkJaW50IGhhbGZYID0gcmVjdC54ICsgKHJlY3Qud2lkdGggLyAyKTsKLQkJaW50IGhhbGZZID0gcmVjdC55ICsgKHJlY3QuaGVpZ2h0IC8gMik7Ci0JCQotCQlQb2ludCBwMSA9IG5ldyBQb2ludCggaGFsZlgsIHJlY3QueSApOwotCQlQb2ludCBwMiA9IG5ldyBQb2ludCggcmVjdC54ICsgcmVjdC53aWR0aCAtIDEsIGhhbGZZICk7Ci0JCVBvaW50IHAzID0gbmV3IFBvaW50KCBoYWxmWCwgcmVjdC55ICsgcmVjdC5oZWlnaHQgLSAxICk7Ci0JCVBvaW50IHA0ID0gbmV3IFBvaW50KCByZWN0LngsIGhhbGZZICk7Ci0JCQotCQlwb2ludHMuYWRkUG9pbnQoIHAxICk7Ci0JCXBvaW50cy5hZGRQb2ludCggcDIgKTsKLQkJcG9pbnRzLmFkZFBvaW50KCBwMyApOwotCQlwb2ludHMuYWRkUG9pbnQoIHA0ICk7Ci0JCXBvaW50cy5hZGRQb2ludCggcDEgKTsJCi0JCQotCQlyZXR1cm4gcG9pbnRzOwotCX0KLQkKLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJcmV0dXJuIChJRmlndXJlKSBnZXRDaGlsZHJlbigpLmdldCgwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlRmlndXJlKGludCB3aWR0aCwgaW50IGhlaWdodCl7Ci0JCXNldE9wYXF1ZSh0cnVlKTsKLQkJc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsYXlvdXQoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJCQlSZWN0YW5nbGUgciA9IGZpZ3VyZS5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJTGlzdCBjaGlsZHJlbiA9IGZpZ3VyZS5nZXRDaGlsZHJlbigpOwotCQkJCUlGaWd1cmUgY2hpbGQ7Ci0JCQkJRGltZW5zaW9uIGQ7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJCQljaGlsZCA9IChJRmlndXJlKWNoaWxkcmVuLmdldChpKTsKLQkJCQkJZCA9IGNoaWxkLmdldFByZWZlcnJlZFNpemUoci53aWR0aCwgci5oZWlnaHQpOwotCQkJCQlkLndpZHRoID0gTWF0aC5taW4oZC53aWR0aCwgci53aWR0aCk7Ci0JCQkJCWQuaGVpZ2h0ID0gTWF0aC5taW4oZC5oZWlnaHQsIHIuaGVpZ2h0KTsKLQkJCQkJUmVjdGFuZ2xlIGNoaWxkUmVjdCA9IG5ldyBSZWN0YW5nbGUoCi0JCQkJCQlyLnggKyAoci53aWR0aCAtIGQud2lkdGgpLzIsCi0JCQkJCQlyLnkgKyAoci5oZWlnaHQgLSBkLmhlaWdodCkvMiwKLQkJCQkJCWQud2lkdGgsCi0JCQkJCQlkLmhlaWdodCk7Ci0JCQkJCWNoaWxkLnNldEJvdW5kcyhjaGlsZFJlY3QpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlJRmlndXJlIGYgPSBuZXcgRmlndXJlKCk7Ci0JCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCWxheW91dC5zZXRTcGFjaW5nKHNwYWNpbmcpOwotCQlmLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJYWRkKGYpOwotCX0KLQkKLQlwdWJsaWMgUG9pbnRMaXN0IGdldFBvaW50cygpewotCQlyZXR1cm4gZ2V0UG9pbnRMaXN0KGdldEJvdW5kcygpLmdldENvcHkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9maWd1cmVzL0VuZE5vZGVGaWd1cmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vZmlndXJlcy9FbmROb2RlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYzA3YTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9maWd1cmVzL0VuZE5vZGVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRWxsaXBzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRW5kTm9kZUZpZ3VyZSBleHRlbmRzIEVsbGlwc2UgewotCi0JLyoqCi0JICogRmlsbHMgdGhlIGVsbGlwc2UuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGUjZmlsbFNoYXBlKG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsU2hhcGUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJUmVjdGFuZ2xlIHIgPSBnZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCXIuc2hyaW5rKHIud2lkdGggLyA4LCByLmhlaWdodCAvIDgpOwotCQlncmFwaGljcy5maWxsT3ZhbChyKTsKLQl9Ci0KLQkvKioKLQkgKiBPdXRsaW5lcyB0aGUgZWxsaXBzZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZSNvdXRsaW5lU2hhcGUob3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG91dGxpbmVTaGFwZShHcmFwaGljcyBncmFwaGljcykgewotCQlzdXBlci5vdXRsaW5lU2hhcGUoZ3JhcGhpY3MpOwotCi0JCVJlY3RhbmdsZSByID0gUmVjdGFuZ2xlLlNJTkdMRVRPTjsKLQkJci5zZXRCb3VuZHMoZ2V0Qm91bmRzKCkpOwotCQlyLnNocmluayhnZXRCb3VuZHMoKS53aWR0aCAvIDgsIGdldEJvdW5kcygpLmhlaWdodCAvIDgpOwotCQlyLndpZHRoLS07Ci0JCXIuaGVpZ2h0LS07Ci0JCXIuc2hyaW5rKChsaW5lV2lkdGggLSAxKSAvIDIsIChsaW5lV2lkdGggLSAxKSAvIDIpOwotCQlncmFwaGljcy5kcmF3T3ZhbChyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vZmlndXJlcy9SZWxhdGl2ZVhZQW5jaG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2ZpZ3VyZXMvUmVsYXRpdmVYWUFuY2hvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODQyODU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vZmlndXJlcy9SZWxhdGl2ZVhZQW5jaG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0Q29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotLyoqCi0gKiBQcm92aWRlcyByZWxhdGl2ZSBhbmNob3IgZm9yIGEgZmlndXJlJ3MgbG9jYXRpb24uIAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVsYXRpdmVYWUFuY2hvciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbkFuY2hvciB7Ci0KLQlwcml2YXRlIFBvaW50IHJlbGF0aXZlTG9jYXRpb247Ci0KLQlwdWJsaWMgUmVsYXRpdmVYWUFuY2hvcihJRmlndXJlIGZpZ3VyZSwgUG9pbnQgbG9jYXRpb24sIGJvb2xlYW4gaXNSZWxhdGl2ZSkgewotCQlzdXBlcihmaWd1cmUpOwotCQlyZWxhdGl2ZUxvY2F0aW9uID0gbG9jYXRpb24uZ2V0Q29weSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25BbmNob3IjZ2V0TG9jYXRpb24oUG9pbnQpCi0JICovCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJlZmVyZW5jZSkgewotCQlQb2ludCBwID0gcmVsYXRpdmVMb2NhdGlvbi5nZXRDb3B5KCk7Ci0JCVJlY3RhbmdsZSByID0gZ2V0T3duZXIoKS5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCXAucGVyZm9ybVRyYW5zbGF0ZShyLngsIHIueSk7Ci0JCWdldE93bmVyKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShwKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yI2dldFJlZmVyZW5jZVBvaW50KCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0UmVmZXJlbmNlUG9pbnQoKSB7Ci0JCXJldHVybiBnZXRMb2NhdGlvbihudWxsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vcG9saWNpZXMvQWN0aXZpdHlDcmVhdGlvbkVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vcG9saWNpZXMvQWN0aXZpdHlDcmVhdGlvbkVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVhZTYyNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL0FjdGl2aXR5Q3JlYXRpb25FZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbXBvc2l0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlDcmVhdGlvbkVkaXRQb2xpY3kgZXh0ZW5kcyBDcmVhdGlvbkVkaXRQb2xpY3kgewotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlcGFyZW50Q29tbWFuZChDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJSXRlcmF0b3IgZWRpdFBhcnRzID0gcmVxdWVzdC5nZXRFZGl0UGFydHMoKS5pdGVyYXRvcigpOwotCQlWaWV3IGNvbnRhaW5lciA9IChWaWV3KWdldEhvc3QoKS5nZXRBZGFwdGVyKFZpZXcuY2xhc3MpOwotCQlFT2JqZWN0IGNvbnRleHQgPSBjb250YWluZXIgPT0gbnVsbCA/IG51bGwgOiBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KGNvbnRhaW5lcik7Ci0gICAgICAgIENvbXBvc2l0ZUNvbW1hbmQgY2MgPSBuZXcgQ29tcG9zaXRlQ29tbWFuZChEaWFncmFtVUlNZXNzYWdlcy5BZGRDb21tYW5kX0xhYmVsKTsKLQkJd2hpbGUgKCBlZGl0UGFydHMuaGFzTmV4dCgpICkgewotCQkJRWRpdFBhcnQgZXAgPSAoRWRpdFBhcnQpZWRpdFBhcnRzLm5leHQoKTsKLQkJCWlmICggZXAgaW5zdGFuY2VvZiBMYWJlbEVkaXRQYXJ0ICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlWaWV3IHZpZXcgPSAoVmlldyllcC5nZXRBZGFwdGVyKFZpZXcuY2xhc3MpOwotCQkJaWYgKCB2aWV3ID09IG51bGwgKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlFT2JqZWN0IHNlbWFudGljID0gVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudCh2aWV3KTsKLQkJCWlmICggc2VtYW50aWMgPT0gbnVsbCApIHsKLQkJCQlJR3JhcGhpY2FsRWRpdFBhcnQgZ2VwID0gKElHcmFwaGljYWxFZGl0UGFydCllcDsKLQkJCQlpZihzaG91bGRSZXBhcmVudChnZXAsIHJlcXVlc3QpKSB7Ci0JCQkJCWNjLmNvbXBvc2UoZ2V0UmVwYXJlbnRWaWV3Q29tbWFuZChnZXApKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICggY29udGV4dCAhPSBudWxsICYmIHNob3VsZFJlcGFyZW50KHNlbWFudGljLCBjb250ZXh0KSkgewotCQkJCWNjLmNvbXBvc2UoZ2V0UmVwYXJlbnRDb21tYW5kKChJR3JhcGhpY2FsRWRpdFBhcnQpZXApKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2MuaXNFbXB0eSgpID8gbnVsbCA6IG5ldyBJQ29tbWFuZFByb3h5KGNjLnJlZHVjZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRSZXBhcmVudChJR3JhcGhpY2FsRWRpdFBhcnQgZXAsIENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCkgewotCQkvLyByZXBsYWNlIHBhcmVudCBvbmx5IGlmIHRoZSB2aWV3IGRvZXMgbm90IGhhdmUgYW55IHBhcmVudCB5ZXQgb3IgdGhlCi0JCS8vIGJvdW5kcyBhcmUgbm90IGluc2lkZSB0aGUgY3VycmVudCBwYXJlbnQgZmlndXJlCi0JCS8vCi0JCVZpZXcgdmlldyA9IChWaWV3KSBlcC5nZXRNb2RlbCgpOwotCQlpZih2aWV3LmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQlQb2ludCBsb2NhdGlvbiA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldExvY2F0aW9uKCkuZ2V0VHJhbnNsYXRlZChyZXF1ZXN0LmdldE1vdmVEZWx0YSgpKTsKLQkJCUlGaWd1cmUgcGFyZW50RmlnID0gKChHcmFwaGljYWxFZGl0UGFydCllcC5nZXRQYXJlbnQoKSkuZ2V0RmlndXJlKCk7Ci0JCQlSZWN0YW5nbGUgcGFyZW50Qm91bmRzID0gcGFyZW50RmlnLmdldEJvdW5kcygpOwkKLQkJCXJldHVybiAhcGFyZW50Qm91bmRzLmNvbnRhaW5zKGxvY2F0aW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkNyZWF0aW9uRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkNyZWF0aW9uRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2QxNTQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGlvbkVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20ucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbXBvc2l0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkNyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Qm91bmRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTGFiZWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuTW92ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIENyZWF0aW9uRWRpdFBvbGljeSBmb3IgQWN0aXZpdHlQYXJ0aXRpb24uCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uQ3JlYXRpb25FZGl0UG9saWN5IGV4dGVuZHMgQ3JlYXRpb25FZGl0UG9saWN5IHsKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeSNnZXRDcmVhdGVDb21tYW5kKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3QpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNjID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKAotCQkJCWVkaXRpbmdEb21haW4sIERpYWdyYW1VSU1lc3NhZ2VzLkFkZENvbW1hbmRfTGFiZWwpOwotCi0JCUl0ZXJhdG9yIGRlc2NyaXB0b3JzID0gcmVxdWVzdC5nZXRWaWV3RGVzY3JpcHRvcnMoKS5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChkZXNjcmlwdG9ycy5oYXNOZXh0KCkpIHsKLQkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IpIGRlc2NyaXB0b3JzCi0JCQkJCS5uZXh0KCk7Ci0JCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0vLwkJCXdoaWxlKGNvbnRhaW5lclZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb24pewotLy8JCQkJY29udGFpbmVyVmlldyA9IChWaWV3KWNvbnRhaW5lclZpZXcuZUNvbnRhaW5lcigpOwotLy8JCQl9Ci0JCQlDcmVhdGVDb21tYW5kIGNyZWF0ZUNvbW1hbmQgPSBuZXcgQ3JlYXRlQ29tbWFuZChlZGl0aW5nRG9tYWluLAotCQkJCQlkZXNjcmlwdG9yLCBjb250YWluZXJWaWV3KTsKLQotCQkJY2MuY29tcG9zZShjcmVhdGVDb21tYW5kKTsKLQkJfQotCXJldHVybiBuZXcgSUNvbW1hbmRQcm94eShjYy5yZWR1Y2UoKSk7Ci0JfQotCQotCS8qKiBSZXR1cm4gYSBjb21tYW5kIHRvIHJlcGFyZW50IGJvdGggdGhlIHNlbWFudGljIGFuZCB2aWV3IGVsZW1lbnRzLiAqLwotCS8qKgotCSAqIHJldHVybiBhIGNvbW1hbmQgdG8gcmVwYXJlbnQgYm90aCB0aGUgc2VtYW50aWMgYW5kIHZpZXcgZWxlbWVudHMuIAotCSAqIEBwYXJhbSByZXF1ZXN0IHRoZSByZXF1ZXN0Ci0JICogQHJldHVybiBjb21tYW5kCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVwYXJlbnRDb21tYW5kKENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCkgewotCQlJdGVyYXRvciBlZGl0UGFydHMgPSByZXF1ZXN0LmdldEVkaXRQYXJ0cygpLml0ZXJhdG9yKCk7Ci0JCVZpZXcgY29udGFpbmVyID0gKFZpZXcpZ2V0SG9zdCgpLmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7Ci0JCUVPYmplY3QgY29udGV4dCA9IGNvbnRhaW5lciA9PSBudWxsID8gbnVsbCA6IFZpZXdVdGlsLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoY29udGFpbmVyKTsKLSAgICAgICAgQ29tcG9zaXRlQ29tbWFuZCBjYyA9IG5ldyBDb21wb3NpdGVDb21tYW5kKERpYWdyYW1VSU1lc3NhZ2VzLkFkZENvbW1hbmRfTGFiZWwpOwotCQl3aGlsZSAoIGVkaXRQYXJ0cy5oYXNOZXh0KCkgKSB7Ci0JCQlFZGl0UGFydCBlcCA9IChFZGl0UGFydCllZGl0UGFydHMubmV4dCgpOwotCQkJaWYgKCBlcCBpbnN0YW5jZW9mIExhYmVsRWRpdFBhcnQgKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCVZpZXcgdmlldyA9IChWaWV3KWVwLmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7Ci0JCQlpZiAoIHZpZXcgPT0gbnVsbCApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJRU9iamVjdCBzZW1hbnRpYyA9IFZpZXdVdGlsLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQodmlldyk7Ci0JCQlpZiAoIHNlbWFudGljID09IG51bGwgKSB7Ci0JCQkJY2MuY29tcG9zZShnZXRSZXBhcmVudFZpZXdDb21tYW5kKChJR3JhcGhpY2FsRWRpdFBhcnQpZXApKTsKLQkJCQljYy5jb21wb3NlKGFkanVzdExvY2F0aW9uQ29tbWFuZCgoSUdyYXBoaWNhbEVkaXRQYXJ0KWVwLCByZXF1ZXN0KSk7Ci0JCQl9Ci0JCQllbHNlIGlmICggY29udGV4dCAhPSBudWxsICYmIHNob3VsZFJlcGFyZW50KHNlbWFudGljLCBjb250ZXh0KSkgewotCQkJCWNjLmNvbXBvc2UoZ2V0UmVwYXJlbnRDb21tYW5kKChJR3JhcGhpY2FsRWRpdFBhcnQpZXApKTsKLQkJCQljYy5jb21wb3NlKGFkanVzdExvY2F0aW9uQ29tbWFuZCgoSUdyYXBoaWNhbEVkaXRQYXJ0KWVwLCByZXF1ZXN0KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNjLmlzRW1wdHkoKSA/IG51bGwgOiBuZXcgSUNvbW1hbmRQcm94eShjYy5yZWR1Y2UoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRSZXBhcmVudENvbW1hbmQoSUdyYXBoaWNhbEVkaXRQYXJ0IGdlcCkgewotCQlDb21wb3NpdGVDb21tYW5kIGNjID0gbmV3IENvbXBvc2l0ZUNvbW1hbmQoRGlhZ3JhbVVJTWVzc2FnZXMuQWRkQ29tbWFuZF9MYWJlbCk7IAotCQlWaWV3IGNvbnRhaW5lciA9IChWaWV3KWdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlFT2JqZWN0IGNvbnRleHQgPSBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KGNvbnRhaW5lcik7Ci0JCVZpZXcgdmlldyA9IChWaWV3KWdlcC5nZXRNb2RlbCgpOwotCQlFT2JqZWN0IGVsZW1lbnQgPSBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KHZpZXcpOwotCi0gICAgICAgIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotICAgICAgICAgICAgLmdldEVkaXRpbmdEb21haW4oKTsKLSAgICAgICAgCi0gICAgICAgIC8vCi0JCS8vIHNlbWFudGljCi0JCWlmICggZWxlbWVudCAhPSBudWxsICkgewotCQkJQ29tbWFuZCBtb3ZlU2VtYW50aWNDbWQgPQotCQkJCWdldEhvc3QoKS5nZXRDb21tYW5kKAotCQkJCQluZXcgRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlcigKLQkJCQkJCW5ldyBNb3ZlUmVxdWVzdChlZGl0aW5nRG9tYWluLCBjb250ZXh0LCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eVBhcnRpdGlvbl9Ob2RlKCksIGVsZW1lbnQpKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgaWYgKG1vdmVTZW1hbnRpY0NtZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotICAgICAgICAgICAgICB9Ci0JCQkKLQkJCWNjLmNvbXBvc2UgKCBuZXcgQ29tbWFuZFByb3h5KG1vdmVTZW1hbnRpY0NtZCkgKTsKLQkJfQotCQkvLwotCQkvLyBub3RhdGlvbgotCQljYy5jb21wb3NlKGdldFJlcGFyZW50Vmlld0NvbW1hbmQoZ2VwKSk7Ci0JCS8vIGluIGNhc2Ugb2YgbW92aW5nIGludG8gcGFydGl0aW9uIHdlIGhhdmUgdG8gY2hhbmdlIHRoZSBjb29yZGluYXRlcyBvZiBlbGVtZW50Ci0JCXJldHVybiBjYzsKLQl9Ci0KLQlwcml2YXRlIElDb21tYW5kIGFkanVzdExvY2F0aW9uQ29tbWFuZChJR3JhcGhpY2FsRWRpdFBhcnQgY2hpbGQsCi0JCQlDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgU2hhcGVFZGl0UGFydCkgewotCQkJUG9pbnQgbG9jYXRpb24gPSByZXF1ZXN0LmdldE1vdmVEZWx0YSgpOwotCQkJUG9pbnQgY2hpbGRMb2NhdGlvbiA9IGNoaWxkLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldExvY2F0aW9uKCk7Ci0JCQlpbnQgeCA9IGNoaWxkTG9jYXRpb24ueCArIGxvY2F0aW9uLngKLQkJCQkJLSAoKEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpZ2V0SG9zdCgpKS5nZXRMb2NhdGlvbigpLng7Ci0JCQlpbnQgeSA9IGNoaWxkTG9jYXRpb24ueSArIGxvY2F0aW9uLnkKLQkJCQkJLSAoKEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpZ2V0SG9zdCgpKS5nZXRMb2NhdGlvbigpLnk7Ci0KLQkJCUlDb21tYW5kIGJvdW5kc0NvbW1hbmQgPSBuZXcgU2V0Qm91bmRzQ29tbWFuZCgKLQkJCQkJKChTaGFwZUVkaXRQYXJ0KSBjaGlsZCkuZ2V0RWRpdGluZ0RvbWFpbigpLAotCQkJCQlEaWFncmFtVUlNZXNzYWdlcy5TZXRMb2NhdGlvbkNvbW1hbmRfTGFiZWxfUmVzaXplLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigoVmlldykgY2hpbGQuZ2V0TW9kZWwoKSksCi0JCQkJCW5ldyBQb2ludCh4LCB5KSk7Ci0KLQkJCXJldHVybiBib3VuZHNDb21tYW5kOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlzdGF0aWMgSUNvbW1hbmQgY3JlYXRlQWRqdXN0TG9jYXRpb25Db21tYW5kKElHcmFwaGljYWxFZGl0UGFydCBjaGlsZCwKLQkJCUNoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCwgSUdyYXBoaWNhbEVkaXRQYXJ0IG5ld1BhcmVudCkgewotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBTaGFwZUVkaXRQYXJ0KSB7Ci0JCQlQb2ludCBsb2NhdGlvbiA9IHJlcXVlc3QuZ2V0TW92ZURlbHRhKCk7Ci0JCQlQb2ludCBuZXdMb2NhdGlvbiA9IGNoaWxkLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldExvY2F0aW9uKCkuZ2V0Q29weSgpLnRyYW5zbGF0ZShsb2NhdGlvbik7Ci0vLwkJCURpbWVuc2lvbiBkaWZmID0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQuZ2V0UGFyZW50KCkpLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0vLwkJCQkJLmdldExvY2F0aW9uKCkuZ2V0RGlmZmVyZW5jZSgKLS8vCQkJCQkJCW5ld1BhcmVudC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRMb2NhdGlvbigpKTsKLS8vCQkJbmV3TG9jYXRpb24udHJhbnNsYXRlKGRpZmYpOwotLy8JCQluZXdQYXJlbnQuZ2V0RmlndXJlKCkudHJhbnNsYXRlRnJvbVBhcmVudChuZXdMb2NhdGlvbik7Ci0JCQlJQ29tbWFuZCBib3VuZHNDb21tYW5kID0gbmV3IFNldEJvdW5kc0NvbW1hbmQoCi0JCQkJCSgoU2hhcGVFZGl0UGFydCkgY2hpbGQpLmdldEVkaXRpbmdEb21haW4oKSwKLQkJCQkJRGlhZ3JhbVVJTWVzc2FnZXMuU2V0TG9jYXRpb25Db21tYW5kX0xhYmVsX1Jlc2l6ZSwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoKFZpZXcpIGNoaWxkLmdldE1vZGVsKCkpLAotCQkJCQluZXdMb2NhdGlvbik7Ci0KLQkJCXJldHVybiBib3VuZHNDb21tYW5kOwotCQl9Ci0JCXJldHVybiBudWxsOwkJCQkKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uRGVsZWdhdGlvbkVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25EZWxlZ2F0aW9uRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2YxODNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25EZWxlZ2F0aW9uRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkFic3RyYWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ29udGFpbmVyRWRpdFBvbGljeTsKLQotLyoqCi0gKiBBY3Rpdml0eVBhcnRpdGlvbiBkZWxlZ2F0ZXMgdG8gaXRzIGNvbXBhcnRtZW50IGVkaXQgcG9saWN5Ci0gKiAgIAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25EZWxlZ2F0aW9uRWRpdFBvbGljeSBleHRlbmRzCi0gICAgICAgIEFic3RyYWN0RWRpdFBvbGljeSB7Ci0KLSAgICBwcml2YXRlIEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQ7Ci0gICAgcHJpdmF0ZSBFZGl0UG9saWN5IGNoaWxkRWRpdFBvbGljeTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjaGlsZFZpZXdJRDsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBlZGl0UG9saWN5SUQ7Ci0gICAgCi0gICAgCi0gICAgcHVibGljIEFjdGl2aXR5UGFydGl0aW9uRGVsZWdhdGlvbkVkaXRQb2xpY3koU3RyaW5nIGNoaWxkSWQsIFN0cmluZyBlZGl0UG9saWN5SWQpIHsKLSAgICAgICAgY2hpbGRWaWV3SUQgPSBjaGlsZElkOwotICAgICAgICBlZGl0UG9saWN5SUQgPSBlZGl0UG9saWN5SWQ7Ci0gICAgfQotICAgIAotCi0gICAvKioKLSAgICAqIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5BYnN0cmFjdEVkaXRQb2xpY3kjYWN0aXZhdGUoKQotICAgICovCi0gICAgcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0gICAgICAgIGNoaWxkRWRpdFBhcnQgPQotICAgICAgICAgICAgKChJR3JhcGhpY2FsRWRpdFBhcnQpZ2V0SG9zdCgpKS5nZXRDaGlsZEJ5U2VtYW50aWNIaW50KGNoaWxkVmlld0lEKTsKLSAgICAgICAgaWYgKGNoaWxkRWRpdFBhcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNoaWxkRWRpdFBvbGljeSA9IGNoaWxkRWRpdFBhcnQuZ2V0RWRpdFBvbGljeShlZGl0UG9saWN5SUQpOwotICAgICAgICBjaGlsZEVkaXRQb2xpY3kuc2V0SG9zdChjaGlsZEVkaXRQYXJ0KTsKLSAgICAgICAgY2hpbGRFZGl0UG9saWN5LmFjdGl2YXRlKCk7Ci0gICAgfQotCi0gIC8qKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5BYnN0cmFjdEVkaXRQb2xpY3kjZGVhY3RpdmF0ZSgpCi0gICAqLwotICAgIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0gICAgICAgIGlmIChjaGlsZEVkaXRQb2xpY3kgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNoaWxkRWRpdFBvbGljeS5kZWFjdGl2YXRlKCk7Ci0gICAgICAgIGNoaWxkRWRpdFBhcnQgPSBudWxsOwotICAgICAgICBjaGlsZEVkaXRQb2xpY3kgPSBudWxsOwotICAgIH0KLQotCi0gICAvKioKLSAgICAqIAotICAgICovCi0gICAgcHVibGljIHZvaWQgZXJhc2VTb3VyY2VGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgaWYgKGNoaWxkRWRpdFBvbGljeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2hpbGRFZGl0UG9saWN5LmVyYXNlU291cmNlRmVlZGJhY2socmVxdWVzdCk7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQWJzdHJhY3RFZGl0UG9saWN5I2VyYXNlVGFyZ2V0RmVlZGJhY2sob3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3QpCi0gICAgICogQG1vZGlmaWVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXJhc2VUYXJnZXRGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgaWYgKGNoaWxkRWRpdFBvbGljeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2hpbGRFZGl0UG9saWN5LmVyYXNlVGFyZ2V0RmVlZGJhY2socmVxdWVzdCk7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQWJzdHJhY3RFZGl0UG9saWN5I2dldENvbW1hbmQob3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3QpCi0gICAgICogQG1vZGlmaWVkCi0gICAgICovCi0gICAgcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgaWYgKGNoaWxkRWRpdFBvbGljeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZihjaGlsZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb250YWluZXJFZGl0UG9saWN5ICYmIAotICAgICAgICAJCXJlcXVlc3QgaW5zdGFuY2VvZiBDaGFuZ2VCb3VuZHNSZXF1ZXN0KXsKLSAgICAgICAgCXJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGlsZEVkaXRQb2xpY3kuZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5BYnN0cmFjdEVkaXRQb2xpY3kjZ2V0VGFyZ2V0RWRpdFBhcnQob3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3QpCi0gICAgICogQG1vZGlmaWVkCi0gICAgICovCi0gICAgcHVibGljIEVkaXRQYXJ0IGdldFRhcmdldEVkaXRQYXJ0KFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBpZiAoY2hpbGRFZGl0UG9saWN5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGlsZEVkaXRQb2xpY3kuZ2V0VGFyZ2V0RWRpdFBhcnQocmVxdWVzdCk7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQWJzdHJhY3RFZGl0UG9saWN5I3Nob3dTb3VyY2VGZWVkYmFjayhvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdCkKLSAgICAgKiBAbW9kaWZpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzaG93U291cmNlRmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIGlmIChjaGlsZEVkaXRQb2xpY3kgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNoaWxkRWRpdFBvbGljeS5zaG93U291cmNlRmVlZGJhY2socmVxdWVzdCk7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQWJzdHJhY3RFZGl0UG9saWN5I3Nob3dUYXJnZXRGZWVkYmFjayhvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdCkKLSAgICAgKiBAbW9kaWZpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzaG93VGFyZ2V0RmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIGlmIChjaGlsZEVkaXRQb2xpY3kgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNoaWxkRWRpdFBvbGljeS5zaG93VGFyZ2V0RmVlZGJhY2socmVxdWVzdCk7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQWJzdHJhY3RFZGl0UG9saWN5I3VuZGVyc3RhbmRzUmVxdWVzdChvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdCkKLSAgICAgKiBAbW9kaWZpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXEpIHsKLSAgICAgICAgaWYgKGNoaWxkRWRpdFBhcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgYWN0aXZhdGUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2hpbGRFZGl0UG9saWN5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hpbGRFZGl0UG9saWN5LnVuZGVyc3RhbmRzUmVxdWVzdChyZXEpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uTGF5b3V0RWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkxheW91dEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRiNTkwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uTGF5b3V0RWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZVNoYXBlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5YWUxheW91dEVkaXRQb2xpY3k7Ci0KLS8qKgotICogWFlMYXlvdXRQb2xpY3kgZm9yIEFjdGl2aXR5UGFydGl0aW9uIHRvIGhhbmRsZSB0aGUgbW92ZSBvZiBjaGlsZHJlbi4KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHdyaXR0ZW4KLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uTGF5b3V0RWRpdFBvbGljeSBleHRlbmRzIFhZTGF5b3V0RWRpdFBvbGljeSB7Ci0KLQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJRWRpdFBvbGljeSByZXN1bHQgPSBzdXBlci5jcmVhdGVDaGlsZEVkaXRQb2xpY3koY2hpbGQpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgUmVzaXphYmxlU2hhcGVFZGl0UG9saWN5KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldE1vdmVDaGlsZHJlbkNvbW1hbmQocmVxdWVzdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9BY3Rpdml0eVhZTGF5b3V0RWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9BY3Rpdml0eVhZTGF5b3V0RWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTM4NTQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vcG9saWNpZXMvQWN0aXZpdHlYWUxheW91dEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20ucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DaGFuZ2VCb3VuZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbXBvc2l0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRCb3VuZHNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5YWUxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuSUVkaXRDb21tYW5kUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLk1vdmVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkJvdW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5MYXlvdXRDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJ0aXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlYWUxheW91dEVkaXRQb2xpY3kgZXh0ZW5kcyBYWUxheW91dEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEFjdGl2aXR5WFlMYXlvdXRFZGl0UG9saWN5KCkgewotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdFBhcnQgY2hpbGQsIE9iamVjdCBjb25zdHJhaW50KSB7Ci0JCU9iamVjdCBwYXJlbnQgID0gY2hpbGQuZ2V0UGFyZW50KCk7CQkKLQkJaWYgKChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KSAmJgotCQkJKCBjaGlsZCBpbnN0YW5jZW9mIFNoYXBlRWRpdFBhcnQgJiYgY29uc3RyYWludCBpbnN0YW5jZW9mIFJlY3RhbmdsZSkpIHsKLQkJCVJlY3RhbmdsZSByZWN0ID0gKFJlY3RhbmdsZSkgY29uc3RyYWludDsKLQkJCUlGaWd1cmUgcGFyZW50RmlndXJlID0gKChBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KXBhcmVudCkuZ2V0RmlndXJlKCk7CQkJCi0JCQlWaWV3IHZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsKLQkJCWJvb2xlYW4gYWRqdXN0TG9jYXRpb25OZWVkZWQgPSBWaWV3VXRpbAotCQkJCQkucmVzb2x2ZVNlbWFudGljRWxlbWVudCh2aWV3KSAhPSBudWxsCi0JCQkJCXx8IHBhcmVudEZpZ3VyZS5nZXRCb3VuZHMoKS5jb250YWlucyhyZWN0LmdldExvY2F0aW9uKCkpOwotCQkJaWYoYWRqdXN0TG9jYXRpb25OZWVkZWQpIHsKLQkJCQlpbnQgeCA9IHJlY3QueCAtICgoQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCkgcGFyZW50KS5nZXRMb2NhdGlvbigpLng7Ci0JCQkJaW50IHkgPSByZWN0LnkgLSAoKEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpIHBhcmVudCkuZ2V0TG9jYXRpb24oKS55OwotCi0JCQkJSUNvbW1hbmQgYm91bmRzQ29tbWFuZCA9IAotCQkJCQluZXcgU2V0Qm91bmRzQ29tbWFuZCgoKFNoYXBlRWRpdFBhcnQpIGNoaWxkKS5nZXRFZGl0aW5nRG9tYWluKCksCi0JCQkJCQkJRGlhZ3JhbVVJTWVzc2FnZXMuU2V0TG9jYXRpb25Db21tYW5kX0xhYmVsX1Jlc2l6ZSwgIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIodmlldyksCi0JCQkJCQkJCQluZXcgUG9pbnQoeCwgeSkpOyAKLQotCQkJCQlyZXR1cm4gbmV3IElDb21tYW5kUHJveHkoYm91bmRzQ29tbWFuZCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5jcmVhdGVBZGRDb21tYW5kKGNoaWxkLCBjb25zdHJhaW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChyZXF1ZXN0KTsKLQl9Ci0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNoYW5nZUNvbnN0cmFpbnRDb21tYW5kKEVkaXRQYXJ0IGNoaWxkLAotCQkJT2JqZWN0IGNvbnN0cmFpbnQpIHsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNoYW5nZUNvbnN0cmFpbnRDb21tYW5kKGNoaWxkLCBjb25zdHJhaW50KTsKLQl9Ci0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNoYW5nZUNvbnN0cmFpbnRDb21tYW5kKAotCQkJQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0LCBFZGl0UGFydCBjaGlsZCwgT2JqZWN0IGNvbnN0cmFpbnQpIHsKLQkJQ29tbWFuZCBjbWQgPSBzdXBlci5jcmVhdGVDaGFuZ2VDb25zdHJhaW50Q29tbWFuZChyZXF1ZXN0LCBjaGlsZCwKLQkJCQljb25zdHJhaW50KTsKLQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCkgewotCQkJTGlzdCBsaXN0ID0gZ2V0Tm9kZXNJblBhcnRpdGlvbigoQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCkgY2hpbGQpOwotCQkJaWYgKGxpc3QgIT0gbnVsbCAmJiAhbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlFZGl0UGFydCBlbGVtZW50ID0gKEVkaXRQYXJ0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTaGFwZU5vZGVFZGl0UGFydCkgewotCQkJCQkJQ2hhbmdlQm91bmRzUmVxdWVzdCByZXEgPSBuZXcgQ2hhbmdlQm91bmRzUmVxdWVzdCgKLQkJCQkJCQkJUkVRX1JFU0laRV9DSElMRFJFTik7Ci0JCQkJCQlyZXEuc2V0RWRpdFBhcnRzKGVsZW1lbnQpOwotCQkJCQkJcmVxLnNldE1vdmVEZWx0YShyZXF1ZXN0LmdldE1vdmVEZWx0YSgpKTsKLQkJCQkJCXJlcS5zZXRTaXplRGVsdGEocmVxdWVzdC5nZXRTaXplRGVsdGEoKSk7Ci0JCQkJCQlyZXEuc2V0TG9jYXRpb24ocmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCXJlcS5zZXRFeHRlbmRlZERhdGEocmVxdWVzdC5nZXRFeHRlbmRlZERhdGEoKSk7Ci0JCQkJCQlyZXEuc2V0UmVzaXplRGlyZWN0aW9uKHJlcXVlc3QuZ2V0UmVzaXplRGlyZWN0aW9uKCkpOwotCQkJCQkJY21kID0gY21kLmNoYWluKGVsZW1lbnQuZ2V0UGFyZW50KCkuZ2V0Q29tbWFuZChyZXEpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfWVsc2V7Ci0JCQlFZGl0UGFydCBwYXJlbnQgPSBjaGlsZC5nZXRQYXJlbnQoKTsKLQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCl7Ci0JCQkJTGlzdCBjaGlsZHJlbiA9ICgoRGlhZ3JhbUVkaXRQYXJ0KXBhcmVudCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJRWRpdFBhcnQgcGFydCA9IChFZGl0UGFydCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmKHBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KXsKLQkJCQkJCU5vZGUgdmlldyA9IChOb2RlKXBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJCUxheW91dENvbnN0cmFpbnQgbENvbnN0YWludCA9IHZpZXcuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCQkJCQkJaWYobENvbnN0YWludCBpbnN0YW5jZW9mIEJvdW5kcyl7Ci0JCQkJCQkJUmVjdGFuZ2xlIHBhcnRpdGlvbkNvbnN0cmFpbnQgPSAoKEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpcGFydCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCQkJaWYoY29uc3RyYWludCBpbnN0YW5jZW9mIFJlY3RhbmdsZSl7Ci0JCQkJCQkJCWlmKHBhcnRpdGlvbkNvbnN0cmFpbnQuY29udGFpbnMoKFJlY3RhbmdsZSljb25zdHJhaW50KSl7Ci0JCQkJCQkJCQlyZXF1ZXN0LnNldFR5cGUoUmVxdWVzdENvbnN0YW50cy5SRVFfQ1JFQVRFKTsKLQkJCQkJCQkJCWNtZCA9IGNtZC5jaGFpbihwYXJ0LmdldENvbW1hbmQocmVxdWVzdCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfWVsc2V7Ci0JCQkJCQkJaWYgKEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCkpIHsKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMYXlvdXRDb25zdHJhaW50OiAiKyBsQ29uc3RhaW50KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNtZDsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBnZXROb2Rlc0luUGFydGl0aW9uKEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQgY2hpbGQpIHsKLQkJTGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQWN0aXZpdHlQYXJ0aXRpb24gcGFydGl0aW9uID0gKEFjdGl2aXR5UGFydGl0aW9uKSgoTm9kZSljaGlsZC5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCUxpc3QgbGlzdCA9IHBhcnRpdGlvbi5nZXROb2RlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCW5vZGVzLmFkZChmaW5kRWRpdFBhcnR5QnlFbGVtZW50KGNoaWxkLmdldFBhcmVudCgpLCBlbGVtZW50KSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVzOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBFZGl0UGFydCBmaW5kRWRpdFBhcnR5QnlFbGVtZW50KEVkaXRQYXJ0IHBhcmVudCwKLQkJCU9iamVjdCBlbGVtZW50KSB7Ci0JCUxpc3QgbGlzdCA9IHBhcmVudC5nZXRDaGlsZHJlbigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKCgoTm9kZSkgZWRpdFBhcnQuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpID09IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZWRpdFBhcnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0QWRkQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNvbW1hbmQgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JCWNvbW1hbmQuc2V0RGVidWdMYWJlbCgiQWRkIGluIENvbnN0cmFpbmVkTGF5b3V0RWRpdFBvbGljeSB3aXRoIFJlcGFyZW50IGlmIG5lY2Vzc2FyeSIpOy8vJE5PTi1OTFMtMSQKLQkJY29tbWFuZC5hZGQoc3VwZXIuZ2V0QWRkQ29tbWFuZChyZXF1ZXN0KSk7Ci0JCQotCQlJR3JhcGhpY2FsRWRpdFBhcnQgY2hpbGRQYXJ0OwotCQlpZihyZXF1ZXN0IGluc3RhbmNlb2YgQ2hhbmdlQm91bmRzUmVxdWVzdCAmJiByZXF1ZXN0LmdldFR5cGUoKSA9PSBSRVFfQUREKXsKLQkJCUNoYW5nZUJvdW5kc1JlcXVlc3QgY2hhbmdlUmVxdWVzdCA9KENoYW5nZUJvdW5kc1JlcXVlc3QpcmVxdWVzdDsgCi0JCQlMaXN0IGVkaXRQYXJ0cyA9IGNoYW5nZVJlcXVlc3QuZ2V0RWRpdFBhcnRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRQYXJ0cy5zaXplKCk7IGkrKykgewotCQkJCWNoaWxkUGFydCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpZWRpdFBhcnRzLmdldChpKTsKLQkJCQlJR3JhcGhpY2FsRWRpdFBhcnQgcGFyZW50ID0gKElHcmFwaGljYWxFZGl0UGFydCljaGlsZFBhcnQuZ2V0UGFyZW50KCk7Ci0JCQkJaWYocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCl7Ci0JCQkJCVBvaW50IHBvaW50ID0gY2hpbGRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldExvY2F0aW9uKCkuZ2V0Q29weSgpOwotCQkJCQlwb2ludC50cmFuc2xhdGUoY2hhbmdlUmVxdWVzdC5nZXRNb3ZlRGVsdGEoKSk7Ci0JCQkJCWlmKCFwYXJlbnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuY29udGFpbnMocG9pbnQpKXsKLQkJCQkJCWNvbW1hbmQuYWRkKGdldFJlcGFyZW50Q29tbWFuZChjaGlsZFBhcnQsIHBhcmVudCwgY2hhbmdlUmVxdWVzdCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb21tYW5kLnVud3JhcCgpOwotLy8JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZXBhcmVudENvbW1hbmQoSUdyYXBoaWNhbEVkaXRQYXJ0IGdlcCwgSUdyYXBoaWNhbEVkaXRQYXJ0IG9sZFBhcmVudCwKLQkJCUNoYW5nZUJvdW5kc1JlcXVlc3QgY2hhbmdlUmVxdWVzdCkgewotCQlDb21wb3NpdGVDb21tYW5kIGNjID0gbmV3IENvbXBvc2l0ZUNvbW1hbmQoRGlhZ3JhbVVJTWVzc2FnZXMuQWRkQ29tbWFuZF9MYWJlbCk7IAotCQlWaWV3IGNvbnRhaW5lciA9IChWaWV3KWdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlFT2JqZWN0IGNvbnRleHQgPSBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KGNvbnRhaW5lcik7Ci0JCVZpZXcgdmlldyA9IChWaWV3KWdlcC5nZXRNb2RlbCgpOwotCQlFT2JqZWN0IGVsZW1lbnQgPSBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KHZpZXcpOwotCi0gICAgICAgIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotICAgICAgICAgICAgLmdldEVkaXRpbmdEb21haW4oKTsKLSAgICAgICAgCi0JCWlmICggZWxlbWVudCAhPSBudWxsICkgewotCQkJY2MuY29tcG9zZShuZXcgUmVwYXJlbnRpbmdFbGVtZW50c0NvbW1hbmQobmV3IE1vdmVSZXF1ZXN0KGVkaXRpbmdEb21haW4sIGNvbnRleHQsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X05vZGUoKSwgZWxlbWVudCksCi0JCQkJCWVsZW1lbnQsdmlldywgb2xkUGFyZW50KSk7Ci0JCQljYy5jb21wb3NlKG5ldyBBZGRDb21tYW5kKGdlcC5nZXRFZGl0aW5nRG9tYWluKCksIG5ldyBFT2JqZWN0QWRhcHRlcihjb250YWluZXIpLAotCQkJCQkgIG5ldyBFT2JqZWN0QWRhcHRlcih2aWV3KSkpOwotCQkJY2MuY29tcG9zZShhZGp1c3RMb2NhdGlvbkNvbW1hbmQoZ2VwLCBjaGFuZ2VSZXF1ZXN0KSk7Ci0JCX0KLQkJcmV0dXJuIGNjLmlzRW1wdHkoKSA/IG51bGwgOiBuZXcgSUNvbW1hbmRQcm94eShjYy5yZWR1Y2UoKSk7Ci0JfQotCQotCQotCXB1YmxpYyBjbGFzcyBSZXBhcmVudGluZ0VsZW1lbnRzQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZHsKLQotCQlwcml2YXRlIGZpbmFsIEVPYmplY3QgbW92ZUVsZW1lbnQ7Ci0JCXByaXZhdGUgSUdyYXBoaWNhbEVkaXRQYXJ0IG9sZFBhcmVudDsKLQkJcHJpdmF0ZSBWaWV3IHZpZXc7Ci0JCQotCQlwdWJsaWMgUmVwYXJlbnRpbmdFbGVtZW50c0NvbW1hbmQoTW92ZVJlcXVlc3QgcmVxLCBFT2JqZWN0IGVsZW1lbnQsIFZpZXcgdmlldywgCi0JCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IG9sZFBhcmVudCkgewotCQkJdGhpcygicmVwYXJlbnQgb24gbW92ZSIsIGVsZW1lbnQsIHJlcSk7Ci0JCQl0aGlzLm9sZFBhcmVudCA9IG9sZFBhcmVudDsKLQkJCXRoaXMudmlldyA9IHZpZXc7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBSZXBhcmVudGluZ0VsZW1lbnRzQ29tbWFuZChTdHJpbmcgbGFiZWwsIEVPYmplY3QgZWxlbWVudFRvRWRpdCwgCi0JCQkJSUVkaXRDb21tYW5kUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQlzdXBlcihsYWJlbCwgZWxlbWVudFRvRWRpdCwgcmVxdWVzdCk7Ci0JCQl0aGlzLm1vdmVFbGVtZW50ID0gZWxlbWVudFRvRWRpdDsgCi0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQlWaWV3IHBhcmVudFZpZXcgPSAoVmlldylnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJCWlmKHBhcmVudFZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCWlmKG1vdmVFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKXsKLQkJCQkJVmlldyBvbGRQYXJlbnRWaWV3ID0gKFZpZXcpb2xkUGFyZW50LmdldE1vZGVsKCk7Ci0JCQkJCSgoQWN0aXZpdHlOb2RlKW1vdmVFbGVtZW50KS5nZXRJblBhcnRpdGlvbnMoKS5yZW1vdmUob2xkUGFyZW50Vmlldy5nZXRFbGVtZW50KCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQkJaWYobW92ZUVsZW1lbnQgIT0gbnVsbCkgcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tbWFuZCBhZGp1c3RMb2NhdGlvbkNvbW1hbmQoSUdyYXBoaWNhbEVkaXRQYXJ0IGNoaWxkLAotCQkJQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIFNoYXBlRWRpdFBhcnQpIHsKLQkJCVBvaW50IGxvY2F0aW9uID0gcmVxdWVzdC5nZXRNb3ZlRGVsdGEoKS5nZXRDb3B5KCk7Ci0JCQlQb2ludCBjaGlsZExvY2F0aW9uID0gY2hpbGQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0TG9jYXRpb24oKTsKLQkJCWxvY2F0aW9uLngrPWNoaWxkTG9jYXRpb24ueDsKLQkJCWxvY2F0aW9uLnkrPWNoaWxkTG9jYXRpb24ueTsKLQkJCUlDb21tYW5kIGJvdW5kc0NvbW1hbmQgPSBuZXcgU2V0Qm91bmRzQ29tbWFuZCgKLQkJCQkJKChTaGFwZUVkaXRQYXJ0KSBjaGlsZCkuZ2V0RWRpdGluZ0RvbWFpbigpLAotCQkJCQlEaWFncmFtVUlNZXNzYWdlcy5TZXRMb2NhdGlvbkNvbW1hbmRfTGFiZWxfUmVzaXplLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigoVmlldykgY2hpbGQuZ2V0TW9kZWwoKSksCi0JCQkJCWxvY2F0aW9uKTsKLQotCQkJcmV0dXJuIGJvdW5kc0NvbW1hbmQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9PcGVuQURFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL09wZW5BREVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkMjg4Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL09wZW5BREVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkRpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLk5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5PcGVuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1FZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBNb3VzZSBkb3VibGUgY2xpY2sgb24gU3RydWN0dXJlZEFjdGl2aXR5RWRpdFBhcnQgc2hvdWxkIG9wZW4gZGlhZ3JhbS4gCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuQURFZGl0UG9saWN5IGV4dGVuZHMgT3BlbkVkaXRQb2xpY3kgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuT3BlbkVkaXRQb2xpY3kjZ2V0T3BlbkNvbW1hbmQob3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0T3BlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0ID0gZ2V0VGFyZ2V0RWRpdFBhcnQocmVxdWVzdCk7Ci0JCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCkgewotCQkJTm9kZSB2aWV3ID0gKE5vZGUpIHRhcmdldEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0KLQkJCURpYWdyYW1FZGl0UGFydCBkaWFncmFtRWRpdFBhcnQgPSBEaWFncmFtQ29yZVV0aWwuZ2V0RGlhZ3JhbUVkaXRQYXJ0KHRhcmdldEVkaXRQYXJ0KTsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBkaWFncmFtRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCURpYWdyYW1BZGFwdGVyIGRpYWdyYW1BZGFwdGVyID0gQnJpZGdlSGVscGVyCi0JCQkJCS5nZXREaWFncmFtQWRhcHRlcihkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSB2aWV3LmdldEVsZW1lbnQoKTsKLQkJCU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIKLQkJCQkJLmdldE5vZGVBZGFwdGVyKGVsZW1lbnQpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gYWRhcHRlci5nZXRXcmFwcGVyKCk7Ci0JCQkJaWYgKHNlbGVjdGVkT2JqZWN0ID09IG51bGwpIHsKLQkJCQkJc2VsZWN0ZWRPYmplY3QgPSBhZGFwdGVyLmdldEVsZW1lbnQoKTsKLQkJCQl9Ci0JCQkJR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChHcmFwaGljYWxWaWV3ZXIpIGRpYWdyYW1FZGl0UGFydAotCQkJCQkJLmdldFZpZXdlcigpOwotCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCQlEaWFncmFtRWRpdERvbWFpbiBkb21haW4gPSAoRGlhZ3JhbUVkaXREb21haW4pIHZpZXdlcgotCQkJCQkJCS5nZXRFZGl0RG9tYWluKCk7Ci0JCQkJCUlXb3JrYmVuY2hQYXJ0IHBhcnQgPSBkb21haW4uZ2V0RGlhZ3JhbUVkaXRvclBhcnQoKTsKLQkJCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0ID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQoCi0JCQkJCQkJCXNlbGVjdGVkT2JqZWN0LAotCQkJCQkJCQlkaWFncmFtQWRhcHRlci5nZXRTdXBwcmVzc2lvbigpLAotCQkJCQkJCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSk7Ci0JCQkJCQl0cnl7Ci0JCQkJCQlEaWFncmFtRWRpdG9yVXRpbAotCQkJCQkJCQkub3BlbkRpYWdyYW1FZGl0b3IoCi0JCQkJCQkJCQkJcGFydC5nZXRTaXRlKCkuZ2V0UGFnZSgpLAotCQkJCQkJCQkJCWlucHV0LAotCQkJCQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQsCi0JCQkJCQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotCQkJCQkJCQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvQWN0aXZpdHlGaW5hbE5vZGVDcmVhdGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9BY3Rpdml0eUZpbmFsTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkwMmMxMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9BY3Rpdml0eUZpbmFsTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RmluYWxOb2RlQ3JlYXRlQ29tbWFuZCBleHRlbmRzIENyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlGaW5hbE5vZGVDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlzdXBlcihyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCS5nZXRDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUNyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhjNmIwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVDcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcmFtZXRlck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVDcmVhdGVDb21tYW5kIGV4dGVuZHMgQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGVDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlzdXBlcihyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCS5nZXRDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCUFjdGl2aXR5UGFyYW1ldGVyTm9kZSBuZXdFbGVtZW50ID0gKEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgc3VwZXIKLQkJCQkuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCWlmIChuZXdFbGVtZW50ICE9IG51bGwKLQkJCQkmJiBVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkgPT0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCVVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsaXplcnMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkKLQkJCQkJLmluaXQobmV3RWxlbWVudCk7Ci0JCX0KLQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbAotCQkJCSYmIFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMiA9PSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJVU1MRWxlbWVudFR5cGVzLkluaXRpYWxpemVycy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMgotCQkJCQkuaW5pdChuZXdFbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gbmV3RWxlbWVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0FjdGl2aXR5UGFydGl0aW9uQ3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MzA5NzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGVDb21tYW5kIGV4dGVuZHMgQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbkNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXN1cGVyKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9Db250cm9sRmxvd0NyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0NvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDVmN2FhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0NvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cm9sRmxvd0NyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgbXlDb250YWluZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBBY3Rpdml0eU5vZGUgbXlTb3VyY2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBBY3Rpdml0eU5vZGUgbXlUYXJnZXQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSwKLQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyLCBBY3Rpdml0eU5vZGUgc291cmNlLAotCQkJQWN0aXZpdHlOb2RlIHRhcmdldCkgewotCQlzdXBlcihyZXEpOwotCQlzdXBlci5zZXRFbGVtZW50VG9FZGl0KGNvbnRhaW5lcik7Ci0JCW15Q29udGFpbmVyID0gY29udGFpbmVyOwotCQlteVNvdXJjZSA9IHNvdXJjZTsKLQkJbXlUYXJnZXQgPSB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGdldENvbnRhaW5lcigpIHsKLQkJcmV0dXJuIG15Q29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRTb3VyY2UoKSB7Ci0JCXJldHVybiBteVNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gbXlUYXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbGVtZW50VG9FZGl0KEVPYmplY3QgZWxlbWVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCkgewotCQlDb250cm9sRmxvdyBuZXdFbGVtZW50ID0gKENvbnRyb2xGbG93KSBzdXBlci5kb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKTsKLQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJbmV3RWxlbWVudC5zZXRUYXJnZXQobXlUYXJnZXQpOwotCQkJbmV3RWxlbWVudC5zZXRTb3VyY2UobXlTb3VyY2UpOwotCQl9Ci0JCXJldHVybiBuZXdFbGVtZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0NvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NzZjMDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5EZWNpc2lvbk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRm9ya05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSm9pbk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuTWVyZ2VOb2RlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHJlb3JpZW50RGlyZWN0aW9uOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgRU9iamVjdCBvbGRFbmQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBFT2JqZWN0IG5ld0VuZDsKLQotCXByaXZhdGUgRWRpdFBhcnQgaG9zdDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQoUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJc3VwZXIocmVxdWVzdC5nZXRMYWJlbCgpLCByZXF1ZXN0LmdldFJlbGF0aW9uc2hpcCgpLCByZXF1ZXN0KTsKLQkJcmVvcmllbnREaXJlY3Rpb24gPSByZXF1ZXN0LmdldERpcmVjdGlvbigpOwotCQlvbGRFbmQgPSByZXF1ZXN0LmdldE9sZFJlbGF0aW9uc2hpcEVuZCgpOwotCQluZXdFbmQgPSByZXF1ZXN0LmdldE5ld1JlbGF0aW9uc2hpcEVuZCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlpZiAoIShnZXRFbGVtZW50VG9FZGl0KCkgaW5zdGFuY2VvZiBDb250cm9sRmxvdykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAocmVvcmllbnREaXJlY3Rpb24gPT0gUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0LlJFT1JJRU5UX1NPVVJDRSkgewotCQkJcmV0dXJuIGNhblJlb3JpZW50U291cmNlKCk7Ci0JCX0KLQkJaWYgKHJlb3JpZW50RGlyZWN0aW9uID09IFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdC5SRU9SSUVOVF9UQVJHRVQpIHsKLQkJCXJldHVybiBjYW5SZW9yaWVudFRhcmdldCgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZW9yaWVudFNvdXJjZSgpIHsKLQkJaWYgKCEob2xkRW5kIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlICYmIG5ld0VuZCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gZ2V0TGluaygpLmdldFRhcmdldCgpOwotLy8JCWlmICghKGdldExpbmsoKS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSkgewotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJfQotLy8JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldExpbmsoKQotLy8JCQkJLmVDb250YWluZXIoKTsKLS8vCQlyZXR1cm4gVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0vLwkJCQkuY2FuRXhpc3RDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgZ2V0TmV3U291cmNlKCksIHRhcmdldCk7Ci0JCWlmKCFjYW5Db25uZWN0KChBY3Rpdml0eU5vZGUpbmV3RW5kLCB0YXJnZXQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKG5ld0VuZCBpbnN0YW5jZW9mIE1lcmdlTm9kZSB8fCBuZXdFbmQgaW5zdGFuY2VvZiBKb2luTm9kZSkgewotCQkJQWN0aXZpdHlOb2RlIGpvaW4gPSAoQWN0aXZpdHlOb2RlKSBuZXdFbmQ7Ci0JCQlMaXN0PEFjdGl2aXR5RWRnZT4gbGlzdCA9IGpvaW4uZ2V0T3V0Z29pbmdzKCk7Ci0JCQlpZiAobGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID49IDEpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuUmVvcmllbnRUYXJnZXQoKSB7Ci0JCWlmICghKG9sZEVuZCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSAmJiBuZXdFbmQgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IGdldExpbmsoKS5nZXRTb3VyY2UoKTsKLS8vCQlpZiAoIShnZXRMaW5rKCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkpIHsKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLS8vCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRMaW5rKCkKLS8vCQkJCS5lQ29udGFpbmVyKCk7Ci0vLwkJcmV0dXJuIFVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotLy8JCQkJLmNhbkV4aXN0Q29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgZ2V0TmV3VGFyZ2V0KCkpOwotCQkKLQkJaWYoIWNhbkNvbm5lY3Qoc291cmNlLCAoQWN0aXZpdHlOb2RlKW5ld0VuZCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAobmV3RW5kIGluc3RhbmNlb2YgRGVjaXNpb25Ob2RlIHx8IG5ld0VuZCBpbnN0YW5jZW9mIEZvcmtOb2RlKSB7Ci0JCQlBY3Rpdml0eU5vZGUgam9pbiA9IChBY3Rpdml0eU5vZGUpIG5ld0VuZDsKLQkJCUxpc3Q8QWN0aXZpdHlFZGdlPiBsaXN0ID0gam9pbi5nZXRJbmNvbWluZ3MoKTsKLQkJCWlmIChsaXN0ICE9IG51bGwgJiYgbGlzdC5zaXplKCkgPj0gMSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlpZiAoIWNhbkV4ZWN1dGUoKSkgewotCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigKLQkJCQkJIkludmFsaWQgYXJndW1lbnRzIGluIHJlb3JpZW50IGxpbmsgY29tbWFuZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHJlb3JpZW50RGlyZWN0aW9uID09IFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdC5SRU9SSUVOVF9TT1VSQ0UpIHsKLQkJCXJldHVybiByZW9yaWVudFNvdXJjZSgpOwotCQl9Ci0JCWlmIChyZW9yaWVudERpcmVjdGlvbiA9PSBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QuUkVPUklFTlRfVEFSR0VUKSB7Ci0JCQlyZXR1cm4gcmVvcmllbnRUYXJnZXQoKTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IHJlb3JpZW50U291cmNlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWdldExpbmsoKS5zZXRTb3VyY2UoZ2V0TmV3U291cmNlKCkpOwotCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoZ2V0TGluaygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgcmVvcmllbnRUYXJnZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJZ2V0TGluaygpLnNldFRhcmdldChnZXROZXdUYXJnZXQoKSk7Ci0JCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChnZXRMaW5rKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbEZsb3cgZ2V0TGluaygpIHsKLQkJcmV0dXJuIChDb250cm9sRmxvdykgZ2V0RWxlbWVudFRvRWRpdCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlOb2RlIGdldE9sZFNvdXJjZSgpIHsKLQkJcmV0dXJuIChBY3Rpdml0eU5vZGUpIG9sZEVuZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5Tm9kZSBnZXROZXdTb3VyY2UoKSB7Ci0JCXJldHVybiAoQWN0aXZpdHlOb2RlKSBuZXdFbmQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eU5vZGUgZ2V0T2xkVGFyZ2V0KCkgewotCQlyZXR1cm4gKEFjdGl2aXR5Tm9kZSkgb2xkRW5kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlOb2RlIGdldE5ld1RhcmdldCgpIHsKLQkJcmV0dXJuIChBY3Rpdml0eU5vZGUpIG5ld0VuZDsKLQl9Ci0JCi0JLyoKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIb3N0KEVkaXRQYXJ0IGhvc3QpewotCQl0aGlzLmhvc3QgPSBob3N0OwotCX0KLQkKLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRIb3N0KCl7Ci0JCXJldHVybiB0aGlzLmhvc3Q7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjYW5Db25uZWN0KEFjdGl2aXR5Tm9kZSBzb3VyY2UsIEFjdGl2aXR5Tm9kZSB0YXJnZXQpewotCQlpZiAoIShnZXRMaW5rKCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYoRGlhZ3JhbUNvcmVWYWxpZGF0aW9uLmlzRHVwbGljYXRlUmVsYXRpb25zaGlwKHNvdXJjZSwgdGFyZ2V0KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYoZ2V0SG9zdCgpICE9IG51bGwpewotCQkJaWYgKERpYWdyYW1Db3JlVmFsaWRhdGlvbi5jYW5Db25uZWN0KChFZGl0UGFydCkgZ2V0SG9zdCgpLCBzb3VyY2UsIAotCQkJCQl0YXJnZXQpICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0RlY2lzaW9uTm9kZUNyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0RlY2lzaW9uTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ3MjA2ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9EZWNpc2lvbk5vZGVDcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVjaXNpb25Ob2RlQ3JlYXRlQ29tbWFuZCBleHRlbmRzIENyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVjaXNpb25Ob2RlQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJc3VwZXIocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9Gb3JrTm9kZUNyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0ZvcmtOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTg2MWEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0ZvcmtOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZvcmtOb2RlQ3JlYXRlQ29tbWFuZCBleHRlbmRzIENyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRm9ya05vZGVDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlzdXBlcihyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCS5nZXRDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0luaXRpYWxOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvSW5pdGlhbE5vZGVDcmVhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MzQyYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvSW5pdGlhbE5vZGVDcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5pdGlhbE5vZGVDcmVhdGVDb21tYW5kIGV4dGVuZHMgQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbml0aWFsTm9kZUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXN1cGVyKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJLmdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvSm9pbk5vZGVDcmVhdGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9Kb2luTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VhYjY5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9Kb2luTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luTm9kZUNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEpvaW5Ob2RlQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJc3VwZXIocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9NZXJnZU5vZGVDcmVhdGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9NZXJnZU5vZGVDcmVhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiOTg4ZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvTWVyZ2VOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lcmdlTm9kZUNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1lcmdlTm9kZUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXN1cGVyKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJLmdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVDcmVhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MWYyMDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ3JlYXRlQ29tbWFuZCBleHRlbmRzIENyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXN1cGVyKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJLmdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBuZXdFbGVtZW50ID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIHN1cGVyCi0JCQkJLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQlpZiAobmV3RWxlbWVudCAhPSBudWxsCi0JCQkJJiYgVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSA9PSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJVU1MRWxlbWVudFR5cGVzLkluaXRpYWxpemVycy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEKLQkJCQkJLmluaXQobmV3RWxlbWVudCk7Ci0JCX0KLQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbAotCQkJCSYmIFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAgPT0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCVVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsaXplcnMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwCi0JCQkJCS5pbml0KG5ld0VsZW1lbnQpOwotCQl9Ci0JCWlmIChuZXdFbGVtZW50ICE9IG51bGwKLQkJCQkmJiBVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3ID09ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlVTUxFbGVtZW50VHlwZXMuSW5pdGlhbGl6ZXJzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNwotCQkJCQkuaW5pdChuZXdFbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gbmV3RWxlbWVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL1VNTFJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9VTUxSZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDdjY2NkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL1VNTFJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQgZXh0ZW5kcwotCQlBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElBZGFwdGFibGUgZWRnZUFkYXB0b3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVNTFJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kKAotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGVkaXRpbmdEb21haW4sIGxhYmVsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWZmZWN0ZWRGaWxlcygpIHsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGVkZ2VBZGFwdG9yLmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7Ci0JCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRXb3Jrc3BhY2VGaWxlcyh2aWV3KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRGaWxlcygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUFkYXB0YWJsZSBnZXRFZGdlQWRhcHRvcigpIHsKLQkJcmV0dXJuIGVkZ2VBZGFwdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGdlQWRhcHRvcihJQWRhcHRhYmxlIGVkZ2VBZGFwdG9yKSB7Ci0JCXRoaXMuZWRnZUFkYXB0b3IgPSBlZGdlQWRhcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdCgKLQkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHsKLQkJYXNzZXJ0IG51bGwgIT0gZWRnZUFkYXB0b3IgOiAiTnVsbCBjaGlsZCBpbiBVTUxSZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCI7IC8vJE5PTi1OTFMtMSQKLQkJRWRnZSBlZGdlID0gKEVkZ2UpIGdldEVkZ2VBZGFwdG9yKCkuZ2V0QWRhcHRlcihFZGdlLmNsYXNzKTsKLQkJYXNzZXJ0IG51bGwgIT0gZWRnZSA6ICJOdWxsIGVkZ2UgaW4gVU1MUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQiOyAvLyROT04tTkxTLTEkCi0KLQkJVmlldyB0ZW1wVmlldyA9IGVkZ2UuZ2V0U291cmNlKCk7Ci0JCWVkZ2Uuc2V0U291cmNlKGVkZ2UuZ2V0VGFyZ2V0KCkpOwotCQllZGdlLnNldFRhcmdldCh0ZW1wVmlldyk7Ci0KLQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZjE1NTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUVkaXRIZWxwZXIgZXh0ZW5kcyBVTUxCYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eUZpbmFsTm9kZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlGaW5hbE5vZGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMmQ3MjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eUZpbmFsTm9kZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpbmFsTm9kZUVkaXRIZWxwZXIgZXh0ZW5kcyBVTUxCYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJiYmFjZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlckFkdmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyQWR2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YWUzM2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyQWR2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVkaXRoZWxwZXIuQWJzdHJhY3RFZGl0SGVscGVyQWR2aWNlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXJBZHZpY2UgZXh0ZW5kcwotCQlBYnN0cmFjdEVkaXRIZWxwZXJBZHZpY2UgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTdkYWFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLlBhY2thZ2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuTW92ZUVsZW1lbnRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLk1vdmVSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlciBleHRlbmRzIFVNTEJhc2VFZGl0SGVscGVyIHsKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0TW92ZUNvbW1hbmQoTW92ZVJlcXVlc3QgcmVxKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJLy8JCXJldHVybiBzdXBlci5nZXRNb3ZlQ29tbWFuZChyZXEpOwotCQlNb3ZlRWxlbWVudHNDb21tYW5kIGNtZCA9IG5ldyBNb3ZlRWxlbWVudHNDb21tYW5kKHJlcSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJCS8vcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9IGdldFRhcmdldENvbnRhaW5lcigpOwotCi0JCQkJaWYgKGNvbnRhaW5lciA9PSBudWxsIHx8IGdldEVsZW1lbnRzVG9Nb3ZlKCkgPT0gbnVsbAotCQkJCQkJfHwgZ2V0RWxlbWVudHNUb01vdmUoKS5pc0VtcHR5KCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCWZvciAoSXRlcmF0b3IgaSA9IGdldEVsZW1lbnRzVG9Nb3ZlKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaQotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGkubmV4dCgpOwotCQkJCQlFUmVmZXJlbmNlIGZlYXR1cmUgPSBnZXRUYXJnZXRGZWF0dXJlKGVsZW1lbnQpOwotCi0JCQkJCWlmIChmZWF0dXJlID09IG51bGwKLQkJCQkJCQl8fCAhY29udGFpbmVyLmVDbGFzcygpLmdldEVBbGxSZWZlcmVuY2VzKCkKLQkJCQkJCQkJCS5jb250YWlucyhmZWF0dXJlKSkgewotCQkJCQkJLy8gSWYgdGhlIHRhcmdldCBmZWF0dXJlIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIHRhcmdldCBjb250YWluZXIsCi0JCQkJCQkvLyBkb24ndCBhbGxvdyB0aGUgbW92ZS4KLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCi0JCQkJCS8vIElGIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgaW4gdGhlIHRhcmdldCBjb250YWluZXIuLi4KLQkJCQkJaWYgKGNvbnRhaW5lci5lcXVhbHMoZWxlbWVudC5lQ29udGFpbmVyKCkpCi0JCQkJCQkJJiYgZmVhdHVyZSA9PSBlbGVtZW50LmVDb250YWlubWVudEZlYXR1cmUoKSkgewotCQkJCQkJLy8gRG9uJ3QgYWxsb3cgdGhlIHJlcGFyZW50aW5nCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQotCQkJCQkvLyBJRiB0aGUgZWxlbWVudCBpcyB0aGUgcGFyZW50IG9mIHRoZSB0YXJnZXQgY29udGFpbmVyLi4uCi0JCQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3RvcihlbGVtZW50LCBnZXRUYXJnZXRDb250YWluZXIoKSkpIHsKLQkJCQkJCS8vIERvbid0IGFsbG93IHRoZSByZXBhcmVudGluZwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkJLy8gSUYgdGhlIGNvbnRhaW5lciBjYW4gbm90IGNvbnRhaW4gdGhlIGVsZW1lbnQuLi4KLQkJCQkJLy8JCQkJCWlmICghUGFja2FnZVV0aWwuY2FuQ29udGFpbihnZXRUYXJnZXRDb250YWluZXIoKS5lQ2xhc3MoKSwKLQkJCQkJLy8JCQkJCQkJZmVhdHVyZSwgZWxlbWVudC5lQ2xhc3MoKSwgZmFsc2UpKSB7Ci0JCQkJCS8vCQkJCQkJLy8gRG9uJ3QgYWxsb3cgdGhlIHJlcGFyZW50aW5nCi0JCQkJCS8vCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkvLwkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCX07Ci0JCXJldHVybiBjbWQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyQWR2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlckFkdmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzFlYjJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyQWR2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVkaXRoZWxwZXIuQWJzdHJhY3RFZGl0SGVscGVyQWR2aWNlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlckFkdmljZSBleHRlbmRzIEFic3RyYWN0RWRpdEhlbHBlckFkdmljZSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9Db250cm9sRmxvd0VkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQ29udHJvbEZsb3dFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNzNkYzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9Db250cm9sRmxvd0VkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cm9sRmxvd0VkaXRIZWxwZXIgZXh0ZW5kcyBVTUxCYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9EZWNpc2lvbk5vZGVFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0RlY2lzaW9uTm9kZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhjYzMzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0RlY2lzaW9uTm9kZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVFZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvRm9ya05vZGVFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0ZvcmtOb2RlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTUyNzA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvRm9ya05vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRm9ya05vZGVFZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvSW5pdGlhbE5vZGVFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0luaXRpYWxOb2RlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmRjOTA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvSW5pdGlhbE5vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5pdGlhbE5vZGVFZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvSm9pbk5vZGVFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0pvaW5Ob2RlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2U3NWJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvSm9pbk5vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSm9pbk5vZGVFZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvTWVyZ2VOb2RlRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9NZXJnZU5vZGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MjhhMmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9NZXJnZU5vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVyZ2VOb2RlRWRpdEhlbHBlciBleHRlbmRzIFVNTEJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdEhlbHBlckFkdmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRIZWxwZXJBZHZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ1OGNhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdEhlbHBlckFkdmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5lZGl0aGVscGVyLkFic3RyYWN0RWRpdEhlbHBlckFkdmljZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRIZWxwZXJBZHZpY2UgZXh0ZW5kcwotCQlBYnN0cmFjdEVkaXRIZWxwZXJBZHZpY2UgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU2NTEyMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRIZWxwZXIgZXh0ZW5kcyBVTUxCYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlckFkdmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlckFkdmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTJhMDk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRIZWxwZXJBZHZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZWRpdGhlbHBlci5BYnN0cmFjdEVkaXRIZWxwZXJBZHZpY2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRIZWxwZXJBZHZpY2UgZXh0ZW5kcwotCQlBYnN0cmFjdEVkaXRIZWxwZXJBZHZpY2UgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvVU1MQmFzZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvVU1MQmFzZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA5NjA4Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL1VNTEJhc2VFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbXBvc2l0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVkaXRoZWxwZXIuQWJzdHJhY3RFZGl0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveVJlZmVyZW5jZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5JRWRpdENvbW1hbmRSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTEJhc2VFZGl0SGVscGVyIGV4dGVuZHMgQWJzdHJhY3RFZGl0SGVscGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX1BPTElDWV9DT01NQU5EID0gImVkaXQgcG9saWN5IGNvbW1hbmQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldEluc3RlYWRDb21tYW5kKElFZGl0Q29tbWFuZFJlcXVlc3QgcmVxKSB7Ci0JCUlDb21tYW5kIGVwQ29tbWFuZCA9IChJQ29tbWFuZCkgcmVxLmdldFBhcmFtZXRlcihFRElUX1BPTElDWV9DT01NQU5EKTsKLQkJcmVxLnNldFBhcmFtZXRlcihFRElUX1BPTElDWV9DT01NQU5ELCBudWxsKTsKLQkJSUNvbW1hbmQgZWhDb21tYW5kID0gc3VwZXIuZ2V0SW5zdGVhZENvbW1hbmQocmVxKTsKLQkJaWYgKGVwQ29tbWFuZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZWhDb21tYW5kOwotCQl9Ci0JCWlmIChlaENvbW1hbmQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGVwQ29tbWFuZDsKLQkJfQotCQlDb21wb3NpdGVDb21tYW5kIGNvbW1hbmQgPSBuZXcgQ29tcG9zaXRlQ29tbWFuZChudWxsKTsKLQkJY29tbWFuZC5hZGQoZXBDb21tYW5kKTsKLQkJY29tbWFuZC5hZGQoZWhDb21tYW5kKTsKLQkJcmV0dXJuIGNvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0RGVzdHJveVJlZmVyZW5jZUNvbW1hbmQoRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExODIzOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20ucG9saWNpZXMuQWN0aXZpdHlDcmVhdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzLkFjdGl2aXR5WFlMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuQWN0aXZpdHlDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuQWN0aXZpdHlJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC51dGlsLkRpYWdyYW1FZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db25uZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlFZGl0UGFydCBleHRlbmRzIERpYWdyYW1FZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUxfSUQgPSAiQUQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0KLQkJLy8JCSBtb2RpZmllZCBTVEFSVAotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVhZTGF5b3V0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koCi0JCQkJRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5Q3JlYXRpb25FZGl0UG9saWN5KCkpOwotCQkvLyBtb2RpZmllZCBFTkQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5WSUVXX19WSVNJQkxFLmVxdWFscyhldmVudC5nZXRGZWF0dXJlKCkpKSB7Ci0JCQlPYmplY3Qgbm90aWZpZXIgPSBldmVudC5nZXROb3RpZmllcigpOwotCQkJaWYgKG5vdGlmaWVyID09IGdldE1vZGVsKCkpCi0JCQkJcmVmcmVzaFZpc2liaWxpdHkoKTsKLQkJCWVsc2UgaWYgKGV2ZW50LmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJcmVmcmVzaENoaWxkcmVuKCk7Ci0JCQkJRGlhZ3JhbUVkaXRvclV0aWwucmVmcmVzaENvbm5lY3Rpb25FZGl0UGFydHModGhpcyk7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEdNRiBhbmQgR0VGIGlzIG5vdCBoYW5kbGluZyBjb25uZWN0aW9ucyB2aXNpYmlsaXR5IHByb3Blcmx5LiAKLQkgKiBUaGlzIGlzIHdvcmstYXJvdW5kIHNvbHV0aW9uIHRvIGhhbmRsZSBjb25uZWN0aW9ucyB2aXNpYmlsaXR5LiAgCi0JICogVmlzaWJpbGl0eSBvZiBlZGdlcyBuZWVkIHRvIHNldCBmaXJzdCBhbmQgdGhlbiBub2Rlcy4gCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hDb25uZWN0aW9ucygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlEaWFncmFtIGFjdCA9IChEaWFncmFtKSBnZXRNb2RlbCgpOwotCQlMaXN0IGVkZ2VzID0gYWN0LmdldEVkZ2VzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVkZ2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRWRnZSBlZGdlID0gKEVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVkZ2UuaXNWaXNpYmxlKCkpIHsKLQkJCQlDb25uZWN0aW9uRWRpdFBhcnQgcGFydCA9IGNyZWF0ZU9yRmluZENvbm5lY3Rpb24oZWRnZSk7Ci0JCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCQlpZiAocGFydC5nZXRTb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyMQotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCUVkaXRQYXJ0IGVsZW1lbnQgPSAoRWRpdFBhcnQpIGl0ZXIxLm5leHQoKTsKLQkJCQkJCQlPYmplY3QgbW9kZWwgPSBlbGVtZW50LmdldE1vZGVsKCk7Ci0JCQkJCQkJaWYgKGVkZ2UuZ2V0U291cmNlKCkgPT0gbW9kZWwpIHsKLQkJCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCQkJCQkJaWYgKCgoR3JhcGhpY2FsRWRpdFBhcnQpIGVsZW1lbnQpCi0JCQkJCQkJCQkJCS5nZXRGaWd1cmUoKS5pc1Zpc2libGUoKSkgewotCQkJCQkJCQkJCXBhcnQuc2V0U291cmNlKGVsZW1lbnQpOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlwYXJ0LnNldFNvdXJjZShudWxsKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAocGFydC5nZXRUYXJnZXQoKSA9PSBudWxsKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyMQotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCUVkaXRQYXJ0IGVsZW1lbnQgPSAoRWRpdFBhcnQpIGl0ZXIxLm5leHQoKTsKLQkJCQkJCQlPYmplY3QgbW9kZWwgPSBlbGVtZW50LmdldE1vZGVsKCk7Ci0JCQkJCQkJaWYgKGVkZ2UuZ2V0VGFyZ2V0KCkgPT0gbW9kZWwpIHsKLQkJCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCQkJCQkJaWYgKCgoR3JhcGhpY2FsRWRpdFBhcnQpIGVsZW1lbnQpCi0JCQkJCQkJCQkJCS5nZXRGaWd1cmUoKS5pc1Zpc2libGUoKSkgewotCQkJCQkJCQkJCXBhcnQuc2V0VGFyZ2V0KGVsZW1lbnQpOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlwYXJ0LnNldFRhcmdldChudWxsKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXRyeSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlZGdlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFZGdlIGVkZ2UgPSAoRWRnZSkgaXRlci5uZXh0KCk7Ci0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29ubmVjdGlvbkVkaXRQYXJ0IHBhcnQgPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29ubmVjdGlvbkVkaXRQYXJ0KSBjcmVhdGVPckZpbmRDb25uZWN0aW9uKGVkZ2UpOwotCQkJCWlmICgocGFydC5nZXRTb3VyY2UoKSA9PSBudWxsIHx8IHBhcnQuZ2V0VGFyZ2V0KCkgPT0gbnVsbCkKLQkJCQkJCSYmIHBhcnQuZ2V0RmlndXJlKCkgIT0gbnVsbCkgewotCQkJCQlwYXJ0LmdldEZpZ3VyZSgpLnNldFZpc2libGUoZmFsc2UpOwotCQkJCQlwYXJ0LmdldEZpZ3VyZSgpLnJldmFsaWRhdGUoKTsKLQkJCQkJcGFydC5kZWFjdGl2YXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCkpIHsKLQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJCSJFcnJvciBvY2N1cmVkIHdoaWxlIHJlZnJlc2ggdGhlIGNvbm5lY3Rpb246ICIgKyBlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBNb3ZlcyBjb21wbGV0ZSBkaWFncmFtIGNoaWxkcmVuIHRvIGdpdmVuIGRlbHRhLiAKLQkgKiBAcGFyYW0gaW50ICAoWC1heGlzIGRlbHRhKQotCSAqIEBwYXJhbSBpbnQgIChZLWF4aXMgZGVsdGEpCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgbW92ZUZpZ3VyZShpbnQgbW92ZVgsIGludCBtb3ZlWSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQ7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJUmVjdGFuZ2xlIHIgPSBuZXcgUmVjdGFuZ2xlKG5ldyBQb2ludChib3VuZHMueCArIG1vdmVYLAotCQkJCQkJYm91bmRzLnkgKyBtb3ZlWSksIGJvdW5kcy5nZXRTaXplKCkpOwotCi0JCQkJLy8gYWxzbyBuZWVkIHRvIG1vdmUgdGhlIGJlbmQgcG9pbnRzCi0vLwkJCQlMaXN0IGxpc3QgPSBwYXJ0LmdldFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0vLwkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotLy8JCQkJCUNvbnRyb2xGbG93RWRpdFBhcnQgbGlua3BhcnQgPSAoQ29udHJvbEZsb3dFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0vLwkJCQkJTGluayBsaW5rID0gKExpbmspIGxpbmtwYXJ0LmdldE1vZGVsKCk7Ci0vLwkJCQkJaWYgKGxpbmsuZ2V0QmVuZHBvaW50cygpLnNpemUoKSA+IDApIHsKLS8vCQkJCQkJUG9pbnRMaXN0IHBsaXN0ID0gKChQb2x5bGluZUNvbm5lY3Rpb24pIGxpbmtwYXJ0Ci0vLwkJCQkJCQkJLmdldEZpZ3VyZSgpKS5nZXRQb2ludHMoKTsKLS8vCQkJCQkJTGlzdCBwb2ludHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgcGxpc3Quc2l6ZSgpIC0gMTsgaSsrKSB7Ci0vLwkJCQkJCQlQb2ludCBwID0gcGxpc3QuZ2V0UG9pbnQoaSk7Ci0vLwkJCQkJCQlwID0gcC50cmFuc2xhdGUobmV3IFBvaW50KG1vdmVYLCBtb3ZlWSkpOwotLy8KLS8vCQkJCQkJCW9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludCBicCA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQoCi0vLwkJCQkJCQkJCXApOwotLy8JCQkJCQkJcG9pbnRzLmFkZChicCk7Ci0vLwkJCQkJCX0KLS8vCi0vLwkJCQkJCWxpbmtwYXJ0LmdldENvbm5lY3Rpb25GaWd1cmUoKS5zZXRSb3V0aW5nQ29uc3RyYWludCgKLS8vCQkJCQkJCQlwb2ludHMpOwotLy8JCQkJCX0KLS8vCQkJCX0KLQotCQkJCXRoaXMuc2V0TGF5b3V0Q29uc3RyYWludChwYXJ0LCBwYXJ0LmdldEZpZ3VyZSgpLCByKTsKLQotCQkJfSBlbHNlIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlBhcnQgbm90IG1vdmVkOiAiICsgY2hpbGQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4MTBiYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eUZpbmFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eUZpbmFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuQWN0aXZpdHlGaW5hbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkxheWVyTWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRmlsbFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxpbmVTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0KLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlGaW5hbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJQm9yZGVySXRlbUVkaXRQYXJ0KSB7Ci0JCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJRW5kTm9kZUZpZ3VyZSBmaWd1cmUgPSBuZXcgRW5kTm9kZUZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRW5kTm9kZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoRW5kTm9kZUZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRCb3JkZXJJdGVtKElGaWd1cmUgYm9yZGVySXRlbUNvbnRhaW5lciwKLQkJCUlCb3JkZXJJdGVtRWRpdFBhcnQgYm9yZGVySXRlbUVkaXRQYXJ0KSB7Ci0JCWlmIChib3JkZXJJdGVtRWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydCkgewotCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksCi0JCQkJCVBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsKLQkJCWxvY2F0b3Iuc2V0Qm9yZGVySXRlbU9mZnNldChuZXcgRGltZW5zaW9uKC0yMCwgLTIwKSk7Ci0JCQlib3JkZXJJdGVtQ29udGFpbmVyLmFkZChib3JkZXJJdGVtRWRpdFBhcnQuZ2V0RmlndXJlKCksIGxvY2F0b3IpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkQm9yZGVySXRlbShib3JkZXJJdGVtQ29udGFpbmVyLCBib3JkZXJJdGVtRWRpdFBhcnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkuRFB0b0xQKDI0KSwgZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCgyNCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShBY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIEVuZE5vZGVGaWd1cmUgZXh0ZW5kcwotCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXMuRW5kTm9kZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHVibGljIEVuZE5vZGVGaWd1cmUoKSB7Ci0KLQkJCUxpbmVTdHlsZSBsaW5lc3R5bGUgPSAoTGluZVN0eWxlKSBnZXRQcmltYXJ5VmlldygpLmdldFN0eWxlKAotCQkJCQlOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTElORV9TVFlMRSk7Ci0JCQlpZiAobGluZXN0eWxlICE9IG51bGwKLQkJCQkJJiYgbGluZXN0eWxlLmdldExpbmVDb2xvcigpICE9IERpYWdyYW1Db25zdGFudHMuTElORV9DT0xPUl9FREVGQVVMVCkgewotCQkJCXRoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDb2xvcihuZXcgSW50ZWdlcihsaW5lc3R5bGUuZ2V0TGluZUNvbG9yKCkpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMKLQkJCQkJCS5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmRhcmtCbHVlKTsKLQkJCX0KLQotCQkJRmlsbFN0eWxlIHN0eWxlID0gKEZpbGxTdHlsZSkgZ2V0UHJpbWFyeVZpZXcoKS5nZXRTdHlsZSgKLQkJCQkJTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZJTExfU1RZTEUpOwotCQkJaWYgKHN0eWxlICE9IG51bGwKLQkJCQkJJiYgc3R5bGUuZ2V0RmlsbENvbG9yKCkgIT0gRGlhZ3JhbUNvbnN0YW50cy5GSUxMX0NPTE9SX0VERUZBVUxUKSB7Ci0JCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldENvbG9yKG5ldyBJbnRlZ2VyKHN0eWxlLmdldEZpbGxDb2xvcigpKSkpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihFTkROT0RFRklHVVJFX0JBQ0sKLQotCQkJCSk7Ci0JCQl9Ci0JCQl0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgyNCksIGdldE1hcE1vZGUoKS5EUHRvTFAoCi0JCQkJCTI0KSk7Ci0JCQl0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgyNCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMjQpKTsKLQotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgRU5ETk9ERUZJR1VSRV9CQUNLID0gbmV3IENvbG9yKG51bGwsIDQ1LCA4NSwgMTMwKTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlPYmplY3QgZmVhdHVyZSA9IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoQm91bmRzKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRCYWNrZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCQlnZXRQcmltYXJ5U2hhcGUoKS5zZXRCYWNrZ3JvdW5kQ29sb3IoCi0JCQkJCURpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9yZWdyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQkJZ2V0UHJpbWFyeVNoYXBlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKAotCQkJCQlEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpLmlzSW5zdGFuY2UoCi0JCQkJbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpKQotCQkJcmVmcmVzaEZvbnQoKTsKLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFZpZXdfRWxlbWVudCgpCi0JCQkJJiYgKChFT2JqZWN0KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkgPT0gZ2V0Tm90YXRpb25WaWV3KCkpCi0JCQloYW5kbGVNYWpvclNlbWFudGljQ2hhbmdlKCk7Ci0JCWVsc2UKLQkJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MzY3NzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuSUJvcmRlckl0ZW1Mb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQgZXh0ZW5kcyBMYWJlbEVkaXRQYXJ0IGltcGxlbWVudHMKLQkJSVRleHRBd2FyZUVkaXRQYXJ0LCBJQm9yZGVySXRlbUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlzdGF0aWMgewotCQlyZWdpc3RlclNuYXBCYWNrUG9zaXRpb24oVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksIG5ldyBQb2ludCgwLAotCQkJCTApKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElCb3JkZXJJdGVtTG9jYXRvciBnZXRCb3JkZXJJdGVtTG9jYXRvcigpIHsKLQkJSUZpZ3VyZSBwYXJlbnRGaWd1cmUgPSBnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKTsKLQkJaWYgKHBhcmVudEZpZ3VyZSAhPSBudWxsICYmIHBhcmVudEZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCkgIT0gbnVsbCkgewotCQkJT2JqZWN0IGNvbnN0cmFpbnQgPSBwYXJlbnRGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpLmdldENvbnN0cmFpbnQoCi0JCQkJCWdldEZpZ3VyZSgpKTsKLQkJCXJldHVybiAoSUJvcmRlckl0ZW1Mb2NhdG9yKSBjb25zdHJhaW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoQm91bmRzKCkgewotCQlpbnQgeCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7Ci0JCWludCB5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsKLQkJaW50IHdpZHRoID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IGhlaWdodCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOwotCQlnZXRCb3JkZXJJdGVtTG9jYXRvcigpCi0JCQkJLnNldENvbnN0cmFpbnQobmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlGaW5hbE5vZGVfMTAwMTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0RGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIFVNTEVkaXRQYXJ0RmFjdG9yeQotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKHN0eWxlKTsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUlGaWd1cmUgbGFiZWwgPSBjcmVhdGVGaWd1cmVQcmltKCk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGxhYmVsKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmVQcmltKCkgewotCQlyZXR1cm4gbmV3IFdyYXBMYWJlbCgpOwotCX0KLQotCS8qKgotCSAqIFRPRE86IERpc2FibGVzIGRpcmVjdCBlZGl0IGZvciBub3cgdW50aWwgdGhlIGlzc3VlIHdpdGggZHVwbGljYXRlIGxhYmVscyBpcyBmaXhlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVQgIT0gcmVxdWVzdC5nZXRUeXBlKCkpIHsKLSAgICAgICAgCXN1cGVyLnBlcmZvcm1SZXF1ZXN0KHJlcXVlc3QpOwotICAgICAgICB9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTJjY2U1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcmFtZXRlck5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5maWd1cmVzLldpZGVuZWRXcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAxMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0KLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCUFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSBmaWd1cmUgPSBuZXcgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0KSB7Ci0JCQkoKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpCi0JCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQotCQkJCQkJCS5nZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lRm9yKGVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSBleHRlbmRzIFJlY3RhbmdsZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsKLQkJCXRoaXMuc2V0T3BhcXVlKGZhbHNlKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgV2lkZW5lZFdyYXBMYWJlbCgpOwotCi0JCQlEaWFncmFtQ29yZVV0aWwuc2V0TGFiZWxQcm9wZXJ0aWVzKGZpZ18wKTsKLQkJCXNldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbChmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFdyYXBMYWJlbCBnZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoKSB7Ci0JCQlyZXR1cm4gZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKFdyYXBMYWJlbCBmaWcpIHsKLQkJCWZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQkJaWYgKGlzT3BhcXVlKCkpCi0JCQkJc3VwZXIucGFpbnRGaWd1cmUoZ3JhcGhpY3MpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwZTZiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuZmlndXJlcy5XaWRlbmVkV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAwOTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcmFtZXRlck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUgZmlndXJlID0gbmV3IEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0KSB7Ci0JCQkoKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkKLQkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpCi0JCQkJCQkJLmdldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCgpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDQwKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7Ci0JCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgewotCi0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZUZvcihlZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXB1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0T3V0bGluZShmYWxzZSk7Ci0JCQl0aGlzLnNldE9wYXF1ZShmYWxzZSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IFdpZGVuZWRXcmFwTGFiZWwoKTsKLQotCQkJRGlhZ3JhbUNvcmVVdGlsLnNldExhYmVsUHJvcGVydGllcyhmaWdfMCk7Ci0JCQlzZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoZmlnXzApOwotCi0JCQlPYmplY3QgbGF5RGF0YTAgPSBudWxsOwotCi0JCQl0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgV3JhcExhYmVsIGZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWw7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXcmFwTGFiZWwgZ2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKCkgewotCQkJcmV0dXJuIGZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbChXcmFwTGFiZWwgZmlnKSB7Ci0JCQlmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJCWlmIChpc09wYXF1ZSgpKQotCQkJCXN1cGVyLnBhaW50RmlndXJlKGdyYXBoaWNzKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWU5NzMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5WYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQKLQkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMTE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwTGFiZWwgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJcmV0dXJuIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJkaWFncmFtL21pbGVzdG9uZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJaWYgKERpYWdyYW1Db3JlVXRpbC5pc1JlYWRPbmx5KHRoaXMpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0RWRpdFRleHQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMjsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLAotCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwKLQkJCQkJVU1MRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkgewotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCQkJCSgoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkKLQkJCQkJCQkucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQkJcmV0dXJuIERpYWdyYW1Db3JlVXRpbC52YWxpZFN0cmluZ0ZvckJyZWFrZG93bkVsZW1lbnRzKAotCQkJCQkJCWdldEVkaXRQYXJ0KCksIHR4dCk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCUNvbG9yIGMgPSBEaWFncmFtQ29yZVV0aWwuZ2V0Rm9udENvbG9yKHRoaXMpOwotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQljb2xvciA9IGM7Ci0JCX0KLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDcxNWVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLlZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0Ci0JCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDA4OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwTGFiZWwgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJcmV0dXJuIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJkaWFncmFtL3Rhc2tkZXNjcmlwdG9yLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlpZiAoRGlhZ3JhbUNvcmVVdGlsLmlzUmVhZE9ubHkodGhpcykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5OwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBWYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsCi0JCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLAotCQkJCQlVTUxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSB7Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJCQkJKChBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCkpCi0JCQkJCQkJLnBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCQkJCXJldHVybiBEaWFncmFtQ29yZVV0aWwudmFsaWRTdHJpbmdGb3JCcmVha2Rvd25FbGVtZW50cygKLQkJCQkJCQlnZXRFZGl0UGFydCgpLCB0eHQpOwotCQkJCX0KLQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoc3R5bGUpOwotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlDb2xvciBjID0gRGlhZ3JhbUNvcmVVdGlsLmdldEZvbnRDb2xvcih0aGlzKTsKLQkJaWYgKGMgIT0gbnVsbCkgewotCQkJY29sb3IgPSBjOwotCQl9Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhOTlhYTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvbjJDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb24yR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvbjJJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZVNoYXBlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5YWUxheW91dEVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAyMDAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCi0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCVhZTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgWFlMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IHN1cGVyLmNyZWF0ZUNoaWxkRWRpdFBvbGljeShjaGlsZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBuZXcgUmVzaXphYmxlU2hhcGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUgZmlndXJlID0gbmV3IEFjdGl2aXR5UGFydGl0aW9uRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQpIHsKLQkJCSgoQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpCi0JCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKS5nZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZSgpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDQwKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBGcmVlZm9ybUxheW91dCgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0Q29uc3RyYWludChJRmlndXJlIGZpZ3VyZSkgewotCQkJCQlPYmplY3QgcmVzdWx0ID0gY29uc3RyYWludHMuZ2V0KGZpZ3VyZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQkJcmVzdWx0ID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAtMSwgLTEpOwotCQkJCQl9Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lRm9yKGVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlKCkgewotCi0JCQlYWUxheW91dCBteUdlbkxheW91dE1hbmFnZXIgPSBuZXcgWFlMYXlvdXQoKTsKLQotCQkJdGhpcy5zZXRMYXlvdXRNYW5hZ2VyKG15R2VuTGF5b3V0TWFuYWdlcik7Ci0KLQkJCXRoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrCi0KLQkJCSk7Ci0JCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihBQ1RJVklUWVBBUlRJVElPTkZJR1VSRV9CQUNLCi0KLQkJCSk7Ci0JCQl0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgzMDApLCBnZXRNYXBNb2RlKCkKLQkJCQkJLkRQdG9MUCg2MDApKTsKLQkJCXRoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDMwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNjAwKSk7Ci0JCQl0aGlzLnNldEJvcmRlcihuZXcgTGluZUJvcmRlcigpKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJV3JhcExhYmVsIGZpZ18wID0gbmV3IFdyYXBMYWJlbCgpOwotCi0JCQlzZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZShmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgZlBhcnRpdGlvbkxhYmVsRmlndXJlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKCkgewotCQkJcmV0dXJuIGZQYXJ0aXRpb25MYWJlbEZpZ3VyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoV3JhcExhYmVsIGZpZykgewotCQkJZlBhcnRpdGlvbkxhYmVsRmlndXJlID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIEFDVElWSVRZUEFSVElUSU9ORklHVVJFX0JBQ0sgPSBuZXcgQ29sb3IobnVsbCwKLQkJCTI1NSwgMjU1LCAyNTUpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZmNjOTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuWFlMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uQ3JlYXRpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvbkRlbGVnYXRpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvbkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvbkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvbkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb25JdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVTaGFwZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuWFlMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRmlsbFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxpbmVTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDA4OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJLy8JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJLy8JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkvLwkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb25JdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQkvLwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5HUkFQSElDQUxfTk9ERV9ST0xFLAotCQkvLwkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb25HcmFwaGljYWxOb2RlRWRpdFBvbGljeSgpKTsKLQkJLy8JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJLy8JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQkJLy8JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvbkNyZWF0aW9uRWRpdFBvbGljeSgpKTsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlyZW1vdmVFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUpOwotCQlpbnN0YWxsRWRpdFBvbGljeSgKLQkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb25HcmFwaGljYWxOb2RlRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvbkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uTGF5b3V0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koCi0JCQkJRWRpdFBvbGljeS5DT05UQUlORVJfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb25EZWxlZ2F0aW9uRWRpdFBvbGljeSgKLQkJCQkJCVVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJCQlFZGl0UG9saWN5LkNPTlRBSU5FUl9ST0xFKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCVhZTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgWFlMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IHN1cGVyLmNyZWF0ZUNoaWxkRWRpdFBvbGljeShjaGlsZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBuZXcgUmVzaXphYmxlU2hhcGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUgZmlndXJlID0gbmV3IEFjdGl2aXR5UGFydGl0aW9uRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0KSB7Ci0JCQkoKEFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkKLQkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpLmdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobmV3IEZyZWVmb3JtTGF5b3V0KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRDb25zdHJhaW50KElGaWd1cmUgZmlndXJlKSB7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjb25zdHJhaW50cy5nZXQoZmlndXJlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCQlyZXN1bHQgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIC0xLCAtMSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lRm9yKGVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUoKSB7Ci0KLQkJCW9yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dCBteUdlbkxheW91dE1hbmFnZXIgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0KCk7Ci0KLQkJCXRoaXMuc2V0TGF5b3V0TWFuYWdlcihteUdlbkxheW91dE1hbmFnZXIpOwotCi0JCQlMaW5lU3R5bGUgbGluZXN0eWxlID0gKExpbmVTdHlsZSkgZ2V0UHJpbWFyeVZpZXcoKS5nZXRTdHlsZSgKLQkJCQkJTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkxJTkVfU1RZTEUpOwotCQkJaWYgKGxpbmVzdHlsZSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldENvbG9yKG5ldyBJbnRlZ2VyKGxpbmVzdHlsZS5nZXRMaW5lQ29sb3IoKSkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcwotCQkJCQkJLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuYmxhY2spOwotCQkJfQotCi0JCQlGaWxsU3R5bGUgc3R5bGUgPSAoRmlsbFN0eWxlKSBnZXRQcmltYXJ5VmlldygpLmdldFN0eWxlKAotCQkJCQlOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRklMTF9TVFlMRSk7Ci0JCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDb2xvcihuZXcgSW50ZWdlcihzdHlsZS5nZXRGaWxsQ29sb3IoKSkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoQUNUSVZJVFlQQVJUSVRJT05GSUdVUkVfQkFDSyk7Ci0JCQl9Ci0JCQl0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgzMDApLCBnZXRNYXBNb2RlKCkKLQkJCQkJLkRQdG9MUCg2MDApKTsKLQkJCXRoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDMwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNjAwKSk7Ci0JCQl0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLkxpbmVCb3JkZXIoKSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJCVdyYXBMYWJlbCBmaWdfMCA9IG5ldyBXcmFwTGFiZWwoKTsKLQotCQkJc2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoZmlnXzApOwotCi0JCQlPYmplY3QgbGF5RGF0YTAgPSBudWxsOwotCi0JCQl0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgV3JhcExhYmVsIGZQYXJ0aXRpb25MYWJlbEZpZ3VyZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFdyYXBMYWJlbCBnZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZSgpIHsKLQkJCXJldHVybiBmUGFydGl0aW9uTGFiZWxGaWd1cmU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKFdyYXBMYWJlbCBmaWcpIHsKLQkJCWZQYXJ0aXRpb25MYWJlbEZpZ3VyZSA9IGZpZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCQlpZiAoaXNPcGFxdWUoKSkKLQkJCQlzdXBlci5wYWludEZpZ3VyZShncmFwaGljcyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIEFDVElWSVRZUEFSVElUSU9ORklHVVJFX0JBQ0sgPSBuZXcgQ29sb3IobnVsbCwKLQkJCTI1NSwgMjU1LCAyNTUpOwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCU9iamVjdCBmZWF0dXJlID0gbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9IZWlnaHQoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hCb3VuZHMoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEJhY2tncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJCWdldFByaW1hcnlTaGFwZSgpLnNldEJhY2tncm91bmRDb2xvcigKLQkJCQkJRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb3JlZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCQlnZXRQcmltYXJ5U2hhcGUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoCi0JCQkJCURpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkuaXNJbnN0YW5jZSgKLQkJCQlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkpCi0JCQlyZWZyZXNoRm9udCgpOwotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpID09IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Vmlld19FbGVtZW50KCkKLQkJCQkmJiAoKEVPYmplY3QpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSA9PSBnZXROb3RhdGlvblZpZXcoKSkKLQkJCWhhbmRsZU1ham9yU2VtYW50aWNDaGFuZ2UoKTsKLQkJZWxzZQotCQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTU1Mjc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTm9uUmVzaXphYmxlSGFuZGxlS2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydAotCQlpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwNzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsCi0JCQkJbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJCQkJCUxpc3QgaGFuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCU5vblJlc2l6YWJsZUhhbmRsZUtpdC5hZGRNb3ZlSGFuZGxlKAotCQkJCQkJCQkoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSwgaGFuZGxlcyk7Ci0JCQkJCQlyZXR1cm4gaGFuZGxlczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcExhYmVsIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCWlmIChwYXJzZXJFbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2UocGFyc2VyRWxlbWVudC5lQ2xhc3MoKSk7Ci0JCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzEwMDg7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBVTUxFZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJcmVmcmVzaEJvdW5kcygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKHN0eWxlKTsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQm91bmRzKCkgewotCQlpbnQgd2lkdGggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRTaXplX1dpZHRoKCkpKS5pbnRWYWx1ZSgpOwotCQlpbnQgaGVpZ2h0ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9IZWlnaHQoKSkpLmludFZhbHVlKCk7Ci0JCURpbWVuc2lvbiBzaXplID0gbmV3IERpbWVuc2lvbih3aWR0aCwgaGVpZ2h0KTsKLQkJaW50IHggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9YKCkpKS5pbnRWYWx1ZSgpOwotCQlpbnQgeSA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1koKSkpLmludFZhbHVlKCk7Ci0JCVBvaW50IGxvYyA9IG5ldyBQb2ludCh4LCB5KTsKLQkJKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0UGFyZW50KCkpLnNldExheW91dENvbnN0cmFpbnQodGhpcywKLQkJCQlnZXRGaWd1cmUoKSwgbmV3IFJlY3RhbmdsZShsb2MsIHNpemUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaEJvdW5kcygpOwotCQl9Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkN2E2MzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydAotCQlpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwNjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwTGFiZWwgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJaWYgKHBhcnNlckVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZShwYXJzZXJFbGVtZW50LmVDbGFzcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJ0aXRpb25fMjAwMTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0RGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIFVNTEVkaXRQYXJ0RmFjdG9yeQotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQlyZWZyZXNoQm91bmRzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoc3R5bGUpOwotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hCb3VuZHMoKSB7Ci0JCWludCB3aWR0aCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfV2lkdGgoKSkpLmludFZhbHVlKCk7Ci0JCWludCBoZWlnaHQgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRTaXplX0hlaWdodCgpKSkuaW50VmFsdWUoKTsKLQkJRGltZW5zaW9uIHNpemUgPSBuZXcgRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpOwotCQlpbnQgeCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7Ci0JCWludCB5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsKLQkJUG9pbnQgbG9jID0gbmV3IFBvaW50KHgsIHkpOwotCQkoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuc2V0TGF5b3V0Q29uc3RyYWludCh0aGlzLAotCQkJCWdldEZpZ3VyZSgpLCBuZXcgUmVjdGFuZ2xlKGxvYywgc2l6ZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoQm91bmRzKCk7Ci0JCX0KLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZjhmZDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0IGV4dGVuZHMKLQkJU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsKLQkJcmV0dXJuICIiOwkvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcgotCQkJCS5jcmVhdGVGaWd1cmUoKTsKLQkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koCi0JCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsCi0JCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLAotCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvL3B1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkvLwlJRmlndXJlIHJlc3VsdCA9IHN1cGVyLmNyZWF0ZUZpZ3VyZSgpOwotCS8vCXJlc3VsdC5zZXRCb3JkZXIobmV3IExpbmVCb3JkZXIoKSk7Ci0JLy8JcmV0dXJuIHJlc3VsdDsKLQkvL30KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hCb3VuZHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChub3RpZmljYXRpb24pOwotCQlPYmplY3QgZmVhdHVyZSA9IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoQm91bmRzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEJvdW5kcygpIHsKLQkJaW50IHggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9YKCkpKS5pbnRWYWx1ZSgpOwotCQlpbnQgeSA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1koKSkpLmludFZhbHVlKCk7Ci0JCWludCB3aWR0aCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfV2lkdGgoKSkpLmludFZhbHVlKCk7Ci0JCWludCBoZWlnaHQgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRTaXplX0hlaWdodCgpKSkuaW50VmFsdWUoKTsKLQkJKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0UGFyZW50KCkpLnNldExheW91dENvbnN0cmFpbnQodGhpcywKLQkJCQlnZXRGaWd1cmUoKSwgbmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgewotCQkvLyBub3RoaW5nIHRvIGRvIC0tIHBhcmVudCBsYXlvdXQgZG9lcyBub3QgYWNjZXB0IERvdWJsZSBjb25zdHJhaW50cyBhcyByYXRpbwotCQkvLyBzdXBlci5zZXRSYXRpbyhyYXRpbyk7IAotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiOGRlOWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNvbnRhaW5lck5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlhZTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0IGV4dGVuZHMKLQkJU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgewotCQlyZXR1cm4gIiI7CS8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyCi0JCQkJLmNyZWF0ZUZpZ3VyZSgpOwotCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KAotCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsCi0JCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLAotCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRSwKLQkJCQluZXcgQ29udGFpbmVyTm9kZUVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIG5ldyBYWUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8vcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCS8vCUlGaWd1cmUgcmVzdWx0ID0gc3VwZXIuY3JlYXRlRmlndXJlKCk7Ci0JLy8JcmVzdWx0LnNldEJvcmRlcihuZXcgTGluZUJvcmRlcigpKTsKLQkvLwlyZXR1cm4gcmVzdWx0OwotCS8vfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaEJvdW5kcygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KG5vdGlmaWNhdGlvbik7Ci0JCU9iamVjdCBmZWF0dXJlID0gbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9IZWlnaHQoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hCb3VuZHMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQm91bmRzKCkgewotCQlpbnQgeCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7Ci0JCWludCB5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsKLQkJaW50IHdpZHRoID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IGhlaWdodCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOwotCQkoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuc2V0TGF5b3V0Q29uc3RyYWludCh0aGlzLAotCQkJCWdldEZpZ3VyZSgpLCBuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8gLS0gcGFyZW50IGxheW91dCBkb2VzIG5vdCBhY2NlcHQgRG91YmxlIGNvbnN0cmFpbnRzIGFzIHJhdGlvCi0JCS8vIHN1cGVyLnNldFJhdGlvKHJhdGlvKTsgCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQ29udHJvbEZsb3dFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQ29udHJvbEZsb3dFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmMxZWJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0NvbnRyb2xGbG93RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLlBvbHlsaW5lQ29ubmVjdGlvbkV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkNvbnRyb2xGbG93SXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db25uZWN0aW9uTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cm9sRmxvd0VkaXRQYXJ0IGV4dGVuZHMgQ29ubmVjdGlvbk5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzAwMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udHJvbEZsb3dFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IENvbnRyb2xGbG93SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uRmlndXJlKCkgewotCi0JCXJldHVybiBuZXcgQ29udHJvbEZsb3dGaWd1cmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIENvbnRyb2xGbG93RmlndXJlIGV4dGVuZHMgUG9seWxpbmVDb25uZWN0aW9uRXggewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQ29udHJvbEZsb3dGaWd1cmUoKSB7Ci0KLQkJCXNldFRhcmdldERlY29yYXRpb24oY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFBvbHlsaW5lRGVjb3JhdGlvbiBjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkgewotCQkJUG9seWxpbmVEZWNvcmF0aW9uIGRmID0gbmV3IFBvbHlsaW5lRGVjb3JhdGlvbigpOwotCQkJLy8gZGlzcGF0Y2hOZXh0PwotCi0JCQlQb2ludExpc3QgcGwgPSBuZXcgUG9pbnRMaXN0KCk7Ci0JCQlwbC5hZGRQb2ludCgtMSwgMSk7Ci0JCQlwbC5hZGRQb2ludCgwLCAwKTsKLQkJCXBsLmFkZFBvaW50KC0xLCAtMSk7Ci0JCQlkZi5zZXRUZW1wbGF0ZShwbCk7Ci0JCQlkZi5zZXRTY2FsZShnZXRNYXBNb2RlKCkuRFB0b0xQKDcpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDMpKTsKLQotCQkJcmV0dXJuIGRmOwotCQl9Ci0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9yZWdyb3VuZENvbG9yKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLnJlZnJlc2hGb3JlZ3JvdW5kQ29sb3IoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJaWYgKERpYWdyYW1Db3JlVmFsaWRhdGlvbi5jaGVja0RlbGV0ZSgoRWRnZSkgZ2V0TW9kZWwoKSkgIT0gbnVsbCkgewotCQkJdGhpcy5kaXNhYmxlRWRpdE1vZGUoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgewotCQlDb2xvciBvdmVycmlkZUNvbG9yID0gRGlhZ3JhbUNvcmVVdGlsLmdldExpbmtPdmVycmlkZUNvbG9yKChFZGdlKSBnZXRNb2RlbCgpKTsKLQkJc3VwZXIuc2V0Rm9yZWdyb3VuZENvbG9yKG92ZXJyaWRlQ29sb3IgIT0gbnVsbCA/IG92ZXJyaWRlQ29sb3IgOiBjb2xvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0NvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYzdjYmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25Mb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xGbG93TmFtZUVkaXRQYXJ0IGV4dGVuZHMgTGFiZWxFZGl0UGFydCBpbXBsZW1lbnRzCi0JCUlUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAxMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jc3RhdGljIHsKLQkJcmVnaXN0ZXJTbmFwQmFja1Bvc2l0aW9uKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShDb250cm9sRmxvd05hbWVFZGl0UGFydC5WSVNVQUxfSUQpLCBuZXcgUG9pbnQoMCwgNDApKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRyb2xGbG93TmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRLZXlQb2ludCgpIHsKLQkJcmV0dXJuIENvbm5lY3Rpb25Mb2NhdG9yLk1JRERMRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKElGaWd1cmUgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJLy8JCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJLy8JCQkJLmdldEl0ZW1JbWFnZURlc2NyaXB0b3IoZ2V0UGFyc2VyRWxlbWVudCgpKTsKLQkJLy8JCWlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKLQkJLy8JCQlkZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJLy8JCX0KLQkJLy8JCXJldHVybiBkZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwgVU1MRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoc3R5bGUpOwotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJSUZpZ3VyZSBsYWJlbCA9IGNyZWF0ZUZpZ3VyZVByaW0oKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIobGFiZWwpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZVByaW0oKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbEZsb3dMYWJlbEZpZ3VyZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dMYWJlbEZpZ3VyZSBleHRlbmRzIFdyYXBMYWJlbCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBDb250cm9sRmxvd0xhYmVsRmlndXJlKCkgewotCi0JCQl0aGlzLnNldFRleHQoIiIpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9EZWNpc2lvbk5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvRGVjaXNpb25Ob2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBiOTlkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9EZWNpc2lvbk5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5maWd1cmVzLkRlY2lzaW9uTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkRlY2lzaW9uTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5EZWNpc2lvbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkRlY2lzaW9uTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZpbGxTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5MaW5lU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlY2lzaW9uTm9kZUVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWNpc2lvbk5vZGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0KLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgRGVjaXNpb25Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJRGVjaXNpb25EaWFtb25kRmlndXJlIGZpZ3VyZSA9IG5ldyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoRGVjaXNpb25EaWFtb25kRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRGVjaXNpb25EaWFtb25kRmlndXJlIGV4dGVuZHMgRGVjaXNpb25Ob2RlRmlndXJlIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgRGVjaXNpb25EaWFtb25kRmlndXJlKCkgewotCi0JCQlzdXBlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksCi0JCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNTApKTsgLy9tb2RpZmllZAotCQkJTGluZVN0eWxlIGxpbmVzdHlsZSA9IChMaW5lU3R5bGUpIGdldFByaW1hcnlWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJCU5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5MSU5FX1NUWUxFKTsKLQkJCWlmIChsaW5lc3R5bGUgIT0gbnVsbAotCQkJCQkmJiBsaW5lc3R5bGUuZ2V0TGluZUNvbG9yKCkgIT0gRGlhZ3JhbUNvbnN0YW50cy5MSU5FX0NPTE9SX0VERUZBVUxUKSB7Ci0JCQkJdGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldENvbG9yKG5ldyBJbnRlZ2VyKGxpbmVzdHlsZS5nZXRMaW5lQ29sb3IoKSkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcwotCQkJCQkJLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUpOwotCQkJfQotCi0JCQlGaWxsU3R5bGUgc3R5bGUgPSAoRmlsbFN0eWxlKSBnZXRQcmltYXJ5VmlldygpLmdldFN0eWxlKAotCQkJCQlOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRklMTF9TVFlMRSk7Ci0JCQlpZiAoc3R5bGUgIT0gbnVsbAotCQkJCQkmJiBzdHlsZS5nZXRGaWxsQ29sb3IoKSAhPSBEaWFncmFtQ29uc3RhbnRzLkZJTExfQ09MT1JfRURFRkFVTFQpIHsKLQkJCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q29sb3IobmV3IEludGVnZXIoc3R5bGUuZ2V0RmlsbENvbG9yKCkpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKERFQ0lTSU9ORElBTU9OREZJR1VSRV9CQUNLKTsKLQkJCX0KLQkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgKLQkJCQkJNTApKTsKLQkJCXRoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpOwotCi0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJCVdyYXBMYWJlbCBmaWdfMCA9IG5ldyBXcmFwTGFiZWwoKTsKLQotCQkJc2V0RmlndXJlRGlhbW9uZExhYmVsKGZpZ18wKTsKLQotCQkJT2JqZWN0IGxheURhdGEwID0gbnVsbDsKLQotCQkJdGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdyYXBMYWJlbCBmRGlhbW9uZExhYmVsOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldEZpZ3VyZURpYW1vbmRMYWJlbCgpIHsKLQkJCXJldHVybiBmRGlhbW9uZExhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVEaWFtb25kTGFiZWwoV3JhcExhYmVsIGZpZykgewotCQkJZkRpYW1vbmRMYWJlbCA9IGZpZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBERUNJU0lPTkRJQU1PTkRGSUdVUkVfQkFDSyA9IG5ldyBDb2xvcihudWxsLCAxODUsCi0JCQkyMDUsIDIzMCk7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJT2JqZWN0IGZlYXR1cmUgPSBub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaEJvdW5kcygpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJc2V0QmFja2dyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQkJZ2V0UHJpbWFyeVNoYXBlKCkuc2V0QmFja2dyb3VuZENvbG9yKAotCQkJCQlEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvcmVncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJCWdldFByaW1hcnlTaGFwZSgpLnNldEZvcmVncm91bmRDb2xvcigKLQkJCQkJRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKS5pc0luc3RhbmNlKAotCQkJCW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSkKLQkJCXJlZnJlc2hGb250KCk7Ci0JCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkgPT0gTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRWaWV3X0VsZW1lbnQoKQotCQkJCSYmICgoRU9iamVjdCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpID09IGdldE5vdGF0aW9uVmlldygpKQotCQkJaGFuZGxlTWFqb3JTZW1hbnRpY0NoYW5nZSgpOwotCQllbHNlCi0JCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0RlY2lzaW9uTm9kZU5hbWVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZjM4NzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0IGltcGxlbWVudHMKLQkJSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDA0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuRGVjaXNpb25Ob2RlXzEwMDU7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBVTUxFZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJSUZpZ3VyZSBsYWJlbCA9IGNyZWF0ZUZpZ3VyZVByaW0oKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIobGFiZWwpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZVByaW0oKSB7Ci0JCXJldHVybiBuZXcgTm9kZU5hbWVGaWd1cmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIE5vZGVOYW1lRmlndXJlIGV4dGVuZHMgV3JhcExhYmVsIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIE5vZGVOYW1lRmlndXJlKCkgewotCi0JCQl0aGlzLnNldFRleHQoIiIpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Gb3JrTm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Gb3JrTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YmM3NjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvRm9ya05vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5Gb3JrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5Gb3JrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuRm9ya05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuUmVzaXphYmxlRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5GaWxsU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZvcmtOb2RlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAwMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZvcmtOb2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCi0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IEZvcmtOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJRm9ya05vZGVGaWd1cmUgZmlndXJlID0gbmV3IEZvcmtOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGb3JrTm9kZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoRm9ya05vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg1KSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UG9saWN5IGdldFByaW1hcnlEcmFnRWRpdFBvbGljeSgpIHsKLQkJRWRpdFBvbGljeSByZXN1bHQgPSBzdXBlci5nZXRQcmltYXJ5RHJhZ0VkaXRQb2xpY3koKTsKLQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFJlc2l6YWJsZUVkaXRQb2xpY3kpIHsKLQkJCVJlc2l6YWJsZUVkaXRQb2xpY3kgZXAgPSAoUmVzaXphYmxlRWRpdFBvbGljeSkgcmVzdWx0OwotCQkJZXAuc2V0UmVzaXplRGlyZWN0aW9ucyhQb3NpdGlvbkNvbnN0YW50cy5XRVNUCi0JCQkJCXwgUG9zaXRpb25Db25zdGFudHMuRUFTVCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIEZvcmtOb2RlRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgRm9ya05vZGVGaWd1cmUoKSB7Ci0KLQkJCUZpbGxTdHlsZSBzdHlsZSA9IChGaWxsU3R5bGUpIGdldFByaW1hcnlWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJCU5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GSUxMX1NUWUxFKTsKLQkJCWlmIChzdHlsZSAhPSBudWxsCi0JCQkJCSYmIHN0eWxlLmdldEZpbGxDb2xvcigpICE9IERpYWdyYW1Db25zdGFudHMuRklMTF9DT0xPUl9FREVGQVVMVCkgewotCQkJCXNldEJhY2tncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKAotCQkJCQkJbmV3IEludGVnZXIoc3R5bGUuZ2V0RmlsbENvbG9yKCkpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKEZPUktOT0RFRklHVVJFX0JBQ0spOwotCQkJfQotCQkJdGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpCi0JCQkJCS5EUHRvTFAoOCkpOwotCQkJdGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBGT1JLTk9ERUZJR1VSRV9CQUNLID0gbmV3IENvbG9yKG51bGwsIDQ1LCA4NSwgMTMwKTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlPYmplY3QgZmVhdHVyZSA9IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoQm91bmRzKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRCYWNrZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCQlnZXRQcmltYXJ5U2hhcGUoKS5zZXRCYWNrZ3JvdW5kQ29sb3IoCi0JCQkJCURpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9yZWdyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQkJZ2V0UHJpbWFyeVNoYXBlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKAotCQkJCQlEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpLmlzSW5zdGFuY2UoCi0JCQkJbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpKQotCQkJcmVmcmVzaEZvbnQoKTsKLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFZpZXdfRWxlbWVudCgpCi0JCQkJJiYgKChFT2JqZWN0KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkgPT0gZ2V0Tm90YXRpb25WaWV3KCkpCi0JCQloYW5kbGVNYWpvclNlbWFudGljQ2hhbmdlKCk7Ci0JCWVsc2UKLQkJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvSW5pdGlhbE5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvSW5pdGlhbE5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDAyYmFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0luaXRpYWxOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5FbGxpcHNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkluaXRpYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkluaXRpYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5Jbml0aWFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxFeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuTGF5ZXJNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5GaWxsU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTGluZVN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0aWFsTm9kZUVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbml0aWFsTm9kZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBJbml0aWFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElCb3JkZXJJdGVtRWRpdFBhcnQpIHsKLQkJCQkJcmV0dXJuIG5ldyBCb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlJbml0aWFsTm9kZUZpZ3VyZSBmaWd1cmUgPSBuZXcgSW5pdGlhbE5vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluaXRpYWxOb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChJbml0aWFsTm9kZUZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRCb3JkZXJJdGVtKElGaWd1cmUgYm9yZGVySXRlbUNvbnRhaW5lciwKLQkJCUlCb3JkZXJJdGVtRWRpdFBhcnQgYm9yZGVySXRlbUVkaXRQYXJ0KSB7Ci0JCWlmIChib3JkZXJJdGVtRWRpdFBhcnQgaW5zdGFuY2VvZiBJbml0aWFsTm9kZU5hbWVFZGl0UGFydCkgewotCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksCi0JCQkJCVBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsKLQkJCWxvY2F0b3Iuc2V0Qm9yZGVySXRlbU9mZnNldChuZXcgRGltZW5zaW9uKC0yMCwgLTIwKSk7Ci0JCQlib3JkZXJJdGVtQ29udGFpbmVyLmFkZChib3JkZXJJdGVtRWRpdFBhcnQuZ2V0RmlndXJlKCksIGxvY2F0b3IpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkQm9yZGVySXRlbShib3JkZXJJdGVtQ29udGFpbmVyLCBib3JkZXJJdGVtRWRpdFBhcnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwgZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCgyMCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShJbml0aWFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIEluaXRpYWxOb2RlRmlndXJlIGV4dGVuZHMgRWxsaXBzZSB7Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHVibGljIEluaXRpYWxOb2RlRmlndXJlKCkgewotCi0JCQlMaW5lU3R5bGUgbGluZXN0eWxlID0gKExpbmVTdHlsZSkgZ2V0UHJpbWFyeVZpZXcoKS5nZXRTdHlsZSgKLQkJCQkJTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkxJTkVfU1RZTEUpOwotCQkJaWYgKGxpbmVzdHlsZSAhPSBudWxsCi0JCQkJCSYmIGxpbmVzdHlsZS5nZXRMaW5lQ29sb3IoKSAhPSBEaWFncmFtQ29uc3RhbnRzLkxJTkVfQ09MT1JfRURFRkFVTFQpIHsKLQkJCQl0aGlzLnNldEZvcmVncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q29sb3IobmV3IEludGVnZXIobGluZXN0eWxlLmdldExpbmVDb2xvcigpKSkpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzCi0JCQkJCQkuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5kYXJrQmx1ZSk7Ci0JCQl9Ci0KLQkJCUZpbGxTdHlsZSBzdHlsZSA9IChGaWxsU3R5bGUpIGdldFByaW1hcnlWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJCU5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GSUxMX1NUWUxFKTsKLQkJCWlmIChzdHlsZSAhPSBudWxsCi0JCQkJCSYmIHN0eWxlLmdldEZpbGxDb2xvcigpICE9IERpYWdyYW1Db25zdGFudHMuRklMTF9DT0xPUl9FREVGQVVMVCkgewotCQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDb2xvcihuZXcgSW50ZWdlcihzdHlsZS5nZXRGaWxsQ29sb3IoKSkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoSU5JVElBTE5PREVGSUdVUkVfQkFDSyk7Ci0JCQl9Ci0JCQl0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoCi0JCQkJCTIwKSk7Ci0JCQl0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMjApKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIElOSVRJQUxOT0RFRklHVVJFX0JBQ0sgPSBuZXcgQ29sb3IobnVsbCwgNDUsIDg1LAotCQkJMTMwKTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlPYmplY3QgZmVhdHVyZSA9IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoQm91bmRzKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRCYWNrZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCQlnZXRQcmltYXJ5U2hhcGUoKS5zZXRCYWNrZ3JvdW5kQ29sb3IoCi0JCQkJCURpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9yZWdyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQkJZ2V0UHJpbWFyeVNoYXBlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKAotCQkJCQlEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpLmlzSW5zdGFuY2UoCi0JCQkJbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpKQotCQkJcmVmcmVzaEZvbnQoKTsKLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFZpZXdfRWxlbWVudCgpCi0JCQkJJiYgKChFT2JqZWN0KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkgPT0gZ2V0Tm90YXRpb25WaWV3KCkpCi0JCQloYW5kbGVNYWpvclNlbWFudGljQ2hhbmdlKCk7Ci0JCWVsc2UKLQkJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0luaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NDQ2N2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuSUJvcmRlckl0ZW1Mb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQgZXh0ZW5kcyBMYWJlbEVkaXRQYXJ0IGltcGxlbWVudHMKLQkJSVRleHRBd2FyZUVkaXRQYXJ0LCBJQm9yZGVySXRlbUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlzdGF0aWMgewotCQlyZWdpc3RlclNuYXBCYWNrUG9zaXRpb24oVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksIG5ldyBQb2ludCgwLCAwKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbml0aWFsTm9kZU5hbWVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQm9yZGVySXRlbUxvY2F0b3IgZ2V0Qm9yZGVySXRlbUxvY2F0b3IoKSB7Ci0JCUlGaWd1cmUgcGFyZW50RmlndXJlID0gZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCk7Ci0JCWlmIChwYXJlbnRGaWd1cmUgIT0gbnVsbCAmJiBwYXJlbnRGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpICE9IG51bGwpIHsKLQkJCU9iamVjdCBjb25zdHJhaW50ID0gcGFyZW50RmlndXJlLmdldExheW91dE1hbmFnZXIoKS5nZXRDb25zdHJhaW50KAotCQkJCQlnZXRGaWd1cmUoKSk7Ci0JCQlyZXR1cm4gKElCb3JkZXJJdGVtTG9jYXRvcikgY29uc3RyYWludDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaEJvdW5kcygpIHsKLQkJaW50IHggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9YKCkpKS5pbnRWYWx1ZSgpOwotCQlpbnQgeSA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1koKSkpLmludFZhbHVlKCk7Ci0JCWludCB3aWR0aCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfV2lkdGgoKSkpLmludFZhbHVlKCk7Ci0JCWludCBoZWlnaHQgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRTaXplX0hlaWdodCgpKSkuaW50VmFsdWUoKTsKLQkJZ2V0Qm9yZGVySXRlbUxvY2F0b3IoKQotCQkJCS5zZXRDb25zdHJhaW50KG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLkluaXRpYWxOb2RlXzEwMDQ7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBVTUxFZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlJRmlndXJlIGxhYmVsID0gY3JlYXRlRmlndXJlUHJpbSgpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihsYWJlbCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlUHJpbSgpIHsKLQkJcmV0dXJuIG5ldyBXcmFwTGFiZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBUT0RPOiBEaXNhYmxlcyBkaXJlY3QgZWRpdCBmb3Igbm93IHVudGlsIHRoZSBpc3N1ZSB3aXRoIGR1cGxpY2F0ZSBsYWJlbHMgaXMgZml4ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVF9FRElUICE9IHJlcXVlc3QuZ2V0VHlwZSgpKSB7Ci0gICAgICAgIAlzdXBlci5wZXJmb3JtUmVxdWVzdChyZXF1ZXN0KTsKLSAgICAgICAgfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0pvaW5Ob2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0pvaW5Ob2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZiZmZlNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Kb2luTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5Kb2luTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5Kb2luTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuSm9pbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5GaWxsU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpvaW5Ob2RlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAwNjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEpvaW5Ob2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCi0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IEpvaW5Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJRm9ya05vZGVGaWd1cmUgZmlndXJlID0gbmV3IEZvcmtOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGb3JrTm9kZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoRm9ya05vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg1KSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UG9saWN5IGdldFByaW1hcnlEcmFnRWRpdFBvbGljeSgpIHsKLQkJRWRpdFBvbGljeSByZXN1bHQgPSBzdXBlci5nZXRQcmltYXJ5RHJhZ0VkaXRQb2xpY3koKTsKLQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFJlc2l6YWJsZUVkaXRQb2xpY3kpIHsKLQkJCVJlc2l6YWJsZUVkaXRQb2xpY3kgZXAgPSAoUmVzaXphYmxlRWRpdFBvbGljeSkgcmVzdWx0OwotCQkJZXAuc2V0UmVzaXplRGlyZWN0aW9ucyhQb3NpdGlvbkNvbnN0YW50cy5XRVNUCi0JCQkJCXwgUG9zaXRpb25Db25zdGFudHMuRUFTVCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIEZvcmtOb2RlRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgRm9ya05vZGVGaWd1cmUoKSB7Ci0KLQkJCUZpbGxTdHlsZSBzdHlsZSA9IChGaWxsU3R5bGUpIGdldFByaW1hcnlWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJCU5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GSUxMX1NUWUxFKTsKLQkJCWlmIChzdHlsZSAhPSBudWxsCi0JCQkJCSYmIHN0eWxlLmdldEZpbGxDb2xvcigpICE9IERpYWdyYW1Db25zdGFudHMuRklMTF9DT0xPUl9FREVGQVVMVCkgewotCQkJCXNldEJhY2tncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKAotCQkJCQkJbmV3IEludGVnZXIoc3R5bGUuZ2V0RmlsbENvbG9yKCkpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKEZPUktOT0RFRklHVVJFX0JBQ0spOwotCQkJfQotCQkJdGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpCi0JCQkJCS5EUHRvTFAoOCkpOwotCQkJdGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBGT1JLTk9ERUZJR1VSRV9CQUNLID0gbmV3IENvbG9yKG51bGwsIDQ1LCA4NSwgMTMwKTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlPYmplY3QgZmVhdHVyZSA9IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoQm91bmRzKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRCYWNrZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCQlnZXRQcmltYXJ5U2hhcGUoKS5zZXRCYWNrZ3JvdW5kQ29sb3IoCi0JCQkJCURpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9yZWdyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQkJZ2V0UHJpbWFyeVNoYXBlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKAotCQkJCQlEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpLmlzSW5zdGFuY2UoCi0JCQkJbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpKQotCQkJcmVmcmVzaEZvbnQoKTsKLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFZpZXdfRWxlbWVudCgpCi0JCQkJJiYgKChFT2JqZWN0KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkgPT0gZ2V0Tm90YXRpb25WaWV3KCkpCi0JCQloYW5kbGVNYWpvclNlbWFudGljQ2hhbmdlKCk7Ci0JCWVsc2UKLQkJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KG5vdGlmaWNhdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9NZXJnZU5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvTWVyZ2VOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIyOWEwYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9NZXJnZU5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5maWd1cmVzLkRlY2lzaW9uTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLk1lcmdlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5NZXJnZU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLk1lcmdlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZpbGxTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5MaW5lU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lcmdlTm9kZUVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXJnZU5vZGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0KLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgTWVyZ2VOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJRGVjaXNpb25EaWFtb25kRmlndXJlIGZpZ3VyZSA9IG5ldyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoRGVjaXNpb25EaWFtb25kRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRGVjaXNpb25EaWFtb25kRmlndXJlIGV4dGVuZHMgRGVjaXNpb25Ob2RlRmlndXJlIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgRGVjaXNpb25EaWFtb25kRmlndXJlKCkgewotCi0JCQlzdXBlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksCi0JCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNTApKTsgLy9tb2RpZmllZAotCQkJTGluZVN0eWxlIGxpbmVzdHlsZSA9IChMaW5lU3R5bGUpIGdldFByaW1hcnlWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJCU5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5MSU5FX1NUWUxFKTsKLQkJCWlmIChsaW5lc3R5bGUgIT0gbnVsbAotCQkJCQkmJiBsaW5lc3R5bGUuZ2V0TGluZUNvbG9yKCkgIT0gRGlhZ3JhbUNvbnN0YW50cy5MSU5FX0NPTE9SX0VERUZBVUxUKSB7Ci0JCQkJdGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldENvbG9yKG5ldyBJbnRlZ2VyKGxpbmVzdHlsZS5nZXRMaW5lQ29sb3IoKSkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcwotCQkJCQkJLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUpOwotCQkJfQotCi0JCQlGaWxsU3R5bGUgc3R5bGUgPSAoRmlsbFN0eWxlKSBnZXRQcmltYXJ5VmlldygpLmdldFN0eWxlKAotCQkJCQlOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRklMTF9TVFlMRSk7Ci0JCQlpZiAoc3R5bGUgIT0gbnVsbAotCQkJCQkmJiBzdHlsZS5nZXRGaWxsQ29sb3IoKSAhPSBEaWFncmFtQ29uc3RhbnRzLkZJTExfQ09MT1JfRURFRkFVTFQpIHsKLQkJCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q29sb3IobmV3IEludGVnZXIoc3R5bGUuZ2V0RmlsbENvbG9yKCkpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKERFQ0lTSU9ORElBTU9OREZJR1VSRV9CQUNLKTsKLQkJCX0KLQkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgKLQkJCQkJNTApKTsKLQkJCXRoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpOwotCi0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJCVdyYXBMYWJlbCBmaWdfMCA9IG5ldyBXcmFwTGFiZWwoKTsKLQotCQkJc2V0RmlndXJlRGlhbW9uZExhYmVsKGZpZ18wKTsKLQotCQkJT2JqZWN0IGxheURhdGEwID0gbnVsbDsKLQotCQkJdGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdyYXBMYWJlbCBmRGlhbW9uZExhYmVsOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldEZpZ3VyZURpYW1vbmRMYWJlbCgpIHsKLQkJCXJldHVybiBmRGlhbW9uZExhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVEaWFtb25kTGFiZWwoV3JhcExhYmVsIGZpZykgewotCQkJZkRpYW1vbmRMYWJlbCA9IGZpZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBERUNJU0lPTkRJQU1PTkRGSUdVUkVfQkFDSyA9IG5ldyBDb2xvcihudWxsLCAxODUsCi0JCQkyMDUsIDIzMCk7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJT2JqZWN0IGZlYXR1cmUgPSBub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaEJvdW5kcygpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJc2V0QmFja2dyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQkJZ2V0UHJpbWFyeVNoYXBlKCkuc2V0QmFja2dyb3VuZENvbG9yKAotCQkJCQlEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvcmVncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJCWdldFByaW1hcnlTaGFwZSgpLnNldEZvcmVncm91bmRDb2xvcigKLQkJCQkJRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKS5pc0luc3RhbmNlKAotCQkJCW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSkKLQkJCXJlZnJlc2hGb250KCk7Ci0JCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkgPT0gTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRWaWV3X0VsZW1lbnQoKQotCQkJCSYmICgoRU9iamVjdCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpID09IGdldE5vdGF0aW9uVmlldygpKQotCQkJaGFuZGxlTWFqb3JTZW1hbnRpY0NoYW5nZSgpOwotCQllbHNlCi0JCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL01lcmdlTm9kZU5hbWVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMjFmMDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXJnZU5vZGVOYW1lRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0IGltcGxlbWVudHMKLQkJSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuTWVyZ2VOb2RlXzEwMDI7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBVTUxFZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJSUZpZ3VyZSBsYWJlbCA9IGNyZWF0ZUZpZ3VyZVByaW0oKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIobGFiZWwpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZVByaW0oKSB7Ci0JCXJldHVybiBuZXcgTm9kZU5hbWVGaWd1cmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIE5vZGVOYW1lRmlndXJlIGV4dGVuZHMgV3JhcExhYmVsIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIE5vZGVOYW1lRmlndXJlKCkgewotCi0JCQl0aGlzLnNldFRleHQoIiIpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyY2Q0MjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzLk9wZW5BREVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuZmlndXJlcy5XaWRlbmVkV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDEwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCQkJbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJDYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuT1BFTl9ST0xFLCBuZXcgT3BlbkFERWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSBmaWd1cmUgPSBuZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydCkgewotCQkJKChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkKLQkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpLmdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgewotCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmVGb3IoZWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSBleHRlbmRzIFJlY3RhbmdsZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0T3V0bGluZShmYWxzZSk7Ci0JCQl0aGlzLnNldE9wYXF1ZShmYWxzZSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IFdpZGVuZWRXcmFwTGFiZWwoKTsKLQkJCWZpZ18wLnNldFRleHQoRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX05ld19QaGFzZSk7Ci0KLQkJCURpYWdyYW1Db3JlVXRpbC5zZXRMYWJlbFByb3BlcnRpZXMoZmlnXzApOwotCQkJc2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoZmlnXzApOwotCi0JCQlPYmplY3QgbGF5RGF0YTAgPSBudWxsOwotCi0JCQl0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgV3JhcExhYmVsIGZOb2RlTmFtZUZpZ3VyZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFdyYXBMYWJlbCBnZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSgpIHsKLQkJCXJldHVybiBmTm9kZU5hbWVGaWd1cmU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNldEZpZ3VyZU5vZGVOYW1lRmlndXJlKFdyYXBMYWJlbCBmaWcpIHsKLQkJCWZOb2RlTmFtZUZpZ3VyZSA9IGZpZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCQlpZiAoaXNPcGFxdWUoKSkKLQkJCQlzdXBlci5wYWludEZpZ3VyZShncmFwaGljcyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE2MzU5YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20ucG9saWNpZXMuT3BlbkFERWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5maWd1cmVzLldpZGVuZWRXcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMTE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRSwKLQkJCQluZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNHcmFwaGljYWxOb2RlRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0Nhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5PUEVOX1JPTEUsIG5ldyBPcGVuQURFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0KSB7Ci0JCQkoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkuZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7Ci0JCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgewotCi0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZUZvcihlZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsKLQkJCXRoaXMuc2V0T3BhcXVlKGZhbHNlKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgV2lkZW5lZFdyYXBMYWJlbCgpOwotCQkJZmlnXzAuc2V0VGV4dChEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fTmV3X0l0ZXJhdGlvbik7Ci0KLQkJCURpYWdyYW1Db3JlVXRpbC5zZXRMYWJlbFByb3BlcnRpZXMoZmlnXzApOwotCi0JCQlzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgZk5vZGVOYW1lRmlndXJlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkgewotCQkJcmV0dXJuIGZOb2RlTmFtZUZpZ3VyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoV3JhcExhYmVsIGZpZykgewotCQkJZk5vZGVOYW1lRmlndXJlID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJCWlmIChpc09wYXF1ZSgpKQotCQkJCXN1cGVyLnBhaW50RmlndXJlKGdyYXBoaWNzKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhMzMwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llcy5PcGVuQURFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmZpZ3VyZXMuV2lkZW5lZFdyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDA3OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5HUkFQSElDQUxfTk9ERV9ST0xFLAotCQkJCW5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5PUEVOX1JPTEUsIG5ldyBPcGVuQURFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQpIHsKLQkJCSgoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkKLQkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpLmdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7Ci0JCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgewotCi0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZUZvcihlZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsKLQkJCXRoaXMuc2V0T3BhcXVlKGZhbHNlKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgV2lkZW5lZFdyYXBMYWJlbCgpOwotCQkJZmlnXzAuc2V0VGV4dChEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fTmV3X0FjdGl2aXR5KTsKLQotCQkJRGlhZ3JhbUNvcmVVdGlsLnNldExhYmVsUHJvcGVydGllcyhmaWdfMCk7Ci0JCQlzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgZk5vZGVOYW1lRmlndXJlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkgewotCQkJcmV0dXJuIGZOb2RlTmFtZUZpZ3VyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoV3JhcExhYmVsIGZpZykgewotCQkJZk5vZGVOYW1lRmlndXJlID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJCWlmIChpc09wYXF1ZSgpKQotCQkJCXN1cGVyLnBhaW50RmlndXJlKGdyYXBoaWNzKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwY2EzZTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llcy5PcGVuQURFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5WYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydAotCQlpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwOTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5PUEVOX1JPTEUsIG5ldyBPcGVuQURFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcExhYmVsIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCXJldHVybiBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkiZGlhZ3JhbS9waGFzZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJaWYgKERpYWdyYW1Db3JlVXRpbC5pc1JlYWRPbmx5KHRoaXMpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0RWRpdFRleHQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTA7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywKLQkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksCi0JCQkJCVVNTEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpIHsKLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQkJCQkoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpKQotCQkJCQkJCS5wZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHR4dCkgewotCQkJCQlyZXR1cm4gRGlhZ3JhbUNvcmVVdGlsLnZhbGlkU3RyaW5nRm9yQnJlYWtkb3duRWxlbWVudHMoCi0JCQkJCQkJZ2V0RWRpdFBhcnQoKSwgdHh0KTsKLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKHN0eWxlKTsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJQ29sb3IgYyA9IERpYWdyYW1Db3JlVXRpbC5nZXRGb250Q29sb3IodGhpcyk7Ci0JCWlmIChjICE9IG51bGwpIHsKLQkJCWNvbG9yID0gYzsKLQkJfQotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzQxOWIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20ucG9saWNpZXMuT3BlbkFERWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTm9uUmVzaXphYmxlSGFuZGxlS2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQKLQkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMTA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuT1BFTl9ST0xFLCBuZXcgT3BlbkFERWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBMYWJlbCBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlyZXR1cm4gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImRpYWdyYW0vaXRlcmF0aW9uLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlpZiAoRGlhZ3JhbUNvcmVVdGlsLmlzUmVhZE9ubHkodGhpcykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLAotCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwKLQkJCQkJVU1MRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkgewotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCQkJCSgoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCkpCi0JCQkJCQkJLnBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCQkJCXJldHVybiBEaWFncmFtQ29yZVV0aWwudmFsaWRTdHJpbmdGb3JCcmVha2Rvd25FbGVtZW50cygKLQkJCQkJCQlnZXRFZGl0UGFydCgpLCB0eHQpOwotCQkJCX0KLQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoc3R5bGUpOwotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlDb2xvciBjID0gRGlhZ3JhbUNvcmVVdGlsLmdldEZvbnRDb2xvcih0aGlzKTsKLQkJaWYgKGMgIT0gbnVsbCkgewotCQkJY29sb3IgPSBjOwotCQl9Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzczYmViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzLk9wZW5BREVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLlZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQKLQkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5PUEVOX1JPTEUsIG5ldyBPcGVuQURFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcExhYmVsIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCXJldHVybiBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkiZGlhZ3JhbS9hY3Rpdml0eS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJaWYgKERpYWdyYW1Db3JlVXRpbC5pc1JlYWRPbmx5KHRoaXMpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0RWRpdFRleHQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDc7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywKLQkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksCi0JCQkJCVVNTEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpIHsKLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQkJCQkoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCkpCi0JCQkJCQkJLnBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCQkJCXJldHVybiBEaWFncmFtQ29yZVV0aWwudmFsaWRTdHJpbmdGb3JCcmVha2Rvd25FbGVtZW50cygKLQkJCQkJCQlnZXRFZGl0UGFydCgpLCB0eHQpOwotCQkJCX0KLQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJCi0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKHN0eWxlKTsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJQ29sb3IgYyA9IERpYWdyYW1Db3JlVXRpbC5nZXRGb250Q29sb3IodGhpcyk7Ci0JCWlmIChjICE9IG51bGwpIHsKLQkJCWNvbG9yID0gYzsKLQkJfQotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1VNTEVkaXRQYXJ0RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvVU1MRWRpdFBhcnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NTk5NjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvVU1MRWRpdFBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTEVkaXRQYXJ0RmFjdG9yeSBpbXBsZW1lbnRzIEVkaXRQYXJ0RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KEVkaXRQYXJ0IGNvbnRleHQsIE9iamVjdCBtb2RlbCkgewotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlWaWV3IHZpZXcgPSAoVmlldykgbW9kZWw7Ci0JCQlzd2l0Y2ggKFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldykpIHsKLQotCQkJY2FzZSBBY3Rpdml0eUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5RWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IE1lcmdlTm9kZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIE1lcmdlTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBNZXJnZU5vZGVOYW1lRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBGb3JrTm9kZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIEluaXRpYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgSW5pdGlhbE5vZGVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBJbml0aWFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBJbml0aWFsTm9kZU5hbWVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBEZWNpc2lvbk5vZGVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBEZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIEpvaW5Ob2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgSm9pbk5vZGVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBDb250cm9sRmxvd0VkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIENvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IENvbnRyb2xGbG93TmFtZUVkaXRQYXJ0KHZpZXcpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjcmVhdGVVbnJlY29nbml6ZWRFZGl0UGFydChjb250ZXh0LCBtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWRpdFBhcnQgY3JlYXRlVW5yZWNvZ25pemVkRWRpdFBhcnQoRWRpdFBhcnQgY29udGV4dCwgT2JqZWN0IG1vZGVsKSB7Ci0JCS8vIEhhbmRsZSBjcmVhdGlvbiBvZiB1bnJlY29nbml6ZWQgY2hpbGQgbm9kZSBFZGl0UGFydHMgaGVyZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDZWxsRWRpdG9yTG9jYXRvciBnZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IoCi0JCQlJVGV4dEF3YXJlRWRpdFBhcnQgc291cmNlKSB7Ci0JCWlmIChzb3VyY2UuZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpCi0JCQlyZXR1cm4gbmV3IFRleHRDZWxsRWRpdG9yTG9jYXRvcigoV3JhcExhYmVsKSBzb3VyY2UuZ2V0RmlndXJlKCkpOwotCQllbHNlIHsKLQkJCXJldHVybiBuZXcgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcigoTGFiZWwpIHNvdXJjZS5nZXRGaWd1cmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jc3RhdGljIHByaXZhdGUgY2xhc3MgVGV4dENlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdyYXBMYWJlbCB3cmFwTGFiZWw7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBUZXh0Q2VsbEVkaXRvckxvY2F0b3IoV3JhcExhYmVsIHdyYXBMYWJlbCkgewotCQkJdGhpcy53cmFwTGFiZWwgPSB3cmFwTGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFdyYXBMYWJlbCBnZXRXcmFwTGFiZWwoKSB7Ci0JCQlyZXR1cm4gd3JhcExhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBnZXRXcmFwTGFiZWwoKS5nZXRUZXh0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQkJZ2V0V3JhcExhYmVsKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShyZWN0KTsKLQkJCWlmIChnZXRXcmFwTGFiZWwoKS5pc1RleHRXcmFwcGVkKCkKLQkJCQkJJiYgZ2V0V3JhcExhYmVsKCkuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCkgewotCQkJCXJlY3Quc2V0U2l6ZShuZXcgRGltZW5zaW9uKHRleHQuY29tcHV0ZVNpemUocmVjdC53aWR0aCwKLQkJCQkJCVNXVC5ERUZBVUxUKSkpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnQgYXZyID0gRmlndXJlVXRpbGl0aWVzLmdldEZvbnRNZXRyaWNzKHRleHQuZ2V0Rm9udCgpKQotCQkJCQkJLmdldEF2ZXJhZ2VDaGFyV2lkdGgoKTsKLQkJCQlyZWN0LnNldFNpemUobmV3IERpbWVuc2lvbih0ZXh0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULAotCQkJCQkJU1dULkRFRkFVTFQpKS5leHBhbmQoYXZyICogMiwgMCkpOwotCQkJfQotCQkJaWYgKCFyZWN0LmVxdWFscyhuZXcgUmVjdGFuZ2xlKHRleHQuZ2V0Qm91bmRzKCkpKSkgewotCQkJCXRleHQuc2V0Qm91bmRzKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIExhYmVsIGxhYmVsOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcihMYWJlbCBsYWJlbCkgewotCQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBMYWJlbCBnZXRMYWJlbCgpIHsKLQkJCXJldHVybiBsYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZWxvY2F0ZShDZWxsRWRpdG9yIGNlbGxlZGl0b3IpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBjZWxsZWRpdG9yLmdldENvbnRyb2woKTsKLQkJCVJlY3RhbmdsZSByZWN0ID0gZ2V0TGFiZWwoKS5nZXRUZXh0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQkJZ2V0TGFiZWwoKS50cmFuc2xhdGVUb0Fic29sdXRlKHJlY3QpOwotCQkJaW50IGF2ciA9IEZpZ3VyZVV0aWxpdGllcy5nZXRGb250TWV0cmljcyh0ZXh0LmdldEZvbnQoKSkKLQkJCQkJLmdldEF2ZXJhZ2VDaGFyV2lkdGgoKTsKLQkJCXJlY3Quc2V0U2l6ZShuZXcgRGltZW5zaW9uKHRleHQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsCi0JCQkJCVNXVC5ERUZBVUxUKSkuZXhwYW5kKGF2ciAqIDIsIDApKTsKLQkJCWlmICghcmVjdC5lcXVhbHMobmV3IFJlY3RhbmdsZSh0ZXh0LmdldEJvdW5kcygpKSkpIHsKLQkJCQl0ZXh0LnNldEJvdW5kcyhyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvVU1MRXh0Tm9kZUxhYmVsRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1VNTEV4dE5vZGVMYWJlbEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MmM1OTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvVU1MRXh0Tm9kZUxhYmVsRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTGFiZWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuTGFiZWxMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTEV4dE5vZGVMYWJlbEVkaXRQYXJ0IGV4dGVuZHMgTGFiZWxFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVNTEV4dE5vZGVMYWJlbEVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaEJvdW5kcygpIHsKLQkJSUZpZ3VyZSByZWZGaWd1cmUgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuZ2V0RmlndXJlKCk7Ci0JCWludCBkeCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7Ci0JCWludCBkeSA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1koKSkpLmludFZhbHVlKCk7Ci0JCVBvaW50IG9mZnNldCA9IG5ldyBQb2ludChkeCwgZHkpOwotCQlnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5zZXRDb25zdHJhaW50KGdldEZpZ3VyZSgpLAotCQkJCW5ldyBMYWJlbExvY2F0b3IocmVmRmlndXJlLCBvZmZzZXQsIGdldEtleVBvaW50KCkpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCByZWxvY2F0ZShJRmlndXJlIHRhcmdldCkgewotCQkJCQkJUG9pbnQgbG9jYXRpb24gPSBnZXRSZWZlcmVuY2VQb2ludCgpLmdldFRyYW5zbGF0ZWQoCi0JCQkJCQkJCWdldE9mZnNldCgpKTsKLQkJCQkJCWxvY2F0aW9uLnRyYW5zbGF0ZSgtdGFyZ2V0LmdldEJvdW5kcygpLndpZHRoIC8gMiwgMCk7Ci0JCQkJCQl0YXJnZXQuc2V0TG9jYXRpb24obG9jYXRpb24pOwotCQkJCQkJdGFyZ2V0LnNldFNpemUobmV3IERpbWVuc2lvbigKLQkJCQkJCQkJdGFyZ2V0LmdldFByZWZlcnJlZFNpemUoKS53aWR0aCwgdGFyZ2V0Ci0JCQkJCQkJCQkJLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQpKTsKLQkJCQkJfQotCi0JCQkJCXByb3RlY3RlZCBQb2ludCBnZXRSZWZlcmVuY2VQb2ludCgpIHsKLQkJCQkJCXJldHVybiBnZXRMYWJlbExvY2F0aW9uKHBhcmVudCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGdldFJlZmVyZW5jZVBvaW50KCkgewotCQlyZXR1cm4gZ2V0TGFiZWxMb2NhdGlvbigoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuZ2V0RmlndXJlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0TGFiZWxMb2NhdGlvbihJRmlndXJlIHBhcmVudCkgewotCQlyZXR1cm4gcGFyZW50LmdldEJvdW5kcygpLmdldEJvdHRvbSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYjQzYzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Gb3JrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSW5pdGlhbE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkpvaW5Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5NZXJnZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsQ29ubmVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsQ29ubmVjdGlvbkVkaXRQb2xpY3kgewotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGdldFNlbWFudGljSG9zdCgpIHsKLQkJcmV0dXJuIGhvc3QoKS5nZXRNb2RlbCgpICE9IG51bGwgPyBzdXBlci5nZXRTZW1hbnRpY0hvc3QoKSA6IG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hPbkFjdGl2YXRlKCkgewkJCi0JCXN1cGVyLnJlZnJlc2hPbkFjdGl2YXRlKCk7Ci0JCQotCQlFZGl0UGFydCBlcCA9IGdldEhvc3QoKTsKLQkJaWYoZXAgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpIHsKLQkJCURpYWdyYW1FZGl0b3JVdGlsLmluaXRpYWxpemVPbkFjdGl2YXRlKChEaWFncmFtRWRpdFBhcnQpIGVwKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCUVPYmplY3QgbW9kZWxPYmplY3QgPSAoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJRU9iamVjdCBuZXh0VmFsdWU7Ci0JCWludCBub2RlVklEOwotCQlmb3IgKEl0ZXJhdG9yIHZhbHVlcyA9ICgoQWN0aXZpdHkpIG1vZGVsT2JqZWN0KS5nZXROb2RlcygpLml0ZXJhdG9yKCk7IHZhbHVlcwotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQluZXh0VmFsdWUgPSAoRU9iamVjdCkgdmFsdWVzLm5leHQoKTsKLQkJCS8vIG1vZGlmaWVkIFNUQVJUCi0JCQkvLyBUbyBhdm9pZCB0aGUgQWN0aXZpdHlOb2RlIHNob3cgaW4gZHVwbGljYXRlIHBsYWNlcwotCQkJaWYgKG5leHRWYWx1ZSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJCWlmICghKChBY3Rpdml0eU5vZGUpIG5leHRWYWx1ZSkuZ2V0SW5QYXJ0aXRpb25zKCkuaXNFbXB0eSgpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8vIG1vZGlmaWVkIEVORAotCQkJbm9kZVZJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldE5vZGVWaXN1YWxJRCh2aWV3T2JqZWN0LCBuZXh0VmFsdWUpOwotCQkJc3dpdGNoIChub2RlVklEKSB7Ci0JCQljYXNlIEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEZvcmtOb2RlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBJbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl9Ci0JCX0KLQkJZm9yIChJdGVyYXRvciB2YWx1ZXMgPSAoKEFjdGl2aXR5KSBtb2RlbE9iamVjdCkuZ2V0R3JvdXBzKCkuaXRlcmF0b3IoKTsgdmFsdWVzCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCW5leHRWYWx1ZSA9IChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpOwotCQkJbm9kZVZJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldE5vZGVWaXN1YWxJRCh2aWV3T2JqZWN0LCBuZXh0VmFsdWUpOwotCQkJaWYgKEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWSUQpIHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlpZiAodmlldyBpbnN0YW5jZW9mIEVkZ2UpIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gdmlldy5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eUVkZ2UpIHsKLQkJCQlpZiAoKChBY3Rpdml0eUVkZ2UpIGVsZW1lbnQpLmdldFNvdXJjZSgpID09IG51bGwKLQkJCQkJCXx8ICgoQWN0aXZpdHlFZGdlKSBlbGVtZW50KS5nZXRUYXJnZXQoKSA9PSBudWxsKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKQotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiAodmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKSB8fCAodmlldy5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBFTW9kZWxFbGVtZW50ICYmIEJyaWRnZUhlbHBlcgotCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpIHZpZXcuZ2V0RWxlbWVudCgpKSAhPSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0Nvbm5lY3Rpb25zTGlzdCgpIHsKLQkJLy8JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCi0JCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgKChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQlyZXR1cm4gbmV3IEFycmF5TGlzdChhY3QuZ2V0RWRnZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0U291cmNlRWxlbWVudChFT2JqZWN0IHJlbGF0aW9uc2hpcCkgewotCQlpZiAocmVsYXRpb25zaGlwIGluc3RhbmNlb2YgQWN0aXZpdHlFZGdlKSB7Ci0JCQlyZXR1cm4gKChBY3Rpdml0eUVkZ2UpIHJlbGF0aW9uc2hpcCkuZ2V0U291cmNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0VGFyZ2V0RWxlbWVudChFT2JqZWN0IHJlbGF0aW9uc2hpcCkgewotCQlpZiAocmVsYXRpb25zaGlwIGluc3RhbmNlb2YgQWN0aXZpdHlFZGdlKSB7Ci0JCQlyZXR1cm4gKChBY3Rpdml0eUVkZ2UpIHJlbGF0aW9uc2hpcCkuZ2V0VGFyZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkSW5jbHVkZUNvbm5lY3Rpb24oRWRnZSBjb25uZWN0b3IsCi0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXJldHVybiBzdXBlci5zaG91bGRJbmNsdWRlQ29ubmVjdGlvbihjb25uZWN0b3IsIGNoaWxkcmVuKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgewotCQlMaXN0IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWNyZWF0ZWRWaWV3cy5hZGRBbGwocmVmcmVzaFNlbWFudGljQ2hpbGRyZW4oKSk7Ci0JCUxpc3QgY3JlYXRlZENvbm5lY3Rpb25WaWV3cyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWNyZWF0ZWRDb25uZWN0aW9uVmlld3MuYWRkQWxsKHJlZnJlc2hTZW1hbnRpY0Nvbm5lY3Rpb25zKCkpOwotCQljcmVhdGVkQ29ubmVjdGlvblZpZXdzLmFkZEFsbChyZWZyZXNoQ29ubmVjdGlvbnMoKSk7Ci0KLQkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7Ci0JCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXIKLQkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQotCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7Ci0JCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsKLQkJfQotCi0JCWNyZWF0ZWRWaWV3cy5hZGRBbGwoY3JlYXRlZENvbm5lY3Rpb25WaWV3cyk7Ci0JCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gbXlMaW5rRGVzY3JpcHRvcnMgPSBuZXcgTGlua2VkTGlzdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTWFwIG15RU9iamVjdDJWaWV3TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gcmVmcmVzaENvbm5lY3Rpb25zKCkgewotCQl0cnkgewotCQkJY29sbGVjdEFsbExpbmtzKGdldERpYWdyYW0oKSk7Ci0JCQlDb2xsZWN0aW9uIGV4aXN0aW5nTGlua3MgPSBuZXcgTGlua2VkTGlzdChnZXREaWFncmFtKCkuZ2V0RWRnZXMoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGRpYWdyYW1MaW5rcyA9IGV4aXN0aW5nTGlua3MuaXRlcmF0b3IoKTsgZGlhZ3JhbUxpbmtzCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRWRnZSBuZXh0RGlhZ3JhbUxpbmsgPSAoRWRnZSkgZGlhZ3JhbUxpbmtzLm5leHQoKTsKLQkJCQlFT2JqZWN0IGRpYWdyYW1MaW5rT2JqZWN0ID0gbmV4dERpYWdyYW1MaW5rLmdldEVsZW1lbnQoKTsKLQkJCQlFT2JqZWN0IGRpYWdyYW1MaW5rU3JjID0gbmV4dERpYWdyYW1MaW5rLmdldFNvdXJjZSgpCi0JCQkJCQkuZ2V0RWxlbWVudCgpOwotCQkJCUVPYmplY3QgZGlhZ3JhbUxpbmtEc3QgPSBuZXh0RGlhZ3JhbUxpbmsuZ2V0VGFyZ2V0KCkKLQkJCQkJCS5nZXRFbGVtZW50KCk7Ci0JCQkJaW50IGRpYWdyYW1MaW5rVmlzdWFsSUQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0VmlzdWFsSUQobmV4dERpYWdyYW1MaW5rKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIG1vZGVsTGlua0Rlc2NyaXB0b3JzID0gbXlMaW5rRGVzY3JpcHRvcnMKLQkJCQkJCS5pdGVyYXRvcigpOyBtb2RlbExpbmtEZXNjcmlwdG9ycy5oYXNOZXh0KCk7KSB7Ci0JCQkJCUxpbmtEZXNjcmlwdG9yIG5leHRMaW5rRGVzY3JpcHRvciA9IChMaW5rRGVzY3JpcHRvcikgbW9kZWxMaW5rRGVzY3JpcHRvcnMKLQkJCQkJCQkubmV4dCgpOwotCQkJCQlpZiAoZGlhZ3JhbUxpbmtPYmplY3QgPT0gbmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCQkJLmdldExpbmtFbGVtZW50KCkKLQkJCQkJCQkmJiBkaWFncmFtTGlua1NyYyA9PSBuZXh0TGlua0Rlc2NyaXB0b3IuZ2V0U291cmNlKCkKLQkJCQkJCQkmJiBkaWFncmFtTGlua0RzdCA9PSBuZXh0TGlua0Rlc2NyaXB0b3IKLQkJCQkJCQkJCS5nZXREZXN0aW5hdGlvbigpCi0JCQkJCQkJJiYgZGlhZ3JhbUxpbmtWaXN1YWxJRCA9PSBuZXh0TGlua0Rlc2NyaXB0b3IKLQkJCQkJCQkJCS5nZXRWaXN1YWxJRCgpKSB7Ci0JCQkJCQlkaWFncmFtTGlua3MucmVtb3ZlKCk7Ci0JCQkJCQltb2RlbExpbmtEZXNjcmlwdG9ycy5yZW1vdmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWRlbGV0ZVZpZXdzKGV4aXN0aW5nTGlua3MuaXRlcmF0b3IoKSk7Ci0JCQlyZXR1cm4gY3JlYXRlQ29ubmVjdGlvbnMobXlMaW5rRGVzY3JpcHRvcnMpOwotCQl9IGZpbmFsbHkgewotCQkJbXlMaW5rRGVzY3JpcHRvcnMuY2xlYXIoKTsKLQkJCW15RU9iamVjdDJWaWV3TWFwLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RBbGxMaW5rcyhWaWV3IHZpZXcpIHsKLQkJRU9iamVjdCBtb2RlbEVsZW1lbnQgPSB2aWV3LmdldEVsZW1lbnQoKTsKLQkJaW50IGRpYWdyYW1FbGVtZW50VmlzdWFsSUQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOwotCQlzd2l0Y2ggKGRpYWdyYW1FbGVtZW50VmlzdWFsSUQpIHsKLQkJY2FzZSBBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgSW5pdGlhbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIEpvaW5Ob2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIEFjdGl2aXR5RWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQlteUVPYmplY3QyVmlld01hcC5wdXQobW9kZWxFbGVtZW50LCB2aWV3KTsKLQkJCXN0b3JlTGlua3MobW9kZWxFbGVtZW50LCBnZXREaWFncmFtKCkpOwotCQl9Ci0JCWRlZmF1bHQ6IHsKLQkJfQotCQkJZm9yIChJdGVyYXRvciBjaGlsZHJlbiA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaGlsZHJlbgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkcmVuLm5leHQoKTsKLQkJCQljb2xsZWN0QWxsTGlua3MoY2hpbGRWaWV3KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gY3JlYXRlQ29ubmVjdGlvbnMoQ29sbGVjdGlvbiBsaW5rRGVzY3JpcHRvcnMpIHsKLQkJaWYgKGxpbmtEZXNjcmlwdG9ycy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCUxpc3QgYWRhcHRlcnMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGxpbmtEZXNjcmlwdG9yc0l0ZXJhdG9yID0gbGlua0Rlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGxpbmtEZXNjcmlwdG9yc0l0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCWZpbmFsIExpbmtEZXNjcmlwdG9yIG5leHRMaW5rRGVzY3JpcHRvciA9IChMaW5rRGVzY3JpcHRvcikgbGlua0Rlc2NyaXB0b3JzSXRlcmF0b3IKLQkJCQkJLm5leHQoKTsKLQkJCUVkaXRQYXJ0IHNvdXJjZUVkaXRQYXJ0ID0gZ2V0RWRpdFBhcnRGb3IobmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCS5nZXRTb3VyY2UoKSk7Ci0JCQlFZGl0UGFydCB0YXJnZXRFZGl0UGFydCA9IGdldEVkaXRQYXJ0Rm9yKG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkuZ2V0RGVzdGluYXRpb24oKSk7Ci0JCQlpZiAoc291cmNlRWRpdFBhcnQgPT0gbnVsbCB8fCB0YXJnZXRFZGl0UGFydCA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlDcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3QuQ29ubmVjdGlvblZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0LkNvbm5lY3Rpb25WaWV3RGVzY3JpcHRvcigKLQkJCQkJbmV4dExpbmtEZXNjcmlwdG9yLmdldFNlbWFudGljQWRhcHRlcigpLCBudWxsLAotCQkJCQlWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLCAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCQkJCS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOwotCQkJQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0IGNjciA9IG5ldyBDcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3QoCi0JCQkJCWRlc2NyaXB0b3IpOwotCQkJY2NyLnNldFR5cGUoUmVxdWVzdENvbnN0YW50cy5SRVFfQ09OTkVDVElPTl9TVEFSVCk7Ci0JCQljY3Iuc2V0U291cmNlRWRpdFBhcnQoc291cmNlRWRpdFBhcnQpOwotCQkJc291cmNlRWRpdFBhcnQuZ2V0Q29tbWFuZChjY3IpOwotCQkJY2NyLnNldFRhcmdldEVkaXRQYXJ0KHRhcmdldEVkaXRQYXJ0KTsKLQkJCWNjci5zZXRUeXBlKFJlcXVlc3RDb25zdGFudHMuUkVRX0NPTk5FQ1RJT05fRU5EKTsKLQkJCUNvbW1hbmQgY21kID0gdGFyZ2V0RWRpdFBhcnQuZ2V0Q29tbWFuZChjY3IpOwotCQkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQlleGVjdXRlQ29tbWFuZChjbWQpOwotCQkJCUlBZGFwdGFibGUgdmlld0FkYXB0ZXIgPSAoSUFkYXB0YWJsZSkgY2NyLmdldE5ld09iamVjdCgpOwotCQkJCWlmICh2aWV3QWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXJzLmFkZCh2aWV3QWRhcHRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhZGFwdGVyczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFZGl0UGFydCBnZXRFZGl0UGFydEZvcihFT2JqZWN0IG1vZGVsRWxlbWVudCkgewotCQlWaWV3IHZpZXcgPSAoVmlldykgbXlFT2JqZWN0MlZpZXdNYXAuZ2V0KG1vZGVsRWxlbWVudCk7Ci0JCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCXJldHVybiAoRWRpdFBhcnQpIGdldEhvc3QoKS5nZXRWaWV3ZXIoKS5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KAotCQkJCQl2aWV3KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKkBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVMaW5rcyhFT2JqZWN0IGNvbnRhaW5lciwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCUVDbGFzcyBjb250YWluZXJNZXRhY2xhc3MgPSBjb250YWluZXIuZUNsYXNzKCk7Ci0JCXN0b3JlRmVhdHVyZU1vZGVsRmFjZXRMaW5rcyhjb250YWluZXIsIGNvbnRhaW5lck1ldGFjbGFzcywgZGlhZ3JhbSk7Ci0JCXN0b3JlVHlwZU1vZGVsRmFjZXRMaW5rcyhjb250YWluZXIsIGNvbnRhaW5lck1ldGFjbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVR5cGVNb2RlbEZhY2V0TGlua3MoRU9iamVjdCBjb250YWluZXIsCi0JCQlFQ2xhc3MgY29udGFpbmVyTWV0YWNsYXNzKSB7Ci0JCXN0b3JlVHlwZU1vZGVsRmFjZXRMaW5rc19Db250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgY29udGFpbmVyTWV0YWNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVHlwZU1vZGVsRmFjZXRMaW5rc19Db250cm9sRmxvd18zMDAxKEVPYmplY3QgY29udGFpbmVyLAotCQkJRUNsYXNzIGNvbnRhaW5lck1ldGFjbGFzcykgewotCQlpZiAoVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLmlzU3VwZXJUeXBlT2YoCi0JCQkJY29udGFpbmVyTWV0YWNsYXNzKSkgewotCQkJZm9yIChJdGVyYXRvciB2YWx1ZXMgPSAoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGNvbnRhaW5lcikKLQkJCQkJLmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgdmFsdWVzLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IG5leHRWYWx1ZSA9ICgoRU9iamVjdCkgdmFsdWVzLm5leHQoKSk7Ci0JCQkJaW50IGxpbmtWSUQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKG5leHRWYWx1ZSk7Ci0JCQkJaWYgKENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEID09IGxpbmtWSUQpIHsKLQkJCQkJT2JqZWN0IHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0ID0gKChBY3Rpdml0eUVkZ2UpIG5leHRWYWx1ZSkKLQkJCQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCQkJCWlmIChzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCUVPYmplY3QgZHN0ID0gKEVPYmplY3QpIHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0OwotCQkJCQkJc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQgPSAoKEFjdGl2aXR5RWRnZSkgbmV4dFZhbHVlKQotCQkJCQkJCQkuZ2V0U291cmNlKCk7Ci0JCQkJCQlpZiAoc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQkJRU9iamVjdCBzcmMgPSAoRU9iamVjdCkgc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQ7Ci0JCQkJCQkJbXlMaW5rRGVzY3JpcHRvcnMuYWRkKG5ldyBMaW5rRGVzY3JpcHRvcihzcmMsIGRzdCwKLQkJCQkJCQkJCW5leHRWYWx1ZSwKLQkJCQkJCQkJCVVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxLCBsaW5rVklEKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKkBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVGZWF0dXJlTW9kZWxGYWNldExpbmtzKEVPYmplY3QgY29udGFpbmVyLAotCQkJRUNsYXNzIGNvbnRhaW5lck1ldGFjbGFzcywgRGlhZ3JhbSBkaWFncmFtKSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaWFncmFtIGdldERpYWdyYW0oKSB7Ci0JCXJldHVybiAoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKS5nZXREaWFncmFtKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgY2xhc3MgTGlua0Rlc2NyaXB0b3IgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIEVPYmplY3QgbXlTb3VyY2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgRU9iamVjdCBteURlc3RpbmF0aW9uOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIEVPYmplY3QgbXlMaW5rRWxlbWVudDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgbXlWaXN1YWxJRDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBJQWRhcHRhYmxlIG15U2VtYW50aWNBZGFwdGVyOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgTGlua0Rlc2NyaXB0b3IoRU9iamVjdCBzb3VyY2UsIEVPYmplY3QgZGVzdGluYXRpb24sCi0JCQkJRU9iamVjdCBsaW5rRWxlbWVudCwgSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlLCBpbnQgbGlua1ZJRCkgewotCQkJdGhpcyhzb3VyY2UsIGRlc3RpbmF0aW9uLCBsaW5rVklEKTsKLQkJCW15TGlua0VsZW1lbnQgPSBsaW5rRWxlbWVudDsKLQkJCWZpbmFsIElFbGVtZW50VHlwZSBlbGVtZW50VHlwZUNvcHkgPSBlbGVtZW50VHlwZTsKLQkJCW15U2VtYW50aWNBZGFwdGVyID0gbmV3IEVPYmplY3RBZGFwdGVyKGxpbmtFbGVtZW50KSB7Ci0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBlbGVtZW50VHlwZUNvcHk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgTGlua0Rlc2NyaXB0b3IoRU9iamVjdCBzb3VyY2UsIEVPYmplY3QgZGVzdGluYXRpb24sCi0JCQkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlLCBpbnQgbGlua1ZJRCkgewotCQkJdGhpcyhzb3VyY2UsIGRlc3RpbmF0aW9uLCBsaW5rVklEKTsKLQkJCW15TGlua0VsZW1lbnQgPSBudWxsOwotCQkJZmluYWwgSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlQ29weSA9IGVsZW1lbnRUeXBlOwotCQkJbXlTZW1hbnRpY0FkYXB0ZXIgPSBuZXcgSUFkYXB0YWJsZSgpIHsKLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIGVsZW1lbnRUeXBlQ29weTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTGlua0Rlc2NyaXB0b3IoRU9iamVjdCBzb3VyY2UsIEVPYmplY3QgZGVzdGluYXRpb24sIGludCBsaW5rVklEKSB7Ci0JCQlteVNvdXJjZSA9IHNvdXJjZTsKLQkJCW15RGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKLQkJCW15VmlzdWFsSUQgPSBsaW5rVklEOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGdldFNvdXJjZSgpIHsKLQkJCXJldHVybiBteVNvdXJjZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXREZXN0aW5hdGlvbigpIHsKLQkJCXJldHVybiBteURlc3RpbmF0aW9uOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGdldExpbmtFbGVtZW50KCkgewotCQkJcmV0dXJuIG15TGlua0VsZW1lbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGludCBnZXRWaXN1YWxJRCgpIHsKLQkJCXJldHVybiBteVZpc3VhbElEOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBJQWRhcHRhYmxlIGdldFNlbWFudGljQWRhcHRlcigpIHsKLQkJCXJldHVybiBteVNlbWFudGljQWRhcHRlcjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlGaW5hbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUZpbmFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyMWI1ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUZpbmFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpbmFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlGaW5hbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlGaW5hbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTA0MGNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RmluYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpbmFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlGaW5hbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUZpbmFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzOWIwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUZpbmFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkNvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkNvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlGaW5hbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpbmFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNjID0gZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChyZXEKLQkJCQkuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlpZiAodmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcS5zZXRFbGVtZW50VG9EZXN0cm95KHZpZXcpOwotCQl9Ci0JCWNjLmFkZChnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSkpOwotCQlyZXR1cm4gY2MudW53cmFwKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCWlmIChVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotLy8JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKQotLy8JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBudWxsKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCUVPYmplY3QgdGFyZ2V0RU9iamVjdCA9IHJlcS5nZXRUYXJnZXQoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUKLQkJCQl8fCBmYWxzZSA9PSB0YXJnZXRFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJQWN0aXZpdHlOb2RlIHRhcmdldCA9IChBY3Rpdml0eU5vZGUpIHRhcmdldEVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlX0VkZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZChyZXEsIGNvbnRhaW5lciwKLQkJCQlzb3VyY2UsIHRhcmdldCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQotCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7Ci0vLwkJY2FzZSBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDoKLS8vCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kKHJlcSkpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmdtZi5kaWFncmFtLmVkaXQucG9saWNpZXMuVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kjZ2V0Q3JlYXRlT3V0Z29pbmcob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0KQotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZU91dGdvaW5nKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0KLQkJLy8gVmFsaWRhdGlvbiBBY3Rpdml0eUZpbmFsTm9kZSBub2RlIHNob3VsZCBhbGxvdyBvbmx5IG9uZSBvdXRnb2luZyBjb25uZWN0aW9uLgotCQlpZiAocmVxLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQWN0aXZpdHlGaW5hbE5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVPdXRnb2luZyhyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNDgwOTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kcy5EdXBsaWNhdGVFT2JqZWN0c0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EdXBsaWNhdGVFbGVtZW50c1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5BY3Rpdml0eUZpbmFsTm9kZUNyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuRGVjaXNpb25Ob2RlQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkZvcmtOb2RlQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkluaXRpYWxOb2RlQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkpvaW5Ob2RlQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLk1lcmdlTm9kZUNyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlGaW5hbE5vZGVfMTAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQWN0aXZpdHlGaW5hbE5vZGVDcmVhdGVDb21tYW5kKHJlcSkpOwotCQl9Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuTWVyZ2VOb2RlXzEwMDIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IE1lcmdlTm9kZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Gb3JrTm9kZV8xMDAzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBGb3JrTm9kZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsTm9kZV8xMDA0ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBJbml0aWFsTm9kZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5EZWNpc2lvbk5vZGVfMTAwNSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgRGVjaXNpb25Ob2RlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkpvaW5Ob2RlXzEwMDYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IEpvaW5Ob2RlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8xMDA4ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfR3JvdXAoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGVDb21tYW5kKHJlcSkpOwotCQl9Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IEFjdGl2aXR5UGFyYW1ldGVyTm9kZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVDcmVhdGVDb21tYW5kKHJlcSkpOwotCQl9Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBBY3Rpdml0eVBhcmFtZXRlck5vZGVDcmVhdGVDb21tYW5kKHJlcSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RHVwbGljYXRlQ29tbWFuZChEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QgcmVxKSB7Ci0JCS8vCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJLy8JCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJLy8JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEdXBsaWNhdGVBbnl0aGluZ0NvbW1hbmQoZWRpdGluZ0RvbWFpbiwgcmVxKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBEdXBsaWNhdGVBbnl0aGluZ0NvbW1hbmQgZXh0ZW5kcwotCQkJRHVwbGljYXRlRU9iamVjdHNDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIER1cGxpY2F0ZUFueXRoaW5nQ29tbWFuZCgKLQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLAotCQkJCUR1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCByZXEpIHsKLQkJCXN1cGVyKGVkaXRpbmdEb21haW4sIHJlcS5nZXRMYWJlbCgpLCByZXEKLQkJCQkJLmdldEVsZW1lbnRzVG9CZUR1cGxpY2F0ZWQoKSwgcmVxCi0JCQkJCS5nZXRBbGxEdXBsaWNhdGVkRWxlbWVudHNNYXAoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExMjdkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMKLQkJQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNGY5NTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZTU2NTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkNvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkNvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0vLwkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpCi0vLwkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJRU9iamVjdCB0YXJnZXRFT2JqZWN0ID0gcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0RU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kKHJlcSwgY29udGFpbmVyLAotCQkJCXNvdXJjZSwgdGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlCi0JICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLS8vCQljYXNlIENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEOgotLy8JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQocmVxKSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDFlMmMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMKLQkJQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTFkOWZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMTgwMDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNjID0gZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChyZXEKLQkJCQkuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlpZiAodmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcS5zZXRFbGVtZW50VG9EZXN0cm95KHZpZXcpOwotCQl9Ci0JCWNjLmFkZChnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSkpOwotCQlyZXR1cm4gY2MudW53cmFwKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCWlmIChVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotLy8JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKQotLy8JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBudWxsKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCUVPYmplY3QgdGFyZ2V0RU9iamVjdCA9IHJlcS5nZXRUYXJnZXQoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUKLQkJCQl8fCBmYWxzZSA9PSB0YXJnZXRFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJQWN0aXZpdHlOb2RlIHRhcmdldCA9IChBY3Rpdml0eU5vZGUpIHRhcmdldEVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlX0VkZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZChyZXEsIGNvbnRhaW5lciwKLQkJCQlzb3VyY2UsIHRhcmdldCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQotCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7Ci0vLwkJY2FzZSBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDoKLS8vCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kKHJlcSkpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uMkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uMkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4ZGE4My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbjJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb24yQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbjJHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb24yR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlMGM1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbjJHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb24ySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb24ySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzFlZTMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbjJJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCWFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChjYywgcmVxLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCWNjLmFkZChnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSkpOwotCQlyZXR1cm4gY2MudW53cmFwKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChDb21wb3VuZENvbW1hbmQgY21kLAotCQkJYm9vbGVhbiBjb25maXJtKSB7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXQubmV4dCgpOwotCQkJc3dpdGNoIChVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7Ci0JCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCWZvciAoSXRlcmF0b3IgY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdAotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJTm9kZSBjbm9kZSA9IChOb2RlKSBjaXQubmV4dCgpOwotCQkJCQlzd2l0Y2ggKFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7Ci0JCQkJCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCQkJY21kLmFkZChnZXREZXN0cm95RWxlbWVudENvbW1hbmQoY25vZGUsIGNvbmZpcm0pKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25DYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVkOTk4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJLy8gRGVsZXRlIHRoZSB2aWV3IGlmIGFjdGl2aXR5IHBhcnRpdGlvbiBpcyBub3QgcGFydCBvZiB0aGUgYWN0aXZpdHlub2RlLgotCQlpZih2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSl7Ci0JCQlpZighKChBY3Rpdml0eU5vZGUpdmlldy5nZXRFbGVtZW50KCkpLmdldEluUGFydGl0aW9ucygpLmNvbnRhaW5zKCgoVmlldylnZXRIb3N0KCkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIGF2b2lkIHRoZSBkdXBsaWNhdGUgbGlua3MgZ2VuZXJhdGlvbi4KLQkgKiBTZXQgcGFyZW50IGNhbm9uaWNhbEVkaXRQb2xpY3kgdG8gZmFsc2UuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5hYmxlUmVmcmVzaChib29sZWFuIGVuYWJsZSkgewotCQlFZGl0UGFydCBwYXJ0ICA9IGdldEhvc3QoKS5nZXRQYXJlbnQoKTsKLQkJaWYocGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5RWRpdFBhcnQpewotCQkJT2JqZWN0IHZpZXcgPSBwYXJ0LmdldE1vZGVsKCk7Ci0JCQlFT2JqZWN0IHNlbWFudGljSG9zdCA9ICgoVmlldyl2aWV3KS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoc2VtYW50aWNIb3N0ICE9IG51bGwpIHsKLQkJCQlMaXN0IGNlcHMgPSBDYW5vbmljYWxFZGl0UG9saWN5LmdldFJlZ2lzdGVyZWRFZGl0UG9saWNpZXMoc2VtYW50aWNIb3N0KTsKLQkJCQlmb3IgKCBpbnQgaSA9IDA7IGkgPCBjZXBzLnNpemUoKTsgaSsrICkgewotCQkJCQlDYW5vbmljYWxFZGl0UG9saWN5IGNlcCA9IChDYW5vbmljYWxFZGl0UG9saWN5KWNlcHMuZ2V0KGkpOwotCQkJCQljZXAuZW5hYmxlUmVmcmVzaChlbmFibGUpOyAKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuZW5hYmxlUmVmcmVzaChlbmFibGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI3Y2YyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25HcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25JdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNjQyODEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25JdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNjID0gZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChyZXEKLQkJCQkuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNjLCByZXEuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlpZiAodmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcS5zZXRFbGVtZW50VG9EZXN0cm95KHZpZXcpOwotCQl9Ci0JCWNjLmFkZChnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSkpOwotCQlyZXR1cm4gY2MudW53cmFwKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChDb21wb3VuZENvbW1hbmQgY21kLAotCQkJYm9vbGVhbiBjb25maXJtKSB7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXQubmV4dCgpOwotCQkJc3dpdGNoIChVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7Ci0JCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJZm9yIChJdGVyYXRvciBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0Ci0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7Ci0JCQkJCXN3aXRjaCAoVU1MVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsKLQkJCQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJCQljbWQuYWRkKGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChjbm9kZSwgY29uZmlybSkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTUwNjQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFydGl0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzCi0JCUNhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCUVPYmplY3QgbW9kZWxPYmplY3QgPSAoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJRU9iamVjdCBuZXh0VmFsdWU7Ci0JCWludCBub2RlVklEOwotCQlmb3IgKEl0ZXJhdG9yIHZhbHVlcyA9ICgoQWN0aXZpdHlQYXJ0aXRpb24pIG1vZGVsT2JqZWN0KQotCQkJCS5nZXRTdWJwYXJ0aXRpb25zKCkuaXRlcmF0b3IoKTsgdmFsdWVzLmhhc05leHQoKTspIHsKLQkJCW5leHRWYWx1ZSA9IChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpOwotCQkJbm9kZVZJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldE5vZGVWaXN1YWxJRCh2aWV3T2JqZWN0LCBuZXh0VmFsdWUpOwotCQkJaWYgKEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVklEKSB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkKLQkJCQkJJiYgKHZpZXcuZ2V0RWxlbWVudCgpID09IG51bGwgfHwgdmlldy5nZXRFbGVtZW50KCkKLQkJCQkJCQkuZUlzUHJveHkoKSk7Ci0JCX0KLQkJaW50IG5vZGVWSUQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOwotCQlzd2l0Y2ggKG5vZGVWSUQpIHsKLQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0Yzc2ZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5BY3Rpdml0eVBhcnRpdGlvbkNyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kKLQkJZXh0ZW5kcyBVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8yMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlQYXJ0aXRpb25fU3VicGFydGl0aW9uKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IEFjdGl2aXR5UGFydGl0aW9uQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NmI3NTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcnRpdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzCi0JCUNhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJRU9iamVjdCBtb2RlbE9iamVjdCA9ICgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlFT2JqZWN0IG5leHRWYWx1ZTsKLQkJaW50IG5vZGVWSUQ7Ci0JCS8vIG1vZGlmaWVkIHRvIGNoZWNrIEFjdGl2aXR5UGFydGl0aW9uIG9yIG5vdC4gdG8gYXZvaWQgY2xhc3NjYXN0IGV4Y2VwdGlvbi4KLQkJaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb24pIHsKLQkJCWZvciAoSXRlcmF0b3IgdmFsdWVzID0gKChBY3Rpdml0eVBhcnRpdGlvbikgbW9kZWxPYmplY3QpCi0JCQkJCS5nZXRTdWJwYXJ0aXRpb25zKCkuaXRlcmF0b3IoKTsgdmFsdWVzLmhhc05leHQoKTspIHsKLQkJCQluZXh0VmFsdWUgPSAoRU9iamVjdCkgdmFsdWVzLm5leHQoKTsKLQkJCQlub2RlVklEID0gVU1MVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlld09iamVjdCwKLQkJCQkJCW5leHRWYWx1ZSk7Ci0JCQkJaWYgKEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVklEKSB7Ci0JCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJaWYgKHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKQotCQkJCQkmJiAodmlldy5nZXRFbGVtZW50KCkgPT0gbnVsbCB8fCB2aWV3LmdldEVsZW1lbnQoKQotCQkJCQkJCS5lSXNQcm94eSgpKTsKLQkJfQotCQlpbnQgbm9kZVZJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7Ci0JCXN3aXRjaCAobm9kZVZJRCkgewotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNWYxYjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5jb21tYW5kcy5BY3Rpdml0eVBhcnRpdGlvbkRlc3Ryb3lDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5jb21tYW5kcy5DcmVhdGVBY3Rpdml0eU5vZGVJbkFjdGl2aXR5UGFydGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbXBvc2l0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5FZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuSUVkaXRDb21tYW5kUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLk1vdmVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJ0aXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMgVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8yMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7CQkKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlQYXJ0aXRpb25fU3VicGFydGl0aW9uKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENyZWF0ZUFjdGl2aXR5UGFydGl0aW9uXzIwMDFDb21tYW5kKHJlcSkpOwotCQl9Ci0JCQotCQkvLyBtb2RpZmllZCBTVEFSVAotCQlDb21tYW5kIGNvbW1hbmQgPSBnZXRDcmVhdGVBY3Rpdml0eU5vZGVDb21tYW5kKHJlcSk7Ci0JCWlmIChjb21tYW5kICE9IG51bGwpIHsKLQkJCXJldHVybiBjb21tYW5kOwotCQl9Ci0JCS8vIG1vZGlmaWVkIEVORAotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZUFjdGl2aXR5UGFydGl0aW9uXzIwMDFDb21tYW5kIGV4dGVuZHMKLQkJCUNyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZUFjdGl2aXR5UGFydGl0aW9uXzIwMDFDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIocmVxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eVBhcnRpdGlvbigpOwotCQl9OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJCS5nZXRDb250YWluZXIoKTsKLQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJCX0KLQkJCXJldHVybiBjb250YWluZXI7Ci0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJpdmF0ZSBDb21tYW5kIGdldENyZWF0ZUFjdGl2aXR5Tm9kZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCA9PSByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSA9PSByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLk1lcmdlTm9kZV8xMDAyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLkZvcmtOb2RlXzEwMDMgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkKLQkJCQl8fCBVTUxFbGVtZW50VHlwZXMuSW5pdGlhbE5vZGVfMTAwNCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKQotCQkJCXx8IFVNTEVsZW1lbnRUeXBlcy5EZWNpc2lvbk5vZGVfMTAwNSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKQotCQkJCXx8IFVNTEVsZW1lbnRUeXBlcy5Kb2luTm9kZV8xMDA2ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5RmluYWxOb2RlXzEwMDEgPT0gcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKQotCQkJCXx8IFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSA9PSByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyID09IHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eVBhcnRpdGlvbl9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENyZWF0ZUFjdGl2aXR5Tm9kZUluQWN0aXZpdHlQYXJ0aXRpb24ocmVxKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZ21mLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSNnZXRDcmVhdGVPdXRnb2luZyhvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlT3V0Z29pbmcoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSNnZXREZXN0cm95RWxlbWVudENvbW1hbmQob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3QpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJLyogbW9kaWZ5IFNUQVJUICovCi0JCUNvbXBvc2l0ZUNvbW1hbmQgY2MgPSBuZXcgQ29tcG9zaXRlQ29tbWFuZChEaWFncmFtQ29yZVJlc291cmNlcy5kZWxldGVDb21tYW5kX2xhYmVsKTsKLQkJZ2V0UmVwYXJlbnRpbmdDb21tYW5kKHJlcSwgY2MpOwotCQljYy5jb21wb3NlKG5ldyBDb21tYW5kUHJveHkoZ2V0TVNMV3JhcHBlcihuZXcgQWN0aXZpdHlQYXJ0aXRpb25EZXN0cm95Q29tbWFuZChyZXEsIGdldEhvc3QoKSkpKSk7Ci0JCXJldHVybiBjYy5pc0VtcHR5KCkgPyBudWxsIDogbmV3IElDb21tYW5kUHJveHkoY2MucmVkdWNlKCkpOwotCQkvKiBtb2RpZnkgRU5EICovCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5I2dldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveVJlZmVyZW5jZUNvbW1hbmQoRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBzdXBlci5nZXREZXN0cm95UmVmZXJlbmNlQ29tbWFuZChyZXEpOwotCX0KLQotCQotCS8qKgotCSAqIENvbW1hbmQgdG8gcmVwYXJlbnRpbmcgdGhlIGVsZW1lbnRzIHRvIEFjdGl2aXR5IGJlZm9yZSBkZWxldGluZyB0aGUgQWN0aXZpdHlQYXJ0aXRpb24uCi0gCSAqCi0JICogQHBhcmFtIHJlcXVlc3QgdGhlIHJlcXVlc3QKLQkgKiBAcmV0dXJuIGNvbW1hbmQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZXBhcmVudGluZ0NvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QsIENvbXBvc2l0ZUNvbW1hbmQgY2MpIHsKLQkJSXRlcmF0b3IgZWRpdFBhcnRzID0gZ2V0SG9zdCgpLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLQkJT2JqZWN0IHBhcmVudCAgPSAgKChFZGl0UGFydClnZXRIb3N0KCkpLmdldFBhcmVudCgpOwotCQlFUmVmZXJlbmNlIGZlYXR1cmUgPSBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Ob2RlKCk7Ci0JCQotCQlpZighKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5RWRpdFBhcnQpKXsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCQotCQlWaWV3IGNvbnRhaW5lciA9IChWaWV3KSgoRWRpdFBhcnQpcGFyZW50KS5nZXRBZGFwdGVyKFZpZXcuY2xhc3MpOwotCQkKLQkJRU9iamVjdCBjb250YWluZXJDb250ZXh0ID0gY29udGFpbmVyID09IG51bGwgPyBudWxsIDogVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudChjb250YWluZXIpOwotCQl3aGlsZSAoIGVkaXRQYXJ0cy5oYXNOZXh0KCkgKSB7Ci0JCQlJR3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KWVkaXRQYXJ0cy5uZXh0KCk7Ci0JCQlpZiAoIGVwIGluc3RhbmNlb2YgTGFiZWxFZGl0UGFydCApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJVmlldyB2aWV3ID0gKFZpZXcpZXAuZ2V0QWRhcHRlcihWaWV3LmNsYXNzKTsKLQkJCWlmICggdmlldyA9PSBudWxsICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlFT2JqZWN0IHNlbWFudGljQ29udGV4dCA9IFZpZXdVdGlsLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQodmlldyk7Ci0JCQlpZihzZW1hbnRpY0NvbnRleHQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbikKLQkJCQljb250aW51ZTsKLQkJCQotCQkJCi0JCQkgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JICAgICAgICAgICAgLmdldEVkaXRpbmdEb21haW4oKTsKLQkJCSAKLQkJCWlmICggc2VtYW50aWNDb250ZXh0ID09IG51bGwgKSB7Ci0JCQkJQWRkQ29tbWFuZCBhZGRDb21tYW5kID0gbmV3IEFkZENvbW1hbmQoZWRpdGluZ0RvbWFpbiwgbmV3IEVPYmplY3RBZGFwdGVyKGNvbnRhaW5lciksCi0JCQkJCQkgIG5ldyBFT2JqZWN0QWRhcHRlcih2aWV3KSk7Ci0JCQkJY2MuY29tcG9zZShhZGRDb21tYW5kKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCBjb250YWluZXJDb250ZXh0ICE9IG51bGwgKSB7Ci0JCQkJaWYgKGNvbnRhaW5lckNvbnRleHQuZXF1YWxzKHNlbWFudGljQ29udGV4dC5lQ29udGFpbmVyKCkpCi0JCQkJCQkmJiBmZWF0dXJlID09IHNlbWFudGljQ29udGV4dC5lQ29udGFpbm1lbnRGZWF0dXJlKCkpIHsKLQkJCQkJY2MuY29tcG9zZShuZXcgUmVwYXJlbnRpbmdFbGVtZW50c0NvbW1hbmQocmVxdWVzdCwgc2VtYW50aWNDb250ZXh0KSk7Ci0JCQkJCUFkZENvbW1hbmQgYWRkQ29tbWFuZCA9IG5ldyBBZGRDb21tYW5kKGVkaXRpbmdEb21haW4sIG5ldyBFT2JqZWN0QWRhcHRlcihjb250YWluZXIpLAotCQkJCQkJCSAgbmV3IEVPYmplY3RBZGFwdGVyKHZpZXcpKTsKLQkJCQkJY2MuY29tcG9zZShhZGRDb21tYW5kKTsKLQkJCQl9Ci0JCQkJZWxzZXsKLQkJCQkJQ29tbWFuZCBtb3ZlU2VtYW50aWNDbWQgPQotCQkJCQkoKEFjdGl2aXR5RWRpdFBhcnQpcGFyZW50KS5nZXRDb21tYW5kKAotCQkJCQkJbmV3IEVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXIoCi0JCQkJCQkJbmV3IE1vdmVSZXF1ZXN0KGVkaXRpbmdEb21haW4sIGNvbnRhaW5lckNvbnRleHQsIAotCQkJCQkJCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfTm9kZSgpLAotCQkJCQkJCQkJc2VtYW50aWNDb250ZXh0KSkpOwotCQkJCQlpZihtb3ZlU2VtYW50aWNDbWQgICE9IG51bGwpewotCQkJCQkJY2MuY29tcG9zZShuZXcgQ29tbWFuZFByb3h5KG1vdmVTZW1hbnRpY0NtZCkpOwotCQkJCQl9Ci0vLwkJCQkJY2MuY29tcG9zZShuZXcgUmVwYXJlbnRpbmdFbGVtZW50c0NvbW1hbmQocmVxdWVzdCwgc2VtYW50aWNDb250ZXh0KSk7Ci0JCQkJCS8vbW92ZSBub3RhdGlvbgotCQkJCQlBZGRDb21tYW5kIGFkZENvbW1hbmQgPSBuZXcgQWRkQ29tbWFuZChlZGl0aW5nRG9tYWluLCBuZXcgRU9iamVjdEFkYXB0ZXIoY29udGFpbmVyKSwKLQkJCQkJCQkgIG5ldyBFT2JqZWN0QWRhcHRlcih2aWV3KSk7Ci0JCQkJCWNjLmNvbXBvc2UoYWRkQ29tbWFuZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjYy5pc0VtcHR5KCkgPyBudWxsIDogbmV3IElDb21tYW5kUHJveHkoY2MucmVkdWNlKCkpOwotCX0KLQkKLQlwdWJsaWMgY2xhc3MgUmVwYXJlbnRpbmdFbGVtZW50c0NvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmR7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBFT2JqZWN0IG1vdmVFbGVtZW50OwotCQkKLQkJcHVibGljIFJlcGFyZW50aW5nRWxlbWVudHNDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEsIEVPYmplY3QgZWxlbWVudCkgewotCQkJdGhpcyhEaWFncmFtQ29yZVJlc291cmNlcy5kZWxldGVDb21tYW5kX2xhYmVsLCBlbGVtZW50LCByZXEpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgUmVwYXJlbnRpbmdFbGVtZW50c0NvbW1hbmQoU3RyaW5nIGxhYmVsLCBFT2JqZWN0IGVsZW1lbnRUb0VkaXQsIAotCQkJCUlFZGl0Q29tbWFuZFJlcXVlc3QgcmVxdWVzdCkgewotCQkJc3VwZXIobGFiZWwsIGVsZW1lbnRUb0VkaXQsIHJlcXVlc3QpOwotCQkJdGhpcy5tb3ZlRWxlbWVudCA9IGVsZW1lbnRUb0VkaXQ7IAotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJVmlldyB2aWV3ID0gKFZpZXcpZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCQlpZih2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uKXsKLQkJCQlpZihtb3ZlRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSl7Ci0JCQkJCSgoQWN0aXZpdHlOb2RlKW1vdmVFbGVtZW50KS5nZXRJblBhcnRpdGlvbnMoKS5yZW1vdmUodmlldy5nZXRFbGVtZW50KCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQkJaWYobW92ZUVsZW1lbnQgIT0gbnVsbCkgcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Db250cm9sRmxvd0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0NvbnRyb2xGbG93SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDg3ZTNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0NvbnRyb2xGbG93SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xGbG93SXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0RlY2lzaW9uTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0RlY2lzaW9uTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1ZjA2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9EZWNpc2lvbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVjaXNpb25Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9EZWNpc2lvbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvRGVjaXNpb25Ob2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFlMTc5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9EZWNpc2lvbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlY2lzaW9uTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvRGVjaXNpb25Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvRGVjaXNpb25Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDMzNTI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0RlY2lzaW9uTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd0NyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkRlY2lzaW9uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVjaXNpb25Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgbnVsbCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlCi0JCQkJfHwgZmFsc2UgPT0gdGFyZ2V0RU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCUFjdGl2aXR5Tm9kZSB0YXJnZXQgPSAoQWN0aXZpdHlOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9FZGdlKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsCi0JCQkJc291cmNlLCB0YXJnZXQpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kjZ2V0Q3JlYXRlSW5jb21pbmdDb21wbGV0ZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlSW5jb21pbmdDb21wbGV0ZShDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQkvLyBhbGxvdyBtYXhpbXVtIG9ubHkgb25lIGluY29taW5nIGNvbm5lY3Rpb24gdG8gZGVjaXNpb24gbm9kZSBmcm9tIG90aGVyIGFjdGl2aXR5IG5vZGUKLQkJLy8KLQkJaWYgKHJlcS5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIERlY2lzaW9uTm9kZSkgewotCQkJRGVjaXNpb25Ob2RlIGRlY2lzaW9uID0gKERlY2lzaW9uTm9kZSkgcmVxLmdldFRhcmdldCgpOwkJCQotCQkJZm9yIChBY3Rpdml0eUVkZ2UgbGluayA6IGRlY2lzaW9uLmdldEluY29taW5ncygpKSB7Ci0JCQkJaWYobGluay5lQ29udGFpbmVyKCkgIT0gbnVsbCAmJiBsaW5rLmdldFNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVJbmNvbWluZ0NvbXBsZXRlKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvRm9ya05vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVhZjgwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvRm9ya05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvRm9ya05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTVlMWY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0ZvcmtOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMgVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvRm9ya05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0ZWI2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRm9ya05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZvcmtOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0vLwkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpCi0vLwkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJRU9iamVjdCB0YXJnZXRFT2JqZWN0ID0gcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0RU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kKHJlcSwgY29udGFpbmVyLAotCQkJCXNvdXJjZSwgdGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlCi0JICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLS8vCQljYXNlIENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEOgotLy8JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQocmVxKSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5I2dldENyZWF0ZUluY29taW5nQ29tcGxldGUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0KQotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUluY29taW5nQ29tcGxldGUoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJaWYgKHJlcS5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIEZvcmtOb2RlKSB7Ci0JCQlGb3JrTm9kZSBmb3JrID0gKEZvcmtOb2RlKSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCQlMaXN0IGxpc3QgPSBmb3JrLmdldEluY29taW5ncygpOwotCQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+PSAxKSB7Ci0JCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUluY29taW5nQ29tcGxldGUocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Jbml0aWFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0luaXRpYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTU2ZGE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0luaXRpYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Jbml0aWFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Jbml0aWFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MjUzOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvSW5pdGlhbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Jbml0aWFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0luaXRpYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmMwMGUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0luaXRpYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSW5pdGlhbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0vLwkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpCi0vLwkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJRU9iamVjdCB0YXJnZXRFT2JqZWN0ID0gcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0RU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kKHJlcSwgY29udGFpbmVyLAotCQkJCXNvdXJjZSwgdGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlCi0JICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLS8vCQljYXNlIENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEOgotLy8JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQocmVxKSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZ21mLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSNnZXRDcmVhdGVJbmNvbWluZ0NvbXBsZXRlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVJbmNvbWluZ0NvbXBsZXRlKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChyZXEuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBJbml0aWFsTm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUluY29taW5nQ29tcGxldGUocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Kb2luTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0pvaW5Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmI0NjY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0pvaW5Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpvaW5Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Kb2luTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Kb2luTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxOWM2NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvSm9pbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpvaW5Ob2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcyBVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Kb2luTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0pvaW5Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjFkMmQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0pvaW5Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd0NyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Kb2luTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSm9pbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJaWYgKHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXEuc2V0RWxlbWVudFRvRGVzdHJveSh2aWV3KTsKLQkJfQotCQljYy5hZGQoZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpKTsKLQkJcmV0dXJuIGNjLnVud3JhcCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLS8vCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSkKLS8vCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgbnVsbCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlCi0JCQkJfHwgZmFsc2UgPT0gdGFyZ2V0RU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCUFjdGl2aXR5Tm9kZSB0YXJnZXQgPSAoQWN0aXZpdHlOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9FZGdlKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsCi0JCQkJc291cmNlLCB0YXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UKLQkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0JICogCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgewotLy8JCWNhc2UgQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQ6Ci0vLwkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZChyZXEpKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5nbWYuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5I2dldENyZWF0ZU91dGdvaW5nKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVPdXRnb2luZyhDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQkvLyBWYWxpZGF0aW9uIEpvaW4gTm9kZSBzaG91bGQgYWxsb3cgb25seSBvbmUgb3V0Z29pbmcgY29ubmVjdGlvbi4KLQkJaWYgKHJlcS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEpvaW5Ob2RlKSB7Ci0JCQlKb2luTm9kZSBqb2luID0gKEpvaW5Ob2RlKSByZXEuZ2V0U291cmNlKCk7Ci0JCQlMaXN0IGxpc3QgPSBqb2luLmdldE91dGdvaW5ncygpOwotCQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+PSAxKSB7Ci0JCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZU91dGdvaW5nKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODY3ZWE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL01lcmdlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXJnZU5vZGVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL01lcmdlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9NZXJnZU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTU5Zjg2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL01lcmdlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVyZ2VOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9NZXJnZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9NZXJnZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxODk5YTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd0NyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5NZXJnZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lcmdlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNjID0gZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChyZXEKLQkJCQkuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlpZiAodmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcS5zZXRFbGVtZW50VG9EZXN0cm95KHZpZXcpOwotCQl9Ci0JCWNjLmFkZChnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSkpOwotCQlyZXR1cm4gY2MudW53cmFwKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCWlmIChVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotLy8JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKQotLy8JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBudWxsKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCUVPYmplY3QgdGFyZ2V0RU9iamVjdCA9IHJlcS5nZXRUYXJnZXQoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUKLQkJCQl8fCBmYWxzZSA9PSB0YXJnZXRFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJQWN0aXZpdHlOb2RlIHRhcmdldCA9IChBY3Rpdml0eU5vZGUpIHRhcmdldEVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlX0VkZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZChyZXEsIGNvbnRhaW5lciwKLQkJCQlzb3VyY2UsIHRhcmdldCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQotCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7Ci0vLwkJY2FzZSBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDoKLS8vCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kKHJlcSkpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmdtZi5kaWFncmFtLmVkaXQucG9saWNpZXMuVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kjZ2V0Q3JlYXRlT3V0Z29pbmcob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0KQotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZU91dGdvaW5nKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0KLQkJLy8gVmFsaWRhdGlvbiBtZXJnZSBub2RlIHNob3VsZCBhbGxvdyBvbmx5IG9uZSBvdXRnb2luZyBjb25uZWN0aW9uLgotCQlpZiAocmVxLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgTWVyZ2VOb2RlKSB7Ci0JCQlNZXJnZU5vZGUgam9pbiA9IChNZXJnZU5vZGUpIHJlcS5nZXRTb3VyY2UoKTsKLQkJCUxpc3QgbGlzdCA9IGpvaW4uZ2V0T3V0Z29pbmdzKCk7Ci0JCQlpZiAobGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID49IDEpIHsKLQkJCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlT3V0Z29pbmcocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGIzZjMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzCi0JCUNhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNTk5ZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzc3ODE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0vLwkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpCi0vLwkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJRU9iamVjdCB0YXJnZXRFT2JqZWN0ID0gcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0RU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kKHJlcSwgY29udGFpbmVyLAotCQkJCXNvdXJjZSwgdGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlCi0JICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLS8vCQljYXNlIENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEOgotLy8JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQocmVxKSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4MGQzYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0Nhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcwotCQlDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTY3ODhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0dyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3MGU5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkNvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkNvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNjID0gZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChyZXEKLQkJCQkuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlpZiAodmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcS5zZXRFbGVtZW50VG9EZXN0cm95KHZpZXcpOwotCQl9Ci0JCWNjLmFkZChnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSkpOwotCQlyZXR1cm4gY2MudW53cmFwKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCWlmIChVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotLy8JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKQotLy8JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBudWxsKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCUVPYmplY3QgdGFyZ2V0RU9iamVjdCA9IHJlcS5nZXRUYXJnZXQoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUKLQkJCQl8fCBmYWxzZSA9PSB0YXJnZXRFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJQWN0aXZpdHlOb2RlIHRhcmdldCA9IChBY3Rpdml0eU5vZGUpIHRhcmdldEVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlX0VkZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZChyZXEsIGNvbnRhaW5lciwKLQkJCQlzb3VyY2UsIHRhcmdldCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQotCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7Ci0vLwkJY2FzZSBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDoKLS8vCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kKHJlcSkpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTAxNzVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcwotCQlDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkzY2IwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmYjkzOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJaWYgKHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXEuc2V0RWxlbWVudFRvRGVzdHJveSh2aWV3KTsKLQkJfQotCQljYy5hZGQoZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpKTsKLQkJcmV0dXJuIGNjLnVud3JhcCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLS8vCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSkKLS8vCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgbnVsbCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlCi0JCQkJfHwgZmFsc2UgPT0gdGFyZ2V0RU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCUFjdGl2aXR5Tm9kZSB0YXJnZXQgPSAoQWN0aXZpdHlOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9FZGdlKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsCi0JCQkJc291cmNlLCB0YXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UKLQkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0JICogCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgewotLy8JCWNhc2UgQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQ6Ci0vLwkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZChyZXEpKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkY2Y0My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uY29tbWFuZHMuQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvd0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmNvbW1hbmRzLkNyZWF0ZU91dGdvaW5nQ29udHJvbEZsb3dDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzLlVNTEJhc2VFZGl0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5SZWNvbm5lY3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5Db21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5FZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5FbGVtZW50VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVkaXRIZWxwZXJDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EdXBsaWNhdGVFbGVtZW50c1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5HZXRFZGl0Q29udGV4dFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5JRWRpdENvbW1hbmRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuTW92ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5TZXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFydGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzIFNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBFeHRlbmRlZCByZXF1ZXN0IGRhdGEga2V5IHRvIGhvbGQgZWRpdHBhcnQgdmlzdWFsIGlkLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVNVQUxfSURfS0VZID0gInZpc3VhbF9pZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFkZCB2aXN1YWwgaWQgb2YgZWRpdGVkIGVkaXRwYXJ0IHRvIGV4dGVuZGVkIGRhdGEgb2YgdGhlIHJlcXVlc3Qgc28KLQkgKiBjb21tYW5kIHN3aXRjaCBjYW4gZGVjaWRlIHdoYXQga2luZCBvZiBkaWFncmFtIGVsZW1lbnQgaXMgYmVpbmcgZWRpdGVkLgotCSAqIEl0IGlzIGRvbmUgaW4gdGhvc2UgY2FzZXMgd2hlbiBpdCdzIG5vdCBwb3NzaWJsZSB0byBkZWR1Y2UgZGlhZ3JhbQotCSAqIGVsZW1lbnQga2luZCBmcm9tIGRvbWFpbiBlbGVtZW50LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIFJlY29ubmVjdFJlcXVlc3QpIHsKLQkJCU9iamVjdCB2aWV3ID0gKChSZWNvbm5lY3RSZXF1ZXN0KSByZXF1ZXN0KS5nZXRDb25uZWN0aW9uRWRpdFBhcnQoKQotCQkJCQkuZ2V0TW9kZWwoKTsKLQkJCWlmICh2aWV3IGluc3RhbmNlb2YgVmlldykgewotCQkJCUludGVnZXIgaWQgPSBuZXcgSW50ZWdlcihVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0VmlzdWFsSUQoKFZpZXcpIHZpZXcpKTsKLQkJCQlyZXF1ZXN0LmdldEV4dGVuZGVkRGF0YSgpLnB1dChWSVNVQUxfSURfS0VZLCBpZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbW1hbmQocmVxdWVzdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB2aXN1YWwgaWQgZnJvbSByZXF1ZXN0IHBhcmFtZXRlcnMuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0VmlzdWFsSUQoSUVkaXRDb21tYW5kUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCU9iamVjdCBpZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFZJU1VBTF9JRF9LRVkpOwotCQlyZXR1cm4gaWQgaW5zdGFuY2VvZiBJbnRlZ2VyID8gKChJbnRlZ2VyKSBpZCkuaW50VmFsdWUoKSA6IC0xOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRTZW1hbnRpY0NvbW1hbmQoSUVkaXRDb21tYW5kUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUlFZGl0Q29tbWFuZFJlcXVlc3QgY29tcGxldGVkUmVxdWVzdCA9IGNvbXBsZXRlUmVxdWVzdChyZXF1ZXN0KTsKLQkJT2JqZWN0IGVkaXRIZWxwZXJDb250ZXh0ID0gY29tcGxldGVkUmVxdWVzdC5nZXRFZGl0SGVscGVyQ29udGV4dCgpOwotCQlpZiAoZWRpdEhlbHBlckNvbnRleHQgaW5zdGFuY2VvZiBWaWV3Ci0JCQkJfHwgKGVkaXRIZWxwZXJDb250ZXh0IGluc3RhbmNlb2YgSUVkaXRIZWxwZXJDb250ZXh0ICYmICgoSUVkaXRIZWxwZXJDb250ZXh0KSBlZGl0SGVscGVyQ29udGV4dCkKLQkJCQkJCS5nZXRFT2JqZWN0KCkgaW5zdGFuY2VvZiBWaWV3KSkgewotCQkJLy8gbm8gc2VtYW50aWMgY29tbWFuZHMgYXJlIHByb3ZpZGVkIGZvciBwdXJlIGRlc2lnbiBlbGVtZW50cwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKGVkaXRIZWxwZXJDb250ZXh0ID09IG51bGwpIHsKLQkJCWVkaXRIZWxwZXJDb250ZXh0ID0gVmlld1V0aWwKLQkJCQkJLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKTsKLQkJfQotCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0RWxlbWVudFR5cGUoZWRpdEhlbHBlckNvbnRleHQpOwotCQlpZiAoZWxlbWVudFR5cGUgPT0gRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFR5cGUoCi0JCQkJIm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZGVmYXVsdCIpKSB7IC8vJE5PTi1OTFMtMSQgCi0JCQllbGVtZW50VHlwZSA9IG51bGw7Ci0JCX0KLQkJQ29tbWFuZCBlcENvbW1hbmQgPSBnZXRTZW1hbnRpY0NvbW1hbmRTd2l0Y2goY29tcGxldGVkUmVxdWVzdCk7Ci0JCWlmIChlcENvbW1hbmQgIT0gbnVsbCkgewotCQkJSUNvbW1hbmQgY29tbWFuZCA9IGVwQ29tbWFuZCBpbnN0YW5jZW9mIElDb21tYW5kUHJveHkgPyAoKElDb21tYW5kUHJveHkpIGVwQ29tbWFuZCkKLQkJCQkJLmdldElDb21tYW5kKCkKLQkJCQkJOiBuZXcgQ29tbWFuZFByb3h5KGVwQ29tbWFuZCk7Ci0JCQljb21wbGV0ZWRSZXF1ZXN0LnNldFBhcmFtZXRlcigKLQkJCQkJVU1MQmFzZUVkaXRIZWxwZXIuRURJVF9QT0xJQ1lfQ09NTUFORCwgY29tbWFuZCk7Ci0JCX0KLQkJQ29tbWFuZCBlaENvbW1hbmQgPSBudWxsOwotCQlpZiAoZWxlbWVudFR5cGUgIT0gbnVsbCkgewotCQkJSUNvbW1hbmQgY29tbWFuZCA9IGVsZW1lbnRUeXBlLmdldEVkaXRDb21tYW5kKGNvbXBsZXRlZFJlcXVlc3QpOwotCQkJaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotCQkJCWlmICghKGNvbW1hbmQgaW5zdGFuY2VvZiBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCkpIHsKLQkJCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJCQkJY29tbWFuZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZChlZGl0aW5nRG9tYWluLAotCQkJCQkJCW51bGwpLmNvbXBvc2UoY29tbWFuZCk7Ci0JCQkJfQotCQkJCWVoQ29tbWFuZCA9IG5ldyBJQ29tbWFuZFByb3h5KGNvbW1hbmQpOwotCQkJfQotCQl9Ci0JCWJvb2xlYW4gc2hvdWxkUHJvY2VlZCA9IHRydWU7Ci0JCWlmIChjb21wbGV0ZWRSZXF1ZXN0IGluc3RhbmNlb2YgRGVzdHJveVJlcXVlc3QpIHsKLQkJCXNob3VsZFByb2NlZWQgPSBzaG91bGRQcm9jZWVkKChEZXN0cm95UmVxdWVzdCkgY29tcGxldGVkUmVxdWVzdCk7Ci0JCX0KLQkJaWYgKHNob3VsZFByb2NlZWQpIHsKLQkJCWlmIChjb21wbGV0ZWRSZXF1ZXN0IGluc3RhbmNlb2YgRGVzdHJveVJlcXVlc3QpIHsKLQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCQkJQ29tbWFuZCBkZWxldGVWaWV3Q29tbWFuZCA9IG5ldyBJQ29tbWFuZFByb3h5KAotCQkJCQkJbmV3IERlbGV0ZUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwgKFZpZXcpIGdldEhvc3QoKQotCQkJCQkJCQkuZ2V0TW9kZWwoKSkpOwotCQkJCWVoQ29tbWFuZCA9IGVoQ29tbWFuZCA9PSBudWxsID8gZGVsZXRlVmlld0NvbW1hbmQgOiBlaENvbW1hbmQKLQkJCQkJCS5jaGFpbihkZWxldGVWaWV3Q29tbWFuZCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZWhDb21tYW5kOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRTZW1hbnRpY0NvbW1hbmRTd2l0Y2goSUVkaXRDb21tYW5kUmVxdWVzdCByZXEpIHsKLQkJaWYgKHJlcSBpbnN0YW5jZW9mIENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0Q3JlYXRlQ29tbWFuZCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgQ29uZmlndXJlUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldENvbmZpZ3VyZUNvbW1hbmQoKENvbmZpZ3VyZVJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKChEZXN0cm95RWxlbWVudFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXREZXN0cm95UmVmZXJlbmNlQ29tbWFuZCgoRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0RHVwbGljYXRlQ29tbWFuZCgoRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIEdldEVkaXRDb250ZXh0UmVxdWVzdCkgewotCQkJcmV0dXJuIGdldEVkaXRDb250ZXh0Q29tbWFuZCgoR2V0RWRpdENvbnRleHRSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIE1vdmVSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0TW92ZUNvbW1hbmQoKE1vdmVSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIFJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldFJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwQ29tbWFuZCgoUmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgoUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIFNldFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRTZXRDb21tYW5kKChTZXRSZXF1ZXN0KSByZXEpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb25maWd1cmVDb21tYW5kKENvbmZpZ3VyZVJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVPdXRnb2luZyhyZXEpCi0JCQkJCTogZ2V0Q3JlYXRlSW5jb21pbmdDb21wbGV0ZShyZXEpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0U2V0Q29tbWFuZChTZXRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RWRpdENvbnRleHRDb21tYW5kKEdldEVkaXRDb250ZXh0UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95UmVmZXJlbmNlQ29tbWFuZChEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldER1cGxpY2F0ZUNvbW1hbmQoRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNvbW1hbmQoTW92ZVJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotCS8qCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLQkJY2FzZSBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCUNvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kIGNtZCA9IG5ldyBDb250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZChyZXEpOwotCQkJY21kLnNldEhvc3QoZ2V0SG9zdCgpKTsKLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKGNtZCk7Ci0JCX0KLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldE1TTFdyYXBwZXIoSUNvbW1hbmQgY21kKSB7Ci0JCXJldHVybiBuZXcgSUNvbW1hbmRQcm94eShjbWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRTZW1hbnRpY0VsZW1lbnQoKSB7Ci0JCXJldHVybiBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgY29udGFpbmVyIGVsZW1lbnQgZm9yIHRoZSBuZXcgcmVsYXRpb25zaGlwIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGdvZXMgdXAgYnkgY29udGFpbm1lbnQgaGllcmFyY2h5IHN0YXJ0aW5nIGZyb20gdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgYW5kIHJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyBpbnN0YW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgY29udGFpbmVyIGNsYXNzLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoT2JqZWN0IHVlbGVtZW50LAotCQkJRUNsYXNzIGNvbnRhaW5lckNsYXNzLCBJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgewotCQlpZiAodWVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgdWVsZW1lbnQ7Ci0JCQlmb3IgKDsgZWxlbWVudCAhPSBudWxsOyBlbGVtZW50ID0gZWxlbWVudC5lQ29udGFpbmVyKCkpIHsKLQkJCQlpZiAoY29udGFpbmVyQ2xhc3MuaXNTdXBlclR5cGVPZihlbGVtZW50LmVDbGFzcygpKSkgewotCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBlZGl0aW5nIGRvbWFpbiBmcm9tIHRoZSBob3N0IGVkaXQgcGFydC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCXJldHVybiAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBjb21tYW5kIHRvIGRlc3Ryb3kgdGhlIGxpbmsuCi0JICogCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKFZpZXcgdmlldywgYm9vbGVhbiBjb25maXJtKSB7Ci0JCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBnZXRIb3N0KCkuZ2V0Vmlld2VyKCkKLQkJCQkuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLmdldCh2aWV3KTsKLQotCQkvLyBzb21lIHZpZXdzIGFyZSBzdXBwcmVzc2VkIGFuZCBtaWdodCBub3QgaGF2ZSBhIGVkaXQgcGFydAotCQkvLwotCQlpZihlZGl0UGFydCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KAotCQkJCWdldEVkaXRpbmdEb21haW4oKSwgY29uZmlybSk7Ci0JCXJldHVybiBlZGl0UGFydC5nZXRDb21tYW5kKG5ldyBFZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyKHJlcXVlc3QsCi0JCQkJQ29sbGVjdGlvbnMuRU1QVFlfTUFQKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBjb21tYW5kcyB0byBkZXN0cm95IGFsbCBob3N0IGluY29taW5nIGFuZCBvdXRnb2luZyBsaW5rcy4KLQkgKiAKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG91bmRDb21tYW5kIGdldERlc3Ryb3lFZGdlc0NvbW1hbmQoYm9vbGVhbiBjb25maXJtKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHZpZXcuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlDb21tYW5kIGRlc3Ryb3lDbWQgPSBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoKEVkZ2UpIGl0Lm5leHQoKSwgY29uZmlybSk7Ci0JCQlpZihkZXN0cm95Q21kICE9IG51bGwpIHsKLQkJCQljbWQuYWRkKGRlc3Ryb3lDbWQpOwotCQkJfQotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB2aWV3LmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJQ29tbWFuZCBkZXN0cm95Q21kID0gZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKChFZGdlKSBpdC5uZXh0KCksIGNvbmZpcm0pOwotCQkJaWYoZGVzdHJveUNtZCAhPSBudWxsKSB7Ci0JCQkJY21kLmFkZChkZXN0cm95Q21kKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY21kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIExpbmtDb25zdHJhaW50cyB7Ci0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BQT1NJVEVfRU5EX1ZBUiA9ICJvcHBvc2l0ZUVuZCI7IC8vJE5PTi1OTFMtMSQKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBib29sZWFuIGNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoCi0JCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIsIEFjdGl2aXR5Tm9kZSBzb3VyY2UsCi0JCQkJQWN0aXZpdHlOb2RlIHRhcmdldCkgewotCQkJcmV0dXJuIGNhbkV4aXN0Q29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuRXhpc3RDb250cm9sRmxvd18zMDAxKAotCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyLCBBY3Rpdml0eU5vZGUgc291cmNlLAotCQkJCUFjdGl2aXR5Tm9kZSB0YXJnZXQpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDaGlsZHJlbiBzaG91bGQgb3ZlcnJpZGUgdGhpcywgZm9yIGFueSBleHRyYSB2YWxpZGF0aW9ucy4KLQkgKiAKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVJbmNvbWluZ0NvbXBsZXRlKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUNvbW1hbmQgY29tbWFuZDsKLQkJaWYgKHJlcS5nZXRTb3VyY2UoKSA9PSByZXEuZ2V0VGFyZ2V0KCkpIHsKLQkJCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCX07Ci0JCX0KLQotCQlpZiAoIShyZXEuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldFRhcmdldCgpIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb24pIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0KLQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCAhKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoaXNEdXBsaWNhdGVSZWxhdGlvbnNoaXAocmVxLmdldFNvdXJjZSgpLCByZXEuZ2V0VGFyZ2V0KCkpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCi0JCWlmIChEaWFncmFtQ29yZVZhbGlkYXRpb24uY2FuQ29ubmVjdCgoRWRpdFBhcnQpIGdldEhvc3QoKSwgcmVxCi0JCQkJLmdldFNvdXJjZSgpLCByZXEuZ2V0VGFyZ2V0KCkpICE9IG51bGwpCi0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X0VkZ2UoKSk7Ci0JCQl9Ci0JCQljb21tYW5kID0gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvd0NvbW1hbmQocmVxLAotCQkJCQllbGVtZW50LmVDb250YWluZXIoKSkpOwotCi0JCQkvLyBpZiAocmVxLmdldFRhcmdldCgpICE9IHJlcS5nZXRTb3VyY2UoKSkgewotCQkJLy8gY29tbWFuZCA9IGNvbW1hbmQuY2hhaW4obmV3IENyZWF0ZVByZWRlY2Vzc29yQ29tbWFuZChyZXEpKTsKLQkJCS8vIH0KLQkJCXJldHVybiBjb21tYW5kOwotCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIGxpbmsgYmV0d2VlbiB0d28gZW5kcyBhbHJlYWR5IGV4aXN0cy4KLQkgKiAKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNEdXBsaWNhdGVSZWxhdGlvbnNoaXAoRU9iamVjdCBzb3VyY2UsIEVPYmplY3QgdGFyZ2V0KSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gc291cmNlLmVDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgY29udGFpbmVyOwotCQkJTGlzdCBsaXN0ID0gYWN0aXZpdHkuZ2V0RWRnZXMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aXZpdHlFZGdlIGVsZW1lbnQgPSAoQWN0aXZpdHlFZGdlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoKGVsZW1lbnQuZ2V0U291cmNlKCkgPT0gc291cmNlKQotCQkJCQkJJiYgZWxlbWVudC5nZXRUYXJnZXQoKSA9PSB0YXJnZXQpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVPdXRnb2luZyhDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlpZiAoIShyZXEuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8ICEoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCX07Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCS8vIFRPRE86IGNoZWNrIHRoZSBzYW1lIHR5cGUsIGRvbid0IGNyZWF0ZSBjb25uZWN0aW9uLgotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X0VkZ2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENyZWF0ZU91dGdvaW5nQ29udHJvbEZsb3dDb21tYW5kKHJlcSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTEV4dE5vZGVMYWJlbEhvc3RMYXlvdXRFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NTBkMjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkdyb3VwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5YWUxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kgZXh0ZW5kcyBYWUxheW91dEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGF5b3V0RWRpdFBvbGljeSByZWFsTGF5b3V0RWRpdFBvbGljeTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGF5b3V0RWRpdFBvbGljeSBnZXRSZWFsTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJcmV0dXJuIHJlYWxMYXlvdXRFZGl0UG9saWN5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFsTGF5b3V0RWRpdFBvbGljeShMYXlvdXRFZGl0UG9saWN5IHJlYWxMYXlvdXRFZGl0UG9saWN5KSB7Ci0JCXRoaXMucmVhbExheW91dEVkaXRQb2xpY3kgPSByZWFsTGF5b3V0RWRpdFBvbGljeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHRlcm5hbExhYmVsKEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3QgZ2V0RXh0ZXJuYWxMYWJlbHMoR3JvdXBSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJTGlzdCBlZGl0UGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChyZXF1ZXN0LmdldEVkaXRQYXJ0cygpICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXF1ZXN0LmdldEVkaXRQYXJ0cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgaXQubmV4dCgpOwotCQkJCWlmIChpc0V4dGVybmFsTGFiZWwoZWRpdFBhcnQpKSB7Ci0JCQkJCWVkaXRQYXJ0cy5hZGQoZWRpdFBhcnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWRpdFBhcnRzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAoUkVRX01PVkVfQ0hJTERSRU4uZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSkgewotCQkJQ2hhbmdlQm91bmRzUmVxdWVzdCBjYlJlcXVlc3QgPSAoQ2hhbmdlQm91bmRzUmVxdWVzdCkgcmVxdWVzdDsKLQkJCUxpc3QgZXh0TGFiZWxzID0gZ2V0RXh0ZXJuYWxMYWJlbHMoY2JSZXF1ZXN0KTsKLQkJCWlmICghZXh0TGFiZWxzLmlzRW1wdHkoKSkgewotCQkJCUxpc3QgZWRpdFBhcnRzID0gY2JSZXF1ZXN0LmdldEVkaXRQYXJ0cygpOwotCQkJCUNvbW1hbmQgY21kID0gbnVsbDsKLQkJCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbAotCQkJCQkJJiYgZWRpdFBhcnRzLnNpemUoKSA+IGV4dExhYmVscy5zaXplKCkpIHsKLQkJCQkJTGlzdCBvdGhlciA9IG5ldyBBcnJheUxpc3QoZWRpdFBhcnRzKTsKLQkJCQkJb3RoZXIucmVtb3ZlQWxsKGV4dExhYmVscyk7Ci0JCQkJCWNiUmVxdWVzdC5zZXRFZGl0UGFydHMob3RoZXIpOwotCQkJCQljbWQgPSByZWFsTGF5b3V0RWRpdFBvbGljeS5nZXRDb21tYW5kKHJlcXVlc3QpOwotCQkJCX0KLQkJCQljYlJlcXVlc3Quc2V0RWRpdFBhcnRzKGV4dExhYmVscyk7Ci0JCQkJQ29tbWFuZCBleHRMYWJlbHNDbWQgPSBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKHJlcXVlc3QpOwotCQkJCWNiUmVxdWVzdC5zZXRFZGl0UGFydHMoZWRpdFBhcnRzKTsKLQkJCQlyZXR1cm4gY21kID09IG51bGwgPyBleHRMYWJlbHNDbWQgOiBjbWQuY2hhaW4oZXh0TGFiZWxzQ21kKTsKLQkJCX0KLQkJfQotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIEdyb3VwUmVxdWVzdCkgewotCQkJTGlzdCBleHRMYWJlbHMgPSBnZXRFeHRlcm5hbExhYmVscygoR3JvdXBSZXF1ZXN0KSByZXF1ZXN0KTsKLQkJCWlmICghZXh0TGFiZWxzLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWFsTGF5b3V0RWRpdFBvbGljeSA9PSBudWxsID8gbnVsbCA6IHJlYWxMYXlvdXRFZGl0UG9saWN5Ci0JCQkJLmdldENvbW1hbmQocmVxdWVzdCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29uc3RyYWludEZvcihDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QsCi0JCQlHcmFwaGljYWxFZGl0UGFydCBjaGlsZCkgewotCQlpbnQgZHggPSAoKEludGVnZXIpIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoKFZpZXcpIGNoaWxkCi0JCQkJLmdldE1vZGVsKCksIE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpKSkKLQkJCQkuaW50VmFsdWUoKTsKLQkJaW50IGR5ID0gKChJbnRlZ2VyKSBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKChWaWV3KSBjaGlsZAotCQkJCS5nZXRNb2RlbCgpLCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKSkpCi0JCQkJLmludFZhbHVlKCk7Ci0JCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZShkeCwgZHksIDAsIDApOwotCQljaGlsZC5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb0Fic29sdXRlKHIpOwotCQlyLnRyYW5zbGF0ZShyZXF1ZXN0LmdldE1vdmVEZWx0YSgpKTsKLQkJY2hpbGQuZ2V0RmlndXJlKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShyKTsKLQkJcmV0dXJuIHI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcSkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbAotCQkJCSYmIHJlYWxMYXlvdXRFZGl0UG9saWN5LnVuZGVyc3RhbmRzUmVxdWVzdChyZXEpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIudW5kZXJzdGFuZHNSZXF1ZXN0KHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlQ2hpbGQoRWRpdFBhcnQgY2hpbGQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG9zdChFZGl0UGFydCBob3N0KSB7Ci0JCXN1cGVyLnNldEhvc3QoaG9zdCk7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5zZXRIb3N0KGhvc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQlzdXBlci5hY3RpdmF0ZSgpOwotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuYWN0aXZhdGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5kZWFjdGl2YXRlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFRhcmdldEVkaXRQYXJ0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlYWxMYXlvdXRFZGl0UG9saWN5LmdldFRhcmdldEVkaXRQYXJ0KHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHN1cGVyLmdldFRhcmdldEVkaXRQYXJ0KHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dTb3VyY2VGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LnNob3dTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnNob3dTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlcmFzZVNvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuZXJhc2VTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmVyYXNlU291cmNlRmVlZGJhY2socmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2hvd1RhcmdldEZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuc2hvd1RhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuc2hvd1RhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVyYXNlVGFyZ2V0RmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5lcmFzZVRhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuZXJhc2VUYXJnZXRGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGJkNDkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuZWRpdGhlbHBlcnMuQ3JlYXRlRWxlbWVudFJlcXVlc3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVDb25uZWN0aW9uVmlld0FuZEVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuVU1MUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcyBHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElFbGVtZW50VHlwZSBnZXRFbGVtZW50VHlwZShDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ3JlYXRlQ29ubmVjdGlvblZpZXdBbmRFbGVtZW50UmVxdWVzdCkgewotCQkJQ3JlYXRlRWxlbWVudFJlcXVlc3RBZGFwdGVyIHJlcXVlc3RBZGFwdGVyID0gKChDcmVhdGVDb25uZWN0aW9uVmlld0FuZEVsZW1lbnRSZXF1ZXN0KSByZXF1ZXN0KQotCQkJCQkuZ2V0Q29ubmVjdGlvblZpZXdBbmRFbGVtZW50RGVzY3JpcHRvcigpCi0JCQkJCS5nZXRDcmVhdGVFbGVtZW50UmVxdWVzdEFkYXB0ZXIoKTsKLQkJCXJldHVybiAoSUVsZW1lbnRUeXBlKSByZXF1ZXN0QWRhcHRlci5nZXRBZGFwdGVyKElFbGVtZW50VHlwZS5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENvbm5lY3Rpb25XaXRoUmVvcmllbnRlZFZpZXdDb21wbGV0ZUNvbW1hbmQoCi0JCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUlDb21tYW5kUHJveHkgYyA9IChJQ29tbWFuZFByb3h5KSBzdXBlcgotCQkJCS5nZXRDb25uZWN0aW9uQ29tcGxldGVDb21tYW5kKHJlcXVlc3QpOwotCQlDb21wb3NpdGVDb21tYW5kIGNjID0gKENvbXBvc2l0ZUNvbW1hbmQpIGMuZ2V0SUNvbW1hbmQoKTsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJVU1MUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQgcmN2Q29tbWFuZCA9IG5ldyBVTUxSZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCgKLQkJCQllZGl0aW5nRG9tYWluLCBudWxsKTsKLQkJcmN2Q29tbWFuZC5zZXRFZGdlQWRhcHRvcihnZXRWaWV3QWRhcHRlcigpKTsKLQkJY2MuY29tcG9zZShyY3ZDb21tYW5kKTsKLQkJcmV0dXJuIGM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MUmVmZXJlbmNlQ29ubmVjdGlvbkVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTFJlZmVyZW5jZUNvbm5lY3Rpb25FZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MTY5NDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MUmVmZXJlbmNlQ29ubmVjdGlvbkVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbm5lY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Hcm91cFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5Hcm91cFJlcXVlc3RWaWFLZXlib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFJlZmVyZW5jZUNvbm5lY3Rpb25FZGl0UG9saWN5IGV4dGVuZHMgQ29ubmVjdGlvbkVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfRlJPTV9ESUFHUkFNX0RMR19USVRMRSA9IERpYWdyYW1VSU1lc3NhZ2VzLlByb21wdGluZ0RlbGV0ZUFjdGlvbl9EZWxldGVGcm9tRGlhZ3JhbURpYWxvZ19UaXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0ZST01fRElBR1JBTV9ETEdfTUVTU0FHRSA9IERpYWdyYW1VSU1lc3NhZ2VzLlByb21wdGluZ0RlbGV0ZUFjdGlvbl9EZWxldGVGcm9tRGlhZ3JhbURpYWxvZ19NZXNzYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfRlJPTV9NT0RFTF9ETEdfVE9HR0xFX0xBQkVMID0gRGlhZ3JhbVVJTWVzc2FnZXMuTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGVfRG9Ob3RQcm9tcHRBZ2FpblRvZ2dsZV9sYWJlbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKEdyb3VwUmVxdWVzdCBkZWxldGVSZXF1ZXN0KSB7Ci0JCWJvb2xlYW4gaXNEZWxldGVGcm9tS2V5Qm9hcmQgPSBkZWxldGVSZXF1ZXN0IGluc3RhbmNlb2YgR3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQ7Ci0JCWlmIChzaG91bGREZWxldGVTZW1hbnRpYygpKSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVsZXRlU2VtYW50aWNDb21tYW5kKGRlbGV0ZVJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJYm9vbGVhbiBwcm9jZWVkVG9EZWxldGVWaWV3ID0gdHJ1ZTsKLQkJCWlmIChpc0RlbGV0ZUZyb21LZXlCb2FyZCkgewotCQkJCUdyb3VwUmVxdWVzdFZpYUtleWJvYXJkIGdyb3VwUmVxdWVzdFZpYUtleWJvYXJkID0gKEdyb3VwUmVxdWVzdFZpYUtleWJvYXJkKSBkZWxldGVSZXF1ZXN0OwotCQkJCWlmIChncm91cFJlcXVlc3RWaWFLZXlib2FyZC5pc1Nob3dJbmZvcm1hdGlvbkRpYWxvZygpKSB7Ci0JCQkJCXByb2NlZWRUb0RlbGV0ZVZpZXcgPSBzaG93UHJvbXB0KCk7Ci0JCQkJCWdyb3VwUmVxdWVzdFZpYUtleWJvYXJkLnNldFNob3dJbmZvcm1hdGlvbkRpYWxvZyhmYWxzZSk7Ci0JCQkJCWlmICghKHByb2NlZWRUb0RlbGV0ZVZpZXcpKQotCQkJCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNyZWF0ZURlbGV0ZVZpZXdDb21tYW5kKGRlbGV0ZVJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVNlbWFudGljKCkgewotCQlBc3NlcnQuaXNUcnVlKGdldEhvc3QoKSBpbnN0YW5jZW9mIEFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0KTsKLQkJQWJzdHJhY3RDb25uZWN0aW9uRWRpdFBhcnQgY2VwID0gKEFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0KSBnZXRIb3N0KCk7Ci0JCWJvb2xlYW4gaXNDYW5vbmljYWwgPSBmYWxzZTsKLQkJaWYgKGNlcC5nZXRTb3VyY2UoKSAhPSBudWxsKQotCQkJaXNDYW5vbmljYWwgPSBJc0Nhbm9uaWNhbChjZXAuZ2V0U291cmNlKCkpOwotCQlpZiAoY2VwLmdldFRhcmdldCgpICE9IG51bGwpCi0JCQlyZXR1cm4gaXNDYW5vbmljYWwgPyBpc0Nhbm9uaWNhbCA6IElzQ2Fub25pY2FsKGNlcC5nZXRUYXJnZXQoKSk7Ci0JCXJldHVybiBpc0Nhbm9uaWNhbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIElzQ2Fub25pY2FsKEVkaXRQYXJ0IGVwKSB7Ci0JCUVkaXRQYXJ0IHBhcmVudCA9IGVwLmdldFBhcmVudCgpOwotCQlyZXR1cm4gcGFyZW50IGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQgPyAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJlbnQpCi0JCQkJLmlzQ2Fub25pY2FsKCkKLQkJCQk6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEZWxldGVWaWV3Q29tbWFuZChHcm91cFJlcXVlc3QgZGVsZXRlUmVxdWVzdCkgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlyZXR1cm4gbmV3IElDb21tYW5kUHJveHkobmV3IERlbGV0ZUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwKLQkJCQkoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRGVsZXRlU2VtYW50aWNDb21tYW5kKEdyb3VwUmVxdWVzdCBkZWxldGVSZXF1ZXN0KSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCUVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXIgc2VtUmVxID0gbmV3IEVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXIoCi0JCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChlZGl0aW5nRG9tYWluLCBmYWxzZSksIGRlbGV0ZVJlcXVlc3QKLQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKSk7Ci0JCUNvbW1hbmQgc2VtYW50aWNDbWQgPSBnZXRIb3N0KCkuZ2V0Q29tbWFuZChzZW1SZXEpOwotCQlpZiAoc2VtYW50aWNDbWQgIT0gbnVsbCAmJiBzZW1hbnRpY0NtZC5jYW5FeGVjdXRlKCkpIHsKLQkJCUNvbXBvdW5kQ29tbWFuZCBjYyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkJCWNjLmFkZChzZW1hbnRpY0NtZCk7Ci0JCQlyZXR1cm4gY2M7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG93UHJvbXB0KCkgewotCQlib29sZWFuIHByb21wdCA9ICgoSVByZWZlcmVuY2VTdG9yZSkgKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKQotCQkJCS5nZXRCb29sZWFuKElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUFJPTVBUX09OX0RFTF9GUk9NX0RJQUdSQU0pOwotCQlpZiAocHJvbXB0KQotCQkJaWYgKHNob3dNZXNzYWdlRGlhbG9nKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNob3dNZXNzYWdlRGlhbG9nKCkgewotCQlNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZSBkaWFsb2cgPSBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZQotCQkJCS5vcGVuWWVzTm9RdWVzdGlvbihEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJREVMRVRFX0ZST01fRElBR1JBTV9ETEdfVElUTEUsCi0JCQkJCQlERUxFVEVfRlJPTV9ESUFHUkFNX0RMR19NRVNTQUdFLAotCQkJCQkJREVMRVRFX0ZST01fTU9ERUxfRExHX1RPR0dMRV9MQUJFTCwgZmFsc2UsCi0JCQkJCQkoSVByZWZlcmVuY2VTdG9yZSkgKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkJCQkJLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKQotCQkJCQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCksCi0JCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1BST01QVF9PTl9ERUxfRlJPTV9ESUFHUkFNKTsKLQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIEdyb3VwUmVxdWVzdFZpYUtleWJvYXJkKSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZXRlQ29tbWFuZCgoR3JvdXBSZXF1ZXN0KSByZXF1ZXN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxUZXh0Tm9uUmVzaXphYmxlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MVGV4dE5vblJlc2l6YWJsZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZmNjhlNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxUZXh0Tm9uUmVzaXphYmxlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTW92ZUhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5RXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5EcmFnRWRpdFBhcnRzVHJhY2tlckV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLQotCS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MVGV4dE5vblJlc2l6YWJsZUVkaXRQb2xpY3kgZXh0ZW5kcyBOb25SZXNpemFibGVFZGl0UG9saWN5RXggewotCi0JCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJpdmF0ZSBJRmlndXJlIHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJpdmF0ZSBJRmlndXJlIGZvY3VzRmVlZGJhY2tGaWd1cmU7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93UHJpbWFyeVNlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXNob3dTZWxlY3Rpb24oKTsKLQkJCXNob3dGb2N1cygpOwotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQloaWRlU2VsZWN0aW9uKCk7Ci0JCQlhZGRGZWVkYmFjayhzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSA9IGNyZWF0ZVNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKCkpOwotCQkJcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0JCQloaWRlRm9jdXMoKTsKLQkJfQotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCB2b2lkIGhpZGVTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKGZhbHNlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlRmVlZGJhY2soc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUpOwotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlID0gbnVsbDsKLQkJCX0KLQkJCWhpZGVGb2N1cygpOwotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd0ZvY3VzKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWhpZGVGb2N1cygpOwotCQkJYWRkRmVlZGJhY2soZm9jdXNGZWVkYmFja0ZpZ3VyZSA9IGNyZWF0ZUZvY3VzRmVlZGJhY2tGaWd1cmUoKSk7Ci0JCQlyZWZyZXNoRm9jdXNGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZUZvY3VzKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZm9jdXNGZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlRmVlZGJhY2soZm9jdXNGZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJZm9jdXNGZWVkYmFja0ZpZ3VyZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgUmVjdGFuZ2xlIGdldEZlZWRiYWNrQm91bmRzKCkgewotCQlSZWN0YW5nbGUgYm91bmRzOwotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCWJvdW5kcyA9ICgoTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuZ2V0VGV4dEJvdW5kcygpOwotCQkJYm91bmRzLmludGVyc2VjdChnZXRIb3N0RmlndXJlKCkuZ2V0Qm91bmRzKCkpOwotCQl9IGVsc2UgewotCQkJYm91bmRzID0gZ2V0SG9zdEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJfQotCQlnZXRIb3N0RmlndXJlKCkuZ2V0UGFyZW50KCkudHJhbnNsYXRlVG9BYnNvbHV0ZShib3VuZHMpOwotCQlnZXRGZWVkYmFja0xheWVyKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShib3VuZHMpOwotCQlyZXR1cm4gYm91bmRzOwotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZVNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCUxhYmVsIGZlZWRiYWNrRmlndXJlID0gbmV3IExhYmVsKCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZS5zZXRPcGFxdWUodHJ1ZSk7Ci0JCQlmZWVkYmFja0ZpZ3VyZS5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubWVudUJhY2tncm91bmRTZWxlY3RlZCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubWVudUZvcmVncm91bmRTZWxlY3RlZCk7Ci0JCQlyZXR1cm4gZmVlZGJhY2tGaWd1cmU7Ci0JCX0gZWxzZSB7Ci0JCQlSZWN0YW5nbGVGaWd1cmUgZmVlZGJhY2tGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZS5zZXRGaWxsKGZhbHNlKTsKLQkJCXJldHVybiBmZWVkYmFja0ZpZ3VyZTsKLQkJfQotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZvY3VzRmVlZGJhY2tGaWd1cmUoKSB7Ci0JCXJldHVybiBuZXcgRmlndXJlKCkgewotCi0JCQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQkJCWdyYXBoaWNzLmRyYXdGb2N1cyhnZXRCb3VuZHMoKS5nZXRSZXNpemVkKC0xLCAtMSkpOwotCQkJfQotCQl9OwotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUxhYmVsKExhYmVsIHRhcmdldCkgewotCQlMYWJlbCBzb3VyY2UgPSAoTGFiZWwpIGdldEhvc3RGaWd1cmUoKTsKLQkJdGFyZ2V0LnNldFRleHQoc291cmNlLmdldFRleHQoKSk7Ci0JCXRhcmdldC5zZXRUZXh0QWxpZ25tZW50KHNvdXJjZS5nZXRUZXh0QWxpZ25tZW50KCkpOwotCQl0YXJnZXQuc2V0Rm9udChzb3VyY2UuZ2V0Rm9udCgpKTsKLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKSB7Ci0JCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJCXVwZGF0ZUxhYmVsKChMYWJlbCkgc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUpOwotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkuZXhwYW5kKDUsIDUpKTsKLQkJCX0KLQkJfQotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb2N1c0ZlZWRiYWNrKCkgewotCQlpZiAoZm9jdXNGZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQlmb2N1c0ZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpKTsKLQkJfQotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hGZWVkYmFjaygpIHsKLQkJcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0JCXJlZnJlc2hGb2N1c0ZlZWRiYWNrKCk7Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJTW92ZUhhbmRsZSBtb3ZlSGFuZGxlID0KLQkJCW5ldyBNb3ZlSGFuZGxlKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsKLQkJbW92ZUhhbmRsZS5zZXRCb3JkZXIobnVsbCk7Ci0JCW1vdmVIYW5kbGUuc2V0RHJhZ1RyYWNrZXIobmV3IERyYWdFZGl0UGFydHNUcmFja2VyRXgoZ2V0SG9zdCgpKSk7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG1vdmVIYW5kbGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTRiZWZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuU2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci0KLQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5IGV4dGVuZHMgU2VsZWN0aW9uRWRpdFBvbGljeSB7Ci0KLQkKLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcml2YXRlIElGaWd1cmUgc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmU7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcml2YXRlIElGaWd1cmUgZm9jdXNGZWVkYmFja0ZpZ3VyZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dQcmltYXJ5U2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJc2hvd1NlbGVjdGlvbigpOwotCQkJc2hvd0ZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93U2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWhpZGVTZWxlY3Rpb24oKTsKLQkJCWFkZEZlZWRiYWNrKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlID0gY3JlYXRlU2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUoKSk7Ci0JCQlyZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKTsKLQkJCWhpZGVGb2N1cygpOwotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZVNlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQoZmFsc2UpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCQlyZW1vdmVGZWVkYmFjayhzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgPSBudWxsOwotCQkJfQotCQkJaGlkZUZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93Rm9jdXMoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJaGlkZUZvY3VzKCk7Ci0JCQlhZGRGZWVkYmFjayhmb2N1c0ZlZWRiYWNrRmlndXJlID0gY3JlYXRlRm9jdXNGZWVkYmFja0ZpZ3VyZSgpKTsKLQkJCXJlZnJlc2hGb2N1c0ZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlRm9jdXMoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmb2N1c0ZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCQlyZW1vdmVGZWVkYmFjayhmb2N1c0ZlZWRiYWNrRmlndXJlKTsKLQkJCQlmb2N1c0ZlZWRiYWNrRmlndXJlID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCBSZWN0YW5nbGUgZ2V0RmVlZGJhY2tCb3VuZHMoKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHM7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJYm91bmRzID0gKChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5nZXRUZXh0Qm91bmRzKCk7Ci0JCQlib3VuZHMuaW50ZXJzZWN0KGdldEhvc3RGaWd1cmUoKS5nZXRCb3VuZHMoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlib3VuZHMgPSBnZXRIb3N0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQl9Ci0JCWdldEhvc3RGaWd1cmUoKS5nZXRQYXJlbnQoKS50cmFuc2xhdGVUb0Fic29sdXRlKGJvdW5kcyk7Ci0JCWdldEZlZWRiYWNrTGF5ZXIoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGJvdW5kcyk7Ci0JCXJldHVybiBib3VuZHM7Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlU2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJTGFiZWwgZmVlZGJhY2tGaWd1cmUgPSBuZXcgTGFiZWwoKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldE9wYXF1ZSh0cnVlKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51Rm9yZWdyb3VuZFNlbGVjdGVkKTsKLQkJCXJldHVybiBmZWVkYmFja0ZpZ3VyZTsKLQkJfSBlbHNlIHsKLQkJCVJlY3RhbmdsZUZpZ3VyZSBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldEZpbGwoZmFsc2UpOwotCQkJcmV0dXJuIGZlZWRiYWNrRmlndXJlOwotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRm9jdXNGZWVkYmFja0ZpZ3VyZSgpIHsKLQkJcmV0dXJuIG5ldyBGaWd1cmUoKSB7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCQkJZ3JhcGhpY3MuZHJhd0ZvY3VzKGdldEJvdW5kcygpLmdldFJlc2l6ZWQoLTEsIC0xKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTGFiZWwoTGFiZWwgdGFyZ2V0KSB7Ci0JCUxhYmVsIHNvdXJjZSA9IChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpOwotCQl0YXJnZXQuc2V0VGV4dChzb3VyY2UuZ2V0VGV4dCgpKTsKLQkJdGFyZ2V0LnNldFRleHRBbGlnbm1lbnQoc291cmNlLmdldFRleHRBbGlnbm1lbnQoKSk7Ci0JCXRhcmdldC5zZXRGb250KHNvdXJjZS5nZXRGb250KCkpOwotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpIHsKLQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQkJdXBkYXRlTGFiZWwoKExhYmVsKSBzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKS5leHBhbmQoNSwgNSkpOwotCQkJfQotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvY3VzRmVlZGJhY2soKSB7Ci0JCWlmIChmb2N1c0ZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCWZvY3VzRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkpOwotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHVibGljIHZvaWQgcmVmcmVzaEZlZWRiYWNrKCkgewotCQlyZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKTsKLQkJcmVmcmVzaEZvY3VzRmVlZGJhY2soKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZXhwcmVzc2lvbnMvVU1MQWJzdHJhY3RFeHByZXNzaW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZXhwcmVzc2lvbnMvVU1MQWJzdHJhY3RFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYjM5Y2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2V4cHJlc3Npb25zL1VNTEFic3RyYWN0RXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZXhwcmVzc2lvbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVU1MQWJzdHJhY3RFeHByZXNzaW9uIHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBESVNBQkxFRF9OT19JTVBMX0VYQ0VQVElPTl9MT0cgPSBCb29sZWFuCi0JCQkudmFsdWVPZigKLQkJCQkJUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkKLQkJCQkJCQkrICIvZGVidWcvZGlzYWJsZU5vRXhwckltcGxFeGNlcHRpb25Mb2ciKSkKLQkJCS5ib29sZWFuVmFsdWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBib2R5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzaWZpZXIgY29udGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1hcCBlbnY7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFVNTEFic3RyYWN0RXhwcmVzc2lvbihFQ2xhc3NpZmllciBjb250ZXh0KSB7Ci0JCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBVTUxBYnN0cmFjdEV4cHJlc3Npb24oU3RyaW5nIGJvZHksIEVDbGFzc2lmaWVyIGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJdGhpcy5ib2R5ID0gYm9keTsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQkJdGhpcy5lbnYgPSBlbnY7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCVN0cmluZyBwbHVnaW5JRCA9IEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5JRDsKLQkJdGhpcy5zdGF0dXMgPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBwbHVnaW5JRCwgLTEsCi0JCQkJKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIiIsIHRocm93YWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCF0aGlzLnN0YXR1cy5pc09LKCkpIHsKLQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCQkuZ2V0SW5zdGFuY2UoKQotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkV4cHJlc3Npb24gcHJvYmxlbToiICsgbWVzc2FnZSArICJib2R5OiIgKyBib2R5LCB0aHJvd2FibGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgZG9FdmFsdWF0ZShPYmplY3QgY29udGV4dCwgTWFwIGVudik7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBldmFsdWF0ZShPYmplY3QgY29udGV4dCkgewotCQlyZXR1cm4gZXZhbHVhdGUoY29udGV4dCwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBldmFsdWF0ZShPYmplY3QgY29udGV4dCwgTWFwIGVudikgewotCQlpZiAoY29udGV4dCgpLmlzSW5zdGFuY2UoY29udGV4dCkpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGRvRXZhbHVhdGUoY29udGV4dCwgZW52KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKERJU0FCTEVEX05PX0lNUExfRVhDRVBUSU9OX0xPRwotCQkJCQkJJiYgZSBpbnN0YW5jZW9mIE5vSW1wbEV4Y2VwdGlvbikgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkiRXhwcmVzc2lvbiBldmFsdWF0aW9uIGZhaWx1cmU6ICIgKyBib2R5LCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGJvZHkoKSB7Ci0JCXJldHVybiBib2R5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzaWZpZXIgY29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNYXAgZW52aXJvbm1lbnQoKSB7Ci0JCXJldHVybiBlbnY7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYXNzaWduVG8oRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVPYmplY3QgdGFyZ2V0KSB7Ci0JCS8vCQltb2RpZmllZCB0byBjb21tZW50IHRoaXMgb3V0Ci0JCWV2YWx1YXRlKHRhcmdldCk7Ci0JCS8vCQl2YWx1ZSA9ICh2YWx1ZSAhPSBudWxsKSA/IHBlcmZvcm1DYXN0KHZhbHVlLCBmZWF0dXJlKSA6IG51bGw7Ci0JCS8vCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkvLwkJCUNvbGxlY3Rpb24gZGVzdENvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgdGFyZ2V0LmVHZXQoZmVhdHVyZSk7Ci0JCS8vCQkJZGVzdENvbGxlY3Rpb24uY2xlYXIoKTsKLQkJLy8JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCS8vCQkJCUNvbGxlY3Rpb24gdmFsdWVDb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIHZhbHVlOwotCQkvLwkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmFsdWVDb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJLy8JCQkJCWRlc3RDb2xsZWN0aW9uLmFkZChwZXJmb3JtQ2FzdChpdC5uZXh0KCksIGZlYXR1cmUpKTsKLQkJLy8JCQkJfQotCQkvLwkJCX0gZWxzZSB7Ci0JCS8vCQkJCWRlc3RDb2xsZWN0aW9uLmFkZCh2YWx1ZSk7Ci0JCS8vCQkJfQotCQkvLwkJCXJldHVybjsKLQkJLy8JCX0KLQkJLy8JCXRhcmdldC5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBwZXJmb3JtQ2FzdChPYmplY3QgdmFsdWUsIEVUeXBlZEVsZW1lbnQgdGFyZ2V0VHlwZSkgewotCQlpZiAodGFyZ2V0VHlwZS5nZXRFVHlwZSgpID09IG51bGwKLQkJCQl8fCB0YXJnZXRUeXBlLmdldEVUeXBlKCkuZ2V0SW5zdGFuY2VDbGFzcygpID09IG51bGwpIHsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCQlDbGFzcyB0YXJnZXRDbGFzcyA9IHRhcmdldFR5cGUuZ2V0RVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQlOdW1iZXIgbnVtID0gKE51bWJlcikgdmFsdWU7Ci0JCQlDbGFzcyB2YWxDbGFzcyA9IHZhbHVlLmdldENsYXNzKCk7Ci0JCQlDbGFzcyB0YXJnZXRXcmFwcGVyQ2xhc3MgPSB0YXJnZXRDbGFzczsKLQkJCWlmICh0YXJnZXRDbGFzcy5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQkJdGFyZ2V0V3JhcHBlckNsYXNzID0gRWNvcmVVdGlsLndyYXBwZXJDbGFzc0Zvcih0YXJnZXRDbGFzcyk7Ci0JCQl9Ci0JCQlpZiAodmFsQ2xhc3MuZXF1YWxzKHRhcmdldFdyYXBwZXJDbGFzcykpIHsKLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQl9Ci0JCQlpZiAoTnVtYmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odGFyZ2V0V3JhcHBlckNsYXNzKSkgewotCQkJCWlmICh0YXJnZXRXcmFwcGVyQ2xhc3MuZXF1YWxzKEJ5dGUuY2xhc3MpKQotCQkJCQlyZXR1cm4gbmV3IEJ5dGUobnVtLmJ5dGVWYWx1ZSgpKTsKLQkJCQlpZiAodGFyZ2V0V3JhcHBlckNsYXNzLmVxdWFscyhJbnRlZ2VyLmNsYXNzKSkKLQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKG51bS5pbnRWYWx1ZSgpKTsKLQkJCQlpZiAodGFyZ2V0V3JhcHBlckNsYXNzLmVxdWFscyhTaG9ydC5jbGFzcykpCi0JCQkJCXJldHVybiBuZXcgU2hvcnQobnVtLnNob3J0VmFsdWUoKSk7Ci0JCQkJaWYgKHRhcmdldFdyYXBwZXJDbGFzcy5lcXVhbHMoTG9uZy5jbGFzcykpCi0JCQkJCXJldHVybiBuZXcgTG9uZyhudW0ubG9uZ1ZhbHVlKCkpOwotCQkJCWlmICh0YXJnZXRXcmFwcGVyQ2xhc3MuZXF1YWxzKEJpZ0ludGVnZXIuY2xhc3MpKQotCQkJCQlyZXR1cm4gQmlnSW50ZWdlci52YWx1ZU9mKG51bS5sb25nVmFsdWUoKSk7Ci0JCQkJaWYgKHRhcmdldFdyYXBwZXJDbGFzcy5lcXVhbHMoRmxvYXQuY2xhc3MpKQotCQkJCQlyZXR1cm4gbmV3IEZsb2F0KG51bS5mbG9hdFZhbHVlKCkpOwotCQkJCWlmICh0YXJnZXRXcmFwcGVyQ2xhc3MuZXF1YWxzKERvdWJsZS5jbGFzcykpCi0JCQkJCXJldHVybiBuZXcgRG91YmxlKG51bS5kb3VibGVWYWx1ZSgpKTsKLQkJCQlpZiAodGFyZ2V0V3JhcHBlckNsYXNzLmVxdWFscyhCaWdEZWNpbWFsLmNsYXNzKSkKLQkJCQkJcmV0dXJuIG5ldyBCaWdEZWNpbWFsKG51bS5kb3VibGVWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVU1MQWJzdHJhY3RFeHByZXNzaW9uIGNyZWF0ZU51bGxFeHByZXNzaW9uKAotCQkJRUNsYXNzaWZpZXIgY29udGV4dCkgewotCQlyZXR1cm4gbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbihjb250ZXh0KSB7Ci0JCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJCQkvLyBUT0RPIC0gbG9nIGVudHJ5IGFib3V0IG5vdCBwcm92aWRlciBhdmFpbGFibGUgZm9yIHRoaXMgZXhwcmVzc2lvbgotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE5vSW1wbEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIE5vSW1wbEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQkJc3VwZXIobWVzc2FnZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9BY3Rpdml0eURpYWdyYW1FZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L0FjdGl2aXR5RGlhZ3JhbUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2EyY2UyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L0FjdGl2aXR5RGlhZ3JhbUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRGVsZWdhdGluZ0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGF5ZXJlZFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLkFEREltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuRGlhZ3JhbUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5HRUZBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMuVmlld1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLkFjdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbVJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2F2ZUFzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAbW9kaWZpZWQKLSAqIEBhdXRob3Igc2thbm5vb3IKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGlhZ3JhbUVkaXRvciBleHRlbmRzIEFic3RyYWN0RGlhZ3JhbUVkaXRvciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JJRCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEaWFncmFtRWRpdG9yKCkgewotCQlzdXBlcih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpOwotCQlEaWFncmFtUm9vdEVkaXRQYXJ0IHJvb3QgPSAoRGlhZ3JhbVJvb3RFZGl0UGFydCkgZ2V0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcigpCi0JCQkJLmdldFJvb3RFZGl0UGFydCgpOwotCQlMYXllcmVkUGFuZSBwcmludGFibGVMYXllcnMgPSAoTGF5ZXJlZFBhbmUpIHJvb3QKLQkJCQkuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuUFJJTlRBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgZXh0TGFiZWxzTGF5ZXIgPSBuZXcgRnJlZWZvcm1MYXllcigpOwotCQlleHRMYWJlbHNMYXllci5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBEZWxlZ2F0aW5nTGF5b3V0KCkpOwotLy8JCXByaW50YWJsZUxheWVycy5hZGRMYXllckFmdGVyKGV4dExhYmVsc0xheWVyLAotLy8JCQkJVU1MRWRpdFBhcnRGYWN0b3J5LkVYVEVSTkFMX05PREVfTEFCRUxTX0xBWUVSLAotLy8JCQkJTGF5ZXJDb25zdGFudHMuUFJJTUFSWV9MQVlFUik7Ci0JCUxheWVyZWRQYW5lIHNjYWxhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlNDQUxBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgc2NhbGVkRmVlZGJhY2tMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCXNjYWxlZEZlZWRiYWNrTGF5ZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXNjYWxhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoc2NhbGVkRmVlZGJhY2tMYXllciwKLQkJCQlMYXllckNvbnN0YW50cy5TQ0FMRURfRkVFREJBQ0tfTEFZRVIsCi0JCQkJRGlhZ3JhbVJvb3RFZGl0UGFydC5ERUNPUkFUSU9OX1VOUFJJTlRBQkxFX0xBWUVSKTsKLQl9Ci0JCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotLy8JcHJvdGVjdGVkIFBhbGV0dGVSb290IGNyZWF0ZVBhbGV0dGVSb290KFBhbGV0dGVSb290IGV4aXN0aW5nUGFsZXR0ZVJvb3QpIHsKLS8vCQlQYWxldHRlUm9vdCByb290ID0gc3VwZXIuY3JlYXRlUGFsZXR0ZVJvb3QoZXhpc3RpbmdQYWxldHRlUm9vdCk7Ci0vLwkJbmV3IFVNTFBhbGV0dGVGYWN0b3J5KCkuZmlsbFBhbGV0dGUocm9vdCk7Ci0vLwkJcmV0dXJuIHJvb3Q7Ci0vLwl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXNIaW50IGdldFByZWZlcmVuY2VzSGludCgpIHsKLQkJcmV0dXJuIG5ldyBQcmVmZXJlbmNlc0hpbnQoQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLklEKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgdHlwZSkgewotLy8JCWlmICh0eXBlID09IElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcykgewotLy8JCQlyZXR1cm4gbnVsbDsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBJRG9jdW1lbnRQcm92aWRlciBnZXREb2N1bWVudFByb3ZpZGVyKElFZGl0b3JJbnB1dCBpbnB1dCkgewotLy8JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQKLS8vCQkJCXx8IGlucHV0IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLS8vCQkJcmV0dXJuIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0vLwkJCQkJLmdldERvY3VtZW50UHJvdmlkZXIoKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXREb2N1bWVudFByb3ZpZGVyKGlucHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLS8vCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRFZGl0b3JJbnB1dCgpICE9IG51bGwgPyBnZXREb2N1bWVudFByb3ZpZGVyKCkKLS8vCQkJCS5nZXREb2N1bWVudChnZXRFZGl0b3JJbnB1dCgpKSA6IG51bGw7Ci0vLwkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSURpYWdyYW1Eb2N1bWVudCkgewotLy8JCQlyZXR1cm4gKChJRGlhZ3JhbURvY3VtZW50KSBkb2N1bWVudCkuZ2V0RWRpdGluZ0RvbWFpbigpOwotLy8JCX0KLS8vCQlyZXR1cm4gc3VwZXIuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlyZXR1cm4gZ2V0RGlhZ3JhbU1hbmFnZXIoKS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RG9jdW1lbnRQcm92aWRlcihJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLS8vCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0Ci0vLwkJCQl8fCBpbnB1dCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7Ci0vLwkJCXNldERvY3VtZW50UHJvdmlkZXIoQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLS8vCQkJCQkuZ2V0RG9jdW1lbnRQcm92aWRlcigpKTsKLS8vCQl9IGVsc2UgewotLy8JCQlzdXBlci5zZXREb2N1bWVudFByb3ZpZGVyKGlucHV0KTsKLS8vCQl9Ci0JCXN1cGVyLnNldERvY3VtZW50UHJvdmlkZXIoaW5wdXQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLS8vCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLS8vCQlNYXJrZXJOYXZpZ2F0aW9uU2VydmljZS5nZXRJbnN0YW5jZSgpLmdvdG9NYXJrZXIodGhpcywgbWFya2VyKTsKLS8vCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1NhdmVBc0FsbG93ZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLS8vCQlzdXBlci5kb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSkKLQkJcGVyZm9ybVNhdmVBcyhuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVNhdmVBcyhJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlTaGVsbCBzaGVsbCA9IGdldFNpdGUoKS5nZXRTaGVsbCgpOwotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOwotCQlTYXZlQXNEaWFsb2cgZGlhbG9nID0gbmV3IFNhdmVBc0RpYWxvZyhzaGVsbCk7Ci0JCUlGaWxlIG9yaWdpbmFsID0gaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0ID8gKChJRmlsZUVkaXRvcklucHV0KSBpbnB1dCkKLQkJCQkuZ2V0RmlsZSgpCi0JCQkJOiBudWxsOwotCQlpZiAob3JpZ2luYWwgIT0gbnVsbCkgewotCQkJZGlhbG9nLnNldE9yaWdpbmFsRmlsZShvcmlnaW5hbCk7Ci0JCX0KLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlciA9IGdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLQkJCS8vIGVkaXRvciBoYXMgYmVlbiBwcm9ncmFtbWF0aWNhbGx5IGNsb3NlZCB3aGlsZSB0aGUgZGlhbG9nIHdhcyBvcGVuCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHByb3ZpZGVyLmlzRGVsZXRlZChpbnB1dCkgJiYgb3JpZ2luYWwgIT0gbnVsbCkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZCgKLQkJCQkJIlRoZSBvcmlnaW5hbCBmaWxlICcnezB9JycgaGFzIGJlZW4gZGVsZXRlZC4iLCBvcmlnaW5hbAotCQkJCQkJCS5nZXROYW1lKCkpOwotCQkJZGlhbG9nLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCWRpYWxvZy5zZXRNZXNzYWdlKG1lc3NhZ2UsIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCX0KLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkgewotCQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJcHJvZ3Jlc3NNb25pdG9yLnNldENhbmNlbGVkKHRydWUpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCUlQYXRoIGZpbGVQYXRoID0gZGlhbG9nLmdldFJlc3VsdCgpOwotCQlpZiAoZmlsZVBhdGggPT0gbnVsbCkgewotCQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJcHJvZ3Jlc3NNb25pdG9yLnNldENhbmNlbGVkKHRydWUpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJRmlsZSBmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlKGZpbGVQYXRoKTsKLQkJZmluYWwgSUVkaXRvcklucHV0IG5ld0lucHV0ID0gbmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKTsKLQkJLy8gQ2hlY2sgaWYgdGhlIGVkaXRvciBpcyBhbHJlYWR5IG9wZW4KLQkJSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgbWF0Y2hpbmdTdHJhdGVneSA9IGdldEVkaXRvckRlc2NyaXB0b3IoKQotCQkJCS5nZXRFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5KCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChtYXRjaGluZ1N0cmF0ZWd5Lm1hdGNoZXMoZWRpdG9yUmVmc1tpXSwgbmV3SW5wdXQpKSB7Ci0JCQkJTWVzc2FnZURpYWxvZwotCQkJCQkJLm9wZW5XYXJuaW5nKHNoZWxsLCAiUHJvYmxlbSBEdXJpbmcgU2F2ZSBBcy4uLiIsCi0JCQkJCQkJCSJTYXZlIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQuIFRhcmdldCBmaWxlIGlzIGFscmVhZHkgb3BlbiBpbiBhbm90aGVyIGVkaXRvci4iKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlwcm92aWRlci5hYm91dFRvQ2hhbmdlKG5ld0lucHV0KTsKLQkJCWdldERvY3VtZW50UHJvdmlkZXIobmV3SW5wdXQpLnNhdmVEb2N1bWVudChwcm9ncmVzc01vbml0b3IsCi0JCQkJCW5ld0lucHV0LAotCQkJCQlnZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZ2V0RWRpdG9ySW5wdXQoKSksIHRydWUpOwotCQkJc3VjY2VzcyA9IHRydWU7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24geCkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSB4LmdldFN0YXR1cygpOwotCQkJaWYgKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuQ0FOQ0VMKSB7Ci0JCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCAiU2F2ZSBQcm9ibGVtcyIsCi0JCQkJCQkiQ291bGQgbm90IHNhdmUgZmlsZS4iLCB4LmdldFN0YXR1cygpKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXByb3ZpZGVyLmNoYW5nZWQobmV3SW5wdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQlzZXRJbnB1dChuZXdJbnB1dCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7Ci0JCQlwcm9ncmVzc01vbml0b3Iuc2V0Q2FuY2VsZWQoIXN1Y2Nlc3MpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRG91YmxlQ2xpY2soRXZlbnQgZXZlbnQpIHsKLQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCi0JCS8vIGRvIG5vdGhpbmcgaWYgMCBvciBtb3JlIHRoYW4gMSBlZGl0IHBhcnRzIGFyZSBzZWxlY3RlZAotCQkvLwotCQlpZiAoZWRpdFBhcnRzLnNpemUoKSAhPSAxKQotCQkJcmV0dXJuOwotCi0JCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDApOwotCQlOb2RlIG5vZGUgPSAoTm9kZSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJRU9iamVjdCBtb2RlbCA9IG5vZGUuZ2V0RWxlbWVudCgpOwotCQlEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkgZWRpdG9ySW5wdXQgPSAoRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5KSBnZXRFZGl0b3JJbnB1dCgpOwotCQlEaWFncmFtRWRpdG9ySW5wdXQgZElucHV0ID0gZWRpdG9ySW5wdXQuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCk7Ci0KLQkJaWYgKG1vZGVsIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIHsKLQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG1vZGVsKTsKLQkJCU9iamVjdCBlID0gbnVsbDsKLQkJCS8vIFRPRE86IGhhbmRsZSBXcmFwcGVyIGNoYW5nZSBiZWxvdyBsaW5lIGFmdGVyIHdyYXBwZXIgaW1wbGVtZW50Ci0JCQllID0gbm9kZUFkYXB0ZXIuZ2V0RWxlbWVudCgpOwotCQkJaWYgKGUgPT0gbnVsbCkgewotCQkJCWUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCgoRU1vZGVsRWxlbWVudCkgbW9kZWwpOwotCQkJfQotCQkJaWYgKGUgIT0gbnVsbCkgewotCQkJCS8vCQkJCUlFZGl0b3JQYXJ0IHBhcmVudCA9IGdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0ID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQoCi0JCQkJCQllLCBkSW5wdXQuZ2V0U3VwcHJlc3Npb24oKSwKLQkJCQkJCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKTsKLQkJCQlEaWFncmFtRWRpdG9yVXRpbC5vcGVuRGlhZ3JhbUVkaXRvcihnZXRTaXRlKCkuZ2V0UGFnZSgpLCBpbnB1dCwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQsCi0JCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQlzdXBlci5jcmVhdGVBY3Rpb25zKCk7Ci0JCUlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIERpYWdyYW1Db25zdGFudHMuT1BFTl9BQ1RJVklUWV9ERVRBSUxfRElBR1JBTTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCUVkaXRQYXJ0IHNlbGVjdGVkUGFydCA9IChFZGl0UGFydCkgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkJCQkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKS5nZXQoMCk7Ci0JCQkJCS8vCQkJCQlJRWRpdG9yUGFydCBwYXJlbnQgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCQlpZiAoc2VsZWN0ZWRQYXJ0ICE9IG51bGwpIHsKLQkJCQkJCU5vZGUgdmlldyA9IChOb2RlKSBzZWxlY3RlZFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJCURpYWdyYW1FZGl0UGFydCBkaWFncmFtRWRpdFBhcnQgPSBnZXREaWFncmFtRWRpdFBhcnQoKTsKLQkJCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBkaWFncmFtRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJCURpYWdyYW1BZGFwdGVyIGRpYWdyYW1BZGFwdGVyID0gQnJpZGdlSGVscGVyCi0JCQkJCQkJCS5nZXREaWFncmFtQWRhcHRlcihkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0KLQkJCQkJCU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIodmlldwotCQkJCQkJCQkuZ2V0RWxlbWVudCgpKTsKLQkJCQkJCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IGFkYXB0ZXIuZ2V0V3JhcHBlcigpOwotCQkJCQkJaWYgKHNlbGVjdGVkT2JqZWN0ID09IG51bGwpIHsKLQkJCQkJCQlzZWxlY3RlZE9iamVjdCA9IGFkYXB0ZXIuZ2V0RWxlbWVudCgpOwotCQkJCQkJfQotCQkJCQkJLy8gSUVkaXRvclBhcnQgcGFyZW50ID0KLQkJCQkJCS8vIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0ID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQoCi0JCQkJCQkJCXNlbGVjdGVkT2JqZWN0LAotCQkJCQkJCQlkaWFncmFtQWRhcHRlci5nZXRTdXBwcmVzc2lvbigpLAotCQkJCQkJCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pOwotCQkJCQkJRGlhZ3JhbUVkaXRvclV0aWwKLQkJCQkJCQkJLm9wZW5EaWFncmFtRWRpdG9yKAotCQkJCQkJCQkJCWdldFNpdGUoKS5nZXRQYWdlKCksCi0JCQkJCQkJCQkJaW5wdXQsCi0JCQkJCQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCwKLQkJCQkJCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJfQotCi0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpICE9IDEpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJCQlWaWV3IG5vZGUgPSAoVmlldykgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQlpZiAobm9kZSAhPSBudWxsCi0JCQkJCQkmJiBub2RlLmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJCQkmJiBub2RlLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIHsKLQkJCQkJaWYgKGVuYWJsZUFERE1lbnUobm9kZS5nZXRFbGVtZW50KCkpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoQURESW1hZ2VzLklNR19ERVNDX0VESVRPUik7Ci0JCWFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihBRERJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfRURJVE9SKTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCUxpc3Q8SUVsZW1lbnRUeXBlPiBlbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJZWxlbWVudFR5cGVzLmNsZWFyKCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzEwMDgpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8yMDAxKTsKLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BhcnRpdGlvbl9Ob2RlX3RleHQsCi0JCQkJZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfUEFSVElUSU9OLAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9QYXJ0aXRpb25fTm9kZV90b29sdGlwLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eVBhcnRpdGlvbigpLAotCQkJCQkJVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQllbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuSW5pdGlhbE5vZGVfMTAwNCk7Ci0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdGV4dCwKLQkJCQllbGVtZW50VHlwZXMsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9TVEFSVF9OT0RFLAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdG9vbHRpcCwgLy8kTk9OLU5MUy0xJAotCQkJCVVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRJbml0aWFsTm9kZSgpLCBVTUxFbGVtZW50VHlwZXMuSW5pdGlhbE5vZGVfMTAwNCkpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQllbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuRm9ya05vZGVfMTAwMyk7Ci0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9Gb3JrX05vZGVfdGV4dCwKLQkJCQllbGVtZW50VHlwZXMsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9GT1JLX05PREUsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0ZvcmtfTm9kZV90b29sdGlwLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRGb3JrTm9kZSgpLCBVTUxFbGVtZW50VHlwZXMuRm9ya05vZGVfMTAwMykpOyAvLyROT04tTkxTLTEkCi0KLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5Kb2luTm9kZV8xMDA2KTsKLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0pvaW5fTm9kZV90ZXh0LAotCQkJCWVsZW1lbnRUeXBlcywgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1Db25zdGFudHMuQ1JFQVRFX0pPSU5fTk9ERSwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fSm9pbl9Ob2RlX3Rvb2x0aXAsCi0JCQkJVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEpvaW5Ob2RlKCksIFVNTEVsZW1lbnRUeXBlcy5Kb2luTm9kZV8xMDA2KSk7IC8vJE5PTi1OTFMtMSQKLQotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkRlY2lzaW9uTm9kZV8xMDA1KTsKLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90ZXh0LAotCQkJCWVsZW1lbnRUeXBlcywgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1Db25zdGFudHMuQ1JFQVRFX0RFQ0lTSU9OX05PREUsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90b29sdGlwLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZWNpc2lvbk5vZGUoKSwgVU1MRWxlbWVudFR5cGVzLkRlY2lzaW9uTm9kZV8xMDA1KSk7IC8vJE5PTi1OTFMtMSQKLQotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLk1lcmdlTm9kZV8xMDAyKTsKLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX01lcmdlX05vZGVfdGV4dCwKLQkJCQllbGVtZW50VHlwZXMsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9NRVJHRV9OT0RFLAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9NZXJnZV9Ob2RlX3Rvb2x0aXAsCi0JCQkJVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERlY2lzaW9uTm9kZSgpLCBVTUxFbGVtZW50VHlwZXMuTWVyZ2VOb2RlXzEwMDIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQllbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlGaW5hbE5vZGVfMTAwMSk7Ci0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3RleHQsCi0JCQkJZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfRU5EX05PREUsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdG9vbHRpcCwKLQkJCQlVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlGaW5hbE5vZGUoKSwKLQkJCQkJCVVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eUZpbmFsTm9kZV8xMDAxKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyk7Ci0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0LAotCQkJCWVsZW1lbnRUeXBlcywgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1Db25zdGFudHMuQ1JFQVRFX0FDVElWSVRZLAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90b29sdGlwLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IobnVsbCwKLQkJCQkJCVVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQllbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExKTsKLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0LAotCQkJCWVsZW1lbnRUeXBlcywgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1Db25zdGFudHMuQ1JFQVRFX0lURVJBVElPTiwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3Rvb2x0aXAsCi0JCQkJVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihudWxsLAotCQkJCQkJVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSkpOyAvLyROT04tTkxTLTEkCi0KLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTApOwotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGhhc2VfdGV4dCwKLQkJCQllbGVtZW50VHlwZXMsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9QSEFTRSwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGhhc2VfdG9vbHRpcCwKLQkJCQlVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKG51bGwsCi0JCQkJCQlVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5KTsKLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQsCi0JCQkJZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfVEFTS19ERVNDUklQVE9SLAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90b29sdGlwLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IobnVsbCwKLQkJCQkJCVVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSkpOyAvLyROT04tTkxTLTEkCi0KLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMik7Ci0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9NaWxlc3RvbmVfdGV4dCwKLQkJCQllbGVtZW50VHlwZXMsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9NSUxFU1RPTkUsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX01pbGVzdG9uZV90b29sdGlwLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IobnVsbCwKLQkJCQkJCVVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMikpOyAvLyROT04tTkxTLTEkCi0KLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlQURETWVudShFT2JqZWN0IGVsZW1lbnQpIHsKLQkJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlcgotCQkJCS5nZXROb2RlQWRhcHRlcigoQWN0aXZpdHlOb2RlKSBlbGVtZW50KTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gYWRhcHRlci5nZXRXcmFwcGVyKCk7Ci0JCQlpZiAoc2VsZWN0ZWRPYmplY3QgPT0gbnVsbCkgewotCQkJCXNlbGVjdGVkT2JqZWN0ID0gYWRhcHRlci5nZXRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IG51bGw7Ci0JCQlMaXN0PEJyZWFrZG93bkVsZW1lbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEJyZWFrZG93bkVsZW1lbnQ+KCk7Ci0KLQkJCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHNlbGVjdGVkT2JqZWN0OwotCQkJfSBlbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCWFjdGl2aXR5ID0gKEFjdGl2aXR5KSAoKEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgc2VsZWN0ZWRPYmplY3QpCi0JCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJCWlmIChhY3Rpdml0eSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXdoaWxlICghYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkuZXF1YWxzKAotCQkJCQlWYXJpYWJpbGl0eVR5cGUuTkEpKSB7Ci0KLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJbGlzdC5hZGRBbGwoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSk7Ci0KLQkJCQlpZiAoKHZlICE9IG51bGwpICYmICh2ZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJCQlhY3Rpdml0eSA9IChBY3Rpdml0eSkgdmU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJLy9Db2xsZWN0IHRoZSBicmVha2Rvd24gZWxlbWVudHMgdG8gdmVyaWZ5IHRhc2tkZXNjcmlwdG9ycyBhcmUKLQkJCS8vIG5vdC4KLQkJCWxpc3QuYWRkQWxsKGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkpOwotCQkJRGlhZ3JhbSBkaWFncmFtID0gZ2V0RGlhZ3JhbShhY3Rpdml0eSwKLQkJCQkJSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNKTsKLQotCQkJaWYgKGRpYWdyYW0gPT0gbnVsbAotCQkJCQkmJiBzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBMaXN0LCB0byBmaW5kIHRhc2tkZXNjcmlwdG9yIGFuZCBoYXMKLQkJCQkvLyBwcmltYXJ5IHJvbGUgd2l0aGluIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLQkJCQkvLyB0aGVuIGVuYWJsZSB0aGUgYWN0aW9uLgotCQkJCURpYWdyYW1BZGFwdGVyIGRpYWdyYW1BZGFwdGVyID0gQnJpZGdlSGVscGVyCi0JCQkJCQkuZ2V0RGlhZ3JhbUFkYXB0ZXIoZ2V0RGlhZ3JhbSgpLmdldEVsZW1lbnQoKSk7Ci0JCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBkaWFncmFtQWRhcHRlci5nZXRTdXBwcmVzc2lvbigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCQlpZiAoc3VwcHJlc3Npb24gIT0gbnVsbCkgewotCQkJCQkJCWlmIChzdXBwcmVzc2lvbi5pc1N1cHByZXNzZWQob2JqKSkKLQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQkJT2JqZWN0IGUgPSAoKFRhc2tEZXNjcmlwdG9yKSBvYmopCi0JCQkJCQkJCS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCQkJCQkJaWYgKHN1cHByZXNzaW9uICE9IG51bGwKLQkJCQkJCQkJJiYgZGlhZ3JhbUFkYXB0ZXIuZ2V0U3VwcHJlc3Npb24oKQotCQkJCQkJCQkJCS5pc1N1cHByZXNzZWQoZSkpIHsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvQ29udGV4dE1lbnUobWVudSk7Ci0JCWFkZFRvTWVudShtZW51LCBEaWFncmFtQ29uc3RhbnRzLk9QRU5fQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0sCi0JCQkJR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgdHJ1ZSwgdHJ1ZSk7Ci0JCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSBtZW51LmZpbmQoQWN0aW9uSWRzLk1FTlVfRElBR1JBTV9BREQpOwotCQlpZiAoaXRlbSAhPSBudWxsICYmIGl0ZW0gaW5zdGFuY2VvZiBJTWVudU1hbmFnZXIpIHsKLQkJCUlNZW51TWFuYWdlciBhZGRNZW51ID0gKElNZW51TWFuYWdlcikgaXRlbTsKLQkJCVN0cmluZyBncm91cE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLkRJQUdSQU1fQUREX01FTlVfR0VORVJBTF9HUk9VUDsKLQkJCWlmIChnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLnNpemUoKSA9PSAwKSB7Ci0JCQkJYWRkVG9NZW51KGFkZE1lbnUsIG51bGwsIGdyb3VwTmFtZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJYWRkVG9NZW51KGFkZE1lbnUsIERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX1BBUlRJVElPTiwKLQkJCQkJCWdyb3VwTmFtZSwgZmFsc2UsIHRydWUpOwotCQkJCWFkZFRvTWVudShhZGRNZW51LCBEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9TVEFSVF9OT0RFLAotCQkJCQkJZ3JvdXBOYW1lLCBmYWxzZSwgdHJ1ZSk7Ci0JCQkJYWRkVG9NZW51KGFkZE1lbnUsIERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX0VORF9OT0RFLCBncm91cE5hbWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSk7CQkKLQkJCQlhZGRUb01lbnUoYWRkTWVudSwgRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfRk9SS19OT0RFLAotCQkJCQkJZ3JvdXBOYW1lLCBmYWxzZSwgdHJ1ZSk7Ci0JCQkJYWRkVG9NZW51KGFkZE1lbnUsIERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX0pPSU5fTk9ERSwgCi0JCQkJCQlncm91cE5hbWUsIGZhbHNlLCB0cnVlKTsKLQkJCQlhZGRUb01lbnUoYWRkTWVudSwgRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfREVDSVNJT05fTk9ERSwKLQkJCQkJCWdyb3VwTmFtZSwgZmFsc2UsIHRydWUpOwotCQkJCWFkZFRvTWVudShhZGRNZW51LCBEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9NRVJHRV9OT0RFLAotCQkJCQkJZ3JvdXBOYW1lLCB0cnVlLCB0cnVlKTsJCi0JCQkJYWRkVG9NZW51KGFkZE1lbnUsIERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX0FDVElWSVRZLCBncm91cE5hbWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSk7Ci0JCQkJYWRkVG9NZW51KGFkZE1lbnUsIERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX0lURVJBVElPTiwKLQkJCQkJCWdyb3VwTmFtZSwgZmFsc2UsIHRydWUpOwotCQkJCWFkZFRvTWVudShhZGRNZW51LCBEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9QSEFTRSwgZ3JvdXBOYW1lLAotCQkJCQkJZmFsc2UsIHRydWUpOwotCQkJCWFkZFRvTWVudShhZGRNZW51LCBEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9NSUxFU1RPTkUsCi0JCQkJCQlncm91cE5hbWUsIGZhbHNlLCB0cnVlKTsKLQkJCQlhZGRUb01lbnUoYWRkTWVudSwgRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfVEFTS19ERVNDUklQVE9SLAotCQkJCQkJZ3JvdXBOYW1lLCB0cnVlLCB0cnVlKTsKLQkJCQkKLQkJCX0KLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydE5hbWVQcmVmaXgoKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJcmV0dXJuIGdldFR5cGVOYW1lKChBY3Rpdml0eSkgZSkgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRQYXJ0SW1hZ2UoKSB7Ci0JCXJldHVybiBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkiZnVsbC9ldG9vbDE2L0FERWRpdG9yLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFR5cGVOYW1lKEFjdGl2aXR5IGFjdCkgewotCQlpZiAoYWN0IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0dml0aXZpdHlEaWFncmFtX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0OyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoYWN0IGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCXJldHVybiBEaWFncmFtQ29yZVJlc291cmNlcy5BY3R2aXRpdml0eURpYWdyYW1fQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dDsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGFjdCBpbnN0YW5jZW9mIFBoYXNlKSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0dml0aXZpdHlEaWFncmFtX1BoYXNlX3RleDsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGFjdCBpbnN0YW5jZW9mIEl0ZXJhdGlvbikgewotCQkJcmV0dXJuIERpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dDsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBEaWFncmFtQ29yZVJlc291cmNlcy5BY3R2aXRpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlZGdlIGZvciBBRCBkaWFncmFtCi0JICogCi0JICogQHBhcmFtIHNvdXJjZU5vZGUKLQkgKiBAcGFyYW0gdGFyZ2V0Tm9kZQotCSAqIEBwYXJhbSBhY3RFZGdlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFZGdlIGNyZWF0ZUVkZ2UoTm9kZSBzb3VyY2VOb2RlLCBOb2RlIHRhcmdldE5vZGUsCi0JCQlBY3Rpdml0eUVkZ2UgYWN0RWRnZSkgewotCQlpZiAoYWN0RWRnZSBpbnN0YW5jZW9mIENvbnRyb2xGbG93KSB7Ci0JCQlFZGdlIGVkZ2UgPSBWaWV3U2VydmljZS5jcmVhdGVFZGdlKHNvdXJjZU5vZGUsIHRhcmdldE5vZGUsIGFjdEVkZ2UsCi0JCQkJCW5ldyBJbnRlZ2VyKENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZWRnZSwgYWN0RWRnZSwgbmV3IEludGVnZXIoCi0JCQkJCUNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQlyZXR1cm4gZWRnZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ3JlYXRlVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblJlcXVlc3QgZ2V0Q3JlYXRlQ29udHJvbEZsb3dSZXF1ZXN0KCkgewotCQlMaXN0PElFbGVtZW50VHlwZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQlsaXN0LmFkZChVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMSk7Ci0JCUNyZWF0ZVVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25SZXF1ZXN0IGNvbm5lY3Rpb25SZXF1ZXN0ID0gbmV3IENyZWF0ZVVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25SZXF1ZXN0KAotCQkJCWxpc3QsIGZhbHNlLAotCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQlyZXR1cm4gY29ubmVjdGlvblJlcXVlc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ3OTk3OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wcm92aWRlci5FY29yZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5yZXNvdXJjZS5SZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5RGlhZ3JhbVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuZWRpdC5wcm92aWRlcnMuVU1MSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogQG1vZGlmaWVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4gZXh0ZW5kcyBBY3Rpdml0eURpYWdyYW1QbHVnaW4gewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZmVyZW5jZXNIaW50IERJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCA9IG5ldyBQcmVmZXJlbmNlc0hpbnQoCi0JCQlJRCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luIGluc3RhbmNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFVNTERvY3VtZW50UHJvdmlkZXIgbXlEb2N1bWVudFByb3ZpZGVyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4oKSB7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JCVByZWZlcmVuY2VzSGludC5yZWdpc3RlclByZWZlcmVuY2VTdG9yZShESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQsCi0JCQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlhZGFwdGVyRmFjdG9yeSA9IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQlhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCWluc3RhbmNlID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCUxpc3QgZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmaWxsSXRlbVByb3ZpZGVyRmFjdG9yaWVzKGZhY3Rvcmllcyk7Ci0JCXJldHVybiBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShmYWN0b3JpZXMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsSXRlbVByb3ZpZGVyRmFjdG9yaWVzKExpc3QgZmFjdG9yaWVzKSB7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFVNTEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBFY29yZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRJdGVtUHJvdmlkZXJzQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJdGVtSW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBpdGVtKSB7Ci0JCUlJdGVtTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gKElJdGVtTGFiZWxQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoaXRlbSwgSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIEV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJbGFiZWxQcm92aWRlci5nZXRJbWFnZShpdGVtKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4KLQkgKiBwbHVnLWluIHJlbGF0aXZlIHBhdGguCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0QnVuZGxlZEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKElELCBwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNwZWN0cyBpbWFnZXMgcmVzaWRpbmcgaW4gYW55IHBsdWctaW4uIElmIHBhdGggaXMgcmVsYXRpdmUsCi0JICogdGhlbiB0aGlzIGJ1bmRsZSBpcyBsb29rZWQgdXAgZm9yIHRoZSBpbWFnZSwgb3RoZXJ3aXNlLCBmb3IgYWJzb2x1dGUgCi0JICogcGF0aCwgZmlyc3Qgc2VnbWVudCBpcyB0YWtlbiBhcyBpZCBvZiBwbHVnLWluIHdpdGggaW1hZ2UKLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byBpbWFnZSwgZWl0aGVyIGFic29sdXRlICh3aXRoIHBsdWctaW4gaWQgYXMgZmlyc3Qgc2VnbWVudCksIG9yIHJlbGF0aXZlIGZvciBidW5kbGVkIGltYWdlcwotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBmaW5kSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCWZpbmFsIElQYXRoIHAgPSBuZXcgUGF0aChwYXRoKTsKLQkJaWYgKHAuaXNBYnNvbHV0ZSgpICYmIHAuc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKHAuc2VnbWVudCgwKSwgcAotCQkJCQkucmVtb3ZlRmlyc3RTZWdtZW50cygxKS5tYWtlQWJzb2x1dGUoKS50b1N0cmluZygpKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBnZXRCdW5kbGVkSW1hZ2VEZXNjcmlwdG9yKHAubWFrZUFic29sdXRlKCkudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHN0cmluZyBmcm9tIHBsdWctaW4ncyByZXNvdXJjZSBidW5kbGUKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRSZXNvdXJjZVN0cmluZyhnZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLCAiJSIgKyBrZXkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKiBDbGllbnQgZG8gbm90IG5lZWQgdG8gZGlzcG9zZSB0aGlzIGltYWdlLiBJbWFnZXMgd2lsbCBiZSBkaXNwb3NlZCBhdXRvbWF0aWNhbGx5LgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiBpbWFnZSBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRCdW5kbGVkSW1hZ2UoU3RyaW5nIHBhdGgpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHBhdGgpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChwYXRoLCBnZXRCdW5kbGVkSW1hZ2VEZXNjcmlwdG9yKHBhdGgpKTsKLQkJCWltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChwYXRoKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVTUxEb2N1bWVudFByb3ZpZGVyIGdldERvY3VtZW50UHJvdmlkZXIoKSB7Ci0JCWlmIChteURvY3VtZW50UHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbXlEb2N1bWVudFByb3ZpZGVyID0gbmV3IFVNTERvY3VtZW50UHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gbXlEb2N1bWVudFByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgZXJyb3IpIHsKLQkJbG9nRXJyb3IoZXJyb3IsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aHJvd2FibGUgYWN0dWFsIGVycm9yIG9yIG51bGwgY291bGQgYmUgcGFzc2VkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvciwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlpZiAoZXJyb3IgPT0gbnVsbCAmJiB0aHJvd2FibGUgIT0gbnVsbCkgewotCQkJZXJyb3IgPSB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCWdldExvZygpLmxvZygKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCUlTdGF0dXMuT0ssIGVycm9yLCB0aHJvd2FibGUpKTsKLQkJZGVidWcoZXJyb3IsIHRocm93YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0luZm8oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJbG9nSW5mbyhtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGhyb3dhYmxlIGFjdHVhbCBlcnJvciBvciBudWxsIGNvdWxkIGJlIHBhc3NlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dJbmZvKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWlmIChtZXNzYWdlID09IG51bGwgJiYgdGhyb3dhYmxlICE9IG51bGwpIHsKLQkJCW1lc3NhZ2UgPSB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCWdldExvZygpLmxvZygKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJSVN0YXR1cy5PSywgbWVzc2FnZSwgdGhyb3dhYmxlKSk7Ci0JCWRlYnVnKG1lc3NhZ2UsIHRocm93YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBkZWJ1ZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4obWVzc2FnZSk7Ci0JCX0KLQkJaWYgKHRocm93YWJsZSAhPSBudWxsKSB7Ci0JCQl0aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L01lc3NhZ2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWJkYzMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcygibWVzc2FnZXMiLCBNZXNzYWdlcy5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MRGlhZ3JhbUVkaXRvclV0aWxfT3Blbk1vZGVsUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTERpYWdyYW1FZGl0b3JVdGlsX09wZW5Nb2RlbFJlc291cmNlRXJyb3JEaWFsb2dNZXNzYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTERpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Qcm9ncmVzc1Rhc2s7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbUNvbW1hbmRMYWJlbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxEb2N1bWVudFByb3ZpZGVyX2lzTW9kaWZpYWJsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxEb2N1bWVudFByb3ZpZGVyX2hhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxEb2N1bWVudFByb3ZpZGVyX0luY29ycmVjdElucHV0RXJyb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MRG9jdW1lbnRQcm92aWRlcl9VbmFibGVUb0xvYWRSZXNvdXJjZUVycm9yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTERvY3VtZW50UHJvdmlkZXJfTm9EaWFncmFtSW5SZXNvdXJjZUVycm9yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTERvY3VtZW50UHJvdmlkZXJfRGlhZ3JhbUxvYWRpbmdFcnJvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxEb2N1bWVudFByb3ZpZGVyX1Vuc3luY2hyb25pemVkRmlsZVNhdmVFcnJvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxEb2N1bWVudFByb3ZpZGVyX1NhdmVEaWFncmFtVGFzazsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxEb2N1bWVudFByb3ZpZGVyX1NhdmVOZXh0UmVzb3VyY2VUYXNrOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTEluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVSZXNvdXJjZUVycm9yRGlhbG9nVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dNZXNzYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTEluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVXaXphcmRUaXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb25fT3Blbk1vZGVsRmlsZURpYWxvZ1RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZU5hbWU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlRGVzY3JpcHRpb247Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOYW1lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VEZXNjcmlwdGlvbjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVNlbGVjdGlvblRpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlTm9TZWxlY3Rpb25NZXNzYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlSW52YWxpZFNlbGVjdGlvbk1lc3NhZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5pdERpYWdyYW1Db21tYW5kOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX0luY29ycmVjdFJvb3RFcnJvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGbG93czFHcm91cF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGbG93czFHcm91cF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vZGVzMkdyb3VwX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vZGVzMkdyb3VwX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udHJvbEZsb3cxQ3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRyb2xGbG93MUNyZWF0aW9uVG9vbF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5UGFydGl0aW9uMUNyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eVBhcnRpdGlvbjFDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFydE5vZGUyQ3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YXJ0Tm9kZTJDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JrTm9kZTNDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ya05vZGUzQ3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWVyZ2VOb2RlNENyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXJnZU5vZGU0Q3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVjaXNpb25Ob2RlNUNyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWNpc2lvbk5vZGU1Q3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kTm9kZTZDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kTm9kZTZDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luTm9kZTdDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbk5vZGU3Q3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHk5Q3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5OUNyZWF0aW9uVG9vbF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBoYXNlMTBDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGhhc2UxMENyZWF0aW9uVG9vbF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEl0ZXJhdGlvbjExQ3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEl0ZXJhdGlvbjExQ3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3IxMkNyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcjEyQ3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlsZXN0b25lMTNDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlsZXN0b25lMTNDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnRfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21tYW5kTmFtZV9PcGVuRGlhZ3JhbTsKLQotCS8vVE9ETzogcHV0IGFjY2Vzc29yIGZpZWxkcyBtYW51YWxseQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L01vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L01vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIwMjljMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9Nb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotLyoqCi0gKiBXaXphcmQgcGFnZSB0aGF0IGFsbG93cyB0byBzZWxlY3QgZWxlbWVudCBmcm9tIG1vZGVsLgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3Qgc2VsZWN0ZWRNb2RlbEVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUcmVlVmlld2VyIG1vZGVsVmV3ZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0TW9kZWxFbGVtZW50KCkgewotCQlyZXR1cm4gc2VsZWN0ZWRNb2RlbEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsRWxlbWVudChFT2JqZWN0IG1vZGVsRWxlbWVudCkgewotCQlzZWxlY3RlZE1vZGVsRWxlbWVudCA9IG1vZGVsRWxlbWVudDsKLQkJaWYgKG1vZGVsVmV3ZXIgIT0gbnVsbCkgewotCQkJaWYgKHNlbGVjdGVkTW9kZWxFbGVtZW50ICE9IG51bGwpIHsKLQkJCQltb2RlbFZld2VyLnNldElucHV0KHNlbGVjdGVkTW9kZWxFbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJCQltb2RlbFZld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCXNlbGVjdGVkTW9kZWxFbGVtZW50KSk7Ci0JCQl9IGVsc2UgewotCQkJCW1vZGVsVmV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0JCQl9Ci0JCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQotCQlDb21wb3NpdGUgcGxhdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwbGF0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlwbGF0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc2V0Q29udHJvbChwbGF0ZSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGxhdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChnZXRTZWxlY3Rpb25UaXRsZSgpKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQotCQltb2RlbFZld2VyID0gbmV3IFRyZWVWaWV3ZXIocGxhdGUsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWxheW91dERhdGEuaGVpZ2h0SGludCA9IDMwMDsKLQkJbGF5b3V0RGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCW1vZGVsVmV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCW1vZGVsVmV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCW1vZGVsVmV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SXRlbVByb3ZpZGVyc0FkYXB0ZXJGYWN0b3J5KCkpKTsKLQkJaWYgKHNlbGVjdGVkTW9kZWxFbGVtZW50ICE9IG51bGwpIHsKLQkJCW1vZGVsVmV3ZXIuc2V0SW5wdXQoc2VsZWN0ZWRNb2RlbEVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJbW9kZWxWZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCXNlbGVjdGVkTW9kZWxFbGVtZW50KSk7Ci0JCX0KLQkJbW9kZWxWZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZS50aGlzCi0JCQkJCQkudXBkYXRlU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBwcm92aWRlIGN1c3RvbSBtb2RlbCBlbGVtZW50IGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGlvblRpdGxlKCkgewotCQlyZXR1cm4gIlNlbGVjdCBtb2RlbCBlbGVtZW50OiI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2VsZWN0ZWRNb2RlbEVsZW1lbnQgPSBudWxsOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJc2VsZWN0ZWRFbGVtZW50ID0gKChJV3JhcHBlckl0ZW1Qcm92aWRlcikgc2VsZWN0ZWRFbGVtZW50KQotCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQl9Ci0JCQlpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRmVhdHVyZU1hcC5FbnRyeSkgewotCQkJCXNlbGVjdGVkRWxlbWVudCA9ICgoRmVhdHVyZU1hcC5FbnRyeSkgc2VsZWN0ZWRFbGVtZW50KQotCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQl9Ci0JCQlpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCXNlbGVjdGVkTW9kZWxFbGVtZW50ID0gKEVPYmplY3QpIHNlbGVjdGVkRWxlbWVudDsKLQkJCX0KLQkJfQotCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIHByb3ZpZGUgc3BlY2lmaWMgdmFsaWRhdGlvbiBvZiB0aGUgc2VsZWN0ZWQgbW9kZWwgZWxlbWVudC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxDcmVhdGlvbldpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MQ3JlYXRpb25XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FjNTJiYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxDcmVhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUud2l6YXJkcy5FZGl0b3JDcmVhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxDcmVhdGlvbldpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVdvcmtiZW5jaCB3b3JrYmVuY2g7Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBVTUxDcmVhdGlvbldpemFyZFBhZ2UgZGlhZ3JhbU1vZGVsRmlsZVBhZ2U7Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBkaWFncmFtOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gb3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IgPSB0cnVlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJV29ya2JlbmNoIGdldFdvcmtiZW5jaCgpIHsKLQkJcmV0dXJuIHdvcmtiZW5jaDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZpbmFsIFJlc291cmNlIGdldERpYWdyYW0oKSB7Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc09wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yKCkgewotCQlyZXR1cm4gb3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yKAotCQkJYm9vbGVhbiBvcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcikgewotCQl0aGlzLm9wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yID0gb3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlkaWFncmFtTW9kZWxGaWxlUGFnZSA9IG5ldyBVTUxDcmVhdGlvbldpemFyZFBhZ2UoCi0JCQkJIkRpYWdyYW1Nb2RlbEZpbGUiLCBnZXRTZWxlY3Rpb24oKSwgInhtaSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZGlhZ3JhbU1vZGVsRmlsZVBhZ2Uuc2V0VGl0bGUoIkNyZWF0ZSBBRCBEaWFncmFtIik7Ci0JCWRpYWdyYW1Nb2RlbEZpbGVQYWdlCi0JCQkJLnNldERlc2NyaXB0aW9uKCJTZWxlY3QgZmlsZSB0aGF0IHdpbGwgY29udGFpbiBkaWFncmFtIGFuZCBkb21haW4gbW9kZWxzLiIpOwotCQlhZGRQYWdlKGRpYWdyYW1Nb2RlbEZpbGVQYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbihudWxsKSB7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCWRpYWdyYW0gPSBVTUxEaWFncmFtRWRpdG9yVXRpbC5jcmVhdGVEaWFncmFtKAotCQkJCQkJZGlhZ3JhbU1vZGVsRmlsZVBhZ2UuZ2V0VVJJKCksIG1vbml0b3IpOwotCQkJCWlmIChpc09wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yKCkgJiYgZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlVTUxEaWFncmFtRWRpdG9yVXRpbC5vcGVuRGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksCi0JCQkJCQkJCSJFcnJvciBvcGVuaW5nIGRpYWdyYW0gZWRpdG9yIiwgbnVsbCwgZQotCQkJCQkJCQkJCS5nZXRTdGF0dXMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIHRydWUsIG9wKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCWlmIChlLmdldFRhcmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRDb250YWluZXIoKS5nZXRTaGVsbCgpLAotCQkJCQkJIkNyZWF0aW9uIFByb2JsZW1zIiwgbnVsbCwgKChDb3JlRXhjZXB0aW9uKSBlCi0JCQkJCQkJCS5nZXRUYXJnZXRFeGNlcHRpb24oKSkuZ2V0U3RhdHVzKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCSJFcnJvciBjcmVhdGluZyBkaWFncmFtIiwgZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlzZXRXaW5kb3dUaXRsZSgiTmV3IEFEIERpYWdyYW0iKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IoImljb25zL3dpemJhbi9OZXdVTUxXaXphcmQuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MQ3JlYXRpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYzQ5NWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MQ3JlYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUud2l6YXJkcy5FZGl0b3JXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci51dGlsLkRpYWdyYW1GaWxlQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MQ3JlYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmlsZUV4dGVuc2lvbjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVU1MQ3JlYXRpb25XaXphcmRQYWdlKFN0cmluZyBwYWdlTmFtZSwKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgU3RyaW5nIGZpbGVFeHRlbnNpb24pIHsKLQkJc3VwZXIocGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0JCXRoaXMuZmlsZUV4dGVuc2lvbiA9IGZpbGVFeHRlbnNpb247Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gY3JlYXRlIGZpbGVzIHdpdGggdGhpcyBleHRlbnNpb24uCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gZmlsZUV4dGVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVSSSBnZXRVUkkoKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShnZXRGaWxlUGF0aCgpLnRvU3RyaW5nKCksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXRoIGdldEZpbGVQYXRoKCkgewotCQlJUGF0aCBwYXRoID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJcGF0aCA9IG5ldyBQYXRoKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0JCQlwYXRoID0gcGF0aC5hcHBlbmQoZmlsZU5hbWUpOwotCQl9Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQlzZXRGaWxlTmFtZShVTUxEaWFncmFtRWRpdG9yVXRpbC5nZXRVbmlxdWVGaWxlTmFtZSgKLQkJCQlnZXRDb250YWluZXJGdWxsUGF0aCgpLCBnZXRGaWxlTmFtZSgpLCBnZXRFeHRlbnNpb24oKSkpOwotCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCWlmICghc3VwZXIudmFsaWRhdGVQYWdlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uKCk7Ci0JCWlmIChleHRlbnNpb24gIT0gbnVsbAotCQkJCSYmICFnZXRGaWxlUGF0aCgpLnRvU3RyaW5nKCkuZW5kc1dpdGgoIi4iICsgZXh0ZW5zaW9uKSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKAotCQkJCQkiRmlsZSBuYW1lIHNob3VsZCBoYXZlICcnezB9JycgZXh0ZW5zaW9uLiIsIGV4dGVuc2lvbikpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxEaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFlOTgzMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxEaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTERpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzIERpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGdldEVkaXRvckNsYXNzKCkgewotCQlyZXR1cm4gQWN0aXZpdHlEaWFncmFtRWRpdG9yLmNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVkaXRvcklkKCkgewotCQlyZXR1cm4gQWN0aXZpdHlEaWFncmFtRWRpdG9yLklEOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTERpYWdyYW1FZGl0b3JVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxEaWFncmFtRWRpdG9yVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTM4YzNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTERpYWdyYW1FZGl0b3JVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5PcGVyYXRpb25IaXN0b3J5RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5WaWV3U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklQcmltYXJ5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5JRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLnV0aWwuSURFRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IudXRpbC5EaWFncmFtRmlsZUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLkdNRkVkaXRpbmdEb21haW5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU1GQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTEZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MRGlhZ3JhbUVkaXRvclV0aWwgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBvdXJTYXZlT3B0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0U2F2ZU9wdGlvbnMoKSB7Ci0JCWlmIChvdXJTYXZlT3B0aW9ucyA9PSBudWxsKSB7Ci0JCQlvdXJTYXZlT3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlvdXJTYXZlT3B0aW9ucy5wdXQoWE1JUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJb3VyU2F2ZU9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9SRUNPUkRfVU5LTk9XTl9GRUFUVVJFLAotCQkJCQlCb29sZWFuLlRSVUUpOwotCQkJb3VyU2F2ZU9wdGlvbnMucHV0KFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRCwKLQkJCQkJUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VEX01FTU9SWV9CVUZGRVIpOwotCQl9Ci0JCXJldHVybiBvdXJTYXZlT3B0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5EaWFncmFtKFJlc291cmNlIGRpYWdyYW0pCi0JCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlyZXR1cm4gRWRpdFVJVXRpbC5vcGVuRWRpdG9yKChFT2JqZWN0KSBkaWFncmFtLmdldENvbnRlbnRzKCkuZ2V0KDApKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENoYXJzZXQoSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCWZpbGUuc2V0Q2hhcnNldCgiVVRGLTgiLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIHNldCBjaGFyc2V0IGZvciBmaWxlICIgKyBmaWxlLmdldEZ1bGxQYXRoKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VW5pcXVlRmlsZU5hbWUoSVBhdGggY29udGFpbmVyRnVsbFBhdGgsCi0JCQlTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBleHRlbnNpb24pIHsKLQkJaWYgKGNvbnRhaW5lckZ1bGxQYXRoID09IG51bGwpIHsKLQkJCWNvbnRhaW5lckZ1bGxQYXRoID0gbmV3IFBhdGgoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGZpbGVOYW1lID09IG51bGwgfHwgZmlsZU5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWZpbGVOYW1lID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSVBhdGggZmlsZVBhdGggPSBjb250YWluZXJGdWxsUGF0aC5hcHBlbmQoZmlsZU5hbWUpOwotCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwgJiYgIWV4dGVuc2lvbi5lcXVhbHMoZmlsZVBhdGguZ2V0RmlsZUV4dGVuc2lvbigpKSkgewotCQkJZmlsZVBhdGggPSBmaWxlUGF0aC5hZGRGaWxlRXh0ZW5zaW9uKGV4dGVuc2lvbik7Ci0JCX0KLQkJZXh0ZW5zaW9uID0gZmlsZVBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOwotCQlmaWxlTmFtZSA9IGZpbGVQYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpOwotCQlpbnQgaSA9IDE7Ci0JCXdoaWxlIChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmV4aXN0cyhmaWxlUGF0aCkpIHsKLQkJCWkrKzsKLQkJCWZpbGVQYXRoID0gY29udGFpbmVyRnVsbFBhdGguYXBwZW5kKGZpbGVOYW1lICsgaSk7Ci0JCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwpIHsKLQkJCQlmaWxlUGF0aCA9IGZpbGVQYXRoLmFkZEZpbGVFeHRlbnNpb24oZXh0ZW5zaW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZVBhdGgubGFzdFNlZ21lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSdW5zIHRoZSB3aXphcmQgaW4gYSBkaWFsb2cuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5XaXphcmQoU2hlbGwgc2hlbGwsIFdpemFyZCB3aXphcmQsIFN0cmluZyBzZXR0aW5nc0tleSkgewotCQlJRGlhbG9nU2V0dGluZ3MgcGx1Z2luRGlhbG9nU2V0dGluZ3MgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlJRGlhbG9nU2V0dGluZ3Mgd2l6YXJkRGlhbG9nU2V0dGluZ3MgPSBwbHVnaW5EaWFsb2dTZXR0aW5ncwotCQkJCS5nZXRTZWN0aW9uKHNldHRpbmdzS2V5KTsKLQkJaWYgKHdpemFyZERpYWxvZ1NldHRpbmdzID09IG51bGwpIHsKLQkJCXdpemFyZERpYWxvZ1NldHRpbmdzID0gcGx1Z2luRGlhbG9nU2V0dGluZ3MKLQkJCQkJLmFkZE5ld1NlY3Rpb24oc2V0dGluZ3NLZXkpOwotCQl9Ci0JCXdpemFyZC5zZXREaWFsb2dTZXR0aW5ncyh3aXphcmREaWFsb2dTZXR0aW5ncyk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoTWF0aC5tYXgoNTAwLCBkaWFsb2cuZ2V0U2hlbGwoKS5nZXRTaXplKCkueCksCi0JCQkJNTAwKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdpdGhpbiBhIHdvcmtzcGFjZSBtb2RpZnkgb3BlcmF0aW9uIHNpbmNlIGl0IGNyZWF0ZXMgcmVzb3VyY2VzLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGNyZWF0ZURpYWdyYW0oVVJJIGRpYWdyYW1VUkksCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gR01GRWRpdGluZ0RvbWFpbkZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOwotCQlwcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrKAotCQkJCU1lc3NhZ2VzLlVNTERpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Qcm9ncmVzc1Rhc2ssIDMpOwotCQlmaW5hbCBSZXNvdXJjZSBkaWFncmFtUmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkKLQkJCQkuY3JlYXRlUmVzb3VyY2UoZGlhZ3JhbVVSSSk7Ci0JCWZpbmFsIFN0cmluZyBkaWFncmFtTmFtZSA9IGRpYWdyYW1VUkkubGFzdFNlZ21lbnQoKTsKLQkJQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCBjb21tYW5kID0gbmV3IEFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQoCi0JCQkJZWRpdGluZ0RvbWFpbiwKLQkJCQlNZXNzYWdlcy5VTUxEaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtQ29tbWFuZExhYmVsLAotCQkJCUNvbGxlY3Rpb25zLkVNUFRZX0xJU1QpIHsKLQkJCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoCi0JCQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQlBY3Rpdml0eSBtb2RlbCA9IGNyZWF0ZUluaXRpYWxNb2RlbCgpOwotCQkJCWF0dGFjaE1vZGVsVG9SZXNvdXJjZShtb2RlbCwgZGlhZ3JhbVJlc291cmNlKTsKLQotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZURpYWdyYW0obW9kZWwsCi0JCQkJCQlBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQlkaWFncmFtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7Ci0JCQkJCWRpYWdyYW0uc2V0TmFtZShkaWFncmFtTmFtZSk7Ci0JCQkJCWRpYWdyYW0uc2V0RWxlbWVudChtb2RlbCk7Ci0JCQkJfQotCi0JCQkJdHJ5IHsKLQotCQkJCQlkaWFncmFtUmVzb3VyY2UKLQkJCQkJCQkuc2F2ZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTERpYWdyYW1FZGl0b3JVdGlsCi0JCQkJCQkJCQkuZ2V0U2F2ZU9wdGlvbnMoKSk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkJCSJVbmFibGUgdG8gc3RvcmUgbW9kZWwgYW5kIGRpYWdyYW0gcmVzb3VyY2VzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KCk7Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlPcGVyYXRpb25IaXN0b3J5RmFjdG9yeS5nZXRPcGVyYXRpb25IaXN0b3J5KCkuZXhlY3V0ZShjb21tYW5kLAotCQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzTW9uaXRvciwgMSksIG51bGwpOwotCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJVbmFibGUgdG8gY3JlYXRlIG1vZGVsIGFuZCBkaWFncmFtIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXNldENoYXJzZXQoV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUoZGlhZ3JhbVJlc291cmNlKSk7Ci0JCXJldHVybiBkaWFncmFtUmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGRvbWFpbiBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBjYW52YXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHkgY3JlYXRlSW5pdGlhbE1vZGVsKCkgewotCQlyZXR1cm4gVU1MRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9yZSBtb2RlbCBlbGVtZW50IGluIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGF0dGFjaE1vZGVsVG9SZXNvdXJjZShBY3Rpdml0eSBtb2RlbCwgUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VsZWN0RWxlbWVudHNJbkRpYWdyYW0oCi0JCQlJRGlhZ3JhbVdvcmtiZW5jaFBhcnQgZGlhZ3JhbVBhcnQsIExpc3QvKkVkaXRQYXJ0Ki9lZGl0UGFydHMpIHsKLQkJZGlhZ3JhbVBhcnQuZ2V0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcigpLmRlc2VsZWN0QWxsKCk7Ci0KLQkJRWRpdFBhcnQgZmlyc3RQcmltYXJ5ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVkaXRQYXJ0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFZGl0UGFydCBuZXh0UGFydCA9IChFZGl0UGFydCkgaXQubmV4dCgpOwotCQkJZGlhZ3JhbVBhcnQuZ2V0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcigpLmFwcGVuZFNlbGVjdGlvbihuZXh0UGFydCk7Ci0JCQlpZiAoZmlyc3RQcmltYXJ5ID09IG51bGwgJiYgbmV4dFBhcnQgaW5zdGFuY2VvZiBJUHJpbWFyeUVkaXRQYXJ0KSB7Ci0JCQkJZmlyc3RQcmltYXJ5ID0gbmV4dFBhcnQ7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWVkaXRQYXJ0cy5pc0VtcHR5KCkpIHsKLQkJCWRpYWdyYW1QYXJ0LmdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKS5yZXZlYWwoCi0JCQkJCWZpcnN0UHJpbWFyeSAhPSBudWxsID8gZmlyc3RQcmltYXJ5IDogKEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCQkuZ2V0KDApKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZmluZEVsZW1lbnRzSW5EaWFncmFtQnlJRChEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbVBhcnQsCi0JCQlFT2JqZWN0IGVsZW1lbnQsIExpc3QgZWRpdFBhcnRDb2xsZWN0b3IpIHsKLQkJSURpYWdyYW1HcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKElEaWFncmFtR3JhcGhpY2FsVmlld2VyKSBkaWFncmFtUGFydAotCQkJCS5nZXRWaWV3ZXIoKTsKLQkJZmluYWwgaW50IGludGlhbE51bU9mRWRpdFBhcnRzID0gZWRpdFBhcnRDb2xsZWN0b3Iuc2l6ZSgpOwotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmlldykgeyAvLyBzdXBwb3J0IG5vdGF0aW9uIGVsZW1lbnQgbG9va3VwCi0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgdmlld2VyLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQoCi0JCQkJCWVsZW1lbnQpOwotCQkJaWYgKGVkaXRQYXJ0ICE9IG51bGwpIHsKLQkJCQllZGl0UGFydENvbGxlY3Rvci5hZGQoZWRpdFBhcnQpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGVsZW1lbnRJRCA9IEVNRkNvcmVVdGlsLmdldFByb3h5SUQoZWxlbWVudCk7Ci0JCUxpc3QgYXNzb2NpYXRlZFBhcnRzID0gdmlld2VyLmZpbmRFZGl0UGFydHNGb3JFbGVtZW50KGVsZW1lbnRJRCwKLQkJCQlJR3JhcGhpY2FsRWRpdFBhcnQuY2xhc3MpOwotCQkvLyBwZXJmb3JtIHRoZSBwb3NzaWJsZSBoaWVyYXJjaHkgZGlzam9pbnQgLT4gdGFrZSB0aGUgdG9wLW1vc3QgcGFydHMgb25seQotCQlmb3IgKEl0ZXJhdG9yIGVkaXRQYXJ0SXQgPSBhc3NvY2lhdGVkUGFydHMuaXRlcmF0b3IoKTsgZWRpdFBhcnRJdAotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlFZGl0UGFydCBuZXh0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRJdC5uZXh0KCk7Ci0JCQlFZGl0UGFydCBwYXJlbnRQYXJ0ID0gbmV4dFBhcnQuZ2V0UGFyZW50KCk7Ci0JCQl3aGlsZSAocGFyZW50UGFydCAhPSBudWxsICYmICFhc3NvY2lhdGVkUGFydHMuY29udGFpbnMocGFyZW50UGFydCkpIHsKLQkJCQlwYXJlbnRQYXJ0ID0gcGFyZW50UGFydC5nZXRQYXJlbnQoKTsKLQkJCX0KLQkJCWlmIChwYXJlbnRQYXJ0ID09IG51bGwpIHsKLQkJCQllZGl0UGFydENvbGxlY3Rvci5hZGQobmV4dFBhcnQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGludGlhbE51bU9mRWRpdFBhcnRzID09IGVkaXRQYXJ0Q29sbGVjdG9yLnNpemUoKSkgewotCQkJaWYgKCFhc3NvY2lhdGVkUGFydHMuaXNFbXB0eSgpKSB7Ci0JCQkJZWRpdFBhcnRDb2xsZWN0b3IuYWRkKGFzc29jaWF0ZWRQYXJ0cy5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChlbGVtZW50LmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBmaW5kRWxlbWVudHNJbkRpYWdyYW1CeUlEKGRpYWdyYW1QYXJ0LCBlbGVtZW50Ci0JCQkJCQkJLmVDb250YWluZXIoKSwgZWRpdFBhcnRDb2xsZWN0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWRpdFBhcnRDb2xsZWN0b3Iuc2l6ZSgpIC0gaW50aWFsTnVtT2ZFZGl0UGFydHM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmlldyBmaW5kVmlldyhEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0LAotCQkJRU9iamVjdCB0YXJnZXRFbGVtZW50LCBMYXp5RWxlbWVudDJWaWV3TWFwIGxhenlFbGVtZW50MlZpZXdNYXApIHsKLQkJYm9vbGVhbiBoYXNTdHJ1Y3R1cmFsVVJJID0gZmFsc2U7Ci0JCWlmICh0YXJnZXRFbGVtZW50LmVSZXNvdXJjZSgpIGluc3RhbmNlb2YgWE1MUmVzb3VyY2UpIHsKLQkJCWhhc1N0cnVjdHVyYWxVUkkgPSAoKFhNTFJlc291cmNlKSB0YXJnZXRFbGVtZW50LmVSZXNvdXJjZSgpKQotCQkJCQkuZ2V0SUQodGFyZ2V0RWxlbWVudCkgPT0gbnVsbDsKLQkJfQotCi0JCVZpZXcgdmlldyA9IG51bGw7Ci0JCWlmIChoYXNTdHJ1Y3R1cmFsVVJJCi0JCQkJJiYgIWxhenlFbGVtZW50MlZpZXdNYXAuZ2V0RWxlbWVudDJWaWV3TWFwKCkuaXNFbXB0eSgpKSB7Ci0JCQl2aWV3ID0gKFZpZXcpIGxhenlFbGVtZW50MlZpZXdNYXAuZ2V0RWxlbWVudDJWaWV3TWFwKCkuZ2V0KAotCQkJCQl0YXJnZXRFbGVtZW50KTsKLQkJfSBlbHNlIGlmIChmaW5kRWxlbWVudHNJbkRpYWdyYW1CeUlEKGRpYWdyYW1FZGl0UGFydCwgdGFyZ2V0RWxlbWVudCwKLQkJCQlsYXp5RWxlbWVudDJWaWV3TWFwLmVkaXRQYXJ0VG1wSG9sZGVyKSA+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+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU2ZmMxYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnNlcnZpY2UKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuamZhY2UsCi0gb3JnLmVjbGlwc2UudWkuaWRlLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaSwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSwKLSBvcmcuZWNsaXBzZS5nZWY7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnByb3BlcnRpZXMsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aSwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLnJlbmRlciwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLmlkZSwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlbmRlciwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZSwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5wcm92aWRlcnMsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYudW1hO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZHJhdzJkO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDkyZGI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZGlhZ3JhbS9Sb2xlRGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZGlhZ3JhbS9Sb2xlRGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2OGM3YjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2RpYWdyYW0vUm9sZURlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2RpYWdyYW0vVGFza0Rlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2RpYWdyYW0vVGFza0Rlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTRlMjZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9kaWFncmFtL1Rhc2tEZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9kaWFncmFtL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZGlhZ3JhbS9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWVhOGNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9kaWFncmFtL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZnVsbC9kbGNsMTYvcmVzZXRfZGlhZ3JhbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZnVsbC9kbGNsMTYvcmVzZXRfZGlhZ3JhbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3M2U2NzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2Z1bGwvZGxjbDE2L3Jlc2V0X2RpYWdyYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2Z1bGwvZHRvb2wxNi9BRERFZGl0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2Z1bGwvZHRvb2wxNi9BRERFZGl0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDQ0YzEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9mdWxsL2R0b29sMTYvQURERWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9mdWxsL2VsY2wxNi9yZXNldF9kaWFncmFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9mdWxsL2VsY2wxNi9yZXNldF9kaWFncmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE5YzhjNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZnVsbC9lbGNsMTYvcmVzZXRfZGlhZ3JhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZnVsbC9ldG9vbDE2L0FEREVkaXRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZnVsbC9ldG9vbDE2L0FEREVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNjc5MDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERFZGl0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL29iajE2L01vZGVsRGlhZ3JhbUZpbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL29iajE2L01vZGVsRGlhZ3JhbUZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzY3NmE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9vYmoxNi9Nb2RlbERpYWdyYW1GaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy93aXpiYW4vTmV3TW9kZWxXaXphcmQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL3dpemJhbi9OZXdNb2RlbFdpemFyZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZjg1ZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL3dpemJhbi9OZXdNb2RlbFdpemFyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbWVzc2FnZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2M4OTEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5PIE5FRUQgVE8gVFJBTlNMQVRFIEZPTExPV0lORyBQUk9QRVJUSUVTLCBTSU5DRSBXRSBET04nVCBVU0UgSVQgRk9SIFRISVMgUkVMRUFTRQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRPRE86IG1hbnVhbGx5IHB1dCBrZXlzIGFuZCB2YWx1ZXMKLXNEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfT3Blbk1vZGVsUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlPUVycm9yCi1EaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfT3Blbk1vZGVsUmVzb3VyY2VFcnJvckRpYWxvZ01lc3NhZ2U9RmFpbGVkIHRvIGxvYWQgbW9kZWwgZmlsZSB7MH0KLURpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtUHJvZ3Jlc3NUYXNrPUNyZWF0aW5nIGRpYWdyYW0gYW5kIG1vZGVsIGZpbGVzCi1EaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbUNvbW1hbmRMYWJlbD1DcmVhdGluZyBkaWFncmFtIGFuZCBtb2RlbAotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlPVVwZGF0aW5nIGNhY2hlIGZhaWxlZAotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkPUZhaWxlZCB0byByZWZyZXNoIGhpZXJhcmNoeSBmb3IgY2hhbmdlZCByZXNvdXJjZQotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvcj17MX0KLURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1VuYWJsZVRvTG9hZFJlc291cmNlRXJyb3I9VW5hYmxlIHRvIGxvYWQgZGlhZ3JhbSByZXNvdXJjZQotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfTm9EaWFncmFtSW5SZXNvdXJjZUVycm9yPURpYWdyYW0gaXMgbm90IHByZXNlbnQgaW4gcmVzb3VyY2UKLURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX0RpYWdyYW1Mb2FkaW5nRXJyb3I9RXJyb3IgbG9hZGluZyBkaWFncmFtCi1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9VbnN5bmNocm9uaXplZEZpbGVTYXZlRXJyb3I9VGhlIGZpbGUgaGFzIGJlZW4gY2hhbmdlZCBvbiB0aGUgZmlsZSBzeXN0ZW0KLURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1NhdmVEaWFncmFtVGFzaz1TYXZpbmcgZGlhZ3JhbQotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfU2F2ZU5leHRSZXNvdXJjZVRhc2s9U2F2aW5nIHswfQotRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVSZXNvdXJjZUVycm9yRGlhbG9nVGl0bGU9RXJyb3IKLURpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlUmVzb3VyY2VFcnJvckRpYWxvZ01lc3NhZ2U9TW9kZWwgZmlsZSBsb2FkaW5nIGZhaWxlZAotRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVXaXphcmRUaXRsZT1Jbml0aWFsaXplIG5ldyB7MH0gZGlhZ3JhbSBmaWxlCi1EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX09wZW5Nb2RlbEZpbGVEaWFsb2dUaXRsZT1TZWxlY3QgZG9tYWluIG1vZGVsCi1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlTmFtZT1Jbml0aWFsaXplIG5ldyBkaWFncmFtIGZpbGUKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VUaXRsZT1EaWFncmFtIGZpbGUKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VEZXNjcmlwdGlvbj1DcmVhdGUgbmV3IGRpYWdyYW0gYmFzZWQgb24gezB9IG1vZGVsIGNvbnRlbnQKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5hbWU9U2VsZWN0IGRpYWdyYW0gcm9vdCBlbGVtZW50Ci1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VUaXRsZT1EaWFncmFtIHJvb3QgZWxlbWVudAotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlRGVzY3JpcHRpb249U2VsZWN0IHNlbWFudGljIG1vZGVsIGVsZW1lbnQgdG8gYmUgZGVwaWN0ZWQgb24gZGlhZ3JhbQotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlU2VsZWN0aW9uVGl0bGU9U2VsZWN0IGRpYWdyYW0gcm9vdCBlbGVtZW50OgotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlTm9TZWxlY3Rpb25NZXNzYWdlPURpYWdyYW0gcm9vdCBlbGVtZW50IGlzIG5vdCBzZWxlY3RlZAotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlSW52YWxpZFNlbGVjdGlvbk1lc3NhZ2U9SW52YWxpZCBkaWFncmFtIHJvb3QgZWxlbWVudCBpcyBzZWxlY3RlZAotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0luaXREaWFncmFtQ29tbWFuZD1Jbml0aWFsaXppbmcgZGlhZ3JhbSBjb250ZW50cwotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0luY29ycmVjdFJvb3RFcnJvcj1JbmNvcnJlY3QgbW9kZWwgb2JqZWN0IHN0b3JlZCBhcyBhIHJvb3QgcmVzb3VyY2Ugb2JqZWN0Ci1Ob2RlczFHcm91cF90aXRsZT1Ob2RlcwotTGlua3MyR3JvdXBfdGl0bGU9TGlua3MKLVJvbGVOb2RlMUNyZWF0aW9uVG9vbF90aXRsZT1Sb2xlTm9kZQotUm9sZU5vZGUxQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBSb2xlTm9kZQotUm9sZVRhc2tDb21wb3NpdGUyQ3JlYXRpb25Ub29sX3RpdGxlPVJvbGVUYXNrQ29tcG9zaXRlCi1Sb2xlVGFza0NvbXBvc2l0ZTJDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IFJvbGVUYXNrQ29tcG9zaXRlCi1UYXNrTm9kZTNDcmVhdGlvblRvb2xfdGl0bGU9VGFza05vZGUKLVRhc2tOb2RlM0NyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgVGFza05vZGUKLVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU0Q3JlYXRpb25Ub29sX3RpdGxlPVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUKLVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU0Q3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBXb3JrUHJvZHVjTm9kZQotV29ya1Byb2R1Y3RDb21wb3NpdGU1Q3JlYXRpb25Ub29sX3RpdGxlPVdvcmtQcm9kdWN0Q29tcG9zaXRlCi1Xb3JrUHJvZHVjdENvbXBvc2l0ZTVDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlCi1MaW5rMUNyZWF0aW9uVG9vbF90aXRsZT1MaW5rCi1MaW5rMUNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgbGluawotUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnRfdGl0bGU9Um9sZVRhc2tDb21wYXJ0bWVudAotV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnRfdGl0bGU9V29ya1Byb2R1Y3RDb21wYXJ0bWVudAotCi1Db21tYW5kTmFtZV9PcGVuRGlhZ3JhbT1PcGVuIERpYWdyYW0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQuZ21mZ2VuIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZC5nbWZnZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ODNiMzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZC5nbWZnZW4KKysrIC9kZXYvbnVsbApAQCAtMSw0MDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZnZW46R2VuRWRpdG9yR2VuZXJhdG9yIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6Z21mZ2VuPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L0dlbk1vZGVsIiBwYWNrYWdlTmFtZVByZWZpeD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkIgotICAgIG1vZGVsSUQ9IkFERCIKLSAgICBzYW1lRmlsZUZvckRpYWdyYW1BbmRNb2RlbD0idHJ1ZSIKLSAgICBkaWFncmFtRmlsZUV4dGVuc2lvbj0iYWRkIgotICAgIHRlbXBsYXRlRGlyZWN0b3J5PSIiPgotICA8ZGlhZ3JhbQotICAgICAgdmlzdWFsSUQ9Ijc5IgotICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IgotICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdGYWN0b3J5IgotICAgICAgaWNvblByb3ZpZGVyUHJpb3JpdHk9IkxvdyIKLSAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3kiPgotICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL0RpYWdyYW0iLz4KLSAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0SGVscGVyIi8+Ci0gICAgPHZpZXdtYXAKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyIi8+Ci0gICAgPGRvbWFpbkRpYWdyYW1FbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9BY3Rpdml0eURldGFpbERpYWdyYW0iLz4KLSAgICA8Y2hpbGROb2RlcwotICAgICAgICB2aXN1YWxJRD0iMjAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlJvbGVOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUm9sZU5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZU5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSIKLSAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IlJvbGVOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iUm9sZU5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgUm9sZU5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBSb2xlTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoUk9MRU5PREVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTtmaWdfMC5zZXRUZXh0KCZxdW90OyZsdDsuLi4+JnF1b3Q7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZpZ18wLnNldEZvbnQoJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5O1JPTEVOT0RFTkFNRUZJR1VSRV9GT05UKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZVJvbGVOb2RlTmFtZUZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZlJvbGVOb2RlTmFtZUZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZVJvbGVOb2RlTmFtZUZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmUm9sZU5vZGVOYW1lRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVJvbGVOb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZSb2xlTm9kZU5hbWVGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBST0xFTk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMTU2KTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udCBST0xFTk9ERU5BTUVGSUdVUkVfRk9OVCA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5LmdldEN1cnJlbnQoKSwgJnF1b3Q7QXJpYWwmcXVvdDssIDgsIG9yZy5lY2xpcHNlLnN3dC5TV1QuTk9STUFMKTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvUm9sZU5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDAxIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJSb2xlTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlJvbGVOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiPgotICAgICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgICBmaXhlZEZvbnQ9InRydWUiLz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmUKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvY2hpbGROb2Rlcz4KLSAgICA8Y2hpbGROb2RlcwotICAgICAgICB2aXN1YWxJRD0iMjAwMiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlRhc2tOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlRhc2tOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iVGFza05vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iVGFza05vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iVGFza05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSIKLSAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IlRhc2tOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iVGFza05vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgVGFza05vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBUYXNrTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRMaW5lV2lkdGgoMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihUQVNLTk9ERUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBO2ZpZ18wLnNldFRleHQoJnF1b3Q7Jmx0Oy4uLj4mcXVvdDspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZmlnXzAuc2V0Rm9udCgmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7VEFTS05PREVOQU1FRklHVVJFX0ZPTlQpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlVGFza05vZGVOYW1lRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmVGFza05vZGVOYW1lRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlVGFza05vZGVOYW1lRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZUYXNrTm9kZU5hbWVGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlVGFza05vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZlRhc2tOb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQgVEFTS05PREVOQU1FRklHVVJFX0ZPTlQgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheS5nZXRDdXJyZW50KCksICZxdW90O0FyaWFsJnF1b3Q7LCA4LCBvcmcuZWNsaXBzZS5zd3QuU1dULk5PUk1BTCk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFRBU0tOT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAxNTYpOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9UYXNrTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDIiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlRhc2tOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlRhc2tOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iVGFza05vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIGZpeGVkRm9udD0idHJ1ZSIvPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZQotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9jaGlsZE5vZGVzPgotICAgIDxjaGlsZE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIyMDAzIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSIKLSAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihXT1JLUFJPRFVDVERFU0NSSVBUT1JOT0RFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7ZmlnXzAuc2V0VGV4dCgmcXVvdDsmbHQ7Li4uPiZxdW90Oyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtmaWdfMC5zZXRGb250KCYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTtXT1JLUFJPRFVDVE5PREVOQU1FRklHVVJFX0ZPTlQpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZldvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQgV09SS1BST0RVQ1ROT0RFTkFNRUZJR1VSRV9GT05UID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkuZ2V0Q3VycmVudCgpLCAmcXVvdDtBcmlhbCZxdW90OywgOCwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5OT1JNQUwpOyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBXT1JLUFJPRFVDVERFU0NSSVBUT1JOT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAyMDUpOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMyIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIGZpeGVkRm9udD0idHJ1ZSIvPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZQotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9jaGlsZE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZVZpZXdGYWN0b3J5IgotICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xIgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjAiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGxheW91dFR5cGU9IlRPT0xCQVJfTEFZT1VUIgotICAgICAgICAgIGNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dCBteUdlbkxheW91dE1hbmFnZXIgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQoKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTtteUdlbkxheW91dE1hbmFnZXIuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtteUdlbkxheW91dE1hbmFnZXIuc2V0TWlub3JBbGlnbm1lbnQob3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQuQUxJR05fQ0VOVEVSKTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtteUdlbkxheW91dE1hbmFnZXIuc2V0U3BhY2luZyg1KTsmI3hEOyYjeEE7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRWZXJ0aWNhbChmYWxzZSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0TGF5b3V0TWFuYWdlcihteUdlbkxheW91dE1hbmFnZXIpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoUk9MRVRBU0tDT01QT1NJVEVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0Qm9yZGVyKCYjeDk7JiN4RDsmI3hBO25ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMCkpJiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgUk9MRVRBU0tDT01QT1NJVEVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDE1Nik7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1JvbGVUYXNrQ29tcG9zaXRlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDIiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xIgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBsYXlvdXRUeXBlPSJUT09MQkFSX0xBWU9VVCIKLSAgICAgICAgICBjbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQgbXlHZW5MYXlvdXRNYW5hZ2VyID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0KCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7bXlHZW5MYXlvdXRNYW5hZ2VyLnNldFN0cmV0Y2hNaW5vckF4aXMoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlHZW5MYXlvdXRNYW5hZ2VyLnNldE1pbm9yQWxpZ25tZW50KG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0LkFMSUdOX0NFTlRFUik7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlHZW5MYXlvdXRNYW5hZ2VyLnNldFNwYWNpbmcoNSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtteUdlbkxheW91dE1hbmFnZXIuc2V0VmVydGljYWwodHJ1ZSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0TGF5b3V0TWFuYWdlcihteUdlbkxheW91dE1hbmFnZXIpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoV09SS1BST0RVQ1RDT01QT1NJVEVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0Qm9yZGVyKCYjeDk7JiN4RDsmI3hBO25ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMCkpJiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgV09SS1BST0RVQ1RDT01QT1NJVEVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDIwNSk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1dvcmtQcm9kdWN0Q29tcG9zaXRlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPGxpbmtzCi0gICAgICAgIHZpc3VhbElEPSIzMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTGlua0VkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJMaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTGlua1ZpZXdGYWN0b3J5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRWRnZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkxpbmtFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJMaW5rRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIExpbmtGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Qb2x5bGluZUNvbm5lY3Rpb25FeCB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgTGlua0ZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5ibGFjayYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldFRhcmdldERlY29yYXRpb24oY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uIGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSB7JiN4RDsmI3hBO29yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24gZGYgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbigpOyYjeEQ7JiN4QTsvLyBkaXNwYXRjaE5leHQ/JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdCBwbCA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0KCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgtMSwgMSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgwLCAwKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3BsLmFkZFBvaW50KC0xLCAtMSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtkZi5zZXRUZW1wbGF0ZShwbCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtkZi5zZXRTY2FsZShnZXRNYXBNb2RlKCkuRFB0b0xQKDcpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDMpKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZGY7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEZvcmVncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlR5cGVMaW5rTW9kZWxGYWNldCI+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgICAgIDxzb3VyY2VNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvc291cmNlIi8+Ci0gICAgICAgIDx0YXJnZXRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvdGFyZ2V0Ii8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDQiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkxpbmtOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTGlua05hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkxpbmtOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiPgotICAgICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TGFiZWxPZmZzZXRBdHRyaWJ1dGVzIgotICAgICAgICAgICAgICB5PSI0MCIvPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmUKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2xpbmtzPgotICAgIDxjb21wYXJ0bWVudHMKLSAgICAgICAgdmlzdWFsSUQ9IjUwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIHRpdGxlPSJSb2xlVGFza0NvbXBhcnRtZW50IgotICAgICAgICBjYW5Db2xsYXBzZT0iZmFsc2UiCi0gICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIgotICAgICAgICBub2RlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8Y29tcGFydG1lbnRzCi0gICAgICAgIHZpc3VhbElEPSI1MDAyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudFZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICB0aXRsZT0iV29ya1Byb2R1Y3RDb21wYXJ0bWVudCIKLSAgICAgICAgY2FuQ29sbGFwc2U9ImZhbHNlIgotICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSIKLSAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPHBhbGV0dGU+Ci0gICAgICA8Z3JvdXBzCi0gICAgICAgICAgdGl0bGU9Ik5vZGVzIgotICAgICAgICAgIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IlJvbGVOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgUm9sZU5vZGUiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJSb2xlVGFza0NvbXBvc2l0ZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFJvbGVUYXNrQ29tcG9zaXRlIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iVGFza05vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBUYXNrTm9kZSIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBXb3JrUHJvZHVjTm9kZSIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IldvcmtQcm9kdWN0Q29tcG9zaXRlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgV29ya1Byb2R1Y3RDb21wb3NpdGUiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIi8+Ci0gICAgICA8L2dyb3Vwcz4KLSAgICAgIDxncm91cHMKLSAgICAgICAgICB0aXRsZT0iTGlua3MiCi0gICAgICAgICAgY29sbGFwc2U9InRydWUiPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iTGluayIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IGxpbmsiCi0gICAgICAgICAgICBnZW5MaW5rcz0iLy9AZGlhZ3JhbS9AbGlua3MuMCIvPgotICAgICAgPC9ncm91cHM+Ci0gICAgPC9wYWxldHRlPgotICA8L2RpYWdyYW0+Ci0gIDxwbHVnaW4KLSAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQiCi0gICAgICBuYW1lPSJBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBQbHVnaW4iCi0gICAgICBwcm92aWRlcj0iRVBGIgotICAgICAgcHJpbnRpbmdFbmFibGVkPSJ0cnVlIgotICAgICAgYWN0aXZhdG9yQ2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4iLz4KLSAgPGVkaXRvcgotICAgICAgY2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IiCi0gICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9ySUQiLz4KLSAgPGRvbWFpbkdlbk1vZGVsCi0gICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8iLz4KLTwvZ21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvcj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQuZ21mZ3JhcGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkLmdtZmdyYXBoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTEyNWM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQuZ21mZ3JhcGgKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZncmFwaDpDYW52YXMgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczpnbWZncmFwaD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9HcmFwaGljYWxEZWZpbml0aW9uIiBuYW1lPSJtb2RlbCI+Ci0gIDxmaWd1cmVzCi0gICAgICBuYW1lPSJEZWZhdWx0Ij4KLSAgICA8ZmlndXJlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UmVjdGFuZ2xlIgotICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJSb2xlTm9kZSIKLSAgICAgICAgbmFtZT0iUm9sZU5vZGVGaWd1cmUiCi0gICAgICAgIG91dGxpbmU9ImZhbHNlIj4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMYWJlbCIKLSAgICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJSb2xlTm9kZU5hbWUiCi0gICAgICAgICAgbmFtZT0iUm9sZU5vZGVOYW1lRmlndXJlIgotICAgICAgICAgIHRleHQ9IiZsdDsuLi4+Ij4KLSAgICAgICAgPGZvbnQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpCYXNpY0ZvbnQiCi0gICAgICAgICAgICBmYWNlTmFtZT0iQXJpYWwiCi0gICAgICAgICAgICBoZWlnaHQ9IjgiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8YmFja2dyb3VuZENvbG9yCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJHQkNvbG9yIgotICAgICAgICAgIHJlZD0iMjU1IgotICAgICAgICAgIGdyZWVuPSIyNTUiCi0gICAgICAgICAgYmx1ZT0iMTU2Ii8+Ci0gICAgPC9maWd1cmVzPgotICAgIDxmaWd1cmVzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSZWN0YW5nbGUiCi0gICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IlJvbGVUYXNrQ29tcG9zaXRlIgotICAgICAgICBuYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSI+Ci0gICAgICA8bGF5b3V0Ci0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkZsb3dMYXlvdXQiCi0gICAgICAgICAgZm9yY2VTaW5nbGVMaW5lPSJ0cnVlIgotICAgICAgICAgIG1ham9yQWxpZ25tZW50PSJDRU5URVIiCi0gICAgICAgICAgbWlub3JBbGlnbm1lbnQ9IkNFTlRFUiIKLSAgICAgICAgICBtaW5vclNwYWNpbmc9IjIwIi8+Ci0gICAgICA8YmFja2dyb3VuZENvbG9yCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJHQkNvbG9yIgotICAgICAgICAgIHJlZD0iMjU1IgotICAgICAgICAgIGdyZWVuPSIyNTUiCi0gICAgICAgICAgYmx1ZT0iMTU2Ii8+Ci0gICAgICA8Ym9yZGVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOk1hcmdpbkJvcmRlciIvPgotICAgIDwvZmlndXJlcz4KLSAgICA8ZmlndXJlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UmVjdGFuZ2xlIgotICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJUYXNrTm9kZSIKLSAgICAgICAgbmFtZT0iVGFza05vZGVGaWd1cmUiCi0gICAgICAgIG91dGxpbmU9ImZhbHNlIgotICAgICAgICBsaW5lV2lkdGg9IjAiPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxhYmVsIgotICAgICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IlRhc2tOb2RlTmFtZSIKLSAgICAgICAgICBuYW1lPSJUYXNrTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgdGV4dD0iJmx0Oy4uLj4iPgotICAgICAgICA8Zm9udAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkJhc2ljRm9udCIKLSAgICAgICAgICAgIGZhY2VOYW1lPSJBcmlhbCIKLSAgICAgICAgICAgIGhlaWdodD0iOCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxiYWNrZ3JvdW5kQ29sb3IKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UkdCQ29sb3IiCi0gICAgICAgICAgcmVkPSIyNTUiCi0gICAgICAgICAgZ3JlZW49IjI1NSIKLSAgICAgICAgICBibHVlPSIxNTYiLz4KLSAgICA8L2ZpZ3VyZXM+Ci0gICAgPGZpZ3VyZXMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJlY3RhbmdsZSIKLSAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIKLSAgICAgICAgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSIKLSAgICAgICAgb3V0bGluZT0iZmFsc2UiPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxhYmVsIgotICAgICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IldvcmtQcm9kdWN0Tm9kZU5hbWUiCi0gICAgICAgICAgbmFtZT0iV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICB0ZXh0PSImbHQ7Li4uPiI+Ci0gICAgICAgIDxmb250Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6QmFzaWNGb250IgotICAgICAgICAgICAgZmFjZU5hbWU9IkFyaWFsIgotICAgICAgICAgICAgaGVpZ2h0PSI4Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGJhY2tncm91bmRDb2xvcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSR0JDb2xvciIKLSAgICAgICAgICByZWQ9IjI1NSIKLSAgICAgICAgICBncmVlbj0iMjU1IgotICAgICAgICAgIGJsdWU9IjIwNSIvPgotICAgIDwvZmlndXJlcz4KLSAgICA8ZmlndXJlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UmVjdGFuZ2xlIgotICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJXb3JrUHJvZHVjdENvbXBvc2l0ZSIKLSAgICAgICAgbmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUiPgotICAgICAgPGxheW91dAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpGbG93TGF5b3V0IgotICAgICAgICAgIHZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgIGZvcmNlU2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICBtYWpvckFsaWdubWVudD0iQ0VOVEVSIgotICAgICAgICAgIG1pbm9yQWxpZ25tZW50PSJDRU5URVIiCi0gICAgICAgICAgbWlub3JTcGFjaW5nPSIyMCIvPgotICAgICAgPGJhY2tncm91bmRDb2xvcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSR0JDb2xvciIKLSAgICAgICAgICByZWQ9IjI1NSIKLSAgICAgICAgICBncmVlbj0iMjU1IgotICAgICAgICAgIGJsdWU9IjIwNSIvPgotICAgICAgPGJvcmRlcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpNYXJnaW5Cb3JkZXIiLz4KLSAgICA8L2ZpZ3VyZXM+Ci0gICAgPGZpZ3VyZXMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlBvbHlsaW5lQ29ubmVjdGlvbiIKLSAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iTGluayIKLSAgICAgICAgbmFtZT0iTGlua0ZpZ3VyZSIKLSAgICAgICAgdGFyZ2V0RGVjb3JhdGlvbj0iT3BlbkFycm93Ij4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpQb2x5bGluZURlY29yYXRpb24iCi0gICAgICAgICAgbmFtZT0iT3BlbkFycm93Ij4KLSAgICAgICAgPHRlbXBsYXRlCi0gICAgICAgICAgICB4PSItMSIKLSAgICAgICAgICAgIHk9IjEiLz4KLSAgICAgICAgPHRlbXBsYXRlLz4KLSAgICAgICAgPHRlbXBsYXRlCi0gICAgICAgICAgICB4PSItMSIKLSAgICAgICAgICAgIHk9Ii0xIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxhYmVsIgotICAgICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IkxpbmtOYW1lTGFiZWwiCi0gICAgICAgICAgbmFtZT0iTGlua05hbWVGaWd1cmUiLz4KLSAgICAgIDxmb3JlZ3JvdW5kQ29sb3IKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6Q29uc3RhbnRDb2xvciIKLSAgICAgICAgICB2YWx1ZT0iYmxhY2siLz4KLSAgICA8L2ZpZ3VyZXM+Ci0gICAgPGZpZ3VyZXMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkN1c3RvbUZpZ3VyZSIKLSAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iUm9sZVRhc2tDb21wYXJ0bWVudCBXb3JrUHJvZHVjdENvbXBhcnRtZW50IgotICAgICAgICBuYW1lPSJSZXNpemVhYmxlQ29tcGFydG1lbnRGaWd1cmVFeCIKLSAgICAgICAgcXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUiCi0gICAgICAgIGJ1bmRsZU5hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcyIvPgotICA8L2ZpZ3VyZXM+Ci0gIDxub2RlcwotICAgICAgbmFtZT0iUm9sZU5vZGUiCi0gICAgICBmaWd1cmU9IlJvbGVOb2RlRmlndXJlIi8+Ci0gIDxub2RlcwotICAgICAgbmFtZT0iVGFza05vZGUiCi0gICAgICBmaWd1cmU9IlRhc2tOb2RlRmlndXJlIi8+Ci0gIDxub2RlcwotICAgICAgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIKLSAgICAgIGZpZ3VyZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSIvPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IlJvbGVUYXNrQ29tcG9zaXRlIgotICAgICAgZmlndXJlPSJSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSIvPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlIgotICAgICAgZmlndXJlPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUZpZ3VyZSIvPgotICA8Y29ubmVjdGlvbnMKLSAgICAgIG5hbWU9IkxpbmsiCi0gICAgICBmaWd1cmU9IkxpbmtGaWd1cmUiLz4KLSAgPGNvbXBhcnRtZW50cwotICAgICAgbmFtZT0iUm9sZVRhc2tDb21wYXJ0bWVudCIKLSAgICAgIGZpZ3VyZT0iUmVzaXplYWJsZUNvbXBhcnRtZW50RmlndXJlRXgiLz4KLSAgPGNvbXBhcnRtZW50cwotICAgICAgbmFtZT0iV29ya1Byb2R1Y3RDb21wYXJ0bWVudCIKLSAgICAgIGZpZ3VyZT0iUmVzaXplYWJsZUNvbXBhcnRtZW50RmlndXJlRXgiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iUm9sZU5vZGVOYW1lIgotICAgICAgZmlndXJlPSJSb2xlTm9kZU5hbWVGaWd1cmUiCi0gICAgICBlbGVtZW50SWNvbj0iZmFsc2UiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iVGFza05vZGVOYW1lIgotICAgICAgZmlndXJlPSJUYXNrTm9kZU5hbWVGaWd1cmUiCi0gICAgICBlbGVtZW50SWNvbj0iZmFsc2UiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iV29ya1Byb2R1Y3ROb2RlTmFtZSIKLSAgICAgIGZpZ3VyZT0iV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZSIKLSAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJMaW5rTmFtZUxhYmVsIgotICAgICAgZmlndXJlPSJMaW5rTmFtZUZpZ3VyZSIKLSAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSIvPgotPC9nbWZncmFwaDpDYW52YXM+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkLmdtZm1hcCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQuZ21mbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWYzNmEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQuZ21mbWFwCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mbWFwOk1hcHBpbmcgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnbWZtYXA9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvbWFwcGluZ3MiCi0gICAgeG1sbnM6Z21mdG9vbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9Ub29sRGVmaW5pdGlvbiI+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vUm9sZVRhc2tDb21wb3NpdGUiLz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImFkZC5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjAvQHRvb2xzLjEiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNSb2xlVGFza0NvbXBvc2l0ZSIvPgotICAgICAgPGNoaWxkcmVuPgotICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8b3duZWRDaGlsZD4KLSAgICAgICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL1JvbGVOb2RlIi8+Ci0gICAgICAgICAgPGxhYmVsTWFwcGluZ3M+Ci0gICAgICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1JvbGVOb2RlTmFtZSIvPgotICAgICAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgICAgIDx0b29sCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICAgICAgaHJlZj0iYWRkLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuMCIvPgotICAgICAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjUm9sZU5vZGUiLz4KLSAgICAgICAgPC9vd25lZENoaWxkPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbj4KLSAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPG93bmVkQ2hpbGQ+Ci0gICAgICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9UYXNrTm9kZSIvPgotICAgICAgICAgIDxsYWJlbE1hcHBpbmdzPgotICAgICAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNUYXNrTm9kZU5hbWUiLz4KLSAgICAgICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgICAgICA8dG9vbAotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjAvQHRvb2xzLjIiLz4KLSAgICAgICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1Rhc2tOb2RlIi8+Ci0gICAgICAgIDwvb3duZWRDaGlsZD4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y29tcGFydG1lbnRzPgotICAgICAgICA8Y29tcGFydG1lbnQKLSAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNSb2xlVGFza0NvbXBhcnRtZW50Ii8+Ci0gICAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3RDb21wb3NpdGUiLz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImFkZC5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjAvQHRvb2xzLjQiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNXb3JrUHJvZHVjdENvbXBvc2l0ZSIvPgotICAgICAgPGNoaWxkcmVuPgotICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8b3duZWRDaGlsZD4KLSAgICAgICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiLz4KLSAgICAgICAgICA8bGFiZWxNYXBwaW5ncz4KLSAgICAgICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjV29ya1Byb2R1Y3ROb2RlTmFtZSIvPgotICAgICAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgICAgIDx0b29sCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICAgICAgaHJlZj0iYWRkLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuMyIvPgotICAgICAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIvPgotICAgICAgICA8L293bmVkQ2hpbGQ+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNvbXBhcnRtZW50cz4KLSAgICAgICAgPGNvbXBhcnRtZW50Ci0gICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjV29ya1Byb2R1Y3RDb21wYXJ0bWVudCIvPgotICAgICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bGlua3M+Ci0gICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rIi8+Ci0gICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI0xpbmtOYW1lTGFiZWwiLz4KLSAgICAgIDxmZWF0dXJlcwotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rL25hbWUiLz4KLSAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgPHRvb2wKLSAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICBocmVmPSJhZGQuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy4wIi8+Ci0gICAgPGRpYWdyYW1MaW5rCi0gICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNMaW5rIi8+Ci0gICAgPHNvdXJjZU1ldGFGZWF0dXJlCi0gICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTGluay9zb3VyY2UiLz4KLSAgICA8bGlua01ldGFGZWF0dXJlCi0gICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTGluay90YXJnZXQiLz4KLSAgPC9saW5rcz4KLSAgPGRpYWdyYW0+Ci0gICAgPGRpYWdyYW1DYW52YXMKLSAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI21vZGVsIi8+Ci0gICAgPGRvbWFpbk1vZGVsCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLyIvPgotICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vQWN0aXZpdHlEZXRhaWxEaWFncmFtIi8+Ci0gICAgPHBhbGV0dGUKLSAgICAgICAgaHJlZj0iYWRkLmdtZnRvb2wjLy9AcGFsZXR0ZSIvPgotICA8L2RpYWdyYW0+Ci08L2dtZm1hcDpNYXBwaW5nPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZC5nbWZ0b29sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZC5nbWZ0b29sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjYxZTQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQuZ21mdG9vbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mdG9vbDpUb29sUmVnaXN0cnkgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczpnbWZ0b29sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L1Rvb2xEZWZpbml0aW9uIj4KLSAgPHBhbGV0dGU+Ci0gICAgPHRvb2xzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOlRvb2xHcm91cCIKLSAgICAgICAgdGl0bGU9Ik5vZGVzIgotICAgICAgICBjb2xsYXBzaWJsZT0idHJ1ZSI+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IlJvbGVOb2RlIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFJvbGVOb2RlIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iUm9sZVRhc2tDb21wb3NpdGUiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgUm9sZVRhc2tDb21wb3NpdGUiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJUYXNrTm9kZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBUYXNrTm9kZSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgV29ya1Byb2R1Y05vZGUiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJXb3JrUHJvZHVjdENvbXBvc2l0ZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBXb3JrUHJvZHVjdENvbXBvc2l0ZSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgPC90b29scz4KLSAgICA8dG9vbHMKLSAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6VG9vbEdyb3VwIgotICAgICAgICB0aXRsZT0iTGlua3MiCi0gICAgICAgIGNvbGxhcHNpYmxlPSJ0cnVlIj4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iTGluayIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBsaW5rIi8+Ci0gICAgPC90b29scz4KLSAgPC9wYWxldHRlPgotPC9nbWZ0b29sOlRvb2xSZWdpc3RyeT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQyLmdtZmdlbiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQyLmdtZmdlbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk3NzE0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkMi5nbWZnZW4KKysrIC9kZXYvbnVsbApAQCAtMSw1OTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZnZW46R2VuRWRpdG9yR2VuZXJhdG9yIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6Z21mZ2VuPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L0dlbk1vZGVsLzIuMCI+Ci0gIDxkaWFncmFtCi0gICAgICB2aXN1YWxJRD0iNzkiCi0gICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQiCi0gICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld0ZhY3RvcnkiCi0gICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgaWNvblByb3ZpZGVyUHJpb3JpdHk9IkxvdyIKLSAgICAgIHZhbGlkYXRpb25Qcm92aWRlclByaW9yaXR5PSJMb3ciPgotICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL0RpYWdyYW0iLz4KLSAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0SGVscGVyIi8+Ci0gICAgPHZpZXdtYXAKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyIi8+Ci0gICAgPGRvbWFpbkRpYWdyYW1FbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9BY3Rpdml0eURldGFpbERpYWdyYW0iLz4KLSAgICA8Y2hpbGROb2RlcwotICAgICAgICB2aXN1YWxJRD0iMjAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlJvbGVOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUm9sZU5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZU5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSIKLSAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iUm9sZU5vZGVDcmVhdGVDb21tYW5kIgotICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iUm9sZU5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJSb2xlTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBSb2xlTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFJvbGVOb2RlRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldEZpbGwodHJ1ZSk7JiN4QTt0aGlzLnNldEZpbGxYT1IoZmFsc2UpOyYjeEE7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBO3RoaXMuc2V0T3V0bGluZVhPUihmYWxzZSk7JiN4QTt0aGlzLnNldExpbmVXaWR0aCgxKTsmI3hBO3RoaXMuc2V0TGluZVN0eWxlKG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljcy5MSU5FX1NPTElEKTsmI3hBOyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoUk9MRU5PREVGSUdVUkVfQkFDSyYjeEE7KTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTsmI3hBO29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCByb2xlTm9kZU5hbWVGaWd1cmUwID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEE7cm9sZU5vZGVOYW1lRmlndXJlMC5zZXRUZXh0KCZxdW90OyZsdDsuLi4+JnF1b3Q7KTsmI3hBOyYjeEE7cm9sZU5vZGVOYW1lRmlndXJlMC5zZXRGb250KFJvbGVOb2RlTmFtZUZpZ3VyZV9GT05UKTsmI3hBOyYjeEE7JiN4QTsmI3hBO3RoaXMuYWRkKHJvbGVOb2RlTmFtZUZpZ3VyZTApOyYjeEE7c2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlKHJvbGVOb2RlTmFtZUZpZ3VyZTApOyYjeEE7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZSb2xlTm9kZU5hbWVGaWd1cmU7ICYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZVJvbGVOb2RlTmFtZUZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlJvbGVOb2RlTmFtZUZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVSb2xlTm9kZU5hbWVGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4QTsmI3g5OyYjeDk7ZlJvbGVOb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hBOyYjeDk7fSYjeEE7JiN4QTt9JiN4QTsmI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFJPTEVOT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAxNTYpOyYjeEE7JiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7c3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250IFJvbGVOb2RlTmFtZUZpZ3VyZV9GT05UID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkuZ2V0Q3VycmVudCgpLCAmcXVvdDtBcmlhbCZxdW90OywgOCwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5OT1JNQUwpOyYjeEE7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Sb2xlTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDEiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlJvbGVOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUm9sZU5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVSb2xlTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIGZpeGVkRm9udD0idHJ1ZSIvPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvY2hpbGROb2Rlcz4KLSAgICA8Y2hpbGROb2RlcwotICAgICAgICB2aXN1YWxJRD0iMjAwMiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlRhc2tOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlRhc2tOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iVGFza05vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iVGFza05vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iVGFza05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSIKLSAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iVGFza05vZGVDcmVhdGVDb21tYW5kIgotICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iVGFza05vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJUYXNrTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBUYXNrTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFRhc2tOb2RlRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldEZpbGwodHJ1ZSk7JiN4QTt0aGlzLnNldEZpbGxYT1IoZmFsc2UpOyYjeEE7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBO3RoaXMuc2V0T3V0bGluZVhPUihmYWxzZSk7JiN4QTt0aGlzLnNldExpbmVXaWR0aCgwKTsmI3hBO3RoaXMuc2V0TGluZVN0eWxlKG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljcy5MSU5FX1NPTElEKTsmI3hBOyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoVEFTS05PREVGSUdVUkVfQkFDSyYjeEE7KTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTsmI3hBO29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCB0YXNrTm9kZU5hbWVGaWd1cmUwID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEE7dGFza05vZGVOYW1lRmlndXJlMC5zZXRUZXh0KCZxdW90OyZsdDsuLi4+JnF1b3Q7KTsmI3hBOyYjeEE7dGFza05vZGVOYW1lRmlndXJlMC5zZXRGb250KFRhc2tOb2RlTmFtZUZpZ3VyZV9GT05UKTsmI3hBOyYjeEE7JiN4QTsmI3hBO3RoaXMuYWRkKHRhc2tOb2RlTmFtZUZpZ3VyZTApOyYjeEE7c2V0RmlndXJlVGFza05vZGVOYW1lRmlndXJlKHRhc2tOb2RlTmFtZUZpZ3VyZTApOyYjeEE7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZUYXNrTm9kZU5hbWVGaWd1cmU7ICYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZVRhc2tOb2RlTmFtZUZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlRhc2tOb2RlTmFtZUZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4QTsmI3g5OyYjeDk7ZlRhc2tOb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hBOyYjeDk7fSYjeEE7JiN4QTt9JiN4QTsmI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFRBU0tOT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAxNTYpOyYjeEE7JiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7c3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250IFRhc2tOb2RlTmFtZUZpZ3VyZV9GT05UID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkuZ2V0Q3VycmVudCgpLCAmcXVvdDtBcmlhbCZxdW90OywgOCwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5OT1JNQUwpOyYjeEE7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9UYXNrTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDIiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlRhc2tOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlRhc2tOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iVGFza05vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIGZpeGVkRm9udD0idHJ1ZSIvPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvY2hpbGROb2Rlcz4KLSAgICA8Y2hpbGROb2RlcwotICAgICAgICB2aXN1YWxJRD0iMjAwMyIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiCi0gICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVDcmVhdGVDb21tYW5kIgotICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0RmlsbCh0cnVlKTsmI3hBO3RoaXMuc2V0RmlsbFhPUihmYWxzZSk7JiN4QTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7dGhpcy5zZXRPdXRsaW5lWE9SKGZhbHNlKTsmI3hBO3RoaXMuc2V0TGluZVdpZHRoKDEpOyYjeEE7dGhpcy5zZXRMaW5lU3R5bGUob3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzLkxJTkVfU09MSUQpOyYjeEE7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihXT1JLUFJPRFVDVERFU0NSSVBUT1JOT0RFRklHVVJFX0JBQ0smI3hBOyk7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4QTsmI3hBOyYjeEE7JiN4QTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgd29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZTAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4QTt3b3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlMC5zZXRUZXh0KCZxdW90OyZsdDsuLi4+JnF1b3Q7KTsmI3hBOyYjeEE7d29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZTAuc2V0Rm9udChXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlX0ZPTlQpOyYjeEE7JiN4QTsmI3hBOyYjeEE7dGhpcy5hZGQod29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZTApOyYjeEE7c2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZSh3b3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlMCk7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZldvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmU7ICYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZVdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5OyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4QTsmI3g5OyYjeDk7ZldvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUgPSBmaWc7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4QTsmI3g5O30mI3hBOyYjeEE7fSYjeEE7JiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7c3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBXT1JLUFJPRFVDVERFU0NSSVBUT1JOT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAyMDUpOyYjeEE7JiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7c3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250IFdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmVfRk9OVCA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5LmdldEN1cnJlbnQoKSwgJnF1b3Q7QXJpYWwmcXVvdDssIDgsIG9yZy5lY2xpcHNlLnN3dC5TV1QuTk9STUFMKTsmI3hBOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDMiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiPgotICAgICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgICBmaXhlZEZvbnQ9InRydWUiLz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2NoaWxkTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMSIKLSAgICAgICAgY29tcGFydG1lbnRzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMCIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiCi0gICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlQ3JlYXRlQ29tbWFuZCI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBsYXlvdXRUeXBlPSJUT09MQkFSX0xBWU9VVCIKLSAgICAgICAgICBjbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4QTsmI3hBOyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQgbGF5b3V0VGhpcyA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dCgpOyYjeEE7JiN4OTtsYXlvdXRUaGlzLnNldFN0cmV0Y2hNaW5vckF4aXMoZmFsc2UpOyYjeEE7JiN4OTtsYXlvdXRUaGlzLnNldE1pbm9yQWxpZ25tZW50KG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0LiYjeEE7QUxJR05fQ0VOVEVSJiN4QTsmI3hBOyYjeEE7KTsmI3hBOyYjeEE7JiN4OTtsYXlvdXRUaGlzLnNldFNwYWNpbmcoNSk7JiN4QTsmI3g5O2xheW91dFRoaXMuc2V0VmVydGljYWwoZmFsc2UpOyYjeEE7JiN4QTsmI3g5O3RoaXMuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXRUaGlzKTsmI3hBOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0RmlsbCh0cnVlKTsmI3hBO3RoaXMuc2V0RmlsbFhPUihmYWxzZSk7JiN4QTt0aGlzLnNldE91dGxpbmUodHJ1ZSk7JiN4QTt0aGlzLnNldE91dGxpbmVYT1IoZmFsc2UpOyYjeEE7dGhpcy5zZXRMaW5lV2lkdGgoMSk7JiN4QTt0aGlzLnNldExpbmVTdHlsZShvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3MuTElORV9TT0xJRCk7JiN4QTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKFJPTEVUQVNLQ09NUE9TSVRFRklHVVJFX0JBQ0smI3hBOyk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcigpJiN4QTspOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4QTsmI3g5O30mI3hBOyYjeEE7fSYjeEE7JiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7c3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBST0xFVEFTS0NPTVBPU0lURUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMTU2KTsmI3hBOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvUm9sZVRhc2tDb21wb3NpdGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIiCi0gICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjEiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IgotICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUNyZWF0ZUNvbW1hbmQiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgbGF5b3V0VHlwZT0iVE9PTEJBUl9MQVlPVVQiCi0gICAgICAgICAgY2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENvbXBvc2l0ZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFdvcmtQcm9kdWN0Q29tcG9zaXRlRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeEE7JiN4QTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0IGxheW91dFRoaXMgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQoKTsmI3hBOyYjeDk7bGF5b3V0VGhpcy5zZXRTdHJldGNoTWlub3JBeGlzKGZhbHNlKTsmI3hBOyYjeDk7bGF5b3V0VGhpcy5zZXRNaW5vckFsaWdubWVudChvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dC4mI3hBO0FMSUdOX0NFTlRFUiYjeEE7JiN4QTsmI3hBOyk7JiN4QTsmI3hBOyYjeDk7bGF5b3V0VGhpcy5zZXRTcGFjaW5nKDUpOyYjeEE7JiN4OTtsYXlvdXRUaGlzLnNldFZlcnRpY2FsKHRydWUpOyYjeEE7JiN4QTsmI3g5O3RoaXMuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXRUaGlzKTsmI3hBOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0RmlsbCh0cnVlKTsmI3hBO3RoaXMuc2V0RmlsbFhPUihmYWxzZSk7JiN4QTt0aGlzLnNldE91dGxpbmUodHJ1ZSk7JiN4QTt0aGlzLnNldE91dGxpbmVYT1IoZmFsc2UpOyYjeEE7dGhpcy5zZXRMaW5lV2lkdGgoMSk7JiN4QTt0aGlzLnNldExpbmVTdHlsZShvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3MuTElORV9TT0xJRCk7JiN4QTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKFdPUktQUk9EVUNUQ09NUE9TSVRFRklHVVJFX0JBQ0smI3hBOyk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcigpJiN4QTspOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4QTsmI3g5O30mI3hBOyYjeEE7fSYjeEE7JiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7c3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBXT1JLUFJPRFVDVENPTVBPU0lURUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMjA1KTsmI3hBOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvV29ya1Byb2R1Y3RDb21wb3NpdGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8bGlua3MKLSAgICAgICAgdmlzdWFsSUQ9IjMwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJMaW5rRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkxpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJMaW5rVmlld0ZhY3RvcnkiCi0gICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IkxpbmtDcmVhdGVDb21tYW5kIgotICAgICAgICByZW9yaWVudENvbW1hbmRDbGFzc05hbWU9IkxpbmtSZW9yaWVudENvbW1hbmQiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9FZGdlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iTGlua0VkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkxpbmtGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgTGlua0ZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLlBvbHlsaW5lQ29ubmVjdGlvbkV4IHsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIExpbmtGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRGaWxsKHRydWUpOyYjeEE7dGhpcy5zZXRGaWxsWE9SKGZhbHNlKTsmI3hBO3RoaXMuc2V0T3V0bGluZSh0cnVlKTsmI3hBO3RoaXMuc2V0T3V0bGluZVhPUihmYWxzZSk7JiN4QTt0aGlzLnNldExpbmVXaWR0aCgxKTsmI3hBO3RoaXMuc2V0TGluZVN0eWxlKG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljcy5MSU5FX1NPTElEKTsmI3hBOyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmJsYWNrKTsmI3hBOyYjeEE7JiN4OTsmI3g5O3NldFRhcmdldERlY29yYXRpb24oY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpKTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3RhdGFibGVEZWNvcmF0aW9uIGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSB7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbiBkZiA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uKCk7JiN4QTtkZi5zZXRGaWxsKHRydWUpOyYjeEE7ZGYuc2V0RmlsbFhPUihmYWxzZSk7JiN4QTtkZi5zZXRPdXRsaW5lKHRydWUpOyYjeEE7ZGYuc2V0T3V0bGluZVhPUihmYWxzZSk7JiN4QTtkZi5zZXRMaW5lV2lkdGgoMSk7JiN4QTtkZi5zZXRMaW5lU3R5bGUob3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzLkxJTkVfU09MSUQpOyYjeEE7b3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdCBwbCA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0KCk7JiN4QTtwbC5hZGRQb2ludChnZXRNYXBNb2RlKCkuRFB0b0xQKC0xKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDEpJiN4QTspOyYjeEE7cGwuYWRkUG9pbnQoZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDApJiN4QTspOyYjeEE7cGwuYWRkUG9pbnQoZ2V0TWFwTW9kZSgpLkRQdG9MUCgtMSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCgtMSkmI3hBOyk7JiN4QTtkZi5zZXRUZW1wbGF0ZShwbCk7JiN4QTtkZi5zZXRTY2FsZShnZXRNYXBNb2RlKCkuRFB0b0xQKDcpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoMykmI3hBOyk7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGRmOyYjeEE7JiN4OTt9JiN4QTsmI3hBO30mI3hBOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUeXBlTGlua01vZGVsRmFjZXQiPgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluayIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgICAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rL3NvdXJjZSIvPgotICAgICAgICA8dGFyZ2V0TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rL3RhcmdldCIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDA0IgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJMaW5rTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkxpbmtOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJMaW5rTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIj4KLSAgICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkxhYmVsT2Zmc2V0QXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgeT0iNDAiLz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvbGlua3M+Ci0gICAgPGNvbXBhcnRtZW50cwotICAgICAgICB2aXN1YWxJRD0iNTAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgdGl0bGU9IlJvbGVUYXNrQ29tcGFydG1lbnQiCi0gICAgICAgIGNhbkNvbGxhcHNlPSJmYWxzZSIKLSAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiCi0gICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIj4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgIDwvY29tcGFydG1lbnRzPgotICAgIDxjb21wYXJ0bWVudHMKLSAgICAgICAgdmlzdWFsSUQ9IjUwMDIiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50Vmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIHRpdGxlPSJXb3JrUHJvZHVjdENvbXBhcnRtZW50IgotICAgICAgICBjYW5Db2xsYXBzZT0iZmFsc2UiCi0gICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIgotICAgICAgICBub2RlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8cGFsZXR0ZT4KLSAgICAgIDxncm91cHMKLSAgICAgICAgICB0aXRsZT0iTm9kZXMiCi0gICAgICAgICAgY29sbGFwc2U9InRydWUiPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iUm9sZU5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBSb2xlTm9kZSIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IlJvbGVUYXNrQ29tcG9zaXRlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgUm9sZVRhc2tDb21wb3NpdGUiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJUYXNrTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFRhc2tOb2RlIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMSIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFdvcmtQcm9kdWNOb2RlIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iV29ya1Byb2R1Y3RDb21wb3NpdGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBXb3JrUHJvZHVjdENvbXBvc2l0ZSIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiLz4KLSAgICAgIDwvZ3JvdXBzPgotICAgICAgPGdyb3VwcwotICAgICAgICAgIHRpdGxlPSJMaW5rcyIKLSAgICAgICAgICBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJMaW5rIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgbGluayIKLSAgICAgICAgICAgIGdlbkxpbmtzPSIvL0BkaWFncmFtL0BsaW5rcy4wIi8+Ci0gICAgICA8L2dyb3Vwcz4KLSAgICA8L3BhbGV0dGU+Ci0gICAgPHByZWZlcmVuY2VQYWdlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5kaWFncmFtLmdlbmVyYWwiCi0gICAgICAgIG5hbWU9IkRpYWdyYW0gRGlhZ3JhbSI+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmRpYWdyYW0uYXBwZWFyYW5jZSIKLSAgICAgICAgICBuYW1lPSJBcHBlYXJhbmNlIgotICAgICAgICAgIGtpbmQ9IkFwcGVhcmFuY2UiLz4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZGlhZ3JhbS5jb25uZWN0aW9ucyIKLSAgICAgICAgICBuYW1lPSJDb25uZWN0aW9ucyIKLSAgICAgICAgICBraW5kPSJDb25uZWN0aW9ucyIvPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5kaWFncmFtLnByaW50aW5nIgotICAgICAgICAgIG5hbWU9IlByaW50aW5nIgotICAgICAgICAgIGtpbmQ9IlByaW50aW5nIi8+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmRpYWdyYW0ucnVsZXJzQW5kR3JpZCIKLSAgICAgICAgICBuYW1lPSJSdWxlcnMgQW5kIEdyaWQiCi0gICAgICAgICAga2luZD0iUnVsZXJzQW5kR3JpZCIvPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5kaWFncmFtLnBhdGhtYXBzIgotICAgICAgICAgIG5hbWU9IlBhdGhtYXBzIgotICAgICAgICAgIGtpbmQ9IlBhdGhtYXBzIi8+Ci0gICAgPC9wcmVmZXJlbmNlUGFnZXM+Ci0gIDwvZGlhZ3JhbT4KLSAgPHBsdWdpbi8+Ci0gIDxlZGl0b3IvPgotICA8bmF2aWdhdG9yPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0iLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMSIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0iCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICBncm91cE5hbWU9ImxpbmtzIgotICAgICAgICBncm91cEljb249Imljb25zL2xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiCi0gICAgICAgIGdyb3VwTmFtZT0idGFyZ2V0IgotICAgICAgICBncm91cEljb249Imljb25zL2xpbmtUYXJnZXROYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIgotICAgICAgICBncm91cE5hbWU9ImluY29taW5nIGxpbmtzIgotICAgICAgICBncm91cEljb249Imljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCIKLSAgICAgICAgZ3JvdXBOYW1lPSJ0YXJnZXQiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1RhcmdldE5hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiCi0gICAgICAgIGdyb3VwTmFtZT0iaW5jb21pbmcgbGlua3MiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0IgotICAgICAgICBncm91cE5hbWU9InRhcmdldCIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rVGFyZ2V0TmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSIKLSAgICAgICAgZ3JvdXBOYW1lPSJpbmNvbWluZyBsaW5rcyIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9pbmNvbWluZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiCi0gICAgICAgIGdyb3VwTmFtZT0idGFyZ2V0IgotICAgICAgICBncm91cEljb249Imljb25zL2xpbmtUYXJnZXROYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIgotICAgICAgICBncm91cE5hbWU9ImluY29taW5nIGxpbmtzIgotICAgICAgICBncm91cEljb249Imljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCIKLSAgICAgICAgZ3JvdXBOYW1lPSJ0YXJnZXQiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1RhcmdldE5hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiCi0gICAgICAgIGdyb3VwTmFtZT0iaW5jb21pbmcgbGlua3MiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiCi0gICAgICAgIGdyb3VwTmFtZT0ic291cmNlIgotICAgICAgICBncm91cEljb249Imljb25zL2xpbmtTb3VyY2VOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCIKLSAgICAgICAgZ3JvdXBOYW1lPSJvdXRnb2luZyBsaW5rcyIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSIKLSAgICAgICAgZ3JvdXBOYW1lPSJzb3VyY2UiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1NvdXJjZU5hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0IgotICAgICAgICBncm91cE5hbWU9Im91dGdvaW5nIGxpbmtzIgotICAgICAgICBncm91cEljb249Imljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIgotICAgICAgICBncm91cE5hbWU9InNvdXJjZSIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rU291cmNlTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiCi0gICAgICAgIGdyb3VwTmFtZT0ib3V0Z29pbmcgbGlua3MiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiCi0gICAgICAgIGdyb3VwTmFtZT0ic291cmNlIgotICAgICAgICBncm91cEljb249Imljb25zL2xpbmtTb3VyY2VOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCIKLSAgICAgICAgZ3JvdXBOYW1lPSJvdXRnb2luZyBsaW5rcyIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSIKLSAgICAgICAgZ3JvdXBOYW1lPSJzb3VyY2UiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1NvdXJjZU5hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0IgotICAgICAgICBncm91cE5hbWU9Im91dGdvaW5nIGxpbmtzIgotICAgICAgICBncm91cEljb249Imljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgPC9uYXZpZ2F0b3I+Ci0gIDxwcm9wZXJ0eVNoZWV0PgotICAgIDx0YWJzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcm9wZXJ0eVRhYiIKLSAgICAgICAgaUQ9ImFwcGVhcmFuY2UiLz4KLSAgICA8dGFicwotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJvcGVydHlUYWIiCi0gICAgICAgIGlEPSJkaWFncmFtIi8+Ci0gICAgPHRhYnMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5DdXN0b21Qcm9wZXJ0eVRhYiIKLSAgICAgICAgaUQ9ImRvbWFpbiIKLSAgICAgICAgbGFiZWw9IkNvcmUiPgotICAgICAgPGZpbHRlcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VHlwZVRhYkZpbHRlciI+Ci0gICAgICAgIDx0eXBlcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3PC90eXBlcz4KLSAgICAgICAgPHR5cGVzPm9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDwvdHlwZXM+Ci0gICAgICAgIDxnZW5lcmF0ZWRUeXBlcz5hYnN0cmFjdE5hdmlnYXRvckl0ZW08L2dlbmVyYXRlZFR5cGVzPgotICAgICAgPC9maWx0ZXI+Ci0gICAgPC90YWJzPgotICA8L3Byb3BlcnR5U2hlZXQ+Ci0gIDxkb21haW5HZW5Nb2RlbAotICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvIi8+Ci08L2dtZmdlbjpHZW5FZGl0b3JHZW5lcmF0b3I+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkMi5nbWZtYXAgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkMi5nbWZtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0Y2Y3NjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZDIuZ21mbWFwCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mbWFwOk1hcHBpbmcgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnbWZtYXA9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvbWFwcGluZ3MvMi4wIgotICAgIHhtbG5zOmdtZnRvb2w9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvVG9vbERlZmluaXRpb24iPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL1JvbGVUYXNrQ29tcG9zaXRlIi8+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJhZGQuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy4xIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjUm9sZVRhc2tDb21wb3NpdGUiLz4KLSAgICAgIDxjaGlsZHJlbj4KLSAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPG93bmVkQ2hpbGQ+Ci0gICAgICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Sb2xlTm9kZSIvPgotICAgICAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyI+Ci0gICAgICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1JvbGVOb2RlTmFtZSIvPgotICAgICAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgICAgIDx0b29sCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICAgICAgaHJlZj0iYWRkLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuMCIvPgotICAgICAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjUm9sZU5vZGUiLz4KLSAgICAgICAgPC9vd25lZENoaWxkPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbj4KLSAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPG93bmVkQ2hpbGQ+Ci0gICAgICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9UYXNrTm9kZSIvPgotICAgICAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyI+Ci0gICAgICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1Rhc2tOb2RlTmFtZSIvPgotICAgICAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgICAgIDx0b29sCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICAgICAgaHJlZj0iYWRkLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuMiIvPgotICAgICAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjVGFza05vZGUiLz4KLSAgICAgICAgPC9vd25lZENoaWxkPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjb21wYXJ0bWVudHM+Ci0gICAgICAgIDxjb21wYXJ0bWVudAotICAgICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1JvbGVUYXNrQ29tcGFydG1lbnQiLz4KLSAgICAgIDwvY29tcGFydG1lbnRzPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdENvbXBvc2l0ZSIvPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iYWRkLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuNCIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1dvcmtQcm9kdWN0Q29tcG9zaXRlIi8+Ci0gICAgICA8Y2hpbGRyZW4+Ci0gICAgICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxvd25lZENoaWxkPgotICAgICAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIvPgotICAgICAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyI+Ci0gICAgICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1dvcmtQcm9kdWN0Tm9kZU5hbWUiLz4KLSAgICAgICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgICAgICA8dG9vbAotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjAvQHRvb2xzLjMiLz4KLSAgICAgICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiLz4KLSAgICAgICAgPC9vd25lZENoaWxkPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjb21wYXJ0bWVudHM+Ci0gICAgICAgIDxjb21wYXJ0bWVudAotICAgICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1dvcmtQcm9kdWN0Q29tcGFydG1lbnQiLz4KLSAgICAgIDwvY29tcGFydG1lbnRzPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPGxpbmtzPgotICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTGluayIvPgotICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyIKLSAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI0xpbmtOYW1lTGFiZWwiLz4KLSAgICAgIDxmZWF0dXJlcwotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rL25hbWUiLz4KLSAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgPHRvb2wKLSAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICBocmVmPSJhZGQuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy4wIi8+Ci0gICAgPGRpYWdyYW1MaW5rCi0gICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNMaW5rIi8+Ci0gICAgPHNvdXJjZU1ldGFGZWF0dXJlCi0gICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTGluay9zb3VyY2UiLz4KLSAgICA8bGlua01ldGFGZWF0dXJlCi0gICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTGluay90YXJnZXQiLz4KLSAgPC9saW5rcz4KLSAgPGRpYWdyYW0+Ci0gICAgPGRpYWdyYW1DYW52YXMKLSAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI21vZGVsIi8+Ci0gICAgPGRvbWFpbk1vZGVsCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLyIvPgotICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vQWN0aXZpdHlEZXRhaWxEaWFncmFtIi8+Ci0gICAgPHBhbGV0dGUKLSAgICAgICAgaHJlZj0iYWRkLmdtZnRvb2wjLy9AcGFsZXR0ZSIvPgotICA8L2RpYWdyYW0+Ci08L2dtZm1hcDpNYXBwaW5nPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZDMuZ21mZ2VuIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZDMuZ21mZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzFlMzYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQzLmdtZmdlbgorKysgL2Rldi9udWxsCkBAIC0xLDQwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZmdlbjpHZW5FZGl0b3JHZW5lcmF0b3IgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczpnbWZnZW49Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvR2VuTW9kZWwvMi4wIiBwYWNrYWdlTmFtZVByZWZpeD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkIgotICAgIG1vZGVsSUQ9IkFERCIKLSAgICBzYW1lRmlsZUZvckRpYWdyYW1BbmRNb2RlbD0idHJ1ZSIKLSAgICBkaWFncmFtRmlsZUV4dGVuc2lvbj0ieG1pIgotICAgIHRlbXBsYXRlRGlyZWN0b3J5PSIiPgotICA8ZGlhZ3JhbQotICAgICAgdmlzdWFsSUQ9Ijc5IgotICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IgotICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdGYWN0b3J5IgotICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgIGljb25Qcm92aWRlclByaW9yaXR5PSJMb3ciPgotICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL0RpYWdyYW0iLz4KLSAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0SGVscGVyIi8+Ci0gICAgPHZpZXdtYXAKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyIi8+Ci0gICAgPGRvbWFpbkRpYWdyYW1FbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9BY3Rpdml0eURldGFpbERpYWdyYW0iLz4KLSAgICA8Y2hpbGROb2RlcwotICAgICAgICB2aXN1YWxJRD0iMjAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlJvbGVOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUm9sZU5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZU5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSIKLSAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IlJvbGVOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iUm9sZU5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgUm9sZU5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBSb2xlTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoUk9MRU5PREVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTtmaWdfMC5zZXRUZXh0KCZxdW90OyZsdDsuLi4+JnF1b3Q7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZpZ18wLnNldEZvbnQoJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5O1JPTEVOT0RFTkFNRUZJR1VSRV9GT05UKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZVJvbGVOb2RlTmFtZUZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZlJvbGVOb2RlTmFtZUZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZVJvbGVOb2RlTmFtZUZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmUm9sZU5vZGVOYW1lRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVJvbGVOb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZSb2xlTm9kZU5hbWVGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBST0xFTk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMTU2KTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udCBST0xFTk9ERU5BTUVGSUdVUkVfRk9OVCA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5LmdldEN1cnJlbnQoKSwgJnF1b3Q7QXJpYWwmcXVvdDssIDgsIG9yZy5lY2xpcHNlLnN3dC5TV1QuTk9STUFMKTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvUm9sZU5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDAxIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJSb2xlTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlJvbGVOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiPgotICAgICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgICBmaXhlZEZvbnQ9InRydWUiLz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2NoaWxkTm9kZXM+Ci0gICAgPGNoaWxkTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjIwMDIiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJUYXNrTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJUYXNrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlRhc2tOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlRhc2tOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlRhc2tOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiCi0gICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJUYXNrTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IlRhc2tOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIFRhc2tOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgVGFza05vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0TGluZVdpZHRoKDApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoVEFTS05PREVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTtmaWdfMC5zZXRUZXh0KCZxdW90OyZsdDsuLi4+JnF1b3Q7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZpZ18wLnNldEZvbnQoJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5O1RBU0tOT0RFTkFNRUZJR1VSRV9GT05UKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZVRhc2tOb2RlTmFtZUZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZlRhc2tOb2RlTmFtZUZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZVRhc2tOb2RlTmFtZUZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmVGFza05vZGVOYW1lRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVRhc2tOb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZUYXNrTm9kZU5hbWVGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250IFRBU0tOT0RFTkFNRUZJR1VSRV9GT05UID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkuZ2V0Q3VycmVudCgpLCAmcXVvdDtBcmlhbCZxdW90OywgOCwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5OT1JNQUwpOyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBUQVNLTk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMTU2KTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvVGFza05vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDAyIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJUYXNrTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJUYXNrTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlRhc2tOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlVGFza05vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiPgotICAgICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgICBmaXhlZEZvbnQ9InRydWUiLz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2NoaWxkTm9kZXM+Ci0gICAgPGNoaWxkTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjIwMDMiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IgotICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKFdPUktQUk9EVUNUREVTQ1JJUFRPUk5PREVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTtmaWdfMC5zZXRUZXh0KCZxdW90OyZsdDsuLi4+JnF1b3Q7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZpZ18wLnNldEZvbnQoJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5O1dPUktQUk9EVUNUTk9ERU5BTUVGSUdVUkVfRk9OVCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZVdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZldvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udCBXT1JLUFJPRFVDVE5PREVOQU1FRklHVVJFX0ZPTlQgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheS5nZXRDdXJyZW50KCksICZxdW90O0FyaWFsJnF1b3Q7LCA4LCBvcmcuZWNsaXBzZS5zd3QuU1dULk5PUk1BTCk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFdPUktQUk9EVUNUREVTQ1JJUFRPUk5PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDIwNSk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDAzIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIj4KLSAgICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgZml4ZWRGb250PSJ0cnVlIi8+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9jaGlsZE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiCi0gICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjAiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGxheW91dFR5cGU9IlRPT0xCQVJfTEFZT1VUIgotICAgICAgICAgIGNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dCBteUdlbkxheW91dE1hbmFnZXIgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQoKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTtteUdlbkxheW91dE1hbmFnZXIuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtteUdlbkxheW91dE1hbmFnZXIuc2V0TWlub3JBbGlnbm1lbnQob3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQuQUxJR05fQ0VOVEVSKTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtteUdlbkxheW91dE1hbmFnZXIuc2V0U3BhY2luZyg1KTsmI3hEOyYjeEE7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRWZXJ0aWNhbChmYWxzZSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0TGF5b3V0TWFuYWdlcihteUdlbkxheW91dE1hbmFnZXIpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoUk9MRVRBU0tDT01QT1NJVEVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0Qm9yZGVyKCYjeDk7JiN4RDsmI3hBO25ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMCkpJiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgUk9MRVRBU0tDT01QT1NJVEVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDE1Nik7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1JvbGVUYXNrQ29tcG9zaXRlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDIiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yIgotICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xIgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBsYXlvdXRUeXBlPSJUT09MQkFSX0xBWU9VVCIKLSAgICAgICAgICBjbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQgbXlHZW5MYXlvdXRNYW5hZ2VyID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0KCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7bXlHZW5MYXlvdXRNYW5hZ2VyLnNldFN0cmV0Y2hNaW5vckF4aXMoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlHZW5MYXlvdXRNYW5hZ2VyLnNldE1pbm9yQWxpZ25tZW50KG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0LkFMSUdOX0NFTlRFUik7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlHZW5MYXlvdXRNYW5hZ2VyLnNldFNwYWNpbmcoNSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtteUdlbkxheW91dE1hbmFnZXIuc2V0VmVydGljYWwodHJ1ZSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0TGF5b3V0TWFuYWdlcihteUdlbkxheW91dE1hbmFnZXIpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoV09SS1BST0RVQ1RDT01QT1NJVEVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0Qm9yZGVyKCYjeDk7JiN4RDsmI3hBO25ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMCkpJiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgV09SS1BST0RVQ1RDT01QT1NJVEVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDIwNSk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1dvcmtQcm9kdWN0Q29tcG9zaXRlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPGxpbmtzCi0gICAgICAgIHZpc3VhbElEPSIzMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTGlua0VkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJMaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTGlua1ZpZXdGYWN0b3J5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRWRnZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkxpbmtFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJMaW5rRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIExpbmtGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Qb2x5bGluZUNvbm5lY3Rpb25FeCB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgTGlua0ZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5ibGFjayYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldFRhcmdldERlY29yYXRpb24oY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uIGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSB7JiN4RDsmI3hBO29yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24gZGYgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbigpOyYjeEQ7JiN4QTsvLyBkaXNwYXRjaE5leHQ/JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdCBwbCA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0KCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgtMSwgMSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgwLCAwKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3BsLmFkZFBvaW50KC0xLCAtMSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtkZi5zZXRUZW1wbGF0ZShwbCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtkZi5zZXRTY2FsZShnZXRNYXBNb2RlKCkuRFB0b0xQKDcpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDMpKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZGY7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEZvcmVncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlR5cGVMaW5rTW9kZWxGYWNldCI+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgICAgIDxzb3VyY2VNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvc291cmNlIi8+Ci0gICAgICAgIDx0YXJnZXRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvdGFyZ2V0Ii8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDQiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkxpbmtOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTGlua05hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkxpbmtOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiPgotICAgICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TGFiZWxPZmZzZXRBdHRyaWJ1dGVzIgotICAgICAgICAgICAgICB5PSI0MCIvPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rL25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9saW5rcz4KLSAgICA8Y29tcGFydG1lbnRzCi0gICAgICAgIHZpc3VhbElEPSI1MDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudFZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICB0aXRsZT0iUm9sZVRhc2tDb21wYXJ0bWVudCIKLSAgICAgICAgY2FuQ29sbGFwc2U9ImZhbHNlIgotICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSIKLSAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPGNvbXBhcnRtZW50cwotICAgICAgICB2aXN1YWxJRD0iNTAwMiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgdGl0bGU9IldvcmtQcm9kdWN0Q29tcGFydG1lbnQiCi0gICAgICAgIGNhbkNvbGxhcHNlPSJmYWxzZSIKLSAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiCi0gICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIj4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgIDwvY29tcGFydG1lbnRzPgotICAgIDxwYWxldHRlPgotICAgICAgPGdyb3VwcwotICAgICAgICAgIHRpdGxlPSJOb2RlcyIKLSAgICAgICAgICBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJSb2xlTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFJvbGVOb2RlIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iUm9sZVRhc2tDb21wb3NpdGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBSb2xlVGFza0NvbXBvc2l0ZSIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IlRhc2tOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgVGFza05vZGUiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgV29ya1Byb2R1Y05vZGUiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJXb3JrUHJvZHVjdENvbXBvc2l0ZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSIvPgotICAgICAgPC9ncm91cHM+Ci0gICAgICA8Z3JvdXBzCi0gICAgICAgICAgdGl0bGU9IkxpbmtzIgotICAgICAgICAgIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkxpbmsiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBsaW5rIgotICAgICAgICAgICAgZ2VuTGlua3M9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiLz4KLSAgICAgIDwvZ3JvdXBzPgotICAgIDwvcGFsZXR0ZT4KLSAgPC9kaWFncmFtPgotICA8cGx1Z2luCi0gICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkIgotICAgICAgbmFtZT0iQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gUGx1Z2luIgotICAgICAgcHJvdmlkZXI9IkVQRiIKLSAgICAgIHZlcnNpb249IjEuMi4wLnF1YWxpZmllciIKLSAgICAgIHByaW50aW5nRW5hYmxlZD0idHJ1ZSIKLSAgICAgIGFjdGl2YXRvckNsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luIi8+Ci0gIDxlZGl0b3IKLSAgICAgIGNsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yIgotICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcklEIi8+Ci0gIDxkb21haW5HZW5Nb2RlbAotICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvIi8+Ci08L2dtZmdlbjpHZW5FZGl0b3JHZW5lcmF0b3I+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvZGlhZ3JhbS5lY29yZSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9kaWFncmFtLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmU3OGI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9kaWFncmFtLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0ibW9kZWwiCi0gICAgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtIiBlU3VwZXJUeXBlcz0iIy8vTm9kZUNvbnRhaW5lciIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxpbmsiIGVTdXBlclR5cGVzPSIjLy9MaW5rZWRPYmplY3QiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzb3VyY2UiIGVUeXBlPSIjLy9Ob2RlIgotICAgICAgICBlT3Bwb3NpdGU9IiMvL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXJnZXQiIGVUeXBlPSIjLy9Ob2RlIgotICAgICAgICBlT3Bwb3NpdGU9IiMvL05vZGUvaW5jb21pbmdDb25uZWN0aW9ucyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiZW5kcG9pbnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Fic29sdXRlQmVuZHBvaW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNvdXJjZUVuZFBvaW50IiBlVHlwZT0iIy8vUG9pbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFyZ2V0RW5kUG9pbnQiIGVUeXBlPSIjLy9Qb2ludCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMaW5rZWRPYmplY3QiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib2JqZWN0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSmF2YU9iamVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOYW1lZE5vZGUiIGVTdXBlclR5cGVzPSIjLy9Ob2RlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOb2RlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0xpbmtlZE9iamVjdCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvY2F0aW9uIiBlVHlwZT0iIy8vUG9pbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id2lkdGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Ii0xIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhlaWdodCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iLTEiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5jb21pbmdDb25uZWN0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9MaW5rIiBlT3Bwb3NpdGU9IiMvL0xpbmsvdGFyZ2V0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGdvaW5nQ29ubmVjdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTGluayIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgZU9wcG9zaXRlPSIjLy9MaW5rL3NvdXJjZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWFkT25seSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWN0aXZpdHlEaWFncmFtIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlR5cGVkTm9kZSIgZVN1cGVyVHlwZXM9IiMvL05vZGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0iIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3ROb2RlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWROb2RlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW0iIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTm9kZUNvbnRhaW5lciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Ob2RlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibm9kZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTm9kZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlTm9kZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkTm9kZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVUYXNrQ29tcG9zaXRlIiBlU3VwZXJUeXBlcz0iIy8vTm9kZUNvbnRhaW5lciIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2tOb2RlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWROb2RlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkTm9kZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkTm9kZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlIiBlU3VwZXJUeXBlcz0iIy8vTm9kZUNvbnRhaW5lciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQWJzb2x1dGVCZW5kcG9pbnQiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJQb2ludCIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlJvbGVEZXNjcmlwdG9yIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciIvPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU4YzExZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU1RBUlQgTk8gVFJBTlNMQVRJT04KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcmVmZXJlbmNlcy5nZW5lcmFsPUFERCBEaWFncmFtCi1wcmVmZXJlbmNlcy5hcHBlYXJhbmNlPUFwcGVhcmFuY2UKLXByZWZlcmVuY2VzLmNvbm5lY3Rpb25zPUNvbm5lY3Rpb25zCi1wcmVmZXJlbmNlcy5wcmludGluZz1QcmludGluZwotcHJlZmVyZW5jZXMucnVsZXJzQW5kR3JpZD1SdWxlcnMgJiBHcmlkCi1wcmVmZXJlbmNlcy5wYXRobWFwcz1QYXRoIE1hcHMKLQotZWRpdG9yTmFtZT1BREQgRGlhZ3JhbSBFZGl0b3IKLW5ld1dpemFyZE5hbWU9QUREIERpYWdyYW0KLW5ld1dpemFyZERlc2M9Q3JlYXRlcyBBREQgZGlhZ3JhbS4KLQotaW5pdERpYWdyYW1BY3Rpb25MYWJlbD1Jbml0aWFsaXplIGFkZCBkaWFncmFtIGZpbGUKLWxvYWRSZXNvdXJjZUFjdGlvbkxhYmVsPUxvYWQgUmVzb3VyY2UuLi4KLQotbmF2aWdhdG9yQ29udGVudE5hbWU9Ki5hZGQgZGlhZ3JhbSBjb250ZW50cwotCi1tZXRhdHlwZS5uYW1lLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV83OT1VbmRlZmluZWQKLW1ldGF0eXBlLm5hbWUuUm9sZVRhc2tDb21wb3NpdGVfMTAwMT1Sb2xlVGFza0NvbXBvc2l0ZQotbWV0YXR5cGUubmFtZS5Xb3JrUHJvZHVjdENvbXBvc2l0ZV8xMDAyPVdvcmtQcm9kdWN0Q29tcG9zaXRlCi1tZXRhdHlwZS5uYW1lLlJvbGVOb2RlXzIwMDE9Um9sZU5vZGUKLW1ldGF0eXBlLm5hbWUuVGFza05vZGVfMjAwMj1UYXNrTm9kZQotbWV0YXR5cGUubmFtZS5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlXzIwMDM9V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZQotbWV0YXR5cGUubmFtZS5MaW5rXzMwMDE9TGluawotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRU5EIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUVQRiBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgTmVlZCB0cmFuc2xhdGlvbgotZWxlbWVudF90eXBlX2NvbnRyb2xfZmxvdz1Db250cm9sIEZsb3cKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM1NjlkYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLSAgICAgIDxpbml0aWFsaXplciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbURpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5maWxlVHlwZXMiPgotICAgICAgPGZpbGVUeXBlcwotICAgICAgICAgdHlwZT0idGV4dCIKLSAgICAgICAgIGV4dGVuc2lvbj0iYWRkIj4KLSAgICAgIDwvZmlsZVR5cGVzPgotICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmV4dGVuc2lvbl9wYXJzZXIiPgotICAgICAgPHBhcnNlcgotICAgICAgICAgdHlwZT0iYWRkIgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnJlc291cmNlcy5HTUZSZXNvdXJjZUZhY3RvcnkiPgotICAgICAgPC9wYXJzZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0gICA8IS0tCi0gICAgIDxlZGl0b3IKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcklEIgotICAgICAgICBuYW1lPSJHTUYgQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gRWRpdG9yIgotICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9Nb2RlbERpYWdyYW1GaWxlLmdpZiIKLSAgICAgICAgZXh0ZW5zaW9ucz0iYWRkIgotICAgICAgICBkZWZhdWx0PSJ0cnVlIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yIgotICAgICAgICBtYXRjaGluZ1N0cmF0ZWd5PSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtTWF0Y2hpbmdTdHJhdGVneSIKLSAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbURpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvciI+Ci0gICAgIDwvZWRpdG9yPgotICAgLS0+Ci0gICAgIDxlZGl0b3IKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcklEIgotICAgICAgICBuYW1lPSJBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBFZGl0b3IiCi0gICAgICAgIGljb249Imljb25zL2Z1bGwvZXRvb2wxNi9BRERFZGl0b3IuZ2lmIgotICAgICAgICBleHRlbnNpb25zPSJhZGQiCi0gICAgICAgIGRlZmF1bHQ9InRydWUiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BRERpYWdyYW1FZGl0b3IiCi0gICAgICAgIG1hdGNoaW5nU3RyYXRlZ3k9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1NYXRjaGluZ1N0cmF0ZWd5IgotICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yIj4KLSAgICAgPC9lZGl0b3I+ICAgIAotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gIAkgIDx3aXphcmQKLSAgCSAgICAgbmFtZT0iQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0iCi0gIAkgICAgIGljb249Imljb25zL29iajE2L01vZGVsRGlhZ3JhbUZpbGUuZ2lmIgotICAJICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkuRXhhbXBsZXMiCi0gIAkgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtQ3JlYXRpb25XaXphcmQiCi0gIAkgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtQ3JlYXRpb25XaXphcmRJRCI+Ci0gIAkgIAkgPGRlc2NyaXB0aW9uPgotICAJICAJCUNyZWF0ZXMgQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0uCi0gIAkgIAkgPC9kZXNjcmlwdGlvbj4gIAotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4gLS0+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotICAgICAgPCEtLSA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnVpLm9iamVjdENvbnRyaWJ1dGlvbi5JRmlsZTEiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLm1vZGVsIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJJbml0aWFsaXplIGFkZCBkaWFncmFtIGZpbGUiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25JRCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAgCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9ImZhbHNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC51aS5vYmplY3RDb250cmlidXRpb24uQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQyIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtTG9hZFJlc291cmNlQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtTG9hZFJlc291cmNlQWN0aW9uSUQiCi0gICAgICAgICAgICAgICBsYWJlbD0iTG9hZCBSZXNvdXJjZS4uLiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gICAgCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLkRlbGV0ZURpYWdyYW0iCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EZWxldGVEaWFncmFtQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuRGVsZXRlRGlhZ3JhbUFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlRGVsZXRlRGlhZ3JhbV90ZXh0IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHN0YXRlPSJmYWxzZSIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJURlbGV0ZURpYWdyYW1fdGV4dCIvPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9ImZhbHNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5SZWZyZXNoRnJvbUJhc2VBY3Rpb24iCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5SZWZyZXNoRnJvbUJhc2VBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5SZWZyZXNoRnJvbUJhc2VBY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJXJlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3RhdGU9ImZhbHNlIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dCIvPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9ImZhbHNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5SZWZyZXNoQWN0aW9uIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuUmVmcmVzaEFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLlJlZnJlc2hBY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJXJlZnJlc2hfdGV4dCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBzdGF0ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVyZWZyZXNoX3RleHQiLz4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAgICAgICAgIC0tPiAgICAgICAgICAgCi0gIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuYWN0aW9uLmNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcnMiPgotICAgICAgPGNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3ciPgotICAgICAgICAgPC9Qcmlvcml0eT4KLSAgICAgICAgIDxwYXJ0Q29udHJpYnV0aW9uIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JJRCI+Ci0gICAgICAgICAgICA8cGFydEFjdGlvbiBtZW51YmFyUGF0aD0iL2ZpbGUvcHJpbnQiIGlkPSJwcmludFByZXZpZXdBY3Rpb24iPgotICAgICAgICAgICAgPC9wYXJ0QWN0aW9uPgotICAgICAgICAgPC9wYXJ0Q29udHJpYnV0aW9uPgotICAgICAgPC9jb250cmlidXRpb25JdGVtUHJvdmlkZXI+Ci0gICAgICA8Y29udHJpYnV0aW9uSXRlbVByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciIKLSAgICAgICAgICAgIGNoZWNrUGx1Z2luTG9hZGVkPSJmYWxzZSI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93Ii8+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZU5vZGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZU5vZGVOYW1lRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlRhc2tOb2RlRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlRhc2tOb2RlTmFtZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICAgICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuTGlua05hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tTW9kZWxBY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgIDwvY29udHJpYnV0aW9uSXRlbVByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5hY3Rpb24uZ2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVycyI+Ci0gICAgICA8R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlciIKLSAgICAgICAgIGlkPSJBRERQcmVzZW50YXRpb24iPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPFZpZXdJZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJkZWxldGUiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydCI+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9InNhdmUiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICA8L1ZpZXdJZD4KLSAgICAgIDwvR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyPgotICAgICAgPEdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcucmVuZGVyLnByb3ZpZGVycy5EaWFncmFtV2l0aFByaW50R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyIgotICAgICAgICAgaWQ9IkFERFByZXNlbnRhdGlvblByaW50Ij4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxWaWV3SWQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcklEIj4KLSAgICAgICAgICAgIDxFbGVtZW50VHlwZSBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ij4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0icHJpbnQiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICA8L1ZpZXdJZD4KLSAgICAgIDwvR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyPgotICAgICAgPEdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLmlkZS5wcm92aWRlcnMuRGlhZ3JhbUlERUdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlciIKLSAgICAgICAgIGlkPSJBRERQcmVzZW50YXRpb25JREUiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPFZpZXdJZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJib29rbWFyayIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgIDwvVmlld0lkPgotICAgICAgPC9HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXI+Ci0gICAgICA8IS0tCi0gICAgICA8R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZW5kZXIucHJvdmlkZXJzLkRpYWdyYW1VSVJlbmRlckdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlciIKLSAgICAgICAgICAgIGlkPSJBRERSZW5kZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPFZpZXdJZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJjdXQiLz4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0iY29weSIvPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJwYXN0ZSIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgIDwvVmlld0lkPgotICAgICAgPC9HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXI+Ci0gICAgICAtLT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudmlld1Byb3ZpZGVycyI+Ci0gICAgICA8dmlld1Byb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1WaWV3UHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPGNvbnRleHQgdmlld0NsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtIiBzZW1hbnRpY0hpbnRzPSJBREQiLz4KLSAgICAgICAgIDxjb250ZXh0IHZpZXdDbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSIgc2VtYW50aWNIaW50cz0iIi8+Ci0gICAgICAgICA8Y29udGV4dCB2aWV3Q2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2UiIHNlbWFudGljSGludHM9IiIvPgotICAgICAgPC92aWV3UHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydFByb3ZpZGVycyI+Ci0gICAgICA8ZWRpdHBhcnRQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtRWRpdFBhcnRQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICA8L2VkaXRwYXJ0UHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYWxldHRlUHJvdmlkZXJzIj4KLSAgICAgIDxwYWxldHRlUHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbVBhbGV0dGVQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8ZWRpdG9yIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JJRCIvPgotICAgICAgPC9wYWxldHRlUHJvdmlkZXI+Ci0gICAgICA8cGFsZXR0ZVByb3ZpZGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGVmYXVsdFBhbGV0dGVQcm92aWRlciI+Ci0gICAgICAgIDxQcmlvcml0eSBuYW1lPSJNZWRpdW0iLz4KLSAgICAgICAgPGVkaXRvciBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9ySUQiLz4KLSAgICAgICAgPGNvbnRyaWJ1dGlvbj4KLSAgICAgICAgICAgIDxwcmVkZWZpbmVkRW50cnkgICAgCi0gICAgICAgICAgICAJaWQ9Imdlb3NoYXBlRHJhd2VyIiAgIHBhdGg9Ii8iPgotICAgICAgICAgICAgCTxleHBhbmQgZm9yY2U9InRydWUiLz4KLSAgICAgICAgICAgICA8L3ByZWRlZmluZWRFbnRyeT4gCi0gICAgICAgIDwvY29udHJpYnV0aW9uPgotICAgICAgPC9wYWxldHRlUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLm1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXJzIj4KLSAgICAgIDxtb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1Nb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgIDwvbW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucHJvcGVydGllcy5wcm9wZXJ0aWVzUHJvdmlkZXJzIj4KLSAgICAgIDxQcm9wZXJ0aWVzUHJvdmlkZXIKLSAgICAgICAgICAgIHZlcmlmeVBsdWdpbkxvYWRlZD0iZmFsc2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtUHJvcGVydHlQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICA8L1Byb3BlcnRpZXNQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuaWNvblByb3ZpZGVycyI+Ci0gICAgICA8SWNvblByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1JY29uUHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9IkxvdyIvPgotICAgICAgPC9JY29uUHJvdmlkZXI+Ci0gICAgICA8SWNvblByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5nZW9zaGFwZXMuaW50ZXJuYWwucHJvdmlkZXJzLkdlb1NoYXBlSWNvblByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eQotICAgICAgICAgICAgICAgbmFtZT0iTWVkaXVtIj4KLSAgICAgICAgIDwvUHJpb3JpdHk+Ci0gICAgICAgICA8b2JqZWN0IGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uKSIgaWQ9Ikdlb1NoYXBlIj4KLSAgICAgICAgCSA8bWV0aG9kIG5hbWU9ImdldFR5cGUoKSIgdmFsdWU9Im92YWwsdHJpYW5nbGUscmVjdGFuZ2xlLHNoYWRvd1JlY3RhbmdsZSxyZWN0YW5nbGUzRCxyb3VuZFJlY3RhbmdsZSxoZXhhZ29uLG9jdGFnb24scGVudGFnb24sZGlhbW9uZCxjeWxpbmRlcixsaW5lIi8+Ci0JICAgICA8L29iamVjdD4KLSAgICAgICAgIDxjb250ZXh0IGVsZW1lbnRzPSJHZW9TaGFwZSI+Ci0gICAgICAgICA8L2NvbnRleHQ+Ci0gICAgICA8L0ljb25Qcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyUHJvdmlkZXJzIj4KLSAgICAgIDxQYXJzZXJQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtUGFyc2VyUHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgPC9QYXJzZXJQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVsZW1lbnRUeXBlcyI+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5BY3Rpdml0eURldGFpbERpYWdyYW1fNzkiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJBY3Rpdml0eURldGFpbERpYWdyYW0iCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5oZWxwZXJzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9Ijc5Ii8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLlJvbGVOb2RlXzIwMDEiCi0gICAgICAgICAgICAgICBuYW1lPSJSb2xlTm9kZSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IlJvbGVOb2RlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuaGVscGVycy5Sb2xlTm9kZUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjIwMDEiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuVGFza05vZGVfMjAwMiIKLSAgICAgICAgICAgICAgIG5hbWU9IlRhc2tOb2RlIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iVGFza05vZGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5oZWxwZXJzLlRhc2tOb2RlRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMjAwMiIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlXzIwMDMiCi0gICAgICAgICAgICAgICBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjIwMDMiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuUm9sZVRhc2tDb21wb3NpdGVfMTAwMSIKLSAgICAgICAgICAgICAgIG5hbWU9IlJvbGVUYXNrQ29tcG9zaXRlIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iUm9sZVRhc2tDb21wb3NpdGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5oZWxwZXJzLlJvbGVUYXNrQ29tcG9zaXRlRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAwMSIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5Xb3JrUHJvZHVjdENvbXBvc2l0ZV8xMDAyIgotICAgICAgICAgICAgICAgbmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGUiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJXb3JrUHJvZHVjdENvbXBvc2l0ZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnMuV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDAyIi8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLkxpbmtfMzAwMSIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfY29udHJvbF9mbG93IgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iTGluayIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnMuTGlua0VkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwMDEiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZWxlbWVudFR5cGVCaW5kaW5ncyI+Ci0gICAgICA8Y2xpZW50Q29udGV4dCBpZD0iQUREQ2xpZW50Q29udGV4dCI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgIDx0ZXN0Ci0gICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUuZWRpdGluZ0RvbWFpbiIKLSAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5FZGl0aW5nRG9tYWluIi8+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L2NsaWVudENvbnRleHQ+IAotICAgICAgPGJpbmRpbmcgY29udGV4dD0iQUREQ2xpZW50Q29udGV4dCI+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuQWN0aXZpdHlEZXRhaWxEaWFncmFtXzc5Ii8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuUm9sZU5vZGVfMjAwMSIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLlRhc2tOb2RlXzIwMDIiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlXzIwMDMiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5Sb2xlVGFza0NvbXBvc2l0ZV8xMDAxIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuV29ya1Byb2R1Y3RDb21wb3NpdGVfMTAwMiIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLkxpbmtfMzAwMSIvPgotICAgICAgICAgPGFkdmljZSByZWY9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5hZHZpY2Uubm90YXRpb25EZXBkZW5kZW50cyIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHBhdHRlcm49Ii4qIi8+Ci0gICAgICA8L2JpbmRpbmc+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9BRERJbWFnZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL0FEREltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDM4NWVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL0FEREltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL0NvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy9hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vL0NvbnRyaWJ1dG9yczoKLS8vSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQURESW1hZ2VzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTENMMTYgPSAiZnVsbC9lbGNsMTYvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERMQ0wxNiA9ICJmdWxsL2RsY2wxNi8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVRPT0wxNiA9ICJmdWxsL2V0b29sMTYvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERUT09MMTYgPSAiZnVsbC9kdG9vbDE2LyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9SRVNFVF9ESUFHUkFNX0xBWU9VVCA9IEVMQ0wxNiArICJyZXNldF9kaWFncmFtLmdpZiI7IC8vJE5PTi1OTFMtMSQJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfRURJVE9SID0gRVRPT0wxNiArICJBRERFZGl0b3IuZ2lmIjsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX1JFU0VUX0RJQUdSQU1fTEFZT1VUID0gRExDTDE2ICsgInJlc2V0X2RpYWdyYW0uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0VESVRPUiA9IERUT09MMTYgKyAiQURERWRpdG9yLmdpZiI7IC8vJE5PTi1OTFMtMSQJCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfUkVTRVRfRElBR1JBTV9MQVlPVVQgPSBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQlESVNBQkxFRF9JTUdfUEFUSF9SRVNFVF9ESUFHUkFNX0xBWU9VVCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfRURJVE9SID0gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9FRElUT1IpOwkJCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfUkVTRVRfRElBR1JBTV9MQVlPVVQgPSBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX1JFU0VUX0RJQUdSQU1fTEFZT1VUKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19FRElUT1IgPSBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0VESVRPUik7CQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvQWN0aXZpdHlEZXRhaWxEaWFncmFtUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9BY3Rpdml0eURldGFpbERpYWdyYW1QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI1YzdhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9BY3Rpdml0eURldGFpbERpYWdyYW1QbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkIjsJLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbVBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbVBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9EaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NWRkOTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9EaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kIGV4dGVuZHMKLQkJQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJQWRhcHRhYmxlIGVkZ2VBZGFwdG9yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQoCi0JCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIoZWRpdGluZ0RvbWFpbiwgbGFiZWwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZmZlY3RlZEZpbGVzKCkgewotCQlWaWV3IHZpZXcgPSAoVmlldykgZWRnZUFkYXB0b3IuZ2V0QWRhcHRlcihWaWV3LmNsYXNzKTsKLQkJaWYgKHZpZXcgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFdvcmtzcGFjZUZpbGVzKHZpZXcpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZEZpbGVzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQWRhcHRhYmxlIGdldEVkZ2VBZGFwdG9yKCkgewotCQlyZXR1cm4gZWRnZUFkYXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkZ2VBZGFwdG9yKElBZGFwdGFibGUgZWRnZUFkYXB0b3IpIHsKLQkJdGhpcy5lZGdlQWRhcHRvciA9IGVkZ2VBZGFwdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KAotCQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUgaW5mbykgewotCQlhc3NlcnQgbnVsbCAhPSBlZGdlQWRhcHRvciA6ICJOdWxsIGNoaWxkIGluIERpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCI7IC8vJE5PTi1OTFMtMSQKLQkJRWRnZSBlZGdlID0gKEVkZ2UpIGdldEVkZ2VBZGFwdG9yKCkuZ2V0QWRhcHRlcihFZGdlLmNsYXNzKTsKLQkJYXNzZXJ0IG51bGwgIT0gZWRnZSA6ICJOdWxsIGVkZ2UgaW4gRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kIjsgLy8kTk9OLU5MUy0xJAotCi0JCVZpZXcgdGVtcFZpZXcgPSBlZGdlLmdldFNvdXJjZSgpOwotCQllZGdlLnNldFNvdXJjZShlZGdlLmdldFRhcmdldCgpKTsKLQkJZWRnZS5zZXRUYXJnZXQodGVtcFZpZXcpOwotCi0JCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvTGlua0NyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvTGlua0NyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBjMDkyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL0xpbmtDcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtDcmVhdGVDb21tYW5kIGV4dGVuZHMgQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBOb2RlIG15Q29udGFpbmVyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTm9kZSBteVNvdXJjZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE5vZGUgbXlUYXJnZXQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpbmtDcmVhdGVDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxLCBOb2RlIGNvbnRhaW5lciwKLQkJCU5vZGUgc291cmNlLCBOb2RlIHRhcmdldCkgewotCQlzdXBlcihyZXEpOwotCQlzdXBlci5zZXRFbGVtZW50VG9FZGl0KGNvbnRhaW5lcik7Ci0JCW15Q29udGFpbmVyID0gY29udGFpbmVyOwotCQlteVNvdXJjZSA9IHNvdXJjZTsKLQkJbXlUYXJnZXQgPSB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb2RlIGdldENvbnRhaW5lcigpIHsKLQkJcmV0dXJuIG15Q29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRTb3VyY2UoKSB7Ci0JCXJldHVybiBteVNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gbXlUYXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEVsZW1lbnRUb0VkaXQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCUxpbmsgbmV3RWxlbWVudCA9IChMaW5rKSBzdXBlci5kb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKTsKLQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJbmV3RWxlbWVudC5zZXRUYXJnZXQobXlUYXJnZXQpOwotCQkJbmV3RWxlbWVudC5zZXRTb3VyY2UobXlTb3VyY2UpOwotCQl9Ci0JCXJldHVybiBuZXdFbGVtZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9MaW5rUmVvcmllbnRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL0xpbmtSZW9yaWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhYTMxMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL0xpbmtSZW9yaWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua1Jlb3JpZW50Q29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgcmVvcmllbnREaXJlY3Rpb247Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBFT2JqZWN0IG9sZEVuZDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIEVPYmplY3QgbmV3RW5kOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaW5rUmVvcmllbnRDb21tYW5kKFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXN1cGVyKHJlcXVlc3QuZ2V0TGFiZWwoKSwgcmVxdWVzdC5nZXRSZWxhdGlvbnNoaXAoKSwgcmVxdWVzdCk7Ci0JCXJlb3JpZW50RGlyZWN0aW9uID0gcmVxdWVzdC5nZXREaXJlY3Rpb24oKTsKLQkJb2xkRW5kID0gcmVxdWVzdC5nZXRPbGRSZWxhdGlvbnNoaXBFbmQoKTsKLQkJbmV3RW5kID0gcmVxdWVzdC5nZXROZXdSZWxhdGlvbnNoaXBFbmQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJaWYgKCEoZ2V0RWxlbWVudFRvRWRpdCgpIGluc3RhbmNlb2YgTGluaykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAocmVvcmllbnREaXJlY3Rpb24gPT0gUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0LlJFT1JJRU5UX1NPVVJDRSkgewotCQkJcmV0dXJuIGNhblJlb3JpZW50U291cmNlKCk7Ci0JCX0KLQkJaWYgKHJlb3JpZW50RGlyZWN0aW9uID09IFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdC5SRU9SSUVOVF9UQVJHRVQpIHsKLQkJCXJldHVybiBjYW5SZW9yaWVudFRhcmdldCgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuUmVvcmllbnRTb3VyY2UoKSB7Ci0JCWlmICghKG9sZEVuZCBpbnN0YW5jZW9mIE5vZGUgJiYgbmV3RW5kIGluc3RhbmNlb2YgTm9kZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlOb2RlIHRhcmdldCA9IGdldExpbmsoKS5nZXRUYXJnZXQoKTsKLQkJaWYgKCEoZ2V0TGluaygpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIE5vZGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZ2V0TGluaygpLmVDb250YWluZXIoKTsKLQkJcmV0dXJuIERpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuRXhpc3RMaW5rXzMwMDEoY29udGFpbmVyLCBnZXROZXdTb3VyY2UoKSwgdGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuUmVvcmllbnRUYXJnZXQoKSB7Ci0JCWlmICghKG9sZEVuZCBpbnN0YW5jZW9mIE5vZGUgJiYgbmV3RW5kIGluc3RhbmNlb2YgTm9kZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlOb2RlIHNvdXJjZSA9IGdldExpbmsoKS5nZXRTb3VyY2UoKTsKLQkJaWYgKCEoZ2V0TGluaygpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIE5vZGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZ2V0TGluaygpLmVDb250YWluZXIoKTsKLQkJcmV0dXJuIERpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuRXhpc3RMaW5rXzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIGdldE5ld1RhcmdldCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlpZiAoIWNhbkV4ZWN1dGUoKSkgewotCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigKLQkJCQkJIkludmFsaWQgYXJndW1lbnRzIGluIHJlb3JpZW50IGxpbmsgY29tbWFuZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHJlb3JpZW50RGlyZWN0aW9uID09IFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdC5SRU9SSUVOVF9TT1VSQ0UpIHsKLQkJCXJldHVybiByZW9yaWVudFNvdXJjZSgpOwotCQl9Ci0JCWlmIChyZW9yaWVudERpcmVjdGlvbiA9PSBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QuUkVPUklFTlRfVEFSR0VUKSB7Ci0JCQlyZXR1cm4gcmVvcmllbnRUYXJnZXQoKTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IHJlb3JpZW50U291cmNlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWdldExpbmsoKS5zZXRTb3VyY2UoZ2V0TmV3U291cmNlKCkpOwotCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoZ2V0TGluaygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgcmVvcmllbnRUYXJnZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJZ2V0TGluaygpLnNldFRhcmdldChnZXROZXdUYXJnZXQoKSk7Ci0JCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChnZXRMaW5rKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGluayBnZXRMaW5rKCkgewotCQlyZXR1cm4gKExpbmspIGdldEVsZW1lbnRUb0VkaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgZ2V0T2xkU291cmNlKCkgewotCQlyZXR1cm4gKE5vZGUpIG9sZEVuZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgZ2V0TmV3U291cmNlKCkgewotCQlyZXR1cm4gKE5vZGUpIG5ld0VuZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgZ2V0T2xkVGFyZ2V0KCkgewotCQlyZXR1cm4gKE5vZGUpIG9sZEVuZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgZ2V0TmV3VGFyZ2V0KCkgewotCQlyZXR1cm4gKE5vZGUpIG5ld0VuZDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL1JvbGVOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9Sb2xlTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM3MmU2Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL1JvbGVOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZU5vZGVDcmVhdGVDb21tYW5kIGV4dGVuZHMgQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlTm9kZUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXN1cGVyKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCS5nZXRDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvUm9sZVRhc2tDb21wb3NpdGVDcmVhdGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL1JvbGVUYXNrQ29tcG9zaXRlQ3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjkwOWE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvUm9sZVRhc2tDb21wb3NpdGVDcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZUNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVUYXNrQ29tcG9zaXRlQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJc3VwZXIocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJLmdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9UYXNrTm9kZUNyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvVGFza05vZGVDcmVhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMmM5NTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9UYXNrTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tOb2RlQ3JlYXRlQ29tbWFuZCBleHRlbmRzIENyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFza05vZGVDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlzdXBlcihyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL1dvcmtQcm9kdWN0Q29tcG9zaXRlQ3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZUNyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM2N2U2Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL1dvcmtQcm9kdWN0Q29tcG9zaXRlQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVDcmVhdGVDb21tYW5kIGV4dGVuZHMgQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdENvbXBvc2l0ZUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXN1cGVyKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCS5nZXRDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUNyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E1MzVkMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVDcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQ3JlYXRlQ29tbWFuZCBleHRlbmRzCi0JCUNyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXN1cGVyKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCS5nZXRDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGUxZmJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRIZWxwZXIgZXh0ZW5kcyBEaWFncmFtQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9EaWFncmFtQmFzZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9EaWFncmFtQmFzZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI5MWRiZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvRGlhZ3JhbUJhc2VFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5oZWxwZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21wb3NpdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5lZGl0aGVscGVyLkFic3RyYWN0RWRpdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuSUVkaXRDb21tYW5kUmVxdWVzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQmFzZUVkaXRIZWxwZXIgZXh0ZW5kcyBBYnN0cmFjdEVkaXRIZWxwZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfUE9MSUNZX0NPTU1BTkQgPSAiZWRpdCBwb2xpY3kgY29tbWFuZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0SW5zdGVhZENvbW1hbmQoSUVkaXRDb21tYW5kUmVxdWVzdCByZXEpIHsKLQkJSUNvbW1hbmQgZXBDb21tYW5kID0gKElDb21tYW5kKSByZXEuZ2V0UGFyYW1ldGVyKEVESVRfUE9MSUNZX0NPTU1BTkQpOwotCQlyZXEuc2V0UGFyYW1ldGVyKEVESVRfUE9MSUNZX0NPTU1BTkQsIG51bGwpOwotCQlJQ29tbWFuZCBlaENvbW1hbmQgPSBzdXBlci5nZXRJbnN0ZWFkQ29tbWFuZChyZXEpOwotCQlpZiAoZXBDb21tYW5kID09IG51bGwpIHsKLQkJCXJldHVybiBlaENvbW1hbmQ7Ci0JCX0KLQkJaWYgKGVoQ29tbWFuZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZXBDb21tYW5kOwotCQl9Ci0JCUNvbXBvc2l0ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBDb21wb3NpdGVDb21tYW5kKG51bGwpOwotCQljb21tYW5kLmFkZChlcENvbW1hbmQpOwotCQljb21tYW5kLmFkZChlaENvbW1hbmQpOwotCQlyZXR1cm4gY29tbWFuZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXREZXN0cm95UmVmZXJlbmNlQ29tbWFuZChEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9MaW5rRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL0xpbmtFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMTc3YzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL0xpbmtFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtFZGl0SGVscGVyIGV4dGVuZHMgRGlhZ3JhbUJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvUm9sZU5vZGVFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvUm9sZU5vZGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZWU2MmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL1JvbGVOb2RlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlTm9kZUVkaXRIZWxwZXIgZXh0ZW5kcyBEaWFncmFtQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9Sb2xlVGFza0NvbXBvc2l0ZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9Sb2xlVGFza0NvbXBvc2l0ZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY2MjNlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvUm9sZVRhc2tDb21wb3NpdGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlRWRpdEhlbHBlciBleHRlbmRzIERpYWdyYW1CYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL1Rhc2tOb2RlRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL1Rhc2tOb2RlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzdiNDQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9UYXNrTm9kZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza05vZGVFZGl0SGVscGVyIGV4dGVuZHMgRGlhZ3JhbUJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZDM1NTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL1dvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRIZWxwZXIgZXh0ZW5kcyBEaWFncmFtQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NDY3MzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0SGVscGVyIGV4dGVuZHMgRGlhZ3JhbUJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMWI5NjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eURldGFpbERpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5JRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5UeFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS51dGlsLk1lYXN1cmVtZW50VW5pdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkubWFwbW9kZS5JTWFwTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKiBAbW9kaWZpZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGV4dGVuZHMgRGlhZ3JhbUVkaXRQYXJ0IHsKLQotCVBvaW50IGNhY2hlZFBvaW50ID0gbmV3IFBvaW50KC0xLCAtMSk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOwotCi0Jc3RhdGljIGludCBjYWNoZWRXaWR0aCA9IDEwOwotCi0Jc3RhdGljIGludCBjYWNoZWRIZWlnaHQgPSAxMDsKLQotCWludCB5ID0gNjA7Ci0KLQlib29sZWFuIHhheGlzYmVnaW4gPSBmYWxzZTsKLQotCWJvb2xlYW4gbG9hZGluZyA9IHRydWU7Ci0KLQlmaW5hbCBzdGF0aWMgaW50IHNwYWNpbmcgPSA0MDsKLQotCWZpbmFsIHN0YXRpYyBpbnQgeXNwYWNpbmcgPSAyMDsKLQotCWJvb2xlYW4gbWlzY2VsbGFuZW91cyA9IGZhbHNlOwotCi0JaW50IHggPSAxMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVFMgPSAib3V0cHV0cyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUUyA9ICJpbnB1dHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIExpc3Q8RWRpdFBhcnQ+IHJlY2VudGx5QWRkZWRQYXJ0cyA9IG5ldyBBcnJheUxpc3Q8RWRpdFBhcnQ+KCk7Ci0KLQlwcml2YXRlIElNYXBNb2RlIG1hcE1vZGU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVMX0lEID0gIkFERCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3OTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCQkKLQkJbWFwTW9kZSA9IE1lYXN1cmVtZW50VW5pdEhlbHBlci5nZXRNYXBNb2RlKHZpZXcuZ2V0RGlhZ3JhbSgpLmdldE1lYXN1cmVtZW50VW5pdCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBWaWV3IGdldFZpZXcoKSB7Ci0JCXJldHVybiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRvTGF5b3V0KCkgewotCQlFZGl0UGFydFZpZXdlciB2aWV3ZXIgPSBnZXRWaWV3ZXIoKTsKLQkJaWYodmlld2VyIGluc3RhbmNlb2YgSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyKSB7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSAoKElEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlcil2aWV3ZXIpLmdldEVkaXRvcigpOwotCQkJaWYoZWRpdG9yIGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKSB7Ci0JCQkJKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpZWRpdG9yKS5yZXNldExheW91dCgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydCNjcmVhdGVGaWd1cmUoKQotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJRmlndXJlIGYgPSBuZXcgRnJlZWZvcm1MYXllcigpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGxheW91dCgpIHsKLQkJCQlpZiAoaGFzTWlzcGxhY2VkQ2hpbGRyZW4oKSkgewotCQkJCQlyZXNldENoaWxkcmVuTG9jYXRpb25zKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzdXBlci5sYXlvdXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJZi5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigyMCkpOwotCQlmLnNldExheW91dE1hbmFnZXIobmV3IEZyZWVmb3JtTGF5b3V0KCkpOwotCi0JCXJldHVybiBmOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgbWlzcGxhY2VkIGNoaWxkcmVuCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc01pc3BsYWNlZENoaWxkcmVuKCkgewotCQlMaXN0IGxvY2F0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBFZGl0UGFydCkgewotCQkJCU9iamVjdCBtb2RlbCA9ICgoRWRpdFBhcnQpIGNoaWxkKS5nZXRNb2RlbCgpOwotCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIG1vZGVsOwotCQkJCQlMb2NhdGlvbiBwID0gKExvY2F0aW9uKSBub2RlLmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJCQkJbG9jYXRpb25MaXN0LmFkZChwKTsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vZGUtIiArIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImxvYy0iICsgcCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAobG9jYXRpb25MaXN0LnNpemUoKSA9PSAxKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobG9jYXRpb25MaXN0LnNpemUoKSA+IDApIHsKLQkJCWJvb2xlYW4gbmVlZFRvUmVzZXQgPSB0cnVlOwotCi0JCQlmb3IgKGludCBpID0gMTsgaSA8IGxvY2F0aW9uTGlzdC5zaXplKCk7IGkrKykgewotCQkJCUxvY2F0aW9uIGN1cnJlbnRMb2MgPSAoTG9jYXRpb24pIGxvY2F0aW9uTGlzdC5nZXQoaSk7Ci0JCQkJTG9jYXRpb24gcHJldmlvdXNMb2MgPSAoTG9jYXRpb24pIGxvY2F0aW9uTGlzdC5nZXQoaSAtIDEpOwotCQkJCWlmICghKChjdXJyZW50TG9jLmdldFgoKSA9PSBwcmV2aW91c0xvYy5nZXRYKCkgKyAxMCkgJiYgKGN1cnJlbnRMb2MKLQkJCQkJCS5nZXRZKCkgPT0gcHJldmlvdXNMb2MuZ2V0WSgpICsgMTApKSkgewotCQkJCQluZWVkVG9SZXNldCA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmVlZFRvUmVzZXQ7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJlc2V0IGFsbCBjaGlsZHJlbiBsb2NhdGlvbnMKLQkgKiBJbiB0aGlzLCBBbGwgdGhlIFRhc2sncyBNYW5kYXRvcnlJbnB1dCB3b3JrcHJvZHVjdHMgcGxhY2VkIG9uIHRvcCBhbmQgUm9sZVRhc2sgCi0JICogY29tcG9zaXRlIGluIHRoZSBtaWRkbGUuIGFuZCBUYXNrJ3Mgb3V0cHV0IHdvcmtwcm9kdWN0cyBib3R0b20uCi0JICogCi0JICogVE9ETyAtIEhhdmUgdG8gcmV2aXNpdCB0aGlzIG1ldGhvZCBhbmQgZG8gc29tZSBjbGVhbnVwCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXRDaGlsZHJlbkxvY2F0aW9ucygpIHsKLQotCQlmaW5hbCBpbnQgeXNwYWNpbmcgPSA0MDsKLQkJTGlzdCByb2xlY29tcG9zaXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBpbnB1dHdvcmtwcm9kdWN0Q29tcG9zaXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBvdXRwdXRXb3JrUHJvZHVjdENvbXBvc2l0ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgbWlzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgdGFza0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRoaXMucmVjZW50bHlBZGRlZFBhcnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vCQlIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJTm9kZSBuID0gKE5vZGUpICgoRWRpdFBhcnQpIGNoaWxkKS5nZXRNb2RlbCgpOwotCQkJLy8JCQlpZiAobi5nZXRMb2NhdGlvbigpID09IG51bGwgfHwgbi5nZXRMb2NhdGlvbigpLnggPT0gLTEpIHsKLQkJCXRoaXMucmVjZW50bHlBZGRlZFBhcnRzLmFkZCgoRWRpdFBhcnQpIGNoaWxkKTsKLQkJCS8vCQkJfQotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgewotCQkJCXJvbGVjb21wb3NpdGVMaXN0LmFkZChjaGlsZCk7Ci0KLQkJCQlMaXN0IGxpc3QgPSAoKFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpIGNoaWxkKS5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCVZpZXcgdmlld09iaiA9IChWaWV3KSAoKE5vZGVFZGl0UGFydCkgb2JqKS5nZXRNb2RlbCgpOwotCQkJCQkJT2JqZWN0IG8gPSB2aWV3T2JqLmdldEVsZW1lbnQoKTsKLQkJCQkJCWlmIChvIGluc3RhbmNlb2YgVGFza05vZGUpIHsKLQkJCQkJCQl0YXNrTGlzdC5hZGQobyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQkJV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCBwYXJ0ID0gKFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIGNoaWxkOwotCQkJCVZpZXcgdmlld09iaiA9IChWaWV3KSAoKE5vZGVFZGl0UGFydCkgcGFydCkuZ2V0TW9kZWwoKTsKLQkJCQlPYmplY3QgbyA9IHZpZXdPYmouZ2V0RWxlbWVudCgpOwotCi0JCQkJaWYgKG8gaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZSkgewotCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSBub2RlID0gKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSBvOwotCQkJCQlpZiAobm9kZS5nZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuSU5QVVRTKSB7Ci0JCQkJCQlpbnB1dHdvcmtwcm9kdWN0Q29tcG9zaXRlTGlzdC5hZGQoY2hpbGQpOwotCQkJCQl9IGVsc2UgaWYgKG5vZGUuZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLk9VVFBVVFMpIHsKLQkJCQkJCW91dHB1dFdvcmtQcm9kdWN0Q29tcG9zaXRlTGlzdC5hZGQoY2hpbGQpOwotCQkJCQl9Ci0JCQkJCS8vCQkJCQljYWxjU2l6ZShjaGlsZCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQltaXNjTGlzdC5hZGQoY2hpbGQpOwotCQkJfQotCQl9Ci0KLQkJLy8gU2V0IHNpemUgZm9yIHRoZSByb2xlY29tcG9zaXRlLgotCQlpZiAoIXJvbGVjb21wb3NpdGVMaXN0LmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gcm9sZWNvbXBvc2l0ZUxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0b3IubmV4dCgpOwotCQkJCUxpc3QgbGlzdCA9ICgoUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgb2JqZWN0KS5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRvcjEgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IxLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0b3IxLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGVFZGl0UGFydCkgewotCQkJCQkJVmlldyB2aWV3T2JqID0gKFZpZXcpICgoTm9kZUVkaXRQYXJ0KSBvYmopLmdldE1vZGVsKCk7Ci0JCQkJCQlPYmplY3Qgb2JqTm9kZSA9IHZpZXdPYmouZ2V0RWxlbWVudCgpOwotCQkJCQkJaWYgKG9iak5vZGUgaW5zdGFuY2VvZiBUYXNrTm9kZSkgewotCQkJCQkJCVRhc2tOb2RlIHRhc2tOb2RlID0gKFRhc2tOb2RlKSBvYmpOb2RlOwotCi0JCQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFzayA9IChUYXNrRGVzY3JpcHRvcikgdGFza05vZGUKLQkJCQkJCQkJCS5nZXRPYmplY3QoKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIHdwaXRvciA9IGlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCQkuaXRlcmF0b3IoKTsgd3BpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCB3cEVkaXRQYXJ0ID0gKFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIHdwaXRvcgotCQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdwQ29tcG9zaXRlTm9kZSA9IChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgKChWaWV3KSB3cEVkaXRQYXJ0Ci0JCQkJCQkJCQkJLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJCQkJCQkJT2JqZWN0IHdwT2JqZWN0ID0gd3BDb21wb3NpdGVOb2RlLmdldE9iamVjdCgpOwotCQkJCQkJCQlpZiAod3BPYmplY3QgIT0gbnVsbCAmJiB3cE9iamVjdC5lcXVhbHModGFzaykpIHsKLQkJCQkJCQkJCWludCB3aWR0aCA9IHdwRWRpdFBhcnQuZ2V0RmlndXJlKCkKLQkJCQkJCQkJCQkJLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJCQkJCWludCBoZWlnaHQgPSAoKE5vZGVFZGl0UGFydCkgb2JqKQotCQkJCQkJCQkJCQkuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCQkJCQkJCSgoTm9kZUVkaXRQYXJ0KSBvYmopCi0JCQkJCQkJCQkJCS5nZXRGaWd1cmUoKQotCQkJCQkJCQkJCQkuc2V0UHJlZmVycmVkU2l6ZSgKLQkJCQkJCQkJCQkJCQluZXcgRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpKTsKLQkJCQkJCQkJCWlmICgoKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSAoKFZpZXcpIHdwRWRpdFBhcnQKLQkJCQkJCQkJCQkJLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKSkKLQkJCQkJCQkJCQkJLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpIHsKLQkJCQkJCQkJCQkvLwkJCQkJCQkJCQlMaXN0IGlucHV0TGlzdCA9IChMaXN0KSAoKEhhc2hNYXApIG1hcAotCQkJCQkJCQkJCS8vCQkJCQkJCQkJCQkJLmdldCh0YXNrTm9kZSkpLmdldChJTlBVVFMpOwotCQkJCQkJCQkJCS8vCQkJCQkJCQkJCWlucHV0TGlzdC5hZGQod3BFZGl0UGFydCk7Ci0JCQkJCQkJCQl9IGVsc2UgaWYgKCgoV29ya1Byb2R1Y3RDb21wb3NpdGUpICgoVmlldykgd3BFZGl0UGFydAotCQkJCQkJCQkJCQkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpKQotCQkJCQkJCQkJCQkuZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLk9VVFBVVFMpIHsKLQkJCQkJCQkJCQkvLwkJCQkJCQkJCQlMaXN0IG91dHB1dExpc3QgPSAoTGlzdCkgKChIYXNoTWFwKSBtYXAKLQkJCQkJCQkJCQkvLwkJCQkJCQkJCQkJCS5nZXQodGFza05vZGUpKS5nZXQoT1VUUFVUUyk7Ci0JCQkJCQkJCQkJLy8JCQkJCQkJCQkJb3V0cHV0TGlzdC5hZGQod3BFZGl0UGFydCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIXJvbGVjb21wb3NpdGVMaXN0LmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb2xlY29tcG9zaXRlTGlzdC5zaXplKCk7IGkrKykgewotCQkJCUxpc3QgY29uZmlybWVkU2VxSW5wdXRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUxpc3QgY29uZmlybWVkU2VxT3V0cHV0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlMaXN0IGxpc3QgPSAoKFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpIHJvbGVjb21wb3NpdGVMaXN0Ci0JCQkJCQkuZ2V0KGkpKS5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbGlzdC5zaXplKCk7IGorKykgewotCQkJCQlPYmplY3QgbyA9IGxpc3QuZ2V0KGopOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIE5vZGVFZGl0UGFydCkgewotCQkJCQkJTm9kZUVkaXRQYXJ0IHRhc2sgPSAoTm9kZUVkaXRQYXJ0KSBsaXN0LmdldChqKTsKLQkJCQkJCWlmICgoKFZpZXcpIHRhc2suZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgVGFza05vZGUpIHsKLQkJCQkJCQlUYXNrTm9kZSB0YXNrbm9kZSA9IChUYXNrTm9kZSkgKChWaWV3KSB0YXNrCi0JCQkJCQkJCQkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgaW5wdXR3b3JrcHJvZHVjdENvbXBvc2l0ZUxpc3QKLQkJCQkJCQkJCS5zaXplKCk7IGsrKykgewotCQkJCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSB3cGNvbXAgPSAoV29ya1Byb2R1Y3RDb21wb3NpdGUpICgoVmlldykgKChXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSBpbnB1dHdvcmtwcm9kdWN0Q29tcG9zaXRlTGlzdAotCQkJCQkJCQkJCS5nZXQoaykpLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQotCQkJCQkJCQlpZiAod3Bjb21wICE9IG51bGwgJiYgd3Bjb21wLmdldE9iamVjdCgpLmVxdWFscygKLQkJCQkJCQkJCQl0YXNrbm9kZS5nZXRPYmplY3QoKSkpIHsKLQkJCQkJCQkJCWlmICh3cGNvbXAuZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLklOUFVUUykgewotCQkJCQkJCQkJCWNvbmZpcm1lZFNlcUlucHV0TGlzdAotCQkJCQkJCQkJCQkJLmFkZChpbnB1dHdvcmtwcm9kdWN0Q29tcG9zaXRlTGlzdAotCQkJCQkJCQkJCQkJCQkuZ2V0KGspKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlmb3IgKGludCBrID0gMDsgayA8IG91dHB1dFdvcmtQcm9kdWN0Q29tcG9zaXRlTGlzdAotCQkJCQkJCQkJLnNpemUoKTsgaysrKSB7Ci0JCQkJCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdwY29tcCA9IChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgKChWaWV3KSAoKFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIG91dHB1dFdvcmtQcm9kdWN0Q29tcG9zaXRlTGlzdAotCQkJCQkJCQkJCS5nZXQoaykpLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQotCQkJCQkJCQlpZiAod3Bjb21wLmdldE9iamVjdCgpLmVxdWFscygKLQkJCQkJCQkJCQl0YXNrbm9kZS5nZXRPYmplY3QoKSkpIHsKLQkJCQkJCQkJCWlmICh3cGNvbXAuZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLk9VVFBVVFMpIHsKLQkJCQkJCQkJCQljb25maXJtZWRTZXFPdXRwdXRMaXN0Ci0JCQkJCQkJCQkJCQkuYWRkKG91dHB1dFdvcmtQcm9kdWN0Q29tcG9zaXRlTGlzdAotCQkJCQkJCQkJCQkJCQkuZ2V0KGspKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIWNvbmZpcm1lZFNlcUlucHV0TGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJc2V0T2JqZWN0c0xvY2F0aW9ucyhjb25maXJtZWRTZXFJbnB1dExpc3QpOwotCQkJCQl5ID0gY2FjaGVkUG9pbnQueSArIGNhY2hlZEhlaWdodCArIHlzcGFjaW5nOwotCQkJCX0KLQkJCQlMaXN0IHJvbGVDID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXJvbGVDLmFkZChyb2xlY29tcG9zaXRlTGlzdC5nZXQoaSkpOwotCQkJCXNldE9iamVjdHNMb2NhdGlvbnMocm9sZUMpOwotCi0JCQkJeSA9IGNhY2hlZFBvaW50LnkgKyBjYWNoZWRIZWlnaHQgKyB5c3BhY2luZzsKLQkJCQlpZiAoIWNvbmZpcm1lZFNlcU91dHB1dExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCXNldE9iamVjdHNMb2NhdGlvbnMoY29uZmlybWVkU2VxT3V0cHV0TGlzdCk7Ci0JCQkJCXkgPSBjYWNoZWRQb2ludC55ICsgY2FjaGVkSGVpZ2h0ICsgeXNwYWNpbmc7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQotCQkvLwkJaWYgKCFtaXNjTGlzdC5pc0VtcHR5KCkpIHsKLQkJLy8JCQlpZiAoZGVidWcpIHsKLQkJLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcmludCBTaXplIG9mIG1pc2M6ICIgKyBtaXNjTGlzdC5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCS8vCQkJfQotCQkvLwkJCWlmICghbG9hZGluZykgewotCQkvLwkJCQltaXNjZWxsYW5lb3VzID0gdHJ1ZTsKLQkJLy8JCQl9Ci0JCS8vCQkJc2V0T2JqZWN0c0xvY2F0aW9ucyhtaXNjTGlzdCk7Ci0JCS8vCQkJbWlzY2VsbGFuZW91cyA9IGZhbHNlOwotCQkvLwkJfQotCi0JCWZpbmFsIFZpZXcgdmlldyA9IGdldFZpZXcoKTsKLQkJdHJ5IHsKLQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKHZpZXcuZ2V0RGlhZ3JhbSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXZpZXcucGVyc2lzdCgpOwotCQkJCQl2aWV3LnBlcnNpc3RDaGlsZHJlbigpOwotCQkJCX0KLQkJCQkKLQkJCX0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlsb2FkaW5nID0gZmFsc2U7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEl0IHNldHMgb2JqZWN0IGxvY2F0aW9uIG9uIGNhdmFzCi0JICogQHBhcmFtIGxpc3QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0T2JqZWN0c0xvY2F0aW9ucyhMaXN0IGxpc3QpIHsKLQkJeGF4aXNiZWdpbiA9IHRydWU7Ci0JCXggPSA1MDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCQlmaW5hbCBHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZDsKLQkJCQlmaW5hbCBOb2RlIG5vZGUgPSAoTm9kZSkgcGFydC5nZXRNb2RlbCgpOwotCi0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCWZpbmFsIExvY2F0aW9uIGxvY2F0aW9uID0gKExvY2F0aW9uKSBub2RlLmdldExheW91dENvbnN0cmFpbnQoKTsKLQotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm9kZSAtICIgKyBwYXJ0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2NhdGlvbiAtICIgKyBsb2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCi0JCQkJCWlmICgheGF4aXNiZWdpbikgewotCQkJCQkJeCA9IGNhY2hlZFBvaW50LnggKyBjYWNoZWRXaWR0aCArIHNwYWNpbmc7Ci0JCQkJCX0KLQotCQkJCQlpZiAoIWxvYWRpbmcgJiYgbWlzY2VsbGFuZW91cykgewotCQkJCQkJbG9jYXRpb24uc2V0WChtYXBNb2RlLkRQdG9MUCh4KSk7Ci0JCQkJCQlsb2NhdGlvbi5zZXRZKG1hcE1vZGUuRFB0b0xQKDEwKSk7Ci0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZ2V0VmlldygpLmdldERpYWdyYW0oKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCWxvY2F0aW9uLnNldFgobWFwTW9kZS5EUHRvTFAoeCkpOwotCQkJCQkJCQkJbG9jYXRpb24uc2V0WShtYXBNb2RlLkRQdG9MUCh5KSk7Ci0KLQkJCQkJCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgewotCQkJCQkJCQkJCSgoUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgcGFydCkKLQkJCQkJCQkJCQkJCS51cGRhdGVib3VuZHMoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgewotCQkJCQkJCQkJCSgoV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgcGFydCkKLQkJCQkJCQkJCQkJCS51cGRhdGVib3VuZHMoKTsKLQkJCQkJCQkJCX0KLQotCQkJCQkJCQl9Ci0JCQkJCQkJCQotCQkJCQkJCX0pOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJfQotCi0JCQkJCQlpZiAoZGVidWcpCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJOZXdMb2NhdGlvbiAtICIgKyBsb2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkJaWYgKCFtaXNjZWxsYW5lb3VzKQotCQkJCQkJCWNhY2hlZFBvaW50ID0gbmV3IFBvaW50KGxvY2F0aW9uLmdldFgoKSwgbG9jYXRpb24KLQkJCQkJCQkJCS5nZXRZKCkpOwotCQkJCQkJY2FjaGVkV2lkdGggPSBwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJCWlmIChwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQgPiBjYWNoZWRIZWlnaHQpCi0JCQkJCQkJY2FjaGVkSGVpZ2h0ID0gcGFydC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCQkJeGF4aXNiZWdpbiA9IGZhbHNlOwotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJLy8JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS8vCQkJCQkJCQkJLnByaW50bG4oIlBvaW50IDogIiArIG5ldyBQb2ludCh4LCB5KS50b1N0cmluZygpICsgIkFuZCB3aWR0aD0iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCS8vCQkJCQkJCQkJCQkrIGNhY2hlZFdpZHRoCi0JCQkJCQkJLy8JCQkJCQkJCQkJCSsgIiwgSGVpZ2h0PSIgKyBjYWNoZWRIZWlnaHQgKyAiLCBXaWR0aCBvZiBWaWV3ZXI6ICIgKyB2aWV3ZXJXaWR0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlcyBhbmQgc2V0cyBzaXplIG9mIHRoZSBnaXZlbiBub2RlCi0JICogQHBhcmFtIGNoaWxkCi0JICogCi0JICogVE9ETyAtIE5vdCB1c2VkIGN1cnJlbnRseSwgd2UgbmVlZCB0byBzZWUgd2hldGhlciB3ZSBuZWVkIHRoaXMgbWV0aG9kCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNhbGNTaXplKE9iamVjdCBjaGlsZCkgewotCQlMaXN0IGxpc3QgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZCkuZ2V0Q2hpbGRyZW4oKTsKLQkJaW50IGxhcmdlc3RXaWR0aCA9IDA7Ci0JCWludCBsYXJnZXN0SGVpZ2h0ID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGVFZGl0UGFydCkgewotCQkJCVZpZXcgdmlld09iaiA9IChWaWV3KSAoKE5vZGVFZGl0UGFydCkgb2JqKS5nZXRNb2RlbCgpOwotCQkJCU9iamVjdCBvYmpOb2RlID0gdmlld09iai5nZXRFbGVtZW50KCk7Ci0JCQkJaWYgKG9iak5vZGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKSB7Ci0JCQkJCWludCBub2RlV2lkdGggPSAoKE5vZGVFZGl0UGFydCkgb2JqKS5nZXRGaWd1cmUoKQotCQkJCQkJCS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0JCQkJCWludCBub2RlSGVpZ2h0ID0gKChOb2RlRWRpdFBhcnQpIG9iaikuZ2V0RmlndXJlKCkKLQkJCQkJCQkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCQkJaWYgKG5vZGVXaWR0aCA+IGxhcmdlc3RXaWR0aCkKLQkJCQkJCWxhcmdlc3RXaWR0aCA9IG5vZGVXaWR0aDsKLQkJCQkJaWYgKG5vZGVIZWlnaHQgPiBsYXJnZXN0SGVpZ2h0KQotCQkJCQkJbGFyZ2VzdEhlaWdodCA9IG5vZGVIZWlnaHQ7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJKChXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSBjaGlsZCkuZ2V0RmlndXJlKCkuc2V0UHJlZmVycmVkU2l6ZSgKLQkJCQluZXcgRGltZW5zaW9uKGxhcmdlc3RXaWR0aCAqIDIgKyAxMCwgMjAgKyBsYXJnZXN0SGVpZ2h0Ci0JCQkJCQkqIChsaXN0LnNpemUoKSAvIDIgKyAxKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgcmVjZW50bHkgYWRkZGVkIGVkaXRwYXJ0cy4gVXN1YWxseSBjYWxsZWQgCi0JICogYnkgZGlhZ3JhbSBzZXJ2aWNlcyB0byBkbyBhdXRvbGF5b3V0IGFkanVzdG1lbnQuCi0JICovCi0JcHVibGljIExpc3Q8RWRpdFBhcnQ+IGdldFJlY2VudGx5QWRkZWRQYXJ0cygpIHsKLQkJcmV0dXJuIHJlY2VudGx5QWRkZWRQYXJ0czsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgcmVjZW50bHkgYWRkZWQgZWRpdHBhcnRzIGZyb20gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXJSZWNlbnRseUFkZGVkUGFydHMoKSB7Ci0JCXJlY2VudGx5QWRkZWRQYXJ0cy5jbGVhcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlpZiAoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLlZJRVdfX1ZJU0lCTEUuZXF1YWxzKGV2ZW50LmdldEZlYXR1cmUoKSkpIHsKLQkJCU9iamVjdCBub3RpZmllciA9IGV2ZW50LmdldE5vdGlmaWVyKCk7Ci0JCQlpZiAobm90aWZpZXIgPT0gZ2V0TW9kZWwoKSkKLQkJCQlyZWZyZXNoVmlzaWJpbGl0eSgpOwotCQkJZWxzZSBpZiAoZXZlbnQuZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQlyZWZyZXNoQ2hpbGRyZW4oKTsKLQkJCQlEaWFncmFtRWRpdG9yVXRpbC5yZWZyZXNoQ29ubmVjdGlvbkVkaXRQYXJ0cyh0aGlzKTsKLQkJCX0KLQkJfSBlbHNlCi0JCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQlzdXBlci5hY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLmFkZENvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotCQkJRU9iamVjdCBlID0gKChWaWV3KSBtb2RlbCkuZ2V0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSBlKS5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9EaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZjU2NzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9EaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FZGl0UGFydEZhY3RvcnkgaW1wbGVtZW50cyBFZGl0UGFydEZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpIHsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotCQkJVmlldyB2aWV3ID0gKFZpZXcpIG1vZGVsOwotCQkJc3dpdGNoIChEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KSkgewotCi0JCQljYXNlIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgUm9sZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBSb2xlTm9kZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFJvbGVOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IFJvbGVOb2RlTmFtZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFRhc2tOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgVGFza05vZGVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBUYXNrTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBUYXNrTm9kZU5hbWVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydCgKLQkJCQkJCXZpZXcpOwotCi0JCQljYXNlIExpbmtFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBMaW5rRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgTGlua05hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBMaW5rTmFtZUVkaXRQYXJ0KHZpZXcpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjcmVhdGVVbnJlY29nbml6ZWRFZGl0UGFydChjb250ZXh0LCBtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWRpdFBhcnQgY3JlYXRlVW5yZWNvZ25pemVkRWRpdFBhcnQoRWRpdFBhcnQgY29udGV4dCwgT2JqZWN0IG1vZGVsKSB7Ci0JCS8vIEhhbmRsZSBjcmVhdGlvbiBvZiB1bnJlY29nbml6ZWQgY2hpbGQgbm9kZSBFZGl0UGFydHMgaGVyZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDZWxsRWRpdG9yTG9jYXRvciBnZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IoCi0JCQlJVGV4dEF3YXJlRWRpdFBhcnQgc291cmNlKSB7Ci0JCWlmIChzb3VyY2UuZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpCi0JCQlyZXR1cm4gbmV3IFRleHRDZWxsRWRpdG9yTG9jYXRvcigoV3JhcExhYmVsKSBzb3VyY2UuZ2V0RmlndXJlKCkpOwotCQllbHNlIHsKLQkJCXJldHVybiBuZXcgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcigoTGFiZWwpIHNvdXJjZS5nZXRGaWd1cmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jc3RhdGljIHByaXZhdGUgY2xhc3MgVGV4dENlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdyYXBMYWJlbCB3cmFwTGFiZWw7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBUZXh0Q2VsbEVkaXRvckxvY2F0b3IoV3JhcExhYmVsIHdyYXBMYWJlbCkgewotCQkJdGhpcy53cmFwTGFiZWwgPSB3cmFwTGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFdyYXBMYWJlbCBnZXRXcmFwTGFiZWwoKSB7Ci0JCQlyZXR1cm4gd3JhcExhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBnZXRXcmFwTGFiZWwoKS5nZXRUZXh0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQkJZ2V0V3JhcExhYmVsKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShyZWN0KTsKLQkJCWlmIChnZXRXcmFwTGFiZWwoKS5pc1RleHRXcmFwcGVkKCkKLQkJCQkJJiYgZ2V0V3JhcExhYmVsKCkuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCkgewotCQkJCXJlY3Quc2V0U2l6ZShuZXcgRGltZW5zaW9uKHRleHQuY29tcHV0ZVNpemUocmVjdC53aWR0aCwKLQkJCQkJCVNXVC5ERUZBVUxUKSkpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnQgYXZyID0gRmlndXJlVXRpbGl0aWVzLmdldEZvbnRNZXRyaWNzKHRleHQuZ2V0Rm9udCgpKQotCQkJCQkJLmdldEF2ZXJhZ2VDaGFyV2lkdGgoKTsKLQkJCQlyZWN0LnNldFNpemUobmV3IERpbWVuc2lvbih0ZXh0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULAotCQkJCQkJU1dULkRFRkFVTFQpKS5leHBhbmQoYXZyICogMiwgMCkpOwotCQkJfQotCQkJaWYgKCFyZWN0LmVxdWFscyhuZXcgUmVjdGFuZ2xlKHRleHQuZ2V0Qm91bmRzKCkpKSkgewotCQkJCXRleHQuc2V0Qm91bmRzKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIExhYmVsIGxhYmVsOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcihMYWJlbCBsYWJlbCkgewotCQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBMYWJlbCBnZXRMYWJlbCgpIHsKLQkJCXJldHVybiBsYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZWxvY2F0ZShDZWxsRWRpdG9yIGNlbGxlZGl0b3IpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBjZWxsZWRpdG9yLmdldENvbnRyb2woKTsKLQkJCVJlY3RhbmdsZSByZWN0ID0gZ2V0TGFiZWwoKS5nZXRUZXh0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQkJZ2V0TGFiZWwoKS50cmFuc2xhdGVUb0Fic29sdXRlKHJlY3QpOwotCQkJaW50IGF2ciA9IEZpZ3VyZVV0aWxpdGllcy5nZXRGb250TWV0cmljcyh0ZXh0LmdldEZvbnQoKSkKLQkJCQkJLmdldEF2ZXJhZ2VDaGFyV2lkdGgoKTsKLQkJCXJlY3Quc2V0U2l6ZShuZXcgRGltZW5zaW9uKHRleHQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsCi0JCQkJCVNXVC5ERUZBVUxUKSkuZXhwYW5kKGF2ciAqIDIsIDApKTsKLQkJCWlmICghcmVjdC5lcXVhbHMobmV3IFJlY3RhbmdsZSh0ZXh0LmdldEJvdW5kcygpKSkpIHsKLQkJCQl0ZXh0LnNldEJvdW5kcyhyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9EaWFncmFtRXh0Tm9kZUxhYmVsRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvRGlhZ3JhbUV4dE5vZGVMYWJlbEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NzIzYTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9EaWFncmFtRXh0Tm9kZUxhYmVsRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkxhYmVsTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRXh0Tm9kZUxhYmVsRWRpdFBhcnQgZXh0ZW5kcyBMYWJlbEVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUV4dE5vZGVMYWJlbEVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaEJvdW5kcygpIHsKLQkJSUZpZ3VyZSByZWZGaWd1cmUgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuZ2V0RmlndXJlKCk7Ci0JCWludCBkeCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7Ci0JCWludCBkeSA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1koKSkpLmludFZhbHVlKCk7Ci0JCVBvaW50IG9mZnNldCA9IG5ldyBQb2ludChkeCwgZHkpOwotCQlnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5zZXRDb25zdHJhaW50KGdldEZpZ3VyZSgpLAotCQkJCW5ldyBMYWJlbExvY2F0b3IocmVmRmlndXJlLCBvZmZzZXQsIGdldEtleVBvaW50KCkpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCByZWxvY2F0ZShJRmlndXJlIHRhcmdldCkgewotCQkJCQkJUG9pbnQgbG9jYXRpb24gPSBnZXRSZWZlcmVuY2VQb2ludCgpLmdldFRyYW5zbGF0ZWQoCi0JCQkJCQkJCWdldE9mZnNldCgpKTsKLQkJCQkJCWxvY2F0aW9uLnRyYW5zbGF0ZSgtdGFyZ2V0LmdldEJvdW5kcygpLndpZHRoIC8gMiwgMCk7Ci0JCQkJCQl0YXJnZXQuc2V0TG9jYXRpb24obG9jYXRpb24pOwotCQkJCQkJdGFyZ2V0LnNldFNpemUobmV3IERpbWVuc2lvbigKLQkJCQkJCQkJdGFyZ2V0LmdldFByZWZlcnJlZFNpemUoKS53aWR0aCwgdGFyZ2V0Ci0JCQkJCQkJCQkJLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQpKTsKLQkJCQkJfQotCi0JCQkJCXByb3RlY3RlZCBQb2ludCBnZXRSZWZlcmVuY2VQb2ludCgpIHsKLQkJCQkJCXJldHVybiBnZXRMYWJlbExvY2F0aW9uKHBhcmVudCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGdldFJlZmVyZW5jZVBvaW50KCkgewotCQlyZXR1cm4gZ2V0TGFiZWxMb2NhdGlvbigoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuZ2V0RmlndXJlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0TGFiZWxMb2NhdGlvbihJRmlndXJlIHBhcmVudCkgewotCQlyZXR1cm4gcGFyZW50LmdldEJvdW5kcygpLmdldEJvdHRvbSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvTGlua0VkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL0xpbmtFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGJhMmI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvTGlua0VkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLlBvbHlsaW5lQ29ubmVjdGlvbkV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5MaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db25uZWN0aW9uTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rRWRpdFBhcnQgZXh0ZW5kcyBDb25uZWN0aW9uTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaW5rRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBMaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uRmlndXJlKCkgewotCi0JCXJldHVybiBuZXcgTGlua0ZpZ3VyZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTGlua0ZpZ3VyZSBleHRlbmRzIFBvbHlsaW5lQ29ubmVjdGlvbkV4IHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIExpbmtGaWd1cmUoKSB7Ci0JCQl0aGlzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjawotCi0JCQkpOwotCQkJc2V0VGFyZ2V0RGVjb3JhdGlvbihjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgUG9seWxpbmVEZWNvcmF0aW9uIGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSB7Ci0JCQlQb2x5bGluZURlY29yYXRpb24gZGYgPSBuZXcgUG9seWxpbmVEZWNvcmF0aW9uKCk7Ci0JCQkvLyBkaXNwYXRjaE5leHQ/Ci0KLQkJCVBvaW50TGlzdCBwbCA9IG5ldyBQb2ludExpc3QoKTsKLQkJCXBsLmFkZFBvaW50KC0xLCAxKTsKLQkJCXBsLmFkZFBvaW50KDAsIDApOwotCQkJcGwuYWRkUG9pbnQoLTEsIC0xKTsKLQkJCWRmLnNldFRlbXBsYXRlKHBsKTsKLQkJCWRmLnNldFNjYWxlKGdldE1hcE1vZGUoKS5EUHRvTFAoNyksIGdldE1hcE1vZGUoKS5EUHRvTFAoMykpOwotCi0JCQlyZXR1cm4gZGY7Ci0JCX0KLQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgewotCQlDb2xvciBvdmVycmlkZUNvbG9yID0gRGlhZ3JhbUNvcmVVdGlsLmdldExpbmtPdmVycmlkZUNvbG9yKChFZGdlKSBnZXRNb2RlbCgpKTsKLQkJc3VwZXIuc2V0Rm9yZWdyb3VuZENvbG9yKG92ZXJyaWRlQ29sb3IgIT0gbnVsbCA/IG92ZXJyaWRlQ29sb3IgOiBjb2xvcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFZpc2liaWxpdHkoYm9vbGVhbiB2aXMpIHsKLQkJc3VwZXIuc2V0VmlzaWJpbGl0eSh2aXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9MaW5rTmFtZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL0xpbmtOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmMDE1My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL0xpbmtOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLkRpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTGFiZWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rTmFtZUVkaXRQYXJ0IGV4dGVuZHMgTGFiZWxFZGl0UGFydCBpbXBsZW1lbnRzCi0JCUlUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwNDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jc3RhdGljIHsKLQkJcmVnaXN0ZXJTbmFwQmFja1Bvc2l0aW9uKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoTGlua05hbWVFZGl0UGFydC5WSVNVQUxfSUQpLCBuZXcgUG9pbnQoMCwgNDApKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpbmtOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEtleVBvaW50KCkgewotCQlyZXR1cm4gQ29ubmVjdGlvbkxvY2F0b3IuTUlERExFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBEaWFncmFtRWxlbWVudFR5cGVzLkxpbmtfMzAwMTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0RGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIERpYWdyYW1FZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCVN0cmluZyBmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoc3R5bGUpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCQllbHNlCi0JCQlzZXRGb250KERpYWdyYW1Db25zdGFudHMuZ2V0RGVmYXVsdEZvbnREYXRhKCkpOwotCX0KLQkKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJSUZpZ3VyZSBsYWJlbCA9IGNyZWF0ZUZpZ3VyZVByaW0oKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIobGFiZWwpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZVByaW0oKSB7Ci0JCXJldHVybiBuZXcgV3JhcExhYmVsKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1JvbGVOb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvUm9sZU5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzE5MmY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvUm9sZU5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLlJvbGVOb2RlQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5Sb2xlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLlJvbGVOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuZmlndXJlcy5XaWRlbmVkV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlTm9kZUVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDIwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlTm9kZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBSb2xlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCVJvbGVOb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBSb2xlTm9kZUZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZU5vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKFJvbGVOb2RlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFJvbGVOb2RlTmFtZUVkaXRQYXJ0KSB7Ci0JCQkoKFJvbGVOb2RlTmFtZUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQotCQkJCQkuZ2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKFJvbGVOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lRm9yKGVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIFJvbGVOb2RlRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFJvbGVOb2RlRmlndXJlKCkgewotCi0JCQl0aGlzLnNldE91dGxpbmUoZmFsc2UpOwotCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoUk9MRU5PREVGSUdVUkVfQkFDSwotCi0JCQkpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBXaWRlbmVkV3JhcExhYmVsKCk7Ci0JCQlmaWdfMC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmlnXzAuc2V0Rm9udChST0xFTk9ERU5BTUVGSUdVUkVfRk9OVCk7Ci0JCQlEaWFncmFtQ29yZVV0aWwuc2V0TGFiZWxQcm9wZXJ0aWVzKGZpZ18wKTsgLy8gbW9kaWZpZWQKLQkJCXNldEZpZ3VyZVJvbGVOb2RlTmFtZUZpZ3VyZShmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgZlJvbGVOb2RlTmFtZUZpZ3VyZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFdyYXBMYWJlbCBnZXRGaWd1cmVSb2xlTm9kZU5hbWVGaWd1cmUoKSB7Ci0JCQlyZXR1cm4gZlJvbGVOb2RlTmFtZUZpZ3VyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlKFdyYXBMYWJlbCBmaWcpIHsKLQkJCWZSb2xlTm9kZU5hbWVGaWd1cmUgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQlzdXBlci5hY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLmFkZENvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotCQkJRU9iamVjdCBlID0gKChWaWV3KSBtb2RlbCkuZ2V0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSBlKS5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIFJPTEVOT0RFRklHVVJFX0JBQ0sgPSBuZXcgQ29sb3IobnVsbCwgMjU1LCAyNTUsCi0JCQkxNTYpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9udCBST0xFTk9ERU5BTUVGSUdVUkVfRk9OVCA9IG5ldyBGb250KERpc3BsYXkKLQkJCS5nZXRDdXJyZW50KCksICJBcmlhbCIsIDgsIFNXVC5OT1JNQUwpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1JvbGVOb2RlTmFtZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1JvbGVOb2RlTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhN2QyMTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Sb2xlTm9kZU5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLkRpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZU5vZGVOYW1lRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0IGltcGxlbWVudHMKLQkJSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZU5vZGVOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBMYWJlbCBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlyZXR1cm4gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImRpYWdyYW0vUm9sZURlc2NyaXB0b3IuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCQkvLwkJcmV0dXJuIGdldEVkaXRUZXh0KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBEaWFncmFtRWxlbWVudFR5cGVzLlJvbGVOb2RlXzIwMDE7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBEaWFncmFtRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZSgpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCQllbHNlCi0JCQlzZXRGb250KERpYWdyYW1Db25zdGFudHMuZ2V0RGVmYXVsdEZvbnREYXRhKCkpOwotCi0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCUNvbG9yIGMgPSBEaWFncmFtQ29yZVV0aWwuZ2V0Rm9udENvbG9yKHRoaXMpOwotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQljb2xvciA9IGM7Ci0JCX0KLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1JvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RkMjhiMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1JvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLkRpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5Sb2xlVGFza0NvbXBvc2l0ZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuUm9sZVRhc2tDb21wb3NpdGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5Sb2xlVGFza0NvbXBvc2l0ZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5maWd1cmVzLlJhaXNlZE1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuQWN0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQXJyYW5nZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAwMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwKLQkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOwotCi0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IFJvbGVUYXNrQ29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLAotCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgUm9sZVRhc2tDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCWlmIChjaGlsZC5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpID09IG51bGwpIHsKLQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSVRleHRBd2FyZUVkaXRQYXJ0KSB7Ci0JCQkJCQlyZXR1cm4gbmV3IERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5jcmVhdGVDaGlsZEVkaXRQb2xpY3koY2hpbGQpOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCVJvbGVUYXNrQ29tcG9zaXRlRmlndXJlIGZpZ3VyZSA9IG5ldyBSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKFJvbGVUYXNrQ29tcG9zaXRlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQEBtb2RpZmllZAotCQkgKi8KLQkJcHVibGljIFJvbGVUYXNrQ29tcG9zaXRlRmlndXJlKCkgewotCi0JCQlvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dCBteUdlbkxheW91dE1hbmFnZXIgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQoKTsKLQkJCW15R2VuTGF5b3V0TWFuYWdlci5zZXRTdHJldGNoTWlub3JBeGlzKGZhbHNlKTsKLQkJCW15R2VuTGF5b3V0TWFuYWdlcgotCQkJCQkuc2V0TWlub3JBbGlnbm1lbnQob3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQuQUxJR05fQ0VOVEVSKTsKLQkJCW15R2VuTGF5b3V0TWFuYWdlci5zZXRTcGFjaW5nKDIwKTsKLQkJCW15R2VuTGF5b3V0TWFuYWdlci5zZXRWZXJ0aWNhbChmYWxzZSk7Ci0KLQkJCXRoaXMuc2V0TGF5b3V0TWFuYWdlcihteUdlbkxheW91dE1hbmFnZXIpOwotCi0JCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihST0xFVEFTS0NPTVBPU0lURUZJR1VSRV9CQUNLCi0KLQkJCSk7Ci0JCQkvLwkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKQotCQkJLy8JCQkJCS5EUHRvTFAoMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMCksCi0JCQkvLwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSkpOwotCQkJdGhpcy5zZXRCb3JkZXIobmV3IFJhaXNlZE1hcmdpbkJvcmRlcigpKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIFJPTEVUQVNLQ09NUE9TSVRFRklHVVJFX0JBQ0sgPSBuZXcgQ29sb3IobnVsbCwKLQkJCTI1NSwgMjU1LCAxNTYpOwotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlYm91bmRzKCkgewotCQlSZWN0YW5nbGUgY29uc3RyYWludCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgLTEsIC0xKTsKLQkJTm9kZSBub2RlID0gKE5vZGUpIHRoaXMuZ2V0TW9kZWwoKTsKLQkJTG9jYXRpb24gbG9jYXRpb24gPSAoTG9jYXRpb24pIG5vZGUuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJY29uc3RyYWludC5zZXRMb2NhdGlvbihuZXcgUG9pbnQobG9jYXRpb24uZ2V0WCgpLCBsb2NhdGlvbi5nZXRZKCkpKTsKLQkJfQotCi0JCSgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5zZXRMYXlvdXRDb25zdHJhaW50KHRoaXMsCi0JCQkJZ2V0RmlndXJlKCksIGNvbnN0cmFpbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJLy8JCWlmKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUKXsKLQkJLy8JCQlBcnJhbmdlUmVxdWVzdCBhcnJhbmdlUmVxdWVzdCA9IG5ldyBBcnJhbmdlUmVxdWVzdChBY3Rpb25JZHMuQUNUSU9OX0FSUkFOR0VfQUxMKTsgTGlzdCBsID0gZ2V0Q2hpbGRyZW4oKTsKLQkJLy8JCQlhcnJhbmdlUmVxdWVzdC5zZXRQYXJ0c1RvQXJyYW5nZShsKTsgCi0JCS8vCQkJQ29tbWFuZCBhcnJhbmdlQ21kID0gZ2V0Q29tbWFuZChhcnJhbmdlUmVxdWVzdCk7IAotCQkvLwkJCWFycmFuZ2VDbWQuZXhlY3V0ZSgpOwotCQkvLwkJCQotCQkvLwkJCVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KFJlcXVlc3RDb25zdGFudHMuUkVRX0FVVE9TSVpFKTsKLQkJLy8JCQlDb21tYW5kIGF1dG9TaXplQ21kID0gZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLQkJLy8JCQlpZihhdXRvU2l6ZUNtZCAhPSBudWxsKXsKLQkJLy8JCQkJYXV0b1NpemVDbWQuZXhlY3V0ZSgpOwotCQkvLwkJCX0KLQkJLy8JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCUxpc3Q8Vmlldz4gbGlzdCA9IHN1cGVyLmdldE1vZGVsQ2hpbGRyZW4oKTsKLQotCQlDb21wYXJhdG9yPFZpZXc+IGMgPSBuZXcgQ29tcGFyYXRvcjxWaWV3PigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3IG8xLCBWaWV3IG8yKSB7Ci0JCQkJT2JqZWN0IG1vZGVsMSA9ICgoVmlldykgbzEpLmdldEVsZW1lbnQoKTsKLQkJCQlPYmplY3QgbW9kZWwyID0gKChWaWV3KSBvMikuZ2V0RWxlbWVudCgpOwotCQkJCWlmIChtb2RlbDEgaW5zdGFuY2VvZiBUYXNrTm9kZSAmJiBtb2RlbDIgaW5zdGFuY2VvZiBUYXNrTm9kZSkgewotCQkJCQlpZiAoKChUYXNrTm9kZSkgbW9kZWwxKS5nZXRJbmRleCgpID49ICgoVGFza05vZGUpIG1vZGVsMikKLQkJCQkJCQkuZ2V0SW5kZXgoKSkKLQkJCQkJCXJldHVybiAxOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCXJldHVybiAwOwotCQkJfQotCQl9OwotCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIGMpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCUVPYmplY3QgZSA9ICgoVmlldykgbW9kZWwpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZSkuYWRkQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1JvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1JvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMGUzZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0Lk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxpc3RDb21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydCBleHRlbmRzCi0JCUxpc3RDb21wYXJ0bWVudEVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc01vZGVsQ2hpbGRyZW5DaGFuZ2VkKE5vdGlmaWNhdGlvbiBldnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgewotCQlyZXR1cm4gIiI7CS8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXIKLQkJCQkuY3JlYXRlRmlndXJlKCk7Ci0KLQkJLy8gcmVtb3ZlIHRoZSBzcGFjaW5nCi0JCXJlc3VsdC5nZXRTY3JvbGxQYW5lKCkuZ2V0Q29udGVudHMoKS5zZXRCb3JkZXIoCi0JCQkJbmV3IE1hcmdpbkJvcmRlcigwLCAwLCAwLCAwKSk7Ci0KLQkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7Ci0JCXJlc3VsdC5zZXRCb3JkZXIobnVsbCk7Ci0KLQkJLy8gZGlzYWJsZSBzY3JvbGxwYW5lCi0JCXJlc3VsdC5nZXRTY3JvbGxQYW5lKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeSgKLQkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8gLS0gcGFyZW50IGxheW91dCBkb2VzIG5vdCBhY2NlcHQgRG91YmxlIGNvbnN0cmFpbnRzIGFzIHJhdGlvCi0JCS8vIHN1cGVyLnNldFJhdGlvKHJhdGlvKTsgCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1Rhc2tOb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvVGFza05vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTNlY2ZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvVGFza05vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLlRhc2tOb2RlQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5UYXNrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLlRhc2tOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuc2VydmljZS5EaWFncmFtUmVzZXRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuZmlndXJlcy5XaWRlbmVkV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5hY3Rpb24uZ2xvYmFsLkdldEdsb2JhbEFjdGlvbkhhbmRsZXJPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLk5vdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tOb2RlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMjAwMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tOb2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCi0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IFRhc2tOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJVGFza05vZGVGaWd1cmUgZmlndXJlID0gbmV3IFRhc2tOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrTm9kZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoVGFza05vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgVGFza05vZGVOYW1lRWRpdFBhcnQpIHsKLQkJCSgoVGFza05vZGVOYW1lRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpCi0JCQkJCS5nZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoVGFza05vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgewotCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmVGb3IoZWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgVGFza05vZGVGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgVGFza05vZGVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0T3V0bGluZShmYWxzZSk7Ci0JCQl0aGlzLnNldExpbmVXaWR0aCgwKTsKLQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKFRBU0tOT0RFRklHVVJFX0JBQ0sKLQotCQkJKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgV2lkZW5lZFdyYXBMYWJlbCgpOwotCQkJZmlnXzAuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZpZ18wLnNldEZvbnQoVEFTS05PREVOQU1FRklHVVJFX0ZPTlQpOwotCQkJRGlhZ3JhbUNvcmVVdGlsLnNldExhYmVsUHJvcGVydGllcyhmaWdfMCk7IC8vIG1vZGlmaWVkCi0JCQlzZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUoZmlnXzApOwotCQkJZmlnXzAuc2V0VGV4dFdyYXBBbGlnbm1lbnQoUG9zaXRpb25Db25zdGFudHMuTEVGVCk7Ci0JCQlmaWdfMC5zZXRUZXh0V3JhcFdpZHRoKDEwMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdyYXBMYWJlbCBmVGFza05vZGVOYW1lRmlndXJlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldEZpZ3VyZVRhc2tOb2RlTmFtZUZpZ3VyZSgpIHsKLQkJCXJldHVybiBmVGFza05vZGVOYW1lRmlndXJlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUoV3JhcExhYmVsIGZpZykgewotCQkJZlRhc2tOb2RlTmFtZUZpZ3VyZSA9IGZpZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb250IFRBU0tOT0RFTkFNRUZJR1VSRV9GT05UID0gbmV3IEZvbnQoRGlzcGxheQotCQkJLmdldEN1cnJlbnQoKSwgIkFyaWFsIiwgOCwgU1dULk5PUk1BTCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBUQVNLTk9ERUZJR1VSRV9CQUNLID0gbmV3IENvbG9yKG51bGwsIDI1NSwgMjU1LAotCQkJMTU2KTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpOwotCQlpZihNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tOb2RlX0luZGV4KCkuZXF1YWxzKGZlYXR1cmUpKXsKLQkJCUVkaXRQYXJ0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KCk7Ci0JCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0ICl7Ci0JCQkJKChSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KXBhcmVudCkucmVmcmVzaCgpOwotCQkJCQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KG5vdGlmaWNhdGlvbik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBmaXJlUmVzZXRMYXlvdXQoUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCBwYXJlbnQpewotCQlHcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKEdyYXBoaWNhbFZpZXdlcikoKFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpcGFyZW50KS5nZXRWaWV3ZXIoKTsKLQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgZGVwID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KXZpZXdlci5nZXRDb250ZW50cygpOwotCQlMaXN0PEVkaXRQYXJ0PiBsb2NhbCA9IG5ldyBBcnJheUxpc3Q8RWRpdFBhcnQ+KCk7Ci0JCWlmKGRlcC5nZXRDaGlsZHJlbigpICE9IG51bGwgJiYgIWRlcC5nZXRDaGlsZHJlbigpLmlzRW1wdHkoKSl7Ci0JCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBkZXAuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZighKG5leHQgaW5zdGFuY2VvZiBOb3RlRWRpdFBhcnQpKXsKLQkJCQkJbG9jYWwuYWRkKChFZGl0UGFydCluZXh0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZGVwLmdldFJlY2VudGx5QWRkZWRQYXJ0cygpLmFkZEFsbChsb2NhbCk7Ci0vLwkJRGlhZ3JhbVJlc2V0U2VydmljZSBzZXJ2aWNlID0gbmV3IERpYWdyYW1SZXNldFNlcnZpY2UoKChEaWFncmFtR3JhcGhpY2FsVmlld2VyKXZpZXdlcikuZ2V0RQotLy8JCQkJdmlld2VyLCBnZXRFZGl0RG9tYWluKCksIGdldEFjdGlvblJlZ2lzdHJ5KCkpOwotLy8JCXNlcnZpY2UuY2xlYW5VcERpYWdyYW0oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCUVPYmplY3QgZSA9ICgoVmlldykgbW9kZWwpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZSkuYWRkQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1Rhc2tOb2RlTmFtZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1Rhc2tOb2RlTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYTRiODIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9UYXNrTm9kZU5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTm9kZU5hbWVFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQgaW1wbGVtZW50cwotCQlJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrTm9kZU5hbWVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsCi0JCQkJbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJCQkJCUxpc3QgaGFuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCU5vblJlc2l6YWJsZUhhbmRsZUtpdC5hZGRNb3ZlSGFuZGxlKAotCQkJCQkJCQkoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSwgaGFuZGxlcyk7Ci0JCQkJCQlyZXR1cm4gaGFuZGxlczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcExhYmVsIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCXJldHVybiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkiZGlhZ3JhbS9UYXNrRGVzY3JpcHRvci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlpZiAodGV4dC5sZW5ndGgoKSA8IDE2KSB7Ci0JCQlpbnQgZ2FwID0gMTYgLSB0ZXh0Lmxlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnYXAgLyAyOyBpKyspIHsKLQkJCQl0ZXh0ICs9ICIgIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnYXAgLyAyOyBpKyspIHsKLQkJCQl0ZXh0ID0gIiAiICsgdGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXRleHQgPSBEaWFncmFtQ29yZVV0aWwud3JhcCh0ZXh0LCAxMik7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCQkvLwkJcmV0dXJuIGdldEVkaXRUZXh0KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBEaWFncmFtRWxlbWVudFR5cGVzLlRhc2tOb2RlXzIwMDI7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBEaWFncmFtRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JCWVsc2UKLQkJCXNldEZvbnQoRGlhZ3JhbUNvbnN0YW50cy5nZXREZWZhdWx0Rm9udERhdGEoKSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCUNvbG9yIGMgPSBEaWFncmFtQ29yZVV0aWwuZ2V0Rm9udENvbG9yKHRoaXMpOwotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQljb2xvciA9IGM7Ci0JCX0KLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0NzdlNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLldvcmtQcm9kdWN0Q29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5Xb3JrUHJvZHVjdENvbXBvc2l0ZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLldvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmZpZ3VyZXMuUmFpc2VkTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAwMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwKLQkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOwotCi0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLAotCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgV29ya1Byb2R1Y3RDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCWlmIChjaGlsZC5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpID09IG51bGwpIHsKLQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSVRleHRBd2FyZUVkaXRQYXJ0KSB7Ci0JCQkJCQlyZXR1cm4gbmV3IERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5jcmVhdGVDaGlsZEVkaXRQb2xpY3koY2hpbGQpOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCVdvcmtQcm9kdWN0Q29tcG9zaXRlRmlndXJlIGZpZ3VyZSA9IG5ldyBXb3JrUHJvZHVjdENvbXBvc2l0ZUZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKFdvcmtQcm9kdWN0Q29tcG9zaXRlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUoKSB7Ci0KLQkJCW9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0IG15R2VuTGF5b3V0TWFuYWdlciA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dCgpOwotCQkJbXlHZW5MYXlvdXRNYW5hZ2VyLnNldFN0cmV0Y2hNaW5vckF4aXMoZmFsc2UpOwotCQkJbXlHZW5MYXlvdXRNYW5hZ2VyCi0JCQkJCS5zZXRNaW5vckFsaWdubWVudChvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dC5BTElHTl9DRU5URVIpOwotCQkJbXlHZW5MYXlvdXRNYW5hZ2VyLnNldFNwYWNpbmcoNSk7Ci0JCQlteUdlbkxheW91dE1hbmFnZXIuc2V0VmVydGljYWwodHJ1ZSk7Ci0KLQkJCXRoaXMuc2V0TGF5b3V0TWFuYWdlcihteUdlbkxheW91dE1hbmFnZXIpOwotCi0JCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihXT1JLUFJPRFVDVENPTVBPU0lURUZJR1VSRV9CQUNLCi0KLQkJCSk7Ci0JCQkvLwkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKQotCQkJLy8JCQkJCS5EUHRvTFAoMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMCksCi0JCQkvLwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSkpOwotCQkJdGhpcy5zZXRCb3JkZXIobmV3IFJhaXNlZE1hcmdpbkJvcmRlcigpKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIFdPUktQUk9EVUNUQ09NUE9TSVRFRklHVVJFX0JBQ0sgPSBuZXcgQ29sb3IobnVsbCwKLQkJCTI1NSwgMjU1LCAyMDUpOwotCi0JLyoqCi0JICogQGN1c3RvbQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZWJvdW5kcygpIHsKLQkJUmVjdGFuZ2xlIGNvbnN0cmFpbnQgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIC0xLCAtMSk7Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSB0aGlzLmdldE1vZGVsKCk7Ci0JCUxvY2F0aW9uIGxvY2F0aW9uID0gKExvY2F0aW9uKSBub2RlLmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCWNvbnN0cmFpbnQuc2V0TG9jYXRpb24obmV3IFBvaW50KGxvY2F0aW9uLmdldFgoKSwgbG9jYXRpb24uZ2V0WSgpKSk7Ci0JCX0KLQkJLy8JCWNvbnN0cmFpbnQud2lkdGggPSBnZXROb2RlKCkuZ2V0V2lkdGgoKTsKLQkJKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0UGFyZW50KCkpLnNldExheW91dENvbnN0cmFpbnQodGhpcywKLQkJCQlnZXRGaWd1cmUoKSwgY29uc3RyYWludCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQlzdXBlci5hY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLmFkZENvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotCQkJRU9iamVjdCBlID0gKChWaWV3KSBtb2RlbCkuZ2V0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSBlKS5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWExYTJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MaXN0Q29tcGFydG1lbnRFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydCBleHRlbmRzCi0JCUxpc3RDb21wYXJ0bWVudEVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc01vZGVsQ2hpbGRyZW5DaGFuZ2VkKE5vdGlmaWNhdGlvbiBldnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgewotCQlyZXR1cm4gIiI7CS8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXIKLQkJCQkuY3JlYXRlRmlndXJlKCk7Ci0KLQkJLy8gcmVtb3ZlIHRoZSBzcGFjaW5nCi0JCXJlc3VsdC5nZXRTY3JvbGxQYW5lKCkuZ2V0Q29udGVudHMoKS5zZXRCb3JkZXIoCi0JCQkJbmV3IE1hcmdpbkJvcmRlcigwLCAwLCAwLCAwKSk7Ci0KLQkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7Ci0JCXJlc3VsdC5zZXRCb3JkZXIobnVsbCk7Ci0KLQkJLy8gZGlzYWJsZSBzY3JvbGxwYW5lICYgY29tcGFydG1lbnQgdGl0bGUKLQkJcmVzdWx0LmdldFNjcm9sbFBhbmUoKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeSgKLQkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8gLS0gcGFyZW50IGxheW91dCBkb2VzIG5vdCBhY2NlcHQgRG91YmxlIGNvbnN0cmFpbnRzIGFzIHJhdGlvCi0JCS8vIHN1cGVyLnNldFJhdGlvKHJhdGlvKTsgCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZTg1ZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuZmlndXJlcy5XaWRlbmVkV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMjAwMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0KLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVGaWd1cmUgZmlndXJlID0gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydCkgewotCQkJKChXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkKLQkJCQkJCQkuZ2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZSgpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDQwKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lRm9yKGVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsKLQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKFdPUktQUk9EVUNUREVTQ1JJUFRPUk5PREVGSUdVUkVfQkFDSwotCi0JCQkpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBXaWRlbmVkV3JhcExhYmVsKCk7Ci0JCQlmaWdfMC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmlnXzAuc2V0Rm9udChXT1JLUFJPRFVDVE5PREVOQU1FRklHVVJFX0ZPTlQpOwotCi0JCQlEaWFncmFtQ29yZVV0aWwuc2V0TGFiZWxQcm9wZXJ0aWVzKGZpZ18wKTsgLy8gbW9kaWZpZWQKLQkJCXNldEZpZ3VyZVdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUoZmlnXzApOwotCQkJZmlnXzAuc2V0VGV4dFdyYXBBbGlnbm1lbnQoUG9zaXRpb25Db25zdGFudHMuTEVGVCk7Ci0JCQlPYmplY3QgbGF5RGF0YTAgPSBudWxsOwotCi0JCQl0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgV3JhcExhYmVsIGZXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldEZpZ3VyZVdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUoKSB7Ci0JCQlyZXR1cm4gZldvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUoV3JhcExhYmVsIGZpZykgewotCQkJZldvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQlzdXBlci5hY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLmFkZENvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotCQkJRU9iamVjdCBlID0gKChWaWV3KSBtb2RlbCkuZ2V0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSBlKS5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvbnQgV09SS1BST0RVQ1ROT0RFTkFNRUZJR1VSRV9GT05UID0gbmV3IEZvbnQoRGlzcGxheQotCQkJLmdldEN1cnJlbnQoKSwgIkFyaWFsIiwgOCwgU1dULk5PUk1BTCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBXT1JLUFJPRFVDVERFU0NSSVBUT1JOT0RFRklHVVJFX0JBQ0sgPSBuZXcgQ29sb3IoCi0JCQludWxsLCAyNTUsIDI1NSwgMjA1KTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA4NGUyNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5EaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQKLQkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwTGFiZWwgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJcmV0dXJuIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJkaWFncmFtL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXRleHQgPSBEaWFncmFtQ29yZVV0aWwud3JhcCh0ZXh0LCAzKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JCS8vCQlyZXR1cm4gZ2V0RWRpdFRleHQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIERpYWdyYW1FbGVtZW50VHlwZXMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV8yMDAzOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwgRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeQotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JCWVsc2UKLQkJCXNldEZvbnQoRGlhZ3JhbUNvbnN0YW50cy5nZXREZWZhdWx0Rm9udERhdGEoKSk7Ci0JfQotCQotCQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCUNvbG9yIGMgPSBEaWFncmFtQ29yZVV0aWwuZ2V0Rm9udENvbG9yKHRoaXMpOwotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQljb2xvciA9IGM7Ci0JCX0KLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eURldGFpbERpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWViNjg5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlRhc2tOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC51dGlsLkRpYWdyYW1FZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsQ29ubmVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzCi0JCUNhbm9uaWNhbENvbm5lY3Rpb25FZGl0UG9saWN5IHsKLQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGdldFNlbWFudGljSG9zdCgpIHsKLQkJcmV0dXJuIGhvc3QoKS5nZXRNb2RlbCgpICE9IG51bGwgPyBzdXBlci5nZXRTZW1hbnRpY0hvc3QoKSA6IG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hPbkFjdGl2YXRlKCkgewkJCi0JCXN1cGVyLnJlZnJlc2hPbkFjdGl2YXRlKCk7Ci0JCQotCQlFZGl0UGFydCBlcCA9IGdldEhvc3QoKTsKLQkJaWYoZXAgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpIHsKLQkJCURpYWdyYW1FZGl0b3JVdGlsLmluaXRpYWxpemVPbkFjdGl2YXRlKChEaWFncmFtRWRpdFBhcnQpIGVwKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlFT2JqZWN0IG1vZGVsT2JqZWN0ID0gKChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCUVPYmplY3QgbmV4dFZhbHVlOwotCQlpbnQgbm9kZVZJRDsKLQkJZm9yIChJdGVyYXRvciB2YWx1ZXMgPSAoKE5vZGVDb250YWluZXIpIG1vZGVsT2JqZWN0KS5nZXROb2RlcygpCi0JCQkJLml0ZXJhdG9yKCk7IHZhbHVlcy5oYXNOZXh0KCk7KSB7Ci0JCQluZXh0VmFsdWUgPSAoRU9iamVjdCkgdmFsdWVzLm5leHQoKTsKLQkJCW5vZGVWSUQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlld09iamVjdCwKLQkJCQkJbmV4dFZhbHVlKTsKLQkJCXN3aXRjaCAobm9kZVZJRCkgewotCQkJY2FzZSBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKQotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiAodmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKSB8fCB2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5vZGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRDb25uZWN0aW9ucyhDb2xsZWN0aW9uIGNvbm5lY3Rpb25zLAotCQkJTm9kZUNvbnRhaW5lciBjb250YWluZXIpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29udGFpbmVyLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQljb25uZWN0aW9ucy5hZGRBbGwobm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyKSB7Ci0JCQkJZ2V0Q29ubmVjdGlvbnMoY29ubmVjdGlvbnMsIChOb2RlQ29udGFpbmVyKSBub2RlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ29ubmVjdGlvbnNMaXN0KCkgewotCQlBY3Rpdml0eURldGFpbERpYWdyYW0gYWRkID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgKChWaWV3KSBnZXRIb3N0KCkKLQkJCQkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQlMaXN0IGNvbm5lY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRDb25uZWN0aW9ucyhjb25uZWN0aW9ucywgYWRkKTsKLQkJcmV0dXJuIGNvbm5lY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFNvdXJjZUVsZW1lbnQoRU9iamVjdCByZWxhdGlvbnNoaXApIHsKLQkJaWYgKHJlbGF0aW9uc2hpcCBpbnN0YW5jZW9mIExpbmspIHsKLQkJCXJldHVybiAoKExpbmspIHJlbGF0aW9uc2hpcCkuZ2V0U291cmNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0VGFyZ2V0RWxlbWVudChFT2JqZWN0IHJlbGF0aW9uc2hpcCkgewotCQlpZiAocmVsYXRpb25zaGlwIGluc3RhbmNlb2YgTGluaykgewotCQkJcmV0dXJuICgoTGluaykgcmVsYXRpb25zaGlwKS5nZXRUYXJnZXQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRJbmNsdWRlQ29ubmVjdGlvbihFZGdlIGNvbm5lY3RvciwKLQkJCUNvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJcmV0dXJuIHN1cGVyLnNob3VsZEluY2x1ZGVDb25uZWN0aW9uKGNvbm5lY3RvciwgY2hpbGRyZW4pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsKLQkJTGlzdCBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdCgpOwotCQljcmVhdGVkVmlld3MuYWRkQWxsKHJlZnJlc2hTZW1hbnRpY0NoaWxkcmVuKCkpOwotCQlMaXN0IGNyZWF0ZWRDb25uZWN0aW9uVmlld3MgPSBuZXcgTGlua2VkTGlzdCgpOwotCQljcmVhdGVkQ29ubmVjdGlvblZpZXdzLmFkZEFsbChyZWZyZXNoU2VtYW50aWNDb25uZWN0aW9ucygpKTsKLQkJY3JlYXRlZENvbm5lY3Rpb25WaWV3cy5hZGRBbGwocmVmcmVzaENvbm5lY3Rpb25zKCkpOwotCi0JCS8vCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsKLQkJLy8JCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXIKLQkJLy8JCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkKLQkJLy8JCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsKLQkJLy8JCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsKLQkJLy8JCX0KLQotCQljcmVhdGVkVmlld3MuYWRkQWxsKGNyZWF0ZWRDb25uZWN0aW9uVmlld3MpOwotCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG15TGlua0Rlc2NyaXB0b3JzID0gbmV3IExpbmtlZExpc3QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1hcCBteUVPYmplY3QyVmlld01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIHJlZnJlc2hDb25uZWN0aW9ucygpIHsKLQkJdHJ5IHsKLQkJCWNvbGxlY3RBbGxMaW5rcyhnZXREaWFncmFtKCkpOwotCQkJQ29sbGVjdGlvbiBleGlzdGluZ0xpbmtzID0gbmV3IExpbmtlZExpc3QoZ2V0RGlhZ3JhbSgpLmdldEVkZ2VzKCkpOwotCQkJZm9yIChJdGVyYXRvciBkaWFncmFtTGlua3MgPSBleGlzdGluZ0xpbmtzLml0ZXJhdG9yKCk7IGRpYWdyYW1MaW5rcwotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUVkZ2UgbmV4dERpYWdyYW1MaW5rID0gKEVkZ2UpIGRpYWdyYW1MaW5rcy5uZXh0KCk7Ci0JCQkJRU9iamVjdCBkaWFncmFtTGlua09iamVjdCA9IG5leHREaWFncmFtTGluay5nZXRFbGVtZW50KCk7Ci0JCQkJRU9iamVjdCBkaWFncmFtTGlua1NyYyA9IG5leHREaWFncmFtTGluay5nZXRTb3VyY2UoKQotCQkJCQkJLmdldEVsZW1lbnQoKTsKLQkJCQlFT2JqZWN0IGRpYWdyYW1MaW5rRHN0ID0gbmV4dERpYWdyYW1MaW5rLmdldFRhcmdldCgpCi0JCQkJCQkuZ2V0RWxlbWVudCgpOwotCQkJCWludCBkaWFncmFtTGlua1Zpc3VhbElEID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRWaXN1YWxJRChuZXh0RGlhZ3JhbUxpbmspOwotCQkJCWZvciAoSXRlcmF0b3IgbW9kZWxMaW5rRGVzY3JpcHRvcnMgPSBteUxpbmtEZXNjcmlwdG9ycwotCQkJCQkJLml0ZXJhdG9yKCk7IG1vZGVsTGlua0Rlc2NyaXB0b3JzLmhhc05leHQoKTspIHsKLQkJCQkJTGlua0Rlc2NyaXB0b3IgbmV4dExpbmtEZXNjcmlwdG9yID0gKExpbmtEZXNjcmlwdG9yKSBtb2RlbExpbmtEZXNjcmlwdG9ycwotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCWlmIChkaWFncmFtTGlua09iamVjdCA9PSBuZXh0TGlua0Rlc2NyaXB0b3IKLQkJCQkJCQkuZ2V0TGlua0VsZW1lbnQoKQotCQkJCQkJCSYmIGRpYWdyYW1MaW5rU3JjID09IG5leHRMaW5rRGVzY3JpcHRvci5nZXRTb3VyY2UoKQotCQkJCQkJCSYmIGRpYWdyYW1MaW5rRHN0ID09IG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkJCQkJLmdldERlc3RpbmF0aW9uKCkKLQkJCQkJCQkmJiBkaWFncmFtTGlua1Zpc3VhbElEID09IG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkJCQkJLmdldFZpc3VhbElEKCkpIHsKLQkJCQkJCWRpYWdyYW1MaW5rcy5yZW1vdmUoKTsKLQkJCQkJCW1vZGVsTGlua0Rlc2NyaXB0b3JzLnJlbW92ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZGVsZXRlVmlld3MoZXhpc3RpbmdMaW5rcy5pdGVyYXRvcigpKTsKLQkJCXJldHVybiBjcmVhdGVDb25uZWN0aW9ucyhteUxpbmtEZXNjcmlwdG9ycyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlteUxpbmtEZXNjcmlwdG9ycy5jbGVhcigpOwotCQkJbXlFT2JqZWN0MlZpZXdNYXAuY2xlYXIoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29sbGVjdEFsbExpbmtzKFZpZXcgdmlldykgewotCQlFT2JqZWN0IG1vZGVsRWxlbWVudCA9IHZpZXcuZ2V0RWxlbWVudCgpOwotCQlpbnQgZGlhZ3JhbUVsZW1lbnRWaXN1YWxJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOwotCQlzd2l0Y2ggKGRpYWdyYW1FbGVtZW50VmlzdWFsSUQpIHsKLQkJY2FzZSBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBSb2xlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBUYXNrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJbXlFT2JqZWN0MlZpZXdNYXAucHV0KG1vZGVsRWxlbWVudCwgdmlldyk7Ci0JCQlzdG9yZUxpbmtzKG1vZGVsRWxlbWVudCwgZ2V0RGlhZ3JhbSgpKTsKLQkJfQotCQlkZWZhdWx0OiB7Ci0JCX0KLQkJCWZvciAoSXRlcmF0b3IgY2hpbGRyZW4gPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2hpbGRyZW4KLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZHJlbi5uZXh0KCk7Ci0JCQkJY29sbGVjdEFsbExpbmtzKGNoaWxkVmlldyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb25zKENvbGxlY3Rpb24gbGlua0Rlc2NyaXB0b3JzKSB7Ci0JCWlmIChsaW5rRGVzY3JpcHRvcnMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlMaXN0IGFkYXB0ZXJzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBsaW5rRGVzY3JpcHRvcnNJdGVyYXRvciA9IGxpbmtEZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBsaW5rRGVzY3JpcHRvcnNJdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlmaW5hbCBMaW5rRGVzY3JpcHRvciBuZXh0TGlua0Rlc2NyaXB0b3IgPSAoTGlua0Rlc2NyaXB0b3IpIGxpbmtEZXNjcmlwdG9yc0l0ZXJhdG9yCi0JCQkJCS5uZXh0KCk7Ci0JCQlFZGl0UGFydCBzb3VyY2VFZGl0UGFydCA9IGdldEVkaXRQYXJ0Rm9yKG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkuZ2V0U291cmNlKCkpOwotCQkJRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQgPSBnZXRFZGl0UGFydEZvcihuZXh0TGlua0Rlc2NyaXB0b3IKLQkJCQkJLmdldERlc3RpbmF0aW9uKCkpOwotCQkJaWYgKHNvdXJjZUVkaXRQYXJ0ID09IG51bGwgfHwgdGFyZ2V0RWRpdFBhcnQgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0LkNvbm5lY3Rpb25WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZUNvbm5lY3Rpb25WaWV3UmVxdWVzdC5Db25uZWN0aW9uVmlld0Rlc2NyaXB0b3IoCi0JCQkJCW5leHRMaW5rRGVzY3JpcHRvci5nZXRTZW1hbnRpY0FkYXB0ZXIoKSwgbnVsbCwKLQkJCQkJVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwgKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkJCQkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsKLQkJCUNyZWF0ZUNvbm5lY3Rpb25WaWV3UmVxdWVzdCBjY3IgPSBuZXcgQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0KAotCQkJCQlkZXNjcmlwdG9yKTsKLQkJCWNjci5zZXRUeXBlKFJlcXVlc3RDb25zdGFudHMuUkVRX0NPTk5FQ1RJT05fU1RBUlQpOwotCQkJY2NyLnNldFNvdXJjZUVkaXRQYXJ0KHNvdXJjZUVkaXRQYXJ0KTsKLQkJCXNvdXJjZUVkaXRQYXJ0LmdldENvbW1hbmQoY2NyKTsKLQkJCWNjci5zZXRUYXJnZXRFZGl0UGFydCh0YXJnZXRFZGl0UGFydCk7Ci0JCQljY3Iuc2V0VHlwZShSZXF1ZXN0Q29uc3RhbnRzLlJFUV9DT05ORUNUSU9OX0VORCk7Ci0JCQlDb21tYW5kIGNtZCA9IHRhcmdldEVkaXRQYXJ0LmdldENvbW1hbmQoY2NyKTsKLQkJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsKLQkJCQlJQWRhcHRhYmxlIHZpZXdBZGFwdGVyID0gKElBZGFwdGFibGUpIGNjci5nZXROZXdPYmplY3QoKTsKLQkJCQlpZiAodmlld0FkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlhZGFwdGVycy5hZGQodmlld0FkYXB0ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYWRhcHRlcnM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWRpdFBhcnQgZ2V0RWRpdFBhcnRGb3IoRU9iamVjdCBtb2RlbEVsZW1lbnQpIHsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIG15RU9iamVjdDJWaWV3TWFwLmdldChtb2RlbEVsZW1lbnQpOwotCQlpZiAodmlldyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKEVkaXRQYXJ0KSBnZXRIb3N0KCkuZ2V0Vmlld2VyKCkuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLmdldCgKLQkJCQkJdmlldyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICpAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlTGlua3MoRU9iamVjdCBjb250YWluZXIsIERpYWdyYW0gZGlhZ3JhbSkgewotCQlFQ2xhc3MgY29udGFpbmVyTWV0YWNsYXNzID0gY29udGFpbmVyLmVDbGFzcygpOwotCQlzdG9yZUZlYXR1cmVNb2RlbEZhY2V0TGlua3MoY29udGFpbmVyLCBjb250YWluZXJNZXRhY2xhc3MsIGRpYWdyYW0pOwotCQlzdG9yZVR5cGVNb2RlbEZhY2V0TGlua3MoY29udGFpbmVyLCBjb250YWluZXJNZXRhY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVUeXBlTW9kZWxGYWNldExpbmtzKEVPYmplY3QgY29udGFpbmVyLAotCQkJRUNsYXNzIGNvbnRhaW5lck1ldGFjbGFzcykgewotCQlzdG9yZVR5cGVNb2RlbEZhY2V0TGlua3NfTGlua18zMDAxKGNvbnRhaW5lciwgY29udGFpbmVyTWV0YWNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVHlwZU1vZGVsRmFjZXRMaW5rc19MaW5rXzMwMDEoRU9iamVjdCBjb250YWluZXIsCi0JCQlFQ2xhc3MgY29udGFpbmVyTWV0YWNsYXNzKSB7Ci0JCWlmIChNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGUoKS5pc1N1cGVyVHlwZU9mKGNvbnRhaW5lck1ldGFjbGFzcykpIHsKLQkJCWZvciAoSXRlcmF0b3IgdmFsdWVzID0gKChOb2RlKSBjb250YWluZXIpLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKQotCQkJCQkuaXRlcmF0b3IoKTsgdmFsdWVzLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IG5leHRWYWx1ZSA9ICgoRU9iamVjdCkgdmFsdWVzLm5leHQoKSk7Ci0JCQkJaW50IGxpbmtWSUQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRChuZXh0VmFsdWUpOwotCQkJCWlmIChMaW5rRWRpdFBhcnQuVklTVUFMX0lEID09IGxpbmtWSUQpIHsKLQkJCQkJT2JqZWN0IHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0ID0gKChMaW5rKSBuZXh0VmFsdWUpCi0JCQkJCQkJLmdldFRhcmdldCgpOwotCQkJCQlpZiAoc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQlFT2JqZWN0IGRzdCA9IChFT2JqZWN0KSBzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdDsKLQkJCQkJCXN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0ID0gKChMaW5rKSBuZXh0VmFsdWUpCi0JCQkJCQkJCS5nZXRTb3VyY2UoKTsKLQkJCQkJCWlmIChzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCQlFT2JqZWN0IHNyYyA9IChFT2JqZWN0KSBzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdDsKLQkJCQkJCQlteUxpbmtEZXNjcmlwdG9ycy5hZGQobmV3IExpbmtEZXNjcmlwdG9yKHNyYywgZHN0LAotCQkJCQkJCQkJbmV4dFZhbHVlLCBEaWFncmFtRWxlbWVudFR5cGVzLkxpbmtfMzAwMSwKLQkJCQkJCQkJCWxpbmtWSUQpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZUZlYXR1cmVNb2RlbEZhY2V0TGlua3MoRU9iamVjdCBjb250YWluZXIsCi0JCQlFQ2xhc3MgY29udGFpbmVyTWV0YWNsYXNzLCBEaWFncmFtIGRpYWdyYW0pIHsKLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLQkJcmV0dXJuICgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpLmdldERpYWdyYW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBMaW5rRGVzY3JpcHRvciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgRU9iamVjdCBteVNvdXJjZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBFT2JqZWN0IG15RGVzdGluYXRpb247Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgRU9iamVjdCBteUxpbmtFbGVtZW50OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGludCBteVZpc3VhbElEOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIElBZGFwdGFibGUgbXlTZW1hbnRpY0FkYXB0ZXI7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBMaW5rRGVzY3JpcHRvcihFT2JqZWN0IHNvdXJjZSwgRU9iamVjdCBkZXN0aW5hdGlvbiwKLQkJCQlFT2JqZWN0IGxpbmtFbGVtZW50LCBJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUsIGludCBsaW5rVklEKSB7Ci0JCQl0aGlzKHNvdXJjZSwgZGVzdGluYXRpb24sIGxpbmtWSUQpOwotCQkJbXlMaW5rRWxlbWVudCA9IGxpbmtFbGVtZW50OwotCQkJZmluYWwgSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlQ29weSA9IGVsZW1lbnRUeXBlOwotCQkJbXlTZW1hbnRpY0FkYXB0ZXIgPSBuZXcgRU9iamVjdEFkYXB0ZXIobGlua0VsZW1lbnQpIHsKLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIGVsZW1lbnRUeXBlQ29weTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBMaW5rRGVzY3JpcHRvcihFT2JqZWN0IHNvdXJjZSwgRU9iamVjdCBkZXN0aW5hdGlvbiwKLQkJCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUsIGludCBsaW5rVklEKSB7Ci0JCQl0aGlzKHNvdXJjZSwgZGVzdGluYXRpb24sIGxpbmtWSUQpOwotCQkJbXlMaW5rRWxlbWVudCA9IG51bGw7Ci0JCQlmaW5hbCBJRWxlbWVudFR5cGUgZWxlbWVudFR5cGVDb3B5ID0gZWxlbWVudFR5cGU7Ci0JCQlteVNlbWFudGljQWRhcHRlciA9IG5ldyBJQWRhcHRhYmxlKCkgewotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gZWxlbWVudFR5cGVDb3B5OwotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBMaW5rRGVzY3JpcHRvcihFT2JqZWN0IHNvdXJjZSwgRU9iamVjdCBkZXN0aW5hdGlvbiwgaW50IGxpbmtWSUQpIHsKLQkJCW15U291cmNlID0gc291cmNlOwotCQkJbXlEZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uOwotCQkJbXlWaXN1YWxJRCA9IGxpbmtWSUQ7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0U291cmNlKCkgewotCQkJcmV0dXJuIG15U291cmNlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGdldERlc3RpbmF0aW9uKCkgewotCQkJcmV0dXJuIG15RGVzdGluYXRpb247Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0TGlua0VsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gbXlMaW5rRWxlbWVudDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgaW50IGdldFZpc3VhbElEKCkgewotCQkJcmV0dXJuIG15VmlzdWFsSUQ7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIElBZGFwdGFibGUgZ2V0U2VtYW50aWNBZGFwdGVyKCkgewotCQkJcmV0dXJuIG15U2VtYW50aWNBZGFwdGVyOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eURldGFpbERpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdkNDU0ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kcy5EdXBsaWNhdGVFT2JqZWN0c0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EdXBsaWNhdGVFbGVtZW50c1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHMuUm9sZVRhc2tDb21wb3NpdGVDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzLldvcmtQcm9kdWN0Q29tcG9zaXRlQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChEaWFncmFtRWxlbWVudFR5cGVzLlJvbGVUYXNrQ29tcG9zaXRlXzEwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoTW9kZWxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldE5vZGVDb250YWluZXJfTm9kZXMoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgUm9sZVRhc2tDb21wb3NpdGVDcmVhdGVDb21tYW5kKHJlcSkpOwotCQl9Ci0JCWlmIChEaWFncmFtRWxlbWVudFR5cGVzLldvcmtQcm9kdWN0Q29tcG9zaXRlXzEwMDIgPT0gcmVxCi0JCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoTW9kZWxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldE5vZGVDb250YWluZXJfTm9kZXMoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgV29ya1Byb2R1Y3RDb21wb3NpdGVDcmVhdGVDb21tYW5kKHJlcSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RHVwbGljYXRlQ29tbWFuZChEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCQkvLwkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCS8vCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCS8vCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgRHVwbGljYXRlQW55dGhpbmdDb21tYW5kKGVkaXRpbmdEb21haW4sIHJlcSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBEdXBsaWNhdGVBbnl0aGluZ0NvbW1hbmQgZXh0ZW5kcwotCQkJRHVwbGljYXRlRU9iamVjdHNDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIER1cGxpY2F0ZUFueXRoaW5nQ29tbWFuZCgKLQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLAotCQkJCUR1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCByZXEpIHsKLQkJCXN1cGVyKGVkaXRpbmdEb21haW4sIHJlcS5nZXRMYWJlbCgpLCByZXEKLQkJCQkJLmdldEVsZW1lbnRzVG9CZUR1cGxpY2F0ZWQoKSwgcmVxCi0JCQkJCS5nZXRBbGxEdXBsaWNhdGVkRWxlbWVudHNNYXAoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY1OGQ2Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5SZWNvbm5lY3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5Db21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5FZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5FbGVtZW50VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVkaXRIZWxwZXJDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EdXBsaWNhdGVFbGVtZW50c1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5HZXRFZGl0Q29udGV4dFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5JRWRpdENvbW1hbmRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuTW92ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5TZXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5oZWxwZXJzLkRpYWdyYW1CYXNlRWRpdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcyBTZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogRXh0ZW5kZWQgcmVxdWVzdCBkYXRhIGtleSB0byBob2xkIGVkaXRwYXJ0IHZpc3VhbCBpZC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklTVUFMX0lEX0tFWSA9ICJ2aXN1YWxfaWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBZGQgdmlzdWFsIGlkIG9mIGVkaXRlZCBlZGl0cGFydCB0byBleHRlbmRlZCBkYXRhIG9mIHRoZSByZXF1ZXN0Ci0JICogc28gY29tbWFuZCBzd2l0Y2ggY2FuIGRlY2lkZSB3aGF0IGtpbmQgb2YgZGlhZ3JhbSBlbGVtZW50IGlzIGJlaW5nIGVkaXRlZC4KLQkgKiBJdCBpcyBkb25lIGluIHRob3NlIGNhc2VzIHdoZW4gaXQncyBub3QgcG9zc2libGUgdG8gZGVkdWNlIGRpYWdyYW0KLQkgKiBlbGVtZW50IGtpbmQgZnJvbSBkb21haW4gZWxlbWVudC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBSZWNvbm5lY3RSZXF1ZXN0KSB7Ci0JCQlPYmplY3QgdmlldyA9ICgoUmVjb25uZWN0UmVxdWVzdCkgcmVxdWVzdCkuZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KCkKLQkJCQkJLmdldE1vZGVsKCk7Ci0JCQlpZiAodmlldyBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQlJbnRlZ2VyIGlkID0gbmV3IEludGVnZXIoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRWaXN1YWxJRCgoVmlldykgdmlldykpOwotCQkJCXJlcXVlc3QuZ2V0RXh0ZW5kZWREYXRhKCkucHV0KFZJU1VBTF9JRF9LRVksIGlkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHZpc3VhbCBpZCBmcm9tIHJlcXVlc3QgcGFyYW1ldGVycy4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRWaXN1YWxJRChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJT2JqZWN0IGlkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoVklTVUFMX0lEX0tFWSk7Ci0JCXJldHVybiBpZCBpbnN0YW5jZW9mIEludGVnZXIgPyAoKEludGVnZXIpIGlkKS5pbnRWYWx1ZSgpIDogLTE7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFNlbWFudGljQ29tbWFuZChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJSUVkaXRDb21tYW5kUmVxdWVzdCBjb21wbGV0ZWRSZXF1ZXN0ID0gY29tcGxldGVSZXF1ZXN0KHJlcXVlc3QpOwotCQlPYmplY3QgZWRpdEhlbHBlckNvbnRleHQgPSBjb21wbGV0ZWRSZXF1ZXN0LmdldEVkaXRIZWxwZXJDb250ZXh0KCk7Ci0JCWlmIChlZGl0SGVscGVyQ29udGV4dCBpbnN0YW5jZW9mIFZpZXcKLQkJCQl8fCAoZWRpdEhlbHBlckNvbnRleHQgaW5zdGFuY2VvZiBJRWRpdEhlbHBlckNvbnRleHQgJiYgKChJRWRpdEhlbHBlckNvbnRleHQpIGVkaXRIZWxwZXJDb250ZXh0KQotCQkJCQkJLmdldEVPYmplY3QoKSBpbnN0YW5jZW9mIFZpZXcpKSB7Ci0JCQkvLyBubyBzZW1hbnRpYyBjb21tYW5kcyBhcmUgcHJvdmlkZWQgZm9yIHB1cmUgZGVzaWduIGVsZW1lbnRzCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoZWRpdEhlbHBlckNvbnRleHQgPT0gbnVsbCkgewotCQkJZWRpdEhlbHBlckNvbnRleHQgPSBWaWV3VXRpbAotCQkJCQkucmVzb2x2ZVNlbWFudGljRWxlbWVudCgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpOwotCQl9Ci0JCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9IEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRFbGVtZW50VHlwZShlZGl0SGVscGVyQ29udGV4dCk7Ci0JCWlmIChlbGVtZW50VHlwZSA9PSBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0VHlwZSgKLQkJCQkib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5kZWZhdWx0IikpIHsgLy8kTk9OLU5MUy0xJCAKLQkJCWVsZW1lbnRUeXBlID0gbnVsbDsKLQkJfQotCQlDb21tYW5kIGVwQ29tbWFuZCA9IGdldFNlbWFudGljQ29tbWFuZFN3aXRjaChjb21wbGV0ZWRSZXF1ZXN0KTsKLQkJaWYgKGVwQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQlJQ29tbWFuZCBjb21tYW5kID0gZXBDb21tYW5kIGluc3RhbmNlb2YgSUNvbW1hbmRQcm94eSA/ICgoSUNvbW1hbmRQcm94eSkgZXBDb21tYW5kKQotCQkJCQkuZ2V0SUNvbW1hbmQoKQotCQkJCQk6IG5ldyBDb21tYW5kUHJveHkoZXBDb21tYW5kKTsKLQkJCWNvbXBsZXRlZFJlcXVlc3Quc2V0UGFyYW1ldGVyKAotCQkJCQlEaWFncmFtQmFzZUVkaXRIZWxwZXIuRURJVF9QT0xJQ1lfQ09NTUFORCwgY29tbWFuZCk7Ci0JCX0KLQkJQ29tbWFuZCBlaENvbW1hbmQgPSBudWxsOwotCQlpZiAoZWxlbWVudFR5cGUgIT0gbnVsbCkgewotCQkJSUNvbW1hbmQgY29tbWFuZCA9IGVsZW1lbnRUeXBlLmdldEVkaXRDb21tYW5kKGNvbXBsZXRlZFJlcXVlc3QpOwotCQkJaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotCQkJCWlmICghKGNvbW1hbmQgaW5zdGFuY2VvZiBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCkpIHsKLQkJCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJCQkJY29tbWFuZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZChlZGl0aW5nRG9tYWluLAotCQkJCQkJCW51bGwpLmNvbXBvc2UoY29tbWFuZCk7Ci0JCQkJfQotCQkJCWVoQ29tbWFuZCA9IG5ldyBJQ29tbWFuZFByb3h5KGNvbW1hbmQpOwotCQkJfQotCQl9Ci0JCWJvb2xlYW4gc2hvdWxkUHJvY2VlZCA9IHRydWU7Ci0JCWlmIChjb21wbGV0ZWRSZXF1ZXN0IGluc3RhbmNlb2YgRGVzdHJveVJlcXVlc3QpIHsKLQkJCXNob3VsZFByb2NlZWQgPSBzaG91bGRQcm9jZWVkKChEZXN0cm95UmVxdWVzdCkgY29tcGxldGVkUmVxdWVzdCk7Ci0JCX0KLQkJaWYgKHNob3VsZFByb2NlZWQpIHsKLQkJCWlmIChjb21wbGV0ZWRSZXF1ZXN0IGluc3RhbmNlb2YgRGVzdHJveVJlcXVlc3QpIHsKLQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCQkJQ29tbWFuZCBkZWxldGVWaWV3Q29tbWFuZCA9IG5ldyBJQ29tbWFuZFByb3h5KAotCQkJCQkJbmV3IERlbGV0ZUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwgKFZpZXcpIGdldEhvc3QoKQotCQkJCQkJCQkuZ2V0TW9kZWwoKSkpOwotCQkJCWVoQ29tbWFuZCA9IGVoQ29tbWFuZCA9PSBudWxsID8gZGVsZXRlVmlld0NvbW1hbmQgOiBlaENvbW1hbmQKLQkJCQkJCS5jaGFpbihkZWxldGVWaWV3Q29tbWFuZCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZWhDb21tYW5kOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRTZW1hbnRpY0NvbW1hbmRTd2l0Y2goSUVkaXRDb21tYW5kUmVxdWVzdCByZXEpIHsKLQkJaWYgKHJlcSBpbnN0YW5jZW9mIENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0Q3JlYXRlQ29tbWFuZCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgQ29uZmlndXJlUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldENvbmZpZ3VyZUNvbW1hbmQoKENvbmZpZ3VyZVJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKChEZXN0cm95RWxlbWVudFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXREZXN0cm95UmVmZXJlbmNlQ29tbWFuZCgoRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0RHVwbGljYXRlQ29tbWFuZCgoRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIEdldEVkaXRDb250ZXh0UmVxdWVzdCkgewotCQkJcmV0dXJuIGdldEVkaXRDb250ZXh0Q29tbWFuZCgoR2V0RWRpdENvbnRleHRSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIE1vdmVSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0TW92ZUNvbW1hbmQoKE1vdmVSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIFJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldFJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwQ29tbWFuZCgoUmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgoUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIFNldFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRTZXRDb21tYW5kKChTZXRSZXF1ZXN0KSByZXEpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb25maWd1cmVDb21tYW5kKENvbmZpZ3VyZVJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0U2V0Q29tbWFuZChTZXRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RWRpdENvbnRleHRDb21tYW5kKEdldEVkaXRDb250ZXh0UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95UmVmZXJlbmNlQ29tbWFuZChEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldER1cGxpY2F0ZUNvbW1hbmQoRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNvbW1hbmQoTW92ZVJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNU0xXcmFwcGVyKElDb21tYW5kIGNtZCkgewotCQlyZXR1cm4gbmV3IElDb21tYW5kUHJveHkoY21kKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0U2VtYW50aWNFbGVtZW50KCkgewotCQlyZXR1cm4gVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudCgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIGNvbnRhaW5lciBlbGVtZW50IGZvciB0aGUgbmV3IHJlbGF0aW9uc2hpcCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBnb2VzIHVwIGJ5IGNvbnRhaW5tZW50IGhpZXJhcmNoeSBzdGFydGluZyBmcm9tCi0JICogdGhlIHNwZWNpZmllZCBlbGVtZW50IGFuZCByZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgaW5zdGFuY2Ugb2YKLQkgKiB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciBjbGFzcy4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKE9iamVjdCB1ZWxlbWVudCwKLQkJCUVDbGFzcyBjb250YWluZXJDbGFzcywgSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsKLQkJaWYgKHVlbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIHVlbGVtZW50OwotCQkJZm9yICg7IGVsZW1lbnQgIT0gbnVsbDsgZWxlbWVudCA9IGVsZW1lbnQuZUNvbnRhaW5lcigpKSB7Ci0JCQkJaWYgKGNvbnRhaW5lckNsYXNzLmlzU3VwZXJUeXBlT2YoZWxlbWVudC5lQ2xhc3MoKSkpIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgZWRpdGluZyBkb21haW4gZnJvbSB0aGUgaG9zdCBlZGl0IHBhcnQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotCQlyZXR1cm4gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY29tbWFuZCB0byBkZXN0cm95IHRoZSBsaW5rLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoVmlldyB2aWV3LCBib29sZWFuIGNvbmZpcm0pIHsKLQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGdldEhvc3QoKS5nZXRWaWV3ZXIoKQotCQkJCS5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KHZpZXcpOwotCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxdWVzdCA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoCi0JCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBjb25maXJtKTsKLQkJcmV0dXJuIGVkaXRQYXJ0LmdldENvbW1hbmQobmV3IEVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXIocmVxdWVzdCwKLQkJCQlDb2xsZWN0aW9ucy5FTVBUWV9NQVApKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGNvbW1hbmRzIHRvIGRlc3Ryb3kgYWxsIGhvc3QgaW5jb21pbmcgYW5kIG91dGdvaW5nIGxpbmtzLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG91bmRDb21tYW5kIGdldERlc3Ryb3lFZGdlc0NvbW1hbmQoYm9vbGVhbiBjb25maXJtKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHZpZXcuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQljbWQuYWRkKGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZCgoRWRnZSkgaXQubmV4dCgpLCBjb25maXJtKSk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHZpZXcuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQljbWQuYWRkKGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZCgoRWRnZSkgaXQubmV4dCgpLCBjb25maXJtKSk7Ci0JCX0KLQkJcmV0dXJuIGNtZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBMaW5rQ29uc3RyYWludHMgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuQ3JlYXRlTGlua18zMDAxKE5vZGUgY29udGFpbmVyLCBOb2RlIHNvdXJjZSwKLQkJCQlOb2RlIHRhcmdldCkgewotCQkJcmV0dXJuIGNhbkV4aXN0TGlua18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5FeGlzdExpbmtfMzAwMShOb2RlIGNvbnRhaW5lciwgTm9kZSBzb3VyY2UsCi0JCQkJTm9kZSB0YXJnZXQpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUV4dE5vZGVMYWJlbEhvc3RMYXlvdXRFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1FeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTc4MTBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUV4dE5vZGVMYWJlbEhvc3RMYXlvdXRFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkdyb3VwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5YWUxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUV4dE5vZGVMYWJlbEhvc3RMYXlvdXRFZGl0UG9saWN5IGV4dGVuZHMgWFlMYXlvdXRFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExheW91dEVkaXRQb2xpY3kgcmVhbExheW91dEVkaXRQb2xpY3k7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExheW91dEVkaXRQb2xpY3kgZ2V0UmVhbExheW91dEVkaXRQb2xpY3koKSB7Ci0JCXJldHVybiByZWFsTGF5b3V0RWRpdFBvbGljeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhbExheW91dEVkaXRQb2xpY3koTGF5b3V0RWRpdFBvbGljeSByZWFsTGF5b3V0RWRpdFBvbGljeSkgewotCQl0aGlzLnJlYWxMYXlvdXRFZGl0UG9saWN5ID0gcmVhbExheW91dEVkaXRQb2xpY3k7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRXh0ZXJuYWxMYWJlbChFZGl0UGFydCBlZGl0UGFydCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0IGdldEV4dGVybmFsTGFiZWxzKEdyb3VwUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUxpc3QgZWRpdFBhcnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocmVxdWVzdC5nZXRFZGl0UGFydHMoKSAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVxdWVzdC5nZXRFZGl0UGFydHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGl0Lm5leHQoKTsKLQkJCQlpZiAoaXNFeHRlcm5hbExhYmVsKGVkaXRQYXJ0KSkgewotCQkJCQllZGl0UGFydHMuYWRkKGVkaXRQYXJ0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVkaXRQYXJ0czsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKFJFUV9NT1ZFX0NISUxEUkVOLmVxdWFscyhyZXF1ZXN0LmdldFR5cGUoKSkpIHsKLQkJCUNoYW5nZUJvdW5kc1JlcXVlc3QgY2JSZXF1ZXN0ID0gKENoYW5nZUJvdW5kc1JlcXVlc3QpIHJlcXVlc3Q7Ci0JCQlMaXN0IGV4dExhYmVscyA9IGdldEV4dGVybmFsTGFiZWxzKGNiUmVxdWVzdCk7Ci0JCQlpZiAoIWV4dExhYmVscy5pc0VtcHR5KCkpIHsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGNiUmVxdWVzdC5nZXRFZGl0UGFydHMoKTsKLQkJCQlDb21tYW5kIGNtZCA9IG51bGw7Ci0JCQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwKLQkJCQkJCSYmIGVkaXRQYXJ0cy5zaXplKCkgPiBleHRMYWJlbHMuc2l6ZSgpKSB7Ci0JCQkJCUxpc3Qgb3RoZXIgPSBuZXcgQXJyYXlMaXN0KGVkaXRQYXJ0cyk7Ci0JCQkJCW90aGVyLnJlbW92ZUFsbChleHRMYWJlbHMpOwotCQkJCQljYlJlcXVlc3Quc2V0RWRpdFBhcnRzKG90aGVyKTsKLQkJCQkJY21kID0gcmVhbExheW91dEVkaXRQb2xpY3kuZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLQkJCQl9Ci0JCQkJY2JSZXF1ZXN0LnNldEVkaXRQYXJ0cyhleHRMYWJlbHMpOwotCQkJCUNvbW1hbmQgZXh0TGFiZWxzQ21kID0gZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChyZXF1ZXN0KTsKLQkJCQljYlJlcXVlc3Quc2V0RWRpdFBhcnRzKGVkaXRQYXJ0cyk7Ci0JCQkJcmV0dXJuIGNtZCA9PSBudWxsID8gZXh0TGFiZWxzQ21kIDogY21kLmNoYWluKGV4dExhYmVsc0NtZCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBHcm91cFJlcXVlc3QpIHsKLQkJCUxpc3QgZXh0TGFiZWxzID0gZ2V0RXh0ZXJuYWxMYWJlbHMoKEdyb3VwUmVxdWVzdCkgcmVxdWVzdCk7Ci0JCQlpZiAoIWV4dExhYmVscy5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVhbExheW91dEVkaXRQb2xpY3kgPT0gbnVsbCA/IG51bGwgOiByZWFsTGF5b3V0RWRpdFBvbGljeQotCQkJCS5nZXRDb21tYW5kKHJlcXVlc3QpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnN0cmFpbnRGb3IoQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0LAotCQkJR3JhcGhpY2FsRWRpdFBhcnQgY2hpbGQpIHsKLQkJaW50IGR4ID0gKChJbnRlZ2VyKSBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKChWaWV3KSBjaGlsZAotCQkJCS5nZXRNb2RlbCgpLCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKSkpCi0JCQkJLmludFZhbHVlKCk7Ci0JCWludCBkeSA9ICgoSW50ZWdlcikgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSgoVmlldykgY2hpbGQKLQkJCQkuZ2V0TW9kZWwoKSwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkpKQotCQkJCS5pbnRWYWx1ZSgpOwotCQlSZWN0YW5nbGUgciA9IG5ldyBSZWN0YW5nbGUoZHgsIGR5LCAwLCAwKTsKLQkJY2hpbGQuZ2V0RmlndXJlKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShyKTsKLQkJci50cmFuc2xhdGUocmVxdWVzdC5nZXRNb3ZlRGVsdGEoKSk7Ci0JCWNoaWxkLmdldEZpZ3VyZSgpLnRyYW5zbGF0ZVRvUmVsYXRpdmUocik7Ci0JCXJldHVybiByOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXEpIHsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwKLQkJCQkmJiByZWFsTGF5b3V0RWRpdFBvbGljeS51bmRlcnN0YW5kc1JlcXVlc3QocmVxKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnVuZGVyc3RhbmRzUmVxdWVzdChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZUNoaWxkKEVkaXRQYXJ0IGNoaWxkKSB7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhvc3QoRWRpdFBhcnQgaG9zdCkgewotCQlzdXBlci5zZXRIb3N0KGhvc3QpOwotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuc2V0SG9zdChob3N0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuYWN0aXZhdGUoKTsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LmFjdGl2YXRlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuZGVhY3RpdmF0ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRUYXJnZXRFZGl0UGFydChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJldHVybiByZWFsTGF5b3V0RWRpdFBvbGljeS5nZXRUYXJnZXRFZGl0UGFydChyZXF1ZXN0KTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBzdXBlci5nZXRUYXJnZXRFZGl0UGFydChyZXF1ZXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93U291cmNlRmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5zaG93U291cmNlRmVlZGJhY2socmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5zaG93U291cmNlRmVlZGJhY2socmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZXJhc2VTb3VyY2VGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LmVyYXNlU291cmNlRmVlZGJhY2socmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5lcmFzZVNvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dUYXJnZXRGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LnNob3dUYXJnZXRGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnNob3dUYXJnZXRGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlcmFzZVRhcmdldEZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuZXJhc2VUYXJnZXRGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmVyYXNlVGFyZ2V0RmVlZGJhY2socmVxdWVzdCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1HcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNlN2JmOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1HcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuZWRpdGhlbHBlcnMuQ3JlYXRlRWxlbWVudFJlcXVlc3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVDb25uZWN0aW9uVmlld0FuZEVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzLkRpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcyBHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElFbGVtZW50VHlwZSBnZXRFbGVtZW50VHlwZShDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ3JlYXRlQ29ubmVjdGlvblZpZXdBbmRFbGVtZW50UmVxdWVzdCkgewotCQkJQ3JlYXRlRWxlbWVudFJlcXVlc3RBZGFwdGVyIHJlcXVlc3RBZGFwdGVyID0gKChDcmVhdGVDb25uZWN0aW9uVmlld0FuZEVsZW1lbnRSZXF1ZXN0KSByZXF1ZXN0KQotCQkJCQkuZ2V0Q29ubmVjdGlvblZpZXdBbmRFbGVtZW50RGVzY3JpcHRvcigpCi0JCQkJCS5nZXRDcmVhdGVFbGVtZW50UmVxdWVzdEFkYXB0ZXIoKTsKLQkJCXJldHVybiAoSUVsZW1lbnRUeXBlKSByZXF1ZXN0QWRhcHRlci5nZXRBZGFwdGVyKElFbGVtZW50VHlwZS5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENvbm5lY3Rpb25XaXRoUmVvcmllbnRlZFZpZXdDb21wbGV0ZUNvbW1hbmQoCi0JCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUlDb21tYW5kUHJveHkgYyA9IChJQ29tbWFuZFByb3h5KSBzdXBlcgotCQkJCS5nZXRDb25uZWN0aW9uQ29tcGxldGVDb21tYW5kKHJlcXVlc3QpOwotCQlDb21wb3NpdGVDb21tYW5kIGNjID0gKENvbXBvc2l0ZUNvbW1hbmQpIGMuZ2V0SUNvbW1hbmQoKTsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kIHJjdkNvbW1hbmQgPSBuZXcgRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kKAotCQkJCWVkaXRpbmdEb21haW4sIG51bGwpOwotCQlyY3ZDb21tYW5kLnNldEVkZ2VBZGFwdG9yKGdldFZpZXdBZGFwdGVyKCkpOwotCQljYy5jb21wb3NlKHJjdkNvbW1hbmQpOwotCQlyZXR1cm4gYzsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1SZWZlcmVuY2VDb25uZWN0aW9uRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtUmVmZXJlbmNlQ29ubmVjdGlvbkVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ5NmZlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1SZWZlcmVuY2VDb25uZWN0aW9uRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RDb25uZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Db25uZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuR3JvdXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5FZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuR3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUmVmZXJlbmNlQ29ubmVjdGlvbkVkaXRQb2xpY3kgZXh0ZW5kcyBDb25uZWN0aW9uRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9GUk9NX0RJQUdSQU1fRExHX1RJVExFID0gRGlhZ3JhbVVJTWVzc2FnZXMuUHJvbXB0aW5nRGVsZXRlQWN0aW9uX0RlbGV0ZUZyb21EaWFncmFtRGlhbG9nX1RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfRlJPTV9ESUFHUkFNX0RMR19NRVNTQUdFID0gRGlhZ3JhbVVJTWVzc2FnZXMuUHJvbXB0aW5nRGVsZXRlQWN0aW9uX0RlbGV0ZUZyb21EaWFncmFtRGlhbG9nX01lc3NhZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9GUk9NX01PREVMX0RMR19UT0dHTEVfTEFCRUwgPSBEaWFncmFtVUlNZXNzYWdlcy5NZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZV9Eb05vdFByb21wdEFnYWluVG9nZ2xlX2xhYmVsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoR3JvdXBSZXF1ZXN0IGRlbGV0ZVJlcXVlc3QpIHsKLQkJYm9vbGVhbiBpc0RlbGV0ZUZyb21LZXlCb2FyZCA9IGRlbGV0ZVJlcXVlc3QgaW5zdGFuY2VvZiBHcm91cFJlcXVlc3RWaWFLZXlib2FyZDsKLQkJaWYgKHNob3VsZERlbGV0ZVNlbWFudGljKCkpIHsKLQkJCXJldHVybiBjcmVhdGVEZWxldGVTZW1hbnRpY0NvbW1hbmQoZGVsZXRlUmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlib29sZWFuIHByb2NlZWRUb0RlbGV0ZVZpZXcgPSB0cnVlOwotCQkJaWYgKGlzRGVsZXRlRnJvbUtleUJvYXJkKSB7Ci0JCQkJR3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQgZ3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQgPSAoR3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQpIGRlbGV0ZVJlcXVlc3Q7Ci0JCQkJaWYgKGdyb3VwUmVxdWVzdFZpYUtleWJvYXJkLmlzU2hvd0luZm9ybWF0aW9uRGlhbG9nKCkpIHsKLQkJCQkJcHJvY2VlZFRvRGVsZXRlVmlldyA9IHNob3dQcm9tcHQoKTsKLQkJCQkJZ3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQuc2V0U2hvd0luZm9ybWF0aW9uRGlhbG9nKGZhbHNlKTsKLQkJCQkJaWYgKCEocHJvY2VlZFRvRGVsZXRlVmlldykpCi0JCQkJCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY3JlYXRlRGVsZXRlVmlld0NvbW1hbmQoZGVsZXRlUmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlU2VtYW50aWMoKSB7Ci0JCUFzc2VydC5pc1RydWUoZ2V0SG9zdCgpIGluc3RhbmNlb2YgQWJzdHJhY3RDb25uZWN0aW9uRWRpdFBhcnQpOwotCQlBYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydCBjZXAgPSAoQWJzdHJhY3RDb25uZWN0aW9uRWRpdFBhcnQpIGdldEhvc3QoKTsKLQkJYm9vbGVhbiBpc0Nhbm9uaWNhbCA9IGZhbHNlOwotCQlpZiAoY2VwLmdldFNvdXJjZSgpICE9IG51bGwpCi0JCQlpc0Nhbm9uaWNhbCA9IElzQ2Fub25pY2FsKGNlcC5nZXRTb3VyY2UoKSk7Ci0JCWlmIChjZXAuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkKLQkJCXJldHVybiBpc0Nhbm9uaWNhbCA/IGlzQ2Fub25pY2FsIDogSXNDYW5vbmljYWwoY2VwLmdldFRhcmdldCgpKTsKLQkJcmV0dXJuIGlzQ2Fub25pY2FsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gSXNDYW5vbmljYWwoRWRpdFBhcnQgZXApIHsKLQkJRWRpdFBhcnQgcGFyZW50ID0gZXAuZ2V0UGFyZW50KCk7Ci0JCXJldHVybiBwYXJlbnQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCA/ICgoR3JhcGhpY2FsRWRpdFBhcnQpIHBhcmVudCkKLQkJCQkuaXNDYW5vbmljYWwoKQotCQkJCTogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURlbGV0ZVZpZXdDb21tYW5kKEdyb3VwUmVxdWVzdCBkZWxldGVSZXF1ZXN0KSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCXJldHVybiBuZXcgSUNvbW1hbmRQcm94eShuZXcgRGVsZXRlQ29tbWFuZChlZGl0aW5nRG9tYWluLAotCQkJCShWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEZWxldGVTZW1hbnRpY0NvbW1hbmQoR3JvdXBSZXF1ZXN0IGRlbGV0ZVJlcXVlc3QpIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlciBzZW1SZXEgPSBuZXcgRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlcigKLQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGVkaXRpbmdEb21haW4sIGZhbHNlKSwgZGVsZXRlUmVxdWVzdAotCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpKTsKLQkJQ29tbWFuZCBzZW1hbnRpY0NtZCA9IGdldEhvc3QoKS5nZXRDb21tYW5kKHNlbVJlcSk7Ci0JCWlmIChzZW1hbnRpY0NtZCAhPSBudWxsICYmIHNlbWFudGljQ21kLmNhbkV4ZWN1dGUoKSkgewotCQkJQ29tcG91bmRDb21tYW5kIGNjID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotCQkJY2MuYWRkKHNlbWFudGljQ21kKTsKLQkJCXJldHVybiBjYzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNob3dQcm9tcHQoKSB7Ci0JCWJvb2xlYW4gcHJvbXB0ID0gKChJUHJlZmVyZW5jZVN0b3JlKSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpCi0JCQkJLmdldEJvb2xlYW4oSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9QUk9NUFRfT05fREVMX0ZST01fRElBR1JBTSk7Ci0JCWlmIChwcm9tcHQpCi0JCQlpZiAoc2hvd01lc3NhZ2VEaWFsb2coKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2hvd01lc3NhZ2VEaWFsb2coKSB7Ci0JCU1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlIGRpYWxvZyA9IE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlCi0JCQkJLm9wZW5ZZXNOb1F1ZXN0aW9uKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJCQlERUxFVEVfRlJPTV9ESUFHUkFNX0RMR19USVRMRSwKLQkJCQkJCURFTEVURV9GUk9NX0RJQUdSQU1fRExHX01FU1NBR0UsCi0JCQkJCQlERUxFVEVfRlJPTV9NT0RFTF9ETEdfVE9HR0xFX0xBQkVMLCBmYWxzZSwKLQkJCQkJCShJUHJlZmVyZW5jZVN0b3JlKSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCQkJCQkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpCi0JCQkJCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSwKLQkJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUFJPTVBUX09OX0RFTF9GUk9NX0RJQUdSQU0pOwotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBJRGlhbG9nQ29uc3RhbnRzLllFU19JRCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgR3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQpIHsKLQkJCXJldHVybiBnZXREZWxldGVDb21tYW5kKChHcm91cFJlcXVlc3QpIHJlcXVlc3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb21tYW5kKHJlcXVlc3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVRleHROb25SZXNpemFibGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1UZXh0Tm9uUmVzaXphYmxlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDQyZmM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVRleHROb25SZXNpemFibGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3lFeDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLkRyYWdFZGl0UGFydHNUcmFja2VyRXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1UZXh0Tm9uUmVzaXphYmxlRWRpdFBvbGljeSBleHRlbmRzIE5vblJlc2l6YWJsZUVkaXRQb2xpY3lFeCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJRmlndXJlIHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSUZpZ3VyZSBmb2N1c0ZlZWRiYWNrRmlndXJlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dQcmltYXJ5U2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJc2hvd1NlbGVjdGlvbigpOwotCQkJc2hvd0ZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQloaWRlU2VsZWN0aW9uKCk7Ci0JCQlhZGRGZWVkYmFjayhzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSA9IGNyZWF0ZVNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKCkpOwotCQkJcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0JCQloaWRlRm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlU2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJCXJlbW92ZUZlZWRiYWNrKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKTsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSA9IG51bGw7Ci0JCQl9Ci0JCQloaWRlRm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93Rm9jdXMoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJaGlkZUZvY3VzKCk7Ci0JCQlhZGRGZWVkYmFjayhmb2N1c0ZlZWRiYWNrRmlndXJlID0gY3JlYXRlRm9jdXNGZWVkYmFja0ZpZ3VyZSgpKTsKLQkJCXJlZnJlc2hGb2N1c0ZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZUZvY3VzKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZm9jdXNGZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlRmVlZGJhY2soZm9jdXNGZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJZm9jdXNGZWVkYmFja0ZpZ3VyZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlY3RhbmdsZSBnZXRGZWVkYmFja0JvdW5kcygpIHsKLQkJUmVjdGFuZ2xlIGJvdW5kczsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlib3VuZHMgPSAoKExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLmdldFRleHRCb3VuZHMoKTsKLQkJCWJvdW5kcy5pbnRlcnNlY3QoZ2V0SG9zdEZpZ3VyZSgpLmdldEJvdW5kcygpKTsKLQkJfSBlbHNlIHsKLQkJCWJvdW5kcyA9IGdldEhvc3RGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCX0KLQkJZ2V0SG9zdEZpZ3VyZSgpLmdldFBhcmVudCgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUoYm91bmRzKTsKLQkJZ2V0RmVlZGJhY2tMYXllcigpLnRyYW5zbGF0ZVRvUmVsYXRpdmUoYm91bmRzKTsKLQkJcmV0dXJuIGJvdW5kczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlU2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJTGFiZWwgZmVlZGJhY2tGaWd1cmUgPSBuZXcgTGFiZWwoKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldE9wYXF1ZSh0cnVlKTsKLQkJCWZlZWRiYWNrRmlndXJlCi0JCQkJCS5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubWVudUJhY2tncm91bmRTZWxlY3RlZCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZQotCQkJCQkuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVGb3JlZ3JvdW5kU2VsZWN0ZWQpOwotCQkJcmV0dXJuIGZlZWRiYWNrRmlndXJlOwotCQl9IGVsc2UgewotCQkJUmVjdGFuZ2xlRmlndXJlIGZlZWRiYWNrRmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOwotCQkJZmVlZGJhY2tGaWd1cmUuc2V0RmlsbChmYWxzZSk7Ci0JCQlyZXR1cm4gZmVlZGJhY2tGaWd1cmU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRm9jdXNGZWVkYmFja0ZpZ3VyZSgpIHsKLQkJcmV0dXJuIG5ldyBGaWd1cmUoKSB7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCQkJZ3JhcGhpY3MuZHJhd0ZvY3VzKGdldEJvdW5kcygpLmdldFJlc2l6ZWQoLTEsIC0xKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUxhYmVsKExhYmVsIHRhcmdldCkgewotCQlMYWJlbCBzb3VyY2UgPSAoTGFiZWwpIGdldEhvc3RGaWd1cmUoKTsKLQkJdGFyZ2V0LnNldFRleHQoc291cmNlLmdldFRleHQoKSk7Ci0JCXRhcmdldC5zZXRUZXh0QWxpZ25tZW50KHNvdXJjZS5nZXRUZXh0QWxpZ25tZW50KCkpOwotCQl0YXJnZXQuc2V0Rm9udChzb3VyY2UuZ2V0Rm9udCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCkgewotCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCQl1cGRhdGVMYWJlbCgoTGFiZWwpIHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKTsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpLmV4cGFuZCg1LAotCQkJCQkJNSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb2N1c0ZlZWRiYWNrKCkgewotCQlpZiAoZm9jdXNGZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQlmb2N1c0ZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoRmVlZGJhY2soKSB7Ci0JCXJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpOwotCQlyZWZyZXNoRm9jdXNGZWVkYmFjaygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQlNb3ZlSGFuZGxlIG1vdmVIYW5kbGUgPSBuZXcgTW92ZUhhbmRsZSgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSk7Ci0JCW1vdmVIYW5kbGUuc2V0Qm9yZGVyKG51bGwpOwotCQltb3ZlSGFuZGxlLnNldERyYWdUcmFja2VyKG5ldyBEcmFnRWRpdFBhcnRzVHJhY2tlckV4KGdldEhvc3QoKSkpOwotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtb3ZlSGFuZGxlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU2MzAwNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuU2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5IGV4dGVuZHMgU2VsZWN0aW9uRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJRmlndXJlIHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSUZpZ3VyZSBmb2N1c0ZlZWRiYWNrRmlndXJlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dQcmltYXJ5U2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJc2hvd1NlbGVjdGlvbigpOwotCQkJc2hvd0ZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQloaWRlU2VsZWN0aW9uKCk7Ci0JCQlhZGRGZWVkYmFjayhzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSA9IGNyZWF0ZVNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKCkpOwotCQkJcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0JCQloaWRlRm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlU2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJCXJlbW92ZUZlZWRiYWNrKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKTsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSA9IG51bGw7Ci0JCQl9Ci0JCQloaWRlRm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93Rm9jdXMoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJaGlkZUZvY3VzKCk7Ci0JCQlhZGRGZWVkYmFjayhmb2N1c0ZlZWRiYWNrRmlndXJlID0gY3JlYXRlRm9jdXNGZWVkYmFja0ZpZ3VyZSgpKTsKLQkJCXJlZnJlc2hGb2N1c0ZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZUZvY3VzKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZm9jdXNGZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlRmVlZGJhY2soZm9jdXNGZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJZm9jdXNGZWVkYmFja0ZpZ3VyZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlY3RhbmdsZSBnZXRGZWVkYmFja0JvdW5kcygpIHsKLQkJUmVjdGFuZ2xlIGJvdW5kczsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlib3VuZHMgPSAoKExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLmdldFRleHRCb3VuZHMoKTsKLQkJCWJvdW5kcy5pbnRlcnNlY3QoZ2V0SG9zdEZpZ3VyZSgpLmdldEJvdW5kcygpKTsKLQkJfSBlbHNlIHsKLQkJCWJvdW5kcyA9IGdldEhvc3RGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCX0KLQkJZ2V0SG9zdEZpZ3VyZSgpLmdldFBhcmVudCgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUoYm91bmRzKTsKLQkJZ2V0RmVlZGJhY2tMYXllcigpLnRyYW5zbGF0ZVRvUmVsYXRpdmUoYm91bmRzKTsKLQkJcmV0dXJuIGJvdW5kczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlU2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJTGFiZWwgZmVlZGJhY2tGaWd1cmUgPSBuZXcgTGFiZWwoKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldE9wYXF1ZSh0cnVlKTsKLQkJCWZlZWRiYWNrRmlndXJlCi0JCQkJCS5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubWVudUJhY2tncm91bmRTZWxlY3RlZCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZQotCQkJCQkuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVGb3JlZ3JvdW5kU2VsZWN0ZWQpOwotCQkJcmV0dXJuIGZlZWRiYWNrRmlndXJlOwotCQl9IGVsc2UgewotCQkJUmVjdGFuZ2xlRmlndXJlIGZlZWRiYWNrRmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOwotCQkJZmVlZGJhY2tGaWd1cmUuc2V0RmlsbChmYWxzZSk7Ci0JCQlyZXR1cm4gZmVlZGJhY2tGaWd1cmU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRm9jdXNGZWVkYmFja0ZpZ3VyZSgpIHsKLQkJcmV0dXJuIG5ldyBGaWd1cmUoKSB7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCQkJZ3JhcGhpY3MuZHJhd0ZvY3VzKGdldEJvdW5kcygpLmdldFJlc2l6ZWQoLTEsIC0xKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUxhYmVsKExhYmVsIHRhcmdldCkgewotCQlMYWJlbCBzb3VyY2UgPSAoTGFiZWwpIGdldEhvc3RGaWd1cmUoKTsKLQkJdGFyZ2V0LnNldFRleHQoc291cmNlLmdldFRleHQoKSk7Ci0JCXRhcmdldC5zZXRUZXh0QWxpZ25tZW50KHNvdXJjZS5nZXRUZXh0QWxpZ25tZW50KCkpOwotCQl0YXJnZXQuc2V0Rm9udChzb3VyY2UuZ2V0Rm9udCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCkgewotCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCQl1cGRhdGVMYWJlbCgoTGFiZWwpIHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKTsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpLmV4cGFuZCg1LAotCQkJCQkJNSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb2N1c0ZlZWRiYWNrKCkgewotCQlpZiAoZm9jdXNGZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQlmb2N1c0ZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoRmVlZGJhY2soKSB7Ci0JCXJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpOwotCQlyZWZyZXNoRm9jdXNGZWVkYmFjaygpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvTGlua0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvTGlua0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdjYjZlZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0xpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk3ZTQzOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZU5vZGVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYzI4ZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTBkYjlkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kcy5MaW5rQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kcy5MaW5rUmVvcmllbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNjID0gZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChyZXEKLQkJCQkuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlpZiAoRGlhZ3JhbUVsZW1lbnRUeXBlcy5MaW5rXzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdMaW5rXzMwMDFDb21tYW5kKHJlcSkKLQkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nTGlua18zMDAxQ29tbWFuZChyZXEpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdMaW5rXzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCU5vZGUgc291cmNlID0gKE5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCU5vZGUgY29udGFpbmVyID0gKE5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcihzb3VyY2UsCi0JCQkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlKCksIHJlcS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlTGlua18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBudWxsKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nTGlua18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJRU9iamVjdCB0YXJnZXRFT2JqZWN0ID0gcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIE5vZGUKLQkJCQl8fCBmYWxzZSA9PSB0YXJnZXRFT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJTm9kZSBzb3VyY2UgPSAoTm9kZSkgc291cmNlRU9iamVjdDsKLQkJTm9kZSB0YXJnZXQgPSAoTm9kZSkgdGFyZ2V0RU9iamVjdDsKLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKHNvdXJjZSwKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVMaW5rXzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShNb2RlbFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXROb2RlX091dGdvaW5nQ29ubmVjdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IExpbmtDcmVhdGVDb21tYW5kKHJlcSwgY29udGFpbmVyLCBzb3VyY2UsCi0JCQkJdGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlCi0JICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgewotCQljYXNlIExpbmtFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgTGlua1Jlb3JpZW50Q29tbWFuZChyZXEpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0NvbXBvc2l0ZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZTRmM2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0NvbXBvc2l0ZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5UYXNrTm9kZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJRU9iamVjdCBtb2RlbE9iamVjdCA9ICgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlFT2JqZWN0IG5leHRWYWx1ZTsKLQkJaW50IG5vZGVWSUQ7Ci0JCWZvciAoSXRlcmF0b3IgdmFsdWVzID0gKChOb2RlQ29udGFpbmVyKSBtb2RlbE9iamVjdCkuZ2V0Tm9kZXMoKQotCQkJCS5pdGVyYXRvcigpOyB2YWx1ZXMuaGFzTmV4dCgpOykgewotCQkJbmV4dFZhbHVlID0gKEVPYmplY3QpIHZhbHVlcy5uZXh0KCk7Ci0JCQlub2RlVklEID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXdPYmplY3QsCi0JCQkJCW5leHRWYWx1ZSk7Ci0JCQlzd2l0Y2ggKG5vZGVWSUQpIHsKLQkJCWNhc2UgUm9sZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIFRhc2tOb2RlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgKHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCkgfHwgdmlldy5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBOb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0NvbXBvc2l0ZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVUYXNrQ29tcG9zaXRlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcwNzI1NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVUYXNrQ29tcG9zaXRlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlEaWFncmFtR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0NvbXBvc2l0ZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYTRlZjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0NvbXBvc2l0ZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kcy5MaW5rQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kcy5MaW5rUmVvcmllbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzLlJvbGVOb2RlQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kcy5UYXNrTm9kZUNyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuVGFza05vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJaWYgKERpYWdyYW1FbGVtZW50VHlwZXMuUm9sZU5vZGVfMjAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShNb2RlbFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Tm9kZUNvbnRhaW5lcl9Ob2RlcygpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBSb2xlTm9kZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKERpYWdyYW1FbGVtZW50VHlwZXMuVGFza05vZGVfMjAwMiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShNb2RlbFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Tm9kZUNvbnRhaW5lcl9Ob2RlcygpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBUYXNrTm9kZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNjID0gZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChyZXEKLQkJCQkuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNjLCByZXEuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlpZiAodmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcS5zZXRFbGVtZW50VG9EZXN0cm95KHZpZXcpOwotCQl9Ci0JCWNjLmFkZChnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSkpOwotCQlyZXR1cm4gY2MudW53cmFwKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChDb21wb3VuZENvbW1hbmQgY21kLAotCQkJYm9vbGVhbiBjb25maXJtKSB7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIG5vZGUgPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgaXQKLQkJCQkJLm5leHQoKTsKLQkJCXN3aXRjaCAoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsKLQkJCWNhc2UgUm9sZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJY21kLmFkZChnZXREZXN0cm95RWxlbWVudENvbW1hbmQobm9kZSwgY29uZmlybSkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBUYXNrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQljbWQuYWRkKGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChub2RlLCBjb25maXJtKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlmb3IgKEl0ZXJhdG9yIGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgY25vZGUgPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgY2l0Ci0JCQkJCQkJLm5leHQoKTsKLQkJCQkJc3dpdGNoIChEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChEaWFncmFtRWxlbWVudFR5cGVzLkxpbmtfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0xpbmtfMzAwMUNvbW1hbmQocmVxKQotCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdMaW5rXzMwMDFDb21tYW5kKHJlcSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0xpbmtfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJTm9kZSBzb3VyY2UgPSAoTm9kZSkgc291cmNlRU9iamVjdDsKLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKHNvdXJjZSwKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVMaW5rXzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdMaW5rXzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgTm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlOb2RlIHNvdXJjZSA9IChOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlOb2RlIHRhcmdldCA9IChOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoc291cmNlLAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZSgpLCByZXEuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUxpbmtfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE5vZGVfT3V0Z29pbmdDb25uZWN0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgTGlua0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsIHNvdXJjZSwKLQkJCQl0YXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UKLQkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7Ci0JCWNhc2UgTGlua0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBMaW5rUmVvcmllbnRDb21tYW5kKHJlcSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2I4MzA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzCi0JCUNhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGU2NGQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvVGFza05vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1Rhc2tOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTk2NjU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvVGFza05vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9UYXNrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1Rhc2tOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JkMjZiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1Rhc2tOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlEaWFncmFtR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9UYXNrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvVGFza05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3Y2EyYzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9UYXNrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzLkxpbmtDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzLkxpbmtSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQljYy5hZGQoZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpKTsKLQkJcmV0dXJuIGNjLnVud3JhcCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChEaWFncmFtRWxlbWVudFR5cGVzLkxpbmtfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0xpbmtfMzAwMUNvbW1hbmQocmVxKQotCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdMaW5rXzMwMDFDb21tYW5kKHJlcSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0xpbmtfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJTm9kZSBzb3VyY2UgPSAoTm9kZSkgc291cmNlRU9iamVjdDsKLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKHNvdXJjZSwKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVMaW5rXzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdMaW5rXzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgTm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlOb2RlIHNvdXJjZSA9IChOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlOb2RlIHRhcmdldCA9IChOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoc291cmNlLAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZSgpLCByZXEuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUxpbmtfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE5vZGVfT3V0Z29pbmdDb25uZWN0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgTGlua0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsIHNvdXJjZSwKLQkJCQl0YXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UKLQkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7Ci0JCWNhc2UgTGlua0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBMaW5rUmVvcmllbnRDb21tYW5kKHJlcSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA0NTk0Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENvbXBvc2l0ZUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcwotCQlDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlFT2JqZWN0IG1vZGVsT2JqZWN0ID0gKChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCUVPYmplY3QgbmV4dFZhbHVlOwotCQlpbnQgbm9kZVZJRDsKLQkJZm9yIChJdGVyYXRvciB2YWx1ZXMgPSAoKE5vZGVDb250YWluZXIpIG1vZGVsT2JqZWN0KS5nZXROb2RlcygpCi0JCQkJLml0ZXJhdG9yKCk7IHZhbHVlcy5oYXNOZXh0KCk7KSB7Ci0JCQluZXh0VmFsdWUgPSAoRU9iamVjdCkgdmFsdWVzLm5leHQoKTsKLQkJCW5vZGVWSUQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlld09iamVjdCwKLQkJCQkJbmV4dFZhbHVlKTsKLQkJCWlmIChXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWSUQpIHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKQotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiAodmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKSB8fCB2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5vZGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWY2YTM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCURpYWdyYW1HcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgzMDU0Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzLkxpbmtDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzLkxpbmtSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUNyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJaWYgKERpYWdyYW1FbGVtZW50VHlwZXMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV8yMDAzID09IHJlcQotCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXROb2RlQ29udGFpbmVyX05vZGVzKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVDcmVhdGVDb21tYW5kKHJlcSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCWFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChjYywgcmVxLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJaWYgKHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXEuc2V0RWxlbWVudFRvRGVzdHJveSh2aWV3KTsKLQkJfQotCQljYy5hZGQoZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpKTsKLQkJcmV0dXJuIGNjLnVud3JhcCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoQ29tcG91bmRDb21tYW5kIGNtZCwKLQkJCWJvb2xlYW4gY29uZmlybSkgewotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBub2RlID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIGl0Ci0JCQkJCS5uZXh0KCk7Ci0JCQlzd2l0Y2ggKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7Ci0JCQljYXNlIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJY21kLmFkZChnZXREZXN0cm95RWxlbWVudENvbW1hbmQobm9kZSwgY29uZmlybSkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJZm9yIChJdGVyYXRvciBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0Ci0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIGNub2RlID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIGNpdAotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCXN3aXRjaCAoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlpZiAoRGlhZ3JhbUVsZW1lbnRUeXBlcy5MaW5rXzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdMaW5rXzMwMDFDb21tYW5kKHJlcSkKLQkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nTGlua18zMDAxQ29tbWFuZChyZXEpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdMaW5rXzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCU5vZGUgc291cmNlID0gKE5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCU5vZGUgY29udGFpbmVyID0gKE5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcihzb3VyY2UsCi0JCQkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlKCksIHJlcS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlTGlua18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBudWxsKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nTGlua18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJRU9iamVjdCB0YXJnZXRFT2JqZWN0ID0gcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIE5vZGUKLQkJCQl8fCBmYWxzZSA9PSB0YXJnZXRFT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJTm9kZSBzb3VyY2UgPSAoTm9kZSkgc291cmNlRU9iamVjdDsKLQkJTm9kZSB0YXJnZXQgPSAoTm9kZSkgdGFyZ2V0RU9iamVjdDsKLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKHNvdXJjZSwKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVMaW5rXzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShNb2RlbFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXROb2RlX091dGdvaW5nQ29ubmVjdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IExpbmtDcmVhdGVDb21tYW5kKHJlcSwgY29udGFpbmVyLCBzb3VyY2UsCi0JCQkJdGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlCi0JICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgewotCQljYXNlIExpbmtFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgTGlua1Jlb3JpZW50Q29tbWFuZChyZXEpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMxODhiNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kKLQkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVkOGEzYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kKLQkJZXh0ZW5kcyBEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NmZjZTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcwotCQlDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNDNlNDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCURpYWdyYW1HcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YTc1ZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHMuTGlua0NyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHMuTGlua1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNjID0gZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChyZXEKLQkJCQkuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlpZiAoRGlhZ3JhbUVsZW1lbnRUeXBlcy5MaW5rXzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdMaW5rXzMwMDFDb21tYW5kKHJlcSkKLQkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nTGlua18zMDAxQ29tbWFuZChyZXEpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdMaW5rXzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCU5vZGUgc291cmNlID0gKE5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCU5vZGUgY29udGFpbmVyID0gKE5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcihzb3VyY2UsCi0JCQkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlKCksIHJlcS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlTGlua18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBudWxsKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nTGlua18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJRU9iamVjdCB0YXJnZXRFT2JqZWN0ID0gcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIE5vZGUKLQkJCQl8fCBmYWxzZSA9PSB0YXJnZXRFT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJTm9kZSBzb3VyY2UgPSAoTm9kZSkgc291cmNlRU9iamVjdDsKLQkJTm9kZSB0YXJnZXQgPSAoTm9kZSkgdGFyZ2V0RU9iamVjdDsKLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKHNvdXJjZSwKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVMaW5rXzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShNb2RlbFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXROb2RlX091dGdvaW5nQ29ubmVjdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IExpbmtDcmVhdGVDb21tYW5kKHJlcSwgY29udGFpbmVyLCBzb3VyY2UsCi0JCQkJdGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlCi0JICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgewotCQljYXNlIExpbmtFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgTGlua1Jlb3JpZW50Q29tbWFuZChyZXEpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9BRERpYWdyYW1FZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvQUREaWFncmFtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOTFlMWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9BRERpYWdyYW1FZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5EZWxlZ2F0aW5nTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYXllcmVkUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuQURESW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5zZXJ2aWNlLkRpYWdyYW1SZXNldFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLkFjdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLk5vdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEFERGlhZ3JhbUVkaXRvciBleHRlbmRzIEFic3RyYWN0RGlhZ3JhbUVkaXRvciB7Ci0KLQlEaWFncmFtQWN0aW9uc1NlcnZpY2UgYWN0aW9uU2VydmljZSA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJc3VwZXIuY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCk7Ci0JCURpYWdyYW1Sb290RWRpdFBhcnQgcm9vdCA9IChEaWFncmFtUm9vdEVkaXRQYXJ0KSBnZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCkKLQkJCQkuZ2V0Um9vdEVkaXRQYXJ0KCk7Ci0JCUxheWVyZWRQYW5lIHByaW50YWJsZUxheWVycyA9IChMYXllcmVkUGFuZSkgcm9vdAotCQkJCS5nZXRMYXllcihMYXllckNvbnN0YW50cy5QUklOVEFCTEVfTEFZRVJTKTsKLQkJRnJlZWZvcm1MYXllciBleHRMYWJlbHNMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCWV4dExhYmVsc0xheWVyLnNldExheW91dE1hbmFnZXIobmV3IERlbGVnYXRpbmdMYXlvdXQoKSk7Ci0vLwkJcHJpbnRhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoZXh0TGFiZWxzTGF5ZXIsCi0vLwkJCQlEaWFncmFtRWRpdFBhcnRGYWN0b3J5LkVYVEVSTkFMX05PREVfTEFCRUxTX0xBWUVSLAotLy8JCQkJTGF5ZXJDb25zdGFudHMuUFJJTUFSWV9MQVlFUik7Ci0JCUxheWVyZWRQYW5lIHNjYWxhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlNDQUxBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgc2NhbGVkRmVlZGJhY2tMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCXNjYWxlZEZlZWRiYWNrTGF5ZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXNjYWxhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoc2NhbGVkRmVlZGJhY2tMYXllciwKLQkJCQlMYXllckNvbnN0YW50cy5TQ0FMRURfRkVFREJBQ0tfTEFZRVIsCi0JCQkJRGlhZ3JhbVJvb3RFZGl0UGFydC5ERUNPUkFUSU9OX1VOUFJJTlRBQkxFX0xBWUVSKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRHcmFwaGljYWxWaWV3ZXIoR3JhcGhpY2FsVmlld2VyIHZpZXdlcikgewotCQlzdXBlci5zZXRHcmFwaGljYWxWaWV3ZXIodmlld2VyKTsKLQkJaWYoYWN0aW9uU2VydmljZSAhPSBudWxsKXsKLQkJCWFjdGlvblNlcnZpY2Uuc2V0R3JhcGhpY2FsVmlld2VyKHZpZXdlcik7Ci0JCX0KLQl9Ci0JLyoqCi0JICogQGF1dGhvciBza2Fubm9vcgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFuVXBEaWFncmFtKCkgewotCQlEaWFncmFtUmVzZXRTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgRGlhZ3JhbVJlc2V0U2VydmljZShnZXREaWFncmFtTWFuYWdlcigpLmdldEVkaXRpbmdEb21haW4oKSwKLQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKSwgZ2V0RWRpdERvbWFpbigpLCBnZXRBY3Rpb25SZWdpc3RyeSgpKTsKLQkJc2VydmljZS5jbGVhblVwRGlhZ3JhbSgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3IjY29udHJpYnV0ZVRvQ29udGV4dE1lbnUob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Db250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlzdXBlci5jb250cmlidXRlVG9Db250ZXh0TWVudShtZW51KTsKLQotCQkKLQkJYm9vbGVhbiBjYW5Nb2RpZnkgPSBpc0VkaXRhYmxlKCk7Ci0KLQkJSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihEaWFncmFtQ29uc3RhbnRzLlJFU0VUX0RJQUdSQU1fTEFZT1VUKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCW1lbnUuaW5zZXJ0QmVmb3JlKEFjdGlvbklkcy5BQ1RJT05fU0hPV19QUk9QRVJUSUVTX1ZJRVcsIGFjdGlvbik7Ci0JCX0KLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IG1lbnUuZmluZChBY3Rpb25JZHMuQUNUSU9OX1RPT0xCQVJfQVJSQU5HRV9BTEwpOwotCQlpZihpdGVtICE9IG51bGwpewotCQkJaXRlbS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCQlJQ29udHJpYnV0aW9uSXRlbSBpdGVtMSA9IG1lbnUuZmluZChBY3Rpb25JZHMuTUVOVV9GT1JNQVQpOwotCQlpZihpdGVtMSAhPSBudWxsKXsKLQkJCWlmKGl0ZW0xIGluc3RhbmNlb2YgSU1lbnVNYW5hZ2VyKXsKLQkJCQkoKElNZW51TWFuYWdlcilpdGVtMSkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3IjY3JlYXRlQWN0aW9ucygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsKLQkJc3VwZXIuY3JlYXRlQWN0aW9ucygpOwotCQlBY3Rpb24gcmVzZXRMYXlvdXRBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcl9SZXNldERpYWdyYW1MYXlvdXRfdGV4dCkgeyAvLyROT04tTkxTLTEkCi0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvL2dldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKERpYWdyYW1Db25zdGFudHMuUkVGUkVTSCkucnVuKCk7Ci0JCQkJRGlhZ3JhbUVkaXRvclV0aWwucmVmcmVzaChnZXREaWFncmFtRWRpdFBhcnQoKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJaWYgKGdldEdyYXBoaWNhbFZpZXdlcigpLmdldENvbnRlbnRzKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgewotCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCBkZXAgPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJLmdldENvbnRlbnRzKCk7Ci0JCQkJCUxpc3Q8RWRpdFBhcnQ+IGxvY2FsID0gbmV3IEFycmF5TGlzdDxFZGl0UGFydD4oKTsKLQkJCQkJaWYoZGVwLmdldENoaWxkcmVuKCkgIT0gbnVsbCAmJiAhZGVwLmdldENoaWxkcmVuKCkuaXNFbXB0eSgpKXsKLQkJCQkJCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IGRlcC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkJCQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCWlmKCEobmV4dCBpbnN0YW5jZW9mIE5vdGVFZGl0UGFydCkpewotCQkJCQkJCQlsb2NhbC5hZGQoKEVkaXRQYXJ0KW5leHQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlkZXAuZ2V0UmVjZW50bHlBZGRlZFBhcnRzKCkuYWRkQWxsKGxvY2FsKTsKLQkJCQkJY2xlYW5VcERpYWdyYW0oKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlyZXR1cm4gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKS5zaXplKCkgPT0gMDsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gRGlhZ3JhbUNvbnN0YW50cy5SRVNFVF9ESUFHUkFNX0xBWU9VVDsKLQkJCX0KLQotCQl9OwotCQlyZXNldExheW91dEFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihBRERJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfUkVTRVRfRElBR1JBTV9MQVlPVVQpOwotCQlyZXNldExheW91dEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoQURESW1hZ2VzLklNR19ERVNDX1JFU0VUX0RJQUdSQU1fTEFZT1VUKTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihyZXNldExheW91dEFjdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlc2V0TGF5b3V0KCkgewotCQlpZigoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSlnZXREaWFncmFtKCkuZ2V0RWxlbWVudCgpKS5pc0F1dG9MYXlvdXQoKSl7Ci0JCQlJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKERpYWdyYW1Db25zdGFudHMuUkVTRVRfRElBR1JBTV9MQVlPVVQpOwotCQkJYWN0aW9uLnJ1bigpOwotCQl9Ci0JCWVsc2UgewotCQkJbGF5b3V0UmVjZW50bHlBZGRlZCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsYXlvdXRSZWNlbnRseUFkZGVkKCkgewotCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRDb250ZW50cygpLnJlZnJlc2goKTsKLQkJZ2V0RGlhZ3JhbUVkaXRQYXJ0KCkuZ2V0Vmlld3BvcnQoKS52YWxpZGF0ZSgpOwotCQljbGVhblVwRGlhZ3JhbSgpOwotCQlFT2JqZWN0IGRpYWdyYW1FbGVtZW50ID0gZ2V0RGlhZ3JhbSgpLmdldEVsZW1lbnQoKTsKLQkJaWYoZGlhZ3JhbUVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKXsKLQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSgoRGlhZ3JhbSlkaWFncmFtRWxlbWVudCkuZ2V0TGlua2VkRWxlbWVudCgpOwotCQkJaWYoVG5nVXRpbC5pc0xvY2tlZChhY3Rpdml0eSkpewotCQkJCS8vIEZsdXNoIGFsbCBjb21tYW5kcywgbWVhbnMgd2lsbCBub3Qgc2F2ZS4KLQkJCQlnZXRDb21tYW5kU3RhY2soKS5mbHVzaCgpOwotCQkJCS8vIEZpcmUgZGlydHkgZmxhZyBwcm9wZXJ0eSBjaGFuZ2UsIG5vIGRpcnR5IGZsYWcgb24gZWRpdG9yLgotCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnROYW1lUHJlZml4KCkgewotCQlyZXR1cm4gRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3ByZWZpeDsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldFBhcnRJbWFnZSgpIHsKLQkJcmV0dXJuIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJmdWxsL2V0b29sMTYvQURERWRpdG9yLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQkKLQkvKioKLQkgKiBDbGllbnRzIGNhbGwgdGhpcyBtZWV0aG9kIGlmIG5lZWRlZCB0byByZWZyZXNoIGFuZCBkbyByZXNldCBsYXlvdXQgZm9yIAotCSAqIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtIHdob3NlIGF0dHJpYnV0ZSBpcyBhdXRvbGF5b3V0ID0gdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW5SZXNldExheW91dEFjdGlvbigpewotCQlsYXlvdXRSZWNlbnRseUFkZGVkKCk7Ci0JCWlmKCgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKWdldERpYWdyYW0oKS5nZXRFbGVtZW50KCkpLmlzQXV0b0xheW91dCgpKXsKLQkJCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oRGlhZ3JhbUNvbnN0YW50cy5SRVNFVF9ESUFHUkFNX0xBWU9VVCk7Ci0JCQlhY3Rpb24ucnVuKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEyODdjMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS5lZGl0b3JzLklNZXRob2RFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLm1hcmtlci5NYXJrZXJOYXZpZ2F0aW9uU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRGlhZ3JhbURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5wYXJ0cy5EaWFncmFtRG9jdW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TYXZlQXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvciBleHRlbmRzIERpYWdyYW1Eb2N1bWVudEVkaXRvcgotCQlpbXBsZW1lbnRzIElHb3RvTWFya2VyLCBJTWV0aG9kRWRpdG9yIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JJRCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yKCkgewotCQlzdXBlcih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBhbGV0dGVSb290IGNyZWF0ZVBhbGV0dGVSb290KFBhbGV0dGVSb290IGV4aXN0aW5nUGFsZXR0ZVJvb3QpIHsKLQkJUGFsZXR0ZVJvb3Qgcm9vdCA9IHN1cGVyLmNyZWF0ZVBhbGV0dGVSb290KGV4aXN0aW5nUGFsZXR0ZVJvb3QpOwotCQluZXcgRGlhZ3JhbVBhbGV0dGVGYWN0b3J5KCkuZmlsbFBhbGV0dGUocm9vdCk7Ci0JCXJldHVybiByb290OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudFByb3ZpZGVyKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0Ci0JCQkJfHwgaW5wdXQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJc2V0RG9jdW1lbnRQcm92aWRlcihBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0RG9jdW1lbnRQcm92aWRlcigpKTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnNldERvY3VtZW50UHJvdmlkZXIoaW5wdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQkJTWFya2VyTmF2aWdhdGlvblNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nb3RvTWFya2VyKHRoaXMsIG1hcmtlcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCQlwZXJmb3JtU2F2ZUFzKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtU2F2ZUFzKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCVNoZWxsIHNoZWxsID0gZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0JCVNhdmVBc0RpYWxvZyBkaWFsb2cgPSBuZXcgU2F2ZUFzRGlhbG9nKHNoZWxsKTsKLQkJSUZpbGUgb3JpZ2luYWwgPSBpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQgPyAoKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCS5nZXRGaWxlKCkKLQkJCQk6IG51bGw7Ci0JCWlmIChvcmlnaW5hbCAhPSBudWxsKSB7Ci0JCQlkaWFsb2cuc2V0T3JpZ2luYWxGaWxlKG9yaWdpbmFsKTsKLQkJfQotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCUlEb2N1bWVudFByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkgewotCQkJLy8gZWRpdG9yIGhhcyBiZWVuIHByb2dyYW1tYXRpY2FsbHkgY2xvc2VkIHdoaWxlIHRoZSBkaWFsb2cgd2FzIG9wZW4KLQkJCXJldHVybjsKLQkJfQotCQlpZiAocHJvdmlkZXIuaXNEZWxldGVkKGlucHV0KSAmJiBvcmlnaW5hbCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkiVGhlIG9yaWdpbmFsIGZpbGUgJyd7MH0nJyBoYXMgYmVlbiBkZWxldGVkLiIsIG9yaWdpbmFsCi0JCQkJCQkJLmdldE5hbWUoKSk7Ci0JCQlkaWFsb2cuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJZGlhbG9nLnNldE1lc3NhZ2UobWVzc2FnZSwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKLQkJfQotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKLQkJCQlwcm9ncmVzc01vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVBhdGggZmlsZVBhdGggPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0JCWlmIChmaWxlUGF0aCA9PSBudWxsKSB7Ci0JCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKLQkJCQlwcm9ncmVzc01vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlGaWxlIGZpbGUgPSB3b3Jrc3BhY2VSb290LmdldEZpbGUoZmlsZVBhdGgpOwotCQlmaW5hbCBJRWRpdG9ySW5wdXQgbmV3SW5wdXQgPSBuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpOwotCQkvLyBDaGVjayBpZiB0aGUgZWRpdG9yIGlzIGFscmVhZHkgb3BlbgotCQlJRWRpdG9yTWF0Y2hpbmdTdHJhdGVneSBtYXRjaGluZ1N0cmF0ZWd5ID0gZ2V0RWRpdG9yRGVzY3JpcHRvcigpCi0JCQkJLmdldEVkaXRvck1hdGNoaW5nU3RyYXRlZ3koKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZnMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG1hdGNoaW5nU3RyYXRlZ3kubWF0Y2hlcyhlZGl0b3JSZWZzW2ldLCBuZXdJbnB1dCkpIHsKLQkJCQlNZXNzYWdlRGlhbG9nCi0JCQkJCQkub3Blbldhcm5pbmcoc2hlbGwsICJQcm9ibGVtIER1cmluZyBTYXZlIEFzLi4uIiwKLQkJCQkJCQkJIlNhdmUgY291bGQgbm90IGJlIGNvbXBsZXRlZC4gVGFyZ2V0IGZpbGUgaXMgYWxyZWFkeSBvcGVuIGluIGFub3RoZXIgZWRpdG9yLiIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXByb3ZpZGVyLmFib3V0VG9DaGFuZ2UobmV3SW5wdXQpOwotCQkJZ2V0RG9jdW1lbnRQcm92aWRlcihuZXdJbnB1dCkuc2F2ZURvY3VtZW50KHByb2dyZXNzTW9uaXRvciwKLQkJCQkJbmV3SW5wdXQsCi0JCQkJCWdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChnZXRFZGl0b3JJbnB1dCgpKSwgdHJ1ZSk7Ci0JCQlzdWNjZXNzID0gdHJ1ZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IHguZ2V0U3RhdHVzKCk7Ci0JCQlpZiAoc3RhdHVzID09IG51bGwgfHwgc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5DQU5DRUwpIHsKLQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsICJTYXZlIFByb2JsZW1zIiwKLQkJCQkJCSJDb3VsZCBub3Qgc2F2ZSBmaWxlLiIsIHguZ2V0U3RhdHVzKCkpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJcHJvdmlkZXIuY2hhbmdlZChuZXdJbnB1dCk7Ci0JCQlpZiAoc3VjY2VzcykgewotCQkJCXNldElucHV0KG5ld0lucHV0KTsKLQkJCX0KLQkJfQotCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKLQkJCXByb2dyZXNzTW9uaXRvci5zZXRDYW5jZWxlZCghc3VjY2Vzcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXNIaW50IGdldFByZWZlcmVuY2VzSGludCgpIHsKLQkJcmV0dXJuIG5ldyBQcmVmZXJlbmNlc0hpbnQoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLklEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gSVByb3BlcnR5U2hlZXRQYWdlLmNsYXNzKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcih0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElEb2N1bWVudFByb3ZpZGVyIGdldERvY3VtZW50UHJvdmlkZXIoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQKLQkJCQl8fCBpbnB1dCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7Ci0JCQlyZXR1cm4gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RG9jdW1lbnRQcm92aWRlcihpbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRFZGl0b3JJbnB1dCgpICE9IG51bGwgPyBnZXREb2N1bWVudFByb3ZpZGVyKCkKLQkJCQkuZ2V0RG9jdW1lbnQoZ2V0RWRpdG9ySW5wdXQoKSkgOiBudWxsOwotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJRGlhZ3JhbURvY3VtZW50KSB7Ci0JCQlyZXR1cm4gKChJRGlhZ3JhbURvY3VtZW50KSBkb2N1bWVudCkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Yzk2ZTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5BY3Rpdml0eURldGFpbERpYWdyYW1QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXIuTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIEBtb2RpZmllZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luIGV4dGVuZHMKLQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtUGx1Z2luIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQcmVmZXJlbmNlc0hpbnQgRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UID0gbmV3IFByZWZlcmVuY2VzSGludCgKLQkJCUlEKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4gaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIgbXlEb2N1bWVudFByb3ZpZGVyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4oKSB7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JCVByZWZlcmVuY2VzSGludC5yZWdpc3RlclByZWZlcmVuY2VTdG9yZShESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQsCi0JCQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlhZGFwdGVyRmFjdG9yeSA9IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQlhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCWluc3RhbmNlID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCUxpc3QgZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmaWxsSXRlbVByb3ZpZGVyRmFjdG9yaWVzKGZhY3Rvcmllcyk7Ci0JCXJldHVybiBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShmYWN0b3JpZXMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsSXRlbVByb3ZpZGVyRmFjdG9yaWVzKExpc3QgZmFjdG9yaWVzKSB7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IE1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IE1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRJdGVtUHJvdmlkZXJzQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJdGVtSW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBpdGVtKSB7Ci0JCUlJdGVtTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gKElJdGVtTGFiZWxQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoaXRlbSwgSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIEV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJbGFiZWxQcm92aWRlci5nZXRJbWFnZShpdGVtKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4KLQkgKiBwbHVnLWluIHJlbGF0aXZlIHBhdGguCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0QnVuZGxlZEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKElELCBwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNwZWN0cyBpbWFnZXMgcmVzaWRpbmcgaW4gYW55IHBsdWctaW4uIElmIHBhdGggaXMgcmVsYXRpdmUsCi0JICogdGhlbiB0aGlzIGJ1bmRsZSBpcyBsb29rZWQgdXAgZm9yIHRoZSBpbWFnZSwgb3RoZXJ3aXNlLCBmb3IgYWJzb2x1dGUgCi0JICogcGF0aCwgZmlyc3Qgc2VnbWVudCBpcyB0YWtlbiBhcyBpZCBvZiBwbHVnLWluIHdpdGggaW1hZ2UKLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byBpbWFnZSwgZWl0aGVyIGFic29sdXRlICh3aXRoIHBsdWctaW4gaWQgYXMgZmlyc3Qgc2VnbWVudCksIG9yIHJlbGF0aXZlIGZvciBidW5kbGVkIGltYWdlcwotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBmaW5kSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCWZpbmFsIElQYXRoIHAgPSBuZXcgUGF0aChwYXRoKTsKLQkJaWYgKHAuaXNBYnNvbHV0ZSgpICYmIHAuc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKHAuc2VnbWVudCgwKSwgcAotCQkJCQkucmVtb3ZlRmlyc3RTZWdtZW50cygxKS5tYWtlQWJzb2x1dGUoKS50b1N0cmluZygpKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBnZXRCdW5kbGVkSW1hZ2VEZXNjcmlwdG9yKHAubWFrZUFic29sdXRlKCkudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHN0cmluZyBmcm9tIHBsdWctaW4ncyByZXNvdXJjZSBidW5kbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0UmVzb3VyY2VTdHJpbmcoZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKSwgIiUiICsga2V5KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbiBwbHVnLWluIHJlbGF0aXZlIHBhdGguCi0JICogQ2xpZW50IGRvIG5vdCBuZWVkIHRvIGRpc3Bvc2UgdGhpcyBpbWFnZS4gSW1hZ2VzIHdpbGwgYmUgZGlzcG9zZWQgYXV0b21hdGljYWxseS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gaW1hZ2UgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0QnVuZGxlZEltYWdlKFN0cmluZyBwYXRoKSB7Ci0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChwYXRoKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQocGF0aCwgZ2V0QnVuZGxlZEltYWdlRGVzY3JpcHRvcihwYXRoKSk7Ci0JCQlpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocGF0aCk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIgZ2V0RG9jdW1lbnRQcm92aWRlcigpIHsKLQkJaWYgKG15RG9jdW1lbnRQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlteURvY3VtZW50UHJvdmlkZXIgPSBuZXcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gbXlEb2N1bWVudFByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgZXJyb3IpIHsKLQkJbG9nRXJyb3IoZXJyb3IsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aHJvd2FibGUgYWN0dWFsIGVycm9yIG9yIG51bGwgY291bGQgYmUgcGFzc2VkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvciwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlpZiAoZXJyb3IgPT0gbnVsbCAmJiB0aHJvd2FibGUgIT0gbnVsbCkgewotCQkJZXJyb3IgPSB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCWdldExvZygpLmxvZygKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCUlTdGF0dXMuT0ssIGVycm9yLCB0aHJvd2FibGUpKTsKLQkJZGVidWcoZXJyb3IsIHRocm93YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0luZm8oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJbG9nSW5mbyhtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGhyb3dhYmxlIGFjdHVhbCBlcnJvciBvciBudWxsIGNvdWxkIGJlIHBhc3NlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dJbmZvKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWlmIChtZXNzYWdlID09IG51bGwgJiYgdGhyb3dhYmxlICE9IG51bGwpIHsKLQkJCW1lc3NhZ2UgPSB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCWdldExvZygpLmxvZygKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJSVN0YXR1cy5PSywgbWVzc2FnZSwgdGhyb3dhYmxlKSk7Ci0JCWRlYnVnKG1lc3NhZ2UsIHRocm93YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBkZWJ1ZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4obWVzc2FnZSk7Ci0JCX0KLQkJaWYgKHRocm93YWJsZSAhPSBudWxsKSB7Ci0JCQl0aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbUNyZWF0aW9uV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1DcmVhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjRjYmE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbUNyZWF0aW9uV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLndpemFyZHMuRWRpdG9yQ3JlYXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNyZWF0aW9uV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1DcmVhdGlvbldpemFyZFBhZ2UgZGlhZ3JhbU1vZGVsRmlsZVBhZ2U7Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBkaWFncmFtOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gb3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IgPSB0cnVlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJV29ya2JlbmNoIGdldFdvcmtiZW5jaCgpIHsKLQkJcmV0dXJuIHdvcmtiZW5jaDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZpbmFsIFJlc291cmNlIGdldERpYWdyYW0oKSB7Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc09wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yKCkgewotCQlyZXR1cm4gb3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yKAotCQkJYm9vbGVhbiBvcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcikgewotCQl0aGlzLm9wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yID0gb3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlkaWFncmFtTW9kZWxGaWxlUGFnZSA9IG5ldyBEaWFncmFtQ3JlYXRpb25XaXphcmRQYWdlKAotCQkJCSJEaWFncmFtTW9kZWxGaWxlIiwgZ2V0U2VsZWN0aW9uKCksICJ4bWkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWRpYWdyYW1Nb2RlbEZpbGVQYWdlLnNldFRpdGxlKCJDcmVhdGUgQUREIERpYWdyYW0iKTsKLQkJZGlhZ3JhbU1vZGVsRmlsZVBhZ2UKLQkJCQkuc2V0RGVzY3JpcHRpb24oIlNlbGVjdCBmaWxlIHRoYXQgd2lsbCBjb250YWluIGRpYWdyYW0gYW5kIGRvbWFpbiBtb2RlbHMuIik7Ci0JCWFkZFBhZ2UoZGlhZ3JhbU1vZGVsRmlsZVBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKG51bGwpIHsKLQotCQkJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJZGlhZ3JhbSA9IERpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5jcmVhdGVEaWFncmFtKAotCQkJCQkJZGlhZ3JhbU1vZGVsRmlsZVBhZ2UuZ2V0VVJJKCksIG1vbml0b3IpOwotCQkJCWlmIChpc09wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yKCkgJiYgZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwub3BlbkRpYWdyYW0oZGlhZ3JhbSk7Ci0JCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRDb250YWluZXIoKS5nZXRTaGVsbCgpLAotCQkJCQkJCQkiRXJyb3Igb3BlbmluZyBkaWFncmFtIGVkaXRvciIsIG51bGwsIGUKLQkJCQkJCQkJCQkuZ2V0U3RhdHVzKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKGZhbHNlLCB0cnVlLCBvcCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSwKLQkJCQkJCSJDcmVhdGlvbiBQcm9ibGVtcyIsIG51bGwsICgoQ29yZUV4Y2VwdGlvbikgZQotCQkJCQkJCQkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpLmdldFN0YXR1cygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkiRXJyb3IgY3JlYXRpbmcgZGlhZ3JhbSIsIGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW0gIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMud29ya2JlbmNoID0gd29ya2JlbmNoOwotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJc2V0V2luZG93VGl0bGUoIk5ldyBBREQgRGlhZ3JhbSIpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkuZ2V0QnVuZGxlZEltYWdlRGVzY3JpcHRvcigiaWNvbnMvd2l6YmFuL05ld01vZGVsV2l6YXJkLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1DcmVhdGlvbldpemFyZFBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbUNyZWF0aW9uV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWY1ZTBkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbUNyZWF0aW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUud2l6YXJkcy5FZGl0b3JXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci51dGlsLkRpYWdyYW1GaWxlQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQ3JlYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmlsZUV4dGVuc2lvbjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUNyZWF0aW9uV2l6YXJkUGFnZShTdHJpbmcgcGFnZU5hbWUsCi0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIFN0cmluZyBmaWxlRXh0ZW5zaW9uKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lLCBzZWxlY3Rpb24pOwotCQl0aGlzLmZpbGVFeHRlbnNpb24gPSBmaWxlRXh0ZW5zaW9uOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIGNyZWF0ZSBmaWxlcyB3aXRoIHRoaXMgZXh0ZW5zaW9uLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIGZpbGVFeHRlbnNpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVUkkgZ2V0VVJJKCkgewotCQlyZXR1cm4gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZ2V0RmlsZVBhdGgoKS50b1N0cmluZygpLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGF0aCBnZXRGaWxlUGF0aCgpIHsKLQkJSVBhdGggcGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0JCWlmIChwYXRoID09IG51bGwpIHsKLQkJCXBhdGggPSBuZXcgUGF0aCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmcgZmlsZU5hbWUgPSBnZXRGaWxlTmFtZSgpOwotCQlpZiAoZmlsZU5hbWUgIT0gbnVsbCkgewotCQkJcGF0aCA9IHBhdGguYXBwZW5kKGZpbGVOYW1lKTsKLQkJfQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJc2V0RmlsZU5hbWUoRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLmdldFVuaXF1ZUZpbGVOYW1lKAotCQkJCWdldENvbnRhaW5lckZ1bGxQYXRoKCksIGdldEZpbGVOYW1lKCksIGdldEV4dGVuc2lvbigpKSk7Ci0JCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJaWYgKCFzdXBlci52YWxpZGF0ZVBhZ2UoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24oKTsKLQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsCi0JCQkJJiYgIWdldEZpbGVQYXRoKCkudG9TdHJpbmcoKS5lbmRzV2l0aCgiLiIgKyBleHRlbnNpb24pKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoCi0JCQkJCSJGaWxlIG5hbWUgc2hvdWxkIGhhdmUgJyd7MH0nJyBleHRlbnNpb24uIiwgZXh0ZW5zaW9uKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1EaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbURpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGJiZmVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbURpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMKLQkJRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0RWRpdG9yQ2xhc3MoKSB7Ci0JCXJldHVybiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IuY2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWRpdG9ySWQoKSB7Ci0JCXJldHVybiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IuSUQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMTdlNzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuT3BlcmF0aW9uSGlzdG9yeUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMuVmlld1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JUHJpbWFyeUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuSURpYWdyYW1HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5JRGlhZ3JhbVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS51dGlsLklERUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnV0aWwuRGlhZ3JhbUZpbGVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5HTUZFZGl0aW5nRG9tYWluRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVNRkNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLnV0aWwuV29ya3NwYWNlU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNYXAgb3VyU2F2ZU9wdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldFNhdmVPcHRpb25zKCkgewotCQlpZiAob3VyU2F2ZU9wdGlvbnMgPT0gbnVsbCkgewotCQkJb3VyU2F2ZU9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJb3VyU2F2ZU9wdGlvbnMucHV0KFhNSVJlc291cmNlLk9QVElPTl9FTkNPRElORywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCW91clNhdmVPcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fUkVDT1JEX1VOS05PV05fRkVBVFVSRSwKLQkJCQkJQm9vbGVhbi5UUlVFKTsKLQkJCW91clNhdmVPcHRpb25zLnB1dChSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRUQsCi0JCQkJCVJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRF9NRU1PUllfQlVGRkVSKTsKLQkJfQotCQlyZXR1cm4gb3VyU2F2ZU9wdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVuRGlhZ3JhbShSZXNvdXJjZSBkaWFncmFtKQotCQkJdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIEVkaXRVSVV0aWwub3BlbkVkaXRvcigoRU9iamVjdCkgZGlhZ3JhbS5nZXRDb250ZW50cygpLmdldCgwKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDaGFyc2V0KElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlmaWxlLnNldENoYXJzZXQoIlVURi04IiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBzZXQgY2hhcnNldCBmb3IgZmlsZSAiICsgZmlsZS5nZXRGdWxsUGF0aCgpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZUZpbGVOYW1lKElQYXRoIGNvbnRhaW5lckZ1bGxQYXRoLAotCQkJU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0JCWlmIChjb250YWluZXJGdWxsUGF0aCA9PSBudWxsKSB7Ci0JCQljb250YWluZXJGdWxsUGF0aCA9IG5ldyBQYXRoKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChmaWxlTmFtZSA9PSBudWxsIHx8IGZpbGVOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlmaWxlTmFtZSA9ICJkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlQYXRoIGZpbGVQYXRoID0gY29udGFpbmVyRnVsbFBhdGguYXBwZW5kKGZpbGVOYW1lKTsKLQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsICYmICFleHRlbnNpb24uZXF1YWxzKGZpbGVQYXRoLmdldEZpbGVFeHRlbnNpb24oKSkpIHsKLQkJCWZpbGVQYXRoID0gZmlsZVBhdGguYWRkRmlsZUV4dGVuc2lvbihleHRlbnNpb24pOwotCQl9Ci0JCWV4dGVuc2lvbiA9IGZpbGVQYXRoLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJZmlsZU5hbWUgPSBmaWxlUGF0aC5yZW1vdmVGaWxlRXh0ZW5zaW9uKCkubGFzdFNlZ21lbnQoKTsKLQkJaW50IGkgPSAxOwotCQl3aGlsZSAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5leGlzdHMoZmlsZVBhdGgpKSB7Ci0JCQlpKys7Ci0JCQlmaWxlUGF0aCA9IGNvbnRhaW5lckZ1bGxQYXRoLmFwcGVuZChmaWxlTmFtZSArIGkpOwotCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7Ci0JCQkJZmlsZVBhdGggPSBmaWxlUGF0aC5hZGRGaWxlRXh0ZW5zaW9uKGV4dGVuc2lvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbGVQYXRoLmxhc3RTZWdtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogUnVucyB0aGUgd2l6YXJkIGluIGEgZGlhbG9nLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuV2l6YXJkKFNoZWxsIHNoZWxsLCBXaXphcmQgd2l6YXJkLCBTdHJpbmcgc2V0dGluZ3NLZXkpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHBsdWdpbkRpYWxvZ1NldHRpbmdzID0gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJSURpYWxvZ1NldHRpbmdzIHdpemFyZERpYWxvZ1NldHRpbmdzID0gcGx1Z2luRGlhbG9nU2V0dGluZ3MKLQkJCQkuZ2V0U2VjdGlvbihzZXR0aW5nc0tleSk7Ci0JCWlmICh3aXphcmREaWFsb2dTZXR0aW5ncyA9PSBudWxsKSB7Ci0JCQl3aXphcmREaWFsb2dTZXR0aW5ncyA9IHBsdWdpbkRpYWxvZ1NldHRpbmdzCi0JCQkJCS5hZGROZXdTZWN0aW9uKHNldHRpbmdzS2V5KTsKLQkJfQotCQl3aXphcmQuc2V0RGlhbG9nU2V0dGluZ3Mod2l6YXJkRGlhbG9nU2V0dGluZ3MpOwotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKE1hdGgubWF4KDUwMCwgZGlhbG9nLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLngpLAotCQkJCTUwMCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB3aXRoaW4gYSB3b3Jrc3BhY2UgbW9kaWZ5IG9wZXJhdGlvbiBzaW5jZSBpdCBjcmVhdGVzIHJlc291cmNlcy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZSBjcmVhdGVEaWFncmFtKFVSSSBkaWFncmFtVVJJLAotCQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IEdNRkVkaXRpbmdEb21haW5GYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZUVkaXRpbmdEb21haW4oKTsKLQkJcHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzaygKLQkJCQlNZXNzYWdlcy5EaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbVByb2dyZXNzVGFzaywgMyk7Ci0JCWZpbmFsIFJlc291cmNlIGRpYWdyYW1SZXNvdXJjZSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKQotCQkJCS5jcmVhdGVSZXNvdXJjZShkaWFncmFtVVJJKTsKLQkJZmluYWwgU3RyaW5nIGRpYWdyYW1OYW1lID0gZGlhZ3JhbVVSSS5sYXN0U2VnbWVudCgpOwotCQlBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCgKLQkJCQllZGl0aW5nRG9tYWluLAotCQkJCU1lc3NhZ2VzLkRpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtQ29tbWFuZExhYmVsLAotCQkJCUNvbGxlY3Rpb25zLkVNUFRZX0xJU1QpIHsKLQkJCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoCi0JCQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW0gbW9kZWwgPSBjcmVhdGVJbml0aWFsTW9kZWwoKTsKLQkJCQlhdHRhY2hNb2RlbFRvUmVzb3VyY2UobW9kZWwsIGRpYWdyYW1SZXNvdXJjZSk7Ci0KLQkJCQlEaWFncmFtIGRpYWdyYW0gPSBWaWV3U2VydmljZQotCQkJCQkJLmNyZWF0ZURpYWdyYW0oCi0JCQkJCQkJCW1vZGVsLAotCQkJCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCwKLQkJCQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQlkaWFncmFtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7Ci0JCQkJCWRpYWdyYW0uc2V0TmFtZShkaWFncmFtTmFtZSk7Ci0JCQkJCWRpYWdyYW0uc2V0RWxlbWVudChtb2RlbCk7Ci0JCQkJfQotCi0JCQkJdHJ5IHsKLQotCQkJCQlkaWFncmFtUmVzb3VyY2UKLQkJCQkJCQkuc2F2ZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwKLQkJCQkJCQkJCS5nZXRTYXZlT3B0aW9ucygpKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0KLQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkJIlVuYWJsZSB0byBzdG9yZSBtb2RlbCBhbmQgZGlhZ3JhbSByZXNvdXJjZXMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoKTsKLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCU9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5LmdldE9wZXJhdGlvbkhpc3RvcnkoKS5leGVjdXRlKGNvbW1hbmQsCi0JCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCAxKSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBjcmVhdGUgbW9kZWwgYW5kIGRpYWdyYW0iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJc2V0Q2hhcnNldChXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShkaWFncmFtUmVzb3VyY2UpKTsKLQkJcmV0dXJuIGRpYWdyYW1SZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgZG9tYWluIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIGNhbnZhcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBY3Rpdml0eURldGFpbERpYWdyYW0gY3JlYXRlSW5pdGlhbE1vZGVsKCkgewotCQlyZXR1cm4gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eURldGFpbERpYWdyYW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9yZSBtb2RlbCBlbGVtZW50IGluIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGF0dGFjaE1vZGVsVG9SZXNvdXJjZShBY3Rpdml0eURldGFpbERpYWdyYW0gbW9kZWwsCi0JCQlSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZWxlY3RFbGVtZW50c0luRGlhZ3JhbSgKLQkJCUlEaWFncmFtV29ya2JlbmNoUGFydCBkaWFncmFtUGFydCwgTGlzdC8qRWRpdFBhcnQqL2VkaXRQYXJ0cykgewotCQlkaWFncmFtUGFydC5nZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCkuZGVzZWxlY3RBbGwoKTsKLQotCQlFZGl0UGFydCBmaXJzdFByaW1hcnkgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWRpdFBhcnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVkaXRQYXJ0IG5leHRQYXJ0ID0gKEVkaXRQYXJ0KSBpdC5uZXh0KCk7Ci0JCQlkaWFncmFtUGFydC5nZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCkuYXBwZW5kU2VsZWN0aW9uKG5leHRQYXJ0KTsKLQkJCWlmIChmaXJzdFByaW1hcnkgPT0gbnVsbCAmJiBuZXh0UGFydCBpbnN0YW5jZW9mIElQcmltYXJ5RWRpdFBhcnQpIHsKLQkJCQlmaXJzdFByaW1hcnkgPSBuZXh0UGFydDsKLQkJCX0KLQkJfQotCi0JCWlmICghZWRpdFBhcnRzLmlzRW1wdHkoKSkgewotCQkJZGlhZ3JhbVBhcnQuZ2V0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcigpLnJldmVhbCgKLQkJCQkJZmlyc3RQcmltYXJ5ICE9IG51bGwgPyBmaXJzdFByaW1hcnkgOiAoRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJCS5nZXQoMCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBmaW5kRWxlbWVudHNJbkRpYWdyYW1CeUlEKERpYWdyYW1FZGl0UGFydCBkaWFncmFtUGFydCwKLQkJCUVPYmplY3QgZWxlbWVudCwgTGlzdCBlZGl0UGFydENvbGxlY3RvcikgewotCQlJRGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoSURpYWdyYW1HcmFwaGljYWxWaWV3ZXIpIGRpYWdyYW1QYXJ0Ci0JCQkJLmdldFZpZXdlcigpOwotCQlmaW5hbCBpbnQgaW50aWFsTnVtT2ZFZGl0UGFydHMgPSBlZGl0UGFydENvbGxlY3Rvci5zaXplKCk7Ci0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWaWV3KSB7IC8vIHN1cHBvcnQgbm90YXRpb24gZWxlbWVudCBsb29rdXAKLQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSB2aWV3ZXIuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLmdldCgKLQkJCQkJZWxlbWVudCk7Ci0JCQlpZiAoZWRpdFBhcnQgIT0gbnVsbCkgewotCQkJCWVkaXRQYXJ0Q29sbGVjdG9yLmFkZChlZGl0UGFydCk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgZWxlbWVudElEID0gRU1GQ29yZVV0aWwuZ2V0UHJveHlJRChlbGVtZW50KTsKLQkJTGlzdCBhc3NvY2lhdGVkUGFydHMgPSB2aWV3ZXIuZmluZEVkaXRQYXJ0c0ZvckVsZW1lbnQoZWxlbWVudElELAotCQkJCUlHcmFwaGljYWxFZGl0UGFydC5jbGFzcyk7Ci0JCS8vIHBlcmZvcm0gdGhlIHBvc3NpYmxlIGhpZXJhcmNoeSBkaXNqb2ludCAtPiB0YWtlIHRoZSB0b3AtbW9zdCBwYXJ0cyBvbmx5Ci0JCWZvciAoSXRlcmF0b3IgZWRpdFBhcnRJdCA9IGFzc29jaWF0ZWRQYXJ0cy5pdGVyYXRvcigpOyBlZGl0UGFydEl0Ci0JCQkJLmhhc05leHQoKTspIHsKLQkJCUVkaXRQYXJ0IG5leHRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydEl0Lm5leHQoKTsKLQkJCUVkaXRQYXJ0IHBhcmVudFBhcnQgPSBuZXh0UGFydC5nZXRQYXJlbnQoKTsKLQkJCXdoaWxlIChwYXJlbnRQYXJ0ICE9IG51bGwgJiYgIWFzc29jaWF0ZWRQYXJ0cy5jb250YWlucyhwYXJlbnRQYXJ0KSkgewotCQkJCXBhcmVudFBhcnQgPSBwYXJlbnRQYXJ0LmdldFBhcmVudCgpOwotCQkJfQotCQkJaWYgKHBhcmVudFBhcnQgPT0gbnVsbCkgewotCQkJCWVkaXRQYXJ0Q29sbGVjdG9yLmFkZChuZXh0UGFydCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaW50aWFsTnVtT2ZFZGl0UGFydHMgPT0gZWRpdFBhcnRDb2xsZWN0b3Iuc2l6ZSgpKSB7Ci0JCQlpZiAoIWFzc29jaWF0ZWRQYXJ0cy5pc0VtcHR5KCkpIHsKLQkJCQllZGl0UGFydENvbGxlY3Rvci5hZGQoYXNzb2NpYXRlZFBhcnRzLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGVsZW1lbnQuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZpbmRFbGVtZW50c0luRGlhZ3JhbUJ5SUQoZGlhZ3JhbVBhcnQsIGVsZW1lbnQKLQkJCQkJCQkuZUNvbnRhaW5lcigpLCBlZGl0UGFydENvbGxlY3Rvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlZGl0UGFydENvbGxlY3Rvci5zaXplKCkgLSBpbnRpYWxOdW1PZkVkaXRQYXJ0czsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBWaWV3IGZpbmRWaWV3KERpYWdyYW1FZGl0UGFydCBkaWFncmFtRWRpdFBhcnQsCi0JCQlFT2JqZWN0IHRhcmdldEVsZW1lbnQsIExhenlFbGVtZW50MlZpZXdNYXAgbGF6eUVsZW1lbnQyVmlld01hcCkgewotCQlib29sZWFuIGhhc1N0cnVjdHVyYWxVUkkgPSBmYWxzZTsKLQkJaWYgKHRhcmdldEVsZW1lbnQuZVJlc291cmNlKCkgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZSkgewotCQkJaGFzU3RydWN0dXJhbFVSSSA9ICgoWE1MUmVzb3VyY2UpIHRhcmdldEVsZW1lbnQuZVJlc291cmNlKCkpCi0JCQkJCS5nZXRJRCh0YXJnZXRFbGVtZW50KSA9PSBudWxsOwotCQl9Ci0KLQkJVmlldyB2aWV3ID0gbnVsbDsKLQkJaWYgKGhhc1N0cnVjdHVyYWxVUkkKLQkJCQkmJiAhbGF6eUVsZW1lbnQyVmlld01hcC5nZXRFbGVtZW50MlZpZXdNYXAoKS5pc0VtcHR5KCkpIHsKLQkJCXZpZXcgPSAoVmlldykgbGF6eUVsZW1lbnQyVmlld01hcC5nZXRFbGVtZW50MlZpZXdNYXAoKS5nZXQoCi0JCQkJCXRhcmdldEVsZW1lbnQpOwotCQl9IGVsc2UgaWYgKGZpbmRFbGVtZW50c0luRGlhZ3JhbUJ5SUQoZGlhZ3JhbUVkaXRQYXJ0LCB0YXJnZXRFbGVtZW50LAotCQkJCWxhenlFbGVtZW50MlZpZXdNYXAuZWRpdFBhcnRUbXBIb2xkZXIpID4gMCkgewotCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGxhenlFbGVtZW50MlZpZXdNYXAuZWRpdFBhcnRUbXBIb2xkZXIKLQkJCQkJLmdldCgwKTsKLQkJCWxhenlFbGVtZW50MlZpZXdNYXAuZWRpdFBhcnRUbXBIb2xkZXIuY2xlYXIoKTsKLQkJCXZpZXcgPSBlZGl0UGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgVmlldyA/IChWaWV3KSBlZGl0UGFydAotCQkJCQkuZ2V0TW9kZWwoKSA6IG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gKHZpZXcgPT0gbnVsbCkgPyBkaWFncmFtRWRpdFBhcnQuZ2V0RGlhZ3JhbVZpZXcoKSA6IHZpZXc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTGF6eUVsZW1lbnQyVmlld01hcCB7Ci0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIE1hcCBlbGVtZW50MlZpZXdNYXA7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgVmlldyBzY29wZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBTZXQgZWxlbWVudFNldDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGZpbmFsIExpc3QgZWRpdFBhcnRUbXBIb2xkZXIgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBMYXp5RWxlbWVudDJWaWV3TWFwKFZpZXcgc2NvcGUsIFNldCBlbGVtZW50cykgewotCQkJdGhpcy5zY29wZSA9IHNjb3BlOwotCQkJdGhpcy5lbGVtZW50U2V0ID0gZWxlbWVudHM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGZpbmFsIE1hcCBnZXRFbGVtZW50MlZpZXdNYXAoKSB7Ci0JCQlpZiAoZWxlbWVudDJWaWV3TWFwID09IG51bGwpIHsKLQkJCQllbGVtZW50MlZpZXdNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCS8vIG1hcCBwb3NzaWJsZSBub3RhdGlvbiBlbGVtZW50cyB0byBpdHNlbGYgYXMgdGhlc2UgY2FuJ3QgYmUgZm91bmQgYnkgdmlldy5nZXRFbGVtZW50KCkKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudFNldC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmlldykgewotCQkJCQkJVmlldyB2aWV3ID0gKFZpZXcpIGVsZW1lbnQ7Ci0JCQkJCQlpZiAodmlldy5nZXREaWFncmFtKCkgPT0gc2NvcGUuZ2V0RGlhZ3JhbSgpKSB7Ci0JCQkJCQkJZWxlbWVudDJWaWV3TWFwLnB1dChlbGVtZW50LCBlbGVtZW50KTsgLy8gdGFrZSBvbmx5IHRob3NlIHRoYXQgcGFydCBvZiBvdXIgZGlhZ3JhbQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJYnVpbGRFbGVtZW50MlZpZXdNYXAoc2NvcGUsIGVsZW1lbnQyVmlld01hcCwgZWxlbWVudFNldCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXN0YXRpYyBNYXAgYnVpbGRFbGVtZW50MlZpZXdNYXAoVmlldyBwYXJlbnRWaWV3LCBNYXAgZWxlbWVudDJWaWV3TWFwLAotCQkJCVNldCBlbGVtZW50cykgewotCQkJaWYgKGVsZW1lbnRzLnNpemUoKSA9PSBlbGVtZW50MlZpZXdNYXAuc2l6ZSgpKQotCQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0KLQkJCWlmIChwYXJlbnRWaWV3LmlzU2V0RWxlbWVudCgpCi0JCQkJCSYmICFlbGVtZW50MlZpZXdNYXAuY29udGFpbnNLZXkocGFyZW50Vmlldy5nZXRFbGVtZW50KCkpCi0JCQkJCSYmIGVsZW1lbnRzLmNvbnRhaW5zKHBhcmVudFZpZXcuZ2V0RWxlbWVudCgpKSkgewotCQkJCWVsZW1lbnQyVmlld01hcC5wdXQocGFyZW50Vmlldy5nZXRFbGVtZW50KCksIHBhcmVudFZpZXcpOwotCQkJCWlmIChlbGVtZW50cy5zaXplKCkgPT0gZWxlbWVudDJWaWV3TWFwLnNpemUoKSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBhcmVudFZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCWJ1aWxkRWxlbWVudDJWaWV3TWFwKChWaWV3KSBpdC5uZXh0KCksIGVsZW1lbnQyVmlld01hcCwKLQkJCQkJCWVsZW1lbnRzKTsKLQkJCQlpZiAoZWxlbWVudHMuc2l6ZSgpID09IGVsZW1lbnQyVmlld01hcC5zaXplKCkpCi0JCQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGFyZW50Vmlldy5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJYnVpbGRFbGVtZW50MlZpZXdNYXAoKFZpZXcpIGl0Lm5leHQoKSwgZWxlbWVudDJWaWV3TWFwLAotCQkJCQkJZWxlbWVudHMpOwotCQkJCWlmIChlbGVtZW50cy5zaXplKCkgPT0gZWxlbWVudDJWaWV3TWFwLnNpemUoKSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwYXJlbnRWaWV3LmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlidWlsZEVsZW1lbnQyVmlld01hcCgoVmlldykgaXQubmV4dCgpLCBlbGVtZW50MlZpZXdNYXAsCi0JCQkJCQllbGVtZW50cyk7Ci0JCQkJaWYgKGVsZW1lbnRzLnNpemUoKSA9PSBlbGVtZW50MlZpZXdNYXAuc2l6ZSgpKQotCQkJCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCQkJfQotCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQkJfQotCX0gLy9MYXp5RWxlbWVudDJWaWV3TWFwCQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1EaWFncmFtRmlsZUNyZWF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbURpYWdyYW1GaWxlQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTFjMTljLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbURpYWdyYW1GaWxlQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLnV0aWwuSURFRWRpdG9yRmlsZUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnV0aWwuRGlhZ3JhbUZpbGVDcmVhdG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1EaWFncmFtRmlsZUNyZWF0b3IgZXh0ZW5kcyBJREVFZGl0b3JGaWxlQ3JlYXRvciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRGlhZ3JhbURpYWdyYW1GaWxlQ3JlYXRvciBJTlNUQU5DRSA9IG5ldyBEaWFncmFtRGlhZ3JhbUZpbGVDcmVhdG9yKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEaWFncmFtRmlsZUNyZWF0b3IgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAiLmFkZCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNmQxOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbURpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcwotCQlEaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpOwotCQlEaWFncmFtQ29yZVV0aWwuc2V0RGVmYXVsdEZvbnRQcmVmZXJlbmNlKGdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJRGlhZ3JhbUNvcmVVdGlsLmhpZGVDb25uZWN0aW9uSGFuZGxlcyhnZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtRG9jdW1lbnRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtRG9jdW1lbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTU0ZGNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLk11bHRpUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLkRlbXVsdGlwbGV4aW5nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLk5vdGlmaWNhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS51dGlsLldvcmtzcGFjZVN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuRGlhZ3JhbUVkaXRpbmdEb21haW5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5BYnN0cmFjdERvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkRpYWdyYW1Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRGlhZ3JhbURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRGlhZ3JhbURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmRvY3VtZW50LkZpbGVEaWFncmFtRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmRvY3VtZW50LkZpbGVEaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmludGVybmFsLkVkaXRvclN0YXR1c0NvZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pbnRlcm5hbC51dGlsLkRpYWdyYW1JT1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUucmVzb3VyY2VzLkdNRlJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRG9jdW1lbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RG9jdW1lbnRQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlEaWFncmFtRG9jdW1lbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnRJbmZvIGNyZWF0ZUVsZW1lbnRJbmZvKE9iamVjdCBlbGVtZW50KQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmFsc2UgPT0gZWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dAotCQkJCSYmIGZhbHNlID09IGVsZW1lbnQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQkJMCwKLQkJCQkJCQlOTFMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9JbmNvcnJlY3RJbnB1dEVycm9yLAotCQkJCQkJCQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0IiwKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dCIgfSksCi0JCQkJCQkJbnVsbCkpOwotCQl9Ci0JCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IChJRWRpdG9ySW5wdXQpIGVsZW1lbnQ7Ci0JCUlEaWFncmFtRG9jdW1lbnQgZG9jdW1lbnQgPSAoSURpYWdyYW1Eb2N1bWVudCkgY3JlYXRlRG9jdW1lbnQoZWRpdG9ySW5wdXQpOwotCi0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gbmV3IFJlc291cmNlU2V0SW5mbyhkb2N1bWVudCwgZWRpdG9ySW5wdXQpOwotCQlpbmZvLnNldE1vZGlmaWNhdGlvblN0YW1wKGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChpbmZvKSk7Ci0JCWluZm8uZlN0YXR1cyA9IG51bGw7Ci0JCXJldHVybiBpbmZvOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSURvY3VtZW50IGNyZWF0ZURvY3VtZW50KE9iamVjdCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmYWxzZSA9PSBlbGVtZW50IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0Ci0JCQkJJiYgZmFsc2UgPT0gZWxlbWVudCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCQkJbmV3IFN0YXR1cygKLQkJCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCQkwLAotCQkJCQkJCU5MUwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX0luY29ycmVjdElucHV0RXJyb3IsCi0JCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQiLAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0IiB9KSwKLQkJCQkJCQludWxsKSk7Ci0JCX0KLQkJSURvY3VtZW50IGRvY3VtZW50ID0gY3JlYXRlRW1wdHlEb2N1bWVudCgpOwotCQlzZXREb2N1bWVudENvbnRlbnQoZG9jdW1lbnQsIChJRWRpdG9ySW5wdXQpIGVsZW1lbnQpOwotCQlzZXR1cERvY3VtZW50KGVsZW1lbnQsIGRvY3VtZW50KTsKLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIFNldHMgdXAgdGhlIGdpdmVuIGRvY3VtZW50IGFzIGl0IHdvdWxkIGJlIHByb3ZpZGVkIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC4gVGhlCi0JICogY29udGVudCBvZiB0aGUgZG9jdW1lbnQgaXMgbm90IGNoYW5nZWQuIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBlbXB0eS4KLQkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgYmx1ZS1wcmludCBlbGVtZW50Ci0JICogQHBhcmFtIGRvY3VtZW50IHRoZSBkb2N1bWVudCB0byBzZXQgdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBEb2N1bWVudChPYmplY3QgZWxlbWVudCwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIGZvciBzdWJjbGFzc2VzCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgbG9uZyBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoUmVzb3VyY2VTZXRJbmZvIGluZm8pIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlpZiAoZmlsZS5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCQkJcmVzdWx0ICs9IGZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5sYXN0TW9kaWZpZWQoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQgKz0gZmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSURvY3VtZW50IGNyZWF0ZUVtcHR5RG9jdW1lbnQoKSB7Ci0JCURpYWdyYW1Eb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEaWFncmFtRG9jdW1lbnQoKTsKLQkJZG9jdW1lbnQuc2V0RWRpdGluZ0RvbWFpbihjcmVhdGVFZGl0aW5nRG9tYWluKCkpOwotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gY3JlYXRlRWRpdGluZ0RvbWFpbigpIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IERpYWdyYW1FZGl0aW5nRG9tYWluRmFjdG9yeQotCQkJCS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUVkaXRpbmdEb21haW4oKTsKLQkJZWRpdGluZ0RvbWFpbi5zZXRJRCgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLkVkaXRpbmdEb21haW4iKTsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBOb3RpZmljYXRpb25GaWx0ZXIgZGlhZ3JhbVJlc291cmNlTW9kaWZpZWRGaWx0ZXIgPSBOb3RpZmljYXRpb25GaWx0ZXIKLQkJCQkuY3JlYXRlTm90aWZpZXJGaWx0ZXIoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKS5hbmQoCi0JCQkJCQlOb3RpZmljYXRpb25GaWx0ZXIKLQkJCQkJCQkJLmNyZWF0ZUV2ZW50VHlwZUZpbHRlcihOb3RpZmljYXRpb24uQUREKSkuYW5kKAotCQkJCQkJTm90aWZpY2F0aW9uRmlsdGVyLmNyZWF0ZUZlYXR1cmVGaWx0ZXIoCi0JCQkJCQkJCVJlc291cmNlU2V0LmNsYXNzLAotCQkJCQkJCQlSZXNvdXJjZVNldC5SRVNPVVJDRV9TRVRfX1JFU09VUkNFUykpOwotCQllZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZUFkYXB0ZXJzKCkuYWRkKG5ldyBBZGFwdGVyKCkgewotCi0JCQlwcml2YXRlIE5vdGlmaWVyIG15VGFyZ2VyOwotCi0JCQlwdWJsaWMgTm90aWZpZXIgZ2V0VGFyZ2V0KCkgewotCQkJCXJldHVybiBteVRhcmdlcjsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJaWYgKGRpYWdyYW1SZXNvdXJjZU1vZGlmaWVkRmlsdGVyLm1hdGNoZXMobm90aWZpY2F0aW9uKSkgewotCQkJCQlPYmplY3QgdmFsdWUgPSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCQkJCSgoUmVzb3VyY2UpIHZhbHVlKS5zZXRUcmFja2luZ01vZGlmaWNhdGlvbih0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgewotCQkJCW15VGFyZ2VyID0gbmV3VGFyZ2V0OwotCQkJfQotCi0JCX0pOwotCi0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudENvbnRlbnQoSURvY3VtZW50IGRvY3VtZW50LCBJRWRpdG9ySW5wdXQgZWxlbWVudCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSURpYWdyYW1Eb2N1bWVudCBkaWFncmFtRG9jdW1lbnQgPSAoSURpYWdyYW1Eb2N1bWVudCkgZG9jdW1lbnQ7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiA9IGRpYWdyYW1Eb2N1bWVudC5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlJU3RvcmFnZSBzdG9yYWdlID0gKChGaWxlRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldFN0b3JhZ2UoKTsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IERpYWdyYW1JT1V0aWwubG9hZChkb21haW4sIHN0b3JhZ2UsIHRydWUsCi0JCQkJCWdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCWRvY3VtZW50LnNldENvbnRlbnQoZGlhZ3JhbSk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7Ci0JCQlVUkkgdXJpID0gKChVUklFZGl0b3JJbnB1dCkgZWxlbWVudCkuZ2V0VVJJKCk7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXJlc291cmNlID0gZG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UoCi0JCQkJCQl1cmkudHJpbUZyYWdtZW50KCksIGZhbHNlKTsKLQkJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCQlyZXNvdXJjZSA9IGRvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmNyZWF0ZVJlc291cmNlKAotCQkJCQkJCXVyaS50cmltRnJhZ21lbnQoKSk7Ci0JCQkJfQotCQkJCWlmICghcmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQl0cnkgewotCQkJCQkJTWFwIG9wdGlvbnMgPSBuZXcgSGFzaE1hcChHTUZSZXNvdXJjZUZhY3RvcnkKLQkJCQkJCQkJLmdldERlZmF1bHRMb2FkT3B0aW9ucygpKTsKLQkJCQkJCS8vIEBzZWUgMTcxMDYwIAotCQkJCQkJLy8gb3B0aW9ucy5wdXQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZS5PUFRJT05fUkVDT1JEX1VOS05PV05fRkVBVFVSRSwgQm9vbGVhbi5UUlVFKTsKLQkJCQkJCXJlc291cmNlLmxvYWQob3B0aW9ucyk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXJlc291cmNlLnVubG9hZCgpOwotCQkJCQkJdGhyb3cgZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9VbmFibGVUb0xvYWRSZXNvdXJjZUVycm9yKTsKLQkJCQl9Ci0JCQkJaWYgKHVyaS5mcmFnbWVudCgpICE9IG51bGwpIHsKLQkJCQkJRU9iamVjdCByb290RWxlbWVudCA9IHJlc291cmNlLmdldEVPYmplY3QodXJpLmZyYWdtZW50KCkpOwotCQkJCQlpZiAocm9vdEVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJCQlkb2N1bWVudC5zZXRDb250ZW50KChEaWFncmFtKSByb290RWxlbWVudCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3Qgcm9vdEVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQkJCQlpZiAocm9vdEVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJCQkJZG9jdW1lbnQuc2V0Q29udGVudCgoRGlhZ3JhbSkgcm9vdEVsZW1lbnQpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX05vRGlhZ3JhbUluUmVzb3VyY2VFcnJvcik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUNvcmVFeGNlcHRpb24gdGhyb3duRXhjcCA9IG51bGw7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQkJCXRocm93bkV4Y3AgPSAoQ29yZUV4Y2VwdGlvbikgZTsKLQkJCQl9IGVsc2UgewotCQkJCQlTdHJpbmcgbXNnID0gZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCQkJCXRocm93bkV4Y3AgPSBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCQkJCTAsCi0JCQkJCQkJCQltc2cgIT0gbnVsbCA/IG1zZwotCQkJCQkJCQkJCQk6IE1lc3NhZ2VzLkRpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX0RpYWdyYW1Mb2FkaW5nRXJyb3IsCi0JCQkJCQkJCQllKSk7Ci0JCQkJfQotCQkJCXRocm93IHRocm93bkV4Y3A7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCQkJbmV3IFN0YXR1cygKLQkJCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCQkwLAotCQkJCQkJCU5MUwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX0luY29ycmVjdElucHV0RXJyb3IsCi0JCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQiLAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0IiB9KSwKLQkJCQkJCQludWxsKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoT2JqZWN0IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCXJldHVybiBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoaW5mbyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldE1vZGlmaWNhdGlvblN0YW1wKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSURpYWdyYW1Eb2N1bWVudCBkb2N1bWVudCA9IGdldERpYWdyYW1Eb2N1bWVudChlbGVtZW50KTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCVJlc291cmNlIGRpYWdyYW1SZXNvdXJjZSA9IGRvY3VtZW50LmdldERpYWdyYW0oKS5lUmVzb3VyY2UoKTsKLQkJCWlmIChkaWFncmFtUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShkaWFncmFtUmVzb3VyY2UpOwotCQkJCXJldHVybiBmaWxlID09IG51bGwgfHwgZmlsZS5nZXRMb2NhdGlvbigpID09IG51bGwKLQkJCQkJCXx8ICFmaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkuZXhpc3RzKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzRGVsZXRlZChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlU2V0SW5mbyBnZXRSZXNvdXJjZVNldEluZm8oT2JqZWN0IGVkaXRvcklucHV0KSB7Ci0JCXJldHVybiAoUmVzb3VyY2VTZXRJbmZvKSBzdXBlci5nZXRFbGVtZW50SW5mbyhlZGl0b3JJbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2VFbGVtZW50SW5mbyhPYmplY3QgZWxlbWVudCwgRWxlbWVudEluZm8gaW5mbykgewotCQlpZiAoaW5mbyBpbnN0YW5jZW9mIFJlc291cmNlU2V0SW5mbykgewotCQkJUmVzb3VyY2VTZXRJbmZvIHJlc291cmNlU2V0SW5mbyA9IChSZXNvdXJjZVNldEluZm8pIGluZm87Ci0JCQlyZXNvdXJjZVNldEluZm8uZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2VFbGVtZW50SW5mbyhlbGVtZW50LCBpbmZvKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9WYWxpZGF0ZVN0YXRlKE9iamVjdCBlbGVtZW50LCBPYmplY3QgY29tcHV0YXRpb25Db250ZXh0KQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBmaWxlczJWYWxpZGF0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNSZWFkT25seSgpKSB7Ci0JCQkJCWZpbGVzMlZhbGlkYXRlLmFkZChmaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KAotCQkJCQkoSUZpbGVbXSkgZmlsZXMyVmFsaWRhdGUudG9BcnJheShuZXcgSUZpbGVbZmlsZXMyVmFsaWRhdGUKLQkJCQkJCQkuc2l6ZSgpXSksIGNvbXB1dGF0aW9uQ29udGV4dCk7Ci0JCX0KLQotCQlzdXBlci5kb1ZhbGlkYXRlU3RhdGUoZWxlbWVudCwgY29tcHV0YXRpb25Db250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seShPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaWYgKGluZm8uaXNVcGRhdGVDYWNoZSgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdXBkYXRlQ2FjaGUoZWxlbWVudCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGUsIGV4KTsKLQkJCQkJLy8gRXJyb3IgbWVzc2FnZSB0byBsb2cgd2FzIGluaXRpYWxseSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuaW50ZXJuYWwubDEwbi5FZGl0b3JNZXNzYWdlcy5TdG9yYWdlRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGUKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gaW5mby5pc1JlYWRPbmx5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzUmVhZE9ubHkoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpYWJsZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoIWlzU3RhdGVWYWxpZGF0ZWQoZWxlbWVudCkpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0Ci0JCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoaW5mby5pc1VwZGF0ZUNhY2hlKCkpIHsKLQkJCQl0cnkgewotCQkJCQl1cGRhdGVDYWNoZShlbGVtZW50KTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX2lzTW9kaWZpYWJsZSwgZXgpOwotCQkJCQkvLyBFcnJvciBtZXNzYWdlIHRvIGxvZyB3YXMgaW5pdGlhbGx5IHRha2VuIGZyb20gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5pbnRlcm5hbC5sMTBuLkVkaXRvck1lc3NhZ2VzLlN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyX2lzTW9kaWZpYWJsZQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBpbmZvLmlzTW9kaWZpYWJsZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc01vZGlmaWFibGUoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNhY2hlKE9iamVjdCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKG5leHRSZXNvdXJjZSk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmlzUmVhZE9ubHkoKSkgewotCQkJCQlpbmZvLnNldFJlYWRPbmx5KHRydWUpOwotCQkJCQlpbmZvLnNldE1vZGlmaWFibGUoZmFsc2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJaW5mby5zZXRSZWFkT25seShmYWxzZSk7Ci0JCQlpbmZvLnNldE1vZGlmaWFibGUodHJ1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9VcGRhdGVTdGF0ZUNhY2hlKE9iamVjdCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpbmZvLnNldFVwZGF0ZUNhY2hlKHRydWUpOwotCQl9Ci0JCXN1cGVyLmRvVXBkYXRlU3RhdGVDYWNoZShlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCXJldHVybiBpbmZvLmlzU3luY2hyb25pemVkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzU3luY2hyb25pemVkKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVNjaGVkdWxpbmdSdWxlIGdldFJlc2V0UnVsZShPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBydWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCXJ1bGVzLmFkZChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKQotCQkJCQkJCS5tb2RpZnlSdWxlKGZpbGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE11bHRpUnVsZSgoSVNjaGVkdWxpbmdSdWxlW10pIHJ1bGVzCi0JCQkJCS50b0FycmF5KG5ldyBJU2NoZWR1bGluZ1J1bGVbcnVsZXMuc2l6ZSgpXSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVNjaGVkdWxpbmdSdWxlIGdldFNhdmVSdWxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIHJ1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJcnVsZXMuYWRkKGNvbXB1dGVTY2hlZHVsaW5nUnVsZShmaWxlKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG5ldyBNdWx0aVJ1bGUoKElTY2hlZHVsaW5nUnVsZVtdKSBydWxlcwotCQkJCQkudG9BcnJheShuZXcgSVNjaGVkdWxpbmdSdWxlW3J1bGVzLnNpemUoKV0pKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBnZXRTeW5jaHJvbml6ZVJ1bGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gcnVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKG5leHRSZXNvdXJjZSk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQlydWxlcy5hZGQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkKLQkJCQkJCQkucmVmcmVzaFJ1bGUoZmlsZSkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgTXVsdGlSdWxlKChJU2NoZWR1bGluZ1J1bGVbXSkgcnVsZXMKLQkJCQkJLnRvQXJyYXkobmV3IElTY2hlZHVsaW5nUnVsZVtydWxlcy5zaXplKCldKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0VmFsaWRhdGVTdGF0ZVJ1bGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKG5leHRSZXNvdXJjZSk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQlmaWxlcy5hZGQoZmlsZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpCi0JCQkJCS52YWxpZGF0ZUVkaXRSdWxlKAotCQkJCQkJCShJRmlsZVtdKSBmaWxlcy50b0FycmF5KG5ldyBJRmlsZVtmaWxlcy5zaXplKCldKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVNjaGVkdWxpbmdSdWxlIGNvbXB1dGVTY2hlZHVsaW5nUnVsZShJUmVzb3VyY2UgdG9DcmVhdGVPck1vZGlmeSkgewotCQlpZiAodG9DcmVhdGVPck1vZGlmeS5leGlzdHMoKSkKLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKS5tb2RpZnlSdWxlKAotCQkJCQl0b0NyZWF0ZU9yTW9kaWZ5KTsKLQotCQlJUmVzb3VyY2UgcGFyZW50ID0gdG9DcmVhdGVPck1vZGlmeTsKLQkJZG8gewotCQkJLyoKLQkJCSAqIFhYWCBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IKLQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NzYwMQotCQkJICogSVJlc291cmNlUnVsZUZhY3RvcnkuY3JlYXRlUnVsZSBzaG91bGQgaXRlcmF0ZSB0aGUgaGllcmFyY2h5Ci0JCQkgKiBpdHNlbGYuCi0JCQkgKi8KLQkJCXRvQ3JlYXRlT3JNb2RpZnkgPSBwYXJlbnQ7Ci0JCQlwYXJlbnQgPSB0b0NyZWF0ZU9yTW9kaWZ5LmdldFBhcmVudCgpOwotCQl9IHdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiAhcGFyZW50LmV4aXN0cygpKTsKLQotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkuY3JlYXRlUnVsZSgKLQkJCQl0b0NyZWF0ZU9yTW9kaWZ5KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TeW5jaHJvbml6ZShPYmplY3QgZWxlbWVudCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCWhhbmRsZUVsZW1lbnRDaGFuZ2VkKGluZm8sIG5leHRSZXNvdXJjZSwgbW9uaXRvcik7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZG9TeW5jaHJvbml6ZShlbGVtZW50LCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlRG9jdW1lbnQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPYmplY3QgZWxlbWVudCwKLQkJCUlEb2N1bWVudCBkb2N1bWVudCwgYm9vbGVhbiBvdmVyd3JpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWlmICghb3ZlcndyaXRlICYmICFpbmZvLmlzU3luY2hyb25pemVkKCkpIHsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCQkJSVN0YXR1cy5PSywKLQkJCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfVW5zeW5jaHJvbml6ZWRGaWxlU2F2ZUVycm9yLAotCQkJCQkJCQludWxsKSk7Ci0JCQl9Ci0JCQlpbmZvLnN0b3BSZXNvdXJjZUxpc3RlbmluZygpOwotCQkJZmlyZUVsZW1lbnRTdGF0ZUNoYW5naW5nKGVsZW1lbnQpOwotCQkJTGlzdCByZXNvdXJjZXMgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0JCQl0cnkgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKAotCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfU2F2ZURpYWdyYW1UYXNrLAotCQkJCQkJcmVzb3VyY2VzLnNpemUoKSArIDEpOyAvLyJTYXZpbmcgZGlhZ3JhbSIKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJCW1vbml0b3IKLQkJCQkJCQkuc2V0VGFza05hbWUoTkxTCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfU2F2ZU5leHRSZXNvdXJjZVRhc2ssCi0JCQkJCQkJCQkJCW5leHRSZXNvdXJjZS5nZXRVUkkoKSkpOwotCQkJCQlpZiAobmV4dFJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbmV4dFJlc291cmNlLnNhdmUoRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsCi0JCQkJCQkJCQkuZ2V0U2F2ZU9wdGlvbnMoKSk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJZmlyZUVsZW1lbnRTdGF0ZUNoYW5nZUZhaWxlZChlbGVtZW50KTsKLQkJCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQkJCQlFZGl0b3JTdGF0dXNDb2Rlcy5SRVNPVVJDRV9GQUlMVVJFLCBlCi0JCQkJCQkJCQkJCS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIG51bGwpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl9Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHgpIHsKLQkJCQlmaXJlRWxlbWVudFN0YXRlQ2hhbmdlRmFpbGVkKGVsZW1lbnQpOwotCQkJCXRocm93IHg7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWluZm8uc3RhcnRSZXNvdXJjZUxpc3RlbmluZygpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUVsZW1lbnRDaGFuZ2VkKFJlc291cmNlU2V0SW5mbyBpbmZvLAotCQkJUmVzb3VyY2UgY2hhbmdlZFJlc291cmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKGNoYW5nZWRSZXNvdXJjZSk7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBtb25pdG9yKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkJCS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX2hhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZCwKLQkJCQkJCQkJZXgpOwotCQkJCS8vIEVycm9yIG1lc3NhZ2UgdG8gbG9nIHdhcyBpbml0aWFsbHkgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmludGVybmFsLmwxMG4uRWRpdG9yTWVzc2FnZXMuRmlsZURvY3VtZW50UHJvdmlkZXJfaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkCi0JCQl9Ci0JCX0KLQkJY2hhbmdlZFJlc291cmNlLnVubG9hZCgpOwotCi0JCWZpcmVFbGVtZW50Q29udGVudEFib3V0VG9CZVJlcGxhY2VkKGluZm8uZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCXJlbW92ZVVuY2hhbmdlZEVsZW1lbnRMaXN0ZW5lcnMoaW5mby5nZXRFZGl0b3JJbnB1dCgpLCBpbmZvKTsKLQkJaW5mby5mU3RhdHVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNldERvY3VtZW50Q29udGVudChpbmZvLmZEb2N1bWVudCwgaW5mby5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpbmZvLmZTdGF0dXMgPSBlLmdldFN0YXR1cygpOwotCQl9Ci0JCWlmICghaW5mby5mQ2FuQmVTYXZlZCkgewotCQkJaW5mby5zZXRNb2RpZmljYXRpb25TdGFtcChjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoaW5mbykpOwotCQl9Ci0JCWFkZFVuY2hhbmdlZEVsZW1lbnRMaXN0ZW5lcnMoaW5mby5nZXRFZGl0b3JJbnB1dCgpLCBpbmZvKTsKLQkJZmlyZUVsZW1lbnRDb250ZW50UmVwbGFjZWQoaW5mby5nZXRFZGl0b3JJbnB1dCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRWxlbWVudE1vdmVkKElFZGl0b3JJbnB1dCBpbnB1dCwgVVJJIHVyaSkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUlGaWxlIG5ld0ZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoCi0JCQkJCW5ldyBQYXRoKFVSSS5kZWNvZGUodXJpLnBhdGgoKSkpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkpOwotCQkJZmlyZUVsZW1lbnRNb3ZlZChpbnB1dCwgbmV3RmlsZSA9PSBudWxsID8gbnVsbAotCQkJCQk6IG5ldyBGaWxlRWRpdG9ySW5wdXQobmV3RmlsZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIFRPRE86IGFwcGVuZCBzdWZmaXggdG8gdGhlIFVSSSEgKHVzZSBkaWFncmFtIGFzIGEgcGFyYW1ldGVyKQotCQlmaXJlRWxlbWVudE1vdmVkKGlucHV0LCBuZXcgVVJJRWRpdG9ySW5wdXQodXJpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRWRpdG9ySW5wdXQgY3JlYXRlSW5wdXRXaXRoRWRpdGluZ0RvbWFpbihJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQsCi0JCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4pIHsKLQkJcmV0dXJuIGVkaXRvcklucHV0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSURpYWdyYW1Eb2N1bWVudCBnZXREaWFncmFtRG9jdW1lbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KGVsZW1lbnQpOwotCQlpZiAoZG9jIGluc3RhbmNlb2YgSURpYWdyYW1Eb2N1bWVudCkgewotCQkJcmV0dXJuIChJRGlhZ3JhbURvY3VtZW50KSBkb2M7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUnVubmFibGVDb250ZXh0IGdldE9wZXJhdGlvblJ1bm5lcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBSZXNvdXJjZVNldEluZm8gZXh0ZW5kcyBFbGVtZW50SW5mbyB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgbG9uZyBteU1vZGlmaWNhdGlvblN0YW1wID0gSVJlc291cmNlLk5VTExfU1RBTVA7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgV29ya3NwYWNlU3luY2hyb25pemVyIG15U3luY2hyb25pemVyOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIENvbGxlY3Rpb24gbXlVblN5bmNocm9uaXplZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBJRGlhZ3JhbURvY3VtZW50IG15RG9jdW1lbnQ7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgSUVkaXRvcklucHV0IG15RWRpdG9ySW5wdXQ7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVwZGF0ZUNhY2hlID0gdHJ1ZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15TW9kaWZpYWJsZSA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlSZWFkT25seSA9IHRydWU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgUmVzb3VyY2VTZXRNb2RpZmljYXRpb25MaXN0ZW5lciBteVJlc291cmNlU2V0TGlzdGVuZXI7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBSZXNvdXJjZVNldEluZm8oSURpYWdyYW1Eb2N1bWVudCBkb2N1bWVudCwKLQkJCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsKLQkJCXN1cGVyKGRvY3VtZW50KTsKLQkJCW15RG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJCW15RWRpdG9ySW5wdXQgPSBlZGl0b3JJbnB1dDsKLQkJCXN0YXJ0UmVzb3VyY2VMaXN0ZW5pbmcoKTsKLQkJCW15UmVzb3VyY2VTZXRMaXN0ZW5lciA9IG5ldyBSZXNvdXJjZVNldE1vZGlmaWNhdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkJZ2V0UmVzb3VyY2VTZXQoKS5lQWRhcHRlcnMoKS5hZGQobXlSZXNvdXJjZVNldExpc3RlbmVyKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcCgpIHsKLQkJCXJldHVybiBteU1vZGlmaWNhdGlvblN0YW1wOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldE1vZGlmaWNhdGlvblN0YW1wKGxvbmcgbW9kaWZpY2F0aW9uU3RhbXApIHsKLQkJCW15TW9kaWZpY2F0aW9uU3RhbXAgPSBtb2RpZmljYXRpb25TdGFtcDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKSB7Ci0JCQlyZXR1cm4gbXlEb2N1bWVudC5nZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgSUVkaXRvcklucHV0IGdldEVkaXRvcklucHV0KCkgewotCQkJcmV0dXJuIG15RWRpdG9ySW5wdXQ7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCXN0b3BSZXNvdXJjZUxpc3RlbmluZygpOwotCQkJZ2V0UmVzb3VyY2VTZXQoKS5lQWRhcHRlcnMoKS5yZW1vdmUobXlSZXNvdXJjZVNldExpc3RlbmVyKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBnZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlyZXNvdXJjZS51bmxvYWQoKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc1N5bmNocm9uaXplZCgpIHsKLQkJCXJldHVybiBteVVuU3luY2hyb25pemVkUmVzb3VyY2VzLnNpemUoKSA9PSAwOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFVuU3luY2hyb25pemVkKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCQlteVVuU3luY2hyb25pemVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0U3luY2hyb25pemVkKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCQlteVVuU3luY2hyb25pemVkUmVzb3VyY2VzLnJlbW92ZShyZXNvdXJjZSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGZpbmFsIHZvaWQgc3RvcFJlc291cmNlTGlzdGVuaW5nKCkgewotCQkJbXlTeW5jaHJvbml6ZXIuZGlzcG9zZSgpOwotCQkJbXlTeW5jaHJvbml6ZXIgPSBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBmaW5hbCB2b2lkIHN0YXJ0UmVzb3VyY2VMaXN0ZW5pbmcoKSB7Ci0JCQlteVN5bmNocm9uaXplciA9IG5ldyBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIobXlEb2N1bWVudAotCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXcgU3luY2hyb25pemVyRGVsZWdhdGUoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNVcGRhdGVDYWNoZSgpIHsKLQkJCXJldHVybiBteVVwZGF0ZUNhY2hlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFVwZGF0ZUNhY2hlKGJvb2xlYW4gdXBkYXRlKSB7Ci0JCQlteVVwZGF0ZUNhY2hlID0gdXBkYXRlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpYWJsZSgpIHsKLQkJCXJldHVybiBteU1vZGlmaWFibGU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0TW9kaWZpYWJsZShib29sZWFuIG1vZGlmaWFibGUpIHsKLQkJCW15TW9kaWZpYWJsZSA9IG1vZGlmaWFibGU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJCXJldHVybiBteVJlYWRPbmx5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpIHsKLQkJCW15UmVhZE9ubHkgPSByZWFkT25seTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGNsYXNzIFN5bmNocm9uaXplckRlbGVnYXRlIGltcGxlbWVudHMKLQkJCQlXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuRGVsZWdhdGUgewotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIGhhbmRsZVJlc291cmNlQ2hhbmdlZChmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJCXN5bmNocm9uaXplZCAoUmVzb3VyY2VTZXRJbmZvLnRoaXMpIHsKLQkJCQkJaWYgKFJlc291cmNlU2V0SW5mby50aGlzLmZDYW5CZVNhdmVkKSB7Ci0JCQkJCQlSZXNvdXJjZVNldEluZm8udGhpcy5zZXRVblN5bmNocm9uaXplZChyZXNvdXJjZSk7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQloYW5kbGVFbGVtZW50Q2hhbmdlZChSZXNvdXJjZVNldEluZm8udGhpcywgcmVzb3VyY2UsCi0JCQkJCQkJCW51bGwpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVSZXNvdXJjZURlbGV0ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKFJlc291cmNlU2V0SW5mby50aGlzKSB7Ci0JCQkJCWlmIChSZXNvdXJjZVNldEluZm8udGhpcy5mQ2FuQmVTYXZlZCkgewotCQkJCQkJUmVzb3VyY2VTZXRJbmZvLnRoaXMuc2V0VW5TeW5jaHJvbml6ZWQocmVzb3VyY2UpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJZmlyZUVsZW1lbnREZWxldGVkKFJlc291cmNlU2V0SW5mby50aGlzCi0JCQkJCQkJCS5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHVibGljIGJvb2xlYW4gaGFuZGxlUmVzb3VyY2VNb3ZlZChSZXNvdXJjZSByZXNvdXJjZSwKLQkJCQkJZmluYWwgVVJJIG5ld1VSSSkgewotCQkJCXN5bmNocm9uaXplZCAoUmVzb3VyY2VTZXRJbmZvLnRoaXMpIHsKLQkJCQkJaWYgKFJlc291cmNlU2V0SW5mby50aGlzLmZDYW5CZVNhdmVkKSB7Ci0JCQkJCQlSZXNvdXJjZVNldEluZm8udGhpcy5zZXRVblN5bmNocm9uaXplZChyZXNvdXJjZSk7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAobXlEb2N1bWVudC5nZXREaWFncmFtKCkuZVJlc291cmNlKCkgPT0gcmVzb3VyY2UpIHsKLQkJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQloYW5kbGVFbGVtZW50TW92ZWQoUmVzb3VyY2VTZXRJbmZvLnRoaXMKLQkJCQkJCQkJCS5nZXRFZGl0b3JJbnB1dCgpLCBuZXdVUkkpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9IGVsc2UgewotCQkJCQloYW5kbGVSZXNvdXJjZURlbGV0ZWQocmVzb3VyY2UpOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBSZXNvdXJjZVNldE1vZGlmaWNhdGlvbkxpc3RlbmVyIGV4dGVuZHMgRUNvbnRlbnRBZGFwdGVyIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBOb3RpZmljYXRpb25GaWx0ZXIgbXlNb2RpZmllZEZpbHRlcjsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBSZXNvdXJjZVNldEluZm8gbXlJbmZvOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgUmVzb3VyY2VTZXRNb2RpZmljYXRpb25MaXN0ZW5lcihSZXNvdXJjZVNldEluZm8gaW5mbykgewotCQkJbXlJbmZvID0gaW5mbzsKLQkJCW15TW9kaWZpZWRGaWx0ZXIgPSBOb3RpZmljYXRpb25GaWx0ZXIuY3JlYXRlRXZlbnRUeXBlRmlsdGVyKAotCQkJCQlOb3RpZmljYXRpb24uU0VUKS5vcigKLQkJCQkJTm90aWZpY2F0aW9uRmlsdGVyCi0JCQkJCQkJLmNyZWF0ZUV2ZW50VHlwZUZpbHRlcihOb3RpZmljYXRpb24uVU5TRVQpKS5hbmQoCi0JCQkJCU5vdGlmaWNhdGlvbkZpbHRlci5jcmVhdGVGZWF0dXJlRmlsdGVyKFJlc291cmNlLmNsYXNzLAotCQkJCQkJCVJlc291cmNlLlJFU09VUkNFX19JU19NT0RJRklFRCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgUmVzb3VyY2VTZXQpIHsKLQkJCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCQlpZiAoIW5vdGlmaWNhdGlvbi5pc1RvdWNoKCkKLQkJCQkJJiYgbXlNb2RpZmllZEZpbHRlci5tYXRjaGVzKG5vdGlmaWNhdGlvbikpIHsKLQkJCQlpZiAobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBSZXNvdXJjZSkgewotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQkJCWlmIChyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbXlJbmZvLmdldFJlc291cmNlU2V0KCkKLQkJCQkJCQkJLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKQotCQkJCQkJCQkmJiAhbW9kaWZpZWQ7KSB7Ci0JCQkJCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJCQkJaWYgKG5leHRSZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCQkJCW1vZGlmaWVkID0gbmV4dFJlc291cmNlLmlzTW9kaWZpZWQoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlib29sZWFuIGRpcnR5U3RhdGVDaGFuZ2VkID0gZmFsc2U7Ci0JCQkJCQlzeW5jaHJvbml6ZWQgKG15SW5mbykgewotCQkJCQkJCWlmIChtb2RpZmllZCAhPSBteUluZm8uZkNhbkJlU2F2ZWQpIHsKLQkJCQkJCQkJbXlJbmZvLmZDYW5CZVNhdmVkID0gbW9kaWZpZWQ7Ci0JCQkJCQkJCWRpcnR5U3RhdGVDaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKCFyZXNvdXJjZS5pc01vZGlmaWVkKCkpIHsKLQkJCQkJCQkJbXlJbmZvLnNldFN5bmNocm9uaXplZChyZXNvdXJjZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGRpcnR5U3RhdGVDaGFuZ2VkKSB7Ci0JCQkJCQkJZmlyZUVsZW1lbnREaXJ0eVN0YXRlQ2hhbmdlZChteUluZm8KLQkJCQkJCQkJCS5nZXRFZGl0b3JJbnB1dCgpLCBtb2RpZmllZCk7Ci0KLQkJCQkJCQlpZiAoIW1vZGlmaWVkKSB7Ci0JCQkJCQkJCW15SW5mbwotCQkJCQkJCQkJCS5zZXRNb2RpZmljYXRpb25TdGFtcChjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAobXlJbmZvKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNjE0NWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLkdNRkVkaXRpbmdEb21haW5GYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBVUkkgZG9tYWluTW9kZWxVUkk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQl0aGlzLnRhcmdldFBhcnQgPSB0YXJnZXRQYXJ0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlkb21haW5Nb2RlbFVSSSA9IG51bGw7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uID09IGZhbHNlCi0JCQkJfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlGaWxlIGZpbGUgPSAoSUZpbGUpICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikKLQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWRvbWFpbk1vZGVsVVJJID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZS5nZXRGdWxsUGF0aCgpCi0JCQkJLnRvU3RyaW5nKCksIHRydWUpOwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTaGVsbCBnZXRTaGVsbCgpIHsKLQkJcmV0dXJuIHRhcmdldFBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gR01GRWRpdGluZ0RvbWFpbkZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOwotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLQkJRU9iamVjdCBkaWFncmFtUm9vdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKGRvbWFpbk1vZGVsVVJJLCB0cnVlKTsKLQkJCWRpYWdyYW1Sb290ID0gKEVPYmplY3QpIHJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQl9IGNhdGNoIChXcmFwcGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBsb2FkIHJlc291cmNlOiAiICsgZG9tYWluTW9kZWxVUkksIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChkaWFncmFtUm9vdCA9PSBudWxsKSB7Ci0JCQlNZXNzYWdlRGlhbG9nCi0JCQkJCS5vcGVuRXJyb3IoCi0JCQkJCQkJZ2V0U2hlbGwoKSwKLQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dUaXRsZSwKLQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dNZXNzYWdlKTsKLQkJCXJldHVybjsKLQkJfQotCQlXaXphcmQgd2l6YXJkID0gbmV3IERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZChkb21haW5Nb2RlbFVSSSwKLQkJCQlkaWFncmFtUm9vdCwgZWRpdGluZ0RvbWFpbik7Ci0JCXdpemFyZAotCQkJCS5zZXRXaW5kb3dUaXRsZShOTFMKLQkJCQkJCS5iaW5kKAotCQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVdpemFyZFRpdGxlLAotCQkJCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCkpOwotCQlEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwucnVuV2l6YXJkKGdldFNoZWxsKCksIHdpemFyZCwKLQkJCQkiSW5pdERpYWdyYW1GaWxlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1Mb2FkUmVzb3VyY2VBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbUxvYWRSZXNvdXJjZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTczMmZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbUxvYWRSZXNvdXJjZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uTG9hZFJlc291cmNlQWN0aW9uLkxvYWRSZXNvdXJjZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUxvYWRSZXNvdXJjZUFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCBteVNlbGVjdGVkRWxlbWVudDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFNoZWxsIG15U2hlbGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQlteVNoZWxsID0gdGFyZ2V0UGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUxvYWRSZXNvdXJjZURpYWxvZyBsb2FkUmVzb3VyY2VEaWFsb2cgPSBuZXcgTG9hZFJlc291cmNlRGlhbG9nKG15U2hlbGwsCi0JCQkJbXlTZWxlY3RlZEVsZW1lbnQuZ2V0RWRpdGluZ0RvbWFpbigpKTsKLQkJbG9hZFJlc291cmNlRGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJbXlTZWxlY3RlZEVsZW1lbnQgPSBudWxsOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWlmIChzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKSA9PSAxCi0JCQkJCSYmIHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgewotCQkJCW15U2VsZWN0ZWRFbGVtZW50ID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSBzdHJ1Y3R1cmVkU2VsZWN0aW9uCi0JCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQl9Ci0JCX0KLQkJYWN0aW9uLnNldEVuYWJsZWQoaXNFbmFibGVkKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gbXlTZWxlY3RlZEVsZW1lbnQgIT0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbU1hdGNoaW5nU3RyYXRlZ3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbU1hdGNoaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQxZDFmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1NYXRjaGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnBhcnRzLkRpYWdyYW1Eb2N1bWVudEVkaXRvck1hdGNoaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbU1hdGNoaW5nU3RyYXRlZ3kgaW1wbGVtZW50cyBJRWRpdG9yTWF0Y2hpbmdTdHJhdGVneSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhJRWRpdG9yUmVmZXJlbmNlIGVkaXRvclJlZiwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dDsKLQkJdHJ5IHsKLQkJCWVkaXRvcklucHV0ID0gZWRpdG9yUmVmLmdldEVkaXRvcklucHV0KCk7Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChlZGl0b3JJbnB1dC5lcXVhbHMoaW5wdXQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dAotCQkJCSYmIGlucHV0IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLQkJCXJldHVybiAoKFVSSUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dCkuZ2V0VVJJKCkuZXF1YWxzKAotCQkJCQkoKFVSSUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0VVJJKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U0MmMwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLk9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5WaWV3U2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy52aWV3LkNyZWF0ZURpYWdyYW1WaWV3T3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZCBleHRlbmRzIFdpemFyZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBteUVkaXRpbmdEb21haW47Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZChVUkkgZG9tYWluTW9kZWxVUkksIEVPYmplY3QgZGlhZ3JhbVJvb3QsCi0JCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluKSB7Ci0JCWFzc2VydCBkb21haW5Nb2RlbFVSSSAhPSBudWxsIDogIkRvbWFpbiBtb2RlbCB1cmkgbXVzdCBiZSBzcGVjaWZpZWQiOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydCBkaWFncmFtUm9vdCAhPSBudWxsIDogIkRvYWdyYW0gcm9vdCBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkIjsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnQgZWRpdGluZ0RvbWFpbiAhPSBudWxsIDogIkVkaXRpbmcgZG9tYWluIG11c3QgYmUgc3BlY2lmaWVkIjsgLy8kTk9OLU5MUy0xJAotCi0JCW15RmlsZUNyZWF0aW9uUGFnZSA9IG5ldyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlKAotCQkJCU1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VOYW1lLAotCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOwotCQlteUZpbGVDcmVhdGlvblBhZ2UKLQkJCQkuc2V0VGl0bGUoTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZVRpdGxlKTsKLQkJbXlGaWxlQ3JlYXRpb25QYWdlLnNldERlc2NyaXB0aW9uKE5MUy5iaW5kKAotCQkJCU1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VEZXNjcmlwdGlvbiwKLQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCkpOwotCQlJUGF0aCBmaWxlUGF0aDsKLQkJU3RyaW5nIGZpbGVOYW1lID0gZG9tYWluTW9kZWxVUkkudHJpbUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpOwotCQlpZiAoZG9tYWluTW9kZWxVUkkuaXNQbGF0Zm9ybVJlc291cmNlKCkpIHsKLQkJCWZpbGVQYXRoID0gbmV3IFBhdGgoZG9tYWluTW9kZWxVUkkudHJpbVNlZ21lbnRzKDEpCi0JCQkJCS50b1BsYXRmb3JtU3RyaW5nKHRydWUpKTsKLQkJfSBlbHNlIGlmIChkb21haW5Nb2RlbFVSSS5pc0ZpbGUoKSkgewotCQkJZmlsZVBhdGggPSBuZXcgUGF0aChkb21haW5Nb2RlbFVSSS50cmltU2VnbWVudHMoMSkudG9GaWxlU3RyaW5nKCkpOwotCQl9IGVsc2UgewotCQkJLy8gVE9ETyA6IHVzZSBzb21lIGRlZmF1bHQgcGF0aAotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlVuc3VwcG9ydGVkIFVSSTogIiArIGRvbWFpbk1vZGVsVVJJKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCW15RmlsZUNyZWF0aW9uUGFnZS5zZXRDb250YWluZXJGdWxsUGF0aChmaWxlUGF0aCk7Ci0JCW15RmlsZUNyZWF0aW9uUGFnZS5zZXRGaWxlTmFtZShEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwKLQkJCQkuZ2V0VW5pcXVlRmlsZU5hbWUoZmlsZVBhdGgsIGZpbGVOYW1lLCAieG1pIikpOyAvLyROT04tTkxTLTEkCi0KLQkJZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZSA9IG5ldyBEaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlKAotCQkJCU1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5hbWUpOwotCQlkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlCi0JCQkJLnNldFRpdGxlKE1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVRpdGxlKTsKLQkJZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZQotCQkJCS5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VEZXNjcmlwdGlvbik7Ci0JCWRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2Uuc2V0TW9kZWxFbGVtZW50KGRpYWdyYW1Sb290KTsKLQotCQlteUVkaXRpbmdEb21haW4gPSBlZGl0aW5nRG9tYWluOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgbXlGaWxlQ3JlYXRpb25QYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZSBkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlhZGRQYWdlKG15RmlsZUNyZWF0aW9uUGFnZSk7Ci0JCWFkZFBhZ2UoZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCUxpc3QgYWZmZWN0ZWRGaWxlcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCUlGaWxlIGRpYWdyYW1GaWxlID0gbXlGaWxlQ3JlYXRpb25QYWdlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLnNldENoYXJzZXQoZGlhZ3JhbUZpbGUpOwotCQlhZmZlY3RlZEZpbGVzLmFkZChkaWFncmFtRmlsZSk7Ci0JCVVSSSBkaWFncmFtTW9kZWxVUkkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShkaWFncmFtRmlsZQotCQkJCS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpOwotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG15RWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpOwotCQlmaW5hbCBSZXNvdXJjZSBkaWFncmFtUmVzb3VyY2UgPSByZXNvdXJjZVNldAotCQkJCS5jcmVhdGVSZXNvdXJjZShkaWFncmFtTW9kZWxVUkkpOwotCQlBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCgKLQkJCQlteUVkaXRpbmdEb21haW4sCi0JCQkJTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0luaXREaWFncmFtQ29tbWFuZCwKLQkJCQlhZmZlY3RlZEZpbGVzKSB7Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoCi0JCQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQlpbnQgZGlhZ3JhbVZJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0RGlhZ3JhbVZpc3VhbElEKGRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UKLQkJCQkJCQkJLmdldE1vZGVsRWxlbWVudCgpKTsKLQkJCQlpZiAoZGlhZ3JhbVZJRCAhPSBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5WSVNVQUxfSUQpIHsKLQkJCQkJcmV0dXJuIENvbW1hbmRSZXN1bHQKLQkJCQkJCQkubmV3RXJyb3JDb21tYW5kUmVzdWx0KE1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9JbmNvcnJlY3RSb290RXJyb3IpOwotCQkJCX0KLQkJCQlEaWFncmFtIGRpYWdyYW0gPSBWaWV3U2VydmljZQotCQkJCQkJLmNyZWF0ZURpYWdyYW0oCi0JCQkJCQkJCWRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UKLQkJCQkJCQkJCQkuZ2V0TW9kZWxFbGVtZW50KCksCi0JCQkJCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lELAotCQkJCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlkaWFncmFtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7Ci0JCQkJZGlhZ3JhbVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoKTsKLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCU9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5LmdldE9wZXJhdGlvbkhpc3RvcnkoKS5leGVjdXRlKGNvbW1hbmQsCi0JCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCQkJZGlhZ3JhbVJlc291cmNlLnNhdmUoRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLmdldFNhdmVPcHRpb25zKCkpOwotCQkJRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLm9wZW5EaWFncmFtKGRpYWdyYW1SZXNvdXJjZSk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBjcmVhdGUgbW9kZWwgYW5kIGRpYWdyYW0iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJTYXZlIG9wZXJhdGlvbiBmYWlsZWQgZm9yOiAiICsgZGlhZ3JhbU1vZGVsVVJJLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXgpIHsKLQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIG9wZW4gZWRpdG9yIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIERpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UgZXh0ZW5kcwotCQkJTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZSB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBEaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQkJc3VwZXIocGFnZU5hbWUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0aW9uVGl0bGUoKSB7Ci0JCQlyZXR1cm4gTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlU2VsZWN0aW9uVGl0bGU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQkJaWYgKHNlbGVjdGVkTW9kZWxFbGVtZW50ID09IG51bGwpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlTm9TZWxlY3Rpb25NZXNzYWdlKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlib29sZWFuIHJlc3VsdCA9IFZpZXdTZXJ2aWNlCi0JCQkJCS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5wcm92aWRlcygKLQkJCQkJCQluZXcgQ3JlYXRlRGlhZ3JhbVZpZXdPcGVyYXRpb24oCi0JCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoc2VsZWN0ZWRNb2RlbEVsZW1lbnQpLAotCQkJCQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQsCi0JCQkJCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKSk7Ci0JCQlzZXRFcnJvck1lc3NhZ2UocmVzdWx0ID8gbnVsbAotCQkJCQk6IE1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZUludmFsaWRTZWxlY3Rpb25NZXNzYWdlKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtUGFsZXR0ZUZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbVBhbGV0dGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMGUzYzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtUGFsZXR0ZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZURyYXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5VbnNwZWNpZmllZFR5cGVDcmVhdGlvblRvb2w7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVBhbGV0dGVGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxQYWxldHRlKFBhbGV0dGVSb290IHBhbGV0dGVSb290KSB7Ci0JCS8vCQlwYWxldHRlUm9vdC5hZGQoY3JlYXRlTm9kZXMxR3JvdXAoKSk7Ci0JCS8vCQlwYWxldHRlUm9vdC5hZGQoY3JlYXRlTGlua3MyR3JvdXAoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgUGFsZXR0ZUNvbnRhaW5lciBjcmVhdGVOb2RlczFHcm91cCgpIHsKLQkJUGFsZXR0ZURyYXdlciBwYWxldHRlQ29udGFpbmVyID0gbmV3IFBhbGV0dGVEcmF3ZXIoCi0JCQkJTWVzc2FnZXMuTm9kZXMxR3JvdXBfdGl0bGUpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVSb2xlTm9kZTFDcmVhdGlvblRvb2woKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlMkNyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlVGFza05vZGUzQ3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlNENyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGU1Q3JlYXRpb25Ub29sKCkpOwotCQlyZXR1cm4gcGFsZXR0ZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBQYWxldHRlQ29udGFpbmVyIGNyZWF0ZUxpbmtzMkdyb3VwKCkgewotCQlQYWxldHRlRHJhd2VyIHBhbGV0dGVDb250YWluZXIgPSBuZXcgUGFsZXR0ZURyYXdlcigKLQkJCQlNZXNzYWdlcy5MaW5rczJHcm91cF90aXRsZSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZUxpbmsxQ3JlYXRpb25Ub29sKCkpOwotCQlyZXR1cm4gcGFsZXR0ZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlUm9sZU5vZGUxQ3JlYXRpb25Ub29sKCkgewotCQlMaXN0Lyo8SUVsZW1lbnRUeXBlPiovdHlwZXMgPSBuZXcgQXJyYXlMaXN0Lyo8SUVsZW1lbnRUeXBlPiovKDEpOwotCQl0eXBlcy5hZGQoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Sb2xlTm9kZV8yMDAxKTsKLQkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KAotCQkJCU1lc3NhZ2VzLlJvbGVOb2RlMUNyZWF0aW9uVG9vbF90aXRsZSwKLQkJCQlNZXNzYWdlcy5Sb2xlTm9kZTFDcmVhdGlvblRvb2xfZGVzYywgdHlwZXMpOwotCQllbnRyeS5zZXRTbWFsbEljb24oRGlhZ3JhbUVsZW1lbnRUeXBlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Sb2xlTm9kZV8yMDAxKSk7Ci0JCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUyQ3JlYXRpb25Ub29sKCkgewotCQlMaXN0Lyo8SUVsZW1lbnRUeXBlPiovdHlwZXMgPSBuZXcgQXJyYXlMaXN0Lyo8SUVsZW1lbnRUeXBlPiovKDEpOwotCQl0eXBlcy5hZGQoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Sb2xlVGFza0NvbXBvc2l0ZV8xMDAxKTsKLQkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KAotCQkJCU1lc3NhZ2VzLlJvbGVUYXNrQ29tcG9zaXRlMkNyZWF0aW9uVG9vbF90aXRsZSwKLQkJCQlNZXNzYWdlcy5Sb2xlVGFza0NvbXBvc2l0ZTJDcmVhdGlvblRvb2xfZGVzYywgdHlwZXMpOwotCQllbnRyeQotCQkJCS5zZXRTbWFsbEljb24oRGlhZ3JhbUVsZW1lbnRUeXBlcwotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcihEaWFncmFtRWxlbWVudFR5cGVzLlJvbGVUYXNrQ29tcG9zaXRlXzEwMDEpKTsKLQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVUYXNrTm9kZTNDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKjxJRWxlbWVudFR5cGU+Ki90eXBlcyA9IG5ldyBBcnJheUxpc3QvKjxJRWxlbWVudFR5cGU+Ki8oMSk7Ci0JCXR5cGVzLmFkZChEaWFncmFtRWxlbWVudFR5cGVzLlRhc2tOb2RlXzIwMDIpOwotCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoCi0JCQkJTWVzc2FnZXMuVGFza05vZGUzQ3JlYXRpb25Ub29sX3RpdGxlLAotCQkJCU1lc3NhZ2VzLlRhc2tOb2RlM0NyZWF0aW9uVG9vbF9kZXNjLCB0eXBlcyk7Ci0JCWVudHJ5LnNldFNtYWxsSWNvbihEaWFncmFtRWxlbWVudFR5cGVzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihEaWFncmFtRWxlbWVudFR5cGVzLlRhc2tOb2RlXzIwMDIpKTsKLQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlNENyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qPElFbGVtZW50VHlwZT4qL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qPElFbGVtZW50VHlwZT4qLygxKTsKLQkJdHlwZXMuYWRkKERpYWdyYW1FbGVtZW50VHlwZXMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV8yMDAzKTsKLQkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KAotCQkJCU1lc3NhZ2VzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU0Q3JlYXRpb25Ub29sX3RpdGxlLAotCQkJCU1lc3NhZ2VzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU0Q3JlYXRpb25Ub29sX2Rlc2MsIHR5cGVzKTsKLQkJZW50cnkKLQkJCQkuc2V0U21hbGxJY29uKERpYWdyYW1FbGVtZW50VHlwZXMKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlXzIwMDMpKTsKLQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZTVDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKjxJRWxlbWVudFR5cGU+Ki90eXBlcyA9IG5ldyBBcnJheUxpc3QvKjxJRWxlbWVudFR5cGU+Ki8oMSk7Ci0JCXR5cGVzLmFkZChEaWFncmFtRWxlbWVudFR5cGVzLldvcmtQcm9kdWN0Q29tcG9zaXRlXzEwMDIpOwotCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoCi0JCQkJTWVzc2FnZXMuV29ya1Byb2R1Y3RDb21wb3NpdGU1Q3JlYXRpb25Ub29sX3RpdGxlLAotCQkJCU1lc3NhZ2VzLldvcmtQcm9kdWN0Q29tcG9zaXRlNUNyZWF0aW9uVG9vbF9kZXNjLCB0eXBlcyk7Ci0JCWVudHJ5Ci0JCQkJLnNldFNtYWxsSWNvbihEaWFncmFtRWxlbWVudFR5cGVzCi0JCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERpYWdyYW1FbGVtZW50VHlwZXMuV29ya1Byb2R1Y3RDb21wb3NpdGVfMTAwMikpOwotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZUxpbmsxQ3JlYXRpb25Ub29sKCkgewotCQlMaXN0Lyo8SUVsZW1lbnRUeXBlPiovdHlwZXMgPSBuZXcgQXJyYXlMaXN0Lyo8SUVsZW1lbnRUeXBlPiovKDEpOwotCQl0eXBlcy5hZGQoRGlhZ3JhbUVsZW1lbnRUeXBlcy5MaW5rXzMwMDEpOwotCQlMaW5rVG9vbEVudHJ5IGVudHJ5ID0gbmV3IExpbmtUb29sRW50cnkoCi0JCQkJTWVzc2FnZXMuTGluazFDcmVhdGlvblRvb2xfdGl0bGUsCi0JCQkJTWVzc2FnZXMuTGluazFDcmVhdGlvblRvb2xfZGVzYywgdHlwZXMpOwotCQllbnRyeS5zZXRTbWFsbEljb24oRGlhZ3JhbUVsZW1lbnRUeXBlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRGlhZ3JhbUVsZW1lbnRUeXBlcy5MaW5rXzMwMDEpKTsKLQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOb2RlVG9vbEVudHJ5IGV4dGVuZHMgVG9vbEVudHJ5IHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBMaXN0IGVsZW1lbnRUeXBlczsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBOb2RlVG9vbEVudHJ5KFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uLAotCQkJCUxpc3QgZWxlbWVudFR5cGVzKSB7Ci0JCQlzdXBlcih0aXRsZSwgZGVzY3JpcHRpb24sIG51bGwsIG51bGwpOwotCQkJdGhpcy5lbGVtZW50VHlwZXMgPSBlbGVtZW50VHlwZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFRvb2wgY3JlYXRlVG9vbCgpIHsKLQkJCVRvb2wgdG9vbCA9IG5ldyBVbnNwZWNpZmllZFR5cGVDcmVhdGlvblRvb2woZWxlbWVudFR5cGVzKTsKLQkJCXRvb2wuc2V0UHJvcGVydGllcyhnZXRUb29sUHJvcGVydGllcygpKTsKLQkJCXJldHVybiB0b29sOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIExpbmtUb29sRW50cnkgZXh0ZW5kcyBUb29sRW50cnkgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIExpc3QgcmVsYXRpb25zaGlwVHlwZXM7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTGlua1Rvb2xFbnRyeShTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbiwKLQkJCQlMaXN0IHJlbGF0aW9uc2hpcFR5cGVzKSB7Ci0JCQlzdXBlcih0aXRsZSwgZGVzY3JpcHRpb24sIG51bGwsIG51bGwpOwotCQkJdGhpcy5yZWxhdGlvbnNoaXBUeXBlcyA9IHJlbGF0aW9uc2hpcFR5cGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBUb29sIGNyZWF0ZVRvb2woKSB7Ci0JCQlUb29sIHRvb2wgPSBuZXcgVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblRvb2wocmVsYXRpb25zaGlwVHlwZXMpOwotCQkJdG9vbC5zZXRQcm9wZXJ0aWVzKGdldFRvb2xQcm9wZXJ0aWVzKCkpOwotCQkJcmV0dXJuIHRvb2w7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NWE1YmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtVmlzdWFsSURSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuTGlua05hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuVGFza05vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5UYXNrTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBUaGlzIHJlZ2lzdHJ5IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIHR5cGUgb2YgdmlzdWFsIG9iamVjdCBzaG91bGQgYmUKLSAqIGNyZWF0ZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIERpYWdyYW0sIE5vZGUsIENoaWxkTm9kZSBvciBMaW5rIHJlcHJlc2VudGVkIAotICogYnkgYSBkb21haW4gbW9kZWwgb2JqZWN0LgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfS0VZID0gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkuZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKQotCQkJKyAiL2RlYnVnL3Zpc3VhbElEIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFZpc3VhbElEKFZpZXcgdmlldykgewotCQlpZiAodmlldyBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCWlmIChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRC5lcXVhbHModmlldy5nZXRUeXBlKCkpKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRWaXN1YWxJRCh2aWV3LmdldFR5cGUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1vZGVsSUQoVmlldyB2aWV3KSB7Ci0JCVZpZXcgZGlhZ3JhbSA9IHZpZXcuZ2V0RGlhZ3JhbSgpOwotCQl3aGlsZSAodmlldyAhPSBkaWFncmFtKSB7Ci0JCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiAoU3RyaW5nKSBhbm5vdGF0aW9uLmdldERldGFpbHMoKS5nZXQoIm1vZGVsSUQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbSAhPSBudWxsID8gZGlhZ3JhbS5nZXRUeXBlKCkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRWaXN1YWxJRChTdHJpbmcgdHlwZSkgewotCQl0cnkgewotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQodHlwZSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZSgKLQkJCQkJUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oREVCVUdfS0VZKSkpIHsKLQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCSJVbmFibGUgdG8gcGFyc2UgdmlldyB0eXBlIGFzIGEgdmlzdWFsSUQgbnVtYmVyOiAiCS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJKyB0eXBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGUoaW50IHZpc3VhbElEKSB7Ci0JCXJldHVybiBTdHJpbmcudmFsdWVPZih2aXN1YWxJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldERpYWdyYW1WaXN1YWxJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsKLQkJaWYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzID0gZG9tYWluRWxlbWVudC5lQ2xhc3MoKTsKLQkJcmV0dXJuIGdldERpYWdyYW1WaXN1YWxJRChkb21haW5FbGVtZW50LCBkb21haW5FbGVtZW50TWV0YWNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldERpYWdyYW1WaXN1YWxJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQsCi0JCQlFQ2xhc3MgZG9tYWluRWxlbWVudE1ldGFjbGFzcykgewotCQlpZiAoTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKS5pc1N1cGVyVHlwZU9mKAotCQkJCWRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJJiYgaXNEaWFncmFtQWN0aXZpdHlEZXRhaWxEaWFncmFtXzc5KChBY3Rpdml0eURldGFpbERpYWdyYW0pIGRvbWFpbkVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuVklTVUFMX0lEOwotCQl9Ci0JCXJldHVybiBnZXRVbnJlY29nbml6ZWREaWFncmFtSUQoZG9tYWluRWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldE5vZGVWaXN1YWxJRChWaWV3IGNvbnRhaW5lclZpZXcsIEVPYmplY3QgZG9tYWluRWxlbWVudCkgewotCQlpZiAoZG9tYWluRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MgPSBkb21haW5FbGVtZW50LmVDbGFzcygpOwotCQlyZXR1cm4gZ2V0Tm9kZVZpc3VhbElEKGNvbnRhaW5lclZpZXcsIGRvbWFpbkVsZW1lbnQsCi0JCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldE5vZGVWaXN1YWxJRChWaWV3IGNvbnRhaW5lclZpZXcsCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIEVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzLAotCQkJU3RyaW5nIHNlbWFudGljSGludCkgewotCQlTdHJpbmcgY29udGFpbmVyTW9kZWxJRCA9IGdldE1vZGVsSUQoY29udGFpbmVyVmlldyk7Ci0JCWlmICghQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKGNvbnRhaW5lck1vZGVsSUQpKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaW50IGNvbnRhaW5lclZpc3VhbElEOwotCQlpZiAoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKGNvbnRhaW5lck1vZGVsSUQpKSB7Ci0JCQljb250YWluZXJWaXN1YWxJRCA9IGdldFZpc3VhbElEKGNvbnRhaW5lclZpZXcpOwotCQl9IGVsc2UgewotCQkJaWYgKGNvbnRhaW5lclZpZXcgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJY29udGFpbmVyVmlzdWFsSUQgPSBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpbnQgbm9kZVZpc3VhbElEID0gc2VtYW50aWNIaW50ICE9IG51bGwgPyBnZXRWaXN1YWxJRChzZW1hbnRpY0hpbnQpCi0JCQkJOiAtMTsKLQkJc3dpdGNoIChjb250YWluZXJWaXN1YWxJRCkgewotCQljYXNlIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBSb2xlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZU5vZGUoKS5pc1N1cGVyVHlwZU9mKAotCQkJCQkJCWRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlUm9sZU5vZGVfMjAwMSgoUm9sZU5vZGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBSb2xlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgVGFza05vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tOb2RlKCkuaXNTdXBlclR5cGVPZigKLQkJCQkJCQlkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZVRhc2tOb2RlXzIwMDIoKFRhc2tOb2RlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gVGFza05vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkUm9sZVRhc2tDb21wb3NpdGVfMTAwMUNoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfMjAwMygoV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkV29ya1Byb2R1Y3RDb21wb3NpdGVfMTAwMkNoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIFJvbGVOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKFJvbGVOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gUm9sZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZFJvbGVOb2RlXzIwMDFDaGlsZE5vZGVJRChkb21haW5FbGVtZW50LAotCQkJCQlzZW1hbnRpY0hpbnQpOwotCQljYXNlIFRhc2tOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKFRhc2tOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gVGFza05vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZFRhc2tOb2RlXzIwMDJDaGlsZE5vZGVJRChkb21haW5FbGVtZW50LAotCQkJCQlzZW1hbnRpY0hpbnQpOwotCQljYXNlIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfMjAwM0NoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRfNTAwMUNoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRfNTAwMkNoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVUYXNrQ29tcG9zaXRlKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZVJvbGVUYXNrQ29tcG9zaXRlXzEwMDEoKFJvbGVUYXNrQ29tcG9zaXRlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdENvbXBvc2l0ZSgpCi0JCQkJCQkJLmlzU3VwZXJUeXBlT2YoZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVXb3JrUHJvZHVjdENvbXBvc2l0ZV8xMDAyKChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZEFjdGl2aXR5RGV0YWlsRGlhZ3JhbV83OUNoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIExpbmtFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoTGlua05hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIExpbmtOYW1lRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZExpbmtfMzAwMUxpbmtMYWJlbElEKHNlbWFudGljSGludCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRMaW5rV2l0aENsYXNzVmlzdWFsSUQoRU9iamVjdCBkb21haW5FbGVtZW50KSB7Ci0JCWlmIChkb21haW5FbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlFQ2xhc3MgZG9tYWluRWxlbWVudE1ldGFjbGFzcyA9IGRvbWFpbkVsZW1lbnQuZUNsYXNzKCk7Ci0JCXJldHVybiBnZXRMaW5rV2l0aENsYXNzVmlzdWFsSUQoZG9tYWluRWxlbWVudCwgZG9tYWluRWxlbWVudE1ldGFjbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQsCi0JCQlFQ2xhc3MgZG9tYWluRWxlbWVudE1ldGFjbGFzcykgewotCQlpZiAoTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5rKCkuaXNTdXBlclR5cGVPZigKLQkJCQlkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNMaW5rV2l0aENsYXNzTGlua18zMDAxKChMaW5rKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCXJldHVybiBMaW5rRWRpdFBhcnQuVklTVUFMX0lEOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZExpbmtXaXRoQ2xhc3NJRChkb21haW5FbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEaWFncmFtQWN0aXZpdHlEZXRhaWxEaWFncmFtXzc5KAotCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWREaWFncmFtSUQoRU9iamVjdCBkb21haW5FbGVtZW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZVJvbGVUYXNrQ29tcG9zaXRlXzEwMDEoCi0JCQlSb2xlVGFza0NvbXBvc2l0ZSBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlV29ya1Byb2R1Y3RDb21wb3NpdGVfMTAwMigKLQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVSb2xlTm9kZV8yMDAxKFJvbGVOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVUYXNrTm9kZV8yMDAyKFRhc2tOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlXzIwMDMoCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRSb2xlVGFza0NvbXBvc2l0ZV8xMDAxQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkV29ya1Byb2R1Y3RDb21wb3NpdGVfMTAwMkNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZFJvbGVOb2RlXzIwMDFDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRUYXNrTm9kZV8yMDAyQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV8yMDAzQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50XzUwMDFDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRfNTAwMkNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZEFjdGl2aXR5RGV0YWlsRGlhZ3JhbV83OUNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZExpbmtfMzAwMUxpbmtMYWJlbElEKFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkTGlua1dpdGhDbGFzc0lEKEVPYmplY3QgZG9tYWluRWxlbWVudCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xpbmtXaXRoQ2xhc3NMaW5rXzMwMDEoTGluayBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvTWVzc2FnZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgxYTcxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoIm1lc3NhZ2VzIiwgTWVzc2FnZXMuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9PcGVuTW9kZWxSZXNvdXJjZUVycm9yRGlhbG9nVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX09wZW5Nb2RlbFJlc291cmNlRXJyb3JEaWFsb2dNZXNzYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtUHJvZ3Jlc3NUYXNrOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtQ29tbWFuZExhYmVsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX2lzTW9kaWZpYWJsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9VbmFibGVUb0xvYWRSZXNvdXJjZUVycm9yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX05vRGlhZ3JhbUluUmVzb3VyY2VFcnJvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9EaWFncmFtTG9hZGluZ0Vycm9yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1Vuc3luY2hyb25pemVkRmlsZVNhdmVFcnJvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9TYXZlRGlhZ3JhbVRhc2s7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfU2F2ZU5leHRSZXNvdXJjZVRhc2s7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVSZXNvdXJjZUVycm9yRGlhbG9nVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVSZXNvdXJjZUVycm9yRGlhbG9nTWVzc2FnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVdpemFyZFRpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fT3Blbk1vZGVsRmlsZURpYWxvZ1RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VOYW1lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VUaXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlRGVzY3JpcHRpb247Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlTmFtZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VUaXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VEZXNjcmlwdGlvbjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VTZWxlY3Rpb25UaXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOb1NlbGVjdGlvbk1lc3NhZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlSW52YWxpZFNlbGVjdGlvbk1lc3NhZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0luaXREaWFncmFtQ29tbWFuZDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5jb3JyZWN0Um9vdEVycm9yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vZGVzMUdyb3VwX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExpbmtzMkdyb3VwX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVOb2RlMUNyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlTm9kZTFDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlVGFza0NvbXBvc2l0ZTJDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZVRhc2tDb21wb3NpdGUyQ3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza05vZGUzQ3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tOb2RlM0NyZWF0aW9uVG9vbF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU0Q3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU0Q3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3RDb21wb3NpdGU1Q3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0Q29tcG9zaXRlNUNyZWF0aW9uVG9vbF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExpbmsxQ3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExpbmsxQ3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnRfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnRfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tbWFuZE5hbWVfT3BlbkRpYWdyYW07Ci0KLQkvL1RPRE86IHB1dCBhY2Nlc3NvciBmaWVsZHMgbWFudWFsbHkJCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L01vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWVlZWQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotCi0vKioKLSAqIFdpemFyZCBwYWdlIHRoYXQgYWxsb3dzIHRvIHNlbGVjdCBlbGVtZW50IGZyb20gbW9kZWwuCi0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBzZWxlY3RlZE1vZGVsRWxlbWVudDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRyZWVWaWV3ZXIgbW9kZWxWZXdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRNb2RlbEVsZW1lbnQoKSB7Ci0JCXJldHVybiBzZWxlY3RlZE1vZGVsRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWxFbGVtZW50KEVPYmplY3QgbW9kZWxFbGVtZW50KSB7Ci0JCXNlbGVjdGVkTW9kZWxFbGVtZW50ID0gbW9kZWxFbGVtZW50OwotCQlpZiAobW9kZWxWZXdlciAhPSBudWxsKSB7Ci0JCQlpZiAoc2VsZWN0ZWRNb2RlbEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCW1vZGVsVmV3ZXIuc2V0SW5wdXQoc2VsZWN0ZWRNb2RlbEVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJCW1vZGVsVmV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJc2VsZWN0ZWRNb2RlbEVsZW1lbnQpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbW9kZWxWZXdlci5zZXRJbnB1dChudWxsKTsKLQkJCX0KLQkJCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0JCUNvbXBvc2l0ZSBwbGF0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBsYXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXBsYXRlLnNldExheW91dChsYXlvdXQpOwotCQlzZXRDb250cm9sKHBsYXRlKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwbGF0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KGdldFNlbGVjdGlvblRpdGxlKCkpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCi0JCW1vZGVsVmV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwbGF0ZSwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGxheW91dERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJbGF5b3V0RGF0YS5oZWlnaHRIaW50ID0gMzAwOwotCQlsYXlvdXREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJbW9kZWxWZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJbW9kZWxWZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SXRlbVByb3ZpZGVyc0FkYXB0ZXJGYWN0b3J5KCkpKTsKLQkJbW9kZWxWZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJdGVtUHJvdmlkZXJzQWRhcHRlckZhY3RvcnkoKSkpOwotCQlpZiAoc2VsZWN0ZWRNb2RlbEVsZW1lbnQgIT0gbnVsbCkgewotCQkJbW9kZWxWZXdlci5zZXRJbnB1dChzZWxlY3RlZE1vZGVsRWxlbWVudC5lUmVzb3VyY2UoKSk7Ci0JCQltb2RlbFZld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJc2VsZWN0ZWRNb2RlbEVsZW1lbnQpKTsKLQkJfQotCQltb2RlbFZld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlNb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlLnRoaXMKLQkJCQkJCS51cGRhdGVTZWxlY3Rpb24oKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQotCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIHByb3ZpZGUgY3VzdG9tIG1vZGVsIGVsZW1lbnQgZGVzY3JpcHRpb24uCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0aW9uVGl0bGUoKSB7Ci0JCXJldHVybiAiU2VsZWN0IG1vZGVsIGVsZW1lbnQ6IjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZWxlY3RlZE1vZGVsRWxlbWVudCA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgSVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlzZWxlY3RlZEVsZW1lbnQgPSAoKElXcmFwcGVySXRlbVByb3ZpZGVyKSBzZWxlY3RlZEVsZW1lbnQpCi0JCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGZWF0dXJlTWFwLkVudHJ5KSB7Ci0JCQkJc2VsZWN0ZWRFbGVtZW50ID0gKChGZWF0dXJlTWFwLkVudHJ5KSBzZWxlY3RlZEVsZW1lbnQpCi0JCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJc2VsZWN0ZWRNb2RlbEVsZW1lbnQgPSAoRU9iamVjdCkgc2VsZWN0ZWRFbGVtZW50OwotCQkJfQotCQl9Ci0JCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gcHJvdmlkZSBzcGVjaWZpYyB2YWxpZGF0aW9uIG9mIHRoZSBzZWxlY3RlZCBtb2RlbCBlbGVtZW50LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0MzA1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcmVmZXJlbmNlcy9EaWFncmFtQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLkFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcmVmZXJlbmNlcy9EaWFncmFtQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZlMjZmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcmVmZXJlbmNlcy9EaWFncmFtQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlKCkgewotCQlzZXRQcmVmZXJlbmNlU3RvcmUoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkxMzM5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcmVmZXJlbmNlcy9EaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLkRpYWdyYW1zUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUdlbmVyYWxQcmVmZXJlbmNlUGFnZSBleHRlbmRzIERpYWdyYW1zUHJlZmVyZW5jZVBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlKCkgewotCQlzZXRQcmVmZXJlbmNlU3RvcmUoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MwOWU2YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcmVmZXJlbmNlcy9EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJRGlhZ3JhbVByaW50aW5nUHJlZmVyZW5jZVBhZ2UuaW5pdERlZmF1bHRzKHN0b3JlKTsKLQkJRGlhZ3JhbUdlbmVyYWxQcmVmZXJlbmNlUGFnZS5pbml0RGVmYXVsdHMoc3RvcmUpOwotCQlEaWFncmFtQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlLmluaXREZWZhdWx0cyhzdG9yZSk7Ci0JCURpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlLmluaXREZWZhdWx0cyhzdG9yZSk7Ci0JCURpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UuaW5pdERlZmF1bHRzKHN0b3JlKTsKLQkJRGlhZ3JhbUNvcmVVdGlsLnNldERlZmF1bHRGb250UHJlZmVyZW5jZShnZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCURpYWdyYW1Db3JlVXRpbC5zZXREZWZhdWx0TGluZVN0eWxlKGdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbVByaW50aW5nUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNzA2MWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbVByaW50aW5nUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuUHJpbnRpbmdQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByaW50aW5nUHJlZmVyZW5jZVBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcmVmZXJlbmNlcy9EaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcmVmZXJlbmNlcy9EaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZmNmYjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbVJ1bGVyc0FuZEdyaWRQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5SdWxlckdyaWRQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUnVsZXJHcmlkUHJlZmVyZW5jZVBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlKCkgewotCQlzZXRQcmVmZXJlbmNlU3RvcmUoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtQWJzdHJhY3RQYXJzZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtQWJzdHJhY3RQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU5MmNhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbUFic3RyYWN0UGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5QYXJzZVBvc2l0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bUxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5TZXRWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5TZXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlhZ3JhbUFic3RyYWN0UGFyc2VyIGltcGxlbWVudHMgSVBhcnNlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdmlld1BhdHRlcm47Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNZXNzYWdlRm9ybWF0IHZpZXdQcm9jZXNzb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZWRpdFBhdHRlcm47Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNZXNzYWdlRm9ybWF0IGVkaXRQcm9jZXNzb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWaWV3UGF0dGVybigpIHsKLQkJcmV0dXJuIHZpZXdQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBnZXRWaWV3UHJvY2Vzc29yKCkgewotCQlyZXR1cm4gdmlld1Byb2Nlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vmlld1BhdHRlcm4oU3RyaW5nIHZpZXdQYXR0ZXJuKSB7Ci0JCXRoaXMudmlld1BhdHRlcm4gPSB2aWV3UGF0dGVybjsKLQkJdmlld1Byb2Nlc3NvciA9IGNyZWF0ZVZpZXdQcm9jZXNzb3Iodmlld1BhdHRlcm4pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBjcmVhdGVWaWV3UHJvY2Vzc29yKFN0cmluZyB2aWV3UGF0dGVybikgewotCQlyZXR1cm4gbmV3IE1lc3NhZ2VGb3JtYXQodmlld1BhdHRlcm4pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRQYXR0ZXJuKCkgewotCQlyZXR1cm4gZWRpdFBhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGdldEVkaXRQcm9jZXNzb3IoKSB7Ci0JCXJldHVybiBlZGl0UHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0UGF0dGVybihTdHJpbmcgZWRpdFBhdHRlcm4pIHsKLQkJdGhpcy5lZGl0UGF0dGVybiA9IGVkaXRQYXR0ZXJuOwotCQllZGl0UHJvY2Vzc29yID0gY3JlYXRlRWRpdFByb2Nlc3NvcihlZGl0UGF0dGVybik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGNyZWF0ZUVkaXRQcm9jZXNzb3IoU3RyaW5nIGVkaXRQYXR0ZXJuKSB7Ci0JCXJldHVybiBuZXcgTWVzc2FnZUZvcm1hdChlZGl0UGF0dGVybik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbnRTdHJpbmcoSUFkYXB0YWJsZSBhZGFwdGVyLCBpbnQgZmxhZ3MpIHsKLQkJcmV0dXJuIGdldFN0cmluZ0J5UGF0dGVybihhZGFwdGVyLCBmbGFncywgZ2V0Vmlld1BhdHRlcm4oKSwKLQkJCQlnZXRWaWV3UHJvY2Vzc29yKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRTdHJpbmcoSUFkYXB0YWJsZSBhZGFwdGVyLCBpbnQgZmxhZ3MpIHsKLQkJcmV0dXJuIGdldFN0cmluZ0J5UGF0dGVybihhZGFwdGVyLCBmbGFncywgZ2V0RWRpdFBhdHRlcm4oKSwKLQkJCQlnZXRFZGl0UHJvY2Vzc29yKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFN0cmluZ0J5UGF0dGVybihJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncywKLQkJCVN0cmluZyBwYXR0ZXJuLCBNZXNzYWdlRm9ybWF0IHByb2Nlc3Nvcik7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXJFZGl0U3RhdHVzIGlzVmFsaWRFZGl0U3RyaW5nKElBZGFwdGFibGUgZWxlbWVudCwKLQkJCVN0cmluZyBlZGl0U3RyaW5nKSB7Ci0JCVBhcnNlUG9zaXRpb24gcG9zID0gbmV3IFBhcnNlUG9zaXRpb24oMCk7Ci0JCU9iamVjdFtdIHZhbHVlcyA9IGdldEVkaXRQcm9jZXNzb3IoKS5wYXJzZShlZGl0U3RyaW5nLCBwb3MpOwotCQlpZiAodmFsdWVzID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgUGFyc2VyRWRpdFN0YXR1cyhBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCUlQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEUsICJJbnZhbGlkIGlucHV0IGF0ICIKLQkJCQkJCQkrIHBvcy5nZXRFcnJvckluZGV4KCkpOwotCQl9Ci0JCXJldHVybiB2YWxpZGF0ZU5ld1ZhbHVlcyh2YWx1ZXMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlckVkaXRTdGF0dXMgdmFsaWRhdGVOZXdWYWx1ZXMoT2JqZWN0W10gdmFsdWVzKSB7Ci0JCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb21tYW5kIGdldFBhcnNlQ29tbWFuZChJQWRhcHRhYmxlIGFkYXB0ZXIsIFN0cmluZyBuZXdTdHJpbmcsCi0JCQlpbnQgZmxhZ3MpIHsKLQkJT2JqZWN0W10gdmFsdWVzID0gZ2V0RWRpdFByb2Nlc3NvcigpLnBhcnNlKG5ld1N0cmluZywKLQkJCQluZXcgUGFyc2VQb3NpdGlvbigwKSk7Ci0JCWlmICh2YWx1ZXMgPT0gbnVsbAotCQkJCXx8IHZhbGlkYXRlTmV3VmFsdWVzKHZhbHVlcykuZ2V0Q29kZSgpICE9IElQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VDb21tYW5kKGFkYXB0ZXIsIHZhbHVlcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJQ29tbWFuZCBnZXRQYXJzZUNvbW1hbmQoSUFkYXB0YWJsZSBhZGFwdGVyLAotCQkJT2JqZWN0W10gdmFsdWVzKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcihJQWRhcHRhYmxlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRNb2RpZmljYXRpb25Db21tYW5kKEVPYmplY3QgZWxlbWVudCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJdmFsdWUgPSBnZXRWYWxpZE5ld1ZhbHVlKGZlYXR1cmUsIHZhbHVlKTsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW52YWxpZFZhbHVlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlTZXRSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgU2V0UmVxdWVzdChlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCXJldHVybiBuZXcgU2V0VmFsdWVDb21tYW5kKHJlcXVlc3QpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbGlkVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlFQ2xhc3NpZmllciB0eXBlID0gZmVhdHVyZS5nZXRFVHlwZSgpOwotCQlpZiAodHlwZSBpbnN0YW5jZW9mIEVEYXRhVHlwZSkgewotCQkJQ2xhc3MgaUNsYXNzID0gdHlwZS5nZXRJbnN0YW5jZUNsYXNzKCk7Ci0JCQlpZiAoU3RyaW5nLmNsYXNzLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsaWROZXdWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCUVDbGFzc2lmaWVyIHR5cGUgPSBmZWF0dXJlLmdldEVUeXBlKCk7Ci0JCWlmICh0eXBlIGluc3RhbmNlb2YgRURhdGFUeXBlKSB7Ci0JCQlDbGFzcyBpQ2xhc3MgPSB0eXBlLmdldEluc3RhbmNlQ2xhc3MoKTsKLQkJCWlmIChCb29sZWFuLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQl2YWx1ZSA9IEJvb2xlYW4udmFsdWVPZigoU3RyaW5nKSB2YWx1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCSJWYWx1ZSBvZiB0eXBlIEJvb2xlYW4gaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKENoYXJhY3Rlci5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl2YWx1ZSA9IG5ldyBDaGFyYWN0ZXIocy5jaGFyQXQoMCkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCSJWYWx1ZSBvZiB0eXBlIENoYXJhY3RlciBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoQnl0ZS5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQnl0ZSkgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJdmFsdWUgPSBuZXcgQnl0ZSgoKE51bWJlcikgdmFsdWUpLmJ5dGVWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWUgPSBCeXRlLnZhbHVlT2Yocyk7Ci0JCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCQkJIlN0cmluZyB2YWx1ZSBkb2VzIG5vdCBjb252ZXJ0IHRvIEJ5dGUgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBCeXRlIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChTaG9ydC5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU2hvcnQpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IFNob3J0KCgoTnVtYmVyKSB2YWx1ZSkuc2hvcnRWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWUgPSBTaG9ydC52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBTaG9ydCB2YWx1ZSIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJWYWx1ZSBvZiB0eXBlIFNob3J0IGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChJbnRlZ2VyLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnRlZ2VyKCgoTnVtYmVyKSB2YWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gSW50ZWdlci52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBJbnRlZ2VyIHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJIlZhbHVlIG9mIHR5cGUgSW50ZWdlciBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoTG9uZy5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTG9uZykgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJdmFsdWUgPSBuZXcgTG9uZygoKE51bWJlcikgdmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWUgPSBMb25nLnZhbHVlT2Yocyk7Ci0JCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCQkJIlN0cmluZyB2YWx1ZSBkb2VzIG5vdCBjb252ZXJ0IHRvIExvbmcgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBMb25nIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChGbG9hdC5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRmxvYXQpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IEZsb2F0KCgoTnVtYmVyKSB2YWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWUgPSBGbG9hdC52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBGbG9hdCB2YWx1ZSIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJWYWx1ZSBvZiB0eXBlIEZsb2F0IGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChEb3VibGUuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIERvdWJsZSkgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJdmFsdWUgPSBuZXcgRG91YmxlKCgoTnVtYmVyKSB2YWx1ZSkuZG91YmxlVmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gRG91YmxlLnZhbHVlT2Yocyk7Ci0JCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCQkJIlN0cmluZyB2YWx1ZSBkb2VzIG5vdCBjb252ZXJ0IHRvIERvdWJsZSB2YWx1ZSIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJWYWx1ZSBvZiB0eXBlIERvdWJsZSBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIEVFbnVtKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCUVFbnVtTGl0ZXJhbCBsaXRlcmFsID0gKChFRW51bSkgdHlwZSkKLQkJCQkJCQkuZ2V0RUVudW1MaXRlcmFsQnlMaXRlcmFsKChTdHJpbmcpIHZhbHVlKTsKLQkJCQkJaWYgKGxpdGVyYWwgPT0gbnVsbCkgewotCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJVbmtub3duIGxpdGVyYWw6ICIgKyB2YWx1ZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl2YWx1ZSA9IGxpdGVyYWwuZ2V0SW5zdGFuY2UoKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBTdHJpbmcgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgSW52YWxpZFZhbHVlIHsKLQotCQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotCQlwdWJsaWMgSW52YWxpZFZhbHVlKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBkZXNjcmlwdGlvbjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzJiMDFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmFjdGlvbi5jb250cmlidXRpb25pdGVtLkFic3RyYWN0Q29udHJpYnV0aW9uSXRlbVByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnV0aWwuSVdvcmtiZW5jaFBhcnREZXNjcmlwdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZy5hY3Rpb25zLlByaW50UHJldmlld0FjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcucmVuZGVyLmFjdGlvbnMuRW5oYW5jZWRQcmludEFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLnJlbmRlci5hY3Rpb25zLlJlbmRlcmVkUHJpbnRQcmV2aWV3QWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUFic3RyYWN0Q29udHJpYnV0aW9uSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUFjdGlvbiBjcmVhdGVBY3Rpb24oU3RyaW5nIGFjdGlvbklkLAotCQkJSVdvcmtiZW5jaFBhcnREZXNjcmlwdG9yIHBhcnREZXNjcmlwdG9yKSB7Ci0JCWlmIChhY3Rpb25JZC5lcXVhbHMoUHJpbnRQcmV2aWV3QWN0aW9uLklEKSkgewotCQkJcmV0dXJuIG5ldyBSZW5kZXJlZFByaW50UHJldmlld0FjdGlvbigKLQkJCQkJbmV3IEVuaGFuY2VkUHJpbnRBY3Rpb25IZWxwZXIoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUFjdGlvbihhY3Rpb25JZCwgcGFydERlc2NyaXB0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1FZGl0UGFydFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbUVkaXRQYXJ0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg1OTljNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbUVkaXRQYXJ0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmVkaXRwYXJ0LkFic3RyYWN0RWRpdFBhcnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmVkaXRwYXJ0LkNyZWF0ZUdyYXBoaWNFZGl0UGFydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmVkaXRwYXJ0LklFZGl0UGFydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkRpYWdyYW1FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRWRpdFBhcnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RWRpdFBhcnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFZGl0UGFydEZhY3RvcnkgZmFjdG9yeTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gYWxsb3dDYWNoaW5nOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgV2Vha1JlZmVyZW5jZSBjYWNoZWRQYXJ0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgV2Vha1JlZmVyZW5jZSBjYWNoZWRWaWV3OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtRWRpdFBhcnRQcm92aWRlcigpIHsKLQkJc2V0RmFjdG9yeShuZXcgRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSgpKTsKLQkJc2V0QWxsb3dDYWNoaW5nKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgRWRpdFBhcnRGYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGYWN0b3J5KEVkaXRQYXJ0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQWxsb3dDYWNoaW5nKCkgewotCQlyZXR1cm4gYWxsb3dDYWNoaW5nOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgc2V0QWxsb3dDYWNoaW5nKGJvb2xlYW4gYWxsb3dDYWNoaW5nKSB7Ci0JCXRoaXMuYWxsb3dDYWNoaW5nID0gYWxsb3dDYWNoaW5nOwotCQlpZiAoIWFsbG93Q2FjaGluZykgewotCQkJY2FjaGVkUGFydCA9IG51bGw7Ci0JCQljYWNoZWRWaWV3ID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUdyYXBoaWNhbEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlFZGl0UGFydCBwYXJ0ID0gZmFjdG9yeS5jcmVhdGVFZGl0UGFydChudWxsLCB2aWV3KTsKLQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCXJldHVybiAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENhY2hlZFBhcnQoVmlldyB2aWV3KSB7Ci0JCWlmIChjYWNoZWRWaWV3ICE9IG51bGwgJiYgY2FjaGVkVmlldy5nZXQoKSA9PSB2aWV3KSB7Ci0JCQlyZXR1cm4gKElHcmFwaGljYWxFZGl0UGFydCkgY2FjaGVkUGFydC5nZXQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJR3JhcGhpY2FsRWRpdFBhcnQgY3JlYXRlR3JhcGhpY0VkaXRQYXJ0KFZpZXcgdmlldykgewotCQlpZiAoaXNBbGxvd0NhY2hpbmcoKSkgewotCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSBnZXRDYWNoZWRQYXJ0KHZpZXcpOwotCQkJY2FjaGVkUGFydCA9IG51bGw7Ci0JCQljYWNoZWRWaWV3ID0gbnVsbDsKLQkJCWlmIChwYXJ0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcGFydDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY3JlYXRlRWRpdFBhcnQodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBwcm92aWRlcyhJT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgQ3JlYXRlR3JhcGhpY0VkaXRQYXJ0T3BlcmF0aW9uKSB7Ci0JCQlWaWV3IHZpZXcgPSAoKElFZGl0UGFydE9wZXJhdGlvbikgb3BlcmF0aW9uKS5nZXRWaWV3KCk7Ci0JCQlpZiAoIUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lECi0JCQkJCS5lcXVhbHMoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0TW9kZWxJRCh2aWV3KSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoaXNBbGxvd0NhY2hpbmcoKSAmJiBnZXRDYWNoZWRQYXJ0KHZpZXcpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCUlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gY3JlYXRlRWRpdFBhcnQodmlldyk7Ci0JCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJaWYgKGlzQWxsb3dDYWNoaW5nKCkpIHsKLQkJCQkJY2FjaGVkUGFydCA9IG5ldyBXZWFrUmVmZXJlbmNlKHBhcnQpOwotCQkJCQljYWNoZWRWaWV3ID0gbmV3IFdlYWtSZWZlcmVuY2Uodmlldyk7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1FbGVtZW50VHlwZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtRWxlbWVudFR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMjUzMTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1FbGVtZW50VHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLkVsZW1lbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRWxlbWVudFR5cGVzIGV4dGVuZHMgRWxlbWVudEluaXRpYWxpemVycyB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaWFncmFtRWxlbWVudFR5cGVzKCkgewotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNYXAgZWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlUmVnaXN0cnkgZ2V0SW1hZ2VSZWdpc3RyeSgpIHsKLQkJaWYgKGltYWdlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJaW1hZ2VSZWdpc3RyeSA9IG5ldyBJbWFnZVJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRJbWFnZVJlZ2lzdHJ5S2V5KEVOYW1lZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRQcm92aWRlZEltYWdlRGVzY3JpcHRvcigKLQkJCUVOYW1lZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVTdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZWxlbWVudCk7Ci0JCQlFQ2xhc3MgZUNvbnRhaW5pbmdDbGFzcyA9IGZlYXR1cmUuZ2V0RUNvbnRhaW5pbmdDbGFzcygpOwotCQkJRUNsYXNzaWZpZXIgZVR5cGUgPSBmZWF0dXJlLmdldEVUeXBlKCk7Ci0JCQlpZiAoZUNvbnRhaW5pbmdDbGFzcyAhPSBudWxsICYmICFlQ29udGFpbmluZ0NsYXNzLmlzQWJzdHJhY3QoKSkgewotCQkJCWVsZW1lbnQgPSBlQ29udGFpbmluZ0NsYXNzOwotCQkJfSBlbHNlIGlmIChlVHlwZSBpbnN0YW5jZW9mIEVDbGFzcwotCQkJCQkmJiAhKChFQ2xhc3MpIGVUeXBlKS5pc0Fic3RyYWN0KCkpIHsKLQkJCQllbGVtZW50ID0gZVR5cGU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKLQkJCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKSBlbGVtZW50OwotCQkJaWYgKCFlQ2xhc3MuaXNBYnN0cmFjdCgpKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SXRlbUltYWdlRGVzY3JpcHRvcigKLQkJCQkJCQkJZUNsYXNzLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpCi0JCQkJCQkJCQkJLmNyZWF0ZShlQ2xhc3MpKTsKLQkJCX0KLQkJfQotCQkvLyBUT0RPIDogc3VwcG9ydCBzdHJ1Y3R1cmFsIGZlYXR1cmVzCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoRU5hbWVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBrZXkgPSBnZXRJbWFnZVJlZ2lzdHJ5S2V5KGVsZW1lbnQpOwotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldERlc2NyaXB0b3Ioa2V5KTsKLQkJaWYgKGltYWdlRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSBnZXRQcm92aWRlZEltYWdlRGVzY3JpcHRvcihlbGVtZW50KTsKLQkJCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQl9Ci0JCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KGtleSwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKEVOYW1lZEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcga2V5ID0gZ2V0SW1hZ2VSZWdpc3RyeUtleShlbGVtZW50KTsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZ2V0UHJvdmlkZWRJbWFnZURlc2NyaXB0b3IoZWxlbWVudCk7Ci0JCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQkJfQotCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChrZXksIGltYWdlRGVzY3JpcHRvcik7Ci0JCQlpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihJQWRhcHRhYmxlIGhpbnQpIHsKLQkJRU5hbWVkRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudChoaW50KTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldEltYWdlRGVzY3JpcHRvcihlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShJQWRhcHRhYmxlIGhpbnQpIHsKLQkJRU5hbWVkRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudChoaW50KTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldEltYWdlKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgJ3R5cGUnIG9mIHRoZSBlY29yZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBoaW50LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVOYW1lZEVsZW1lbnQgZ2V0RWxlbWVudChJQWRhcHRhYmxlIGhpbnQpIHsKLQkJT2JqZWN0IHR5cGUgPSBoaW50LmdldEFkYXB0ZXIoSUVsZW1lbnRUeXBlLmNsYXNzKTsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCWVsZW1lbnRzID0gbmV3IElkZW50aXR5SGFzaE1hcCgpOwotCi0JCQllbGVtZW50cy5wdXQoQWN0aXZpdHlEZXRhaWxEaWFncmFtXzc5LCBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKSk7Ci0KLQkJCWVsZW1lbnRzLnB1dChSb2xlVGFza0NvbXBvc2l0ZV8xMDAxLCBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRSb2xlVGFza0NvbXBvc2l0ZSgpKTsKLQotCQkJZWxlbWVudHMucHV0KFdvcmtQcm9kdWN0Q29tcG9zaXRlXzEwMDIsIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFdvcmtQcm9kdWN0Q29tcG9zaXRlKCkpOwotCi0JCQllbGVtZW50cy5wdXQoUm9sZU5vZGVfMjAwMSwgTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlTm9kZSgpKTsKLQotCQkJZWxlbWVudHMucHV0KFRhc2tOb2RlXzIwMDIsIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza05vZGUoKSk7Ci0KLQkJCWVsZW1lbnRzLnB1dChXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlXzIwMDMsIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoKSk7Ci0KLQkJCWVsZW1lbnRzLnB1dChMaW5rXzMwMDEsIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluaygpKTsKLQkJfQotCQlyZXR1cm4gKEVOYW1lZEVsZW1lbnQpIGVsZW1lbnRzLmdldCh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQWN0aXZpdHlEZXRhaWxEaWFncmFtXzc5ID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5BY3Rpdml0eURldGFpbERpYWdyYW1fNzkiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIFJvbGVOb2RlXzIwMDEgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLlJvbGVOb2RlXzIwMDEiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIFRhc2tOb2RlXzIwMDIgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLlRhc2tOb2RlXzIwMDIiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfMjAwMyA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV8yMDAzIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBSb2xlVGFza0NvbXBvc2l0ZV8xMDAxID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5Sb2xlVGFza0NvbXBvc2l0ZV8xMDAxIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBXb3JrUHJvZHVjdENvbXBvc2l0ZV8xMDAyID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5Xb3JrUHJvZHVjdENvbXBvc2l0ZV8xMDAyIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBMaW5rXzMwMDEgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLkxpbmtfMzAwMSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSUVsZW1lbnRUeXBlIGdldEVsZW1lbnRUeXBlKFN0cmluZyBpZCkgewotCQlyZXR1cm4gRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFR5cGUoaWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTZXQgS05PV05fRUxFTUVOVF9UWVBFUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNLbm93bkVsZW1lbnRUeXBlKElFbGVtZW50VHlwZSBlbGVtZW50VHlwZSkgewotCQlpZiAoS05PV05fRUxFTUVOVF9UWVBFUyA9PSBudWxsKSB7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTID0gbmV3IEhhc2hTZXQoKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbV83OSk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChSb2xlVGFza0NvbXBvc2l0ZV8xMDAxKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFdvcmtQcm9kdWN0Q29tcG9zaXRlXzEwMDIpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoUm9sZU5vZGVfMjAwMSk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChUYXNrTm9kZV8yMDAyKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfMjAwMyk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChMaW5rXzMwMDEpOwotCQl9Ci0JCXJldHVybiBLTk9XTl9FTEVNRU5UX1RZUEVTLmNvbnRhaW5zKGVsZW1lbnRUeXBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbUljb25Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1JY29uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc5NTViYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbUljb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuQWJzdHJhY3RQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmljb24uR2V0SWNvbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuaWNvbi5JSWNvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtSWNvblByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlJY29uUHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJY29uKElBZGFwdGFibGUgaGludCwgaW50IGZsYWdzKSB7Ci0JCXJldHVybiBEaWFncmFtRWxlbWVudFR5cGVzLmdldEltYWdlKGhpbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlcyhJT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgR2V0SWNvbk9wZXJhdGlvbikgewotCQkJcmV0dXJuICgoR2V0SWNvbk9wZXJhdGlvbikgb3BlcmF0aW9uKS5leGVjdXRlKHRoaXMpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1Nb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkN2JmNzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1Nb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLkVsZW1lbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLm1vZGVsaW5nYXNzaXN0YW50Lk1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbU1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIgZXh0ZW5kcyBNb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFR5cGVzRm9yUG9wdXBCYXIoSUFkYXB0YWJsZSBob3N0KSB7Ci0JCUlHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpIGhvc3QKLQkJCQkuZ2V0QWRhcHRlcihJR3JhcGhpY2FsRWRpdFBhcnQuY2xhc3MpOwotCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQlMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJLy8JCQl0eXBlcy5hZGQoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Sb2xlTm9kZV8yMDAxKTsKLQkJCS8vCQkJdHlwZXMuYWRkKERpYWdyYW1FbGVtZW50VHlwZXMuVGFza05vZGVfMjAwMik7Ci0JCQlyZXR1cm4gdHlwZXM7Ci0JCX0KLQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgewotCQkJTGlzdCB0eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCS8vCQkJdHlwZXMuYWRkKERpYWdyYW1FbGVtZW50VHlwZXMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV8yMDAzKTsKLQkJCXJldHVybiB0eXBlczsKLQkJfQotCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgewotCQkJTGlzdCB0eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXR5cGVzLmFkZChEaWFncmFtRWxlbWVudFR5cGVzLlJvbGVUYXNrQ29tcG9zaXRlXzEwMDEpOwotCQkJdHlwZXMuYWRkKERpYWdyYW1FbGVtZW50VHlwZXMuV29ya1Byb2R1Y3RDb21wb3NpdGVfMTAwMik7Ci0JCQlyZXR1cm4gdHlwZXM7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlbFR5cGVzT25Tb3VyY2UoSUFkYXB0YWJsZSBzb3VyY2UpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlbFR5cGVzT25UYXJnZXQoSUFkYXB0YWJsZSB0YXJnZXQpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlbFR5cGVzT25Tb3VyY2VBbmRUYXJnZXQoSUFkYXB0YWJsZSBzb3VyY2UsCi0JCQlJQWRhcHRhYmxlIHRhcmdldCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0VHlwZXNGb3JTb3VyY2UoSUFkYXB0YWJsZSB0YXJnZXQsCi0JCQlJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0VHlwZXNGb3JUYXJnZXQoSUFkYXB0YWJsZSBzb3VyY2UsCi0JCQlJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3Qgc2VsZWN0RXhpc3RpbmdFbGVtZW50Rm9yU291cmNlKElBZGFwdGFibGUgdGFyZ2V0LAotCQkJSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsKLQkJcmV0dXJuIHNlbGVjdEV4aXN0aW5nRWxlbWVudCh0YXJnZXQsIGdldFR5cGVzRm9yU291cmNlKHRhcmdldCwKLQkJCQlyZWxhdGlvbnNoaXBUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IHNlbGVjdEV4aXN0aW5nRWxlbWVudEZvclRhcmdldChJQWRhcHRhYmxlIHNvdXJjZSwKLQkJCUlFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7Ci0JCXJldHVybiBzZWxlY3RFeGlzdGluZ0VsZW1lbnQoc291cmNlLCBnZXRUeXBlc0ZvclRhcmdldChzb3VyY2UsCi0JCQkJcmVsYXRpb25zaGlwVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBzZWxlY3RFeGlzdGluZ0VsZW1lbnQoSUFkYXB0YWJsZSBob3N0LCBDb2xsZWN0aW9uIHR5cGVzKSB7Ci0JCWlmICh0eXBlcy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpIGhvc3QKLQkJCQkuZ2V0QWRhcHRlcihJR3JhcGhpY2FsRWRpdFBhcnQuY2xhc3MpOwotCQlpZiAoZWRpdFBhcnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldFJvb3QoKS5nZXRDb250ZW50cygpLmdldE1vZGVsKCk7Ci0JCUNvbGxlY3Rpb24gZWxlbWVudHMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGlhZ3JhbS5nZXRFbGVtZW50KCkuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlpZiAoaXNBcHBsaWNhYmxlRWxlbWVudChlbGVtZW50LCB0eXBlcykpIHsKLQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdEVsZW1lbnQoKEVPYmplY3RbXSkgZWxlbWVudHMudG9BcnJheShuZXcgRU9iamVjdFtlbGVtZW50cwotCQkJCS5zaXplKCldKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQXBwbGljYWJsZUVsZW1lbnQoRU9iamVjdCBlbGVtZW50LCBDb2xsZWN0aW9uIHR5cGVzKSB7Ci0JCUlFbGVtZW50VHlwZSB0eXBlID0gRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRUeXBlKAotCQkJCWVsZW1lbnQpOwotCQlyZXR1cm4gdHlwZXMuY29udGFpbnModHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IHNlbGVjdEVsZW1lbnQoRU9iamVjdFtdIGVsZW1lbnRzKSB7Ci0JCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJdGVtUHJvdmlkZXJzQWRhcHRlckZhY3RvcnkoKSk7Ci0JCUVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZygKLQkJCQlzaGVsbCwgbGFiZWxQcm92aWRlcik7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKCJBdmFpbGFibGUgZG9tYWluIG1vZGVsIGVsZW1lbnRzOiIpOwotCQlkaWFsb2cuc2V0VGl0bGUoIlNlbGVjdCBkb21haW4gbW9kZWwgZWxlbWVudCIpOwotCQlkaWFsb2cuc2V0TXVsdGlwbGVTZWxlY3Rpb24oZmFsc2UpOwotCQlkaWFsb2cuc2V0RWxlbWVudHMoZWxlbWVudHMpOwotCQlFT2JqZWN0IHNlbGVjdGVkID0gbnVsbDsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlzZWxlY3RlZCA9IChFT2JqZWN0KSBkaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsKLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1QYWxldHRlUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtUGFsZXR0ZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YmFlNDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1QYWxldHRlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5BYnN0cmFjdFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLnBhbGV0dGUuSVBhbGV0dGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtUGFsZXR0ZUZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVBhbGV0dGVQcm92aWRlciBleHRlbmRzIEFic3RyYWN0UHJvdmlkZXIgaW1wbGVtZW50cwotCQlJUGFsZXR0ZVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9QYWxldHRlKElFZGl0b3JQYXJ0IGVkaXRvciwgT2JqZWN0IGNvbnRlbnQsCi0JCQlQYWxldHRlUm9vdCByb290LCBNYXAgcHJlZGVmaW5lZEVudHJpZXMpIHsKLQkJRGlhZ3JhbVBhbGV0dGVGYWN0b3J5IGZhY3RvcnkgPSBuZXcgRGlhZ3JhbVBhbGV0dGVGYWN0b3J5KCk7Ci0JCWZhY3RvcnkuZmlsbFBhbGV0dGUocm9vdCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRyaWJ1dGlvbnMoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpIHsKLQkJLy8gbm8gY29uZmlndXJhdGlvbgotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlcyhJT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlyZXR1cm4gZmFsc2U7IC8vIGFsbCBsb2dpYyBpcyBkb25lIGluIHRoZSBzZXJ2aWNlCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1QYXJzZXJQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1QYXJzZXJQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzI5NTAzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtUGFyc2VyUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5BYnN0cmFjdFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLkdldFBhcnNlck9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlRhc2tOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUGFyc2VyUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFByb3ZpZGVyIGltcGxlbWVudHMKLQkJSVBhcnNlclByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcm9sZU5vZGVSb2xlTm9kZU5hbWVfNDAwMVBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0Um9sZU5vZGVSb2xlTm9kZU5hbWVfNDAwMVBhcnNlcigpIHsKLQkJaWYgKHJvbGVOb2RlUm9sZU5vZGVOYW1lXzQwMDFQYXJzZXIgPT0gbnVsbCkgewotCQkJcm9sZU5vZGVSb2xlTm9kZU5hbWVfNDAwMVBhcnNlciA9IGNyZWF0ZVJvbGVOb2RlUm9sZU5vZGVOYW1lXzQwMDFQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gcm9sZU5vZGVSb2xlTm9kZU5hbWVfNDAwMVBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlUm9sZU5vZGVSb2xlTm9kZU5hbWVfNDAwMVBhcnNlcigpIHsKLQkJRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZE5vZGVfTmFtZSgpKTsKLQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH0iKTsKLQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH0iKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHRhc2tOb2RlVGFza05vZGVOYW1lXzQwMDJQYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGdldFRhc2tOb2RlVGFza05vZGVOYW1lXzQwMDJQYXJzZXIoKSB7Ci0JCWlmICh0YXNrTm9kZVRhc2tOb2RlTmFtZV80MDAyUGFyc2VyID09IG51bGwpIHsKLQkJCXRhc2tOb2RlVGFza05vZGVOYW1lXzQwMDJQYXJzZXIgPSBjcmVhdGVUYXNrTm9kZVRhc2tOb2RlTmFtZV80MDAyUGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHRhc2tOb2RlVGFza05vZGVOYW1lXzQwMDJQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZVRhc2tOb2RlVGFza05vZGVOYW1lXzQwMDJQYXJzZXIoKSB7Ci0JCURpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWROb2RlX05hbWUoKSk7Ci0JCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9Iik7Ci0JCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9Iik7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciB3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVfNDAwM1BhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lXzQwMDNQYXJzZXIoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVfNDAwM1BhcnNlciA9PSBudWxsKSB7Ci0JCQl3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVfNDAwM1BhcnNlciA9IGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZV80MDAzUGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZV80MDAzUGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVfNDAwM1BhcnNlcigpIHsKLQkJRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZE5vZGVfTmFtZSgpKTsKLQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH0iKTsKLQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH0iKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGxpbmtMaW5rTmFtZV80MDA0UGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRMaW5rTGlua05hbWVfNDAwNFBhcnNlcigpIHsKLQkJaWYgKGxpbmtMaW5rTmFtZV80MDA0UGFyc2VyID09IG51bGwpIHsKLQkJCWxpbmtMaW5rTmFtZV80MDA0UGFyc2VyID0gY3JlYXRlTGlua0xpbmtOYW1lXzQwMDRQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gbGlua0xpbmtOYW1lXzQwMDRQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZUxpbmtMaW5rTmFtZV80MDA0UGFyc2VyKCkgewotCQlEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IERpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcigKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmtfTmFtZSgpKTsKLQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH0iKTsKLQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH0iKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgZ2V0UGFyc2VyKGludCB2aXN1YWxJRCkgewotCQlzd2l0Y2ggKHZpc3VhbElEKSB7Ci0JCWNhc2UgUm9sZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldFJvbGVOb2RlUm9sZU5vZGVOYW1lXzQwMDFQYXJzZXIoKTsKLQkJY2FzZSBUYXNrTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0VGFza05vZGVUYXNrTm9kZU5hbWVfNDAwMlBhcnNlcigpOwotCQljYXNlIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZV80MDAzUGFyc2VyKCk7Ci0JCWNhc2UgTGlua05hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0TGlua0xpbmtOYW1lXzQwMDRQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKElBZGFwdGFibGUgaGludCkgewotCQlTdHJpbmcgdmlkID0gKFN0cmluZykgaGludC5nZXRBZGFwdGVyKFN0cmluZy5jbGFzcyk7Ci0JCWlmICh2aWQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFBhcnNlcihEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWQpKTsKLQkJfQotCQlWaWV3IHZpZXcgPSAoVmlldykgaGludC5nZXRBZGFwdGVyKFZpZXcuY2xhc3MpOwotCQlpZiAodmlldyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0UGFyc2VyKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXMoSU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEdldFBhcnNlck9wZXJhdGlvbikgewotCQkJSUFkYXB0YWJsZSBoaW50ID0gKChHZXRQYXJzZXJPcGVyYXRpb24pIG9wZXJhdGlvbikuZ2V0SGludCgpOwotCQkJaWYgKERpYWdyYW1FbGVtZW50VHlwZXMuZ2V0RWxlbWVudChoaW50KSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIGdldFBhcnNlcihoaW50KSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVByb3BlcnR5UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtUHJvcGVydHlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjJjYzJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtUHJvcGVydHlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnByb3BlcnRpZXMuR2V0UHJvcGVydHlTb3VyY2VPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnByb3BlcnRpZXMuSUNvbXBvc2l0ZVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wcm9wZXJ0aWVzLklQcm9wZXJ0aWVzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnByb3BlcnRpZXMucHJvdmlkZXJzLkdlbmVyaWNFTUZQcm9wZXJ0aWVzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Qcm9wZXJ0eVByb3ZpZGVyIGV4dGVuZHMgR2VuZXJpY0VNRlByb3BlcnRpZXNQcm92aWRlcgotCQlpbXBsZW1lbnRzIElQcm9wZXJ0aWVzUHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBHZXRQcm9wZXJ0eVNvdXJjZU9wZXJhdGlvbikgewotCQkJT2JqZWN0IG9iamVjdCA9ICgoR2V0UHJvcGVydHlTb3VyY2VPcGVyYXRpb24pIG9wZXJhdGlvbikKLQkJCQkJLmdldE9iamVjdCgpOwotCQkJcmV0dXJuIGdldFNlbWFudGljRWxlbWVudChvYmplY3QpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbXBvc2l0ZVByb3BlcnR5U291cmNlIGdldFByb3BlcnR5U291cmNlKE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gZ2V0U2VtYW50aWNFbGVtZW50KG9iamVjdCk7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eVNvdXJjZShlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0U2VtYW50aWNFbGVtZW50KE9iamVjdCBvYmplY3QpIHsKLQkJVmlldyB2aWV3ID0gbnVsbDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCXZpZXcgPSAoVmlldykgb2JqZWN0OwotCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgb2JqZWN0OwotCQkJaWYgKGVkaXRQYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJdmlldyA9IChWaWV3KSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJfQotCQl9Ci0JCWlmICh2aWV3ICE9IG51bGwKLQkJCQkmJiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRAotCQkJCQkJLmVxdWFscyhEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKHZpZXcpKSkgewotCQkJcmV0dXJuIHZpZXcuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTkyNGNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS50ZXh0LkZpZWxkUG9zaXRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgZXh0ZW5kcyBEaWFncmFtQWJzdHJhY3RQYXJzZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWVzc2FnZUZvcm1hdCBERUZBVUxUX1BST0NFU1NPUiA9IG5ldyBNZXNzYWdlRm9ybWF0KAotCQkJInswfSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGdldFZpZXdQcm9jZXNzb3IoKSB7Ci0JCU1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yID0gc3VwZXIuZ2V0Vmlld1Byb2Nlc3NvcigpOwotCQlyZXR1cm4gcHJvY2Vzc29yID09IG51bGwgPyBERUZBVUxUX1BST0NFU1NPUiA6IHByb2Nlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgZ2V0RWRpdFByb2Nlc3NvcigpIHsKLQkJTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IgPSBzdXBlci5nZXRFZGl0UHJvY2Vzc29yKCk7Ci0JCXJldHVybiBwcm9jZXNzb3IgPT0gbnVsbCA/IERFRkFVTFRfUFJPQ0VTU09SIDogcHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXREb21haW5FbGVtZW50KEVPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmdCeVBhdHRlcm4oSUFkYXB0YWJsZSBhZGFwdGVyLCBpbnQgZmxhZ3MsCi0JCQlTdHJpbmcgcGF0dGVybiwgTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGFkYXB0ZXIuZ2V0QWRhcHRlcihFT2JqZWN0LmNsYXNzKTsKLQkJZWxlbWVudCA9IGdldERvbWFpbkVsZW1lbnQoZWxlbWVudCk7Ci0JCXJldHVybiBnZXRTdHJpbmdCeVBhdHRlcm4oZWxlbWVudCwgZmVhdHVyZSwgcHJvY2Vzc29yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmdCeVBhdHRlcm4oRU9iamVjdCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnQgPT0gbnVsbCA/IG51bGwgOiBlbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCXZhbHVlID0gZ2V0VmFsaWRWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JCXJldHVybiBwcm9jZXNzb3IuZm9ybWF0KG5ldyBPYmplY3RbXSB7IHZhbHVlIH0sIG5ldyBTdHJpbmdCdWZmZXIoKSwKLQkJCQluZXcgRmllbGRQb3NpdGlvbigwKSkudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXJFZGl0U3RhdHVzIHZhbGlkYXRlVmFsdWVzKE9iamVjdFtdIHZhbHVlcykgewotCQlpZiAodmFsdWVzLmxlbmd0aCA+IDEpIHsKLQkJCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEVfU1RBVFVTOwotCQl9Ci0JCU9iamVjdCB2YWx1ZSA9IHZhbHVlcy5sZW5ndGggPT0gMSA/IHZhbHVlc1swXSA6IG51bGw7Ci0JCXZhbHVlID0gZ2V0VmFsaWROZXdWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludmFsaWRWYWx1ZSkgewotCQkJcmV0dXJuIG5ldyBQYXJzZXJFZGl0U3RhdHVzKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJSVBhcnNlckVkaXRTdGF0dXMuVU5FRElUQUJMRSwgdmFsdWUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEVfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbW1hbmQgZ2V0UGFyc2VDb21tYW5kKElBZGFwdGFibGUgYWRhcHRlciwgT2JqZWN0W10gdmFsdWVzKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBhZGFwdGVyLmdldEFkYXB0ZXIoRU9iamVjdC5jbGFzcyk7Ci0JCWVsZW1lbnQgPSBnZXREb21haW5FbGVtZW50KGVsZW1lbnQpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gVHJhbnNhY3Rpb25VdGlsCi0JCQkJLmdldEVkaXRpbmdEb21haW4oZWxlbWVudCk7Ci0JCWlmIChlZGl0aW5nRG9tYWluID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCU9iamVjdCB2YWx1ZSA9IHZhbHVlcy5sZW5ndGggPT0gMSA/IHZhbHVlc1swXSA6IG51bGw7Ci0JCUlDb21tYW5kIGNvbW1hbmQgPSBnZXRNb2RpZmljYXRpb25Db21tYW5kKGVsZW1lbnQsIGZlYXR1cmUsIHZhbHVlKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZChlZGl0aW5nRG9tYWluLCBjb21tYW5kCi0JCQkJLmdldExhYmVsKCksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY29tbWFuZCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FmZmVjdGluZ0V2ZW50KE9iamVjdCBldmVudCwgaW50IGZsYWdzKSB7Ci0JCWlmIChldmVudCBpbnN0YW5jZW9mIE5vdGlmaWNhdGlvbikgewotCQkJcmV0dXJuIGlzQWZmZWN0aW5nRmVhdHVyZSgoKE5vdGlmaWNhdGlvbikgZXZlbnQpLmdldEZlYXR1cmUoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FmZmVjdGluZ0ZlYXR1cmUoT2JqZWN0IGV2ZW50RmVhdHVyZSkgewotCQlyZXR1cm4gZmVhdHVyZSA9PSBldmVudEZlYXR1cmU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtU3RydWN0dXJhbEZlYXR1cmVzUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ODVjNDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS50ZXh0LkZpZWxkUG9zaXRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIgZXh0ZW5kcyBEaWFncmFtQWJzdHJhY3RQYXJzZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBmZWF0dXJlczsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlc1BhcnNlcihMaXN0IGZlYXR1cmVzKSB7Ci0JCXRoaXMuZmVhdHVyZXMgPSBmZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmdCeVBhdHRlcm4oSUFkYXB0YWJsZSBhZGFwdGVyLCBpbnQgZmxhZ3MsCi0JCQlTdHJpbmcgcGF0dGVybiwgTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGFkYXB0ZXIuZ2V0QWRhcHRlcihFT2JqZWN0LmNsYXNzKTsKLQkJTGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KGZlYXR1cmVzLnNpemUoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJCXZhbHVlID0gZ2V0VmFsaWRWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl2YWx1ZXMuYWRkKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gcHJvY2Vzc29yLmZvcm1hdCh2YWx1ZXMudG9BcnJheShuZXcgT2JqZWN0W3ZhbHVlcy5zaXplKCldKSwKLQkJCQluZXcgU3RyaW5nQnVmZmVyKCksIG5ldyBGaWVsZFBvc2l0aW9uKDApKS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlckVkaXRTdGF0dXMgdmFsaWRhdGVWYWx1ZXMoT2JqZWN0W10gdmFsdWVzKSB7Ci0JCWlmICh2YWx1ZXMubGVuZ3RoICE9IGZlYXR1cmVzLnNpemUoKSkgewotCQkJcmV0dXJuIFBhcnNlckVkaXRTdGF0dXMuVU5FRElUQUJMRV9TVEFUVVM7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCB2YWx1ZSA9IGdldFZhbGlkTmV3VmFsdWUoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMKLQkJCQkJLmdldChpKSwgdmFsdWVzW2ldKTsKLQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludmFsaWRWYWx1ZSkgewotCQkJCXJldHVybiBuZXcgUGFyc2VyRWRpdFN0YXR1cygKLQkJCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEUsIHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb21tYW5kIGdldFBhcnNlQ29tbWFuZChJQWRhcHRhYmxlIGFkYXB0ZXIsIE9iamVjdFtdIHZhbHVlcykgewotCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgYWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gVHJhbnNhY3Rpb25VdGlsCi0JCQkJLmdldEVkaXRpbmdEb21haW4oZWxlbWVudCk7Ci0JCWlmIChlZGl0aW5nRG9tYWluID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoCi0JCQkJZWRpdGluZ0RvbWFpbiwgIlNldCBWYWx1ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7Ci0JCQljb21tYW5kCi0JCQkJCS5jb21wb3NlKGdldE1vZGlmaWNhdGlvbkNvbW1hbmQoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWVzW2ldKSk7Ci0JCX0KLQkJcmV0dXJuIGNvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWZmZWN0aW5nRXZlbnQoT2JqZWN0IGV2ZW50LCBpbnQgZmxhZ3MpIHsKLQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgTm90aWZpY2F0aW9uKSB7Ci0JCQlPYmplY3QgZmVhdHVyZSA9ICgoTm90aWZpY2F0aW9uKSBldmVudCkuZ2V0RmVhdHVyZSgpOwotCQkJaWYgKGZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtVmlld1Byb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVZpZXdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDgyYjA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtVmlld1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByb3ZpZGVycy5BYnN0cmFjdFZpZXdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZU5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5UYXNrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlRhc2tOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3Rvcmllcy5MaW5rTmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3Rvcmllcy5MaW5rVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzLlJvbGVOb2RlTmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3Rvcmllcy5Sb2xlTm9kZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3Rvcmllcy5Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXMuUm9sZVRhc2tDb21wb3NpdGVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXMuVGFza05vZGVOYW1lVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzLlRhc2tOb2RlVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzLldvcmtQcm9kdWN0Q29tcG9zaXRlVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzLldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudFZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3Rvcmllcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3Rvcmllcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlVmlld0ZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVZpZXdQcm92aWRlciBleHRlbmRzIEFic3RyYWN0Vmlld1Byb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0RGlhZ3JhbVZpZXdDbGFzcyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVN0cmluZyBkaWFncmFtS2luZCkgewotCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGdldFNlbWFudGljRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIpOwotCQlpZiAoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKGRpYWdyYW1LaW5kKQotCQkJCSYmIERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldERpYWdyYW1WaXN1YWxJRChzZW1hbnRpY0VsZW1lbnQpICE9IC0xKSB7Ci0JCQlyZXR1cm4gQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXROb2RlVmlld0NsYXNzKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJVmlldyBjb250YWluZXJWaWV3LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCWlmIChjb250YWluZXJWaWV3ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9IGdldFNlbWFudGljRWxlbWVudFR5cGUoc2VtYW50aWNBZGFwdGVyKTsKLQkJaWYgKGVsZW1lbnRUeXBlICE9IG51bGwKLQkJCQkmJiAhRGlhZ3JhbUVsZW1lbnRUeXBlcy5pc0tub3duRWxlbWVudFR5cGUoZWxlbWVudFR5cGUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlFQ2xhc3Mgc2VtYW50aWNUeXBlID0gZ2V0U2VtYW50aWNFQ2xhc3Moc2VtYW50aWNBZGFwdGVyKTsKLQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBnZXRTZW1hbnRpY0VsZW1lbnQoc2VtYW50aWNBZGFwdGVyKTsKLQkJaW50IG5vZGVWSUQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQoY29udGFpbmVyVmlldywKLQkJCQlzZW1hbnRpY0VsZW1lbnQsIHNlbWFudGljVHlwZSwgc2VtYW50aWNIaW50KTsKLQkJc3dpdGNoIChub2RlVklEKSB7Ci0JCWNhc2UgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gUm9sZVRhc2tDb21wb3NpdGVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBXb3JrUHJvZHVjdENvbXBvc2l0ZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIFJvbGVOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFJvbGVOb2RlVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgUm9sZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFJvbGVOb2RlTmFtZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIFRhc2tOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFRhc2tOb2RlVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgVGFza05vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFRhc2tOb2RlTmFtZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudFZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBMaW5rTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBMaW5rTmFtZVZpZXdGYWN0b3J5LmNsYXNzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0RWRnZVZpZXdDbGFzcyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVZpZXcgY29udGFpbmVyVmlldywgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSBnZXRTZW1hbnRpY0VsZW1lbnRUeXBlKHNlbWFudGljQWRhcHRlcik7Ci0JCWlmIChlbGVtZW50VHlwZSAhPSBudWxsCi0JCQkJJiYgIURpYWdyYW1FbGVtZW50VHlwZXMuaXNLbm93bkVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRUNsYXNzIHNlbWFudGljVHlwZSA9IGdldFNlbWFudGljRUNsYXNzKHNlbWFudGljQWRhcHRlcik7Ci0JCWlmIChzZW1hbnRpY1R5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBnZXRTZW1hbnRpY0VsZW1lbnQoc2VtYW50aWNBZGFwdGVyKTsKLQkJaW50IGxpbmtWSUQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRMaW5rV2l0aENsYXNzVmlzdWFsSUQoCi0JCQkJc2VtYW50aWNFbGVtZW50LCBzZW1hbnRpY1R5cGUpOwotCQlzd2l0Y2ggKGxpbmtWSUQpIHsKLQkJY2FzZSBMaW5rRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIExpbmtWaWV3RmFjdG9yeS5jbGFzczsKLQkJfQotCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkQ29ubmVjdG9yVmlld0NsYXNzKHNlbWFudGljQWRhcHRlciwKLQkJCQljb250YWluZXJWaWV3LCBzZW1hbnRpY0hpbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElFbGVtZW50VHlwZSBnZXRTZW1hbnRpY0VsZW1lbnRUeXBlKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyKSB7Ci0JCWlmIChzZW1hbnRpY0FkYXB0ZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChJRWxlbWVudFR5cGUpIHNlbWFudGljQWRhcHRlci5nZXRBZGFwdGVyKElFbGVtZW50VHlwZS5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ2xhc3MgZ2V0VW5yZWNvZ25pemVkQ29ubmVjdG9yVmlld0NsYXNzKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJVmlldyBjb250YWluZXJWaWV3LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCS8vIEhhbmRsZSB1bnJlY29nbml6ZWQgY2hpbGQgbm9kZSBjbGFzc2VzIGhlcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRWxlbWVudEluaXRpYWxpemVycy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0VsZW1lbnRJbml0aWFsaXplcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU1Zjc4NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRWxlbWVudEluaXRpYWxpemVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRJbml0aWFsaXplcnMgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvc2VydmljZS9EaWFncmFtUmVzZXRTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9zZXJ2aWNlL0RpYWdyYW1SZXNldFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQzYmIzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9zZXJ2aWNlL0RpYWdyYW1SZXNldFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuc2VydmljZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLmltcGwuSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuVGFza05vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuY29tbWFuZHMuQ2hhbmdlQm91bmRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRGVmYXVsdEVkaXREb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5GaWd1cmVVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci0KLS8qKgotICogU2VydmljZSBjbGFzcyBmb3IgcmVzZXQgdGhlIEFjdGl2aXR5IERldGFpbCBEaWFncmFtLgotICogQ29kZSBtaWdyYXRlZCBmcm9tIG9sZCBkaWFncmFtIGNvZGUuICAgCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUmVzZXRTZXJ2aWNlIHsKLQotCXByaXZhdGUgRGVmYXVsdEVkaXREb21haW4gZWRpdERvbWFpbjsKLQotCXByaXZhdGUgR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlcjsKLQotCXByaXZhdGUgQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnk7Ci0KLQlwcml2YXRlIEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdHJhbnNhY3Rpb25Eb21haW47Ci0JCi0JaW50IGRlbHRhID0gMDsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU1HX0hFSUdIVCA9IDMyOwotCi0JcHVibGljIERpYWdyYW1SZXNldFNlcnZpY2UoSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0cmFuc2FjdGlvbkRvbWFpbiwgCi0JCQlHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyLCBEZWZhdWx0RWRpdERvbWFpbiBlZGl0RG9tYWluLAotCQkJQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnkpIHsKLQkJdGhpcy50cmFuc2FjdGlvbkRvbWFpbiA9IHRyYW5zYWN0aW9uRG9tYWluOwotCQl0aGlzLmdyYXBoaWNhbFZpZXdlciA9IGdyYXBoaWNhbFZpZXdlcjsKLQkJdGhpcy5lZGl0RG9tYWluID0gZWRpdERvbWFpbjsKLQkJdGhpcy5hY3Rpb25SZWdpc3RyeSA9IGFjdGlvblJlZ2lzdHJ5OwotCX0KLQotCXByaXZhdGUgR3JhcGhpY2FsVmlld2VyIGdldEdyYXBoaWNhbFZpZXdlcigpIHsKLQkJcmV0dXJuIGdyYXBoaWNhbFZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb21tYW5kIHN0YWNrLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbW1hbmQgc3RhY2sKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZFN0YWNrIGdldENvbW1hbmRTdGFjaygpIHsKLQkJcmV0dXJuIGdldEVkaXREb21haW4oKS5nZXRDb21tYW5kU3RhY2soKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlZGl0IGRvbWFpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlZGl0IGRvbWFpbgotCSAqLwotCXByb3RlY3RlZCBEZWZhdWx0RWRpdERvbWFpbiBnZXRFZGl0RG9tYWluKCkgewotCQlyZXR1cm4gZWRpdERvbWFpbjsKLQl9Ci0KLQkvKioKLQkgKiBMYXppbHkgY3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgYWN0aW9uIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFjdGlvbiByZWdpc3RyeQotCSAqLwotCXByb3RlY3RlZCBBY3Rpb25SZWdpc3RyeSBnZXRBY3Rpb25SZWdpc3RyeSgpIHsKLQkJcmV0dXJuIGFjdGlvblJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB1c2VkIG9ubHkgaW4gQWN0aXZpdHlEZXRhaWxEaWFncmFtIG9yIGFueSBkaWFncmFtIG5lZWQgYXV0by1sYXlvdXQuCi0JICogTWV0aG9kIHdpbGwgdmVyaWZ5IHJlY2VudGx5IGFkZGVkIGVkaXRwYXJ0cyBpbiB0aGUgQWN0aXZpdHlkZXRhaWxkaWFncmFtIGVkaXRwYXJ0Ci0JICogaW5kaXJlY3RseSBmcm9tIFdvcmtCcmVha2Rvd25TdHJ1Y3R1cmUgKG1lYW5zIGFueSBkZXNjcmlwdG9ycyBjcmVhdGVkIGluIHdicywgY29ycmVzcG9uZGluZwotCSAqIEVkaXRQYXJ0IHdpbGwgZ2V0IGNyZWF0ZWQgaW4gQWN0aXZpdHlEZXRhaWxEaWFncmFtIFZpZXdlcikgYW5kIGRvZXMgYXV0by1sYXlvdXQKLQkgKiBhbGwgdGhlIG5ldyBhZGRlZCBlZGl0cGFydHMgYW5kIGV4aXN0aW5nIG9uZXMuIAotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFuVXBEaWFncmFtKCkgewotCQlpZiAoZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0Q29udGVudHMoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSB7Ci0JCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCBkZXAgPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCS5nZXRDb250ZW50cygpOwotCQkJTGlzdCBjaGlsZHJlbiA9IGRlcC5nZXRSZWNlbnRseUFkZGVkUGFydHMoKTsKLQkJCQotCQkJLy8gSWYgYW55IG9ibGlxdWUgbGlua3MgcmVjdGlmeSB0aGVtIHRvIHN0cmFpZ2h0LiAKLS8vCQkJYW55T2JsaXF1ZUxpbmtzKGRlcCwgY2hpbGRyZW4pOwotCQkJCi0JCQlpZiAoIWNoaWxkcmVuLmlzRW1wdHkoKSkgewotCQkJCUNvbXBhcmF0b3I8T2JqZWN0PiBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3I8T2JqZWN0PigpIHsKLQotCQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7Ci0JCQkJCQlpbnQgcmMgPSAwOwotCQkJCQkJaWYgKGFyZzAgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQkJCQkJaWYgKCEoYXJnMSBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpKQotCQkJCQkJCQlyYyA9IC0xOwotCQkJCQkJfSBlbHNlIGlmIChhcmcxIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkKLQkJCQkJCQlyYyA9IDE7Ci0JCQkJCQlyZXR1cm4gcmM7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfTsKLQotCQkJCU9iamVjdFtdIGFycmF5ID0gY2hpbGRyZW4udG9BcnJheSgpOwotCQkJCUFycmF5cy5zb3J0KGFycmF5LCBjb21wYXJhdG9yKTsKLQkJCQlmb3IgKGludCBhID0gMDsgYSA8IGFycmF5Lmxlbmd0aDsgYSsrKSB7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgYXJyYXlbYV07Ci0JCQkJCWFkanVzdFNpemUoZXApOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBmb3JjZSByZWxheW91dCBhZnRlciBzaXplIGFkanVzdG1lbnQKLQkJCQkvLwotCQkJCWRlcC5nZXRWaWV3cG9ydCgpLnZhbGlkYXRlKCk7Ci0JCQkJCi0JCQkJZm9yIChpbnQgYiA9IDA7IGIgPCBhcnJheS5sZW5ndGg7IGIrKykgewotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGFycmF5W2JdOwotCQkJCQljbGVhblVwKGVwKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgYyA9IDA7IGMgPCBhcnJheS5sZW5ndGg7IGMrKykgewotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGFycmF5W2NdOwotCQkJCQlyZWR1Y2VMaW5rTGVuZ3RoKGVwKTsKLQkJCQl9Ci0vLwkJCQlmb3IgKGludCBjID0gMDsgYyA8IGFycmF5Lmxlbmd0aDsgYysrKSB7Ci0vLwkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBhcnJheVtjXTsKLS8vCQkJCQlpZihlcCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpewotLy8JCQkJCQlyZXNldFNpemVzKGVwLCBlcCk7Ci0vLwkJCQkJfQotLy8JCQkJfQotCQkJCXBhY2tEaWFncmFtKCk7Ci0JCQkJZGVwLnJlZnJlc2goKTsKLQkJCQlkZXAuY2xlYXJSZWNlbnRseUFkZGVkUGFydHMoKTsKLQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBkb2VzIGEgdmVydGljYWwgYWxpZ25tZW50IG9mIGFsbCBub2RlcyB3aXRoIGxpbmtzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFuVXAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCkgewotCQlpZiAoIShlcCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpKSB7Ci0JCQlMaXN0IHNvdXJjZUxpbmtzID0gZXAuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCWlmIChzb3VyY2VMaW5rcy5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChpbnQgYiA9IDA7IGIgPCBzb3VyY2VMaW5rcy5zaXplKCk7IGIrKykgewotCQkJCQlDb25uZWN0aW9uTm9kZUVkaXRQYXJ0IGxpbmsgPSAoQ29ubmVjdGlvbk5vZGVFZGl0UGFydCkgc291cmNlTGlua3MuZ2V0KGIpOwotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHRhcmdldCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBsaW5rCi0JCQkJCQkJLmdldFRhcmdldCgpOwotCQkJCQlpbnQgdyA9IHRhcmdldC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS53aWR0aDsKLQkJCQkJaW50IGV3ID0gZXAuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoOwotCQkJCQlpZiAodyA8IGV3KSB7Ci0JCQkJCQlDb21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwgKChOb2RlKSBlcAotCQkJCQkJCQkuZ2V0TW9kZWwoKSksIHRhcmdldC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSwgdywgdGFyZ2V0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQpOwotCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCWludCBoID0gdGFyZ2V0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQkJCQl0YXJnZXQuZ2V0RmlndXJlKCkKLQkJCQkJCQkJLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbih3LCBoKSk7Ci0JCQkJCQl0YXJnZXQuZ2V0RmlndXJlKCkuc2V0U2l6ZShuZXcgRGltZW5zaW9uKHcsIGgpKTsKLQkJCQkJfQotCQkJCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWxpc3QuYWRkKGVwKTsKLQkJCQkJbGlzdC5hZGQodGFyZ2V0KTsKLQkJCQkJdmVydGljYWxBbGlnblRvRmlyc3RTZWxlY3RlZChsaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlMaXN0IHRhcmdldExpbmtzID0gZXAuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCWlmICh0YXJnZXRMaW5rcy5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChpbnQgYiA9IDA7IGIgPCB0YXJnZXRMaW5rcy5zaXplKCk7IGIrKykgewotCQkJCQlDb25uZWN0aW9uTm9kZUVkaXRQYXJ0IGxpbmsgPSAoQ29ubmVjdGlvbk5vZGVFZGl0UGFydCkgdGFyZ2V0TGlua3MuZ2V0KGIpOwotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBsaW5rCi0JCQkJCQkJLmdldFNvdXJjZSgpOwotCQkJCQlpbnQgdyA9IHNvdXJjZS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS53aWR0aDsKLQkJCQkJaW50IGV3ID0gZXAuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoOwotCQkJCQlpZiAodyA8IGV3KSB7Ci0JCQkJCQlDb21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwoKE5vZGUpIGVwCi0JCQkJCQkJCS5nZXRNb2RlbCgpKSwgc291cmNlLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCQkJCS5nZXRMb2NhdGlvbigpLCB3LC0xKTsKLQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQlpbnQgaCA9IHNvdXJjZS5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCQkJc291cmNlLmdldEZpZ3VyZSgpCi0JCQkJCQkJCS5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24odywgaCkpOwotCQkJCQkJc291cmNlLmdldEZpZ3VyZSgpLnNldFNpemUobmV3IERpbWVuc2lvbih3LCBoKSk7Ci0JCQkJCX0KLQkJCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlsaXN0LmFkZChlcCk7Ci0JCQkJCWxpc3QuYWRkKHNvdXJjZSk7Ci0JCQkJCXZlcnRpY2FsQWxpZ25Ub0ZpcnN0U2VsZWN0ZWQobGlzdCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGVwIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCB8fCAKLQkJCQkJZXAgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQkJTGlzdCBjaGlsZHJlbiA9IGVwLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChpbnQgZCA9IDA7IGQgPCBjaGlsZHJlbi5zaXplKCk7IGQrKykgewotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRyZW4KLQkJCQkJCQkuZ2V0KGQpOwotCQkJCQljbGVhblVwKHApOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqICBGb3IgYXV0by1sYXlvdXQsIG5lZWQgdG8gYWRqdXN0IGNvbm5lY3Rpb24ob3IgbGluaykgbGVuZ3RoLCBiYXNlZCBvbgotCSAqICBjb25uZWN0aW5nIGVkaXRwYXJ0cyhmaWd1cmVzKS4KLQkgKiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcmVkdWNlTGlua0xlbmd0aChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQpIHsKLQkJYm9vbGVhbiBtb3ZlZCA9IGZhbHNlOwotCQkvLyBvbmx5IG1vdmUgbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlIGVsZW1lbnRzCi0JCWlmIChwYXJ0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgewotCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBsaW5rZWRQYXJ0ID0gbnVsbDsKLQkJCWludCBwb3NpdGlvbiA9IFBvc2l0aW9uQ29uc3RhbnRzLkNFTlRFUjsKLQkJCS8vIGlzIHRoaXMgZWxlbWVudCBsaW5rZWQgdG8gYW5vdGhlciBpdGVtPwotCQkJaWYgKHBhcnQuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJbGlua2VkUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSAoKENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQpIHBhcnQKLQkJCQkJCS5nZXRUYXJnZXRDb25uZWN0aW9ucygpLmdldCgwKSkuZ2V0U291cmNlKCk7Ci0JCQkJcG9zaXRpb24gPSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSDsKLQkJCX0gZWxzZSBpZiAocGFydC5nZXRTb3VyY2VDb25uZWN0aW9ucygpLnNpemUoKSA+IDApIHsKLQkJCQlsaW5rZWRQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpICgoQ29ubmVjdGlvbk5vZGVFZGl0UGFydCkgcGFydAotCQkJCQkJLmdldFNvdXJjZUNvbm5lY3Rpb25zKCkuZ2V0KDApKS5nZXRUYXJnZXQoKTsKLQkJCQlwb3NpdGlvbiA9IFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIOwotCQkJfQotCQkJaWYgKGxpbmtlZFBhcnQgIT0gbnVsbCkgewotCQkJCWlmICghKGxpbmtlZFBhcnQuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpKSB7Ci0JCQkJCWxpbmtlZFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgbGlua2VkUGFydAotCQkJCQkJCS5nZXRQYXJlbnQoKTsKLQkJCQl9Ci0JCQkJLy8gZ2V0IHRoZSBwYXJ0J3MgcG9zaXRpb24KLQkJCQlSZWN0YW5nbGUgcGFydEJvdW5kcyA9IHBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJLy8gZ2V0IHRoZSBsaW5rZWQgcGFydCdzIHBvc2l0aW9uCi0JCQkJUmVjdGFuZ2xlIGxpbmtlZFBhcnRCb3VuZHMgPSBsaW5rZWRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCS8vIGRldGVybWluZSBpbiB3aGljaCBkaXJlY3Rpb24gaXMgdGhlIGxpbmtlZCBwYXJ0Ci0JCQkJLy8gaW50IHBvc2l0aW9uID0gcGFydEJvdW5kcy5nZXRQb3NpdGlvbihsaW5rZWRQYXJ0Qm91bmRzCi0JCQkJLy8gLmdldExvY2F0aW9uKCkpOwotCQkJCS8vIGFzc3VtZSBpdCBpcyBiZWxvdyB1cywgc28gdGhpcyBwYXJ0IG1vdmVzIHVwCi0JCQkJaW50IGRpcmVjdGlvbiA9IC0xOwotCQkJCWlmICgocG9zaXRpb24gJiBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCkgPT0gUG9zaXRpb25Db25zdGFudHMuTk9SVEgKLQkJCQkJCXx8IChwb3NpdGlvbiAmIFBvc2l0aW9uQ29uc3RhbnRzLkNFTlRFUikgPT0gUG9zaXRpb25Db25zdGFudHMuQ0VOVEVSKSB7Ci0JCQkJCS8vIGFib3ZlIHVzLCBtb3ZlIGRvd24KLQkJCQkJZGlyZWN0aW9uID0gMTsKLQkJCQl9Ci0JCQkJLy8gc2V0IG5ldyBib3VuZHMgZm9yIHRoZSBwYXJ0IHNvIHRoYXQgaXQgc2l0ZXMganVzdCBvdXRzaWRlIG9mCi0JCQkJLy8gdGhlIGxpbmtlZCBwYXJ0Ci0JCQkJUmVjdGFuZ2xlIHRlc3RCb3VuZHMgPSBwYXJ0Qm91bmRzLmdldENvcHkoKTsKLQkJCQlpZiAoZGlyZWN0aW9uID09IDEpIHsKLQkJCQkJdGVzdEJvdW5kcy55ID0gbGlua2VkUGFydEJvdW5kcy55ICsgbGlua2VkUGFydEJvdW5kcy5oZWlnaHQKLQkJCQkJCQkrIFZFUlRfUElYX1BBRERJTkc7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGVzdEJvdW5kcy55ID0gbGlua2VkUGFydEJvdW5kcy55IC0gVkVSVF9QSVhfUEFERElORwotCQkJCQkJCS0gcGFydEJvdW5kcy5oZWlnaHQ7Ci0JCQkJfQotCQkJCS8vIHNldCB0aGUgbmV3IGxvY2F0aW9uIGZvciB0aGUgcGFydCBpbiB0aGUgbW9kZWwKLQkJCQlQb2ludCBucCA9IG5ldyBQb2ludCh0ZXN0Qm91bmRzLngsIHRlc3RCb3VuZHMueSk7Ci0JCQkJcGFydC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbihucCk7Ci0JCQkJQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQodHJhbnNhY3Rpb25Eb21haW4sKE5vZGUpIHBhcnQuZ2V0TW9kZWwoKSwgbnAsCi0JCQkJCQlwYXJ0Qm91bmRzLndpZHRoLCAtMSk7Ci0JCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW92ZWQ7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHRvIGFkanVzdCB0aGUgc2l6ZSBvZiBlZGl0cGFydC4gIAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGp1c3RTaXplKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXApIHsKLQkJaWYgKGVwIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgewotCQkJYWRqdXN0U2l6ZSgoV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgZXAsIDEpOwotCQl9Ci0JCWVsc2UgaWYgKGVwIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgewotCQkJYWRqdXN0U2l6ZSgoUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgZXAsIDUwKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IEhPUklaX1BJWF9QQURESU5HID0gMzA7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBWRVJUX1BJWF9QQURESU5HID0gMjA7Ci0KLQkvKioKLQkgKiBBZGp1c3RzIHRoZSBzaXplIG9mIENvbnRhaW5lckVkaXRQYXJ0IHRvIGFjY29tb2RhdGUgbnVtYmVyIG9mIGVkaXRwYXJ0cyBpbiBhIHJvdywKLQkgKiBwdXNoIHRoZSByZW1haW5pbmcgdGhlIGVkaXRwYXJ0cyBpbiB0d28gc2Vjb25kIHJvdy4gCi0JICogVGhpcyBpcyB1c2VmdWwgZm9yIHtAbGluayBUb29sYmFyTGF5b3V0fQotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGp1c3RTaXplKFNoYXBlTm9kZUVkaXRQYXJ0IGVwLCBpbnQgaG9yaXpDb3VudCkgewotCQlpbnQgcmVxdWlyZWRXaWR0aCA9IDA7Ci0JCWludCByb3dNYXhIZWlnaHQgPSAwOwotCQlpbnQgcm93cyA9IDA7Ci0JCWludCB3aWR0aFN1bSA9IDA7Ci0JCWludCBoZWlnaHRTdW0gPSAwOwotCQlpbnQgY29sdW1uID0gMDsKLQotCQlkZWx0YSA9IDA7Ci0JCUxpc3QgY2hpbGRyZW4gPSBlcC5nZXRDaGlsZHJlbigpOwotCQlJRmlndXJlIHBhcmVudEZpZ3VyZSAgPSBlcC5nZXRGaWd1cmUoKTsKLQkJLy9UT0RPOiBuZWVkIHJldmlzaXQgdHJhbnNhY3Rpb24gdXNhZ2UKLQkJdHJ5ewotCQlUcmFuc2FjdGlvbiB0eCA9ICgoSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbil0cmFuc2FjdGlvbkRvbWFpbikuc3RhcnRUcmFuc2FjdGlvbihmYWxzZSwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJZm9yIChpbnQgcCA9IDA7IHAgPCBjaGlsZHJlbi5zaXplKCk7KSB7Ci0JCQlpZiAoY29sdW1uID09IDApIHsKLQkJCQlyb3dzKys7Ci0JCQl9Ci0JCQlpZiAoY29sdW1uIDwgaG9yaXpDb3VudCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgY2hpbGQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRyZW4KLQkJCQkJCS5nZXQocCk7Ci0JCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBSb2xlTm9kZUVkaXRQYXJ0IHx8IGNoaWxkIGluc3RhbmNlb2YgVGFza05vZGVFZGl0UGFydCl7Ci0JCQkJCXJlc2V0U2l6ZSgoU2hhcGVOb2RlRWRpdFBhcnQpY2hpbGQsIHBhcmVudEZpZ3VyZSk7Ci0vLwkJCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQkJCWxpc3QuYWRkKGNoaWxkLmdldE1vZGVsKCkpOwotLy8JCQkJCVBlcnNpc3RWaWV3c0NvbW1hbmQgY21kID0gbmV3IFBlcnNpc3RWaWV3c0NvbW1hbmQodHJhbnNhY3Rpb25Eb21haW4sIGxpc3QpOwotLy8JCQkJCWNtZC5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCQkJCX0KLQkJCQlEaW1lbnNpb24gZCA9IGNoaWxkLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKTsKLQkJCQl3aWR0aFN1bSArPSBkLndpZHRoOwotCQkJCWlmIChkLmhlaWdodCA+IHJvd01heEhlaWdodCkgewotCQkJCQlyb3dNYXhIZWlnaHQgPSBkLmhlaWdodDsKLQkJCQl9Ci0JCQkJcCsrOwotCQkJCWNvbHVtbisrOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAod2lkdGhTdW0gPiByZXF1aXJlZFdpZHRoKSB7Ci0JCQkJCXJlcXVpcmVkV2lkdGggPSB3aWR0aFN1bTsKLQkJCQl9Ci0JCQkJaGVpZ2h0U3VtICs9IHJvd01heEhlaWdodDsKLQkJCQlyb3dNYXhIZWlnaHQgPSAwOwotCQkJCXdpZHRoU3VtID0gMDsKLQkJCQljb2x1bW4gPSAwOwotCQkJfQotCQl9Ci0JCXR4LmNvbW1pdCgpOwotCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotCQkJCi0JCX0KLQkJaWYgKHdpZHRoU3VtID4gcmVxdWlyZWRXaWR0aCkgewotCQkJcmVxdWlyZWRXaWR0aCA9IHdpZHRoU3VtOwotCQl9Ci0JCWhlaWdodFN1bSArPSByb3dNYXhIZWlnaHQ7Ci0JCXJlcXVpcmVkV2lkdGggKz0gSE9SSVpfUElYX1BBRERJTkcKLQkJCQkqIE1hdGgubWluKGhvcml6Q291bnQsIGNoaWxkcmVuLnNpemUoKSk7Ci0JCWludCByZXF1aXJlZEhlaWdodCA9IGhlaWdodFN1bSArIChWRVJUX1BJWF9QQURESU5HICogcm93cyk7Ci0JCUNvbW1hbmQgY21kID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQodHJhbnNhY3Rpb25Eb21haW4sICgoTm9kZSkgZXAuZ2V0TW9kZWwoKSksIGVwCi0JCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldExvY2F0aW9uKCksIHJlcXVpcmVkV2lkdGgsIHJlcXVpcmVkSGVpZ2h0KTsKLQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjbWQpOwotCQllcC5nZXRGaWd1cmUoKS5zZXRQcmVmZXJyZWRTaXplKAotCQkJCW5ldyBEaW1lbnNpb24ocmVxdWlyZWRXaWR0aCwgcmVxdWlyZWRIZWlnaHQpKTsKLQkJLy8oKE5vZGUpIGVwLmdldE1vZGVsKCkpLnNldEhlaWdodChyZXF1aXJlZEhlaWdodCk7Ci0JCWVwLmdldEZpZ3VyZSgpLnNldFNpemUobmV3IERpbWVuc2lvbihyZXF1aXJlZFdpZHRoLCByZXF1aXJlZEhlaWdodCkpOwotCQllcC5nZXRGaWd1cmUoKS5nZXRMYXlvdXRNYW5hZ2VyKCkubGF5b3V0KGVwLmdldEZpZ3VyZSgpKTsKLQkJLy8gYWZ0ZXIgbGF5b3V0LCBjaGVjayB0aGUgYm90dG9tLW1vc3QgY2hpbGQgZmlndXJlIGFnYWluc3QgdGhlIGJvdHRvbQotCQkvLyBvZiB0aGUgY29udGFpbmVyLCBhZGp1c3QgdGhlIGJvdHRvbSBvZiB0aGUgY29udGFpbmVyIGlzIG5lY2Vzc2FyeQotCQlpZiAoZXAgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0ICYmIGNoaWxkcmVuLnNpemUoKSA+IDApIHsKLQkJCWludCB0b3RhbENhbGN1bGF0ZWRIZWlnaHQgPSAwOwotCQkJZm9yIChpbnQgaT0wOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCQl7Ci0JCQkJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRyZW4uZ2V0KGkpOwotCQkJCU5vZGUgbm9kZU9iaiA9IChOb2RlKSBwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJRU9iamVjdCBvID0gbm9kZU9iai5nZXRFbGVtZW50KCk7CQkJCQotCQkJCXRvdGFsQ2FsY3VsYXRlZEhlaWdodCArPSBwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQl9Ci0JCQlpbnQgaGVpZ2h0ID0gdG90YWxDYWxjdWxhdGVkSGVpZ2h0ICsgMjAgKyA1ICogKGNoaWxkcmVuLnNpemUoKSAtIDEpOwotCQkJR3JhcGhpY2FsRWRpdFBhcnQgbGFzdCA9IChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRyZW4uZ2V0KGNoaWxkcmVuCi0JCQkJCS5zaXplKCkgLSAxKTsKLQkJCVBvaW50IGNoaWxkQm90dG9tID0gbGFzdC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRCb3R0b20oKTsKLQkJCVBvaW50IHBhcmVudEJvdHRvbSA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldEJvdHRvbSgpOwotCQkJaW50IGRlbHRhID0gcGFyZW50Qm90dG9tLnkgLSBjaGlsZEJvdHRvbS55IC0gKFZFUlRfUElYX1BBRERJTkcgLyAyKTsKLS8vCQkJZXAuZ2V0RmlndXJlKCkuc2V0UHJlZmVycmVkU2l6ZSgKLS8vCQkJCQluZXcgRGltZW5zaW9uKHJlcXVpcmVkV2lkdGgsIHJlcXVpcmVkSGVpZ2h0IC0gZGVsdGEpKTsKLS8vCQkJY21kID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQodHJhbnNhY3Rpb25Eb21haW4sICgoTm9kZSkgZXAuZ2V0TW9kZWwoKSksIGVwCi0vLwkJCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldExvY2F0aW9uKCksIC0xLCByZXF1aXJlZEhlaWdodC1kZWx0YSk7Ci0vLwkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY21kKTsKLS8vCQkJZXAuZ2V0RmlndXJlKCkuc2V0U2l6ZSgKLS8vCQkJCQluZXcgRGltZW5zaW9uKHJlcXVpcmVkV2lkdGgsIHJlcXVpcmVkSGVpZ2h0IC0gZGVsdGEpKTsKLQkJCWVwLmdldEZpZ3VyZSgpLnNldFByZWZlcnJlZFNpemUoCi0JCQkJCW5ldyBEaW1lbnNpb24ocmVxdWlyZWRXaWR0aCwgaGVpZ2h0KSk7Ci0JCQljbWQgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwgKChOb2RlKSBlcC5nZXRNb2RlbCgpKSwgZXAKLQkJCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldExvY2F0aW9uKCksIC0xLCBoZWlnaHQpOwotCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjbWQpOwkJCQotCQkJZXAuZ2V0RmlndXJlKCkuc2V0U2l6ZSgKLQkJCQkJbmV3IERpbWVuc2lvbihyZXF1aXJlZFdpZHRoLCBoZWlnaHQpKTsKLQkJfQotCX0KLQkKLQkKLQkKLQkKLQlwcml2YXRlIHZvaWQgcmVzZXRTaXplKFNoYXBlTm9kZUVkaXRQYXJ0IGVwLCBJRmlndXJlIHBhcmVudEZpZ3VyZSl7Ci0JCQotCQlOb2RlIG1vZGVsID0gKE5vZGUpZXAuZ2V0TW9kZWwoKTsKLQkJSUdyYXBoaWNhbEVkaXRQYXJ0IGNoaWxkID0gKElHcmFwaGljYWxFZGl0UGFydCllcC5nZXRDaGlsZHJlbigpLmdldCgwKTsKLQkJTm9kZUZpZ3VyZSBub2RlRmlndXJlID0gKE5vZGVGaWd1cmUpZXAuZ2V0RmlndXJlKCk7Ci0JCUxpc3Qgbm9kZUZpZ3VyZUNoaWxkcmVuID0gIG5vZGVGaWd1cmUuZ2V0Q2hpbGRyZW4oKTsKLQkJSUZpZ3VyZSBjaGlsZEZpZ3VyZSA9IChJRmlndXJlKW5vZGVGaWd1cmVDaGlsZHJlbi5nZXQoMCk7Ci0JCWlmKGNoaWxkRmlndXJlIGluc3RhbmNlb2YgUmVjdGFuZ2xlRmlndXJlKXsKLQkJCUlGaWd1cmUgbGFiZWxGaWd1cmUgPSAoSUZpZ3VyZSkoKFJlY3RhbmdsZUZpZ3VyZSljaGlsZEZpZ3VyZSkuZ2V0Q2hpbGRyZW4oKS5nZXQoMCk7Ci0JCQlpZihsYWJlbEZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCl7Ci0JCQkJRGltZW5zaW9uIGZpZ0RpbWVuc2lvbiA9IGxhYmVsRmlndXJlLmdldFNpemUoKTsKLQkJCQlEaW1lbnNpb24gZCA9IGxhYmVsRmlndXJlLmdldFByZWZlcnJlZFNpemUoKTsKLQkJCQlQb2ludCBwID0gbm9kZUZpZ3VyZS5nZXRMb2NhdGlvbigpLmdldENvcHkoKTsKLQkJCQlwLnggPSBwLnggKyBkZWx0YTsKLQkJCQlub2RlRmlndXJlLnNldExvY2F0aW9uKHApOwotCQkJCWlmIChkLndpZHRoID4gbm9kZUZpZ3VyZS5nZXRTaXplKCkud2lkdGgpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJOb2RlIGZpZ3VyZSB3aWR0aDogIitub2RlRmlndXJlLmdldFNpemUoKS53aWR0aCk7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiVGV4dCB3aWR0aDogIisgZC53aWR0aCk7Ci0JCQkJCWRlbHRhICs9IGQud2lkdGggLSBub2RlRmlndXJlLmdldFNpemUoKS53aWR0aDsKLQkJCQl9Ci0JCQkJaWYoZC53aWR0aCA+IGZpZ0RpbWVuc2lvbi53aWR0aCl7Ci0JCQkJCWludCB3aWR0aCA9IGQud2lkdGg7Ci0JCQkJCVZpZXcgdmlldyA9ICgoVmlldyljaGlsZC5nZXRNb2RlbCgpKTsKLQkJCQkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LAotCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpLCBuZXcgSW50ZWdlcigKLQkJCQkJCQkJCXdpZHRoKSk7Ci0JCQkJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobW9kZWwsCi0JCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCksIG5ldyBJbnRlZ2VyKAotCQkJCQkJCQkJd2lkdGgpKTsKLQkJCQkJbm9kZUZpZ3VyZS5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24od2lkdGgsIG5vZGVGaWd1cmUuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCkpOwotCQkJCQljaGlsZEZpZ3VyZS5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24od2lkdGgsIGNoaWxkRmlndXJlLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQpKTsKLQkJCQkJbGFiZWxGaWd1cmUuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKHdpZHRoLCBsYWJlbEZpZ3VyZS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0KSk7Ci0JCQkJCW5vZGVGaWd1cmUuc2V0U2l6ZShuZXcgRGltZW5zaW9uKHdpZHRoLCBub2RlRmlndXJlLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQpKTsKLQkJCQkJY2hpbGRGaWd1cmUuc2V0U2l6ZShuZXcgRGltZW5zaW9uKHdpZHRoLCBjaGlsZEZpZ3VyZS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0KSk7Ci0JCQkJCWxhYmVsRmlndXJlLnNldFNpemUobmV3IERpbWVuc2lvbih3aWR0aCwgbGFiZWxGaWd1cmUuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCkpOwotCi0vLwkJCQkJbm9kZUZpZ3VyZS5zZXRDb25zdHJhaW50KGNoaWxkRmlndXJlLCBuZXcgUmVjdGFuZ2xlKG5vZGVGaWd1cmUuZ2V0TG9jYXRpb24oKS54LAotLy8JCQkJCQkJbm9kZUZpZ3VyZS5nZXRMb2NhdGlvbigpLnksIHdpZHRoLCBjaGlsZEZpZ3VyZS5nZXRCb3VuZHMoKS5oZWlnaHQpKTsKLQkJCQkJLy8gQ2hhbmdlIHRoZSBsb2NhdGlvbiAKLS8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoaWxkIGJvdW5kcyBiZWZvcmU6ICIgKyBub2RlRmlndXJlLmdldEJvdW5kcygpICsiZGVsdGE6ICIgKyBkZWx0YSk7CQkJCQkKLQkJCQl9CQkJCQotCQkJfQotCQl9Ci0JfQotCQotCi0JcHJvdGVjdGVkIHZvaWQgZW51bWVyYXRlQ29ubmVjdGVkUGFydHMoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwYXJ0LAotCQkJTGlzdDxFZGl0UGFydD4gY29ubmVjdGVkKSB7Ci0JCS8vIG9ubHkgYWRkIHBhcnRzIGRpcmVjdGx5IG9uIHRoZSBkaWFncmFtIHN1cmZhY2UKLQkJaWYgKCFjb25uZWN0ZWQuY29udGFpbnMocGFydCkpIHsKLQkJCWlmICghKHBhcnQuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpKSB7Ci0JCQkJaWYgKCFjb25uZWN0ZWQuY29udGFpbnMocGFydC5nZXRQYXJlbnQoKSkpIHsKLQkJCQkJY29ubmVjdGVkLmFkZChwYXJ0LmdldFBhcmVudCgpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWNvbm5lY3RlZC5hZGQocGFydCk7Ci0JCQl9Ci0JCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGxpbmtlZFBhcnQgPSBudWxsOwotCQkJTGlzdCBjaGlsZHJlbiA9IHBhcnQuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgY2hpbGRyZW4uc2l6ZSgpOyB4KyspIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRyZW4KLQkJCQkJCS5nZXQoeCk7Ci0JCQkJZW51bWVyYXRlQ29ubmVjdGVkUGFydHMocCwgY29ubmVjdGVkKTsKLQkJCX0KLQkJCS8vIGlzIHRoaXMgZWxlbWVudCBsaW5rZWQgdG8gYW5vdGhlciBpdGVtPwotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBwYXJ0LmdldFRhcmdldENvbm5lY3Rpb25zKCkuc2l6ZSgpOyB4KyspIHsKLQkJCQlsaW5rZWRQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpICgoQ29ubmVjdGlvbk5vZGVFZGl0UGFydCkgcGFydAotCQkJCQkJLmdldFRhcmdldENvbm5lY3Rpb25zKCkuZ2V0KHgpKS5nZXRTb3VyY2UoKTsKLQkJCQllbnVtZXJhdGVDb25uZWN0ZWRQYXJ0cyhsaW5rZWRQYXJ0LCBjb25uZWN0ZWQpOwotCQkJfQotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBwYXJ0LmdldFNvdXJjZUNvbm5lY3Rpb25zKCkuc2l6ZSgpOyB4KyspIHsKLQkJCQlsaW5rZWRQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpICgoQ29ubmVjdGlvbk5vZGVFZGl0UGFydCkgcGFydAotCQkJCQkJLmdldFNvdXJjZUNvbm5lY3Rpb25zKCkuZ2V0KHgpKS5nZXRUYXJnZXQoKTsKLQkJCQllbnVtZXJhdGVDb25uZWN0ZWRQYXJ0cyhsaW5rZWRQYXJ0LCBjb25uZWN0ZWQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZmluZHMgc2luZ2xlIGVsZW1lbnRzIGFuZCBncm91cHMgb2YgZWxlbWVudHMsIGFuZCBwb3NpdGlvbnMKLQkgKiB0aGVtIHN0YXJ0aW5nIGZyb20gdGhlIHRvcCBvZiB0aGUgZGlhZ3JhbSBhbmQgY29udGludW91c2x5IGRvd24gdGhlIHBhZ2UuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhY2tEaWFncmFtKCkgewotCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCBkaWFncmFtID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSBnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCS5nZXRDb250ZW50cygpOwotCQkvLyBzdGFydCBhdCB0aGUgdG9wIG9mIHRoZSBkaWFncmFtCi0JCS8vIERpbWVuc2lvbiBkaWFncmFtU2l6ZSA9IGRpYWdyYW0uZ2V0RmlndXJlKCkuZ2V0U2l6ZSgpOwotCQkvLyBubyBuZXcgc2hhcGVzIGNhbiBiZSBtb3ZlZCBhYm92ZSB0aGlzIHktYXhpcyB2YWx1ZQotCQlpbnQgcmVzZXJ2ZWQgPSAwOwotCQkvLyB0aGVzZSBhcmUgZWxlbWVudHMgd2l0aG91dCBjb25uZWN0aW9ucwotCQlMaXN0PEVkaXRQYXJ0PiBzdHJhZ2dsZXJzID0gbmV3IEFycmF5TGlzdDxFZGl0UGFydD4oKTsKLQkJLy8gdGhlc2UgYXJlIGdyb3VwcyBvZiBlbGVtZW50cyBjb25uZWN0ZWQgd2l0aCBsaW5rcwotCQlMaXN0PExpc3Q+IGdyb3VwcyA9IG5ldyBBcnJheUxpc3Q8TGlzdD4oKTsKLQkJLy8gdGhlc2UgYXJlIHRvcCBsZXZlbCBwYXJ0cyBvbiB0aGUgZGlhZ3JhbSB0aGF0IGhhdmUgYmVlbiBhZGRlZAotCQlMaXN0IGRpYWdyYW1QYXJ0cyA9IGRpYWdyYW0uZ2V0UmVjZW50bHlBZGRlZFBhcnRzKCk7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgZGlhZ3JhbVBhcnRzLnNpemUoKTsgeCsrKSB7Ci0JCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZGlhZ3JhbVBhcnRzCi0JCQkJCS5nZXQoeCk7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBnID0gMDsgZyA8IGdyb3Vwcy5zaXplKCkgJiYgZm91bmQgPT0gZmFsc2U7IGcrKykgewotCQkJCUxpc3QgZ3JvdXAgPSAoTGlzdCkgZ3JvdXBzLmdldChnKTsKLQkJCQlpZiAoZ3JvdXAuY29udGFpbnMocCkpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKSB7Ci0JCQkJTGlzdDxFZGl0UGFydD4gY29ubmVjdGVkID0gbmV3IEFycmF5TGlzdDxFZGl0UGFydD4oKTsKLQkJCQllbnVtZXJhdGVDb25uZWN0ZWRQYXJ0cyhwLCBjb25uZWN0ZWQpOwotCQkJCWlmIChjb25uZWN0ZWQuc2l6ZSgpID09IDEpIHsKLQkJCQkJc3RyYWdnbGVycy5hZGQocCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZ3JvdXBzLmFkZChjb25uZWN0ZWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBwcm9jZXNzIGVhY2ggZ3JvdXAgY2xvc2VzdCB0byB0aGUgdG9wIChtaW4geSB2YWx1ZSkKLQkJd2hpbGUgKGdyb3Vwcy5zaXplKCkgPiAwKSB7Ci0JCQlMaXN0IHRvcCA9IChMaXN0KSBncm91cHMuZ2V0KDApOwotCQkJaW50IHRvcFkgPSBnZXRWZXJ0aWNhbE1pblBhcnQodG9wKS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55OwotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBncm91cHMuc2l6ZSgpOyB4KyspIHsKLQkJCQlMaXN0IGcgPSAoTGlzdCkgZ3JvdXBzLmdldCh4KTsKLQkJCQlpbnQgeSA9IGdldFZlcnRpY2FsTWluUGFydChnKS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55OwotCQkJCWlmICh5IDwgdG9wWSkgewotCQkJCQl0b3AgPSBnOwotCQkJCQl0b3BZID0geTsKLQkJCQl9Ci0JCQl9Ci0JCQlpbnQgbGltaXQgPSByZXNlcnZlZCArIDE7Ci0JCQlpbnQgdmVydGljYWxEZWx0YSA9IGxpbWl0IC0gdG9wWTsKLQkJCWludCBsZWZ0WCA9IGdldEhvcml6b250YWxNaW5QYXJ0KHRvcCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueDsKLQkJCWludCBob3Jpem9udGFsRGVsdGEgPSBIT1JJWl9QSVhfUEFERElORyAtIGxlZnRYOwotCQkJZm9yIChpbnQgeCA9IDA7IHggPCB0b3Auc2l6ZSgpOyB4KyspIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgdG9wCi0JCQkJCQkuZ2V0KHgpOwotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCUNoYW5nZUJvdW5kc0NvbW1hbmQgY2JjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQodHJhbnNhY3Rpb25Eb21haW4sKE5vZGUpIHAKLQkJCQkJCS5nZXRNb2RlbCgpLCBuZXcgUG9pbnQoYm91bmRzLnggKyBob3Jpem9udGFsRGVsdGEsCi0JCQkJCQlib3VuZHMueSArIHZlcnRpY2FsRGVsdGEpLCBib3VuZHMud2lkdGgsIC0xKTsKLQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNiYyk7Ci0JCQkJcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbigKLQkJCQkJCW5ldyBQb2ludChib3VuZHMueCArIGhvcml6b250YWxEZWx0YSwgYm91bmRzLnkKLQkJCQkJCQkJKyB2ZXJ0aWNhbERlbHRhKSk7Ci0JCQkJcC5yZWZyZXNoKCk7Ci0JCQl9Ci0JCQlpbnQgYm90dG9tWSA9IGdldFZlcnRpY2FsTWF4UGFydCh0b3ApLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCS5ib3R0b20oKTsKLQkJCXJlc2VydmVkID0gYm90dG9tWSArIChWRVJUX1BJWF9QQURESU5HICogMik7Ci0JCQlncm91cHMucmVtb3ZlKHRvcCk7Ci0JCX0KLQkJaW50IG5leHQgPSBIT1JJWl9QSVhfUEFERElORzsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBzdHJhZ2dsZXJzLnNpemUoKTsgeCsrKSB7Ci0JCQlpbnQgbGltaXQgPSByZXNlcnZlZCArIDE7Ci0JCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgc3RyYWdnbGVycwotCQkJCQkuZ2V0KHgpOwotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQlDaGFuZ2VCb3VuZHNDb21tYW5kIGNiYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKHRyYW5zYWN0aW9uRG9tYWluLCAoTm9kZSkgcAotCQkJCQkuZ2V0TW9kZWwoKSwgbmV3IFBvaW50KG5leHQsIGxpbWl0KSwgYm91bmRzLndpZHRoLCAtMSk7Ci0JCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNiYyk7Ci0JCQlwLmdldEZpZ3VyZSgpLnNldExvY2F0aW9uKG5ldyBQb2ludChuZXh0LCBsaW1pdCkpOwotCQkJcC5yZWZyZXNoKCk7Ci0JCQluZXh0ICs9IGJvdW5kcy53aWR0aCArIEhPUklaX1BJWF9QQURESU5HOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGdldFZlcnRpY2FsTWluUGFydChMaXN0IHBhcnRzKSB7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcmMgPSBwYXJ0cy5zaXplKCkgPiAwID8gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHBhcnRzCi0JCQkJLmdldCgwKQotCQkJCTogbnVsbDsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBwYXJ0cy5zaXplKCk7IHgrKykgewotCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHBhcnRzCi0JCQkJCS5nZXQoeCk7Ci0JCQlpZiAocC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55IDwgcmMuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueSkgewotCQkJCXJjID0gcDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcHJpdmF0ZSBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGdldEhvcml6b250YWxNaW5QYXJ0KExpc3QgcGFydHMpIHsKLQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCByYyA9IHBhcnRzLnNpemUoKSA+IDAgPyAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgcGFydHMKLQkJCQkuZ2V0KDApCi0JCQkJOiBudWxsOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IHBhcnRzLnNpemUoKTsgeCsrKSB7Ci0JCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgcGFydHMKLQkJCQkJLmdldCh4KTsKLQkJCWlmIChwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLnggPCByYy5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54KSB7Ci0JCQkJcmMgPSBwOwotCQkJfQotCQl9Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlwcml2YXRlIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZ2V0VmVydGljYWxNYXhQYXJ0KExpc3QgcGFydHMpIHsKLQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCByYyA9IHBhcnRzLnNpemUoKSA+IDAgPyAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgcGFydHMKLQkJCQkuZ2V0KDApCi0JCQkJOiBudWxsOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IHBhcnRzLnNpemUoKTsgeCsrKSB7Ci0JCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgcGFydHMKLQkJCQkJLmdldCh4KTsKLQkJCWlmIChwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmJvdHRvbSgpID4gcmMuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJLmJvdHRvbSgpKSB7Ci0JCQkJcmMgPSBwOwotCQkJfQotCQl9Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2ZXJ0aWNhbEFsaWduVG9GaXJzdFNlbGVjdGVkKExpc3QgZWRpdFBhcnRzKSB7Ci0JCS8vIGdldCB0aGUgc2VsZWN0ZWQgaXRlbXMKLQkJLy8JCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBhbGlnblRvUGFydCA9IG51bGw7Ci0JCS8vIGZpbmQgdGhlIGZpcnN0IGRpYWdyYW0gcGFydCB3ZSBjYW4gYWxpZ24gdG8KLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgU2hhcGVOb2RlRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQlpZiAoYWxpZ25Ub1BhcnQgPT0gbnVsbCkgewotCQkJCQkvLyByZW1lbWJlciBpdCBhbmQgc3RvcAotCQkJCQlhbGlnblRvUGFydCA9IGVwOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gbG9vcCB0aHJvdWdoIHRoZSBlbGVtZW50cyBhbmQgc2V0IHRoZWlyIG5ldyBwb3NpdGlvbgotCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJaWYgKGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBTaGFwZU5vZGVFZGl0UGFydCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkuZ2V0KGEpOwotCQkJCS8vIHdlIGNhbiBza2lwIHRoZSBmaXJzdCBvbmUgc2luY2UgdGhpcyBpcyBhbiBhbGlnbi10bwotCQkJCWlmIChlcCAhPSBhbGlnblRvUGFydCkgewotCQkJCQkvLyBjYWxjdWxhdGUgdGhlIG9mZnNldCBmb3IgY2VudGVybGluZSBhbGlnbm1lbnQKLQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQlSZWN0YW5nbGUgYWxpZ25Ub1BhcnRCb3VuZHMgPSBhbGlnblRvUGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsJCQkJCQotCQkJCQlEaW1lbnNpb24gcHMgPSBhbGlnblRvUGFydC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCk7CQkJCQkKLQkJCQkJaW50IG9mZnNldCA9ICBib3VuZHMuZ2V0Q2VudGVyKCkueCAtIGFsaWduVG9QYXJ0Qm91bmRzLmdldENlbnRlcigpLng7Ci0JCQkJCS8vIGlzIHRoaXMgaW5zaWRlIGEgY29udGFpbmVyPwotCQkJCQlpZiAoIShlcC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkpIHsKLQkJCQkJCS8vIGFkanVzdCB0aGUgb2Zmc2V0IHNpbmNlIHdlIGFyZSBtb3ZpbmcgdGhlCi0JCQkJCQkvLyBjb250YWluZXIKLQkJCQkJCWVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVwLmdldFBhcmVudCgpOwotCQkJCQkJUmVjdGFuZ2xlIHBhcmVudEJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQkJb2Zmc2V0ICs9IGJvdW5kcy54IC0gcGFyZW50Qm91bmRzLng7Ci0JCQkJCQlib3VuZHMgPSBwYXJlbnRCb3VuZHM7Ci0JCQkJCX0KLQkJCQkJLy8gc2VuZCB0aGUgY29tbWFuZCB0byBtb3ZlIHRoZSBlbGVtZW50Ci0JCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgKLQkJCQkJCQl0cmFuc2FjdGlvbkRvbWFpbiwgKE5vZGUpIGVwLmdldE1vZGVsKCksIG5ldyBQb2ludCgKLQkJCQkJCQkJCWFsaWduVG9QYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLngKLQkJCQkJCQkJCQkJLSBvZmZzZXQsIGJvdW5kcy55KSwgYm91bmRzLndpZHRoLAotCQkJCQkJCS0xKTsKLQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJZXAuZ2V0RmlndXJlKCkuc2V0TG9jYXRpb24oCi0JCQkJCQkJbmV3IFBvaW50KGFsaWduVG9QYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLngKLQkJCQkJCQkJCS0gb2Zmc2V0LCBib3VuZHMueSkpOwotCQkJCQlQb2ludCBzcCA9IGFsaWduVG9QYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotCQkJCQlib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOwotCQkJCQkvLyBjaGVjayBpZiB0aGUgcGFydCBpcyBjb25uZWN0ZWQgdmlhIHNvdXJjZSBjb25uZWN0aW9ucwotCQkJCQlMaXN0IGxpc3QgPSAoKFNoYXBlTm9kZUVkaXRQYXJ0KSBhbGlnblRvUGFydCkKLQkJCQkJCQkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCUNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQgbHAgPSAoQ29ubmVjdGlvbk5vZGVFZGl0UGFydCkgaXRvcgotCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJaWYgKGxwLmdldFRhcmdldCgpLmVxdWFscyhlcCkpIHsKLQkJCQkJCQljb25uZWN0ZWQgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIGlmIG5vdCBmb3VuZCBhYm92ZSwgY2hlY2sgaWYgaXQgaXMgY29ubmVjdGVkIHZpYSB0YXJnZXQgY29ubmVjdGlvbnMKLQkJCQkJaWYgKCFjb25uZWN0ZWQpIHsKLQkJCQkJCWxpc3QgPSAoKFNoYXBlTm9kZUVkaXRQYXJ0KSBhbGlnblRvUGFydCkKLQkJCQkJCQkJLmdldFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCUNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQgbHAgPSAoQ29ubmVjdGlvbk5vZGVFZGl0UGFydCkgaXRvcgotCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQlpZiAobHAuZ2V0U291cmNlKCkuZXF1YWxzKGVwKSkgewotCQkJCQkJCQljb25uZWN0ZWQgPSB0cnVlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJUG9pbnQgcCA9IG5ldyBQb2ludCgpOwotCQkJCQlwLnggPSAoKEludGVnZXIpIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoCi0JCQkJCQkJKFZpZXcpIGVwLmdldE1vZGVsKCksIE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRMb2NhdGlvbl9YKCkpKS5pbnRWYWx1ZSgpOwotCQkJCQlwLnkgPSAoKEludGVnZXIpIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoCi0JCQkJCQkJKFZpZXcpIGVwLmdldE1vZGVsKCksIE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOwotCQkJCQlQb2ludCB0cCA9IHAuZ2V0Q29weSgpOwotCQkJCQlQb2ludCBjZW50ZXJQb2ludCA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotCQkJCQlpbnQgZGVsdGEgPSBzcC54IC0gY2VudGVyUG9pbnQueDsKLQkJCQkJdHAueCA9IHRwLnggKyBkZWx0YTsKLQkJCQkJYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKHRyYW5zYWN0aW9uRG9tYWluLCAoTm9kZSkgZXAKLQkJCQkJCQkuZ2V0TW9kZWwoKSwgdHAsIGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoLAotCQkJCQkJCS0xKTsKLQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJZXAuZ2V0RmlndXJlKCkuc2V0TG9jYXRpb24obmV3IFBvaW50KHRwLngsIHRwLnkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0KLQkvKioKLQkgKiBSZXR1cm4gaGVpZ2h0IG9mIHRleHQgb2YgdGggZW5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpbWVuc2lvbiBnZXRUZXh0RGltZW5zaW9uKFN0cmluZyB0ZXh0KSB7Ci0JCWlmICh0ZXh0ICE9IG51bGwpewotCQkJRm9udCBmID0gRGlhZ3JhbUNvbnN0YW50cy5ERUZBVUxUX0ZPTlQ7Ci0JCQlEaW1lbnNpb24gZCA9IEZpZ3VyZVV0aWxpdGllcy5nZXRUZXh0RXh0ZW50cyh0ZXh0LCBmKTsKLQotCQkJaWYgKGQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFueU9ibGlxdWVMaW5rcyhBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCBkZXAsCi0JCQlMaXN0IHJlY2VudGx5QWRkZWRDaGlsZHJlbikgewotCQlMaXN0IGNoaWxkcmVuID0gZGVwLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKHBhcnQgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KXsKLQkJCQlMaXN0IGdyYW5kQ2hpbGRyZW4gPSAoKFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpcGFydCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMiA9IGdyYW5kQ2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlcmF0b3IyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlTaGFwZU5vZGVFZGl0UGFydCBjaGlsZCA9IChTaGFwZU5vZGVFZGl0UGFydCkgaXRlcmF0b3IyCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgVGFza05vZGVFZGl0UGFydCkgewotCQkJCQkJUG9pbnQgcCA9IGNoaWxkLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotCQkJCQkJTGlzdCBjb25uZWN0ZWQgPSBjaGlsZC5nZXRUYXJnZXRDb25uZWN0aW9ucygpOwotCQkJCQkJaWYgKCFjb25uZWN0ZWQuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBsaW5rZWRQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpICgoQ29ubmVjdGlvbk5vZGVFZGl0UGFydCkgY29ubmVjdGVkCi0JCQkJCQkJCQkuZ2V0KDApKS5nZXRTb3VyY2UoKTsKLQkJCQkJCQlQb2ludCBwdCA9IGxpbmtlZFBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJCQkJCS5nZXRDZW50ZXIoKTsKLQkJCQkJCQlpZiAocC54ICE9IHB0LngpIHsKLQkJCQkJCQkJaWYgKCFyZWNlbnRseUFkZGVkQ2hpbGRyZW4uY29udGFpbnMocGFydCkpIHsKLQkJCQkJCQkJCXJlY2VudGx5QWRkZWRDaGlsZHJlbi5hZGQocGFydCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljb25uZWN0ZWQgPSBjaGlsZC5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJCQkJaWYgKCFjb25uZWN0ZWQuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBsaW5rZWRQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpICgoQ29ubmVjdGlvbk5vZGVFZGl0UGFydCljb25uZWN0ZWQKLQkJCQkJCQkJCS5nZXQoMCkpLmdldFNvdXJjZSgpOwotCQkJCQkJCVBvaW50IHBzID0gbGlua2VkUGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJCQkJLmdldENlbnRlcigpOwotCQkJCQkJCWlmIChwLnggIT0gcHMueCkgewotCQkJCQkJCQlpZiAoIXJlY2VudGx5QWRkZWRDaGlsZHJlbi5jb250YWlucyhwYXJ0KSkgewotCQkJCQkJCQkJcmVjZW50bHlBZGRlZENoaWxkcmVuLmFkZChwYXJ0KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eURldGFpbERpYWdyYW1WaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU1YTk3MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eURldGFpbERpYWdyYW1WaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5EaWFncmFtVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5NZWFzdXJlbWVudFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld0ZhY3RvcnkgZXh0ZW5kcyBEaWFncmFtVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGFnZVN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3VpZGVTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IHZpZXcsIElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJU3RyaW5nIGRpYWdyYW1LaW5kKSB7Ci0JCXN1cGVyLmRlY29yYXRlVmlldyh2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIGRpYWdyYW1LaW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lYXN1cmVtZW50VW5pdCBnZXRNZWFzdXJlbWVudFVuaXQoKSB7Ci0JCXJldHVybiBNZWFzdXJlbWVudFVuaXQuUElYRUxfTElURVJBTDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL0xpbmtOYW1lVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL0xpbmtOYW1lVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5NjA5ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9MaW5rTmFtZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdExhYmVsVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudXRpbC5NZWFzdXJlbWVudFVuaXRIZWxwZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkubWFwbW9kZS5JTWFwTW9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxvY2F0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtOYW1lVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdExhYmVsVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWaWV3IGNyZWF0ZVZpZXcoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFZpZXcgY29udGFpbmVyVmlldywKLQkJCVN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsCi0JCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7Ci0JCU5vZGUgdmlldyA9IChOb2RlKSBzdXBlci5jcmVhdGVWaWV3KHNlbWFudGljQWRhcHRlciwgY29udGFpbmVyVmlldywKLQkJCQlzZW1hbnRpY0hpbnQsIGluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7Ci0JCUxvY2F0aW9uIGxvY2F0aW9uID0gKExvY2F0aW9uKSB2aWV3LmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJSU1hcE1vZGUgbWFwTW9kZSA9IE1lYXN1cmVtZW50VW5pdEhlbHBlci5nZXRNYXBNb2RlKGNvbnRhaW5lclZpZXcKLQkJCQkuZ2V0RGlhZ3JhbSgpLmdldE1lYXN1cmVtZW50VW5pdCgpKTsKLQkJbG9jYXRpb24uc2V0WChtYXBNb2RlLkRQdG9MUCgwKSk7Ci0JCWxvY2F0aW9uLnNldFkobWFwTW9kZS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHZpZXc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvTGlua1ZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9MaW5rVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQwZDcyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9MaW5rVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS5BYnN0cmFjdEVNRk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuTGlua05hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS51dGlsLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS51dGlsLlN0cmluZ1N0YXRpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUudXRpbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuaW50ZXJuYWwuRGlhZ3JhbVVJRGVidWdPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuaW50ZXJuYWwuRGlhZ3JhbVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuaW50ZXJuYWwuRGlhZ3JhbVVJU3RhdHVzQ29kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5Db25uZWN0aW9uVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uQmVuZHBvaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtWaWV3RmFjdG9yeSBleHRlbmRzIENvbm5lY3Rpb25WaWV3RmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0Jc3RhdGljIHsKLQkJb3B0aW9ucy5wdXQoVHJhbnNhY3Rpb24uT1BUSU9OX1VOUFJPVEVDVEVELCBCb29sZWFuLlRSVUUpOwotCQlvcHRpb25zLnB1dChUcmFuc2FjdGlvbi5PUFRJT05fTk9fTk9USUZJQ0FUSU9OUywgQm9vbGVhbi5UUlVFKTsKLQkJb3B0aW9ucy5wdXQoVHJhbnNhY3Rpb24uT1BUSU9OX05PX1RSSUdHRVJTLCBCb29sZWFuLlRSVUUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvdXRpbmdTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoTGlua0VkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQKLQkJCQkuZXF1YWxzKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkuY3JlYXRlTm9kZShzZW1hbnRpY0FkYXB0ZXIsIHZpZXcsCi0JCQkJRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShMaW5rTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudmlldy5mYWN0b3JpZXMuVmlld0ZhY3RvcnkjY3JlYXRlVmlldyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSwgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldywgamF2YS5sYW5nLlN0cmluZywgaW50LCBib29sZWFuLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqIAotCSAqIE92ZXJyaWRlIGNyZWF0ZVZpZXcgc2luY2UgdGhlcmUgaXMgYSBidWcgaW4gCi0JICogb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5Db25uZWN0aW9uVmlld0ZhY3RvcnkuamF2YQotCSAqLwotCXB1YmxpYyBWaWV3IGNyZWF0ZVZpZXcoZmluYWwgSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsCi0JCQlmaW5hbCBWaWV3IGNvbnRhaW5lclZpZXcsIGZpbmFsIFN0cmluZyBzZW1hbnRpY0hpbnQsCi0JCQlmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIGJvb2xlYW4gcGVyc2lzdGVkLAotCQkJZmluYWwgUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgewotCi0JCXNldFByZWZlcmVuY2VzSGludChwcmVmZXJlbmNlc0hpbnQpOwotCi0JCWZpbmFsIEVkZ2UgZWRnZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRWRnZSgpOwotCQlMaXN0IHN0eWxlcyA9IGNyZWF0ZVN0eWxlcyhlZGdlKTsKLQkJaWYgKHN0eWxlcy5zaXplKCkgPiAwKSB7Ci0JCQllZGdlLmdldFN0eWxlcygpLmFkZEFsbChzdHlsZXMpOwotCQl9Ci0KLQkJQmVuZHBvaW50cyBiZW5kUG9pbnRzID0gY3JlYXRlQmVuZHBvaW50cygpOwotCQlpZiAoYmVuZFBvaW50cyAhPSBudWxsKSB7Ci0JCQllZGdlLnNldEJlbmRwb2ludHMoYmVuZFBvaW50cyk7Ci0JCX0KLQotCQlFT2JqZWN0IHNlbWFudGljRWwgPSBzZW1hbnRpY0FkYXB0ZXIgPT0gbnVsbCA/IG51bGwKLQkJCQk6IChFT2JqZWN0KSBzZW1hbnRpY0FkYXB0ZXIuZ2V0QWRhcHRlcihFT2JqZWN0LmNsYXNzKTsKLQkJaWYgKHNlbWFudGljRWwgPT0gbnVsbCkKLQkJCS8vIGVuZm9yY2UgYSBzZXQgdG8gTlVMTAotCQkJZWRnZS5zZXRFbGVtZW50KG51bGwpOwotCQllbHNlIGlmIChyZXF1aXJlc0VsZW1lbnQoc2VtYW50aWNBZGFwdGVyLCBjb250YWluZXJWaWV3KSkgewotCQkJZWRnZS5zZXRFbGVtZW50KHNlbWFudGljRWwpOwotCQl9Ci0KLQkJZWRnZS5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0KLQkJLy8gZGVjb3JhdGUgdmlldyBhc3N1bWVzIHRoZSB2aWV3IGhhZCBiZWVuIGluc2VydGVkIGFscmVhZHksIHNvIAotCQkvLyB3ZSBoYWQgdG8gY2FsbCBpbnNlcnQgY2hpbGQgYmVmb3JlIGNhbGxpbmcgZGVjb3JhdGUgdmlldwotCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgZWRnZSwgaW5kZXgsIHBlcnNpc3RlZCk7Ci0KLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluID0gZ2V0RWRpdGluZ0RvbWFpbihzZW1hbnRpY0VsLAotCQkJCWNvbnRhaW5lclZpZXcpOwotCi0JCWlmIChkb21haW4gIT0gbnVsbCkgewotCQkJaWYgKGlzVW5Qcm90ZWN0ZWRTaWxlbnRUcmFuc2FjdGlvbkluUHJvZ3Jlc3MoZG9tYWluKSkgewotCQkJCS8vIGRlY29yYXRlIHZpZXcgaGFkIHRvIHJ1biBhcyBhIHNpbGVudCBvcGVyYXRpb24gb3RoZXIgd2lzZQotCQkJCS8vIGl0IHdpbGwgZ2VuZXJhdGUgdG9vIG1hbnkgZXZlbnRzCi0JCQkJZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIGVkZ2UsIHNlbWFudGljQWRhcHRlciwKLQkJCQkJCXNlbWFudGljSGludCwgaW5kZXgsIHRydWUpOwotCi0JCQl9IGVsc2UgewotCQkJCUFic3RyYWN0RU1GT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBBYnN0cmFjdEVNRk9wZXJhdGlvbigKLQkJCQkJCWRvbWFpbiwgU3RyaW5nU3RhdGljcy5CTEFOSywgb3B0aW9ucykgewotCi0JCQkJCXByb3RlY3RlZCBJU3RhdHVzIGRvRXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQkJCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQkJCWRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCBlZGdlLCBzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJCQkJCXNlbWFudGljSGludCwgaW5kZXgsIHRydWUpOwotCi0JCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJfQotCQkJCX07Ci0JCQkJdHJ5IHsKLQkJCQkJb3BlcmF0aW9uLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UuY2F0Y2hpbmcoRGlhZ3JhbVVJUGx1Z2luLmdldEluc3RhbmNlKCksCi0JCQkJCQkJRGlhZ3JhbVVJRGVidWdPcHRpb25zLkVYQ0VQVElPTlNfQ0FUQ0hJTkcsCi0JCQkJCQkJZ2V0Q2xhc3MoKSwgImNyZWF0ZVZpZXciLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlMb2cud2FybmluZyhEaWFncmFtVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKSwKLQkJCQkJCQlEaWFncmFtVUlTdGF0dXNDb2Rlcy5JR05PUkVEX0VYQ0VQVElPTl9XQVJOSU5HLAotCQkJCQkJCSJjcmVhdGVWaWV3IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZWRnZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1JvbGVOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Sb2xlTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDY1MzlkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1JvbGVOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkJhc2ljTm9kZVZpZXdGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVOb2RlTmFtZVZpZXdGYWN0b3J5IGV4dGVuZHMgQmFzaWNOb2RlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvUm9sZU5vZGVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvUm9sZU5vZGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWI3MjgxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1JvbGVOb2RlVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVOb2RlTmFtZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZU5vZGVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShSb2xlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQKLQkJCQkuZXF1YWxzKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkKLQkJCQkuY3JlYXRlTm9kZSgKLQkJCQkJCXNlbWFudGljQWRhcHRlciwKLQkJCQkJCXZpZXcsCi0JCQkJCQlEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJCQkuZ2V0VHlwZShSb2xlTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc4ZGE0My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5MaXN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRyYXdlclN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVGl0bGVTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudFZpZXdGYWN0b3J5IGV4dGVuZHMKLQkJTGlzdENvbXBhcnRtZW50Vmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU29ydGluZ1N0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsdGVyaW5nU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCXNldHVwQ29tcGFydG1lbnRUaXRsZSh2aWV3KTsKLQkJc2V0dXBDb21wYXJ0bWVudENvbGxhcHNlZCh2aWV3KTsKLQkJaWYgKCFBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRAotCQkJCS5lcXVhbHMoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBDb21wYXJ0bWVudFRpdGxlKFZpZXcgdmlldykgewotCQlUaXRsZVN0eWxlIHRpdGxlU3R5bGUgPSAoVGl0bGVTdHlsZSkgdmlldwotCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFRpdGxlU3R5bGUoKSk7Ci0JCWlmICh0aXRsZVN0eWxlICE9IG51bGwpIHsKLQkJCXRpdGxlU3R5bGUuc2V0U2hvd1RpdGxlKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwQ29tcGFydG1lbnRDb2xsYXBzZWQoVmlldyB2aWV3KSB7Ci0JCURyYXdlclN0eWxlIGRyYXdlclN0eWxlID0gKERyYXdlclN0eWxlKSB2aWV3Ci0JCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RHJhd2VyU3R5bGUoKSk7Ci0JCWlmIChkcmF3ZXJTdHlsZSAhPSBudWxsKSB7Ci0JCQlkcmF3ZXJTdHlsZS5zZXRDb2xsYXBzZWQoZmFsc2UpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Sb2xlVGFza0NvbXBvc2l0ZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Sb2xlVGFza0NvbXBvc2l0ZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWU1MGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvUm9sZVRhc2tDb21wb3NpdGVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRAotCQkJCS5lcXVhbHMoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJLy8gCQltb2RpZmllZCBub3QgdG8gY3JlYXRlIGNvbXBhcnRtZW50Ci0JCS8vCQlnZXRWaWV3U2VydmljZSgpCi0JCS8vCQkJCS5jcmVhdGVOb2RlKAotCQkvLwkJCQkJCXNlbWFudGljQWRhcHRlciwKLQkJLy8JCQkJCQl2aWV3LAotCQkvLwkJCQkJCURpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCS8vCQkJCQkJCQkuZ2V0VHlwZShSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkvLwkJCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvVGFza05vZGVOYW1lVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1Rhc2tOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NGQ2MTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvVGFza05vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQmFzaWNOb2RlVmlld0ZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza05vZGVOYW1lVmlld0ZhY3RvcnkgZXh0ZW5kcyBCYXNpY05vZGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9UYXNrTm9kZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9UYXNrTm9kZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyY2ZjODIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvVGFza05vZGVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlRhc2tOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuVGFza05vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTm9kZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKFRhc2tOb2RlRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRAotCQkJCS5lcXVhbHMoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKQotCQkJCS5jcmVhdGVOb2RlKAotCQkJCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJdmlldywKLQkJCQkJCURpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkJCS5nZXRUeXBlKFRhc2tOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RjN2MxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENvbXBvc2l0ZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lECi0JCQkJLmVxdWFscyhEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQkvLwkJbW9kaWZpZWQgLSBub3QgdG8gY3JlYXRlIGNvbXBhcnRtZW50Ci0JCS8vCQlnZXRWaWV3U2VydmljZSgpCi0JCS8vCQkJCS5jcmVhdGVOb2RlKAotCQkvLwkJCQkJCXNlbWFudGljQWRhcHRlciwKLQkJLy8JCQkJCQl2aWV3LAotCQkvLwkJCQkJCURpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCS8vCQkJCQkJCQkuZ2V0VHlwZShXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkvLwkJCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50Vmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudFZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4Y2E4MDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50Vmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuTGlzdENvbXBhcnRtZW50Vmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EcmF3ZXJTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlRpdGxlU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeSBleHRlbmRzCi0JCUxpc3RDb21wYXJ0bWVudFZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNvcnRpbmdTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbHRlcmluZ1N0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlzZXR1cENvbXBhcnRtZW50VGl0bGUodmlldyk7Ci0JCXNldHVwQ29tcGFydG1lbnRDb2xsYXBzZWQodmlldyk7Ci0JCWlmICghQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQKLQkJCQkuZXF1YWxzKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwQ29tcGFydG1lbnRUaXRsZShWaWV3IHZpZXcpIHsKLQkJVGl0bGVTdHlsZSB0aXRsZVN0eWxlID0gKFRpdGxlU3R5bGUpIHZpZXcKLQkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRUaXRsZVN0eWxlKCkpOwotCQlpZiAodGl0bGVTdHlsZSAhPSBudWxsKSB7Ci0JCQl0aXRsZVN0eWxlLnNldFNob3dUaXRsZSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cENvbXBhcnRtZW50Q29sbGFwc2VkKFZpZXcgdmlldykgewotCQlEcmF3ZXJTdHlsZSBkcmF3ZXJTdHlsZSA9IChEcmF3ZXJTdHlsZSkgdmlldwotCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldERyYXdlclN0eWxlKCkpOwotCQlpZiAoZHJhd2VyU3R5bGUgIT0gbnVsbCkgewotCQkJZHJhd2VyU3R5bGUuc2V0Q29sbGFwc2VkKGZhbHNlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGI2ODNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQmFzaWNOb2RlVmlld0ZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVWaWV3RmFjdG9yeSBleHRlbmRzCi0JCUJhc2ljTm9kZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYzEzY2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlVmlld0ZhY3RvcnkgZXh0ZW5kcwotCQlBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQKLQkJCQkuZXF1YWxzKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkKLQkJCQkuY3JlYXRlTm9kZSgKLQkJCQkJCXNlbWFudGljQWRhcHRlciwKLQkJCQkJCXZpZXcsCi0JCQkJCQlEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJCQkuZ2V0VHlwZShXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLy5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVhYzVlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSBEaWFncmFtIENvcmUgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI3YzEzOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJiMjNkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51bWwyLnVtbCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvcGVydGllcywKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycywKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZSwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuZmlndXJlcywKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wcm92aWRlcnMsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcywKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjQwODJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2RsY2wxNi9kZWxldGVfZGlhZ3JhbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2RsY2wxNi9kZWxldGVfZGlhZ3JhbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YjBhNTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9kbGNsMTYvZGVsZXRlX2RpYWdyYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9kbGNsMTYvcmVmcmVzaC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2RsY2wxNi9yZWZyZXNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZhODk5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2RsY2wxNi9yZWZyZXNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZGxjbDE2L3JlZnJlc2hfYmFzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2RsY2wxNi9yZWZyZXNoX2Jhc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzZlOGFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZGxjbDE2L3JlZnJlc2hfYmFzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2VsY2wxNi9kZWxldGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9lbGNsMTYvZGVsZXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5MjJhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2VsY2wxNi9kZWxldGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9lbGNsMTYvZGVsZXRlX2RpYWdyYW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9lbGNsMTYvZGVsZXRlX2RpYWdyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjkyMmFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZWxjbDE2L2RlbGV0ZV9kaWFncmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZWxjbDE2L3JlZnJlc2guZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9lbGNsMTYvcmVmcmVzaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYzcxNDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9lbGNsMTYvcmVmcmVzaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2VsY2wxNi9yZWZyZXNoX2Jhc2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9lbGNsMTYvcmVmcmVzaF9iYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI5MDk0My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2VsY2wxNi9yZWZyZXNoX2Jhc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9saW5rLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvbGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZjQwOGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9saW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDY0MjIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIERpYWdyYW0gQ29yZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLURlbGV0ZURpYWdyYW1fdGV4dD1EZWxldGUgRGlhZ3JhbQotcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1SZWZyZXNoIGZyb20gQmFzZSBBY3Rpdml0eQotcmVmcmVzaF90ZXh0PVJlZnJlc2gKLW9wZW5fYWRkX3RleHQ9T3BlbiBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbQotZGVsZXRlX3RleHQ9RGVsZXRlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzc3ZTdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmVzdGVkQ29tbWFuZFByb3ZpZGVycyI+Ci0gICAgICA8bmVzdGVkQ29tbWFuZFByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLk5lc3RlZENvbW1hbmRQcm92aWRlciIvPgotICA8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCSA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EZWxldGVEaWFncmFtIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLkRlbGV0ZURpYWdyYW1BY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZWxjbDE2L2RlbGV0ZV9kaWFncmFtLmdpZiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuRGVsZXRlRGlhZ3JhbUFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlRGVsZXRlRGlhZ3JhbV90ZXh0IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJURlbGV0ZURpYWdyYW1fdGV4dCIvPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+IAotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuUmVmcmVzaEZyb21CYXNlQWN0aW9uIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLlJlZnJlc2hGcm9tQmFzZUFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9lbGNsMTYvcmVmcmVzaF9iYXNlLmdpZiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuUmVmcmVzaEZyb21CYXNlQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVyZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJXJlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQiLz4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuUmVmcmVzaEFjdGlvbiIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5SZWZyZXNoQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2VsY2wxNi9yZWZyZXNoLmdpZiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuUmVmcmVzaEFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlcmVmcmVzaF90ZXh0IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJXJlZnJlc2hfdGV4dCIvPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EZWxldGVEaWFncmFtRWxlbWVudEFjdGlvbiIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JUHJpbWFyeUVkaXRQYXJ0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuRGVsZXRlRWxlbWVudEFjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKiIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2VsY2wxNi9kZWxldGUuZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EZWxldGVEaWFncmFtRWxlbWVudEFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlZGVsZXRlX3RleHQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgb3ZlcnJpZGVBY3Rpb25JZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVkZWxldGVfdGV4dCIvPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL0RpYWdyYW1Db3JlUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL0RpYWdyYW1Db3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1OGM3ZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9EaWFncmFtQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNvcmVQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIERpYWdyYW1Db3JlUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUNvcmVQbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBEaWFncmFtQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5JZCgpewotCQlyZXR1cm4gUExVR0lOX0lEOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvRGlhZ3JhbUNvcmVSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvRGlhZ3JhbUNvcmVSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc5ZjNmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL0RpYWdyYW1Db3JlUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNvcmVSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERpYWdyYW1Db3JlUmVzb3VyY2VzKCkgewotCX0KLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIERpYWdyYW1Db3JlUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBrZXkgYW5kIGZvcm1hdHRlZAotCSAqIHdpdGggYSBnaXZlbiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBrZXkuCi0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIEFuIG9iamVjdC4KLQkgKiBAcmV0dXJuIEEgZm9ybWF0dGVkIGxvY2FsaXplZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcga2V5LCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gTkxTLmJpbmQoa2V5LCBuZXcgT2JqZWN0W10geyBkYXRhIH0pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9mbG93c190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9mbG93c19jcmVhdGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9jb250cm9sX2Zsb3dfY3JlYXRlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfY29udHJvbF9mbG93X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfbm9kZXNfZ3JvdXBfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9ub2Rlc190aXRsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJldmlvdXNfbmFtZV9udWxsMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJfbmFtZV9lbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb3ZlQWN0aW9uX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fU2VsZWN0X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX0FkZE5vZGVfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX0FkZE5vZGVfZXJyX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fTGlua190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9MaW5rX3NlbGVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fTGlua190b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURldGFpbERpYWdyYW1fcHJlZml4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fUGhhc2VfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fUGhhc2VfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9ncmVzc19TYXZpbmdfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXYXJuaW5nX1NhdmluZ19EaWFncmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdHZpdGl2aXR5RGlhZ3JhbV9EZWxpdmVyeVByb2Nlc3NfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3R2aXRpdml0eURpYWdyYW1fQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3R2aXRpdml0eURpYWdyYW1fUGhhc2VfdGV4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3R2aXRpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcnJlZnJlc2hmcm9tYmFzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fQmVuZFBvaW50X2NyZWF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZnJlc2hBY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmcmVzaEZyb21CYXNlQ21kX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWdyYW1fc2F2ZUVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZURpYWdyYW1fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGVEaWFncmFtX3Byb21wdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhbGlnbl9iZW5kX3BvaW50X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkVkaXRvcklucHV0X2NvbmZpZ2VkaXRvcjA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhZ3JhbV9ub2RlX3Byb3BlcnR5X3ZhbHVlX3Byb2JsZW1fbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbW1hbmRfY2Fubm90RWRpdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9jb25uZWN0X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbVZhbGlkYXRpb25fZXJyX3NhbWVwcmVkYW5kc3VjX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9kZWxldGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVDb21tYW5kX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZUxpbmtDb21tYW5kX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX01pbGVzdG9uZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9NaWxlc3RvbmVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fSm9pbl9Ob2RlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0pvaW5fTm9kZV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9NZXJnZV9Ob2RlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX01lcmdlX05vZGVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fRm9ya19Ob2RlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0ZvcmtfTm9kZV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9QYXJ0aXRpb25fTm9kZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9QYXJ0aXRpb25fTm9kZV90b29sdGlwOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9OZXdfVGFza19EZXNjcmlwdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9OZXdfTWlsZXN0b25lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdQRERfTmV3X1dvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fTmV3X0FjdGl2aXR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9OZXdfUGhhc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX05ld19JdGVyYXRpb247Ci0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fa2luZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURldGFpbF9EaWFncmFtX2tpbmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3REZXBlbmRlbmN5X0RpYWdyYW1fa2luZDsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViN2NkY2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIENvbXBsZXRlIG5ldyBzdHJpbmdzIG5lZWQgdHJhbnNsYXRpb24uCi1wcmV2aW91c19uYW1lX251bGwxPVVuZG8gb2YgYSBuYW1lIGNoYW5nZSBpcyBub3QgYWxsb3dlZCBpZiB0aGUgcHJldmlvdXMgbmFtZSBpcyBudWxsLgotZXJyX25hbWVfZW1wdHk9VGhlIG5hbWUgY2Fubm90IGJlIGVtcHR5LiBQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIG5hbWUuCi1tb3ZlQWN0aW9uX2xhYmVsPU1vdmUKLQotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90ZXh0PVNlbGVjdAotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90b29sdGlwPVNlbGVjdCBub2RlIG9yIGxpbmsKLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX3RpdGxlPUFkZCBOb2RlCi1BYnN0cmFjdERpYWdyYW1fQWRkTm9kZV9lcnJfbXNnPUlYUkQwMDAyVzogQWRkaW5nIGEgbm9kZSB0byBkaWFncmFtIGZhaWxlZAotQWJzdHJhY3REaWFncmFtX0xpbmtfdGV4dD1MaW5rCi1BYnN0cmFjdERpYWdyYW1fTGlua19zZWxlY3Q9U2VsZWN0IExpbmsKLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3Rvb2x0aXA9Q3JlYXRlIG5ldyBsaW5rCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3RleHQ9U3RhcnQgTm9kZQotQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90b29sdGlwPUNyZWF0ZSBhIFN0YXJ0IE5vZGUKLUFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90ZXh0PUZyZWUgVGV4dAotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXA9Q3JlYXRlIG5ldyBmcmVlIHRleHQKLUFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3RleHQ9U3luY2hyb25pemF0aW9uIEJhcgotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdG9vbHRpcD1DcmVhdGUgbmV3IHN5bmNocm9uaXphdGlvbiBiYXIKLUFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdGV4dD1EZWNpc2lvbiBOb2RlCi1BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXA9Q3JlYXRlIGEgRGVjaXNpb24gTm9kZQotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dD1FbmQgTm9kZQotQWN0aXZpdHlEZXRhaWxEaWFncmFtX3ByZWZpeD1BY3Rpdml0eSBEZXRhaWw6Ci1BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90b29sdGlwPUNyZWF0ZSBhbiBFbmQgTm9kZQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9QWN0aXZpdHkKLUFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90b29sdGlwPUNyZWF0ZSBhbiBBY3Rpdml0eQotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0PUl0ZXJhdGlvbgotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90b29sdGlwPUNyZWF0ZSBhbiBJdGVyYXRpb24KLUFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXh0PVBoYXNlCi1BY3Rpdml0eURpYWdyYW1fUGhhc2VfdG9vbHRpcD1DcmVhdGUgYSBQaGFzZQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQ9VGFzayBEZXNjcmlwdG9yCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdGV4dD1Sb2xlIERlc2NyaXB0b3IKLVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4PVdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW06Ci1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdG9vbHRpcD1DcmVhdGUgYSBSb2xlIERlc2NyaXB0b3IKLUFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90b29sdGlwPUNyZWF0ZSBhIFRhc2sgRGVzY3JpcHRvcgotQWN0dml0aXZpdHlEaWFncmFtX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0PURlbGl2ZXJ5IFByb2Nlc3MKLUFjdHZpdGl2aXR5RGlhZ3JhbV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0PUNhcGFiaWxpdHkgUGF0dGVybgotQWN0dml0aXZpdHlEaWFncmFtX1BoYXNlX3RleD1QaGFzZQotQWN0dml0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0PUl0ZXJhdGlvbgotQWN0dml0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ9QWN0aXZpdHkKLUFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dD1Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcgotQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90b29sdGlwPUNyZWF0ZSBhIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yCi0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1BbGlnbgotQWJzdHJhY3REaWFncmFtRWRpdG9yX3JlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQ9UmVmcmVzaCBmcm9tIEJhc2UgQWN0aXZpdHkKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dD1Gb3JtYXQgVGV4dCBCb3guLi4KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9SG9yaXpvbnRhbGx5IHRvIEF2ZXJhZ2UKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9SG9yaXpvbnRhbGx5IHRvIEZpcnN0IFNlbGVjdGVkCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVZlcnRpY2FsbHkgdG8gQXZlcmFnZQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1WZXJ0aWNhbGx5IHRvIEZpcnN0IFNlbGVjdGVkCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PVNhdmUKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9U2F2aW5nIHswfQotQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsPU1vdmUgTm9kZQotQWJzdHJhY3REaWFncmFtRWRpdG9ycmVmcmVzaGZyb21iYXNlPVJlZnJlc2ggRnJvbSBCYXNlCi1BYnN0cmFjdERpYWdyYW1fQmVuZFBvaW50X2NyZWF0ZT1DcmVhdGUgQmVuZHBvaW50Ci0KLUFjdGl2aXR5RGlhZ3JhbV9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9T3BlbiBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbQotcmVmcmVzaEFjdGlvbl9sYWJlbD1SZWZyZXNoCi1yZWZyZXNoRnJvbUJhc2VDbWRfbGFiZWw9UmVmcmVzaCBGcm9tIEJhc2UKLWRpYWdyYW1fc2F2ZUVycm9yPUlVUEQwMDAxVzogU2F2aW5nIGRpYWdyYW0gZmFpbGVkCi0KLURlbGV0ZURpYWdyYW1fdGV4dD1EZWxldGUgRGlhZ3JhbQotRGVsZXRlRGlhZ3JhbV9wcm9tcHQ9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNsb3NlIGFuZCBkZWxldGUgdGhpcyBkaWFncmFtP1xuVGhpcyBjaGFuZ2UgaXMgcGVybWFuZW50IGFuZCBjYW5ub3QgYmUgdW5kb25lLgotYWxpZ25fYmVuZF9wb2ludF90ZXh0PUFsaWduIEJlbmQgUG9pbnQKLUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dF9jb25maWdlZGl0b3IwPUNvbmZpZ3VyYXRpb24gRWRpdG9yCi1kaWFncmFtX25vZGVfcHJvcGVydHlfdmFsdWVfcHJvYmxlbV9tc2c9RXJyb3IgaW4gdGhlIG5vZGUncyBwcm9wZXJ0eSB2YWx1ZS4KLWRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGU9RXJyb3IKLQotQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0PVJlc2V0IERpYWdyYW0gTGF5b3V0Ci1lcnJvckRpYWxvZ190aXRsZT1FcnJvcgotY29tbWFuZF9jYW5ub3RFZGl0PUlVUEQwMDAzRTogQ2Fubm90IGVkaXQgZGlhZ3JhbQotCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGl0bGU9UGFyZW50IEVkaXRvciBDbG9zZWQKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90ZXh0PXswfSBoYXMgY2xvc2VkLiBXb3VsZCB5b3UgYWxzbyBsaWtlIHRvIGNsb3NlIHsxfT8KLQotI0JlbG93IHRocmVlIHN0cmluZ3MgbW92ZWQgZnJvbSBBdXRob3JpbmdVSSByZXNvdXJjZXMucHJvcGVydGllcy4KLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0PUlVUEEwMDMyVzogQ2Fubm90IGNvbm5lY3QKLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9zYW1lcHJlZGFuZHN1Y190ZXh0PUlVUEEwMDMzVzogQ2Fubm90IGhhdmUgdGhlIHNhbWUgYnJlYWtkb3duIGVsZW1lbnQgYXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvcgotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9kZWxldGVfdGV4dD1DYW5ub3QgZGVsZXRlCi1kZWxldGVDb21tYW5kX2xhYmVsPURlbGV0ZQotZGVsZXRlTGlua0NvbW1hbmRfbGFiZWw9RGVsZXRlIENvbm5lY3Rpb24KLQotQWN0aXZpdHlEaWFncmFtX01pbGVzdG9uZV90ZXh0PU1pbGVzdG9uZQotQWN0aXZpdHlEaWFncmFtX01pbGVzdG9uZV90b29sdGlwPUNyZWF0ZSBhIE1pbGVzdG9uZQotQWN0aXZpdHlEaWFncmFtX0pvaW5fTm9kZV90ZXh0PUpvaW4gTm9kZQotQWN0aXZpdHlEaWFncmFtX0pvaW5fTm9kZV90b29sdGlwPUNyZWF0ZSBhIEpvaW4gTm9kZQotQWN0aXZpdHlEaWFncmFtX01lcmdlX05vZGVfdGV4dD1NZXJnZSBOb2RlCi1BY3Rpdml0eURpYWdyYW1fTWVyZ2VfTm9kZV90b29sdGlwPUNyZWF0ZSBhIE1lcmdlIE5vZGUKLUFjdGl2aXR5RGlhZ3JhbV9Gb3JrX05vZGVfdGV4dD1Gb3JrIE5vZGUKLUFjdGl2aXR5RGlhZ3JhbV9Gb3JrX05vZGVfdG9vbHRpcD1DcmVhdGUgYSBGb3JrIE5vZGUKLUFjdGl2aXR5RGlhZ3JhbV9QYXJ0aXRpb25fTm9kZV90ZXh0PUFjdGl2aXR5IFBhcnRpdGlvbgotQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfZmxvd3NfdGl0bGU9Rmxvd3MKLUFjdGl2aXR5RGlhZ3JhbV9QYWxldHRlX25vZGVzX3RpdGxlcz1Ob2RlcwotQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfZmxvd3NfY3JlYXRlX3RleHQ9Q3JlYXRpb24gdG9vbCBmb3IgZmxvd3MKLUFjdGl2aXR5RGlhZ3JhbV9QYWxldHRlX25vZGVzX2dyb3VwX3RleHQ9Q3JlYXRpb24gdG9vbCBncm91cCBmb3Igbm9kZXMKLUFjdGl2aXR5RGlhZ3JhbV9QYWxldHRlX2NvbnRyb2xfZmxvd190ZXh0PUNvbnRyb2wgRmxvdwotQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfY29udHJvbF9mbG93X2NyZWF0ZV90ZXh0PUNyZWF0ZSBhIENvbnRyb2wgRmxvdwotQWN0aXZpdHlEaWFncmFtX1BhcnRpdGlvbl9Ob2RlX3Rvb2x0aXA9Q3JlYXRlIGFuIEFjdGl2aXR5IFBhcnRpdGlvbgotCi1BY3Rpdml0eURpYWdyYW1fTmV3X1Rhc2tfRGVzY3JpcHRvcj1OZXcgVGFzayBEZXNjcmlwdG9yCi1BY3Rpdml0eURpYWdyYW1fTmV3X01pbGVzdG9uZT1OZXcgTWlsZXN0b25lCi1XUEREX05ld19Xb3JrUHJvZHVjdERlc2NyaXB0b3I9TmV3IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yCi1BY3Rpdml0eURpYWdyYW1fTmV3X0FjdGl2aXR5PU5ldyBBY3Rpdml0eQotQWN0aXZpdHlEaWFncmFtX05ld19QaGFzZT1OZXcgUGhhc2UKLUFjdGl2aXR5RGlhZ3JhbV9OZXdfSXRlcmF0aW9uPU5ldyBJdGVyYXRpb24KLVByb2dyZXNzX1NhdmluZ19tZXNzYWdlPVNhdmluZyB7MH0KLVdhcm5pbmdfU2F2aW5nX0RpYWdyYW09SVVQRDAwMDFXOiBTYXZpbmcgZGlhZ3JhbSBmYWlsZWQKLQotQWN0aXZpdHlEaWFncmFtX2tpbmQ9QWN0aXZpdHkgRGlhZ3JhbQotQWN0aXZpdHlEZXRhaWxfRGlhZ3JhbV9raW5kPUFjdGl2aXR5IERldGFpbCBEaWFncmFtCi1Xb3JrUHJvZHVjdERlcGVuZGVuY3lfRGlhZ3JhbV9raW5kPVdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9BY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0FjY2Vzc2liaWxpdHlNb3ZlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NGU0ODUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0FjY2Vzc2liaWxpdHlNb3ZlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuRGlhZ3JhbUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5jb21tYW5kcy5DaGFuZ2VCb3VuZHNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkNvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbXBvc2l0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLkRpYWdyYW1BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5Db21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uUmVsYXRpdmVCZW5kcG9pbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogQWN0aW9uIGNsYXNzIHRvIG1vdmUgZGlhZ3JhbSBlbGVtZW50cyBpbiBkaWFncmFtIGFyZWEgdXNpbmcga2V5Ym9hcmQgdXAsIGRvd24sIGxlZnQsIHJpZ2h0IGtleXMuCi0gKiBVc2VmdWwgZm9yIEFjY2Vzc2liaWxpdHksIGFuZCBhbHNvIGRvZXMgbW92ZSBiZW5kcG9pbnRzIG9mIGNvbnRyb2wgZmxvdy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbiBleHRlbmRzIERpYWdyYW1BY3Rpb24gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9WRV9MRUZUX0FDVElPTiA9ICJtb3ZlX2xlZnRfYWN0aW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT1ZFX1JJR0hUX0FDVElPTiA9ICJtb3ZlX3JpZ2h0X2FjdGlvbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9WRV9ET1dOX0FDVElPTiA9ICJtb3ZlX2Rvd25fYWN0aW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT1ZFX1VQX0FDVElPTiA9ICJtb3ZlX3VwX2FjdGlvbiI7Ci0JCi0JcHJpdmF0ZSBpbnQgZGlyZWN0aW9uOwotCQotCi0JLyoqCi0JICogQHBhcmFtIHdvcmtiZW5jaFBhZ2UKLQkgKi8KLQlwdWJsaWMgQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24oSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSkgewotCQlzdXBlcih3b3JrYmVuY2hQYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gd29ya2JlbmNocGFydAotCSAqLwotCXB1YmxpYyBBY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbihJV29ya2JlbmNoUGFydCB3b3JrYmVuY2hwYXJ0LCBpbnQgZGlyZWN0aW9uKSB7Ci0JCXN1cGVyKHdvcmtiZW5jaHBhcnQpOwotCQl0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuRGlhZ3JhbUFjdGlvbiNjcmVhdGVUYXJnZXRSZXF1ZXN0KCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmVxdWVzdCBjcmVhdGVUYXJnZXRSZXF1ZXN0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuRGlhZ3JhbUFjdGlvbiNpc1NlbGVjdGlvbkxpc3RlbmVyKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCXNldElkKERpYWdyYW1Db25zdGFudHMuTU9WRV9BQ1RJT04pOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGlyZWN0aW9uKGludCBkaXJlY3Rpb24pewotCQl0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29tbWFuZCgpIHsKLQkJTGlzdCBsaXN0ID0gZ2V0U2VsZWN0ZWRPYmplY3RzKCk7Ci0JCUNvbXBvc2l0ZUNvbW1hbmQgY2MgPSBuZXcgQ29tcG9zaXRlQ29tbWFuZChEaWFncmFtQ29yZVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWwpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgcGFydCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKHBhcnQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCl7Ci0JCQkJQ29tbWFuZCBjID0gbW92ZShkaXJlY3Rpb24sIChHcmFwaGljYWxFZGl0UGFydClwYXJ0KTsKLQkJCQlpZihjICE9IG51bGwpewotCQkJCQljYy5jb21wb3NlKG5ldyBDb21tYW5kUHJveHkoYykpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY2MuaXNFbXB0eSgpID8gbnVsbCA6IG5ldyBJQ29tbWFuZFByb3h5KGNjLnJlZHVjZSgpKTsKLQl9Ci0JCi0JcHVibGljIENvbW1hbmQgbW92ZShpbnQgZGlyZWN0aW9uLCBHcmFwaGljYWxFZGl0UGFydCBwYXJ0KSB7Ci0JCWlmIChwYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlWaWV3IHZpZXcgPSAoVmlldykgcGFydC5nZXRNb2RlbCgpOwotCQkJT2JqZWN0IHggPSBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpKTsKLQkJCU9iamVjdCB5ID0gVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LAotCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKSk7Ci0JCQlQb2ludCBwb2ludCA9IG5ldyBQb2ludCgoKEludGVnZXIpIHgpLmludFZhbHVlKCksICgoSW50ZWdlcikgeSkuaW50VmFsdWUoKSk7Ci0JCQlpbnQgbmV3eCA9IHBvaW50Lng7Ci0JCQlpbnQgbmV3eSA9IHBvaW50Lnk7Ci0JCQlpbnQgcHJlc3NsZW5ndGggPSAxOwotCQkJc3dpdGNoIChkaXJlY3Rpb24pIHsKLQkJCWNhc2UgUG9zaXRpb25Db25zdGFudHMuRUFTVDoKLQkJCQluZXd4ID0gcG9pbnQueCArIHByZXNzbGVuZ3RoOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSDoKLQkJCQluZXd5ICs9IHByZXNzbGVuZ3RoOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSDoKLQkJCQluZXd5IC09IHByZXNzbGVuZ3RoOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5XRVNUOgotCQkJCW5ld3ggLT0gcHJlc3NsZW5ndGg7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfQotCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKAotCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksCi0JCQkJCXZpZXcsIG5ldyBQb2ludChuZXd4LCBuZXd5KSwgLTEsIC0xKTsKLQotCQkJcmV0dXJuIGM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENvbW1hbmQgbW92ZUJlbmRQb2ludChpbnQgZGlyZWN0aW9uLCBDb25uZWN0aW9uRWRpdFBhcnQgcGFydCl7Ci0JCS8vIFRPRE8tIGNoZWNrIGFkZGluZyBtb3JlIGJlbmRwb2ludCwgY2FwdHVyZSBiZW5kcG9pbnQKLQkJLy8gaW5kZXggb24gZmx5Ci0JCWlmIChwYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBFZGdlKSB7Ci0JCQlFZGdlIGVkZ2UgPSAoRWRnZSkgcGFydC5nZXRNb2RlbCgpOwotCQkJUmVsYXRpdmVCZW5kcG9pbnRzIGJQb2ludHMgPSAoUmVsYXRpdmVCZW5kcG9pbnRzKWVkZ2UuZ2V0QmVuZHBvaW50cygpOwotCQkJTGlzdCBibGlzdCA9IGJQb2ludHMuZ2V0UG9pbnRzKCk7Ci0JCQlpbnQgaW5kZXggPSAwOwotCQkJaWYgKGJsaXN0ICE9IG51bGwgJiYgYmxpc3Quc2l6ZSgpID4gMCkgewotCQkJCUFic29sdXRlQmVuZHBvaW50IHBvaW50ID0gKEFic29sdXRlQmVuZHBvaW50KSBibGlzdAotCQkJCQkJLmdldChpbmRleCk7Ci0JCQkJaW50IG5ld3ggPSBwb2ludC54OwotCQkJCWludCBuZXd5ID0gcG9pbnQueTsKLQkJCQlpbnQgcHJlc3NsZW5ndGggPSA1OwotCQkJCXN3aXRjaCAoZGlyZWN0aW9uKSB7Ci0JCQkJY2FzZSAxOgotCQkJCQluZXd4ID0gcG9pbnQueCArIHByZXNzbGVuZ3RoOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDI6Ci0JCQkJCW5ld3kgKz0gcHJlc3NsZW5ndGg7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzoKLQkJCQkJbmV3eSAtPSBwcmVzc2xlbmd0aDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0OgotCQkJCQluZXd4IC09IHByZXNzbGVuZ3RoOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLy9UT0RPOiBpbXBsZW1lbnQgdGhlIG1vdmViZW5kcG9pbnQgY29tbWFuZC4KLS8vCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgTW92ZUJlbmRwb2ludENvbW1hbmQoCi0vLwkJCQkJCWxpbmssIG5ldyBQb2ludChuZXd4LCBuZXd5KSwgaW5kZXgpOwotLy8JCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKXsKLQkJcmV0dXJuICgoQWJzdHJhY3REaWFncmFtRWRpdG9yKWdldERpYWdyYW1Xb3JrYmVuY2hQYXJ0KCkpLmdldEVkaXRpbmdEb21haW4oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJc3dpdGNoKGRpcmVjdGlvbil7Ci0JCWNhc2UgUG9zaXRpb25Db25zdGFudHMuRUFTVDoKLQkJCXJldHVybiBNT1ZFX1JJR0hUX0FDVElPTjsKLQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSDoKLQkJCXJldHVybiBNT1ZFX0RPV05fQUNUSU9OOwotCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIOgotCQkJcmV0dXJuIE1PVkVfVVBfQUNUSU9OOwotCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLldFU1Q6Ci0JCQlyZXR1cm4gTU9WRV9MRUZUX0FDVElPTjsKLQkJfQotCQlyZXR1cm4gRGlhZ3JhbUNvbnN0YW50cy5NT1ZFX0FDVElPTjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlpZihUbmdVdGlsLmlzTG9ja2VkKGdldE93bmluZ1Byb2Nlc3MoKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQlpZihCcmlkZ2VIZWxwZXIuaXNSZWFkT25seSgoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcilnZXREaWFncmFtV29ya2JlbmNoUGFydCgpKS5nZXREaWFncmFtKCkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJaWYoZ2V0U2VsZWN0ZWRPYmplY3RzKCkuaXNFbXB0eSgpKSByZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBzdXBlci5pc0VuYWJsZWQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgZ2V0T3duaW5nUHJvY2VzcygpewotCQlJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0ID0gZ2V0RGlhZ3JhbVdvcmtiZW5jaFBhcnQoKTsKLQkJaWYodGFyZ2V0UGFydCAhPSBudWxsKXsKLQkJCURpYWdyYW0gZCA9ICgoQWJzdHJhY3REaWFncmFtRWRpdG9yKXRhcmdldFBhcnQpLmdldERpYWdyYW0oKTsKLQkJCURpYWdyYW1BZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0RGlhZ3JhbUFkYXB0ZXIoZC5nZXRFbGVtZW50KCkpOwotCQkJaWYoYWRhcHRlciAhPSBudWxsKXsKLQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFkYXB0ZXIuZ2V0QWN0aXZpdHkoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0FjdGlvbkRlbGVnYXRlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA2OTk0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQ7Ci0JcHJvdGVjdGVkIExpc3Q8RWRpdFBhcnQ+IHNlbGVjdGVkUGFydHMgPSBuZXcgQXJyYXlMaXN0PEVkaXRQYXJ0PigpOwotCXByb3RlY3RlZCBSZXF1ZXN0IHRhcmdldFJlcXVlc3Q7Ci0KLQlwdWJsaWMgQWN0aW9uRGVsZWdhdGUoKXsKLQkJCi0JfQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBY3Rpb25EZWxlZ2F0ZShJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQl0aGlzLnRhcmdldFBhcnQgPSB0YXJnZXRQYXJ0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJdGhpcy50YXJnZXRQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCWV4ZWN1dGUoZ2V0Q29tbWFuZCgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWRyb3BNZW51SXRlbXMoKTsKLQkJc2VsZWN0ZWRQYXJ0cy5jbGVhcigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWlmIChzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKSA+MAotCQkJCQkmJiBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgRWRpdFBhcnQpIHsKLQkJCQlzZWxlY3RlZFBhcnRzLmFkZEFsbChzdHJ1Y3R1cmVkU2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBnaXZlcyBhY2Nlc3MgdG8gdGhlIGRpYWdyYW0gY29tbWFuZCBzdGFjawotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRpYWdyYW0gY29tbWFuZCBzdGFjawotCSAqLwotCXByb3RlY3RlZCBEaWFncmFtQ29tbWFuZFN0YWNrIGdldERpYWdyYW1Db21tYW5kU3RhY2soKSB7Ci0JCU9iamVjdCBzdGFjayA9IHRhcmdldFBhcnQuZ2V0QWRhcHRlcihDb21tYW5kU3RhY2suY2xhc3MpOwotCQlyZXR1cm4gKHN0YWNrIGluc3RhbmNlb2YgRGlhZ3JhbUNvbW1hbmRTdGFjaykgPyAoRGlhZ3JhbUNvbW1hbmRTdGFjaykgc3RhY2sKLQkJCTogbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIElXb3JrYmVuY2hQYXJ0IGdldFdvcmtiZW5jaFBhcnQoKSB7Ci0JCXJldHVybiB0YXJnZXRQYXJ0OwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBjb250ZXh0bWVudXByb3ZpZGVyLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIgZ2V0RGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIoKSB7Ci0JCWlmKHRhcmdldFBhcnQgIT0gbnVsbCl7Ci0JCQlEaWFncmFtR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChEaWFncmFtR3JhcGhpY2FsVmlld2VyKSB0YXJnZXRQYXJ0Ci0JCQkJLmdldEFkYXB0ZXIoR3JhcGhpY2FsVmlld2VyLmNsYXNzKTsKLQkJCURpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIHByb3ZpZGVyID0gKERpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyKSB2aWV3ZXIKLQkJCQkuZ2V0Q29udGV4dE1lbnUoKTsKLQkJCXJldHVybiBwcm92aWRlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIHtAbGluayBDb21tYW5kfS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqICAgICAgICAgICAgdGhlIGNvbW1hbmQgdG8gZXhlY3V0ZQotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiAgICAgICAgICAgIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHVzZSBkdXJpbmcgZXhlY3V0aW9uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlpZiAoY29tbWFuZCA9PSBudWxsIHx8ICFjb21tYW5kLmNhbkV4ZWN1dGUoKSkKLQkJCXJldHVybjsKLQkJaWYgKGdldERpYWdyYW1Db21tYW5kU3RhY2soKSAhPSBudWxsKQotCQkJZ2V0RGlhZ3JhbUNvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCwgcHJvZ3Jlc3NNb25pdG9yKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbW1hbmQgZ2V0Q29tbWFuZCgpOwotCQotCXByb3RlY3RlZCB2b2lkIGRyb3BNZW51SXRlbXMoKXsKLQl9Ci0JCi0JIC8qKgotICAgICAqIEdldHMgZWRpdGluZyBkb21haW4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIG15IGVkaXRpbmcgZG9tYWluCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0gICAgICAgIAotICAgICAgICAvLyB0cnkgYWRhcHRpbmcgdGhlIHdvcmtiZW5jaCBwYXJ0Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0IHBhcnQgPSBnZXRXb3JrYmVuY2hQYXJ0KCk7Ci0KLSAgICAgICAgaWYgKHBhcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgSUVkaXRpbmdEb21haW5Qcm92aWRlciBlZFByb3ZpZGVyID0gKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIHBhcnQKLSAgICAgICAgICAgICAgICAuZ2V0QWRhcHRlcihJRWRpdGluZ0RvbWFpblByb3ZpZGVyLmNsYXNzKTsKLQotICAgICAgICAgICAgaWYgKGVkUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgCUVkaXRpbmdEb21haW4gZG9tYWluID0gZWRQcm92aWRlci5nZXRFZGl0aW5nRG9tYWluKCk7Ci0gICAgICAgICAgICAJCi0gICAgICAgICAgICAJaWYgKGRvbWFpbiBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKSB7Ci0gICAgICAgICAgICAJCXJldHVybiAoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4pIGRvbWFpbjsKLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qKgotCSAqIEdldHMgYSByZXF1ZXN0IHRvIGJlIGFkZHJlc3NlZCB0byB0aGUgb3BlcmF0aW9uIHNldAotCSAqIAotCSAqIEByZXR1cm4gYSB0YXJnZXQgcmVxdWVzdAotCSAqLwotCXByb3RlY3RlZCBSZXF1ZXN0IGdldFRhcmdldFJlcXVlc3QoKSB7Ci0JCWlmICh0YXJnZXRSZXF1ZXN0ID09IG51bGwpCi0JCQl0YXJnZXRSZXF1ZXN0ID0gY3JlYXRlVGFyZ2V0UmVxdWVzdCgpOwotCQlyZXR1cm4gdGFyZ2V0UmVxdWVzdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRhcmdldCByZXF1ZXN0Ci0JICogCi0JICogQHJldHVybiB0aGUgbmV3IHRhcmdldCByZXF1ZXN0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFJlcXVlc3QgY3JlYXRlVGFyZ2V0UmVxdWVzdCgpOwotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0NyZWF0ZUVsZW1lbnRBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9DcmVhdGVFbGVtZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNmVjOTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0NyZWF0ZUVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVVuc3BlY2lmaWVkVHlwZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVFbGVtZW50QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydDsKLQlwcml2YXRlIExpc3QgZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxFbGVtZW50VHlwZT4oKTsKLQlwcml2YXRlIFByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlSGludCA9IG51bGw7Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENyZWF0ZUVsZW1lbnRBY3Rpb24oSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCwgU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIodGV4dCk7Ci0JCXRoaXMudGFyZ2V0UGFydCA9IHRhcmdldFBhcnQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlSZXF1ZXN0IHJlcT0gbmV3IENyZWF0ZVVuc3BlY2lmaWVkVHlwZVJlcXVlc3QoZ2V0RWxlbWVudFR5cGVzKCksIGdldFByZWZlcmVuY2VIaW50KCkpOwotCQlEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0ID0gZ2V0RGlhZ3JhbUVkaXRQYXJ0KCk7Ci0JCWlmKGRpYWdyYW1FZGl0UGFydC5pc0VkaXRNb2RlRW5hYmxlZCgpKXsKLQkJCUNvbW1hbmQgY21kID0gZ2V0RGlhZ3JhbUVkaXRQYXJ0KCkuZ2V0Q29tbWFuZChyZXEpOwotCQkJaWYoY21kLmNhbkV4ZWN1dGUoKSl7Ci0JCQkJY21kLmV4ZWN1dGUoKTsKLQkJCQlpZihjbWQgaW5zdGFuY2VvZiBJQ29tbWFuZFByb3h5KXsKLQkJCQkJQ29tbWFuZFJlc3VsdCByZXN1bHRzID0gKChJQ29tbWFuZFByb3h5KWNtZCkuZ2V0SUNvbW1hbmQoKS5nZXRDb21tYW5kUmVzdWx0KCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHRzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgRGlhZ3JhbUVkaXRQYXJ0IGdldERpYWdyYW1FZGl0UGFydCgpewotCQlpZih0YXJnZXRQYXJ0ICE9IG51bGwgJiYgdGFyZ2V0UGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcil7Ci0JCQlyZXR1cm4gKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpdGFyZ2V0UGFydCkuZ2V0RGlhZ3JhbUVkaXRQYXJ0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RWxlbWVudFR5cGVzKCkgewotCQlyZXR1cm4gZWxlbWVudFR5cGVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRUeXBlcyhMaXN0IGVsZW1lbnRUeXBlcykgewotCQl0aGlzLmVsZW1lbnRUeXBlcyA9IGVsZW1lbnRUeXBlczsKLQl9Ci0KLQlwdWJsaWMgUHJlZmVyZW5jZXNIaW50IGdldFByZWZlcmVuY2VIaW50KCkgewotCQlyZXR1cm4gcHJlZmVyZW5jZUhpbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJlZmVyZW5jZUhpbnQoUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VIaW50KSB7Ci0JCXRoaXMucHJlZmVyZW5jZUhpbnQgPSBwcmVmZXJlbmNlSGludDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGVsZWdhdGVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9EZWxlZ2F0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2JjY2NlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9EZWxlZ2F0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuYWN0aW9uLkFic3RyYWN0QWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogSUFjdGlvbiB0byBkZWxlZ2F0ZSB0byBJT2JqZWN0QWN0aW9uRGVsZWdhdGUuIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxlZ2F0ZUFjdGlvbiBleHRlbmRzIEFic3RyYWN0QWN0aW9uSGFuZGxlciB7Ci0KLQlwcml2YXRlIElBY3Rpb25EZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IHBhcnQ7Ci0JCi0JcHVibGljIERlbGVnYXRlQWN0aW9uKElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLQkJc3VwZXIocGFnZS5nZXRBY3RpdmVQYXJ0KCkpOwotCQl0aGlzLnBhcnQgPSBwYWdlLmdldEFjdGl2ZVBhcnQoKTsKLQl9Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERlbGVnYXRlQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQsIFN0cmluZyBpZCkgewotCQkvL3N1cGVyKHRleHQpOwotCQlzdXBlcihwYXJ0KTsKLQkJdGhpcy5wYXJ0ID0gcGFydDsKLQkJY3JlYXRlRGVsZWdhdGUoaWQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXJ1bldpdGhFdmVudChudWxsKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmKGRlbGVnYXRlICE9IG51bGwpewotCQkJcmVmcmVzaCgpOwotCQkJZGVsZWdhdGUucnVuKHRoaXMpOwotCQl9Ci0JCS8vIFJlc2V0IGFjdGlvbiBhbmQgZGVsZWdhdGUgYWN0aW9ucywgYmVjYXVzZSBzZWxlY3Rpb25DaGFuZ2VkIGxpc3RlbmVycyBkb24ndCBub3RpZnkgaGVyZS4KLQkJaWYoZGVsZWdhdGUgaW5zdGFuY2VvZiBBY3Rpb25EZWxlZ2F0ZSl7Ci0JCQkoKEFjdGlvbkRlbGVnYXRlKWRlbGVnYXRlKS5zZXRFbmFibGVkKHRydWUpOwotCQl9Ci0JCXNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9SdW4oSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmKHNlbGVjdGlvbiA9PSBudWxsKXsKLQkJCXNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0JCX0KLQkJZGVsZWdhdGUuc2VsZWN0aW9uQ2hhbmdlZCh0aGlzLCBzZWxlY3Rpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWxlZ2F0ZShTdHJpbmcgaWQpewotCQlpZihpZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSkpewotCQkJZGVsZWdhdGUgPSBuZXcgRGVsZXRlRWxlbWVudEFjdGlvbkRlbGVnYXRlKHRoaXMscGFydCk7Ci0JCX0KLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZWZyZXNoKCk7Ci0JCXJldHVybiAoKEFjdGlvbkRlbGVnYXRlKWRlbGVnYXRlKS5pc0VuYWJsZWQoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGVsZXRlRGlhZ3JhbUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0RlbGV0ZURpYWdyYW1BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM3ZjU2Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGVsZXRlRGlhZ3JhbUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuQWN0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eTsKLQotLyoqCi0gKiBEZWxldGVzIHRoZSBkaWFncmFtLgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVEaWFncmFtQWN0aW9uIGV4dGVuZHMgQWN0aW9uRGVsZWdhdGUgewotCi0JcHVibGljIERlbGV0ZURpYWdyYW1BY3Rpb24oKXsKLQkJc3VwZXIoKTsKLQl9Ci0JcHVibGljIERlbGV0ZURpYWdyYW1BY3Rpb24oSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJc3VwZXIoYWN0aW9uLCB0YXJnZXRQYXJ0KTsKLQl9Ci0KLQlwcml2YXRlIEVkaXRQYXJ0IG15U2VsZWN0ZWRFbGVtZW50OwotCS8vcHJpdmF0ZSBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0OwotCS8qKgotCSAqIAotCSAqLwotCQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlI3NldEFjdGl2ZVBhcnQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotLy8JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotLy8JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLS8vCQl0aGlzLnRhcmdldFBhcnQgPSB0YXJnZXRQYXJ0OwotLy8JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKERpYWdyYW1Db3JlUGx1Z2luCi0JCQkJLmdldERlZmF1bHQoKQotCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCS5kaXNwbGF5UHJvbXB0KAotCQkJCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuRGVsZXRlRGlhZ3JhbV90ZXh0LCAvLyROT04tTkxTLTEkCi0JCQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5EZWxldGVEaWFncmFtX3Byb21wdCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYobXlTZWxlY3RlZEVsZW1lbnQgIT0gbnVsbCl7Ci0JCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pbXlTZWxlY3RlZEVsZW1lbnQuZ2V0TW9kZWwoKTsKLQkJCQlpZihkaWFncmFtICE9IG51bGwpewotCQkJCQl0cnl7Ci0JCQkJCQlEaWFncmFtSGVscGVyLmRlbGV0ZURpYWdyYW0oZGlhZ3JhbSwgdHJ1ZSk7Ci0JCQkJCQl0YXJnZXRQYXJ0LmdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoCi0JCQkJCQkJCXRhcmdldFBhcnQuZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKSwgZmFsc2UpOwotCQkJCQl9IGNhdGNoKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZHJvcE1lbnVJdGVtcygpOwotCQlteVNlbGVjdGVkRWxlbWVudCA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uc2l6ZSgpID09IDEKLQkJCQkJJiYgc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkJbXlTZWxlY3RlZEVsZW1lbnQgPSAoRWRpdFBhcnQpIHN0cnVjdHVyZWRTZWxlY3Rpb24KLQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCX0KLQkJfQotCQlpZihteVNlbGVjdGVkRWxlbWVudCAhPSBudWxsKXsKLQkJCWFjdGlvbi5zZXRDaGVja2VkKGZhbHNlKTsKLQkJCWlmKG15U2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KXsKLQkJCQlpZighKChEaWFncmFtRWRpdFBhcnQpbXlTZWxlY3RlZEVsZW1lbnQpLmlzRWRpdE1vZGVFbmFibGVkKCkpewotCQkJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSBnZXREaWFncmFtQ29udGV4dE1lbnVQcm92aWRlcigpLmZpbmQoQWN0aW9uSWRzLk1FTlVfRURJVCk7Ci0JCQkJCWlmKGl0ZW0gIT0gbnVsbCkgaXRlbS5zZXRWaXNpYmxlKGZhbHNlKTsgCi0JCQkJfQotCQkJfQotCQkJCi0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSlteVNlbGVjdGVkRWxlbWVudC5nZXRNb2RlbCgpOwotCQkJaWYoZGlhZ3JhbSAhPSBudWxsKXsKLQkJCQlFT2JqZWN0IG1vZGVsID0gZGlhZ3JhbS5nZXRFbGVtZW50KCk7Ci0JCQkJaWYobW9kZWwgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJCU5vZGVBZGFwdGVyIGFkYXB0ZXI9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihtb2RlbCk7Ci0JCQkJCWlmKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmlzVGFyZ2V0UmVhZE9ubHkoKSl7Ci0JCQkJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQlJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gZ2V0RGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIoKS5maW5kKEFjdGlvbklkcy5NRU5VX0VESVQpOwotCQkJCQkJaWYoaXRlbSAhPSBudWxsKSBpdGVtLnNldFZpc2libGUoZmFsc2UpOyAKLQkJCQkJfQotCQkJCX1lbHNlIGlmKG1vZGVsIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSl7Ci0vLwkJCQkJaWYoKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKWRpYWdyYW0pLmlzUmVhZE9ubHkoKSl7Ci0vLwkJCQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfQotCQl9ZWxzZXsKLQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBSZXF1ZXN0IGNyZWF0ZVRhcmdldFJlcXVlc3QoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29tbWFuZCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGVsZXRlRWxlbWVudEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0RlbGV0ZUVsZW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxMWExMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGVsZXRlRWxlbWVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLlByb2Nlc3NEZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkdyb3VwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuQWJzdHJhY3REZWxldGVGcm9tQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5FZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotCi0vKioKLSAqIFJlcGxhY2VzIHRoZSBkZWZhdWx0IHRoZSBEZWxldGUgZnJvbSBNb2RlbCBhbmQgRGVsZXRlIGZyb20gRGlhZ3JhbSBhY3Rpb25zIG9mIEdNRi4KLSAqIERlbGV0ZSB0aGUgZGlhZ3JhbSBlbGVtZW50IGFuZCBpdHMgYXNzb2NpYXRlZCBkaWFncmFtIGFuZCByZWZlcmVuY2VzLiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaS4KLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZUVsZW1lbnRBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdERlbGV0ZUZyb21BY3Rpb24gewotCi0JYm9vbGVhbiByZW1vdmVNb2RlbCA9IHRydWU7Ci0JLyoqIHRoZSB0YXJnZXQgcmVxdWVzdCAqLwotCXByaXZhdGUgUmVxdWVzdCBzZWNvbmRhcnlUYXJnZXRSZXF1ZXN0OwotCS8qKgotCSAqIEBwYXJhbSBwYXJ0Ci0JICovCi0JcHVibGljIERlbGV0ZUVsZW1lbnRBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlzdXBlcihwYXJ0KTsKLQkJCi0JfQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGNhbGN1bGF0ZUVuYWJsZWQoKSB7Ci0JCQotCQlMaXN0IG9wZXJhdGlvblNldCA9IGdldE9wZXJhdGlvblNldCgpOwotCQlpZiAob3BlcmF0aW9uU2V0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVJlcXVlc3QgcmVxdWVzdCA9IGdldFRhcmdldFJlcXVlc3QoKTsKLQkJSXRlcmF0b3IgZWRpdFBhcnRzID0gb3BlcmF0aW9uU2V0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlZGl0UGFydHMuaGFzTmV4dCgpKSB7Ci0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLm5leHQoKTsKLQkJCS8vIGRpc2FibGUgb24gZGlhZ3JhbSBsaW5rcyAKLQkJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCUlHcmFwaGljYWxFZGl0UGFydCBnRWRpdFBhcnQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydDsKLQkJCQlWaWV3IHZpZXcgPSAoVmlldykgZ0VkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudCh2aWV3KTsKLQkJCQlpZiAoKGVsZW1lbnQuZUlzUHJveHkoKSkKLQkJCQkJfHwgKGVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKQotCQkJCQl8fCBCcmlkZ2VIZWxwZXIuaXNSZWFkT25seSh2aWV3KSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlDb21tYW5kIGN1ckNvbW1hbmQgPSBlZGl0UGFydC5nZXRDb21tYW5kKHJlcXVlc3QpOwotCQkJCWlmIChjdXJDb21tYW5kID09IG51bGwgfHwgKGN1ckNvbW1hbmQuY2FuRXhlY3V0ZSgpID09IGZhbHNlKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vcmV0dXJuIHN1cGVyLmNhbGN1bGF0ZUVuYWJsZWQoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQkJTGlzdCBsaXN0ID0gZ2V0U2VsZWN0ZWRPYmplY3RzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFZGl0UGFydCBlbGVtZW50ID0gKEVkaXRQYXJ0KSBpdGVyLm5leHQoKTsKLQkJCVZpZXcgdmlldyA9IChWaWV3KWVsZW1lbnQuZ2V0TW9kZWwoKTsKLQkJCWlmKEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KHZpZXcpKXsKLQkJCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzRW5hYmxlZCgpOwotCX0KLQkKLQkKLQkKLQlwcm90ZWN0ZWQgUmVxdWVzdCBjcmVhdGVUYXJnZXRSZXF1ZXN0KCkgewotCQlyZXR1cm4gCW5ldyBFZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLCBmYWxzZSkpOwotCX0KLQkKLQkgLyoqCi0gICAgICogR2V0cyBlZGl0aW5nIGRvbWFpbgotICAgICAqIAotICAgICAqIEByZXR1cm4gbXkgZWRpdGluZyBkb21haW4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLSAgICAgICAgCi0gICAgICAgIC8vIHRyeSBhZGFwdGluZyB0aGUgd29ya2JlbmNoIHBhcnQKLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgcGFydCA9IGdldFdvcmtiZW5jaFBhcnQoKTsKLQotICAgICAgICBpZiAocGFydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJRWRpdGluZ0RvbWFpblByb3ZpZGVyIGVkUHJvdmlkZXIgPSAoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgcGFydAotICAgICAgICAgICAgICAgIC5nZXRBZGFwdGVyKElFZGl0aW5nRG9tYWluUHJvdmlkZXIuY2xhc3MpOwotCi0gICAgICAgICAgICBpZiAoZWRQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAJRWRpdGluZ0RvbWFpbiBkb21haW4gPSBlZFByb3ZpZGVyLmdldEVkaXRpbmdEb21haW4oKTsKLSAgICAgICAgICAgIAkKLSAgICAgICAgICAgIAlpZiAoZG9tYWluIGluc3RhbmNlb2YgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4pIHsKLSAgICAgICAgICAgIAkJcmV0dXJuIChUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbikgZG9tYWluOwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJlcXVlc3QgZ2V0VGFyZ2V0UmVxdWVzdCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gc3VwZXIuZ2V0VGFyZ2V0UmVxdWVzdCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93SW5Db250ZXh0TWVudSgpewotCQlMaXN0IG9wZXJhdGlvblNldCA9IGdldE9wZXJhdGlvblNldCgpOwotCQlpZiAob3BlcmF0aW9uU2V0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVJlcXVlc3QgcmVxdWVzdCA9IGdldFRhcmdldFJlcXVlc3QoKTsKLQkJSXRlcmF0b3IgZWRpdFBhcnRzID0gb3BlcmF0aW9uU2V0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlZGl0UGFydHMuaGFzTmV4dCgpKSB7Ci0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLm5leHQoKTsKLQkJCS8vIGRpc2FibGUgb24gZGlhZ3JhbSBsaW5rcyAKLQkJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCUlHcmFwaGljYWxFZGl0UGFydCBnRWRpdFBhcnQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydDsKLQkJCQlWaWV3IHZpZXcgPSAoVmlldykgZ0VkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudCh2aWV3KTsKLQkJCQlpZiAoKGVsZW1lbnQuZUlzUHJveHkoKSkKLQkJCQkJfHwgKGVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlDb21tYW5kIGN1ckNvbW1hbmQgPSBlZGl0UGFydC5nZXRDb21tYW5kKHJlcXVlc3QpOwotCQkJCWlmIChjdXJDb21tYW5kID09IG51bGwgfHwgKGN1ckNvbW1hbmQuY2FuRXhlY3V0ZSgpID09IGZhbHNlKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkvL3JldHVybiBzdXBlci5nZXRDb21tYW5kKHJlcXVlc3QpOwotCQlMaXN0IG9wZXJhdGlvblNldCA9IGdldE9wZXJhdGlvblNldCgpOwotCQlJdGVyYXRvciBlZGl0UGFydHMgPSBvcGVyYXRpb25TZXQuaXRlcmF0b3IoKTsKLQkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY29tbWFuZCA9Ci0JCQluZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBnZXRDb21tYW5kTGFiZWwoKSk7Ci0JCXdoaWxlIChlZGl0UGFydHMuaGFzTmV4dCgpKSB7Ci0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLm5leHQoKTsKLQkJCS8vIGRpc2FibGUgb24gZGlhZ3JhbSBsaW5rcyAKLQkJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCl7Ci0JCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IGdFZGl0UGFydCA9IAotCQkJCQkoSUdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydDsKLQkJCQlWaWV3IHZpZXcgPSAoVmlldylnRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KHZpZXcpOwotCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCUNvbW1hbmQgY3VyQ29tbWFuZCA9IG51bGw7Ci0JCQlpZihlZGl0UGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCAmJiBpc0Nhbm9uaWNhbCgoSUdyYXBoaWNhbEVkaXRQYXJ0KWVkaXRQYXJ0KSl7Ci0JCQkJY3VyQ29tbWFuZCA9IGVkaXRQYXJ0LmdldENvbW1hbmQocmVxdWVzdCk7Ci0JCQl9ZWxzZXsKLQkJCQljdXJDb21tYW5kID0gZWRpdFBhcnQuZ2V0Q29tbWFuZChnZXRTZWNvbmRhcnlUYXJnZXRSZXF1ZXN0KCkpOwotCQkJfQotCQkJaWYgKGN1ckNvbW1hbmQgIT0gbnVsbCkgewotCQkJCWNvbW1hbmQuY29tcG9zZShuZXcgQ29tbWFuZFByb3h5KGN1ckNvbW1hbmQpKTsJCQkJCi0JCQl9Ci0JCX0KLQkJCi0JCWlmICgoY29tbWFuZC5pc0VtcHR5KCkpCi0JCQl8fCAoY29tbWFuZC5zaXplKCkgIT0gb3BlcmF0aW9uU2V0LnNpemUoKSkpewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBJQ29tbWFuZFByb3h5KGNvbW1hbmQpOwotCX0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1J1bihJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQkKLQkJTGlzdCBvcGVyYXRpb25TZXQgPSBnZXRPcGVyYXRpb25TZXQoKTsKLQkJTGlzdDxCcmVha2Rvd25FbGVtZW50PiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8QnJlYWtkb3duRWxlbWVudD4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb3BlcmF0aW9uU2V0Lml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVkaXRQYXJ0ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBFZGl0UGFydCkgewotCQkJCU9iamVjdCBvYmogPSAoKEVkaXRQYXJ0KSBlZGl0UGFydCkuZ2V0TW9kZWwoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCgoTm9kZSlvYmopOwotCQkJCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQllbGVtZW50cy5hZGQoKEJyZWFrZG93bkVsZW1lbnQpZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCVByb2Nlc3NEZWxldGVBY3Rpb24gZGVsZXRlQWN0aW9uID0gbmV3IFByb2Nlc3NEZWxldGVBY3Rpb24oKSB7Ci0JCQkJLyoKLQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJICogCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbiNjcmVhdGVDb21tYW5kKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCQkJCSAqLwotCQkJCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCBjcmVhdGVDb21tYW5kKAotCQkJCQkJQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQkJZG9tYWluID0gbnVsbDsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCQkJZG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbigKLQkJCQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChkb21haW4gPT0gbnVsbCkgewotCQkJCQkJZG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbigKLQkJCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCkpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5jcmVhdGVDb21tYW5kKHNlbGVjdGlvbik7Ci0JCQkJfQotCi0JCQl9OwotCQkJZGVsZXRlQWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJZWxlbWVudHMpKTsKLQkJCWRlbGV0ZUFjdGlvbi5ydW4oKTsKLQkJCWlmIChkZWxldGVBY3Rpb24uaXNEZWxldGlvbkNvbmZpcm1lZCgpKSB7Ci0JCQkJc3VwZXIuZG9SdW4ocHJvZ3Jlc3NNb25pdG9yKTsKLQotCQkJCS8vIHNhdmUgdGhlIGVkaXRvcgotCQkJCS8vIAotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFdvcmtiZW5jaFBhcnQoKS5nZXRTaXRlKCkuZ2V0U2hlbGwoKQotCQkJCQkJLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCSgoQWJzdHJhY3REaWFncmFtRWRpdG9yKWdldFdvcmtiZW5jaFBhcnQoKSkuZG9TYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmRvUnVuKHByb2dyZXNzTW9uaXRvcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQlzZXRJZChBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpKTsKLQkJc2V0VGV4dChEaWFncmFtQ29yZVJlc291cmNlcy5kZWxldGVDb21tYW5kX2xhYmVsKTsKLQkJc2V0VG9vbFRpcFRleHQoRGlhZ3JhbUNvcmVSZXNvdXJjZXMuZGVsZXRlQ29tbWFuZF9sYWJlbCk7Ci0JCUlTaGFyZWRJbWFnZXMgd29ya2JlbmNoSW1hZ2VzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKTsKLQkJc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoCi0JCQl3b3JrYmVuY2hJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCUlTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFKSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcigKLQkJCXdvcmtiZW5jaEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ERUxFVEUpKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoCi0JCQl3b3JrYmVuY2hJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCUlTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFX0RJU0FCTEVEKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZU9wZXJhdGlvblNldCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gc3VwZXIuY3JlYXRlT3BlcmF0aW9uU2V0KCk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBnZXAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ2Fub25pY2FsKElHcmFwaGljYWxFZGl0UGFydCBnZXApIHsKLQkJRWRpdFBhcnQgcGFyZW50ID0gZ2VwLmdldFBhcmVudCgpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSUdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQlDYW5vbmljYWxFZGl0UG9saWN5IGNlcCA9IChDYW5vbmljYWxFZGl0UG9saWN5KXBhcmVudC5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSk7Ci0JCQlpZiAoIGNlcCAhPSBudWxsICkgewotCQkJCWlmIChjZXAuaXNFbmFibGVkKCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIFJlcXVlc3QgZ2V0U2Vjb25kYXJ5VGFyZ2V0UmVxdWVzdCgpewotCQlpZihzZWNvbmRhcnlUYXJnZXRSZXF1ZXN0ID09IG51bGwpewotCQkJc2Vjb25kYXJ5VGFyZ2V0UmVxdWVzdCA9IG5ldyBHcm91cFJlcXVlc3QoCi0JCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RFTEVURSk7Ci0JCX0KLQkJcmV0dXJuIHNlY29uZGFyeVRhcmdldFJlcXVlc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0RlbGV0ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0RlbGV0ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGU4NDZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9EZWxldGVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkRpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlRGlhZ3JhbUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuUHJvY2Vzc0RlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Hcm91cFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5Db21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0KLS8qKgotICogUmVwbGFjZXMgdGhlIGRlZmF1bHQgdGhlIERlbGV0ZSBmcm9tIE1vZGVsIGFuZCBEZWxldGUgZnJvbSBEaWFncmFtIGFjdGlvbnMgb2YgR01GLgotICogRGVsZXRlIHRoZSBkaWFncmFtIGVsZW1lbnQgYW5kIGl0cyBhc3NvY2lhdGVkIGRpYWdyYW0gYW5kIHJlZmVyZW5jZXMuIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpLgotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlRWxlbWVudEFjdGlvbkRlbGVnYXRlIGV4dGVuZHMgQWN0aW9uRGVsZWdhdGUgewotCi0JcHVibGljIERlbGV0ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JcHVibGljIERlbGV0ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZShJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQlzdXBlcihhY3Rpb24sIHRhcmdldFBhcnQpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29tbWFuZCgpIHsKLQkJdGFyZ2V0UmVxdWVzdCA9IG51bGw7Ci0JCVJlcXVlc3QgcmVxdWVzdCA9IGdldFRhcmdldFJlcXVlc3QoKTsKLQkJSXRlcmF0b3I8RWRpdFBhcnQ+IGVkaXRQYXJ0cyA9IHNlbGVjdGVkUGFydHMuaXRlcmF0b3IoKTsKLQkJCi0JCUxpc3Q8QWN0aXZpdHk+IGFjdGl2aXRpZXMgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5PigpOwotCQkKLQkJCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyB0YXJnZXRQcm9jZXNzID0gZ2V0T3duaW5nUHJvY2VzcygpOwotCQkKLQkJLy8gRGVsZXRlIHRoZSBkaWFncmFtIGVsZW1lbnQgYW5kIGRpYWdyYW0gbW9kZWwuCi0JCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNvbW1hbmQgPQotCQkJbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgRGlhZ3JhbUNvcmVSZXNvdXJjZXMuZGVsZXRlQ29tbWFuZF9sYWJlbCl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCQkJSXRlcmF0b3I8RWRpdFBhcnQ+IGVkaXRQYXJ0cyA9IHNlbGVjdGVkUGFydHMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoZWRpdFBhcnRzLmhhc05leHQoKSkgewotCQkJCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLm5leHQoKTsKLQkJCQkJLy8gZGlzYWJsZSBvbiBkaWFncmFtIGxpbmtzIAotCQkJCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCQkJCUlHcmFwaGljYWxFZGl0UGFydCBnRWRpdFBhcnQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydDsKLQkJCQkJCVZpZXcgdmlldyA9IChWaWV3KSBnRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJCUVPYmplY3QgZWxlbWVudCA9IFZpZXdVdGlsLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQodmlldyk7Ci0JCQkJCQlpZiAodmlldyBpbnN0YW5jZW9mIERpYWdyYW0gfHwgZWxlbWVudCBpbnN0YW5jZW9mIERpYWdyYW0pCi0JCQkJCQkJY29udGludWU7Ci0KLQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KHZpZXcpOwotCQkJCQkJaWYgKGUgIT0gbnVsbCAmJiBlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX07Ci0JCXdoaWxlIChlZGl0UGFydHMuaGFzTmV4dCgpKSB7Ci0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLm5leHQoKTsKLQkJCS8vIGRpc2FibGUgb24gZGlhZ3JhbSBsaW5rcyAKLQkJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCUlHcmFwaGljYWxFZGl0UGFydCBnRWRpdFBhcnQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydDsKLQkJCQlWaWV3IHZpZXcgPSAoVmlldykgZ0VkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudCh2aWV3KTsKLQkJCQlpZiAodmlldyBpbnN0YW5jZW9mIERpYWdyYW0gfHwgZWxlbWVudCBpbnN0YW5jZW9mIERpYWdyYW0pCi0JCQkJCXJldHVybiBudWxsOwotCi0JCQkJTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQodmlldyk7Ci0JCQkJaWYgKGUgIT0gbnVsbCAmJiBlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJYWN0aXZpdGllcy5hZGQoKEFjdGl2aXR5KSBlKTsKLQkJCQl9Ci0KLQkJCQlDb21tYW5kIGN1ckNvbW1hbmQgPSBudWxsOwotCQkJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydAotCQkJCQkJJiYgaXNDYW5vbmljYWwoKElHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnQpKSB7Ci0JCQkJCWN1ckNvbW1hbmQgPSBlZGl0UGFydC5nZXRDb21tYW5kKHJlcXVlc3QpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN1ckNvbW1hbmQgPSBlZGl0UGFydAotCQkJCQkJCS5nZXRDb21tYW5kKGdldFNlY29uZGFyeVRhcmdldFJlcXVlc3QoKSk7Ci0JCQkJfQotCQkJCWlmKGN1ckNvbW1hbmQgPT0gbnVsbCAmJiBpc0RpYWdyYW1VSU9iamVjdCh2aWV3KSl7Ci0JCQkJCWN1ckNvbW1hbmQgPSBlZGl0UGFydAotCQkJCQkuZ2V0Q29tbWFuZChnZXRTZWNvbmRhcnlUYXJnZXRSZXF1ZXN0KCkpOwotCQkJCX0KLQkJCQlpZiAoY3VyQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJCWNvbW1hbmQuY29tcG9zZShuZXcgQ29tbWFuZFByb3h5KGN1ckNvbW1hbmQpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKChjb21tYW5kLmlzRW1wdHkoKSkKLQkJCXx8IChjb21tYW5kLnNpemUoKSAhPSBzZWxlY3RlZFBhcnRzLnNpemUoKSkpewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gRGVsZXRlIHRoZSByZWxhdGVkIGRpYWdyYW0gb2YgZGVsZXRlZCBBY3Rpdml0eQotCQlpZighYWN0aXZpdGllcy5pc0VtcHR5KCkpewotCQkJbmV3IERlbGV0ZURpYWdyYW1Db21tYW5kKGFjdGl2aXRpZXMsIHRhcmdldFByb2Nlc3MpLmV4ZWN1dGUoKTsKLQkJfQotCQlyZXR1cm4gbmV3IElDb21tYW5kUHJveHkoY29tbWFuZCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRGlhZ3JhbVVJT2JqZWN0KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5nZXRFbGVtZW50KCkgPT0gbnVsbDsKLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJlcXVlc3QgY3JlYXRlVGFyZ2V0UmVxdWVzdCgpIHsKLQkJcmV0dXJuIAluZXcgRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwgZmFsc2UpKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChhY3Rpb24sIHNlbGVjdGlvbik7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGVkUGFydHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFZGl0UGFydCBlbGVtZW50ID0gKEVkaXRQYXJ0KSBpdGVyLm5leHQoKTsKLQkJCVZpZXcgdmlldyA9IChWaWV3KWVsZW1lbnQuZ2V0TW9kZWwoKTsKLQkJCWlmKHZpZXcuZ2V0RWxlbWVudCgpID09IG51bGwpIHsKLQkJCQkvLyB0aGlzIHZpZXcgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgbW9kZWwKLQkJCQkvLyBpdCBjYW4gYmUgZGVsZXRlZAotCQkJCS8vCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZih2aWV3IGluc3RhbmNlb2YgRGlhZ3JhbSAKLQkJCQkJfHwgQnJpZGdlSGVscGVyLmlzUmVhZE9ubHkodmlldykKLQkJCQkJfHwgVG5nVXRpbC5pc0xvY2tlZChnZXRPd25pbmdQcm9jZXNzKCkpCi0JCQkJCXx8ICh2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdCAmJiAKLQkJCQkJCQl2aWV3LmdldERpYWdyYW0oKS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pCi0JCQkJCXx8IChCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCh2aWV3KSAhPSBudWxsICYmCi0JCQkJCQkJQnJpZGdlSGVscGVyLmlzSW5oZXJpdGVkKHZpZXcpKQotCQkJCQkJCSkgewotCQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmKHZpZXcgaW5zdGFuY2VvZiBFZGdlKXsKLQkJCQlpZihEaWFncmFtQ29yZVZhbGlkYXRpb24uY2hlY2tEZWxldGUoKEVkZ2UpdmlldykgIT0gbnVsbCl7Ci0JCQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYoIWlzRW5hYmxlZCgpKSByZXR1cm47Ci0JCUxpc3Q8QnJlYWtkb3duRWxlbWVudD4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PEJyZWFrZG93bkVsZW1lbnQ+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGVkUGFydHMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWRpdFBhcnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkJT2JqZWN0IG9iaiA9ICgoRWRpdFBhcnQpIGVkaXRQYXJ0KS5nZXRNb2RlbCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KChOb2RlKW9iaik7Ci0JCQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCWVsZW1lbnRzLmFkZCgoQnJlYWtkb3duRWxlbWVudCllbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJUHJvY2Vzc0RlbGV0ZUFjdGlvbiBkZWxldGVBY3Rpb24gPSBuZXcgUHJvY2Vzc0RlbGV0ZUFjdGlvbigpIHsKLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JCQkJICovCi0JCQkJcHVibGljIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kIGNyZWF0ZUNvbW1hbmQoCi0JCQkJCQlDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCQlkb21haW4gPSBudWxsOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCQlkb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQluZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGRvbWFpbiA9PSBudWxsKSB7Ci0JCQkJCQlkb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQluZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbW1hbmQoc2VsZWN0aW9uKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCQlkZWxldGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQllbGVtZW50cykpOwotCQkJZGVsZXRlQWN0aW9uLnJ1bigpOwotCQkJaWYgKGRlbGV0ZUFjdGlvbi5pc0RlbGV0aW9uQ29uZmlybWVkKCkpIHsKLQkJCQlzdXBlci5ydW4oYWN0aW9uKTsKLQotCQkJCS8vIHNhdmUgdGhlIGVkaXRvcgotCQkJCS8vIAotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKHRhcmdldFBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCkKLQkJCQkJCS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcil0YXJnZXRQYXJ0KS5kb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCQlpZihnZXREaWFncmFtQ29tbWFuZFN0YWNrKCkgIT0gbnVsbCl7Ci0JCQkJCQkJZ2V0RGlhZ3JhbUNvbW1hbmRTdGFjaygpLmZsdXNoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQl9IGVsc2UgewotCQkJc3VwZXIucnVuKGFjdGlvbik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGdlcAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDYW5vbmljYWwoSUdyYXBoaWNhbEVkaXRQYXJ0IGdlcCkgewotCQlFZGl0UGFydCBwYXJlbnQgPSBnZXAuZ2V0UGFyZW50KCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCUNhbm9uaWNhbEVkaXRQb2xpY3kgY2VwID0gKENhbm9uaWNhbEVkaXRQb2xpY3kpcGFyZW50LmdldEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFKTsKLQkJCWlmICggY2VwICE9IG51bGwgKSB7Ci0JCQkJaWYgKGNlcC5pc0VuYWJsZWQoKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgUmVxdWVzdCBnZXRTZWNvbmRhcnlUYXJnZXRSZXF1ZXN0KCl7Ci0JCWlmKHNlY29uZGFyeVRhcmdldFJlcXVlc3QgPT0gbnVsbCl7Ci0JCQlzZWNvbmRhcnlUYXJnZXRSZXF1ZXN0ID0gbmV3IEdyb3VwUmVxdWVzdCgKLQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfREVMRVRFKTsKLQkJfQotCQlyZXR1cm4gc2Vjb25kYXJ5VGFyZ2V0UmVxdWVzdDsKLQl9Ci0JcHJpdmF0ZSBSZXF1ZXN0IHNlY29uZGFyeVRhcmdldFJlcXVlc3Q7Ci0JCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgZ2V0T3duaW5nUHJvY2VzcygpewotCQlpZih0YXJnZXRQYXJ0ICE9IG51bGwpewotCQkJRGlhZ3JhbSBkID0gKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpdGFyZ2V0UGFydCkuZ2V0RGlhZ3JhbSgpOwotCQkJRGlhZ3JhbUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXREaWFncmFtQWRhcHRlcihkLmdldEVsZW1lbnQoKSk7Ci0JCQlpZihhZGFwdGVyICE9IG51bGwpewotCQkJCXJldHVybiBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWRhcHRlci5nZXRBY3Rpdml0eSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYmY3MDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0RpYWdyYW1BY3Rpb25zU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5pbXBsLkludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkNoYW5nZUJvdW5kc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5jb21tYW5kcy5SZWNvbm5lY3RMaW5rQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5HRUZBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLkFjdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db25uZWN0aW9uTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLQotLyoqCi0gKiBTZXJ2aWNlIGNsYXNzIHRvIGFsbG93IGNyZWF0ZSBhbmQgcmVnaXN0ZXIgY29tbW9uIGFjdGlvbnMgdG8gdGhlIGFjdGlvbgotICogcmVnaXN0ZXIuIENvZGUgaXMgbWlncmF0ZSBmcm9tIG9sZCBtZXRob2Qgb2YgZGlhZ3JhbW1pbmcuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOX0hPUlpfQVZFUkFHRSA9ICJhbGlnbl9ob3Jpem9udGFsX3RvX2F2ZXJhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9IT1JaX0ZJUlNUX1NFTEVDVEVEID0gImFsaWduX2hvcml6b250YWxfdG9fZmlyc3Rfc2VsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fVkVSVF9BVkVSQUdFID0gImFsaWduX3ZlcnRpY2FsX3RvX2F2ZXJhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEID0gImFsaWduX3ZlcnRpY2FsX3RvX2ZpcnN0X3NlbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRGVmYXVsdEVkaXREb21haW4gZWRpdERvbWFpbjsKLQotCXByaXZhdGUgR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlcjsKLQotCXByaXZhdGUgQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnk7Ci0JCi0JcHJpdmF0ZSBJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRyYW5zYWN0aW9uRG9tYWluOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgCi0JICogQHBhcmFtIGdyYXBoaWNhbFZpZXdlciB7QGxpbmsgR3JhcGhpY2FsVmlld2VyfQotCSAqIEBwYXJhbSBlZGl0RG9tYWluIAl7QGxpbmsgRGVmYXVsdEVkaXREb21haW59Ci0JICogQHBhcmFtIGFjdGlvblJlZ2lzdHJ5IAl7QGxpbmsgQWN0aW9uUmVnaXN0cnl9Ci0JICovCi0JcHVibGljIERpYWdyYW1BY3Rpb25zU2VydmljZShJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRyYW5zYWN0aW9uRG9tYWluLCBHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyLAotCQkJRGVmYXVsdEVkaXREb21haW4gZWRpdERvbWFpbiwgQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnkpIHsKLQkJdGhpcy50cmFuc2FjdGlvbkRvbWFpbiA9IHRyYW5zYWN0aW9uRG9tYWluOwotCQl0aGlzLmdyYXBoaWNhbFZpZXdlciA9IGdyYXBoaWNhbFZpZXdlcjsKLQkJdGhpcy5lZGl0RG9tYWluID0gZWRpdERvbWFpbjsKLQkJdGhpcy5hY3Rpb25SZWdpc3RyeSA9IGFjdGlvblJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIEdyYXBoaWNhbFZpZXdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHcmFwaGljYWxWaWV3ZXIoR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlcikgewotCQl0aGlzLmdyYXBoaWNhbFZpZXdlciA9IGdyYXBoaWNhbFZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm5zIEdyYXBoaWNhbFZpZXdlcgotCSAqLwotCXByaXZhdGUgR3JhcGhpY2FsVmlld2VyIGdldEdyYXBoaWNhbFZpZXdlcigpIHsKLQkJcmV0dXJuIGdyYXBoaWNhbFZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb21tYW5kIHN0YWNrLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbW1hbmQgc3RhY2sKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZFN0YWNrIGdldENvbW1hbmRTdGFjaygpIHsKLQkJcmV0dXJuIGdldEVkaXREb21haW4oKS5nZXRDb21tYW5kU3RhY2soKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlZGl0IGRvbWFpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlZGl0IGRvbWFpbgotCSAqLwotCXByb3RlY3RlZCBEZWZhdWx0RWRpdERvbWFpbiBnZXRFZGl0RG9tYWluKCkgewotCQlyZXR1cm4gZWRpdERvbWFpbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWN0aW9uUmVnaXN0cnkgZ2V0QWN0aW9uUmVnaXN0cnkoKSB7Ci0JCXJldHVybiBhY3Rpb25SZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlciBIb3Jpem9udGFsQWxpZ25BdmVyYWdlQWN0aW9uIGFjdGlvbi4gCi0JICogSG9yaXpvbnRhbEFpZ25BdmVyYWdlIEFjdGlvbiBhbGlnbnMgc2VsZWN0ZWQgZWRpdHBhcnRzIHRvIGhvcml6b250YWwgYXZlcmFnZS4gIAotCSAqLwotCXB1YmxpYyBJQWN0aW9uIHJlZ2lzdGVySG9yaXpvbnRhbEFsaWduQXZlcmFnZUFjdGlvbigpIHsKLQkJLy8gYWxpZ24gaG9yaXpvbnRhbGx5IHRvIGF2ZXJhZ2UgeS12YWx1ZSBvZiBhbGwgbm9kZXMKLQkJSUFjdGlvbiBoQWxpZ25BdmVyYWdlQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlob3JpekFsaWduVG9BdmVyYWdlU2VsZWN0ZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fSE9SWl9BVkVSQUdFOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGhBbGlnbkF2ZXJhZ2VBY3Rpb24pOwotCi0JCXJldHVybiBoQWxpZ25BdmVyYWdlQWN0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZWdpc3RlciBIb3Jpem9udGFsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uIGFjdGlvbi4gCi0JICogSG9yaXpvbnRhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbiBhbGlnbnMgc2VsZWN0ZWQgZWRpdHBhcnRzIHdpdGggCi0JICogcmVzcGVjdCB0byBmaXJzdCBzZWxlY3RlZCBlZGl0cGFydC4gCi0JICovCi0KLQlwdWJsaWMgSUFjdGlvbiByZWdpc3Rlckhvcml6b250YWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKSB7Ci0JCS8vIGFsaWduIGhvcml6b250YWxseSB0byB5LXZhbHVlIG9mIGZpcnN0IHNlbGVjdGVkIG5vZGUKLQkJSUFjdGlvbiBoQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlob3J6QWxpZ25Ub0ZpcnN0U2VsZWN0ZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fSE9SWl9GSVJTVF9TRUxFQ1RFRDsKLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihoQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKTsKLQotCQlyZXR1cm4gaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXIgdmVydGlhbEFsaWduQXZlcmFnZUFjdGlvbiBhY3Rpb24uIAotCSAqIHZlcnRpYWxBbGlnbkF2ZXJhZ2VBY3Rpb24gYWxpZ25zIHNlbGVjdGVkIGVkaXRwYXJ0cyB2ZXJ0aWNhbGx5IHcuci50IGF2ZXJhZ2UuCi0JICogCi0JICovCi0JCi0JcHVibGljIElBY3Rpb24gcmVnaXN0ZXJWZXJ0aWNhbEFsaWduQXZlcmFnZUFjdGlvbigpIHsKLQkJLy8gYWxpZ24gdmVydGljYWxseSB0byBhdmVyYWdlIHgtdmFsdWUgb2YgYWxsIHNlbGVjdGVkIG5vZGVzCi0JCUlBY3Rpb24gdkFsaWduQXZlcmFnZUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdmVydGljYWxBbGlnblRvQXZlcmFnZVNlbGVjdGVkKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIEFMSUdOX1ZFUlRfQVZFUkFHRTsKLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbih2QWxpZ25BdmVyYWdlQWN0aW9uKTsKLQotCQlyZXR1cm4gdkFsaWduQXZlcmFnZUFjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlciB2ZXJ0aWFsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uIGFjdGlvbi4gCi0JICogdmVydGlhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbiBhbGlnbnMgc2VsZWN0ZWQgZWRpdHBhcnRzIHZlcnRpY2FsbHkgdy5yLnQgZmlyc3Qgc2VsZWN0ZWQuCi0JICogCi0JICovCi0KLQlwdWJsaWMgSUFjdGlvbiByZWdpc3RlclZlcnRpY2FsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKCkgewotCQkvLyBhbGlnbiB2ZXJ0aWNhbGx5IHRvIHgtdmFsdWUgb2YgZmlyc3Qgc2VsZWN0ZWQgbm9kZQotCQlJQWN0aW9uIHZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXZlcnRpY2FsQWxpZ25Ub0ZpcnN0U2VsZWN0ZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fVkVSVF9GSVJTVF9TRUxFQ1RFRDsKLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbih2QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKTsKLQotCQlyZXR1cm4gdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbjsKLQl9Ci0KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8gYWN0aW9uIG1ldGhvZHMKLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCi0JLyoqIAotCSAqIEFjdGlvbiBpbXBsZW1lbnRhdGlvbiBtZXRob2QgZm9yIGhvcml6b250YWxBbGlnbkZpcnN0ZVNFbGVjdGVkQWN0aW9uLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGhvcnpBbGlnblRvRmlyc3RTZWxlY3RlZCgpIHsKLQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGZpcnN0UGFydCA9IG51bGw7Ci0JCS8vIGxvb3AgdGhyb3VnaCBhbGwgc2VsZWN0ZWQgaXRlbXMsIHJlbWVtYmVyIHRoZSB5LXZhbHVlIG9mIHRoZQotCQkvLyBmaXJzdCBub2RlLAotCQkvLyBzZXQgdGhlIGZvbGxvd2luZyBub2RlcyB0byB0aGUgc2FtZSB5LXZhbHVlCi0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIFNoYXBlTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJLy8gcmVtZW1iZXIgdGhlIGZpcnN0IHBhcnQgd2UgbW92ZQotCQkJCWlmIChmaXJzdFBhcnQgPT0gbnVsbCkgewotCQkJCQlmaXJzdFBhcnQgPSBlcDsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBjYWxjdWxhdGUgdGhlIG9mZnNldCBmb3IgY2VudGVybGluZSBhbGlnbm1lbnQKLQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQlpbnQgb2Zmc2V0ID0gKGludCkgKChkb3VibGUpIChib3VuZHMuaGVpZ2h0IC0gZmlyc3RQYXJ0Ci0JCQkJCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmhlaWdodCkgLyAyLjApOwotCQkJCQkvLyBpcyB0aGlzIG5vZGUgaW4gYSBjb250YWluZXI/Ci0JCQkJCWlmICghKGVwLmdldFBhcmVudCgpIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSkgewotCQkJCQkJLy8gbmVlZCB0byBtb3ZlIHRoZSBjb250YWluZXIsIGFkanVzdCB0aGUgb2Zmc2V0Ci0JCQkJCQllcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlcC5nZXRQYXJlbnQoKTsKLQkJCQkJCVJlY3RhbmdsZSBwYXJlbnRCb3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkJCW9mZnNldCArPSBib3VuZHMueSAtIHBhcmVudEJvdW5kcy55OwotCQkJCQkJYm91bmRzID0gcGFyZW50Qm91bmRzOwotCQkJCQl9Ci0JCQkJCS8vIHNlbmQgdGhlIGNvbW1hbmQgdG8gbW92ZSB0aGUgbm9kZQotCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQodHJhbnNhY3Rpb25Eb21haW4sCi0JCQkJCQkJKE5vZGUpIGVwLmdldE1vZGVsKCksIG5ldyBQb2ludChib3VuZHMueCwgZmlyc3RQYXJ0Ci0JCQkJCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueQotCQkJCQkJCQkJLSBvZmZzZXQpLCBib3VuZHMud2lkdGgsIC0xKTsKLQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqIAotCSAqIEFjdGlvbiBpbXBsZW1lbnRhdGlvbiBtZXRob2QgZm9yIGhvcml6b250YWxBbGlnbkF2ZXJhZ2VBY3Rpb24uCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgaG9yaXpBbGlnblRvQXZlcmFnZVNlbGVjdGVkKCkgewotCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZmlyc3RQYXJ0ID0gbnVsbDsKLQkJaW50IHRvdGFsID0gMDsKLQkJaW50IHlzdW0gPSAwOwotCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJaWYgKGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBTaGFwZU5vZGVFZGl0UGFydCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkuZ2V0KGEpOwotCQkJCS8vIHJlbWVtYmVyIHRoZSBmaXJzdCBwYXJ0IHdlIG1vdmUKLQkJCQlpZiAoZmlyc3RQYXJ0ID09IG51bGwpIHsKLQkJCQkJZmlyc3RQYXJ0ID0gZXA7Ci0JCQkJfQotCQkJCXlzdW0gKz0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueTsKLQkJCQl0b3RhbCsrOwotCQkJfQotCQl9Ci0JCS8vIGNhbGN1bGF0ZSB0aGUgYXZlcmFnZSB5LXZhbHVlIGZvciBhbGwgbm9kZXMKLQkJaW50IHlhdmUgPSAoaW50KSAoKGRvdWJsZSkgeXN1bSAvIChkb3VibGUpIHRvdGFsKTsKLQkJLy8gbG9vcCB0aHJvdWdoIGFsbCB0aGUgbm9kZXMgYWdhaW4gYW5kIHNldCB0aGVtCi0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIFNoYXBlTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJLy8gY2FsY3VsYXRlIHRoZSBoZWlnaHQgZGlmZmVyZW5jZSwgc28gdGhhdCBlbGVtZW50cyBhcmUgYWxpZ25lZAotCQkJCS8vIHRocm91Z2ggdGhlIGNlbnRlcmxpbmUKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJaW50IG9mZnNldCA9IChpbnQpICgoZG91YmxlKSAoYm91bmRzLmhlaWdodCAtIGZpcnN0UGFydAotCQkJCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmhlaWdodCkgLyAyLjApOwotCQkJCS8vIGlzIHRoaXMgbm9kZSBpbnNpZGUgYSBjb250YWluZXI/Ci0JCQkJaWYgKCEoZXAuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpKSB7Ci0JCQkJCS8vIHdlIG5lZWQgdG8gbW92ZSB0aGUgY29udGFpbmVyLCBhZGp1c3QgdGhlIG9mZnNldAotCQkJCQllcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlcC5nZXRQYXJlbnQoKTsKLQkJCQkJUmVjdGFuZ2xlIHBhcmVudEJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQlvZmZzZXQgKz0gYm91bmRzLnkgLSBwYXJlbnRCb3VuZHMueTsKLQkJCQkJYm91bmRzID0gcGFyZW50Qm91bmRzOwotCQkJCX0KLQkJCQkvLyBzZW5kIHRoZSBjb21tYW5kIHRvIG1vdmUgdGhlIG5vZGUKLQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQodHJhbnNhY3Rpb25Eb21haW4sCi0JCQkJCQkoTm9kZSkgZXAuZ2V0TW9kZWwoKSwKLQkJCQkJCW5ldyBQb2ludChib3VuZHMueCwgeWF2ZSAtIG9mZnNldCksIGJvdW5kcy53aWR0aCwgLTEpOwotCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQl9Ci0JCX0KLQotCX0KLQkvKiogCi0JICogQWN0aW9uIGltcGxlbWVudGF0aW9uIG1ldGhvZCBmb3IgdmVydGljYWxBbGlnblRvQXZlcmFnZUFjdGlvbi4KLQkgKiAKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHZlcnRpY2FsQWxpZ25Ub0F2ZXJhZ2VTZWxlY3RlZCgpIHsKLQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGZpcnN0UGFydCA9IG51bGw7Ci0JCWludCB0b3RhbCA9IDA7Ci0JCWludCB4c3VtID0gMDsKLQkJLy8gbG9vcCB0aHJvdWdoIHRoZSBzZWxlY3RlZCBwYXJ0cwotCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJLy8gd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBub2RlcyBhbmQgY29udGFpbmVycwotCQkJaWYgKGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBTaGFwZU5vZGVFZGl0UGFydCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkuZ2V0KGEpOwotCQkJCWlmIChmaXJzdFBhcnQgPT0gbnVsbCkgewotCQkJCQlmaXJzdFBhcnQgPSBlcDsKLQkJCQl9Ci0JCQkJLy8gc3VtIHRoZSB4IGNvb3JkaW5hdGVzIG9mIGVhY2ggZWxlbWVudAotCQkJCXhzdW0gKz0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueDsKLQkJCQkvLyByZW1lbWJlciBob3cgbWFueSBzZWxlY3RlZCBlbGVtZW50cyBhcHBsaWVkIHRvIHRoaXMgb3BlcmF0aW9uCi0JCQkJdG90YWwrKzsKLQkJCX0KLQkJfQotCQkvLyBjYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgeC12YWx1ZSBmb3IgYWxsIG5vZGVzCi0JCWludCB4YXZlID0gKGludCkgKChkb3VibGUpIHhzdW0gLyAoZG91YmxlKSB0b3RhbCk7Ci0JCS8vIGxvb3AgdGhyb3VnaCBhbGwgdGhlIG5vZGVzIGFnYWluIGFuZCBzZXQgdGhlbQotCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJaWYgKGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBTaGFwZU5vZGVFZGl0UGFydCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkuZ2V0KGEpOwotCQkJCS8vIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZvciBjZW50ZXJsaW5lIGFsaWdubWVudAotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQlpbnQgb2Zmc2V0ID0gKGludCkgKChkb3VibGUpIChib3VuZHMud2lkdGggLSBmaXJzdFBhcnQKLQkJCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS53aWR0aCkgLyAyLjApOwotCQkJCS8vIGFyZSB3ZSBpbnNpZGUgYSBjb250YWluZXI/Ci0JCQkJaWYgKCEoZXAuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpKSB7Ci0JCQkJCS8vIGFkanVzdCB0aGUgb2Zmc2V0IHNpbmNlIHdlIGhhdmUgdG8gbW92ZSB0aGUgY29udGFpbmVyCi0JCQkJCWVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVwLmdldFBhcmVudCgpOwotCQkJCQlSZWN0YW5nbGUgcGFyZW50Qm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCW9mZnNldCArPSBib3VuZHMueCAtIHBhcmVudEJvdW5kcy54OwotCQkJCQlib3VuZHMgPSBwYXJlbnRCb3VuZHM7Ci0JCQkJfQotCQkJCS8vIHNlbmQgdGhlIGNvbW1hbmQgdG8gbW92ZSB0aGUgZWxlbWVudAotCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwKLQkJCQkJCShOb2RlKSBlcC5nZXRNb2RlbCgpLAotCQkJCQkJbmV3IFBvaW50KHhhdmUgLSBvZmZzZXQsIGJvdW5kcy55KSwgYm91bmRzLndpZHRoLCAtMSk7Ci0JCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCX0KLQkJfQotCi0JfQotCS8qKiAKLQkgKiBBY3Rpb24gaW1wbGVtZW50YXRpb24gbWV0aG9kIGZvciB2ZXJ0aWNhbEFsaWduVG9GaXJzdFNlbGVjdGVkQWN0aW9uLgotCSAqIAotCSAqLwotCi0JcHVibGljIHZvaWQgdmVydGljYWxBbGlnblRvRmlyc3RTZWxlY3RlZCgpIHsKLQkJLy8gZ2V0IHRoZSBzZWxlY3RlZCBpdGVtcwotCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgYWxpZ25Ub1BhcnQgPSBudWxsOwotCQkvLyBmaW5kIHRoZSBmaXJzdCBkaWFncmFtIHBhcnQgd2UgY2FuIGFsaWduIHRvCi0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIFNoYXBlTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJaWYgKGFsaWduVG9QYXJ0ID09IG51bGwpIHsKLQkJCQkJLy8gcmVtZW1iZXIgaXQgYW5kIHN0b3AKLQkJCQkJYWxpZ25Ub1BhcnQgPSBlcDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGxvb3AgdGhyb3VnaCB0aGUgZWxlbWVudHMgYW5kIHNldCB0aGVpciBuZXcgcG9zaXRpb24KLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgU2hhcGVOb2RlRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQkvLyB3ZSBjYW4gc2tpcCB0aGUgZmlyc3Qgb25lIHNpbmNlIHRoaXMgaXMgYW4gYWxpZ24tdG8KLQkJCQlpZiAoZXAgIT0gYWxpZ25Ub1BhcnQKLQkJCQkJCSYmICEoRGlhZ3JhbUNvcmVVdGlsLmlzU3luY0JhcihhbGlnblRvUGFydCkpKSB7Ci0JCQkJCS8vIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZvciBjZW50ZXJsaW5lIGFsaWdubWVudAotCQkJCQlpZiAoIShEaWFncmFtQ29yZVV0aWwuaXNTeW5jQmFyKGVwKSkpIHsKLQkJCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkJCWludCBvZmZzZXQgPSAoaW50KSAoKGRvdWJsZSkgKGJvdW5kcy53aWR0aCAtIGFsaWduVG9QYXJ0Ci0JCQkJCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS53aWR0aCkgLyAyLjApOwotCQkJCQkJLy8gaXMgdGhpcyBpbnNpZGUgYSBjb250YWluZXI/Ci0JCQkJCQlpZiAoIShlcC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkpIHsKLQkJCQkJCQkvLyBhZGp1c3QgdGhlIG9mZnNldCBzaW5jZSB3ZSBhcmUgbW92aW5nIHRoZQotCQkJCQkJCS8vIGNvbnRhaW5lcgotCQkJCQkJCWVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVwLmdldFBhcmVudCgpOwotCQkJCQkJCVJlY3RhbmdsZSBwYXJlbnRCb3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkJCQlvZmZzZXQgKz0gYm91bmRzLnggLSBwYXJlbnRCb3VuZHMueDsKLQkJCQkJCQlib3VuZHMgPSBwYXJlbnRCb3VuZHM7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBzZW5kIHRoZSBjb21tYW5kIHRvIG1vdmUgdGhlIGVsZW1lbnQKLQkJCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwKLQkJCQkJCQkJKE5vZGUpIGVwLmdldE1vZGVsKCksIG5ldyBQb2ludChhbGlnblRvUGFydAotCQkJCQkJCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54Ci0JCQkJCQkJCQkJLSBvZmZzZXQsIGJvdW5kcy55KSwgYm91bmRzLndpZHRoLCAtMSk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJZXAuZ2V0RmlndXJlKCkuc2V0TG9jYXRpb24oCi0JCQkJCQkJCW5ldyBQb2ludChhbGlnblRvUGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54Ci0JCQkJCQkJCQkJLSBvZmZzZXQsIGJvdW5kcy55KSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlQb2ludCB0cCA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotCQkJCQkJYm9vbGVhbiBjb25uZWN0ZWQgPSBmYWxzZTsKLQkJCQkJCWJvb2xlYW4gc291cmNlID0gZmFsc2U7Ci0JCQkJCQlQb2ludCBlbmRQb2ludCA9IG51bGw7Ci0JCQkJCQlDb25uZWN0aW9uTm9kZUVkaXRQYXJ0IGxwID0gbnVsbDsKLQkJCQkJCS8vIGNoZWNrIHRhcmdldCBjb25uZWN0aW9ucwotCQkJCQkJTGlzdCBsaXN0ID0gKChTaGFwZU5vZGVFZGl0UGFydCkgZXApLmdldFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCWxwID0gKENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQpIGl0b3IubmV4dCgpOwotCQkJCQkJCWlmIChscC5nZXRTb3VyY2UoKS5lcXVhbHMoYWxpZ25Ub1BhcnQpKSB7Ci0JCQkJCQkJCWNvbm5lY3RlZCA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIGNoZWNrIHNvdXJjZSBjb25uZWN0aW9ucyBpZiBub3QgZm91bmQgaW4gdGFyZ2V0IGNvbm5lY3Rpb25zCi0JCQkJCQlpZiAoIWNvbm5lY3RlZCkgewotCQkJCQkJCWxpc3QgPSAoKFNoYXBlTm9kZUVkaXRQYXJ0KSBlcCkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCWxwID0gKENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQpIGl0b3IubmV4dCgpOwotCQkJCQkJCQlpZiAobHAuZ2V0VGFyZ2V0KCkuZXF1YWxzKGFsaWduVG9QYXJ0KSkgewotCQkJCQkJCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQkJCQkJCQkJCXNvdXJjZSA9IHRydWU7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChjb25uZWN0ZWQgJiYgKGFsaWduVG9QYXJ0IGluc3RhbmNlb2YgU2hhcGVOb2RlRWRpdFBhcnQpKSB7Ci0JCQkJCQkJCQlQb2ludCBjZW50ZXJQb2ludCA9IGFsaWduVG9QYXJ0LmdldEZpZ3VyZSgpCi0JCQkJCQkJCQkJCS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTsKLQkJCQkJCQkJCWludCBkZWx0YSA9IGNlbnRlclBvaW50LnggLSB0cC54OwotCQkJCQkJCWVuZFBvaW50LnggKz0gZGVsdGE7Ci0JCQkJCQkJCQlSZWNvbm5lY3RMaW5rQ29tbWFuZCBjID0gbmV3IFJlY29ubmVjdExpbmtDb21tYW5kKHRyYW5zYWN0aW9uRG9tYWluLAotCQkJCQkJCQkJKEVkZ2UpIGxwLmdldE1vZGVsKCksIChOb2RlKSBlcC5nZXRNb2RlbCgpLAotCQkJCQkJCQkJc291cmNlKTsKLQkJCQkJCQljLnNldEVuZFBvaW50KGVuZFBvaW50KTsKLQkJCQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBJZiBmaXJzdCBzZWxlY3RlZCBlZGl0IHBhcnQgaXMgc3luY2Jhcm5vZGVlZGl0cGFydCwgbmVlZCB0bwotCQkJCS8vIGhhbmRsZSBkaWZmZXJlbnRseQotCQkJCWlmIChlcCAhPSBhbGlnblRvUGFydAotCQkJCQkJJiYgIShEaWFncmFtQ29yZVV0aWwuaXNTeW5jQmFyKGFsaWduVG9QYXJ0KSkpIHsKLQotCQkJCQlQb2ludCBzcCA9IGFsaWduVG9QYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCQkJLmdldENlbnRlcigpOwotCQkJCQlib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOwotCQkJCQkvLyBjaGVjayBpZiB0aGUgcGFydCBpcyBjb25uZWN0ZWQgdmlhIHNvdXJjZSBjb25uZWN0aW9ucwotCQkJCQlMaXN0IGxpc3QgPSAoKFNoYXBlTm9kZUVkaXRQYXJ0KSBhbGlnblRvUGFydCkKLQkJCQkJCQkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCUNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQgbHAgPSAoQ29ubmVjdGlvbk5vZGVFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAobHAuZ2V0VGFyZ2V0KCkuZXF1YWxzKGVwKSkgewotCQkJCQkJCWNvbm5lY3RlZCA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gaWYgbm90IGZvdW5kIGFib3ZlLCBjaGVjayBpZiBpdCBpcyBjb25uZWN0ZWQgdmlhIHRhcmdldCBjb25uZWN0aW9ucwotCQkJCQlpZiAoIWNvbm5lY3RlZCkgewotCQkJCQkJbGlzdCA9ICgoU2hhcGVOb2RlRWRpdFBhcnQpIGFsaWduVG9QYXJ0KQotCQkJCQkJCQkuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJQ29ubmVjdGlvbk5vZGVFZGl0UGFydCBscCA9IChDb25uZWN0aW9uTm9kZUVkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQlpZiAobHAuZ2V0U291cmNlKCkuZXF1YWxzKGVwKSkgewotCQkJCQkJCQljb25uZWN0ZWQgPSB0cnVlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKERpYWdyYW1Db3JlVXRpbC5pc1N5bmNCYXIoZXApKSB7Ci0JCQkJCQlQb2ludCBwID0gbmV3IFBvaW50KCk7Ci0JCQkJCQlwLnggPSAoKEludGVnZXIpIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoKFZpZXcpZXAuZ2V0TW9kZWwoKSwKLQkJCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkpKS5pbnRWYWx1ZSgpOwotCQkJCQkJcC55ID0gKChJbnRlZ2VyKSBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKChWaWV3KWVwLmdldE1vZGVsKCksCi0JCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsKLQkJCQkJCVBvaW50IHRwID0gcC5nZXRDb3B5KCk7Ci0JCQkJCQlQb2ludCBhbGlnblRvQ2VudGVyID0gYWxpZ25Ub1BhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7Ci0JCQkJCQlQb2ludCBjZW50ZXJQb2ludCA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotCQkJCQkJaW50IGRlbHRhID0gYWxpZ25Ub0NlbnRlci54IC0gY2VudGVyUG9pbnQueDsKLQkJCQkJCXRwLnggPSB0cC54ICsgZGVsdGE7Ci0JCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQodHJhbnNhY3Rpb25Eb21haW4sCi0JCQkJCQkJCShOb2RlKSBlcC5nZXRNb2RlbCgpLCB0cCwgZXAuZ2V0RmlndXJlKCkKLQkJCQkJCQkJCQkuZ2V0Qm91bmRzKCkud2lkdGgsIC0xKTsKLQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQllcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbihuZXcgUG9pbnQodHAueCwgdHAueSkpOwotCQkJCQl9IGVsc2UgaWYgKGVwIGluc3RhbmNlb2YgU2hhcGVOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCVBvaW50IHAgPSBuZXcgUG9pbnQoKTsKLQkJCQkJCXAueCA9ICgoSW50ZWdlcikgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSgoVmlldyllcC5nZXRNb2RlbCgpLAotCQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7Ci0JCQkJCQlwLnkgPSAoKEludGVnZXIpIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoKFZpZXcpZXAuZ2V0TW9kZWwoKSwKLQkJCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOwotCQkJCQkJUG9pbnQgdHAgPSBwLmdldENvcHkoKTsKLQkJCQkJCVBvaW50IGNlbnRlclBvaW50ID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJCQkJLmdldENlbnRlcigpOwotCQkJCQkJaW50IGRlbHRhID0gc3AueCAtIGNlbnRlclBvaW50Lng7Ci0JCQkJCQl0cC54ID0gdHAueCArIGRlbHRhOwotCQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKHRyYW5zYWN0aW9uRG9tYWluLAotCQkJCQkJCQkoTm9kZSkgZXAuZ2V0TW9kZWwoKSwgdHAsIGVwLmdldEZpZ3VyZSgpCi0JCQkJCQkJCQkJLmdldEJvdW5kcygpLndpZHRoLCAtMSk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJZXAuZ2V0RmlndXJlKCkuc2V0TG9jYXRpb24obmV3IFBvaW50KHRwLngsIHRwLnkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVBbGlnbk1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUsIGJvb2xlYW4gY2FuTW9kaWZ5KSB7Ci0JCS8vIGNyZWF0ZSBhIG5ldyBtZW51IG1hbmFnZXIgZm9yIHRoZSBjYXNjYWRpbmcgbWVudQotCQkKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gZm9ybWF0TWVudSA9IG1lbnUuZmluZChBY3Rpb25JZHMuTUVOVV9GT1JNQVQpOwotCQkKLQkJTWVudU1hbmFnZXIgYWxpZ25NZW51TWFuYWdlciA9IG51bGw7Ci0JCWlmIChhbGlnbk1lbnVNYW5hZ2VyID09IG51bGwpIHsKLQkJCWFsaWduTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dCkgeyAvLyROT04tTkxTLTEkCi0KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJCWludCB0b3RhbCA9IDA7Ci0JCQkJCS8vIGVuYWJsZSB0aGUgbWVudSBvbmx5IGlmIDIgb3IgbW9yZSBub2RlcyBvciBub2RlCi0JCQkJCS8vIGNvbnRhaW5lcnMKLQkJCQkJLy8gYXJlIHNlbGVjdGVkCi0JCQkJCUxpc3QgZWRpdFBhcnRzID0gZ3JhcGhpY2FsVmlld2VyLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJCS8vIG5lZWQgYXQgbGVhc3QgdHdvIHRoaW5ncyBzZWxlY3RlZCB0byBhbGlnbgotCQkJCQlpZiAoZWRpdFBhcnRzLnNpemUoKSA+IDEpIHsKLQkJCQkJCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQkJCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoYSk7Ci0JCQkJCQkJLy8gd2UgY2FuIGFsaWduIG5vZGVzIGFuZCBjb250YWluZXJzCi0JCQkJCQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2hhcGVOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCQkJLy8gYWRkIHVwIHRoZSBlbGVtZW50cyB3ZSBuZWVkLCB0aGVyZSBtYXkgYmUKLQkJCQkJCQkJLy8gbW9yZQotCQkJCQkJCQkvLyBlbGVtZW50cyBzZWxlY3RlZCAobGlua3MsIGV0Yy4pCi0JCQkJCQkJCXRvdGFsKys7Ci0JCQkJCQkJCWlmICh0b3RhbCA+IDEpIHsKLQkJCQkJCQkJCS8vIHdlIG9ubHkgbmVlZCB0byBrbm93IHRoZXJlIGlzIG1vcmUgdGhhbgotCQkJCQkJCQkJLy8gMSwgc28KLQkJCQkJCQkJCS8vIHdlIGNhbiBzdG9wIGhlcmUKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiB0b3RhbCA+IDE7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlpZiAoZm9ybWF0TWVudSAhPSBudWxsICYmIGZvcm1hdE1lbnUgaW5zdGFuY2VvZiBJTWVudU1hbmFnZXIgCi0JCQkJJiYgYWxpZ25NZW51TWFuYWdlci5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSAgKChJTWVudU1hbmFnZXIpZm9ybWF0TWVudSkuZmluZChBY3Rpb25JZHMuTUVOVV9BTElHTik7Ci0JCQlpZihpdGVtICE9IG51bGwgJiYgaXRlbSBpbnN0YW5jZW9mIElNZW51TWFuYWdlcil7Ci0JCQkJSU1lbnVNYW5hZ2VyIGFsaWduTWVudSA9IChJTWVudU1hbmFnZXIpaXRlbTsKLQkJCQlhbGlnbk1lbnUuYWRkKGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQkJRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlLkFMSUdOX0hPUlpfQVZFUkFHRSkpOwotCQkJCWFsaWduTWVudS5hZGQoZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCQlEaWFncmFtQWN0aW9uc1NlcnZpY2UuQUxJR05fSE9SWl9GSVJTVF9TRUxFQ1RFRCkpOwotCQkJCWFsaWduTWVudS5hZGQoZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCQlEaWFncmFtQWN0aW9uc1NlcnZpY2UuQUxJR05fVkVSVF9BVkVSQUdFKSk7Ci0JCQkJYWxpZ25NZW51LmFkZChnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQkJCURpYWdyYW1BY3Rpb25zU2VydmljZS5BTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEKSk7Ci0JCQl9Ci0JCX1lbHNlewotCQkJYWxpZ25NZW51TWFuYWdlci5hZGQoZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCURpYWdyYW1BY3Rpb25zU2VydmljZS5BTElHTl9IT1JaX0FWRVJBR0UpKTsKLQkJCWFsaWduTWVudU1hbmFnZXIuYWRkKGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQlEaWFncmFtQWN0aW9uc1NlcnZpY2UuQUxJR05fSE9SWl9GSVJTVF9TRUxFQ1RFRCkpOwotCQkJYWxpZ25NZW51TWFuYWdlci5hZGQoZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCURpYWdyYW1BY3Rpb25zU2VydmljZS5BTElHTl9WRVJUX0FWRVJBR0UpKTsKLQkJCWFsaWduTWVudU1hbmFnZXIuYWRkKGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQlEaWFncmFtQWN0aW9uc1NlcnZpY2UuQUxJR05fVkVSVF9GSVJTVF9TRUxFQ1RFRCkpOwotCQkJaWYgKGFsaWduTWVudU1hbmFnZXIuaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQkJCW5ldyBTZXBhcmF0b3IoKSk7Ci0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFsaWduTWVudU1hbmFnZXIpOwotCQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLAotCQkJCQkJCQluZXcgU2VwYXJhdG9yKCkpOwotCQkJfQotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0VkaXRvckFjdGlvbkRlbGVnYXRlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRWRpdG9yQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFmOTk3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRWRpdG9yQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuRGlhZ3JhbUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi1wdWJsaWMgY2xhc3MgRWRpdG9yQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJRWRpdG9yQWN0aW9uRGVsZWdhdGUgewotCi0JcHJvdGVjdGVkIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcjsKLQlwcm90ZWN0ZWQgTGlzdDxFZGl0UGFydD4gc2VsZWN0ZWRQYXJ0cyA9IG5ldyBBcnJheUxpc3Q8RWRpdFBhcnQ+KCk7Ci0KLQkKLQlwdWJsaWMgRWRpdG9yQWN0aW9uRGVsZWdhdGUoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24gYWN0aW9uLCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJdGhpcy50YXJnZXRFZGl0b3IgPSB0YXJnZXRFZGl0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNlbGVjdGVkUGFydHMuY2xlYXIoKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPjAKLQkJCQkJJiYgc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCXNlbGVjdGVkUGFydHMuYWRkQWxsKHN0cnVjdHVyZWRTZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBBY3Rpb25NYW5hZ2VyIGdldEFjdGlvbk1hbmFnZXIoKXsKLQkJaWYodGFyZ2V0RWRpdG9yICE9IG51bGwgJiYgdGFyZ2V0RWRpdG9yIGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKXsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9ICgoQWJzdHJhY3REaWFncmFtRWRpdG9yKXRhcmdldEVkaXRvcikuZ2V0RGlhZ3JhbSgpOwotCQkJaWYoZGlhZ3JhbSAhPSBudWxsKXsKLQkJCQlEaWFncmFtQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldERpYWdyYW1BZGFwdGVyKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCQlpZihhZGFwdGVyICE9IG51bGwpewotCQkJCQlyZXR1cm4gKEFjdGlvbk1hbmFnZXIpYWRhcHRlci5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkgLyoqCi0gICAgICogR2V0cyBlZGl0aW5nIGRvbWFpbgotICAgICAqIAotICAgICAqIEByZXR1cm4gbXkgZWRpdGluZyBkb21haW4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLSAgICAgICAgCi0gICAgICAgIC8vIHRyeSBhZGFwdGluZyB0aGUgd29ya2JlbmNoIHBhcnQKLSAgICAgICAgSUVkaXRvclBhcnQgcGFydCA9IHRhcmdldEVkaXRvcjsKLQotICAgICAgICBpZiAocGFydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJRWRpdGluZ0RvbWFpblByb3ZpZGVyIGVkUHJvdmlkZXIgPSAoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgcGFydAotICAgICAgICAgICAgICAgIC5nZXRBZGFwdGVyKElFZGl0aW5nRG9tYWluUHJvdmlkZXIuY2xhc3MpOwotCi0gICAgICAgICAgICBpZiAoZWRQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAJRWRpdGluZ0RvbWFpbiBkb21haW4gPSBlZFByb3ZpZGVyLmdldEVkaXRpbmdEb21haW4oKTsKLSAgICAgICAgICAgIAkKLSAgICAgICAgICAgIAlpZiAoZG9tYWluIGluc3RhbmNlb2YgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4pIHsKLSAgICAgICAgICAgIAkJcmV0dXJuIChUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbikgZG9tYWluOwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvUmVmcmVzaEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL1JlZnJlc2hBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAxYmI4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvUmVmcmVzaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIFJlZnJlc2ggYWN0aW9uIHJlZnJlc2hlcyB0aGUgRGlhZ3JhbUVkaXRQYXJ0LCBwZXJmb3JtcyBkZWFjdGl2YXRlIGFuZCBhY3RpdmF0ZS4gCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqLwotcHVibGljIGNsYXNzIFJlZnJlc2hBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgSURpYWdyYW1Xb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQ7Ci0KLQlwdWJsaWMgUmVmcmVzaEFjdGlvbigpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlUGFydChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQlpZih0YXJnZXRQYXJ0IGluc3RhbmNlb2YgSURpYWdyYW1Xb3JrYmVuY2hQYXJ0KSB7Ci0JCQlhY3RpdmVQYXJ0ID0gKChJRGlhZ3JhbVdvcmtiZW5jaFBhcnQpdGFyZ2V0UGFydCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZihhY3RpdmVQYXJ0ICE9IG51bGwpIHsKLQkJCWlmKGFjdGl2ZVBhcnQgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHsKLQkJCQlBYnN0cmFjdERpYWdyYW1FZGl0b3IgZWRpdG9yID0gKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpYWN0aXZlUGFydCk7IAotCQkJCWVkaXRvci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvUmVmcmVzaEZyb21CYXNlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvUmVmcmVzaEZyb21CYXNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNWI2ZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL1JlZnJlc2hGcm9tQmFzZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkRpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLlR4VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmVkaXRwYXJ0LkVkaXRQYXJ0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk9iamVjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLQotLyoqCi0gKiBBY3Rpb24gdG8gcmVmcmVzaCB0aGUgbGF0ZXN0IGNoYW5nZXMgZnJvbSBiYXNlIGFjdGl2aXR5IGRpYWdyYW0gaW50byAKLSAqIGV4dGVuZCdzIEFjdGl2aXR5IGRpYWdyYW0uIEFjdGlvbiB3aWxsIGtlZXAgdGhlIGV4aXN0aW5nIGltbWVkaWF0ZSBjaGlsZHJlbidzIAotICogaW5mb3JtYXRpb24gb2YgZXh0ZW5kIGRpYWdyYW0sIG9ubHkgcmVmcmVzaCB0aGUgYmFzZSBkaWFncmFtJ3MgcmVsYXRlZCBpbmZvcm1hdGlvbi4gCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIFJlZnJlc2hGcm9tQmFzZUFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcml2YXRlIEVkaXRQYXJ0IGVkaXRQYXJ0OwotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydDsKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUmVmcmVzaEZyb21CYXNlQWN0aW9uKCkgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCXRoaXMudGFyZ2V0UGFydCA9IHRhcmdldFBhcnQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJcmVmcmVzaEZyb21CYXNlQ29tbWFuZC5leGVjdXRlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQllZGl0UGFydCA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uc2l6ZSgpID09IDEKLQkJCQkJJiYgc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkJZWRpdFBhcnQgPSAoRWRpdFBhcnQpIHN0cnVjdHVyZWRTZWxlY3Rpb24KLQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCX0KLQkJfQotCQlpZihlZGl0UGFydCAhPSBudWxsKXsKLQkJCWFjdGlvbi5zZXRDaGVja2VkKGZhbHNlKTsKLQkJCS8vIENoZWNrIGlmIGRpYWdyYW0gcmVhZG9ubHkuCi0JCQlpZihlZGl0UGFydCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCl7Ci0JCQkJaWYoISgoRGlhZ3JhbUVkaXRQYXJ0KWVkaXRQYXJ0KS5pc0VkaXRNb2RlRW5hYmxlZCgpKXsKLQkJCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBDaGVja2VkIHZhcmlhYmlsaXR5IAotCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCUVPYmplY3QgbW9kZWwgPSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJCUFjdGl2aXR5IGUgPSBudWxsOwotCQkJaWYobW9kZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSl7Ci0JCQkJZSA9IChBY3Rpdml0eSlCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCgoRU1vZGVsRWxlbWVudCltb2RlbCk7Ci0JCQl9ZWxzZSBpZihtb2RlbCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pewotCQkJCWUgPSAoQWN0aXZpdHkpKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKW1vZGVsKS5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlpZihlICE9IG51bGwpewotCQkJCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJCWlmKCgoQWN0aXZpdHkpZSkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IG51bGwKLQkJCQkJCQl8fCAoKChBY3Rpdml0eSllKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbAotCQkJCQkJCSYmICgoQWN0aXZpdHkpZSkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgIT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpKXsKLQkJCQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9ZWxzZXsKLQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZWZyZXNoIGJhc2UgZnJvbSBwcmV2aW91cyBncmFwaGljYWwgZWRpdG9yIGNvZGUuCi0JICogVE9ETzogaGFuZGxlIGNvbnN1bWVyIChzZXQpCi0JICogCi0JICovCi0JcHJpdmF0ZSBDb21tYW5kIHJlZnJlc2hGcm9tQmFzZUNvbW1hbmQgPSBuZXcgQ29tbWFuZChEaWFncmFtQ29yZVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JyZWZyZXNoZnJvbWJhc2UpIHsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIEFycmF5TGlzdCBvbGRDb250ZW50ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQotCQkJRWRpdFBhcnQgcGFyZW50ID0gZWRpdFBhcnQuZ2V0UGFyZW50KCk7Ci0JCQkvLyBiYWNrIHVwIG9sZCBkaWFncmFtIGNvbnRlbnQKLQkJCS8vCi0JCQlvbGRDb250ZW50LmNsZWFyKCk7Ci0JCQlvbGRDb250ZW50LmFkZEFsbChkaWFncmFtLmdldFBlcnNpc3RlZENoaWxkcmVuKCkpOwotCi0JCQlib29sZWFuIHJlZnJlc2hlZCA9IC8vRGlhZ3JhbUhlbHBlci5yZWZyZXNoRnJvbUJhc2UoZGlhZ3JhbSk7Ci0JCQkJcmVmcmVzaEZyb21CYXNlKGRpYWdyYW0pOwotCQkJaWYoIXJlZnJlc2hlZCkgcmV0dXJuOwotCQkJCi0JCQlpZiAoZWRpdFBhcnQuaXNBY3RpdmUoKSkgewotCQkJCWVkaXRQYXJ0LmRlYWN0aXZhdGUoKTsKLQkJCX0KLQkJCS8vZGlhZ3JhbS5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCS8vY3JlYXRlRWRpdFBhcnQoKTsKLQkJCWVkaXRQYXJ0ID0gKEVkaXRQYXJ0KUVkaXRQYXJ0U2VydmljZS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUdyYXBoaWNFZGl0UGFydChkaWFncmFtKTsKLQkJCWVkaXRQYXJ0LnNldFBhcmVudChwYXJlbnQpOwotCQkJcGFyZW50LmdldFZpZXdlcigpLnNldENvbnRlbnRzKGVkaXRQYXJ0KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCWRpYWdyYW0uZ2V0Q2hpbGRyZW4oKS5jbGVhcigpOwotCQkJZGlhZ3JhbS5nZXRDaGlsZHJlbigpLmFkZEFsbChvbGRDb250ZW50KTsKLQkJCWlmIChlZGl0UGFydC5pc0FjdGl2ZSgpKSB7Ci0JCQkJZWRpdFBhcnQuZGVhY3RpdmF0ZSgpOwotCQkJfQotCQkJLy9kaWFncmFtLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJZWRpdFBhcnQgPSAoRWRpdFBhcnQpRWRpdFBhcnRTZXJ2aWNlLmdldEluc3RhbmNlKCkuY3JlYXRlR3JhcGhpY0VkaXRQYXJ0KGRpYWdyYW0pOwotCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuc2V0Q29udGVudHMoZWRpdFBhcnQpOwotCQkJZWRpdFBhcnQuYWN0aXZhdGUoKTsKLQkJfQotCX07Ci0JCi0JcHJpdmF0ZSBHcmFwaGljYWxWaWV3ZXIgZ2V0R3JhcGhpY2FsVmlld2VyKCl7Ci0JCXJldHVybiAoR3JhcGhpY2FsVmlld2VyKWVkaXRQYXJ0LmdldFJvb3QoKS5nZXRWaWV3ZXIoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcmVmcmVzaEZyb21CYXNlKGZpbmFsIERpYWdyYW0gZGlhZ3JhbSkgewotCQlmaW5hbCBib29sZWFuW10gcmVzdWx0SG9sZGVyID0gbmV3IGJvb2xlYW5bMV07Ci0JCXRyeSB7Ci0JCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkaWFncmFtLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXJlc3VsdEhvbGRlclswXSA9IGRvUmVmcmVzaEZyb21CYXNlKGRpYWdyYW0pOwotCQkJCX0KLQkJCQkKLQkJCX0pOwkJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHRIb2xkZXJbMF07Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHJlZnJlc2hGcm9tQmFzZShmaW5hbCBEaWFncmFtIGRpYWdyYW0sIGZpbmFsIEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSByZXN1bHRIb2xkZXIgPSBuZXcgYm9vbGVhblsxXTsKLQkJdHJ5IHsKLQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGRpYWdyYW0sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJcmVzdWx0SG9sZGVyWzBdID0gZG9SZWZyZXNoRnJvbUJhc2UoZGlhZ3JhbSwgYWN0aXZpdHkpOwotCQkJCX0KLQkJCQkKLQkJCX0pOwkJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHRIb2xkZXJbMF07Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50ZXJmYWNlIElEaWFncmFtQXNzb2NpYXRpb25IZWxwZXIgewotCQkvKioKLQkJICogR2V0cyB0aGUge0BsaW5rIE1ldGhvZEVsZW1lbnR9IHRoYXQgdGhlIGdpdmVuIHtAbGluayBOb2RlfSByZXByZXNlbnRzLgotCQkgKiAKLQkJICogQHBhcmFtIG5vZGUKLQkJICogQHBhcmFtIHJlc291cmNlU2V0IHRoZSByZXNvdXJjZSBzZXQgb2YgdGhlIGxpYnJhcnkKLQkJICogQHJldHVybgotCQkgKi8KLQkJTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KE5vZGUgbm9kZSwgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpOwotCQkKLQkJLyoqCi0JCSAqIEZpbmRzIGluIHRoZSBnaXZlbiBkaWFncmFtIHRoZSBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4ge0BsaW5rIE1ldGhvZEVsZW1lbnR9LgotCQkgKiAgCi0JCSAqIEBwYXJhbSBkaWFncmFtCi0JCSAqIEBwYXJhbSBlCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCU5vZGUgZmluZE5vZGUoRGlhZ3JhbSBkaWFncmFtLCBNZXRob2RFbGVtZW50IGUpOwotCQkJCQotCQkvKioKLQkJICogUmUtYXNzb2NpYXRlcyBhY3Rpdml0eSBub2RlcyBpbiB0aGUgYmFzZSBkaWFncmFtIGNvcHkgd2l0aCBjb3JyZXNwb25kaW5nCi0JCSAqIGxvY2FsbHkgY29udHJpYnV0b3JzIG9yIHJlcGxhY2VycyBpZiB0aGVyZSBpcyBhbnkuCi0JCSAqIAotCQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkJICogQHBhcmFtIGNvcHlPZkJhc2VEaWFncmFtCi0JCSAqLwotCQl2b2lkIHJlYXNzb2NpYXRlKEFjdGl2aXR5IGFjdGl2aXR5LCBEaWFncmFtIGNvcHlPZkJhc2VEaWFncmFtKTsKLQkJCi0JCXZvaWQgYWRkTm9kZU1vZGVscyhFT2JqZWN0IGRpYWdyYW1Nb2RlbCwgQ29sbGVjdGlvbjw/PiBub2RlTW9kZWxzKTsKLQkJCi0JCXZvaWQgYWRkRWRnZU1vZGVscyhFT2JqZWN0IGRpYWdyYW1Nb2RlbCwgQ29sbGVjdGlvbjw/PiBlZGdlTW9kZWxzKTsKLQkJCi0JCXZvaWQgcmVtb3ZlTm9kZU1vZGVsKEVPYmplY3QgZGlhZ3JhbU1vZGVsLCBFT2JqZWN0IG5vZGVNb2RlbCk7Ci0JCQotCQl2b2lkIHJlbW92ZUVkZ2VNb2RlbChFT2JqZWN0IGRpYWdyYW1Nb2RlbCwgRU9iamVjdCBlZGdlTW9kZWwpOwotCi0JCUNvbGxlY3Rpb248Pz4gZ2V0Tm9kZU1vZGVscyhFT2JqZWN0IGVsZW1lbnQpOwotCi0JCUNvbGxlY3Rpb248Pz4gZ2V0RWRnZU1vZGVscyhFT2JqZWN0IGVsZW1lbnQpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRGlhZ3JhbUFzc29jaWF0aW9uSGVscGVyIEFEQXNzb2NpYXRpb25IZWxwZXIgPSBuZXcgSURpYWdyYW1Bc3NvY2lhdGlvbkhlbHBlcigpIHsKLQotCQlwdWJsaWMgTm9kZSBmaW5kTm9kZShEaWFncmFtIGRpYWdyYW0sIE1ldGhvZEVsZW1lbnQgZSkgewotCQkJcmV0dXJuIERpYWdyYW1IZWxwZXIuZmluZE5vZGUoZGlhZ3JhbSwgZSk7Ci0JCX0KLQotCQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KE5vZGUgbm9kZSwgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJCUVPYmplY3QgdW1sT2JqZWN0ID0gbm9kZS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAodW1sT2JqZWN0IGluc3RhbmNlb2YgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZQotCQkJCQl8fCB1bWxPYmplY3QgaW5zdGFuY2VvZiBPYmplY3ROb2RlKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyCi0JCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgoQWN0aXZpdHlOb2RlKSB1bWxPYmplY3QpOwotCQkJCWlmIChlID09IG51bGwgJiYgcmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCQkvLyBiYXNlIGRpYWdyYW0gaXMgbm90IG9wZW4sIHRyeSB0byBnZXQgZnJvbQotCQkJCQkvLyBhbm5vdGF0aW9uCi0JCQkJCS8vCi0JCQkJCWUgPSBCcmlkZ2VIZWxwZXIKLQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudEZyb21Bbm5vdGF0aW9uKAotCQkJCQkJCQkJKEVNb2RlbEVsZW1lbnQpIHVtbE9iamVjdCwgcmVzb3VyY2VTZXQpOwotCQkJCX0KLQkJCQlyZXR1cm4gZTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVhc3NvY2lhdGUoQWN0aXZpdHkgYWN0aXZpdHksIERpYWdyYW0gY29weU9mQmFzZURpYWdyYW0pIHsKLQkJCURpYWdyYW1IZWxwZXIucmVhc3NvY2lhdGUoYWN0aXZpdHksIGNvcHlPZkJhc2VEaWFncmFtKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEVkZ2VNb2RlbHMoRU9iamVjdCBkaWFncmFtTW9kZWwsIENvbGxlY3Rpb248Pz4gZWRnZU1vZGVscykgewotCQkJaWYoIShkaWFncmFtTW9kZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlEaWFncmFtQWRhcHRlciBkaWFncmFtQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXREaWFncmFtQWRhcHRlcihkaWFncmFtTW9kZWwpOwotCQkJYm9vbGVhbiBvbGROb3RpZnkgPSBmYWxzZTsKLQkJCWlmKGRpYWdyYW1BZGFwdGVyICE9IG51bGwpIHsKLQkJCQlvbGROb3RpZnkgPSBkaWFncmFtQWRhcHRlci5pc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJCQlkaWFncmFtQWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJKChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgZGlhZ3JhbU1vZGVsKS5nZXRFZGdlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQWN0aXZpdHlFZGdlPikgZWRnZU1vZGVscyk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZihkaWFncmFtQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWRpYWdyYW1BZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQob2xkTm90aWZ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGROb2RlTW9kZWxzKEVPYmplY3QgZGlhZ3JhbU1vZGVsLCBDb2xsZWN0aW9uPD8+IG5vZGVNb2RlbHMpIHsKLQkJCWlmKCEoZGlhZ3JhbU1vZGVsIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJRGlhZ3JhbUFkYXB0ZXIgZGlhZ3JhbUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0RGlhZ3JhbUFkYXB0ZXIoZGlhZ3JhbU1vZGVsKTsKLQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gZmFsc2U7Ci0JCQlpZihkaWFncmFtQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJb2xkTm90aWZ5ID0gZGlhZ3JhbUFkYXB0ZXIuaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCQkJZGlhZ3JhbUFkYXB0ZXIuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCSgob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIGRpYWdyYW1Nb2RlbCkuZ2V0Tm9kZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEFjdGl2aXR5Tm9kZT4pIG5vZGVNb2RlbHMpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYoZGlhZ3JhbUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlkaWFncmFtQWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKG9sZE5vdGlmeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlRWRnZU1vZGVsKEVPYmplY3QgZGlhZ3JhbU1vZGVsLCBFT2JqZWN0IGVkZ2VNb2RlbCkgewotCQkJaWYoIShkaWFncmFtTW9kZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlEaWFncmFtQWRhcHRlciBkaWFncmFtQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXREaWFncmFtQWRhcHRlcihkaWFncmFtTW9kZWwpOwotCQkJYm9vbGVhbiBvbGROb3RpZnkgPSBmYWxzZTsKLQkJCWlmKGRpYWdyYW1BZGFwdGVyICE9IG51bGwpIHsKLQkJCQlvbGROb3RpZnkgPSBkaWFncmFtQWRhcHRlci5pc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJCQlkaWFncmFtQWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJKChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgZGlhZ3JhbU1vZGVsKS5nZXRFZGdlcygpLnJlbW92ZShlZGdlTW9kZWwpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYoZGlhZ3JhbUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlkaWFncmFtQWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKG9sZE5vdGlmeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlTm9kZU1vZGVsKEVPYmplY3QgZGlhZ3JhbU1vZGVsLCBFT2JqZWN0IG5vZGVNb2RlbCkgewotCQkJaWYoIShkaWFncmFtTW9kZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlEaWFncmFtQWRhcHRlciBkaWFncmFtQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXREaWFncmFtQWRhcHRlcihkaWFncmFtTW9kZWwpOwotCQkJYm9vbGVhbiBvbGROb3RpZnkgPSBmYWxzZTsKLQkJCWlmKGRpYWdyYW1BZGFwdGVyICE9IG51bGwpIHsKLQkJCQlvbGROb3RpZnkgPSBkaWFncmFtQWRhcHRlci5pc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJCQlkaWFncmFtQWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJKChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgZGlhZ3JhbU1vZGVsKS5nZXROb2RlcygpLnJlbW92ZShub2RlTW9kZWwpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYoZGlhZ3JhbUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlkaWFncmFtQWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKG9sZE5vdGlmeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIENvbGxlY3Rpb248Pz4gZ2V0RWRnZU1vZGVscyhFT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgewotCQkJCXJldHVybiAoKG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSBlbGVtZW50KS5nZXRFZGdlcygpOwotCQkJfQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQotCQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXROb2RlTW9kZWxzKEVPYmplY3QgZWxlbWVudCkgewotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSB7Ci0JCQkJcmV0dXJuICgob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIGVsZW1lbnQpLmdldE5vZGVzKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCi0JfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRGlhZ3JhbUFzc29jaWF0aW9uSGVscGVyIGRpYWdyYW1Bc3NvY2lhdGlvbkhlbHBlciA9IG5ldyBJRGlhZ3JhbUFzc29jaWF0aW9uSGVscGVyKCkgewotCi0JCXB1YmxpYyBOb2RlIGZpbmROb2RlKERpYWdyYW0gZGlhZ3JhbSwgTWV0aG9kRWxlbWVudCBlKSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbUhlbHBlci5maW5kTm9kZUluTW9kZWxEaWFncmFtKGRpYWdyYW0sIGUpOwotCQl9Ci0KLQkJcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudChOb2RlIG5vZGUsIFJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSBub2RlLmdldEVsZW1lbnQoKTsKLQkJCXJldHVybiBlbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZT8gCi0JCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZWxlbWVudCkuZ2V0TGlua2VkRWxlbWVudCgpIDogbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlYXNzb2NpYXRlKEFjdGl2aXR5IGFjdGl2aXR5LCBEaWFncmFtIGNvcHlPZkJhc2VEaWFncmFtKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQkKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgYWRkTm9kZU1vZGVscyhFT2JqZWN0IGRpYWdyYW1Nb2RlbCwgQ29sbGVjdGlvbjw/PiBub2RlTW9kZWxzKSB7Ci0JCQlpZighKGRpYWdyYW1Nb2RlbCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSBkaWFncmFtID0gKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIGRpYWdyYW1Nb2RlbDsKLQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gKChOb2RlSW1wbClkaWFncmFtKS5pc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJCXRyeSB7Ci0JCQkJKChOb2RlSW1wbClkaWFncmFtKS5zZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCQlkaWFncmFtLmdldE5vZGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlPikgbm9kZU1vZGVscyk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQkoKE5vZGVJbXBsKWRpYWdyYW0pLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQob2xkTm90aWZ5KTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEVkZ2VNb2RlbHMoRU9iamVjdCBkaWFncmFtTW9kZWwsIENvbGxlY3Rpb248Pz4gZWRnZU1vZGVscykgewotCQkJLy8KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUVkZ2VNb2RlbChFT2JqZWN0IGRpYWdyYW1Nb2RlbCwgRU9iamVjdCBlZGdlTW9kZWwpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZU5vZGVNb2RlbChFT2JqZWN0IGRpYWdyYW1Nb2RlbCwgRU9iamVjdCBub2RlTW9kZWwpIHsKLQkJCWlmKCEoZGlhZ3JhbU1vZGVsIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIGRpYWdyYW0gPSAob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgZGlhZ3JhbU1vZGVsOwotCQkJYm9vbGVhbiBvbGROb3RpZnkgPSAoKE5vZGVJbXBsKWRpYWdyYW0pLmlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQkJdHJ5IHsKLQkJCQkoKE5vZGVJbXBsKWRpYWdyYW0pLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJCWRpYWdyYW0uZ2V0Tm9kZXMoKS5yZW1vdmUobm9kZU1vZGVsKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCSgoTm9kZUltcGwpZGlhZ3JhbSkuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChvbGROb3RpZnkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIENvbGxlY3Rpb248Pz4gZ2V0RWRnZU1vZGVscyhFT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0KLQkJcHVibGljIENvbGxlY3Rpb248Pz4gZ2V0Tm9kZU1vZGVscyhFT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKSB7Ci0JCQkJcmV0dXJuICgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgZWxlbWVudCkuZ2V0Tm9kZXMoKTsKLQkJCX0KLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCQotCX07Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBub2RlIGlzIG9uZSBvZiB0aGUgc3BlY2lmaWVkIG5vZGVzIG9yIHRoZWlyIGNoaWxkcmVuLgotCSAqIAotCSAqIEBwYXJhbSBub2RlcwotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhDb2xsZWN0aW9uPD8+IG5vZGVzLCBWaWV3IG5vZGUpIHsKLQkJaWYobm9kZXMuY29udGFpbnMobm9kZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWZvciAoT2JqZWN0IGNoaWxkIDogbm9kZXMpIHsKLQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgTm9kZSAmJiBjb250YWlucygoKE5vZGUpIGNoaWxkKS5nZXRDaGlsZHJlbigpLCBub2RlKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGRvUmVmcmVzaEZyb21CYXNlKERpYWdyYW0gZGlhZ3JhbSkgewotCQlBY3Rpdml0eSBhY3QgPSBudWxsOwotCQlFT2JqZWN0IG1vZGVsID0gZGlhZ3JhbS5nZXRFbGVtZW50KCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSB7Ci0JCQlhY3QgPSAoQWN0aXZpdHkpIEJyaWRnZUhlbHBlcgotCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgoRU1vZGVsRWxlbWVudCkgbW9kZWwpOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgewotCQkJYWN0ID0gKEFjdGl2aXR5KSAoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIG1vZGVsKQotCQkJCQkuZ2V0TGlua2VkRWxlbWVudCgpOwotCQl9Ci0JCWlmIChhY3QgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCXJldHVybiBkb1JlZnJlc2hGcm9tQmFzZShkaWFncmFtLCBhY3QpOwotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGRvUmVmcmVzaEZyb21CYXNlKERpYWdyYW0gZGlhZ3JhbSwgQWN0aXZpdHkgYWN0KSB7Ci0JCUVPYmplY3QgbW9kZWwgPSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJQWN0aXZpdHkgYmFzZSA9IChBY3Rpdml0eSkgYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJaWYgKGJhc2UgPT0gbnVsbAotCQkJCXx8IGFjdC5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgdHlwZSA9IERpYWdyYW1IZWxwZXIuZ2V0RGlhZ3JhbVR5cGUoZGlhZ3JhbSk7Ci0JCURpYWdyYW1TZXJ2aWNlIGRpYWdyYW1TdmMgPSBuZXcgRGlhZ3JhbVNlcnZpY2UoKTsKLQkJdHJ5IHsKLQkJCURpYWdyYW0gYmFzZURpYWdyYW0gPSBkaWFncmFtU3ZjLmdldEJhc2VEaWFncmFtKGFjdCwgdHlwZSk7Ci0JCQlpZiAoYmFzZURpYWdyYW0gPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCUNvbGxlY3Rpb248Tm9kZT4gb2xkTm9kZXMgPSBuZXcgSGFzaFNldDxOb2RlPigpOwotCQkJQ29sbGVjdGlvbjxFZGdlPiBvbGRFZGdlcyA9IG5ldyBIYXNoU2V0PEVkZ2U+KCk7Ci0JCQlEaWFncmFtIGJhc2VDb3B5ID0gRGlhZ3JhbUhlbHBlci5jb3B5RGlhZ3JhbShUcmFuc2FjdGlvblV0aWwKLQkJCQkJLmdldEVkaXRpbmdEb21haW4oZGlhZ3JhbSksIGJhc2VEaWFncmFtKTsKLQkJCQotCQkJSURpYWdyYW1Bc3NvY2lhdGlvbkhlbHBlciBoZWxwZXIgPSB0eXBlID09IElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNID8gQURBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQk6IGRpYWdyYW1Bc3NvY2lhdGlvbkhlbHBlcjsgCi0JCQkKLQkJCWJvb2xlYW4gbm90aWZpY2F0aW9uID0gbW9kZWwuZURlbGl2ZXIoKTsKLQkJCXRyeSB7Ci0vLwkJCQltb2RlbC5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBiYXNlLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJLy8gQ29sbGVjdCB0aGUgYmFzZSBub2RlcyB0aGF0IGV4aXN0IGluIGV4dGVuZCBkaWFncmFtCi0JCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gYmFzZURpYWdyYW0uZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlOb2RlIGJhc2VOb2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQlNZXRob2RFbGVtZW50IGUgPSBoZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChiYXNlTm9kZSwgcmVzb3VyY2VTZXQpOwotCQkJCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJCQlOb2RlIG5vZGUgPSBoZWxwZXIuZmluZE5vZGUoZGlhZ3JhbSwgZSk7Ci0JCQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJb2xkTm9kZXMuYWRkKG5vZGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gQ29sbGVjdCBvbGQgaW5oZXJpdGVkIFVJIG5vZGVzICYmIG5vZGVzIG9mCi0JCQkJLy8gY29udHJpYnV0b3IvcmVwbGFjZXIKLQkJCQlMaXN0PD8+IGNoaWxkcmVuID0gZGlhZ3JhbS5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChCcmlkZ2VIZWxwZXIuaXNJbmhlcml0ZWQobm9kZSkpIHsKLQkJCQkJCW9sZE5vZGVzLmFkZChub2RlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IGhlbHBlci5nZXRNZXRob2RFbGVtZW50KG5vZGUsIHJlc291cmNlU2V0KTsKLQkJCQkJCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCQkJJiYgKChBY3Rpdml0eSkgZSkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCQkvLyBub2RlIGlzIG9mIGNvbnRyaWJ1dG9yIG9yIHJlcGxhY2VyCi0JCQkJCQkJLy8KLQkJCQkJCQlvbGROb2Rlcy5hZGQobm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBDb2xsZWN0IHRoZSBlZGdlcyB0aGF0cyBleGlzdHMgaW4gZXh0ZW5kIGRpYWdyYW0KLQkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBkaWFncmFtLmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRWRnZSBlZGdlID0gKEVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoY29udGFpbnMob2xkTm9kZXMsIGVkZ2UuZ2V0U291cmNlKCkpCi0JCQkJCQkJJiYgY29udGFpbnMob2xkTm9kZXMsIGVkZ2UuZ2V0VGFyZ2V0KCkpKSB7Ci0JCQkJCQlvbGRFZGdlcy5hZGQoZWRnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyByZW1vdmUgdGhlIG9sZCBiYXNlIG5vZGVzIGFuZCBlZGdlcyB0aGF0IGV4aXN0cyBpbiB0aGUKLQkJCQkvLyBleHRlbmQgZGlhZ3JhbS4KLQkJCQlmb3IgKE5vZGUgbm9kZSA6IG9sZE5vZGVzKSB7Ci0JCQkJCWRpYWdyYW0ucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JCQkJCWhlbHBlci5yZW1vdmVOb2RlTW9kZWwobW9kZWwsIG5vZGUuZ2V0RWxlbWVudCgpKTsKLQkJCQl9Ci0JCQkJZm9yIChFZGdlIGVkZ2UgOiBvbGRFZGdlcykgewotCQkJCQlkaWFncmFtLnJlbW92ZUVkZ2UoZWRnZSk7Ci0JCQkJCWhlbHBlci5yZW1vdmVFZGdlTW9kZWwobW9kZWwsIGVkZ2UuZ2V0RWxlbWVudCgpKTsKLQkJCQl9Ci0KLQkJCQkvLyByZXBsYWNlIGFzc29jaWF0ZWQgYmFzZSBlbGVtZW50IHdpdGgKLQkJCQkvLyBjb250cmlidXRpbmcvcmVwbGFjaW5nCi0JCQkJLy8gZWxlbWVudAotCQkJCS8vCi0JCQkJaGVscGVyLnJlYXNzb2NpYXRlKGFjdCwgYmFzZUNvcHkpOwotCi0JCQkJLy8gTWFyayBpbmhlcml0ZWQKLQkJCQlmb3IgKE9iamVjdCBvYmogOiBiYXNlQ29weS5nZXRDaGlsZHJlbigpKSB7Ci0JCQkJCUJyaWRnZUhlbHBlci5tYXJrSW5oZXJpdGVkKChWaWV3KSBvYmopOwotCQkJCX0KLQkJCQlmb3IgKE9iamVjdCBvYmogOiBiYXNlQ29weS5nZXRFZGdlcygpKSB7Ci0JCQkJCUJyaWRnZUhlbHBlci5tYXJrSW5oZXJpdGVkKChWaWV3KSBvYmopOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBBZGQgYWxsIG5ldyBub2RlcyBhbmQgZWRnZXMgZnJvbSBiYXNlIGNvcHkgdG8gZXh0ZW5kIGRpYWdyYW0uCi0JCQkJLy8KLQkJCQlkaWFncmFtLmdldFBlcnNpc3RlZENoaWxkcmVuKCkuYWRkQWxsKAotCQkJCQkJYmFzZUNvcHkuZ2V0Q2hpbGRyZW4oKSk7Ci0JCQkJZGlhZ3JhbS5nZXRQZXJzaXN0ZWRFZGdlcygpLmFkZEFsbCgKLQkJCQkJCWJhc2VDb3B5LmdldEVkZ2VzKCkpOwotCQkJCUNvbGxlY3Rpb248Pz4gYmFzZU5vZGVNb2RlbHMgPSBoZWxwZXIuZ2V0Tm9kZU1vZGVscyhiYXNlQ29weS5nZXRFbGVtZW50KCkpOwotCQkJCWlmKGJhc2VOb2RlTW9kZWxzICE9IG51bGwgJiYgIWJhc2VOb2RlTW9kZWxzLmlzRW1wdHkoKSkgewotCQkJCQloZWxwZXIuYWRkTm9kZU1vZGVscyhtb2RlbCwgYmFzZU5vZGVNb2RlbHMpOwotCQkJCX0JCQkJCQotCQkJCUNvbGxlY3Rpb248Pz4gYmFzZUVkZ2VNb2RlbHMgPSBoZWxwZXIuZ2V0RWRnZU1vZGVscyhiYXNlQ29weQotCQkJCQkJLmdldEVsZW1lbnQoKSk7Ci0JCQkJaWYgKGJhc2VFZGdlTW9kZWxzICE9IG51bGwgJiYgIWJhc2VFZGdlTW9kZWxzLmlzRW1wdHkoKSkgewotCQkJCQloZWxwZXIuYWRkRWRnZU1vZGVscyhtb2RlbCwgYmFzZUVkZ2VNb2RlbHMpOwotCQkJCX0KLQotCQkJCS8vIFRPRE86IGhhbmRsZSB0aGUgbWlzc2VkIGxpbmtzLgotCi0JCQkJLy8gQWN0aXZpdHlEaWFncmFtQWRhcHRlciBhZGFwdGVyID0KLQkJCQkvLyAoQWN0aXZpdHlEaWFncmFtQWRhcHRlcilCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIodW1sQWN0aXZpdHkpOwotCQkJCS8vIGFkYXB0ZXIucG9wdWxhdGVEaWFncmFtKCk7Ci0JCQkJLy8gaWYodGFyZ2V0UGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcil7Ci0JCQkJLy8gRGlhZ3JhbUVkaXRvclV0aWwucmVzZXRFZGl0b3IoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcil0YXJnZXRQYXJ0KTsKLQkJCQkvLyB9Ci0JCQl9IGZpbmFsbHkgewotCQkJCS8vIHJlc2V0IHRoZSBub3RpZmljYXRpb24uCi0JCQkJbW9kZWwuZVNldERlbGl2ZXIobm90aWZpY2F0aW9uKTsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlpZiAodGFyZ2V0UGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCQlEaWFncmFtRWRpdG9yVXRpbAotCQkJCQkJCS5yZXNldEVkaXRvcigoQWJzdHJhY3REaWFncmFtRWRpdG9yKSB0YXJnZXRQYXJ0KTsKLQkJCQl9Ci0JCQkJLy8gZGlhZ3JhbS5lUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJZGlhZ3JhbVN2Yy5kaXNwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQgY29weURpYWdyYW0oRWRpdGluZ0RvbWFpbiBkb21haW4sIERpYWdyYW0gZGlhZ3JhbSkgewotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJbGlzdC5hZGQoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQlsaXN0LmFkZChkaWFncmFtKTsKLQkJb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQgY21kID0gQ29weUNvbW1hbmQuY3JlYXRlKGRvbWFpbiwgbGlzdCk7Ci0JCWNtZC5leGVjdXRlKCk7Ci0vLwkJZm9yIChJdGVyYXRvciBpdGVyID0gY21kLmdldFJlc3VsdCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotLy8JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbSkgewotLy8JCQkJcmV0dXJuIChEaWFncmFtKSBlbGVtZW50OwotLy8JCQl9Ci0vLwkJfQotCQlyZXR1cm4gY21kOwotCQkvL3JldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCl7Ci0JCWlmKHRhcmdldFBhcnQgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpewotCQkJQWJzdHJhY3REaWFncmFtRWRpdG9yIGVkaXRvciA9IChBYnN0cmFjdERpYWdyYW1FZGl0b3IpdGFyZ2V0UGFydDsKLQkJCURpYWdyYW1FZGl0UGFydCBwYXJ0ID0gZWRpdG9yLmdldERpYWdyYW1FZGl0UGFydCgpOwotCQkJCi0JCX0KLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvQWN0aXZpdHlEaWFncmFtQWRhcHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvQWN0aXZpdHlEaWFncmFtQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDJmMjgyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL0FjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JQWRhcHRlckZhY3RvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURpYWdyYW1BZGFwdGVyIGV4dGVuZHMgRGlhZ3JhbUFkYXB0ZXIgewotCQotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW1BZGFwdGVyKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJc3VwZXIod3JhcHBlcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEaWFncmFtQWRhcHRlcihBY3Rpdml0eSBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCXByb3RlY3RlZCBBY3Rpdml0eU5vZGUgYWRkTm9kZShDb2xsZWN0aW9uIG5vZGVzLCBPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBvYmo7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJLy8gZmluZCBleGlzdGluZyBub2RlIGZvciBiYXNlIGFuZCBsaW5rIGl0IHRvIHRoZSBhY3Rpdml0eQotCQkJCS8vCi0JCQkJb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkgZGlhZ3JhbSA9IGdldERpYWdyYW0oKTsKLQkJCQlBY3Rpdml0eU5vZGUgYmFzZU5vZGUgPSBCcmlkZ2VIZWxwZXIuZmluZE5vZGUoZGlhZ3JhbSwgYmFzZSk7Ci0JCQkJaWYgKGJhc2VOb2RlID09IG51bGwpIHsKLQkJCQkJYmFzZU5vZGUgPSBCcmlkZ2VIZWxwZXIuZmluZE5vZGUoZGlhZ3JhbSwgYWN0KTsKLQkJCQl9Ci0JCQkJaWYgKGJhc2VOb2RlICE9IG51bGwpIHsKLQkJCQkJLy8gZGlzYXNzb2NpYXRlIHdpdGggdGhlIGJhc2UKLQkJCQkJLy8KLQkJCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIoYmFzZU5vZGUpOwotCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQlub2RlQWRhcHRlci5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vIGFzc29jaWF0ZSBiYXNlIG5vZGUgd2l0aCB0aGUgYWN0aXZpdHkKLQkJCQkJLy8KLQkJCQkJbm9kZUFkYXB0ZXIgPSBjcmVhdGVOb2RlQWRhcHRlcihhY3QpOwotCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQlpbml0aWFsaXplTm9kZUFkYXB0ZXIobm9kZUFkYXB0ZXIpOwotCQkJCQkJYmFzZU5vZGUuZUFkYXB0ZXJzKCkuYWRkKG5vZGVBZGFwdGVyKTsKLQkJCQkJCW5vZGVBZGFwdGVyLnVwZGF0ZVZpZXcoKTsKLS8vCQkJCQkJaWYoUHJvY2Vzc1V0aWwuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoYWN0KSkgewotCQkJCQkJCUJyaWRnZUhlbHBlci5hc3NvY2lhdGUoYmFzZU5vZGUsIGFjdCk7Ci0JCQkJCQkJaWYoQnJpZGdlSGVscGVyLmlzSW5oZXJpdGVkKG5vZGVBZGFwdGVyLmdldFZpZXcoKSkpewotCQkJCQkJCQlCcmlkZ2VIZWxwZXIudW5tYXJrSW5IZXJpdGVkKG5vZGVBZGFwdGVyLmdldFZpZXcoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCW5vZGVBZGFwdGVyLnNldFRhcmdldFJlYWRPbmx5KGZhbHNlKTsKLS8vCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmFkZE5vZGUobm9kZXMsIG9iaik7Ci0JfQotCQotCXByb3RlY3RlZCBOb2RlQWRhcHRlciBjcmVhdGVOb2RlQWRhcHRlcihNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYoZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlyZXR1cm4gbmV3IFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUFkYXB0ZXIoZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFRvVW1hTW9kZWwoaW50IHBvc2l0aW9uLCBBY3Rpdml0eU5vZGUgYWRkZWROb2RlKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KGFkZGVkTm9kZSk7Ci0JCWlmKGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCi0JCS8vIHRyYW5zbGF0ZSBBY3Rpdml0eU5vZGUgaW5kZXggdG8gQWN0aXZpdHkgaW5kZXgKLQkJLy8KLQkJaW50IGkgPSB0b0FjdGl2aXR5SW5kZXgocG9zaXRpb24pOwotCi0JCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGFkZGVkTm9kZSk7Ci0JCWJvb2xlYW4gbm90aWZ5ID0gbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJdHJ5IHsKLQkJCW5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCWdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGFjdCwgVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTLCBlLCBpKTsKLQkJCUJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvbihhZGRlZE5vZGUsIGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQkJfQotCi0JCXN1cGVyLmFkZFRvVW1hTW9kZWwocG9zaXRpb24sIGFkZGVkTm9kZSk7Ci0JfQotCQotCXByaXZhdGUgaW50IHRvQWN0aXZpdHlJbmRleChpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4ID09IC0xKQotCQkJcmV0dXJuIGluZGV4OwotCQlpbnQgc2l6ZSA9IGdldE5vZGVzKCkuc2l6ZSgpOwotCQlpbnQgaSA9IGluZGV4ICsgMTsKLQkJaWYgKGkgPT0gc2l6ZSkKLQkJCXJldHVybiAtMTsKLQkJQWN0aXZpdHlOb2RlIG5vZGUgPSAoQWN0aXZpdHlOb2RlKSBnZXROb2RlcygpLmdldChpKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQotCQlmb3IgKDsgIShCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChub2RlKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpICYmIGkgPCBzaXplOyBpKyspIHsKLQkJCW5vZGUgPSAoQWN0aXZpdHlOb2RlKSBnZXROb2RlcygpLmdldChpKTsKLQkJfQotCQlpZiAoaSA9PSBzaXplKQotCQkJcmV0dXJuIC0xOwotCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQkJcmV0dXJuIGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmluZGV4T2YoQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEJyZWFrZG93bkVsZW1lbnRUeXBlcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkRpYWdyYW1BZGFwdGVyI25ld05vZGUob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KQotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eU5vZGUgbmV3Tm9kZShNZXRob2RFbGVtZW50IGUpIHsKLQkJQWN0aXZpdHlOb2RlIG5vZGUgPSBudWxsOwotCQlpZihlIGluc3RhbmNlb2YgQWN0aXZpdHkgKSB7Ci0JCQlub2RlID0gVU1MRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpOwotCQl9Ci0JCWVsc2UgaWYoZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yIHx8IGUgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCW5vZGUgPSBVTUxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eVBhcmFtZXRlck5vZGUoKTsKLQkJfQotCQllbHNlIGlmKGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJbm9kZSA9IFVNTEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKTsKLQkJfQotCQlpZihub2RlICE9IG51bGwpIHsKLQkJCUJyaWRnZUhlbHBlci5hc3NvY2lhdGUobm9kZSwgZSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkKEFjdGl2aXR5RWRnZSBsaW5rKSB7Ci0JCWlmIChsaW5rLmdldFNvdXJjZSgpID09IG51bGwgfHwgbGluay5nZXRUYXJnZXQoKSA9PSBudWxsCi0JCQkJfHwgIWdldE5vZGVzKCkuY29udGFpbnMobGluay5nZXRTb3VyY2UoKSkKLQkJCQl8fCAhZ2V0Tm9kZXMoKS5jb250YWlucyhsaW5rLmdldFRhcmdldCgpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRXb3JrT3JkZXIoV29ya09yZGVyIHdvLCBPYmplY3QgcHJlZCkgewotCQlpZiAod28uZ2V0UHJlZCgpID09IHByZWQpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJaWYgKHByZWQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBwcmVkOwotCQkJLy8gY2hlY2sgaWYgcHJlZGVjZXNzb3IgcmVmZXJlbmNlIGluIHRoZSBnaXZlbiB3b3JrIG9yZGVyIGlzIGJhc2Ugb2YKLQkJCS8vIHByZWQKLQkJCS8vCi0JCQlmb3IgKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7IHZlICE9IG51bGw7IHZlID0gdmUKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCWlmICh2ZSA9PSB3by5nZXRQcmVkKCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgTm9kZSBzcmMgY2FuIHJlYWNoIE5vZGUgdGFyZ2V0IGFzIHRoZSBmaXJzdCBBY3Rpdml0eU5vZGUgaW4gdGhlCi0JICogZGlhZ3JhbQotCSAqIAotCSAqIEBwYXJhbSBwcmVkTm9kZQotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2FuUmVhY2hBc0ZpcnN0QWN0aXZpdHlOb2RlKEFjdGl2aXR5Tm9kZSBwcmVkTm9kZSwgQWN0aXZpdHlOb2RlIG5vZGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJlZE5vZGUuZ2V0T3V0Z29pbmdzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpdml0eUVkZ2UgbGluayA9IChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgPT0gbm9kZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBDb250cm9sTm9kZQotCQkJCQkmJiBjYW5SZWFjaEFzRmlyc3RBY3Rpdml0eU5vZGUobGluay5nZXRUYXJnZXQoKSwgbm9kZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKXsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfSBlbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQWRhcHRlckZhY3RvcnlGaWx0ZXIpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpICgoSUFkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCS5nZXRXQlNBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaW5rcyhMaXN0PEFjdGl2aXR5Tm9kZT4gc2VsZWN0ZWROb2RlcykgewotCQlpZihzZWxlY3RlZE5vZGVzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlzdXBlci5wb3B1bGF0ZUxpbmtzKHNlbGVjdGVkTm9kZXMpOwotCi0JCS8vIHJlbW92ZSB0aGUgaW52YWxpZCBsaW5rcwotCQkvLwotCQlmb3IgKEFjdGl2aXR5Tm9kZSBub2RlIDogc2VsZWN0ZWROb2RlcykgewotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgd2JlID0gbnVsbDsKLQkJCU1ldGhvZEVsZW1lbnQgbWU7Ci0JCQlpZiAoKG1lID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSkpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQl3YmUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIG1lOwotCQkJfQotCQkJQXJyYXlMaXN0PEFjdGl2aXR5RWRnZT4gbGlua3NUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHlFZGdlPigpOwotCQkJbGlua0xpc3RXYWxrOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbm9kZQotCQkJCQkuZ2V0SW5jb21pbmdzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUFjdGl2aXR5RWRnZSBsaW5rID0gKEFjdGl2aXR5RWRnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmICghaXNWYWxpZChsaW5rKSkgewotCQkJCQlsaW5rc1RvUmVtb3ZlLmFkZChsaW5rKTsKLQkJCQl9Ci0KLQkJCQlpZiAod2JlICE9IG51bGwpIHsKLQkJCQkJLy8gVE9ETzogbmVlZCByZXZpc2l0IHRvIGNoZWNrIHRoZSB2YWxpZCBjb25uZWN0aW9uIGZyb20gYQotCQkJCQkvLyBGb3JrTm9kZSBvciBKb2luTm9kZQotCQkJCQkvLwotCQkJCQkKLQkJCQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbCAmJiBsaW5rLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQ29udHJvbE5vZGUpCi0JCQkJCQljb250aW51ZSBsaW5rTGlzdFdhbGs7Ci0KLQkJCQkJT2JqZWN0IHByZWQgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChsaW5rLmdldFNvdXJjZSgpKTsKLQkJCQkJYm9vbGVhbiB3b3JrT3JkZXJGb3VuZCA9IGZhbHNlOwotCQkJCQlmaW5kX1dvcmtPcmRlcjogZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSB3YmUKLQkJCQkJCQkuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5pdGVyYXRvcigpOyBpdGVyYXRvcjEKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJV29ya09yZGVyIHdvID0gKFdvcmtPcmRlcikgaXRlcmF0b3IxLm5leHQoKTsKLQkJCQkJCWlmIChpc1ZhbGlkV29ya09yZGVyKHdvLCBwcmVkKSkgewotCQkJCQkJCXdvcmtPcmRlckZvdW5kID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBmaW5kX1dvcmtPcmRlcjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIXdvcmtPcmRlckZvdW5kKSB7Ci0JCQkJCQkvLyBpbnZhbGlkIGxpbmssIHJlbW92ZSBpdAotCQkJCQkJLy8KLQkJCQkJCWxpbmtzVG9SZW1vdmUuYWRkKGxpbmspOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlmb3IgKEFjdGl2aXR5RWRnZSBsaW5rIDogbGlua3NUb1JlbW92ZSkgewotCQkJCUJyaWRnZUhlbHBlci5yZW1vdmVMaW5rKGxpbmspOwotCQkJfQotCQkJbGlua3NUb1JlbW92ZS5jbGVhcigpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbm9kZS5nZXRPdXRnb2luZ3MoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUFjdGl2aXR5RWRnZSBsaW5rID0gKEFjdGl2aXR5RWRnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmICghaXNWYWxpZChsaW5rKSkgewotCQkJCQlsaW5rc1RvUmVtb3ZlLmFkZChsaW5rKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaW5rc1RvUmVtb3ZlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJQnJpZGdlSGVscGVyLnJlbW92ZUxpbmsobGluayk7Ci0JCQl9Ci0JCQlsaW5rc1RvUmVtb3ZlLmNsZWFyKCk7Ci0JCQlsaW5rc1RvUmVtb3ZlID0gbnVsbDsKLQkJfQotCi0JCS8vIENoZWNrIHRoZSBsaW5rcyBvZiBlYWNoIEFjdGl2aXR5Tm9kZQotCQkvLyBzZXQgdGhlIFdvcmtPcmRlciB0byB0aGUgbGluayBpZiBuZWVkZWQKLQkJLy8gYWRkIG5ldyBsaW5rIGZvciB0aG9zZSBXb3JrT3JkZXJzIHRoYXQgc3RpbGwgZG9uJ3QgaGF2ZSB0aGUKLQkJLy8gY29ycmVzcG9uZGluZyBsaW5rCi0JCS8vCi0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCi0JCWZvciAoQWN0aXZpdHlOb2RlIG5vZGUgOiBzZWxlY3RlZE5vZGVzKSB7Ci0JCQlNZXRob2RFbGVtZW50IGU7Ci0JCQlpZiAoKGUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChub2RlKSkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgCi0JCQkJLy8gR2V0IHRoZSByYXcgZGF0YSBvZiB3b3Jrb3JkZXJzIGZvciBvYmplY3QuCi0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgbG9jYWwgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGU7Ci0JCQkJbGlzdC5hZGRBbGwobG9jYWwuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKSk7Ci0JCQkJCi0JCQkJLy8gR2V0IHRoZSBQcmVkZWNlc3NvciBMaXN0IG9uIHRvcCBvZiByYXcgZGF0YSwgdGhpcyBpcyBuZWVkIGZvciBpbiBjYXNlIG9mIGV4dGVuZC4KLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IG51bGw7Ci0JCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkJCS5hZGFwdChsb2NhbCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKXsKLQkJCQkJbGlzdC5hZGRBbGwoKChJQlNJdGVtUHJvdmlkZXIpYWRhcHRlcikuZ2V0UHJlZGVjZXNzb3JzKCkpOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBJdGVyYXRlIHdvcmsgb3JkZXJzIGFuZCBjcmVhdGUgbGlua3MuCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlXb3JrT3JkZXIgd29ya09yZGVyID0gbnVsbDsKLQkJCQkJQnJlYWtkb3duRWxlbWVudCBwcmVkID0gbnVsbDsKLQkJCQkJaWYobmV4dCBpbnN0YW5jZW9mIFdvcmtPcmRlcil7Ci0JCQkJCQl3b3JrT3JkZXIgPSAoV29ya09yZGVyKW5leHQ7Ci0JCQkJCQlwcmVkID0gd29ya09yZGVyLmdldFByZWQoKTsKLQkJCQkJfQotCQkJCQlpZihuZXh0IGluc3RhbmNlb2YgV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIpewotCQkJCQkJcHJlZCA9IChCcmVha2Rvd25FbGVtZW50KSgoV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIpbmV4dCkuZ2V0VGFyZ2V0KCk7IAotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAocHJlZCAhPSBudWxsICYmIHByZWQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJQWN0aXZpdHlOb2RlIHByZWROb2RlID0gQnJpZGdlSGVscGVyLmZpbmROb2RlKGdldERpYWdyYW0oKSwKLQkJCQkJCQkJcHJlZCwgdHJ1ZSk7Ci0JCQkJCQlpZiAocHJlZE5vZGUgIT0gbnVsbCkgewotCQkJCQkJCS8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgbGluayBmb3IgdGhpcyB3b3JrIG9yZGVyCi0JCQkJCQkJLy8gYWxyZWFkeQotCQkJCQkJCS8vCi0JCQkJCQkJYm9vbGVhbiBsaW5rRm91bmQgPSBmYWxzZTsKLQkJCQkJCQlmaW5kX2xpbms6IGZvciAoSXRlcmF0b3IgaXRlcmF0b3IxID0gbm9kZQotCQkJCQkJCQkJLmdldEluY29taW5ncygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMQotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCQkJCQlpZiAobGluay5nZXRTb3VyY2UoKSA9PSBwcmVkTm9kZSkgewotCQkJCQkJCQkJLy8gbGluayBhbHJlYWR5IGV4aXN0cwotCQkJCQkJCQkJLy8gY2hlY2sgaWYgd29yayBvcmRlciBpcyBzZXQgdG8gdGhpcyBsaW5rCi0JCQkJCQkJCQkvLwotCQkJCQkJCQkJbGlua0ZvdW5kID0gdHJ1ZTsKLS8vCQkJCQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KGxpbmspOwotCQkJCQkJCQkJaWYgKGxpbmsgPT0gbnVsbCkgewotCQkJCQkJCQkJCUJyaWRnZUhlbHBlci5zZXRTZW1hbnRpY01vZGVsKAotCQkJCQkJCQkJCQkJbGluaywgd29ya09yZGVyKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWJyZWFrIGZpbmRfbGluazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIWxpbmtGb3VuZCkgewotCQkJCQkJCQkvLyBjaGVjayBpZiB0aGlzIFdvcmtPcmRlciBjYW4gYmUgcmVwcmVzZW50ZWQKLQkJCQkJCQkJLy8gdmlhIGxpbmtzIG9mIFR5cGVkTm9kZXMKLQkJCQkJCQkJLy8KLQkJCQkJCQkJaWYgKCFjYW5SZWFjaEFzRmlyc3RBY3Rpdml0eU5vZGUocHJlZE5vZGUsIG5vZGUpKSB7Ci0JCQkJCQkJCQkvLyBhZGQgbmV3IGxpbmsgZm9yIHRoaXMgd29yayBvcmRlcgotCQkJCQkJCQkJLy8KLQkJCQkJCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQkJCQkJCQkJTm9kZUFkYXB0ZXIgcHJlZE5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKHByZWROb2RlKTsKLQkJCQkJCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwgJiYgcHJlZE5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCQkJCQlib29sZWFuIG9sZE5vdGlmeSA9IG5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJCQkJCQkJYm9vbGVhbiBwcmVkTm9kZU5vdGlmeSA9IHByZWROb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCW5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJCQkJCQkJcHJlZE5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJCQkJCQkJbm9kZUFkYXB0ZXIuYWRkSW5jb21pbmdDb25uZWN0aW9uKHByZWQpOyAKLQkJCQkJCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCQkJCQlub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gb2xkTm90aWZ5OwotCQkJCQkJCQkJCQlwcmVkTm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IHByZWROb2RlTm90aWZ5OwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljbGVhbkR1cGxpY2F0ZUxpbmtzKHNlbGVjdGVkTm9kZXMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhbkR1cGxpY2F0ZUxpbmtzKExpc3Q8QWN0aXZpdHlOb2RlPiBzZWxlY3RlZE5vZGVzKSB7Ci0JCUxpc3Q8QWN0aXZpdHlFZGdlPiBkdXBsaWNhdGVMaW5rcyA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHlFZGdlPigpOwotCQlmb3IgKEFjdGl2aXR5Tm9kZSB3Yk5vZGUgOiBzZWxlY3RlZE5vZGVzKSB7Ci0JCQlpZih3Yk5vZGUuZ2V0SW5jb21pbmdzKCkgIT0gbnVsbCl7Ci0JCQkJZmluZER1cGxpY2F0ZUxpbmtzKGR1cGxpY2F0ZUxpbmtzLCB3Yk5vZGUuZ2V0SW5jb21pbmdzKCkpOwotCQkJfQotCQkJaWYod2JOb2RlLmdldE91dGdvaW5ncygpICE9bnVsbCl7Ci0JCQkJZmluZER1cGxpY2F0ZUxpbmtzKGR1cGxpY2F0ZUxpbmtzLCB3Yk5vZGUuZ2V0T3V0Z29pbmdzKCkpOwotCQkJfQotCQl9Ci0JCWZvciAoQWN0aXZpdHlFZGdlIGxpbmsgOiBkdXBsaWNhdGVMaW5rcykgewotCQkJQnJpZGdlSGVscGVyLnJlbW92ZUxpbmsobGluayk7Ci0JCX0KLQkJZHVwbGljYXRlTGlua3MuY2xlYXIoKTsKLQkJZHVwbGljYXRlTGlua3MgPSBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaW5kRHVwbGljYXRlTGlua3MoTGlzdCBkdXBsaWNhdGVMaW5rcywgTGlzdCBsaW5rcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmtzLnNpemUoKTsgaSsrKSB7Ci0JCQlBY3Rpdml0eUVkZ2UgbGluayA9IChBY3Rpdml0eUVkZ2UpIGxpbmtzLmdldChpKTsKLQkJCWlmKCFkdXBsaWNhdGVMaW5rcy5jb250YWlucyhsaW5rKSl7Ci0JCQkJZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgbGlua3Muc2l6ZSgpOyBqKyspIHsKLQkJCQkJQWN0aXZpdHlFZGdlIGxpbmsxID0gKEFjdGl2aXR5RWRnZSkgbGlua3MuZ2V0KGopOwotCQkJCQlpZiAobGluazEuZ2V0U291cmNlKCkgPT0gbGluay5nZXRTb3VyY2UoKQotCQkJCQkJCSYmIGxpbmsxLmdldFRhcmdldCgpID09IGxpbmsuZ2V0VGFyZ2V0KCkpIHsKLQkJCQkJCWR1cGxpY2F0ZUxpbmtzLmFkZChsaW5rMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBwb3B1bGF0ZU5vZGVzKCkgewotCQlIYXNoU2V0IHNlbGVjdGVkTm9kZXMgPSBuZXcgSGFzaFNldCgpOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQotCQkvLyBhc3NvY2lhdGUgY29udHJvbCBub2RlcwotCQkvLwotCQlzZWxlY3RlZE5vZGVzLmFkZEFsbChhc3NvY2lhdGVDb250cm9sTm9kZXMoY2hpbGRyZW4pKTsKLQkJCi0JCS8vIGFkZCBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVzCi0JCS8vCi0JCXNlbGVjdGVkTm9kZXMuYWRkQWxsKGFkZEVsZW1lbnROb2RlcyhjaGlsZHJlbikpOwotCQkKLQkJcmV0dXJuIHNlbGVjdGVkTm9kZXM7Ci0JfQotCQotCXByaXZhdGUgTGlzdCBhc3NvY2lhdGVDb250cm9sTm9kZXMoQ29sbGVjdGlvbiBtZXRob2RFbGVtZW50cykgewotCQlMaXN0IGN0cmxOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0RGlhZ3JhbSgpLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpdml0eU5vZGUgbm9kZSA9IChBY3Rpdml0eU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYobm9kZSBpbnN0YW5jZW9mIENvbnRyb2xOb2RlKSB7Ci0vLwkJCQkvLyBzZWxlY3QgdGhpcyBjb250cm9sIG5vZGUgZm9yIHRoZSBkaWFncmFtIG9ubHkgaWYgaXQgaGFzIGEgdGFyZ2V0IG5vZGUgb3Igc291cmNlIG5vZGUsCi0vLwkJCQkvLyBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgbWV0aG9kIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZAotLy8JCQkJLy8gbWV0aG9kIGVsZW1lbnQgY29sbGVjdGlvbgotLy8JCQkJLy8KLS8vCQkJCUNvbGxlY3Rpb24gYWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCQlCcmlkZ2VIZWxwZXIuZ2V0VGFyZ2V0Tm9kZXMoYWN0Tm9kZXMsIG5vZGUsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzKTsKLS8vCQkJCUJyaWRnZUhlbHBlci5nZXRTb3VyY2VOb2RlcyhhY3ROb2Rlcywgbm9kZSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpOwotLy8JCQkJaWYoIWFjdE5vZGVzLmlzRW1wdHkoKSkgewotLy8JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotLy8JCQkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCQkJQWN0aXZpdHlOb2RlIGVsZW1lbnROb2RlID0gKEFjdGl2aXR5Tm9kZSkgaXRlcmF0b3IubmV4dCgpOwotLy8JCQkJCQlpZihtZXRob2RFbGVtZW50cy5jb250YWlucyhCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChlbGVtZW50Tm9kZSkpKSB7Ci0vLwkJCQkJCQlpZihhZGROb2RlQWRhcHRlclRvKG5vZGUpICE9IG51bGwpIHsKLS8vCQkJCQkJCQljdHJsTm9kZXMuYWRkKG5vZGUpOwotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotCQkJCQotCQkJCWlmKGFkZE5vZGVBZGFwdGVyVG8obm9kZSkgIT0gbnVsbCkgewotCQkJCQljdHJsTm9kZXMuYWRkKG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY3RybE5vZGVzOwotCX0KLQotCS8qKgotCSAqIEFkZHMgZWxlbWVudCBub2RlcyBmb3IgdGhlIHNwZWNpZmllZCBtZXRob2QgZWxlbWVudHMgaWYgdGhleSBkb24ndCBleGlzdCB5ZXQuCi0JICogCi0JICogQHBhcmFtIG1ldGhvZEVsZW1lbnRzCi0JICovCi0JcHJpdmF0ZSBMaXN0IGFkZEVsZW1lbnROb2RlcyhDb2xsZWN0aW9uIG1ldGhvZEVsZW1lbnRzKSB7CQotCQlBcnJheUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFycmF5TGlzdCBuZXdOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbWV0aG9kRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IGNoaWxkID0gVG5nVXRpbC51bndyYXAoZSk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCUFjdGl2aXR5Tm9kZSBub2RlID0gQnJpZGdlSGVscGVyLmZpbmROb2RlKGdldERpYWdyYW0oKSwgY2hpbGQpOwotCQkJCWlmKG5vZGUgPT0gbnVsbCkgewotCQkJCQlub2RlID0gdG9Ob2RlKChNZXRob2RFbGVtZW50KSBjaGlsZCk7Ci0JCQkJCW5ld05vZGVzLmFkZChub2RlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHN5bmNocm9uaXplIG5hbWUgd2l0aCBsaW5rZWQgZWxlbWVudAotCQkJCQkvLwotCQkJCQlTdHJpbmcgbmFtZSA9IEJyaWRnZUhlbHBlci5nZXROb2RlTmFtZSgoTWV0aG9kRWxlbWVudCkgY2hpbGQpOwotCQkJCQlpZighbmFtZS5lcXVhbHMobm9kZS5nZXROYW1lKCkpKSB7Ci0JCQkJCQlub2RlLnNldE5hbWUobmFtZSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWFkZE5vZGVBZGFwdGVyVG8obm9kZSk7Ci0JCQkJfQotCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyICYmICFpc1RhcmdldFJlYWRPbmx5KCkpIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGUpOwotCQkJCQlpZiAod3JhcHBlci5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQkJCQkJbm9kZUFkYXB0ZXIud3JhcHBlciA9IHdyYXBwZXI7Ci0JCQkJCQkvLyByZWFkT25seSBhdHRyaWJ1dGUgaXMgc3RpbGwgbmVlZGVkCi0JCQkJCQkvLyBhZnRlciBpbnRyb2R1Y3Rpb24gb2Ygd3JhcHBlci4gCi0JCQkJCQkvLyBGb3IgZXhhbXBsZSwgd2UgY2FuIGhhdmUgYSBub2RlIGFkYXB0ZXIgZm9yIGEgcmVhZC1vbmx5IGJhc2UgYWN0aXZpdHkKLQkJCQkJCS8vIHdpdGhvdXQgc3VwcGx5aW5nIHdyYXBwZXIgZm9yIHRoaXMgYmFzZSBhY3Rpdml0eS4KLQkJCQkJCS8vCi0JCQkJCQlub2RlQWRhcHRlci5iYXNpY1NldFRhcmdldFJlYWRPbmx5KHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWdldE5vZGVzKCkuYWRkQWxsKG5ld05vZGVzKTsJCQotCQlyZXR1cm4gbm9kZXM7Ci0JfQotCi0JLyoqCi0JICogTW92ZWQgY29kZSBmcm9tIGdldENoaWxkcmVuLiBnZXRBZGFwdGVyKCkgd2lsbCByZXR1cm4gQWRhcHRlciwKLQkgKiB3aGljaCB3aWxsIGFsbG93IHVzIHRvIGZpbmQgaXRlbXByb3ZpZGVyIGZvciB0aGUgY2hpbGRyZW4uIAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBnZXRBZGFwdGVyKCl7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gbnVsbDsKLQkJaWYgKHdyYXBwZXIgIT0gbnVsbCkgewotCQkJYWRhcHRlciA9IHdyYXBwZXI7Ci0JCX0gZWxzZSB7Ci0JCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdCgKLQkJCQkJZ2V0RWxlbWVudCgpLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKCkgewotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCi0JCQkvL1R1cm4gb2ZmIHRoZSBWYXJpYWJpbGl0eUluZm8gZm9yIHRoZSBhY3Rpdml0eSBkaWFncmFtLgotCQkJT2JqZWN0IG9iaiA9IG51bGw7Ci0JCQlib29sZWFuIGVuYWJsZVZhcmlhYmlsaXR5SW5mbyA9IGZhbHNlOwotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJb2JqID0gKChBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpYWRhcHRlcikuZ2V0RGVsZWdhdGluZ0l0ZW1Qcm92aWRlcigpOwotCQkJfQotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpewotCQkJCW9iaiA9IGFkYXB0ZXI7Ci0JCQl9Ci0JCQkKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpewotCQkJCWVuYWJsZVZhcmlhYmlsaXR5SW5mbyA9ICgoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcilvYmopLmlzRW5hYmxlVmFyaWFiaWxpdHlJbmZvKCk7Ci0JCQkJKChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKW9iaikuc2V0RW5hYmxlVmFyaWFiaWxpdHlJbmZvKGZhbHNlKTsKLQkJCX0KLQkJCS8vIGVuZCBvZiB2YXJpYWJpbGl0eSBpbmZvIAotCQkJCi0JCQkKLQkJCS8vIHJldHVybiBhZGFwdGVyLmdldENoaWxkcmVuKGdldE9iamVjdCgpKTsKLQkJCS8vIGNvbW1lbnRlZCBhYm92ZSBsaW5lLCBGb3IgZGlhZ3JhbXMgLSByb2xsdXAgc2hvdWxkIGJlIGZhbHNlLCBmb3IKLQkJCS8vIGhhbmRsaW5nIHJvbGx1cCBzdGF0ZSBiZWxvdyBjb2RlLgotCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWV4dHJhY3RDaGlsZHJlbihhZGFwdGVyLCBnZXRFbGVtZW50KCksIGNoaWxkcmVuKTsKLQkJCQotCQkJLy8gcmVzZXQgdmFyaWFiaWxpdHlpbmZvIHN0YXR1cyBiYWNrCi0JCQlpZihvYmogaW5zdGFuY2VvZiBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKXsKLQkJCQkoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpb2JqKS5zZXRFbmFibGVWYXJpYWJpbGl0eUluZm8oZW5hYmxlVmFyaWFiaWxpdHlJbmZvKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGNoaWxkcmVuOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVOb2RlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG9iajsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQlvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSBkaWFncmFtID0gZ2V0RGlhZ3JhbSgpOwotCQkJCQotCQkJCS8vIGZpbmQgZXhpc3Rpbmcgbm9kZSBmb3IgdGhlIG9sZCBhY3Rpdml0eSBhbmQgcmVsaW5rIGl0IHRvIGl0cwotCQkJCS8vIGJhc2UKLQkJCQkvLwotCQkJCUFjdGl2aXR5Tm9kZSBub2RlID0gQnJpZGdlSGVscGVyLmZpbmROb2RlKGRpYWdyYW0sIGFjdCk7Ci0JCQkJaWYobm9kZSA9PSBudWxsKSB7Ci0JCQkJCW5vZGUgPSBCcmlkZ2VIZWxwZXIuZmluZE5vZGUoZGlhZ3JhbSwgYmFzZSk7Ci0JCQkJfQotCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJLy8gZGlzYXNzb2NpYXRlIHdpdGggdGhlIG9sZCBhY3Rpdml0eQotCQkJCQkvLwotCQkJCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihub2RlKTsKLQkJCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJbm9kZUFkYXB0ZXIuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQkvLyBhc3NvY2lhdGUgbm9kZSB3aXRoIHRoZSBiYXNlIGFjdGl2aXR5Ci0JCQkJCS8vCi0JCQkJCW5vZGVBZGFwdGVyID0gY3JlYXRlTm9kZUFkYXB0ZXIoYmFzZSk7Ci0JCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCWluaXRpYWxpemVOb2RlQWRhcHRlcihub2RlQWRhcHRlcik7Ci0JCQkJCQlub2RlQWRhcHRlci5iYXNpY1NldFRhcmdldFJlYWRPbmx5KHRydWUpOwotCQkJCQkJbm9kZS5lQWRhcHRlcnMoKS5hZGQobm9kZUFkYXB0ZXIpOwotCQkJCQkJbm9kZUFkYXB0ZXIudXBkYXRlVmlldygpOwotCQkJCQkJaWYoIUJyaWRnZUhlbHBlci5pc0luaGVyaXRlZChub2RlQWRhcHRlci5nZXRWaWV3KCkpKXsKLQkJCQkJCQlCcmlkZ2VIZWxwZXIubWFya0luaGVyaXRlZChub2RlQWRhcHRlci5nZXRWaWV3KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIucmVtb3ZlTm9kZShvYmopOwotCX0KLQotCXByb3RlY3RlZCBOb2RlQWRhcHRlciBhZGROb2RlQWRhcHRlclRvKEFjdGl2aXR5Tm9kZSBub2RlKSB7Ci0JCU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZSk7Ci0JCWlmKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCX0KLQkJaWYobm9kZSBpbnN0YW5jZW9mIENvbnRyb2xOb2RlKSB7Ci0JCQlhZGFwdGVyID0gbmV3IENvbnRyb2xOb2RlQWRhcHRlcigpOwotCQl9Ci0JCWVsc2UgewotCQkJTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSk7Ci0JCQlpZihlID09IG51bGwpIHsKLQkJCQlpZihub2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgewotCQkJCQlTdHJpbmcgdHlwZSA9IEJyaWRnZUhlbHBlci5nZXRUeXBlKChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKW5vZGUpOwotCQkJCQlpZiAoQnJpZGdlSGVscGVyLlVNQV9QSEFTRS5lcXVhbHModHlwZSkpIHsKLQkJCQkJCWUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQaGFzZSgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKEJyaWRnZUhlbHBlci5VTUFfSVRFUkFUSU9OLmVxdWFscyh0eXBlKSkgewotCQkJCQkJZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUl0ZXJhdGlvbigpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZihub2RlIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSB7Ci0JCQkJCVN0cmluZyB0eXBlID0gQnJpZGdlSGVscGVyLmdldFR5cGUoKEFjdGl2aXR5UGFyYW1ldGVyTm9kZSlub2RlKTsKLQkJCQkJaWYoQnJpZGdlSGVscGVyLlVNQV9NSUxFU1RPTkUuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCQllID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWlsZXN0b25lKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQllID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza0Rlc2NyaXB0b3IoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmKGUgIT0gbnVsbCkgewotCQkJCWFkYXB0ZXIgPSBuZXcgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlQWRhcHRlcihlKTsKLQkJCX0KLQkJfQotCQlpZihhZGFwdGVyICE9IG51bGwpIHsKLQkJCWluaXRpYWxpemVOb2RlQWRhcHRlcihhZGFwdGVyKTsKLQkJCW5vZGUuZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOwotCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgQWN0aXZpdHlOb2RlIHJlYXNzb2NpYXRlQmFzZU5vZGUoQWN0aXZpdHkgYWN0KSB7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJLy8gZmluZCBleGlzdGluZyBub2RlIGZvciBiYXNlIGFuZCBsaW5rIGl0IHRvIHRoZSBhY3Rpdml0eQotCQkJLy8KLQkJCW9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5IGRpYWdyYW0gPSBnZXREaWFncmFtKCk7Ci0JCQlBY3Rpdml0eU5vZGUgYmFzZU5vZGUgPSBCcmlkZ2VIZWxwZXIuZmluZE5vZGUoZGlhZ3JhbSwgYmFzZSk7Ci0JCQlpZiAoYmFzZU5vZGUgPT0gbnVsbCkgewotCQkJCWJhc2VOb2RlID0gQnJpZGdlSGVscGVyLmZpbmROb2RlKGRpYWdyYW0sIGFjdCk7Ci0JCQl9Ci0JCQlpZiAoYmFzZU5vZGUgIT0gbnVsbCkgewotCQkJCS8vIGRpc2Fzc29jaWF0ZSB3aXRoIHRoZSBiYXNlCi0JCQkJLy8KLQkJCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihiYXNlTm9kZSk7Ci0JCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlub2RlQWRhcHRlci5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIGFzc29jaWF0ZSBiYXNlIG5vZGUgd2l0aCB0aGUgYWN0aXZpdHkKLQkJCQkvLwotCQkJCW5vZGVBZGFwdGVyID0gY3JlYXRlTm9kZUFkYXB0ZXIoYWN0KTsKLQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWluaXRpYWxpemVOb2RlQWRhcHRlcihub2RlQWRhcHRlcik7Ci0JCQkJCWJhc2VOb2RlLmVBZGFwdGVycygpLmFkZChub2RlQWRhcHRlcik7Ci0JCQkJCW5vZGVBZGFwdGVyLnVwZGF0ZVZpZXcoKTsKLS8vCQkJCQlpZihQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhhY3QpKSB7Ci0JCQkJCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKGJhc2VOb2RlLCBhY3QpOwotCQkJCQkJaWYoQnJpZGdlSGVscGVyLmlzSW5oZXJpdGVkKG5vZGVBZGFwdGVyLmdldFZpZXcoKSkpewotCQkJCQkJCUJyaWRnZUhlbHBlci51bm1hcmtJbkhlcml0ZWQobm9kZUFkYXB0ZXIuZ2V0VmlldygpKTsKLQkJCQkJCX0KLQkJCQkJCW5vZGVBZGFwdGVyLnNldFRhcmdldFJlYWRPbmx5KGZhbHNlKTsKLS8vCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBiYXNlTm9kZTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVwbGFjZU5vZGUoT2JqZWN0IG9sZEVsZW1lbnQsIE9iamVjdCBuZXdFbGVtZW50KSB7Ci0JCWlmKG5ld0VsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkvLyBmaW5kIGV4aXN0aW5nIG5vZGUgZm9yIG9sZCBlbGVtZW50IGFuZCBsaW5rIGl0IHRvIHRoZSBuZXcgZWxlbWVudAotCQkJLy8KLQkJCW9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5IGRpYWdyYW0gPSBnZXREaWFncmFtKCk7Ci0JCQlBY3Rpdml0eU5vZGUgb2xkTm9kZSA9IEJyaWRnZUhlbHBlci5maW5kTm9kZShkaWFncmFtLCBvbGRFbGVtZW50KTsKLQkJCWlmIChvbGROb2RlICE9IG51bGwpIHsKLQkJCQkvLyBkaXNhc3NvY2lhdGUgd2l0aCB0aGUgb2xkIGVsZW1lbnQKLQkJCQkvLwotCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG9sZE5vZGUpOwotCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJbm9kZUFkYXB0ZXIuZGlzcG9zZSgpOwotCQkJCX0KLQotCQkJCS8vIGFzc29jaWF0ZSBiYXNlIG5vZGUgd2l0aCB0aGUgbmV3IGVsZW1lbnQKLQkJCQkvLwotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBuZXdFbGVtZW50OwotCQkJCW5vZGVBZGFwdGVyID0gY3JlYXRlTm9kZUFkYXB0ZXIoZSk7Ci0JCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlpbml0aWFsaXplTm9kZUFkYXB0ZXIobm9kZUFkYXB0ZXIpOwotCQkJCQlvbGROb2RlLmVBZGFwdGVycygpLmFkZChub2RlQWRhcHRlcik7Ci0JCQkJCW5vZGVBZGFwdGVyLnVwZGF0ZVZpZXcoKTsKLQkJCQkJQnJpZGdlSGVscGVyLmFzc29jaWF0ZShvbGROb2RlLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2JyaWRnZS9CcmlkZ2VIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL0JyaWRnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzcyMDFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL0JyaWRnZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFydGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkZvcmtOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkpvaW5Ob2RlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCcmlkZ2VIZWxwZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU1BX0VMRU1FTlQgPSAidW1hX2VsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTUFfVVJJID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTUFfVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVNQV9QSEFTRSA9ICJQaGFzZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTUFfSVRFUkFUSU9OID0gIkl0ZXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTUFfQUNUSVZJVFkgPSAiQWN0aXZpdHkiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU1BX1RBU0tfREVTQ1JJUFRPUiA9ICJUYXNrIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVNQV9NSUxFU1RPTkUgPSAiTWlsZXN0b25lIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRJT05fSU5IRVJJUkVEID0gImluaGVyaXRlZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIExpc3Q8SUVsZW1lbnRUeXBlPiBlbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkKLQlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIEVDbGFzcz4gdHlwZVN0cmluZ1RvRUNsYXNzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBFQ2xhc3M+KCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IERpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQotCXN0YXRpYyB7Ci0JCXR5cGVTdHJpbmdUb0VDbGFzcy5wdXQoVU1BX1BIQVNFLCBVbWFQYWNrYWdlLkxpdGVyYWxzLlBIQVNFKTsKLQkJdHlwZVN0cmluZ1RvRUNsYXNzLnB1dChVTUFfSVRFUkFUSU9OLCBVbWFQYWNrYWdlLkxpdGVyYWxzLklURVJBVElPTik7Ci0JCXR5cGVTdHJpbmdUb0VDbGFzcy5wdXQoVU1BX0FDVElWSVRZLCBVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZKTsKLQkJdHlwZVN0cmluZ1RvRUNsYXNzLnB1dChVTUFfVEFTS19ERVNDUklQVE9SLCBVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUik7Ci0JCXR5cGVTdHJpbmdUb0VDbGFzcy5wdXQoVU1BX01JTEVTVE9ORSwgVW1hUGFja2FnZS5MaXRlcmFscy5NSUxFU1RPTkUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2VtYW50aWNNb2RlbChBY3Rpdml0eUVkZ2UgbGluaywgV29ya09yZGVyIHdvcmtPcmRlcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZE9ubHkoVmlldyB2aWV3KSB7Ci0JCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyCi0JCQkJLmdldE5vZGVBZGFwdGVyKHZpZXcuZ2V0RWxlbWVudCgpKTsKLQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5vZGVBZGFwdGVyLmlzVGFyZ2V0UmVhZE9ubHkoKTsKLQkJfQotCQlpZih2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCXJldHVybiAoKE5vZGUpdmlldy5nZXRFbGVtZW50KCkpLmlzUmVhZE9ubHkoKTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgZWxlbWVudCB0aGF0IHRoZSBnaXZlbiB2aWV3IHJlcHJlc2VudHMuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIG1ldGhvZCBlbGVtZW50IHRoYXQgdGhlIHZpZXcgaXMgcmVwcmVzZW50aW5nIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICBpZiB0aGUgdmlldyBkb2VzIG5vdCByZXByZXNlbnQgYW55IG1ldGhvZCBlbGVtZW50IG9yIHRoZSBkaWFncmFtCi0JICogICAgICAgICBvZiB0aGUgdmlldyBjdXJyZW50bHkgaXMgbm90IG9wZW5lZCBpbiBhIGRpYWdyYW0gZWRpdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KFZpZXcgdmlldykgewotCQlyZXR1cm4gZ2V0TWV0aG9kRWxlbWVudCh2aWV3LmdldEVsZW1lbnQoKSk7Ci0JfQkKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgZWxlbWVudCB0aGF0IHRoZSBnaXZlbiBkaWFncmFtIG1vZGVsIG9iamVjdCByZXByZXNlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbE9iamVjdAotCSAqIEByZXR1cm4gbWV0aG9kIGVsZW1lbnQgdGhhdCB0aGUgbW9kZWwgb2JqZWN0IGlzIHJlcHJlc2VudGluZyBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgaWYgdGhlIG1vZGVsIG9iamVjdCBkb2VzIG5vdCByZXByZXNlbnQgYW55IG1ldGhvZCBlbGVtZW50IG9yIHRoZSBkaWFncmFtCi0JICogICAgICAgICBvZiB0aGUgbW9kZWwgb2JqZWN0IGN1cnJlbnRseSBpcyBub3Qgb3BlbmVkIGluIGEgZGlhZ3JhbSBlZGl0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoRU9iamVjdCBtb2RlbE9iamVjdCkgewotCQlpZihtb2RlbE9iamVjdCBpbnN0YW5jZW9mIExpbmtlZE9iamVjdCkgewotCQkJcmV0dXJuICgoTGlua2VkT2JqZWN0KW1vZGVsT2JqZWN0KS5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCX0KLQkJZWxzZSBpZihtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEVNb2RlbEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRNZXRob2RFbGVtZW50KChFTW9kZWxFbGVtZW50KSBtb2RlbE9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KFZpZXcgdmlldywgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSBvd25lcikgewotCQlFT2JqZWN0IG1vZGVsT2JqZWN0ID0gdmlldy5nZXRFbGVtZW50KCk7Ci0JCWlmKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgTGlua2VkT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChMaW5rZWRPYmplY3QpbW9kZWxPYmplY3QpLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJfQotCQllbHNlIGlmKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgRU1vZGVsRWxlbWVudCkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBvd25lci5lUmVzb3VyY2UoKTsKLQkJCWlmKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdldE1ldGhvZEVsZW1lbnRGcm9tQW5ub3RhdGlvbigoRU1vZGVsRWxlbWVudCkgbW9kZWxPYmplY3QsIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdXBwcmVzc2VkKFZpZXcgdmlldykgewotCQlFT2JqZWN0IGVsZW1lbnQgPSB2aWV3LmdldEVsZW1lbnQoKTsKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJcmV0dXJuICgoTmFtZWROb2RlKWVsZW1lbnQpLmlzU3VwcHJlc3NlZCgpOwotCQl9Ci0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIEVNb2RlbEVsZW1lbnQpIHsKLQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gZ2V0Tm9kZUFkYXB0ZXIoZWxlbWVudCk7Ci0JCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IG8gPSBub2RlQWRhcHRlci5nZXRXcmFwcGVyKCk7Ci0JCQkJaWYobyA9PSBudWxsKSB7Ci0JCQkJCW8gPSBub2RlQWRhcHRlci5nZXRFbGVtZW50KCk7Ci0JCQkJfQotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkgYWN0aXZpdHkgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSkgZ2V0TWV0aG9kRWxlbWVudCh2aWV3LmdldERpYWdyYW0oKSk7Ci0JCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdGl2aXR5KTsKLQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKHByb2MpOwotCQkJCXJldHVybiBzdXBwcmVzc2lvbi5pc1N1cHByZXNzZWQobyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLS8vCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFNlbWFudGljTW9kZWwoVmlldyB2aWV3KSB7Ci0vLwkJRU9iamVjdCBlbGVtZW50ID0gdmlldy5nZXRFbGVtZW50KCk7Ci0vLwkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEVNb2RlbEVsZW1lbnQpIHsKLS8vCQkJcmV0dXJuIGdldFNlbWFudGljTW9kZWxGcm9tQW5ub3RhdGlvbihlbGVtZW50LCBwcm9jZXNzLCBhZGFwdGVyRmFjdG9yeSk7Ci0vLwkJfQotLy8JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mICkKLS8vCQkJCi0vLwkJfQotLy8JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVMaW5rKEFjdGl2aXR5RWRnZSBsaW5rKSB7Ci0JCS8vIFRPRE86IHN0aWxsIG5lZWQgdG8gZGlzYWJsZSBub3RpZmljYXRpb24gYmVmb3JlIHJlbW92aW5nIGxpbms/Pz8KLQkJQWN0aXZpdHkgYWN0aXZpdHkgPSBsaW5rLmdldEFjdGl2aXR5KCk7Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2VOb2RlID0gbGluay5nZXRTb3VyY2UoKTsKLQkJQWN0aXZpdHlOb2RlIHRhcmdldE5vZGUgPSBsaW5rLmdldFRhcmdldCgpOwotCQlib29sZWFuIHNyY05vdGlmeSA9IHNvdXJjZU5vZGUgIT0gbnVsbCA/IHNvdXJjZU5vZGUuZURlbGl2ZXIoKSA6IGZhbHNlOwotCQlib29sZWFuIHRhcmdldE5vdGlmeSA9IHRhcmdldE5vZGUgIT0gbnVsbCA/IHRhcmdldE5vZGUuZURlbGl2ZXIoKQotCQkJCTogZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZiAoc291cmNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJc291cmNlTm9kZS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQl9Ci0JCQlpZiAodGFyZ2V0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0Tm9kZS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQl9Ci0JCQlsaW5rLnNldFNvdXJjZShudWxsKTsKLQkJCWxpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQkJaWYoYWN0aXZpdHkgIT0gbnVsbCl7Ci0JCQkJYWN0aXZpdHkuZ2V0RWRnZXMoKS5yZW1vdmUobGluayk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc291cmNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJc291cmNlTm9kZS5lU2V0RGVsaXZlcihzcmNOb3RpZnkpOwotCQkJfQotCQkJaWYgKHRhcmdldE5vZGUgIT0gbnVsbCkgewotCQkJCXRhcmdldE5vZGUuZVNldERlbGl2ZXIodGFyZ2V0Tm90aWZ5KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbmRzIG5vZGUgd2hvc2UgbGlua2VkIG9iamVjdCBvciBvbmUgb2YgaXRzIGJhc2UgaXMgdGhlIGdpdmVuIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHlOb2RlIGZpbmROb2RlKEFjdGl2aXR5IGNvbnRhaW5lciwgT2JqZWN0IG9iamVjdCwKLQkJCWJvb2xlYW4gY2hlY2tCYXNlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRhaW5lci5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSAoQWN0aXZpdHlOb2RlKSBpdGVyLm5leHQoKTsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG5vZGUpOwotCQkJaWYgKG9iamVjdCA9PSBlKSB7Ci0JCQkJcmV0dXJuIG5vZGU7Ci0JCQl9IGVsc2UgaWYgKGNoZWNrQmFzZSAmJiBlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJZm9yIChWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoKFZhcmlhYmlsaXR5RWxlbWVudCkgZSkKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7IHZlICE9IG51bGw7IHZlID0gdmUKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpIHsKLQkJCQkJaWYgKHZlID09IG9iamVjdCkgewotCQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3luY2hCYXIoQWN0aXZpdHlOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBGb3JrTm9kZSB8fCBub2RlIGluc3RhbmNlb2YgSm9pbk5vZGU7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgbm9kZSB3aG9zZSBsaW5rZWQgb2JqZWN0IGlzIHRoZSBnaXZlbiBvYmplY3QKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eU5vZGUgZmluZE5vZGUoQWN0aXZpdHkgY29udGFpbmVyLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRhaW5lci5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSAoQWN0aXZpdHlOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmplY3QgPT0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSkpIHsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSSSBnZXRQcm94eVVSSShNZXRob2RFbGVtZW50IGUpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlLmVSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlKSB7Ci0JCQlyZXR1cm4gKChJTGlicmFyeVJlc291cmNlKSByZXNvdXJjZSkuZ2V0UHJveHlVUkkoZSk7Ci0JCX0gZWxzZSBpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc291cmNlLmdldFVSSSgpLmFwcGVuZEZyYWdtZW50KGUuZ2V0R3VpZCgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQXNzb2NpYXRlcyBhIHtAbGluayBFTW9kZWxFbGVtZW50fSB3aXRoIGEge0BsaW5rIE1ldGhvZEVsZW1lbnR9IGJ5Ci0JICogY3JlYXRpbmcgb3IgdXBkYXRpbmcgdGhlIFVNQV9FTEVNRU5UIGFubm90YXRpb24gb2YgdGhlIGdpdmVuCi0JICoge0BsaW5rIEVNb2RlbEVsZW1lbnR9LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIG1lCi0JICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQotCSAqIEBzZWUgI2FkZEVBbm5vdGF0aW9uKEVNb2RlbEVsZW1lbnQsIE1ldGhvZEVsZW1lbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFzc29jaWF0ZShFTW9kZWxFbGVtZW50IGVsZW1lbnQsIE1ldGhvZEVsZW1lbnQgbWUpIHsKLQkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFkZEVBbm5vdGF0aW9uKGVsZW1lbnQsIG1lKTsKLQkJaWYoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IGdldFR5cGUobWUpOwotCQkJaWYodHlwZSAhPSBudWxsKSB7Ci0JCQkJYW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KFVNQV9UWVBFLCB0eXBlKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBFQ2xhc3MgZ2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gdHlwZVN0cmluZ1RvRUNsYXNzLmdldCh0eXBlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZShNZXRob2RFbGVtZW50IG1lKSB7Ci0JCWlmKG1lIGluc3RhbmNlb2YgUGhhc2UpIHsKLQkJCXJldHVybiBVTUFfUEhBU0U7Ci0JCX0KLQkJZWxzZSBpZihtZSBpbnN0YW5jZW9mIEl0ZXJhdGlvbikgewotCQkJcmV0dXJuIFVNQV9JVEVSQVRJT047Ci0JCX0KLQkJZWxzZSBpZihtZSBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJcmV0dXJuIFVNQV9NSUxFU1RPTkU7Ci0JCX0KLQkJZWxzZSBpZihtZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkpIHsKLQkJCXJldHVybiBVTUFfQUNUSVZJVFk7Ci0JCX0KLQkJZWxzZSBpZihtZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gVU1BX1RBU0tfREVTQ1JJUFRPUjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0vLwkvKioKLS8vCSAqIENyZWF0ZXMgb3IgdXBkYXRlcyB0aGUgVU1BX0VMRU1FTlQgYW5ub3RhdGlvbiBmb3IgdGhlIGdpdmVuCi0vLwkgKiB7QGxpbmsgRU1vZGVsRWxlbWVudH0gd2l0aCB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgb3IgaXRzIHdyYXBwZXIKLS8vCSAqIAotLy8JICogQHBhcmFtIGVsZW1lbnQKLS8vCSAqIEBwYXJhbSBtZQotLy8JICogQHJldHVybgotLy8JICovCi0vLwlwdWJsaWMgc3RhdGljIEVBbm5vdGF0aW9uIGFkZEVBbm5vdGF0aW9uKEVNb2RlbEVsZW1lbnQgZWxlbWVudCwgT2JqZWN0IGJyZWFrZG93bkVsZW1lbnRPcldyYXBwZXIpIHsKLS8vCQlTdHJpbmcgdXJpU3RyID0gbnVsbDsKLS8vCQlpZihicmVha2Rvd25FbGVtZW50T3JXcmFwcGVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotLy8JCQlVUkkgdXJpID0gZ2V0UHJveHlVUkkoKE1ldGhvZEVsZW1lbnQpIGJyZWFrZG93bkVsZW1lbnRPcldyYXBwZXIpOwotLy8JCQlpZih1cmkgIT0gbnVsbCkgewotLy8JCQkJdXJpU3RyID0gdXJpLnRvU3RyaW5nKCk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJZWxzZSBpZihicmVha2Rvd25FbGVtZW50T3JXcmFwcGVyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotLy8JCQl1cmlTdHIgPSBTdXBwcmVzc2lvbi5nZXRQYXRoKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgYnJlYWtkb3duRWxlbWVudE9yV3JhcHBlcik7Ci0vLwkJfQotLy8JCWlmKHVyaVN0ciAhPSBudWxsKSB7Ci0vLwkJCUVBbm5vdGF0aW9uIGVBbm5vdGF0aW9uID0gZWxlbWVudC5nZXRFQW5ub3RhdGlvbihVTUFfRUxFTUVOVCk7Ci0vLwkJCWlmIChlQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0vLwkJCQllQW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUFubm90YXRpb24oKTsKLS8vCQkJCWVBbm5vdGF0aW9uLnNldFNvdXJjZShVTUFfRUxFTUVOVCk7Ci0vLwkJCQllbGVtZW50LmdldEVBbm5vdGF0aW9ucygpLmFkZChlQW5ub3RhdGlvbik7Ci0vLwkJCX0KLS8vCQkJZUFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dChVTUFfVVJJLCB1cmlTdHIpOwotLy8JCQlyZXR1cm4gZUFubm90YXRpb247Ci0vLwkJfQotLy8JCXJldHVybiBudWxsOwotLy8JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgb3IgdXBkYXRlcyB0aGUgVU1BX0VMRU1FTlQgYW5ub3RhdGlvbiBmb3IgdGhlIGdpdmVuCi0JICoge0BsaW5rIEVNb2RlbEVsZW1lbnR9IHdpdGggdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBFQW5ub3RhdGlvbiBhZGRFQW5ub3RhdGlvbihFTW9kZWxFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RFbGVtZW50IG1lKSB7Ci0JCVVSSSB1cmkgPSBnZXRQcm94eVVSSShtZSk7Ci0JCWlmICh1cmkgIT0gbnVsbCkgewotCQkJRUFubm90YXRpb24gZUFubm90YXRpb24gPSBlbGVtZW50LmdldEVBbm5vdGF0aW9uKFVNQV9FTEVNRU5UKTsKLQkJCWlmIChlQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQkJZUFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQkJZUFubm90YXRpb24uc2V0U291cmNlKFVNQV9FTEVNRU5UKTsKLQkJCQllbGVtZW50LmdldEVBbm5vdGF0aW9ucygpLmFkZChlQW5ub3RhdGlvbik7Ci0JCQl9Ci0JCQllQW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KFVNQV9VUkksIHVyaS50b1N0cmluZygpKTsKLQkJCXJldHVybiBlQW5ub3RhdGlvbjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBBY3Rpdml0eSBnZXRBY3Rpdml0eShFTW9kZWxFbGVtZW50IGUpIHsKLQkJRU9iamVjdCBvID0gZTsKLQkJZm9yKDsgbyAhPSBudWxsICYmICEobyBpbnN0YW5jZW9mIEFjdGl2aXR5KTsgbyA9IG8uZUNvbnRhaW5lcigpKTsKLQkJcmV0dXJuIChBY3Rpdml0eSkgbzsKLQl9Ci0JCi0vLwlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRTZW1hbnRpY01vZGVsRnJvbUFubm90YXRpb24oRU1vZGVsRWxlbWVudCBtb2RlbCwgUHJvY2VzcyBwcm9jZXNzLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotLy8JCUVBbm5vdGF0aW9uIGVBbm5vdGF0aW9uID0gbW9kZWwuZ2V0RUFubm90YXRpb24oVU1BX0VMRU1FTlQpOwotLy8JCWlmIChlQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0vLwkJCVN0cmluZyB1cmlTdHIgPSAoU3RyaW5nKSBlQW5ub3RhdGlvbi5nZXREZXRhaWxzKCkuZ2V0KFVNQV9VUkkpOwotLy8JCQlpZiAodXJpU3RyICE9IG51bGwpIHsKLS8vCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVyaVN0cik7Ci0vLwkJCQlpZihNdWx0aUZpbGVVUklDb252ZXJ0ZXIuU0NIRU1FLmVxdWFscyh1cmkuc2NoZW1lKCkpKSB7Ci0vLwkJCQkJRU9iamVjdCBvID0gcHJvY2Vzcy5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpLmdldEVPYmplY3QodXJpLCBmYWxzZSk7Ci0vLwkJCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0vLwkJCQkJCXJldHVybiAoTWV0aG9kRWxlbWVudCkgbzsKLS8vCQkJCQl9IGVsc2UgewotLy8JCQkJCQkvLyBUT0RPOiBsb2cgZXJyb3IKLS8vCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJOb3QgYSBtZXRob2QgZWxlbWVudDogIiArIG8pOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQkJZWxzZSB7Ci0vLwkJCQkJLy8gbXVzdCBiZSBhIHdyYXBwZXIgcGF0aAotLy8JCQkJCS8vCi0vLwkJCQkJU3RyaW5nW10gZ3VpZFBhdGggPSB1cmkuc2VnbWVudHMoKTsKLS8vCQkJCQlyZXR1cm4gU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24ocHJvY2VzcykuZ2V0T2JqZWN0QnlQYXRoKGd1aWRQYXRoLCBhZGFwdGVyRmFjdG9yeSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJcmV0dXJuIG51bGw7Ci0vLwl9Ci0JCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnRGcm9tQW5ub3RhdGlvbihFTW9kZWxFbGVtZW50IG5vZGUsIFJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7Ci0JCUVBbm5vdGF0aW9uIGVBbm5vdGF0aW9uID0gbm9kZS5nZXRFQW5ub3RhdGlvbihVTUFfRUxFTUVOVCk7Ci0JCWlmIChlQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdXJpID0gKFN0cmluZykgZUFubm90YXRpb24uZ2V0RGV0YWlscygpLmdldChVTUFfVVJJKTsKLQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCUVPYmplY3QgbyA9IHJlc291cmNlU2V0LmdldEVPYmplY3QoCi0JCQkJCQlVUkkuY3JlYXRlVVJJKHVyaSksIGZhbHNlKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIChNZXRob2RFbGVtZW50KSBvOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIk5vdCBhIG1ldGhvZCBlbGVtZW50OiAiICsgbyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgbWV0aG9kIGVsZW1lbnQgdGhhdCB0aGUgZ2l2ZW4gZGlhZ3JhbSBtb2RlbCBvYmplY3QgcmVwcmVzZW50cwotCSAqIGFuZCBzdG9yZXMgdGhlIGxpbmthZ2UgaW5mbyBpbiBpdHMgYW5ub3RhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgdGhlIGRpYWdyYW0gbW9kZWwgb2JqZWN0Ci0JICogQHJldHVybiBtZXRob2QgZWxlbWVudCB0aGF0IHRoZSBtb2RlbCBvYmplY3QgaXMgcmVwcmVzZW50aW5nIG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbW9kZWwgb2JqZWN0IGRvZXMgbm90IHJlcHJlc2VudCBhbnkKLQkgKiAgICAgICAgIG1ldGhvZCBlbGVtZW50IG9yIHRoZSBkaWFncmFtIG9mIHRoZSBtb2RlbCBvYmplY3QgY3VycmVudGx5IGlzCi0JICogICAgICAgICBub3Qgb3BlbmVkIGluIGEgZGlhZ3JhbSBlZGl0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnRGcm9tQW5ub3RhdGlvbihFTW9kZWxFbGVtZW50IG5vZGUpIHsJCQotCQlBY3Rpdml0eSBkaWFncmFtID0gZ2V0QWN0aXZpdHkobm9kZSk7Ci0JCWlmKGRpYWdyYW0gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBnZXROb2RlQWRhcHRlcihkaWFncmFtKTsKLQkJaWYobm9kZUFkYXB0ZXIgPT0gbnVsbCB8fCBub2RlQWRhcHRlci5nZXRFbGVtZW50KCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBub2RlQWRhcHRlci5nZXRFbGVtZW50KCkuZVJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldE1ldGhvZEVsZW1lbnRGcm9tQW5ub3RhdGlvbihub2RlLCByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoRU1vZGVsRWxlbWVudCBub2RlKSB7Ci0JCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQlyZXR1cm4gbm9kZUFkYXB0ZXIgIT0gbnVsbCA/IG5vZGVBZGFwdGVyLmdldEVsZW1lbnQoKQotCQkJCTogZ2V0TWV0aG9kRWxlbWVudEZyb21Bbm5vdGF0aW9uKG5vZGUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTm9kZUFkYXB0ZXIgZ2V0Tm9kZUFkYXB0ZXIoRU9iamVjdCBub2RlKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZUFkYXB0ZXJzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGFkYXB0ZXIgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIE5vZGVBZGFwdGVyKSB7Ci0JCQkJCXJldHVybiAoTm9kZUFkYXB0ZXIpIGFkYXB0ZXI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIERpYWdyYW1BZGFwdGVyIGdldERpYWdyYW1BZGFwdGVyKEVPYmplY3Qgbm9kZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2RlLmVBZGFwdGVycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgRGlhZ3JhbUFkYXB0ZXIpIHsKLQkJCQlyZXR1cm4gKERpYWdyYW1BZGFwdGVyKSBhZGFwdGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0byBnZXQgdGhlIHNvdXJjZXMgb2YgU3luY0JhciAoRm9ya05vZGUgb3IgSm9pbk5vZGUpIGluQ29tbWluZwotCSAqIGNvbm5lY3Rpb25zIGFuZCBpZiBzeW5jYmFyIGhhdmUgaW5jb21pbmcgY29ubmVjdGlvbiBmcm9tIGRlY2lzaW9uIHBvaW50LAotCSAqIGFuZCBkZWNpc2lvbiBwb2ludCBoYXZlIGluY29tbWluZyBjb25uZWN0aW9ucyAod29ya2JyZWFkZG93biBlbGVtdG5zKQotCSAqIGNvbGxlY3Rpb25zIHdpbGwgaWdub3JlIGFsbCB0aGUgaW5jb21pbmcgY29ubmVjdGlvbiBmcm9tIGRlY2lzaW9uIHBvaW50LgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0U3luY0JhclNvdXJjZU5vZGVzKEFjdGl2aXR5Tm9kZSBub2RlLAotCQkJQ29sbGVjdGlvbiBhY3ROb2RlcykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2RlLmdldEluY29taW5ncygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyLm5leHQoKTsKLQkJCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCQkJaWYgKGdldE1ldGhvZEVsZW1lbnQoc291cmNlKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJYWN0Tm9kZXMuYWRkKHNvdXJjZSk7Ci0JCQl9IGVsc2UgaWYgKGlzU3luY2hCYXIoc291cmNlKSkgewotCQkJCWdldFN5bmNCYXJTb3VyY2VOb2Rlcyhzb3VyY2UsIGFjdE5vZGVzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIG5vZGVzIHdpdGggdGhlIGdpdmVuIHR5cGUgdGhhdCBhcmUgZGlyZWN0IG9yIGluZGlyZWN0IHRhcmdldHMgb2YKLQkgKiB0aGUgZ2l2ZW4gbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0Tm9kZXMKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBtZXRob2QgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIHZpZXcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0VGFyZ2V0Tm9kZXMoQ29sbGVjdGlvbiBhY3ROb2RlcywgQWN0aXZpdHlOb2RlIG5vZGUsCi0JCQlDbGFzcyB0eXBlKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZ2V0T3V0Z29pbmdzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyLm5leHQoKTsKLQkJCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gbGluay5nZXRUYXJnZXQoKTsKLQkJCQlpZiAodHlwZS5pc0luc3RhbmNlKGdldE1ldGhvZEVsZW1lbnQodGFyZ2V0KSkpIHsKLQkJCQkJYWN0Tm9kZXMuYWRkKHRhcmdldCk7Ci0JCQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBDb250cm9sTm9kZSkgewotCQkJCQlnZXRUYXJnZXROb2RlcyhhY3ROb2RlcywgdGFyZ2V0LCB0eXBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFN1Y2Nlc3Nvck5vZGVzKENvbGxlY3Rpb248QWN0aXZpdHlOb2RlPiBhY3ROb2RlcywgQWN0aXZpdHlOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJZm9yIChBY3Rpdml0eUVkZ2UgbGluayA6IG5vZGUuZ2V0T3V0Z29pbmdzKCkpIHsKLQkJCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gbGluay5nZXRUYXJnZXQoKTsKLQkJCQlpZiAoZ2V0TWV0aG9kRWxlbWVudCh0YXJnZXQpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJYWN0Tm9kZXMuYWRkKHRhcmdldCk7Ci0JCQkJfSBlbHNlIGlmIChpc1N5bmNoQmFyKHRhcmdldCkpIHsKLQkJCQkJZ2V0U3VjY2Vzc29yTm9kZXMoYWN0Tm9kZXMsIHRhcmdldCk7Ci0JCQkJfQotCQkJfQotCQl9CQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFByZWRlY2Vzc29yTm9kZXMoQ29sbGVjdGlvbjxBY3Rpdml0eU5vZGU+IGFjdE5vZGVzLCBBY3Rpdml0eU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlmb3IgKEFjdGl2aXR5RWRnZSBsaW5rIDogbm9kZS5nZXRJbmNvbWluZ3MoKSkgewotCQkJCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCQkJCWlmIChnZXRNZXRob2RFbGVtZW50KHNvdXJjZSkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQlhY3ROb2Rlcy5hZGQoc291cmNlKTsKLQkJCQl9IGVsc2UgaWYgKGlzU3luY2hCYXIoc291cmNlKSkgewotCQkJCQlnZXRQcmVkZWNlc3Nvck5vZGVzKGFjdE5vZGVzLCBzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIEdldHMgYWxsIG5vZGVzIHdpdGggdGhlIGdpdmVuIHR5cGUgdGhhdCBhcmUgZGlyZWN0IG9yIGluZGlyZWN0IHNvdXJjZXMgb2YKLQkgKiB0aGUgZ2l2ZW4gbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0Tm9kZXMKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBtZXRob2QgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIHZpZXcKLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRTb3VyY2VOb2RlcyhDb2xsZWN0aW9uIGFjdE5vZGVzLCBBY3Rpdml0eU5vZGUgbm9kZSwKLQkJCUNsYXNzIHR5cGUpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRJbmNvbWluZ3MoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpdml0eUVkZ2UgbGluayA9IChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCQkJCWlmICh0eXBlLmlzSW5zdGFuY2UoZ2V0TWV0aG9kRWxlbWVudChzb3VyY2UpKSkgewotCQkJCQlhY3ROb2Rlcy5hZGQoc291cmNlKTsKLQkJCQl9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIENvbnRyb2xOb2RlKSB7Ci0JCQkJCWdldFNvdXJjZU5vZGVzKGFjdE5vZGVzLCBzb3VyY2UsIHR5cGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKgotCSAqIE1ldGhvZCB0byBjb2xsZWN0IHN5bmNocm9uaXphdGlvbiBiYXIgb3V0Z29pbmcgY29ubmVjdGlvbgotCSAqIGV4Y2VwdCBhbnkgY29ubmVjdGlvbiBnb2luZyB0byBkZWNpc2lvbiBwb2ludHMuICAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0U3luY0JhclRhcmdldE5vZGVzKEFjdGl2aXR5Tm9kZSB0eXBlZE5vZGUsIENvbGxlY3Rpb24gYWN0Tm9kZXMpewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlZE5vZGUuZ2V0T3V0Z29pbmdzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyLm5leHQoKTsKLQkJCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gbGluay5nZXRUYXJnZXQoKTsKLQkJCQlpZihCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCh0YXJnZXQpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpewotCQkJCQlhY3ROb2Rlcy5hZGQodGFyZ2V0KTsKLQkJCQl9IGVsc2UgaWYgKGlzU3luY2hCYXIodGFyZ2V0KSkgewotCQkJCQlnZXRTeW5jQmFyVGFyZ2V0Tm9kZXModGFyZ2V0LCBhY3ROb2Rlcyk7Ci0JCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIE1ldGhvZCB0byBjaGVjayBiZWZvcmUgZGVsZXRpbmcgYSBsaW5rLiBJZiBkdXBsaWNhdGUgcHJlZGVjZXNzb3IgZXhpc3RzCi0JICogaW4gdGhlIGxlZ2FjeSBkYXRhLCBjaGVjayBpZiBkZWxldGluZyBsaW5rIHNob3VsZCByZW1vdmUgYWxsIHRoZQotCSAqIHByZWRlY2Vzc29ycyBvciBub3QgYnkgdmVyaWZ5aW5nIGlmIHRhcmdldCBvciBpbmRpcmVjdCB0YXJnZXQgaGF2ZSBkaXJlY3QKLQkgKiBvciBpbmRpcmVjdCBsaW5rcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuUmVtb3ZlQWxsUHJlZHMoQWN0aXZpdHlFZGdlIGxpbmssIEFjdGl2aXR5Tm9kZSBvbGRTb3VyY2UsCi0JCQlBY3Rpdml0eU5vZGUgb2xkVGFyZ2V0KSB7Ci0JCU1ldGhvZEVsZW1lbnQgdGFyZ2V0RWxlbWVudCA9IGdldE1ldGhvZEVsZW1lbnQob2xkVGFyZ2V0KTsKLQkJaWYgKHRhcmdldEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJTGlzdCBpbmxpc3QgPSBvbGRUYXJnZXQuZ2V0SW5jb21pbmdzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBpbmxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aXZpdHlFZGdlIGluY29taW5nbGluayA9IChBY3Rpdml0eUVkZ2UpIGl0b3IubmV4dCgpOwotCQkJCS8vIFJBVExDMDAzODQyNDUgOiBQcmVkZWNlc3NvciBjaGFuZ2VzIHNob3VsZCBiZSBkb25lIG9ubHkgaW4KLQkJCQkvLyBjYXNlIG9mIFN5bmNocm9uaXphdGlvbiBCYXIuCi0JCQkJaWYgKGlzU3luY2hCYXIoaW5jb21pbmdsaW5rLmdldFNvdXJjZSgpKSkgewotCQkJCQlDb2xsZWN0aW9uIGNvbCA9IG5ldyBBcnJheUxpc3QoKTsgCi0JCQkJCWdldFNvdXJjZU5vZGVzKGNvbCwgaW5jb21pbmdsaW5rLmdldFNvdXJjZSgpLAotCQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzKTsKLQkJCQkJaWYgKGNvbC5jb250YWlucyhvbGRTb3VyY2UpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGluY29taW5nbGluay5nZXRTb3VyY2UoKSAhPSBudWxsICYmCi0JCQkJCQlnZXRNZXRob2RFbGVtZW50KGluY29taW5nbGluay5nZXRTb3VyY2UoKSkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQlpZiAoaW5jb21pbmdsaW5rLmdldFNvdXJjZSgpLmVxdWFscyhvbGRTb3VyY2UpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1hcmtJbmhlcml0ZWQoRU1vZGVsRWxlbWVudCBlbGVtZW50KSB7Ci0JCUVBbm5vdGF0aW9uIGVBbm5vdGF0aW9uID0gZWxlbWVudC5nZXRFQW5ub3RhdGlvbihBTk5PVEFUSU9OX0lOSEVSSVJFRCk7Ci0JCWlmIChlQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQllQW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCWVBbm5vdGF0aW9uLnNldFNvdXJjZShBTk5PVEFUSU9OX0lOSEVSSVJFRCk7Ci0JCQllbGVtZW50LmdldEVBbm5vdGF0aW9ucygpLmFkZChlQW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIHVubWFya0luSGVyaXRlZChFTW9kZWxFbGVtZW50IGVsZW1lbnQpIHsKLQkJRUFubm90YXRpb24gZUFubm90YXRpb24gPSBlbGVtZW50LmdldEVBbm5vdGF0aW9uKEFOTk9UQVRJT05fSU5IRVJJUkVEKTsKLQkJaWYgKGVBbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCWVsZW1lbnQuZ2V0RUFubm90YXRpb25zKCkucmVtb3ZlKGVBbm5vdGF0aW9uKTsKLQkJfQotCX0KLQkKLQotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbSBjb3B5RGlhZ3JhbShEaWFncmFtIGJhc2VEaWFncmFtKSB7Ci0JCURpYWdyYW0gY29weSA9IChEaWFncmFtKSBFY29yZVV0aWwuY29weShiYXNlRGlhZ3JhbSk7Ci0KLQkJLy8gSEFDSzoKLQkJLy8gZ28gdGhydSB0aGUgbm9kZXMgb2YgdGhlIGRpYWdyYW0gY29weSwgaWYgYW55IG5vZGUgaXMgYSBVSS1vbmx5IG5vZGUKLQkJLy8gKHNlZSBUeXBlZE5vZGUpCi0JCS8vIHNhdmUgdGhlIEdVSUQgb2YgdGhlIG9yaWdpbmFsIG9uZSBpbiBpdHMgYnJpZWZEZXNjcmlwdGlvbiB0byByZW1lbWJlcgotCQkvLyB3aG8gaXMgYmFzZS4KLQkJLy8KLS8vCQlpbnQgc2l6ZSA9IGNvcHkuZ2V0Q29udGFpbmVkKCkuc2l6ZSgpOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0vLwkJCUdyYXBoTm9kZSBnTm9kZSA9IChHcmFwaE5vZGUpIGNvcHkuZ2V0Q29udGFpbmVkKCkuZ2V0KGkpOwotLy8JCQlpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5pc1VJR3JhcGhOb2RlKGdOb2RlKSkgewotLy8JCQkJZ05vZGUuc2V0QnJpZWZEZXNjcmlwdGlvbigoKERpYWdyYW1FbGVtZW50KSBiYXNlRGlhZ3JhbQotLy8JCQkJCQkuZ2V0Q29udGFpbmVkKCkuZ2V0KGkpKS5nZXRHdWlkKCkpOwotLy8JCQl9Ci0vLwkJfQotCQlMaXN0IGNoaWxkcmVuID0gY29weS5nZXRDaGlsZHJlbigpOwotCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsJCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJVmlldyB2aWV3ID0gKFZpZXcpIGNoaWxkcmVuLmdldChpKTsKLQkJCW1hcmtJbmhlcml0ZWQodmlldyk7Ci0JCX0KLQotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVMaXN0IGFkZEVBbm5vdGF0aW9uRGV0YWlsKEVNb2RlbEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGRldGFpbE5hbWUsIFN0cmluZyBkZXRhaWxWYWx1ZSApIHsKLQkJRUFubm90YXRpb24gZUFubm90YXRpb24gPSBlbGVtZW50LmdldEVBbm5vdGF0aW9uKFVNQV9FTEVNRU5UKTsKLQkJaWYgKGVBbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCWVBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJZUFubm90YXRpb24uc2V0U291cmNlKFVNQV9FTEVNRU5UKTsKLQkJCS8vIGRldGFpbCBtdXN0IGJlIHB1dCBiZWZvcmUgdGhlIG5ldyBhbm5vdGF0aW9uIGNhbiBiZSBhZGRlZCB0byB0aGUgYW5ub3RhdGlvbiBsaXN0Ci0JCQkvLyBzbyBhbnkgYWRhcHRlciB0aGF0IGxpc3RlbiB0byBjaGFuZ2UgaW4gdGhlIGFubm90YXRpb24gbGlzdCBjYW4gZ2V0IHRoZSBkZXRhaWxzCi0JCQkvLyB3aGVuIGl0IGdldHMgbm90aWZpZWQuCi0JCQkvLwotCQkJZUFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dChVTUFfVFlQRSwgZGV0YWlsVmFsdWUpOwotCQkJZWxlbWVudC5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoZUFubm90YXRpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJZUFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dChVTUFfVFlQRSwgZGV0YWlsVmFsdWUpOwotCQl9CQkKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0RUFubm90YXRpb25zKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW5kL29yIGFkZHMgdGhlIGVBbm5vdGF0aW9uIGRldGFpbCBmb3IgdHlwZS4ge0BsaW5rIEJyaWRnZUhlbHBlci5VTUFfVFlQRX0KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSB0eXBlCi0JICovCi0JcHVibGljIHN0YXRpYyBFTGlzdCBhZGRFQW5ub3RhdGlvblR5cGUoRU1vZGVsRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdHlwZSkgewotCQlFTGlzdCByZXN1bHQgPSBhZGRFQW5ub3RhdGlvbkRldGFpbChlbGVtZW50LCBVTUFfVFlQRSwgdHlwZSk7Ci0JCQotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlBY3Rpdml0eU5vZGUgbm9kZSA9IChBY3Rpdml0eU5vZGUpIGVsZW1lbnQ7Ci0vLwkJCUFjdGl2aXR5UGFyYW1ldGVyTm9kZSBub2RlID0gKEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgZWxlbWVudDsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG5vZGUpOwkJCQkKLQkJCWlmKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50ICYmIAotCQkJCQl0eXBlICE9IG51bGwgJiYgIXR5cGUuZXF1YWxzKEJyaWRnZUhlbHBlci5nZXRUeXBlKGUpKSkgewotCQkJCS8vIHJlcGxhY2UgdGhlIGN1cnJlbnRseSBsaW5rZWQgbWV0aG9kIGVsZW1lbnQgd2l0aCB0aGUgcmlnaHQgb25lCi0JCQkJLy8KLQkJCQlFQ2xhc3MgcmlnaHRUeXBlID0gZ2V0VHlwZSh0eXBlKTsKLQkJCQlpZihyaWdodFR5cGUgIT0gbnVsbCkgewotCQkJCQlCcmVha2Rvd25FbGVtZW50IHJpZ2h0RWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUocmlnaHRUeXBlKTsKLQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSBhY3Rpdml0eSA9ICgoQnJlYWtkb3duRWxlbWVudCllKS5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCQkJaWYoYWN0aXZpdHkgIT0gbnVsbCkgewotCQkJCQkJTGlzdCBsaXN0ID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCQkJCWxpc3Quc2V0KGxpc3QuaW5kZXhPZihlKSwgcmlnaHRFbGVtZW50KTsKLQkJCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgYWN0aXZpdHkuZUNvbnRhaW5lcigpOwotCQkJCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChyaWdodEVsZW1lbnQpOwotCQkJCQkJCS8vIEFsc28gc2V0IHRoZSByaWdodEVsZW1lbnQgdG8gaXRzIG93biBwcm9jZXNzIHBhY2thZ2UuCi0JCQkJCQkJTGlzdCBjaGlsZFBrZ3MgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQkJCQkJCWlmICghY2hpbGRQa2dzLmlzRW1wdHkoKSkgewotCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpCi0JCQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJUHJvY2Vzc1BhY2thZ2UgY2hpbGQgPSAoUHJvY2Vzc1BhY2thZ2UpIGl0ZXIKLQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCQlMaXN0PFByb2Nlc3NFbGVtZW50PiBwTGlzdCA9IGNoaWxkCi0JCQkJCQkJCQkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCk7Ci0JCQkJCQkJCQlpZiAoIXBMaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJCQkJCWlmIChwTGlzdC5jb250YWlucyhlKSkgewotCQkJCQkJCQkJCQlwTGlzdC5zZXQocExpc3QuaW5kZXhPZihlKSwKLQkJCQkJCQkJCQkJCQlyaWdodEVsZW1lbnQpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJLy8gYXNzb2NpYXRlIHRoZSBuZXcgbWV0aG9kIGVsZW1lbnQgd2l0aCB0aGUgbm9kZQotCQkJCQkJLy8KLQkJCQkJCWFzc29jaWF0ZShub2RlLCByaWdodEVsZW1lbnQpOwotCQkJCQkJLy8gcmVtb3ZlIG9sZCBub2RlIGFkYXB0ZXIgYW5kIGFkZCBuZXcgb25lCi0JCQkJCQkvLwotCQkJCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZSk7Ci0JCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQkJbm9kZUFkYXB0ZXIuZGlzcG9zZSgpOwotCQkJCQkJfQkJCQkJCi0JCQkJCQlEaWFncmFtQWRhcHRlciBkaWFncmFtQWRhcHRlciA9IChEaWFncmFtQWRhcHRlcikgZ2V0Tm9kZUFkYXB0ZXIobm9kZS5nZXRBY3Rpdml0eSgpKTsKLQkJCQkJCWRpYWdyYW1BZGFwdGVyLmFkZE5vZGVBZGFwdGVyVG8obm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIFRvIGdldCB0aGUgZUFubm90YXRpb24gZGV0YWlsIGJhc2VkIG9uIG5hbWUuIChlZzogdHlwZSkKLQkgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0RUFubm90YXRpb25EZXRhaWwoRU1vZGVsRWxlbWVudCwgU3RyaW5nKX0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFQW5ub3RhdGlvblR5cGUoRU1vZGVsRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgZGV0YWlsTmFtZSkgewotCQlyZXR1cm4gZ2V0RUFubm90YXRpb25EZXRhaWwoZWxlbWVudCwgZGV0YWlsTmFtZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVBbm5vdGF0aW9uRGV0YWlsKEVNb2RlbEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGRldGFpbE5hbWUpIHsKLQkJRUFubm90YXRpb24gZUFubm90YXRpb24gPSBlbGVtZW50LmdldEVBbm5vdGF0aW9uKFVNQV9FTEVNRU5UKTsKLQkJaWYoZUFubm90YXRpb24gIT0gbnVsbCl7Ci0JCQlyZXR1cm4gKFN0cmluZyllQW5ub3RhdGlvbi5nZXREZXRhaWxzKCkuZ2V0KGRldGFpbE5hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlKEFjdGl2aXR5Tm9kZSBub2RlKSB7Ci0JCXJldHVybiBnZXRFQW5ub3RhdGlvbkRldGFpbChub2RlLCBVTUFfVFlQRSk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBvbmUgb2YgdGhlIHR5cGUgY29uc3RhbnRzOiB7QGxpbmsgI1VNQV9BQ1RJVklUWX0sCi0JICogICAgICAgICB7QGxpbmsgI1VNQV9JVEVSQVRJT059LCB7QGxpbmsgI1VNQV9NSUxFU1RPTkV9LAotCSAqICAgICAgICAge0BsaW5rICNVTUFfUEhBU0V9LCB7QGxpbmsgI1VNQV9UQVNLX0RFU0NSSVBUT1J9LAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGUoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCWlmKGUgaW5zdGFuY2VvZiBJdGVyYXRpb24pIHsKLQkJCXJldHVybiBVTUFfSVRFUkFUSU9OOwotCQl9Ci0JCWVsc2UgaWYoZSBpbnN0YW5jZW9mIFBoYXNlKSB7Ci0JCQlyZXR1cm4gVU1BX1BIQVNFOwotCQl9Ci0JCWVsc2UgaWYoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkpIHsKLQkJCXJldHVybiBVTUFfQUNUSVZJVFk7Ci0JCX0KLQkJZWxzZSBpZihlIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQlyZXR1cm4gVU1BX01JTEVTVE9ORTsKLQkJfQotCQllbHNlIGlmKGUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIFVNQV9UQVNLX0RFU0NSSVBUT1I7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbmhlcml0ZWQoRU1vZGVsRWxlbWVudCBlKXsKLQkJRUFubm90YXRpb24gZUFubm90YXRpb24gPSBlLmdldEVBbm5vdGF0aW9uKEFOTk9UQVRJT05fSU5IRVJJUkVEKTsKLQkJaWYgKGVBbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyBzb3VyY2UgPSBlQW5ub3RhdGlvbi5nZXRTb3VyY2UoKTsKLQkJCWlmKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZS5sZW5ndGgoKSA+IDApewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRUNsYXNzIGdldEVDbGFzc0Zyb21UeXBlKFN0cmluZyBhbm5vdGF0aW9uVHlwZSkgewotCQlpZihVTUFfQUNUSVZJVFkuZXF1YWxzKGFubm90YXRpb25UeXBlKSkgewotCQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JCX0KLQkJZWxzZSBpZihVTUFfSVRFUkFUSU9OLmVxdWFscyhhbm5vdGF0aW9uVHlwZSkpIHsKLQkJCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRJdGVyYXRpb24oKTsKLQkJfSBlbHNlIGlmKFVNQV9NSUxFU1RPTkUuZXF1YWxzKGFubm90YXRpb25UeXBlKSkgewotCQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1pbGVzdG9uZSgpOwotCQl9IGVsc2UgaWYoVU1BX1BIQVNFLmVxdWFscyhhbm5vdGF0aW9uVHlwZSkpIHsKLQkJCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQaGFzZSgpOwotCQl9IGVsc2UgaWYoVU1BX1RBU0tfREVTQ1JJUFRPUi5lcXVhbHMoYW5ub3RhdGlvblR5cGUpKSB7Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3IoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHROYW1lKEFjdGl2aXR5Tm9kZSBub2RlKSB7Ci0JCUFjdGl2aXR5IHBhcmVudEFjdCA9IG5vZGUuZ2V0QWN0aXZpdHkoKTsKLQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQocGFyZW50QWN0KTsKLQkJTWV0aG9kRWxlbWVudCBvYmogPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChub2RlKTsKLQkJaW50IGNsYXNzSUQgPSBvYmouZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCk7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkgYWN0ID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkpIGVsZW1lbnQ7Ci0JCUFycmF5TGlzdCBzaWJsaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZS5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKSA9PSBjbGFzc0lEKSB7Ci0JCQkJc2libGluZ3MuYWRkKGUpOwotCQkJfQotCQl9Ci0JCVN0cmluZyBiYXNlTmFtZSA9IE1lc3NhZ2VGb3JtYXQKLQkJCQkuZm9ybWF0KAotCQkJCQkJRGlhZ3JhbVJlc291cmNlcy5kZWZhdWx0QmFzZU5hbWUsIG5ldyBPYmplY3RbXSB7IFRuZ1V0aWwuZ2V0VHlwZVRleHQob2JqLmVDbGFzcygpLmdldE5hbWUoKSkgfSk7IAotCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKHNpYmxpbmdzLCBvYmosIGJhc2VOYW1lKTsKLQkJbm9kZS5zZXROYW1lKG9iai5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFZpZXcgZ2V0VmlldyhWaWV3IGRpYWdyYW0sIE9iamVjdCBub2RlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVZpZXcgY2hpbGQgPSAoVmlldykgaXRlci5uZXh0KCk7Ci0JCQlpZihjaGlsZC5nZXRFbGVtZW50KCkgPT0gbm9kZSkgewotCQkJCXJldHVybiBjaGlsZDsKLQkJCX0KLQkJCWlmKGNoaWxkLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uKXsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY2hpbGQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJVmlldyBlbGVtZW50ID0gKFZpZXcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYoZWxlbWVudC5nZXRFbGVtZW50KCkgPT0gbm9kZSkgewotCQkJCQkJcmV0dXJuIGNoaWxkOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgbm9kZSBuYW1lIGZvciB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWlmKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgZSk7Ci0JCX0KLQkJZWxzZSBpZihlIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChEZXNjcmliYWJsZUVsZW1lbnQpZSkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIGUuZ2V0TmFtZSgpOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvQ29udHJvbE5vZGVBZGFwdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2JyaWRnZS9Db250cm9sTm9kZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVlZDM0YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2JyaWRnZS9Db250cm9sTm9kZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sTm9kZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xOb2RlQWRhcHRlciBleHRlbmRzIE5vZGVBZGFwdGVyIHsKLQotCXByb3RlY3RlZCBib29sZWFuIGFkZFRvVU1BKEFjdGl2aXR5RWRnZSBsaW5rKSB7Ci0JCWlmICghc3VwZXIuYWRkVG9VTUEobGluaykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJTWV0aG9kRWxlbWVudCBzcmNFbGVtZW50ID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobGluay5nZXRTb3VyY2UoKSk7Ci0JCWlmIChzcmNFbGVtZW50IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCWlmIChCcmlkZ2VIZWxwZXIuaXNTeW5jaEJhcihsaW5rLmdldFRhcmdldCgpKSkgewotCQkJCUNvbGxlY3Rpb24gdGFyZ2V0QWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJQnJpZGdlSGVscGVyLmdldFN5bmNCYXJUYXJnZXROb2RlcyhsaW5rCi0JCQkJCQkuZ2V0VGFyZ2V0KCksIHRhcmdldEFjdE5vZGVzKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXRBY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSAoQWN0aXZpdHlOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgdGFyZ2V0RWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSk7Ci0JCQkJCWlmIChVbWFVdGlsLmZpbmRXb3JrT3JkZXIodGFyZ2V0RWxlbWVudCwgc3JjRWxlbWVudCkgPT0gbnVsbCkgewotCQkJCQkJYWRkRGVmYXVsdFdvcmtPcmRlcihub2RlLCAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHNyY0VsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKEJyaWRnZUhlbHBlci5pc1N5bmNoQmFyKGxpbmsuZ2V0U291cmNlKCkpKSB7Ci0JCQkvLyBQcmVkZWNlc3NvciBzaG91bGQgYmUgY3JlYXRlZCBvbmx5IGluIGNhc2Ugb2YKLQkJCS8vIFN5bmNyb25pemF0aW9uIEJhciwgbm90IGZvciBEZWNpc2lvblBvaW50LgotCQkJQ29sbGVjdGlvbiBzcmNBY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUJyaWRnZUhlbHBlci5nZXRTeW5jQmFyU291cmNlTm9kZXMobGluay5nZXRTb3VyY2UoKSwgc3JjQWN0Tm9kZXMpOwotCQkJQ29sbGVjdGlvbiB0YXJnZXRBY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUJyaWRnZUhlbHBlci5nZXRTeW5jQmFyVGFyZ2V0Tm9kZXMobGluay5nZXRUYXJnZXQoKSwgdGFyZ2V0QWN0Tm9kZXMpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXRBY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpdml0eU5vZGUgbm9kZSA9ICgoQWN0aXZpdHlOb2RlKSBpdGVyLm5leHQoKSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNyY0FjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgQnJpZGdlSGVscGVyCi0JCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgoQWN0aXZpdHlOb2RlKSBpdGVyYXRvci5uZXh0KCkpOwotCQkJCQlpZiAoVW1hVXRpbC5maW5kV29ya09yZGVyKChXb3JrQnJlYWtkb3duRWxlbWVudCkgQnJpZGdlSGVscGVyCi0JCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQobm9kZSksIHByZWQpID09IG51bGwpIHsKLQkJCQkJCWFkZERlZmF1bHRXb3JrT3JkZXIobm9kZSwgcHJlZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVVNQShBY3Rpdml0eUVkZ2UgbGluaywgQWN0aXZpdHlOb2RlIG9sZFNvdXJjZSwgQWN0aXZpdHlOb2RlIG9sZFRhcmdldCkgewotCQlDb2xsZWN0aW9uIHNyY0FjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwkJCQotCQlCcmlkZ2VIZWxwZXIuZ2V0U291cmNlTm9kZXMoc3JjQWN0Tm9kZXMsIG9sZFNvdXJjZSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpOwotCQlNZXRob2RFbGVtZW50IHRhcmdldEVsZW1lbnQgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChvbGRUYXJnZXQpOwotCQlpZiAodGFyZ2V0RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCB0YXJnZXRXYmUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHRhcmdldEVsZW1lbnQ7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc3JjQWN0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCS8vIE9iamVjdCBwcmVkID0gKChOb2RlKSBpdGVyYXRvci5uZXh0KCkpLmdldE9iamVjdCgpOwotCQkJCS8vIEdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlV29ya09yZGVyKChOYW1lZE5vZGVJbXBsKQotCQkJCS8vIG9sZFRhcmdldCwgcHJlZCk7Ci0JCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSAoQWN0aXZpdHlOb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKEJyaWRnZUhlbHBlci5jYW5SZW1vdmVBbGxQcmVkcyhsaW5rLCBub2RlLCBvbGRUYXJnZXQpKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgc3JjRWxlbWVudCA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG5vZGUpOwkJCQkJCi0JCQkJCVdvcmtPcmRlciB3bzsKLQkJCQkJd2hpbGUgKCh3byA9IFVtYVV0aWwuZmluZFdvcmtPcmRlcih0YXJnZXRXYmUsIHNyY0VsZW1lbnQpKSAhPSBudWxsKSB7Ci0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB0YXJnZXRXYmUsIAotCQkJCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1IsIHdvLCAtMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAob2xkVGFyZ2V0IGluc3RhbmNlb2YgQ29udHJvbE5vZGUpIHsKLQkJCUNvbGxlY3Rpb24gdGFyZ2V0QWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlCcmlkZ2VIZWxwZXIuZ2V0VGFyZ2V0Tm9kZXModGFyZ2V0QWN0Tm9kZXMsCi0JCQkJCW9sZFRhcmdldCwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpOwotCi0JCQkvLyByZW1vdmUgdGhlIHdvcmsgb3JkZXJzIG9mIHRhcmdldCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSB0aGUKLQkJCS8vIHByZWRlY2Vzc29yIGluIHNyY0FjdE5vZGVzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFyZ2V0QWN0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSAoKEFjdGl2aXR5Tm9kZSkgaXRlci5uZXh0KCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzcmNBY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJLy8gT2JqZWN0IHByZWQgPSAoKE5vZGUpIGl0ZXJhdG9yLm5leHQoKSkuZ2V0T2JqZWN0KCk7Ci0JCQkJCS8vIEdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlV29ya09yZGVyKG5vZGUsIHByZWQpOwotCQkJCQlBY3Rpdml0eU5vZGUgcHJlZG5vZGUgPSAoQWN0aXZpdHlOb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChCcmlkZ2VIZWxwZXIuY2FuUmVtb3ZlQWxsUHJlZHMobGluaywgcHJlZG5vZGUsCi0JCQkJCQkJbm9kZSkpIHsKLQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHRhcmdldEUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG5vZGUpOwotCQkJCQkJTWV0aG9kRWxlbWVudCBzcmNFbGVtZW50ID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQocHJlZG5vZGUpOwotCQkJCQkJV29ya09yZGVyIHdvOwotCQkJCQkJd2hpbGUgKCh3byA9IFVtYVV0aWwuZmluZFdvcmtPcmRlcih0YXJnZXRFLCBzcmNFbGVtZW50KSkgIT0gbnVsbCkgewotCQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHRhcmdldEUsIAotCQkJCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SLCB3bywgLTEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3VwZXIucmVtb3ZlRnJvbVVNQShsaW5rLCBvbGRTb3VyY2UsIG9sZFRhcmdldCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvRGlhZ3JhbUFkYXB0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL0RpYWdyYW1BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWNmNWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvRGlhZ3JhbUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJvbGxiYWNrRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5UeFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5BY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcnRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiAKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1BZGFwdGVyIGV4dGVuZHMgTm9kZUFkYXB0ZXIgewotCi0JcHJpdmF0ZSBBY3Rpdml0eSBiYXNlQWN0OwotCi0JcHJvdGVjdGVkIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbjsKLQotCXByb3RlY3RlZCBsb25nIHVtYUxhc3RNb2RpZmllZDsKLQotCi0JcHVibGljIERpYWdyYW1BZGFwdGVyKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJdGhpcygoQWN0aXZpdHkpIFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpKTsKLQkJdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKLQkJYmFzaWNTZXRUYXJnZXRSZWFkT25seSh3cmFwcGVyLmlzUmVhZE9ubHkoKSk7Ci0JfQotCi0JcHVibGljIERpYWdyYW1BZGFwdGVyKEFjdGl2aXR5IGUpIHsKLQkJc3VwZXIoZSk7Ci0KLQkJLy8gbGlzdGVucyB0byBjaGFuZ2UgaW4gdGhlIGJhc2UgYWN0aXZpdHkgaWYgdGhlcmUgaXMgYW55Ci0JCS8vCi0JCWlmIChQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhlKSkgewotCQkJYmFzZUFjdCA9IChBY3Rpdml0eSkgZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQliYXNlQWN0LmVBZGFwdGVycygpLmFkZChtZXRob2RFbGVtZW50QWRhcHRlcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkaXNwb3NlIGFsbCBub2RlIGFkYXB0ZXJzIG9mIHRoZSBjaGlsZCBub2RlcwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSAoQWN0aXZpdHlOb2RlKSBpdGVyLm5leHQoKTsKLQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQkJaWYgKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQlub2RlQWRhcHRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQotCQlpZiAoYmFzZUFjdCAhPSBudWxsKSB7Ci0JCQliYXNlQWN0LmVBZGFwdGVycygpLnJlbW92ZShtZXRob2RFbGVtZW50QWRhcHRlcik7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBBY3Rpdml0eUFkYXB0ZXIgZXh0ZW5kcyBNZXRob2RFbGVtZW50QWRhcHRlciB7Ci0JCXByb3RlY3RlZCBDb2xsZWN0aW9uIGhhbmRsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlDb2xsZWN0aW9uIG5ld05vZGVzVG9SZWZyZXNoID0gbmV3IEFycmF5TGlzdCgpOwotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKEFjdGl2aXR5LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCUFjdGl2aXR5Tm9kZSBub2RlID0gKEFjdGl2aXR5Tm9kZSkgYWRkTm9kZShtc2cKLQkJCQkJCQkuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJCWlmIChtc2cuZ2V0Tm90aWZpZXIoKSA9PSBiYXNlQWN0KSB7Ci0JCQkJCQkJQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpCi0JCQkJCQkJCQkuYmFzaWNTZXRUYXJnZXRSZWFkT25seSh0cnVlKTsKLQkJCQkJCQluZXdOb2Rlc1RvUmVmcmVzaC5hZGQobm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQlyZW1vdmVOb2RlKG1zZy5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCUNvbGxlY3Rpb24gbm9kZXMgPSBhZGROb2RlcygoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpOwotCQkJCQlpZiAobXNnLmdldE5vdGlmaWVyKCkgPT0gYmFzZUFjdCkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJbm9kZSA9IChBY3Rpdml0eU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQkJCUJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihub2RlKQotCQkJCQkJCQkJLmJhc2ljU2V0VGFyZ2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJCQkJbmV3Tm9kZXNUb1JlZnJlc2guYWRkKG5vZGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQlyZW1vdmVOb2RlcygoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5NT1ZFOgotCQkJCQltb3ZlTm9kZShtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKLQkJCQkJcmVwbGFjZU5vZGUobXNnLmdldE9sZFZhbHVlKCksIG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uKG1zZyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3Tm9kZXNUb1JlZnJlc2g7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJc3dpdGNoKG1zZy5nZXRGZWF0dXJlSUQob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkuY2xhc3MpKSB7Ci0JCWNhc2UgVU1MUGFja2FnZS5BQ1RJVklUWV9fTk9ERToKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbjsKLQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJbm9kZUFkZGVkKG1zZy5nZXRQb3NpdGlvbigpLCAoQWN0aXZpdHlOb2RlKSBtc2cKLQkJCQkJCS5nZXROZXdWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJbm9kZVJlbW92ZWQoKEFjdGl2aXR5Tm9kZSkgbXNnLmdldE9sZFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSAoQWN0aXZpdHlOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJbm9kZUFkZGVkKG1zZy5nZXRQb3NpdGlvbigpLCBub2RlKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm47Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQljb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCW5vZGVSZW1vdmVkKChBY3Rpdml0eU5vZGUpIGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb24obXNnKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlTm9kZShPYmplY3Qgb2xkRWxlbWVudCwgT2JqZWN0IG5ld0VsZW1lbnQpIHsKLQkJCi0JfQotCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnRBZGFwdGVyIGNyZWF0ZU1ldGhvZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHBvcHVsYXRlTGlua3MoKSB7Ci0JCXBvcHVsYXRlTGlua3MoZ2V0Tm9kZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTGlua3MoTGlzdDxBY3Rpdml0eU5vZGU+IHNlbGVjdGVkTm9kZXMpIHsKLQkJLy8gZmlsbCBvdXRnb2luZy9pbmNvbWluZyBjb25uZWN0aW9uIGxpc3RzIG9mIGFsbCBub2RlcwotCQkvLwotCQlpbnQgc2l6ZSA9IHNlbGVjdGVkTm9kZXMuc2l6ZSgpOwotCQlib29sZWFuW10gbm90aWZpZXMgPSBuZXcgYm9vbGVhbltzaXplXTsKLQkJdHJ5IHsKLQkJCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uIGZvciBhbGwgbm9kZXMgaW4gdGhpcyBkaWFncmFtIHRvIGF2b2lkCi0JCQkvLyB1bndhbnRlZCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBvZiB0aGVpciBjb25uZWN0aW9uIGxpc3QKLQkJCS8vCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUFjdGl2aXR5Tm9kZSBub2RlID0gc2VsZWN0ZWROb2Rlcy5nZXQoaSk7Ci0JCQkJbm90aWZpZXNbaV0gPSBub2RlLmVEZWxpdmVyKCk7Ci0JCQkJbm9kZS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQl9Ci0JCQlmb3IgKEFjdGl2aXR5Tm9kZSBub2RlIDogc2VsZWN0ZWROb2RlcykgewotCQkJCXBvcHVsYXRlTGlua3Mobm9kZSwgZmFsc2UpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSBub3RpZmljYXRpb24gZmxhZwotCQkJLy8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJc2VsZWN0ZWROb2Rlcy5nZXQoaSkuZVNldERlbGl2ZXIobm90aWZpZXNbaV0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0Tm9kZXMoKSB7Ci0JCW9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5IGRpYWdyYW0gPSBnZXREaWFncmFtKCk7Ci0JCXJldHVybiBkaWFncmFtICE9IG51bGwgPyBnZXREaWFncmFtKCkuZ2V0Tm9kZXMoKSA6IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkgZ2V0RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgZ2V0VGFyZ2V0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlTm9kZShPYmplY3Qgb2JqKSB7Ci0JCWlmICghVG5nVXRpbC5pc0luc3RhbmNlT2YoZ2V0QnJlYWtkb3duRWxlbWVudFR5cGVzKCksIG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQWN0aXZpdHlOb2RlIG5vZGUgPSBCcmlkZ2VIZWxwZXIuZmluZE5vZGUoZ2V0RGlhZ3JhbSgpLCBvYmopOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZ2V0T3V0Z29pbmdzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpdml0eUVkZ2UgbGluayA9IChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2RlLmdldEluY29taW5ncygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyLm5leHQoKTsKLQkJCWxpbmsuc2V0U291cmNlKG51bGwpOwotCQl9Ci0JCW5vZGUuZ2V0T3V0Z29pbmdzKCkuY2xlYXIoKTsKLQkJbm9kZS5nZXRJbmNvbWluZ3MoKS5jbGVhcigpOwotCi0JCWdldE5vZGVzKCkucmVtb3ZlKG5vZGUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb2RlcyhDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCXJlbW92ZU5vZGUoaXRlci5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEFjdGl2aXR5Tm9kZSBhZGROb2RlKE9iamVjdCBvYmopIHsKLQkJQWN0aXZpdHlOb2RlIG5vZGUgPSBhZGROb2RlKGdldE5vZGVzKCksIG9iaik7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbm9kZTsKLQkJcG9wdWxhdGVMaW5rcyhub2RlLCB0cnVlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gYWRkTm9kZXMoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlhZGROb2RlKG5vZGVzLCBpdGVyLm5leHQoKSk7Ci0JCX0KLQotCQkvLyB1c2UgYWRkQWxsKCkgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgbm90aWZpY2F0aW9ucwotCQkvLwotCQlnZXROb2RlcygpLmFkZEFsbChub2Rlcyk7Ci0JCXJldHVybiBub2RlczsKLQl9Ci0KLQkvKioKLQkgKiBJbiBQcm9jZXNzIFdCUywgaWYgYnJlYWtkb3duZWxlbWVudCBpcyBtb3ZlZCB1cCBvciBkb3duLCBkaWFncmFtIHNob3VsZAotCSAqIGJlIHVwZGF0ZWQgYWNjb3JkaW5nbHkuIFN1Yi1jbGFzcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgZGlhZ3JhbQotCSAqIG5lZWRzIHVwZGF0ZSBvbiBtb3ZlLgotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIG1vdmVOb2RlKE9iamVjdCBvbGRWYWx1ZSkgewotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyB0aGUgaW5jb21pbmcvb3V0Z29pbmcgbGlua3Mgb2YgdGhlIGdpdmVuIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTGlua3MoQWN0aXZpdHlOb2RlIG5vZGUsIGJvb2xlYW4gZGlzYWJsZU5vdGlmaWNhdGlvbikgewotCQkvLyBpbnQgc2l6ZSA9IDA7Ci0JCS8vIGJvb2xlYW5bXSBub3RpZmllcyA9IG51bGw7Ci0JCS8vIHRyeSB7Ci0JCS8vIGlmIChkaXNhYmxlTm90aWZpY2F0aW9uKSB7Ci0JCS8vIHNpemUgPSBnZXROb2RlcygpLnNpemUoKTsKLQkJLy8gbm90aWZpZXMgPSBuZXcgYm9vbGVhbltzaXplXTsKLQkJLy8gLy8gZGlzYWJsZSBub3RpZmljYXRpb24gZm9yIGFsbCBub2RlcyBpbiB0aGlzIGRpYWdyYW0gdG8gYXZvaWQKLQkJLy8gLy8gdW53YW50ZWQgY29uY3VycmVudCBtb2RpZmljYXRpb24gb2YgdGhlaXIgY29ubmVjdGlvbiBsaXN0Ci0JCS8vIC8vCi0JCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCS8vIE5vZGUgY2hpbGQgPSAoKE5vZGUpIGdldE5vZGVzKCkuZ2V0KGkpKTsKLQkJLy8gbm90aWZpZXNbaV0gPSBjaGlsZC5lRGVsaXZlcigpOwotCQkvLyBjaGlsZC5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLwotCQkvLyBHcmFwaE5vZGUgZ3JhcGhOb2RlID0gbm9kZS5nZXRHcmFwaE5vZGUoKTsKLQkJLy8gaWYgKGdyYXBoTm9kZSAhPSBudWxsKSB7Ci0JCS8vIEdyYXBoaWNhbERhdGFIZWxwZXIuZmlsbENvbm5lY3Rpb25zKG5vZGUsIGdyYXBoTm9kZSk7Ci0JCS8vIH0KLQkJLy8gfSBmaW5hbGx5IHsKLQkJLy8gaWYgKGRpc2FibGVOb3RpZmljYXRpb24pIHsKLQkJLy8gLy8gcmVzdG9yZSBub3RpZmljYXRpb24gZmxhZwotCQkvLyAvLwotCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkvLyAoKEVPYmplY3QpIGdldE5vZGVzKCkuZ2V0KGkpKS5lU2V0RGVsaXZlcihub3RpZmllc1tpXSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBuZXcgbm9kZSBmb3IgdGhpcyBkaWFncmFtIGZvciB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlOb2RlIHRvTm9kZShNZXRob2RFbGVtZW50IGUpIHsKLQkJQWN0aXZpdHlOb2RlIG5vZGUgPSBuZXdOb2RlKGUpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWluaXRpYWxpemVOb2RlKG5vZGUsIGUpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU5vZGVBZGFwdGVyKE5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyKSB7Ci0JCW5vZGVBZGFwdGVyLnNldEVkaXRpbmdEb21haW4oZG9tYWluKTsKLQkJbm9kZUFkYXB0ZXIuYWN0aW9uTWFuYWdlciA9IGFjdGlvbk1hbmFnZXI7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplTm9kZShBY3Rpdml0eU5vZGUgbm9kZSwgTWV0aG9kRWxlbWVudCBlKSB7Ci0JCVN0cmluZyBuYW1lID0gQnJpZGdlSGVscGVyLmdldE5vZGVOYW1lKGUpOwotCQlub2RlLnNldE5hbWUobmFtZSk7CQkKLQotCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihub2RlKTsKLQkJaWYgKG5vZGVBZGFwdGVyICE9IG51bGwgJiYgbm9kZUFkYXB0ZXIuZ2V0RWxlbWVudCgpICE9IGUpIHsKLQkJCW5vZGVBZGFwdGVyLmRpc3Bvc2UoKTsKLQkJCW5vZGVBZGFwdGVyID0gbnVsbDsKLQkJfQotCQlpZiAobm9kZUFkYXB0ZXIgPT0gbnVsbCkgewotCQkJbm9kZUFkYXB0ZXIgPSBjcmVhdGVOb2RlQWRhcHRlcihlKTsKLQkJCWluaXRpYWxpemVOb2RlQWRhcHRlcihub2RlQWRhcHRlcik7Ci0JCQlub2RlLmVBZGFwdGVycygpLmFkZChub2RlQWRhcHRlcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZUFkYXB0ZXIgY3JlYXRlTm9kZUFkYXB0ZXIoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBBY3Rpdml0eU5vZGUgbmV3Tm9kZShNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBub2RlIGZvciB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgPGNvZGU+b2JqPC9jb2RlPiBhbmQKLQkgKiBhZGQgaXQgdG8gdGhlIGdpdmVuIGNvbGxlY3Rpb24gb2Ygbm9kZXMKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZXMKLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlOb2RlIGFkZE5vZGUoQ29sbGVjdGlvbiBub2RlcywgT2JqZWN0IG9iaikgewotCQlpZiAoVG5nVXRpbC5pc0luc3RhbmNlT2YoZ2V0QnJlYWtkb3duRWxlbWVudFR5cGVzKCksIG9iaikpIHsKLQkJCUFjdGl2aXR5Tm9kZSBub2RlID0gdG9Ob2RlKChNZXRob2RFbGVtZW50KSBvYmopOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRCcmVha2Rvd25FbGVtZW50VHlwZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KEJyZWFrZG93bkVsZW1lbnQuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBBY3Rpdml0eSBnZXRBY3Rpdml0eSgpIHsKLQkJcmV0dXJuIChBY3Rpdml0eSkgZWxlbWVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tVW1hTW9kZWwoQWN0aXZpdHlOb2RlIHJlbW92ZWROb2RlKSB7Ci0JCU9iamVjdCBlOwotCQlpZiAoKGUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChyZW1vdmVkTm9kZSkpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZ2V0QWN0aXZpdHkoKSwgCi0JCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUywgZSwgLTEpOwotCQl9Ci0KLQkJc3VwZXIucmVtb3ZlRnJvbVVtYU1vZGVsKHJlbW92ZWROb2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleHRyYWN0Q2hpbGRyZW4oSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIsIE9iamVjdCBvYmplY3QsIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJLy8gZGlzYWJsZSByb2xsdXAgYmVmb3JlIGdldHRpbmcgdGhlIGNoaWxkcmVuCi0JCS8vCi0JCWJvb2xlYW4gb2xkUm9sbGVkVXAgPSBmYWxzZTsKLQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpYWRhcHRlcjsKLQkJCW9sZFJvbGxlZFVwID0gaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCWl0ZW1Qcm92aWRlci5iYXNpY1NldFJvbGxlZFVwKGZhbHNlKTsKLQkJfQotCQllbHNlIGlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpewotCQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpYWRhcHRlcjsKLQkJCW9sZFJvbGxlZFVwID0gaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCWl0ZW1Qcm92aWRlci5zZXRSb2xsZWRVcChmYWxzZSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQkvLyBmaWx0ZXIgb3V0IHRoZSBzdXBwcmVzc2VkIGVsZW1lbnRzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmKCFnZXRTdXBwcmVzc2lvbigpLmlzU3VwcHJlc3NlZChjaGlsZCkpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGRvbid0IGZpbHRlciBzdXBwcmVzc2VkIGVsZW1lbnRzCi0JCQkvLwotCQkJLy9jaGlsZHJlbi5hZGRBbGwoYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIHJlc3RvcmUgdGhlIHJvbGxlZC11cCBmbGFnCi0JCQkvLwotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCSgoSUJTSXRlbVByb3ZpZGVyKWFkYXB0ZXIpLnNldFJvbGxlZFVwKG9sZFJvbGxlZFVwKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oKSB7Ci0JCXJldHVybiBzdXBwcmVzc2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdXBwcmVzc2lvbihTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQl0aGlzLnN1cHByZXNzaW9uID0gc3VwcHJlc3Npb247Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlVmlldyhDb2xsZWN0aW9uPD8+IHNlbGVjdGVkTm9kZXMpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgUm9sbGJhY2tFeGNlcHRpb24gewotCQl1cGRhdGVWaWV3KGdldFZpZXcoKSwgc2VsZWN0ZWROb2Rlcyk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlVmlldyhWaWV3IHZpZXcsIENvbGxlY3Rpb248Pz4gc2VsZWN0ZWROb2RlcykgewotCQkvLyBzaG93IHRoZSBzZWxlY3RlZCBub2RlcyBhbmQgaGlkZSBhbGwgdGhlIG90aGVyCi0JCS8vCQotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlWaWV3IG5vZGUgPSAoVmlldykgaXRlci5uZXh0KCk7Ci0JCQlpZihzZWxlY3RlZE5vZGVzLmNvbnRhaW5zKG5vZGUuZ2V0RWxlbWVudCgpKSkgewotCQkJCU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZS5nZXRFbGVtZW50KCkpOwotCQkJCWlmKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlhZGFwdGVyLnVwZGF0ZVZpZXcoKTsKLQkJCQl9Ci0vLwkJCQlpZighbm9kZS5pc1Zpc2libGUoKSkgewotCQkJCQlub2RlLnNldFZpc2libGUodHJ1ZSk7Ci0vLwkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZihub2RlLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJCQlpZihub2RlLmlzVmlzaWJsZSgpKSB7Ci0JCQkJCQlub2RlLnNldFZpc2libGUoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYobm9kZS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbikgewotCQkJCQl1cGRhdGVWaWV3KG5vZGUsIHNlbGVjdGVkTm9kZXMpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYoIW5vZGUuaXNWaXNpYmxlKCkpIHsKLQkJCQkJCW5vZGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUVkZ2VzKENvbGxlY3Rpb24gc2VsZWN0ZWROb2RlcykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBSb2xsYmFja0V4Y2VwdGlvbiB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFZpZXcoKS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVmlldyBub2RlID0gKFZpZXcpIGl0ZXIubmV4dCgpOwotCQkJaWYoc2VsZWN0ZWROb2Rlcy5jb250YWlucyhub2RlLmdldEVsZW1lbnQoKSkpIHsKLQkJCQlOb2RlQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUuZ2V0RWxlbWVudCgpKTsKLQkJCQlhZGFwdGVyLnVwZGF0ZVZpZXcoKTsKLS8vCQkJCWlmKCFub2RlLmlzVmlzaWJsZSgpKSB7Ci0JCQkJCW5vZGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJc2V0RWRnZVZpc2liaWxpdHkobm9kZSwgdHJ1ZSk7Ci0vLwkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZihub2RlLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJCQlpZihub2RlLmlzVmlzaWJsZSgpKSB7Ci0JCQkJCQlzZXRFZGdlVmlzaWJpbGl0eShub2RlLCBmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmKCFub2RlLmlzVmlzaWJsZSgpKSB7Ci0JCQkJCQlub2RlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCQlzZXRFZGdlVmlzaWJpbGl0eShub2RlLCB0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldEVkZ2VWaXNpYmlsaXR5KFZpZXcgdmlldywgYm9vbGVhbiB2aXNpYmlsaXR5KXsKLQkJRGlhZ3JhbSBkaWFncmFtID0gdmlldy5nZXREaWFncmFtKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBkaWFncmFtLmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRWRnZSBlZGdlID0gKEVkZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGVkZ2UuZ2V0U291cmNlKCkgPT0gdmlldyB8fCBlZGdlLmdldFRhcmdldCgpID09IHZpZXcpewotCQkJCWlmKHZpc2liaWxpdHkpewotCQkJCQl2aWV3LnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJfQotCQkJCWVkZ2Uuc2V0VmlzaWJsZSh2aXNpYmlsaXR5KTsKLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgdGhlIGRpYWdyYW0gd2l0aCB0aGUgZGF0YSBmcm9tIHRoZSBVTUEgbW9kZWwuIFN1YmNsYXNzIHNob3VsZAotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIHBvcHVsYXRlRGlhZ3JhbSgpIHsKLQkJYm9vbGVhbiBub3RpZnkgPSBub3RpZmljYXRpb25FbmFibGVkOwotCQl0cnkgewotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJZmluYWwgTGlzdDxBY3Rpdml0eU5vZGU+IHNlbGVjdGVkTm9kZXMgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5Tm9kZT4oKTsKLQkJCW9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5IGRpYWdyYW0gPSBnZXREaWFncmFtKCk7CQkJCi0JCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkaWFncmFtLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXNlbGVjdGVkTm9kZXMuYWRkQWxsKHBvcHVsYXRlTm9kZXMoKSk7Ci0JCQkJCXBvcHVsYXRlTGlua3Moc2VsZWN0ZWROb2Rlcyk7Ci0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCQkKLQkJCS8vIGFkZCB0aGlzIGRpYWdyYW0gdG8gdGhlIGNvbnN1bWVyIGxpc3Qgb2YgYWxsIG5vZGVzIHNvIHRoZXkgd2lsbCBub3QKLQkJCS8vIGJlIGRpc3Bvc2VkCi0JCQkvLyBiZWZvcmUgdGhpcyBkaWFncmFtLgotCQkJLy8KLQkJCWZvciAoQWN0aXZpdHlOb2RlIG5vZGUgOiBzZWxlY3RlZE5vZGVzKSB7Ci0JCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZSk7Ci0JCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlub2RlQWRhcHRlci5hZGRDb25zdW1lcih0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGRpYWdyYW0sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXVwZGF0ZUVkZ2VzKHNlbGVjdGVkTm9kZXMpOwotCQkJCQkJdXBkYXRlVmlldyhzZWxlY3RlZE5vZGVzKTsKLQkJCQkJfSBjYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gcG9wdWxhdGVOb2RlcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQkKLQlwdWJsaWMgSUFjdGlvbk1hbmFnZXIgZ2V0QWN0aW9uTWFuYWdlcigpIHsKLQkJaWYoYWN0aW9uTWFuYWdlciA9PSBudWxsKSB7Ci0JCQlhY3Rpb25NYW5hZ2VyID0gbmV3IEFjdGlvbk1hbmFnZXIoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gZG9BY3Rpb24oaW50IGFjdGlvblR5cGUsIEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJCQkJYm9vbGVhbiByZXQgPSBzdXBlci5kb0FjdGlvbihhY3Rpb25UeXBlLCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlLCBpbmRleCk7Ci0JCQkJCWlmKHJldCkgewotCQkJCQkJdW1hTGFzdE1vZGlmaWVkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHJldDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY3Rpb25NYW5hZ2VyOwotCX0KLQkKLQlwdWJsaWMgbG9uZyBnZXRVbWFMYXN0TW9kaWZpZWQoKSB7Ci0JCXJldHVybiB1bWFMYXN0TW9kaWZpZWQ7Ci0JfQotCi0JcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL05vZGVBZGFwdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2JyaWRnZS9Ob2RlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWY4OGY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL05vZGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5pbXBsLkludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuVHhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgTWV0aG9kRWxlbWVudEFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCAvL2ltcGxlbWVudHMgSU5vZGVDaGFuZ2VMaXN0ZW5lciAKLQl7Ci0JCS8qKgotCQkgKiAKLQkJICogQHBhcmFtIG1zZwotCQkgKiBAcmV0dXJuIE5ldyBub2RlcyB3aG9zZSB2aWV3cyBuZWVkIHJlZnJlc2ggYWZ0ZXIgdGhleSBoYXZlIGJlZW4gY3JlYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIENvbGxlY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkJc2V0TmFtZShtc2cuZ2V0TmV3U3RyaW5nVmFsdWUoKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZihkb21haW4gPT0gbnVsbCB8fCBkb21haW4uZ2V0Q2hhbmdlUmVjb3JkZXIoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCQkJcmV0dXJuOwotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlmaW5hbCBDb2xsZWN0aW9uPEFjdGl2aXR5Tm9kZT4gbmV3Tm9kZXNUb1JlZnJlc2ggPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5Tm9kZT4oKTsKLQkJCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkb21haW4sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQluZXdOb2Rlc1RvUmVmcmVzaC5hZGRBbGwoaGFuZGxlTm90aWZpY2F0aW9uKG1zZykpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0pOwotCQkJCWlmKCFuZXdOb2Rlc1RvUmVmcmVzaC5pc0VtcHR5KCkpIHsKLQkJCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZG9tYWluLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlmb3IgKEFjdGl2aXR5Tm9kZSBub2RlIDogbmV3Tm9kZXNUb1JlZnJlc2gpIHsKLQkJCQkJCQkJQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpLnVwZGF0ZVZpZXcoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBOb2RlQWRhcHRlciBnZXROb2RlQWRhcHRlcigpIHsKLQkJCXJldHVybiBOb2RlQWRhcHRlci50aGlzOwotCQl9Ci0KLQl9Ci0JCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQlwcml2YXRlIENvbGxlY3Rpb24gY29uc3VtZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50QWRhcHRlciBtZXRob2RFbGVtZW50QWRhcHRlcjsKLQlwcml2YXRlIGJvb2xlYW4gdGFyZ2V0UmVhZE9ubHk7Ci0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXI7Ci0JcHJvdGVjdGVkIEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluOwotCXByaXZhdGUgVmlldyB2aWV3OwotCXByb3RlY3RlZCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyOwotCQotCXByb3RlY3RlZCBOb2RlQWRhcHRlcigpIHsKLQkJCi0JfQotCQotCXB1YmxpYyBJQWN0aW9uTWFuYWdlciBnZXRBY3Rpb25NYW5hZ2VyKCkgewotCQlpZihhY3Rpb25NYW5hZ2VyICE9IG51bGwpIHsKLQkJCXJldHVybiBhY3Rpb25NYW5hZ2VyOwotCQl9Ci0JCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGdldE5vZGUoKS5nZXRBY3Rpdml0eSgpKTsKLQkJcmV0dXJuIG5vZGVBZGFwdGVyLmdldEFjdGlvbk1hbmFnZXIoKTsKLQl9Ci0JCi0JcHVibGljIE5vZGVBZGFwdGVyKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJdGhpcygoTWV0aG9kRWxlbWVudCkgVG5nVXRpbC51bndyYXAod3JhcHBlcikpOwotCQl0aGlzLndyYXBwZXIgPSB3cmFwcGVyOwotCQl0YXJnZXRSZWFkT25seSA9IHdyYXBwZXIuaXNSZWFkT25seSgpOwotCX0KLQotCXB1YmxpYyBOb2RlQWRhcHRlcihNZXRob2RFbGVtZW50IGUpIHsKLQkJZWxlbWVudCA9IGU7Ci0JCW1ldGhvZEVsZW1lbnRBZGFwdGVyID0gY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXIoKTsKLQkJZS5lQWRhcHRlcnMoKS5hZGQobWV0aG9kRWxlbWVudEFkYXB0ZXIpOwkJCi0JfQkJCQotCQotCXB1YmxpYyBWaWV3IGdldFZpZXcoKSB7Ci0JCWlmKHZpZXcgIT0gbnVsbCkgewotCQkJcmV0dXJuIHZpZXc7Ci0JCX0KLQkJVmlldyBkaWFncmFtVmlldyA9IGdldERpYWdyYW1WaWV3KCk7Ci0JCWlmKGRpYWdyYW1WaWV3ICE9IG51bGwpIHsKLQkJCXJldHVybiBCcmlkZ2VIZWxwZXIuZ2V0VmlldyhkaWFncmFtVmlldywgZ2V0Tm9kZSgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBWaWV3IGdldERpYWdyYW1WaWV3KCkgewotCQlBY3Rpdml0eSBkaWFncmFtID0gZ2V0RGlhZ3JhbSgpOwotCQlpZihkaWFncmFtICE9IG51bGwpIHsKLQkJCU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIoZGlhZ3JhbSk7Ci0JCQlpZihhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gYWRhcHRlci5nZXRWaWV3KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmlldyhWaWV3IHZpZXcpIHsKLQkJdGhpcy52aWV3ID0gdmlldzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFZGl0aW5nRG9tYWluKEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluKSB7Ci0JCXRoaXMuZG9tYWluID0gZG9tYWluOwotCX0KLQkJCQotCXB1YmxpYyBib29sZWFuIGlzVGFyZ2V0UmVhZE9ubHkoKSB7Ci0JCWlmKHRhcmdldFJlYWRPbmx5KSAgewotCQkJcmV0dXJuIHRhcmdldFJlYWRPbmx5OwotCQl9Ci0JCUFjdGl2aXR5IGFjdGl2aXR5ID0gZ2V0RGlhZ3JhbSgpOwotCQlpZihhY3Rpdml0eSAhPSB0YXJnZXQpIHsKLQkJCU5vZGVBZGFwdGVyIGRpYWdyYW1BZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGFjdGl2aXR5KTsKLQkJCWlmKGRpYWdyYW1BZGFwdGVyICE9IG51bGwgJiYgZGlhZ3JhbUFkYXB0ZXIuaXNUYXJnZXRSZWFkT25seSgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBiYXNpY1NldFRhcmdldFJlYWRPbmx5KGJvb2xlYW4gYikgewotCQl0YXJnZXRSZWFkT25seSA9IGI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFyZ2V0UmVhZE9ubHkoYm9vbGVhbiB0YXJnZXRSZWFkT25seSkgewotCQlib29sZWFuIHVwZGF0ZVZpZXcgPSB0aGlzLnRhcmdldFJlYWRPbmx5ICE9IHRhcmdldFJlYWRPbmx5OwotCQl0aGlzLnRhcmdldFJlYWRPbmx5ID0gdGFyZ2V0UmVhZE9ubHk7Ci0JCWlmKHVwZGF0ZVZpZXcpIHsKLQkJCXVwZGF0ZVZpZXcoKTsKLQkJfQotCX0JCQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVmlldygpIHsKLQkJVmlldyBub2RlID0gZ2V0VmlldygpOwotCQlpZihub2RlICE9IG51bGwpIHsKLS8vCQkJbm9kZS5zZXRNdXRhYmxlKCFpc1RhcmdldFJlYWRPbmx5KCkpOwotCQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7Ci0vLwkJCWlmKHN0eWxlICE9IG51bGwpIHsKLS8vCQkJCUNvbG9yIGNvbG9yID0gaXNUYXJnZXRSZWFkT25seSgpID8gRGlhZ3JhbUNvbnN0YW50cy5SRUFEX09OTFlfRk9OVF9DT0xPUiA6IERpYWdyYW1Db25zdGFudHMuREVGQVVMVF9GT05UX0NPTE9SOwotLy8JCQkJc3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoY29sb3IuZ2V0UkdCKCkpLmludFZhbHVlKCkpOwotLy8JCQl9Ci0JCQlpZihzdHlsZSA9PSBudWxsKSB7Ci0JCQkJbm9kZS5jcmVhdGVTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudEFkYXB0ZXIgY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkYXB0ZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFjdGl2aXR5Tm9kZSBnZXROb2RlKCkgewotCQlpZih0YXJnZXQgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiAoQWN0aXZpdHlOb2RlKSB0YXJnZXQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBBY3Rpdml0eSBnZXREaWFncmFtKCkgewotCQlpZih0YXJnZXQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJcmV0dXJuIChBY3Rpdml0eSkgdGFyZ2V0OwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlyZXR1cm4gbm9kZSAhPSBudWxsID8gbm9kZS5nZXRBY3Rpdml0eSgpIDogbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFjdGl2aXR5RWRnZSBhZGRJbmNvbWluZ0Nvbm5lY3Rpb24oTWV0aG9kRWxlbWVudCBzb3VyY2UpIHsKLQkJQWN0aXZpdHlOb2RlIHNyY05vZGUgPSBCcmlkZ2VIZWxwZXIuZmluZE5vZGUoZ2V0RGlhZ3JhbSgpLCBzb3VyY2UsIHRydWUpOwotCQlpZiAoc3JjTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24gb2Ygc3JjTm9kZSBiZWZvcmUgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGxpbmsKLQkJLy8gc28gaXQgd2lsbCBub3QgY3JlYXRlIGR1cGxpY2F0ZSBVTUEgZGF0YQotCQkvLwotCQlOb2RlQWRhcHRlciBzcmNOb2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihzcmNOb2RlKTsKLQkJYm9vbGVhbiBub3RpZnkgPSBzcmNOb2RlQWRhcHRlciAhPSBudWxsID8gc3JjTm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA6IGZhbHNlOwotCQl0cnkgewotCQkJaWYoc3JjTm9kZUFkYXB0ZXIgIT0gbnVsbCkgc3JjTm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJQWN0aXZpdHlFZGdlIGVkZ2UgPSBVTUxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250cm9sRmxvdygpOwotCQkJZWRnZS5zZXRTb3VyY2Uoc3JjTm9kZSk7Ci0JCQllZGdlLnNldFRhcmdldChnZXROb2RlKCkpOwotCQkJZ2V0RGlhZ3JhbSgpLmdldEVkZ2VzKCkuYWRkKGVkZ2UpOwotCQkJcmV0dXJuIGVkZ2U7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZihzcmNOb2RlQWRhcHRlciAhPSBudWxsKSBzcmNOb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5OwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEFjdGl2aXR5RWRnZSBhZGRPdXRnb2luZ0Nvbm5lY3Rpb24oTWV0aG9kRWxlbWVudCB0YXJnZXQpIHsKLQkJQWN0aXZpdHlOb2RlIHRhcmdldE5vZGUgPSBCcmlkZ2VIZWxwZXIuZmluZE5vZGUoZ2V0RGlhZ3JhbSgpLCB0YXJnZXQpOwotCQlpZiAodGFyZ2V0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24gb2YgdGFyZ2V0Tm9kZSBiZWZvcmUgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGxpbmsKLQkJLy8gc28gaXQgd2lsbCBub3QgY3JlYXRlIGR1cGxpY2F0ZSBVTUEgZGF0YQotCQkvLwotCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcih0YXJnZXROb2RlKTsKLQkJYm9vbGVhbiBub3RpZnkgPSBub2RlQWRhcHRlciAhPSBudWxsID8gbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA6IGZhbHNlOwotCQl0cnkgewotCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJQWN0aXZpdHlFZGdlIGVkZ2UgPSBnZXREaWFncmFtKCkuY3JlYXRlRWRnZSgiIiwgVU1MUGFja2FnZS5MaXRlcmFscy5DT05UUk9MX0ZMT1cpOyAvLyROT04tTkxTLTEkCi0JCQllZGdlLnNldFNvdXJjZShnZXROb2RlKCkpOwotCQkJZWRnZS5zZXRUYXJnZXQodGFyZ2V0Tm9kZSk7Ci0JCQlyZXR1cm4gZWRnZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIG5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gY29uc3VtZXIgdG8gdGhlIGNvbnN1bWVyIGxpc3Qgb2YgdGhpcyBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBjb25zdW1lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvbnN1bWVyKE9iamVjdCBjb25zdW1lcikgewotCQlpZiAoIWNvbnN1bWVycy5jb250YWlucyhjb25zdW1lcikpIHsKLQkJCWNvbnN1bWVycy5hZGQoY29uc3VtZXIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGNvbnN1bWVyIGZyb20gdGhlIGNvbnN1bWVyIGxpc3Qgb2YgdGhpcyBub2RlLiBEaXNwb3NlcwotCSAqIHRoZSBub2RlIGlmIGl0IGRvZXMgbm90IGhhdmUgYW55IG1vcmUgY29uc3VtZXIgYWZ0ZXIgdGhpcyBjYWxsLiBEaXNwb3NpbmcKLQkgKiBhIG5vZGUgd2lsbCB0YWtlIGNhcmUgb2YgcmVtb3ZpbmcgdGhpcyBub2RlJ3MgbGlzdGVuZXIgZnJvbSB0aGUgVU1BCi0JICogb2JqZWN0IGFuZCBhbGwgdGhlIGFkYXB0ZXJzIHRoYXQgaGFkIGJlZW4gYWRkZWQgdG8gdGhlIGFkYXB0ZXIgbGlzdCBvZgotCSAqIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uc3VtZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDb25zdW1lcihPYmplY3QgY29uc3VtZXIpIHsKLQkJY29uc3VtZXJzLnJlbW92ZShjb25zdW1lcik7Ci0JCWlmIChjb25zdW1lcnMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBubyBtb3JlIGNvbnN1bWVyIG9mIHRoaXMgbm9kZSwgaXQgc2hvdWxkIGJlIGRpc3Bvc2VkCi0JCQlkaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gc2V0IGRvbWFpbiB0byBudWxsIGJlZm9yZSByZW1vdmluZyBtZXRob2RFbGVtZW50QWRhcHRlciBmcm9tIHRoZQotCQkvLyBtZXRob2QgZWxlbWVudCBzbyBtZXRob2RFbGVtZW50IGNhbiBza2lwIGhhbmRsaW5nIFJFTU9WRV9BREFQVEVSIGV2ZW50Ci0JCS8vIHRoYXQgc29tZXRpbWVzIHJlcXVpcmVzIG5ldyB0cmFuc2FjdGlvbiB0byBiZSBjcmVhdGVkIGFuZCBjYXVzZXMgZGVhZC1sb2NrCi0JCS8vCi0JCWRvbWFpbiA9IG51bGw7Ci0JCUVPYmplY3Qgb2JqID0gZWxlbWVudDsKLQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQlpZiAobWV0aG9kRWxlbWVudEFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCW9iai5lQWRhcHRlcnMoKS5yZW1vdmUobWV0aG9kRWxlbWVudEFkYXB0ZXIpOwotCQkJfQotCQl9Ci0JCWlmKHRhcmdldCAhPSBudWxsKSB7Ci0JCQl0YXJnZXQuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQl9Ci0JCQotCQllbGVtZW50ID0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3U3RyaW5nVmFsdWUpIHsKLQkJQWN0aXZpdHlOb2RlIGUgPSBnZXROb2RlKCk7Ci0JCWlmKGUgIT0gbnVsbCkgewotCQkJZS5zZXROYW1lKG5ld1N0cmluZ1ZhbHVlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2gobXNnLmdldEZlYXR1cmVJRChBY3Rpdml0eU5vZGUuY2xhc3MpKSB7Ci0JCWNhc2UgVU1MUGFja2FnZS5BQ1RJVklUWV9OT0RFX19OQU1FOgotCQkJaWYgKG1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUCi0JCQkJCSYmIGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgbmV3TmFtZSA9IG1zZy5nZXROZXdTdHJpbmdWYWx1ZSgpOwotCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9ICgoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpKTsKLQkJCQllLnNldFByZXNlbnRhdGlvbk5hbWUobmV3TmFtZSk7Ci0JCQkJaWYgKFN0clV0aWwuaXNCbGFuayhlLmdldE5hbWUoKSkpIHsKLQkJCQkJZS5zZXROYW1lKG5ld05hbWUpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJY2FzZSBVTUxQYWNrYWdlLkFDVElWSVRZX05PREVfX0lOQ09NSU5HOiAvLyBpbmNvbWluZyBjb25uZWN0aW9ucwotCQkJQWN0aXZpdHlFZGdlIGxpbms7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWxpbmsgPSAoQWN0aXZpdHlFZGdlKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQlhZGRUb1VNQShsaW5rKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlhZGRUb1VNQSgoQWN0aXZpdHlFZGdlKSBpdGVyLm5leHQoKSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCWxpbmsgPSAoQWN0aXZpdHlFZGdlKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQlpZiAobGluay5nZXRTb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGxpbmsuZ2V0U291cmNlKCkpOwotCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQlub2RlQWRhcHRlci5yZW1vdmVGcm9tVU1BKGxpbmssIGxpbmsKLQkJCQkJCQkJLmdldFNvdXJjZSgpLCAoQWN0aXZpdHlOb2RlKSBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlsaW5rID0gKEFjdGl2aXR5RWRnZSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChsaW5rLmdldFNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGxpbmsuZ2V0U291cmNlKCkpOwotCQkJCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJCW5vZGVBZGFwdGVyLnJlbW92ZUZyb21VTUEobGluaywKLQkJCQkJCQkJCWxpbmsuZ2V0U291cmNlKCksIChBY3Rpdml0eU5vZGUpIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybjsKLQkJY2FzZSBVTUxQYWNrYWdlLkFDVElWSVRZX05PREVfX09VVEdPSU5HOgotCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQlsaW5rID0gKEFjdGl2aXR5RWRnZSkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkJCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihsaW5rLmdldFRhcmdldCgpKTsKLQkJCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJbm9kZUFkYXB0ZXIuYWRkVG9VTUEobGluayk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlsaW5rID0gKEFjdGl2aXR5RWRnZSkgaXRlci5uZXh0KCk7Ci0JCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGxpbmsuZ2V0VGFyZ2V0KCkpOwotCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQlub2RlQWRhcHRlci5hZGRUb1VNQShsaW5rKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQlsaW5rID0gKEFjdGl2aXR5RWRnZSkgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkJCQlyZW1vdmVGcm9tVU1BKGxpbmssIChBY3Rpdml0eU5vZGUpIG1zZy5nZXROb3RpZmllcigpLCBsaW5rCi0JCQkJCQkJLmdldFRhcmdldCgpKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlsaW5rID0gKEFjdGl2aXR5RWRnZSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChsaW5rLmdldFRhcmdldCgpICE9IG51bGwpIHsKLQkJCQkJCXJlbW92ZUZyb21VTUEobGluaywgKEFjdGl2aXR5Tm9kZSkgbXNnLmdldE5vdGlmaWVyKCksIGxpbmsKLQkJCQkJCQkJLmdldFRhcmdldCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKCFub3RpZmljYXRpb25FbmFibGVkKQotCQkJcmV0dXJuOwotCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQloYW5kbGVOb3RpZmljYXRpb24obXNnKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgdGhlIGRhdGEgZm9yIHRoZSBuZXdseSBhZGRlZCBub2RlIHRvIHRoZSBVTUEgbW9kZWwgU3ViY2xhc3Mgc2hvdWxkCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9VbWFNb2RlbChpbnQgcG9zaXRpb24sIEFjdGl2aXR5Tm9kZSBub2RlKSB7CQkKLS8vVE9ETzogcmV2aWV3Ci0vLwkJaWYgKGFkZGVkTm9kZS5nZXRHcmFwaE5vZGUoKSA9PSBudWxsKSB7Ci0vLwkJCS8vIHRoaXMgbm9kZSBpcyByZWFkZGVkIGFmdGVyIHVuZG8KLS8vCQkJLy8KLS8vCQkJKChOb2RlSW1wbCkgYWRkZWROb2RlKS5iYXNpY1NldE9iamVjdChhZGRlZE5vZGUuZ2V0T2JqZWN0KCkpOwotLy8JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub2RlQWRkZWQoaW50IGluZGV4LCBBY3Rpdml0eU5vZGUgbm9kZSkgewotCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihub2RlKTsKLQkJaWYobm9kZUFkYXB0ZXIgPT0gbnVsbCkgewotCQkJbm9kZUFkYXB0ZXIgPSBhZGROb2RlQWRhcHRlclRvKG5vZGUpOwotCQl9Ci0JCWFkZFRvVW1hTW9kZWwoaW5kZXgsIG5vZGUpOwkJCi0JCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCW5vZGVBZGFwdGVyLmFkZENvbnN1bWVyKHRoaXMpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBOb2RlQWRhcHRlciBhZGROb2RlQWRhcHRlclRvKEFjdGl2aXR5Tm9kZSBub2RlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBkYXRhIGZvciB0aGUgcmVtb3ZlZCBub2RlIGZyb20gdGhlIFVNQSBtb2RlbCBTdWJjbGFzcyBzaG91bGQKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21VbWFNb2RlbChBY3Rpdml0eU5vZGUgbm9kZSkgewotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBub2RlUmVtb3ZlZChBY3Rpdml0eU5vZGUgbm9kZSkgewotCQlyZW1vdmVGcm9tVW1hTW9kZWwobm9kZSk7Ci0JCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQlub2RlQWRhcHRlci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFkZFRvVU1BKEFjdGl2aXR5RWRnZSBsaW5rKSB7Ci0JCWlmIChsaW5rLmdldFRhcmdldCgpID09IG51bGwgfHwgbGluay5nZXRTb3VyY2UoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tVU1BKEFjdGl2aXR5RWRnZSBsaW5rLCBBY3Rpdml0eU5vZGUgb2xkU291cmNlLCBBY3Rpdml0eU5vZGUgb2xkVGFyZ2V0KSB7Ci0JCU1ldGhvZEVsZW1lbnQgdGFyZ2V0RWxlbWVudCA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG9sZFRhcmdldCk7Ci0JCWlmICh0YXJnZXRFbGVtZW50IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCS8vIHRoaXMgaXMgYSBkaXJlY3QgbGluawotCQkJLy8gcmVtb3ZlIFdvcmtPcmRlcgotCQkJLy8KLQkJCU5vZGVBZGFwdGVyIHRhcmdldE5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG9sZFRhcmdldCk7Ci0JCQlib29sZWFuIG5vdGlmeSA9IHRhcmdldE5vZGVBZGFwdGVyICE9IG51bGwgPyB0YXJnZXROb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkIDogZmFsc2U7Ci0JCQl0cnkgewotCQkJCWlmKHRhcmdldE5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJdGFyZ2V0Tm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoQnJpZGdlSGVscGVyLmNhblJlbW92ZUFsbFByZWRzKGxpbmssIG9sZFNvdXJjZSwKLQkJCQkJCW9sZFRhcmdldCkpIHsKLQkJCQkJT2JqZWN0IHByZWQgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChvbGRTb3VyY2UpOwotCQkJCQlpZihwcmVkIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG9sZFRhcmdldCk7Ci0JCQkJCQlDb2xsZWN0aW9uPFdvcmtPcmRlcj4gd29ya09yZGVycyA9IFVtYVV0aWwuZmluZFdvcmtPcmRlcihlLCAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHByZWQsIHRydWUpOwotCQkJCQkJaWYoIXdvcmtPcmRlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCBlLCAKLQkJCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUiwgd29ya09yZGVycywgLTEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZih0YXJnZXROb2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCXRhcmdldE5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYob2xkVGFyZ2V0IGluc3RhbmNlb2YgQ29udHJvbE5vZGUgJiYgQnJpZGdlSGVscGVyLmlzU3luY2hCYXIob2xkVGFyZ2V0KSkgewotCQkJLy8gZ2V0IGFsbCB0aGUgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlcyB0aGF0IHRoaXMgc3luY2ggYmFyIGlzCi0JCQkvLyBjb21pbmcgdG8gYW5kCi0JCQkvLyByZW1vdmUgdGhlIFdvcmtPcmRlcnMgd2l0aCB0aGlzIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSdzCi0JCQkvLyBhY3Rpdml0eSBhcyBwcmVkZWNlc3NvciBmcm9tIHRoZW0KLQkJCS8vCi0JCQlDb2xsZWN0aW9uPEFjdGl2aXR5Tm9kZT4gYWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5Tm9kZT4oKTsKLQkJCUJyaWRnZUhlbHBlci5nZXRTdWNjZXNzb3JOb2RlcyhhY3ROb2Rlcywgb2xkVGFyZ2V0KTsKLQkJCWZvciAoQWN0aXZpdHlOb2RlIG5vZGUgOiBhY3ROb2RlcykgewotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG5vZGUpOwotCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQkJCWJvb2xlYW4gbm90aWZ5ID0gbm9kZUFkYXB0ZXIgIT0gbnVsbCA/IG5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgOiBmYWxzZTsKLQkJCQl0cnkgewotCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQlub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJaWYgKEJyaWRnZUhlbHBlci5jYW5SZW1vdmVBbGxQcmVkcyhsaW5rLCBvbGRTb3VyY2UsIG5vZGUpKSB7Ci0JCQkJCQlXb3JrT3JkZXIgd287Ci0JCQkJCQl3aGlsZSAoKHdvID0gVW1hVXRpbC5maW5kV29ya09yZGVyKGUsIEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG9sZFNvdXJjZSkpKSAhPSBudWxsKSB7Ci0JCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZSwgCi0JCQkJCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1IsIHdvLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQlub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIGFkZERlZmF1bHRXb3JrT3JkZXIgaXMgbW92ZWQgZnJvbQotCSAqIEdyYXBoaWNhbERhdGFIZWxwZXIuYWRkRGVmYXVsdFdvcmtPcmRlcihOYW1lZE5vZGVJbXBsLAotCSAqIFdvcmticmVha2Rvd25FbGVtZW50KSBNZXRob2Qgd2lsbCBzZXQgbm90aWZpY2F0aW9uRW5hYmxlZCBmbGFnIHRvIGZhbHNlCi0JICogb2YgYWxsIGFkYXB0ZXJzIG9mIHR5cGUgTWV0aG9kRWxlbWVudEFkYXB0ZXIgb2YgU3VjY2Vzc29yIG9iamVjdCBiZWZvcmUKLQkgKiBjcmVhdGluZyBhIFdvcmtPcmRlciBvYmplY3QuIEFmdGVyIGNyZWF0aW9uIG9mIFdvcmtPcmRlciAoUHJlZGVjZXNzb3IKLQkgKiBsaW5rKSByZXN0b3JlcyB0aGUgbm90aWZpY2F0aW9uRW5hYmxlZCBmbGFnIG9mIFN1Y2Nlc3NvcidzIGFkYXB0ZXJzIG9mCi0JICogdHlwZSBNZXRob2RFbGVtZW50QWRhcHRlci4KLQkgKiAKLQkgKiBlZzogSWYgYW4gQWN0aXZpdHkgImFjdEEiIGlzIGV4dGVuZGVkIGluIGFub3RoZXIgQ1AuIEJhc2UgImFjdEEiIEFECi0JICogZGlhZ3JhbSBpcyBvcGVuZWQsIGFuZCBFeHRlbmRlZCAiYWN0QSIgQUQgRGlhZ3JhbSBpcyBvcGVuZWQuIE9uIGNyZWF0aW5nCi0JICogcHJlZGVjZXNzb3IgbGluayBiZXR3ZWVuIGFueSB0d28gY2hpbGQgYWN0aXZpdGllcywgY3JlYXRlcyBhIGV4dHJhIGxpbmsKLQkgKiBpbiBFeHRlbmRlZCAiYWN0QSIgQUQgZGlhZ3JhbSwgYmVjYXVzZSBjcmVhdGluZyB3b3Jrb3JkZXIgd2lsbCBub3RpZnkgdGhlCi0JICogZXh0ZW5kZWQgImFjdEEiIGRpYWdyYW0gdG8gZHJhdyBhIGxpbmsuIFRvIGF2b2lkIGR1cGxpY2F0ZSBsaW5rcyBpbiB0aGUKLQkgKiBleHRlbmRlZCBhY3Rpdml0eSBkaWFncmFtLCB3ZSBoYXZlIHRvIHNldCBub3RpZmljYXRpb25FbmFibGVkIGZsYWcgdG8KLQkgKiBmYWxzZSwgYmVmb3JlIGNyZWF0aW5nIGEgV29ya09yZGVyIG9iamVjdC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVyIGFkZERlZmF1bHRXb3JrT3JkZXIoQWN0aXZpdHlOb2RlIG5vZGUsCi0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkQnJlYWtkb3duRWxlbWVudCkgewotCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihub2RlKTsKLQkJYm9vbGVhbiBub3RpZnkgPSBub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkOwotCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJTWV0aG9kRWxlbWVudCBlID0gbm9kZUFkYXB0ZXIuZ2V0RWxlbWVudCgpOwotCQlMaXN0IGxpc3QgPSBlLmVBZGFwdGVycygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRBZGFwdGVyKSB7Ci0JCQkJTm9kZUFkYXB0ZXIgb3RoZXJOb2RlQWRhcHRlciA9IChOb2RlQWRhcHRlcikgKChNZXRob2RFbGVtZW50QWRhcHRlcikgb2JqKQotCQkJCQkJLmdldE5vZGVBZGFwdGVyKCk7Ci0JCQkJYm9vbGVhbiBwcmVkTm90aWZpY2F0aW9uID0gbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQlvdGhlck5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQltYXAucHV0KG90aGVyTm9kZUFkYXB0ZXIsIG5ldyBCb29sZWFuKHByZWROb3RpZmljYXRpb24pKTsKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJV29ya09yZGVyIHdvID0gVW1hVXRpbC5jcmVhdGVEZWZhdWx0V29ya09yZGVyKChXb3JrQnJlYWtkb3duRWxlbWVudCkgZSwgcHJlZEJyZWFrZG93bkVsZW1lbnQsIGZhbHNlKTsKLQkJCWdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGUsIAotCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1IsIHdvLCAtMSk7Ci0JCQlyZXR1cm4gd287Ci0JCX0gZmluYWxseSB7Ci0JCQlub2RlQWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKG5vdGlmeSk7Ci0JCQlTZXQgc2V0ID0gbWFwLmtleVNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3Qgb2JqID0gbWFwLmdldChvYmplY3QpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0JCQkJCWJvb2xlYW4gcHJlZG5vdCA9ICgoQm9vbGVhbikgb2JqKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJKChOb2RlQWRhcHRlcikgb2JqZWN0KS5ub3RpZmljYXRpb25FbmFibGVkID0gcHJlZG5vdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb3RpZmljYXRpb25FbmFibGVkKGJvb2xlYW4gbm90aWZ5KSB7Ci0JCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpIHsKLQkJcmV0dXJuIG5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JfQotCQotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIHsKLQkJaWYobmV3VGFyZ2V0ID09IG51bGwpIHsKLQkJCWRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLQl9Ci0JCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGdldFdyYXBwZXIoKSB7Ci0JCXJldHVybiB3cmFwcGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUFkYXB0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U1OTE2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2JyaWRnZS9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlQWRhcHRlciBleHRlbmRzIE5vZGVBZGFwdGVyIHsKLQlwcml2YXRlIGNsYXNzIFdvcmtCcmVha2Rvd25FbGVtZW50QWRhcHRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRBZGFwdGVyIHsKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCVdvcmtPcmRlciBvYmo7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUjoKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJb2JqID0gKFdvcmtPcmRlcikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWFkZEluY29taW5nQ29ubmVjdGlvbihvYmouZ2V0UHJlZCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQlvYmogPSAoV29ya09yZGVyKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKG9iai5nZXRQcmVkKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJb2JqID0gKFdvcmtPcmRlcikgaXRlci5uZXh0KCk7Ci0JCQkJCQlhZGRJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqLmdldFByZWQoKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlvYmogPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJCXJlbW92ZUluY29taW5nQ29ubmVjdGlvbihvYmouZ2V0UHJlZCgpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDoKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKLS8vCQkJCQlCb29sZWFuIGIgPSAoQm9vbGVhbiltc2cuZ2V0TmV3VmFsdWUoKTsKLS8vCQkJCQloYW5kbGVTdXBwcmVzc2VkKGIuYm9vbGVhblZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBzdXBlci5oYW5kbGVOb3RpZmljYXRpb24obXNnKTsKLQkJCX0KLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlQWRhcHRlcihNZXRob2RFbGVtZW50IGUpIHsKLQkJc3VwZXIoZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaGFuZGxlU3VwcHJlc3NlZChib29sZWFuIGIpIHsKLQkJaWYoYil7Ci0JCQlMaXN0IGluY29taW5ncyA9IGdldE5vZGUoKS5nZXRJbmNvbWluZ3MoKTsKLQkJCWZvciAoaW50IGkgPTA7IGk8aW5jb21pbmdzLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGluY29taW5ncy5nZXQoaSk7Ci0JCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSBudWxsOwotCQkJCWlmKG9iaiAhPSBudWxsICl7Ci0JCQkJCWxpbmsgPSAoQWN0aXZpdHlFZGdlKW9iajsKLQkJCQl9Ci0JCQkJaWYobGluayAhPSBudWxsICYmIGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbCl7Ci0JCQkJCU5vZGVBZGFwdGVyIHNvdXJjZU5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGxpbmsuZ2V0U291cmNlKCkpOwotCQkJCQlib29sZWFuIG9sZE5vdGlmeTEgPSBzb3VyY2VOb2RlQWRhcHRlciAhPSBudWxsID8gc291cmNlTm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA6IGZhbHNlOwotCQkJCQl0cnkgewotCQkJCQkJaWYoc291cmNlTm9kZUFkYXB0ZXIgIT0gbnVsbCkgc291cmNlTm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQkJbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCQkJCQlnZXROb2RlKCkuZ2V0SW5jb21pbmdzKCkucmVtb3ZlKGxpbmspOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJaWYoc291cmNlTm9kZUFkYXB0ZXIgIT0gbnVsbCkgc291cmNlTm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IG9sZE5vdGlmeTE7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlMaXN0IG91dEdvaW5ncyA9IGdldE5vZGUoKS5nZXRPdXRnb2luZ3MoKTsKLQkJCWZvciAoaW50IGkgPTA7IGk8b3V0R29pbmdzLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IG91dEdvaW5ncy5nZXQoaSk7Ci0JCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSBudWxsOwotCQkJCWlmKG9iaiAhPSBudWxsICl7Ci0JCQkJCWxpbmsgPSAoQWN0aXZpdHlFZGdlKW9iajsKLQkJCQl9Ci0JCQkJaWYobGluayAhPSBudWxsICYmIGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCl7Ci0JCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGxpbmsuZ2V0VGFyZ2V0KCkpOwotCQkJCQlib29sZWFuIG9sZE5vdGlmeTEgPSBub2RlQWRhcHRlciAhPSBudWxsID8gbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA6IGZhbHNlOwotCQkJCQl0cnkgewotCQkJCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQkJbGluay5zZXRTb3VyY2UobnVsbCk7Ci0JCQkJCQlnZXROb2RlKCkuZ2V0SW5jb21pbmdzKCkucmVtb3ZlKGxpbmspOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IG9sZE5vdGlmeTE7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX1lbHNlewotCQkJTGlzdCBub2RlcyA9IGdldERpYWdyYW0oKS5nZXROb2RlcygpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aXZpdHlOb2RlIGVsZW1lbnQgPSAoQWN0aXZpdHlOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQlpZihlbGVtZW50ICE9IGdldE5vZGUoKSAmJiB0YXJnZXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KXsKLQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KGVsZW1lbnQpOwotCQkJCQlpZihtZSAhPSBudWxsKXsKLQkJCQkJCWFkZEluY29taW5nQ29ubmVjdGlvbihtZSk7Ci0JCQkJCQlhZGRPdXRnb2luZ0Nvbm5lY3Rpb24obWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnRBZGFwdGVyIGNyZWF0ZU1ldGhvZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdvcmtCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRUb1VNQShBY3Rpdml0eUVkZ2UgbGluaykgewotCQlpZiAoIXN1cGVyLmFkZFRvVU1BKGxpbmspKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobGluay5nZXRTb3VyY2UoKSk7Ci0JCWlmIChlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCS8vIHRoaXMgaXMgYSBkaXJlY3QgbGluawotCQkJLy8gYWRkIG5ldyBXb3JrT3JkZXIgb2JqZWN0IHRvIFVNQQotCQkJLy8KLQkJCVdvcmtPcmRlciBvcmRlciA9IG51bGw7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChsaW5rLmdldFRhcmdldCgpKTsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGU7Ci0JCQlpZiAoVW1hVXRpbC5maW5kV29ya09yZGVyKHN1Y2MsIHByZWQpID09IG51bGwpIHsKLQkJCQlOb2RlQWRhcHRlciBzb3VyY2VOb2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihsaW5rLmdldFNvdXJjZSgpKTsJCi0JCQkJLy8gbm9kZSBhZGFwdGVyIGNhbiBiZSBOVUxMIGlmIHRoZSBub2RlIGlzIG5vdCBjdXJyZW50bHkgdmlzaWJsZSBpbiB0aGUgZGlhZ3JhbQotCQkJCS8vCi0JCQkJYm9vbGVhbiBzb3VyY2VOb3RpZnkgPSBzb3VyY2VOb2RlQWRhcHRlciAhPSBudWxsID8gc291cmNlTm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA6IGZhbHNlOwotCQkJCXRyeSB7Ci0JCQkJCWlmKHNvdXJjZU5vZGVBZGFwdGVyICE9IG51bGwpIHNvdXJjZU5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJLy9DcmVhdGUgYSB3b3Jrb3JkZXIgYW5kIGRpc2FibGUgbm90aWZpY2F0aW9uIGZsYWcuCi0JCQkJCW9yZGVyID0gYWRkRGVmYXVsdFdvcmtPcmRlcihsaW5rLmdldFRhcmdldCgpLCBwcmVkKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZihzb3VyY2VOb2RlQWRhcHRlciAhPSBudWxsKSBzb3VyY2VOb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gc291cmNlTm90aWZ5OwotCQkJCX0KLQkJCX0KLQotCQkJLy8gc2V0IHRoZSBXb3JrT3JkZXIgYXMgdGhlIGVsZW1lbnQgb2YgdGhlIFNlbWFudGljTW9kZWwgb2YgdGhlCi0JCQkvLyBsaW5rJ3MgR3JhcGhFZGdlCi0JCQlCcmlkZ2VIZWxwZXIuc2V0U2VtYW50aWNNb2RlbChsaW5rLCBvcmRlcik7Ci0JCX0gCi0JCWVsc2UgaWYgKEJyaWRnZUhlbHBlci5pc1N5bmNoQmFyKGxpbmsuZ2V0U291cmNlKCkpKSB7Ci0JCQkvLyBnZXQgYWxsIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZXMgdGhhdCBhcmUgY29tbWluZyB0byB0aGlzCi0JCQkvLyBUeXBlZE5vZGUsIGJvdGggZGlyZWN0bHkgYW5kIGluZGlyZWN0bHkKLQkJCS8vIGFuZCBjcmVhdGUgd29yayBvcmRlcnMgd2l0aCB0aGVpciBhY3Rpdml0eSBhcyBwcmVkZWNlc3NvcgotCQkJLy8KLQotCQkJLy8gUHJlZGVjZXNzb3Igc2hvdWxkIGJlIGNyZWF0ZWQgb25seSBpbiBjYXNlIG9mCi0JCQkvLyBTeW5jcm9uaXphdGlvbiBCYXIsIG5vdCBmb3IgRGVjaXNpb25Qb2ludC4KLQkJCS8vIFRPRE86IHJldmlldwotCQkJCi0JCQkJCi0JCQkJQ29sbGVjdGlvbiBhY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkvLyBHZXQgdGhlIGNvbGxlY3Rpb24gaW5jb21pbmcgY29ubmVjdGlvbiBvZiBzeW5jYmFyIAotCQkJCS8vIGV4Y2x1ZGluZyBkZWNpc2lvbnBvaW50IGluY29taW5nIGNvbm5lY3Rpb24KLQkJCQlCcmlkZ2VIZWxwZXIuZ2V0U3luY0JhclNvdXJjZU5vZGVzKGxpbmsuZ2V0U291cmNlKCksIGFjdE5vZGVzKTsKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChsaW5rLmdldFRhcmdldCgpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSAoQWN0aXZpdHlOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSk7Ci0JCQkJCWlmIChVbWFVdGlsLmZpbmRXb3JrT3JkZXIoc3VjYywgcHJlZCkgPT0gbnVsbCkgewotCQkJCQkJTm9kZUFkYXB0ZXIgc291cmNlTm9kZSA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihub2RlKTsKLQkJCQkJCWJvb2xlYW4gc291cmNlTm90aWZ5ID0gc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJCQkvLyBDcmVhdGUgYSB3b3Jrb3JkZXIgYW5kIGRpc2FibGUgbm90aWZpY2F0aW9uIGZsYWcuCi0JCQkJCQkJYWRkRGVmYXVsdFdvcmtPcmRlcihsaW5rLmdldFRhcmdldCgpLCBwcmVkKTsKLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gc291cmNlTm90aWZ5OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgQWN0aXZpdHlFZGdlIGFkZEluY29taW5nQ29ubmVjdGlvbihNZXRob2RFbGVtZW50IHNvdXJjZSkgewotCQlBY3Rpdml0eUVkZ2UgbGluayA9IHN1cGVyLmFkZEluY29taW5nQ29ubmVjdGlvbihzb3VyY2UpOwotCQlpZiAobGluayA9PSBudWxsKQotCQkJcmV0dXJuIGxpbms7Ci0KLQkJV29ya09yZGVyIHdvcmtPcmRlciA9IFVtYVV0aWwuZmluZFdvcmtPcmRlcigKLQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKSwgc291cmNlKTsKLQkJQnJpZGdlSGVscGVyLnNldFNlbWFudGljTW9kZWwobGluaywgd29ya09yZGVyKTsKLQotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWN0aXZpdHlFZGdlIGFkZE91dGdvaW5nQ29ubmVjdGlvbihNZXRob2RFbGVtZW50IHRhcmdldCkgewotCQlBY3Rpdml0eUVkZ2UgbGluayA9IHN1cGVyLmFkZE91dGdvaW5nQ29ubmVjdGlvbih0YXJnZXQpOwotCi0JCVdvcmtPcmRlciB3b3JrT3JkZXIgPSBVbWFVdGlsLmZpbmRXb3JrT3JkZXIoCi0JCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSB0YXJnZXQsIGdldEVsZW1lbnQoKSk7Ci0JCUJyaWRnZUhlbHBlci5zZXRTZW1hbnRpY01vZGVsKGxpbmssIHdvcmtPcmRlcik7Ci0KLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKE1ldGhvZEVsZW1lbnQgc291cmNlKSB7Ci0JCS8vIGxvb2sgZm9yIHRoZSBpbmNvbWluZyBjb25uZWN0aW9uIHdpdGggc291cmNlIGFzIGxpbmtlZCBvYmplY3Qgb2YgdGhlCi0JCS8vIHNvdXJjZSBub2RlCi0JCS8vCi0JCWZvciAoQWN0aXZpdHlFZGdlIGxpbmsgOiBnZXROb2RlKCkuZ2V0SW5jb21pbmdzKCkpIHsKLQkJCWlmIChsaW5rLmdldFNvdXJjZSgpICE9IG51bGwKLQkJCQkJJiYgQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobGluay5nZXRTb3VyY2UoKSkgPT0gc291cmNlKSB7Ci0JCQkJLy8gZGlzYWJsZSBpbnRlcm5hbCBub3RpZmljYXRpb24gb2YgdGhlIHNvdXJjZSBub2RlCi0JCQkJLy8KLQkJCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihsaW5rLmdldFNvdXJjZSgpKTsKLQkJCQlib29sZWFuIG9sZE5vdGlmeSA9IG5vZGVBZGFwdGVyICE9IG51bGwgPyBub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkIDogZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQlsaW5rLnNldFNvdXJjZShudWxsKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSBub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gb2xkTm90aWZ5OwotCQkJCX0KLQkJCQlsaW5rLnNldFRhcmdldChudWxsKTsKLQkJCQlCcmlkZ2VIZWxwZXIuc2V0U2VtYW50aWNNb2RlbChsaW5rLCBudWxsKTsKLQkJCQlnZXREaWFncmFtKCkuZ2V0RWRnZXMoKS5yZW1vdmUobGluayk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLS8vCUBPdmVycmlkZQotLy8JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLS8vCQlzd2l0Y2gobXNnLmdldEZlYXR1cmVJRChBY3Rpdml0eVBhcmFtZXRlck5vZGUuY2xhc3MpKSB7Ci0vLwkJY2FzZSBVTUxQYWNrYWdlLkFDVElWSVRZX1BBUkFNRVRFUl9OT0RFX19FQU5OT1RBVElPTlM6Ci0vLwkJCXN3aXRjaChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLS8vCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotLy8JCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIG5vZGUgPSAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSBtc2cuZ2V0Tm90aWZpZXIoKTsKLS8vCQkJCVN0cmluZyB0eXBlID0gQnJpZGdlSGVscGVyLmdldFR5cGUobm9kZSk7Ci0vLwkJCQlNZXRob2RFbGVtZW50IGUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChub2RlKTsJCQkJCi0vLwkJCQlpZihlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCAmJiAKLS8vCQkJCQkJdHlwZSAhPSBudWxsICYmICF0eXBlLmVxdWFscyhCcmlkZ2VIZWxwZXIuZ2V0VHlwZShlKSkpIHsKLS8vCQkJCQkvLyByZXBsYWNlIHRoZSBjdXJyZW50bHkgbGlua2VkIG1ldGhvZCBlbGVtZW50IHdpdGggdGhlIHJpZ2h0IG9uZQotLy8JCQkJCS8vCi0vLwkJCQkJRUNsYXNzIHJpZ2h0VHlwZSA9IEJyaWRnZUhlbHBlci5nZXRUeXBlKHR5cGUpOwotLy8JCQkJCWlmKHJpZ2h0VHlwZSAhPSBudWxsKSB7Ci0vLwkJCQkJCU9iamVjdCByaWdodEVsZW1lbnQgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUocmlnaHRUeXBlKTsKLS8vCQkJCQkJTGlzdCBsaXN0ID0gKChCcmVha2Rvd25FbGVtZW50KWUpLmdldFN1cGVyQWN0aXZpdGllcygpLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0vLwkJCQkJCWxpc3Quc2V0KGxpc3QuaW5kZXhPZihlKSwgcmlnaHRFbGVtZW50KTsKLS8vCQkJCQkJcmV0dXJuOwotLy8JCQkJCX0KLS8vCQkJCQkKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCQkKLS8vCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb24obXNnKTsKLS8vCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvQ2hhbmdlQm91bmRzQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9DaGFuZ2VCb3VuZHNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYWFmNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9DaGFuZ2VCb3VuZHNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLlR4VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIENvbW1hbmQgZm9yIGNoYW5nZSB2aWV3IGRpbWVuc2lvbnMuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQ2hhbmdlQm91bmRzQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGxhYmVsID0gImNoYW5nZSBib3VuZHMgY29tbWFuZCBsYWJlbCI7Ci0KLQlwcml2YXRlIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbjsKLQotCXByaXZhdGUgVmlldyB2aWV3OwotCi0JcHJpdmF0ZSBpbnQgd2lkdGg7Ci0KLQlwcml2YXRlIGludCBoZWlnaHQ7Ci0KLQlwcml2YXRlIFBvaW50IGxvY2F0aW9uOwotCi0JcHJpdmF0ZSBQb2ludCBvbGRMb2NhdGlvbjsKLQotCXByaXZhdGUgaW50IG9sZFdpZHRoOwotCi0JcHJpdmF0ZSBpbnQgb2xkSGVpZ2h0OwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENoYW5nZUJvdW5kc0NvbW1hbmQoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBWaWV3IHZpZXcsCi0JCQlQb2ludCBsb2NhdGlvbiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQkJdGhpcy5kb21haW4gPSBkb21haW47Ci0JCXRoaXMudmlldyA9IHZpZXc7Ci0JCXRoaXMud2lkdGggPSB3aWR0aDsKLQkJdGhpcy5oZWlnaHQgPSBoZWlnaHQ7Ci0JCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gKHRoaXMud2lkdGggIT0gMCB8fCB0aGlzLmhlaWdodCAhPSAwKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQl0cnkgewotCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZG9tYWluLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCW9sZExvY2F0aW9uID0gbmV3IFBvaW50KCk7Ci0JCQkJCU9iamVjdCB4ID0gIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUodmlldywKLQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKSk7Ci0JCQkJCWlmKHggIT0gbnVsbCl7Ci0JCQkJCQlvbGRMb2NhdGlvbi54ID0gKChJbnRlZ2VyKXgpLmludFZhbHVlKCk7Ci0JCQkJCX0KLQkJCQkJT2JqZWN0IHkgPSBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkpOwotCQkJCQlpZih5ICE9IG51bGwpewotCQkJCQkJb2xkTG9jYXRpb24ueSA9ICgoSW50ZWdlcikgeSkuaW50VmFsdWUoKTsKLQkJCQkJfQotCQkJCQlvbGRXaWR0aCA9ICgoSW50ZWdlcikgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LAotCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsKLQkJCQkJb2xkSGVpZ2h0ID0gKChJbnRlZ2VyKSBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpKSkuaW50VmFsdWUoKTsKLQotCQkJCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LAotCQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKSwgbmV3IEludGVnZXIoCi0JCQkJCQkJCQkJbG9jYXRpb24ueCkpOwotCQkJCQkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LAotCQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKSwgbmV3IEludGVnZXIoCi0JCQkJCQkJCQkJbG9jYXRpb24ueSkpOwotCQkJCQl9Ci0JCQkJCWlmICh3aWR0aCA+IDApIHsKLQkJCQkJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUodmlldywKLQkJCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCksIG5ldyBJbnRlZ2VyKAotCQkJCQkJCQkJCXdpZHRoKSk7Ci0JCQkJCX0KLQkJCQkJaWYgKGhlaWdodCA+IDApIHsKLQkJCQkJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUodmlldywKLQkJCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpLAotCQkJCQkJCQluZXcgSW50ZWdlcihoZWlnaHQpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCX0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJFcnJvciBpbiBjaGFuZ2Vib3VuZHMgY29tbWFuZCA6IiwgIGUpOyAvLyROT04tTkxTLTEkIAotCQkJdW5kbygpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJdHJ5IHsKLQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGRvbWFpbiwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAob2xkTG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LAotCQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKSwgbmV3IEludGVnZXIoCi0JCQkJCQkJCQkJbG9jYXRpb24ueCkpOwotCQkJCQkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LAotCQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKSwgbmV3IEludGVnZXIoCi0JCQkJCQkJCQkJbG9jYXRpb24ueSkpOwotCQkJCQl9Ci0JCQkJCWlmIChvbGRXaWR0aCAhPSB3aWR0aCkgewotCQkJCQkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LAotCQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKSwgbmV3IEludGVnZXIoCi0JCQkJCQkJCQkJd2lkdGgpKTsKLQkJCQkJfQotCQkJCQlpZiAob2xkSGVpZ2h0ID4gaGVpZ2h0KSB7Ci0JCQkJCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9IZWlnaHQoKSwKLQkJCQkJCQkJbmV3IEludGVnZXIoaGVpZ2h0KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQotCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCVNldDxSZXNvdXJjZT4gc2V0ID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCXNldC5hZGQodmlldy5lUmVzb3VyY2UoKSk7Ci0JCWlmICghc2V0LmlzRW1wdHkoKSkKLQkJCXJldHVybiBzZXQ7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCBjaGFpbigKLQkJCW9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kIGNvbW1hbmQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9Db3B5RGlhZ3JhbUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvQ29weURpYWdyYW1Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZjgwZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9Db3B5RGlhZ3JhbUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5pbXBsLkludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLlR4VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcmFtZXRlck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJ0aXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLQotLyoqCi0gKiAKLSAqIEl0IGRvZXMgY29weSB0aGUgZGlhZ3JhbSBmb3IgdGhlIGFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQ29weURpYWdyYW1Db21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjw/PiBlbGVtZW50czsKLQotCXByaXZhdGUgTWFwPEVPYmplY3QsIEVPYmplY3Q+IGNvcHlUb09yaWdpbmFsTWFwOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPERpYWdyYW0+IGNvcGllZEVsZW1lbnRzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IERpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmlzRGVidWdnaW5nKCk7Ci0KLQlwcml2YXRlIFByb2Nlc3MgdGFyZ2V0UHJvY2VzczsKLQotCXByaXZhdGUgRGlhZ3JhbU1hbmFnZXIgbWdyOwotCXByaXZhdGUgSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW47Ci0KLQlwcml2YXRlIE1hcDxFT2JqZWN0LCBFT2JqZWN0PiBvcmlnaW5hbFRvQ29weU1hcDsKLQkKLQlwcml2YXRlIENvcHlEaWFncmFtQ29tbWFuZChDb2xsZWN0aW9uPD8+IGVsZW1lbnRzLCBQcm9jZXNzIHRhcmdldFByb2Nlc3MpIHsKLQkJdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOwotCQl0aGlzLnRhcmdldFByb2Nlc3MgPSB0YXJnZXRQcm9jZXNzOwotCi0JCS8vIGdldCBkaWFncmFtIG1hbmFnZXIgYW5kIGRvbWFpbgotCQltZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZSh0YXJnZXRQcm9jZXNzLCB0aGlzKTsKLQkJZG9tYWluID0gbWdyLmdldEVkaXRpbmdEb21haW4oKTsJCQkJCi0JfQotCQotCXB1YmxpYyBDb3B5RGlhZ3JhbUNvbW1hbmQoQ29sbGVjdGlvbjw/PiBlbGVtZW50cywgSGVscGVyIGNvcHlIZWxwZXIsCi0JCQlQcm9jZXNzIHRhcmdldFByb2Nlc3MpIHsKLQkJdGhpcyhlbGVtZW50cywgdGFyZ2V0UHJvY2Vzcyk7Ci0JCXRoaXMub3JpZ2luYWxUb0NvcHlNYXAgPSBjb3B5SGVscGVyOwotCX0KLQkKLQlwdWJsaWMgQ29weURpYWdyYW1Db21tYW5kKENvbGxlY3Rpb248Pz4gZWxlbWVudHMsIE1hcDxFT2JqZWN0LCBFT2JqZWN0PiBjb3B5VG9PcmlnaW5hbE1hcCwKLQkJCVByb2Nlc3MgdGFyZ2V0UHJvY2VzcykgewotCQl0aGlzKGVsZW1lbnRzLCB0YXJnZXRQcm9jZXNzKTsKLQkJdGhpcy5jb3B5VG9PcmlnaW5hbE1hcCA9IGNvcHlUb09yaWdpbmFsTWFwOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJdHJ5IHsKLQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGRvbWFpbiwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlkb0V4ZWN1dGUoKTsKLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTWFwPD8sID8+IGdldENvcHlUb09yaWdpbmFsTWFwKCkgewotCQlpZihjb3B5VG9PcmlnaW5hbE1hcCA9PSBudWxsICYmIG9yaWdpbmFsVG9Db3B5TWFwICE9IG51bGwpIHsKLQkJCWNvcHlUb09yaWdpbmFsTWFwID0gbmV3IEhhc2hNYXA8RU9iamVjdCwgRU9iamVjdD4oKTsKLQkJCWZvciAoTWFwLkVudHJ5PEVPYmplY3QsIEVPYmplY3Q+IGVudHJ5IDogb3JpZ2luYWxUb0NvcHlNYXAuZW50cnlTZXQoKSkgewotCQkJCWNvcHlUb09yaWdpbmFsTWFwLnB1dChlbnRyeS5nZXRWYWx1ZSgpLCBlbnRyeS5nZXRLZXkoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvcHlUb09yaWdpbmFsTWFwOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZG9FeGVjdXRlKCkgewkJCi0JCWlmIChjb3BpZWRFbGVtZW50cyA9PSBudWxsKSB7Ci0JCQljb3BpZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8RGlhZ3JhbT4oKTsKLQkJfSBlbHNlIHsKLQkJCWNvcGllZEVsZW1lbnRzLmNsZWFyKCk7Ci0JCX0KLQotCQlEaWFncmFtU2VydmljZSBkaWFncmFtU3ZjID0gbmV3IERpYWdyYW1TZXJ2aWNlKCk7Ci0JCXRyeSB7Ci0JCQlmb3IgKE9iamVjdCBlIDogZWxlbWVudHMpIHsKLQkJCQlPYmplY3Qgb3JpZyA9IGdldENvcHlUb09yaWdpbmFsTWFwKCkuZ2V0KGUpOwotCQkJCWlmIChvcmlnICE9IG51bGwgJiYgb3JpZyBpbnN0YW5jZW9mIEFjdGl2aXR5ICYmIGUgIT0gbnVsbAotCQkJCQkJJiYgZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUFjdGl2aXR5IGNvcHlBY3Rpdml0eSA9IChBY3Rpdml0eSkgZTsKLQkJCQkJQWN0aXZpdHkgb3JpZ0FjdGl2aXR5ID0gKEFjdGl2aXR5KSBvcmlnOwotCi0JCQkJCUNvbGxlY3Rpb248RGlhZ3JhbT4gZGlhZ3JhbXMgPSBkaWFncmFtU3ZjLmdldERpYWdyYW1zKG9yaWdBY3Rpdml0eSk7Ci0JCQkJCWlmIChkaWFncmFtcyAhPSBudWxsICYmICFkaWFncmFtcy5pc0VtcHR5KCkpIHsKLQkJCQkJCWZvciAoRGlhZ3JhbSBkaWFncmFtIDogZGlhZ3JhbXMpIHsKLQkJCQkJCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCQkJCS8vIGNvcHkgdGhlIGRpYWdyYW0KLQkJCQkJCQkJRGlhZ3JhbSBkaWFncmFtQ29weSA9IChEaWFncmFtKSBEaWFncmFtSGVscGVyCi0JCQkJCQkJCQkJLmNvcHlEaWFncmFtKGRvbWFpbiwgZGlhZ3JhbSk7Ci0KLQkJCQkJCQkJLy8gdXBkYXRlIGNoaWxkcmVuIHJlZmVyZW5jZXMKLQkJCQkJCQkJdXBkYXRlUmVmZXJlbmNlcyhkaWFncmFtQ29weSk7Ci0KLQkJCQkJCQkJLy8gYXNzb2NpYXRlIHdpdGggdGhlIGFjdGl2aXR5Ci0JCQkJCQkJCWludCBkaWFncmFtVHlwZSA9IERpYWdyYW1IZWxwZXIKLQkJCQkJCQkJCQkuZ2V0RGlhZ3JhbVR5cGUoZGlhZ3JhbUNvcHkpOwotCQkJCQkJCQltZ3IuYXNzb2NpYXRlKGRpYWdyYW1Db3B5LCBkaWFncmFtVHlwZSwKLQkJCQkJCQkJCQkoQWN0aXZpdHkpIGNvcHlBY3Rpdml0eSk7Ci0KLQkJCQkJCQkJY29waWVkRWxlbWVudHMuYWRkKGRpYWdyYW1Db3B5KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCWlmIChERUJVRykgewotCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJZGlhZ3JhbVN2Yy5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlIGVBbm5vdGF0aW9ucyByZWZlcmVuY2VzCi0JICogCi0JICogQHBhcmFtIGNvcHkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVSZWZlcmVuY2VzKERpYWdyYW0gY29weSkgewotCQlpbnQgZGlhZ3JhbVR5cGUgPSBEaWFncmFtSGVscGVyLmdldERpYWdyYW1UeXBlKGNvcHkpOwotCQlMaXN0PE9iamVjdD4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJLy8gY29sbGVjdCBhbGwgY2hpbGRyZW4gZmlyc3QgZS5nLiBmb3IgQWN0aXZpdHlQYXJ0aXRpb24KLQkJLy8gd2UgZG9uJ3QgaGF2ZSBwYXJ0aXRpb24gaW50byBwYXJ0aXRpb24gc28ganVzdCBnZXR0aW5nIG9uZSBsZXZlbCBzdWItY2hpbGRyZW4KLQkJLy8gYXJlIGVub3VnaCBmb3Igbm93LgotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0b3IgPSBjb3B5LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRvci5uZXh0KCk7Ci0JCQlFT2JqZWN0IG9iaiA9IG5vZGUuZ2V0RWxlbWVudCgpOwotCQkJY2hpbGRyZW4uYWRkKG5vZGUpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uKXsKLQkJCQljaGlsZHJlbi5hZGRBbGwobm9kZS5nZXRDaGlsZHJlbigpKTsKLQkJCX0KLQkJfQotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0b3IubmV4dCgpOwotCQkJRU9iamVjdCBvYmogPSBub2RlLmdldEVsZW1lbnQoKTsKLQotCQkJaWYgKGRpYWdyYW1UeXBlID09IElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUKLQkJCQkJCXx8IG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgewotCQkJCQlFTW9kZWxFbGVtZW50IG1vZGVsRWxlbWVudCA9IChFTW9kZWxFbGVtZW50KSBvYmo7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSBCcmlkZ2VIZWxwZXIKLQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudEZyb21Bbm5vdGF0aW9uKG1vZGVsRWxlbWVudCwKLQkJCQkJCQkJCXRhcmdldFByb2Nlc3MuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0KLQkJCQkJT2JqZWN0IG1hcHBlZE1ldGhvZEVsZW1lbnQgPSBnZXRDb3BpZWRFbGVtZW50KG1lKTsKLQkJCQkJaWYgKG1hcHBlZE1ldGhvZEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uKG1vZGVsRWxlbWVudCwKLQkJCQkJCQkJKE1ldGhvZEVsZW1lbnQpIG1hcHBlZE1ldGhvZEVsZW1lbnQpOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGRpYWdyYW1UeXBlID09IElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSkgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyKSB7Ci0JCQkJCU5vZGVDb250YWluZXIgbm9kZUNvbnRhaW5lciA9IChOb2RlQ29udGFpbmVyKSBvYmo7Ci0JCQkJCS8vIGRvIG1hcHBpbmcgZm9yIG5vZGVjb250YWluZXIKLQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IG5vZGVDb250YWluZXIuZ2V0TGlua2VkRWxlbWVudCgpOwotCQkJCQlPYmplY3QgbWFwcGVkTWV0aG9kRWxlbWVudCA9IGdldENvcGllZEVsZW1lbnQobWUpOwotCQkJCQlpZiAobWFwcGVkTWV0aG9kRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlub2RlQ29udGFpbmVyCi0JCQkJCQkJCS5zZXRMaW5rZWRFbGVtZW50KChNZXRob2RFbGVtZW50KSBtYXBwZWRNZXRob2RFbGVtZW50KTsKLQkJCQkJfQotCi0JCQkJCS8vIGRvIG1hcHBpbmcgZm9yIGl0cyBjaGlsZHJlbgotCQkJCQlMaXN0PD8+IG5vZGVzID0gbm9kZUNvbnRhaW5lci5nZXROb2RlcygpOwotCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCU5hbWVkTm9kZSBuYW1lZE5vZGUgPSAoTmFtZWROb2RlKSBub2Rlcy5nZXQoaSk7Ci0JCQkJCQltZSA9IG5hbWVkTm9kZS5nZXRMaW5rZWRFbGVtZW50KCk7Ci0KLQkJCQkJCW1hcHBlZE1ldGhvZEVsZW1lbnQgPSBnZXRDb3BpZWRFbGVtZW50KG1lKTsKLQkJCQkJCWlmIChtYXBwZWRNZXRob2RFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCQluYW1lZE5vZGUKLQkJCQkJCQkJCS5zZXRMaW5rZWRFbGVtZW50KChNZXRob2RFbGVtZW50KSBtYXBwZWRNZXRob2RFbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZGlhZ3JhbVR5cGUgPT0gSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0pIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTmFtZWROb2RlKSB7Ci0JCQkJCU5hbWVkTm9kZSBuYW1lZE5vZGUgPSAoTmFtZWROb2RlKSBvYmo7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSBuYW1lZE5vZGUuZ2V0TGlua2VkRWxlbWVudCgpOwotCi0JCQkJCU9iamVjdCBtYXBwZWRNZXRob2RFbGVtZW50ID0gZ2V0Q29waWVkRWxlbWVudChtZSk7Ci0JCQkJCWlmIChtYXBwZWRNZXRob2RFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCW5hbWVkTm9kZQotCQkJCQkJCQkuc2V0TGlua2VkRWxlbWVudCgoTWV0aG9kRWxlbWVudCkgbWFwcGVkTWV0aG9kRWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgY29waWVkIGVsZW1lbnQgZnJvbSB0aGUgbWFwCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0Q29waWVkRWxlbWVudChPYmplY3QgZWxlbWVudCkgewotCQlpZihvcmlnaW5hbFRvQ29weU1hcCA9PSBudWxsICYmIGNvcHlUb09yaWdpbmFsTWFwICE9IG51bGwpIHsKLQkJCW9yaWdpbmFsVG9Db3B5TWFwID0gbmV3IEhhc2hNYXA8RU9iamVjdCwgRU9iamVjdD4oKTsKLQkJCWZvciAoTWFwLkVudHJ5PEVPYmplY3QsIEVPYmplY3Q+IGVudHJ5IDogY29weVRvT3JpZ2luYWxNYXAuZW50cnlTZXQoKSkgewotCQkJCW9yaWdpbmFsVG9Db3B5TWFwLnB1dChlbnRyeS5nZXRWYWx1ZSgpLCBlbnRyeS5nZXRLZXkoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9yaWdpbmFsVG9Db3B5TWFwICE9IG51bGwgPyBvcmlnaW5hbFRvQ29weU1hcC5nZXQoZWxlbWVudCkgOiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNwcmVwYXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKCEoY29waWVkRWxlbWVudHMgPT0gbnVsbCB8fCBjb3BpZWRFbGVtZW50cy5pc0VtcHR5KCkpKSB7Ci0JCQl0cnkgewotCQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGRvbWFpbiwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZm9yIChEaWFncmFtIGRpYWdyYW0gOiBjb3BpZWRFbGVtZW50cykgewotCQkJCQkJCQltZ3IuZ2V0UmVzb3VyY2UoKS5nZXRDb250ZW50cygpCi0JCQkJCQkJCQkJLnJlbW92ZShkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQkJCQkJCW1nci5nZXRSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkucmVtb3ZlKGRpYWdyYW0pOwotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCX0pOwotCQkJCWNvcGllZEVsZW1lbnRzLmNsZWFyKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCWlmIChERUJVRykgewotCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKGNvcGllZEVsZW1lbnRzID09IG51bGwgfHwgY29waWVkRWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBjb21tYW5kIGlzIG5vdCBleGVjdXRlZCB5ZXQKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCQlIYXNoU2V0PFJlc291cmNlPiBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCi0JCWZvciAoRGlhZ3JhbSBkaWFncmFtIDogY29waWVkRWxlbWVudHMpIHsKLQkJCWlmKGRpYWdyYW0gIT0gbnVsbCAmJiBkaWFncmFtLmVSZXNvdXJjZSgpICE9IG51bGwpCi0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGRpYWdyYW0uZVJlc291cmNlKCkpOwotCQl9Ci0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQkKLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKG1nciAhPSBudWxsKQotCQkJbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL0NvcHlEaWFncmFtRm9yRGVlcENvcHlDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL0NvcHlEaWFncmFtRm9yRGVlcENvcHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZjQyYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9Db3B5RGlhZ3JhbUZvckRlZXBDb3B5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLmltcGwuSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuVHhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQ29weUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhdGlvblNldHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFydGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiAKLSAqIFVwZGF0ZXMgZGlhZ3JhbXMgb2YgdGhlIGFjdGl2aXR5J3MgZGVlcCBjb3BpZXMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3B5RGlhZ3JhbUZvckRlZXBDb3B5Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248Pz4gZWxlbWVudHM7Ci0KLQlwcml2YXRlIE1hcDw/LD8+IGNvcHlUb09yaWdpbmFsTWFwOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPERpYWdyYW0+IGNvcGllZEVsZW1lbnRzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IERpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmlzRGVidWdnaW5nKCk7Ci0KLQlwcml2YXRlIFByb2Nlc3MgdGFyZ2V0UHJvY2VzczsKLQotCXByaXZhdGUgRGlhZ3JhbU1hbmFnZXIgbWdyOwotCXByaXZhdGUgSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW47Ci0KLQlwcml2YXRlIENvcHlIZWxwZXIgY29weUhlbHBlcjsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQlwcml2YXRlIFByb2Nlc3Mgc3JjUHJvY2VzczsKLQotCXByaXZhdGUgSGFzaE1hcDxCcmVha2Rvd25FbGVtZW50LCBTdHJpbmc+IGNvcHlUb1dyYXBwZXJQYXRoTWFwOwotCQotCXB1YmxpYyBDb3B5RGlhZ3JhbUZvckRlZXBDb3B5Q29tbWFuZChDb2xsZWN0aW9uPD8+IGVsZW1lbnRzLCBNYXA8PywgPz4gY29weVRvT3JpZ2luYWxNYXAsCi0JCQlQcm9jZXNzIHNyY1Byb2Nlc3MsIFByb2Nlc3MgdGFyZ2V0UHJvY2VzcywgQ29weUhlbHBlciBjb3B5SGVscGVyLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdGhpcy5jb3B5SGVscGVyID0gY29weUhlbHBlcjsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCXRoaXMuc3JjUHJvY2VzcyA9IHNyY1Byb2Nlc3M7Ci0JCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLQkJdGhpcy5jb3B5VG9PcmlnaW5hbE1hcCA9IGNvcHlUb09yaWdpbmFsTWFwOwotCQl0aGlzLnRhcmdldFByb2Nlc3MgPSB0YXJnZXRQcm9jZXNzOwotCi0JCS8vIGdldCBkaWFncmFtIG1hbmFnZXIgYW5kIGRvbWFpbgotCQltZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZSh0YXJnZXRQcm9jZXNzLCB0aGlzKTsKLQkJZG9tYWluID0gbWdyLmdldEVkaXRpbmdEb21haW4oKTsKLQl9CQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQl0cnkgewotCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZG9tYWluLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWRvRXhlY3V0ZSgpOwotCQkJCX0KLQkJCQkKLQkJCX0pOwotCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkb0V4ZWN1dGUoKSB7CQkKLQkJaWYgKGNvcGllZEVsZW1lbnRzID09IG51bGwpIHsKLQkJCWNvcGllZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxEaWFncmFtPigpOwotCQl9IGVsc2UgewotCQkJY29waWVkRWxlbWVudHMuY2xlYXIoKTsKLQkJfQotCQljb3B5VG9XcmFwcGVyUGF0aE1hcCA9IG5ldyBIYXNoTWFwPEJyZWFrZG93bkVsZW1lbnQsIFN0cmluZz4oKTsKLQkJaWYgKGNvcHlIZWxwZXIgIT0gbnVsbCkgewotCQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBCcmVha2Rvd25FbGVtZW50PiBlbnRyeSA6IGNvcHlIZWxwZXIKLQkJCQkJLmdldFdyYXBwZXJQYXRoVG9Db3B5TWFwKCkuZW50cnlTZXQoKSkgewotCQkJCWNvcHlUb1dyYXBwZXJQYXRoTWFwLnB1dChlbnRyeS5nZXRWYWx1ZSgpLCBlbnRyeS5nZXRLZXkoKSk7Ci0JCQl9Ci0JCX0KLQkJRGlhZ3JhbVNlcnZpY2UgZGlhZ3JhbVN2YyA9IG5ldyBEaWFncmFtU2VydmljZSgpOwotCQl0cnkgewkJCQotCQkJZm9yIChPYmplY3QgZSA6IGVsZW1lbnRzKSB7Ci0JCQkJT2JqZWN0IG9yaWcgPSBjb3B5VG9PcmlnaW5hbE1hcC5nZXQoZSk7Ci0JCQkJaWYgKG9yaWcgIT0gbnVsbCAmJiBvcmlnIGluc3RhbmNlb2YgQWN0aXZpdHkgJiYgZSAhPSBudWxsCi0JCQkJCQkmJiBlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJQWN0aXZpdHkgY29weUFjdGl2aXR5ID0gKEFjdGl2aXR5KSBlOwotCQkJCQlBY3Rpdml0eSBvcmlnQWN0aXZpdHkgPSAoQWN0aXZpdHkpIG9yaWc7Ci0KLQkJCQkJQ29sbGVjdGlvbjxEaWFncmFtPiBkaWFncmFtcyA9IGRpYWdyYW1TdmMuZ2V0RGlhZ3JhbXMob3JpZ0FjdGl2aXR5KTsKLQkJCQkJaWYgKGRpYWdyYW1zICE9IG51bGwgJiYgIWRpYWdyYW1zLmlzRW1wdHkoKSkgewotCQkJCQkJZm9yIChEaWFncmFtIGRpYWdyYW0gOiBkaWFncmFtcykgewotCQkJCQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJCQkJLy8gY29weSB0aGUgZGlhZ3JhbQotCQkJCQkJCQlEaWFncmFtIGRpYWdyYW1Db3B5ID0gKERpYWdyYW0pIERpYWdyYW1IZWxwZXIKLQkJCQkJCQkJCQkuY29weURpYWdyYW0oZG9tYWluLCBkaWFncmFtKTsKLQotCQkJCQkJCQkvLyB1cGRhdGUgY2hpbGRyZW4gcmVmZXJlbmNlcwotCQkJCQkJCQl1cGRhdGVSZWZlcmVuY2VzKGRpYWdyYW1Db3B5LCBjb3B5QWN0aXZpdHksIG9yaWdBY3Rpdml0eSk7Ci0KLQkJCQkJCQkJLy8gYXNzb2NpYXRlIHdpdGggdGhlIGFjdGl2aXR5Ci0JCQkJCQkJCWludCBkaWFncmFtVHlwZSA9IERpYWdyYW1IZWxwZXIKLQkJCQkJCQkJCQkuZ2V0RGlhZ3JhbVR5cGUoZGlhZ3JhbUNvcHkpOwotCQkJCQkJCQltZ3IuYXNzb2NpYXRlKGRpYWdyYW1Db3B5LCBkaWFncmFtVHlwZSwKLQkJCQkJCQkJCQkoQWN0aXZpdHkpIGNvcHlBY3Rpdml0eSk7Ci0KLQkJCQkJCQkJY29waWVkRWxlbWVudHMuYWRkKGRpYWdyYW1Db3B5KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCWlmIChERUJVRykgewotCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJZGlhZ3JhbVN2Yy5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNsZWFyUmVhZE9ubHkob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSBub2RlKSB7Ci0JCW5vZGUuc2V0UmVhZE9ubHkoZmFsc2UpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoTm9kZUNvbnRhaW5lcilub2RlKS5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUgY2hpbGQgPSAob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJY2hpbGQuc2V0UmVhZE9ubHkoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQkKLQkKLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGdldE9yaWdpbmFsV3JhcHBlcihBY3Rpdml0eSBjb3B5KSB7Ci0JCVN0cmluZyB3cmFwcGVyUGF0aCA9IGNvcHlUb1dyYXBwZXJQYXRoTWFwLmdldChjb3B5KTsKLQkJaWYod3JhcHBlclBhdGggPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYoc3JjUHJvY2VzcyAhPSBudWxsKSB7Ci0JCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKHNyY1Byb2Nlc3MpOwotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJQ29uZmlndXJhdGlvblNldHRlciBjb25maWdTZXR0ZXIgPSBuZXcgQ29uZmlndXJhdGlvblNldHRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCQl0cnkgewotCQkJCWNvbmZpZ1NldHRlci5zZXQoY29uZmlnKTsKLQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcih3cmFwcGVyUGF0aCwgIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCUFycmF5TGlzdDxTdHJpbmc+IGd1aWRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQkJd2hpbGUodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQlndWlkTGlzdC5hZGQodG9rZW5zLm5leHRUb2tlbigpKTsKLQkJCQl9Ci0JCQkJU3RyaW5nW10gZ3VpZFBhdGggPSBuZXcgU3RyaW5nW2d1aWRMaXN0LnNpemUoKV07Ci0JCQkJZ3VpZExpc3QudG9BcnJheShndWlkUGF0aCk7Ci0JCQkJT2JqZWN0IG8gPSBzdXBwcmVzc2lvbi5nZXRPYmplY3RCeVBhdGgoZ3VpZFBhdGgsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQlpZihvIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJcmV0dXJuIChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgbzsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiQ29weURpYWdyYW1Db21tYW5kLmdldE9yaWdpbmFsV3JhcHBlcigpOiBpbnZhbGlkIHdyYXBwZXIgZm9yIGNvcHkgYWN0aXZpdHk6ICIgKyBvKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWNvbmZpZ1NldHRlci5yZXN0b3JlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgQ29sbGVjdGlvbjxCcmVha2Rvd25FbGVtZW50PiBnZXRCcmVha2Rvd25FbGVtZW50cyhBY3Rpdml0eSBvcmlnQWN0aXZpdHksIEFjdGl2aXR5IGNvcHlBY3Rpdml0eSkgewotCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gZ2V0T3JpZ2luYWxXcmFwcGVyKGNvcHlBY3Rpdml0eSk7Ci0JCU9iamVjdCBvYmplY3QgPSB3cmFwcGVyICE9IG51bGwgPyB3cmFwcGVyIDogb3JpZ0FjdGl2aXR5OwotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUNvbmZpZ3VyYXRpb25TZXR0ZXIgY29uZmlnU2V0dGVyID0gbmV3IENvbmZpZ3VyYXRpb25TZXR0ZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0cnkgewotCQkJY29uZmlnU2V0dGVyLnNldChjb25maWcpOwotCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGlwID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQob2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwkJCQkJCi0JCQlDb2xsZWN0aW9uPD8+IG9yaWdDaGlsZHJlbiA9IGlwLmdldENoaWxkcmVuKG9yaWdBY3Rpdml0eSk7Ci0JCQlDb2xsZWN0aW9uPEJyZWFrZG93bkVsZW1lbnQ+IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxCcmVha2Rvd25FbGVtZW50PigpOwotCQkJZm9yKE9iamVjdCBvcmlnQ2hpbGQgOiBvcmlnQ2hpbGRyZW4pIHsKLQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKG9yaWdDaGlsZCk7Ci0JCQkJaWYoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJZWxlbWVudHMuYWRkKChCcmVha2Rvd25FbGVtZW50KSBlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZWxlbWVudHM7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQljb25maWdTZXR0ZXIucmVzdG9yZSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEJyZWFrZG93bkVsZW1lbnQgZ2V0QnJlYWtkb3duRWxlbWVudChDb2xsZWN0aW9uPEJyZWFrZG93bkVsZW1lbnQ+IGVsZW1lbnRzLCBBY3Rpdml0eSBiYXNlKSB7Ci0JCWZvciAoQnJlYWtkb3duRWxlbWVudCBlIDogZWxlbWVudHMpIHsKLQkJCWlmKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJZmluZF9iYXNlOgotCQkJCWZvcihWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlOyB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbDsgdmUgPSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpIHsKLQkJCQkJaWYodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IGJhc2UpIHsKLQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCWJyZWFrIGZpbmRfYmFzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihmb3VuZCkgewotCQkJCQlyZXR1cm4gKEJyZWFrZG93bkVsZW1lbnQpIGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIGNsYXNzIENvcHlGaW5kZXIgewotCQlwcml2YXRlIEFjdGl2aXR5IG9yaWdBY3Rpdml0eTsKLQkJcHJpdmF0ZSBBY3Rpdml0eSBjb3B5QWN0aXZpdHk7Ci0JCXByaXZhdGUgTWFwPEJyZWFrZG93bkVsZW1lbnQsIEJyZWFrZG93bkVsZW1lbnQ+IG9yaWdpbmFsVG9Db3B5TWFwOwotCQlwcml2YXRlIENvbGxlY3Rpb248QnJlYWtkb3duRWxlbWVudD4gZWxlbWVudHM7Ci0JCQotCQlwcml2YXRlIENvcHlGaW5kZXIoQWN0aXZpdHkgb3JpZ0FjdGl2aXR5LCBBY3Rpdml0eSBjb3B5QWN0aXZpdHkpIHsKLQkJCXRoaXMub3JpZ0FjdGl2aXR5ID0gb3JpZ0FjdGl2aXR5OwotCQkJdGhpcy5jb3B5QWN0aXZpdHkgPSBjb3B5QWN0aXZpdHk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBNYXA8QnJlYWtkb3duRWxlbWVudCwgQnJlYWtkb3duRWxlbWVudD4gZ2V0T3JpZ2luYWxUb0NvcHlNYXAoKSB7Ci0JCQlpZihvcmlnaW5hbFRvQ29weU1hcCA9PSBudWxsKSB7Ci0JCQkJb3JpZ2luYWxUb0NvcHlNYXAgPSBuZXcgSGFzaE1hcDxCcmVha2Rvd25FbGVtZW50LCBCcmVha2Rvd25FbGVtZW50PigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb3B5QWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnQgb3JpZyA9IChCcmVha2Rvd25FbGVtZW50KSBjb3B5SGVscGVyLmdldE9yaWdpbmFsKGUpOwotCQkJCQlvcmlnaW5hbFRvQ29weU1hcC5wdXQob3JpZywgZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG9yaWdpbmFsVG9Db3B5TWFwOwotCQl9Ci0JCQotCQlCcmVha2Rvd25FbGVtZW50IGZpbmRDb3B5KEJyZWFrZG93bkVsZW1lbnQgb3JpZ2luYWwpIHsKLQkJCU9iamVjdCBjb3B5ID0gZ2V0T3JpZ2luYWxUb0NvcHlNYXAoKS5nZXQob3JpZ2luYWwpOwotCQkJaWYoY29weSA9PSBudWxsKSB7Ci0JCQkJaWYob3JpZ2luYWwgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkvLyBtZSBtdXN0IGJlIGEgYmFzZSBlbGVtZW50IG9mIGEgbG9jYWwgY29udHJpYnV0b3Igb3IgcmVwbGFjZXIKLQkJCQkJLy8gCi0JCQkJCWlmKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCQkJCWVsZW1lbnRzID0gZ2V0QnJlYWtkb3duRWxlbWVudHMob3JpZ0FjdGl2aXR5LCBjb3B5QWN0aXZpdHkpOwotCQkJCQl9Ci0JCQkJCWNvcHkgPSBnZXRCcmVha2Rvd25FbGVtZW50KGVsZW1lbnRzLCAoQWN0aXZpdHkpIG9yaWdpbmFsKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gKEJyZWFrZG93bkVsZW1lbnQpIGNvcHk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgZUFubm90YXRpb25zIHJlZmVyZW5jZXMKLQkgKiAKLQkgKiBAcGFyYW0gY29weQotCSAqIEBwYXJhbSBvcmlnQWN0aXZpdHkgCi0JICogQHBhcmFtIGNvcHlBY3Rpdml0eSAKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVSZWZlcmVuY2VzKERpYWdyYW0gY29weSwgQWN0aXZpdHkgY29weUFjdGl2aXR5LCBBY3Rpdml0eSBvcmlnQWN0aXZpdHkpIHsKLQkJaW50IGRpYWdyYW1UeXBlID0gRGlhZ3JhbUhlbHBlci5nZXREaWFncmFtVHlwZShjb3B5KTsKLQkJQ29weUZpbmRlciBjb3B5RmluZGVyID0gbmV3IENvcHlGaW5kZXIob3JpZ0FjdGl2aXR5LCBjb3B5QWN0aXZpdHkpOwotCQlMaXN0PE9iamVjdD4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJLy8gY29sbGVjdCBhbGwgY2hpbGRyZW4gZmlyc3QgZS5nLiBmb3IgQWN0aXZpdHlQYXJ0aXRpb24KLQkJLy8gd2UgZG9uJ3QgaGF2ZSBwYXJ0aXRpb24gaW50byBwYXJ0aXRpb24gc28ganVzdCBnZXR0aW5nIG9uZSBsZXZlbCBzdWItY2hpbGRyZW4KLQkJLy8gYXJlIGVub3VnaCBmb3Igbm93LgotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0b3IgPSBjb3B5LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRvci5uZXh0KCk7Ci0JCQlFT2JqZWN0IG9iaiA9IG5vZGUuZ2V0RWxlbWVudCgpOwotCQkJY2hpbGRyZW4uYWRkKG5vZGUpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uKXsKLQkJCQljaGlsZHJlbi5hZGRBbGwobm9kZS5nZXRDaGlsZHJlbigpKTsKLQkJCX0KLQkJfQotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdG9yLm5leHQoKTsKLQkJCUVPYmplY3Qgb2JqID0gbm9kZS5nZXRFbGVtZW50KCk7Ci0KLQkJCWlmIChkaWFncmFtVHlwZSA9PSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSkgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlCi0JCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBBY3Rpdml0eVBhcmFtZXRlck5vZGUpIHsKLQkJCQkJRU1vZGVsRWxlbWVudCBtb2RlbEVsZW1lbnQgPSAoRU1vZGVsRWxlbWVudCkgb2JqOwotCQkJCQlNZXRob2RFbGVtZW50IG1lID0gQnJpZGdlSGVscGVyCi0JCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRGcm9tQW5ub3RhdGlvbihtb2RlbEVsZW1lbnQsCi0JCQkJCQkJCQl0YXJnZXRQcm9jZXNzLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpOwotCQkJCQlpZihtZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsJCQkJCQkKLQkJCQkJCUJyZWFrZG93bkVsZW1lbnQgbWFwcGVkTWV0aG9kRWxlbWVudCA9IGNvcHlGaW5kZXIuZmluZENvcHkoKEJyZWFrZG93bkVsZW1lbnQpIG1lKTsKLQotCQkJCQkJaWYgKG1hcHBlZE1ldGhvZEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCUJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvbihtb2RlbEVsZW1lbnQsIG1hcHBlZE1ldGhvZEVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChkaWFncmFtVHlwZSA9PSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pIHsKLQkJCQlpZihvYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSB7Ci0JCQkJCWNsZWFyUmVhZE9ubHkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpb2JqKTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIpIHsKLQkJCQkJTm9kZUNvbnRhaW5lciBub2RlQ29udGFpbmVyID0gKE5vZGVDb250YWluZXIpIG9iajsKLQkJCQkJLy8gZG8gbWFwcGluZyBmb3Igbm9kZWNvbnRhaW5lcgotCQkJCQlNZXRob2RFbGVtZW50IG1lID0gbm9kZUNvbnRhaW5lci5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQkJCU9iamVjdCBtYXBwZWRNZXRob2RFbGVtZW50ID0gbnVsbDsKLQkJCQkJaWYobWUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQltYXBwZWRNZXRob2RFbGVtZW50ID0gY29weUZpbmRlci5maW5kQ29weSgoQnJlYWtkb3duRWxlbWVudCkgbWUpOwotCQkJCQkJaWYgKG1hcHBlZE1ldGhvZEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCW5vZGVDb250YWluZXIKLQkJCQkJCQkuc2V0TGlua2VkRWxlbWVudCgoTWV0aG9kRWxlbWVudCkgbWFwcGVkTWV0aG9kRWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyBkbyBtYXBwaW5nIGZvciBpdHMgY2hpbGRyZW4KLQkJCQkJTGlzdDw/PiBub2RlcyA9IG5vZGVDb250YWluZXIuZ2V0Tm9kZXMoKTsKLQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlOYW1lZE5vZGUgbmFtZWROb2RlID0gKE5hbWVkTm9kZSkgbm9kZXMuZ2V0KGkpOwotCQkJCQkJbWUgPSBuYW1lZE5vZGUuZ2V0TGlua2VkRWxlbWVudCgpOwotCQkJCQkJaWYgKG1lIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJCW1hcHBlZE1ldGhvZEVsZW1lbnQgPSBjb3B5RmluZGVyCi0JCQkJCQkJCQkuZmluZENvcHkoKEJyZWFrZG93bkVsZW1lbnQpIG1lKTsKLQkJCQkJCQlpZiAobWFwcGVkTWV0aG9kRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJCW5hbWVkTm9kZQotCQkJCQkJCQkJCS5zZXRMaW5rZWRFbGVtZW50KChNZXRob2RFbGVtZW50KSBtYXBwZWRNZXRob2RFbGVtZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGRpYWdyYW1UeXBlID09IElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNKSB7Ci0JCQkJaWYob2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCQljbGVhclJlYWRPbmx5KChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKW9iaik7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBOYW1lZE5vZGUpIHsKLQkJCQkJTmFtZWROb2RlIG5hbWVkTm9kZSA9IChOYW1lZE5vZGUpIG9iajsKLQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IG5hbWVkTm9kZS5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQkJCWlmIChtZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCU9iamVjdCBtYXBwZWRNZXRob2RFbGVtZW50ID0gY29weUZpbmRlci5maW5kQ29weSgoQnJlYWtkb3duRWxlbWVudCkgbWUpOwotCQkJCQkJaWYgKG1hcHBlZE1ldGhvZEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCW5hbWVkTm9kZQotCQkJCQkJCQkJLnNldExpbmtlZEVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpIG1hcHBlZE1ldGhvZEVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3ByZXBhcmUoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoIShjb3BpZWRFbGVtZW50cyA9PSBudWxsIHx8IGNvcGllZEVsZW1lbnRzLmlzRW1wdHkoKSkpIHsKLQkJCXRyeSB7Ci0JCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZG9tYWluLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb3BpZWRFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGl0ZXIubmV4dCgpOwotCi0JCQkJCQkJCW1nci5nZXRSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkKLQkJCQkJCQkJCQkucmVtb3ZlKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCQkJCQkJbWdyLmdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5yZW1vdmUoZGlhZ3JhbSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfSk7Ci0JCQkJY29waWVkRWxlbWVudHMuY2xlYXIoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChjb3BpZWRFbGVtZW50cyA9PSBudWxsIHx8IGNvcGllZEVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJLy8gY29tbWFuZCBpcyBub3QgZXhlY3V0ZWQgeWV0Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlIYXNoU2V0PE9iamVjdD4gbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29waWVkRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgaXRlci5uZXh0KCk7Ci0JCQlpZihkaWFncmFtICE9IG51bGwgJiYgZGlhZ3JhbS5lUmVzb3VyY2UoKSAhPSBudWxsKQotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChkaWFncmFtLmVSZXNvdXJjZSgpKTsKLQkJfQotCi0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0JCi0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChtZ3IgIT0gbnVsbCkKLQkJCW1nci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9EZWxldGVEaWFncmFtQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9EZWxldGVEaWFncmFtQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjE4MTM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvRGVsZXRlRGlhZ3JhbUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmVkaXRvci5FZGl0b3JTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogQ29tbWFuZCB0byBkZWxldGUgdGhlIGRpYWdyYW0vZGlhZ3JhbSBlbGVtZW50IG9mIGdpdmVuIEFjdGl2aXR5L0NQLCB0aGlzIGNvbW1hbmQgaXMgcGVyZm9ybWVkCi0gKiB0aHJvdWdoIG5lc3RlZCBjb21tYW5kcyBpbiB7QGxpbmsgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmR9LiAgCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZURpYWdyYW1Db21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMgSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBlbGVtZW50c1RvUmVtb3ZlOwotCXByaXZhdGUgUHJvY2VzcyB0YXJnZXRQcm9jZXNzOwotCXByaXZhdGUgRGlhZ3JhbU1hbmFnZXIgZE1nciA9IG51bGw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGVsZXRlRGlhZ3JhbUNvbW1hbmQoQ29sbGVjdGlvbiBlbGVtZW50c1RvUmVtb3ZlLCBQcm9jZXNzIHRhcmdldFByb2Nlc3MpIHsKLQkJdGhpcy5lbGVtZW50c1RvUmVtb3ZlID0gZWxlbWVudHNUb1JlbW92ZTsKLQkJdGhpcy50YXJnZXRQcm9jZXNzID0gdGFyZ2V0UHJvY2VzczsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJRGlhZ3JhbVNlcnZpY2UgZGlhZ3JhbVN2YyA9IG5ldyBEaWFncmFtU2VydmljZSgpOwotCQl0cnkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb1JlbW92ZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlDb2xsZWN0aW9uPERpYWdyYW0+IGRpYWdyYW1zID0gZGlhZ3JhbVN2YwotCQkJCQkJCS5nZXREaWFncmFtcygoQWN0aXZpdHkpIGVsZW1lbnQpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGlhZ3JhbXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJCQkvLyBCZWZvcmUgZGVsZXRpbmcgY2xvc2Ugb3BlbmVkIGRpYWdyYW0gZWRpdG9ycy4KLQkJCQkJCQljbG9zZURpYWdyYW1FZGl0b3IoZGlhZ3JhbSk7Ci0JCQkJCQkJLy8gRGVsZXRlIERpYWdyYW0uCi0JCQkJCQkJRGlhZ3JhbUhlbHBlci5kZWxldGVEaWFncmFtKGRpYWdyYW0sIHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZGlhZ3JhbVN2Yy5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCQotCXByaXZhdGUgRGlhZ3JhbU1hbmFnZXIgZ2V0RGlhZ3JhbU1hbmFnZXIoKSB7Ci0JCWlmKGRNZ3IgPT0gbnVsbCkgewotCQkJZE1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKHRhcmdldFByb2Nlc3MsIHRoaXMpOwotCQl9Ci0JCXJldHVybiBkTWdyOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlEaWFncmFtTWFuYWdlciBkTWdyID0gZ2V0RGlhZ3JhbU1hbmFnZXIoKTsKLQkJSGFzaFNldDxPYmplY3Q+IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQlib29sZWFuIGZpbGVFeGlzdCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlpZiAoZE1nciAhPSBudWxsICYmIGRNZ3IuZ2V0UmVzb3VyY2UoKSAhPSBudWxsCi0JCQkJCSYmICFkTWdyLmdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShGaWxlTWFuYWdlci50b0ZpbGVTdHJpbmcoZE1ncgotCQkJCQkJLmdldFJlc291cmNlKCkuZ2V0VVJJKCkpKTsKLQkJCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQkJCWZpbGVFeGlzdCA9IGZhbHNlOwotCQkJCWlmIChmaWxlRXhpc3QpCi0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChkTWdyLmdldFJlc291cmNlKCkpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHRhcmdldFByb2Nlc3MgIT0gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoZE1nciAhPSBudWxsKXsKLQkJCWRNZ3IucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY2xvc2VEaWFncmFtRWRpdG9yKERpYWdyYW0gZGlhZ3JhbSl7Ci0JCUxpc3QgZWRpdG9ycyA9IEVkaXRvclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRSZWdpc3RlcmVkRWRpdG9yUGFydHMoKTsKLQkJSXRlcmF0b3IgaXQgPSBlZGl0b3JzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9yKSB7Ci0JCQkJRGlhZ3JhbUVkaXRvciBkaWFncmFtRWRpdG9yID0gKChEaWFncmFtRWRpdG9yKSBvYmopOwotCQkJCWlmIChkaWFncmFtRWRpdG9yLmdldERpYWdyYW0oKS5lcXVhbHMoZGlhZ3JhbSkpIHsKLQkJCQkJLy9pdCdzIGFscmVhZHkgb3BlbiwganVzdCBjbG9zZSBpdC4KLQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5hY3RpdmF0ZShkaWFncmFtRWRpdG9yKTsKLQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkuZ2V0QWN0aXZlUGFnZSgpLmNsb3NlRWRpdG9yKGRpYWdyYW1FZGl0b3IsIGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL0RlbGV0ZURpYWdyYW1Ob2RlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9EZWxldGVEaWFncmFtTm9kZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxODM5OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL0RlbGV0ZURpYWdyYW1Ob2RlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBDb21tYW5kIHRvIGRlbGV0ZSBkaWFncmFtIG5vZGVzIG9mIHRoZSBkZWxldGVkIGJyZWFrZG93biBlbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZURpYWdyYW1Ob2RlQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzIElSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0JCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQlwcml2YXRlIENvbGxlY3Rpb248Pz4gYnJlYWtkb3duRWxlbWVudHM7Ci0JcHJpdmF0ZSBEaWFncmFtU2VydmljZSBkaWFncmFtU3ZjOwotCi0JcHVibGljIERlbGV0ZURpYWdyYW1Ob2RlQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgQ29sbGVjdGlvbjw/PiBicmVha2Rvd25FbGVtZW50cykgewotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JCXRoaXMuYnJlYWtkb3duRWxlbWVudHMgPSBicmVha2Rvd25FbGVtZW50czsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmKGRpYWdyYW1TdmMgIT0gbnVsbCkgewotCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlciBtZ3IgPSBkaWFncmFtU3ZjLmdldERpYWdyYW1NYW5hZ2VyKGFjdGl2aXR5KTsKLQkJCWlmKG1nciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBtZ3IuZ2V0UmVzb3VyY2UoKTsKLQkJCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbihyZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlDb2xsZWN0aW9uPERpYWdyYW0+IGRpYWdyYW1zID0gZGlhZ3JhbVN2Yy5nZXREaWFncmFtcyhhY3Rpdml0eSk7Ci0JCUNvbGxlY3Rpb248Vmlldz4gdmlld3NUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3Q8Vmlldz4oKTsKLQkJZm9yIChEaWFncmFtIGRpYWdyYW0gOiBkaWFncmFtcykgewotCQkJQWJzdHJhY3RUcmVlSXRlcmF0b3I8Vmlldz4gaXRlcmF0b3IgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3I8Vmlldz4oZGlhZ3JhbSwgZmFsc2UpIHsKLQotCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBWaWV3PiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQkJCXJldHVybiAoKFZpZXcpb2JqZWN0KS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlWaWV3IHZpZXcgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYoYnJlYWtkb3duRWxlbWVudHMuY29udGFpbnMoQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQodmlldywgYWN0aXZpdHkpKSkgewotCQkJCQl2aWV3c1RvRGVsZXRlLmFkZCh2aWV3KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYoIXZpZXdzVG9EZWxldGUuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKFZpZXcgdmlldyA6IHZpZXdzVG9EZWxldGUpIHsKLQkJCQlWaWV3VXRpbC5kZXN0cm95KHZpZXcpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7CQkKLQkJZGlhZ3JhbVN2YyA9IG5ldyBEaWFncmFtU2VydmljZSgpOwotCQlDb2xsZWN0aW9uPERpYWdyYW0+IGRpYWdyYW1zID0gZGlhZ3JhbVN2Yy5nZXREaWFncmFtcyhhY3Rpdml0eSk7Ci0JCXJldHVybiAhZGlhZ3JhbXMuaXNFbXB0eSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWFjdGl2aXR5ID0gbnVsbDsKLQkJYnJlYWtkb3duRWxlbWVudHMgPSBudWxsOwotCQlkaWFncmFtU3ZjLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL05lc3RlZENvbW1hbmRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9OZXN0ZWRDb21tYW5kUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NTk2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL05lc3RlZENvbW1hbmRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0UHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSU5lc3RlZENvbW1hbmRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFjdGl2aXR5RHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQ29weUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Qcm9jZXNzRGVlcENvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuSUFjdGlvblR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQWN0aXZpdHlIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuZG9tYWluLlRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgTmVzdGVkQ29tbWFuZFByb3ZpZGVyIGltcGxlbWVudHMgSU5lc3RlZENvbW1hbmRQcm92aWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuaXNEZWJ1Z2dpbmcoKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklOZXN0ZWRDb21tYW5kUHJvdmlkZXIjY3JlYXRlTmVzdGVkQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCkKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVOZXN0ZWRDb21tYW5kKENvbW1hbmQgY29tbWFuZCkgewotCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIEFjdGl2aXR5RHJvcENvbW1hbmQpIHsKLQkJCUFjdGl2aXR5RHJvcENvbW1hbmQgY21kID0gKEFjdGl2aXR5RHJvcENvbW1hbmQpIGNvbW1hbmQ7Ci0JCQlpZiAoSUFjdGlvblR5cGVQcm92aWRlci5DT1BZID09IGNtZC5nZXRUeXBlKCkpCi0JCQkJcmV0dXJuIGNyZWF0ZU5lc3RlZENvbW1hbmRGb3JDb3B5KGNtZCk7Ci0JCQllbHNlIGlmIChJQWN0aW9uVHlwZVByb3ZpZGVyLkRFRVBfQ09QWSA9PSBjbWQuZ2V0VHlwZSgpKQotCQkJCXJldHVybiBjcmVhdGVOZXN0ZWRDb21tYW5kRm9yRGVlcENvcHkoY21kKTsKLQkJfQotCQllbHNlIGlmIChjb21tYW5kIGluc3RhbmNlb2YgUHJvY2Vzc0RlZXBDb3B5Q29tbWFuZCkgewotCQkJUHJvY2Vzc0RlZXBDb3B5Q29tbWFuZCBjbWQgPSAoUHJvY2Vzc0RlZXBDb3B5Q29tbWFuZCkgY29tbWFuZDsKLQkJCVByb2Nlc3MgZGVlcENvcHkgPSBudWxsOwotCQkJQ29sbGVjdGlvbjw/PiByZXN1bHQgPSBjbWQuZ2V0UmVzdWx0KCk7Ci0JCQlpZighcmVzdWx0LmlzRW1wdHkoKSkgewotCQkJCWRlZXBDb3B5ID0gKFByb2Nlc3MpIHJlc3VsdC5pdGVyYXRvcigpLm5leHQoKTsKLQkJCX0KLQkJCWlmKGRlZXBDb3B5ICE9IG51bGwpIHsKLQkJCQlDb2xsZWN0aW9uPEFjdGl2aXR5PiBkZWVwQ29waWVzID0gbmV3IEFycmF5TGlzdDxBY3Rpdml0eT4oKTsKLQkJCQlkZWVwQ29waWVzLmFkZChkZWVwQ29weSk7Ci0JCQkJcmV0dXJuIGNyZWF0ZU5lc3RlZENvbW1hbmRGb3JEZWVwQ29weShkZWVwQ29waWVzLCBjbWQuZ2V0VGFyZ2V0UHJvY2VzcygpLCAKLQkJCQkJCWNtZC5nZXRDb3B5SGVscGVyKCksIGNtZC5nZXRNZXRob2RDb25maWd1cmF0aW9uKCksIHRydWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBuZXN0ZWQgY29tbWFuZCBmb3IgRHJhZyAmIERyb3AgQ29weQotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQ29tbWFuZCBjcmVhdGVOZXN0ZWRDb21tYW5kRm9yQ29weShBY3Rpdml0eURyb3BDb21tYW5kIGNvbW1hbmQpIHsKLQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXMgPSAoKEFjdGl2aXR5RHJvcENvbW1hbmQpIGNvbW1hbmQpLmdldE1vZGlmaWVkUmVzb3VyY2VzKCk7IAotCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCAmJiAhbW9kaWZpZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlDb21wb3VuZENvbW1hbmQgY21kID0gbmV3IFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoCi0JCQkJCUNvbXBvdW5kQ29tbWFuZC5NRVJHRV9DT01NQU5EX0FMTCk7Ci0KLQkJCUhlbHBlciBjb3BpZWRIZWxwZXIgPSBjb21tYW5kLmdldEFjdGl2aXR5SGFuZGxlcigpLmdldENvcHlIZWxwZXIoKTsKLQkJCUFjdGl2aXR5IHRhcmdldEFjdGl2aXR5ID0gY29tbWFuZC5nZXRBY3Rpdml0eSgpOwotCQkJUHJvY2VzcyB0YXJnZXRQcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHRhcmdldEFjdGl2aXR5KTsKLQkJCWlmICh0YXJnZXRQcm9jICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQljbWQuYXBwZW5kKG5ldyBDb3B5RGlhZ3JhbUNvbW1hbmQoY29waWVkSGVscGVyLnZhbHVlcygpLAotCQkJCQkJCWNvcGllZEhlbHBlciwgdGFyZ2V0UHJvYykpOwotCQkJCQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCi0JCQkJfQotCQkJfQotCQkJaWYgKCFjbWQuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuIGNtZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlZCBuZXN0ZWQgY29tbWFuZCBmb3IgRHJhZyBhbmQgRHJvcCBEZWVwIGNvcHkKLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIENvbW1hbmQgY3JlYXRlTmVzdGVkQ29tbWFuZEZvckRlZXBDb3B5KEFjdGl2aXR5RHJvcENvbW1hbmQgY29tbWFuZCkgewotCQlBY3Rpdml0eUhhbmRsZXIgYWN0aXZpdHlIYW5kbGVyID0gKChBY3Rpdml0eURyb3BDb21tYW5kKSBjb21tYW5kKQotCQkJCS5nZXRBY3Rpdml0eUhhbmRsZXIoKTsKLQkJaWYgKGFjdGl2aXR5SGFuZGxlciAhPSBudWxsCi0JCQkJJiYgIWFjdGl2aXR5SGFuZGxlci5nZXREZWVwQ29waWVzKCkuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gY3JlYXRlTmVzdGVkQ29tbWFuZEZvckRlZXBDb3B5KGFjdGl2aXR5SGFuZGxlcgotCQkJCQkuZ2V0RGVlcENvcGllcygpLCBhY3Rpdml0eUhhbmRsZXIuZ2V0VGFyZ2V0UHJvY2VzcygpLAotCQkJCQlhY3Rpdml0eUhhbmRsZXIuZ2V0RGVlcENvcHlIZWxwZXIoKSwgYWN0aXZpdHlIYW5kbGVyLmdldERlZXBDb3B5Q29uZmlnKCksIGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBDb21tYW5kIGNyZWF0ZU5lc3RlZENvbW1hbmRGb3JEZWVwQ29weSgKLQkJCUNvbGxlY3Rpb248QWN0aXZpdHk+IGRlZXBDb3BpZXMsIGZpbmFsIFByb2Nlc3MgdGFyZ2V0UHJvYywKLQkJCUNvcHlIZWxwZXIgY29weUhlbHBlciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlib29sZWFuIHNhdmVEaWFncmFtKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjbWQ7Ci0JCWlmIChzYXZlRGlhZ3JhbSkgewotCQkJY21kID0gbmV3IFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoCi0JCQkJCUNvbXBvdW5kQ29tbWFuZC5NRVJHRV9DT01NQU5EX0FMTCkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQkJCXN1cGVyLmV4ZWN1dGUoKTsKLQotCQkJCQkvLyBzYXZlIGRpYWdyYW0gZmlsZQotCQkJCQkvLwotCQkJCQlpZiAob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcgotCQkJCQkJCS5oYXNEaWFncmFtTWFuYWdlcih0YXJnZXRQcm9jKSkgewotCQkJCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlciBtZ3IgPSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyCi0JCQkJCQkJCS5nZXRJbnN0YW5jZSh0YXJnZXRQcm9jLCB0aGlzKTsKLQkJCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJCQkJLmdldFBlcnNpc3RlckZvcih0YXJnZXRQcm9jLmVSZXNvdXJjZSgpKQotCQkJCQkJCQkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBtZ3IuZ2V0UmVzb3VyY2UoKTsKLQkJCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJLmxvZ0Vycm9yKGV4KTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCW1nci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCX0gZWxzZSB7Ci0JCQljbWQgPSBuZXcgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZCgKLQkJCQkJQ29tcG91bmRDb21tYW5kLk1FUkdFX0NPTU1BTkRfQUxMKTsKLQkJfQotCQlmb3IgKEFjdGl2aXR5IGNvcHlBY3QgOiBkZWVwQ29waWVzKSB7Ci0JCQlBY3Rpdml0eSBvcmlnQWN0ID0gKEFjdGl2aXR5KSBjb3B5SGVscGVyLmdldE9yaWdpbmFsKGNvcHlBY3QpOwotCQkJUHJvY2VzcyBzcmNQcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKG9yaWdBY3QpOwotCQkJTWFwPEFjdGl2aXR5LCBBY3Rpdml0eT4gY29weVRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcDxBY3Rpdml0eSwgQWN0aXZpdHk+KCk7Ci0JCQlJdGVyYXRvcjxCcmVha2Rvd25FbGVtZW50PiBjb3B5VHJlZSA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcjxCcmVha2Rvd25FbGVtZW50PigKLQkJCQkJY29weUFjdCkgewotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50PiBnZXRDaGlsZHJlbigKLQkJCQkJCU9iamVjdCBvYmplY3QpIHsKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlyZXR1cm4gKChBY3Rpdml0eSkgb2JqZWN0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCQkJCS5pdGVyYXRvcigpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJfQotCi0JCQl9OwotCQkJd2hpbGUgKGNvcHlUcmVlLmhhc05leHQoKSkgewotCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IGNvcHlUcmVlLm5leHQoKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCU9iamVjdCBvcmlnID0gY29weUhlbHBlci5nZXRPcmlnaW5hbChlKTsKLQkJCQkJaWYgKG9yaWcgPT0gbnVsbCkgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiTmVzdGVkQ29tbWFuZFByb3ZpZGVyLmNyZWF0ZU5lc3RlZENvbW1hbmRGb3JEZWVwQ29weSgpOiBGQVRBTCBFUlJPUjogY291bGQgbm90IGZpbmQgc291cmNlIGFjdGl2aXR5IG9mIGRlZXAgY29weTogIiArIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljb3B5VG9PcmlnaW5hbE1hcC5wdXQoKEFjdGl2aXR5KSBlLCAoQWN0aXZpdHkpIG9yaWcpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY21kLmFwcGVuZChuZXcgQ29weURpYWdyYW1Gb3JEZWVwQ29weUNvbW1hbmQoY29weVRvT3JpZ2luYWxNYXAua2V5U2V0KCksCi0JCQkJCWNvcHlUb09yaWdpbmFsTWFwLCBzcmNQcm9jLCB0YXJnZXRQcm9jLCBjb3B5SGVscGVyLCBjb25maWcpKTsKLQkJfQotCQlyZXR1cm4gIWNtZC5pc0VtcHR5KCkgPyBjbWQgOiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklOZXN0ZWRDb21tYW5kUHJvdmlkZXIjY3JlYXRlUmVsYXRlZE9iamVjdHMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCkKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVSZWxhdGVkT2JqZWN0cyhDb2xsZWN0aW9uIGNyZWF0ZWRFbGVtZW50cywKLQkJCUNvbW1hbmQgY3JlYXRlQ29tbWFuZCkgewotCi0JCUNvbXBvdW5kQ29tbWFuZCBjbWQgPSBuZXcgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZCgKLQkJCQlDb21wb3VuZENvbW1hbmQuTUVSR0VfQ09NTUFORF9BTEwpOwotCQlpZiAoY3JlYXRlQ29tbWFuZCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKSB7Ci0KLQkJCU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kIG1lQ29tbWFuZCA9ICgoTWV0aG9kRWxlbWVudEFkZENvbW1hbmQpIGNyZWF0ZUNvbW1hbmQpOwotCQkJQ29tbWFuZCBhZGRDb21tYW5kID0gbWVDb21tYW5kLmdldENvbW1hbmQoKTsKLQkJCWlmIChhZGRDb21tYW5kIGluc3RhbmNlb2YgQWRkQ29tbWFuZCkgewotCQkJCUVkaXRpbmdEb21haW4gZWQgPSAoKEFkZENvbW1hbmQpIGFkZENvbW1hbmQpLmdldERvbWFpbigpOwotCQkJCQotCQkJCWlmICgoKEFkZENvbW1hbmQpYWRkQ29tbWFuZCkuZ2V0T3duZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJCWlmIChlZCBpbnN0YW5jZW9mIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJCQkJTWFwIGNvcHlUb09yaWdpbmFsTWFwID0gKChUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGVkKQotCQkJCQkJCQkuZ2V0Q29weVRvT3JpZ2luYWxNYXAoKTsKLQkJCQkJCWlmICghY29weVRvT3JpZ2luYWxNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJQ29sbGVjdGlvbiBhZmZlY3RzID0gbWVDb21tYW5kLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFmZmVjdHMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIKLQkJCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCQkJCWNtZC5hcHBlbmQobmV3IENvcHlEaWFncmFtQ29tbWFuZCgKLQkJCQkJCQkJCQkJY29weVRvT3JpZ2luYWxNYXAua2V5U2V0KCksCi0JCQkJCQkJCQkJCWNvcHlUb09yaWdpbmFsTWFwLAotCQkJCQkJCQkJCQkoKFByb2Nlc3NDb21wb25lbnQpIGVsZW1lbnQpCi0JCQkJCQkJCQkJCQkJLmdldFByb2Nlc3MoKSkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gQ29weS9wYXN0ZSB3aXRoaW4gdGhlIHByb2Nlc3MgZWRpdG9yCi0JCQkJCWlmIChlZCBpbnN0YW5jZW9mIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJCQkJTWFwIG9yaWdpbmFsVG9Db3B5TWFwID0gKChUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGVkKQotCQkJCQkJCQkuZ2V0T3JpZ2luYWxUb0NsaXBib2FyZE1hcCgpOwotCQkJCQkJTWFwIGNvcHlUb09yaWdpbmFsTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkJCU9iamVjdCBvd25lciA9ICgoQWRkQ29tbWFuZCkgYWRkQ29tbWFuZCkuZ2V0T3duZXIoKTsKLQkJCQkJCVByb2Nlc3MgdGFyZ2V0UHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyhvd25lcik7Ci0JCQkJCQlpZiAodGFyZ2V0UHJvYyAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb3JpZ2luYWxUb0NvcHlNYXAua2V5U2V0KCkKLQkJCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQkJT2JqZWN0IGtleSA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCQlPYmplY3QgdmFsID0gb3JpZ2luYWxUb0NvcHlNYXAuZ2V0KGtleSk7Ci0JCi0JCQkJCQkJCWNvcHlUb09yaWdpbmFsTWFwLnB1dCh2YWwsIGtleSk7Ci0JCQkJCQkJfQotCQotCQkJCQkJCWNtZC5hcHBlbmQobmV3IENvcHlEaWFncmFtQ29tbWFuZChjb3B5VG9PcmlnaW5hbE1hcC5rZXlTZXQoKSwKLQkJCQkJCQkJCWNvcHlUb09yaWdpbmFsTWFwLCB0YXJnZXRQcm9jKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCFjbWQuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gY21kOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklOZXN0ZWRDb21tYW5kUHJvdmlkZXIjcmVtb3ZlUmVsYXRlZE9iamVjdHMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCkKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCByZW1vdmVSZWxhdGVkT2JqZWN0cyhDb2xsZWN0aW9uIGRlbGV0ZWRFbGVtZW50cywKLQkJCUNvbW1hbmQgZGVsZXRlQ29tbWFuZCkgewotCQlDb21wb3VuZENvbW1hbmQgY21kID0gbmV3IFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoCi0JCQkJQ29tcG91bmRDb21tYW5kLk1FUkdFX0NPTU1BTkRfQUxMKTsKLQkJaWYoZGVsZXRlQ29tbWFuZCBpbnN0YW5jZW9mIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKXsKLQkJCUNvbW1hbmQgcmVtb3ZlQ29tbWFuZCA9ICgoRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQpZGVsZXRlQ29tbWFuZCkuZ2V0Q29tbWFuZCgpOwotCQkJTGlzdDxSZW1vdmVDb21tYW5kPiByZW1vdmVDb21tYW5kcyA9IG51bGw7Ci0JCQlpZihyZW1vdmVDb21tYW5kIGluc3RhbmNlb2YgUmVtb3ZlQ29tbWFuZCl7Ci0JCQkJcmVtb3ZlQ29tbWFuZHMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KChSZW1vdmVDb21tYW5kKXJlbW92ZUNvbW1hbmQpOwotCQkJfQotCQkJZWxzZSBpZihyZW1vdmVDb21tYW5kIGluc3RhbmNlb2YgQ29tcG91bmRDb21tYW5kKSB7Ci0JCQkJcmVtb3ZlQ29tbWFuZHMgPSBuZXcgQXJyYXlMaXN0PFJlbW92ZUNvbW1hbmQ+KCk7Ci0JCQkJZm9yIChDb21tYW5kIGNvbW1hbmQgOiAoKENvbXBvdW5kQ29tbWFuZClyZW1vdmVDb21tYW5kKS5nZXRDb21tYW5kTGlzdCgpKSB7Ci0JCQkJCWlmKGNvbW1hbmQgaW5zdGFuY2VvZiBSZW1vdmVDb21tYW5kKSB7Ci0JCQkJCQlyZW1vdmVDb21tYW5kcy5hZGQoKFJlbW92ZUNvbW1hbmQpIGNvbW1hbmQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYocmVtb3ZlQ29tbWFuZHMgIT0gbnVsbCAmJiAhcmVtb3ZlQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQkJT2JqZWN0IG93bmVyID0gcmVtb3ZlQ29tbWFuZHMuZ2V0KDApLmdldE93bmVyKCk7Ci0JCQkJaWYob3duZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlQcm9jZXNzIHByb2Nlc3MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEFjdGl2aXR5KW93bmVyKTsKLQkJCQkJQ29sbGVjdGlvbjxBY3Rpdml0eT4gYWxsRWxlbWVudHMgPSBuZXcgSGFzaFNldDxBY3Rpdml0eT4oKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVsZXRlZEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3I8T2JqZWN0PihlbGVtZW50KSB7Ci0KLQkJCQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgT2JqZWN0PiBnZXRDaGlsZHJlbigKLQkJCQkJCQkJCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCQkJCXJldHVybiAoKEFjdGl2aXR5KW9iamVjdCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLml0ZXJhdG9yKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQotCQkJCQkJCX07Ci0JCQkJCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJCU9iamVjdCBlID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQlpZihlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQkJCWFsbEVsZW1lbnRzLmFkZCgoQWN0aXZpdHkpIGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSAKLQkJCQkJfQkJCQkJCi0JCQkJCWlmKCFhbGxFbGVtZW50cy5pc0VtcHR5KCkpewotCQkJCQkJY21kLmFwcGVuZChuZXcgRGVsZXRlRGlhZ3JhbUNvbW1hbmQoYWxsRWxlbWVudHMsIHByb2Nlc3MpKTsKLQkJCQkJfQotCi0JCQkJCWZvciAoUmVtb3ZlQ29tbWFuZCBjb21tYW5kIDogcmVtb3ZlQ29tbWFuZHMpIHsKLQkJCQkJCWlmKGNvbW1hbmQuZ2V0T3duZXIoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJRGVsZXRlRGlhZ3JhbU5vZGVDb21tYW5kIGRlbGV0ZURpYWdyYW1Ob2RlQ29tbWFuZCA9IG5ldyBEZWxldGVEaWFncmFtTm9kZUNvbW1hbmQoCi0JCQkJCQkJCQkoQWN0aXZpdHkpIGNvbW1hbmQuZ2V0T3duZXIoKSwgY29tbWFuZC5nZXRDb2xsZWN0aW9uKCkpOwotCQkJCQkJCWlmKGRlbGV0ZURpYWdyYW1Ob2RlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQkJCQkJY21kLmFwcGVuZChkZWxldGVEaWFncmFtTm9kZUNvbW1hbmQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZighZGVsZXRlZEVsZW1lbnRzLmlzRW1wdHkoKSl7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZWxldGVkRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCl7Ci0JCQkJCVByb2Nlc3NDb21wb25lbnQgcGMgPSAoUHJvY2Vzc0NvbXBvbmVudCllbGVtZW50OwotCQkJCQlQcm9jZXNzIHByb2Nlc3MgPSBwYy5nZXRQcm9jZXNzKCk7Ci0JCQkJCWNsb3NlRGlhZ3JhbUVkaXRvcnMocHJvY2Vzcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKCFjbWQuaXNFbXB0eSgpKXsKLQkJCXJldHVybiBjbWQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIENsb3NlcyBEaWFncmFtIEVkaXRvcnMgaWYgdGhlIG93bmluZyBwcm9jZXNzIGlzIGRlbGV0ZWQuCi0JICogQHBhcmFtIHByb2Nlc3MKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xvc2VEaWFncmFtRWRpdG9ycyhQcm9jZXNzIHByb2Nlc3MpIHsKLQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlBcnJheUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4gZWRpdG9yc1RvQ2xvc2UgPSBuZXcgQXJyYXlMaXN0PElFZGl0b3JSZWZlcmVuY2U+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSBlZGl0b3JSZWYgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0OwotCQkJdHJ5IHsKLQkJCQllZGl0b3JJbnB1dCA9IGVkaXRvclJlZi5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSB7Ci0JCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9ICgoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIGVkaXRvcklucHV0KQotCQkJCQkJCS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCQkJT2JqZWN0IHdyYXBwZXIgPSBpbnB1dC5nZXRXcmFwcGVyKCk7Ci0JCQkJCU9iamVjdCBvd25pbmdQcm9jZXNzID0gbnVsbDsKLQkJCQkJaWYgKHdyYXBwZXIgIT0gbnVsbCkgewotCQkJCQkJaWYgKHdyYXBwZXIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJCW93bmluZ1Byb2Nlc3MgPSBUbmdVdGlsCi0JCQkJCQkJCQkuZ2V0T3duaW5nUHJvY2VzcygoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB3cmFwcGVyKSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl3cmFwcGVyID0gaW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQkJaWYgKHdyYXBwZXIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQkJb3duaW5nUHJvY2VzcyA9IFRuZ1V0aWwKLQkJCQkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKCgoQnJlYWtkb3duRWxlbWVudCkgd3JhcHBlcikpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChvd25pbmdQcm9jZXNzID09IG93bmluZ1Byb2Nlc3MpIHsKLQkJCQkJCWVkaXRvcnNUb0Nsb3NlLmFkZChlZGl0b3JSZWYpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCQlpZighZWRpdG9yc1RvQ2xvc2UuaXNFbXB0eSgpKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlW10gcmVmcyA9IG5ldyBJRWRpdG9yUmVmZXJlbmNlW2VkaXRvcnNUb0Nsb3NlLnNpemUoKV07Ci0JCQllZGl0b3JzVG9DbG9zZS50b0FycmF5KHJlZnMpOwotCQkJd29ya2JlbmNoUGFnZS5jbG9zZUVkaXRvcnMocmVmcywgZmFsc2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9SZWNvbm5lY3RMaW5rQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9SZWNvbm5lY3RMaW5rQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzI1YTFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvUmVjb25uZWN0TGlua0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uaW1wbC5JbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLlR4VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWNvbm5lY3RMaW5rQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBib29sZWFuIGlzU291cmNlOwotCi0JcHJpdmF0ZSBFZGdlIGxpbms7Ci0KLQlwcml2YXRlIE5vZGUgbmV3Tm9kZSwgb2xkTm9kZTsKLQotCXByaXZhdGUgaW50IHZpZXdJbmRleDsKLQotCXByaXZhdGUgUG9pbnQgZW5kUG9pbnQ7Ci0KLQlwcml2YXRlIEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gIlJlY29ubmVjdCBMaW5rIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFJlY29ubmVjdExpbmtDb21tYW5kKEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBFZGdlIGxpbmssIE5vZGUgbmV3Tm9kZSwgYm9vbGVhbiBpc1NvdXJjZSkgewotCQlzdXBlcihMQUJFTCk7Ci0JCXRoaXMuZG9tYWluID0gZG9tYWluOwotCQl0aGlzLmxpbmsgPSBsaW5rOwotCQl0aGlzLm5ld05vZGUgPSBuZXdOb2RlOwotCQl0aGlzLmlzU291cmNlID0gaXNTb3VyY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5kUG9pbnQoUG9pbnQgcCkgewotCQllbmRQb2ludCA9IHAuZ2V0Q29weSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gbGluayAhPSBudWxsICYmIG5ld05vZGUgIT0gbnVsbDsKLQkJaWYgKCFyZXN1bHQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoaXNTb3VyY2UpIHsKLQkJCXJldHVybiBEaWFncmFtQ29yZVZhbGlkYXRpb24uY2hlY2tSZWNvbm5lY3QobmV3Tm9kZSwgKE5vZGUpbGluay5nZXRUYXJnZXQoKSwgbGluaykgPT0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBEaWFncmFtQ29yZVZhbGlkYXRpb24uY2hlY2tSZWNvbm5lY3QoKE5vZGUpbGluay5nZXRTb3VyY2UoKSwgbmV3Tm9kZSwgbGluaykgPT0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0KLQkJLy8gTGluawotCQl0cnkgewotCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZG9tYWluLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc1NvdXJjZSkgewotCQkJCQkJb2xkTm9kZSA9IChOb2RlKSBsaW5rLmdldFNvdXJjZSgpOwotCQkJCQkJaWYgKG9sZE5vZGUgIT0gbnVsbCkgeyAvLyBzYWZldHkgY2hlY2sgdG8gaGFuZGxlIGRhbmdsaW5nIGxpbmsKLQkJCQkJCQl2aWV3SW5kZXggPSBvbGROb2RlLmdldFRhcmdldEVkZ2VzKCkuaW5kZXhPZihsaW5rKTsKLQkJCQkJCX0KLQkJCQkJCWxpbmsuc2V0U291cmNlKG5ld05vZGUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJb2xkTm9kZSA9IChOb2RlKSBsaW5rLmdldFRhcmdldCgpOwotCQkJCQkJaWYgKG9sZE5vZGUgIT0gbnVsbCkgeyAvLyBzYWZldHkgY2hlY2sgdG8gaGFuZGxlIGRhbmdsaW5nIGxpbmsKLQkJCQkJCQl2aWV3SW5kZXggPSBvbGROb2RlLmdldFNvdXJjZUVkZ2VzKCkuaW5kZXhPZihsaW5rKTsKLQkJCQkJCX0KLQkJCQkJCWxpbmsuc2V0VGFyZ2V0KG5ld05vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIkVycm9yIHdoaWxlIHJlLWNvbm5lY3QgdGhlIGxpbmsgOiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoaXNTb3VyY2UpIHsKLQkJCW5ld05vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5yZW1vdmUobGluayk7Ci0JCQlvbGROb2RlLmdldFRhcmdldEVkZ2VzKCkuYWRkKHZpZXdJbmRleCwgbGluayk7Ci0JCX0gZWxzZSB7Ci0JCQluZXdOb2RlLmdldFNvdXJjZUVkZ2VzKCkucmVtb3ZlKGxpbmspOwotCQkJb2xkTm9kZS5nZXRTb3VyY2VFZGdlcygpLmFkZCh2aWV3SW5kZXgsIGxpbmspOwotCQl9Ci0JCW9sZE5vZGUgPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9maWd1cmVzL1JhaXNlZE1hcmdpbkJvcmRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9maWd1cmVzL1JhaXNlZE1hcmdpbkJvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjU4YzZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvZmlndXJlcy9SYWlzZWRNYXJnaW5Cb3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSAgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5JbnNldHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotLyoqCi0gKiAgQSBib3JkZXIgd2l0aCBhIHJhaXNlZCBtYXJnaW4uCi0gKiAgCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJhaXNlZE1hcmdpbkJvcmRlciBleHRlbmRzIE1hcmdpbkJvcmRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnNldHMgREVGQVVMVF9JTlNFVFMgPSBuZXcgSW5zZXRzKDEwLCAxMCwgMTAsIDEwKTsKLQotCXB1YmxpYyBSYWlzZWRNYXJnaW5Cb3JkZXIoKSB7Ci0JCXRoaXMoREVGQVVMVF9JTlNFVFMpOwotCX0KLQotCXB1YmxpYyBSYWlzZWRNYXJnaW5Cb3JkZXIoSW5zZXRzIGluc2V0cykgewotCQlzdXBlcihpbnNldHMpOwotCX0KLQotCXB1YmxpYyBSYWlzZWRNYXJnaW5Cb3JkZXIoaW50IHQsIGludCBsLCBpbnQgYiwgaW50IHIpIHsKLQkJc3VwZXIodCwgbCwgYiwgcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQm9yZGVyI2dldEluc2V0cyhJRmlndXJlKQotCSAqLwotCXB1YmxpYyBJbnNldHMgZ2V0SW5zZXRzKElGaWd1cmUgZmlndXJlKSB7Ci0JCXJldHVybiBpbnNldHM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkJvcmRlciNpc09wYXF1ZSgpCi0JICovCQotCXB1YmxpYyBib29sZWFuIGlzT3BhcXVlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5Cb3JkZXIjcGFpbnQoSUZpZ3VyZSwgR3JhcGhpY3MsIEluc2V0cykKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYWludChJRmlndXJlIGZpZ3VyZSwgR3JhcGhpY3MgZywgSW5zZXRzIGluc2V0cykgewotCQlnLnNldExpbmVTdHlsZShHcmFwaGljcy5MSU5FX1NPTElEKTsKLQkJZy5zZXRMaW5lV2lkdGgoMSk7Ci0JCWcuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJ1dHRvbkxpZ2h0ZXN0KTsKLQkJUmVjdGFuZ2xlIHIgPSBnZXRQYWludFJlY3RhbmdsZShmaWd1cmUsIGluc2V0cyk7Ci0JCXIucmVzaXplKC0xLCAtMSk7Ci0JCWcuZHJhd0xpbmUoci54LCByLnksIHIucmlnaHQoKSwgci55KTsKLQkJZy5kcmF3TGluZShyLngsIHIueSwgci54LCByLmJvdHRvbSgpKTsKLQkJZy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYnV0dG9uRGFya2VyKTsKLQkJZy5kcmF3TGluZShyLngsIHIuYm90dG9tKCksIHIucmlnaHQoKSwgci5ib3R0b20oKSk7Ci0JCWcuZHJhd0xpbmUoci5yaWdodCgpLCByLnksIHIucmlnaHQoKSwgci5ib3R0b20oKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2ZpZ3VyZXMvV2lkZW5lZFdyYXBMYWJlbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9maWd1cmVzL1dpZGVuZWRXcmFwTGFiZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxNjU3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2ZpZ3VyZXMvV2lkZW5lZFdyYXBMYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL0NvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy9hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vL0NvbnRyaWJ1dG9yczoKLS8vSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci0KLS8qKgotICogVGVtcG9yYXJ5IHJlcGxhY2VtZW50IGZvciB7QGxpbmsgV3JhcExhYmVsfSB1bnRpbCB0aGUgdGV4dCBjdXQtb2ZmIGlzc3VlIGlzIGZpeGVkLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgV2lkZW5lZFdyYXBMYWJlbCBleHRlbmRzIFdyYXBMYWJlbCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBERUxUQV9GQUNUT1IgPSAwLjA1ZjsKLQkKLQlwcml2YXRlIERpbWVuc2lvbiB0ZXh0U2l6ZTsKLQlwcml2YXRlIERpbWVuc2lvbiBhZGp1c3RlZFRleHRTaXplOwotCQotCXB1YmxpYyBXaWRlbmVkV3JhcExhYmVsKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRGltZW5zaW9uIGdldFRleHRTaXplKGludCB3SGludCwgaW50IGhIaW50KSB7Ci0JCURpbWVuc2lvbiBuZXdUZXh0U2l6ZSA9IHN1cGVyLmdldFRleHRTaXplKHdIaW50LCBoSGludCk7Ci0JCWlmKG5ld1RleHRTaXplICE9IG51bGwgJiYgbmV3VGV4dFNpemUgIT0gdGV4dFNpemUpIHsKLQkJCXRleHRTaXplID0gbmV3VGV4dFNpemU7Ci0JCQkKLQkJCS8vIHdvcmstYXJvdW5kOiBpbmNyZWFzZSB0aGUgdGV4dCBzaXplIHRvIGF2b2lkIHRleHQgY3V0LW9mZgotCQkJLy8KLQkJCWFkanVzdGVkVGV4dFNpemUgPSB0ZXh0U2l6ZS5nZXRFeHBhbmRlZCgoaW50KSBNYXRoLmNlaWwodGV4dFNpemUud2lkdGggKiBERUxUQV9GQUNUT1IpLCA0KTsKLQkJfQotCQlyZXR1cm4gYWRqdXN0ZWRUZXh0U2l6ZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBvaW50IGdldFRleHRMb2NhdGlvbigpIHsKLQkJUG9pbnQgcCA9IHN1cGVyLmdldFRleHRMb2NhdGlvbigpOwotCQlSZWN0YW5nbGUgciA9IGdldEJvdW5kcygpOwotCQlEaW1lbnNpb24gdHMgPSBnZXRUZXh0U2l6ZShyLndpZHRoLCByLmhlaWdodCk7Ci0JCWlmKHIud2lkdGggPD0gdHMud2lkdGgpIHsKLQkJCXAueCA9IDA7Ci0JCQlpZighZ2V0VGV4dCgpLmVxdWFsc0lnbm9yZUNhc2UoZ2V0U3ViU3RyaW5nVGV4dCgpKSkgewotCQkJCWludmFsaWRhdGUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvQWJzdHJhY3REaWFncmFtRWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvQWJzdHJhY3REaWFncmFtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMmZhODUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0Fic3RyYWN0RGlhZ3JhbUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLkNyZWF0ZUVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLkRlbGVnYXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EaWFncmFtQWN0aW9uc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkRpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC51dGlsLkRpYWdyYW1FZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzLlNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMuSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5JTWV0aG9kRWxlbWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkuZWRpdG9ycy5JTWV0aG9kRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQ29udGV4dE1lbnVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLktleUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLktleVN0cm9rZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5HRUZBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS51dGlsLlN0cmluZ1N0YXRpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLkFjdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuaW50ZXJuYWwuU2VsZWN0QWxsQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5JRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5lZGl0b3IuRmlsZURpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnBhcnRzLkRpYWdyYW1Eb2N1bWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuc2VydmljZXMuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIHNrYW5ub29yCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERpYWdyYW1FZGl0b3IgZXh0ZW5kcyBGaWxlRGlhZ3JhbUVkaXRvciBpbXBsZW1lbnRzIElHb3RvTWFya2VyLCBJTWV0aG9kRWRpdG9yIHsKLQotCXByaXZhdGUgRGlhZ3JhbU1hbmFnZXIgZGlhZ3JhbU1ncjsKLQlwcml2YXRlIERpYWdyYW1BY3Rpb25zU2VydmljZSBhY3Rpb25TZXJ2aWNlID0gbnVsbDsKLQkKLQlwcml2YXRlIGxvbmcgZk1vZGlmaWNhdGlvblN0YW1wOwotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0JcHJpdmF0ZSBBZGFwdGVySW1wbCB0aXRsZUFkYXB0ZXI7Ci0KLQlwcml2YXRlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZihldmVudC5nZXRTb3VyY2UoKSA9PSBkaWFncmFtTWdyKSB7Ci0JCQkJSURvY3VtZW50UHJvdmlkZXIgZG9jUHJvdmlkZXIgPSBnZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCQkJaWYoZG9jUHJvdmlkZXIgaW5zdGFuY2VvZiBTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKSB7Ci0JCQkJCWlmKCFpc0RpcnR5KCkpIHsKLQkJCQkJCSgoU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcilkb2NQcm92aWRlcikuaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkKGdldEVkaXRvcklucHV0KCkpOwotCQkJCQl9Ci0JCQkJfQkJCQkKLQkJCX0KLQkJfQotCQkKLQl9OwotCQotCS8vIExpc3RlbmVycyB0byByZWZyZXNoIGRpYWdyYW0gaWYgY29uZmlndXJhdGlvbiBnb3QgY2hhbmdlZAotCS8vCi0JcHJpdmF0ZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpYnJhcnlMaXN0ZW5lciA9IG5ldyBJTGlicmFyeUNoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2hhbmdlZChpbnQgb3B0aW9uLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJCXN3aXRjaCAob3B0aW9uKSB7Ci0JCQljYXNlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQ6IHsKLQkJCQlpZiAoY29sbGVjdGlvbiAhPSBudWxsICYmIGNvbGxlY3Rpb24uY29udGFpbnMoY3VycmVudENvbmZpZykpIHsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0Uuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjdXJyZW50Q29uZmlnKTsJCQkJCQotCQkJCQkJcmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRS5zZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQkJCX0KLQkJCQl9CQkKLQkJCQlicmVhazsKLQkJCX0KLQkJCS8vIGhhbmRsZWQgYnkgbGliU3ZjTGlzdGVuZXIKLQkJCS8vCi0vLwkJCWNhc2UgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ09ORklHVVJBVElPTl9TRUxFQ1RFRDogewotLy8JCQkJY29uZmlnQ2hhbmdlZCgpOwotLy8JCQkJYnJlYWs7Ci0vLwkJCX0KLQkJCX0KLQkJfQotCX07Ci0JCi0JcHJpdmF0ZSBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lciBsaWJTdmNMaXN0ZW5lciA9IG5ldyBMaWJyYXJ5U2VydmljZUxpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCWNvbmZpZ0NoYW5nZWQoKTsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnOwotCi0JLy9UT0RPOiBpZiB0aGlzIGZsYWcgaXMgc2V0LCByZWZyZXNoIGRpYWdyYW0gaWYgbmVlZGVkIHdoZW4gdGhlIGVkaXRvciBpcyBhY3RpdmF0ZWQgCi0JcHJpdmF0ZSBib29sZWFuIG5lZWRSZWZyZXNoOwotCXByaXZhdGUgRGlhZ3JhbVNlcnZpY2UgZGlhZ3JhbVN2YzsKLQotCXB1YmxpYyBBYnN0cmFjdERpYWdyYW1FZGl0b3IoKSB7Ci0JCXN1cGVyKHRydWUpOwotCX0KLQkKLQlwdWJsaWMgQWJzdHJhY3REaWFncmFtRWRpdG9yKGJvb2xlYW4gaGFzRmx5b3V0UGFsZXR0ZSkgewotCQlzdXBlcihoYXNGbHlvdXRQYWxldHRlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVkaXRpbmdEb21haW5JRCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5FZGl0aW5nRG9tYWluIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBEaWFncmFtTWFuYWdlciBnZXREaWFncmFtTWFuYWdlcigpIHsKLQkJaWYgKGRpYWdyYW1NZ3IgPT0gbnVsbCkgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0aXZpdHkpOwotCQkJZGlhZ3JhbU1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKHByb2MsIHRoaXMpOwotCQkJZGlhZ3JhbU1nci5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JCXJldHVybiBkaWFncmFtTWdyOwotCX0KLQkKLQlwcm90ZWN0ZWQgRGlhZ3JhbVNlcnZpY2UgZ2V0RGlhZ3JhbVNlcnZpY2UoKSB7Ci0JCWlmKGRpYWdyYW1TdmMgPT0gbnVsbCkgewotCQkJZGlhZ3JhbVN2YyA9IG5ldyBEaWFncmFtU2VydmljZSgpOwotCQl9Ci0JCXJldHVybiBkaWFncmFtU3ZjOwotCX0KLQotCXByb3RlY3RlZCBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBjcmVhdGVFZGl0aW5nRG9tYWluKCkgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBnZXREaWFncmFtTWFuYWdlcigpLmdldEVkaXRpbmdEb21haW4oKTsKLQkJZG9tYWluLnNldElEKGdldEVkaXRpbmdEb21haW5JRCgpKTsKLQkJcmV0dXJuIGRvbWFpbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5wYXJ0cy5EaWFncmFtRG9jdW1lbnRFZGl0b3Ijc2V0RG9jdW1lbnRQcm92aWRlcihvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RG9jdW1lbnRQcm92aWRlcihJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc2V0RG9jdW1lbnRQcm92aWRlcihuZXcgU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcihnZXREaWFncmFtTWFuYWdlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGRvU3luY2hyb25pemUoT2JqZWN0IGVsZW1lbnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCS8vIHJlbG9hZCBkaWFncmFtJ3MgcmVzb3VyY2UKLQkJCQkvLwotCQkJCURpYWdyYW1NYW5hZ2VyIG1nciA9IGdldERpYWdyYW1NYW5hZ2VyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJbWdyLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCQkJCW1nci5yZWxvYWQoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0UGx1Z2luSWQoKSwKLQkJCQkJCQkwLCAiRXJyb3IgcmVsb2FkaW5nIGRpYWdyYW0iLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1nci5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCQkJCX0KLQkJCQlzdXBlci5kb1N5bmNocm9uaXplKGVsZW1lbnQsIG1vbml0b3IpOwotCQkJfQotCQl9KTsJCQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnBhcnRzLkRpYWdyYW1Eb2N1bWVudEVkaXRvciNkb1NldElucHV0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCwgYm9vbGVhbikKLQkgKiBAY3VzdG9tCi0JICovCi0JcHVibGljIHZvaWQgZG9TZXRJbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQsIGJvb2xlYW4gcmVsZWFzZUVkaXRvckNvbnRlbnRzKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlhY3Rpdml0eSA9IChBY3Rpdml0eSkgZ2V0TWV0aG9kRWxlbWVudChpbnB1dCk7Ci0JCURpYWdyYW1FZGl0b3JJbnB1dFByb3h5IGlucHV0UHJveHkgPSBudWxsOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgewotCQkJaW5wdXRQcm94eSA9IChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgaW5wdXQ7Ci0JCQlpbnB1dFByb3h5LnNldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKGNyZWF0ZUVkaXRpbmdEb21haW4oKSk7Ci0JCX0KLQkJc3VwZXIuZG9TZXRJbnB1dChpbnB1dCwgcmVsZWFzZUVkaXRvckNvbnRlbnRzKTsKLQkJaWYoaXNFZGl0YWJsZSgpICYmIGlucHV0UHJveHkgIT0gbnVsbCAmJiAhaW5wdXRQcm94eS5pc05ld0RpYWdyYW0oKSkgewotCQkJZ2V0RGlhZ3JhbU1hbmFnZXIoKS5iYWNrdXBEaWFncmFtKGFjdGl2aXR5LCBnZXREaWFncmFtKCkpOwotCQl9Ci0JCWluaXRpYWxpemVUaXRsZShpbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGVkaXRvcidzIHRpdGxlIGJhc2VkIG9uIHRoZSBnaXZlbiBlZGl0b3IgaW5wdXQuCi0JICoKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGVkaXRvciBpbnB1dCB0byBiZSB1c2VkCi0JICogQGN1c3RvbQotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVGl0bGUoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0KLQkJU3RyaW5nIHRpdGxlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSBmaWxlSW5wdXQgPSAoRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5KSBpbnB1dDsKLQkJCURpYWdyYW1FZGl0b3JJbnB1dCBkaWFncmFtSW5wdXQgPSBmaWxlSW5wdXQuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCk7Ci0JCQlNZXRob2RFbGVtZW50IGlucHV0RWxlbWVudCA9IGRpYWdyYW1JbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQlpZiAoaW5wdXRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkvL3RpdGxlID0gaW5wdXRFbGVtZW50LmdldE5hbWUoKTsKLQkJCQl0aXRsZSA9IGdldFBhcnROYW1lUHJlZml4KCkgKyAKLQkJCQkJCQlpbnB1dEVsZW1lbnQuZ2V0TmFtZSgpKwotCQkJCQkJCVN0cmluZ1N0YXRpY3MuQ09NTUEgKyBTdHJpbmdTdGF0aWNzLlNQQUNFICsgCi0JCQkJCQkJZGlhZ3JhbUlucHV0LmdldFN1cHByZXNzaW9uKCkuZ2V0UHJvY2VzcygpLmdldE5hbWUoKTsgCi0vLwkJCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLS8vCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLS8vCQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJCUltYWdlIHRpdGxlSW1hZ2UgPSBnZXRQYXJ0SW1hZ2UoKTsJCQkJCi0JCQkJc2V0VGl0bGVJbWFnZSh0aXRsZUltYWdlKTsKLQkJCX0KLQkJfQotCQlzZXRQYXJ0TmFtZSh0aXRsZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQl9Ci0KLQkvKioKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IucGFydHMuRGlhZ3JhbURvY3VtZW50RWRpdG9yI3Nhbml0eUNoZWNrU3RhdGUob3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqIEBjdXN0b20KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYW5pdHlDaGVja1N0YXRlKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlJRG9jdW1lbnRQcm92aWRlciBwID0gZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotCQlpZiAocCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWxvbmcgc3RhbXAgPSBwLmdldE1vZGlmaWNhdGlvblN0YW1wKGlucHV0KTsKLQkJaWYgKHN0YW1wICE9IGZNb2RpZmljYXRpb25TdGFtcCkgewotCQkJZk1vZGlmaWNhdGlvblN0YW1wID0gc3RhbXA7Ci0JCQlpZiAoIXAuaXNTeW5jaHJvbml6ZWQoaW5wdXQpKSB7Ci0JCQkJaGFuZGxlRWRpdG9ySW5wdXRDaGFuZ2VkKCk7Ci0JCQkJaWYoIXAuaXNTeW5jaHJvbml6ZWQoaW5wdXQpICYmIHAgaW5zdGFuY2VvZiBTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKSB7Ci0JCQkJCSgoU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcilwKS5hbGxvd0VkaXRpbmcoaW5wdXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl1cGRhdGVTdGF0ZShnZXRFZGl0b3JJbnB1dCgpKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IucGFydHMuRGlhZ3JhbURvY3VtZW50RWRpdG9yI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IGdldERpYWdyYW0oKTsKLQkJCi0JCS8vIGlmIGNoYW5nZXMgZGlzY2FyZGVkLCByZXZlcnNlIHRvIHNhdmVkCi0JCS8vCQkKLQkJaWYoaXNEaXJ0eSgpKSB7Ci0JCQlyZXZlcnNlVG9TYXZlZCgpOwotCQl9CQkKLQkJCi0JCWlmKHRpdGxlQWRhcHRlciAhPSBudWxsKXsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IGdldE1ldGhvZEVsZW1lbnQoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlpZihlICE9IG51bGwpewotCQkJCWUuZUFkYXB0ZXJzKCkucmVtb3ZlKHRpdGxlQWRhcHRlcik7Ci0JCQl9Ci0JCQl0aXRsZUFkYXB0ZXIgPSBudWxsOwotCQl9Ci0JCQotCQlpZihkaWFncmFtTWdyICE9IG51bGwpIHsKLQkJCWlmKGFjdGl2aXR5ICE9IG51bGwgJiYgZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJZGlhZ3JhbU1nci5yZW1vdmVEaWFncmFtQmFja3VwKGFjdGl2aXR5LCBkaWFncmFtLmdldFR5cGUoKSk7Ci0JCQl9Ci0JCQlkaWFncmFtTWdyLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCQlkaWFncmFtTWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQl9CQkKLQkJCi0JCWlmKGRpYWdyYW1TdmMgIT0gbnVsbCkgewotCQkJZGlhZ3JhbVN2Yy5kaXNwb3NlKCk7Ci0JCX0KLQkJCQkKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQltYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKGxpYnJhcnlMaXN0ZW5lcik7Ci0JCX0KLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW1vdmVMaXN0ZW5lcihsaWJTdmNMaXN0ZW5lcik7Ci0JCQotCQkvLyBSZW1vdmUgdGhlIGFkYXB0ZXIgZnJvbSB0aGUgdW1sIGFjdGl2aXR5IGlmIGVkaXRvciBpcyBjbG9zZWQuCi0JCWlmKGdldERpYWdyYW0oKS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSl7Ci0JCQlvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSBhY3QgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpZ2V0RGlhZ3JhbSgpLmdldEVsZW1lbnQoKTsKLQkJCWlmKGFjdCAhPSBudWxsICYmIGdldERpYWdyYW1BZGFwdGVyKCkgIT0gbnVsbCl7Ci0JCQkJYWN0LmVBZGFwdGVycygpLnJlbW92ZShnZXREaWFncmFtQWRhcHRlcigpKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gZGlzcG9zZSB0aGUgaW5wdXQKLQkJLy8KLQkJSUVkaXRvcklucHV0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJaWYoaW5wdXQgaW5zdGFuY2VvZiBJRGlzcG9zYWJsZSkgewotCQkJKChJRGlzcG9zYWJsZSlpbnB1dCkuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlEaWFncmFtRWRpdFBhcnQgZWRpdFBhcnQgPSBnZXREaWFncmFtRWRpdFBhcnQoKTsKLQkJaWYoZWRpdFBhcnQgIT0gbnVsbCkgewotCQkJZWRpdFBhcnQuc2V0TW9kZWwobnVsbCk7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCi0JfQotCi0JcHJpdmF0ZSBEaWFncmFtQWRhcHRlciBnZXREaWFncmFtQWRhcHRlcigpIHsKLQkJVmlldyB2aWV3ID0gKChWaWV3KSBnZXREaWFncmFtRWRpdFBhcnQoKS5nZXRNb2RlbCgpKTsKLQkJcmV0dXJuIHZpZXcgIT0gbnVsbCA/IChEaWFncmFtQWRhcHRlcikgQnJpZGdlSGVscGVyCi0JCQkJLmdldE5vZGVBZGFwdGVyKHZpZXcuZ2V0RWxlbWVudCgpKSA6IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJldmVyc2VUb1NhdmVkKCkgewotCQl0cnkgewotCQkJSURvY3VtZW50UHJvdmlkZXIgcCA9IGdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJCWlmKHAgaW5zdGFuY2VvZiBTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKSB7Ci0JCQkJKChTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKXApLnJldmVyc2VUb1NhdmVkKGdldEVkaXRvcklucHV0KCkpOwotCQkJfQotCQkJCi0JCQlEaWFncmFtQWRhcHRlciBhZGFwdGVyID0gZ2V0RGlhZ3JhbUFkYXB0ZXIoKTsKLQkJCWlmKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJCS8vVE9ETzogcmV2ZXJzZSB0byBzYXZlZCBmb3IgQUREIGFuZCBXUERECi0JCQkJcmV0dXJuOwotCQkJfQotCQkJSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyID0gYWRhcHRlci5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCQlib29sZWFuIGRpcnR5ID0gYWN0aW9uTWdyLmlzU2F2ZU5lZWRlZCgpOwotCQkJaWYgKGRpcnR5KSB7Ci0JCQkJYWN0aW9uTWdyLnVuZG9BbGwoKTsKLS8vCQkJCWdldE9wZXJhdGlvbkhpc3RvcnkoKS51bmRvKGdldFVuZG9Db250ZXh0KCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotLy8JCQkJZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLmRpc3Bvc2UoZ2V0VW5kb0NvbnRleHQoKSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCQl9Ci0JCQlnZXRBY3Rpb25NYW5hZ2VyKCkuY2xlYXIoKTsKLQotCQkJLy8gc2F2ZSB0aGUgdW5kb25lIGNoYW5nZXMgb25seSBpZiB0aGUgcmVzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHRoaXMgZWRpdG9yCi0JCQkvLwotCQkJYm9vbGVhbiBzYXZlTmVlZGVkID0gZGlydHkKLQkJCSYmIGdldExhc3RNb2RpZmllZCgpID4gYWRhcHRlci5nZXRVbWFMYXN0TW9kaWZpZWQoKTsKLQkJCU1ldGhvZEVsZW1lbnQgbWU7Ci0JCQlpZiAoc2F2ZU5lZWRlZCAmJiAobWUgPSBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCkpICE9IG51bGwpIHsKLQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldEN1cnJlbnRQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5zYXZlKG1lLmVSZXNvdXJjZSgpKTsKLQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkvL1RPRE86IHJlbG9hZCBsaWJyYXJ5IG5lZWRlZAotCQkJCQkJLy8JCQkJCVZpZXdIZWxwZXIucmVsb2FkQ3VycmVudExpYnJhcnkoZ2V0U2l0ZSgpLmdldFNoZWxsKCksIG51bGwpOwotCQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBQcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCU9iamVjdCBpbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpIHsKLQkJCXJldHVybiAoKElEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpIGlucHV0KQotCQkJCQkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuZ2V0U3VwcHJlc3Npb24oKS5nZXRQcm9jZXNzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKSB7Ci0JCXJldHVybiBnZXRNZXRob2RFbGVtZW50KGdldEVkaXRvcklucHV0KCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIERpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSkgewotCQkJcmV0dXJuICgoRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5KSBpbnB1dCkKLQkJCQkJLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKS5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkpIHsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCXJldHVybiBmaWxlLmxhc3RNb2RpZmllZCgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJRGlhZ3JhbUFkYXB0ZXIgZGlhZ3JhbUFkYXB0ZXIgPSBnZXREaWFncmFtQWRhcHRlcigpOwotCQlpZihkaWFncmFtQWRhcHRlciAhPSBudWxsKSB7Ci0JCQlJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IgPSBnZXREaWFncmFtQWRhcHRlcigpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJCWlmIChhY3Rpb25NZ3IgIT0gbnVsbCAmJiBhY3Rpb25NZ3IuaXNTYXZlTmVlZGVkKCkpIHsKLQkJCQl0cnkgewotCQkJCQlwcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrKCJTYXZpbmciLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJLmdldEN1cnJlbnRQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJCQl0cnkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aW9uTWdyLmdldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlwcm9ncmVzc01vbml0b3Iuc2V0VGFza05hbWUoTkxTLmJpbmQoRGlhZ3JhbUNvcmVSZXNvdXJjZXMuUHJvZ3Jlc3NfU2F2aW5nX21lc3NhZ2UsCi0JCQkJCQkJCQlyZXNvdXJjZS5nZXRVUkkoKS5pc0ZpbGUoKSA/IHJlc291cmNlLmdldFVSSSgpCi0JCQkJCQkJCQkJCS50b0ZpbGVTdHJpbmcoKSA6ICIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCQlhY3Rpb25NZ3Iuc2F2ZUlzRG9uZSgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQkJCQkvLwkJCQkJCVZpZXdIZWxwZXIKLQkJCQkJCQkvLwkJCQkJCS5yZWxvYWRDdXJyZW50TGliYXJ5T25Sb2xsYmFja0Vycm9yKGdldFNpdGUoKQotCQkJCQkJCS8vCQkJCQkJLmdldFNoZWxsKCkpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJLyoKLQkJCQkJCSAqIE5PIFVJIG1vZHVsZSBzaG91bGQgbm90IGludm9sdmUgd2l0aCBVSSBjbGFzc2VzCi0JCQkJCQkgKiB1c2UgY2FsbGJhY2sgdG8gaGFuZGxlIHN1Y2gga2luZCBvZiBzaXR1YXRpb24KLQkJCQkJCSAqIEppbmh1YSBYaSwgMDEvMTMvMDgKLQkJCQkJCSovCi0vLwkJCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheVdhcm5pbmcoCi0vLwkJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0VGV4dCgpLAotLy8JCQkJCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLldhcm5pbmdfU2F2aW5nX0RpYWdyYW0sIGUuZ2V0TWVzc2FnZSgpLAotLy8JCQkJCQkJCWUpOwotCQkJCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dDYWxsYmFjaygpLmRpc3BsYXlXYXJuaW5nKAotCQkJCQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLCAKLQkJCQkJCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuV2FybmluZ19TYXZpbmdfRGlhZ3JhbSwgZS5nZXRNZXNzYWdlKCksCi0JCQkJCQkJCWUpOwotCQkJCQkKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJcHJvZ3Jlc3NNb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCi0JCXN1cGVyLmRvU2F2ZShwcm9ncmVzc01vbml0b3IpOwotCX0KLQkKLQlwcml2YXRlIGNsYXNzIERpYWdyYW1HcmFwaGljYWxWaWV3ZXJFeCBleHRlbmRzIERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgaW1wbGVtZW50cyBJRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIgewotCi0JCXB1YmxpYyBEaWFncmFtRWRpdG9ySW5wdXQgZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkgewotCQkJcmV0dXJuICgoSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSlnZXRFZGl0b3JJbnB1dCgpKS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJfQotCi0JCXB1YmxpYyBJRWRpdG9yUGFydCBnZXRFZGl0b3IoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3REaWFncmFtRWRpdG9yLnRoaXM7Ci0JCX0JCQkJCi0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIgY3JlYXRlU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyKCkgewotCQlyZXR1cm4gbmV3IERpYWdyYW1HcmFwaGljYWxWaWV3ZXJFeCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpOwotCQkKLQkJY3VycmVudENvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCi0JCS8vIGxpc3RlbiB0byBjaGFuZ2UgZm9yIGN1cnJlbnQgc2VsZWN0aW9uIG9mIE1ldGhvZENvbmZpZ3VyYXRpb24gb3IgY2hhbmdlcyBpbiAKLQkJLy8gY3VycmVudCBjb25maWd1cmF0aW9uLgotCQkvLwotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmFkZExpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQltYW5hZ2VyLmFkZExpc3RlbmVyKGxpYnJhcnlMaXN0ZW5lcik7Ci0JCX0KLQkJZ2V0R3JhcGhpY2FsQ29udHJvbCgpLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvdWJsZUNsaWNrLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWhhbmRsZURvdWJsZUNsaWNrKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JCUlEaWFncmFtR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9ICBnZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCk7Ci0gICAgICAgIENvbnRleHRNZW51UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIodGhpcywKLSAgICAgICAgICAgICAgICBnZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCkpOwotICAgICAgICAgICAgdmlld2VyLnNldENvbnRleHRNZW51KHByb3ZpZGVyKTsKLSAgICAgICAgICAgIGdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KEFjdGlvbklkcy5ESUFHUkFNX0VESVRPUl9DT05URVhUX01FTlUsCi0gICAgICAgICAgICAgICAgcHJvdmlkZXIsIHZpZXdlcik7Ci0JCWlmKGFjdGlvblNlcnZpY2UgIT0gbnVsbCl7Ci0JCQlhY3Rpb25TZXJ2aWNlLnNldEdyYXBoaWNhbFZpZXdlcih2aWV3ZXIpOwotCQl9Ci0JCQotCQl0aXRsZUFkYXB0ZXIgPSBuZXcgQWRhcHRlckltcGwoKXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE1ldGhvZEVsZW1lbnQuY2xhc3MpKSB7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19OQU1FOgotLy8JCQkJCXNldE5hbWUobXNnLmdldE5ld1N0cmluZ1ZhbHVlKCkpOwotCQkJCQlpbml0aWFsaXplVGl0bGUoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJTWV0aG9kRWxlbWVudCBlID0gZ2V0TWV0aG9kRWxlbWVudChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJaWYoZSAhPSBudWxsICYmIHRpdGxlQWRhcHRlciAhPSBudWxsKXsKLQkJCWUuZUFkYXB0ZXJzKCkuYWRkKHRpdGxlQWRhcHRlcik7Ci0JCX0KLQl9Ci0JCQotCXByaXZhdGUgdm9pZCBjb25maWdDaGFuZ2VkKCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJaWYoY3VycmVudENvbmZpZyAhPSBjb25maWcpIHsKLQkJCS8vIHJlZnJlc2ggb25seSBpZiB0aGUgYWN0aXZlIHBhcnQgaXMgdGhpcyBkaWFncmFtIGVkaXRvciBvciBwcm9jZXNzIGVkaXRvciBvZiB0aGUgcHJvY2VzcwotCQkJLy8gdGhhdCBvd25zIHRoaXMgZGlhZ3JhbQotCQkJLy8KLQkJCUlXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFydFNlcnZpY2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQlib29sZWFuIHJlZnJlc2ggPSBhY3RpdmVQYXJ0ID09IHRoaXM7Ci0JCQlpZighcmVmcmVzaCkgewotCQkJCWlmKGFjdGl2ZVBhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotCQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSAoKElFZGl0b3JQYXJ0KWFjdGl2ZVBhcnQpLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJCWlmKGlucHV0IGluc3RhbmNlb2YgSU1ldGhvZEVsZW1lbnRQcm92aWRlcikgewotCQkJCQkJT2JqZWN0IGUgPSAoKElNZXRob2RFbGVtZW50UHJvdmlkZXIpaW5wdXQpLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJCWlmKGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQkJcmVmcmVzaCA9IGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50ICYmIAotCQkJCQkJCWdldFByb2Nlc3MoKSA9PSAoKFByb2Nlc3NDb21wb25lbnQpZSkuZ2V0UHJvY2VzcygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYocmVmcmVzaCkgewotCQkJCWN1cnJlbnRDb25maWcgPSBjb25maWc7Ci0JCQkJcmVmcmVzaCgpOwotCQkJCW5lZWRSZWZyZXNoID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQluZWVkUmVmcmVzaCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJaWYoZ2V0RG9jdW1lbnRQcm92aWRlcigpIGluc3RhbmNlb2YgU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcil7Ci0JCQlTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyIGRvY1Byb3ZpZGVyID0gKChTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKWdldERvY3VtZW50UHJvdmlkZXIoKSk7Ci0JCQlEaWFncmFtRWRpdFBhcnQgZWRpdFBhcnQgPSBnZXREaWFncmFtRWRpdFBhcnQoKTsKLQkJCWJvb2xlYW4gd2FzRGlydHkgPSBpc0RpcnR5KCk7Ci0JCQlib29sZWFuIHdhc0Jhc2VEaXJ0eSA9IGZhbHNlOwotCQkJSUVkaXRvclBhcnQgYmFzZUVkaXRvciA9IG51bGw7Ci0JCQlmaW5hbCBib29sZWFuIGlzSW5oZXJpdGVkID0gRGlhZ3JhbUVkaXRvclV0aWwuaXNJbmhlcml0ZWQoZWRpdFBhcnQpOwotCQkJaWYoaXNJbmhlcml0ZWQpIHsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChlZGl0UGFydC5nZXREaWFncmFtVmlldygpKTsKLQkJCQlTdHJpbmcgdHlwZSA9IGVkaXRQYXJ0LmdldERpYWdyYW1WaWV3KCkuZ2V0VHlwZSgpOwotCQkJCQotCQkJCS8vIHRyeSB0byBmaW5kIHRoZSBkaXJ0eSBmbGFnIG9mIGJhc2UgZGlhZ3JhbSBlZGl0b3IKLQkJCQkvLwotCQkJCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZzID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmID0gZWRpdG9yUmVmc1tpXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmKHJlZi5nZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSkgewotCQkJCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9ICgoSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSlyZWYuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCk7Ci0JCQkJCQkJaWYoaW5wdXQuZ2V0V3JhcHBlcigpID09IG51bGwgJiYgaW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpID09IGVsZW1lbnQgJiYKLQkJCQkJCQkJCURpYWdyYW1NYW5hZ2VyLmdldERpYWdyYW1UeXBlKHR5cGUpID09IGlucHV0LmdldERpYWdyYW1UeXBlKCkpIHsKLQkJCQkJCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmLmdldEVkaXRvcihmYWxzZSk7Ci0JCQkJCQkJCWlmKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCQkJCQl3YXNCYXNlRGlydHkgPSBlZGl0b3IuaXNEaXJ0eSgpOwotCQkJCQkJCQkJYmFzZUVkaXRvciA9IGVkaXRvcjsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWRvY1Byb3ZpZGVyLnNldENvbnRlbnQoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlpZih3YXNEaXJ0eSkgewotCQkJCWRvY1Byb3ZpZGVyLnNldENhblNhdmVEb2N1bWVudChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCX0KLQkJCS8vIGVkaXRvcnMgY2FuIGJlY29tZSBkaXJ0eSBhZnRlciByZWZyZXNoCi0JCQkvLyBjbGVhciBkaXJ0eSBmbGFnCi0JCQkvLwotCQkJZWxzZSBpZihpc0RpcnR5KCkpIHsKLQkJCQkoKFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpIGdldERvY3VtZW50UHJvdmlkZXIoKSkKLQkJCQkJCS5tYXJrRG9jdW1lbnRBc1NhdmVkKChJRmlsZUVkaXRvcklucHV0KWdldEVkaXRvcklucHV0KCkpOwotCQkJfQotCQkJaWYoYmFzZUVkaXRvciAhPSBudWxsICYmICF3YXNCYXNlRGlydHkpIHsKLQkJCQkoKFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpKChEaWFncmFtRG9jdW1lbnRFZGl0b3IpYmFzZUVkaXRvcikuZ2V0RG9jdW1lbnRQcm92aWRlcigpKQotCQkJCQkubWFya0RvY3VtZW50QXNTYXZlZCgoSUZpbGVFZGl0b3JJbnB1dCkgYmFzZUVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCX0KLQkJCXVwZGF0ZVN0YXRlKGdldEVkaXRvcklucHV0KCkpOwotCQl9Ci0JfQotCQotCS8vIERvZXMgbm90aGluZyBidXQgZm9yIG92ZXJyaWRlLiAKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEb3VibGVDbGljayhFdmVudCBldmVudCkgewotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlpZighRGlhZ3JhbUVkaXRvclV0aWwuaXNNb2RpZmlhYmxlKGdldEVkaXRvcklucHV0KCkpKXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNEaXJ0eSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlpZihnZXREb2N1bWVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKXsKLQkJCXJldHVybiAhKChTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKWdldERvY3VtZW50UHJvdmlkZXIoKSkuZ2V0TG9ja2VkU3RhdGUoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEtleUhhbmRsZXIgZ2V0S2V5SGFuZGxlcigpIHsKLQkJS2V5SGFuZGxlciBrZXlIYW5kbGVyID0gIHN1cGVyLmdldEtleUhhbmRsZXIoKTsKLQkJaWYoa2V5SGFuZGxlciAhPSBudWxsKXsKLQkJCUFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0QWN0aW9uUmVnaXN0cnkoKTsKLQkJCUlBY3Rpb24gYWN0aW9uID0gcmVnaXN0cnkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpOwotCQkJCi0JCQlpZihhY3Rpb24gIT0gbnVsbCAmJiAhKGFjdGlvbiBpbnN0YW5jZW9mIERlbGVnYXRlQWN0aW9uKSl7Ci0JCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZW1vdmVBY3Rpb24oYWN0aW9uKTsKLQkJCQlnZXRTZWxlY3Rpb25BY3Rpb25zKCkucmVtb3ZlKGFjdGlvbik7Ci0JCQkJYWN0aW9uID0gbmV3IERlbGVnYXRlQWN0aW9uKChJV29ya2JlbmNoUGFydCl0aGlzLEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpOwotCQkJCWFjdGlvbi5zZXRJZChBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpKTsKLQkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCQkJZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0JCQl9Ci0gICAgICAgICAgICBrZXlIYW5kbGVyLnB1dChLZXlTdHJva2UuZ2V0UHJlc3NlZChTV1QuREVMLCAxMjcsIDApLAotICAgICAgICAgICAgCWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpKTsKLSAgICAgICAgICAgIGtleUhhbmRsZXIucHV0KEtleVN0cm9rZS5nZXRQcmVzc2VkKFNXVC5CUywgOCwgMCksCi0gICAgICAgICAgICAgICAgICAgIGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpKTsKLSAgICAgICAgICAgIGtleUhhbmRsZXIucHV0KC8qIENUUkwgKyBEICovCi0gICAgICAgICAgICAgICAgICAgICAgICBLZXlTdHJva2UuZ2V0UHJlc3NlZCgoY2hhcikgMHgwNCwgMTAwLCBTV1QuQ1RSTCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSkpOwotICAgICAgICAgICAgZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihuZXcgQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24odGhpcyxQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCkpOwotICAgICAgICAgICAgQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24gbW92ZUFjdGlvbiA9ICgoQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24pZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24uTU9WRV9ET1dOX0FDVElPTikpOwotICAgICAgICAgICAga2V5SGFuZGxlci5wdXQoS2V5U3Ryb2tlLmdldFByZXNzZWQoU1dULkFSUk9XX0RPV04sIFNXVC5DVFJMKSwKLSAgICAgICAgICAgIAkJbW92ZUFjdGlvbik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24obmV3IEFjY2Vzc2liaWxpdHlNb3ZlQWN0aW9uKHRoaXMsUG9zaXRpb25Db25zdGFudHMuTk9SVEgpKTsKLSAgICAgICAgICAgIG1vdmVBY3Rpb24gPSAoKEFjY2Vzc2liaWxpdHlNb3ZlQWN0aW9uKWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKEFjY2Vzc2liaWxpdHlNb3ZlQWN0aW9uLk1PVkVfVVBfQUNUSU9OKSk7Ci0gICAgICAgICAgICBrZXlIYW5kbGVyLnB1dChLZXlTdHJva2UuZ2V0UHJlc3NlZChTV1QuQVJST1dfVVAsIFNXVC5DVFJMKSwKLSAgICAgICAgICAgIAkJbW92ZUFjdGlvbik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24obmV3IEFjY2Vzc2liaWxpdHlNb3ZlQWN0aW9uKHRoaXMsUG9zaXRpb25Db25zdGFudHMuV0VTVCkpOwotICAgICAgICAgICAgbW92ZUFjdGlvbiA9ICgoQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24pZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24uTU9WRV9MRUZUX0FDVElPTikpOwotICAgICAgICAgICAga2V5SGFuZGxlci5wdXQoS2V5U3Ryb2tlLmdldFByZXNzZWQoU1dULkFSUk9XX0xFRlQsIFNXVC5DVFJMKSwKLSAgICAgICAgICAgIAkJbW92ZUFjdGlvbik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24obmV3IEFjY2Vzc2liaWxpdHlNb3ZlQWN0aW9uKHRoaXMsUG9zaXRpb25Db25zdGFudHMuRUFTVCkpOwotICAgICAgICAgICAgbW92ZUFjdGlvbiA9ICgoQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24pZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24uTU9WRV9SSUdIVF9BQ1RJT04pKTsKLSAgICAgICAgICAgIGtleUhhbmRsZXIucHV0KEtleVN0cm9rZS5nZXRQcmVzc2VkKFNXVC5BUlJPV19SSUdIVCwgU1dULkNUUkwpLAotICAgICAgICAgICAgCQltb3ZlQWN0aW9uKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogQ1RSTCArIEEgKi8KLSAgICAgICAgICAgIGFjdGlvbiA9IFNlbGVjdEFsbEFjdGlvbi5jcmVhdGVTZWxlY3RBbGxBY3Rpb24oZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJCS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkpOwotICAgICAgICAgICAgZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotICAgICAgICAgICAgZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0JCQlrZXlIYW5kbGVyLnB1dCgKLSAgICAgICAgICAgIAkJS2V5U3Ryb2tlLmdldFJlbGVhc2VkKChjaGFyKSAweDEsIDk3LCBTV1QuQ1RSTCksCi0gICAgICAgICAgICAJCWFjdGlvbik7Ci0JCQkvLyBLZXkgcHJlc3NlZCBldmVudCBmb3IgQ1RSTCArIEEgaXMgbm90IHRyaWdnZXJlZCwgdXNlIGtleSByZWxlYXNlZCBldmVudCBmb3Igbm93Ci0JCQkvLwotCQkJa2V5SGFuZGxlci5wdXQoCi0gICAgICAgICAgICAJCUtleVN0cm9rZS5nZXRSZWxlYXNlZCgoY2hhcikgMHgxLCA5NywgU1dULkNUUkwpLAotICAgICAgICAgICAgCQlhY3Rpb24pOwotIAkJfQotCQkKLQkJcmV0dXJuIGtleUhhbmRsZXI7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLQkJY3JlYXRlQ29udHJvbEZsb3dBY3Rpb24oKTsKLQkJCi0JCS8vIFJlZ2lzdGVyIGFsaWdubWVudCBhY3Rpb25zOgotCQlhY3Rpb25TZXJ2aWNlID0gbmV3IERpYWdyYW1BY3Rpb25zU2VydmljZSgKLQkJCQlnZXREaWFncmFtTWFuYWdlcigpLmdldEVkaXRpbmdEb21haW4oKSwKLQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKSwKLQkJCQlnZXRFZGl0RG9tYWluKCksIGdldEFjdGlvblJlZ2lzdHJ5KCkpOwotCQlhY3Rpb25TZXJ2aWNlLnJlZ2lzdGVySG9yaXpvbnRhbEFsaWduQXZlcmFnZUFjdGlvbigpOwotCQlhY3Rpb25TZXJ2aWNlLnJlZ2lzdGVySG9yaXpvbnRhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbigpOwotCQlhY3Rpb25TZXJ2aWNlLnJlZ2lzdGVyVmVydGljYWxBbGlnbkF2ZXJhZ2VBY3Rpb24oKTsKLQkJYWN0aW9uU2VydmljZS5yZWdpc3RlclZlcnRpY2FsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKCk7Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgSUFjdGlvbiBjcmVhdGVBbkFjdGlvbihTdHJpbmcgYWN0aW9uTmFtZSwKLQkJCUxpc3Q8SUVsZW1lbnRUeXBlPiBlbGVtZW50VHlwZSwgU3RyaW5nIGFjdGlvbklkLAotCQkJU3RyaW5nIHRvb2x0aXBTdHJpbmcsIEltYWdlRGVzY3JpcHRvciBpbWFnZWRlc2MpIHsKLQkJQ3JlYXRlRWxlbWVudEFjdGlvbiBhY3Rpb24gPSBuZXcgQ3JlYXRlRWxlbWVudEFjdGlvbih0aGlzLCBhY3Rpb25OYW1lKTsKLQkJYWN0aW9uLnNldEVsZW1lbnRUeXBlcyhlbGVtZW50VHlwZSk7Ci0JCWFjdGlvbi5zZXRQcmVmZXJlbmNlSGludChnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JCWFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VkZXNjKTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KHRvb2x0aXBTdHJpbmcpOwotCQlhY3Rpb24uc2V0SWQoYWN0aW9uSWQpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Db250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlpZihhY3Rpb25TZXJ2aWNlICE9IG51bGwpewotCQkJYWN0aW9uU2VydmljZS5jcmVhdGVBbGlnbk1lbnUobWVudSwgaXNFZGl0YWJsZSgpKTsKLQkJfQotCQlhZGRUb01lbnUobWVudSwgRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfTElOSywKLQkJCQlHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCB0cnVlLCB0cnVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9NZW51KElNZW51TWFuYWdlciBtZW51LCBTdHJpbmcgaWQsIFN0cmluZyBncm91cE5hbWUsIAotCQkJYm9vbGVhbiBzZXBhcmF0b3IsIGJvb2xlYW4gYXBwZW5kKSB7Ci0JCWJvb2xlYW4gY2FuTW9kaWZ5ID0gaXNFZGl0YWJsZSgpOwotCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihpZCk7Ci0JCQlpZiAoYWN0aW9uICE9IG51bGwgJiYgYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJCWlmIChhcHBlbmQpIHsKLQkJCQkJbWVudS5hcHBlbmRUb0dyb3VwKGdyb3VwTmFtZSwgYWN0aW9uKTsKLQkJCQl9IGVsc2UgewotCQkJCQltZW51LnByZXBlbmRUb0dyb3VwKGdyb3VwTmFtZSwgYWN0aW9uKTsKLQkJCQl9Ci0JCQkJaWYgKHNlcGFyYXRvcikgewotCQkJCQltZW51Lmluc2VydEFmdGVyKGlkLCBuZXcgU2VwYXJhdG9yKCkpOwotCQkJCX0KLQkJCX0KLQkJfWVsc2V7Ci0JCQlpZihzZXBhcmF0b3IgJiYgY2FuTW9kaWZ5KXsKLQkJCQlpZihhcHBlbmQpewotCQkJCQltZW51LmFwcGVuZFRvR3JvdXAoZ3JvdXBOYW1lLCBuZXcgU2VwYXJhdG9yKCkpOwotCQkJCX1lbHNlewotCQkJCQltZW51LnByZXBlbmRUb0dyb3VwKGdyb3VwTmFtZSwgbmV3IFNlcGFyYXRvcigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVG8gcmVzZXQgdGhlIGxheW91dCBvZiB0aGUgZGlhZ3JhbS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldExheW91dCgpewotCQkvLyBkb2VzIG5vdGhpbmcuIGNsaWVudCBzaG91bGQgaW1wbGVtZW50LgotCX0KLQkKLQkKLQkvKioKLQkgKiBSZWZyZXNoIGRpYWdyYW0KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoRGlhZ3JhbSgpewotCQlyZWZyZXNoKCk7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UGFydE5hbWVQcmVmaXgoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSW1hZ2UgZ2V0UGFydEltYWdlKCk7Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRyb2xGbG93QWN0aW9uKCl7Ci0JCUlBY3Rpb24gbGlua0FjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfY29udHJvbF9mbG93X2NyZWF0ZV90ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgPT0gMikgewotCQkJCQlFZGl0UGFydCBzb3VyY2VFZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJCQkJRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMSk7Ci0JCQkJCQotCQkJCQlWaWV3IHNvdXJjZU1vZGVsID0gKFZpZXcpc291cmNlRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJVmlldyB0YXJnZXRNb2RlbCA9IChWaWV3KXRhcmdldEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCQotCQkJCQlpZihCcmlkZ2VIZWxwZXIuaXNSZWFkT25seShzb3VyY2VNb2RlbCkgCi0JCQkJCQkJfHwgQnJpZGdlSGVscGVyLmlzUmVhZE9ubHkodGFyZ2V0TW9kZWwpKQotCQkJCQkJcmV0dXJuOwotCQkJCQkKLQkJCQkJQ3JlYXRlVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblJlcXVlc3QgY29ubmVjdGlvblJlcXVlc3QgPSAKLQkJCQkJCWdldENyZWF0ZUNvbnRyb2xGbG93UmVxdWVzdCgpOwotCQkJCQlpZiAoY29ubmVjdGlvblJlcXVlc3QgIT0gbnVsbCkgewotCQkJCQkJY29ubmVjdGlvblJlcXVlc3Quc2V0U291cmNlRWRpdFBhcnQobnVsbCk7Ci0JCQkJCQljb25uZWN0aW9uUmVxdWVzdC5zZXRUYXJnZXRFZGl0UGFydCh0YXJnZXRFZGl0UGFydCk7Ci0JCQkJCQljb25uZWN0aW9uUmVxdWVzdAotCQkJCQkJCQkuc2V0VHlwZShSZXF1ZXN0Q29uc3RhbnRzLlJFUV9DT05ORUNUSU9OX1NUQVJUKTsKLQkJCQkJCWNvbm5lY3Rpb25SZXF1ZXN0LnNldExvY2F0aW9uKG5ldyBQb2ludCgwLCAwKSk7Ci0JCQkJCQlzb3VyY2VFZGl0UGFydC5nZXRDb21tYW5kKGNvbm5lY3Rpb25SZXF1ZXN0KTsKLQotCQkJCQkJY29ubmVjdGlvblJlcXVlc3Quc2V0U291cmNlRWRpdFBhcnQoc291cmNlRWRpdFBhcnQpOwotCQkJCQkJY29ubmVjdGlvblJlcXVlc3Quc2V0VGFyZ2V0RWRpdFBhcnQodGFyZ2V0RWRpdFBhcnQpOwotCQkJCQkJY29ubmVjdGlvblJlcXVlc3QKLQkJCQkJCQkJLnNldFR5cGUoUmVxdWVzdENvbnN0YW50cy5SRVFfQ09OTkVDVElPTl9FTkQpOwotCQkJCQkJY29ubmVjdGlvblJlcXVlc3Quc2V0TG9jYXRpb24obmV3IFBvaW50KDAsIDApKTsKLQotCQkJCQkJRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydCA9IGdldERpYWdyYW1FZGl0UGFydCgpOwotCQkJCQkJaWYgKGRpYWdyYW1FZGl0UGFydC5pc0VkaXRNb2RlRW5hYmxlZCgpKSB7Ci0JCQkJCQkJQ29tbWFuZCBjbWQgPSB0YXJnZXRFZGl0UGFydAotCQkJCQkJCQkJLmdldENvbW1hbmQoY29ubmVjdGlvblJlcXVlc3QpOwotCQkJCQkJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQkJCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJaWYoZ2V0Q3JlYXRlQ29udHJvbEZsb3dSZXF1ZXN0KCk9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDIpIHsKLQkJCQkJRWRpdFBhcnQgc291cmNlRWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMCk7Ci0JCQkJCUVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDEpOwotCi0JCQkJCVZpZXcgc291cmNlTW9kZWwgPSAoVmlldykgc291cmNlRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJVmlldyB0YXJnZXRNb2RlbCA9IChWaWV3KSB0YXJnZXRFZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlpZihCcmlkZ2VIZWxwZXIuaXNSZWFkT25seShzb3VyY2VNb2RlbCkgCi0JCQkJCQkJfHwgQnJpZGdlSGVscGVyLmlzUmVhZE9ubHkodGFyZ2V0TW9kZWwpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0RGlhZ3JhbSgpLmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFZGdlIGVkZ2UgPSAoRWRnZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZihlZGdlLmdldFNvdXJjZSgpPT0gc291cmNlTW9kZWwgJiYgZWRnZS5nZXRUYXJnZXQoKSA9PSB0YXJnZXRNb2RlbCl7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoc291cmNlTW9kZWwuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlCi0JCQkJCQkJfCBzb3VyY2VNb2RlbC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBOYW1lZE5vZGUKLQkJCQkJCQl8fCB0YXJnZXRNb2RlbC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUKLQkJCQkJCQl8fCB0YXJnZXRNb2RlbC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBOYW1lZE5vZGUpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX0xJTks7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQkJCXJldHVybiBEaWFncmFtQ29uc3RhbnRzLkNPTlRST0xfRkxPV19JTUFHRV9ERVNDUklQVE9SOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGxpbmtBY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIERvZXMgbm90aGluZyBjbGllbnQgc2hvdWxkIGltcGxlbWVudC4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIENyZWF0ZVVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25SZXF1ZXN0IGdldENyZWF0ZUNvbnRyb2xGbG93UmVxdWVzdCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBEaWFncmFtIGdldERpYWdyYW0oQWN0aXZpdHkgYWN0aXZpdHksIGludCB0eXBlKSB7Ci0JCXJldHVybiBnZXREaWFncmFtU2VydmljZSgpLmdldERpYWdyYW0oYWN0aXZpdHksIHR5cGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0RpYWdyYW1FZGl0b3JJbnB1dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0RpYWdyYW1FZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTU3NGY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC9EaWFncmFtRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci0KLS8qKgotICogRGlhZ3JhbUVkaXRvciBJbnB1dCBmb3Ige0BsaW5rIEJyZWFrZG93bkVsZW1lbnR9IAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUVkaXRvcklucHV0IGltcGxlbWVudHMgSUVkaXRvcklucHV0IHsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50OwotCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gbnVsbDsKLQkKLQlwcml2YXRlIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uOwotCi0JcHJpdmF0ZSBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyOwotCi0JcHJpdmF0ZSBpbnQgZGlhZ3JhbVR5cGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIERpYWdyYW1FZGl0b3JJbnB1dCBmb3IgYWN0aXZpdHkgZGlhZ3JhbQotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNEaWFncmFtRWRpdG9ySW5wdXQoT2JqZWN0LCBTdXBwcmVzc2lvbiwgaW50KX0KLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUVkaXRvcklucHV0KE9iamVjdCBvYmplY3QsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCXRoaXMob2JqZWN0LCBzdXBwcmVzc2lvbiwgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0pOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIHN1cHByZXNzaW9uCi0JICogQHBhcmFtIGRpYWdyYW1UeXBlCi0JICogICAgICAgICAgICBjYW4gYmUgb25lIG9mIHRoZSBjb25zdGFudHM6Ci0JICogICAgICAgICAgICB7QGxpbmsgSURpYWdyYW1NYW5hZ2VyI0FDVElWSVRZX0RJQUdSQU19LAotCSAqICAgICAgICAgICAge0BsaW5rIElEaWFncmFtTWFuYWdlciNBQ1RJVklUWV9ERVRBSUxfRElBR1JBTX0sCi0JICogICAgICAgICAgICB7QGxpbmsgSURpYWdyYW1NYW5hZ2VyI1dPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU19Ci0JICovCi0JcHVibGljIERpYWdyYW1FZGl0b3JJbnB1dChPYmplY3Qgb2JqZWN0LCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgaW50IGRpYWdyYW1UeXBlKSB7Ci0JCW1ldGhvZEVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQl3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3Q7Ci0JCX0KLQkJdGhpcy5zdXBwcmVzc2lvbiA9IHN1cHByZXNzaW9uOwotCQl0aGlzLmRpYWdyYW1UeXBlID0gZGlhZ3JhbVR5cGU7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBkaWFncmFtVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN1cHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHN1cHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgd3JhcHBlci4KLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgZ2V0V3JhcHBlcigpIHsKLQkJcmV0dXJuIHdyYXBwZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZ2V0Q2xhc3MoKS5pc0luc3RhbmNlKG9iaikpIHsKLQkJCURpYWdyYW1FZGl0b3JJbnB1dCBvdGhlciA9IChEaWFncmFtRWRpdG9ySW5wdXQpIG9iajsKLQkJCXJldHVybiBnZXRNZXRob2RFbGVtZW50KCkgPT0gb3RoZXIuZ2V0TWV0aG9kRWxlbWVudCgpCi0JCQkJCSYmICgoc3VwcHJlc3Npb24gPT0gbnVsbCAmJiBvdGhlci5nZXRTdXBwcmVzc2lvbigpID09IG51bGwpIHx8IAotCQkJCQkJCShzdXBwcmVzc2lvbi5nZXRQcm9jZXNzKCkgPT0gb3RoZXIuZ2V0U3VwcHJlc3Npb24oKS5nZXRQcm9jZXNzKCkpKQotCQkJCQkmJiBnZXREaWFncmFtVHlwZSgpID09IG90aGVyLmdldERpYWdyYW1UeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgcmVzdWx0ID0gZ2V0TWV0aG9kRWxlbWVudCgpLmhhc2hDb2RlKCk7Ci0JCXJlc3VsdCBePSBzdXBwcmVzc2lvbi5nZXRQcm9jZXNzKCkuaGFzaENvZGUoKTsKLQkJcmVzdWx0IF49IGdldERpYWdyYW1UeXBlKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBEaWFncmFtRWRpdG9ySW5wdXQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCW1ldGhvZEVsZW1lbnQgPSBlOwotCX0KLQotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50OwotCX0KLQkKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNleGlzdHMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldEltYWdlRGVzY3JpcHRvcigpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRQZXJzaXN0YWJsZSgpCi0JICovCi0JcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFRvb2xUaXBUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC9EaWFncmFtRWRpdG9ySW5wdXRQcm94eS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0RpYWdyYW1FZGl0b3JJbnB1dFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlOGY4NGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0RpYWdyYW1FZGl0b3JJbnB1dFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydDsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5zZXJ2aWNlcy5JRGlzcG9zYWJsZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSBleHRlbmRzIERpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSBpbXBsZW1lbnRzIElEaXNwb3NhYmxlCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IERpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQotCXByaXZhdGUgRGlhZ3JhbSBkaWFncmFtOwotCi0JcHJpdmF0ZSBQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZUhpbnQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXdEaWFncmFtOwotCQotCXB1YmxpYyBEaWFncmFtRWRpdG9ySW5wdXRQcm94eShEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQsIFByZWZlcmVuY2VzSGludCBoaW50KSB7Ci0JCXN1cGVyKGlucHV0KTsKLQkJdGhpcy5wcmVmZXJlbmNlSGludCA9IGhpbnQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWRpYWdyYW0gPSBudWxsOwotCX0KLQkKLQlwcml2YXRlIFJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlpZihkaWFncmFtID09IG51bGwgfHwgZGlhZ3JhbS5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldERpYWdyYW1FZGl0b3JJbnB1dCgpLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jZXNzID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdCk7Ci0JCQlpZihwcm9jZXNzICE9IG51bGwpIHsKLQkJCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShwcm9jZXNzLCB0aGlzKTsKLQkJCQl0cnkgewotCQkJCQlpbnQgZGlhZ3JhbVR5cGUgPSBnZXREaWFncmFtRWRpdG9ySW5wdXQoKS5nZXREaWFncmFtVHlwZSgpOwotCQkJCQlMaXN0PERpYWdyYW0+IGxpc3QgPSBtZ3IuZ2V0RGlhZ3JhbXMoYWN0LCBkaWFncmFtVHlwZSk7Ci0JCQkJCWlmKGxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQlkaWFncmFtID0gbWdyLmNyZWF0ZURpYWdyYW0oYWN0LCBkaWFncmFtVHlwZSwgcHJlZmVyZW5jZUhpbnQpOwotCQkJCQkJaXNOZXdEaWFncmFtID0gZGlhZ3JhbSAhPSBudWxsOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZGlhZ3JhbSA9IChEaWFncmFtKSBsaXN0LmdldCgwKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQlpZihERUJVRykgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZGlhZ3JhbSAhPSBudWxsID8gZGlhZ3JhbS5lUmVzb3VyY2UoKSA6IG51bGw7Ci0JfQotCQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0JCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJldHVybiBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShyZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBJU3RvcmFnZSBnZXRTdG9yYWdlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0JCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5yZXNvdXJjZXMuSURpYWdyYW1TdG9yYWdlKCkgewotCQkJCXByaXZhdGUgSUZpbGUgZmlsZTsKLQkJCQkKLQkJCQlwcml2YXRlIElGaWxlIGdldEZpbGUoKSB7Ci0JCQkJCWlmKGZpbGUgPT0gbnVsbCkgewotCQkJCQkJZmlsZSA9IERpYWdyYW1FZGl0b3JJbnB1dFByb3h5LnRoaXMuZ2V0RmlsZSgpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBmaWxlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRDb250ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHVibGljIElQYXRoIGdldEZ1bGxQYXRoKCkgewotCQkJCQlyZXR1cm4gZ2V0RmlsZSgpLmdldEZ1bGxQYXRoKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJCQlyZXR1cm4gcmVzb3VyY2UuZ2V0VVJJKCkudG9TdHJpbmcoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQkJCQlyZXR1cm4gZ2V0RmlsZSgpLmlzUmVhZE9ubHkoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlyZXR1cm4gZ2V0RmlsZSgpLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCi0JCQkJcHVibGljIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLQkJCQkJcmV0dXJuIGRpYWdyYW07Ci0JCQkJfQotCQkJCQotCQkJfTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIGdldERpYWdyYW1FZGl0b3JJbnB1dCgpLmdldE1ldGhvZEVsZW1lbnQoKS5nZXROYW1lKCk7Ci0JCX0KLQkJY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSNleGlzdHMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJLy8gZG9uJ3Qgc2hvdyB0aGlzIGlucHV0IGluIHRoZSBsaXN0IG9mIHJlY2VudGx5IG9wZW4gZmlsZXMKLQkJLy8KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkjZ2V0UGF0aCgpCi0JICovCi0JcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0JCXJldHVybiBnZXRGaWxlKCkuZ2V0TG9jYXRpb24oKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJSUZpbGUgZmlsZSA9IGdldEZpbGUoKTsKLQkJaWYoZmlsZSAhPSBudWxsKSB7Ci0JCQlpZihhZGFwdGVyID09IElGaWxlLmNsYXNzKSB7Ci0JCQkJcmV0dXJuIGZpbGU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gZmlsZS5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYob2JqID09IHRoaXMpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmKG9iaiBpbnN0YW5jZW9mIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSB7Ci0JCQlyZXR1cm4gZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuZXF1YWxzKCgoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpb2JqKS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuaGFzaENvZGUoKTsKLQl9Ci0JCi0JcHVibGljIFByZWZlcmVuY2VzSGludCBnZXRQcmVmZXJlbmNlSGludCgpIHsKLQkJcmV0dXJuIHByZWZlcmVuY2VIaW50OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc05ld0RpYWdyYW0oKSB7Ci0JCXJldHVybiBpc05ld0RpYWdyYW07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0RpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0RpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWE3MWU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC9EaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXRGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSBpbXBsZW1lbnRzCi0JCUlEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkgewotCi0JcHJpdmF0ZSBEaWFncmFtRWRpdG9ySW5wdXQgZGlhZ3JhbUVkaXRvcklucHV0OwotICAgIHByaXZhdGUgSUZpbGUgZmlsZTsKLSAgICBwcml2YXRlIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbjsKLQotCXByb3RlY3RlZCBEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkoRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXRoaXMuZGlhZ3JhbUVkaXRvcklucHV0ID0gaW5wdXQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSNnZXREaWFncmFtRWRpdG9ySW5wdXQoKQotCSAqLwotCXB1YmxpYyBEaWFncmFtRWRpdG9ySW5wdXQgZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkgewotCQlyZXR1cm4gZGlhZ3JhbUVkaXRvcklucHV0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5NRWRpdGluZ0RvbWFpbkVsZW1lbnQjZ2V0RWRpdGluZ0RvbWFpbigpCi0JICovCi0JcHVibGljIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGRvbWFpbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElFZGl0b3JJbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlLmV4aXN0cygpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUFkYXB0YWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotICAgICAgICBpZiAoYWRhcHRlciA9PSBJRmlsZS5jbGFzcykgewotCQkJcmV0dXJuIGZpbGU7Ci0JCX0KLSAgICAgICAgcmV0dXJuIGZpbGUuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQZXJzaXN0YWJsZUVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGYWN0b3J5SWQoKSB7Ci0gICAgICAgIHJldHVybiBGaWxlRWRpdG9ySW5wdXRGYWN0b3J5LmdldEZhY3RvcnlJZCgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURpYWdyYW1GaWxlRWRpdG9ySW5wdXQuCi0gICAgICovCi0gICAgcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUVkaXRvcklucHV0LgotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotICAgICAgICBJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBJREUuZ2V0Q29udGVudFR5cGUoZmlsZSk7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCkKLSAgICAgICAgICAgICAgICAuZ2V0SW1hZ2VEZXNjcmlwdG9yKGZpbGUuZ2V0TmFtZSgpLCBjb250ZW50VHlwZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRWRpdG9ySW5wdXQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gZmlsZS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRWRpdG9ySW5wdXQuCi0gICAgICovCi0gICAgcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVN0b3JhZ2VFZGl0b3JJbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVN0b3JhZ2UgZ2V0U3RvcmFnZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRWRpdG9ySW5wdXQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGRpYWdyYW1FZGl0b3JJbnB1dC5nZXRNZXRob2RFbGVtZW50KCkuZ2V0TmFtZSgpOwotICAgIH0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZSNzYXZlU3RhdGUob3JnLmVjbGlwc2UudWkuSU1lbWVudG8pCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCXB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbil7Ci0JCXRoaXMuZG9tYWluID0gZG9tYWluOwotCX0KLQotCSAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVBhdGhFZGl0b3JJbnB1dAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKiBAaXNzdWUgY29uc2lkZXIgdXNpbmcgYW4gaW50ZXJuYWwgYWRhcHRlciBmb3IgSVBhdGhFZGl0b3JJbnB1dCByYXRoZXIgdGhhbiBhZGRpbmcgdGhpcyBhcyBBUEkKLSAgICAgKi8KLSAgICBwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGUuZ2V0TG9jYXRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIigiICsgZ2V0RmlsZSgpLmdldEZ1bGxQYXRoKCkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC9JRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC9JRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE1N2U5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIgewotCURpYWdyYW1FZGl0b3JJbnB1dCBnZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQlJRWRpdG9yUGFydCBnZXRFZGl0b3IoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC9JRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmI1NTdhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC9JRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50Lk1FZGl0aW5nRG9tYWluRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXRoRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSBleHRlbmRzIE1FZGl0aW5nRG9tYWluRWxlbWVudCwKLQkJSUZpbGVFZGl0b3JJbnB1dCwgSVBhdGhFZGl0b3JJbnB1dCwgSVBlcnNpc3RhYmxlRWxlbWVudCB7Ci0JCi0JcHVibGljIERpYWdyYW1FZGl0b3JJbnB1dCBnZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkKLQlwdWJsaWMgdm9pZCBzZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbihUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4pOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L3V0aWwvRGlhZ3JhbUVkaXRvclV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC91dGlsL0RpYWdyYW1FZGl0b3JVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MmY2NDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L3V0aWwvRGlhZ3JhbUVkaXRvclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5pbXBsLkludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UuQWJzdHJhY3RFTUZPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5BY3Rpdml0eURpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5EaWFncmFtQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5Ob2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LklEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVycy5TaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucmVzb3VyY2VzLklEaWFncmFtU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLlR4VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQ29ubmVjdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS51dGlsLlN0cmluZ1N0YXRpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db25uZWN0aW9uTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5JRGlhZ3JhbVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5wYXJ0cy5EaWFncmFtRG9jdW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIHNrYW5ub29yCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRWRpdG9yVXRpbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEX0VESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvcklEIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcklEIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXUEREX0VESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvcklEIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWRpdG9ySWQoaW50IGRpYWdyYW1UeXBlKSB7Ci0JCXN3aXRjaChkaWFncmFtVHlwZSkgewotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJcmV0dXJuIEFEX0VESVRPUl9JRDsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQlyZXR1cm4gQUREX0VESVRPUl9JRDsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCXJldHVybiBXUEREX0VESVRPUl9JRDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElFZGl0b3JQYXJ0IG9wZW5EaWFncmFtRWRpdG9yKElXb3JrYmVuY2hQYWdlIHBhZ2UsIERpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCwgUHJlZmVyZW5jZXNIaW50IGhpbnQsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCURpYWdyYW1FZGl0b3JJbnB1dFByb3h5IGlucHV0UHJveHkgPSBuZXcgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkoaW5wdXQsIGhpbnQpOwotCi0JCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdG9yUGFydCA9IHBhZ2Uub3BlbkVkaXRvcihpbnB1dFByb3h5LCBnZXRFZGl0b3JJZChpbnB1dC5nZXREaWFncmFtVHlwZSgpKSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0KLQkJaWYoZWRpdG9yUGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcil7Ci0JCQlpZihpbnB1dC5nZXREaWFncmFtVHlwZSgpID09IElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSkgewotCQkJCUFic3RyYWN0RGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcillZGl0b3JQYXJ0KTsKLQkJCQllZGl0b3IucmVzZXRMYXlvdXQoKTsKLQkJCQkvLyBUT0RPOiBoYXMgdG8gY2FsbCByZXNldExheW91dCB0d2ljZSBoZXJlIHNvIGl0IGNhbiBsYXlvdXQgcHJvcGVybHkKLQkJCQkvLyBuZWVkIHRvIGltcHJvdmUgdGhpcyBtZXRob2QKLQkJCQkvLwotCQkJCWVkaXRvci5yZXNldExheW91dCgpOwotCQkJfQotCQkJCi0JCQlJRG9jdW1lbnRQcm92aWRlciBkb2NQcm92aWRlciA9ICgoRGlhZ3JhbURvY3VtZW50RWRpdG9yKWVkaXRvclBhcnQpLmdldERvY3VtZW50UHJvdmlkZXIoKTsKLQotCQkJLy8gc2V0IHRoZSBkb2N1bWVudCBhcyBzYXZhYmxlIGlmIHRoZSBkaWFncmFtIGlzIG5ldwotCQkJLy8KLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGlucHV0LmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCQlpZihwcm9jICE9IG51bGwpIHsKLQkJCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBudWxsOwotCQkJCU9iamVjdCBjb25zdW1lciA9IG5ldyBPYmplY3QoKTsKLQkJCQl0cnkgewotCQkJCQltZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShwcm9jLCBjb25zdW1lcik7Ci0JCQkJCWlmKG1nciAhPSBudWxsICYmIGlucHV0UHJveHkuaXNOZXdEaWFncmFtKCkpIHsKLQkJCQkJCWRvY1Byb3ZpZGVyLnNldENhblNhdmVEb2N1bWVudChpbnB1dFByb3h5KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYobWdyICE9IG51bGwpIHsKLQkJCQkJCW1nci5yZW1vdmVDb25zdW1lcihjb25zdW1lcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGluaXRpYWxpemF0aW9uIG1pZ2h0IGhhdmUgbWFkZSB0aGUgZG9jdW1lbnQgZGlydHkKLQkJCS8vIHRoaXMgd2lsbCBjbGVhciBkaXJ0eSBmbGFnIG9mIHRoZSBlZGl0b3IKLQkJCS8vCi0JCQlpZiAoZG9jUHJvdmlkZXIgaW5zdGFuY2VvZiBTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyCi0JCQkJCSYmIGVkaXRvclBhcnQuaXNEaXJ0eSgpCi0JCQkJCSYmICFpbnB1dFByb3h5LmlzTmV3RGlhZ3JhbSgpKSB7Ci0JCQkJKChTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKSBkb2NQcm92aWRlcikKLQkJCQkubWFya0RvY3VtZW50QXNTYXZlZChpbnB1dFByb3h5KTsKLQkJCX0JCQkKLQotCQkJLy8gQ2hlY2sgd2hldGhlciBkaWFncmFtIGlzIHJlYWQtb25seSBhbmQgcGx1Zy1pbiBpcyBsb2NrZWQuIAotCQkJLy8KLQkJCWlmKCFpc01vZGlmaWFibGUoaW5wdXRQcm94eSkpewotCQkJCSgoU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcikoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcillZGl0b3JQYXJ0KS5nZXREb2N1bWVudFByb3ZpZGVyKCkpLmxvY2sodHJ1ZSk7Ci0JCQkJRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKChJRGlhZ3JhbVdvcmtiZW5jaFBhcnQpZWRpdG9yUGFydCkuZ2V0RGlhZ3JhbUVkaXRQYXJ0KCk7Ci0JCQkJZWRpdFBhcnQuZGlzYWJsZUVkaXRNb2RlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVkaXRvclBhcnQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoVmlzdWFsKERpYWdyYW1FZGl0UGFydCBlZGl0UGFydCkgewotCQkvLyByZWZyZXNoIGxhYmVscwotCQkvLwotCQlJdGVyYXRvcjxPYmplY3Q+IGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3I8T2JqZWN0PihlZGl0UGFydCwgZmFsc2UpIHsKLQotCQkJLyoqCi0JCQkgKiAKLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPD8+IGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBFZGl0UGFydCkgewotCQkJCQlyZXR1cm4gKChFZGl0UGFydClvYmplY3QpLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCX0KLQkJCQotCQl9OwotCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZihjaGlsZCBpbnN0YW5jZW9mIElUZXh0QXdhcmVFZGl0UGFydCB8fCBjaGlsZCBpbnN0YW5jZW9mIENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQpIHsKLQkJCQkoKEVkaXRQYXJ0KWNoaWxkKS5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyByZWZyZXNoIGNvbm5lY3Rpb25zCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlZGl0UGFydC5nZXRDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUNvbm5lY3Rpb25FZGl0UGFydCBjb25uID0gKENvbm5lY3Rpb25FZGl0UGFydCkgaXRlcmF0b3IubmV4dCgpOwotCQkJY29ubi5yZWZyZXNoKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hMYWJlbHMoRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0vLwkJLy8gbWFrZSBzdXJlIHRoYXQgdGhlIGVkaXQgcGFydCBmaWd1cmUgaXMgbGFyZ2UgZW5vdWdoIHRvIHNob3cgdGhlIGljb24gYW5kIGFsbCB0aGUgdGV4dAotLy8JCS8vCi0vLwkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVkaXRQYXJ0LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotLy8JCQlPYmplY3QgY2hpbGQgPSAoT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0vLwkJCWlmKGNoaWxkIGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpIHsKLS8vCQkJCUlGaWd1cmUgZiA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpY2hpbGQpLmdldEZpZ3VyZSgpOwotLy8JCQkJaWYoZiBpbnN0YW5jZW9mIERlZmF1bHRTaXplTm9kZUZpZ3VyZSkgewotLy8JCQkJCU9iamVjdCBmMiA9ICgoRGVmYXVsdFNpemVOb2RlRmlndXJlKWYpLmdldENoaWxkcmVuKCkuZ2V0KDApOwotLy8JCQkJaWYoZjIgaW5zdGFuY2VvZiBSZWN0YW5nbGVGaWd1cmUpIHsKLS8vCQkJCQlSZWN0YW5nbGVGaWd1cmUgZmlndXJlID0gKFJlY3RhbmdsZUZpZ3VyZSkgZjI7Ci0vLwkJCQkJTGlzdCBjaGlsZHJlbiA9ICgoUmVjdGFuZ2xlRmlndXJlKWZpZ3VyZSkuZ2V0Q2hpbGRyZW4oKTsKLS8vCQkJCQlpZighY2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0vLwkJCQkJCU9iamVjdCBsID0gY2hpbGRyZW4uZ2V0KDApOwotLy8JCQkJCQlpZihsIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0vLwkJCQkJCQlXcmFwTGFiZWwgbGFiZWwgPSAoKFdyYXBMYWJlbClsKTsKLS8vCQkJCQkJCVJlY3RhbmdsZSByID0gZmlndXJlLmdldEJvdW5kcygpOwotLy8JCQkJCQkJRGltZW5zaW9uIGQgPSBmaWd1cmUuZ2V0UHJlZmVycmVkU2l6ZSgpOwotLy8JCQkJCQkJUmVjdGFuZ2xlIHRleHRSID0gbGFiZWwuZ2V0VGV4dEJvdW5kcygpOwkJCQkJCQkKLS8vLy8vLwkJCQkJCQl0ZXh0Ui53aWR0aCArPSAodGV4dFIud2lkdGggKiBXaWRlbmVkV3JhcExhYmVsLkRFTFRBX0ZBQ1RPUik7Ci0vLy8vCQkJCQkJCXRleHRSLndpZHRoICs9IDIwOwotLy8vLwkJCQkJCQlpZihyLndpZHRoIDwgZC53aWR0aCB8fCByLmhlaWdodCA8IGQuaGVpZ2h0KSB7Ci0vLy8vCQkJCQkJCQlXcmFwTGFiZWwgbGFiZWwgPSAoKFdyYXBMYWJlbClsKTsKLS8vLy8JCQkJCQkJCWxhYmVsLmludmFsaWRhdGUoKTsKLS8vLy8JCQkJCQkJCWZpZ3VyZS5zZXRCb3VuZHMoci51bmlvbih0ZXh0UikpOwkKLS8vLy8vLwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGxhYmVsLmdldFN1YlN0cmluZ1RleHQoKSk7Ci0vLy8vCQkJCQkJCX0KLS8vLy8JCQkJCQkJaWYoIkRlc2lnbiB0aGUgU29sdXRpb24iLmVxdWFscyhsYWJlbC5nZXRUZXh0KCkpKSB7CQkKLS8vCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRleHQ6ICciICsgbGFiZWwuZ2V0VGV4dCgpICsgIiciKTsKLS8vCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxhYmVsIGZvbnQ6ICIgKyBsYWJlbC5nZXRGb250KCkpOwotLy8JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRGVmYXVsdCBmb250OiAiICsgRGlhZ3JhbUNvbnN0YW50cy5ERUZBVUxUX0ZPTlQpOwotLy8JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2FsY3VsYXRlZCB0ZXh0IHNpemU6ICIgKyBEaWFncmFtQ29yZVV0aWwuZ2V0VGV4dFNpemVJbldyYXBMYWJlbChsYWJlbC5nZXRUZXh0KCksIG51bGwsIHIud2lkdGgsIHIuaGVpZ2h0LCBudWxsKSk7Ci0vLwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDdXJyZW50IHRleHQgd2lkdGg6ICIgKyB0ZXh0Ui53aWR0aCk7Ci0vLwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb2RlIHdpZHRoOiAiICsgci53aWR0aCk7Ci0vLy8vCQkJCQkJCX0KLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQkJCQotLy8JCX0KLQkJCi0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZWRpdFBhcnQsIGZhbHNlKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBFZGl0UGFydCkgewotCQkJCQlyZXR1cm4gKChFZGl0UGFydClvYmplY3QpLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCX0KLQkJCQotCQl9OwotCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZihjaGlsZCBpbnN0YW5jZW9mIElUZXh0QXdhcmVFZGl0UGFydCkgewotCQkJCSgoSVRleHRBd2FyZUVkaXRQYXJ0KWNoaWxkKS5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRGlhZ3JhbSBnZXREaWFncmFtKERpYWdyYW1FZGl0b3JJbnB1dFByb3h5IGlucHV0UHJveHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0b3JhZ2Ugc3RvcmFnZSA9IGlucHV0UHJveHkuZ2V0U3RvcmFnZSgpOwotCQlyZXR1cm4gc3RvcmFnZSBpbnN0YW5jZW9mIElEaWFncmFtU3RvcmFnZSA/ICgoSURpYWdyYW1TdG9yYWdlKXN0b3JhZ2UpLmdldERpYWdyYW0oKSA6IG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZG9Jbml0aWFsaXplKAotCQkJZmluYWwgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkgaW5wdXRQcm94eSwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmaW5hbCBEaWFncmFtIG1vZGVsID0gZ2V0RGlhZ3JhbShpbnB1dFByb3h5KTsKLQkJaWYobW9kZWwgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmKERpYWdyYW1NYW5hZ2VyLkFEX2tpbmQuZXF1YWxzKG1vZGVsLmdldFR5cGUoKSkpIHsKLQkJCUFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIgYWRhcHRlciA9IChBY3Rpdml0eURpYWdyYW1BZGFwdGVyKSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobW9kZWwuZ2V0RWxlbWVudCgpKTsKLQkJCWlmKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJCWFkYXB0ZXIgPSBuZXcgQWN0aXZpdHlEaWFncmFtQWRhcHRlcigKLQkJCQkJCQkJKEFjdGl2aXR5KSBpbnB1dFByb3h5Ci0JCQkJCQkJCQkJLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCQkJYWRhcHRlcgotCQkJCQkJLnNldEVkaXRpbmdEb21haW4oKEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4pIFRyYW5zYWN0aW9uVXRpbAotCQkJCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbihtb2RlbCkpOwotCQkJCWFkYXB0ZXIuc2V0U3VwcHJlc3Npb24oaW5wdXRQcm94eQotCQkJCQkJLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpLmdldFN1cHByZXNzaW9uKCkpOwotCQkJCWFkYXB0ZXIuc2V0Vmlldyhtb2RlbCk7Ci0JCQkJbW9kZWwuZ2V0RWxlbWVudCgpLmVBZGFwdGVycygpLmFkZChhZGFwdGVyKTsKLQkJCX0KLQkJCWFkYXB0ZXIucG9wdWxhdGVEaWFncmFtKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmKERpYWdyYW1NYW5hZ2VyLkFERF9raW5kLmVxdWFscyhtb2RlbC5nZXRUeXBlKCkpCi0JCQkJfHwgRGlhZ3JhbU1hbmFnZXIuV1BEX2tpbmQuZXF1YWxzKG1vZGVsLmdldFR5cGUoKSkpIHsKLQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKG1vZGVsKTsKLQkJCUFic3RyYWN0RU1GT3BlcmF0aW9uIG9wID0gbmV3IEFic3RyYWN0RU1GT3BlcmF0aW9uKGRvbWFpbiwgU3RyaW5nU3RhdGljcy5CTEFOSykgewotCQkJCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0gZCA9IAotCQkJCQkJKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIG1vZGVsLmdldEVsZW1lbnQoKTsKLQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0ID0gaW5wdXRQcm94eS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCQkJZC5zZXRTdXBwcmVzc2lvbihpbnB1dC5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQkJZC5zZXRMaW5rZWRFbGVtZW50KGlucHV0LmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCQkJCWQuc2V0T2JqZWN0KGQuZ2V0TGlua2VkRWxlbWVudCgpKTsKLQotCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQl9Ci0JCQkKLQkJCX07Ci0JCQl0cnkgewotCQkJCW9wLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0gCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVPbkFjdGl2YXRlKERpYWdyYW1FZGl0UGFydCBlZGl0UGFydCkgewotCQlpZihlZGl0UGFydC5nZXRWaWV3ZXIoKSBpbnN0YW5jZW9mIElEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlcikgewotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gKChJRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIpZWRpdFBhcnQuZ2V0Vmlld2VyKCkpLmdldEVkaXRvcigpOwotCQkJaWYoZWRpdG9yICE9IG51bGwgJiYgZWRpdG9yLmdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgewotCQkJCURpYWdyYW1FZGl0b3JJbnB1dFByb3h5IGlucHV0UHJveHkgPSAoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYoZG9Jbml0aWFsaXplKGlucHV0UHJveHksIG1vbml0b3IpKSB7Ci0JCQkJCQlkb1JlZnJlc2goZWRpdFBhcnQsIG1vbml0b3IsIGZhbHNlKTsKLQkJCQkJCXJlZnJlc2hWaXN1YWwoZWRpdFBhcnQpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZShmaW5hbCBEaWFncmFtRWRpdFBhcnQgZWRpdFBhcnQsIGZpbmFsIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5IGlucHV0UHJveHksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewkJCi0JCXRyeSB7Ci0JCQlpZihkb0luaXRpYWxpemUoaW5wdXRQcm94eSwgbW9uaXRvcikpIHsKLQkJCQlyZWZyZXNoKGVkaXRQYXJ0LCBtb25pdG9yKTsKLQkJCQlyZWZyZXNoTGFiZWxzKGVkaXRQYXJ0KTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVFZGdlcyhWaWV3IHZpZXcpewotCQlib29sZWFuIGFsbFZpc2libGUgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVmlldyBjaGlsZCA9IChWaWV3KSBpdGVyLm5leHQoKTsKLQkJCWlmKGNoaWxkLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5vZGVJbXBsKSB7Ci0JCQkJTm9kZUltcGwgbm9kZSA9IChOb2RlSW1wbCljaGlsZC5nZXRFbGVtZW50KCk7Ci0JCQkJaWYoIW5vZGUuaXNWaXNpYmxlKCkpewotCQkJCQlzZXRFZGdlVmlzaWJpbGl0eSh2aWV3LCBub2RlLmlzVmlzaWJsZSgpKTsKLQkJCQl9ZWxzZXsKLQkJCQkJY2hpbGQuc2V0VmlzaWJsZShub2RlLmlzVmlzaWJsZSgpKTsKLQkJCQkJc2V0RWRnZVZpc2liaWxpdHkoY2hpbGQsIHRydWUpOwotCQkJCX0KLQkJCQlpZihub2RlIGluc3RhbmNlb2YgTmFtZWROb2RlKSB7Ci0JCQkJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGNoaWxkLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsKLQkJCQkJaWYoc3R5bGUgPT0gbnVsbCkgewotCQkJCQkJc3R5bGUgPSAoRm9udFN0eWxlKSBjaGlsZC5jcmVhdGVTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYoY2hpbGQuaXNWaXNpYmxlKCkgJiYgY2hpbGQuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lcikgewotCQkJCQl1cGRhdGVFZGdlcyhjaGlsZCk7Ci0JCQkJfQotCQkJCWlmKG5vZGUuaXNWaXNpYmxlKCkpewotCQkJCQlhbGxWaXNpYmxlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYodmlldy5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyIAotCQkJCSYmICEodmlldy5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pCi0JCQkJJiYgISh2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pKXsKLQkJCXNldEVkZ2VWaXNpYmlsaXR5KHZpZXcsIGFsbFZpc2libGUpOwotCQl9Ci0JCQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNldEVkZ2VWaXNpYmlsaXR5KFZpZXcgdmlldywgYm9vbGVhbiB2aXNpYmlsaXR5KXsKLQkJRGlhZ3JhbSBkaWFncmFtID0gdmlldy5nZXREaWFncmFtKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBkaWFncmFtLmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRWRnZSBlZGdlID0gKEVkZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGVkZ2UuZ2V0U291cmNlKCkgPT0gdmlldyB8fCBlZGdlLmdldFRhcmdldCgpID09IHZpZXcpewotCQkJCWlmKHZpc2liaWxpdHkpewotCQkJCQl2aWV3LnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJfQotCQkJCWVkZ2Uuc2V0VmlzaWJsZSh2aXNpYmlsaXR5KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCWJvb2xlYW4gYWxsVmlzaWJsZSA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlWaWV3IGNoaWxkID0gKFZpZXcpIGl0ZXIubmV4dCgpOwotCQkJaWYoY2hpbGQuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgTm9kZUltcGwpIHsKLQkJCQlOb2RlSW1wbCBub2RlID0gKE5vZGVJbXBsKWNoaWxkLmdldEVsZW1lbnQoKTsKLQkJCQljaGlsZC5zZXRWaXNpYmxlKG5vZGUuaXNWaXNpYmxlKCkpOwotCQkJCWlmKG5vZGUgaW5zdGFuY2VvZiBOYW1lZE5vZGUpIHsKLQkJCQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgY2hpbGQuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOwotCQkJCQlpZihzdHlsZSA9PSBudWxsKSB7Ci0JCQkJCQlzdHlsZSA9IChGb250U3R5bGUpIGNoaWxkLmNyZWF0ZVN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihjaGlsZC5pc1Zpc2libGUoKSAmJiBjaGlsZC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyKSB7Ci0JCQkJCXVwZGF0ZVZpZXcoY2hpbGQpOwotCQkJCX0KLQkJCQlpZihub2RlLmlzVmlzaWJsZSgpKXsKLQkJCQkJYWxsVmlzaWJsZSA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZih2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIgCi0JCQkJJiYgISh2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkKLQkJCQkmJiAhKHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSkpIHsKLS8vCQkJaWYoIWFsbFZpc2libGUpIHsKLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotLy8JCQl9Ci0JCQl2aWV3LnNldFZpc2libGUoYWxsVmlzaWJsZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5oZXJpdGVkKEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JCUVkaXRQYXJ0Vmlld2VyIHZpZXdlciA9IGVkaXRQYXJ0LmdldFZpZXdlcigpOwotCQlpZih2aWV3ZXIgaW5zdGFuY2VvZiBJRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIpIHsKLQkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9ICgoSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyKXZpZXdlcikuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCk7Ci0JCQlyZXR1cm4gaXNJbmhlcml0ZWQoaW5wdXQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaGVyaXRlZChEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJcmV0dXJuIGlucHV0ICE9IG51bGwgJiYgaW5wdXQuZ2V0V3JhcHBlcigpICE9IG51bGwKLQkJCQkmJiBpbnB1dC5nZXRXcmFwcGVyKCkuaXNJbmhlcml0ZWQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiBnZXRTZW1hbnRpY0NoaWxkcmVuKERpYWdyYW1FZGl0UGFydCBlZGl0UGFydCkgewotCQlFZGl0UGFydFZpZXdlciB2aWV3ZXIgPSBlZGl0UGFydC5nZXRWaWV3ZXIoKTsKLQkJaWYodmlld2VyIGluc3RhbmNlb2YgSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyKSB7Ci0JCQlEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQgPSAoKElEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlcil2aWV3ZXIpLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJaWYoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dC5nZXRXcmFwcGVyKCkgIT0gbnVsbCAmJgotCQkJCQlpbnB1dC5nZXRXcmFwcGVyKCkuaXNJbmhlcml0ZWQoKSkgewotCQkJCU9iamVjdCBtb2RlbCA9IGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJaWYobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBudWxsOwotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSBlZGl0UGFydC5nZXREaWFncmFtVmlldygpOwotCQkJCQlTdHJpbmcgdHlwZSA9IGRpYWdyYW0uZ2V0VHlwZSgpOwotCQkJCQlpZihEaWFncmFtTWFuYWdlci5BRF9raW5kLmVxdWFscyh0eXBlKSkgewotCQkJCQkJRGlhZ3JhbUFkYXB0ZXIgZGEgPSAoKERpYWdyYW1BZGFwdGVyKUJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihkaWFncmFtLmdldEVsZW1lbnQoKSkpOwotCQkJCQkJaWYoZGEgIT0gbnVsbCkgewotCQkJCQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSBpbnB1dC5nZXRXcmFwcGVyKCk7Ci0JCQkJCQkJaWYoVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3Rvcnkod3JhcHBlci5nZXRBZGFwdGVyRmFjdG9yeSgpKSAhPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJCQkJCUxpc3Qgd3JhcHBlcnMgPSBQcm9jZXNzVXRpbC5nZXRXcmFwcGVycyh3cmFwcGVyLCBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKX0pOwotCQkJCQkJCQl3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB3cmFwcGVycy5nZXQoMCk7Ci0JCQkJCQkJfQotCQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJYWRhcHRlciA9IG5ldyBBY3Rpdml0eURpYWdyYW1BZGFwdGVyKHdyYXBwZXIpOwotCQkJCQkJCQlhZGFwdGVyLnNldEZpbHRlcihkYS5nZXRGaWx0ZXIoKSk7Ci0JCQkJCQkJCWFkYXB0ZXIuc2V0U3VwcHJlc3Npb24oU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24oVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHdyYXBwZXIpKSk7Ci0JCQkJCQkJCWNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbigpOwotCQkJCQkJCX0KLQkJCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQkJaWYoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQkJCQlhZGFwdGVyLmRpc3Bvc2UoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmKERpYWdyYW1NYW5hZ2VyLkFERF9raW5kLmVxdWFscyh0eXBlKSB8fCBEaWFncmFtTWFuYWdlci5XUERfa2luZC5lcXVhbHModHlwZSkpIHsKLQkJCQkJCURpYWdyYW1JbXBsIGQ7Ci0JCQkJCQlpZihEaWFncmFtTWFuYWdlci5BRERfa2luZC5lcXVhbHModHlwZSkpIHsKLQkJCQkJCQlkID0gKERpYWdyYW1JbXBsKSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJZCA9IChEaWFncmFtSW1wbCkgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCk7Ci0JCQkJCQl9CQkJCQkJCi0JCQkJCQlEaWFncmFtSW1wbCBkaWFncmFtSW5Vc2UgPSAoKERpYWdyYW1JbXBsKWRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gZGlhZ3JhbUluVXNlLmdldFN1cHByZXNzaW9uKCk7Ci0JCQkJCQlpZihzdXBwcmVzc2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkJZC5zZXRXcmFwcGVyKGlucHV0LmdldFdyYXBwZXIoKSk7Ci0JCQkJCQkJZC5zZXRGaWx0ZXIoZGlhZ3JhbUluVXNlLmdldEZpbHRlcigpKTsKLQkJCQkJCQlkLnNldFN1cHByZXNzaW9uKGRpYWdyYW1JblVzZS5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQkJCQljaGlsZHJlbiA9IGQuZ2V0Q2hpbGRyZW4oKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gY2hpbGRyZW47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaENvbm5lY3Rpb25zKERpYWdyYW1FZGl0UGFydCBlZGl0UGFydCkgewotCQlEaWFncmFtIGRpYWdyYW0gPSBlZGl0UGFydC5nZXREaWFncmFtVmlldygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFZGdlIGVkZ2UgPSAoRWRnZSkgaXRlci5uZXh0KCk7Ci0JCQlib29sZWFuIHZpc2libGUgPSBlZGdlLmdldFNvdXJjZSgpICE9IG51bGwgJiYgZWRnZS5nZXRTb3VyY2UoKS5pc1Zpc2libGUoKQotCQkJCSYmIGVkZ2UuZ2V0VGFyZ2V0KCkgIT0gbnVsbCAmJiBlZGdlLmdldFRhcmdldCgpLmlzVmlzaWJsZSgpOwotCQkJaWYoZWRnZS5pc1Zpc2libGUoKSAhPSB2aXNpYmxlKSB7Ci0JCQkJZWRnZS5zZXRWaXNpYmxlKHZpc2libGUpOwotCQkJfQotCQl9OwotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWZyZXNoQ2hpbGRyZW4oRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JCUNvbGxlY3Rpb24gc2VtYW50aWNDaGlsZHJlbiA9IGdldFNlbWFudGljQ2hpbGRyZW4oZWRpdFBhcnQpOwotCQlpZihzZW1hbnRpY0NoaWxkcmVuICE9IG51bGwpIHsKLQkJCXJlZnJlc2hDaGlsZHJlbihlZGl0UGFydCwgc2VtYW50aWNDaGlsZHJlbik7Ci0JCQlyZWZyZXNoQ29ubmVjdGlvbnMoZWRpdFBhcnQpOwotCQl9Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBmaWx0ZXJDaGlsZHJlbihFZGl0UGFydCBlZGl0UGFydCwgQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0ID0gRGlhZ3JhbUNvcmVVdGlsLmdldERpYWdyYW1FZGl0UGFydChlZGl0UGFydCk7Ci0JCUNvbGxlY3Rpb24gc2VtYW50aWNDaGlsZHJlbiA9IGdldFNlbWFudGljQ2hpbGRyZW4oZGlhZ3JhbUVkaXRQYXJ0KTsKLQkJaWYoc2VtYW50aWNDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbi5jbGVhcigpOwotCQl9Ci0JCWVsc2UgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJIEVPYmplY3QgY2hpbGQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJIE1ldGhvZEVsZW1lbnQgZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KGNoaWxkKTsKLQkJCQkgaWYoZ2V0V3JhcHBlcihlLCBzZW1hbnRpY0NoaWxkcmVuKSA9PSBudWxsKSB7Ci0JCQkJCSBpdGVyLnJlbW92ZSgpOwotCQkJCSB9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldFdyYXBwZXIoTWV0aG9kRWxlbWVudCBlLCBDb2xsZWN0aW9uIHNlbWFudGljQ2hpbGRyZW4pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNlbWFudGljQ2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGMgPSAoT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihUbmdVdGlsLnVud3JhcChjKSA9PSBlKSB7Ci0JCQkJcmV0dXJuIGM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJlZnJlc2hlcyBlZGl0IHBhcnQgb2YgYW4gaW5oZXJpdGVkIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVkaXRQYXJ0Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWZyZXNoQ2hpbGRyZW4oRWRpdFBhcnQgZWRpdFBhcnQsIENvbGxlY3Rpb24gc2VtYW50aWNDaGlsZHJlbikgewkJCi0JCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGVkaXQgcGFydCBvZiBSb2xlVGFza0NvbXBvc2l0ZSB0aGF0IHNob3VsZCBub3QgYmUgc2hvd24gaWYKLQkJLy8gbm9uZSBvZiBpdHMgdGFza3MgYXJlIHZpc2libGUKLQkJLy8KLQkJYm9vbGVhbiBpc1JvbGVUYXNrQ29tcG9zaXRlID0gZmFsc2U7Ci0JCWJvb2xlYW4gaGFzVGFzayA9IGZhbHNlOwotCQlPYmplY3QgbW9kZWwgPSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQlpZihtb2RlbCBpbnN0YW5jZW9mIFZpZXcgJiYgKChWaWV3KW1vZGVsKS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZSkgewotCQkJaXNSb2xlVGFza0NvbXBvc2l0ZSA9IHRydWU7Ci0JCX0KLQkJCi0JCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IGVkaXRQYXJ0LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZihjaGlsZCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkJYm9vbGVhbiByZWZyZXNoQ2hpbGRyZW4gPSB0cnVlOwotCQkJCUVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQgPSAoKEVkaXRQYXJ0KWNoaWxkKTsKLQkJCQlPYmplY3QgbSA9IGNoaWxkRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQlpZihtIGluc3RhbmNlb2YgVmlldykgewotCQkJCQlWaWV3IHYgPSAoVmlldykgbTsKLQkJCQkJTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQodik7Ci0JCQkJCWlmKGUgIT0gbnVsbCkgewotCQkJCQkJT2JqZWN0IG9iamVjdCA9IGdldFdyYXBwZXIoZSwgc2VtYW50aWNDaGlsZHJlbik7Ci0JCQkJCQlib29sZWFuIHZpc2libGUgPSBvYmplY3QgIT0gbnVsbDsKLQkJCQkJCWlmKHYuaXNWaXNpYmxlKCkgIT0gdmlzaWJsZSkgewotCQkJCQkJCXYuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJCQkJCX0KLQkJCQkJCWlmKCF2aXNpYmxlKSB7Ci0JCQkJCQkJcmVmcmVzaENoaWxkcmVuID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmKGlzUm9sZVRhc2tDb21wb3NpdGUgJiYgIWhhc1Rhc2sgJiYgZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJaGFzVGFzayA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyB0aGlzIGlzIGEgbm9uLVVNQSBub2RlIGxpa2UgY29udHJvbCBub2RlLCB0ZXh0IG5vZGUsIGZpZ3VyZS4uLgotCQkJCQkJLy8gCi0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYocmVmcmVzaENoaWxkcmVuKSB7Ci0JCQkJCXJlZnJlc2hDaGlsZHJlbihjaGlsZEVkaXRQYXJ0LCBzZW1hbnRpY0NoaWxkcmVuKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmKGlzUm9sZVRhc2tDb21wb3NpdGUgJiYgIWhhc1Rhc2spIHsKLQkJCSgoVmlldyllZGl0UGFydC5nZXRNb2RlbCgpKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZG9SZWZyZXNoKGZpbmFsIERpYWdyYW1FZGl0UGFydCBlZGl0UGFydCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBmaW5hbCBib29sZWFuIHJlZnJlc2hEYXRhKSB7Ci0JCWZpbmFsIGJvb2xlYW4gaXNJbmhlcml0ZWQgPSBpc0luaGVyaXRlZChlZGl0UGFydCk7Ci0JCWZpbmFsIERpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQlpZihkaWFncmFtLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIHsKLQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKGRpYWdyYW0pOwotCQkJQWJzdHJhY3RFTUZPcGVyYXRpb24gb3AgPSBuZXcgQWJzdHJhY3RFTUZPcGVyYXRpb24oZG9tYWluLCBTdHJpbmdTdGF0aWNzLkJMQU5LKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCQlpZihyZWZyZXNoRGF0YSkgewotCQkJCQkJLy8gcmVmcmVzaCB0aGUgZGF0YQotCQkJCQkJLy8KLQkJCQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0gZCA9IChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJCQkJCWQuc2V0T2JqZWN0KGQuZ2V0TGlua2VkRWxlbWVudCgpKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gc2hvdy9oaWRlIG5vZGVzIGFjY29yZGluZyB1cGRhdGVkIGRhdGEKLQkJCQkJLy8KLQkJCQkJaWYoaXNJbmhlcml0ZWQpIHsKLQkJCQkJCXJlZnJlc2hDaGlsZHJlbihlZGl0UGFydCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl1cGRhdGVFZGdlcyhkaWFncmFtKTsKLQkJCQkJCXVwZGF0ZVZpZXcoZGlhZ3JhbSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0JCi0KLQkJCX07Ci0JCQl0cnkgewotCQkJCW9wLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7CQkJCQotCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQkJCi0JCX0KLQkJZWxzZSB7Ci0JCQlOb2RlQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBEaWFncmFtQWRhcHRlcikgewotCQkJCWlmKHJlZnJlc2hEYXRhKSB7Ci0JCQkJCSgoRGlhZ3JhbUFkYXB0ZXIpYWRhcHRlcikucG9wdWxhdGVEaWFncmFtKCk7Ci0JCQkJfQotCQkJCWlmKGlzSW5oZXJpdGVkKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQluZXcgQWJzdHJhY3RFTUZPcGVyYXRpb24oVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oZGlhZ3JhbSksIFN0cmluZ1N0YXRpY3MuQkxBTkspIHsKLQotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBJU3RhdHVzIGRvRXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJCQkJCXJlZnJlc2hDaGlsZHJlbihlZGl0UGFydCk7Ci0JCQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCX0uZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaChmaW5hbCBEaWFncmFtRWRpdFBhcnQgZWRpdFBhcnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIgcCA9ICgoSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyKWVkaXRQYXJ0LmdldFZpZXdlcigpKTsgCi0JCWJvb2xlYW4gd2FzRGlydHkgPSBwLmdldEVkaXRvcigpICE9IG51bGwgPyBwLmdldEVkaXRvcigpLmlzRGlydHkoKSA6IGZhbHNlOwotCQlib29sZWFuIHdhc0Jhc2VEaXJ0eSA9IGZhbHNlOwotCQlJRWRpdG9yUGFydCBiYXNlRWRpdG9yID0gbnVsbDsKLQkJZmluYWwgYm9vbGVhbiBpc0luaGVyaXRlZCA9IGlzSW5oZXJpdGVkKGVkaXRQYXJ0KTsKLQkJaWYoaXNJbmhlcml0ZWQpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KGVkaXRQYXJ0LmdldERpYWdyYW1WaWV3KCkpOwotCQkJU3RyaW5nIHR5cGUgPSBlZGl0UGFydC5nZXREaWFncmFtVmlldygpLmdldFR5cGUoKTsKLQkJCQotCQkJaWYocC5nZXRFZGl0b3IoKSAhPSBudWxsKSB7Ci0JCQkJLy8gdHJ5IHRvIGZpbmQgdGhlIGRpcnR5IGZsYWcgb2YgYmFzZSBkaWFncmFtIGVkaXRvcgotCQkJCS8vCi0JCQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZnMgPSBwLmdldEVkaXRvcigpLmdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmcy5sZW5ndGg7IGkrKykgewotCQkJCQlJRWRpdG9yUmVmZXJlbmNlIHJlZiA9IGVkaXRvclJlZnNbaV07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZihyZWYuZ2V0RWRpdG9ySW5wdXQoKSBpbnN0YW5jZW9mIElEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpIHsKLQkJCQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQgPSAoKElEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpcmVmLmdldEVkaXRvcklucHV0KCkpLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJCQkJCWlmKGlucHV0LmdldFdyYXBwZXIoKSA9PSBudWxsICYmIGlucHV0LmdldE1ldGhvZEVsZW1lbnQoKSA9PSBlbGVtZW50ICYmCi0JCQkJCQkJCQlEaWFncmFtTWFuYWdlci5nZXREaWFncmFtVHlwZSh0eXBlKSA9PSBpbnB1dC5nZXREaWFncmFtVHlwZSgpKSB7Ci0JCQkJCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZi5nZXRFZGl0b3IoZmFsc2UpOwotCQkJCQkJCQlpZihlZGl0b3IgIT0gbnVsbCkgewotCQkJCQkJCQkJd2FzQmFzZURpcnR5ID0gZWRpdG9yLmlzRGlydHkoKTsKLQkJCQkJCQkJCWJhc2VFZGl0b3IgPSBlZGl0b3I7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlkb1JlZnJlc2goZWRpdFBhcnQsIG1vbml0b3IsIHRydWUpOwotCQkKLQkJLy8gZWRpdG9ycyBjYW4gYmVjb21lIGRpcnR5IGFmdGVyIHJlZnJlc2gKLQkJLy8gY2xlYXIgZGlydHkgZmxhZwotCQkvLwotCQlpZighd2FzRGlydHkgJiYgcC5nZXRFZGl0b3IoKSAhPSBudWxsICYmIHAuZ2V0RWRpdG9yKCkuaXNEaXJ0eSgpKSB7Ci0JCQkoKFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpKChEaWFncmFtRG9jdW1lbnRFZGl0b3IpcC5nZXRFZGl0b3IoKSkuZ2V0RG9jdW1lbnRQcm92aWRlcigpKQotCQkJCS5tYXJrRG9jdW1lbnRBc1NhdmVkKChJRmlsZUVkaXRvcklucHV0KSBwLmdldEVkaXRvcigpLmdldEVkaXRvcklucHV0KCkpOwotCQl9Ci0JCWlmKGJhc2VFZGl0b3IgIT0gbnVsbCAmJiAhd2FzQmFzZURpcnR5KSB7Ci0JCQkoKFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpKChEaWFncmFtRG9jdW1lbnRFZGl0b3IpYmFzZUVkaXRvcikuZ2V0RG9jdW1lbnRQcm92aWRlcigpKQotCQkJCS5tYXJrRG9jdW1lbnRBc1NhdmVkKChJRmlsZUVkaXRvcklucHV0KSBiYXNlRWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoKGZpbmFsIERpYWdyYW1FZGl0UGFydCBlZGl0UGFydCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBib29sZWFuIGlzaW5oZXJpdGVkKXsKLQkJCi0JCWZpbmFsIGJvb2xlYW4gaXNJbmhlcml0ZWQgPSBpc0luaGVyaXRlZChlZGl0UGFydCk7Ci0JCWZpbmFsIERpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQlpZihkaWFncmFtLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIHsKLQkJCXRyeSB7Ci0JCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oZGlhZ3JhbSk7Ci0JCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZGlhZ3JhbS5nZXRFbGVtZW50KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkvLyByZWZyZXNoIHRoZSBkYXRhCi0JCQkJCQkvLwotCQkJCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSBkID0gKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQkJCQkJZC5zZXRPYmplY3QoZC5nZXRMaW5rZWRFbGVtZW50KCkpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0pOwotCQkJCQotCQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGRvbWFpbiwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCS8vIHNob3cvaGlkZSBub2RlcyBhY2NvcmRpbmcgdXBkYXRlZCBkYXRhCi0JCQkJCQkvLwotCQkJCQkJaWYoaXNJbmhlcml0ZWQpIHsKLQkJCQkJCQlyZWZyZXNoQ2hpbGRyZW4oZWRpdFBhcnQpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJdXBkYXRlRWRnZXMoZGlhZ3JhbSk7Ci0JCQkJCQkJdXBkYXRlVmlldyhkaWFncmFtKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQl9KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgRGlhZ3JhbUFkYXB0ZXIpIHsKLQkJCQkoKERpYWdyYW1BZGFwdGVyKWFkYXB0ZXIpLnBvcHVsYXRlRGlhZ3JhbSgpOwotCQkJCWlmKGlzSW5oZXJpdGVkKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQluZXcgQWJzdHJhY3RFTUZPcGVyYXRpb24oVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oZGlhZ3JhbSksIFN0cmluZ1N0YXRpY3MuQkxBTkspIHsKLQotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBJU3RhdHVzIGRvRXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJCQkJCXJlZnJlc2hDaGlsZHJlbihlZGl0UGFydCk7Ci0JCQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCX0uZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRFZGl0b3IoQWJzdHJhY3REaWFncmFtRWRpdG9yIGVkaXRvcil7Ci0JCWlmKGVkaXRvci5pc0VkaXRhYmxlKCkpewotCQkJRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0ID1lZGl0b3IuZ2V0RGlhZ3JhbUVkaXRQYXJ0KCk7Ci0JCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmKGlucHV0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkgKXsKLQkJCQlpbml0aWFsaXplKGVkaXRQYXJ0LCAoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpaW5wdXQsIAotCQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTW9kaWZpYWJsZShPYmplY3QgZWxlbWVudCkgewotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5KXsKLQkJCQlEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkgaW5wdXQgPSAoRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5KWVsZW1lbnQ7Ci0JCQkJaWYoaW5wdXQgIT0gbnVsbCl7Ci0JCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBkSW5wdXQgPSBpbnB1dC5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCQkJaWYoZElucHV0ICE9IG51bGwpewotCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gZElucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJCS8vIENoZWNrIGZvciBwbHVnaW4gbG9jay4KLQkJCQkJCWlmKGUgIT0gbnVsbCl7Ci0JCQkJCQkJaWYoVG5nVXRpbC5pc0xvY2tlZChlKSkgCi0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCS8vIENoZWNrIHdyYXBwZXIgaXMgcmVhZG9ubHkuCi0JCQkJCQlPYmplY3Qgd3JhcHBlciA9IGRJbnB1dC5nZXRXcmFwcGVyKCk7Ci0JCQkJCQlpZih3cmFwcGVyICE9IG51bGwgJiYgKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil3cmFwcGVyKS5pc1JlYWRPbmx5KCkpewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEdNRiBhbmQgR0VGIGlzIG5vdCBoYW5kbGluZyBjb25uZWN0aW9ucyB2aXNpYmlsaXR5IHByb3Blcmx5LiAKLQkgKiBUaGlzIGlzIHdvcmstYXJvdW5kIHNvbHV0aW9uIHRvIGhhbmRsZSBjb25uZWN0aW9ucyB2aXNpYmlsaXR5LiAgCi0JICogVmlzaWJpbGl0eSBvZiBlZGdlcyBuZWVkIHRvIHNldCBmaXJzdCBhbmQgdGhlbiBub2Rlcy4gCi0JICogZGVmZWN0IG9wZW5lZCBmb3IgdGhpczogCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NDA4MQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoQ29ubmVjdGlvbkVkaXRQYXJ0cyhEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0KSB7Ci0KLQkJR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChHcmFwaGljYWxWaWV3ZXIpZGlhZ3JhbUVkaXRQYXJ0LmdldFZpZXdlcigpOwotCQlEaWFncmFtIGFjdCA9IChEaWFncmFtKWRpYWdyYW1FZGl0UGFydC5nZXRNb2RlbCgpOwotCQlMaXN0IGVkZ2VzID0gYWN0LmdldEVkZ2VzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVkZ2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRWRnZSBlZGdlID0gKEVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJaWYoZWRnZS5pc1Zpc2libGUoKSl7Ci0JCQkJQ29ubmVjdGlvbkVkaXRQYXJ0IHBhcnQgPSAoQ29ubmVjdGlvbkVkaXRQYXJ0KXZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KGVkZ2UpOyAKLQkJCQkJCi0JCQkJaWYocGFydCAhPSBudWxsKXsKLQkJCQkJaWYocGFydC5nZXRTb3VyY2UoKSA9PSBudWxsKXsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBkaWFncmFtRWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyMS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJRWRpdFBhcnQgZWxlbWVudCA9IChFZGl0UGFydCkgaXRlcjEubmV4dCgpOwotCQkJCQkJCU9iamVjdCBtb2RlbCA9IGVsZW1lbnQuZ2V0TW9kZWwoKTsKLQkJCQkJCQlpZihlZGdlLmdldFNvdXJjZSgpID09IG1vZGVsKXsKLQkJCQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KXsKLQkJCQkJCQkJCWlmKCgoR3JhcGhpY2FsRWRpdFBhcnQpZWxlbWVudCkuZ2V0RmlndXJlKCkuaXNWaXNpYmxlKCkpewotCQkJCQkJCQkJCXBhcnQuc2V0U291cmNlKGVsZW1lbnQpOwotCQkJCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCQkJcGFydC5zZXRTb3VyY2UobnVsbCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYocGFydC5nZXRUYXJnZXQoKSA9PSBudWxsKXsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBkaWFncmFtRWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyMS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJRWRpdFBhcnQgZWxlbWVudCA9IChFZGl0UGFydCkgaXRlcjEubmV4dCgpOwotCQkJCQkJCU9iamVjdCBtb2RlbCA9IGVsZW1lbnQuZ2V0TW9kZWwoKTsKLQkJCQkJCQlpZihlZGdlLmdldFRhcmdldCgpID09IG1vZGVsKXsKLQkJCQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KXsKLQkJCQkJCQkJCWlmKCgoR3JhcGhpY2FsRWRpdFBhcnQpZWxlbWVudCkuZ2V0RmlndXJlKCkuaXNWaXNpYmxlKCkpewotCQkJCQkJCQkJCXBhcnQuc2V0VGFyZ2V0KGVsZW1lbnQpOwotCQkJCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCQkJcGFydC5zZXRUYXJnZXQobnVsbCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXRyeXsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWRnZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFZGdlIGVkZ2UgPSAoRWRnZSkgaXRlci5uZXh0KCk7Ci0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29ubmVjdGlvbkVkaXRQYXJ0IHBhcnQgPSAKLQkJCQkJKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbm5lY3Rpb25FZGl0UGFydCl2aWV3ZXIuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLmdldChlZGdlKTsgCi0JCQkJaWYocGFydCAhPSBudWxsICYmIChwYXJ0LmdldFNvdXJjZSgpID09IG51bGwgfHwgcGFydC5nZXRUYXJnZXQoKSA9PSBudWxsKQotCQkJCQkJJiYgcGFydC5nZXRGaWd1cmUoKSAhPSBudWxsKXsKLQkJCQkJcGFydC5nZXRGaWd1cmUoKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkgICAgcGFydC5nZXRGaWd1cmUoKS5yZXZhbGlkYXRlKCk7Ci0JCQkJCXBhcnQuZGVhY3RpdmF0ZSgpOwotCQkJCX0KLQkJfQotCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotCQkJaWYoRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCkpewotCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigiRXJyb3Igb2NjdXJlZCB3aGlsZSByZWZyZXNoIHRoZSBjb25uZWN0aW9uOiAiKyBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Byb3ZpZGVycy9BY2Nlc3NpYmxlRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Byb3ZpZGVycy9BY2Nlc3NpYmxlRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZTI2MGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wcm92aWRlcnMvQWNjZXNzaWJsZURpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkFic3RyYWN0RG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuRGlhZ3JhbURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5EaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIAotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQWNjZXNzaWJsZURpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lciBleHRlbmRzCi0JCURpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lciB7Ci0KLQlwdWJsaWMgQWNjZXNzaWJsZURpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lcigKLQkJCUFic3RyYWN0RG9jdW1lbnRQcm92aWRlciBkb2N1bWVudFByb3ZpZGVyLCBEaWFncmFtRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc3VwZXIoZG9jdW1lbnRQcm92aWRlciwgZG9jdW1lbnQpOwotCX0KLQotCXB1YmxpYyBEaWFncmFtIGdldERpYWdyYW0oKSB7Ci0JCURpYWdyYW1Eb2N1bWVudCBkb2MgPSBnZXREaWFncmFtRG9jdW1lbnQoKTsKLQkJcmV0dXJuIGRvYyAhPSBudWxsID8gZG9jLmdldERpYWdyYW0oKSA6IG51bGw7Ci0JfQkJCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSAhPSBOb3RpZmljYXRpb24uUkVNT1ZJTkdfQURBUFRFUikgewotCQkJT2JqZWN0IGZlYXR1cmUgPSBub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpOwotCQkJaWYoZmVhdHVyZSBpbnN0YW5jZW9mIEVTdHJ1Y3R1cmFsRmVhdHVyZSAmJiAoKEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlKS5pc1RyYW5zaWVudCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJT2JqZWN0IG5vdGlmaWVyID0gbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJCSYmIChVbWFVdGlsLmlzQ29udGFpbmVkQnkoKEVPYmplY3QpIG5vdGlmaWVyLCBnZXREaWFncmFtKCkpIHx8IFVtYVV0aWwKLQkJCQkJCQkuaXNDb250YWluZWRCeSgoRU9iamVjdCkgbm90aWZpZXIsIGdldERpYWdyYW0oKQotCQkJCQkJCQkJLmdldEVsZW1lbnQoKSkpKSB7Ci0JCQkJZ2V0RGlhZ3JhbURvY3VtZW50KCkuc2V0Q29udGVudCgKLQkJCQkJCWdldERpYWdyYW1Eb2N1bWVudCgpLmdldENvbnRlbnQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Byb3ZpZGVycy9EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wcm92aWRlcnMvRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyMWM5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Byb3ZpZGVycy9EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXREb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuYWN0aW9ucy5BY3Rpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtRWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogQ2xhc3MgdG8gaGFuZGxlIHRoZSBwb3B1cG1lbnUgaXRlbXMgCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHBhcnQKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIERpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyKElXb3JrYmVuY2hQYXJ0IHBhcnQsIEVkaXRQYXJ0Vmlld2VyIHZpZXdlcikgewotCQlzdXBlcihwYXJ0LCB2aWV3ZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIubWVudUFib3V0VG9TaG93KG1lbnUpOwotCQlJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gIGZpbmQoQWN0aW9uSWRzLkFDVElPTl9ERUxFVEVfRlJPTV9ESUFHUkFNKTsKLQkJaWYoaXRlbSAhPSBudWxsKQotCQlpdGVtLnNldFZpc2libGUoZmFsc2UpOwotCi0JCUlDb250cmlidXRpb25JdGVtIGl0ZW0xPSAgZmluZChBY3Rpb25JZHMuQUNUSU9OX0RFTEVURV9GUk9NX01PREVMKTsKLQkJaWYoaXRlbTEgIT0gbnVsbCkKLQkJaXRlbTEuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQotCQlJQ29udHJpYnV0aW9uSXRlbSBpdGVtMiA9IGZpbmQoQWN0aW9uSWRzLk1FTlVfTkFWSUdBVEUpOwotCQlpZihpdGVtMiAhPSBudWxsKQotCQlpdGVtMi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCi0JCUlDb250cmlidXRpb25JdGVtIGl0ZW0zID0gZmluZChBY3Rpb25GYWN0b3J5LlBST1BFUlRJRVMuZ2V0SWQoKSk7Ci0JCWlmKGl0ZW0zICE9IG51bGwpCi0JCWl0ZW0zLnNldFZpc2libGUoZmFsc2UpOwotCQkKLQkJRWRpdERvbWFpbiBkb21haW4gPSBnZXRWaWV3ZXIoKS5nZXRFZGl0RG9tYWluKCk7Ci0JCWlmKGRvbWFpbiBpbnN0YW5jZW9mIERpYWdyYW1FZGl0RG9tYWluKXsKLQkJCUlFZGl0b3JQYXJ0IHBhcnQ9ICAoKERpYWdyYW1FZGl0RG9tYWluKWRvbWFpbikuZ2V0RWRpdG9yUGFydCgpOwotCQkJaWYocGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcil7Ci0JCQkJKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpcGFydCkuY29udHJpYnV0ZVRvQ29udGV4dE1lbnUobWVudSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Byb3ZpZGVycy9EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Byb3ZpZGVycy9EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YThjYTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wcm92aWRlcnMvRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EZWxlZ2F0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkudXRpbC5JV29ya2JlbmNoUGFydERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotCi0vKioKLSAqIENvcmUgZGlhZ3JhbSBjb250cmlidXRpb24gaXRlbSBwcm92aWRlci4gCi0gKiBJdCBwcm92aWRlcyBjb250cmlidXRpb25zIGdlbmVyaWMgdG8gRVBGIGRpYWdyYW0gZWRpdG9ycwotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcgotCQlleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIgewotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUFjdGlvbiBjcmVhdGVBY3Rpb24oU3RyaW5nIGFjdGlvbklkLCBJV29ya2JlbmNoUGFydERlc2NyaXB0b3IgcGFydERlc2NyaXB0b3IpIHsKLQkJaWYoYWN0aW9uSWQuZXF1YWxzKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpKXsKLQkJCXJldHVybiBuZXcgRGVsZWdhdGVBY3Rpb24ocGFydERlc2NyaXB0b3IuZ2V0UGFydFBhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUFjdGlvbihhY3Rpb25JZCwgcGFydERlc2NyaXB0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcHJvdmlkZXJzL1NoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcHJvdmlkZXJzL1NoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc1ODJmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Byb3ZpZGVycy9TaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLnV0aWwuV29ya3NwYWNlU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0UHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LklEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkZpbGVTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5UeFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS51dGlsLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuRGlhZ3JhbURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5EaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEaWFncmFtRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmRvY3VtZW50LkZpbGVEaWFncmFtRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmRvY3VtZW50LlN0b3JhZ2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmRvY3VtZW50LldvcmtzcGFjZU9wZXJhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmludGVybmFsLkVkaXRvcklERVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmludGVybmFsLmwxMG4uRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmludGVybmFsLkVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaW50ZXJuYWwuRWRpdG9yU3RhdHVzQ29kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdG9yYWdlRWRpdG9ySW5wdXQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyIGV4dGVuZHMgU3RvcmFnZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyIAotewotCXByaXZhdGUgc3RhdGljIGNsYXNzIEZpbGVEaWFncmFtRG9jdW1lbnRQcm92aWRlckV4IGV4dGVuZHMgRmlsZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyIHsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0U2F2ZVJ1bGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJCUlGaWxlRWRpdG9ySW5wdXQgaW5wdXQ9IChJRmlsZUVkaXRvcklucHV0KSBlbGVtZW50OwotCQkJCXJldHVybiBjb21wdXRlU2F2ZVNjaGVkdWxpbmdSdWxlKGlucHV0LmdldEZpbGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIENvbXB1dGVzIHRoZSBzY2hlZHVsaW5nIHJ1bGUgbmVlZGVkIHRvIGNyZWF0ZSBvciBtb2RpZnkgYSByZXNvdXJjZS4gSWYKLQkJICogdGhlIHJlc291cmNlIGV4aXN0cywgaXRzIG1vZGlmeSBydWxlIGlzIHJldHVybmVkLiBJZiBpdCBkb2VzIG5vdCwgdGhlCi0JCSAqIHJlc291cmNlIGhpZXJhcmNoeSBpcyBpdGVyYXRlZCB0b3dhcmRzIHRoZSB3b3Jrc3BhY2Ugcm9vdCB0byBmaW5kIHRoZQotCQkgKiBmaXJzdCBwYXJlbnQgb2YgPGNvZGU+dG9DcmVhdGVPck1vZGlmeTwvY29kZT4gdGhhdCBleGlzdHMuIFRoZW4gdGhlCi0JCSAqICdjcmVhdGUnIHJ1bGUgZm9yIHRoZSBsYXN0IG5vbi1leGlzdGluZyByZXNvdXJjZSBpcyByZXR1cm5lZC4KLQkJICoKLQkJICogQHBhcmFtIHRvQ3JlYXRlT3JNb2RpZnkgdGhlIHJlc291cmNlIHRvIGNyZWF0ZSBvciBtb2RpZnkKLQkJICogQHJldHVybiB0aGUgbWluaW1hbCBzY2hlZHVsaW5nIHJ1bGUgbmVlZGVkIHRvIG1vZGlmeSBvciBjcmVhdGUgYSByZXNvdXJjZQotCQkgKi8KLQkJcHJpdmF0ZSBJU2NoZWR1bGluZ1J1bGUgY29tcHV0ZVNhdmVTY2hlZHVsaW5nUnVsZShJUmVzb3VyY2UgdG9DcmVhdGVPck1vZGlmeSkgewotCQkJaWYgKHRvQ3JlYXRlT3JNb2RpZnkuZXhpc3RzKCkgJiYgdG9DcmVhdGVPck1vZGlmeS5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTykpCi0JCQkJcmV0dXJuIGZSZXNvdXJjZVJ1bGVGYWN0b3J5LnJlZnJlc2hSdWxlKHRvQ3JlYXRlT3JNb2RpZnkpOwotCi0JCQlJUmVzb3VyY2UgcGFyZW50PSB0b0NyZWF0ZU9yTW9kaWZ5OwotCQkJZG8gewotCQkJCSAvKgotCQkJCSAqIFhYWCBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY3NjAxCi0JCQkJICogSVJlc291cmNlUnVsZUZhY3RvcnkuY3JlYXRlUnVsZSBzaG91bGQgaXRlcmF0ZSB0aGUgaGllcmFyY2h5IGl0c2VsZi4KLQkJCQkgKi8KLQkJCQl0b0NyZWF0ZU9yTW9kaWZ5PSBwYXJlbnQ7Ci0JCQkJcGFyZW50PSB0b0NyZWF0ZU9yTW9kaWZ5LmdldFBhcmVudCgpOwotCQkJfSB3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5leGlzdHMoKSAmJiAhcGFyZW50LmlzU3luY2hyb25pemVkKElSZXNvdXJjZS5ERVBUSF9aRVJPKSk7Ci0KLQkJCXJldHVybiBmUmVzb3VyY2VSdWxlRmFjdG9yeS5jcmVhdGVSdWxlKHRvQ3JlYXRlT3JNb2RpZnkpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElSdW5uYWJsZUNvbnRleHQgZ2V0T3BlcmF0aW9uUnVubmVyKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJcmV0dXJuIHN1cGVyLmdldE9wZXJhdGlvblJ1bm5lcihtb25pdG9yKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJFeCBmaWxlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIgPSBuZXcgRmlsZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyRXgoKTsKLQkKLQkvL2EgU3RvcmFnZUluZm8gd2l0aCBhIERpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lciAKLQlwcml2YXRlIGNsYXNzIERpYWdyYW1TdG9yYWdlSW5mbyBleHRlbmRzIFN0b3JhZ2VJbmZvIHsKLQotCQlEaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXIgZkxpc3RlbmVyOwotCQlwdWJsaWMgRGlhZ3JhbVN0b3JhZ2VJbmZvKElEb2N1bWVudCBkb2N1bWVudCwgRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlzdXBlcihkb2N1bWVudCk7Ci0JCQlmTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQkJfQotCQkKLQl9Ci0KLQlwcml2YXRlIFdvcmtzcGFjZU9wZXJhdGlvblJ1bm5lciBmT3BlcmF0aW9uUnVubmVyOwotCXByaXZhdGUgRGlhZ3JhbU1hbmFnZXIgZkRpYWdyYW1NZ3I7Ci0JcHJpdmF0ZSBib29sZWFuIGxvY2tlZCA9IGZhbHNlOwotCi0JcHVibGljIFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIoRGlhZ3JhbU1hbmFnZXIgZGlhZ3JhbU1ncikgewotCQlzdXBlcigpOwotCQlmRGlhZ3JhbU1nciA9IGRpYWdyYW1NZ3I7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHNldERvY3VtZW50Q29udGVudChJRG9jdW1lbnQgZG9jdW1lbnQsIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZihkb2N1bWVudCBpbnN0YW5jZW9mIElEaWFncmFtRG9jdW1lbnQpIHsKLQkJCSgoSURpYWdyYW1Eb2N1bWVudClkb2N1bWVudCkuc2V0RWRpdGluZ0RvbWFpbihmRGlhZ3JhbU1nci5nZXRFZGl0aW5nRG9tYWluKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5zZXREb2N1bWVudENvbnRlbnQoZG9jdW1lbnQsIGVkaXRvcklucHV0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuZG9jdW1lbnQuU3RvcmFnZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyI3NldERvY3VtZW50Q29udGVudEZyb21TdG9yYWdlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRG9jdW1lbnQsIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50Q29udGVudEZyb21TdG9yYWdlKElEb2N1bWVudCBkb2N1bWVudCwgSVN0b3JhZ2Ugc3RvcmFnZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSlkb2N1bWVudC5nZXRDb250ZW50KCk7Ci0JCWlmKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBkaWFncmFtLmVSZXNvdXJjZSgpOwotCQkJSUZpbGUgcmVzb3VyY2VGaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUocmVzb3VyY2UpOwotCQkJLy8gdW5sb2FkIGlmIHRoZSByZXNvdXJjZUZpbGUgYW5kIHN0b3JhZ2UgaXMgc2FtZS4KLQkJCS8vIGlmIG5vdCBzYW1lIHRocm93IGV4Y2VwdGlvbi4KLQkJCWlmKHJlc291cmNlRmlsZSAhPSBudWxsKSB7Ci0JCQkJaWYocmVzb3VyY2VGaWxlLmVxdWFscyhzdG9yYWdlKSkgewotCQkJCQlkb2N1bWVudC5zZXRDb250ZW50KG51bGwpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRWRpdG9ySURFUGx1Z2luLmdldFBsdWdpbklkKCksIEVkaXRvclN0YXR1c0NvZGVzLkVSUk9SLCBFZGl0b3JNZXNzYWdlcy5GaWxlRG9jdW1lbnRQcm92aWRlcl9oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQsIG51bGwpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZG9jdW1lbnQuc2V0Q29udGVudCgoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucmVzb3VyY2VzLklEaWFncmFtU3RvcmFnZSlzdG9yYWdlKS5nZXREaWFncmFtKCkpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuZG9jdW1lbnQuU3RvcmFnZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyI2Rpc3Bvc2VFbGVtZW50SW5mbyhqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuQWJzdHJhY3REb2N1bWVudFByb3ZpZGVyLkVsZW1lbnRJbmZvKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2VFbGVtZW50SW5mbyhPYmplY3QgZWxlbWVudCwgRWxlbWVudEluZm8gaW5mbykgewotCQkoKERpYWdyYW1TdG9yYWdlSW5mbylpbmZvKS5mTGlzdGVuZXIuc3RvcExpc3RlbmluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvU2F2ZURvY3VtZW50KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgT2JqZWN0IGVsZW1lbnQsIElEb2N1bWVudCBkb2N1bWVudCwgYm9vbGVhbiBvdmVyd3JpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZmluYWwgRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGRvY3VtZW50LmdldENvbnRlbnQoKTsKLQkJLy9UT0RPOiBoYW5kbGUgY2FzZSB3aGVyZSB1c2VyIGRpZCBub3QgcmVmcmVzaCBkaWFncmFtIGFmdGVyIGRpYWdyYW0ncyByZXNvdXJjZSBoYXMgYmVlbiByZWxvYWRlZAotCQkvLyBkaWFncmFtIGRvZXMgbm90IGhhdmUgYSByZXNvdXJjZSBpbiB0aGlzIGNhc2UKLQkJLy8gaWYgb3ZlcndyaXRlIGFsbG93ZWQsIHRoaXMgZGlhZ3JhbSBzaG91bGQgcmVwbGFjZSB0aGUgZGlhZ3JhbSBpbiB0aGUgcmVsb2FkZWQgcmVzb3VyY2UuCi0JCS8vCi0JCVJlc291cmNlIHJlc291cmNlID0gZGlhZ3JhbS5lUmVzb3VyY2UoKTsKLQkJaWYgKCFvdmVyd3JpdGUpIHsKLQkJCURpYWdyYW1NYW5hZ2VyLmNoZWNrU3luY2hyb25pemF0aW9uU3RhdGUocmVzb3VyY2UpOwotCQl9CQkKLQkJSVN0YXR1cyBzdGF0dXMgPSBTZXJ2aWNlcy5nZXRBY2Nlc3NDb250cm9sbGVyKCkuY2hlY2tNb2RpZnkobmV3IFJlc291cmNlW10ge3Jlc291cmNlfSwgTXNnQm94LmdldERlZmF1bHRTaGVsbCgpKTsKLQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCX0KLQkJCi0JCS8vIGluZm9ybSBhYm91dCB0aGUgdXBjb21pbmcgY29udGVudCBjaGFuZ2UKLQkJZmlyZUVsZW1lbnRTdGF0ZUNoYW5naW5nKGVsZW1lbnQpOwotCQkKLQkJaWYoZGlhZ3JhbS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKSB7Ci0JCQl0cnkgewotCQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGRpYWdyYW0sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlkaWFncmFtLnBlcnNpc3RDaGlsZHJlbigpOwotCQkJCQkJZm9yIChPYmplY3QgY2hpbGQgOiBkaWFncmFtLmdldENoaWxkcmVuKCkpIHsKLQkJCQkJCQkoKFZpZXcpIGNoaWxkKS5wZXJzaXN0Q2hpbGRyZW4oKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQl9KTsKLQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCQotCQlGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gU2VydmljZXMuZ2V0TGlicmFyeVBlcnNpc3RlcihTZXJ2aWNlcy5YTUlfUEVSU0lTVEVOQ0VfVFlQRSkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJdHJ5IHsKLS8vCQkJcmVzb3VyY2Uuc2F2ZShDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQotCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkKLQkJCS8vIGluZm9ybSBhYm91dCBmYWlsdXJlCi0JCQlmaXJlRWxlbWVudFN0YXRlQ2hhbmdlRmFpbGVkKGVsZW1lbnQpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBEaWFncmFtQ29yZVBsdWdpbi5QTFVHSU5fSUQKLQkJCQkJLCBFZGl0b3JTdGF0dXNDb2Rlcy5SRVNPVVJDRV9GQUlMVVJFLCBlCi0JCQkJCS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIG51bGwpKTsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCWZEaWFncmFtTWdyLnJlbW92ZURpYWdyYW1CYWNrdXAoZ2V0QWN0aXZpdHkoKElFZGl0b3JJbnB1dCkgZWxlbWVudCksIGRpYWdyYW0uZ2V0VHlwZSgpKTsKLQkJCWlmKERpYWdyYW1NYW5hZ2VyLkFERF9raW5kLmVxdWFscyhkaWFncmFtLmdldFR5cGUoKSkKLQkJCQkJfHwgRGlhZ3JhbU1hbmFnZXIuV1BEX2tpbmQuZXF1YWxzKGRpYWdyYW0uZ2V0VHlwZSgpKSkgewotCQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0gZCA9IChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJCQlkLnNldE5ldyhmYWxzZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24geCkgewotCQkJLy8gaW5mb3JtIGFib3V0IGZhaWx1cmUKLQkJCWZpcmVFbGVtZW50U3RhdGVDaGFuZ2VGYWlsZWQoZWxlbWVudCk7Ci0JCQl0aHJvdyB4OwotCQl9Ci0JCQotCQlpZihtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCQotCQlsb2dSZXNvdXJjZUVycm9yc0FuZFdhcm5pbmdzKHJlc291cmNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dSZXNvdXJjZUVycm9yc0FuZFdhcm5pbmdzKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlLmdldEVycm9ycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UuRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gKFJlc291cmNlLkRpYWdub3N0aWMpIGl0ZXIubmV4dCgpOwotCQkJTG9nLmVycm9yKEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLCBFZGl0b3JTdGF0dXNDb2Rlcy5FUlJPUiwgZGlhZ25vc3RpYy5nZXRNZXNzYWdlKCkpOwkJCQkKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlLmdldFdhcm5pbmdzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZS5EaWFnbm9zdGljIGRpYWdub3N0aWMgPSAoUmVzb3VyY2UuRGlhZ25vc3RpYykgaXRlci5uZXh0KCk7Ci0JCQlMb2cud2FybmluZyhFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKSwgRWRpdG9yU3RhdHVzQ29kZXMuV0FSTklORywgZGlhZ25vc3RpYy5nZXRNZXNzYWdlKCkpOwkJCQkKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBsb25nIGdldE1vZGlmaWNhdGlvblN0YW1wKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJSUZpbGVFZGl0b3JJbnB1dCBpbnB1dD0gKElGaWxlRWRpdG9ySW5wdXQpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gRmlsZVN5bmNocm9uaXplci5jb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoaW5wdXQuZ2V0RmlsZSgpKTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRNb2RpZmljYXRpb25TdGFtcChlbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q29udGVudChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJRWxlbWVudEluZm8gaW5mbyA9IGdldEVsZW1lbnRJbmZvKGlucHV0KTsKLQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBjcmVhdGVFbXB0eURvY3VtZW50KCk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQotCQl0cnkgewotCQkJc2V0RG9jdW1lbnRDb250ZW50KGRvY3VtZW50LCBpbnB1dCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24geCkgewotCQkJc3RhdHVzID0geC5nZXRTdGF0dXMoKTsKLQkJfQotCQkKLQkJT2JqZWN0IG5ld0NvbnRlbnQ9IGRvY3VtZW50LmdldENvbnRlbnQoKTsKLQkJCi0JCS8vIHNldCB0aGUgbmV3IGNvbnRlbnQgYW5kIGZpcmUgY29udGVudCByZWxhdGVkIGV2ZW50cwotCQlmaXJlRWxlbWVudENvbnRlbnRBYm91dFRvQmVSZXBsYWNlZChpbnB1dCk7Ci0KLQkJcmVtb3ZlVW5jaGFuZ2VkRWxlbWVudExpc3RlbmVycyhpbnB1dCwgaW5mbyk7Ci0KLQkJaW5mby5mRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcihpbmZvKTsKLQkJaW5mby5mRG9jdW1lbnQuc2V0Q29udGVudChuZXdDb250ZW50KTsKLQkJaW5mby5mQ2FuQmVTYXZlZCA9IGZhbHNlOwotCQlpbmZvLmZTdGF0dXMgPSBzdGF0dXM7Ci0KLQkJYWRkVW5jaGFuZ2VkRWxlbWVudExpc3RlbmVycyhpbnB1dCwgaW5mbyk7Ci0KLQkJZmlyZUVsZW1lbnRDb250ZW50UmVwbGFjZWQoaW5wdXQpOwotCX0KLQkJCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZWxlbWVudCBpbmZvIHRvIGEgY2hhbmdlIG9mIHRoZSBmaWxlIGNvbnRlbnQgYW5kIHNlbmRzIG91dAotCSAqIGFwcHJvcHJpYXRlIG5vdGlmaWNhdGlvbnMuCi0JICoKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IG9mIGEgZG9jdW1lbnQgZWRpdG9yCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlFbGVtZW50SW5mbyBpbmZvID0gZ2V0RWxlbWVudEluZm8oaW5wdXQpOwotCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlEb2N1bWVudCBkb2N1bWVudD0gY3JlYXRlRW1wdHlEb2N1bWVudCgpOwotCQlJU3RhdHVzIHN0YXR1cz0gbnVsbDsKLQotCQl0cnkgewotCQkJc2V0RG9jdW1lbnRDb250ZW50KGRvY3VtZW50LCBpbnB1dCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24geCkgewotCQkJc3RhdHVzPSB4LmdldFN0YXR1cygpOwotCQl9Ci0KLQkJT2JqZWN0IG5ld0NvbnRlbnQ9IGRvY3VtZW50LmdldENvbnRlbnQoKTsKLQotCQlpZiAoICFuZXdDb250ZW50LmVxdWFscyhpbmZvLmZEb2N1bWVudC5nZXRDb250ZW50KCkpKSB7Ci0KLQkJCS8vIHNldCB0aGUgbmV3IGNvbnRlbnQgYW5kIGZpcmUgY29udGVudCByZWxhdGVkIGV2ZW50cwotCQkJZmlyZUVsZW1lbnRDb250ZW50QWJvdXRUb0JlUmVwbGFjZWQoaW5wdXQpOwotCi0JCQlyZW1vdmVVbmNoYW5nZWRFbGVtZW50TGlzdGVuZXJzKGlucHV0LCBpbmZvKTsKLQotCQkJaW5mby5mRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcihpbmZvKTsKLQkJCWluZm8uZkRvY3VtZW50LnNldENvbnRlbnQobmV3Q29udGVudCk7Ci0JCQlpbmZvLmZDYW5CZVNhdmVkPSBmYWxzZTsKLQkJCWluZm8uZlN0YXR1cz0gc3RhdHVzOwotCi0JCQlhZGRVbmNoYW5nZWRFbGVtZW50TGlzdGVuZXJzKGlucHV0LCBpbmZvKTsKLQotCQkJZmlyZUVsZW1lbnRDb250ZW50UmVwbGFjZWQoaW5wdXQpOwotCi0JCX0gZWxzZSB7Ci0JCQkKLQkJCWhhbmRsZUV4aXN0aW5nRG9jdW1lbnRTYXZlZChpbnB1dCwgaW5mbywgc3RhdHVzKTsKLQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUV4aXN0aW5nRG9jdW1lbnRTYXZlZChJRWRpdG9ySW5wdXQgaW5wdXQsIEVsZW1lbnRJbmZvIGluZm8sIElTdGF0dXMgc3RhdHVzKSB7Ci0JCXJlbW92ZVVuY2hhbmdlZEVsZW1lbnRMaXN0ZW5lcnMoaW5wdXQsIGluZm8pOwotCi0JCS8vIGZpcmVzIG9ubHkgdGhlIGRpcnR5IHN0YXRlIHJlbGF0ZWQgZXZlbnQKLQkJaW5mby5mQ2FuQmVTYXZlZD0gZmFsc2U7Ci0JCWluZm8uZlN0YXR1cz0gc3RhdHVzOwotCi0JCWFkZFVuY2hhbmdlZEVsZW1lbnRMaXN0ZW5lcnMoaW5wdXQsIGluZm8pOwotCi0JCWZpcmVFbGVtZW50RGlydHlTdGF0ZUNoYW5nZWQoaW5wdXQsIGZhbHNlKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIG1hcmtEb2N1bWVudEFzU2F2ZWQoSUZpbGVFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlFbGVtZW50SW5mbyBpbmZvID0gZ2V0RWxlbWVudEluZm8oaW5wdXQpOwotCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQloYW5kbGVFeGlzdGluZ0RvY3VtZW50U2F2ZWQoaW5wdXQsIGluZm8sIG51bGwpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1N5bmNocm9uaXplKE9iamVjdCBlbGVtZW50LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIElFZGl0b3JJbnB1dCkgewotCQkJaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkKChJRWRpdG9ySW5wdXQpIGVsZW1lbnQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmRvU3luY2hyb25pemUoZWxlbWVudCwgbW9uaXRvcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzU3luY2hyb25pemVkKE9iamVjdCBlbGVtZW50KSB7Ci0JCUVsZW1lbnRJbmZvIGluZm8gPSBnZXRFbGVtZW50SW5mbyhlbGVtZW50KTsKLQkJaWYoaW5mby5mRG9jdW1lbnQgaW5zdGFuY2VvZiBJRGlhZ3JhbURvY3VtZW50KSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoKElEaWFncmFtRG9jdW1lbnQpaW5mby5mRG9jdW1lbnQpLmdldERpYWdyYW0oKTsKLQkJCWlmKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gZGlhZ3JhbS5lUmVzb3VyY2UoKTsKLQkJCQkvLyBhIGRpYWdyYW0gdGhhdCBkb2VzIG5vdCBoYXZlIGEgcmVzb3VyY2UgaXMgY29uc2lkZXJlZCBhcyBvdXQtb2Ytc3luY2gKLQkJCQkvLyBiZWNhdXNlIGl0cyByZXNvdXJjZSBtdXN0IGhhdmUgYmVlbiByZWxvYWRlZC4KLQkJCQkvLwotCQkJCXJldHVybiByZXNvdXJjZSAhPSBudWxsICYmIERpYWdyYW1NYW5hZ2VyLmlzU3luY2hyb25pemVkKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNTeW5jaHJvbml6ZWQoZWxlbWVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVsZW1lbnRJbmZvIGNyZWF0ZU5ld0VsZW1lbnRJbmZvKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlEaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQWNjZXNzaWJsZURpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lcih0aGlzLCAoRGlhZ3JhbURvY3VtZW50KWRvY3VtZW50KTsKLQkJRGlhZ3JhbVN0b3JhZ2VJbmZvIGluZm8gPSBuZXcgRGlhZ3JhbVN0b3JhZ2VJbmZvKGRvY3VtZW50LCBsaXN0ZW5lcik7Ci0JCWxpc3RlbmVyLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JCXJldHVybiBpbmZvOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRvci5BYnN0cmFjdERvY3VtZW50UHJvdmlkZXIjZ2V0T3BlcmF0aW9uUnVubmVyKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXByb3RlY3RlZCBJUnVubmFibGVDb250ZXh0IGdldE9wZXJhdGlvblJ1bm5lcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIGZpbGVEaWFncmFtRG9jdW1lbnRQcm92aWRlci5nZXRPcGVyYXRpb25SdW5uZXIobW9uaXRvcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0b3IuQWJzdHJhY3REb2N1bWVudFByb3ZpZGVyI2dldFNhdmVSdWxlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBnZXRTYXZlUnVsZShPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZmlsZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyLmdldFNhdmVSdWxlKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEFsbG93cyBlZGl0aW5nIGV2ZW4gdGhlIGRvY3VtZW50IGlzIG91dCBvZiBzeW5jaC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhbGxvd0VkaXRpbmcoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUVsZW1lbnRJbmZvIGluZm8gPSBnZXRFbGVtZW50SW5mbyhpbnB1dCk7Ci0JCWlmKGluZm8uZkRvY3VtZW50IGluc3RhbmNlb2YgSURpYWdyYW1Eb2N1bWVudCkgewotCQkJRGlhZ3JhbSBkaWFncmFtID0gKChJRGlhZ3JhbURvY3VtZW50KWluZm8uZkRvY3VtZW50KS5nZXREaWFncmFtKCk7Ci0JCQlpZihkaWFncmFtICE9IG51bGwgJiYgZGlhZ3JhbS5lUmVzb3VyY2UoKSA9PSBudWxsIAotCQkJCQkmJiBpbnB1dCBpbnN0YW5jZW9mIElEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSBnZXRBY3Rpdml0eShpbnB1dCk7Ci0JCQkJaWYoYWN0ICE9IG51bGwpIHsKLQkJCQkJZkRpYWdyYW1NZ3IucmVwbGFjZVRlbXBvcmFyaWx5KGFjdCwgZGlhZ3JhbSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5IGdldEFjdGl2aXR5KElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlyZXR1cm4gKEFjdGl2aXR5KSAoKElEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpaW5wdXQpLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpLmdldE1ldGhvZEVsZW1lbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXZlcnNlVG9TYXZlZChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJRWxlbWVudEluZm8gaW5mbyA9IGdldEVsZW1lbnRJbmZvKGlucHV0KTsKLQkJaWYoaW5mby5mRG9jdW1lbnQgaW5zdGFuY2VvZiBJRGlhZ3JhbURvY3VtZW50KSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoKElEaWFncmFtRG9jdW1lbnQpaW5mby5mRG9jdW1lbnQpLmdldERpYWdyYW0oKTsKLQkJCWlmKGRpYWdyYW0gIT0gbnVsbCAmJiBkaWFncmFtLmVSZXNvdXJjZSgpICE9IG51bGwgCi0JCQkJCSYmIGlucHV0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSBnZXRBY3Rpdml0eShpbnB1dCk7Ci0JCQkJaWYoYWN0ICE9IG51bGwpIHsKLQkJCQkJZkRpYWdyYW1NZ3IucmV2ZXJzZVRvU2F2ZWQoYWN0LCBkaWFncmFtLCAoKERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KWlucHV0KS5nZXRQcmVmZXJlbmNlSGludCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSWYgYSBwbHVnaW4gaXMgbG9ja2VkLCBkaWFncmFtIGVkaXRvciBhbmQgZG9jdW1lbnQgcHJvdmlkZXIKLQkgKiBzaG91bGQgYmUgbG9ja2VkLCB0aGlzIGlzIGRvbmUgYWZ0ZXIgbG9hZGluZyB0aGUgZGlhZ3JhbSBlZGl0b3IKLQkgKiB1c2luZyB0aGlzIG1ldGhvZC4KLQkgKiBAcGFyYW0gbG9jawotCSAqLwotCXB1YmxpYyB2b2lkIGxvY2soYm9vbGVhbiBsb2NrKXsKLQkJbG9ja2VkID1sb2NrOyAKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FjaGUoSVN0b3JhZ2VFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlci51cGRhdGVDYWNoZShpbnB1dCk7Ci0JCVN0b3JhZ2VJbmZvIGluZm89IChTdG9yYWdlSW5mbykgZ2V0RWxlbWVudEluZm8oaW5wdXQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZihsb2NrZWQgJiYgaW5mby5mSXNNb2RpZmlhYmxlKQotCQkJCWluZm8uZklzTW9kaWZpYWJsZT0gIWxvY2tlZDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiByZXR1cm5zIHRoZSBsb2NrZWQgc3RhdGUgb2YgcGx1Z2luLiAKLQkgKiBsb2NrZWQgc3RhdGUgaXMgIHNldCB1c2luZyBsb2NrKGJvb2xlYW4gbG9jaykgbWV0aG9kLiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0TG9ja2VkU3RhdGUoKXsKLQkJcmV0dXJuIGxvY2tlZDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNNb2RpZmlhYmxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmKCFEaWFncmFtRWRpdG9yVXRpbC5pc01vZGlmaWFibGUoZWxlbWVudCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNNb2RpZmlhYmxlKGVsZW1lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcmVzb3VyY2VzL0lEaWFncmFtU3RvcmFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9yZXNvdXJjZXMvSURpYWdyYW1TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NjA1YzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9yZXNvdXJjZXMvSURpYWdyYW1TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5yZXNvdXJjZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEaWFncmFtU3RvcmFnZSBleHRlbmRzIElTdG9yYWdlIHsKLQlEaWFncmFtIGdldERpYWdyYW0oKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvc2VydmljZXMvRGlhZ3JhbUhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9zZXJ2aWNlcy9EaWFncmFtSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYjUxNmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9zZXJ2aWNlcy9EaWFncmFtSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLmltcGwuSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkRpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuVHhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuRGlhZ3JhbUVkaXRpbmdEb21haW5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1IZWxwZXIgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gRElBR1JBTV9UWVBFUyA9IHsgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0sCi0JCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSwgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0gfTsKLQotCQotCXB1YmxpYyBzdGF0aWMgaW50IGdldERpYWdyYW1UeXBlKERpYWdyYW0gZGlhZ3JhbSl7Ci0JCVN0cmluZyB0eXBlU3RyID0gZGlhZ3JhbS5nZXRUeXBlKCk7Ci0JCWlmKHR5cGVTdHIuZXF1YWxzKERpYWdyYW1NYW5hZ2VyLkFEX2tpbmQpKXsKLQkJCXJldHVybiBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTTsKLQkJfQotCQlpZih0eXBlU3RyLmVxdWFscyhEaWFncmFtTWFuYWdlci5BRERfa2luZCkpewotCQkJcmV0dXJuIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTTsKLQkJfQotCQlpZih0eXBlU3RyLmVxdWFscyhEaWFncmFtTWFuYWdlci5XUERfa2luZCkpewotCQkJcmV0dXJuIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBOb2RlIGZpbmROb2RlKERpYWdyYW0gZGlhZ3JhbSwgT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVmlldyB2aWV3ID0gKFZpZXcpIGl0ZXIubmV4dCgpOwkJCQotCQkJaWYgKHZpZXcgaW5zdGFuY2VvZiBOb2RlICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQlPYmplY3QgZSA9IG51bGw7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgdmlldy5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBFTW9kZWxFbGVtZW50KSB7Ci0JCQkJCUVNb2RlbEVsZW1lbnQgbW9kZWxFbGVtZW50ID0gKEVNb2RlbEVsZW1lbnQpIHZpZXcuZ2V0RWxlbWVudCgpOwotCQkJCQllID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobW9kZWxFbGVtZW50KTsKLQkJCQkJaWYoZSA9PSBudWxsKSB7Ci0JCQkJCQkvLyBkaWFncmFtIGlzIG5vdCBvcGVuIHlldCwgdHJ5IHRvIHJlc29sdmUgdGhlIGVsZW1lbnQgZnJvbSBVUkkgc3RvcmVkIGluIHRoZSBub2RlJ3MgYW5ub3RhdGlvbgotCQkJCQkJLy8KLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKChNZXRob2RFbGVtZW50KW9iamVjdCkuZVJlc291cmNlKCk7Ci0JCQkJCQlpZihyZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpICE9IG51bGwpIHsKLQkJCQkJCQllID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnRGcm9tQW5ub3RhdGlvbihtb2RlbEVsZW1lbnQsIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZSA9IHZpZXcuZ2V0RWxlbWVudCgpOwotCQkJCX0KLQkJCQlpZiAob2JqZWN0LmVxdWFscyhlKSkgewotCQkJCQlyZXR1cm4gKE5vZGUpIHZpZXc7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE5vZGUgZmluZE5vZGVJbk1vZGVsRGlhZ3JhbShEaWFncmFtIGRpYWdyYW0sIE1ldGhvZEVsZW1lbnQgZSl7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVZpZXcgdmlldyA9IChWaWV3KSBpdGVyLm5leHQoKTsKLQkJCWlmKHZpZXcgaW5zdGFuY2VvZiBOb2RlKXsKLQkJCQlPYmplY3QgZXggPSBudWxsOwotCQkJCUVPYmplY3QgbW9kZWwgPSB2aWV3LmdldEVsZW1lbnQoKTsKLQkJCQlpZihtb2RlbCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpewotCQkJCQlleCA9ICgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSltb2RlbCkuZ2V0TGlua2VkRWxlbWVudCgpOwotCQkJCQlpZihleCAhPSBudWxsICYmIGV4ID09IGUpewotCQkJCQkJcmV0dXJuIChOb2RlKXZpZXc7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIGRpYWdyYW0gYW5kIHNhdmVzIGltbWVkaWF0ZWx5LgotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRGlhZ3JhbShmaW5hbCBEaWFncmFtIGRpYWdyYW0sIGJvb2xlYW4gc2F2ZSkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlpZiAoZGlhZ3JhbSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWJvb2xlYW4gZmlsZUV4aXN0ID0gdHJ1ZTsKLQkJRmlsZSBmaWxlID0gbnVsbDsKLQkJT2JqZWN0IGxpbmtlZE9iamVjdCA9IG51bGw7Ci0JCVByb2Nlc3MgcHJvY2VzcyA9IG51bGw7Ci0JCWlmIChkaWFncmFtLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSB7Ci0JCQlEaWFncmFtQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldERpYWdyYW1BZGFwdGVyKGRpYWdyYW0KLQkJCQkJLmdldEVsZW1lbnQoKSk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJbGlua2VkT2JqZWN0ID0gYWRhcHRlci5nZXRXcmFwcGVyKCk7Ci0JCQkJaWYgKGxpbmtlZE9iamVjdCA9PSBudWxsKSB7Ci0JCQkJCWxpbmtlZE9iamVjdCA9IGFkYXB0ZXIuZ2V0RWxlbWVudCgpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0gZGlhZ3JhbU1vZGVsID0gKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIGRpYWdyYW0KLQkJCQkJLmdldEVsZW1lbnQoKTsKLQkJCWxpbmtlZE9iamVjdCA9IGRpYWdyYW1Nb2RlbC5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCX0KLQotCQlpZiAobGlua2VkT2JqZWN0ICE9IG51bGwpIHsKLQkJCXByb2Nlc3MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MobGlua2VkT2JqZWN0KTsKLQkJCVN0cmluZyBmaWxlUGF0aCA9IERpYWdyYW1NYW5hZ2VyLmdldERpYWdyYW1GaWxlUGF0aChwcm9jZXNzKTsKLQkJCWZpbGUgPSBuZXcgRmlsZShmaWxlUGF0aCk7Ci0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQkJZmlsZUV4aXN0ID0gZmFsc2U7Ci0JCX0KLQkJZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UgPSBkaWFncmFtLmVSZXNvdXJjZSgpOwotCQlpZiAoZmlsZSA9PSBudWxsICYmIHJlc291cmNlICE9IG51bGwpIHsKLQkJCWZpbGUgPSBuZXcgRmlsZShGaWxlTWFuYWdlci50b0ZpbGVTdHJpbmcocmVzb3VyY2UKLQkJCQkJLmdldFVSSSgpKSk7Ci0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQkJZmlsZUV4aXN0ID0gZmFsc2U7Ci0JCX0KLQotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZGlhZ3JhbSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLnJlbW92ZShkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkucmVtb3ZlKGRpYWdyYW0pOwotCQkJCQlVbWFVdGlsLnJlbW92ZUFsbEFkYXB0ZXJzKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCQkJVW1hVXRpbC5yZW1vdmVBbGxBZGFwdGVycyhkaWFncmFtKTsKLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJCQotCQkJaWYgKCFmaWxlRXhpc3QpCi0JCQkJcmV0dXJuOwotCi0JCQlpZiAoc2F2ZSkgewotLy8JCQkJaWYgKHJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0vLwkJCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotLy8JCQkJCQlpZiAocHJvY2VzcyAhPSBudWxsCi0vLwkJCQkJCQkJJiYgRGlhZ3JhbU1hbmFnZXIuaGFzRGlhZ3JhbU1hbmFnZXIocHJvY2VzcykpIHsKLS8vCQkJCQkJCU9iamVjdCBjb25zdW1lciA9IG5ldyBPYmplY3QoKTsKLS8vCQkJCQkJCURpYWdyYW1NYW5hZ2VyIG1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKAotLy8JCQkJCQkJCQlwcm9jZXNzLCBjb25zdW1lcik7Ci0vLwkJCQkJCQltZ3IuZGlzcG9zZSgpOwotLy8JCQkJCQl9Ci0vLwkJCQkJCVNlcnZpY2VzLmdldEZpbGVNYW5hZ2VyKCkKLS8vCQkJCQkJCQkuZGVsZXRlKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJCWVsc2UgewotCQkJCQlGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gU2VydmljZXMKLQkJCQkJCQkuZ2V0TGlicmFyeVBlcnNpc3RlcihTZXJ2aWNlcy5YTUlfUEVSU0lTVEVOQ0VfVFlQRSkKLQkJCQkJCQkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uUExVR0lOX0lELCAxLCBlCi0JCQkJCQkJCQkJLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgbnVsbCkpOwotCQkJCQl9Ci0vLwkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2QgdG8gZ2V0IGVkaXRpbmcgZG9tYWluCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCl7Ci0JCXJldHVybiAoSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbikgRGlhZ3JhbUVkaXRpbmdEb21haW5GYWN0b3J5LmdldEluc3RhbmNlKCkKLQkJLmNyZWF0ZUVkaXRpbmdEb21haW4oKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oRGlhZ3JhbSBkaWFncmFtKXsKLQkJaWYoZGlhZ3JhbSA9PSBudWxsKSByZXR1cm4gZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGRpYWdyYW0uZVJlc291cmNlKCk7Ci0JCWlmKHJlc291cmNlID09IG51bGwpIHJldHVybiBnZXRFZGl0aW5nRG9tYWluKCk7Ci0JCXJldHVybiAoSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbilEaWFncmFtRWRpdGluZ0RvbWFpbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRFZGl0aW5nRG9tYWluKHJlc291cmNlLmdldFJlc291cmNlU2V0KCkpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGFsbCBhdmFpbGFibGUgZGlhZ3JhbXMgb2YgdGhlIHNwZWNpZmllZCBhY3Rpdml0eS4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxEaWFncmFtPiBnZXREaWFncmFtcyhBY3Rpdml0eSBhY3QsIERpYWdyYW1NYW5hZ2VyIG1ncikgewotCQl0cnkgewotCQkJQXJyYXlMaXN0PERpYWdyYW0+IGRpYWdyYW1zID0gbmV3IEFycmF5TGlzdDxEaWFncmFtPigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBESUFHUkFNX1RZUEVTLmxlbmd0aDsgaSsrKSB7Ci0JCQkJTGlzdDxEaWFncmFtPiBsaXN0ID0gbWdyLmdldERpYWdyYW1zKGFjdCwgRElBR1JBTV9UWVBFU1tpXSk7Ci0JCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQlkaWFncmFtcy5hZGRBbGwobGlzdCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGRpYWdyYW1zOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERpYWdyYW1UeXBlU3RyaW5nKERpYWdyYW0gZGlhZ3JhbSl7Ci0JCVN0cmluZyB0eXBlU3RyID0gZGlhZ3JhbS5nZXRUeXBlKCk7Ci0JCWlmKHR5cGVTdHIuZXF1YWxzKERpYWdyYW1NYW5hZ2VyLkFEX2tpbmQpKXsKLQkJCXJldHVybiBEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fa2luZDsKLQkJfQotCQlpZih0eXBlU3RyLmVxdWFscyhEaWFncmFtTWFuYWdlci5BRERfa2luZCkpewotCQkJcmV0dXJuIERpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGV0YWlsX0RpYWdyYW1fa2luZDsKLQkJfQotCQlpZih0eXBlU3RyLmVxdWFscyhEaWFncmFtTWFuYWdlci5XUERfa2luZCkpewotCQkJcmV0dXJuIERpYWdyYW1Db3JlUmVzb3VyY2VzLldvcmtQcm9kdWN0RGVwZW5kZW5jeV9EaWFncmFtX2tpbmQ7Ci0JCX0KLQkJcmV0dXJuICIiOyAgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIERpYWdyYW0gY29weURpYWdyYW0oRWRpdGluZ0RvbWFpbiBkb21haW4sIERpYWdyYW0gZGlhZ3JhbSkgewotCQlBcnJheUxpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWxpc3QuYWRkKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJbGlzdC5hZGQoZGlhZ3JhbSk7Ci0JCUNvbW1hbmQgY21kID0gQ29weUNvbW1hbmQuY3JlYXRlKGRvbWFpbiwgbGlzdCk7Ci0JCWNtZC5leGVjdXRlKCk7Ci0JCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IGNtZC5nZXRSZXN1bHQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJCURpYWdyYW0gY29weSA9IChEaWFncmFtKSBlbGVtZW50OwotCQkJCXJldHVybiBjb3B5OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZWFzc29jaWF0ZXMgYWN0aXZpdHkgbm9kZXMgaW4gdGhlIGJhc2UgZGlhZ3JhbSBjb3B5IHdpdGggY29ycmVzcG9uZGluZwotCSAqIGxvY2FsbHkgY29udHJpYnV0b3JzIG9yIHJlcGxhY2VycyBpZiB0aGVyZSBpcyBhbnkuCi0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGNvcHlPZkJhc2VEaWFncmFtCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlYXNzb2NpYXRlKEFjdGl2aXR5IGFjdGl2aXR5LCBEaWFncmFtIGNvcHlPZkJhc2VEaWFncmFtKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlRWxlbWVudCA9ICgoQWN0aXZpdHkpIGVsZW1lbnQpCi0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmIChiYXNlRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IERpYWdyYW1IZWxwZXIuZmluZE5vZGUoY29weU9mQmFzZURpYWdyYW0sCi0JCQkJCQkJYmFzZUVsZW1lbnQpOwotCQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlFT2JqZWN0IHVtbE9iaiA9IG5vZGUuZ2V0RWxlbWVudCgpOwotCQkJCQkJQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uKChFTW9kZWxFbGVtZW50KSB1bWxPYmosCi0JCQkJCQkJCShNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvc2VydmljZXMvRGlhZ3JhbU1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvc2VydmljZXMvRGlhZ3JhbU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY2MzBiYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3NlcnZpY2VzL0RpYWdyYW1NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuZXZlbnRzLlJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uaW1wbC5JbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UuQWJzdHJhY3RFTUZPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS51dGlsLldvcmtzcGFjZVN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVycy5BY2Nlc3NpYmxlRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRmlsZVN5bmNocm9uaXplci5GaWxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLlR4VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLmludGVybmFsLklGYWlsU2FmZVNhdmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UudXRpbC5FeHRlbmRlZFJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS51dGlsLlN0cmluZ1N0YXRpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLkRpYWdyYW1FZGl0aW5nRG9tYWluRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5WaWV3U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmludGVybmFsLmwxMG4uRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmludGVybmFsLnV0aWwuRGlhZ3JhbUlPVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5pbnRlcm5hbC51dGlsLkVNRkNvcmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUucmVzb3VyY2VzLkdNRkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5yZXNvdXJjZXMuR01GUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUucmVzb3VyY2VzLkdNRlJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiAKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1NYW5hZ2VyIHsJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IERpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUFHUkFNX0ZJTEVOQU1FX1dJVEhPVVRfRVhURU5TSU9OID0gImRpYWdyYW0iOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUdSQU1fRklMRU5BTUUgPSBESUFHUkFNX0ZJTEVOQU1FX1dJVEhPVVRfRVhURU5TSU9OICsgTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxQcm9jZXNzLCBEaWFncmFtTWFuYWdlcj4gcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAgPSBuZXcgSGFzaE1hcDxQcm9jZXNzLCBEaWFncmFtTWFuYWdlcj4oKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lciBsaWJTdmNMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlU3luY2hyb25pemVyIGZpbGVTeW5jaHJvbml6ZXIgPSBuZXcgRmlsZVN5bmNocm9uaXplcigpIHsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uPElGaWxlPiBoYW5kbGVDaGFuZ2VkRmlsZXMoQ29sbGVjdGlvbjxJRmlsZT4gY2hhbmdlZEZpbGVzKSB7Ci0JCQl0cnkgewotCQkJCUNvbGxlY3Rpb248RGlhZ3JhbU1hbmFnZXI+IG1ncnMgPSBnZXREaWFncmFtTWFuYWdlcnMoKTsKLQkJCQlpZighbWdycy5pc0VtcHR5KCkpIHsKLQkJCQkJQ29sbGVjdGlvbjxJRmlsZT4gaGFuZGxlZEZpbGVzID0gbmV3IEFycmF5TGlzdDxJRmlsZT4oKTsKLQkJCQkJZm9yIChEaWFncmFtTWFuYWdlciBtZ3IgOiBtZ3JzKSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IG1nci5nZXRSZXNvdXJjZShmYWxzZSk7Ci0JCQkJCQlpZihyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobWdyLmdldFJlc291cmNlKCkpOwotCQkJCQkJCWlmKGNoYW5nZWRGaWxlcy5jb250YWlucyhmaWxlKSkgewotCQkJCQkJCQl0cnkgewkJCQkJCQkJCQotCQkJCQkJCQkJbWdyLnJlbG9hZCgpOwotCQkJCQkJCQkJaGFuZGxlZEZpbGVzLmFkZChmaWxlKTsKLQkJCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCQkJCWlmKERFQlVHKSB7Ci0JCQkJCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gaGFuZGxlZEZpbGVzOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWhhbmRsZUNvcmVFeGNlcHRpb24oZSwgZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIE1hcDxJRmlsZSwgSVBhdGg+IGhhbmRsZU1vdmVkRmlsZXMoTWFwPElGaWxlLCBJUGF0aD4gbW92ZWRGaWxlVG9OZXdQYXRoTWFwKSB7Ci0JCQlmb3IgKE1hcC5FbnRyeTxJRmlsZSwgSVBhdGg+IGVudHJ5IDogbW92ZWRGaWxlVG9OZXdQYXRoTWFwLmVudHJ5U2V0KCkpIHsKLQkJCQlJRmlsZSBpRmlsZSA9IGVudHJ5LmdldEtleSgpOwotCQkJCWlmKERJQUdSQU1fRklMRU5BTUUuZXF1YWxzKGlGaWxlLmdldE5hbWUoKSkpIHsKLQkJCQkJc3luY2hyb25pemVkIChwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcCkgewotCQkJCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gZ2V0RGlhZ3JhbU1hbmFnZXIoaUZpbGUpOwotCQkJCQkJaWYobWdyICE9IG51bGwpIHsKLQkJCQkJCQltZ3IudXBkYXRlUmVzb3VyY2VVUkkoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzdXBlci5oYW5kbGVNb3ZlZEZpbGVzKG1vdmVkRmlsZVRvTmV3UGF0aE1hcCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBoYW5kbGVEZWxldGVkRmlsZXMoQ29sbGVjdGlvbjxJRmlsZT4gZGVsZXRlZEZpbGVzKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQlyZXR1cm4gc3VwZXIuaGFuZGxlRGVsZXRlZEZpbGVzKGRlbGV0ZWRGaWxlcyk7Ci0JCX0KLQl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX2tpbmQgPSAiQUREIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURfa2luZCA9ICJBRCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdQRF9raW5kID0gIldQREQiOyAvLyROT04tTkxTLTEkCQotCQotCXByaXZhdGUgc3RhdGljIERpYWdyYW1NYW5hZ2VyIGdldERpYWdyYW1NYW5hZ2VyKElGaWxlIGlGaWxlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkuaGFzTmV4dCgpOykgewotCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gKERpYWdyYW1NYW5hZ2VyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihtZ3IucmVzb3VyY2UgIT0gbnVsbCAmJiBpRmlsZS5lcXVhbHMoV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobWdyLnJlc291cmNlKSkpIHsKLQkJCQlyZXR1cm4gbWdyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlzcG9zZURpYWdyYW1NYW5hZ2VycyhNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJc3luY2hyb25pemVkKHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPE1hcC5FbnRyeTxQcm9jZXNzLCBEaWFncmFtTWFuYWdlcj4+IGl0ZXJhdG9yID0gcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5PFByb2Nlc3MsIERpYWdyYW1NYW5hZ2VyPiBlbnRyeSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZihVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZW50cnkuZ2V0S2V5KCkpID09IGxpYnJhcnkpIHsKLQkJCQkJZW50cnkuZ2V0VmFsdWUoKS5kb0Rpc3Bvc2UoKTsKLQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHNldHVwTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpIHsKLQkJaWYobGliU3ZjTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJbGliU3ZjTGlzdGVuZXIgPSBuZXcgTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpIHsKLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCQlkaXNwb3NlRGlhZ3JhbU1hbmFnZXJzKGxpYnJhcnkpOwotCQkJCX0KLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJCWRpc3Bvc2VEaWFncmFtTWFuYWdlcnMobGlicmFyeSk7Ci0JCQkJfQotCQkJfTsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldHMgYSBpbnN0YW5jZSBvZiBEaWFncmFtTWFuYWdlciBmb3IgdGhlIHNwZWNpZmllZCBwcm9jZXNzLiBDYWxsZXIgbXVzdAotCSAqIHJlbGVhc2UgdGhlIHJldHVybmVkIERpYWdyYW1NYW5hZ2VyIGluc3RhbmNlIHdoZW4gaXQncyBubyBsb25nZXIgbmVlZGVkCi0JICogdXNpbmcge0BsaW5rICNyZW1vdmVDb25zdW1lcihPYmplY3QpfS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERpYWdyYW1NYW5hZ2VyIGdldEluc3RhbmNlKFByb2Nlc3MgcHJvY2VzcywgT2JqZWN0IGNvbnN1bWVyKSB7Ci0JCWlmKERFQlVHKSB7Ci0JCQlpZihwcm9jZXNzLmVJc1Byb3h5KCkpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIlByb2Nlc3MgaXMgYSBwcm94eTogIiArIHByb2Nlc3MpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJYXNzZXJ0IHByb2Nlc3MgIT0gbnVsbCAmJiBjb25zdW1lciAhPSBudWxsICYmICFwcm9jZXNzLmVJc1Byb3h5KCk7Ci0JCXNldHVwTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpOwotCQlEaWFncmFtTWFuYWdlciBtZ3IgPSAoRGlhZ3JhbU1hbmFnZXIpIHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLmdldChwcm9jZXNzKTsKLQkJaWYobWdyICE9IG51bGwgJiYgbWdyLmlzRGlzcG9zZWQoKSkgewotCQkJcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAucmVtb3ZlKHByb2Nlc3MpOwotCQkJbWdyID0gbnVsbDsKLQkJfQotCQlpZihtZ3IgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkKHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwKSB7Ci0JCQkJbWdyID0gKERpYWdyYW1NYW5hZ2VyKSBwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC5nZXQocHJvY2Vzcyk7Ci0JCQkJaWYobWdyID09IG51bGwpIHsKLQkJCQkJbWdyID0gbmV3IERpYWdyYW1NYW5hZ2VyKHByb2Nlc3MpOwotCQkJCQlwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC5wdXQocHJvY2VzcywgbWdyKTsKLQkJCQkJaWYoIWZpbGVTeW5jaHJvbml6ZXIuZklzSW5zdGFsbGVkKSB7Ci0JCQkJCQlmaWxlU3luY2hyb25pemVyLmluc3RhbGwoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0JCQkKLQkJfQotCQltZ3IuYWRkQ29uc3VtZXIoY29uc3VtZXIpOwotCQlyZXR1cm4gbWdyOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgYW4gZGlhZ3JhbSBtYW5hZ2VyIGZvciB0aGUgZ2l2ZW4gcHJvY2VzcyBhbHJlYWR5IGV4aXN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaGFzRGlhZ3JhbU1hbmFnZXIoUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCXJldHVybiBwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC5jb250YWluc0tleShwcm9jZXNzKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRpc3Bvc2VEaWFncmFtTWFuYWdlcihQcm9jZXNzIHByb2Nlc3MpIHsKLQkJc3luY2hyb25pemVkIChwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcCkgewotCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAuZ2V0KHByb2Nlc3MpOwotCQkJaWYobWdyICE9IG51bGwpIHsKLQkJCQltZ3IuZG9EaXNwb3NlKCk7Ci0JCQkJcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAucmVtb3ZlKHByb2Nlc3MpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxEaWFncmFtTWFuYWdlcj4gZ2V0RGlhZ3JhbU1hbmFnZXJzKCkgewotCQlBcnJheUxpc3Q8RGlhZ3JhbU1hbmFnZXI+IG1ncnM7Ci0JCXN5bmNocm9uaXplZChwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcCkgewotCQkJbWdycyA9IG5ldyBBcnJheUxpc3Q8RGlhZ3JhbU1hbmFnZXI+KHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLnZhbHVlcygpKTsKLQkJfQotCQlyZXR1cm4gbWdycy5pc0VtcHR5KCkgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogbWdyczsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBHTUZSZXNvdXJjZUV4IGV4dGVuZHMgR01GUmVzb3VyY2UgaW1wbGVtZW50cyBJRmFpbFNhZmVTYXZhYmxlIHsKLQotCQlwcml2YXRlIEZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIgZmFpbFNhZmVQZXJzaXN0ZW5jZUhlbHBlcjsKLQotCQlwdWJsaWMgR01GUmVzb3VyY2VFeChVUkkgdXJpKSB7Ci0JCQlzdXBlcih1cmkpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFhNTEhlbHBlciBjcmVhdGVYTUxIZWxwZXIoKSB7CQkJCQkKLQkJCXJldHVybiBuZXcgR01GSGVscGVyKHRoaXMpIHsKLQkJCQkKLQkJCQlwcm90ZWN0ZWQgVVJJIGdldEhSRUYoUmVzb3VyY2Ugb3RoZXJSZXNvdXJjZSwgRU9iamVjdCBvYmopIHsKLQkJCQkJaWYob3RoZXJSZXNvdXJjZSBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2UpIHsKLQkJCQkJCXJldHVybiAoKElMaWJyYXJ5UmVzb3VyY2Upb3RoZXJSZXNvdXJjZSkuZ2V0UHJveHlVUkkob2JqKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0SFJFRihvdGhlclJlc291cmNlLCBvYmopOwotCQkJCX0KLQkJCQkKLQkJCX07Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZUluZm8oKSB7Ci0JCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUodGhpcyk7Ci0JCQlpZihEaWFncmFtTWFuYWdlci50aGlzLnJlc291cmNlSXNOZXcpIHsKLQkJCQlEaWFncmFtTWFuYWdlci50aGlzLnJlc291cmNlSXNOZXcgPSBmYWxzZTsKLQkJCQlmaWxlU3luY2hyb25pemVyLm1vbml0b3IoZmlsZSk7Ci0JCQl9Ci0JCQlmaWxlU3luY2hyb25pemVyLnVwZGF0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGUpOwotCQkJdHJ5IHsKLQkJCQlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc2F2ZShNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXN1cGVyLnNhdmUob3B0aW9ucyk7Ci0JCQlpZighaGFzVGVtcFVSSSgpKSB7Ci0JCQkJdXBkYXRlSW5mbygpOwotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIEFkYXB0ZXIgc3VwZXJDcmVhdGVNb2RpZmljYXRpb25BZGFwdGVyKCkgewotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZU1vZGlmaWNhdGlvblRyYWNraW5nQWRhcHRlcigpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEFkYXB0ZXIgY3JlYXRlTW9kaWZpY2F0aW9uVHJhY2tpbmdBZGFwdGVyKCkgewotCQkJcmV0dXJuIG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCQlwcml2YXRlIEFkYXB0ZXIgZGVsZWdhdGUgPSBzdXBlckNyZWF0ZU1vZGlmaWNhdGlvbkFkYXB0ZXIoKTsKLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCQkJZGVsZWdhdGUubm90aWZ5Q2hhbmdlZChtc2cpOwotCQkJCQlub3RpZnlEaWFncmFtQ2hhbmdlTGlzdGVuZXJzKG1zZyk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIERvbid0IG5vdGlmeSBEaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXIgYWJvdXQgcmVzb3VyY2UgbW9kaWZpY2F0aW9uIGV2ZW50IGJ1dCByYXRoZXIKLQkJICogbGV0IHtAbGluayAjbm90aWZ5RGlhZ3JhbUNoYW5nZUxpc3RlbmVycyhOb3RpZmljYXRpb24pIGhhbmRsZSBpdC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBlTm90aWZ5KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCWlmKGlzTG9hZGVkKCkgJiYgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBSZXNvdXJjZSAKLQkJCQkJJiYgbm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSZXNvdXJjZS5jbGFzcykgPT0gUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX01PRElGSUVECi0JCQkJCSYmIG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUKSB7Ci0JCQkJaWYgKGVBZGFwdGVycyAhPSBudWxsICYmIGVEZWxpdmVyKCkpCi0JCQkJewotCQkJCQlpbnQgc2l6ZSA9IGVBZGFwdGVycy5zaXplKCk7Ci0JCQkJCWlmIChzaXplID4gMCkKLQkJCQkJewotCQkJCQkJQWRhcHRlciBbXSBhZGFwdGVycyA9IChBZGFwdGVyIFtdKWVBZGFwdGVycy5kYXRhKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkKLQkJCQkJCXsKLQkJCQkJCQlBZGFwdGVyIGFkYXB0ZXIgPSBhZGFwdGVyc1tpXTsKLQkJCQkJCQlpZighKGFkYXB0ZXIgaW5zdGFuY2VvZiBBY2Nlc3NpYmxlRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyKSkgewotCQkJCQkJCQlhZGFwdGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdXBlci5lTm90aWZ5KG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlEaWFncmFtQ2hhbmdlTGlzdGVuZXJzKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCUJhc2ljRUxpc3Q8QWRhcHRlcj4gZUFkYXB0ZXJzID0gZUJhc2ljQWRhcHRlcnMoKTsKLQkJCWlmIChlQWRhcHRlcnMgIT0gbnVsbCAmJiBlRGVsaXZlcigpKQotCQkJewotCQkJCWludCBzaXplID0gZUFkYXB0ZXJzLnNpemUoKTsKLQkJCQlpZiAoc2l6ZSA+IDApCi0JCQkJewotCQkJCQlBZGFwdGVyIFtdIGFkYXB0ZXJzID0gKEFkYXB0ZXIgW10pZUFkYXB0ZXJzLmRhdGEoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpCi0JCQkJCXsKLQkJCQkJCUFkYXB0ZXIgYWRhcHRlciA9IGFkYXB0ZXJzW2ldOwotCQkJCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEFjY2Vzc2libGVEaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXIpIHsKLQkJCQkJCQlhZGFwdGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSBGYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyIGdldEZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIoKSB7Ci0JCQlpZihmYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyID09IG51bGwpIHsKLQkJCQkvLyBpZCBmb3JtYXQ6IDxwcm9jZXNzX2d1aWQ+ZGlhZ3JhbQotCQkJCVN0cmluZyBpZCA9IERpYWdyYW1NYW5hZ2VyLnRoaXMucHJvY2Vzcy5nZXRHdWlkKCkgKyBESUFHUkFNX0ZJTEVOQU1FX1dJVEhPVVRfRVhURU5TSU9OOwotCQkJCWZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIgPSBuZXcgRmFpbFNhZmVQZXJzaXN0ZW5jZUhlbHBlcih0aGlzLCBpZCk7Ci0JCQkJZmFpbFNhZmVQZXJzaXN0ZW5jZUhlbHBlci5zZXRDb21taXRFbXB0eVJlc291cmNlKHRydWUpOwotCQkJfQotCQkJcmV0dXJuIGZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXI7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjb21taXQoKSB7Ci0JCQlnZXRGYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyKCkuY29tbWl0KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkZWxldGVCYWNrdXAoKSB7Ci0JCQlnZXRGYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyKCkuZGVsZXRlQmFja3VwKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNUZW1wVVJJKCkgewotCQkJcmV0dXJuIGdldEZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIoKS5oYXNUZW1wVVJJKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiByZXN0b3JlKCkgewotCQkJcmV0dXJuIGdldEZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIoKS5yZXN0b3JlKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRUeElEKFN0cmluZyB0eElEKSB7Ci0JCQlnZXRGYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyKCkuc2V0VGVtcFVSSSh0eElEKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHR4RmluaXNoZWQoYm9vbGVhbiBzdWNjZXNzZnVsKSB7Ci0JCQlnZXRGYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyKCkudHhGaW5pc2hlZChzdWNjZXNzZnVsKTsKLQkJCWlmKHN1Y2Nlc3NmdWwpIHsKLQkJCQl1cGRhdGVJbmZvKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBkb1VubG9hZCgpIHsKLQkJCXN1cGVyLmRvVW5sb2FkKCk7Ci0JCQkKLQkJICAgIEl0ZXJhdG9yPEVPYmplY3Q+IGFsbENvbnRlbnRzID0gZ2V0QWxsUHJvcGVyQ29udGVudHModW5sb2FkaW5nQ29udGVudHMpOwotCQkgICAgTGlzdDxFT2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxFT2JqZWN0PigpOwotCQkJd2hpbGUgKGFsbENvbnRlbnRzLmhhc05leHQoKSkgewotCQkJCWxpc3QuYWRkKGFsbENvbnRlbnRzLm5leHQoKSk7Ci0JCQl9Ci0JCQlmb3IgKEVPYmplY3Qgb2JqZWN0IDogbGlzdCkgewotCQkJCUVjb3JlVXRpbC5yZW1vdmUob2JqZWN0KTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBHTUZFeHRlbmRlZFJlc291cmNlU2V0IGV4dGVuZHMgRXh0ZW5kZWRSZXNvdXJjZVNldCB7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgaW50IGdldFVSSVR5cGUoVVJJIHVyaSkgewotCQkJaWYoTXVsdGlGaWxlVVJJQ29udmVydGVyLlNDSEVNRS5lcXVhbHModXJpLnNjaGVtZSgpKSkgewotCQkJCXJldHVybiBVUklfVFlQRV9FWFRFUk5BTDsKLQkJCX0KLQkJCWlmKERJQUdSQU1fRklMRU5BTUUuZXF1YWxzKHVyaS5sYXN0U2VnbWVudCgpKSkgewotCQkJCXJldHVybiBVUklfVFlQRV9MT0NBTDsKLQkJCX0KLQkJCXJldHVybiBVUklfVFlQRV9FWFRFUk5BTDsKLSAJCX0KLQkJCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJCVhNSVJlc291cmNlIHJlc291cmNlID0gbmV3IEdNRlJlc291cmNlRXgodXJpKTsKLQotCQkJcmVzb3VyY2UuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0QWxsKEdNRlJlc291cmNlRmFjdG9yeS5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKSk7Ci0JCQlyZXNvdXJjZS5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXRBbGwoR01GUmVzb3VyY2VGYWN0b3J5LmdldERlZmF1bHRTYXZlT3B0aW9ucygpKTsKLQotCQkJaWYgKCFyZXNvdXJjZS5nZXRFbmNvZGluZygpLmVxdWFscyhFTUZDb3JlQ29uc3RhbnRzLlhNSV9FTkNPRElORykpCi0JCQkJcmVzb3VyY2Uuc2V0RW5jb2RpbmcoRU1GQ29yZUNvbnN0YW50cy5YTUlfRU5DT0RJTkcpOwotCi0JCQlnZXRSZXNvdXJjZXMoKS5hZGQocmVzb3VyY2UpOwotCQkJCi0JCQlyZXR1cm4gcmVzb3VyY2U7Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogUmVmZXJlbmNlIGNvdW50IHRvIHRoaXMgZGlhZ3JhbSBtYW5hZ2VyCi0JICovCi0JcHJpdmF0ZSBQcm9jZXNzIHByb2Nlc3M7Ci0JCi0JcHJpdmF0ZSBSZXNvdXJjZSByZXNvdXJjZTsKLQkKLQlwcml2YXRlIEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKLQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCi0JcHJpdmF0ZSBib29sZWFuIHJlc291cmNlSXNOZXc7Ci0JCi0JcHJpdmF0ZSBMaXN0PElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyPiByZXNvdXJjZUNoYW5nZUxpc3RlbmVycyA9IG5ldyBVbmlxdWVFTGlzdDxJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcj4oKTsKLQotCXByaXZhdGUgRXh0ZW5kZWRSZXNvdXJjZVNldCByZXNvdXJjZVNldDsKLQotCXByaXZhdGUgSGFzaE1hcDxBY3Rpdml0eSwgTWFwPFN0cmluZywgRGlhZ3JhbT4+IGFjdGl2aXR5VG9TYXZlZERpYWdyYW1NYXA7IAotCQotCXByb3RlY3RlZCBVbmlxdWVFTGlzdDxPYmplY3Q+IGNvbnN1bWVycyA9IG5ldyBVbmlxdWVFTGlzdDxPYmplY3Q+KCk7Ci0JCi0JcHJpdmF0ZSBEaWFncmFtTWFuYWdlcihQcm9jZXNzIHByb2Nlc3MpIHsKLQkJdGhpcy5wcm9jZXNzID0gcHJvY2VzczsKLQl9Ci0JCi0JcHVibGljIFByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYoIXJlc291cmNlQ2hhbmdlTGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXJlc291cmNlQ2hhbmdlTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhZGRDb25zdW1lcihPYmplY3QgY29uc3VtZXIpIHsKLQkJcmV0dXJuIGNvbnN1bWVycy5hZGQoY29uc3VtZXIpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBjb25zdW1lciBmcm9tIHRoZSBjb25zdW1lciBsaXN0IG9mIHRoaXMgZGlhZ3JhbSBtYW5hZ2VyLiBVbmxvYWQKLQkgKiB0aGlzIGRpYWdyYW0gbWFuYWdlciBpZiBpdCBkb2VzIG5vdCBoYXZlIGFueSBtb3JlIGNvbnN1bWVyIGFmdGVyIHRoaXMgY2FsbC4gCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlbW92ZUNvbnN1bWVyKE9iamVjdCBjb25zdW1lcikgewotCQlib29sZWFuIHJldCA9IGNvbnN1bWVycy5yZW1vdmUoY29uc3VtZXIpOwotCQlpZihyZXQgJiYgY29uc3VtZXJzLmlzRW1wdHkoKSkgewotCQkJc3luY2hyb25pemVkKHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwKSB7Ci0JCQkJcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAucmVtb3ZlKHByb2Nlc3MpOwotCQkJCWlmKHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLmlzRW1wdHkoKSkgewotCQkJCQlmaWxlU3luY2hyb25pemVyLnVuaW5zdGFsbCgpOwotCQkJCX0KLQkJCX0KLQkJCWRvRGlzcG9zZSgpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTmV3UmVzb3VyY2UoKSB7Ci0JCXJldHVybiByZXNvdXJjZUlzTmV3OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUlzTmV3KGJvb2xlYW4gcmVzb3VyY2VJc05ldykgewotCQl0aGlzLnJlc291cmNlSXNOZXcgPSByZXNvdXJjZUlzTmV3OwotCX0KLQkKLQlwdWJsaWMgSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotCQlpZiAoZWRpdGluZ0RvbWFpbiA9PSBudWxsICYmICFpc0Rpc3Bvc2VkKCkpIHsKLQkJCWVkaXRpbmdEb21haW4gPSBjcmVhdGVFZGl0aW5nRG9tYWluKCk7Ci0JCQlyZXNvdXJjZVNldCA9IChFeHRlbmRlZFJlc291cmNlU2V0KSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCk7Ci0JCX0KLQkJcmV0dXJuIGVkaXRpbmdEb21haW47Ci0JfQotCQotCXByaXZhdGUgSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBjcmVhdGVFZGl0aW5nRG9tYWluKCkgewotCQlHTUZFeHRlbmRlZFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IEdNRkV4dGVuZGVkUmVzb3VyY2VTZXQoKTsKLQkJcmVzb3VyY2VTZXQuYWRkKHByb2Nlc3MuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCXJldHVybiAoSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbikgRGlhZ3JhbUVkaXRpbmdEb21haW5GYWN0b3J5LmdldEluc3RhbmNlKCkKLQkJCQkuY3JlYXRlRWRpdGluZ0RvbWFpbihyZXNvdXJjZVNldCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkb0Rpc3Bvc2UoKSB7Ci0JCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShyZXNvdXJjZSk7Ci0JCQlpZihmaWxlICE9IG51bGwpIHsKLQkJCQlmaWxlU3luY2hyb25pemVyLnVubW9uaXRvcihmaWxlKTsJCQkJCi0JCQl9Ci0JCQlyZXNvdXJjZSA9IG51bGw7Ci0JCX0KLQotCQlyZXNvdXJjZUNoYW5nZUxpc3RlbmVycy5jbGVhcigpOwotCQkKLQkJaWYoZWRpdGluZ0RvbWFpbiAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZVNldC5kaXNwb3NlKCk7Ci0JCQlyZXNvdXJjZVNldCA9IG51bGw7Ci0KLQkJCWVkaXRpbmdEb21haW4uZGlzcG9zZSgpOwotCQkJZWRpdGluZ0RvbWFpbiA9IG51bGw7CQkJCi0JCX0JCi0JCQotCQljb25zdW1lcnMuY2xlYXIoKTsKLQkJCi0JCWlmKGFjdGl2aXR5VG9TYXZlZERpYWdyYW1NYXAgIT0gbnVsbCkgewotCQkJYWN0aXZpdHlUb1NhdmVkRGlhZ3JhbU1hcC5jbGVhcigpOwotCQl9Ci0JCQotCQlwcm9jZXNzID0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3luY2hyb25pemVkIChwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcCkgewotCQkJcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAucmVtb3ZlKHByb2Nlc3MpOwotCQl9Ci0JCWRvRGlzcG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc3Bvc2VkKCkgewotCQlyZXR1cm4gcHJvY2VzcyA9PSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGRpYWdyYW1zIG9mIHRoZSBnaXZlbiB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIGFjdGl2aXR5Ci0JICogPGNvZGU+YWN0PC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBhY3QKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25zdGFudHM6Ci0JICogICAgICAgICAgICB7QGxpbmsgSURpYWdyYW1NYW5hZ2VyI0FDVElWSVRZX0RJQUdSQU19LAotCSAqICAgICAgICAgICAge0BsaW5rIElEaWFncmFtTWFuYWdlciNBQ1RJVklUWV9ERVRBSUxfRElBR1JBTX0sCi0JICogICAgICAgICAgICB7QGxpbmsgSURpYWdyYW1NYW5hZ2VyI1dPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU19Ci0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBMaXN0PERpYWdyYW0+IGdldERpYWdyYW1zKEFjdGl2aXR5IGFjdCwgaW50IHR5cGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJY2hlY2tBY3Rpdml0eShhY3QpOwotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKGZhbHNlKTsKLQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJQXJyYXlMaXN0PERpYWdyYW0+IGRpYWdyYW1zID0gbmV3IEFycmF5TGlzdDxEaWFncmFtPigpOwotCQkJZm9yIChFT2JqZWN0IG8gOiByZXNvdXJjZS5nZXRDb250ZW50cygpKSB7Ci0JCQkJaWYobyBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIG87Ci0JCQkJCVN0cmluZyB0eXBlU3RyID0gZ2V0RGlhZ3JhbVR5cGVTdHJpbmcodHlwZSk7Ci0JCQkJCWlmKHR5cGVTdHIuZXF1YWxzKGRpYWdyYW0uZ2V0VHlwZSgpKSAmJiBpc0RpYWdyYW1PZihkaWFncmFtLCBhY3QpKSB7Ci0JCQkJCQlFT2JqZWN0IG1vZGVsID0gZGlhZ3JhbS5nZXRFbGVtZW50KCk7Ci0JCQkJCQlpZihtb2RlbCBpbnN0YW5jZW9mIERpYWdyYW1JbXBsKSB7Ci0JCQkJCQkJLy8gZGlzYWJsZSBjcmVhdGlvbiBvZiBVTUEgZ3JhcGhpY2FsIGRhdGEKLQkJCQkJCQkvLwotCQkJCQkJCSgoRGlhZ3JhbUltcGwpbW9kZWwpLnNldEdyYXBoaWNhbERhdGFSZXF1aXJlZChmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCQlkaWFncmFtcy5hZGQoZGlhZ3JhbSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZighZGlhZ3JhbXMuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuIGRpYWdyYW1zOwotCQkJfQotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBtYXJrSW5oZXJpdGVkKERpYWdyYW0gZGlhZ3JhbSkgewotCQlMaXN0PD8+IGNoaWxkcmVuID0gZGlhZ3JhbS5nZXRDaGlsZHJlbigpOwotCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsJCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJVmlldyB2aWV3ID0gKFZpZXcpIGNoaWxkcmVuLmdldChpKTsKLQkJCUJyaWRnZUhlbHBlci5tYXJrSW5oZXJpdGVkKHZpZXcpOwotCQl9Ci0JCWZvciAoT2JqZWN0IGVkZ2UgOiBkaWFncmFtLmdldEVkZ2VzKCkpIHsKLQkJCUJyaWRnZUhlbHBlci5tYXJrSW5oZXJpdGVkKChWaWV3KSBlZGdlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGVTdHJpbmcoaW50IGRpYWdyYW1UeXBlKSB7Ci0JCXN3aXRjaChkaWFncmFtVHlwZSkgewotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCXJldHVybiBBRERfa2luZDsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCXJldHVybiBBRF9raW5kOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJcmV0dXJuIFdQRF9raW5kOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGludCBnZXREaWFncmFtVHlwZShTdHJpbmcgdHlwZVN0cikgewotCQlpZihBRF9raW5kLmVxdWFscyh0eXBlU3RyKSkgewotCQkJcmV0dXJuIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOwkJCQotCQl9Ci0JCWVsc2UgaWYoQUREX2tpbmQuZXF1YWxzKHR5cGVTdHIpKSB7Ci0JCQlyZXR1cm4gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOwkJCQotCQl9Ci0JCWVsc2UgaWYoV1BEX2tpbmQuZXF1YWxzKHR5cGVTdHIpKSB7Ci0JCQlyZXR1cm4gSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU07Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQkKLQkvKioKLQkgKiBBc3NvY2lhdGVzIGEgbmV3IGRpYWdyYW0gd2l0aCB0aGUgZ2l2ZW4gYWN0aXZpdHkKLQkgKiAKLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIAotCSAqLwotCXB1YmxpYyB2b2lkIGFzc29jaWF0ZShEaWFncmFtIG5ld0RpYWdyYW0sIGludCB0eXBlLCBBY3Rpdml0eSBhY3Rpdml0eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzd2l0Y2godHlwZSkgewotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJYXNzb2NpYXRlQUQobmV3RGlhZ3JhbSwgYWN0aXZpdHkpOwotCQkJcmV0dXJuOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCWFzc29jaWF0ZUFERChuZXdEaWFncmFtLCBhY3Rpdml0eSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQlhc3NvY2lhdGVXUEQobmV3RGlhZ3JhbSwgYWN0aXZpdHkpOwkKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYXNzb2NpYXRlV1BEKERpYWdyYW0gY29weSwgQWN0aXZpdHkgYWN0aXZpdHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyAtIGNvbnNvbGlkYXRlIG9uZSBtZXRob2Qgd2l0aCBBREQuCi0JCWlmKGNvcHkuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSkgewotCQkJKChXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKWNvcHkuZ2V0RWxlbWVudCgpKS5zZXRMaW5rZWRFbGVtZW50KGFjdGl2aXR5KTsKLQkJCSgoRGlhZ3JhbUltcGwpY29weS5nZXRFbGVtZW50KCkpLnNldEdyYXBoaWNhbERhdGFSZXF1aXJlZChmYWxzZSk7Ci0JCX0KLQkJZ2V0UmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmFkZChjb3B5LmdldEVsZW1lbnQoKSk7Ci0JCWdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5hZGQoY29weSk7CQotCX0KLQotCXByaXZhdGUgdm9pZCBhc3NvY2lhdGVBRChEaWFncmFtIGNvcHksIEFjdGl2aXR5IGFjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZihjb3B5LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEVNb2RlbEVsZW1lbnQpIHsKLQkJCUJyaWRnZUhlbHBlci5hc3NvY2lhdGUoKEVNb2RlbEVsZW1lbnQpIGNvcHkuZ2V0RWxlbWVudCgpLCBhY3QpOwotCQl9Ci0JCWdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5hZGQoY29weS5nZXRFbGVtZW50KCkpOwotCQlnZXRSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkuYWRkKGNvcHkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYXNzb2NpYXRlQUREKERpYWdyYW0gY29weSwgQWN0aXZpdHkgYWN0aXZpdHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYoY29weS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJCSgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKWNvcHkuZ2V0RWxlbWVudCgpKS5zZXRMaW5rZWRFbGVtZW50KGFjdGl2aXR5KTsKLQkJCSgoRGlhZ3JhbUltcGwpY29weS5nZXRFbGVtZW50KCkpLnNldEdyYXBoaWNhbERhdGFSZXF1aXJlZChmYWxzZSk7Ci0JCX0KLQkJZ2V0UmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmFkZChjb3B5LmdldEVsZW1lbnQoKSk7Ci0JCWdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5hZGQoY29weSk7CQkKLQl9Ci0JCi0JcHJpdmF0ZSBEaWFncmFtIGNvcHlEaWFncmFtKERpYWdyYW0gZGlhZ3JhbSwgQWN0aXZpdHkgdGFyZ2V0QWN0aXZpdHkpIHsKLQkJRGlhZ3JhbSBjb3B5ID0gRGlhZ3JhbUhlbHBlci5jb3B5RGlhZ3JhbShnZXRFZGl0aW5nRG9tYWluKCksIGRpYWdyYW0pOwotCQlEaWFncmFtSGVscGVyLnJlYXNzb2NpYXRlKHRhcmdldEFjdGl2aXR5LCBjb3B5KTsKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JcHVibGljIERpYWdyYW0gY3JlYXRlRGlhZ3JhbShmaW5hbCBBY3Rpdml0eSBhY3QsIGZpbmFsIGludCB0eXBlLCBmaW5hbCBQcmVmZXJlbmNlc0hpbnQgaGludCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQljaGVja0FjdGl2aXR5KGFjdCk7Ci0JCS8vIGNoZWNrIGlmIHRoaXMgYWN0aXZpdHkgY29udHJpYnV0ZXMvZXh0ZW5kcyBvdGhlciBhY3Rpdml0eSBhbmQgdHJ5Ci0JCS8vIGNvcHkKLQkJLy8gdGhlIGV4aXN0aW5nIGRpYWdyYW0gZnJvbSB0aGUgYmFzZQotCQkvLwotCQlpZiAoUHJvY2Vzc1V0aWwuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoYWN0KSkgewotCQkJQWN0aXZpdHkgYmFzZUFjdCA9IChBY3Rpdml0eSkgYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCURpYWdyYW1NYW5hZ2VyIG1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhiYXNlQWN0KSwgdGhpcyk7Ci0JCQl0cnkgewotCQkJCUxpc3QgYmFzZURpYWdyYW1zID0gbWdyLmdldERpYWdyYW1zKGJhc2VBY3QsIHR5cGUpOwotCQkJCWlmKCFiYXNlRGlhZ3JhbXMuaXNFbXB0eSgpKSB7Ci0JCQkJCURpYWdyYW0gYmFzZURpYWdyYW0gPSAoRGlhZ3JhbSkgYmFzZURpYWdyYW1zLmdldCgwKTsKLQkJCQkJaWYgKGJhc2VEaWFncmFtICE9IG51bGwpIHsKLQkJCQkJCWZpbmFsIERpYWdyYW0gY29weSA9IGNvcHlEaWFncmFtKGJhc2VEaWFncmFtLCBhY3QpOwotCQkJCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCW1hcmtJbmhlcml0ZWQoY29weSk7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlhc3NvY2lhdGUoY29weSwgdHlwZSwgYWN0KTsKLQkJCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIGNvcHk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJFcnJvciBpbiByZXRyaWV2aW5nIGJhc2UgZGlhZ3JhbTogIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmKG1nciAhPSBudWxsKSB7Ci0JCQkJCW1nci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCQkKLQkJCi0JCWZpbmFsIERpYWdyYW1bXSByZXN1bHRIb2xkZXIgPSBuZXcgRGlhZ3JhbVsxXTsKLQkJdHJ5IHsKLQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGdldEVkaXRpbmdEb21haW4oKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJcmVzdWx0SG9sZGVyWzBdID0gZG9DcmVhdGVEaWFncmFtKGFjdCwgdHlwZSwgaGludCk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCWlmKERFQlVHKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0SG9sZGVyWzBdOwotCX0KLQkKLQlwcml2YXRlIERpYWdyYW0gZG9DcmVhdGVEaWFncmFtKEFjdGl2aXR5IGFjdCwgaW50IHR5cGUsIFByZWZlcmVuY2VzSGludCBoaW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN3aXRjaCh0eXBlKSB7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlyZXR1cm4gY3JlYXRlQUQoYWN0LCBoaW50KTsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQlyZXR1cm4gY3JlYXRlQUREKGFjdCwgaGludCk7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQlyZXR1cm4gY3JlYXRlV1BERChhY3QsIGhpbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgRGlhZ3JhbSBjcmVhdGVXUEREKEFjdGl2aXR5IGFjdCwgUHJlZmVyZW5jZXNIaW50IGhpbnQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFByb2Nlc3NQYWNrYWdlIG1vZGVsID0gKFByb2Nlc3NQYWNrYWdlKSBhY3QuZUNvbnRhaW5lcigpOwotCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIG1vZGVsID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIERpYWdyYW1JbXBsKSB7Ci0JCQkvLyBkaXNhYmxlIGNyZWF0aW9uIG9mIFVNQSBncmFwaGljYWwgZGF0YQotCQkJLy8KLQkJCSgoRGlhZ3JhbUltcGwpIG1vZGVsKS5zZXRHcmFwaGljYWxEYXRhUmVxdWlyZWQoZmFsc2UpOwotCQl9Ci0JCW1vZGVsLnNldE5ldyh0cnVlKTsKLQkJRGlhZ3JhbSBkaWFncmFtID0gVmlld1NlcnZpY2UKLQkJCQkuY3JlYXRlRGlhZ3JhbSgKLQkJCQkJCW1vZGVsLAotCQkJCQkJZ2V0RGlhZ3JhbVR5cGVTdHJpbmcoSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0pLAotCQkJCQkJaGludCk7Ci0JCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCWRpYWdyYW0uc2V0TmFtZShhY3QuZ2V0TmFtZSgpKTsKLQkJCW1vZGVsLnNldExpbmtlZEVsZW1lbnQoYWN0KTsKLQkJCWdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5hZGQobW9kZWwpOwotCQkJZ2V0UmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtKTsKLQotCQkJLy8gYWRkIFJlc291cmNlRG9tYWluTGluayB0byB0aGUgbWV0aG9kIGxpYnJhcnkgcmVzb3VyY2Ugc2V0Ci0JCQkvLwotCQkJLy8gRWNvcmVVdGlsLmdldEFkYXB0ZXIoZ2V0UmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLAotCQkJLy8gUmVzb3VyY2VEbykKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQlwcml2YXRlIERpYWdyYW0gY3JlYXRlQUREKEFjdGl2aXR5IGFjdCwgUHJlZmVyZW5jZXNIaW50IGhpbnQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBtb2RlbCA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQWN0aXZpdHlEZXRhaWxEaWFncmFtKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIERpYWdyYW1JbXBsKSB7Ci0JCQkvLyBkaXNhYmxlIGNyZWF0aW9uIG9mIFVNQSBncmFwaGljYWwgZGF0YQotCQkJLy8KLQkJCSgoRGlhZ3JhbUltcGwpIG1vZGVsKS5zZXRHcmFwaGljYWxEYXRhUmVxdWlyZWQoZmFsc2UpOwotCQl9Ci0JCW1vZGVsLnNldE5ldyh0cnVlKTsKLQkJRGlhZ3JhbSBkaWFncmFtID0gVmlld1NlcnZpY2UuY3JlYXRlRGlhZ3JhbShtb2RlbCwKLQkJCQlnZXREaWFncmFtVHlwZVN0cmluZyhJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pLAotCQkJCWhpbnQpOwotCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQltb2RlbC5zZXRMaW5rZWRFbGVtZW50KGFjdCk7Ci0JCQlkaWFncmFtLnNldE5hbWUoYWN0LmdldE5hbWUoKSk7Ci0JCQlnZXRSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkuYWRkKG1vZGVsKTsKLQkJCWdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JcHJpdmF0ZSBEaWFncmFtIGNyZWF0ZUFEKEFjdGl2aXR5IGFjdCwgUHJlZmVyZW5jZXNIaW50IGhpbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkgbW9kZWwgPSBVTUxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVBY3Rpdml0eSgpOwotCQlEaWFncmFtIGRpYWdyYW0gPSBWaWV3U2VydmljZS5jcmVhdGVEaWFncmFtKG1vZGVsLAotCQkJCWdldERpYWdyYW1UeXBlU3RyaW5nKElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKSwgaGludCk7Ci0JCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCUJyaWRnZUhlbHBlci5hc3NvY2lhdGUobW9kZWwsIGFjdCk7Ci0JCQlkaWFncmFtLnNldE5hbWUoYWN0LmdldE5hbWUoKSk7Ci0JCQltb2RlbC5zZXROYW1lKGFjdC5nZXROYW1lKCkpOwotCQkJZ2V0UmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmFkZChtb2RlbCk7Ci0JCQlnZXRSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0pOwotCQl9Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBnZXRNb25pdG9yKCkgewotCQlpZihtb25pdG9yID09IG51bGwpIHsKLQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JCXJldHVybiBtb25pdG9yOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREaWFncmFtRmlsZVBhdGgoUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCXRyeSB7Ci0JCQlQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wID0gKFByb2Nlc3NDb21wb25lbnQpIHByb2Nlc3MuZUNvbnRhaW5lcigpOwotCQkJaWYocHJvY0NvbXAgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJaWYoVW1hVXRpbC5oYXNEaXJlY3RSZXNvdXJjZShwcm9jQ29tcCkpIHsKLQkJCQkvLyBleGlzdGluZyBwcm9jZXNzCi0JCQkJLy8KLQkJCQlyZXR1cm4gbmV3IEZpbGUobmV3IEZpbGUoRmlsZU1hbmFnZXIudG9GaWxlU3RyaW5nKHByb2Nlc3MuZVJlc291cmNlKCkuZ2V0VVJJKCkpKS5nZXRQYXJlbnRGaWxlKCksIERJQUdSQU1fRklMRU5BTUUpLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG5ldyBwcm9jZXNzIHRoYXQgaGFzIG5vdCBiZWVuIHNhdmVkIHlldAotCQkJCS8vCi0JCQkJVVJJIHVyaSA9IE11bHRpRmlsZVNhdmVVdGlsLmNyZWF0ZVVSSShwcm9jQ29tcCwgcHJvY0NvbXAuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQkJcmV0dXJuIG5ldyBGaWxlKG5ldyBGaWxlKHVyaS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50RmlsZSgpLAotCQkJCQkJCQlESUFHUkFNX0ZJTEVOQU1FKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHJlbG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmKHJlc291cmNlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlyZXNvdXJjZS51bmxvYWQoKTsKLQkJcmVzb3VyY2UubG9hZChDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUocmVzb3VyY2UpOwotCQlmaWxlU3luY2hyb25pemVyLnVwZGF0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGUpOwotCQlub3RpZnlSZWxvYWRlZCgpOwotCX0KLQkKLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmKHJlc291cmNlID09IG51bGwpIHsKLQkJCXJlc291cmNlID0gZ2V0UmVzb3VyY2UodHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgVVJJIGNyZWF0ZURpYWdyYW1SZXNvdXJjZVVSSShTdHJpbmcgcGF0aCkgewotCQlJRmlsZSBkaWFncmFtRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKHBhdGgpKTsKLQkJcmV0dXJuIFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGRpYWdyYW1GaWxlCi0JCQkJLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlIGxvYWREaWFncmFtUmVzb3VyY2UoSUZpbGUgZkZpbGUsCi0JCQlFZGl0aW5nRG9tYWluIGRvbWFpbiwgTWFwIGxvYWRPcHRpb25zLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlmRmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG1vbml0b3IpOwotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZkZpbGUuZ2V0RnVsbFBhdGgoKQotICAgICAgICAgICAgLnRvU3RyaW5nKCksIHRydWUpOwotCQkKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBkb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZSh1cmksIGZhbHNlKTsKLQkJCi0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZSA9IGRvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmNyZWF0ZVJlc291cmNlKHVyaSk7Ci0JCX0KLQkJCi0JCWlmICghcmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJTWFwIGxvYWRpbmdPcHRpb25zID0gbmV3IEhhc2hNYXAoR01GUmVzb3VyY2VGYWN0b3J5LmdldERlZmF1bHRMb2FkT3B0aW9ucygpKTsKLQkJCQotICAgICAgICAgICAgLy8gcHJvcG9nYXRlIHBhc3NlZCBpbiBvcHRpb25zIHRvIHRoZSBkZWZhdWx0cwotICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IGxvYWRPcHRpb25zLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qga2V5ID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgbG9hZGluZ09wdGlvbnMucHV0KGtleSwgbG9hZE9wdGlvbnMuZ2V0KGtleSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgCXJlc291cmNlLmxvYWQobG9hZGluZ09wdGlvbnMpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgCXJlc291cmNlLnVubG9hZCgpOwotICAgICAgICAgICAgCXRocm93IGU7Ci0gICAgICAgICAgICB9Ci0JCX0KLQkJCQkJCi0JCXJldHVybiByZXNvdXJjZTsKLQotCX0KLQkKLQlwcml2YXRlIFJlc291cmNlIGdldFJlc291cmNlKGJvb2xlYW4gY3JlYXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmKHJlc291cmNlID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXRoID0gZ2V0RGlhZ3JhbUZpbGVQYXRoKHByb2Nlc3MpOwkKLQkJCWlmKHBhdGggIT0gbnVsbCkgewotCQkJCUlSZXNvdXJjZSB3c1JlcyA9IEZpbGVNYW5hZ2VyLmdldFJlc291cmNlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQkJaWYod3NSZXMgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSB3c1JlczsKLQkJCQkJdHJ5IHsJCQkJCQkKLQkJCQkJCURpYWdyYW0gZGlhZ3JhbSA9IERpYWdyYW1JT1V0aWwubG9hZChnZXRFZGl0aW5nRG9tYWluKCksIGZpbGUsIHRydWUsIGdldE1vbml0b3IoKSk7CQkJCQkKLQkJCQkJCXJlc291cmNlID0gZGlhZ3JhbS5lUmVzb3VyY2UoKTsKLQkJCQkJfQotCQkJCQljYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGhhbmRsZWQgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIGlmIHJlc291cmNlIGRvZXMgbm90IGhhdmUgYW55IGRpYWdyYW0KLQkJCQkJCS8vCi0JCQkJCQlpZihvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaW50ZXJuYWwubDEwbi5FZGl0b3JNZXNzYWdlcy5EaWFncmFtX05PX0RJQUdSQU1fSU5fUkVTT1VSQ0UKLQkJCQkJCQkJLmVxdWFscyhlLmdldE1lc3NhZ2UoKSkpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlyZXNvdXJjZSA9IGxvYWREaWFncmFtUmVzb3VyY2UoZmlsZSwgZ2V0RWRpdGluZ0RvbWFpbigpLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVAsIGdldE1vbml0b3IoKSk7Ci0JCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCQkJfQotCQkJCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIERpYWdyYW1Db3JlUGx1Z2luLlBMVUdJTl9JRCwgZTEuZ2V0TWVzc2FnZSgpLCBlMSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXRocm93IGU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZmlsZVN5bmNocm9uaXplci5tb25pdG9yKGZpbGUpOwotCQkJCX0KLQkJCQllbHNlIGlmKGNyZWF0ZSkgewotCQkJCQlyZXNvdXJjZSA9IGdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpLmNyZWF0ZVJlc291cmNlKAotCQkJCQkJCWNyZWF0ZURpYWdyYW1SZXNvdXJjZVVSSShwYXRoKSk7Ci0JCQkJCXJlc291cmNlSXNOZXcgPSB0cnVlOwotCQkJCQkKLQkJCQkJdHJ5IHsKLQkJCQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGdldEVkaXRpbmdEb21haW4oKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJfSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZighcmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJdHJ5IHsKLQkJCQlyZXNvdXJjZS5sb2FkKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCQkJbm90aWZ5UmVsb2FkZWQoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCWlmKERFQlVHKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbm90aWZ5UmVsb2FkZWQoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlQ2hhbmdlTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJdHJ5IHsKLQkJCQlsaXN0ZW5lci5yZXNvdXJjZUNoYW5nZWQobmV3IFJlc291cmNlQ2hhbmdlRXZlbnQodGhpcywgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UsIDAsIG51bGwpKTsKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQlpZihERUJVRykgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0FjdGl2aXR5KEFjdGl2aXR5IGFjdCkgewkJCi0JCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3QpOwotCQlpZihwcm9jICE9IHByb2Nlc3MpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBzcGVjaWZpZWQgYWN0aXZpdHkgZG9lcyBub3QgYmVsb25nIHRvIHRoZSBwcm9jZXNzIG9mIHRoaXMgZGlhZ3JhbSBtYW5hZ2VyLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9CQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEaWFncmFtT2YoRGlhZ3JhbSBkaWFncmFtLCBBY3Rpdml0eSBhY3QpIHsKLQkJaWYoQURfa2luZC5lcXVhbHMoZGlhZ3JhbS5nZXRUeXBlKCkpKSB7Ci0JCQlyZXR1cm4gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnRGcm9tQW5ub3RhdGlvbigoRU1vZGVsRWxlbWVudCkgZGlhZ3JhbS5nZXRFbGVtZW50KCksIGFjdC5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKSA9PSBhY3Q7Ci0JCX0KLQkJZWxzZSBpZihBRERfa2luZC5lcXVhbHMoZGlhZ3JhbS5nZXRUeXBlKCkpKSB7Ci0JCQlFT2JqZWN0IG1vZGVsID0gZGlhZ3JhbS5nZXRFbGVtZW50KCk7Ci0JCQlyZXR1cm4gbW9kZWwgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0gJiYgKChBY3Rpdml0eURldGFpbERpYWdyYW0pbW9kZWwpLmdldExpbmtlZEVsZW1lbnQoKSA9PSBhY3Q7Ci0JCX0KLQkJZWxzZSBpZihXUERfa2luZC5lcXVhbHMoZGlhZ3JhbS5nZXRUeXBlKCkpKSB7Ci0JCQlFT2JqZWN0IG1vZGVsID0gZGlhZ3JhbS5nZXRFbGVtZW50KCk7Ci0JCQlyZXR1cm4gbW9kZWwgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtICYmICgoV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSltb2RlbCkuZ2V0TGlua2VkRWxlbWVudCgpID09IGFjdDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiByZXNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkIG9uIHRoZQotCSAqIGxvY2FsIGZpbGUgc3lzdGVtIGJ5IGNvbXBhcmluZyB0aGUgYWN0dWFsIHRpbWUgc3RhbXAgd2l0aCB0aGUKLQkgKiBjYWNoZWQgb25lLiBJZiB0aGUgcmVzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZCwgYSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPgotCSAqIGlzIHRocm93bi4KLQkgKgotCSAqIEBwYXJhbSBjYWNoZWRNb2RpZmljYXRpb25TdGFtcCB0aGUgY2FjaGVkIG1vZGlmaWNhdGlvbiBzdGFtcAotCSAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UgdG8gY2hlY2sKLQkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uIGlmIHJlc291cmNlIGhhcyBiZWVuIGNoYW5nZWQgb24gdGhlIGZpbGUgc3lzdGVtCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrU3luY2hyb25pemF0aW9uU3RhdGUoUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYoIWlzU3luY2hyb25pemVkKHJlc291cmNlKSkgewotCQkJU3RhdHVzIHN0YXR1cz0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQbGF0Zm9ybVVJLlBMVUdJTl9JRCwgSVJlc291cmNlU3RhdHVzLk9VVF9PRl9TWU5DX0xPQ0FMLCBFZGl0b3JNZXNzYWdlcy5GaWxlRG9jdW1lbnRQcm92aWRlcl9lcnJvcl9vdXRfb2Zfc3luYywgbnVsbCk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N5bmNocm9uaXplZChSZXNvdXJjZSByZXNvdXJjZSkgewotCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUocmVzb3VyY2UpOwotCQlpZihmaWxlICE9IG51bGwpIHsKLQkJCS8vIGRvbid0IHJlZnJlc2ggdG8gcHJldmVudCByZXNvdXJjZSBmcm9tIGF1dG9tYXRpY2FsbHkgcmVsb2FkZWQKLQkJCS8vCi0vLwkJCWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBtb25pdG9yKTsKLQkJCUZpbGVJbmZvIGluZm8gPSBmaWxlU3luY2hyb25pemVyLmdldEZpbGVJbmZvKGZpbGUpOwotCQkJaWYoaW5mbyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGluZm8uZk1vZGlmaWNhdGlvblN0YW1wID09IEZpbGVTeW5jaHJvbml6ZXIuY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIE1hcDxBY3Rpdml0eSwgTWFwPFN0cmluZywgRGlhZ3JhbT4+IGdldEFjdGl2aXR5VG9TYXZlZERpYWdyYW1zTWFwKCkgewotCQlpZihhY3Rpdml0eVRvU2F2ZWREaWFncmFtTWFwID09IG51bGwpIHsKLQkJCWFjdGl2aXR5VG9TYXZlZERpYWdyYW1NYXAgPSBuZXcgSGFzaE1hcDxBY3Rpdml0eSwgTWFwPFN0cmluZywgRGlhZ3JhbT4+KCk7Ci0JCX0KLQkJcmV0dXJuIGFjdGl2aXR5VG9TYXZlZERpYWdyYW1NYXA7Ci0JfQotCQotCXByaXZhdGUgRGlhZ3JhbSBnZXREaWFncmFtQmFja3VwKEFjdGl2aXR5IGFjdCwgU3RyaW5nIHR5cGUpIHsKLQkJaWYoYWN0aXZpdHlUb1NhdmVkRGlhZ3JhbU1hcCAhPSBudWxsKSB7Ci0JCQlNYXA8U3RyaW5nLCBEaWFncmFtPiB0eXBlVG9EaWFnYW1NYXAgPSBhY3Rpdml0eVRvU2F2ZWREaWFncmFtTWFwLmdldChhY3QpOwotCQkJaWYodHlwZVRvRGlhZ2FtTWFwICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gKERpYWdyYW0pIHR5cGVUb0RpYWdhbU1hcC5nZXQodHlwZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlcGxhY2VUZW1wb3JhcmlseShmaW5hbCBBY3Rpdml0eSBhY3QsIGZpbmFsIERpYWdyYW0gZGlhZ3JhbSkgewotCQl0cnkgewotCQkJbmV3IEFic3RyYWN0RU1GT3BlcmF0aW9uKGdldEVkaXRpbmdEb21haW4oKSwgU3RyaW5nU3RhdGljcy5CTEFOSykgewotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUxpc3QgZGlhZ3JhbXMgPSBnZXREaWFncmFtcyhhY3QsIGdldERpYWdyYW1UeXBlKGRpYWdyYW0uZ2V0VHlwZSgpKSk7Ci0JCQkJCQlpZighZGlhZ3JhbXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJRGlhZ3JhbSBzYXZlZERpYWdyYW0gPSAoRGlhZ3JhbSkgZGlhZ3JhbXMuZ2V0KDApOwotCQkJCQkJCU1hcDxTdHJpbmcsIERpYWdyYW0+IHR5cGVUb0RpYWdhbU1hcCA9IGdldEFjdGl2aXR5VG9TYXZlZERpYWdyYW1zTWFwKCkuZ2V0KGFjdCk7CQotCQkJCQkJCWlmKHR5cGVUb0RpYWdhbU1hcCA9PSBudWxsKSB7Ci0JCQkJCQkJCXR5cGVUb0RpYWdhbU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgRGlhZ3JhbT4oKTsKLQkJCQkJCQkJZ2V0QWN0aXZpdHlUb1NhdmVkRGlhZ3JhbXNNYXAoKS5wdXQoYWN0LCB0eXBlVG9EaWFnYW1NYXApOwotCQkJCQkJCX0KLQkJCQkJCQlpZih0eXBlVG9EaWFnYW1NYXAuZ2V0KGRpYWdyYW0uZ2V0VHlwZSgpKSA9PSBudWxsKSB7Ci0JCQkJCQkJCXR5cGVUb0RpYWdhbU1hcC5wdXQoZGlhZ3JhbS5nZXRUeXBlKCksIHNhdmVkRGlhZ3JhbSk7Ci0JCQkJCQkJfQotCQkJCQkJCSgoSW50ZXJuYWxFT2JqZWN0KSBkaWFncmFtKS5lU2V0UHJveHlVUkkobnVsbCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5lQWxsQ29udGVudHMoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7ICgoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKSkuZVNldFByb3h5VVJJKG51bGwpKTsKLQkJCQkJCQkoKEludGVybmFsRU9iamVjdCkgZGlhZ3JhbS5nZXRFbGVtZW50KCkpLmVTZXRQcm94eVVSSShudWxsKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldEVsZW1lbnQoKS5lQWxsQ29udGVudHMoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7ICgoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKSkuZVNldFByb3h5VVJJKG51bGwpKTsJCQkJCQkJCi0JCQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5zZXQocmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pbmRleE9mKHNhdmVkRGlhZ3JhbSksIGRpYWdyYW0pOwotCQkJCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuc2V0KHJlc291cmNlLmdldENvbnRlbnRzKCkuaW5kZXhPZihzYXZlZERpYWdyYW0uZ2V0RWxlbWVudCgpKSwgZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwkJCQkKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwkJCQotCQkJCQl9Ci0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0KLQkJCQkKLQkJCX0uZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUxKSB7Ci0JCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUxKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIERpYWdyYW0gZ2V0U2F2ZWREaWFncmFtKEFjdGl2aXR5IGFjdCwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCURpYWdyYW0gc2F2ZWREaWFncmFtID0gZ2V0RGlhZ3JhbUJhY2t1cChhY3QsIGRpYWdyYW0uZ2V0VHlwZSgpKTsKLS8vCQlpZihzYXZlZERpYWdyYW0gPT0gbnVsbCkgewotLy8JCQkvLyB0cnkgdG8gbG9hZCBkaWFncmFtIGZyb20gZmlsZQotLy8JCQkvLwotLy8JCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUocmVzb3VyY2UpOwotLy8JCQlpZihmaWxlICE9IG51bGwpIHsKLS8vCQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiA9IGNyZWF0ZUVkaXRpbmdEb21haW4oKTsKLS8vCQkJCXRyeSB7Ci0vLwkJCQkJRGlhZ3JhbSBkID0gRGlhZ3JhbUlPVXRpbC5sb2FkKGRvbWFpbiwgZmlsZSwgdHJ1ZSwgZ2V0TW9uaXRvcigpKTsKLS8vCQkJCQlpZihkICE9IG51bGwpIHsKLS8vCQkJCQkJaW50IGluZGV4ID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pbmRleE9mKGRpYWdyYW0pOwotLy8JCQkJCQlzYXZlZERpYWdyYW0gPSAoRGlhZ3JhbSkgZC5lUmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmdldChpbmRleCk7Ci0vLwkJCQkJfQotLy8JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotLy8JCQkJfSBmaW5hbGx5IHsKLS8vCQkJCQlpZihkb21haW4gIT0gbnVsbCkgewotLy8JCQkJCQlkb21haW4uZGlzcG9zZSgpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLQkJcmV0dXJuIHNhdmVkRGlhZ3JhbTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmV2ZXJzZVRvU2F2ZWQoZmluYWwgQWN0aXZpdHkgYWN0LCBmaW5hbCBEaWFncmFtIGRpYWdyYW0sIFByZWZlcmVuY2VzSGludCBoaW50KSB7Ci0JCWZpbmFsIERpYWdyYW0gc2F2ZWREaWFncmFtID0gZ2V0U2F2ZWREaWFncmFtKGFjdCwgZGlhZ3JhbSk7Ci0JCXRyeSB7Ci0JCQluZXcgQWJzdHJhY3RFTUZPcGVyYXRpb24oZ2V0RWRpdGluZ0RvbWFpbigpLCBTdHJpbmdTdGF0aWNzLkJMQU5LKSB7Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCQlpZihzYXZlZERpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJLy8gcmVzdG9yZSBkaWFncmFtIHRvIGl0cyBiYWNrdXAKLQkJCQkJCS8vCi0JCQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLnNldChyZXNvdXJjZS5nZXRDb250ZW50cygpLmluZGV4T2YoZGlhZ3JhbSksIHNhdmVkRGlhZ3JhbSk7Ci0JCQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLnNldChyZXNvdXJjZS5nZXRDb250ZW50cygpLmluZGV4T2YoZGlhZ3JhbS5nZXRFbGVtZW50KCkpLCBzYXZlZERpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCQkJCXJlbW92ZURpYWdyYW1CYWNrdXAoYWN0LCBkaWFncmFtLmdldFR5cGUoKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBkaWFncmFtIGlzIG5ld2x5IGNyZWF0ZWQsIHJlbW92ZSBpdCBmcm9tIHJlc291cmNlCi0JCQkJCQkvLwotCQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5yZW1vdmUoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5yZW1vdmUoZGlhZ3JhbSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJCQkuZ2V0UGVyc2lzdGVyRm9yKGFjdC5lUmVzb3VyY2UoKSkKLQkJCQkJCQkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaChFeGNlcHRpb24gZXgpIHt9Ci0JCQkJCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQl9Ci0JCQkJCi0JCQl9LmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUxKSB7Ci0JCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUxKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7CQkKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIFVSSSBvZiBkaWFncmFtIHJlc291cmNlIGFmdGVyIHRoZSBVUkkgb2YgcHJvY2VzcyByZXNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVJlc291cmNlVVJJKCkgewotCQlpZihyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShGaWxlTWFuYWdlci50b0ZpbGVTdHJpbmcocmVzb3VyY2UuZ2V0VVJJKCkpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCUZpbGUgcHJvY0ZvbGRlciA9IG5ldyBGaWxlKHByb2Nlc3MuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudEZpbGUoKTsKLQkJaWYoIWZvbGRlci5lcXVhbHMocHJvY0ZvbGRlcikpIHsKLQkJCVN0cmluZyBwYXRoID0gZ2V0RGlhZ3JhbUZpbGVQYXRoKHByb2Nlc3MpOwotCQkJaWYocGF0aCAhPSBudWxsICYmIG5ldyBGaWxlKHBhdGgpLmV4aXN0cygpKSB7Ci0JCQkJcmVzb3VyY2Uuc2V0VVJJKGNyZWF0ZURpYWdyYW1SZXNvdXJjZVVSSShwYXRoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBiYWNrdXBEaWFncmFtKEFjdGl2aXR5IGFjdGl2aXR5LCBEaWFncmFtIGRpYWdyYW0pIHsKLQkJTWFwPFN0cmluZywgRGlhZ3JhbT4gdHlwZVRvRGlhZ2FtTWFwID0gZ2V0QWN0aXZpdHlUb1NhdmVkRGlhZ3JhbXNNYXAoKS5nZXQoYWN0aXZpdHkpOwkKLQkJaWYodHlwZVRvRGlhZ2FtTWFwID09IG51bGwpIHsKLQkJCXR5cGVUb0RpYWdhbU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgRGlhZ3JhbT4oKTsKLQkJCWdldEFjdGl2aXR5VG9TYXZlZERpYWdyYW1zTWFwKCkucHV0KGFjdGl2aXR5LCB0eXBlVG9EaWFnYW1NYXApOwotCQl9Ci0JCXR5cGVUb0RpYWdhbU1hcC5wdXQoZGlhZ3JhbS5nZXRUeXBlKCksIERpYWdyYW1IZWxwZXIuY29weURpYWdyYW0oZ2V0RWRpdGluZ0RvbWFpbigpLCBkaWFncmFtKSk7Ci0JfQotCi0JcHVibGljIERpYWdyYW0gcmVtb3ZlRGlhZ3JhbUJhY2t1cChBY3Rpdml0eSBhY3QsIFN0cmluZyB0eXBlKSB7Ci0JCWlmKGFjdGl2aXR5VG9TYXZlZERpYWdyYW1NYXAgIT0gbnVsbCkgewotCQkJTWFwPFN0cmluZywgRGlhZ3JhbT4gdHlwZVRvRGlhZ2FtTWFwID0gYWN0aXZpdHlUb1NhdmVkRGlhZ3JhbU1hcC5nZXQoYWN0KTsKLQkJCWlmKHR5cGVUb0RpYWdhbU1hcCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIChEaWFncmFtKSB0eXBlVG9EaWFnYW1NYXAucmVtb3ZlKHR5cGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3NlcnZpY2VzL0RpYWdyYW1TZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3NlcnZpY2VzL0RpYWdyYW1TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMWE4YTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9zZXJ2aWNlcy9EaWFncmFtU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVNlcnZpY2UgewotCi0JcHJpdmF0ZSBTZXQ8RGlhZ3JhbU1hbmFnZXI+IGRpYWdyYW1NYW5hZ2VycyA9IG5ldyBIYXNoU2V0PERpYWdyYW1NYW5hZ2VyPigpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERpYWdyYW1TZXJ2aWNlKCkgewotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmb3IgKERpYWdyYW1NYW5hZ2VyIG1nciA6IGRpYWdyYW1NYW5hZ2VycykgewotCQkJbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQl9Ci0JfQotCi0JcHVibGljIERpYWdyYW1NYW5hZ2VyIGdldERpYWdyYW1NYW5hZ2VyKEFjdGl2aXR5IGFjdCkgewotCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KTsKLQkJaWYocHJvYyAhPSBudWxsKSB7Ci0JCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KSwgdGhpcyk7Ci0JCQlkaWFncmFtTWFuYWdlcnMuYWRkKG1ncik7Ci0JCQlyZXR1cm4gbWdyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbjxEaWFncmFtPiBnZXREaWFncmFtcyhBY3Rpdml0eSBhY3QpIHsKLQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gZ2V0RGlhZ3JhbU1hbmFnZXIoYWN0KTsKLQkJcmV0dXJuIG1nciAhPSBudWxsID8gRGlhZ3JhbUhlbHBlci5nZXREaWFncmFtcyhhY3QsIG1ncikgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGJhc2UgZGlhZ3JhbS4KLQkgKiBAcGFyYW0gYWN0Ci0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JCi0JcHVibGljIERpYWdyYW0gZ2V0QmFzZURpYWdyYW0oQWN0aXZpdHkgYWN0LCBpbnQgdHlwZSkgewkJCi0JCWlmIChQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhhY3QpKSB7Ci0JCQl0cnkgewotCQkJCUFjdGl2aXR5IGJhc2VBY3QgPSAoQWN0aXZpdHkpIGFjdAotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBnZXREaWFncmFtTWFuYWdlcihiYXNlQWN0KTsKLQkJCQlMaXN0PERpYWdyYW0+IGJhc2VEaWFncmFtcyA9IG1nci5nZXREaWFncmFtcyhiYXNlQWN0LCB0eXBlKTsKLQkJCQlpZighYmFzZURpYWdyYW1zLmlzRW1wdHkoKSkgewotCQkJCQlyZXR1cm4gYmFzZURpYWdyYW1zLmdldCgwKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJCSJFcnJvciBpbiBnZXR0aW5nIGJhc2UgZGlhZ3JhbTogIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKEFjdGl2aXR5IGFjdCwgaW50IHR5cGUpIHsKLQkJdHJ5IHsKLQkJCURpYWdyYW1NYW5hZ2VyIG1nciA9IGdldERpYWdyYW1NYW5hZ2VyKGFjdCk7Ci0JCQlMaXN0PERpYWdyYW0+IGRpYWdyYW1zID0gbWdyLmdldERpYWdyYW1zKGFjdCwgdHlwZSk7Ci0JCQlyZXR1cm4gZGlhZ3JhbXMuaXNFbXB0eSgpID8gbnVsbCA6IGRpYWdyYW1zLmdldCgwKTsKLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvc2VydmljZXMvRmlsZVN5bmNocm9uaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9zZXJ2aWNlcy9GaWxlU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NDkyZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9zZXJ2aWNlcy9GaWxlU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuaW50ZXJuYWwubDEwbi5FZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBTeW5jaHJvbml6ZXMgdGhlIGRvY3VtZW50IHdpdGggZXh0ZXJuYWwgcmVzb3VyY2UgY2hhbmdlcy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlU3luY2hyb25pemVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCi0JLyoqCi0JICogQnVuZGxlIG9mIGFsbCByZXF1aXJlZCBpbmZvcm1hdGlvbiB0byBhbGxvdyBmaWxlcyBhcyB1bmRlcmx5aW5nIGRvY3VtZW50IHJlc291cmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgRmlsZUluZm8gLy9leHRlbmRzIFN0b3JhZ2VJbmZvIAotCXsKLQkJLyoqIFRoZSB0aW1lIHN0YW1wIGF0IHdoaWNoIHRoaXMgcHJvdmlkZXIgY2hhbmdlZCB0aGUgZmlsZS4gKi8KLQkJcHVibGljIGxvbmcgZk1vZGlmaWNhdGlvblN0YW1wPSBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQkJcHVibGljIGJvb2xlYW4gZkNhbkJlU2F2ZWQ7Ci0JCXB1YmxpYyBJRmlsZSBmRmlsZTsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBmaWxlIGluZm8uCi0JCSAqCi0JCSAqIEBwYXJhbSBkb2N1bWVudCB0aGUgZG9jdW1lbnQKLQkJICogQHBhcmFtIG1vZGVsIHRoZSBhbm5vdGF0aW9uIG1vZGVsCi0JCSAqIEBwYXJhbSBmaWxlU3luY2hyb25pemVyIHRoZSBmaWxlIHN5bmNocm9uaXplcgotCQkgKi8KLQkJcHVibGljIEZpbGVJbmZvKElGaWxlIGZpbGUpIHsKLQkJCWZGaWxlID0gZmlsZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBzeW5jaHJvbml6ZXIgaXMgaW5zdGFsbGVkIG9yIG5vdC4KLQkgKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZJc0luc3RhbGxlZD0gZmFsc2U7Ci0JCi0JLyoqIEVsZW1lbnQgaW5mb3JtYXRpb24gb2YgYWxsIGNvbm5lY3RlZCBlbGVtZW50cyAqLwotCXByaXZhdGUgTWFwIGZGaWxlSW5mb01hcD0gbmV3IEhhc2hNYXAoKTsKLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBmaWxlIHN5bmNocm9uaXplci4gSXMgbm90IHlldCBpbnN0YWxsZWQgb24gYSByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgRmlsZVN5bmNocm9uaXplcigpIHsKLQkJaW5zdGFsbCgpOwotCX0KLQotCXZvaWQgdXBkYXRlTW9kaWZpY2F0aW9uU3RhbXAoSUZpbGUgZmlsZSkgewotCQlGaWxlSW5mbyBpbmZvID0gZ2V0RmlsZUluZm8oZmlsZSk7Ci0JCWlmKGluZm8gIT0gbnVsbCkgewotCQkJaW5mby5mTW9kaWZpY2F0aW9uU3RhbXAgPSBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoZmlsZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWxlbWVudCBpbmZvIG9iamVjdCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICoKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIGVsZW1lbnQgaW5mbyBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwcm90ZWN0ZWQgRmlsZUluZm8gZ2V0RmlsZUluZm8oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChGaWxlSW5mbykgZkZpbGVJbmZvTWFwLmdldChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBJbnN0YWxscyB0aGUgc3luY2hyb25pemVyIG9uIHRoZSBpbnB1dCdzIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbCgpIHsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcywgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCQlmSXNJbnN0YWxsZWQ9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogVW5pbnN0YWxscyB0aGUgc3luY2hyb25pemVyIGZyb20gdGhlIGlucHV0J3MgZmlsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlmSXNJbnN0YWxsZWQ9IGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGUpIHsKLQkJSVJlc291cmNlRGVsdGEgZGVsdGE9IGUuZ2V0RGVsdGEoKTsKLQkJdHJ5IHsKLQkJCWlmIChkZWx0YSAhPSBudWxsICYmIGZJc0luc3RhbGxlZCkgewotCQkJCVJlc291cmNlRGVsdGFWaXNpc3RvciB2aXNpdG9yID0gbmV3IFJlc291cmNlRGVsdGFWaXNpc3RvcigpOwotCQkJCWRlbHRhLmFjY2VwdCh2aXNpdG9yKTsKLQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IHZpc2l0b3IuZ2V0UnVubmFibGUoKTsKLQkJCQlpZihydW5uYWJsZSAhPSBudWxsKSB7Ci0JCQkJCXVwZGF0ZShydW5uYWJsZSk7Ci0JCQkJfQotCQkJfSAKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQloYW5kbGVDb3JlRXhjZXB0aW9uKHgsIEVkaXRvck1lc3NhZ2VzLkZpbGVEb2N1bWVudFByb3ZpZGVyX3Jlc291cmNlQ2hhbmdlZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWZpbmVzIHRoZSBzdGFuZGFyZCBwcm9jZWR1cmUgdG8gaGFuZGxlIDxjb2RlPkNvcmVFeGNlcHRpb25zPC9jb2RlPi4gRXhjZXB0aW9ucwotCSAqIGFyZSB3cml0dGVuIHRvIHRoZSBwbHVnLWluIGxvZy4KLQkgKgotCSAqIEBwYXJhbSBleGNlcHRpb24gdGhlIGV4Y2VwdGlvbiB0byBiZSBsb2dnZWQKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWQKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDb3JlRXhjZXB0aW9uKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCi0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUGxhdGZvcm1VSS5QTFVHSU5fSUQpOwotCQlJTG9nIGxvZz0gUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSk7Ci0KLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLQkJCWxvZy5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQbGF0Zm9ybVVJLlBMVUdJTl9JRCwgMCwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7Ci0JCWVsc2UKLQkJCWxvZy5sb2coZXhjZXB0aW9uLmdldFN0YXR1cygpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGluaXRpYWwgbW9kaWZpY2F0aW9uIHN0YW1wIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi0JICoKLQkgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlCi0JICogQHJldHVybiB0aGUgbW9kaWZpY2F0aW9uIHN0YW1wCi0JICovCi0JcHVibGljIHN0YXRpYyBsb25nIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJGQVRBTCBFUlJPUjogcmVzb3VyY2UgaXMgbnVsbC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJbG9uZyBtb2RpZmljYXRpb25TdGFtcD0gcmVzb3VyY2UuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQotCQlJUGF0aCBwYXRoPSByZXNvdXJjZS5nZXRMb2NhdGlvbigpOwotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIG1vZGlmaWNhdGlvblN0YW1wOwotCi0JCW1vZGlmaWNhdGlvblN0YW1wPSBwYXRoLnRvRmlsZSgpLmxhc3RNb2RpZmllZCgpOwotCQlyZXR1cm4gbW9kaWZpY2F0aW9uU3RhbXA7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgUmVzb3VyY2VEZWx0YVZpc2lzdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPElGaWxlPiBjaGFuZ2VkRmlsZXMgPSBuZXcgQXJyYXlMaXN0PElGaWxlPigpOwotCQlwcml2YXRlIE1hcDxJRmlsZSwgSVBhdGg+IG1vdmVkRmlsZVRvTmV3UGF0aE1hcCA9IG5ldyBIYXNoTWFwPElGaWxlLCBJUGF0aD4oKTsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPElGaWxlPiBkZWxldGVkRmlsZXMgPSBuZXcgQXJyYXlMaXN0PElGaWxlPigpOwotCi0JCS8qCi0JCSAqIEBzZWUgSVJlc291cmNlRGVsdGFWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCWlmIChkZWx0YSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKLQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQ6Ci0JCQkJCUZpbGVJbmZvIGluZm89IChGaWxlSW5mbykgZ2V0RmlsZUluZm8oZGVsdGEuZ2V0UmVzb3VyY2UoKSk7Ci0JCQkJCWlmIChpbmZvID09IG51bGwgfHwgaW5mby5mQ2FuQmVTYXZlZCkKLQkJCQkJCWJyZWFrOwotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCQlib29sZWFuIGlzU3luY2hyb25pemVkPSBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoZmlsZSkgPT0gaW5mby5mTW9kaWZpY2F0aW9uU3RhbXA7Ci0JCQkJCWlmICgoKElSZXNvdXJjZURlbHRhLkVOQ09ESU5HICYgZGVsdGEuZ2V0RmxhZ3MoKSkgIT0gMCAmJiBpc1N5bmNocm9uaXplZCkgfHwgKChJUmVzb3VyY2VEZWx0YS5DT05URU5UICYgZGVsdGEuZ2V0RmxhZ3MoKSkgIT0gMCAmJiAhaXNTeW5jaHJvbml6ZWQpKSB7Ci0JCQkJCQljaGFuZ2VkRmlsZXMuYWRkKGZpbGUpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEOgotCQkJCQlpZiAoKElSZXNvdXJjZURlbHRhLk1PVkVEX1RPICYgZGVsdGEuZ2V0RmxhZ3MoKSkgIT0gMCkgewotCQkJCQkJaW5mbz0gKEZpbGVJbmZvKSBnZXRGaWxlSW5mbyhkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkJCQkJCWlmIChpbmZvID09IG51bGwpCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlmaW5hbCBJUGF0aCBwYXRoPSBkZWx0YS5nZXRNb3ZlZFRvUGF0aCgpOwotCQkJCQkJbW92ZWRGaWxlVG9OZXdQYXRoTWFwLnB1dCgoSUZpbGUpIGRlbHRhLmdldFJlc291cmNlKCksIHBhdGgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaW5mbz0gKEZpbGVJbmZvKSBnZXRGaWxlSW5mbyhkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkJCQkJCWlmIChpbmZvICE9IG51bGwgJiYgIWluZm8uZkNhbkJlU2F2ZWQpIHsKLQkJCQkJCQlkZWxldGVkRmlsZXMuYWRkKChJRmlsZSkgZGVsdGEuZ2V0UmVzb3VyY2UoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlwdWJsaWMgUnVubmFibGUgZ2V0UnVubmFibGUoKSB7Ci0JCQlpZihjaGFuZ2VkRmlsZXMuaXNFbXB0eSgpICYmIG1vdmVkRmlsZVRvTmV3UGF0aE1hcC5pc0VtcHR5KCkgJiYgZGVsZXRlZEZpbGVzLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQloYW5kbGVDaGFuZ2VkKFJlc291cmNlRGVsdGFWaXNpc3Rvci50aGlzKTsKLQkJCQl9Ci0JCQkJCi0JCQl9OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUG9zdHMgdGhlIHVwZGF0ZSBjb2RlICJiZWhpbmQiIHRoZSBydW5uaW5nIG9wZXJhdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBydW5uYWJsZSB0aGUgdXBkYXRlIGNvZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoUnVubmFibGUgcnVubmFibGUpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2g9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCUlXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzPSB3b3JrYmVuY2guZ2V0V29ya2JlbmNoV2luZG93cygpOwotCQlpZiAod2luZG93cyAhPSBudWxsICYmIHdpbmRvd3MubGVuZ3RoID4gMCkgewotCQkJRGlzcGxheSBkaXNwbGF5PSB3aW5kb3dzWzBdLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpOwotCQkJZGlzcGxheS5hc3luY0V4ZWMocnVubmFibGUpOwotCQl9IGVsc2UgewotCQkJcnVubmFibGUucnVuKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgbW9uaXRvcihJRmlsZSBmaWxlKSB7Ci0JCUZpbGVJbmZvIGluZm89IChGaWxlSW5mbykgZkZpbGVJbmZvTWFwLmdldChmaWxlKTsKLQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJaW5mbyA9IG5ldyBGaWxlSW5mbyhmaWxlKTsKLQkJCWluZm8uZk1vZGlmaWNhdGlvblN0YW1wID0gY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGUpOwotCQkJZkZpbGVJbmZvTWFwLnB1dChmaWxlLCBpbmZvKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB1bm1vbml0b3IoSUZpbGUgZmlsZSkgewotCQlmRmlsZUluZm9NYXAucmVtb3ZlKGZpbGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFuZ2VkKFJlc291cmNlRGVsdGFWaXNpc3RvciB2aXNpdG9yKSB7Ci0JCWlmKCF2aXNpdG9yLmNoYW5nZWRGaWxlcy5pc0VtcHR5KCkpIHsKLQkJCWhhbmRsZUNoYW5nZWRGaWxlcyh2aXNpdG9yLmNoYW5nZWRGaWxlcyk7Ci0JCX0KLQkJaWYoIXZpc2l0b3IubW92ZWRGaWxlVG9OZXdQYXRoTWFwLmlzRW1wdHkoKSkgewotCQkJaGFuZGxlTW92ZWRGaWxlcyh2aXNpdG9yLm1vdmVkRmlsZVRvTmV3UGF0aE1hcCk7Ci0JCX0KLQkJaWYoIXZpc2l0b3IuZGVsZXRlZEZpbGVzLmlzRW1wdHkoKSkgewotCQkJaGFuZGxlRGVsZXRlZEZpbGVzKHZpc2l0b3IuZGVsZXRlZEZpbGVzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGhhbmRsZURlbGV0ZWRGaWxlcyhDb2xsZWN0aW9uPElGaWxlPiBkZWxldGVkRmlsZXMpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcDxJRmlsZSwgSVBhdGg+IGhhbmRsZU1vdmVkRmlsZXMoTWFwPElGaWxlLCBJUGF0aD4gbW92ZWRGaWxlVG9OZXdQYXRoTWFwKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gaGFuZGxlQ2hhbmdlZEZpbGVzKENvbGxlY3Rpb248SUZpbGU+IGNoYW5nZWRGaWxlcykgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvdXRpbC9EaWFncmFtQ29uc3RhbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3V0aWwvRGlhZ3JhbUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWVjYTk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvdXRpbC9EaWFncmFtQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNvbnN0YW50cyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBkaWFncmFtRGVsZXRlQWN0aW9uSUQgPSAiZGVsZXRlRGlhZ3JhbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEZWxldGVfRGlhZ3JhbV9FbGVtZW50PSJkZWxldGVEaWFncmFtRWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfRElBR1JBTV9JRD0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EZWxldGVEaWFncmFtQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU0VUX0RJQUdSQU1fTEFZT1VUID0gInJlc2V0X2RpYWdyYW1fbGF5b3V0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRlJFU0ggPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLlJlZnJlc2hBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR1JBTV9BRERfTUVOVV9HRU5FUkFMX0dST1VQID0gImFkZERpYWdyYW1HZW5lcmFsR3JvdXAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQQVJFTlRfQ09NTUFORCA9ICJyZXBhcmVudCBjb21tYW5kIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgUkVBRF9PTkxZX0ZPTlRfQ09MT1IgPSBDb2xvckNvbnN0YW50cy5kYXJrR3JlZW47Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBERUZBVUxUX0ZPTlRfQ09MT1IgPSBDb2xvckNvbnN0YW50cy5ibGFjazsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIFNVUFBSRVNTRURfRk9OVF9DT0xPUiA9IENvbG9yQ29uc3RhbnRzLmdyYXk7Ci0JCi0JCi0JLy8gRm9yIGRlZmF1bHQgZm9udHMuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9GT05UX05BTUUgPSBnZXRGb250TmFtZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9GT05UX1NJWkUgPSA4OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb250IERFRkFVTFRfRk9OVCA9IG5ldyBGb250KG51bGwsIERFRkFVTFRfRk9OVF9OQU1FLAotCQkJREVGQVVMVF9GT05UX1NJWkUsIGphdmEuYXd0LkZvbnQuUExBSU4pOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb250IERFRkFVTFRfRk9OVF9JVEFMSUMgPSBuZXcgRm9udChudWxsLAotCQkJREVGQVVMVF9GT05UX05BTUUsIERFRkFVTFRfRk9OVF9TSVpFLCBqYXZhLmF3dC5Gb250LklUQUxJQyk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSU5fMksgPSAiV2luZG93cyAyMDAwIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0Rm9udE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gIkFyaWFsIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIENvcnJ1cHRlZCBKYXBhbmVzZSBjaGFyYWN0ZXJzIGluIEFjdGl2aXR5IERpYWdyYW1zCi0JCVN0cmluZyBjdXJyZW50TG9jYWxlID0gUGxhdGZvcm0uZ2V0TkwoKTsKLQkJaWYgKGN1cnJlbnRMb2NhbGUgIT0gbnVsbAotCQkJCSYmIGN1cnJlbnRMb2NhbGUuc3RhcnRzV2l0aChMb2NhbGUuSkFQQU5FU0UuZ2V0TGFuZ3VhZ2UoKSkpIHsKLQkJCWlmIChXSU5fMksuZXF1YWxzSWdub3JlQ2FzZShTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW5hbWUgPSBMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9uYW1lX3dpbjMyOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRGb250TmFtZShGb250U3R5bGUgc3R5bGUpIHsKLQkJU3RyaW5nIG5hbWUgPSAiQXJpYWwiOyAvLyROT04tTkxTLTEkCi0JCWlmIChzdHlsZSAhPSBudWxsKSB7CQotCQkJbmFtZSA9IHN0eWxlLmdldEZvbnROYW1lKCk7Ci0JCX0KLQotCQkvLyBDb3JydXB0ZWQgSmFwYW5lc2UgY2hhcmFjdGVycyBpbiBBY3Rpdml0eSBEaWFncmFtcwotCQlTdHJpbmcgY3VycmVudExvY2FsZSA9IFBsYXRmb3JtLmdldE5MKCk7Ci0JCWlmIChjdXJyZW50TG9jYWxlICE9IG51bGwKLQkJCQkmJiBjdXJyZW50TG9jYWxlLnN0YXJ0c1dpdGgoTG9jYWxlLkpBUEFORVNFLmdldExhbmd1YWdlKCkpKSB7Ci0JCQlpZiAoV0lOXzJLLmVxdWFsc0lnbm9yZUNhc2UoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQluYW1lID0gTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl9qYTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogR2V0IGRlZmF1bHQgZm9udCBkYXRhCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9udERhdGEgZ2V0RGVmYXVsdEZvbnREYXRhKCkgewotCQotCQlTdHJpbmcgZm9udE5hbWUgPSBERUZBVUxUX0ZPTlRfTkFNRTsKLQkJCi0JCS8vIENvcnJ1cHRlZCBKYXBhbmVzZSBjaGFyYWN0ZXJzIGluIEFjdGl2aXR5IERpYWdyYW1zCi0JCVN0cmluZyBjdXJyZW50TG9jYWxlID0gUGxhdGZvcm0uZ2V0TkwoKTsKLQkJaWYgKGN1cnJlbnRMb2NhbGUgIT0gbnVsbAotCQkJCSYmIGN1cnJlbnRMb2NhbGUuc3RhcnRzV2l0aChMb2NhbGUuSkFQQU5FU0UuZ2V0TGFuZ3VhZ2UoKSkpIHsKLQkJCWlmIChXSU5fMksuZXF1YWxzSWdub3JlQ2FzZShTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWZvbnROYW1lID0gTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl9qYTsKLQkJCX0KLQkJfQotCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgREVGQVVMVF9GT05UX1NJWkUsIFNXVC5OT1JNQUwpOwotCQlyZXR1cm4gZm9udERhdGE7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9TVEFSVF9OT0RFID0gImNyZWF0ZV9zdGFydF9ub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0VORF9OT0RFID0gImNyZWF0ZV9lbmRfbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9KT0lOX05PREUgPSAiY3JlYXRlX2pvaW5fbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9ERUNJU0lPTl9OT0RFID0gImNyZWF0ZV9kZWNpc2lvbl9ub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0FDVElWSVRZID0gImNyZWF0ZV9hY3Rpdml0eSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9QSEFTRSA9ICJjcmVhdGVfcGhhc2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfSVRFUkFUSU9OID0gImNyZWF0ZV9pdGVyYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfVEFTS19ERVNDUklQVE9SID0gImNyZWF0ZV90YXNrX2Rlc2NyaXB0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfTUlMRVNUT05FID0gImNyZWF0ZV9taWxlc3RvbmUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0ZPUktfTk9ERT0iY3JlYXRlX2Zvcmtfbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfTUVSR0VfTk9ERT0iY3JlYXRlX21lcmdlX25vZGUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX1BBUlRJVElPTiA9ImNyZWF0ZV9wYXJ0aXRpb24iOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSA9ICJvcGVuX2FjdGl2aXR5X2RldGFpbF9kaWFncmFtIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFPSJjcmVhdGVfd29ya19wcm9kdWN0X2Rlc2NyaXB0b3IiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0xJTksgPSAiY3JlYXRlX2RpYWdyYW1fbGluayI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PVkVfQUNUSU9OID0gIm1vdmVfYWN0aW9uX2lkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQmVsb3cgZGVmYXVsdHMgdmFyaWFibGVzIGFyZSB0byBleGNsdWRlIGZyb20gZGlhZ3JhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxMX0NPTE9SX0VERUZBVUxUID0gMTY3NzcyMTU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElORV9DT0xPUl9FREVGQVVMVCA9IDExNTc5NTY4OwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIENPTlRST0xfRkxPV19JTUFHRV9ERVNDUklQVE9SID0gRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigibGluay5naWYiKTsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS91dGlsL0RpYWdyYW1Db3JlVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS91dGlsL0RpYWdyYW1Db3JlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjQ2ODQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvdXRpbC9EaWFncmFtQ29yZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5UcmFuc2xhdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQWN0aXZpdHlEaWFncmFtQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5maWd1cmVzLldpZGVuZWRXcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuRmlndXJlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkubWFwbW9kZS5JTWFwTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkubWFwbW9kZS5NYXBNb2RlVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkJyZWFrSXRlcmF0b3I7Ci0KLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGJlIHVzZWQgZm9yIEVQRiBkaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiAKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERpYWdyYW1Db3JlVXRpbCB7Ci0JCi0KLQkvKioKLQkgKiBTZXQgbGFiZWwgcHJvcGVydGllcyBmb3IgdGhlIGdpdmVuIGxhYmVsIGZpZ3VyZQotCSAqIEBwYXJhbSBmaWdfMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMYWJlbFByb3BlcnRpZXMoV3JhcExhYmVsIGxhYmVsRmlndXJlKXsKLQkJbGFiZWxGaWd1cmUuc2V0Rm9udChEaWFncmFtQ29uc3RhbnRzLkRFRkFVTFRfRk9OVCk7Ci0JCWxhYmVsRmlndXJlLnNldEljb25BbGlnbm1lbnQoUG9zaXRpb25Db25zdGFudHMuVE9QKTsKLQkJbGFiZWxGaWd1cmUuc2V0TGFiZWxBbGlnbm1lbnQoUG9zaXRpb25Db25zdGFudHMuVE9QKTsKLQkJbGFiZWxGaWd1cmUuc2V0VGV4dEFsaWdubWVudChQb3NpdGlvbkNvbnN0YW50cy5UT1ApOwotCQlsYWJlbEZpZ3VyZS5zZXRUZXh0UGxhY2VtZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsKLQkJbGFiZWxGaWd1cmUuc2V0VGV4dFdyYXAodHJ1ZSk7Ci0JCWxhYmVsRmlndXJlLnNldFRleHRXcmFwQWxpZ25tZW50KFBvc2l0aW9uQ29uc3RhbnRzLkNFTlRFUik7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIGRlZmF1bHQgZm9udCBmb3IgdGhpcyBwcmVmZXJlbmNlIHN0b3JlLgotCSAqIEBwYXJhbSBzdG9yZSBJUHJlZmVyZW5jZVN0b3JlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRGb250UHJlZmVyZW5jZShJUHJlZmVyZW5jZVN0b3JlIHN0b3JlKXsKLQkJRm9udERhdGEgZm9udERhdGFBcnJheVtdID0KLSAgICAgICAgICAgIEpGYWNlUmVzb3VyY2VzLmdldERlZmF1bHRGb250KCkuZ2V0Rm9udERhdGEoKTsKLSAgICAgICAgRm9udERhdGEgZm9udERhdGEgPSBmb250RGF0YUFycmF5WzBdOwotICAgICAgICBmb250RGF0YS5zZXRIZWlnaHQoRGlhZ3JhbUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfU0laRSk7Ci0gICAgICAgIGZvbnREYXRhLnNldE5hbWUoRGlhZ3JhbUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfTkFNRSk7Ci0gICAgICAgIFByZWZlcmVuY2VDb252ZXJ0ZXIuc2V0RGVmYXVsdCgKLSAgICAgICAgICAgIHN0b3JlLAotICAgICAgICAgICAgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQsCi0gICAgICAgICAgICBmb250RGF0YSk7CQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YWxpZFN0cmluZ0ZvckJyZWFrZG93bkVsZW1lbnRzKEVkaXRQYXJ0IHBhcnQsIFN0cmluZyB0eHQpewotCQlPYmplY3Qgb2JqID0gcGFydC5nZXRNb2RlbCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iajsKLQkJCUVPYmplY3QgdW1sRSA9IG5vZGUuZ2V0RWxlbWVudCgpOwotCQkJT2JqZWN0IGUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCgoRU1vZGVsRWxlbWVudCl1bWxFKTsKLQkJCUVPYmplY3QgdW1sQSA9IG5vZGUuZ2V0RGlhZ3JhbSgpLmdldEVsZW1lbnQoKTsKLQkJCUFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIgYWRhcHRlciA9IChBY3Rpdml0eURpYWdyYW1BZGFwdGVyKUJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcih1bWxBKTsKLQkJCWlmKGFkYXB0ZXIgIT0gbnVsbCl7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlyZXR1cm4gVG5nVXRpbC5jaGVja1dCU0FjdGl2aXR5UHJlc2VudGF0aW9uTmFtZShlLCB0eHQsIGFkYXB0ZXIuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gVG5nVXRpbAotCQkJCQkJLmNoZWNrV29ya0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKGUsCi0JCQkJCQkJCXR4dCwgYWRhcHRlci5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgZm9udCBjb2xvciBmb3IgdGhlIGdpdmVuIGVkaXQgcGFydC4gVGhlIGNvbG9yIGlzIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgKHN1cHByZXNzaW9uLCByZWFkLW9ubHkuLi4pCi0JICogb2YgdGhlIHNlbWFudGljIG1vZGVsIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIHZpZXcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xvciBnZXRGb250Q29sb3IoQWJzdHJhY3RFZGl0UGFydCBlZGl0UGFydCkgewotCQlPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLQkJCi0JCS8vIEJ5IGRlZmF1bHQgcHVibGlzaGluZyBtb2RlIGlzIGZhbHNlLiBJZiBwdWJsaXNoIG1vZGUgaXMgc2V0IHJldHVybiBibGFjayBjb2xvci4KLQkJaWYoTGlicmFyeVV0aWwuUFVCTElTSF9NT0RFKXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlFZGl0UGFydFZpZXdlciB2aWV3ZXIgPSBlZGl0UGFydC5nZXRWaWV3ZXIoKTsKLQkJaWYodmlld2VyIGluc3RhbmNlb2YgSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyKSB7Ci0JCQlEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQgPSAoKElEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlcil2aWV3ZXIpLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJLy8gdXNlIHRoZSBmb2xsb3dpbmcgY29tbWVudGVkIG91dCBjb2RlIG9ubHkgaWYgc3VwcHJlc3NlZCBlbGVtZW50cyBzaG91bGQgYmUgc2hvd24gaW4gZ3JheQotCQkJLy8KLS8vCQkJaWYoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dC5nZXRXcmFwcGVyKCkgIT0gbnVsbCAmJgotLy8JCQkJCWlucHV0LmdldFdyYXBwZXIoKS5pc0luaGVyaXRlZCgpKSB7Ci0vLwkJCQlPYmplY3QgbW9kZWwgPSBlZGl0UGFydC5nZXRNb2RlbCgpOwotLy8JCQkJaWYobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0vLwkJCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IG51bGw7Ci0vLwkJCQkJRGlhZ3JhbSBkaWFncmFtID0gZ2V0RGlhZ3JhbUVkaXRQYXJ0KGVkaXRQYXJ0KS5nZXREaWFncmFtVmlldygpOwotLy8JCQkJCVN0cmluZyB0eXBlID0gZGlhZ3JhbS5nZXRUeXBlKCk7Ci0vLwkJCQkJaWYoRGlhZ3JhbU1hbmFnZXIuQURfa2luZC5lcXVhbHModHlwZSkpIHsKLS8vCQkJCQkJRGlhZ3JhbUFkYXB0ZXIgZGEgPSAoKERpYWdyYW1BZGFwdGVyKUJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihkaWFncmFtLmdldEVsZW1lbnQoKSkpOwotLy8JCQkJCQlpZihkYSAhPSBudWxsKSB7Ci0vLwkJCQkJCQlBY3Rpdml0eURpYWdyYW1BZGFwdGVyIGFkYXB0ZXIgPSBuZXcgQWN0aXZpdHlEaWFncmFtQWRhcHRlcihpbnB1dC5nZXRXcmFwcGVyKCkpOwotLy8JCQkJCQkJYWRhcHRlci5zZXRGaWx0ZXIoZGEuZ2V0RmlsdGVyKCkpOwotLy8JCQkJCQkJYWRhcHRlci5zZXRTdXBwcmVzc2lvbihkYS5nZXRTdXBwcmVzc2lvbigpKTsKLS8vCQkJCQkJCWNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbigpOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJCWVsc2UgaWYoRGlhZ3JhbU1hbmFnZXIuQUREX2tpbmQuZXF1YWxzKHR5cGUpIHx8IERpYWdyYW1NYW5hZ2VyLldQRF9raW5kLmVxdWFscyh0eXBlKSkgewotLy8JCQkJCQlEaWFncmFtSW1wbCBkOwotLy8JCQkJCQlpZihEaWFncmFtTWFuYWdlci5BRERfa2luZC5lcXVhbHModHlwZSkpIHsKLS8vCQkJCQkJCWQgPSAoRGlhZ3JhbUltcGwpIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHlEZXRhaWxEaWFncmFtKCk7Ci0vLwkJCQkJCX0KLS8vCQkJCQkJZWxzZSB7Ci0vLwkJCQkJCQlkID0gKERpYWdyYW1JbXBsKSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKTsKLS8vCQkJCQkJfQkJCQkJCQotLy8JCQkJCQlEaWFncmFtSW1wbCBkaWFncmFtSW5Vc2UgPSAoKERpYWdyYW1JbXBsKWRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLS8vCQkJCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBkaWFncmFtSW5Vc2UuZ2V0U3VwcHJlc3Npb24oKTsKLS8vCQkJCQkJaWYoc3VwcHJlc3Npb24gIT0gbnVsbCkgewotLy8JCQkJCQkJZC5zZXRXcmFwcGVyKGlucHV0LmdldFdyYXBwZXIoKSk7Ci0vLwkJCQkJCQlkLnNldEZpbHRlcihkaWFncmFtSW5Vc2UuZ2V0RmlsdGVyKCkpOwotLy8JCQkJCQkJZC5zZXRTdXBwcmVzc2lvbihkaWFncmFtSW5Vc2UuZ2V0U3VwcHJlc3Npb24oKSk7Ci0vLwkJCQkJCQljaGlsZHJlbiA9IGQuZ2V0Q2hpbGRyZW4oKTsKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCQlpZihjaGlsZHJlbiAhPSBudWxsKSB7Ci0vLwkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KChWaWV3KSBtb2RlbCk7Ci0vLwkJCQkJCWZpbmRfd3JhcHBlcjoKLS8vCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJCQkJCU9iamVjdCBjaGlsZCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotLy8JCQkJCQkJCWlmKFRuZ1V0aWwudW53cmFwKGNoaWxkKSA9PSBlKSB7Ci0vLwkJCQkJCQkJCW9iamVjdCA9IGNoaWxkOwotLy8JCQkJCQkJCQlicmVhayBmaW5kX3dyYXBwZXI7Ci0vLwkJCQkJCQkJfQotLy8JCQkJCQkJfQotLy8JCQkJCQlpZihvYmplY3QgIT0gbnVsbCkgewotLy8JCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoaW5wdXQuZ2V0V3JhcHBlcigpKTsKLS8vCQkJCQkJCWlmKFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKHByb2MpLmlzU3VwcHJlc3NlZChvYmplY3QpKSB7Ci0vLwkJCQkJCQkJcmV0dXJuIERpYWdyYW1Db25zdGFudHMuU1VQUFJFU1NFRF9GT05UX0NPTE9SOwotLy8JCQkJCQkJfQotLy8JCQkJCQkJZWxzZSB7Ci0vLwkJCQkJCQkJcmV0dXJuIERpYWdyYW1Db25zdGFudHMuUkVBRF9PTkxZX0ZPTlRfQ09MT1I7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJCQotCQkJaWYoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dC5nZXRXcmFwcGVyKCkgIT0gbnVsbCkgewotCQkJCXJldHVybiBEaWFncmFtQ29uc3RhbnRzLlJFQURfT05MWV9GT05UX0NPTE9SOwotCQkJfQotCQl9Ci0JCQotCQlPYmplY3QgbW9kZWwgPSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQlpZihtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCXJldHVybiBEaWFncmFtQ29yZVV0aWwuZ2V0Rm9udENvbG9yKChWaWV3KSBtb2RlbCk7Ci0JCX0KLQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgZm9udCBjb2xvciBmb3IgdGhlIGdpdmVuIHZpZXcuIFRoZSBjb2xvciBpcyBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIChzdXBwcmVzc2lvbiwgcmVhZC1vbmx5Li4uKQotCSAqIG9mIHRoZSBzZW1hbnRpYyBtb2RlbCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSB2aWV3Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIENvbG9yIGdldEZvbnRDb2xvcihWaWV3IHZpZXcpIHsKLS8vCQlpZiAoQnJpZGdlSGVscGVyLmlzU3VwcHJlc3NlZCh2aWV3KSkgewotLy8JCQlyZXR1cm4gRGlhZ3JhbUNvbnN0YW50cy5TVVBQUkVTU0VEX0ZPTlRfQ09MT1I7Ci0vLwkJfQotCQlpZiAoQnJpZGdlSGVscGVyLmlzUmVhZE9ubHkodmlldykpIHsKLQkJCXJldHVybiBEaWFncmFtQ29uc3RhbnRzLlJFQURfT05MWV9GT05UX0NPTE9SOwotCQl9Ci0vLwkJZWxzZSB7Ci0vLwkJCXJldHVybiBEaWFncmFtQ29uc3RhbnRzLkRFRkFVTFRfRk9OVF9DT0xPUjsKLS8vCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIERpYWdyYW1FZGl0UGFydCBnZXREaWFncmFtRWRpdFBhcnQoRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQkJZm9yKDtlZGl0UGFydCAhPSBudWxsICYmICEoZWRpdFBhcnQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpOyBlZGl0UGFydCA9IGVkaXRQYXJ0LmdldFBhcmVudCgpKTsKLQkJcmV0dXJuIChEaWFncmFtRWRpdFBhcnQpIGVkaXRQYXJ0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkT25seShBYnN0cmFjdEVkaXRQYXJ0IGVkaXRQYXJ0KXsKLQkJT2JqZWN0IG1vZGVsID0gZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJaWYobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlyZXR1cm4gQnJpZGdlSGVscGVyLmlzUmVhZE9ubHkoKFZpZXcpbW9kZWwpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3luY0JhcihFZGl0UGFydCBwYXJ0KXsKLQkJaWYocGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCl7Ci0JCQlWaWV3IG5vZGUgPSAoVmlldylwYXJ0LmdldE1vZGVsKCk7Ci0JCQlPYmplY3Qgb2JqID0gbm9kZS5nZXRFbGVtZW50KCk7Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpewotCQkJCXJldHVybiBCcmlkZ2VIZWxwZXIuaXNTeW5jaEJhcigoQWN0aXZpdHlOb2RlKW9iaik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3cmFwKFN0cmluZyBzLCBpbnQgd3JhcFdpZHRoKSB7Ci0JCVN0cmluZyB3cmFwcGVkID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJQnJlYWtJdGVyYXRvciBiaSA9IEJyZWFrSXRlcmF0b3IuZ2V0TGluZUluc3RhbmNlKCk7Ci0JCVN0cmluZyByZW1haW5pbmcgPSBzOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKHJlbWFpbmluZy5sZW5ndGgoKSA8PSB3cmFwV2lkdGgpIHsKLQkJCQl3cmFwcGVkICs9IHJlbWFpbmluZzsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJYmkuc2V0VGV4dChyZW1haW5pbmcpOwotCQkJCWludCBwb3MgPSBiaS5mb2xsb3dpbmcod3JhcFdpZHRoKTsKLQkJCQlpZiAocG9zID09IEJyZWFrSXRlcmF0b3IuRE9ORSkgewotCQkJCQl3cmFwcGVkICs9IHJlbWFpbmluZzsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHBvcyA+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+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoaW50IHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZGI4MWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgdGhlIG1vZGVsIG9mIHRoZSBXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBkaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIGV4dGVuZHMgRGlhZ3JhbSB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzQ4MTI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotLyoqCi0gKiBOb2RlIGZvciBXb3JrUHJvZHVjdERlc2NyaXB0b3IgaW4gQWN0aXZpdHlEZXRhaWxEaWFncmFtLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSBleHRlbmRzIE5hbWVkTm9kZSB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrUHJvZHVjdE5vZGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrUHJvZHVjdE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVkNGZhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya1Byb2R1Y3ROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBub2RlIGluIFdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtQcm9kdWN0Tm9kZSBleHRlbmRzIE5hbWVkTm9kZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUlRJRkFDVCA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUxJVkVSQUJMRSA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRDT01FID0gMzsKLQotCS8qKgotCSAqIEdldHMgdGhlIHdvcmsgcHJvZHVjdCB0eXBlIG9mIHRoaXMgbm9kZS4gVGhpcyBtdXN0IGJlIG9uZSBvZiB0aGUKLQkgKiBmb2xsb3dpbmcgY29uc3RhbnRzOiB7QGxpbmsgI0FSVElGQUNUfSwge0BsaW5rICNERUxJVkVSQUJMRX0sIHtAbGluayAjT1VUQ09NRX0KLQkgKiAKLQkgKiBAbW9kZWwKLQkgKi8KLQlpbnQgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKGludCB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRjMDZjOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9BY3Rpdml0eURldGFpbERpYWdyYW1JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JQWRhcHRlckZhY3RvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZpdHkgRGV0YWlsIERpYWdyYW08L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCNpc0F1dG9MYXlvdXQgPGVtPkF1dG8gTGF5b3V0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCBleHRlbmRzIERpYWdyYW1JbXBsIGltcGxlbWVudHMKLQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBdXRvTGF5b3V0KCkgPGVtPkF1dG8gTGF5b3V0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0F1dG9MYXlvdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBBVVRPX0xBWU9VVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBdXRvTGF5b3V0KCkgPGVtPkF1dG8gTGF5b3V0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0F1dG9MYXlvdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGF1dG9MYXlvdXQgPSBBVVRPX0xBWU9VVF9FREVGQVVMVDsKLQotCXByaXZhdGUgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBBY3Rpdml0eUFkYXB0ZXIKLQkJCWltcGxlbWVudHMgSUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIHsKLQkJLy8gLyogKG5vbi1KYXZhZG9jKQotCQkvLyAqIEBzZWUKLQkJLy8gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbC5BY3Rpdml0eUFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCS8vICovCi0JCS8vIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkvLyBpZighbm90aWZpY2F0aW9uRW5hYmxlZCkgcmV0dXJuOwotCQkvLyBub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCS8vIHRyeSB7Ci0JCS8vIE9iamVjdCBvYmo7Ci0JCS8vIHN3aXRjaChtc2cuZ2V0RmVhdHVyZUlEKEFjdGl2aXR5LmNsYXNzKSkgewotCQkvLyBjYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJLy8gcmVwb3B1bGF0ZURpYWdyYW0oKTsKLQkJLy8gYnJlYWs7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBmaW5hbGx5IHsKLQkJLy8gbm90aWZpY2F0aW9uRW5hYmxlZCA9IHRydWU7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gfQotCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJZGlhZ3JhbUNoYW5nZUxpc3RlbmVyID0gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX0FVVE9fTEFZT1VUOgotCQkJCXJldHVybiBpc0F1dG9MYXlvdXQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19BVVRPX0xBWU9VVDoKLQkJCQlzZXRBdXRvTGF5b3V0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fQVVUT19MQVlPVVQ6Ci0JCQkJc2V0QXV0b0xheW91dChBVVRPX0xBWU9VVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fQVVUT19MQVlPVVQ6Ci0JCQkJcmV0dXJuIGF1dG9MYXlvdXQgIT0gQVVUT19MQVlPVVRfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhdXRvTGF5b3V0OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGF1dG9MYXlvdXQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcHVsYXRlRGlhZ3JhbSgpIHsKLQkJLy8gY2xlYXIgZGlhZ3JhbQotCQkvLwotCi0JCWludCBzaXplID0gZ2V0Tm9kZXMoKS5zaXplKCk7Ci0KLQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24gZm9yIGFsbCBub2RlcyBpbiB0aGlzIGRpYWdyYW0gdG8gYXZvaWQgdW53YW50ZWQKLQkJLy8gY29uY3VycmVudCBtb2RpZmljYXRpb24gb2YgdGhlaXIgY29ubmVjdGlvbiBsaXN0Ci0JCS8vCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlOb2RlSW1wbCBub2RlID0gKChOb2RlSW1wbCkgZ2V0Tm9kZXMoKS5nZXQoaSkpOwotCQkJbm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRpb24gPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdGlvbi5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlcmF0aW9uLm5leHQoKTsKLQotCQkJLy8gY2xlYXIgYWxsIGxpbmtzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQlsaW5rLnNldFRhcmdldChudWxsKTsKLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQlsaW5rLnNldFNvdXJjZShudWxsKTsKLQkJCX0KLQkJCW5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLmNsZWFyKCk7Ci0JCQlub2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCQl9Ci0KLQkJZ2V0Tm9kZXMoKS5jbGVhcigpOwotCi0JCXBvcHVsYXRlRGlhZ3JhbSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXV0b0xheW91dCgpIHsKLQkJaWYoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJcmV0dXJuIEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9BVVRPX0xBWU9VVF9WQUxVRV9UUlVFLmVxdWFscygKLQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRBdXRvTGF5b3V0RmxhZyh0aGlzKSk7Ci0JCX0KLQkJcmV0dXJuIGF1dG9MYXlvdXQ7Ci0JfQotCi0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dG9MYXlvdXQoYm9vbGVhbiBuZXdBdXRvTGF5b3V0KSB7Ci0JCWJvb2xlYW4gb2xkQXV0b0xheW91dCA9IGF1dG9MYXlvdXQ7Ci0JCWF1dG9MYXlvdXQgPSBuZXdBdXRvTGF5b3V0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX0FVVE9fTEFZT1VULCBvbGRBdXRvTGF5b3V0LCBhdXRvTGF5b3V0KSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvU2V0QXV0b0xheW91dChib29sZWFuIG5ld0F1dG9MYXlvdXQpIHsKLQkJaWYoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5jcmVhdGVQcm9wZXJ0eSh0aGlzLmdyYXBoTm9kZSwgCi0JCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9BVVRPX0xBWU9VVCwgCi0JCQkJCVN0cmluZy52YWx1ZU9mKG5ld0F1dG9MYXlvdXQpKTsKLQkJfQotCQllbHNlIHsKLQkJCXNldEF1dG9MYXlvdXQobmV3QXV0b0xheW91dCk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBnZXRBbGxCcmVha2Rvd25FbGVtZW50cyh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCBicmVha2Rvd24gZWxlbWVudHMgb3IgdGhlaXIgd3JhcHBlcnMgZm9yIHRoZSBhY3Rpdml0eSBvZiB0aGlzCi0JICogZGlhZ3JhbQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlDb2xsZWN0aW9uIGdldEFsbEJyZWFrZG93bkVsZW1lbnRzKGJvb2xlYW4gZmlsdGVyU3VwcHJlc3NlZCkgewotCQlBcnJheUxpc3QgYnJlYWtkb3duRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFkYXB0ZXJGYWN0b3J5W10gYWRhcHRlckZhY3RvcmllczsKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElBZGFwdGVyRmFjdG9yeUZpbHRlcikgewotCQkJSUFkYXB0ZXJGYWN0b3J5RmlsdGVyIGFkYXB0ZXJGYWN0b3J5RmlsdGVyID0gKElBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyOwotCQkJYWRhcHRlckZhY3RvcmllcyA9IG5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJYWRhcHRlckZhY3RvcnlGaWx0ZXIuZ2V0V0JTQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJYWRhcHRlckZhY3RvcnlGaWx0ZXIuZ2V0VEJTQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJYWRhcHRlckZhY3RvcnlGaWx0ZXIuZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCkgfTsKLQkJfSBlbHNlIHsKLQkJCWFkYXB0ZXJGYWN0b3JpZXMgPSBERUZBVUxUX0FEQVBURVJfRkFDVE9SSUVTOwotCQl9Ci0JCWlmICh3cmFwcGVyICE9IG51bGwpIHsKLQkJCUxpc3Qgd3JhcHBlcnMgPSBQcm9jZXNzVXRpbC5nZXRXcmFwcGVycyh3cmFwcGVyLCBhZGFwdGVyRmFjdG9yaWVzKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdyYXBwZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHcgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGl0ZXIKLQkJCQkJCS5uZXh0KCk7Ci0JCQkJZXh0cmFjdENoaWxkcmVuKHcsIHcsIGJyZWFrZG93bkVsZW1lbnRzLCBmaWx0ZXJTdXBwcmVzc2VkKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRlckZhY3Rvcmllcy5sZW5ndGg7IGkrKykgewotCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcmllc1tpXTsKLQkJCQlpZiAoZ2V0T2JqZWN0KCkgIT0gbnVsbCkgewotCQkJCQlpZiAoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJCQkuYWRhcHQoZ2V0T2JqZWN0KCksCi0JCQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCWV4dHJhY3RDaGlsZHJlbihhZGFwdGVyLCBnZXRPYmplY3QoKSwKLQkJCQkJCQkJYnJlYWtkb3duRWxlbWVudHMsIGZpbHRlclN1cHByZXNzZWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBhZGQgZGVzY3JpcHRvcnMgb2Ygc3ViYXJ0aWZhY3RzCi0JCS8vCi0JCUFkYXB0ZXJGYWN0b3J5IHdwYnNBZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3JpZXNbMl07Ci0JCWZvciAoSXRlcmF0b3I8Pz4gaXRlcmF0b3IgPSBuZXcgQXJyYXlMaXN0KGJyZWFrZG93bkVsZW1lbnRzKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJCWlmKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdCB3cCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKWUpLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJaWYod3AgaW5zdGFuY2VvZiBBcnRpZmFjdAotCQkJCQkJLy8gRklYTUU6IG5lZWQgdG8gdXNlZCByZWFsaXplZCBsaXN0IG9mIHN1YmFydGlmYWN0cyBhZnRlciBzaW1pbGFyIGZpeCBpcyBtYWRlIGluCi0JCQkJCQkvLyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKLQkJCQkJCS8vCi0JCQkJCQkmJiAhKChBcnRpZmFjdCl3cCkuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkuaXNFbXB0eSgpIAotCQkJCSkgewotCQkJCQljb2xsZWN0U3ViYXJ0aWZhY3REZXNjcmlwdG9ycyhjaGlsZCwgZmlsdGVyU3VwcHJlc3NlZCwgYnJlYWtkb3duRWxlbWVudHMsIHdwYnNBZGFwdGVyRmFjdG9yeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gYnJlYWtkb3duRWxlbWVudHM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RTdWJhcnRpZmFjdERlc2NyaXB0b3JzKE9iamVjdCBjaGlsZCwKLQkJCWJvb2xlYW4gZmlsdGVyU3VwcHJlc3NlZCwgQXJyYXlMaXN0PE9iamVjdD4gYnJlYWtkb3duRWxlbWVudHMsCi0JCQlBZGFwdGVyRmFjdG9yeSB3cGJzQWRhcHRlckZhY3RvcnkpIHsKLQkJLy8gZGlzYWJsZSByb2xsdXAgYmVmb3JlIGdldHRpbmcgdGhlIGNoaWxkcmVuCi0JCS8vCi0JCWJvb2xlYW4gb2xkUm9sbGVkVXAgPSBmYWxzZTsKLQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSBudWxsOwotCQlpZihjaGlsZCBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGNoaWxkOwotCQkJb2xkUm9sbGVkVXAgPSBpdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpOwotCQkJaXRlbVByb3ZpZGVyLmJhc2ljU2V0Um9sbGVkVXAoZmFsc2UpOwotCQkJYWRhcHRlciA9IGl0ZW1Qcm92aWRlcjsKLQkJfQotCQllbHNlIGlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpewotCQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGNoaWxkOwotCQkJb2xkUm9sbGVkVXAgPSBpdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpOwotCQkJaXRlbVByb3ZpZGVyLnNldFJvbGxlZFVwKGZhbHNlKTsKLQkJCWFkYXB0ZXIgPSBpdGVtUHJvdmlkZXI7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0KLQkJCUFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yPE9iamVjdD4gaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjxPYmplY3Q+KAotCQkJCQl3cGJzQWRhcHRlckZhY3RvcnksIGNoaWxkLCBmYWxzZSk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotCQkJCWlmKGZpbHRlclN1cHByZXNzZWQpIHsKLQkJCQkJaWYoIWdldFN1cHByZXNzaW9uKCkuaXNTdXBwcmVzc2VkKG8pKSB7Ci0JCQkJCQlicmVha2Rvd25FbGVtZW50cy5hZGQobyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJyZWFrZG93bkVsZW1lbnRzLmFkZChvKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyByZXN0b3JlIHJvbGxlZC11cCBmbGFnCi0JCQkvLwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWFkYXB0ZXIuc2V0Um9sbGVkVXAob2xkUm9sbGVkVXApOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI3BvcHVsYXRlTm9kZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTm9kZXMoKSB7Ci0JCWJvb2xlYW4gb2xkTm90aWZ5ID0gbm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJdHJ5IHsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0T2JqZWN0KCk7Ci0JCQlpZiAoYWN0ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlpZiAoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJCS8vIHRvIHBvcHVsYXRlIHRoZSB0eXBlZG5vZGUuCi0JCQkJc3VwZXIucG9wdWxhdGVOb2RlcygpOwotCQkJfQotCi0JCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCQlmaWx0ZXIgPSAoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIERFRkFVTFRfQURBUFRFUl9GQUNUT1JJRVNbMF0pCi0JCQkJCQkuZ2V0RmlsdGVyKCk7Ci0JCQl9Ci0KLQkJCS8vIE5vZGUgbmV3Tm9kZSA9IG51bGw7Ci0JCQlBcnJheUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlDb2xsZWN0aW9uIGJyZWFrZG93bkVsZW1lbnRzID0gZ2V0QWxsQnJlYWtkb3duRWxlbWVudHModHJ1ZSk7Ci0JCQlDb2xsZWN0aW9uIHJvbGVEZXNjcmlwdG9ycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYnJlYWtkb3duRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCVRhc2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQ7Ci0JCQkJCUxpc3QgZGVzYyA9IGRlc2NyaXB0b3IKLQkJCQkJCQkuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gZGVzYy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspCXsKLQkJCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yID0gKFJvbGVEZXNjcmlwdG9yKSBpdG9yLm5leHQoKTsKLQkJCQkJCi0JCQkJCQlpZiAocm9sZURlc2NyaXB0b3IgIT0gbnVsbAotCQkJCQkJCQkmJiBmaWx0ZXIuYWNjZXB0KHJvbGVEZXNjcmlwdG9yKQotCQkJCQkJCQkvLyBUT0RPOiBuZWVkIHRvIGNoZWNrIGlmIHRoZSByb2xlIGRlc2NyaXB0b3IgaXMKLQkJCQkJCQkJLy8gaW5oZXJpdGVkIGFuZCBsb2NhbGx5IHN1cHByZXNzZWQKLQkJCQkJCQkJLy8gaWYgbG9jYWxseSBzdXBwcmVzc2VkLCBjaGVjayB0aGUgd3JhcHBlciBvZiB0aGUKLQkJCQkJCQkJLy8gcm9sZSBkZXNjcmlwdG9yCi0JCQkJCQkJCS8vCi0JCQkJCQkJCSYmICFyb2xlRGVzY3JpcHRvci5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkKLQkJCQkJCQkJJiYgIXJvbGVEZXNjcmlwdG9ycy5jb250YWlucyhyb2xlRGVzY3JpcHRvcikpIHsKLQkJCQkJCQlyb2xlRGVzY3JpcHRvcnMuYWRkKHJvbGVEZXNjcmlwdG9yKTsKLQkJCQkJCQkvLyBuZXdOb2RlID0gY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUocm9sZURlc2NyaXB0b3IpOwotCQkJCQkJCS8vIGlmKG5ld05vZGUgIT0gbnVsbCkgewotCQkJCQkJCS8vIGlmKFByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKG9iamVjdCkpIHsKLQkJCQkJCQkvLyAvLyB0YXNrIGRlc2NyaXB0b3IgaXMgaW5oZXJpdGVkLCBpdHMgcHJpbWFyeQotCQkJCQkJCS8vIHBlcmZvcm1lciBpcyBub3QgbG9jYWwKLQkJCQkJCQkvLyAvLyBzZXQgcm9sZSBub2RlIG9mIHRoZSBSb2xlVGFza0NvbXBvc2l0ZSB0bwotCQkJCQkJCS8vIHJlYWQtb25seQotCQkJCQkJCS8vIC8vCi0JCQkJCQkJLy8gTm9kZSByb2xlTm9kZSA9IChOb2RlKQotCQkJCQkJCS8vICgoTm9kZUNvbnRhaW5lciluZXdOb2RlKS5nZXROb2RlcygpLmdldCgwKTsKLQkJCQkJCQkvLyByb2xlTm9kZS5zZXRSZWFkT25seSh0cnVlKTsKLQkJCQkJCQkvLyB9Ci0JCQkJCQkJLy8gbm9kZXMuYWRkKG5ld05vZGUpOwotCQkJCQkJCS8vIH0KLQkJCQkJCQljcmVhdGVSb2xlVGFza0NvbXBvc2l0ZVJvd3Mocm9sZURlc2NyaXB0b3IsIG9iamVjdCwKLQkJCQkJCQkJCW5vZGVzKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChyb2xlRGVzY3JpcHRvcnMuY29udGFpbnMocm9sZURlc2NyaXB0b3IpKSB7Ci0JCQkJCQkJY3JlYXRlVGFza0lucHV0T3V0cHV0Tm9kZXMoZGVzY3JpcHRvciwgbm9kZXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc2VsZWN0Tm9kZXMobm9kZXMpOwotCQl9IGZpbmFsbHkgewotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IG9sZE5vdGlmeTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TnVtYmVyT2ZSb3dzKGludCB0b3RhbFRhc2tzLCBpbnQgdGFza3NQZXJSb3cpIHsKLQkJaW50IG4gPSB0b3RhbFRhc2tzIC8gdGFza3NQZXJSb3c7Ci0JCXJldHVybiAodGFza3NQZXJSb3cgKiBuKSA9PSB0b3RhbFRhc2tzID8gbiA6IG4gKyAxOwotCX0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZVJvd3MoUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IsIAotICAgIAkJT2JqZWN0IG9iamVjdCwgTGlzdCBub2RlcykgewotICAgIAkKLSAgICAJaW50IHRhc2tzUGVyUm93ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRUYXNrc1BlclJvdygpOwotICAgIAlMaXN0PD8+IHByaW1hcnlUYXNrRGVzY3JpcHRvcnMgPSAvL0Fzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMocm9sZURlc2NyaXB0b3IpOwotICAgIAkJZ2V0UmVhbGl6ZWRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjcmlwdG9yKTsKLSAgICAJaW50IHRvdGFsVGFza3MgPSBwcmltYXJ5VGFza0Rlc2NyaXB0b3JzLnNpemUoKTsKLSAgICAJCi0gICAgCWlmICh0YXNrc1BlclJvdyA+IDAgJiYgdG90YWxUYXNrcyA+IDAgJiYgdG90YWxUYXNrcyA+IHRhc2tzUGVyUm93Ci0JCQkJJiYgaXNBdXRvTGF5b3V0KCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0TnVtYmVyT2ZSb3dzKHRvdGFsVGFza3MsIHRhc2tzUGVyUm93KTsgaSsrKSB7Ci0JCQkJTm9kZSBuZXdOb2RlID0gY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUocm9sZURlc2NyaXB0b3IsIGkpOwotCQkJCWlmIChuZXdOb2RlICE9IG51bGwpIHsKLQkJCQkJaWYgKFByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKG9iamVjdCkpIHsKLQkJCQkJCS8vIHRhc2sgZGVzY3JpcHRvciBpcyBpbmhlcml0ZWQsIGl0cyBwcmltYXJ5IHBlcmZvcm1lcgotCQkJCQkJLy8gaXMgbm90IGxvY2FsCi0JCQkJCQkvLyBzZXQgcm9sZSBub2RlIG9mIHRoZSBSb2xlVGFza0NvbXBvc2l0ZSB0byByZWFkLW9ubHkKLQkJCQkJCS8vCi0JCQkJCQlMaXN0PE5vZGU+IG5vZHMgPSAoKE5vZGVDb250YWluZXIpIG5ld05vZGUpLmdldE5vZGVzKCk7Ci0JCQkJCQlpZiAoIW5vZHMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJTm9kZSByb2xlTm9kZSA9IChOb2RlKSBub2RzLmdldCgwKTsKLQkJCQkJCQlyb2xlTm9kZS5zZXRSZWFkT25seSh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlub2Rlcy5hZGQobmV3Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJTm9kZSBuZXdOb2RlID0gY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKG5ld05vZGUgIT0gbnVsbCkgewotCQkJCWlmIChQcm9jZXNzVXRpbC5pc0luaGVyaXRlZChvYmplY3QpKSB7Ci0JCQkJCS8vIHRhc2sgZGVzY3JpcHRvciBpcyBpbmhlcml0ZWQsIGl0cyBwcmltYXJ5IHBlcmZvcm1lciBpcwotCQkJCQkvLyBub3QgbG9jYWwKLQkJCQkJLy8gc2V0IHJvbGUgbm9kZSBvZiB0aGUgUm9sZVRhc2tDb21wb3NpdGUgdG8gcmVhZC1vbmx5Ci0JCQkJCS8vCi0JCQkJCUxpc3Q8Tm9kZT4gbm9kcyA9ICgoTm9kZUNvbnRhaW5lcikgbmV3Tm9kZSkuZ2V0Tm9kZXMoKTsKLQkJCQkJaWYgKCFub2RzLmlzRW1wdHkoKSkgewotCQkJCQkJTm9kZSByb2xlTm9kZSA9IChOb2RlKSBub2RzLmdldCgwKTsKLQkJCQkJCXJvbGVOb2RlLnNldFJlYWRPbmx5KHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCW5vZGVzLmFkZChuZXdOb2RlKTsKLQkJCX0KLQkJfQotICAgIAkKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFza0Rlc2NyaXB0b3IKLQkgKiBAcmV0dXJuCi0JICovCi0JTm9kZSBjcmVhdGVOb2RlKFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yKSB7Ci0JCU5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza05vZGUoKTsKLQkJbm9kZS5zZXRVTUFDb250YWluZXIoZ2V0R3JhcGhOb2RlKCkpOwotCQlub2RlLnNldERpYWdyYW0odGhpcyk7Ci0JCW5vZGUuc2V0T2JqZWN0KHRhc2tEZXNjcmlwdG9yKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuCi0JICovCi0JTm9kZSBjcmVhdGVOb2RlKFdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCU5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpOwotCQlub2RlLnNldFVNQUNvbnRhaW5lcihnZXRHcmFwaE5vZGUoKSk7Ci0JCW5vZGUuc2V0RGlhZ3JhbSh0aGlzKTsKLQkJbm9kZS5zZXRPYmplY3QoZGVzY3JpcHRvcik7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNwb3B1bGF0ZUxpbmtzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUxpbmtzKCkgewotCQlwb3B1bGF0ZUxpbmtzKGdldE5vZGVzKCksIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdOb2RlcwotCSAqIEBwYXJhbSBkaXNhYmxlTm90aWZpY2F0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaW5rcyhDb2xsZWN0aW9uIG5ld05vZGVzLCBib29sZWFuIGRpc2FibGVOb3RpZmljYXRpb24pIHsKLQkJLy8gZmlsbCBvdXRnb2luZy9pbmNvbWluZyBjb25uZWN0aW9uIGxpc3RzIG9mIGFsbCBub2RlcwotCQkvLwotCQlpbnQgc2l6ZSA9IGdldE5vZGVzKCkuc2l6ZSgpOwotCQlib29sZWFuW10gbm90aWZpZXMgPSBuZXcgYm9vbGVhbltzaXplXTsKLQkJdHJ5IHsKLQkJCWlmIChkaXNhYmxlTm90aWZpY2F0aW9uKQotCQkJCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uIGZvciBhbGwgbm9kZXMgaW4gdGhpcyBkaWFncmFtIHRvIGF2b2lkCi0JCQkJLy8gdW53YW50ZWQgY29uY3VycmVudCBtb2RpZmljYXRpb24gb2YgdGhlaXIgY29ubmVjdGlvbiBsaXN0Ci0JCQkJLy8KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlOb2RlIG5vZGUgPSAoKE5vZGUpIGdldE5vZGVzKCkuZ2V0KGkpKTsKLQkJCQkJbm90aWZpZXNbaV0gPSBub2RlLmVEZWxpdmVyKCk7Ci0JCQkJCW5vZGUuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3Tm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTm9kZSBjaGlsZCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZSkgewotCQkJCQkvLyBXb3JrUHJvZHVjdENvbXBvc2l0ZSB3b3JrcHJvZHVjdENvbXBvc2l0ZSA9Ci0JCQkJCS8vIChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgY2hpbGQuZ2V0T2JqZWN0KCk7Ci0JCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdvcmtwcm9kdWN0Q29tcG9zaXRlID0gKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSBjaGlsZDsKLQkJCQkJaWYgKHdvcmtwcm9kdWN0Q29tcG9zaXRlLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpIHsKLQkJCQkJCU9iamVjdCBvYmplY3QgPSB3b3JrcHJvZHVjdENvbXBvc2l0ZS5nZXRPYmplY3QoKTsKLQkJCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQkJCU5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywKLQkJCQkJCQkJCW9iamVjdCwgVGFza05vZGUuY2xhc3MpOwotCQkJCQkJCWlmKG5vZGUgIT0gbnVsbCAmJiBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmRMaW5rKGNoaWxkLCBvYmplY3QpID09IG51bGwpIHsKLQkJCQkJCQkJTGluayBsaW5rID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5rKCk7Ci0JCQkJCQkJCWxpbmsuc2V0U291cmNlKGNoaWxkKTsKLQkJCQkJCQkJbGluay5zZXRUYXJnZXQobm9kZSk7Ci0JCQkJCQkJCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuYWRkR3JhcGhpY2FsRGF0YShsaW5rKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAod29ya3Byb2R1Y3RDb21wb3NpdGUuZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLk9VVFBVVFMpIHsKLQkJCQkJCU9iamVjdCBvYmplY3QgPSB3b3JrcHJvZHVjdENvbXBvc2l0ZS5nZXRPYmplY3QoKTsKLQkJCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQkJCU5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywKLQkJCQkJCQkJCW9iamVjdCwgVGFza05vZGUuY2xhc3MpOwotCQkJCQkJCWlmKG5vZGUgIT0gbnVsbCAmJiBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmRMaW5rKG5vZGUsIG9iamVjdCkgPT0gbnVsbCkgewotCQkJCQkJCQlMaW5rIGxpbmsgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmsoKTsKLQkJCQkJCQkJbGluay5zZXRTb3VyY2Uobm9kZSk7Ci0JCQkJCQkJCWxpbmsuc2V0VGFyZ2V0KGNoaWxkKTsKLQkJCQkJCQkJaWYoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5hZGRHcmFwaGljYWxEYXRhKGxpbmspOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotIAkJfSBmaW5hbGx5IHsKLQkJCWlmIChkaXNhYmxlTm90aWZpY2F0aW9uKQotCQkJCS8vIHJlc3RvcmUgbm90aWZpY2F0aW9uIGZsYWcKLQkJCQkvLwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCSgoRU9iamVjdCkgZ2V0Tm9kZXMoKS5nZXQoaSkpLmVTZXREZWxpdmVyKG5vdGlmaWVzW2ldKTsKLQkJCQl9Ci0JCX0KLQotCX0KLQkKLQlwcml2YXRlIFJvbGVUYXNrQ29tcG9zaXRlIGRvQ3JlYXRlUm9sZVRhc2tDb21wb3NpdGUoUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IsIGludCBpbmRleCkgewotCQlSb2xlVGFza0NvbXBvc2l0ZSByb2xlVGFza0NvbXBvc2l0ZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIGVsZW1lbnQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlKSB7Ci0JCQkJUm9sZVRhc2tDb21wb3NpdGUgcnRjID0gKFJvbGVUYXNrQ29tcG9zaXRlKSBlbGVtZW50OwotCQkJCWlmKHJ0Yy5nZXRMaW5rZWRFbGVtZW50KCkgPT0gcm9sZURlc2NyaXB0b3IgJiYgcnRjLmdldFJvd0luZGV4KCkgPT0gaW5kZXgpIHsKLQkJCQkJcm9sZVRhc2tDb21wb3NpdGUgPSBydGM7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChyb2xlVGFza0NvbXBvc2l0ZSA9PSBudWxsKSB7Ci0JCQlyb2xlVGFza0NvbXBvc2l0ZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKCk7Ci0JCQlyb2xlVGFza0NvbXBvc2l0ZS5zZXRVTUFDb250YWluZXIoZ2V0R3JhcGhOb2RlKCkpOwotCQkJcm9sZVRhc2tDb21wb3NpdGUuc2V0RGlhZ3JhbSh0aGlzKTsKLQkJfQotCQlyZXR1cm4gcm9sZVRhc2tDb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIFJvbGVUYXNrQ29tcG9zaXRlIGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKAotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IpIHsKLQkJUm9sZVRhc2tDb21wb3NpdGUgcm9sZVRhc2tDb21wb3NpdGUgPSBkb0NyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKHJvbGVEZXNjcmlwdG9yLDApOwotCQlyb2xlVGFza0NvbXBvc2l0ZS5zZXRPYmplY3Qocm9sZURlc2NyaXB0b3IpOwotCQlyZXR1cm4gcm9sZVRhc2tDb21wb3NpdGU7Ci0JfQotCQotCXB1YmxpYyBSb2xlVGFza0NvbXBvc2l0ZSBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZSgKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yLCBpbnQgcm93SW5kZXgpIHsKLQkJUm9sZVRhc2tDb21wb3NpdGUgcm9sZVRhc2tDb21wb3NpdGUgPSBkb0NyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKHJvbGVEZXNjcmlwdG9yLCByb3dJbmRleCk7Ci0JCSgoUm9sZVRhc2tDb21wb3NpdGVJbXBsKXJvbGVUYXNrQ29tcG9zaXRlKS5zZXRSb3dJbmRleChyb3dJbmRleCk7Ci0JCXJvbGVUYXNrQ29tcG9zaXRlLnNldE9iamVjdChyb2xlRGVzY3JpcHRvcik7Ci0JCXJldHVybiByb2xlVGFza0NvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgV29ya1Byb2R1Y3RDb21wb3NpdGUgY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoCi0JCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciwgaW50IHR5cGUpIHsKLQkJV29ya1Byb2R1Y3RDb21wb3NpdGUgd29ya3Byb2R1Y3RDb21wb3NpdGUgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBlbGVtZW50ID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZSkgewotCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdwYyA9IChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgZWxlbWVudDsKLQkJCQlpZih3cGMuZ2V0TGlua2VkRWxlbWVudCgpID09IHRhc2tEZXNjcmlwdG9yICYmIHdwYy5nZXRUeXBlKCkgPT0gdHlwZSkgewkJCQkJCi0JCQkJCXdvcmtwcm9kdWN0Q29tcG9zaXRlID0gd3BjOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYod29ya3Byb2R1Y3RDb21wb3NpdGUgPT0gbnVsbCkgewotCQkJd29ya3Byb2R1Y3RDb21wb3NpdGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkuY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoKTsKLQkJCXdvcmtwcm9kdWN0Q29tcG9zaXRlLnNldFR5cGUodHlwZSk7Ci0JCX0KLQkJd29ya3Byb2R1Y3RDb21wb3NpdGUuc2V0VU1BQ29udGFpbmVyKGdldEdyYXBoTm9kZSgpKTsKLQkJd29ya3Byb2R1Y3RDb21wb3NpdGUuc2V0RGlhZ3JhbSh0aGlzKTsKLQkJd29ya3Byb2R1Y3RDb21wb3NpdGUuc2V0T2JqZWN0KHRhc2tEZXNjcmlwdG9yKTsKLQkJcmV0dXJuIHdvcmtwcm9kdWN0Q29tcG9zaXRlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNnZXRUeXBlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiBHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNnZXREaWFncmFtQ2hhbmdlTGlzdGVuZXJUeXBlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0RGlhZ3JhbUNoYW5nZUxpc3RlbmVyVHlwZSgpIHsKLQkJcmV0dXJuIElBY3Rpdml0eURldGFpbERpYWdyYW1DaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwjZ2V0QnJlYWtkb3duRWxlbWVudFR5cGUoKQotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXRCcmVha2Rvd25FbGVtZW50VHlwZSgpIHsKLQkJcmV0dXJuIERlc2NyaXB0b3IuY2xhc3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI3RvTm9kZShvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgdG9Ob2RlKE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlMaXN0IGxpc3QgPSAvL0Fzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMoKFJvbGVEZXNjcmlwdG9yKSBlKTsKLQkJCQlnZXRSZWFsaXplZFByaW1hcnlUYXNrRGVzY3JpcHRvcnMoKFJvbGVEZXNjcmlwdG9yKWUpOwotCQkJaWYoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCWNyZWF0ZVRhc2tJbnB1dE91dHB1dE5vZGVzKChUYXNrRGVzY3JpcHRvcikgb2JqLCBnZXROb2RlcygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUoKFJvbGVEZXNjcmlwdG9yKSBlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCWNyZWF0ZVRhc2tJbnB1dE91dHB1dE5vZGVzKChUYXNrRGVzY3JpcHRvcikgZSwgZ2V0Tm9kZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI2FkZE5vZGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBhZGROb2RlKE9iamVjdCBvYmopIHsKLQkJaWYgKGZpbHRlciA9PSBudWxsKSB7Ci0JCQlmaWx0ZXIgPSAoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIERFRkFVTFRfQURBUFRFUl9GQUNUT1JJRVNbMF0pCi0JCQkJCS5nZXRGaWx0ZXIoKTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IKLQkJCQkmJiAhZmlsdGVyLmFjY2VwdCgoKFRhc2tEZXNjcmlwdG9yKSBvYmopCi0JCQkJCQkuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZSBub2RlID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlMaXN0IGRlc2MgPSAoKFRhc2tEZXNjcmlwdG9yKSBvYmopLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBkZXNjLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykJewotCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yID0gKFJvbGVEZXNjcmlwdG9yKSBpdG9yLm5leHQoKTsKLQkJCQlub2RlID0gZmluZE5vZGUodGhpcywgcm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChub2RlID09IG51bGwpIHsKLQkJCQkJbm9kZSA9IGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKHJvbGVEZXNjcmlwdG9yKTsKLQkJCQkJZ2V0Tm9kZXMoKS5hZGQobm9kZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbm9kZSA9IHN1cGVyLmFkZE5vZGUoZ2V0Tm9kZXMoKSwgb2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlub2RlID0gc3VwZXIuYWRkTm9kZShnZXROb2RlcygpLCBvYmopOwotCQl9Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXBvcHVsYXRlTGlua3MoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChub2RlKSwgZmFsc2UpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNhZGROb2RlcyhqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBhZGROb2RlcyhDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJQ29sbGVjdGlvbiBub2RlcyA9IHN1cGVyLmFkZE5vZGVzKGNvbGxlY3Rpb24pOwotCQlpZiAoIW5vZGVzLmlzRW1wdHkoKSkgewotCQkJcG9wdWxhdGVMaW5rcyhub2RlcywgZmFsc2UpOwotCQl9Ci0JCXJldHVybiBub2RlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwjcmVtb3ZlRnJvbVVtYU1vZGVsKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVVtYU1vZGVsKE5vZGUgcmVtb3ZlZE5vZGUpIHsKLQkJLy8gaWYgdGhlIHJlbW92ZWQgbm9kZSBpcyBhIFRhc2tOb2RlIHRoYXQgaGFkIGJlZW4gbW92ZWQgdG8gYQotCQkvLyBSb2xlVGFza0NvbXBvc2l0ZQotCQkvLyB0aGVuIGl0cyBUYXNrRGVzY3JpcHRvciB3aWxsIG5vdCBiZSByZW1vdmVkIGZyb20gbW9kZWwKLQkJLy8KLQkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywgcmVtb3ZlZE5vZGUuZ2V0T2JqZWN0KCkpICE9IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAocmVtb3ZlZE5vZGUgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZQotCQkJCXx8IHJlbW92ZWROb2RlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGUpCi0JCQlyZXR1cm47Ci0KLQkJc3VwZXIucmVtb3ZlRnJvbVVtYU1vZGVsKHJlbW92ZWROb2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1VtYU1vZGVsKGludCBwb3NpdGlvbiwgTm9kZSBhZGRlZE5vZGUpIHsKLQkJc3VwZXIuYWRkVG9VbWFNb2RlbChwb3NpdGlvbiwgYWRkZWROb2RlKTsKLQotCQlpZiAoYWRkZWROb2RlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRPYmplY3QoKTsKLQkJCS8vIHRyYW5zbGF0ZSBOb2RlIGluZGV4IHRvIEFjdGl2aXR5IGluZGV4Ci0JCQlpbnQgaSA9IHRvQWN0aXZpdHlJbmRleChwb3NpdGlvbik7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJBY3Rpdml0eURldGFpbERpYWdyYW0uYWRkVG9VbWFNb2RlbCgpOiBXb3JrQnJlYWtkb3duRWxlbWVudCBpbmRleDogIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaSA9PSAtMSkgewotCQkJCWFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZCgoQnJlYWtkb3duRWxlbWVudCkgYWRkZWROb2RlLmdldE9iamVjdCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGksIChCcmVha2Rvd25FbGVtZW50KSBhZGRlZE5vZGUuZ2V0T2JqZWN0KCkpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGludCB0b0FjdGl2aXR5SW5kZXgoaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA9PSAtMSkKLQkJCXJldHVybiBpbmRleDsKLQkJaW50IHNpemUgPSBnZXROb2RlcygpLnNpemUoKTsKLQkJaW50IGkgPSBpbmRleCArIDE7Ci0JCWlmIChpID09IHNpemUpCi0JCQlyZXR1cm4gLTE7Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSBnZXROb2RlcygpLmdldChpKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQotCQlmb3IgKDsgIShub2RlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgJiYgaSA8IHNpemU7IGkrKykgewotCQkJbm9kZSA9IChOb2RlKSBnZXROb2RlcygpLmdldChpKTsKLQkJfQotCQlpZiAoaSA9PSBzaXplKQotCQkJcmV0dXJuIC0xOwotCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldE9iamVjdCgpOwotCQlyZXR1cm4gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaW5kZXhPZihub2RlLmdldE9iamVjdCgpKTsKLQotCX0KLQotCXB1YmxpYyBOb2RlIGZpbmROb2RlKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBkaWFncmFtLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgZWxlbWVudCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmplY3QgPT0gZWxlbWVudC5nZXRPYmplY3QoKSkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBZGFwdGVyRmFjdG9yeVtdIERFRkFVTFRfQURBUFRFUl9GQUNUT1JJRVMgPSB7CQkJCi0JCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgCi0JfTsgCi0JCi0JcHVibGljIHZvaWQgY3JlYXRlVGFza0lucHV0T3V0cHV0Tm9kZXMoVGFza0Rlc2NyaXB0b3IgZGVzY3JpcHRvciwgQ29sbGVjdGlvbiBub2RlcykgewotCQlOb2RlIG5ld05vZGUgPSBudWxsOwotCQlpZiAoIWRlc2NyaXB0b3IuZ2V0TWFuZGF0b3J5SW5wdXQoKS5pc0VtcHR5KCkpIHsKLQkJCW5ld05vZGUgPSBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZShkZXNjcmlwdG9yLAotCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpOwotCQkJbm9kZXMuYWRkKG5ld05vZGUpOwotCQl9Ci0JCWlmICghZGVzY3JpcHRvci5nZXRPdXRwdXQoKS5pc0VtcHR5KCkpIHsKLQkJCW5ld05vZGUgPSBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZShkZXNjcmlwdG9yLAotCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKTsKLQkJCW5vZGVzLmFkZChuZXdOb2RlKTsKLQkJfQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI3NldE5ldyhib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5ldyhib29sZWFuIG4pIHsKLQkJc3VwZXIuc2V0TmV3KG4pOwotCQlpZihuKXsKLQkJCWRvU2V0QXV0b0xheW91dCh0cnVlKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQkvKioKLQkgKiBFbmFibGUgdGhpcyBjb2RlLCBvbmNlIHRoZSB0YXNrIGluZGV4IGlzIGZpeGVkIGluIHRoZSByb2xldGFza2NvbXBvc2l0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3ZlTm9kZShPYmplY3QgbW92ZWRPYmplY3QsIGludCBwb3NpdGlvbiwgT2JqZWN0IG9sZFBvc2l0aW9uKSB7Ci0JCWlmKCEobW92ZWRPYmplY3QgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikpCi0JCQlyZXR1cm47Ci0JCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKW1vdmVkT2JqZWN0OwotCQkKLQkJaWYgKCFmaWx0ZXIuYWNjZXB0KHRhc2tEZXNjcmlwdG9yLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkpKQotCQkJcmV0dXJuOwotCQkKLQkJTGlzdCBkZXNjID0gKChUYXNrRGVzY3JpcHRvcikgbW92ZWRPYmplY3QpLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGRlc2MuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KQl7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciA9IChSb2xlRGVzY3JpcHRvcikgaXRvci5uZXh0KCk7Ci0JCQlOb2RlIHJvbGVOb2RlID0gZmluZE5vZGUodGhpcywgcm9sZURlc2NyaXB0b3IpOwotCQkJaWYocm9sZU5vZGUgPT0gbnVsbCkgcmV0dXJuOwotCQkJCi0JCQlpbnQgb2xkUG9zID0gMDsKLQkJCWlmKG9sZFBvc2l0aW9uIGluc3RhbmNlb2YgSW50ZWdlcil7Ci0JCQkJb2xkUG9zID0gKChJbnRlZ2VyKW9sZFBvc2l0aW9uKS5pbnRWYWx1ZSgpOwotCQkJfQotCQkJVGFza05vZGUgdGFza05vZGUgPSAoVGFza05vZGUpR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSgKLQkJCShOb2RlQ29udGFpbmVyKXJvbGVOb2RlLCB0YXNrRGVzY3JpcHRvciwKLQkJCVRhc2tOb2RlLmNsYXNzKTsKLQkJCQotCQkJLy9tb3ZlIHVwCi0JCQlpZihvbGRQb3MgPiBwb3NpdGlvbil7Ci0JCQkJaW50IGkgPSB0YXNrTm9kZS5nZXRJbmRleCgpOwotCQkJCU5vZGUgcHJldk5vZGUgPSBmaW5kVGFza05vZGUoKFJvbGVUYXNrQ29tcG9zaXRlKXJvbGVOb2RlLCBpLTEpOwotCQkJCWlmKHByZXZOb2RlICE9IG51bGwpewotCQkJCQl0YXNrTm9kZS5zZXRJbmRleChpLTEpOwotCQkJCQkoKFRhc2tOb2RlKXByZXZOb2RlKS5zZXRJbmRleChpKTsKLQkJCX0KLQkJCQotCQkJfWVsc2V7Ci0JCQkvLyBtb3ZlIGRvd24KLQkJCQlpbnQgaSA9IHRhc2tOb2RlLmdldEluZGV4KCk7Ci0JCQkJTm9kZSBuZXh0Tm9kZSA9IGZpbmRUYXNrTm9kZSgoUm9sZVRhc2tDb21wb3NpdGUpcm9sZU5vZGUsIGkrMSk7Ci0JCQkJaWYobmV4dE5vZGUgIT0gbnVsbCl7Ci0JCQkJCXRhc2tOb2RlLnNldEluZGV4KGkrMSk7Ci0JCQkJCSgoVGFza05vZGUpbmV4dE5vZGUpLnNldEluZGV4KGkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIE5vZGUgZmluZFRhc2tOb2RlKFJvbGVUYXNrQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IGluZGV4KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRhaW5lci5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBlbGVtZW50ID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tOb2RlKXsKLQkJCQlpZigoKFRhc2tOb2RlKWVsZW1lbnQpLmdldEluZGV4KCkgPT0gaW5kZXgpewotCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldFJlYWxpemVkUHJpbWFyeVRhc2tEZXNjcmlwdG9ycyhSb2xlRGVzY3JpcHRvciByKXsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZihyICE9IG51bGwpewotCQkJTGlzdCBhY3R1YWxMaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UHJpbWFyeVRhc2tEZXNjcmlwdG9ycyhyKTsKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IGdldEFsbEJyZWFrZG93bkVsZW1lbnRzKHRydWUpOwotCQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWN0dWFsTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCQlPYmplY3QgZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZihUbmdVdGlsLmNvbnRhaW5zKGNvbGxlY3Rpb24sIGUpKXsKLQkJCQkJbGlzdC5hZGQoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLX0gLy8gQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvQWN0aXZpdHlEaWFncmFtSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvQWN0aXZpdHlEaWFncmFtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTc2MTVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0FjdGl2aXR5RGlhZ3JhbUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JQWN0aXZpdHlEaWFncmFtQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JQWRhcHRlckZhY3RvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2aXR5IERpYWdyYW08L2I+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+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLlJPTEVfTk9ERTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFJvbGVEZXNjcmlwdG9yQWRhcHRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRBZGFwdGVyIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKSB7Ci0JCXJldHVybiBSb2xlRGVzY3JpcHRvckFkYXB0ZXIuY2xhc3M7Ci0JfQotfSAvLyBSb2xlTm9kZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1JvbGVUYXNrQ29tcG9zaXRlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvUm9sZVRhc2tDb21wb3NpdGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNDZlODIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvUm9sZVRhc2tDb21wb3NpdGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZU5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBUYXNrIENvbXBvc2l0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Sb2xlVGFza0NvbXBvc2l0ZUltcGwjZ2V0Um93SW5kZXggPGVtPlJvdyBJbmRleDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlSW1wbCBleHRlbmRzIE5vZGVDb250YWluZXJJbXBsIGltcGxlbWVudHMKLQkJUm9sZVRhc2tDb21wb3NpdGUgewotCQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb3dJbmRleCgpIDxlbT5Sb3cgSW5kZXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvd0luZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBST1dfSU5ERVhfRURFRkFVTFQgPSAwOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um93SW5kZXgoKSA8ZW0+Um93IEluZGV4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb3dJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCByb3dJbmRleCA9IFJPV19JTkRFWF9FREVGQVVMVDsKLQotLy8JcHJpdmF0ZSBpbnQgcm93SW5kZXg7Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHJvdGVjdGVkIFJvbGVUYXNrQ29tcG9zaXRlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQltZXRob2RFbGVtZW50QWRhcHRlciA9IG5ldyBSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9UQVNLX0NPTVBPU0lURTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJvd0luZGV4KCkgewotCQlyZXR1cm4gcm93SW5kZXg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um93SW5kZXgoaW50IG5ld1Jvd0luZGV4KSB7Ci0JCWludCBvbGRSb3dJbmRleCA9IHJvd0luZGV4OwotCQlyb3dJbmRleCA9IG5ld1Jvd0luZGV4OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuUk9MRV9UQVNLX0NPTVBPU0lURV9fUk9XX0lOREVYLCBvbGRSb3dJbmRleCwgcm93SW5kZXgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ST0xFX1RBU0tfQ09NUE9TSVRFX19ST1dfSU5ERVg6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFJvd0luZGV4KCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ST0xFX1RBU0tfQ09NUE9TSVRFX19ST1dfSU5ERVg6Ci0JCQkJc2V0Um93SW5kZXgoKChJbnRlZ2VyKW5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUk9MRV9UQVNLX0NPTVBPU0lURV9fUk9XX0lOREVYOgotCQkJCXNldFJvd0luZGV4KFJPV19JTkRFWF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ST0xFX1RBU0tfQ09NUE9TSVRFX19ST1dfSU5ERVg6Ci0JCQkJcmV0dXJuIHJvd0luZGV4ICE9IFJPV19JTkRFWF9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJvd0luZGV4OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJvd0luZGV4KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhDb2xsZWN0aW9uIG1peGVkQ29sbGVjdGlvbiwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbWl4ZWRDb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJaWYoIGVsZW1lbnQgPT0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpICkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQkJCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjc2V0T2JqZWN0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBuZXdPYmplY3QpIHsKLQkJc3VwZXIuc2V0T2JqZWN0KG5ld09iamVjdCk7Ci0JCXBvcHVsYXRlTm9kZXMobmV3T2JqZWN0KTsKLS8vCQlpZiAobmV3T2JqZWN0IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLS8vCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IgPSAoUm9sZURlc2NyaXB0b3IpIG5ld09iamVjdDsKLS8vCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCBkaWFncmFtID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpIGdldERpYWdyYW0oKTsKLS8vCQkJQ29sbGVjdGlvbiBhbGxFbGVtZW50cyA9IGRpYWdyYW0uZ2V0QWxsQnJlYWtkb3duRWxlbWVudHMoKTsKLS8vCQkJTGlzdCBwcmltYXJ5VGFza0Rlc2NyaXB0b3JzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UHJpbWFyeVRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzY3JpcHRvcik7Ci0vLwkJCWlmICghcHJpbWFyeVRhc2tEZXNjcmlwdG9ycy5pc0VtcHR5KCkpIHsgLy8gb3ZlcnJpZGluZwotLy8JCQkJCQkJCQkJCQkJCQkJCQotLy8JCQkJLy8gdXNlIGxpc3QgdG8gbWFpbnRhaW4gb3JkZXIgb2YKLS8vCQkJCS8vIHRhc2tkZXNjcmlwdG9ycy4KLS8vCQkJCUxpc3QgdGFza0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQkJdGFza0Rlc2NyaXB0b3JzLmFkZEFsbChwcmltYXJ5VGFza0Rlc2NyaXB0b3JzKTsKLS8vCQkJCS8vIHRhc2tEZXNjcmlwdG9ycy5hZGRBbGwocm9sZURlc2NyaXB0b3IuZ2V0UGVyZm9ybXNBZGRpdGlvbmFsbHkoKSk7Ci0vLwkJCQkvLyB0YXNrRGVzY3JpcHRvcnMuYWRkQWxsKHJvbGVEZXNjcmlwdG9yLmdldEFzc2lzdHNJbigpKTsKLS8vCi0vLwkJCQlIYXNoU2V0IHNlbGVjdGVkRGVzY3JpcHRvcnMgPSBuZXcgSGFzaFNldCgpOwotLy8JCQkJTGlzdCB0YXNrTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCQkKLS8vCQkJCVN0cmluZyBhdXRvbGF5b3V0ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRBdXRvTGF5b3V0RmxhZygoQWN0aXZpdHlEZXRhaWxEaWFncmFtKWdldERpYWdyYW0oKSk7IAotLy8JCQkJaWYoYXV0b2xheW91dCAhPSBudWxsKXsKLS8vCQkJCQlpbnQgaW5kZXggPSAwOwotLy8JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0vLwkJCQkJCW9iaiA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0vLwkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcgotLy8JCQkJCQkJCSYmIFRuZ1V0aWwuY29udGFpbnModGFza0Rlc2NyaXB0b3JzLCBvYmopKSB7Ci0vLwkJCQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgb2JqOwotLy8KLS8vCQkJCQkJCS8vIGVsaW1pbmF0ZSBkZXNjcmlwdG9yIHRoYXQgaXMgZHVwbGljYXRlLAotLy8JCQkJCQkJLy8gc3VwcHJlc3NlZCBvciBmaWx0ZXJlZCBvdXQKLS8vCQkJCQkJCS8vCi0vLwkJCQkJCQlpZiAoIXNlbGVjdGVkRGVzY3JpcHRvcnMuY29udGFpbnModGFza0Rlc2NyaXB0b3IpCi0vLwkJCQkJCQkvLyAmJiBjb250YWlucyhhbGxFbGVtZW50cywgdGFza0Rlc2NyaXB0b3IpIC8vIG1ha2UKLS8vCQkJCQkJCS8vIHN1cmUgdGhhdCB0YXNrIGRlc2NyaXB0b3IgaXMgb2YgdGhlIG93bmluZwotLy8JCQkJCQkJLy8gYWN0aXZpdHkKLS8vCQkJCQkJCSkgewotLy8JCQkJCQkJCXNlbGVjdGVkRGVzY3JpcHRvcnMuYWRkKHRhc2tEZXNjcmlwdG9yKTsKLS8vCQkJCQkJCQlOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKAotLy8JCQkJCQkJCQkJdGhpcywgdGFza0Rlc2NyaXB0b3IsCi0vLwkJCQkJCQkJCQlUYXNrTm9kZS5jbGFzcyk7Ci0vLwkJCQkJCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotLy8JCQkJCQkJCQlub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotLy8JCQkJCQkJCQkJCS5jcmVhdGVUYXNrTm9kZSgpOwotLy8JCQkJCQkJCQlub2RlLnNldERpYWdyYW0oZ2V0RGlhZ3JhbSgpKTsKLS8vCQkJCQkJCQkJbm9kZS5zZXRPYmplY3QodGFza0Rlc2NyaXB0b3IpOwotLy8JCQkJCQkJCQkoKE5hbWVkTm9kZUltcGwpIG5vZGUpCi0vLwkJCQkJCQkJCQkJLnNldEl0ZW1Qcm92aWRlcihhbGxFbGVtZW50cyk7Ci0vLwkJCQkJCQkJCWlmKEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZFByb3BlcnR5KG5vZGUuZ2V0R3JhcGhOb2RlKCksIAotLy8JCQkJCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWCkgPT0gbnVsbAotLy8JCQkJCQkJCQkJCXx8IEdyYXBoaWNhbERhdGFIZWxwZXIuaXNBdXRvTGF5b3V0KChBY3Rpdml0eURldGFpbERpYWdyYW0pZ2V0RGlhZ3JhbSgpKSl7Ci0vLwkJCQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmNyZWF0ZVByb3BlcnR5KG5vZGUKLS8vCQkJCQkJCQkJCQkuZ2V0R3JhcGhOb2RlKCksCi0vLwkJCQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0lOREVYLAotLy8JCQkJCQkJCQkJCW5ldyBJbnRlZ2VyKGluZGV4KS50b1N0cmluZygpKTsKLS8vCQkJCQkJCQkJCWluZGV4Kys7Ci0vLwkJCQkJCQkJCX0KLS8vCQkJCQkJCQkJCi0vLwkJCQkJCQkJfQotLy8JCQkJCQkJCXRhc2tOb2Rlcy5hZGQobm9kZSk7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQkJLy8gU29ydCB0aGUgdGFza05vZGUgYmFzZWQgb24gdGhlaXIgaW5kZXggaWYgYXV0b2xheW91dCBpcwotLy8JCQkJCS8vIGZhbHNlCi0vLwkJCQkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9BVVRPX0xBWU9VVF9WQUxVRV9GQUxTRQotLy8JCQkJCQkJLmVxdWFscyhhdXRvbGF5b3V0KSkgewotLy8JCQkJCQlDb2xsZWN0aW9ucy5zb3J0KHRhc2tOb2RlcywgY29tcGFyYXRvcik7Ci0vLwkJCQkJfQotLy8JCQkgIH1lbHNlewotLy8JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhc2tEZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotLy8JCQkJCQkKLS8vCQkJCQkJLy8gZWxpbWluYXRlIGRlc2NyaXB0b3IgdGhhdCBpcyBkdXBsaWNhdGUsIHN1cHByZXNzZWQgb3IgZmlsdGVyZWQgb3V0Ci0vLwkJCQkJCS8vCi0vLwkJCQkJCWlmKCFzZWxlY3RlZERlc2NyaXB0b3JzLmNvbnRhaW5zKHRhc2tEZXNjcmlwdG9yKQotLy8JCQkJCQkJCSYmIGNvbnRhaW5zKGFsbEVsZW1lbnRzLCB0YXNrRGVzY3JpcHRvcikgLy8gbWFrZSBzdXJlIHRoYXQgdGFzayBkZXNjcmlwdG9yIGlzIG9mIHRoZSBvd25pbmcgYWN0aXZpdHkKLS8vCQkJCQkJKSB7Ci0vLwkJCQkJCQlzZWxlY3RlZERlc2NyaXB0b3JzLmFkZCh0YXNrRGVzY3JpcHRvcik7CQkJCQkKLS8vCQkJCQkJTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZShnZXREaWFncmFtKCksCi0vLwkJCQkJCQkJCXRhc2tEZXNjcmlwdG9yLCBUYXNrTm9kZS5jbGFzcyk7Ci0vLwkJCQkJCWlmIChub2RlID09IG51bGwpIHsKLS8vCQkJCQkJCW5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tOb2RlKCk7Ci0vLwkJCQkJCQlub2RlLnNldERpYWdyYW0oZ2V0RGlhZ3JhbSgpKTsKLS8vCQkJCQkJCW5vZGUuc2V0T2JqZWN0KHRhc2tEZXNjcmlwdG9yKTsKLS8vCQkJCQkJCSgoTmFtZWROb2RlSW1wbCkgbm9kZSkuc2V0SXRlbVByb3ZpZGVyKGFsbEVsZW1lbnRzKTsKLS8vCQkJCQkJfQotLy8JCQkJCQl0YXNrTm9kZXMuYWRkKG5vZGUpOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQkJaWYoIXRhc2tOb2Rlcy5pc0VtcHR5KCkpIHsKLS8vCQkJCQkvLyBhZGQgcm9sZSBub2RlCi0vLwkJCQkJLy8KLS8vCQkJCQlOb2RlIG5vZGUgPSAoTmFtZWROb2RlSW1wbCkgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlTm9kZSgpOwotLy8JCQkJCW5vZGUuc2V0RGlhZ3JhbShnZXREaWFncmFtKCkpOwotLy8JCQkJCW5vZGUuc2V0T2JqZWN0KHJvbGVEZXNjcmlwdG9yKTsKLS8vCQkJCQkoKE5hbWVkTm9kZUltcGwpIG5vZGUpLnNldEl0ZW1Qcm92aWRlcihhbGxFbGVtZW50cyk7Ci0vLwkJCQkJZ2V0Tm9kZXMoKS5hZGQobm9kZSk7Ci0vLwkJCQkJLy8gYWRkIHRhc2sgbm9kZXMKLS8vCQkJCQkvLwotLy8JCQkJCWdldE5vZGVzKCkuYWRkQWxsKHRhc2tOb2Rlcyk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0KLQkJCi0JfQotCQotCXB1YmxpYyBHcmFwaE5vZGUgZ2V0R3JhcGhOb2RlKE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCkgewotCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQlpZiAoZ2V0VU1BRGlhZ3JhbSgpID09IG51bGwpIHsKLQkJCQkvLyBuZXcgTWV0aG9kRWxlbWVudAotCQkJCS8vCi0JCQkJcmV0dXJuIEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuY3JlYXRlR3JhcGhOb2RlKG1ldGhvZEVsZW1lbnQpOwotCQkJfQotCQkJR3JhcGhOb2RlIG5vZGUgPSBmaW5kR3JhcGhOb2RlKGdldFVNQURpYWdyYW0oKSwgbWV0aG9kRWxlbWVudCk7Ci0JCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJbm9kZSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuY3JlYXRlR3JhcGhOb2RlKG1ldGhvZEVsZW1lbnQpOwotCQkJCS8vIGNyZWF0ZUdyYXBoQ29ubmVjdG9ycyhub2RlLCBnZXRVTUFEaWFncmFtKCkpOwotCQkJCWdldFVNQURpYWdyYW0oKS5nZXRDb250YWluZWQoKS5hZGQobm9kZSk7Ci0JCQl9Ci0JCQlTdHJpbmcgYXV0b2xheW91dCA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0QXV0b0xheW91dEZsYWcoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSlnZXREaWFncmFtKCkpOwotCQkJaWYoYXV0b2xheW91dCAhPSBudWxsKXsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmNyZWF0ZVByb3BlcnR5KG5vZGUsIEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWCwgbmV3IEludGVnZXIocm93SW5kZXgpLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEdyYXBoTm9kZSBmaW5kR3JhcGhOb2RlKERpYWdyYW0gZGlhZ3JhbSwgT2JqZWN0IG1ldGhvZEVsZW1lbnQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXRDb250YWluZWQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUdyYXBoTm9kZSBlbGVtZW50ID0gKEdyYXBoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5nZXRTZW1hbnRpY01vZGVsKCkgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlCi0JCQkJCSYmIG1ldGhvZEVsZW1lbnQgPT0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBlbGVtZW50Ci0JCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKSkuZ2V0RWxlbWVudCgpKSB7Ci0KLQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZFByb3BlcnR5KGVsZW1lbnQsIEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWCk7Ci0JCQkJCi0JCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGluZGV4ID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKGluZGV4ICE9IG51bGwpIHsKLQkJCQkJCWlmIChnZXRSb3dJbmRleCgpID09IG5ldyBJbnRlZ2VyKGluZGV4KS5pbnRWYWx1ZSgpKQotCQkJCQkJCXJldHVybiBlbGVtZW50OwotCQkJCQl9Ci0JCQkJfWVsc2V7Ci0JCQkJCXJldHVybiBlbGVtZW50OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0vLwlwdWJsaWMgR3JhcGhOb2RlIGNyZWF0ZUdyYXBoTm9kZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLS8vCQlHcmFwaE5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuY3JlYXRlR3JhcGhOb2RlKGVsZW1lbnQpOwotLy8JCUdyYXBoaWNhbERhdGFIZWxwZXIuY3JlYXRlUHJvcGVydHkobm9kZSwKLS8vCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWCwgbmV3IEludGVnZXIocm93SW5kZXgpCi0vLwkJCQkJCS50b1N0cmluZygpKTsKLS8vCQlyZXR1cm4gbm9kZTsKLS8vCX0KLQkKLQlwcml2YXRlIGNsYXNzIFJvbGVEZXNjcmlwdG9yQWRhcHRlciBleHRlbmRzIFRyYW5zYWN0aW9uYWxOb2RlTGluayB7Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZihtc2cgaW5zdGFuY2VvZiBPcHBvc2l0ZUZlYXR1cmVOb3RpZmljYXRpb24pIHsKLQkJCQlPYmplY3QgZmVhdHVyZSA9ICgoT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uKW1zZykuZ2V0T3Bwc2l0ZUZlYXR1cmUoKTsKLQkJCQlpZihmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX1ByaW1hcnlUYXNrRGVzY3JpcHRvcnMpIHsKLQkJCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQkJYWRkTm9kZSgoVGFza0Rlc2NyaXB0b3IpIG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCQlyZW1vdmVOb2RlKG1zZy5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJCWFkZE5vZGUoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJCXJlbW92ZU5vZGUoKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJCWJyZWFrOwkJCQkJCQotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoQWN0aXZpdHkuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLk1PVkU6Ci0vLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJNT1ZFRUVFRUVFRCIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvbGRWYWx1ZQotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVOb2RlKE9iamVjdCBvbGRWYWx1ZSkgewotCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIGRpYWdyYW0gPSBnZXREaWFncmFtKCk7Ci0JCWlmKGRpYWdyYW0gPT0gbnVsbCkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJSb2xlVGFza0NvbXBvc2l0ZUltcGwucmVtb3ZlTm9kZSgpOiBbRVJST1JdIG5vIGRpYWdyYW0iKTsKLQkJfQotCQlDb2xsZWN0aW9uIHJlbW92ZWROb2RlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG9sZFZhbHVlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIFJvbGVOb2RlKSB7Ci0JCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwgZCA9IChBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKWdldERpYWdyYW0oKTsKLQkJCQkJTGlzdCBsaXN0ID0gZC5nZXRSZWFsaXplZFByaW1hcnlUYXNrRGVzY3JpcHRvcnMoKFJvbGVEZXNjcmlwdG9yKSBub2RlLmdldE9iamVjdCgpKTsKLQkJCQkJaWYgKGxpc3QgPT0gbnVsbCB8fCBsaXN0LnNpemUoKSA8IDEpIHsKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQlyZW1vdmVkTm9kZXMuYWRkKG5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5vZGUuZ2V0T2JqZWN0KCkgPT0gb2xkVmFsdWUpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCXJlbW92ZWROb2Rlcy5hZGQobm9kZSk7Ci0JCQkJaWYgKG9sZFZhbHVlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJTm9kZSB3cG5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKAotCQkJCQkJCShBY3Rpdml0eURldGFpbERpYWdyYW0pIGdldERpYWdyYW0oKSwgb2xkVmFsdWUpOwotCQkJCQlnZXREaWFncmFtKCkuZ2V0Tm9kZXMoKS5yZW1vdmUod3Bub2RlKTsKLQkJCQkJd3Bub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSgKLQkJCQkJCQkoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBnZXREaWFncmFtKCksIG9sZFZhbHVlKTsKLQkJCQkJZ2V0RGlhZ3JhbSgpLmdldE5vZGVzKCkucmVtb3ZlKHdwbm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChub2Rlcy5pc0VtcHR5KCkpIHsKLQkJCWdldERpYWdyYW0oKS5nZXROb2RlcygpLnJlbW92ZSh0aGlzKTsKLQkJfQotCQkvLyBwdXNoQmFja1RvRGlhZ3JhbShyZW1vdmVkTm9kZXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE5vZGUoVGFza0Rlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlhZGROb2RlKGdldE5vZGVzKCksIGRlc2NyaXB0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGROb2RlKENvbGxlY3Rpb24gbm9kZXMsIFRhc2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJaWYoZGVzY3JpcHRvci5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCBkaWFncmFtID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpIGdldERpYWdyYW0oKTsKLQkJTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSh0aGlzLAotCQkJCWRlc2NyaXB0b3IsIFRhc2tOb2RlLmNsYXNzKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJbm9kZSA9IGRpYWdyYW0uY3JlYXRlTm9kZShkZXNjcmlwdG9yKTsKLQkJCWlmKG5vZGUgIT0gbnVsbCkgewotCQkJCWludCBpID0gZ2V0TmV4dEluZGV4KGdldE5vZGVzKCkpOwotCQkJCWlmIChub2RlIGluc3RhbmNlb2YgVGFza05vZGVJbXBsKSB7Ci0JCQkJCSgoVGFza05vZGVJbXBsKSBub2RlKS5kb1NldEluZGV4KGkgKyAxKTsKLQkJCQl9Ci0JCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJCUNvbGxlY3Rpb24gaW5wdXRPdXRwdXROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlkaWFncmFtLmNyZWF0ZVRhc2tJbnB1dE91dHB1dE5vZGVzKGRlc2NyaXB0b3IsIGlucHV0T3V0cHV0Tm9kZXMpOwkJCQkKLQkJCQlpZiAoIWlucHV0T3V0cHV0Tm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCWRpYWdyYW0uZ2V0Tm9kZXMoKS5hZGRBbGwoaW5wdXRPdXRwdXROb2Rlcyk7Ci0JCQkJCWRpYWdyYW0ucG9wdWxhdGVMaW5rcyhpbnB1dE91dHB1dE5vZGVzLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotIAkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvbGRWYWx1ZQotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVOb2RlKENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJQ29sbGVjdGlvbiBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudHMuY29udGFpbnMobm9kZS5nZXRPYmplY3QoKSkpIHsKLQkJCQlub2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJZ2V0Tm9kZXMoKS5yZW1vdmVBbGwobm9kZXMpOwotCQkvLyBwdXNoQmFja1RvRGlhZ3JhbShub2Rlcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE5vZGUoQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQlDb2xsZWN0aW9uIG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVRhc2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJYWRkTm9kZShub2RlcywgZGVzY3JpcHRvcik7Ci0JCX0KLQotCQlnZXROb2RlcygpLmFkZEFsbChub2Rlcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2dldE1ldGhvZEVsZW1lbnRBZGFwdGVyVHlwZSgpCi0JICovCi0JcHVibGljIENsYXNzIGdldE1ldGhvZEVsZW1lbnRBZGFwdGVyVHlwZSgpIHsKLQkJcmV0dXJuIFJvbGVEZXNjcmlwdG9yQWRhcHRlci5jbGFzczsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGdldE5leHRJbmRleChMaXN0IG5vZGVzKSB7Ci0JCWludCBpbmRleCA9IDA7Ci0JCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsJCQkKLS8vCQkJaWYob2JqIGluc3RhbmNlb2YgTm9kZSl7Ci0vLwkJCQlOb2RlIG5vZGUgPSAoTm9kZSlvYmo7Ci0vLwkJCQkvL1N0cmluZyB0ZW1wID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kUHJvcGVydHkobm9kZS5nZXRHcmFwaE5vZGUoKSwgR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0lOREVYKS5nZXRWYWx1ZSgpOwotLy8JCQkJTGlzdCBsaXN0ID0gbm9kZS5nZXRHcmFwaE5vZGUoKS5nZXRMaXN0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFkpOwotLy8JCQkJaWYobGlzdCAhPSBudWxsICYmICFsaXN0LmlzRW1wdHkoKSl7Ci0vLwkJCQkJZm9yIChpbnQgaSA9IGxpc3Quc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLS8vCQkJCQkJUHJvcGVydHkgcHJvcCA9IChQcm9wZXJ0eSkgbGlzdC5nZXQoaSk7Ci0vLwkJCQkJCWlmIChHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfSU5ERVguZXF1YWxzKHByb3AuZ2V0S2V5KCkpKXsKLS8vCQkJCQkJCWludCB0ZW1wICA9IEludGVnZXIucGFyc2VJbnQocHJvcC5nZXRWYWx1ZSgpKTsKLS8vCQkJCQkJCWlmKHRlbXAgPiBpbmRleCApIGluZGV4ID0gdGVtcDsKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotCQkJaWYob2JqIGluc3RhbmNlb2YgVGFza05vZGVJbXBsKSB7Ci0JCQkJaW50IGlkID0gKChUYXNrTm9kZUltcGwpb2JqKS5kb0dldEluZGV4KCk7Ci0JCQkJaWYoaWQgPiBpbmRleCkgewotCQkJCQlpbmRleCA9IGlkOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgY29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkgewotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIpIHsKLQkJCWlmIChvYmoxID09IG9iajIpCi0JCQkJcmV0dXJuIDA7Ci0JCQlpZihvYmoxIGluc3RhbmNlb2YgVGFza05vZGVJbXBsICYmIG9iajIgaW5zdGFuY2VvZiBUYXNrTm9kZUltcGwpewotCQkJCVRhc2tOb2RlSW1wbCBub2RlMSA9IChUYXNrTm9kZUltcGwpb2JqMTsKLQkJCQlUYXNrTm9kZUltcGwgbm9kZTIgPSAoVGFza05vZGVJbXBsKW9iajI7Ci0JCQkJaWYobm9kZTEuZG9HZXRJbmRleCgpID4gIG5vZGUyLmRvR2V0SW5kZXgoKSkKLQkJCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JfTsKLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVRhc2tJbnB1dE91dHB1dE5vZGVzKFRhc2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIENvbGxlY3Rpb24gbm9kZXMpIHsKLQkJTm9kZSBuZXdOb2RlID0gbnVsbDsKLQkJaWYgKCFkZXNjcmlwdG9yLmdldE1hbmRhdG9yeUlucHV0KCkuaXNFbXB0eSgpKSB7Ci0JCQluZXdOb2RlID0gY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoZGVzY3JpcHRvciwKLQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUuSU5QVVRTKTsKLQkJCW5vZGVzLmFkZChuZXdOb2RlKTsKLQkJfQotCQlpZiAoIWRlc2NyaXB0b3IuZ2V0T3V0cHV0KCkuaXNFbXB0eSgpKSB7Ci0JCQluZXdOb2RlID0gY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoZGVzY3JpcHRvciwKLQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUuT1VUUFVUUyk7Ci0JCQlub2Rlcy5hZGQobmV3Tm9kZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFdvcmtQcm9kdWN0Q29tcG9zaXRlIGNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlKAotCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IsIGludCB0eXBlKSB7Ci0JCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdvcmtwcm9kdWN0Q29tcG9zaXRlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZSgpOwotCQl3b3JrcHJvZHVjdENvbXBvc2l0ZS5zZXRVTUFDb250YWluZXIoZ2V0R3JhcGhOb2RlKCkpOwotCQl3b3JrcHJvZHVjdENvbXBvc2l0ZS5zZXREaWFncmFtKGdldERpYWdyYW0oKSk7Ci0JCXdvcmtwcm9kdWN0Q29tcG9zaXRlLnNldFR5cGUodHlwZSk7Ci0JCXdvcmtwcm9kdWN0Q29tcG9zaXRlLnNldE9iamVjdCh0YXNrRGVzY3JpcHRvcik7Ci0JCXJldHVybiB3b3JrcHJvZHVjdENvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBUYXNrTm9kZSBjcmVhdGVUYXNrTm9kZShUYXNrRGVzY3JpcHRvciB0ZCkgewotCQlUYXNrTm9kZSB0YXNrTm9kZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihub2RlIGluc3RhbmNlb2YgVGFza05vZGUpIHsKLQkJCQlUYXNrTm9kZSB0biA9IChUYXNrTm9kZSkgbm9kZTsKLQkJCQlpZih0bi5nZXRMaW5rZWRFbGVtZW50KCkgPT0gdGQpIHsKLQkJCQkJdGFza05vZGUgPSB0bjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKHRhc2tOb2RlID09IG51bGwpIHsKLQkJCXRhc2tOb2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrTm9kZSgpOwotCQkJdGFza05vZGUuc2V0RGlhZ3JhbShnZXREaWFncmFtKCkpOwotCQl9Ci0JCXRhc2tOb2RlLnNldE9iamVjdCh0ZCk7Ci0JCXJldHVybiB0YXNrTm9kZTsKLQl9Ci0JCi0JcHJpdmF0ZSBSb2xlTm9kZSBjcmVhdGVSb2xlTm9kZShSb2xlRGVzY3JpcHRvciByZCkgewotCQlSb2xlTm9kZSByb2xlTm9kZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihub2RlIGluc3RhbmNlb2YgUm9sZU5vZGUpIHsKLQkJCQlSb2xlTm9kZSBybiA9IChSb2xlTm9kZSkgbm9kZTsKLQkJCQlpZihybi5nZXRMaW5rZWRFbGVtZW50KCkgPT0gcmQpIHsKLQkJCQkJcm9sZU5vZGUgPSBybjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKHJvbGVOb2RlID09IG51bGwpIHsKLQkJCXJvbGVOb2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlTm9kZSgpOwotCQkJcm9sZU5vZGUuc2V0RGlhZ3JhbShnZXREaWFncmFtKCkpOwotCQkJcm9sZU5vZGUuc2V0T2JqZWN0KHJkKTsKLQkJfQotCQlyZXR1cm4gcm9sZU5vZGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHBvcHVsYXRlTm9kZXMoT2JqZWN0IG5ld09iamVjdCl7Ci0JCQotCQlpZiAobmV3T2JqZWN0IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yID0gKFJvbGVEZXNjcmlwdG9yKSBuZXdPYmplY3Q7Ci0JCQlBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsIGRpYWdyYW0gPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCkgZ2V0RGlhZ3JhbSgpOwotCQkJQ29sbGVjdGlvbiBhbGxFbGVtZW50cyA9IGRpYWdyYW0uZ2V0QWxsQnJlYWtkb3duRWxlbWVudHModHJ1ZSk7Ci0JCQlMaXN0IHRhc2tOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUxpc3QgcHJpbWFyeVRhc2tEZXNjcmlwdG9ycyA9IEFzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKCFwcmltYXJ5VGFza0Rlc2NyaXB0b3JzLmlzRW1wdHkoKSkgeyAvLyBvdmVycmlkaW5nCi0JCQkJCQkJCQkJCQkJCQkJCQotCQkJCUxpc3QgdGFza0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXRhc2tEZXNjcmlwdG9ycy5hZGRBbGwocHJpbWFyeVRhc2tEZXNjcmlwdG9ycyk7Ci0JCQkJSGFzaFNldCBzZWxlY3RlZERlc2NyaXB0b3JzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlib29sZWFuIGF1dG9MYXlvdXQgPSAoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpZ2V0RGlhZ3JhbSgpKS5pc0F1dG9MYXlvdXQoKTsKLQkJCQlpZihhdXRvTGF5b3V0KSB7Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCWludCByb3dUYXNrc0NvdW50ID0gMDsKLQkJCQkJaW50IHN0YXJ0Q291bnQgPSAwOwotCQkJCQkKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWxsRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlvYmogPSBUbmdVdGlsLnVud3JhcChvYmopOwotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yCi0JCQkJCQkJCSYmIFRuZ1V0aWwuY29udGFpbnModGFza0Rlc2NyaXB0b3JzLCBvYmopKSB7Ci0JCQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIG9iajsKLQkJCQkJCQkKLQkJCQkJCQlpZihzdGFydENvdW50IDwgcm93SW5kZXggKiBHcmFwaGljYWxEYXRhSGVscGVyLmdldFRhc2tzUGVyUm93KCkpewotCQkJCQkJCQlzdGFydENvdW50Kys7Ci0JCQkJCQkJfSBlbHNlIHsKLQotCQkJCQkJCQlpZiAoIXNlbGVjdGVkRGVzY3JpcHRvcnMKLQkJCQkJCQkJCQkuY29udGFpbnModGFza0Rlc2NyaXB0b3IpKSB7Ci0JCQkJCQkJCQlzZWxlY3RlZERlc2NyaXB0b3JzLmFkZCh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJCQkJCQlOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKAotCQkJCQkJCQkJCQl0aGlzLCB0YXNrRGVzY3JpcHRvciwKLQkJCQkJCQkJCQkJVGFza05vZGUuY2xhc3MpOwotCQkJCQkJCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotLy8JCQkJCQkJCQkJbm9kZSA9IGNyZWF0ZVRhc2tOb2RlKHRhc2tEZXNjcmlwdG9yLAotLy8JCQkJCQkJCQkJCQlpbmRleCwgYWxsRWxlbWVudHMpOwotCQkJCQkJCQkJCW5vZGUgPSBjcmVhdGVUYXNrTm9kZSh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJCQkJCQkJVGFza05vZGVJbXBsIHRuID0gKFRhc2tOb2RlSW1wbCkgbm9kZTsKLQkJCQkJCQkJCQlpZiAoYXV0b0xheW91dCB8fCB0bi5kb0dldEluZGV4KCkgPT0gLTEpIHsKLQkJCQkJCQkJCQkJdG4uZG9TZXRJbmRleChpbmRleCk7Ci0vLwkJCQkJCQkJCQkJaW5kZXgrKzsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJLy9yZXR1cm4gbm9kZTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCS8vIHRoaXMgd2lsbCBtYWtlIHN1cmUgdGhhdCBsaW5rIGJldHdlZW4gdGhlIG5vZGUgYW5kIGxpbmtlZCBlbGVtZW50IGlzIGVzdGFibGlzaGVkCi0JCQkJCQkJCQkJLy8KLQkJCQkJCQkJCQlub2RlLnNldE9iamVjdCh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQkoKE5hbWVkTm9kZUltcGwpIG5vZGUpLnNldEl0ZW1Qcm92aWRlcihhbGxFbGVtZW50cyk7Ci0KLQkJCQkJCQkJCWlmIChyb3dUYXNrc0NvdW50IDwgR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCQkJCQkuZ2V0VGFza3NQZXJSb3coKSkgewotCQkJCQkJCQkJCXRhc2tOb2Rlcy5hZGQobm9kZSk7Ci0JCQkJCQkJCQkJaWYobm9kZSBpbnN0YW5jZW9mIFRhc2tOb2RlKXsKLQkJCQkJCQkJCQkJKChUYXNrTm9kZSlub2RlKS5zZXRJbmRleChpbmRleCk7Ci0JCQkJCQkJCQkJCWluZGV4Kys7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCXJvd1Rhc2tzQ291bnQrKzsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gU29ydCB0aGUgdGFza05vZGUgYmFzZWQgb24gdGhlaXIgaW5kZXggaWYgYXV0b2xheW91dCBpcwotCQkJCQkvLyBmYWxzZQotCQkJCQlpZiAoIWF1dG9MYXlvdXQpIHsKLQkJCQkJCUNvbGxlY3Rpb25zLnNvcnQodGFza05vZGVzLCBjb21wYXJhdG9yKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUxpc3Qgb2xkVGFza0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlEaWFncmFtIHVtYURpYWdyYW0gPSBnZXRVTUFEaWFncmFtKCk7Ci0JCQkJCWlmKHVtYURpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJLy8gTGFtZSB3YXkgb2YgZG9pbmcgdGhpcywgdG8gZml4IGEgZGVmZWN0IG9mIDEuMCB0byAxLjAuMSBtaWdyYXRpb24JCQkJICAKLQkJCQkJCUxpc3QgZ3JhcGhOb2RlcyA9IHVtYURpYWdyYW0uZ2V0Q29udGFpbmVkKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBncmFwaE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCUdyYXBoTm9kZSBlbGVtZW50ID0gKEdyYXBoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJT2JqZWN0IGJyaWRnZSA9IGVsZW1lbnQuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCQkJCWlmKGJyaWRnZSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpewotCQkJCQkJCQlPYmplY3QgdGFza09iamVjdCA9ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSlicmlkZ2UpLmdldEVsZW1lbnQoKTsKLQkJCQkJCQkJTGlzdCBsaXN0ID0gZWxlbWVudC5nZXRMaXN0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFkpOwotCQkJCQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0UHJvcGVydHlCeUtleShsaXN0LAotCQkJCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX1RZUEUpOwotCQkJCQkJCQlpZiAodGFza0Rlc2NyaXB0b3JzLmNvbnRhaW5zKHRhc2tPYmplY3QpICYmIHByb3BlcnR5ID09IG51bGwpIHsKLQkJCQkJCQkJCW9sZFRhc2tEZXNjcmlwdG9ycy5hZGQodGFza09iamVjdCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYobm9kZS5nZXRMaW5rZWRFbGVtZW50KCkgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQkJCQlvbGRUYXNrRGVzY3JpcHRvcnMuYWRkKG5vZGUuZ2V0TGlua2VkRWxlbWVudCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2xkVGFza0Rlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCi0JCQkJCQkvLyBlbGltaW5hdGUgZGVzY3JpcHRvciB0aGF0IGlzIGR1cGxpY2F0ZSwgc3VwcHJlc3NlZCBvciBmaWx0ZXJlZCBvdXQKLQkJCQkJCS8vCi0JCQkJCQlpZighc2VsZWN0ZWREZXNjcmlwdG9ycy5jb250YWlucyh0YXNrRGVzY3JpcHRvcikKLQkJCQkJCQkJJiYgY29udGFpbnMoYWxsRWxlbWVudHMsIHRhc2tEZXNjcmlwdG9yKSAvLyBtYWtlIHN1cmUgdGhhdCB0YXNrIGRlc2NyaXB0b3IgaXMgb2YgdGhlIG93bmluZyBhY3Rpdml0eQotCQkJCQkJKSB7Ci0JCQkJCQkJc2VsZWN0ZWREZXNjcmlwdG9ycy5hZGQodGFza0Rlc2NyaXB0b3IpOwkJCQkJCi0JCQkJCQkJTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZShnZXREaWFncmFtKCksCi0JCQkJCQkJCQl0YXNrRGVzY3JpcHRvciwgVGFza05vZGUuY2xhc3MpOwotCQkJCQkJCWlmIChub2RlID09IG51bGwpIHsKLQkJCQkJCQkJbm9kZSA9IGNyZWF0ZVRhc2tOb2RlKHRhc2tEZXNjcmlwdG9yKTsKLQkJCQkJCQkJKChOYW1lZE5vZGVJbXBsKSBub2RlKS5zZXRJdGVtUHJvdmlkZXIoYWxsRWxlbWVudHMpOwotCQkJCQkJCX0KLQkJCQkJCQl0YXNrTm9kZXMuYWRkKG5vZGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYoIXRhc2tOb2Rlcy5pc0VtcHR5KCkpIHsKLQkJCQkvLyBhZGQgcm9sZSBub2RlCi0JCQkJLy8KLQkJCQlOYW1lZE5vZGVJbXBsIG5hbWVkTm9kZSA9ICgoTmFtZWROb2RlSW1wbCkgY3JlYXRlUm9sZU5vZGUocm9sZURlc2NyaXB0b3IpKTsKLQkJCQluYW1lZE5vZGUudmlzaWJsZSA9IHRydWU7Ci0JCQkJbmFtZWROb2RlLnNldEl0ZW1Qcm92aWRlcihhbGxFbGVtZW50cyk7Ci0JCQkJZ2V0Tm9kZXMoKS5hZGQobmFtZWROb2RlKTsJCQotCQkJCXRhc2tOb2Rlcy5hZGQobmFtZWROb2RlKTsKLQkJCX0KLQkJCXNlbGVjdE5vZGVzKHRhc2tOb2Rlcyk7Ci0JCX0KLQkJCi0JfQotCQotLy8JcHVibGljIE5vZGUgY3JlYXRlVGFza05vZGUoVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IsIGludCBpbmRleCwgQ29sbGVjdGlvbiBhbGxFbGVtZW50cykgewotLy8JCU5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza05vZGUoKTsKLS8vCQlub2RlLnNldERpYWdyYW0oZ2V0RGlhZ3JhbSgpKTsKLS8vCQlub2RlLnNldE9iamVjdCh0YXNrRGVzY3JpcHRvcik7Ci0vLwkJKChOYW1lZE5vZGVJbXBsKSBub2RlKS5zZXRJdGVtUHJvdmlkZXIoYWxsRWxlbWVudHMpOwotLy8JCWlmIChHcmFwaGljYWxEYXRhSGVscGVyLmZpbmRQcm9wZXJ0eShub2RlLmdldEdyYXBoTm9kZSgpLAotLy8JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0lOREVYKSA9PSBudWxsCi0vLwkJCQl8fCBHcmFwaGljYWxEYXRhSGVscGVyCi0vLwkJCQkJCS5pc0F1dG9MYXlvdXQoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgZ2V0RGlhZ3JhbSgpKSkgewotLy8JCQlHcmFwaGljYWxEYXRhSGVscGVyLmNyZWF0ZVByb3BlcnR5KG5vZGUuZ2V0R3JhcGhOb2RlKCksCi0vLwkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0lOREVYLCBuZXcgSW50ZWdlcihpbmRleCkKLS8vCQkJCQkJCS50b1N0cmluZygpKTsKLS8vCQkJaW5kZXgrKzsKLS8vCQl9Ci0vLwkJcmV0dXJuIG5vZGU7Ci0vLwl9Ci0JCi19IC8vIFJvbGVUYXNrQ29tcG9zaXRlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvVGFza05vZGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9UYXNrTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVhMjFlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9UYXNrTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrIE5vZGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuVGFza05vZGVJbXBsI2dldEluZGV4IDxlbT5JbmRleDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tOb2RlSW1wbCBleHRlbmRzIE5hbWVkTm9kZUltcGwgaW1wbGVtZW50cyBUYXNrTm9kZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluZGV4KCkgPGVtPkluZGV4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhfRURFRkFVTFQgPSAtMTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluZGV4KCkgPGVtPkluZGV4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCBpbmRleCA9IElOREVYX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHJvdGVjdGVkIFRhc2tOb2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQltZXRob2RFbGVtZW50QWRhcHRlciA9IG5ldyBUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuVEFTS19OT0RFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0JCi0JcHVibGljIGludCBkb0dldEluZGV4KCkgewotCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQlQcm9wZXJ0eSBwcm9wID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRQcm9wZXJ0eSh0aGlzLCBHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfSU5ERVgpOwotCQkJaWYocHJvcCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW50IGkgPSBJbnRlZ2VyLnBhcnNlSW50KHByb3AuZ2V0VmFsdWUoKSk7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCQljYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQkvLwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0SW5kZXgoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmRleChpbnQgbmV3SW5kZXgpIHsKLQkJaW50IG9sZEluZGV4ID0gaW5kZXg7Ci0JCWluZGV4ID0gbmV3SW5kZXg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5UQVNLX05PREVfX0lOREVYLCBvbGRJbmRleCwgaW5kZXgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9TZXRJbmRleChpbnQgbmV3SW5kZXgpIHsKLQkJaWYoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5jcmVhdGVQcm9wZXJ0eShnZXRHcmFwaE5vZGUoKSwgCi0JCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWCwgU3RyaW5nLnZhbHVlT2YobmV3SW5kZXgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXNldEluZGV4KG5ld0luZGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRBU0tfTk9ERV9fSU5ERVg6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldEluZGV4KCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5UQVNLX05PREVfX0lOREVYOgotCQkJCXNldEluZGV4KCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRBU0tfTk9ERV9fSU5ERVg6Ci0JCQkJc2V0SW5kZXgoSU5ERVhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVEFTS19OT0RFX19JTkRFWDoKLQkJCQlyZXR1cm4gaW5kZXggIT0gSU5ERVhfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpbmRleDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpbmRleCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFza0Rlc2NyaXB0b3JBZGFwdGVyIGV4dGVuZHMgTWV0aG9kRWxlbWVudEFkYXB0ZXIgewotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChUYXNrRGVzY3JpcHRvci5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQloYW5kbGVkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCQloYW5kbGVkID0gdHJ1ZTsKLQkJCQlicmVhazsJCQkJCi0JCQl9Ci0JCQlpZihoYW5kbGVkICYmIChtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERCB8fCBtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERF9NQU5ZKSkgeyAKLQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsIGRpYWdyYW0gPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCkgZ2V0RGlhZ3JhbSgpOwotCQkJCWlmKGRpYWdyYW0gIT0gbnVsbCkgewotLy8JCQkJCWRpYWdyYW0uc2V0T2JqZWN0KGRpYWdyYW0uZ2V0T2JqZWN0KCkpOwotCQkJCQlDb2xsZWN0aW9uIGlucHV0T3VwdXROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZGlhZ3JhbS5jcmVhdGVUYXNrSW5wdXRPdXRwdXROb2RlcygoVGFza0Rlc2NyaXB0b3IpIG1zZy5nZXROb3RpZmllcigpLCBpbnB1dE91cHV0Tm9kZXMpOwotCQkJCQlpZighaW5wdXRPdXB1dE5vZGVzLmlzRW1wdHkoKSkgewotCQkJCQkJZGlhZ3JhbS5nZXROb2RlcygpLmFkZEFsbChpbnB1dE91cHV0Tm9kZXMpOwotCQkJCQkJZGlhZ3JhbS5wb3B1bGF0ZUxpbmtzKGlucHV0T3VwdXROb2RlcywgZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQotLy8JCQlNZXRob2RFbGVtZW50IG9iajsKLS8vCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKFRhc2tEZXNjcmlwdG9yLmNsYXNzKSkgewotLy8JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0vLwkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotLy8JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLS8vCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0vLwkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0vLwkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIG1zZy5nZXROZXdWYWx1ZSgpOwotLy8JCQkJCWFkZEluY29taW5nQ29ubmVjdGlvbihvYmopOwotLy8JCQkJCXJldHVybjsKLS8vCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLS8vCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgbXNnLmdldE9sZFZhbHVlKCk7Ci0vLwkJCQkJcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKG9iaik7Ci0vLwkJCQkJcmV0dXJuOwotLy8JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0vLwkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpOwotLy8JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotLy8JCQkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotLy8JCQkJCQlhZGRJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqKTsKLS8vCQkJCQl9Ci0vLwkJCQkJcmV0dXJuOwotLy8JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0vLwkJCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLS8vCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJCW9iaiA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLS8vCQkJCQkJcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKG9iaik7Ci0vLwkJCQkJfQotLy8JCQkJCXJldHVybjsKLS8vCQkJCX0KLS8vCQkJCWJyZWFrOwotLy8JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0vLwkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotLy8JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotLy8JCQkJCW9iaiA9IChNZXRob2RFbGVtZW50KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLS8vCQkJCQlhZGRPdXRnb2luZ0Nvbm5lY3Rpb24ob2JqKTsKLS8vCQkJCQlyZXR1cm47Ci0vLwkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0vLwkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIG1zZy5nZXRPbGRWYWx1ZSgpOwotLy8JCQkJCXJlbW92ZU91dGdvaW5nQ29ubmVjdGlvbihvYmopOwotLy8JCQkJCXJldHVybjsKLS8vCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotLy8JCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLS8vCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJCW9iaiA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLS8vCQkJCQkJYWRkT3V0Z29pbmdDb25uZWN0aW9uKG9iaik7Ci0vLwkJCQkJfQotLy8JCQkJCXJldHVybjsKLS8vCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotLy8JCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0vLwkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0vLwkJCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0vLwkJCQkJCXJlbW92ZU91dGdvaW5nQ29ubmVjdGlvbihvYmopOwotLy8JCQkJCX0KLS8vCQkJCQlyZXR1cm47Ci0vLwkJCQl9Ci0vLwkJCQlicmVhazsKLS8vCQkJfQotCi0JCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb24obXNnKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JTm9kZUNoYW5nZUxpc3RlbmVyI2dldE5vZGUoKQotCQkgKi8KLQkJcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJCXJldHVybiBUYXNrTm9kZUltcGwudGhpczsKLQkJfQotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5hbWVkTm9kZUltcGwjc2V0T2JqZWN0KGphdmEubGFuZy5PYmplY3QpCi0JLy8gKi8KLQkvLyBwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG5ld09iamVjdCkgewotCS8vIE9iamVjdCBvbGRPYmplY3QgPSBvYmplY3Q7Ci0JLy8gb2JqZWN0ID0gbmV3T2JqZWN0OwotCS8vIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkvLyBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCS8vIE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX19PQkpFQ1QsIG9sZE9iamVjdCwgb2JqZWN0KSk7Ci0JLy8KLQkvLyBpZihuZXdPYmplY3QgPT0gbnVsbCkgcmV0dXJuOwotCS8vCQkKLQkvLyBNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgbmV3T2JqZWN0OwotCS8vIGlmKGVsZW1lbnQgIT0gbnVsbCAmJiBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKSAhPSBudWxsKSB7Ci0JLy8gLy8gcmVtb3ZlIG9sZCBtZXRob2RFbGVtZW50QWRhcHRlcgotCS8vIC8vCi0JLy8gT2JqZWN0IG9sZEFkYXB0ZXIgPSBVbWFVdGlsLmdldEFkYXB0ZXIoZWxlbWVudCwKLQkvLyBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKSk7Ci0JLy8gaWYob2xkQWRhcHRlciAhPSBudWxsKSB7Ci0JLy8gZWxlbWVudC5lQWRhcHRlcnMoKS5yZW1vdmUob2xkQWRhcHRlcik7Ci0JLy8gfQotCS8vIH0KLQkvLyBncmFwaE5vZGUgPQotCS8vIEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0R3JhcGhOb2RlKGdldFVNQURpYWdyYW0oKSwKLQkvLyBlbGVtZW50KTsKLQkvLyAgICAgICAgCi0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJOb2RlSW1wbC5zZXRPYmplY3QoKTogZWxlbWVudDogJyIgKwotCS8vIGVsZW1lbnQuZ2V0TmFtZSgpICsgIicsIGdyYXBoTm9kZTogIiArIGdyYXBoTm9kZSk7Ci0JLy8gICAgICAgIAotCS8vIC8vIHBvcHVsYXRlIGRhdGEKLQkvLyAvLwotCS8vIHNldEhlaWdodChncmFwaE5vZGUuZ2V0U2l6ZSgpLmdldEhlaWdodCgpLmludFZhbHVlKCkpOwotCS8vIHNldExvY2F0aW9uKEdyYXBoaWNhbERhdGFIZWxwZXIudG9Qb2ludChncmFwaE5vZGUuZ2V0UG9zaXRpb24oKSkpOwotCS8vIHNldFdpZHRoKGdyYXBoTm9kZS5nZXRTaXplKCkuZ2V0V2lkdGgoKS5pbnRWYWx1ZSgpKTsKLQkvLyAgICAgICAgCi0JLy8gLy8gYWRkIG1ldGhvZEVsZW1lbnRBZGFwdGVyCi0JLy8gLy8KLQkvLyBpZihtZXRob2RFbGVtZW50QWRhcHRlciAhPSBudWxsKSB7Ci0JLy8gZWxlbWVudC5lQWRhcHRlcnMoKS5hZGQobWV0aG9kRWxlbWVudEFkYXB0ZXIpOwotCS8vIH0KLQkvLyAgICAgICAgCi0JLy8gdGhpcy5lQWRhcHRlcnMoKS5hZGQoY3JlYXRlTm9kZUFkYXB0ZXIoKSk7Ci0JLy8KLQkvLyBzZXROYW1lKGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkvLyB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjYWRkVG9VTUEob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluaykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRUb1VNQShMaW5rIGxpbmspIHsKLQkJaWYgKCFzdXBlci5hZGRUb1VNQShsaW5rKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvL1Rhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gKFRhc2tEZXNjcmlwdG9yKSBnZXRPYmplY3QoKTsKLQkJTm9kZUltcGwgbm9kZUltcGwgPSAoTm9kZUltcGwpIGxpbmsuZ2V0U291cmNlKCk7Ci0JCWJvb2xlYW4gbm90aWZ5ID0gbm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJYm9vbGVhbiBub3RpZnlTb3VyY2UgPSBub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkOwotCQl0cnkgewotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJLy8gdGFza0Rlc2MuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQobGluay5nZXRTb3VyY2UoKS5nZXRPYmplY3QoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5OwotCQkJbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeVNvdXJjZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNyZW1vdmVGcm9tVU1BKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmssCi0JICogICAgICBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlLCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21VTUEoTGluayBsaW5rLCBOb2RlIG9sZFNvdXJjZSwgTm9kZSBvbGRUYXJnZXQpIHsKLQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIGdldE9iamVjdCgpOwotCQl0YXNrRGVzYy5nZXRPdXRwdXQoKS5yZW1vdmUobGluay5nZXRUYXJnZXQoKS5nZXRPYmplY3QoKSk7Ci0KLQkJc3VwZXIucmVtb3ZlRnJvbVVNQShsaW5rLCBvbGRTb3VyY2UsIG9sZFRhcmdldCk7Ci0JfQotCi19IC8vIFRhc2tOb2RlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvVHlwZWROb2RlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvVHlwZWROb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWY5ZmEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1R5cGVkTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlR5cGVkIE5vZGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuVHlwZWROb2RlSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVHlwZWROb2RlSW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgVHlwZWROb2RlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9FREVGQVVMVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUeXBlZE5vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5UWVBFRF9OT0RFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCBuZXdUeXBlKSB7Ci0JCWludCBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fVFlQRToKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0VHlwZSgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fVFlQRToKLQkJCQlzZXRUeXBlKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX1RZUEU6Ci0JCQkJcmV0dXJuIHR5cGUgIT0gVFlQRV9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0eXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBiYXNpY1NldE9iamVjdChPYmplY3QgbmV3T2JqZWN0KSB7Ci0JCS8vcG9wdWxhdGUgZGF0YSBmcm9tIGxpbmtlZCBHcmFwaE5vZGUKLQkJLy8gCi0JCWdyYXBoTm9kZSA9IChHcmFwaE5vZGUpIG5ld09iamVjdDsKLQkJc2V0V2lkdGgoZ3JhcGhOb2RlLmdldFNpemUoKS5nZXRXaWR0aCgpLmludFZhbHVlKCkpOwotCQlzZXRIZWlnaHQoZ3JhcGhOb2RlLmdldFNpemUoKS5nZXRIZWlnaHQoKS5pbnRWYWx1ZSgpKTsKLQkJc2V0TG9jYXRpb24oR3JhcGhpY2FsRGF0YUhlbHBlci50b1BvaW50KGdyYXBoTm9kZS5nZXRQb3NpdGlvbigpKSk7Ci0vLwkJIHRoaXMuZUFkYXB0ZXJzKCkuYWRkKG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJLy8gLyogKG5vbi1KYXZhZG9jKQotCQkvLyAqIEBzZWUKLQkJLy8gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJLy8gKi8KLQkJLy8gcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCS8vIEdyYXBoTm9kZSBncmFwaE5vZGUgPSAoR3JhcGhOb2RlKSBnZXRPYmplY3QoKTsKLQkJLy8gc3dpdGNoKG1zZy5nZXRGZWF0dXJlSUQoVHlwZWROb2RlLmNsYXNzKSkgewotCQkvLyBjYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19XSURUSDoKLQkJLy8gZ3JhcGhOb2RlLmdldFNpemUoKS5zZXRXaWR0aChuZXcgRG91YmxlKG1zZy5nZXROZXdJbnRWYWx1ZSgpKSk7Ci0JCS8vIHJldHVybjsKLQkJLy8gICAgICAgICAgICAgICAgICAgIAotCQkvLyBjYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19IRUlHSFQ6Ci0JCS8vIGdyYXBoTm9kZS5nZXRTaXplKCkuc2V0SGVpZ2h0KG5ldyBEb3VibGUobXNnLmdldE5ld0ludFZhbHVlKCkpKTsKLQkJLy8gcmV0dXJuOwotCQkvLyAgICAgICAgICAgICAgICAgICAgICAgIAotCQkvLyBjYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19MT0NBVElPTjoKLQkJLy8gUG9pbnQgcCA9IChQb2ludCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZWROb2RlSW1wbCQubm90aWZ5Q2hhbmdlZCgpOiBuZXcgbG9jYXRpb246ICIgKwotCQkvLyBwICsgIi4gIiArIFR5cGVkTm9kZUltcGwudGhpcyk7Ci0JCS8vIGdyYXBoTm9kZS5nZXRQb3NpdGlvbigpLnNldFgobmV3IERvdWJsZShwLngpKTsKLQkJLy8gZ3JhcGhOb2RlLmdldFBvc2l0aW9uKCkuc2V0WShuZXcgRG91YmxlKHAueSkpOwotCQkvLyByZXR1cm47Ci0JCS8vICAgICAgICAgICAgICAgICAgICAKLQkJLy8gY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM6Ci0JCS8vIExpbmsgbGluazsKLQkJLy8gc3dpdGNoKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCS8vIGFkZFRvVU1BKChMaW5rKSBtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKW1zZy5nZXROZXdWYWx1ZSgpKS5pdGVyYXRvcigpOyBpdGVyCi0JCS8vIC5oYXNOZXh0KCk7KSB7Ci0JCS8vIGFkZFRvVU1BKChMaW5rKSBpdGVyLm5leHQoKSk7Ci0JCS8vIH0KLQkJLy8gYnJlYWs7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJLy8gbGluayA9IChMaW5rKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJLy8gaWYobGluay5nZXRTb3VyY2UoKSAhPSBudWxsKSB7Ci0JCS8vICgoTm9kZUltcGwpbGluay5nZXRTb3VyY2UoKSkucmVtb3ZlRnJvbVVNQShsaW5rLCBsaW5rLmdldFNvdXJjZSgpLAotCQkvLyAoTm9kZSltc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCS8vIH0KLQkJLy8gYnJlYWs7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pbXNnLmdldE9sZFZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJLy8gLmhhc05leHQoKTspIHsKLQkJLy8gbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJLy8gaWYobGluay5nZXRTb3VyY2UoKSAhPSBudWxsKSB7Ci0JCS8vICgoTm9kZUltcGwpbGluay5nZXRTb3VyY2UoKSkucmVtb3ZlRnJvbVVNQShsaW5rLCBsaW5rLmdldFNvdXJjZSgpLAotCQkvLyAoTm9kZSltc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBicmVhazsKLQkJLy8gfQotCQkvLyByZXR1cm47Ci0JCS8vCi0JCS8vIGNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOgotCQkvLyBzd2l0Y2gobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJLy8gYWRkVG9VTUEoKExpbmspIG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJLy8gYnJlYWs7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pbXNnLmdldE5ld1ZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJLy8gLmhhc05leHQoKTspIHsKLQkJLy8gYWRkVG9VTUEoKExpbmspIGl0ZXIubmV4dCgpKTsKLQkJLy8gfQotCQkvLyBicmVhazsKLQkJLy8KLQkJLy8gY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkvLyBsaW5rID0gKExpbmspIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkvLyBpZihsaW5rLmdldFRhcmdldCgpICE9IG51bGwpIHsKLQkJLy8gcmVtb3ZlRnJvbVVNQShsaW5rLCAoTm9kZSltc2cuZ2V0Tm90aWZpZXIoKSwgbGluay5nZXRUYXJnZXQoKSk7Ci0JCS8vIH0KLQkJLy8gYnJlYWs7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pbXNnLmdldE9sZFZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJLy8gLmhhc05leHQoKTspIHsKLQkJLy8gbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJLy8gaWYobGluay5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCS8vIHJlbW92ZUZyb21VTUEobGluaywgKE5vZGUpbXNnLmdldE5vdGlmaWVyKCksIGxpbmsuZ2V0VGFyZ2V0KCkpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gYnJlYWs7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8KLQkJLy8gfSk7Ci0JCWVBZGFwdGVycygpLmFkZChuZXcgTm9kZUFkYXB0ZXIoKSk7Ci0JfQotCQotCXB1YmxpYyBDbGFzcyBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFkZFRvVU1BKExpbmsgbGluaykgewotCQlpZiAoIXN1cGVyLmFkZFRvVU1BKGxpbmspKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChsaW5rLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQlpZiAobGluay5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZQotCQkJCQkmJiAoKFR5cGVkTm9kZSkgbGluay5nZXRUYXJnZXQoKSkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TWU5DSF9CQVIpIHsKLQkJCQlDb2xsZWN0aW9uIHRhcmdldEFjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0U3luY0JhclRhcmdldE5vZGVzKChUeXBlZE5vZGUpIGxpbmsKLQkJCQkJCS5nZXRUYXJnZXQoKSwgdGFyZ2V0QWN0Tm9kZXMpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhcmdldEFjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlOYW1lZE5vZGVJbXBsIG5vZGUgPSAoKE5hbWVkTm9kZUltcGwpIGl0ZXIubmV4dCgpKTsKLQkJCQkJaWYgKFVtYVV0aWwuZmluZFdvcmtPcmRlcigoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUKLQkJCQkJCQkuZ2V0T2JqZWN0KCksIChXb3JrQnJlYWtkb3duRWxlbWVudCkgbGluawotCQkJCQkJCS5nZXRTb3VyY2UoKS5nZXRPYmplY3QoKSkgPT0gbnVsbCkgewotCQkJCQkJYWRkRGVmYXVsdFdvcmtPcmRlcihub2RlLCAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGxpbmsKLQkJCQkJCQkJLmdldFNvdXJjZSgpLmdldE9iamVjdCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChsaW5rLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkvLyBQcmVkZWNlc3NvciBzaG91bGQgYmUgY3JlYXRlZCBvbmx5IGluIGNhc2Ugb2YKLQkJCS8vIFN5bmNyb25pemF0aW9uIEJhciwgbm90IGZvciBEZWNpc2lvblBvaW50LgotCQkJaWYgKCgoVHlwZWROb2RlKSBsaW5rLmdldFNvdXJjZSgpKS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNZTkNIX0JBUikgewotCQkJCUNvbGxlY3Rpb24gc3JjQWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRTeW5jQmFyU291cmNlTm9kZXMoKFR5cGVkTm9kZSkgbGluawotCQkJCQkJLmdldFNvdXJjZSgpLCBzcmNBY3ROb2Rlcyk7Ci0JCQkJQ29sbGVjdGlvbiB0YXJnZXRBY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmdldFN5bmNCYXJUYXJnZXROb2RlcygoVHlwZWROb2RlKSBsaW5rCi0JCQkJCQkuZ2V0VGFyZ2V0KCksIHRhcmdldEFjdE5vZGVzKTsKLQotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhcmdldEFjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlOYW1lZE5vZGVJbXBsIG5vZGUgPSAoKE5hbWVkTm9kZUltcGwpIGl0ZXIubmV4dCgpKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNyY0FjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpICgoTm9kZSkgaXRlcmF0b3IKLQkJCQkJCQkJLm5leHQoKSkuZ2V0T2JqZWN0KCk7Ci0JCQkJCQlpZiAoVW1hVXRpbC5maW5kV29ya09yZGVyKChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZQotCQkJCQkJCQkuZ2V0T2JqZWN0KCksIHByZWQpID09IG51bGwpIHsKLQkJCQkJCQlhZGREZWZhdWx0V29ya09yZGVyKG5vZGUsIHByZWQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVVNQShMaW5rIGxpbmssIE5vZGUgb2xkU291cmNlLCBOb2RlIG9sZFRhcmdldCkgewotCQlUeXBlZE5vZGUgdHlwZWROb2RlID0gKFR5cGVkTm9kZSkgb2xkU291cmNlOwotCQlDb2xsZWN0aW9uIHNyY0FjdE5vZGVzID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRTb3VyY2VOb2Rlcyh0eXBlZE5vZGUsCi0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQotCQlpZiAob2xkVGFyZ2V0IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc3JjQWN0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCS8vIE9iamVjdCBwcmVkID0gKChOb2RlKSBpdGVyYXRvci5uZXh0KCkpLmdldE9iamVjdCgpOwotCQkJCS8vIEdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlV29ya09yZGVyKChOYW1lZE5vZGVJbXBsKQotCQkJCS8vIG9sZFRhcmdldCwgcHJlZCk7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJLmNhblJlbW92ZUFsbFByZWRzKGxpbmssIG5vZGUsIG9sZFRhcmdldCkpIHsKLQkJCQkJd2hpbGUgKFVtYVV0aWwuZmluZFdvcmtPcmRlcigKLQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIG9sZFRhcmdldC5nZXRPYmplY3QoKSwKLQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUuZ2V0T2JqZWN0KCkpICE9IG51bGwpIHsKLQkJCQkJCVVtYVV0aWwucmVtb3ZlV29ya09yZGVyKAotCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIG9sZFRhcmdldC5nZXRPYmplY3QoKSwKLQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlLmdldE9iamVjdCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChvbGRUYXJnZXQgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCUNvbGxlY3Rpb24gdGFyZ2V0QWN0Tm9kZXMgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFRhcmdldE5vZGVzKAotCQkJCQkoVHlwZWROb2RlKSBvbGRUYXJnZXQsIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5jbGFzcyk7Ci0KLQkJCS8vIHJlbW92ZSB0aGUgd29yayBvcmRlcnMgb2YgdGFyZ2V0IGFjdGl2aXRpZXMgdGhhdCBoYXZlIHRoZQotCQkJLy8gcHJlZGVjZXNzb3IgaW4gc3JjQWN0Tm9kZXMKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXRBY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlOYW1lZE5vZGVJbXBsIG5vZGUgPSAoKE5hbWVkTm9kZUltcGwpIGl0ZXIubmV4dCgpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc3JjQWN0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCS8vIE9iamVjdCBwcmVkID0gKChOb2RlKSBpdGVyYXRvci5uZXh0KCkpLmdldE9iamVjdCgpOwotCQkJCQkvLyBHcmFwaGljYWxEYXRhSGVscGVyLnJlbW92ZVdvcmtPcmRlcihub2RlLCBwcmVkKTsKLQkJCQkJTm9kZSBwcmVkbm9kZSA9IChOb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChHcmFwaGljYWxEYXRhSGVscGVyLmNhblJlbW92ZUFsbFByZWRzKGxpbmssIHByZWRub2RlLAotCQkJCQkJCW5vZGUpKSB7Ci0JCQkJCQl3aGlsZSAoVW1hVXRpbC5maW5kV29ya09yZGVyKAotCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUuZ2V0T2JqZWN0KCksCi0JCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgcHJlZG5vZGUuZ2V0T2JqZWN0KCkpICE9IG51bGwpIHsKLQkJCQkJCQlVbWFVdGlsCi0JCQkJCQkJCQkucmVtb3ZlV29ya09yZGVyKAotCQkJCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUKLQkJCQkJCQkJCQkJCQkuZ2V0T2JqZWN0KCksCi0JCQkJCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgcHJlZG5vZGUKLQkJCQkJCQkJCQkJCQkuZ2V0T2JqZWN0KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3VwZXIucmVtb3ZlRnJvbVVNQShsaW5rLCBvbGRTb3VyY2UsIG9sZFRhcmdldCk7Ci0JfQotfSAvLyBUeXBlZE5vZGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyOTgwODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIEJyZWFrZG93biBFbGVtZW50IE5vZGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJbXBsIGV4dGVuZHMgTmFtZWROb2RlSW1wbCBpbXBsZW1lbnRzCi0JCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHJvdGVjdGVkIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJbWV0aG9kRWxlbWVudEFkYXB0ZXIgPSBuZXcgV29ya0JyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFdvcmtCcmVha2Rvd25FbGVtZW50QWRhcHRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRBZGFwdGVyIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCQkJcmV0dXJuOwotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlXb3JrT3JkZXIgb2JqOwotCQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcykpIHsKLQkJCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUjoKLQkJCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQkJb2JqID0gKFdvcmtPcmRlcikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlhZGRJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqLmdldFByZWQoKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJCW9iaiA9IChXb3JrT3JkZXIpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKG9iai5nZXRQcmVkKCkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCW9iaiA9IChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpOwotCQkJCQkJCWFkZEluY29taW5nQ29ubmVjdGlvbihvYmouZ2V0UHJlZCgpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCQljb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJb2JqID0gKFdvcmtPcmRlcikgaXRlci5uZXh0KCk7Ci0JCQkJCQkJcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKG9iai5nZXRQcmVkKCkpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQkJCX0KLQotCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tVU1BKExpbmsgbGluaywgTm9kZSBvbGRTb3VyY2UsIE5vZGUgb2xkVGFyZ2V0KSB7Ci0JCWlmIChvbGRUYXJnZXQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCS8vIHRoaXMgaXMgYSBkaXJlY3QgbGluawotCQkJLy8gcmVtb3ZlIFdvcmtPcmRlcgotCQkJLy8KLQkJCS8vIEdyYXBoRWRnZSBlZGdlID0gKEdyYXBoRWRnZSkgbGluay5nZXRPYmplY3QoKTsKLQkJCS8vIFdvcmtPcmRlciBvcmRlciA9IChXb3JrT3JkZXIpCi0JCQkvLyAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpZWRnZS5nZXRTZW1hbnRpY01vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJCS8vIFdvcmtCcmVha2Rvd25FbGVtZW50IGJlID0gVW1hVXRpbC5nZXRPd25lcihvcmRlcik7Ci0JCQkvLyBpZihiZSAhPSBudWxsKSB7Ci0JCQlOYW1lZE5vZGVJbXBsIHRhcmdldCA9IChOYW1lZE5vZGVJbXBsKSBvbGRUYXJnZXQ7Ci0JCQlib29sZWFuIG5vdGlmeSA9IHRhcmdldC5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJdHJ5IHsKLQkJCQl0YXJnZXQubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCS8vIGJlLmdldExpbmtUb1ByZWRlY2Vzc29yKCkucmVtb3ZlKG9yZGVyKTsKLQkJCQlpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5jYW5SZW1vdmVBbGxQcmVkcyhsaW5rLCBvbGRTb3VyY2UsCi0JCQkJCQlvbGRUYXJnZXQpKSB7Ci0JCQkJCXdoaWxlIChVbWFVdGlsLmZpbmRXb3JrT3JkZXIoKFdvcmtCcmVha2Rvd25FbGVtZW50KSB0YXJnZXQKLQkJCQkJCQkuZ2V0T2JqZWN0KCksIG9sZFNvdXJjZS5nZXRPYmplY3QoKSkgIT0gbnVsbCkgewotCQkJCQkJVW1hVXRpbC5yZW1vdmVXb3JrT3JkZXIoKFdvcmtCcmVha2Rvd25FbGVtZW50KSB0YXJnZXQKLQkJCQkJCQkJLmdldE9iamVjdCgpLCBvbGRTb3VyY2UuZ2V0T2JqZWN0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQl0YXJnZXQubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQkJCX0KLQkJCS8vIH0KLQkJfSBlbHNlIGlmIChvbGRUYXJnZXQgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCS8vIGdldCBhbGwgdGhlIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZXMgdGhhdCB0aGlzIFR5cGVkTm9kZSBhcmUKLQkJCS8vIGNvbWluZyB0byBhbmQKLQkJCS8vIHJlbW92ZSB0aGUgV29ya09yZGVycyB3aXRoIHRoaXMgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlJ3MKLQkJCS8vIGFjdGl2aXR5IGFzIHByZWRlY2Vzc29yIGZyb20gdGhlbQotCQkJLy8KLQkJCUNvbGxlY3Rpb24gYWN0Tm9kZXMgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFRhcmdldE5vZGVzKAotCQkJCQkoVHlwZWROb2RlKSBvbGRUYXJnZXQsIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5jbGFzcyk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlOYW1lZE5vZGVJbXBsIG5vZGUgPSAoTmFtZWROb2RlSW1wbCkgaXRlci5uZXh0KCk7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZQotCQkJCQkJLmdldE9iamVjdCgpOwotCQkJCWJvb2xlYW4gbm90aWZ5ID0gbm9kZS5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCXRyeSB7Ci0JCQkJCW5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQlpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5jYW5SZW1vdmVBbGxQcmVkcyhsaW5rLCBvbGRTb3VyY2UsCi0JCQkJCQkJbm9kZSkpIHsKLQkJCQkJCXdoaWxlIChVbWFVdGlsLmZpbmRXb3JrT3JkZXIoZSwgb2xkU291cmNlLmdldE9iamVjdCgpKSAhPSBudWxsKSB7Ci0JCQkJCQkJVW1hVXRpbC5yZW1vdmVXb3JrT3JkZXIoZSwgb2xkU291cmNlLmdldE9iamVjdCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gcmVtb3ZlIGdyYXBoaWNhbCBkYXRhIGZyb20gVU1BIG1vZGVsCi0JCS8vCi0JCXN1cGVyLnJlbW92ZUZyb21VTUEobGluaywgb2xkU291cmNlLCBvbGRUYXJnZXQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaW5rCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkVG9VTUEoTGluayBsaW5rKSB7Ci0JCWlmICghc3VwZXIuYWRkVG9VTUEobGluaykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJTm9kZSBzcmMgPSBsaW5rLmdldFNvdXJjZSgpOwotCQlpZiAoc3JjIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkvLyB0aGlzIGlzIGEgZGlyZWN0IGxpbmsKLQkJCS8vIGFkZCBuZXcgV29ya09yZGVyIG9iamVjdCB0byBVTUEKLQkJCS8vCi0JCQlXb3JrT3JkZXIgb3JkZXIgPSBudWxsOwotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgc3VjYyA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgbGluay5nZXRUYXJnZXQoKQotCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBzcmMuZ2V0T2JqZWN0KCk7Ci0JCQlpZiAoVW1hVXRpbC5maW5kV29ya09yZGVyKHN1Y2MsIHByZWQpID09IG51bGwpIHsKLQkJCQlOb2RlSW1wbCBzb3VyY2VOb2RlID0gKChOb2RlSW1wbCkgc3JjKTsKLQkJCQlib29sZWFuIHNvdXJjZU5vdGlmeSA9IHNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQl0cnkgewotCQkJCQlzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJLy9VbWFVdGlsLmNyZWF0ZURlZmF1bHRXb3JrT3JkZXIoc3VjYywgcHJlZCk7Ci0JCQkJCS8vQ3JlYXRlIGEgd29ya29yZGVyIGFuZCBkaXNhYmxlIG5vdGlmaWNhdGlvbiBmbGFnLgotCQkJCQlhZGREZWZhdWx0V29ya09yZGVyKChOYW1lZE5vZGVJbXBsKWxpbmsuZ2V0VGFyZ2V0KCksIHByZWQpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IHNvdXJjZU5vdGlmeTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHNldCB0aGUgV29ya09yZGVyIGFzIHRoZSBlbGVtZW50IG9mIHRoZSBTZW1hbnRpY01vZGVsIG9mIHRoZQotCQkJLy8gbGluaydzIEdyYXBoRWRnZQotCQkJLy8KLQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuc2V0U2VtYW50aWNNb2RlbChsaW5rLCBvcmRlcik7Ci0JCX0gZWxzZSBpZiAoc3JjIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkvLyBnZXQgYWxsIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZXMgdGhhdCBhcmUgY29tbWluZyB0byB0aGlzCi0JCQkvLyBUeXBlZE5vZGUsIGJvdGggZGlyZWN0bHkgYW5kIGluZGlyZWN0bHkKLQkJCS8vIGFuZCBjcmVhdGUgd29yayBvcmRlcnMgd2l0aCB0aGVpciBhY3Rpdml0eSBhcyBwcmVkZWNlc3NvcgotCQkJLy8KLQotCQkJLy8gUHJlZGVjZXNzb3Igc2hvdWxkIGJlIGNyZWF0ZWQgb25seSBpbiBjYXNlIG9mCi0JCQkvLyBTeW5jcm9uaXphdGlvbiBCYXIsIG5vdCBmb3IgRGVjaXNpb25Qb2ludC4KLQkJCWlmICgoKFR5cGVkTm9kZSkgc3JjKS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNZTkNIX0JBUikgewotCQkJCQotCQkJCUNvbGxlY3Rpb24gYWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJLy8gR2V0IHRoZSBjb2xsZWN0aW9uIGluY29taW5nIGNvbm5lY3Rpb24gb2Ygc3luY2JhciAKLQkJCQkvLyBleGNsdWRpbmcgZGVjaXNpb25wb2ludCBpbmNvbWluZyBjb25uZWN0aW9uCi0JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRTeW5jQmFyU291cmNlTm9kZXMoKFR5cGVkTm9kZSlzcmMsIGFjdE5vZGVzKTsKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBsaW5rCi0JCQkJCQkuZ2V0VGFyZ2V0KCkuZ2V0T2JqZWN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZQotCQkJCQkJCS5nZXRPYmplY3QoKTsKLQkJCQkJaWYgKFVtYVV0aWwuZmluZFdvcmtPcmRlcihzdWNjLCBwcmVkKSA9PSBudWxsKSB7Ci0JCQkJCQlOb2RlSW1wbCBzb3VyY2VOb2RlID0gKChOb2RlSW1wbCkgbm9kZSk7Ci0JCQkJCQlib29sZWFuIHNvdXJjZU5vdGlmeSA9IHNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCQkJLy9VbWFVdGlsLmNyZWF0ZURlZmF1bHRXb3JrT3JkZXIoc3VjYywgcHJlZCk7Ci0JCQkJCQkJLy8gQ3JlYXRlIGEgd29ya29yZGVyIGFuZCBkaXNhYmxlIG5vdGlmaWNhdGlvbiBmbGFnLgotCQkJCQkJCWFkZERlZmF1bHRXb3JrT3JkZXIoKE5hbWVkTm9kZUltcGwpbGluay5nZXRUYXJnZXQoKSxwcmVkKTsKLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gc291cmNlTm90aWZ5OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIExpbmsgYWRkSW5jb21pbmdDb25uZWN0aW9uKE1ldGhvZEVsZW1lbnQgc291cmNlKSB7Ci0JCUxpbmsgbGluayA9IHN1cGVyLmFkZEluY29taW5nQ29ubmVjdGlvbihzb3VyY2UpOwotCQlpZiAobGluayA9PSBudWxsKQotCQkJcmV0dXJuIGxpbms7Ci0KLQkJV29ya09yZGVyIHdvcmtPcmRlciA9IFVtYVV0aWwuZmluZFdvcmtPcmRlcigKLQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldE9iamVjdCgpLCBzb3VyY2UpOwotCQlHcmFwaGljYWxEYXRhSGVscGVyLnNldFNlbWFudGljTW9kZWwobGluaywgd29ya09yZGVyKTsKLQotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGluayBhZGRPdXRnb2luZ0Nvbm5lY3Rpb24oTWV0aG9kRWxlbWVudCB0YXJnZXQpIHsKLQkJTGluayBsaW5rID0gc3VwZXIuYWRkT3V0Z29pbmdDb25uZWN0aW9uKHRhcmdldCk7Ci0KLQkJV29ya09yZGVyIHdvcmtPcmRlciA9IFVtYVV0aWwuZmluZFdvcmtPcmRlcigKLQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIHRhcmdldCwgZ2V0T2JqZWN0KCkpOwotCQlHcmFwaGljYWxEYXRhSGVscGVyLnNldFNlbWFudGljTW9kZWwobGluaywgd29ya09yZGVyKTsKLQotCQlyZXR1cm4gbGluazsKLQl9Ci0KLX0gLy8gV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc0MDk3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JQWRhcHRlckZhY3RvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBDb21wb3NpdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwgZXh0ZW5kcyBOb2RlQ29udGFpbmVySW1wbCBpbXBsZW1lbnRzCi0JCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9FREVGQVVMVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9DT01QT1NJVEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoaW50IG5ld1R5cGUpIHsKLQkJaW50IG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9DT01QT1NJVEVfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19UWVBFOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRUeXBlKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19UWVBFOgotCQkJCXNldFR5cGUoKChJbnRlZ2VyKW5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX0NPTVBPU0lURV9fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX0NPTVBPU0lURV9fVFlQRToKLQkJCQlyZXR1cm4gdHlwZSAhPSBUWVBFX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFza0Rlc2NyaXB0b3JBZGFwdGVyIGV4dGVuZHMgVHJhbnNhY3Rpb25hbE5vZGVMaW5rIHsKLQkJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWRvSGFuZGxlTm90aWZpY2F0aW9uKG1zZyk7Ci0JCQlpZihXb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwudGhpcy5nZXROb2RlcygpLmlzRW1wdHkoKSkgewkJCQkKLQkJCQkvLyByZWZyZXNoIGRpYWdyYW0KLQkJCQkvLwotCQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0gZGlhZ3JhbSA9IGdldERpYWdyYW0oKTsKLQkJCQlpZihkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJZGlhZ3JhbS5nZXROb2RlcygpLnJlbW92ZShXb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwudGhpcyk7Ci0JCQkJCWRpYWdyYW0uc2V0T2JqZWN0KGRpYWdyYW0uZ2V0T2JqZWN0KCkpOwotCQkJCX0JCQkJCi0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBkb0hhbmRsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoVGFza0Rlc2NyaXB0b3IuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCU9iamVjdCBvYmogPSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJaWYgKG9iaiAhPSBudWxsICYmIHR5cGUgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuT1VUUFVUUykgewotCQkJCQkJYWRkTm9kZShvYmopOwotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCW9iaiA9IG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlpZiAob2JqICE9IG51bGwgJiYgdHlwZSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKSB7Ci0JCQkJCQlyZW1vdmVOb2RlKG9iaik7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJT2JqZWN0IG9iaiA9IG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlpZiAob2JqICE9IG51bGwgJiYgdHlwZSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpIHsKLQkJCQkJCWFkZE5vZGUob2JqKTsKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQlvYmogPSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJaWYgKG9iaiAhPSBudWxsICYmIHR5cGUgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuSU5QVVRTKSB7Ci0JCQkJCQlyZW1vdmVOb2RlKG9iaik7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQl9Ci0KLQlwcml2YXRlIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlEaWFncmFtSW1wbCBkaWFncmFtID0gKERpYWdyYW1JbXBsKSBnZXREaWFncmFtKCk7Ci0JCWlmIChkaWFncmFtLmZpbHRlciA9PSBudWxsKSB7Ci0JCQlDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5LmdldEZpbHRlcigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGRpYWdyYW0uZmlsdGVyOwotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIHNldE9iamVjdChPYmplY3QgbmV3T2JqZWN0KSB7Ci0JCQotCQlzdXBlci5zZXRPYmplY3QobmV3T2JqZWN0KTsKLQkJcG9wdWxhdGVOb2RlcyhuZXdPYmplY3QpOwotCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBiYXNpY1NldE9iamVjdChPYmplY3QgbmV3T2JqZWN0KSB7Ci0KLQkJc3VwZXIuYmFzaWNTZXRPYmplY3QobmV3T2JqZWN0KTsKLQkJCi0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCS8vIFNldCB0aGUgVHlwZSBpbmZvcm1hdGlvbiBmb3Igd29ya3Byb2R1Y3QgY29tcG9zaXRlLgotCQkJaWYgKHR5cGUgPT0gVFlQRV9FREVGQVVMVCkgewotCQkJCUxpc3QgbGlzdCA9IGdyYXBoTm9kZS5nZXRMaXN0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFkpOwotCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRQcm9wZXJ0eUJ5S2V5KGxpc3QsCi0JCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfV09SS19QUk9EVUNUX0NPTVBPU0lURV9UWVBFKTsKLQkJCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCQlwcm9wZXJ0eS5zZXRWYWx1ZShwcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKLQkJCQkJbGlzdC5hZGQocHJvcGVydHkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJTGlzdCBsaXN0ID0gZ3JhcGhOb2RlLmdldExpc3QoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSk7Ci0JCQkJUHJvcGVydHkgcHJvcGVydHkgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFByb3BlcnR5QnlLZXkobGlzdCwKLQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX1RZUEUpOwotCQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJCXByb3BlcnR5LnNldFZhbHVlKG5ldyBJbnRlZ2VyKGdldFR5cGUoKSkudG9TdHJpbmcoKSk7Ci0JCQkJCWxpc3QuYWRkKHByb3BlcnR5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIHdwZE5vZGUgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYobm9kZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgJiYgbm9kZS5nZXRMaW5rZWRFbGVtZW50KCkgPT0gd3BkKSB7Ci0JCQkJd3BkTm9kZSA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKSBub2RlOwotCQkJfQotCQl9Ci0JCWlmKHdwZE5vZGUgPT0gbnVsbCkgewotCQkJd3BkTm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpOwotCQkJd3BkTm9kZS5zZXREaWFncmFtKGdldERpYWdyYW0oKSk7Ci0JCX0KLQkJd3BkTm9kZS5zZXRPYmplY3Qod3BkKTsKLQkJcmV0dXJuIHdwZE5vZGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHBvcHVsYXRlTm9kZXMoT2JqZWN0IG5ld09iamVjdCl7Ci0JCWlmIChuZXdPYmplY3QgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJTGlzdCB3cGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAoZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLklOUFVUUykgewotCQkJCWlmICghKChUYXNrRGVzY3JpcHRvcikgbmV3T2JqZWN0KS5nZXRNYW5kYXRvcnlJbnB1dCgpLmlzRW1wdHkoKSkKLQkJCQkJd3BsaXN0LmFkZEFsbCgoKFRhc2tEZXNjcmlwdG9yKSBuZXdPYmplY3QpCi0JCQkJCQkJLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoISgoVGFza0Rlc2NyaXB0b3IpIG5ld09iamVjdCkuZ2V0T3V0cHV0KCkuaXNFbXB0eSgpKQotCQkJCQl3cGxpc3QuYWRkQWxsKCgoVGFza0Rlc2NyaXB0b3IpIG5ld09iamVjdCkuZ2V0T3V0cHV0KCkpOwotCQkJfQotCi0JCQlJRmlsdGVyIGZpbHRlciA9IGdldEZpbHRlcigpOwotCQkJQ29sbGVjdGlvbiBhbGxFbGVtZW50cyA9ICgoQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbClnZXREaWFncmFtKCkpCi0JCQkJCQkJCQkJLmdldEFsbEJyZWFrZG93bkVsZW1lbnRzKGZhbHNlKTsKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQotCQkJQXJyYXlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBnZXREaWFncmFtKCkuZ2V0U3VwcHJlc3Npb24oKTsKLS8vCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSAgbmV3IFN1cHByZXNzaW9uKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhnZXRPYmplY3QoKSkpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2NyaXB0b3IgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdGVyCi0JCQkJCQkubmV4dCgpOwkJCQotCQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KHdwRGVzY3JpcHRvcikpIHsKLQkJCQkJCi0JCQkJCU9iamVjdCB3cmFwcGVyID0gbnVsbDsKLS8vCQkJCQlpZihhZGFwdGVyRmFjdG9yeSAhPSBudWxsKXsKLS8vCQkJCQkJd3JhcHBlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHdwRGVzY3JpcHRvciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLS8vCQkJCQl9Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhbGxFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmKFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpID09IHdwRGVzY3JpcHRvcil7Ci0JCQkJCQkJd3JhcHBlciA9IGVsZW1lbnQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYod3JhcHBlciA9PSBudWxsICYmIGFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpewotCQkJCQkJd3JhcHBlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHdwRGVzY3JpcHRvciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJfQotCQkJCQlpZih3cmFwcGVyID09IG51bGwpewotCQkJCQkJd3JhcHBlciA9IHdwRGVzY3JpcHRvcjsKLQkJCQkJfQotCQkJCQlpZiAoIXN1cHByZXNzaW9uLmlzU3VwcHJlc3NlZCh3cmFwcGVyKSkgewotCQkJCQkJTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSh0aGlzLAotCQkJCQkJCQl3cERlc2NyaXB0b3IpOwotCQkJCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCQkJCW5vZGUgPSBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKHdwRGVzY3JpcHRvcik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyB0aGlzIHdpbGwgbWFrZSBzdXJlIHRoYXQgbGluayBiZXR3ZWVuIHRoZSBub2RlIGFuZCBsaW5rZWQgZWxlbWVudCBpcyBlc3RhYmxpc2hlZAotCQkJCQkJCS8vCi0JCQkJCQkJbm9kZS5zZXRPYmplY3Qod3BEZXNjcmlwdG9yKTsKLQkJCQkJCX0KLQkJCQkJCSgoTmFtZWROb2RlSW1wbCkgbm9kZSkuc2V0SXRlbVByb3ZpZGVyKGFsbEVsZW1lbnRzKTsKLQkJCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJc2VsZWN0Tm9kZXMobm9kZXMpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE5vZGUoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCUNvbGxlY3Rpb24gbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0ZXIKLQkJCQkJLm5leHQoKTsKLQkJCWFkZE5vZGUobm9kZXMsIGRlc2NyaXB0b3IpOwotCQl9Ci0KLQkJZ2V0Tm9kZXMoKS5hZGRBbGwobm9kZXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU5vZGUoT2JqZWN0IG9sZFZhbHVlKSB7Ci0JCUNvbGxlY3Rpb24gcmVtb3ZlZE5vZGVzID0gbmV3IEhhc2hTZXQoKTsKLQkJaWYgKG9sZFZhbHVlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCU5vZGUgbm9kZSA9IGZpbmROb2RlKChBY3Rpdml0eURldGFpbERpYWdyYW0pIGdldERpYWdyYW0oKSwKLQkJCQkJZ2V0T2JqZWN0KCkpOwotCQkJZ2V0RGlhZ3JhbSgpLmdldE5vZGVzKCkucmVtb3ZlKG5vZGUpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG5vZGUuZ2V0T2JqZWN0KCkgPT0gb2xkVmFsdWUpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCXJlbW92ZWROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gcHVzaEJhY2tUb0RpYWdyYW0ocmVtb3ZlZE5vZGVzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGROb2RlKE9iamVjdCBkZXNjcmlwdG9yKSB7Ci0JCWFkZE5vZGUoZ2V0Tm9kZXMoKSwgZGVzY3JpcHRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE5vZGUoQ29sbGVjdGlvbiBub2RlcywgT2JqZWN0IGRlc2NyaXB0b3IpIHsKLQkJCi0JCWlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCU5vZGUgbm9kZSA9IGZpbmROb2RlKChBY3Rpdml0eURldGFpbERpYWdyYW0pIGdldERpYWdyYW0oKSwKLQkJCQkJZGVzY3JpcHRvcik7Ci0JCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJbm9kZSA9ICgoQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCkgZ2V0RGlhZ3JhbSgpKQotCQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlKAotCQkJCQkJCQkoVGFza0Rlc2NyaXB0b3IpIGRlc2NyaXB0b3IsIHRoaXMudHlwZSk7Ci0JCQkJZ2V0RGlhZ3JhbSgpLmdldE5vZGVzKCkuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JCWlmKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpewotCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCBkaWFncmFtID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpIGdldERpYWdyYW0oKTsKLQkJCU5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcyAsCi0JCQkJCWRlc2NyaXB0b3IpOwotCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCWlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKXsKLQkJCQkJbm9kZSA9IGRpYWdyYW0uY3JlYXRlTm9kZSgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yKTsKLQkJCQl9Ci0JCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9sZFZhbHVlCi0JICovCi0vLwlwcml2YXRlIHZvaWQgcmVtb3ZlTm9kZShDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0vLwkJQ29sbGVjdGlvbiBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotLy8JCQlpZiAoZWxlbWVudHMuY29udGFpbnMobm9kZS5nZXRPYmplY3QoKSkpIHsKLS8vCQkJCW5vZGVzLmFkZChub2RlKTsKLS8vCQkJfQotLy8JCX0KLS8vCQlnZXROb2RlcygpLnJlbW92ZUFsbChub2Rlcyk7Ci0vLwkJcHVzaEJhY2tUb0RpYWdyYW0obm9kZXMpOwotLy8JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2dldE1ldGhvZEVsZW1lbnRBZGFwdGVyVHlwZSgpCi0JICovCi0JcHVibGljIENsYXNzIGdldE1ldGhvZEVsZW1lbnRBZGFwdGVyVHlwZSgpIHsKLQkJcmV0dXJuIFRhc2tEZXNjcmlwdG9yQWRhcHRlci5jbGFzczsKLQl9Ci0KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oKSB7Ci0JCWlmIChnZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuSU5QVVRTKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0TG9jYXRpb24oKTsKLQkJfQotCQlpZiAoZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLk9VVFBVVFMpIHsKLQkJCXJldHVybiBzdXBlci5nZXRMb2NhdGlvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG5ldyBQb2ludCgtMSwgLTEpOwotCQl9Ci0JfQotCi0JcHVibGljIEdyYXBoTm9kZSBnZXRHcmFwaE5vZGUoTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50KSB7Ci0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCWlmIChnZXRVTUFEaWFncmFtKCkgPT0gbnVsbCkgewotCQkJCS8vIG5ldyBNZXRob2RFbGVtZW50Ci0JCQkJLy8KLQkJCQlyZXR1cm4gY3JlYXRlR3JhcGhOb2RlKG1ldGhvZEVsZW1lbnQpOwotCQkJfQotCQkJR3JhcGhOb2RlIG5vZGUgPSBmaW5kR3JhcGhOb2RlKGdldFVNQURpYWdyYW0oKSwgbWV0aG9kRWxlbWVudCk7Ci0JCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJbm9kZSA9IGNyZWF0ZUdyYXBoTm9kZShtZXRob2RFbGVtZW50KTsKLQkJCQkvLyBjcmVhdGVHcmFwaENvbm5lY3RvcnMobm9kZSwgZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQlnZXRVTUFEaWFncmFtKCkuZ2V0Q29udGFpbmVkKCkuYWRkKG5vZGUpOwotCQkJfQotCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEdyYXBoTm9kZSBmaW5kR3JhcGhOb2RlKERpYWdyYW0gZGlhZ3JhbSwgT2JqZWN0IG1ldGhvZEVsZW1lbnQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXRDb250YWluZWQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUdyYXBoTm9kZSBlbGVtZW50ID0gKEdyYXBoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5nZXRTZW1hbnRpY01vZGVsKCkgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlCi0JCQkJCSYmIG1ldGhvZEVsZW1lbnQgPT0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBlbGVtZW50Ci0JCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKSkuZ2V0RWxlbWVudCgpKSB7Ci0KLQkJCQlMaXN0IGxpc3QgPSBlbGVtZW50LmdldExpc3QoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSk7Ci0JCQkJUHJvcGVydHkgcHJvcGVydHkgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFByb3BlcnR5QnlLZXkobGlzdCwKLQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX1RZUEUpOwotCQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyB0eXBlU3RyaW5nID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKHR5cGVTdHJpbmcgIT0gbnVsbCkgewotCQkJCQkJaWYgKGdldFR5cGUoKSA9PSBuZXcgSW50ZWdlcih0eXBlU3RyaW5nKS5pbnRWYWx1ZSgpKQotCQkJCQkJCXJldHVybiBlbGVtZW50OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgR3JhcGhOb2RlIGNyZWF0ZUdyYXBoTm9kZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoTm9kZSgpOwotCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG1vZGVsQnJpZGdlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCQltb2RlbEJyaWRnZS5zZXRFbGVtZW50KGVsZW1lbnQpOwotCQlncmFwaE5vZGUuc2V0U2VtYW50aWNNb2RlbChtb2RlbEJyaWRnZSk7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgcG9pbnQgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb2ludCgpOwotCQlwb2ludC5zZXRYKG5ldyBEb3VibGUoLTEpKTsKLQkJcG9pbnQuc2V0WShuZXcgRG91YmxlKC0xKSk7Ci0JCWdyYXBoTm9kZS5zZXRQb3NpdGlvbihwb2ludCk7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uIGRpbSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpbWVuc2lvbigpOwotCQlkaW0uc2V0V2lkdGgobmV3IERvdWJsZSgtMSkpOwotCQlkaW0uc2V0SGVpZ2h0KG5ldyBEb3VibGUoLTEpKTsKLQkJZ3JhcGhOb2RlLnNldFNpemUoZGltKTsKLQotCQkvLyBGb3Igc2V0dGluZyB0eXBlIG9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlCi0JCVByb3BlcnR5IHByb3BlcnR5ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHkoKTsKLQkJcHJvcGVydHkuc2V0S2V5KEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX1RZUEUpOwotCQlwcm9wZXJ0eS5zZXRWYWx1ZShuZXcgSW50ZWdlcihnZXRUeXBlKCkpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJbGlzdC5hZGQocHJvcGVydHkpOwotCQlncmFwaE5vZGUuc2V0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFksIGxpc3QpOwotCQlyZXR1cm4gZ3JhcGhOb2RlOwotCX0KLQotCXB1YmxpYyBOb2RlIGZpbmROb2RlKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBkaWFncmFtLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgZWxlbWVudCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmplY3QgPT0gZWxlbWVudC5nZXRPYmplY3QoKQotCQkJCQkmJiBlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGUpIHsKLQkJCQlpZiAoKChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgZWxlbWVudCkuZ2V0VHlwZSgpID09IHRoaXMudHlwZSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCWlmKG1ldGhvZEVsZW1lbnRBZGFwdGVyID09IG51bGwpIHsKLQkJCW1ldGhvZEVsZW1lbnRBZGFwdGVyID0gbmV3IFRhc2tEZXNjcmlwdG9yQWRhcHRlcigpOwotCQl9Ci0JCXJldHVybiBtZXRob2RFbGVtZW50QWRhcHRlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpewotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCUlGaWx0ZXIgZmlsdGVyID0gZ2V0RmlsdGVyKCk7Ci0JCWlmIChmaWx0ZXIgPT0gbnVsbCkgewotCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIElBZGFwdGVyRmFjdG9yeUZpbHRlcikgewotCQkJYWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgKChJQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJLmdldFdQQlNBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKLQl9Ci19IC8vIFdvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZmQ3YjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFkYXB0ZXJGYWN0b3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSVdQRERpYWdyYW1DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwgZXh0ZW5kcyBEaWFncmFtSW1wbCBpbXBsZW1lbnRzCi0JCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gewotCXByaXZhdGUgY2xhc3MgV1BERGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgQWN0aXZpdHlBZGFwdGVyIGltcGxlbWVudHMKLQkJCUlXUEREaWFncmFtQ2hhbmdlTGlzdGVuZXIgewotCi0JfTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQlkaWFncmFtQ2hhbmdlTGlzdGVuZXIgPSBuZXcgV1BERGlhZ3JhbUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENsYXNzIGdldERpYWdyYW1DaGFuZ2VMaXN0ZW5lclR5cGUoKSB7Ci0JCXJldHVybiBJV1BERGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFkYXB0ZXJGYWN0b3J5W10gREVGQVVMVF9BREFQVEVSX0ZBQ1RPUklFUyA9IHsJCQkKLQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSAKLQl9OyAKLQotCS8vCi0JLy8gU3RhcnQgY3VzdG9tIGNvZGUKLQkvLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKCkgewotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IG51bGw7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJaWYgKHdyYXBwZXIgIT0gbnVsbCkgewotCQkJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3NTUyCi0JCQlMaXN0IHdyYXBwZXJzID0gUHJvY2Vzc1V0aWwuZ2V0V3JhcHBlcnMod3JhcHBlciwgREVGQVVMVF9BREFQVEVSX0ZBQ1RPUklFUyk7Ci0JCQlpZih3cmFwcGVycyAhPSBudWxsICYmIHdyYXBwZXJzLnNpemUoKSA+IDApewotCQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKXdyYXBwZXJzLmdldCgwKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChmaWx0ZXIgPT0gbnVsbCkgewotCQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoZ2V0T2JqZWN0KCksCi0JCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIElBZGFwdGVyRmFjdG9yeUZpbHRlcikgewotCQkJCWFkYXB0ZXJGYWN0b3J5ID0gKChJQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJCS5nZXRXUEJTQWRhcHRlckZhY3RvcnkoKTsKLQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJCQlnZXRPYmplY3QoKSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCX0KLQkJfQotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkvLyByZXR1cm4gYWRhcHRlci5nZXRDaGlsZHJlbihnZXRPYmplY3QoKSk7Ci0JCQkvLyBjb21tZW50ZWQgYWJvdmUgbGluZSwgRm9yIGRpYWdyYW1zIC0gcm9sbHVwIHNob3VsZCBiZSBmYWxzZSwgZm9yCi0JCQkvLyBoYW5kbGluZyByb2xsdXAgc3RhdGUgYmVsb3cgY29kZS4KLQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlleHRyYWN0Q2hpbGRyZW4oYWRhcHRlciwgZ2V0T2JqZWN0KCksIGNoaWxkcmVuLCB0cnVlKTsKLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVOb2RlcygpIHsKLQkJLy8gQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRPYmplY3QoKTsKLQotCQkvLyBnZXQgYWxsIFdvcmtQcm9kdWN0RGVzY3JpcHRvcnMgdW5kZXIgdGhlIGFjdGl2aXR5Ci0JCS8vCi0JCXN1cGVyLnBvcHVsYXRlTm9kZXMoKTsKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKQotCQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGFjdCwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQotCQkvLyBBcnJheUxpc3Qgd3BEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQXJyYXlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0Tm9kZSBub2RlID0gKFdvcmtQcm9kdWN0Tm9kZSkgR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSh0aGlzLCBlbGVtZW50KTsKLQkJCQlpZihub2RlID09IG51bGwpIHsKLQkJCQkJbm9kZSA9IChXb3JrUHJvZHVjdE5vZGUpIHRvTm9kZSgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCQkJfQotCQkJCWlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZTsKLQkJCQkJaWYgKHdyYXBwZXIuaXNSZWFkT25seSgpKSB7Ci0JCQkJCQkoKE5hbWVkTm9kZUltcGwpIG5vZGUpLml0ZW1Qcm92aWRlciA9IHdyYXBwZXI7Ci0JCQkJCQlub2RlLnNldFJlYWRPbmx5KHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICgoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCW5vZGUuc2V0VHlwZSgxKTsKLQkJCQl9Ci0JCQkJaWYgKCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJbm9kZS5zZXRUeXBlKDIpOwotCQkJCX0KLQkJCQlpZiAoKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBPdXRjb21lKSB7Ci0JCQkJCW5vZGUuc2V0VHlwZSgzKTsKLQkJCQl9Ci0JCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JCXNlbGVjdE5vZGVzKG5vZGVzKTsKLQl9Ci0JcHJvdGVjdGVkIE5vZGUgdG9Ob2RlKE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZihlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKXsKLQkJCXJldHVybiBzdXBlci50b05vZGUoZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgbmV3Tm9kZSgpIHsKLQkJcmV0dXJuIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3ROb2RlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gR3JhcGhpY2FsRGF0YUhlbHBlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOwotCX0KLQotCXByb3RlY3RlZCBDbGFzcyBnZXRCcmVha2Rvd25FbGVtZW50VHlwZSgpIHsKLQkJcmV0dXJuIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1VtYU1vZGVsKGludCBwb3NpdGlvbiwgTm9kZSBhZGRlZE5vZGUpIHsJCQotCQlpZiAoYWRkZWROb2RlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJKChBY3Rpdml0eSkgZ2V0T2JqZWN0KCkpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKAotCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgYWRkZWROb2RlLmdldE9iamVjdCgpKTsKLQkJfQotCQlzdXBlci5hZGRUb1VtYU1vZGVsKHBvc2l0aW9uLCBhZGRlZE5vZGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBub2RlQWRkZWQoaW50IGluZGV4LCBOb2RlIG5vZGUpIHsKLQkJaWYobm9kZS5nZXRPYmplY3QoKSA9PSBudWxsKSB7Ci0JCQlpZihub2RlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3ROb2RlKSB7Ci0JCQkJbm9kZS5zZXRPYmplY3QoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vZGVBZGRlZChpbmRleCwgbm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTGlua3MoKSB7Ci0JCXN1cGVyLnBvcHVsYXRlTGlua3MoKTsKLQkJCi0JCS8vIENsZWFuIHVwIHVuLXVzZWQgdGhlIGxpbmtzLgotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKChOb2RlKSBpdGVyLm5leHQoKSk7Ci0JCQlBcnJheUxpc3Q8TGluaz4gbGlua3NUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3Q8TGluaz4oKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBub2RlCi0JCQkJCS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKCFpc1ZhbGlkKGxpbmspKSB7Ci0JCQkJCWxpbmtzVG9SZW1vdmUuYWRkKGxpbmspOwotCQkJCX0KLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaW5rc1RvUmVtb3ZlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLnJlbW92ZUxpbmsobGluayk7Ci0JCQl9Ci0JCQlsaW5rc1RvUmVtb3ZlLmNsZWFyKCk7Ci0JCQlsaW5rc1RvUmVtb3ZlID0gbnVsbDsKLQkJfQotCQkvLyBSZWZyZXNoIGxpbmtzIGJhc2VkIG9uIG1vZGVsIGluZm8uCi0JCWZvcihJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspewotCQkJTm9kZSBub2RlID0gKChOb2RlKWl0ZXIubmV4dCgpKTsKLQkJCU9iamVjdCB3YmUgPSBudWxsOwotCQkJLy93YmUgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBub2RlLmdldE9iamVjdCgpOwotCQkJLy9pZih3YmUgIT0gbnVsbCl7Ci0JCQl3YmUgPSAgbm9kZS5nZXRPYmplY3QoKTsKLQkJCWlmKHdiZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcil7Ci0JCQkJTGlzdCBpbXBhY3RlZEJ5ID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3Ipd2JlKS5nZXRJbXBhY3RlZEJ5KCk7Ci0JCQkJaWYoIWltcGFjdGVkQnkuaXNFbXB0eSgpKXsKLQkJCQkJZm9yKEl0ZXJhdG9yIGl0ZXIxID0gaW1wYWN0ZWRCeS5pdGVyYXRvcigpOyBpdGVyMS5oYXNOZXh0KCk7KXsKLQkJCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBzb3VyY2UgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKWl0ZXIxLm5leHQoKTsKLQkJCQkJCUxpbmsgbGluayA9IGZpbmRMaW5rKG5vZGUsIHNvdXJjZSk7Ci0JCQkJCQlpZihsaW5rID09IG51bGwpewotCQkJCQkJCU5hbWVkTm9kZUltcGwgbm9kZUltcGwgPSAoKE5hbWVkTm9kZUltcGwpIG5vZGUpOwotCQkJCQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCQkJCW5vZGVJbXBsLmFkZEluY29taW5nQ29ubmVjdGlvbihzb3VyY2UpOyAKLQkJCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gb2xkTm90aWZ5OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkKExpbmsgbGluaykgewotCQlpZiAobGluay5nZXRTb3VyY2UoKSA9PSBudWxsIHx8IGxpbmsuZ2V0VGFyZ2V0KCkgPT0gbnVsbAotCQkJCXx8ICFnZXROb2RlcygpLmNvbnRhaW5zKGxpbmsuZ2V0U291cmNlKCkpCi0JCQkJfHwgIWdldE5vZGVzKCkuY29udGFpbnMobGluay5nZXRUYXJnZXQoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIExpbmsgZmluZExpbmsoTm9kZSB0YXJnZXQsIE9iamVjdCBzb3VyY2VMaW5rZWRFbGVtZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhcmdldC5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCQlpZihzb3VyY2UuZ2V0TGlua2VkRWxlbWVudCgpID09IHNvdXJjZUxpbmtlZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gbGluazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19IC8vIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNmMwZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIE5vZGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbCBleHRlbmRzIE5hbWVkTm9kZUltcGwgaW1wbGVtZW50cwotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJbWV0aG9kRWxlbWVudEFkYXB0ZXIgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFOwotCX0KLQotCXByaXZhdGUgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRBZGFwdGVyIHsKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1NVUFBSRVNTRUQ6Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQ6Ci0JCQkJCUJvb2xlYW4gYiA9IChCb29sZWFuKW1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkvLyBUT0RPOiBpbXBsZW1lbnQgaGFuZGxpbmcgc3VwcHJlc3MuCi0JCQkJfQotCQkJfQotCQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uKG1zZyk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTmFtZWROb2RlSW1wbC5NZXRob2RFbGVtZW50QWRhcHRlciNnZXROb2RlKCkKLQkJICovCi0JCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCQlyZXR1cm4gV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwudGhpczsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5OYW1lZE5vZGVJbXBsI2ZpbmROb2RlKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBmaW5kTm9kZShNZXRob2RFbGVtZW50IGxpbmtlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUoCi0JCQkJKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgZ2V0RGlhZ3JhbSgpLCBsaW5rZWRFbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkgewotCQlyZXR1cm4gV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlci5jbGFzczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjYWRkVG9VTUEob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluaykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRUb1VNQShMaW5rIGxpbmspIHsKLQkJaWYgKCFzdXBlci5hZGRUb1VNQShsaW5rKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0T2JqZWN0KCk7Ci0KLQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24gb2Ygc291cmNlIG5vZGUgYmVmb3JlIGNoYW5naW5nIHRoZSBVTUEgb2JqZWN0Ci0JCS8vIGFzc29jaWF0ZWQgd2l0aCBpdAotCQkvLyBzbyBpdCB3aWxsIG5vdCBjcmVhdGUgZHVwbGljYXRlIGxpbmtzCi0JCS8vCi0JCU5vZGVJbXBsIG5vZGVJbXBsID0gKE5vZGVJbXBsKSBsaW5rLmdldFNvdXJjZSgpOwotCQlib29sZWFuIG5vdGlmeSA9IG5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCWJvb2xlYW4gbm90aWZ5VGFyZ2V0ID0gbm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJdHJ5IHsKLQkJCW5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLS8vCQkJd3BkLmdldE91dHB1dEZyb20oKS5hZGQobGluay5nZXRTb3VyY2UoKS5nZXRPYmplY3QoKSk7Ci0JCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgbGluay5nZXRTb3VyY2UoKS5nZXRPYmplY3QoKTsKLQkJCWlmKHRhc2tEZXNjICE9IG51bGwpIHsKLQkJCQl0YXNrRGVzYy5nZXRPdXRwdXQoKS5hZGQod3BkKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5VGFyZ2V0OwotCQl9Ci0KLQkJLy8gVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIGxpbmsuZ2V0U291cmNlKCkuZ2V0T2JqZWN0KCk7Ci0JCS8vIHRkLmdldE91dHB1dCgpLmFkZChnZXRPYmplY3QoKSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI3JlbW92ZUZyb21VTUEob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluaywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUsIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVVNQShMaW5rIGxpbmssIE5vZGUgb2xkU291cmNlLCBOb2RlIG9sZFRhcmdldCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0T2JqZWN0KCk7Ci0vLwkJd3BkLmdldE1hbmRhdG9yeUlucHV0VG8oKS5yZW1vdmUob2xkVGFyZ2V0LmdldE9iamVjdCgpKTsKLQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIG9sZFRhcmdldC5nZXRPYmplY3QoKTsKLQkJaWYodGFza0Rlc2MgIT0gbnVsbCkgewotCQkJdGFza0Rlc2MuZ2V0TWFuZGF0b3J5SW5wdXQoKS5yZW1vdmUod3BkKTsKLQkJfQotCi0JCXN1cGVyLnJlbW92ZUZyb21VTUEobGluaywgb2xkU291cmNlLCBvbGRUYXJnZXQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfSAvLyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3ROb2RlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3ROb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NThjYzQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtQcm9kdWN0Tm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBOb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0Tm9kZUltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Tm9kZUltcGwgZXh0ZW5kcyBOYW1lZE5vZGVJbXBsIGltcGxlbWVudHMKLQkJV29ya1Byb2R1Y3ROb2RlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9FREVGQVVMVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JcHJpdmF0ZSBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyIGV4dGVuZHMgTWV0aG9kRWxlbWVudEFkYXB0ZXIgewotCi0JCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCQlyZXR1cm4gV29ya1Byb2R1Y3ROb2RlSW1wbC50aGlzOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCQkJcmV0dXJuOwotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCi0JCQl0cnkgewotCQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MpKSB7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWToKLQkJCQkJTWV0aG9kRWxlbWVudCBvYmo7Ci0JCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJCW9iaiA9IChNZXRob2RFbGVtZW50KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWFkZEluY29taW5nQ29ubmVjdGlvbihvYmopOwotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCQlyZW1vdmVJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJYWRkSW5jb21pbmdDb25uZWN0aW9uKG9iaik7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCW9iaiA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQkJCQlyZW1vdmVJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1NVUFBSRVNTRUQ6Ci0JCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKLQkJCQkJCUJvb2xlYW4gYiA9IChCb29sZWFuKW1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJaWYoYi5ib29sZWFuVmFsdWUoKT09dHJ1ZSl7Ci0JCQkJCQkJcmVtb3ZlTGlua3MoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0Tm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJbWV0aG9kRWxlbWVudEFkYXB0ZXIgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShpbnQgbmV3VHlwZSkgewotCQlpbnQgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX05PREVfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfTk9ERV9fVFlQRToKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0VHlwZSgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX05PREVfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoKEludGVnZXIpbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfTk9ERV9fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX05PREVfX1RZUEU6Ci0JCQkJcmV0dXJuIHR5cGUgIT0gVFlQRV9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0eXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRUb1VNQShMaW5rIGxpbmspIHsKLQkJaWYgKCFzdXBlci5hZGRUb1VNQShsaW5rKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGxpbmsKLQkJCQkuZ2V0U291cmNlKCkuZ2V0T2JqZWN0KCk7Ci0KLQkJTm9kZUltcGwgc291cmNlID0gKE5vZGVJbXBsKSBsaW5rLmdldFNvdXJjZSgpOwotCQlOb2RlSW1wbCB0YXJnZXQgPSAoTm9kZUltcGwpIGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCWJvb2xlYW4gbm90aWZ5U291cmNlID0gc291cmNlLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCWJvb2xlYW4gbm90aWZ5VGFyZ2V0ID0gdGFyZ2V0Lm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCXRyeSB7Ci0JCQlzb3VyY2Uubm90aWZpY2F0aW9uRW5hYmxlZCA9IHRhcmdldC5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQlkZXNjcmlwdG9yLmdldEltcGFjdHMoKS5hZGQoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgbGluay5nZXRUYXJnZXQoKS5nZXRPYmplY3QoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzb3VyY2Uubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeVNvdXJjZTsKLQkJCXRhcmdldC5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5VGFyZ2V0OwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVVNQShMaW5rIGxpbmssIE5vZGUgb2xkU291cmNlLCBOb2RlIG9sZFRhcmdldCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9sZFRhcmdldAotCQkJCS5nZXRPYmplY3QoKTsKLQkJLy8gZGlzYWJsZSBpbnRlcm5hbCBub3RpZmljYXRpb24gb2YgdGhlIHRhcmdldCBub2RlIGJlZm9yZSByZW1vdmluZyBpdHMKLQkJLy8gZGVzY3JpcHRvciBmcm9tIHRoZSBkZXBlbmRlbmN5IGxpc3QKLQkJLy8KLQkJTmFtZWROb2RlSW1wbCBub2RlSW1wbCA9IChOYW1lZE5vZGVJbXBsKSBvbGRTb3VyY2U7Ci0JCWJvb2xlYW4gbm90aWZ5ID0gbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJdHJ5IHsKLQkJCW5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCWRlc2NyaXB0b3IuZ2V0SW1wYWN0ZWRCeSgpLnJlbW92ZShub2RlSW1wbC5nZXRPYmplY3QoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5OwotCQl9Ci0KLQkJc3VwZXIucmVtb3ZlRnJvbVVNQShsaW5rLCBvbGRTb3VyY2UsIG9sZFRhcmdldCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTGlua3MoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCWlmIChsaW5rLmdldFNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLnJlbW92ZUdyYXBoaWNhbERhdGEobGluayk7Ci0JCQkJLy8gZGlzYWJsZSBpbnRlcm5hbCBub3RpZmljYXRpb24gb2YgdGhlIHNvdXJjZSBub2RlCi0JCQkJLy8KLQkJCQlOb2RlSW1wbCBzb3VyY2VOb2RlID0gKE5vZGVJbXBsKSBsaW5rLmdldFNvdXJjZSgpOwotCQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCXRyeSB7Ci0JCQkJCXNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQlsaW5rLnNldFNvdXJjZShudWxsKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBvbGROb3RpZnk7Ci0JCQkJfQotCQkJCS8vbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCQkJbGluay5zZXRPYmplY3QobnVsbCk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlpZiAobGluay5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5yZW1vdmVHcmFwaGljYWxEYXRhKGxpbmspOwotCQkJCS8vIGRpc2FibGUgaW50ZXJuYWwgbm90aWZpY2F0aW9uIG9mIHRoZSBzb3VyY2Ugbm9kZQotCQkJCS8vCi0JCQkJTm9kZUltcGwgdGFyZ2V0Tm9kZSA9IChOb2RlSW1wbCkgbGluay5nZXRUYXJnZXQoKTsKLQkJCQlib29sZWFuIG9sZE5vdGlmeSA9IHRhcmdldE5vZGUubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQl0cnkgewotCQkJCQl0YXJnZXROb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJdGFyZ2V0Tm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gb2xkTm90aWZ5OwotCQkJCX0KLQkJCQkvL2xpbmsuc2V0U291cmNlKG51bGwpOwotCQkJCWxpbmsuc2V0T2JqZWN0KG51bGwpOwotCQkJfQotCQl9Ci0JfQotfSAvLyBXb3JrUHJvZHVjdE5vZGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMWRmMTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgYWN0aXZpdHkgZGlhZ3JhbSBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjlkOTVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgdGhlIGFjdGl2aXR5IGRpYWdyYW0gbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9EaWFncmFtSW5mby5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvRGlhZ3JhbUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjExMmE1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9EaWFncmFtSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uc3RyYWludE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHN0b3JlcyBkaWFncmFtIHB1Ymxpc2ggb3B0aW9ucyBhbmQgcmVmZXJlbmNlcyB0byB1c2VyLXNwZWNpZmllZAotICogZGlhZ3JhbXMgdG8gcmVwbGFjZSB0aGUgYWN0aXZpdHkgZGlhZ3JhbSwgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0sIG9yIHdvcmsKLSAqIHByb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtIGZvciBhbiBhY3Rpdml0eS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1JbmZvIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURfSU1BR0VfVVJJID0gImFkX2ltYWdlX3VyaSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfSU1BR0VfVVJJID0gImFkZF9pbWFnZV91cmkiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1BEX0lNQUdFX1VSSSA9ICJ3cGRfaW1hZ2VfdXJpIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQURfSU1BR0UgPSAicHVibGlzaF9hZF9pbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0FERF9JTUFHRSA9ICJwdWJsaXNoX2FkZF9pbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX1dQRF9JTUFHRSA9ICJwdWJsaXNoX3dwZF9pbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxJTUlURVIgPSAifCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIFN0cmluZyBBRF9JbWFnZVVSSTsKLQotCXByaXZhdGUgU3RyaW5nIEFERF9JbWFnZVVSSTsKLQotCXByaXZhdGUgU3RyaW5nIFdQRF9JbWFnZVVSSTsKLQotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoQURJbWFnZTsKLQotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoQURESW1hZ2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHVibGlzaFdQREltYWdlOwotCi0JcHJpdmF0ZSBDb25zdHJhaW50IGNvbnN0cmFpbnQ7Ci0KLQlwcml2YXRlIFN1cHBvcnRpbmdNYXRlcmlhbCBhY3Rpdml0eURpYWdyYW07Ci0KLQlwcml2YXRlIFN1cHBvcnRpbmdNYXRlcmlhbCBhY3Rpdml0eURldGFpbERpYWdyYW07Ci0KLQlwcml2YXRlIFN1cHBvcnRpbmdNYXRlcmlhbCB3cGREaWFncmFtOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhbmQgbG9hZHMgYSBEaWFncmFtSW5mbyBpbnN0YW5jZSBmb3IgYSBnaXZlbiBhY3Rpdml0eQotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqLwotCXB1YmxpYyBEaWFncmFtSW5mbyhBY3Rpdml0eSBhY3Rpdml0eSkgewotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JCXJlZnJlc2goKTsKLQl9Ci0KLQlwcml2YXRlIERpYWdyYW1JbmZvKCkgewotCQlBRF9JbWFnZVVSSSA9IEFERF9JbWFnZVVSSSA9IFdQRF9JbWFnZVVSSSA9ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBEaWFncmFtSW5mbyBsb2FkKCkgewotCQlEaWFncmFtSW5mbyBpbmZvID0gbmV3IERpYWdyYW1JbmZvKCk7Ci0JCWZvciAoU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY29uc3RyYWludC5nZXRCb2R5KCksCi0JCQkJREVMSU1JVEVSKTsgdG9rZW5zLmhhc01vcmVUb2tlbnMoKTspIHsKLQkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKLQkJCWludCBpZCA9IHRva2VuLmluZGV4T2YoJz0nKTsKLQkJCWludCBtYXggPSB0b2tlbi5sZW5ndGgoKSAtIDE7Ci0JCQlpZiAoaWQgIT0gLTEgJiYgaWQgPCBtYXgpIHsKLQkJCQlTdHJpbmcga2V5ID0gdG9rZW4uc3Vic3RyaW5nKDAsIGlkKTsKLQkJCQlpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoQURfSU1BR0VfVVJJKSkgewotCQkJCQlpbmZvLkFEX0ltYWdlVVJJID0gdG9rZW4uc3Vic3RyaW5nKGlkICsgMSk7Ci0JCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShBRERfSU1BR0VfVVJJKSkgewotCQkJCQlpbmZvLkFERF9JbWFnZVVSSSA9IHRva2VuLnN1YnN0cmluZyhpZCArIDEpOwotCQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoV1BEX0lNQUdFX1VSSSkpIHsKLQkJCQkJaW5mby5XUERfSW1hZ2VVUkkgPSB0b2tlbi5zdWJzdHJpbmcoaWQgKyAxKTsKLQkJCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKFBVQkxJU0hfQURfSU1BR0UpKSB7Ci0JCQkJCWluZm8ucHVibGlzaEFESW1hZ2UgPSBCb29sZWFuLnZhbHVlT2YoCi0JCQkJCQkJdG9rZW4uc3Vic3RyaW5nKGlkICsgMSkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoUFVCTElTSF9BRERfSU1BR0UpKSB7Ci0JCQkJCWluZm8ucHVibGlzaEFEREltYWdlID0gQm9vbGVhbi52YWx1ZU9mKAotCQkJCQkJCXRva2VuLnN1YnN0cmluZyhpZCArIDEpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKFBVQkxJU0hfV1BEX0lNQUdFKSkgewotCQkJCQlpbmZvLnB1Ymxpc2hXUERJbWFnZSA9IEJvb2xlYW4udmFsdWVPZigKLQkJCQkJCQl0b2tlbi5zdWJzdHJpbmcoaWQgKyAxKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbmZvOwotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlKCkgewotCQlpZiAoY29uc3RyYWludCA9PSBudWxsKSB7Ci0JCQljb25zdHJhaW50ID0gQ29uc3RyYWludE1hbmFnZXIuZ2V0Q29uc3RyYWludChhY3Rpdml0eSwKLQkJCQkJQ29uc3RyYWludE1hbmFnZXIuQUNJVElWWV9ESUFHUkFNLCB0cnVlKTsKLQkJfQotCQlpZiAoYWN0aXZpdHlEaWFncmFtICE9IG51bGwpIHsKLQkJCUFEX0ltYWdlVVJJID0gYWN0aXZpdHlEaWFncmFtLmdldEd1aWQoKTsKLQkJfQotCQlpZiAoYWN0aXZpdHlEZXRhaWxEaWFncmFtICE9IG51bGwpIHsKLQkJCUFERF9JbWFnZVVSSSA9IGFjdGl2aXR5RGV0YWlsRGlhZ3JhbS5nZXRHdWlkKCk7Ci0JCX0KLQkJaWYgKHdwZERpYWdyYW0gIT0gbnVsbCkgewotCQkJV1BEX0ltYWdlVVJJID0gd3BkRGlhZ3JhbS5nZXRHdWlkKCk7Ci0JCX0KLQotCQlEaWFncmFtSW5mbyBpbmZvID0gbG9hZCgpOwotCi0JCWlmIChBRF9JbWFnZVVSSSAhPSBudWxsKSB7Ci0JCQlpbmZvLkFEX0ltYWdlVVJJID0gQURfSW1hZ2VVUkk7Ci0JCX0KLQkJaWYgKEFERF9JbWFnZVVSSSAhPSBudWxsKSB7Ci0JCQlpbmZvLkFERF9JbWFnZVVSSSA9IEFERF9JbWFnZVVSSTsKLQkJfQotCQlpZiAoV1BEX0ltYWdlVVJJICE9IG51bGwpIHsKLQkJCWluZm8uV1BEX0ltYWdlVVJJID0gV1BEX0ltYWdlVVJJOwotCQl9Ci0JCWluZm8ucHVibGlzaEFESW1hZ2UgPSBwdWJsaXNoQURJbWFnZTsKLQkJaW5mby5wdWJsaXNoQURESW1hZ2UgPSBwdWJsaXNoQURESW1hZ2U7Ci0JCWluZm8ucHVibGlzaFdQREltYWdlID0gcHVibGlzaFdQREltYWdlOwotCi0JCVN0cmluZyBzdHIgPSBuZXcgU3RyaW5nQnVmZmVyKEFEX0lNQUdFX1VSSSkuYXBwZW5kKCc9JykuYXBwZW5kKAotCQkJCWluZm8uQURfSW1hZ2VVUkkpLmFwcGVuZChERUxJTUlURVIpLmFwcGVuZChQVUJMSVNIX0FEX0lNQUdFKQotCQkJCS5hcHBlbmQoJz0nKS5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoaW5mby5wdWJsaXNoQURJbWFnZSkpCi0JCQkJLmFwcGVuZChERUxJTUlURVIpLmFwcGVuZChBRERfSU1BR0VfVVJJKS5hcHBlbmQoJz0nKS5hcHBlbmQoCi0JCQkJCQlTdHJpbmcudmFsdWVPZihpbmZvLkFERF9JbWFnZVVSSSkpLmFwcGVuZChERUxJTUlURVIpCi0JCQkJLmFwcGVuZChQVUJMSVNIX0FERF9JTUFHRSkuYXBwZW5kKCc9JykuYXBwZW5kKAotCQkJCQkJU3RyaW5nLnZhbHVlT2YoaW5mby5wdWJsaXNoQURESW1hZ2UpKS5hcHBlbmQoREVMSU1JVEVSKQotCQkJCS5hcHBlbmQoV1BEX0lNQUdFX1VSSSkuYXBwZW5kKCc9JykuYXBwZW5kKAotCQkJCQkJU3RyaW5nLnZhbHVlT2YoaW5mby5XUERfSW1hZ2VVUkkpKS5hcHBlbmQoREVMSU1JVEVSKQotCQkJCS5hcHBlbmQoUFVCTElTSF9XUERfSU1BR0UpLmFwcGVuZCgnPScpLmFwcGVuZCgKLQkJCQkJCVN0cmluZy52YWx1ZU9mKGluZm8ucHVibGlzaFdQREltYWdlKSkudG9TdHJpbmcoKTsKLQotCQljb25zdHJhaW50LnNldEJvZHkoc3RyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhpcyBEaWFncmFtSW5mbyBvYmplY3QgZnJvbSB0aGUgbW9kZWwKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQljb25zdHJhaW50ID0gQ29uc3RyYWludE1hbmFnZXIuZ2V0Q29uc3RyYWludChhY3Rpdml0eSwKLQkJCQlDb25zdHJhaW50TWFuYWdlci5BQ0lUSVZZX0RJQUdSQU0sIGZhbHNlKTsKLQkJaWYgKGNvbnN0cmFpbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRGlhZ3JhbUluZm8gaW5mbyA9IGxvYWQoKTsKLQotCQlBRF9JbWFnZVVSSSA9IGluZm8uQURfSW1hZ2VVUkk7Ci0JCUFERF9JbWFnZVVSSSA9IGluZm8uQUREX0ltYWdlVVJJOwotCQlXUERfSW1hZ2VVUkkgPSBpbmZvLldQRF9JbWFnZVVSSTsKLQkJcHVibGlzaEFESW1hZ2UgPSBpbmZvLnB1Ymxpc2hBREltYWdlOwotCQlwdWJsaXNoQURESW1hZ2UgPSBpbmZvLnB1Ymxpc2hBRERJbWFnZTsKLQkJcHVibGlzaFdQREltYWdlID0gaW5mby5wdWJsaXNoV1BESW1hZ2U7Ci0KLQkJYWN0aXZpdHlEaWFncmFtID0gZ2V0U3VwcG9ydGluZ01hdGVyaWFsKEFEX0ltYWdlVVJJKTsKLQkJYWN0aXZpdHlEZXRhaWxEaWFncmFtID0gZ2V0U3VwcG9ydGluZ01hdGVyaWFsKEFERF9JbWFnZVVSSSk7Ci0JCXdwZERpYWdyYW0gPSBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoV1BEX0ltYWdlVVJJKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFEX0ltYWdlVVJJKCkgewotCQlyZXR1cm4gQURfSW1hZ2VVUkk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBRERfSW1hZ2VVUkkoKSB7Ci0JCXJldHVybiBBRERfSW1hZ2VVUkk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXUERfSW1hZ2VVUkkoKSB7Ci0JCXJldHVybiBXUERfSW1hZ2VVUkk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgb3B0aW9uIHRvIHB1Ymxpc2ggdXNlci1zcGVjaWZpZWQgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0KLQkgKiBpbnN0ZWFkLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblB1Ymxpc2hBRERJbWFnZSgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hBRERJbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBvcHRpb24gdG8gcHVibGlzaCB1c2VyLXNwZWNpZmllZCBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbQotCSAqIGluc3RlYWQuCi0JICogCi0JICogQHBhcmFtIHB1Ymxpc2hBRERJbWFnZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hBRERJbWFnZShib29sZWFuIHB1Ymxpc2hBRERJbWFnZSkgewotCQl0aGlzLnB1Ymxpc2hBRERJbWFnZSA9IHB1Ymxpc2hBRERJbWFnZTsKLQkJc2F2ZSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wdGlvbiB0byBwdWJsaXNoIHVzZXItc3BlY2lmaWVkIGFjdGl2aXR5IGRpYWdyYW0gaW5zdGVhZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlEaWFncmFtKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5QdWJsaXNoQURJbWFnZSgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hBREltYWdlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG9wdGlvbiB0byBwdWJsaXNoIHVzZXItc3BlY2lmaWVkIGltYWdlIGZvciBhY3Rpdml0eSBkaWFncmFtCi0JICogaW5zdGVhZCBvZiB0aGUgYWN0aXZpdHkgZGlhZ3JhbQotCSAqIAotCSAqIEBwYXJhbSBwdWJsaXNoQURJbWFnZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hBREltYWdlKGJvb2xlYW4gcHVibGlzaEFESW1hZ2UpIHsKLQkJdGhpcy5wdWJsaXNoQURJbWFnZSA9IHB1Ymxpc2hBREltYWdlOwotCQlzYXZlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgb3B0aW9uIHRvIHB1Ymxpc2ggdXNlci1zcGVjaWZpZWQgd29yayBwcm9kdWN0IGRlcGVuZGVuY3kgZGlhZ3JhbQotCSAqIGluc3RlYWQuCi0JICogCi0JICogQHJldHVybgotCSAqIEBzZWUgI2dldFdQRERpYWdyYW0oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblB1Ymxpc2hXUERJbWFnZSgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hXUERJbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBvcHRpb24gdG8gcHVibGlzaCB1c2VyLXNwZWNpZmllZCBpbWFnZSBmb3Igd29yayBwcm9kdWN0Ci0JICogZGVwZW5kZW5jeSBkaWFncmFtIGluc3RlYWQgb2YgdGhlIHdvcmsgcHJvZHVjdCBkZXBlbmRlbmN5IGRpYWdyYW0KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaFdQREltYWdlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaFdQREltYWdlKGJvb2xlYW4gcHVibGlzaFdQREltYWdlKSB7Ci0JCXRoaXMucHVibGlzaFdQREltYWdlID0gcHVibGlzaFdQREltYWdlOwotCQlzYXZlKCk7Ci0JfQotCi0JcHVibGljIFN1cHBvcnRpbmdNYXRlcmlhbCBnZXRBY3Rpdml0eURpYWdyYW0oKSB7Ci0JCXJldHVybiBhY3Rpdml0eURpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB1c2VyLXNwZWNpZmllZCBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEge0BsaW5rIFN1cHBvcnRpbmdNYXRlcmlhbH0gd2l0aCB0aGUgZGlncmFtIGluIGl0cyBtYWluCi0JICogICAgICAgICBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkgewotCQlyZXR1cm4gYWN0aXZpdHlEZXRhaWxEaWFncmFtOwotCX0KLQotCS8qKgotCSAqIEdldHMgdXNlci1zcGVjaWZpZWQgd29yayBwcm9kdWN0IGRlcGVuZGVuY3kgZGlhZ3JhbS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEge0BsaW5rIFN1cHBvcnRpbmdNYXRlcmlhbH0gd2l0aCB0aGUgZGlncmFtIGluIGl0cyBtYWluCi0JICogICAgICAgICBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgZ2V0V1BERGlhZ3JhbSgpIHsKLQkJcmV0dXJuIHdwZERpYWdyYW07Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V1BERGlhZ3JhbShTdXBwb3J0aW5nTWF0ZXJpYWwgd3BkRGlhZ3JhbSkgewotCQlpZiAodGhpcy53cGREaWFncmFtICE9IHdwZERpYWdyYW0pIHsKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbCBvbGQgPSB0aGlzLndwZERpYWdyYW07Ci0JCQl0aGlzLndwZERpYWdyYW0gPSB3cGREaWFncmFtOwotCQkJdXBkYXRlKG9sZCwgd3BkRGlhZ3JhbSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eURldGFpbERpYWdyYW0oCi0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwgYWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7Ci0JCWlmICh0aGlzLmFjdGl2aXR5RGV0YWlsRGlhZ3JhbSAhPSBhY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbCBvbGQgPSB0aGlzLmFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLQkJCXRoaXMuYWN0aXZpdHlEZXRhaWxEaWFncmFtID0gYWN0aXZpdHlEZXRhaWxEaWFncmFtOwotCQkJdXBkYXRlKG9sZCwgYWN0aXZpdHlEZXRhaWxEaWFncmFtKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2aXR5RGlhZ3JhbShTdXBwb3J0aW5nTWF0ZXJpYWwgYWN0aXZpdHlEaWFncmFtKSB7Ci0JCWlmICh0aGlzLmFjdGl2aXR5RGlhZ3JhbSAhPSBhY3Rpdml0eURpYWdyYW0pIHsKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbCBvbGQgPSB0aGlzLmFjdGl2aXR5RGlhZ3JhbTsKLQkJCXRoaXMuYWN0aXZpdHlEaWFncmFtID0gYWN0aXZpdHlEaWFncmFtOwotCQkJdXBkYXRlKG9sZCwgYWN0aXZpdHlEaWFncmFtKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIFN1cHBvcnRpbmdNYXRlcmlhbCBvYmplY3QgZm9yIHRoZSBkaWFncmFtIHdpdGggdGhlIGdpdmVuIFVSSQotCSAqIAotCSAqIEBwYXJhbSBkaWFncmFtVVJJCi0JICogQHJldHVybiBudWxsIG9mIHRoZSBTdXBwb3J0aW5nTWF0ZXJpYWwgb2JqZWN0IGNvdWxkIG5vdCBiZSBmb3VuZCBpbiB0aGUKLQkgKiAgICAgICAgIGxpYnJhcnkKLQkgKi8KLQlwcml2YXRlIFN1cHBvcnRpbmdNYXRlcmlhbCBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoU3RyaW5nIGRpYWdyYW1VUkkpIHsKLQkJLy8gZGlhZ3JhbVVSSSBpcyB0aGUgR1VJRCBvZiB0aGUgc3VwcG9ydGluZyBtYXRlcmlhbCB0aGF0IG11c3QgYmUgaW4gdGhlCi0JCS8vIGxpc3QKLQkJLy8gb2Ygc3VwcG9ydGluZyBtYXRlcmlhbHMgb2YgdGhlIGFjdGl2aXR5Ci0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2aXR5LmdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbCBlID0gKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZS5nZXRHdWlkKCkuZXF1YWxzKGRpYWdyYW1VUkkpKSB7Ci0JCQkJcmV0dXJuIGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZShTdXBwb3J0aW5nTWF0ZXJpYWwgb2xkLCBTdXBwb3J0aW5nTWF0ZXJpYWwgbmV1KSB7Ci0JCWlmIChvbGQgIT0gbnVsbCkgewotCQkJYWN0aXZpdHkuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLnJlbW92ZShvbGQpOwotCQl9Ci0JCWlmIChuZXUgIT0gbnVsbCkgewotCQkJYWN0aXZpdHkuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLmFkZChuZXUpOwotCQl9Ci0JCXNhdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHN1cHBvcnRpbmcgbWF0ZXJpYWwgaXMgYSB1c2VyLWRlZmluZWQgZGlhZ3JhbSBvZiB0aGlzCi0JICogRGlhZ3JhbUluZm8ncyBhY3Rpdml0eQotCSAqIAotCSAqIEBwYXJhbSBzbQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpYWdyYW0oU3VwcG9ydGluZ01hdGVyaWFsIHNtKSB7Ci0JCXJldHVybiBzbSAhPSBudWxsCi0JCQkJJiYgKHNtID09IGFjdGl2aXR5RGlhZ3JhbSB8fCBzbSA9PSBhY3Rpdml0eURldGFpbERpYWdyYW0gfHwgc20gPT0gd3BkRGlhZ3JhbSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvRGlhZ3JhbU1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0RpYWdyYW1NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MzNiNjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvRGlhZ3JhbU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotCi0vKioKLSAqIEV4dGVuc2lvbiB0byBjb250cmlidXRlIHRvIGV4dGVuc2lvbiBwb2ludAotICogIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZGlhZ3JhbU1hbmFnZXIiCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gSnVuIDI3LCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTWFuYWdlciBpbXBsZW1lbnRzIElEaWFncmFtTWFuYWdlciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXIjZ2V0RGlhZ3JhbShvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBEaWFncmFtIGdldERpYWdyYW0oQWN0aXZpdHkgYWN0LCBpbnQgdHlwZSkgewotCQlyZXR1cm4gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRVTUFEaWFncmFtKGFjdCwgdHlwZSwKLQkJCQlmYWxzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9HcmFwaGljYWxEYXRhSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9HcmFwaGljYWxEYXRhSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYzA2M2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvR3JhcGhpY2FsRGF0YUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTmFtZWROb2RlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoaWNhbERhdGFIZWxwZXIgewotCS8qKiBEaWFncmFtIHR5cGUgY29uc3RhbnRzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfRElBR1JBTSA9IElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSA9IElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0gPSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU07Ci0KLQlzdGF0aWMgZmluYWwgaW50W10gRElBR1JBTV9UWVBFUyA9IHsgQUNUSVZJVFlfRElBR1JBTSwKLQkJCUFDVElWSVRZX0RFVEFJTF9ESUFHUkFNLCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNIH07Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gRElBR1JBTV9UWVBFX1RFWFRTID0gewotCQkJRGlhZ3JhbVJlc291cmNlcy50eXBlX2FjdGl2aXR5LCBEaWFncmFtUmVzb3VyY2VzLnR5cGVfV1BELCBEaWFncmFtUmVzb3VyY2VzLnR5cGVfYWN0aXZpdHlEZXRhaWwgfTsgCi0KLQkvKiogUHJvcGVydHkgbmFtZXMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1RZUEUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfV09SS19QUk9EVUNUX0NPTVBPU0lURV9UWVBFID0gIndwQ29tcG9zaXRlVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogcHJvcGVydHkgbmFtZXMgZm9yIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtICoqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQVVUT19MQVlPVVQgPSAiYXV0b2xheW91dCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0lOREVYID0gImluZGV4IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBwcm9wZXJ0eSB2YWx1ZXMgY29uc3RhbnRzIGZvciBhdXRvbGF5b3V0ICoqLwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQVVUT19MQVlPVVRfVkFMVUVfVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQVVUT19MQVlPVVRfVkFMVUVfRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIFR5cGUgaW5mbyBmb3IgVUkgbm9kZSAoQHNlZSBUeXBlZE5vZGUpICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfTk9ERV9TWU5DSF9CQVIgPSAic3luY2hub25pemF0aW9uIGJhciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQVBIX05PREVfU1RBUlQgPSAic3RhcnQgbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQVBIX05PREVfRU5EID0gImVuZCBub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfTk9ERV9ERUNJU0lPTiA9ICJkZWNpc2lvbiBub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfTk9ERV9GUkVFX1RFWFQgPSAiZnJlZSB0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqIERpYWdyYW0gdHlwZSBzdHJpbmcgY29uc3RhbnRzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR1JBTV9XT1JLRkxPVyA9ICJXb3JrZmxvdyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUdSQU1fV09SS19QUk9EVUNUX0RFUEVOREVOQ1kgPSAiV29yayBQcm9kdWN0IERlcGVuZGVuY3kiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFHUkFNX0FDVElWSVRZX0RFVEFJTCA9ICJBY3Rpdml0eSBEZXRhaWwiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0RJQUdSQU1fVEFTS1NfUEVSX1JPVyA9ICJBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9UQVNLU19QRVJfUk9XIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBQb2ludCB0b1BvaW50KG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgcCkgewotCQlyZXR1cm4gbmV3IFBvaW50KHAuZ2V0WCgpLmRvdWJsZVZhbHVlKCksIHAuZ2V0WSgpLmRvdWJsZVZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCBuZXdNb2RlbFBvaW50KGludCB4LCBpbnQgeSkgewotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50IHAgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb2ludCgpOwotCQlwLnNldFgobmV3IERvdWJsZSh4KSk7Ci0JCXAuc2V0WShuZXcgRG91YmxlKHkpKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0eSBmaW5kUHJvcGVydHkoR3JhcGhOb2RlIG5vZGUsIFN0cmluZyBwcm9wS2V5KSB7Ci0JCWZvciAoaW50IGkgPSBub2RlLmdldFByb3BlcnR5KCkuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCVByb3BlcnR5IHByb3AgPSAoUHJvcGVydHkpIG5vZGUuZ2V0UHJvcGVydHkoKS5nZXQoaSk7Ci0JCQlpZiAocHJvcEtleS5lcXVhbHMocHJvcC5nZXRLZXkoKSkpCi0JCQkJcmV0dXJuIHByb3A7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHdpZHRoCi0JICogQHBhcmFtIGhlaWdodAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpbWVuc2lvbiBuZXdNb2RlbERpbWVuc2lvbihpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJRGltZW5zaW9uIHNpemUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaW1lbnNpb24oKTsKLQkJc2l6ZS5zZXRXaWR0aChuZXcgRG91YmxlKHdpZHRoKSk7Ci0JCXNpemUuc2V0SGVpZ2h0KG5ldyBEb3VibGUoaGVpZ2h0KSk7Ci0JCXJldHVybiBzaXplOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsQ29ubmVjdGlvbnMoTm9kZSBub2RlLCBHcmFwaE5vZGUgZ3JhcGhOb2RlKSB7Ci0JCWJvb2xlYW4gb2xkID0gbm9kZS5lRGVsaXZlcigpOwotCQl0cnkgewotCQkJbm9kZS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIGRpYWdyYW0gPSAob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgbm9kZQotCQkJCQkuZUNvbnRhaW5lcigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ3JhcGhOb2RlLmdldEFuY2hvcmFnZSgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlHcmFwaENvbm5lY3RvciBjb25uID0gKChHcmFwaENvbm5lY3RvcikgaXRlci5uZXh0KCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb25uLmdldEdyYXBoRWRnZSgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlHcmFwaEVkZ2UgZWRnZSA9IChHcmFwaEVkZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYoZWRnZS5nZXRBbmNob3IoKS5zaXplKCkgPiAxKSB7IAotCQkJCQkJR3JhcGhDb25uZWN0b3IgdGFyZ2V0Q29ubmVjdG9yOwotCQkJCQkJTGluayBsaW5rID0gbnVsbDsKLQkJCQkJCWlmIChlZGdlLmVDb250YWluZXIoKSA9PSBncmFwaE5vZGUpIHsKLQkJCQkJCQl0YXJnZXRDb25uZWN0b3IgPSAoR3JhcGhDb25uZWN0b3IpIGVkZ2UuZ2V0QW5jaG9yKCkKLQkJCQkJCQkuZ2V0KDEpOwotCQkJCQkJCUdyYXBoTm9kZSB0YXJnZXRHcmFwaE5vZGUgPSAoR3JhcGhOb2RlKSB0YXJnZXRDb25uZWN0b3IKLQkJCQkJCQkuZUNvbnRhaW5lcigpOwotCQkJCQkJCWlmIChncmFwaE5vZGUuZUNvbnRhaW5lcigpID09IHRhcmdldEdyYXBoTm9kZQotCQkJCQkJCQkJLmVDb250YWluZXIoKSkgewotCQkJCQkJCQlPYmplY3QgbGlua2VkT2JqZWN0ID0gdGFyZ2V0R3JhcGhOb2RlOwotCQkJCQkJCQlpZiAodGFyZ2V0R3JhcGhOb2RlLmdldFNlbWFudGljTW9kZWwoKSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIHsKLQkJCQkJCQkJCWxpbmtlZE9iamVjdCA9ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgdGFyZ2V0R3JhcGhOb2RlCi0JCQkJCQkJCQkJCS5nZXRTZW1hbnRpY01vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZihsaW5rZWRPYmplY3QgIT0gbnVsbCl7Ci0JCQkJCQkJCQlOb2RlIHRhcmdldE5vZGUgPSBmaW5kTm9kZShkaWFncmFtLCBsaW5rZWRPYmplY3QpOwotCQkJCQkJCQkJbGluayA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluaygpOwotCQkJCQkJCQkJbGluay5zZXRTb3VyY2Uobm9kZSk7Ci0JCQkJCQkJCQlsaW5rLnNldFRhcmdldCh0YXJnZXROb2RlKTsKLQkJCQkJCQkJCWxpbmsuc2V0T2JqZWN0KGVkZ2UpOwotCQkJCQkJCQl9ZWxzZXsKLQkJCQkJCQkJCWlmKExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpKXsKLQkJCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxpbmtlZCBvYmplY3QgaXMgbnVsbDogZm9yOiAiKyBub2RlLmdldEdyYXBoTm9kZSgpICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJIjogZm9yIGdyYXBoQ29ubmVjdG9yOiAiKwl0YXJnZXRDb25uZWN0b3IpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW5vZGUuZVNldERlbGl2ZXIob2xkKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgTm9kZSBmaW5kTm9kZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIGRpYWdyYW0sCi0JCQlHcmFwaE5vZGUgZ05vZGUsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCVNlbWFudGljTW9kZWxCcmlkZ2UgYnJpZGdlID0gZ05vZGUuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQlpZiAoYnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgewotCQkJSU5vZGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IChJTm9kZUNoYW5nZUxpc3RlbmVyKSBVbWFVdGlsCi0JCQkJCS5nZXRBZGFwdGVyKCgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgYnJpZGdlKS5nZXRFbGVtZW50KCksCi0JCQkJCQkJYWRhcHRlclR5cGUpOwotCQkJcmV0dXJuIGxpc3RlbmVyLmdldE5vZGUoKTsKLQkJfQotCi0JCS8vIGdOb2RlIGlzIG5vdCBhIGFjdGl2aXR5J3MgR3JhcGhOb2RlLiBUcnkgdG8gZmluZCBhIE5vZGUgd2l0aCBnTm9kZSBhcwotCQkvLyBhIGxpbmtlZCBvYmplY3QgaW4gdGhlIGRpYWdyYW0uCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgZWxlbWVudCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChnTm9kZSA9PSBlbGVtZW50LmdldE9iamVjdCgpKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgbm9kZSB3aG9zZSBsaW5rZWQgb2JqZWN0IGlzIHRoZSBnaXZlbiBvYmplY3QKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBOb2RlIGZpbmROb2RlKE5vZGVDb250YWluZXIgY29udGFpbmVyLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRhaW5lci5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBlbGVtZW50ID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iamVjdCA9PSBlbGVtZW50LmdldE9iamVjdCgpIHx8IG9iamVjdCA9PSBlbGVtZW50LmdldExpbmtlZEVsZW1lbnQoKSkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIG5vZGUgd2hvc2UgbGlua2VkIG9iamVjdCBvciBvbmUgb2YgaXRzIGJhc2UgaXMgdGhlIGdpdmVuIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTm9kZSBmaW5kTm9kZShOb2RlQ29udGFpbmVyIGNvbnRhaW5lciwgT2JqZWN0IG9iamVjdCwKLQkJCWJvb2xlYW4gY2hlY2tCYXNlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRhaW5lci5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iamVjdCA9PSBub2RlLmdldE9iamVjdCgpKSB7Ci0JCQkJcmV0dXJuIG5vZGU7Ci0JCQl9IGVsc2UgaWYgKGNoZWNrQmFzZQotCQkJCQkmJiBub2RlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJZm9yIChWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoKFZhcmlhYmlsaXR5RWxlbWVudCkgbm9kZQotCQkJCQkJLmdldE9iamVjdCgpKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7IHZlICE9IG51bGw7IHZlID0gdmUKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpIHsKLQkJCQkJaWYgKHZlID09IG9iamVjdCkgewotCQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBOb2RlIGZpbmROb2RlKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBkaWFncmFtLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCU5vZGUgbm9kZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgZWxlbWVudCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGUgCi0JCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZSkgewotCQkJCW5vZGUgPSBmaW5kTm9kZSgoTm9kZUNvbnRhaW5lcikgZWxlbWVudCwgb2JqZWN0KTsKLQkJCQlpZiAobm9kZSAhPSBudWxsKQotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQkJCWlmIChvYmplY3QgPT0gZWxlbWVudC5nZXRPYmplY3QoKSkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE5vZGUgZmluZE5vZGUoQWN0aXZpdHlEZXRhaWxEaWFncmFtIGRpYWdyYW0sIE9iamVjdCBvYmplY3QsIENsYXNzIHR5cGUpIHsKLQkJTm9kZSBub2RlID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBlbGVtZW50ID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZSAKLQkJCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlKSB7Ci0JCQkJbm9kZSA9IGZpbmROb2RlKChOb2RlQ29udGFpbmVyKSBlbGVtZW50LCBvYmplY3QpOwotCQkJCWlmIChub2RlICE9IG51bGwpCi0JCQkJCXJldHVybiBub2RlOwotCQkJfQotCQkJaWYgKG9iamVjdCA9PSBlbGVtZW50LmdldE9iamVjdCgpICYmIHR5cGUuaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpbmsgZmluZExpbmsoTm9kZSBzb3VyY2UsIE9iamVjdCB0YXJnZXRMaW5rZWRFbGVtZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNvdXJjZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlOb2RlIHRhcmdldCA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCQlpZih0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQuZ2V0TGlua2VkRWxlbWVudCgpID09IHRhcmdldExpbmtlZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gbGluazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZVN0cmluZyhpbnQgdHlwZSkgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBUeXBlZE5vZGUuREVDSVNJT046Ci0JCQlyZXR1cm4gR1JBUEhfTk9ERV9ERUNJU0lPTjsKLQkJY2FzZSBUeXBlZE5vZGUuRU5EOgotCQkJcmV0dXJuIEdSQVBIX05PREVfRU5EOwotCQljYXNlIFR5cGVkTm9kZS5TVEFSVDoKLQkJCXJldHVybiBHUkFQSF9OT0RFX1NUQVJUOwotCQljYXNlIFR5cGVkTm9kZS5TWU5DSF9CQVI6Ci0JCQlyZXR1cm4gR1JBUEhfTk9ERV9TWU5DSF9CQVI7Ci0JCWNhc2UgVHlwZWROb2RlLkZSRUVfVEVYVDoKLQkJCXJldHVybiBHUkFQSF9OT0RFX0ZSRUVfVEVYVDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEdyYXBoTm9kZSBuZXdUeXBlZEdyYXBoTm9kZShpbnQgdHlwZSkgewotCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGhOb2RlKCk7Ci0JCVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IGJyaWRnZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCk7Ci0JCWJyaWRnZS5zZXRUeXBlSW5mbyhnZXRUeXBlU3RyaW5nKHR5cGUpKTsKLQkJZ3JhcGhOb2RlLnNldFNlbWFudGljTW9kZWwoYnJpZGdlKTsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCBwb2ludCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvaW50KCk7Ci0JCXBvaW50LnNldFgobmV3IERvdWJsZSgtMSkpOwotCQlwb2ludC5zZXRZKG5ldyBEb3VibGUoLTEpKTsKLQkJZ3JhcGhOb2RlLnNldFBvc2l0aW9uKHBvaW50KTsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24gZGltID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGltZW5zaW9uKCk7Ci0JCWRpbS5zZXRXaWR0aChuZXcgRG91YmxlKC0xKSk7Ci0JCWRpbS5zZXRIZWlnaHQobmV3IERvdWJsZSgtMSkpOwotCQlncmFwaE5vZGUuc2V0U2l6ZShkaW0pOwotCi0JCWlmICh0eXBlID09IFR5cGVkTm9kZS5GUkVFX1RFWFQpIHsKLQkJCWdyYXBoTm9kZS5zZXROYW1lKERpYWdyYW1SZXNvdXJjZXMuYWRkRnJlZVR4dCk7IAotCQl9Ci0JCWlmICh0eXBlID09IFR5cGVkTm9kZS5GUkVFX1RFWFQpIHsKLQkJCVByb3BlcnR5IHByb3BlcnR5ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHkoKTsKLQkJCXByb3BlcnR5LnNldEtleShHUkFQSF9OT0RFX0ZSRUVfVEVYVCk7Ci0JCQlwcm9wZXJ0eS5zZXRWYWx1ZShEaWFncmFtUmVzb3VyY2VzLmFkZEZyZWVUeHQpOyAKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWxpc3QuYWRkKHByb3BlcnR5KTsKLQkJCWdyYXBoTm9kZS5zZXQoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSwgbGlzdCk7Ci0JCX0KLQotCQlyZXR1cm4gZ3JhcGhOb2RlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaW5rCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUdyYXBoaWNhbERhdGEoTGluayBsaW5rKSB7Ci0JCS8vIEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlR3JhcGhDb25uZWN0b3JQYWlyKGxpbmsuZ2V0U291cmNlKCkuZ2V0R3JhcGhOb2RlKCksCi0JCS8vIGxpbmsuZ2V0VGFyZ2V0KCkuZ2V0R3JhcGhOb2RlKCkpOwotCQkKLQkJR3JhcGhFZGdlIGVkZ2UgPSAoR3JhcGhFZGdlKSBsaW5rLmdldE9iamVjdCgpOwotCQlpZihlZGdlICE9IG51bGwpIHsKLQkJCUdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlR3JhcGhFZGdlKGVkZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpbmsKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkR3JhcGhpY2FsRGF0YShMaW5rIGxpbmspIHsKLQkJR3JhcGhFZGdlIGVkZ2UgPSAoR3JhcGhFZGdlKSBsaW5rLmdldE9iamVjdCgpOwotCQlpZiAoZWRnZSA9PSBudWxsKSB7Ci0JCQkvLyBuZXcgbGluawotCQkJLy8KLQkJCWVkZ2UgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZEdyYXBoQ29ubmVjdG9yUGFpcigKLQkJCQkJbGluay5nZXRTb3VyY2UoKS5nZXRHcmFwaE5vZGUoKSwKLQkJCQkJbGluay5nZXRUYXJnZXQoKS5nZXRHcmFwaE5vZGUoKSk7Ci0JCQlsaW5rLnNldE9iamVjdChlZGdlKTsKLQotCQkJLy8gc2F2ZSB0aGUgc291cmNlIGVuZCBwb2ludCBhbmQgdGFyZ2V0IGVuZCBwb2ludCBmcm9tIHRoZSBnaXZlbgotCQkJLy8gbGluawotCQkJLy8KLQkJCWxpbmsuc2V0U291cmNlRW5kUG9pbnQobGluay5nZXRTb3VyY2VFbmRQb2ludCgpKTsKLQkJCWxpbmsuc2V0VGFyZ2V0RW5kUG9pbnQobGluay5nZXRUYXJnZXRFbmRQb2ludCgpKTsKLQkJfSBlbHNlIHsKLQkJCS8vIHVuZG8gZGVsZXRlZCBsaW5rCi0JCQkvLwotCQkJR3JhcGhOb2RlIHNyY05vZGUgPSBsaW5rLmdldFNvdXJjZSgpLmdldEdyYXBoTm9kZSgpOwotCQkJR3JhcGhOb2RlIHRhcmdldE5vZGUgPSBsaW5rLmdldFRhcmdldCgpLmdldEdyYXBoTm9kZSgpOwotCQkJT2JqZWN0IHNyY0Nvbm5lY3RvciA9IGVkZ2UuZ2V0QW5jaG9yKCkuZ2V0KDApOwotCQkJc3JjTm9kZS5nZXRBbmNob3JhZ2UoKS5hZGQoKEdyYXBoQ29ubmVjdG9yKSBzcmNDb25uZWN0b3IpOwotCQkJc3JjTm9kZS5nZXRDb250YWluZWQoKS5hZGQoZWRnZSk7Ci0JCQlPYmplY3QgdGFyZ2V0Q29ubmVjdG9yID0gZWRnZS5nZXRBbmNob3IoKS5nZXQoMSk7Ci0JCQl0YXJnZXROb2RlLmdldEFuY2hvcmFnZSgpLmFkZCgoR3JhcGhDb25uZWN0b3IpIHRhcmdldENvbm5lY3Rvcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2VtYW50aWNNb2RlbChMaW5rIGxpbmssIFdvcmtPcmRlciB3b3JrT3JkZXIpIHsKLQkJLy8gc2V0IHRoZSBXb3JrT3JkZXIgYXMgdGhlIGVsZW1lbnQgb2YgdGhlIFNlbWFudGljTW9kZWwgb2YgdGhlIGxpbmsncwotCQkvLyBHcmFwaEVkZ2UKLQkJLy8KLQkJR3JhcGhFZGdlIGVkZ2UgPSAoR3JhcGhFZGdlKSBsaW5rLmdldE9iamVjdCgpOwotCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIGJyaWRnZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQkJYnJpZGdlLnNldEVsZW1lbnQod29ya09yZGVyKTsKLQkJZWRnZS5zZXRTZW1hbnRpY01vZGVsKGJyaWRnZSk7Ci0JfQotCi0JLy8gcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldFNvdXJjZUFjdGl2aXR5Tm9kZXMoVHlwZWROb2RlIHR5cGVkTm9kZSkgewotCS8vIExpc3QgYWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gZ2V0U291cmNlQWN0aXZpdHlOb2RlcyhhY3ROb2RlcywgdHlwZWROb2RlKTsKLQkvLyByZXR1cm4gYWN0Tm9kZXM7Ci0JLy8gfQotCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldFNvdXJjZU5vZGVzKFR5cGVkTm9kZSB0eXBlZE5vZGUsIENsYXNzIHR5cGUpIHsKLQkJTGlzdCBhY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0U291cmNlTm9kZXMoYWN0Tm9kZXMsIHR5cGVkTm9kZSwgdHlwZSk7Ci0JCXJldHVybiBhY3ROb2RlczsKLQl9Ci0KLQkvLyBwdWJsaWMgc3RhdGljIHZvaWQgZ2V0U291cmNlQWN0aXZpdHlOb2RlcyhDb2xsZWN0aW9uIGFjdE5vZGVzLCBUeXBlZE5vZGUKLQkvLyB0eXBlZE5vZGUpIHsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlZE5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7Ci0JLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gTGluayBsaW5rID0gKExpbmspaXRlci5uZXh0KCk7Ci0JLy8gTm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCS8vIGlmKHNvdXJjZSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCS8vIGFjdE5vZGVzLmFkZChzb3VyY2UpOwotCS8vIH0KLQkvLyBlbHNlIGlmKHNvdXJjZSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCS8vIGdldFNvdXJjZUFjdGl2aXR5Tm9kZXMoYWN0Tm9kZXMsIChUeXBlZE5vZGUpIHNvdXJjZSk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0KLQkvLyBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0VGFyZ2V0QWN0aXZpdHlOb2RlcyhUeXBlZE5vZGUgdHlwZWROb2RlKSB7Ci0JLy8gTGlzdCBhY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBnZXRUYXJnZXRBY3Rpdml0eU5vZGVzKGFjdE5vZGVzLCB0eXBlZE5vZGUpOwotCS8vIHJldHVybiBhY3ROb2RlczsKLQkvLyB9Ci0KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0VGFyZ2V0Tm9kZXMoVHlwZWROb2RlIHR5cGVkTm9kZSwgQ2xhc3MgdHlwZSkgewotCQlMaXN0IGFjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRUYXJnZXROb2RlcyhhY3ROb2RlcywgdHlwZWROb2RlLCB0eXBlKTsKLQkJcmV0dXJuIGFjdE5vZGVzOwotCX0KLQotCS8vIHB1YmxpYyBzdGF0aWMgdm9pZCBnZXRUYXJnZXRBY3Rpdml0eU5vZGVzKENvbGxlY3Rpb24gYWN0Tm9kZXMsIFR5cGVkTm9kZQotCS8vIHR5cGVkTm9kZSkgewotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkTm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsKLQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBMaW5rIGxpbmsgPSAoTGluaylpdGVyLm5leHQoKTsKLQkvLyBOb2RlIHRhcmdldCA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JLy8gaWYodGFyZ2V0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JLy8gYWN0Tm9kZXMuYWRkKHRhcmdldCk7Ci0JLy8gfQotCS8vIGVsc2UgaWYodGFyZ2V0IGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JLy8gZ2V0VGFyZ2V0QWN0aXZpdHlOb2RlcyhhY3ROb2RlcywgKFR5cGVkTm9kZSkgdGFyZ2V0KTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQotCS8qKgotCSAqIEdldHMgYWxsIG5vZGVzIHdpdGggdGhlIGdpdmVuIHR5cGUgdGhhdCBhcmUgZGlyZWN0IG9yIGluZGlyZWN0IHRhcmdldHMgb2YKLQkgKiB0aGUgZ2l2ZW4gc291cmNlIHR5cGVkTm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0Tm9kZXMKLQkgKiBAcGFyYW0gdHlwZWROb2RlCi0JICogQHBhcmFtIHR5cGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0VGFyZ2V0Tm9kZXMoQ29sbGVjdGlvbiBhY3ROb2RlcywgVHlwZWROb2RlIHR5cGVkTm9kZSwKLQkJCUNsYXNzIHR5cGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCU5vZGUgdGFyZ2V0ID0gbGluay5nZXRUYXJnZXQoKTsKLQkJCWlmICh0eXBlLmlzSW5zdGFuY2UodGFyZ2V0KSkgewotCQkJCWFjdE5vZGVzLmFkZCh0YXJnZXQpOwotCQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQlnZXRUYXJnZXROb2RlcyhhY3ROb2RlcywgKFR5cGVkTm9kZSkgdGFyZ2V0LCB0eXBlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRTb3VyY2VOb2RlcyhDb2xsZWN0aW9uIGFjdE5vZGVzLCBUeXBlZE5vZGUgdHlwZWROb2RlLAotCQkJQ2xhc3MgdHlwZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlZE5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJTm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCQkJaWYgKHR5cGUuaXNJbnN0YW5jZShzb3VyY2UpKSB7Ci0JCQkJYWN0Tm9kZXMuYWRkKHNvdXJjZSk7Ci0JCQl9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCWdldFNvdXJjZU5vZGVzKGFjdE5vZGVzLCAoVHlwZWROb2RlKSBzb3VyY2UsIHR5cGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBOb2RlIGdldEZpcnN0U291cmNlTm9kZShUeXBlZE5vZGUgdHlwZWROb2RlLCBDbGFzcyB0eXBlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkTm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCQlpZiAodHlwZS5pc0luc3RhbmNlKHNvdXJjZSkpIHsKLQkJCQlyZXR1cm4gc291cmNlOwotCQkJfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQlzb3VyY2UgPSBnZXRGaXJzdFNvdXJjZU5vZGUoKFR5cGVkTm9kZSkgc291cmNlLCB0eXBlKTsKLQkJCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJCXJldHVybiBzb3VyY2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXIgcmVtb3ZlV29ya09yZGVyKE5hbWVkTm9kZUltcGwgbm9kZSwKLQkJCU9iamVjdCBwcmVkQnJlYWtkb3duRWxlbWVudCkgewotCQlib29sZWFuIG5vdGlmeSA9IG5vZGUuaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlub2RlLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJcmV0dXJuIFVtYVV0aWwucmVtb3ZlV29ya09yZGVyKChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZQotCQkJCQkuZ2V0T2JqZWN0KCksIHByZWRCcmVha2Rvd25FbGVtZW50KTsKLQkJfSBmaW5hbGx5IHsKLQkJCW5vZGUuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChub3RpZnkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXIgYWRkRGVmYXVsdFdvcmtPcmRlcihOYW1lZE5vZGVJbXBsIG5vZGUsCi0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkQnJlYWtkb3duRWxlbWVudCkgewotCQlib29sZWFuIG5vdGlmeSA9IG5vZGUuaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlub2RlLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJcmV0dXJuIFVtYVV0aWwuY3JlYXRlRGVmYXVsdFdvcmtPcmRlcigoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUKLQkJCQkJLmdldE9iamVjdCgpLCBwcmVkQnJlYWtkb3duRWxlbWVudCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlub2RlLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZ5KTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhc2tEZXNjcmlwdG9yCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNOb1JvbGVEZXNjcmlwdG9yQXNzb2NpYXRlZCgKLQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yKSB7Ci0JCXJldHVybiB0YXNrRGVzY3JpcHRvci5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpID09IG51bGw7Ci0JCS8vIGNvbW1lbnRlZCAtIHJlcXVpcmVtZW50cyBub3QgdG8gYWxsb3cgYWRkaXRpb25hbCBwZXJmb3JtZXIgYW5kCi0JCS8vIGFzc2lzdGVkIGJ5IGluIGRpYWdyYW1zLgotCQkvLyAmJiB0YXNrRGVzY3JpcHRvci5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmlzRW1wdHkoKTsKLQkJLy8gJiYgdGFza0Rlc2NyaXB0b3IuZ2V0QXNzaXN0ZWRCeSgpLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhOb2RlQ29udGFpbmVyIGNvbnRhaW5lciwgTm9kZSBub2RlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRhaW5lci5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgPT0gbm9kZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIKLQkJCQkJJiYgY29udGFpbnMoKE5vZGVDb250YWluZXIpIGNoaWxkLCBub2RlKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVmcmVzaEZyb21CYXNlKERpYWdyYW0gZGlhZ3JhbSkgewotCQkvLyBmaW5kIHRoZSBiYXNlIGRpYWdyYW0KLQkJLy8KLQkJU2VtYW50aWNNb2RlbEJyaWRnZSBtb2RlbEJyaWRnZSA9IGRpYWdyYW0uZ2V0U2VtYW50aWNNb2RlbCgpOwotCQlpZiAobW9kZWxCcmlkZ2UgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSB7Ci0JCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIHVtYU1vZGVsQnJpZGdlID0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBtb2RlbEJyaWRnZSk7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIHVtYU1vZGVsQnJpZGdlLmdldEVsZW1lbnQoKTsKLQkJCUFjdGl2aXR5IGJhc2UgPSAoQWN0aXZpdHkpIGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoYmFzZSA9PSBudWxsCi0JCQkJCXx8IGFjdC5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlQpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpbnQgZGlhZ3JhbVR5cGUgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXREaWFncmFtVHlwZShkaWFncmFtKTsKLQkJCXN3aXRjaCAoZGlhZ3JhbVR5cGUpIHsKLQkJCWNhc2UgQUNUSVZJVFlfRElBR1JBTTogewotCQkJCURpYWdyYW0gYmFzZURpYWdyYW0gPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0VU1BRGlhZ3JhbShiYXNlLCBkaWFncmFtVHlwZSwgZmFsc2UpOwotCQkJCWlmIChiYXNlRGlhZ3JhbSA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJTGlzdCBvbGROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlEaWFncmFtIGNvcHkgPSBjb3B5RGlhZ3JhbShiYXNlRGlhZ3JhbSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYmFzZURpYWdyYW0uZ2V0Q29udGFpbmVkKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJR3JhcGhOb2RlIGJhc2VOb2RlID0gKEdyYXBoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCW1vZGVsQnJpZGdlID0gYmFzZU5vZGUuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCQlpZiAobW9kZWxCcmlkZ2UgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSB7Ci0JCQkJCQkvLyB0aGlzIGlzIGEgZWxlbWVudCdzIG5vZGUKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgbW9kZWxCcmlkZ2UpCi0JCQkJCQkJCS5nZXRFbGVtZW50KCk7Ci0JCQkJCQlHcmFwaE5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmZpbmRHcmFwaE5vZGUoCi0JCQkJCQkJCWRpYWdyYW0sIGUpOwotCQkJCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkJCW9sZE5vZGVzLmFkZChub2RlKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChpc1VJR3JhcGhOb2RlKGJhc2VOb2RlKSkgewotCQkJCQkJR3JhcGhOb2RlIG5vZGUgPSBmaW5kVUlHcmFwaE5vZGUoZGlhZ3JhbSwgYmFzZU5vZGUKLQkJCQkJCQkJLmdldEd1aWQoKSk7Ci0JCQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJb2xkTm9kZXMuYWRkKG5vZGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gLy8gcmVtb3ZlIGFsbCB0aGUgR3JhcGhFZGdlcyBvZiB0aGUgb2xkIG5vZGVzCi0JCQkJLy8gLy8KLQkJCQkvLyBMaXN0IHJlbW92ZUVkZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IG9sZE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCS8vIEdyYXBoTm9kZSBub2RlID0gKEdyYXBoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJLy8gZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5vZGUuZ2V0Q29udGFpbmVkKCkuaXRlcmF0b3IoKTsKLQkJCQkvLyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJLy8gT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIEdyYXBoRWRnZSkgewotCQkJCS8vIHJlbW92ZUVkZ2VzLmFkZChlbGVtZW50KTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyBpZighcmVtb3ZlRWRnZXMuaXNFbXB0eSgpKSB7Ci0JCQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gcmVtb3ZlRWRnZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS8vIC5oYXNOZXh0KCk7KSB7Ci0JCQkJLy8gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVHcmFwaEVkZ2UoKEdyYXBoRWRnZSkKLQkJCQkvLyBpdGVyLm5leHQoKSk7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQotCQkJCS8vIHJlbW92ZSBvbGQgbm9kZXMKLQkJCQkvLwotCQkJCWRpYWdyYW0uZ2V0Q29udGFpbmVkKCkucmVtb3ZlQWxsKG9sZE5vZGVzKTsKLQotCQkJCS8vIHJlbW92ZSB1bnVzZWQgb2xkIFVJIG5vZGVzICYmIG5vZGVzIG9mIGNvbnRyaWJ1dG9yL3JlcGxhY2VyCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXRDb250YWluZWQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlHcmFwaE5vZGUgbm9kZSA9IChHcmFwaE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoaXNVSUdyYXBoTm9kZShub2RlKQotCQkJCQkJCSYmIG5vZGUuZ2V0QnJpZWZEZXNjcmlwdGlvbigpICE9IG51bGwKLQkJCQkJCQkmJiBub2RlLmdldEJyaWVmRGVzY3JpcHRpb24oKS5sZW5ndGgoKSA+IDAKLQkJCQkJLy8gJiYgbm9kZS5nZXRDb250YWluZWQoKS5pc0VtcHR5KCkKLQkJCQkJKSB7Ci0JCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSBub2RlLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCQkJCWlmIChicmlkZ2UgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSB7Ci0JCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBicmlkZ2UpCi0JCQkJCQkJCQkuZ2V0RWxlbWVudCgpOwotCQkJCQkJCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCQkJCSYmICgoQWN0aXZpdHkpIGUpCi0JCQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHJlcGxhY2UgYXNzb2NpYXRlZCBiYXNlIGVsZW1lbnQgd2l0aCBjb250cmlidXRpbmcvcmVwbGFjaW5nCi0JCQkJLy8gZWxlbWVudAotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2VFbGVtZW50ID0gKChBY3Rpdml0eSkgZWxlbWVudCkKLQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJCUdyYXBoTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZmluZEdyYXBoTm9kZSgKLQkJCQkJCQkJY29weSwgYmFzZUVsZW1lbnQpOwotCQkJCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkJCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgYnJpZGdlID0gKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIG5vZGUKLQkJCQkJCQkJCS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJCQkJYnJpZGdlLnNldEVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gYWRkIG5ldyBub2RlcwotCQkJCS8vCi0JCQkJZGlhZ3JhbS5nZXRDb250YWluZWQoKS5hZGRBbGwoY29weS5nZXRDb250YWluZWQoKSk7Ci0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQ6IHsKLQkJCQlEaWFncmFtIGJhc2VEaWFncmFtID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldFVNQURpYWdyYW0oYmFzZSwgZGlhZ3JhbVR5cGUsIGZhbHNlKTsKLQkJCQlpZiAoYmFzZURpYWdyYW0gPT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCUxpc3Qgb2xkTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJRGlhZ3JhbSBjb3B5ID0gY29weURpYWdyYW0oYmFzZURpYWdyYW0pOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGJhc2VEaWFncmFtLmdldENvbnRhaW5lZCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUdyYXBoTm9kZSBiYXNlTm9kZSA9IChHcmFwaE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQltb2RlbEJyaWRnZSA9IGJhc2VOb2RlLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCQkJaWYgKG1vZGVsQnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgewotCQkJCQkJLy8gdGhpcyBpcyBhIGVsZW1lbnQncyBub2RlCi0JCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIG1vZGVsQnJpZGdlKQotCQkJCQkJCQkuZ2V0RWxlbWVudCgpOwotCQkJCQkJR3JhcGhOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5maW5kR3JhcGhOb2RlKAotCQkJCQkJCQlkaWFncmFtLCBlKTsKLQkJCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJCQlvbGROb2Rlcy5hZGQobm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyByZW1vdmUgb2xkIG5vZGVzCi0JCQkJLy8KLQkJCQlkaWFncmFtLmdldENvbnRhaW5lZCgpLnJlbW92ZUFsbChvbGROb2Rlcyk7Ci0KLQkJCQkvLyBhZGQgbmV3IG5vZGVzCi0JCQkJLy8KLQkJCQlkaWFncmFtLmdldENvbnRhaW5lZCgpLmFkZEFsbChjb3B5LmdldENvbnRhaW5lZCgpKTsKLQotCQkJCWJyZWFrOwotCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEBwYXJhbSBiYXNlR3VpZAotCSAqICAgICAgICAgICAgdGhlIEdVSUQgb2YgdGhlIGJhc2UgVUkgR3JhcGhOb2RlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIEdyYXBoTm9kZSBmaW5kVUlHcmFwaE5vZGUoRGlhZ3JhbSBkaWFncmFtLCBTdHJpbmcgYmFzZUd1aWQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXRDb250YWluZWQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUdyYXBoTm9kZSBub2RlID0gKEdyYXBoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoaXNVSUdyYXBoTm9kZShub2RlKQotCQkJCQkmJiBiYXNlR3VpZC5lcXVhbHMobm9kZS5nZXRCcmllZkRlc2NyaXB0aW9uKCkpKSB7Ci0JCQkJcmV0dXJuIG5vZGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVUlHcmFwaE5vZGUoR3JhcGhOb2RlIGdOb2RlKSB7Ci0JCVNlbWFudGljTW9kZWxCcmlkZ2UgbW9kZWxCcmlkZ2UgPSBnTm9kZS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCWlmIChtb2RlbEJyaWRnZSBpbnN0YW5jZW9mIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KSB7Ci0JCQlTdHJpbmcgdHlwZUluZm8gPSAoKFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KSBtb2RlbEJyaWRnZSkKLQkJCQkJLmdldFR5cGVJbmZvKCk7Ci0JCQlpZiAodHlwZUluZm8uZXF1YWxzKEdSQVBIX05PREVfREVDSVNJT04pCi0JCQkJCXx8IHR5cGVJbmZvLmVxdWFscyhHUkFQSF9OT0RFX0VORCkKLQkJCQkJfHwgdHlwZUluZm8uZXF1YWxzKEdSQVBIX05PREVfU1RBUlQpCi0JCQkJCXx8IHR5cGVJbmZvLmVxdWFscyhHUkFQSF9OT0RFX1NZTkNIX0JBUikKLQkJCQkJfHwgdHlwZUluZm8uZXF1YWxzKEdSQVBIX05PREVfRlJFRV9URVhUKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERpYWdyYW0gY29weURpYWdyYW0oRGlhZ3JhbSBiYXNlRGlhZ3JhbSkgewotCQlEaWFncmFtIGNvcHkgPSAoRGlhZ3JhbSkgVG5nVXRpbC5jb3B5KGJhc2VEaWFncmFtKTsKLQotCQkvLyBIQUNLOgotCQkvLyBnbyB0aHJ1IHRoZSBub2RlcyBvZiB0aGUgZGlhZ3JhbSBjb3B5LCBpZiBhbnkgbm9kZSBpcyBhIFVJLW9ubHkgbm9kZQotCQkvLyAoc2VlIFR5cGVkTm9kZSkKLQkJLy8gc2F2ZSB0aGUgR1VJRCBvZiB0aGUgb3JpZ2luYWwgb25lIGluIGl0cyBicmllZkRlc2NyaXB0aW9uIHRvIHJlbWVtYmVyCi0JCS8vIHdobyBpcyBiYXNlLgotCQkvLwotCQlpbnQgc2l6ZSA9IGNvcHkuZ2V0Q29udGFpbmVkKCkuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJR3JhcGhOb2RlIGdOb2RlID0gKEdyYXBoTm9kZSkgY29weS5nZXRDb250YWluZWQoKS5nZXQoaSk7Ci0JCQlpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5pc1VJR3JhcGhOb2RlKGdOb2RlKSkgewotCQkJCWdOb2RlLnNldEJyaWVmRGVzY3JpcHRpb24oKChEaWFncmFtRWxlbWVudCkgYmFzZURpYWdyYW0KLQkJCQkJCS5nZXRDb250YWluZWQoKS5nZXQoaSkpLmdldEd1aWQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCBkaWFncmFtcyBvZiB0aGlzIGFjdGl2aXRpZXMuCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGVkQWN0aXZpdHkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldERpYWdyYW1zKEFjdGl2aXR5IGFjdCkgewotCQlyZXR1cm4gZ2V0RGlhZ3JhbXMoYWN0LCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldERpYWdyYW1zKEFjdGl2aXR5IGFjdCwgYm9vbGVhbiBjcmVhdGUpIHsKLQkJQXJyYXlMaXN0IGRpYWdyYW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IERJQUdSQU1fVFlQRVMubGVuZ3RoOyBpKyspIHsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0VU1BRGlhZ3JhbSgKLQkJCQkJYWN0LCBESUFHUkFNX1RZUEVTW2ldLCBjcmVhdGUpOwotCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCWRpYWdyYW1zLmFkZChkaWFncmFtKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGlhZ3JhbXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGVUZXh0KERpYWdyYW0gZGlhZ3JhbSkgewotCQlpbnQgdHlwZSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0RGlhZ3JhbVR5cGUoZGlhZ3JhbSk7Ci0JCWlmICh0eXBlICE9IC0xKSB7Ci0JCQlyZXR1cm4gRElBR1JBTV9UWVBFX1RFWFRTW3R5cGVdOwotCQl9Ci0JCXJldHVybiBEaWFncmFtUmVzb3VyY2VzLnR5cGVfdW5rbm93bjsgCi0JfQotCi0JLyoqCi0JICogU2V0cyBvciB1bnNldHMgc3VwcHJlc3NlZCBmbGFnIG9mIGFsbCBkaWFncmFtcyBpbiB0aGUgZ2l2ZW4gcHJvY2VzcwotCSAqIAotCSAqIEBwYXJhbSBwcm9jCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEFsbERpYWdyYW1TdXBwcmVzc2VkKFByb2Nlc3MgcHJvYywgYm9vbGVhbiBzdXBwcmVzc2VkKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IocHJvYykgewotCi0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02MTg5NDkwMTQ0NzYzNzExMTRMOwotCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgb2JqZWN0OwotCQkJCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUNvbGxlY3Rpb24gZGlhZ3JhbXMgPSBnZXREaWFncmFtcygoQWN0aXZpdHkpIGl0ZXIubmV4dCgpLAotCQkJCQlzdXBwcmVzc2VkKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBkaWFncmFtcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlkaWFncmFtLnNldFN1cHByZXNzZWQoQm9vbGVhbi52YWx1ZU9mKHN1cHByZXNzZWQpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVVTUFQb2ludChDb2xsZWN0aW9uIHVtYVBvaW50cywgaW50IHgsIGludCB5KQotCS8vIHsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB1bWFQb2ludHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCBwID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQpIGl0ZXIubmV4dCgpOwotCS8vIGlmKHAuZ2V0WCgpLmludFZhbHVlKCkgPT0geCAmJiBwLmdldFkoKS5pbnRWYWx1ZSgpID09IHkpIHsKLQkvLyBpdGVyLnJlbW92ZSgpOwotCS8vIHJldHVybiB0cnVlOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVMaW5rKExpbmsgbGluaykgewotCQlOb2RlIHNvdXJjZU5vZGUgPSBsaW5rLmdldFNvdXJjZSgpOwotCQlOb2RlIHRhcmdldE5vZGUgPSBsaW5rLmdldFRhcmdldCgpOwotCQlib29sZWFuIHNyY05vdGlmeSA9IHNvdXJjZU5vZGUgIT0gbnVsbCA/IHNvdXJjZU5vZGUuZURlbGl2ZXIoKSA6IGZhbHNlOwotCQlib29sZWFuIHRhcmdldE5vdGlmeSA9IHRhcmdldE5vZGUgIT0gbnVsbCA/IHRhcmdldE5vZGUuZURlbGl2ZXIoKQotCQkJCTogZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZiAoc291cmNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJc291cmNlTm9kZS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQl9Ci0JCQlpZiAodGFyZ2V0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0Tm9kZS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQl9Ci0JCQlsaW5rLnNldFNvdXJjZShudWxsKTsKLQkJCWxpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHNvdXJjZU5vZGUgIT0gbnVsbCkgewotCQkJCXNvdXJjZU5vZGUuZVNldERlbGl2ZXIoc3JjTm90aWZ5KTsKLQkJCX0KLQkJCWlmICh0YXJnZXROb2RlICE9IG51bGwpIHsKLQkJCQl0YXJnZXROb2RlLmVTZXREZWxpdmVyKHRhcmdldE5vdGlmeSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgb2JqZWN0IG9yIGl0cyB3cmFwcGVyIGluIHRoZSBnaXZlbiBjb2xsZWN0aW9uCi0JICogCi0JICogQHBhcmFtIGFsbEVsZW1lbnRzCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZmluZEVsZW1lbnQoQ29sbGVjdGlvbiBhbGxFbGVtZW50cywgT2JqZWN0IGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWxsRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGUgPT0gVG5nVXRpbC51bndyYXAoZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJCS8vIElmIG9iamVjdCAoZSkgaXMgYSB3b3JrcHJvZHVjdCBkZXNjcmlwdG9yKCBzdWItYXJ0aWZhY3QpCi0JCQkvLyBwYXNzZWQgY29sbGVjdGlvbiBkb25vdCBoYXZlIHdyYXBwZXIgZm9yIHN1Yi1hcnRpZmFjdCwgY2hlY2sgdGhlCi0JCQkvLyBjb250YWluZXIgYXJ0aWZhY3QncyB3cmFwcGVyLgotCQkJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1OTE0Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJT2JqZWN0IGNoaWxkRWxlbWVudCA9IGZpbmRFbGVtZW50KCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcillbGVtZW50KS5nZXRDaGlsZHJlbihlbGVtZW50KSwgZSk7Ci0JCQkJaWYoY2hpbGRFbGVtZW50ICE9IG51bGwpewotCQkJCQlyZXR1cm4gY2hpbGRFbGVtZW50OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIE1ldGhvZCB0byBjaGVjayBpZiBhbnkgZHVwbGljYXRlIHByZWRlY2Vzc29yIGluIHRoZSBwcmVkZWNlc3NvcnMgbGlzdCBvZgotCSAqIFdvcmtCcmVha2Rvd25FbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbnlEdXBsaWNhdGVQcmVkZWNlc3NvcnMoV29ya0JyZWFrZG93bkVsZW1lbnQgZSkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgcHJlZGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldFByZWRzKGUsIHByZWRsaXN0KTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gcHJlZGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAoIWxpc3QuY29udGFpbnMob2JqKSkgewotCQkJCWxpc3QuYWRkKG9iaik7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRvIGdldCBhbGwgdGhlIHByZWRlY2Vzc29ycyBhY3Rpdml0aWVzIGluc3RlYWQgb2YKLQkgKiB3b3Jrb3JkZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRQcmVkcyhXb3JrQnJlYWtkb3duRWxlbWVudCBlLCBMaXN0IGxpc3QpIHsKLQkJTGlzdCBwcmVkbGlzdCA9IGUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gcHJlZGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlXb3JrT3JkZXIgd29ya29yZGVyID0gKFdvcmtPcmRlcikgaXRvci5uZXh0KCk7Ci0JCQlsaXN0LmFkZCh3b3Jrb3JkZXIuZ2V0UHJlZCgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogTWV0aG9kIHRvIGNoZWNrIGJlZm9yZSBkZWxldGluZyBhIGxpbmsuIElmIGR1cGxpY2F0ZSBwcmVkZWNlc3NvciBleGlzdHMKLQkgKiBpbiB0aGUgbGVnYWN5IGRhdGEsIGNoZWNrIGlmIGRlbGV0aW5nIGxpbmsgc2hvdWxkIHJlbW92ZSBhbGwgdGhlCi0JICogcHJlZGVjZXNzb3JzIG9yIG5vdCBieSB2ZXJpZnlpbmcgaWYgdGFyZ2V0IG9yIGluZGlyZWN0IHRhcmdldCBoYXZlIGRpcmVjdAotCSAqIG9yIGluZGlyZWN0IGxpbmtzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5SZW1vdmVBbGxQcmVkcyhMaW5rIGxpbmssIE5vZGUgb2xkU291cmNlLAotCQkJTm9kZSBvbGRUYXJnZXQpIHsKLQotCQlpZiAob2xkVGFyZ2V0IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQlMaXN0IGlubGlzdCA9IG9sZFRhcmdldC5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBpbmxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBpbmNvbWluZ2xpbmsgPSAoTGluaykgaXRvci5uZXh0KCk7Ci0JCQkJLy8gUkFUTEMwMDM4NDI0NSA6IFByZWRlY2Vzc29yIGNoYW5nZXMgc2hvdWxkIGJlIGRvbmUgb25seSBpbgotCQkJCS8vIGNhc2Ugb2YgU3luY2hyb25pemF0aW9uIEJhci4KLQkJCQlpZiAoaW5jb21pbmdsaW5rLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgVHlwZWROb2RlCi0JCQkJCQkmJiAoKFR5cGVkTm9kZSkgaW5jb21pbmdsaW5rLmdldFNvdXJjZSgpKS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNZTkNIX0JBUikgewotCQkJCQlDb2xsZWN0aW9uIGNvbCA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0U291cmNlTm9kZXMoCi0JCQkJCQkJKFR5cGVkTm9kZSkgaW5jb21pbmdsaW5rLmdldFNvdXJjZSgpLAotCQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5jbGFzcyk7Ci0JCQkJCWlmIChjb2wuY29udGFpbnMob2xkU291cmNlKSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChpbmNvbWluZ2xpbmsuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQkJaWYgKGluY29taW5nbGluay5nZXRTb3VyY2UoKS5lcXVhbHMob2xkU291cmNlKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiBNZXRob2QgdG8gZ2V0IHRoZSBzb3VyY2VzIG9mIFN5bmNCYXIgaW5Db21taW5nIGNvbm5lY3Rpb25zCi0JICogYW5kIGlmIHN5bmNiYXIgaGF2ZSBpbmNvbWluZyBjb25uZWN0aW9uIGZyb20gZGVjaXNpb24gcG9pbnQsIAotCSAqIGFuZCBkZWNpc2lvbiBwb2ludCBoYXZlIGluY29tbWluZyBjb25uZWN0aW9ucyAod29ya2JyZWFkZG93biBlbGVtdG5zKQotCSAqIGNvbGxlY3Rpb25zIHdpbGwgaWdub3JlIGFsbCB0aGUgaW5jb21pbmcgY29ubmVjdGlvbiBmcm9tIGRlY2lzaW9uIHBvaW50LiAgCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRTeW5jQmFyU291cmNlTm9kZXMoVHlwZWROb2RlIHR5cGVkTm9kZSwgQ29sbGVjdGlvbiBhY3ROb2Rlcyl7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkTm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCU5vZGUgc291cmNlID0gbGluay5nZXRTb3VyY2UoKTsKLQkJCQlpZihzb3VyY2UgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpewotCQkJCQlhY3ROb2Rlcy5hZGQoc291cmNlKTsKLQkJCQl9ZWxzZSBpZihzb3VyY2UgaW5zdGFuY2VvZiBUeXBlZE5vZGUpewotCQkJCQlpZigoKFR5cGVkTm9kZSlzb3VyY2UpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1lOQ0hfQkFSKQotCQkJCQkJZ2V0U3luY0JhclNvdXJjZU5vZGVzKChUeXBlZE5vZGUpc291cmNlLGFjdE5vZGVzKTsKLQkJCQl9Ci0JCX0KLQl9Ci0JLyoKLQkgKiBNZXRob2QgdG8gY29sbGVjdCBzeW5jaHJvbml6YXRpb24gYmFyIG91dGdvaW5nIGNvbm5lY3Rpb24KLQkgKiBleGNlcHQgYW55IGNvbm5lY3Rpb24gZ29pbmcgZnJvbSBkZWNpc2lvbiBwb2ludHMuICAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0U3luY0JhclRhcmdldE5vZGVzKFR5cGVkTm9kZSB0eXBlZE5vZGUsIENvbGxlY3Rpb24gYWN0Tm9kZXMpewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlZE5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQlOb2RlIHRhcmdldCA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCQkJaWYodGFyZ2V0IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKXsKLQkJCQkJYWN0Tm9kZXMuYWRkKHRhcmdldCk7Ci0JCQkJfWVsc2UgaWYodGFyZ2V0IGluc3RhbmNlb2YgVHlwZWROb2RlKXsKLQkJCQkJaWYoKChUeXBlZE5vZGUpdGFyZ2V0KS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNZTkNIX0JBUikKLQkJCQkJCWdldFN5bmNCYXJUYXJnZXROb2RlcygoVHlwZWROb2RlKXRhcmdldCwgYWN0Tm9kZXMpOwotCQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE5vZGUgZmluZE5vZGUoTm9kZUNvbnRhaW5lciBjb250YWluZXIsIE9iamVjdCBvYmplY3QsIENsYXNzIG5vZGVUeXBlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRhaW5lci5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBlbGVtZW50ID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iamVjdCA9PSBlbGVtZW50LmdldE9iamVjdCgpICYmIG5vZGVUeXBlLmlzSW5zdGFuY2UoZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0KLQkvKioKLQkgKiBDb252ZW5pZW50IG1ldGhvZCB0byBhZGQgYSBwcm9wZXJ0eSB0byBHcmFwaE5vZGUgcHJvcGVydHkgbGlzdAotCSAqIChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKSBWZXJpZmllcyBwcm9wZXJ0eSBleGlzdHMgb3Igbm90LCBpZiBub3QKLQkgKiBjcmVhdGVzIGEgcHJvcGVydHkgd2l0aCBnaXZlbiBrZXkgYW5kIHZhbHVlLiBhbmQgc2V0IGludG8gZ3JhcGggbm9kZQotCSAqIHByb3BlcnR5IGxpc3QsIGlmIGV4aXN0cyBqdXN0IHNldHMgdmFsdWUgZm9yIHByb3BlcnR5LgotCSAqIAotCSAqIEBwYXJhbSBncmFwaE5vZGUKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBQcm9wZXJ0eQotCSAqIEBhdXRob3Igc2thbm5vb3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BlcnR5IGNyZWF0ZVByb3BlcnR5KEdyYXBoTm9kZSBncmFwaE5vZGUsIFN0cmluZyBrZXksCi0JCQlTdHJpbmcgdmFsdWUpIHsKLQkJUHJvcGVydHkgcHJvcGVydHkgPSBudWxsOwotCQlpZiAoZ3JhcGhOb2RlICE9IG51bGwpIHsKLQkJCXByb3BlcnR5ID0gZmluZFByb3BlcnR5KGdyYXBoTm9kZSwga2V5KTsKLQkJfQotCQlpZiAocHJvcGVydHkgPT0gbnVsbCkgewotCQkJcHJvcGVydHkgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9wZXJ0eSgpOwotCQkJcHJvcGVydHkuc2V0S2V5KGtleSk7Ci0JCQlwcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCQlMaXN0IGxpc3QgPSBncmFwaE5vZGUuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLQkJCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWdyYXBoTm9kZS5zZXQoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSwgbGlzdCk7Ci0JCQl9Ci0JCQlsaXN0LmFkZChwcm9wZXJ0eSk7Ci0JCX0gZWxzZSB7Ci0JCQlwcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnR5OwotCX0KLQkKLQkvKioKLQkgKiBBY2Nlc2libGUgbWV0aG9kIGZvciBBY3Rpdml0eURldGFpbERpYWdyYW0sIHRvIGdldCBhIGF1dG9sYXlvdXQgZmxhZyBmcm9tCi0JICogR3JhcGhoTm9kZSBwcm9wZXJ0eSBsaXN0LiByZXR1cm4gc3RyaW5nIGNhbiBiZQotCSAqIEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9BVVRPTEFZT1VUX1ZBTFVFX1RSVUUsCi0JICogR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0FVVE9MQVlPVVRfVkFMVUVfRkFMU0UsIG9yIG51bGwuCi0JICogCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF1dG9MYXlvdXRGbGFnKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCVN0cmluZyBmbGFnID0gbnVsbDsKLQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IGRpYWdyYW0uZ2V0R3JhcGhOb2RlKCk7Ci0JCWlmIChncmFwaE5vZGUgIT0gbnVsbCkgewotCQkJTGlzdCBwcm9wTGlzdCA9IGdyYXBoTm9kZS5nZXRMaXN0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFkpOwotCQkJaWYgKHByb3BMaXN0ICE9IG51bGwgJiYgcHJvcExpc3Quc2l6ZSgpID4gMCkgewotCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kUHJvcGVydHkoZ3JhcGhOb2RlLAotCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0FVVE9fTEFZT1VUKTsKLQkJCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCQlmbGFnID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZsYWc7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F1dG9MYXlvdXQoQWN0aXZpdHlEZXRhaWxEaWFncmFtIGRpYWdyYW0pewotCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gZGlhZ3JhbS5nZXRHcmFwaE5vZGUoKTsKLQkJaWYoZ3JhcGhOb2RlICE9IG51bGwpewotCQkJTGlzdCBwcm9wTGlzdCA9IGdyYXBoTm9kZS5nZXRMaXN0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFkpOwotCQkJaWYocHJvcExpc3QgIT0gbnVsbCAmJiBwcm9wTGlzdC5zaXplKCkgPiAwKXsKLQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZFByb3BlcnR5KAotCQkJCQlncmFwaE5vZGUsIEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9BVVRPX0xBWU9VVCk7Ci0JCQkJaWYocHJvcGVydHkgIT0gbnVsbCl7Ci0JCQkJCVN0cmluZyB0ZW1wID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJaWYodGVtcCAhPSBudWxsICYmIHRlbXAgIT0gIiIgJiYgIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkoR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0FVVE9fTEFZT1VUX1ZBTFVFX1RSVUUuZXF1YWxzKHRlbXApCi0JCQkJCQkJCQl8fCBHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT19MQVlPVVRfVkFMVUVfRkFMU0UuZXF1YWxzKHRlbXApKSl7Ci0JCQkJCQlyZXR1cm4gbmV3IEJvb2xlYW4odGVtcCkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGludCBnZXRUYXNrc1BlclJvdygpewotCQlTdHJpbmcgY291bnQgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkuZ2V0U3RyaW5nKEdyYXBoaWNhbERhdGFIZWxwZXIuQUREX0RJQUdSQU1fVEFTS1NfUEVSX1JPVyk7Ci0JCWlmIChjb3VudCAhPSBudWxsICYmIGNvdW50Lmxlbmd0aCgpID4gMCkgewotCQkJdHJ5IHsKLQkJCQlpbnQgaSA9IEludGVnZXIucGFyc2VJbnQoY291bnQpOwotCQkJCXJldHVybiBpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5lKSB7Ci0JCQkJcmV0dXJuIDEwOwotCQkJfQotCQl9Ci0JCXJldHVybiAxMDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdCB0aGUgbGlzdCBvZiB7QGxpbmsgUHJvcGVydHl9IG9iamVjdHMKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvcGVydHkgZ2V0UHJvcGVydHlCeUtleShMaXN0IGxpc3QsIFN0cmluZyBrZXkpIHsKLQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpcm9yID0gbGlzdC5pdGVyYXRvcigpOyBpcm9yLmhhc05leHQoKTspIHsKLQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IChQcm9wZXJ0eSkgaXJvci5uZXh0KCk7Ci0JCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQkJaWYgKHByb3BlcnR5LmdldEtleSgpLmVxdWFscyhrZXkpKSB7Ci0JCQkJCQlyZXR1cm4gcHJvcGVydHk7Ci0JCQkJCX0KLS8vCQkJCQkJZWxzZSB7Ci0vLwkJCQkJCXJldHVybiBudWxsOwotLy8JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0eSBnZXRQcm9wZXJ0eShOb2RlIG5vZGUsIFN0cmluZyBrZXkpIHsKLQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IG5vZGUuZ2V0R3JhcGhOb2RlKCk7Ci0JCWlmIChncmFwaE5vZGUgIT0gbnVsbCkgewotCQkJTGlzdCBsaXN0ID0gZ3JhcGhOb2RlLmdldFByb3BlcnR5KCk7Ci0JCQlpZiAobGlzdCAhPSBudWxsICYmICFsaXN0LmlzRW1wdHkoKSkgewotCQkJCWZvciAoaW50IGkgPSBsaXN0LnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJCVByb3BlcnR5IHByb3AgPSAoUHJvcGVydHkpIGxpc3QuZ2V0KGkpOwotCQkJCQlpZiAoa2V5LmVxdWFscyhwcm9wLmdldEtleSgpKSkgewotCQkJCQkJcmV0dXJuIHByb3A7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvR3JhcGhpY2FsRGF0YU1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0dyYXBoaWNhbERhdGFNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZmJiYWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvR3JhcGhpY2FsRGF0YU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlZhcnlBY3Rpdml0eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogRGlhZ3JhbSBkYXRhIHN0b3JlZCBpbiBVTUE6IFNlbWFudGljTW9kZWxCcmlkZ2UgLlByZXNlbnRhdGlvbiBkaWFncmFtIHR5cGUsCi0gKiBpdHMgdmFsdWUgY2FuIGJlIG9uZSBvZiBmb2xsb3dpbmcgY29uc3RhbnRzIGRlZmluZWQgaW4gR3JhcGhpY2FsRGF0YUhlbHBlcgotICogRElBR1JBTV9XT1JLRkxPVywgRElBR1JBTV9XT1JLX1BST0RVQ1RfREVQRU5ERU5DWSwgRElBR1JBTV9BQ1RJVklUWV9ERVRBSUwKLSAqIAotICogVU1BU2VtYW50aWNNb2RlbEJyaWRnZSAuRWxlbWVudCBCcmVha2Rvd25FbGVtZW50IHRoYXQgdGhlIERpYWdyYW1FbGVtZW50IG9mCi0gKiB0aGlzIFNlbWFudGljTW9kZWxCcmlkZ2UgcmVwcmVzZW50cwotICogCi0gKiBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCAuVHlwZUluZm8gdHlwZSBpbmZvcm1hdGlvbiBmb3IgVHlwZWROb2RlLCBpdHMKLSAqIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGNvbnN0YW50cyBkZWZpbmVkIGluIEdyYXBoaWNhbERhdGFIZWxwZXIKLSAqIHdwQ29tcG9zaXRlVHlwZSBXb3JrUHJvZHVjdENvbXBvc2l0ZSB0eXBlCi0gKiAKLSAqIERpYWdyYW1FbGVtZW50IC5Qcm9wZXJ0eSAobGlzdCBvZiBwcm9wZXJ0aWVzKQotICogCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBHcmFwaGljYWxEYXRhTWFuYWdlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGlhZ3JhbVByZXNlbnRhdGlvbnMgPSBuZXcgU3RyaW5nW10gewotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5ESUFHUkFNX1dPUktGTE9XLAotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5ESUFHUkFNX1dPUktfUFJPRFVDVF9ERVBFTkRFTkNZLAotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5ESUFHUkFNX0FDVElWSVRZX0RFVEFJTCB9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBjaGlsZFR5cGVzID0gbmV3IENsYXNzW10geyBBY3Rpdml0eS5jbGFzcywKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgRGVzY3JpcHRvci5jbGFzcyB9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBkaWFncmFtQ2hhbmdlTGlzdGVuZXJDbGFzc2VzID0gbmV3IENsYXNzW10gewotCQkJSUFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmNsYXNzLAotCQkJSVdQRERpYWdyYW1DaGFuZ2VMaXN0ZW5lci5jbGFzcywKLQkJCUlBY3Rpdml0eURldGFpbERpYWdyYW1DaGFuZ2VMaXN0ZW5lci5jbGFzcyB9OwotCi0JcHJpdmF0ZSBzdGF0aWMgR3JhcGhpY2FsRGF0YU1hbmFnZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JLy9wcml2YXRlIE1hcCBncmFwaGljYWxEYXRhTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgTGlzdDxJQ29tbWFuZExpc3RlbmVyPiBjb21tYW5kTGlzdGVuZXJzOwotCi0JcHJpdmF0ZSBHcmFwaGljYWxEYXRhTWFuYWdlcigpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEdyYXBoaWNhbERhdGFNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChHcmFwaGljYWxEYXRhTWFuYWdlci5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IEdyYXBoaWNhbERhdGFNYW5hZ2VyKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvLyBwdWJsaWMgR3JhcGhOb2RlIGdldEdyYXBoTm9kZShBY3Rpdml0eSBhY3QsIGludCBkaWFncmFtVHlwZSwgQWN0aXZpdHkKLQkvLyBwYXJlbnQpIHsKLQkvLyAvLyBJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikKLQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGFjdCwKLQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCS8vIC8vIE9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChhY3QpOwotCS8vIC8vIGlmKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JLy8gaWYocGFyZW50ID09IG51bGwpIHsKLQkvLyAvLyBuZXcgQWN0aXZpdHkKLQkvLyAvLwotCS8vIHJldHVybiBjcmVhdGVHcmFwaE5vZGUoYWN0KTsKLQkvLyB9Ci0JLy8gaWYoIWFjdC5nZXRTdXBlckFjdGl2aXRpZXMoKS5jb250YWlucyhwYXJlbnQpKSB7Ci0JLy8gdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBzdXBlciBhY3Rpdml0eSBmb3IgIiArIGFjdCArCi0JLy8gIjogIiArIHBhcmVudCk7Ci0JLy8gfQotCS8vIEFjdGl2aXR5IHBhcmVudEFjdCA9IChBY3Rpdml0eSkgcGFyZW50OwotCS8vIERpYWdyYW0gZGlhZ3JhbSA9IGdldERpYWdyYW0ocGFyZW50QWN0LCBkaWFncmFtVHlwZSkuZ2V0VU1BRGlhZ3JhbSgpOwotCS8vIHJldHVybiBnZXRHcmFwaE5vZGUoZGlhZ3JhbSwgYWN0KTsKLQkvLyB9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBHcmFwaE5vZGUgb2YgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50IGZvciB0aGUgZ2l2ZW4gZGlhZ3JhbS4KLQkgKiBDcmVhdGUgdGhlIEdyYXBoTm9kZSBpZiBpdCBkb2VzIG5vdCBleGlzdCB5ZXQuCi0JICogCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gbWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgR3JhcGhOb2RlIGdldEdyYXBoTm9kZShEaWFncmFtIGRpYWdyYW0sIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCkgewotCQlpZiAoZGlhZ3JhbSA9PSBudWxsKSB7Ci0JCQkvLyBuZXcgTWV0aG9kRWxlbWVudAotCQkJLy8KLQkJCXJldHVybiBjcmVhdGVHcmFwaE5vZGUobWV0aG9kRWxlbWVudCk7Ci0JCX0KLQkJR3JhcGhOb2RlIG5vZGUgPSBmaW5kR3JhcGhOb2RlKGRpYWdyYW0sIG1ldGhvZEVsZW1lbnQpOwotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlub2RlID0gY3JlYXRlR3JhcGhOb2RlKG1ldGhvZEVsZW1lbnQpOwotCQkJY3JlYXRlR3JhcGhDb25uZWN0b3JzKG5vZGUsIGRpYWdyYW0pOwotCQkJZGlhZ3JhbS5nZXRDb250YWluZWQoKS5hZGQobm9kZSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBHcmFwaE5vZGUgZmluZEdyYXBoTm9kZShEaWFncmFtIGRpYWdyYW0sIE9iamVjdCBtZXRob2RFbGVtZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlHcmFwaE5vZGUgZWxlbWVudCA9IChHcmFwaE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQuZ2V0U2VtYW50aWNNb2RlbCgpIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZQotCQkJCQkmJiBtZXRob2RFbGVtZW50ID09ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgZWxlbWVudAotCQkJCQkJCS5nZXRTZW1hbnRpY01vZGVsKCkpLmdldEVsZW1lbnQoKSkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIHB1YmxpYyBEaWFncmFtRWxlbWVudCBnZXREaWFncmFtRWxlbWVudChPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gaWYob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkvLyByZXR1cm4gZ2V0R3JhcGhOb2RlKChBY3Rpdml0eSkgb2JqZWN0KTsKLQkvLyB9Ci0JLy8gZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkvLyBXb3JrT3JkZXIgd29ya09yZGVyID0gKFdvcmtPcmRlcikgb2JqZWN0OwotCS8vIEJyZWFrZG93bkVsZW1lbnQgYmUgPSB3b3JrT3JkZXIuZ2V0UHJlZCgpOwotCS8vIGlmKGJlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkvLyBHcmFwaE5vZGUgZ3JhcGhOb2RlID0gZ2V0R3JhcGhOb2RlKChBY3Rpdml0eSkgYmUpOwotCS8vIExpc3QgbGlzdCA9IGdyYXBoTm9kZS5nZXRDb250YWluZWQoKTsKLQkvLyBQb2x5bGluZSBwb2x5bGluZSA9IG51bGw7Ci0JLy8gZm9yKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkvLyBPYmplY3Qgb2JqID0gbGlzdC5nZXQoaSk7Ci0JLy8gaWYob2JqIGluc3RhbmNlb2YgUG9seWxpbmUpIHsKLQkvLyBwb2x5bGluZSA9IChQb2x5bGluZSkgb2JqOwotCS8vIGJyZWFrOwotCS8vIH0KLQkvLyB9Ci0JLy8gaWYocG9seWxpbmUgPT0gbnVsbCkgewotCS8vIHBvbHlsaW5lID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9seWxpbmUoKTsKLQkvLyBsaXN0LmFkZCgwLCBwb2x5bGluZSk7Ci0JLy8gfQotCS8vIHJldHVybiBwb2x5bGluZTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBudWxsOwotCS8vIH0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBEaWFncmFtIGNyZWF0ZURpYWdyYW0oQWN0aXZpdHkgYWN0LCBpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJLy8gY2hlY2sgaWYgdGhpcyBhY3Rpdml0eSBjb250cmlidXRlcy9leHRlbmRzIG90aGVyIGFjdGl2aXR5IGFuZCB0cnkKLQkJLy8gY29weQotCQkvLyB0aGUgZXhpc3RpbmcgZGlhZ3JhbSBmcm9tIHRoZSBiYXNlCi0JCS8vCi0JCWlmIChQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhhY3QpKSB7Ci0JCQlEaWFncmFtIGJhc2VEaWFncmFtID0gZ2V0VU1BRGlhZ3JhbSgoQWN0aXZpdHkpIGFjdAotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCBkaWFncmFtVHlwZSwgZmFsc2UpOwotCQkJaWYgKGJhc2VEaWFncmFtICE9IG51bGwpIHsKLQkJCQlEaWFncmFtIGNvcHkgPSBHcmFwaGljYWxEYXRhSGVscGVyLmNvcHlEaWFncmFtKGJhc2VEaWFncmFtKTsKLQotCQkJCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbW9kZWxCcmlkZ2UgPSAoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgY29weQotCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCQltb2RlbEJyaWRnZS5zZXRFbGVtZW50KGFjdCk7Ci0JCQkJcmV0dXJuIGNvcHk7Ci0JCQl9Ci0JCX0KLQotCQlEaWFncmFtIGRpYWdyYW0gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaWFncmFtKCk7Ci0JCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbW9kZWxCcmlkZ2UgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCk7Ci0JCW1vZGVsQnJpZGdlLnNldEVsZW1lbnQoYWN0KTsKLQkJbW9kZWxCcmlkZ2Uuc2V0UHJlc2VudGF0aW9uKGRpYWdyYW1QcmVzZW50YXRpb25zW2RpYWdyYW1UeXBlXSk7Ci0JCWRpYWdyYW0uc2V0U2VtYW50aWNNb2RlbChtb2RlbEJyaWRnZSk7Ci0KLQkJLy8gZ2V0RGlhZ3JhbShhY3QsIGRpYWdyYW1UeXBlKS5zZXRVTUFEaWFncmFtKGRpYWdyYW0pOwotCi0JCXBvcHVsYXRlRGlhZ3JhbShkaWFncmFtLCBhY3QsIGRpYWdyYW1UeXBlKTsKLQotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVEaWFncmFtKERpYWdyYW0gZGlhZ3JhbSwgQWN0aXZpdHkgYWN0LCBpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJLy8gY3JlYXRlIEdyYXBoTm9kZSBmb3IgZWFjaCBCcmVha2Rvd25FbGVtZW50IGFuZCBhZGQgaXQgdG8gdGhlIGRpYWdyYW0KLQkJLy8KLQkJTGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkVHlwZXNbZGlhZ3JhbVR5cGVdLmlzSW5zdGFuY2UoZWxlbWVudCkpIHsKLQkJCQlHcmFwaE5vZGUgbm9kZSA9IGNyZWF0ZUdyYXBoTm9kZSgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCQkJZGlhZ3JhbS5nZXRDb250YWluZWQoKS5hZGQobm9kZSk7Ci0JCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gY3JlYXRlIEdyYXBoQ29ubmVjdG9ycyBmb3IgZWFjaCBCcmVha2Rvd25FbGVtZW50Ci0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJR3JhcGhOb2RlIG5vZGUgPSAoR3JhcGhOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWNyZWF0ZUdyYXBoQ29ubmVjdG9ycyhub2RlLCBkaWFncmFtLCBkaWFncmFtVHlwZSk7Ci0JCX0KLQl9Ci0KLS8vCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUFjdGl2aXR5RGlhZ3JhbShEaWFncmFtIGRpYWdyYW0sIEFjdGl2aXR5IGFjdCkgewotLy8JCS8vIGNyZWF0ZSBHcmFwaE5vZGUgZm9yIGVhY2ggY2hpbGQgYWN0aXZpdHkgYW5kIGFkZCBpdCB0byB0aGUgZGlhZ3JhbQotLy8JCS8vIAotLy8JCUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotLy8JCQkJLmhhc05leHQoKTspIHsKLS8vCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLS8vCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotLy8JCQkJQWN0aXZpdHkgY2hpbGRBY3QgPSAoQWN0aXZpdHkpIGVsZW1lbnQ7Ci0vLwkJCQlHcmFwaE5vZGUgbm9kZSA9IGNyZWF0ZUdyYXBoTm9kZShjaGlsZEFjdCk7Ci0vLwkJCQlkaWFncmFtLmdldENvbnRhaW5lZCgpLmFkZChub2RlKTsKLS8vCQkJCW5vZGVzLmFkZChub2RlKTsKLS8vCQkJfQotLy8JCX0KLS8vCi0vLwkJLy8gY3JlYXRlIEdyYXBoQ29ubmVjdG9ycyBmb3IgZWFjaCBjaGlsZCBhY3Rpdml0eQotLy8JCS8vCi0vLwkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCUdyYXBoTm9kZSBub2RlID0gKEdyYXBoTm9kZSkgaXRlci5uZXh0KCk7Ci0vLwkJCWNyZWF0ZUdyYXBoQ29ubmVjdG9ycyhub2RlLCBkaWFncmFtKTsKLS8vCQl9Ci0vLwl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0Ci0JICogQHBhcmFtIGRpYWdyYW1UeXBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGdldERpYWdyYW1DaGFuZ2VMaXN0ZW5lcihBY3Rpdml0eSBhY3QsCi0JCQlpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmVBZGFwdGVycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChkaWFncmFtQ2hhbmdlTGlzdGVuZXJDbGFzc2VzW2RpYWdyYW1UeXBlXS5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIChJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyKSBlbGVtZW50OwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEdyYXBoTm9kZSBjcmVhdGVHcmFwaE5vZGUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCUdyYXBoTm9kZSBncmFwaE5vZGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHcmFwaE5vZGUoKTsKLQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBtb2RlbEJyaWRnZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQkJbW9kZWxCcmlkZ2Uuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJZ3JhcGhOb2RlLnNldFNlbWFudGljTW9kZWwobW9kZWxCcmlkZ2UpOwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50IHBvaW50ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9pbnQoKTsKLQkJcG9pbnQuc2V0WChuZXcgRG91YmxlKC0xKSk7Ci0JCXBvaW50LnNldFkobmV3IERvdWJsZSgtMSkpOwotCQlncmFwaE5vZGUuc2V0UG9zaXRpb24ocG9pbnQpOwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbiBkaW0gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaW1lbnNpb24oKTsKLQkJZGltLnNldFdpZHRoKG5ldyBEb3VibGUoLTEpKTsKLQkJZGltLnNldEhlaWdodChuZXcgRG91YmxlKC0xKSk7Ci0JCWdyYXBoTm9kZS5zZXRTaXplKGRpbSk7Ci0KLQkJcmV0dXJuIGdyYXBoTm9kZTsKLQl9Ci0KLQlwdWJsaWMgR3JhcGhFZGdlIGFkZEdyYXBoQ29ubmVjdG9yUGFpcihEaWFncmFtIGRpYWdyYW0sCi0JCQlHcmFwaE5vZGUgZ3JhcGhOb2RlLCBXb3JrT3JkZXIgZWxlbWVudCkgewotCQlHcmFwaENvbm5lY3RvciBzcmNDb25uZWN0b3IgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVHcmFwaENvbm5lY3RvcigpOwotCQlncmFwaE5vZGUuZ2V0QW5jaG9yYWdlKCkuYWRkKHNyY0Nvbm5lY3Rvcik7Ci0JCUdyYXBoRWRnZSBlZGdlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGhFZGdlKCk7Ci0JCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgYnJpZGdlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCQlicmlkZ2Uuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJZWRnZS5zZXRTZW1hbnRpY01vZGVsKGJyaWRnZSk7Ci0JCWdyYXBoTm9kZS5nZXRDb250YWluZWQoKS5hZGQoZWRnZSk7Ci0JCWVkZ2UuZ2V0QW5jaG9yKCkuYWRkKHNyY0Nvbm5lY3Rvcik7Ci0KLQkJR3JhcGhOb2RlIHN1Y2NOb2RlID0gZ2V0R3JhcGhOb2RlKGRpYWdyYW0sIFVtYVV0aWwKLQkJCQkuZ2V0T3duaW5nQWN0aXZpdHkoZWxlbWVudCkpOwotCQlHcmFwaENvbm5lY3RvciB0YXJnZXRDb25uZWN0b3IgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVHcmFwaENvbm5lY3RvcigpOwotCQlzdWNjTm9kZS5nZXRBbmNob3JhZ2UoKS5hZGQodGFyZ2V0Q29ubmVjdG9yKTsKLQkJZWRnZS5nZXRBbmNob3IoKS5hZGQodGFyZ2V0Q29ubmVjdG9yKTsKLQkJcmV0dXJuIGVkZ2U7Ci0JfQotCi0JcHVibGljIEdyYXBoRWRnZSBhZGRHcmFwaENvbm5lY3RvclBhaXIoR3JhcGhOb2RlIHNyY05vZGUsCi0JCQlHcmFwaE5vZGUgdGFyZ2V0Tm9kZSkgewotCQlHcmFwaENvbm5lY3RvciBzcmNDb25uZWN0b3IgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVHcmFwaENvbm5lY3RvcigpOwotCQlzcmNOb2RlLmdldEFuY2hvcmFnZSgpLmFkZChzcmNDb25uZWN0b3IpOwotCQlHcmFwaEVkZ2UgZWRnZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoRWRnZSgpOwotCQlzcmNOb2RlLmdldENvbnRhaW5lZCgpLmFkZChlZGdlKTsKLQkJZWRnZS5nZXRBbmNob3IoKS5hZGQoc3JjQ29ubmVjdG9yKTsKLQotCQlHcmFwaENvbm5lY3RvciB0YXJnZXRDb25uZWN0b3IgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVHcmFwaENvbm5lY3RvcigpOwotCQl0YXJnZXROb2RlLmdldEFuY2hvcmFnZSgpLmFkZCh0YXJnZXRDb25uZWN0b3IpOwotCQllZGdlLmdldEFuY2hvcigpLmFkZCh0YXJnZXRDb25uZWN0b3IpOwotCQlyZXR1cm4gZWRnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVHcmFwaEVkZ2UoR3JhcGhFZGdlIGVkZ2UpIHsKLQkJRWNvcmVVdGlsLnJlbW92ZShlZGdlKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWRnZS5nZXRBbmNob3IoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUdyYXBoQ29ubmVjdG9yIGNvbm4gPSAoR3JhcGhDb25uZWN0b3IpIGl0ZXIubmV4dCgpOwotCQkJRWNvcmVVdGlsLnJlbW92ZShjb25uKTsKLQkJfQotCX0KLQotCS8vIHB1YmxpYyB2b2lkIHJlbW92ZUdyYXBoQ29ubmVjdG9yUGFpcihHcmFwaE5vZGUgc3JjTm9kZSwgR3JhcGhOb2RlCi0JLy8gdGFyZ2V0Tm9kZSkgewotCS8vIC8vIGZpbmQgdGhlIHNvdXJjZSBHcmFwaENvbm5lY3RvciBhbmQgcmVtb3ZlIGl0LCBpdHMgR3JhcGhFZGdlLCBhbmQgaXRzCi0JLy8gdGFyZ2V0IEdyYXBoQ29ubmVjdG9yCi0JLy8gLy8KLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzcmNOb2RlLmdldEFuY2hvcmFnZSgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkvLyB7Ci0JLy8gR3JhcGhDb25uZWN0b3IgY29ubmVjdG9yID0gKEdyYXBoQ29ubmVjdG9yKSBpdGVyLm5leHQoKTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29ubmVjdG9yLmdldEdyYXBoRWRnZSgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JLy8gLmhhc05leHQoKTspIHsKLQkvLyBHcmFwaEVkZ2UgZWRnZSA9IChHcmFwaEVkZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkvLyBPYmplY3QgdGFyZ2V0Q29ubmVjdG9yID0gZWRnZS5nZXRBbmNob3IoKS5nZXQoMSk7Ci0JLy8gaWYodGFyZ2V0Tm9kZS5nZXRBbmNob3JhZ2UoKS5yZW1vdmUodGFyZ2V0Q29ubmVjdG9yKSkgewotCS8vIHNyY05vZGUuZ2V0Q29udGFpbmVkKCkucmVtb3ZlKGVkZ2UpOwotCS8vIC8vIGRvbid0IHJlbW92ZSB0aGUgZWRnZSBmcm9tIGNvbm5lY3RvciB0byBzdXBwb3J0IHVuZG8KLQkvLyAvLwotCS8vIC8vIGl0ZXJhdG9yLnJlbW92ZSgpOwotCS8vIH0KLQkvLyB9Ci0JLy8gaWYoY29ubmVjdG9yLmdldEdyYXBoRWRnZSgpLmlzRW1wdHkoKSkgewotCS8vIGl0ZXIucmVtb3ZlKCk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVHcmFwaENvbm5lY3Rpb25QYWlyKEdyYXBoTm9kZSBncmFwaE5vZGUsCi0JCQlXb3JrT3JkZXIgd29ya09yZGVyKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdyYXBoTm9kZS5nZXRBbmNob3JhZ2UoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUdyYXBoQ29ubmVjdG9yIGNvbm4gPSAoR3JhcGhDb25uZWN0b3IpIGl0ZXIubmV4dCgpOwotCQkJR3JhcGhFZGdlIGVkZ2UgPSAoR3JhcGhFZGdlKSBjb25uLmdldEdyYXBoRWRnZSgpLmdldCgwKTsKLQkJCWlmIChlZGdlLmVDb250YWluZXIoKSA9PSBncmFwaE5vZGUpIHsKLQkJCQlHcmFwaENvbm5lY3RvciBjb25uMiA9IChHcmFwaENvbm5lY3RvcikgZWRnZS5nZXRBbmNob3IoKS5nZXQoMSk7Ci0JCQkJU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSBjb25uMi5nZXRHcmFwaEVsZW1lbnQoKQotCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCQlpZiAoYnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZQotCQkJCQkJJiYgKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBicmlkZ2UpLmdldEVsZW1lbnQoKSA9PSBVbWFVdGlsCi0JCQkJCQkJCS5nZXRPd25pbmdBY3Rpdml0eSh3b3JrT3JkZXIpKSB7Ci0JCQkJCWNvbm4yLmdldEdyYXBoRWxlbWVudCgpLmdldEFuY2hvcmFnZSgpLnJlbW92ZShjb25uMik7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCWdyYXBoTm9kZS5nZXRDb250YWluZWQoKS5yZW1vdmUoZWRnZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlR3JhcGhDb25uZWN0b3JzKEdyYXBoTm9kZSBncmFwaE5vZGUsIERpYWdyYW0gZGlhZ3JhbSkgewotCQljcmVhdGVHcmFwaENvbm5lY3RvcnMoZ3JhcGhOb2RlLCBkaWFncmFtLCBnZXREaWFncmFtVHlwZShkaWFncmFtKSk7Ci0JfQotCi0JaW50IGdldERpYWdyYW1UeXBlKERpYWdyYW0gZGlhZ3JhbSkgewotCQlTdHJpbmcgdHlwZVN0ciA9IGRpYWdyYW0uZ2V0U2VtYW50aWNNb2RlbCgpLmdldFByZXNlbnRhdGlvbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRpYWdyYW1QcmVzZW50YXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZGlhZ3JhbVByZXNlbnRhdGlvbnNbaV0uZXF1YWxzKHR5cGVTdHIpKQotCQkJCXJldHVybiBpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlR3JhcGhDb25uZWN0b3JzKEdyYXBoTm9kZSBncmFwaE5vZGUsIERpYWdyYW0gZGlhZ3JhbSwKLQkJCWludCBkaWFncmFtVHlwZSkgewotCQlNZXRob2RFbGVtZW50IGUgPSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIGdyYXBoTm9kZQotCQkJCS5nZXRTZW1hbnRpY01vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJc3dpdGNoIChkaWFncmFtVHlwZSkgewotCQljYXNlIEdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGU7Ci0JCQkJLy8gY3JlYXRlIGNvbm5lY3RvcnMKLQkJCQkvLwotCQkJCS8vIExpc3QgbGlzdCA9IGFjdC5nZXRMaW5rVG9QcmVkZWNlc3NvcigpOwotCQkJCS8vIGludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCQkJLy8JCQkJCi0JCQkJLy8gQWN0aXZpdHkgcGFyZW50ID0gKEFjdGl2aXR5KQotCQkJCS8vICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSlkaWFncmFtLmdldFNlbWFudGljTW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQkJCS8vIExpc3QgYnJlYWtkb3duRWxlbWVudHMgPSBwYXJlbnQuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCQkvLyBmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJLy8gV29ya09yZGVyIHdvcmtPcmRlciA9IChXb3JrT3JkZXIpIGxpc3QuZ2V0KGkpOwotCQkJCS8vIGlmKGJyZWFrZG93bkVsZW1lbnRzLmNvbnRhaW5zKHdvcmtPcmRlci5nZXRQcmVkKCkpKSB7Ci0JCQkJLy8gYWRkR3JhcGhDb25uZWN0b3JQYWlyKGRpYWdyYW0sIGdyYXBoTm9kZSwgd29ya09yZGVyKTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmdldExpbmtUb1ByZWRlY2Vzc29yKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJV29ya09yZGVyIHdvcmtPcmRlciA9IChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpOwotCQkJCQlHcmFwaE5vZGUgc3JjTm9kZSA9IGZpbmRHcmFwaE5vZGUoZGlhZ3JhbSwgd29ya09yZGVyCi0JCQkJCQkJLmdldFByZWQoKSk7Ci0JCQkJCWlmIChzcmNOb2RlICE9IG51bGwpIHsKLQkJCQkJCWFkZEdyYXBoQ29ubmVjdG9yUGFpcihzcmNOb2RlLCBncmFwaE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlicmVhazsKLQkJY2FzZSBHcmFwaGljYWxEYXRhSGVscGVyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZXNjcmlwdG9yLmdldEltcGFjdHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgaW1wYWN0ZWREZXNjcmlwdG9yID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgaXRlcgotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCUdyYXBoTm9kZSB0YXJnZXROb2RlID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZmluZEdyYXBoTm9kZSgKLQkJCQkJCQlkaWFncmFtLCBpbXBhY3RlZERlc2NyaXB0b3IpOwotCQkJCQlpZiAodGFyZ2V0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRHcmFwaENvbm5lY3RvclBhaXIoZ3JhcGhOb2RlLCB0YXJnZXROb2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJYnJlYWs7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIFVNQSBkaWFncmFtIGZyb20gdGhlIFVNQSBtb2RlbCBmb3IgdGhlIGdpdmVuIGFjdGl2aXR5LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGRpYWdyYW1UeXBlCi0JICogICAgICAgICAgICBvbmUgb2YgdGhlIGRpYWdyYW0gdHlwZSBjb25zdGFudHMgZGVmaW5lZCBpbgotCSAqICAgICAgICAgICAge0BsaW5rIEdyYXBoaWNhbERhdGFIZWxwZXIgR3JhcGhpY2FsRGF0YUhlbHBlciB9Ci0JICogQHBhcmFtIGNyZWF0ZQotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgbmV3IFVNQSBkaWFncmFtIHdpbGwgYmUgY3JlYXRlZCBpZiB0aGUgYWN0aXZpdHkgZG9lcwotCSAqICAgICAgICAgICAgbm90IGhhdmUgb25lIGFscmVhZHkuCi0JICogQHJldHVybgotCSAqIEBzZWUgR3JhcGhpY2FsRGF0YUhlbHBlciNBQ1RJVklUWV9ESUFHUkFNCi0JICogQHNlZSBHcmFwaGljYWxEYXRhSGVscGVyI0FDVElWSVRZX0RFVEFJTF9ESUFHUkFNCi0JICogQHNlZSBHcmFwaGljYWxEYXRhSGVscGVyI1dPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0KLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBnZXRVTUFEaWFncmFtKEFjdGl2aXR5IGUsIGludCBkaWFncmFtVHlwZSwgYm9vbGVhbiBjcmVhdGUpIHsKLQkJRGlhZ3JhbSBkaWFncmFtID0gbnVsbDsKLQotCQkvLyAvLyBsb29rIGZvciBJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGluIGFjdGl2aXR5J3MgYWRhcHRlciBsaXN0IGZpcnN0Ci0JCS8vIElEaWFncmFtQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSURpYWdyYW1DaGFuZ2VMaXN0ZW5lcikKLQkJLy8gVW1hVXRpbC5nZXRBZGFwdGVyKGUsIGRpYWdyYW1MaXN0ZW5lclR5cGUpOwotCQkvLyBpZihsaXN0ZW5lciAhPSBudWxsKSB7Ci0JCS8vIGRpYWdyYW0gPSBsaXN0ZW5lci5nZXREaWFncmFtKCkuZ2V0VU1BRGlhZ3JhbSgpOwotCQkvLyBpZihkaWFncmFtICE9IG51bGwpIHJldHVybiBkaWFncmFtOwotCQkvLyB9Ci0KLQkJT2JqZWN0IGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgY29udGFpbmVyOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGtnLmdldERpYWdyYW1zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJZGlhZ3JhbSA9IChEaWFncmFtKSBpdGVyLm5leHQoKTsKLQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlIG1vZGVsQnJpZGdlID0gZGlhZ3JhbS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJaWYgKG1vZGVsQnJpZGdlICE9IG51bGwKLQkJCQkJCSYmIG1vZGVsQnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZQotCQkJCQkJJiYgZSA9PSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIG1vZGVsQnJpZGdlKQotCQkJCQkJCQkuZ2V0RWxlbWVudCgpCi0JCQkJCQkmJiBkaWFncmFtUHJlc2VudGF0aW9uc1tkaWFncmFtVHlwZV0KLQkJCQkJCQkJLmVxdWFscygoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIG1vZGVsQnJpZGdlKQotCQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkpIHsKLQkJCQkJcmV0dXJuIGRpYWdyYW07Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGNyZWF0ZSkgewotCQkJLy8gY291bGQgbm90IGZpbmQgaXQsIGNyZWF0ZSBuZXcgb25lCi0JCQkvLwotCQkJZGlhZ3JhbSA9IGNyZWF0ZURpYWdyYW0oZSwgZGlhZ3JhbVR5cGUpOwotCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJKChQcm9jZXNzUGFja2FnZSkgY29udGFpbmVyKS5nZXREaWFncmFtcygpLmFkZChkaWFncmFtKTsKLQkJCX0KLQkJCXJldHVybiBkaWFncmFtOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIHB1YmxpYyBEaWFncmFtIGdldFVNQURpYWdyYW0oQWN0aXZpdHkgYWN0LCBpbnQgZGlhZ3JhbVR5cGUpIHsKLQkvLyBEaWFncmFtIGRpYWdyYW0gPSBudWxsOwotCS8vICAgICAgICAKLQkvLyAvLyBsb29rIGZvciBJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGluIGFjdGl2aXR5J3MgYWRhcHRlciBsaXN0IGZpcnN0Ci0JLy8gSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IGdldERpYWdyYW1DaGFuZ2VMaXN0ZW5lcihhY3QsCi0JLy8gZGlhZ3JhbVR5cGUpOwotCS8vIGlmKGxpc3RlbmVyICE9IG51bGwpIHsKLQkvLyBkaWFncmFtID0gbGlzdGVuZXIuZ2V0RGlhZ3JhbSgpLmdldFVNQURpYWdyYW0oKTsKLQkvLyBpZihkaWFncmFtICE9IG51bGwpIHJldHVybiBkaWFncmFtOwotCS8vIH0KLQkvLyBPYmplY3QgY29udGFpbmVyID0gYWN0LmVDb250YWluZXIoKTsKLQkvLyBpZihjb250YWluZXIgIT0gbnVsbCkgewotCS8vIFByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgY29udGFpbmVyOwotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHBrZy5nZXREaWFncmFtcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIGRpYWdyYW0gPSAoRGlhZ3JhbSkgaXRlci5uZXh0KCk7Ci0JLy8gU2VtYW50aWNNb2RlbEJyaWRnZSBtb2RlbEJyaWRnZSA9IGRpYWdyYW0uZ2V0U2VtYW50aWNNb2RlbCgpOwotCS8vIGlmKG1vZGVsQnJpZGdlICE9IG51bGwgJiYgbW9kZWxCcmlkZ2UgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlCi0JLy8gJiYgYWN0ID09ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSltb2RlbEJyaWRnZSkuZ2V0RWxlbWVudCgpCi0JLy8gJiYKLQkvLyBkaWFncmFtUHJlc2VudGF0aW9uc1tkaWFncmFtVHlwZV0uZXF1YWxzKCgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSltb2RlbEJyaWRnZSkuZ2V0UHJlc2VudGF0aW9uKCkpKQotCS8vIHsKLQkvLyByZXR1cm4gZGlhZ3JhbTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyAgICAgICAgCi0JLy8gLy8gY291bGQgbm90IGZpbmQgaXQsIGNyZWF0ZSBuZXcgb25lCi0JLy8gLy8KLQkvLyByZXR1cm4gY3JlYXRlRGlhZ3JhbShhY3QsIGRpYWdyYW1UeXBlKTsKLQkvLyB9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIGdldERpYWdyYW0oQWN0aXZpdHkgYWN0LAotCQkJaW50IGRpYWdyYW1UeXBlKSB7Ci0JCUlEaWFncmFtQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBnZXREaWFncmFtQ2hhbmdlTGlzdGVuZXIoYWN0LAotCQkJCWRpYWdyYW1UeXBlKTsKLQkJcmV0dXJuIGxpc3RlbmVyID09IG51bGwgPyBudWxsIDogbGlzdGVuZXIuZ2V0RGlhZ3JhbSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgbGlzdCBvZiBjb21tYW5kIGxpc3RlbmVycyB0aGF0IHdpbGwgaGFuZGxlIHRoZSBkaWFncmFtIHJlbGF0ZWQgY2hhbmdlcyBvZiB0aGUgY29tbWFuZHMgb2YgaW50ZXJlc3NlcwotCSAqIAotCSAqIEByZXR1cm4KLQkgKiBAc2VlIElDb21tYW5kTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgTGlzdDxJQ29tbWFuZExpc3RlbmVyPiBnZXRDb21tYW5kTGlzdGVuZXJzKCkgewotCQlpZiAoY29tbWFuZExpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQljb21tYW5kTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJQ29tbWFuZExpc3RlbmVyPigpOwotCQl9Ci0KLQkJY29tbWFuZExpc3RlbmVycy5hZGQobmV3IElDb21tYW5kTGlzdGVuZXIoKSB7Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUV4ZWN1dGVkKENvbW1hbmQgY29tbWFuZCkgewotCQkJCS8vIGdldCBjb250cmlidXRvci9yZXBsYWNlciBvZiB0aGUgYWN0aXZpdHkKLQkJCQkvLwotCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgY29tbWFuZC5nZXRSZXN1bHQoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQkJQWN0aXZpdHkgcGFyZW50QWN0ID0gYWN0LmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSBnZXRVTUFEaWFncmFtKHBhcmVudEFjdCwKLQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RJQUdSQU0sIGZhbHNlKTsKLQkJCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJLy8gZmluZCBleGlzdGluZyBub2RlIGZvciBiYXNlIGFuZCBsaW5rIGl0IHRvIHRoZQotCQkJCQkJLy8gY29udHJpYnV0b3JlL3JlcGxhY2VyIG9mIHRoZSBhY3Rpdml0eQotCQkJCQkJLy8KLQkJCQkJCUdyYXBoTm9kZSBncmFwaE5vZGUgPSBmaW5kR3JhcGhOb2RlKGRpYWdyYW0sIGJhc2UpOwotCQkJCQkJaWYgKGdyYXBoTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSAoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgZ3JhcGhOb2RlCi0JCQkJCQkJCQkuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCQkJCWlmIChicmlkZ2UuZ2V0RWxlbWVudCgpICE9IGFjdCkgewotCQkJCQkJCQlicmlkZ2Uuc2V0RWxlbWVudChhY3QpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYoYWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pIHsKLQkJCQkJCS8vIGNvcHkgZGlhZ3JhbXMgYW5kIHRoZWlyIHB1Ymxpc2hpbmcgb3B0aW9ucwotCQkJCQkJLy8KLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgR3JhcGhpY2FsRGF0YUhlbHBlci5ESUFHUkFNX1RZUEVTLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJaW50IGRpYWdyYW1UeXBlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5ESUFHUkFNX1RZUEVTW2ldOwotCQkJCQkJCWRpYWdyYW0gPSBnZXRVTUFEaWFncmFtKGJhc2UsIGRpYWdyYW1UeXBlLCBmYWxzZSk7Ci0JCQkJCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJCQlEaWFncmFtIGNvcHkgPSBnZXRVTUFEaWFncmFtKGFjdCwgZGlhZ3JhbVR5cGUsIHRydWUpOwotCQkJCQkJCQljb3B5LnNldFN1cHByZXNzZWQoZGlhZ3JhbS5nZXRTdXBwcmVzc2VkKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIENsYXNzIGdldENvbW1hbmRUeXBlKCkgewotCQkJCXJldHVybiBWYXJ5QWN0aXZpdHlDb21tYW5kLmNsYXNzOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwcmVVbmRvKENvbW1hbmQgY29tbWFuZCkgewotCQkJCS8vIGdldCBvbGQgY29udHJpYnV0b3IvcmVwbGFjZXIgb2YgdGhlIGFjdGl2aXR5Ci0JCQkJLy8KLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGNvbW1hbmQuZ2V0UmVzdWx0KCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0vLwkJCQlWYXJ5QWN0aXZpdHlDb21tYW5kIGNtZCA9IChWYXJ5QWN0aXZpdHlDb21tYW5kKSBjb21tYW5kOwotLy8JCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgYWRhcHRlciA9IGNtZC5nZXRXcmFwcGVyKCk7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2VBY3QgPSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmIChiYXNlQWN0ICE9IG51bGwpIHsKLQkJCQkJQWN0aXZpdHkgcGFyZW50QWN0ID0gYWN0LmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSBnZXRVTUFEaWFncmFtKHBhcmVudEFjdCwKLQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RJQUdSQU0sIGZhbHNlKTsKLQkJCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJLy8gZmluZCBleGlzdGluZyBub2RlIGZvciB0aGUgb2xkIGNvbnRyaWJ1dG9yZS9yZXBsYWNlcgotCQkJCQkJLy8gb2xkIGFuZCByZWxpbmsgaXQgdG8gdGhlIGJhc2UgYWN0aXZpdHkKLQkJCQkJCS8vCi0JCQkJCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gZmluZEdyYXBoTm9kZShkaWFncmFtLCBhY3QpOwotCQkJCQkJaWYgKGdyYXBoTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSAoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgZ3JhcGhOb2RlCi0JCQkJCQkJCQkuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCQkJCWlmIChicmlkZ2UuZ2V0RWxlbWVudCgpICE9IGJhc2VBY3QpIHsKLQkJCQkJCQkJYnJpZGdlLnNldEVsZW1lbnQoYmFzZUFjdCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwcmVFeGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQkJCQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwb3N0VW5kbyhDb21tYW5kIGNvbW1hbmQpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQkJCi0JCQl9Ci0KLQkJfSk7Ci0KLQkJcmV0dXJuIGNvbW1hbmRMaXN0ZW5lcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwZWE1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLS8qKgotICogRGlhZ3JhbSBjaGFuZ2UgbGlzdGVuZXIgZm9yIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMKLQkJSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBY3Rpdml0eURpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMmFkYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi0vKioKLSAqIERpYWdyYW0gY2hhbmdlIGxpc3RlbmVyIGZvciBhY3Rpdml0eSBkaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBY3Rpdml0eU5vZGVDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFjdGl2aXR5Tm9kZUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxY2NlMzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFjdGl2aXR5Tm9kZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi0vKioKLSAqIE5vZGUgY2hhbmdlIGxpc3RlbmVyIGZvciBhY3Rpdml0eSBub2RlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGl2aXR5Tm9kZUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgSU5vZGVDaGFuZ2VMaXN0ZW5lciB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBZGFwdGVyRmFjdG9yeUZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFkYXB0ZXJGYWN0b3J5RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YjA5NGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFkYXB0ZXJGYWN0b3J5RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQWRhcHRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci0KLS8qKgotICogRmlsdGVyIHRoYXQgcHJvdmlkZXMgYWRhcHRlciBmYWN0b3JpZXMgZm9yIGRpZmZlcmVudCB2aWV3cyBvZiBwcm9jZXNzCi0gKiBicmVha2Rvd24gc3RydWN0dXJlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBZGFwdGVyRmFjdG9yeUZpbHRlciBleHRlbmRzIElGaWx0ZXIsIElBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lEaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lEaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxODlhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JRGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotCi0vKioKLSAqIEFkYXB0ZXIgdG8gbGlzdGVuIHRvIGRpYWdyYW0gY2hhbmdlcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEaWFncmFtQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBBZGFwdGVyIHsKLQlEaWFncmFtIGdldERpYWdyYW0oKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lOb2RlQ2hhbmdlTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lOb2RlQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ4MGQwNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JTm9kZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotCi0vKioKLSAqIEFkYXB0ZXIgdG8gbGlzdGVuIHRvIGNoYW5nZXMgaW4gZGlhZ3JhbSBub2RlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU5vZGVDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEFkYXB0ZXIgewotCU5vZGUgZ2V0Tm9kZSgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSVdQRERpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSVdQRERpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzYwMmU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lXUEREaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLS8qKgotICogRGlhZ3JhbSBjaGFuZ2UgbGlzdGVuZXIgZm9yIHdvcmsgcHJvZHVjdCBkZXBlbmRlbmN5IGRpYWdyYW0uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdQRERpYWdyYW1DaGFuZ2VMaXN0ZW5lciBleHRlbmRzIElEaWFncmFtQ2hhbmdlTGlzdGVuZXIgewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9Nb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9Nb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiODRkOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIE1vZGVsUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIE1vZGVsQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBNb2RlbFN3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBNb2RlbFN3aXRjaDxBZGFwdGVyPigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURpYWdyYW0oRGlhZ3JhbSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGlhZ3JhbUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUxpbmsoTGluayBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTGlua0FkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUxpbmtlZE9iamVjdChMaW5rZWRPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUxpbmtlZE9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU5hbWVkTm9kZShOYW1lZE5vZGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU5hbWVkTm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU5vZGUoTm9kZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUFjdGl2aXR5RGlhZ3JhbShBY3Rpdml0eURpYWdyYW0gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVR5cGVkTm9kZShUeXBlZE5vZGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVkTm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0Tm9kZShXb3JrUHJvZHVjdE5vZGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0Tm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbShBY3Rpdml0eURldGFpbERpYWdyYW0gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU5vZGVDb250YWluZXIoTm9kZUNvbnRhaW5lciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTm9kZUNvbnRhaW5lckFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvbGVOb2RlKFJvbGVOb2RlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSb2xlTm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvbGVUYXNrQ29tcG9zaXRlKFJvbGVUYXNrQ29tcG9zaXRlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVRhc2tOb2RlKFRhc2tOb2RlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUYXNrTm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZShXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0Q29tcG9zaXRlKFdvcmtQcm9kdWN0Q29tcG9zaXRlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEBPdmVycmlkZQotCQkJCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIDxlbT5EaWFncmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlhZ3JhbUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayA8ZW0+TGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxpbmtBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdCA8ZW0+TGlua2VkIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlTGlua2VkT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGUgPGVtPk5hbWVkIE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5hbWVkTm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSA8ZW0+Tm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5vZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbSA8ZW0+QWN0aXZpdHkgRGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlEaWFncmFtQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGUgPGVtPlR5cGVkIE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVR5cGVkTm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSA8ZW0+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZSA8ZW0+V29yayBQcm9kdWN0IE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0Tm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtIDxlbT5BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlEZXRhaWxEaWFncmFtQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyIDxlbT5Ob2RlIENvbnRhaW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5vZGVDb250YWluZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlIDxlbT5Sb2xlIE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZU5vZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlIDxlbT5Sb2xlIFRhc2sgQ29tcG9zaXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZSA8ZW0+VGFzayBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tOb2RlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIDxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50IE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGUgPGVtPldvcmsgUHJvZHVjdCBDb21wb3NpdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vTW9kZWxBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvTW9kZWxTd2l0Y2guamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL01vZGVsU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZTg4Y2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvTW9kZWxTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFN3aXRjaDxUPiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBNb2RlbFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBNb2RlbFN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgVCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIFQgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0PEVDbGFzcz4gZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIFQgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ESUFHUkFNOiB7Ci0JCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VEaWFncmFtKGRpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVDb250YWluZXIoZGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZShkaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMaW5rZWRPYmplY3QoZGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOSzogewotCQkJCUxpbmsgbGluayA9IChMaW5rKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlTGluayhsaW5rKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMaW5rZWRPYmplY3QobGluayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVDogewotCQkJCUxpbmtlZE9iamVjdCBsaW5rZWRPYmplY3QgPSAoTGlua2VkT2JqZWN0KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlTGlua2VkT2JqZWN0KGxpbmtlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERTogewotCQkJCU5hbWVkTm9kZSBuYW1lZE5vZGUgPSAoTmFtZWROb2RlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlTmFtZWROb2RlKG5hbWVkTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZShuYW1lZE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdChuYW1lZE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREU6IHsKLQkJCQlOb2RlIG5vZGUgPSAoTm9kZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZU5vZGUobm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGlua2VkT2JqZWN0KG5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkFDVElWSVRZX0RJQUdSQU06IHsKLQkJCQlBY3Rpdml0eURpYWdyYW0gYWN0aXZpdHlEaWFncmFtID0gKEFjdGl2aXR5RGlhZ3JhbSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUFjdGl2aXR5RGlhZ3JhbShhY3Rpdml0eURpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURpYWdyYW0oYWN0aXZpdHlEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlQ29udGFpbmVyKGFjdGl2aXR5RGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZShhY3Rpdml0eURpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdChhY3Rpdml0eURpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREU6IHsKLQkJCQlUeXBlZE5vZGUgdHlwZWROb2RlID0gKFR5cGVkTm9kZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVR5cGVkTm9kZSh0eXBlZE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGUodHlwZWROb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMaW5rZWRPYmplY3QodHlwZWROb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOiB7Ci0JCQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSB3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtID0gKFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURpYWdyYW0od29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZUNvbnRhaW5lcih3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlKHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdCh3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfTk9ERTogewotCQkJCVdvcmtQcm9kdWN0Tm9kZSB3b3JrUHJvZHVjdE5vZGUgPSAoV29ya1Byb2R1Y3ROb2RlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3ROb2RlKHdvcmtQcm9kdWN0Tm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWROb2RlKHdvcmtQcm9kdWN0Tm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZSh3b3JrUHJvZHVjdE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdCh3b3JrUHJvZHVjdE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOiB7Ci0JCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSA9IChBY3Rpdml0eURldGFpbERpYWdyYW0pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VBY3Rpdml0eURldGFpbERpYWdyYW0oYWN0aXZpdHlEZXRhaWxEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEaWFncmFtKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZUNvbnRhaW5lcihhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGUoYWN0aXZpdHlEZXRhaWxEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMaW5rZWRPYmplY3QoYWN0aXZpdHlEZXRhaWxEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUjogewotCQkJCU5vZGVDb250YWluZXIgbm9kZUNvbnRhaW5lciA9IChOb2RlQ29udGFpbmVyKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlTm9kZUNvbnRhaW5lcihub2RlQ29udGFpbmVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlKG5vZGVDb250YWluZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdChub2RlQ29udGFpbmVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ST0xFX05PREU6IHsKLQkJCQlSb2xlTm9kZSByb2xlTm9kZSA9IChSb2xlTm9kZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVJvbGVOb2RlKHJvbGVOb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZE5vZGUocm9sZU5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGUocm9sZU5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdChyb2xlTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUk9MRV9UQVNLX0NPTVBPU0lURTogewotCQkJCVJvbGVUYXNrQ29tcG9zaXRlIHJvbGVUYXNrQ29tcG9zaXRlID0gKFJvbGVUYXNrQ29tcG9zaXRlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUm9sZVRhc2tDb21wb3NpdGUocm9sZVRhc2tDb21wb3NpdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVDb250YWluZXIocm9sZVRhc2tDb21wb3NpdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGUocm9sZVRhc2tDb21wb3NpdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdChyb2xlVGFza0NvbXBvc2l0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVEFTS19OT0RFOiB7Ci0JCQkJVGFza05vZGUgdGFza05vZGUgPSAoVGFza05vZGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VUYXNrTm9kZSh0YXNrTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWROb2RlKHRhc2tOb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlKHRhc2tOb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMaW5rZWRPYmplY3QodGFza05vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREU6IHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUod29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWROb2RlKHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGUod29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGlua2VkT2JqZWN0KHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERTogewotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSB3b3JrQnJlYWtkb3duRWxlbWVudE5vZGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKHdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWROb2RlKHdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZSh3b3JrQnJlYWtkb3duRWxlbWVudE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdCh3b3JrQnJlYWtkb3duRWxlbWVudE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9DT01QT1NJVEU6IHsKLQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSB3b3JrUHJvZHVjdENvbXBvc2l0ZSA9IChXb3JrUHJvZHVjdENvbXBvc2l0ZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0Q29tcG9zaXRlKHdvcmtQcm9kdWN0Q29tcG9zaXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlQ29udGFpbmVyKHdvcmtQcm9kdWN0Q29tcG9zaXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlKHdvcmtQcm9kdWN0Q29tcG9zaXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMaW5rZWRPYmplY3Qod29ya1Byb2R1Y3RDb21wb3NpdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpYWdyYW08L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgVCBjYXNlRGlhZ3JhbShEaWFncmFtIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MaW5rPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGluazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFQgY2FzZUxpbmsoTGluayBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGlua2VkIE9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxpbmtlZCBPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBUIGNhc2VMaW5rZWRPYmplY3QoTGlua2VkT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lZCBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TmFtZWQgTm9kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFQgY2FzZU5hbWVkTm9kZShOYW1lZE5vZGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ob2RlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgVCBjYXNlTm9kZShOb2RlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3Rpdml0eSBEaWFncmFtPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHkgRGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFQgY2FzZUFjdGl2aXR5RGlhZ3JhbShBY3Rpdml0eURpYWdyYW0gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlR5cGVkIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UeXBlZCBOb2RlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgVCBjYXNlVHlwZWROb2RlKFR5cGVkTm9kZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW08L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IE5vZGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrUHJvZHVjdE5vZGUoV29ya1Byb2R1Y3ROb2RlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5IERldGFpbCBEaWFncmFtPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQWN0aXZpdHlEZXRhaWxEaWFncmFtKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Tm9kZSBDb250YWluZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ob2RlIENvbnRhaW5lcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU5vZGVDb250YWluZXIoTm9kZUNvbnRhaW5lciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBOb2RlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9sZU5vZGUoUm9sZU5vZGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgVGFzayBDb21wb3NpdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFRhc2sgQ29tcG9zaXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9sZVRhc2tDb21wb3NpdGUoUm9sZVRhc2tDb21wb3NpdGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgTm9kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRhc2tOb2RlKFRhc2tOb2RlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3IgTm9kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudCBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudCBOb2RlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IENvbXBvc2l0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBDb21wb3NpdGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrUHJvZHVjdENvbXBvc2l0ZShXb3JrUHJvZHVjdENvbXBvc2l0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgVCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Nb2RlbFN3aXRjaApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvVHhVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9UeFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAyOWE5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9UeFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLkFic3RyYWN0RU1GT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUeFV0aWwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNYXAgREVGQVVMVF9UWF9PUFRJT05TID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlzdGF0aWMgewotCQlUeFV0aWwuREVGQVVMVF9UWF9PUFRJT05TLnB1dChUcmFuc2FjdGlvbi5PUFRJT05fVU5QUk9URUNURUQsIEJvb2xlYW4uVFJVRSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHJ1bkluVHJhbnNhY3Rpb24oRU9iamVjdCBvYmplY3RUb01vZGlmeSwKLQkJCVJ1bm5hYmxlIG1vZGlmeU9wZXJhdGlvbikgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkb21haW4gPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihvYmplY3RUb01vZGlmeSk7Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJCQkKLQkJaWYgKGRvbWFpbiA9PSBudWxsKSB7Ci0JCQltb2RpZnlPcGVyYXRpb24ucnVuKCk7Ci0JCX0gZWxzZSB7Ci0JCQlydW5JblRyYW5zYWN0aW9uKGRvbWFpbiwgbW9kaWZ5T3BlcmF0aW9uKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcnVuSW5UcmFuc2FjdGlvbihUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlmaW5hbCBSdW5uYWJsZSBtb2RpZnlPcGVyYXRpb24pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQluZXcgQWJzdHJhY3RFTUZPcGVyYXRpb24oZG9tYWluLCAiIiwgREVGQVVMVF9UWF9PUFRJT05TKSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCW1vZGlmeU9wZXJhdGlvbi5ydW4oKTsKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQotCQl9LmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTdjOGE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyB0aGUgYWN0aXZpdHkgZGlhZ3JhbSBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWQxZTNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwODA1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuRGlhZ3JhbVVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnksCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aSwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnZpZXdlcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBiMmZjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFhMDU0ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgRGlhZ3JhbSBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzY2E5M2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL0RpYWdyYW1VSVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL0RpYWdyYW1VSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTJmYWJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9EaWFncmFtVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1VSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpIjsgIC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBEaWFncmFtVUlQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBEaWFncmFtVUlQbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBEaWFncmFtVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9hY3Rpb25zL0N1c3RvbUFycmFuZ2VBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9hY3Rpb25zL0N1c3RvbUFycmFuZ2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlZmRjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvYWN0aW9ucy9DdXN0b21BcnJhbmdlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLmludGVybmFsLkFycmFuZ2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtRWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLQotLyoqCi0gKiBAYXV0aG9yIHNrYW5ub29yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQXJyYW5nZUFjdGlvbiBleHRlbmRzIEFycmFuZ2VBY3Rpb24gewotCi0JCi0JcHJpdmF0ZSBEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0OwotCXByaXZhdGUgR3JhcGhpY2FsVmlld2VyIHZpZXdlcjsKLQotCS8qKgotCSAqIEBwYXJhbSB3b3JrYmVuY2hQYWdlCi0JICogQHBhcmFtIHNlbGVjdGlvbk9ubHkKLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQXJyYW5nZUFjdGlvbihJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlLAotCQkJYm9vbGVhbiBzZWxlY3Rpb25Pbmx5LCBEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0LCBHcmFwaGljYWxWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKHdvcmtiZW5jaFBhZ2UsIHNlbGVjdGlvbk9ubHkpOwotCQl0aGlzLmRpYWdyYW1FZGl0UGFydCA9IGRpYWdyYW1FZGl0UGFydDsKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0IGdldFNlbGVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIGRpYWdyYW1FZGl0UGFydC5nZXRDaGlsZHJlbigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGlhZ3JhbUVkaXRQYXJ0IGdldERpYWdyYW1FZGl0UGFydCgpIHsKLQkJcmV0dXJuIGRpYWdyYW1FZGl0UGFydDsKLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERpYWdyYW1Db21tYW5kU3RhY2sgZ2V0RGlhZ3JhbUNvbW1hbmRTdGFjaygpIHsKLQkJcmV0dXJuIG5ldyBEaWFncmFtQ29tbWFuZFN0YWNrKChJRGlhZ3JhbUVkaXREb21haW4pdmlld2VyLmdldEVkaXREb21haW4oKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvRGlhZ3JhbUVkaXRvckhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvRGlhZ3JhbUVkaXRvckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzcyNGZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9zZXJ2aWNlL0RpYWdyYW1FZGl0b3JIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFERGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5EaWFncmFtVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRGlhZ3JhbU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgZm9yIGRpYWdyYW0gZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRWRpdG9ySGVscGVyIHsKLQlwcml2YXRlIE1hcDxQcm9jZXNzLCBEaWFncmFtTWFuYWdlcj4gcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAgPSBuZXcgSGFzaE1hcDxQcm9jZXNzLCBEaWFncmFtTWFuYWdlcj4oKTsKLQkKLQlwdWJsaWMgRGlhZ3JhbUVkaXRvckhlbHBlcigpIHsKLQl9Ci0JCi0JcHVibGljIERpYWdyYW1NYW5hZ2VyIGdldERpYWdyYW1NYW5hZ2VyKFByb2Nlc3MgcHJvYykgewotCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC5nZXQocHJvYyk7Ci0JCWlmKG1nciAhPSBudWxsICYmIG1nci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLnJlbW92ZShwcm9jKTsKLQkJCW1nciA9IG51bGw7Ci0JCX0KLQkJaWYobWdyID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAocHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXApIHsKLQkJCQltZ3IgPSBwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC5nZXQocHJvYyk7Ci0JCQkJaWYobWdyID09IG51bGwpIHsKLQkJCQkJbWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UocHJvYywgdGhpcyk7Ci0JCQkJCXByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLnB1dChwcm9jLCBtZ3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbWdyOwotCX0JCi0JCi0JcHVibGljIHZvaWQgb3BlbkRpYWdyYW0oSUVkaXRvclBhcnQgcGFydCwgaW50IGRpYWdyYW1UeXBlLCBPYmplY3Qgc2VsZWN0ZWRPYmplY3QsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCXRyeSB7Ci0JCQlEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dCgKLQkJCQkJc2VsZWN0ZWRPYmplY3QsIHN1cHByZXNzaW9uLCBkaWFncmFtVHlwZSk7Ci0JCQlEaWFncmFtRWRpdG9yVXRpbC5vcGVuRGlhZ3JhbUVkaXRvcihwYXJ0LmdldFNpdGUoKS5nZXRQYWdlKCksIGlucHV0LCBnZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KGRpYWdyYW1UeXBlKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CQkJCQkKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtIGdldERpYWdyYW0oQWN0aXZpdHkgYWN0aXZpdHksIGludCB0eXBlKSB7Ci0JCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0gZGlhZ3JhbSA9IG51bGw7Ci0JCURpYWdyYW1NYW5hZ2VyIGRNZ3IgPSBnZXREaWFncmFtTWFuYWdlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0aXZpdHkpKTsKLQkJaWYgKGRNZ3IgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlMaXN0PERpYWdyYW0+IGxpc3QgPSBkTWdyLmdldERpYWdyYW1zKGFjdGl2aXR5LCB0eXBlKTsKLQkJCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCWRpYWdyYW0gPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSkgbGlzdC5nZXQoMCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkJIkNvcmUgZXJyb3IgcmV0cmlldmluZyBhIGRpYWdyYW0gaW4gcHJvY2VzcyBlZGl0b3I6IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gCi0JCX0KLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBhY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RGlhZ3JhbXMoQWN0aXZpdHkgYWN0KSB7Ci0KLQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gZ2V0RGlhZ3JhbU1hbmFnZXIoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdCkpOwotCQl0cnl7Ci0JCQlBcnJheUxpc3Q8RGlhZ3JhbT4gZGlhZ3JhbXMgPSBuZXcgQXJyYXlMaXN0PERpYWdyYW0+KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IERpYWdyYW1IZWxwZXIuRElBR1JBTV9UWVBFUy5sZW5ndGg7IGkrKykgewotCQkJCUxpc3Q8RGlhZ3JhbT4gbGlzdCA9IG1nci5nZXREaWFncmFtcyhhY3QsIERpYWdyYW1IZWxwZXIuRElBR1JBTV9UWVBFU1tpXSk7Ci0JCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQlkaWFncmFtcy5hZGRBbGwobGlzdCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGRpYWdyYW1zOwotCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpewotCQlmb3IgKERpYWdyYW1NYW5hZ2VyIG1nciA6IHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLnZhbHVlcygpKSB7Ci0JCQl0cnkgewotCQkJCW1nci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGludCBnZXREaWFncmFtVHlwZShEaWFncmFtIGRpYWdyYW0pewotCQlyZXR1cm4gRGlhZ3JhbUhlbHBlci5nZXREaWFncmFtVHlwZShkaWFncmFtKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGVTdHJpbmcoRGlhZ3JhbSBkaWFncmFtKXsKLQkJcmV0dXJuIERpYWdyYW1IZWxwZXIuZ2V0RGlhZ3JhbVR5cGVTdHJpbmcoZGlhZ3JhbSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUHJlZmVyZW5jZXNIaW50IGdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoaW50IGRpYWdyYW1UeXBlKSB7Ci0JCXN3aXRjaChkaWFncmFtVHlwZSkgewotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJcmV0dXJuIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQ7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJcmV0dXJuIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQ7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQlyZXR1cm4gV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIENsb3NlIGRpYWdyYW0gZWRpdG9ycwotCSAqIAotCSAqIEBwYXJhbSBjbG9zZUVsZW1lbnQKLQkgKiBAcGFyYW0gY2xvc2VFZGl0b3JSZWZzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlRGlhZ3JhbUVkaXRvcnMoT2JqZWN0IGNsb3NlRWxlbWVudCwgCi0JCQlqYXZhLnV0aWwuTGlzdDxJRWRpdG9yUmVmZXJlbmNlPiBjbG9zZWRFZGl0b3JSZWZzKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJLmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYod29ya2JlbmNoUGFnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJaWYoY2xvc2VkRWRpdG9yUmVmcyA9PSBudWxsKSB7Ci0JCQljbG9zZWRFZGl0b3JSZWZzID0gbmV3IEFycmF5TGlzdDxJRWRpdG9yUmVmZXJlbmNlPigpOwotCQl9Ci0JCUFycmF5TGlzdDxJRWRpdG9yUmVmZXJlbmNlPiBjbG9zZUVkaXRvclJlZnMgPSBuZXcgQXJyYXlMaXN0PElFZGl0b3JSZWZlcmVuY2U+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgewotCQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgZGlhZ3JhbUlucHV0ID0gKChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgaW5wdXQpLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJCQlpZiAoZGlhZ3JhbUlucHV0LmdldFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQllbGVtZW50ID0gZGlhZ3JhbUlucHV0LmdldFdyYXBwZXIoKTsKLQkJCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQkJLy8gY2xvc2UgdGhlIHBhcmVudCBlZGl0b3IgdG9vLCBpZiBvcGVuZWQuCi0JCQkJCQkJT2JqZWN0IHBhcmVudCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpZWxlbWVudCkuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQkJCQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQkJaWYoZWxlbWVudC5lcXVhbHMoY2xvc2VFbGVtZW50KSkKLQkJCQkJCQkJCWNsb3NlRGlhZ3JhbUVkaXRvcnMocGFyZW50LCBjbG9zZWRFZGl0b3JSZWZzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllbGVtZW50ID0gZGlhZ3JhbUlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCX0gCi0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQlpZiAoZWxlbWVudC5lcXVhbHMoY2xvc2VFbGVtZW50KSkgewotCQkJCQkJY2xvc2VFZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gY2hlY2sgd2hldGhlciBlbGVtZW50IGlzIGNoaWxkIG9mIGNsb3NlRWxlbWVudAotCQkJCQkJLy8gZGlyZWN0bHkvaW5kaXJlY3RseQotCQkJCQkJaWYgKGNsb3NlRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCVByb2Nlc3NVdGlsLmdldENoaWxkRWxlbWVudHMoCi0JCQkJCQkJCQkoQWN0aXZpdHkpIGNsb3NlRWxlbWVudCwgQWN0aXZpdHkuY2xhc3MsCi0JCQkJCQkJCQljb2xsZWN0aW9uKTsKLQkJCQkJCQlpZiAoY29sbGVjdGlvbi5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWludCBzaXplID0gY2xvc2VFZGl0b3JSZWZzLnNpemUoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgSUVkaXRvclJlZmVyZW5jZVtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlZmVyZW5jZXNbaV0gPSAoSUVkaXRvclJlZmVyZW5jZSkgY2xvc2VFZGl0b3JSZWZzLmdldChpKTsKLQkJfQotCQl3b3JrYmVuY2hQYWdlLmNsb3NlRWRpdG9ycyhyZWZlcmVuY2VzLCBmYWxzZSk7Ci0JCXJlZmVyZW5jZXMgPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBEaWFncmFtIGVkaXRvcnMgb2Ygb2JqZWN0IGl0c2VsZiB3aWxsIGJlIGNsb3NlZC4gQW5kIFBhcmVudCBkaWFncmFtCi0JICogZWRpdG9ycyB3aWxsIGJlIHJlZnJlc2hlZC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFBhcmVudERpYWdyYW1FZGl0b3JzKE9iamVjdCByZWZyZXNoRWxlbWVudCwKLQkJCWphdmEudXRpbC5MaXN0PElFZGl0b3JSZWZlcmVuY2U+IG9wZW5FZGl0b3JSZWZzLCBib29sZWFuIHBhcmVudFJlZnJlc2gpIHsKLQkJb3BlbkVkaXRvclJlZnMgPSBuZXcgQXJyYXlMaXN0PElFZGl0b3JSZWZlcmVuY2U+KCk7Ci0JCS8vIE5vdyByZWZyZXNoIG9iamVjdCdzIHBhcmVudCdzIGRpYWdyYW1zLgotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gRGlhZ3JhbVVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgewotCQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgZGlhZ3JhbUlucHV0ID0gKChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgaW5wdXQpCi0JCQkJCQkJLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJCQlpZiAoZGlhZ3JhbUlucHV0LmdldFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQllbGVtZW50ID0gZGlhZ3JhbUlucHV0LmdldFdyYXBwZXIoKTsKLQkJCQkJCWlmKHBhcmVudFJlZnJlc2gpewotCQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQlPYmplY3QgcGFyZW50ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudCkKLQkJCQkJCQkJCS5nZXRQYXJlbnQobnVsbCk7Ci0JCQkJCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJCWlmIChlbGVtZW50LmVxdWFscyhyZWZyZXNoRWxlbWVudCkpCi0JCQkJCQkJCQlyZWZyZXNoUGFyZW50RGlhZ3JhbUVkaXRvcnMocGFyZW50LAotCQkJCQkJCQkJCQlvcGVuRWRpdG9yUmVmcywgcGFyZW50UmVmcmVzaCk7Ci0JCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVsZW1lbnQgPSBkaWFncmFtSW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJaWYoIXBhcmVudFJlZnJlc2gpewotCQkJCQkJCWlmKGVsZW1lbnQgPT0gcmVmcmVzaEVsZW1lbnQpewotCQkJCQkJCQlvcGVuRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoKChBY3Rpdml0eSkgZWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKQotCQkJCQkJCQkuY29udGFpbnMocmVmcmVzaEVsZW1lbnQpKQotCQkJCQkJCW9wZW5FZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJZWxzZSBpZiAocmVmcmVzaEVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJCU9iamVjdCBsb2NhbFJlZnJlc2hFbGVtZW50ID0gcmVmcmVzaEVsZW1lbnQ7Ci0JCQkJCQkJd2hpbGUgKChsb2NhbFJlZnJlc2hFbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpCi0JCQkJCQkJCQkmJiAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBsb2NhbFJlZnJlc2hFbGVtZW50KQotCQkJCQkJCQkJCQkuZ2V0T3duZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmICgoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBsb2NhbFJlZnJlc2hFbGVtZW50KQotCQkJCQkJCQkJCS5nZXRPd25lcigpLmVxdWFscyhlbGVtZW50KSkgewotCQkJCQkJCQkJb3BlbkVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJbG9jYWxSZWZyZXNoRWxlbWVudCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGxvY2FsUmVmcmVzaEVsZW1lbnQpCi0JCQkJCQkJCQkJLmdldE93bmVyKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYoKChBY3Rpdml0eSkgZWxlbWVudCkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpewotCQkJCQkJCUFjdGl2aXR5IGJhc2UgPSAoQWN0aXZpdHkpKChBY3Rpdml0eSkgZWxlbWVudCkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQkJCWlmICgoKEFjdGl2aXR5KSBiYXNlKS5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCQkJCQkuY29udGFpbnMocmVmcmVzaEVsZW1lbnQpKQotCQkJCQkJCQlvcGVuRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCUNvbGxlY3Rpb24gYyA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQpCi0JCQkJCQkJCS5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJCQkJCWlmIChjICE9IG51bGwgJiYgYy5jb250YWlucyhyZWZyZXNoRWxlbWVudCkpIHsKLQkJCQkJCQlvcGVuRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQl9Ci0JCWludCBzaXplID0gb3BlbkVkaXRvclJlZnMuc2l6ZSgpOwotCQkvLyBJRWRpdG9yUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IG5ldyBJRWRpdG9yUmVmZXJlbmNlW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSAoSUVkaXRvclJlZmVyZW5jZSkgb3BlbkVkaXRvclJlZnMKLQkJCQkJLmdldChpKTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKSB7Ci0JCQkJKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpIGVkaXRvcikucmVmcmVzaERpYWdyYW0oKTsKLQkJCQlpZihlZGl0b3IgaW5zdGFuY2VvZiBBRERpYWdyYW1FZGl0b3IpewotCQkJCQkoKEFERGlhZ3JhbUVkaXRvcillZGl0b3IpLnJ1blJlc2V0TGF5b3V0QWN0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldHMgbGlzdCBvZiBjb21tYW5kIGxpc3RlbmVycyB0aGF0IHdpbGwgaGFuZGxlIHRoZSBkaWFncmFtIHJlbGF0ZWQgY2hhbmdlcyBvZiB0aGUgY29tbWFuZHMgb2YgaW50ZXJlc3NlcwotCSAqIAotCSAqIEByZXR1cm4KLQkgKiBAc2VlIElDb21tYW5kTGlzdGVuZXIKLQkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgTGlzdDxJQ29tbWFuZExpc3RlbmVyPiBnZXRDb21tYW5kTGlzdGVuZXJzKCkgewotLy8JCWlmIChjb21tYW5kTGlzdGVuZXJzID09IG51bGwpIHsKLS8vCQkJY29tbWFuZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SUNvbW1hbmRMaXN0ZW5lcj4oKTsKLS8vCQl9Ci0vLwotLy8JCWNvbW1hbmRMaXN0ZW5lcnMuYWRkKG5ldyBJQ29tbWFuZExpc3RlbmVyKCkgewotLy8JCQkKLS8vCQkJcHVibGljIHZvaWQgbm90aWZ5RXhlY3V0ZWQoQ29tbWFuZCBjb21tYW5kKSB7Ci0vLwkJCQkvLyBnZXQgY29udHJpYnV0b3IvcmVwbGFjZXIgb2YgdGhlIGFjdGl2aXR5Ci0vLwkJCQkvLwotLy8JCQkJaWYodHJ1ZSkgcmV0dXJuOwotLy8JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBjb21tYW5kLmdldFJlc3VsdCgpLml0ZXJhdG9yKCkubmV4dCgpOwotLy8JCQkJQWN0aXZpdHkgYmFzZSA9IChBY3Rpdml0eSkgYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLS8vCQkJCURpYWdyYW1NYW5hZ2VyIGRNZ3IgPSBudWxsOwotLy8JCQkJRGlhZ3JhbU1hbmFnZXIgYmFzZU1nciA9IG51bGw7Ci0vLwkJCQl0cnkgewotLy8JCQkJCWlmIChiYXNlICE9IG51bGwpIHsKLS8vCQkJCQkJQWN0aXZpdHkgcGFyZW50QWN0ID0gYWN0LmdldFN1cGVyQWN0aXZpdGllcygpOwotLy8JCQkJCQlkTWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UoVG5nVXRpbAotLy8JCQkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKHBhcmVudEFjdCkpOwotLy8JCQkJCQlEaWFncmFtIGRpYWdyYW0gPSBudWxsOwotLy8JCQkJCQlMaXN0PERpYWdyYW0+IGRpYWdyYW1zID0gZE1nci5nZXREaWFncmFtcyhwYXJlbnRBY3QsCi0vLwkJCQkJCQkJSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0pOwotLy8JCQkJCQlpZiAoIWRpYWdyYW1zLmlzRW1wdHkoKSkgewotLy8JCQkJCQkJZGlhZ3JhbSA9IGRpYWdyYW1zLmdldCgwKTsKLS8vCQkJCQkJfQotLy8JCQkJCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0vLwkJCQkJCQkvLyBmaW5kIGV4aXN0aW5nIG5vZGUgZm9yIGJhc2UgYW5kIGxpbmsgaXQgdG8gdGhlCi0vLwkJCQkJCQkvLyBjb250cmlidXRvcmUvcmVwbGFjZXIgb2YgdGhlIGFjdGl2aXR5Ci0vLwkJCQkJCQlOb2RlIG5vZGUgPSBmaW5kTm9kZShkaWFncmFtLCBiYXNlKTsKLS8vCQkJCQkJCWlmIChub2RlICE9IG51bGwpIHsKLS8vCQkJCQkJCQlOb2RlQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyCi0vLwkJCQkJCQkJCQkuZ2V0Tm9kZUFkYXB0ZXIobm9kZS5nZXRFbGVtZW50KCkpOwotLy8JCQkJCQkJCWlmIChhZGFwdGVyICE9IG51bGwKLS8vCQkJCQkJCQkJCSYmIGFkYXB0ZXIuZ2V0RWxlbWVudCgpICE9IGFjdCkgewotLy8JCQkJCQkJCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKChFTW9kZWxFbGVtZW50KSBub2RlCi0vLwkJCQkJCQkJCQkJLmdldEVsZW1lbnQoKSwgYWN0KTsKLS8vCQkJCQkJCQkJQnJpZGdlSGVscGVyCi0vLwkJCQkJCQkJCQkJLnVubWFya0luSGVyaXRlZCgoRU1vZGVsRWxlbWVudCkgbm9kZQotLy8JCQkJCQkJCQkJCQkJLmdldEVsZW1lbnQoKSk7Ci0vLwkJCQkJCQkJfQotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJCWlmIChhY3QuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTl9MSVRFUkFMKSB7Ci0vLwkJCQkJCQkvLyBjb3B5IGRpYWdyYW1zIGFuZCB0aGVpciBwdWJsaXNoaW5nIG9wdGlvbnMKLS8vCQkJCQkJCWJhc2VNZ3IgPSBEaWFncmFtTWFuYWdlcgotLy8JCQkJCQkJCQkuZ2V0SW5zdGFuY2UoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGJhc2UpKTsKLS8vCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgRGlhZ3JhbUhlbHBlci5ESUFHUkFNX1RZUEVTLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCQkJCQkJaW50IGRpYWdyYW1UeXBlID0gRGlhZ3JhbUhlbHBlci5ESUFHUkFNX1RZUEVTW2ldOwotLy8JCQkJCQkJCUxpc3QgYmFzZURpYWdyYW1zID0gYmFzZU1nci5nZXREaWFncmFtcyhiYXNlLAotLy8JCQkJCQkJCQkJZGlhZ3JhbVR5cGUpOwotLy8JCQkJCQkJCWlmICghYmFzZURpYWdyYW1zLmlzRW1wdHkoKSAmJiBiYXNlRGlhZ3JhbXMuZ2V0KDApICE9IG51bGwpIHsKLS8vCQkJCQkJCQkJRGlhZ3JhbSBjb3B5ID0gYmFzZU1nci5jcmVhdGVEaWFncmFtKGFjdCwKLS8vCQkJCQkJCQkJCQlkaWFncmFtVHlwZSwgbnVsbCk7Ci0vLwkJCQkJCQkJCWlmIChpc1B1Ymxpc2hEaWFncmFtKGJhc2UsIGRpYWdyYW1UeXBlKSkgewotLy8JCQkJCQkJCQkJc2V0RGlhZ3JhbU9wdGlvbnMoYWN0LCBkaWFncmFtVHlwZSk7Ci0vLwkJCQkJCQkJCX0KLS8vCQkJCQkJCQl9Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotLy8JCQkJCQotLy8JCQkJfQotLy8JCQkJZmluYWxseXsKLS8vCQkJCQlpZihkTWdyICE9IG51bGwpewotLy8JCQkJCQlkTWdyLnJlbGVhc2UoKTsKLS8vCQkJCQl9Ci0vLwkJCQkJaWYoYmFzZU1nciAhPSBudWxsKXsKLS8vCQkJCQkJZE1nci5yZWxlYXNlKCk7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9Ci0vLwotLy8JCQlwdWJsaWMgQ2xhc3MgZ2V0Q29tbWFuZFR5cGUoKSB7Ci0vLwkJCQlyZXR1cm4gVmFyeUFjdGl2aXR5Q29tbWFuZC5jbGFzczsKLS8vCQkJfQotLy8KLS8vCQkJcHVibGljIHZvaWQgcHJlVW5kbyhDb21tYW5kIGNvbW1hbmQpIHsKLS8vCQkJCS8vIGdldCBvbGQgY29udHJpYnV0b3IvcmVwbGFjZXIgb2YgdGhlIGFjdGl2aXR5Ci0vLwkJCQkvLwotLy8JCQkJaWYodHJ1ZSkgcmV0dXJuOwotLy8JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBjb21tYW5kLmdldFJlc3VsdCgpLml0ZXJhdG9yKCkubmV4dCgpOwotLy8JCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2VBY3QgPSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotLy8JCQkJaWYgKGJhc2VBY3QgIT0gbnVsbCkgewotLy8JCQkJCUFjdGl2aXR5IHBhcmVudEFjdCA9IGFjdC5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLS8vCQkJCQlEaWFncmFtTWFuYWdlciBkTWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHBhcmVudEFjdCkpOwotLy8JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IG51bGw7IAotLy8JCQkJCXRyeSB7Ci0vLwkJCQkJCUxpc3QgZGlhZ3JhbXMgPSBkTWdyLmdldERpYWdyYW1zKHBhcmVudEFjdCwKLS8vCQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RJQUdSQU0pOwotLy8JCQkJCQlkaWFncmFtID0gKERpYWdyYW0pIGRpYWdyYW1zLmdldCgwKTsKLS8vCQkJCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotLy8JCQkJCQkJLy8gZmluZCBleGlzdGluZyBub2RlIGZvciB0aGUgb2xkCi0vLwkJCQkJCQkvLyBjb250cmlidXRvcmUvcmVwbGFjZXIKLS8vCQkJCQkJCS8vIG9sZCBhbmQgcmVsaW5rIGl0IHRvIHRoZSBiYXNlIGFjdGl2aXR5Ci0vLwkJCQkJCQlOb2RlIG5vZGUgPSBmaW5kTm9kZShkaWFncmFtLCBhY3QpOwotLy8JCQkJCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotLy8JCQkJCQkJCU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIKLS8vCQkJCQkJCQkJCS5nZXROb2RlQWRhcHRlcihub2RlLmdldEVsZW1lbnQoKSk7Ci0vLwkJCQkJCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbAotLy8JCQkJCQkJCQkJJiYgYWRhcHRlci5nZXRFbGVtZW50KCkgIT0gYmFzZUFjdCkgewotLy8JCQkJCQkJCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKChFTW9kZWxFbGVtZW50KSBub2RlCi0vLwkJCQkJCQkJCQkJLmdldEVsZW1lbnQoKSwgYmFzZUFjdCk7Ci0vLwkJCQkJCQkJCUJyaWRnZUhlbHBlcgotLy8JCQkJCQkJCQkJCS5tYXJrSW5oZXJpdGVkKChFTW9kZWxFbGVtZW50KSBub2RlCi0vLwkJCQkJCQkJCQkJCQkuZ2V0RWxlbWVudCgpKTsKLS8vCQkJCQkJCQl9Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQkJLy8gcmVtb3ZlIGRpYWdyYW1zIAotLy8JCQkJCQkKLS8vCQkJCQkJCi0vLwkJCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLS8vCQkJCQkJCi0vLwkJCQkJfQotLy8JCQkJCWZpbmFsbHkgewotLy8JCQkJCQkJCi0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9Ci0vLwotLy8JCQlwdWJsaWMgdm9pZCBwcmVFeGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotLy8JCQkJCi0vLwkJCX0KLS8vCi0vLwkJfSk7Ci0vLwotLy8JCXJldHVybiBjb21tYW5kTGlzdGVuZXJzOwotLy8JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREaWFncmFtT3B0aW9ucyhBY3Rpdml0eSBhY3Rpdml0eSAsIGludCBkaWFncmFtVHlwZSl7Ci0JCXN3aXRjaChkaWFncmFtVHlwZSl7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlEaWFncmFtT3B0aW9ucy5zZXRQdWJsaXNoQUQoYWN0aXZpdHksIGZhbHNlKTsKLQkJCWJyZWFrOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCURpYWdyYW1PcHRpb25zLnNldFB1Ymxpc2hBREQoYWN0aXZpdHksIGZhbHNlKTsKLQkJCWJyZWFrOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJRGlhZ3JhbU9wdGlvbnMuc2V0UHVibGlzaFdQREQoYWN0aXZpdHksIGZhbHNlKTsKLQkJCWJyZWFrOwkKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQdWJsaXNoRGlhZ3JhbShBY3Rpdml0eSBhY3Rpdml0eSwgaW50IGRpYWdyYW1UeXBlKXsKLQkJc3dpdGNoKGRpYWdyYW1UeXBlKXsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCXJldHVybiBEaWFncmFtT3B0aW9ucy5pc1B1Ymxpc2hBRChhY3Rpdml0eSk7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJcmV0dXJuIERpYWdyYW1PcHRpb25zLmlzUHVibGlzaEFERChhY3Rpdml0eSk7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQlyZXR1cm4gRGlhZ3JhbU9wdGlvbnMuaXNQdWJsaXNoV1BERChhY3Rpdml0eSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9zZXJ2aWNlL0RpYWdyYW1FZGl0b3JTdGF0ZVByZXNlcnZlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvRGlhZ3JhbUVkaXRvclN0YXRlUHJlc2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZGZjYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvRGlhZ3JhbUVkaXRvclN0YXRlUHJlc2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVycy5TaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLkRpYWdyYW1VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUVkaXRvclN0YXRlUHJlc2VydmVyIHsKLQlwcml2YXRlIElFZGl0b3JSZWZlcmVuY2UgZGlhZ3JhbUVkaXRvclJlZjsKLQlwcml2YXRlIGJvb2xlYW4gZGlydHk7Ci0KLQlwdWJsaWMgRGlhZ3JhbUVkaXRvclN0YXRlUHJlc2VydmVyKE9iamVjdCBhY3Rpdml0eU9yV3JhcHBlciwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIGludCBkaWFncmFtVHlwZSkgewotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkoCi0JCQkJbmV3IERpYWdyYW1FZGl0b3JJbnB1dChhY3Rpdml0eU9yV3JhcHBlciwgc3VwcHJlc3Npb24sIGRpYWdyYW1UeXBlKSwgCi0JCQkJRGlhZ3JhbUVkaXRvckhlbHBlci5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KGRpYWdyYW1UeXBlKSk7Ci0JCXRyeSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQkJU3RyaW5nIGVkaXRvcklkID0gRGlhZ3JhbUVkaXRvclV0aWwuZ2V0RWRpdG9ySWQoZGlhZ3JhbVR5cGUpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUVkaXRvclJlZmVyZW5jZSBlZGl0b3JSZWYgPSBlZGl0b3JSZWZzW2ldOwotCQkJCWlmKGlucHV0LmVxdWFscyhlZGl0b3JSZWYuZ2V0RWRpdG9ySW5wdXQoKSkgJiYgZWRpdG9yUmVmLmVxdWFscyhlZGl0b3JJZCkpIHsKLQkJCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gZWRpdG9yUmVmLmdldEVkaXRvcihmYWxzZSk7Ci0JCQkJCWlmKGVkaXRvciBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCQkJZGlhZ3JhbUVkaXRvclJlZiA9IGVkaXRvclJlZjsJCQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZihkaWFncmFtRWRpdG9yUmVmICE9IG51bGwpIHsKLQkJCQlkaXJ0eSA9IGRpYWdyYW1FZGl0b3JSZWYuZ2V0RWRpdG9yKGZhbHNlKS5pc0RpcnR5KCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlc3RvcmUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZGlhZ3JhbUVkaXRvclJlZiAhPSBudWxsICYmICFkaXJ0eSkgewotCQkJCUFic3RyYWN0RGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoQWJzdHJhY3REaWFncmFtRWRpdG9yKSBkaWFncmFtRWRpdG9yUmVmCi0JCQkJCQkuZ2V0RWRpdG9yKGZhbHNlKTsKLQkJCQlpZiAoZWRpdG9yICE9IG51bGwgJiYgZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCQlJRG9jdW1lbnRQcm92aWRlciBkb2NQcm92aWRlciA9ICgoQWJzdHJhY3REaWFncmFtRWRpdG9yKSBlZGl0b3IpCi0JCQkJCQkJLmdldERvY3VtZW50UHJvdmlkZXIoKTsKLQotCQkJCQkvLyB0aGlzIHdpbGwgY2xlYXIgZGlydHkgZmxhZyBvZiB0aGUgZWRpdG9yCi0JCQkJCS8vCi0JCQkJCWlmIChkb2NQcm92aWRlciBpbnN0YW5jZW9mIFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpIHsKLQkJCQkJCSgoU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcikgZG9jUHJvdmlkZXIpCi0JCQkJCQkJCS5tYXJrRG9jdW1lbnRBc1NhdmVkKChJRmlsZUVkaXRvcklucHV0KSBkaWFncmFtRWRpdG9yUmVmCi0JCQkJCQkJCQkJLmdldEVkaXRvcklucHV0KCkpOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvRGlhZ3JhbUltYWdlU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvRGlhZ3JhbUltYWdlU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGQ4ODAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9zZXJ2aWNlL0RpYWdyYW1JbWFnZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JQWRhcHRlckZhY3RvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuRGlhZ3JhbVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkudmlld2VyLk5ld0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS52aWV3ZXIuTmV3QWN0aXZpdHlEaWFncmFtVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnZpZXdlci5OZXdXUERlcGVuZGVuY3lEaWFncmFtVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTWV0aG9kQ29uZmlndXJhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5WYXJpYWJpbGl0eUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkRpYWdyYW1PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5Qcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0uRGlhZ3JhbUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZUxvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi0vKioKLSAqIFByb3ZpZGVzIHNlcnZpY2UgbWV0aG9kcyBmb3IgY3JlYXRpbmcgZGlhZ3JhbSBpbWFnZXMgZm9yIGFjdGl2aXR5IGVsZW1lbnRzCi0gKiAgIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUltYWdlU2VydmljZSBpbXBsZW1lbnRzIElEaWFncmFtSW1hZ2VTZXJ2aWNlIHsKLQotCXN0YXRpYyBib29sZWFuIGRlYnVnICA9IERpYWdyYW1VSVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQkKLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQgPSBudWxsOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgaG9sZGVyID0gbnVsbDsKLQotCXByaXZhdGUgRmlsZSBwdWJEaXI7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGZvclhNTEV4cG9ydCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgSW50ZWdlcj4gdHlwZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKLQotCXByaXZhdGUgRGlhZ3JhbUluZm8gZGlhZ3JhbUluZm8gPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hVbmNyZWF0ZWRBREQgPSB0cnVlOwotCQotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbiA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGV4aXN0ID0gdHJ1ZTsKLQkKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQotCi0Jc3RhdGljIHsKLQkJdHlwZU1hcC5wdXQoUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XLCBuZXcgSW50ZWdlcigKLQkJCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSkpOwotCQl0eXBlTWFwLnB1dChSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMLCBuZXcgSW50ZWdlcigKLQkJCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pKTsKLQkJdHlwZU1hcC5wdXQoUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1ksIG5ldyBJbnRlZ2VyKAotCQkJCUlEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50VHlwZShTdHJpbmcgZGlhZ3JhbVR5cGUpIHsKLQkJSW50ZWdlciB0eXBlID0gKEludGVnZXIpIHR5cGVNYXAuZ2V0KGRpYWdyYW1UeXBlKTsKLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIHR5cGUuaW50VmFsdWUoKTsKLQkJfQotCi0JCXJldHVybiAtMTsKLQl9Ci0JcHVibGljIHN0YXRpYyBQcmVmZXJlbmNlc0hpbnQgZ2V0UHJlZmVyZW5jZUhpbnQoU3RyaW5nIGRpYWdyYW1UeXBlKXsKLQkJaW50IHR5cGUgPSBnZXRJbnRUeXBlKGRpYWdyYW1UeXBlKTsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlyZXR1cm4gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVDsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQlyZXR1cm4gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVDsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCXJldHVybiBXUEREaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVDsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmdUeXBlKGludCB0eXBlKSB7Ci0JCXN3aXRjaCh0eXBlKSB7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJcmV0dXJuIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCVNoZWxsIHNoZWxsID0gbnVsbDsKLQotCXByaXZhdGUgU2V0PERpYWdyYW1NYW5hZ2VyPiBkaWFncmFtTWFuYWdlcnMgPSBuZXcgSGFzaFNldDxEaWFncmFtTWFuYWdlcj4oKTsKLQotLy8JcHVibGljIERpYWdyYW1JbWFnZVNlcnZpY2UoKSB7Ci0vLwkJdGhpcyhudWxsLCBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpKSk7Ci0vLwl9Ci0KLQlwdWJsaWMgRGlhZ3JhbUltYWdlU2VydmljZShGaWxlIHB1YkRpcikgewotCQl0aGlzKG51bGwsIHB1YkRpcik7Ci0JfQotCi0JcHVibGljIERpYWdyYW1JbWFnZVNlcnZpY2UoQ29tcG9zaXRlIHBhcmVudCwgRmlsZSBwdWJEaXIpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMucHViRGlyID0gcHViRGlyOwotCX0KLQotCXByaXZhdGUgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIGdldERpYWdyYW1WaWV3ZXIoaW50IGRpYWdyYW1UeXBlLCBPYmplY3Qgd3JhcHBlcikgewotCQkvLyBpZiB0aGUgc2hlbGwgd2luZG93IGlzIGRpc3Ryb3llZCwgcmVjcmVhdGUgaXQKLQkJaWYgKCh0aGlzLnNoZWxsICE9IG51bGwpICYmIHRoaXMuc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnBhcmVudCA9IG51bGw7Ci0JCQl0aGlzLnNoZWxsID0gbnVsbDsKLQkJfQotCQlnZXRWaWV3ZXJIb2xkZXIocGFyZW50KTsKLQotCQlzd2l0Y2ggKGRpYWdyYW1UeXBlKSB7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlyZXR1cm4gbmV3IE5ld0FjdGl2aXR5RGlhZ3JhbVZpZXdlcihob2xkZXIsIHdyYXBwZXIpOwotCi0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJcmV0dXJuIG5ldyBOZXdBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIoaG9sZGVyLHdyYXBwZXIpOwotCi0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQlyZXR1cm4gbmV3IE5ld1dQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIoaG9sZGVyLHdyYXBwZXIpOwotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRWaWV3ZXJIb2xkZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCWlmIChzaGVsbCA9PSBudWxsIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJCXNoZWxsID0gY3JlYXRlU2hlbGwoKTsKLQkJCX0KLQkJCXNoZWxsLm9wZW4oKTsKLQkJCXBhcmVudCA9IHNoZWxsOwotCQl9Ci0KLQkJaWYgKGhvbGRlciAhPSBudWxsKSB7Ci0JCQlob2xkZXIuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaG9sZGVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJaG9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKDEsIDEpKTsgLy8gc2l6ZSBjYW4ndCBiZSAwLDAKLQkJLy8gb3RoZXJ3aXNlIHRoZSBkaWFncmFtCi0JCS8vIHdpbGwgbm90IGJlIHBhaW50ZWQKLQkJaG9sZGVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJaG9sZGVyLnNldFZpc2libGUoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgU2hlbGwgY3JlYXRlU2hlbGwoKSB7Ci0JCVNoZWxsIHNoZWxsID0gbnVsbDsKLQkJRGlzcGxheSBkID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCXNoZWxsID0gbmV3IFNoZWxsKGQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc2hlbGwuc2V0Qm91bmRzKDAsIDAsIDAsIDApOwotCQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJcmV0dXJuIHNoZWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICgoc2hlbGwgIT0gbnVsbCkgJiYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQlzaGVsbC5jbG9zZSgpOwotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlmb3IgKERpYWdyYW1NYW5hZ2VyIG1nciA6IGRpYWdyYW1NYW5hZ2VycykgewotCQkJbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogc2F2ZSB0aGUgZWxlbWVudCBkaWFncmFtIGltYWdlIGFuZCByZXR1cm5zIHRoZSBpbWFnZSBmaWxlIHVybC4KLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEBwYXJhbSBpbWdQYXRoCi0JICogQHBhcmFtIGRpYWdyYW1UeXBlCi0JICogQHBhcmFtIGZpbHRlcgotCSAqICAgICAgICAgICAgSUZpbHRlcgotCSAqIEBwYXJhbSBzdXAKLQkgKiAgICAgICAgICAgIFN1cHByZXNzaW9uCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGltYWdlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHB1Ymxpc2hpbmcgZGlyCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5JQWN0aXZpdHlEaWFncmFtU2VydmljZSNzYXZlRGlhZ3JhbShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXIsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUluZm8gc2F2ZURpYWdyYW0oZmluYWwgT2JqZWN0IHdyYXBwZXIsIGZpbmFsIFN0cmluZyBpbWdQYXRoLCAKLQkJCWZpbmFsIFN0cmluZyBkaWFncmFtVHlwZSwgZmluYWwgSUZpbHRlciBmaWx0ZXIsCi0JCQlmaW5hbCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJLy8gaW5pdGlhbGl6ZSB0aGUgZGlhZ3JhbUluZm8KLQkJZGlhZ3JhbUluZm8gPSBudWxsOwotCi0JCS8vIGdyYWIgdGhlIFVJIHRocmVhZCB0byBhdm9pZCB0aHJlYWQgYWNjZXNzIGVycm9yCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlfX2ludGVybmFsX3NhdmVEaWFncmFtKHdyYXBwZXIsIGltZ1BhdGgsIGRpYWdyYW1UeXBlLCBmaWx0ZXIsIHN1cCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBkaWFncmFtSW5mbzsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzVXNlckRlZmluZWREaWFncmFtKEFjdGl2aXR5IGUsIFN0cmluZyBpbWdQYXRoLCBpbnQgdHlwZSkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkvLyBpZiB0aGVyZSBpcyBhIHVzZXIgZGVmaW5lZCBkaWFncmFtLCB1c2UgaXQKLQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbyBpbmZvID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8oCi0JCQkJKEFjdGl2aXR5KSBlKTsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlpZiAoaW5mby5jYW5QdWJsaXNoQURJbWFnZSgpKSB7Ci0JCQkJcmV0dXJuIChpbmZvLmdldEFjdGl2aXR5RGlhZ3JhbSgpICE9IG51bGwpCi0JCQkJCQkmJiBpbmZvLmNhblB1Ymxpc2hBREltYWdlKCk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCWlmIChpbmZvLmNhblB1Ymxpc2hBRERJbWFnZSgpKSB7Ci0JCQkJcmV0dXJuIChpbmZvLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpICE9IG51bGwpCi0JCQkJCQkmJiBpbmZvLmNhblB1Ymxpc2hBRERJbWFnZSgpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCWlmIChpbmZvLmNhblB1Ymxpc2hXUERJbWFnZSgpKSB7Ci0JCQkJcmV0dXJuIChpbmZvLmdldFdQRERpYWdyYW0oKSAhPSBudWxsKQotCQkJCQkJJiYgaW5mby5jYW5QdWJsaXNoV1BESW1hZ2UoKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIF9faW50ZXJuYWxfc2F2ZURpYWdyYW0oT2JqZWN0IHdyYXBwZXIsIGZpbmFsIFN0cmluZyBpbWdQYXRoLAotCQkJU3RyaW5nIGRpYWdyYW1UeXBlLCBJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCWlmIChzdXAuaXNTdXBwcmVzc2VkKHdyYXBwZXIpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gRGlhZ3JhbUluZm8gZGlhZ3JhbUluZm8gPSBudWxsOwotCi0JCWludCB0eXBlID0gZ2V0SW50VHlwZShkaWFncmFtVHlwZSk7Ci0JCWlmICh0eXBlIDwgMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCV9pbnRlcm5hbF9nZW5lcmF0ZUltYWdlKHdyYXBwZXIsIGltZ1BhdGgsIHR5cGUsIGZpbHRlciwgc3VwLCB0cnVlLCB0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRpYWdyYW0gSlBFRyBmb3IgZ2l2ZW4gQWN0aXZpdHkgYW5kICAKLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEBwYXJhbSBpbWdQYXRoCi0JICogQHBhcmFtIGRpYWdyYW1UeXBlCi0JICogQHBhcmFtIGZpbHRlcgotCSAqIEBwYXJhbSBzdXAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZURpYWdyYW1JbWFnZShmaW5hbCBPYmplY3Qgd3JhcHBlciwgZmluYWwgU3RyaW5nIGltZ1BhdGgsIAotCQkJZmluYWwgaW50IGRpYWdyYW1UeXBlLCBmaW5hbCBJRmlsdGVyIGZpbHRlciwKLQkJCWZpbmFsIFN1cHByZXNzaW9uIHN1cCwgZmluYWwgYm9vbGVhbiByZWFsaXplZERpYWdyYW0pewotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJX2ludGVybmFsX2dlbmVyYXRlSW1hZ2Uod3JhcHBlciwgaW1nUGF0aCwgZGlhZ3JhbVR5cGUsIGZpbHRlciwgc3VwLCBmYWxzZSwgcmVhbGl6ZWREaWFncmFtKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBpbWdQYXRoOwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2QgdG8gY3JlYXRlIGEgZGlhZ3JhbSB2aWV3ZXIgYW5kIGdlbmVyYXRlIGltYWdlIGFuZCBzYXZlcyB0aGUgaW1hZ2UuCi0JICogCi0JICogCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKiBAcGFyYW0gaW1nUGF0aAotCSAqIEBwYXJhbSBkaWFncmFtVHlwZQotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiBAcGFyYW0gc3VwCi0JICogQHBhcmFtIGNhbGN1bGF0ZURpYWdyYW1JbmZvCi0JICovCi0JcHJpdmF0ZSB2b2lkIF9pbnRlcm5hbF9nZW5lcmF0ZUltYWdlKE9iamVjdCB3cmFwcGVyLCBmaW5hbCBTdHJpbmcgaW1nUGF0aCwKLQkJCWludCB0eXBlLCBJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwLCBib29sZWFuIGNhbGN1bGF0ZURpYWdyYW1JbmZvLAotCQkJYm9vbGVhbiByZWFsaXplZERpYWdyYW0pewotCQkKLQkJZXhpc3QgPSB0cnVlOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCQotCQlPYmplY3QgbyA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlpZiAoIShvIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlBY3Rpdml0eSBlID0gKEFjdGl2aXR5KSBvOwotCQkKLQkJQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IG51bGw7Ci0KLQkJLy8ga2VlcCB0aGUgZGlydHkgZmxhZyBhbmQgcmVzZXQgYmFjayB0byBhdm9pZCBtYWtlIHRoZSBsaWJyYXJ5IGRpcnR5Ci0JCWJvb2xlYW4gZGlydHlGbGFnID0gZS5lUmVzb3VyY2UoKS5pc01vZGlmaWVkKCk7Ci0KLQkJdHJ5IHsKLQkJCQotCQkJT2JqZWN0IG9iamVjdCA9IGNhbkNyZWF0ZUltYWdlKHdyYXBwZXIsIGltZ1BhdGgsIHR5cGUsIGZpbHRlciwgc3VwKTsKLQkJCWlmKHJlYWxpemVkRGlhZ3JhbSAmJiBvYmplY3QgPT0gbnVsbCl7Ci0JCQkJcmV0dXJuOwotCQkJfWVsc2V7Ci0JCQkJd3JhcHBlciA9IG9iamVjdDsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJdmlld2VyID0gZ2V0RGlhZ3JhbVZpZXdlcih0eXBlLCB3cmFwcGVyKTsKLQkJCQlpZihjb25maWcgIT0gbnVsbCl7Ci0JCQkJCXZpZXdlci5zZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQkJfQotCQkJCUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydCA9IHZpZXdlci5sb2FkRGlhZ3JhbSh3cmFwcGVyLCAhZXhpc3QsIGZpbHRlciwgc3VwKTsKLQkJCQlpZihkaWFncmFtRWRpdFBhcnQgPT0gbnVsbCl7Ci0JCQkJCWlmKGRlYnVnKXsKLQkJCQkJCURpYWdyYW1VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkuCi0JCQkJCQlsb2dFcnJvcigiUHVibGlzaGluZzogRGlhZ3JhbUltYWdlU2VydmljZSB2aWV3ZXIgRWRpdFBhcnQgaXMgbnVsbDogIit3cmFwcGVyKTsJLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9ZWxzZXsKLQkJCQkJaWYoZGlhZ3JhbUVkaXRQYXJ0LmdldENoaWxkcmVuKCkuaXNFbXB0eSgpKQotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZihjYWxjdWxhdGVEaWFncmFtSW5mbyl7Ci0JCQkJCWRpYWdyYW1JbmZvID0gdmlld2VyLmdldERpYWdyYW1JbmZvKCk7Ci0JCQkJfQotCQkJCWltYWdlID0gdmlld2VyLmNyZWF0ZURpYWdyYW1JbWFnZSgpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJCS8vIHNhdmUgdGhlIGltYWdlCi0JCQkJCUZpbGUgZiA9IG5ldyBGaWxlKHB1YkRpciwgaW1nUGF0aCk7Ci0KLQkJCQkJLy8gbWFrZSBzdXJlIHRoZSBmaWxlIGlzIGNyZWF0ZWQgb3RoZXJ3aXNlIGV4Y2VwdGlvbgotCQkJCQlGaWxlIHBhcmVudCA9IGYuZ2V0UGFyZW50RmlsZSgpOwotCQkJCQlpZiAoIXBhcmVudC5leGlzdHMoKSkgewotCQkJCQkJcGFyZW50Lm1rZGlycygpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKCFmLmV4aXN0cygpKSB7Ci0JCQkJCQlmLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCQkJfQotCQkJCQlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKLQkJCQkJSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCQkJCWxvYWRlci5kYXRhID0gbmV3IEltYWdlRGF0YVtdIHsgaW1hZ2UuZ2V0SW1hZ2VEYXRhKCkgfTsKLQkJCQkJbG9hZGVyLnNhdmUob3MsIFNXVC5JTUFHRV9KUEVHKTsJCQkJCQotCQkJCX0gZWxzZSB7Ci0JCQkJCURpYWdyYW1VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQkJIkZhaWxlZCB0byBjcmVhdGUgZGlhZ3JhbSBpbWFnZSBmb3IiICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKGNhbGN1bGF0ZURpYWdyYW1JbmZvICYmIGRpYWdyYW1JbmZvICE9IG51bGwgJiYgIWRpYWdyYW1JbmZvLmlzRW1wdHkoKSkgewotCQkJCQlkaWFncmFtSW5mby5zZXRJbWFnZUZpbGVQYXRoKGltZ1BhdGgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZTEpIHsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQkJLy8gZGVsZXRlIHRoZSBuZXdseSBjcmVhdGVkIGRpYWdyYW0gZnJvbSB0aGUgbGlicmFyeQotCQkJaWYgKCFleGlzdCkgewotCQkJCURpYWdyYW0gZCA9IGdldERpYWdyYW0oZSwgdHlwZSk7Ci0JCQkJaWYgKGQgIT0gbnVsbCkgewotCQkJCQlEaWFncmFtSGVscGVyLmRlbGV0ZURpYWdyYW0oZCwgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJFeGNlcHRpb24iK2UpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCS8vIHJlc3RvcmUgdGhlIGRpcnR5IGZsYWcKLQkJCQllLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKGRpcnR5RmxhZyk7Ci0KLQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQkJdmlld2VyLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZTEpIHsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQotCXByaXZhdGUgT2JqZWN0IGNhbkNyZWF0ZUltYWdlKE9iamVjdCB3cmFwcGVyLCBmaW5hbCBTdHJpbmcgaW1nUGF0aCwKLQkJCWludCB0eXBlLCBJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pewotCi0JCU9iamVjdCBvID0gVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCWlmICghKG8gaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXRyeXsKLQkJCS8vTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpbzsKLQkJCUFjdGl2aXR5IGUgPSAoQWN0aXZpdHkpIG87Ci0JCQlpZiAoaGFzVXNlckRlZmluZWREaWFncmFtKChBY3Rpdml0eSkgZSwgaW1nUGF0aCwgdHlwZSkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCS8vIENoZWNrIGRpYWdyYW0gZXhpc3RzLCBkb24ndCBnZW5lcmF0ZSBmb3Igc3VwcHJlc3NlZC4KLQkJCURpYWdyYW0gZCA9IGdldERpYWdyYW0oZSwgdHlwZSk7Ci0KLQkJCS8vIENoZWNrIHB1Ymxpc2hpbmcgb3B0aW9ucy4KLQkJCWV4aXN0ID0gKGQgIT0gbnVsbCk7Ci0JCQkKLQkJCWlmIChpc0ZvclhNTEV4cG9ydCgpKSB7Ci0JCQkJaWYgKGV4aXN0ICYmIGNhblB1Ymxpc2hEaWFncmFtKGQsZSkpIHsKLQkJCQkJcmV0dXJuIGU7Ci0JCQkJfQkJCQkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJaWYgKGV4aXN0KSB7Ci0JCQkJCi0JCQkJaWYoIWNhblB1Ymxpc2hEaWFncmFtKGQsZSkpIHJldHVybiBudWxsOwotCQkJCQotCQkJCWlmICh0eXBlID09IElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNICkgewotCQkJCQkKLQkJCQkJLy8gSWYgYW4gZXh0ZW5zaW9uIGhhcyBpdHMgb3duIGRpYWdyYW0uIEJhc2UgaXMgcmVwbGFjZWQgb3IKLQkJCQkJLy8gY29udHJpYnV0ZWQuZXh0ZW5zaW9uIGRpYWdyYW0gc2hvd3MgcmVhbGl6ZWQgZWxlbWVudCBpbiB1bmRlZmluZWQKLQkJCQkJLy8gbG9jYXRpb24uIEluIHB1Ymxpc2hpbmcgZG9uJ3QgZGlzcGxheSBleHRlbnNpb24gZGlhZ3JhbSBldmVuIGlmIGl0IGhhcwotCQkJCQkvLyBpdHMgb3duIGRpYWdyYW0gaWYgcmVhbGl6ZWQgZWxlbWVudHMgYXJlIGNvbWluZyBpbiB0aHJvdWdoCi0JCQkJCS8vIHZhcmlhYmlsaXR5LgotCQkJCQlpZiAoIGlzQnJlYWtkb3duRWxlbWVudHNSZXBsYWNlZChlLCBmaWx0ZXIpICkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQkKLQkJCQkJLy8gaWYgdGhlIG9iamVjdCBpcyBhIHdyYXBwZXIsIHRoZSBkaWFncmFtIGlzIGZyb20gaXQncyBiYXNlLAotCQkJCQkvLyBkb24ndCBzaG93IHRoZSBBRCBpZCB0aGUgcHJlZmVyZW5jZSBpcyBub3Qgc2V0Ci0JCQkJCWlmICggKGUgIT0gd3JhcHBlcikgJiYgIXB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uICkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQkvLyBDaGVjayB2YXJpYWJpbGl0eSBhbmQgYmFzZSdzIHZhcmlhYmlsaXR5LgotLy8JCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBjYWxjdWxhdGVkQmFzZSA9IGNoZWNrVmFyaWFiaWxpdHkoZSwKLS8vCQkJCQkJCWZpbHRlciwgdHlwZSk7Ci0vLwkJCQkJaWYgKGNhbGN1bGF0ZWRCYXNlICE9IG51bGwpIHsKLS8vCQkJCQkJd3JhcHBlciA9IGNhbGN1bGF0ZWRCYXNlOwotLy8JCQkJCX0KLQkJCQkJCi0JCQkJfSBlbHNlIGlmICggdHlwZSA9PSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pIHsKLQkJCQkJaWYgKCAoZSAhPSB3cmFwcGVyKSAmJiAhcHVibGlzaFVuY3JlYXRlZEFERCApIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfSBlbHNlIHsKLQotCQkJCWlmICgodHlwZSA9PSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSkpCi0JCQkJCXJldHVybiBudWxsOwotCi0JCQkJLy8gRm9yIEFjdGl2aXR5IERpYWdyYW0gdW4gb3BlbmVkIGV4dGVuc2lvbiBwdWJsaXNoLgotCQkJCWlmICh0eXBlID09IElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKSB7Ci0JCQkJCS8vIElmIG9wdGlvbiBpcyBub3QgY2hlY2tlZCwgZG9uJ3QgZ2VuZXJhdGUgYSBkaWFncmFtCi0JCQkJCWlmICghcHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24pCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJCQkvLyBJZiBleHRlbnNpb24gaXMgbW9kaWZpZWQgZG9uJ3QgZ2VuZXJhdGUgaXQuCi0JCQkJCWlmICghZS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmlzRW1wdHkoKSkKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkKLQkJCQkJLy8gQ2hlY2sgYW55IGNoaWxkIGlzIHN1cHByZXNzZWQuIAotCQkJCQkvLyBpZiBhbnkgY2hpbGQgaXMgc3VwcHJlc2VkIGRvbid0IGdlbmVyYXRlIGRpYWdyYW0KLQkJCQkJaWYoYW55Q2hpbGRyZW5TdXBwcmVzc2VkKHdyYXBwZXIsIGZpbHRlciwgc3VwcHJlc3Npb24pKSAKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkKLQkJCQkJLy8gQ2hlY2sgdmFyaWFiaWxpdHkgYW5kIGJhc2UncyB2YXJpYWJpbGl0eS4KLQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGNhbGN1bGF0ZWRCYXNlID0gY2hlY2tWYXJpYWJpbGl0eShlLAotCQkJCQkJCWZpbHRlciwgdHlwZSk7Ci0JCQkJCWlmIChjYWxjdWxhdGVkQmFzZSA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXdyYXBwZXIgPSBjYWxjdWxhdGVkQmFzZTsKLQkJCQkJZSA9IChBY3Rpdml0eSkgY2FsY3VsYXRlZEJhc2U7Ci0JCQkJCWV4aXN0ID0gdHJ1ZTsKLQkJCQl9Ci0KLQkJCQlpZiAocHVibGlzaFVuY3JlYXRlZEFERCA9PSBmYWxzZQotCQkJCQkJJiYgdHlwZSA9PSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pIHsKLQkJCQkJYm9vbGVhbiBjb250cmlidXRvcmV4aXN0ID0gZmFsc2U7Ci0JCQkJCS8vIFRoaXMgaXMgbmVlZCwgaWYgY29udHJpYnV0b3IgaGFzIGEgQUREIGRpYWdyYW0sIGJhc2UgZG9uJ3QKLQkJCQkJLy8gYmFzZSBzaG91bGQgZ2VuZXJhdGUgQUREIGluIGJyb3dzaW5nLgotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JCQkJCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIHsKLQkJCQkJCWNvbmZpZyA9ICgoUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGNvbmZpZyA9PSBudWxsKQotCQkJCQkJcmV0dXJuIG51bGw7Ci0KLQkJCQkJLy8gR2V0IGltbWVkaWF0ZSBjb250cmlidXRvcnMgZmlyc3QsIGFuZCBjaGVjayBpbW1lZGlhdGUKLQkJCQkJLy8gY29udHJpYnV0b3JzCi0JCQkJCS8vIGhhdmUgYW55dGhpbmcgZXh0cmEgYnJlYWtkb3duIGVsZW1lbnRzLgotCQkJCQlMaXN0IGxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvbnRyaWJ1dG9ycyhlLCBjb25maWcpOwotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJCQkJCWlmIChpdGVyYXRvciAhPSBudWxsKSB7Ci0JCQkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJCQlPYmplY3QgYWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQlpZiAoYWN0ICE9IG51bGwpIHsKLQkJCQkJCQkJCURpYWdyYW0gZHggPSBnZXREaWFncmFtKChBY3Rpdml0eSlhY3QsIHR5cGUpOwotCQkJCQkJCQkJaWYgKGR4ICE9IG51bGwpIHsKLQkJCQkJCQkJCQljb250cmlidXRvcmV4aXN0ID0gdHJ1ZTsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIWNvbnRyaWJ1dG9yZXhpc3QpCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX1jYXRjaChFeGNlcHRpb24gZSl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gd3JhcHBlcjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuUHVibGlzaERpYWdyYW0oRGlhZ3JhbSBkaWFncmFtLCBBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlzd2l0Y2ggKERpYWdyYW1IZWxwZXIuZ2V0RGlhZ3JhbVR5cGUoZGlhZ3JhbSkpIHsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCWlmIChEaWFncmFtT3B0aW9ucy5pc1B1Ymxpc2hBRChhY3Rpdml0eSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCWlmIChEaWFncmFtT3B0aW9ucy5pc1B1Ymxpc2hBREQoYWN0aXZpdHkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCWlmIChEaWFncmFtT3B0aW9ucy5pc1B1Ymxpc2hXUEREKGFjdGl2aXR5KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gYW55Q2hpbGRyZW5TdXBwcmVzc2VkKE9iamVjdCB3cmFwcGVyLCBJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKHdyYXBwZXIsIGZpbHRlcik7Ci0JCWJvb2xlYW4gb2xkUm9sbGVkVXAgPSBmYWxzZTsKLQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpYWRhcHRlcjsKLQkJCW9sZFJvbGxlZFVwID0gaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCWl0ZW1Qcm92aWRlci5iYXNpY1NldFJvbGxlZFVwKGZhbHNlKTsKLQkJfQotCQllbHNlIGlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpewotCQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpYWRhcHRlcjsKLQkJCW9sZFJvbGxlZFVwID0gaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCWl0ZW1Qcm92aWRlci5zZXRSb2xsZWRVcChmYWxzZSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQkvLyBmaWx0ZXIgb3V0IHRoZSBzdXBwcmVzc2VkIGVsZW1lbnRzCi0JCQkvLwotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZWxlbWVudCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYoc3VwcHJlc3Npb24uaXNTdXBwcmVzc2VkKGNoaWxkKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyByZXN0b3JlIHRoZSByb2xsZWQtdXAgZmxhZwotCQkJLy8KLQkJCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkoKElCU0l0ZW1Qcm92aWRlcilhZGFwdGVyKS5zZXRSb2xsZWRVcChvbGRSb2xsZWRVcCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogTW92ZWQgY29kZSBmcm9tIGdldENoaWxkcmVuLiBnZXRBZGFwdGVyKCkgd2lsbCByZXR1cm4gQWRhcHRlciwKLQkgKiB3aGljaCB3aWxsIGFsbG93IHVzIHRvIGZpbmQgaXRlbXByb3ZpZGVyIGZvciB0aGUgY2hpbGRyZW4uIAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBnZXRBZGFwdGVyKE9iamVjdCB3cmFwcGVyLCBJRmlsdGVyIGZpbHRlcil7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gbnVsbDsKLQkJaWYgKHdyYXBwZXIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJYWRhcHRlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil3cmFwcGVyOwotCQl9IGVsc2UgewotCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGdldEFkYXB0ZXJGYWN0b3J5KGZpbHRlcikuYWRhcHQoCi0JCQkJCXdyYXBwZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCQotCUFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKXsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfSBlbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQWRhcHRlckZhY3RvcnlGaWx0ZXIpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpICgoSUFkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCS5nZXRXQlNBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0JCi0JcHJpdmF0ZSBWYXJpYWJpbGl0eUVsZW1lbnQgY2hlY2tWYXJpYWJpbGl0eShWYXJpYWJpbGl0eUVsZW1lbnQgZSwgSUZpbHRlciBmaWx0ZXIsCi0JCQlpbnQgdHlwZSkgewotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgewotCQkJY29uZmlnID0gKChQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJfQotCQlpZiAoY29uZmlnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBHZXQgaW1tZWRpYXRlIGNvbnRyaWJ1dG9ycyBmaXJzdCwgYW5kIGNoZWNrIGltbWVkaWF0ZSBjb250cmlidXRvcnMKLQkJLy8gaGF2ZSBhbnl0aGluZyBleHRyYSBicmVha2Rvd24gZWxlbWVudHMuCi0JCUxpc3QgbGlzdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29udHJpYnV0b3JzKGUsIGNvbmZpZyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWlmICghKChBY3Rpdml0eSkgbmV4dCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJLy8gR2V0IGFsbCBDb250cmlidXRvcnMgZnJvbSBwYXJlbnQgY2hhaW4gYW5kIGNvbnRyaWJ1dG9yIGNoYWluIGZvciB0aGUKLQkJLy8gZWxlbWVudCBlLgotCQlWYXJpYWJpbGl0eUluZm8gZUluZm8gPSAoKFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyKQotCQkJCS5nZXRWYXJpYWJpbGl0eUluZm8oKFZhcmlhYmlsaXR5RWxlbWVudCkgZSk7Ci0JCUxpc3QgY29udHJpYnV0b3JzID0gZUluZm8uZ2V0Q29udHJpYnV0b3JzKCk7Ci0KLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCWlmICh2ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJQWN0aXZpdHkgcmVwbGFjZXIgPSAoQWN0aXZpdHkpIENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UmVwbGFjZXIodmUsCi0JCQkJY29uZmlnKTsKLQkJaWYgKHJlcGxhY2VyICE9IG51bGwpIHsKLQkJCXZlID0gcmVwbGFjZXI7Ci0JCQlEaWFncmFtIHJlcGxhY2VyRGlhZ3JhbSA9IGdldERpYWdyYW0ocmVwbGFjZXIsIHR5cGUpOwotCQkJaWYgKHJlcGxhY2VyRGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlcGxhY2VyOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCURpYWdyYW0gYmFzZURpYWdyYW0gPSBnZXREaWFncmFtKChBY3Rpdml0eSkgdmUsIHR5cGUpOwotCQkJaWYgKGJhc2VEaWFncmFtICE9IG51bGwpIHsKLQkJCQkKLQkJCQkvLyBDaGVjayBmaXJzdCBpZiBiYXNlRGlhZ3JhbSBpcyBzdXBwcmVzc2VkLgotCQkJCWlmKEJyaWRnZUhlbHBlci5pc1N1cHByZXNzZWQoYmFzZURpYWdyYW0pKSByZXR1cm4gbnVsbDsKLQkJCQkKLQkJCQkvLyBGaW5kIHRoZSBjb250cmlidXRvcnMgb2YgQmFzZQotCQkJCVZhcmlhYmlsaXR5SW5mbyB2ZUluZm8gPSAoKFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyKQotCQkJCQkJLmdldFZhcmlhYmlsaXR5SW5mbygoVmFyaWFiaWxpdHlFbGVtZW50KSB2ZSk7Ci0JCQkJTGlzdCB2ZUNvbnRyaWJ1dG9ycyA9IHZlSW5mby5nZXRDb250cmlidXRvcnMoKTsKLQkJCQlpZiAoY29udHJpYnV0b3JzLnNpemUoKSAhPSB2ZUNvbnRyaWJ1dG9ycy5zaXplKCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbnRyaWJ1dG9ycy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmICghdmVDb250cmlidXRvcnMuY29udGFpbnMobmV4dCkpIHsKLQkJCQkJCQlpZiAoISgoQWN0aXZpdHkpIG5leHQpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkKLQkJCQkJCQkJCS5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiB2ZTsKLQkJCQkKLQkJCX1lbHNlewotCQkJCS8vIElmIG5vIGJhc2UgZGlhZ3JhbSwgY2hlY2sgYmFzZSBvZiBiYXNlIGhhZCBhbnkgZGlhZ3JhbS4KLQkJCQlyZXR1cm4gY2hlY2tWYXJpYWJpbGl0eSh2ZSwgZmlsdGVyLCB0eXBlKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIFZhcmlhYmlsaXR5RWxlbWVudCBjaGVja1ZhcmlhYmlsaXR5KFZhcmlhYmlsaXR5RWxlbWVudCBlLCBJRmlsdGVyIGZpbHRlciwKLQkJCWludCB0eXBlLCBib29sZWFuIGNoZWNrVUREKSB7Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvIHVkZEluZm8gPSBudWxsOwotCQkKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgewotCQkJY29uZmlnID0gKChQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJfQotCQlpZiAoY29uZmlnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBHZXQgaW1tZWRpYXRlIGNvbnRyaWJ1dG9ycyBmaXJzdCwgYW5kIGNoZWNrIGltbWVkaWF0ZSBjb250cmlidXRvcnMKLQkJLy8gaGF2ZSBhbnl0aGluZyBleHRyYSBicmVha2Rvd24gZWxlbWVudHMuCi0JCUxpc3QgbGlzdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29udHJpYnV0b3JzKGUsIGNvbmZpZyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWlmICghKChBY3Rpdml0eSkgbmV4dCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJLy8gR2V0IGFsbCBDb250cmlidXRvcnMgZnJvbSBwYXJlbnQgY2hhaW4gYW5kIGNvbnRyaWJ1dG9yIGNoYWluIGZvciB0aGUKLQkJLy8gZWxlbWVudCBlLgotCQlWYXJpYWJpbGl0eUluZm8gZUluZm8gPSAoKFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyKQotCQkJCS5nZXRWYXJpYWJpbGl0eUluZm8oKFZhcmlhYmlsaXR5RWxlbWVudCkgZSk7Ci0JCUxpc3QgY29udHJpYnV0b3JzID0gZUluZm8uZ2V0Q29udHJpYnV0b3JzKCk7Ci0KLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCWlmICh2ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJQWN0aXZpdHkgcmVwbGFjZXIgPSAoQWN0aXZpdHkpIENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UmVwbGFjZXIodmUsCi0JCQkJY29uZmlnKTsKLQkJaWYgKHJlcGxhY2VyICE9IG51bGwpIHsKLQkJCXZlID0gcmVwbGFjZXI7Ci0JCQlEaWFncmFtIHJlcGxhY2VyRGlhZ3JhbSA9IGdldERpYWdyYW0ocmVwbGFjZXIsIHR5cGUpOwotCQkJaWYoY2hlY2tVREQpewotCQkJCXVkZEluZm8gPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbyhyZXBsYWNlcik7Ci0JCQkJaWYodWRkSW5mby5jYW5QdWJsaXNoQURJbWFnZSgpICYmIHVkZEluZm8uZ2V0QWN0aXZpdHlEaWFncmFtKCkgIT0gbnVsbCl7Ci0JCQkJCXJldHVybiByZXBsYWNlcjsKLQkJCQl9Ci0JCQl9ZWxzZXsKLQkJCQlpZiAocmVwbGFjZXJEaWFncmFtICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHJlcGxhY2VyOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgewotCQkJCi0JCQlEaWFncmFtIGJhc2VEaWFncmFtID0gbnVsbDsKLQkJCWlmKGNoZWNrVUREKXsKLQkJCQl1ZGRJbmZvID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8oKEFjdGl2aXR5KXZlKTsKLQkJCX1lbHNlewotCQkJCWJhc2VEaWFncmFtID0gZ2V0RGlhZ3JhbSgoQWN0aXZpdHkpIHZlLCB0eXBlKTsKLQkJCX0KLQkJCQotCQkJaWYgKGJhc2VEaWFncmFtICE9IG51bGwgfHwgKHVkZEluZm8gIT0gbnVsbCAmJiB1ZGRJbmZvLmNhblB1Ymxpc2hBREltYWdlKCkgJiYgdWRkSW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKSAhPSBudWxsKSkgewotCQkJCQotCQkJCS8vIENoZWNrIGZpcnN0IGlmIGJhc2VEaWFncmFtIGlzIHN1cHByZXNzZWQuCi0vLwkJCQlpZihCcmlkZ2VIZWxwZXIuaXNTdXBwcmVzc2VkKGJhc2VEaWFncmFtKSkgcmV0dXJuIG51bGw7Ci0JCQkJCi0JCQkJLy8gRmluZCB0aGUgY29udHJpYnV0b3JzIG9mIEJhc2UKLQkJCQlWYXJpYWJpbGl0eUluZm8gdmVJbmZvID0gKChQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUluZm8oKFZhcmlhYmlsaXR5RWxlbWVudCkgdmUpOwotCQkJCUxpc3QgdmVDb250cmlidXRvcnMgPSB2ZUluZm8uZ2V0Q29udHJpYnV0b3JzKCk7Ci0JCQkJaWYgKGNvbnRyaWJ1dG9ycy5zaXplKCkgIT0gdmVDb250cmlidXRvcnMuc2l6ZSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb250cmlidXRvcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAoIXZlQ29udHJpYnV0b3JzLmNvbnRhaW5zKG5leHQpKSB7Ci0JCQkJCQkJaWYgKCEoKEFjdGl2aXR5KSBuZXh0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCQkJCQkuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gdmU7Ci0JCQkJCi0JCQl9ZWxzZXsKLQkJCQkvLyBJZiBubyBiYXNlIGRpYWdyYW0sIGNoZWNrIGJhc2Ugb2YgYmFzZSBoYWQgYW55IGRpYWdyYW0uCi0JCQkJcmV0dXJuIGNoZWNrVmFyaWFiaWxpdHkodmUsIGZpbHRlciwgdHlwZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCi0JLyoqCi0JICogU2V0IHRoZSB3aW5kb3cncyBwcmVmZXJlbmNlIGF0dHJpYnV0ZSBmb3IgQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0uCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaGVkVW5DcmVhdGVkQUREKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLnB1Ymxpc2hVbmNyZWF0ZWRBREQgPSBmbGFnOwotCX0KLQkvKioKLQkgKiBTZXQgdGhlIHdpbmRvdydzIHByZWZlcmVuY2UgYXR0cmlidXRlIGZvciBBY2l0aXZ5dCBEaWFncmFtCi0JICogCi0JICovCi0JCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oYm9vbGVhbiBmbGFnKXsKLQkJdGhpcy5wdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbiA9IGZsYWc7Ci0JfQotCi0vLwlwcml2YXRlIERpYWdyYW1HZW5lcmF0b3IgY3JlYXRlRGlhZ3JhbUltYWdlKERpYWdyYW1FZGl0UGFydCBkaWFncmFtRVAsIEltYWdlRmlsZUZvcm1hdCBmaWxlRm9ybWF0KQotLy8JdGhyb3dzIENvcmVFeGNlcHRpb24gewotLy8JCUNvcHlUb0ltYWdlVXRpbCB1dGlsID0gbmV3IENvcHlUb0ltYWdlVXRpbCgpOwotLy8JCURpYWdyYW1HZW5lcmF0b3IgZEdlbiA9IHV0aWwuY29weVRvSW1hZ2UoZGlhZ3JhbUVQLCBuZXcgUGF0aChwdWJEaXIuZ2V0UGF0aCgpKSwgZmlsZUZvcm1hdCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0vLwkJZEdlbi5jcmVhdGVBV1RJbWFnZUZvckRpYWdyYW0oKTsKLS8vCQlyZXR1cm4gZEdlbjsKLS8vCX0KLQkKLQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKEFjdGl2aXR5IGUsIGludCB0eXBlKXsKLQkJRGlhZ3JhbU1hbmFnZXIgZE1nciA9IGdldERpYWdyYW1NYW5hZ2VyKGUpOwotCQlEaWFncmFtIGRpYWdyYW0gPSBudWxsOwotCQlpZiAoZE1nciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUxpc3Q8RGlhZ3JhbT4gbGlzdCA9IGRNZ3IuZ2V0RGlhZ3JhbXMoZSwgdHlwZSk7Ci0JCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQlkaWFncmFtID0gKERpYWdyYW0pIGxpc3QuZ2V0KDApOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCURpYWdyYW1VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQkiRXJyb3IgaW4gZ2V0RGlhZ3JhbSgpIiArIGV4LmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0JCi0JcHJpdmF0ZSBEaWFncmFtTWFuYWdlciBnZXREaWFncmFtTWFuYWdlcihBY3Rpdml0eSBlKSB7Ci0JCURpYWdyYW1NYW5hZ2VyIG1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlKSwgdGhpcyk7Ci0JCWRpYWdyYW1NYW5hZ2VycyAuYWRkKG1ncik7Ci0JCXJldHVybiBtZ3I7Ci0JfQotCQotCS8qKgotCSAqIGdldHMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uICAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlnKCkgewotCQlyZXR1cm4gY29uZmlnOwotCX0KLQkvKioKLQkgKiBzZXRzIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uZmlnKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQkKLQotCS8qKgotCSAqIENoZWNrcyBhbnkgYnJlYWtkb3duZWxlbWVudHMgb2YgYW4gQWN0aXZpdHkgaGFzIGEgcmVwbGFjZXIuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgICAgVmFyaWFiaWxpdHlFbGVtZW50IHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZyAKLQkgKiAJCQkJTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gVmFyaWFiaWxpdHlFbGVtZW50IHRoZSByZXBsYWNlciBpZiB0aGVyZSBpcyBvbmUgYW5kIE9OTFkgb25lLAotCSAqICAgICAgICAgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNCcmVha2Rvd25FbGVtZW50c1JlcGxhY2VkKEFjdGl2aXR5IGFjdGl2aXR5LAotCQkJSUZpbHRlciBmaWx0ZXIpIHsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElNZXRob2RDb25maWd1cmF0aW9uUHJvdmlkZXIpIHsKLQkJCWNvbmZpZyA9ICgoSU1ldGhvZENvbmZpZ3VyYXRpb25Qcm92aWRlcikgZmlsdGVyKQotCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQl9Ci0JCWlmIChjb25maWcgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlpZihDb25maWd1cmF0aW9uSGVscGVyLmdldFJlcGxhY2VyKChBY3Rpdml0eSllbGVtZW50LCBjb25maWcpICE9IG51bGwpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogTWV0aG9kIHRvIGdldCBhIERpYWdyYW1WaWV3ZXIgZm9yIGdpdmVuIGFjdGl2aXR5LiAgCi0JICogV2l0aG91dCBkb2luZyByZWFsaXphdGlvbiBhbmQgZG9lc24ndCBjaGVjayBmb3IgZGlhZ3JhbSBleGlzdHMgb3Igbm90LiAKLQkgKi8KLQkKLQlwdWJsaWMgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIGdldERpYWdyYW1WaWV3ZXIoZmluYWwgT2JqZWN0IHdyYXBwZXIsCi0JCQlmaW5hbCBpbnQgdHlwZSwgZmluYWwgSUZpbHRlciBmaWx0ZXIsCi0JCQlmaW5hbCBTdXBwcmVzc2lvbiBzdXApewotCQlPYmplY3QgbyA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlpZiAoIShvIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUFjdGl2aXR5IGUgPSAoQWN0aXZpdHkpIG87Ci0JCQotCQlBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQkJaWYgKHR5cGUgPCAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQl2aWV3ZXIgPSBnZXREaWFncmFtVmlld2VyKHR5cGUsIHdyYXBwZXIpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQkKLQlwdWJsaWMgQWN0aXZpdHkgZ2V0UmVhbGl6ZWRGb3JVbm1vZGlmaWVkKE9iamVjdCB3cmFwcGVyLCBJRmlsdGVyIGZpbHRlciwgCi0JCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbil7Ci0JCUFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KVRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlpZiAoIGFjdGl2aXR5ID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJaWYgKCFwdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbikKLQkJCXJldHVybiBudWxsOwotCQkvLyBJZiBleHRlbnNpb24gaXMgbW9kaWZpZWQgZG9uJ3QgZ2VuZXJhdGUgaXQuCi0JCWlmICghYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCS8vIENoZWNrIGFueSBjaGlsZCBpcyBzdXBwcmVzc2VkLiAKLQkJLy8gaWYgYW55IGNoaWxkIGlzIHN1cHByZXNlZCBkb24ndCBnZW5lcmF0ZSBkaWFncmFtCi0JCWlmKGFueUNoaWxkcmVuU3VwcHJlc3NlZChhY3Rpdml0eSwgZmlsdGVyLCBzdXBwcmVzc2lvbikpIAotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQkvLyBDaGVjayB2YXJpYWJpbGl0eSBhbmQgYmFzZSdzIHZhcmlhYmlsaXR5LgotCQlWYXJpYWJpbGl0eUVsZW1lbnQgY2FsY3VsYXRlZEJhc2UgPSBjaGVja1ZhcmlhYmlsaXR5KGFjdGl2aXR5LAotCQkJCWZpbHRlciwgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0sIHRydWUpOwotCQlpZiAoY2FsY3VsYXRlZEJhc2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQl3cmFwcGVyID0gY2FsY3VsYXRlZEJhc2U7Ci0JCXJldHVybiAoQWN0aXZpdHkpd3JhcHBlcjsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHB1YkRpcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1YkRpcihGaWxlIHB1YkRpcikgewotCQl0aGlzLnB1YkRpciA9IHB1YkRpcjsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzRm9yWE1MRXhwb3J0KCkgewotCQlyZXR1cm4gZm9yWE1MRXhwb3J0OwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZm9yWE1MRXhwb3J0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9yWE1MRXhwb3J0KGJvb2xlYW4gZm9yWE1MRXhwb3J0KSB7Ci0JCXRoaXMuZm9yWE1MRXhwb3J0ID0gZm9yWE1MRXhwb3J0OwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvc2VydmljZS9EaWFncmFtVUlTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvc2VydmljZS9EaWFncmFtVUlTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNGEzYzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvRGlhZ3JhbVVJU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd05hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkRlY2lzaW9uTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRm9ya05vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkluaXRpYWxOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Jbml0aWFsTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkpvaW5Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5NZXJnZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLk1lcmdlTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuRGlhZ3JhbVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5WaWV3U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RmluYWxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcmFtZXRlck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRGVjaXNpb25Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkZpbmFsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Gb3JrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Jbml0aWFsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Kb2luTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5NZXJnZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQSBVSSBzZXJ2aWNlIGZvciBleHRlcm5hbCBlY29yZSBtYXAgdG8gYWNlc3MgRVBGIERpYWdyYW1zIGFuZCBjcmVhdGluZwotICogZGlhZ3JhbSBlbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBDaGluaCBWbwotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVVJU2VydmljZSBpbXBsZW1lbnRzIElEaWFncmFtVUlTZXJ2aWNlIHsKLQotCXN0YXRpYyBib29sZWFuIGRlYnVnID0gRGlhZ3JhbVVJUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JcHVibGljIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+IG5vZGVUeXBlc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+KCk7Ci0KLQlwdWJsaWMgRGlhZ3JhbVVJU2VydmljZSgpIHsKLQotCQlub2RlVHlwZXNNYXAucHV0KElEaWFncmFtVUlTZXJ2aWNlLkFDVElWSVRZX05PREUsIEFjdGl2aXR5LmNsYXNzKTsKLQkJbm9kZVR5cGVzTWFwLnB1dChJRGlhZ3JhbVVJU2VydmljZS5QSEFTRV9OT0RFLCBQaGFzZS5jbGFzcyk7Ci0JCW5vZGVUeXBlc01hcC5wdXQoSURpYWdyYW1VSVNlcnZpY2UuSVRFUkFUSU9OX05PREUsIEl0ZXJhdGlvbi5jbGFzcyk7Ci0JCW5vZGVUeXBlc01hcC5wdXQoSURpYWdyYW1VSVNlcnZpY2UuVEFTS19ERVNDUklQVE9SX05PREUsCi0JCQkJVGFza0Rlc2NyaXB0b3IuY2xhc3MpOwotCQlub2RlVHlwZXNNYXAucHV0KElEaWFncmFtVUlTZXJ2aWNlLk1JTEVTVE9ORV9OT0RFLCBNaWxlc3RvbmUuY2xhc3MpOwotCQlub2RlVHlwZXNNYXAucHV0KElEaWFncmFtVUlTZXJ2aWNlLklOSVRJQUxfTk9ERSwgSW5pdGlhbE5vZGUuY2xhc3MpOwotCQlub2RlVHlwZXNNYXAucHV0KElEaWFncmFtVUlTZXJ2aWNlLkZJTkFMX05PREUsIEZpbmFsTm9kZS5jbGFzcyk7Ci0JCW5vZGVUeXBlc01hcC5wdXQoSURpYWdyYW1VSVNlcnZpY2UuRk9SS19OT0RFLCBGb3JrTm9kZS5jbGFzcyk7Ci0JCW5vZGVUeXBlc01hcC5wdXQoSURpYWdyYW1VSVNlcnZpY2UuSk9JTl9OT0RFLCBKb2luTm9kZS5jbGFzcyk7Ci0JCW5vZGVUeXBlc01hcC5wdXQoSURpYWdyYW1VSVNlcnZpY2UuTUVSR0VfTk9ERSwgTWVyZ2VOb2RlLmNsYXNzKTsKLQkJbm9kZVR5cGVzTWFwLnB1dChJRGlhZ3JhbVVJU2VydmljZS5ERUNJU0lPTl9OT0RFLCBEZWNpc2lvbk5vZGUuY2xhc3MpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLklEaWFncmFtVUlTZXJ2aWNlI2NyZWF0ZUFjdGl2aXR5RGlhZ3JhbShvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5KQotCSAqLwotCXB1YmxpYyBEaWFncmFtIGNyZWF0ZUFjdGl2aXR5RGlhZ3JhbShBY3Rpdml0eSBhY3Rpdml0eSkgewkKLQkJRU9iamVjdCB1bWxBY3Rpdml0eSA9IFVNTEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eSgpKTsKLQkJaWYgKHVtbEFjdGl2aXR5IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIHsKLQkJCSgob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpdW1sQWN0aXZpdHkpLnNldE5hbWUoYWN0aXZpdHkuZ2V0TmFtZSgpKTsKLQkJfQotCQlpZiAodW1sQWN0aXZpdHkgaW5zdGFuY2VvZiBFTW9kZWxFbGVtZW50KSB7Ci0JCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKChFTW9kZWxFbGVtZW50KSB1bWxBY3Rpdml0eSwgYWN0aXZpdHkpOwotCQl9Ci0JCQotCQkvLyBDcmVhdGUgZGlhZ3JhbQotCQlEaWFncmFtIGRpYWdyYW0gPSBWaWV3U2VydmljZS5jcmVhdGVEaWFncmFtKHVtbEFjdGl2aXR5LCBEaWFncmFtTWFuYWdlci5BRF9raW5kLAotCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQlkaWFncmFtLnNldEVsZW1lbnQodW1sQWN0aXZpdHkpOwotCQlpZiAodW1sQWN0aXZpdHkgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgewotCQkJZGlhZ3JhbS5zZXROYW1lKGFjdGl2aXR5LmdldE5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLklEaWFncmFtVUlTZXJ2aWNlI2NyZWF0ZUVkZ2Uob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXcsCi0JICogICAgICBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3KQotCSAqLwotCXB1YmxpYyBFZGdlIGNyZWF0ZUVkZ2UoRGlhZ3JhbSBkaWFncmFtLCBWaWV3IHNvdXJjZSwgVmlldyB0YXJnZXQsCi0JCQlTdHJpbmcgbGlua05hbWUpIHsKLQkJb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkgcGFyZW50QWN0aXZpdHkgPSBudWxsOwotCQlFT2JqZWN0IG9iaiA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIHsKLQkJCXBhcmVudEFjdGl2aXR5ID0gKG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSBvYmo7Ci0JCX0KLQkJaWYgKHBhcmVudEFjdGl2aXR5ICE9IG51bGwpIHsKLQkJCUNvbnRyb2xGbG93IGZsb3cgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3cpIHBhcmVudEFjdGl2aXR5Ci0JCQkJCS5jcmVhdGVFZGdlKGxpbmtOYW1lID0gKGxpbmtOYW1lICE9IG51bGwpID8gbGlua05hbWUgOiAiIiwJLy8kTk9OLU5MUy0xJAotCQkJCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRyb2xGbG93KCkpOwotCQkJaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHNvdXJjZS5nZXRFbGVtZW50KCkgIT0gbnVsbCAmJiBzb3VyY2UuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKQotCQkJCQlmbG93LnNldFNvdXJjZSgoQWN0aXZpdHlOb2RlKSBzb3VyY2UuZ2V0RWxlbWVudCgpKTsKLQkJCX0KLQkJCWlmICh0YXJnZXQgIT0gbnVsbCkgewotCQkJCWlmICh0YXJnZXQuZ2V0RWxlbWVudCgpICE9IG51bGwgJiYgdGFyZ2V0LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkKLQkJCQkJZmxvdy5zZXRUYXJnZXQoKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0LmdldEVsZW1lbnQoKSk7Ci0JCQl9Ci0JCQlpZiAoZmxvdyBpbnN0YW5jZW9mIENvbnRyb2xGbG93KSB7Ci0JCQkJRWRnZSBlZGdlID0gVmlld1NlcnZpY2UuY3JlYXRlRWRnZShzb3VyY2UsIHRhcmdldCwgZmxvdywKLQkJCQkJCW5ldyBJbnRlZ2VyKENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShlZGdlLCBmbG93LCBuZXcgSW50ZWdlcigKLQkJCQkJCUNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCQotCQkJCWlmIChzb3VyY2UgIT0gbnVsbCkgewotCQkJCQllZGdlLnNldFNvdXJjZShzb3VyY2UpOwkJCQkKLQkJCQl9Ci0JCQkJaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0JCQkJCWVkZ2Uuc2V0VGFyZ2V0KHRhcmdldCk7CQkJCQkKLQkJCQl9Ci0JCQkJcmV0dXJuIGVkZ2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLklEaWFncmFtVUlTZXJ2aWNlI2NyZWF0ZU5vZGUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE5vZGUgY3JlYXRlTm9kZShEaWFncmFtIGRpYWdyYW0sIFN0cmluZyBub2RlVHlwZSwgU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCW9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5IHBhcmVudEFjdGl2aXR5ID0gbnVsbDsKLQkJTm9kZSBub3RhdGlvbk5vZGUgPSBudWxsOwotCQlFT2JqZWN0IG9iaiA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIHsKLQkJCXBhcmVudEFjdGl2aXR5ID0gKG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSBvYmo7Ci0JCX0KLQotCQlpZiAocGFyZW50QWN0aXZpdHkgIT0gbnVsbCkgewotCQkJaWYgKG5vZGVUeXBlID09IElOSVRJQUxfTk9ERSkgewotCQkJCUFjdGl2aXR5Tm9kZSB1bWxOb2RlID0gKEluaXRpYWxOb2RlKSBwYXJlbnRBY3Rpdml0eS5jcmVhdGVOb2RlKAotCQkJCQkJbm9kZU5hbWUgPSAobm9kZU5hbWUgIT0gbnVsbCkgPyBub2RlTmFtZSA6ICIiLAkvLyROT04tTkxTLTEkCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbml0aWFsTm9kZSgpKTsKLQkJCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCQluZXcgSW50ZWdlcihJbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUobm90YXRpb25Ob2RlLCB1bWxOb2RlLCBuZXcgSW50ZWdlcigKLQkJCQkJCUluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfSBlbHNlIGlmIChub2RlVHlwZSA9PSBGSU5BTF9OT0RFKSB7Ci0JCQkJQWN0aXZpdHlOb2RlIHVtbE5vZGUgPSAoQWN0aXZpdHlGaW5hbE5vZGUpIHBhcmVudEFjdGl2aXR5Ci0JCQkJCQkuY3JlYXRlTm9kZShub2RlTmFtZSA9IChub2RlTmFtZSAhPSBudWxsKSA/IG5vZGVOYW1lCi0JCQkJCQkJCTogIiIsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RmluYWxOb2RlKCkpOwkvLyROT04tTkxTLTEkCi0JCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQkJbmV3IEludGVnZXIoQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQkJQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQl9IGVsc2UgaWYgKG5vZGVUeXBlID09IEZPUktfTk9ERSkgewotCQkJCUFjdGl2aXR5Tm9kZSB1bWxOb2RlID0gKEZvcmtOb2RlKSBwYXJlbnRBY3Rpdml0eS5jcmVhdGVOb2RlKAotCQkJCQkJbm9kZU5hbWUgPSAobm9kZU5hbWUgIT0gbnVsbCkgPyBub2RlTmFtZSA6ICIiLAkvLyROT04tTkxTLTEkCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRGb3JrTm9kZSgpKTsKLQkJCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCQluZXcgSW50ZWdlcihGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfSBlbHNlIGlmIChub2RlVHlwZSA9PSBKT0lOX05PREUpIHsKLQkJCQlBY3Rpdml0eU5vZGUgdW1sTm9kZSA9IChKb2luTm9kZSkgcGFyZW50QWN0aXZpdHkuY3JlYXRlTm9kZSgKLQkJCQkJCW5vZGVOYW1lID0gKG5vZGVOYW1lICE9IG51bGwpID8gbm9kZU5hbWUgOiAiIiwJLy8kTk9OLU5MUy0xJAotCQkJCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Sm9pbk5vZGUoKSk7Ci0JCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQkJbmV3IEludGVnZXIoSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCX0gZWxzZSBpZiAobm9kZVR5cGUgPT0gREVDSVNJT05fTk9ERSkgewotCQkJCUFjdGl2aXR5Tm9kZSB1bWxOb2RlID0gKERlY2lzaW9uTm9kZSkgcGFyZW50QWN0aXZpdHkKLQkJCQkJCS5jcmVhdGVOb2RlKG5vZGVOYW1lID0gKG5vZGVOYW1lICE9IG51bGwpID8gbm9kZU5hbWUKLQkJCQkJCQkJOiAiIiwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVjaXNpb25Ob2RlKCkpOwkvLyROT04tTkxTLTEkCi0JCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQkJbmV3IEludGVnZXIoRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQkJRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfSBlbHNlIGlmIChub2RlVHlwZSA9PSBNRVJHRV9OT0RFKSB7Ci0JCQkJQWN0aXZpdHlOb2RlIHVtbE5vZGUgPSAoTWVyZ2VOb2RlKSBwYXJlbnRBY3Rpdml0eS5jcmVhdGVOb2RlKAotCQkJCQkJbm9kZU5hbWUgPSAobm9kZU5hbWUgIT0gbnVsbCkgPyBub2RlTmFtZSA6ICIiLAkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE1lcmdlTm9kZSgpKTsKLQkJCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCQluZXcgSW50ZWdlcihNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCQlNZXJnZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbm90YXRpb25Ob2RlOwotCX0KLQotCS8qCQotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2UuSURpYWdyYW1VSVNlcnZpY2UjY3JlYXRlTm9kZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgTm9kZSBjcmVhdGVOb2RlKERpYWdyYW0gZGlhZ3JhbSwgV29ya0JyZWFrZG93bkVsZW1lbnQgZSkgewotCQlvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSBwYXJlbnRBY3Rpdml0eSA9IG51bGw7Ci0JCU5vZGUgbm90YXRpb25Ob2RlID0gbnVsbDsKLQkJRU9iamVjdCBvYmogPSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSB7Ci0JCQlwYXJlbnRBY3Rpdml0eSA9IChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgb2JqOwotCQl9Ci0JCVN0cmluZyBuYW1lID0gIiI7Ci0JCWlmKGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpICE9IG51bGwpewotCQkJbmFtZSA9IGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQl9ZWxzZXsKLQkJCW5hbWUgPSBlLmdldE5hbWUoKTsKLQkJfQotCQkKLQkJaWYgKHBhcmVudEFjdGl2aXR5ICE9IG51bGwpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgUGhhc2UpIHsKLQkJCQkvLyBQaGFzZQotCQkJCUFjdGl2aXR5Tm9kZSB1bWxOb2RlID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIHBhcmVudEFjdGl2aXR5Ci0JCQkJCQkuY3JlYXRlTm9kZShuYW1lLAotCQkJCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpOwotCi0JCQkJQnJpZGdlSGVscGVyLmFzc29jaWF0ZSh1bWxOb2RlLCAoKE1ldGhvZEVsZW1lbnQpIGUpKTsKLQotCQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJCW5ldyBJbnRlZ2VyKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEKQotCQkJCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUobm90YXRpb25Ob2RlLCB1bWxOb2RlLCBuZXcgSW50ZWdlcigKLQkJCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0KLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEl0ZXJhdGlvbikgewotCQkJCS8vIEl0ZXJhdGlvbgotCQkJCUFjdGl2aXR5Tm9kZSB1bWxOb2RlID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIHBhcmVudEFjdGl2aXR5Ci0JCQkJCQkuY3JlYXRlTm9kZShuYW1lLAotCQkJCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpOwotCi0JCQkJQnJpZGdlSGVscGVyLmFzc29jaWF0ZSh1bWxOb2RlLCAoKE1ldGhvZEVsZW1lbnQpIGUpKTsKLQotCQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJCW5ldyBJbnRlZ2VyKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuVklTVUFMX0lEKQotCQkJCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUobm90YXRpb25Ob2RlLCB1bWxOb2RlLCBuZXcgSW50ZWdlcigKLQkJCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCS8vIEFjdGl2aXR5Ci0JCQkJQWN0aXZpdHlOb2RlIHVtbE5vZGUgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgcGFyZW50QWN0aXZpdHkKLQkJCQkJCS5jcmVhdGVOb2RlKG5hbWUsCi0JCQkJCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSk7Ci0KLQkJCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKHVtbE5vZGUsICgoTWV0aG9kRWxlbWVudCkgZSkpOwotCi0JCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQkJbmV3IEludGVnZXIoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCQkJLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCS8vIFRhc2sgZGVzY3JpcHRvcgotCQkJCUFjdGl2aXR5Tm9kZSB1bWxOb2RlID0gKEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgcGFyZW50QWN0aXZpdHkKLQkJCQkJCS5jcmVhdGVOb2RlKG5hbWUsCi0JCQkJCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5UGFyYW1ldGVyTm9kZSgpKTsKLQotCQkJCUJyaWRnZUhlbHBlci5hc3NvY2lhdGUodW1sTm9kZSwgKChNZXRob2RFbGVtZW50KSBlKSk7Ci0KLQkJCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCQluZXcgSW50ZWdlcihBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UKLQkJCQkJCS5jcmVhdGVOb2RlKAotCQkJCQkJCQlub3RhdGlvbk5vZGUsCi0JCQkJCQkJCXVtbE5vZGUsCi0JCQkJCQkJCW5ldyBJbnRlZ2VyKAotCQkJCQkJCQkJCUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkJCQkJLnRvU3RyaW5nKCksCi0JCQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQkJLy8gTWlsZXN0b25lCi0JCQkJQWN0aXZpdHlOb2RlIHVtbE5vZGUgPSAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSBwYXJlbnRBY3Rpdml0eQotCQkJCQkJLmNyZWF0ZU5vZGUobmFtZSwKLQkJCQkJCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkpOwotCi0JCQkJQnJpZGdlSGVscGVyLmFzc29jaWF0ZSh1bWxOb2RlLCAoKE1ldGhvZEVsZW1lbnQpIGUpKTsKLQotCQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJCW5ldyBJbnRlZ2VyKEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5vdGF0aW9uTm9kZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2UuSURpYWdyYW1VSVNlcnZpY2UjZ2V0RWRnZXMob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSkKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RWRnZXMoRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCXJldHVybiBkaWFncmFtLmdldFBlcnNpc3RlZEVkZ2VzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgZGlhZ3JhbSBub2RlcyBpbiB0aGUgZGlhZ3JhbQotCSAqIAotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHBhcmFtIG5vZGVUeXBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRBbGxOb2RlcyhEaWFncmFtIGRpYWdyYW0pIHsKLQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJcmV0dXJuIGRpYWdyYW0uZ2V0UGVyc2lzdGVkQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2UuSURpYWdyYW1VSVNlcnZpY2UjZ2V0Tm9kZXMob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHksIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIExpc3Q8Tm9kZT4gZ2V0Tm9kZXMoRGlhZ3JhbSBkaWFncmFtLCBBY3Rpdml0eSBhY3Rpdml0eSwKLQkJCVN0cmluZyBub2RlVHlwZSkgewotCQlMaXN0PE5vZGU+IG5vZGVzID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOwotCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQlMaXN0IGFsbE5vZGVzID0gZGlhZ3JhbS5nZXRQZXJzaXN0ZWRDaGlsZHJlbigpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbGxOb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gbm9kZS5nZXRFbGVtZW50KCk7Ci0JCQkJQ2xhc3MgY2xhc3NUeXBlID0gKENsYXNzKSBub2RlVHlwZXNNYXAuZ2V0KG5vZGVUeXBlKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVNb2RlbEVsZW1lbnQpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBleCA9IEJyaWRnZUhlbHBlcgotCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50RnJvbUFubm90YXRpb24oCi0JCQkJCQkJCQkoRU1vZGVsRWxlbWVudCkgZWxlbWVudCwgYWN0aXZpdHkKLQkJCQkJCQkJCQkJLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpOwotCQkJCQlpZiAoZXggIT0gbnVsbCAmJiBjbGFzc1R5cGUuaXNJbnN0YW5jZShleCkpIHsKLQkJCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmIChjbGFzc1R5cGUgIT0gbnVsbCAmJiBjbGFzc1R5cGUuaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbm9kZXM7Ci0JfQotCi0vLwlwcml2YXRlIHN0YXRpYyBEaWFncmFtIGdldERpYWdyYW0oQWN0aXZpdHkgYWN0aXZpdHksIGludCB0eXBlLAotLy8JCQlib29sZWFuIGNyZWF0ZSkgewotLy8JCURpYWdyYW0gZGlhZ3JhbSA9IG51bGw7Ci0vLwkJRGlhZ3JhbU1hbmFnZXIgZE1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKFRuZ1V0aWwKLS8vCQkJCS5nZXRPd25pbmdQcm9jZXNzKGFjdGl2aXR5KSk7Ci0vLwotLy8JCWlmIChkTWdyICE9IG51bGwpIHsKLS8vCQkJdHJ5IHsKLS8vCQkJCUxpc3QgbGlzdCA9IGRNZ3IuZ2V0RGlhZ3JhbXMoYWN0aXZpdHksIHR5cGUpOwotLy8JCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotLy8JCQkJCWRpYWdyYW0gPSAoRGlhZ3JhbSkgbGlzdC5nZXQoMCk7Ci0vLwkJCQl9Ci0vLwkJCQlpZiAoZGlhZ3JhbSA9PSBudWxsICYmIGNyZWF0ZSkgewotLy8JCQkJCWRpYWdyYW0gPSBkTWdyLmNyZWF0ZURpYWdyYW0oYWN0aXZpdHksIHR5cGUsCi0vLwkJCQkJCQlnZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KHR5cGUpKTsKLS8vCQkJCX0KLS8vCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vCQkJCWlmIChkZWJ1ZykgewotLy8JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ29yZSBlcnJvciBjcmVhdGluZyBhIGRpYWdyYW06IiAvLyROT04tTkxTLTEkCi0vLwkJCQkJCQkrIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLS8vCQkJCX0KLS8vCQkJCURpYWdyYW1VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0vLwkJCQkJCSJDb3JlIGVycm9yIGNyZWF0aW5nIGEgZGlhZ3JhbToiLCBlKTsgLy8kTk9OLU5MUy0xJAotLy8JCQl9IGZpbmFsbHkgewotLy8JCQkJaWYgKGRNZ3IgIT0gbnVsbCkgewotLy8JCQkJCWRNZ3IucmVsZWFzZSgpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8JCXJldHVybiBkaWFncmFtOwotLy8JfQotCi0vLwlwdWJsaWMgc3RhdGljIFByZWZlcmVuY2VzSGludCBnZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KGludCBkaWFncmFtVHlwZSkgewotLy8JCXN3aXRjaCAoZGlhZ3JhbVR5cGUpIHsKLS8vCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotLy8JCQlyZXR1cm4gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVDsKLS8vCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLS8vCQkJcmV0dXJuIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQ7Ci0vLwkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLS8vCQkJcmV0dXJuIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UOwotLy8JCX0KLS8vCQlyZXR1cm4gbnVsbDsKLS8vCX0KLQotLy8JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5EaWFncmFtKElFZGl0b3JQYXJ0IHBhcnQsIGludCBkaWFncmFtVHlwZSwKLS8vCQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0LCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotLy8JCXRyeSB7Ci0vLwkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0KAotLy8JCQkJCXNlbGVjdGVkT2JqZWN0LCBzdXBwcmVzc2lvbiwgZGlhZ3JhbVR5cGUpOwotLy8JCQlEaWFncmFtRWRpdG9yVXRpbC5vcGVuRGlhZ3JhbUVkaXRvcihwYXJ0LmdldFNpdGUoKS5nZXRQYWdlKCksCi0vLwkJCQkJaW5wdXQsIGdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoZGlhZ3JhbVR5cGUpLAotLy8JCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotLy8JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotLy8JCQlEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotLy8JCX0KLS8vCX0KLQotLy8JcHVibGljIHN0YXRpYyBEaWFncmFtIGdldERpYWdyYW0oQWN0aXZpdHkgYWN0aXZpdHksIGludCB0eXBlKSB7Ci0vLwkJcmV0dXJuIGdldERpYWdyYW0oYWN0aXZpdHksIHR5cGUsIGZhbHNlKTsKLS8vCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9zZXJ2aWNlL0lEaWFncmFtSW1hZ2VTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvc2VydmljZS9JRGlhZ3JhbUltYWdlU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDQzM2IwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9zZXJ2aWNlL0lEaWFncmFtSW1hZ2VTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5JQWN0aXZpdHlEaWFncmFtU2VydmljZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIHRoZSBnZW5lcmF0aW5nIGRpYWdyYW0gaW1hZ2UuICAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEaWFncmFtSW1hZ2VTZXJ2aWNlIGV4dGVuZHMgSUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UgewotCi0JLyoqCi0JICogR2VuZXJhdGVzIHRoZSBkaWFncmFtIGltYWdlIGZvciBnaXZlbiBhY3Rpdml0eSBhbmQgcmV0dXJucyBkaWFncmFtIGltYWdlIHBhdGggc3RyaW5nLgotCSAqIFRoaXMgbWV0aG9kIGRvbid0IGNhbGN1bGF0ZSB0aGUgaW1hZ2UgbWFwIGZvciBnZW5lcmF0ZWQgZGlhZ3JhbSBpbWFnZS4gIEluIG9yZGVyIHRvIGNhbGN1bGF0ZQotCSAqIEltYWdlIGZvciBnZW5lcmF0ZWQgZGlhZ3JhbSB1c2Uge0BsaW5rIElBY3Rpdml0eURpYWdyYW1TZXJ2aWNlfSdzIHNhdmVEaWFncmFtKE9iamVjdCB3cmFwZXIsIFN0cmluZyBpbWdQYXRoLCBTdHJpbmcgZGlhZ3JhbVR5cGUsCi0JCQlJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwKTsgCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKiBAcGFyYW0gaW1nUGF0aAotCSAqIEBwYXJhbSBkaWFncmFtVHlwZQotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiBAcGFyYW0gc3VwCi0JICogQHBhcmFtIHJlYWxpemVkRGlhZ3JhbQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlRGlhZ3JhbUltYWdlKGZpbmFsIE9iamVjdCB3cmFwcGVyLCBmaW5hbCBTdHJpbmcgaW1nUGF0aCwgCi0JCQlmaW5hbCBpbnQgZGlhZ3JhbVR5cGUsIGZpbmFsIElGaWx0ZXIgZmlsdGVyLAotCQkJZmluYWwgU3VwcHJlc3Npb24gc3VwLCBmaW5hbCBib29sZWFuIHJlYWxpemVkRGlhZ3JhbSk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvc2VydmljZS9JRGlhZ3JhbVVJU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvSURpYWdyYW1VSVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY0NmE2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvc2VydmljZS9JRGlhZ3JhbVVJU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBDbGFzcyBmb3IgbWFwcGluZyBiZXR3ZWVuIEFjdGl2aXR5IERpYWdyYW0KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBDaGluaCBWbwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEaWFncmFtVUlTZXJ2aWNlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZX05PREUgPSAiQWN0aXZpdHkiOwkvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSEFTRV9OT0RFID0gIlBoYXNlIjsJCS8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElURVJBVElPTl9OT0RFID0gIkl0ZXJhdGlvbiI7CS8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfREVTQ1JJUFRPUl9OT0RFID0gIlRhc2tEZXNjcmlwdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlMRVNUT05FX05PREUgPSAiTWlsZXN0b25lIjsJLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVElBTF9OT0RFID0gIkluaXRpYWxOb2RlIjsJLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOQUxfTk9ERSA9ICJGaW5hbE5vZGUiOwkJLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SS19OT0RFID0gIkZvcmtOb2RlIjsJCQkvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKT0lOX05PREUgPSAiSm9pbk5vZGUiOwkJCS8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FUkdFX05PREUgPSAiTWVyZ2VOb2RlIjsJCS8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ0lTSU9OX05PREUgPSAiRGVjaXNpb25Ob2RlIjsJLy8kTk9OLU5MUy0xJAotCi0JCi0JLyoqCi0JICogUmV0dXJucyBhbGwgZGlhZ3JhbSBub2RlcyBpbiB0aGUgZGlhZ3JhbQotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRBbGxOb2RlcyhEaWFncmFtIGRpYWdyYW0pOwotCi0JLyoqCi0JICogUmV0dXJuIGRpYWdyYW0gbm9kZSBmb3IgZ2l2ZW4gbm9kZSB0eXBlIHVuZGVyIGdpdmVuIGFjdGl2aXR5IGFuZCBkaWFncmFtCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gbm9kZVR5cGUKLQkgKiAJCQllLmcuIElEaWFncmFtVUlTZXJ2aWNlLkFDVElWSVRZX05PREUsIGV0YwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdDxOb2RlPiBnZXROb2RlcyhEaWFncmFtIGRpYWdyYW0sIEFjdGl2aXR5IGFjdGl2aXR5LAotCQkJU3RyaW5nIG5vZGVUeXBlKTsKLQotCS8qKgotCSAqIFRvIGNyZWF0ZSBhIGxpbmsKLQkgKiAKLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHBhcmFtIGxpbmtOYW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFZGdlIGNyZWF0ZUVkZ2UoRGlhZ3JhbSBkaWFncmFtLCBWaWV3IHNvdXJjZSwgVmlldyB0YXJnZXQsIFN0cmluZyBsaW5rTmFtZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGRpYWdhbSBub2RlIGZvciB0aGUgZ2l2ZW4gbm9kZSB0eXBlCi0JICogCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gbm9kZVR5cGUKLQkgKiBAcGFyYW0gbm9kZU5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE5vZGUgY3JlYXRlTm9kZShEaWFncmFtIGRpYWdyYW0sIFN0cmluZyBub2RlVHlwZSwgU3RyaW5nIG5vZGVOYW1lKTsKLQotCS8qKgotCSAqIENyZWF0ZSBkaWFncmFtIG5vZGUgZm9yIHRoZSBnaXZlbiB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gd2JlRWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjcmVhdGVOb2RlKERpYWdyYW0gZGlhZ3JhbSwgV29ya0JyZWFrZG93bkVsZW1lbnQgd2JlRWxlbWVudCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBlZGdlcyBpbiB0aGUgZGlhZ3JhbQotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFZGdlcyhEaWFncmFtIGRpYWdyYW0pOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhY3Rpdml0eSBkaWFncmFtIGZvciB0aGUgZ2l2ZW4gYWN0aXZpdHkuCi0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBEaWFncmFtIGNyZWF0ZUFjdGl2aXR5RGlhZ3JhbShBY3Rpdml0eSBhY3Rpdml0eSk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS92aWV3ZXIvQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvdmlld2VyL0Fic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGZmMWE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS92aWV3ZXIvQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkudmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TV1RHcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5EaWFncmFtSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkxheWVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLlNjYWxhYmxlRnJlZWZvcm1Sb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYSBncmFwaGljYWwgdmlld2VyIG9mIHRoZSBlbGVtZW50IGRpYWdyYW0uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHBhcmVudDsKLQotCXByb3RlY3RlZCBHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyOwotCi0JcHJvdGVjdGVkIE9iamVjdCB3cmFwcGVyOwotCi0JcHVibGljIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQljcmVhdGVHcmFwaGljYWxWaWV3ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIE9iamVjdCB3cmFwcGVyKSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLndyYXBwZXIgPSB3cmFwcGVyOwotCQljcmVhdGVHcmFwaGljYWxWaWV3ZXIoKTsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgR3JhcGhpY2FsVmlld2VyIG9uIHRoZSBzcGVjaWZpZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJdGhpcy5ncmFwaGljYWxWaWV3ZXIgPSBuZXcgU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyKCk7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ3JhcGhpY2FsIHZpZXdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBncmFwaGljYWwgdmlld2VyCi0JICovCi0JcHVibGljIEdyYXBoaWNhbFZpZXdlciBnZXRHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXJldHVybiBncmFwaGljYWxWaWV3ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCkgewotCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRDb250cm9sKCkuc2V0QmFja2dyb3VuZCgKLQkJCQlDb2xvckNvbnN0YW50cy5saXN0QmFja2dyb3VuZCk7Ci0JCVNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyKSBnZXRHcmFwaGljYWxWaWV3ZXIoKTsKLQotCQlTY2FsYWJsZUZyZWVmb3JtUm9vdEVkaXRQYXJ0IHJvb3QgPSBuZXcgU2NhbGFibGVGcmVlZm9ybVJvb3RFZGl0UGFydCgpOwotCQl2aWV3ZXIuc2V0Um9vdEVkaXRQYXJ0KHJvb3QpOwotCQl2aWV3ZXIuc2V0RWRpdFBhcnRGYWN0b3J5KGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRGaWd1cmUoKSB7Ci0JCUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKTsKLQotCQkvLyBmaW5kIHRoZSBmaWd1cmUgdG8gYmUgc2F2ZWQKLQkJTGF5ZXJNYW5hZ2VyIGxtID0gKExheWVyTWFuYWdlcikgdmlld2VyLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQoCi0JCQkJTGF5ZXJNYW5hZ2VyLklEKTsKLQkJSUZpZ3VyZSBmaWd1cmUgPSBsbS5nZXRMYXllcihMYXllckNvbnN0YW50cy5QUklOVEFCTEVfTEFZRVJTKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTdXBwcmVzc2lvblRvRGlhZ3JhbShEaWFncmFtIGRpYWdyYW0pIHsKLQkJT2JqZWN0IGUgPSBkaWFncmFtLmdldE9iamVjdCgpOwotCQlpZiAoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgZSk7Ci0JCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQkJZGlhZ3JhbS5zZXRTdXBwcmVzc2lvbihTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihwcm9jKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBkaWFncmFtIGltYWdlIGZyb20gZmlndXJlIGNyZWF0ZWQgaW4gbG9hZERpYWdyYW0gbWV0aG9kLgotCSAqIAotCSAqLwotCXB1YmxpYyBJbWFnZSBjcmVhdGVEaWFncmFtSW1hZ2UoKSB7Ci0JCUlGaWd1cmUgZmlndXJlID0gZ2V0RmlndXJlKCk7Ci0KLQkJU1dUR3JhcGhpY3MgZ3JhcGhpY3MgPSBudWxsOwotCQlHQyBnYyA9IG51bGw7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQotCQl0cnkgewotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGZpZ3VyZS5nZXRCb3VuZHMoKTsKLQkJCWludCBoZWlnaHQgPSBib3VuZHMuaGVpZ2h0OwotCQkJaW50IHdpZHRoID0gYm91bmRzLndpZHRoOwotCi0JCQkvLyBjcmVhdGUgYSBuZXcgaW1hZ2UgYW5kIHJlcGFpbnQgdGhlIGdyYXBoCi0JCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHdpZHRoLCBoZWlnaHQpOwotCQkJZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCQkJZ3JhcGhpY3MgPSBuZXcgU1dUR3JhcGhpY3MoZ2MpOwotCQkJZmlndXJlLnBhaW50KGdyYXBoaWNzKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJLy8gcmVsZWFzZSByZXNvdXJjZXMKLQkJCWlmIChncmFwaGljcyAhPSBudWxsKQotCQkJCWdyYXBoaWNzLmRpc3Bvc2UoKTsKLQkJCWlmIChnYyAhPSBudWxsKQotCQkJCWdjLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0cnkgewotCQkJaWYgKGdyYXBoaWNhbFZpZXdlciAhPSBudWxsKSB7Ci0JCQkJQ29udHJvbCBjdHJsID0gZ3JhcGhpY2FsVmlld2VyLmdldENvbnRyb2woKTsKLQkJCQlpZiAoY3RybCAhPSBudWxsKSB7Ci0JCQkJCWN0cmwuZGlzcG9zZSgpOwotCQkJCX0KLQotCQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ3JhcGhpY2FsVmlld2VyLmdldENvbnRlbnRzKCk7Ci0JCQkJaWYoZWRpdFBhcnQgIT0gbnVsbCkgewotCQkJCQllZGl0UGFydC5zZXRNb2RlbChudWxsKTsKLQkJCQl9Ci0KLQkJCQlncmFwaGljYWxWaWV3ZXIgPSBudWxsOwotCQkJfQotCQkJCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEVkaXRQYXJ0RmFjdG9yeSBjcmVhdGVFZGl0UGFydEZhY3RvcnkoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChPYmplY3QgZSwgSUZpbHRlciBmaWx0ZXIsCi0JCQlTdXBwcmVzc2lvbiBzdXApOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREaWFncmFtVHlwZSgpOwotCi0JcHJvdGVjdGVkIHZvaWQgY2xlYW5VcERpYWdyYW0oKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nCi0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBEaWFncmFtSW5mbyBnZXREaWFncmFtSW5mbygpOwotCXB1YmxpYyBhYnN0cmFjdCBFZGl0UGFydCBsb2FkRGlhZ3JhbShPYmplY3Qgd3JhcHBlciwgYm9vbGVhbiBuZWVkUmVzZXQsCi0JCQlJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwKTsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3ZpZXdlci9BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXJFeC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3ZpZXdlci9BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXJFeC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2U3ODYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS92aWV3ZXIvQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyRXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS52aWV3ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRGVsZWdhdGluZ0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGF5ZXJlZFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UuQWJzdHJhY3RFTUZPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5JRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5EaWFncmFtVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZS5EaWFncmFtSW1hZ2VTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLkRpYWdyYW1JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbVJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmltYWdlLkltYWdlRmlsZUZvcm1hdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5zZXJ2aWNlcy5lZGl0cGFydC5FZGl0UGFydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXJFeCBleHRlbmRzCi0JCUFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB7Ci0JCi0JcHJvdGVjdGVkIGNsYXNzIERpYWdyYW1HcmFwaGljYWxWaWV3ZXJFeCBleHRlbmRzIERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgaW1wbGVtZW50cyBJRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIgewotCQlwcml2YXRlIERpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dDsKLQkJcHVibGljIERpYWdyYW1FZGl0b3JJbnB1dCBnZXREaWFncmFtRWRpdG9ySW5wdXQoKSB7Ci0JCQlpZihpbnB1dCA9PSBudWxsKSB7Ci0JCQkJaW5wdXQgPSBuZXcgRGlhZ3JhbUVkaXRvcklucHV0KHdyYXBwZXIsIG51bGwsIERpYWdyYW1JbWFnZVNlcnZpY2UuZ2V0SW50VHlwZShnZXREaWFncmFtVHlwZSgpKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gaW5wdXQ7Ci0JCX0KLQotCQlwdWJsaWMgSUVkaXRvclBhcnQgZ2V0RWRpdG9yKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JfTsKLQotCXByb3RlY3RlZCBHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgRGlhZ3JhbSBkaWFncmFtOwotCXByb3RlY3RlZCBEaWFncmFtTWFuYWdlciBkbWdyOwotCXByb3RlY3RlZCBib29sZWFuIGRlYnVnID0gRGlhZ3JhbVVJUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOyAKLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCi0JcHVibGljIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlckV4KENvbXBvc2l0ZSBwYXJlbnQsIE9iamVjdCB3cmFwcGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgd3JhcHBlcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBkaWFncmFtIGZvciBnaXZlbiBvYmplY3QgKG9ubHkgZm9yIHtAbGluayBBY3Rpdml0eX0gYW5kIHBhY2tzIHRoZSBib3VuZHMuCi0JICogCi0JICogQHBhcmFtIHdyYXBwZXIgCXtAbGluayBPYmplY3R9IAkKLQkgKiBAcGFyYW0gbmVlZFJlc2V0IGJvb2xlYW4KLQkgKiBAcGFyYW0gZmlsdGVyIAl7QGxpbmsgSUZpbHRlcn0KLQkgKiBAcGFyYW0gc3VwCQl7QGxpbmsgU3VwcHJlc3Npb259Ci0JICovCi0JcHVibGljIEVkaXRQYXJ0IGxvYWREaWFncmFtKE9iamVjdCB3cmFwcGVyLCBib29sZWFuIG5lZWRSZXNldCwKLQkJCUlGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJLy8gaW5pdGlhbGl6ZSB0aGUgdmlld2VyIHdpdGggdGhlIGVkaXQgcGFydAotCQlFZGl0UGFydCBlZGl0UGFydCA9IGNyZWF0ZUVkaXRQYXJ0KHdyYXBwZXIsIGZpbHRlciwgc3VwKTsKLQkJaWYoZWRpdFBhcnQgPT0gbnVsbCl7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkVkaXRwYXJ0IGlzIG51bGw6ICIrIHdyYXBwZXIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gZWRpdFBhcnQ7Ci0JCX0KLQkJdGhpcy5ncmFwaGljYWxWaWV3ZXIuc2V0Q29udGVudHMoZWRpdFBhcnQpOwotCQlEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0ID0gKERpYWdyYW1FZGl0UGFydCllZGl0UGFydDsJCQotCQlvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UgcmVzb3VyY2UgPSBkaWFncmFtRWRpdFBhcnQuZ2V0RGlhZ3JhbVZpZXcoKS5lUmVzb3VyY2UoKTsKLQkJYm9vbGVhbiBvbGREZWxpdmVyID0gcmVzb3VyY2UuZURlbGl2ZXIoKTsKLQkJdHJ5IHsKLQkJCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uIG9uIHRoZSByZXNvdXJjZSBjaGFuZ2UgZHVyaW5nIHJlZnJlc2ggdG8KLQkJCS8vIGF2b2lkIG1ha2luZyB0aGUgZGlhZ3JhbSBlZGl0b3IgZGlydHkKLQkJCS8vCi0JCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2UuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJfQotCQkJcmVmcmVzaChkaWFncmFtRWRpdFBhcnQpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCXJlc291cmNlLmVTZXREZWxpdmVyKG9sZERlbGl2ZXIpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBhc2sgZm9yIGltbWVkaWF0ZSB1cGRhdGUgb2YgdGhlIGNvbnRyb2wgc28gdGhhdCB0aGUgZGlhZ3JhbSBmaWd1cmUKLQkJLy8gd2lsbCBiZSBjb21wdXRlZAotCQlwYXJlbnQucGFjayh0cnVlKTsKLQkJaWYoZWRpdFBhcnQgIT0gbnVsbCl7Ci0JCQlpZihkZWJ1Zyl7Ci0JCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyYXRvciA9IGVkaXRQYXJ0LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlFZGl0UGFydCBuYW1lID0gKEVkaXRQYXJ0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCVZpZXcgdmlldyA9IChWaWV3KW5hbWUuZ2V0TW9kZWwoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHZpZXcuZ2V0VHlwZSgpICsiOiIgKyBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKSkgKyAiLCIgKyBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gVGhpcyBjaGVjayBpcyBuZWVkZWQgZm9yIGJyb3dzaW5nLCBpbiBvcmRlciB0byByZW5kZXIgYWN0aXZpdHkgY29udHJpYnV0aW5nJ3MKLQkJLy8gY2hpbGRyZW4uICBJbiBwcm9jZXNzQXV0aG9yaW5nIHdlIGRvbid0IGRvIHJlYWxpemF0aW9uLCBpbiBvcmRlciB0byBkaXNwbGF5ZWQgCi0JCS8vIHJlYWxpemVkIGVsZW1lbnRzLCB3ZSBoYXZlIHRvIGNsZWFudXAgQUREIGRpYWdyYW0gYW5kIHJlY3JlYXRlLiBuZWVkdG9SZXNldCBvciBjbGVhbnVwZGlhZ3JhbS4KLQkJLy8gT25seSBmb3IgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0uCi0JCU9iamVjdCBvID0gVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCWlmKG8gaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgJiYgZ2V0RGlhZ3JhbVR5cGUoKSAhPSBudWxsICYmIAotCQkJCWdldERpYWdyYW1UeXBlKCkuZXF1YWxzSWdub3JlQ2FzZShSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMKSl7Ci0JCQlpZihUbmdVdGlsLmhhc0NvbnRyaWJ1dG9yKChWYXJpYWJpbGl0eUVsZW1lbnQpbykpewotCQkJCW5lZWRSZXNldCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChuZWVkUmVzZXQpIHsKLQkJCWNsZWFuVXBEaWFncmFtKCk7Ci0JCQlwYXJlbnQucGFjayh0cnVlKTsKLQkJfQotCQlJRmlndXJlIGZpZ3VyZSA9IGdldEZpZ3VyZSgpOwotCQlpZiAoZmlndXJlICE9IG51bGwpIHsKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBmaWd1cmUuZ2V0Qm91bmRzKCk7Ci0JCQlpZiAoYm91bmRzLnggPCAwIHx8IGJvdW5kcy55IDwgMCkgewotCQkJCWlmKGVkaXRQYXJ0IGluc3RhbmNlb2YgQWN0aXZpdHlFZGl0UGFydCl7Ci0JCQkJCSgoQWN0aXZpdHlFZGl0UGFydCkgZWRpdFBhcnQpLm1vdmVGaWd1cmUoLWJvdW5kcy54LCAtYm91bmRzLnkpOwotCQkJCX0KLQkJCQlwYXJlbnQucGFjayh0cnVlKTsKLQotCQkJCWJvdW5kcyA9IGZpZ3VyZS5nZXRCb3VuZHMoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBlZGl0UGFydDsKLQl9Ci0KLQkKLQkvKioKLQkgKiByZXR1cm5zIHtAbGluayBEaWFncmFtSW5mb30KLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUluZm8gZ2V0RGlhZ3JhbUluZm8oKSB7Ci0JCURpYWdyYW1JbmZvIGRpYWdyYW1JbmZvID0gbnVsbDsKLQotCQlPYmplY3QgZWxlbWVudCA9IHBhcnQuZ2V0TW9kZWwoKTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBMaW5rZWRPYmplY3QpIHsKLQkJCWVsZW1lbnQgPSAoKExpbmtlZE9iamVjdCkgZWxlbWVudCkuZ2V0T2JqZWN0KCk7Ci0JCX0KLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFZpZXcpewotCQkJIGVsZW1lbnQgPSAoKFZpZXcpZWxlbWVudCkuZ2V0RWxlbWVudCgpOwotCQkJaWYoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBFTW9kZWxFbGVtZW50KXsKLQkJCQllbGVtZW50ID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpZWxlbWVudCk7Ci0JCQl9Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTm9kZSl7Ci0JCQkJZWxlbWVudCA9ICgoTm9kZSllbGVtZW50KS5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCWRpYWdyYW1JbmZvID0gbmV3IERpYWdyYW1JbmZvKGdldERpYWdyYW1UeXBlKCksCi0JCQkJCShNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLQkJCWxvYWREaWFncmFtSW5mbyhwYXJ0LCBkaWFncmFtSW5mbyk7Ci0JCX0KLQotCQlyZXR1cm4gZGlhZ3JhbUluZm87Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZURpYWdyYW1JbWFnZShJbWFnZUZpbGVGb3JtYXQgaW1hZ2VGaWxlRm9ybWF0KXsKLS8vCQlDb3B5VG9JbWFnZVV0aWwgaW0gPSBuZXcgQ29weVRvSW1hZ2VVdGlsKCk7Ci0JCS8vaW0uY29weVRvSW1hZ2UocGFydCwgZGVzdGluYXRpb24sIGZvcm1hdCwgbW9uaXRvcikKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLkFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciNjcmVhdGVFZGl0UGFydEZhY3RvcnkoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkgewotCQlyZXR1cm4gRWRpdFBhcnRTZXJ2aWNlLmdldEluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0Q29udHJvbCgpLnNldEJhY2tncm91bmQoCi0JCQkJQ29sb3JDb25zdGFudHMubGlzdEJhY2tncm91bmQpOwotCQlEaWFncmFtR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChEaWFncmFtR3JhcGhpY2FsVmlld2VyKSBnZXRHcmFwaGljYWxWaWV3ZXIoKTsKLQotCQlEaWFncmFtUm9vdEVkaXRQYXJ0IHJvb3QgPSAoRGlhZ3JhbVJvb3RFZGl0UGFydCkgRWRpdFBhcnRTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuY3JlYXRlUm9vdEVkaXRQYXJ0KGdldERpYWdyYW0oKSk7Ci0vLwkJTGF5ZXJlZFBhbmUgcHJpbnRhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0vLwkJCQkuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuUFJJTlRBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgZXh0TGFiZWxzTGF5ZXIgPSBuZXcgRnJlZWZvcm1MYXllcigpOwotCQlleHRMYWJlbHNMYXllci5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBEZWxlZ2F0aW5nTGF5b3V0KCkpOwotLy8JCXByaW50YWJsZUxheWVycy5hZGRMYXllckFmdGVyKGV4dExhYmVsc0xheWVyLAotLy8JCQkJVU1MRWRpdFBhcnRGYWN0b3J5LkVYVEVSTkFMX05PREVfTEFCRUxTX0xBWUVSLAotLy8JCQkJTGF5ZXJDb25zdGFudHMuUFJJTUFSWV9MQVlFUik7Ci0JCUxheWVyZWRQYW5lIHNjYWxhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlNDQUxBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgc2NhbGVkRmVlZGJhY2tMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCXNjYWxlZEZlZWRiYWNrTGF5ZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXNjYWxhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoc2NhbGVkRmVlZGJhY2tMYXllciwKLQkJCQlMYXllckNvbnN0YW50cy5TQ0FMRURfRkVFREJBQ0tfTEFZRVIsCi0JCQkJRGlhZ3JhbVJvb3RFZGl0UGFydC5ERUNPUkFUSU9OX1VOUFJJTlRBQkxFX0xBWUVSKTsKLQkJdmlld2VyLnNldFJvb3RFZGl0UGFydChyb290KTsKLQkJdmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSk7Ci0JCQotCQkvLyBTZXQgZWRpdGluZyBkb21haW4KLS8vCQlEaWFncmFtRWRpdERvbWFpbiBlZGl0RG9tYWluID0gbmV3IERpYWdyYW1FZGl0RG9tYWluKG51bGwpOwotLy8gICAgICAgIGVkaXREb21haW4uc2V0Q29tbWFuZFN0YWNrKAotLy8gICAgICAgICAgICBuZXcgRGlhZ3JhbUNvbW1hbmRTdGFjayhlZGl0RG9tYWluKSk7Ci0vLwotLy8gICAgICAgIHZpZXdlci5zZXRFZGl0RG9tYWluKGVkaXREb21haW4pOwotICAgICAgICAKLS8vICAgICAgICBQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50ID0gRGlhZ3JhbUltYWdlU2VydmljZS5nZXRQcmVmZXJlbmNlSGludCgKLS8vICAgICAgICAJCWdldERpYWdyYW1UeXBlKCkpOwotLy8gICAgICAgIGlmIChyb290IGluc3RhbmNlb2YgSURpYWdyYW1QcmVmZXJlbmNlU3VwcG9ydCkgewotLy8gICAgICAgICAgICBpZiAocHJlZmVyZW5jZXNIaW50ID09IG51bGwpIHsKLS8vICAgICAgICAgICAgICAgIHByZWZlcmVuY2VzSGludCA9ICgoSURpYWdyYW1QcmVmZXJlbmNlU3VwcG9ydCkgcm9vdCkKLS8vICAgICAgICAgICAgICAgICAgICAuZ2V0UHJlZmVyZW5jZXNIaW50KCk7Ci0vLyAgICAgICAgICAgIH0gZWxzZSB7Ci0vLyAgICAgICAgICAgICAgICAoKElEaWFncmFtUHJlZmVyZW5jZVN1cHBvcnQpIHJvb3QpCi0vLyAgICAgICAgICAgICAgICAgICAgLnNldFByZWZlcmVuY2VzSGludChwcmVmZXJlbmNlc0hpbnQpOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIHZpZXdlcgotLy8gICAgICAgICAgICAgICAgLmhvb2tXb3Jrc3BhY2VQcmVmZXJlbmNlU3RvcmUoKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludAotLy8gICAgICAgICAgICAgICAgICAgIC5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIAotLy8gICAgICAgIERpYWdyYW1FdmVudEJyb2tlci5zdGFydExpc3RlbmluZyhUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihkaWFncmFtKSk7Ci0vLyAgICAgICAgdmlld2VyLnNldENvbnRlbnRzKGRpYWdyYW0pOwotCX0KLQkKLQkvKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBEaWFncmFtIGdldERpYWdyYW0oKXsKLQkJaWYgKGRpYWdyYW0gPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZGlhZ3JhbSA9PSBudWxsKSB7Ci0JCQkJCU9iamVjdCBvID0gVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgbzsKLQkJCQkJCWRtZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShUbmdVdGlsCi0JCQkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKGFjdCksIHRoaXMpOwotCQkJCQkJTGlzdDxEaWFncmFtPiBsaXN0ID0gZG1nci5nZXREaWFncmFtcyhhY3QsIERpYWdyYW1JbWFnZVNlcnZpY2UKLQkJCQkJCQkJLmdldEludFR5cGUoZ2V0RGlhZ3JhbVR5cGUoKSkpOwotCQkJCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJCWRpYWdyYW0gPSAoRGlhZ3JhbSkgbGlzdC5nZXQoMCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJLnByaW50bG4oIkRpYWdyYW0gaXMgZW1wdHkgZm9yICIgKyBhY3QpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChkZWJ1ZykgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChkaWFncmFtID09IG51bGwpIHsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJDcmVhdGluZyBkaWFncmFtIG9mICAiICsgZ2V0RGlhZ3JhbVR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJZGlhZ3JhbSA9IGRtZ3IuY3JlYXRlRGlhZ3JhbSgoQWN0aXZpdHkpIFRuZ1V0aWwKLQkJCQkJCQkudW53cmFwKHdyYXBwZXIpLCBEaWFncmFtSW1hZ2VTZXJ2aWNlCi0JCQkJCQkJLmdldEludFR5cGUoZ2V0RGlhZ3JhbVR5cGUoKSksIERpYWdyYW1JbWFnZVNlcnZpY2UKLQkJCQkJCQkuZ2V0UHJlZmVyZW5jZUhpbnQoZ2V0RGlhZ3JhbVR5cGUoKSkpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCUVPYmplY3QgZSA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQkJCWlmKGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCSgoTm9kZSllKS5hZGRDb25zdW1lcih0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJdGhpcy5ncmFwaGljYWxWaWV3ZXIgPSBuZXcgRGlhZ3JhbUdyYXBoaWNhbFZpZXdlckV4KCk7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxvYWREaWFncmFtSW5mbyhHcmFwaGljYWxFZGl0UGFydCBwYXJ0LCBEaWFncmFtSW5mbyBkaWFncmFtSW5mbykgewotCQlMaXN0PD8+IGNoaWxkcmVuID0gcGFydC5nZXRDaGlsZHJlbigpOwotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0KLQkJCWlmIChvIGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCQlwYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBvOwotCQkJCU9iamVjdCBtb2RlbCA9IHBhcnQuZ2V0TW9kZWwoKTsKLQkJCQlPYmplY3QgZSA9IG1vZGVsOwotCQkJCWlmIChlIGluc3RhbmNlb2YgTGlua2VkT2JqZWN0KSB7Ci0JCQkJCWUgPSAoKExpbmtlZE9iamVjdCkgZSkuZ2V0T2JqZWN0KCk7Ci0JCQkJfQotCQkJCWlmIChlIGluc3RhbmNlb2YgVmlldykgewotCQkJCQllID0gKChWaWV3KSBlKS5nZXRFbGVtZW50KCk7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyKSB7Ci0JCQkJCQkJbG9hZERpYWdyYW1JbmZvKChHcmFwaGljYWxFZGl0UGFydCkgbywgZGlhZ3JhbUluZm8pOwotCQkJCQkJfQotCQkJCQkJZSA9ICgoTm9kZSkgZSkuZ2V0TGlua2VkRWxlbWVudCgpOwotCQkJCQl9Ci0JCQkJCWlmIChlICE9IG51bGwgJiYgZSBpbnN0YW5jZW9mIEVNb2RlbEVsZW1lbnQpIHsKLQkJCQkJCWUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCgoRU1vZGVsRWxlbWVudCkgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoZSBpbnN0YW5jZW9mIERpYWdyYW1FbGVtZW50KSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlib29sZWFuIHN1cHByZXNzZWQ7Ci0JCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJCQkJc3VwcHJlc3NlZCA9ICgoTmFtZWROb2RlKSBtb2RlbCkuaXNTdXBwcmVzc2VkKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzdXBwcmVzc2VkID0gKChNZXRob2RFbGVtZW50KSBlKS5nZXRTdXBwcmVzc2VkKCkKLQkJCQkJCQkJLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQl9Ci0KLQkJCQkJSUZpZ3VyZSBmID0gcGFydC5nZXRGaWd1cmUoKTsKLQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGYuZ2V0Qm91bmRzKCk7Ci0KLQkJCQkJU3RyaW5nIGFsdFRhZyA9IG51bGw7Ci0JCQkJCWlmIChmIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkJCQlhbHRUYWcgPSAoKFdyYXBMYWJlbCkgZikuZ2V0VGV4dCgpOwotCQkJCQl9Ci0JCQkJCWRpYWdyYW1JbmZvLmFkZEFyZWEoKE1ldGhvZEVsZW1lbnQpIGUsIGJvdW5kcy54LCBib3VuZHMueSwKLQkJCQkJCQlib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQsIGFsdFRhZywgc3VwcHJlc3NlZCk7Ci0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJCi0JCWlmKGRtZ3IgIT0gbnVsbCl7Ci0JCQlkbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQl9Ci0JCWlmKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJRU9iamVjdCBlID0gZGlhZ3JhbS5nZXRFbGVtZW50KCk7Ci0JCQlpZihlIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCSgoTm9kZSllKS5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKERpYWdyYW1FZGl0UGFydCBlZGl0UGFydCl7Ci0JCXRyeSB7Ci0JCQlEaWFncmFtRWRpdG9yVXRpbC5yZWZyZXNoKGVkaXRQYXJ0LCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0cnVlKTsKLQkJCURpYWdyYW1FZGl0b3JVdGlsLnJlZnJlc2hMYWJlbHMoZWRpdFBhcnQpOwotCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZihkZWJ1Zyl7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBkaWFncmFtIHJlZnJlc2ggd2hpbGUgcHVibGlzaGluZyA6ICIgKyBlKTsJIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGVEaWFncmFtRWxlbWVudChmaW5hbCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtIG1vZGVsLCBmaW5hbCBNZXRob2RFbGVtZW50IGVsZW1lbnQsICAKLQkJCWZpbmFsIFN1cHByZXNzaW9uIHN1cCwgZmluYWwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBmaW5hbCBJRmlsdGVyIGZpbHRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKXsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4obW9kZWwpOwotCQlBYnN0cmFjdEVNRk9wZXJhdGlvbiBvcCA9IG5ldyBBYnN0cmFjdEVNRk9wZXJhdGlvbihkb21haW4sICIiKSB7CS8vJE5PTi1OTFMtMSQKLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJU3RhdHVzIGRvRXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSBkID0gCi0JCQkJCShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKSBtb2RlbC5nZXRFbGVtZW50KCk7Ci0JCQkJZC5zZXRTdXBwcmVzc2lvbihzdXApOwotCQkJCWlmKGZpbHRlciA9PSBudWxsICYmIGNvbmZpZ3VyYXRpb24gIT0gbnVsbCl7Ci0JCQkJCVByb2Nlc3NDb25maWd1cmF0b3IgcCA9IG5ldyBQcm9jZXNzQ29uZmlndXJhdG9yKGNvbmZpZyk7Ci0JCQkJCWQuc2V0RmlsdGVyKHApOwotCQkJCX1lbHNlewotCQkJCQlkLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJCX0KLQkJCQlkLnNldExpbmtlZEVsZW1lbnQoZWxlbWVudCk7Ci0JCQkJCi0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCQotCQl9OwotCQl0cnkgewotCQkJb3AuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JfQotCQotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKXsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvdmlld2VyL05ld0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3ZpZXdlci9OZXdBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM1MTc1Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvdmlld2VyL05ld0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5zZXJ2aWNlLkRpYWdyYW1SZXNldFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLkRpYWdyYW1BY3Rpb25zU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5EaWFncmFtVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkRlZmF1bHRFZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1FZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuSURpYWdyYW1HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5zZXJ2aWNlcy5lZGl0cGFydC5FZGl0UGFydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBncmFwaGljYWwgdmlld2VyIGZvciB0aGUgQWN0aXZpdHlEZXRhaWwgZGlhZ3JhbS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICovCi1wdWJsaWMgY2xhc3MgTmV3QWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyIGV4dGVuZHMKLQkJQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyRXggewotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICovCi0JcHVibGljIE5ld0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBPYmplY3Qgd3JhcHBlcikgewotCQlzdXBlcihwYXJlbnQsIHdyYXBwZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIjY3JlYXRlRWRpdFBhcnQoamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyLCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb24pCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KE9iamVjdCB3cmFwcGVyLCBJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCUFjdGl2aXR5IGUgPSBudWxsOwotCQlpZiAod3JhcHBlciBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJZSA9IChBY3Rpdml0eSkgVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCX0gZWxzZSBpZiAod3JhcHBlciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQllID0gKEFjdGl2aXR5KSB3cmFwcGVyOwotCQl9Ci0JCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQl1cGRhdGVEaWFncmFtRWxlbWVudChkaWFncmFtLCAoTWV0aG9kRWxlbWVudCllLCBzdXAsIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSwKLQkJCQkJZmlsdGVyLAotCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCURpYWdyYW1FZGl0RG9tYWluIGRvbWFpbiA9IG5ldyBEaWFncmFtRWRpdERvbWFpbihudWxsKTsKLQkJCSgoSURpYWdyYW1HcmFwaGljYWxWaWV3ZXIpZ3JhcGhpY2FsVmlld2VyKS5zZXRFZGl0RG9tYWluKGRvbWFpbik7Ci0JCQlwYXJ0ID0gRWRpdFBhcnRTZXJ2aWNlLmdldEluc3RhbmNlKCkuY3JlYXRlR3JhcGhpY0VkaXRQYXJ0KGRpYWdyYW0pOwotCQkJaWYocGFydCA9PSBudWxsKXsKLQkJCQlEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLgotCQkJCWxvZ0Vycm9yKCJQdWJsaXNoaW5nOiBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBFZGl0UGFydCBjcmVhdGlvbiBmYWlsZWQgZm9yIDogIitlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIHBhcnQ7Ci0JCX0KLQkJcmV0dXJuIHBhcnQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLkFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciNnZXREaWFncmFtVHlwZSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFncmFtVHlwZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUw7Ci0JfQotCi0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyI2NsZWFuVXBEaWFncmFtKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhblVwRGlhZ3JhbSgpIHsKLQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgZGVwID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSBnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCS5nZXRDb250ZW50cygpOwotCQlpZiAoZGVwICE9IG51bGwpIHsKLQkJCWRlcC5nZXRSZWNlbnRseUFkZGVkUGFydHMoKS5hZGRBbGwoZGVwLmdldENoaWxkcmVuKCkpOwotCi0JCQkvLyBjbGVhbiB1cCB0aGUgZGlhZ3JhbQotCQkJRGVmYXVsdEVkaXREb21haW4gZWRpdGluZ0RvbWFpbiA9IG5ldyBEZWZhdWx0RWRpdERvbWFpbihudWxsKTsKLQkJCUFjdGlvblJlZ2lzdHJ5IGFjdGlvblJlZ2lzdHJ5ID0gbmV3IEFjdGlvblJlZ2lzdHJ5KCk7Ci0KLQkJCURpYWdyYW1BY3Rpb25zU2VydmljZSBhY3Rpb25TZXJ2aWNlID0gbmV3IERpYWdyYW1BY3Rpb25zU2VydmljZSgKLQkJCQkJZG1nci5nZXRFZGl0aW5nRG9tYWluKCksIGdldEdyYXBoaWNhbFZpZXdlcigpLAotCQkJCQllZGl0aW5nRG9tYWluLCBhY3Rpb25SZWdpc3RyeSk7Ci0JCQlhY3Rpb25TZXJ2aWNlLnJlZ2lzdGVyVmVydGljYWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKTsKLQotCQkJRGlhZ3JhbVJlc2V0U2VydmljZSBzZXJ2aWNlID0gbmV3IERpYWdyYW1SZXNldFNlcnZpY2UoZG1ncgotCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBnZXRHcmFwaGljYWxWaWV3ZXIoKSwgZWRpdGluZ0RvbWFpbiwKLQkJCQkJYWN0aW9uUmVnaXN0cnkpOwotCQkJc2VydmljZS5jbGVhblVwRGlhZ3JhbSgpOwotCQkJLy8gVE9ETzogbmVlZCB0byBpbXByb3ZlIHRoaXMgZnVuY3Rpb24uIEhhdmUgdG8gY2FsbCBpdCB0d2ljZSByaWdodCBub3cKLQkJCS8vIHNvIGl0IGNhbiBsYXlvdXQgdGhlIGRpYWdyYW0gY29ycmVjdGx5LgotCQkJc2VydmljZS5jbGVhblVwRGlhZ3JhbSgpOwkJCQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3ZpZXdlci9OZXdBY3Rpdml0eURpYWdyYW1WaWV3ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS92aWV3ZXIvTmV3QWN0aXZpdHlEaWFncmFtVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZGNiNTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3ZpZXdlci9OZXdBY3Rpdml0eURpYWdyYW1WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS52aWV3ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkRlbGVnYXRpbmdMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxheWVyZWRQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLmltcGwuSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLkRpYWdyYW1VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0uRGlhZ3JhbUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUVkaXREb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuSURpYWdyYW1HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5zZXJ2aWNlcy5lZGl0cGFydC5FZGl0UGFydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGdyYXBoaWNhbCB2aWV3ZXIgZm9yIHRoZSBBY3Rpdml0eSBkaWFncmFtLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdBY3Rpdml0eURpYWdyYW1WaWV3ZXIgZXh0ZW5kcyBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXJFeCB7Ci0KLQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXB1YmxpYyBOZXdBY3Rpdml0eURpYWdyYW1WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgT2JqZWN0IGFjdCkgewotCQlzdXBlcihwYXJlbnQsYWN0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyI2NyZWF0ZUVkaXRQYXJ0KGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlciwgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChPYmplY3Qgd3JhcHBlciwgSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQlBY3Rpdml0eSBlID0gbnVsbDsKLQkJQWN0aXZpdHlEaWFncmFtQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLQkJaWYgKHdyYXBwZXIgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCWUgPSAoQWN0aXZpdHkpIFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQkJYWRhcHRlciA9IG5ldyBBY3Rpdml0eURpYWdyYW1BZGFwdGVyKAotCQkJCQkoQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB3cmFwcGVyKTsKLQkJfSBlbHNlIHsKLQkJCWlmICh3cmFwcGVyIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQllID0gKEFjdGl2aXR5KSB3cmFwcGVyOwotCQkJCWFkYXB0ZXIgPSBuZXcgQWN0aXZpdHlEaWFncmFtQWRhcHRlcihlKTsKLQkJCX0KLQkJfQotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWFkYXB0ZXIuc2V0VmlldyhkaWFncmFtKTsKLQkJCQlhZGFwdGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJCWFkYXB0ZXIuc2V0U3VwcHJlc3Npb24oc3VwKTsKLQkJCQlhZGFwdGVyLnNldEVkaXRpbmdEb21haW4oKEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4pIFRyYW5zYWN0aW9uVXRpbAotCQkJCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbihkaWFncmFtLmdldEVsZW1lbnQoKSkpOwotCQkJCWRpYWdyYW0uZ2V0RWxlbWVudCgpLmVBZGFwdGVycygpLmFkZChhZGFwdGVyKTsKLQkJCQlEaWFncmFtRWRpdERvbWFpbiBkb21haW4gPSBuZXcgRGlhZ3JhbUVkaXREb21haW4obnVsbCk7Ci0JCQkJKChJRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcikgZ3JhcGhpY2FsVmlld2VyKQotCQkJCQkJLnNldEVkaXREb21haW4oZG9tYWluKTsKLQkJCQlwYXJ0ID0gRWRpdFBhcnRTZXJ2aWNlLmdldEluc3RhbmNlKCkuY3JlYXRlR3JhcGhpY0VkaXRQYXJ0KAotCQkJCQkJZGlhZ3JhbSk7Ci0JCQkJaWYgKHBhcnQgPT0gbnVsbCkgewotCQkJCQlEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkJCSJQdWJsaXNoaW5nOiBBY3Rpdml0eSBEaWFncmFtIEVkaXRQYXJ0IGNyZWF0aW9uIGZhaWxlZCBmb3IgOiAiCS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSsgZSk7Ci0JCQkJfQotCQkJCXJldHVybiBwYXJ0OwotCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyI2dldERpYWdyYW1UeXBlKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWdyYW1UeXBlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWREaWFncmFtSW5mbyhHcmFwaGljYWxFZGl0UGFydCBwYXJ0LCBEaWFncmFtSW5mbyBkaWFncmFtSW5mbykgewotCQlMaXN0IGNoaWxkcmVuID0gcGFydC5nZXRDaGlsZHJlbigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpCi0JCQl7Ci0JCQkJQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCBwYXJ0aXRpb24gPSAoQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCkgbzsKLQkJCQlMaXN0IHBhcnRpdGlvbkNoaWxkcmVuID0gcGFydGl0aW9uLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpID0gcGFydGl0aW9uQ2hpbGRyZW4uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQkJCXsKLQkJCQkJT2JqZWN0IG8xID0gaS5uZXh0KCk7Ci0JCQkJCWlmIChvMSBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KXsKLQkJCQkJCWxvYWREaWFncmFtSW5mbygoR3JhcGhpY2FsRWRpdFBhcnQpIG8xLCBkaWFncmFtSW5mbyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCXBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIG87Ci0JCQkJT2JqZWN0IG1vZGVsID0gcGFydC5nZXRNb2RlbCgpOwotCQkJCU9iamVjdCBlID0gbW9kZWw7Ci0JCQkJCi0JCQkJaWYoZSBpbnN0YW5jZW9mIFZpZXcpewotCQkJCQlFTW9kZWxFbGVtZW50IGV4ID0gKEVNb2RlbEVsZW1lbnQpKChWaWV3KWUpLmdldEVsZW1lbnQoKTsKLQkJCQkJaWYoZXggIT0gbnVsbCl7Ci0JCQkJCQllID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoZXgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlib29sZWFuIHN1cHByZXNzZWQ7Ci0JCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJCXN1cHByZXNzZWQgPSAoKE1ldGhvZEVsZW1lbnQpQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpKChOb2RlKW1vZGVsKS5nZXRFbGVtZW50KCkpKS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzdXBwcmVzc2VkID0gKChNZXRob2RFbGVtZW50KSBlKS5nZXRTdXBwcmVzc2VkKCkKLQkJCQkJCQkJLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQl9Ci0KLQkJCQkJSUZpZ3VyZSBmID0gcGFydC5nZXRGaWd1cmUoKTsKLQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGYuZ2V0Qm91bmRzKCk7Ci0KLQkJCQkJU3RyaW5nIGFsdFRhZyA9IG51bGw7Ci0JCQkJCWlmIChmIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkJCQlhbHRUYWcgPSAoKFdyYXBMYWJlbCkgZikuZ2V0VGV4dCgpOwotCQkJCQl9Ci0JCQkJCWRpYWdyYW1JbmZvLmFkZEFyZWEoKE1ldGhvZEVsZW1lbnQpIGUsIGJvdW5kcy54LAotCQkJCQkJYm91bmRzLnksIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCwgYWx0VGFnLCBzdXBwcmVzc2VkKTsKLQotCQkJCX0KLQkJCQllbHNlCi0JCQkJCWRpYWdyYW1JbmZvLmFkZEdyYXBoaWNhbE5vZGVzKCk7Ci0JCQl9IAotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJdGhpcy5ncmFwaGljYWxWaWV3ZXIgPSBuZXcgRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcigpOwotCQl0aGlzLmdyYXBoaWNhbFZpZXdlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCWNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCWdldEdyYXBoaWNhbFZpZXdlcigpLmdldENvbnRyb2woKS5zZXRCYWNrZ3JvdW5kKAotCQkJCUNvbG9yQ29uc3RhbnRzLmxpc3RCYWNrZ3JvdW5kKTsKLQkJRGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcikgZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0KLQkJRGlhZ3JhbVJvb3RFZGl0UGFydCByb290ID0gKERpYWdyYW1Sb290RWRpdFBhcnQpIEVkaXRQYXJ0U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVJvb3RFZGl0UGFydChnZXREaWFncmFtKCkpOwotCQlMYXllcmVkUGFuZSBwcmludGFibGVMYXllcnMgPSAoTGF5ZXJlZFBhbmUpIHJvb3QKLQkJCQkuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuUFJJTlRBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgZXh0TGFiZWxzTGF5ZXIgPSBuZXcgRnJlZWZvcm1MYXllcigpOwotCQlleHRMYWJlbHNMYXllci5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBEZWxlZ2F0aW5nTGF5b3V0KCkpOwotLy8JCXByaW50YWJsZUxheWVycy5hZGRMYXllckFmdGVyKGV4dExhYmVsc0xheWVyLAotLy8JCQkJVU1MRWRpdFBhcnRGYWN0b3J5LkVYVEVSTkFMX05PREVfTEFCRUxTX0xBWUVSLAotLy8JCQkJTGF5ZXJDb25zdGFudHMuUFJJTUFSWV9MQVlFUik7Ci0JCUxheWVyZWRQYW5lIHNjYWxhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlNDQUxBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgc2NhbGVkRmVlZGJhY2tMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCXNjYWxlZEZlZWRiYWNrTGF5ZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXNjYWxhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoc2NhbGVkRmVlZGJhY2tMYXllciwKLQkJCQlMYXllckNvbnN0YW50cy5TQ0FMRURfRkVFREJBQ0tfTEFZRVIsCi0JCQkJRGlhZ3JhbVJvb3RFZGl0UGFydC5ERUNPUkFUSU9OX1VOUFJJTlRBQkxFX0xBWUVSKTsKLQkJdmlld2VyLnNldFJvb3RFZGl0UGFydChyb290KTsKLQkJdmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvdmlld2VyL05ld1dQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS92aWV3ZXIvTmV3V1BEZXBlbmRlbmN5RGlhZ3JhbVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmJiZGQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS92aWV3ZXIvTmV3V1BEZXBlbmRlbmN5RGlhZ3JhbVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5EZWxlZ2F0aW5nTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYXllcmVkUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5EaWFncmFtVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLkRpYWdyYW1FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUVkaXREb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuSURpYWdyYW1HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5zZXJ2aWNlcy5lZGl0cGFydC5FZGl0UGFydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBUaGUgZ3JhcGhpY2FsIHZpZXdlciBmb3IgdGhlIFdvcmtQcm9kdWN0IERlcGVuZGVuY3kgZGlhZ3JhbS4KLSAqICAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIE5ld1dQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIgZXh0ZW5kcwotCQlBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXJFeCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHdyYXBwZXIKLQkgKi8KLQlwdWJsaWMgTmV3V1BEZXBlbmRlbmN5RGlhZ3JhbVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBPYmplY3Qgd3JhcHBlcikgewotCQlzdXBlcihwYXJlbnQsIHdyYXBwZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIjY3JlYXRlRWRpdFBhcnQoamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyLCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb24pCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KE9iamVjdCB3cmFwcGVyLCBJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCUFjdGl2aXR5IGUgPSBudWxsOwotCQlpZih3cmFwcGVyIGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCWUgPSAoQWN0aXZpdHkpVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCX1lbHNlIGlmKHdyYXBwZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQllID0gKEFjdGl2aXR5KXdyYXBwZXI7Ci0JCX0KLQkJaWYoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCXVwZGF0ZURpYWdyYW1FbGVtZW50KGRpYWdyYW0sIChNZXRob2RFbGVtZW50KWUsIHN1cCwgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLAotCQkJCQlmaWx0ZXIsCi0JCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJRGlhZ3JhbUVkaXREb21haW4gZG9tYWluID0gbmV3IERpYWdyYW1FZGl0RG9tYWluKG51bGwpOwotCQkJKChJRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcilncmFwaGljYWxWaWV3ZXIpLnNldEVkaXREb21haW4oZG9tYWluKTsKLQkJCXBhcnQgPSBFZGl0UGFydFNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jcmVhdGVHcmFwaGljRWRpdFBhcnQoZGlhZ3JhbSk7Ci0JCQlpZihwYXJ0ID09IG51bGwpewotCQkJCURpYWdyYW1VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkuCi0JCQkJbG9nRXJyb3IoIlB1Ymxpc2hpbmc6IFdvcmtQcm9kdWN0IERpYWdyYW0gRWRpdFBhcnQgY3JlYXRpb24gZmFpbGVkIGZvciA6ICIrZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBwYXJ0OwotCQl9Ci0JCXJldHVybiBwYXJ0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIjZ2V0RGlhZ3JhbVR5cGUoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCkgewotCQlEaWFncmFtR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChEaWFncmFtR3JhcGhpY2FsVmlld2VyKSBnZXRHcmFwaGljYWxWaWV3ZXIoKTsKLQkJRGlhZ3JhbVJvb3RFZGl0UGFydCByb290ID0gKERpYWdyYW1Sb290RWRpdFBhcnQpIEVkaXRQYXJ0U2VydmljZQotCQkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVSb290RWRpdFBhcnQoZ2V0RGlhZ3JhbSgpKTsKLQkJTGF5ZXJlZFBhbmUgcHJpbnRhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlBSSU5UQUJMRV9MQVlFUlMpOwotCQlGcmVlZm9ybUxheWVyIGV4dExhYmVsc0xheWVyID0gbmV3IEZyZWVmb3JtTGF5ZXIoKTsKLQkJZXh0TGFiZWxzTGF5ZXIuc2V0TGF5b3V0TWFuYWdlcihuZXcgRGVsZWdhdGluZ0xheW91dCgpKTsKLS8vCQlwcmludGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihleHRMYWJlbHNMYXllciwKLS8vCQkJCURpYWdyYW1FZGl0UGFydEZhY3RvcnkuRVhURVJOQUxfTk9ERV9MQUJFTFNfTEFZRVIsCi0vLwkJCQlMYXllckNvbnN0YW50cy5QUklNQVJZX0xBWUVSKTsKLQkJTGF5ZXJlZFBhbmUgc2NhbGFibGVMYXllcnMgPSAoTGF5ZXJlZFBhbmUpIHJvb3QKLQkJCQkuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuU0NBTEFCTEVfTEFZRVJTKTsKLQkJRnJlZWZvcm1MYXllciBzY2FsZWRGZWVkYmFja0xheWVyID0gbmV3IEZyZWVmb3JtTGF5ZXIoKTsKLQkJc2NhbGVkRmVlZGJhY2tMYXllci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJc2NhbGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihzY2FsZWRGZWVkYmFja0xheWVyLAotCQkJCUxheWVyQ29uc3RhbnRzLlNDQUxFRF9GRUVEQkFDS19MQVlFUiwKLQkJCQlEaWFncmFtUm9vdEVkaXRQYXJ0LkRFQ09SQVRJT05fVU5QUklOVEFCTEVfTEFZRVIpOwotCQl2aWV3ZXIuc2V0Um9vdEVkaXRQYXJ0KHJvb3QpOwotCQl2aWV3ZXIuc2V0RWRpdFBhcnRGYWN0b3J5KGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYjYxNTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdGhlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQgcGx1Zy1pbgotCi0jIFR1cm4gb24gZ2VuZXJhbCBkZWJ1Z2dpbmcgZm9yIHRoZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkIHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvZGVidWc9ZmFsc2UKLQotIyBUdXJuIG9uIGRlYnVnZ2luZyBvZiB2aXN1YWxJRCBwcm9jZXNzaW5nCi1vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2RlYnVnL3Zpc3VhbElEPXRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU3YWU0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNlNzgyYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQ7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cywgCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmpmYWNlLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS51aS52aWV3cywKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaSwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSwKLSBvcmcuZWNsaXBzZS5nZWY7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnByb3BlcnRpZXMsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aSwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLnJlbmRlciwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvcGVydGllcywKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycywKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5pZGUsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZW5kZXIsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24ucHJvdmlkZXJzLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmRyYXcyZDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ5MmRiOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZGlhZ3JhbS93b3JrcHJvZHVjdGRlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9kaWFncmFtL3dvcmtwcm9kdWN0ZGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMTgyMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9kaWFncmFtL3dvcmtwcm9kdWN0ZGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2Z1bGwvZHRvb2wxNi9XUERERWRpdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9kdG9vbDE2L1dQRERFZGl0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWY1YzdhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9kdG9vbDE2L1dQRERFZGl0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL2V0b29sMTYvV1BEREVkaXRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2Z1bGwvZXRvb2wxNi9XUERERWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg2MTJmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2Z1bGwvZXRvb2wxNi9XUERERWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMTgyMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2Z1bGwvb2JqMTYvbGlua19wYWwxNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2Z1bGwvb2JqMTYvbGlua19wYWwxNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZjQwOGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL29iajE2L2xpbmtfcGFsMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9vYmoxNi9Nb2RlbERpYWdyYW1GaWxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvb2JqMTYvTW9kZWxEaWFncmFtRmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNjc2YTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9vYmoxNi9Nb2RlbERpYWdyYW1GaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvb2JqMTYvVW1hRGlhZ3JhbUZpbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9vYmoxNi9VbWFEaWFncmFtRmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMjI5Y2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9vYmoxNi9VbWFEaWFncmFtRmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL3dpemJhbi9OZXdNb2RlbFdpemFyZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL3dpemJhbi9OZXdNb2RlbFdpemFyZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZjg1ZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy93aXpiYW4vTmV3TW9kZWxXaXphcmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy93aXpiYW4vTmV3VW1hV2l6YXJkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvd2l6YmFuL05ld1VtYVdpemFyZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMDViNzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy93aXpiYW4vTmV3VW1hV2l6YXJkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbWVzc2FnZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE0MjI0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFNUQVJUIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUT0RPOiBtYW51YWxseSBwdXQga2V5cyBhbmQgdmFsdWVzCi1EaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfT3Blbk1vZGVsUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlPUVycm9yCi1EaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfT3Blbk1vZGVsUmVzb3VyY2VFcnJvckRpYWxvZ01lc3NhZ2U9RmFpbGVkIHRvIGxvYWQgbW9kZWwgZmlsZSB7MH0KLURpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtUHJvZ3Jlc3NUYXNrPUNyZWF0aW5nIGRpYWdyYW0gYW5kIG1vZGVsIGZpbGVzCi1EaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbUNvbW1hbmRMYWJlbD1DcmVhdGluZyBkaWFncmFtIGFuZCBtb2RlbAotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlPVVwZGF0aW5nIGNhY2hlIGZhaWxlZAotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkPUZhaWxlZCB0byByZWZyZXNoIGhpZXJhcmNoeSBmb3IgY2hhbmdlZCByZXNvdXJjZQotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvcj17MX0KLURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1VuYWJsZVRvTG9hZFJlc291cmNlRXJyb3I9VW5hYmxlIHRvIGxvYWQgZGlhZ3JhbSByZXNvdXJjZQotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfTm9EaWFncmFtSW5SZXNvdXJjZUVycm9yPURpYWdyYW0gaXMgbm90IHByZXNlbnQgaW4gcmVzb3VyY2UKLURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX0RpYWdyYW1Mb2FkaW5nRXJyb3I9RXJyb3IgbG9hZGluZyBkaWFncmFtCi1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9VbnN5bmNocm9uaXplZEZpbGVTYXZlRXJyb3I9VGhlIGZpbGUgaGFzIGJlZW4gY2hhbmdlZCBvbiB0aGUgZmlsZSBzeXN0ZW0KLURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1NhdmVEaWFncmFtVGFzaz1TYXZpbmcgZGlhZ3JhbQotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfU2F2ZU5leHRSZXNvdXJjZVRhc2s9U2F2aW5nIHswfQotRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVSZXNvdXJjZUVycm9yRGlhbG9nVGl0bGU9RXJyb3IKLURpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlUmVzb3VyY2VFcnJvckRpYWxvZ01lc3NhZ2U9TW9kZWwgZmlsZSBsb2FkaW5nIGZhaWxlZAotRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVXaXphcmRUaXRsZT1Jbml0aWFsaXplIG5ldyB7MH0gZGlhZ3JhbSBmaWxlCi1EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX09wZW5Nb2RlbEZpbGVEaWFsb2dUaXRsZT1TZWxlY3QgZG9tYWluIG1vZGVsCi1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlTmFtZT1Jbml0aWFsaXplIG5ldyBkaWFncmFtIGZpbGUKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VUaXRsZT1EaWFncmFtIGZpbGUKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VEZXNjcmlwdGlvbj1DcmVhdGUgbmV3IGRpYWdyYW0gYmFzZWQgb24gezB9IG1vZGVsIGNvbnRlbnQKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5hbWU9U2VsZWN0IGRpYWdyYW0gcm9vdCBlbGVtZW50Ci1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VUaXRsZT1EaWFncmFtIHJvb3QgZWxlbWVudAotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlRGVzY3JpcHRpb249U2VsZWN0IHNlbWFudGljIG1vZGVsIGVsZW1lbnQgdG8gYmUgZGVwaWN0ZWQgb24gZGlhZ3JhbQotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlU2VsZWN0aW9uVGl0bGU9U2VsZWN0IGRpYWdyYW0gcm9vdCBlbGVtZW50OgotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlTm9TZWxlY3Rpb25NZXNzYWdlPURpYWdyYW0gcm9vdCBlbGVtZW50IGlzIG5vdCBzZWxlY3RlZAotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlSW52YWxpZFNlbGVjdGlvbk1lc3NhZ2U9SW52YWxpZCBkaWFncmFtIHJvb3QgZWxlbWVudCBpcyBzZWxlY3RlZAotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0luaXREaWFncmFtQ29tbWFuZD1Jbml0aWFsaXppbmcgZGlhZ3JhbSBjb250ZW50cwotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0luY29ycmVjdFJvb3RFcnJvcj1JbmNvcnJlY3QgbW9kZWwgb2JqZWN0IHN0b3JlZCBhcyBhIHJvb3QgcmVzb3VyY2Ugb2JqZWN0Ci1Nb2RlbDFHcm91cF90aXRsZT1tb2RlbAotQ29udHJvbEZsb3cxQ3JlYXRpb25Ub29sX3RpdGxlPUNvbnRyb2wgRmxvdwotQ29udHJvbEZsb3cxQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBDb250cm9sIEZsb3cKLVdvcmtQcm9kdWN0RGVzY3JpcHRvcjJDcmVhdGlvblRvb2xfdGl0bGU9V29yayBQcm9kdWN0IERlc2NyaXB0b3IKLVdvcmtQcm9kdWN0RGVzY3JpcHRvcjJDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yCi0KLUNvbW1hbmROYW1lX09wZW5EaWFncmFtPU9wZW4gRGlhZ3JhbQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRU5EIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZC5nbWZnZW4gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQuZ21mZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmRmZDFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZC5nbWZnZW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZnZW46R2VuRWRpdG9yR2VuZXJhdG9yIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6Z21mZ2VuPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L0dlbk1vZGVsIiBwYWNrYWdlTmFtZVByZWZpeD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZCIKLSAgICBtb2RlbElEPSJXUEREIgotICAgIHNhbWVGaWxlRm9yRGlhZ3JhbUFuZE1vZGVsPSJ0cnVlIgotICAgIGRpYWdyYW1GaWxlRXh0ZW5zaW9uPSJ3cGRkIj4KLSAgPGRpYWdyYW0KLSAgICAgIHZpc3VhbElEPSI3OSIKLSAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQiCi0gICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1WaWV3RmFjdG9yeSIKLSAgICAgIGljb25Qcm92aWRlclByaW9yaXR5PSJMb3ciCi0gICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtQ2Fub25pY2FsRWRpdFBvbGljeSI+Ci0gICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRGlhZ3JhbSIvPgotICAgIDxlbGVtZW50VHlwZQotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0SGVscGVyIi8+Ci0gICAgPHZpZXdtYXAKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyIi8+Ci0gICAgPGRvbWFpbkRpYWdyYW1FbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIi8+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3ROb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgV29ya1Byb2R1Y3ROb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7ZmlnXzAuc2V0VGV4dCgmcXVvdDtOZXcgV29yayBQcm9kdWN0IERlc2NyaXB0b3ImcXVvdDspOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlTmFtZWROb2RlTmFtZUZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZk5hbWVkTm9kZU5hbWVGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVOYW1lZE5vZGVOYW1lRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZOYW1lZE5vZGVOYW1lRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZU5hbWVkTm9kZU5hbWVGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmTmFtZWROb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvV29ya1Byb2R1Y3ROb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMSIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZU5hbWVWaWV3RmFjdG9yeSIKLSAgICAgICAgICBlbGVtZW50SWNvbj0idHJ1ZSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZU5hbWVkTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPGxpbmtzCi0gICAgICAgIHZpc3VhbElEPSIzMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTGlua0VkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJMaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTGlua1ZpZXdGYWN0b3J5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRWRnZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkxpbmtFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJMaW5rRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIExpbmtGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Qb2x5bGluZUNvbm5lY3Rpb25FeCB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgTGlua0ZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRUYXJnZXREZWNvcmF0aW9uKGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbiBjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkgeyYjeEQ7JiN4QTtvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uIGRmID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24oKTsmI3hEOyYjeEE7Ly8gZGlzcGF0Y2hOZXh0PyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QgcGwgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdCgpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoLTEsIDEpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoMCwgMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgtMSwgLTEpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZGYuc2V0VGVtcGxhdGUocGwpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZGYuc2V0U2NhbGUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg3KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgzKSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGRmOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlR5cGVMaW5rTW9kZWxGYWNldCI+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgICAgIDxzb3VyY2VNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvc291cmNlIi8+Ci0gICAgICAgIDx0YXJnZXRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvdGFyZ2V0Ii8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDIiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkxpbmtOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTGlua05hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkxpbmtOYW1lVmlld0ZhY3RvcnkiCi0gICAgICAgICAgZWxlbWVudEljb249InRydWUiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0iTGlua05hbWVGaWd1cmUiCi0gICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBMaW5rTmFtZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgTGlua05hbWVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0VGV4dCgmcXVvdDsmcXVvdDspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpMYWJlbE9mZnNldEF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIHk9IjQwIi8+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmUKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2xpbmtzPgotICAgIDxwYWxldHRlPgotICAgICAgPGdyb3VwcwotICAgICAgICAgIHRpdGxlPSJtb2RlbCI+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJDb250cm9sIEZsb3ciCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBDb250cm9sIEZsb3ciCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL29iajE2L2xpbmtfcGFsMTYuZ2lmIgotICAgICAgICAgICAgZ2VuTGlua3M9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIi8+Ci0gICAgICA8L2dyb3Vwcz4KLSAgICA8L3BhbGV0dGU+Ci0gIDwvZGlhZ3JhbT4KLSAgPHBsdWdpbgotICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQiCi0gICAgICBuYW1lPSJXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtIFBsdWdpbiIKLSAgICAgIHByb3ZpZGVyPSJFUEYiCi0gICAgICBwcmludGluZ0VuYWJsZWQ9InRydWUiCi0gICAgICBhY3RpdmF0b3JDbGFzc05hbWU9IldQRERpYWdyYW1FZGl0b3JQbHVnaW4iLz4KLSAgPGVkaXRvcgotICAgICAgY2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9yIi8+Ci0gIDxkb21haW5HZW5Nb2RlbAotICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvIi8+Ci08L2dtZmdlbjpHZW5FZGl0b3JHZW5lcmF0b3I+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQuZ21mZ3JhcGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQuZ21mZ3JhcGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NWQyM2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkLmdtZmdyYXBoCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZncmFwaDpDYW52YXMgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczpnbWZncmFwaD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9HcmFwaGljYWxEZWZpbml0aW9uIiBuYW1lPSJtb2RlbCI+Ci0gIDxmaWd1cmVzCi0gICAgICBuYW1lPSJEZWZhdWx0Ij4KLSAgICA8ZmlndXJlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UG9seWxpbmVDb25uZWN0aW9uIgotICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJMaW5rIgotICAgICAgICBuYW1lPSJMaW5rRmlndXJlIgotICAgICAgICB0YXJnZXREZWNvcmF0aW9uPSJPcGVuQXJyb3ciPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlBvbHlsaW5lRGVjb3JhdGlvbiIKLSAgICAgICAgICBuYW1lPSJPcGVuQXJyb3ciPgotICAgICAgICA8dGVtcGxhdGUKLSAgICAgICAgICAgIHg9Ii0xIgotICAgICAgICAgICAgeT0iMSIvPgotICAgICAgICA8dGVtcGxhdGUvPgotICAgICAgICA8dGVtcGxhdGUKLSAgICAgICAgICAgIHg9Ii0xIgotICAgICAgICAgICAgeT0iLTEiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iTGlua05hbWUiCi0gICAgICAgICAgbmFtZT0iTGlua05hbWVGaWd1cmUiCi0gICAgICAgICAgdGV4dD0iIi8+Ci0gICAgPC9maWd1cmVzPgotICAgIDxmaWd1cmVzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSZWN0YW5nbGUiCi0gICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IldvcmtQcm9kdWN0Tm9kZSIKLSAgICAgICAgbmFtZT0iV29ya1Byb2R1Y3ROb2RlRmlndXJlIgotICAgICAgICBvdXRsaW5lPSJmYWxzZSI+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iTmFtZWROb2RlTmFtZSIKLSAgICAgICAgICBuYW1lPSJOYW1lZE5vZGVOYW1lRmlndXJlIgotICAgICAgICAgIHRleHQ9Ik5ldyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciIvPgotICAgIDwvZmlndXJlcz4KLSAgPC9maWd1cmVzPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IldvcmtQcm9kdWN0Tm9kZSIKLSAgICAgIGZpZ3VyZT0iV29ya1Byb2R1Y3ROb2RlRmlndXJlIi8+Ci0gIDxjb25uZWN0aW9ucwotICAgICAgbmFtZT0iTGluayIKLSAgICAgIGZpZ3VyZT0iTGlua0ZpZ3VyZSIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJMaW5rTmFtZSIKLSAgICAgIGZpZ3VyZT0iTGlua05hbWVGaWd1cmUiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iTmFtZWROb2RlTmFtZSIKLSAgICAgIGZpZ3VyZT0iTmFtZWROb2RlTmFtZUZpZ3VyZSIvPgotPC9nbWZncmFwaDpDYW52YXM+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQuZ21mbWFwIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkLmdtZm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZkOWY0Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQuZ21mbWFwCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZtYXA6TWFwcGluZyB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdtZm1hcD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9tYXBwaW5ncyIKLSAgICB4bWxuczpnbWZ0b29sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L1Rvb2xEZWZpbml0aW9uIj4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdE5vZGUiLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgdmlld1BhdHRlcm49IiI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9IndwZGQuZ21mZ3JhcGgjTmFtZWROb2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPGNvbnRleHRNZW51Ci0gICAgICAgICAgaHJlZj0id3BkZC5nbWZ0b29sIy8vQGFsbE1lbnVzLjAiLz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9IndwZGQuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy4xIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJ3cGRkLmdtZmdyYXBoI1dvcmtQcm9kdWN0Tm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPGxpbmtzPgotICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTGluayIvPgotICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgIGhyZWY9IndwZGQuZ21mZ3JhcGgjTGlua05hbWUiLz4KLSAgICAgIDxmZWF0dXJlcwotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rL25hbWUiLz4KLSAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgPHRvb2wKLSAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICBocmVmPSJ3cGRkLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuMCIvPgotICAgIDxkaWFncmFtTGluawotICAgICAgICBocmVmPSJ3cGRkLmdtZmdyYXBoI0xpbmsiLz4KLSAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rL3NvdXJjZSIvPgotICAgIDxsaW5rTWV0YUZlYXR1cmUKLSAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rL3RhcmdldCIvPgotICA8L2xpbmtzPgotICA8ZGlhZ3JhbT4KLSAgICA8ZGlhZ3JhbUNhbnZhcwotICAgICAgICBocmVmPSJ3cGRkLmdtZmdyYXBoI21vZGVsIi8+Ci0gICAgPGRvbWFpbk1vZGVsCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLyIvPgotICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSIvPgotICAgIDxwYWxldHRlCi0gICAgICAgIGhyZWY9IndwZGQuZ21mdG9vbCMvL0BwYWxldHRlIi8+Ci0gIDwvZGlhZ3JhbT4KLTwvZ21mbWFwOk1hcHBpbmc+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQuZ21mdG9vbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZC5nbWZ0b29sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjk3OTJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZC5nbWZ0b29sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZ0b29sOlRvb2xSZWdpc3RyeSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZnRvb2w9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvVG9vbERlZmluaXRpb24iPgotICA8YWxsTWVudXMKLSAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNvbnRleHRNZW51IgotICAgICAgZGVmYXVsdD0iLy9AYWxsTWVudXMuMC9AaXRlbXMuMCI+Ci0gICAgPGl0ZW1zCi0gICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOk1lbnVBY3Rpb24iCi0gICAgICAgIHRpdGxlPSJXb3JrUHJvZHVjdCBOb2RlIgotICAgICAgICBraW5kPSJDVVNUT00iCi0gICAgICAgIGhvdEtleT0iQUxUK1ciLz4KLSAgPC9hbGxNZW51cz4KLSAgPHBhbGV0dGU+Ci0gICAgPHRvb2xzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOlRvb2xHcm91cCIKLSAgICAgICAgdGl0bGU9Im1vZGVsIj4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iQ29udHJvbCBGbG93IgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IENvbnRyb2wgRmxvdyI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9saW5rX3BhbDE2LmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZCIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iV29yayBQcm9kdWN0IERlc2NyaXB0b3IiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZCIvPgotICAgICAgPC90b29scz4KLSAgICA8L3Rvb2xzPgotICA8L3BhbGV0dGU+Ci08L2dtZnRvb2w6VG9vbFJlZ2lzdHJ5PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkMi5nbWZnZW4gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQyLmdtZmdlbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU3ZTBjZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQyLmdtZmdlbgorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZmdlbjpHZW5FZGl0b3JHZW5lcmF0b3IgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczpnbWZnZW49Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvR2VuTW9kZWwvMi4wIj4KLSAgPGRpYWdyYW0KLSAgICAgIHZpc3VhbElEPSI3OSIKLSAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQiCi0gICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1WaWV3RmFjdG9yeSIKLSAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgaWNvblByb3ZpZGVyUHJpb3JpdHk9IkxvdyIKLSAgICAgIHZhbGlkYXRpb25Qcm92aWRlclByaW9yaXR5PSJMb3ciPgotICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL0RpYWdyYW0iLz4KLSAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdEhlbHBlciIvPgotICAgIDx2aWV3bWFwCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllciIvPgotICAgIDxkb21haW5EaWFncmFtRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSIvPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiCi0gICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUNyZWF0ZUNvbW1hbmQiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Tm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFdvcmtQcm9kdWN0Tm9kZUZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRGaWxsKHRydWUpOyYjeEE7dGhpcy5zZXRGaWxsWE9SKGZhbHNlKTsmI3hBO3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4QTt0aGlzLnNldE91dGxpbmVYT1IoZmFsc2UpOyYjeEE7dGhpcy5zZXRMaW5lV2lkdGgoMSk7JiN4QTt0aGlzLnNldExpbmVTdHlsZShvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3MuTElORV9TT0xJRCk7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4QTsmI3hBOyYjeEE7JiN4QTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgbmFtZWROb2RlTmFtZUZpZ3VyZTAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4QTtuYW1lZE5vZGVOYW1lRmlndXJlMC5zZXRUZXh0KCZxdW90O05ldyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciZxdW90Oyk7JiN4QTsmI3hBO3RoaXMuYWRkKG5hbWVkTm9kZU5hbWVGaWd1cmUwKTsmI3hBO3NldEZpZ3VyZU5hbWVkTm9kZU5hbWVGaWd1cmUobmFtZWROb2RlTmFtZUZpZ3VyZTApOyYjeEE7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZOYW1lZE5vZGVOYW1lRmlndXJlOyAmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVOYW1lZE5vZGVOYW1lRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmTmFtZWROb2RlTmFtZUZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVOYW1lZE5vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEE7JiN4OTsmI3g5O2ZOYW1lZE5vZGVOYW1lRmlndXJlID0gZmlnOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEE7JiN4OTt9JiN4QTsmI3hBO30mI3hBOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Xb3JrUHJvZHVjdE5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDAxIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlTmFtZVZpZXdGYWN0b3J5IgotICAgICAgICAgIGVsZW1lbnRJY29uPSJ0cnVlIj4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlTmFtZWROb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIi8+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPGxpbmtzCi0gICAgICAgIHZpc3VhbElEPSIzMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTGlua0VkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJMaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTGlua1ZpZXdGYWN0b3J5IgotICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJMaW5rQ3JlYXRlQ29tbWFuZCIKLSAgICAgICAgcmVvcmllbnRDb21tYW5kQ2xhc3NOYW1lPSJMaW5rUmVvcmllbnRDb21tYW5kIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRWRnZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkxpbmtFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJMaW5rRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIExpbmtGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Qb2x5bGluZUNvbm5lY3Rpb25FeCB7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBMaW5rRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0RmlsbCh0cnVlKTsmI3hBO3RoaXMuc2V0RmlsbFhPUihmYWxzZSk7JiN4QTt0aGlzLnNldE91dGxpbmUodHJ1ZSk7JiN4QTt0aGlzLnNldE91dGxpbmVYT1IoZmFsc2UpOyYjeEE7dGhpcy5zZXRMaW5lV2lkdGgoMSk7JiN4QTt0aGlzLnNldExpbmVTdHlsZShvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3MuTElORV9TT0xJRCk7JiN4QTsmI3hBOyYjeDk7JiN4OTtzZXRUYXJnZXREZWNvcmF0aW9uKGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUm90YXRhYmxlRGVjb3JhdGlvbiBjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkgeyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24gZGYgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbigpOyYjeEE7ZGYuc2V0RmlsbCh0cnVlKTsmI3hBO2RmLnNldEZpbGxYT1IoZmFsc2UpOyYjeEE7ZGYuc2V0T3V0bGluZSh0cnVlKTsmI3hBO2RmLnNldE91dGxpbmVYT1IoZmFsc2UpOyYjeEE7ZGYuc2V0TGluZVdpZHRoKDEpOyYjeEE7ZGYuc2V0TGluZVN0eWxlKG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljcy5MSU5FX1NPTElEKTsmI3hBO29yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QgcGwgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdCgpOyYjeEE7cGwuYWRkUG9pbnQoZ2V0TWFwTW9kZSgpLkRQdG9MUCgtMSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCgxKSYjeEE7KTsmI3hBO3BsLmFkZFBvaW50KGdldE1hcE1vZGUoKS5EUHRvTFAoMCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSYjeEE7KTsmI3hBO3BsLmFkZFBvaW50KGdldE1hcE1vZGUoKS5EUHRvTFAoLTEpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoLTEpJiN4QTspOyYjeEE7ZGYuc2V0VGVtcGxhdGUocGwpOyYjeEE7ZGYuc2V0U2NhbGUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg3KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDMpJiN4QTspOyYjeEE7JiN4OTsmI3g5O3JldHVybiBkZjsmI3hBOyYjeDk7fSYjeEE7JiN4QTt9JiN4QTsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUeXBlTGlua01vZGVsRmFjZXQiPgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluayIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgICAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rL3NvdXJjZSIvPgotICAgICAgICA8dGFyZ2V0TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rL3RhcmdldCIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDAyIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJMaW5rTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkxpbmtOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJMaW5rTmFtZVZpZXdGYWN0b3J5IgotICAgICAgICAgIGVsZW1lbnRJY29uPSJ0cnVlIj4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgICBjbGFzc05hbWU9IkxpbmtOYW1lRmlndXJlIgotICAgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgTGlua05hbWVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgeyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIExpbmtOYW1lRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldFRleHQoJnF1b3Q7JnF1b3Q7KTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiPgotICAgICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TGFiZWxPZmZzZXRBdHRyaWJ1dGVzIgotICAgICAgICAgICAgICB5PSI0MCIvPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9IgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvbGlua3M+Ci0gICAgPHBhbGV0dGU+Ci0gICAgICA8Z3JvdXBzCi0gICAgICAgICAgdGl0bGU9Im1vZGVsIj4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkNvbnRyb2wgRmxvdyIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IENvbnRyb2wgRmxvdyIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2Z1bGwvb2JqMTYvbGlua19wYWwxNi5naWYiCi0gICAgICAgICAgICBnZW5MaW5rcz0iLy9AZGlhZ3JhbS9AbGlua3MuMCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iV29yayBQcm9kdWN0IERlc2NyaXB0b3IiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiLz4KLSAgICAgIDwvZ3JvdXBzPgotICAgIDwvcGFsZXR0ZT4KLSAgICA8cHJlZmVyZW5jZVBhZ2VzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmRpYWdyYW0uZ2VuZXJhbCIKLSAgICAgICAgbmFtZT0iRGlhZ3JhbSBEaWFncmFtIj4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZGlhZ3JhbS5hcHBlYXJhbmNlIgotICAgICAgICAgIG5hbWU9IkFwcGVhcmFuY2UiCi0gICAgICAgICAga2luZD0iQXBwZWFyYW5jZSIvPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5kaWFncmFtLmNvbm5lY3Rpb25zIgotICAgICAgICAgIG5hbWU9IkNvbm5lY3Rpb25zIgotICAgICAgICAgIGtpbmQ9IkNvbm5lY3Rpb25zIi8+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmRpYWdyYW0ucHJpbnRpbmciCi0gICAgICAgICAgbmFtZT0iUHJpbnRpbmciCi0gICAgICAgICAga2luZD0iUHJpbnRpbmciLz4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZGlhZ3JhbS5ydWxlcnNBbmRHcmlkIgotICAgICAgICAgIG5hbWU9IlJ1bGVycyBBbmQgR3JpZCIKLSAgICAgICAgICBraW5kPSJSdWxlcnNBbmRHcmlkIi8+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmRpYWdyYW0ucGF0aG1hcHMiCi0gICAgICAgICAgbmFtZT0iUGF0aG1hcHMiCi0gICAgICAgICAga2luZD0iUGF0aG1hcHMiLz4KLSAgICA8L3ByZWZlcmVuY2VQYWdlcz4KLSAgPC9kaWFncmFtPgotICA8cGx1Z2luLz4KLSAgPGVkaXRvci8+Ci0gIDxuYXZpZ2F0b3I+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbSIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0iCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICBncm91cE5hbWU9ImxpbmtzIgotICAgICAgICBncm91cEljb249Imljb25zL2xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiCi0gICAgICAgIGdyb3VwTmFtZT0idGFyZ2V0IgotICAgICAgICBncm91cEljb249Imljb25zL2xpbmtUYXJnZXROYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIgotICAgICAgICBncm91cE5hbWU9ImluY29taW5nIGxpbmtzIgotICAgICAgICBncm91cEljb249Imljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIgotICAgICAgICBncm91cE5hbWU9InNvdXJjZSIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rU291cmNlTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiCi0gICAgICAgIGdyb3VwTmFtZT0ib3V0Z29pbmcgbGlua3MiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPgotICA8L25hdmlnYXRvcj4KLSAgPHByb3BlcnR5U2hlZXQ+Ci0gICAgPHRhYnMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByb3BlcnR5VGFiIgotICAgICAgICBpRD0iYXBwZWFyYW5jZSIvPgotICAgIDx0YWJzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcm9wZXJ0eVRhYiIKLSAgICAgICAgaUQ9ImRpYWdyYW0iLz4KLSAgICA8dGFicwotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkN1c3RvbVByb3BlcnR5VGFiIgotICAgICAgICBpRD0iZG9tYWluIgotICAgICAgICBsYWJlbD0iQ29yZSI+Ci0gICAgICA8ZmlsdGVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUeXBlVGFiRmlsdGVyIj4KLSAgICAgICAgPHR5cGVzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc8L3R5cGVzPgotICAgICAgICA8dHlwZXM+b3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0PC90eXBlcz4KLSAgICAgICAgPGdlbmVyYXRlZFR5cGVzPmFic3RyYWN0TmF2aWdhdG9ySXRlbTwvZ2VuZXJhdGVkVHlwZXM+Ci0gICAgICA8L2ZpbHRlcj4KLSAgICA8L3RhYnM+Ci0gIDwvcHJvcGVydHlTaGVldD4KLSAgPGRvbWFpbkdlbk1vZGVsCi0gICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8iLz4KLTwvZ21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvcj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZDIuZ21mbWFwIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkMi5nbWZtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZjFjYzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkMi5nbWZtYXAKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZm1hcDpNYXBwaW5nIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z21mbWFwPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L21hcHBpbmdzLzIuMCIKLSAgICB4bWxuczpnbWZ0b29sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L1Rvb2xEZWZpbml0aW9uIj4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdE5vZGUiLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIgotICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJ3cGRkLmdtZmdyYXBoI05hbWVkTm9kZU5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTmFtZWROb2RlL25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDxjb250ZXh0TWVudQotICAgICAgICAgIGhyZWY9IndwZGQuZ21mdG9vbCMvL0BhbGxNZW51cy4wIi8+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJ3cGRkLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuMSIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0id3BkZC5nbWZncmFwaCNXb3JrUHJvZHVjdE5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxsaW5rcz4KLSAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL0xpbmsiLz4KLSAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciCi0gICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgIGhyZWY9IndwZGQuZ21mZ3JhcGgjTGlua05hbWUiLz4KLSAgICAgIDxmZWF0dXJlcwotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rL25hbWUiLz4KLSAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgPHRvb2wKLSAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICBocmVmPSJ3cGRkLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuMCIvPgotICAgIDxkaWFncmFtTGluawotICAgICAgICBocmVmPSJ3cGRkLmdtZmdyYXBoI0xpbmsiLz4KLSAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rL3NvdXJjZSIvPgotICAgIDxsaW5rTWV0YUZlYXR1cmUKLSAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rL3RhcmdldCIvPgotICA8L2xpbmtzPgotICA8ZGlhZ3JhbT4KLSAgICA8ZGlhZ3JhbUNhbnZhcwotICAgICAgICBocmVmPSJ3cGRkLmdtZmdyYXBoI21vZGVsIi8+Ci0gICAgPGRvbWFpbk1vZGVsCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLyIvPgotICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSIvPgotICAgIDxwYWxldHRlCi0gICAgICAgIGhyZWY9IndwZGQuZ21mdG9vbCMvL0BwYWxldHRlIi8+Ci0gIDwvZGlhZ3JhbT4KLTwvZ21mbWFwOk1hcHBpbmc+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQzLmdtZmdlbiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZDMuZ21mZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mzk5MzUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZDMuZ21mZ2VuCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvciB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZmdlbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9HZW5Nb2RlbC8yLjAiIHBhY2thZ2VOYW1lUHJlZml4PSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkIgotICAgIG1vZGVsSUQ9IldQREQiCi0gICAgc2FtZUZpbGVGb3JEaWFncmFtQW5kTW9kZWw9InRydWUiCi0gICAgZGlhZ3JhbUZpbGVFeHRlbnNpb249IndwZGQiPgotICA8ZGlhZ3JhbQotICAgICAgdmlzdWFsSUQ9Ijc5IgotICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydCIKLSAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbVZpZXdGYWN0b3J5IgotICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICBpY29uUHJvdmlkZXJQcmlvcml0eT0iTG93Ij4KLSAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9EaWFncmFtIi8+Ci0gICAgPGVsZW1lbnRUeXBlCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRIZWxwZXIiLz4KLSAgICA8dmlld21hcAotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXIiLz4KLSAgICA8ZG9tYWluRGlhZ3JhbUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0iLz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBXb3JrUHJvZHVjdE5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTtmaWdfMC5zZXRUZXh0KCZxdW90O05ldyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciZxdW90Oyk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVOYW1lZE5vZGVOYW1lRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmTmFtZWROb2RlTmFtZUZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZU5hbWVkTm9kZU5hbWVGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZk5hbWVkTm9kZU5hbWVGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlTmFtZWROb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZOYW1lZE5vZGVOYW1lRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Xb3JrUHJvZHVjdE5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDAxIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlTmFtZVZpZXdGYWN0b3J5IgotICAgICAgICAgIGVsZW1lbnRJY29uPSJ0cnVlIj4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlTmFtZWROb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIi8+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPGxpbmtzCi0gICAgICAgIHZpc3VhbElEPSIzMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTGlua0VkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJMaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTGlua1ZpZXdGYWN0b3J5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRWRnZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkxpbmtFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJMaW5rRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIExpbmtGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Qb2x5bGluZUNvbm5lY3Rpb25FeCB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgTGlua0ZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRUYXJnZXREZWNvcmF0aW9uKGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbiBjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkgeyYjeEQ7JiN4QTtvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uIGRmID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24oKTsmI3hEOyYjeEE7Ly8gZGlzcGF0Y2hOZXh0PyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QgcGwgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdCgpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoLTEsIDEpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoMCwgMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgtMSwgLTEpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZGYuc2V0VGVtcGxhdGUocGwpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZGYuc2V0U2NhbGUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg3KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgzKSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGRmOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlR5cGVMaW5rTW9kZWxGYWNldCI+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgICAgIDxzb3VyY2VNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvc291cmNlIi8+Ci0gICAgICAgIDx0YXJnZXRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvdGFyZ2V0Ii8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDIiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkxpbmtOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTGlua05hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkxpbmtOYW1lVmlld0ZhY3RvcnkiCi0gICAgICAgICAgZWxlbWVudEljb249InRydWUiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0iTGlua05hbWVGaWd1cmUiCi0gICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBMaW5rTmFtZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgTGlua05hbWVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0VGV4dCgmcXVvdDsmcXVvdDspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpMYWJlbE9mZnNldEF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIHk9IjQwIi8+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH0iCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rL25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9saW5rcz4KLSAgICA8cGFsZXR0ZT4KLSAgICAgIDxncm91cHMKLSAgICAgICAgICB0aXRsZT0ibW9kZWwiPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iQ29udHJvbCBGbG93IgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQ29udHJvbCBGbG93IgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9vYmoxNi9saW5rX3BhbDE2LmdpZiIKLSAgICAgICAgICAgIGdlbkxpbmtzPSIvL0BkaWFncmFtL0BsaW5rcy4wIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIvPgotICAgICAgPC9ncm91cHM+Ci0gICAgPC9wYWxldHRlPgotICA8L2RpYWdyYW0+Ci0gIDxwbHVnaW4KLSAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkIgotICAgICAgbmFtZT0iV29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbSBQbHVnaW4iCi0gICAgICBwcm92aWRlcj0iRVBGIgotICAgICAgcHJpbnRpbmdFbmFibGVkPSJ0cnVlIgotICAgICAgYWN0aXZhdG9yQ2xhc3NOYW1lPSJXUEREaWFncmFtRWRpdG9yUGx1Z2luIi8+Ci0gIDxlZGl0b3IKLSAgICAgIGNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvciIvPgotICA8cHJvcGVydHlTaGVldD4KLSAgICA8dGFicwotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJvcGVydHlUYWIiCi0gICAgICAgIGlEPSJUZXN0aW5nIDEyMyIKLSAgICAgICAgbGFiZWw9IlRlc3RpbmcgMTIzIi8+Ci0gICAgPHRhYnMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByb3BlcnR5VGFiIgotICAgICAgICBpRD0iQWR2YW5jZWQiCi0gICAgICAgIGxhYmVsPSJBZHZhbmNlZCIvPgotICA8L3Byb3BlcnR5U2hlZXQ+Ci0gIDxkb21haW5HZW5Nb2RlbAotICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvIi8+Ci08L2dtZmdlbjpHZW5FZGl0b3JHZW5lcmF0b3I+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwZjA5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFNUQVJUIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJlZmVyZW5jZXMuZ2VuZXJhbD1XUEREIERpYWdyYW0KLXByZWZlcmVuY2VzLmFwcGVhcmFuY2U9QXBwZWFyYW5jZQotcHJlZmVyZW5jZXMuY29ubmVjdGlvbnM9Q29ubmVjdGlvbnMKLXByZWZlcmVuY2VzLnByaW50aW5nPVByaW50aW5nCi1wcmVmZXJlbmNlcy5ydWxlcnNBbmRHcmlkPVJ1bGVycyAmIEdyaWQKLXByZWZlcmVuY2VzLnBhdGhtYXBzPVBhdGggTWFwcwotCi1lZGl0b3JOYW1lPVdQREQgRGlhZ3JhbSBFZGl0b3IKLW5ld1dpemFyZE5hbWU9V1BERCBEaWFncmFtCi1uZXdXaXphcmREZXNjPUNyZWF0ZXMgV1BERCBkaWFncmFtLgotCi1pbml0RGlhZ3JhbUFjdGlvbkxhYmVsPUluaXRpYWxpemUgd3BkZCBkaWFncmFtIGZpbGUKLWxvYWRSZXNvdXJjZUFjdGlvbkxhYmVsPUxvYWQgUmVzb3VyY2UuLi4KLQotbmF2aWdhdG9yQ29udGVudE5hbWU9Ki53cGRkIGRpYWdyYW0gY29udGVudHMKLQotbWV0YXR5cGUubmFtZS5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtXzc5PVVuZGVmaW5lZAotbWV0YXR5cGUubmFtZS5Xb3JrUHJvZHVjdE5vZGVfMTAwMT1Xb3JrUHJvZHVjdE5vZGUKLW1ldGF0eXBlLm5hbWUuTGlua18zMDAxPUxpbmsKLQotdGFiLlRlc3RpbmcuMTIzPVRlc3RpbmcgMTIzCi10YWIuQWR2YW5jZWQ9QWR2YW5jZWQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEVORCBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotCi1wbHVnaW5OYW1lPUVQRiBXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotCi0jIE5lZWQgdHJhbnNsYXRpb24KLWVsZW1lbnRfdHlwZV9jb250cm9sX2Zsb3c9Q29udHJvbCBGbG93Ci1lbGVtZW50X3R5cGVfd29ya3Byb2R1Y3RfZGVzY3JpcHRvcj1Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmZhYjhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotICAgICAgPGluaXRpYWxpemVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbURpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5maWxlVHlwZXMiPgotICAgICAgPGZpbGVUeXBlcwotICAgICAgICAgdHlwZT0idGV4dCIKLSAgICAgICAgIGV4dGVuc2lvbj0id3BkZCI+Ci0gICAgICA8L2ZpbGVUeXBlcz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5leHRlbnNpb25fcGFyc2VyIj4KLSAgICAgIDxwYXJzZXIKLSAgICAgICAgIHR5cGU9IndwZGQiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUucmVzb3VyY2VzLkdNRlJlc291cmNlRmFjdG9yeSI+Ci0gICAgICA8L3BhcnNlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgIDwhLS0KLSAgICAgPGVkaXRvcgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3JJRCIKLSAgICAgICAgbmFtZT0iV1BERCBEaWFncmFtIEVkaXRvciIKLSAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvTW9kZWxEaWFncmFtRmlsZS5naWYiCi0gICAgICAgIGV4dGVuc2lvbnM9IndwZGQiCi0gICAgICAgIGRlZmF1bHQ9InRydWUiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvciIKLSAgICAgICAgbWF0Y2hpbmdTdHJhdGVneT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1NYXRjaGluZ1N0cmF0ZWd5IgotICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbURpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvciI+Ci0gICAgIDwvZWRpdG9yPgotICAgICAtLT4KLSAgICAgPGVkaXRvcgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3JJRCIKLSAgICAgICAgbmFtZT0iV29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbSBFZGl0b3IiCi0gICAgICAgIGljb249Imljb25zL2Z1bGwvZXRvb2wxNi9XUERERWRpdG9yLmdpZiIKLSAgICAgICAgZXh0ZW5zaW9ucz0id3BkZCIKLSAgICAgICAgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yIgotICAgICAgICBtYXRjaGluZ1N0cmF0ZWd5PSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbU1hdGNoaW5nU3RyYXRlZ3kiCi0gICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yIj4KLSAgICAgPC9lZGl0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLQotCTwhLS0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAJICA8d2l6YXJkCi0gIAkgICAgIG5hbWU9IldQREQgRGlhZ3JhbSIKLSAgCSAgICAgaWNvbj0iaWNvbnMvb2JqMTYvTW9kZWxEaWFncmFtRmlsZS5naWYiCi0gIAkgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5FeGFtcGxlcyIKLSAgCSAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtQ3JlYXRpb25XaXphcmQiCi0gIAkgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbUNyZWF0aW9uV2l6YXJkSUQiPgotICAJICAJIDxkZXNjcmlwdGlvbj4KLSAgCSAgCQlDcmVhdGVzIFdQREQgZGlhZ3JhbS4KLSAgCSAgCSA8L2Rlc2NyaXB0aW9uPiAgCi0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgLS0+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotICAgICA8IS0tIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnVpLm9iamVjdENvbnRyaWJ1dGlvbi5JRmlsZTEiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLm1vZGVsIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJJbml0aWFsaXplIHdwZGQgZGlhZ3JhbSBmaWxlIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25JRCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAgCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9ImZhbHNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQudWkub2JqZWN0Q29udHJpYnV0aW9uLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydDIiCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1Mb2FkUmVzb3VyY2VBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtTG9hZFJlc291cmNlQWN0aW9uSUQiCi0gICAgICAgICAgICAgICBsYWJlbD0iTG9hZCBSZXNvdXJjZS4uLiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gIAotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuRGVsZXRlRGlhZ3JhbSIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuRGVsZXRlRGlhZ3JhbUFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLkRlbGV0ZURpYWdyYW1BY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJURlbGV0ZURpYWdyYW1fdGV4dCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBzdGF0ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVEZWxldGVEaWFncmFtX3RleHQiLz4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgYWRhcHRhYmxlPSJmYWxzZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLlJlZnJlc2hGcm9tQmFzZUFjdGlvbiIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuUmVmcmVzaEZyb21CYXNlQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuUmVmcmVzaEZyb21CYXNlQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVyZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHN0YXRlPSJmYWxzZSIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJXJlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQiLz4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgYWRhcHRhYmxlPSJmYWxzZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLlJlZnJlc2hBY3Rpb24iCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLlJlZnJlc2hBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5SZWZyZXNoQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVyZWZyZXNoX3RleHQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3RhdGU9ImZhbHNlIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlcmVmcmVzaF90ZXh0Ii8+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gICAtLT4gICAgICAgICAgICAgICAgICAgCi0gIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuYWN0aW9uLmNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcnMiPgotICAgICAgPGNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnMuRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93Ij4KLSAgICAgICAgIDwvUHJpb3JpdHk+Ci0gICAgICAgICA8cGFydENvbnRyaWJ1dGlvbiBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3JJRCI+Ci0gICAgICAgICAgICA8cGFydEFjdGlvbiBtZW51YmFyUGF0aD0iL2ZpbGUvcHJpbnQiIGlkPSJwcmludFByZXZpZXdBY3Rpb24iPgotICAgICAgICAgICAgPC9wYXJ0QWN0aW9uPgotICAgICAgICAgPC9wYXJ0Q29udHJpYnV0aW9uPgotICAgICAgPC9jb250cmlidXRpb25JdGVtUHJvdmlkZXI+Ci0gICAgIDwhLS0gPGNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIiCi0gICAgICAgICAgICBjaGVja1BsdWdpbkxvYWRlZD0iZmFsc2UiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9IkxvdyIvPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdE5vZGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLkxpbmtOYW1lRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbU1vZGVsQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICA8L2NvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcj4KLSAgICAgIC0tPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5hY3Rpb24uZ2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVycyI+Ci0gICAgICA8R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlciIKLSAgICAgICAgIGlkPSJXUEREUHJlc2VudGF0aW9uIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxWaWV3SWQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJkZWxldGUiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydCI+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9InNhdmUiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICA8L1ZpZXdJZD4KLSAgICAgIDwvR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyPgotICAgICAgPEdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcucmVuZGVyLnByb3ZpZGVycy5EaWFncmFtV2l0aFByaW50R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyIgotICAgICAgICAgaWQ9IldQRERQcmVzZW50YXRpb25QcmludCI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Vmlld0lkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvcklEIj4KLSAgICAgICAgICAgIDxFbGVtZW50VHlwZSBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ij4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0icHJpbnQiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICA8L1ZpZXdJZD4KLSAgICAgIDwvR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyPgotICAgICAgPEdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLmlkZS5wcm92aWRlcnMuRGlhZ3JhbUlERUdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlciIKLSAgICAgICAgIGlkPSJXUEREUHJlc2VudGF0aW9uSURFIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxWaWV3SWQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJib29rbWFyayIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgIDwvVmlld0lkPgotICAgICAgPC9HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXI+Ci0gICAgICA8IS0tCi0gICAgICA8R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZW5kZXIucHJvdmlkZXJzLkRpYWdyYW1VSVJlbmRlckdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlciIKLSAgICAgICAgICAgIGlkPSJXUEREUmVuZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxWaWV3SWQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJjdXQiLz4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0iY29weSIvPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJwYXN0ZSIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgIDwvVmlld0lkPgotICAgICAgPC9HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXI+Ci0gICAgICAtLT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudmlld1Byb3ZpZGVycyI+Ci0gICAgICA8dmlld1Byb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVycy5EaWFncmFtVmlld1Byb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxjb250ZXh0IHZpZXdDbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSIgc2VtYW50aWNIaW50cz0iV1BERCIvPgotICAgICAgICAgPGNvbnRleHQgdmlld0NsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIiBzZW1hbnRpY0hpbnRzPSIiLz4KLSAgICAgICAgIDxjb250ZXh0IHZpZXdDbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZSIgc2VtYW50aWNIaW50cz0iIi8+Ci0gICAgICA8L3ZpZXdQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0UHJvdmlkZXJzIj4KLSAgICAgIDxlZGl0cGFydFByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVycy5EaWFncmFtRWRpdFBhcnRQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICA8L2VkaXRwYXJ0UHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYWxldHRlUHJvdmlkZXJzIj4KLSAgICAgIDxwYWxldHRlUHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzLkRpYWdyYW1QYWxldHRlUHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPGVkaXRvciBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3JJRCIvPgotICAgICAgPC9wYWxldHRlUHJvdmlkZXI+Ci0gICAgICA8cGFsZXR0ZVByb3ZpZGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGVmYXVsdFBhbGV0dGVQcm92aWRlciI+Ci0gICAgICAgIDxQcmlvcml0eSBuYW1lPSJNZWRpdW0iLz4KLSAgICAgICAgPGVkaXRvciBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3JJRCIvPgotICAgICAgICA8Y29udHJpYnV0aW9uPgotICAgICAgICAgICAgPHByZWRlZmluZWRFbnRyeSAgICAKLSAgICAgICAgICAgIAlpZD0iZ2Vvc2hhcGVEcmF3ZXIiICAgcGF0aD0iLyI+Ci0gICAgICAgICAgICAJPGV4cGFuZCBmb3JjZT0idHJ1ZSIvPgotICAgICAgICAgICAgIDwvcHJlZGVmaW5lZEVudHJ5PiAKLSAgICAgICAgPC9jb250cmlidXRpb24+Ci0gICAgICA8L3BhbGV0dGVQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkubW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlcnMiPgotICAgICAgPG1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzLkRpYWdyYW1Nb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgIDwvbW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucHJvcGVydGllcy5wcm9wZXJ0aWVzUHJvdmlkZXJzIj4KLSAgICAgIDxQcm9wZXJ0aWVzUHJvdmlkZXIKLSAgICAgICAgICAgIHZlcmlmeVBsdWdpbkxvYWRlZD0iZmFsc2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnMuRGlhZ3JhbVByb3BlcnR5UHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgPC9Qcm9wZXJ0aWVzUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmljb25Qcm92aWRlcnMiPgotICAgICAgPEljb25Qcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnMuRGlhZ3JhbUljb25Qcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93Ii8+Ci0gICAgICA8L0ljb25Qcm92aWRlcj4KLSAgICAgIDxJY29uUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmdlb3NoYXBlcy5pbnRlcm5hbC5wcm92aWRlcnMuR2VvU2hhcGVJY29uUHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5Ci0gICAgICAgICAgICAgICBuYW1lPSJNZWRpdW0iPgotICAgICAgICAgPC9Qcmlvcml0eT4KLSAgICAgICAgIDxvYmplY3QgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXcob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24pIiBpZD0iR2VvU2hhcGUiPgotICAgICAgICAJIDxtZXRob2QgbmFtZT0iZ2V0VHlwZSgpIiB2YWx1ZT0ib3ZhbCx0cmlhbmdsZSxyZWN0YW5nbGUsc2hhZG93UmVjdGFuZ2xlLHJlY3RhbmdsZTNELHJvdW5kUmVjdGFuZ2xlLGhleGFnb24sb2N0YWdvbixwZW50YWdvbixkaWFtb25kLGN5bGluZGVyLGxpbmUiLz4KLQkgICAgIDwvb2JqZWN0PgotICAgICAgICAgPGNvbnRleHQgZWxlbWVudHM9Ikdlb1NoYXBlIj4KLSAgICAgICAgIDwvY29udGV4dD4KLSAgICAgIDwvSWNvblByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXJQcm92aWRlcnMiPgotICAgICAgPFBhcnNlclByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVycy5EaWFncmFtUGFyc2VyUHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgPC9QYXJzZXJQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVsZW1lbnRUeXBlcyI+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV83OSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0iCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQuaGVscGVycy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iNzkiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLldvcmtQcm9kdWN0Tm9kZV8xMDAxIgotICAgICAgICAgICAgICAgbmFtZT0iJWVsZW1lbnRfdHlwZV93b3JrcHJvZHVjdF9kZXNjcmlwdG9yIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iV29ya1Byb2R1Y3ROb2RlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmhlbHBlcnMuV29ya1Byb2R1Y3ROb2RlRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAwMSIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuTGlua18zMDAxIgotICAgICAgICAgICAgICAgbmFtZT0iJWVsZW1lbnRfdHlwZV9jb250cm9sX2Zsb3ciCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJMaW5rIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmhlbHBlcnMuTGlua0VkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwMDEiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZWxlbWVudFR5cGVCaW5kaW5ncyI+Ci0gICAgICA8Y2xpZW50Q29udGV4dCBpZD0iV1BERENsaWVudENvbnRleHQiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLmVkaXRpbmdEb21haW4iCi0gICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uRWRpdGluZ0RvbWFpbiIvPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9jbGllbnRDb250ZXh0PiAKLSAgICAgIDxiaW5kaW5nIGNvbnRleHQ9IldQRERDbGllbnRDb250ZXh0Ij4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV83OSIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5Xb3JrUHJvZHVjdE5vZGVfMTAwMSIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5MaW5rXzMwMDEiLz4KLSAgICAgICAgIDxhZHZpY2UgcmVmPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuYWR2aWNlLm5vdGF0aW9uRGVwZGVuZGVudHMiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSBwYXR0ZXJuPSIuKiIvPgotICAgICAgPC9iaW5kaW5nPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2NvbW1hbmRzL0RpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2NvbW1hbmRzL0RpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjA2MmYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9jb21tYW5kcy9EaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCBleHRlbmRzCi0JCUFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSUFkYXB0YWJsZSBlZGdlQWRhcHRvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kKAotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGVkaXRpbmdEb21haW4sIGxhYmVsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWZmZWN0ZWRGaWxlcygpIHsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGVkZ2VBZGFwdG9yLmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7Ci0JCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRXb3Jrc3BhY2VGaWxlcyh2aWV3KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRGaWxlcygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUFkYXB0YWJsZSBnZXRFZGdlQWRhcHRvcigpIHsKLQkJcmV0dXJuIGVkZ2VBZGFwdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGdlQWRhcHRvcihJQWRhcHRhYmxlIGVkZ2VBZGFwdG9yKSB7Ci0JCXRoaXMuZWRnZUFkYXB0b3IgPSBlZGdlQWRhcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdCgKLQkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHsKLQkJYXNzZXJ0IG51bGwgIT0gZWRnZUFkYXB0b3IgOiAiTnVsbCBjaGlsZCBpbiBEaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQiOyAvLyROT04tTkxTLTEkCi0JCUVkZ2UgZWRnZSA9IChFZGdlKSBnZXRFZGdlQWRhcHRvcigpLmdldEFkYXB0ZXIoRWRnZS5jbGFzcyk7Ci0JCWFzc2VydCBudWxsICE9IGVkZ2UgOiAiTnVsbCBlZGdlIGluIERpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCI7IC8vJE5PTi1OTFMtMSQKLQotCQlWaWV3IHRlbXBWaWV3ID0gZWRnZS5nZXRTb3VyY2UoKTsKLQkJZWRnZS5zZXRTb3VyY2UoZWRnZS5nZXRUYXJnZXQoKSk7Ci0JCWVkZ2Uuc2V0VGFyZ2V0KHRlbXBWaWV3KTsKLQotCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvY29tbWFuZHMvTGlua0NyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9jb21tYW5kcy9MaW5rQ3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2RmODJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9jb21tYW5kcy9MaW5rQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtDcmVhdGVDb21tYW5kIGV4dGVuZHMgQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBOb2RlIG15Q29udGFpbmVyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTm9kZSBteVNvdXJjZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE5vZGUgbXlUYXJnZXQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpbmtDcmVhdGVDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxLCBOb2RlIGNvbnRhaW5lciwKLQkJCU5vZGUgc291cmNlLCBOb2RlIHRhcmdldCkgewotCQlzdXBlcihyZXEpOwotCQlzdXBlci5zZXRFbGVtZW50VG9FZGl0KGNvbnRhaW5lcik7Ci0JCW15Q29udGFpbmVyID0gY29udGFpbmVyOwotCQlteVNvdXJjZSA9IHNvdXJjZTsKLQkJbXlUYXJnZXQgPSB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb2RlIGdldENvbnRhaW5lcigpIHsKLQkJcmV0dXJuIG15Q29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRTb3VyY2UoKSB7Ci0JCXJldHVybiBteVNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gbXlUYXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEVsZW1lbnRUb0VkaXQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCUxpbmsgbmV3RWxlbWVudCA9IChMaW5rKSBzdXBlci5kb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKTsKLQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJbmV3RWxlbWVudC5zZXRUYXJnZXQobXlUYXJnZXQpOwotCQkJbmV3RWxlbWVudC5zZXRTb3VyY2UobXlTb3VyY2UpOwotCQl9Ci0JCXJldHVybiBuZXdFbGVtZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2NvbW1hbmRzL0xpbmtSZW9yaWVudENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9jb21tYW5kcy9MaW5rUmVvcmllbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOGY3ZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2NvbW1hbmRzL0xpbmtSZW9yaWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzLkRpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua1Jlb3JpZW50Q29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgcmVvcmllbnREaXJlY3Rpb247Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBFT2JqZWN0IG9sZEVuZDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIEVPYmplY3QgbmV3RW5kOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaW5rUmVvcmllbnRDb21tYW5kKFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXN1cGVyKHJlcXVlc3QuZ2V0TGFiZWwoKSwgcmVxdWVzdC5nZXRSZWxhdGlvbnNoaXAoKSwgcmVxdWVzdCk7Ci0JCXJlb3JpZW50RGlyZWN0aW9uID0gcmVxdWVzdC5nZXREaXJlY3Rpb24oKTsKLQkJb2xkRW5kID0gcmVxdWVzdC5nZXRPbGRSZWxhdGlvbnNoaXBFbmQoKTsKLQkJbmV3RW5kID0gcmVxdWVzdC5nZXROZXdSZWxhdGlvbnNoaXBFbmQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJaWYgKCEoZ2V0RWxlbWVudFRvRWRpdCgpIGluc3RhbmNlb2YgTGluaykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAocmVvcmllbnREaXJlY3Rpb24gPT0gUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0LlJFT1JJRU5UX1NPVVJDRSkgewotCQkJcmV0dXJuIGNhblJlb3JpZW50U291cmNlKCk7Ci0JCX0KLQkJaWYgKHJlb3JpZW50RGlyZWN0aW9uID09IFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdC5SRU9SSUVOVF9UQVJHRVQpIHsKLQkJCXJldHVybiBjYW5SZW9yaWVudFRhcmdldCgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuUmVvcmllbnRTb3VyY2UoKSB7Ci0JCWlmICghKG9sZEVuZCBpbnN0YW5jZW9mIE5vZGUgJiYgbmV3RW5kIGluc3RhbmNlb2YgTm9kZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlOb2RlIHRhcmdldCA9IGdldExpbmsoKS5nZXRUYXJnZXQoKTsKLQkJaWYgKCEoZ2V0TGluaygpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIE5vZGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZ2V0TGluaygpLmVDb250YWluZXIoKTsKLQkJcmV0dXJuIERpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuRXhpc3RMaW5rXzMwMDEoY29udGFpbmVyLCBnZXROZXdTb3VyY2UoKSwgdGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuUmVvcmllbnRUYXJnZXQoKSB7Ci0JCWlmICghKG9sZEVuZCBpbnN0YW5jZW9mIE5vZGUgJiYgbmV3RW5kIGluc3RhbmNlb2YgTm9kZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlOb2RlIHNvdXJjZSA9IGdldExpbmsoKS5nZXRTb3VyY2UoKTsKLQkJaWYgKCEoZ2V0TGluaygpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIE5vZGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZ2V0TGluaygpLmVDb250YWluZXIoKTsKLQkJcmV0dXJuIERpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuRXhpc3RMaW5rXzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIGdldE5ld1RhcmdldCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlpZiAoIWNhbkV4ZWN1dGUoKSkgewotCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigKLQkJCQkJIkludmFsaWQgYXJndW1lbnRzIGluIHJlb3JpZW50IGxpbmsgY29tbWFuZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHJlb3JpZW50RGlyZWN0aW9uID09IFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdC5SRU9SSUVOVF9TT1VSQ0UpIHsKLQkJCXJldHVybiByZW9yaWVudFNvdXJjZSgpOwotCQl9Ci0JCWlmIChyZW9yaWVudERpcmVjdGlvbiA9PSBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QuUkVPUklFTlRfVEFSR0VUKSB7Ci0JCQlyZXR1cm4gcmVvcmllbnRUYXJnZXQoKTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IHJlb3JpZW50U291cmNlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWdldExpbmsoKS5zZXRTb3VyY2UoZ2V0TmV3U291cmNlKCkpOwotCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoZ2V0TGluaygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgcmVvcmllbnRUYXJnZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJZ2V0TGluaygpLnNldFRhcmdldChnZXROZXdUYXJnZXQoKSk7Ci0JCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChnZXRMaW5rKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGluayBnZXRMaW5rKCkgewotCQlyZXR1cm4gKExpbmspIGdldEVsZW1lbnRUb0VkaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgZ2V0T2xkU291cmNlKCkgewotCQlyZXR1cm4gKE5vZGUpIG9sZEVuZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgZ2V0TmV3U291cmNlKCkgewotCQlyZXR1cm4gKE5vZGUpIG5ld0VuZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgZ2V0T2xkVGFyZ2V0KCkgewotCQlyZXR1cm4gKE5vZGUpIG9sZEVuZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgZ2V0TmV3VGFyZ2V0KCkgewotCQlyZXR1cm4gKE5vZGUpIG5ld0VuZDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvY29tbWFuZHMvV29ya1Byb2R1Y3ROb2RlQ3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2NvbW1hbmRzL1dvcmtQcm9kdWN0Tm9kZUNyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3YzVlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvY29tbWFuZHMvV29ya1Byb2R1Y3ROb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3ROb2RlQ3JlYXRlQ29tbWFuZCBleHRlbmRzIENyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3ROb2RlQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJc3VwZXIocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJLmdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJTmFtZWROb2RlIG5ld05vZGUgPSAoTmFtZWROb2RlKXN1cGVyLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQlEaWFncmFtIGRpYWdyYW0gPW5ld05vZGUuZ2V0RGlhZ3JhbSgpOwotCQlkaWFncmFtLnNldERlZmF1bHROYW1lKG5ld05vZGUpOwotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvaGVscGVycy9EaWFncmFtQmFzZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9oZWxwZXJzL0RpYWdyYW1CYXNlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzhkNDUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9oZWxwZXJzL0RpYWdyYW1CYXNlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmhlbHBlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbXBvc2l0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVkaXRoZWxwZXIuQWJzdHJhY3RFZGl0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveVJlZmVyZW5jZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5JRWRpdENvbW1hbmRSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1CYXNlRWRpdEhlbHBlciBleHRlbmRzIEFic3RyYWN0RWRpdEhlbHBlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9QT0xJQ1lfQ09NTUFORCA9ICJlZGl0IHBvbGljeSBjb21tYW5kIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRJbnN0ZWFkQ29tbWFuZChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcSkgewotCQlJQ29tbWFuZCBlcENvbW1hbmQgPSAoSUNvbW1hbmQpIHJlcS5nZXRQYXJhbWV0ZXIoRURJVF9QT0xJQ1lfQ09NTUFORCk7Ci0JCXJlcS5zZXRQYXJhbWV0ZXIoRURJVF9QT0xJQ1lfQ09NTUFORCwgbnVsbCk7Ci0JCUlDb21tYW5kIGVoQ29tbWFuZCA9IHN1cGVyLmdldEluc3RlYWRDb21tYW5kKHJlcSk7Ci0JCWlmIChlcENvbW1hbmQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGVoQ29tbWFuZDsKLQkJfQotCQlpZiAoZWhDb21tYW5kID09IG51bGwpIHsKLQkJCXJldHVybiBlcENvbW1hbmQ7Ci0JCX0KLQkJQ29tcG9zaXRlQ29tbWFuZCBjb21tYW5kID0gbmV3IENvbXBvc2l0ZUNvbW1hbmQobnVsbCk7Ci0JCWNvbW1hbmQuYWRkKGVwQ29tbWFuZCk7Ci0JCWNvbW1hbmQuYWRkKGVoQ29tbWFuZCk7Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKERlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2hlbHBlcnMvTGlua0VkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9oZWxwZXJzL0xpbmtFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NzlkMzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2hlbHBlcnMvTGlua0VkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtFZGl0SGVscGVyIGV4dGVuZHMgRGlhZ3JhbUJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvaGVscGVycy9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2hlbHBlcnMvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA4MTg3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvaGVscGVycy9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRIZWxwZXIgZXh0ZW5kcwotCQlEaWFncmFtQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9oZWxwZXJzL1dvcmtQcm9kdWN0Tm9kZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9oZWxwZXJzL1dvcmtQcm9kdWN0Tm9kZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmMDI3Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvaGVscGVycy9Xb3JrUHJvZHVjdE5vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVFZGl0SGVscGVyIGV4dGVuZHMgRGlhZ3JhbUJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL0RpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkNGUwMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FZGl0UGFydEZhY3RvcnkgaW1wbGVtZW50cyBFZGl0UGFydEZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpIHsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotCQkJVmlldyB2aWV3ID0gKFZpZXcpIG1vZGVsOwotCQkJc3dpdGNoIChEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KSkgewotCi0JCQljYXNlIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IFdvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBMaW5rRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgTGlua0VkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIExpbmtOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgTGlua05hbWVFZGl0UGFydCh2aWV3KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY3JlYXRlVW5yZWNvZ25pemVkRWRpdFBhcnQoY29udGV4dCwgbW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVkaXRQYXJ0IGNyZWF0ZVVucmVjb2duaXplZEVkaXRQYXJ0KEVkaXRQYXJ0IGNvbnRleHQsIE9iamVjdCBtb2RlbCkgewotCQkvLyBIYW5kbGUgY3JlYXRpb24gb2YgdW5yZWNvZ25pemVkIGNoaWxkIG5vZGUgRWRpdFBhcnRzIGhlcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2VsbEVkaXRvckxvY2F0b3IgZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKAotCQkJSVRleHRBd2FyZUVkaXRQYXJ0IHNvdXJjZSkgewotCQlpZiAoc291cmNlLmdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKQotCQkJcmV0dXJuIG5ldyBUZXh0Q2VsbEVkaXRvckxvY2F0b3IoKFdyYXBMYWJlbCkgc291cmNlLmdldEZpZ3VyZSgpKTsKLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IExhYmVsQ2VsbEVkaXRvckxvY2F0b3IoKExhYmVsKSBzb3VyY2UuZ2V0RmlndXJlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXN0YXRpYyBwcml2YXRlIGNsYXNzIFRleHRDZWxsRWRpdG9yTG9jYXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3JMb2NhdG9yIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgd3JhcExhYmVsOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgVGV4dENlbGxFZGl0b3JMb2NhdG9yKFdyYXBMYWJlbCB3cmFwTGFiZWwpIHsKLQkJCXRoaXMud3JhcExhYmVsID0gd3JhcExhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXcmFwTGFiZWwgZ2V0V3JhcExhYmVsKCkgewotCQkJcmV0dXJuIHdyYXBMYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZWxvY2F0ZShDZWxsRWRpdG9yIGNlbGxlZGl0b3IpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBjZWxsZWRpdG9yLmdldENvbnRyb2woKTsKLQkJCVJlY3RhbmdsZSByZWN0ID0gZ2V0V3JhcExhYmVsKCkuZ2V0VGV4dEJvdW5kcygpLmdldENvcHkoKTsKLQkJCWdldFdyYXBMYWJlbCgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocmVjdCk7Ci0JCQlpZiAoZ2V0V3JhcExhYmVsKCkuaXNUZXh0V3JhcHBlZCgpCi0JCQkJCSYmIGdldFdyYXBMYWJlbCgpLmdldFRleHQoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlyZWN0LnNldFNpemUobmV3IERpbWVuc2lvbih0ZXh0LmNvbXB1dGVTaXplKHJlY3Qud2lkdGgsCi0JCQkJCQlTV1QuREVGQVVMVCkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW50IGF2ciA9IEZpZ3VyZVV0aWxpdGllcy5nZXRGb250TWV0cmljcyh0ZXh0LmdldEZvbnQoKSkKLQkJCQkJCS5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci0JCQkJcmVjdC5zZXRTaXplKG5ldyBEaW1lbnNpb24odGV4dC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwKLQkJCQkJCVNXVC5ERUZBVUxUKSkuZXhwYW5kKGF2ciAqIDIsIDApKTsKLQkJCX0KLQkJCWlmICghcmVjdC5lcXVhbHMobmV3IFJlY3RhbmdsZSh0ZXh0LmdldEJvdW5kcygpKSkpIHsKLQkJCQl0ZXh0LnNldEJvdW5kcyhyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGFiZWxDZWxsRWRpdG9yTG9jYXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3JMb2NhdG9yIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIExhYmVsQ2VsbEVkaXRvckxvY2F0b3IoTGFiZWwgbGFiZWwpIHsKLQkJCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTGFiZWwgZ2V0TGFiZWwoKSB7Ci0JCQlyZXR1cm4gbGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKSB7Ci0JCQlUZXh0IHRleHQgPSAoVGV4dCkgY2VsbGVkaXRvci5nZXRDb250cm9sKCk7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGdldExhYmVsKCkuZ2V0VGV4dEJvdW5kcygpLmdldENvcHkoKTsKLQkJCWdldExhYmVsKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShyZWN0KTsKLQkJCWludCBhdnIgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3ModGV4dC5nZXRGb250KCkpCi0JCQkJCS5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci0JCQlyZWN0LnNldFNpemUobmV3IERpbWVuc2lvbih0ZXh0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULAotCQkJCQlTV1QuREVGQVVMVCkpLmV4cGFuZChhdnIgKiAyLCAwKSk7Ci0JCQlpZiAoIXJlY3QuZXF1YWxzKG5ldyBSZWN0YW5nbGUodGV4dC5nZXRCb3VuZHMoKSkpKSB7Ci0JCQkJdGV4dC5zZXRCb3VuZHMocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9EaWFncmFtRXh0Tm9kZUxhYmVsRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9EaWFncmFtRXh0Tm9kZUxhYmVsRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg2ZTllYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvRGlhZ3JhbUV4dE5vZGVMYWJlbEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTGFiZWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuTGFiZWxMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FeHROb2RlTGFiZWxFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtRXh0Tm9kZUxhYmVsRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoQm91bmRzKCkgewotCQlJRmlndXJlIHJlZkZpZ3VyZSA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5nZXRGaWd1cmUoKTsKLQkJaW50IGR4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IGR5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsKLQkJUG9pbnQgb2Zmc2V0ID0gbmV3IFBvaW50KGR4LCBkeSk7Ci0JCWdldEZpZ3VyZSgpLmdldFBhcmVudCgpLnNldENvbnN0cmFpbnQoZ2V0RmlndXJlKCksCi0JCQkJbmV3IExhYmVsTG9jYXRvcihyZWZGaWd1cmUsIG9mZnNldCwgZ2V0S2V5UG9pbnQoKSkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJlbG9jYXRlKElGaWd1cmUgdGFyZ2V0KSB7Ci0JCQkJCQlQb2ludCBsb2NhdGlvbiA9IGdldFJlZmVyZW5jZVBvaW50KCkuZ2V0VHJhbnNsYXRlZCgKLQkJCQkJCQkJZ2V0T2Zmc2V0KCkpOwotCQkJCQkJbG9jYXRpb24udHJhbnNsYXRlKC10YXJnZXQuZ2V0Qm91bmRzKCkud2lkdGggLyAyLCAwKTsKLQkJCQkJCXRhcmdldC5zZXRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCQkJCQl0YXJnZXQuc2V0U2l6ZShuZXcgRGltZW5zaW9uKAotCQkJCQkJCQl0YXJnZXQuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoLCB0YXJnZXQKLQkJCQkJCQkJCQkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCkpOwotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIFBvaW50IGdldFJlZmVyZW5jZVBvaW50KCkgewotCQkJCQkJcmV0dXJuIGdldExhYmVsTG9jYXRpb24ocGFyZW50KTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0UmVmZXJlbmNlUG9pbnQoKSB7Ci0JCXJldHVybiBnZXRMYWJlbExvY2F0aW9uKCgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5nZXRGaWd1cmUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCBnZXRMYWJlbExvY2F0aW9uKElGaWd1cmUgcGFyZW50KSB7Ci0JCXJldHVybiBwYXJlbnQuZ2V0Qm91bmRzKCkuZ2V0Qm90dG9tKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL0xpbmtFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL0xpbmtFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmI5ZjUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9MaW5rRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuUG9seWxpbmVDb25uZWN0aW9uRXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXMuTGlua0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db25uZWN0aW9uTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rRWRpdFBhcnQgZXh0ZW5kcyBDb25uZWN0aW9uTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaW5rRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBMaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uRmlndXJlKCkgewotCi0JCXJldHVybiBuZXcgTGlua0ZpZ3VyZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTGlua0ZpZ3VyZSBleHRlbmRzIFBvbHlsaW5lQ29ubmVjdGlvbkV4IHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIExpbmtGaWd1cmUoKSB7Ci0KLQkJCXNldFRhcmdldERlY29yYXRpb24oY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFBvbHlsaW5lRGVjb3JhdGlvbiBjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkgewotCQkJUG9seWxpbmVEZWNvcmF0aW9uIGRmID0gbmV3IFBvbHlsaW5lRGVjb3JhdGlvbigpOwotCQkJLy8gZGlzcGF0Y2hOZXh0PwotCi0JCQlQb2ludExpc3QgcGwgPSBuZXcgUG9pbnRMaXN0KCk7Ci0JCQlwbC5hZGRQb2ludCgtMSwgMSk7Ci0JCQlwbC5hZGRQb2ludCgwLCAwKTsKLQkJCXBsLmFkZFBvaW50KC0xLCAtMSk7Ci0JCQlkZi5zZXRUZW1wbGF0ZShwbCk7Ci0JCQlkZi5zZXRTY2FsZShnZXRNYXBNb2RlKCkuRFB0b0xQKDcpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDMpKTsKLQotCQkJcmV0dXJuIGRmOwotCQl9Ci0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsKLQkJQ29sb3Igb3ZlcnJpZGVDb2xvciA9IERpYWdyYW1Db3JlVXRpbC5nZXRMaW5rT3ZlcnJpZGVDb2xvcigoRWRnZSkgZ2V0TW9kZWwoKSk7Ci0JCXN1cGVyLnNldEZvcmVncm91bmRDb2xvcihvdmVycmlkZUNvbG9yICE9IG51bGwgPyBvdmVycmlkZUNvbG9yIDogY29sb3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL0xpbmtOYW1lRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9MaW5rTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZDA0MjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL0xpbmtOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXMuRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVycy5EaWFncmFtRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua05hbWVFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgaW1wbGVtZW50cwotCQlJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXN0YXRpYyB7Ci0JCXJlZ2lzdGVyU25hcEJhY2tQb3NpdGlvbihEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKExpbmtOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwgbmV3IFBvaW50KDAsIDQwKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaW5rTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRLZXlQb2ludCgpIHsKLQkJcmV0dXJuIENvbm5lY3Rpb25Mb2NhdG9yLk1JRERMRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKElGaWd1cmUgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICogCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJLy8JCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCS8vCQkJCS5nZXRJdGVtSW1hZ2VEZXNjcmlwdG9yKGdldFBhcnNlckVsZW1lbnQoKSk7Ci0JCS8vCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCS8vCQkJZGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCS8vCQl9Ci0JCS8vCQlyZXR1cm4gZGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIERpYWdyYW1FbGVtZW50VHlwZXMuTGlua18zMDAxOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwgRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeQotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoc3R5bGUpOwotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJSUZpZ3VyZSBsYWJlbCA9IGNyZWF0ZUZpZ3VyZVByaW0oKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIobGFiZWwpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZVByaW0oKSB7Ci0JCXJldHVybiBuZXcgTGlua05hbWVGaWd1cmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIExpbmtOYW1lRmlndXJlIGV4dGVuZHMgV3JhcExhYmVsIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIExpbmtOYW1lRmlndXJlKCkgewotCi0JCQl0aGlzLnNldFRleHQoIiIpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZGYwNDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC51dGlsLkRpYWdyYW1FZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llcy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0IGV4dGVuZHMgRGlhZ3JhbUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTF9JRCA9ICJXUEREIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDc5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5WSUVXX19WSVNJQkxFLmVxdWFscyhldmVudC5nZXRGZWF0dXJlKCkpKSB7Ci0JCQlPYmplY3Qgbm90aWZpZXIgPSBldmVudC5nZXROb3RpZmllcigpOwotCQkJaWYgKG5vdGlmaWVyID09IGdldE1vZGVsKCkpCi0JCQkJcmVmcmVzaFZpc2liaWxpdHkoKTsKLQkJCWVsc2UgaWYgKGV2ZW50LmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJcmVmcmVzaENoaWxkcmVuKCk7Ci0JCQkJRGlhZ3JhbUVkaXRvclV0aWwucmVmcmVzaENvbm5lY3Rpb25FZGl0UGFydHModGhpcyk7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuYWN0aXZhdGUoKTsKLQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotCQkJRU9iamVjdCBlID0gKChWaWV3KSBtb2RlbCkuZ2V0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSBlKS5hZGRDb25zdW1lcih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCUVPYmplY3QgZSA9ICgoVmlldykgbW9kZWwpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZSkucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYzgwOWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llcy5Xb3JrUHJvZHVjdE5vZGVDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llcy5Xb3JrUHJvZHVjdE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXMuV29ya1Byb2R1Y3ROb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAwMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBXb3JrUHJvZHVjdE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlXb3JrUHJvZHVjdE5vZGVGaWd1cmUgZmlndXJlID0gbmV3IFdvcmtQcm9kdWN0Tm9kZUZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3ROb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChXb3JrUHJvZHVjdE5vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0KSB7Ci0JCQkoKFdvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkKLQkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpLmdldEZpZ3VyZU5hbWVkTm9kZU5hbWVGaWd1cmUoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lRm9yKGVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Tm9kZUZpZ3VyZSBleHRlbmRzIFJlY3RhbmdsZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXb3JrUHJvZHVjdE5vZGVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0T3V0bGluZShmYWxzZSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKiAKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsKLQkJCWZpZ18wLnNldFRleHQoRGlhZ3JhbUNvcmVSZXNvdXJjZXMuV1BERF9OZXdfV29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQotCQkJRGlhZ3JhbUNvcmVVdGlsLnNldExhYmVsUHJvcGVydGllcyhmaWdfMCk7Ci0JCQlzZXRGaWd1cmVOYW1lZE5vZGVOYW1lRmlndXJlKGZpZ18wKTsKLQotCQkJT2JqZWN0IGxheURhdGEwID0gbnVsbDsKLQotCQkJdGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdyYXBMYWJlbCBmTmFtZWROb2RlTmFtZUZpZ3VyZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFdyYXBMYWJlbCBnZXRGaWd1cmVOYW1lZE5vZGVOYW1lRmlndXJlKCkgewotCQkJcmV0dXJuIGZOYW1lZE5vZGVOYW1lRmlndXJlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVOYW1lZE5vZGVOYW1lRmlndXJlKFdyYXBMYWJlbCBmaWcpIHsKLQkJCWZOYW1lZE5vZGVOYW1lRmlndXJlID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQlzdXBlci5hY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLmFkZENvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotCQkJRU9iamVjdCBlID0gKChWaWV3KSBtb2RlbCkuZ2V0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSBlKS5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjNkM2M3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzLkRpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVycy5EaWFncmFtRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTm9uUmVzaXphYmxlSGFuZGxlS2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydCBpbXBsZW1lbnRzCi0JCUlUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsCi0JCQkJbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJCQkJCUxpc3QgaGFuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCU5vblJlc2l6YWJsZUhhbmRsZUtpdC5hZGRNb3ZlSGFuZGxlKAotCQkJCQkJCQkoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSwgaGFuZGxlcyk7Ci0JCQkJCQlyZXR1cm4gaGFuZGxlczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcExhYmVsIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqIAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCS8vCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkvLwkJCQkuZ2V0SXRlbUltYWdlRGVzY3JpcHRvcihnZXRQYXJzZXJFbGVtZW50KCkpOwotCQkvLwkJaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkvLwkJCWRlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQkvLwkJfQotCQkvLwkJcmV0dXJuIGRlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJcmV0dXJuIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIik7CS8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gRGlhZ3JhbUVsZW1lbnRUeXBlcy5Xb3JrUHJvZHVjdE5vZGVfMTAwMTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLAotCQkJCQlWYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIERpYWdyYW1FZGl0UGFydEZhY3RvcnkKLQkJCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0KLQkJCQkJT2JqZWN0IG9iaiA9IGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJCU5vZGUgbW9kZWwgPSAoTm9kZSkgb2JqOwotCQkJCQkJRU9iamVjdCB1bWFOb2RlID0gbW9kZWwuZ2V0RWxlbWVudCgpOwotCQkJCQkJCi0JCQkJCQlpZiAodW1hTm9kZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Tm9kZSkgewotCQkJCQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUgbm9kZSA9IChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSB1bWFOb2RlOwotCQkJCQkJCU9iamVjdCBlID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IG5vZGUuZ2V0RGlhZ3JhbSgpLmdldFN1cHByZXNzaW9uKCk7Ci0JCQkJCQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tXb3JrUHJvZHVjdERlc2NyaXB0b3JQcmVzZW50YXRpb25OYW1lKAotCQkJCQkJCQkJZSwgdHh0LCBzdXBwcmVzc2lvbik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCQkJCSgoV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpKQotCQkJCQkJCS5wZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCX0KLQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCUNvbG9yIGMgPSBEaWFncmFtQ29yZVV0aWwuZ2V0Rm9udENvbG9yKHRoaXMpOwotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQljb2xvciA9IGM7Ci0JCX0KLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYjZkOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5SZWNvbm5lY3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5Db21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5FZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5FbGVtZW50VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVkaXRIZWxwZXJDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EdXBsaWNhdGVFbGVtZW50c1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5HZXRFZGl0Q29udGV4dFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5JRWRpdENvbW1hbmRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuTW92ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5TZXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQuaGVscGVycy5EaWFncmFtQmFzZUVkaXRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcyBTZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogRXh0ZW5kZWQgcmVxdWVzdCBkYXRhIGtleSB0byBob2xkIGVkaXRwYXJ0IHZpc3VhbCBpZC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklTVUFMX0lEX0tFWSA9ICJ2aXN1YWxfaWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBZGQgdmlzdWFsIGlkIG9mIGVkaXRlZCBlZGl0cGFydCB0byBleHRlbmRlZCBkYXRhIG9mIHRoZSByZXF1ZXN0Ci0JICogc28gY29tbWFuZCBzd2l0Y2ggY2FuIGRlY2lkZSB3aGF0IGtpbmQgb2YgZGlhZ3JhbSBlbGVtZW50IGlzIGJlaW5nIGVkaXRlZC4KLQkgKiBJdCBpcyBkb25lIGluIHRob3NlIGNhc2VzIHdoZW4gaXQncyBub3QgcG9zc2libGUgdG8gZGVkdWNlIGRpYWdyYW0KLQkgKiBlbGVtZW50IGtpbmQgZnJvbSBkb21haW4gZWxlbWVudC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBSZWNvbm5lY3RSZXF1ZXN0KSB7Ci0JCQlPYmplY3QgdmlldyA9ICgoUmVjb25uZWN0UmVxdWVzdCkgcmVxdWVzdCkuZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KCkKLQkJCQkJLmdldE1vZGVsKCk7Ci0JCQlpZiAodmlldyBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQlJbnRlZ2VyIGlkID0gbmV3IEludGVnZXIoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRWaXN1YWxJRCgoVmlldykgdmlldykpOwotCQkJCXJlcXVlc3QuZ2V0RXh0ZW5kZWREYXRhKCkucHV0KFZJU1VBTF9JRF9LRVksIGlkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHZpc3VhbCBpZCBmcm9tIHJlcXVlc3QgcGFyYW1ldGVycy4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRWaXN1YWxJRChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJT2JqZWN0IGlkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoVklTVUFMX0lEX0tFWSk7Ci0JCXJldHVybiBpZCBpbnN0YW5jZW9mIEludGVnZXIgPyAoKEludGVnZXIpIGlkKS5pbnRWYWx1ZSgpIDogLTE7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFNlbWFudGljQ29tbWFuZChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJSUVkaXRDb21tYW5kUmVxdWVzdCBjb21wbGV0ZWRSZXF1ZXN0ID0gY29tcGxldGVSZXF1ZXN0KHJlcXVlc3QpOwotCQlPYmplY3QgZWRpdEhlbHBlckNvbnRleHQgPSBjb21wbGV0ZWRSZXF1ZXN0LmdldEVkaXRIZWxwZXJDb250ZXh0KCk7Ci0JCWlmIChlZGl0SGVscGVyQ29udGV4dCBpbnN0YW5jZW9mIFZpZXcKLQkJCQl8fCAoZWRpdEhlbHBlckNvbnRleHQgaW5zdGFuY2VvZiBJRWRpdEhlbHBlckNvbnRleHQgJiYgKChJRWRpdEhlbHBlckNvbnRleHQpIGVkaXRIZWxwZXJDb250ZXh0KQotCQkJCQkJLmdldEVPYmplY3QoKSBpbnN0YW5jZW9mIFZpZXcpKSB7Ci0JCQkvLyBubyBzZW1hbnRpYyBjb21tYW5kcyBhcmUgcHJvdmlkZWQgZm9yIHB1cmUgZGVzaWduIGVsZW1lbnRzCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoZWRpdEhlbHBlckNvbnRleHQgPT0gbnVsbCkgewotCQkJZWRpdEhlbHBlckNvbnRleHQgPSBWaWV3VXRpbAotCQkJCQkucmVzb2x2ZVNlbWFudGljRWxlbWVudCgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpOwotCQl9Ci0JCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9IEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRFbGVtZW50VHlwZShlZGl0SGVscGVyQ29udGV4dCk7Ci0JCWlmIChlbGVtZW50VHlwZSA9PSBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0VHlwZSgKLQkJCQkib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5kZWZhdWx0IikpIHsgLy8kTk9OLU5MUy0xJCAKLQkJCWVsZW1lbnRUeXBlID0gbnVsbDsKLQkJfQotCQlDb21tYW5kIGVwQ29tbWFuZCA9IGdldFNlbWFudGljQ29tbWFuZFN3aXRjaChjb21wbGV0ZWRSZXF1ZXN0KTsKLQkJaWYgKGVwQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQlJQ29tbWFuZCBjb21tYW5kID0gZXBDb21tYW5kIGluc3RhbmNlb2YgSUNvbW1hbmRQcm94eSA/ICgoSUNvbW1hbmRQcm94eSkgZXBDb21tYW5kKQotCQkJCQkuZ2V0SUNvbW1hbmQoKQotCQkJCQk6IG5ldyBDb21tYW5kUHJveHkoZXBDb21tYW5kKTsKLQkJCWNvbXBsZXRlZFJlcXVlc3Quc2V0UGFyYW1ldGVyKAotCQkJCQlEaWFncmFtQmFzZUVkaXRIZWxwZXIuRURJVF9QT0xJQ1lfQ09NTUFORCwgY29tbWFuZCk7Ci0JCX0KLQkJQ29tbWFuZCBlaENvbW1hbmQgPSBudWxsOwotCQlpZiAoZWxlbWVudFR5cGUgIT0gbnVsbCkgewotCQkJSUNvbW1hbmQgY29tbWFuZCA9IGVsZW1lbnRUeXBlLmdldEVkaXRDb21tYW5kKGNvbXBsZXRlZFJlcXVlc3QpOwotCQkJaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotCQkJCWlmICghKGNvbW1hbmQgaW5zdGFuY2VvZiBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCkpIHsKLQkJCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJCQkJY29tbWFuZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZChlZGl0aW5nRG9tYWluLAotCQkJCQkJCW51bGwpLmNvbXBvc2UoY29tbWFuZCk7Ci0JCQkJfQotCQkJCWVoQ29tbWFuZCA9IG5ldyBJQ29tbWFuZFByb3h5KGNvbW1hbmQpOwotCQkJfQotCQl9Ci0JCWJvb2xlYW4gc2hvdWxkUHJvY2VlZCA9IHRydWU7Ci0JCWlmIChjb21wbGV0ZWRSZXF1ZXN0IGluc3RhbmNlb2YgRGVzdHJveVJlcXVlc3QpIHsKLQkJCXNob3VsZFByb2NlZWQgPSBzaG91bGRQcm9jZWVkKChEZXN0cm95UmVxdWVzdCkgY29tcGxldGVkUmVxdWVzdCk7Ci0JCX0KLQkJaWYgKHNob3VsZFByb2NlZWQpIHsKLQkJCWlmIChjb21wbGV0ZWRSZXF1ZXN0IGluc3RhbmNlb2YgRGVzdHJveVJlcXVlc3QpIHsKLQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCQkJQ29tbWFuZCBkZWxldGVWaWV3Q29tbWFuZCA9IG5ldyBJQ29tbWFuZFByb3h5KAotCQkJCQkJbmV3IERlbGV0ZUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwgKFZpZXcpIGdldEhvc3QoKQotCQkJCQkJCQkuZ2V0TW9kZWwoKSkpOwotCQkJCWVoQ29tbWFuZCA9IGVoQ29tbWFuZCA9PSBudWxsID8gZGVsZXRlVmlld0NvbW1hbmQgOiBlaENvbW1hbmQKLQkJCQkJCS5jaGFpbihkZWxldGVWaWV3Q29tbWFuZCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZWhDb21tYW5kOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRTZW1hbnRpY0NvbW1hbmRTd2l0Y2goSUVkaXRDb21tYW5kUmVxdWVzdCByZXEpIHsKLQkJaWYgKHJlcSBpbnN0YW5jZW9mIENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0Q3JlYXRlQ29tbWFuZCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgQ29uZmlndXJlUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldENvbmZpZ3VyZUNvbW1hbmQoKENvbmZpZ3VyZVJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKChEZXN0cm95RWxlbWVudFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXREZXN0cm95UmVmZXJlbmNlQ29tbWFuZCgoRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0RHVwbGljYXRlQ29tbWFuZCgoRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIEdldEVkaXRDb250ZXh0UmVxdWVzdCkgewotCQkJcmV0dXJuIGdldEVkaXRDb250ZXh0Q29tbWFuZCgoR2V0RWRpdENvbnRleHRSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIE1vdmVSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0TW92ZUNvbW1hbmQoKE1vdmVSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIFJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldFJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwQ29tbWFuZCgoUmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgoUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIFNldFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRTZXRDb21tYW5kKChTZXRSZXF1ZXN0KSByZXEpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb25maWd1cmVDb21tYW5kKENvbmZpZ3VyZVJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0U2V0Q29tbWFuZChTZXRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RWRpdENvbnRleHRDb21tYW5kKEdldEVkaXRDb250ZXh0UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95UmVmZXJlbmNlQ29tbWFuZChEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldER1cGxpY2F0ZUNvbW1hbmQoRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNvbW1hbmQoTW92ZVJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNU0xXcmFwcGVyKElDb21tYW5kIGNtZCkgewotCQlyZXR1cm4gbmV3IElDb21tYW5kUHJveHkoY21kKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0U2VtYW50aWNFbGVtZW50KCkgewotCQlyZXR1cm4gVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudCgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIGNvbnRhaW5lciBlbGVtZW50IGZvciB0aGUgbmV3IHJlbGF0aW9uc2hpcCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBnb2VzIHVwIGJ5IGNvbnRhaW5tZW50IGhpZXJhcmNoeSBzdGFydGluZyBmcm9tCi0JICogdGhlIHNwZWNpZmllZCBlbGVtZW50IGFuZCByZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgaW5zdGFuY2Ugb2YKLQkgKiB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciBjbGFzcy4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKE9iamVjdCB1ZWxlbWVudCwKLQkJCUVDbGFzcyBjb250YWluZXJDbGFzcywgSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsKLQkJaWYgKHVlbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIHVlbGVtZW50OwotCQkJZm9yICg7IGVsZW1lbnQgIT0gbnVsbDsgZWxlbWVudCA9IGVsZW1lbnQuZUNvbnRhaW5lcigpKSB7Ci0JCQkJaWYgKGNvbnRhaW5lckNsYXNzLmlzU3VwZXJUeXBlT2YoZWxlbWVudC5lQ2xhc3MoKSkpIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgZWRpdGluZyBkb21haW4gZnJvbSB0aGUgaG9zdCBlZGl0IHBhcnQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotCQlyZXR1cm4gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY29tbWFuZCB0byBkZXN0cm95IHRoZSBsaW5rLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoVmlldyB2aWV3LCBib29sZWFuIGNvbmZpcm0pIHsKLQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGdldEhvc3QoKS5nZXRWaWV3ZXIoKQotCQkJCS5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KHZpZXcpOwotCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxdWVzdCA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoCi0JCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBjb25maXJtKTsKLQkJcmV0dXJuIGVkaXRQYXJ0LmdldENvbW1hbmQobmV3IEVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXIocmVxdWVzdCwKLQkJCQlDb2xsZWN0aW9ucy5FTVBUWV9NQVApKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGNvbW1hbmRzIHRvIGRlc3Ryb3kgYWxsIGhvc3QgaW5jb21pbmcgYW5kIG91dGdvaW5nIGxpbmtzLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG91bmRDb21tYW5kIGdldERlc3Ryb3lFZGdlc0NvbW1hbmQoYm9vbGVhbiBjb25maXJtKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHZpZXcuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQljbWQuYWRkKGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZCgoRWRnZSkgaXQubmV4dCgpLCBjb25maXJtKSk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHZpZXcuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQljbWQuYWRkKGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZCgoRWRnZSkgaXQubmV4dCgpLCBjb25maXJtKSk7Ci0JCX0KLQkJcmV0dXJuIGNtZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBMaW5rQ29uc3RyYWludHMgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuQ3JlYXRlTGlua18zMDAxKE5vZGUgY29udGFpbmVyLCBOb2RlIHNvdXJjZSwKLQkJCQlOb2RlIHRhcmdldCkgewotCQkJcmV0dXJuIGNhbkV4aXN0TGlua18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5FeGlzdExpbmtfMzAwMShOb2RlIGNvbnRhaW5lciwgTm9kZSBzb3VyY2UsCi0JCQkJTm9kZSB0YXJnZXQpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI3M2FiNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUV4dE5vZGVMYWJlbEhvc3RMYXlvdXRFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DaGFuZ2VCb3VuZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Hcm91cFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuWFlMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeSBleHRlbmRzIFhZTGF5b3V0RWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMYXlvdXRFZGl0UG9saWN5IHJlYWxMYXlvdXRFZGl0UG9saWN5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMYXlvdXRFZGl0UG9saWN5IGdldFJlYWxMYXlvdXRFZGl0UG9saWN5KCkgewotCQlyZXR1cm4gcmVhbExheW91dEVkaXRQb2xpY3k7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWxMYXlvdXRFZGl0UG9saWN5KExheW91dEVkaXRQb2xpY3kgcmVhbExheW91dEVkaXRQb2xpY3kpIHsKLQkJdGhpcy5yZWFsTGF5b3V0RWRpdFBvbGljeSA9IHJlYWxMYXlvdXRFZGl0UG9saWN5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4dGVybmFsTGFiZWwoRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdCBnZXRFeHRlcm5hbExhYmVscyhHcm91cFJlcXVlc3QgcmVxdWVzdCkgewotCQlMaXN0IGVkaXRQYXJ0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCkgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGlzRXh0ZXJuYWxMYWJlbChlZGl0UGFydCkpIHsKLQkJCQkJZWRpdFBhcnRzLmFkZChlZGl0UGFydCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlZGl0UGFydHM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChSRVFfTU9WRV9DSElMRFJFTi5lcXVhbHMocmVxdWVzdC5nZXRUeXBlKCkpKSB7Ci0JCQlDaGFuZ2VCb3VuZHNSZXF1ZXN0IGNiUmVxdWVzdCA9IChDaGFuZ2VCb3VuZHNSZXF1ZXN0KSByZXF1ZXN0OwotCQkJTGlzdCBleHRMYWJlbHMgPSBnZXRFeHRlcm5hbExhYmVscyhjYlJlcXVlc3QpOwotCQkJaWYgKCFleHRMYWJlbHMuaXNFbXB0eSgpKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBjYlJlcXVlc3QuZ2V0RWRpdFBhcnRzKCk7Ci0JCQkJQ29tbWFuZCBjbWQgPSBudWxsOwotCQkJCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsCi0JCQkJCQkmJiBlZGl0UGFydHMuc2l6ZSgpID4gZXh0TGFiZWxzLnNpemUoKSkgewotCQkJCQlMaXN0IG90aGVyID0gbmV3IEFycmF5TGlzdChlZGl0UGFydHMpOwotCQkJCQlvdGhlci5yZW1vdmVBbGwoZXh0TGFiZWxzKTsKLQkJCQkJY2JSZXF1ZXN0LnNldEVkaXRQYXJ0cyhvdGhlcik7Ci0JCQkJCWNtZCA9IHJlYWxMYXlvdXRFZGl0UG9saWN5LmdldENvbW1hbmQocmVxdWVzdCk7Ci0JCQkJfQotCQkJCWNiUmVxdWVzdC5zZXRFZGl0UGFydHMoZXh0TGFiZWxzKTsKLQkJCQlDb21tYW5kIGV4dExhYmVsc0NtZCA9IGdldE1vdmVDaGlsZHJlbkNvbW1hbmQocmVxdWVzdCk7Ci0JCQkJY2JSZXF1ZXN0LnNldEVkaXRQYXJ0cyhlZGl0UGFydHMpOwotCQkJCXJldHVybiBjbWQgPT0gbnVsbCA/IGV4dExhYmVsc0NtZCA6IGNtZC5jaGFpbihleHRMYWJlbHNDbWQpOwotCQkJfQotCQl9Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgR3JvdXBSZXF1ZXN0KSB7Ci0JCQlMaXN0IGV4dExhYmVscyA9IGdldEV4dGVybmFsTGFiZWxzKChHcm91cFJlcXVlc3QpIHJlcXVlc3QpOwotCQkJaWYgKCFleHRMYWJlbHMuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlYWxMYXlvdXRFZGl0UG9saWN5ID09IG51bGwgPyBudWxsIDogcmVhbExheW91dEVkaXRQb2xpY3kKLQkJCQkuZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb25zdHJhaW50Rm9yKENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCwKLQkJCUdyYXBoaWNhbEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCWludCBkeCA9ICgoSW50ZWdlcikgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSgoVmlldykgY2hpbGQKLQkJCQkuZ2V0TW9kZWwoKSwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkpKQotCQkJCS5pbnRWYWx1ZSgpOwotCQlpbnQgZHkgPSAoKEludGVnZXIpIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoKFZpZXcpIGNoaWxkCi0JCQkJLmdldE1vZGVsKCksIE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpKSkKLQkJCQkuaW50VmFsdWUoKTsKLQkJUmVjdGFuZ2xlIHIgPSBuZXcgUmVjdGFuZ2xlKGR4LCBkeSwgMCwgMCk7Ci0JCWNoaWxkLmdldEZpZ3VyZSgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocik7Ci0JCXIudHJhbnNsYXRlKHJlcXVlc3QuZ2V0TW92ZURlbHRhKCkpOwotCQljaGlsZC5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb1JlbGF0aXZlKHIpOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsCi0JCQkJJiYgcmVhbExheW91dEVkaXRQb2xpY3kudW5kZXJzdGFuZHNSZXF1ZXN0KHJlcSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdXBlci51bmRlcnN0YW5kc1JlcXVlc3QocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVDaGlsZChFZGl0UGFydCBjaGlsZCkgewotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIb3N0KEVkaXRQYXJ0IGhvc3QpIHsKLQkJc3VwZXIuc2V0SG9zdChob3N0KTsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LnNldEhvc3QoaG9zdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5hY3RpdmF0ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LmRlYWN0aXZhdGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0VGFyZ2V0RWRpdFBhcnQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVhbExheW91dEVkaXRQb2xpY3kuZ2V0VGFyZ2V0RWRpdFBhcnQocmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0VGFyZ2V0RWRpdFBhcnQocmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2hvd1NvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuc2hvd1NvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuc2hvd1NvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVyYXNlU291cmNlRmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5lcmFzZVNvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuZXJhc2VTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93VGFyZ2V0RmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5zaG93VGFyZ2V0RmVlZGJhY2socmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5zaG93VGFyZ2V0RmVlZGJhY2socmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZXJhc2VUYXJnZXRGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LmVyYXNlVGFyZ2V0RmVlZGJhY2socmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5lcmFzZVRhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1HcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1HcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTFkNWM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21wb3NpdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5lZGl0aGVscGVycy5DcmVhdGVFbGVtZW50UmVxdWVzdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5HcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25WaWV3QW5kRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmNvbW1hbmRzLkRpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcyBHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElFbGVtZW50VHlwZSBnZXRFbGVtZW50VHlwZShDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ3JlYXRlQ29ubmVjdGlvblZpZXdBbmRFbGVtZW50UmVxdWVzdCkgewotCQkJQ3JlYXRlRWxlbWVudFJlcXVlc3RBZGFwdGVyIHJlcXVlc3RBZGFwdGVyID0gKChDcmVhdGVDb25uZWN0aW9uVmlld0FuZEVsZW1lbnRSZXF1ZXN0KSByZXF1ZXN0KQotCQkJCQkuZ2V0Q29ubmVjdGlvblZpZXdBbmRFbGVtZW50RGVzY3JpcHRvcigpCi0JCQkJCS5nZXRDcmVhdGVFbGVtZW50UmVxdWVzdEFkYXB0ZXIoKTsKLQkJCXJldHVybiAoSUVsZW1lbnRUeXBlKSByZXF1ZXN0QWRhcHRlci5nZXRBZGFwdGVyKElFbGVtZW50VHlwZS5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENvbm5lY3Rpb25XaXRoUmVvcmllbnRlZFZpZXdDb21wbGV0ZUNvbW1hbmQoCi0JCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUlDb21tYW5kUHJveHkgYyA9IChJQ29tbWFuZFByb3h5KSBzdXBlcgotCQkJCS5nZXRDb25uZWN0aW9uQ29tcGxldGVDb21tYW5kKHJlcXVlc3QpOwotCQlDb21wb3NpdGVDb21tYW5kIGNjID0gKENvbXBvc2l0ZUNvbW1hbmQpIGMuZ2V0SUNvbW1hbmQoKTsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kIHJjdkNvbW1hbmQgPSBuZXcgRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kKAotCQkJCWVkaXRpbmdEb21haW4sIG51bGwpOwotCQlyY3ZDb21tYW5kLnNldEVkZ2VBZGFwdG9yKGdldFZpZXdBZGFwdGVyKCkpOwotCQljYy5jb21wb3NlKHJjdkNvbW1hbmQpOwotCQlyZXR1cm4gYzsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVJlZmVyZW5jZUNvbm5lY3Rpb25FZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVJlZmVyZW5jZUNvbm5lY3Rpb25FZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZTc0MzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1SZWZlcmVuY2VDb25uZWN0aW9uRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQ29ubmVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkdyb3VwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkdyb3VwUmVxdWVzdFZpYUtleWJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVJlZmVyZW5jZUNvbm5lY3Rpb25FZGl0UG9saWN5IGV4dGVuZHMgQ29ubmVjdGlvbkVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfRlJPTV9ESUFHUkFNX0RMR19USVRMRSA9IERpYWdyYW1VSU1lc3NhZ2VzLlByb21wdGluZ0RlbGV0ZUFjdGlvbl9EZWxldGVGcm9tRGlhZ3JhbURpYWxvZ19UaXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0ZST01fRElBR1JBTV9ETEdfTUVTU0FHRSA9IERpYWdyYW1VSU1lc3NhZ2VzLlByb21wdGluZ0RlbGV0ZUFjdGlvbl9EZWxldGVGcm9tRGlhZ3JhbURpYWxvZ19NZXNzYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfRlJPTV9NT0RFTF9ETEdfVE9HR0xFX0xBQkVMID0gRGlhZ3JhbVVJTWVzc2FnZXMuTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGVfRG9Ob3RQcm9tcHRBZ2FpblRvZ2dsZV9sYWJlbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKEdyb3VwUmVxdWVzdCBkZWxldGVSZXF1ZXN0KSB7Ci0JCWJvb2xlYW4gaXNEZWxldGVGcm9tS2V5Qm9hcmQgPSBkZWxldGVSZXF1ZXN0IGluc3RhbmNlb2YgR3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQ7Ci0JCWlmIChzaG91bGREZWxldGVTZW1hbnRpYygpKSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVsZXRlU2VtYW50aWNDb21tYW5kKGRlbGV0ZVJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJYm9vbGVhbiBwcm9jZWVkVG9EZWxldGVWaWV3ID0gdHJ1ZTsKLQkJCWlmIChpc0RlbGV0ZUZyb21LZXlCb2FyZCkgewotCQkJCUdyb3VwUmVxdWVzdFZpYUtleWJvYXJkIGdyb3VwUmVxdWVzdFZpYUtleWJvYXJkID0gKEdyb3VwUmVxdWVzdFZpYUtleWJvYXJkKSBkZWxldGVSZXF1ZXN0OwotCQkJCWlmIChncm91cFJlcXVlc3RWaWFLZXlib2FyZC5pc1Nob3dJbmZvcm1hdGlvbkRpYWxvZygpKSB7Ci0JCQkJCXByb2NlZWRUb0RlbGV0ZVZpZXcgPSBzaG93UHJvbXB0KCk7Ci0JCQkJCWdyb3VwUmVxdWVzdFZpYUtleWJvYXJkLnNldFNob3dJbmZvcm1hdGlvbkRpYWxvZyhmYWxzZSk7Ci0JCQkJCWlmICghKHByb2NlZWRUb0RlbGV0ZVZpZXcpKQotCQkJCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNyZWF0ZURlbGV0ZVZpZXdDb21tYW5kKGRlbGV0ZVJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVNlbWFudGljKCkgewotCQlBc3NlcnQuaXNUcnVlKGdldEhvc3QoKSBpbnN0YW5jZW9mIEFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0KTsKLQkJQWJzdHJhY3RDb25uZWN0aW9uRWRpdFBhcnQgY2VwID0gKEFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0KSBnZXRIb3N0KCk7Ci0JCWJvb2xlYW4gaXNDYW5vbmljYWwgPSBmYWxzZTsKLQkJaWYgKGNlcC5nZXRTb3VyY2UoKSAhPSBudWxsKQotCQkJaXNDYW5vbmljYWwgPSBJc0Nhbm9uaWNhbChjZXAuZ2V0U291cmNlKCkpOwotCQlpZiAoY2VwLmdldFRhcmdldCgpICE9IG51bGwpCi0JCQlyZXR1cm4gaXNDYW5vbmljYWwgPyBpc0Nhbm9uaWNhbCA6IElzQ2Fub25pY2FsKGNlcC5nZXRUYXJnZXQoKSk7Ci0JCXJldHVybiBpc0Nhbm9uaWNhbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIElzQ2Fub25pY2FsKEVkaXRQYXJ0IGVwKSB7Ci0JCUVkaXRQYXJ0IHBhcmVudCA9IGVwLmdldFBhcmVudCgpOwotCQlyZXR1cm4gcGFyZW50IGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQgPyAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJlbnQpCi0JCQkJLmlzQ2Fub25pY2FsKCkKLQkJCQk6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEZWxldGVWaWV3Q29tbWFuZChHcm91cFJlcXVlc3QgZGVsZXRlUmVxdWVzdCkgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlyZXR1cm4gbmV3IElDb21tYW5kUHJveHkobmV3IERlbGV0ZUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwKLQkJCQkoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRGVsZXRlU2VtYW50aWNDb21tYW5kKEdyb3VwUmVxdWVzdCBkZWxldGVSZXF1ZXN0KSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCUVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXIgc2VtUmVxID0gbmV3IEVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXIoCi0JCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChlZGl0aW5nRG9tYWluLCBmYWxzZSksIGRlbGV0ZVJlcXVlc3QKLQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKSk7Ci0JCUNvbW1hbmQgc2VtYW50aWNDbWQgPSBnZXRIb3N0KCkuZ2V0Q29tbWFuZChzZW1SZXEpOwotCQlpZiAoc2VtYW50aWNDbWQgIT0gbnVsbCAmJiBzZW1hbnRpY0NtZC5jYW5FeGVjdXRlKCkpIHsKLQkJCUNvbXBvdW5kQ29tbWFuZCBjYyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkJCWNjLmFkZChzZW1hbnRpY0NtZCk7Ci0JCQlyZXR1cm4gY2M7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG93UHJvbXB0KCkgewotCQlib29sZWFuIHByb21wdCA9ICgoSVByZWZlcmVuY2VTdG9yZSkgKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKQotCQkJCS5nZXRCb29sZWFuKElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUFJPTVBUX09OX0RFTF9GUk9NX0RJQUdSQU0pOwotCQlpZiAocHJvbXB0KQotCQkJaWYgKHNob3dNZXNzYWdlRGlhbG9nKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNob3dNZXNzYWdlRGlhbG9nKCkgewotCQlNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZSBkaWFsb2cgPSBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZQotCQkJCS5vcGVuWWVzTm9RdWVzdGlvbihEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJREVMRVRFX0ZST01fRElBR1JBTV9ETEdfVElUTEUsCi0JCQkJCQlERUxFVEVfRlJPTV9ESUFHUkFNX0RMR19NRVNTQUdFLAotCQkJCQkJREVMRVRFX0ZST01fTU9ERUxfRExHX1RPR0dMRV9MQUJFTCwgZmFsc2UsCi0JCQkJCQkoSVByZWZlcmVuY2VTdG9yZSkgKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkJCQkJLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKQotCQkJCQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCksCi0JCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1BST01QVF9PTl9ERUxfRlJPTV9ESUFHUkFNKTsKLQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIEdyb3VwUmVxdWVzdFZpYUtleWJvYXJkKSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZXRlQ29tbWFuZCgoR3JvdXBSZXF1ZXN0KSByZXF1ZXN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVRleHROb25SZXNpemFibGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVRleHROb25SZXNpemFibGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjODRlNzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1UZXh0Tm9uUmVzaXphYmxlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk1vdmVIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeUV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuRHJhZ0VkaXRQYXJ0c1RyYWNrZXJFeDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVRleHROb25SZXNpemFibGVFZGl0UG9saWN5IGV4dGVuZHMgTm9uUmVzaXphYmxlRWRpdFBvbGljeUV4IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElGaWd1cmUgc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJRmlndXJlIGZvY3VzRmVlZGJhY2tGaWd1cmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1ByaW1hcnlTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKHRydWUpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXModHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzaG93U2VsZWN0aW9uKCk7Ci0JCQlzaG93Rm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93U2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWhpZGVTZWxlY3Rpb24oKTsKLQkJCWFkZEZlZWRiYWNrKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlID0gY3JlYXRlU2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUoKSk7Ci0JCQlyZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKTsKLQkJCWhpZGVGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhpZGVTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKGZhbHNlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlRmVlZGJhY2soc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUpOwotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlID0gbnVsbDsKLQkJCX0KLQkJCWhpZGVGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dGb2N1cygpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXModHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQloaWRlRm9jdXMoKTsKLQkJCWFkZEZlZWRiYWNrKGZvY3VzRmVlZGJhY2tGaWd1cmUgPSBjcmVhdGVGb2N1c0ZlZWRiYWNrRmlndXJlKCkpOwotCQkJcmVmcmVzaEZvY3VzRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlRm9jdXMoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmb2N1c0ZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCQlyZW1vdmVGZWVkYmFjayhmb2N1c0ZlZWRiYWNrRmlndXJlKTsKLQkJCQlmb2N1c0ZlZWRiYWNrRmlndXJlID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVjdGFuZ2xlIGdldEZlZWRiYWNrQm91bmRzKCkgewotCQlSZWN0YW5nbGUgYm91bmRzOwotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCWJvdW5kcyA9ICgoTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuZ2V0VGV4dEJvdW5kcygpOwotCQkJYm91bmRzLmludGVyc2VjdChnZXRIb3N0RmlndXJlKCkuZ2V0Qm91bmRzKCkpOwotCQl9IGVsc2UgewotCQkJYm91bmRzID0gZ2V0SG9zdEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJfQotCQlnZXRIb3N0RmlndXJlKCkuZ2V0UGFyZW50KCkudHJhbnNsYXRlVG9BYnNvbHV0ZShib3VuZHMpOwotCQlnZXRGZWVkYmFja0xheWVyKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShib3VuZHMpOwotCQlyZXR1cm4gYm91bmRzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVTZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSgpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlMYWJlbCBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBMYWJlbCgpOwotCQkJZmVlZGJhY2tGaWd1cmUuc2V0T3BhcXVlKHRydWUpOwotCQkJZmVlZGJhY2tGaWd1cmUKLQkJCQkJLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWZlZWRiYWNrRmlndXJlCi0JCQkJCS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubWVudUZvcmVncm91bmRTZWxlY3RlZCk7Ci0JCQlyZXR1cm4gZmVlZGJhY2tGaWd1cmU7Ci0JCX0gZWxzZSB7Ci0JCQlSZWN0YW5nbGVGaWd1cmUgZmVlZGJhY2tGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZS5zZXRGaWxsKGZhbHNlKTsKLQkJCXJldHVybiBmZWVkYmFja0ZpZ3VyZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGb2N1c0ZlZWRiYWNrRmlndXJlKCkgewotCQlyZXR1cm4gbmV3IEZpZ3VyZSgpIHsKLQotCQkJcHJvdGVjdGVkIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJCQlncmFwaGljcy5kcmF3Rm9jdXMoZ2V0Qm91bmRzKCkuZ2V0UmVzaXplZCgtMSwgLTEpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTGFiZWwoTGFiZWwgdGFyZ2V0KSB7Ci0JCUxhYmVsIHNvdXJjZSA9IChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpOwotCQl0YXJnZXQuc2V0VGV4dChzb3VyY2UuZ2V0VGV4dCgpKTsKLQkJdGFyZ2V0LnNldFRleHRBbGlnbm1lbnQoc291cmNlLmdldFRleHRBbGlnbm1lbnQoKSk7Ci0JCXRhcmdldC5zZXRGb250KHNvdXJjZS5nZXRGb250KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKSB7Ci0JCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJCXVwZGF0ZUxhYmVsKChMYWJlbCkgc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUpOwotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkuZXhwYW5kKDUsCi0JCQkJCQk1KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvY3VzRmVlZGJhY2soKSB7Ci0JCWlmIChmb2N1c0ZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCWZvY3VzRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hGZWVkYmFjaygpIHsKLQkJcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0JCXJlZnJlc2hGb2N1c0ZlZWRiYWNrKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCU1vdmVIYW5kbGUgbW92ZUhhbmRsZSA9IG5ldyBNb3ZlSGFuZGxlKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsKLQkJbW92ZUhhbmRsZS5zZXRCb3JkZXIobnVsbCk7Ci0JCW1vdmVIYW5kbGUuc2V0RHJhZ1RyYWNrZXIobmV3IERyYWdFZGl0UGFydHNUcmFja2VyRXgoZ2V0SG9zdCgpKSk7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG1vdmVIYW5kbGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA4ZDM5OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuU2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5IGV4dGVuZHMgU2VsZWN0aW9uRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJRmlndXJlIHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSUZpZ3VyZSBmb2N1c0ZlZWRiYWNrRmlndXJlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dQcmltYXJ5U2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJc2hvd1NlbGVjdGlvbigpOwotCQkJc2hvd0ZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQloaWRlU2VsZWN0aW9uKCk7Ci0JCQlhZGRGZWVkYmFjayhzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSA9IGNyZWF0ZVNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKCkpOwotCQkJcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0JCQloaWRlRm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlU2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJCXJlbW92ZUZlZWRiYWNrKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKTsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSA9IG51bGw7Ci0JCQl9Ci0JCQloaWRlRm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93Rm9jdXMoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJaGlkZUZvY3VzKCk7Ci0JCQlhZGRGZWVkYmFjayhmb2N1c0ZlZWRiYWNrRmlndXJlID0gY3JlYXRlRm9jdXNGZWVkYmFja0ZpZ3VyZSgpKTsKLQkJCXJlZnJlc2hGb2N1c0ZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZUZvY3VzKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZm9jdXNGZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlRmVlZGJhY2soZm9jdXNGZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJZm9jdXNGZWVkYmFja0ZpZ3VyZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlY3RhbmdsZSBnZXRGZWVkYmFja0JvdW5kcygpIHsKLQkJUmVjdGFuZ2xlIGJvdW5kczsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlib3VuZHMgPSAoKExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLmdldFRleHRCb3VuZHMoKTsKLQkJCWJvdW5kcy5pbnRlcnNlY3QoZ2V0SG9zdEZpZ3VyZSgpLmdldEJvdW5kcygpKTsKLQkJfSBlbHNlIHsKLQkJCWJvdW5kcyA9IGdldEhvc3RGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCX0KLQkJZ2V0SG9zdEZpZ3VyZSgpLmdldFBhcmVudCgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUoYm91bmRzKTsKLQkJZ2V0RmVlZGJhY2tMYXllcigpLnRyYW5zbGF0ZVRvUmVsYXRpdmUoYm91bmRzKTsKLQkJcmV0dXJuIGJvdW5kczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlU2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJTGFiZWwgZmVlZGJhY2tGaWd1cmUgPSBuZXcgTGFiZWwoKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldE9wYXF1ZSh0cnVlKTsKLQkJCWZlZWRiYWNrRmlndXJlCi0JCQkJCS5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubWVudUJhY2tncm91bmRTZWxlY3RlZCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZQotCQkJCQkuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVGb3JlZ3JvdW5kU2VsZWN0ZWQpOwotCQkJcmV0dXJuIGZlZWRiYWNrRmlndXJlOwotCQl9IGVsc2UgewotCQkJUmVjdGFuZ2xlRmlndXJlIGZlZWRiYWNrRmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOwotCQkJZmVlZGJhY2tGaWd1cmUuc2V0RmlsbChmYWxzZSk7Ci0JCQlyZXR1cm4gZmVlZGJhY2tGaWd1cmU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRm9jdXNGZWVkYmFja0ZpZ3VyZSgpIHsKLQkJcmV0dXJuIG5ldyBGaWd1cmUoKSB7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCQkJZ3JhcGhpY3MuZHJhd0ZvY3VzKGdldEJvdW5kcygpLmdldFJlc2l6ZWQoLTEsIC0xKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUxhYmVsKExhYmVsIHRhcmdldCkgewotCQlMYWJlbCBzb3VyY2UgPSAoTGFiZWwpIGdldEhvc3RGaWd1cmUoKTsKLQkJdGFyZ2V0LnNldFRleHQoc291cmNlLmdldFRleHQoKSk7Ci0JCXRhcmdldC5zZXRUZXh0QWxpZ25tZW50KHNvdXJjZS5nZXRUZXh0QWxpZ25tZW50KCkpOwotCQl0YXJnZXQuc2V0Rm9udChzb3VyY2UuZ2V0Rm9udCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCkgewotCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCQl1cGRhdGVMYWJlbCgoTGFiZWwpIHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKTsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpLmV4cGFuZCg1LAotCQkJCQkJNSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb2N1c0ZlZWRiYWNrKCkgewotCQlpZiAoZm9jdXNGZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQlmb2N1c0ZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoRmVlZGJhY2soKSB7Ci0JCXJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpOwotCQlyZWZyZXNoRm9jdXNGZWVkYmFjaygpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9MaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0xpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZjU4Y2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0xpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdjMTE0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsQ29ubmVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcwotCQlDYW5vbmljYWxDb25uZWN0aW9uRWRpdFBvbGljeSB7Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgZ2V0U2VtYW50aWNIb3N0KCkgewotCQlyZXR1cm4gaG9zdCgpLmdldE1vZGVsKCkgIT0gbnVsbCA/IHN1cGVyLmdldFNlbWFudGljSG9zdCgpIDogbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaE9uQWN0aXZhdGUoKSB7CQkKLQkJc3VwZXIucmVmcmVzaE9uQWN0aXZhdGUoKTsKLQkJCi0JCUVkaXRQYXJ0IGVwID0gZ2V0SG9zdCgpOwotCQlpZihlcCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkgewotCQkJRGlhZ3JhbUVkaXRvclV0aWwuaW5pdGlhbGl6ZU9uQWN0aXZhdGUoKERpYWdyYW1FZGl0UGFydCkgZXApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCUVPYmplY3QgbW9kZWxPYmplY3QgPSAoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJRU9iamVjdCBuZXh0VmFsdWU7Ci0JCWludCBub2RlVklEOwotCQlmb3IgKEl0ZXJhdG9yIHZhbHVlcyA9ICgoTm9kZUNvbnRhaW5lcikgbW9kZWxPYmplY3QpLmdldE5vZGVzKCkKLQkJCQkuaXRlcmF0b3IoKTsgdmFsdWVzLmhhc05leHQoKTspIHsKLQkJCW5leHRWYWx1ZSA9IChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpOwotCQkJbm9kZVZJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3T2JqZWN0LAotCQkJCQluZXh0VmFsdWUpOwotCQkJaWYgKFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVklEKSB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgKHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCkgfHwgdmlldy5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBOb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ29ubmVjdGlvbnNMaXN0KCkgewotCQlMaXN0IGNvbm5lY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIGRpYWdyYW0gPSAoV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSkgKChWaWV3KSBnZXRIb3N0KCkKLQkJCQkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQljb25uZWN0aW9ucy5hZGRBbGwobm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkpOwotCQl9Ci0JCXJldHVybiBjb25uZWN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRTb3VyY2VFbGVtZW50KEVPYmplY3QgcmVsYXRpb25zaGlwKSB7Ci0JCWlmIChyZWxhdGlvbnNoaXAgaW5zdGFuY2VvZiBMaW5rKSB7Ci0JCQlyZXR1cm4gKChMaW5rKSByZWxhdGlvbnNoaXApLmdldFNvdXJjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFRhcmdldEVsZW1lbnQoRU9iamVjdCByZWxhdGlvbnNoaXApIHsKLQkJaWYgKHJlbGF0aW9uc2hpcCBpbnN0YW5jZW9mIExpbmspIHsKLQkJCXJldHVybiAoKExpbmspIHJlbGF0aW9uc2hpcCkuZ2V0VGFyZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkSW5jbHVkZUNvbm5lY3Rpb24oRWRnZSBjb25uZWN0b3IsCi0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXJldHVybiBzdXBlci5zaG91bGRJbmNsdWRlQ29ubmVjdGlvbihjb25uZWN0b3IsIGNoaWxkcmVuKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgewotCQlMaXN0IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWNyZWF0ZWRWaWV3cy5hZGRBbGwocmVmcmVzaFNlbWFudGljQ2hpbGRyZW4oKSk7Ci0JCUxpc3QgY3JlYXRlZENvbm5lY3Rpb25WaWV3cyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWNyZWF0ZWRDb25uZWN0aW9uVmlld3MuYWRkQWxsKHJlZnJlc2hTZW1hbnRpY0Nvbm5lY3Rpb25zKCkpOwotCQljcmVhdGVkQ29ubmVjdGlvblZpZXdzLmFkZEFsbChyZWZyZXNoQ29ubmVjdGlvbnMoKSk7Ci0KLQkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7Ci0JCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXIKLQkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQotCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7Ci0JCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsKLQkJfQotCi0JCWNyZWF0ZWRWaWV3cy5hZGRBbGwoY3JlYXRlZENvbm5lY3Rpb25WaWV3cyk7Ci0JCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gbXlMaW5rRGVzY3JpcHRvcnMgPSBuZXcgTGlua2VkTGlzdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTWFwIG15RU9iamVjdDJWaWV3TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gcmVmcmVzaENvbm5lY3Rpb25zKCkgewotCQl0cnkgewotCQkJY29sbGVjdEFsbExpbmtzKGdldERpYWdyYW0oKSk7Ci0JCQlDb2xsZWN0aW9uIGV4aXN0aW5nTGlua3MgPSBuZXcgTGlua2VkTGlzdChnZXREaWFncmFtKCkuZ2V0RWRnZXMoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGRpYWdyYW1MaW5rcyA9IGV4aXN0aW5nTGlua3MuaXRlcmF0b3IoKTsgZGlhZ3JhbUxpbmtzCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRWRnZSBuZXh0RGlhZ3JhbUxpbmsgPSAoRWRnZSkgZGlhZ3JhbUxpbmtzLm5leHQoKTsKLQkJCQlFT2JqZWN0IGRpYWdyYW1MaW5rT2JqZWN0ID0gbmV4dERpYWdyYW1MaW5rLmdldEVsZW1lbnQoKTsKLQkJCQlFT2JqZWN0IGRpYWdyYW1MaW5rU3JjID0gbmV4dERpYWdyYW1MaW5rLmdldFNvdXJjZSgpCi0JCQkJCQkuZ2V0RWxlbWVudCgpOwotCQkJCUVPYmplY3QgZGlhZ3JhbUxpbmtEc3QgPSBuZXh0RGlhZ3JhbUxpbmsuZ2V0VGFyZ2V0KCkKLQkJCQkJCS5nZXRFbGVtZW50KCk7Ci0JCQkJaW50IGRpYWdyYW1MaW5rVmlzdWFsSUQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldFZpc3VhbElEKG5leHREaWFncmFtTGluayk7Ci0JCQkJZm9yIChJdGVyYXRvciBtb2RlbExpbmtEZXNjcmlwdG9ycyA9IG15TGlua0Rlc2NyaXB0b3JzCi0JCQkJCQkuaXRlcmF0b3IoKTsgbW9kZWxMaW5rRGVzY3JpcHRvcnMuaGFzTmV4dCgpOykgewotCQkJCQlMaW5rRGVzY3JpcHRvciBuZXh0TGlua0Rlc2NyaXB0b3IgPSAoTGlua0Rlc2NyaXB0b3IpIG1vZGVsTGlua0Rlc2NyaXB0b3JzCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJaWYgKGRpYWdyYW1MaW5rT2JqZWN0ID09IG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkJCS5nZXRMaW5rRWxlbWVudCgpCi0JCQkJCQkJJiYgZGlhZ3JhbUxpbmtTcmMgPT0gbmV4dExpbmtEZXNjcmlwdG9yLmdldFNvdXJjZSgpCi0JCQkJCQkJJiYgZGlhZ3JhbUxpbmtEc3QgPT0gbmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCQkJCQkuZ2V0RGVzdGluYXRpb24oKQotCQkJCQkJCSYmIGRpYWdyYW1MaW5rVmlzdWFsSUQgPT0gbmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCQkJCQkuZ2V0VmlzdWFsSUQoKSkgewotCQkJCQkJZGlhZ3JhbUxpbmtzLnJlbW92ZSgpOwotCQkJCQkJbW9kZWxMaW5rRGVzY3JpcHRvcnMucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlkZWxldGVWaWV3cyhleGlzdGluZ0xpbmtzLml0ZXJhdG9yKCkpOwotCQkJcmV0dXJuIGNyZWF0ZUNvbm5lY3Rpb25zKG15TGlua0Rlc2NyaXB0b3JzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW15TGlua0Rlc2NyaXB0b3JzLmNsZWFyKCk7Ci0JCQlteUVPYmplY3QyVmlld01hcC5jbGVhcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBjb2xsZWN0QWxsTGlua3MoVmlldyB2aWV3KSB7Ci0JCUVPYmplY3QgbW9kZWxFbGVtZW50ID0gdmlldy5nZXRFbGVtZW50KCk7Ci0JCWludCBkaWFncmFtRWxlbWVudFZpc3VhbElEID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7Ci0JCXN3aXRjaCAoZGlhZ3JhbUVsZW1lbnRWaXN1YWxJRCkgewotCQljYXNlIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQlteUVPYmplY3QyVmlld01hcC5wdXQobW9kZWxFbGVtZW50LCB2aWV3KTsKLQkJCXN0b3JlTGlua3MobW9kZWxFbGVtZW50LCBnZXREaWFncmFtKCkpOwotCQl9Ci0JCWRlZmF1bHQ6IHsKLQkJfQotCQkJZm9yIChJdGVyYXRvciBjaGlsZHJlbiA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaGlsZHJlbgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkcmVuLm5leHQoKTsKLQkJCQljb2xsZWN0QWxsTGlua3MoY2hpbGRWaWV3KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gY3JlYXRlQ29ubmVjdGlvbnMoQ29sbGVjdGlvbiBsaW5rRGVzY3JpcHRvcnMpIHsKLQkJaWYgKGxpbmtEZXNjcmlwdG9ycy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCUxpc3QgYWRhcHRlcnMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGxpbmtEZXNjcmlwdG9yc0l0ZXJhdG9yID0gbGlua0Rlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGxpbmtEZXNjcmlwdG9yc0l0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCWZpbmFsIExpbmtEZXNjcmlwdG9yIG5leHRMaW5rRGVzY3JpcHRvciA9IChMaW5rRGVzY3JpcHRvcikgbGlua0Rlc2NyaXB0b3JzSXRlcmF0b3IKLQkJCQkJLm5leHQoKTsKLQkJCUVkaXRQYXJ0IHNvdXJjZUVkaXRQYXJ0ID0gZ2V0RWRpdFBhcnRGb3IobmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCS5nZXRTb3VyY2UoKSk7Ci0JCQlFZGl0UGFydCB0YXJnZXRFZGl0UGFydCA9IGdldEVkaXRQYXJ0Rm9yKG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkuZ2V0RGVzdGluYXRpb24oKSk7Ci0JCQlpZiAoc291cmNlRWRpdFBhcnQgPT0gbnVsbCB8fCB0YXJnZXRFZGl0UGFydCA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlDcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3QuQ29ubmVjdGlvblZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0LkNvbm5lY3Rpb25WaWV3RGVzY3JpcHRvcigKLQkJCQkJbmV4dExpbmtEZXNjcmlwdG9yLmdldFNlbWFudGljQWRhcHRlcigpLCBudWxsLAotCQkJCQlWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLCAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCQkJCS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOwotCQkJQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0IGNjciA9IG5ldyBDcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3QoCi0JCQkJCWRlc2NyaXB0b3IpOwotCQkJY2NyLnNldFR5cGUoUmVxdWVzdENvbnN0YW50cy5SRVFfQ09OTkVDVElPTl9TVEFSVCk7Ci0JCQljY3Iuc2V0U291cmNlRWRpdFBhcnQoc291cmNlRWRpdFBhcnQpOwotCQkJc291cmNlRWRpdFBhcnQuZ2V0Q29tbWFuZChjY3IpOwotCQkJY2NyLnNldFRhcmdldEVkaXRQYXJ0KHRhcmdldEVkaXRQYXJ0KTsKLQkJCWNjci5zZXRUeXBlKFJlcXVlc3RDb25zdGFudHMuUkVRX0NPTk5FQ1RJT05fRU5EKTsKLQkJCUNvbW1hbmQgY21kID0gdGFyZ2V0RWRpdFBhcnQuZ2V0Q29tbWFuZChjY3IpOwotCQkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQlleGVjdXRlQ29tbWFuZChjbWQpOwotCQkJCUlBZGFwdGFibGUgdmlld0FkYXB0ZXIgPSAoSUFkYXB0YWJsZSkgY2NyLmdldE5ld09iamVjdCgpOwotCQkJCWlmICh2aWV3QWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXJzLmFkZCh2aWV3QWRhcHRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhZGFwdGVyczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFZGl0UGFydCBnZXRFZGl0UGFydEZvcihFT2JqZWN0IG1vZGVsRWxlbWVudCkgewotCQlWaWV3IHZpZXcgPSAoVmlldykgbXlFT2JqZWN0MlZpZXdNYXAuZ2V0KG1vZGVsRWxlbWVudCk7Ci0JCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCXJldHVybiAoRWRpdFBhcnQpIGdldEhvc3QoKS5nZXRWaWV3ZXIoKS5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KAotCQkJCQl2aWV3KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKkBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVMaW5rcyhFT2JqZWN0IGNvbnRhaW5lciwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCUVDbGFzcyBjb250YWluZXJNZXRhY2xhc3MgPSBjb250YWluZXIuZUNsYXNzKCk7Ci0JCXN0b3JlRmVhdHVyZU1vZGVsRmFjZXRMaW5rcyhjb250YWluZXIsIGNvbnRhaW5lck1ldGFjbGFzcywgZGlhZ3JhbSk7Ci0JCXN0b3JlVHlwZU1vZGVsRmFjZXRMaW5rcyhjb250YWluZXIsIGNvbnRhaW5lck1ldGFjbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVR5cGVNb2RlbEZhY2V0TGlua3MoRU9iamVjdCBjb250YWluZXIsCi0JCQlFQ2xhc3MgY29udGFpbmVyTWV0YWNsYXNzKSB7Ci0JCXN0b3JlVHlwZU1vZGVsRmFjZXRMaW5rc19MaW5rXzMwMDEoY29udGFpbmVyLCBjb250YWluZXJNZXRhY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVUeXBlTW9kZWxGYWNldExpbmtzX0xpbmtfMzAwMShFT2JqZWN0IGNvbnRhaW5lciwKLQkJCUVDbGFzcyBjb250YWluZXJNZXRhY2xhc3MpIHsKLQkJaWYgKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZSgpLmlzU3VwZXJUeXBlT2YoY29udGFpbmVyTWV0YWNsYXNzKSkgewotCQkJZm9yIChJdGVyYXRvciB2YWx1ZXMgPSAoKE5vZGUpIGNvbnRhaW5lcikuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpCi0JCQkJCS5pdGVyYXRvcigpOyB2YWx1ZXMuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgbmV4dFZhbHVlID0gKChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpKTsKLQkJCQlpbnQgbGlua1ZJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKG5leHRWYWx1ZSk7Ci0JCQkJaWYgKExpbmtFZGl0UGFydC5WSVNVQUxfSUQgPT0gbGlua1ZJRCkgewotCQkJCQlPYmplY3Qgc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQgPSAoKExpbmspIG5leHRWYWx1ZSkKLQkJCQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCQkJCWlmIChzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCUVPYmplY3QgZHN0ID0gKEVPYmplY3QpIHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0OwotCQkJCQkJc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQgPSAoKExpbmspIG5leHRWYWx1ZSkKLQkJCQkJCQkJLmdldFNvdXJjZSgpOwotCQkJCQkJaWYgKHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQkJCUVPYmplY3Qgc3JjID0gKEVPYmplY3QpIHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0OwotCQkJCQkJCW15TGlua0Rlc2NyaXB0b3JzLmFkZChuZXcgTGlua0Rlc2NyaXB0b3Ioc3JjLCBkc3QsCi0JCQkJCQkJCQluZXh0VmFsdWUsIERpYWdyYW1FbGVtZW50VHlwZXMuTGlua18zMDAxLAotCQkJCQkJCQkJbGlua1ZJRCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICpAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlRmVhdHVyZU1vZGVsRmFjZXRMaW5rcyhFT2JqZWN0IGNvbnRhaW5lciwKLQkJCUVDbGFzcyBjb250YWluZXJNZXRhY2xhc3MsIERpYWdyYW0gZGlhZ3JhbSkgewotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotCQlyZXR1cm4gKChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSkuZ2V0RGlhZ3JhbSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGNsYXNzIExpbmtEZXNjcmlwdG9yIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBFT2JqZWN0IG15U291cmNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIEVPYmplY3QgbXlEZXN0aW5hdGlvbjsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBFT2JqZWN0IG15TGlua0VsZW1lbnQ7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgaW50IG15VmlzdWFsSUQ7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgSUFkYXB0YWJsZSBteVNlbWFudGljQWRhcHRlcjsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIExpbmtEZXNjcmlwdG9yKEVPYmplY3Qgc291cmNlLCBFT2JqZWN0IGRlc3RpbmF0aW9uLAotCQkJCUVPYmplY3QgbGlua0VsZW1lbnQsIElFbGVtZW50VHlwZSBlbGVtZW50VHlwZSwgaW50IGxpbmtWSUQpIHsKLQkJCXRoaXMoc291cmNlLCBkZXN0aW5hdGlvbiwgbGlua1ZJRCk7Ci0JCQlteUxpbmtFbGVtZW50ID0gbGlua0VsZW1lbnQ7Ci0JCQlmaW5hbCBJRWxlbWVudFR5cGUgZWxlbWVudFR5cGVDb3B5ID0gZWxlbWVudFR5cGU7Ci0JCQlteVNlbWFudGljQWRhcHRlciA9IG5ldyBFT2JqZWN0QWRhcHRlcihsaW5rRWxlbWVudCkgewotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gZWxlbWVudFR5cGVDb3B5OwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIExpbmtEZXNjcmlwdG9yKEVPYmplY3Qgc291cmNlLCBFT2JqZWN0IGRlc3RpbmF0aW9uLAotCQkJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSwgaW50IGxpbmtWSUQpIHsKLQkJCXRoaXMoc291cmNlLCBkZXN0aW5hdGlvbiwgbGlua1ZJRCk7Ci0JCQlteUxpbmtFbGVtZW50ID0gbnVsbDsKLQkJCWZpbmFsIElFbGVtZW50VHlwZSBlbGVtZW50VHlwZUNvcHkgPSBlbGVtZW50VHlwZTsKLQkJCW15U2VtYW50aWNBZGFwdGVyID0gbmV3IElBZGFwdGFibGUoKSB7Ci0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBlbGVtZW50VHlwZUNvcHk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIExpbmtEZXNjcmlwdG9yKEVPYmplY3Qgc291cmNlLCBFT2JqZWN0IGRlc3RpbmF0aW9uLCBpbnQgbGlua1ZJRCkgewotCQkJbXlTb3VyY2UgPSBzb3VyY2U7Ci0JCQlteURlc3RpbmF0aW9uID0gZGVzdGluYXRpb247Ci0JCQlteVZpc3VhbElEID0gbGlua1ZJRDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRTb3VyY2UoKSB7Ci0JCQlyZXR1cm4gbXlTb3VyY2U7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RGVzdGluYXRpb24oKSB7Ci0JCQlyZXR1cm4gbXlEZXN0aW5hdGlvbjsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRMaW5rRWxlbWVudCgpIHsKLQkJCXJldHVybiBteUxpbmtFbGVtZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBpbnQgZ2V0VmlzdWFsSUQoKSB7Ci0JCQlyZXR1cm4gbXlWaXN1YWxJRDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgSUFkYXB0YWJsZSBnZXRTZW1hbnRpY0FkYXB0ZXIoKSB7Ci0JCQlyZXR1cm4gbXlTZW1hbnRpY0FkYXB0ZXI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MGRlNWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmNvbW1hbmRzLldvcmtQcm9kdWN0Tm9kZUNyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZHMuRHVwbGljYXRlRU9iamVjdHNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkR1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlpZiAoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Xb3JrUHJvZHVjdE5vZGVfMTAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShNb2RlbFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Tm9kZUNvbnRhaW5lcl9Ob2RlcygpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBXb3JrUHJvZHVjdE5vZGVDcmVhdGVDb21tYW5kKHJlcSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RHVwbGljYXRlQ29tbWFuZChEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QgcmVxKSB7Ci0JCS8vCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJLy8JCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJLy8JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEdXBsaWNhdGVBbnl0aGluZ0NvbW1hbmQoZWRpdGluZ0RvbWFpbiwgcmVxKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBEdXBsaWNhdGVBbnl0aGluZ0NvbW1hbmQgZXh0ZW5kcwotCQkJRHVwbGljYXRlRU9iamVjdHNDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIER1cGxpY2F0ZUFueXRoaW5nQ29tbWFuZCgKLQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLAotCQkJCUR1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCByZXEpIHsKLQkJCXN1cGVyKGVkaXRpbmdEb21haW4sIHJlcS5nZXRMYWJlbCgpLCByZXEKLQkJCQkJLmdldEVsZW1lbnRzVG9CZUR1cGxpY2F0ZWQoKSwgcmVxCi0JCQkJCS5nZXRBbGxEdXBsaWNhdGVkRWxlbWVudHNNYXAoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3ROb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVkYTAwZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3ROb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Tm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3ROb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFkMTdkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3ROb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCURpYWdyYW1HcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3ROb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUyNzQ2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3ROb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmNvbW1hbmRzLkxpbmtDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5jb21tYW5kcy5MaW5rUmVvcmllbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJaWYgKHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXEuc2V0RWxlbWVudFRvRGVzdHJveSh2aWV3KTsKLQkJfQotCQljYy5hZGQoZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpKTsKLQkJcmV0dXJuIGNjLnVud3JhcCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChEaWFncmFtRWxlbWVudFR5cGVzLkxpbmtfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0xpbmtfMzAwMUNvbW1hbmQocmVxKQotCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdMaW5rXzMwMDFDb21tYW5kKHJlcSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0xpbmtfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJTm9kZSBzb3VyY2UgPSAoTm9kZSkgc291cmNlRU9iamVjdDsKLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKHNvdXJjZSwKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVMaW5rXzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdMaW5rXzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgTm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlOb2RlIHNvdXJjZSA9IChOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlOb2RlIHRhcmdldCA9IChOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoc291cmNlLAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZSgpLCByZXEuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUxpbmtfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE5vZGVfT3V0Z29pbmdDb25uZWN0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgTGlua0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsIHNvdXJjZSwKLQkJCQl0YXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UKLQkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7Ci0JCWNhc2UgTGlua0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBMaW5rUmVvcmllbnRDb21tYW5kKHJlcSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbUNyZWF0aW9uV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbUNyZWF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NDZiNWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1DcmVhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUud2l6YXJkcy5FZGl0b3JDcmVhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQ3JlYXRpb25XaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ3JhbUNyZWF0aW9uV2l6YXJkUGFnZSBkaWFncmFtTW9kZWxGaWxlUGFnZTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGRpYWdyYW07Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBvcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvciA9IHRydWU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElXb3JrYmVuY2ggZ2V0V29ya2JlbmNoKCkgewotCQlyZXR1cm4gd29ya2JlbmNoOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgUmVzb3VyY2UgZ2V0RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzT3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IoKSB7Ci0JCXJldHVybiBvcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IoCi0JCQlib29sZWFuIG9wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yKSB7Ci0JCXRoaXMub3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IgPSBvcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWRpYWdyYW1Nb2RlbEZpbGVQYWdlID0gbmV3IERpYWdyYW1DcmVhdGlvbldpemFyZFBhZ2UoCi0JCQkJIkRpYWdyYW1Nb2RlbEZpbGUiLCBnZXRTZWxlY3Rpb24oKSwgIndwZGQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWRpYWdyYW1Nb2RlbEZpbGVQYWdlLnNldFRpdGxlKCJDcmVhdGUgV1BERCBEaWFncmFtIik7Ci0JCWRpYWdyYW1Nb2RlbEZpbGVQYWdlCi0JCQkJLnNldERlc2NyaXB0aW9uKCJTZWxlY3QgZmlsZSB0aGF0IHdpbGwgY29udGFpbiBkaWFncmFtIGFuZCBkb21haW4gbW9kZWxzLiIpOwotCQlhZGRQYWdlKGRpYWdyYW1Nb2RlbEZpbGVQYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbihudWxsKSB7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCWRpYWdyYW0gPSBEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwuY3JlYXRlRGlhZ3JhbSgKLQkJCQkJCWRpYWdyYW1Nb2RlbEZpbGVQYWdlLmdldFVSSSgpLCBtb25pdG9yKTsKLQkJCQlpZiAoaXNPcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcigpICYmIGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLm9wZW5EaWFncmFtKGRpYWdyYW0pOwotCQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSwKLQkJCQkJCQkJIkVycm9yIG9wZW5pbmcgZGlhZ3JhbSBlZGl0b3IiLCBudWxsLCBlCi0JCQkJCQkJCQkJLmdldFN0YXR1cygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bihmYWxzZSwgdHJ1ZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJaWYgKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksCi0JCQkJCQkiQ3JlYXRpb24gUHJvYmxlbXMiLCBudWxsLCAoKENvcmVFeGNlcHRpb24pIGUKLQkJCQkJCQkJLmdldFRhcmdldEV4Y2VwdGlvbigpKS5nZXRTdGF0dXMoKSk7Ci0JCQl9IGVsc2UgewotCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCSJFcnJvciBjcmVhdGluZyBkaWFncmFtIiwgZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlzZXRXaW5kb3dUaXRsZSgiTmV3IFdQREQgRGlhZ3JhbSIpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihXUEREaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IoImljb25zL3dpemJhbi9OZXdNb2RlbFdpemFyZC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1DcmVhdGlvbldpemFyZFBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtQ3JlYXRpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNjFmNWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1DcmVhdGlvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS53aXphcmRzLkVkaXRvcldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnV0aWwuRGlhZ3JhbUZpbGVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNyZWF0aW9uV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGZpbGVFeHRlbnNpb247Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1DcmVhdGlvbldpemFyZFBhZ2UoU3RyaW5nIHBhZ2VOYW1lLAotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBTdHJpbmcgZmlsZUV4dGVuc2lvbikgewotCQlzdXBlcihwYWdlTmFtZSwgc2VsZWN0aW9uKTsKLQkJdGhpcy5maWxlRXh0ZW5zaW9uID0gZmlsZUV4dGVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBjcmVhdGUgZmlsZXMgd2l0aCB0aGlzIGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFeHRlbnNpb24oKSB7Ci0JCXJldHVybiBmaWxlRXh0ZW5zaW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVVJJIGdldFVSSSgpIHsKLQkJcmV0dXJuIFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGdldEZpbGVQYXRoKCkudG9TdHJpbmcoKSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhdGggZ2V0RmlsZVBhdGgoKSB7Ci0JCUlQYXRoIHBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlwYXRoID0gbmV3IFBhdGgoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nIGZpbGVOYW1lID0gZ2V0RmlsZU5hbWUoKTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLQkJCXBhdGggPSBwYXRoLmFwcGVuZChmaWxlTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCXNldEZpbGVOYW1lKERpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5nZXRVbmlxdWVGaWxlTmFtZSgKLQkJCQlnZXRDb250YWluZXJGdWxsUGF0aCgpLCBnZXRGaWxlTmFtZSgpLCBnZXRFeHRlbnNpb24oKSkpOwotCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCWlmICghc3VwZXIudmFsaWRhdGVQYWdlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uKCk7Ci0JCWlmIChleHRlbnNpb24gIT0gbnVsbAotCQkJCSYmICFnZXRGaWxlUGF0aCgpLnRvU3RyaW5nKCkuZW5kc1dpdGgoIi4iICsgZXh0ZW5zaW9uKSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKAotCQkJCQkiRmlsZSBuYW1lIHNob3VsZCBoYXZlICcnezB9JycgZXh0ZW5zaW9uLiIsIGV4dGVuc2lvbikpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1EaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDIyZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1EaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1EaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcwotCQlEaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXRFZGl0b3JDbGFzcygpIHsKLQkJcmV0dXJuIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3IuY2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWRpdG9ySWQoKSB7Ci0JCXJldHVybiBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9yLklEOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBkYjAwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5PcGVyYXRpb25IaXN0b3J5RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5WaWV3U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklQcmltYXJ5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5JRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLnV0aWwuSURFRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IudXRpbC5EaWFncmFtRmlsZUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLkdNRkVkaXRpbmdEb21haW5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU1GQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBvdXJTYXZlT3B0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0U2F2ZU9wdGlvbnMoKSB7Ci0JCWlmIChvdXJTYXZlT3B0aW9ucyA9PSBudWxsKSB7Ci0JCQlvdXJTYXZlT3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlvdXJTYXZlT3B0aW9ucy5wdXQoWE1JUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJb3VyU2F2ZU9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9SRUNPUkRfVU5LTk9XTl9GRUFUVVJFLAotCQkJCQlCb29sZWFuLlRSVUUpOwotCQkJb3VyU2F2ZU9wdGlvbnMucHV0KFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRCwKLQkJCQkJUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VEX01FTU9SWV9CVUZGRVIpOwotCQl9Ci0JCXJldHVybiBvdXJTYXZlT3B0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5EaWFncmFtKFJlc291cmNlIGRpYWdyYW0pCi0JCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlyZXR1cm4gRWRpdFVJVXRpbC5vcGVuRWRpdG9yKChFT2JqZWN0KSBkaWFncmFtLmdldENvbnRlbnRzKCkuZ2V0KDApKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENoYXJzZXQoSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCWZpbGUuc2V0Q2hhcnNldCgiVVRGLTgiLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBzZXQgY2hhcnNldCBmb3IgZmlsZSAiICsgZmlsZS5nZXRGdWxsUGF0aCgpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZUZpbGVOYW1lKElQYXRoIGNvbnRhaW5lckZ1bGxQYXRoLAotCQkJU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0JCWlmIChjb250YWluZXJGdWxsUGF0aCA9PSBudWxsKSB7Ci0JCQljb250YWluZXJGdWxsUGF0aCA9IG5ldyBQYXRoKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChmaWxlTmFtZSA9PSBudWxsIHx8IGZpbGVOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlmaWxlTmFtZSA9ICJkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlQYXRoIGZpbGVQYXRoID0gY29udGFpbmVyRnVsbFBhdGguYXBwZW5kKGZpbGVOYW1lKTsKLQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsICYmICFleHRlbnNpb24uZXF1YWxzKGZpbGVQYXRoLmdldEZpbGVFeHRlbnNpb24oKSkpIHsKLQkJCWZpbGVQYXRoID0gZmlsZVBhdGguYWRkRmlsZUV4dGVuc2lvbihleHRlbnNpb24pOwotCQl9Ci0JCWV4dGVuc2lvbiA9IGZpbGVQYXRoLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJZmlsZU5hbWUgPSBmaWxlUGF0aC5yZW1vdmVGaWxlRXh0ZW5zaW9uKCkubGFzdFNlZ21lbnQoKTsKLQkJaW50IGkgPSAxOwotCQl3aGlsZSAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5leGlzdHMoZmlsZVBhdGgpKSB7Ci0JCQlpKys7Ci0JCQlmaWxlUGF0aCA9IGNvbnRhaW5lckZ1bGxQYXRoLmFwcGVuZChmaWxlTmFtZSArIGkpOwotCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7Ci0JCQkJZmlsZVBhdGggPSBmaWxlUGF0aC5hZGRGaWxlRXh0ZW5zaW9uKGV4dGVuc2lvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbGVQYXRoLmxhc3RTZWdtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogUnVucyB0aGUgd2l6YXJkIGluIGEgZGlhbG9nLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuV2l6YXJkKFNoZWxsIHNoZWxsLCBXaXphcmQgd2l6YXJkLCBTdHJpbmcgc2V0dGluZ3NLZXkpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHBsdWdpbkRpYWxvZ1NldHRpbmdzID0gV1BERGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCS5nZXRJbnN0YW5jZSgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCUlEaWFsb2dTZXR0aW5ncyB3aXphcmREaWFsb2dTZXR0aW5ncyA9IHBsdWdpbkRpYWxvZ1NldHRpbmdzCi0JCQkJLmdldFNlY3Rpb24oc2V0dGluZ3NLZXkpOwotCQlpZiAod2l6YXJkRGlhbG9nU2V0dGluZ3MgPT0gbnVsbCkgewotCQkJd2l6YXJkRGlhbG9nU2V0dGluZ3MgPSBwbHVnaW5EaWFsb2dTZXR0aW5ncwotCQkJCQkuYWRkTmV3U2VjdGlvbihzZXR0aW5nc0tleSk7Ci0JCX0KLQkJd2l6YXJkLnNldERpYWxvZ1NldHRpbmdzKHdpemFyZERpYWxvZ1NldHRpbmdzKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZShNYXRoLm1heCg1MDAsIGRpYWxvZy5nZXRTaGVsbCgpLmdldFNpemUoKS54KSwKLQkJCQk1MDApOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2l0aGluIGEgd29ya3NwYWNlIG1vZGlmeSBvcGVyYXRpb24gc2luY2UgaXQgY3JlYXRlcyByZXNvdXJjZXMuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgY3JlYXRlRGlhZ3JhbShVUkkgZGlhZ3JhbVVSSSwKLQkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBHTUZFZGl0aW5nRG9tYWluRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVFZGl0aW5nRG9tYWluKCk7Ci0JCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soCi0JCQkJTWVzc2FnZXMuRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Qcm9ncmVzc1Rhc2ssIDMpOwotCQlmaW5hbCBSZXNvdXJjZSBkaWFncmFtUmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkKLQkJCQkuY3JlYXRlUmVzb3VyY2UoZGlhZ3JhbVVSSSk7Ci0JCWZpbmFsIFN0cmluZyBkaWFncmFtTmFtZSA9IGRpYWdyYW1VUkkubGFzdFNlZ21lbnQoKTsKLQkJQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCBjb21tYW5kID0gbmV3IEFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQoCi0JCQkJZWRpdGluZ0RvbWFpbiwKLQkJCQlNZXNzYWdlcy5EaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbUNvbW1hbmRMYWJlbCwKLQkJCQlDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKSB7Ci0JCQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KAotCQkJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSBtb2RlbCA9IGNyZWF0ZUluaXRpYWxNb2RlbCgpOwotCQkJCWF0dGFjaE1vZGVsVG9SZXNvdXJjZShtb2RlbCwgZGlhZ3JhbVJlc291cmNlKTsKLQotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZURpYWdyYW0obW9kZWwsCi0JCQkJCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQsCi0JCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQlkaWFncmFtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7Ci0JCQkJCWRpYWdyYW0uc2V0TmFtZShkaWFncmFtTmFtZSk7Ci0JCQkJCWRpYWdyYW0uc2V0RWxlbWVudChtb2RlbCk7Ci0JCQkJfQotCi0JCQkJdHJ5IHsKLQotCQkJCQlkaWFncmFtUmVzb3VyY2UKLQkJCQkJCQkuc2F2ZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsCi0JCQkJCQkJCQkuZ2V0U2F2ZU9wdGlvbnMoKSk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCi0JCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCQkiVW5hYmxlIHRvIHN0b3JlIG1vZGVsIGFuZCBkaWFncmFtIHJlc291cmNlcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdCgpOwotCQkJfQotCQl9OwotCQl0cnkgewotCQkJT3BlcmF0aW9uSGlzdG9yeUZhY3RvcnkuZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLmV4ZWN1dGUoY29tbWFuZCwKLQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDEpLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBjcmVhdGUgbW9kZWwgYW5kIGRpYWdyYW0iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJc2V0Q2hhcnNldChXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShkaWFncmFtUmVzb3VyY2UpKTsKLQkJcmV0dXJuIGRpYWdyYW1SZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgZG9tYWluIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIGNhbnZhcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIGNyZWF0ZUluaXRpYWxNb2RlbCgpIHsKLQkJcmV0dXJuIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpOwotCX0KLQotCS8qKgotCSAqIFN0b3JlIG1vZGVsIGVsZW1lbnQgaW4gdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYXR0YWNoTW9kZWxUb1Jlc291cmNlKAotCQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSBtb2RlbCwgUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VsZWN0RWxlbWVudHNJbkRpYWdyYW0oCi0JCQlJRGlhZ3JhbVdvcmtiZW5jaFBhcnQgZGlhZ3JhbVBhcnQsIExpc3QvKkVkaXRQYXJ0Ki9lZGl0UGFydHMpIHsKLQkJZGlhZ3JhbVBhcnQuZ2V0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcigpLmRlc2VsZWN0QWxsKCk7Ci0KLQkJRWRpdFBhcnQgZmlyc3RQcmltYXJ5ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVkaXRQYXJ0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFZGl0UGFydCBuZXh0UGFydCA9IChFZGl0UGFydCkgaXQubmV4dCgpOwotCQkJZGlhZ3JhbVBhcnQuZ2V0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcigpLmFwcGVuZFNlbGVjdGlvbihuZXh0UGFydCk7Ci0JCQlpZiAoZmlyc3RQcmltYXJ5ID09IG51bGwgJiYgbmV4dFBhcnQgaW5zdGFuY2VvZiBJUHJpbWFyeUVkaXRQYXJ0KSB7Ci0JCQkJZmlyc3RQcmltYXJ5ID0gbmV4dFBhcnQ7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWVkaXRQYXJ0cy5pc0VtcHR5KCkpIHsKLQkJCWRpYWdyYW1QYXJ0LmdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKS5yZXZlYWwoCi0JCQkJCWZpcnN0UHJpbWFyeSAhPSBudWxsID8gZmlyc3RQcmltYXJ5IDogKEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCQkuZ2V0KDApKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZmluZEVsZW1lbnRzSW5EaWFncmFtQnlJRChEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbVBhcnQsCi0JCQlFT2JqZWN0IGVsZW1lbnQsIExpc3QgZWRpdFBhcnRDb2xsZWN0b3IpIHsKLQkJSURpYWdyYW1HcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKElEaWFncmFtR3JhcGhpY2FsVmlld2VyKSBkaWFncmFtUGFydAotCQkJCS5nZXRWaWV3ZXIoKTsKLQkJZmluYWwgaW50IGludGlhbE51bU9mRWRpdFBhcnRzID0gZWRpdFBhcnRDb2xsZWN0b3Iuc2l6ZSgpOwotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmlldykgeyAvLyBzdXBwb3J0IG5vdGF0aW9uIGVsZW1lbnQgbG9va3VwCi0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgdmlld2VyLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQoCi0JCQkJCWVsZW1lbnQpOwotCQkJaWYgKGVkaXRQYXJ0ICE9IG51bGwpIHsKLQkJCQllZGl0UGFydENvbGxlY3Rvci5hZGQoZWRpdFBhcnQpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGVsZW1lbnRJRCA9IEVNRkNvcmVVdGlsLmdldFByb3h5SUQoZWxlbWVudCk7Ci0JCUxpc3QgYXNzb2NpYXRlZFBhcnRzID0gdmlld2VyLmZpbmRFZGl0UGFydHNGb3JFbGVtZW50KGVsZW1lbnRJRCwKLQkJCQlJR3JhcGhpY2FsRWRpdFBhcnQuY2xhc3MpOwotCQkvLyBwZXJmb3JtIHRoZSBwb3NzaWJsZSBoaWVyYXJjaHkgZGlzam9pbnQgLT4gdGFrZSB0aGUgdG9wLW1vc3QgcGFydHMgb25seQotCQlmb3IgKEl0ZXJhdG9yIGVkaXRQYXJ0SXQgPSBhc3NvY2lhdGVkUGFydHMuaXRlcmF0b3IoKTsgZWRpdFBhcnRJdAotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlFZGl0UGFydCBuZXh0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRJdC5uZXh0KCk7Ci0JCQlFZGl0UGFydCBwYXJlbnRQYXJ0ID0gbmV4dFBhcnQuZ2V0UGFyZW50KCk7Ci0JCQl3aGlsZSAocGFyZW50UGFydCAhPSBudWxsICYmICFhc3NvY2lhdGVkUGFydHMuY29udGFpbnMocGFyZW50UGFydCkpIHsKLQkJCQlwYXJlbnRQYXJ0ID0gcGFyZW50UGFydC5nZXRQYXJlbnQoKTsKLQkJCX0KLQkJCWlmIChwYXJlbnRQYXJ0ID09IG51bGwpIHsKLQkJCQllZGl0UGFydENvbGxlY3Rvci5hZGQobmV4dFBhcnQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGludGlhbE51bU9mRWRpdFBhcnRzID09IGVkaXRQYXJ0Q29sbGVjdG9yLnNpemUoKSkgewotCQkJaWYgKCFhc3NvY2lhdGVkUGFydHMuaXNFbXB0eSgpKSB7Ci0JCQkJZWRpdFBhcnRDb2xsZWN0b3IuYWRkKGFzc29jaWF0ZWRQYXJ0cy5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChlbGVtZW50LmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBmaW5kRWxlbWVudHNJbkRpYWdyYW1CeUlEKGRpYWdyYW1QYXJ0LCBlbGVtZW50Ci0JCQkJCQkJLmVDb250YWluZXIoKSwgZWRpdFBhcnRDb2xsZWN0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWRpdFBhcnRDb2xsZWN0b3Iuc2l6ZSgpIC0gaW50aWFsTnVtT2ZFZGl0UGFydHM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmlldyBmaW5kVmlldyhEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0LAotCQkJRU9iamVjdCB0YXJnZXRFbGVtZW50LCBMYXp5RWxlbWVudDJWaWV3TWFwIGxhenlFbGVtZW50MlZpZXdNYXApIHsKLQkJYm9vbGVhbiBoYXNTdHJ1Y3R1cmFsVVJJID0gZmFsc2U7Ci0JCWlmICh0YXJnZXRFbGVtZW50LmVSZXNvdXJjZSgpIGluc3RhbmNlb2YgWE1MUmVzb3VyY2UpIHsKLQkJCWhhc1N0cnVjdHVyYWxVUkkgPSAoKFhNTFJlc291cmNlKSB0YXJnZXRFbGVtZW50LmVSZXNvdXJjZSgpKQotCQkJCQkuZ2V0SUQodGFyZ2V0RWxlbWVudCkgPT0gbnVsbDsKLQkJfQotCi0JCVZpZXcgdmlldyA9IG51bGw7Ci0JCWlmIChoYXNTdHJ1Y3R1cmFsVVJJCi0JCQkJJiYgIWxhenlFbGVtZW50MlZpZXdNYXAuZ2V0RWxlbWVudDJWaWV3TWFwKCkuaXNFbXB0eSgpKSB7Ci0JCQl2aWV3ID0gKFZpZXcpIGxhenlFbGVtZW50MlZpZXdNYXAuZ2V0RWxlbWVudDJWaWV3TWFwKCkuZ2V0KAotCQkJCQl0YXJnZXRFbGVtZW50KTsKLQkJfSBlbHNlIGlmIChmaW5kRWxlbWVudHNJbkRpYWdyYW1CeUlEKGRpYWdyYW1FZGl0UGFydCwgdGFyZ2V0RWxlbWVudCwKLQkJCQlsYXp5RWxlbWVudDJWaWV3TWFwLmVkaXRQYXJ0VG1wSG9sZGVyKSA+IDApIHsKLQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBsYXp5RWxlbWVudDJWaWV3TWFwLmVkaXRQYXJ0VG1wSG9sZGVyCi0JCQkJCS5nZXQoMCk7Ci0JCQlsYXp5RWxlbWVudDJWaWV3TWFwLmVkaXRQYXJ0VG1wSG9sZGVyLmNsZWFyKCk7Ci0JCQl2aWV3ID0gZWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFZpZXcgPyAoVmlldykgZWRpdFBhcnQKLQkJCQkJLmdldE1vZGVsKCkgOiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuICh2aWV3ID09IG51bGwpID8gZGlhZ3JhbUVkaXRQYXJ0LmdldERpYWdyYW1WaWV3KCkgOiB2aWV3OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIExhenlFbGVtZW50MlZpZXdNYXAgewotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBNYXAgZWxlbWVudDJWaWV3TWFwOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFZpZXcgc2NvcGU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgU2V0IGVsZW1lbnRTZXQ7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBmaW5hbCBMaXN0IGVkaXRQYXJ0VG1wSG9sZGVyID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTGF6eUVsZW1lbnQyVmlld01hcChWaWV3IHNjb3BlLCBTZXQgZWxlbWVudHMpIHsKLQkJCXRoaXMuc2NvcGUgPSBzY29wZTsKLQkJCXRoaXMuZWxlbWVudFNldCA9IGVsZW1lbnRzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBmaW5hbCBNYXAgZ2V0RWxlbWVudDJWaWV3TWFwKCkgewotCQkJaWYgKGVsZW1lbnQyVmlld01hcCA9PSBudWxsKSB7Ci0JCQkJZWxlbWVudDJWaWV3TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkvLyBtYXAgcG9zc2libGUgbm90YXRpb24gZWxlbWVudHMgdG8gaXRzZWxmIGFzIHRoZXNlIGNhbid0IGJlIGZvdW5kIGJ5IHZpZXcuZ2V0RWxlbWVudCgpCi0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRTZXQuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQkJCVZpZXcgdmlldyA9IChWaWV3KSBlbGVtZW50OwotCQkJCQkJaWYgKHZpZXcuZ2V0RGlhZ3JhbSgpID09IHNjb3BlLmdldERpYWdyYW0oKSkgewotCQkJCQkJCWVsZW1lbnQyVmlld01hcC5wdXQoZWxlbWVudCwgZWxlbWVudCk7IC8vIHRha2Ugb25seSB0aG9zZSB0aGF0IHBhcnQgb2Ygb3VyIGRpYWdyYW0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWJ1aWxkRWxlbWVudDJWaWV3TWFwKHNjb3BlLCBlbGVtZW50MlZpZXdNYXAsIGVsZW1lbnRTZXQpOwotCQkJfQotCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlzdGF0aWMgTWFwIGJ1aWxkRWxlbWVudDJWaWV3TWFwKFZpZXcgcGFyZW50VmlldywgTWFwIGVsZW1lbnQyVmlld01hcCwKLQkJCQlTZXQgZWxlbWVudHMpIHsKLQkJCWlmIChlbGVtZW50cy5zaXplKCkgPT0gZWxlbWVudDJWaWV3TWFwLnNpemUoKSkKLQkJCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCi0JCQlpZiAocGFyZW50Vmlldy5pc1NldEVsZW1lbnQoKQotCQkJCQkmJiAhZWxlbWVudDJWaWV3TWFwLmNvbnRhaW5zS2V5KHBhcmVudFZpZXcuZ2V0RWxlbWVudCgpKQotCQkJCQkmJiBlbGVtZW50cy5jb250YWlucyhwYXJlbnRWaWV3LmdldEVsZW1lbnQoKSkpIHsKLQkJCQllbGVtZW50MlZpZXdNYXAucHV0KHBhcmVudFZpZXcuZ2V0RWxlbWVudCgpLCBwYXJlbnRWaWV3KTsKLQkJCQlpZiAoZWxlbWVudHMuc2l6ZSgpID09IGVsZW1lbnQyVmlld01hcC5zaXplKCkpCi0JCQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwYXJlbnRWaWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlidWlsZEVsZW1lbnQyVmlld01hcCgoVmlldykgaXQubmV4dCgpLCBlbGVtZW50MlZpZXdNYXAsCi0JCQkJCQllbGVtZW50cyk7Ci0JCQkJaWYgKGVsZW1lbnRzLnNpemUoKSA9PSBlbGVtZW50MlZpZXdNYXAuc2l6ZSgpKQotCQkJCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBhcmVudFZpZXcuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCWJ1aWxkRWxlbWVudDJWaWV3TWFwKChWaWV3KSBpdC5uZXh0KCksIGVsZW1lbnQyVmlld01hcCwKLQkJCQkJCWVsZW1lbnRzKTsKLQkJCQlpZiAoZWxlbWVudHMuc2l6ZSgpID09IGVsZW1lbnQyVmlld01hcC5zaXplKCkpCi0JCQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGFyZW50Vmlldy5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJYnVpbGRFbGVtZW50MlZpZXdNYXAoKFZpZXcpIGl0Lm5leHQoKSwgZWxlbWVudDJWaWV3TWFwLAotCQkJCQkJZWxlbWVudHMpOwotCQkJCWlmIChlbGVtZW50cy5zaXplKCkgPT0gZWxlbWVudDJWaWV3TWFwLnNpemUoKSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQkJCX0KLQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCX0KLQl9IC8vTGF6eUVsZW1lbnQyVmlld01hcAkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1EaWFncmFtRmlsZUNyZWF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRGlhZ3JhbUZpbGVDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NTg3OTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1EaWFncmFtRmlsZUNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUudXRpbC5JREVFZGl0b3JGaWxlQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IudXRpbC5EaWFncmFtRmlsZUNyZWF0b3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbURpYWdyYW1GaWxlQ3JlYXRvciBleHRlbmRzIElERUVkaXRvckZpbGVDcmVhdG9yIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBEaWFncmFtRGlhZ3JhbUZpbGVDcmVhdG9yIElOU1RBTkNFID0gbmV3IERpYWdyYW1EaWFncmFtRmlsZUNyZWF0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpYWdyYW1GaWxlQ3JlYXRvciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKLQkJcmV0dXJuICIud3BkZCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbURpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWRmMTU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLkRpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMKLQkJRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlzdXBlci5pbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCk7Ci0JCURpYWdyYW1Db3JlVXRpbC5zZXREZWZhdWx0Rm9udFByZWZlcmVuY2UoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlEaWFncmFtQ29yZVV0aWwuaGlkZUNvbm5lY3Rpb25IYW5kbGVzKGdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRG9jdW1lbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzdjMWI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRG9jdW1lbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLk11bHRpUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLkRlbXVsdGlwbGV4aW5nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLk5vdGlmaWNhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS51dGlsLldvcmtzcGFjZVN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuRGlhZ3JhbUVkaXRpbmdEb21haW5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5BYnN0cmFjdERvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkRpYWdyYW1Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRGlhZ3JhbURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRGlhZ3JhbURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmRvY3VtZW50LkZpbGVEaWFncmFtRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmRvY3VtZW50LkZpbGVEaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmludGVybmFsLkVkaXRvclN0YXR1c0NvZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pbnRlcm5hbC51dGlsLkRpYWdyYW1JT1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUucmVzb3VyY2VzLkdNRlJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRG9jdW1lbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RG9jdW1lbnRQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlEaWFncmFtRG9jdW1lbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnRJbmZvIGNyZWF0ZUVsZW1lbnRJbmZvKE9iamVjdCBlbGVtZW50KQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmFsc2UgPT0gZWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dAotCQkJCSYmIGZhbHNlID09IGVsZW1lbnQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCTAsCi0JCQkJCQkJTkxTCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvciwKLQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dCIsCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQiIH0pLAotCQkJCQkJCW51bGwpKTsKLQkJfQotCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSAoSUVkaXRvcklucHV0KSBlbGVtZW50OwotCQlJRGlhZ3JhbURvY3VtZW50IGRvY3VtZW50ID0gKElEaWFncmFtRG9jdW1lbnQpIGNyZWF0ZURvY3VtZW50KGVkaXRvcklucHV0KTsKLQotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IG5ldyBSZXNvdXJjZVNldEluZm8oZG9jdW1lbnQsIGVkaXRvcklucHV0KTsKLQkJaW5mby5zZXRNb2RpZmljYXRpb25TdGFtcChjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoaW5mbykpOwotCQlpbmZvLmZTdGF0dXMgPSBudWxsOwotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElEb2N1bWVudCBjcmVhdGVEb2N1bWVudChPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmFsc2UgPT0gZWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dAotCQkJCSYmIGZhbHNlID09IGVsZW1lbnQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCTAsCi0JCQkJCQkJTkxTCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvciwKLQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dCIsCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQiIH0pLAotCQkJCQkJCW51bGwpKTsKLQkJfQotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBjcmVhdGVFbXB0eURvY3VtZW50KCk7Ci0JCXNldERvY3VtZW50Q29udGVudChkb2N1bWVudCwgKElFZGl0b3JJbnB1dCkgZWxlbWVudCk7Ci0JCXNldHVwRG9jdW1lbnQoZWxlbWVudCwgZG9jdW1lbnQpOwotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZ2l2ZW4gZG9jdW1lbnQgYXMgaXQgd291bGQgYmUgcHJvdmlkZWQgZm9yIHRoZSBnaXZlbiBlbGVtZW50LiBUaGUKLQkgKiBjb250ZW50IG9mIHRoZSBkb2N1bWVudCBpcyBub3QgY2hhbmdlZC4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGVtcHR5LgotCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBibHVlLXByaW50IGVsZW1lbnQKLQkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IHRvIHNldCB1cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cERvY3VtZW50KE9iamVjdCBlbGVtZW50LCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLy8gZm9yIHN1YmNsYXNzZXMKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBsb25nIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChSZXNvdXJjZVNldEluZm8gaW5mbykgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCWlmIChmaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgKz0gZmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmxhc3RNb2RpZmllZCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdCArPSBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRG9jdW1lbnQgY3JlYXRlRW1wdHlEb2N1bWVudCgpIHsKLQkJRGlhZ3JhbURvY3VtZW50IGRvY3VtZW50ID0gbmV3IERpYWdyYW1Eb2N1bWVudCgpOwotCQlkb2N1bWVudC5zZXRFZGl0aW5nRG9tYWluKGNyZWF0ZUVkaXRpbmdEb21haW4oKSk7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBjcmVhdGVFZGl0aW5nRG9tYWluKCkgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gRGlhZ3JhbUVkaXRpbmdEb21haW5GYWN0b3J5Ci0JCQkJLmdldEluc3RhbmNlKCkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOwotCQllZGl0aW5nRG9tYWluLnNldElEKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLkVkaXRpbmdEb21haW4iKTsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBOb3RpZmljYXRpb25GaWx0ZXIgZGlhZ3JhbVJlc291cmNlTW9kaWZpZWRGaWx0ZXIgPSBOb3RpZmljYXRpb25GaWx0ZXIKLQkJCQkuY3JlYXRlTm90aWZpZXJGaWx0ZXIoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKS5hbmQoCi0JCQkJCQlOb3RpZmljYXRpb25GaWx0ZXIKLQkJCQkJCQkJLmNyZWF0ZUV2ZW50VHlwZUZpbHRlcihOb3RpZmljYXRpb24uQUREKSkuYW5kKAotCQkJCQkJTm90aWZpY2F0aW9uRmlsdGVyLmNyZWF0ZUZlYXR1cmVGaWx0ZXIoCi0JCQkJCQkJCVJlc291cmNlU2V0LmNsYXNzLAotCQkJCQkJCQlSZXNvdXJjZVNldC5SRVNPVVJDRV9TRVRfX1JFU09VUkNFUykpOwotCQllZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZUFkYXB0ZXJzKCkuYWRkKG5ldyBBZGFwdGVyKCkgewotCi0JCQlwcml2YXRlIE5vdGlmaWVyIG15VGFyZ2VyOwotCi0JCQlwdWJsaWMgTm90aWZpZXIgZ2V0VGFyZ2V0KCkgewotCQkJCXJldHVybiBteVRhcmdlcjsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJaWYgKGRpYWdyYW1SZXNvdXJjZU1vZGlmaWVkRmlsdGVyLm1hdGNoZXMobm90aWZpY2F0aW9uKSkgewotCQkJCQlPYmplY3QgdmFsdWUgPSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCQkJCSgoUmVzb3VyY2UpIHZhbHVlKS5zZXRUcmFja2luZ01vZGlmaWNhdGlvbih0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgewotCQkJCW15VGFyZ2VyID0gbmV3VGFyZ2V0OwotCQkJfQotCi0JCX0pOwotCi0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudENvbnRlbnQoSURvY3VtZW50IGRvY3VtZW50LCBJRWRpdG9ySW5wdXQgZWxlbWVudCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSURpYWdyYW1Eb2N1bWVudCBkaWFncmFtRG9jdW1lbnQgPSAoSURpYWdyYW1Eb2N1bWVudCkgZG9jdW1lbnQ7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiA9IGRpYWdyYW1Eb2N1bWVudC5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlJU3RvcmFnZSBzdG9yYWdlID0gKChGaWxlRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldFN0b3JhZ2UoKTsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IERpYWdyYW1JT1V0aWwubG9hZChkb21haW4sIHN0b3JhZ2UsIHRydWUsCi0JCQkJCWdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCWRvY3VtZW50LnNldENvbnRlbnQoZGlhZ3JhbSk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7Ci0JCQlVUkkgdXJpID0gKChVUklFZGl0b3JJbnB1dCkgZWxlbWVudCkuZ2V0VVJJKCk7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXJlc291cmNlID0gZG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UoCi0JCQkJCQl1cmkudHJpbUZyYWdtZW50KCksIGZhbHNlKTsKLQkJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCQlyZXNvdXJjZSA9IGRvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmNyZWF0ZVJlc291cmNlKAotCQkJCQkJCXVyaS50cmltRnJhZ21lbnQoKSk7Ci0JCQkJfQotCQkJCWlmICghcmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQl0cnkgewotCQkJCQkJTWFwIG9wdGlvbnMgPSBuZXcgSGFzaE1hcChHTUZSZXNvdXJjZUZhY3RvcnkKLQkJCQkJCQkJLmdldERlZmF1bHRMb2FkT3B0aW9ucygpKTsKLQkJCQkJCS8vIEBzZWUgMTcxMDYwIAotCQkJCQkJLy8gb3B0aW9ucy5wdXQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZS5PUFRJT05fUkVDT1JEX1VOS05PV05fRkVBVFVSRSwgQm9vbGVhbi5UUlVFKTsKLQkJCQkJCXJlc291cmNlLmxvYWQob3B0aW9ucyk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXJlc291cmNlLnVubG9hZCgpOwotCQkJCQkJdGhyb3cgZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9VbmFibGVUb0xvYWRSZXNvdXJjZUVycm9yKTsKLQkJCQl9Ci0JCQkJaWYgKHVyaS5mcmFnbWVudCgpICE9IG51bGwpIHsKLQkJCQkJRU9iamVjdCByb290RWxlbWVudCA9IHJlc291cmNlLmdldEVPYmplY3QodXJpLmZyYWdtZW50KCkpOwotCQkJCQlpZiAocm9vdEVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJCQlkb2N1bWVudC5zZXRDb250ZW50KChEaWFncmFtKSByb290RWxlbWVudCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3Qgcm9vdEVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQkJCQlpZiAocm9vdEVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJCQkJZG9jdW1lbnQuc2V0Q29udGVudCgoRGlhZ3JhbSkgcm9vdEVsZW1lbnQpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX05vRGlhZ3JhbUluUmVzb3VyY2VFcnJvcik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUNvcmVFeGNlcHRpb24gdGhyb3duRXhjcCA9IG51bGw7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQkJCXRocm93bkV4Y3AgPSAoQ29yZUV4Y2VwdGlvbikgZTsKLQkJCQl9IGVsc2UgewotCQkJCQlTdHJpbmcgbXNnID0gZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCQkJCXRocm93bkV4Y3AgPSBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQkJCQkwLAotCQkJCQkJCQkJbXNnICE9IG51bGwgPyBtc2cKLQkJCQkJCQkJCQkJOiBNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9EaWFncmFtTG9hZGluZ0Vycm9yLAotCQkJCQkJCQkJZSkpOwotCQkJCX0KLQkJCQl0aHJvdyB0aHJvd25FeGNwOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCTAsCi0JCQkJCQkJTkxTCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvciwKLQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dCIsCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQiIH0pLAotCQkJCQkJCW51bGwpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcChPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChpbmZvKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3QgZWxlbWVudCkgewotCQlJRGlhZ3JhbURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RGlhZ3JhbURvY3VtZW50KGVsZW1lbnQpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gZG9jdW1lbnQuZ2V0RGlhZ3JhbSgpLmVSZXNvdXJjZSgpOwotCQkJaWYgKGRpYWdyYW1SZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKGRpYWdyYW1SZXNvdXJjZSk7Ci0JCQkJcmV0dXJuIGZpbGUgPT0gbnVsbCB8fCBmaWxlLmdldExvY2F0aW9uKCkgPT0gbnVsbAotCQkJCQkJfHwgIWZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5leGlzdHMoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNEZWxldGVkKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZXRJbmZvIGdldFJlc291cmNlU2V0SW5mbyhPYmplY3QgZWRpdG9ySW5wdXQpIHsKLQkJcmV0dXJuIChSZXNvdXJjZVNldEluZm8pIHN1cGVyLmdldEVsZW1lbnRJbmZvKGVkaXRvcklucHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUVsZW1lbnRJbmZvKE9iamVjdCBlbGVtZW50LCBFbGVtZW50SW5mbyBpbmZvKSB7Ci0JCWlmIChpbmZvIGluc3RhbmNlb2YgUmVzb3VyY2VTZXRJbmZvKSB7Ci0JCQlSZXNvdXJjZVNldEluZm8gcmVzb3VyY2VTZXRJbmZvID0gKFJlc291cmNlU2V0SW5mbykgaW5mbzsKLQkJCXJlc291cmNlU2V0SW5mby5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZUVsZW1lbnRJbmZvKGVsZW1lbnQsIGluZm8pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1ZhbGlkYXRlU3RhdGUoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBjb21wdXRhdGlvbkNvbnRleHQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGZpbGVzMlZhbGlkYXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJZmlsZXMyVmFsaWRhdGUuYWRkKGZpbGUpOwotCQkJCX0KLQkJCX0KLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQoCi0JCQkJCShJRmlsZVtdKSBmaWxlczJWYWxpZGF0ZS50b0FycmF5KG5ldyBJRmlsZVtmaWxlczJWYWxpZGF0ZQotCQkJCQkJCS5zaXplKCldKSwgY29tcHV0YXRpb25Db250ZXh0KTsKLQkJfQotCi0JCXN1cGVyLmRvVmFsaWRhdGVTdGF0ZShlbGVtZW50LCBjb21wdXRhdGlvbkNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoaW5mby5pc1VwZGF0ZUNhY2hlKCkpIHsKLQkJCQl0cnkgewotCQkJCQl1cGRhdGVDYWNoZShlbGVtZW50KTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGUsIGV4KTsKLQkJCQkJLy8gRXJyb3IgbWVzc2FnZSB0byBsb2cgd2FzIGluaXRpYWxseSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuaW50ZXJuYWwubDEwbi5FZGl0b3JNZXNzYWdlcy5TdG9yYWdlRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGUKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gaW5mby5pc1JlYWRPbmx5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzUmVhZE9ubHkoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpYWJsZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoIWlzU3RhdGVWYWxpZGF0ZWQoZWxlbWVudCkpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0Ci0JCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoaW5mby5pc1VwZGF0ZUNhY2hlKCkpIHsKLQkJCQl0cnkgewotCQkJCQl1cGRhdGVDYWNoZShlbGVtZW50KTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGUsIGV4KTsKLQkJCQkJLy8gRXJyb3IgbWVzc2FnZSB0byBsb2cgd2FzIGluaXRpYWxseSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuaW50ZXJuYWwubDEwbi5FZGl0b3JNZXNzYWdlcy5TdG9yYWdlRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGUKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gaW5mby5pc01vZGlmaWFibGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNNb2RpZmlhYmxlKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYWNoZShPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJaW5mby5zZXRSZWFkT25seSh0cnVlKTsKLQkJCQkJaW5mby5zZXRNb2RpZmlhYmxlKGZhbHNlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWluZm8uc2V0UmVhZE9ubHkoZmFsc2UpOwotCQkJaW5mby5zZXRNb2RpZmlhYmxlKHRydWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVXBkYXRlU3RhdGVDYWNoZShPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaW5mby5zZXRVcGRhdGVDYWNoZSh0cnVlKTsKLQkJfQotCQlzdXBlci5kb1VwZGF0ZVN0YXRlQ2FjaGUoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3luY2hyb25pemVkKE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaW5mby5pc1N5bmNocm9uaXplZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc1N5bmNocm9uaXplZChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBnZXRSZXNldFJ1bGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gcnVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKG5leHRSZXNvdXJjZSk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQlydWxlcy5hZGQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkKLQkJCQkJCQkubW9kaWZ5UnVsZShmaWxlKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG5ldyBNdWx0aVJ1bGUoKElTY2hlZHVsaW5nUnVsZVtdKSBydWxlcwotCQkJCQkudG9BcnJheShuZXcgSVNjaGVkdWxpbmdSdWxlW3J1bGVzLnNpemUoKV0pKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBnZXRTYXZlUnVsZShPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBydWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCXJ1bGVzLmFkZChjb21wdXRlU2NoZWR1bGluZ1J1bGUoZmlsZSkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgTXVsdGlSdWxlKChJU2NoZWR1bGluZ1J1bGVbXSkgcnVsZXMKLQkJCQkJLnRvQXJyYXkobmV3IElTY2hlZHVsaW5nUnVsZVtydWxlcy5zaXplKCldKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0U3luY2hyb25pemVSdWxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIHJ1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJcnVsZXMuYWRkKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpCi0JCQkJCQkJLnJlZnJlc2hSdWxlKGZpbGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE11bHRpUnVsZSgoSVNjaGVkdWxpbmdSdWxlW10pIHJ1bGVzCi0JCQkJCS50b0FycmF5KG5ldyBJU2NoZWR1bGluZ1J1bGVbcnVsZXMuc2l6ZSgpXSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVNjaGVkdWxpbmdSdWxlIGdldFZhbGlkYXRlU3RhdGVSdWxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJZmlsZXMuYWRkKGZpbGUpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKQotCQkJCQkudmFsaWRhdGVFZGl0UnVsZSgKLQkJCQkJCQkoSUZpbGVbXSkgZmlsZXMudG9BcnJheShuZXcgSUZpbGVbZmlsZXMuc2l6ZSgpXSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElTY2hlZHVsaW5nUnVsZSBjb21wdXRlU2NoZWR1bGluZ1J1bGUoSVJlc291cmNlIHRvQ3JlYXRlT3JNb2RpZnkpIHsKLQkJaWYgKHRvQ3JlYXRlT3JNb2RpZnkuZXhpc3RzKCkpCi0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkubW9kaWZ5UnVsZSgKLQkJCQkJdG9DcmVhdGVPck1vZGlmeSk7Ci0KLQkJSVJlc291cmNlIHBhcmVudCA9IHRvQ3JlYXRlT3JNb2RpZnk7Ci0JCWRvIHsKLQkJCS8qCi0JCQkgKiBYWFggVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yCi0JCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njc2MDEKLQkJCSAqIElSZXNvdXJjZVJ1bGVGYWN0b3J5LmNyZWF0ZVJ1bGUgc2hvdWxkIGl0ZXJhdGUgdGhlIGhpZXJhcmNoeQotCQkJICogaXRzZWxmLgotCQkJICovCi0JCQl0b0NyZWF0ZU9yTW9kaWZ5ID0gcGFyZW50OwotCQkJcGFyZW50ID0gdG9DcmVhdGVPck1vZGlmeS5nZXRQYXJlbnQoKTsKLQkJfSB3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5leGlzdHMoKSk7Ci0KLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpLmNyZWF0ZVJ1bGUoCi0JCQkJdG9DcmVhdGVPck1vZGlmeSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU3luY2hyb25pemUoT2JqZWN0IGVsZW1lbnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQloYW5kbGVFbGVtZW50Q2hhbmdlZChpbmZvLCBuZXh0UmVzb3VyY2UsIG1vbml0b3IpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmRvU3luY2hyb25pemUoZWxlbWVudCwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU2F2ZURvY3VtZW50KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgT2JqZWN0IGVsZW1lbnQsCi0JCQlJRG9jdW1lbnQgZG9jdW1lbnQsIGJvb2xlYW4gb3ZlcndyaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoIW92ZXJ3cml0ZSAmJiAhaW5mby5pc1N5bmNocm9uaXplZCgpKSB7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCQlJU3RhdHVzLk9LLAotCQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9VbnN5bmNocm9uaXplZEZpbGVTYXZlRXJyb3IsCi0JCQkJCQkJCW51bGwpKTsKLQkJCX0KLQkJCWluZm8uc3RvcFJlc291cmNlTGlzdGVuaW5nKCk7Ci0JCQlmaXJlRWxlbWVudFN0YXRlQ2hhbmdpbmcoZWxlbWVudCk7Ci0JCQlMaXN0IHJlc291cmNlcyA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKTsKLQkJCXRyeSB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soCi0JCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9TYXZlRGlhZ3JhbVRhc2ssCi0JCQkJCQlyZXNvdXJjZXMuc2l6ZSgpICsgMSk7IC8vIlNhdmluZyBkaWFncmFtIgotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQkJbW9uaXRvcgotCQkJCQkJCS5zZXRUYXNrTmFtZShOTFMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9TYXZlTmV4dFJlc291cmNlVGFzaywKLQkJCQkJCQkJCQkJbmV4dFJlc291cmNlLmdldFVSSSgpKSk7Ci0JCQkJCWlmIChuZXh0UmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQluZXh0UmVzb3VyY2Uuc2F2ZShEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwKLQkJCQkJCQkJCS5nZXRTYXZlT3B0aW9ucygpKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlmaXJlRWxlbWVudFN0YXRlQ2hhbmdlRmFpbGVkKGVsZW1lbnQpOwotCQkJCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQkJCQlFZGl0b3JTdGF0dXNDb2Rlcy5SRVNPVVJDRV9GQUlMVVJFLCBlCi0JCQkJCQkJCQkJCS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIG51bGwpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl9Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHgpIHsKLQkJCQlmaXJlRWxlbWVudFN0YXRlQ2hhbmdlRmFpbGVkKGVsZW1lbnQpOwotCQkJCXRocm93IHg7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWluZm8uc3RhcnRSZXNvdXJjZUxpc3RlbmluZygpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUVsZW1lbnRDaGFuZ2VkKFJlc291cmNlU2V0SW5mbyBpbmZvLAotCQkJUmVzb3VyY2UgY2hhbmdlZFJlc291cmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKGNoYW5nZWRSZXNvdXJjZSk7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBtb25pdG9yKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJCQkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQsCi0JCQkJCQkJCWV4KTsKLQkJCQkvLyBFcnJvciBtZXNzYWdlIHRvIGxvZyB3YXMgaW5pdGlhbGx5IHRha2VuIGZyb20gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5pbnRlcm5hbC5sMTBuLkVkaXRvck1lc3NhZ2VzLkZpbGVEb2N1bWVudFByb3ZpZGVyX2hhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZAotCQkJfQotCQl9Ci0JCWNoYW5nZWRSZXNvdXJjZS51bmxvYWQoKTsKLQotCQlmaXJlRWxlbWVudENvbnRlbnRBYm91dFRvQmVSZXBsYWNlZChpbmZvLmdldEVkaXRvcklucHV0KCkpOwotCQlyZW1vdmVVbmNoYW5nZWRFbGVtZW50TGlzdGVuZXJzKGluZm8uZ2V0RWRpdG9ySW5wdXQoKSwgaW5mbyk7Ci0JCWluZm8uZlN0YXR1cyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzZXREb2N1bWVudENvbnRlbnQoaW5mby5mRG9jdW1lbnQsIGluZm8uZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJaW5mby5mU3RhdHVzID0gZS5nZXRTdGF0dXMoKTsKLQkJfQotCQlpZiAoIWluZm8uZkNhbkJlU2F2ZWQpIHsKLQkJCWluZm8uc2V0TW9kaWZpY2F0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGluZm8pKTsKLQkJfQotCQlhZGRVbmNoYW5nZWRFbGVtZW50TGlzdGVuZXJzKGluZm8uZ2V0RWRpdG9ySW5wdXQoKSwgaW5mbyk7Ci0JCWZpcmVFbGVtZW50Q29udGVudFJlcGxhY2VkKGluZm8uZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUVsZW1lbnRNb3ZlZChJRWRpdG9ySW5wdXQgaW5wdXQsIFVSSSB1cmkpIHsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlJRmlsZSBuZXdGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKAotCQkJCQluZXcgUGF0aChVUkkuZGVjb2RlKHVyaS5wYXRoKCkpKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKLQkJCWZpcmVFbGVtZW50TW92ZWQoaW5wdXQsIG5ld0ZpbGUgPT0gbnVsbCA/IG51bGwKLQkJCQkJOiBuZXcgRmlsZUVkaXRvcklucHV0KG5ld0ZpbGUpKTsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBUT0RPOiBhcHBlbmQgc3VmZml4IHRvIHRoZSBVUkkhICh1c2UgZGlhZ3JhbSBhcyBhIHBhcmFtZXRlcikKLQkJZmlyZUVsZW1lbnRNb3ZlZChpbnB1dCwgbmV3IFVSSUVkaXRvcklucHV0KHVyaSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUVkaXRvcklucHV0IGNyZWF0ZUlucHV0V2l0aEVkaXRpbmdEb21haW4oSUVkaXRvcklucHV0IGVkaXRvcklucHV0LAotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluKSB7Ci0JCXJldHVybiBlZGl0b3JJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElEaWFncmFtRG9jdW1lbnQgZ2V0RGlhZ3JhbURvY3VtZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudChlbGVtZW50KTsKLQkJaWYgKGRvYyBpbnN0YW5jZW9mIElEaWFncmFtRG9jdW1lbnQpIHsKLQkJCXJldHVybiAoSURpYWdyYW1Eb2N1bWVudCkgZG9jOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVJ1bm5hYmxlQ29udGV4dCBnZXRPcGVyYXRpb25SdW5uZXIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgUmVzb3VyY2VTZXRJbmZvIGV4dGVuZHMgRWxlbWVudEluZm8gewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGxvbmcgbXlNb2RpZmljYXRpb25TdGFtcCA9IElSZXNvdXJjZS5OVUxMX1NUQU1QOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdvcmtzcGFjZVN5bmNocm9uaXplciBteVN5bmNocm9uaXplcjsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBDb2xsZWN0aW9uIG15VW5TeW5jaHJvbml6ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgSURpYWdyYW1Eb2N1bWVudCBteURvY3VtZW50OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIElFZGl0b3JJbnB1dCBteUVkaXRvcklucHV0OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVcGRhdGVDYWNoZSA9IHRydWU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteU1vZGlmaWFibGUgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15UmVhZE9ubHkgPSB0cnVlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFJlc291cmNlU2V0TW9kaWZpY2F0aW9uTGlzdGVuZXIgbXlSZXNvdXJjZVNldExpc3RlbmVyOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgUmVzb3VyY2VTZXRJbmZvKElEaWFncmFtRG9jdW1lbnQgZG9jdW1lbnQsCi0JCQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7Ci0JCQlzdXBlcihkb2N1bWVudCk7Ci0JCQlteURvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCQlteUVkaXRvcklucHV0ID0gZWRpdG9ySW5wdXQ7Ci0JCQlzdGFydFJlc291cmNlTGlzdGVuaW5nKCk7Ci0JCQlteVJlc291cmNlU2V0TGlzdGVuZXIgPSBuZXcgUmVzb3VyY2VTZXRNb2RpZmljYXRpb25MaXN0ZW5lcih0aGlzKTsKLQkJCWdldFJlc291cmNlU2V0KCkuZUFkYXB0ZXJzKCkuYWRkKG15UmVzb3VyY2VTZXRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSB7Ci0JCQlyZXR1cm4gbXlNb2RpZmljYXRpb25TdGFtcDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRNb2RpZmljYXRpb25TdGFtcChsb25nIG1vZGlmaWNhdGlvblN0YW1wKSB7Ci0JCQlteU1vZGlmaWNhdGlvblN0YW1wID0gbW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgewotCQkJcmV0dXJuIG15RG9jdW1lbnQuZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIElFZGl0b3JJbnB1dCBnZXRFZGl0b3JJbnB1dCgpIHsKLQkJCXJldHVybiBteUVkaXRvcklucHV0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlzdG9wUmVzb3VyY2VMaXN0ZW5pbmcoKTsKLQkJCWdldFJlc291cmNlU2V0KCkuZUFkYXB0ZXJzKCkucmVtb3ZlKG15UmVzb3VyY2VTZXRMaXN0ZW5lcik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJcmVzb3VyY2UudW5sb2FkKCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoKSB7Ci0JCQlyZXR1cm4gbXlVblN5bmNocm9uaXplZFJlc291cmNlcy5zaXplKCkgPT0gMDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRVblN5bmNocm9uaXplZChSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJbXlVblN5bmNocm9uaXplZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFN5bmNocm9uaXplZChSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJbXlVblN5bmNocm9uaXplZFJlc291cmNlcy5yZW1vdmUocmVzb3VyY2UpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBmaW5hbCB2b2lkIHN0b3BSZXNvdXJjZUxpc3RlbmluZygpIHsKLQkJCW15U3luY2hyb25pemVyLmRpc3Bvc2UoKTsKLQkJCW15U3luY2hyb25pemVyID0gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgdm9pZCBzdGFydFJlc291cmNlTGlzdGVuaW5nKCkgewotCQkJbXlTeW5jaHJvbml6ZXIgPSBuZXcgV29ya3NwYWNlU3luY2hyb25pemVyKG15RG9jdW1lbnQKLQkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgbmV3IFN5bmNocm9uaXplckRlbGVnYXRlKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzVXBkYXRlQ2FjaGUoKSB7Ci0JCQlyZXR1cm4gbXlVcGRhdGVDYWNoZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVDYWNoZShib29sZWFuIHVwZGF0ZSkgewotCQkJbXlVcGRhdGVDYWNoZSA9IHVwZGF0ZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWFibGUoKSB7Ci0JCQlyZXR1cm4gbXlNb2RpZmlhYmxlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldE1vZGlmaWFibGUoYm9vbGVhbiBtb2RpZmlhYmxlKSB7Ci0JCQlteU1vZGlmaWFibGUgPSBtb2RpZmlhYmxlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCQlyZXR1cm4gbXlSZWFkT25seTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KSB7Ci0JCQlteVJlYWRPbmx5ID0gcmVhZE9ubHk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBjbGFzcyBTeW5jaHJvbml6ZXJEZWxlZ2F0ZSBpbXBsZW1lbnRzCi0JCQkJV29ya3NwYWNlU3luY2hyb25pemVyLkRlbGVnYXRlIHsKLQotCQkJLyoqCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVSZXNvdXJjZUNoYW5nZWQoZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKFJlc291cmNlU2V0SW5mby50aGlzKSB7Ci0JCQkJCWlmIChSZXNvdXJjZVNldEluZm8udGhpcy5mQ2FuQmVTYXZlZCkgewotCQkJCQkJUmVzb3VyY2VTZXRJbmZvLnRoaXMuc2V0VW5TeW5jaHJvbml6ZWQocmVzb3VyY2UpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaGFuZGxlRWxlbWVudENoYW5nZWQoUmVzb3VyY2VTZXRJbmZvLnRoaXMsIHJlc291cmNlLAotCQkJCQkJCQludWxsKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHVibGljIGJvb2xlYW4gaGFuZGxlUmVzb3VyY2VEZWxldGVkKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCQkJc3luY2hyb25pemVkIChSZXNvdXJjZVNldEluZm8udGhpcykgewotCQkJCQlpZiAoUmVzb3VyY2VTZXRJbmZvLnRoaXMuZkNhbkJlU2F2ZWQpIHsKLQkJCQkJCVJlc291cmNlU2V0SW5mby50aGlzLnNldFVuU3luY2hyb25pemVkKHJlc291cmNlKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWZpcmVFbGVtZW50RGVsZXRlZChSZXNvdXJjZVNldEluZm8udGhpcwotCQkJCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIGhhbmRsZVJlc291cmNlTW92ZWQoUmVzb3VyY2UgcmVzb3VyY2UsCi0JCQkJCWZpbmFsIFVSSSBuZXdVUkkpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKFJlc291cmNlU2V0SW5mby50aGlzKSB7Ci0JCQkJCWlmIChSZXNvdXJjZVNldEluZm8udGhpcy5mQ2FuQmVTYXZlZCkgewotCQkJCQkJUmVzb3VyY2VTZXRJbmZvLnRoaXMuc2V0VW5TeW5jaHJvbml6ZWQocmVzb3VyY2UpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG15RG9jdW1lbnQuZ2V0RGlhZ3JhbSgpLmVSZXNvdXJjZSgpID09IHJlc291cmNlKSB7Ci0JCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaGFuZGxlRWxlbWVudE1vdmVkKFJlc291cmNlU2V0SW5mby50aGlzCi0JCQkJCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKSwgbmV3VVJJKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaGFuZGxlUmVzb3VyY2VEZWxldGVkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgY2xhc3MgUmVzb3VyY2VTZXRNb2RpZmljYXRpb25MaXN0ZW5lciBleHRlbmRzIEVDb250ZW50QWRhcHRlciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTm90aWZpY2F0aW9uRmlsdGVyIG15TW9kaWZpZWRGaWx0ZXI7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgUmVzb3VyY2VTZXRJbmZvIG15SW5mbzsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFJlc291cmNlU2V0TW9kaWZpY2F0aW9uTGlzdGVuZXIoUmVzb3VyY2VTZXRJbmZvIGluZm8pIHsKLQkJCW15SW5mbyA9IGluZm87Ci0JCQlteU1vZGlmaWVkRmlsdGVyID0gTm90aWZpY2F0aW9uRmlsdGVyLmNyZWF0ZUV2ZW50VHlwZUZpbHRlcigKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCkub3IoCi0JCQkJCU5vdGlmaWNhdGlvbkZpbHRlcgotCQkJCQkJCS5jcmVhdGVFdmVudFR5cGVGaWx0ZXIoTm90aWZpY2F0aW9uLlVOU0VUKSkuYW5kKAotCQkJCQlOb3RpZmljYXRpb25GaWx0ZXIuY3JlYXRlRmVhdHVyZUZpbHRlcihSZXNvdXJjZS5jbGFzcywKLQkJCQkJCQlSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTU9ESUZJRUQpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFJlc291cmNlU2V0KSB7Ci0JCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQkJaWYgKCFub3RpZmljYXRpb24uaXNUb3VjaCgpCi0JCQkJCSYmIG15TW9kaWZpZWRGaWx0ZXIubWF0Y2hlcyhub3RpZmljYXRpb24pKSB7Ci0JCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IG15SW5mby5nZXRSZXNvdXJjZVNldCgpCi0JCQkJCQkJCS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCkKLQkJCQkJCQkJJiYgIW1vZGlmaWVkOykgewotCQkJCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCQkJCWlmIChuZXh0UmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJCQltb2RpZmllZCA9IG5leHRSZXNvdXJjZS5pc01vZGlmaWVkKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYm9vbGVhbiBkaXJ0eVN0YXRlQ2hhbmdlZCA9IGZhbHNlOwotCQkJCQkJc3luY2hyb25pemVkIChteUluZm8pIHsKLQkJCQkJCQlpZiAobW9kaWZpZWQgIT0gbXlJbmZvLmZDYW5CZVNhdmVkKSB7Ci0JCQkJCQkJCW15SW5mby5mQ2FuQmVTYXZlZCA9IG1vZGlmaWVkOwotCQkJCQkJCQlkaXJ0eVN0YXRlQ2hhbmdlZCA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghcmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQkJCQkJCW15SW5mby5zZXRTeW5jaHJvbml6ZWQocmVzb3VyY2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChkaXJ0eVN0YXRlQ2hhbmdlZCkgewotCQkJCQkJCWZpcmVFbGVtZW50RGlydHlTdGF0ZUNoYW5nZWQobXlJbmZvCi0JCQkJCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKSwgbW9kaWZpZWQpOwotCi0JCQkJCQkJaWYgKCFtb2RpZmllZCkgewotCQkJCQkJCQlteUluZm8KLQkJCQkJCQkJCQkuc2V0TW9kaWZpY2F0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKG15SW5mbykpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdiNDk5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5HTUZFZGl0aW5nRG9tYWluRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVVJJIGRvbWFpbk1vZGVsVVJJOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJdGhpcy50YXJnZXRQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZG9tYWluTW9kZWxVUkkgPSBudWxsOwotCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiA9PSBmYWxzZQotCQkJCXx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJRmlsZSBmaWxlID0gKElGaWxlKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQlkb21haW5Nb2RlbFVSSSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGUuZ2V0RnVsbFBhdGgoKQotCQkJCS50b1N0cmluZygpLCB0cnVlKTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCXJldHVybiB0YXJnZXRQYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IEdNRkVkaXRpbmdEb21haW5GYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZUVkaXRpbmdEb21haW4oKTsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCUVPYmplY3QgZGlhZ3JhbVJvb3QgPSBudWxsOwotCQl0cnkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShkb21haW5Nb2RlbFVSSSwgdHJ1ZSk7Ci0JCQlkaWFncmFtUm9vdCA9IChFT2JqZWN0KSByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiBleCkgewotCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2U6ICIgKyBkb21haW5Nb2RlbFVSSSwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGRpYWdyYW1Sb290ID09IG51bGwpIHsKLQkJCU1lc3NhZ2VEaWFsb2cKLQkJCQkJLm9wZW5FcnJvcigKLQkJCQkJCQlnZXRTaGVsbCgpLAotCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlLAotCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlUmVzb3VyY2VFcnJvckRpYWxvZ01lc3NhZ2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVdpemFyZCB3aXphcmQgPSBuZXcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkKGRvbWFpbk1vZGVsVVJJLAotCQkJCWRpYWdyYW1Sb290LCBlZGl0aW5nRG9tYWluKTsKLQkJd2l6YXJkCi0JCQkJLnNldFdpbmRvd1RpdGxlKE5MUwotCQkJCQkJLmJpbmQoCi0JCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlV2l6YXJkVGl0bGUsCi0JCQkJCQkJCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCkpOwotCQlEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwucnVuV2l6YXJkKGdldFNoZWxsKCksIHdpemFyZCwKLQkJCQkiSW5pdERpYWdyYW1GaWxlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbUxvYWRSZXNvdXJjZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1Mb2FkUmVzb3VyY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4Y2ZmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbUxvYWRSZXNvdXJjZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkxvYWRSZXNvdXJjZUFjdGlvbi5Mb2FkUmVzb3VyY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUxvYWRSZXNvdXJjZUFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQgbXlTZWxlY3RlZEVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTaGVsbCBteVNoZWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJbXlTaGVsbCA9IHRhcmdldFBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlMb2FkUmVzb3VyY2VEaWFsb2cgbG9hZFJlc291cmNlRGlhbG9nID0gbmV3IExvYWRSZXNvdXJjZURpYWxvZyhteVNoZWxsLAotCQkJCW15U2VsZWN0ZWRFbGVtZW50LmdldEVkaXRpbmdEb21haW4oKSk7Ci0JCWxvYWRSZXNvdXJjZURpYWxvZy5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCW15U2VsZWN0ZWRFbGVtZW50ID0gbnVsbDsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPT0gMQotCQkJCQkmJiBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0KSB7Ci0JCQkJbXlTZWxlY3RlZEVsZW1lbnQgPSAoV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0KSBzdHJ1Y3R1cmVkU2VsZWN0aW9uCi0JCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQl9Ci0JCX0KLQkJYWN0aW9uLnNldEVuYWJsZWQoaXNFbmFibGVkKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gbXlTZWxlY3RlZEVsZW1lbnQgIT0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtTWF0Y2hpbmdTdHJhdGVneS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1NYXRjaGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZjA3YWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1NYXRjaGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5wYXJ0cy5EaWFncmFtRG9jdW1lbnRFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yTWF0Y2hpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1NYXRjaGluZ1N0cmF0ZWd5IGltcGxlbWVudHMgSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoSUVkaXRvclJlZmVyZW5jZSBlZGl0b3JSZWYsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQ7Ci0JCXRyeSB7Ci0JCQllZGl0b3JJbnB1dCA9IGVkaXRvclJlZi5nZXRFZGl0b3JJbnB1dCgpOwotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZWRpdG9ySW5wdXQuZXF1YWxzKGlucHV0KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQKLQkJCQkmJiBpbnB1dCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7Ci0JCQlyZXR1cm4gKChVUklFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQpLmdldFVSSSgpLmVxdWFscygKLQkJCQkJKChVUklFZGl0b3JJbnB1dCkgaW5wdXQpLmdldFVSSSgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2VhNTJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuT3BlcmF0aW9uSGlzdG9yeUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMuVmlld1NlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMudmlldy5DcmVhdGVEaWFncmFtVmlld09wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmQgZXh0ZW5kcyBXaXphcmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gbXlFZGl0aW5nRG9tYWluOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmQoVVJJIGRvbWFpbk1vZGVsVVJJLCBFT2JqZWN0IGRpYWdyYW1Sb290LAotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbikgewotCQlhc3NlcnQgZG9tYWluTW9kZWxVUkkgIT0gbnVsbCA6ICJEb21haW4gbW9kZWwgdXJpIG11c3QgYmUgc3BlY2lmaWVkIjsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnQgZGlhZ3JhbVJvb3QgIT0gbnVsbCA6ICJEb2FncmFtIHJvb3QgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZCI7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0IGVkaXRpbmdEb21haW4gIT0gbnVsbCA6ICJFZGl0aW5nIGRvbWFpbiBtdXN0IGJlIHNwZWNpZmllZCI7IC8vJE5PTi1OTFMtMSQKLQotCQlteUZpbGVDcmVhdGlvblBhZ2UgPSBuZXcgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSgKLQkJCQlNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlTmFtZSwKLQkJCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQkJbXlGaWxlQ3JlYXRpb25QYWdlCi0JCQkJLnNldFRpdGxlKE1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VUaXRsZSk7Ci0JCW15RmlsZUNyZWF0aW9uUGFnZS5zZXREZXNjcmlwdGlvbihOTFMuYmluZCgKLQkJCQlNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlRGVzY3JpcHRpb24sCi0JCQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lEKSk7Ci0JCUlQYXRoIGZpbGVQYXRoOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBkb21haW5Nb2RlbFVSSS50cmltRmlsZUV4dGVuc2lvbigpLmxhc3RTZWdtZW50KCk7Ci0JCWlmIChkb21haW5Nb2RlbFVSSS5pc1BsYXRmb3JtUmVzb3VyY2UoKSkgewotCQkJZmlsZVBhdGggPSBuZXcgUGF0aChkb21haW5Nb2RlbFVSSS50cmltU2VnbWVudHMoMSkKLQkJCQkJLnRvUGxhdGZvcm1TdHJpbmcodHJ1ZSkpOwotCQl9IGVsc2UgaWYgKGRvbWFpbk1vZGVsVVJJLmlzRmlsZSgpKSB7Ci0JCQlmaWxlUGF0aCA9IG5ldyBQYXRoKGRvbWFpbk1vZGVsVVJJLnRyaW1TZWdtZW50cygxKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBUT0RPIDogdXNlIHNvbWUgZGVmYXVsdCBwYXRoCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiVW5zdXBwb3J0ZWQgVVJJOiAiICsgZG9tYWluTW9kZWxVUkkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJbXlGaWxlQ3JlYXRpb25QYWdlLnNldENvbnRhaW5lckZ1bGxQYXRoKGZpbGVQYXRoKTsKLQkJbXlGaWxlQ3JlYXRpb25QYWdlLnNldEZpbGVOYW1lKERpYWdyYW1EaWFncmFtRWRpdG9yVXRpbAotCQkJCS5nZXRVbmlxdWVGaWxlTmFtZShmaWxlUGF0aCwgZmlsZU5hbWUsICJ3cGRkIikpOyAvLyROT04tTkxTLTEkCi0KLQkJZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZSA9IG5ldyBEaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlKAotCQkJCU1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5hbWUpOwotCQlkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlCi0JCQkJLnNldFRpdGxlKE1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVRpdGxlKTsKLQkJZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZQotCQkJCS5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VEZXNjcmlwdGlvbik7Ci0JCWRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2Uuc2V0TW9kZWxFbGVtZW50KGRpYWdyYW1Sb290KTsKLQotCQlteUVkaXRpbmdEb21haW4gPSBlZGl0aW5nRG9tYWluOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgbXlGaWxlQ3JlYXRpb25QYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZSBkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlhZGRQYWdlKG15RmlsZUNyZWF0aW9uUGFnZSk7Ci0JCWFkZFBhZ2UoZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCUxpc3QgYWZmZWN0ZWRGaWxlcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCUlGaWxlIGRpYWdyYW1GaWxlID0gbXlGaWxlQ3JlYXRpb25QYWdlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLnNldENoYXJzZXQoZGlhZ3JhbUZpbGUpOwotCQlhZmZlY3RlZEZpbGVzLmFkZChkaWFncmFtRmlsZSk7Ci0JCVVSSSBkaWFncmFtTW9kZWxVUkkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShkaWFncmFtRmlsZQotCQkJCS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpOwotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG15RWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpOwotCQlmaW5hbCBSZXNvdXJjZSBkaWFncmFtUmVzb3VyY2UgPSByZXNvdXJjZVNldAotCQkJCS5jcmVhdGVSZXNvdXJjZShkaWFncmFtTW9kZWxVUkkpOwotCQlBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCgKLQkJCQlteUVkaXRpbmdEb21haW4sCi0JCQkJTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0luaXREaWFncmFtQ29tbWFuZCwKLQkJCQlhZmZlY3RlZEZpbGVzKSB7Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoCi0JCQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQlpbnQgZGlhZ3JhbVZJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0RGlhZ3JhbVZpc3VhbElEKGRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UKLQkJCQkJCQkJLmdldE1vZGVsRWxlbWVudCgpKTsKLQkJCQlpZiAoZGlhZ3JhbVZJRCAhPSBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuVklTVUFMX0lEKSB7Ci0JCQkJCXJldHVybiBDb21tYW5kUmVzdWx0Ci0JCQkJCQkJLm5ld0Vycm9yQ29tbWFuZFJlc3VsdChNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5jb3JyZWN0Um9vdEVycm9yKTsKLQkJCQl9Ci0JCQkJRGlhZ3JhbSBkaWFncmFtID0gVmlld1NlcnZpY2UuY3JlYXRlRGlhZ3JhbSgKLQkJCQkJCWRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UuZ2V0TW9kZWxFbGVtZW50KCksCi0JCQkJCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQsCi0JCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJZGlhZ3JhbVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0pOwotCQkJCWRpYWdyYW1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KCk7Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlPcGVyYXRpb25IaXN0b3J5RmFjdG9yeS5nZXRPcGVyYXRpb25IaXN0b3J5KCkuZXhlY3V0ZShjb21tYW5kLAotCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJCWRpYWdyYW1SZXNvdXJjZS5zYXZlKERpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5nZXRTYXZlT3B0aW9ucygpKTsKLQkJCURpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5vcGVuRGlhZ3JhbShkaWFncmFtUmVzb3VyY2UpOwotCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIGNyZWF0ZSBtb2RlbCBhbmQgZGlhZ3JhbSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJTYXZlIG9wZXJhdGlvbiBmYWlsZWQgZm9yOiAiICsgZGlhZ3JhbU1vZGVsVVJJLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXgpIHsKLQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBvcGVuIGVkaXRvciIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBEaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlIGV4dGVuZHMKLQkJCU1vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJCXN1cGVyKHBhZ2VOYW1lKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGlvblRpdGxlKCkgewotCQkJcmV0dXJuIE1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVNlbGVjdGlvblRpdGxlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJCWlmIChzZWxlY3RlZE1vZGVsRWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5vU2VsZWN0aW9uTWVzc2FnZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJYm9vbGVhbiByZXN1bHQgPSBWaWV3U2VydmljZS5nZXRJbnN0YW5jZSgpLnByb3ZpZGVzKAotCQkJCQluZXcgQ3JlYXRlRGlhZ3JhbVZpZXdPcGVyYXRpb24obmV3IEVPYmplY3RBZGFwdGVyKAotCQkJCQkJCXNlbGVjdGVkTW9kZWxFbGVtZW50KSwKLQkJCQkJCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQsCi0JCQkJCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpKTsKLQkJCXNldEVycm9yTWVzc2FnZShyZXN1bHQgPyBudWxsCi0JCQkJCTogTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlSW52YWxpZFNlbGVjdGlvbk1lc3NhZ2UpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbVBhbGV0dGVGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbVBhbGV0dGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMTBjMDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1QYWxldHRlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5VbnNwZWNpZmllZFR5cGVDcmVhdGlvblRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1QYWxldHRlRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZmlsbFBhbGV0dGUoUGFsZXR0ZVJvb3QgcGFsZXR0ZVJvb3QpIHsKLQkJcGFsZXR0ZVJvb3QuYWRkKGNyZWF0ZU1vZGVsMUdyb3VwKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgIm1vZGVsIiBwYWxldHRlIHRvb2wgZ3JvdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBQYWxldHRlQ29udGFpbmVyIGNyZWF0ZU1vZGVsMUdyb3VwKCkgewotCQlQYWxldHRlR3JvdXAgcGFsZXR0ZUNvbnRhaW5lciA9IG5ldyBQYWxldHRlR3JvdXAoCi0JCQkJTWVzc2FnZXMuTW9kZWwxR3JvdXBfdGl0bGUpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVDb250cm9sRmxvdzFDcmVhdGlvblRvb2woKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcjJDcmVhdGlvblRvb2woKSk7Ci0JCXJldHVybiBwYWxldHRlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZUNvbnRyb2xGbG93MUNyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qPElFbGVtZW50VHlwZT4qL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qPElFbGVtZW50VHlwZT4qLygxKTsKLQkJdHlwZXMuYWRkKERpYWdyYW1FbGVtZW50VHlwZXMuTGlua18zMDAxKTsKLQkJTGlua1Rvb2xFbnRyeSBlbnRyeSA9IG5ldyBMaW5rVG9vbEVudHJ5KAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9QYWxldHRlX2NvbnRyb2xfZmxvd190ZXh0LAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9QYWxldHRlX2NvbnRyb2xfZmxvd19jcmVhdGVfdGV4dCwgdHlwZXMpOwotCQllbnRyeS5zZXRTbWFsbEljb24oRGlhZ3JhbUVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IoTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5rKCkpKTsKLQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcjJDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKjxJRWxlbWVudFR5cGU+Ki90eXBlcyA9IG5ldyBBcnJheUxpc3QvKjxJRWxlbWVudFR5cGU+Ki8oMSk7Ci0JCXR5cGVzLmFkZChEaWFncmFtRWxlbWVudFR5cGVzLldvcmtQcm9kdWN0Tm9kZV8xMDAxKTsKLQkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dCwKLQkJCQkgRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90b29sdGlwLCB0eXBlcyk7Ci0JCWVudHJ5LnNldFNtYWxsSWNvbihEaWFncmFtRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoKSkpOwotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIE5vZGVUb29sRW50cnkgZXh0ZW5kcyBUb29sRW50cnkgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIExpc3QgZWxlbWVudFR5cGVzOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIE5vZGVUb29sRW50cnkoU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24sCi0JCQkJTGlzdCBlbGVtZW50VHlwZXMpIHsKLQkJCXN1cGVyKHRpdGxlLCBkZXNjcmlwdGlvbiwgbnVsbCwgbnVsbCk7Ci0JCQl0aGlzLmVsZW1lbnRUeXBlcyA9IGVsZW1lbnRUeXBlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgVG9vbCBjcmVhdGVUb29sKCkgewotCQkJVG9vbCB0b29sID0gbmV3IFVuc3BlY2lmaWVkVHlwZUNyZWF0aW9uVG9vbChlbGVtZW50VHlwZXMpOwotCQkJdG9vbC5zZXRQcm9wZXJ0aWVzKGdldFRvb2xQcm9wZXJ0aWVzKCkpOwotCQkJcmV0dXJuIHRvb2w7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlua1Rvb2xFbnRyeSBleHRlbmRzIFRvb2xFbnRyeSB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgZmluYWwgTGlzdCByZWxhdGlvbnNoaXBUeXBlczsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBMaW5rVG9vbEVudHJ5KFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uLAotCQkJCUxpc3QgcmVsYXRpb25zaGlwVHlwZXMpIHsKLQkJCXN1cGVyKHRpdGxlLCBkZXNjcmlwdGlvbiwgbnVsbCwgbnVsbCk7Ci0JCQl0aGlzLnJlbGF0aW9uc2hpcFR5cGVzID0gcmVsYXRpb25zaGlwVHlwZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFRvb2wgY3JlYXRlVG9vbCgpIHsKLQkJCVRvb2wgdG9vbCA9IG5ldyBVbnNwZWNpZmllZFR5cGVDb25uZWN0aW9uVG9vbChyZWxhdGlvbnNoaXBUeXBlcyk7Ci0JCQl0b29sLnNldFByb3BlcnRpZXMoZ2V0VG9vbFByb3BlcnRpZXMoKSk7Ci0JCQlyZXR1cm4gdG9vbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtVmlzdWFsSURSZWdpc3RyeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyN2RiM2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLkxpbmtOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBUaGlzIHJlZ2lzdHJ5IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIHR5cGUgb2YgdmlzdWFsIG9iamVjdCBzaG91bGQgYmUKLSAqIGNyZWF0ZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIERpYWdyYW0sIE5vZGUsIENoaWxkTm9kZSBvciBMaW5rIHJlcHJlc2VudGVkIAotICogYnkgYSBkb21haW4gbW9kZWwgb2JqZWN0LgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfS0VZID0gV1BERGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJLmdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkKLQkJCSsgIi9kZWJ1Zy92aXN1YWxJRCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRWaXN1YWxJRChWaWV3IHZpZXcpIHsKLQkJaWYgKHZpZXcgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQlpZiAoV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyh2aWV3Ci0JCQkJCS5nZXRUeXBlKCkpKSB7Ci0JCQkJcmV0dXJuIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0VmlzdWFsSUQodmlldy5nZXRUeXBlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNb2RlbElEKFZpZXcgdmlldykgewotCQlWaWV3IGRpYWdyYW0gPSB2aWV3LmdldERpYWdyYW0oKTsKLQkJd2hpbGUgKHZpZXcgIT0gZGlhZ3JhbSkgewotCQkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gKFN0cmluZykgYW5ub3RhdGlvbi5nZXREZXRhaWxzKCkuZ2V0KCJtb2RlbElEIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW0gIT0gbnVsbCA/IGRpYWdyYW0uZ2V0VHlwZSgpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VmlzdWFsSUQoU3RyaW5nIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHR5cGUpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJaWYgKEJvb2xlYW4uVFJVRS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJCVBsYXRmb3JtLmdldERlYnVnT3B0aW9uKERFQlVHX0tFWSkpKSB7Ci0JCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkJIlVuYWJsZSB0byBwYXJzZSB2aWV3IHR5cGUgYXMgYSB2aXN1YWxJRCBudW1iZXI6ICIKLQkJCQkJCQkJKyB0eXBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGUoaW50IHZpc3VhbElEKSB7Ci0JCXJldHVybiBTdHJpbmcudmFsdWVPZih2aXN1YWxJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldERpYWdyYW1WaXN1YWxJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsKLQkJaWYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzID0gZG9tYWluRWxlbWVudC5lQ2xhc3MoKTsKLQkJcmV0dXJuIGdldERpYWdyYW1WaXN1YWxJRChkb21haW5FbGVtZW50LCBkb21haW5FbGVtZW50TWV0YWNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldERpYWdyYW1WaXN1YWxJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQsCi0JCQlFQ2xhc3MgZG9tYWluRWxlbWVudE1ldGFjbGFzcykgewotCQlpZiAoTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCkKLQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCSYmIGlzRGlhZ3JhbVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fNzkoKFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pIGRvbWFpbkVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJfQotCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkRGlhZ3JhbUlEKGRvbWFpbkVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXROb2RlVmlzdWFsSUQoVmlldyBjb250YWluZXJWaWV3LCBFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsKLQkJaWYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzID0gZG9tYWluRWxlbWVudC5lQ2xhc3MoKTsKLQkJcmV0dXJuIGdldE5vZGVWaXN1YWxJRChjb250YWluZXJWaWV3LCBkb21haW5FbGVtZW50LAotCQkJCWRvbWFpbkVsZW1lbnRNZXRhY2xhc3MsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXROb2RlVmlzdWFsSUQoVmlldyBjb250YWluZXJWaWV3LAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBFQ2xhc3MgZG9tYWluRWxlbWVudE1ldGFjbGFzcywKLQkJCVN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJU3RyaW5nIGNvbnRhaW5lck1vZGVsSUQgPSBnZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpOwotCQlpZiAoIVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5NT0RFTF9JRAotCQkJCS5lcXVhbHMoY29udGFpbmVyTW9kZWxJRCkpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpbnQgY29udGFpbmVyVmlzdWFsSUQ7Ci0JCWlmIChXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQKLQkJCQkuZXF1YWxzKGNvbnRhaW5lck1vZGVsSUQpKSB7Ci0JCQljb250YWluZXJWaXN1YWxJRCA9IGdldFZpc3VhbElEKGNvbnRhaW5lclZpZXcpOwotCQl9IGVsc2UgewotCQkJaWYgKGNvbnRhaW5lclZpZXcgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJY29udGFpbmVyVmlzdWFsSUQgPSBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaW50IG5vZGVWaXN1YWxJRCA9IHNlbWFudGljSGludCAhPSBudWxsID8gZ2V0VmlzdWFsSUQoc2VtYW50aWNIaW50KQotCQkJCTogLTE7Ci0JCXN3aXRjaCAoY29udGFpbmVyVmlzdWFsSUQpIHsKLQkJY2FzZSBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRXb3JrUHJvZHVjdE5vZGVfMTAwMUNoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3ROb2RlKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZVdvcmtQcm9kdWN0Tm9kZV8xMDAxKChXb3JrUHJvZHVjdE5vZGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV83OUNoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIExpbmtFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoTGlua05hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIExpbmtOYW1lRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZExpbmtfMzAwMUxpbmtMYWJlbElEKHNlbWFudGljSGludCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRMaW5rV2l0aENsYXNzVmlzdWFsSUQoRU9iamVjdCBkb21haW5FbGVtZW50KSB7Ci0JCWlmIChkb21haW5FbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlFQ2xhc3MgZG9tYWluRWxlbWVudE1ldGFjbGFzcyA9IGRvbWFpbkVsZW1lbnQuZUNsYXNzKCk7Ci0JCXJldHVybiBnZXRMaW5rV2l0aENsYXNzVmlzdWFsSUQoZG9tYWluRWxlbWVudCwgZG9tYWluRWxlbWVudE1ldGFjbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQsCi0JCQlFQ2xhc3MgZG9tYWluRWxlbWVudE1ldGFjbGFzcykgewotCQlpZiAoTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5rKCkuaXNTdXBlclR5cGVPZigKLQkJCQlkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNMaW5rV2l0aENsYXNzTGlua18zMDAxKChMaW5rKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCXJldHVybiBMaW5rRWRpdFBhcnQuVklTVUFMX0lEOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZExpbmtXaXRoQ2xhc3NJRChkb21haW5FbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEaWFncmFtV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV83OSgKLQkJCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZERpYWdyYW1JRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlV29ya1Byb2R1Y3ROb2RlXzEwMDEoV29ya1Byb2R1Y3ROb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRXb3JrUHJvZHVjdE5vZGVfMTAwMUNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fNzlDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRMaW5rXzMwMDFMaW5rTGFiZWxJRChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZExpbmtXaXRoQ2xhc3NJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMaW5rV2l0aENsYXNzTGlua18zMDAxKExpbmsgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvTWVzc2FnZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTI5NTE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoIm1lc3NhZ2VzIiwgTWVzc2FnZXMuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci0KLQkKLSAgICAKLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfT3Blbk1vZGVsUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX09wZW5Nb2RlbFJlc291cmNlRXJyb3JEaWFsb2dNZXNzYWdlOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Qcm9ncmVzc1Rhc2s7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbUNvbW1hbmRMYWJlbDsKLQkJCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlOwotCQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX2hhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZDsKLQkKLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9JbmNvcnJlY3RJbnB1dEVycm9yOwotCQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1VuYWJsZVRvTG9hZFJlc291cmNlRXJyb3I7Ci0JCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfTm9EaWFncmFtSW5SZXNvdXJjZUVycm9yOwotCQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX0RpYWdyYW1Mb2FkaW5nRXJyb3I7Ci0JCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfVW5zeW5jaHJvbml6ZWRGaWxlU2F2ZUVycm9yOwotCQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1NhdmVEaWFncmFtVGFzazsKLQkKLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9TYXZlTmV4dFJlc291cmNlVGFzazsKLQkKLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dUaXRsZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlUmVzb3VyY2VFcnJvckRpYWxvZ01lc3NhZ2U7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVdpemFyZFRpdGxlOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9PcGVuTW9kZWxGaWxlRGlhbG9nVGl0bGU7Ci0JCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZU5hbWU7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlVGl0bGU7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlRGVzY3JpcHRpb247Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOYW1lOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlVGl0bGU7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VEZXNjcmlwdGlvbjsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVNlbGVjdGlvblRpdGxlOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlTm9TZWxlY3Rpb25NZXNzYWdlOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlSW52YWxpZFNlbGVjdGlvbk1lc3NhZ2U7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5pdERpYWdyYW1Db21tYW5kOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0luY29ycmVjdFJvb3RFcnJvcjsKLQkKLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNb2RlbDFHcm91cF90aXRsZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRyb2xGbG93MUNyZWF0aW9uVG9vbF90aXRsZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRyb2xGbG93MUNyZWF0aW9uVG9vbF9kZXNjOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3REZXNjcmlwdG9yMkNyZWF0aW9uVG9vbF90aXRsZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVzY3JpcHRvcjJDcmVhdGlvblRvb2xfZGVzYzsKLQkgICAgICAgIAotICAgICAgICAKLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDb21tYW5kTmFtZV9PcGVuRGlhZ3JhbTsKLSAgICAKLSAgICAvL1RPRE86IHB1dCBhY2Nlc3NvciBmaWVsZHMgbWFudWFsbHkJCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L01vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3Y2VlNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLS8qKgotICogV2l6YXJkIHBhZ2UgdGhhdCBhbGxvd3MgdG8gc2VsZWN0IGVsZW1lbnQgZnJvbSBtb2RlbC4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IHNlbGVjdGVkTW9kZWxFbGVtZW50OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVHJlZVZpZXdlciBtb2RlbFZld2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldE1vZGVsRWxlbWVudCgpIHsKLQkJcmV0dXJuIHNlbGVjdGVkTW9kZWxFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RlbEVsZW1lbnQoRU9iamVjdCBtb2RlbEVsZW1lbnQpIHsKLQkJc2VsZWN0ZWRNb2RlbEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQ7Ci0JCWlmIChtb2RlbFZld2VyICE9IG51bGwpIHsKLQkJCWlmIChzZWxlY3RlZE1vZGVsRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJbW9kZWxWZXdlci5zZXRJbnB1dChzZWxlY3RlZE1vZGVsRWxlbWVudC5lUmVzb3VyY2UoKSk7Ci0JCQkJbW9kZWxWZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQlzZWxlY3RlZE1vZGVsRWxlbWVudCkpOwotCQkJfSBlbHNlIHsKLQkJCQltb2RlbFZld2VyLnNldElucHV0KG51bGwpOwotCQkJfQotCQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0KLQkJQ29tcG9zaXRlIHBsYXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGxhdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJcGxhdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXNldENvbnRyb2wocGxhdGUpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBsYXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoZ2V0U2VsZWN0aW9uVGl0bGUoKSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0KLQkJbW9kZWxWZXdlciA9IG5ldyBUcmVlVmlld2VyKHBsYXRlLCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlsYXlvdXREYXRhLmhlaWdodEhpbnQgPSAzMDA7Ci0JCWxheW91dERhdGEud2lkdGhIaW50ID0gMzAwOwotCQltb2RlbFZld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCQltb2RlbFZld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SXRlbVByb3ZpZGVyc0FkYXB0ZXJGYWN0b3J5KCkpKTsKLQkJbW9kZWxWZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SXRlbVByb3ZpZGVyc0FkYXB0ZXJGYWN0b3J5KCkpKTsKLQkJaWYgKHNlbGVjdGVkTW9kZWxFbGVtZW50ICE9IG51bGwpIHsKLQkJCW1vZGVsVmV3ZXIuc2V0SW5wdXQoc2VsZWN0ZWRNb2RlbEVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJbW9kZWxWZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCXNlbGVjdGVkTW9kZWxFbGVtZW50KSk7Ci0JCX0KLQkJbW9kZWxWZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZS50aGlzCi0JCQkJCQkudXBkYXRlU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBwcm92aWRlIGN1c3RvbSBtb2RlbCBlbGVtZW50IGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGlvblRpdGxlKCkgewotCQlyZXR1cm4gIlNlbGVjdCBtb2RlbCBlbGVtZW50OiI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2VsZWN0ZWRNb2RlbEVsZW1lbnQgPSBudWxsOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJc2VsZWN0ZWRFbGVtZW50ID0gKChJV3JhcHBlckl0ZW1Qcm92aWRlcikgc2VsZWN0ZWRFbGVtZW50KQotCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQl9Ci0JCQlpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRmVhdHVyZU1hcC5FbnRyeSkgewotCQkJCXNlbGVjdGVkRWxlbWVudCA9ICgoRmVhdHVyZU1hcC5FbnRyeSkgc2VsZWN0ZWRFbGVtZW50KQotCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQl9Ci0JCQlpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCXNlbGVjdGVkTW9kZWxFbGVtZW50ID0gKEVPYmplY3QpIHNlbGVjdGVkRWxlbWVudDsKLQkJCX0KLQkJfQotCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIHByb3ZpZGUgc3BlY2lmaWMgdmFsaWRhdGlvbiBvZiB0aGUgc2VsZWN0ZWQgbW9kZWwgZWxlbWVudC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvV1BEREltYWdlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L1dQRERJbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUyNDlhNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvV1BEREltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL0NvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy9hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vL0NvbnRyaWJ1dG9yczoKLS8vSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBXUERESW1hZ2VzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTENMMTYgPSAiaWNvbnMvZnVsbC9lbGNsMTYvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERMQ0wxNiA9ICJpY29ucy9mdWxsL2RsY2wxNi8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVRPT0wxNiA9ICJpY29ucy9mdWxsL2V0b29sMTYvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERUT09MMTYgPSAiaWNvbnMvZnVsbC9kdG9vbDE2LyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9FRElUT1IgPSBFVE9PTDE2ICsgIldQRERFZGl0b3IuZ2lmIjsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0VESVRPUiA9IERUT09MMTYKLQkJCSsgIldQRERFZGl0b3IuZ2lmIjsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0VESVRPUiA9IFdQRERpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCS5nZXRCdW5kbGVkSW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0VESVRPUik7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19FRElUT1IgPSBXUEREaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkuZ2V0QnVuZGxlZEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9FRElUT1IpOwkJCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9XUEREaWFncmFtRWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvV1BERGlhZ3JhbUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmUxNjczLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9XUEREaWFncmFtRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5EZWxlZ2F0aW5nTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYXllcmVkUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLkRpYWdyYW1FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuQWN0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1Sb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVVbnNwZWNpZmllZFR5cGVDb25uZWN0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogRGlhZ3JhbSBFZGl0b3IgZm9yIFdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0uCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBjdXN0b20KLSAqLwotcHVibGljIGNsYXNzIFdQRERpYWdyYW1FZGl0b3IgZXh0ZW5kcyBBYnN0cmFjdERpYWdyYW1FZGl0b3IgewotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCkgewotCQlzdXBlci5jb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKTsKLQkJRGlhZ3JhbVJvb3RFZGl0UGFydCByb290ID0gKERpYWdyYW1Sb290RWRpdFBhcnQpIGdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKQotCQkJCS5nZXRSb290RWRpdFBhcnQoKTsKLQkJTGF5ZXJlZFBhbmUgcHJpbnRhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlBSSU5UQUJMRV9MQVlFUlMpOwotCQlGcmVlZm9ybUxheWVyIGV4dExhYmVsc0xheWVyID0gbmV3IEZyZWVmb3JtTGF5ZXIoKTsKLQkJZXh0TGFiZWxzTGF5ZXIuc2V0TGF5b3V0TWFuYWdlcihuZXcgRGVsZWdhdGluZ0xheW91dCgpKTsKLS8vCQlwcmludGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihleHRMYWJlbHNMYXllciwKLS8vCQkJCURpYWdyYW1FZGl0UGFydEZhY3RvcnkuRVhURVJOQUxfTk9ERV9MQUJFTFNfTEFZRVIsCi0vLwkJCQlMYXllckNvbnN0YW50cy5QUklNQVJZX0xBWUVSKTsKLQkJTGF5ZXJlZFBhbmUgc2NhbGFibGVMYXllcnMgPSAoTGF5ZXJlZFBhbmUpIHJvb3QKLQkJCQkuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuU0NBTEFCTEVfTEFZRVJTKTsKLQkJRnJlZWZvcm1MYXllciBzY2FsZWRGZWVkYmFja0xheWVyID0gbmV3IEZyZWVmb3JtTGF5ZXIoKTsKLQkJc2NhbGVkRmVlZGJhY2tMYXllci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJc2NhbGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihzY2FsZWRGZWVkYmFja0xheWVyLAotCQkJCUxheWVyQ29uc3RhbnRzLlNDQUxFRF9GRUVEQkFDS19MQVlFUiwKLQkJCQlEaWFncmFtUm9vdEVkaXRQYXJ0LkRFQ09SQVRJT05fVU5QUklOVEFCTEVfTEFZRVIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcmVmZXJlbmNlc0hpbnQgZ2V0UHJlZmVyZW5jZXNIaW50KCkgewotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VzSGludChXUEREaWFncmFtRWRpdG9yUGx1Z2luLklEKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsKLQkJc3VwZXIuY3JlYXRlQWN0aW9ucygpOwotCQlMaXN0PElFbGVtZW50VHlwZT4gZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Xb3JrUHJvZHVjdE5vZGVfMTAwMSk7Ci0JCUlBY3Rpb24gYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0LCBlbGVtZW50VHlwZXMsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFLCAKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3Rvb2x0aXAKLQkJCQksIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KG1lbnUpOwotCQlJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gbWVudS5maW5kKEFjdGlvbklkcy5NRU5VX0RJQUdSQU1fQUREKTsKLQkJaWYoaXRlbSAhPSBudWxsICYmIGl0ZW0gaW5zdGFuY2VvZiBJTWVudU1hbmFnZXIpewotCQkJSU1lbnVNYW5hZ2VyIGFkZE1lbnUgPSAoSU1lbnVNYW5hZ2VyKWl0ZW07Ci0JCQlpZihnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLnNpemUoKSA9PSAwKXsKLQkJCQlhZGRUb01lbnUoYWRkTWVudSwgbnVsbCwgRGlhZ3JhbUNvbnN0YW50cy5ESUFHUkFNX0FERF9NRU5VX0dFTkVSQUxfR1JPVVAsIAotCQkJCQkJdHJ1ZSwgdHJ1ZSk7CQotCQkJCWFkZFRvTWVudShhZGRNZW51LERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX1dPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREUsIAotCQkJCQkJRGlhZ3JhbUNvbnN0YW50cy5ESUFHUkFNX0FERF9NRU5VX0dFTkVSQUxfR1JPVVAsIHRydWUsIHRydWUpOwotCQkJfQotCQl9Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydE5hbWVQcmVmaXgoKSB7Ci0JCXJldHVybiBEaWFncmFtQ29yZVJlc291cmNlcy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtX3ByZWZpeDsgCi0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0UGFydEltYWdlKCkgewotCQlyZXR1cm4gV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJmdWxsL2V0b29sMTYvV1BEREVkaXRvci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcm90ZWN0ZWQgQ3JlYXRlVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblJlcXVlc3QgZ2V0Q3JlYXRlQ29udHJvbEZsb3dSZXF1ZXN0KCl7Ci0JCUxpc3Q8SUVsZW1lbnRUeXBlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KCk7Ci0JCWxpc3QuYWRkKERpYWdyYW1FbGVtZW50VHlwZXMuTGlua18zMDAxKTsKLQkJQ3JlYXRlVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblJlcXVlc3QgY29ubmVjdGlvblJlcXVlc3QgPSAKLQkJCW5ldyBDcmVhdGVVbnNwZWNpZmllZFR5cGVDb25uZWN0aW9uUmVxdWVzdChsaXN0LCBmYWxzZSwKLQkJCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQlyZXR1cm4gY29ubmVjdGlvblJlcXVlc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L1dQRERpYWdyYW1FZGl0b3JQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9XUEREaWFncmFtRWRpdG9yUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOTFmYWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L1dQRERpYWdyYW1FZGl0b3JQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyLk1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIEBtb2RpZmllZAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBXUEREaWFncmFtRWRpdG9yUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQcmVmZXJlbmNlc0hpbnQgRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UID0gbmV3IFByZWZlcmVuY2VzSGludCgKLQkJCUlEKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBXUEREaWFncmFtRWRpdG9yUGx1Z2luIGluc3RhbmNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyIG15RG9jdW1lbnRQcm92aWRlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV1BERGlhZ3JhbUVkaXRvclBsdWdpbigpIHsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQkJUHJlZmVyZW5jZXNIaW50LnJlZ2lzdGVyUHJlZmVyZW5jZVN0b3JlKERJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCwKLQkJCQlnZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gY3JlYXRlQWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlhZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJaW5zdGFuY2UgPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCUxpc3QgZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmaWxsSXRlbVByb3ZpZGVyRmFjdG9yaWVzKGZhY3Rvcmllcyk7Ci0JCXJldHVybiBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShmYWN0b3JpZXMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsSXRlbVByb3ZpZGVyRmFjdG9yaWVzKExpc3QgZmFjdG9yaWVzKSB7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IE1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IE1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRJdGVtUHJvdmlkZXJzQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJdGVtSW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBpdGVtKSB7Ci0JCUlJdGVtTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gKElJdGVtTGFiZWxQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoaXRlbSwgSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIEV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJbGFiZWxQcm92aWRlci5nZXRJbWFnZShpdGVtKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4KLQkgKiBwbHVnLWluIHJlbGF0aXZlIHBhdGguCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0QnVuZGxlZEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKElELCBwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNwZWN0cyBpbWFnZXMgcmVzaWRpbmcgaW4gYW55IHBsdWctaW4uIElmIHBhdGggaXMgcmVsYXRpdmUsCi0JICogdGhlbiB0aGlzIGJ1bmRsZSBpcyBsb29rZWQgdXAgZm9yIHRoZSBpbWFnZSwgb3RoZXJ3aXNlLCBmb3IgYWJzb2x1dGUgCi0JICogcGF0aCwgZmlyc3Qgc2VnbWVudCBpcyB0YWtlbiBhcyBpZCBvZiBwbHVnLWluIHdpdGggaW1hZ2UKLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byBpbWFnZSwgZWl0aGVyIGFic29sdXRlICh3aXRoIHBsdWctaW4gaWQgYXMgZmlyc3Qgc2VnbWVudCksIG9yIHJlbGF0aXZlIGZvciBidW5kbGVkIGltYWdlcwotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBmaW5kSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCWZpbmFsIElQYXRoIHAgPSBuZXcgUGF0aChwYXRoKTsKLQkJaWYgKHAuaXNBYnNvbHV0ZSgpICYmIHAuc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKHAuc2VnbWVudCgwKSwgcAotCQkJCQkucmVtb3ZlRmlyc3RTZWdtZW50cygxKS5tYWtlQWJzb2x1dGUoKS50b1N0cmluZygpKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBnZXRCdW5kbGVkSW1hZ2VEZXNjcmlwdG9yKHAubWFrZUFic29sdXRlKCkudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHN0cmluZyBmcm9tIHBsdWctaW4ncyByZXNvdXJjZSBidW5kbGUKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRSZXNvdXJjZVN0cmluZyhnZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLCAiJSIgKyBrZXkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKiBDbGllbnQgZG8gbm90IG5lZWQgdG8gZGlzcG9zZSB0aGlzIGltYWdlLiBJbWFnZXMgd2lsbCBiZSBkaXNwb3NlZCBhdXRvbWF0aWNhbGx5LgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiBpbWFnZSBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRCdW5kbGVkSW1hZ2UoU3RyaW5nIHBhdGgpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHBhdGgpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChwYXRoLCBnZXRCdW5kbGVkSW1hZ2VEZXNjcmlwdG9yKHBhdGgpKTsKLQkJCWltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChwYXRoKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtRG9jdW1lbnRQcm92aWRlciBnZXREb2N1bWVudFByb3ZpZGVyKCkgewotCQlpZiAobXlEb2N1bWVudFByb3ZpZGVyID09IG51bGwpIHsKLQkJCW15RG9jdW1lbnRQcm92aWRlciA9IG5ldyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBteURvY3VtZW50UHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvcikgewotCQlsb2dFcnJvcihlcnJvciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRocm93YWJsZSBhY3R1YWwgZXJyb3Igb3IgbnVsbCBjb3VsZCBiZSBwYXNzZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIGVycm9yLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWlmIChlcnJvciA9PSBudWxsICYmIHRocm93YWJsZSAhPSBudWxsKSB7Ci0JCQllcnJvciA9IHRocm93YWJsZS5nZXRNZXNzYWdlKCk7Ci0JCX0KLQkJZ2V0TG9nKCkubG9nKAotCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCUlTdGF0dXMuT0ssIGVycm9yLCB0aHJvd2FibGUpKTsKLQkJZGVidWcoZXJyb3IsIHRocm93YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0luZm8oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJbG9nSW5mbyhtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGhyb3dhYmxlIGFjdHVhbCBlcnJvciBvciBudWxsIGNvdWxkIGJlIHBhc3NlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dJbmZvKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWlmIChtZXNzYWdlID09IG51bGwgJiYgdGhyb3dhYmxlICE9IG51bGwpIHsKLQkJCW1lc3NhZ2UgPSB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCWdldExvZygpLmxvZygKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwgSVN0YXR1cy5PSywKLQkJCQkJCW1lc3NhZ2UsIHRocm93YWJsZSkpOwotCQlkZWJ1ZyhtZXNzYWdlLCB0aHJvd2FibGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGVidWcoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKG1lc3NhZ2UpOwotCQl9Ci0JCWlmICh0aHJvd2FibGUgIT0gbnVsbCkgewotCQkJdGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY4YzVkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkuZWRpdG9ycy5JTWV0aG9kRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5tYXJrZXIuTWFya2VyTmF2aWdhdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURpYWdyYW1Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IucGFydHMuRGlhZ3JhbURvY3VtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2F2ZUFzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9yIGV4dGVuZHMgRGlhZ3JhbURvY3VtZW50RWRpdG9yCi0JCWltcGxlbWVudHMgSUdvdG9NYXJrZXIsIElNZXRob2RFZGl0b3IgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9ySUQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3IoKSB7Ci0JCXN1cGVyKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFsZXR0ZVJvb3QgY3JlYXRlUGFsZXR0ZVJvb3QoUGFsZXR0ZVJvb3QgZXhpc3RpbmdQYWxldHRlUm9vdCkgewotCQlQYWxldHRlUm9vdCByb290ID0gc3VwZXIuY3JlYXRlUGFsZXR0ZVJvb3QoZXhpc3RpbmdQYWxldHRlUm9vdCk7Ci0JCW5ldyBEaWFncmFtUGFsZXR0ZUZhY3RvcnkoKS5maWxsUGFsZXR0ZShyb290KTsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50UHJvdmlkZXIoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQKLQkJCQl8fCBpbnB1dCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7Ci0JCQlzZXREb2N1bWVudFByb3ZpZGVyKFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0RG9jdW1lbnRQcm92aWRlcigpKTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnNldERvY3VtZW50UHJvdmlkZXIoaW5wdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQkJTWFya2VyTmF2aWdhdGlvblNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nb3RvTWFya2VyKHRoaXMsIG1hcmtlcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCQlwZXJmb3JtU2F2ZUFzKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtU2F2ZUFzKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCVNoZWxsIHNoZWxsID0gZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0JCVNhdmVBc0RpYWxvZyBkaWFsb2cgPSBuZXcgU2F2ZUFzRGlhbG9nKHNoZWxsKTsKLQkJSUZpbGUgb3JpZ2luYWwgPSBpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQgPyAoKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCS5nZXRGaWxlKCkKLQkJCQk6IG51bGw7Ci0JCWlmIChvcmlnaW5hbCAhPSBudWxsKSB7Ci0JCQlkaWFsb2cuc2V0T3JpZ2luYWxGaWxlKG9yaWdpbmFsKTsKLQkJfQotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCUlEb2N1bWVudFByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkgewotCQkJLy8gZWRpdG9yIGhhcyBiZWVuIHByb2dyYW1tYXRpY2FsbHkgY2xvc2VkIHdoaWxlIHRoZSBkaWFsb2cgd2FzIG9wZW4KLQkJCXJldHVybjsKLQkJfQotCQlpZiAocHJvdmlkZXIuaXNEZWxldGVkKGlucHV0KSAmJiBvcmlnaW5hbCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkiVGhlIG9yaWdpbmFsIGZpbGUgJyd7MH0nJyBoYXMgYmVlbiBkZWxldGVkLiIsIG9yaWdpbmFsCi0JCQkJCQkJLmdldE5hbWUoKSk7Ci0JCQlkaWFsb2cuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJZGlhbG9nLnNldE1lc3NhZ2UobWVzc2FnZSwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKLQkJfQotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKLQkJCQlwcm9ncmVzc01vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVBhdGggZmlsZVBhdGggPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0JCWlmIChmaWxlUGF0aCA9PSBudWxsKSB7Ci0JCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKLQkJCQlwcm9ncmVzc01vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlGaWxlIGZpbGUgPSB3b3Jrc3BhY2VSb290LmdldEZpbGUoZmlsZVBhdGgpOwotCQlmaW5hbCBJRWRpdG9ySW5wdXQgbmV3SW5wdXQgPSBuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpOwotCQkvLyBDaGVjayBpZiB0aGUgZWRpdG9yIGlzIGFscmVhZHkgb3BlbgotCQlJRWRpdG9yTWF0Y2hpbmdTdHJhdGVneSBtYXRjaGluZ1N0cmF0ZWd5ID0gZ2V0RWRpdG9yRGVzY3JpcHRvcigpCi0JCQkJLmdldEVkaXRvck1hdGNoaW5nU3RyYXRlZ3koKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZnMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG1hdGNoaW5nU3RyYXRlZ3kubWF0Y2hlcyhlZGl0b3JSZWZzW2ldLCBuZXdJbnB1dCkpIHsKLQkJCQlNZXNzYWdlRGlhbG9nCi0JCQkJCQkub3Blbldhcm5pbmcoc2hlbGwsICJQcm9ibGVtIER1cmluZyBTYXZlIEFzLi4uIiwKLQkJCQkJCQkJIlNhdmUgY291bGQgbm90IGJlIGNvbXBsZXRlZC4gVGFyZ2V0IGZpbGUgaXMgYWxyZWFkeSBvcGVuIGluIGFub3RoZXIgZWRpdG9yLiIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXByb3ZpZGVyLmFib3V0VG9DaGFuZ2UobmV3SW5wdXQpOwotCQkJZ2V0RG9jdW1lbnRQcm92aWRlcihuZXdJbnB1dCkuc2F2ZURvY3VtZW50KHByb2dyZXNzTW9uaXRvciwKLQkJCQkJbmV3SW5wdXQsCi0JCQkJCWdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChnZXRFZGl0b3JJbnB1dCgpKSwgdHJ1ZSk7Ci0JCQlzdWNjZXNzID0gdHJ1ZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IHguZ2V0U3RhdHVzKCk7Ci0JCQlpZiAoc3RhdHVzID09IG51bGwgfHwgc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5DQU5DRUwpIHsKLQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsICJTYXZlIFByb2JsZW1zIiwKLQkJCQkJCSJDb3VsZCBub3Qgc2F2ZSBmaWxlLiIsIHguZ2V0U3RhdHVzKCkpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJcHJvdmlkZXIuY2hhbmdlZChuZXdJbnB1dCk7Ci0JCQlpZiAoc3VjY2VzcykgewotCQkJCXNldElucHV0KG5ld0lucHV0KTsKLQkJCX0KLQkJfQotCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKLQkJCXByb2dyZXNzTW9uaXRvci5zZXRDYW5jZWxlZCghc3VjY2Vzcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzSGludCBnZXRQcmVmZXJlbmNlc0hpbnQoKSB7Ci0JCXJldHVybiBXUEREaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250cmlidXRvcklkKCkgewotCQlyZXR1cm4gV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5JRDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElEb2N1bWVudFByb3ZpZGVyIGdldERvY3VtZW50UHJvdmlkZXIoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQKLQkJCQl8fCBpbnB1dCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7Ci0JCQlyZXR1cm4gV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RG9jdW1lbnRQcm92aWRlcihpbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRFZGl0b3JJbnB1dCgpICE9IG51bGwgPyBnZXREb2N1bWVudFByb3ZpZGVyKCkKLQkJCQkuZ2V0RG9jdW1lbnQoZ2V0RWRpdG9ySW5wdXQoKSkgOiBudWxsOwotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJRGlhZ3JhbURvY3VtZW50KSB7Ci0JCQlyZXR1cm4gKChJRGlhZ3JhbURvY3VtZW50KSBkb2N1bWVudCkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlmNjNiYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLkFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjE3OWZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLkNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBDb25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUdlbmVyYWxQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MWVjZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5EaWFncmFtc1ByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBEaWFncmFtc1ByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUdlbmVyYWxQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBjMzY3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJRGlhZ3JhbVByaW50aW5nUHJlZmVyZW5jZVBhZ2UuaW5pdERlZmF1bHRzKHN0b3JlKTsKLQkJRGlhZ3JhbUdlbmVyYWxQcmVmZXJlbmNlUGFnZS5pbml0RGVmYXVsdHMoc3RvcmUpOwotCQlEaWFncmFtQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlLmluaXREZWZhdWx0cyhzdG9yZSk7Ci0JCURpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlLmluaXREZWZhdWx0cyhzdG9yZSk7Ci0JCURpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UuaW5pdERlZmF1bHRzKHN0b3JlKTsKLQkJRGlhZ3JhbUNvcmVVdGlsLnNldERlZmF1bHRGb250UHJlZmVyZW5jZShnZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCURpYWdyYW1Db3JlVXRpbC5zZXREZWZhdWx0TGluZVN0eWxlKGdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbVByaW50aW5nUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbVByaW50aW5nUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlkZTIyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5QcmludGluZ1ByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJpbnRpbmdQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlKCkgewotCQlzZXRQcmVmZXJlbmNlU3RvcmUoV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbVJ1bGVyc0FuZEdyaWRQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjgxNGVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbVJ1bGVyc0FuZEdyaWRQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuUnVsZXJHcmlkUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVJ1bGVyc0FuZEdyaWRQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFJ1bGVyR3JpZFByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbVJ1bGVyc0FuZEdyaWRQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbUFic3RyYWN0UGFyc2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtQWJzdHJhY3RQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNkMmUxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtQWJzdHJhY3RQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5QYXJzZVBvc2l0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bUxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5TZXRWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5TZXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEaWFncmFtQWJzdHJhY3RQYXJzZXIgaW1wbGVtZW50cyBJUGFyc2VyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyB2aWV3UGF0dGVybjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1lc3NhZ2VGb3JtYXQgdmlld1Byb2Nlc3NvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBlZGl0UGF0dGVybjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1lc3NhZ2VGb3JtYXQgZWRpdFByb2Nlc3NvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZpZXdQYXR0ZXJuKCkgewotCQlyZXR1cm4gdmlld1BhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGdldFZpZXdQcm9jZXNzb3IoKSB7Ci0JCXJldHVybiB2aWV3UHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaWV3UGF0dGVybihTdHJpbmcgdmlld1BhdHRlcm4pIHsKLQkJdGhpcy52aWV3UGF0dGVybiA9IHZpZXdQYXR0ZXJuOwotCQl2aWV3UHJvY2Vzc29yID0gY3JlYXRlVmlld1Byb2Nlc3Nvcih2aWV3UGF0dGVybik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGNyZWF0ZVZpZXdQcm9jZXNzb3IoU3RyaW5nIHZpZXdQYXR0ZXJuKSB7Ci0JCXJldHVybiBuZXcgTWVzc2FnZUZvcm1hdCh2aWV3UGF0dGVybik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFBhdHRlcm4oKSB7Ci0JCXJldHVybiBlZGl0UGF0dGVybjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgZ2V0RWRpdFByb2Nlc3NvcigpIHsKLQkJcmV0dXJuIGVkaXRQcm9jZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRQYXR0ZXJuKFN0cmluZyBlZGl0UGF0dGVybikgewotCQl0aGlzLmVkaXRQYXR0ZXJuID0gZWRpdFBhdHRlcm47Ci0JCWVkaXRQcm9jZXNzb3IgPSBjcmVhdGVFZGl0UHJvY2Vzc29yKGVkaXRQYXR0ZXJuKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgY3JlYXRlRWRpdFByb2Nlc3NvcihTdHJpbmcgZWRpdFBhdHRlcm4pIHsKLQkJcmV0dXJuIG5ldyBNZXNzYWdlRm9ybWF0KGVkaXRQYXR0ZXJuKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmludFN0cmluZyhJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncykgewotCQlyZXR1cm4gZ2V0U3RyaW5nQnlQYXR0ZXJuKGFkYXB0ZXIsIGZsYWdzLCBnZXRWaWV3UGF0dGVybigpLAotCQkJCWdldFZpZXdQcm9jZXNzb3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFN0cmluZyhJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncykgewotCQlyZXR1cm4gZ2V0U3RyaW5nQnlQYXR0ZXJuKGFkYXB0ZXIsIGZsYWdzLCBnZXRFZGl0UGF0dGVybigpLAotCQkJCWdldEVkaXRQcm9jZXNzb3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0U3RyaW5nQnlQYXR0ZXJuKElBZGFwdGFibGUgYWRhcHRlciwgaW50IGZsYWdzLAotCQkJU3RyaW5nIHBhdHRlcm4sIE1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlckVkaXRTdGF0dXMgaXNWYWxpZEVkaXRTdHJpbmcoSUFkYXB0YWJsZSBlbGVtZW50LAotCQkJU3RyaW5nIGVkaXRTdHJpbmcpIHsKLQkJUGFyc2VQb3NpdGlvbiBwb3MgPSBuZXcgUGFyc2VQb3NpdGlvbigwKTsKLQkJT2JqZWN0W10gdmFsdWVzID0gZ2V0RWRpdFByb2Nlc3NvcigpLnBhcnNlKGVkaXRTdHJpbmcsIHBvcyk7Ci0JCWlmICh2YWx1ZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBQYXJzZXJFZGl0U3RhdHVzKFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCUlQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEUsICJJbnZhbGlkIGlucHV0IGF0ICIKLQkJCQkJCQkrIHBvcy5nZXRFcnJvckluZGV4KCkpOwotCQl9Ci0JCXJldHVybiB2YWxpZGF0ZU5ld1ZhbHVlcyh2YWx1ZXMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlckVkaXRTdGF0dXMgdmFsaWRhdGVOZXdWYWx1ZXMoT2JqZWN0W10gdmFsdWVzKSB7Ci0JCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb21tYW5kIGdldFBhcnNlQ29tbWFuZChJQWRhcHRhYmxlIGFkYXB0ZXIsIFN0cmluZyBuZXdTdHJpbmcsCi0JCQlpbnQgZmxhZ3MpIHsKLQkJT2JqZWN0W10gdmFsdWVzID0gZ2V0RWRpdFByb2Nlc3NvcigpLnBhcnNlKG5ld1N0cmluZywKLQkJCQluZXcgUGFyc2VQb3NpdGlvbigwKSk7Ci0JCWlmICh2YWx1ZXMgPT0gbnVsbAotCQkJCXx8IHZhbGlkYXRlTmV3VmFsdWVzKHZhbHVlcykuZ2V0Q29kZSgpICE9IElQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VDb21tYW5kKGFkYXB0ZXIsIHZhbHVlcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJQ29tbWFuZCBnZXRQYXJzZUNvbW1hbmQoSUFkYXB0YWJsZSBhZGFwdGVyLAotCQkJT2JqZWN0W10gdmFsdWVzKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcihJQWRhcHRhYmxlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRNb2RpZmljYXRpb25Db21tYW5kKEVPYmplY3QgZWxlbWVudCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJdmFsdWUgPSBnZXRWYWxpZE5ld1ZhbHVlKGZlYXR1cmUsIHZhbHVlKTsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW52YWxpZFZhbHVlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlTZXRSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgU2V0UmVxdWVzdChlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCXJldHVybiBuZXcgU2V0VmFsdWVDb21tYW5kKHJlcXVlc3QpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbGlkVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlFQ2xhc3NpZmllciB0eXBlID0gZmVhdHVyZS5nZXRFVHlwZSgpOwotCQlpZiAodHlwZSBpbnN0YW5jZW9mIEVEYXRhVHlwZSkgewotCQkJQ2xhc3MgaUNsYXNzID0gdHlwZS5nZXRJbnN0YW5jZUNsYXNzKCk7Ci0JCQlpZiAoU3RyaW5nLmNsYXNzLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsaWROZXdWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCUVDbGFzc2lmaWVyIHR5cGUgPSBmZWF0dXJlLmdldEVUeXBlKCk7Ci0JCWlmICh0eXBlIGluc3RhbmNlb2YgRURhdGFUeXBlKSB7Ci0JCQlDbGFzcyBpQ2xhc3MgPSB0eXBlLmdldEluc3RhbmNlQ2xhc3MoKTsKLQkJCWlmIChCb29sZWFuLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQl2YWx1ZSA9IEJvb2xlYW4udmFsdWVPZigoU3RyaW5nKSB2YWx1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCSJWYWx1ZSBvZiB0eXBlIEJvb2xlYW4gaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKENoYXJhY3Rlci5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl2YWx1ZSA9IG5ldyBDaGFyYWN0ZXIocy5jaGFyQXQoMCkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCSJWYWx1ZSBvZiB0eXBlIENoYXJhY3RlciBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoQnl0ZS5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQnl0ZSkgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJdmFsdWUgPSBuZXcgQnl0ZSgoKE51bWJlcikgdmFsdWUpLmJ5dGVWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWUgPSBCeXRlLnZhbHVlT2Yocyk7Ci0JCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCQkJIlN0cmluZyB2YWx1ZSBkb2VzIG5vdCBjb252ZXJ0IHRvIEJ5dGUgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBCeXRlIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChTaG9ydC5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU2hvcnQpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IFNob3J0KCgoTnVtYmVyKSB2YWx1ZSkuc2hvcnRWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWUgPSBTaG9ydC52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBTaG9ydCB2YWx1ZSIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJWYWx1ZSBvZiB0eXBlIFNob3J0IGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChJbnRlZ2VyLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnRlZ2VyKCgoTnVtYmVyKSB2YWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gSW50ZWdlci52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBJbnRlZ2VyIHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJIlZhbHVlIG9mIHR5cGUgSW50ZWdlciBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoTG9uZy5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTG9uZykgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJdmFsdWUgPSBuZXcgTG9uZygoKE51bWJlcikgdmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWUgPSBMb25nLnZhbHVlT2Yocyk7Ci0JCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCQkJIlN0cmluZyB2YWx1ZSBkb2VzIG5vdCBjb252ZXJ0IHRvIExvbmcgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBMb25nIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChGbG9hdC5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRmxvYXQpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IEZsb2F0KCgoTnVtYmVyKSB2YWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWUgPSBGbG9hdC52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBGbG9hdCB2YWx1ZSIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJWYWx1ZSBvZiB0eXBlIEZsb2F0IGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChEb3VibGUuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIERvdWJsZSkgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJdmFsdWUgPSBuZXcgRG91YmxlKCgoTnVtYmVyKSB2YWx1ZSkuZG91YmxlVmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gRG91YmxlLnZhbHVlT2Yocyk7Ci0JCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCQkJIlN0cmluZyB2YWx1ZSBkb2VzIG5vdCBjb252ZXJ0IHRvIERvdWJsZSB2YWx1ZSIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJWYWx1ZSBvZiB0eXBlIERvdWJsZSBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIEVFbnVtKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCUVFbnVtTGl0ZXJhbCBsaXRlcmFsID0gKChFRW51bSkgdHlwZSkKLQkJCQkJCQkuZ2V0RUVudW1MaXRlcmFsQnlMaXRlcmFsKChTdHJpbmcpIHZhbHVlKTsKLQkJCQkJaWYgKGxpdGVyYWwgPT0gbnVsbCkgewotCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJVbmtub3duIGxpdGVyYWw6ICIgKyB2YWx1ZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl2YWx1ZSA9IGxpdGVyYWwuZ2V0SW5zdGFuY2UoKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBTdHJpbmcgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgSW52YWxpZFZhbHVlIHsKLQotCQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotCQlwdWJsaWMgSW52YWxpZFZhbHVlKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBkZXNjcmlwdGlvbjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJkNDQwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5hY3Rpb24uY29udHJpYnV0aW9uaXRlbS5BYnN0cmFjdENvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS51dGlsLklXb3JrYmVuY2hQYXJ0RGVzY3JpcHRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcuYWN0aW9ucy5QcmludFByZXZpZXdBY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLnJlbmRlci5hY3Rpb25zLkVuaGFuY2VkUHJpbnRBY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZy5yZW5kZXIuYWN0aW9ucy5SZW5kZXJlZFByaW50UHJldmlld0FjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlBYnN0cmFjdENvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElBY3Rpb24gY3JlYXRlQWN0aW9uKFN0cmluZyBhY3Rpb25JZCwKLQkJCUlXb3JrYmVuY2hQYXJ0RGVzY3JpcHRvciBwYXJ0RGVzY3JpcHRvcikgewotCQlpZiAoYWN0aW9uSWQuZXF1YWxzKFByaW50UHJldmlld0FjdGlvbi5JRCkpIHsKLQkJCXJldHVybiBuZXcgUmVuZGVyZWRQcmludFByZXZpZXdBY3Rpb24oCi0JCQkJCW5ldyBFbmhhbmNlZFByaW50QWN0aW9uSGVscGVyKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jcmVhdGVBY3Rpb24oYWN0aW9uSWQsIHBhcnREZXNjcmlwdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1FZGl0UGFydFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtRWRpdFBhcnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzAyYWY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1FZGl0UGFydFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuQWJzdHJhY3RFZGl0UGFydFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuQ3JlYXRlR3JhcGhpY0VkaXRQYXJ0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuSUVkaXRQYXJ0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLkRpYWdyYW1FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRWRpdFBhcnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RWRpdFBhcnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFZGl0UGFydEZhY3RvcnkgZmFjdG9yeTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gYWxsb3dDYWNoaW5nOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgV2Vha1JlZmVyZW5jZSBjYWNoZWRQYXJ0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgV2Vha1JlZmVyZW5jZSBjYWNoZWRWaWV3OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtRWRpdFBhcnRQcm92aWRlcigpIHsKLQkJc2V0RmFjdG9yeShuZXcgRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSgpKTsKLQkJc2V0QWxsb3dDYWNoaW5nKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgRWRpdFBhcnRGYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGYWN0b3J5KEVkaXRQYXJ0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQWxsb3dDYWNoaW5nKCkgewotCQlyZXR1cm4gYWxsb3dDYWNoaW5nOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgc2V0QWxsb3dDYWNoaW5nKGJvb2xlYW4gYWxsb3dDYWNoaW5nKSB7Ci0JCXRoaXMuYWxsb3dDYWNoaW5nID0gYWxsb3dDYWNoaW5nOwotCQlpZiAoIWFsbG93Q2FjaGluZykgewotCQkJY2FjaGVkUGFydCA9IG51bGw7Ci0JCQljYWNoZWRWaWV3ID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUdyYXBoaWNhbEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlFZGl0UGFydCBwYXJ0ID0gZmFjdG9yeS5jcmVhdGVFZGl0UGFydChudWxsLCB2aWV3KTsKLQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCXJldHVybiAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENhY2hlZFBhcnQoVmlldyB2aWV3KSB7Ci0JCWlmIChjYWNoZWRWaWV3ICE9IG51bGwgJiYgY2FjaGVkVmlldy5nZXQoKSA9PSB2aWV3KSB7Ci0JCQlyZXR1cm4gKElHcmFwaGljYWxFZGl0UGFydCkgY2FjaGVkUGFydC5nZXQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJR3JhcGhpY2FsRWRpdFBhcnQgY3JlYXRlR3JhcGhpY0VkaXRQYXJ0KFZpZXcgdmlldykgewotCQlpZiAoaXNBbGxvd0NhY2hpbmcoKSkgewotCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSBnZXRDYWNoZWRQYXJ0KHZpZXcpOwotCQkJY2FjaGVkUGFydCA9IG51bGw7Ci0JCQljYWNoZWRWaWV3ID0gbnVsbDsKLQkJCWlmIChwYXJ0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcGFydDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY3JlYXRlRWRpdFBhcnQodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBwcm92aWRlcyhJT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgQ3JlYXRlR3JhcGhpY0VkaXRQYXJ0T3BlcmF0aW9uKSB7Ci0JCQlWaWV3IHZpZXcgPSAoKElFZGl0UGFydE9wZXJhdGlvbikgb3BlcmF0aW9uKS5nZXRWaWV3KCk7Ci0JCQlpZiAoIVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5NT0RFTF9JRAotCQkJCQkuZXF1YWxzKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE1vZGVsSUQodmlldykpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKGlzQWxsb3dDYWNoaW5nKCkgJiYgZ2V0Q2FjaGVkUGFydCh2aWV3KSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IGNyZWF0ZUVkaXRQYXJ0KHZpZXcpOwotCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCWlmIChpc0FsbG93Q2FjaGluZygpKSB7Ci0JCQkJCWNhY2hlZFBhcnQgPSBuZXcgV2Vha1JlZmVyZW5jZShwYXJ0KTsKLQkJCQkJY2FjaGVkVmlldyA9IG5ldyBXZWFrUmVmZXJlbmNlKHZpZXcpOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1FbGVtZW50VHlwZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1FbGVtZW50VHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliMTk5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtRWxlbWVudFR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuRWxlbWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUVsZW1lbnRUeXBlcyBleHRlbmRzIEVsZW1lbnRJbml0aWFsaXplcnMgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlhZ3JhbUVsZW1lbnRUeXBlcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IGdldEltYWdlUmVnaXN0cnkoKSB7Ci0JCWlmIChpbWFnZVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCWltYWdlUmVnaXN0cnkgPSBuZXcgSW1hZ2VSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBpbWFnZVJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SW1hZ2VSZWdpc3RyeUtleShFTmFtZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0UHJvdmlkZWRJbWFnZURlc2NyaXB0b3IoCi0JCQlFTmFtZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFU3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKChFU3RydWN0dXJhbEZlYXR1cmUpIGVsZW1lbnQpOwotCQkJRUNsYXNzIGVDb250YWluaW5nQ2xhc3MgPSBmZWF0dXJlLmdldEVDb250YWluaW5nQ2xhc3MoKTsKLQkJCUVDbGFzc2lmaWVyIGVUeXBlID0gZmVhdHVyZS5nZXRFVHlwZSgpOwotCQkJaWYgKGVDb250YWluaW5nQ2xhc3MgIT0gbnVsbCAmJiAhZUNvbnRhaW5pbmdDbGFzcy5pc0Fic3RyYWN0KCkpIHsKLQkJCQllbGVtZW50ID0gZUNvbnRhaW5pbmdDbGFzczsKLQkJCX0gZWxzZSBpZiAoZVR5cGUgaW5zdGFuY2VvZiBFQ2xhc3MKLQkJCQkJJiYgISgoRUNsYXNzKSBlVHlwZSkuaXNBYnN0cmFjdCgpKSB7Ci0JCQkJZWxlbWVudCA9IGVUeXBlOwotCQkJfQotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcykgZWxlbWVudDsKLQkJCWlmICghZUNsYXNzLmlzQWJzdHJhY3QoKSkgewotCQkJCXJldHVybiBXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJdGVtSW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJCQllQ2xhc3MuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkKLQkJCQkJCQkJCQkuY3JlYXRlKGVDbGFzcykpOwotCQkJfQotCQl9Ci0JCS8vIFRPRE8gOiBzdXBwb3J0IHN0cnVjdHVyYWwgZmVhdHVyZXMKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihFTmFtZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGtleSA9IGdldEltYWdlUmVnaXN0cnlLZXkoZWxlbWVudCk7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0RGVzY3JpcHRvcihrZXkpOwotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IGdldFByb3ZpZGVkSW1hZ2VEZXNjcmlwdG9yKGVsZW1lbnQpOwotCQkJaWYgKGltYWdlRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCX0KLQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQoa2V5LCBpbWFnZURlc2NyaXB0b3IpOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoRU5hbWVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBrZXkgPSBnZXRJbWFnZVJlZ2lzdHJ5S2V5KGVsZW1lbnQpOwotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBnZXRQcm92aWRlZEltYWdlRGVzY3JpcHRvcihlbGVtZW50KTsKLQkJCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQl9Ci0JCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KGtleSwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCWltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChrZXkpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKElBZGFwdGFibGUgaGludCkgewotCQlFTmFtZWRFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KGhpbnQpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0SW1hZ2VEZXNjcmlwdG9yKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKElBZGFwdGFibGUgaGludCkgewotCQlFTmFtZWRFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KGhpbnQpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyAndHlwZScgb2YgdGhlIGVjb3JlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGhpbnQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRU5hbWVkRWxlbWVudCBnZXRFbGVtZW50KElBZGFwdGFibGUgaGludCkgewotCQlPYmplY3QgdHlwZSA9IGhpbnQuZ2V0QWRhcHRlcihJRWxlbWVudFR5cGUuY2xhc3MpOwotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkgewotCQkJZWxlbWVudHMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwKCk7Ci0KLQkJCWVsZW1lbnRzLnB1dChXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtXzc5LAotCQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKSk7Ci0KLQkJCWVsZW1lbnRzLnB1dChXb3JrUHJvZHVjdE5vZGVfMTAwMSwgTW9kZWxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0V29ya1Byb2R1Y3ROb2RlKCkpOwotCi0JCQllbGVtZW50cy5wdXQoTGlua18zMDAxLCBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmsoKSk7Ci0JCX0KLQkJcmV0dXJuIChFTmFtZWRFbGVtZW50KSBlbGVtZW50cy5nZXQodHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fNzkgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtXzc5Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBXb3JrUHJvZHVjdE5vZGVfMTAwMSA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLldvcmtQcm9kdWN0Tm9kZV8xMDAxIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBMaW5rXzMwMDEgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5MaW5rXzMwMDEiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIElFbGVtZW50VHlwZSBnZXRFbGVtZW50VHlwZShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlKGlkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU2V0IEtOT1dOX0VMRU1FTlRfVFlQRVM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzS25vd25FbGVtZW50VHlwZShJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUpIHsKLQkJaWYgKEtOT1dOX0VMRU1FTlRfVFlQRVMgPT0gbnVsbCkgewotCQkJS05PV05fRUxFTUVOVF9UWVBFUyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtXzc5KTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFdvcmtQcm9kdWN0Tm9kZV8xMDAxKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKExpbmtfMzAwMSk7Ci0JCX0KLQkJcmV0dXJuIEtOT1dOX0VMRU1FTlRfVFlQRVMuY29udGFpbnMoZWxlbWVudFR5cGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1JY29uUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1JY29uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjZjQwZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtSWNvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuQWJzdHJhY3RQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmljb24uR2V0SWNvbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuaWNvbi5JSWNvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtSWNvblByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlJY29uUHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJY29uKElBZGFwdGFibGUgaGludCwgaW50IGZsYWdzKSB7Ci0JCXJldHVybiBEaWFncmFtRWxlbWVudFR5cGVzLmdldEltYWdlKGhpbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlcyhJT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgR2V0SWNvbk9wZXJhdGlvbikgewotCQkJcmV0dXJuICgoR2V0SWNvbk9wZXJhdGlvbikgb3BlcmF0aW9uKS5leGVjdXRlKHRoaXMpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1Nb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWU0NzcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1Nb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5FbGVtZW50VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5tb2RlbGluZ2Fzc2lzdGFudC5Nb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Nb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyIGV4dGVuZHMgTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0VHlwZXNGb3JQb3B1cEJhcihJQWRhcHRhYmxlIGhvc3QpIHsKLQkJSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKElHcmFwaGljYWxFZGl0UGFydCkgaG9zdAotCQkJCS5nZXRBZGFwdGVyKElHcmFwaGljYWxFZGl0UGFydC5jbGFzcyk7Ci0JCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydCkgewotCQkJTGlzdCB0eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXR5cGVzLmFkZChEaWFncmFtRWxlbWVudFR5cGVzLldvcmtQcm9kdWN0Tm9kZV8xMDAxKTsKLQkJCXJldHVybiB0eXBlczsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVsVHlwZXNPblNvdXJjZShJQWRhcHRhYmxlIHNvdXJjZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVsVHlwZXNPblRhcmdldChJQWRhcHRhYmxlIHRhcmdldCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVsVHlwZXNPblNvdXJjZUFuZFRhcmdldChJQWRhcHRhYmxlIHNvdXJjZSwKLQkJCUlBZGFwdGFibGUgdGFyZ2V0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRUeXBlc0ZvclNvdXJjZShJQWRhcHRhYmxlIHRhcmdldCwKLQkJCUlFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRUeXBlc0ZvclRhcmdldChJQWRhcHRhYmxlIHNvdXJjZSwKLQkJCUlFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBzZWxlY3RFeGlzdGluZ0VsZW1lbnRGb3JTb3VyY2UoSUFkYXB0YWJsZSB0YXJnZXQsCi0JCQlJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgewotCQlyZXR1cm4gc2VsZWN0RXhpc3RpbmdFbGVtZW50KHRhcmdldCwgZ2V0VHlwZXNGb3JTb3VyY2UodGFyZ2V0LAotCQkJCXJlbGF0aW9uc2hpcFR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3Qgc2VsZWN0RXhpc3RpbmdFbGVtZW50Rm9yVGFyZ2V0KElBZGFwdGFibGUgc291cmNlLAotCQkJSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsKLQkJcmV0dXJuIHNlbGVjdEV4aXN0aW5nRWxlbWVudChzb3VyY2UsIGdldFR5cGVzRm9yVGFyZ2V0KHNvdXJjZSwKLQkJCQlyZWxhdGlvbnNoaXBUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IHNlbGVjdEV4aXN0aW5nRWxlbWVudChJQWRhcHRhYmxlIGhvc3QsIENvbGxlY3Rpb24gdHlwZXMpIHsKLQkJaWYgKHR5cGVzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKElHcmFwaGljYWxFZGl0UGFydCkgaG9zdAotCQkJCS5nZXRBZGFwdGVyKElHcmFwaGljYWxFZGl0UGFydC5jbGFzcyk7Ci0JCWlmIChlZGl0UGFydCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0Um9vdCgpLmdldENvbnRlbnRzKCkuZ2V0TW9kZWwoKTsKLQkJQ29sbGVjdGlvbiBlbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkaWFncmFtLmdldEVsZW1lbnQoKS5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCWlmIChpc0FwcGxpY2FibGVFbGVtZW50KGVsZW1lbnQsIHR5cGVzKSkgewotCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlpZiAoZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gc2VsZWN0RWxlbWVudCgoRU9iamVjdFtdKSBlbGVtZW50cy50b0FycmF5KG5ldyBFT2JqZWN0W2VsZW1lbnRzCi0JCQkJLnNpemUoKV0pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBcHBsaWNhYmxlRWxlbWVudChFT2JqZWN0IGVsZW1lbnQsIENvbGxlY3Rpb24gdHlwZXMpIHsKLQkJSUVsZW1lbnRUeXBlIHR5cGUgPSBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudFR5cGUoCi0JCQkJZWxlbWVudCk7Ci0JCXJldHVybiB0eXBlcy5jb250YWlucyh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3Qgc2VsZWN0RWxlbWVudChFT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJdGVtUHJvdmlkZXJzQWRhcHRlckZhY3RvcnkoKSk7Ci0JCUVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZygKLQkJCQlzaGVsbCwgbGFiZWxQcm92aWRlcik7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKCJBdmFpbGFibGUgZG9tYWluIG1vZGVsIGVsZW1lbnRzOiIpOwotCQlkaWFsb2cuc2V0VGl0bGUoIlNlbGVjdCBkb21haW4gbW9kZWwgZWxlbWVudCIpOwotCQlkaWFsb2cuc2V0TXVsdGlwbGVTZWxlY3Rpb24oZmFsc2UpOwotCQlkaWFsb2cuc2V0RWxlbWVudHMoZWxlbWVudHMpOwotCQlFT2JqZWN0IHNlbGVjdGVkID0gbnVsbDsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlzZWxlY3RlZCA9IChFT2JqZWN0KSBkaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsKLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbVBhbGV0dGVQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbVBhbGV0dGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGM0NGE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1QYWxldHRlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuQWJzdHJhY3RQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5zZXJ2aWNlcy5wYWxldHRlLklQYWxldHRlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1QYWxldHRlRmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUGFsZXR0ZVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlQYWxldHRlUHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1BhbGV0dGUoSUVkaXRvclBhcnQgZWRpdG9yLCBPYmplY3QgY29udGVudCwKLQkJCVBhbGV0dGVSb290IHJvb3QsIE1hcCBwcmVkZWZpbmVkRW50cmllcykgewotCQlEaWFncmFtUGFsZXR0ZUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBEaWFncmFtUGFsZXR0ZUZhY3RvcnkoKTsKLQkJZmFjdG9yeS5maWxsUGFsZXR0ZShyb290KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udHJpYnV0aW9ucyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCkgewotCQkvLyBubyBjb25maWd1cmF0aW9uCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCXJldHVybiBmYWxzZTsgLy8gYWxsIGxvZ2ljIGlzIGRvbmUgaW4gdGhlIHNlcnZpY2UKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtUGFyc2VyUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1QYXJzZXJQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTQzMmM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1QYXJzZXJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5BYnN0cmFjdFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLkdldFBhcnNlck9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuTGlua05hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1QYXJzZXJQcm92aWRlciBleHRlbmRzIEFic3RyYWN0UHJvdmlkZXIgaW1wbGVtZW50cwotCQlJUGFyc2VyUHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciB3b3JrUHJvZHVjdE5vZGVXb3JrUHJvZHVjdE5vZGVOYW1lXzQwMDFQYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGdldFdvcmtQcm9kdWN0Tm9kZVdvcmtQcm9kdWN0Tm9kZU5hbWVfNDAwMVBhcnNlcigpIHsKLQkJaWYgKHdvcmtQcm9kdWN0Tm9kZVdvcmtQcm9kdWN0Tm9kZU5hbWVfNDAwMVBhcnNlciA9PSBudWxsKSB7Ci0JCQl3b3JrUHJvZHVjdE5vZGVXb3JrUHJvZHVjdE5vZGVOYW1lXzQwMDFQYXJzZXIgPSBjcmVhdGVXb3JrUHJvZHVjdE5vZGVXb3JrUHJvZHVjdE5vZGVOYW1lXzQwMDFQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gd29ya1Byb2R1Y3ROb2RlV29ya1Byb2R1Y3ROb2RlTmFtZV80MDAxUGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVXb3JrUHJvZHVjdE5vZGVXb3JrUHJvZHVjdE5vZGVOYW1lXzQwMDFQYXJzZXIoKSB7Ci0JCURpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWROb2RlX05hbWUoKSk7Ci0JCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9Iik7Ci0JCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9Iik7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBsaW5rTGlua05hbWVfNDAwMlBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0TGlua0xpbmtOYW1lXzQwMDJQYXJzZXIoKSB7Ci0JCWlmIChsaW5rTGlua05hbWVfNDAwMlBhcnNlciA9PSBudWxsKSB7Ci0JCQlsaW5rTGlua05hbWVfNDAwMlBhcnNlciA9IGNyZWF0ZUxpbmtMaW5rTmFtZV80MDAyUGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGxpbmtMaW5rTmFtZV80MDAyUGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVMaW5rTGlua05hbWVfNDAwMlBhcnNlcigpIHsKLQkJRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5rX05hbWUoKSk7Ci0JCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9Iik7Ci0JCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9Iik7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGdldFBhcnNlcihpbnQgdmlzdWFsSUQpIHsKLQkJc3dpdGNoICh2aXN1YWxJRCkgewotCQljYXNlIFdvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0V29ya1Byb2R1Y3ROb2RlV29ya1Byb2R1Y3ROb2RlTmFtZV80MDAxUGFyc2VyKCk7Ci0JCWNhc2UgTGlua05hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0TGlua0xpbmtOYW1lXzQwMDJQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKElBZGFwdGFibGUgaGludCkgewotCQlTdHJpbmcgdmlkID0gKFN0cmluZykgaGludC5nZXRBZGFwdGVyKFN0cmluZy5jbGFzcyk7Ci0JCWlmICh2aWQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFBhcnNlcihEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWQpKTsKLQkJfQotCQlWaWV3IHZpZXcgPSAoVmlldykgaGludC5nZXRBZGFwdGVyKFZpZXcuY2xhc3MpOwotCQlpZiAodmlldyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0UGFyc2VyKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXMoSU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEdldFBhcnNlck9wZXJhdGlvbikgewotCQkJSUFkYXB0YWJsZSBoaW50ID0gKChHZXRQYXJzZXJPcGVyYXRpb24pIG9wZXJhdGlvbikuZ2V0SGludCgpOwotCQkJaWYgKERpYWdyYW1FbGVtZW50VHlwZXMuZ2V0RWxlbWVudChoaW50KSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIGdldFBhcnNlcihoaW50KSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtUHJvcGVydHlQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbVByb3BlcnR5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjExZGM0ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtUHJvcGVydHlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wcm9wZXJ0aWVzLkdldFByb3BlcnR5U291cmNlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wcm9wZXJ0aWVzLklDb21wb3NpdGVQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucHJvcGVydGllcy5JUHJvcGVydGllc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5wcm9wZXJ0aWVzLnByb3ZpZGVycy5HZW5lcmljRU1GUHJvcGVydGllc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUHJvcGVydHlQcm92aWRlciBleHRlbmRzIEdlbmVyaWNFTUZQcm9wZXJ0aWVzUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJUHJvcGVydGllc1Byb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlcyhJT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgR2V0UHJvcGVydHlTb3VyY2VPcGVyYXRpb24pIHsKLQkJCU9iamVjdCBvYmplY3QgPSAoKEdldFByb3BlcnR5U291cmNlT3BlcmF0aW9uKSBvcGVyYXRpb24pCi0JCQkJCS5nZXRPYmplY3QoKTsKLQkJCXJldHVybiBnZXRTZW1hbnRpY0VsZW1lbnQob2JqZWN0KSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb21wb3NpdGVQcm9wZXJ0eVNvdXJjZSBnZXRQcm9wZXJ0eVNvdXJjZShPYmplY3Qgb2JqZWN0KSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IGdldFNlbWFudGljRWxlbWVudChvYmplY3QpOwotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlTb3VyY2UoZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFNlbWFudGljRWxlbWVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCVZpZXcgdmlldyA9IG51bGw7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQl2aWV3ID0gKFZpZXcpIG9iamVjdDsKLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFZGl0UGFydCkgewotCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIG9iamVjdDsKLQkJCWlmIChlZGl0UGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgVmlldykgewotCQkJCXZpZXcgPSAoVmlldykgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCX0KLQkJfQotCQlpZiAodmlldyAhPSBudWxsCi0JCQkJJiYgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lECi0JCQkJCQkuZXF1YWxzKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE1vZGVsSUQodmlldykpKSB7Ci0JCQlyZXR1cm4gdmlldy5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDMyNmQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS50ZXh0LkZpZWxkUG9zaXRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBleHRlbmRzIERpYWdyYW1BYnN0cmFjdFBhcnNlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXNzYWdlRm9ybWF0IERFRkFVTFRfUFJPQ0VTU09SID0gbmV3IE1lc3NhZ2VGb3JtYXQoCi0JCQkiezB9Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgZ2V0Vmlld1Byb2Nlc3NvcigpIHsKLQkJTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IgPSBzdXBlci5nZXRWaWV3UHJvY2Vzc29yKCk7Ci0JCXJldHVybiBwcm9jZXNzb3IgPT0gbnVsbCA/IERFRkFVTFRfUFJPQ0VTU09SIDogcHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBnZXRFZGl0UHJvY2Vzc29yKCkgewotCQlNZXNzYWdlRm9ybWF0IHByb2Nlc3NvciA9IHN1cGVyLmdldEVkaXRQcm9jZXNzb3IoKTsKLQkJcmV0dXJuIHByb2Nlc3NvciA9PSBudWxsID8gREVGQVVMVF9QUk9DRVNTT1IgOiBwcm9jZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldERvbWFpbkVsZW1lbnQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZ0J5UGF0dGVybihJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncywKLQkJCVN0cmluZyBwYXR0ZXJuLCBNZXNzYWdlRm9ybWF0IHByb2Nlc3NvcikgewotCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgYWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQllbGVtZW50ID0gZ2V0RG9tYWluRWxlbWVudChlbGVtZW50KTsKLQkJcmV0dXJuIGdldFN0cmluZ0J5UGF0dGVybihlbGVtZW50LCBmZWF0dXJlLCBwcm9jZXNzb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZ0J5UGF0dGVybihFT2JqZWN0IGVsZW1lbnQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IpIHsKLQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudCA9PSBudWxsID8gbnVsbCA6IGVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJdmFsdWUgPSBnZXRWYWxpZFZhbHVlKGZlYXR1cmUsIHZhbHVlKTsKLQkJcmV0dXJuIHByb2Nlc3Nvci5mb3JtYXQobmV3IE9iamVjdFtdIHsgdmFsdWUgfSwgbmV3IFN0cmluZ0J1ZmZlcigpLAotCQkJCW5ldyBGaWVsZFBvc2l0aW9uKDApKS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlckVkaXRTdGF0dXMgdmFsaWRhdGVWYWx1ZXMoT2JqZWN0W10gdmFsdWVzKSB7Ci0JCWlmICh2YWx1ZXMubGVuZ3RoID4gMSkgewotCQkJcmV0dXJuIFBhcnNlckVkaXRTdGF0dXMuVU5FRElUQUJMRV9TVEFUVVM7Ci0JCX0KLQkJT2JqZWN0IHZhbHVlID0gdmFsdWVzLmxlbmd0aCA9PSAxID8gdmFsdWVzWzBdIDogbnVsbDsKLQkJdmFsdWUgPSBnZXRWYWxpZE5ld1ZhbHVlKGZlYXR1cmUsIHZhbHVlKTsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW52YWxpZFZhbHVlKSB7Ci0JCQlyZXR1cm4gbmV3IFBhcnNlckVkaXRTdGF0dXMoV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJSVBhcnNlckVkaXRTdGF0dXMuVU5FRElUQUJMRSwgdmFsdWUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEVfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbW1hbmQgZ2V0UGFyc2VDb21tYW5kKElBZGFwdGFibGUgYWRhcHRlciwgT2JqZWN0W10gdmFsdWVzKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBhZGFwdGVyLmdldEFkYXB0ZXIoRU9iamVjdC5jbGFzcyk7Ci0JCWVsZW1lbnQgPSBnZXREb21haW5FbGVtZW50KGVsZW1lbnQpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gVHJhbnNhY3Rpb25VdGlsCi0JCQkJLmdldEVkaXRpbmdEb21haW4oZWxlbWVudCk7Ci0JCWlmIChlZGl0aW5nRG9tYWluID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCU9iamVjdCB2YWx1ZSA9IHZhbHVlcy5sZW5ndGggPT0gMSA/IHZhbHVlc1swXSA6IG51bGw7Ci0JCUlDb21tYW5kIGNvbW1hbmQgPSBnZXRNb2RpZmljYXRpb25Db21tYW5kKGVsZW1lbnQsIGZlYXR1cmUsIHZhbHVlKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZChlZGl0aW5nRG9tYWluLCBjb21tYW5kCi0JCQkJLmdldExhYmVsKCksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY29tbWFuZCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FmZmVjdGluZ0V2ZW50KE9iamVjdCBldmVudCwgaW50IGZsYWdzKSB7Ci0JCWlmIChldmVudCBpbnN0YW5jZW9mIE5vdGlmaWNhdGlvbikgewotCQkJcmV0dXJuIGlzQWZmZWN0aW5nRmVhdHVyZSgoKE5vdGlmaWNhdGlvbikgZXZlbnQpLmdldEZlYXR1cmUoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FmZmVjdGluZ0ZlYXR1cmUoT2JqZWN0IGV2ZW50RmVhdHVyZSkgewotCQlyZXR1cm4gZmVhdHVyZSA9PSBldmVudEZlYXR1cmU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlc1BhcnNlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlc1BhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Nzc3ZjhiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudGV4dC5GaWVsZFBvc2l0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIgZXh0ZW5kcyBEaWFncmFtQWJzdHJhY3RQYXJzZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBmZWF0dXJlczsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlc1BhcnNlcihMaXN0IGZlYXR1cmVzKSB7Ci0JCXRoaXMuZmVhdHVyZXMgPSBmZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmdCeVBhdHRlcm4oSUFkYXB0YWJsZSBhZGFwdGVyLCBpbnQgZmxhZ3MsCi0JCQlTdHJpbmcgcGF0dGVybiwgTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGFkYXB0ZXIuZ2V0QWRhcHRlcihFT2JqZWN0LmNsYXNzKTsKLQkJTGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KGZlYXR1cmVzLnNpemUoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJCXZhbHVlID0gZ2V0VmFsaWRWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl2YWx1ZXMuYWRkKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gcHJvY2Vzc29yLmZvcm1hdCh2YWx1ZXMudG9BcnJheShuZXcgT2JqZWN0W3ZhbHVlcy5zaXplKCldKSwKLQkJCQluZXcgU3RyaW5nQnVmZmVyKCksIG5ldyBGaWVsZFBvc2l0aW9uKDApKS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlckVkaXRTdGF0dXMgdmFsaWRhdGVWYWx1ZXMoT2JqZWN0W10gdmFsdWVzKSB7Ci0JCWlmICh2YWx1ZXMubGVuZ3RoICE9IGZlYXR1cmVzLnNpemUoKSkgewotCQkJcmV0dXJuIFBhcnNlckVkaXRTdGF0dXMuVU5FRElUQUJMRV9TVEFUVVM7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCB2YWx1ZSA9IGdldFZhbGlkTmV3VmFsdWUoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMKLQkJCQkJLmdldChpKSwgdmFsdWVzW2ldKTsKLQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludmFsaWRWYWx1ZSkgewotCQkJCXJldHVybiBuZXcgUGFyc2VyRWRpdFN0YXR1cyhXUEREaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMuVU5FRElUQUJMRSwgdmFsdWUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEVfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbW1hbmQgZ2V0UGFyc2VDb21tYW5kKElBZGFwdGFibGUgYWRhcHRlciwgT2JqZWN0W10gdmFsdWVzKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBhZGFwdGVyLmdldEFkYXB0ZXIoRU9iamVjdC5jbGFzcyk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBUcmFuc2FjdGlvblV0aWwKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbihlbGVtZW50KTsKLQkJaWYgKGVkaXRpbmdEb21haW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY29tbWFuZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgKLQkJCQllZGl0aW5nRG9tYWluLCAiU2V0IFZhbHVlcyIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCWNvbW1hbmQKLQkJCQkJLmNvbXBvc2UoZ2V0TW9kaWZpY2F0aW9uQ29tbWFuZChlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZXNbaV0pKTsKLQkJfQotCQlyZXR1cm4gY29tbWFuZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZmZlY3RpbmdFdmVudChPYmplY3QgZXZlbnQsIGludCBmbGFncykgewotCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBOb3RpZmljYXRpb24pIHsKLQkJCU9iamVjdCBmZWF0dXJlID0gKChOb3RpZmljYXRpb24pIGV2ZW50KS5nZXRGZWF0dXJlKCk7Ci0JCQlpZiAoZmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbVZpZXdQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbVZpZXdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjEzZGRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1WaWV3UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByb3ZpZGVycy5BYnN0cmFjdFZpZXdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLkxpbmtOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQudmlldy5mYWN0b3JpZXMuTGlua05hbWVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnZpZXcuZmFjdG9yaWVzLkxpbmtWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnZpZXcuZmFjdG9yaWVzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1WaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnZpZXcuZmFjdG9yaWVzLldvcmtQcm9kdWN0Tm9kZU5hbWVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnZpZXcuZmFjdG9yaWVzLldvcmtQcm9kdWN0Tm9kZVZpZXdGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1WaWV3UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFZpZXdQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGdldERpYWdyYW1WaWV3Q2xhc3MoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsCi0JCQlTdHJpbmcgZGlhZ3JhbUtpbmQpIHsKLQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBnZXRTZW1hbnRpY0VsZW1lbnQoc2VtYW50aWNBZGFwdGVyKTsKLQkJaWYgKFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoZGlhZ3JhbUtpbmQpCi0JCQkJJiYgRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0RGlhZ3JhbVZpc3VhbElEKHNlbWFudGljRWxlbWVudCkgIT0gLTEpIHsKLQkJCXJldHVybiBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXROb2RlVmlld0NsYXNzKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJVmlldyBjb250YWluZXJWaWV3LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCWlmIChjb250YWluZXJWaWV3ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9IGdldFNlbWFudGljRWxlbWVudFR5cGUoc2VtYW50aWNBZGFwdGVyKTsKLQkJaWYgKGVsZW1lbnRUeXBlICE9IG51bGwKLQkJCQkmJiAhRGlhZ3JhbUVsZW1lbnRUeXBlcy5pc0tub3duRWxlbWVudFR5cGUoZWxlbWVudFR5cGUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlFQ2xhc3Mgc2VtYW50aWNUeXBlID0gZ2V0U2VtYW50aWNFQ2xhc3Moc2VtYW50aWNBZGFwdGVyKTsKLQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBnZXRTZW1hbnRpY0VsZW1lbnQoc2VtYW50aWNBZGFwdGVyKTsKLQkJaW50IG5vZGVWSUQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQoY29udGFpbmVyVmlldywKLQkJCQlzZW1hbnRpY0VsZW1lbnQsIHNlbWFudGljVHlwZSwgc2VtYW50aWNIaW50KTsKLQkJc3dpdGNoIChub2RlVklEKSB7Ci0JCWNhc2UgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFdvcmtQcm9kdWN0Tm9kZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIFdvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gV29ya1Byb2R1Y3ROb2RlTmFtZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIExpbmtOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIExpbmtOYW1lVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXRFZGdlVmlld0NsYXNzKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJVmlldyBjb250YWluZXJWaWV3LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9IGdldFNlbWFudGljRWxlbWVudFR5cGUoc2VtYW50aWNBZGFwdGVyKTsKLQkJaWYgKGVsZW1lbnRUeXBlICE9IG51bGwKLQkJCQkmJiAhRGlhZ3JhbUVsZW1lbnRUeXBlcy5pc0tub3duRWxlbWVudFR5cGUoZWxlbWVudFR5cGUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlFQ2xhc3Mgc2VtYW50aWNUeXBlID0gZ2V0U2VtYW50aWNFQ2xhc3Moc2VtYW50aWNBZGFwdGVyKTsKLQkJaWYgKHNlbWFudGljVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGdldFNlbWFudGljRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIpOwotCQlpbnQgbGlua1ZJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRCgKLQkJCQlzZW1hbnRpY0VsZW1lbnQsIHNlbWFudGljVHlwZSk7Ci0JCXN3aXRjaCAobGlua1ZJRCkgewotCQljYXNlIExpbmtFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gTGlua1ZpZXdGYWN0b3J5LmNsYXNzOwotCQl9Ci0JCXJldHVybiBnZXRVbnJlY29nbml6ZWRDb25uZWN0b3JWaWV3Q2xhc3Moc2VtYW50aWNBZGFwdGVyLAotCQkJCWNvbnRhaW5lclZpZXcsIHNlbWFudGljSGludCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSUVsZW1lbnRUeXBlIGdldFNlbWFudGljRWxlbWVudFR5cGUoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIpIHsKLQkJaWYgKHNlbWFudGljQWRhcHRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKElFbGVtZW50VHlwZSkgc2VtYW50aWNBZGFwdGVyLmdldEFkYXB0ZXIoSUVsZW1lbnRUeXBlLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDbGFzcyBnZXRVbnJlY29nbml6ZWRDb25uZWN0b3JWaWV3Q2xhc3MoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsCi0JCQlWaWV3IGNvbnRhaW5lclZpZXcsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJLy8gSGFuZGxlIHVucmVjb2duaXplZCBjaGlsZCBub2RlIGNsYXNzZXMgaGVyZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0VsZW1lbnRJbml0aWFsaXplcnMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0VsZW1lbnRJbml0aWFsaXplcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIxZGY2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9FbGVtZW50SW5pdGlhbGl6ZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRJbml0aWFsaXplcnMgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9zaGVldC9EaWFncmFtU2hlZXRMYWJlbFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3NoZWV0L0RpYWdyYW1TaGVldExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE5ZTQwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3NoZWV0L0RpYWdyYW1TaGVldExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuc2hlZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtU2hlZXRMYWJlbFByb3ZpZGVyIGV4dGVuZHMgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtU2hlZXRMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKFdQRERpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRJdGVtUHJvdmlkZXJzQWRhcHRlckZhY3RvcnkoKSksIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJT2JqZWN0IHNlbGVjdGVkID0gdW53cmFwKGVsZW1lbnQpOwotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChzZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2UodW53cmFwKGVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgdW53cmFwKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCXJldHVybiB1bndyYXAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZWxlbWVudCkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRWRpdFBhcnQpIHsKLQkJCXJldHVybiB1bndyYXBFZGl0UGFydCgoRWRpdFBhcnQpIGVsZW1lbnQpOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJVmlldyB2aWV3ID0gKFZpZXcpICgoSUFkYXB0YWJsZSkgZWxlbWVudCkuZ2V0QWRhcHRlcihWaWV3LmNsYXNzKTsKLQkJCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdW53cmFwVmlldyh2aWV3KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgdW53cmFwRWRpdFBhcnQoRWRpdFBhcnQgcCkgewotCQlpZiAocC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgVmlldykgewotCQkJcmV0dXJuIHVud3JhcFZpZXcoKFZpZXcpIHAuZ2V0TW9kZWwoKSk7Ci0JCX0KLQkJcmV0dXJuIHAuZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgdW53cmFwVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuZ2V0RWxlbWVudCgpID09IG51bGwgPyB2aWV3IDogdmlldy5nZXRFbGVtZW50KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ZpZXcvZmFjdG9yaWVzL0xpbmtOYW1lVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvdmlldy9mYWN0b3JpZXMvTGlua05hbWVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjhkNmZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvdmlldy9mYWN0b3JpZXMvTGlua05hbWVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0TGFiZWxWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS51dGlsLk1lYXN1cmVtZW50VW5pdEhlbHBlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5tYXBtb2RlLklNYXBNb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTG9jYXRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua05hbWVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TGFiZWxWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZpZXcgY3JlYXRlVmlldyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgVmlldyBjb250YWluZXJWaWV3LAotCQkJU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwKLQkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsKLQkJTm9kZSB2aWV3ID0gKE5vZGUpIHN1cGVyLmNyZWF0ZVZpZXcoc2VtYW50aWNBZGFwdGVyLCBjb250YWluZXJWaWV3LAotCQkJCXNlbWFudGljSGludCwgaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsKLQkJTG9jYXRpb24gbG9jYXRpb24gPSAoTG9jYXRpb24pIHZpZXcuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCQlJTWFwTW9kZSBtYXBNb2RlID0gTWVhc3VyZW1lbnRVbml0SGVscGVyLmdldE1hcE1vZGUoY29udGFpbmVyVmlldwotCQkJCS5nZXREaWFncmFtKCkuZ2V0TWVhc3VyZW1lbnRVbml0KCkpOwotCQlsb2NhdGlvbi5zZXRYKG1hcE1vZGUuRFB0b0xQKDApKTsKLQkJbG9jYXRpb24uc2V0WShtYXBNb2RlLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gdmlldzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ZpZXcvZmFjdG9yaWVzL0xpbmtWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC92aWV3L2ZhY3Rvcmllcy9MaW5rVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4MWFiZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ZpZXcvZmFjdG9yaWVzL0xpbmtWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLkFic3RyYWN0RU1GT3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuTGlua05hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUudXRpbC5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUudXRpbC5TdHJpbmdTdGF0aWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuaW50ZXJuYWwuRGlhZ3JhbVVJRGVidWdPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuaW50ZXJuYWwuRGlhZ3JhbVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuaW50ZXJuYWwuRGlhZ3JhbVVJU3RhdHVzQ29kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5Db25uZWN0aW9uVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5CZW5kcG9pbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua1ZpZXdGYWN0b3J5IGV4dGVuZHMgQ29ubmVjdGlvblZpZXdGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQlzdGF0aWMgewotCQlvcHRpb25zLnB1dChUcmFuc2FjdGlvbi5PUFRJT05fVU5QUk9URUNURUQsIEJvb2xlYW4uVFJVRSk7Ci0JCW9wdGlvbnMucHV0KFRyYW5zYWN0aW9uLk9QVElPTl9OT19OT1RJRklDQVRJT05TLCBCb29sZWFuLlRSVUUpOwotCQlvcHRpb25zLnB1dChUcmFuc2FjdGlvbi5PUFRJT05fTk9fVFJJR0dFUlMsIEJvb2xlYW4uVFJVRSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm91dGluZ1N0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShMaW5rRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQKLQkJCQkuZXF1YWxzKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpLmNyZWF0ZU5vZGUoc2VtYW50aWNBZGFwdGVyLCB2aWV3LAotCQkJCURpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUoTGlua05hbWVFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotCUBPdmVycmlkZQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnZpZXcuZmFjdG9yaWVzLlZpZXdGYWN0b3J5I2NyZWF0ZVZpZXcob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUsIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXcsIGphdmEubGFuZy5TdHJpbmcsIGludCwgYm9vbGVhbiwgamF2YS5sYW5nLlN0cmluZykKLQkgKiAKLQkgKiBPdmVycmlkZSBjcmVhdGVWaWV3IHNpbmNlIHRoZXJlIGlzIGEgYnVnIGluIAotCSAqIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQ29ubmVjdGlvblZpZXdGYWN0b3J5LmphdmEKLQkgKi8KLQlwdWJsaWMgVmlldyBjcmVhdGVWaWV3KGZpbmFsIElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJZmluYWwgVmlldyBjb250YWluZXJWaWV3LCBmaW5hbCBTdHJpbmcgc2VtYW50aWNIaW50LAotCQkJZmluYWwgaW50IGluZGV4LCBmaW5hbCBib29sZWFuIHBlcnNpc3RlZCwKLQkJCWZpbmFsIFByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsKLQotCQlzZXRQcmVmZXJlbmNlc0hpbnQocHJlZmVyZW5jZXNIaW50KTsKLQotCQlmaW5hbCBFZGdlIGVkZ2UgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVkZ2UoKTsKLQkJTGlzdCBzdHlsZXMgPSBjcmVhdGVTdHlsZXMoZWRnZSk7Ci0JCWlmIChzdHlsZXMuc2l6ZSgpID4gMCkgewotCQkJZWRnZS5nZXRTdHlsZXMoKS5hZGRBbGwoc3R5bGVzKTsKLQkJfQotCi0JCUJlbmRwb2ludHMgYmVuZFBvaW50cyA9IGNyZWF0ZUJlbmRwb2ludHMoKTsKLQkJaWYgKGJlbmRQb2ludHMgIT0gbnVsbCkgewotCQkJZWRnZS5zZXRCZW5kcG9pbnRzKGJlbmRQb2ludHMpOwotCQl9Ci0KLQkJRU9iamVjdCBzZW1hbnRpY0VsID0gc2VtYW50aWNBZGFwdGVyID09IG51bGwgPyBudWxsCi0JCQkJOiAoRU9iamVjdCkgc2VtYW50aWNBZGFwdGVyLmdldEFkYXB0ZXIoRU9iamVjdC5jbGFzcyk7Ci0JCWlmIChzZW1hbnRpY0VsID09IG51bGwpCi0JCQkvLyBlbmZvcmNlIGEgc2V0IHRvIE5VTEwKLQkJCWVkZ2Uuc2V0RWxlbWVudChudWxsKTsKLQkJZWxzZSBpZiAocmVxdWlyZXNFbGVtZW50KHNlbWFudGljQWRhcHRlciwgY29udGFpbmVyVmlldykpIHsKLQkJCWVkZ2Uuc2V0RWxlbWVudChzZW1hbnRpY0VsKTsKLQkJfQotCi0JCWVkZ2Uuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCi0JCS8vIGRlY29yYXRlIHZpZXcgYXNzdW1lcyB0aGUgdmlldyBoYWQgYmVlbiBpbnNlcnRlZCBhbHJlYWR5LCBzbyAKLQkJLy8gd2UgaGFkIHRvIGNhbGwgaW5zZXJ0IGNoaWxkIGJlZm9yZSBjYWxsaW5nIGRlY29yYXRlIHZpZXcKLQkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIGVkZ2UsIGluZGV4LCBwZXJzaXN0ZWQpOwotCi0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiA9IGdldEVkaXRpbmdEb21haW4oc2VtYW50aWNFbCwKLQkJCQljb250YWluZXJWaWV3KTsKLQotCQlpZiAoZG9tYWluICE9IG51bGwpIHsKLQkJCWlmIChpc1VuUHJvdGVjdGVkU2lsZW50VHJhbnNhY3Rpb25JblByb2dyZXNzKGRvbWFpbikpIHsKLQkJCQkvLyBkZWNvcmF0ZSB2aWV3IGhhZCB0byBydW4gYXMgYSBzaWxlbnQgb3BlcmF0aW9uIG90aGVyIHdpc2UKLQkJCQkvLyBpdCB3aWxsIGdlbmVyYXRlIHRvbyBtYW55IGV2ZW50cwotCQkJCWRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCBlZGdlLCBzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJCQlzZW1hbnRpY0hpbnQsIGluZGV4LCB0cnVlKTsKLQotCQkJfSBlbHNlIHsKLQkJCQlBYnN0cmFjdEVNRk9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgQWJzdHJhY3RFTUZPcGVyYXRpb24oCi0JCQkJCQlkb21haW4sIFN0cmluZ1N0YXRpY3MuQkxBTkssIG9wdGlvbnMpIHsKLQotCQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJCQkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJCQlkZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgZWRnZSwgc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJCQlzZW1hbnRpY0hpbnQsIGluZGV4LCB0cnVlKTsKLQotCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCXRyeSB7Ci0JCQkJCW9wZXJhdGlvbi5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLmNhdGNoaW5nKERpYWdyYW1VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLAotCQkJCQkJCURpYWdyYW1VSURlYnVnT3B0aW9ucy5FWENFUFRJT05TX0NBVENISU5HLAotCQkJCQkJCWdldENsYXNzKCksICJjcmVhdGVWaWV3IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJTG9nLndhcm5pbmcoRGlhZ3JhbVVJUGx1Z2luLmdldEluc3RhbmNlKCksCi0JCQkJCQkJRGlhZ3JhbVVJU3RhdHVzQ29kZXMuSUdOT1JFRF9FWENFUFRJT05fV0FSTklORywKLQkJCQkJCQkiY3JlYXRlVmlldyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVkZ2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMjU4YTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkRpYWdyYW1WaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk1lYXN1cmVtZW50VW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtVmlld0ZhY3RvcnkgZXh0ZW5kcyBEaWFncmFtVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGFnZVN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3VpZGVTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IHZpZXcsIElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJU3RyaW5nIGRpYWdyYW1LaW5kKSB7Ci0JCXN1cGVyLmRlY29yYXRlVmlldyh2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIGRpYWdyYW1LaW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lYXN1cmVtZW50VW5pdCBnZXRNZWFzdXJlbWVudFVuaXQoKSB7Ci0JCXJldHVybiBNZWFzdXJlbWVudFVuaXQuUElYRUxfTElURVJBTDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3ROb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0Tm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGI5ZmU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3ROb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5CYXNpY05vZGVWaWV3RmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVOYW1lVmlld0ZhY3RvcnkgZXh0ZW5kcyBCYXNpY05vZGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0Tm9kZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0Tm9kZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNTc5NDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdE5vZGVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShXb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5NT0RFTF9JRAotCQkJCS5lcXVhbHMoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkuY3JlYXRlTm9kZSgKLQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJdmlldywKLQkJCQlEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldFR5cGUoV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk5YzNlZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmRvYzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWZkNGRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmZWF0dXJlUGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmRvYzsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYWJvdXQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM5OTA4Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYWJvdXQuaW5pIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNGY0ZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lZmVhdHVyZVRleHQKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWFwcGxpY2F0aW9uXzMyLmdpZgotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLWFwcE5hbWU9JWZlYXR1cmVOYW1lCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotd2VsY29tZVBhZ2U9JG5sJC93ZWxjb21lLnhtbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9hYm91dC5tYXBwaW5ncyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MmI2NjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotIyBVc3VhbGx5IGdlbmVyYXRlZCBhdCBidWlsZCB0aW1lLgotCi0wPUBidWlsZC1JREAKLTE9MS4yLjAKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY3Y2U0OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIERvY3VtZW50YXRpb24KLQotZmVhdHVyZVRleHQ9RVBGIERvY3VtZW50YXRpb25cblwKLVxuXAotVmVyc2lvbjogezF9IFxuXAotQnVpbGQgTGFiZWw6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi1cblwKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2FwcGxpY2F0aW9uXzMyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYXBwbGljYXRpb25fMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYXBwbGljYXRpb25fMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjEyOWY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBubC8KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9kYS9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9kYS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTM5NDE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvZGEvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgLSBkb2t1bWVudGF0aW9uCi0KLWZlYXR1cmVUZXh0PUVQRi1kb2t1bWVudGF0aW9uXG5cCi1cblwKLVZlcnNpb246IHsxfSBcblwKLUJ5Z2dlZXRpa2V0OiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2RlL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2RlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMWM0YzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9kZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiAtIERva3VtZW50YXRpb24KLQotZmVhdHVyZVRleHQ9RVBGIC0gRG9rdW1lbnRhdGlvblxuXAotXG5cCi1WZXJzaW9uOiB7MX0gXG5cCi1CdWlsZC1LZW5udW5nOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9lcy9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9lcy9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTRlYTE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvZXMvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1Eb2N1bWVudGFjaVx1MDBmM24gZGUgRVBGCi0KLWZlYXR1cmVUZXh0PURvY3VtZW50YWNpXHUwMGYzbiBkZSBFUEZcblwKLVxuXAotVmVyc2lcdTAwZjNuOiB7MX0gXG5cCi1FdGlxdWV0YSBkZSBidWlsZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgQ29sYWJvcmFkb3JlcyBkZSBFY2xpcHNlIHkgb3Ryb3MgMjAwMCwgMjAwNy4gIFJlc2VydmFkb3MgdG9kb3MgbG9zIGRlcmVjaG9zLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9mci9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9mci9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGFjNmYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvZnIvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1Eb2N1bWVudGF0aW9uIEVQRgotCi1mZWF0dXJlVGV4dD1Eb2N1bWVudGF0aW9uIEVGRlxuXAotXG5cCi1WZXJzaW9uOiB7MX0gXG5cCi1MaWJlbGxcdTAwZTkgZGUgdmVyc2lvbiA6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2l0L2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2l0L2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZGFjZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9pdC9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPURvY3VtZW50YXppb25lIEVQRgotCi1mZWF0dXJlVGV4dD1Eb2N1bWVudGF6aW9uZSBFUEZcblwKLVxuXAotVmVyc2lvbmU6IHsxfSBcblwKLUV0aWNoZXR0YSBidWlsZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgY29udHJpYnV0b3IgRWNsaXBzZSBlIGFsdHJpIDIwMDAsIDIwMDcuICBUdXR0aSBpIGRpcml0dGkgcmlzZXJ2YXRpLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9qYS9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9qYS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmIzYmZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvamEvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgRG9jdW1lbnRhdGlvbgotCi1mZWF0dXJlVGV4dD1FUEYgXHU4Y2M3XHU2NTk5XG5cCi1cblwKLVx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmMzogezF9IFxuXAotXHUzMGQzXHUzMGViXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGQ5XHUzMGViOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9rby9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9rby9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmUwYWU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2Mvbmwva28vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgXHViYjM4XHVjMTFjCi0KLWZlYXR1cmVUZXh0PUVQRiBcdWJiMzhcdWMxMWNcblwKLVxuXAotXHViYzg0XHVjODA0OiB7MX0gXG5cCi1cdWJlNGNcdWI0ZGMgXHViODA4XHVjNzc0XHViZTE0OiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9wdC9CUi9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9wdC9CUi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODc3Zjc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvcHQvQlIvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1Eb2N1bWVudGFcdTAwZTdcdTAwZTNvIGRvIEVQRgotCi1mZWF0dXJlVGV4dD1Eb2N1bWVudGFcdTAwZTdcdTAwZTNvIGRvIEVQRlxuXAotXG5cCi1WZXJzXHUwMGUzbzogezF9IFxuXAotQ29uc3RydVx1MDBlN1x1MDBlM286IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IGNvbnRyaWJ1aWRvcmVzIEVjbGlwc2UgZSBvdXRyb3MgMjAwMCwgMjAwNy4gVG9kb3Mgb3MgRGlyZWl0b3MgUmVzZXJ2YWRvcy5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvcnUvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvcnUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEzNzg0ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL3J1L2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9XHUwNDE0XHUwNDNlXHUwNDNhXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIEVQRgotCi1mZWF0dXJlVGV4dD1cdTA0MTRcdTA0M2VcdTA0M2FcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgRVBGXG5cCi1cblwKLVx1MDQxMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQ0ZjogezF9IFxuXAotXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDNmXHUwNDNlXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNhXHUwNDMwOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBcdTA0MTJcdTA0NDFcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQ0OVx1MDQzOFx1MDQ0OVx1MDQzNVx1MDQzZFx1MDQ0Yi5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvemgvQ04vYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvemgvQ04vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RlZDA3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL3poL0NOL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIFx1NjU4N1x1Njg2MwotCi1mZWF0dXJlVGV4dD1FUEYgXHU2NTg3XHU2ODYzXG5cCi1cblwKLVx1NzI0OFx1NjcyY1x1ZmYxYXsxfSBcblwKLVx1NWRlNVx1NGY1Y1x1NzI0OFx1NjcyY1x1NjgwN1x1N2I3ZVx1ZmYxYXswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC96aC9UVy9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC96aC9UVy9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmEwZDYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvemgvVFcvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgRG9jdW1lbnRhdGlvbgotCi1mZWF0dXJlVGV4dD1FUEYgXHU2NTg3XHU0ZWY2XG5cCi1cblwKLVx1NzI0OFx1NjcyY1x1ZmYxYXsxfVxuXAotXHU1ZWZhXHU3ZjZlXHU2YTE5XHU3YzY0XHVmZjFhezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTdhMzY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLWZlYXR1cmVQbHVnaW5OYW1lPUVQRiBEb2N1bWVudGF0aW9uIEZlYXR1cmUKLSNmZWF0dXJlUGx1Z2luTmFtZU5MPUVQRiBEb2N1bWVudGF0aW9uIEZlYXR1cmUgKE5MUykKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjI3NGVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSBSaWNoIFRleHQgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE0YmZhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MTdmMDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkuRXhwb3J0TVNQVUlQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtQ2xhc3NQYXRoOiBleHBvcnRtc3B1aS5qYXIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aSwKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5wcmVmZXJlbmNlcywKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS53aXphcmRzCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmQ0M2MwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1zb3VyY2UuZXhwb3J0bXNwdWkuamFyID0gc3JjLwotb3V0cHV0LmV4cG9ydG1zcHVpLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IGV4cG9ydG1zcHVpLmphcixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgc2NoZW1hLyxcCi0gICAgICAgICAgICAgICAub3B0aW9ucwotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9pY29ucy9ldG9vbDE2L2V4cF9tc19wcmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvaWNvbnMvZXRvb2wxNi9leHBfbXNfcHJqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk5OGQzMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9pY29ucy9ldG9vbDE2L2V4cF9tc19wcmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwX21zX3Byal93aXpiYW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwX21zX3Byal93aXpiYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTg1ODlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cF9tc19wcmpfd2l6YmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNjRlZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgV2l6YXJkcwotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkTmFtZT1NaWNyb3NvZnQgUHJvamVjdAotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkRGVzY3JpcHRpb249RXhwb3J0IGEgcHJvY2VzcyB0byBhIE1pY3Jvc29mdCBQcm9qZWN0LgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDA5MzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkud2l6YXJkcy5FeHBvcnRNU1BXaXphcmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9ldG9vbDE2L2V4cF9tc19wcmouZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLndpemFyZHMuRXhwb3J0TVNQV2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZERlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgICAgaWQ9ImV4cG9ydE1TUFdpemFyZCIKLSAgICAgICAgIG5hbWU9IkV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBXaXphcmQgRXh0ZW5zaW9uIgotICAgICAgICAgc2NoZW1hPSJzY2hlbWEvRXhwb3J0TVNQV2l6YXJkLmV4c2QiIC8+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS53aXphcmRzLkV4cG9ydE1TUFdpemFyZCIvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc2NoZW1hL0V4cG9ydE1TUFdpemFyZC5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc2NoZW1hL0V4cG9ydE1TUFdpemFyZC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWY5YTNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NjaGVtYS9FeHBvcnRNU1BXaXphcmQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkiIGlkPSJleHBvcnRNU1BXaXphcmQiIG5hbWU9IkV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBXaXphcmQgRXh0ZW5zaW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEVuYWJsZXMgYSBwbHVnLWluIHRvIGV4dGVuZCB0aGUgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IHdpemFyZCBieSByZXBsYWNpbmcgZXhpc3Rpbmcgd2l6YXJkIHBhZ2VzIG9yIGFkZGluZyBuZXcgb25lcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l6YXJkRXh0ZW5kZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkRXh0ZW5kZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmRQYWdlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHdpemFyZCBleHRlbmRlci4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkcy5JUHVibGlzaENvbmZpZ1dpemFyZEV4dGVuZGVyJmx0Oy9jb2RlJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkUGFnZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgd2l6YXJkIHBhZ2UuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZSZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiBleHRlbnNpb24gLSAmcXVvdDtyZXBsYWNlJnF1b3Q7IG9yICZxdW90O25ldyZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGJhc2Ugd2l6YXJkIHBhZ2UgdG8gYmUgcmVwbGFjZWQgb3IgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgaW5zZXJ0aW5nIGEgbmV3IHdpemFyZCBwYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imluc2VydCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaW5zZXJ0aW9uIHR5cGUgZm9yIGEgbmV3IHdpemFyZCBwYWdlIC0gJnF1b3Q7YmVmb3JlJnF1b3Q7IG9yICZxdW90O2FmdGVyJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0aGUgZXh0ZW5zaW9uIHBvaW50IGNhbiBiZSB1c2VkOiAKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkuZXhwb3J0TVNQV2l6YXJkJnF1b3Q7Jmd0OwotICAgICAgJmx0O3dpemFyZAotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkud2l6YXJkcy5NeUV4cG9ydE1TUFdpemFyZCZxdW90OyZndDsKLSAgICAgICAgICZsdDt3aXphcmRQYWdlCi0gICAgICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS53aXphcmRzLk15U2VsZWN0UHJvY2Vzc1BhZ2UmcXVvdDsKLSAgICAgICAgICAgICAgIHR5cGU9JnF1b3Q7cmVwbGFjZSZxdW90OwotICAgICAgICAgICAgICAgdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLndpemFyZHMuU2VsZWN0UHJvY2Vzc1BhZ2UmcXVvdDsvJmd0OwotICAgICAgICAgJmx0O3dpemFyZFBhZ2UKLSAgICAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLndpemFyZHMuTXlOZXdXaXphcmRQYWdlJnF1b3Q7Ci0gICAgICAgICAgICAgICB0eXBlPSZxdW90O25ldyZxdW90OwotICAgICAgICAgICAgICAgdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLndpemFyZHMuU2VsZWN0UHVibGlzaE9wdGlvbnNQcm9jZXNzUGFnZSZxdW90OwotICAgICAgICAgICAgICAgaW5zZXJ0PSZxdW90O2FmdGVyJnF1b3Q7LyZndDsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICZsdDsvd2l6YXJkJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9FeHBvcnRNU1BVSVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL0V4cG9ydE1TUFVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZjYzM2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL0V4cG9ydE1TUFVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBVSSBwbHVnLWluIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE1TUFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBFeHBvcnRNU1BVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRNU1BVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdG9wKEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV4cG9ydE1TUFVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvRXhwb3J0TVNQVUlSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9FeHBvcnRNU1BVSVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDQxYTBhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9FeHBvcnRNU1BVSVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgVUkgbWVzc2FnZSByZXNvdXJjZSBidW5kbGUgYWNjZXNzb3IgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRXhwb3J0TVNQVUlSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJVTkRMRV9OQU1FID0gRXhwb3J0TVNQVUlSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBFeHBvcnRNU1BVSVJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0TVNQV2l6YXJkX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RXhwb3J0T3B0aW9uc1dpemFyZFBhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RFeHBvcnRPcHRpb25zV2l6YXJkUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0ZWRQcm9jZXNzTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25MYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaFdlYlNpdGVDaGVja0JveF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaENvbmZpZ0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaFByb2Nlc3NCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHNDaGVja0JveF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RXhwb3J0RGlyV2l6YXJkUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvamVjdE5hbWVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlyTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0TVNQVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3ZlcndyaXRlVGV4dF9tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWlzc2luZ1Byb2Nlc3NDb250ZW50V2FybmluZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wbGV0ZWRUZXh0X21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydE1TUEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydE1TUEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydE1TUEludGVybmFsRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaWxsZWdhbEFyZ3VtZW50X21zZzsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEV4cG9ydE1TUFVJUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZTZmMWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBXaXphcmQKLWV4cG9ydE1TUFdpemFyZF90aXRsZT1FeHBvcnQgTWljcm9zb2Z0IFByb2plY3QKLQotIyBTZWxlY3QgRXhwb3J0IE9wdGlvbnMgV2l6YXJkIFBhZ2UKLXNlbGVjdEV4cG9ydE9wdGlvbnNXaXphcmRQYWdlX3RpdGxlPVNlbGVjdCBleHBvcnQgb3B0aW9ucwotc2VsZWN0RXhwb3J0T3B0aW9uc1dpemFyZFBhZ2VfdGV4dD1TZWxlY3QgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGFuZCBleHBvcnQgb3B0aW9ucyB0aGF0IHdpbGwgYmUgdXNlZCB0byBleHBvcnQgdGhlIHNlbGVjdGVkIHByb2Nlc3MuCi1zZWxlY3RlZFByb2Nlc3NMYWJlbF90ZXh0PVNlbGVjdGVkIHByb2Nlc3M6Ci1jb25maWd1cmF0aW9uTGFiZWxfdGV4dD1NZXRob2QgY29uZmlndXJhdGlvbjoKLXB1Ymxpc2hXZWJTaXRlQ2hlY2tCb3hfdGV4dD1QdWJsaXNoIHRoZSBwcm9jZXNzIHdlYnNpdGUKLXB1Ymxpc2hDb25maWdCdXR0b25fdGV4dD1QdWJsaXNoIHRoZSBlbnRpcmUgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLXB1Ymxpc2hQcm9jZXNzQnV0dG9uX3RleHQ9UHVibGlzaCBjb250ZW50IHRoYXQgaXMgb25seSByZWxldmFudCB0byB0aGUgc2VsZWN0ZWQgcHJvY2VzcwotZXhwb3J0T25seVBsYW5uZWRFbGVtZW50c0NoZWNrQm94X3RleHQ9RXhwb3J0IG9ubHkgYnJlYWtkb3duIGVsZW1lbnRzIHRoYXQgYXJlIHBsYW5uZWQKLQotIyBTZWxlY3QgUHVibGlzaGluZyBPcHRpb25zIFdpemFyZCBQYWdlCi1zZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGl0bGU9U2VsZWN0IHB1Ymxpc2hpbmcgb3B0aW9ucwotc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RleHQ9U2VsZWN0IHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcHVibGlzaCB0aGUgd2Vic2l0ZSBmb3IgdGhlIGV4cG9ydGVkIHByb2Nlc3MuCi0KLSMgU2VsZWN0IEV4cG9ydCBEaXJlY3RvcnkgV2l6YXJkIHBhZ2UKLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGl0bGU9U3BlY2lmeSBwcm9qZWN0IG5hbWUgYW5kIGV4cG9ydCBkaXJlY3RvcnkKLXNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGV4dD1TcGVjaWZ5IHRoZSBNaWNyb3NvZnQgUHJvamVjdCBuYW1lIGFuZCBleHBvcnQgZGlyZWN0b3J5LgotcHJvamVjdE5hbWVMYWJlbF90ZXh0PU5hbWU6Ci1kaXJMYWJlbF90ZXh0PURpcmVjdG9yeToKLWJyb3dzZUJ1dHRvbl90ZXh0PUJyb3dzZS4uLgotCi0jIFByb2dyZXNzIE1lc3NhZ2VzCi1leHBvcnRNU1BUYXNrX25hbWU9RXhwb3J0aW5nIHNlbGVjdGVkIHByb2Nlc3MgdG8gTWljcm9zb2Z0IFByb2plY3QuLi4KLQotIyBXYXJuaW5nIE1lc3NhZ2VzCi1vdmVyd3JpdGVUZXh0X21zZz1JVVBNMDEwMFc6IEEgTWljcm9zb2Z0IFByb2plY3QgJyd7MH0nJyBhbHJlYWR5IGV4aXN0cyBpbiAnJ3sxfScnLlxuXG5EbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgaXQ/Ci1taXNzaW5nUHJvY2Vzc0NvbnRlbnRXYXJuaW5nX21zZz1JVVBNMDEwMlc6IFRoZSBwdWJsaXNoZWQgcHJvY2VzcyB3ZWJzaXRlIHdpbGwgbm90IGNvbnRhaW4gYW55IGNvbnRlbnQgcmVsYXRlZCB0byB0aGUgZXhwb3J0ZWQgcHJvY2Vzcy5cblxuRG8geW91IHdhbnQgdG8gcHJvY2VlZD8KLQotIyBJbmZvcm1hdGlvbmFsIE1lc3NhZ2VzCi1jb21wbGV0ZWRUZXh0X21zZz1JVVBNMDEwM0k6IFRoZSBzZWxlY3RlZCBwcm9jZXNzICcnezB9JycgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGV4cG9ydGVkIHRvIE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBmaWxlICcnezF9JycuCi0KLSMgRXJyb3IgTWVzc2FnZXMKLWV4cG9ydE1TUEVycm9yX21zZz1JVVBNMDEwNUU6IEFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSBleHBvcnRpbmcgdGhlIHNlbGVjdGVkIHByb2Nlc3MgJyd7MH0nJyB0byBNaWNyb3NvZnQgUHJvamVjdCAnJ3sxfScnLgotZXhwb3J0TVNQRXJyb3JfcmVhc29uPUNsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1leHBvcnRNU1BJbnRlcm5hbEVycm9yX21zZz1BbiBpbnRlcm5hbCBlcnJvciBoYXMgb2NjdXJyZWQuCi1pbGxlZ2FsQXJndW1lbnRfbXNnPXswfSByZXR1cm5zIGEgbnVsbCBvciBpbnZhbGlkIHZhbHVlLgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NjhhZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHJlc291cmNpbmcgc3VwcG9ydCBmb3IgdGhlIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCB3aXphcmQuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3ByZWZlcmVuY2VzL0V4cG9ydE1TUFVJUHJlZmVyZW5jZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9wcmVmZXJlbmNlcy9FeHBvcnRNU1BVSVByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2Nzc4M2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3ByZWZlcmVuY2VzL0V4cG9ydE1TUFVJUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLlByZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkuRXhwb3J0TVNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIFRoZSBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgVUkgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0TVNQVUlQcmVmZXJlbmNlcyB7Ci0KLQkvLyBUaGUgcHVibGlzaCB3ZWIgc2l0ZSBwcmVmZXJlbmNlIGtleS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9XRUJTSVRFID0gInB1Ymxpc2hXZWJTaXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHB1Ymxpc2ggY29uZmlndXJhdGlvbiBwcmVmZXJlbmNlIGtleS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DT05GSUdVUkFUSU9OID0gInB1Ymxpc2hDb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIGV4cG9ydCBvbmx5IHBsYW5uZWQgV0JTIGVsZW1lbnRzIHByZWZlcmVuY2Uga2V5LgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfT05MWV9QTEFOTkVEX1dCU19FTEVNRU5UUyA9ICJleHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHByb2Nlc3MgbmFtZSBwcmVmZXJlbmNlIGtleS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU19OQU1FID0gInByb2Nlc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbXIgcHJlZmVyZW5jZSBrZXkuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fTkFNRSA9ICJjb25maWd1cmF0aW9uTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBNaWNyb3NvZnQgUHJvamVjdCBuYW1lcyBwcmVmZXJlbmNlIGtleS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNfUFJPSkVDVF9OQU1FUyA9ICJtc3Byb2plY3ROYW1lcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBleHBvcnQgZGlyZWN0b3JpZXMgcHJlZmVyZW5jZSBrZXkuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUE9SVF9ESVJFQ1RPUklFUyA9ICJleHBvcnREaXJzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIGRlZmF1bHQgZXhwb3J0IE1TUCBkaXJlY3RvcnkgbmFtZS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWFBPUlRfRElSX05BTUUgPSAiRXhwb3J0IiArIEZpbGVVdGlsLkZJTEVfU0VQICsgIk1TUCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkgCi0JCi0JLy8gVGhlIHBsdWctaW4gc3BlY2lmaWMgcHJlZmVyZW5jZSBzdG9yZS4KLQlwcml2YXRlIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IEV4cG9ydE1TUFVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JLy8gVGhlIGRlZmF1bHQgZXhwb3J0IE1TUCBkaXJlY3RvcnkuCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRFeHBvcnREaXIgPSBudWxsOwotCQotCXN0YXRpYyB7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFBVQkxJU0hfV0VCU0lURSwgdHJ1ZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFBVQkxJU0hfQ09ORklHVVJBVElPTiwgdHJ1ZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KEVYUE9SVF9PTkxZX1BMQU5ORURfV0JTX0VMRU1FTlRTLCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KENPTkZJR1VSQVRJT05fTkFNRSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFBST0NFU1NfTkFNRSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KE1TX1BST0pFQ1RfTkFNRVMsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChFWFBPUlRfRElSRUNUT1JJRVMsIGdldERlZmF1bHRFeHBvcnREaXIoKSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCB3ZWIgc2l0ZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaXMgdGhlIHByZWZlcmVuY2UgaXMgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRQdWJsaXNoV2ViU2l0ZSgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFBVQkxJU0hfV0VCU0lURSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCB3ZWIgc2l0ZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHVibGlzaFdlYlNpdGUoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoUFVCTElTSF9XRUJTSVRFLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBjb25maWd1cmF0aW9uIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpcyB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0UHVibGlzaENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihQVUJMSVNIX0NPTkZJR1VSQVRJT04pOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggY29uZmlndXJhdGlvbiBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHVibGlzaENvbmZpZ3VyYXRpb24oYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoUFVCTElTSF9DT05GSUdVUkFUSU9OLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZXhwb3J0IG9ubHkgcGxhbm5lZCBXQlMgZWxlbWVudHMgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlzIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRFeHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oRVhQT1JUX09OTFlfUExBTk5FRF9XQlNfRUxFTUVOVFMpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGV4cG9ydCBvbmx5IHBsYW5uZWQgV0JTIGVsZW1lbnRzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRFeHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKEVYUE9SVF9PTkxZX1BMQU5ORURfV0JTX0VMRU1FTlRTLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHJvY2VzcyBuYW1lIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb2Nlc3NOYW1lKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhQUk9DRVNTX05BTUUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHByb2Nlc3MgbmFtZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvY2Vzc05hbWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShQUk9DRVNTX05BTUUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBuYW1lIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbmZpZ3VyYXRpb25OYW1lKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhDT05GSUdVUkFUSU9OX05BTUUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENvbmZpZ3VyYXRpb25OYW1lKFN0cmluZyB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoQ09ORklHVVJBVElPTl9OQU1FLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgTWljcm9zb2Z0IFByb2plY3QgbmFtZXMgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRNU1Byb2plY3ROYW1lcygpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldFN0cmluZ1ZhbHVlcyhwcmVmU3RvcmUsIE1TX1BST0pFQ1RfTkFNRVMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IG5hbWVzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgTWljcm9zb2Z0IFByb2plY3QgbmFtZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRNU1Byb2plY3ROYW1lc0xpc3QoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRMaXN0KHByZWZTdG9yZSwgTVNfUFJPSkVDVF9OQU1FUyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIE1pY3Jvc29mdCBQcm9qZWN0IG5hbWUgdG8gdGhlIE1pY3Jvc29mdCBQcm9qZWN0IG5hbWVzIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgdGVtcGxhdGUgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNU1Byb2plY3ROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVByZWZlcmVuY2VVdGlsLmFkZFRvTGlzdChwcmVmU3RvcmUsIE1TX1BST0pFQ1RfTkFNRVMsIG5hbWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgZXhwb3J0IE1TUCBkaXJlY3RvcnkuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBleHBvcnQgTVNQIGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRFeHBvcnREaXIoKSB7Ci0JCWlmIChkZWZhdWx0RXhwb3J0RGlyID09IG51bGwpIHsKLQkJCWRlZmF1bHRFeHBvcnREaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYXBwTmFtZSA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldEFwcGxpY2F0aW9uU2hvcnROYW1lKCk7Ci0JCQlpZiAoYXBwTmFtZSAhPSBudWxsICYmIGFwcE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZGVmYXVsdEV4cG9ydERpciA9IGRlZmF1bHRFeHBvcnREaXIgKyBGaWxlVXRpbC5GSUxFX1NFUAotCQkJCQkJKyBhcHBOYW1lICsgRmlsZVV0aWwuRklMRV9TRVAgKyBERUZBVUxUX0VYUE9SVF9ESVJfTkFNRTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVmYXVsdEV4cG9ydERpciA9IGRlZmF1bHRFeHBvcnREaXIgKyBGaWxlVXRpbC5GSUxFX1NFUAotCQkJCQkJKyBERUZBVUxUX0VYUE9SVF9ESVJfTkFNRTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdEV4cG9ydERpcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBleHBvcnQgZGlyZWN0b3JpZXMgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFeHBvcnREaXJlY3RvcmllcygpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldFN0cmluZ1ZhbHVlcyhwcmVmU3RvcmUsIEVYUE9SVF9ESVJFQ1RPUklFUyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZXhwb3J0IGRpcmVjdG9yaWVzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgZXhwb3J0IGRpcmVjdG9yaWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0RXhwb3J0RGlyZWN0b3JpZXNMaXN0KCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuZ2V0TGlzdChwcmVmU3RvcmUsIEVYUE9SVF9ESVJFQ1RPUklFUyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGV4cG9ydCBkaXJlY3RvcnkgdG8gdGhlIGV4cG9ydCBkaXJlY3RvcmllcyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBkaXIKLQkgKiAgICAgICAgICAgIGFuIGV4cG9ydCBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkRXhwb3J0RGlyKFN0cmluZyBkaXIpIHsKLQkJUHJlZmVyZW5jZVV0aWwuYWRkVG9MaXN0KHByZWZTdG9yZSwgRVhQT1JUX0RJUkVDVE9SSUVTLCBkaXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYmY4MDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHByZWZlcmVuY2Ugc3VwcG9ydCBmb3IgdGhlIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCB3aXphcmQuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3dpemFyZHMvRXhwb3J0TVNQV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvd2l6YXJkcy9FeHBvcnRNU1BXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTllNmViOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvd2l6YXJkcy9FeHBvcnRNU1BXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AuRXhwb3J0TVNQT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5FeHBvcnRNU1BTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLkV4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AuSUV4cG9ydE1TUFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkuRXhwb3J0TVNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkuRXhwb3J0TVNQVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5TZWxlY3RQcm9jZXNzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51dGlsLlB1Ymxpc2hpbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogVGhlIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCB3aXphcmQuCi0gKiA8cD4KLSAqIFRoaXMgd2l6YXJkIGV4cG9ydHMgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcyB0byBhIE1pY3Jvc29mdAotICogUHJvamVjdC4gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZ2VuZXJhdGVzIGEgWE1MIGZpbGUgdGhhdCBhZGhlcmVzIHRvIHRoZQotICogTWljcm9zb2Z0IFByb2plY3QgMjAwMyBYTUwgU2NoZW1hLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE1TUFdpemFyZCBleHRlbmRzIEJhc2VXaXphcmQgaW1wbGVtZW50cyBJRXhwb3J0V2l6YXJkIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0lEID0gRXhwb3J0TVNQV2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQotCS8qKgotCSAqIFRoZSBQdWJsaXNoIENvbmZpZ3VyYXRpb24gd2l6YXJkIGV4dGVuc2lvbiBwb2ludCBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfRVhURU5TSU9OX1BPSU5UX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLmV4cG9ydE1TUFdpemFyZCI7IC8vJE5PTi1OTFMtMSQJCi0KLQkvLyBUaGUgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIHByb2Nlc3MuCi0JcHJvdGVjdGVkIFNlbGVjdFByb2Nlc3NQYWdlIHNlbGVjdFByb2Nlc3NQYWdlOwotCi0JLy8gVGhlIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBleHBvcnQgb3B0aW9ucy4KLQlwcm90ZWN0ZWQgU2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2Ugc2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2U7Ci0KLQkvLyBUaGUgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucy4KLQlwcm90ZWN0ZWQgU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlIHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZTsKLQotCS8vIFRoZSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgZXhwb3J0IGRpcmVjdG9yeS4KLQlwcm90ZWN0ZWQgU2VsZWN0RXhwb3J0RGlyZWN0b3J5UGFnZSBzZWxlY3RFeHBvcnREaXJQYWdlOwotCi0JLy8gVGhlIGV4cG9ydCBvcHRpb25zLgotCXByb3RlY3RlZCBFeHBvcnRNU1BPcHRpb25zIGV4cG9ydE9wdGlvbnMgPSBuZXcgRXhwb3J0TVNQT3B0aW9ucygpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQV2l6YXJkKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvbik7Ci0JCXNldFdpbmRvd1RpdGxlKEV4cG9ydE1TUFVJUmVzb3VyY2VzLmV4cG9ydE1TUFdpemFyZF90aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkI2dldFdpemFyZEV4dGVuZGVyRXh0ZW5zaW9uUG9pbnRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaXphcmRFeHRlbmRlckV4dGVuc2lvblBvaW50SWQoKSB7Ci0JCXJldHVybiBXSVpBUkRfRVhURU5TSU9OX1BPSU5UX0lEOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWlmICh3aXphcmRFeHRlbmRlciA9PSBudWxsKSB7Ci0JCQlzZWxlY3RQcm9jZXNzUGFnZSA9IG5ldyBTZWxlY3RQcm9jZXNzUGFnZSgpOwotCQkJc2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UgPSBuZXcgU2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UoKTsKLQkJCXNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSA9IG5ldyBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UoKTsKLQkJCXNlbGVjdEV4cG9ydERpclBhZ2UgPSBuZXcgU2VsZWN0RXhwb3J0RGlyZWN0b3J5UGFnZSgpOwotCQkJc3VwZXIuYWRkUGFnZShzZWxlY3RQcm9jZXNzUGFnZSk7Ci0JCQlzdXBlci5hZGRQYWdlKHNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlKTsKLQkJCXN1cGVyLmFkZFBhZ2Uoc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKTsKLQkJCXN1cGVyLmFkZFBhZ2Uoc2VsZWN0RXhwb3J0RGlyUGFnZSk7Ci0JCX0gZWxzZSB7Ci0JCQlMaXN0PElXaXphcmRQYWdlPiB3aXphcmRQYWdlcyA9IG5ldyBBcnJheUxpc3Q8SVdpemFyZFBhZ2U+KCk7Ci0KLQkJCUlXaXphcmRQYWdlIHBhZ2UgPSB3aXphcmRFeHRlbmRlcgotCQkJCQkuZ2V0UmVwbGFjZVdpemFyZFBhZ2UoU2VsZWN0UHJvY2Vzc1BhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdFByb2Nlc3NQYWdlID0gbmV3IFNlbGVjdFByb2Nlc3NQYWdlKCk7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHNlbGVjdFByb2Nlc3NQYWdlKTsKLQkJCX0KLQotCQkJcGFnZSA9IHdpemFyZEV4dGVuZGVyCi0JCQkJCS5nZXRSZXBsYWNlV2l6YXJkUGFnZShTZWxlY3RFeHBvcnRPcHRpb25zUGFnZS5QQUdFX05BTUUpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCXdpemFyZFBhZ2VzLmFkZChwYWdlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UgPSBuZXcgU2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQoc2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UpOwotCQkJfQotCi0JCQlwYWdlID0gd2l6YXJkRXh0ZW5kZXIKLQkJCQkJLmdldFJlcGxhY2VXaXphcmRQYWdlKFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZS5QQUdFX05BTUUpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCXdpemFyZFBhZ2VzLmFkZChwYWdlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlID0gbmV3IFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSgpOwotCQkJCXdpemFyZFBhZ2VzLmFkZChzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UpOwotCQkJfQotCi0JCQlwYWdlID0gd2l6YXJkRXh0ZW5kZXIKLQkJCQkJLmdldFJlcGxhY2VXaXphcmRQYWdlKFNlbGVjdEV4cG9ydERpcmVjdG9yeVBhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdEV4cG9ydERpclBhZ2UgPSBuZXcgU2VsZWN0RXhwb3J0RGlyZWN0b3J5UGFnZSgpOwotCQkJCXdpemFyZFBhZ2VzLmFkZChzZWxlY3RFeHBvcnREaXJQYWdlKTsKLQkJCX0KLQotCQkJc3VwZXIuZ2V0TmV3V2l6YXJkUGFnZXMod2l6YXJkUGFnZXMpOwotCi0JCQlmb3IgKEl0ZXJhdG9yPElXaXphcmRQYWdlPiBpdCA9IHdpemFyZFBhZ2VzLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJSVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IGl0Lm5leHQoKTsKLQkJCQlzdXBlci5hZGRQYWdlKHdpemFyZFBhZ2UpOwotCQkJfQotCi0JCQl3aXphcmRFeHRlbmRlci5pbml0V2l6YXJkUGFnZXMod2l6YXJkUGFnZXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUV4cG9ydE1TUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkJCSJmdWxsL29iajE2L01TUHJvamVjdC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlpZiAod2l6YXJkRXh0ZW5kZXIgIT0gbnVsbCkgewotCQkJaWYgKCEgd2l6YXJkRXh0ZW5kZXIuY2FuRmluaXNoKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCkgPT0gc2VsZWN0RXhwb3J0RGlyUGFnZQotCQkJCSYmIHNlbGVjdEV4cG9ydERpclBhZ2UuaXNQYWdlQ29tcGxldGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmQjZG9GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGRvRmluaXNoKCkgewotCQlyZXR1cm4gZXhwb3J0TVNQKHNlbGVjdFByb2Nlc3NQYWdlLmdldFByb2Nlc3MoKSwgZ2V0RXhwb3J0T3B0aW9ucygpLAotCQkJCUV4cG9ydE1TUFNlcnZpY2UuZ2V0SW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogRXhwb3J0cyB0aGUgc2VsZWN0ZWQgcHJvY2Vzcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBvcnRNU1AoUHJvY2VzcyBwcm9jZXNzLCBFeHBvcnRNU1BPcHRpb25zIGV4cG9ydE9wdGlvbnMsCi0JCQlJRXhwb3J0TVNQU2VydmljZSBzZXJ2aWNlKSB7Ci0JCWlmIChwcm9jZXNzID09IG51bGwgfHwgZXhwb3J0T3B0aW9ucyA9PSBudWxsIHx8IHNlcnZpY2UgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJRmlsZSBleHBvcnREaXI7Ci0JCVN0cmluZyBtc3Byb2plY3ROYW1lOwotCi0JCXRyeSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IGV4cG9ydE9wdGlvbnMuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJleHBvcnRPcHRpb25zLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoZXhwb3J0T3B0aW9ucy5nZXRQdWJsaXNoV2ViU2l0ZSgpKSB7Ci0JCQkJaWYgKHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSAhPSBudWxsKSB7Ci0JCQkJCXNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZS5zYXZlUHJlZmVyZW5jZXMoKTsKLQkJCQl9Ci0KLQkJCQlpZiAoIVB1Ymxpc2hpbmdVdGlsLmhhc1ZhbGlkUHJvY2Vzc1ZpZXcoY29uZmlnLCBwcm9jZXNzKSkgewotCQkJCQlib29sZWFuIG9rID0gRXhwb3J0TVNQVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlQcm9tcHQoCi0JCQkJCQkJCQlFeHBvcnRNU1BVSVJlc291cmNlcy5leHBvcnRNU1BXaXphcmRfdGl0bGUsCi0JCQkJCQkJCQlFeHBvcnRNU1BVSVJlc291cmNlcy5taXNzaW5nUHJvY2Vzc0NvbnRlbnRXYXJuaW5nX21zZyk7Ci0JCQkJCWlmICghb2spIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJZXhwb3J0RGlyID0gZXhwb3J0T3B0aW9ucy5nZXRFeHBvcnREaXIoKTsKLQkJCWlmIChleHBvcnREaXIgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCQkiZXhwb3J0T3B0aW9ucy5nZXRFeHBvcnREaXIoKSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCW1zcHJvamVjdE5hbWUgPSBleHBvcnRPcHRpb25zLmdldE1TUHJvamVjdE5hbWUoKTsKLQkJCWlmIChtc3Byb2plY3ROYW1lID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkJImV4cG9ydE9wdGlvbnMuZ2V0TVNQcm9qZWN0TmFtZSgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWRpc3BsYXlJbGxlZ2FsQXJndW1lbnRFcnJvcihlLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZyBtc3Byb2plY3RGaWxlTmFtZSA9IG1zcHJvamVjdE5hbWUgKyAiLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQkJRmlsZSBtc3Byb2plY3RGaWxlID0gbmV3IEZpbGUoZXhwb3J0RGlyLCBtc3Byb2plY3RGaWxlTmFtZSk7Ci0JCWlmIChtc3Byb2plY3RGaWxlLmV4aXN0cygpKSB7Ci0JCQlib29sZWFuIG9rID0gRXhwb3J0TVNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5UHJvbXB0KAotCQkJCQkJCUV4cG9ydE1TUFVJUmVzb3VyY2VzLmV4cG9ydE1TUFdpemFyZF90aXRsZSwKLQkJCQkJCQlOTFMuYmluZChFeHBvcnRNU1BVSVJlc291cmNlcy5vdmVyd3JpdGVUZXh0X21zZywKLQkJCQkJCQkJCShuZXcgU3RyaW5nW10geyBtc3Byb2plY3RGaWxlTmFtZSwKLQkJCQkJCQkJCQkJZXhwb3J0RGlyLmdldEFic29sdXRlUGF0aCgpIH0pKSk7Ci0JCQlpZiAoIW9rKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJdHJ5IHsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IHNlcnZpY2UuZXhwb3J0TVNQcm9qZWN0KHByb2Nlc3MsIGV4cG9ydE9wdGlvbnMpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQlFeHBvcnRNU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUluZm8oCi0JCQkJCQlFeHBvcnRNU1BVSVJlc291cmNlcy5leHBvcnRNU1BXaXphcmRfdGl0bGUsCi0JCQkJCQlOTFMuYmluZChFeHBvcnRNU1BVSVJlc291cmNlcy5jb21wbGV0ZWRUZXh0X21zZywKLQkJCQkJCQkJKG5ldyBTdHJpbmdbXSB7IHByb2Nlc3MuZ2V0TmFtZSgpLAotCQkJCQkJCQkJCW1zcHJvamVjdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgfSkpKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0JCQlFeHBvcnRNU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlFeHBvcnRNU1BVSVJlc291cmNlcy5leHBvcnRNU1BXaXphcmRfdGl0bGUsCi0JCQkJCU5MUy5iaW5kKEV4cG9ydE1TUFVJUmVzb3VyY2VzLmV4cG9ydE1TUEVycm9yX21zZywKLQkJCQkJCQkobmV3IFN0cmluZ1tdIHsgcHJvY2Vzcy5nZXROYW1lKCksCi0JCQkJCQkJCQltc3Byb2plY3RGaWxlLmdldEFic29sdXRlUGF0aCgpIH0pKSwKLQkJCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMuZXhwb3J0TVNQRXJyb3JfcmVhc29uLCBlKTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBwcm9jZXNzIHRvCi0JICogZXhwb3J0LgotCSAqLwotCXB1YmxpYyBTZWxlY3RQcm9jZXNzUGFnZSBnZXRTZWxlY3RQcm9jZXNzUGFnZSgpIHsKLQkJcmV0dXJuIHNlbGVjdFByb2Nlc3NQYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0aGUgZXhwb3J0IG9wdGlvbnMuCi0JICovCi0JcHVibGljIFNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlIGdldEV4cG9ydE9wdGlvbnNQYWdlKCkgewotCQlyZXR1cm4gc2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIHB1Ymxpc2hpbmcKLQkgKiBvcHRpb25zLgotCSAqLwotCXB1YmxpYyBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2Ugc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKCkgewotCQlyZXR1cm4gc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBleHBvcnQKLQkgKiBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIFNlbGVjdEV4cG9ydERpcmVjdG9yeVBhZ2UgZ2V0U2VsZWN0RXhwb3J0RGlyZWN0b3J5UGFnZSgpIHsKLQkJcmV0dXJuIHNlbGVjdEV4cG9ydERpclBhZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXhwb3J0IG9wdGlvbnMuCi0JICovCi0JcHVibGljIEV4cG9ydE1TUE9wdGlvbnMgZ2V0RXhwb3J0T3B0aW9ucygpIHsKLQkJZXhwb3J0T3B0aW9ucy5zZXRNZXRob2RDb25maWd1cmF0aW9uKHNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCWV4cG9ydE9wdGlvbnMuc2V0RXhwb3J0RGlyKG5ldyBGaWxlKHNlbGVjdEV4cG9ydERpclBhZ2UKLQkJCQkuZ2V0RXhwb3J0RGlyZWN0b3J5KCkpKTsKLQkJZXhwb3J0T3B0aW9ucy5zZXRNU1Byb2plY3ROYW1lKHNlbGVjdEV4cG9ydERpclBhZ2UuZ2V0TVNQcm9qZWN0TmFtZSgpKTsKLQkJZXhwb3J0T3B0aW9ucy5zZXRFeHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzKHNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlCi0JCQkJLmdldEV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHNTZWxlY3Rpb24oKSk7Ci0KLQkJaWYgKHNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlLmdldFB1Ymxpc2hXZWJTaXRlU2VsZWN0aW9uKCkpIHsKLQkJCVB1Ymxpc2hPcHRpb25zIHB1Ymxpc2hpbmdPcHRpb25zID0gc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlCi0JCQkJCS5nZXRQdWJsaXNoaW5nT3B0aW9ucygpOwotCQkJYm9vbGVhbiBwdWJsaXNoQ29uZmlnID0gc2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UKLQkJCQkJLmdldFB1Ymxpc2hDb25maWdTZWxlY3Rpb24oKTsKLQkJCWJvb2xlYW4gcHVibGlzaFByb2Nlc3MgPSBzZWxlY3RFeHBvcnRPcHRpb25zUGFnZQotCQkJCQkuZ2V0UHVibGlzaFByb2Nlc3NTZWxlY3Rpb24oKTsKLQkJCXB1Ymxpc2hpbmdPcHRpb25zLnNldFB1Ymxpc2hDb25maWd1cmF0aW9uKHB1Ymxpc2hDb25maWcpOwotCQkJcHVibGlzaGluZ09wdGlvbnMuc2V0UHVibGlzaFByb2Nlc3MocHVibGlzaFByb2Nlc3MpOwotCQkJZXhwb3J0T3B0aW9ucy5zZXRQdWJsaXNoV2ViU2l0ZShwdWJsaXNoaW5nT3B0aW9ucyAhPSBudWxsCi0JCQkJCSYmIChwdWJsaXNoQ29uZmlnIHx8IHB1Ymxpc2hQcm9jZXNzKSk7Ci0JCQlleHBvcnRPcHRpb25zLnNldFB1Ymxpc2hpbmdPcHRpb25zKHB1Ymxpc2hpbmdPcHRpb25zKTsKLQkJfSBlbHNlIHsKLQkJCWV4cG9ydE9wdGlvbnMuc2V0UHVibGlzaFdlYlNpdGUoZmFsc2UpOwotCQkJZXhwb3J0T3B0aW9ucy5zZXRQdWJsaXNoaW5nT3B0aW9ucyhudWxsKTsKLQkJfQotCi0JCXJldHVybiBleHBvcnRPcHRpb25zOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIGFuIGVycm9yIGRpYWxvZyBhYm91dCBhbiBpbGxlZ2FsIGFyZ3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBuYW1lIG9mIHRoZSBhcmd1bWVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc3BsYXlJbGxlZ2FsQXJndW1lbnRFcnJvcihTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoRXhwb3J0TVNQVUlSZXNvdXJjZXMuaWxsZWdhbEFyZ3VtZW50X21zZywKLQkJCQkobmV3IFN0cmluZ1tdIHsgbmFtZSB9KSk7Ci0JCUV4cG9ydE1TUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMuZXhwb3J0TVNQV2l6YXJkX3RpdGxlLAotCQkJCUV4cG9ydE1TUFVJUmVzb3VyY2VzLmV4cG9ydE1TUEludGVybmFsRXJyb3JfbXNnLAotCQkJCUV4cG9ydE1TUFVJUmVzb3VyY2VzLmV4cG9ydE1TUEVycm9yX3JlYXNvbiwKLQkJCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1zZykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3dpemFyZHMvU2VsZWN0RXhwb3J0RGlyZWN0b3J5UGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3dpemFyZHMvU2VsZWN0RXhwb3J0RGlyZWN0b3J5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmUyZWJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS93aXphcmRzL1NlbGVjdEV4cG9ydERpcmVjdG9yeVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkuRXhwb3J0TVNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkuRXhwb3J0TVNQVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkucHJlZmVyZW5jZXMuRXhwb3J0TVNQVUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBNaWNyb3NvZnQgUHJvamVjdCBuYW1lIGFuZAotICogZXhwb3J0IGRpcmVjdG9yeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RFeHBvcnREaXJlY3RvcnlQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0RXhwb3J0RGlyZWN0b3J5UGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBTaGVsbCBzaGVsbDsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSB0ZW1wbGF0ZUNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBDb21ibyBwcm9qZWN0TmFtZUNvbWJvOwotCi0JcHJvdGVjdGVkIENvbWJvIGV4cG9ydERpckNvbWJvOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdEV4cG9ydERpcmVjdG9yeVBhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoRXhwb3J0TVNQVUlSZXNvdXJjZXMuc2VsZWN0RXhwb3J0RGlyV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEV4cG9ydE1TUFVJUmVzb3VyY2VzLnNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGV4dCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRNU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9leHBfbXNfcHJqX3dpemJhbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RFeHBvcnREaXJlY3RvcnlQYWdlKCkgewotCQl0aGlzKFBBR0VfTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCi0JCWNvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUocGFyZW50LCAxKTsKLQotCQl0ZW1wbGF0ZUNvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUoY29tcG9zaXRlLCAzKTsKLQotCQljcmVhdGVMYWJlbCh0ZW1wbGF0ZUNvbXBvc2l0ZSwKLQkJCQlFeHBvcnRNU1BVSVJlc291cmNlcy5wcm9qZWN0TmFtZUxhYmVsX3RleHQpOwotCi0JCXByb2plY3ROYW1lQ29tYm8gPSBjcmVhdGVDb21ib2JveCh0ZW1wbGF0ZUNvbXBvc2l0ZSwgMik7Ci0KLQkJY3JlYXRlTGFiZWwodGVtcGxhdGVDb21wb3NpdGUsIEV4cG9ydE1TUFVJUmVzb3VyY2VzLmRpckxhYmVsX3RleHQpOwotCi0JCWV4cG9ydERpckNvbWJvID0gY3JlYXRlQ29tYm9ib3godGVtcGxhdGVDb21wb3NpdGUpOwotCi0JCWJyb3dzZUJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbih0ZW1wbGF0ZUNvbXBvc2l0ZSwKLQkJCQlFeHBvcnRNU1BVSVJlc291cmNlcy5icm93c2VCdXR0b25fdGV4dCk7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlTdHJpbmdbXSB0ZW1wbGF0ZU5hbWVzID0gRXhwb3J0TVNQVUlQcmVmZXJlbmNlcy5nZXRNU1Byb2plY3ROYW1lcygpOwotCQlpZiAodGVtcGxhdGVOYW1lcyAhPSBudWxsICYmIHRlbXBsYXRlTmFtZXMubGVuZ3RoID4gMCkgewotCQkJcHJvamVjdE5hbWVDb21iby5zZXRJdGVtcyh0ZW1wbGF0ZU5hbWVzKTsKLQkJCXByb2plY3ROYW1lQ29tYm8uc2V0VGV4dCh0ZW1wbGF0ZU5hbWVzWzBdKTsKLQkJfQotCi0JCVN0cmluZ1tdIGV4cG9ydERpcnMgPSBFeHBvcnRNU1BVSVByZWZlcmVuY2VzLmdldEV4cG9ydERpcmVjdG9yaWVzKCk7Ci0JCWlmIChleHBvcnREaXJzICE9IG51bGwgJiYgZXhwb3J0RGlycy5sZW5ndGggPiAwKSB7Ci0JCQlleHBvcnREaXJDb21iby5zZXRJdGVtcyhleHBvcnREaXJzKTsKLQkJCWV4cG9ydERpckNvbWJvLnNldFRleHQoZXhwb3J0RGlyc1swXSk7Ci0JCX0KLQotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXRyeSB7Ci0JCQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHNoZWxsLAotCQkJCQkJCVNXVC5OT05FKTsKLQkJCQkJU3RyaW5nIHNlbGVjdGVkRGlyID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkJaWYgKHNlbGVjdGVkRGlyICE9IG51bGwpIHsKLQkJCQkJCWV4cG9ydERpckNvbWJvLmFkZChzZWxlY3RlZERpciwgMCk7Ci0JCQkJCQlleHBvcnREaXJDb21iby5zZXRUZXh0KHNlbGVjdGVkRGlyKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUV4cG9ydE1TUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEFkZHMgZXZlbnQgaGFuZGxlcnMgdG8gdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJcHJvamVjdE5hbWVDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCWV4cG9ydERpckNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGdldE1TUHJvamVjdE5hbWUoKS5sZW5ndGgoKSA+IDAKLQkJCQkmJiBnZXRFeHBvcnREaXJlY3RvcnkoKS5sZW5ndGgoKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgTWljcm9zb2Z0IFByb2plY3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1TUHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBwcm9qZWN0TmFtZUNvbWJvLmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXhwb3J0IGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4cG9ydERpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIGV4cG9ydERpckNvbWJvLmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlFeHBvcnRNU1BVSVByZWZlcmVuY2VzLmFkZE1TUHJvamVjdE5hbWUoZ2V0TVNQcm9qZWN0TmFtZSgpKTsKLQkJRXhwb3J0TVNQVUlQcmVmZXJlbmNlcy5hZGRFeHBvcnREaXIoZ2V0RXhwb3J0RGlyZWN0b3J5KCkpOwotCQltb2RpZnlMaXN0ZW5lciA9IG51bGw7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvd2l6YXJkcy9TZWxlY3RFeHBvcnRPcHRpb25zUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3dpemFyZHMvU2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJlYWZhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvd2l6YXJkcy9TZWxlY3RFeHBvcnRPcHRpb25zUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5FeHBvcnRNU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5FeHBvcnRNU1BVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5wcmVmZXJlbmNlcy5FeHBvcnRNU1BVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IHRoZSBleHBvcnQgb3B0aW9ucy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RFeHBvcnRPcHRpb25zUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbmZpZ0NvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBUZXh0IHByb2Nlc3NUZXh0OwotCi0JcHJvdGVjdGVkIENvbWJvIGNvbmZpZ0NvbWJvOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBvcHRpb25zQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBwdWJsaXNoV2ViU2l0ZVJhZGlvQnV0dG9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBwdWJsaXNoT3B0aW9uc0NvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBCdXR0b24gcHVibGlzaENvbmZpZ1JhZGlvQnV0dG9uOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBwdWJsaXNoUHJvY2Vzc1JhZGlvQnV0dG9uOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBleHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzQ2hlY2tCb3g7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RFeHBvcnRPcHRpb25zUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShFeHBvcnRNU1BVSVJlc291cmNlcy5zZWxlY3RFeHBvcnRPcHRpb25zV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEV4cG9ydE1TUFVJUmVzb3VyY2VzLnNlbGVjdEV4cG9ydE9wdGlvbnNXaXphcmRQYWdlX3RleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0TVNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vZXhwX21zX3Byal93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlKCkgewotCQl0aGlzKFBBR0VfTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQljb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMSk7Ci0KLQkJY29uZmlnQ29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShjb21wb3NpdGUsIDIpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbmZpZ0NvbXBvc2l0ZSwKLQkJCQlFeHBvcnRNU1BVSVJlc291cmNlcy5zZWxlY3RlZFByb2Nlc3NMYWJlbF90ZXh0KTsKLQotCQlwcm9jZXNzVGV4dCA9IGNyZWF0ZVRleHQoY29uZmlnQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbChjb25maWdDb21wb3NpdGUsCi0JCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMuY29uZmlndXJhdGlvbkxhYmVsX3RleHQpOwotCi0JCWNvbmZpZ0NvbWJvID0gbmV3IENvbWJvKGNvbmZpZ0NvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQljb25maWdDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlvcHRpb25zQ29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShjb21wb3NpdGUsIDEpOwotCi0JCXB1Ymxpc2hXZWJTaXRlUmFkaW9CdXR0b24gPSBjcmVhdGVDaGVja2JveChvcHRpb25zQ29tcG9zaXRlLAotCQkJCUV4cG9ydE1TUFVJUmVzb3VyY2VzLnB1Ymxpc2hXZWJTaXRlQ2hlY2tCb3hfdGV4dCk7Ci0KLQkJcHVibGlzaE9wdGlvbnNDb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKG9wdGlvbnNDb21wb3NpdGUsIDEpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBwdWJsaXNoT3B0aW9uc0NvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpblRvcCA9IC01OwotCQlsYXlvdXQubWFyZ2luTGVmdCA9IDEyOwotCi0JCXB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKHB1Ymxpc2hPcHRpb25zQ29tcG9zaXRlLAotCQkJCUV4cG9ydE1TUFVJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdCdXR0b25fdGV4dCk7Ci0KLQkJcHVibGlzaFByb2Nlc3NSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKHB1Ymxpc2hPcHRpb25zQ29tcG9zaXRlLAotCQkJCUV4cG9ydE1TUFVJUmVzb3VyY2VzLnB1Ymxpc2hQcm9jZXNzQnV0dG9uX3RleHQpOwotCi0JCWV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHNDaGVja0JveCA9IGNyZWF0ZUNoZWNrYm94KG9wdGlvbnNDb21wb3NpdGUsCi0JCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMuZXhwb3J0T25seVBsYW5uZWRFbGVtZW50c0NoZWNrQm94X3RleHQpOwotCi0JCWluaXRDb250cm9scygpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMgd2l0aCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250cm9scygpIHsKLQkJaWYgKEV4cG9ydE1TUFVJUHJlZmVyZW5jZXMuZ2V0UHVibGlzaFdlYlNpdGUoKSkgewotCQkJcHVibGlzaFdlYlNpdGVSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQotCQlib29sZWFuIHB1Ymxpc2hDb25maWcgPSBFeHBvcnRNU1BVSVByZWZlcmVuY2VzCi0JCQkJLmdldFB1Ymxpc2hDb25maWd1cmF0aW9uKCk7Ci0JCXB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24ocHVibGlzaENvbmZpZyk7Ci0JCXB1Ymxpc2hQcm9jZXNzUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKCFwdWJsaXNoQ29uZmlnKTsKLQotCQl1cGRhdGVQdWJsaXNoT3B0aW9uc0J1dHRvbnMoKTsKLQotCQlleHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzQ2hlY2tCb3gKLQkJCQkuc2V0U2VsZWN0aW9uKEV4cG9ydE1TUFVJUHJlZmVyZW5jZXMKLQkJCQkJCS5nZXRFeHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzKCkpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgZXZlbnQgaGFuZGxlcnMgdG8gdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJY29uZmlnQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQotCQlwdWJsaXNoV2ViU2l0ZVJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlUHVibGlzaE9wdGlvbnNCdXR0b25zKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBDb25maWd1cmF0aW9uIENvbWJvLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbmZpZ0NvbWJvKFByb2Nlc3MgcHJvY2VzcykgewotCQlTdHJpbmdbXSBjb250ZXh0TmFtZXMgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q29udGV4dHMocHJvY2Vzcyk7Ci0JCWNvbmZpZ0NvbWJvLnNldEl0ZW1zKGNvbnRleHROYW1lcyk7Ci0JCVN0cmluZyBkZWZhdWx0Q29udGV4dCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKS5nZXROYW1lKCk7Ci0JCWNvbmZpZ0NvbWJvLnNldFRleHQoZGVmYXVsdENvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucyByYWRpbyBidXR0b25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVB1Ymxpc2hPcHRpb25zQnV0dG9ucygpIHsKLQkJYm9vbGVhbiBlbmFibGVkID0gZ2V0UHVibGlzaFdlYlNpdGVTZWxlY3Rpb24oKTsKLQkJcHVibGlzaENvbmZpZ1JhZGlvQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXB1Ymxpc2hQcm9jZXNzUmFkaW9CdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2Ujb25FbnRlclBhZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG9uRW50ZXJQYWdlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCVByb2Nlc3MgcHJvY2VzcyA9IChQcm9jZXNzKSBvYmo7Ci0JCQlwcm9jZXNzVGV4dC5zZXRUZXh0KHByb2Nlc3MuZ2V0TmFtZSgpKTsKLQkJCXVwZGF0ZUNvbmZpZ0NvbWJvKHByb2Nlc3MpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZ2V0UHVibGlzaFdlYlNpdGVTZWxlY3Rpb24oKQotCQkJCSYmIGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKS5zaXplKCkgPT0gMCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5taXNzaW5nVmlld0Vycm9yX21zZyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNnZXROZXh0UGFnZURhdGEoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TmV4dFBhZ2VEYXRhKCkgewotCQlyZXR1cm4gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJSVdpemFyZFBhZ2UgbmV4dFBhZ2UgPSBudWxsOwotCi0JCWlmIChnZXRQdWJsaXNoV2ViU2l0ZVNlbGVjdGlvbigpKSB7Ci0JCQluZXh0UGFnZSA9IHN1cGVyLmdldE5leHRQYWdlKCk7Ci0JCX0gZWxzZSB7Ci0JCQluZXh0UGFnZSA9IHN1cGVyLmdldE5leHRQYWdlKCkuZ2V0TmV4dFBhZ2UoKTsKLQkJfQotCi0JCXJldHVybiBuZXh0UGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCVN0cmluZyBjb25maWdOYW1lID0gY29uZmlnQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKTsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlyZXR1cm4gTGlicmFyeVNlcnZpY2VVdGlsLmdldE1ldGhvZENvbmZpZ3VyYXRpb24obGlicmFyeSwgY29uZmlnTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCB3ZWIgc2l0ZSBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0UHVibGlzaFdlYlNpdGVTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBwdWJsaXNoV2ViU2l0ZVJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggY29uZmlndXJhdGlvbiBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0UHVibGlzaENvbmZpZ1NlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIHByb2Nlc3Mgc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFB1Ymxpc2hQcm9jZXNzU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gcHVibGlzaFByb2Nlc3NSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIGNvbmZpZ3VyYXRpb24gc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHNTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBleHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlFeHBvcnRNU1BVSVByZWZlcmVuY2VzLnNldFB1Ymxpc2hXZWJTaXRlKGdldFB1Ymxpc2hXZWJTaXRlU2VsZWN0aW9uKCkpOwotCQlFeHBvcnRNU1BVSVByZWZlcmVuY2VzCi0JCQkJLnNldFB1Ymxpc2hDb25maWd1cmF0aW9uKGdldFB1Ymxpc2hDb25maWdTZWxlY3Rpb24oKSk7Ci0JCUV4cG9ydE1TUFVJUHJlZmVyZW5jZXMKLQkJCQkuc2V0RXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cyhnZXRFeHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzU2VsZWN0aW9uKCkpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQlFeHBvcnRNU1BVSVByZWZlcmVuY2VzLnNldENvbmZpZ3VyYXRpb25OYW1lKGNvbmZpZy5nZXROYW1lKCkpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvd2l6YXJkcy9TZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS93aXphcmRzL1NlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmMzMDc4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS93aXphcmRzL1NlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLkV4cG9ydE1TUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLkV4cG9ydE1TUFVJUmVzb3VyY2VzOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCB0aGUgcHVibGlzaGluZyBvcHRpb25zIGZvciB0aGUKLSAqIHByb2Nlc3Mgd2ViIHNpdGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkcy5TZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEV4cG9ydE1TUFVJUmVzb3VyY2VzLnNlbGVjdFB1Ymxpc2hPcHRpb25zV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEV4cG9ydE1TUFVJUmVzb3VyY2VzLnNlbGVjdFB1Ymxpc2hPcHRpb25zV2l6YXJkUGFnZV90ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydE1TUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2V4cF9tc19wcmpfd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSgpIHsKLQkJdGhpcyhQQUdFX05BTUUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3dpemFyZHMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3dpemFyZHMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWJkNTI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS93aXphcmRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHdpemFyZHMgZm9yIGV4cG9ydGluZyBwcm9jZXNzZXMgdG8gTWljcm9zb2Z0IFByb2plY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjI3NGVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSBSaWNoIFRleHQgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQwMzFiYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNmM5YzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AuRXhwb3J0TVNQUGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWksCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1DbGFzc1BhdGg6IGV4cG9ydG1zcC5qYXIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQyZTQ2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zb3VyY2UuZXhwb3J0bXNwLmphciA9IHNyYy8KLW91dHB1dC5leHBvcnRtc3AuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gZXhwb3J0bXNwLmphcixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRlbXBsYXRlLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U2NGVkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0Ci1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyBXaXphcmRzCi1leHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmROYW1lPU1pY3Jvc29mdCBQcm9qZWN0Ci1leHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmREZXNjcmlwdGlvbj1FeHBvcnQgYSBwcm9jZXNzIHRvIGEgTWljcm9zb2Z0IFByb2plY3QuCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY3ZTJmOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLTwhLS0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS53aXphcmRzLkV4cG9ydE1TUFdpemFyZCIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTVNQcm9qZWN0LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC53aXphcmRzLkV4cG9ydFRvTVNQcm9qZWN0V2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZERlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgICAgaWQ9ImV4cG9ydE1TUFdpemFyZCIKLSAgICAgICAgIG5hbWU9IkV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBXaXphcmQgRXh0ZW5zaW9uIgotICAgICAgICAgc2NoZW1hPSJzY2hlbWEvRXhwb3J0TVNQV2l6YXJkLmV4c2QiIC8+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC53aXphcmRzLkV4cG9ydFRvTVNQcm9qZWN0V2l6YXJkIi8+Ci0gICA8L2V4dGVuc2lvbj4KLS0tPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BFeGNlcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiYzcyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcDsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYW4gRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IG9wZXJhdGlvbiBoYXMgZmFpbGVkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE1TUEV4Y2VwdGlvbiBleHRlbmRzIEV4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTkyMzE4OTcwMDU2MTgwNjI2Mkw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRNU1BFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIocm9vdENhdXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZykgewotCQlzdXBlcihlcnJvck1zZyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uIGFuZCB0aGUKLQkgKiBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIEV4cG9ydE1TUEV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlLCBTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIocm9vdENhdXNlLCBlcnJvck1zZyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUE9wdGlvbnMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BPcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YzcyNTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUE9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQcm9jZXNzT3B0aW9uczsKLQotLyoqCi0gKiBUaGUgZXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IG9wdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDcuMgotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0TVNQT3B0aW9ucyBleHRlbmRzIEV4cG9ydFByb2Nlc3NPcHRpb25zIHsKLQotCXByaXZhdGUgU3RyaW5nIG1zcHJvamVjdE5hbWU7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGV4cG9ydGVkIE1pY3Jvc29mdCBQcm9qZWN0IG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1TUHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBtc3Byb2plY3ROYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IG5hbWUuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlTmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGV4cG9ydGVkIE1pY3Jvc29mdCBQcm9qZWN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TVNQcm9qZWN0TmFtZShTdHJpbmcgbXNwcm9qZWN0TmFtZSkgewotCQl0aGlzLm1zcHJvamVjdE5hbWUgPSBtc3Byb2plY3ROYW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTM0ZDI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IHBsdWctaW4gY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRNU1BQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEV4cG9ydE1TUFBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRNU1BQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RvcChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBFeHBvcnRNU1BQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEzOGM5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBtZXNzYWdlIHJlc291cmNlIGJ1bmRsZSBhY2Nlc3NvciBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFeHBvcnRNU1BSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJVTkRMRV9OQU1FID0gRXhwb3J0TVNQUmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRXhwb3J0TVNQUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRNU1BXaXphcmRfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRNU1BUYXNrX25hbWU7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBFeHBvcnRNU1BSZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI2MjcwZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFNlcnZpY2UgaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0TVNQU2VydmljZSBpbXBsZW1lbnRzIElFeHBvcnRNU1BTZXJ2aWNlIHsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgRXhwb3J0TVNQU2VydmljZSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBFeHBvcnRNU1BTZXJ2aWNlIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChFeHBvcnRNU1BTZXJ2aWNlLmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgRXhwb3J0TVNQU2VydmljZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5JRXhwb3J0TVNQU2VydmljZSNleHBvcnRNU1Byb2plY3QoUHJvY2VzcywKLQkgKiAgICAgIEV4cG9ydE1TUE9wdGlvbnMpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwb3J0TVNQcm9qZWN0KFByb2Nlc3MgcHJvY2VzcywKLQkJCUV4cG9ydE1TUE9wdGlvbnMgZXhwb3J0T3B0aW9ucykgdGhyb3dzIEV4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEV4cG9ydE1TUFhNTFNlcnZpY2UoKS5leHBvcnQocHJvY2VzcywgZXhwb3J0T3B0aW9ucyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZmYTExZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IGEgRXhwb3J0IFByb2plY3QgUGxhbiBTZXJ2aWNlIG9wZXJhdGlvbiBoYXMgZmFpbGVkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTYxMDM2ODk4Njg1NzI0ODAzNTlMOwotCi0JLyoqCi0JICogVGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgVGhyb3dhYmxlIHJvb3RDYXVzZTsKLQotCS8qKgotCSAqIFRoZSBlcnJvciBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXJyb3JNc2c7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIEV4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQl0aGlzKHJvb3RDYXVzZSwgcm9vdENhdXNlLmdldE1lc3NhZ2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIEV4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXRoaXMobnVsbCwgZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbiBhbmQgdGhlCi0JICogZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UsIFN0cmluZyBlcnJvck1zZykgewotCQlzdXBlcigpOwotCQl0aGlzLnJvb3RDYXVzZSA9IHJvb3RDYXVzZTsKLQkJdGhpcy5lcnJvck1zZyA9IGVycm9yTXNnOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgVGhyb3dhYmxlIGdldFJvb3RDYXVzZSgpIHsKLQkJcmV0dXJuIHJvb3RDYXVzZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQWE1MT3BlcmF0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQWE1MT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZWYwMGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFhNTE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5BYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyOwotCi0vKioKLSAqIFRoZSBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgWE1MIGZpbGUgb3BlcmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE1TUFhNTE9wZXJhdGlvbiBpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0KLQlwcml2YXRlIEFic3RyYWN0UHVibGlzaE1hbmFnZXIgcHVibGlzaE1ncjsKLQotCXByaXZhdGUgU3RyaW5nIHB1Ymxpc2hlZF91cmw7Ci0KLQlwcml2YXRlIEV4Y2VwdGlvbiBleGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRNU1BYTUxPcGVyYXRpb24oQWJzdHJhY3RQdWJsaXNoTWFuYWdlciBwdWJsaXNoTWdyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucHVibGlzaE1nciA9IHB1Ymxpc2hNZ3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHVibGlzaGVkIFVSTC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hlZFVybCgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hlZF91cmw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXhjZXB0aW9uLCBpZiBhbnksIHRoYXQgb2NjdXJyZWQgd2hpbGUgcnVubmluZyB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFeGNlcHRpb24gZ2V0RXhjZXB0aW9uKCkgewotCQlyZXR1cm4gZXhjZXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzcyNydW4oSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJZXhjZXB0aW9uID0gbnVsbDsKLQkJbW9uaXRvci5iZWdpblRhc2soIiIsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKLQkJbW9uaXRvci5zZXRUYXNrTmFtZShFeHBvcnRNU1BSZXNvdXJjZXMuZXhwb3J0TVNQVGFza19uYW1lKTsKLQkJdHJ5IHsKLQkJCXB1Ymxpc2hNZ3IucHVibGlzaChtb25pdG9yKTsKLQkJCXB1Ymxpc2hlZF91cmwgPSBwdWJsaXNoTWdyLmdldFB1Ymxpc2hlZFVybCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZXhjZXB0aW9uID0gZTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQkJcHVibGlzaE1nciA9IG51bGw7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQWE1MU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFhNTFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y1ZGYwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQWE1MU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJlZGVjZXNzb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWwuTXNwcm9qZWN0UmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hIVE1MT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzLlB1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFBsYW4gU2VydmljZSBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIAotICogQnVncyBmaXhlZDogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NTA4OQotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NTA4NgotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NTA5NQotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzI2NQotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NTE1NQotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1Njk1OQotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzMyMQotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1OTIzMAotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MjMzNgotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2ODgwMSBmaXggZm9yCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2OTUxCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc3NDI4Ci0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRNU1BYTUxTZXJ2aWNlIHsKLQotCS8vIElmIHRydWUsIGdlbmVyYXRlIGRlYnVnIHRyYWNlcy4KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGRlYnVnID0gRXhwb3J0TVNQUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JLy8gQWxsIFRhc2tzIHJlZmVyZW5jZWQgYnkgdGhlIGV4cG9ydGVkIFByb2plY3QgVGVtcGxhdGUuCi0JcHJpdmF0ZSBMaXN0IHJlZmVyZW5jZWRUYXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgSGFzaE1hcCByb2xlc1RvVWlkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgSGFzaE1hcCB0YXNrVWlkVG9XYnNXYXBwZXJQYXRoTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgSGFzaE1hcCB3YnNXYXBwZXJQYXRoVG9Mb2NhbFByZWRMaXN0TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgSGFzaE1hcCB3YnNHdWlkVG9UYXNrVWlkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgSGFzaE1hcCB3YnNXcmFwcGVyUGF0aFRvUHJlZExpc3RNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gVGhlIG5hbWUgb2YgdGhlIGNvbnRlbnQgZm9sZGVyLiBUaGlzIHdpbGwgYmUgbmFtZWQgYWZ0ZXIgdGhlIGNvbnRleHQuCi0JcHJpdmF0ZSBTdHJpbmcgY29udGVudEZvbGRlck5hbWU7Ci0KLQlwcml2YXRlIFN0cmluZyBhYlRhcmdldERpcjsKLQotCS8vIElmIHRydWUsIG9ubHkgZXhwb3J0IGJyZWFrZG93biBlbGVtZW50cyB3aXRoICdpc1BsYW5uZWQnIGF0dHJpYnV0ZXMgc2V0Ci0JLy8gdG8gdHJ1ZS4KLQlwcml2YXRlIGJvb2xlYW4gZXhwb3J0T25seVBsYW5uZWRFbGVtZW50czsKLQotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoQ29udGVudFNpdGUgPSBmYWxzZTsKLQotCXByaXZhdGUgaW50IHRhc2tfdWlkID0gMTsKLQotCXByaXZhdGUgaW50IHJlc191aWQgPSAxOwotCi0JcHJpdmF0ZSBpbnQgYXNzaWduX3VpZCA9IDE7Ci0KLQlwcm90ZWN0ZWQgTXNwcm9qZWN0RmFjdG9yeSBwcm9qZWN0RmFjdG9yeSA9IE1zcHJvamVjdEZhY3RvcnkuZUlOU1RBTkNFOwotCi0JLy8gVGhlIHByb2Nlc3MgdG8gYmUgZXhwb3J0ZWQuCi0JcHJpdmF0ZSBQcm9jZXNzIHByb2Nlc3M7Ci0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIHByb2Nlc3NDb25maWc7Ci0KLQlwcml2YXRlIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnkgd2JzQWRhcHRlckZhY3Rvcnk7Ci0KLQkvLyBUaGUgcHJvY2VzcyBjb25maWd1cmF0b3IgZm9yIGZpbHRlcmluZyBicmVha2Rvd24gZWxlbWVudHMgaW4gYQotCS8vIGNvbmZpZ3VyYXRpb24uCi0JcHJpdmF0ZSBQcm9jZXNzQ29uZmlndXJhdG9yIGJyZWFrZG93bkVsZW1lbnRGaWx0ZXI7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHdic0NvbnRlbnRQcm92aWRlcjsKLQotCS8vIE1hcCBwcm9jZXNzZXMgdG8gc3VwcHJlc3Npb24gb2JqZWN0cy4KLQlwcml2YXRlIE1hcCBzdXBwcmVzc2lvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvLyBUaGUgc3VwcHJlc3Npb24gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VsZWN0ZWQgcHJvY2VzcyB0byBiZQotCS8vIGV4cG9ydGVkLgotCXByaXZhdGUgU3VwcHJlc3Npb24gc3VwcHJlc3Npb247Ci0KLQkvLyBUaGUgV0JTIGVsZW1lbnQgcGF0aHMuCi0JcHJpdmF0ZSBTdGFjayBlbGVtZW50UGF0aHMgPSBuZXcgU3RhY2soKTsKLQotCXByaXZhdGUgT2JqZWN0IGN1cnJlbnRFbGVtZW50OwotCi0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudEVsZW1lbnRQYXRoOwotCi0JcHJpdmF0ZSBQcmVkZWNlc3Nvckxpc3QgY3VycmVudFByZWRMaXN0OwotCQotCXByaXZhdGUgSGFzaE1hcDxUYXNrLCBXb3JrQnJlYWtkb3duRWxlbWVudD4gdGFza1RvV2JlTWFwOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQWE1MU2VydmljZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHBvcnQgYSBwcm9jZXNzIHRvIGEgTWljcm9zb2Z0IFByb2plY3QgWE1MIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiAgICAgICAgICAgIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MKLQkgKiBAcGFyYW0gZXhwb3J0T3B0aW9ucwotCSAqICAgICAgICAgICAgYSBjb2xsZWN0aW9uIG9mIHVzZXIgc3BlY2lmaWVkIGV4cG9ydCBvcHRpb25zCi0JICogQHRocm93cyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwb3J0KFByb2Nlc3MgcHJvY2VzcywgRXhwb3J0TVNQT3B0aW9ucyBleHBvcnRPcHRpb25zKQotCQkJdGhyb3dzIEV4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24gewotCQlTdHJpbmcgbXNwcm9qZWN0TmFtZSA9IGV4cG9ydE9wdGlvbnMuZ2V0TVNQcm9qZWN0TmFtZSgpOwotCQlGaWxlIGV4cG9ydERpciA9IGV4cG9ydE9wdGlvbnMuZ2V0RXhwb3J0RGlyKCk7Ci0JCXB1Ymxpc2hDb250ZW50U2l0ZSA9IGV4cG9ydE9wdGlvbnMuZ2V0UHVibGlzaFdlYlNpdGUoKTsKLQkJUHVibGlzaE9wdGlvbnMgcHVibGlzaGluZ09wdGlvbnMgPSBleHBvcnRPcHRpb25zLmdldFB1Ymxpc2hpbmdPcHRpb25zKCk7Ci0JCXByb2Nlc3NDb25maWcgPSBleHBvcnRPcHRpb25zLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBleHBvcnRpbmcgdG8gTWljcm9zb2Z0IFByb2plY3QhIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHByb2Nlc3MgICAgICAgICAgPSAiICsgcHJvY2Vzcyk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGNvbmZpZ3VyYXRpb24gICAgPSAiICsgcHJvY2Vzc0NvbmZpZyk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIG1zcHJvamVjdE5hbWUgICAgPSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBtc3Byb2plY3ROYW1lKTsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIiQkJCB0YXJnZXREaXIgICAgICAgICAgICAgICAgID0gIiArIGV4cG9ydERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgPSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHB1Ymxpc2hDb25maWdPcHRpb25zICAgICAgPSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBwdWJsaXNoaW5nT3B0aW9ucyk7Ci0JCX0KLQotCQkvLyBjb25zdHJ1Y3QgdGhlIGV4cG9ydCB0YXJnZXQgeG1sIGZpbGUgcGF0aAotCQlpZiAoIWV4cG9ydERpci5leGlzdHMoKSkgewotCQkJZXhwb3J0RGlyLm1rZGlycygpOwotCQl9Ci0JCWFiVGFyZ2V0RGlyID0gZXhwb3J0RGlyLmdldEFic29sdXRlUGF0aCgpOwotCQlQYXRoIGV4cG9ydFBhdGggPSBuZXcgUGF0aChhYlRhcmdldERpcik7Ci0JCWJvb2xlYW4gZW5kV2l0aFhtbEV4dCA9IG1zcHJvamVjdE5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBleHBvcnRQYXRoU3RyID0gKGV4cG9ydFBhdGguYXBwZW5kKGVuZFdpdGhYbWxFeHQgPyBtc3Byb2plY3ROYW1lCi0JCQkJOiAobXNwcm9qZWN0TmFtZSArICIueG1sIikpKS50b09TU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGRlYnVnKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgZXhwb3J0UGF0aFN0ciAgICAgICAgICAgICAgICAgPSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBleHBvcnRQYXRoU3RyKTsKLQotCQkvLyBjb25zdHJ1Y3QgdGhlIGVtcHR5IE1TIHByb2plY3QgeG1sIHRlbXBsYXRlIGZpbGUgcGF0aAotCQlTdHJpbmcgZW1wdHlUZW1wbGF0ZUZpbGUgPSBFeHBvcnRNU1BQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldEluc3RhbGxQYXRoKCkKLQkJCQkrICJ0ZW1wbGF0ZSIgLy8kTk9OLU5MUy0xJAotCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyAibXNwcm9qZWN0XzIwMDNfdGVtcGxhdGUueG1sIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZGVidWcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBlbXB0eVRlbXBsYXRlRmlsZSAgICAgICAgICAgICA9ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIGVtcHR5VGVtcGxhdGVGaWxlKTsKLQotCQkvLyBjb3B5IHRoZSBlbXB0eSB0ZW1wbGF0ZSBNUyBwcm9qZWN0IHhtbCBmaWxlIHRvIHRoZSBleHBvcnQgdGFyZ2V0Ci0JCXRyeSB7Ci0JCQlGaWxlIHNyYyA9IG5ldyBGaWxlKGVtcHR5VGVtcGxhdGVGaWxlKTsKLQkJCUZpbGUgZHN0ID0gbmV3IEZpbGUoZXhwb3J0UGF0aFN0cik7Ci0JCQlGaWxlVXRpbC5jb3B5RmlsZShzcmMsIGRzdCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJVVJJIGZpbGVVUkkgPSBVUkkuY3JlYXRlRmlsZVVSSShleHBvcnRQYXRoU3RyKTsKLQotCQl0cnkgewotCi0JCQlYTUxSZXNvdXJjZSByZXMgPSBuZXcgTXNwcm9qZWN0UmVzb3VyY2VJbXBsKGZpbGVVUkkpOwotCQkJcmVzLmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dCgKLQkJCQkJWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQkJCXJlcy5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoCi0JCQkJCVhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0JCQlyZXMuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9TQ0hFTUFfTE9DQVRJT04sCi0JCQkJCUJvb2xlYW4uVFJVRSk7Ci0JCQlyZXMuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KAotCQkJCQlYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0VOQ09ERURfQVRUUklCVVRFX1NUWUxFLAotCQkJCQlCb29sZWFuLlRSVUUpOwotCQkJcmVzLmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dCgKLQkJCQkJWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9MRVhJQ0FMX0hBTkRMRVIsIEJvb2xlYW4uVFJVRSk7Ci0JCQlyZXMubG9hZChudWxsKTsKLQotCQkJRG9jdW1lbnRSb290IGRvY1Jvb3QgPSAoRG9jdW1lbnRSb290KSByZXMuZ2V0RU9iamVjdCgiLyIpOyAvLyROT04tTkxTLTEkCi0JCQlwcm9qZWN0ID0gKFByb2plY3QpIGRvY1Jvb3QuZ2V0UHJvamVjdCgpOwotCi0JCQl0YXNrVG9XYmVNYXAgPSBuZXcgSGFzaE1hcDxUYXNrLCBXb3JrQnJlYWtkb3duRWxlbWVudD4oKTsKLQkJCWlmICghIGdlbmVyYXRlTVNQcm9qZWN0KHByb2Nlc3MsIHByb2plY3QsIGV4cG9ydE9wdGlvbnMpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlyZXMuc2F2ZShudWxsKTsKLQotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnRNU1Byb2plY3QocHJvamVjdCk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBuZXcgRXhwb3J0TVNQRXhjZXB0aW9uKGUpOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogRXhwb3J0cyBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzIHRvIGEgTWljcm9zb2Z0IFByb2plY3QKLQkgKiBYTUwgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqICAgICAgICAgICAgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcwotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBhIE1pY3Jvc29mdCBQcm9qZWN0IG9iamVjdAotCSAqIEBwYXJhbSBleHBvcnRPcHRpb25zCi0JICogICAgICAgICAgICBhIGNvbGxlY3Rpb24gb2YgdXNlciBzcGVjaWZpZWQgZXhwb3J0IG9wdGlvbnMKLQkgKiBAdGhyb3dzIEV4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZW5lcmF0ZU1TUHJvamVjdChQcm9jZXNzIHByb2Nlc3MsIFByb2plY3QgcHJvamVjdCwKLQkJCUV4cG9ydE1TUE9wdGlvbnMgZXhwb3J0T3B0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9jZXNzID09IG51bGwgfHwgcHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBleHBvcnRPcHRpb25zLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJCS8vIEdldCB0aGUgZGVmYXVsdCBtZXRob2QgY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlCi0JCQkJLy8gcHJvY2Vzcy4KLQkJCQlpZiAocHJvY2VzcyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQljb25maWcgPSAoKERlbGl2ZXJ5UHJvY2VzcykgcHJvY2VzcykuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCQl9IGVsc2UgaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQljb25maWcgPSAoKENhcGFiaWxpdHlQYXR0ZXJuKSBwcm9jZXNzKS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIENyZWF0ZSB0aGUgc3ViIGZvbGRlciB0byBzdG9yZSB0aGUgcHVibGlzaGVkIEhUTUwgY29udGVudCBmaWxlcy4KLQkJCWNvbnRlbnRGb2xkZXJOYW1lID0gY29uZmlnLmdldE5hbWUoKTsKLQotCQkJUHVibGlzaE9wdGlvbnMgcHVibGlzaGluZ09wdGlvbnMgPSBleHBvcnRPcHRpb25zCi0JCQkJCS5nZXRQdWJsaXNoaW5nT3B0aW9ucygpOwotCQkJaWYgKHB1Ymxpc2hDb250ZW50U2l0ZSAmJiBwdWJsaXNoaW5nT3B0aW9ucyAhPSBudWxsKSB7Ci0JCQkJRmlsZSBjb250ZW50RGlyID0gbmV3IEZpbGUoZXhwb3J0T3B0aW9ucy5nZXRFeHBvcnREaXIoKSwKLQkJCQkJCWNvbnRlbnRGb2xkZXJOYW1lKTsKLQkJCQlpZiAoIWNvbnRlbnREaXIuZXhpc3RzKCkpIHsKLQkJCQkJY29udGVudERpci5ta2RpcnMoKTsKLQkJCQl9Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHZpZUJ1aWxkZXIgbWV0aG9kQ29uZmlnID0gIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBjb25maWcpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCB2aWVCdWlsZGVyIHB1Ymxpc2hDb25maWdPcHRpb25zID0gIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBwdWJsaXNoaW5nT3B0aW9ucyk7Ci0JCQkJfQotCi0JCQkJLy8gUHVibGlzaCB0aGUgYXNzb2NpYXRlZCBjb25maWd1cmF0aW9uLgotCQkJCWlmICghcHVibGlzaENvbmZpZ3VyYXRpb24oY29udGVudERpci5nZXRBYnNvbHV0ZVBhdGgoKSwgY29uZmlnLAotCQkJCQkJcHVibGlzaGluZ09wdGlvbnMpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgPSBleHBvcnRPcHRpb25zCi0JCQkJCS5nZXRFeHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzKCk7Ci0KLQkJCS8vIEdlbmVyYXRlIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBYTUwgZmlsZS4KLQkJCS8vIHBvcHVsYXRlIHRoZSBwcm9qZWN0J3MgYXR0cmlidXRlcwotCQkJcHJvamVjdC5zZXROYW1lKHByb2Nlc3MuZ2V0TmFtZSgpKTsKLQkJCXByb2plY3Quc2V0U3RhcnREYXRlKG5ldyBEYXRlKCkpOwotCQkJcHJvamVjdC5zZXRDcmVhdGlvbkRhdGUobmV3IERhdGUoKSk7Ci0JCQlwcm9qZWN0LnNldExhc3RTYXZlZChuZXcgRGF0ZSgpKTsKLQkJCXByb2plY3Quc2V0RmluaXNoRGF0ZShuZXcgRGF0ZSgpKTsKLQkJCQotCQkJc2V0UHJvamVjdEV4dGVuZGVkQXR0cmlidXRlcyhwcm9qZWN0KTsKLQotCQkJZ2VuZXJhdGVPcGVyYXRvblJ1bihwcm9jZXNzLCBwcm9qZWN0LCBjb25maWcpOwotCQkJCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVPcGVyYXRvblJ1bihQcm9jZXNzIHByb2Nlc3MsIFByb2plY3QgcHJvamVjdCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJZmluYWwgUHJvY2VzcyBmcHJvY2VzcyA9IHByb2Nlc3M7Ci0JCWZpbmFsIFByb2plY3QgZnByb2plY3QgPSBwcm9qZWN0OwotCQlmaW5hbCBNZXRob2RDb25maWd1cmF0aW9uIGZjb25maWcgPSBjb25maWc7Ci0JCQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKEV4cG9ydE1TUFJlc291cmNlcy5leHBvcnRNU1BXaXphcmRfdGl0bGUsCi0JCQkJCQkJSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQotCQkJCQlnZW5lcmF0ZShmcHJvY2VzcywgZnByb2plY3QsIGZjb25maWcpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIHBtRGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpKTsKLQkJcG1EaWFsb2cucnVuKHRydWUsIGZhbHNlLCBvcCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlKFByb2Nlc3MgcHJvY2VzcywgUHJvamVjdCBwcm9qZWN0LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHRocm93cyBFeGNlcHRpb24gewotCQlnZW5lcmF0ZVByb2plY3RSZXNvdXJjZXMocHJvY2VzcywgY29uZmlnLCBwcm9qZWN0KTsKLQkJZ2VuZXJhdGVQcm9qZWN0VGFza3MocHJvY2VzcywgY29uZmlnLCBwcm9qZWN0KTsKLQkJZ2VuZXJhdGVMaW5rcyhwcm9jZXNzLCBwcm9qZWN0KTsKLQkJZ2VuZXJhdGVXUERzKGNvbmZpZyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXhwb3J0IG9wdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGV4cG9ydE9wdGlvbnMKLQkgKiAgICAgICAgICAgIGEgY29sbGVjdGlvbiBvZiB1c2VyIHNwZWNpZmllZCBleHBvcnQgb3B0aW9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEV4cG9ydE9wdGlvbnMoRXhwb3J0T3B0aW9ucyBleHBvcnRPcHRpb25zKSB7Ci0JCUJvb2xlYW4gZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cyA9IChCb29sZWFuKSBleHBvcnRPcHRpb25zCi0JCQkJLmdldChFeHBvcnRPcHRpb25zLkVYUE9SVF9PTkxZX1BMQU5ORURfRUxFTUVOVFMpOwotCQl0aGlzLmV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgPSBleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgcHJvamVjdCByZXNvdXJjZXMgZm9yIGFsbCB0aGUgdGFzayBkZXNjcmlwdG9ycyBpbiB0aGUKLQkgKiBwcm9jZXNzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICogICAgICAgICAgICBhIHByb2Nlc3MKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHVzZWQgdG8gZmlsdGVyIHRoZSB3b3JrIGJyZWFrZG93bgotCSAqICAgICAgICAgICAgZWxlbWVudHMgaW4gdGhlIHByb2Nlc3MKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgYW4gb2JqZWN0IHRvIHN0b3JlIHRoZSBnZW5lcmF0ZWQgTWljcm9zb2Z0IFByb2plY3QgV0JTCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZ2VuZXJhdGluZyB0aGUgTWljcm9zb2Z0IFByb2plY3QgV0JTCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVQcm9qZWN0UmVzb3VyY2VzKFByb2Nlc3MgcHJvY2VzcywKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQcm9qZWN0IHByb2plY3QpIHRocm93cyBFeGNlcHRpb24gewotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVRCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJLnNldEZpbHRlcihuZXcgUHJvY2Vzc0NvbmZpZ3VyYXRvcihjb25maWcpKTsKLQkJCX0KLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCi0JCQlMaXN0IGVsZW1lbnRzID0gcHJvY2Vzcy5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJaWYgKGVsZW1lbnRzLnNpemUoKSA+IDApIHsKLQkJCQlnZW5lcmF0ZVByb2plY3RSZXNvdXJjZShjb250ZW50UHJvdmlkZXIsCi0JCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgcHJvY2VzcywgcHJvamVjdCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIHRoZSBwcm9qZWN0IHJlc291cmNlcyBmb3IgYWxsIHRoZSByb2xlIGRlc2NyaXB0b3JzIGluIHRoZQotCSAqIHByb2Nlc3MuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVQcm9qZWN0UmVzb3VyY2UoCi0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0JCQlCcmVha2Rvd25FbGVtZW50IGJyZWFrZG93bkVsZW1lbnQsIFByb2plY3QgcHJvamVjdCkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlpZiAoYnJlYWtkb3duRWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgotCQkJCXx8IGJyZWFrZG93bkVsZW1lbnQuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpCi0JCQkJfHwgKGV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgJiYgIWJyZWFrZG93bkVsZW1lbnQKLQkJCQkJCS5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKSkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChicmVha2Rvd25FbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCWFkZFJlc291cmNlKGJyZWFrZG93bkVsZW1lbnQsIHByb2plY3QpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBlbGVtZW50cyA9IGNvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhicmVha2Rvd25FbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciBwcm92aWRlciA9IChSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQ7Ci0JCQkJCU9iamVjdCB2YWx1ZSA9IHByb3ZpZGVyLmdldFZhbHVlKCk7Ci0JCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCQlhZGRSZXNvdXJjZSgoQnJlYWtkb3duRWxlbWVudCkgdmFsdWUsIHByb2plY3QpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJYWRkUmVzb3VyY2UoKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQsIHByb2plY3QpOwotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50OwotCQkJCQlPYmplY3QgdmFsdWUgPSBwcm92aWRlci5nZXRWYWx1ZSgpOwotCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJZ2VuZXJhdGVQcm9qZWN0UmVzb3VyY2UoY29udGVudFByb3ZpZGVyLAotCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIHZhbHVlLCBwcm9qZWN0KTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCWdlbmVyYXRlUHJvamVjdFJlc291cmNlKGNvbnRlbnRQcm92aWRlciwKLQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQsIHByb2plY3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JLy8gZm9yIGVhY2ggUm9sZURlc2NyaXB0b3IsIGNyZWF0ZSBhIE1TIFByb2plY3QgcmVzb3VyY2UKLQkvLyBmb3IgdGhlIFJvbGVEZXNjcmlwdG9yIGFuZCBpdHMgdW5kZXJseWluZyByb2xlLCByZW1lbWJlciB0aGUgYXNzaWduZWQKLQkvLyByZXNfdWlkCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2UoQnJlYWtkb3duRWxlbWVudCBicmVha2Rvd25FbGVtZW50LCBQcm9qZWN0IHByb2opCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKCEoYnJlYWtkb3duRWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gY2hlY2sgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgdW5kZXJseWluZyByb2xlIG9mIHRoaXMgcm9sZURlc2NyaXB0b3IKLQkJLy8gYW5kIHNraXAgdGhlIGNyZWF0aW9uIGlmIGEgcmVzb3VyY2UgZm9yIHRoZSByb2xlIGFscmVhZHkgZXhpc3RzCi0JCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yID0gKFJvbGVEZXNjcmlwdG9yKSBicmVha2Rvd25FbGVtZW50OwotCQlpZiAoZGVidWcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBoYW5kbGUgUm9sZURlc2NyaXB0b3IgPSAiICsgcm9sZURlc2NyaXB0b3IpOyAvLyROT04tTkxTLTEkCi0JCVJvbGUgcmVmX2VkUm9sZSA9IHJvbGVEZXNjcmlwdG9yLmdldFJvbGUoKTsKLQkJaWYgKGRlYnVnKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgaGFuZGxlIFJlZi1lZCBSb2xlID0gIiArIHJlZl9lZFJvbGUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gY2hlY2sgdGhlIG5lZWQgdG8gYWRkIGEgbmV3IHJlc291cmNlIGJhc2VkIG9uIFJvbGVEZXNjcmlwdG9yJ3MgZGlzcGx5Ci0JCS8vIG5hbWUKLQkJYm9vbGVhbiBuZXdSRFJlc291cmNlID0gdHJ1ZTsKLQkJU3RyaW5nIHJkUmVzb3VyY2VOYW1lID0gZ2V0RGlzcGxheU5hbWUocm9sZURlc2NyaXB0b3IpOwotCQlpZiAocm9sZXNUb1VpZE1hcC5nZXQocmRSZXNvdXJjZU5hbWUpICE9IG51bGwpIHsKLQkJCW5ld1JEUmVzb3VyY2UgPSBmYWxzZTsKLQkJfQotCi0JCS8vIGNoZWNrIHRoZSBuZWVkIHRvIGFkZCBhIG5ldyByZXNvdXJjZSBiYXNlZCBvbiBhc3NvY2lhdGVkIHJvbGUncwotCQkvLyBkaXNwbHkgbmFtZQotCQlib29sZWFuIG5ld1JvbGVSZW91cmNlID0gZmFsc2U7Ci0JCVN0cmluZyByb2xlUmVzb3VyY2VOYW1lID0gbnVsbDsKLQkJaWYgKHJlZl9lZFJvbGUgIT0gbnVsbAotCQkJCSYmIHJvbGVzVG9VaWRNYXAKLQkJCQkJCS5nZXQoKHJvbGVSZXNvdXJjZU5hbWUgPSBnZXREaXNwbGF5TmFtZShyZWZfZWRSb2xlKSkpID09IG51bGwKLQkJCQkmJiAhcm9sZVJlc291cmNlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKHJkUmVzb3VyY2VOYW1lKSkgewotCQkJbmV3Um9sZVJlb3VyY2UgPSB0cnVlOwotCQl9Ci0KLQkJLy8gY3JlYXRlIGEgcmVzb3VyY2UgZm9yIHRoZSBSb2xlRGVzY3JpcHRvcgotCQlpZiAobmV3UkRSZXNvdXJjZSkgewotCQkJUmVzb3VyY2UgYVJlcyA9IHByb2plY3RGYWN0b3J5LmNyZWF0ZVJlc291cmNlKCk7Ci0KLQkJCWFSZXMuc2V0VUlEKEJpZ0ludGVnZXIudmFsdWVPZihyZXNfdWlkKSk7Ci0JCQlhUmVzLnNldElEKEJpZ0ludGVnZXIudmFsdWVPZihyZXNfdWlkKSk7Ci0JCQlhUmVzLnNldE5hbWUocmRSZXNvdXJjZU5hbWUpOwotCQkJcHJvai5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZSgpLmFkZChhUmVzKTsKLQotCQkJcm9sZXNUb1VpZE1hcC5wdXQocmRSZXNvdXJjZU5hbWUsIEJpZ0ludGVnZXIudmFsdWVPZihyZXNfdWlkKSk7Ci0JCQlyZXNfdWlkKys7Ci0JCX0KLQotCQkvLyBjcmVhdGUgYSByZXNvdXJjZSBmb3IgdGhlIHVuZGVybHlpbmcgYXNzb2NpYXRlZCByb2xlIHRvbwotCQlpZiAobmV3Um9sZVJlb3VyY2UpIHsKLQkJCVJlc291cmNlIGFSZXMgPSBwcm9qZWN0RmFjdG9yeS5jcmVhdGVSZXNvdXJjZSgpOwotCi0JCQlhUmVzLnNldFVJRChCaWdJbnRlZ2VyLnZhbHVlT2YocmVzX3VpZCkpOwotCQkJYVJlcy5zZXRJRChCaWdJbnRlZ2VyLnZhbHVlT2YocmVzX3VpZCkpOwotCQkJYVJlcy5zZXROYW1lKHJvbGVSZXNvdXJjZU5hbWUpOwotCQkJcHJvai5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZSgpLmFkZChhUmVzKTsKLQotCQkJcm9sZXNUb1VpZE1hcC5wdXQocm9sZVJlc291cmNlTmFtZSwgQmlnSW50ZWdlci52YWx1ZU9mKHJlc191aWQpKTsKLQkJCXJlc191aWQrKzsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgTVMgUHJvamVjdCBXQlMgZm9yIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5Ci0JICogcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqICAgICAgICAgICAgYSBwcm9jZXNzCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiB1c2VkIHRvIGZpbHRlciB0aGUgd29yayBicmVha2Rvd24KLQkgKiAgICAgICAgICAgIGVsZW1lbnRzIGluIHRoZSBwcm9jZXNzCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIGFuIG9iamVjdCB0byBzdG9yZSB0aGUgZ2VuZXJhdGVkIE1pY3Jvc29mdCBQcm9qZWN0IFdCUwotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGdlbmVyYXRpbmcgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFdCUwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlUHJvamVjdFRhc2tzKFByb2Nlc3MgcHJvY2VzcywKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQcm9qZWN0IHByb2plY3QpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBTYXZlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGV4cG9ydGVkIHByb2Nlc3MuCi0JCXRoaXMucHJvY2VzcyA9IHByb2Nlc3M7Ci0KLQkJd2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQl0cnkgewotCQkJLy8gQWRkIHRoZSBzdXBwcmVzc2lvbiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzIHRvIGJlCi0JCQkvLyBleHBvcnRlZAotCQkJLy8gdG8gdGhlIHN1cHByZXNzaW9uIG1hcC4KLQkJCXN1cHByZXNzaW9uID0gbmV3IFN1cHByZXNzaW9uKHByb2Nlc3MpOwotCQkJc3VwcHJlc3Npb25NYXAucHV0KHByb2Nlc3MsIHN1cHByZXNzaW9uKTsKLQotCQkJd2JzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVdCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCWJyZWFrZG93bkVsZW1lbnRGaWx0ZXIgPSBuZXcgUHJvY2Vzc0NvbmZpZ3VyYXRvcihjb25maWcpOwotCQkJd2JzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKGJyZWFrZG93bkVsZW1lbnRGaWx0ZXIpOwotCi0JCQl3YnNDb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCXdic0FkYXB0ZXJGYWN0b3J5KTsKLQotCQkJLy8gdGVzdAotCQkJLy8gZW51bWVyYXRlUHJvY2Vzc1ByZWRlY2Vzc29yTGlzdHMoKTsKLQotCQkJY3VycmVudEVsZW1lbnQgPSBwcm9jZXNzOwotCQkJaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCWdlbmVyYXRlUHJvamVjdFRhc2sod2JzQ29udGVudFByb3ZpZGVyLAotCQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIHByb2Nlc3MsIDEsIHByb2plY3QpOwotCQkJfSBlbHNlIHsKLQkJCQlMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gcHJvY2Vzcy5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJCWlmIChicmVha2Rvd25FbGVtZW50cy5zaXplKCkgPiAwKSB7Ci0JCQkJCWdlbmVyYXRlUHJvamVjdFRhc2sod2JzQ29udGVudFByb3ZpZGVyLAotCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSBwcm9jZXNzLCAxLCBwcm9qZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh3YnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJd2JzQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJfQotCQkJaWYgKHN1cHByZXNzaW9uTWFwICE9IG51bGwpIHsKLQkJCQlzdXBwcmVzc2lvbk1hcC5jbGVhcigpOwotCQkJCXN1cHByZXNzaW9uTWFwID0gbnVsbDsKLQkJCX0KLQkJCWlmICh3YnNDb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCXdic0NvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW51bWVyYXRlUHJvY2Vzc1ByZWRlY2Vzc29yTGlzdHMoKSB7Ci0JCS8vIFdCUyB0cmVlCi0JCUl0ZXJhdG9yIHdic1RyZWVJdGVyYXRvciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcigKLQkJCQl3YnNBZGFwdGVyRmFjdG9yeSwgcHJvY2Vzcyk7Ci0JCU9iamVjdCBvYmo7Ci0JCXdoaWxlICh3YnNUcmVlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlvYmogPSB3YnNUcmVlSXRlcmF0b3IubmV4dCgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJ0cmVlSXRlcmF0b3I6ICIgKyBvYmopOyAvLyROT04tTkxTLTEkCi0JCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIHdic0FkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlQcmVkZWNlc3Nvckxpc3QgcHJlZExpc3QgPSBhZGFwdGVyLmdldFByZWRlY2Vzc29ycygpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJlZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUJTSXRlbVByb3ZpZGVyIGUgPSAoSUJTSXRlbVByb3ZpZGVyKSBpdGVyLm5leHQoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBwcmVkTGlzdDogIiArIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGUgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIHVud3JhcHBlZFByZWRMaXN0OiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgZSkuZ2V0VGFyZ2V0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgTWljcm9zZnQgUHJvamVjdCB0YXNrIGZvciBhIGJyZWFrZG93biBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50UHJvdmlkZXIKLQkgKiAgICAgICAgICAgIGEgY29udGVudCBwcm92aWRlcgotCSAqIEBwYXJhbSBicmVha2Rvd25FbGVtZW50Ci0JICogICAgICAgICAgICBhIGJyZWFrZG93biBlbGVtZW50Ci0JICogQHBhcmFtIHN0ckJ1ZgotCSAqICAgICAgICAgICAgYSA8Y29kZT5TdHJpbmdCdWZmZXI8L2NvZGU+IHRvIHN0b3JlIHRoZSBnZW5lcmF0ZWQgWE1MCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVQcm9qZWN0VGFzaygKLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciwKLQkJCU9iamVjdCBlbGVtZW50T3JXcmFwcGVyLCBpbnQgdGFza09MZXZlbCwgUHJvamVjdCBwcm9qKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJV29ya0JyZWFrZG93bkVsZW1lbnQgYnJlYWtkb3duRWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbAotCQkJCS51bndyYXAoZWxlbWVudE9yV3JhcHBlcik7Ci0KLQkJLy8gbm90IHJlYWxseSBuZWNjZXNzYXJ5IGhlcmUKLQkJaWYgKGJyZWFrZG93bkVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkJCQl8fCBicmVha2Rvd25FbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IKLQkJCQl8fCBicmVha2Rvd25FbGVtZW50LmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKQotCQkJCXx8IChleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzICYmICFicmVha2Rvd25FbGVtZW50Ci0JCQkJCQkuZ2V0SXNQbGFubmVkKCkuYm9vbGVhblZhbHVlKCkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlib29sZWFuIGlzU3ViVGFza3NQbGFubmVkID0gZmFsc2U7Ci0JCWlmIChleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzICYmIGJyZWFrZG93bkVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCSYmIGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBlbGVtZW50cyA9IGNvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhlbGVtZW50T3JXcmFwcGVyKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQkJfHwgKChBY3Rpdml0eSkgZWxlbWVudCkuZ2V0SXNQbGFubmVkKCkKLQkJCQkJCQkJCS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJaXNTdWJUYXNrc1BsYW5uZWQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJT2JqZWN0IHdyYXBwZWRFbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQkJCWlmICh3cmFwcGVkRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlpZiAoIWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMKLQkJCQkJCQkJfHwgKChBY3Rpdml0eSkgd3JhcHBlZEVsZW1lbnQpLmdldElzUGxhbm5lZCgpCi0JCQkJCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkJaXNTdWJUYXNrc1BsYW5uZWQgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJVGFza0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQkJfHwgZGVzY3JpcHRvci5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJaXNTdWJUYXNrc1BsYW5uZWQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJT2JqZWN0IHdyYXBwZWRFbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQkJCWlmICh3cmFwcGVkRWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCQlUYXNrRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSB3cmFwcGVkRWxlbWVudDsKLQkJCQkJCWlmICghZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cwotCQkJCQkJCQl8fCBkZXNjcmlwdG9yLmdldElzUGxhbm5lZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkJaXNTdWJUYXNrc1BsYW5uZWQgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gY3JlYXRlIGEgdGFzayBmb3IgdGhlIFdvcmtCcmVha2Rvd25FbGVtZW50Ci0JCS8vIGRlY2lkZWQganVzdCB0byBjaGVjayB0aGUgaXNQbGFubmVkIGZsYWcgb24gdGhlIFdCUwotCQlib29sZWFuIGlzUGxhbm5lZFRhc2sgPSBicmVha2Rvd25FbGVtZW50LmdldElzUGxhbm5lZCgpLmJvb2xlYW5WYWx1ZSgpOwotCQlUYXNrIG5ld1Rhc2sgPSBudWxsOwotCQlpZiAoIWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgfHwgZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cwotCQkJCSYmIGlzUGxhbm5lZFRhc2spIHsKLQkJCWJvb2xlYW4gc3VwcHJlc3NlZCA9IGlzU3VwcHJlc3NlZChicmVha2Rvd25FbGVtZW50KTsKLQkJCWlmICghc3VwcHJlc3NlZCkgewotCQkJCW5ld1Rhc2sgPSBhZGRUYXNrKGVsZW1lbnRPcldyYXBwZXIsIHRhc2tPTGV2ZWwsIHByb2opOwotCQkJfQotCQl9Ci0KLQkJLy8gaWYgZXhwb3J0IHBsYW5uZWQgb25seSB3YnMsIHRoZW4gd2UgbmVlZCB0byBkbyB0aGUgcm9sZSByb2xsdXAKLQkJLy8gY2FsY3VsYXRpb24KLQkJaWYgKGV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgJiYgbmV3VGFzayAhPSBudWxsCi0JCQkJJiYgYnJlYWtkb3duRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJJiYgY29udGVudFByb3ZpZGVyICE9IG51bGwgJiYgIWlzU3ViVGFza3NQbGFubmVkKSB7Ci0JCQlBcnJheUxpc3Qgcm9sbHVwUm9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlib29sZWFuIHJiID0gY2FsY3VsYXRlUm9sbHVwUm9sZXMoY29udGVudFByb3ZpZGVyLAotCQkJCQlicmVha2Rvd25FbGVtZW50LCByb2xsdXBSb2xlcyk7Ci0JCQkvLyBpZiB0aGUgd2hvbGUgc3VidHJlZSBvZiB0aGUgYnJlYWtkb3duRWxlbW50IGlzIG5vdCBwbGFubmVkCi0JCQkvLyB0aGVuIHJvbGwgdXAgYWxsIHRoZSByb2xlcwotCQkJaWYgKCFyYikgewotCQkJCUhhc2hTZXQgcm9sZXNTZXQgPSBuZXcgSGFzaFNldChyb2xsdXBSb2xlcyk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcm9sZXNTZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVN0cmluZyByb2xlTmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQlhZGRBc3NpZ25tZW50KHJvbGVOYW1lLCBuZXdUYXNrLmdldFVJRCgpLmludFZhbHVlKCksIHByb2opOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGV4cG9ydCB0aGUgbmV4dCBsZXZlbCB3YnMKLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHN1cHByZXNzZWQgPSBpc1N1cHByZXNzZWQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAoIXN1cHByZXNzZWQpIHsKLQkJCQllbGVtZW50UGF0aHMucHVzaChicmVha2Rvd25FbGVtZW50LmdldEd1aWQoKSk7Ci0JCQkJT2JqZWN0W10gZWxlbWVudHMgPSBjb250ZW50UHJvdmlkZXIKLQkJCQkJCS5nZXRFbGVtZW50cyhlbGVtZW50T3JXcmFwcGVyKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0KLQkJCQkJLy8gZ2V0IHRoZSBjdXJyZW50IGVsZW1lbnRPcldyYXBwZXIgYW5kIHRoZSBoaWVyYXJjYWwgZ3VpZAotCQkJCQkvLyBwYXRoIHRvIGl0Ci0JCQkJCWN1cnJlbnRFbGVtZW50ID0gZWxlbWVudDsKLQkJCQkJU3RyaW5nW10gcGF0aHMgPSBuZXcgU3RyaW5nW2VsZW1lbnRQYXRocy5zaXplKCldOwotCQkJCQllbGVtZW50UGF0aHMudG9BcnJheShwYXRocyk7Ci0JCQkJCVN0cmluZ0J1ZmZlciBwYXRoU3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHBhdGhzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlwYXRoU3RyLmFwcGVuZChwYXRoc1tqXSArICIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlpZiAoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJT2JqZWN0IHdyYXBwZWQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCQkJCXBhdGhTdHIuYXBwZW5kKCgoQnJlYWtkb3duRWxlbWVudCkgd3JhcHBlZCkuZ2V0R3VpZCgpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXBhdGhTdHIuYXBwZW5kKCgoQnJlYWtkb3duRWxlbWVudCkgY3VycmVudEVsZW1lbnQpCi0JCQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJCQl9Ci0JCQkJCWN1cnJlbnRFbGVtZW50UGF0aCA9IHBhdGhTdHIudG9TdHJpbmcoKTsKLQkJCQkJLy8gaWYgKGRlYnVnKSBTeXN0ZW0ub3V0LnByaW50bG4oIiBwYXRoOiAiICsKLQkJCQkJLy8gY3VycmVudEVsZW1lbnRQYXRoKTsKLQotCQkJCQlnZW5lcmF0ZVByb2plY3RUYXNrKGNvbnRlbnRQcm92aWRlciwgZWxlbWVudCwKLQkJCQkJCQl0YXNrT0xldmVsICsgMSwgcHJvaik7Ci0JCQkJfQotCQkJCWdlbmVyYXRlTGlua3MocHJvY2VzcywgcHJvaik7Ci0JCQkJZWxlbWVudFBhdGhzLnBvcCgpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgc3VwcHJlc3NlZCB3b3JrIGJyZWFrZG93biBlbGVtZW50IGluCi0JICogaXRzIG93bmluZyBwcm9jZXNzLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIGFuIG9iamVjdAotCSAqIEByZXR1cm4gPG9jZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBhIHN1cHByZXNzZWQgd29yayBicmVha2Rvd24KLQkgKiAgICAgICAgIGVsZW1lbnQgaW4gaXRzIG93bmluZyBwcm9jZXNzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3VwcHJlc3NlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQlpZiAoZGVidWcpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRGVzY3JpcHRvciA9ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgKChEZXNjcmlwdG9yKSBvYmplY3QpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlQcm9jZXNzIG93bmluZ1Byb2Nlc3MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Mob2JqZWN0KTsKLQkJCVN1cHByZXNzaW9uIG93bmluZ1Byb2Nlc3NTdXBwcmVzc2lvbiA9IChTdXBwcmVzc2lvbikgc3VwcHJlc3Npb25NYXAKLQkJCQkJLmdldChvd25pbmdQcm9jZXNzKTsKLQkJCWlmIChvd25pbmdQcm9jZXNzU3VwcHJlc3Npb24gPT0gbnVsbCkgewotCQkJCW93bmluZ1Byb2Nlc3NTdXBwcmVzc2lvbiA9IG5ldyBTdXBwcmVzc2lvbihvd25pbmdQcm9jZXNzKTsKLQkJCQlzdXBwcmVzc2lvbk1hcC5wdXQob3duaW5nUHJvY2Vzcywgb3duaW5nUHJvY2Vzc1N1cHByZXNzaW9uKTsKLQkJCX0KLQkJCWlmIChvd25pbmdQcm9jZXNzU3VwcHJlc3Npb24uaXNTdXBwcmVzc2VkKG9iamVjdCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChvd25pbmdQcm9jZXNzICE9IHByb2Nlc3MKLQkJCQkJJiYgb2JqZWN0IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQllbGVtZW50UGF0aHMucHVzaCgoKFdvcmtCcmVha2Rvd25FbGVtZW50KSBvYmplY3QpLmdldEd1aWQoKSk7Ci0JCQkJU3RyaW5nW10gcGF0aHMgPSBuZXcgU3RyaW5nW2VsZW1lbnRQYXRocy5zaXplKCldOwotCQkJCWVsZW1lbnRQYXRocy50b0FycmF5KHBhdGhzKTsKLQkJCQlPYmplY3Qgd3JhcHBlciA9IHN1cHByZXNzaW9uLmdldE9iamVjdEJ5UGF0aChwYXRocywKLQkJCQkJCXdic0FkYXB0ZXJGYWN0b3J5KTsKLQkJCQllbGVtZW50UGF0aHMucG9wKCk7Ci0JCQkJcmV0dXJuIHN1cHByZXNzaW9uLmlzU3VwcHJlc3NlZCh3cmFwcGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHRhc2sgdG8gYSBNaWNyb3NvZnQgUHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JICogQHBhcmFtIHRhc2tPTGV2ZWwKLQkgKiAgICAgICAgICAgIHRoZSBvdXRsaW5lIGxldmVsCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIGEgTWljcm9zb2Z0IFByb2plY3Qgb2JqZWN0Ci0JICogQHJldHVybiB0aGUgbmV3bHkgYWRkZWQgdGFzawotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJycyB3aGlsZSBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgVGFzayBhZGRUYXNrKE9iamVjdCBlbGVtZW50T3JXcmFwcGVyLCBpbnQgdGFza09MZXZlbCwKLQkJCVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhc2sgdGFzayA9IGFkZFRhc2tfKGVsZW1lbnRPcldyYXBwZXIsIHRhc2tPTGV2ZWwsIHByb2plY3QpOwotCQlpZiAodGFzayAhPSBudWxsKSB7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsCi0JCQkJLnVud3JhcChlbGVtZW50T3JXcmFwcGVyKTsKLQkJCXRhc2tUb1diZU1hcC5wdXQodGFzaywgZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIHRhc2s7Ci0JfQotCQotCXByaXZhdGUgVGFzayBhZGRUYXNrXyhPYmplY3QgZWxlbWVudE9yV3JhcHBlciwgaW50IHRhc2tPTGV2ZWwsCi0JCQlQcm9qZWN0IHByb2plY3QpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWlmIChlbGVtZW50T3JXcmFwcGVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbAotCQkJCS51bndyYXAoZWxlbWVudE9yV3JhcHBlcik7Ci0JCQotCQlUYXNrIHRhc2sgPSBwcm9qZWN0RmFjdG9yeS5jcmVhdGVUYXNrKCk7Ci0JCXRhc2suc2V0TmFtZShnZXREaXNwbGF5TmFtZShlbGVtZW50KSk7Ci0JCXRhc2suc2V0T3V0bGluZUxldmVsKEJpZ0ludGVnZXIudmFsdWVPZih0YXNrT0xldmVsKSk7Ci0JCXRhc2suc2V0VUlEKEJpZ0ludGVnZXIudmFsdWVPZih0YXNrX3VpZCkpOwotCQl0YXNrLnNldElEKEJpZ0ludGVnZXIudmFsdWVPZih0YXNrX3VpZCkpOwotCQl0YXNrLnNldFR5cGUoQmlnSW50ZWdlci52YWx1ZU9mKDApKTsKLQotCQlHcmVnb3JpYW5DYWxlbmRhciBnY0RhdGUgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKLQkJLy8gZ2NEYXRlLmFkZChHcmVnb3JpYW5DYWxlbmRhci5EQVRFLCA4MCk7Ci0JCURhdGUgc3RhcnREYXRlID0gZ2NEYXRlLmdldFRpbWUoKTsKLQkJdGFzay5zZXRTdGFydChzdGFydERhdGUpOwotCQkvLyB0YXNrLnNldER1cmF0aW9uKCJQVDIwSDBNMFMiKTsKLQotCQlTdHJpbmcgbm90ZXMgPSBnZXRCcmllZkRlc2NyaXB0aW9uKGVsZW1lbnQpOwotCQlpZiAobm90ZXMgIT0gbnVsbCAmJiBub3Rlcy50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0YXNrLnNldE5vdGVzKG5vdGVzKTsKLQkJfQotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQl0YXNrLnNldE1pbGVzdG9uZSh0cnVlKTsKLQkJCXRhc2suc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlci52YWx1ZU9mKDcpKTsKLQkJfQotCi0JCS8vIEFzc2lnbiB0aGUgdGFzayB0byBhbGwgdGhlIGFzc29jaWF0ZWQgcm9sZXMuCi0JCUxpc3Qgcm9sZXNMaXN0ID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJcm9sZXNMaXN0ID0gZ2V0Um9sZXNGb3JUYXNrRCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2spIHsKLQkJCXJvbGVzTGlzdCA9IGdldFJvbGVzRm9yVGFzaygob3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrKSBlbGVtZW50KTsKLQkJfQotCQlpZiAocm9sZXNMaXN0ICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJvbGVzTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgcm9sZU5hbWUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQlhZGRBc3NpZ25tZW50KHJvbGVOYW1lLCB0YXNrX3VpZCwgcHJvamVjdCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBBZGQgdGhlIGdlbmVyYXRlZCBVUkwgbGluayB0byB0aGUgdGFzay4KLQkJaWYgKHB1Ymxpc2hDb250ZW50U2l0ZSkgewotCQkJU3RyaW5nIGxpbmtVUkwgPSBnZXRFbGVtZW50VVJMKGVsZW1lbnQpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayByZWZfZWRUYXNrID0gdGFza0Rlc2NyaXB0b3IuZ2V0VGFzaygpOwotCQkJCXJlZmVyZW5jZWRUYXNrcy5hZGQocmVmX2VkVGFzayk7Ci0JCQl9Ci0JCQl0YXNrLnNldEh5cGVybGlua0FkZHJlc3MobGlua1VSTCk7Ci0JCX0KLQotCQkvLyBhVGFzay5zZXRUeXBlKG5ldyBCaWdJbnRlZ2VyKCIxIikpOwotCQkvLyBhVGFzay5zZXRTdGFydChuZXcgRGF0ZSgpKTsKLQkJLy8gYVRhc2suc2V0U3VtbWFyeShmYWxzZSk7Ci0JCS8vIGFUYXNrLnNldENvbnN0cmFpbnRUeXBlKG5ldyBCaWdJbnRlZ2VyKCIyIikpOwotCi0JCS8vIEFkZCB0aGUgdGFzayB0byB0aGUgTWljcm9zb2Z0IFByb2plY3Qgb2JqZWN0LgotCQlwcm9qZWN0LmdldFRhc2tzKCkuZ2V0VGFzaygpLmFkZCh0YXNrKTsKLQotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHRoZUN1cnJlbnQgZWxlbWVudDogdGFza1VpZD0iICsgdGFza191aWQgLy8kTk9OLU5MUy0xJAotCQkJCQkrICIsICIgKyBjdXJyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICAgICAgICAgICAgcGF0aDogIiArIGN1cnJlbnRFbGVtZW50UGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIFN0b3JlIHRoZSB0YXNrJ3MgbG9jYWwgcHJlZGVjZXNzb3JzLgotCQlzdG9yZVRhc2tQcmVkZWNlc3NvcnMoZWxlbWVudCk7Ci0KLQkJdGFza1VpZFRvV2JzV2FwcGVyUGF0aE1hcC5wdXQoQmlnSW50ZWdlci52YWx1ZU9mKHRhc2tfdWlkKSwKLQkJCQljdXJyZW50RWxlbWVudFBhdGgpOwotCQl3YnNHdWlkVG9UYXNrVWlkTWFwCi0JCQkJLnB1dChlbGVtZW50LmdldEd1aWQoKSwgQmlnSW50ZWdlci52YWx1ZU9mKHRhc2tfdWlkKSk7Ci0KLQkJLy8gZ2V0IHByZWRlY2Vzc29ycyBvZiBhIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQKLQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSB3YnNBZGFwdGVyRmFjdG9yeS5hZGFwdCgKLQkJCQllbGVtZW50T3JXcmFwcGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlQcmVkZWNlc3Nvckxpc3QgY3VycmVudFByZWRMaXN0ID0gYWRhcHRlci5nZXRQcmVkZWNlc3NvcnMoKTsKLQkJTGlzdDxNZXRob2RFbGVtZW50PiBndWlkUHJlZExpc3QgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZEVsZW1lbnQ+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGN1cnJlbnRQcmVkTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZGVidWcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgd3JhcHBlclByZWRMaXN0TWVtYmVyOiAiICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCU9iamVjdCB1bndyYXBwZWRFID0gVG5nVXRpbC51bndyYXAoZSk7Ci0JCQlpZiAodW53cmFwcGVkRSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJLy9ndWlkUHJlZExpc3QuYWRkKCgoV29ya0JyZWFrZG93bkVsZW1lbnQpIHVud3JhcHBlZEUpLmdldEd1aWQoKSk7Ci0JCQkJZ3VpZFByZWRMaXN0LmFkZCgoV29ya0JyZWFrZG93bkVsZW1lbnQpIHVud3JhcHBlZEUpOwotCQkJCWlmIChkZWJ1ZykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgdW53cmFwcGVkUHJlZExpc3RNZW1iZXI6ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgdW53cmFwcGVkRSk7Ci0JCQl9Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQl1bndyYXBwZWRFID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBlKS5nZXRUYXJnZXQoKTsKLQkJCQkvL2d1aWRQcmVkTGlzdC5hZGQoKChCcmVha2Rvd25FbGVtZW50KSB1bndyYXBwZWRFKS5nZXRHdWlkKCkpOwotCQkJCWd1aWRQcmVkTGlzdC5hZGQoKEJyZWFrZG93bkVsZW1lbnQpIHVud3JhcHBlZEUpOwotCQkJCWlmIChkZWJ1ZykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgdW53cmFwcGVkUHJlZExpc3RNZW1iZXI6ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgdW53cmFwcGVkRSk7Ci0JCQl9Ci0JCX0KLQkJd2JzV3JhcHBlclBhdGhUb1ByZWRMaXN0TWFwLnB1dChjdXJyZW50RWxlbWVudFBhdGgsIGd1aWRQcmVkTGlzdCk7Ci0JCWlmIChkZWJ1ZykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIF9fd3JhcHBlclByZWRMaXN0OiAiICsgZ3VpZFByZWRMaXN0KTsgLy8kTk9OLU5MUy0xJAotCi0JCXRhc2tfdWlkKys7Ci0KLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QnJpZWZEZXNjcmlwdGlvbihXb3JrQnJlYWtkb3duRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgYnJpZWZEZXNjID0gZWxlbWVudC5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCWlmICgoYnJpZWZEZXNjID09IG51bGwgfHwgYnJpZWZEZXNjLnRyaW0oKS5sZW5ndGgoKSA8PSAwKSkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayByZWZfZWRUYXNrID0gdGFza0Rlc2NyaXB0b3IuZ2V0VGFzaygpOwotCQkJCWlmIChyZWZfZWRUYXNrICE9IG51bGwpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCByZWFsaXplZEVsZW1lbnQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KHJlZl9lZFRhc2ssIHByb2Nlc3NDb25maWcpOwotCQkJCQlpZiAoZGVidWcpIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHJlYWxpemVkRWxlbWVudCA9ICIgKyByZWFsaXplZEVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChyZWFsaXplZEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJRUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJCU9iamVjdCBicmllZkRlc2NPYmogPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUocmVhbGl6ZWRFbGVtZW50LCBhdHRyaWJ1dGUsIHByb2Nlc3NDb25maWcpOwotCQkJCQkJYnJpZWZEZXNjID0gYnJpZWZEZXNjT2JqLnRvU3RyaW5nKCk7Ci0JCQkJCQlpZiAoZGVidWcpIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHJlYWxpemVkIGJyaWVmIGRlc2MgPSAiICsgYnJpZWZEZXNjKTsJIC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBicmllZkRlc2M7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEFzc2lnbm1lbnQoU3RyaW5nIHJlc05hbWUsIGludCB0YXNrVWlkLCBQcm9qZWN0IHByb2opIHsKLQkJQXNzaWdubWVudCBhc3NpZ25tZW50ID0gcHJvamVjdEZhY3RvcnkuY3JlYXRlQXNzaWdubWVudCgpOwotCi0JCWFzc2lnbm1lbnQuc2V0VUlEKEJpZ0ludGVnZXIudmFsdWVPZihhc3NpZ25fdWlkKSk7Ci0JCWFzc2lnbm1lbnQuc2V0VGFza1VJRChCaWdJbnRlZ2VyLnZhbHVlT2YodGFza1VpZCkpOwotCQlCaWdJbnRlZ2VyIHJlc0lEID0gKEJpZ0ludGVnZXIpIHJvbGVzVG9VaWRNYXAuZ2V0KHJlc05hbWUpOwotCQlhc3NpZ25tZW50LnNldFJlc291cmNlVUlEKHJlc0lEKTsKLQotCQlwcm9qLmdldEFzc2lnbm1lbnRzKCkuZ2V0QXNzaWdubWVudCgpLmFkZChhc3NpZ25tZW50KTsKLQotCQlhc3NpZ25fdWlkKys7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFJvbGVzRm9yVGFza0QoVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IpIHsKLQkJQXJyYXlMaXN0IHJvbGVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKFJvbGVEZXNjcmlwdG9yIHJkIDogdGFza0Rlc2NyaXB0b3IuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSkgewotCi0JCQkvLyBSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JwID0KLQkJCS8vIHRhc2tEZXNjcmlwdG9yLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JwID0gKFJvbGVEZXNjcmlwdG9yKSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCS5nZXRDYWxjdWxhdGVkRWxlbWVudChyZCwgYnJlYWtkb3duRWxlbWVudEZpbHRlcgotCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCi0JCQlpZiAocm9sZURlc2NycCAhPSBudWxsKSB7Ci0JCQkJcm9sZXNMaXN0LmFkZChnZXREaXNwbGF5TmFtZShyb2xlRGVzY3JwKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBMaXN0IHJvbGVEZXNjcnBMaXN0ID0KLQkJLy8gdGFza0Rlc2NyaXB0b3IuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQkJTGlzdCByb2xlRGVzY3JwTGlzdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnRzKAotCQkJCXRhc2tEZXNjcmlwdG9yLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksCi0JCQkJYnJlYWtkb3duRWxlbWVudEZpbHRlci5nZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJvbGVEZXNjcnBMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2NycCA9IChSb2xlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQlyb2xlc0xpc3QuYWRkKGdldERpc3BsYXlOYW1lKHJvbGVEZXNjcnApKTsKLQkJfQotCi0JCXJldHVybiByb2xlc0xpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFJvbGVzRm9yVGFzayhvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sgdW1hVGFzaykgewotCQlBcnJheUxpc3Qgcm9sZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoUm9sZSByb2xlOiB1bWFUYXNrLmdldFBlcmZvcm1lZEJ5KCkpIHsKLQkJCWlmIChyb2xlICE9IG51bGwpIHsKLQkJCQlyb2xlc0xpc3QuYWRkKGdldERpc3BsYXlOYW1lKHJvbGUpKTsKLQkJCX0KLQkJfQotCi0JCUxpc3QgbGlzdCA9IHVtYVRhc2suZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJvbGUgcm9sZSA9IChSb2xlKSBpdGVyLm5leHQoKTsKLQkJCXJvbGVzTGlzdC5hZGQoZ2V0RGlzcGxheU5hbWUocm9sZSkpOwotCQl9Ci0KLQkJcmV0dXJuIHJvbGVzTGlzdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FsY3VsYXRlUm9sbHVwUm9sZXMoCi0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0JCQlCcmVha2Rvd25FbGVtZW50IGJyZWFrZG93bkVsZW1lbnQsIExpc3Qgcm9sbHVwUm9sZXMpIHsKLQotCQlib29sZWFuIGlzQW55U3ViVGFza1BsYW5uZWQgPSBmYWxzZTsKLQotCQlPYmplY3RbXSBlbGVtZW50cyA9IGNvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhicmVha2Rvd25FbGVtZW50KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlpZiAoIWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMKLQkJCQkJCXx8ICgoQWN0aXZpdHkpIGVsZW1lbnQpLmdldElzUGxhbm5lZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCWlzQW55U3ViVGFza1BsYW5uZWQgPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlzQW55U3ViVGFza1BsYW5uZWQgPSBjYWxjdWxhdGVSb2xsdXBSb2xlcyhjb250ZW50UHJvdmlkZXIsCi0JCQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQsIHJvbGx1cFJvbGVzKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlPYmplY3Qgd3JhcHBlZEVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCQlpZiAod3JhcHBlZEVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlpZiAoIWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMKLQkJCQkJCQl8fCAoKEFjdGl2aXR5KSB3cmFwcGVkRWxlbWVudCkuZ2V0SXNQbGFubmVkKCkKLQkJCQkJCQkJCS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJaXNBbnlTdWJUYXNrUGxhbm5lZCA9IHRydWU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpc0FueVN1YlRhc2tQbGFubmVkID0gY2FsY3VsYXRlUm9sbHVwUm9sZXMoCi0JCQkJCQkJCWNvbnRlbnRQcm92aWRlciwKLQkJCQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIHdyYXBwZWRFbGVtZW50LCByb2xsdXBSb2xlcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCVRhc2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQ7Ci0JCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQl8fCBkZXNjcmlwdG9yLmdldElzUGxhbm5lZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCWlzQW55U3ViVGFza1BsYW5uZWQgPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJvbGx1cFJvbGVzCi0JCQkJCQkJLmFkZEFsbChnZXRSb2xlc0ZvclRhc2tEKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCU9iamVjdCB3cmFwcGVkRWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJCWlmICh3cmFwcGVkRWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCVRhc2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIHdyYXBwZWRFbGVtZW50OwotCQkJCQlpZiAoIWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMKLQkJCQkJCQl8fCBkZXNjcmlwdG9yLmdldElzUGxhbm5lZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQlpc0FueVN1YlRhc2tQbGFubmVkID0gdHJ1ZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJvbGx1cFJvbGVzCi0JCQkJCQkJCS5hZGRBbGwoZ2V0Um9sZXNGb3JUYXNrRCgoVGFza0Rlc2NyaXB0b3IpIHdyYXBwZWRFbGVtZW50KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaXNBbnlTdWJUYXNrUGxhbm5lZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgYSB3b3JrIGJyZWFrZG93biBlbGVtZW50J3MgcHJlZGVjZXNzb3JzLCBzdG9yZXMgdGhlbSBpbiBhbgotCSAqIDxvY2RlPkFycmF5TGlzdDwvY29kZT4sIGFuZCBwdXQgaXQgaW50byBhIG1hcC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVGFza1ByZWRlY2Vzc29ycyhXb3JrQnJlYWtkb3duRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3QgcHJlZGVjZXNzb3JzID0gZWxlbWVudC5nZXRMaW5rVG9QcmVkZWNlc3NvcigpOwotCQlMaXN0IHByZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocHJlZGVjZXNzb3JzICE9IG51bGwgJiYgcHJlZGVjZXNzb3JzLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHByZWRlY2Vzc29ycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlXb3JrT3JkZXIgd29ya09yZGVyID0gKFdvcmtPcmRlcikgaS5uZXh0KCk7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBwcmVkZWNlc3NvciA9IHdvcmtPcmRlci5nZXRQcmVkKCk7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIGxvY2FsUHJlZExpc3RNZW1iZXI6ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgcHJlZGVjZXNzb3IpOwotCQkJCX0KLQkJCQlpZiAocHJlZGVjZXNzb3IgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcHJlZEd1aWQgPSBwcmVkZWNlc3Nvci5nZXRHdWlkKCk7Ci0JCQkJCWlmIChwcmVkR3VpZCAhPSBudWxsKQotCQkJCQkJcHJlZExpc3QuYWRkKHByZWRHdWlkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIGxvY2FsIHByZWRsaXN0IGZvciAiICsgZWxlbWVudC5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkrICIgPSAiICsgcHJlZExpc3QudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXdic1dhcHBlclBhdGhUb0xvY2FsUHJlZExpc3RNYXAucHV0KGN1cnJlbnRFbGVtZW50UGF0aCwgcHJlZExpc3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlTGlua3MoUHJvY2VzcyBwcm9jZXNzLCBQcm9qZWN0IHByb2plY3QpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRUxpc3QgdGFza3MgPSBwcm9qZWN0LmdldFRhc2tzKCkuZ2V0VGFzaygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXNrcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdGVyLm5leHQoKTsKLQkJCQotCQkJQmlnSW50ZWdlciB0YXNrVWlkID0gdGFzay5nZXRVSUQoKTsKLQkJCS8vIHNraXAgdGhlIE1TIHByb2plY3QgaGlkZGVuIHRhc2sgd2l0aCB1aWQgPSAwCi0JCQlpZiAodGFza1VpZC5pbnRWYWx1ZSgpID09IDApCi0JCQkJY29udGludWU7Ci0KLQkJCVN0cmluZyB3YnNQYXRoU3RyID0gKFN0cmluZykgdGFza1VpZFRvV2JzV2FwcGVyUGF0aE1hcC5nZXQodGFza1VpZCk7Ci0KLQkJCUhhc2hNYXA8U3RyaW5nLCBXb3JrT3JkZXI+IHByZWRHdWlkVG9XT01hcCA9IGdldFByZWRHdWlkVG9XT01hcCh0YXNrVG9XYmVNYXAuZ2V0KHRhc2spKTsKLQkJCQotCQkJLy8gTGlzdCBwcmVkTGlzdCA9IChBcnJheUxpc3QpCi0JCQkvLyB3YnNXYXBwZXJQYXRoVG9Mb2NhbFByZWRMaXN0TWFwLmdldCh3YnNQYXRoU3RyKTsKLQkJCUxpc3QgcHJlZExpc3QgPSAoQXJyYXlMaXN0KSB3YnNXcmFwcGVyUGF0aFRvUHJlZExpc3RNYXAKLQkJCQkJLmdldCh3YnNQYXRoU3RyKTsKLQkJCWlmIChwcmVkTGlzdCAhPSBudWxsKSB7Ci0JCQkJTGlzdCByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwcmVkTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJLy9TdHJpbmcgcHJlZEd1aWQgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgcHJlZEVsZW0gPSAoTWV0aG9kRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlTdHJpbmcgcHJlZEd1aWQgPSBwcmVkRWxlbS5nZXRHdWlkKCk7Ci0JCQkJCQotCQkJCQlCaWdJbnRlZ2VyIHByZWRUYXNrVWlkID0gKEJpZ0ludGVnZXIpIHdic0d1aWRUb1Rhc2tVaWRNYXAKLQkJCQkJCQkuZ2V0KHByZWRHdWlkKTsKLQotCQkJCQlpZiAocHJlZFRhc2tVaWQgPT0gbnVsbAotCQkJCQkJCXx8IHByZWRUYXNrVWlkLmludFZhbHVlKCkgPT0gdGFza1VpZC5pbnRWYWx1ZSgpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgdGFza1VpZCA9ICIgKyB0YXNrVWlkIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJKyAiLCB3YnNQYXRoU3RyID0gIiArIHdic1BhdGhTdHIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBsb2NhbFByZWRMaXN0OiAiICsgcHJlZExpc3QpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBmb3VuZCBwcmVkIGd1aWQ6ICIgKyBwcmVkR3VpZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCi0JCQkJCS8vcmVtb3ZlTGlzdC5hZGQocHJlZEd1aWQpOwotCQkJCQlyZW1vdmVMaXN0LmFkZChwcmVkRWxlbSk7Ci0KLQkJCQkJUHJlZGVjZXNzb3JMaW5rIHByZUxpbmsgPSBwcm9qZWN0RmFjdG9yeQotCQkJCQkJCS5jcmVhdGVQcmVkZWNlc3NvckxpbmsoKTsKLQkJCQkJdGFzay5nZXRQcmVkZWNlc3NvckxpbmsoKS5hZGQocHJlTGluayk7Ci0JCQkJCXByZUxpbmsuc2V0UHJlZGVjZXNzb3JVSUQocHJlZFRhc2tVaWQpOwotCQkJCQkKLQkJCQkJLy9wcmVMaW5rLnNldFR5cGUobmV3IEJpZ0ludGVnZXIoIjEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJQmlnSW50ZWdlciBiaWdJbnQgPSBnZXRMaW5rVHlwZUludChwcmVkR3VpZFRvV09NYXAuZ2V0KHByZWRHdWlkKSk7Ci0JCQkJCWlmIChiaWdJbnQgIT0gbnVsbCkgewotCQkJCQkJcHJlTGluay5zZXRUeXBlKGJpZ0ludCk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXByZUxpbmsuc2V0Q3Jvc3NQcm9qZWN0KGZhbHNlKTsKLQkJCQkJcHJlTGluay5zZXRMaW5rTGFnKG5ldyBCaWdJbnRlZ2VyKCIwIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCXByZUxpbmsuc2V0TGFnRm9ybWF0KG5ldyBCaWdJbnRlZ2VyKCI3IikpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXByZWRMaXN0LnJlbW92ZUFsbChyZW1vdmVMaXN0KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgQmlnSW50ZWdlciBnZXRMaW5rVHlwZUludChXb3JrT3JkZXIgd28pIHsKLQkJaWYgKHdvID09IG51bGwpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZz4gZ2V0TGlua1R5cGVJbnQsIHdvID09IG51bGwuIik7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlXb3JrT3JkZXJUeXBlIHdvVHlwZSA9IHdvLmdldExpbmtUeXBlKCk7Ci0JCWlmICh3b1R5cGUgPT0gV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fU1RBUlQpIHsKLQkJCXJldHVybiBuZXcgQmlnSW50ZWdlcigiMSIpOyAvLyROT04tTkxTLTEkCi0JCX0gCi0JCWlmICh3b1R5cGUgPT0gV29ya09yZGVyVHlwZS5TVEFSVF9UT19TVEFSVCkgewotCQkJcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKCIzIik7IC8vJE5PTi1OTFMtMSQKLQkJfSAKLQkJaWYgKHdvVHlwZSA9PSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0gpIHsKLQkJCXJldHVybiBuZXcgQmlnSW50ZWdlcigiMCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHdvVHlwZSA9PSBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX0ZJTklTSCkgewotCQkJcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKCIyIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBXb3JrT3JkZXI+IGdldFByZWRHdWlkVG9XT01hcChXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUpIHsKLQkJSGFzaE1hcDxTdHJpbmcsIFdvcmtPcmRlcj4gcHJlZEd1aWRUb1dPTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBXb3JrT3JkZXI+KCk7Ci0JCWlmICh3YmUgIT0gbnVsbCkgewotCQkJTGlzdDxXb3JrT3JkZXI+IHdvTGlzdCA9IHdiZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpOwotCQkJaW50IHN6ID0gd29MaXN0ID09IG51bGwgPyAwIDogd29MaXN0LnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3o7IGkrKykgewotCQkJCVdvcmtPcmRlciB3byA9IHdvTGlzdC5nZXQoaSk7Ci0JCQkJaWYgKHdvID09IG51bGwgfHwgd28uZ2V0UHJlZCgpID09IG51bGwpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXByZWRHdWlkVG9XT01hcC5wdXQod28uZ2V0UHJlZCgpLmdldEd1aWQoKSwgd28pOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcmVkR3VpZFRvV09NYXA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ2VuZXJhdGVkIEhUTUwgY29udGVudCBmaWxlIFVSTCBmb3IgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIFVSTCBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgY29udGVudCBmaWxlCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFbGVtZW50VVJMKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIGVsZW1lbnRQYXRoID0gbnVsbDsKLQkJU3RyaW5nIGVsZW1lbnRGaWxlTmFtZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50UGF0aCA9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKGVsZW1lbnQpOwotCQkJZWxlbWVudEZpbGVOYW1lID0gUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZU5hbWUoZWxlbWVudCwKLQkJCQkJUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGVsZW1lbnRQYXRoICE9IG51bGwgJiYgZWxlbWVudEZpbGVOYW1lICE9IG51bGwpIHsKLQkJCWVsZW1lbnRQYXRoID0gZWxlbWVudFBhdGgucmVwbGFjZSgnXFwnLCAnLycpOwotCQkJZWxlbWVudEZpbGVOYW1lID0gZWxlbWVudEZpbGVOYW1lLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJCVN0cmluZyB1cmwgPSBjb250ZW50Rm9sZGVyTmFtZQotCQkJCQkrICIvIiArIGVsZW1lbnRQYXRoICsgZWxlbWVudEZpbGVOYW1lOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gYWJUYXJnZXREaXIgKyBGaWxlLnNlcGFyYXRvciArIHVybDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheSBuYW1lIG9mIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpc3BsYXlOYW1lKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJbmFtZSA9IFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCW5hbWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQl9Ci0JCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQluYW1lID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIFhNTFV0aWwuZXNjYXBlQXR0cihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBQdWJsaXNoZXMgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBleHBvcnRlZAotCSAqIHByb2Nlc3MuCi0JICogCi0JICogQHBhcmFtIGRpcgotCSAqICAgICAgICAgICAgdGhlIG91dHB1dCBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiB0byBwdWJsaXNoCi0JICogQHBhcmFtIHB1Ymxpc2hDb25maWdPcHRpb25zCi0JICogICAgICAgICAgICB0aGUgcHVibGlzaGluZyBvcHRpb25zCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29uZmlndXJhdGlvbiB3YXMgcHVibGlzaGVkCi0JICogICAgICAgICBzdWNjZXNzZnVsbHksIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwdWJsaXNoaW5nIHRoZSBjb25maWd1cmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHVibGlzaENvbmZpZ3VyYXRpb24oU3RyaW5nIGRpciwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQdWJsaXNoT3B0aW9ucyBwdWJsaXNoQ29uZmlnT3B0aW9ucykKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlQdWJsaXNoTWFuYWdlciBwdWJsaXNoTWdyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXB1Ymxpc2hNZ3IgPSBuZXcgUHVibGlzaE1hbmFnZXIoKTsKLQkJCXB1Ymxpc2hNZ3IuaW5pdChkaXIsIGNvbmZpZywgbmV3IFB1Ymxpc2hIVE1MT3B0aW9ucygKLQkJCQkJcHVibGlzaENvbmZpZ09wdGlvbnMpKTsKLQotCQkJRXhwb3J0TVNQWE1MT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBFeHBvcnRNU1BYTUxPcGVyYXRpb24oCi0JCQkJCXB1Ymxpc2hNZ3IpOwotCQkJUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZyBkbGcgPSBuZXcgUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZygKLQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgcHVibGlzaE1ncgotCQkJCQkJCS5nZXRWaWV3QnVpbGRlcigpKTsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IFVJSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhvcGVyYXRpb24sCi0JCQkJCWRsZywgdHJ1ZSwgRXhwb3J0TVNQUmVzb3VyY2VzLmV4cG9ydE1TUFdpemFyZF90aXRsZSk7Ci0JCQlpZiAob3BlcmF0aW9uLmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQl0aHJvdyBvcGVyYXRpb24uZ2V0RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VjY2VzcyAmJiAhZGxnLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocHVibGlzaE1nciAhPSBudWxsKSB7Ci0JCQkJcHVibGlzaE1nci5kaXNwb3NlKCk7Ci0JCQkJcHVibGlzaE1nciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgdGhlIHRyYWNlIGluZm9ybWF0aW9uIGZvciB0aGUgTWljcm9zb2Z0IFByb2plY3QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludE1TUHJvamVjdChQcm9qZWN0IHByb2plY3QpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcbiQkJCByZWFkLWluIHByb2plY3QgPSAiICsgcHJvamVjdCk7IC8vJE5PTi1OTFMtMSQKLQotCQlFTGlzdCB0YXNrcyA9IHByb2plY3QuZ2V0VGFza3MoKS5nZXRUYXNrKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhc2tzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVGFzayBlbGVtZW50ID0gKFRhc2spIGl0ZXIubmV4dCgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgYSB0YXNrID0gIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlFTGlzdCByZXNvdXJjZXMgPSBwcm9qZWN0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UgZWxlbWVudCA9IChvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlKSBpdGVyCi0JCQkJCS5uZXh0KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBhIHJlc291cmNlID0gIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlFTGlzdCBhc3NpZ25tZW50cyA9IHByb2plY3QuZ2V0QXNzaWdubWVudHMoKS5nZXRBc3NpZ25tZW50KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFzc2lnbm1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQXNzaWdubWVudCBlbGVtZW50ID0gKEFzc2lnbm1lbnQpIGl0ZXIubmV4dCgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgYW4gYXNzaWdubWVudCA9ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQ9PT1cbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByb3RlY3RlZCBIYXNoTWFwPFRhc2ssIFdvcmtCcmVha2Rvd25FbGVtZW50PiBnZXRUYXNrVG9XYmVNYXAoKSB7Ci0JCXJldHVybiB0YXNrVG9XYmVNYXA7Ci0JfQotCQotCS8vVG8gYmUgb3ZlcnJpZGVuIGJ5IHN1YmNsYXNzZXMKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9qZWN0RXh0ZW5kZWRBdHRyaWJ1dGVzKFByb2plY3QgcHJvamVjdCkgewotCX0KLQotCS8vVG8gYmUgb3ZlcnJpZGVuIGJ5IHN1YmNsYXNzZXMKLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVdQRHMoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQl9CQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0T3B0aW9ucy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE9wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ5YTg0NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0T3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBBIEhhc2hNYXAgZm9yIEV4cG9ydCBPcHRpb25zCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE9wdGlvbnMgZXh0ZW5kcyBIYXNoTWFwIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01ODk3MDEyMTU5MTMyMTIyNzNMOwotCQotCS8qKgotCSAqIFRoZSBwdWJsaXNoIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ09ORklHID0gInB1Ymxpc2hDb25maWciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXhwb3J0IG9ubHkgcGxhbm5lZCB3b3JrYnJlYWtkb3duIGVsZW1lbnRzIG9wdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfT05MWV9QTEFOTkVEX0VMRU1FTlRTID0gImV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXhwb3J0IGVmZm9ydCBlc3RpbWF0ZXMgZm9yIHdvcmticmVha2Rvd24gZWxlbWVudHMgb3B0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUE9SVF9FU1RJTUFURVMgPSAiZXhwb3J0RXN0aW1hdGVzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGVzdGltYXRpbmcgbW9kZWwgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGVmZm9ydCBlc3RpbWF0ZXMgb2YgdGhlCi0JICogZXhwb3J0ZWQgd29ya2JyZWFrZG93biBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFU1RJTUFUSU5HX01PREVMID0gImVzdGltYXRpbmdNb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRPcHRpb25zKCkgewotCQlzdXBlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0lFeHBvcnRNU1BTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvSUV4cG9ydE1TUFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5MzRhMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvSUV4cG9ydE1TUFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgU2VydmljZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUV4cG9ydE1TUFNlcnZpY2UgewotCi0JLyoqCi0JICogRXhwb3J0IGEgcHJvY2VzcyB0byBhIE1pY3Jvc29mdCBQcm9qZWN0IGZpbGUuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiAgICAgICAgICAgIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MKLQkgKiBAcGFyYW0gZXhwb3J0T3B0aW9ucwotCSAqICAgICAgICAgICAgYSBjb2xsZWN0aW9uIG9mIHVzZXIgc3BlY2lmaWVkIGV4cG9ydCBvcHRpb25zCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb3BlcmF0aW9uIHdhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Ci0JICogQHRocm93cyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwb3J0TVNQcm9qZWN0KFByb2Nlc3MgcHJvY2VzcywKLQkJCUV4cG9ydE1TUE9wdGlvbnMgZXhwb3J0T3B0aW9ucykgdGhyb3dzIEV4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlhYzk2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFdpemFyZAotZXhwb3J0TVNQV2l6YXJkX3RpdGxlPUV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdAotCi0jIFByb2dyZXNzIE1lc3NhZ2VzCi1leHBvcnRNU1BUYXNrX25hbWU9RXhwb3J0aW5nIHNlbGVjdGVkIHByb2Nlc3MgdG8gTWljcm9zb2Z0IFByb2plY3QuLi4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmE1MjIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBhbmQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3Qgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC90ZW1wbGF0ZS9tc3Byb2plY3RfMjAwM190ZW1wbGF0ZS54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC90ZW1wbGF0ZS9tc3Byb2plY3RfMjAwM190ZW1wbGF0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZTUwYzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvdGVtcGxhdGUvbXNwcm9qZWN0XzIwMDNfdGVtcGxhdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9lcGYuZWNsaXBzZS5vcmcvbXNwcm9qZWN0Ij4KLTxOYW1lPm1zcHJvamVjdF8yMDAzX3RlbXBsYXRlLnhtbDwvTmFtZT4KLTxDb21wYW55PkVjbGlwc2Uub3JnPC9Db21wYW55PgotPEF1dGhvcj48L0F1dGhvcj4KLTxDcmVhdGlvbkRhdGU+MjAwNi0wMi0xMFQxNDozNjowMDwvQ3JlYXRpb25EYXRlPgotPExhc3RTYXZlZD4yMDA2LTAyLTEwVDE1OjE5OjAwPC9MYXN0U2F2ZWQ+Ci08U2NoZWR1bGVGcm9tU3RhcnQ+MTwvU2NoZWR1bGVGcm9tU3RhcnQ+Ci08U3RhcnREYXRlPjIwMDYtMDItMTBUMDg6MDA6MDA8L1N0YXJ0RGF0ZT4KLTxGaW5pc2hEYXRlPjIwMDYtMDItMTBUMDg6MDA6MDA8L0ZpbmlzaERhdGU+Ci08RllTdGFydERhdGU+MTwvRllTdGFydERhdGU+Ci08Q3JpdGljYWxTbGFja0xpbWl0PjA8L0NyaXRpY2FsU2xhY2tMaW1pdD4KLTxDdXJyZW5jeURpZ2l0cz4yPC9DdXJyZW5jeURpZ2l0cz4KLTxDdXJyZW5jeVN5bWJvbD4kPC9DdXJyZW5jeVN5bWJvbD4KLTxDdXJyZW5jeVN5bWJvbFBvc2l0aW9uPjA8L0N1cnJlbmN5U3ltYm9sUG9zaXRpb24+Ci08Q2FsZW5kYXJVSUQ+MTwvQ2FsZW5kYXJVSUQ+Ci08RGVmYXVsdFN0YXJ0VGltZT4wODowMDowMDwvRGVmYXVsdFN0YXJ0VGltZT4KLTxEZWZhdWx0RmluaXNoVGltZT4xNzowMDowMDwvRGVmYXVsdEZpbmlzaFRpbWU+Ci08TWludXRlc1BlckRheT40ODA8L01pbnV0ZXNQZXJEYXk+Ci08TWludXRlc1BlcldlZWs+MjQwMDwvTWludXRlc1BlcldlZWs+Ci08RGF5c1Blck1vbnRoPjIwPC9EYXlzUGVyTW9udGg+Ci08RGVmYXVsdFRhc2tUeXBlPjA8L0RlZmF1bHRUYXNrVHlwZT4KLTxEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbD4zPC9EZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbD4KLTxEZWZhdWx0U3RhbmRhcmRSYXRlPjA8L0RlZmF1bHRTdGFuZGFyZFJhdGU+Ci08RGVmYXVsdE92ZXJ0aW1lUmF0ZT4wPC9EZWZhdWx0T3ZlcnRpbWVSYXRlPgotPER1cmF0aW9uRm9ybWF0Pjc8L0R1cmF0aW9uRm9ybWF0PgotPFdvcmtGb3JtYXQ+MjwvV29ya0Zvcm1hdD4KLTxFZGl0YWJsZUFjdHVhbENvc3RzPjA8L0VkaXRhYmxlQWN0dWFsQ29zdHM+Ci08SG9ub3JDb25zdHJhaW50cz4wPC9Ib25vckNvbnN0cmFpbnRzPgotPEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeT4xPC9JbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnk+Ci08TXVsdGlwbGVDcml0aWNhbFBhdGhzPjA8L011bHRpcGxlQ3JpdGljYWxQYXRocz4KLTxOZXdUYXNrc0VmZm9ydERyaXZlbj4xPC9OZXdUYXNrc0VmZm9ydERyaXZlbj4KLTxOZXdUYXNrc0VzdGltYXRlZD4xPC9OZXdUYXNrc0VzdGltYXRlZD4KLTxTcGxpdHNJblByb2dyZXNzVGFza3M+MTwvU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzPgotPFNwcmVhZEFjdHVhbENvc3Q+MDwvU3ByZWFkQWN0dWFsQ29zdD4KLTxTcHJlYWRQZXJjZW50Q29tcGxldGU+MDwvU3ByZWFkUGVyY2VudENvbXBsZXRlPgotPFRhc2tVcGRhdGVzUmVzb3VyY2U+MTwvVGFza1VwZGF0ZXNSZXNvdXJjZT4KLTxGaXNjYWxZZWFyU3RhcnQ+MDwvRmlzY2FsWWVhclN0YXJ0PgotPFdlZWtTdGFydERheT4wPC9XZWVrU3RhcnREYXk+Ci08TW92ZUNvbXBsZXRlZEVuZHNCYWNrPjA8L01vdmVDb21wbGV0ZWRFbmRzQmFjaz4KLTxNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaz4wPC9Nb3ZlUmVtYWluaW5nU3RhcnRzQmFjaz4KLTxNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZD4wPC9Nb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZD4KLTxNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQ+MDwvTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkPgotPEJhc2VsaW5lRm9yRWFybmVkVmFsdWU+MDwvQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZT4KLTxBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3M+MTwvQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzPgotPEN1cnJlbnREYXRlPjIwMDYtMDItMTBUMDg6MDA6MDA8L0N1cnJlbnREYXRlPgotPE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkw+MTwvTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTD4KLTxBdXRvbGluaz4xPC9BdXRvbGluaz4KLTxOZXdUYXNrU3RhcnREYXRlPjA8L05ld1Rhc2tTdGFydERhdGU+Ci08RGVmYXVsdFRhc2tFVk1ldGhvZD4wPC9EZWZhdWx0VGFza0VWTWV0aG9kPgotPFByb2plY3RFeHRlcm5hbGx5RWRpdGVkPjA8L1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkPgotPEV4dGVuZGVkQ3JlYXRpb25EYXRlPjE5ODQtMDEtMDFUMDA6MDA6MDA8L0V4dGVuZGVkQ3JlYXRpb25EYXRlPgotPEFjdHVhbHNJblN5bmM+MTwvQWN0dWFsc0luU3luYz4KLTxSZW1vdmVGaWxlUHJvcGVydGllcz4wPC9SZW1vdmVGaWxlUHJvcGVydGllcz4KLTxBZG1pblByb2plY3Q+MDwvQWRtaW5Qcm9qZWN0PgotPE91dGxpbmVDb2Rlcy8+Ci08V0JTTWFza3MvPgotPEV4dGVuZGVkQXR0cmlidXRlcy8+Ci08Q2FsZW5kYXJzPgotPENhbGVuZGFyPgotPFVJRD4xPC9VSUQ+Ci08TmFtZT5TdGFuZGFyZDwvTmFtZT4KLTxJc0Jhc2VDYWxlbmRhcj4xPC9Jc0Jhc2VDYWxlbmRhcj4KLTxCYXNlQ2FsZW5kYXJVSUQ+LTE8L0Jhc2VDYWxlbmRhclVJRD4KLTxXZWVrRGF5cz4KLTxXZWVrRGF5PgotPERheVR5cGU+MTwvRGF5VHlwZT4KLTxEYXlXb3JraW5nPjA8L0RheVdvcmtpbmc+Ci08L1dlZWtEYXk+Ci08V2Vla0RheT4KLTxEYXlUeXBlPjI8L0RheVR5cGU+Ci08RGF5V29ya2luZz4xPC9EYXlXb3JraW5nPgotPFdvcmtpbmdUaW1lcz4KLTxXb3JraW5nVGltZT4KLTxGcm9tVGltZT4wODowMDowMDwvRnJvbVRpbWU+Ci08VG9UaW1lPjEyOjAwOjAwPC9Ub1RpbWU+Ci08L1dvcmtpbmdUaW1lPgotPFdvcmtpbmdUaW1lPgotPEZyb21UaW1lPjEzOjAwOjAwPC9Gcm9tVGltZT4KLTxUb1RpbWU+MTc6MDA6MDA8L1RvVGltZT4KLTwvV29ya2luZ1RpbWU+Ci08L1dvcmtpbmdUaW1lcz4KLTwvV2Vla0RheT4KLTxXZWVrRGF5PgotPERheVR5cGU+MzwvRGF5VHlwZT4KLTxEYXlXb3JraW5nPjE8L0RheVdvcmtpbmc+Ci08V29ya2luZ1RpbWVzPgotPFdvcmtpbmdUaW1lPgotPEZyb21UaW1lPjA4OjAwOjAwPC9Gcm9tVGltZT4KLTxUb1RpbWU+MTI6MDA6MDA8L1RvVGltZT4KLTwvV29ya2luZ1RpbWU+Ci08V29ya2luZ1RpbWU+Ci08RnJvbVRpbWU+MTM6MDA6MDA8L0Zyb21UaW1lPgotPFRvVGltZT4xNzowMDowMDwvVG9UaW1lPgotPC9Xb3JraW5nVGltZT4KLTwvV29ya2luZ1RpbWVzPgotPC9XZWVrRGF5PgotPFdlZWtEYXk+Ci08RGF5VHlwZT40PC9EYXlUeXBlPgotPERheVdvcmtpbmc+MTwvRGF5V29ya2luZz4KLTxXb3JraW5nVGltZXM+Ci08V29ya2luZ1RpbWU+Ci08RnJvbVRpbWU+MDg6MDA6MDA8L0Zyb21UaW1lPgotPFRvVGltZT4xMjowMDowMDwvVG9UaW1lPgotPC9Xb3JraW5nVGltZT4KLTxXb3JraW5nVGltZT4KLTxGcm9tVGltZT4xMzowMDowMDwvRnJvbVRpbWU+Ci08VG9UaW1lPjE3OjAwOjAwPC9Ub1RpbWU+Ci08L1dvcmtpbmdUaW1lPgotPC9Xb3JraW5nVGltZXM+Ci08L1dlZWtEYXk+Ci08V2Vla0RheT4KLTxEYXlUeXBlPjU8L0RheVR5cGU+Ci08RGF5V29ya2luZz4xPC9EYXlXb3JraW5nPgotPFdvcmtpbmdUaW1lcz4KLTxXb3JraW5nVGltZT4KLTxGcm9tVGltZT4wODowMDowMDwvRnJvbVRpbWU+Ci08VG9UaW1lPjEyOjAwOjAwPC9Ub1RpbWU+Ci08L1dvcmtpbmdUaW1lPgotPFdvcmtpbmdUaW1lPgotPEZyb21UaW1lPjEzOjAwOjAwPC9Gcm9tVGltZT4KLTxUb1RpbWU+MTc6MDA6MDA8L1RvVGltZT4KLTwvV29ya2luZ1RpbWU+Ci08L1dvcmtpbmdUaW1lcz4KLTwvV2Vla0RheT4KLTxXZWVrRGF5PgotPERheVR5cGU+NjwvRGF5VHlwZT4KLTxEYXlXb3JraW5nPjE8L0RheVdvcmtpbmc+Ci08V29ya2luZ1RpbWVzPgotPFdvcmtpbmdUaW1lPgotPEZyb21UaW1lPjA4OjAwOjAwPC9Gcm9tVGltZT4KLTxUb1RpbWU+MTI6MDA6MDA8L1RvVGltZT4KLTwvV29ya2luZ1RpbWU+Ci08V29ya2luZ1RpbWU+Ci08RnJvbVRpbWU+MTM6MDA6MDA8L0Zyb21UaW1lPgotPFRvVGltZT4xNzowMDowMDwvVG9UaW1lPgotPC9Xb3JraW5nVGltZT4KLTwvV29ya2luZ1RpbWVzPgotPC9XZWVrRGF5PgotPFdlZWtEYXk+Ci08RGF5VHlwZT43PC9EYXlUeXBlPgotPERheVdvcmtpbmc+MDwvRGF5V29ya2luZz4KLTwvV2Vla0RheT4KLTwvV2Vla0RheXM+Ci08L0NhbGVuZGFyPgotPC9DYWxlbmRhcnM+Ci08VGFza3M+Ci08VGFzaz4KLTxVSUQ+MDwvVUlEPgotPElEPjA8L0lEPgotPFR5cGU+MTwvVHlwZT4KLTxJc051bGw+MDwvSXNOdWxsPgotPENyZWF0ZURhdGU+MjAwNi0wMi0xMFQxNDozNjowMDwvQ3JlYXRlRGF0ZT4KLTxXQlM+MDwvV0JTPgotPE91dGxpbmVOdW1iZXI+MDwvT3V0bGluZU51bWJlcj4KLTxPdXRsaW5lTGV2ZWw+MDwvT3V0bGluZUxldmVsPgotPFByaW9yaXR5PjUwMDwvUHJpb3JpdHk+Ci08U3RhcnQ+MjAwNi0wMi0xMFQwODowMDowMDwvU3RhcnQ+Ci08RmluaXNoPjIwMDYtMDItMTBUMDg6MDA6MDA8L0ZpbmlzaD4KLTxEdXJhdGlvbj5QVDBIME0wUzwvRHVyYXRpb24+Ci08RHVyYXRpb25Gb3JtYXQ+NTM8L0R1cmF0aW9uRm9ybWF0PgotPFdvcms+UFQwSDBNMFM8L1dvcms+Ci08UmVzdW1lVmFsaWQ+MDwvUmVzdW1lVmFsaWQ+Ci08RWZmb3J0RHJpdmVuPjA8L0VmZm9ydERyaXZlbj4KLTxSZWN1cnJpbmc+MDwvUmVjdXJyaW5nPgotPE92ZXJBbGxvY2F0ZWQ+MDwvT3ZlckFsbG9jYXRlZD4KLTxFc3RpbWF0ZWQ+MTwvRXN0aW1hdGVkPgotPE1pbGVzdG9uZT4wPC9NaWxlc3RvbmU+Ci08U3VtbWFyeT4xPC9TdW1tYXJ5PgotPENyaXRpY2FsPjE8L0NyaXRpY2FsPgotPElzU3VicHJvamVjdD4wPC9Jc1N1YnByb2plY3Q+Ci08SXNTdWJwcm9qZWN0UmVhZE9ubHk+MDwvSXNTdWJwcm9qZWN0UmVhZE9ubHk+Ci08RXh0ZXJuYWxUYXNrPjA8L0V4dGVybmFsVGFzaz4KLTxFYXJseVN0YXJ0PjIwMDYtMDItMTBUMDg6MDA6MDA8L0Vhcmx5U3RhcnQ+Ci08RWFybHlGaW5pc2g+MjAwNi0wMi0xMFQwODowMDowMDwvRWFybHlGaW5pc2g+Ci08TGF0ZVN0YXJ0PjIwMDYtMDItMTBUMDg6MDA6MDA8L0xhdGVTdGFydD4KLTxMYXRlRmluaXNoPjIwMDYtMDItMTBUMDg6MDA6MDA8L0xhdGVGaW5pc2g+Ci08U3RhcnRWYXJpYW5jZT4wPC9TdGFydFZhcmlhbmNlPgotPEZpbmlzaFZhcmlhbmNlPjA8L0ZpbmlzaFZhcmlhbmNlPgotPFdvcmtWYXJpYW5jZT4wPC9Xb3JrVmFyaWFuY2U+Ci08RnJlZVNsYWNrPjA8L0ZyZWVTbGFjaz4KLTxUb3RhbFNsYWNrPjA8L1RvdGFsU2xhY2s+Ci08Rml4ZWRDb3N0PjA8L0ZpeGVkQ29zdD4KLTxGaXhlZENvc3RBY2NydWFsPjM8L0ZpeGVkQ29zdEFjY3J1YWw+Ci08UGVyY2VudENvbXBsZXRlPjA8L1BlcmNlbnRDb21wbGV0ZT4KLTxQZXJjZW50V29ya0NvbXBsZXRlPjA8L1BlcmNlbnRXb3JrQ29tcGxldGU+Ci08Q29zdD4wPC9Db3N0PgotPE92ZXJ0aW1lQ29zdD4wPC9PdmVydGltZUNvc3Q+Ci08T3ZlcnRpbWVXb3JrPlBUMEgwTTBTPC9PdmVydGltZVdvcms+Ci08QWN0dWFsRHVyYXRpb24+UFQwSDBNMFM8L0FjdHVhbER1cmF0aW9uPgotPEFjdHVhbENvc3Q+MDwvQWN0dWFsQ29zdD4KLTxBY3R1YWxPdmVydGltZUNvc3Q+MDwvQWN0dWFsT3ZlcnRpbWVDb3N0PgotPEFjdHVhbFdvcms+UFQwSDBNMFM8L0FjdHVhbFdvcms+Ci08QWN0dWFsT3ZlcnRpbWVXb3JrPlBUMEgwTTBTPC9BY3R1YWxPdmVydGltZVdvcms+Ci08UmVndWxhcldvcms+UFQwSDBNMFM8L1JlZ3VsYXJXb3JrPgotPFJlbWFpbmluZ0R1cmF0aW9uPlBUMEgwTTBTPC9SZW1haW5pbmdEdXJhdGlvbj4KLTxSZW1haW5pbmdDb3N0PjA8L1JlbWFpbmluZ0Nvc3Q+Ci08UmVtYWluaW5nV29yaz5QVDBIME0wUzwvUmVtYWluaW5nV29yaz4KLTxSZW1haW5pbmdPdmVydGltZUNvc3Q+MDwvUmVtYWluaW5nT3ZlcnRpbWVDb3N0PgotPFJlbWFpbmluZ092ZXJ0aW1lV29yaz5QVDBIME0wUzwvUmVtYWluaW5nT3ZlcnRpbWVXb3JrPgotPEFDV1A+MDwvQUNXUD4KLTxDVj4wPC9DVj4KLTxDb25zdHJhaW50VHlwZT4wPC9Db25zdHJhaW50VHlwZT4KLTxDYWxlbmRhclVJRD4tMTwvQ2FsZW5kYXJVSUQ+Ci08TGV2ZWxBc3NpZ25tZW50cz4xPC9MZXZlbEFzc2lnbm1lbnRzPgotPExldmVsaW5nQ2FuU3BsaXQ+MTwvTGV2ZWxpbmdDYW5TcGxpdD4KLTxMZXZlbGluZ0RlbGF5PjA8L0xldmVsaW5nRGVsYXk+Ci08TGV2ZWxpbmdEZWxheUZvcm1hdD44PC9MZXZlbGluZ0RlbGF5Rm9ybWF0PgotPElnbm9yZVJlc291cmNlQ2FsZW5kYXI+MDwvSWdub3JlUmVzb3VyY2VDYWxlbmRhcj4KLTxIaWRlQmFyPjA8L0hpZGVCYXI+Ci08Um9sbHVwPjA8L1JvbGx1cD4KLTxCQ1dTPjA8L0JDV1M+Ci08QkNXUD4wPC9CQ1dQPgotPFBoeXNpY2FsUGVyY2VudENvbXBsZXRlPjA8L1BoeXNpY2FsUGVyY2VudENvbXBsZXRlPgotPEVhcm5lZFZhbHVlTWV0aG9kPjA8L0Vhcm5lZFZhbHVlTWV0aG9kPgotPEFjdHVhbFdvcmtQcm90ZWN0ZWQ+UFQwSDBNMFM8L0FjdHVhbFdvcmtQcm90ZWN0ZWQ+Ci08QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkPlBUMEgwTTBTPC9BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ+Ci08L1Rhc2s+Ci08L1Rhc2tzPgotPFJlc291cmNlcz4KLTxSZXNvdXJjZT4KLTxVSUQ+MDwvVUlEPgotPElEPjA8L0lEPgotPFR5cGU+MTwvVHlwZT4KLTxJc051bGw+MDwvSXNOdWxsPgotPFdvcmtHcm91cD4wPC9Xb3JrR3JvdXA+Ci08TWF4VW5pdHM+MTwvTWF4VW5pdHM+Ci08UGVha1VuaXRzPjA8L1BlYWtVbml0cz4KLTxPdmVyQWxsb2NhdGVkPjA8L092ZXJBbGxvY2F0ZWQ+Ci08Q2FuTGV2ZWw+MTwvQ2FuTGV2ZWw+Ci08QWNjcnVlQXQ+MzwvQWNjcnVlQXQ+Ci08V29yaz5QVDBIME0wUzwvV29yaz4KLTxSZWd1bGFyV29yaz5QVDBIME0wUzwvUmVndWxhcldvcms+Ci08T3ZlcnRpbWVXb3JrPlBUMEgwTTBTPC9PdmVydGltZVdvcms+Ci08QWN0dWFsV29yaz5QVDBIME0wUzwvQWN0dWFsV29yaz4KLTxSZW1haW5pbmdXb3JrPlBUMEgwTTBTPC9SZW1haW5pbmdXb3JrPgotPEFjdHVhbE92ZXJ0aW1lV29yaz5QVDBIME0wUzwvQWN0dWFsT3ZlcnRpbWVXb3JrPgotPFJlbWFpbmluZ092ZXJ0aW1lV29yaz5QVDBIME0wUzwvUmVtYWluaW5nT3ZlcnRpbWVXb3JrPgotPFBlcmNlbnRXb3JrQ29tcGxldGU+MDwvUGVyY2VudFdvcmtDb21wbGV0ZT4KLTxTdGFuZGFyZFJhdGU+MDwvU3RhbmRhcmRSYXRlPgotPFN0YW5kYXJkUmF0ZUZvcm1hdD4yPC9TdGFuZGFyZFJhdGVGb3JtYXQ+Ci08Q29zdD4wPC9Db3N0PgotPE92ZXJ0aW1lUmF0ZT4wPC9PdmVydGltZVJhdGU+Ci08T3ZlcnRpbWVSYXRlRm9ybWF0PjI8L092ZXJ0aW1lUmF0ZUZvcm1hdD4KLTxPdmVydGltZUNvc3Q+MDwvT3ZlcnRpbWVDb3N0PgotPENvc3RQZXJVc2U+MDwvQ29zdFBlclVzZT4KLTxBY3R1YWxDb3N0PjA8L0FjdHVhbENvc3Q+Ci08QWN0dWFsT3ZlcnRpbWVDb3N0PjA8L0FjdHVhbE92ZXJ0aW1lQ29zdD4KLTxSZW1haW5pbmdDb3N0PjA8L1JlbWFpbmluZ0Nvc3Q+Ci08UmVtYWluaW5nT3ZlcnRpbWVDb3N0PjA8L1JlbWFpbmluZ092ZXJ0aW1lQ29zdD4KLTxXb3JrVmFyaWFuY2U+MDwvV29ya1ZhcmlhbmNlPgotPENvc3RWYXJpYW5jZT4wPC9Db3N0VmFyaWFuY2U+Ci08U1Y+MDwvU1Y+Ci08Q1Y+MDwvQ1Y+Ci08QUNXUD4wPC9BQ1dQPgotPENhbGVuZGFyVUlEPjI8L0NhbGVuZGFyVUlEPgotPEJDV1M+MDwvQkNXUz4KLTxCQ1dQPjA8L0JDV1A+Ci08SXNHZW5lcmljPjA8L0lzR2VuZXJpYz4KLTxJc0luYWN0aXZlPjA8L0lzSW5hY3RpdmU+Ci08SXNFbnRlcnByaXNlPjA8L0lzRW50ZXJwcmlzZT4KLTxCb29raW5nVHlwZT4wPC9Cb29raW5nVHlwZT4KLTxBY3R1YWxXb3JrUHJvdGVjdGVkPlBUMEgwTTBTPC9BY3R1YWxXb3JrUHJvdGVjdGVkPgotPEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZD5QVDBIME0wUzwvQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkPgotPENyZWF0aW9uRGF0ZT4yMDA2LTAyLTEwVDE0OjM2OjAwPC9DcmVhdGlvbkRhdGU+Ci08L1Jlc291cmNlPgotPC9SZXNvdXJjZXM+Ci08QXNzaWdubWVudHMvPgotPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLy5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MzFiZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIHhtbCBleHBvcnQgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE3OWUwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOWFjNzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWw7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5FeHBvcnRYTUxQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2U7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLndpemFyZHMKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YmNjMmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9pY29ucy9mdWxsL29iajE2L1hNTEZpbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvaWNvbnMvZnVsbC9vYmoxNi9YTUxGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNiNDRiYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9pY29ucy9mdWxsL29iajE2L1hNTEZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvaWNvbnMvZnVsbC93aXpiYW4vRXhwb3J0WE1MLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydFhNTC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDk4MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvaWNvbnMvZnVsbC93aXpiYW4vRXhwb3J0WE1MLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMzA0YWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgRXhwb3J0IFhNTCBQbHVnLWluCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyBFeHBvcnQgWE1MIFdpemFyZAotZXhwb3J0WE1MV2l6YXJkTmFtZT1YTUwKLWV4cG9ydFhNTFdpemFyZERlc2NyaXB0aW9uPUV4cG9ydCBtZXRob2QgbGlicmFyeSBjb250ZW50IHRvIGEgWE1MIGZpbGUuCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQ2NDY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmV4cG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi51aS5leHBvcnRXaXphcmRzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLndpemFyZHMuRXhwb3J0WE1MV2l6YXJkIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9YTUxGaWxlLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzLkV4cG9ydFhNTFdpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVleHBvcnRYTUxXaXphcmROYW1lIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVleHBvcnRYTUxXaXphcmREZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzLkV4cG9ydFhNTFdpemFyZCIvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL0V4cG9ydFhNTFBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL0V4cG9ydFhNTFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzhjMWY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9FeHBvcnRYTUxQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IFhNTCBwbHVnLWluIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRYTUxQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgRXhwb3J0WE1MUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydFhNTFBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdG9wKEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwb3J0WE1MUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvRXhwb3J0WE1MUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvRXhwb3J0WE1MUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZTE0MzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL0V4cG9ydFhNTFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBFeHBvcnQgWE1MIG1lc3NhZ2UgcmVzb3VyY2UgYnVuZGxlIGFjY2Vzc29yIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEV4cG9ydFhNTFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBFeHBvcnRYTUxSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBFeHBvcnRYTUxSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydFhNTFdpemFyZF90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydExpYnJhcnlSYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRDb25maWdzUmFkaW9CdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFhNTEZpbGVQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdmVyd3JpdGVUZXh0X21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydGluZ1hNTF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFhNTEZpbGVfZXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRYTUxXaXphcmRfZXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRYTUxXaXphcmRfcmV2aWV3TG9nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydFhNTFNlcnZpY2VfZXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRYTUxTZXJ2aWNlX2ZlYXR1cmVfZXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X2Vycm9yX2xvYWRfeG1sOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9ub19wbHVnaW47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X25vX2ZlYXR1cmU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X25vX2NsYXNzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9pbnZhbGlkX2ZlYXR1cmVfdmFsdWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfZXJyb3JfcHJvY2Vzc193cm9uZ19jb250YWluZXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X25ld19pZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfaWRfbm90X3VuaXF1ZTsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEV4cG9ydFhNTFJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgyN2U3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIwotIyBNZXNzYWdlIElEIFJhbmdlOgotIwotCi0jIEV4cG9ydCBYTUwgV2l6YXJkCi1leHBvcnRYTUxXaXphcmRfdGl0bGU9RXhwb3J0IFhNTAotCi0jIFNlbGVjdCBFeHBvcnQgVHlwZSBXaXphcmQgUGFnZQotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYz1TZWxlY3QgdGhlIHR5cGUgb2YgbWV0aG9kIGxpYnJhcnkgY29udGVudCB0byBleHBvcnQuCi1leHBvcnRMaWJyYXJ5UmFkaW9CdXR0b25fdGV4dD1FeHBvcnQgdGhlIGVudGlyZSBtZXRob2QgbGlicmFyeQotZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uX3RleHQ9RXhwb3J0IG9uZSBvciBtb3JlIG1ldGhvZCBwbHVnLWlucwotZXhwb3J0Q29uZmlnc1JhZGlvQnV0dG9uX3RleHQ9RXhwb3J0IGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQotIyBTZWxlY3QgRGVzdGluYXRpb24gWE1MIEZpbGUgV2l6YXJkIFBhZ2UKLXNlbGVjdFhNTEZpbGVQYWdlX3RpdGxlPVNwZWNpZnkgZXhwb3J0IGZpbGUKLXNlbGVjdFhNTEZpbGVQYWdlX2Rlc2M9U3BlY2lmeSBhIGRlc3RpbmF0aW9uIFhNTCBmaWxlIHRvIHN0b3JlIHRoZSBleHBvcnRlZCBtZXRob2QgbGlicmFyeSBjb250ZW50LgotZmlsZUxhYmVsX3RleHQ9WE1MIEZpbGU6Ci1icm93c2VCdXR0b25fdGV4dD1Ccm93c2UuLi4KLQotIyBPdmVyd3JpdGUgQ29uZmlybWF0aW9uIERpYWxvZwotb3ZlcndyaXRlVGV4dF9tc2c9Jyd7MH0nJyBhbHJlYWR5IGV4aXN0cy5cbkRvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSBpdD8KLQotIyBQcm9ncmVzcyBNZXNzYWdlcwotZXhwb3J0aW5nWE1MX3RleHQ9RXhwb3J0IG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgdG8gWE1MIGZpbGUuLi4KLQotIyBFcnJvciBNZXNzYWdlcwotaW52YWxpZFhNTEZpbGVfZXJyb3I9VGhlIHNwZWNpZmllZCBYTUwgZmlsZSBpcyBub3QgdmFsaWQuCi1leHBvcnRYTUxXaXphcmRfZXJyb3I9SVVQTTAwMDBFOiBUaGUgRXhwb3J0IGZhaWxlZDogezB9Ci1leHBvcnRYTUxXaXphcmRfcmV2aWV3TG9nPUV4cG9ydCBjb21wbGV0ZWQuIFBsZWFzZSByZXZpZXcgdGhlIGxvZyBmaWxlcyB1bmRlciB0aGUgZXhwb3J0IGRpcmVjdG9yeS4KLWV4cG9ydFhNTFNlcnZpY2VfZXJyb3I9RXJyb3IgZXhwb3J0aW5nIGxpYnJhcnk6IHswfQotZXhwb3J0WE1MU2VydmljZV9mZWF0dXJlX2Vycm9yPUVycm9yIHNldHRpbmcgZmVhdHVyZSB2YWx1ZTo6IEVsZW1lbnQ9ezB9LCBmZWF0dXJlPXsxfQoteG1sTGlicmFyeV9lcnJvcl9sb2FkX3htbD1VbmFibGUgdG8gbG9hZCBYTUwgc291cmNlICcnezB9JycKLXhtbExpYnJhcnlfbm9fcGx1Z2luPU5vIG1ldGhvZCBwbHVnLWluIGZvciBpZCB7MH0KLXhtbExpYnJhcnlfbm9fZmVhdHVyZT1VbmFibGUgdG8gZ2V0IFhNTCBmZWF0dXJlIGZvciB7MH1fezF9Ci14bWxMaWJyYXJ5X25vX2NsYXNzPVVuYWJsZSB0byBnZXQgRUNsYXNzIGZvciB7MH0KLXhtbExpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9RXJyb3IgY3JlYXRpbmcgZWxlbWVudCwgZG8gbm90IGtub3cgaG93IHRvIHNldCB2YWx1ZSBmb3IgZmVhdHVyZSB7MH0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlPUVycm9yIGNyZWF0aW5nIGVsZW1lbnQsIGNhbm5vdCBzZXQgdmFsdWUgezB9IHRvIGNvbnRhaW5lciB7MX0KLXhtbExpYnJhcnlfaW52YWxpZF9mZWF0dXJlX3ZhbHVlPUludmFsaWQgYXR0cmlidXRlIGZlYXR1cmUgdmFsdWUgZm9yIGZlYXR1cmUgezB9LCB3aXRoIHZhbHVlIHsxfQoteG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMj1FcnJvciBzZXR0aW5nIGF0dHJpYnV0ZSwgVW5hYmxlIHRvIHNldCB2YWx1ZSBmb3IgZmVhdHVyZT17MH0sIG9iamVjdD17MX0sIHZhbHVlPXsyfQoteG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMz1Eb24nJ3Qga25vdyBob3cgdG8gc2V0IHZhbHVlIGZvciBmZWF0dXJlPXswfSwgb2JqZWN0PXsxfSwgdmFsdWU9ezJ9Ci14bWxMaWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2U9RXJyb3Igc2V0dGluZyByZWZlcmVuY2UsIFVuYWJsZSB0byBzZXQgdmFsdWUgZm9yIGZlYXR1cmU9ezB9LCBvYmplY3Q9ezF9LCB2YWx1ZT17Mn0KLXhtbExpYnJhcnlfZXJyb3JfcHJvY2Vzc193cm9uZ19jb250YWluZXI9UHJvY2VzcyAnJ3swfScnIGRvZXMgbm90IGhhdmUgYSB2YWxpZCBjb250YWluZXIuIFRoZSBjb250YWluZXIgaXMgb2YgdHlwZSAnJ3sxfScnLCB3aGljaCBpcyBub3QgYSBwcm9jZXNzIHBhY2thZ2UuCi14bWxMaWJyYXJ5X25ld19pZD1FbGVtZW50IHswfSBpcyBhc3NpZ25lZCB3aXRoIGEgbmV3IGlkIHsxfSBiZWNhdXNlIGl0IGRvZXMgbm90IGhhdmUgYSB2YWxpZCBvbmUKLXhtbExpYnJhcnlfaWRfbm90X3VuaXF1ZT1FbGVtZW50IElkICcnezB9JycgaXMgdXNlZCBieSBtb3JlIHRoYW4gb25lIGVsZW1lbnQKLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwOTk4OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGFjdGl2YXRvciBmb3IgbWFuYWdpbmcgdGhlIEV4cG9ydCBYTUwgcGx1Zy1pbidzIGxpZmUgY3ljbGUuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3ByZWZlcmVuY2VzL0V4cG9ydFhNTFByZWZlcmVuY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvcHJlZmVyZW5jZXMvRXhwb3J0WE1MUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA1ZmJjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvcHJlZmVyZW5jZXMvRXhwb3J0WE1MUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzLkV4cG9ydFhNTERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIFRoZSBFeHBvcnQgWE1MIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFhNTFByZWZlcmVuY2VzIHsKLQotCS8qKgotCSAqIFRoZSBleHBvcnQgdHlwZSBwcmVmZXJlbmNlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfVFlQRSA9ICJleHBvcnRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4cG9ydGVkIFhNTCBmaWxlIHByZWZlcmVuY2Uga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9GSUxFID0gInhtbEZpbGUiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgewotCQkvLyBJbml0aWFsaXplIHRoZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzLgotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChFWFBPUlRfVFlQRSwgRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX0xJQlJBUlkpOyAKLQkJc3RvcmUuc2V0RGVmYXVsdChYTUxfRklMRSwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXhwb3J0IHR5cGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBleHBvcnQgdHlwZSBwcmVmZXJlbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0RXhwb3J0VHlwZSgpIHsKLQkJcmV0dXJuIEV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0SW50KAotCQkJCUVYUE9SVF9UWVBFKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBleHBvcnRlZCB0eXBlIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIGV4cG9ydFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB1c2VyIHNwZWNpZmllZCBleHBvcnQgdHlwZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRFeHBvcnRUeXBlKGludCBleHBvcnRUeXBlKSB7Ci0JCUV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoRVhQT1JUX1RZUEUsCi0JCQkJZXhwb3J0VHlwZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXhwb3J0ZWQgWE1MIGZpbGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBleHBvcnRlZCBYTUwgZmlsZSBwcmVmZXJlbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0WE1MRmlsZSgpIHsKLQkJcmV0dXJuIEV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCVhNTF9GSUxFKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBleHBvcnRlZCBYTUwgZmlsZSBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgYWJzb2x1dGUgcGF0aCB0byBhIFhNTCBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFhNTEZpbGUoU3RyaW5nIHBhdGgpIHsKLQkJRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShYTUxfRklMRSwKLQkJCQlwYXRoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmMyMGM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBwcmVmZXJlbmNlIHN1cHBvcnQgZm9yIHRoZSBFeHBvcnQgWE1MIHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0V4cG9ydFJlc291cmNlSGFuZGxlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0V4cG9ydFJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjQwZjQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLkJhc2VSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLlVybEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSByZXNvdXJjZSBoYW5kbGVyIGZvciBjb250ZW50IGluIHRoZSBleHBvcnRlZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0UmVzb3VyY2VIYW5kbGVyIGV4dGVuZHMgQmFzZVJlc291cmNlSGFuZGxlciB7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0UmVzb3VyY2VIYW5kbGVyKEZpbGUgc291cmNlTGliUm9vdCwgRmlsZSB0YXJnZXRMaWJSb290KSB7Ci0JCXN1cGVyKHNvdXJjZUxpYlJvb3QsIHRhcmdldExpYlJvb3QpOwotCX0KLQotCS8qKgotCSAqIHJlc29sdmUgdGhlIHVybC4gRm9yIFhNTCBleHBvcnQsIHdlIHNob3VsZCByZXNlcnZlIHRoZSByZXNvdXJjZSBsb2NhdGlvbnMuCi0JICovCi0JcHVibGljIFVybEluZm8gcmVzb2x2ZUZpbGVVcmwoT2JqZWN0IG93bmVyLCBTdHJpbmcgc3JjVXJsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGxvYWRVcmxJbmZvV2l0aEZpeGVkUGF0aChvd25lciwgc3JjVXJsKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiB0aGUgcmVzb3VyY2UgcGF0aCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBsaWJhcnkgcm9vdC4gdXJscyBuZWVkcyB0byBiZQotCSAqIGZpeGVkCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICB0aGUgb3duZXIgb2JqZWN0IGluIHRoZSB0YXJnZXQgbGlicmFyeQotCSAqIEBwYXJhbSBzcmNVcmwKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBVcmxJbmZvIGxvYWRVcmxJbmZvV2l0aEZpeGVkUGF0aChPYmplY3Qgb3duZXIsIFN0cmluZyBzcmNVcmwpIHsKLQkJVXJsSW5mbyBpbmZvID0gbmV3IFVybEluZm8oKTsKLQkJaW5mby5zb3VyY2VVcmwgPSBzcmNVcmw7Ci0JCWluZm8udGFyZ2V0VXJsID0gc3JjVXJsOwotCQlTdHJpbmcgc3JjRmlsZSA9IGdldEZpbGVSZWxQYXRoKG93bmVyLCBzcmNVcmwpOwotCQlvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50IG93bmVyRWxlbSA9IG51bGw7Ci0JCWlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQpIHsKLQkJCW93bmVyRWxlbSA9IChvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50KSBvd25lcjsKLQkJfQotCQlpZiAoc3JjRmlsZSAhPSBudWxsICYmIG93bmVyRWxlbSAhPSBudWxsKSB7CQkJCi0JCQlNZXRob2RQbHVnaW4gc3JjUGx1Z2luID0gZ2V0U291cmNlUGx1Z2luKG93bmVyRWxlbSk7Ci0JCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciBsaWJSZXNNZ3IgPSBSZXNvdXJjZUhlbHBlci5nZXRSZXNvdXJjZU1ncihzcmNQbHVnaW4pOwotCQkJU3RyaW5nIHNyY1BsdWdpblBhdGggPSBsaWJSZXNNZ3IuZ2V0UGh5c2ljYWxQbHVnaW5QYXRoKHNyY1BsdWdpbik7Ci0JCQlGaWxlIHNyY1Jvb3QgPSAobmV3IEZpbGUoc3JjUGx1Z2luUGF0aCkpLmdldFBhcmVudEZpbGUoKTsKLQkJCQotCQkJaW5mby5zb3VyY2VGaWxlID0gbmV3IEZpbGUoc3JjUm9vdCwgc3JjRmlsZSk7Ci0JCQlpZiAoIWluZm8uc291cmNlRmlsZS5pc0ZpbGUoKSB8fCAhaW5mby5zb3VyY2VGaWxlLmV4aXN0cygpKSB7Ci0JCQkJU3RyaW5nIG5ld1NyY0ZpbGUgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCW5ld1NyY0ZpbGUgPSBOZXRVdGlsLmRlY29kZVVSTChzcmNGaWxlKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCQlpZiAobmV3U3JjRmlsZSAhPSBudWxsKSB7Ci0JCQkJCXNyY0ZpbGUgPSBuZXdTcmNGaWxlOwotCQkJCQlpbmZvLnNvdXJjZUZpbGUgPSBuZXcgRmlsZShzcmNSb290LCBzcmNGaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpbmZvLnRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXRMaWJSb290LCBzcmNGaWxlKTsKLQkJCWluZm8udGFyZ2V0VXJsID0gc3JjRmlsZS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLQkJfQotCi0JCXJldHVybiBpbmZvOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgTWV0aG9kUGx1Z2luIGdldFNvdXJjZVBsdWdpbihvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50IG93bmVyRWxlbSkgewotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQob3duZXJFbGVtLmdldElkKCkpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRGaWxlUmVsUGF0aChPYmplY3Qgb3duZXIsIFN0cmluZyBzcmNVcmwpIHsKLQkJdHJ5IHsKLQkJCWlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgaWQgPSAoKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQpIG93bmVyKQotCQkJCQkJLmdldElkKCk7Ci0JCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQoaWQpOwotCQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlGaWxlIGYgPSBuZXcgRmlsZShuZXcgRmlsZShzb3VyY2VMaWJSb290LAotCQkJCQkJCQlSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChlbGVtZW50KSksIHNyY1VybCk7Ci0JCQkJCQlTdHJpbmcgcGF0aCA9IGYuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJCQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKHNvdXJjZUxpYlJvb3QuZ2V0Q2Fub25pY2FsUGF0aCgpCi0JCQkJCQkJCS5sZW5ndGgoKSArIDEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBMb2cgZXJyb3IgaGVyZQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogY29weWluZyB0aGUgcmVzb3VyY2UgZmlsZSBmcm9tIHRoZSBzb3VyY2UgbGlicmFyeSB0byB0aGUgdGFyZ2V0Ci0JICogCi0JICogQHBhcmFtIHNvdXJjZUZpbGUgdGhlIGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgc291cmNlIHJvb3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmVzb3VyY2UoU3RyaW5nIHNvdXJjZUZpbGUsIEVPYmplY3Qgb2JqLCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiB1bWFQbHVnaW4pIHsKLQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgbGliUmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3IodW1hUGx1Z2luKTsKLQkJU3RyaW5nIHNyY1BsdWdpblBhdGggPSBsaWJSZXNNZ3IuZ2V0UGh5c2ljYWxQbHVnaW5QYXRoKHVtYVBsdWdpbik7Ci0JCUZpbGUgc3JjUGx1Z2luUm9vdCA9IG5ldyBGaWxlKHNyY1BsdWdpblBhdGgpOwotCQkKLQkJRmlsZSBzcmMgPSBuZXcgRmlsZShzcmNQbHVnaW5Sb290LmdldFBhcmVudEZpbGUoKSwgc291cmNlRmlsZSk7Ci0JCWlmICggc3JjLmV4aXN0cygpICkgewotCQkJRmlsZSB0Z3QgPSBuZXcgRmlsZSh0YXJnZXRMaWJSb290LCBzb3VyY2VGaWxlKTsKLQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNyYywgdGd0KTsKLQkJfQotCX0KLQkKLS8vCS8qKgotLy8JICogdGhlIHJlc291cmNlIHBhdGggd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgb3duZXIgZWxlbWVudC4gdXJscyB3aWxsIG5vdCBiZQotLy8JICogY2hhbmdlZCBidXQgcmVzb3VyY2UgZmlsZXMgaXMgcmVsaWNhdGVkLgotLy8JICogCi0vLwkgKiBAcGFyYW0gb3duZXIKLS8vCSAqIEBwYXJhbSBzcmNVcmwKLS8vCSAqIEByZXR1cm4KLS8vCSAqLwotLy8JcHJpdmF0ZSBVcmxJbmZvIGxvYWRVcmxJbmZvV2l0aFJlbGF0aXZlUGF0aChPYmplY3Qgb3duZXIsIFN0cmluZyBzcmNVcmwpIHsKLS8vCQlVcmxJbmZvIGluZm8gPSBuZXcgVXJsSW5mbygpOwotLy8KLS8vCQl0cnkgewotLy8JCQlpbmZvLnNvdXJjZVVybCA9IHNyY1VybDsKLS8vCQkJaW5mby50YXJnZXRVcmwgPSBzcmNVcmw7IC8vIG5vIHVybCBjaGFuZ2UKLS8vCi0vLwkJCS8vIGdldCB0aGUgcm1jIG9iamVjdAotLy8JCQlpZiAob3duZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50KSB7Ci0vLwkJCQlTdHJpbmcgaWQgPSAoKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQpIG93bmVyKQotLy8JCQkJCQkuZ2V0SWQoKTsKLS8vCQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotLy8JCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0vLwkJCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0vLwkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gbWFuYWdlci5nZXRNZXRob2RFbGVtZW50KGlkKTsKLS8vCQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0vLwkJCQkJCUZpbGUgZiA9IG5ldyBGaWxlKG5ldyBGaWxlKHNvdXJjZUxpYlJvb3QsCi0vLwkJCQkJCQkJUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoZWxlbWVudCkpLCBzcmNVcmwpOwotLy8JCQkJCQlmID0gZi5nZXRDYW5vbmljYWxGaWxlKCk7Ci0vLwotLy8JCQkJCQlpbmZvLnNvdXJjZUZpbGUgPSBmOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotLy8KLS8vCQkJaW5mby50YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0TGliUm9vdCwgc3JjVXJsKQotLy8JCQkJCS5nZXRDYW5vbmljYWxGaWxlKCk7Ci0vLwotLy8JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLS8vCQkJLy8gbG9nIGVycm9yIFRPRE8KLS8vCQl9Ci0vLwkJcmV0dXJuIGluZm87Ci0vLwl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRYTUxEYXRhLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0WE1MRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjk0MDJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRYTUxEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBTdG9yZXMgdGhlIHNlbGVjdGlvbnMgYW5kIHNldHRpbmdzIG1hZGUgYnkgdGhlIHVzZXIgaW4gdGhlIEV4cG9ydCBYTUwgd2l6YXJkLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRYTUxEYXRhIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUE9SVF9NRVRIT0RfTElCUkFSWSA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBPUlRfTUVUSE9EX1BMVUdJTlMgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQT1JUX01FVEhPRF9DT05GSUdTID0gMzsKLQotCXByb3RlY3RlZCBpbnQgZXhwb3J0VHlwZSA9IEVYUE9SVF9NRVRIT0RfTElCUkFSWTsKLQotCXByb3RlY3RlZCBMaXN0IHNlbGVjdGVkUGx1Z2luczsKLQkKLQlwcm90ZWN0ZWQgSGFzaFNldCBhc3NvY2lhdGVkQ29uZmlnczsKLQotCXByb3RlY3RlZCBMaXN0IHNlbGVjdGVkQ29uZmlnczsKLQotCXByb3RlY3RlZCBTdHJpbmcgeG1sRmlsZTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGV4cG9ydCB0eXBlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHR5cGUgb2YgZXhwb3J0IG9wZXJhdGlvbiB0byBwZXJmb3JtLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXhwb3J0VHlwZSgpIHsKLQkJcmV0dXJuIGV4cG9ydFR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgZXhwb3J0IHR5cGUuCi0JICogCi0JICogQHBhcmFtIGV4cG9yVHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgZXhwb3J0IG9wZXJhdGlvbiB0byBwZXJmb3JtCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwb3J0VHlwZShpbnQgZXhwb3J0VHlwZSkgewotCQl0aGlzLmV4cG9ydFR5cGUgPSBleHBvcnRUeXBlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc2VsZWN0ZWQgbWV0aG9kIHBsdWctaW5zLgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIG1ldGhvZCBwbHVnLWlucwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlbGVjdGVkUGx1Z2lucygpIHsKLQkJcmV0dXJuIHNlbGVjdGVkUGx1Z2luczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhc3NvY2lhdGVkIGNvbmZpZ3Mgd2l0aCByZXNwZWN0ZWQgdG8gc2VsZWN0ZWQgcGx1Zy1pbnMKLQkgKiAKLQkgKiBAcGFyYW0gYXNzb2NpYXRlZENvbmZpZ01hcAotCSAqICAgICAgICAgICBNYXAgb2Ygc2VsZWN0ZWQgcGx1Zy1pbnMgdG8gYXNzb2NpYXRlZCBjb25maWdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXNzb2NpYXRlZENvbmZpZ3MoTWFwIGFzc29jaWF0ZWRDb25maWdNYXApIHsKLQkJaWYgKGFzc29jaWF0ZWRDb25maWdNYXAgPT0gbnVsbCB8fCBhc3NvY2lhdGVkQ29uZmlnTWFwLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWFzc29jaWF0ZWRDb25maWdzID0gbmV3IEhhc2hTZXQoKTsgCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBhc3NvY2lhdGVkQ29uZmlnTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUxpc3QgY29uZmlnTGlzdCA9IChMaXN0KSBpdC5uZXh0KCk7Ci0JCQlpbnQgc3ogPSBjb25maWdMaXN0ID09IG51bGwgPyAwIDogY29uZmlnTGlzdC5zaXplKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8c3o7IGkrKykgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNvbmZpZ0xpc3QuZ2V0KGkpOwotCQkJCWlmICghYXNzb2NpYXRlZENvbmZpZ3MuY29udGFpbnMoY29uZmlnLmdldEd1aWQoKSkpIHsKLQkJCQkJYXNzb2NpYXRlZENvbmZpZ3MuYWRkKGNvbmZpZy5nZXRHdWlkKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVzZXIgc2VsZWN0ZWQgbWV0aG9kIHBsdWctaW5zLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW5zCi0JICogICAgICAgICAgICBhIGxpc3Qgb2YgbWV0aG9kIHBsdWctaW5zCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRQbHVnaW5zKExpc3QgcGx1Z2lucykgewotCQlzZWxlY3RlZFBsdWdpbnMgPSBwbHVnaW5zOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBtZXRob2QgY29uZmlndXJhdGlvbnMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZWxlY3RlZENvbmZpZ3MoKSB7Ci0JCXJldHVybiBzZWxlY3RlZENvbmZpZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdXNlciBzZWxlY3RlZCBtZXRob2QgY29uZmlndXJhdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3MKLQkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBtZXRob2QgY29uZmlndXJhdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZENvbmZpZ3MoTGlzdCBjb25maWdzKSB7Ci0JCXNlbGVjdGVkQ29uZmlncyA9IGNvbmZpZ3M7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgZGVzdGluYXRpb24gWE1MIGZpbGUuCi0JICogCi0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBYTUwgZmlsZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0WE1MRmlsZSgpIHsKLQkJcmV0dXJuIHhtbEZpbGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgZGVzdGluYXRpb24gWE1MIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHhtbEZpbGUKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIFhNTCBmaWxlCi0JICovCi0JcHVibGljIHZvaWQgc2V0WE1MRmlsZShTdHJpbmcgeG1sRmlsZSkgewotCQl0aGlzLnhtbEZpbGUgPSB4bWxGaWxlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0V4cG9ydFhNTExvZ2dlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0V4cG9ydFhNTExvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTUzMzQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRYTUxMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLkZpbGVMb2dnZXI7Ci0KLQotLyoqCi0gKiBMb2dnZXIgY2xhc3MgZm9yIHhtbCBleHBvcnQKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRYTUxMb2dnZXIgZXh0ZW5kcyBGaWxlTG9nZ2VyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dTX0ZPTERFUiA9ICJsb2dzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydFhNTExvZ2dlcihGaWxlIGxvZ1Jvb3QpIHsKLQkJc3VwZXIobmV3IEZpbGUobG9nUm9vdCwgTE9HU19GT0xERVIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0WE1MU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0V4cG9ydFhNTFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0ODU3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0WE1MU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5FRGF0YU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuQ29udGVudFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuSVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLkRpYWdyYW1JbWFnZVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5EaWFncmFtSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5FeHBvcnRYTUxQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklDb25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLk1pZ3JhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBYbWxFeHBvcnQgc2VydmljZSBjbGFzcyB0byBwcm9jZXNzIHRoZSBleHBvcnRpbmcgdGFzawotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0WE1MU2VydmljZSB7Ci0KLQkvLyBTdHJpbmcgeG1sUGF0aDsKLQlwcml2YXRlIEV4cG9ydFhNTERhdGEgZGF0YTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZGVidWcgPSBFeHBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQlwcml2YXRlIFhNTExpYnJhcnkgeG1sTGliOwotCi0JcHJpdmF0ZSBMaXN0IGRpc2NhcmRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JRXhwb3J0WE1MTG9nZ2VyIGxvZ2dlciA9IG51bGw7Ci0KLQkvLyBpbiBjYXNlIHdlIG5lZWQgdG8gbWFwcGluZyB0aGUgdW1hIG9iamVjdHMgdG8geG1sIG9iamVjdHMKLQkvLyBzdWNoIGFzIHRoZSBjb250ZW50IGNhdGVnb3JpZXMKLQlwcml2YXRlIE1hcCB1bWFJZFRvWG1sSWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByaXZhdGUgRGlhZ3JhbUhhbmRsZXIgZGlhZ3JhbUhhbmRsZXI7Ci0JCi0JLy90ZHMgd2l0aCBzdGVwcwotCXByaXZhdGUgTWFwPFN0cmluZywgVGFza0Rlc2NyaXB0b3I+IHRkTWFwOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0WE1MU2VydmljZShFeHBvcnRYTUxEYXRhIGRhdGEpIHsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQkJbG9nZ2VyID0gbmV3IEV4cG9ydFhNTExvZ2dlcihuZXcgRmlsZSh0aGlzLmRhdGEueG1sRmlsZSkKLQkJCQkuZ2V0UGFyZW50RmlsZSgpKTsKLQl9Ci0JLyoqCi0JICogR2V0cyB0aGUgbG9nZ2VyIGZpbGUuCi0JICovCi0JcHVibGljIEZpbGUgZ2V0TG9nUGF0aCgpIHsKLQkJcmV0dXJuIGxvZ2dlci5nZXRMb2dQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWxvZ2dlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogRG9lcyBYTUwgbGlicmFyeSBleHBvcnQuCi0JICovCi0JcHVibGljIHZvaWQgZG9FeHBvcnQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0KLQkJCUlSZXNvdXJjZUhhbmRsZXIgaGFuZGxlciA9IG5ldyBFeHBvcnRSZXNvdXJjZUhhbmRsZXIoCi0JCQkJCW5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpKSwgbmV3IEZpbGUoZGF0YQotCQkJCQkJCS5nZXRYTUxGaWxlKCkpLmdldFBhcmVudEZpbGUoKSk7Ci0JCQlDb250ZW50UHJvY2Vzc29yIGNvbnRlbnRQcm9jID0gbmV3IENvbnRlbnRQcm9jZXNzb3IoaGFuZGxlciwKLQkJCQkJdGhpcy5sb2dnZXIpOwotCQkJCi0JCQlkaWFncmFtSGFuZGxlciA9IG5ldyBEaWFncmFtSGFuZGxlcigKLQkJCQkJbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkpLCBuZXcgRmlsZShkYXRhCi0JCQkJCQkJLmdldFhNTEZpbGUoKSkuZ2V0UGFyZW50RmlsZSgpKSB7Ci0JCQkJCi0JCQkJcHVibGljIHZvaWQgdmlzaXRFbGVtZW50TWFwKGludCBwYXNzSWQpIHsKLQkJCQkJaWYgKHBhc3NJZCAhPSAwKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLS8qCQkJCQlTdHJpbmcgbGliRm9sZGVyUGF0aCA9IGdldFNvdXJjZUxpYlJvb3QoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQkJaW50IGl4ID0gbGliRm9sZGVyUGF0aC5sZW5ndGgoKTsqLwotCQkJCQkKLQkJCQkJTWFwPFN0cmluZywgTWFwRW50cnlWYWx1ZT4gbWFwID0gZ2V0RWxlbWVudE1hcCgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yPE1hcEVudHJ5VmFsdWU+IGl0ID0gbWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJCQlNYXBFbnRyeVZhbHVlIHZhbHVlID0gaXQubmV4dCgpOwotCQkJCQkJaWYgKHZhbHVlLnRhcmdldEZpbGUgPT0gbnVsbCkgewotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfSBlbHNlIGlmICh2YWx1ZS5zb3VyY2VGaWxlICE9IG51bGwpIHsKLQkJCQkJCQlFRGF0YU9iamVjdCB4bWxPYmogPSBnZXRYbWxPYmplY3QodmFsdWUuZWxlbWVudCk7Ci0JCQkJCQkJaWYgKHhtbE9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MpIHsKLQkJCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBwcm9jID0gCi0JCQkJCQkJCQkJCQkJKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MpIHhtbE9iajsKLQkJCQkJCQkJU3RyaW5nIHVyaSA9IHZhbHVlLnNvdXJjZUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJCQkJCVN0cmluZyBzcmNSb290Rm9sZGVyUGF0aCA9IGdldFJvb3QodmFsdWUuZWxlbWVudCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJCQkJCWludCBpeCA9IHNyY1Jvb3RGb2xkZXJQYXRoLmxlbmd0aCgpOwotCQkJCQkJCQkKLQkJCQkJCQkJdXJpID0gdXJpLnN1YnN0cmluZyhpeCArIDEpOwotCQkJCQkJCQl1cmkgPSBVUkkuY3JlYXRlRmlsZVVSSSh1cmkpLnRvU3RyaW5nKCk7Ci0JCQkJCQkJCXByb2Muc2V0RGlhZ3JhbVVSSSh1cmkpOwotCQkJCQkJCX0JCQotCQkJCQkJfSAKLQkJCQkJfQkKLQkJCQl9Ci0JCQkJCi0JCQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCQkJc3VwZXIuZXhlY3V0ZSgpOwotCQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJZXhwb3J0RGlhZ3JhbUltYWdlRmlsZXMoKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCi0JCQkJcHJpdmF0ZSB2b2lkIGV4cG9ydERpYWdyYW1JbWFnZUZpbGVzKCkgewotCQkJCQlTdHJpbmcgZm9sZGVyUGF0aCA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpOwotCQkJCQkKLQkJCQkJRGlhZ3JhbUltYWdlU2VydmljZSBkaWFncmFtU2VydmljZSA9IG5ldyBEaWFncmFtSW1hZ2VTZXJ2aWNlKG51bGwpOwotCQkJCQlkaWFncmFtU2VydmljZS5zZXRGb3JYTUxFeHBvcnQodHJ1ZSk7Ci0JCQkJCQotCQkJCQl0cnkgewotCQkJCQkJTWFwPFN0cmluZywgTWFwRW50cnlWYWx1ZT4gbWFwID0gZ2V0RWxlbWVudE1hcCgpOwotCQkJCQkJZm9yIChJdGVyYXRvcjxNYXBFbnRyeVZhbHVlPiBpdCA9IG1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCQkJCU1hcEVudHJ5VmFsdWUgdmFsdWUgPSBpdC5uZXh0KCk7Ci0JCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSB2YWx1ZS5lbGVtZW50OwotCQkJCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gcHJvYy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJCQkJCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0Q29uZmlnKGNvbmZpZyk7Ci0JCQkJCQkJSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIG1nciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlnKTsKLQkJCQkJCQlpZiAobWdyID09IG51bGwpIHsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJCUVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1nciA9IG1nci5nZXRFbGVtZW50TGF5b3V0TWFuYWdlcigpOwotCQkJCQkJCWlmIChsYXlvdXRNZ3IgPT0gbnVsbCkgewotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJSUZpbHRlciBmaWx0ZXIgPSBsYXlvdXRNZ3IuZ2V0RGlhZ3JhbUFkYXB0ZXJGYWN0b3J5KCkuZ2V0RmlsdGVyKCk7Ci0JCQkJCQkJCi0JCQkJCQkJRmlsZSBkaWFncmFtWG1pRmlsZSA9IHZhbHVlLnRhcmdldEZpbGU7Ci0JCQkJCQkJaWYgKGRpYWdyYW1YbWlGaWxlID09IG51bGwgfHwgIWRpYWdyYW1YbWlGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLQkJCQkJCQlkaWFncmFtU2VydmljZS5zZXRQdWJEaXIoZGlhZ3JhbVhtaUZpbGUuZ2V0UGFyZW50RmlsZSgpKTsKLQkJCQkJCQkKLQkJCQkJCQlNYXAgYWN0aXZpdGllcyA9IE1pZ3JhdGlvblV0aWwuZ2V0QWN0aXZpdGllcyhwcm9jLCB0cnVlKTsJCi0JCQkJCQkJZm9yIChBY3Rpdml0eSBhY3Q6IChDb2xsZWN0aW9uPEFjdGl2aXR5PikgYWN0aXZpdGllcy52YWx1ZXMoKSkgewotCQkJCQkJCQlTdHJpbmdbXSB0eXBlcyA9IHsJUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XLAotCQkJCQkJCQkJCQkJCVJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUwsCi0JCQkJCQkJCQkJCQkJUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1l9OwotCQkJCQkJCQkKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQkJU3RyaW5nIGltYWdlUGF0aCA9IFJlc291cmNlSGVscGVyLmdldFhtbEV4cG9ydGVkRGlhZ3JhbUltYWdlRmlsZU5hbWUoYWN0LCB0eXBlc1tpXSwgUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSlBFRyk7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCWRpYWdyYW1TZXJ2aWNlLnNhdmVEaWFncmFtKGFjdCwgaW1hZ2VQYXRoLCB0eXBlc1tpXSwgZmlsdGVyLCBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihwcm9jKSk7Ci0JCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQkJCQlsb2dnZXIubG9nRXJyb3IoTkxTLmJpbmQoRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydFhNTFNlcnZpY2VfZXJyb3IsCi0JCQkJCQkJCQkJCQkJZS5nZXRNZXNzYWdlKCkpLCBlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCWxvZ2dlci5sb2dFcnJvcihOTFMuYmluZChFeHBvcnRYTUxSZXNvdXJjZXMuZXhwb3J0WE1MU2VydmljZV9lcnJvciwKLQkJCQkJCQkJCWUuZ2V0TWVzc2FnZSgpKSwgZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZmluYWxseSB7CQkJCQkJCQkJCQotCQkJCQkJZGlhZ3JhbVNlcnZpY2UuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQotCQkJLy8gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UucHJpbnRGZWF0dXJlTmFtZU1hcHBpbmcoKTsKLQotCQkJLy8gZXhwb3J0IHRoZSBjdXJyZW50IGxpYnJhcnkgdG8gdGhlIHhtbCBmaWxlCi0JCQkvLyBnZXQgdGhlIGN1cnJlbnQgbGlicmFyeSBpbnN0YW5jZSBhbmQgZXhwb3J0IGFsbCB0byB0aGUgeG1sCi0JCQlNZXRob2RMaWJyYXJ5IHNyYyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkJCXRoaXMueG1sTGliID0gbmV3IFhNTExpYnJhcnkoY29udGVudFByb2MsIGxvZ2dlciwgZGF0YQotCQkJCQkuZ2V0WE1MRmlsZSgpKTsKLQotCQkJdGhpcy54bWxMaWIuY3JlYXRlTGlicmFyeShzcmMuZ2V0R3VpZCgpLCBzcmMuZ2V0TmFtZSgpKTsKLQkJCUVEYXRhT2JqZWN0IHRhcmdldCA9IHRoaXMueG1sTGliLmdldFJvb3QoKTsKLQotCQkJY3JlYXRFRGF0YU9iamVjdFRyZWUoc3JjLCB0YXJnZXQpOwotCQkJaXRlcmF0RURhdGFPYmplY3Qoc3JjKTsKLQotCQkJdGhpcy54bWxMaWIuZml4TGlicmFyeUZvckV4cG9ydCgpOwotCQkJdGhpcy54bWxMaWIuZml4VGFza0Rlc2NyaXB0b3JzRm9yRXhwb3J0KHRkTWFwKTsKLQkJCQotCQkJZGlhZ3JhbUhhbmRsZXIudmlzaXRFbGVtZW50TWFwKDApOwotCQkJaWYgKGRhdGEuZXhwb3J0VHlwZSA9PSBFeHBvcnRYTUxEYXRhLkVYUE9SVF9NRVRIT0RfUExVR0lOUykgewotCQkJCXhtbExpYi5zdG9yZUV4dHJhSW5mbyhzcmMuZ2V0TWV0aG9kUGx1Z2lucygpKTsKLQkJCX0KLQkJCXRoaXMueG1sTGliLnNhdmUoKTsKLQkJCWRpYWdyYW1IYW5kbGVyLmV4ZWN1dGUoKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKE5MUy5iaW5kKEV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRYTUxTZXJ2aWNlX2Vycm9yLAotCQkJCQllLmdldE1lc3NhZ2UoKSksIGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUGx1Z2luU2VsZWN0ZWQoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlpZiAoZGF0YS5leHBvcnRUeXBlID09IEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9MSUJSQVJZKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChkYXRhLmV4cG9ydFR5cGUgPT0gRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX1BMVUdJTlMpIHsKLQkJCXJldHVybiAoZGF0YS5zZWxlY3RlZFBsdWdpbnMgIT0gbnVsbCkKLQkJCQkJJiYgZGF0YS5zZWxlY3RlZFBsdWdpbnMuY29udGFpbnMocGx1Z2luKTsKLQkJfSBlbHNlIGlmIChkYXRhLmV4cG9ydFR5cGUgPT0gRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX0NPTkZJR1MpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29uZmlnRXhjbHVkZWQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJaWYgKGRhdGEuZXhwb3J0VHlwZSA9PSBFeHBvcnRYTUxEYXRhLkVYUE9SVF9NRVRIT0RfUExVR0lOUykgewotCQkJcmV0dXJuIGRhdGEuYXNzb2NpYXRlZENvbmZpZ3MgPT0gbnVsbCB8fCAKLQkJCQkJIWRhdGEuYXNzb2NpYXRlZENvbmZpZ3MuY29udGFpbnMoY29uZmlnLmdldEd1aWQoKSk7Ci0JCX0gCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0RURhdGFPYmplY3RUcmVlKE1ldGhvZEVsZW1lbnQgc3JjT2JqLAotCQkJRURhdGFPYmplY3QgdGFyZ2V0T2JqKSB7Ci0KLQkJLy8gaWYgaXQncyBhIHBsdWdpbiwgc2tpcCBhbGwgdGhlIHN5c3RlbSBwYWNrYWdlcwotCQkvLyBhbmQgZmluZCB0aGUgdG9wIG1vc3QgdXNlciBwYWNrYWdlcwotCQlpZiAoc3JjT2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0KLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBzcmNPYmo7Ci0JCQlpZiAoIWlzUGx1Z2luU2VsZWN0ZWQocGx1Z2luKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gYWxsIHN5c3RlbSBwYWNrYWdlcyBhcmUgZGlzY2FyZGVkCi0JCQlkaXNjYXJkZWRFbGVtZW50cy5hZGRBbGwoVG5nVXRpbC5nZXRBbGxTeXN0ZW1QYWNrYWdlcyhwbHVnaW4pKTsKLQotCQkJTGlzdCB0b3Btb3N0VXNlclBhY2thZ2VzID0gZ2V0VG9wbW9zdFVzZXJQYWNrYWdlKHBsdWdpbik7Ci0JCQlMaXN0IGNhdGVnb3J5UGtncyA9IFRuZ1V0aWwuZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZXMocGx1Z2luKTsKLQotCQkJb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZSB4bWxQa2cgPSAob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZSkgdGhpcy54bWxMaWIKLQkJCQkJLmdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UocGx1Z2luLmdldEd1aWQoKSk7Ci0JCQlTdHJpbmcgY29udGVudENhdGVnb3J5UGFja2FnZUlkID0geG1sUGtnLmdldElkKCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRwID0gdG9wbW9zdFVzZXJQYWNrYWdlcy5pdGVyYXRvcigpOyBpdHAuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gKE1ldGhvZFBhY2thZ2UpIGl0cC5uZXh0KCk7Ci0KLQkJCQkvLyBpZiBpdCdzIGEgY2F0ZWdvcnkgcGFja2FnZSwKLQkJCQkvLyBjcmVhdGUgYWxsIGNvbnRhaW5lZCBlbGVtZW50cyBpbiB0aGUgc2luZ2xlIGN1c3RvbSBjYXRlZ29yeQotCQkJCS8vIHBhY2thZ2UKLQkJCQlpZiAoY2F0ZWdvcnlQa2dzLmNvbnRhaW5zKHBrZykpIHsKLQotCQkJCQkvLyBzZXQgdGhlIGl0IG1hcHBpbmcKLQkJCQkJc2V0SWRNYXBwaW5nKHBrZy5nZXRHdWlkKCksIGNvbnRlbnRDYXRlZ29yeVBhY2thZ2VJZCk7Ci0JCQkJCWNyZWF0RURhdGFPYmplY3RUcmVlKHBrZywgeG1sUGtnKTsKLQkJCQl9IGVsc2UgewotCQkJCQljcmVhdEVEYXRhT2JqZWN0VHJlZShwa2csIHRhcmdldE9iaik7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHNyY09iai5lQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG5leHRPYmogPSBpdC5uZXh0KCk7Ci0JCQkJTWV0aG9kRWxlbWVudCBjaGlsZCA9IG5leHRPYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ID8KLQkJCQkJCShNZXRob2RFbGVtZW50KSBuZXh0T2JqIDogbnVsbDsKLQkJCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQkvLyBpbiB1bWEgbW9kZWwsIFdvcmtPcmRlciBpcyBjb250YWluZWQgaW4gcGFja2FnZQotCQkJCS8vIGluIHhtbCBtb2RlbCwgV29ya09yZGVyIGlzIGNvbnRhaW5lZCBieSB0aGUgb3duaW5nCi0JCQkJLy8gV29ya0JyZWFrZG93bkVsZW1lbnQsCi0JCQkJLy8gc28gZGVsYXkgdGhlIGNyZWF0aW9uIGlmIHRoZSBvd25lciBpcyBhIHBhY2thZ2UKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBXb3JrT3JkZXIKLQkJCQkJCSYmIHNyY09iaiBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKChjaGlsZCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikKLQkJCQkJCSYmICFpc1BsdWdpblNlbGVjdGVkKChNZXRob2RQbHVnaW4pIGNoaWxkKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbiAmJgotCQkJCQlpc0NvbmZpZ0V4Y2x1ZGVkKChNZXRob2RDb25maWd1cmF0aW9uKSBjaGlsZCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKCFpc0Rpc2NhcmRlZChjaGlsZCkpIHsKLQkJCQkJY3JlYXRlWG1sT2JqZWN0KGNoaWxkLCB0YXJnZXRPYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRJZE1hcHBpbmcoU3RyaW5nIHVtYUlkLCBTdHJpbmcgeG1sSWQpIHsKLQkJaWYgKCF1bWFJZFRvWG1sSWRNYXAuY29udGFpbnNLZXkodW1hSWQpKSB7Ci0JCQl1bWFJZFRvWG1sSWRNYXAucHV0KHVtYUlkLCB4bWxJZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRYbWxJZChTdHJpbmcgdW1hSWQpIHsKLQkJaWYgKHVtYUlkVG9YbWxJZE1hcC5jb250YWluc0tleSh1bWFJZCkpIHsKLQkJCXJldHVybiAoU3RyaW5nKSB1bWFJZFRvWG1sSWRNYXAuZ2V0KHVtYUlkKTsKLQkJfQotCQlyZXR1cm4gdW1hSWQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRGlzY2FyZGVkKE9iamVjdCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGRpc2NhcmRlZEVsZW1lbnRzLmNvbnRhaW5zKG8pOwotCX0KLQotCXByaXZhdGUgRURhdGFPYmplY3QgZ2V0WG1sT2JqZWN0KE1ldGhvZEVsZW1lbnQgc3JjT2JqKSB7Ci0JCVN0cmluZyBpZCA9IHNyY09iai5nZXRHdWlkKCk7Ci0JCWlmICh1bWFJZFRvWG1sSWRNYXAuY29udGFpbnNLZXkoaWQpKSB7Ci0JCQlpZCA9IChTdHJpbmcpIHVtYUlkVG9YbWxJZE1hcC5nZXQoaWQpOwotCQl9Ci0JCXJldHVybiB0aGlzLnhtbExpYi5nZXRFbGVtZW50KGlkKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGUgYW4geG1sIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIsIGJhc2VkIG9uIHRoZSB1bWEgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSB1bWFFbGVtZW50Ci0JICogQHBhcmFtIHRhcmdldENvbnRhaW5lcgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVYbWxPYmplY3QoTWV0aG9kRWxlbWVudCB1bWFFbGVtZW50LAotCQkJRURhdGFPYmplY3QgdGFyZ2V0Q29udGFpbmVyKSB7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gdW1hRWxlbWVudC5lQ29udGFpbm1lbnRGZWF0dXJlKCk7Ci0JCWNyZWF0ZVhtbE9iamVjdCh1bWFFbGVtZW50LCB0YXJnZXRDb250YWluZXIsIGZlYXR1cmUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGUgYW4geG1sIGVsZW1lbnQgZm9yIHRoZSBjb250YWluZXIsIGJhc2VkIG9uIHRoZSB1bWEgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSB1bWFFbGVtZW50Ci0JICogQHBhcmFtIHRhcmdldENvbnRhaW5lcgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVYbWxPYmplY3QoTWV0aG9kRWxlbWVudCB1bWFFbGVtZW50LAotCQkJRURhdGFPYmplY3QgdGFyZ2V0Q29udGFpbmVyLCBTdHJpbmcgY29udGFpbm1lbnRGZWF0dXJlKSB7Ci0KLQkJdHJ5IHsKLQkJCWlmICh1bWFFbGVtZW50ID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIGdldCB0aGUgY29udGFpbm1lbnQgZmVhdHVyZSBzbyB3ZSBjYW4gY3JlYXRlIHRoZSBvYmplY3Qgb2YgdGhlCi0JCQkvLyBzYW1lIHR5cGUKLQkJCVN0cmluZyBlbGVtZW50VHlwZSA9IHVtYUVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKTsKLQkJCUVEYXRhT2JqZWN0IHhtbEVsZW1lbnQgPSB4bWxMaWIuY3JlYXRlRWxlbWVudCh0YXJnZXRDb250YWluZXIsCi0JCQkJCWNvbnRhaW5tZW50RmVhdHVyZSwgdW1hRWxlbWVudC5lQ2xhc3MoKS5nZXROYW1lKCksCi0JCQkJCWVsZW1lbnRUeXBlLCB1bWFFbGVtZW50LmdldEd1aWQoKSk7Ci0JCQkKLQkJCWlmICh1bWFFbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsJCQkJCQotCQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSB1bWFFbGVtZW50OwotCQkJCWlmICh0ZC5nZXRUYXNrKCkgIT0gbnVsbCkgewotCQkJCQlMaXN0IHN0ZXBzID0gdGQuZ2V0U2VsZWN0ZWRTdGVwcygpOwotCQkJCQlpZiAoc3RlcHMgIT0gbnVsbCAmJiAhc3RlcHMuaXNFbXB0eSgpKSB7Ci0JCQkJCQlpZiAodGRNYXAgPT0gbnVsbCkgewotCQkJCQkJCXRkTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUYXNrRGVzY3JpcHRvcj4oKTsKLQkJCQkJCX0KLQkJCQkJCXRkTWFwLnB1dCh0ZC5nZXRHdWlkKCksIHRkKTsKLQkJCQkJfQotCQkJCX0JCQkKLQkJCX0KLQkJCQotCQkJaWYgKHhtbEVsZW1lbnQgIT0gbnVsbCkgewotCi0JCQkJLy8gcmVjdXJzaXZlCi0JCQkJY3JlYXRFRGF0YU9iamVjdFRyZWUodW1hRWxlbWVudCwgeG1sRWxlbWVudCk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyB0aGUgZXJyb3IgYW5kIGNvbnRpbnVlPz8/Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGl0ZXJhdEVEYXRhT2JqZWN0KE1ldGhvZEVsZW1lbnQgc3JjT2JqKSB7Ci0JCWRpYWdyYW1IYW5kbGVyLnJlZ2lzdGVyRWxlbWVudChzcmNPYmosIHRydWUpOwotCQkKLQkJaWYgKHNyY09iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHNyY09iajsKLQkJCWlmICghaXNQbHVnaW5TZWxlY3RlZChwbHVnaW4pKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJaWYgKGlzUHJvY2Vzc2VkKHNyY09iai5nZXRHdWlkKCkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0UHJvY2Vzc2VkKHNyY09iai5nZXRHdWlkKCkpOwotCi0JCUVEYXRhT2JqZWN0IHRhcmdldE9iaiA9IGdldFhtbE9iamVjdChzcmNPYmopOwotCi0JCS8vIGlmIG9iamVjdCBpcyBub3QgY3JlYXRlZCwKLQkJLy8gd2hpY2ggbWVhbnMgaXQncyBlaXRoZXIgYSBzeXN0ZW0gcGFja2FnZSBvciBzb21ldGhpbmcgd3JvbmcKLQkJaWYgKHRhcmdldE9iaiA9PSBudWxsKSB7Ci0JCQlpZiAoc3JjT2JqIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCS8vIGl0ZXJhdGUgdGhlIGNoaWxkIHBhY2thZ2VzCi0JCQkJZm9yIChJdGVyYXRvciBpdCA9ICgoTWV0aG9kUGFja2FnZSkgc3JjT2JqKS5nZXRDaGlsZFBhY2thZ2VzKCkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCWl0ZXJhdEVEYXRhT2JqZWN0KChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gLy8gZWxlbWVudHMgY2FuIGJlIHJlZmVyZW5jZSBpbiBvdGhlciBwbHVnaW5zCi0JCQkvLyAvLyBkb24ndCBuZWVkIHRvIGNhcmUgYWJvdXQgdGhpcwotCQkJLy8gZWxzZSBpZiAoIWlzRGlzY2FyZGVkKHNyY09iaikgKSB7Ci0JCQkvLyBsb2dnZXIubG9nV2FybmluZygiV2FybmluZzogeG1sIG9iamVjdCBub3QgY3JlYXRlZCBmb3IgIiArCi0JCQkvLyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShzcmNPYmopICk7Ci0JCQkvLyB9Ci0KLQkJCXJldHVybjsKLQkJfQotCi0JCUVDbGFzcyBlQ2xhc3MgPSBzcmNPYmouZUNsYXNzKCk7Ci0KLQkJRUxpc3QgZmVhdHVyZXMgPSBlQ2xhc3MuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdC5uZXh0KCk7Ci0KLQkJCU9iamVjdCB2YWx1ZSA9IHNyY09iai5lR2V0KGZlYXR1cmUpOwotCi0JCQl0cnkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QgJiYgISBmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoIm1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIpKSB7Ly8kTk9OLU5MUy0xJAkKLQkJCQkJZm9yIChJdGVyYXRvciBpdHYgPSAoKExpc3QpIHZhbHVlKS5pdGVyYXRvcigpOyBpdHYKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJTWV0aG9kRWxlbWVudCBzcmNfdmFsdWUgPSAoTWV0aG9kRWxlbWVudCkgaXR2Lm5leHQoKTsKLQotCQkJCQkJLy8gaGFuZGxlIHRoZQotCQkJCQkJLy8gVW1hUGFja2FnZSNnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcgotCQkJCQkJLy8gZmVhdHVyZSB2YWx1ZQotCQkJCQkJLy8gdGhlIFdvcmtPcmRlciBpbiB1bWEgaXMgYSBwcm9jZXNzIGVsZW1lbnQgaW4gYQotCQkJCQkJLy8gcGFja2FnZQotCQkJCQkJLy8gaW4geG1sIG1vZGVsLCBpdCdzIGFuIEVEYXRhT2JqZWN0IGNvbnRhaW5lZCBieSB0aGUKLQkJCQkJCS8vIFdvcmtCcmVha2Rvd25FbGVtZW50Ci0JCQkJCQlpZiAoc3JjX3ZhbHVlIGluc3RhbmNlb2YgV29ya09yZGVyKSB7Ci0JCQkJCQkJLy8gZ2V0IHRoZSBvd25lciBvZiB0aGUgV29ya09yZGVyCi0JCQkJCQkJRURhdGFPYmplY3Qgd29ya09yZGVyID0gZ2V0WG1sT2JqZWN0KHNyY192YWx1ZSk7Ci0JCQkJCQkJaWYgKHdvcmtPcmRlciA9PSBudWxsKSB7Ci0JCQkJCQkJCWNyZWF0ZVhtbE9iamVjdChzcmNfdmFsdWUsIHRhcmdldE9iaiwgZmVhdHVyZQotCQkJCQkJCQkJCS5nZXROYW1lKCkpOwotCQkJCQkJCX0KLQkJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIndvcmtvcmRlciB2YWx1ZSIpOwotCQkJCQkJfQotCi0JCQkJCQkvLyBzZXQgdGhlIHJlZmVyZW5jZQotCQkJCQkJU3RyaW5nIHhtbElkID0gZ2V0WG1sSWQoc3JjX3ZhbHVlLmdldEd1aWQoKSk7Ci0JCQkJCQl4bWxMaWIuc2V0UmVmZXJlbmNlVmFsdWUodGFyZ2V0T2JqLCBmZWF0dXJlLmdldE5hbWUoKSwKLQkJCQkJCQkJeG1sSWQsIHNyY192YWx1ZS5nZXRUeXBlKCkpOwotCi0JCQkJCQlpdGVyYXRFRGF0YU9iamVjdChzcmNfdmFsdWUpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJLy8gZ2V0IHRoZSB4bWwgb2JqZWN0IGFuZCBpdGVyYXRlIGFnYWluCi0JCQkJCU1ldGhvZEVsZW1lbnQgc3JjX3ZhbHVlID0gKE1ldGhvZEVsZW1lbnQpIHZhbHVlOwotCi0JCQkJCS8vIGlmICggc3JjX3ZhbHVlIGluc3RhbmNlb2YgV29ya09yZGVyICkgewotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIndvcmtvcmRlciB2YWx1ZSIpOwotCQkJCQkvLyB9Ci0KLQkJCQkJLy8gZWxlbWVudHMgbGlrZSBQcmVzZW50YXRpb24gbWF5IG5vdCBoYXZlIGEgQ29udGVudAotCQkJCQkvLyBEZXNjcmlwdGlvbgotCQkJCQkvLyB0aGUgb25lIHJldHVybmVkIG1heSBub3QgaGF2ZSBhIGNvbnRhaW5lcgotCQkJCQlpZiAoc3JjX3ZhbHVlLmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgeG1sSWQgPSBnZXRYbWxJZChzcmNfdmFsdWUuZ2V0R3VpZCgpKTsKLQkJCQkJCXhtbExpYi5zZXRSZWZlcmVuY2VWYWx1ZSh0YXJnZXRPYmosIGZlYXR1cmUuZ2V0TmFtZSgpLAotCQkJCQkJCQl4bWxJZCwgc3JjX3ZhbHVlLmdldFR5cGUoKSk7Ci0KLQkJCQkJCWl0ZXJhdEVEYXRhT2JqZWN0KHNyY192YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKCFpc0Rpc2NhcmRlZChzcmNPYmopKSB7Ci0JCQkJCS8vIGlmICggdGFyZ2V0T2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5UGFja2FnZSkgewotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImhycmUiKTsKLQkJCQkJLy8gfQotCi0JCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFdvcmtPcmRlclR5cGUpIHsKLQkJCQkJCXZhbHVlID0gKChXb3JrT3JkZXJUeXBlKSB2YWx1ZSkuZ2V0TmFtZSgpOwotCQkJCQl9Ci0KLQkJCQkJeG1sTGliLnNldEF0cmlidXRlRmVhdHVyZVZhbHVlKHRhcmdldE9iaiwKLQkJCQkJCQlmZWF0dXJlLmdldE5hbWUoKSwgdmFsdWUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKAotCQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydFhNTFNlcnZpY2VfZmVhdHVyZV9lcnJvciwKLQkJCQkJCUxpYnJhcnlVdGlsLmdldFR5cGVOYW1lKHNyY09iaiksIGZlYXR1cmUuZ2V0TmFtZSgpKTsKLQkJCQlsb2dnZXIubG9nRXJyb3IobXNnLCBlKTsKLQkJCX0KLQotCQl9Ci0KLQl9Ci0KLQkvLyBnb2lkIG9mIHByb2Nlc3NlZCBlbGVtZW50Ci0JcHJpdmF0ZSBMaXN0IHByb2Nlc3NlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzUHJvY2Vzc2VkKFN0cmluZyBndWlkKSB7Ci0JCXJldHVybiBwcm9jZXNzZWRFbGVtZW50cy5jb250YWlucyhndWlkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UHJvY2Vzc2VkKFN0cmluZyBndWlkKSB7Ci0JCWlmICghcHJvY2Vzc2VkRWxlbWVudHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCXByb2Nlc3NlZEVsZW1lbnRzLmFkZChndWlkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRUb3Btb3N0VXNlclBhY2thZ2UoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCi0JCU1ldGhvZFBhY2thZ2UgcGtnX2NvcmVfY29udGVudCA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQotCQlNZXRob2RQYWNrYWdlIHBrZ19jdXN0b21fY2F0ZWdvcmllcyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoKTsKLQotCQlNZXRob2RQYWNrYWdlIHBrZ19kaXNjaXBsaW5lcyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKTsKLQotCQlNZXRob2RQYWNrYWdlIHBrZ19kb21haW5zID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kb21haW5QYXRoKTsKLQotCQlNZXRob2RQYWNrYWdlIHBrZ19yb2xlc2V0cyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCi0JCU1ldGhvZFBhY2thZ2UgcGtnX3Rvb2xzID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCk7Ci0KLQkJTWV0aG9kUGFja2FnZSBwa2dfd3B0eXBlcyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCk7Ci0KLQkJTWV0aG9kUGFja2FnZSBwa2dfY3AgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCk7Ci0KLQkJTWV0aG9kUGFja2FnZSBwa2dfZHAgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGgpOwotCi0JCU1ldGhvZFBhY2thZ2UgcGtnX3Byb2NfY29udHJpYnV0aW9uID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5wcm9jZXNzQ29udHJpYnV0aW9uUGF0aCk7Ci0KLQkJTGlzdCBwa2dzID0gbmV3IEFycmF5TGlzdCgpOwotCQlwa2dzLmFkZChwa2dfY29yZV9jb250ZW50KTsKLQkJcGtncy5hZGQocGtnX2N1c3RvbV9jYXRlZ29yaWVzKTsKLQkJcGtncy5hZGQocGtnX2Rpc2NpcGxpbmVzKTsKLQkJcGtncy5hZGQocGtnX2RvbWFpbnMpOwotCQlwa2dzLmFkZChwa2dfcm9sZXNldHMpOwotCQlwa2dzLmFkZChwa2dfdG9vbHMpOwotCQlwa2dzLmFkZChwa2dfd3B0eXBlcyk7Ci0JCXBrZ3MuYWRkKHBrZ19jcCk7Ci0JCXBrZ3MuYWRkKHBrZ19kcCk7Ci0KLQkJaWYgKCBwa2dfcHJvY19jb250cmlidXRpb24gIT0gbnVsbCApIHsKLQkJCXBrZ3MuYWRkKHBrZ19wcm9jX2NvbnRyaWJ1dGlvbik7Ci0JCX0KLQkJCi0JCXJldHVybiBwa2dzOwotCi0JCS8vIExpc3Qgc3lzdGVtUGtncyA9IFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMocGx1Z2luKTsKLQkJLy8JCQotCQkvLyBMaXN0IHVucHJvY2Vzc2VkUGtncyA9IG5ldyBBcnJheUxpc3QocGx1Z2luLmdldE1ldGhvZFBhY2thZ2VzKCkpOwotCQkvLyB3aGlsZSAodW5wcm9jZXNzZWRQa2dzLnNpemUoKSA+IDAgKSB7Ci0JCS8vIE1ldGhvZFBhY2thZ2UgcGtnID0gKE1ldGhvZFBhY2thZ2UpIHVucHJvY2Vzc2VkUGtncy5yZW1vdmUoMCk7Ci0JCS8vIGlmICggIXN5c3RlbVBrZ3MuY29udGFpbnMocGtnKSApIHsKLQkJLy8gaWYgKCAhcGtncy5jb250YWlucyhwa2cpICkgewotCQkvLyBwa2dzLmFkZChwa2cpOwotCQkvLyB9Ci0JCS8vIGNvbnRpbnVlOwotCQkvLyB9Ci0JCS8vCQkJCi0JCS8vIGZvciAoIEl0ZXJhdG9yIGl0ID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7Ci0JCS8vICkgewotCQkvLyBNZXRob2RQYWNrYWdlIHAgPSAoTWV0aG9kUGFja2FnZSlpdC5uZXh0KCk7Ci0JCS8vIGlmICggc3lzdGVtUGtncy5jb250YWlucyhwKSApCi0JCS8vIHsKLQkJLy8gaWYgKCAhdW5wcm9jZXNzZWRQa2dzLmNvbnRhaW5zKHApICkgewotCQkvLyB1bnByb2Nlc3NlZFBrZ3MuYWRkKHApOwotCQkvLyB9Ci0JCS8vIH0gZWxzZSB7Ci0JCS8vIGlmICggIXBrZ3MuY29udGFpbnMocCkgKSB7Ci0JCS8vIHBrZ3MuYWRkKHApOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLwkJCQotCQkvLyBpZiAoIHVucHJvY2Vzc2VkUGtncy5zaXplKCkgPT0gMCApIHsKLQkJLy8gYnJlYWs7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLwkJCi0JCS8vIC8vIG5lZWQgdG8gaW5jbHVkZSB0aGUgY29udGVudCBwYWNrYWdlcwotCQkvLyBwa2dzLmFkZEFsbChUbmdVdGlsLmdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VzKHBsdWdpbikpOwotCi0JfQotCi0JLy8gcHJpdmF0ZSBib29sZWFuIGlzU3lzdGVtUGFja2FnZShFRGF0YU9iamVjdCBlbGVtZW50KSB7Ci0JLy8JCQotCS8vIGlmICggIShlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgKSB7Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQkvLwkJCi0JLy8gTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkvLyBpZiAoIHBsdWdpbiA9PSBudWxsICkgewotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0JLy8JCQotCS8vIHJldHVybiBUbmdVdGlsLmdldEFsbFN5c3RlbVBhY2thZ2VzKHBsdWdpbikuY29udGFpbnMoZWxlbWVudCk7Ci0JLy8JCQotCS8vIH0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9GZWF0dXJlTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0ZlYXR1cmVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMmU1OGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0ZlYXR1cmVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRXh0ZW5kZWRNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBtYW5hZ2UgdGhlIGZlYXR1cmVzIG9mIEVDbGFzcy4KLSAqIG1haW50YWlucyBhIG1hcCBvZiBmZWF0dXJlIG5hbWUgdG8gdGhlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3QgZm9yIGVhc2llciBhY2Nlc3MKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlTWFuYWdlciB7Ci0KLQlwdWJsaWMgc3RhdGljIEZlYXR1cmVNYW5hZ2VyIElOU1RBTkNFID0gbmV3IEZlYXR1cmVNYW5hZ2VyKCk7Ci0JCi0JLy9wcml2YXRlIE1hcCBjbGFzc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JLy8gbWFwIG9mIHVtYSBmZWF0dXJlIG5hbWUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgeG1sIGZlYXR1cmUgbmFtZQotCXByaXZhdGUgTWFwIGZlYXR1cmVOYW1lTWFwID0gbmV3IFRyZWVNYXAoKTsKLQkKLQkvLyB1bWEgZmVhdHVyZXMgdGhhdCBzaG91bGQgYmUgaWdub3JlZAotCXByaXZhdGUgTGlzdCB1bm5lZWRlZFJtY0ZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8geG1sIGZlYXR1cmVzIHRoYXQgY2FuIGJlIGlnbm9yZWQKLQlwcml2YXRlIExpc3QgdW5uZWVkZWRYbWxGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIG1hcCBvZiBFQ2xhc3MgbmFtZSB0byBFQ2xhc3MgT2JqZWN0IGZvciB4bWwgbW9kZWwKLQkvLyBub3RlOiB3ZSBjYW4ndCB1c2UgZmVhdHVyZS5nZXRFVHlwZSgpIHRvIGdldCB0aGUgRUNsYXNzIGZyb20gZmVhdHVyZQotCS8vIHRoZSBwcm9ibGVtIGlzIHRoZSBhYm92ZSByZXR1cm5lZCBFQ2xhc3MgbWF5IG5vdCBiZSB0aGUgY29uY3JlYXRlIEVDbGFzcywgaW5zdGVhZCwgaXQgaXMgdGhlIGJhc2UgY2xhc3MKLQkvLyBmb3IgZXhhbXBsZSwgaXQgcmV0dXJucyBNZXRob2RQYWNrYWdlIGluc3RlYWQgb2YgUHJvY2Vzc1BhY2thZ2Ugb3IgQ29udGVudFBhY2thZ2UKLQkvLyBzbyB3ZSBoYXZlIHRvIG1haW50YWluIGEgbWFwIG1hbnVhbGx5Ci0JcHJpdmF0ZSBNYXAgeG1sRUNsYXNzTWFwID0gbmV3IFRyZWVNYXAoKTsKLQkKLQkvLyBtYXAgb2YgRWNsYXMgbmFtZSB0byBFQ2xhc3Mgb2JqZWN0IGZvciB1bWEgbW9kZWwKLQlwcml2YXRlIE1hcCB1bWFFQ2xhc3NNYXAgPSBuZXcgVHJlZU1hcCgpOwotCQotCXByaXZhdGUgRmVhdHVyZU1hbmFnZXIoKSB7Ci0JCQotCQlmZWF0dXJlTmFtZU1hcC5wdXQoIk9wdGlvbmFsSW5wdXRUbyIsICJvcHRpb25hbElucHV0VG8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiUm9sZSIsICJyb2xlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoIlRhc2siLCAidGFzayIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJhY3Rpdml0eVJlZmVyZW5jZXMiLCAiYWN0aXZpdHlSZWZlcmVuY2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiYWdncmVnYXRlZFJvbGVzIiwgImFnZ3JlZ2F0ZWRSb2xlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImFzc2V0cyIsICJyZXVzYWJsZUFzc2V0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImF0dGFjaG1lbnRzIiwgImF0dGFjaG1lbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiYmFzZUNvbmZpZ3VyYXRpb25zIiwgImJhc2VDb25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImJhc2VkT25Qcm9jZXNzZXMiLCAiYmFzZVByb2Nlc3MiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiYmFzZXMiLCAicmVmZXJlbmNlZE1ldGhvZFBsdWdpbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJib2R5IiwgIm1haW5EZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJicmVha2Rvd25FbGVtZW50cyIsICJicmVha2Rvd25FbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImNhdGVnb3JpemVkRWxlbWVudHMiLCAiY2F0ZWdvcml6ZWRFbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImNoZWNrbGlzdHMiLCAiY2hlY2tsaXN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImNoaWxkUGFja2FnZXMiLCAibWV0aG9kUGFja2FnZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJjb21tdW5pY2F0aW9uc01hdGVyaWFscyIsICJjb21tdW5pY2F0aW9uc01hdGVyaWFsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImNvbmNlcHRzIiwgImNvbmNlcHQsd2hpdGVwYXBlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJjb25jZXB0c0FuZFBhcGVycyIsICJjb25jZXB0LHdoaXRlcGFwZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiY29udGFpbmVkQXJ0aWZhY3RzIiwgImNvbnRhaW5lZEFydGlmYWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImNvbnRlbnRFbGVtZW50cyIsICJjb250ZW50RWxlbWVudCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJjb250ZW50UmVmZXJlbmNlcyIsICJjb250ZW50UmVmZXJlbmNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImNvcHlyaWdodFN0YXRlbWVudCIsICJjb3B5cmlnaHQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiZGVsaXZlcmVkV29ya1Byb2R1Y3RzIiwgImRlbGl2ZXJlZFdvcmtQcm9kdWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImRpc2NpcGxpbmVzIiwgImRpc2NpcGxpbmUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiZWR1Y2F0aW9uTWF0ZXJpYWxzIiwgImVkdWNhdGlvbk1hdGVyaWFsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImVzdGltYXRpb25Db25kZXJhdGlvbnMiLCAiZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImV4YW1wbGVzIiwgImV4YW1wbGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiZ3VpZCIsICJpZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJndWlkZWxpbmVzIiwgImd1aWRlbGluZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJob3d0b1N0YWZmIiwgImhvd1RvU3RhZmYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiaW5jbHVkZXNQYXR0ZXJucyIsICJpbmNsdWRlc1BhdHRlcm4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiaW50ZXJmYWNlcyIsICJpbnRlcmZhY2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgibGlua1RvUHJlZGVjZXNzb3IiLCAicHJlZGVjZXNzb3IiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgibWV0aG9kUGFja2FnZXMiLCAibWV0aG9kUGFja2FnZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJtZXRob2RQbHVnaW5zIiwgIm1ldGhvZFBsdWdpbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJvd25lZFJ1bGVzIiwgIm93bmVkUnVsZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiLCAibWV0aG9kQ29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJwcm9jZXNzRWxlbWVudHMiLCAicHJvY2Vzc0VsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgicHJvY2Vzc1ZpZXdzIiwgInByb2Nlc3NWaWV3Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInJlZmVyZW5jZVdvcmtmbG93cyIsICJyZWZlcmVuY2VXb3JrZmxvdyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJyZXBvcnRzIiwgInJlcG9ydCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJyZXVzYWJsZUFzc2V0cyIsICJyZXVzYWJsZUFzc2V0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInJldXNlZFBhY2thZ2VzIiwgInJldXNlZFBhY2thZ2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgicm9hZG1hcHMiLCAicm9hZG1hcCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJyb2xlU2V0cyIsICJyb2xlU2V0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInJvbGVzIiwgInJvbGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgic2VjdGlvbkRlc2NyaXB0aW9uIiwgImRlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInNlY3Rpb25zIiwgInNlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgic2VsZWN0ZWRTdGVwcyIsICJzdGVwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInN1YkNhdGVnb3JpZXMiLCAic3ViQ2F0ZWdvcnkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgic3ViZGlzY2lwbGluZSIsICJzdWJEaXNjaXBsaW5lIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInN1YlByYWN0aWNlcyIsICJzdWJQcmFjdGljZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJzdWJTZWN0aW9ucyIsICJzdWJTZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInN1YmRvbWFpbnMiLCAic3ViZG9tYWluIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInN1cGVyQWN0aXZpdGllcyIsICJzdXBlckFjdGl2aXR5Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInN1cHBvcnRpbmdNYXRlcmlhbHMiLCAic3VwcG9ydGluZ01hdGVyaWFsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInRhc2tzIiwgInRhc2siKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgidGVhbVJvbGVzIiwgInJvbGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgidGVtcGxhdGVzIiwgInRlbXBsYXRlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInRvb2xNZW50b3JzIiwgInRvb2xNZW50b3IiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiV29ya1Byb2R1Y3QiLCAid29ya1Byb2R1Y3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgid29ya1Byb2R1Y3RzIiwgIndvcmtQcm9kdWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInByZWQiLCAidmFsdWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgibWV0aG9kRWxlbWVudFByb3BlcnR5IiwgIm1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJyZXF1aXJlZFJlc3VsdHMiLCAicmVxdWlyZWRSZXN1bHQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiZnVsZmlsbHMiLCAiZnVsZmlsbCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCi0JCXVubmVlZGVkUm1jRmVhdHVyZXMuYWRkKCJjb250YWluZXJBcnRpZmFjdCIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkUm1jRmVhdHVyZXMuYWRkKCJtb2RpZmllcyIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkUm1jRmVhdHVyZXMuYWRkKCJwYXJlbnRQYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJdW5uZWVkZWRSbWNGZWF0dXJlcy5hZGQoImRpYWdyYW1zIik7IC8vJE5PTi1OTFMtMSQKLQkJdW5uZWVkZWRSbWNGZWF0dXJlcy5hZGQoIm1vZGlmaWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJdW5uZWVkZWRSbWNGZWF0dXJlcy5hZGQoInN0ZXBzIik7IC8vJE5PTi1OTFMtMSQKLQkJdW5uZWVkZWRSbWNGZWF0dXJlcy5hZGQoIndvcmtlZE9uQnkiKTsgLy8kTk9OLU5MUy0xJAotCQl1bm5lZWRlZFJtY0ZlYXR1cmVzLmFkZCgiZGlhZ3JhbXMiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJdW5uZWVkZWRYbWxGZWF0dXJlcy5hZGQoImdyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJdW5uZWVkZWRYbWxGZWF0dXJlcy5hZGQoImdyb3VwMSIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkWG1sRmVhdHVyZXMuYWRkKCJncm91cDIiKTsgLy8kTk9OLU5MUy0xJAotCQl1bm5lZWRlZFhtbEZlYXR1cmVzLmFkZCgicHJlZGVjZXNzb3IxIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWxvYWRYbWxDbGFzc2VzKCk7Ci0JCWxvYWRSbWNDbGFzc2VzKCk7Ci0JCQotLy8JCS8vIHByaW50IG91dCB0aGUgRUNsYXNzZXMgYW5kIGZlYXR1cmUgbWFwLCBmb3IgdGVzdGluZyBwdXJwb3NlCi0vLwkJLy8gZG9uJ3QgZGVsZXRlIHRoaXMgY29kZSBzZWdtZW50Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT0gTG9hZGluZyBFQ2xhc3NlcyBmb3IgWE1MIFVtYSBtb2RlbCA9PT09PT09PT09PT09PT09PSIpOwotLy8JCWZvciAoSXRlcmF0b3IgaXQgPSB4bWxFQ2xhc3NNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLS8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdCIgKyBpdC5uZXh0KCkpOwkJCQotLy8JCX0KLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0vLwotLy8JCWZvciAoSXRlcmF0b3IgaXQgPSBmZWF0dXJlTmFtZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0vLwkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLS8vCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpZW50cnkuZ2V0S2V5KCk7Ci0vLwkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpZW50cnkuZ2V0VmFsdWUoKTsKLS8vCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPiAwICkgewotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdGZlYXR1cmVOYW1lTWFwLnB1dChcIiIgKyBrZXkgKyAiXCIsIFwiIiArIHZhbHVlICsgIlwiKTsiKTsJCi0vLwkJCX0KLS8vCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2FkUm1jQ2xhc3NlcygpIHsKLQkJCi0JCS8vIGxvYWQgRUNsYXNzIG1hcAotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3QoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENoZWNrbGlzdCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9zaXRlUm9sZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uY2VwdCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uc3RyYWludCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnkoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3MoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaXB0b3IoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW4oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXhhbXBsZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRlbGluZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SXRlcmF0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW4oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFVuaXQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1pbGVzdG9uZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRjb21lKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYWNrYWdlYWJsZUVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFBoYXNlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQbGFubmluZ0RhdGEoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByYWN0aWNlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmFjdGljZURlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NFbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzUGFja2FnZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlcG9ydCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmV1c2FibGVBc3NldCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9hZG1hcCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldEdyb3VwaW5nKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2soKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3IoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZW1wbGF0ZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVybURlZmluaXRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2woKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2xNZW50b3IoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdoaXRlcGFwZXIoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrRGVmaW5pdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya09yZGVyKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdFR5cGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpKTsJCi0JfQotCQotCQotCXByaXZhdGUgdm9pZCBsb2FkWG1sQ2xhc3NlcygpIHsKLQkJCi0JCS8vIGxvYWQgRUNsYXNzIG1hcAotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3QoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENhcGFiaWxpdHlQYXR0ZXJuKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2hlY2tsaXN0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9zaXRlUm9sZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmNlcHQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25zdHJhaW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudFBhY2thZ2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeSgpKTsKLS8vCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2F0ZWdvcnlUeXBlKCkpOwotLy8JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXRlZ29yeVR5cGVPYmplY3QoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3MoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaXB0b3IoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXN0aW1hdGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFc3RpbWF0aW5nTWV0cmljKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXhhbXBsZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRlbGluZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEl0ZXJhdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kTGlicmFyeSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW4oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWlsZXN0b25lKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0Y29tZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFBhY2thZ2VhYmxlRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFBoYXNlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGxhbm5pbmdEYXRhKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJhY3RpY2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmFjdGljZURlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2VzcygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0VsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzUGFja2FnZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVwb3J0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmV1c2FibGVBc3NldCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvYWRtYXAoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3IoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldEdyb3VwaW5nKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFN1cHBvcnRpbmdNYXRlcmlhbCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2soKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVtcGxhdGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZXJtRGVmaW5pdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2woKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sTWVudG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2hpdGVwYXBlcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0RlZmluaXRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrT3JkZXIoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdFR5cGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKSk7CQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9hZE1vZGVsQ2xhc3NlcyhNYXAgY2xhc3NNYXAsIEVDbGFzcyBjbGF6eikgewotCi0JCVN0cmluZyBuYW1lID0gY2xhenouZ2V0TmFtZSgpOwotCQlpZiggY2xhc3NNYXAuY29udGFpbnNLZXkobmFtZSkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWNsYXNzTWFwLnB1dChuYW1lLCBjbGF6eik7Ci0JCQkKLQkJLy9mb3IgKEl0ZXJhdG9yIGl0ID0gY2xhenouZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCWZvciAoSXRlcmF0b3IgZWxlbWVudHMgPSBFeHRlbmRlZE1ldGFEYXRhLklOU1RBTkNFLmdldEFsbEVsZW1lbnRzKGNsYXp6KS5pdGVyYXRvcigpOyAKLQkJCQllbGVtZW50cy5oYXNOZXh0KCk7ICkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGVTdHJ1Y3R1cmFsRmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpZWxlbWVudHMubmV4dCgpOwotCQkJRUNsYXNzaWZpZXIgZUNsYXNzaWZpZXIgPSBlU3RydWN0dXJhbEZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJCWlmIChlQ2xhc3NpZmllciBpbnN0YW5jZW9mIEVDbGFzcykgewotCQkJCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKWVDbGFzc2lmaWVyOwkJCQkKLQkJCQkvLyByZWN1cnNpdmVseSBmaW5kIHRoZSBuZXN0ZWR0IGZlYXR1cmVzCi0JCQkJbG9hZE1vZGVsQ2xhc3NlcyhjbGFzc01hcCwgZUNsYXNzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjbGF6egotCSAqIEBwYXJhbSB1bWFGZWF0dXJlTmFtZQotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgeG1sIGZlYXR1cmUuCi0JICovCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRYbWxGZWF0dXJlKEVDbGFzcyBjbGF6eiwgU3RyaW5nIHVtYUZlYXR1cmVOYW1lKSB7Ci0JCXJldHVybiBnZXRYbWxGZWF0dXJlKGNsYXp6LCB1bWFGZWF0dXJlTmFtZSwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB1bWFDbGF6egotCSAqIEBwYXJhbSB4bWxGZWF0dXJlTmFtZQotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgRVN0cnVjdHVyYWxGZWF0dXJlIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldFJtY0ZlYXR1cmUoRUNsYXNzIHVtYUNsYXp6LCBTdHJpbmcgeG1sRmVhdHVyZU5hbWUpIHsKLQkJZm9yICggSXRlcmF0b3IgaXQgPSB1bWFDbGF6ei5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApCi0JCXsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSlpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgdW1hRmVhdHVyZW5hbWUgPSBmZWF0dXJlLmdldE5hbWUoKTsKLQkJCQotCQkJLy8gaWYgdGhlIGZlYXR1cmUgbmFtZSBpcyB0aGUgc2FtZSwgZ290IGl0Ci0JCQlpZiAoIHVtYUZlYXR1cmVuYW1lLmVxdWFscyh4bWxGZWF0dXJlTmFtZSkgKSB7Ci0JCQkJcmV0dXJuIGZlYXR1cmU7Ci0JCQl9Ci0JCQkKLQkJCS8vIGNoZWNrIGlmIHRoZSBmZWF0dXJlIG5hbWUgaXMgbWFwcGVkIHRvIGFub3RoZXIgeG1sIGZlYXR1cmUgbmFtZQotCQkJU3RyaW5nIGZlYXR1cmVOYW1lID0gKFN0cmluZylmZWF0dXJlTmFtZU1hcC5nZXQodW1hRmVhdHVyZW5hbWUpOwotCQkJaWYgKCBmZWF0dXJlTmFtZSAhPSBudWxsICkgewotCQkJCWludCBpID0gZmVhdHVyZU5hbWUuaW5kZXhPZigiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKCBpID4gMCApIHsKLQkJCQkJaWYgKCBmZWF0dXJlTmFtZS5zdWJzdHJpbmcoMCxpKS5lcXVhbHMoeG1sRmVhdHVyZU5hbWUpIHx8IAotCQkJCQkJIGZlYXR1cmVOYW1lLnN1YnN0cmluZyhpKzEpLmVxdWFscyh4bWxGZWF0dXJlTmFtZSkJKSB7Ci0JCQkJCQlyZXR1cm4gZmVhdHVyZTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICggZmVhdHVyZU5hbWUuZXF1YWxzKHhtbEZlYXR1cmVOYW1lKSApIHsKLQkJCQkJCXJldHVybiBmZWF0dXJlOwotCQkJCQl9Ci0JCQkJfQkJCQkKLQkJCX0KLQkJfQotCi0JCS8vU3lzdGVtLm91dC5wcmludCgiRmVhdHVyZU1hbmFnZXI6IFVuYWJsZSB0byBmaW5kIHVtYSBmZWF0dXJlIGZvciB4bWwgZmVhdHVyZSIgKyB4bWxGZWF0dXJlTmFtZSk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGNsYXp6Ci0JICogQHBhcmFtIHVtYUZlYXR1cmVOYW1lCi0JICogQHBhcmFtIG9iamVjdFR5cGUKLQkgKiBAcmV0dXJuIHRoZSBjb3Jyc3BvbmRpbmcgeG1sIGZlYXR1cmUuCi0JICovCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRYbWxGZWF0dXJlKEVDbGFzcyBjbGF6eiwgU3RyaW5nIHVtYUZlYXR1cmVOYW1lLCBTdHJpbmcgb2JqZWN0VHlwZSkgewotCi0JCVN0cmluZyBmZWF0dXJlTmFtZSA9IHVtYUZlYXR1cmVOYW1lOwotCQlpZiAoIGZlYXR1cmVOYW1lTWFwLmNvbnRhaW5zS2V5KGZlYXR1cmVOYW1lKSApIHsKLQkJCWZlYXR1cmVOYW1lID0gKFN0cmluZylmZWF0dXJlTmFtZU1hcC5nZXQoZmVhdHVyZU5hbWUpOwotCQkJCi0JCQkvLyBpZiB0aGUgZmVhdHVyZSBpcyBub3QgdW5pcXVlLCB1c2UgdGhlIGZpcnN0IG9uZQotCQkJaW50IGkgPSBmZWF0dXJlTmFtZS5pbmRleE9mKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICggaSA+IDAgKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBmZWF0dXJlTmFtZS5zdWJzdHJpbmcoMCwgaSk7Ci0JCQkJaWYgKCBvYmplY3RUeXBlICE9IG51bGwgKSB7CQkJCQotCQkJCQkvLyBwaWNrIHRoZSBmZWF0dXJlIGJhc2VkIG9uIG9iamVjdCB0eXBlCi0JCQkJCWlmICggIW5hbWUuZXF1YWxzSWdub3JlQ2FzZShvYmplY3RUeXBlKSApIHsKLQkJCQkJCW5hbWUgPSBmZWF0dXJlTmFtZS5zdWJzdHJpbmcoaSsxKTsKLQkJCQkJfQotCQkJCQlpZiAoICFuYW1lLmVxdWFsc0lnbm9yZUNhc2Uob2JqZWN0VHlwZSkgKSB7Ci0JCQkJCQluYW1lID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlmZWF0dXJlTmFtZSA9IG5hbWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmICggZmVhdHVyZU5hbWUgPT0gbnVsbCApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGNsYXp6LmdldEVTdHJ1Y3R1cmFsRmVhdHVyZShmZWF0dXJlTmFtZSk7Ci0JCWlmICggKGZlYXR1cmU9PW51bGwpICYmIChjbGF6ei5nZXROYW1lKCkuZXF1YWxzKCJDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIikpICYmIGZlYXR1cmVOYW1lLmVxdWFscygiY29udGVudEVsZW1lbnQiKSApIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlmZWF0dXJlID0gb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZV9Db250ZW50Q2F0ZWdvcnkoKTsKLQkJfQotCi0vLwkJaWYgKCBmZWF0dXJlID09IG51bGwgKSB7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm8geG1sIGZlYXR1cmUgIiArIGZlYXR1cmVOYW1lICsgIiBmb3IgY2xhc3MgIiArIGNsYXp6LmdldE5hbWUoKSk7Ci0vLwkJfQotCQkKLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB1bWFFQ2xhc3NOYW1lCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB4bWwgZWNsYXNzCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFQ2xhc3MoU3RyaW5nIHVtYUVDbGFzc05hbWUpIHsKLS8vCQlFQ2xhc3Mgcm9vdENsYXNzID0gRXh0ZW5kZWRNZXRhRGF0YS5JTlNUQU5DRS5nZXREb2N1bWVudFJvb3Qob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UpOwotLy8JCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKXJvb3RDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmUodW1hRUNsYXNzTmFtZSk7Ci0vLwkJcmV0dXJuIGVDbGFzczsKLQkJCi0JCUVDbGFzcyBjbHMgPSAoRUNsYXNzKXhtbEVDbGFzc01hcC5nZXQodW1hRUNsYXNzTmFtZSk7Ci0vLwkJaWYgKCBjbHMgPT0gbnVsbCApIHsKLS8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJObyB4bWwgRUNsYXNzIGZvciB1bWEgY2xhc3MgIiArIHVtYUVDbGFzc05hbWUpOwotLy8JCX0KLQkJCi0JCXJldHVybiBjbHM7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB4bWxFQ2xhc3NOYW1lCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBFQ2xhc3Mgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um1jRUNsYXNzKFN0cmluZyB4bWxFQ2xhc3NOYW1lKSB7Ci0JCUVDbGFzcyBjbHMgPSAoRUNsYXNzKXVtYUVDbGFzc01hcC5nZXQoeG1sRUNsYXNzTmFtZSk7Ci0vLwkJaWYgKCBjbHMgPT0gbnVsbCApIHsKLS8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJObyB1bWEgRUNsYXNzIGZvciB4bWwgY2xhc3MgIiArIHhtbEVDbGFzc05hbWUpOwotLy8JCX0KLQkJCi0JCXJldHVybiBjbHM7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBmZWF0dXJlbmFtZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmVhdHVyZSBpcyB1bm5lZWRlZCBnaXZlbiBieSBmZWF0dXJlbmFtZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VubmVlZGVkUm1jRmVhdHVyZShTdHJpbmcgZmVhdHVyZW5hbWUpIHsKLQkJcmV0dXJuIHVubmVlZGVkUm1jRmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZW5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZmVhdHVyZW5hbWUKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHhtbCBmZWF0dXJlIGlzIHVubmVlZGVkIGdpdmVuIGJ5IGZlYXR1cmVuYW1lLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVW5uZWVkZWRYbWxGZWF0dXJlKFN0cmluZyBmZWF0dXJlbmFtZSkgewotCQlyZXR1cm4gdW5uZWVkZWRYbWxGZWF0dXJlcy5jb250YWlucyhmZWF0dXJlbmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFByaW50cyB0aGUgZmVhdHVyZS1uYW1lIG1hcC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludEZlYXR1cmVOYW1lTWFwcGluZygpIHsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5KCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5KCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXJ0aWZhY3QoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXJ0aWZhY3QoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDaGVja2xpc3QoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2hlY2tsaXN0KCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29tcG9zaXRlUm9sZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb21wb3NpdGVSb2xlKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uY2VwdCgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25jZXB0KCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25zdHJhaW50KCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyYWJsZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyYWJsZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJ5UHJvY2VzcygpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyeVByb2Nlc3MoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNjaXBsaW5lKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc2NpcGxpbmUoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRG9tYWluKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURvbWFpbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFeGFtcGxlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUV4YW1wbGUoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkZWxpbmUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3VpZGVsaW5lKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSXRlcmF0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUl0ZXJhdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZExpYnJhcnkoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kTGlicmFyeSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFBsdWdpbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RQbHVnaW4oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNaWxlc3RvbmUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWlsZXN0b25lKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3V0Y29tZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVPdXRjb21lKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGhhc2UoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGhhc2UoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQbGFubmluZ0RhdGEoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGxhbm5pbmdEYXRhKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJhY3RpY2UoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJhY3RpY2UoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmFjdGljZURlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzQ29tcG9uZW50KCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NDb21wb25lbnQoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzRGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlcG9ydCgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZXBvcnQoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZXVzYWJsZUFzc2V0KCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJldXNhYmxlQXNzZXQoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2FkbWFwKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvYWRtYXAoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGUoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZURlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZURlc2NyaXB0b3IoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZURlc2NyaXB0b3IoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlU2V0KCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVTZXQoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlU2V0R3JvdXBpbmcoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZVNldEdyb3VwaW5nKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VjdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZWN0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2soKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFzaygpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tEZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrRGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrRGVzY3JpcHRvcigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrRGVzY3JpcHRvcigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRlYW1Qcm9maWxlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRlYW1Qcm9maWxlKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVtcGxhdGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVtcGxhdGUoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZXJtRGVmaW5pdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZXJtRGVmaW5pdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRvb2woKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVG9vbCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRvb2xNZW50b3IoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVG9vbE1lbnRvcigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdoaXRlcGFwZXIoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2hpdGVwYXBlcigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtPcmRlcigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrT3JkZXIoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpKTsKLS8vCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZSgpKTsKLS8vCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZSgpKTsKLQotCi0JfQotCQotCQotCXByaXZhdGUgdm9pZCBwcmludEZlYXR1cmUoRU9iamVjdCBvYmoxLCBFT2JqZWN0IG9iajIpIHsKLQkJTGlzdCBtYXRjaGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHVubWF0Y2hlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB1bWFGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkKLQkJRUxpc3QgZmVhdHVyZXMgPSBvYmoxLmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKWl0Lm5leHQoKTsKLQkJCVN0cmluZyBuYW1lID0gZmVhdHVyZS5nZXROYW1lKCk7Ci0JCQlpZiAoIGZlYXR1cmVOYW1lTWFwLmNvbnRhaW5zS2V5KG5hbWUpICkgewotCQkJCVN0cmluZyB4bWxfbmFtZSA9IChTdHJpbmcpIGZlYXR1cmVOYW1lTWFwLmdldChuYW1lKTsKLQkJCQlpbnQgaW5keCA9IHhtbF9uYW1lLmluZGV4T2YoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICggaW5keCA+IDAgKSB7Ci0JCQkJCW1hdGNoZWQuYWRkKHhtbF9uYW1lLnN1YnN0cmluZygwLCBpbmR4KSk7Ci0JCQkJCW1hdGNoZWQuYWRkKHhtbF9uYW1lLnN1YnN0cmluZyhpbmR4KzEpLnRyaW0oKSk7CQkJCQkKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoICFtYXRjaGVkLmNvbnRhaW5zKHhtbF9uYW1lKSApIHsKLQkJCQkJbWF0Y2hlZC5hZGQoeG1sX25hbWUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKCF1bm5lZWRlZFJtY0ZlYXR1cmVzLmNvbnRhaW5zKG5hbWUpICYmICF1bWFGZWF0dXJlcy5jb250YWlucyhuYW1lKSApIHsKLQkJCQl1bWFGZWF0dXJlcy5hZGQobmFtZSk7Ci0JCQl9Ci0JCX0JCQkKLQkJCi0JCWZlYXR1cmVzID0gb2JqMi5lQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSlpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9IGZlYXR1cmUuZ2V0TmFtZSgpOwotCQkJaWYgKCB1bWFGZWF0dXJlcy5jb250YWlucyhuYW1lKSApIHsKLQkJCQl1bWFGZWF0dXJlcy5yZW1vdmUobmFtZSk7Ci0JCQl9IGVsc2UgaWYgKCF1bm5lZWRlZFhtbEZlYXR1cmVzLmNvbnRhaW5zKG5hbWUpICYmICFtYXRjaGVkLmNvbnRhaW5zKG5hbWUpICYmICF1bm1hdGNoZWQuY29udGFpbnMobmFtZSkgKSB7Ci0JCQkJdW5tYXRjaGVkLmFkZChuYW1lKTsKLQkJCX0KLQkJfQkKLQkJCi0JCWlmICggdW1hRmVhdHVyZXMuc2l6ZSgpICsgdW5tYXRjaGVkLnNpemUoKSA9PSAwICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09IHVuLW1hdGNoZWQgZmVhdHVyZXMgZm9yICIgKyBvYmoxLmVDbGFzcygpLmdldE5hbWUoKSArICIgPT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmb3IgKCBJdGVyYXRvciBpdCA9IHVtYUZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpaXQubmV4dCgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdGZlYXR1cmVOYW1lTWFwLnB1dChcIiIgKyBuYW1lICsgIlwiLCBcIlwiKTsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbihuYW1lKTsKLQkJfQotCQlmb3IgKCBJdGVyYXRvciBpdCA9IHVubWF0Y2hlZC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWl0Lm5leHQoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCIgKyBuYW1lKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQl9Ci0JCi0vLwlwdWJsaWMgY2xhc3MgRmVhdHVyZU1hcCB7Ci0vLwkJcHJpdmF0ZSBNYXAgZmVhdHVyZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0vLwkJCi0vLwkJRmVhdHVyZU1hcChFQ2xhc3MgY2xhenopIHsKLS8vCQkJRUxpc3QgZmVhdHVyZXMgPSBjbGF6ei5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0vLwkJCWZvciAoIEl0ZXJhdG9yIGl0ID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLS8vCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSlpdC5uZXh0KCk7Ci0vLwkJCQlmZWF0dXJlTWFwLnB1dChmZWF0dXJlLmdldE5hbWUoKSwgZmVhdHVyZSk7Ci0vLwkJCX0JCQkKLS8vCQl9Ci0vLwkJCi0vLwkJcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlTmFtZSkgewotLy8JCQlyZXR1cm4gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZU1hcC5nZXQoZmVhdHVyZU5hbWUpOwkJCQotLy8JCX0KLS8vCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9YTUxMaWJyYXJ5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvWE1MTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWU5NjEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9YTUxMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5FRGF0YU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLkNvbnRlbnRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLklMb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS51dGlsLlVtYVJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBjb21tb25qLnNkby5UeXBlOwotCi0vKioKLSAqIFhtbExpYnJhcnkgcmVwcmVzZW50cyBhIG1ldGhvZCBsaWJyYXJ5IGxvYWRlZCBmcm9tIGEgc3BlY2lmaWVkIHhtbCBmaWxlIFRoZQotICogeG1sIGZpbGUgc2hvdWxkIGJlIHZhbGlkIHRvIHRoZSB4bWwgc2NoZW1hIGZvciBNZXRob2RMaWJyYXJ5Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyMTUzCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxMaWJyYXJ5IHsKLQotCXByaXZhdGUgU3RyaW5nIGZpbGVQYXRoOwotCi0JcHJpdmF0ZSBJTG9nZ2VyIGxvZ2dlcjsKLQotCXByaXZhdGUgQ29udGVudFByb2Nlc3NvciBjb250ZW50UHJvYyA9IG51bGw7Ci0KLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgcm9vdE9iamVjdDsKLQotCS8vIG1hcCBvZiBjb250ZW50IGNhdGVnb3J5IHBhY2thZ2UgZm9yIGVhY2ggcGx1Z2luIGlkCi0JcHJpdmF0ZSBNYXAgY29udGVudENhdGVnb3J5UGtnTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIG1hcCBvZiBjcmVhdGVkIGVsZW1lbnRzLCBndWlkIC0gRURhdGFPYmplY3QKLQlwcml2YXRlIE1hcCBlbGVtZW50c01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGd1aWRUb1BsdWdOYW1lTWFwOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgWE1MTGlicmFyeShDb250ZW50UHJvY2Vzc29yIGNvbnRlbnRQcm9jLCBJTG9nZ2VyIGxvZ2dlciwKLQkJCVN0cmluZyBmaWxlUGF0aCkgewotCQl0aGlzLmNvbnRlbnRQcm9jID0gY29udGVudFByb2M7Ci0JCXRoaXMubG9nZ2VyID0gbG9nZ2VyOwotCQl0aGlzLmZpbGVQYXRoID0gZmlsZVBhdGg7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHJvb3Qgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBnZXRSb290KCkgewotCQlyZXR1cm4gdGhpcy5yb290T2JqZWN0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gZmlsZSBwYXRoIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVQYXRoKCkgewotCQlyZXR1cm4gdGhpcy5maWxlUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgYW4gYXJyYXkgb2YgcGx1Z2luIGlkcyBpbiB0aGUgbGlicmFyeQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UGx1Z2luSWRzKCkgewotCQlMaXN0IHBsdWdpbnMgPSByb290T2JqZWN0LmdldE1ldGhvZFBsdWdpbigpOwotCQlTdHJpbmdbXSBpZHMgPSBuZXcgU3RyaW5nW3BsdWdpbnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQlpZHNbaV0gPSAoKE1ldGhvZFBsdWdpbikgcGx1Z2lucy5nZXQoaSkpLmdldElkKCk7Ci0JCX0KLQotCQlyZXR1cm4gaWRzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBhIG5ldyBYTUwgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgY3JlYXRlTGlicmFyeShTdHJpbmcgaWQsIFN0cmluZyBuYW1lKSB7Ci0KLQkJTWV0aG9kTGlicmFyeSByb290ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kTGlicmFyeSgpOwotCQlTdHJpbmcgdmVyc2lvbiA9ICIiOwkJCQkJCQkJLy8kTk9OLU5MUy0xJAkKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gVmVyc2lvblV0aWwuZ2V0QWxsVG9vbElEcygpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgdG9vbElEID0gKFN0cmluZylpdGVyLm5leHQoKTsKLQkJCVN0cmluZyB0b29sVmVyc2lvbiA9IFZlcnNpb25VdGlsLmdldFZlcnNpb25zKHRvb2xJRCkuZ2V0TWluVG9vbFZlcnNpb25Gb3JDdXJyZW50WE1MU2NoZW1hVmVyc2lvbigpLmdldFRvb2xWZXJzaW9uKCkudG9TdHJpbmcoKTsKLQkJCWlmICh2ZXJzaW9uLmxlbmd0aCgpID4gMCkgewotCQkJCXZlcnNpb24gKz0gVmVyc2lvblV0aWwuWE1MX1ZFUlNJT05TX1NFUEFSQVRPUjsKLQkJCX0KLQkJCXZlcnNpb24gKz0gdG9vbElEICsgVmVyc2lvblV0aWwuWE1MX1RPT0xfVkVSU0lPTl9TRVBBUkFUT1IgKyB0b29sVmVyc2lvbjsJCQotCQl9Ci0JCWlmICh2ZXJzaW9uLmxlbmd0aCgpID4gMCkgewotCQkJcm9vdC5zZXRUb29sKHZlcnNpb24pOwotCQl9Ci0JCXJldHVybiBjcmVhdGUoaWQsIG5hbWUsIHJvb3QpOwotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSB4bWwgZmlsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vKgkJdHJ5IHsqLwotCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0KLQkJCS8vIEdldCB0aGUgVVJJIG9mIHRoZSBtb2RlbCBmaWxlLgotCQkJLy8KLQkJCVVSSSBmaWxlVVJJID0gVVJJLmNyZWF0ZUZpbGVVUkkoKG5ldyBGaWxlKHRoaXMuZmlsZVBhdGgpKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLQkJCS8vIENyZWF0ZSBhIHJlc291cmNlIGZvciB0aGlzIGZpbGUuCi0JCQkvLwotCQkJLy8gUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShmaWxlVVJJKTsKLQkJCVJlc291cmNlIHJlc291cmNlID0gbmV3IFVtYVJlc291cmNlRmFjdG9yeUltcGwoKQotCQkJCQkuY3JlYXRlUmVzb3VyY2UoZmlsZVVSSSk7Ci0JCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQocmVzb3VyY2UpOwotCi0JCQlyZXNvdXJjZS5sb2FkKG5ldyBIYXNoTWFwKCkpOwotCi0JCQkvLyBSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKGZpbGVVUkksIGZhbHNlKTsKLQotCQkJLy8gRUNsYXNzIGVDbGFzcyA9Ci0JCQkvLyBFeHRlbmRlZE1ldGFEYXRhLklOU1RBTkNFLmdldERvY3VtZW50Um9vdCh1bWFQYWNrYWdlKTsKLQotCQkJRG9jdW1lbnRSb290IHJvb3QgPSAoRG9jdW1lbnRSb290KSByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRyID0gcm9vdC5lQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvID0gaXRyLm5leHQoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQkJdGhpcy5yb290T2JqZWN0ID0gKE1ldGhvZExpYnJhcnkpIG87Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLS8qCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlIGxvYWRlZCIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoTkxTLmJpbmQoCi0JCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX2xvYWRfeG1sLCBmaWxlUGF0aCksIGUpOwotCQl9Ki8KLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGUgdGhlIGxpYnJhcnkgYW5kIHJldHVybiB0aGUgcm9vdCBvYmplY3QKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVBhdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGNyZWF0ZShTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBNZXRob2RFbGVtZW50IHJvb3QpIHsKLQotCQkvLyBDcmVhdGUgYSByZXNvdXJjZSBzZXQKLQkJLy8KLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0KLQkJLy8gR2V0IHRoZSBVUkkgb2YgdGhlIG1vZGVsIGZpbGUuCi0JCS8vCi0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRoaXMuZmlsZVBhdGgpOwotCQlVUkkgZmlsZVVSSSA9IFVSSS5jcmVhdGVGaWxlVVJJKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0JCS8vIENyZWF0ZSBhIHJlc291cmNlIGZvciB0aGlzIGZpbGUuCi0JCS8vCi0JCS8vIFJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoZmlsZVVSSSk7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbmV3IFVtYVJlc291cmNlRmFjdG9yeUltcGwoKQotCQkJCS5jcmVhdGVSZXNvdXJjZShmaWxlVVJJKTsKLQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc291cmNlKTsKLQotCQkvLyBBZGQgdGhlIGluaXRpYWwgbW9kZWwgb2JqZWN0IHRvIHRoZSBjb250ZW50cy4KLQkJLy8gcm9vdC5zZXRJZChpZCk7Ci0JCS8vIHJvb3Quc2V0TmFtZShuYW1lKTsKLQotCQlzZXRFbGVtZW50KGlkLCByb290KTsKLQotCQkvLyB0aGlzLnJvb3RPYmplY3QgPSByb290OwotCQlpZiAocm9vdCAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChyb290KTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlvcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRU5DT0RJTkcsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXNvdXJjZS5zYXZlKG9wdGlvbnMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJaWYgKHJvb3QgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQl0aGlzLnJvb3RPYmplY3QgPSAoTWV0aG9kTGlicmFyeSkgcm9vdDsKLQkJfQotCi0JCXJldHVybiB0aGlzLnJvb3RPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBsdWdpbklkCi0JICogQHJldHVybiBhIGNvbnRlbnQgY2F0ZXJnb3J5IHBhY2thZ2UgaW4gdGhlIHBsdWdpbiBnaXZlbiBieSBwbHVnaW5JZC4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZShTdHJpbmcgcGx1Z2luSWQpIHsKLQotCQlDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIHBrZyA9IChDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKSBjb250ZW50Q2F0ZWdvcnlQa2dNYXAKLQkJCQkuZ2V0KHBsdWdpbklkKTsKLQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGtnOwotCQl9Ci0KLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGdldEVsZW1lbnQocGx1Z2luSWQpOwotCQlpZiAocGx1Z2luID09IG51bGwpIHsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKEV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X25vX3BsdWdpbiwKLQkJCQkJcGx1Z2luSWQpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudENhdGVnb3J5UGFja2FnZSgpOwotCQlwa2cuc2V0TmFtZSgiQ29udGVudENhdGVnb3JpZXMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXNldEVsZW1lbnQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpLCBwa2cpOwotCi0JCXBsdWdpbi5nZXRNZXRob2RQYWNrYWdlKCkuYWRkKHBrZyk7Ci0KLQkJY29udGVudENhdGVnb3J5UGtnTWFwLnB1dChwbHVnaW5JZCwgcGtnKTsKLQkJcmV0dXJuIHBrZzsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgeG1sIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBTYXZlIHRoZSBjb250ZW50cyBvZiB0aGUgcmVzb3VyY2UgdG8gdGhlIGZpbGUgc3lzdGVtLgotCQkvLwotCQlNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCW9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByb290T2JqZWN0LmVSZXNvdXJjZSgpOwotCQlyZXNvdXJjZS5zYXZlKG9wdGlvbnMpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHJvb3Qgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBvcGVuKCkgewotCQlyZXR1cm4gcm9vdE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZ3VpZAotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgYmFzZSBsaWJyYXJ5IGVsZW1lbnQuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IGdldEVsZW1lbnQoU3RyaW5nIGd1aWQpIHsKLQkJcmV0dXJuIChFRGF0YU9iamVjdCkgZWxlbWVudHNNYXAuZ2V0KGd1aWQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGJhc2UgbGlicmFyeSBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBnZXRFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRFbGVtZW50KCgoTWV0aG9kRWxlbWVudCkgb2JqKS5nZXRJZCgpKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCQotCS8qKgotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuIGVsbWVuZW50IGlkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRJZChFRGF0YU9iamVjdCBvYmopIHsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudCkgb2JqKS5nZXRJZCgpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtPcmRlcikgewotCQkJcmV0dXJuICgoV29ya09yZGVyKSBvYmopLmdldElkKCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RWxlbWVudChTdHJpbmcgZ3VpZCwgRURhdGFPYmplY3Qgb2JqKSB7Ci0JCS8vIGFkZEVsZW1lbnRUb0NvbnRhaW5lcihjb250YWluZXIsIG9iaik7Ci0JCWlmICghZWxlbWVudHNNYXAuY29udGFpbnNLZXkoZ3VpZCkpIHsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnQpIG9iaikuc2V0SWQoZ3VpZCk7Ci0JCQl9Ci0KLQkJCWVsZW1lbnRzTWFwLnB1dChndWlkLCBvYmopOwotCQl9Ci0JfQotCi0JLy8gcHJpdmF0ZSB2b2lkIGFkZEVsZW1lbnRUb0NvbnRhaW5lcihFRGF0YU9iamVjdCBjb250YWluZXIsIEVEYXRhT2JqZWN0Ci0JLy8gY2hpbGQpIHsKLQkvLwkJCi0JLy8gdHJ5IHsKLQkvLyBpZiAoIGNvbnRhaW5lciA9PSBudWxsICkgewotCS8vIHJldHVybjsKLQkvLyB9Ci0JLy8JCQkKLQkvLyBpZiAoIGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSB8fCBjaGlsZCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fAotCS8vIGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSApIHsKLQkvLyByZXR1cm47Ci0JLy8gfQotCS8vCQkJCi0JLy8gd2hpbGUgKCAhKGNvbnRhaW5lciBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpICYmIChjb250YWluZXIgIT0gbnVsbCkgKSB7Ci0JLy8gY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsKLQkvLyB9Ci0JLy8JCQkKLQkvLyBpZiAoIGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlICkgewotCS8vICgoQ29udGVudFBhY2thZ2UpY29udGFpbmVyKS5nZXRDb250ZW50RWxlbWVudCgpLmFkZChjaGlsZCk7Ci0JLy8gfSBlbHNlIGlmICggY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UgKSB7Ci0JLy8gKChQcm9jZXNzUGFja2FnZSljb250YWluZXIpLmdldFByb2Nlc3NFbGVtZW50KCkuYWRkKGNoaWxkKTsKLQkvLyB9IGVsc2UgewotCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRG9uJ3Qga25vdyBob3cgdG8gc2V0IGVsZW1lbnQgIiArIGNoaWxkKTsKLQkvLyB9Ci0JLy8gfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JLy8gLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JLy8gfQotCS8vIH0KLQotCS8qKgotCSAqIGNyZWF0ZSBhIGNoaWxkIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGd1aWQKLQkgKiAKLQkgKiBAcGFyYW0gY29udGFpbmVyCi0JICogICAgICAgICAgICBjb250YWluZXIgb2YgdGhlIGVsZW1lbnQgdG8gYmUgY3JlYXRlZAotCSAqIEBwYXJhbSB1bWFGZWF0dXJlTmFtZQotCSAqICAgICAgICAgICAgdW1hIGZlYXR1cmUgZm9yIHRoZSBlbGVtZW50IHRvIGJlIGNyZWF0ZWQKLQkgKiBAcGFyYW0gdW1hRUNsYXNzTmFtZQotCSAqICAgICAgICAgICAgdW1hIEVDbGFzcyBuYW1lIGZvciB0aGUgZmVhdHVyZQotCSAqIEBwYXJhbSB1bWFFbGVtZW50VHlwZQotCSAqICAgICAgICAgICAgdW1hIGVsZW1lbnQgdHlwZSBmb3IgdGhlIGVsZW1lbnQgdG8gYmUgY3JlYXRlZAotCSAqIEBwYXJhbSBndWlkCi0JICogICAgICAgICAgICBndWlkIG9mIHRoZSBlbGVtZW50IHRvIGJlIGNyZWF0ZWQKLQkgKiBAcmV0dXJuIEVEYXRhT2JqZWN0IHRoZSBYbWwgdW1hIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgY3JlYXRlRWxlbWVudChFRGF0YU9iamVjdCBjb250YWluZXIsCi0JCQlTdHJpbmcgdW1hRmVhdHVyZU5hbWUsIFN0cmluZyB1bWFFQ2xhc3NOYW1lLCBTdHJpbmcgdW1hRWxlbWVudFR5cGUsCi0JCQlTdHJpbmcgZ3VpZCkgewotCi0JCUVEYXRhT2JqZWN0IG9iaiA9IGdldEVsZW1lbnQoZ3VpZCk7Ci0JCWlmIChvYmogPT0gbnVsbCkgewotCQkJaWYgKEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmlzVW5uZWVkZWRSbWNGZWF0dXJlKHVtYUZlYXR1cmVOYW1lKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5nZXRYbWxGZWF0dXJlKAotCQkJCQljb250YWluZXIuZUNsYXNzKCksIHVtYUZlYXR1cmVOYW1lLCB1bWFFbGVtZW50VHlwZSk7Ci0JCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoCi0JCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9ub19mZWF0dXJlLCBjb250YWluZXIKLQkJCQkJCQkJLmVDbGFzcygpLmdldE5hbWUoKSwgdW1hRmVhdHVyZU5hbWUpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLy8gaWYgKCAhKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKSApIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgY3JlYXRpbmcgZWxlbWVudDogY29udGFpbm1lbnQgZmVhdHVyZQotCQkJLy8gc2hvdWxkIGJlIEVSZWZlcmVuY2UgdHlwZS4gIiArIGZlYXR1cmUuZ2V0TmFtZSgpKTsKLQkJCS8vIC8vcmV0dXJuIG51bGw7Ci0JCQkvLyB9Ci0KLQkJCS8vIC8vIHRoaXMgaXMgYW4gZWFzaWVyIHdheSwgdGVzdCBpdCwKLQkJCS8vIC8vIGRvZXMgbm90IHdvcmsgc2luY2UgZmVhdHVyZS5nZXRFVHlwZSgpIHJldHVybnMgdGhlIGJhc2UKLQkJCS8vIGVsZW1lbnQgdHlwZSwgbm90IHRoZSBleHRlbmRlZCBvbmUKLQkJCS8vIC8vIGZvciBleGFtcGxlLCBpdCByZXR1cm5zIE1ldGhvZFBhY2thZ2UgaW5zdGVhZCBvZgotCQkJLy8gUHJvY2Vzc1BhY2thZ2Ugb3IgQ29udGVudFBhY2thZ2UKLQkJCS8vIC8vIHNvIHdlIG5lZWQgdG8gbWFrZSBvdXIgb3duIG1hcAotCQkJLy8gRUNsYXNzaWZpZXIgYyA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJCS8vIGlmICggIWMuZ2V0TmFtZSgpLmVxdWFscyh1bWFFQ2xhc3NOYW1lKSApIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRUNsYXNzIG5hbWUgbm90IG1hdGNoOiAiICsgYy5nZXROYW1lKCkgKyAiCi0JCQkvLyAtLS0gIiArIHVtYUVDbGFzc05hbWUpOwotCQkJLy8gfQotCi0JCQlFQ2xhc3Mgb2JqQ2xhc3MgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRQotCQkJCQkuZ2V0WG1sRUNsYXNzKHVtYUVDbGFzc05hbWUpOwotCQkJaWYgKG9iakNsYXNzID09IG51bGwpIHsKLQkJCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZCgKLQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X25vX2NsYXNzLCB1bWFFQ2xhc3NOYW1lKSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCW9iaiA9IChFRGF0YU9iamVjdCkgRWNvcmVVdGlsLmNyZWF0ZShvYmpDbGFzcyk7Ci0JCQlzZXRFbGVtZW50KGd1aWQsIG9iaik7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkJCQkvLyBXb3JrT3JkZXIgaXMgbm90IGNvbnRhaW5lZCBpbiBhIHByb2Nlc3NQYWNrYWdlIGluIHhtbCBtb2RlbAotCQkJCS8vIGl0J3MgY29udGFpbmVkIGJ5IHRoZSBicmVha2Rvd25FbGVtZW50Ci0JCQkJLy8gc28gd2Ugc2F2ZSB0aGUgZWxlbWVudCBpZC1vYmplY3QgdG8gdGhlIG1hcCBhbmQgY29udGludWUKLQkJCQkvLyBkb24ndCBzZXQgdGhlIGZlYXR1cmUgdmFsdWUKLQkJCQkKLQkJCQkvLyB0aGUgd29ya09yZGVyIGluIEVQRiBVTUEgbW9kZWwgaXMgcmVmZXJlbmNlZCBieSBmZWF0dXJlCi0JCQkJLy8gV29ya0JyZWFrRG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IsCi0JCQkJLy8gdGhlIGNvcnJlc3BvbmRpbmcgZmVhdHVyZSBpbiB0aGUgeG1sIG1vZGVsIGlzIAotCQkJCS8vIFdvcmtCcmVha0Rvd25FbGVtZW50X1ByZWRlY2Vzc29yLCAKLQkJCQkvLyB0aGUgZmVhdHVyZSB2YWx1ZSBpcyBhIGxpc3Qgb2YgZ3VpZCBvZiB0aGUgV29ya09yZGVycwotCQkJCS8vIHdoZW4gdGhpcyBmZWF0dXJlIHZhbHVlIGlzIHNldCBpbiB0aGUgc2V0UmVmZXJlbmNlVmFsdWUoKSBjYWxsCi0JCQkJLy8gZ2V0IHRoZSBYbWxVbWEgb2JqZWN0LCBpZiBpdCdzIFdvcmtPcmRlciwgCi0JCQkJLy8gYWRkIHRvIHRoZSBjdXJyZW50IHdvcmtvcmRlciB0byB0aGUgV29ya0JyZWFrRG93bkVsZW1lbnQKLQkJCQkvLyBKaW5odWEgWGksIDA4LzI0LzIwMDYKLQkJCQlyZXR1cm4gb2JqOwotCQkJfQotCi0JCQkvLyBub3RlOiBhbGwgZWxlbWVudCByZWZlcmVuY2VzIGFyZSBzdHJpbmcgdHlwZSAoaWQpCi0JCQkvLyBwYWNrYWdlIHJlZmVyZW5jZXMgYXJlIG9iamVjdCByZWZlcmVuY2VzCi0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUxpc3QgdmFsdWVzID0gKExpc3QpIGNvbnRhaW5lci5lR2V0KGZlYXR1cmUpOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgewotCQkJCQkJdmFsdWVzLmFkZChndWlkKTsKLQotCQkJCQkJLy8gbmVlZCB0byBwdXQgdGhlIG9iamVjdCBpbiBhIGNvbnRhaW5lcgotCQkJCQkJLy8gZm9yIGV4YW1wbGUsIHRoZSBDb250YWllZEFydGlmYWN0cwotCQkJCQkJYWRkVG9Db250YWluZXIoY29udGFpbmVyLCBvYmopOwotCi0JCQkJCX0gZWxzZSBpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWVzLmFkZChvYmopOwotCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlsb2dnZXIKLQkJCQkJCQkJLmxvZ1dhcm5pbmcoTkxTCi0JCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudCwKLQkJCQkJCQkJCQkJCWZlYXR1cmUuZ2V0TmFtZSgpKSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKE5MUy5iaW5kKAotCQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZSwgb2JqLAotCQkJCQkJCWNvbnRhaW5lciksIGUpOwotCQkJCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSB7Ci0JCQkJCWNvbnRhaW5lci5lU2V0KGZlYXR1cmUsIGd1aWQpOwotCQkJCQlhZGRUb0NvbnRhaW5lcihjb250YWluZXIsIG9iaik7Ci0JCQkJfSBlbHNlIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgewotCQkJCQljb250YWluZXIuZVNldChmZWF0dXJlLCBvYmopOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKAotCQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50LAotCQkJCQkJCWZlYXR1cmUuZ2V0TmFtZSgpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG9iajsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVG9Db250YWluZXIoRU9iamVjdCBjb250YWluZXIsIEVPYmplY3Qgb2JqKSB7Ci0KLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkoKENvbnRlbnRQYWNrYWdlKSBjb250YWluZXIpLmdldENvbnRlbnRFbGVtZW50KCkuYWRkKChDb250ZW50RWxlbWVudClvYmopOwotCQl9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkoKFByb2Nlc3NQYWNrYWdlKSBjb250YWluZXIpLmdldFByb2Nlc3NFbGVtZW50KCkuYWRkKChQcm9jZXNzRWxlbWVudClvYmopOwotCQkJLy8gfSBlbHNlIGlmICggKG9iaiBpbnN0YW5jZW9mIENvbnN0cmFpbnQpICYmIChjb250YWluZXIgaW5zdGFuY2VvZgotCQkJLy8gTWV0aG9kRWxlbWVudCkgKSB7Ci0JCQkvLyAvLyB0aGUgb3duZXIgcnVsZSBzaG91bGQgYmUgYSBjb250YWlubWVudCAwLi5uIGZlYXR1cmUsIHdhaXRpbmcKLQkJCS8vIGZvciBtb2RlbCBmaXgKLQkJCS8vIC8vKChNZXRob2RFbGVtZW50KWNvbnRhaW5lcikuc2V0TwotCQl9IGVsc2UgewotCQkJYWRkVG9Db250YWluZXIoY29udGFpbmVyLmVDb250YWluZXIoKSwgb2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgYXR0cmlidXRlIGZlYXR1cmUgdmFsdWUuCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBmZWF0dXJlTmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXRyaWJ1dGVGZWF0dXJlVmFsdWUoRURhdGFPYmplY3Qgb2JqLCBTdHJpbmcgZmVhdHVyZU5hbWUsCi0JCQlPYmplY3QgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAob2JqID09IG51bGwgfHwgZmVhdHVyZU5hbWUgPT0gbnVsbCB8fCB2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXN0IHx8IHZhbHVlIGluc3RhbmNlb2YgRURhdGFPYmplY3QpIHsKLQkJCWlmIChmZWF0dXJlTmFtZS5lcXVhbHMoIm1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIpKSB7CQkvLyROT04tTkxTLTEkCi0JCQkJc2V0TWVwRmVhdHVyZVZhbHVlKG9iaiwgZmVhdHVyZU5hbWUsIHZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZCgKLQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfaW52YWxpZF9mZWF0dXJlX3ZhbHVlLAotCQkJCQlmZWF0dXJlTmFtZSwgdmFsdWUpKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZmluZCB0aGUgZmVhdHVyZSBhbmQgc2V0IHRoZSB2YWx1ZQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFhtbEZlYXR1cmUob2JqCi0JCQkJLmVDbGFzcygpLCBmZWF0dXJlTmFtZSk7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQotCQkJLy8gaWdub3JlIG1pc3NpbmcgZmVhdHVyZXMgZm9yIFdvcmtPcmRlcgotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgV29ya09yZGVyKSkgewotCQkJCU9iamVjdFtdIHBhcmFzID0gbmV3IE9iamVjdFtdIHsgZmVhdHVyZU5hbWUsIG9iaiwgdmFsdWUgfTsKLQkJCQlsb2dnZXIKLQkJCQkJCS5sb2dXYXJuaW5nKE5MUwotCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMiwKLQkJCQkJCQkJCQlwYXJhcykpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gMTU4Njg4IC0gTWlzc2luZyB0ZW1wbGF0ZSBmaWxlcyBpbiBleHBvcnRlZCB4bWwgbGlicmFyeQotCQkvLyBwcm9jZXNzIHRoZSBhdHRhY2htZW50IHVybAotCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50KCkgKSB7Ci0JCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7Ci0JCQkJdmFsdWUgPSBjb250ZW50UHJvYy5yZXNvbHZlQXR0YWNobWVudFJlc291cmNlcyhvYmosIHZhbHVlLnRvU3RyaW5nKCkudHJpbSgpKTsKLQkJCX0KLQkJCW9iai5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJfQotCQkKLQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSB7Ci0JCQl0cnkgewotCQkJCWlmIChmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoInZhcmlhYmlsaXR5VHlwZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdmFsdWUgPSBWYXJpYWJpbGl0eVR5cGUuZ2V0KHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJCX0gZWxzZSBpZiAoZmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJsaW5rVHlwZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdmFsdWUgPSBXb3JrT3JkZXJUeXBlLmdldCh2YWx1ZS50b1N0cmluZygpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgamF2YS51dGlsLkRhdGUpIHsKLQkJCQkJLy8gY29udmVydCBqYXZhLnV0aWwuRGF0ZSB0byB4bWwgRGF0ZQotCQkJCQl2YWx1ZSA9IGdldFhtbERhdGUoKGphdmEudXRpbC5EYXRlKSB2YWx1ZSk7Ci0JCQkJfSBlbHNlIGlmICgoY29udGVudFByb2MgIT0gbnVsbCkKLQkJCQkJCSYmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KQotCQkJCQkJJiYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJCQl2YWx1ZSA9IGNvbnRlbnRQcm9jLnJlc29sdmVSZXNvdXJjZUZpbGVzKAotCQkJCQkJCShNZXRob2RFbGVtZW50KSBvYmosIChTdHJpbmcpIHZhbHVlKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgamF2YS5uZXQuVVJJKSB7CQkJCQkJCQkJCi0JCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luIHNyY1BsdWdpbiA9IEV4cG9ydFJlc291cmNlSGFuZGxlci5nZXRTb3VyY2VQbHVnaW4oKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQpIG9iaik7CQkKLQkJCQkJdmFsdWUgPSBzcmNQbHVnaW4uZ2V0TmFtZSgpICsgIi8iICsgKChqYXZhLm5ldC5VUkkpIHZhbHVlKS5nZXRQYXRoKCk7IC8vLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoY29udGVudFByb2MgIT0gbnVsbCkgewotCQkJCQkJY29udGVudFByb2MuY29weVJlc291cmNlKChTdHJpbmcpIHZhbHVlLCBvYmosIHNyY1BsdWdpbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJb2JqLmVTZXQoZmVhdHVyZSwgdmFsdWUpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJT2JqZWN0W10gcGFyYXMgPSBuZXcgT2JqZWN0W10geyBmZWF0dXJlTmFtZSwgb2JqLCB2YWx1ZSB9OwotCQkJCWxvZ2dlcgotCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQlOTFMKLQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8yLAotCQkJCQkJCQkJCQkJcGFyYXMpLCBlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMyk7IAotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TWVwRmVhdHVyZVZhbHVlKEVEYXRhT2JqZWN0IG9iaiwgU3RyaW5nIGZlYXR1cmVOYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJTGlzdCBzcmNMaXN0ID0gKExpc3QpIHZhbHVlOwotCQlpZiAoc3JjTGlzdCA9PSBudWxsIHx8IHNyY0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5nZXRYbWxGZWF0dXJlKG9iagotCQkJCS5lQ2xhc3MoKSwgZmVhdHVyZU5hbWUpOwotCQlMaXN0IHRndExpc3QgPSAoTGlzdCkgb2JqLmVHZXQoZmVhdHVyZSk7Ci0JCWZvciAoaW50IGk9MDsgaSA8IHNyY0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBzcmNJdGVtID0gc3JjTGlzdC5nZXQoaSk7Ci0JCQlpZiAoc3JjSXRlbSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5KSB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkgbWVwID0gCi0JCQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkpIHNyY0l0ZW07Ci0JCQkJRUNsYXNzIG9iakNsYXNzID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UKLQkJCQkuZ2V0WG1sRUNsYXNzKCJNZXRob2RFbGVtZW50UHJvcGVydHkiKTsJLy8kTk9OLU5MUy0xJAotCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSB4bWxNZXAgPSAoTWV0aG9kRWxlbWVudFByb3BlcnR5KSBFY29yZVV0aWwuY3JlYXRlKG9iakNsYXNzKTsKLQkJCQl4bWxNZXAuc2V0VmFsdWUobWVwLmdldFZhbHVlKCkpOwotCQkJCXhtbE1lcC5zZXROYW1lKG1lcC5nZXROYW1lKCkpOwotCQkJCXRndExpc3QuYWRkKHhtbE1lcCk7Ci0JCQl9Ci0JCX0KLQkJLy9vYmouZVNldChmZWF0dXJlLCB0Z3RMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIGlkIHJlZmVyZW5jZXMgZm9yIHRoZSBvYmplY3QKLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBFRGF0YU9iamVjdCB0aGUgb2JqZWN0Ci0JICogQHBhcmFtIGZlYXR1cmVOYW1lCi0JICogICAgICAgICAgICBTdHJpbmcgdGhlIGZlYXR1cmUgb2YgdGhlIG9iamVjdAotCSAqIEBwYXJhbSBpZFZhbHVlCi0JICogICAgICAgICAgICBTdHJpbmcgdGhlIGlkIHJlZmVyZW5jZSB2YWx1ZSBvZiB0aGUgZmVhdHVyZQotCSAqIEBwYXJhbSB2YWx1ZVR5cGUKLQkgKiAgICAgICAgICAgIFR5cGUgdGhlIG9iamVjdCB0eXBlIG9mIHRoZSByZWZlcmVuY2UuIE5lZWQgdG8gaGF2ZSB0aGlzIHRvCi0JICogICAgICAgICAgICBkZXRlcm1pbmUgdGhlIHhtbCBmZWF0dXJlIGluIGNhc2UgdGhlIGZlYXR1cmUgbWFwcHRpbmcgaXMgbm90Ci0JICogICAgICAgICAgICB1bmlxdWUKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZVZhbHVlKEVEYXRhT2JqZWN0IG9iaiwgU3RyaW5nIGZlYXR1cmVOYW1lLAotCQkJU3RyaW5nIGlkVmFsdWUsIFR5cGUgdmFsdWVUeXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKG9iaiA9PSBudWxsIHx8IGZlYXR1cmVOYW1lID09IG51bGwgfHwgaWRWYWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuaXNVbm5lZWRlZFJtY0ZlYXR1cmUoZmVhdHVyZU5hbWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBmaW5kIHRoZSBmZWF0dXJlIGFuZCBzZXQgdGhlIHZhbHVlCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuZ2V0WG1sRmVhdHVyZShvYmoKLQkJCQkuZUNsYXNzKCksIGZlYXR1cmVOYW1lLCB2YWx1ZVR5cGUuZ2V0TmFtZSgpKTsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgewotCQkJT2JqZWN0W10gcGFyYXMgPSBuZXcgT2JqZWN0W10geyBmZWF0dXJlTmFtZSwgb2JqLCBpZFZhbHVlIH07Ci0JCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZCgKLQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZSwgcGFyYXMpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBzdHIgPSBmZWF0dXJlLmdldEVUeXBlKCkuZ2V0TmFtZSgpOwotCQlpZiAoc3RyLmVxdWFscygiU3RyaW5nIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlMaXN0IGwgPSAoTGlzdCkgb2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKCFsLmNvbnRhaW5zKGlkVmFsdWUpKSB7Ci0JCQkJCWwuYWRkKGlkVmFsdWUpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJb2JqLmVTZXQoZmVhdHVyZSwgaWRWYWx1ZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50KCkpIHsKLQkJCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGJyZWFrZG93biBlbGVtZW50LiBJbiB1bWEsIGJyZWFrZG93bgotCQkJLy8gZWxlbWVudHMgYXJlIHVuZGVyIHByb2Nlc3MgcGFja2FnZXMKLQkJCS8vIGluIHhtbCBtb2RlbCwgdGhleSBhcmUgb3duZWQgYnkgdGhlIGFjdGl2aXR5Ci0JCQlFRGF0YU9iamVjdCB2ID0gZ2V0RWxlbWVudChpZFZhbHVlKTsKLQkJCWlmICh2IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCUVPYmplY3Qgb2xkX2NvbnRhaW5lciA9IHYuZUNvbnRhaW5lcigpOwotCQkJCUxpc3QgbCA9IChMaXN0KSBvYmouZUdldChmZWF0dXJlKTsKLQkJCQlpZiAoIWwuY29udGFpbnModikpIHsKLQkJCQkJbC5hZGQodik7Ci0JCQkJfQotCi0JCQkJLy8gaWYgdGhlIG9sZCBjb250YWluZXIgcGFja2FnZSBpcyBlbXB0eSwgZGVsZXRlIGl0Ci0JCQkJaWYgKChvbGRfY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpCi0JCQkJCQkmJiAob2xkX2NvbnRhaW5lci5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSkgewotCQkJCQlpZiAoKChQcm9jZXNzUGFja2FnZSkgb2xkX2NvbnRhaW5lcikuZ2V0UHJvY2Vzc0VsZW1lbnQoKQotCQkJCQkJCS5zaXplKCkgPT0gMCkgewotCQkJCQkJKChQcm9jZXNzUGFja2FnZSkgb2xkX2NvbnRhaW5lci5lQ29udGFpbmVyKCkpCi0JCQkJCQkJCS5nZXRNZXRob2RQYWNrYWdlKCkucmVtb3ZlKG9sZF9jb250YWluZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29yKCkgKSB7Ci0JCQkvLyB0aGUgb3JrZXIgb3JkZXIgbmVlZHMgdG8gYmUgYWRkZWQgdG8gdGhlIFdvcmtCcmVha2Rvd25FbGVtZW50Ci0JCQkvLyBzaW5jZSBpbiBYbWwgbW9kZWwgdGhlIHdvcmsgb3JkZXIgaXMgY29udGFpbmVkIGJ5IHRoZSBXb3JrQnJlYWtkb3duRWxlbWVudAotCQkJLy8gSmluaHVhIFhpLCAwOC8yNC8yMDA2Ci0JCQlPYmplY3QgdiA9IGdldEVsZW1lbnQoaWRWYWx1ZSk7Ci0JCQlpZiAodiBpbnN0YW5jZW9mIFdvcmtPcmRlcikgewotCQkJCSgoV29ya0JyZWFrZG93bkVsZW1lbnQpb2JqKS5nZXRQcmVkZWNlc3NvcigpLmFkZCgoV29ya09yZGVyKXYpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gbm90IGhhbmRsZWQsIGFkZCB3YXJuaW5nIGxvZwotCQkJLy8gdGhlIGlkIGZlYXR1cmUgdmFsdWUgaXMgbm90IHNldAotCQkJLy8gSkluaHVhIFhpLCBUT0RPCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZHQKLQkgKiBAcmV0dXJuIGEgWG1sIGRhdGUuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRYbWxEYXRlKGphdmEudXRpbC5EYXRlIGR0KSB7Ci0JCVNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQgaGg6bW06c3MiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZHRTdHIgPSBzZGYuZm9ybWF0KGR0KTsKLQkJZHRTdHIgPSBkdFN0ci5yZXBsYWNlKCcgJywgJ1QnKTsKLQkJRURhdGFUeXBlIHR5cGUgPSBYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGF0ZVRpbWUoKTsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKHR5cGUsIGR0U3RyKTsKLQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN0cmluZyhPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBzdHIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJTWV0aG9kRWxlbWVudCBtZSA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQlzdHIgPSBtZS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgbWUuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAob2JqICE9IG51bGwpIHsKLQkJCXN0ciA9IG9iai50b1N0cmluZygpOwotCQl9Ci0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLQkvKioKLQkgKiBmaXggdGhlIGxpYnJhcnkgc28gdGhhdCBpdCBtZWV0cyB0aGUgdW1hIGxpYnJhcnkgc3RhbmRhcmRzCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZml4TGlicmFyeUZvckltcG9ydCgpIHsKLQotCQlmaXhHdWlkKChNZXRob2RFbGVtZW50KSByb290T2JqZWN0KTsKLQotCQlpZiAocm9vdE9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSAoKE1ldGhvZExpYnJhcnkpIHJvb3RPYmplY3QpLmdldE1ldGhvZFBsdWdpbigpCi0JCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJZml4UGx1Z2luKChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocm9vdE9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJZml4UGx1Z2luKChNZXRob2RQbHVnaW4pIHJvb3RPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZml4IHRoZSBsaWJyYXJ5IHNvIHRoYXQgaXQgbWVldHMgdGhlIHhtbCBzY2hlbWEgc3RhbmRhcmRzCi0JICogYWxzbyByZW1vdmUgcG9zc2libGUgc3RydWN0dXJlIGVycm9ycyBzdWNoIGFzIFByb2Nlc3NDb21wb25lbnQgd2l0aG91dCBwcm9jZXNzIGluIGl0LgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpeExpYnJhcnlGb3JFeHBvcnQoKSB7Ci0KLQkJTGlzdCBpbnZhbGlkSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSAoKE1ldGhvZExpYnJhcnkpIHJvb3RPYmplY3QpLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50ICkgewotCQkJCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudClvYmopLmdldFByb2Nlc3MoKTsKLQkJCQlpZiAoIHByb2MgPT0gbnVsbCApIHsKLQkJCQkJaW52YWxpZEl0ZW1zLmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHJlbW92ZSB0aGUgb2JqZWN0cwotCQl3aGlsZSAoaW52YWxpZEl0ZW1zLnNpemUoKSA+IDAgKSB7Ci0JCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KWludmFsaWRJdGVtcy5yZW1vdmUoMCk7Ci0JCQlFY29yZVV0aWwucmVtb3ZlKG9iaik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogZml4IHRhc2sgZGVzY3JpcHRvcnMgZm9yIGV4cG9ydAotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpeFRhc2tEZXNjcmlwdG9yc0ZvckV4cG9ydChNYXA8U3RyaW5nLCBUYXNrRGVzY3JpcHRvcj4gdGRNYXApIHsKLQkJaWYgKHRkTWFwID09IG51bGwgfHwgdGRNYXAuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0JCQotCQlmb3IgKEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFRhc2tEZXNjcmlwdG9yPj4gaXQgPSB0ZE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeTxTdHJpbmcsIFRhc2tEZXNjcmlwdG9yPiBlbnRyeSA9IGl0Lm5leHQoKTsKLQkJCVN0cmluZyBndWlkID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQlUYXNrRGVzY3JpcHRvciB0ZCA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciB4bWxUZCA9IChvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvcikgZWxlbWVudHNNYXAuZ2V0KGd1aWQpOwotCQkJYXNzZXJ0KHhtbFRkICE9IG51bGwpOwotCQkJaWYgKHhtbFRkID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUxpc3Qgc3RlcHMgPSB0ZC5nZXRTZWxlY3RlZFN0ZXBzKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8c3RlcHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQgc3RlcCA9IChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpIHN0ZXBzLmdldChpKTsKLQkJCQlTZWN0aW9uIHhtbFN0ZXAgPSAgKFNlY3Rpb24pIGVsZW1lbnRzTWFwLmdldChzdGVwLmdldEd1aWQoKSk7Ci0JCQkJYXNzZXJ0KHhtbFN0ZXAgIT0gbnVsbCk7Ci0JCQkJaWYgKHhtbFN0ZXAgIT0gbnVsbCkgewotCQkJCQl4bWxTdGVwID0gKFNlY3Rpb24pIEVjb3JlVXRpbC5jb3B5KHhtbFN0ZXApOwotCQkJCQl4bWxUZC5nZXRTdGVwKCkuYWRkKHhtbFN0ZXApOwotCQkJCX0KLQkJCX0JCQkKLQkJfQkJCi0JfQotCQkJCi0JLyoqCi0JICogZ2V0IGEgbGlzdCBvZiByZWZlcmVuY2VkIHBsdWdpbnMgZm9yIHRoZSBsaWJyYXJ5LiBUaGUgcmVmZXJlbmNlZCBwbHVnaW5zCi0JICogZG9lcyBub3QgaW5jbHVkZSB0aGUgb25lcyBpbnNpZGUgdGhpcyBsaWJyYXJ5LiBXaGVuIGltcG9ydGluZywgdGhlc2UKLQkgKiBwbHVnaW5zIG11c3QgYmUgaW4gdGhlIHRhcmdldCBsaWJyYXJ5IGFscmVhZHkuCi0JICogCi0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiByZWZlcmVuY2VkIHBsdWdpbnMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWZlcmVuY2VkUGx1Z2lucygpIHsKLQotCQlMaXN0IGV4dGVybmFsUGx1Z2lucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpZiAoIShyb290T2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkpIHsKLQkJCXJldHVybiBleHRlcm5hbFBsdWdpbnM7Ci0JCX0KLQotCQlMaXN0IHNlbGVjdGVkUGx1Z2lucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9ICgoTWV0aG9kTGlicmFyeSkgcm9vdE9iamVjdCkuZ2V0TWV0aG9kUGx1Z2luKCkKLQkJCQkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBpZCA9IHBsdWdpbi5nZXRJZCgpOwotCQkJc2VsZWN0ZWRQbHVnaW5zLmFkZChpZCk7Ci0JCQlpZiAoZXh0ZXJuYWxQbHVnaW5zLmNvbnRhaW5zKGlkKSkgewotCQkJCWV4dGVybmFsUGx1Z2lucy5yZW1vdmUoaWQpOwotCQkJfQotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHBsdWdpbi5nZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCkuaXRlcmF0b3IoKTsgaXRyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIHJlZiA9IChTdHJpbmcpIGl0ci5uZXh0KCk7Ci0JCQkJaWYgKCFzZWxlY3RlZFBsdWdpbnMuY29udGFpbnMocmVmKQotCQkJCQkJJiYgIWV4dGVybmFsUGx1Z2lucy5jb250YWlucyhyZWYpKSB7Ci0JCQkJCWV4dGVybmFsUGx1Z2lucy5hZGQocmVmKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZXh0ZXJuYWxQbHVnaW5zOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaXhHdWlkKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBpZiB0aGUgeG1sIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhbiBpZCBzcGVjaWZpZWQsIGNyZWF0ZSBhIG5ldyBvbmUKLQkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRJZCgpOwotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlkID0gRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpOwotCQkJZWxlbWVudC5zZXRJZChpZCk7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfbmV3X2lkLAotCQkJCQlnZXRTdHJpbmcoZWxlbWVudCksIGlkKTsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKG1zZyk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBjaGVjayBpZiB0aGUgZWxlbWVudCBoYXMgYSB1bmlxdWUgaWQgb3Igbm90Ci0JCQlPYmplY3Qgb2xkID0gZ2V0RWxlbWVudChpZCk7Ci0JCQlpZiAoKG9sZCAhPSBudWxsKSAmJiAob2xkICE9IGVsZW1lbnQpKSB7Ci0JCQkJaWYgKCEgKCAob2xkIGluc3RhbmNlb2YgU2VjdGlvbikgJiYgCi0JCQkJCQkoZWxlbWVudCBpbnN0YW5jZW9mIFNlY3Rpb24pIAotCQkJCQkgICApKSB7Ci0JCQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKAotCQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfaWRfbm90X3VuaXF1ZSwgaWQpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXNldEVsZW1lbnQoaWQsIGVsZW1lbnQpOwotCQl9Ci0JCS8vIGl0ZXJhdGUgdGhlIGNoaWxkcmVuCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50LmVDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJZml4R3VpZCgoTWV0aG9kRWxlbWVudCkgbyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZml4UGx1Z2luKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQotCQkvLyBmaW5kIGFsbCBwcm9jZXNzZXMgYW5kIG1ha2Ugc3VyZSB0aGV5IGFyZSB3cmFwcGVkIHdpdGggYQotCQkvLyBQcm9jZXNzQ29tcG9uZW50LAotCQkvLyBpZiBub3QsIGNyZWF0ZSBvbmUuCi0JCS8vIGNvbGxlY3QgdGhlIHByb2Nlc3NlcyB0byBiZSBmaXhlZCwKLQkJLy8gZG9uJ3QgZml4IHdpdGhpbiB0aGUgaXRlcmF0aW9uLCBtYXkgY2F1c2UgY29uY3VycmVudCBtb2RpZmljYXRpb24KLQkJLy8gZXhlY2VwdGlvbgotCQlMaXN0IHByb2NzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2luLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJaWYgKGlzUHJvY2VzcyhvKSkgewotCQkJCXByb2NzLmFkZChvKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9jcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcHJvY3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWZpeFByb2Nlc3MoKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MpIGl0Lm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbiBFUEYsIGEgcHJvY2VzcyAoQ2FwYWJpbGl0eSBwYXR0ZXJuIGFuZCBEZWxpdmVyeSBQcm9jZXNzKSBjYW4gYmUgcmVzaWRlCi0JICogaW4gYSBQcm9jZXNzUGFja2FnZSBvciBhIFByb2Nlc3NDb21wb25lbnQuIElmIGl0J3MgaW4gYSBwcm9jZXNzQ29tcG9uZW50LAotCSAqIGl0IGlzIHRyZWF0ZWQgYXMgYSByb290IGxldmVsIHByb2Nlc3MuIElmIGl0J3MgaW4gYSBQcm9jZXNzUGFja2FnZSwgaXQgaXMKLQkgKiB0cmVhdGVkIGFzIGEgbG9jYWwgY29weSBvZiBhbm90aGVyIHByb2Nlc3MuIFNvIHdlIG5lZWQgdG8gY2hlY2sgdGhlCi0JICogcGFyZW50IGFuZCBzZWUgaXQgdGhpcyBwcm9jZXNzIGlzIGNvbnRhaW5lZCBieSBhIFByb2Nlc3NDb21wb25lbnQuCi0JICogCi0JICogQHBhcmFtIE9iagotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1Byb2Nlc3MoRU9iamVjdCBvYmopIHsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCW9iaiA9IG9iai5lQ29udGFpbmVyKCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8vIGlmIGl0J3MgaW1tZWRpYXRlIHBhcmVudCBpcyBub3QgYSBQcm9jZXNzQ29tcG9uZW50IGJ1dCBpdCdzIHdpdGhpbiBhCi0JCS8vIFByb2Nlc3NDb21wb25lbnQKLQkJLy8gaXQncyBhIGxvY2FsIGNvcHkgb2YgdGhlIHByb2Nlc3MKLQkJd2hpbGUgKCgob2JqID0gb2JqLmVDb250YWluZXIoKSkgIT0gbnVsbCkKLQkJCQkmJiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaXhQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgcHJvYykgewotCQlFRGF0YU9iamVjdCBjb250YWluZXIgPSAoRURhdGFPYmplY3QpIHByb2MuZUNvbnRhaW5lcigpOwotCQlQcm9jZXNzQ29tcG9uZW50IHBjID0gbnVsbDsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICghKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSkgewotCQkJU3RyaW5nIG1zZyA9IE5MUwotCQkJCQkuYmluZCgKLQkJCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9wcm9jZXNzX3dyb25nX2NvbnRhaW5lciwKLQkJCQkJCQlwcm9jLmdldE5hbWUoKSwgY29udGFpbmVyLmdldFR5cGUoKS5nZXROYW1lKCkpOwotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcobXNnKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXBjID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpOwotCQlTdHJpbmcgaWQgPSBnZXRUYXJnZXRQYXJlbnRJZChwcm9jLmdldElkKCkpOwotCQlpZiAoaWQgPT0gbnVsbCkgewotCQkJaWQgPSBFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCk7Ci0JCX0KLQotCQlwYy5zZXRJZChpZCk7Ci0JCXBjLnNldE5hbWUocHJvYy5nZXROYW1lKCkpOwotCQkoKFByb2Nlc3NQYWNrYWdlKSBjb250YWluZXIpLmdldFByb2Nlc3NFbGVtZW50KCkucmVtb3ZlKHByb2MpOwotCQkoKFByb2Nlc3NQYWNrYWdlKSBjb250YWluZXIpLmdldE1ldGhvZFBhY2thZ2UoKS5hZGQocGMpOwotCQlwYy5zZXRQcm9jZXNzKHByb2MpOwotCi0JfQotCi0JLyoqCi0JICogaWYgdGhlIHByb2Nlc3MgZXhpc3RzIGluIHRoZSB0YXJnZXQgbGlicmFyeSwgZ2V0IHRoZSBwcm9jZXNzIGNvbXBvbmVudCBpZAotCSAqIGZyb20gdGhlIHRhcmdldCBsaWJyYXJ5Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGFyZ2V0UGFyZW50SWQoU3RyaW5nIGlkKSB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJRU9iamVjdCBvYmogPSBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQoaWQpOwotCQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQkJb2JqID0gb2JqLmVDb250YWluZXIoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkgb2JqKS5nZXRHdWlkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBrZwotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIHByb2Nlc3NlcyBpbiBwa2cuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWxsUHJvY2Vzc2VzKE1ldGhvZFBhY2thZ2UgcGtnKSB7Ci0JCUxpc3QgcHJvY2Vzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlfaXRlcmF0ZVBhY2thZ2VGb3JQcm9jZXNzZXMocGtnLCBwcm9jZXNzZXMpOwotCi0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9pdGVyYXRlUGFja2FnZUZvclByb2Nlc3NlcyhNZXRob2RQYWNrYWdlIHBrZywgTGlzdCBwcm9jZXNzZXMpIHsKLQkJaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgcCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgcGtnKQotCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJaWYgKHAgIT0gbnVsbCAmJiAhcHJvY2Vzc2VzLmNvbnRhaW5zKHApKSB7Ci0JCQkJcHJvY2Vzc2VzLmFkZChwKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBwa2cuZ2V0TWV0aG9kUGFja2FnZSgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCV9pdGVyYXRlUGFja2FnZUZvclByb2Nlc3NlcygoTWV0aG9kUGFja2FnZSkgaXQubmV4dCgpLCBwcm9jZXNzZXMpOwotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogU2F2ZSBleHRyYSBpbmZvIChhbGwgcGx1Z2luIGd1aWRzIGFuZCBuYW1lcykgaW4gbGliVGFnJ3MgTWV0aG9kRWxlbWVudFByb3BlcnR5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVFeHRyYUluZm8oTGlzdDxvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbj4gcGx1Z2lucykgewotCQlpZiAocGx1Z2lucyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0JCQotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5nZXRYbWxGZWF0dXJlKHJvb3RPYmplY3QKLQkJCQkuZUNsYXNzKCksICJtZXRob2RFbGVtZW50UHJvcGVydHkiKTsJCS8vJE5PTi1OTFMtMSQKLQkJCi0JCUxpc3QgbWVwTGlzdCA9IChMaXN0KSByb290T2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCUVDbGFzcyBtZXBDbGFzcyA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFhtbEVDbGFzcygiTWV0aG9kRWxlbWVudFByb3BlcnR5Iik7CS8vJE5PTi1OTFMtMSQKLQkJCi0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSB4bWxNZXAgPSAoTWV0aG9kRWxlbWVudFByb3BlcnR5KSBFY29yZVV0aWwuY3JlYXRlKG1lcENsYXNzKTsKLQkJCi0JCS8vVmVyc2lvbgotCQl4bWxNZXAuc2V0VmFsdWUoIjAiKTsJLy8kTk9OLU5MUy0xJAotCQltZXBMaXN0LmFkZCh4bWxNZXApOwotCQkJCQkKLQkJZm9yIChJdGVyYXRvcjxvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbj4gaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luIHBsdWcgPSBpdC5uZXh0KCk7Ci0JCQkKLQkJCXhtbE1lcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpIEVjb3JlVXRpbC5jcmVhdGUobWVwQ2xhc3MpOwotCQkJeG1sTWVwLnNldFZhbHVlKHBsdWcuZ2V0R3VpZCgpKTsKLQkJCW1lcExpc3QuYWRkKHhtbE1lcCk7Ci0JCQkKLQkJCXhtbE1lcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpIEVjb3JlVXRpbC5jcmVhdGUobWVwQ2xhc3MpOwotCQkJeG1sTWVwLnNldFZhbHVlKHBsdWcuZ2V0TmFtZSgpKTsKLQkJCW1lcExpc3QuYWRkKHhtbE1lcCk7Ci0JCX0KLQkJCi0JfQotCQotCS8qKgotCSAqIEdldCBndWlkIHRvIHBsdWdpbiBtYXAKLQkgKi8KLQlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRHdWlkVG9QbHVnTmFtZU1hcCgpIHsKLQkJaWYgKGd1aWRUb1BsdWdOYW1lTWFwID09IG51bGwpIHsKLQkJCXJlY2FsbEV4dHJhSW5mbygpOwotCQl9CQkKLQkJcmV0dXJuIGd1aWRUb1BsdWdOYW1lTWFwOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVjYWxsRXh0cmFJbmZvKCkgewotCQl0cnkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5nZXRYbWxGZWF0dXJlKHJvb3RPYmplY3QKLQkJCQkJLmVDbGFzcygpLCAibWV0aG9kRWxlbWVudFByb3BlcnR5Iik7CQkvLyROT04tTkxTLTEkCi0JCQkKLQkJCUxpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5PiBtZXBMaXN0ID0gKExpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5Pikgcm9vdE9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG1lcExpc3QgPT0gbnVsbCB8fCBtZXBMaXN0LmlzRW1wdHkoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWd1aWRUb1BsdWdOYW1lTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCQkKLQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBtZXAgPSBtZXBMaXN0LmdldCgwKTsKLQkJCWlmIChtZXAuZ2V0VmFsdWUoKS5lcXVhbHMoIjAiKSkgeyAvLyROT04tTkxTLTEkICAKLQkJCQlmb3IgKGludCBpID0gMTsgaSA8IG1lcExpc3Quc2l6ZSgpOykgewotCQkJCQlTdHJpbmcgZ3VpZCA9IG1lcExpc3QuZ2V0KGkpLmdldFZhbHVlKCk7Ci0JCQkJCVN0cmluZyBuYW1lID0gbWVwTGlzdC5nZXQoaSsxKS5nZXRWYWx1ZSgpOwotCQkJCQlndWlkVG9QbHVnTmFtZU1hcC5wdXQoZ3VpZCwgbmFtZSk7Ci0JCQkJCWkgKz0gMjsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlndWlkVG9QbHVnTmFtZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmI3Njc1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBhbmQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBFeHBvcnQgWE1MIHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvRXhwb3J0WE1MV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9FeHBvcnRYTUxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYwNDI4NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9FeHBvcnRYTUxXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5FeHBvcnRYTUxSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwucHJlZmVyZW5jZXMuRXhwb3J0WE1MUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuc2VydmljZXMuRXhwb3J0WE1MRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcy5FeHBvcnRYTUxTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIFRoZSBFeHBvcnQgWE1MIHdpemFyZC4KLSAqIDxwPgotICogVGhpcyB3aXphcmQgaXMgdXNlZCB0byBleHBvcnQgbWV0aG9kIGxpYnJhcnkgY29udGVudCB0byBYTUwgZmlsZXMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFhNTFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElJbXBvcnRXaXphcmQgewotCi0JcHJpdmF0ZSBTZWxlY3RFeHBvcnRUeXBlUGFnZSBzZWxlY3RFeHBvcnRUeXBlUGFnZTsKLQotCXByb3RlY3RlZCBTZWxlY3RQbHVnaW5QYWdlIHNlbGVjdFBsdWdpblBhZ2U7Ci0KLQlwcm90ZWN0ZWQgVmlld1BsdWdpbkluZm9QYWdlIHZpZXdQbHVnaW5JbmZvUGFnZTsKLQotCXByb3RlY3RlZCBWaWV3RXhwb3J0U3VtbWFyeVBhZ2Ugdmlld0V4cG9ydFN1bW1hcnlQYWdlOwotCi0JcHJvdGVjdGVkIFNlbGVjdENvbmZpZ1BhZ2Ugc2VsZWN0Q29uZmlnUGFnZTsKLQotCXByb3RlY3RlZCBTZWxlY3RYTUxGaWxlUGFnZSBzZWxlY3RYTUxGaWxlUGFnZTsKLQotCXByb3RlY3RlZCBFeHBvcnRYTUxEYXRhIHhtbERhdGEgPSBuZXcgRXhwb3J0WE1MRGF0YSgpOwotCi0JcHJvdGVjdGVkIFBsdWdpbkV4cG9ydERhdGEgcGx1Z2luRGF0YSA9IG5ldyBQbHVnaW5FeHBvcnREYXRhKCk7Ci0KLQlwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgY29uZmlnRGF0YSA9IG5ldyBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0WE1MV2l6YXJkKCkgewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZShFeHBvcnRYTUxSZXNvdXJjZXMuZXhwb3J0WE1MV2l6YXJkX3RpdGxlKTsKLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXNlbGVjdEV4cG9ydFR5cGVQYWdlID0gbmV3IFNlbGVjdEV4cG9ydFR5cGVQYWdlKCk7Ci0JCXNlbGVjdFBsdWdpblBhZ2UgPSBuZXcgU2VsZWN0UGx1Z2luUGFnZShwbHVnaW5EYXRhKTsKLQkJdmlld1BsdWdpbkluZm9QYWdlID0gbmV3IFZpZXdQbHVnaW5JbmZvUGFnZShwbHVnaW5EYXRhKTsKLQkJdmlld0V4cG9ydFN1bW1hcnlQYWdlID0gbmV3IFZpZXdFeHBvcnRTdW1tYXJ5UGFnZShwbHVnaW5EYXRhKTsKLQkJc2VsZWN0Q29uZmlnUGFnZSA9IG5ldyBTZWxlY3RDb25maWdQYWdlKGNvbmZpZ0RhdGEpOwotCQlzZWxlY3RYTUxGaWxlUGFnZSA9IG5ldyBTZWxlY3RYTUxGaWxlUGFnZSgpOwotCi0JCWFkZFBhZ2Uoc2VsZWN0RXhwb3J0VHlwZVBhZ2UpOwotCQlhZGRQYWdlKHNlbGVjdFBsdWdpblBhZ2UpOwotCQlhZGRQYWdlKHZpZXdQbHVnaW5JbmZvUGFnZSk7Ci0JCWFkZFBhZ2Uodmlld0V4cG9ydFN1bW1hcnlQYWdlKTsKLQkJYWRkUGFnZShzZWxlY3RDb25maWdQYWdlKTsKLQkJYWRkUGFnZShzZWxlY3RYTUxGaWxlUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCQkiZnVsbC9vYmoxNi9YTUxGaWxlLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCXJldHVybiBnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpID09IHNlbGVjdFhNTEZpbGVQYWdlCi0JCQkJJiYgc2VsZWN0WE1MRmlsZVBhZ2UuaXNQYWdlQ29tcGxldGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCVN0cmluZyB4bWxGaWxlUGF0aCA9IHNlbGVjdFhNTEZpbGVQYWdlLmdldFBhdGgoKTsKLQkJRmlsZSB4bWxGaWxlID0gbmV3IEZpbGUoeG1sRmlsZVBhdGgpOwotCQlpZiAoeG1sRmlsZS5leGlzdHMoKSkgewotCQkJYm9vbGVhbiBvayA9IEV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlQcm9tcHQoCi0JCQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydFhNTFdpemFyZF90aXRsZSwKLQkJCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMuYmluZCgKLQkJCQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy5vdmVyd3JpdGVUZXh0X21zZywKLQkJCQkJCQkJCW5ldyBTdHJpbmdbXSB7IHhtbEZpbGVQYXRoIH0pKTsKLQkJCWlmICghb2spIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCUV4cG9ydFhNTFNlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5iZWdpblRhc2soRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydGluZ1hNTF90ZXh0LAotCQkJCQkJCUlQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0KLQkJCQkJeG1sRGF0YS5zZXRYTUxGaWxlKHNlbGVjdFhNTEZpbGVQYWdlLmdldFBhdGgoKSk7Ci0JCQkJCXNlcnZpY2UgPSBuZXcgRXhwb3J0WE1MU2VydmljZSh4bWxEYXRhKTsKLQkJCQkJc2VydmljZS5kb0V4cG9ydChtb25pdG9yKTsKLQkJCQkJRXhwb3J0WE1MUHJlZmVyZW5jZXMuc2V0RXhwb3J0VHlwZSh4bWxEYXRhLmdldEV4cG9ydFR5cGUoKSk7Ci0JCQkJCUV4cG9ydFhNTFByZWZlcmVuY2VzLnNldFhNTEZpbGUoeG1sRGF0YS5nZXRYTUxGaWxlKCkpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQlpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0JCQkJCQlzZXJ2aWNlLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCBmYWxzZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVGhyb3dhYmxlIHJlYWxFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRYTUxXaXphcmRfdGl0bGUsCi0JCQkJCU5MUy5iaW5kKEV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRYTUxXaXphcmRfZXJyb3IsCi0JCQkJCQkJcmVhbEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpLCByZWFsRXhjZXB0aW9uKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZyBtc2cgPSBFeHBvcnRYTUxSZXNvdXJjZXMuZXhwb3J0WE1MV2l6YXJkX3Jldmlld0xvZzsKLQkJTXNnQm94LnByb21wdChtc2csIFNXVC5PSyk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RDb25maWdQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RDb25maWdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZTZjYmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvU2VsZWN0Q29uZmlnUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLkV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBvbmUgb3IgbW9yZSBtZXRob2QgY29uZmlndXJhdGlvbgotICogc3BlY2lmaWNhdGlvbnMgdG8gZXhwb3J0LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdENvbmZpZ1BhZ2UgZXh0ZW5kcyBFeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXMgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdENvbmZpZ1BhZ2UoQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihkYXRhKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlzdXBlci5zYXZlRGF0YVRvTW9kZWwoKTsKLQkJRXhwb3J0WE1MV2l6YXJkIHdpemFyZCA9IChFeHBvcnRYTUxXaXphcmQpIGdldFdpemFyZCgpOwotCQl3aXphcmQueG1sRGF0YS5zZXRTZWxlY3RlZENvbmZpZ3Mod2l6YXJkLmNvbmZpZ0RhdGEuc2VsZWN0ZWRDb25maWdzKTsJCQotCQlyZXR1cm4gd2l6YXJkLnNlbGVjdFhNTEZpbGVQYWdlOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1NlbGVjdEV4cG9ydFR5cGVQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RFeHBvcnRUeXBlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTRhMTA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1NlbGVjdEV4cG9ydFR5cGVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5FeHBvcnRYTUxSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwucHJlZmVyZW5jZXMuRXhwb3J0WE1MUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuc2VydmljZXMuRXhwb3J0WE1MRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IGRpc3BsYXlzIHRoZSB0eXBlIG9mIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgdG8gZXhwb3J0LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RFeHBvcnRUeXBlUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMgTGlzdGVuZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0RXhwb3J0VHlwZVBhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBCdXR0b24gZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uOwotCi0JLy8gUG9zdHBvbmVkIHRvIG5leHQgcmVsZWFzZS4KLQkvL3ByaXZhdGUgQnV0dG9uIGV4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdEV4cG9ydFR5cGVQYWdlKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShFeHBvcnRSZXNvdXJjZXMuc2VsZWN0RXhwb3J0VHlwZVBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRYTUxSZXNvdXJjZXMuc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vRXhwb3J0WE1MLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oY29udGFpbmVyLAotCQkJCUV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRMaWJyYXJ5UmFkaW9CdXR0b25fdGV4dCwgMSwgZmFsc2UpOwotCi0JCWV4cG9ydFBsdWdpbnNSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKGNvbnRhaW5lciwKLQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMuZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uX3RleHQsIDEsIGZhbHNlKTsKLQotCQkvLyBQb3N0cG9uZWQgdG8gbmV4dCByZWxlYXNlLgotCQkvL2V4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKGNvbnRhaW5lciwKLQkJLy8JCUV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRDb25maWdzUmFkaW9CdXR0b25fdGV4dCwgMSwgZmFsc2UpOwotCQkKLQkJc3dpdGNoIChFeHBvcnRYTUxQcmVmZXJlbmNlcy5nZXRFeHBvcnRUeXBlKCkpIHsKLQkJY2FzZSBFeHBvcnRYTUxEYXRhLkVYUE9SVF9NRVRIT0RfTElCUkFSWToKLQkJCWV4cG9ydExpYnJhcnlSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBFeHBvcnRYTUxEYXRhLkVYUE9SVF9NRVRIT0RfUExVR0lOUzoKLQkJCWV4cG9ydFBsdWdpbnNSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlicmVhazsKLQkJLy8gUG9zdHBvbmVkIHRvIG5leHQgcmVsZWFzZS4JCQkKLQkJLy9jYXNlIEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9DT05GSUdTOgotCQkvLwlleHBvcnRDb25maWdzUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkvLwlicmVhazsKLQkJfQotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWV4cG9ydExpYnJhcnlSYWRpb0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQkvLyBQb3N0cG9uZWQgdG8gbmV4dCByZWxlYXNlLgkJCi0JCS8vZXhwb3J0Q29uZmlnc1JhZGlvQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQoRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShMaWJyYXJ5VUlSZXNvdXJjZXMubm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBnZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsOwotCX0JCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCUV4cG9ydFhNTFdpemFyZCB3aXphcmQgPSAoRXhwb3J0WE1MV2l6YXJkKSBnZXRXaXphcmQoKTsKLQotCQlpZiAoZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQl3aXphcmQueG1sRGF0YS5zZXRFeHBvcnRUeXBlKEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9MSUJSQVJZKTsKLQkJCXJldHVybiB3aXphcmQuc2VsZWN0WE1MRmlsZVBhZ2U7Ci0JCX0gZWxzZSBpZiAoZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQl3aXphcmQueG1sRGF0YS5zZXRFeHBvcnRUeXBlKEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9QTFVHSU5TKTsKLQkJCXJldHVybiB3aXphcmQuc2VsZWN0UGx1Z2luUGFnZTsKLQkJfQotCQkvLyBQb3N0cG9uZWQgdG8gbmV4dCByZWxlYXNlLgotCQkvL2Vsc2UgaWYgKGV4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkvLwl3aXphcmQueG1sRGF0YS5zZXRFeHBvcnRUeXBlKEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9DT05GSUdTKTsKLQkJLy8JcmV0dXJuIHdpemFyZC5zZWxlY3RDb25maWdQYWdlOwotCQkvL30KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RQbHVnaW5QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RQbHVnaW5QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYjZmMzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvU2VsZWN0UGx1Z2luUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuUGx1Z2luRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IG9uZSBvciBtb3JlIG1ldGhvZCBwbHVnLWlucyB0bwotICogZXhwb3J0LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdFBsdWdpblBhZ2UgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuU2VsZWN0UGx1Z2luUGFnZSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RQbHVnaW5QYWdlKFBsdWdpbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXN1cGVyLnNhdmVEYXRhVG9Nb2RlbCgpOwotCQlFeHBvcnRYTUxXaXphcmQgd2l6YXJkID0gKEV4cG9ydFhNTFdpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCXdpemFyZC54bWxEYXRhLnNldFNlbGVjdGVkUGx1Z2lucyh3aXphcmQucGx1Z2luRGF0YS5zZWxlY3RlZFBsdWdpbnMpOwotCQlWaWV3UGx1Z2luSW5mb1BhZ2UgcGFnZSA9IHdpemFyZC52aWV3UGx1Z2luSW5mb1BhZ2U7Ci0JCXBhZ2Uub25FbnRlclBhZ2UobnVsbCk7Ci0JCXJldHVybiBwYWdlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvU2VsZWN0WE1MRmlsZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1NlbGVjdFhNTEZpbGVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MDcxZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvU2VsZWN0WE1MRmlsZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5FeHBvcnRYTUxSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwucHJlZmVyZW5jZXMuRXhwb3J0WE1MUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc3BlY2lmeSBhIFhNTCBmaWxlIHRvIHN0b3JlIHRoZQotICogZXhwb3J0ZWQgbWV0aG9kIGxpYnJhcnkgY29udGVudC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0WE1MRmlsZVBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdFhNTEZpbGVQYWdlLmNsYXNzLmdldE5hbWUoKTsKLQotCXByaXZhdGUgVGV4dCBwYXRoVGV4dDsKLQotCXByaXZhdGUgU3RyaW5nIHBhdGg7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RYTUxGaWxlUGFnZSgpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoRXhwb3J0WE1MUmVzb3VyY2VzLnNlbGVjdFhNTEZpbGVQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oRXhwb3J0WE1MUmVzb3VyY2VzLnNlbGVjdFhNTEZpbGVQYWdlX2Rlc2MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL0V4cG9ydFhNTC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBmaWxlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWZpbGVMYWJlbC5zZXRUZXh0KEV4cG9ydFhNTFJlc291cmNlcy5maWxlTGFiZWxfdGV4dCk7Ci0KLQkJcGF0aFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlwYXRoVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcGF0aFRleHQuc2V0VGV4dChFeHBvcnRYTUxQcmVmZXJlbmNlcy5nZXRYTUxGaWxlKCkpOwotCQlwYXRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoaXNWYWxpZFBhdGgocGF0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKSkpIHsKLQkJCQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKEV4cG9ydFhNTFJlc291cmNlcy5pbnZhbGlkWE1MRmlsZV9lcnJvcik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlCdXR0b24gYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCkpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChFeHBvcnRYTUxSZXNvdXJjZXMuYnJvd3NlQnV0dG9uX3RleHQpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJRmlsZURpYWxvZyBmZCA9IG5ldyBGaWxlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULlNBVkUpOwotCQkJCWZkLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsgIioueG1sIiwgIiouKiIgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCVN0cmluZyBwYXRoID0gZmQub3BlbigpOwotCQkJCWJvb2xlYW4gb2sgPSBmYWxzZTsKLQkJCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJCXBhdGhUZXh0LnNldFRleHQocGF0aCk7Ci0JCQkJCW9rID0gaXNWYWxpZFBhdGgocGF0aCk7Ci0JCQkJfQotCQkJCXNldFBhZ2VDb21wbGV0ZShvayk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzVmFsaWRQYXRoKHBhdGhUZXh0LmdldFRleHQoKS50cmltKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgdXNlciBzcGVjaWZpYyBwYXRoIGlzIHZhbGlkLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgdXNlciBzcGVjaWZpYyBwYXRoCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXNlciBzcGVjaWZpZWQgcGF0aCBpcyB2YWxpZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJSVBhdGggZWNQYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcocGF0aCk7Ci0JCWlmIChlY1BhdGguaXNWYWxpZFBhdGgocGF0aCkgJiYgcGF0aC5lbmRzV2l0aCgiLnhtbCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMucGF0aCA9IHBhdGg7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlyZXR1cm4gbnVsbDsgLy8gbm8gbW9yZSBwYWdlCi0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgWE1MIGZpbGUuCi0JICogCi0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBYTUwgZmlsZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIHRoaXMucGF0aDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1ZpZXdFeHBvcnRTdW1tYXJ5UGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvVmlld0V4cG9ydFN1bW1hcnlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0Yzg2MzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvVmlld0V4cG9ydFN1bW1hcnlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5FeHBvcnRQbHVnaW5TdW1tYXJ5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IGRpc3BsYXlzIGEgc3VtbWFyeSBvZiB0aGUgc2VsZWN0ZWQgbWV0aG9kIHBsdWctaW5zIHRoYXQKLSAqIHdpbGwgYmUgZXhwb3J0ZWQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmlld0V4cG9ydFN1bW1hcnlQYWdlIGV4dGVuZHMgRXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2UgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVmlld0V4cG9ydFN1bW1hcnlQYWdlKFBsdWdpbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCUV4cG9ydFhNTFdpemFyZCB3aXphcmQgPSAoRXhwb3J0WE1MV2l6YXJkKSBnZXRXaXphcmQoKTsKLQkJcmV0dXJuIHdpemFyZC5zZWxlY3RYTUxGaWxlUGFnZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1ZpZXdQbHVnaW5JbmZvUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvVmlld1BsdWdpbkluZm9QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNzlkYzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvVmlld1BsdWdpbkluZm9QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5QbHVnaW5JbmZvUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gcmV2aWV3IHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIG1ldGhvZAotICogcGx1Zy1pbnMgdGhhdCBoYXZlIGJlZW4gc2VsZWN0ZWQgZm9yIGV4cG9ydC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWaWV3UGx1Z2luSW5mb1BhZ2UgZXh0ZW5kcyBQbHVnaW5JbmZvUGFnZSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBWaWV3UGx1Z2luSW5mb1BhZ2UoUGx1Z2luRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKGRhdGEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJc3VwZXIuc2F2ZURhdGFUb01vZGVsKCk7Ci0JCUV4cG9ydFhNTFdpemFyZCB3aXphcmQgPSAoRXhwb3J0WE1MV2l6YXJkKSBnZXRXaXphcmQoKTsKLQkJd2l6YXJkLnhtbERhdGEuc2V0QXNzb2NpYXRlZENvbmZpZ3Mod2l6YXJkLnBsdWdpbkRhdGEuYXNzb2NpYXRlZENvbmZpZ01hcCk7Ci0JCVZpZXdFeHBvcnRTdW1tYXJ5UGFnZSBwYWdlID0gd2l6YXJkLnZpZXdFeHBvcnRTdW1tYXJ5UGFnZTsKLQkJcGFnZS5vbkVudGVyUGFnZShudWxsKTsKLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YzFjY2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgd2l6YXJkcyBmb3IgZXhwb3J0aW5nIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgdG8gWE1MLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM0ZjIwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGF0dHJpYnV0ZXM+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiI+Ci0JCTxhdHRyaWJ1dGVzPgotCQk8L2F0dHJpYnV0ZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNzU5NDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgZXhwb3J0IHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5leHBvcnQvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YWE0OTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5leHBvcnQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2Yzk4MmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0OyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcwotUmVxdWlyZS1CdW5kbGU6IG9yZy5hcGFjaGUuYW50LAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yzc4MGNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL0F1dGhvcmluZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL0F1dGhvcmluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMWJhZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9BdXRob3JpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9Db250ZW50UGFja2FnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL0NvbnRlbnRQYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhMzExZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL0NvbnRlbnRQYWNrYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvRm9sZGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvRm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY0MTlkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL0ZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL1BhY2thZ2luZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL1BhY2thZ2luZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NjM5NGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9QYWNrYWdpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9Sb2xlcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL1JvbGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhM2Y2Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL1JvbGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvVGFza3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9UYXNrcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOGJkODMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9UYXNrcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2Vycm9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZXJyb3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU3YTk0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZXJyb3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9ldG9vbDE2L2V4cF9saWJfY29uZi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2V0b29sMTYvZXhwX2xpYl9jb25mLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ3ZDRlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2V0b29sMTYvZXhwX2xpYl9jb25mLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZXRvb2wxNi9leHBfbWV0aF9wbHVnaW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9ldG9vbDE2L2V4cF9tZXRoX3BsdWdpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNmY4YmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9ldG9vbDE2L2V4cF9tZXRoX3BsdWdpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2Z1bGwvd2l6YmFuL2V4cF9saWJfY29uZl93aXpiYW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9mdWxsL3dpemJhbi9leHBfbGliX2NvbmZfd2l6YmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg0NGI1Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2Z1bGwvd2l6YmFuL2V4cF9saWJfY29uZl93aXpiYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9mdWxsL3dpemJhbi9leHBfbWV0aF9wbHVnaW5fd2l6YmFuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZnVsbC93aXpiYW4vZXhwX21ldGhfcGx1Z2luX3dpemJhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYzU2NzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9mdWxsL3dpemJhbi9leHBfbWV0aF9wbHVnaW5fd2l6YmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvd2FybmluZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL3dhcm5pbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWUyMGFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvd2FybmluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmN2U1Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBFeHBvcnQKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIFBlcnNwZWN0aXZlCi1wYWNrYWdpbmdQZXJzcGVjdGl2ZU5hbWU9UGFja2FnaW5nCi0KLSMgQ2F0ZWdvcnkKLXBhY2thZ2luZ0NhdGVnb3J5TmFtZT1QYWNrYWdpbmcKLQotIyBWaWV3cwotcGFja2FnaW5nVmlld05hbWU9UGFja2FnaW5nIE1ldGhvZCBMaWJyYXJ5Ci1wYWNrYWdpbmdNZXNzYWdlVmlld05hbWU9TGlicmFyeSBQYWNrYWdpbmcgTWVzc2FnZQotCi0jIEFjdGlvbiBTZXQKLXBhY2thZ2luZ0FjdGlvblNldD1QYWNrYWdpbmcKLQotIyBBY3Rpb25zCi1uZXdDb25maWdBY3Rpb249JkNvbmZpZ3VyYXRpb24KLW5ld0NvbmZpZ0FjdGlvblRvb2x0aXA9Q3JlYXRlIGEgbmV3IGxpYnJhcnkgQ29uZmlndXJhdGlvbgotb3BlbkNvbmZpZ0FjdGlvbj0mQ29uZmlndXJhdGlvbgotb3BlbkNvbmZpZ0FjdGlvblRvb2x0aXA9T3BlbiBhbiBleGlzdGluZyBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24KLQotIyBFeHBvcnQgV2l6YXJkIENhdGVnb3J5Ci1leHBvcnRDYXRlZ29yeU5hbWU9TWV0aG9kCi0KLSMgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQKLWV4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1MaWJyYXJ5IENvbmZpZ3VyYXRpb24KLWV4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uPUV4cG9ydCBhIGxpYnJhcnkgY29uZmlndXJhdGlvbi4KLQotIyBFeHBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZAotZXhwb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9TWV0aG9kIFBsdWctaW5zCi1leHBvcnRNZXRob2RQbHVnaW5zPUV4cG9ydCBvbmUgb3IgbW9yZSBtZXRob2QgcGx1Zy1pbnMuCi0KLQotCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3M2Y0OGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZCIKLSAgICAgICAgICAgIGljb249Ii9pY29ucy9ldG9vbDE2L2V4cF9saWJfY29uZi5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLkV4cG9ydENvbmZpZ3VyYXRpb25XaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVleHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi51aS5leHBvcnRXaXphcmRzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5FeHBvcnRQbHVnaW5XaXphcmQiCi0gICAgICAgICAgICBpY29uPSIvaWNvbnMvZXRvb2wxNi9leHBfbWV0aF9wbHVnaW4uZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5FeHBvcnRQbHVnaW5XaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlZXhwb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPiAKLSAgICAgICAgICAgICAgICVleHBvcnRNZXRob2RQbHVnaW5zCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+IAotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZCIvPgotICAgICAgPHdpemFyZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLkV4cG9ydFBsdWdpbldpemFyZCIvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9FeHBvcnRPcHRpb25zLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydE9wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIxM2I0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydE9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogVGhlIGV4cG9ydCBvcHRpb25zLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE9wdGlvbnMgewotCi0JcHJvdGVjdGVkIEZpbGUgZXhwb3J0RGlyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0T3B0aW9ucygpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNlbGVjdGVkIGV4cG9ydCBkaXJlY3RvcnkuCi0JICogCi0JICogQHJldHVybiBhIGRpcmVjdG9yeSBmb3Igc3RvcmluZyB0aGUgZXhwb3J0ZWQgY29udGVudAotCSAqLwotCXB1YmxpYyBGaWxlIGdldEV4cG9ydERpcigpIHsKLQkJcmV0dXJuIGV4cG9ydERpcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB1c2VyIHNlbGVjdGVkIGV4cG9ydCBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGV4cG9ydERpcgotCSAqICAgICAgICAgICAgYSBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgdGhlIGV4cG9ydGVkIGNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBvcnREaXIoRmlsZSBleHBvcnREaXIpIHsKLQkJdGhpcy5leHBvcnREaXIgPSBleHBvcnREaXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydFBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9FeHBvcnRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEyZjVjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLQotLyoqCi0gKiBUaGUgRXhwb3J0IHBsdWdpbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgRXhwb3J0UGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEV4cG9ydFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuY29yZS5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5jb3JlLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwb3J0UGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydFByb2Nlc3NPcHRpb25zLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydFByb2Nlc3NPcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjODU5OTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9FeHBvcnRQcm9jZXNzT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogVGhlIGV4cG9ydCBwcmNvZXNzIG9wdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0UHJvY2Vzc09wdGlvbnMgZXh0ZW5kcyBFeHBvcnRPcHRpb25zIHsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoV2ViU2l0ZTsKLQotCXByaXZhdGUgUHVibGlzaE9wdGlvbnMgcHVibGlzaGluZ09wdGlvbnM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50czsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydFByb2Nlc3NPcHRpb25zKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIGV4cG9ydCB0aGUgcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIGV4cG9ydCB0aGUgcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIHByb2Nlc3Mgd2ViIHNpdGUgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByb2Nlc3Mgd2ViIHNpdGUgc2hvdWxkIGJlIHB1Ymxpc2hlZAotCSAqICAgICAgICAgYXMgcGFydCBvZiB0aGUgZXhwb3J0IG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFB1Ymxpc2hXZWJTaXRlKCkgewotCQlyZXR1cm4gcHVibGlzaFdlYlNpdGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBwcm9jZXNzIHdlYiBzaXRlIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaFdlYlNpdGUKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwdWJsaXNoIHRoZSBwcm9jZXNzIHdlYiBzaXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaFdlYlNpdGUoYm9vbGVhbiBwdWJsaXNoV2ViU2l0ZSkgewotCQl0aGlzLnB1Ymxpc2hXZWJTaXRlID0gcHVibGlzaFdlYlNpdGU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaGluZyBvcHRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucyB0aGF0IHdpbGwgYmUgdXNlZCB0byBwdWJsaXNoIHRoZSBwcm9jZXNzCi0JICogICAgICAgICB3ZWIgc2l0ZQotCSAqLwotCXB1YmxpYyBQdWJsaXNoT3B0aW9ucyBnZXRQdWJsaXNoaW5nT3B0aW9ucygpIHsKLQkJcmV0dXJuIHB1Ymxpc2hpbmdPcHRpb25zOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaGluZ09wdGlvbnMKLQkgKiAgICAgICAgICAgIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcHVibGlzaCB0aGUKLQkgKiAgICAgICAgICAgIHByb2Nlc3Mgd2ViIHNpdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoaW5nT3B0aW9ucyhQdWJsaXNoT3B0aW9ucyBwdWJsaXNoaW5nT3B0aW9ucykgewotCQl0aGlzLnB1Ymxpc2hpbmdPcHRpb25zID0gcHVibGlzaGluZ09wdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZXhwb3J0IG9ubHkgcGxhbm5lZCBXQlMgZWxlbWVudHMgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgb25seSBwbGFubmVkIFdCUyBlbGVtZW50cyBzaG91bGQgYmUKLQkgKiAgICAgICAgIGV4cG9ydGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHMoKSB7Ci0JCXJldHVybiBleHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGV4cG9ydCBvbmx5IHBsYW5uZWQgV0JTIGVsZW1lbnRzIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cwotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGV4cG9ydCBvbmx5IHBsYW5uZWQgV0JTIGVsZW1lbnRzCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cygKLQkJCWJvb2xlYW4gZXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cykgewotCQl0aGlzLmV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHMgPSBleHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9FeHBvcnRSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvRXhwb3J0UmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNGQ1NjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9FeHBvcnRSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIEV4cG9ydFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRXhwb3J0UmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRDb25maWdXaXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RXhwb3J0VHlwZVBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdEV4cG9ydFR5cGVQYWdlX2NvbmZpZ1NwZWNzTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb25maWdQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ1BhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb25maWdQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ1NwZWNzUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb25maWdTcGVjc1BhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb25maWdTcGVjc1BhZ2VfY29uZmlnc0xhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tDb25maWdQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrQ29uZmlnUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdERlc3RpbmF0aW9uUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3REZXN0aW5hdGlvblBhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFBsdWdpbnNQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFBsdWdpbnNQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV2aWV3UGx1Z2luc1BhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV2aWV3UGx1Z2luc1BhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXZpZXdQbHVnaW5zUGFnZV9wbHVnaW5zTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXZpZXdQbHVnaW5zUGFnZV9kZXBlbmRlbnRQbHVnaW5zTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXZpZXdQbHVnaW5zUGFnZV9hc3NvY2lhdGVkQ29uZmlnc0xhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9ub1BsdWdpbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNwZWNpZnlQYXRoUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzcGVjaWZ5UGF0aFBhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlUGx1Z2luUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cG9ydFBsdWdpbldpemFyZF90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBvcnRQbHVnaW5FcnJvcl9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFuYWx5emluZ0NvbmZpZ1Rhc2tfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX2NoZWNraW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Jyb3dzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGVmYXVsdF9kaXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9kaXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0UGx1Z2luV2l6YXJkX2Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc3RpbmF0aW9uQ29tbW9uUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXN0aW5hdGlvbkNvbW1vblBhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGx1Z2luRXhwb3J0U2VydmljZV9NU0cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGx1Z2luRXhwb3J0U2VydmljZV9NU0c0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVMaWJyYXJ5UGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlUGx1Z2luUGFnZV9sYWJlbF9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVMaWJyYXJ5UGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cG9ydFBsdWdpbldpemFyZF9NU0cxOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRXhwb3J0UmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMWYxOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMDAwRSAtIElVUEUwMDk5RQotIwotCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkCi1leHBvcnRDb25maWdXaXphcmRfdGl0bGU9RXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbgotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfdGl0bGU9U2VsZWN0IGV4cG9ydCB0eXBlCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjPVNlbGVjdCB0aGUgdHlwZSBvZiBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gdG8gZXhwb3J0Lgotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnTGFiZWxfdGV4dD1FeHBvcnQgYSBtZXRob2QgY29uZmlndXJhdGlvbiBhbmQgYWxsIGl0cyBtZXRob2QgcGx1Zy1pbnMKLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2NvbmZpZ1NwZWNzTGFiZWxfdGV4dD1FeHBvcnQgb25lIG9yIG1vcmUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbnMKLXNlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9U2VsZWN0IG1ldGhvZCBjb25maWd1cmF0aW9uCi1zZWxlY3RDb25maWdQYWdlX2Rlc2M9U2VsZWN0IGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdG8gZXhwb3J0LiBBbGwgcmVmZXJlbmNlZCBtZXRob2QgcGx1Zy1pbnMgaW4gdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZXhwb3J0Lgotc2VsZWN0Q29uZmlnUGFnZV9jb25maWdzTGFiZWxfdGV4dD1NZXRob2QgY29uZmlndXJhdGlvbnM6Ci1zZWxlY3RDb25maWdTcGVjc1BhZ2VfdGl0bGU9U2VsZWN0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbnMKLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV9kZXNjPVNlbGVjdCBvbmUgb3IgbW9yZSBtZXRob2QgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucyB0byBleHBvcnQuCi1zZWxlY3RDb25maWdTcGVjc1BhZ2VfY29uZmlnc0xhYmVsX3RleHQ9TWV0aG9kIGNvbmZpZ3VyYXRpb25zOgotY2hlY2tDb25maWdQYWdlX3RpdGxlPVJldmlldyBjb25maWd1cmF0aW9uIGVycm9ycwotY2hlY2tDb25maWdQYWdlX2Rlc2M9QW4gaW50ZWdyaXR5IGNoZWNrIGhhcyBiZWVuIHBlcmZvcm1lZCBvbiB0aGUgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uIFJldmlldyB0aGUgZXJyb3IgcmVwb3J0IGFuZCBwZXJmb3JtIHRoZSBuZWNlc3NhcnkgY29ycmVjdGl2ZSBhY3Rpb25zLgotc2VsZWN0RGVzdGluYXRpb25QYWdlX3RpdGxlPVNwZWNpZnkgZXhwb3J0IGRpcmVjdG9yeQotc2VsZWN0RGVzdGluYXRpb25QYWdlX2Rlc2M9U3BlY2lmeSBhIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSB0byBzdG9yZSB0aGUgZXhwb3J0ZWQgY29uZmlndXJhdGlvbi4KLQotIyBFeHBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZAotZXhwb3J0UGx1Z2luc1dpemFyZF90aXRsZT1FeHBvcnQgTWV0aG9kIFBsdWctaW5zCi1zZWxlY3RQbHVnaW5zUGFnZV90aXRsZT1TZWxlY3QgbWV0aG9kIHBsdWctaW5zCi1zZWxlY3RQbHVnaW5zUGFnZV9kZXNjPVNlbGVjdCBvbmUgb3IgbW9yZSBtZXRob2QgcGx1Zy1pbnMgdG8gZXhwb3J0Lgotc2VsZWN0UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQ9TWV0aG9kIHBsdWctaW5zOgotcmV2aWV3UGx1Z2luc1BhZ2VfdGl0bGU9UmV2aWV3IGRlcGVuZGVuY2llcwotcmV2aWV3UGx1Z2luc1BhZ2VfZGVzYz1TZWxlY3QgZWFjaCBtZXRob2QgcGx1Zy1pbiB0byByZXZpZXcgaXRzIGRlcGVuZGVuY2llcy4gQ2xpY2sgQmFjayB0byBzZWxlY3QgdGhlIGRlcGVuZGVudCBwbHVnLWlucyBpZiB0aGV5IG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGV4cG9ydC4KLXJldmlld1BsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0PU1ldGhvZCBQbHVnLWluczoKLXJldmlld1BsdWdpbnNQYWdlX2RlcGVuZGVudFBsdWdpbnNMYWJlbF90ZXh0PURlcGVuZGVudCBtZXRob2QgcGx1Zy1pbnM6Ci1yZXZpZXdQbHVnaW5zUGFnZV9hc3NvY2lhdGVkQ29uZmlnc0xhYmVsX3RleHQ9QXNzb2NpYXRlZCBtZXRob2QgY29uZmlndXJhdGlvbnM6Ci1leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV90aXRsZT1Db25maXJtIGV4cG9ydAotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfZGVzYz1Db25maXJtIHRoZSBtZXRob2QgcGx1Zy1pbnMgdGhhdCB3aWxsIGJlIGV4cG9ydGVkLgotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2Vfbm9QbHVnaW5fdGV4dD1ObyBtZXRob2QgcGx1Zy1pbiBoYXMgYmVlbiBzZWxlY3RlZC4KLXNwZWNpZnlQYXRoUGFnZV90aXRsZT1TcGVjaWZ5IGV4cG9ydCBkaXJlY3RvcnkKLXNwZWNpZnlQYXRoUGFnZV9kZXNjPVNwZWNpZnkgYSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgdG8gc3RvcmUgdGhlIGV4cG9ydGVkIG1ldGhvZCBwbHVnLWlucy4KLVNhdmVQbHVnaW5QYWdlX2Rlc2M9RXhwb3J0IHRoZSBzZWxlY3RlZCBwbHVnLWlucyBhbmQgY29uZmlndXJhdGlvbnMgdG8gdGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCi1FeHBvcnRQbHVnaW5XaXphcmRfdGl0bGU9RXhwb3J0IE1ldGhvZCBQbHVnLWluIFdpemFyZCBFcnJvcgotRXhwb3J0UGx1Z2luRXJyb3JfbXNnPUlVUEUwMDAwRTogRXJyb3IgZW5jb3VudGVyZWQgaW4gZXhwb3J0aW5nCi0KLSMgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBFcnJvciBEaWFsb2cKLWV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPUV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24KLWV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX21zZz1JVVBFMDAwMUU6IFRoZSBleHBvcnQgb3BlcmF0aW9uIGNhbm5vdCBwcm9jZWVkLgotCi0jIFByb2dyZXNzIE1lc3NhZ2VzCi1hbmFseXppbmdDb25maWdUYXNrX25hbWU9QW5hbHl6aW5nIGxpYnJhcnkgY29uZmlndXJhdGlvbi4uLgotCi0jIFRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgaGF2ZSBub3QgYmVlbiByZXZpZXdlZC4KLUNvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2VfTVNHMD1FeHBvcnRpbmcgY29uZmlndXJhdGlvbi4uLgotQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cxPUV4cG9ydCBkb25lLgotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMT1DaGVja2luZyB0aGUgaW50ZWdyaXR5IG9mIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uLi4uXG4KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzI9Tm8gY29uZmlndXJhdGlvbiBzZWxlY3RlZC5cbgotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMz1UaGVyZSBpcyBubyBwcm9ibGVtIGluIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uLlxuCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV80PVRoZXJlIGFyZSB7MH0gcHJvYmxlbXMgaW4gdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24uIFxuWW91IGNhbiBvcGVuIHRoZSBjb25maWd1cmF0aW9uIGVkaXRvciBhbmQgZml4IHRob3NlIHByb2JsZW1zLiBcbk9yIHlvdSBjYW4gY2hvb3NlIHRvIGlnbm9yZSB0aGVzZSBwcm9ibGVtcyBhbmQgY29udGludWUuCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2VfY2hlY2tpbmc9Q2hlY2tpbmcgY29uZmlndXJhdGlvbiwgcGxlYXNlIHdhaXQuLi4KLUV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9Q2hvb3NlIE1ldGhvZCBDb25maWd1cmF0aW9uCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfYnJvd3NlPUJyb3dzZS4uLgotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2RlZmF1bHRfZGlyPVVzZSBkZWZhdWx0IGRpcmVjdG9yeQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMD1FeHBvcnRpbmcgY29uZmlndXJhdGlvbi4uLgotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMj1JVVBFMDAwMkU6IEV4cG9ydCBmYWlsZWQ6IEVycm9yIGxvYWRpbmcgbGlicmFyeQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHND1JVVBFMDAwM0U6IEV4cG9ydCBmYWlsZWQ6IEVycm9yIGNvcHlpbmcgbGlicmFyeQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMT1JVVBFMDAwNEU6IEV4cG9ydCBmYWlsZWQ6IEVycm9yIG1ha2luZyBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gY2xvc3VyZQotQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHOT1JVVBFMDAwNUU6IEV4cG9ydCBmYWlsZWQ6IEVycm9yIHNhdmluZyBsaWJyYXJ5Ci1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfbmFtZT1OYW1lOgotRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Rpcj1EaXJlY3Rvcnk6Ci1FeHBvcnRQbHVnaW5XaXphcmRfZXJyb3I9RXJyb3IKLURlc3RpbmF0aW9uQ29tbW9uUGFnZV90aXRsZT1EZWZhdWx0IFRpdGxlCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfZGVzYz1EZWZhdWx0IGRlc2NyaXB0aW9uOgotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cwPUV4cG9ydGluZyBwbHVnLWlucy4uLgotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cxPUNyZWF0aW5nIGV4cG9ydCBkaXJlY3RvcnkuLi4KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMj1Db3B5aW5nIGZpbGVzLi4uCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzM9R2VuZXJhdGluZyBsaWJyYXJ5IGFuZCByZXNvdXJjZSBmaWxlLi4uCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzQ9RXhwb3J0IGRvbmUuCi1TYXZlTGlicmFyeVBhZ2VfdGl0bGU9RXhwb3J0IE1ldGhvZCBQbHVnLWluCi1TYXZlUGx1Z2luUGFnZV9sYWJlbF9uYW1lPUV4cG9ydCBuYW1lOgotU2F2ZUxpYnJhcnlQYWdlX2Rlc2M9RXhwb3J0IHRoZSBzZWxlY3RlZCBtZXRob2QgcGx1Zy1pbnMgYW5kIGFzc29jaWF0ZWQgY29uZmlndXJhdGlvbnMKLUV4cG9ydFBsdWdpbldpemFyZF9NU0cxPUFuYWx5emluZyBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uLi4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYjZhYWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgYWN0aXZhdG9yIGZvciBtYW5hZ2luZyB0aGUgRXhwb3J0IHBsdWctaW4ncyBsaWZlIGN5Y2xlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQmFzZUV4cG9ydFNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQmFzZUV4cG9ydFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI2NTM1MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0Jhc2VFeHBvcnRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgdGhlIEV4cG9ydCBTZXJ2aWNlLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlRXhwb3J0U2VydmljZSB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBleHBvcnRGaWxlID0gImV4cG9ydC54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBsaWJyYXJ5RmlsZSA9ICJsaWJyYXJ5LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBMaXN0IHNlbGVjdGVkSWRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIExpc3Qgc2VsZWN0ZWRQbHVnaW5OYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzSWRTZWxlY3RlZChTdHJpbmcgdXJpKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBzZWxlY3RlZElkcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlpZiAodXJpLmluZGV4T2YoaWQpID49IDApIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTZWxlY3RlZFBsdWdpblJlc291cmNlKFN0cmluZyB1cmkpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHNlbGVjdGVkUGx1Z2luTmFtZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHBsdWdpbl9uYW1lID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJaWYgKHVyaS5zdGFydHNXaXRoKHBsdWdpbl9uYW1lICsgIi8iKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUmVzb3VyY2VTZWxlY3RlZChTdHJpbmcgdXJpKSB7Ci0JCWlmIChpc0lkU2VsZWN0ZWQodXJpKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGlzU2VsZWN0ZWRQbHVnaW5SZXNvdXJjZSh1cmkpOwotCX0KLQotCXByb3RlY3RlZCBMaWJyYXJ5RG9jdW1lbnQgcHJvY2Vzc0xpYnJhcnlGaWxlKEZpbGUgc291cmNlLCBGaWxlIHRhcmdldCkgewotCQl0cnkgewotCQkJTGlicmFyeURvY3VtZW50IGRvY3VtZW50ID0gbmV3IExpYnJhcnlEb2N1bWVudChzb3VyY2UpOwotCi0JCQkvLyBSZWxvYWQgdGhlIGVsZW1lbnQgbWFwcGluZy4KLQkJCU5vZGVMaXN0IG5vZGVzID0gZG9jdW1lbnQuZ2V0UGx1Z2lucygpOwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCBub2Rlcy5nZXRMZW5ndGgoKSkgewotCQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJCVN0cmluZyB1cmkgPSBub2RlLmdldEF0dHJpYnV0ZShMaWJyYXJ5RG9jdW1lbnQuQVRUUl9ocmVmKTsKLQkJCQlpZiAoIWlzSWRTZWxlY3RlZCh1cmkpKSB7Ci0JCQkJCWRvY3VtZW50LnJlbW92ZVBsdWdpbihub2RlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBSZW1vdmUgdGhlIHVubmVlZGVkIGNvbmZpZ3VyYXRpb25zLgotCQkJbm9kZXMgPSBkb2N1bWVudC5nZXRDb25maWd1cmF0aW9ucygpOwotCQkJaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQkJCi0JCQkJLy8gMTQyMzc5IC0gdXBkYXRlIHBsdWdpbiBpbXBvcnRpbmcgYW5kIGV4cG9ydGluZyB0byBtYXRjaCB3aXRoIHRoZSBuZXcgZmlsZSBmb3JtYXQKLQkJCQkvLyBjb25maWd1cmF0aW9uIGlzIHNhdmVkIGFzIHNlcGVyYXRlIHJlc291cmNlIHNpbmNlIDEuMG0zCi0JCQkJU3RyaW5nIHVyaSA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX2hyZWYpOwotCQkJCWlmICghaXNJZFNlbGVjdGVkKHVyaSkpIHsKLQkJCQkJZG9jdW1lbnQucmVtb3ZlQ29uZmlndXJhdGlvbihub2RlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBSZWxvYWQgdGhlIGVsZW1lbnQgbWFwcGluZy4KLQkJCUxpc3QgcGx1Z2lucyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKQotCQkJCQkJCQkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQkJTWFwIHBsdWdpbk1hcCA9IE1ldGhvZEVsZW1lbnRVdGlsLmJ1aWxkTWFwKHBsdWdpbnMpOwotCi0JCQlub2RlcyA9IGRvY3VtZW50LmdldFJlc291cmNlRGVzY3JpcHRvcnMoKTsKLQkJCWkgPSAwOwotCQkJd2hpbGUgKGkgPCBub2Rlcy5nZXRMZW5ndGgoKSkgewotCQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJCVN0cmluZyBpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX2lkKTsKLQkJCQlTdHJpbmcgdXJpID0gZ2V0UGx1Z2luUmVzTWdyVXJpKGlkLCBub2RlLCBwbHVnaW5NYXApOwotCQkJCWlmICghaXNJZFNlbGVjdGVkKGlkKQotCQkJCQkJJiYgIWlzUmVzb3VyY2VTZWxlY3RlZChVUkxEZWNvZGVyLmRlY29kZSh1cmksICJVVEYtOCIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWRvY3VtZW50LnJlbW92ZVJlc291cmNlRGVzY3JpcHRvcihub2RlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCi0JCQlub2RlcyA9IGRvY3VtZW50LmdldFJlc291cmNlU3ViTWFuYWdlcnMoKTsKLQkJCWkgPSAwOwotCQkJd2hpbGUgKGkgPCBub2Rlcy5nZXRMZW5ndGgoKSkgewotCQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJCVN0cmluZyB1cmkgPSBub2RlLmdldEF0dHJpYnV0ZShMaWJyYXJ5RG9jdW1lbnQuQVRUUl9ocmVmKTsKLQkJCQlpZiAoIWlzUmVzb3VyY2VTZWxlY3RlZCh1cmkpKSB7Ci0JCQkJCWRvY3VtZW50LnJlbW92ZVJlc291cmNlRGVzY3JpcHRvcihub2RlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCi0JCQlMaXN0IHBsdWdpbkxpc3QgPSAgTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQkJZG9jdW1lbnQuc3RvcmVFeHRyYUluZm8ocGx1Z2luTGlzdCk7Ci0JCQkKLQkJCWRvY3VtZW50LnNhdmVBcyh0YXJnZXQuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCi0JCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFBsdWdpblJlc01nclVyaShTdHJpbmcgaWQsIEVsZW1lbnQgbm9kZSwgTWFwPFN0cmluZywgTWV0aG9kUGx1Z2luPiBwbHVnaW5NYXApIHsKLQkJU3RyaW5nIHVyaSA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX3VyaSk7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBwbHVnaW5NYXAuZ2V0KGlkKTsKLQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmV3VXJpID0gcGx1Z2luLmdldE5hbWUoKSArICIvcGx1Z2luLnhtaSI7ICAvLyROT04tTkxTLTEkCi0JCQlpZiAoISBuZXdVcmkuZXF1YWxzKHVyaSkpIHsKLQkJCQlub2RlLnNldEF0dHJpYnV0ZShMaWJyYXJ5RG9jdW1lbnQuQVRUUl91cmksIG5ld1VyaSk7Ci0JCQkJcmV0dXJuIG5ld1VyaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdXJpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uRXhwb3J0RGF0YS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uRXhwb3J0RGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWJmOWQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvbkV4cG9ydERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuTGlicmFyeUxvY2F0aW9uRGF0YTsKLQotCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyB0aGUgaW5wdXQgZGF0YSByZXF1aXJlZCB0byBleHBvcnQgYSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSB7Ci0KLQlwdWJsaWMgYm9vbGVhbiBleHBvcnRPbmVDb25maWc7Ci0KLQlwdWJsaWMgYm9vbGVhbiBleHBvcnRDb25maWdTcGVjczsKLQotCXB1YmxpYyBMaXN0IHNlbGVjdGVkQ29uZmlnczsKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiB0aGUgYnJva2VuIHJlZmVyZW5jZXMgc2hvdWxkIGJlIHJlbW92ZWQgb3Igbm90LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUJyb2tlblJlZmVyZW5jZXMgPSBmYWxzZTsKLQotCXB1YmxpYyBMaWJyYXJ5TG9jYXRpb25EYXRhIGxsRGF0YSA9IG51bGw7Ci0KLQlwdWJsaWMgU3RyaW5nIGVycm9yTXNnID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXMgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25FeHBvcnREYXRhKCkgewotCQlsbERhdGEgPSBuZXcgTGlicmFyeUxvY2F0aW9uRGF0YSgpOwotCQlsbERhdGEubG9hZEZyb21QcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSBhdHRyaWJ1dGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MWY4ZjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JQ29uZmlndXJhdGlvbkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlLkNvbmZpZ3VyYXRpb25DbG9zdXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGF5b3V0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0vKioKLSAqIEV4cG9ydHMgYSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4Y2x1ZGVzID0gIi5jb3B5YXJlYS5kYXQsICoqLy5jb3B5YXJlYS5kYXQsIC5jb3B5YXJlYS5kYiwgKiovLmNvcHlhcmVhLmRiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlKENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGEpIHsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0JCi0JLyoqCi0JICogUnVuIHRvIGV4cG9ydCBhIGNvbmZpZ3VyYXRpb24gY2xvc3VyZQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWlmIChkYXRhLnNlbGVjdGVkQ29uZmlncyA9PSBudWxsCi0JCQkJCXx8IGRhdGEuc2VsZWN0ZWRDb25maWdzLnNpemUoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJbW9uaXRvci5zZXRUYXNrTmFtZShFeHBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMCk7IAotCQkJU3RyaW5nIGV4cG9ydExpYlBhdGggPSBkYXRhLmxsRGF0YS5nZXRQYXJlbnRGb2xkZXIoKTsKLQkJCUZpbGUgZXhwb3J0TGliRm9sZGVyID0gbmV3IEZpbGUoZXhwb3J0TGliUGF0aCk7Ci0JCQlpZiAoIWV4cG9ydExpYkZvbGRlci5leGlzdHMoKSkgewotCQkJCWV4cG9ydExpYkZvbGRlci5ta2RpcigpOwotCQkJfQotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgZGF0YS5zZWxlY3RlZENvbmZpZ3MKLQkJCQkJLmdldCgwKTsKLQkJCWV4cG9ydENvbmZpZyhjb25maWcuZ2V0TmFtZSgpLCBleHBvcnRMaWJGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCksCi0JCQkJCW1vbml0b3IpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4cG9ydCBhIGNvbmZpZ3VyYXRpb24gY2xvc3VyZQotCSAqLwotCXB1YmxpYyB2b2lkIGV4cG9ydENvbmZpZyhTdHJpbmcgc2VsZWN0ZWRDb25maWdOYW1lLCBTdHJpbmcgZmlsZVBhdGgsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vIG5lZWQgdG8gZGlzYWJsZSB0aGUgd29ya3NwYWNlIHJlZnJlc2hpbmcKLQkJYm9vbGVhbiByZWZyZXNoID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmlzRW5hYmxlZCgpOwotCQl0cnkgewotCQkJaWYgKHJlZnJlc2gpIHsKLQkJCQkvLyBkaXNhYmxlIHJlc291cmNlIHJlZnJlc2hpbmcgZHVyaW5nIGltcG9ydAotCQkJCS8vCi0JCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQkJZG9FZXhwb3J0Q29uZmlnKHNlbGVjdGVkQ29uZmlnTmFtZSwgZmlsZVBhdGgsIG1vbml0b3IpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHJlZnJlc2gpIHsKLQkJCQkvLyByZS1lbmFibGUgcmVzb3VyY2UgcmVmcmVzaGluZwotCQkJCS8vCi0JCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9FZXhwb3J0Q29uZmlnKFN0cmluZyBzZWxlY3RlZENvbmZpZ05hbWUsIFN0cmluZyBmaWxlUGF0aCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTWV0aG9kTGlicmFyeSBjdXJyZW50TGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCi0JCXRyeSB7Ci0JCQkvLyBMb2FkIHRoZSB3aG9sZSBNZXRob2QgTGlicmFyeS4KLQkJCUxpYnJhcnlVdGlsLmxvYWRBbGwoY3VycmVudExpYik7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkiRXJyb3IgbG9hZGluZyBsaWJyYXJ5IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRhdGEuZXJyb3JNc2cgPSBFeHBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMjsgCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBDb3B5IHRoZSBjdXJyZW50IGxpYnJhcnkgdG8gYSBuZXcgbGlicmFyeSwKLQkJLy8gc2luY2Ugd2UgbmVlZCB0byBtYWtlIGNoYW5nZXMgd2hlbiBwYWNrYWdpbmcgdGhlIG5ldyBsaWJyYXJ5LgotCQlNZXRob2RMaWJyYXJ5IG5ld0xpYnJhcnkgPSBudWxsOwotCQl0cnkgewotCQkJbmV3TGlicmFyeSA9IChNZXRob2RMaWJyYXJ5KSBFY29yZVV0aWwuY29weShjdXJyZW50TGliKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCUV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlkYXRhLmVycm9yTXNnID0gRXhwb3J0UmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzQ7IAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSUNvbmZpZ3VyYXRpb25DbG9zdXJlIGNsb3N1cmUgPSBudWxsOwotCQl0cnkgewotCQkJLy8gRGV0YWNoIHRoZSBuZXcgbGlicmFyeSBmcm9tIHRoZSBjdXJyZW50IHJlc291cmNlIHNvIGl0IGNhbiBiZQotCQkJLy8gYWRkZWQgdG8gYSBuZXcgTGlicmFyeSBQcm9jZXNzb3IgaW5zdGFuY2UuCi0JCQlMaWJyYXJ5VXRpbC5kZXRhY2hGcm9tUmVzb3VyY2UobmV3TGlicmFyeSk7Ci0KLQkJCS8vIENyZWF0ZSBhIG5ldyBMaWJyYXJ5IE1hbmFnZXIgYW5kIGNyZWF0ZSBhIG5ldyByZXNvdXJjZSBmb3IgdGhlCi0JCQkvLyBuZXcgbGlicmFyeS4KLQkJCS8vIFRPRE86IFVwZGF0ZSB0aGUgVUkgdG8gcHJvbXB0IGZvciB0aGUgbWV0aG9kIGxpYnJhcnkgdHlwZS4KLQkJCU1hcCBwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJcGFyYW1zLnB1dCgibGlicmFyeS5wYXRoIiwgZmlsZVBhdGgpOyAJLy8kTk9OLU5MUy0xJAotCQkJcGFyYW1zLnB1dCgibGlicmFyeVJlZ2lzdGVyVHlwZSIsICJDb25maWdFeHBvcnQiKTsgCQkvLyROT04tTkxTLTEkCQkvLyROT04tTkxTLTIkCQkKLQkJCQotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZWdpc3Rlck1ldGhvZExpYnJhcnkobmV3TGlicmFyeSwgInhtaSIsIHBhcmFtcyk7CQkvLyROT04tTkxTLTEkCi0JCQkKLQkJCS8vIEJlZ2luIHBhY2thZ2luZyB0aGUgbmV3IGxpYnJhcnkgZm9yIGV4cG9ydC4KLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKG5ld0xpYnJhcnksIHNlbGVjdGVkQ29uZmlnTmFtZSk7Ci0KLQkJCS8vIFZhbGlkYXRlIHRoZSBjb25maWd1cmF0aW9uIGFuZCBtYWtlIHN1cmUgdGhlIGdsb2JhbCBwYWNrYWdlcyBhcmUKLQkJCS8vIHNlbGVjdGVkLiBJZiBnbG9iYWwgcGFja2FnZXMgYXJlIG1pc3NpbmcsIHRoZSBleHBvcnRlZCBsaWJyYXJ5Ci0JCQkvLyBjYW4ndCBiZSBsb2FkZWQuCi0JCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24obnVsbCwgY29uZmlnKTsKLQotCQkJY2xvc3VyZSA9IG5ldyBDb25maWd1cmF0aW9uQ2xvc3VyZShudWxsLCBjb25maWcpOwotCQkJY2xvc3VyZS5wYWNrYWdlTGlicmFyeShkYXRhLnJlbW92ZUJyb2tlblJlZmVyZW5jZXMpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJIkVycm9yIG1ha2luZyBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gY2xvc3VyZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQlkYXRhLmVycm9yTXNnID0gRXhwb3J0UmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzE7IAotCi0JCQlpZiAoY2xvc3VyZSAhPSBudWxsKQotCQkJCWNsb3N1cmUuZGlzcG9zZSgpOwotCQkJCi0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnVuUmVnaXN0ZXJNZXRob2RMaWJyYXJ5KG5ld0xpYnJhcnkpOwotCQkJCi0JCQlyZXR1cm47Ci0JCX0KLQotCQl0cnkgewotCQkJTGlicmFyeVV0aWwuc2F2ZUFsbChuZXdMaWJyYXJ5KTsKLQotCQkJLy8gdGhlIGZpcnN0IHJvdW5kIG9mIHNhdmUgd2lsbCBjcmVhdGUgdGhlIHJlc291cmNlIHN0cnVjdHVyZSwKLQkJCS8vIG5lZWQgdG8gc2F2ZSBhZ2FpbiB0byBtYWtlIHN1cmUgYWxsIHJlZmVyZW5jZXMgYXJlIHNhdmVkLgotCQkJLy8gVGhpcyBzdGVwIGlzIGNyaXRpY2FsIHNpbmNlIHRoZSBmaXJzdCByb3VuZCBvbmx5IGNyZWF0ZWQgdGhlIGRhdGEKLQkJCS8vIHN0cnVjdHVyZQotCQkJLy8gc29tZSBvZiB0aGUgY3Jvc3MtcmVmZXJlbmNlZCBlbGVtZW50cyBtaWdodCBiZSBsb3N0IG9uIHRoZSBmaXJzdAotCQkJLy8gc2F2aW5nCi0JCQkvLyBmb3IgZXhhbXBsZSwgd2hlbiBjcmVhdGUgYSBtZXRob2QgY29uZmlndXJhdGlvbiB3aXRoIHJlZmVyZW5jZXMKLQkJCS8vIHRvIGEgbmV3IHBsdWdpbiwKLQkJCS8vIHdoaWNoIGFyZSBub3Qgc2F2ZWQgeWV0LCB0aG9zZSByZWZlcmVuY2VzIHdpbGwgYmUgbG9zdC4KLQkJCS8vIDE0NTg5MSAtIEltcG9ydCBDb25maWd1cmF0aW9uOiBkZWZhdWx0IGNvbmZpZyBpcyBsb3NzIGFmdGVyCi0JCQkvLyBpbXBvcnQKLQkJCUxpYnJhcnlVdGlsLnNhdmVBbGwobmV3TGlicmFyeSk7Ci0KLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCUV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCSJFcnJvciBzYXZpbmcgbGlicmFyeSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQlkYXRhLmVycm9yTXNnID0gRXhwb3J0UmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzk7IAotCi0JCQlpZiAoY2xvc3VyZSAhPSBudWxsKQotCQkJCWNsb3N1cmUuZGlzcG9zZSgpOwotCi0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnVuUmVnaXN0ZXJNZXRob2RMaWJyYXJ5KG5ld0xpYnJhcnkpOwotCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBDb3B5IHRoZSByZXNvdXJjZSBmaWxlcyBpbiB0aGUgY3VycmVudCBsaWJyYXJ5IHRvIHRoZSBuZXcgbGlicmFyeS4KLQkJLy8gRm9yIHNpbXBsaWNpdHkgc2FrZSwgY29weSBhbGwgcmVzb3VyY2UgZmlsZXMgaWYgdGhlIGZpbGVzIGRvIG5vdAotCQkvLyBleGlzdCBpbiB0aGUgdGFyZ2V0IGxpYnJhcnkgb3IgaWYgdGhlIGZpbGVzIGFyZSBuZXdlcgotCQkvL1N0cmluZyBpbmNsdWRlcyA9ICJyZXNvdXJjZXMvKiosICoqL3Jlc291cmNlcy8qKiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGluY2x1ZGVzID0gInJlc291cmNlcy8qKiwgKiovcmVzb3VyY2VzLyoqLCAqKi9kaWFncmFtLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCQlGaWxlIHNyY0RpciA9IExpYnJhcnlVdGlsLmdldExpYnJhcnlSb290UGF0aChjdXJyZW50TGliKTsKLQkJRmlsZSBkZXN0RGlyID0gTGlicmFyeVV0aWwuZ2V0TGlicmFyeVJvb3RQYXRoKG5ld0xpYnJhcnkpOwotCi0JCUxheW91dFJlc291cmNlcy5jb3B5RGlyKHNyY0RpciwgZGVzdERpciwgaW5jbHVkZXMsIGV4Y2x1ZGVzKTsKLQkJaGFuZGxlRXh0cmFSZXNvdXJjZUNvcHkoY3VycmVudExpYiwgbmV3TGlicmFyeSwgc3JjRGlyLCBkZXN0RGlyLCBpbmNsdWRlcyk7Ci0KLQkJLy8gQ2xvc2UgdGhlIG5ld2x5IGNyZWF0ZWQgbGlicmFyeS4KLQkJaWYgKGNsb3N1cmUgIT0gbnVsbCkKLQkJCWNsb3N1cmUuZGlzcG9zZSgpOwotCQkKLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS51blJlZ2lzdGVyTWV0aG9kTGlicmFyeShuZXdMaWJyYXJ5KTsKLQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlRXh0cmFSZXNvdXJjZUNvcHkoTWV0aG9kTGlicmFyeSBiYXNlTGliLCBNZXRob2RMaWJyYXJ5IGV4cG9ydGVkTGliLCBGaWxlIGJhc2VMaWJEaXIsIEZpbGUgZXhwb3J0ZWRMaWJEaXIsIFN0cmluZyBpbmNsdWRlcykgewotCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciBsaWJSZXNNZ3IgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldFJlc291cmNlTWFuYWdlcigpOwotCQlNYXAgZXhwb3J0ZWRQbHVnaW5NYXAgPSBNZXRob2RFbGVtZW50VXRpbC5idWlsZE1hcChiYXNlTGliLmdldE1ldGhvZFBsdWdpbnMoKSk7Ci0JCQotCQlMaXN0PE1ldGhvZFBsdWdpbj4gYmFzZVBsdWdpbnMgPSBiYXNlTGliLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiYXNlUGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IGJhc2VQbHVnaW5zLmdldChpKTsKLQkJCUZpbGUgcGx1Z2luRm9sZGVyID0gbmV3IEZpbGUobGliUmVzTWdyLmdldFBoeXNpY2FsUGF0aChwbHVnaW4pKTsKLQkJCWJvb2xlYW4gcHJvY2Vzc2VkID0gYmFzZUxpYkRpci5lcXVhbHMocGx1Z2luRm9sZGVyLmdldFBhcmVudEZpbGUoKSk7CQkJCi0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiTEQgcGx1Z2luRm9sZGVyOiAiICsgcGx1Z2luRm9sZGVyICsgIiwgcHJvY2Vzc2VkOiAiICsgcHJvY2Vzc2VkKTsKLQkJCWlmICghIHByb2Nlc3NlZCkgewotCQkJCU1ldGhvZFBsdWdpbiBleHBvcnRlZFBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGV4cG9ydGVkUGx1Z2luTWFwLmdldChwbHVnaW4uZ2V0R3VpZCgpKTsKLQkJCQlpZiAoZXhwb3J0ZWRQbHVnaW4gPT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJRmlsZSBkZXN0RGlyID0gbmV3IEZpbGUoZXhwb3J0ZWRMaWJEaXIsIGV4cG9ydGVkUGx1Z2luLmdldE5hbWUoKSk7Ci0JCQkJTGF5b3V0UmVzb3VyY2VzLmNvcHlEaXIocGx1Z2luRm9sZGVyLCBkZXN0RGlyLCBpbmNsdWRlcywgZXhjbHVkZXMpOwotCQkJfQotCi0JCX0JCQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvblNwZWMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvblNwZWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFkZGM5OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25TcGVjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBNb2RlbHMgYSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25TcGVjIHsKLQotCXB1YmxpYyBTdHJpbmcgbmFtZTsKLQotCXB1YmxpYyBTdHJpbmcgZ3VpZDsKLQotCXB1YmxpYyBTdHJpbmcgdmVyc2lvbjsKLQotCXB1YmxpYyBTdHJpbmcgYnJpZWZfZGVzYzsKLQotCXB1YmxpYyBMaXN0IHBsdWdpbklkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBMaXN0IHBhY2thZ2VJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgTGlzdCB2aWV3SWRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblNwZWMoKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTM3Mjg3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLQotLyoqCi0gKiBFeHBvcnRzIGEgbGlicmFyeSBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyMTUzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlIGV4dGVuZHMgQmFzZUV4cG9ydFNlcnZpY2UgewotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZShDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogUnVuIHRvIGV4cG9ydCBhIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhaXRvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChkYXRhLnNlbGVjdGVkQ29uZmlncyA9PSBudWxsIHx8IGRhdGEuc2VsZWN0ZWRDb25maWdzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQltb25pdG9yLnNldFRhc2tOYW1lKEV4cG9ydFJlc291cmNlcy5Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzApOyAKLQotCQkvLyBDcmVhdGUgdGhlIGV4cG9ydCBsaWJyYXJ5IGZvbGRlci4KLQkJRmlsZSBsaWJGb2xkZXI7Ci0JCUZpbGUgZXhwb3J0TGliRm9sZGVyOwotCi0JCVN0cmluZyBleHBvcnRMaWJQYXRoID0gKG5ldyBGaWxlKGRhdGEubGxEYXRhLmdldFBhcmVudEZvbGRlcigpKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCWV4cG9ydExpYkZvbGRlciA9IG5ldyBGaWxlKGV4cG9ydExpYlBhdGgpOwotCQlpZiAoIWV4cG9ydExpYkZvbGRlci5leGlzdHMoKSkgewotCQkJZXhwb3J0TGliRm9sZGVyLm1rZGlyKCk7Ci0JCX0KLQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBkYXRhLnNlbGVjdGVkQ29uZmlncwotCQkJCS5nZXQoMCk7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gKE1ldGhvZExpYnJhcnkpIGNvbmZpZy5lQ29udGFpbmVyKCk7Ci0JCVVSSSB1cmkgPSBsaWIuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCVN0cmluZyBwYXRoID0gdXJpLnRvRmlsZVN0cmluZygpOwotCQlsaWJGb2xkZXIgPSAobmV3IEZpbGUocGF0aCkpLmdldFBhcmVudEZpbGUoKTsKLQotCQkvLyBQcmVwYXJlIHRoZSBpZCBzZWxlY3Rpb25zLAotCQlnZXRTZWxlY3RlZElkcyhkYXRhLnNlbGVjdGVkQ29uZmlncyk7Ci0KLQkJLy8gTG9hZCB0aGUgbGlicmFyeS54bWkgYW5kIHJlbW92ZSB1bm5lZWRlZCBlbGVtZW50cy4KLQkJTGlicmFyeURvY3VtZW50IGRvY3VtZW50ID0gcHJvY2Vzc0xpYnJhcnlGaWxlKG5ldyBGaWxlKGxpYkZvbGRlciwgbGlicmFyeUZpbGUpLCBuZXcgRmlsZSgKLQkJCQlleHBvcnRMaWJGb2xkZXIsIGV4cG9ydEZpbGUpKTsKLQotCQlpZiAoIGRvY3VtZW50ICE9IG51bGwgKSB7Ci0JCQkvLyBjb3B5IHRoZSBjb25pZnVyYXRpb24gZmlsZXMKLQkJCS8vIDE0MzAzMyAtIHVwZGF0ZSBjb25maWcgc3BlY3MnIGltcG9ydGluZyBhbmQgZXhwb3J0aW5nIHRvIG1hdGNoIHdpdGggdGhlIG5ldyBmaWxlIGZvcm1hdAotCQkJY29weUNvbmZpZ3VyYXRpb25GaWxlcyhkb2N1bWVudCwgbGliRm9sZGVyLCBleHBvcnRMaWJGb2xkZXIpOwotCQl9Ci0JCQotCQltb25pdG9yLnNldFRhc2tOYW1lKEV4cG9ydFJlc291cmNlcy5Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzEpOyAKLQotCX0KLQotCXByaXZhdGUgdm9pZCBjb3B5Q29uZmlndXJhdGlvbkZpbGVzKExpYnJhcnlEb2N1bWVudCBkb2N1bWVudCwgRmlsZSBsaWJGb2xkZXIsIEZpbGUgZXhwb3J0TGliRm9sZGVyKSB7Ci0JCS8vIDE0MzAzMyAtIHVwZGF0ZSBjb25maWcgc3BlY3MnIGltcG9ydGluZyBhbmQgZXhwb3J0aW5nIHRvIG1hdGNoIHdpdGggdGhlIG5ldyBmaWxlIGZvcm1hdAotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5zZWxlY3RlZENvbmZpZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXQubmV4dCgpOwotCQkJU3RyaW5nIGd1aWQgPSBjb25maWcuZ2V0R3VpZCgpOwotCQkJU3RyaW5nIHVyaSA9IGRvY3VtZW50LmdldFJlc291cmNlVXJpKGd1aWQpOwotCQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQkJVVJJIHJlc1VyaSA9IGNvbmZpZy5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKLQkJCQl1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5NRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSArIEZpbGUuc2VwYXJhdG9yICsgcmVzVXJpLmxhc3RTZWdtZW50KCk7Ci0JCQkJdXJpID0gZG9jdW1lbnQuZGVjb2RlVXJpKHVyaSk7Ci0JCQl9Ci0JCQlpZiAoIHVyaSAhPSBudWxsICkgewotCQkJCUZpbGUgc3JjID0gbmV3IEZpbGUobGliRm9sZGVyLCB1cmkpOwotCQkJCUZpbGUgdGFyZ2V0ID0gIG5ldyBGaWxlKGV4cG9ydExpYkZvbGRlciwgdXJpKTsKLQkJCQlGaWxlVXRpbC5jb3B5RmlsZShzcmMsIHRhcmdldCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGdldFNlbGVjdGVkSWRzKExpc3QgY29uZmlncykgewotCQlzZWxlY3RlZElkcy5jbGVhcigpOwotCQlzZWxlY3RlZFBsdWdpbk5hbWVzLmNsZWFyKCk7Ci0KLQkJLy8gR2V0IHNlbGVjdGVkIGNvbmZpZyBpZHMuCi0JCWlmIChjb25maWdzID09IG51bGwgfHwgY29uZmlncy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGNvbmZpZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXQubmV4dCgpOwotCQkJU3RyaW5nIGd1aWQgPSBjb25maWcuZ2V0R3VpZCgpOwotCQkJaWYgKHNlbGVjdGVkSWRzLmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8vIEFkZCB0aGUgY29uZmlndXJhdGlvbi4KLQkJCXNlbGVjdGVkSWRzLmFkZChndWlkKTsKLQotCQkJLy8gRm9yIGVhY2ggY29uZmlndXJhdGlvbiwgd2UgbmVlZCB0byBzYXZlIHRoZSBtZXRob2QgcGx1Z2luIGlkcyBhbmQKLQkJCS8vIG1ldGhvZCBwYWNrYWdlIGlkcyBzbyB0aGF0IHRoZWlyIGVudHJpZXMgaW4gdGhlIHJlc291cmNlIGZpbGUgY2FuCi0JCQkvLyBiZSBrZXB0LgotCQkJTGlzdCByZWZzID0gY29uZmlnLmVDcm9zc1JlZmVyZW5jZXMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRyID0gcmVmcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvID0gaXRyLm5leHQoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBvIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCQlndWlkID0gKChNZXRob2RFbGVtZW50KSBvKS5nZXRHdWlkKCk7Ci0JCQkJCWlmICghc2VsZWN0ZWRJZHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQkJCXNlbGVjdGVkSWRzLmFkZChndWlkKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUV4cG9ydFBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkiVW5leHBlY3RlZCBlbGVtZW50IHR5cGUgJyIgKyAoKE1ldGhvZEVsZW1lbnQpIG8pLmdldFR5cGUoKS5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkrICInIGluIGNvbmZpZ3VyYXRpb24gJyIgKyBjb25maWcuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9EaWFncmFtSGFuZGxlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9EaWFncmFtSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDBjYjkxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvRGlhZ3JhbUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gaGFuZGxlIGRpYWdyYW0gZXhwb3J0L2ltcG9ydAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUhhbmRsZXIgewotCQotCS8vVG8gZG86IG5lZWQgdG8gY29uc2lkZXIgZWxlbWVudCByZW5hbWUgaXNzdWUuIAotCS8vCQkgLT4gUmVzb3ZsZSB0aGUgaW52b2x2ZWQgZmlsZSBuYW1lcyBhZnRlciBhbGwgcmVzb3VyY2UgbmFtZXMgYXJlIHNldHRsZWQuCi0JLy8JCSAtPiBMZXQgYSBzdWIgY2xhc3MgdG8gdGFrZSBvZiBpdD8KLQotCXByaXZhdGUgRmlsZSBzb3VyY2VMaWJSb290OwotCXByaXZhdGUgRmlsZSB0YXJnZXRMaWJSb290OwotCXByaXZhdGUgTWFwPFN0cmluZywgTWFwRW50cnlWYWx1ZT4gZWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwRW50cnlWYWx1ZT4oKTsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0JCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCQotCXB1YmxpYyBEaWFncmFtSGFuZGxlcihGaWxlIHNvdXJjZUxpYlJvb3QsIEZpbGUgdGFyZ2V0TGliUm9vdCkgewotCQl0aGlzLnNvdXJjZUxpYlJvb3QgPSBzb3VyY2VMaWJSb290OwotCQl0aGlzLnRhcmdldExpYlJvb3QgPSB0YXJnZXRMaWJSb290OwotCX0KLQkKLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgTWFwRW50cnlWYWx1ZT4gZ2V0RWxlbWVudE1hcCgpIHsKLQkJcmV0dXJuIGVsZW1lbnRNYXA7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBuZWVkVG9Qcm9jZXNzKE1ldGhvZEVsZW1lbnQgZWxlbSkgewotCQlib29sZWFuIGIgPSBlbGVtIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4gfHwKLQkJCQkJCQkJZWxlbSBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzczsKLQkJcmV0dXJuIGI7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWdpc3RlckVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCXJlZ2lzdGVyRWxlbWVudChlbGVtLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW0sIGJvb2xlYW4gcHJvY2Vzc0VudHJ5KSB7Ci0JCWlmICghIG5lZWRUb1Byb2Nlc3MoZWxlbSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZWxlbWVudE1hcC5jb250YWluc0tleShlbGVtLmdldEd1aWQoKSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTWFwRW50cnlWYWx1ZSBtYXBFbnRyeVZhbHVlID0gbmV3IE1hcEVudHJ5VmFsdWUoKTsKLQkJbWFwRW50cnlWYWx1ZS5lbGVtZW50ID0gZWxlbTsKLQkJZWxlbWVudE1hcC5wdXQoZWxlbS5nZXRHdWlkKCksIG1hcEVudHJ5VmFsdWUpOwkJCi0JCQotCQlpZiAocHJvY2Vzc0VudHJ5KSB7Ci0JCQlwcm9jZXNzRW50cnkoZWxlbSwgbWFwRW50cnlWYWx1ZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcG9zdFJlZ2lzdGVyRWxlbWVudHMoKSB7Ci0JCWZvciAoSXRlcmF0b3I8TWFwRW50cnlWYWx1ZT4gaXQgPSBlbGVtZW50TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcEVudHJ5VmFsdWUgdmFsdWUgPSBpdC5uZXh0KCk7Ci0JCQlwcm9jZXNzRW50cnkodmFsdWUuZWxlbWVudCwgdmFsdWUpOwotCQl9CQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzRW50cnkoTWV0aG9kRWxlbWVudCBlbGVtLCBNYXBFbnRyeVZhbHVlIG1hcEVudHJ5VmFsdWUpIHsKLQkJRmlsZVtdIGZpbGVzID0gZ2V0RmlsZXMoZWxlbSk7Ci0JCUZpbGUgc291cmNlRmlsZSA9IGZpbGVzWzBdOwotCQlGaWxlIHRhcmdldEZpbGUgPSBmaWxlc1sxXTsKLQotCQlpZiAoc291cmNlRmlsZSAhPSBudWxsICYmIHNvdXJjZUZpbGUuZXhpc3RzKCkpIHsKLQkJCW1hcEVudHJ5VmFsdWUuc291cmNlRmlsZSA9IHNvdXJjZUZpbGU7Ci0JCX0KLQotCQlpZiAodGFyZ2V0RmlsZS5leGlzdHMoKSkgewotCQkJaWYgKG1hcEVudHJ5VmFsdWUuc291cmNlRmlsZSA9PSBudWxsIHx8IG5lZWRDb3B5KG1hcEVudHJ5VmFsdWUuc291cmNlRmlsZSwgdGFyZ2V0RmlsZSkpIHsKLQkJCQltYXBFbnRyeVZhbHVlLnRhcmdldEZpbGUgPSB0YXJnZXRGaWxlOwotCQkJfQotCQkJbWFwRW50cnlWYWx1ZS5leGlzdGluZyA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobWFwRW50cnlWYWx1ZS5zb3VyY2VGaWxlICE9IG51bGwpIHsKLQkJCQltYXBFbnRyeVZhbHVlLnRhcmdldEZpbGUgPSB0YXJnZXRGaWxlOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IG1hcEVudHJ5VmFsdWU6ICIpOwkJCQkJLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKG1hcEVudHJ5VmFsdWUudG9EZWJ1Z1N0cmluZygiTEQ+ICIpKTsJLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldE1vZGlmaWVkRmlsZXMoKSB7Ci0JCUxpc3QgcmV0ID0gbmV3IEFycmF5TGlzdCgpOwkJCi0JCWZvciAoSXRlcmF0b3I8TWFwRW50cnlWYWx1ZT4gaXQgPSBlbGVtZW50TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcEVudHJ5VmFsdWUgdmFsdWUgPSBpdC5uZXh0KCk7Ci0JCQlpZiAodmFsdWUuZXhpc3RpbmcgJiYgdmFsdWUudGFyZ2V0RmlsZSAhPSBudWxsKSB7Ci0JCQkJcmV0LmFkZCh2YWx1ZS50YXJnZXRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCX0KLQkJfQkJCi0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogY29weSBhbGwgdGhlIGZpbGVzIHRvIHRoZSBkZXN0aW5hdGlvbgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJdHJ5IHsKLQkJCWV4ZWN1dGVfKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9CQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZXhlY3V0ZV8oKSB7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yPE1hcEVudHJ5VmFsdWU+IGl0ID0gZWxlbWVudE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWFwRW50cnlWYWx1ZSB2YWx1ZSA9IGl0Lm5leHQoKTsKLQkJCWlmICh2YWx1ZS50YXJnZXRGaWxlID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSBpZiAodmFsdWUuc291cmNlRmlsZSAhPSBudWxsKSB7Ci0JCQkJRmlsZSBwYXJlbnRGaWxlID0gdmFsdWUudGFyZ2V0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJRmlsZVV0aWwuY29weUZpbGUodmFsdWUuc291cmNlRmlsZSwgdmFsdWUudGFyZ2V0RmlsZSk7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ6IEZpbGUgY29waWVkOiAiICsgdmFsdWUuc291cmNlRmlsZSk7CS8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXZhbHVlLnRhcmdldEZpbGUuZGVsZXRlKCk7Ci0JCQl9Ci0JCX0JCi0JfQotCQkKLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBjb3B5IGFjdGlvbiBpcyBuZWVkZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG5lZWRDb3B5KEZpbGUgc291cmNlLCBGaWxlIGRlc3QpIHsKLQkJYm9vbGVhbiByZXQgPSB0cnVlOwotCQlpZiAoZGVzdC5leGlzdHMoKSkgewotCQkJcmV0ID0gKGRlc3QubGFzdE1vZGlmaWVkKCkgIT0gc291cmNlLmxhc3RNb2RpZmllZCgpKQotCQkJCQl8fCAoZGVzdC5sZW5ndGgoKSAhPSBzb3VyY2UubGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTWFwRW50cnlWYWx1ZSB7Ci0KLQkJcHVibGljIE1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQkJcHVibGljIEZpbGUgc291cmNlRmlsZTsKLQkJcHVibGljIEZpbGUgdGFyZ2V0RmlsZTsKLQkJcHVibGljIGJvb2xlYW4gZXhpc3RpbmcgPSBmYWxzZTsJCQotCQkKLQkJcHVibGljIFN0cmluZyB0b0RlYnVnU3RyaW5nKFN0cmluZyBwcm9tcHQpIHsKLQkJCVN0cmluZyBzdHIgPSBwcm9tcHQgKyAiZWxlbWVudDogIiArIGVsZW1lbnQuZ2V0TmFtZSgpOwkJLy8kTk9OLU5MUy0xJAotCQkJc3RyICs9ICJcbiIgKyBwcm9tcHQgKyAic291cmNlRmlsZTogIiArIHNvdXJjZUZpbGU7CQkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXN0ciArPSAiXG4iICsgcHJvbXB0ICsgInRhcmdldEZpbGU6ICIgKyB0YXJnZXRGaWxlOwkJLy8kTk9OLU5MUy0xJCAJLy8kTk9OLU5MUy0yJAotCQkJc3RyICs9ICJcbiIgKyBwcm9tcHQgKyAiZXhpc3Rpbmc6ICIgKyBleGlzdGluZzsJCQkvLyROT04tTkxTLTEkIAkvLyROT04tTkxTLTIkCQkJCi0JCQlyZXR1cm4gc3RyOwotCQl9Ci0JCQotCX0KLQotCXByb3RlY3RlZCBGaWxlW10gZ2V0RmlsZXMoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCXJldHVybiBnZXRGaWxlcyhlbGVtLCB0cnVlKTsKLQl9Ci0JCi0JLy9bMF06IHNvdXJjZUZpbGUKLQkvL1sxXTogdGFyZ2V0RmlsZQotCXByb3RlY3RlZCBGaWxlW10gZ2V0RmlsZXMoTWV0aG9kRWxlbWVudCBlbGVtLCBib29sZWFuIGV4cG9ydCkgewotCQlGaWxlW10gZmlsZXMgPSBuZXcgRmlsZVsyXTsKLQkJCi0JCVN0cmluZyBlbGVtZW50UGF0aCA9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKGVsZW0pOwotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGVsZW1lbnRQYXRoOiAiICsgZWxlbWVudFBhdGgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGVsZW1lbnRQYXRoID09IG51bGwgfHwgZWxlbWVudFBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZWxlbWVudFBhdGggaXMgbnVsbCBvciBlbXB0eSEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIGZpbGVzOwotCQl9Ci0KLQkJU3RyaW5nIGRpYWdyYW1QYXRoID0gZWxlbWVudFBhdGggKyBlbGVtLmdldE5hbWUoKSArIEZpbGUuc2VwYXJhdG9yICsgCi0JCQkJCQkJCSJkaWFncmFtLnhtaSI7CQkJCS8vJE5PTi1OTFMtMSQKLQkJCi0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZGlhZ3JhbVBhdGggMDogIiArIGRpYWdyYW1QYXRoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJRmlsZSBzcmNSb290ID0gc291cmNlTGliUm9vdDsKLQkJRmlsZSB0Z3RSb290ID0gdGFyZ2V0TGliUm9vdDsKLQkJCi0JCQotCQlpZiAoZXhwb3J0KSB7Ci0JCQlzcmNSb290ID0gIGdldFJvb3QoZWxlbSk7Ci0JCX0gZWxzZSB7Ci0JCQl0Z3RSb290ID0gIGdldFJvb3QoZWxlbSk7Ci0JCX0KLQkJCi0JCWlmIChleHBvcnQpIHsKLQkJCVJlc291cmNlIHJlcyA9IGVsZW0uZVJlc291cmNlKCk7Ci0JCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQlGaWxlIG1vZGVsRmlsZSA9IG5ldyBGaWxlKHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJRmlsZSBmb2xkZXIgPSBtb2RlbEZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQkJCVN0cmluZyBmb2xkZXJQYXRoID0gZm9sZGVyLmdldEFic29sdXRlUGF0aCgpOwotCi0JCQkJaW50IGl4ID0gc3JjUm9vdC5nZXRBYnNvbHV0ZVBhdGgoKS5sZW5ndGgoKTsKLQkJCQlpZiAoZm9sZGVyUGF0aC5sZW5ndGgoKSA+IGl4Ci0JCQkJCQkmJiBmb2xkZXJQYXRoLnN1YnN0cmluZygwLCBpeCkuZXF1YWxzSWdub3JlQ2FzZSgKLQkJCQkJCQkJc3JjUm9vdC5nZXRBYnNvbHV0ZVBhdGgoKSkpIHsKLQkJCQkJZGlhZ3JhbVBhdGggPSBmb2xkZXJQYXRoLnN1YnN0cmluZyhpeCArIDEpICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCQkrICJkaWFncmFtLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlQcm9jZXNzQ29tcG9uZW50IHBjID0gVW1hVXRpbC5nZXRQcm9jZXNzQ29tcG9uZW50KGVsZW0pOwotCQkJaWYgKHBjICE9IG51bGwgJiYgISBwYy5nZXROYW1lKCkuZXF1YWxzKGVsZW0uZ2V0TmFtZSgpKSkgewotCQkJCWRpYWdyYW1QYXRoID0gZWxlbWVudFBhdGggKyBwYy5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJKyAiZGlhZ3JhbS54bWkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJCi0JCWZpbGVzWzBdID0gbmV3IEZpbGUoc3JjUm9vdCwgZGlhZ3JhbVBhdGgpOwotCQlmaWxlc1sxXSA9IG5ldyBGaWxlKHRndFJvb3QsIGRpYWdyYW1QYXRoKTsJCQotCi0JCXJldHVybiBmaWxlczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmlzaXRFbGVtZW50TWFwKGludCBwYXNzSWQpIHsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRTb3VyY2VMaWJSb290KCkgewotCQlyZXR1cm4gc291cmNlTGliUm9vdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEZpbGUgZ2V0Um9vdChNZXRob2RFbGVtZW50IGVsZW0pIHsKLQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgbGliUmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3IoZWxlbSk7Ci0JCVN0cmluZyBwbHVnaW5QYXRoID0gbGliUmVzTWdyLmdldFBoeXNpY2FsUGx1Z2luUGF0aChlbGVtKTsKLQkJRmlsZSByb290ID0gKG5ldyBGaWxlKHBsdWdpblBhdGgpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCXJldHVybiByb290OwotCX0KLQotCXB1YmxpYyBGaWxlIGdldFRhcmdldExpYlJvb3QoKSB7Ci0JCXJldHVybiB0YXJnZXRMaWJSb290OwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvTGlicmFyeURvY3VtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0xpYnJhcnlEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWVmY2Y2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvTGlicmFyeURvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotICogRW5jYXBzdWxhdGVzIGEgbWV0aG9kIGxpYnJhcnkgdXNpbmcgYSBET00gZG9jdW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlEb2N1bWVudCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfbWV0aG9kUGx1Z2lucyA9ICJtZXRob2RQbHVnaW5zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX3ByZWRlZmluZWRDb25maWd1cmF0aW9ucyA9ICJwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfcmVzb3VyY2VEZXNjcmlwdG9ycyA9ICJyZXNvdXJjZURlc2NyaXB0b3JzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX3Jlc291cmNlU3ViTWFuYWdlcnMgPSAic3ViTWFuYWdlcnMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX21ldGhvZEVsZW1lbnRQcm9wZXJ0eSA9ICJtZXRob2RFbGVtZW50UHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX2hyZWYgPSAiaHJlZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfaWQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX3VyaSA9ICJ1cmkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX2d1aWQgPSAiZ3VpZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX3ZhbHVlID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXhwb3J0RmlsZSA9ICJleHBvcnQueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbGlicmFyeUZpbGUgPSAibGlicmFyeS54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgRmlsZSBsaWJGaWxlOwotCi0JcHJvdGVjdGVkIERvY3VtZW50IGRvY3VtZW50OwotCi0JcHJvdGVjdGVkIEVsZW1lbnQgbGliVGFnID0gbnVsbDsKLQotCXByb3RlY3RlZCBFbGVtZW50IHJlc1RhZyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBIYXNoTWFwIGd1aWRUb1VyaU1hcCA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGd1aWRUb1BsdWdOYW1lTWFwOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeURvY3VtZW50KEZpbGUgbGliRmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMubGliRmlsZSA9IGxpYkZpbGU7Ci0JCWluaXQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmRvY3VtZW50ID0gWE1MVXRpbC5sb2FkWG1sKGxpYkZpbGUpOwotCi0JCUVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCQlOb2RlTGlzdCBub2RlcyA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChub2RlcyAhPSBudWxsICYmIG5vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJbGliVGFnID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oMCk7Ci0JCX0KLQotCQlub2RlcyA9IHJvb3QKLQkJCQkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChub2RlcyAhPSBudWxsICYmIG5vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJcmVzVGFnID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oMCk7Ci0JCX0KLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBmaWVsZAotICAgICAqLwotCXB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZG9jdW1lbnQ7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGliRmlsZSBmaWVsZAotICAgICAqLwotCXB1YmxpYyBGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiBsaWJGaWxlOwotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpYlRhZyBmaWVsZAotICAgICAqLwotCXB1YmxpYyBFbGVtZW50IGdldExpYlRhZygpIHsKLQkJcmV0dXJuIGxpYlRhZzsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaWJyYXJ5IG5hbWUKLSAgICAgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlOYW1lKCkgewotCQlyZXR1cm4gbGliVGFnLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlicmFyeSBndWlkCi0gICAgICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5R3VpZCgpIHsKLQkJcmV0dXJuIGxpYlRhZy5nZXRBdHRyaWJ1dGUoImd1aWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIHRhZwotICAgICAqLwotCXB1YmxpYyBFbGVtZW50IGdldFJlc291cmNlVGFnKCkgewotCQlyZXR1cm4gcmVzVGFnOwotCX0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBwbHVnaW4gbm9kZQotICAgICAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVBsdWdpbihFbGVtZW50IG5vZGUpIHsKLQkJbGliVGFnLnJlbW92ZUNoaWxkKG5vZGUpOwotCX0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBjb25maWcgbm9kZQotICAgICAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbmZpZ3VyYXRpb24oRWxlbWVudCBub2RlKSB7Ci0JCWxpYlRhZy5yZW1vdmVDaGlsZChub2RlKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgcmVzb3VyY2UgZGVzY3JpcHRvciBub2RlCi0gICAgICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVzb3VyY2VEZXNjcmlwdG9yKEVsZW1lbnQgbm9kZSkgewotCQlyZXNUYWcucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBwbHVnaW4gbm9kZSBsaXN0Ci0gICAgICovCi0JcHVibGljIE5vZGVMaXN0IGdldFBsdWdpbnMoKSB7Ci0JCXJldHVybiBsaWJUYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoVEFHX21ldGhvZFBsdWdpbnMpOwotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgY29uZmlndXJhdGlvbiBub2RlIGxpc3QKLSAgICAgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0Q29uZmlndXJhdGlvbnMoKSB7Ci0JCXJldHVybiBsaWJUYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoVEFHX3ByZWRlZmluZWRDb25maWd1cmF0aW9ucyk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyByZXNvdXJjZSBkZXNjcmlwdG9yIG5vZGUgbGlzdAotICAgICAqLwotCXB1YmxpYyBOb2RlTGlzdCBnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gcmVzVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKFRBR19yZXNvdXJjZURlc2NyaXB0b3JzKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHJlc291cmNlIHN1Ym1hbmFnZXIgbm9kZSBsaXN0Ci0gICAgICovCi0JcHVibGljIE5vZGVMaXN0IGdldFJlc291cmNlU3ViTWFuYWdlcnMoKSB7Ci0JCXJldHVybiByZXNUYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoVEFHX3Jlc291cmNlU3ViTWFuYWdlcnMpOwotCX0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBwbHVnaW4gbm9kZQotICAgICAqLwotCXB1YmxpYyB2b2lkIGFkZFBsdWdpbihFbGVtZW50IG5vZGUpIHsKLQkJbGliVGFnLmFwcGVuZENoaWxkKGdldFZhbGlkTm9kZShub2RlKSk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGNvbmZpZ3VyYXRpb24gbm9kZQotICAgICAqLwotCXB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyYXRpb24oRWxlbWVudCBub2RlKSB7Ci0JCWxpYlRhZy5hcHBlbmRDaGlsZChnZXRWYWxpZE5vZGUobm9kZSkpOwotCX0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSByZXNvdXJjZSBub2RlCi0gICAgICovCi0JcHVibGljIHZvaWQgYWRkUmVzb3VyY2UoRWxlbWVudCBub2RlKSB7Ci0JCXJlc1RhZy5hcHBlbmRDaGlsZChnZXRWYWxpZE5vZGUobm9kZSkpOwotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB2YWxpZCBub2RlCi0gICAgICovCi0JcHVibGljIE5vZGUgZ2V0VmFsaWROb2RlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZS5nZXRPd25lckRvY3VtZW50KCkgPT0gZG9jdW1lbnQpIHsKLQkJCXJldHVybiBub2RlOwotCQl9Ci0KLQkJcmV0dXJuIGRvY3VtZW50LmltcG9ydE5vZGUobm9kZSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlIHBsdWdpbnMgYnkgZ3VpZAotCSAqIAotCSAqIEBwYXJhbSByZW1vdmVMaXN0Ci0JICogICAgICAgICAgICBMaXN0IGEgbGlzdCBvZiBndWlkcwotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVBsdWdpbnMoTGlzdCByZW1vdmVMaXN0KSB7Ci0JCS8vIEltcG9ydGluZyBhIHBhY2thZ2Ugb2YgcGxnaW5zIHR3aWNlIGdlbmVyYXRlcyAyCi0JCS8vIGlkZW50aWNhbCBwbHVnaW5zCi0JCS8vIHJlbW92ZSB0aGUgbm9kZSB3aWxsIGNhdXNlIHRoZSBub2RlIGxpc3QgdG8gc2hyaW5rLCBzbyBkb24ndCBpbmNyZWFzZQotCQkvLyB0aGUgaW5kZXgKLQkJTm9kZUxpc3Qgbm9kZXMgPSBnZXRQbHVnaW5zKCk7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGkgPCBub2Rlcy5nZXRMZW5ndGgoKSkgewotCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgZ3VpZCA9IGdldEd1aWQobm9kZSk7Ci0JCQlpZiAocmVtb3ZlTGlzdC5jb250YWlucyhndWlkKSkgewotCQkJCWxpYlRhZy5yZW1vdmVDaGlsZChub2RlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBsaXN0IGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gbm9kZXMKLSAgICAgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDb25maWd1cmF0aW9ucyhMaXN0IHJlbW92ZUxpc3QpIHsKLQkJLy8gcmVtb3ZlIHRoZSB1bm5lZWRlZCBjb25maWd1cmF0aW9ucwotCQlOb2RlTGlzdCBub2RlcyA9IGdldENvbmZpZ3VyYXRpb25zKCk7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGkgPCBub2Rlcy5nZXRMZW5ndGgoKSkgewotCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgZ3VpZCA9IGdldEd1aWQobm9kZSk7Ci0JCQlpZiAocmVtb3ZlTGlzdC5jb250YWlucyhndWlkKSkgewotCQkJCWxpYlRhZy5yZW1vdmVDaGlsZChub2RlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBsaXN0IGZyb20gdGhlIHJlc291cmNlIG5vZGVzCi0gICAgICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVzb3VyY2VFbnRyaWVzKExpc3QgcmVtb3ZlTGlzdCkgewotCQlOb2RlTGlzdCBub2RlcyA9IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBndWlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9pZCk7Ci0JCQlTdHJpbmcgdXJpID0gbm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl91cmkpOwotCQkJaWYgKHJlbW92ZUxpc3QuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQlyZXNUYWcucmVtb3ZlQ2hpbGQobm9kZSk7Ci0KLQkJCQkvLyBjaGVjayB0aGUgcGx1Z2luIHhtaSBmaWxlLCBpZiBleGlzdHMsIGRlbGV0ZSB0aGUgZm9sZGVyCi0JCQkJRmlsZSBwbHVnbl9maWxlID0gZ2V0RmlsZUZyb21VcmkodXJpKTsKLQkJCQlpZiAocGx1Z25fZmlsZS5leGlzdHMoKSkgewotCQkJCQkvLyBkZWxldGUgdGhlIGZvbGRlciA/Pz8KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWkrKzsKLQkJCX0KLQkJfQotCi0JCS8vIGFsc28gcmVtb3ZlIHRoZSBzdWIgbWFuYWdlcnMKLQkJbm9kZXMgPSBnZXRSZXNvdXJjZVN1Yk1hbmFnZXJzKCk7Ci0JCWkgPSAwOwotCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBndWlkID0gZ2V0U3ViTWFuYWdlckJhc2VHdWlkKG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfaHJlZikpOwotCQkJaWYgKHJlbW92ZUxpc3QuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQlyZXNUYWcucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JCQl9IGVsc2UgewotCQkJCWkrKzsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgcmVzb3VyY2UgdXJpIGZvciB0aGUgcmVzb3VyY2UgZ3VpZAotCSAqIEBwYXJhbSBndWlkCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHVyaQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VVcmkoU3RyaW5nIGd1aWQpIHsKLQkJU3RyaW5nIHVyaSA9IGdldFVyaUZyb21HdWlkVG9VcmlNYXAoZ3VpZCk7Ci0JCWlmICh1cmkgPT0gbnVsbCkgewotCQkJdXJpID0gZ2V0UmVzb3VyY2VVcmlfKGd1aWQpOwotCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJLy9hZGRUb0d1aWRUb1VyaU1hcChndWlkLCB1cmkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFJlc291cmNlVXJpXyhTdHJpbmcgZ3VpZCkgewotCQotCQlOb2RlTGlzdCBub2RlcyA9IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrICkgewotCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgaWQgPSBub2RlLmdldEF0dHJpYnV0ZShBVFRSX2lkKTsKLQkJCVN0cmluZyB1cmkgPSBub2RlLmdldEF0dHJpYnV0ZShBVFRSX3VyaSk7Ci0JCQlpZiAoIGd1aWQuZXF1YWxzKGlkKSApIHsKLQkJCQlyZXR1cm4gZGVjb2RlVXJpKHVyaSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlY29yZWQgVVJJLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZGVjb2RlVXJpKFN0cmluZyB1cmkpIHsKLQkJdHJ5IHsKLQkJCXVyaSA9IFVSTERlY29kZXIuZGVjb2RlKHVyaSwgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gdXJpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaWxlIGdpdmVuIHRoZSB1cmkuCi0JICovCi0JcHVibGljIEZpbGUgZ2V0RmlsZUZyb21VcmkoU3RyaW5nIHVyaSkgewotCQl1cmkgPSBkZWNvZGVVcmkodXJpKTsKLQkJCi0JCWludCBpID0gdXJpLmluZGV4T2YoIiMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaSA+IDApIHsKLQkJCXVyaSA9IHVyaS5zdWJzdHJpbmcoMCwgaSk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IEZpbGUobGliRmlsZS5nZXRQYXJlbnRGaWxlKCksIHVyaSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2F2ZUFzKGxpYkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBkb2N1bWVudCBpbiB0aGUgZmlsZSBnaXZlbiBieSBmaWxlUGF0aE5hbWUuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUFzKFN0cmluZyBmaWxlUGF0aE5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlYTUxVdGlsLnNhdmVEb2N1bWVudCh0aGlzLmRvY3VtZW50LCBmaWxlUGF0aE5hbWUpOwotCX0KLQotCS8qKgotCSAqIElzIHRoZSBkb2N1bWVudCBmb3IgY29uZmlndXRhdGlvbiBzcGVjaWZpY2F0aW9uIGV4cG9ydC9pbXBvcnQgb25seT8KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbmZpZ1NwZWNzT25seSgpIHsKLQkJTm9kZUxpc3Qgbm9kZXMgPSBnZXRQbHVnaW5zKCk7Ci0JCWlmIChub2RlcyA9PSBudWxsIHx8IG5vZGVzLmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBocmVmID0gbm9kZS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfaHJlZik7Ci0JCQlTdHJpbmcgZ3VpZCA9IGdldEd1aWRGcm9tSHJlZihocmVmKTsKLQkJCVN0cmluZyB1cmkgPSBnZXRSZXNvdXJjZVVyaShndWlkKTsKLQkJCQotCQkJLy8gY2hlY2sgaWYgdGhlIHJlc291cmNlIGZpbGVzIGFyZSB0aGVyZQotCQkJRmlsZSBwbHVnbl9maWxlID0gZ2V0RmlsZUZyb21VcmkodXJpKTsKLQkJCWlmIChwbHVnbl9maWxlLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gc3RhdGljIGhscGVyIG1ldGhvZHMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8qKgotCSAqIFJldHVybnMgc3VibWFuYWdlcidzIGJhc2UgZ3VpZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdWJNYW5hZ2VyQmFzZUd1aWQoU3RyaW5nIGhyZWYpIHsKLQkJZmluYWwgUGF0dGVybiBwID0gUGF0dGVybi5jb21waWxlKAotCQkJCSJ1bWE6Ly8oLio/KSMoLio/KSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCQlNYXRjaGVyIG0gPSBwLm1hdGNoZXIoaHJlZik7Ci0JCWlmIChtLmZpbmQoKSkgewotCQkJcmV0dXJuIG0uZ3JvdXAoMSk7Ci0JCX0KLQotCQlyZXR1cm4gaHJlZjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNoaWxkIHZhbHVlIG9mIHRoZSBjaGlsZCB0YWcgZ2l2ZW4gYnkgY2hpbGRUYWdOYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENoaWxkVmFsdWUoRWxlbWVudCB0YWcsIFN0cmluZyBjaGlsZFRhZ05hbWUpIHsKLQkJTm9kZUxpc3Qgbm9kZXMgPSB0YWcuZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAobm9kZXMgPT0gbnVsbCB8fCBub2Rlcy5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWludCBzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKGkpOwotCQkJaWYgKChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLQkJCQkJJiYgKChFbGVtZW50KSBub2RlKS5nZXRUYWdOYW1lKCkuZXF1YWxzKGNoaWxkVGFnTmFtZSkpIHsKLQkJCQlyZXR1cm4gZ2V0Tm9kZVRleHQoKEVsZW1lbnQpIG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogdGV4dCBvZiBhIGxlYWYgbm9kZSwgd2l0aG91dCBjaGlsZCBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIHRhZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROb2RlVGV4dChFbGVtZW50IHRhZykgewotCi0JCU5vZGVMaXN0IG5vZGVzID0gdGFnLmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKG5vZGVzID09IG51bGwgfHwgbm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpbnQgc2l6ZSA9IG5vZGVzLmdldExlbmd0aCgpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQlidWZmZXIuYXBwZW5kKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgZ3VpZCBmcm9tIGhyZWYuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R3VpZEZyb21IcmVmKFN0cmluZyBocmVmKSB7Ci0JCWludCBpID0gaHJlZi5pbmRleE9mKCIjIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGkgPiAwKSB7Ci0JCQlyZXR1cm4gaHJlZi5zdWJzdHJpbmcoaSArIDEpOwotCQl9Ci0KLQkJcmV0dXJuIGhyZWY7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBndWlkIG9mIHRoZSBub2RlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEd1aWQoRWxlbWVudCBub2RlKSB7Ci0JCVN0cmluZyBpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKCJ4bWk6aWQiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCApIHsKLQkJCVN0cmluZyBocmVmID0gbm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9ocmVmKTsKLQkJCWlkID0gZ2V0R3VpZEZyb21IcmVmKGhyZWYpOwotCQl9Ci0JCQotCQlyZXR1cm4gaWQ7Ci0JfQotCQotCS8vIDE0MzAzMyAtIHVwZGF0ZSBjb25maWcgc3BlY3MnIGltcG9ydGluZyBhbmQgZXhwb3J0aW5nIHRvIG1hdGNoIHdpdGggdGhlIG5ldyBmaWxlIGZvcm1hdAotCXByb3RlY3RlZCBFbGVtZW50IGdldENvbmZpZ05vZGUoRWxlbWVudCBjb25maWdOb2RlKSB7Ci0JCXRyeSB7Ci0JCQkKLQkJCS8vIG5ldyBtb2RlbCBkZWZpbmVzIGhyZWYgZm9yIGNvbmZpZ3VyYXRpb24gCi0JCQlTdHJpbmcgaHJlZiA9IGNvbmZpZ05vZGUuZ2V0QXR0cmlidXRlKEFUVFJfaHJlZik7Ci0JCQlpZiAoaHJlZiA9PSBudWxsIHx8IGhyZWYubGVuZ3RoKCkgPT0gMCApIHsKLQkJCQlyZXR1cm4gY29uZmlnTm9kZTsKLQkJCX0gCi0KLQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZEZyb21IcmVmKGhyZWYpOwotCQkJU3RyaW5nIHVyaSA9IGdldFJlc291cmNlVXJpKGd1aWQpOwotCQkJaWYgKCB1cmkgPT0gbnVsbCApIHsKLQkJCQlyZXR1cm4gY29uZmlnTm9kZTsKLQkJCX0KLQkJCQotCQkJRmlsZSBzb3VyY2UgPSBnZXRGaWxlRnJvbVVyaSh1cmkpOwotCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBYTUxVdGlsLmxvYWRYbWwoc291cmNlKTsKLQkJCUVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCi0JCQlFbGVtZW50IGNvbmZpZ1RhZyA9IG51bGw7Ci0JCQlpZiAocm9vdC5nZXRUYWdOYW1lKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCWNvbmZpZ1RhZyA9IHJvb3Q7Ci0JCQl9IGVsc2UgewotCQkJCU5vZGVMaXN0IG5vZGVzID0gcm9vdAotCQkJCQkJLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChub2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQkJY29uZmlnVGFnID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oMCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlyZXR1cm4gY29uZmlnVGFnOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gY29uZmlnTm9kZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBDb25maWd1cmF0aW9uU3BlYyBpbnN0YW5jZSBnaXZlbiB0aGUgZWxlbWVudCBub2RlIGNvbmZpZy4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblNwZWMgZ2V0Q29uZmlndXJhdGlvblNwZWMoRWxlbWVudCBjb25maWcpIHsKLQkJQ29uZmlndXJhdGlvblNwZWMgc3BlYyA9IG5ldyBDb25maWd1cmF0aW9uU3BlYygpOwotCQkKLQkJRWxlbWVudCBjb25maWdOb2RlID0gZ2V0Q29uZmlnTm9kZShjb25maWcpOwotCQlzcGVjLmd1aWQgPSBjb25maWdOb2RlLmdldEF0dHJpYnV0ZSgieG1pOmlkIik7IC8vJE5PTi1OTFMtMSQKLQkJc3BlYy5uYW1lID0gY29uZmlnTm9kZS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQlzcGVjLmJyaWVmX2Rlc2MgPSBjb25maWdOb2RlLmdldEF0dHJpYnV0ZSgiYnJpZWZEZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQkvLyBnZXQgcGx1Z2lucwotCQlOb2RlTGlzdCBub2RlcyA9IGNvbmZpZ05vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm1ldGhvZFBsdWdpblNlbGVjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChub2RlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCQlTdHJpbmcgZ3VpZCA9IGdldEd1aWRGcm9tSHJlZihub2RlLmdldEF0dHJpYnV0ZShBVFRSX2hyZWYpKTsKLQkJCQlzcGVjLnBsdWdpbklkcy5hZGQoZ3VpZCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBnZXQgcGFja2FnZXMKLQkJbm9kZXMgPSBjb25maWdOb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtZXRob2RQYWNrYWdlU2VsZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5vZGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZEZyb21IcmVmKG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfaHJlZikpOwotCQkJCXNwZWMucGFja2FnZUlkcy5hZGQoZ3VpZCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBnZXQgdmlld3MKLQkJbm9kZXMgPSBjb25maWdOb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwcm9jZXNzVmlld3MiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobm9kZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIGd1aWQgPSBnZXRHdWlkRnJvbUhyZWYobm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9ocmVmKSk7Ci0JCQkJc3BlYy52aWV3SWRzLmFkZChndWlkKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzcGVjOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIGd1aWQvdXJpIHBhaXIgdG8gZ3VpZFRvVXJpTWFwLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRvR3VpZFRvVXJpTWFwKFN0cmluZyBndWlkLCBTdHJpbmcgdXJpKSB7Ci0JCWlmIChndWlkVG9VcmlNYXAgPT0gbnVsbCkgewotCQkJZ3VpZFRvVXJpTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlndWlkVG9VcmlNYXAucHV0KGd1aWQsIHVyaSk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdXJpIGZyb20gZ3VpZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVyaUZyb21HdWlkVG9VcmlNYXAoU3RyaW5nIGd1aWQpIHsKLQkJcmV0dXJuIGd1aWRUb1VyaU1hcCA9PSBudWxsID8gbnVsbCA6IChTdHJpbmcpIGd1aWRUb1VyaU1hcC5nZXQoZ3VpZCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIENvbmZpZ0RvY1Zpc2l0b3IgewotCQlwdWJsaWMgdm9pZCB2aXNpdChGaWxlIGZpbGUsIEVsZW1lbnQgbm9kZSkgewkJCQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFZpc2l0IGNvbmZpZ3VyYXRpb24gZmlsZXMgZ2l2ZW4gYnkgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBmb2xkZXIgY29uZmlnRGlyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB2aXNpdENvbmZpZ0ZpbGVzKEZpbGUgY29uZmlnRGlyLCBDb25maWdEb2NWaXNpdG9yIHZpc2l0b3IpIHsJCi0JCUZpbGVGaWx0ZXIgZmlsdGVyID0gbmV3IEZpbGVGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkgewotCQkJCXJldHVybiAhcGF0aG5hbWUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImN2cyIpICYmIAkJLy8kTk9OLU5MUy0xJAotCQkJCQkJcGF0aG5hbWUuaXNEaXJlY3RvcnkoKSB8fCBwYXRobmFtZS5nZXROYW1lKCkuZW5kc1dpdGgoTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTik7Ci0JCQl9CQkJCi0JCX07CQkKLQkJRmlsZVtdIGZpbGVzID0gY29uZmlnRGlyLmxpc3RGaWxlcyhmaWx0ZXIpOwotCQlpZiAoZmlsZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGk9MDsgaTxmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBmaWxlID0gZmlsZXNbaV07Ci0JCQl0cnkgewotCQkJCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpCi0JCQkJCQkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQkJRG9jdW1lbnQgZG9jID0gYnVpbGRlci5wYXJzZShmaWxlKTsKLQkJCQlFbGVtZW50IHJvb3QgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQkJdmlzaXRvci52aXNpdChmaWxlLCByb290KTsJCQkJCi0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhIG1hcCBmcm9tIHBsdWlnbiBndWlkcyB0byByZXNvdXJjZSBtYW5hZ2VyIGd1aWRzLgotCSAqLwotCXB1YmxpYyBNYXAgYnVpbGRQbHVnaW5HdWlkVG9SZXNNZ3JHdWlkTWFwKExpc3QgcGx1Z2luR3VpZHMpIHsKLQkJaWYgKHBsdWdpbkd1aWRzID09IG51bGwgfHwgcGx1Z2luR3VpZHMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCU5vZGVMaXN0IHN1Yk1ncnMgPSBnZXRSZXNvdXJjZVN1Yk1hbmFnZXJzKCk7Ci0JCWlmIChzdWJNZ3JzID09IG51bGwgfHwgc3ViTWdycy5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQkJCQkKLQkJSGFzaE1hcCBwbHVnaW5HdWlkVG9SZXNNZ3JHdWlkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHBsdWdpbkd1aWRzLnNpemUoKTsgaSsrKSB7CQkJCi0JCQlTdHJpbmcgcGx1Z2luR3VpZCA9IChTdHJpbmcpIHBsdWdpbkd1aWRzLmdldChpKTsKLQkJCXBsdWdpbkd1aWRUb1Jlc01nckd1aWRNYXAucHV0KHBsdWdpbkd1aWQsIG51bGwpOwotCQl9Ci0JCWJvb2xlYW4gaXNFbXB0eSA9IHRydWU7Ci0JCWZvciAoaW50IGk9MDsgaTxzdWJNZ3JzLmdldExlbmd0aCgpOyBpKyspIHsJCQkKLQkJCUVsZW1lbnQgbWdyID0gKEVsZW1lbnQpIHN1Yk1ncnMuaXRlbShpKTsKLQkJCVN0cmluZyAgaHJlZiA9IG1nci5nZXRBdHRyaWJ1dGUoQVRUUl9ocmVmKTsKLQkJCVN0cmluZyBwbHVnaW5HdWlkID0gZ2V0U3ViTWFuYWdlckJhc2VHdWlkKGhyZWYpOwotCQkJaWYgKHBsdWdpbkd1aWRUb1Jlc01nckd1aWRNYXAuY29udGFpbnNLZXkocGx1Z2luR3VpZCkpIHsKLQkJCQlwbHVnaW5HdWlkVG9SZXNNZ3JHdWlkTWFwLnB1dChwbHVnaW5HdWlkLCBnZXRHdWlkRnJvbUhyZWYoaHJlZikpOwotCQkJCWlzRW1wdHkgPSBmYWxzZTsKLQkJCX0KLQkJfQkJCi0JCXJldHVybiBpc0VtcHR5ID8gIG51bGwgOiBwbHVnaW5HdWlkVG9SZXNNZ3JHdWlkTWFwOwotCX0KLQkKLQkvKioKLQkgKiBTYXZlIGV4dHJhIGluZm8gKGFsbCBwbHVnaW4gZ3VpZHMgYW5kIG5hbWVzKSBpbiBsaWJUYWcncyBNZXRob2RFbGVtZW50UHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9yZUV4dHJhSW5mbyhMaXN0PE1ldGhvZFBsdWdpbj4gcGx1Z2lucykgewotCQlpZiAocGx1Z2lucyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0JCQotCi0JCUVsZW1lbnQgdmVyc2lvbk5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFRBR19tZXRob2RFbGVtZW50UHJvcGVydHkpOwotCQl2ZXJzaW9uTm9kZS5zZXRBdHRyaWJ1dGUoQVRUUl92YWx1ZSwgIjAiKTsJLy8kTk9OLU5MUy0xJCAKLQkJbGliVGFnLmFwcGVuZENoaWxkKHZlcnNpb25Ob2RlKTsJCQotCQkKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RQbHVnaW4+IGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1ZyA9IGl0Lm5leHQoKTsKLQkJCQotCQkJRWxlbWVudCBndWlkTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoVEFHX21ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7CQotCQkJZ3VpZE5vZGUuc2V0QXR0cmlidXRlKEFUVFJfdmFsdWUsIHBsdWcuZ2V0R3VpZCgpKTsKLQkJCUVsZW1lbnQgbmFtZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFRBR19tZXRob2RFbGVtZW50UHJvcGVydHkpOwkKLQkJCW5hbWVOb2RlLnNldEF0dHJpYnV0ZShBVFRSX3ZhbHVlLCBwbHVnLmdldE5hbWUoKSk7Ci0JCQkKLQkJCWxpYlRhZy5hcHBlbmRDaGlsZChndWlkTm9kZSk7Ci0JCQlsaWJUYWcuYXBwZW5kQ2hpbGQobmFtZU5vZGUpOwotCQl9Ci0JCQotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIHJlY2FsbEV4dHJhSW5mbygpIHsKLQkJdHJ5IHsKLQkJCU5vZGVMaXN0IG5vZGVzID0gZ2V0TWV0aG9kRWxlbWVudFByb3BlcnRpZXMoKTsKLQkJCWlmIChub2RlcyA9PSBudWxsIHx8IG5vZGVzLmdldExlbmd0aCgpID09IDApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlFbGVtZW50IHZlcnNpb25Ob2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oMCk7Ci0JCQlTdHJpbmcgdmVyc2lvblN0ciA9IHZlcnNpb25Ob2RlLmdldEF0dHJpYnV0ZShBVFRSX3ZhbHVlKTsKLQkJCQotCQkJaWYgKHZlcnNpb25TdHIuZXF1YWxzKCIwIikpIHsgLy8kTk9OLU5MUy0xJCAKLQkJCQlndWlkVG9QbHVnTmFtZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7KSB7Ci0JCQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJCQlTdHJpbmcgZ3VpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfdmFsdWUpOwotCQkJCQlub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSArIDEpOwotCQkJCQlTdHJpbmcgbmFtZSA9IG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfdmFsdWUpOwotCQkJCQlndWlkVG9QbHVnTmFtZU1hcC5wdXQoZ3VpZCwgbmFtZSk7Ci0JCQkJCWlmIChmYWxzZSkgewkJCQkKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGd1aWQ6ICIgKyBndWlkKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gbmFtZTogIiArIG5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0JCQkJCQotCQkJCQlpICs9IDI7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCWd1aWRUb1BsdWdOYW1lTWFwID0gbnVsbDsKLQkJfQotCQkKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGd1aWQgdG8gcGx1Z2luIG1hcAotCSAqLwotCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEd1aWRUb1BsdWdOYW1lTWFwKCkgewotCQlpZiAoZ3VpZFRvUGx1Z05hbWVNYXAgPT0gbnVsbCkgewotCQkJcmVjYWxsRXh0cmFJbmZvKCk7Ci0JCX0JCQotCQlyZXR1cm4gZ3VpZFRvUGx1Z05hbWVNYXA7Ci0JfQotCQotICAgIC8qKgotICAgICAqIFJldHVybnMgbWV0aG9kRWxlbWVudFByb3BlcnR5IG5vZGUgbGlzdAotICAgICAqLwotCXByaXZhdGUgTm9kZUxpc3QgZ2V0TWV0aG9kRWxlbWVudFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBsaWJUYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoVEFHX21ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9QbHVnaW5FeHBvcnREYXRhLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL1BsdWdpbkV4cG9ydERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI1ODIzMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL1BsdWdpbkV4cG9ydERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5TG9jYXRpb25EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLQotLyoqCi0gKiBFbmNhcHN1bGF0ZXMgdGhlIGlucHV0IGRhdGEgcmVxdWlyZWQgdG8gZXhwb3J0IGEgbWV0aG9kIHBsdWctaW4uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkV4cG9ydERhdGEgewotCi0JcHVibGljIExpc3Qgc2VsZWN0ZWRQbHVnaW5zID0gbnVsbDsKLQotCXB1YmxpYyBMaWJyYXJ5TG9jYXRpb25EYXRhIGxsRGF0YSA9IG51bGw7Ci0KLQlwdWJsaWMgSGFzaHRhYmxlIGFzc29jaWF0ZWRDb25maWdNYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkvLyBkb24ndCBuZWVkIGl0IGFmdGVyIHRoZSBzZXJ2aWNlIGNvZGUgY2hhbmdlcwotCXB1YmxpYyBMaXN0IGFzc29jaWF0ZWRDb25maWdzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUGx1Z2luRXhwb3J0RGF0YSgpIHsKLQkJbGxEYXRhID0gbmV3IExpYnJhcnlMb2NhdGlvbkRhdGEoKTsKLQkJbGxEYXRhLmxvYWRGcm9tUHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiBzZWxlY3RlZCBwbHVnaW5zLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlbGVjdGVkUGx1Z2lucygpIHsKLQkJcmV0dXJuIHNlbGVjdGVkUGx1Z2luczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsaXN0IG9mIHNlbGVjdGVkIHBsdWdpbnMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRQbHVnaW5zKExpc3Qgc2VsZWN0ZWRQbHVnaW5zKSB7Ci0JCXRoaXMuc2VsZWN0ZWRQbHVnaW5zID0gc2VsZWN0ZWRQbHVnaW5zOwotCX07Ci0KLQkvKioKLQkgKiB2YWxpZGF0ZSBhdHRyaWJ1dGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkcyBhc3NvY2lhdGVkQ29uZmlnTWFwLgotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkQXNzb2NpYXRlZENvbmZpZ01hcCgpIHsKLQkJaWYgKGdldFNlbGVjdGVkUGx1Z2lucygpICE9IG51bGwpIHsKLQkJCWFzc29jaWF0ZWRDb25maWdNYXAuY2xlYXIoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFNlbGVjdGVkUGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RQbHVnaW4gZWxlbWVudCA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJCWFzc29jaWF0ZWRDb25maWdNYXAucHV0KGVsZW1lbnQsIExpYnJhcnlVdGlsCi0JCQkJCQkuZ2V0QXNzb2NpYXRlZENvbmZpZ3VyYXRpb25zKGVsZW1lbnQpKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9QbHVnaW5FeHBvcnRTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL1BsdWdpbkV4cG9ydFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgwZGU0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL1BsdWdpbkV4cG9ydFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Db3B5OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLS8qKgotICogRXhwb3J0cyBvbmUgb3IgbW9yZSBtZXRob2QgcGx1Zy1pbnMgdG8gYSB0YXJnZXQgZGlyZWN0b3J5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyMTUzCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5FeHBvcnRTZXJ2aWNlIGV4dGVuZHMgQmFzZUV4cG9ydFNlcnZpY2UgewotCi0JUGx1Z2luRXhwb3J0RGF0YSBkYXRhOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUGx1Z2luRXhwb3J0U2VydmljZShQbHVnaW5FeHBvcnREYXRhIGRhdGEpIHsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBSdW4gdG8gZXhwb3J0IHBsdWdpbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCW1vbml0b3Iuc2V0VGFza05hbWUoRXhwb3J0UmVzb3VyY2VzLlBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMCk7IAotCi0JCUxpc3QgcGx1Z2lucyA9IGRhdGEuc2VsZWN0ZWRQbHVnaW5zOwotCQlpZiAocGx1Z2lucyA9PSBudWxsIHx8IHBsdWdpbnMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCW1vbml0b3Iuc2V0VGFza05hbWUoRXhwb3J0UmVzb3VyY2VzLlBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMSk7IAotCi0JCS8vIENyZWF0ZSB0aGUgbGlicmFyeSBmb2xkZXIgaW4gdGhlIHRhcmdldCBkaXJlY3RvcnkuCi0JCVN0cmluZyBleHBvcnRMaWJQYXRoID0gKG5ldyBGaWxlKGRhdGEubGxEYXRhLmdldFBhcmVudEZvbGRlcigpKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCUZpbGUgZXhwb3J0TGliRm9sZGVyID0gbmV3IEZpbGUoZXhwb3J0TGliUGF0aCk7Ci0JCWlmICghZXhwb3J0TGliRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQlleHBvcnRMaWJGb2xkZXIubWtkaXIoKTsKLQkJfQotCi0JCW1vbml0b3Iuc2V0VGFza05hbWUoRXhwb3J0UmVzb3VyY2VzLlBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMik7IAotCi0JCU1ldGhvZExpYnJhcnkgY3VyckxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJU3RyaW5nIGN1cnJMaWJQYXRoID0gY3VyckxpYi5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJRmlsZSBjdXJyTGliRmlsZSA9IG5ldyBGaWxlKGN1cnJMaWJQYXRoKTsKLQkJCi0JCS8vIEl0ZXJhdGUgdGhlIHNlbGVjdGVkIHBsdWctaW5zIGFuZCBjb3B5IHRoZWlyIGFzc29jaWF0ZWQgbW9kZWwgZmlsZXMuCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQlpZiAocGx1Z2luID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gU3RlcCAxOiBDcmVhdGUgdGhlIHBsdWctaW4gZm9sZGVyLgotCQkJVVJJIHVyaSA9IHBsdWdpbi5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKLQkJCVN0cmluZyBwYXRoID0gdXJpLnRvRmlsZVN0cmluZygpOwotCi0JCQlGaWxlIHBsdWdpbkZvbGRlciA9IChuZXcgRmlsZShwYXRoKSkuZ2V0UGFyZW50RmlsZSgpOwotCi0JCQlTdHJpbmcgcGx1Z2luUGF0aCA9IHBsdWdpbi5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvcjsKLQkJCUZpbGUgZXhwb3J0UGx1Z2luRm9sZGVyID0gbmV3IEZpbGUoZXhwb3J0TGliRm9sZGVyLCBwbHVnaW5QYXRoKTsKLQotCQkJLy8gU3RlcCAyOiBDb3B5IHRoZSBwbHVnLWluIGZpbGVzLgotCQkJY29weURpcihwbHVnaW5Gb2xkZXIsIGV4cG9ydFBsdWdpbkZvbGRlcik7CQkJCi0JCX0KLQotCQltb25pdG9yLnNldFRhc2tOYW1lKEV4cG9ydFJlc291cmNlcy5QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzMpOyAKLQotCQkvLyBHZXQgdGhlIHNlbGVjdGVkIHBsdWctaW4gYW5kIGNvbmZpZ3VyYXRpb24gaWRzIHNvIHdlIGNhbiByZW1vdmUgdGhlCi0JCS8vIHVubmVlZGVkIHN0dWZmLgotCQlnZXRTZWxlY3RlZElkcyhkYXRhLnNlbGVjdGVkUGx1Z2lucywgZGF0YS5hc3NvY2lhdGVkQ29uZmlnTWFwKTsKLQotCQkvLyBTdGVwIDM6IExvYWQgdGhlIGxpYnJhcnkueG1pIGFuZCB0aGUgcmVzbWdyLnhtaSwgcmVtb3ZlIHRoZSB1bm5lZWRlZAotCQkvLyBzdHVmZi4KLQkJRmlsZSBsaWJGb2xkZXIgPSBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKSk7Ci0JCUxpYnJhcnlEb2N1bWVudCBkb2N1bWVudCA9IHByb2Nlc3NMaWJyYXJ5RmlsZShjdXJyTGliRmlsZSwgbmV3IEZpbGUoCi0JCQkJZXhwb3J0TGliRm9sZGVyLCBleHBvcnRGaWxlKSk7Ci0KLQkJaWYgKCBkb2N1bWVudCAhPSBudWxsICkgewotCQkJLy8gY29weSB0aGUgY29uaWZ1cmF0aW9uIGZpbGVzCi0JCQkvLyAxNDIzNzkgLSB1cGRhdGUgcGx1Z2luIGltcG9ydGluZyBhbmQgZXhwb3J0aW5nIHRvIG1hdGNoIHdpdGggdGhlIG5ldyBmaWxlIGZvcm1hdAotCQkJY29weUNvbmZpZ3VyYXRpb25GaWxlcyhkb2N1bWVudCwgbGliRm9sZGVyLCBleHBvcnRMaWJGb2xkZXIpOwotCQl9Ci0JCQotCQltb25pdG9yLnNldFRhc2tOYW1lKEV4cG9ydFJlc291cmNlcy5QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzQpOyAKLQl9Ci0KLQkKLQlwcml2YXRlIHZvaWQgY29weUNvbmZpZ3VyYXRpb25GaWxlcyhMaWJyYXJ5RG9jdW1lbnQgZG9jdW1lbnQsIEZpbGUgbGliRm9sZGVyLCBGaWxlIGV4cG9ydExpYkZvbGRlcikgewotCQkvLyAvLyAxNDIzNzkgLSB1cGRhdGUgcGx1Z2luIGltcG9ydGluZyBhbmQgZXhwb3J0aW5nIHRvIG1hdGNoIHdpdGggdGhlIG5ldyBmaWxlIGZvcm1hdAotCQkvLyBHZXQgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gaWRzLgotCQlmb3IgKEl0ZXJhdG9yIGl0YyA9IGRhdGEuYXNzb2NpYXRlZENvbmZpZ01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGMuaGFzTmV4dCgpOykgewotCQkJTGlzdCBjb25maWdzID0gKExpc3QpIGl0Yy5uZXh0KCk7Ci0JCQlpZiAoY29uZmlncyA9PSBudWxsIHx8IGNvbmZpZ3Muc2l6ZSgpID09IDApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNvbmZpZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0Lm5leHQoKTsKLQkJCQlTdHJpbmcgZ3VpZCA9IGNvbmZpZy5nZXRHdWlkKCk7Ci0JCQkJU3RyaW5nIHVyaSA9IGRvY3VtZW50LmdldFJlc291cmNlVXJpKGd1aWQpOwotCQkJCUZpbGUgc3JjID0gbnVsbDsKLQkJCQlpZiAodXJpID09IG51bGwpIHsKLQkJCQkJVVJJIHJlc1VyaSA9IGNvbmZpZy5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKLQkJCQkJdXJpID0gTXVsdGlGaWxlU2F2ZVV0aWwuTUVUSE9EX0NPTkZJR1VSQVRJT05fRk9MREVSX05BTUUgKyBGaWxlLnNlcGFyYXRvciArIHJlc1VyaS5sYXN0U2VnbWVudCgpOwotCQkJCQl1cmkgPSBkb2N1bWVudC5kZWNvZGVVcmkodXJpKTsKLQkJCQkJc3JjID0gbmV3IEZpbGUocmVzVXJpLnRvRmlsZVN0cmluZygpKTsKLQkJCQl9CQkJCQotCQkJCWlmICggdXJpICE9IG51bGwgKSB7Ci0JCQkJCS8vRmlsZSBzcmMgPSBuZXcgRmlsZShsaWJGb2xkZXIsIHVyaSk7Ci0JCQkJCWlmIChzcmMgPT0gbnVsbCkgewotCQkJCQkJc3JjID0gbmV3IEZpbGUobGliRm9sZGVyLCB1cmkpOwotCQkJCQl9Ci0JCQkJCUZpbGUgdGFyZ2V0ID0gIG5ldyBGaWxlKGV4cG9ydExpYkZvbGRlciwgdXJpKTsKLQkJCQkJRmlsZVV0aWwuY29weUZpbGUoc3JjLCB0YXJnZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvcGllcyBkaXJlY3RvcmllcyBmcm9tICJmcm9tRGlyIiB0byAidG9EaXIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RGlyKEZpbGUgZnJvbURpciwgRmlsZSB0b0RpcikgewotCQlDb3B5IGNwID0gbmV3IENvcHkoKTsKLQkJY3Auc2V0T3ZlcndyaXRlKHRydWUpOwotCQlGaWxlU2V0IHNldCA9IG5ldyBGaWxlU2V0KCk7Ci0JCXNldC5zZXRFeGNsdWRlcyhDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZS5leGNsdWRlcyk7Ci0JCXNldC5zZXREaXIoZnJvbURpcik7Ci0JCWNwLmFkZEZpbGVzZXQoc2V0KTsKLQkJY3Auc2V0VG9kaXIodG9EaXIpOwotCQljcC5zZXRQcm9qZWN0KG5ldyBQcm9qZWN0KCkpOwotCQljcC5zZXRQcmVzZXJ2ZUxhc3RNb2RpZmllZCh0cnVlKTsKLQkJY3AuZXhlY3V0ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRTZWxlY3RlZElkcyhMaXN0IHBsdWdpbnMsIE1hcCBjb25maWdzTWFwKSB7Ci0JCXNlbGVjdGVkSWRzLmNsZWFyKCk7Ci0JCXNlbGVjdGVkUGx1Z2luTmFtZXMuY2xlYXIoKTsKLQotCQkvLyBHZXQgdGhlIHBsdWctaW4gaWRzIGFuZCBuYW1lcy4KLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCXBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBndWlkID0gcGx1Z2luLmdldEd1aWQoKTsKLQkJCXNlbGVjdGVkUGx1Z2luTmFtZXMuYWRkKHBsdWdpbi5nZXROYW1lKCkpOwotCQkJaWYgKCFzZWxlY3RlZElkcy5jb250YWlucyhndWlkKSkgewotCQkJCXNlbGVjdGVkSWRzLmFkZChndWlkKTsKLQkJCX0KLQkJfQotCi0JCS8vIFNhdmUgdGhlIGxpYnJhcnkgZ3VpZCBzbyB0aGF0IHRoZSBlbnRyeSBpbiByZXNnci54bWkgd2lsbCBiZSBrZXB0LgotCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCU1ldGhvZExpYnJhcnkgbGliID0gKE1ldGhvZExpYnJhcnkpIHBsdWdpbi5lQ29udGFpbmVyKCk7Ci0JCQlpZiAobGliICE9IG51bGwpIHsKLQkJCQlzZWxlY3RlZElkcy5hZGQobGliLmdldEd1aWQoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBHZXQgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gaWRzLgotCQlmb3IgKEl0ZXJhdG9yIGl0YyA9IGNvbmZpZ3NNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRjLmhhc05leHQoKTspIHsKLQkJCUxpc3QgY29uZmlncyA9IChMaXN0KSBpdGMubmV4dCgpOwotCQkJaWYgKGNvbmZpZ3MgPT0gbnVsbCB8fCBjb25maWdzLnNpemUoKSA9PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjb25maWdzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJU3RyaW5nIGd1aWQgPSBjb25maWcuZ2V0R3VpZCgpOwotCQkJCWlmIChzZWxlY3RlZElkcy5jb250YWlucyhndWlkKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQkvLyBBZGQgdGhlIGNvbmZpZ3VyYXRpb24uCi0JCQkJc2VsZWN0ZWRJZHMuYWRkKGd1aWQpOwotCi0JCQkJLy8gRm9yIGVhY2ggY29uZmlndXJhdGlvbiwgc2F2ZSB0aGUgbWV0aG9kIHBsdWctaW4gYW5kIHBhY2thZ2UKLQkJCQkvLyBpZHMgc28gdGhhdCB0aGVpciBlbnRyaWVzIGluIHRoZSByZXNvdXJjZSBmaWxlIGNhbiBiZSBrZXB0LgotCQkJCUxpc3QgcmVmcyA9IGNvbmZpZy5lQ3Jvc3NSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdHIgPSByZWZzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvID0gaXRyLm5leHQoKTsKLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgbyBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJCWd1aWQgPSAoKE1ldGhvZEVsZW1lbnQpIG8pLmdldEd1aWQoKTsKLQkJCQkJCWlmICghc2VsZWN0ZWRJZHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQkJCQlzZWxlY3RlZElkcy5hZGQoZ3VpZCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJVbmV4cGVjdGVkIGVsZW1lbnQgdHlwZSAnIiArICgoTWV0aG9kRWxlbWVudCkgbykuZ2V0VHlwZSgpLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJKyAiJyBpbiBjb25maWd1cmF0aW9uICciICsgY29uZmlnLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDRhYWE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgYW5kIGltcGxlbWVudGF0aW9uIGZvciB0aGUgbWV0aG9kIHBsdWctaW4gYW5kIGNvbmZpZ3VyYXRpb24gZXhwb3J0IHNlcnZpY2VzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9EZXN0aW5hdGlvbkNvbW1vblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9EZXN0aW5hdGlvbkNvbW1vblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkzOTU1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRGVzdGluYXRpb25Db21tb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5TG9jYXRpb25EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBmb3IgYW4KLSAqIGV4cG9ydCBvciBpbXBvcnQgb3BlcmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzdGluYXRpb25Db21tb25QYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBDb21ibyBleHBvcnRQYXRoQ29tYm87Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCXByb3RlY3RlZCBMaWJyYXJ5TG9jYXRpb25EYXRhIGxsRGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERlc3RpbmF0aW9uQ29tbW9uUGFnZShTdHJpbmcgcGFnZU5hbWUsIExpYnJhcnlMb2NhdGlvbkRhdGEgbGxEYXRhKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoRXhwb3J0UmVzb3VyY2VzLkRlc3RpbmF0aW9uQ29tbW9uUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFJlc291cmNlcy5EZXN0aW5hdGlvbkNvbW1vblBhZ2VfZGVzYyk7Ci0JCXRoaXMubGxEYXRhID0gbGxEYXRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIDMpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgRXhwb3J0UmVzb3VyY2VzLkRlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9kaXIpOwotCQkKLQkJZXhwb3J0UGF0aENvbWJvID0gY3JlYXRlQ29tYm9ib3goY29tcG9zaXRlLCAxKTsKLQkJCi0JCWJyb3dzZUJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsCi0JCQkJRXhwb3J0UmVzb3VyY2VzLkRlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9icm93c2UpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCQkKLQotCQlpbml0Q29udHJvbHMoKTsKLQkJCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQljcmVhdGVBZGRpdGlvbmFsQ29udHJvbHMoY29tcG9zaXRlKTsKLQotCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlleHBvcnRQYXRoQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgZXZlbnQgaGFuZGxlcnMgdG8gdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsJCi0JCWV4cG9ydFBhdGhDb21iby5hZGRMaXN0ZW5lcihTV1QuRm9jdXNJbiwgdGhpcyk7Ci0JCWV4cG9ydFBhdGhDb21iby5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQkJZXhwb3J0UGF0aENvbWJvLmFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgdGhpcyk7Ci0JCWV4cG9ydFBhdGhDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJCi0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlvcGVuRGlyZWN0b3J5RGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwkJCi0JfQotCQotCS8qKgotCSAqIEFkZHMgYWRkaXRpb25hbCBjb250cm9scyB0byB0aGlzIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBZGRpdGlvbmFsQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlI3NldFZpc2libGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSkgewotCQkJRGlzcGxheSBkaXNwbGF5ID0gY29tcG9zaXRlLmdldERpc3BsYXkoKTsKLQkJCWlmICghKGRpc3BsYXkgPT0gbnVsbCB8fCBkaXNwbGF5LmlzRGlzcG9zZWQoKSkpIHsKLQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWV4cG9ydFBhdGhDb21iby5zZXRGb2N1cygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCVdpemFyZCB3aXphcmQgPSAoV2l6YXJkKSBnZXRXaXphcmQoKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQl3aXphcmQuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVUb0RhdGFNb2RlbCgpIHsKLQkJU3RyaW5nIGxpYk5hbWUgPSBleHBvcnRQYXRoQ29tYm8uZ2V0VGV4dCgpOwotCQlpZiAobGliTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCWlmICghbGliTmFtZS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLQkJCQlsaWJOYW1lID0gbGliTmFtZS5zdWJzdHJpbmcoCi0JCQkJCQlsaWJOYW1lLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKSArIDEsIGxpYk5hbWUKLQkJCQkJCQkJLmxlbmd0aCgpKTsKLQkJCX0gZWxzZQotCQkJCWxpYk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWxsRGF0YS5zZXRMaWJOYW1lKGxpYk5hbWUpOwotCQlsbERhdGEuc2V0UGFyZW50Rm9sZGVyKGV4cG9ydFBhdGhDb21iby5nZXRUZXh0KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuRGlyZWN0b3J5RGlhbG9nKCkgewotCQl0cnkgewotCQkJRGlyZWN0b3J5RGlhbG9nIGRkID0gbmV3IERpcmVjdG9yeURpYWxvZyhjb21wb3NpdGUuZ2V0U2hlbGwoKSwKLQkJCQkJU1dULk5PTkUpOwotCQkJZGQuc2V0RmlsdGVyUGF0aChleHBvcnRQYXRoQ29tYm8uZ2V0VGV4dCgpKTsKLQotCQkJU3RyaW5nIGRlc3RpbmF0aW9uID0gZGQub3BlbigpOwotCQkJaWYgKGRlc3RpbmF0aW9uICE9IG51bGwpIHsKLQkJCQlleHBvcnRQYXRoQ29tYm8uc2V0VGV4dChkZXN0aW5hdGlvbik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB1c2UgdGhlIG9wZW5lZCBkaXJzIHRvIGluaXQgY29tYm8gbGlzdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb21ib0l0ZW1zKCkgewotCQlyZXR1cm47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MmZkZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ0NoZWNraW5nUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JQ29uZmlndXJhdGlvbkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlLkNvbmZpZ3VyYXRpb25DbG9zdXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBkaXNwbGF5cyB0aGUgcmVzdWx0IG9mIGEgY29uZmlndXJhdGlvbiBpbnRlZ3JpdHkgY2hlY2suCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIFRleHRWaWV3ZXIgdGV4dFZpZXdlcjsKLQotCXByaXZhdGUgVGV4dFByZXNlbnRhdGlvbiBzdHlsZTsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YTsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25DbG9zdXJlIGNsb3N1cmUgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlKENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoRXhwb3J0UmVzb3VyY2VzLmNoZWNrQ29uZmlnUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFJlc291cmNlcy5jaGVja0NvbmZpZ1BhZ2VfZGVzYyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vZXhwX2xpYl9jb25mX3dpemJhbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCXRleHRWaWV3ZXIgPSBjcmVhdGVUZXh0Vmlld2VyKGNvbnRhaW5lciwgMzYwLCAxNjAsIDEpOwotCQlEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQl0ZXh0Vmlld2VyLnNldERvY3VtZW50KGRvYyk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3BsYXlTdW1tYXJ5KCkgewotCQlzdHlsZSA9IG5ldyBUZXh0UHJlc2VudGF0aW9uKCk7Ci0JCURvY3VtZW50IGRvYyA9IGdldFN1bW1hcnlUZXh0KCk7Ci0JCXRleHRWaWV3ZXIuc2V0RG9jdW1lbnQoZG9jKTsKLQkJdGV4dFZpZXdlci5jaGFuZ2VUZXh0UHJlc2VudGF0aW9uKHN0eWxlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWRpc3BsYXlTdW1tYXJ5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGRvY3VtZW50IG9mIHN1bW1hcnkgdGV4dC4KLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0U3VtbWFyeVRleHQoKSB7Ci0JCWZpbmFsIFN0cmluZ0J1ZmZlciB0ZXh0QnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWlmIChkYXRhLnNlbGVjdGVkQ29uZmlncy5zaXplKCkgPT0gMCkgewotCQkJdGV4dEJ1Zi5hcHBlbmQoRXhwb3J0UmVzb3VyY2VzLkV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzIpOwotCQl9IGVsc2UgewotCQkJZmluYWwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgZGF0YS5zZWxlY3RlZENvbmZpZ3MKLQkJCQkJLmdldCgwKTsKLQkJCWlmICgoY2xvc3VyZSA9PSBudWxsKSB8fCAoY2xvc3VyZS5nZXRDb25maWd1cmF0aW9uKCkgIT0gY29uZmlnKSkgewotCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkvLyBDaGVjayB0aGUgY29uZmlndXJhdGlvbiBjbG9zdXJlLgotCQkJCQkJY2xvc3VyZSA9IG5ldyBDb25maWd1cmF0aW9uQ2xvc3VyZShudWxsLCBjb25maWcpOwotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsCi0JCQkJCQlFeHBvcnRSZXNvdXJjZXMuRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX2NoZWNraW5nKTsKLQkJCX0KLQkJfQotCi0JCUxpc3QgZXJyb3JzID0gY2xvc3VyZS5nZXRBbGxFcnJvcnMoKTsKLQkJaWYgKGVycm9ycy5zaXplKCkgPT0gMCkgewotCQkJdGV4dEJ1Zi5hcHBlbmQoRXhwb3J0UmVzb3VyY2VzLkV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzMpOwotCQl9IGVsc2UgewotCQkJdGV4dEJ1Zi5hcHBlbmQoRXhwb3J0UmVzb3VyY2VzLmJpbmQoCi0JCQkJCUV4cG9ydFJlc291cmNlcy5FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV80LAotCQkJCQkobmV3IE9iamVjdFtdIHsgSW50ZWdlci50b1N0cmluZyhlcnJvcnMuc2l6ZSgpKSB9KSkpOwotCQl9Ci0KLQkJRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KHRleHRCdWYudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBkb2M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnQ2hvb3NlTW9kZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ0Nob29zZU1vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI2OGQ5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnQ2hvb3NlTW9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBkaXNwbGF5cyB0aGUgdHlwZXMgb2YgY29uZmlndXJhdGlvbiB0aGF0IGNhbiBiZSBleHBvcnRlZC4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydENvbmZpZ0Nob29zZU1vZGUgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IEV4cG9ydENvbmZpZ0Nob29zZU1vZGUuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIEJ1dHRvbiBvbmVDb25maWdCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBjb25maWdTcGVjQnV0dG9uOwotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0Q29uZmlnQ2hvb3NlTW9kZShDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEV4cG9ydFJlc291cmNlcy5zZWxlY3RFeHBvcnRUeXBlUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFJlc291cmNlcy5zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9leHBfbGliX2NvbmZfd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJb25lQ29uZmlnQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oY29udGFpbmVyLAotCQkJCUV4cG9ydFJlc291cmNlcy5zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdMYWJlbF90ZXh0LCAxLCB0cnVlKTsKLQotCQljb25maWdTcGVjQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oY29udGFpbmVyLAotCQkJCUV4cG9ydFJlc291cmNlcy5zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdTcGVjc0xhYmVsX3RleHQsIDEsCi0JCQkJZmFsc2UpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCW9uZUNvbmZpZ0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJY29uZmlnU3BlY0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlRGF0YVRvTW9kZWwoKSB7Ci0JCWRhdGEuZXhwb3J0T25lQ29uZmlnID0gb25lQ29uZmlnQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQlkYXRhLmV4cG9ydENvbmZpZ1NwZWNzID0gY29uZmlnU3BlY0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSA9PSBudWxsKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLm5vT3BlbkxpYnJhcnlXYXJuaW5nX21zZyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKCkgPT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXNhdmVEYXRhVG9Nb2RlbCgpOwotCQlpZiAoZGF0YS5leHBvcnRPbmVDb25maWcpIHsKLQkJCUV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UgcGFnZSA9ICgoRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLnNlbGVjdENvbmZpZ1BhZ2U7Ci0JCQlyZXR1cm4gcGFnZTsKLQkJfSBlbHNlIGlmIChkYXRhLmV4cG9ydENvbmZpZ1NwZWNzKSB7Ci0JCQlFeHBvcnRDb25maWdTZWxlY3RTcGVjc1BhZ2UgcGFnZSA9ICgoRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLnNlbGVjdFNwZWNzUGFnZTsKLQkJCXJldHVybiBwYWdlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmRjYzQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWdEZXN0aW5hdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydERhdGE7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgZm9yIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3Rvcnkgb2YgYW4KLSAqIGV4cG9ydCBvcGVyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRDb25maWdEZXN0aW5hdGlvblBhZ2UgZXh0ZW5kcyBEZXN0aW5hdGlvbkNvbW1vblBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gRXhwb3J0Q29uZmlnRGVzdGluYXRpb25QYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0Q29uZmlnRGVzdGluYXRpb25QYWdlKENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoUEFHRV9OQU1FLCBkYXRhLmxsRGF0YSk7Ci0JCXNldFRpdGxlKEV4cG9ydFJlc291cmNlcy5zZWxlY3REZXN0aW5hdGlvblBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRSZXNvdXJjZXMuc2VsZWN0RGVzdGluYXRpb25QYWdlX2Rlc2MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2V4cF9saWJfY29uZl93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCVN0cmluZ1tdIGV4cG9ydERpcnMgPSBFeHBvcnRVSVByZWZlcmVuY2VzLmdldEV4cG9ydENvbmZpZ0RpcnMoKTsKLQkJaWYgKGV4cG9ydERpcnMgIT0gbnVsbCAmJiBleHBvcnREaXJzLmxlbmd0aCA+IDApIHsKLQkJCWV4cG9ydFBhdGhDb21iby5zZXRJdGVtcyhleHBvcnREaXJzKTsKLQkJCWV4cG9ydFBhdGhDb21iby5zZXRUZXh0KGV4cG9ydERpcnNbMF0pOwotCQl9Ci0JCXN1cGVyLmluaXRDb250cm9scygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkIHdpemFyZCA9IChFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKTsKLQkJaWYgKGV4cG9ydFBhdGhDb21iby5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwCi0JCQkJJiYgIWV4cG9ydFBhdGhDb21iby5nZXRUZXh0KCkuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0JCQlzYXZlVG9EYXRhTW9kZWwoKTsKLQkJCXdpemFyZC5va1RvQ29tcGxldGUgPSB0cnVlOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJd2l6YXJkLm9rVG9Db21wbGV0ZSA9IGZhbHNlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFlZmFkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBtZXRob2QgY29uZmlndXJhdGlvbiB0bwotICogZXhwb3J0LgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgTGlzdGVuZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgVGFibGUgdGFibGU7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIGN0cmxfdGFibGVWaWV3ZXI7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9icmllZkRlc2M7Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlKENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoRXhwb3J0UmVzb3VyY2VzLnNlbGVjdENvbmZpZ1BhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRSZXNvdXJjZXMuc2VsZWN0Q29uZmlnUGFnZV9kZXNjKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9leHBfbGliX2NvbmZfd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLAotCQkJCUV4cG9ydFJlc291cmNlcy5zZWxlY3RDb25maWdQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0KTsKLQotCQljdHJsX3RhYmxlVmlld2VyID0gY3JlYXRlVGFibGVWaWV3ZXIoY29udGFpbmVyLCAzNjAsIDEyMCwgMSk7Ci0JCXRhYmxlID0gY3RybF90YWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25zKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gTGlicmFyeVVJSW1hZ2VzLklNR19NRVRIT0RfUExVR0lOOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQkJcmV0dXJuICgoTWV0aG9kQ29uZmlndXJhdGlvbikgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQljdHJsX3RhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCWN0cmxfdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJaWYgKGNvbmZpZ3MgIT0gbnVsbCkgewotCQkJY3RybF90YWJsZVZpZXdlci5zZXRJbnB1dChjb25maWdzKTsKLQkJfQotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgQXV0aG9yaW5nVUlUZXh0LkJSSUVGX0RFU0NSSVBUSU9OX1RFWFQpOwotCi0JCWN0cmxfYnJpZWZEZXNjID0gY3JlYXRlTXVsdGlMaW5lVGV4dChjb250YWluZXIsICIiLCAzNjAsIDgwLCAzKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChjb25maWdzICE9IG51bGwgJiYgY29uZmlncy5sZW5ndGggPiAwKSB7Ci0JCQl0YWJsZS5zZWxlY3QoMCk7Ci0JCQlzZXREaXNwbGF5QXR0cmlidXRlcygoTWV0aG9kQ29uZmlndXJhdGlvbikgY29uZmlnc1swXSk7Ci0JCX0KLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQljdHJsX3RhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIGNvbmZpZ3MgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJc2V0RGlzcGxheUF0dHJpYnV0ZXMoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNvbmZpZ3NbMF0pOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREaXNwbGF5QXR0cmlidXRlcyhNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQljdHJsX2JyaWVmRGVzYy5zZXRUZXh0KGNvbmZpZy5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVEYXRhVG9Nb2RlbCgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjdHJsX3RhYmxlVmlld2VyCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlPYmplY3RbXSBjb25maWdzID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgY29uZmlnc1swXTsKLQkJTGlzdCBhcnJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlhcnJMaXN0LmFkZChjb25maWcpOwotCQlkYXRhLnNlbGVjdGVkQ29uZmlncyA9IGFyckxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlzYXZlRGF0YVRvTW9kZWwoKTsKLQkJRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlIHBhZ2UgPSAoKEV4cG9ydENvbmZpZ3VyYXRpb25XaXphcmQpIGdldFdpemFyZCgpKS5jb25maWdDaGVja2luZ1BhZ2U7Ci0JCXBhZ2Uub25FbnRlclBhZ2UobnVsbCk7Ci0JCXJldHVybiBwYWdlOwotCX0KLQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY3RybF90YWJsZVZpZXdlcgotCQkJCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0gICAgCQlyZXR1cm4gZmFsc2U7Ci0gICAgCX0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmlzUGFnZUNvbXBsZXRlKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnU2VsZWN0U3BlY3NQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnU2VsZWN0U3BlY3NQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MmVlNTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBvbmUgb3IgbW9yZSBtZXRob2QKLSAqIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbnMgdG8gZXhwb3J0LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRDb25maWdTZWxlY3RTcGVjc1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzCi0JCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIElDaGVja1N0YXRlTGlzdGVuZXIsIExpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IEV4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgVGFibGUgdGFibGU7Ci0KLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgY3RybF9jaGtib3hUYWJsZVZpZXdlcjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmRGVzYzsKLQotCXByaXZhdGUgaW50IGNoZWNrZWRDb3VudCA9IDA7Ci0KLQlwcml2YXRlIExpc3QgY2hlY2tlZENvbmZpZ0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRDb25maWdTZWxlY3RTcGVjc1BhZ2UoQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShFeHBvcnRSZXNvdXJjZXMuc2VsZWN0Q29uZmlnU3BlY3NQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oRXhwb3J0UmVzb3VyY2VzLnNlbGVjdENvbmZpZ1NwZWNzUGFnZV9kZXNjKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9leHBfbGliX2NvbmZfd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLAotCQkJCUV4cG9ydFJlc291cmNlcy5zZWxlY3RDb25maWdTcGVjc1BhZ2VfY29uZmlnc0xhYmVsX3RleHQpOwotCi0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIgPSBjcmVhdGVDaGVja2JveFRhYmxlVmlld2VyKGNvbnRhaW5lciwgMSk7Ci0JCXRhYmxlID0gY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25zKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gTGlicmFyeVVJSW1hZ2VzLklNR19NRVRIT0RfUExVR0lOOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQkJcmV0dXJuICgoTWV0aG9kQ29uZmlndXJhdGlvbikgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJaWYgKGNvbmZpZ3MgIT0gbnVsbCkgewotCQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRJbnB1dChjb25maWdzKTsKLQkJfQotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgQXV0aG9yaW5nVUlUZXh0LkJSSUVGX0RFU0NSSVBUSU9OX1RFWFQpOwotCQljdHJsX2JyaWVmRGVzYyA9IGNyZWF0ZU11bHRpTGluZVRleHQoY29udGFpbmVyLCAiIiwgMzYwLCA4MCwgMyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoY29uZmlncyAhPSBudWxsICYmIGNvbmZpZ3MubGVuZ3RoID4gMCkgewotCQkJc2V0RGlzcGxheUF0dHJpYnV0ZXMoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNvbmZpZ3NbMF0pOwotCQl9Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyI2NoZWNrU3RhdGVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdCBvYmogPSBldmVudC5nZXRFbGVtZW50KCk7Ci0KLQkJaWYgKGV2ZW50LmdldENoZWNrZWQoKSkgewotCQkJY2hlY2tlZENvdW50Kys7Ci0JCQljaGVja2VkQ29uZmlnTGlzdC5hZGQob2JqKTsKLQkJfSBlbHNlIHsKLQkJCWNoZWNrZWRDb3VudC0tOwotCQkJY2hlY2tlZENvbmZpZ0xpc3QucmVtb3ZlKG9iaik7Ci0JCX0KLQotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIGNvbmZpZ3MgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJc2V0RGlzcGxheUF0dHJpYnV0ZXMoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNvbmZpZ3NbMF0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGlzcGxheUF0dHJpYnV0ZXMoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJY3RybF9icmllZkRlc2Muc2V0VGV4dChjb25maWcuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKGdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBjaGVja2VkQ291bnQgPiAwOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVEYXRhVG9Nb2RlbCgpIHsKLQkJZGF0YS5zZWxlY3RlZENvbmZpZ3MgPSBjaGVja2VkQ29uZmlnTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXNhdmVEYXRhVG9Nb2RlbCgpOwotCQlFeHBvcnRDb25maWdEZXN0aW5hdGlvblBhZ2UgcGFnZSA9ICgoRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLmRlc3RpbmF0aW9uUGFnZTsKLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ3VyYXRpb25XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JjMjZiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuU2F2ZUFsbEVkaXRvcnNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuRGlyZWN0b3J5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JSW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogVGhlIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gd2l6YXJkLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElJbXBvcnRXaXphcmQgewotCi0JcHJvdGVjdGVkIEV4cG9ydENvbmZpZ0Nob29zZU1vZGUgbW9kZVBhZ2U7Ci0KLQlwcm90ZWN0ZWQgRXhwb3J0Q29uZmlnU2VsZWN0U3BlY3NQYWdlIHNlbGVjdFNwZWNzUGFnZTsKLQotCXByb3RlY3RlZCBFeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlIHNlbGVjdENvbmZpZ1BhZ2U7Ci0KLQlwcm90ZWN0ZWQgRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlIGNvbmZpZ0NoZWNraW5nUGFnZTsKLQotCXByb3RlY3RlZCBFeHBvcnRDb25maWdEZXN0aW5hdGlvblBhZ2UgZGVzdGluYXRpb25QYWdlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gb2tUb0NvbXBsZXRlID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YSA9IG5ldyBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZCgpIHsKLQkJc2V0V2luZG93VGl0bGUoRXhwb3J0UmVzb3VyY2VzLmV4cG9ydENvbmZpZ1dpemFyZF90aXRsZSk7Ci0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlTYXZlQWxsRWRpdG9yc1BhZ2UuYWRkUGFnZUlmTmVlZGVkKHRoaXMsIGZhbHNlLCBudWxsLCBudWxsLAotCQkJCUV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZ1bGwvd2l6YmFuL0V4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1vZGVQYWdlID0gbmV3IEV4cG9ydENvbmZpZ0Nob29zZU1vZGUoZGF0YSk7Ci0JCWFkZFBhZ2UobW9kZVBhZ2UpOwotCi0JCXNlbGVjdFNwZWNzUGFnZSA9IG5ldyBFeHBvcnRDb25maWdTZWxlY3RTcGVjc1BhZ2UoZGF0YSk7Ci0JCWFkZFBhZ2Uoc2VsZWN0U3BlY3NQYWdlKTsKLQotCQlzZWxlY3RDb25maWdQYWdlID0gbmV3IEV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UoZGF0YSk7Ci0JCWFkZFBhZ2Uoc2VsZWN0Q29uZmlnUGFnZSk7Ci0KLQkJY29uZmlnQ2hlY2tpbmdQYWdlID0gbmV3IEV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZShkYXRhKTsKLQkJYWRkUGFnZShjb25maWdDaGVja2luZ1BhZ2UpOwotCi0JCWRlc3RpbmF0aW9uUGFnZSA9IG5ldyBFeHBvcnRDb25maWdEZXN0aW5hdGlvblBhZ2UoZGF0YSk7Ci0JCWFkZFBhZ2UoZGVzdGluYXRpb25QYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLQkJc3VwZXIuY3JlYXRlUGFnZUNvbnRyb2xzKHBhZ2VDb250YWluZXIpOwotCQlwYWdlQ29udGFpbmVyLmdldFNoZWxsKCkuc2V0SW1hZ2UoCi0JCQkJTGlicmFyeVVJSW1hZ2VzLklNR19NRVRIT0RfQ09ORklHVVJBVE9OKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2NhbkZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQkvLyBDYW5ub3QgY29tcGxldGUgdGhlIHdpemFyZCBpZiBpdCdzIG5vdCB0aGUgbGFzdCBwYWdlLgotCQlpZiAodGhpcy5nZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpICE9IGRlc3RpbmF0aW9uUGFnZSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG9rVG9Db21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCVN0cmluZyBleHBvcnRMaWJQYXRoID0gZGF0YS5sbERhdGEuZ2V0UGFyZW50Rm9sZGVyKCk7Ci0JCWlmICghY2hlY2tBbmRDcmVhdGVEaXIoZXhwb3J0TGliUGF0aCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5iZWdpblRhc2soCi0JCQkJCQkJRXhwb3J0UmVzb3VyY2VzLmV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlLAotCQkJCQkJCUlQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0KLQkJCQkJaWYgKGRhdGEudmFsaWRhdGUoKSkgewotCQkJCQkJaWYgKGRhdGEuZXhwb3J0Q29uZmlnU3BlY3MpIHsKLQkJCQkJCQkvLyBFeHBvcnQgY29uZmlndXJhdGlvbiBzcGVjcyBvbmx5LgotCQkJCQkJCShuZXcgQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZShkYXRhKSkKLQkJCQkJCQkJCS5ydW4obW9uaXRvcik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEV4cG9ydCBhIGNvbmZpZ3VyYXRpb24gY2xvc3VyZS4KLQkJCQkJCQkobmV3IENvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlKGRhdGEpKS5ydW4obW9uaXRvcik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCBmYWxzZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVGhyb3dhYmxlIHJlYWxFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUV4cG9ydFJlc291cmNlcy5leHBvcnRDb25maWdFcnJvckRpYWxvZ190aXRsZSwKLQkJCQkJcmVhbEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGRhdGEuZXJyb3JNc2cgIT0gbnVsbCAmJiBkYXRhLmVycm9yTXNnLmxlbmd0aCgpID4gMCkgewotCQkJRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUV4cG9ydFJlc291cmNlcy5leHBvcnRDb25maWdFcnJvckRpYWxvZ190aXRsZSwKLQkJCQkJZGF0YS5lcnJvck1zZyk7Ci0JCX0KLQotCQkvLyBTYXZlIHRoZSBleHBvcnQgcGF0aCB0byBwcmVmZXJlbmNlIHN0b3JlLgotCQlFeHBvcnRVSVByZWZlcmVuY2VzLmFkZEV4cG9ydENvbmZpZ0RpcihleHBvcnRMaWJQYXRoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tBbmRDcmVhdGVEaXIoU3RyaW5nIGRpcikgewotCQlyZXR1cm4gRGlyZWN0b3J5VmFsaWRhdG9yLmNoZWNrQW5kQ3JlYXRlRGlyKGRpciwKLQkJCQlFeHBvcnRSZXNvdXJjZXMuZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGUsCi0JCQkJRXhwb3J0UmVzb3VyY2VzLkV4cG9ydFBsdWdpbkVycm9yX21zZywgZmFsc2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydFBsdWdpblN1bW1hcnlQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkzZmMyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBkaXNwbGF5cyBhIHN1bW1hcnkgb2YgdGhlIHNlbGVjdGVkIG1ldGhvZCBwbHVnLWlucyB0aGF0Ci0gKiB3aWxsIGJlIGV4cG9ydGVkLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRQbHVnaW5TdW1tYXJ5UGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IEV4cG9ydFBsdWdpblN1bW1hcnlQYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBUZXh0Vmlld2VyIHRleHRWaWV3ZXI7Ci0KLQlwcml2YXRlIFRleHRQcmVzZW50YXRpb24gc3R5bGU7Ci0KLQlwcml2YXRlIFBsdWdpbkV4cG9ydERhdGEgZGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydFBsdWdpblN1bW1hcnlQYWdlKFBsdWdpbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShFeHBvcnRSZXNvdXJjZXMuZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRSZXNvdXJjZXMuZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfZGVzYyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vZXhwX21ldGhfcGx1Z2luX3dpemJhbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJdGV4dFZpZXdlciA9IGNyZWF0ZVRleHRWaWV3ZXIoY29udGFpbmVyLCAzNjAsIDE2MCwgMSk7Ci0JCURvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgiIik7IC8vJE5PTi1OTFMtMSQJCQotCQl0ZXh0Vmlld2VyLnNldERvY3VtZW50KGRvYyk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3BsYXlTdW1tYXJ5KCkgewotCQlzdHlsZSA9IG5ldyBUZXh0UHJlc2VudGF0aW9uKCk7Ci0JCURvY3VtZW50IGRvYyA9IGdldFN1bW1hcnlUZXh0KCk7Ci0JCXRleHRWaWV3ZXIuc2V0RG9jdW1lbnQoZG9jKTsKLQkJdGV4dFZpZXdlci5jaGFuZ2VUZXh0UHJlc2VudGF0aW9uKHN0eWxlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWRpc3BsYXlTdW1tYXJ5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGRvY3VtZW50IG9mIHRoZSBzdW1tYXJ5IHRleHQuCi0JICovCi0JcHVibGljIERvY3VtZW50IGdldFN1bW1hcnlUZXh0KCkgewotCQlTdHJpbmdCdWZmZXIgdGV4dEJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlpZiAoZGF0YS5zZWxlY3RlZFBsdWdpbnMgPT0gbnVsbCB8fCBkYXRhLnNlbGVjdGVkUGx1Z2lucy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbmV3IERvY3VtZW50KAotCQkJCQlFeHBvcnRSZXNvdXJjZXMuZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2Vfbm9QbHVnaW5fdGV4dCk7Ci0KLQkJaW50IHN0YXJ0ID0gMDsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5zZWxlY3RlZFBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBkYXRhLnNlbGVjdGVkUGx1Z2lucy5nZXQoaSk7Ci0JCQlzdGFydCA9IHRleHRCdWYubGVuZ3RoKCk7Ci0JCQlvZmZzZXQgPSBwbHVnaW4uZ2V0TmFtZSgpLmxlbmd0aCgpOwotCQkJc3R5bGUuYWRkU3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZShzdGFydCwgb2Zmc2V0LCBudWxsLCBudWxsLAotCQkJCQlTV1QuQk9MRCkpOwotCQkJdGV4dEJ1Zi5hcHBlbmQocGx1Z2luLmdldE5hbWUoKSkuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCXN0YXJ0ID0gdGV4dEJ1Zi5sZW5ndGgoKTsKLQkJCW9mZnNldCA9IEF1dGhvcmluZ1VJVGV4dC5BVVRIT1JTX1RFWFQubGVuZ3RoKCk7Ci0JCQlzdHlsZS5hZGRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCBvZmZzZXQsIG51bGwsIG51bGwsCi0JCQkJCVNXVC5CT0xEIHwgU1dULklUQUxJQykpOwotCQkJdGV4dEJ1ZgotCQkJCQkuYXBwZW5kKCJcdCIpLmFwcGVuZChBdXRob3JpbmdVSVRleHQuQVVUSE9SU19URVhUKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJdGV4dEJ1Zi5hcHBlbmQoIlx0XHQiKS5hcHBlbmQocGx1Z2luLmdldEF1dGhvcnMoKSkuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJc3RhcnQgPSB0ZXh0QnVmLmxlbmd0aCgpOwotCQkJb2Zmc2V0ID0gQXV0aG9yaW5nVUlUZXh0LlZFUlNJT05fVEVYVC5sZW5ndGgoKTsKLQkJCXN0eWxlLmFkZFN0eWxlUmFuZ2UobmV3IFN0eWxlUmFuZ2Uoc3RhcnQsIG9mZnNldCwgbnVsbCwgbnVsbCwKLQkJCQkJU1dULkJPTEQgfCBTV1QuSVRBTElDKSk7Ci0JCQl0ZXh0QnVmCi0JCQkJCS5hcHBlbmQoIlx0IikuYXBwZW5kKEF1dGhvcmluZ1VJVGV4dC5WRVJTSU9OX1RFWFQpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0ZXh0QnVmLmFwcGVuZCgiXHRcdCIpLmFwcGVuZChwbHVnaW4uZ2V0VmVyc2lvbigpKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQlzdGFydCA9IHRleHRCdWYubGVuZ3RoKCk7Ci0JCQlvZmZzZXQgPSBBdXRob3JpbmdVSVRleHQuQlJJRUZfREVTQ1JJUFRJT05fVEVYVC5sZW5ndGgoKTsKLQkJCXN0eWxlLmFkZFN0eWxlUmFuZ2UobmV3IFN0eWxlUmFuZ2Uoc3RhcnQsIG9mZnNldCwgbnVsbCwgbnVsbCwKLQkJCQkJU1dULkJPTEQgfCBTV1QuSVRBTElDKSk7Ci0JCQl0ZXh0QnVmCi0JCQkJCS5hcHBlbmQoIlx0IikuYXBwZW5kKEF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhUKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJdGV4dEJ1ZgotCQkJCQkuYXBwZW5kKCJcdFx0IikuYXBwZW5kKHBsdWdpbi5nZXRCcmllZkRlc2NyaXB0aW9uKCkpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCXN0YXJ0ID0gdGV4dEJ1Zi5sZW5ndGgoKTsKLQkJCW9mZnNldCA9IEV4cG9ydFJlc291cmNlcy5yZXZpZXdQbHVnaW5zUGFnZV9kZXBlbmRlbnRQbHVnaW5zTGFiZWxfdGV4dAotCQkJCQkubGVuZ3RoKCk7IAotCQkJc3R5bGUuYWRkU3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZShzdGFydCwgb2Zmc2V0LCBudWxsLCBudWxsLAotCQkJCQlTV1QuQk9MRCB8IFNXVC5JVEFMSUMpKTsKLQkJCXRleHRCdWYKLQkJCQkJLmFwcGVuZCgiXHQiKSAvLyROT04tTkxTLTEkCi0JCQkJCS5hcHBlbmQoCi0JCQkJCQkJRXhwb3J0UmVzb3VyY2VzLnJldmlld1BsdWdpbnNQYWdlX2RlcGVuZGVudFBsdWdpbnNMYWJlbF90ZXh0KQotCQkJCQkuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlMaXN0IGRlcGVuZGVudFBsdWdpbkxpc3QgPSBwbHVnaW4uZ2V0QmFzZXMoKTsKLQkJCWJvb2xlYW4gYWRkTGluZWZlZWQgPSB0cnVlOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVwZW5kZW50UGx1Z2luTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RQbHVnaW4gZWxlbWVudCA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJCXRleHRCdWYuYXBwZW5kKCJcdFx0IikuYXBwZW5kKGVsZW1lbnQuZ2V0TmFtZSgpKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWFkZExpbmVmZWVkID0gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoYWRkTGluZWZlZWQpCi0JCQkJdGV4dEJ1Zi5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJc3RhcnQgPSB0ZXh0QnVmLmxlbmd0aCgpOwotCQkJb2Zmc2V0ID0gRXhwb3J0UmVzb3VyY2VzLnJldmlld1BsdWdpbnNQYWdlX2Fzc29jaWF0ZWRDb25maWdzTGFiZWxfdGV4dAotCQkJCQkubGVuZ3RoKCk7Ci0JCQlzdHlsZS5hZGRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCBvZmZzZXQsIG51bGwsIG51bGwsCi0JCQkJCVNXVC5CT0xEIHwgU1dULklUQUxJQykpOwotCQkJdGV4dEJ1ZgotCQkJCQkuYXBwZW5kKCJcdCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLmFwcGVuZCgKLQkJCQkJCQlFeHBvcnRSZXNvdXJjZXMucmV2aWV3UGx1Z2luc1BhZ2VfYXNzb2NpYXRlZENvbmZpZ3NMYWJlbF90ZXh0KQotCQkJCQkuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlMaXN0IGFzc29jaWF0ZWRDb25maWdMaXN0ID0gKExpc3QpIGRhdGEuYXNzb2NpYXRlZENvbmZpZ01hcAotCQkJCQkuZ2V0KHBsdWdpbik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhc3NvY2lhdGVkQ29uZmlnTGlzdC5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBlbGVtZW50ID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0ZXIubmV4dCgpOwotCQkJCXRleHRCdWYuYXBwZW5kKCJcdFx0IikuYXBwZW5kKGVsZW1lbnQuZ2V0TmFtZSgpKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQl0ZXh0QnVmLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KHRleHRCdWYudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBkb2M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0UGx1Z2luV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0UGx1Z2luV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OTkwYmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydFBsdWdpbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuU2F2ZUFsbEVkaXRvcnNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuUGx1Z2luRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuRGlyZWN0b3J5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JSW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogVGhlIEV4cG9ydCBNZXRob2QgUGx1Zy1pbiB3aXphcmQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFBsdWdpbldpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElJbXBvcnRXaXphcmQgewotCi0JcHJvdGVjdGVkIFNlbGVjdFBsdWdpblBhZ2UgcGFnZTE7Ci0KLQlwcm90ZWN0ZWQgUGx1Z2luSW5mb1BhZ2UgcGFnZTI7Ci0KLQlwcm90ZWN0ZWQgRXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2UgcGFnZTM7Ci0KLQlwcm90ZWN0ZWQgU2F2ZVBsdWdpblBhZ2UgcGFnZTQ7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBva1RvQ29tcGxldGUgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBQbHVnaW5FeHBvcnREYXRhIGRhdGEgPSBuZXcgUGx1Z2luRXhwb3J0RGF0YSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0UGx1Z2luV2l6YXJkKCkgewotCQlzZXRXaW5kb3dUaXRsZShFeHBvcnRSZXNvdXJjZXMuZXhwb3J0UGx1Z2luc1dpemFyZF90aXRsZSk7Ci0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlTYXZlQWxsRWRpdG9yc1BhZ2UuYWRkUGFnZUlmTmVlZGVkKHRoaXMsIGZhbHNlLCBudWxsLCBudWxsLAotCQkJCUV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZ1bGwvd2l6YmFuL0V4cG9ydE1ldGhvZFBsdWdpbnMuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0KLQkJcGFnZTEgPSBuZXcgU2VsZWN0UGx1Z2luUGFnZShkYXRhKTsKLQkJYWRkUGFnZShwYWdlMSk7Ci0KLQkJcGFnZTIgPSBuZXcgUGx1Z2luSW5mb1BhZ2UoZGF0YSk7Ci0JCWFkZFBhZ2UocGFnZTIpOwotCi0JCXBhZ2UzID0gbmV3IEV4cG9ydFBsdWdpblN1bW1hcnlQYWdlKGRhdGEpOwotCQlhZGRQYWdlKHBhZ2UzKTsKLQotCQlwYWdlNCA9IG5ldyBTYXZlUGx1Z2luUGFnZShkYXRhKTsKLQkJYWRkUGFnZShwYWdlNCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKExpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX1BMVUdJTik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJaWYgKHRoaXMuZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKSAhPSBwYWdlNCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG9rVG9Db21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCVN0cmluZyBleHBvcnRMaWJQYXRoID0gZGF0YS5sbERhdGEuZ2V0UGFyZW50Rm9sZGVyKCk7Ci0JCWlmIChjaGVja0FuZENyZWF0ZURpcihleHBvcnRMaWJQYXRoKSA9PSBmYWxzZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLmJlZ2luVGFzayhFeHBvcnRSZXNvdXJjZXMuRXhwb3J0UGx1Z2luV2l6YXJkX01TRzEsCi0JCQkJCQkJSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQotCQkJCQlpZiAoZGF0YS52YWxpZGF0ZSgpKSB7Ci0JCQkJCQkobmV3IFBsdWdpbkV4cG9ydFNlcnZpY2UoZGF0YSkpLnJ1bihtb25pdG9yKTsKLQkJCQkJfQotCi0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgZmFsc2UsIG9wKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVRocm93YWJsZSByZWFsRXhjZXB0aW9uID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJCUV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlFeHBvcnRSZXNvdXJjZXMuRXhwb3J0UGx1Z2luV2l6YXJkX2Vycm9yLAotCQkJCQlyZWFsRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBTYXZlIHRoZSBleHBvcnQgcGF0aCB0byBwcmVmZXJlbmNlIHN0b3JlLgotCQlFeHBvcnRVSVByZWZlcmVuY2VzLmFkZEV4cG9ydFBsdWdpbkRpcihleHBvcnRMaWJQYXRoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tBbmRDcmVhdGVEaXIoU3RyaW5nIGRpcikgewotCQlyZXR1cm4gRGlyZWN0b3J5VmFsaWRhdG9yLmNoZWNrQW5kQ3JlYXRlRGlyKGRpciwKLQkJCQlFeHBvcnRSZXNvdXJjZXMuRXhwb3J0UGx1Z2luV2l6YXJkX3RpdGxlLAotCQkJCUV4cG9ydFJlc291cmNlcy5FeHBvcnRQbHVnaW5FcnJvcl9tc2csIGZhbHNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRVSVByZWZlcmVuY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0VUlQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDk4ZWU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRVSVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuUHJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgRXhwb3J0IFVJIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFVJUHJlZmVyZW5jZXMgewotCi0JLy8gVGhlIGV4cG9ydCBwbHVnLWluIGRpcmVjdG9yaWVzIHByZWZlcmVuY2Uga2V5LgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfUExVR0lOX0RJUlMgPSAiZXhwb3J0UGx1Z2luRGlycyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBleHBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcmllcyBwcmVmZXJlbmNlIGtleS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX0NPTkZJR19ESVJTID0gImV4cG9ydENvbmZpZ0RpcnMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgZGVmYXVsdCBleHBvcnQgcGx1Zy1pbiBkaXJlY3RvcnkgbmFtZS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWFBPUlRfUExVR0lOX0RJUl9OQU1FID0gIkV4cG9ydCIgKyBGaWxlVXRpbC5GSUxFX1NFUCArICJQbHVnaW5zIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCSAKLQotCS8vIFRoZSBkZWZhdWx0IGV4cG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yeSBuYW1lLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VYUE9SVF9DT05GSUdfRElSX05BTUUgPSAiRXhwb3J0IiArIEZpbGVVdGlsLkZJTEVfU0VQICsgIkNvbmZpZ3VyYXRpb25zIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCSAKLQotCS8vIFRoZSBkZWZhdWx0IGV4cG9ydCBwbHVnLWluIGRpcmVjdG9yeS4KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdEV4cG9ydFBsdWdpbkRpciA9IG51bGw7Ci0KLQkvLyBUaGUgZGVmYXVsdCBleHBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkuCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRFeHBvcnRDb25maWdEaXIgPSBudWxsOwotCi0JLy8gVGhlIHBsdWctaW4gc3BlY2lmaWMgcHJlZmVyZW5jZSBzdG9yZS4KLQlwcml2YXRlIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IEV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCXN0YXRpYyB7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KEVYUE9SVF9QTFVHSU5fRElSUywgZ2V0RGVmYXVsdEV4cG9ydFBsdWdpbkRpcigpKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoRVhQT1JUX0NPTkZJR19ESVJTLCBnZXREZWZhdWx0RXhwb3J0Q29uZmlnRGlyKCkpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgZXhwb3J0IHBsdWctaW4gZGlyZWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgZXhwb3J0IHBsdWctaW4gZGlyZWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdEV4cG9ydFBsdWdpbkRpcigpIHsKLQkJaWYgKGRlZmF1bHRFeHBvcnRQbHVnaW5EaXIgPT0gbnVsbCkgewotCQkJZGVmYXVsdEV4cG9ydFBsdWdpbkRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBhcHBOYW1lID0gTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0QXBwbGljYXRpb25TaG9ydE5hbWUoKTsKLQkJCWlmIChhcHBOYW1lICE9IG51bGwgJiYgYXBwTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkZWZhdWx0RXhwb3J0UGx1Z2luRGlyID0gZGVmYXVsdEV4cG9ydFBsdWdpbkRpcgotCQkJCQkJKyBGaWxlVXRpbC5GSUxFX1NFUCArIGFwcE5hbWUgKyBGaWxlVXRpbC5GSUxFX1NFUAotCQkJCQkJKyBERUZBVUxUX0VYUE9SVF9QTFVHSU5fRElSX05BTUU7Ci0JCQl9IGVsc2UgewotCQkJCWRlZmF1bHRFeHBvcnRQbHVnaW5EaXIgPSBkZWZhdWx0RXhwb3J0UGx1Z2luRGlyCi0JCQkJCQkrIEZpbGVVdGlsLkZJTEVfU0VQICsgREVGQVVMVF9FWFBPUlRfUExVR0lOX0RJUl9OQU1FOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWZhdWx0RXhwb3J0UGx1Z2luRGlyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGV4cG9ydCBwbHVnLWluIGRpcmVjdG9yaWVzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RXhwb3J0UGx1Z2luRGlycygpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldFN0cmluZ1ZhbHVlcyhwcmVmU3RvcmUsIEVYUE9SVF9QTFVHSU5fRElSUyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZXhwb3J0IHBsdWctaW4gZGlyZWN0b3JpZXMgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBleHBvcnQgcGx1Zy1pbiBkaXJlY3RvcmllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldEV4cG9ydFBsdWdpbkRpcnNMaXN0KCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuZ2V0TGlzdChwcmVmU3RvcmUsIEVYUE9SVF9QTFVHSU5fRElSUyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGV4cG9ydCBkaXJlY3RvcnkgdG8gdGhlIGV4cG9ydCBwbHVnLWluIGRpcmVjdG9yaWVzIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIGRpcgotCSAqICAgICAgICAgICAgYW4gZXhwb3J0IGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFeHBvcnRQbHVnaW5EaXIoU3RyaW5nIGRpcikgewotCQlQcmVmZXJlbmNlVXRpbC5hZGRUb0xpc3QocHJlZlN0b3JlLCBFWFBPUlRfUExVR0lOX0RJUlMsIGRpcik7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBleHBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBleHBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0RXhwb3J0Q29uZmlnRGlyKCkgewotCQlpZiAoZGVmYXVsdEV4cG9ydENvbmZpZ0RpciA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0RXhwb3J0Q29uZmlnRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGFwcE5hbWUgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpOwotCQkJaWYgKGFwcE5hbWUgIT0gbnVsbCAmJiBhcHBOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCWRlZmF1bHRFeHBvcnRDb25maWdEaXIgPSBkZWZhdWx0RXhwb3J0Q29uZmlnRGlyCi0JCQkJCQkrIEZpbGVVdGlsLkZJTEVfU0VQICsgYXBwTmFtZSArIEZpbGVVdGlsLkZJTEVfU0VQCi0JCQkJCQkrIERFRkFVTFRfRVhQT1JUX0NPTkZJR19ESVJfTkFNRTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVmYXVsdEV4cG9ydENvbmZpZ0RpciA9IGRlZmF1bHRFeHBvcnRDb25maWdEaXIKLQkJCQkJCSsgRmlsZVV0aWwuRklMRV9TRVAgKyBERUZBVUxUX0VYUE9SVF9DT05GSUdfRElSX05BTUU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRFeHBvcnRDb25maWdEaXI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZXhwb3J0IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3JpZXMgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFeHBvcnRDb25maWdEaXJzKCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuZ2V0U3RyaW5nVmFsdWVzKHByZWZTdG9yZSwgRVhQT1JUX0NPTkZJR19ESVJTKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBleHBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcmllcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIGV4cG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yaWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0RXhwb3J0Q29uZmlnRGlyc0xpc3QoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRMaXN0KHByZWZTdG9yZSwgRVhQT1JUX0NPTkZJR19ESVJTKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgZXhwb3J0IGRpcmVjdG9yeSB0byB0aGUgZXhwb3J0IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3JpZXMKLQkgKiBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBkaXIKLQkgKiAgICAgICAgICAgIGFuIGV4cG9ydCBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkRXhwb3J0Q29uZmlnRGlyKFN0cmluZyBkaXIpIHsKLQkJUHJlZmVyZW5jZVV0aWwuYWRkVG9MaXN0KHByZWZTdG9yZSwgRVhQT1JUX0NPTkZJR19ESVJTLCBkaXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL1BsdWdpbkluZm9QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvUGx1Z2luSW5mb1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU0NzM4OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvUGx1Z2luSW5mb1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5Db25maWd1cmF0aW9uVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuUGx1Z2luRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byByZXZpZXcgdGhlIGRlcGVuZGVuY2llcyBvZiB0aGUgbWV0aG9kCi0gKiBwbHVnLWlucyB0aGF0IGhhdmUgYmVlbiBzZWxlY3RlZCBmb3IgZXhwb3J0LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5JbmZvUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgTGlzdGVuZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gUGx1Z2luSW5mb1BhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgY3RybF90YWJsZVZpZXdlcjsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgY3RybF9kZXBlbmRQbHVnaW5zVmlld2VyOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBjdHJsX2Fzc29jaWF0ZWRDb25maWdWaWV3ZXI7Ci0KLQlwcml2YXRlIExpc3QgZGVwZW5kZW50UGx1Z2luTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgTGlzdCBhc3NvY2lhdGVkQ29uZmlnTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgUGx1Z2luRXhwb3J0RGF0YSBkYXRhOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUGx1Z2luSW5mb1BhZ2UoUGx1Z2luRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEV4cG9ydFJlc291cmNlcy5yZXZpZXdQbHVnaW5zUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFJlc291cmNlcy5yZXZpZXdQbHVnaW5zUGFnZV9kZXNjKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9leHBfbWV0aF9wbHVnaW5fd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAkJCi0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsCi0JCQkJRXhwb3J0UmVzb3VyY2VzLnJldmlld1BsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0KTsKLQotCQljdHJsX3RhYmxlVmlld2VyID0gY3JlYXRlVGFibGVWaWV3ZXIoY29udGFpbmVyLCAzNjAsIDYwLCAxKTsKLQkJdGFibGUgPSBjdHJsX3RhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0KLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX1BMVUdJTjsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJcmV0dXJuICgoTWV0aG9kUGx1Z2luKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWN0cmxfdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJY3RybF90YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQlpZiAoZGF0YS5nZXRTZWxlY3RlZFBsdWdpbnMoKSAhPSBudWxsKSB7Ci0JCQljdHJsX3RhYmxlVmlld2VyLnNldElucHV0KGRhdGEuZ2V0U2VsZWN0ZWRQbHVnaW5zKCkudG9BcnJheSgpKTsKLQkJfQotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwKLQkJCQlFeHBvcnRSZXNvdXJjZXMucmV2aWV3UGx1Z2luc1BhZ2VfZGVwZW5kZW50UGx1Z2luc0xhYmVsX3RleHQpOwotCi0JCWN0cmxfZGVwZW5kUGx1Z2luc1ZpZXdlciA9IGNyZWF0ZVRhYmxlVmlld2VyKGNvbnRhaW5lciwgMzYwLCA2MCwgMSk7Ci0JCWN0cmxfZGVwZW5kUGx1Z2luc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljdHJsX2RlcGVuZFBsdWdpbnNWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJY3RybF9kZXBlbmRQbHVnaW5zVmlld2VyLnNldElucHV0KGRlcGVuZGVudFBsdWdpbkxpc3QpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwKLQkJCQlFeHBvcnRSZXNvdXJjZXMucmV2aWV3UGx1Z2luc1BhZ2VfYXNzb2NpYXRlZENvbmZpZ3NMYWJlbF90ZXh0KTsKLQotCQljdHJsX2Fzc29jaWF0ZWRDb25maWdWaWV3ZXIgPSBjcmVhdGVUYWJsZVZpZXdlcihjb250YWluZXIsIDM2MCwgNjAsIDEpOwotCQljdHJsX2Fzc29jaWF0ZWRDb25maWdWaWV3ZXIKLQkJCQkuc2V0TGFiZWxQcm92aWRlcihuZXcgQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlcigpKTsKLQkJY3RybF9hc3NvY2lhdGVkQ29uZmlnVmlld2VyCi0JCQkJLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWN0cmxfYXNzb2NpYXRlZENvbmZpZ1ZpZXdlci5zZXRJbnB1dChhc3NvY2lhdGVkQ29uZmlnTGlzdCk7Ci0KLQkJaWYgKGRhdGEuZ2V0U2VsZWN0ZWRQbHVnaW5zKCkgIT0gbnVsbAotCQkJCSYmICFkYXRhLmdldFNlbGVjdGVkUGx1Z2lucygpLmlzRW1wdHkoKSkgewotCQkJdGFibGUuc2VsZWN0KDApOwotCQkJZGlzcGxheVJlbGF0ZWRJbmZvKChNZXRob2RQbHVnaW4pIGRhdGEuZ2V0U2VsZWN0ZWRQbHVnaW5zKCkuZ2V0KDApKTsKLQkJfQotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQljdHJsX3RhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIHBsdWdpbiA9IHNlbGVjdGlvbi50b0FycmF5KCk7Ci0JCQlkaXNwbGF5UmVsYXRlZEluZm8oKE1ldGhvZFBsdWdpbikgcGx1Z2luWzBdKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChkYXRhLmdldFNlbGVjdGVkUGx1Z2lucygpICE9IG51bGwKLQkJCQkmJiAhZGF0YS5nZXRTZWxlY3RlZFBsdWdpbnMoKS5pc0VtcHR5KCkpIHsKLQkJCWN0cmxfdGFibGVWaWV3ZXIuc2V0SW5wdXQoZGF0YS5nZXRTZWxlY3RlZFBsdWdpbnMoKS50b0FycmF5KCkpOwotCQkJdGFibGUuc2VsZWN0KDApOwotCQkJZGlzcGxheVJlbGF0ZWRJbmZvKChNZXRob2RQbHVnaW4pIGRhdGEuZ2V0U2VsZWN0ZWRQbHVnaW5zKCkuZ2V0KDApKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNwbGF5UmVsYXRlZEluZm8oTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlpZiAocGx1Z2luID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZGVwZW5kZW50UGx1Z2luTGlzdCA9IHBsdWdpbi5nZXRCYXNlcygpOwotCQljdHJsX2RlcGVuZFBsdWdpbnNWaWV3ZXIuc2V0SW5wdXQoZGVwZW5kZW50UGx1Z2luTGlzdC50b0FycmF5KCkpOwotCQlhc3NvY2lhdGVkQ29uZmlnTGlzdCA9IExpYnJhcnlVdGlsLmdldEFzc29jaWF0ZWRDb25maWd1cmF0aW9ucyhwbHVnaW4pOwotCQljdHJsX2Fzc29jaWF0ZWRDb25maWdWaWV3ZXIuc2V0SW5wdXQoYXNzb2NpYXRlZENvbmZpZ0xpc3QudG9BcnJheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZURhdGFUb01vZGVsKCkgewotCQkvLyBGSVhNRSEgUmVmYWN0b3IgdG8gdXNlOiBkYXRhLmJ1aWxkQXNzb2NpYXRlZENvbmZpZ01hcCgpCi0JCWlmIChkYXRhLmdldFNlbGVjdGVkUGx1Z2lucygpICE9IG51bGwpIHsKLQkJCWRhdGEuYXNzb2NpYXRlZENvbmZpZ01hcC5jbGVhcigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGF0YS5nZXRTZWxlY3RlZFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kUGx1Z2luIGVsZW1lbnQgPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCQlkYXRhLmFzc29jaWF0ZWRDb25maWdNYXAucHV0KGVsZW1lbnQsIExpYnJhcnlVdGlsCi0JCQkJCQkuZ2V0QXNzb2NpYXRlZENvbmZpZ3VyYXRpb25zKGVsZW1lbnQpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJc2F2ZURhdGFUb01vZGVsKCk7Ci0JCUV4cG9ydFBsdWdpblN1bW1hcnlQYWdlIHBhZ2UgPSAoKEV4cG9ydFBsdWdpbldpemFyZCkgZ2V0V2l6YXJkKCkpLnBhZ2UzOwotCQlwYWdlLm9uRW50ZXJQYWdlKG51bGwpOwotCQlyZXR1cm4gcGFnZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9TYXZlUGx1Z2luUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL1NhdmVQbHVnaW5QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OWI5YjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL1NhdmVQbHVnaW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IGluZm9ybXMgdGhlIHVzZXIgdGhhdCBjaGFuZ2VzIHRvIHRoZSBleGlzdGluZyBtZXRob2QKLSAqIHBsdWctaW5zIHdpbGwgYmUgc2F2ZWQgcHJpb3IgdG8gYW4gZXhwb3J0IG9wZXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2F2ZVBsdWdpblBhZ2UgZXh0ZW5kcyBEZXN0aW5hdGlvbkNvbW1vblBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2F2ZVBsdWdpblBhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2F2ZVBsdWdpblBhZ2UoUGx1Z2luRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSwgZGF0YS5sbERhdGEpOwotCQlzZXRUaXRsZShFeHBvcnRSZXNvdXJjZXMuc3BlY2lmeVBhdGhQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oRXhwb3J0UmVzb3VyY2VzLnNwZWNpZnlQYXRoUGFnZV9kZXNjKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9leHBfbWV0aF9wbHVnaW5fd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlTdHJpbmdbXSBleHBvcnREaXJzID0gRXhwb3J0VUlQcmVmZXJlbmNlcy5nZXRFeHBvcnRQbHVnaW5EaXJzKCk7Ci0JCWlmIChleHBvcnREaXJzICE9IG51bGwgJiYgZXhwb3J0RGlycy5sZW5ndGggPiAwKSB7Ci0JCQlleHBvcnRQYXRoQ29tYm8uc2V0SXRlbXMoZXhwb3J0RGlycyk7Ci0JCQlleHBvcnRQYXRoQ29tYm8uc2V0VGV4dChleHBvcnREaXJzWzBdKTsKLQkJfQotCQlzdXBlci5pbml0Q29udHJvbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJRXhwb3J0UGx1Z2luV2l6YXJkIHdpemFyZCA9IChFeHBvcnRQbHVnaW5XaXphcmQpIGdldFdpemFyZCgpOwotCQlpZiAoZXhwb3J0UGF0aENvbWJvLmdldFRleHQoKS5sZW5ndGgoKSA+IDAKLQkJCQkmJiAhZXhwb3J0UGF0aENvbWJvLmdldFRleHQoKS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLQkJCXNhdmVUb0RhdGFNb2RlbCgpOwotCQkJd2l6YXJkLm9rVG9Db21wbGV0ZSA9IHRydWU7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQl3aXphcmQub2tUb0NvbXBsZXRlID0gZmFsc2U7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9TZWxlY3RQbHVnaW5QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvU2VsZWN0UGx1Z2luUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2Y4ODkyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9TZWxlY3RQbHVnaW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuUGx1Z2luRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgdGhlIG1ldGhvZCBwbHVnLWlucyB0byBiZQotICogZXhwb3J0ZWQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdFBsdWdpblBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzCi0JCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIElDaGVja1N0YXRlTGlzdGVuZXIsIExpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdFBsdWdpblBhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBjdHJsX2Noa2JveFRhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYXV0aG9yOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfdmVyc2lvbjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmRGVzYzsKLQotCXByaXZhdGUgaW50IGNoZWNrZWRDb3VudCA9IDA7Ci0KLQlwcml2YXRlIExpc3Q8T2JqZWN0PiBjaGVja2VkUGx1Z2luTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCi0JcHJpdmF0ZSBQbHVnaW5FeHBvcnREYXRhIGRhdGE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RQbHVnaW5QYWdlKFBsdWdpbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShFeHBvcnRSZXNvdXJjZXMuc2VsZWN0UGx1Z2luc1BhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRSZXNvdXJjZXMuc2VsZWN0UGx1Z2luc1BhZ2VfZGVzYyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vZXhwX21ldGhfcGx1Z2luX3dpemJhbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwKLQkJCQlFeHBvcnRSZXNvdXJjZXMuc2VsZWN0UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQpOwotCi0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIgPSBjcmVhdGVDaGVja2JveFRhYmxlVmlld2VyKGNvbnRhaW5lciwgMSk7Ci0JCXRhYmxlID0gY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCi0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJTGlzdCBwbHVnaW5zID0gKGxpYnJhcnkgPT0gbnVsbCkgPyBuZXcgQXJyYXlMaXN0KCkgOiBsaWJyYXJ5Ci0JCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX1BMVUdJTjsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJcmV0dXJuICgoTWV0aG9kUGx1Z2luKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWlmIChwbHVnaW5zICE9IG51bGwpIHsKLQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0SW5wdXQocGx1Z2lucy50b0FycmF5KCkpOwotCQl9Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBBdXRob3JpbmdVSVRleHQuQVVUSE9SU19URVhUKTsKLQkJY3RybF9hdXRob3IgPSBjcmVhdGVNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgIiIsIDM2MCwgNDAsIDMpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBBdXRob3JpbmdVSVRleHQuVkVSU0lPTl9URVhUKTsKLQkJY3RybF92ZXJzaW9uID0gY3JlYXRlVGV4dChjb250YWluZXIsICIiLCAzNjAsIDMpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBBdXRob3JpbmdVSVRleHQuQlJJRUZfREVTQ1JJUFRJT05fVEVYVCk7Ci0JCWN0cmxfYnJpZWZEZXNjID0gY3JlYXRlTXVsdGlMaW5lVGV4dChjb250YWluZXIsICIiLCAzNjAsIDgwLCAzKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChwbHVnaW5zICE9IG51bGwgJiYgIXBsdWdpbnMuaXNFbXB0eSgpKSB7Ci0JCQl0YWJsZS5zZWxlY3QoMCk7Ci0JCQlzZXREaXNwbGF5QXR0cmlidXRlcygoTWV0aG9kUGx1Z2luKSBwbHVnaW5zLmdldCgwKSk7Ci0JCX0KLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyI2NoZWNrU3RhdGVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdCBvYmogPSBldmVudC5nZXRFbGVtZW50KCk7Ci0KLQkJaWYgKGV2ZW50LmdldENoZWNrZWQoKSkgewotCQkJY2hlY2tlZENvdW50Kys7Ci0JCQljaGVja2VkUGx1Z2luTGlzdC5hZGQob2JqKTsKLQkJfSBlbHNlIHsKLQkJCWNoZWNrZWRDb3VudC0tOwotCQkJY2hlY2tlZFBsdWdpbkxpc3QucmVtb3ZlKG9iaik7Ci0JCX0KLQotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIHBsdWdpbiA9IHNlbGVjdGlvbi50b0FycmF5KCk7Ci0JCQlzZXREaXNwbGF5QXR0cmlidXRlcygoTWV0aG9kUGx1Z2luKSBwbHVnaW5bMF0pOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREaXNwbGF5QXR0cmlidXRlcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCWN0cmxfYXV0aG9yLnNldFRleHQocGx1Z2luLmdldEF1dGhvcnMoKSk7Ci0JCWN0cmxfdmVyc2lvbi5zZXRUZXh0KHBsdWdpbi5nZXRWZXJzaW9uKCkpOwotCQljdHJsX2JyaWVmRGVzYy5zZXRUZXh0KHBsdWdpbi5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShMaWJyYXJ5VUlSZXNvdXJjZXMubm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gY2hlY2tlZENvdW50ID4gMDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlRGF0YVRvTW9kZWwoKSB7Ci0JCWRhdGEuc2V0U2VsZWN0ZWRQbHVnaW5zKGNoZWNrZWRQbHVnaW5MaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXNhdmVEYXRhVG9Nb2RlbCgpOwotCQlQbHVnaW5JbmZvUGFnZSBwYWdlID0gKChFeHBvcnRQbHVnaW5XaXphcmQpIGdldFdpemFyZCgpKS5wYWdlMjsKLQkJcGFnZS5vbkVudGVyUGFnZShudWxsKTsKLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3Njc5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgd2l6YXJkcyBmb3IgZXhwb3J0aW5nIG1ldGhvZCBwbHVnLWlucyBhbmQgY29uZmlndXJhdGlvbnMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEzNmRjNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2M8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjhkZmUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2M7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLkRvY1BsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmhlbHAKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtQ2xhc3NQYXRoOiBkb2MuamFyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9hY2Nlc3NpYmlsaXR5LnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9hY2Nlc3NpYmlsaXR5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFlMDZjNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvYWNjZXNzaWJpbGl0eS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkFjY2Vzc2liaWxpdHkiIGxpbmtfdG89Im1haW4ueG1sI2FjY2Vzc2liaWxpdHlfaWQiPgotICAgPHRvcGljIGxhYmVsPSJBY2Nlc3NpYmlsaXR5IG92ZXJ2aWV3IiBocmVmPSJodG1sL3RvcGljcy9jX2FjY2Vzc2liaWxpdHkuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJTZXR0aW5nIGFjY2Vzc2liaWxpdHkgcHJlZmVyZW5jZXMiIGhyZWY9Imh0bWwvdG9waWNzL3RfYWNjZXNzaWJpbGl0eV9wcmVmZXJlbmNlcy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlNlbGVjdGluZyBhbiBhbHRlcm5hdGUgYnJvd3NlciIgaHJlZj0iaHRtbC90b3BpY3MvdF9hY2Nlc3NpYmlsaXR5X3NldF9icm93c2VyLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iS2V5Ym9hcmQgbmF2aWdhdGlvbiIgaHJlZj0iaHRtbC90b3BpY3Mvcl9hY2Nlc3NpYmlsaXR5X25hdmlnYXRpb24uaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJGb250cyBhbmQgY29sb3JzIiBocmVmPSJodG1sL3RvcGljcy9yX2FjY2Vzc2liaWxpdHlfZm9udHMuaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjAwZmE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotc291cmNlLmRvYy5qYXIgPSBzcmMvCi1vdXRwdXQuZG9jLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgZG9jLmphcixcCi0gICAgICAgICAgICAgICBkb2MuemlwLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFjY2Vzc2liaWxpdHkueG1sLFwKLSAgICAgICAgICAgICAgIGNhdGVnb3JpemluZ19tZXRob2RfY29udGVudC54bWwsXAotICAgICAgICAgICAgICAgY29udGV4dHNfYXV0aG9yaW5nX3VpLnhtbCxcCi0gICAgICAgICAgICAgICBjcmVhdGluZ19tZXRob2RfY29udGVudC54bWwsXAotICAgICAgICAgICAgICAgY3JlYXRpbmdfcHJvY2Vzc2VzLnhtbCxcCi0gICAgICAgICAgICAgICBnZXR0aW5nX3N0YXJ0ZWQueG1sLFwKLSAgICAgICAgICAgICAgIGdsb3NzYXJ5LnhtbCxcCi0gICAgICAgICAgICAgICBtYWluLnhtbCxcCi0gICAgICAgICAgICAgICBvdmVydmlldy54bWwsXAotICAgICAgICAgICAgICAgcHVibGlzaGluZ19leHBvcnRpbmcueG1sLFwKLSAgICAgICAgICAgICAgIHR1dG9yaWFscy54bWwsXAotICAgICAgICAgICAgICAgdmVyc2lvbl9jb250cm9sLnhtbCxcCi0gICAgICAgICAgICAgICBjaGVhdHNoZWV0cy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2F0ZWdvcml6ZW1ldGhjb250LnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jYXRlZ29yaXplbWV0aGNvbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDUyNjlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jYXRlZ29yaXplbWV0aGNvbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJDYXRlZ29yaXplIG1ldGhvZCBjb250ZW50IiBsaW5rX3RvPSJtYWluLnhtbCNjYXRlZ29yaXplbWV0aG9kY29udF9pZCI+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiIGhyZWY9Imh0bWwvaGVscC9jb250ZW50X2NhdGVnb3JpZXMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBtZXRob2QgdmlldyB3aXRoIGN1c3RvbSBjYXRlZ29yaWVzIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2N1c3RvbV9jYXRlZ29yaWVzLmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NhdGVnb3JpemluZ19tZXRob2RfY29udGVudC54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2F0ZWdvcml6aW5nX21ldGhvZF9jb250ZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBiN2VmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2F0ZWdvcml6aW5nX21ldGhvZF9jb250ZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iQ2F0ZWdvcml6aW5nIG1ldGhvZCBjb250ZW50IiBsaW5rX3RvPSJtYWluLnhtbCNjYXRlZ29yaXppbmdfbWV0aG9kX2NvbnRlbnRfaWQiPiAgCi0gIDx0b3BpYyBsYWJlbD0iU3RhbmRhcmQgYW5kIGN1c3RvbSBjYXRlZ29yaWVzIiBocmVmPSJodG1sL3RvcGljcy9jX21ldGhvZF9jb250ZW50X2NhdGVnb3JpZXMuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIG1ldGhvZCB2aWV3IHdpdGggY3VzdG9tIGNhdGVnb3JpZXMiIGhyZWY9Imh0bWwvdG9waWNzL3RfY3JlYXRlX2N1c3RvbV9jYXRlZ29yaWVzLmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2FkZG1ldGhvZHJlZl9vcl9oeXBlcmxpbmsueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2FkZG1ldGhvZHJlZl9vcl9oeXBlcmxpbmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDk4N2VmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9hZGRtZXRob2RyZWZfb3JfaHlwZXJsaW5rLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08Y2hlYXRzaGVldCB0aXRsZT0iQWRkIGEgTWV0aG9kIFJlZmVyZW5jZSBvciBIeXBlcmxpbmsgKFVSTCkiPgotCTxpbnRybyAKLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZGFyZWZlcmVuY2Vvcmh5cGVybGluay5odG1sIj4KLQkJPGRlc2NyaXB0aW9uPlRoZXJlIGFyZSB0d28gdHlwZXMgb2YgcmVmZXJlbmNlcyBvciBoeXBlcmxpbmtzIHRvIG90aGVyIGNvbnRlbnQgd2l0aGluIHlvdXIgY29udGVudCB0ZXh0OiByZWZlcmVuY2VzICB0byBvdGhlciBlbGVtZW50cyBpbiB0aGUgbWV0aG9kIGxpYnJhcnkgb3IgcmVmZXJlbmNlcyB0byBleHRlcm5hbCB0ZXh0IG91dHNpZGUgdGhlIG1ldGhvZCBsaWJyYXJ5IHdpdGggYSBVUkwuIFRoaXMgY2hlYXQgc2hlZXQgd2Fsa3MgeW91IHRocm91Z2ggY3JlYXRpbmcgYm90aCB0eXBlcy48L2Rlc2NyaXB0aW9uPgotCTwvaW50cm8+Ci0KLQk8aXRlbQotCQl0aXRsZT0iQ3JlYXRlIGEgSHlwZXJsaW5rIHRvIGFub3RoZXIgZWxlbWVudCBpbiB0aGUgTWV0aG9kIExpYnJhcnkiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPllvdSBjYW4gcmVjb2duaXplIGEgdGV4dCBmaWVsZCB0aGF0IHN1cHBvcnRzIGh5cGVybGlua3MgYnkgdGhlIGxpdHRsZSB0cmlhbmdsZSBuZXh0IHRvIHRoZSB0ZXh0IGZpZWxkJ3MgbGFiZWwuICBUaGlzIHRyaWFuZ2xlIGFsbG93cyB5b3UgdG8gZXhwYW5kIHRoZSB0ZXh0IGZpZWxkIGludG8gYSBmdWxsIHNpemUgZWRpdG9yIHdpdGggYW4gZWRpdG9yIHRvb2xiYXIgcHJvdmlkaW5nIHJpY2ggdGV4dCBlZGl0aW5nIGZ1bmN0aW9uYWxpdHkgc3VjaCBhcyBmb250IHN0eWxlcywgYnVsbGV0IHBvaW50cywgZXRjLjxici8+PGJyLz5UbyBpbnNlcnQgYSBoeXBlcmxpbmsgdG8gYW5vdGhlciBlbGVtZW50IGluIHRoZSBtZXRob2QgbGlicmFyeSBpbiB0aGUgdGV4dCBmaWVsZCBzaW1wbHkgZmluZCB0aGUgZWxlbWVudCBpbiB0aGUgbGlicmFyeSBvciBjb25maWd1cmF0aW9uIHZpZXcgYW5kIGRyYWcgaXQgaW50byBhbiBleHBhbmRlZCBvciBjb2xsYXBzZWQgZm9ybSBmaWVsZC48YnIvPjxici8+QWx0ZXJuYXRpdmVseSwgeW91IGNhbiBhbHNvIHBvc2l0aW9uIHRoZSBjdXJzb3Igd2hlcmUgeW91IHdhbnQgdGhlIGxpbmsgdG8gYmUgYWRkZWQgYW5kIGNsaWNrIHRoZSBBZGQgTGluayBidXR0b24gaW4gdGhlIHRvb2wgYmFyLiBJdCBvcGVucyB0aGUgQWRkIExpbmsgZGlhbG9nIHRoYXQgcHJvdmlkZXMgeW91IGFtb25nc3Qgb3RoZXJzIHdpdGggdGhyZWUgb3B0aW9ucyBmb3IgY3JlYXRpbmcgbGlua3MgdG8gb3RoZXIgY29udGVudCBlbGVtZW50cyBieSBzZWxlY3RpbmcgdGhlIGVsZW1lbnQgdmlhIHRoZSAiQnJvd3NlLi4uIiBidXR0b24uICBFdmVyeSBvcHRpb24gb2ZmZXJzIGEgZGlmZmVyZW50IHdheSBmb3IgZGlzcGxheWluZyB0aGUgbGluaydzIG5hbWU6PGJyLz48YnIvPiJNZXRob2QgRWxlbWVudCI6IGxpbmtzIHRoYXQgZGlzcGxheXMgdGhlIGVsZW1lbnQgbmFtZS4iPGJyLz48YnIvPiJNZXRob2Qgd2l0aCB0eXBlIHByZWZpeCI6IGxpbmsgdGhhdCBkaXNwbGF5cyB0aGUgZWxlbWVudCBuYW1lIGFuZCB0eXBlLjxici8+PGJyLz4iTWV0aG9kIGVsZW1lbnQgd2l0aCBjdXN0b20gdGV4dCI6IGxpbmsgdGhhdCBkaXNwbGF5cyBhIHVzZXIgZGVmaW5lZCB0ZXh0LiBUbyBkZWZpbmUgdGhpcyB0ZXh0IG1hbmlwdWxhdGUgdGhlIHRleHQgaW4gYmV0d2VlbiB0aGUgJmx0O2EmZ3Q7Jmx0Oy9hJmd0OyB0YWdzIGluIHRoZSBVUkwgdGV4dCBmaWVsZCBvbmNlIHlvdSBoYXZlIHNlbGVjdGVkIGFuIGVsZW1lbnQgdXNpbmcgdGhlICJCcm93c2UuLi4iIGJ1dHRvbi48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCXRpdGxlPSJDcmVhdGUgYSBIeXBlcmxpbmsgdG8gYW4gRXh0ZXJuYWwgcGFnZSB1c2luZyBhIFVSTCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+VG8gaW5zZXJ0IGEgaHlwZXJsaW5rIHRvIGFuIGV4dGVybmFsIFVSTCwgZXhwYW5kIHRoZSBlZGl0b3IsIHBvc2l0aW9uIHRoZSBjdXJzb3Igd2hlcmUgeW91IHdhbnQgdGhlIGxpbmsgdG8gYmUgYWRkZWQgYW5kIHRoZW4gY2xpY2sgdGhlICJBZGQgTGluayIgYnV0dG9uIGluIHRoZSB0b29sIGJhci4gRmlsbCBpbiB0aGUgZGlhbG9nIHdpdGggdGhlIGxpbmsgVVJMIGRldGFpbHMgYW5kIHRoZW4gY2xpY2sgT0suPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkRvbmUiPjxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPjwvaXRlbT4KLTwvY2hlYXRzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9hZGRuZXdtZXRob2Rjb250ZW50LnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9hZGRuZXdtZXRob2Rjb250ZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3ZDU0Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvYWRkbmV3bWV0aG9kY29udGVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGNoZWF0c2hlZXQgdGl0bGU9IkFkZCBuZXcgTWV0aG9kIENvbnRlbnQgc3VjaCBhcyBSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMgb3IgR3VpZGFuY2UiPgotCi0JPGludHJvIAotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlbWV0aG9kY29udGVudC5odG1sIj4KLQkJPGRlc2NyaXB0aW9uPlRoaXMgY2hlYXQgc2hlZXQgZ3VpZGVzIHlvdSB0aG91Z2ggdGhlIHN0ZXBzIG9mIGNyZWF0aW5nIHlvdXIgb3duIG1ldGhvZCBjb250ZW50LiBZb3Ugc2hvdWxkIGFsd2F5cyBjcmVhdGUgbWV0aG9kIGNvbnRlbnQgaW4gYSBtZXRob2QgcGx1Zy1pbiB0aGF0IHlvdSBwcm9kdWNlLiBUaGlzIHNlcGFyYXRlcyB5b3VyIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgeW91IHJldXNlZCBmcm9tIHRoaXJkIHBhcnRpZXMgYW5kIGFsbG93cyB5b3UgdG8gdXBkYXRlIHlvdXIgb3duIGxpYnJhcnkgd2l0aCBuZXcgcmVsZWFzZXMgb2Ygc3VjaCB0aGlyZCBwYXJ0eSBwbHVnLWlucyB3aXRob3V0IGFmZmVjdGluZyB0aGUgY29udGVudCB0aGF0IHlvdSBoYXZlIGNyZWF0ZWQgaW4geW91ciBvd24gcGx1Zy1pbnMuPGJyLz48YnIvPkFsbCBwbHVnLWlucyBzaGlwcGVkIHdpdGggeW91ciBtZXRob2QgbGlicmFyeSBhcmUgcHJvdGVjdGVkIGZyb20gZGlyZWN0IG1vZGlmaWNhdGlvbi4gQ3JlYXRpbmcgbmV3IGVsZW1lbnRzIGluIHlvdXIgb3duIHBsdWctaW4gYW5kIHRoZW4gcmVsYXRpbmcgdGhvc2UgZWxlbWVudHMgdG8gdGhlIGVsZW1lbnRzIGluIHRoZSBsb2NrZWQgcGx1Zy1pbiBhbGxvd3MgeW91IHRvIHRhaWxvciB0aGUgY29udGVudHMgb2YgdGhlIGxvY2tlZCBwbHVnLWluIGZvciB5b3VyIG93biB1c2UuIElmIHlvdSBoYXZlIG5vdCBjcmVhdGVkIHlvdXIgb3duIG1ldGhvZCBwbHVnLWluLCBwZXJmb3JtIHRoZSAiQ3JlYXRlIHlvdXIgb3duIE1ldGhvZCBQbHVnLWluIiBjaGVhdCBzaGVldCBmaXJzdC48L2Rlc2NyaXB0aW9uPgotCTwvaW50cm8+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCIKLQkJdGl0bGU9IlNlbGVjdCBvciBDcmVhdGUgYSBDb250ZW50IFBhY2thZ2UiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkNvbnRlbnQgcGFja2FnZXMgYXJlIHVzZWQgdG8gZ3JvdXAgcmVsYXRlZCBtZXRob2QgY29udGVudCB0b2dldGhlci4gU2luY2UgY29udGVudCBwYWNrYWdlcyBhcmUgc2VsZWN0YWJsZSBhdCBwdWJsaWNhdGlvbiB0aW1lLCBpdCBpcyByZWNvbW1lbmRlZCBwcmFjdGljZSB0byBncm91cCBjb250ZW50IHRoYXQgbmVlZHMgdG8gYmUgcHVibGlzaGVkIHRvZ2V0aGVyIGludG8gdGhlIHNhbWUgY29udGVudCBwYWNrYWdlLjxici8+PGJyLz5GaW5kIHlvdXIgbWV0aG9kIHBsdWctaW4gaW4gdGhlIExpYnJhcnkgdmlldy4gRHJpbGwgaW50byB0aGUgcGx1Zy1pbidzIHBhY2thZ2VzIHRvIGxvY2F0ZSB0aGUgcGFja2FnZSBjYWxsZWQgIkNvbnRlbnQgUGFja2FnZXMiLiBUaGlzIHBhY2thZ2UgY29udGFpbnMgYWxsIHBhY2thZ2VzIHRoYXQgYXJlIGFsbG93ZWQgdG8gY29udGFpbiBtZXRob2QgZWxlbWVudHMuIFNlbGVjdCBhbmQgZXhwYW5kIGEgcGFja2FnZSBpbiB0aGUgIkNvbnRlbnQgUGFja2FnZXMiIGhpZXJhcmNoeSBpbiB3aGljaCB5b3Ugd2FudCB0byBjcmVhdGUgeW91ciBlbGVtZW50LCBvciB0byBjcmVhdGUgYSBuZXcgY29udGVudCBwYWNrYWdlLiBSaWdodCBjbGljayBhIHBhY2thZ2UgYW5kIHNlbGVjdCBOZXcgLSZndDsgQ29udGVudCBQYWNrYWdlLjxici8+PGJyLz5BbiBlZGl0b3Igb3BlbnMgdGhhdCBhbGxvd3MgeW91IHRvIHByb3ZpZGUgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIHBhY2thZ2UgYXMgd2VsbCBhcyB0byBicmllZmx5IGRlc2NyaWJlIGl0cyBwdXJwb3NlLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnQuaHRtbCIKLQkJdGl0bGU9IkNyZWF0ZSBNZXRob2QgQ29udGVudCBFbGVtZW50IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5JbiB5b3VyIGV4cGFuZGVkIGNvbnRlbnQgcGFja2FnZSB3aXRoaW4gdGhlIGxpYnJhcnkgdmlldywgcmlnaHQgY2xpY2sgYW55IG9uZSBvZiByb2xlcywgdGFza3MsIHdvcmsgcHJvZHVjdHMsIG9yIGd1aWRhbmNlIHRvIGNyZWF0ZSBhbnkgb2YgdGhlc2UgY29udGVudCBlbGVtZW50cy4gSGlnaGxpZ2h0ICJOZXciIGFuZCB0aGVuIHNlbGVjdCB0aGUgY29uY3JldGUgdHlwZSBvZiB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byBjcmVhdGUgKGUuZy4gZm9yIHdvcmsgcHJvZHVjdHMgY2hvb3NlIGJldHdlZW4gYXJ0aWZhY3QsIG91dGNvbWUsIG9yIGRlbGl2ZXJhYmxlKS4gVGhlIG5ldyBlbGVtZW50IGlzIGNyZWF0ZWQgYW5kIGl0cyByZXNwZWN0aXZlIGVkaXRvciBpcyBvcGVuZWQuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iRGV0YWlsIHRoZSBOZXdseSBDcmVhdGVkIE1ldGhvZCBDb250ZW50IEVsZW1lbnQiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGUgZmllbGRzIGluIHRoZSBjb250ZW50IGVsZW1lbnQgZWRpdG9yIHRvIHNwZWNpZnkgdGhlIGNvbnRlbnQgZWxlbWVudCBkZXRhaWxzLiBTdGFydCBieSBhc3NpZ25pbmcgYSB1bmlxdWUgIk5hbWUiIHRvIHRoZSBlbGVtZW50IGFzIHdlbGwgYXMgZ2l2aW5nIGl0IGEgIlByZXNlbnRhdGlvbiBOYW1lIiB0aGF0IHdpbGwgYmUgdXNlZCBhcyB0aGUgZXh0ZXJuYWwgdmlzaWJsZSBuYW1lIHdoZW4gb3RoZXIgZWxlbWVudHMgcmVmZXIgdG8gdGhpcyBlbGVtZW50IG9yIHdoZW4gdGhlIGVsZW1lbnQgaXMgcHVibGlzaGVkLjxici8+PGJyLz5FdmVyeSBlbGVtZW50IG93bnMgc2V2ZXJhbCBzcGVjaWZpYyBjb250ZW50IGZpZWxkcyBkaXN0cmlidXRlZCBvbiBzZXZlcmFsIHN0YWNrZWQgZWRpdG9yIHRhYnMgYW5kIHNlY3Rpb25zIHdpdGhpbiB0aGVzZSB0YWJzIHRoYXQgeW91IGNhbiB1c2UgZm9yIHlvdXIgZGVzY3JpcHRpb25zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZSBkZXNjcmlwdGlvbiBmaWVsZHMgYXMgd2VsbCBhcyBob3cgdG8gdXNlIHRoZSByaWNoIHRleHQgZWRpdG9yIHNlZSB0aGUgb25saW5lIGhlbHAuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkRvbmUiPjxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPjwvaXRlbT4KLTwvY2hlYXRzaGVldD4KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2FwcGx5Y2FwYWJpbGl0eXBhdHRlcm4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2FwcGx5Y2FwYWJpbGl0eXBhdHRlcm4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTg1NDM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9hcHBseWNhcGFiaWxpdHlwYXR0ZXJuLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08Y2hlYXRzaGVldCB0aXRsZT0iQXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm4iPgotCi0JPGludHJvIAotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCI+Ci0JCTxkZXNjcmlwdGlvbj5XaGVuIGRldmVsb3BpbmcgYSBwcm9jZXNzIHlvdSBkbyBub3QgbmVlZCB0byB3b3JrIGZyb20gc2NyYXRjaCBieSBjcmVhdGluZyBhY3Rpdml0aWVzIGFuZCBkZXNjcmlwdG9ycyBvbmUgYnkgb25lLiAgVGhpcyBjaGVhdCBzaGVldCB3YWxrcyB5b3UgdGhyb3VnaCBhcHBseWluZyBwcmUtZGVmaW5lZCBjYXBhYmlsaXR5IHBhdHRlcm5zIG9yIGV2ZW4gY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MgcGFydHMgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIHlvdXIgcHJvY2Vzcy48YnIvPjxici8+QSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgYSBzcGVjaWFsIHByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGFjdGl2aXRpZXMgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgcGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIGRpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IGEgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIGRlbGl2ZXJ5IHByb2Nlc3NlcyBvciBsYXJnZXIgY2FwYWJpbGl0eSBwYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuIFlvdSBjYW4gYXBwbHkgdGhlIHNhbWUgcGF0dGVybiBzZXZlcmFsIHRpbWVzIHRvIHRoZSBzYW1lIHByb2Nlc3MgYW5kIGRlZmluZSBsb2NhbCBtb2RpZmljYXRpb25zIHRvIGVhY2ggaW5kaXZpZHVhbCBwYXR0ZXJuIGFwcGxpY2F0aW9uLiBUaGlzIGFsbG93cyB5b3UgdG8gZXhwcmVzcyBzcGVjaWZpYyBjaGFuZ2VzIGVhY2ggdGltZSB0aGUgcGF0dGVybiBpcyBiZWluZyBwZXJmb3JtZWQgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSBhIHByb2Nlc3MgcmVwcmVzZW50cy48L2Rlc2NyaXB0aW9uPgotCTwvaW50cm8+Ci0KLQk8aXRlbQotCQl0aXRsZT0iRmluZCBhbiBBY3Rpdml0eSB0byB3aGljaCBhIFBhdHRlcm4gd2lsbCBiZSBBcHBsaWVkIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5HaXZlbiB0aGF0IHlvdSBoYXZlIGFscmVhZHkgb3BlbmVkIHlvdXIgcHJvY2VzcyBpbiB0aGUgcHJvY2VzcyBlZGl0b3IsIHN3aXRjaCB0byB0aGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlIHRhYiBhbmQgcmV2aWV3IHlvdXIgcHJvY2Vzcy4gRmluZCB0aGUgbG9jYXRpb24gd2hlcmUgeW91IHdhbnQgdG8gYXBwbHkgYSBjYXBhYmlsaXR5IHBhdHRlcm4uIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGhhcyB0byBiZSBhcHBsaWVkIHRvIG9uZSBzcGVjaWZpYyBhY3Rpdml0eSAoaW5jbHVkaW5nIGl0ZXJhdGlvbiBvciBwaGFzZSB3aGljaCBhcmUgc3BlY2lhbCBhY3Rpdml0aWVzKSBpbiBhIHByb2Nlc3MuIFN1Y2ggYW4gYWN0aXZpdHkgY2FuIGVpdGhlciBiZSBkZWZpbmVkIGxvY2FsbHkgaW4gdGhlIHByb2Nlc3MgKHByZXNlbnRlZCBhcyBhIG5hbWUgaW4gYSBzdGFuZGFyZCBibGFjayBmb250KSBvciBhbiBhY3Rpdml0eSB3aGljaCBoYWQgYmVlbiBhZGRlZCB0byB0aGUgcHJvY2VzcyBieSBhcHBseWluZyBhbm90aGVyIGNhcGFiaWxpdHkgcGF0dGVybiAocHJlc2VudGVkIGFzIGEgbmFtZSBpbiBhIGdyZWVuLWl0YWxpYyBmb250KS48YnIvPjxici8+SWYgeW91IHdhbnQgdG8gYXBwbHkgYSBwYXR0ZXJuIHRvIGEgbG9jYWwgYWN0aXZpdHkgKGJsYWNrIGZvbnQpLCBnbyB0byBzdGVwICJTZWxlY3QgYSBDYXBhYmlsaXR5IFBhdHRlcm4gaW4gdGhlIENvbmZpZ3VyYXRpb24gVmlldyIuIElmIHlvdSB3YW50IHRvIGFwcGx5IGEgcGF0dGVybiB0byBhbiBhY3Rpdml0eSBmcm9tIGFub3RoZXIgcGF0dGVybiAoZ3JlZW4gaXRhbGljIGZvbnQpLCBwbGVhc2UgZ28gdG8gc3RlcCAiQ29udHJpYnV0ZSB0byBhbiBBY3Rpdml0eSBmcm9tIEFub3RoZXIgUGF0dGVybiIuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iQ29udHJpYnV0ZSB0byBhbiBBY3Rpdml0eSBmcm9tIEFub3RoZXIgUGF0dGVybiIKLQkJc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5Pbmx5IGlmIHlvdSB3YW50IHRvIGFwcGx5IGEgcGF0dGVybiB0byBhbiBhY3Rpdml0eSBmcm9tIGFub3RoZXIgcGF0dGVybiAocmVjb2duaXphYmxlIGJ5IHRoZSBncmVlbiBpdGFsaWMgZm9udCkgdGhlbiB5b3UgbmVlZCB0byBjcmVhdGUgYW4gYWN0aXZpdHkgY29udHJpYnV0aW9uLCB3aGljaCBhbGxvd3MgeW91IHRvIG1ha2UgbG9jYWwgY2hhbmdlcyB0byB0aGUgYWN0aXZpdHkuPGJyLz48YnIvPkZpbmQgdGhlIGFjdGl2aXR5J3MgcGFyZW50IGVsZW1lbnQuIElmIHRoaXMgZWxlbWVudCBpcyBhIG5vdCBhIGxvY2FsIGVsZW1lbnQgKGdyZWVuIGl0YWxpYyBmb250KSB0aGVuIHlvdSBmaXJzdCBuZWVkIGNyZWF0ZSBhIGNvbnRyaWJ1dGlvbiB0byB0aGlzIHBhcmVudCBhbmQgc28gb24gKGlmIHRoZSBwYXJlbnQncyBwYXJlbnQgaXMgbm90IGxvY2FsIHRoZW4gY3JlYXRlIGEgY29udHJpYnV0aW9uIHRvIHRoZSBwYXJlbnQncyBwYXJlbnQgZmlyc3QsIGV0Yy4pIDxici8+PGJyLz5UbyBjcmVhdGUgYSBjb250cmlidXRpb24gdG8gYSBub24tbG9jYWwgYWN0aXZpdHksIHJpZ2h0LWNsaWNrIHRoZSBub24tbG9jYWwgYWN0aXZpdHkgYW5kIHRoZW4gY2xpY2sgIkNvbnRyaWJ1dGUiLiBEbyB0aGlzIHdpdGggYWxsIHBhcmVudHMgdG9wLWRvd24gdW50aWwgeW91IHJlYWNoIHRoZSBhY3Rpdml0eSB0byB3aGljaCB5b3Ugd2FudCB0byBhcHBseSB0aGUgcGF0dGVybi4gT25jZSB5b3UgY2xpY2tlZCAiQ29udHJpYnV0ZSIsIHRoZSBhY3Rpdml0eSBiZWNvbWUgbG9jYWwgYW5kIGlzIHByZXNlbnRlZCB3aXRoIGEgc3RhbmRhcmQgYmxhY2sgZm9udC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25maWd1cmF0aW9udmlldy5odG1sIiAKLQkJdGl0bGU9IlNlbGVjdCBhIENhcGFiaWxpdHkgUGF0dGVybiBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5GaW5kIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcuIEV4cGFuZCB0aGUgcGFja2FnZSAiUHJvY2Vzc2VzIC0mZ3Q7IENhcGFiaWxpdHkgUGF0dGVybnMiIGFzIHdlbGwgYXMgaXRzIHN1Yi1wYWNrYWdlcy4gU2VsZWN0IHRoZSBwYXR0ZXJuIHlvdSB3YW50IHRvIGFwcGx5IHRvIHlvdXIgcHJvY2Vzcy48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCXRpdGxlPSJBcHBseSB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIENhcGFiaWxpdHkgUGF0dGVybnMgQWN0aXZpdHkiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPllvdSBjYW4gYXBwbHkgZWl0aGVyIHRoZSB3aG9sZSBjYXBhYmlsaXR5IHBhdHRlcm4gdG8geW91ciBwcm9jZXNzIG9yIGp1c3Qgb25lIG9yIG1vcmUgYWN0aXZpdGllcyBmcm9tIGl0LiBUbyBhcHBseSB0aGUgd2hvbGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGRyYWcgdGhlIHBhdHRlcm4gb3ZlciB0aGUgYWN0aXZpdHkgc2VsZWN0ZWQgZWFybGllciBpbiB5b3VyIHByb2Nlc3MuIFRvIGFwcGx5IG9uZSBvciBtb3JlIGFjdGl2aXRpZXMgb2YgdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBzZWxlY3QgdGhlbSBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3LiBZb3UgY2FuIG11bHRpIHNlbGVjdCBieSBwcmVzc2luZyBjdHJsICsgc2VsZWN0LCBvciBzaGlmdCArIHNlbGVjdCB0byBjYXB0dXJlIGFuIGFsbC1pbmNsdXNpdmUgc2VjdGlvbi48YnIvPjxici8+RHJhZyB0aGVtIHRvIHRoZSBhY3Rpdml0eSBzZWxlY3RlZCBlYXJsaWVyIGluIHlvdXIgcHJvY2Vzcy4gQWZ0ZXIgZHJhZ2dpbmcgdGhlIHBhdHRlcm4gb3IgYWN0aXZpdGllcyB5b3Ugd2lsbCBiZSBwcm9tcHRlZCB5b3UgdG8gYXBwbHkgdGhlIHBhdHRlcm4vYWN0aXZpdGllcyB2aWEgRXh0ZW5kcyAoZHluYW1pYyBiaW5kaW5nKSBvciBDb3B5IChTZWUgdGhlIG9ubGluZSBoZWxwIHNlY3Rpb24gIlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3IiBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZXNlIHR3byBjaG9pY2VzKS4gTWFrZSB5b3VyIGNob2ljZSBieSBjbGlja2luZy48YnIvPjxici8+QXMgYW4gYWx0ZXJuYXRpdmUgdG8gZHJhZ2dpbmcgdGhlIGNhcGFiaWxpdHkgcGF0dGVybiB5b3UgY2FuIGFsc28gcmlnaHQtY2xpY2sgdGhlIGFjdGl2aXR5IHRvIHdoaWNoIHlvdSB3YW50IHRvIGFwcGx5IHRoZSBwYXR0ZXJuIGFuZCBzZWxlY3QgdGhlIG1lbnUgb3B0aW9uICJBcHBseSBQYXR0ZXJuIC0mZ3Q7IENvcHkuLi4iIG9yICJBcHBseSBQYXR0ZXJuIC0mZ3Q7IEV4dGVuZC4uLiI8L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQkKLQk8aXRlbQotCQl0aXRsZT0iTWFrZSBMb2NhbCBDaGFuZ2VzIHRvIGEgUGF0dGVybiBBcHBsaWNhdGlvbiIKLQkJc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5JZiB5b3UgYXBwbGllZCB0aGUgcGF0dGVybiB2aWEgY29weSwgeW91IGNhbiBmcmVlbHkgbWFrZSBtb2RpZmljYXRpb25zIHRvIHRoZSBjb3BpZWQgZWxlbWVudHMuIElmIHlvdSBhcHBsaWVkIHRoZSBwYXR0ZXJuIHZpYSBleHRlbmRzIChkeW5hbWljIGJpbmRpbmcpIHlvdSBjYW4gc3RpbGwgcHJvdmlkZSBsb2NhbCBhZGRpdGlvbnMgdG8gdGhlIHBhdHRlcm4gYnkgZGVmaW5pbmcgYSBjb250cmlidXRpb24gdG8gdGhlIHBhdHRlcm4ncyBhY3Rpdml0aWVzLiBGb2xsb3cgdGhlIGluc3RydWN0aW9ucyBvZiB0aGUgc3RlcCAiQ29udHJpYnV0ZSB0byBhbiBBY3Rpdml0eSBmcm9tIEFub3RoZXIgUGF0dGVybiIgYWJvdmUgdG8gZGVmaW5lIHN1Y2ggYSBjb250cmlidXRpb24uIEFmdGVyIHlvdSBjcmVhdGUgdGhlIGxvY2FsIGFjdGl2aXR5IGNvbnRyaWJ1dGlvbiwgeW91IGNhbiBhZGQgYWRkaXRpb25hbCBkZXNjcmlwdG9ycyBvciBwYXR0ZXJucyB0byB0aGlzIGFjdGl2aXR5LjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCQotCTxpdGVtCi0JCXRpdGxlPSJTdXBwcmVzcyBQYXR0ZXJuIEVsZW1lbnRzIgotCQlza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPllvdSBjYW4gc3VwcHJlc3MgZWxlbWVudHMgc3VjaCBhcyBkZXNjcmlwdG9ycyBvciBhY3Rpdml0aWVzIG9mIGEgZHluYW1pY2FsbHkgYm91bmRzIHBhdHRlcm4gKHZpYSBleHRlbmRzKSBieSByaWdodCBjbGlja2luZyBhbmQgc2VsZWN0aW5nICJTdXBwcmVzcyIgZnJvbSB0aGUgY29udGV4dCBtZW51LjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJEb25lIj48ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj48L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvY3JlYXRlYXByb2Nlc3MueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZWFwcm9jZXNzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRjNzk1My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvY3JlYXRlYXByb2Nlc3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxjaGVhdHNoZWV0IHRpdGxlPSJDcmVhdGUgYSBQcm9jZXNzIChDYXBhYmlsaXR5IFBhdHRlcm4gb3IgRGVsaXZlcnkgUHJvY2VzcykiPgotCi0JPGludHJvIAotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiPgotCQk8ZGVzY3JpcHRpb24+VGhpcyBjaGVhdCBzaGVldCBndWlkZXMgeW91IHRocm91Z2ggdGhlIHN0ZXBzIG9mIGNyZWF0aW5nIGEgUHJvY2Vzcy4gVGhlcmUgYXJlIHR3byBtYWluIHR5cGVzIG9mIHByb2Nlc3NlczogQ2FwYWJpbGl0eSBQYXR0ZXJucyBhbmQgRGVsaXZlcnkgUHJvY2Vzc2VzLiBBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgQWN0aXZpdGllcyBpbiBjb21tb24gcHJvY2VzcyBhcmVhcywgd2hpbGUgYSBEZWxpdmVyeSBQcm9jZXNzIGRlc2NyaWJlcyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgdHlwZSBvZiBkZXZlbG9wbWVudCBwcm9qZWN0LiBTZWUgdGhlIG9ubGluZSBoZWxwIHNlY3Rpb24gIlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3IiBmb3IgbW9yZSBkZXRhaWxzLjwvZGVzY3JpcHRpb24+Ci0JPC9pbnRybz4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbi5odG1sIgotCQl0aXRsZT0iU2VsZWN0IG9yIENyZWF0ZSBhIERlZmF1bHQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZm9yIHlvdXIgUHJvY2VzcyIKLQkJc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3VyIHByb2Nlc3MgY2FuIGNvbnRhaW4gY29udGVudCBmcm9tIG1hbnkgZGlmZmVyZW50IG1ldGhvZCBwbHVnLWlucy4gVGhlIGNvbnRlbnQgZWxlbWVudHMgZnJvbSB0aGVzZSBwbHVnLWlucywgc3VjaCBhcyB0YXNrcyBvciB3b3JrIHByb2R1Y3RzLCBhcHBsaWVkIHRvIHlvdXIgcHJvY2VzcyB2aWEgZHJhZyBhbmQgZHJvcCwgY2FuIGhhdmUgbWFueSBjb250cmlidXRpb25zIG9yIHJlcGxhY2VtZW50cy4gU3VjaCBjb250cmlidXRpb25zIG9yIHJlcGxhY2VtZW50cyBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhhdCBuZWVkIHRvIGJlIGNvbnNpZGVyZWQgZm9yIGNyZWF0aW5nIHRoZSBwcm9jZXNzIGVsZW1lbnRzIHdpdGggdGhlaXIgbWlycm9yZWQgc2V0IG9mIHJlbGF0aW9uc2hpcHMuPGJyLz48YnIvPkZvciB0aGF0IHJlYXNvbiB5b3UgbmVlZCB0byBkZWZpbmUgYSBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgdmlzaWJsZSBzZXQgb2YgZWxlbWVudHMgYW5kIHJlbGF0aW9uc2hpcHMgd2hlbiB0aGUgcHJvY2VzcyBpcyBhdXRob3JlZC4gVGhpcyBwcm9jZXNzIGF1dGhvcmluZyBjb25maWd1cmF0aW9uIGlzIHJlZmVycmVkIHRvIGFzIHRoZSAiRGVmYXVsdCBDb25maWd1cmF0aW9uIiBmb3IgdGhlIHByb2Nlc3MgYW5kIHNob3VsZCBkZWZpbmUgdGhlIGxhcmdlc3QgcmVhc29uYWJsZSBzZXQgb2YgbWV0aG9kIHBsdWctaW5zLCBjb250ZW50IHBhY2thZ2VzLCBhbmQgb3RoZXIgcHJvY2Vzc2VzIGZyb20gdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2lsbCBiZSByZWZlcnJlZCB0byBieSB0aGUgcHJvY2VzcyBhdCBzb21lIHBvaW50Ljxici8+PGJyLz5JbiBhZGRpdGlvbiB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLCBhIHByb2Nlc3MgY2FuIGJlIGxpbmtlZCB0byBtYW55IGFkZGl0aW9uYWwgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIHRoYXQgaGF2ZSBiZWVuIHZlcmlmaWVkIHRvIGFsc28gcHJvZHVjZSB2YWxpZCByZXN1bHRzLiBIb3dldmVyLCBhbGwgb3RoZXIgdmFsaWQgY29uZmlndXJhdGlvbnMgbmVlZCB0byBkZWZpbmUgc3ViLXNldHMgb2YgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbi4gIEluIG90aGVyIHdvcmRzLCBpdCBpcyBub3QgcG9zc2libGUgdG8gbGluayBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHRvIGEgcHJvY2VzcyB0aGF0IHJlZmVycyB0byBlbGVtZW50cyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLCBiZWNhdXNlIHN1Y2ggZWxlbWVudHMgd2VyZSBub3QgY29uc2lkZXJlZCB3aGVuIHRoZSBwcm9jZXNzIHdhcyBjcmVhdGVkLjxici8+PGJyLz5Qcm9jZXNzIGVsZW1lbnRzIHRoYXQgcmVmZXIgdG8gY29udGVudCBwYWNrYWdlcyB0aGF0IGFyZSBkZWZpbmVkIG91dHNpZGUgdGhlIHNjb3BlIG9mIHN1Y2ggYSBjb25maWd1cmF0aW9uIHdpbGwgbm90IGJlIHNob3duIGluIHRoZSBwcm9jZXNzIHdoZW4gcHVibGlzaGVkIG9yIHVzZWQgdW5kZXIgc3VjaCBhIGNvbmZpZ3VyYXRpb24uIFRoaXMgYWxsb3dzIHlvdSB0byBlYXNpbHkgaGlkZSBjb250ZW50IGZyb20gYSBwcm9jZXNzIGJ5IG1vdmluZyBjb250ZW50IHBhY2thZ2VzIGluIG9yIG91dCBvZiB0aGUgcmVsYXRlZCBjb25maWd1cmF0aW9uLjxici8+PGJyLz5UaGVyZWZvcmUsIGJlZm9yZSB5b3Ugc3RhcnQgY3JlYXRpbmcgYSBwcm9jZXNzLCByZXZpZXcgeW91ciBsaXN0IG9mIGNvbmZpZ3VyYXRpb25zIGluIHRoZSBsaWJyYXJ5IHZpZXcgYW5kIGRlY2lkZSB3aGljaCBjb25maWd1cmF0aW9uIHlvdSBhcmUgZ29pbmcgdG8gdXNlLiAgSWYgbmVjZXNzYXJ5LCBvcGVuIGNvbmZpZ3VyYXRpb25zIGFuZCBleGFtaW5lIHRoZWlyIHNwZWNpZmljYXRpb24uIElmIHlvdSBkbyBub3QgZmluZCBhIGZpdHRpbmcgY29uZmlndXJhdGlvbiB0aGF0IGRlZmluZXMgdGhlIHJpZ2h0IHNldCBvZiBlbGVtZW50cywgY3JlYXRlIGEgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcHJvY2VzcyBhbmQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gc2VlIHRoZSBzZWN0aW9uICJQcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldyIgaW4gdGhlIG9ubGluZSBoZWxwLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCIKLQkJdGl0bGU9IkNob29zZSBhIE1ldGhvZCBQbHVnLWluIHRvIEhvbGQgeW91ciBQcm9jZXNzIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5TaW5jZSB5b3UgY2Fubm90IGFkZCBwcm9jZXNzZXMgdG8gd3JpdGUtbG9ja2VkIHRoaXJkLXBhcnR5IG1ldGhvZCBwbHVnLWlucyB5b3VyIHByb2Nlc3MgbmVlZHMgdG8gYmUgY3JlYXRlZCBpbiBvbmUgb2YgeW91ciBvd24gbWV0aG9kIHBsdWctaW5zLiBUaGVyZWZvcmUsIGl0IGlzIGJlc3QgdG8gY3JlYXRlIHlvdXIgcHJvY2VzcyB3aXRoaW4gdGhlIHBsdWctaW4gaW4gd2hpY2ggaXQgaXMgZ29pbmcgdG8gYmUgdXNlZC4gRm9yIGluc3RhbmNlLCBpZiB5b3Ugd2FudCB0byBkZXZlbG9wIGEgc2V0IG9mIGNhcGFiaWxpdHkgcGF0dGVybnMgdG8gdXNlIHRvIGFzc2VtYmxlIGEgZGVsaXZlcnkgcHJvY2VzcywgdHJ5IHRvIG1haW50YWluIGFsbCBvZiB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJucyBpbiB0aGUgc2FtZSBtZXRob2QgcGx1Zy1pbi48YnIvPjxici8+SWYgeW91IGhhdmUgbm90IGNyZWF0ZWQgYSBtZXRob2QgcGx1Zy1pbiwgZ28gdG8gdGhlICJDcmVhdGUgeW91ciBvd24gTWV0aG9kIFBsdWctaW4iIGNoZWF0IHNoZWV0Ljxici8+PGJyLz5JbiB0aGUgbGlicmFyeSB2aWV3LCBzZWxlY3QgYSBwbHVnLWluIGZyb20gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG1ldGhvZCBwbHVnLWlucy4gSWNvbnMgdGhhdCBhcHBlYXIgdG8gYmUgZ3JheWVkLW91dCBoYXZlIGJlZW4gbG9ja2VkIGZvciBtb2RpZmljYXRpb24gYW5kIGNhbm5vdCBiZSB1c2VkLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3MuaHRtbCIgCi0JCXRpdGxlPSJGaW5kIG9yIENyZWF0ZSBhIFByb2Nlc3MgUGFja2FnZSIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+UHJvY2Vzc2VzIGNhbiBiZSBvcmdhbml6ZWQgd2l0aCBwcm9jZXNzIHBhY2thZ2VzIHRvIGluY3JlYXNlIG1haW50YWluYWJpbGl0eSBhbmQgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIHRoZSBwcm9jZXNzIHVzZXIgdG8gYnJvd3NlIGFuZCBmaW5kIHRoZW0uIFBsZWFzZSBiZSBhd2FyZSB0aGF0IHlvdSBjYW4gY3JlYXRlIGNhcGFiaWxpdHkgcGF0dGVybnMgb25seSBpbiBhIGNhcGFiaWxpdHkgcGF0dGVybnMgcGFja2FnZSBvciBzdWItcGFja2FnZSBhbmQgZGVsaXZlcnkgcHJvY2Vzc2VzIG9ubHkgaW4gYSBkZWxpdmVyeSBwcm9jZXNzIHBhY2thZ2Ugb3Igc3ViLXBhY2thZ2UuPGJyLz48YnIvPlVzaW5nIHRoZSBsaWJyYXJ5IHZpZXcsIHJldmlldyB0aGUgc3RydWN0dXJlIG9mIHByb2Nlc3MgcGFja2FnZXMgYXZhaWxhYmxlIGluIHRoZSBtZXRob2QgcGx1Zy1pbiB0aGF0IHlvdSBzZWxlY3RlZCBvciBjcmVhdGVkIGluIHRoZSBsYXN0IHN0ZXAgYW5kIHRoZW4gc2VsZWN0IG9uZSBvZiB0aGUgcGFja2FnZXMgcHJlc2VudCBhcyBhIGNvbnRhaW5lciBmb3IgeW91ciBwcm9jZXNzLiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGNyZWF0ZSBhIG5ldyBQcm9jZXNzIFBhY2thZ2UgYnkgcmlnaHQtY2xpY2tpbmcgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcyBwYWNrYWdlIG9yIHN1Yi1wYWNrYWdlIGFuZCB0aGVuIGNsaWNraW5nIE5ldyAtJmd0OyBQcm9jZXNzIFBhY2thZ2UuIEluIHRoZSBkaWFsb2cgYm94IHRoYXQgYXBwZWFycywgc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSBhbmQgdGhlbiBjbGljayBPSy48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybi5odG1sIiAKLQkJdGl0bGU9IkNyZWF0ZSB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIERlbGl2ZXJ5IFByb2Nlc3MiCi0JCXNraXA9ImZhbHNlIj4JCi0JCTxkZXNjcmlwdGlvbj5UbyBjcmVhdGUgYSBuZXcgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3M6IFJpZ2h0IGNsaWNrIHRoZSBzZWxlY3RlZCBvciBuZXdseSBjcmVhdGVkIHByb2Nlc3MgcGFja2FnZSBhbmQgdGhlbiBjbGljayBOZXcgLSZndDsgQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIE5ldyAtJmd0OyBEZWxpdmVyeSBQcm9jZXNzLiAgSW4gdGhlIGRpYWxvZyBib3ggdGhhdCBhcHBlYXJzLCBzcGVjaWZ5IHRoZSBwcm9jZXNzIG5hbWUgYW5kIGRlZmF1bHQgY29uZmlndXJhdGlvbiBhbmQgdGhlbiBjbGljayBPSy4gVGhlIHByb2Nlc3MgaXMgY3JlYXRlZCBhbmQgdGhlIGVkaXRvciBpcyBvcGVuZWQuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JCi0JPGl0ZW0KLQkJdGl0bGU9IkRvY3VtZW50IHlvdXIgUHJvY2VzcyIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+V2l0aCB0aGUgcHJvY2VzcyBlZGl0b3Igb3BlbmVkIGluIHRoZSBEZXNjcmlwdGlvbiB0YWIsIGRvY3VtZW50IHlvdXIgcHJvY2VzcyB1c2luZyB0aGUgYXZhaWxhYmxlIHRleHQgZmllbGRzLiAgQXQgYSBtaW5pbXVtIHByb3ZpZGUgYSBwcmVzZW50YXRpb24gbmFtZSBhbmQgYSBicmllZiBkZXNjcmlwdGlvbiBmb3IgeW91ciBwcm9jZXNzLiAgU2VlIHRoZSBvbmxpbmUgaGVscCBmb3IgZGVmaW5pdGlvbnMgb2YgZWFjaCBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiBmaWVsZC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQkKLTxpdGVtCi0JCXRpdGxlPSJEZWNpZGUgb24geW91ciBQcmltYXJ5IFByb2Nlc3MgQXV0aG9yaW5nIFZpZXciCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPllvdSBjYW4gZGV2ZWxvcCBhIHByb2Nlc3MgZnJvbSB0aHJlZSBkaWZmZXJlbnQgdmlld3M6PGJyLz48YnIvPkJyZWFrZG93biBTdHJ1Y3R1cmU6ICBDcmVhdGUgeW91ciBwcm9jZXNzIGJ5IGRlZmluaW5nIGEgd29yayBicmVha2Rvd24gc3RydWN0dXJlLiAgQ3JlYXRlIGl0ZXJhdGlvbnMgYW5kIGFjdGl2aXRpZXMgZmlyc3QgYW5kIHRoZW4gcG9wdWxhdGUgeW91ciBhY3Rpdml0aWVzIGJ5IGVpdGhlciBhcHBseWluZyB0YXNrcyBmcm9tIHlvdXIgbWV0aG9kIGNvbnRlbnQgb3IgYXBwbHlpbmcgY2FwYWJpbGl0eSBwYXR0ZXJucy4gR28gdG8gc3RlcCAiRGV2ZWxvcCB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlIiB0byB3b3JrIHdpdGggdGhpcyB2aWV3Ljxici8+PGJyLz5UZWFtIEFsbG9jYXRpb246IENyZWF0ZSB5b3VyIHByb2Nlc3MgYnkgZGVmaW5pbmcgd2hpY2ggdGVhbXMgYW5kIHJvbGVzIHNoYWxsIHBhcnRpY2lwYXRlIGluIGFjdGl2aXRpZXMgYW5kIGZpbmRpbmcgcmVzcG9uc2libGUgd29yayBwcm9kdWN0cyBhbmQgdGFza3MgZnJvbSB0aGVyZS4gIEdvIHRvIHN0ZXAgIkRldmVsb3AgdGhlIFRlYW0gQWxsb2NhdGlvbiBTdHJ1Y3R1cmUiIHRvIHdvcmsgd2l0aCB0aGlzIHZpZXcuPGJyLz48YnIvPldvcmsgUHJvZHVjdCBVc2FnZTogQ3JlYXRlIHlvdXIgcHJvY2VzcyBieSBkZWZpbmluZyB3aGljaCB3b3JrIHByb2R1Y3RzIHNob3VsZCBiZSBjcmVhdGVkIGluIGFjdGl2aXRpZXMgYW5kIGZpbmRpbmcgdGFza3MgYW5kIHJvbGVzIGZyb20gdGhlcmUuIEdvIHRvIHN0ZXAgIkRldmVsb3AgV29yayBQcm9kdWN0IFVzYWdlIFN0cnVjdHVyZSIgdG8gd29yayB3aXRoIHRoaXMgdmlldy48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbCIgCi0JCXRpdGxlPSJEZXZlbG9wIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUiCi0JCXNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+QmVmb3JlIHlvdSBzdGFydCwgZW5zdXJlIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBzZWxlY3RlZCBpbiB0aGUgdG9vbCBiYXIgaXMgdGhlIHNhbWUgYXMgdGhlIGNvbmZpZ3VyYXRpb24geW91IHNlbGVjdGVkIGFzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHlvdXIgcHJvY2Vzcy48YnIvPjxici8+VG8gYWNjZXNzIHRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgZWRpdG9yLCBzZWxlY3QgdGhlICJXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUiIHRhYiBpbiB0aGUgcHJvY2VzcyBlZGl0b3IuPGJyLz48YnIvPlJpZ2h0LWNsaWNrIHRoZSBlbGVtZW50IGluIHRoZSBmaXJzdCByb3cgb2YgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIHRoZW4gY2xpY2sgTmV3IENoaWxkIC0mZ3Q7IEFjdGl2aXR5IHRvIGNyZWF0ZSBhIG5ldyBhY3Rpdml0eS4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBjcmVhdGUgYSBwaGFzZSBvciBpdGVyYXRpb24sIGRlcGVuZGluZyBvbiB0aGUgc2NvcGUgb2YgeW91ciBwcm9jZXNzLiBJZiBuZWVkZWQsIGNyZWF0ZSBtb3JlIGFjdGl2aXRpZXMgdG8gc2V0LXVwIHlvdXIgYnJlYWtkb3duIHN0cnVjdHVyZS4gQWN0aXZpdGllcyBjYW4gYmUgbmVzdGVkIGluc2lkZSBlYWNoIG90aGVyLjxici8+PGJyLz5SZXZpZXcgdGhlIGxpc3Qgb2YgdGFza3MgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldy4gSW4gdGhpcyB2aWV3IHRhc2tzIGFyZSBzb3J0ZWQgYnkgZGlzY2lwbGluZS4gRHJpbGwgaW50byB0aGUgZGlzY2lwbGluZXMgaGllcmFyY2h5IHRvIHNlZSB3aGljaCB0YXNrcyBhcmUgYXZhaWxhYmxlIGluIHRoaXMgY29uZmlndXJhdGlvbi4gU2VsZWN0IGEgdGFzayB0aGF0IHlvdSB3YW50IHRvIGFkZCB0byB5b3VyIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIGRyYWcgaXQgb24gdG9wIG9mIG9uZSBvZiB0aGUgYWN0aXZpdGllcyB5b3UganVzdCBjcmVhdGVkLiBUaGUgdGFzayBpcyBhZGRlZCBhcyBhIHNvLWNhbGxlZCB0YXNrIGRlc2NyaXB0b3IgKGFuIG9jY3VycmVuY2Ugb2YgYSB0YXNrIGluIG9uZSBzcGVjaWZpYyBhY3Rpdml0eSkuPGJyLz48YnIvPlJldmlldyB0aGUgdGFzayBkZXNjcmlwdG9yJ3MgZGV0YWlscyBpbiBpdHMgcHJvcGVydGllcyB2aWV3LiBJZiB0aGUgcHJvcGVydGllcyB2aWV3IGlzIG5vdCBkaXNwbGF5ZWQgdGhlbiBzZWxlY3QgdGhlIHRhc2sgaW4gdGhlIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3IsIHJpZ2h0LWNsaWNrLCBhbmQgc2VsZWN0ICJQcm9wZXJ0aWVzIi4gVXNlIHRoZSB0YWJzIG9uIHRoZSBzaWRlIG9mIHRoZSBwcm9wZXJ0aWVzIHZpZXcgdG8gcmV2aWV3IGRpZmZlcmVudCBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0b3IuPGJyLz48YnIvPlBlcmZvcm0gaW5kaXZpZHVhbCBtb2RpZmljYXRpb25zIG9mIHRoZSB0YXNrIGRlc2NyaXB0b3IgaW4gdGhlIHByb3BlcnRpZXMgdmlldy4gIEZvciBleGFtcGxlLCB5b3UgY2FuIGNoYW5nZSB0aGUgcHJlc2VudGF0aW9uIG5hbWUsIGFkZCB0ZXh0dWFsIGRlc2NyaXB0aW9ucywgY2hhbmdlIHBlcmZvcm1pbmcgcm9sZXMsIGNoYW5nZSB0aGUgaW5wdXRzIGFuZCBvdXRwdXRzLCBldGMuIFdoZW4gY2hhbmdpbmcgdGhlIHRhc2sgZGVzY3JpcHRvcidzIHJlbGF0aW9uc2hpcHMgaW4gdGhlIHByb3BlcnR5IHdpbmRvdyB0YWJzIHJvbGVzIG9yIHdvcmsgcHJvZHVjdHMsIHlvdSBjYW4gZWl0aGVyIGFkZCBuZXcgZWxlbWVudHMgZnJvbSB5b3VyIG1ldGhvZCBjb250ZW50IGJ5IHVzaW5nIHRoZSAnQWRkLi4nIGJ1dHRvbiBvciBjb25uZWN0IHlvdXIgdGFzayBkZXNjcmlwdG9yIHdpdGggdGFza3MgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgYWN0aXZpdHkuPGJyLz48YnIvPkluc3RlYWQgb2YgZHJhZ2dpbmcgdGFzayBvbmUgYnkgb25lIHlvdSBjYW4gYWxzbyBhcHBseSB3aG9sZSBjYXBhYmlsaXR5IHBhdHRlcm5zIG9yIGFjdGl2aXRpZXMgZnJvbSBvdGhlciBwcm9jZXNzZXMgYXZhaWxhYmxlIGluIHlvdXIgY3VycmVudCBtZXRob2QgY29uZmlndXJhdGlvbi4gIFNlbGVjdCBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBhbnkgYWN0aXZpdHkgb2Ygc3VjaCBhIHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcyBhdmFpbGFibGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldyBhbmQgZHJhZyBpdCBvbiB0b3Agb2YgYW4gYWN0aXZpdHkgd2l0aGluIHlvdXIgcHJvY2VzcyBicmVha2Rvd24gaW4gdGhlIHByb2Nlc3MgZWRpdG9yLiAoRmluZCBhIGRldGFpbGVkIHdhbGt0aHJvdWdoIHRvIGFwcGx5aW5nIGNhcGFiaWxpdHkgcGF0dGVybiBpbiB0aGUgY2hlYXQgc2hlZXQgIkFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIi4pPGJyLz48YnIvPkNvbnRpbnVlIGFkZGluZyBtb3JlIHRhc2tzLCBhY3Rpdml0aWVzIG9yIHBhdHRlcm5zIHRvIHlvdXIgYWN0aXZpdGllcyBvciBzd2l0Y2ggdG8gdGhlIHRlYW0gYWxsb2NhdGlvbiB0YWIgdG8gYWRkIHJvbGVzIG9yIHRvIHRoZSB3b3JrIHByb2R1Y3QgdXNhZ2UgdGFiIHRvIGFkZCB3b3JrIHByb2R1Y3RzLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi08aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZS5odG1sIiAKLQkJdGl0bGU9IkRldmVsb3AgdGhlIFRlYW0gQWxsb2NhdGlvbiBTdHJ1Y3R1cmUiCi0JCXNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+QmVmb3JlIHlvdSBzdGFydCwgZW5zdXJlIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGVkIGluIHRoZSB0b29sIGJhciBpcyB0aGUgc2FtZSBhcyB0aGUgY29uZmlndXJhdGlvbiB5b3Ugc2VsZWN0ZWQgYXMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgeW91ciBwcm9jZXNzLjxici8+PGJyLz5JbiB0aGUgcHJvY2VzcyBlZGl0b3IsIGNsaWNrIHRoZSAiVGVhbSBBbGxvY2F0aW9uIiB0YWIgdG8gb3BlbiB0aGUgdGVhbSBhbGxvY2F0aW9uIGVkaXRvci48YnIvPjxici8+UmlnaHQtY2xpY2sgdGhlIGVsZW1lbnQgaW4gdGhlIGZpcnN0IHJvdyBvZiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgdGhlbiBjbGljayBOZXcgQ2hpbGQgLSZndDsgQWN0aXZpdHkgdG8gY3JlYXRlIGEgbmV3IGFjdGl2aXR5LiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGNyZWF0ZSBhIHBoYXNlIG9yIGl0ZXJhdGlvbiwgZGVwZW5kaW5nIG9uIHRoZSBzY29wZSBvZiB5b3VyIHByb2Nlc3MuIElmIG5lZWRlZCwgY3JlYXRlIG1vcmUgYWN0aXZpdGllcyB0byBzZXQtdXAgeW91ciBicmVha2Rvd24gc3RydWN0dXJlLiBBY3Rpdml0aWVzIGNhbiBiZSBuZXN0ZWQgaW5zaWRlIGVhY2ggb3RoZXIuPGJyLz48YnIvPllvdSBjYW4gYWRkIHJvbGVzIGRpcmVjdGx5IHRvIHlvdXIgYWN0aXZpdGllcyBub3cuIEluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcsIHJldmlldyB0aGUgbGlzdCBvZiByb2xlcy4gSW4gdGhpcyB2aWV3IHJvbGVzIGFyZSBvcmdhbml6ZWQgaW50byByb2xlIHNldHMuIERyaWxsIGludG8gdGhlIHJvbGUgc2V0cyBoaWVyYXJjaHkgdG8gc2VlIHdoaWNoIHJvbGVzIGFyZSBhdmFpbGFibGUgaW4gdGhpcyBjb25maWd1cmF0aW9uLiBTZWxlY3QgYSBSb2xlIHRoYXQgeW91IHdhbnQgdG8gYWRkIHRvIHlvdXIgYWN0aXZpdHkgYW5kIGRyYWcgaXQgb24gdG9wIG9mIHRoZSBhY3Rpdml0eSB5b3UgY3JlYXRlZCBlYXJsaWVyLiBUaGUgcm9sZSBpcyBhZGRlZCBhcyBhIHJvbGUgZGVzY3JpcHRvciAoYW4gb2NjdXJyZW5jZSBvZiBhIHJvbGUgaW4gb25lIHNwZWNpZmljIGFjdGl2aXR5KS48YnIvPjxici8+SWYgdGhlIHJvbGUgdGhhdCB5b3UganVzdCBkcmFnZ2VkIGhhcyByZXNwb25zaWJpbGl0eSByZWxhdGlvbnNoaXBzIHRvIHdvcmsgcHJvZHVjdHMgZGVmaW5lZCwgYSB3aXphcmQgYXBwZWFycyBwcm9tcHRpbmcgeW91IHRvIGFkZCBhbnkgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdG8gdGhlIHByb2Nlc3MuIFNlbGVjdCB6ZXJvIHRvIG1hbnkgd29yayBwcm9kdWN0cyBhbmQgdGhlbiBjbGljayBPSy48YnIvPjxici8+Rm9yIGVhY2ggc2VsZWN0ZWQgd29yayBwcm9kdWN0IHRoZSBuZXh0IHdpemFyZCB3aW5kb3cgcHJvbXB0cyB5b3UgdG8gc2VsZWN0IHRhc2tzIHRoYXQgcHJvZHVjZSB0aGVzZSB3b3JrIHByb2R1Y3RzLiBBZ2Fpbiwgc2VsZWN0IHplcm8gdG8gbWFueSB0YXNrcyBhbmQgdGhlbiBjbGljayBPSyB0byBhZGQgdGhlc2UgZWxlbWVudHMgdG8geW91ciBwcm9jZXNzLjxici8+PGJyLz5SZXZpZXcgdGhlIHJvbGUgZGVzY3JpcHRvcidzIGRldGFpbHMgaW4gaXRzIHByb3BlcnRpZXMgdmlldy4gSWYgdGhlIHByb3BlcnRpZXMgdmlldyBpcyBub3QgZGlzcGxheWVkIHRoZW4gc2VsZWN0IHRoZSByb2xlIGluIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvciwgcmlnaHQtY2xpY2ssIGFuZCBzZWxlY3QgIlByb3BlcnRpZXMiLiBVc2UgdGhlIHRhYnMgb24gdGhlIHNpZGUgb2YgdGhlIHByb3BlcnRpZXMgdmlldyB0byByZXZpZXcgZGlmZmVyZW50IGFzcGVjdHMgb2YgdGhlIHJvbGUgZGVzY3JpcHRvci4gWW91IGNhbiBhbHNvIHBlcmZvcm0gaW5kaXZpZHVhbCBtb2RpZmljYXRpb25zIG9mIHRoZSByb2xlIGRlc2NyaXB0b3IsIHN1Y2ggYXMgY2hhbmdlIHRoZSBwcmVzZW50YXRpb24gbmFtZSwgYWRkIHRleHR1YWwgZGVzY3JpcHRpb25zLCBjaGFuZ2Ugd29yayBwcm9kdWN0cyB0aGUgcm9sZSBpcyByZXNwb25zaWJsZSBmb3IsIGV0Yy48YnIvPjxici8+V2hlbiBjaGFuZ2luZyB0aGUgcm9sZSBkZXNjcmlwdG9y4oCZcyByZWxhdGlvbnNoaXBzIGluIHRoZSBwcm9wZXJ0eSB3aW5kb3cgdGFi4oCZcyByb2xlcyBvciB3b3JrIHByb2R1Y3RzLCB5b3UgY2FuIGFkZCBuZXcgZWxlbWVudHMgZnJvbSB5b3VyIG1ldGhvZCBjb250ZW50IGJ5IHVzaW5nIHRoZSAiQWRk4oCmIiBidXR0b24sIG9yIGNvbm5lY3QgeW91ciByb2xlIGRlc2NyaXB0b3Igd2l0aCB3b3JrIHByb2R1Y3RzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIGFjdGl2aXR5Ljxici8+PGJyLz5Db250aW51ZSBhZGRpbmcgbW9yZSByb2xlcyB0byB5b3VyIGFjdGl2aXRpZXMsIG9yIHN3aXRjaCB0byB0aGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlIHRhYiB0byBhZGQgdGFza3Mgb3IgdG8gdGhlIHdvcmsgcHJvZHVjdCB1c2FnZSB0YWIgdG8gYWRkIHdvcmsgcHJvZHVjdHMuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUuaHRtbCIgCi0JCXRpdGxlPSJEZXZlbG9wIHRoZSBXb3JrIFByb2R1Y3QgVXNhZ2UgU3RydWN0dXJlIgotCQlza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPkJlZm9yZSB5b3Ugc3RhcnQsIGVuc3VyZSB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3RlZCBpbiB0aGUgdG9vbCBiYXIgaXMgdGhlIHNhbWUgYXMgdGhlIGNvbmZpZ3VyYXRpb24geW91IHNlbGVjdGVkIGFzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHlvdXIgcHJvY2Vzcy48YnIvPjxici8+SW4gdGhlIHByb2Nlc3MgZWRpdG9yLCBjbGljayB0aGUgIldvcmsgUHJvZHVjdCBVc2FnZSIgdGFiIHRvIG9wZW4gdGhlIHdvcmsgcHJvZHVjdCB1c2FnZSBlZGl0b3IuPGJyLz48YnIvPlJpZ2h0LWNsaWNrIHRoZSBlbGVtZW50IGluIHRoZSBmaXJzdCByb3cgb2YgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIHRoZW4gY2xpY2sgTmV3IENoaWxkIC0mZ3Q7IEFjdGl2aXR5IHRvIGNyZWF0ZSBhIG5ldyBhY3Rpdml0eS4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBjcmVhdGUgYSBwaGFzZSBvciBpdGVyYXRpb24sIGRlcGVuZGluZyBvbiB0aGUgc2NvcGUgb2YgeW91ciBwcm9jZXNzLiBJZiBuZWVkZWQsIGNyZWF0ZSBtb3JlIGFjdGl2aXRpZXMgdG8gc2V0LXVwIHlvdXIgYnJlYWtkb3duIHN0cnVjdHVyZS4gQWN0aXZpdGllcyBjYW4gYmUgbmVzdGVkIGluc2lkZSBlYWNoIG90aGVyLjxici8+PGJyLz5SZXZpZXcgdGhlIGxpc3Qgb2Ygd29yayBwcm9kdWN0cyBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3LiBJbiB0aGlzIHZpZXcgd29yayBwcm9kdWN0cyBhcmUgc29ydGVkIGJ5IGRvbWFpbiBhcyB3ZWxsIGFzIHdvcmsgcHJvZHVjdCB0eXBlcy4gIERyaWxsIGludG8gZWl0aGVyIG9mIHRoZXNlIGhpZXJhcmNoaWVzIHRvIHNlZSB3aGljaCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUgaW4gdGhpcyBjb25maWd1cmF0aW9uLiBTZWxlY3QgYSB3b3JrIHByb2R1Y3QgeW91IHdhbnQgdG8gYWRkIHRvIGFuIGFjdGl2aXR5IGFuZCB0aGVuIGRyYWcgaXQgb24gdG9wIG9mIGFuIEFjdGl2aXR5IHRoYXQgeW91IGNyZWF0ZWQgZWFybGllci4gVGhlIHdvcmsgcHJvZHVjdCBpcyBhZGRlZCBhcyBhIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIChhbiBvY2N1cnJlbmNlIG9mIGEgd29yayBwcm9kdWN0IGluIG9uZSBzcGVjaWZpYyBhY3Rpdml0eSkuPGJyLz48YnIvPkFmdGVyIHlvdSBoYXZlIGFkZGVkIHRoZSB3b3JrIHByb2R1Y3QgdG8gdGhlIGFjdGl2aXR5LCBhIHdpemFyZCBwcm9tcHRzIHlvdSB0byBhZGQgdGFza3MgdGhhdCBwcm9kdWNlIHRoaXMgd29yayBwcm9kdWN0IHRvIHRoaXMgYWN0aXZpdHkuIFNlbGVjdCB6ZXJvIHRvIG1hbnkgdGFza3MgYW5kIHRoZW4gY2xpY2sgT0suIFRoZSB3aXphcmQgYWRkcyB0YXNrIGRlc2NyaXB0b3JzIGZvciBlYWNoIHNlbGVjdGVkIHRhc2sgdG8gdGhlIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZS48YnIvPjxici8+UmV2aWV3IHRoZSBuZXcgd29yayBwcm9kdWN0IGRlc2NyaXB0b3LigJlzIGRldGFpbHMgaW4gaXRzIHByb3BlcnRpZXMgdmlldy4gSWYgdGhlIHByb3BlcnRpZXMgdmlldyBpcyBub3QgZGlzcGxheWVkIHRoZW4gc2VsZWN0IHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBpbiB0aGUgcHJvY2VzcyBlZGl0b3IsIHJpZ2h0LWNsaWNrLCBhbmQgc2VsZWN0ICJQcm9wZXJ0aWVzIi4gVXNlIHRoZSB0YWJzIG9uIHRoZSBzaWRlIG9mIHRoZSBwcm9wZXJ0aWVzIHZpZXcgdG8gcmV2aWV3IGRpZmZlcmVudCBhc3BlY3RzIG9mIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvci4gWW91IGNhbiBhbHNvIHBlcmZvcm0gaW5kaXZpZHVhbCBtb2RpZmljYXRpb25zIG9mIHRoZSByb2xlIGRlc2NyaXB0b3IsIHN1Y2ggYXMgY2hhbmdlIHRoZSBwcmVzZW50YXRpb24gbmFtZSBhZGQgdGV4dHVhbCBkZXNjcmlwdGlvbnMsIGFkZCBlbnRyeSBhbmQgZXhpdCBzdGF0ZXMsIGV0Yy48YnIvPjxici8+V2hlbiBjaGFuZ2luZyB0aGUgcm9sZSBkZXNjcmlwdG9y4oCZcyByZWxhdGlvbnNoaXBzIGluIHRoZSBwcm9wZXJ0eSB3aW5kb3cgdGFi4oCZcyByb2xlcyBvciB3b3JrIHByb2R1Y3RzLCB5b3UgY2FuIGFkZCBuZXcgZWxlbWVudHMgZnJvbSB5b3VyIG1ldGhvZCBjb250ZW50IGJ5IHVzaW5nIHRoZSAiQWRk4oCmIiBidXR0b24sIG9yIGNvbm5lY3QgeW91ciByb2xlIGRlc2NyaXB0b3Igd2l0aCB3b3JrIHByb2R1Y3RzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIEFjdGl2aXR5Ljxici8+PGJyLz5Db250aW51ZSBieSBhZGRpbmcgbW9yZSB3b3JrIHByb2R1Y3RzIHRvIHlvdXIgYWN0aXZpdGllcywgb3Igc3dpdGNoIHRvIHRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGFiIHRvIGFkZCB0YXNrcyBvciB0aGUgdGVhbSBhbGxvY2F0aW9uIHRhYiB0byBhZGQgcm9sZXMuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hcHBseWFjYXBhYmlsaXR5cGF0dGVybi5odG1sIiAKLQkJdGl0bGU9IkFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXIgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuJ3MgQWN0aXZpdHkiCi0JCXNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+WW91IGRvIG5vdCBuZWVkIHRvIGRldmVsb3AgeW91ciBwcm9jZXNzIGZyb20gc2NyYXRjaCBieSBhZGRpbmcgZGVzY3JpcHRvcnMgb25lIGJ5IG9uZSBhcyBkZXNjcmliZWQgaW4gdGhlIGxhc3Qgc3RlcHMuICBZb3UgY2FuIGFsc28gcmV1c2UgZXhpc3RpbmcgY2FwYWJpbGl0eSBwYXR0ZXJucyBvciBldmVuIGNhcGFiaWxpdHkgcGF0dGVybiBwYXJ0cy4gR28gdG8gdGhlIGNoZWF0IHNoZWV0ICJBcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybiIgdG8gc2VlIGhvdy48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iRG9uZSI+PGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+PC9pdGVtPgotPC9jaGVhdHNoZWV0PgotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvY3JlYXRlbWV0aG9kY29uZmlndXJhdGlvbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvY3JlYXRlbWV0aG9kY29uZmlndXJhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYmQzMDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZW1ldGhvZGNvbmZpZ3VyYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxjaGVhdHNoZWV0IHRpdGxlPSJDcmVhdGUgeW91ciBvd24gTWV0aG9kIENvbmZpZ3VyYXRpb24iPgotCTxpbnRybyBocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24uaHRtbCI+Ci0JCTxkZXNjcmlwdGlvbj5UaGlzIGNoZWF0IHNoZWV0IGd1aWRlcyB5b3UgdGhvdWdoIHRoZSBzdGVwcyBvZiBjcmVhdGluZyB5b3VyIG93biBtZXRob2QgY29uZmlndXJhdGlvbi4gQmVjYXVzZSB0aGUgbWV0aG9kIGxpYnJhcnkgY2FuIGNvbnRhaW4gbGFyZ2UgbnVtYmVycyBvZiBlbGVtZW50cywgeW91IG1heSB3YW50IHRvIGxpbWl0IHlvdXIgd29yayB0byBhIHVzZXItZGVmaW5lZCBzdWJzZXQgb2YgdGhlIGxpYnJhcnkgY2FsbGVkIG1ldGhvZCBjb25maWd1cmF0aW9uLiBBIG1ldGhvZCBjb25maWd1cmF0aW9uIGRlZmluZXMgYSB3b3JraW5nIHNldCBvZiBwYWNrYWdlcyB3aXRoaW4gdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgaGVscHMgeW91IGxpbWl0IHlvdXIgdmlldyB0byBhIHN1YnNldCBvZiBhbGwgZWxlbWVudHMuIE1ldGhvZCBjb25maWd1cmF0aW9ucyBhcmUgbm90IG9ubHkgdXNlZCBmb3IgY3JlYXRpbmcgcHJvY2Vzc2VzICh5b3UgZHJhZyBhbmQgZHJvcCBlbGVtZW50cyBpbnRvIGEgcHJvY2VzcyBmcm9tIGhlcmUpLCBidXQgYWxzbyBmb3IgcHVibGljYXRpb24sIGJlY2F1c2UgYSBjb25maWd1cmF0aW9uIGRlZmluZXMgd2hpY2ggZWxlbWVudHMgd2lsbCBiZSBwdWJsaXNoZWQgaW4gSFRNTCBhbmQgd2hpY2ggd2lsbCBub3QuPGJyLz48YnIvPlRoZSBlbGVtZW50cyB0aGF0IGFyZSBwYXJ0IG9mIGEgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBhcmUgZGlzcGxheWVkIGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcuIFRoZSBjb25maWd1cmF0aW9uIHZpZXcgYWxsb3dzIHlvdSB0byBicm93c2UgdGhlIGNvbGxlY3Rpb24gb2YgbWV0aG9kIGVsZW1lbnRzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24sIGFuZCB0byBwb3B1bGF0ZSBwcm9jZXNzZXMgYnkgZHJhZ2dpbmcgZWxlbWVudHMgZnJvbSB0aGUgY29uZmlndXJhdGlvbiB2aWV3IGludG8gdGhlIHByb2Nlc3MgZWRpdG9yLjwvZGVzY3JpcHRpb24+Ci0JPC9pbnRybz4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb25maWd1cmF0aW9ucy5odG1sIgotCQl0aXRsZT0iUHJlcGFyZSBDcmVhdGluZyBhIE1ldGhvZCBDb25maWd1cmF0aW9uIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5CZWZvcmUgY3JlYXRpbmcgYSBtZXRob2QgY29uZmlndXJhdGlvbiB5b3Ugc2hvdWxkIGRldGVybWluZSB5b3VyIG5lZWRzIGFuZCBnb2FscyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24uIE9uZSBzY2VuYXJpbyBmb3IgY3JlYXRpbmcgYSBtZXRob2QgY29uZmlndXJhdGlvbiBpcyB0aGF0IHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCBhIG5ldyBtZXRob2QgcGx1Zy1pbiBpbiB3aGljaCB5b3Ugd2FudCB0byBkZWZpbmUgbWV0aG9kIGVsZW1lbnRzIHRoYXQgZXh0ZW5kIGFuIGFscmVhZHkgZXhpc3RpbmcgcGx1Zy1pbi4gSW4gdGhpcyBjYXNlLCB5b3UgbmVlZCB0byBjcmVhdGUgYSBjb25maWd1cmF0aW9uIHRoYXQgaW5jbHVkZXMgeW91ciBuZXcgcGx1Zy1pbiBhcyB3ZWxsIGFzIHRoZSBleGlzdGluZyBwbHVnLWluLiBJZiB5b3Ugd2FudCB0byBjcmVhdGUgeW91ciBvd24gbWV0aG9kIHBsdWctaW4gZmlyc3QgdGhlbiBnbyB0aGUgY2hlYXQgIkNyZWF0ZSB5b3VyIG93biBNZXRob2QgUGx1Zy1pbiIuPGJyLz48YnIvPkFub3RoZXIgc2NlbmFyaW8gZm9yIGNyZWF0aW5nIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCB5b3Ugd2FudCB0byBkZWZpbmUgYSBuZXcgY29uZmlndXJhdGlvbiBmb3IgcHVibGljYXRpb24gcHVycG9zZXMgb24gZXhpc3RpbmcgcGx1Zy1pbnMsIGRlZmluaW5nIHdoaWNoIGVsZW1lbnRzIHRvIHB1Ymxpc2guIEZvciBleGFtcGxlLCBpZiB0aGUgY3VycmVudCBzZXQgb2YgY29uZmlndXJhdGlvbnMgYXZhaWxhYmxlIGRvZXMgbm90IG1lZXQgeW91ciBuZWVkcywgeW91IGNvdWxkIG5vdyBlaXRoZXIgY3VzdG9taXplIGFuIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24gb3IgY3JlYXRlIGEgY29tcGxldGVseSBuZXcgY29uZmlndXJhdGlvbiBmcm9tIHNjcmF0Y2guPGJyLz48YnIvPklmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGJ5IGNvcHlpbmcgYW4gZXhpc3RpbmcgY29uZmlndXJhdGlvbiBnbyB0byB0aGUgbmV4dCBzdGVwICJDcmVhdGUgYSBNZXRob2QgQ29uZmlndXJhdGlvbiBieSBjb3B5aW5nIGFuIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24iLjxici8+PGJyLz5JZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBjb21wbGV0ZWx5IG5ldyBtZXRob2QgY29uZmlndXJhdGlvbiwgc2tpcCB0byBzdGVwICJDcmVhdGUgYSBuZXcgTWV0aG9kIENvbmZpZ3VyYXRpb24gZnJvbSBzY3JhdGNoIi48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCXRpdGxlPSJDcmVhdGUgYSBNZXRob2QgQ29uZmlndXJhdGlvbiBieSBDb3B5aW5nIGFuIEV4aXN0aW5nIENvbmZpZ3VyYXRpb24iCi0JCXNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+RXhwYW5kIHRoZSAiQ29uZmlndXJhdGlvbnMiIHBhY2thZ2UgYXQgdGhlIGVuZCBvZiB0aGUgTGlicmFyeSB2aWV3LiBSaWdodCBjbGljayB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24geW91IHdhbnQgdG8gY29weSwgYW5kIHRoZW4gc2VsZWN0ICJDb3B5IiBmcm9tIHRoZSBtZW51LiBSaWdodCBjbGljayB0aGUgY29uZmlndXJhdGlvbnMgcGFja2FnZSBhbmQgdGhlbiBzZWxlY3QgIlBhc3RlIiBmcm9tIHRoZSBtZW51Ljxici8+PGJyLz5BIGRpYWxvZyBwcm9tcHRzIHlvdXIgZm9yIGEgbmV3IGNvbmZpZ3VyYXRpb24gbmFtZS4gUHJvdmlkZSBhIG5hbWUgdGhhdCByZWZsZWN0cyB0aGUgY2hhcmFjdGVyIG9yIHB1cnBvc2Ugb2YgdGhpcyBjb25maWd1cmF0aW9uLiBUbyBjb250aW51ZSBzcGVjaWZ5aW5nIHlvdXIgbWV0aG9kIGNvbmZpZ3VyYXRpb24sIHNraXAgdG8gc3RlcCAiU3BlY2lmeSB0aGUgTWV0aG9kIENvbmZpZ3VyYXRpb24iLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJdGl0bGU9IkNyZWF0ZSBhIG5ldyBNZXRob2QgQ29uZmlndXJhdGlvbiBmcm9tIFNjcmF0Y2giCi0JCXNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+UmlnaHQgY2xpY2sgdGhlIGNvbmZpZ3VyYXRpb25zIHBhY2thZ2UgYW5kIHNlbGVjdCBOZXcgLSZndDsgTWV0aG9kIENvbmZpZ3VyYXRpb24gZnJvbSB0aGUgbWVudS4gVGhlIG5ldyBjb25maWd1cmF0aW9uIGlzIGFkZGVkIHRvIHRoZSBsaXN0IGFuZCBpdHMgZWRpdG9yIGlzIG9wZW5lZC4gQ2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBuZXcgY29uZmlndXJhdGlvbiB0byByZWZsZWN0IGl0cyBjaGFyYWN0ZXIgb3IgcHVycG9zZSBhbmQgdGhlbiBjb250aW51ZSB0byB0aGUgbmV4dCBzdGVwLCAiU3BlY2lmeSB0aGUgTWV0aG9kIENvbmZpZ3VyYXRpb24iLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJdGl0bGU9IlNwZWNpZnkgdGhlIE1ldGhvZCBDb25maWd1cmF0aW9uIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5DbGljayB0aGUgIlBsdWctaW4gYW5kIFBhY2thZ2UgU2VsZWN0aW9uIiB0YWIgaW4gdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGVkaXRvciB0byBnbyB0byB0aGUgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uIGZvcm0uIFRoaXMgZm9ybSBkaXNwbGF5cyBhIGxpc3Qgb2YgYWxsIG1ldGhvZCBwbHVnLWlucyBhbmQgZm9yIGV2ZXJ5IHBsdWctaW4gYWxsIG9mIGl0cyBjb250ZW50IHBhY2thZ2VzIGFzIHdlbGwgYXMgYWxsIHByb2Nlc3Nlcy4gVXNlIHRoZSBjaGVjayBib3hlcyB0byBhZGQgb3IgcmVtb3ZlIHBsdWctaW5zLCBwYWNrYWdlcywgYW5kIHByb2Nlc3NlcyB0byBvciBmcm9tIHlvdXIgY29uZmlndXJhdGlvbi48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQkKLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZmlndXJhdGlvbnZpZXcuaHRtbCIgCi0JCXRpdGxlPSJQcmV2aWV3IHlvdXIgQ29uZmlndXJhdGlvbiBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3UgY2FuIGltbWVkaWF0ZWx5IHByZXZpZXcgeW91ciBtZXRob2QgY29uZmlndXJhdGlvbiB1c2luZyB0aGUgY29uZmlndXJhdGlvbiB2aWV3LiBSZWZyZXNoIHlvdXIgY29uZmlndXJhdGlvbiB2aWV3IGJ5IGNsaWNraW5nIHRoZSB2aWV3J3MgIlJlZnJlc2ggQWxsIiBpY29uLiBEcmlsbCBpbnRvIHRoZSB0cmVlIHN0cnVjdHVyZXMgZGlzcGxheWVkIGJ5IHRoZSBjb25maWd1cmF0aW9uIHZpZXcgdG8gc2VlIGVsZW1lbnRzIGluY2x1ZGVkIGluIHRoZSBjb25maWd1cmF0aW9uLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sIiAKLQkJdGl0bGU9IkRlZmluZSBOYXZpZ2F0aW9uIFZpZXdzIGZvciB0aGUgTWV0aG9kIENvbmZpZ3VyYXRpb24iCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkEgbmF2aWdhdGlvbiB2aWV3IGlzIGEgbmF2aWdhdGlvbiB0cmVlIGJyb3dzZXIgZm9yIGEgY29uZmlndXJhdGlvbiBwdWJsaXNoZWQgYXMgSFRNTC4gRXZlcnkgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gY2FuIGhhdmUgc2V2ZXJhbCB2aWV3cyB0aGF0IGFyZSBkaXNwbGF5ZWQgYXMgc3RhY2tlZCB0cmVlIGJyb3dzZXIgdGFicy4gVGhlIHN0cnVjdHVyZSBvZiB0aGUgbmF2aWdhdGlvbiB2aWV3IGlzIGRlZmluZWQgYXMgY3VzdG9tIGNhdGVnb3JpZXMuIEEgY3VzdG9tIGNhdGVnb3J5IGlzIGEgdXNlci1kZWZpbmVkIGNvbGxlY3Rpb24gb2YgY2F0ZWdvcml6aW5nIGVsZW1lbnRzLCB3aGljaCBtYXkgaXRzZWxmIGNvbnRhaW4gc3ViY2F0ZWdvcmllcy4gVGhpcyBzdHJ1Y3R1cmUgaXMgd2hhdCBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgZm9yIHRoZSB0cmVlIGJyb3dzZXIuIChGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBDdXN0b20gQ2F0ZWdvcmllcywgc2VlIHRoZSBvbmxpbmUgaGVscC4pIFRoZXJlZm9yZSwgdG8gZGVmaW5lIGEgbmF2aWdhdGlvbiB2aWV3IHlvdSBzZWxlY3QgYSBjdXN0b20gY2F0ZWdvcnkgYW5kIGFsbCBvZiB0aGlzIGNhdGVnb3JpZXMgc3ViLWVsZW1lbnRzIG1ha2UgdXAgdGhlIHRyZWUgYnJvd3NlciBzdHJ1Y3R1cmUgZGlzcGxheWVkIGJ5IHRoZSB2aWV3Ljxici8+PGJyLz5UbyBhZGQgbmF2aWdhdGlvbiB2aWV3cyB0byB5b3VyIGNvbmZpZ3VyYXRpb24gY2xpY2sgdGhlICJWaWV3cyIgdGFiIGluIHRoZSBjb25maWd1cmF0aW9uIGVkaXRvci4gVXNlIHRoZSAiQWRkIFZpZXcuLi4iIGFuZCAiUmVtb3ZlIFZpZXciIGJ1dHRvbnMgdG8gc2VsZWN0IHRoZSBjdXN0b20gY2F0ZWdvcmllcyB5b3Ugd2FudCB0byBhZGQgYW5kIHJlbW92ZSBhcyBhIHZpZXcsIHJlc3BlY3RpdmVseS4gQ2xpY2sgdGhlIHRhYiBvZiB0aGUgdmlld3MgeW91IGp1c3QgYWRkZWQgdG8gcHJldmlldy48YnIvPjxici8+VG8gc2VsZWN0IGEgdmlldyB0byBkaXNwbGF5IGFzIHRoZSBzdGFydC11cCB2aWV3LCBjbGljayB0aGUgIk1ha2UgRGVmYXVsdCIgYnV0dG9uLiBUaGUgc3RhcnQtdXAgdmlldyBpcyB0aGUgZmlyc3QgdmlldyBzaG93biB3aGVuIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gaXMgZGlzcGxheWVkIHdoZW4gc3RhcnRpbmcgdXAuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkRvbmUiPjxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLTwvY2hlYXRzaGVldD4KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZW1ldGhvZHBsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvY3JlYXRlbWV0aG9kcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQzYWIwZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvY3JlYXRlbWV0aG9kcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTwhLS0gQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIC0tPgotPGNoZWF0c2hlZXQgdGl0bGU9IkNyZWF0ZSB5b3VyIG93biBNZXRob2QgUGx1Zy1pbiI+Ci0KLQk8aW50cm8gCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwiPgotCQk8ZGVzY3JpcHRpb24+QmVjYXVzZSB0aGUgcGx1Zy1pbnMgc2hpcHBlZCB3aXRoIHRoZSBtZXRob2QgbGlicmFyeSBhcmUgbG9ja2VkIGFuZCByZWFkLW9ubHksIGFsbCB5b3VyIGNoYW5nZXMsIGFkZGl0aW9ucywgYW5kIGV4dGVuc2lvbnMgdG8gZXhpc3RpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBoYXZlIHRvIGJlIHBsYWNlZCBpbiB5b3VyIG93biBtZXRob2QgcGx1Zy1pbnMuIEhvd2V2ZXIsIHlvdSBjYW4gdXNlIHZhcmlvdXMgY2FwYWJpbGl0aWVzIHRvIGxvZ2ljYWxseSBtZXJnZSB5b3VyIHBsdWctaW4gY29udGVudHMgaW50byBvdGhlciBwbHVnLWlucyBhbGxvd2luZyB5b3UsIGFzIGEgcmVzdWx0LCB0byBwdWJsaXNoIGV4dGVuZGVkIG1ldGhvZHMgYW5kIHByb2Nlc3NlcyB0aGF0IHNlYW1sZXNzbHkgaW5jb3Jwb3JhdGUgeW91ciBtZXRob2QgZWxlbWVudHMuIFRvIGNyZWF0ZSB5b3VyIG93biBtZXRob2QgcGx1Zy1pbnMgZm9sbG93IHRoZXNlIHN0ZXBzLjwvZGVzY3JpcHRpb24+Ci0JPC9pbnRybz4KLQotCTxpdGVtCi0JCXRpdGxlPSJVc2UgdGhlIE1ldGhvZCBQbHVnLWluIFdpemFyZCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+Q3JlYXRlIGEgbmV3IG1ldGhvZCBwbHVnLWluIHVzaW5nIHRoZSAiTmV3IE1ldGhvZCBQbHVnLWluIiB3aXphcmQuIFRvIG9wZW4gdGhlIHdpemFyZCBzZWxlY3QgRmlsZSAtJmd0OyBOZXcgLSZndDsgTWV0aG9kIFBsdWctaW4uIFNwZWNpZnkgYXQgbGVhc3QgdGhlIG5hbWUgZm9yIHlvdXIgbmV3IG1ldGhvZCBwbHVnLWluIGFuZCBzZWxlY3QgdGhlIGNoZWNrIGJveCBmb3IgYW55IG90aGVyIG1ldGhvZCBwbHVnLWlucyB3aGljaCBjb250ZW50IHlvdSB3aXNoIHRvIGV4dGVuZCBvciByZXVzZS48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCXRpdGxlPSJPcGVuIHRoZSBNZXRob2QgUGx1Z2luIEVkaXRvciIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+QWZ0ZXIgeW91IGhhdmUgY3JlYXRlZCB0aGUgcGx1Zy1pbiwgeW91IGNhbiBtYWtlIGNoYW5nZXMgdG8gaXRzIHNwZWNpZmljYXRpb25zIGluIHRoZSBtZXRob2QgcGx1Zy1pbiBlZGl0b3IuIEluIHRoZSBsaWJyYXJ5IHZpZXcsIGRvdWJsZSBjbGljayB0aGUgbWV0aG9kIHBsdWctaW4gdGhhdCB5b3UganVzdCBjcmVhdGVkIHRvIG9wZW4gdGhlIGVkaXRvci48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCXRpdGxlPSJTcGVjaWZ5IFZlcnNpb24gSW5mb3JtYXRpb24iCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkluIGFkZGl0aW9uIHRvIHRoZSBpbmZvcm1hdGlvbiBhbHJlYWR5IHNwZWNpZmllZCBpbiB0aGUgbWV0aG9kIHBsdWctaW4gd2l6YXJkLCB5b3UgY2FuIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgcGx1Zy1pbi48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCXRpdGxlPSJTZWxlY3QgdGhlIERlZmF1bHQgQ29weXJpZ2h0IERlZmluaXRpb24gRmlsZSIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoZSAiU2VsZWN0IiBidXR0b24gdG8gc3BlY2lmeSB3aGljaCBwYWdlIG9mIHRoZSB0eXBlICJTdXBwb3J0aW5nIE1hdGVyaWFsIiBjb250YWlucyB0aGUgY29weXJpZ2h0IGluZm9ybWF0aW9uIGZvciBlbGVtZW50cyBvZiB0aGlzIHBsdWctaW4uICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIHdpbGwgYmUgYXBwZW5kZWQgdG8gZXZlcnkgcGFnZSB0aGF0IGdldHMgcHVibGlzaGVkIGJhc2VkIG9uIGFuIGVsZW1lbnQgZnJvbSB0aGlzIHBsdWctaW4uICBOb3RlLCB0aGF0IGluZGl2aWR1YWwgbWV0aG9kIGVsZW1lbnRzIGNhbiBvdmVycmlkZSB0aGlzIHN0YW5kYXJkIHNlbGVjdGlvbiB3aXRoIHRoZSBjb3B5cmlnaHQgZmllbGQgaW4gdGhlaXIgb3duIGVkaXRvcnMuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkRvbmUiPjxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPjwvaXRlbT4KLTwvY2hlYXRzaGVldD4KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL25hdmlnYXRlbWV0aG9kY29udGVudC54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvbmF2aWdhdGVtZXRob2Rjb250ZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdlNjUxMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvbmF2aWdhdGVtZXRob2Rjb250ZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGNoZWF0c2hlZXQgdGl0bGU9Ik5hdmlnYXRlIE1ldGhvZCBDb250ZW50Ij4KLQk8aW50cm8gaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sIj4KLQkJPGRlc2NyaXB0aW9uPlRoZXJlIGFyZSB0d28gd2F5cyB0byBuYXZpZ2F0ZSBtZXRob2QgY29udGVudDogYnkgdXNpbmcgdGhlIHBoeXNpY2FsIGxpYnJhcnkgc3RydWN0dXJlIGluIHRoZSBsaWJyYXJ5IHZpZXcgb3IgYnkgdXNpbmcgdGhlIGxvZ2ljYWwgY2F0ZWdvcml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldy4gIFRoaXMgY2hlYXQgc2hlZXQgd2Fsa3MgeW91IHRocm91Z2ggYm90aCBzY2VuYXJpb3MuPC9kZXNjcmlwdGlvbj4KLQk8L2ludHJvPgotCTxpdGVtIGhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sIiB0aXRsZT0iU3dpdGNoIHRvIEF1dGhvcmluZyBQZXJzcGVjdGl2ZSIgc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3UgY2FuIHdvcmsgd2l0aCB0d28gcGVyc3BlY3RpdmVzOiB0aGUgYXV0aG9yaW5nIHBlcnNwZWN0aXZlIGFuZCB0aGUgYnJvd3NpbmcgcGVyc3BlY3RpdmUuIEEgcGVyc3BlY3RpdmUgZGVmaW5lcyBhIHNldCBvZiB2aWV3cyBhbmQgZnVuY3Rpb25zIHRvIGJlIGF2YWlsYWJsZSBmb3Igc3BlY2lmaWMgdGFza3MuIFRoZSBhdXRob3JpbmcgcGVyc3BlY3RpdmUgcHJvdmlkZXMgdmlld3MgYW5kIGZ1bmN0aW9ucyB0byBuYXZpZ2F0ZSBhbmQgYXV0aG9yIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMsIHdoaWxlIHRoZSBicm93c2luZyBwZXJzcGVjdGl2ZSBhbGxvd3MgeW91IHRvIHByZXZpZXcgYW5kIGJyb3dzZSBhIG1ldGhvZCBjb25maWd1cmF0aW9uLiBUaGlzIGNoZWF0IHNoZWV0IHJlZmVycyB0byB0aGUgYXV0aG9yaW5nIHBlcnNwZWN0aXZlLjxici8+PGJyLz5DbGljayB0aGUgIk9wZW4gUGVyc3BlY3RpdmUiIGJ1dHRvbiBvciB0aGUgV2luZG93LSZndDtPcGVuIFBlcnNwZWN0aXZlIG1lbnUgYW5kIHRoZW4gc2VsZWN0ICJBdXRob3JpbmciIHRvIHN3aXRjaCB0byB0aGUgYXV0aG9yaW5nIHBlcnNwZWN0aXZlLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIGhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9saWJyYXJ5dmlldy5odG1sIiB0aXRsZT0iT3BlbiB0aGUgTGlicmFyeSBWaWV3IiBza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPklmIHlvdSBkbyBub3Qgc2VlIGEgdHJlZS1icm93c2VyIHZpZXcgbGFiZWxlZCAiTGlicmFyeSIgaW4geW91ciBhdXRob3JpbmcgcGVyc3BlY3RpdmUgY2xpY2sgdGhlIFdpbmRvdy0mZ3Q7UmVzZXQgUGVyc3BlY3RpdmUgbWVudS48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSBocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCIgdGl0bGU9IkRyaWxsIGludG8gTWV0aG9kIENvbnRlbnQgUGFja2FnZXMiIHNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPldpdGhpbiB0aGUgbGlicmFyeSB2aWV3IHRyZWUtYnJvd3NlciwgZXhwYW5kIGEgcGx1Zy1pbiBhbmQgZHJpbGwgaW50byB0aGUgcGFja2FnZXMgIk1ldGhvZCBDb250ZW50Ii0mZ3Q7IkNvbnRlbnQgUGFja2FnZXMiIGFuZCBpdHMgc3ViLXBhY2thZ2VzLiBFeGFtaW5lIHRoZSBjb250ZW50cy4KLQkJPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IlJldmlldyBDb250ZW50IFBhY2thZ2VzIiBza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5FdmVyeSBjb250ZW50IHBhY2thZ2UgY29udGFpbnMgZGlmZmVyZW50IHR5cGVzIG9mIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIHdoaWNoIGFyZSBzb3J0ZWQgaW50byBkaWZmZXJlbnQgY2F0ZWdvcmllcy4gVGhlIGNhdGVnb3JpZXMgYXJlIHJvbGVzLCB0YXNrcywgd29yayBwcm9kdWN0cywgYW5kIGd1aWRhbmNlLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIGhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50Lmh0bWwiIHRpdGxlPSJPcGVuIGEgTWV0aG9kIENvbnRlbnQgRWxlbWVudCBFZGl0b3IiIHNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPlNlbGVjdCBhIG1ldGhvZCBlbGVtZW50LCBzdWNoIGFzIGEgdGFzaywgYW5kIGRvdWJsZSBjbGljayB0byBvcGVuIGl0cyBlZGl0b3IuPGJyLz48YnIvPlRoZSBlZGl0b3IgcHJvdmlkZXMgdGFicyBhbmQgZm9ybXMgdG8gb3JnYW5pemUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgdGhlIGVsZW1lbnQuICBTZWxlY3QgdGhlIGRpZmZlcmVudCB0YWJzIGFuZCB0aGUgYm90dG9tIG9mIGV2ZXJ5IGVkaXRvciBhbmQgcmV2aWV3IHRoZSBkaWZmZXJlbnQgZm9ybXMgZGlzcGxheWVkLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIGhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sIiB0aXRsZT0iRXhhbWluZSBDYXRlZ29yaWVzIiBza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5XaXRoaW4gdGhlIGxpYnJhcnkgdmlldyB0cmVlLWJyb3dzZXIsIGV4cGFuZCB0aGUgcGFja2FnZXMgdG8gdGhlIHNhbWUgbGV2ZWwgYXMgY29udGVudCBwYWNrYWdlcyB1bnRpbCB5b3UgZmluZCB0aGUgIkN1c3RvbSBDYXRlZ29yaWVzIiBhbmQgIlN0YW5kYXJkIENhdGVnb3JpZXMiIHBhY2thZ2VzLiBEcmlsbCBpbnRvIHRoZXNlIHBhY2thZ2VzIGFuZCB0aGVuIGV4YW1pbmUgdGhlaXIgY29udGVudHMuPGJyLz48YnIvPkV2ZXJ5IGNhdGVnb3J5IGxpc3RlZCBoZXJlIGlzIGEgY29udGVudCBlbGVtZW50IGFzIHdlbGwuICBPcGVuIHRoZSBkZXNjcmlwdGlvbiBvZiBhIGNhdGVnb3J5IHN1Y2ggYXMgYSBkaXNjaXBsaW5lIG9yIGEgZG9tYWluIGJ5IGRvdWJsZSBjbGlja2luZyB0aGUgY2F0ZWdvcnkgd2hpY2ggb3BlbnMgdGhlIGNhdGVnb3J5IGVkaXRvci48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSBocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZmlndXJhdGlvbnZpZXcuaHRtbCIgdGl0bGU9IlNlbGVjdCBhIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBDb25maWd1cmF0aW9uIFZpZXciIHNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+QmVjYXVzZSB0aGUgbWV0aG9kIGxpYnJhcnkgY2FuIGNvbnRhaW4gbGFyZ2UgbnVtYmVycyBvZiBlbGVtZW50cywgeW91IG1heSB3YW50IHRvIGxpbWl0IHlvdXIgd29yayB0byBhIHVzZXItZGVmaW5lZCBzdWJzZXQgb2YgdGhlIGxpYnJhcnkgY2FsbGVkIG1ldGhvZCBjb25maWd1cmF0aW9uLiBBIGNvbmZpZ3VyYXRpb24gZGVmaW5lcyBhIHdvcmtpbmcgc2V0IG9mIHBhY2thZ2VzIHdpdGhpbiB0aGUgbWV0aG9kIGxpYnJhcnkgdGhhdCBoZWxwcyB5b3UgbGltaXQgeW91ciB2aWV3IHRvIGEgc3Vic2V0IG9mIGFsbCBlbGVtZW50cy4gVGhlIGVsZW1lbnRzIHRoYXQgYXJlIHBhcnQgb2YgYSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldy48YnIvPjxici8+VGhlIGNvbmZpZ3VyYXRpb24gdmlldyBkaXNwbGF5cyBjYXRlZ29yaXplZCBtZXRob2QgZWxlbWVudHMgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBjb25maWd1cmF0aW9uLiAgVGhpcyBpcyB0aGUgY29uZmlndXJhdGlvbiB0aGF0IGhhcyBiZWVuIHNlbGVjdGVkIGluIHRoZSB1bmxhYmVsZWQgY29tYm8gYm94IGluIHRoZSB0b29sIGJhci4gIFVzZSB0aGlzIGNvbWJvIGJveCB0byBzZWxlY3QgYSBjb25maWd1cmF0aW9uLjxici8+PGJyLz5BZnRlciBzZWxlY3RpbmcgYSBjb25maWd1cmF0aW9uIHRoZSBjb25maWd1cmF0aW9uIHZpZXcgaXMgKHJlLSlwb3B1bGF0ZWQgd2l0aCBuZXcgdHJlZXMgc2hvd2luZyBlbGVtZW50cyBmcm9tIHRoYXQgY29uZmlndXJhdGlvbi48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iRHJpbGwgaW50byBDYXRlZ29yaWVzIGluIENvbmZpZ3VyYXRpb24gVmlldyIgc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+RHJpbGwgaW50byB0aGUgY29uZmlndXJhdGlvbiB2aWV3J3MgY2F0ZWdvcmllcyBmb2xkZXJzIGFuZCBleGFtaW5lIHRoZSBlbGVtZW50cyBsaXN0ZWQgdGhlcmUuPGJyLz48YnIvPkFzIGluIHRoZSBsaWJyYXJ5IHZpZXcgeW91IGNhbiBvcGVuIGVsZW1lbnRzIGxpc3RlZCBoZXJlIHZpYSBhIGRvdWJsZS1jbGljay4gSG93ZXZlciwgdGhlIGNvbmZpZ3VyYXRpb24gdmlldyBjb21wdXRlcyBzby1jYWxsZWQgY29udHJpYnV0aW9ucyBhbmQgcmVwbGFjZW1lbnRzIG9mIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIChzZWUgIlZhcmlhYmlsaXR5IE92ZXJ2aWV3IiBpbiB0aGUgb25saW5lIGhlbHAgZm9yIG1vcmUgZGV0YWlscykuIElmIGFuIGVsZW1lbnQgaGFzIGNvbnRyaWJ1dGluZyBlbGVtZW50cyB0aGVuIGEgZG91YmxlIGNsaWNrIHdpbGwgc2hvdyB5b3UgYSBkaWFsb2cgd2l0aCBhbGwgdGhlIGVsZW1lbnRzIHBhcnRpY2lwYXRpbmcgaW4gdGhlIGNvbnRyaWJ1dGlvbi4gIFNlbGVjdCBvbmUgZWxlbWVudCB0byBvcGVuIGl0cyBlZGl0b3IuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkRvbmUiPgotCQk8ZGVzY3JpcHRpb24vPgotCTwvaXRlbT4KLTwvY2hlYXRzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9yZXBsYWNlZXhpc3RpbmdtZXRob2RlbGVtZW50cy54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvcmVwbGFjZWV4aXN0aW5nbWV0aG9kZWxlbWVudHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzVmYjYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9yZXBsYWNlZXhpc3RpbmdtZXRob2RlbGVtZW50cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGNoZWF0c2hlZXQgdGl0bGU9IlJlcGxhY2UgRXhpc3RpbmcgTWV0aG9kIEVsZW1lbnRzIChSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMsIG9yIEd1aWRhbmNlKSI+Ci0KLQk8aW50cm8gCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC92YXJpYWJpbGl0eS5odG1sIj4KLQkJPGRlc2NyaXB0aW9uPllvdSBjYW4gdGFpbG9yIGV4aXN0aW5nIG1ldGhvZCBlbGVtZW50cywgc3VjaCBhcyBhbiBlbGVtZW50IHRoYXQgaXMgZGVmaW5lZCBpbiBhIGxvY2tlZCBwbHVnLWluLCB3aXRob3V0IGRpcmVjdGx5IG1vZGlmeWluZyBpdCwgYnV0IGJ5IHJlcGxhY2luZyBpdCB3aXRoIG9uZSBvZiB5b3VyIG93biBlbGVtZW50cyBkZWZpbmVkIGluIHlvdXIgb3duIG1ldGhvZCBwbHVnLWluLiBUaGlzIGNoZWF0IHNoZWV0IHdhbGtzIHlvdSB0aHJvdWdoIHRoZSBzdGVwcyBvZiBjcmVhdGluZyBzdWNoIGEgcmVwbGFjZW1lbnQuICBTZWUgdGhlIG9ubGluZSBoZWxwIHNlY3Rpb24gIlZhcmlhYmlsaXR5IE92ZXJ2aWV3IiBmb3IgYW4gaW50cm9kdWN0aW9uIG9uIHZhcmlhYmlsaXR5IGFuZCByZXBsYWNlbWVudHMuPGJyLz48YnIvPlJlcGxhY2VtZW50cyBjYW4gYWxzbyBiZSBhcHBsaWVkIHdpdGhpbiB0aGUgc2FtZSBtZXRob2QgcGx1Zy1pbiBiZXR3ZWVuIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGZyb20gZGlmZmVyZW50IGNvbnRlbnQgcGFja2FnZXMuICBUaGlzIGlzIHVzZWZ1bCBpbiB0aGUgY2FzZSB3aGVyZSB5b3Ugd2FudCB0byBwcm92aWRlIGFsdGVybmF0aXZlIGNvbnRlbnQgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgdXNpbmcgZGlmZmVyZW50IG1ldGhvZCBjb25maWd1cmF0aW9ucy48L2Rlc2NyaXB0aW9uPgotCTwvaW50cm8+Ci0KLQk8aXRlbQotCQl0aXRsZT0iUGxhbiB5b3VyIFJlcGxhY2VtZW50IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5XaGVuIGRlZmluaW5nIHRoZSByZXBsYWNlbWVudCBvZiBhbiBleGlzdGluZyBtZXRob2QgZWxlbWVudCB5b3UgbmVlZCB0byBrbm93IHdoZXJlIHRoZSBleGlzdGluZyBlbGVtZW50IHRoYXQgeW91IHdhbnQgdG8gcmVwbGFjZSBpcyBwaHlzaWNhbGx5IGxvY2F0ZWQgd2l0aGluIGl0cyBtZXRob2QgcGx1Zy1pbi4gWW91IGFsc28gbmVlZCB0byBkZWNpZGUgd2VyZSB0byBjcmVhdGUgYW5kIHBsYWNlIHRoZSByZXBsYWNpbmcgZWxlbWVudC4gVHlwaWNhbGx5IHlvdSBjcmVhdGUgdGhlIHJlcGxhY2luZyBlbGVtZW50IHdpdGhpbiBhIHNwZWNpZmljIGNvbnRlbnQgcGFja2FnZSBpbiB5b3VyIG93biBtZXRob2QgcGx1Zy1pbi4gRmluYWxseSwgeW91IG5lZWQgdG8ga25vdyB3aGF0IHRoZSByZXBsYWNpbmcgZWxlbWVudCdzIGNvbnRlbnQgaXMsIGJlY2F1c2UgYWxsIG9mIHRoZSByZXBsYWNlZCBlbGVtZW504oCZcyBjb250ZW50IChpLmUuIGl0cyB0ZXh0IGF0dHJpYnV0ZXMgYXMgd2VsbCBhcyBpdHMgcmVsYXRpb25zaGlwcyB0aGF0IHBvaW50IHRvIG90aGVyIGVsZW1lbnRzKSB3aWxsIGJlIHJlbW92ZWQuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlbWV0aG9kY29udGVudC5odG1sIgotCQl0aXRsZT0iQ3JlYXRlIGEgUmVwbGFjaW5nIENvbnRlbnQgRWxlbWVudCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+Q3JlYXRlIGEgbWV0aG9kIGNvbnRlbnQgZWxlbWVudCBpbiB5b3VyIG1ldGhvZCBwbHVnLWluIHRoYXQgeW91IGludGVuZCB0byBiZSB0aGUgcmVwbGFjaW5nIGNvbnRlbnQgZWxlbWVudC4gUmVtZW1iZXIsIHlvdSBtdXN0IHByb3ZpZGUgdGhpcyBlbGVtZW50IHdpdGggaXRzIG93biBjb250ZW50IGJlY2F1c2UgYWxsIGF0dHJpYnV0ZXMgb2YgdGhlIHJlcGxhY2VkIGVsZW1lbnQgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGVtcHR5IGZpZWxkcywgaWYgeW91IGRvIG5vdCBwcm92aWRlIG5ldyBkZXNjcmlwdGlvbnMuPGJyLz48YnIvPkdvIHRvIGNoZWF0IHNoZWV0ICJBZGQgYSBuZXcgTWV0aG9kIENvbnRlbnQgc3VjaCBhcyBSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMsIG9yIEd1aWRhbmNlIiB0byBiZSBndWlkZWQgdGhyb3VnaCB0aGVzZSBzdGVwcy48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yZXBsYWNlLmh0bWwiIAotCQl0aXRsZT0iU3BlY2lmeSB0aGUgUmVwbGFjZW1lbnQgUmVsYXRpb25zaGlwIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5HbyB0byB0aGUgIkNvbnRlbnQgVmFyaWFiaWxpdHkiIHNlY3Rpb24gb2YgdGhlIGVsZW1lbnRzIGRlc2NyaXB0aW9uIHRhYi4gU2VsZWN0ICJSZXBsYWNlcyIgZnJvbSB0aGUgY29tYm8gYm94LiBDbGljayB0aGUgIlNlbGVjdC4uLiIgYnV0dG9uIG9mIHRoZSBiYXNlIHJvbGUgZmllbGQgYW5kIHNlbGVjdCB0aGUgZWxlbWVudCB0aGF0IHlvdXIgbmV3IGVsZW1lbnQgcmVwbGFjZXMuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbCIgCi0JCXRpdGxlPSJSZXZpZXcgeW91ciBSZXBsYWNlZCBFbGVtZW50IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5UbyByZXZpZXcgeW91ciByZXBsYWNlZCBlbGVtZW50LCBzZWxlY3QgYSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGNvbWJvIGJveCBpbiB0aGUgdG9vbCBiYXIgdGhhdCBjb250YWlucyB0aGUgbWV0aG9kIHBsdWctaW5zIGFuZCBjb250ZW50IHBhY2thZ2VzIG9mIGJvdGggZWxlbWVudHMgcGFydGljaXBhdGluZyBpbiB5b3VyIHJlcGxhY2VtZW50LiBJbiBvdGhlciB3b3JkcywgdGhlIGNvbmZpZ3VyYXRpb24gbXVzdCBjb250YWluIHRoZSByZXBsYWNpbmcgZWxlbWVudCBhcyB3ZWxsIGFzIHRoZSByZXBsYWNlZCBiYXNlIGVsZW1lbnQuPGJyLz48YnIvPlN3aXRjaCB0byB0aGUgQnJvd3NpbmcgcGVyc3BlY3RpdmUuIEZpbmQgYW5kIHNlbGVjdCB0aGUgcmVwbGFjaW5nIGVsZW1lbnQgKGkuZS4geW91ciBuZXcgZWxlbWVudCkgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldy4gVGhlIGNvbnRlbnQgd2luZG93IGRpc3BsYXlzIHRoZSByZXN1bHRzIG9mIHRoZSByZXBsYWNlbWVudC4gUmV2aWV3IGFuIGVsZW1lbnQgdGhhdCByZWZlcnJlZCB0byB0aGUgcmVwbGFjZWQgZWxlbWVudC4gSW4gb3RoZXIgd29yZHMsIGlmIHlvdSByZXBsYWNlZCBhbiBhcnRpZmFjdCwgZmluZCBhIHRhc2sgdGhhdCB1c2VkIHRoaXMgYXJ0aWZhY3QgYXMgYW4gaW5wdXQgb3Igb3V0cHV0LiBNYWtlIHN1cmUgdGhpcyBlbGVtZW50IG5vdyByZWZlcnMgdG8gdGhlIHJlcGxhY2luZyBlbGVtZW50LjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJEb25lIj48ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj48L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy90YWlsb3JleGlzdGluZ21ldGhvZGVsZW1lbnRzLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy90YWlsb3JleGlzdGluZ21ldGhvZGVsZW1lbnRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFmNzI2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvdGFpbG9yZXhpc3RpbmdtZXRob2RlbGVtZW50cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGNoZWF0c2hlZXQgdGl0bGU9IlRhaWxvciBFeGlzdGluZyBNZXRob2QgRWxlbWVudHMgKFJvbGVzLCBUYXNrcywgV29yayBQcm9kdWN0cywgb3IgR3VpZGFuY2UpIFVzaW5nIENvbnRyaWJ1dGlvbiI+Ci0KLQk8aW50cm8gCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC92YXJpYWJpbGl0eS5odG1sIj4KLQkJPGRlc2NyaXB0aW9uPllvdSBjYW4gdGFpbG9yIGV4aXN0aW5nIG1ldGhvZCBlbGVtZW50cywgc3VjaCBhcyBhbiBlbGVtZW50IHRoYXQgaXMgZGVmaW5lZCBpbiBhIGxvY2tlZCBtZXRob2QgcGx1Zy1pbiwgd2l0aG91dCBkaXJlY3RseSBtb2RpZnlpbmcgaXQsIGJ1dCBieSBjb250cmlidXRpbmcgbmV3IGNvbnRlbnQgb3IgcmVsYXRpb25zaGlwcyB0byBpdCBmcm9tIGFuIGVsZW1lbnQgZGVmaW5lZCBpbiBvbmUgb2YgeW91ciBvd24gbWV0aG9kIHBsdWctaW5zLiBUaGlzIGNoZWF0IHNoZWV0IHdhbGtzIHlvdSB0aHJvdWdoIHRoZSBzdGVwcyBvZiBjcmVhdGluZyBzdWNoIGEgY29udHJpYnV0aW9uLiAgU2VlIHRoZSBvbmxpbmUgaGVscCBzZWN0aW9uICJWYXJpYWJpbGl0eSBPdmVydmlldyIgZm9yIGFuIGludHJvZHVjdGlvbiBvbiB2YXJpYWJpbGl0eSBhbmQgY29udHJpYnV0aW9ucy48YnIvPjxici8+Q29udHJpYnV0aW9ucyBjYW4gYWxzbyBiZSBhcHBsaWVkIHdpdGhpbiB0aGUgc2FtZSBtZXRob2QgcGx1Zy1pbiBiZXR3ZWVuIGVsZW1lbnRzIGZyb20gZGlmZmVyZW50IGNvbnRlbnQgcGFja2FnZXMuIFRoaXMgaXMgdXNlZnVsIGluIHRoZSBldmVudCB5b3Ugd2FudCB0byBidWlsZCB1cCB5b3VyIGNvbnRlbnQgZWxlbWVudHMgaW4gbGF5ZXJzIG9mIGNvbXBsZXhpdHkgYnkgZ3JhZHVhbGx5IGFkZGluZyBtb3JlIGFuZCBtb3JlIGNvbnRlbnQgdmlhIGNvbnRyaWJ1dGlvbi4gIFRoZSByZXNwZWN0aXZlIGxldmVscyBvZiBjb250cmlidXRpb24gY2FuIHRoZW4gYmUgc2VsZWN0ZWQgd2l0aGluIG1ldGhvZCBjb25maWd1cmF0aW9ucyB0aGF0IGFsbG93IHlvdSB0byBpbmNsdWRlIG9yIGV4Y2x1ZGUgdGhlIGNvbnRlbnQgcGFja2FnZXMgd2l0aCB0aGUgY29udHJpYnV0aW5nIGVsZW1lbnRzLjwvZGVzY3JpcHRpb24+Ci0JPC9pbnRybz4KLQotCTxpdGVtCi0JCXRpdGxlPSJQbGFuIHlvdXIgQ29udHJpYnV0aW9uIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5CZWZvcmUgeW91IGNhbiBjcmVhdGUgYSBjb250cmlidXRpb24gdG8gYW4gZXhpc3RpbmcgbWV0aG9kIGNvbnRlbnQgZWxlbWVudCB5b3UgbmVlZCB0byBrbm93IHdoZXJlIHRoaXMgZWxlbWVudCBpcyBsb2NhdGVkIHdpdGhpbiBpdHMgbWV0aG9kIHBsdWctaW4uIFlvdSBhbHNvIG5lZWQgdG8gZGVjaWRlIHdoZXJlIHRvIGNyZWF0ZSBhbmQgcGxhY2UgdGhlIGNvbnRyaWJ1dGluZyBlbGVtZW50LiBUeXBpY2FsbHksIHlvdSBjcmVhdGUgdGhpcyBlbGVtZW50IGluIHlvdXIgb3duIG1ldGhvZCBwbHVnLWluLCBpbiBhIHNwZWNpZmljIGNvbnRlbnQgcGFja2FnZS4gRmluYWxseSwgeW91IG5lZWQgdG8ga25vdyB3aGF0IGl0IGlzIHlvdSBhY3R1YWxseSB3YW50IHRvIGNvbnRyaWJ1dGUuIFRoaXMgY291bGQgYmUgYWRkaXRpb25hbCB0ZXh0IGZvciB0aGUgZm9ybSBmaWVsZHMsIG5ldyByZWxhdGlvbnNoaXBzIHRvIG90aGVyIGVsZW1lbnRzLCBvciBuZXcgY2F0ZWdvcml6YXRpb25zLiAoU2VlIHRoZSBvbmxpbmUgaGVscCBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZXNlIGZpZWxkcyBhbmQgcmVsYXRpb25zaGlwcy4pPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlbWV0aG9kY29udGVudC5odG1sIgotCQl0aXRsZT0iQ3JlYXRlIGEgQ29udHJpYnV0aW5nIENvbnRlbnQgRWxlbWVudCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+Q3JlYXRlIGEgY29udGVudCBlbGVtZW50IGluIHlvdXIgbWV0aG9kIHBsdWctaW4gdGhhdCBwcm92aWRlcyBjb250cmlidXRpb25zIHRvIHRoZSBjb250ZW50IGVsZW1lbnQgdGhhdCB5b3Ugd2lzaCB0byB0YWlsb3IuICBHbyB0byB0aGUgY2hlYXQgc2hlZXQgIkFkZCBhIG5ldyBNZXRob2QgQ29udGVudCBzdWNoIGFzIFJvbGVzLCBUYXNrcywgV29yayBQcm9kdWN0cywgb3IgR3VpZGFuY2UiIHRvIGJlIGd1aWRlZCB0aHJvdWdoIHRoZXNlIHN0ZXBzLjxici8+PGJyLz5BZGQgeW91ciBjb250cmlidXRpb25zIHN1Y2ggYXMgcmV2aXNlZCB0ZXh0IGZvciBmb3JtIGZpZWxkcyBvciBhZGRpdGlvbmFsIHJlbGF0aW9uc2hpcHMgdG8geW91ciBtZXRob2QgY29udGVudCBlbGVtZW50LjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbnRyaWJ1dGVzLmh0bWwiIAotCQl0aXRsZT0iU3BlY2lmeSB0aGUgQ29udHJpYnV0aW9uIFJlbGF0aW9uc2hpcCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+R28gdG8gdGhlICJDb250ZW50IFZhcmlhYmlsaXR5IiBzZWN0aW9uIG9mIHRoZSBlbGVtZW50cyBkZXNjcmlwdGlvbiB0YWIuIFNlbGVjdCAiQ29udHJpYnV0ZXMiIGZyb20gdGhlIGNvbWJvIGJveC4gQ2xpY2sgdGhlICJTZWxlY3QuLi4iIGJ1dHRvbiBvZiB0aGUgYmFzZSByb2xlIGZpZWxkIGFuZCB0aGVuIHNlbGVjdCB0aGUgZWxlbWVudCB0aGF0IHlvdSB3YW50IHlvdXIgbmV3IGVsZW1lbnQgdG8gY29udHJpYnV0ZSB0by48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9icm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudC5odG1sIiAKLQkJdGl0bGU9IlJldmlldyB5b3VyIENvbnRyaWJ1dGlvbnMiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPlRvIHJldmlldyB5b3VyIGNvbnRyaWJ1dGlvbnMgc2VsZWN0IChvciBjcmVhdGUgZmlyc3QgYW5kIHRoZW4gc2VsZWN0KSBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gY29tYm8gYm94IGluIHRoZSB0b29sIGJhciB0aGF0IGNvbnRhaW5zIHRoZSBwbHVnLWlucyBhbmQgcGFja2FnZXMgb2YgYm90aCBvZiB0aGUgZWxlbWVudHMgcGFydGljaXBhdGluZyBpbiB5b3VyIGNvbnRyaWJ1dGlvbi4gIEluIG90aGVyIHdvcmRzIHRoZSBjb25maWd1cmF0aW9uIGhhcyB0byBjb250YWluIHRoZSBjb250cmlidXRpbmcgZWxlbWVudCBhcyB3ZWxsIGFzIHRoZSBiYXNlIGVsZW1lbnQuPGJyLz48YnIvPlN3aXRjaCB0byB0aGUgIkJyb3dzaW5nIFBlcnNwZWN0aXZlIi4gRmluZCBhbmQgc2VsZWN0IHRoZSBiYXNlIGVsZW1lbnQgKGkuZS4gdGhlIGVsZW1lbnQgeW91IGNvbnRyaWJ1dGVkIHRvKSBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3LiBUaGUgY29udGVudCB3aW5kb3cgZGlzcGxheXMgdGhlIHJlc3VsdHMgb2YgdGhlIGNvbnRyaWJ1dGlvbi48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4JCi0JPGl0ZW0gdGl0bGU9IkRvbmUiPjxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPjwvaXRlbT4KLTwvY2hlYXRzaGVldD4KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvZGVfbWFuYWdlbWVudC54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY29kZV9tYW5hZ2VtZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiMzJiNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY29kZV9tYW5hZ2VtZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08dG9jIGxhYmVsPSJTdXBwb3J0IGZvciBjb2RlIG1hbmFnZW1lbnQiIGxpbmtfdG89Im1haW4ueG1sI2NvZGVfbWFuYWdlbWVudF9pZCI+Ci0gICA8dG9waWMgbGFiZWw9IlN1cHBvcnQgZm9yIENWUyIgaHJlZj0iaHRtbC9oZWxwL2NtX2N2cy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlN1cG9ydCBmb3IgUmF0aW9uYWwgQ2xlYXJDYXNlIiBocmVmPSJodG1sL2hlbHAvY21fcmF0aW9uYWxjYy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlN1cHBvcnQgZm9yIFJhdGlvbmFsIENDUkMiIGhyZWY9Imh0bWwvaGVscC9jbV9jY3JjLmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvbmNlcHRzLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb25jZXB0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxODgxYjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvbmNlcHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iQ29uY2VwdHMiIGxpbmtfdG89Im1haW4ueG1sI2NvbmNlcHRzX2lkIj4KLSAgIDx0b3BpYyBsYWJlbD0iT3ZlcnZpZXcgb2YgRVBGIENvbXBvc2VyIiBocmVmPSJodG1sL292ZXJ2aWV3L3Byb2R1Y3Rfb3ZlcnZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29udGVudCBhdXRob3Jpbmcgb3ZlcnZpZXciIGhyZWY9Imh0bWwvb3ZlcnZpZXcvbWV0aG9kX2NvbnRlbnRfYXV0aG9yaW5nX292ZXJ2aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUHJvY2VzcyBhdXRob3Jpbmcgb3ZlcnZpZXciIGhyZWY9Imh0bWwvb3ZlcnZpZXcvcHJvY2Vzc19hdXRob3Jpbmdfb3ZlcnZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29uZmlndXJhdGlvbnMgb3ZlcnZpZXciIGhyZWY9Imh0bWwvb3ZlcnZpZXcvbWV0aG9kX2NvbmZpZ3VyYXRpb25zX292ZXJ2aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iVXNlciByb2xlcyBhbmQgcm9sZSBzcGVjaWZpYyB0YXNrcyIgaHJlZj0iaHRtbC9oZWxwL3VzZXJfcm9sZXMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL21ldGhvZF9jb250ZW50Lmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvbnRleHRzX1NlYXJjaC54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY29udGV4dHNfU2VhcmNoLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ3YjgwNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY29udGV4dHNfU2VhcmNoLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxjb250ZXh0cz4KLQk8Y29udGV4dCAgaWQ9Im9wZW5fc2VhcmNoX2RpYWxvZ19hY3Rpb25fY29udGV4dCIgPgotICAgICAgCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPgotIAkJPHRvcGljIGxhYmVsPSJTZWFyY2ggZm9yIG1ldGhvZCBjb250ZW50IiBocmVmPSJodG1sL2hlbHAvc2VhcmNoZm9ybWV0aG9kX2NvbnRlbnQuaHRtbCIvPgotICAgCTwvY29udGV4dD4KLQotICAgCTxjb250ZXh0ICBpZD0iZmlsZV9zZWFyY2hfYWN0aW9uX2NvbnRleHQiID4KLSAgICAgCSA8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLSAJCTx0b3BpYyBsYWJlbD0iU2VhcmNoIGZvciBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL3NlYXJjaGZvcm1ldGhvZF9jb250ZW50Lmh0bWwiLz4KLSAgIAk8L2NvbnRleHQ+Ci0gICAJCi08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvbnRleHRzX2F1dGhvcmluZ191aS54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY29udGV4dHNfYXV0aG9yaW5nX3VpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5ZjEwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY29udGV4dHNfYXV0aG9yaW5nX3VpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxjb250ZXh0cz4gCi0JPGNvbnRleHQgIGlkPSJmaWxlX25ld19saWJyYXJ5X2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2xpYnJhcnlfb3ZlcnZpZXcuaHRtbCIgIGxhYmVsPSJNZXRob2QgbGlicmFyeSBvdmVydmlldyIvPiAgCi0JPC9jb250ZXh0PiAKLQkKLQk8Y29udGV4dCAgaWQ9ImZpbGVfbmV3X3BsdWdpbl9jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfbWV0aG9kX3BsdWdpbi5odG1sIiAgbGFiZWw9IkNyZWF0ZSBhIG1ldGhvZCBwbHVnLWluIi8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJmaWxlX25ld19jb25maWd1cmF0aW9uX2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbmZpZ3VyYXRpb25zIG92ZXJ2aWV3Ii8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJmaWxlX29wZW5fbGlicmFyeV9jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9saWJyYXJ5X292ZXJ2aWV3Lmh0bWwiICBsYWJlbD0iTWV0aG9kIGxpYnJhcnkgb3ZlcnZpZXciLz4gCi0JPC9jb250ZXh0PiAKLQkKLQk8Y29udGV4dCAgaWQ9ImZpbGVfb3Blbl9jb25maWd1cmF0aW9uX2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbmZpZ3VyYXRpb25zIG92ZXJ2aWV3Ii8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJsaWJyYXJ5X25hdmlnYXRvcl92aWV3X2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPiA8L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9saWJyYXJ5X3ZpZXcuaHRtbCIgIGxhYmVsPSJMaWJyYXJ5IHZpZXciLz4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvYXV0aG9yaW5nX3BlcnNwZWN0aXZlLmh0bWwiICBsYWJlbD0iQXV0aG9yaW5nIHBlcnNwZWN0aXZlIi8+IAotCTwvY29udGV4dD4gCi0KLQk8Y29udGV4dCAgaWQ9ImNvbmZpZ3VyYXRpb25fdmlld19jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jb25maWd1cmF0aW9uX3ZpZXcuaHRtbCIgIGxhYmVsPSJDb25maWd1cmF0aW9uIHZpZXciLz4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sIiAgbGFiZWw9IkJyb3dzaW5nIHBlcnNwZWN0aXZlIi8+IAotCTwvY29udGV4dD4gCi0JCi0JCQk8IS0tIGJlZ2lubmluZyBvZiB0aGUgbGlicmFyeSBuYXZpZ2F0b3Igbm9kZSBzZW5zaXRpdmUgRjEgY29udGV4dCBoZWxwcyAtLT4KLQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X21ldGhvZF9wbHVnaW5fY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBtZXRob2QgcGx1Zy1pbiBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfY29udGVudF9wYWNrYWdlX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgQ29udGVudFBhY2thZ2Ugbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X3Rhc2tfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBtZXRob2QgVGFzayBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfd29ya19wcm9kdWN0X2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgV29ya1Byb2R1Y3Qgbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X2d1aWRhbmNlX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgR3VpZGFuY2Ugbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X2Rpc2NpcGxpbmVfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBEaXNjaXBsaW5lIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19kaXNjaXBsaW5lX2dyb3VwaW5nX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgRGlzY2lwbGluZUdyb3VwaW5nIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19kb21haW5fY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBEb21haW4gbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X3JvbGVfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBSb2xlIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld193b3JrX3Byb2R1Y3RfdHlwZV9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IFdvcmtQcm9kdWN0VHlwZSBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19yb2xlX3NldF9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IFJvbGVTZXQgbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCi0JCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld190b29sX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgbWV0aG9kIFRvb2wgbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfcm9sZV9zZXRfZ3JvdXBpbmdfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBSb2xlU2V0R3JvdXBpbmcgbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfY3VzdG9tX2NhdGVnb3J5X2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgQ3VzdG9tQ2F0ZWdvcnkgbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfcHJvY2Vzc19jb21wb25lbnRfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBQcm9jZXNzQ29tcG9uZW50IG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19wcm9jZXNzX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgUHJvY2VzcyBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfbWV0aG9kX2NvbmZpZ3VyYXRpb25fY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBNZXRob2RDb25maWd1cmF0aW9uIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQk8IS0tIGVuZCBvZiB0aGUgbGlicmFyeSBuYXZpZ2F0b3Igbm9kZSBzZW5zaXRpdmUgRjEgY29udGV4dCBoZWxwcyAtLT4KLQkKLQkKLQk8IS0tIGZvcm0gZWRpdG9yIHNlY3Rpb24gY29udGV4dCBoZWxwIC0tPgotCQotCTxjb250ZXh0ICBpZD0icGx1Z2luX2VkaXRvcl9kZXNjcmlwdGlvbl9hbGxfY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+IDwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9tZXRob2RfcGx1Z2luLmh0bWwiICBsYWJlbD0iQ3JlYXRlIGEgbWV0aG9kIHBsdWctaW4iLz4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWV0aG9kcGx1Z2luLmh0bWwiICBsYWJlbD0iTWV0aG9kIHBsdWctaW4iLz4gCi0JPC9jb250ZXh0PiAKLQkKLQk8Y29udGV4dCAgaWQ9ImNvbmZpZ3VyYXRpb25fZWRpdG9yX2FsbF9jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfbWV0aG9kX2NvbmZpZ3VyYXRpb24uaHRtbCIgIGxhYmVsPSJDcmVhdGUgYSBtZXRob2QgY29uZmlndXJhdGlvbiIvPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tZXRob2Rjb25maWd1cmF0aW9ucy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb25maWd1cmF0aW9ucyBvdmVydmlldyIvPiAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0iY29udGVudF9wYWNrYWdlX2VkaXRvcl9hbGxfY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2NvbnRlbnRwYWNrYWdlLmh0bWwiICBsYWJlbD0iQ3JlYXRpbmcgYSBjb250ZW50IHBhY2thZ2UiLz4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCIgIGxhYmVsPSJNZXRob2QgY29udGVudCBwYWNrYWdlIi8+IAotCTwvY29udGV4dD4gCi0JCi0JCi0JPGNvbnRleHQgIGlkPSJlZGl0b3Jfcm9sZV9jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9yb2xlLmh0bWwiICBsYWJlbD0iQ3JlYXRlIGEgcm9sZSIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJlZGl0b3JfdGFza19jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV90YXNrLmh0bWwiICBsYWJlbD0iQ3JlYXRlIGEgdGFzayIvPiAgCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX3dvcmtfcHJvZHVjdF9jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV93b3JrcHJvZHVjdC5odG1sIiAgbGFiZWw9IkNyZWF0ZSB3b3JrIHByb2R1Y3QiLz4gCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX2d1aWRhbmNlX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2d1aWRhbmNlLmh0bWwiICBsYWJlbD0iQ3JlYXRpbmcgZ3VpZGFuY2UiLz4gCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX2Rpc2NpcGxpbmVfY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jb250ZW50X2NhdGVnb3JpZXMuaHRtbCIgIGxhYmVsPSJNZXRob2QgY29udGVudCBjYXRlZ29yaWVzIi8+IAotCTwvY29udGV4dD4gCi0KLQk8Y29udGV4dCAgaWQ9ImVkaXRvcl9kaXNjaXBsaW5lX2dyb3VwaW5nX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgY2F0ZWdvcmllcyIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJlZGl0b3JfZG9tYWluX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgY2F0ZWdvcmllcyIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJlZGl0b3Jfd29ya19wcm9kdWN0X3R5cGVfY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj4gPC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgY2F0ZWdvcmllcyIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJlZGl0b3Jfcm9sZV9zZXRfY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jb250ZW50X2NhdGVnb3JpZXMuaHRtbCIgIGxhYmVsPSJNZXRob2QgY29udGVudCBjYXRlZ29yaWVzIi8+IAotCTwvY29udGV4dD4gCi0KLQk8Y29udGV4dCAgaWQ9ImVkaXRvcl9yb2xzZV9zZXRfZ3JvdXBpbmdfY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jb250ZW50X2NhdGVnb3JpZXMuaHRtbCIgIGxhYmVsPSJNZXRob2QgY29udGVudCBjYXRlZ29yaWVzIi8+IAotCTwvY29udGV4dD4gCi0KLQk8Y29udGV4dCAgaWQ9ImVkaXRvcl90b29sX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgY2F0ZWdvcmllcyIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJlZGl0b3JfY3VzdG9tX2NhdGVnb3J5X2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgY2F0ZWdvcmllcyIvPiAKLQk8L2NvbnRleHQ+IAotCQotCQkJPCEtLSBiZWdpbm5pbmcgb2Ygc2VjdGlvbiBiYXNlZCBGMSBjb250ZXh0IGhlbHAgLS0+Ci0JCQk8Y29udGV4dCAgaWQ9ImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX2dlbmVyYWxfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX2dlbmVyYWxfY29udGV4dC48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0iZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fZGV0YWlsX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9kZXRhaWxfY29udGV4dC48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0iZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fbm90YXRpb25fY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX25vdGF0aW9uX2NvbnRleHQuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX3RhaWxvcmluZ19jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fdGFpbG9yaW5nX2NvbnRleHQuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX3ZlcnNpb25fY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX3ZlcnNpb25fY29udGV4dC48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJPGNvbnRleHQgIGlkPSJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9lbGVtZW50X2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9lbGVtZW50X2NvbnRleHQuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCTxjb250ZXh0ICBpZD0iZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25faWNvbl9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25faWNvbl9jb250ZXh0LjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJPCEtLSBlbmQgb2Ygc2VjdGlvbiBiYXNlZCBGMSBjb250ZXh0IGhlbHAgLS0+Ci0JCi0JPGNvbnRleHQgIGlkPSJlZGl0b3JfY3BfZGVzY3JpcHRpb25fY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLQkJPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jYXBhYmlsaXR5cGF0dGVybi5odG1sIiAgbGFiZWw9IkNhcGFiaWxpdHkgcGF0dGVybiIvPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfY2FwYWJpbGl0eV9wYXR0ZXJuLmh0bWwiICBsYWJlbD0iQ3JlYXRlIGEgcmV1c2FibGUgY2FwYWJpbGl0eSBwYXR0ZXJuIi8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJlZGl0b3JfZHBfZGVzY3JpcHRpb25fY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLQkJPHRvcGljIGhyZWY9Imh0bWwvaGVscC9kZWxpdmVyeV9wcm9jZXNzLmh0bWwiICBsYWJlbD0iRGVsaXZlcnkgcHJvY2VzcyIvPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfZGVsaXZlcnlfcHJvY2Vzcy5odG1sIiAgbGFiZWw9IkNyZWF0ZSBhIGRlbGl2ZXJ5IHByb2Nlc3MiLz4gCi0JPC9jb250ZXh0PiAKLQkKLQk8Y29udGV4dCAgaWQ9ImZvcm1fZWRpdG9yX3Byb2Nlc3Nfd2JzX2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2RldmVsb3Bfd2JzLmh0bWwiICBsYWJlbD0iRGV2ZWxvcCBhIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSIvPiAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0iZm9ybV9lZGl0b3JfcHJvY2Vzc19vYnNfY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvZGV2ZWxvcF90ZWFtX3N0cnVjdHVyZS5odG1sIiAgbGFiZWw9IkRldmVsb3AgYSB0ZWFtIGFsbG9jYXRpb24gc3RydWN0dXJlIi8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJmb3JtX2VkaXRvcl9wcm9jZXNzX3Bic19jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9kZXZlbG9wX3dvcmtwcm9kdWN0X3N0cnVjdHVyZS5odG1sIiAgbGFiZWw9IkRldmVsb3AgYSB3b3JrIHByb2R1Y3QgdXNhZ2Ugc3RydWN0dXJlIi8+IAotCTwvY29udGV4dD4gCi0KLQkKLQk8Y29udGV4dCAgaWQ9ImNvbmZpZ3VyYXRpb25fcHVibGlzaF93aXphcmRfYWxsX3BhZ2VzX2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3B1Ymxpc2hpbmdvdmVydmlldy5odG1sIiAgbGFiZWw9IlB1Ymxpc2hpbmcgb3ZlcnZpZXciLz4gCi0JPC9jb250ZXh0PiAKLQkKLQk8Y29udGV4dCAgaWQ9InJpY2hfdGV4dF9lZGl0b3JfY29udGV4dF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvcmljaHRleHRlZGl0b3IuaHRtbCIgIGxhYmVsPSJSaWNoIHRleHQgZWRpdG9yIi8+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2FkZF9oeXBlcmxpbmsuaHRtbCIgIGxhYmVsPSJBZGRpbmcgYSByZWZlcmVuY2Ugb3IgaHlwZXJsaW5rIi8+IAotCTwvY29udGV4dD4gCi0JCi08L2NvbnRleHRzPiAKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGVyZXVzYWJsZW1ldGhvZGNvbnRlbnQueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NyZWF0ZXJldXNhYmxlbWV0aG9kY29udGVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZWVmYjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NyZWF0ZXJldXNhYmxlbWV0aG9kY29udGVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkNyZWF0ZSBSZXVzYWJsZSBNZXRob2QgQ29udGVudCIgbGlua190bz0ibWFpbi54bWwjY3JlYXRlcmV1c2FibGVtZXRob2Rjb250ZW50X2lkIj4KLSAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29udGVudCBhdXRob3Jpbmcgb3ZlcnZpZXciIGhyZWY9Imh0bWwvaGVscC9tZXRob2RhdXRob3JpbmdvdmVydmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb250ZW50IiBocmVmPSJodG1sL2hlbHAvbWV0aG9kX2NvbnRlbnQuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfbWV0aG9kX2NvbnRlbnQuaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHJvbGUiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfcm9sZS5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHRhc2siIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfdGFzay5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHdvcmsgcHJvZHVjdCIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV93b3JrcHJvZHVjdC5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBndWlkYW5jZSIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9ndWlkYW5jZS5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IlZhcmlhYmlsaXR5IiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHkuaHRtbCI+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkNvbnRyaWJ1dGVzIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfY29udHJpYnV0ZXMuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJFeHRlbmRzIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfZXh0ZW5kcy5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IlJlcGxhY2VzIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfcmVwbGFjZS5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IlZhcmlhYmlsaXR5IGFzc29jaWF0aW9ucyIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5X2Fzc29jaWF0aW9ucy5odG1sIi8+Ci0gICAgICA8L3RvcGljPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iQnJvd3NlIGFuZCBwcmV2aWV3IG1ldGhvZCBjb250ZW50IiBocmVmPSJodG1sL2hlbHAvYnJvd3NlX2NvbnRlbnQuaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRpbmdfbWV0aG9kX2NvbnRlbnQueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NyZWF0aW5nX21ldGhvZF9jb250ZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFjYmI3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRpbmdfbWV0aG9kX2NvbnRlbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPHRvYyBsYWJlbD0iQ3JlYXRpbmcgcmV1c2FibGUgbWV0aG9kIGNvbnRlbnQiIGxpbmtfdG89Im1haW4ueG1sI2NyZWF0aW5nX21ldGhvZF9jb250ZW50X2lkIj4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIE1ldGhvZCBDb250ZW50IiBocmVmPSJodG1sL3RvcGljcy90X2NyZWF0ZV9tZXRob2RfY29udGVudC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIFJvbGUiIGhyZWY9Imh0bWwvdG9waWNzL3RfY3JlYXRlX3JvbGUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBUYXNrIiBocmVmPSJodG1sL3RvcGljcy90X2NyZWF0ZV90YXNrLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgV29yayBQcm9kdWN0IiBocmVmPSJodG1sL3RvcGljcy90X2NyZWF0ZV93b3JrcHJvZHVjdC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBHdWlkYW5jZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jcmVhdGVfZ3VpZGFuY2UuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJHdWlkYW5jZSBSZWxhdGlvbnNoaXBzIiBocmVmPSJodG1sL3RvcGljcy9yX2d1aWRhbmNlX3JlbGF0aW9uc2hpcHMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJSaWNoIFRleHQgRWRpdG9yIiBocmVmPSJodG1sL3RvcGljcy9jX3JpY2h0ZXh0X2VkaXRvci5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkFkZCBhIFJlZmVyZW5jZSBvciBIeXBlcmxpbmsiIGhyZWY9Imh0bWwvdG9waWNzL3RfYWRkX2h5cGVybGluay5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBDb250ZW50IFZhcmlhYmlsaXR5IiBocmVmPSJodG1sL3RvcGljcy9jX3ZhcmlhYmlsaXR5Lmh0bWwiPgotICAgICAgPHRvcGljIGxhYmVsPSJDb250cmlidXRlcyBWYXJpYWJpbGl0eSIgaHJlZj0iaHRtbC90b3BpY3MvY192YXJpYWJpbGl0eV9jb250cmlidXRlcy5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkV4dGVuZHMgVmFyaWFiaWxpdHkiIGhyZWY9Imh0bWwvdG9waWNzL2NfdmFyaWFiaWxpdHlfZXh0ZW5kcy5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IlJlcGxhY2VzIFZhcmlhYmlsaXR5IiBocmVmPSJodG1sL3RvcGljcy9jX3ZhcmlhYmlsaXR5X3JlcGxhY2VzLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iRXh0ZW5kcyBhbmQgcmVwbGFjZXMgdmFyaWFiaWxpdHkiIGhyZWY9Imh0bWwvdG9waWNzL2NfdmFyaWFiaWxpdHlfZXh0ZW5kX3JlcGxhY2UuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJBc3NvY2lhdGlvbnMgSW1wYWN0ZWQgYnkgVmFyaWFiaWxpdHkiIGhyZWY9Imh0bWwvdG9waWNzL3JfdmFyaWFiaWxpdHlfYXNzb2NpYXRpb25zLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQnJvd3NpbmcgVmFyaWFiaWxpdHkgUmVsYXRpb25zaGlwcyIgaHJlZj0iaHRtbC90b3BpY3MvdF92YXJpYWJpbGl0eV9icm93c2luZy5odG1sIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJCcm93c2UgYW5kIFByZXZpZXcgTWV0aG9kIENvbnRlbnQiIGhyZWY9Imh0bWwvdG9waWNzL3RfYnJvd3NlX2NvbnRlbnQuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGluZyBJbmRleCBFbnRyaWVzIiBocmVmPSJodG1sL3RvcGljcy9yX2luZGV4X3N5bnRheC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNoYW5naW5nIFRoZSBGZWVkYmFjayBBZGRyZXNzIiBocmVmPSJodG1sL3RvcGljcy9jX2NoYW5naW5nX2ZlZWRiYWNrLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iV2ViIFNpdGUgU2VhcmNoIiBocmVmPSJodG1sL3RvcGljcy9jX3NpdGVfc2VhcmNoLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iR2xvc3NhcnkgZW50cmllcyIgaHJlZj0iaHRtbC90b3BpY3MvY19nbG9zc2FyeS5odG1sIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgR2xvc3NhcnkgRW50cmllcyIgaHJlZj0iaHRtbC90b3BpY3MvdF9nbG9zc2FyeV9jcmVhdGUuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJFZGl0aW5nIEdsb3NzYXJ5IEVudHJpZXMiIGhyZWY9Imh0bWwvdG9waWNzL3RfZ2xvc3NhcnlfZWRpdC5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkRlbGV0aW5nIEdsb3NzYXJ5IEVudHJpZXMiIGhyZWY9Imh0bWwvdG9waWNzL3RfZ2xvc3NhcnlfZGVsZXRlLmh0bWwiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IkNvcHlyaWdodCBub3RpY2VzIiBocmVmPSJodG1sL3RvcGljcy9jX2NvcHlyaWdodC5odG1sIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ29weXJpZ2h0IE5vdGljZXMgaW4gYSBOZXcgUGx1Zy1JbiIgaHJlZj0iaHRtbC90b3BpY3MvdF9jb3B5cmlnaHRfbmV3X3BsdWdpbi5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNoYW5naW5nIHRoZSBEZWZhdWx0IENvcHlyaWdodCBOb3RpY2UiIGhyZWY9Imh0bWwvdG9waWNzL3RfY29weXJpZ2h0X2NoYW5naW5nX2RlZmF1bHQuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJPdmVycmlkaW5nIHRoZSBDb3B5cmlnaHQgTm90aWNlIGluIGEgUGx1Zy1pbiIgaHJlZj0iaHRtbC90b3BpY3MvdF9jb3B5cmlnaHRfb3ZlcnJpZGluZ19kZWZhdWx0Lmh0bWwiLz4KLSAgIDwvdG9waWM+Ci08L3RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRpbmdfcHJvY2Vzc2VzLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGluZ19wcm9jZXNzZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmU5ZjQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGluZ19wcm9jZXNzZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJDcmVhdGluZyBwcm9jZXNzZXMiIGxpbmtfdG89Im1haW4ueG1sI2NyZWF0aW5nX3Byb2Nlc3Nlc19pZCI+ICAKLSAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSByZXVzYWJsZSBjYXBhYmlsaXR5IHBhdHRlcm4iIGhyZWY9Imh0bWwvdG9waWNzL3RfY2FwYWJpbGl0eV9wYXR0ZXJuX2NyZWF0ZS5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgZGVsaXZlcnkgcHJvY2VzcyIgaHJlZj0iaHRtbC90b3BpY3MvdF9jcmVhdGVfZGVsaXZlcnlfcHJvY2Vzcy5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iRGV2ZWxvcCBhIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9kZXZlbG9wX3dicy5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iRGV2ZWxvcCBhIHRlYW0gYWxsb2NhdGlvbiBzdHJ1Y3R1cmUiIGhyZWY9Imh0bWwvdG9waWNzL3RfZGV2ZWxvcF90ZWFtX3N0cnVjdHVyZS5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iRGV2ZWxvcCBhIHdvcmsgcHJvZHVjdCB1c2FnZSBzdHJ1Y3R1cmUiIGhyZWY9Imh0bWwvdG9waWNzL3RfZGV2ZWxvcF93b3JrcHJvZHVjdF9zdHJ1Y3R1cmUuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkFwcGx5aW5nIGNhcGFiaWxpdHkgcGF0dGVybnMiIGhyZWY9Imh0bWwvdG9waWNzL2NfY2FwYWJpbGl0eV9wYXR0ZXJuLmh0bWwiPgotICAgIDx0b3BpYyBsYWJlbD0iQ29weWluZyBhIGNhcGFiaWxpdHkgcGF0dGVybiIgaHJlZj0iaHRtbC90b3BpY3MvdF9jYXBhYmlsaXR5X3BhdHRlcm5fY29weS5odG1sIi8+Ci0gICAgPHRvcGljIGxhYmVsPSJFeHRlbmRpbmcgYSBjYXBhYmlsaXR5IHBhdHRlcm4iIGhyZWY9Imh0bWwvdG9waWNzL3RfY2FwYWJpbGl0eV9wYXR0ZXJuX2V4dGVuZC5odG1sIi8+Ci0gICAgPHRvcGljIGxhYmVsPSJEZWVwIGNvcHlpbmcgYSBjYXBhYmlsaXR5IHBhdHRlcm4iIGhyZWY9Imh0bWwvdG9waWNzL3RfY2FwYWJpbGl0eV9wYXR0ZXJuX2RlZXBfY29weS5odG1sIi8+Ci0gICAgPC90b3BpYz4KLSAgPHRvcGljIGxhYmVsPSJQcm9jZXNzIGVsZW1lbnQgcHJvcGVydGllcyB2aWV3IiBocmVmPSJodG1sL3RvcGljcy9jX3Byb3BlcnRpZXNfdmlldy5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iVXNpbmcgYWN0aXZpdHkgdmFyaWFiaWxpdHkiIGhyZWY9Imh0bWwvdG9waWNzL2NfYWN0aXZpdHlfdmFyaWFiaWxpdHkuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IlVzaW5nIHByb2Nlc3MgdG8gbWV0aG9kIHN5bmNocm9uaXphdGlvbiIgaHJlZj0iaHRtbC90b3BpY3MvdF91c2luZ19zeW5jaHJvbml6YXRpb24uaHRtbCIvPgotICA8dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBwcm9jZXNzIGRpYWdyYW1zIiBocmVmPSJodG1sL3RvcGljcy9jX3Byb2Nlc3NfZGlhZ3JhbXMuaHRtbCI+Ci0gICAgIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIGFjdGl2aXR5IGRpYWdyYW1zIiBocmVmPSJodG1sL3RvcGljcy9jX2FjdGl2aXR5X2RpYWdyYW1zLmh0bWwiLz4KLSAgICAgPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW1zIiBocmVmPSJodG1sL3RvcGljcy9jX2FjdGl2aXR5X2RldGFpbF9kaWFncmFtcy5odG1sIi8+Ci0gIDwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGluZ3Byb2Nlc3Nlcy54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRpbmdwcm9jZXNzZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGZjN2IzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGluZ3Byb2Nlc3Nlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkNyZWF0aW5nIFByb2Nlc3NlcyIgbGlua190bz0ibWFpbi54bWwjY3JlYXRpbmdwcm9jZXNzZXNfaWQiPgotICAgICAgPHRvcGljIGxhYmVsPSJQcm9jZXNzIGF1dGhvcmluZyBvdmVydmlldyIgaHJlZj0iaHRtbC9oZWxwL3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iUHJvY2VzcyIgaHJlZj0iaHRtbC9oZWxwL3Byb2Nlc3MuaHRtbCIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgcmV1c2FibGUgY2FwYWJpbGl0eSBwYXR0ZXJuIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2NhcGFiaWxpdHlfcGF0dGVybi5odG1sIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ2FwYWJpbGl0eSBwYXR0ZXJuIiBocmVmPSJodG1sL2hlbHAvY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgZGVsaXZlcnkgcHJvY2VzcyIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9kZWxpdmVyeV9wcm9jZXNzLmh0bWwiPgotICAgICAgPHRvcGljIGxhYmVsPSJEZWxpdmVyeSBwcm9jZXNzIiBocmVmPSJodG1sL2hlbHAvZGVsaXZlcnlfcHJvY2Vzcy5odG1sIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJEZXZlbG9wIGEgd29yayBicmVha2Rvd24gc3RydWN0dXJlIiBocmVmPSJodG1sL2hlbHAvZGV2ZWxvcF93YnMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJEZXZlbG9wIGEgdGVhbSBhbGxvY2F0aW9uIHN0cnVjdHVyZSIgaHJlZj0iaHRtbC9oZWxwL2RldmVsb3BfdGVhbV9zdHJ1Y3R1cmUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJEZXZlbG9wIGEgd29yayBwcm9kdWN0IHVzYWdlIHN0cnVjdHVyZSIgaHJlZj0iaHRtbC9oZWxwL2RldmVsb3Bfd29ya3Byb2R1Y3Rfc3RydWN0dXJlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQXBwbHkgYSBjYXBhYmlsaXR5IHBhdHRlcm4iIGhyZWY9Imh0bWwvaGVscC9hcHBseV9jYXBhYmlsaXR5cGF0dGVybi5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlByb2Nlc3MgZWxlbWVudCBwcm9wZXJ0aWVzIHZpZXciIGhyZWY9Imh0bWwvaGVscC9wcm9wZXJ0aWVzX3ZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggcHJvY2VzcyBkaWFncmFtcyIgaHJlZj0iaHRtbC9oZWxwL3Byb2Nlc3NfZGlhZ3JhbXMuaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBhY3Rpdml0eSBkaWFncmFtcyIgaHJlZj0iaHRtbC9oZWxwL2FjdGl2aXR5X2RpYWdyYW1zLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyIgaHJlZj0iaHRtbC9oZWxwL2FjdGl2aXR5X2RldGFpbF9kaWFncmFtcy5odG1sIi8+Ci0gICA8L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvZ2V0dGluZ19zdGFydGVkLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9nZXR0aW5nX3N0YXJ0ZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDQ1YzJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9nZXR0aW5nX3N0YXJ0ZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPHRvYyBsYWJlbD0iR2V0dGluZyBzdGFydGVkIiBsaW5rX3RvPSJtYWluLnhtbCNnZXR0aW5nX3N0YXJ0ZWRfaWQiPgotICAgPHRvcGljIGxhYmVsPSJVc2VyIEludGVyZmFjZSBSZWZlcmVuY2UiIGhyZWY9Imh0bWwvdG9waWNzL3JfdXNlcl9pbnRlcmZhY2UuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJBdXRob3JpbmcgUGVyc3BlY3RpdmUiIGhyZWY9Imh0bWwvdG9waWNzL2NfYXV0aG9yaW5nX3BlcnNwZWN0aXZlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQnJvd3NpbmcgUGVyc3BlY3RpdmUiIGhyZWY9Imh0bWwvdG9waWNzL2NfYnJvd3NpbmdfcGVyc3BlY3RpdmUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDb25maWd1cmF0aW9uIHZpZXciIGhyZWY9Imh0bWwvdG9waWNzL2NfY29uZmlndXJhdGlvbl92aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQnJvd3NlIGFuZCBQcmV2aWV3IE1ldGhvZCBDb250ZW50IiBocmVmPSJodG1sL3RvcGljcy90X2Jyb3dzZV9jb250ZW50Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iU2VhcmNoIGZvciBNZXRob2QgQ29udGVudCIgaHJlZj0iaHRtbC90b3BpY3MvdF9zZWFyY2hfY29udGVudC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIE1ldGhvZCBQbHVnLWluIiBocmVmPSJodG1sL3RvcGljcy90X2NyZWF0ZV9tZXRob2RfcGx1Z2luLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgQ29udGVudCBQYWNrYWdlIiBocmVmPSJodG1sL3RvcGljcy90X2NyZWF0ZV9jb250ZW50X3BhY2thZ2UuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIE5ldyBNZXRob2QgQ29uZmlndXJhdGlvbiIgaHJlZj0iaHRtbC90b3BpY3MvdF9tZXRob2RfY29uZmlndXJhdGlvbl9uZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGluZyBBIENvcHkgb2YgYSBNZXRob2QgQ29uZmlndXJhdGlvbiIgaHJlZj0iaHRtbC90b3BpY3MvdF9tZXRob2RfY29uZmlndXJhdGlvbl9jb3B5Lmh0bWwiLz4KLTwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9nZXR0aW5nc3RhcnRlZC54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvZ2V0dGluZ3N0YXJ0ZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGIxN2UyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9nZXR0aW5nc3RhcnRlZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkdldHRpbmcgU3RhcnRlZCIgbGlua190bz0ibWFpbi54bWwjZ2V0dGluZ3N0YXJ0ZWRfaWQiPgotICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBsaWJyYXJ5IG92ZXJ2aWV3IiBocmVmPSJodG1sL2hlbHAvbGlicmFyeV9vdmVydmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlRvb2wgaW50ZXJmYWNlIiBocmVmPSJodG1sL2hlbHAvdXNlcmludGVyZmFjZV9vdmVydmlldy5odG1sIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQXV0aG9yaW5nIHBlcnNwZWN0aXZlIiBocmVmPSJodG1sL2hlbHAvYXV0aG9yaW5nX3BlcnNwZWN0aXZlLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQnJvd3NpbmcgcGVyc3BlY3RpdmUiIGhyZWY9Imh0bWwvaGVscC9icm93c2luZ19wZXJzcGVjdGl2ZS5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNvbmZpZ3VyYXRpb24gVmlldyIgaHJlZj0iaHRtbC9oZWxwL2NvbmZpZ3VyYXRpb25fdmlldy5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkxpYnJhcnkgdmlldyIgaHJlZj0iaHRtbC9oZWxwL2xpYnJhcnlfdmlldy5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkJyb3dzZSBhbmQgcHJldmlldyBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL2Jyb3dzZV9jb250ZW50Lmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iU2VhcmNoIGZvciBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL3NlYXJjaF9jb250ZW50Lmh0bWwiLz4KLSAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIG1ldGhvZCBwbHVnLWluIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX21ldGhvZF9wbHVnaW4uaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBjb250ZW50IHBhY2thZ2UiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfY29udGVudHBhY2thZ2UuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBtZXRob2QgY29uZmlndXJhdGlvbiIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9tZXRob2RfY29uZmlndXJhdGlvbi5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9nbG9zc2FyeS54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvZ2xvc3NhcnkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDBkZjdhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9nbG9zc2FyeS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08dG9jIGxhYmVsPSJHbG9zc2FyeSIgbGlua190bz0ibWFpbi54bWwjZ2xvc3NhcnlfaWQiPgotICAgPHRvcGljIGxhYmVsPSJBY3Rpdml0eSIgaHJlZj0iaHRtbC90b3BpY3MvZ19hY3Rpdml0eS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkFydGlmYWN0IiBocmVmPSJodG1sL3RvcGljcy9nX2FydGlmYWN0Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ2hlY2tsaXN0IiBocmVmPSJodG1sL3RvcGljcy9nX2NoZWNrbGlzdC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNvbmNlcHQiIGhyZWY9Imh0bWwvdG9waWNzL2dfY29uY2VwdC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkRlZXAgY29weSIgaHJlZj0iaHRtbC90b3BpY3MvZ19kZWVwX2NvcHkuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJEZWxpdmVyYWJsZSIgaHJlZj0iaHRtbC90b3BpY3MvZ19kZWxpdmVyYWJsZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkRlbGl2ZXJ5IHByb2Nlc3MiIGhyZWY9Imh0bWwvdG9waWNzL2dfZGVsaXZlcnlfcHJvY2Vzcy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkRpc2NpcGxpbmUiIGhyZWY9Imh0bWwvdG9waWNzL2dfZGlzY2lwbGluZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkRvbWFpbiIgaHJlZj0iaHRtbC90b3BpY3MvZ19kb21haW4uaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJFc3RpbWF0aW5nIGNvbnNpZGVyYXRpb25zIiBocmVmPSJodG1sL3RvcGljcy9nX2VzdGltYXRpbmdfY29uc2lkZXJhdGlvbnMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJFc3RpbWF0aW5nIGd1aWRlbGluZSIgaHJlZj0iaHRtbC90b3BpY3MvZ19lc3RpbWF0aW5nX2d1aWRlbGluZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkV4YW1wbGUiIGhyZWY9Imh0bWwvdG9waWNzL2dfZXhhbXBsZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ikd1aWRlbGluZSIgaHJlZj0iaHRtbC90b3BpY3MvZ19ndWlkZWxpbmUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJJdGVyYXRpb24iIGhyZWY9Imh0bWwvdG9waWNzL2dfaXRlcmF0aW9uLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTGlicmFyeSB2aWV3IiBocmVmPSJodG1sL3RvcGljcy9nX2xpYnJhcnlfdmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ik1pbGVzdG9uZSIgaHJlZj0iaHRtbC90b3BpY3MvZ19taWxlc3RvbmUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJPdXRjb21lIiBocmVmPSJodG1sL3RvcGljcy9nX291dGNvbWUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJQaGFzZSIgaHJlZj0iaHRtbC90b3BpY3MvZ19waGFzZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlByYWN0aWNlIiBocmVmPSJodG1sL3RvcGljcy9nX3ByYWN0aWNlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUHJldmlldyIgaHJlZj0iaHRtbC90b3BpY3MvZ19wcmV2aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUmVwb3J0IiBocmVmPSJodG1sL3RvcGljcy9nX3JlcG9ydC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlJldXNhYmxlIGFzc2V0IiBocmVmPSJodG1sL3RvcGljcy9nX3JldXNhYmxlX2Fzc2V0Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUm9hZG1hcCIgaHJlZj0iaHRtbC90b3BpY3MvZ19yb2FkbWFwLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUm9sZSIgaHJlZj0iaHRtbC90b3BpY3MvZ19yb2xlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUm9sZSBzZXQiIGhyZWY9Imh0bWwvdG9waWNzL2dfcm9sZXNldC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlJvbGUgc2V0IGdyb3VwaW5nIiBocmVmPSJodG1sL3RvcGljcy9nX3JvbGVzZXRfZ3JvdXBpbmcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJTdGVwIiBocmVmPSJodG1sL3RvcGljcy9nX3N0ZXAuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJTdXBwb3J0aW5nIG1hdGVyaWFsIiBocmVmPSJodG1sL3RvcGljcy9nX3N1cHBvcnRpbmdfbWF0ZXJpYWwuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJTeW5jaHJvbml6YXRpb24iIGhyZWY9Imh0bWwvdG9waWNzL2dfc3luY2hyb25pemF0aW9uLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iVGFzayIgaHJlZj0iaHRtbC90b3BpY3MvZ190YXNrLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iVGVtcGxhdGUiIGhyZWY9Imh0bWwvdG9waWNzL2dfdGVtcGxhdGUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJUZXJtIGRlZmluaXRpb24iIGhyZWY9Imh0bWwvdG9waWNzL2dfdGVybV9kZWZpbml0aW9uLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iVG9vbCBtZW50b3IiIGhyZWY9Imh0bWwvdG9waWNzL2dfdG9vbF9tZW50b3IuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJXaGl0ZSBwYXBlciIgaHJlZj0iaHRtbC90b3BpY3MvZ193aGl0ZXBhcGVyLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iV29yayBwcm9kdWN0IiBocmVmPSJodG1sL3RvcGljcy9nX3dvcmtfcHJvZHVjdC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IldvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIiBocmVmPSJodG1sL3RvcGljcy9nX3dvcmtfcHJvZHVjdF9kZXNjcmlwdG9yLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iV29yayBwcm9kdWN0IGtpbmQiIGhyZWY9Imh0bWwvdG9waWNzL2dfd29ya19wcm9kdWN0X2tpbmQuaHRtbCIvPgotPC90b2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvQXV0aG9yUGVyc3AuSlBHIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvQXV0aG9yUGVyc3AuSlBHCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTRlNzkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL0F1dGhvclBlcnNwLkpQRworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Fib3V0ZXBmY29tcG9zZXIuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Fib3V0ZXBmY29tcG9zZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhNTYyMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hYm91dGVwZmNvbXBvc2VyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWJvdXQgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCNtZXRob2RhdXRob3JpbmdvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwjcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImFib3V0ZXBmY29tcG9zZXIiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+QWJvdXQgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iYWJvdXRlcGZjb21wb3NlciI+PGEgbmFtZT0iYWJvdXRlcGZjb21wb3NlciI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFib3V0IEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXI8L2gxPgotPGRpdj48cD5XZWxjb21lIHRvIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgKEVQRiBDb21wb3NlcikuIEVQRiBDb21wb3NlciBpcyBhIHRvb2wgcGxhdGZvcm0gdGhhdAotZW5hYmxlcyBwcm9jZXNzIGVuZ2luZWVycyBhbmQgbWFuYWdlcnMgdG8gaW1wbGVtZW50LCBkZXBsb3ksIGFuZCBtYWludGFpbgotcHJvY2Vzc2VzIGZvciBvcmdhbml6YXRpb25zIG9yIGluZGl2aWR1YWwgcHJvamVjdHMuIFR5cGljYWxseSwgdHdvIGtleSBwcm9ibGVtcwotbmVlZCB0byBiZSBhZGRyZXNzZWQgdG8gc3VjY2Vzc2Z1bGx5IGRlcGxveSBuZXcgcHJvY2Vzc2VzLjwvcD4KLTxwPkZpcnN0LCBkZXZlbG9wbWVudCB0ZWFtcyBuZWVkIHRvIGJlIGVkdWNhdGVkIG9uIHRoZSBtZXRob2RzIGFwcGxpY2FibGUKLXRvIHRoZSByb2xlcyB0aGF0IHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gU29mdHdhcmUgZGV2ZWxvcGVycyB0eXBpY2FsbHkKLW5lZWQgdG8gbGVhcm4gaG93IHRvIGRvIGFuYWx5c2lzIGFuZCBkZXNpZ24sIHRlc3RlcnMgbmVlZCB0byBsZWFybiBob3cgdG8KLXRlc3QgaW1wbGVtZW50YXRpb25zIGFnYWluc3QgcmVxdWlyZW1lbnRzLCBtYW5hZ2VycyBuZWVkIHRvIGxlYXJuIGhvdyB0byBtYW5hZ2UKLXRoZSBwcm9qZWN0IHNjb3BlIGFuZCBjaGFuZ2UsIGFuZCBzbyBvbi4gU29tZSBvcmdhbml6YXRpb25zIGFzc3VtZSB0aGF0IGRldmVsb3BlcnMKLWltcGxpY2l0bHkga25vdyBob3cgdG8gZG8gc3VjaCB3b3JrIHdpdGhvdXQgZG9jdW1lbnRpbmcgdGhlaXIgbWV0aG9kcywgYnV0Ci1tYW55IG9yZ2FuaXphdGlvbnMgd2FudCB0byBlc3RhYmxpc2ggY29tbW9uIGFuZCByZWd1bGF0ZWQgcHJhY3RpY2VzLCB0byBkcml2ZQotc3BlY2lmaWMgaW1wcm92ZW1lbnQgb2JqZWN0aXZlcywgYW5kIHRvIG1lZXQgY29tcGxpYW5jZSBzdGFuZGFyZHMuIDwvcD4KLTxwPlNlY29uZCwgZGV2ZWxvcG1lbnQgdGVhbXMgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0byBhcHBseSB0aGVzZSBtZXRob2RzCi10aHJvdWdob3V0IGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiBUaGF0IGlzLCB0aGV5IG5lZWQgdG8gZGVmaW5lIG9yIHNlbGVjdAotYSBkZXZlbG9wbWVudCBwcm9jZXNzLiBGb3IgZXhhbXBsZSwgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQgbWV0aG9kcyBoYXZlIHRvCi1iZSBhcHBsaWVkIGRpZmZlcmVudGx5IGluIGVhcmx5IHBoYXNlcyBvZiBhIHByb2plY3Qgd2hlcmUgdGhlIGZvY3VzIGlzIG9uCi1lbGljaXRhdGlvbiBvZiBzdGFrZWhvbGRlciBuZWVkcyBhbmQgcmVxdWlyZW1lbnRzIGFuZCBzY29waW5nIGEgdmlzaW9uLCB0aGFuCi1pbiBsYXRlciBwaGFzZXMgd2hlcmUgdGhlIGZvY3VzIGlzIG9uIG1hbmFnaW5nIHJlcXVpcmVtZW50cyB1cGRhdGVzIGFuZCBjaGFuZ2VzCi1hbmQgcGVyZm9ybWluZyBpbXBhY3QgYW5hbHlzaXMgb2YgdGhlc2UgcmVxdWlyZW1lbnRzIGNoYW5nZXMuIFRlYW1zIGFsc28gbmVlZAotY2xlYXIgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlIGRpZmZlcmVudCB0YXNrcyBvZiB0aGUgbWV0aG9kcyByZWxhdGUgdG8gZWFjaAotb3RoZXIsIGZvciBleGFtcGxlLCBob3cgdGhlIGNoYW5nZSBtYW5hZ2VtZW50IG1ldGhvZCBpbXBhY3RzIHRoZSByZXF1aXJlbWVudHMKLW1hbmFnZW1lbnQgbWV0aG9kIGFzIHdlbGwgYXMgcmVncmVzc2lvbiB0ZXN0aW5nIG1ldGhvZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUuCi1FdmVuIHNlbGYtb3JnYW5pemluZyB0ZWFtcyBuZWVkIHRvIGRlZmluZSBhIHByb2Nlc3MgdGhhdCBnaXZlcyBhdCBtaW5pbXVtCi1zb21lIGd1aWRhbmNlIG9uIGhvdyB0aGUgZGV2ZWxvcG1lbnQgd2lsbCBiZSBzY29wZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlLAotd2hlbiBtaWxlc3RvbmVzIHdpbGwgYmUgYWNoaWV2ZWQgYW5kIHZlcmlmaWVkLCBhbmQgc28gb24uICA8L3A+Ci08ZGl2IGNsYXNzPSJwIj5UbyB0aGF0IGVuZCwgRVBGIENvbXBvc2VyIGhhcyB0d28gbWFpbiBwdXJwb3Nlczo8dWw+PGxpPlRvIHByb3ZpZGUgYSBrbm93bGVkZ2UgYmFzZSBvZiBpbnRlbGxlY3R1YWwgY2FwaXRhbCB3aGljaCB5b3UgY2FuIGJyb3dzZSwKLW1hbmFnZSBhbmQgZGVwbG95LiBUaGlzIGNvbnRlbnQgY2FuIGluY2x1ZGUgZXh0ZXJuYWxseSBkZXZlbG9wZWQgY29udGVudCwKLWFuZCwgbW9yZSBpbXBvcnRhbnRseSwgY2FuIGluY2x1ZGUgeW91ciBvd24gY29udGVudCBpbmNsdWRpbmcgb2Ygd2hpdGVwYXBlcnMsCi1ndWlkZWxpbmVzLCB0ZW1wbGF0ZXMsIHByaW5jaXBsZXMsIGJlc3QgcHJhY3RpY2VzLCBpbnRlcm5hbCBwcm9jZWR1cmVzIGFuZAotcmVndWxhdGlvbnMsIHRyYWluaW5nIG1hdGVyaWFsLCBhbmQgYW55IG90aGVyIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHlvdXIKLW1ldGhvZHMuIFRoaXMga25vd2xlZGdlIGJhc2UgY2FuIHVzZWQgZm9yIHJlZmVyZW5jZSBhbmQgZWR1Y2F0aW9uLiBJdCBhbHNvCi1mb3JtcyB0aGUgYmFzaXMgZm9yIGRldmVsb3BpbmcgcHJvY2Vzc2VzICh0aGUgc2Vjb25kIHB1cnBvc2UpLiBFUEYgQ29tcG9zZXIgaXMgZGVzaWduZWQKLXRvIGJlIGEgY29udGVudCBtYW5hZ2VtZW50IHN5c3RlbSB0aGF0IHByb3ZpZGVzIGEgY29tbW9uIG1hbmFnZW1lbnQgc3RydWN0dXJlCi1hbmQgbG9vayBhbmQgZmVlbCBmb3IgYWxsIG9mIHlvdXIgY29udGVudCwgcmF0aGVyIHRoYW4gYmVpbmcgYSBkb2N1bWVudCBtYW5hZ2VtZW50Ci1zeXN0ZW0gaW4gd2hpY2ggeW91IHdvdWxkIHN0b3JlIGFuZCBhY2Nlc3MgaGFyZCB0byBtYWludGFpbiBsZWdhY3kgZG9jdW1lbnRzCi1hbGwgaW4gdGhlaXIgb3duIHNoYXBlcyBhbmQgZm9ybWF0cy4gQWxsIGNvbnRlbnQgbWFuYWdlZCBpbiBFUEYgQ29tcG9zZXIgY2FuIGJlIHB1Ymxpc2hlZAotdG8gaHRtbCBhbmQgZGVwbG95ZWQgdG8gV2ViIHNlcnZlcnMgZm9yIGRpc3RyaWJ1dGVkIHVzYWdlLiA8L2xpPgotPGxpPlRvIHByb3ZpZGUgcHJvY2VzcyBlbmdpbmVlcmluZyBjYXBhYmlsaXRpZXMgYnkgc3VwcG9ydGluZyBwcm9jZXNzIGVuZ2luZWVycwotYW5kIHByb2plY3QgbWFuYWdlcnMgaW4gc2VsZWN0aW5nLCB0YWlsb3JpbmcsIGFuZCByYXBpZGx5IGFzc2VtYmxpbmcgcHJvY2Vzc2VzCi1mb3IgdGhlaXIgY29uY3JldGUgZGV2ZWxvcG1lbnQgcHJvamVjdHMuIEVQRiBDb21wb3NlciBwcm92aWRlcyBjYXRhbG9ncyBvZiBwcmUtZGVmaW5lZAotcHJvY2Vzc2VzIGZvciB0eXBpY2FsIHByb2plY3Qgc2l0dWF0aW9ucyB0aGF0IGNhbiBiZSBhZGFwdGVkIHRvIGluZGl2aWR1YWwKLW5lZWRzLiBJdCBhbHNvIHByb3ZpZGVzIHByb2Nlc3MgYnVpbGRpbmcgYmxvY2tzLCBjYWxsZWQgY2FwYWJpbGl0eSBwYXR0ZXJucywKLXRoYXQgcmVwcmVzZW50IGJlc3QgZGV2ZWxvcG1lbnQgcHJhY3RpY2VzIGZvciBzcGVjaWZpYyBkaXNjaXBsaW5lcywgdGVjaG5vbG9naWVzLAotb3IgbWFuYWdlbWVudCBzdHlsZXMuIFRoZXNlIGJ1aWxkaW5nIGJsb2NrcyBmb3JtIGEgdG9vbGtpdCBmb3IgcXVpY2sgYXNzZW1ibHkKLW9mIHByb2Nlc3NlcyBiYXNlZCBvbiBwcm9qZWN0LXNwZWNpZmljIG5lZWRzLiBFUEYgQ29tcG9zZXIgYWxzbyBhbGxvd3MgeW91IHRvIHNldCB1cAoteW91ciBvd24gb3JnYW5pemF0aW9uLXNwZWNpZmljIGNhcGFiaWxpdHkgcGF0dGVybiBsaWJyYXJpZXMuIEZpbmFsbHksIHRoZQotcHJvY2Vzc2VzIGNyZWF0ZWQgd2l0aCBFUEYgQ29tcG9zZXIgY2FuIGJlIHB1Ymxpc2hlZCBhbmQgZGVwbG95ZWQgYXMgV2ViIHNpdGVzLiA8L2xpPgotPC91bD4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+PHN0cm9uZz5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIEtleSBDb25jZXB0czwvc3Ryb25nPjx1bD48bGk+UHJvdmlkZXMgY29tcGxldGVseSByZWRlc2lnbmVkIHRvb2xzIGZvciBhdXRob3JpbmcsIGNvbmZpZ3VyaW5nLCB2aWV3aW5nLAotYW5kIHB1Ymxpc2hpbmcgZGV2ZWxvcG1lbnQgcHJvY2Vzc2VzLiA8L2xpPgotPGxpPlByb3ZpZGVzIGp1c3QtaW4tdGltZSBnZW5lcmF0aW9uIG9mIHB1YmxpY2F0aW9uIHByZXZpZXdzIGluIGRlZGljYXRlZAotYnJvd3NpbmcgcGVyc3BlY3RpdmUgdGhhdCBhbGxvd3MgcmFwaWQgY29uZmlndXJhdGlvbiBzd2l0Y2hpbmcuIDwvbGk+Ci08bGk+TWFuYWdlcyBtZXRob2QgY29udGVudCB1c2luZyBzaW1wbGUgZm9ybS1iYXNlZCB1c2VyIGludGVyZmFjZXMuIFRoZXJlZm9yZSwKLVVNTCBtb2RlbGluZyBza2lsbHMgYXJlIG5vIGxvbmdlciByZXF1aXJlZC4gPC9saT4KLTxsaT5Qcm92aWRlcyBpbnR1aXRpdmUgcmljaCB0ZXh0IGVkaXRvcnMgZm9yIGNyZWF0aW5nIGlsbHVzdHJhdGl2ZSBjb250ZW50Ci1kZXNjcmlwdGlvbnMuIEVkaXRvcnMgYWxsb3cgdXNlIG9mIHN0eWxlcywgaW1hZ2VzLCB0YWJsZXMsIGh5cGVybGlua3MsIGFuZAotZGlyZWN0IEhUTUwgZWRpdGluZy48L2xpPgotPGxpPkFsbG93cyBjcmVhdGluZyBwcm9jZXNzZXMgd2l0aCBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvcnMgYW5kIHdvcmtmbG93Ci1kaWFncmFtcyB0aHJvdWdoIHVzZSBvZiBtdWx0aS1wcmVzZW50YXRpb24gcHJvY2VzcyBlZGl0b3JzLiBCcmVha2Rvd24gc3RydWN0dXJlCi1lZGl0b3Igc3VwcG9ydHMgZGlmZmVyZW50IHByb2Nlc3Mgdmlld3M6IHdvcmstYnJlYWtkb3duIHZpZXcsIHdvcmsgcHJvZHVjdAotdXNhZ2UgdmlldywgYW5kIHRlYW0gYWxsb2NhdGlvbiB2aWV3LiBFUEYgQ29tcG9zZXIgYXV0b21hdGljYWxseSBzeW5jaHJvbml6ZXMgYWxsIHByZXNlbnRhdGlvbnMKLXdpdGggcHJvY2VzcyBjaGFuZ2VzLiA8L2xpPgotPGxpPlByb3ZpZGVzIHN1cHBvcnQgZm9yIG1hbnkgYWx0ZXJuYXRpdmUgbGlmZWN5Y2xlCi1tb2RlbHMuIEZvciBleGFtcGxlLCB3YXRlcmZhbGwsIGluY3JlbWVudGFsLCBvciBpdGVyYXRpdmUgbW9kZWxzIGNhbiBiZSBjcmVhdGVkCi13aXRoIHRoZSBzYW1lIG92ZXJsYXBwaW5nIG1ldGhvZCBjb250ZW50LiA8L2xpPgotPGxpPkltcHJvdmVkIHJldXNlIGFuZCBleHRlbnNpYmlsaXR5IGNhcGFiaWxpdGllcy4gVGhlIHBsdWctaW4gbWVjaGFuaXNtcwotZnJvbSBwYXN0IHZlcnNpb25zIGhhdmUgYmVlbiBleHRlbmRlZCB0byBzdXBwb3J0IGV4dGVuc2lvbnMgZm9yIGJyZWFrZG93bgotc3RydWN0dXJlcy48L2xpPgotPGxpPlN1cHBvcnRzIHJldXNhYmxlIGR5bmFtaWNhbGx5LWxpbmtlZCBwcm9jZXNzIHBhdHRlcm5zIG9mIGJlc3QgcHJhY3RpY2VzCi1mb3IgcmFwaWQgcHJvY2VzcyBhc3NlbWJseSB2aWEgZHJhZy1hbmQtZHJvcC4gPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxwPjxzdHJvbmc+S2V5IFRlcm1pbm9sb2d5IGFuZCBDb25jZXB0czwvc3Ryb25nPjwvcD4KLTxwPlRvIGVmZmVjdGl2ZWx5IHdvcmsgd2l0aCBFUEYgQ29tcG9zZXIsIHlvdSBuZWVkIHRvIHVuZGVyc3RhbmQgYSBmZXcKLWNvbmNlcHRzIHRoYXQgYXJlIHVzZWQgdG8gb3JnYW5pemUgdGhlIGNvbnRlbnQuIFRoZSBwYWdlcyBNZXRob2QgQ29udGVudCBBdXRob3JpbmcKLU92ZXJ2aWV3IGFuZCBQcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldyBjb250YWluIG1vcmUgZGV0YWlsIGFuZCBjb25jcmV0ZSBleGFtcGxlcwotb2YgaG93IHRvIHdvcmsgaW4gdGhlIHRvb2wuIFRoaXMgcGFnZSBwcm92aWRlcyB5b3Ugd2l0aCBhIGdlbmVyYWwgb3ZlcnZpZXcKLW9mIHRoZXNlIGNvbmNlcHRzLiA8L3A+Ci08cD5UaGUgbW9zdCBmdW5kYW1lbnRhbCBwcmluY2lwbGUgaW4gRVBGIENvbXBvc2VyIGlzIHRoZSBzZXBhcmF0aW9uIG9mIHJldXNhYmxlIGNvcmUKLW1ldGhvZCBjb250ZW50IGZyb20gaXRzIGFwcGxpY2F0aW9uIGluIHByb2Nlc3Nlcy4gVGhpcyBkaXJlY3RseSByZWxhdGVzIGJhY2sKLXRvIHRoZSB0d28gcHVycG9zZXMgb2YgRVBGIENvbXBvc2VyIGRlc2NyaWJlZCBpbiB0aGUgZmlyc3Qgc2VjdGlvbi4gQWxtb3N0IGFsbCBvZiBFUEYgQ29tcG9zZXIncwotY29uY2VwdHMgYXJlIGNhdGVnb3JpemVkIGFsb25nIHRoaXMgc2VwYXJhdGlvbi4gTWV0aG9kIGNvbnRlbnQgZGVzY3JpYmVzIHdoYXQKLWlzIHRvIGJlIHByb2R1Y2VkLCB0aGUgbmVjZXNzYXJ5IHNraWxscyByZXF1aXJlZCBhbmQgdGhlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMKLWRlc2NyaWJpbmcgaG93IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZC4gVGhlc2UgbWV0aG9kIGNvbnRlbnQKLWRlc2NyaXB0aW9ucyBhcmUgaW5kZXBlbmRlbnQgb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuIFByb2Nlc3NlcyBkZXNjcmliZQotdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gUHJvY2Vzc2VzIHRha2UgdGhlIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGFuZAotcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMKLW9mIHByb2plY3RzLiA8L3A+Ci08cD48aW1nIHNyYz0idW1hX2h1bXAuZ2lmIiBhbHQ9IiIgLz48L3A+Ci08cD5UaGUgZmlndXJlIGFib3ZlIHNob3dzIGhvdyB0aGlzIHNlcGFyYXRpb24gaXMgZGVwaWN0ZWQgaW4gQmFzaWMgVW5pZmllZAotUHJvY2Vzcy4gTWV0aG9kIGNvbnRlbnQsIGRlc2NyaWJpbmcgaG93IGRldmVsb3BtZW50IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkLAotaXMgY2F0ZWdvcml6ZWQgYnkgZGlzY2lwbGluZXMgYWxvbmcgdGhlIHktYXhpcyBvZiB0aGUgZGlhZ3JhbS4gVGhlIHdvcmsgZGVzY3JpYmVkCi1pbiBhIHByb2Nlc3MgaXMgc2VlbiBhbG9uZyB0aGUgeC1heGlzIHJlcHJlc2VudGluZyB0aGUgdGltZWxpbmUuIFRoaXMgaXMgdGhlCi1saWZlY3ljbGUgb2YgYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBJdCBleHByZXNzZXMgd2hlbiB3aGF0IHdvcmsgd2lsbCBiZSBwZXJmb3JtZWQuCi1UaGUgZ3JhcGggaW4gdGhlIGlsbHVzdHJhdGlvbiByZXByZXNlbnRzIGFuIGVzdGltYXRlZCB3b3JrbG9hZCBmb3IgZWFjaCBkaXNjaXBsaW5lLgotQXMgeW91IHNlZSwgZm9yIGV4YW1wbGUsIG9uZSBuZXZlciBzdG9wcyB3b3JraW5nIG9uIHJlcXVpcmVtZW50cyBpbiBPcGVuVVAvQmFzaWMsIGJ1dAotdGhlcmUgYXJlIGNlcnRhaW5seSBwZWFrIHRpbWVzIGluIHdoaWNoIG1vc3Qgb2YgdGhlIHJlcXVpcmVtZW50cyBlbGljaXRhdGlvbgotYW5kIGRlc2NyaXB0aW9uIHdvcmsgaXMgcGVyZm9ybWVkLiBUaGVyZSBhcmUgYWxzbyB0aW1lcyBhdCB3aGljaCBhIGRvd253YXJkCi10cmVuZCBuZWVkcyB0byBiZSBvYnNlcnZlZCB3aGVyZSBmZXdlciBhbmQgZmV3ZXIgcmVxdWlyZW1lbnRzIGNoYW5nZXMgaGF2ZQotdG8gYmUgcHJvY2Vzc2VkIHRvIGJyaW5nIHRoZSBwcm9qZWN0IHRvIGEgY2xvc2UuIFRoaXMgYXZvaWRzIHdoYXQgaXMgcmVmZXJyZWQKLXRvIGFzIGZlYXR1cmUgY3JlZXAgaW4gd2hpY2ggcmVxdWlyZW1lbnRzIHdvcmsgcmVtYWlucyBjb25zdGFudCBvciBldmVuIGluY3JlYXNlcy4KLUhlbmNlLCBhIGxpZmVjeWNsZSAocHJvY2VzcykgZXhwcmVzc2VzIHRoZSB2YXJpYW5jZXMgb2Ygd29yayBwZXJmb3JtZWQgaW4KLXRoZSB2YXJpb3VzIGRpc2NpcGxpbmVzIChtZXRob2QgY29udGVudCkuIDwvcD4KLTxwPjxpbWcgc3JjPSJtZXRoX3ZzX3Byb2MuZ2lmIiBhbHQ9IiIgLz48L3A+Ci08cD5UaGUgcGljdHVyZSBhYm92ZSBwcm92aWRlcyBhIHN1bW1hcnkgb2YgdGhlIGtleSBlbGVtZW50cyB1c2VkIGluIEVQRiBDb21wb3NlciBhbmQKLWhvdyB0aGV5IHJlbGF0ZSB0byBtZXRob2QgY29udGVudCBvciBwcm9jZXNzLiBBcyB5b3Ugc2VlLCBtZXRob2QgY29udGVudCBpcwotcHJpbWFyaWx5IGV4cHJlc3NlZCB1c2luZyB3b3JrIHByb2R1Y3RzLCByb2xlcywgdGFza3MsIGFuZCBndWlkYW5jZS4gR3VpZGFuY2UsCi1zdWNoIGFzIGNoZWNrbGlzdHMsIGV4YW1wbGVzLCBvciByb2FkbWFwcywgY2FuIGFsc28gYmUgZGVmaW5lZCB0byBwcm92aWRlCi1leGVtcGxhcnkgd2Fsa3Rocm91Z2hzIG9mIGEgcHJvY2Vzcy4gT24gdGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgZGlhZ3JhbSwKLXlvdSBzZWUgdGhlIGVsZW1lbnRzIHVzZWQgdG8gcmVwcmVzZW50IHByb2Nlc3NlcyBpbiBFUEYgQ29tcG9zZXIuIFRoZSBtYWluIGVsZW1lbnQKLWlzIHRoZSBhY3Rpdml0eSB0aGF0IGNhbiBiZSBuZXN0ZWQgdG8gZGVmaW5lIGJyZWFrZG93biBzdHJ1Y3R1cmVzIGFzIHdlbGwKLWFzIHJlbGF0ZWQgdG8gZWFjaCBvdGhlciB0byBkZWZpbmUgYSBmbG93IG9mIHdvcmsuIEFjdGl2aXRpZXMgYWxzbyBjb250YWluCi1kZXNjcmlwdG9ycyB0aGF0IHJlZmVyZW5jZSBtZXRob2QgY29udGVudC4gQWN0aXZpdGllcyBhcmUgdXNlZCB0byBkZWZpbmUgcHJvY2Vzc2VzCi1vZiB3aGljaCBFUEYgQ29tcG9zZXIgc3VwcG9ydCB0d28gbWFpbiBraW5kczogZGVsaXZlcnkgcHJvY2Vzc2VzIGFuZCBjYXBhYmlsaXR5IHBhdHRlcm5zLgotRGVsaXZlcnkgcHJvY2Vzc2VzIHJlcHJlc2VudCBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIHByb2Nlc3MgdGVtcGxhdGUgZm9yCi1wZXJmb3JtaW5nIG9uZSBzcGVjaWZpYyB0eXBlIG9mIHByb2plY3QuIFRoZXkgZGVzY3JpYmUgYSBjb21wbGV0ZSBlbmQtdG8tZW5kCi1wcm9qZWN0IGxpZmVjeWNsZSBhbmQgYXJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyCi1jaGFyYWN0ZXJpc3RpY3MuIENhcGFiaWxpdHkgcGF0dGVybnMgYXJlIHByb2Nlc3NlcyB0aGF0IGV4cHJlc3MgYW5kIGNvbW11bmljYXRlCi1wcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgZGlzY2lwbGluZSBvciBhIGJlc3QKLXByYWN0aWNlLiBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIGRlbGl2ZXJ5IHByb2Nlc3Nlcwotb3IgbGFyZ2VyIGNhcGFiaWxpdHkgcGF0dGVybnMuIFRoaXMgZW5zdXJlcyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbgotb2YgdGhlaXIga2V5IGJlc3QgcHJhY3RpY2VzIGluIHByb2Nlc3MgYXV0aG9yaW5nIGFjdGl2aXRpZXMgaW4gRVBGIENvbXBvc2VyLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwjbWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXciPk1ldGhvZCBDb250ZW50IEF1dGhvcmluZyBPdmVydmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0icHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwjcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Ij5Qcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hY3Rpdml0eS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWN0aXZpdHkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg1MjE0OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hY3Rpdml0eS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWN0aXZpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJhY3Rpdml0eSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5BY3Rpdml0eTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iYWN0aXZpdHkiPjxhIG5hbWU9ImFjdGl2aXR5Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWN0aXZpdHk8L2gxPgotPGRpdj48cD5BY3Rpdml0aWVzIHJlcHJlc2VudCB0aGUga2V5IGJ1aWxkaW5nIGJsb2NrcyBmb3IgcHJvY2Vzc2VzLiBBY3Rpdml0aWVzCi1yZXByZXNlbnQgYSBncm91cGluZyBvZiBicmVha2Rvd24gZWxlbWVudHMgc3VjaCBhcyBvdGhlciBhY3Rpdml0aWVzLCB0YXNrCi1kZXNjcmlwdG9ycywgcm9sZSBkZXNjcmlwdG9ycywgPGEgaHJlZj0id29ya3Byb2R1Y3RkZXNjcmlwdG9ycy5odG1sI3dvcmtwcm9kdWN0ZGVzY3JpcHRvcnMiPndvcmsgcHJvZHVjdCBkZXNjcmlwdG9yczwvYT4sIGFuZCA8YSBocmVmPSJtaWxlc3RvbmUuaHRtbCNtaWxlc3RvbmUiPm1pbGVzdG9uZXM8L2E+LiBJbiBhZGRpdGlvbiB0byBicmVha2Rvd24gc3RydWN0dXJlcywgYWN0aXZpdGllcwotY2FuIGFsc28gYmUgcHJlc2VudGVkIGluIGFjdGl2aXR5IGRpYWdyYW1zIHRoYXQgZ3JhcGhpY2FsbHkgc2hvdyB0aGUgZmxvdwotb2Ygd29yayBieSBzaG93aW5nIHdoaWNoIGFjdGl2aXRpZXMgcHJlY2VkZSBvdGhlciBhY3Rpdml0aWVzLiA8YSBocmVmPSJwaGFzZS5odG1sI3BoYXNlIj5QaGFzZTwvYT4gYW5kIDxhIGhyZWY9Iml0ZXJhdGlvbi5odG1sI2l0ZXJhdGlvbiI+aXRlcmF0aW9uPC9hPiBhcmUKLXNwZWNpYWwgdHlwZXMgb2YgYWN0aXZpdGllcyB0aGF0IGRlZmluZSBzcGVjaWZpYyBwcm9wZXJ0aWVzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImRldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZSI+RGV2ZWxvcCBhIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRhcmVmZXJlbmNlb3JoeXBlcmxpbmsuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZGFyZWZlcmVuY2Vvcmh5cGVybGluay5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDEyNTAxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZGFyZWZlcmVuY2Vvcmh5cGVybGluay5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkIGEgUmVmZXJlbmNlIG9yIEh5cGVybGluayIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icmljaHRleHRlZGl0b3IuaHRtbCNyaWNodGV4dGVkaXRvciIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJhZGRhcmVmZXJlbmNlb3JoeXBlcmxpbmsiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+QWRkIGEgUmVmZXJlbmNlIG9yIEh5cGVybGluazwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGRpdiBjbGFzcz0ibmVzdGVkMCIgaWQ9ImFkZGFyZWZlcmVuY2Vvcmh5cGVybGluayI+PGEgbmFtZT0iYWRkYXJlZmVyZW5jZW9yaHlwZXJsaW5rIj48IS0tIC0tPjwvYT48aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGQgYSBSZWZlcmVuY2Ugb3IgSHlwZXJsaW5rPC9oMT4KLTxkaXY+PHA+WW91IGNhbiBhZGQgdHdvIHR5cGVzIG9mIHJlZmVyZW5jZXMgb3IgaHlwZXJsaW5rcyB0byB5b3VyIGNvbnRlbnQgdGV4dDoKLXJlZmVyZW5jZXMgIHRvIG90aGVyIGVsZW1lbnRzIGluIHRoZSBtZXRob2QgbGlicmFyeSBvciByZWZlcmVuY2VzIHRvIGV4dGVybmFsCi10ZXh0IHdpdGggYSBVUkwgdGhhdCByZXNpZGVzIG91dHNpZGUgdGhlIG1ldGhvZCBsaWJyYXJ5LjwvcD4KLTxwPlRleHQgZmllbGRzIHRoYXQgc3VwcG9ydCBoeXBlcmxpbmtzIGhhdmUgYSB0d2lzdHkgc3ltYm9sIDxpbWcgc3JjPSJ0d2lzdHkgc3ltYm9sMS5KUEciIGFsdD0iIiAvPiBuZXh0IHRvIHRoZSB0ZXh0IGZpZWxkJ3MgbGFiZWwuIENsaWNrIHRoZSBzeW1ib2wgdG8gZXhwYW5kCi10aGUgZmllbGQgaW50byBhIGZ1bGwgdGV4dCBlZGl0b3IuIDwvcD4KLTxwPlRvIGluc2VydCBhIGh5cGVybGluayB0byBhbm90aGVyIGVsZW1lbnQgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5IGludG8gYSB0ZXh0Ci1maWVsZCwgbG9jYXRlIHRoZSBlbGVtZW50IHlvdSB3YW50IHRvIGNyZWF0ZSBhIGxpbmsgdG8gaW4gdGhlIGxpYnJhcnkgb3IgY29uZmlndXJhdGlvbgotdmlldyBhbmQgdGhlbiBkcmFnIGl0IGludG8gdGhlIGFwcHJvcHJpYXRlIHRleHQgZmllbGQsIFRoZSBsaW5rIHRvIHRoZSBlbGVtZW50Ci1pcyBhZGRlZCBhcyBhIG1ldGhvZCBlbGVtZW50IHdpdGggdHlwZSBwcmVmaXgsIG1lYW5pbmcgdGhhdCB0aGUgbWV0aG9kIGVsZW1lbnQKLW5hbWUgaXMgcHJlZml4ZWQgd2l0aCB0aGUgbWV0aG9kIGVsZW1lbnQgdHlwZS4gWW91IGNhbiBhbHNvIGRyYWcgYSBtZXRob2QKLWVsZW1lbnQgaW50byBhbiB1bmV4cGFuZGVkIHRleHQgZmllbGQgdGhhdCBzdXBwb3J0cyBoeXBlcmxpbmtzIHdpdGggdGhlIHNhbWUKLXJlc3VsdC48L3A+Ci08ZGl2IGNsYXNzPSJwIj5Zb3UgY2FuIHVzZSB0aGUgQWRkIExpbmsgZnVuY3Rpb24gaW4gdGhlIHJpY2ggdGV4dCBlZGl0b3IgdG8gYWRkIGxpbmtzCi10aGF0IGFyZSByZWZlcmVuY2VzIHRvIG90aGVyIG1ldGhvZCBlbGVtZW50cyBvciBsaW5rcyB0byBmaWxlcyBvciBXZWIgcGFnZXMuCi1UaGlzIGdpdmVzIHlvdSBmdXJ0aGVyIG9wdGlvbnMgaW4gaG93IHlvdXIgbGlua3MgYXJlIGRpc3BsYXllZC48b2w+PGxpPkluIHRoZSB0ZXh0IGVkaXRvciwgcG9zaXRpb24gdGhlIGN1cnNvciB3aGVyZSB5b3Ugd2FudCB0byBpbnNlcnQgdGhlIGxpbmsKLWFuZCB0aGVuIGNsaWNrIHRoZSA8c3Ryb25nPkFkZCBMaW5rPC9zdHJvbmc+IGJ1dHRvbiA8aW1nIHNyYz0iYWRkbGlua19jby5naWYiIGFsdD0iIiAvPiBpbiB0aGUgdG9vbCBiYXIuIFRoZSBBZGQgTGluayBkaWFsb2cgb3BlbnMuPC9saT4KLTxsaT5DbGljayB0aGUgPHN0cm9uZz5Ccm93c2U8L3N0cm9uZz4gYnV0dG9uIHRvIGxvY2F0ZSBhbmQgc2VsZWN0IHRoZSBlbGVtZW50IHlvdSB3aXNoCi10byBjcmVhdGUgYSBsaW5rIHRvLiBUaGVyZSBhcmUgc2V2ZXJhbCBvcHRpb25zIGZvciBjcmVhdGluZyBsaW5rcyB0byBvdGhlcgotY29udGVudCBlbGVtZW50cywgd2l0aCBlYWNoIG9wdGlvbiBvZmZlcmluZyBhIGRpZmZlcmVudCB3YXkgZm9yIGRpc3BsYXlpbmcKLXRoZSBsaW5rJ3MgbmFtZTo8dWw+PGxpPk1ldGhvZCBlbGVtZW50OiB0aGUgbGluayBkaXNwbGF5cyB0aGUgZWxlbWVudCBuYW1lLjwvbGk+Ci08bGk+TWV0aG9kIHdpdGggdHlwZSBwcmVmaXg6IHRoZSBsaW5rIGRpc3BsYXlzIHRoZSBlbGVtZW50IG5hbWUgYW5kIHR5cGUuPC9saT4KLTxsaT5NZXRob2QgZWxlbWVudCB3aXRoIGN1c3RvbSB0ZXh0OiB0aGUgbGluayBkaXNwbGF5cyB1c2VyIGRlZmluZWQgdGV4dC4KLVRvIGRlZmluZSB0aGlzIHRleHQgbWFuaXB1bGF0ZSB0aGUgdGV4dCBpbiBiZXR3ZWVuIHRoZSAmbHQ7YSZndDsmbHQ7L2EmbHQ7Ci10YWdzIGluIHRoZSBVUkwgdGV4dCBmaWVsZCBvbmUgeW91IGhhdmUgc2VsZWN0ZWQgYW4gZWxlbWVudCB1c2luZyB0aGUgPHN0cm9uZz5Ccm93c2U8L3N0cm9uZz4gYnV0dG9uLjwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5UbyBpbnNlcnQgYSBoeXBlcmxpbmsgdG8gYW4gZXh0ZXJuYWwgVVJMLCBzZWxlY3QgVVJMIGZyb20gdGhlIFR5cGUgZHJvcAotZG93biBsaXN0LCB0eXBlIHRoZSBVUkwgZGV0YWlscyBpbiB0aGUgVVJMIGZpZWxkLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LjwvbGk+Ci08bGk+VG8gaW5zZXJ0IGEgaHlwZXJsaW5rIHRvIGEgZmlsZSwgaW4gdGhlIFR5cGUgZHJvcCBkb3duIGxpc3QsIGNsaWNrIDxzdHJvbmc+RmlsZTwvc3Ryb25nPiwKLWVudGVyIHRoZSBmaWxlIG5hbWUgb3IgYnJvd3NlIHRvIGZpbmQgdGhlIGZpbGUsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uCi1FYWNoIHRpbWUgeW91IGFkZCBhIGxpbmsgeW91IGNhbiBjaG9vc2UgdG8gaGF2ZSB0aGUgdGFyZ2V0IG9wZW4gaW4gdGhlIHNhbWUKLWJyb3dzZXIgd2luZG93IG9yIGluIGEgbmV3IHdpbmRvdy48L2xpPgotPC9vbD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0icmljaHRleHRlZGl0b3IuaHRtbCNyaWNodGV4dGVkaXRvciI+UmljaCBUZXh0IEVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+PC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZGltZ19jby5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRpbWdfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2JkNzIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZGltZ19jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRsaW5rX2NvLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZGxpbmtfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWEzODZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZGxpbmtfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkb3JkbGlzdF9jby5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRvcmRsaXN0X2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcxZDY3Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRvcmRsaXN0X2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZHRhYmxlX2NvLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZHRhYmxlX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUzNmRkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGR0YWJsZV9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGR1bm9yZGxpc3RfY28uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkdW5vcmRsaXN0X2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA3NDllNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGR1bm9yZGxpc3RfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNzM2OGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjYXBhYmlsaXR5cGF0dGVybiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icmVwbGFjZS5odG1sI3JlcGxhY2VzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJwcm9jZXNzLmh0bWwjcHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJhcHBseWFjYXBhYmlsaXR5cGF0dGVybiIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5BcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4iPjxhIG5hbWU9ImFwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm48L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj5XaGVuIGRldmVsb3BpbmcgYSBwcm9jZXNzLCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGRldmVsb3AgdGhlIHByb2Nlc3MKLWZyb20gc2NyYXRjaCwgYWRkaW5nIGRlc2NyaXB0b3JzIG9uZSBieSBvbmUuIFlvdSBjYW4gcmV1c2UgZXhpc3RpbmcgY2FwYWJpbGl0eQotcGF0dGVybnMgb3IgZXZlbiBjYXBhYmlsaXR5IHBhdHRlcm4gcGFydHMgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzCi1jb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBmb3Igd2hpY2ggaXQgaXMgYXBwbGllZC4gQSBjYXBhYmlsaXR5Ci1wYXR0ZXJuIG11c3QgYmUgYXBwbGllZCB0byBvbmUgc3BlY2lmaWMgYWN0aXZpdHkgaW4gYSBwcm9jZXNzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbgotc2VlIDxhIGhyZWY9ImNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY2FwYWJpbGl0eXBhdHRlcm4iPkNhcGFiaWxpdHkgUGF0dGVybjwvYT4uPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UaGVyZSBhcmUgdHdvIHdheXMgdG8gYXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm46IENvcHkgYW5kIEV4dGVuZC4gPHA+PHN0cm9uZz5Db3B5Ci1hIGNhcGFiaWxpdHkgcGF0dGVybjo8L3N0cm9uZz48L3A+Ci08ZGl2IGNsYXNzPSJwIj5JZiBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBjb3BpZWQgaW50byBhIHByb2Nlc3MsCi1tZXRob2QgY29udGVudCBlbGVtZW50cyBpbiB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGFyZSBkaXNjb25uZWN0ZWQgZnJvbSB0aGUKLW9yaWdpbmFsLiBUaGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGVsZW1lbnRzIGNhbiBiZSBhbHRlcmVkLCBkZWxldGVkIG9yIGNoYW5nZWQKLWFzIHlvdSB3YW50IGluIHRoZSBwcm9jZXNzIGVkaXRvciB3aXRob3V0IGFmZmVjdGluZyB0aGUgb3JpZ2luYWwgbWV0aG9kIGNvbnRlbnQKLWVsZW1lbnRzLiBNZXRob2QgZWxlbWVudHMgaW4gYSBjb3BpZWQgY2FwYWJpbGl0eSBwYXR0ZXJuIGFwcGVhciBpbiByZWd1bGFyCi1ibGFjayBmb250LiBUbyBjb3B5IGEgY2FwYWJpbGl0eSBwYXR0ZXJuOjxvbD48bGk+SW4gdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4sCi1zZWxlY3QgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgaXRzIHBhcnRzIHRoYXQgeW91IHdhbnQgdG8gY29weSBpbnRvIGFuIGFjdGl2aXR5Ci1pbiBhIHByb2Nlc3MgYW5kIGRyYWcgdGhlIHBhdHRlcm4gb3IgcGFydHMgaW50byB0aGUgYWN0aXZpdHkgdG8gd2hpY2ggeW91Ci13YW50IGl0IHRvIGFwcGx5LiBUbyBzZWxlY3QgbXVsdGlwbGUgYWN0aXZpdGllcyBpbiBhIGNhcGFiaWxpdHkgcGF0dGVybiwgcHJlc3MKLXRoZSBDVFJMIG9yIFNISUZUIGtleXMgd2hpbGUgeW91IHNlbGVjdC4gPC9saT4KLTxsaT5JbiB0aGUgcG9wLXVwIGJveCB0aGF0IGFwcGVhcnMsIGNsaWNrIDxzdHJvbmc+Q29weTwvc3Ryb25nPi4gVGhlIGNhcGFiaWxpdHkgcGF0dGVybgotbmFtZSBpcyBkaXNwbGF5ZWQgaW4gYmxhY2sgYW5kIGlzIG5vdyBhdmFpbGFibGUgZm9yIHlvdSB0byBlZGl0LjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJwIj5Pciw8b2w+PGxpPkluIHRoZSBwcm9jZXNzIHZpZXcsIHJpZ2h0IGNsaWNrIGFuIGFjdGl2aXR5LCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPkFwcGx5Ci1QYXR0ZXJuICZndDsgQ29weTwvc3Ryb25nPi4gVGhlIFNlbGVjdCBEaWFsb2cgRm9yIFByb2Nlc3NlcyB3aW5kb3cgYXBwZWFycy48L2xpPgotPGxpPkRyaWxsIGRvd24gaW50byB0aGUgcHJvY2VzcyB0cmVlIHVudGlsIHlvdSBsb2NhdGUgdGhlIGNhcGFiaWxpdHkgcGF0dGVybgoteW91IHdhbnQgdG8gY29weS48L2xpPgotPGxpPlNlbGVjdCB0aGUgcGF0dGVybiwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVGhlIFNlbGVjdCBEaWFsb2cgRm9yIFByb2Nlc3Nlcwotd2luZG93IGNsb3NlcyBhbmQgdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBhcHBsaWVkLjwvbGk+Ci08L29sPgotPC9kaXY+Ci08cD48c3Ryb25nPkV4dGVuZCBhIGNhcGFiaWxpdHkgcGF0dGVybjo8L3N0cm9uZz48L3A+Ci08ZGl2IGNsYXNzPSJwIj5JZiBhIGNhcGFiaWxpdHkgcGF0dGVybgotaXMgZXh0ZW5kZWQgaW50byBhIHByb2Nlc3MsIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4KLXJldGFpbiBhIGNvbm5lY3Rpb24gdG8gdGhlIG9yaWdpbmFsLiBFeHRlbmRlZCBjYXBhYmlsaXR5IHBhdHRlcm4gZWxlbWVudHMKLWNhbm5vdCBiZSBkZWxldGVkIG9yIG1vZGlmaWVkIGFuZCBhcHBlYXIgYXMgcmVhZC1vbmx5IGluIGEgZ3JlZW4taXRhbGljIGZvbnQuCi1UbyBleHRlbmQgYSBjYXBhYmlsaXR5IHBhdHRlcm46IDxvbD48bGk+SW4gdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4sCi1zZWxlY3QgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgaXRzIHBhcnRzIHRoYXQgeW91IHdhbnQgdG8gZXh0ZW5kIGludG8gYW4gYWN0aXZpdHkKLWluIGEgcHJvY2VzcyBhbmQgZHJhZyB0aGUgcGF0dGVybiBvciBwYXJ0cyBpbnRvIHRoZSBhY3Rpdml0eSB0byB3aGljaCB5b3UKLXdhbnQgaXQgdG8gYXBwbHkuIFRvIHNlbGVjdCBtdWx0aXBsZSBhY3Rpdml0aWVzIGluIGEgY2FwYWJpbGl0eSBwYXR0ZXJuLCBwcmVzcwotdGhlIENUUkwgb3IgU0hJRlQga2V5cyB3aGlsZSB5b3Ugc2VsZWN0LjwvbGk+Ci08bGk+SW4gdGhlIHBvcC11cCBib3ggdGhhdCBhcHBlYXJzLCBjbGljayA8c3Ryb25nPkV4dGVuZDwvc3Ryb25nPi4gVGhlIGNhcGFiaWxpdHkgcGF0dGVybgotbmFtZSBpcyBkaXNwbGF5ZWQgaW4gZ3JlZW4sIHdoaWNoIGluZGljYXRlcyBpdCBpcyBwYXJ0IG9mIGEgcHJvY2VzcyBkZWZpbmVkCi1lbHNld2hlcmUuPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InAiPk9yLCA8b2w+PGxpPkluIHRoZSBwcm9jZXNzIHZpZXcsIHJpZ2h0IGNsaWNrIGFuIGFjdGl2aXR5IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+QXBwbHkKLVBhdHRlcm4gJmd0OyBFeHRlbmQ8L3N0cm9uZz4uIFRoZSBTZWxlY3QgRGlhbG9nIEZvciBQcm9jZXNzZXMgd2luZG93IGFwcGVhcnMuPC9saT4KLTxsaT5EcmlsbCBkb3duIGludG8gdGhlIHByb2Nlc3MgdHJlZSB1bnRpbCB5b3UgbG9jYXRlIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4KLXlvdSB3YW50IHRvIGV4dGVuZC48L2xpPgotPGxpPlNlbGVjdCB0aGUgcGF0dGVybiwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVGhlIFNlbGVjdCBEaWFsb2cgRm9yIFByb2Nlc3Nlcwotd2luZG93IGNsb3NlcyBhbmQgdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBhcHBsaWVkLjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJwIj48ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gSWYgeW91IGRvIG5vdCB3YW50IGEgc3BlY2lmaWMgYWN0aXZpdHkgb3IgdGFzayBpbiB0aGUgY2FwYWJpbGl0eQotcGF0dGVybiB0byBiZSBpbmNsdWRlZCBpbiB5b3VyIHByb2Nlc3MgeW91IGNhbiBzdXBwcmVzcyBpdC4gVGhlIGFjdGl2aXR5IG9yCi10YXNrIHdpbGwgbm90IGFwcGVhciBpbiB0aGUgcHVibGlzaGVkIHByb2Nlc3Mgb3IgYmUgZXhwb3J0ZWQgdG8gYSBwcm9qZWN0Ci1wbGFubmluZyB0b29sLiBUbyBzdXBwcmVzcyBhIHByb2Nlc3MgZWxlbWVudCwgcmlnaHQgY2xpY2sgdGhlIGVsZW1lbnQgYW5kCi10aGVuIHNlbGVjdCA8c3Ryb25nPlN1cHByZXNzPC9zdHJvbmc+LiBUaGUgZWxlbWVudCBhcHBlYXJzIGdyYXllZCBvdXQgaW4gdGhlIHByb2Nlc3MKLXZpZXcuPC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGRpdiBjbGFzcz0icCI+VG8gYWRkIGVsZW1lbnRzIHRvIGFuIGFjdGl2aXR5IGluIGFuIGV4dGVuZGVkIGNhcGFiaWxpdHkgcGF0dGVybjo8b2w+PGxpPkZpbmQgdGhlIGFjdGl2aXR5J3MgcGFyZW50IGVsZW1lbnQuIElmIHRoaXMgZWxlbWVudCBpcyBhIG5vdCBhIGxvY2FsIGVsZW1lbnQKLXRoYXQgYXBwZWFycyBpbiBncmVlbiBpdGFsaWMgZm9udCwgdGhlbiB5b3UgbmVlZCBjcmVhdGUgYSBjb250cmlidXRpb24gdG8KLXRoaXMgcGFyZW50IGZpcnN0LiAgSWYgdGhlIHBhcmVudCdzIHBhcmVudCBpcyBub3QgbG9jYWwsIGFsc28gYXBwZWFyaW5nIGluCi1ncmVlbiBpdGFsaWMgZm9udCwgdGhlbiB5b3UgbmVlZCB0byBjcmVhdGUgYSBjb250cmlidXRpb24gdG8gdGhlIHBhcmVudCBmaXJzdCwKLWFuZCBzbyBvbi4gPC9saT4KLTxsaT5UbyBjcmVhdGUgYSBjb250cmlidXRpb24gdG8gYW4gZXh0ZW5kZWQgYWN0aXZpdHksIHJpZ2h0IGNsaWNrIHRoZSBleHRlbmRlZAotYWN0aXZpdHkgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5Db250cmlidXRlPC9zdHJvbmc+LiBUaGUgYWN0aXZpdHkgYmVjb21lcyBsb2NhbCBhbmQKLWFwcGVhcnMgaW4gYSBzdGFuZGFyZCBibGFjayBmb250LiBEbyB0aGlzIHdpdGggYWxsIHBhcmVudCBlbGVtZW50cywgdG9wLWRvd24sCi11bnRpbCB5b3UgcmVhY2ggdGhlIGFjdGl2aXR5IHRvIHdoaWNoIHlvdSB3YW50IHRvIGFwcGx5IHRoZSBlbGVtZW50LiBPbmNlCi15b3UgY2xpY2sgQ29udHJpYnV0ZSwgdGhlIGFjdGl2aXR5IGJlY29tZXMgbG9jYWwgYW5kIGlzIHByZXNlbnRlZCBpbiBzdGFuZGFyZAotYmxhY2sgZm9udC48L2xpPgotPC9vbD4KLUZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8YSBocmVmPSJjb250cmlidXRlcy5odG1sI2NvbnRyaWJ1dGVzIj5Db250cmlidXRlczwvYT4uPC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY2FwYWJpbGl0eXBhdHRlcm4iPkNhcGFiaWxpdHkgUGF0dGVybjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0icmVwbGFjZS5odG1sI3JlcGxhY2VzIj5SZXBsYWNlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0icHJvY2Vzcy5odG1sI3Byb2Nlc3MiPlByb2Nlc3M8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybiI+Q3JlYXRlIGEgUmV1c2FibGUgQ2FwYWJpbGl0eSBQYXR0ZXJuPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FydGlmYWN0Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hcnRpZmFjdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmU1ZmM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FydGlmYWN0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBcnRpZmFjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkZWxpdmVyYWJsZS5odG1sI2RlbGl2ZXJhYmxlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJvdXRjb21lLmh0bWwjb3V0Y29tZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJhcnRpZmFjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5BcnRpZmFjdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iYXJ0aWZhY3QiPjxhIG5hbWU9ImFydGlmYWN0Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QXJ0aWZhY3Q8L2gxPgotPGRpdj48cD5BbiBhcnRpZmFjdCBpcyBhIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0aGF0IGlzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQKLWJ5IHRhc2tzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwKLWFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLiA8L3A+Ci08cD5Sb2xlcyB1c2UgYXJ0aWZhY3RzIHRvIHBlcmZvcm0gdGFza3MgYW5kIHRvIHByb2R1Y2Ugb3RoZXIgYXJ0aWZhY3RzLiBFYWNoCi1hcnRpZmFjdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgcm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kKLXRvIGlkZW50aWZ5IGFuZCB1bmRlcnN0YW5kLCBhbmQgcHJvbW90aW5nIHRoZSBpZGVhIHRoYXQgZXZlcnkgcGllY2Ugb2YgaW5mb3JtYXRpb24KLXByb2R1Y2VkIGluIGEgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmx5Ci1vbmUgcm9sZSBpcyByZXNwb25zaWJsZSBmb3IgYW4gYXJ0aWZhY3QsIG90aGVyIHJvbGVzIG1heSB1c2UgdGhlIGFydGlmYWN0cy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij5Xb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImRlbGl2ZXJhYmxlLmh0bWwjZGVsaXZlcmFibGUiPkRlbGl2ZXJhYmxlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJvdXRjb21lLmh0bWwjb3V0Y29tZSI+T3V0Y29tZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2NGE2NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQXV0aG9yaW5nIFBlcnNwZWN0aXZlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCN1c2VyaW50ZXJmYWNlb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iYXV0aG9yaW5ncGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJhdXRob3JpbmdwZXJzcGVjdGl2ZSI+PGEgbmFtZT0iYXV0aG9yaW5ncGVyc3BlY3RpdmUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2gxPgotPGRpdj48cD5UaGUgQXV0aG9yaW5nIFBlcnNwZWN0aXZlIHByb3ZpZGVzIHZpZXdzIGFuZCBmdW5jdGlvbnMgdG8gbmF2aWdhdGUgYW5kCi1hdXRob3IgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gWW91IG11c3QgYmUgaW4gdGhlIEF1dGhvcmluZyBQZXJzcGVjdGl2ZQotdG8gY3JlYXRlIG9yIG1vZGlmeSBhbnkgZWxlbWVudCB0eXBlcy48L3A+Ci08cD5DbGljayB0aGUgT3BlbiBQZXJzcGVjdGl2ZSBidXR0b24gPGltZyBzcmM9Im9wZW5wZXJzcC5KUEciIGFsdD0iIiAvPiBhbmQgc2VsZWN0IEF1dGhvcmluZyB0byBvcGVuIHRoZSBBdXRob3JpbmcgUGVyc3BlY3RpdmUuIDwvcD4KLTxwPjxpbWcgc3JjPSJBdXRob3JQZXJzcC5KUEciIGFsdD0iIiAvPjwvcD4KLTxwPlRoZSBBdXRob3JpbmcgUGVyc3BlY3RpdmUgY29udGFpbnMgdHdvIFZpZXdzOiB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPiBhbmQgdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4uIERvdWJsZSBjbGljayBhbnkgZWxlbWVudCBpbiB0aGUKLUxpYnJhcnkgVmlldyBvciBDb25maWd1cmF0aW9uIFZpZXcgdG8gb3BlbiB0aGUgRWRpdG9yIHdpbmRvdyBvbiB0aGUgcmlnaHQuCi1UaGUgRWRpdG9yIHdpbmRvdyBjb250YWlucyBzZXZlcmFsIHRhYnMgdGhyb3VnaCB3aGljaCB5b3UgY2FuIGVkaXQgaW5mb3JtYXRpb24KLWFib3V0IHRoZSBlbGVtZW50IHlvdSBoYXZlIHNlbGVjdGVkLjwvcD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiI+VG9vbCBJbnRlcmZhY2U8L2E+PC9kaXY+Ci08ZGl2IGNsYXNzPSJuZXh0bGluayI+PHN0cm9uZz5OZXh0IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCN1c2VyaW50ZXJmYWNlb3ZlcnZpZXciIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2JvbGQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYm9sZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYzQ2ODUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYm9sZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9icm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjYzAxNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9icm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQnJvd3NlIGFuZCBQcmV2aWV3IE1ldGhvZCBDb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJicm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Ccm93c2UgYW5kIFByZXZpZXcgTWV0aG9kIENvbnRlbnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImJyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Ij48YSBuYW1lPSJicm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkJyb3dzZSBhbmQgUHJldmlldyBNZXRob2QgQ29udGVudDwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPllvdSBjYW4gYnJvd3NlIG1ldGhvZCBjb250ZW50IGluIGJvdGggdGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT4gYW5kIDxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9hPi4gV2hpbGUgYXV0aG9yaW5nIG1ldGhvZCBjb250ZW50LCB5b3UgY2FuIHNlZSBhIHByZXZpZXcKLW9mIHRoZSBwdWJsaXNoZWQgcGFnZSBmb3IgdGhlIGNvbnRlbnQgeW91IGFyZSBlZGl0aW5nIGJ5IHNlbGVjdGluZyB0aGUgPHN0cm9uZz5QcmV2aWV3PC9zdHJvbmc+IHRhYgotYXQgdGhlIGJvdHRvbSBvZiB0aGUgY29udGVudCBlZGl0b3IuIENsaWNrIGFueSBsaW5rIGluIHRoZSBkaXNwbGF5ZWQgcGFnZQotdG8gZ28gdG8gdGhhdCBwYWdlLiBVc2UgdGhlIGJ1dHRvbnMgaW4gdGhlIGVkaXRvciB0b29sYmFyIHRvIHBlcmZvcm0gZmFtaWxpYXIKLWJyb3dzZXIgYWN0aW9ucyBzdWNoIGFzIGJhY2sgb3IgcmVmcmVzaC4gV2hpbGUgYnJvd3NpbmcgbWV0aG9kIGNvbnRlbnQgaW4KLXRoZSBicm93c2luZyBwZXJzcGVjdGl2ZSB5b3UgY2FuIHNlZSBhIHByZXZpZXcgb2YgYW55IG1ldGhvZCBhbmQgcHJvY2VzcyBjb250ZW50Ci1pbiBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGFzIGl0IGFwcGVhcnMgaW4gYSBwdWJsaXNoZWQgV2ViIHNpdGUuIDwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VG8gYnJvd3NlIGFuZCBwcmV2aWV3IDxhIGhyZWY9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPk1ldGhvZCBDb250ZW50PC9hPiBpbiB0aGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPjo8L3A+Ci08L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSBPcGVuIFBlcnNwZWN0aXZlIGJ1dHRvbiA8aW1nIHNyYz0ib3BlbnBlcnNwLkpQRyIgYWx0PSIiIC8+IGFuZCBzZWxlY3QgPHN0cm9uZz5BdXRob3Jpbmc8L3N0cm9uZz4uIFRoZSBBdXRob3JpbmcgcGVyc3BlY3RpdmUKLW9wZW5zIHdpdGggdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4gYW5kIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4gb24KLXRoZSBsZWZ0IGFuZCB0aGUgY29udGVudCB2aWV3IG9uIHRoZSByaWdodC4gSWYgYSBtZXRob2QgZWxlbWVudCBpcyBzZWxlY3RlZCwKLXRoZSBhcHByb3ByaWF0ZSBlZGl0b3IgaXMgb3BlbiBvbiB0aGUgcmlnaHQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkV4cGxvcmUgdGhlIGNvbnRlbnRzIGluIHRoZSBib3RoIHRoZSBMaWJyYXJ5IFZpZXcgYW5kIENvbmZpZ3VyYXRpb24KLVZpZXcgYnkgZXhwYW5kaW5nIHRoZSBkaWZmZXJlbnQgY29udGVudCBwYWNrYWdlcyBhbmQgbWV0aG9kIHBsdWctaW5zIGRvd24KLXRvIHRoZWlyIG1ldGhvZCBlbGVtZW50cy4gRG91YmxlIGNsaWNrIGFuIGVsZW1lbnQgdG8gb3BlbiBpdCBpbiB0aGUgZWRpdG9yLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5QcmV2aWV3PC9zdHJvbmc+IHRhYiBhdCB0aGUgYm90dG9tIG9mIHRoZSBjb250ZW50IGVkaXRvcgotdG8gcHJldmlldyB0aGUgY29udGVudCBvZiBhbnkgc2VsZWN0ZWQgZWxlbWVudC48L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBUaGUgcHJldmlldwotcGFnZSBpbiB0aGUgY29udGVudCBlZGl0b3IgZG9lcyBub3QgcmVzb2x2ZSBjb250ZW50IHZhcmlhYmlsaXR5IHJlbGF0aW9uc2hpcHMuCi1JZiB5b3UgYXJlIGV4dGVuZGluZywgY29udHJpYnV0aW5nIHRvLCBvciByZXBsYWNpbmcgYSBiYXNlIGNvbnRlbnQgaXRlbSwgeW91Ci1jYW4gb25seSBzZWUgdGhlIHJlc3VsdCBvZiB0aGlzIGluIHRoZSBDb25maWd1cmF0aW9uIFZpZXcgaW4gdGhlIEJyb3dzaW5nCi1QZXJzcGVjdGl2ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiPlZhcmlhYmlsaXR5PC9hPi48L2Rpdj4KLTxwPjwvcD4KLTwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VG8gYnJvd3NlIGFuZCBwcmV2aWV3PGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+TWV0aG9kIENvbnRlbnQ8L2E+IGluIHRoZSA8YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT46PC9wPgotPG9sPjxsaT5DbGljayB0aGUgT3BlbiBQZXJzcGVjdGl2ZSBidXR0b24gPGltZyBzcmM9Im9wZW5wZXJzcC5KUEciIGFsdD0iIiAvPiBhbmQgc2VsZWN0IDxzdHJvbmc+QnJvd3Npbmc8L3N0cm9uZz4uIFRoZSA8YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT4gb3BlbnMgd2l0aCB0aGUgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPiBvbiB0aGUgbGVmdCBhbmQgdGhlIENvbnRlbnQgVmlldyBvbiB0aGUgcmlnaHQuPHA+PC9wPgotPC9saT4KLTxsaT5TZWxlY3QgYSBtZXRob2QgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGRyb3AtZG93biBsaXN0IGluCi10aGUgdG9vbCBiYXIuIFRoZSBjb250ZW50IG9mIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBhcHBlYXJzIGluIHRoZSBjb250ZW50Ci12aWV3LCBhcyBpdCB3aWxsIGFwcGVhciBpbiBhIHB1Ymxpc2hlZCBXZWIgc2l0ZS48cD48L3A+Ci08L2xpPgotPGxpPkV4cGxvcmUgYW5kIHByZXZpZXcgdGhlIGNvbnRlbnQgaW4gdGhlIENvbmZpZ3VyYXRpb24gVmlldyBieSBleHBhbmRpbmcKLXRoZSBjYXRlZ29yaWVzIGFuZCBvdGhlciBmb2xkZXJzIGRvd24gdG8gbWV0aG9kIGVsZW1lbnRzLiBDbGljayBhIG1ldGhvZCBlbGVtZW50Ci10byBvcGVuIGl0IGluIHRoZSBjb250ZW50IHZpZXcuPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sIiB0aXRsZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6Ij5Ub29sIEludGVyZmFjZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9icm93c2VwZXJzcC5KUEcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9icm93c2VwZXJzcC5KUEcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNjkxZmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NlcGVyc3AuSlBHCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjFmZTQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Jyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkJyb3dzaW5nIFBlcnNwZWN0aXZlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCN1c2VyaW50ZXJmYWNlb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjb25maWd1cmF0aW9udmlldy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImJyb3dpbmdwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iYnJvd2luZ3BlcnNwZWN0aXZlIj48YSBuYW1lPSJicm93aW5ncGVyc3BlY3RpdmUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvaDE+Ci08ZGl2PjxwPlRoZSBCcm93c2luZyBQZXJzcGVjdGl2ZSBhbGxvd3MgeW91IHRvIHByZXZpZXcgYW5kIG5hdmlnYXRlIHRocm91Z2ggYSBNZXRob2QKLUNvbmZpZ3VyYXRpb24gd2l0aG91dCBtYWtpbmcgYW55IGNoYW5nZXMuPC9wPgotPHA+Q2xpY2sgdGhlIE9wZW4gUGVyc3BlY3RpdmUgYnV0dG9uIDxpbWcgc3JjPSJvcGVucGVyc3AuSlBHIiBhbHQ9IiIgLz4gYW5kIHNlbGVjdCA8c3Ryb25nPkJyb3dzaW5nPC9zdHJvbmc+IHRvIG9wZW4gdGhlIEJyb3dzaW5nIFBlcnNwZWN0aXZlLjwvcD4KLTxwPjxpbWcgc3JjPSJicm93c2VwZXJzcC5KUEciIGFsdD0iIiAvPjwvcD4KLTxwPlRoZSBCcm93c2luZyBwZXJzcGVjdGl2ZSBjb250YWlucyB0aGUgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPiwgd2hpY2ggc2hvd3MgdGhlIGNvbnRlbnQgaW4gdGhlIGN1cnJlbnRseQotc2VsZWN0ZWQgY29uZmlndXJhdGlvbi4gQ2xpY2sgYW55IGVsZW1lbnQgaW4gdGhlIENvbmZpZ3VyYXRpb24KLVZpZXcgdG8gcHJldmlldyB0aGUgZWxlbWVudCBpbiB0aGUgQ29udGVudCBWaWV3IGFzIGl0IHdpbGwgYXBwZWFyIGluIGEgcHVibGlzaGVkCi1XZWIgc2l0ZS4gVGhlIENvbnRlbnQgVmlldyBwcm92aWRlcyBicm93c2VyLWxpa2UgbmF2aWdhdGlvbiBmZWF0dXJlcy4gQ2xpY2sKLWFueSBsaW5rIGluIHRoZSBkaXNwbGF5ZWQgcGFnZSB0byBnbyB0byB0aGF0IHBhZ2UuIFVzZSB0aGUgYnV0dG9ucyBpbiB0aGUKLUNvbnRlbnQgVmlldyB0b29sYmFyIHRvIHBlcmZvcm0gZmFtaWxpYXIgYnJvd3NlciBhY3Rpb25zIHN1Y2ggYXMgYmFjayBvciByZWZyZXNoLjwvcD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiI+VG9vbCBJbnRlcmZhY2U8L2E+PC9kaXY+Ci08ZGl2IGNsYXNzPSJwcmV2aW91c2xpbmsiPjxzdHJvbmc+UHJldmlvdXMgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT48L2Rpdj4KLTxkaXYgY2xhc3M9Im5leHRsaW5rIj48c3Ryb25nPk5leHQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwiPkNvbmZpZ3VyYXRpb24gVmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sI3VzZXJpbnRlcmZhY2VvdmVydmlldyIgdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiI+VG9vbCBJbnRlcmZhY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NhcGFiaWxpdHlwYXR0ZXJuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZTU2YWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY2FwYWJpbGl0eXBhdHRlcm4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNhcGFiaWxpdHkgUGF0dGVybiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNhcHBseWFjYXBhYmlsaXR5cGF0dGVybiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYWN0aXZpdHkuaHRtbCNhY3Rpdml0eSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGlzY2lwbGluZS5odG1sI2Rpc2NpcGxpbmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2RlbGl2ZXJ5cHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjYXBhYmlsaXR5cGF0dGVybiIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DYXBhYmlsaXR5IFBhdHRlcm48L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNhcGFiaWxpdHlwYXR0ZXJuIj48YSBuYW1lPSJjYXBhYmlsaXR5cGF0dGVybiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNhcGFiaWxpdHkgUGF0dGVybjwvaDE+Ci08ZGl2PjxwPkEgQ2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGEgc3BlY2lhbCBwcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3Rlcgotb2YgYWN0aXZpdGllcyBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gQ2FwYWJpbGl0eSBwYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZQotcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIGRpc2NpcGxpbmUgYW5kIGNhbgotYmUgZGlyZWN0bHkgdXNlZCBieSBhIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiBDYXBhYmlsaXR5IHBhdHRlcm5zCi1hcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBEZWxpdmVyeSBwcm9jZXNzZXMgb3IgbGFyZ2VyCi1jYXBhYmlsaXR5IHBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzCi10aGV5IGV4cHJlc3MuPC9wPgotPHA+RXhhbXBsZXMgb2YgYSBjYXBhYmlsaXR5IHBhdHRlcm4gY291bGQgYmUgInVzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cwotbWFuYWdlbWVudCIsICJ1c2UgY2FzZSBhbmFseXNpcyIsIG9yICJ1bml0IHRlc3RpbmciLiBUeXBpY2FsbHksIGJ1dCBub3QgbmVjZXNzYXJpbHksCi1jYXBhYmlsaXR5IHBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93bgotb2YgcmV1c2FibGUgY29tcGxleCBhY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSByb2xlcyB3aGljaCBwZXJmb3JtIHRhc2tzCi13aXRoaW4gdGhlc2UgYWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZAotcHJvZHVjZWQuIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMKLXBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiBJbgotb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlCi1pbiBhIGRlbGl2ZXJ5IHByb2Nlc3MuIHRoZXJlYnkgZW5hYmxpbmcgaXRzIGFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQKLXRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIGRlbGl2ZXJ5IHByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcKLWFwcGxpZWQuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iYWN0aXZpdHkuaHRtbCNhY3Rpdml0eSI+QWN0aXZpdHk8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImRpc2NpcGxpbmUuaHRtbCNkaXNjaXBsaW5lIj5EaXNjaXBsaW5lPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJkZWxpdmVyeXByb2Nlc3MuaHRtbCNkZWxpdmVyeXByb2Nlc3MiPkRlbGl2ZXJ5IFByb2Nlc3M8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNhcHBseWFjYXBhYmlsaXR5cGF0dGVybiI+QXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm48L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY2hlY2tsaXN0Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jaGVja2xpc3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA3OGFkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jaGVja2xpc3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNoZWNrbGlzdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjaGVja2xpc3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q2hlY2tsaXN0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjaGVja2xpc3QiPjxhIG5hbWU9ImNoZWNrbGlzdCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNoZWNrbGlzdDwvaDE+Ci08ZGl2PjxwPkEgQ2hlY2tsaXN0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YKLWl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaWZpZWQuIENoZWNrbGlzdHMgYXJlIG9mdGVuIHVzZWQgaW4KLXJldmlld3Mgc3VjaCBhcyBhIHdhbGstdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY2xlYXJjb250ZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NsZWFyY29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMzVmNDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY2xlYXJjb250ZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbGxhcHNlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb2xsYXBzZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTg3NzU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbGxhcHNlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25jZXB0Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25jZXB0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxOTgyYTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uY2VwdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNvbmNlcHQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNvbmNlcHQiPjxhIG5hbWU9ImNvbmNlcHQiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Db25jZXB0PC9oMT4KLTxkaXY+PHA+QSBDb25jZXB0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkCi13aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzCi1tb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gZ3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3Mgc2V2ZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yCi10YXNrcyBvciBhY3Rpdml0aWVzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmYuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNWU2YjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25maWd1cmF0aW9uc2FuZHB1Ymxpc2hpbmdvdmVydmlldy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZmlndXJhdGlvbnNhbmRwdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZlMTFkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25maWd1cmF0aW9uc2FuZHB1Ymxpc2hpbmdvdmVydmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ29uZmlndXJhdGlvbnMgYW5kIFB1Ymxpc2hpbmcgT3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iUHV0IHlvdXIgc2hvcnQgZGVzY3JpcHRpb24gaGVyZTsgdXNlZCBmb3IgZmlyc3QgcGFyYWdyYXBoIGFuZCBhYnN0cmFjdC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iUHV0IHlvdXIgc2hvcnQgZGVzY3JpcHRpb24gaGVyZTsgdXNlZCBmb3IgZmlyc3QgcGFyYWdyYXBoIGFuZCBhYnN0cmFjdC4iIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY29uZmlndXJhdGlvbnNhbmRwdWJsaXNoaW5nb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q29uZmlndXJhdGlvbnMgYW5kIFB1Ymxpc2hpbmcgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNvbmZpZ3VyYXRpb25zYW5kcHVibGlzaGluZ292ZXJ2aWV3Ij4KLTxoMz5NZXRob2QgQ29uZmlndXJhdGlvbnMgT3ZlcnZpZXc8L2gzPgotPHA+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBzaGlwcyB3aXRoIGEgbG90IG9mIGNvbnRlbnQgb3V0IG9mIHRoZSBib3guIEl0IGluY2x1ZGVzCi0gIHRoZSBPcGVuVVAgZnJhbWV3b3JrIGFuZCB2YXJpb3VzIHBsdWctaW5zIGV4dGVuZGluZwotICBPcGVuVVAvQmFzaWMgd2l0aCBkb21haW4tc3BlY2lmaWMgYWRkaXRpb25zLiBObyBvcmdhbml6YXRpb24gb3IgcHJvamVjdCByZXF1aXJlcyBhbGwgb2YgdGhpcwotICBkb2N1bWVudGF0aW9uIGFsbCBhdCBvbmNlLCBidXQgd291bGQgd29yayB3aXRoIGEgc2VsZWN0aW9uIG9mIHNwZWNpZmljIHN1YnNldHMuPC9wPgotPHA+IEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgKEVQRiBDb21wb3NlcikgbWFuYWdlcyBmb3IgdGhhdCBwdXJwb3NlIHNvLWNhbGxlZCBtZXRob2QKLSAgY29uZmlndXJhdGlvbnMsIHdoaWNoIGFsbG93IHlvdSB0byBzcGVjaWZ5IHdvcmtpbmcgc2V0cyBvZiBjb250ZW50IGFuZCBwcm9jZXNzZXMKLSAgZm9yIGEgc3BlY2lmaWMgY29udGV4dCwgc3VjaCBhcyBhIHNwZWNpZmljIHZhcmlhbnQgb2YgdGhlIE9wZW5VUCBmcmFtZXdvcmsgdGhhdAotICB5b3Ugd2FudCB0byBwdWJsaXNoIGFuZCBkZXBsb3kgZm9yIGEgZ2l2ZW4gc29mdHdhcmUgcHJvamVjdCBvciBhcyBhIGZvdW5kYXRpb24KLSAgZm9yIGEgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uLiBBbGwgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIEVQRiBDb21wb3NlciBhcmUgb3JnYW5pemVkCi0gIGluIG1ldGhvZCBwbHVnLWlucywgd2hpY2ggYXJlIG9yZ2FuaXplZCBpbnRvIG1ldGhvZCBwYWNrYWdlcy4gQSBtZXRob2QgY29uZmlndXJhdGlvbgotICBpcyBzaW1wbHkgYSBzZWxlY3Rpb24gb2YgdGhlIG1ldGhvZCBwbHVnLWlucyBhbmQgcGFja2FnZXMuPC9wPgotPHA+PGltZyBzcmM9ImNvbmYuZ2lmIiB3aWR0aD0iNjY1Ij48L3A+Ci08cD5Zb3UgY3JlYXRlIGFuZCBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB1c2luZyB0aGUgY29uZmlndXJhdGlvbiBlZGl0b3IgZGVwaWN0ZWQKLSAgaW4gdGhlIGZpZ3VyZSBhYm92ZS4gWW91IGNvdWxkIHN0YXJ0IGNyZWF0aW5nIHlvdXIgb3duIG1ldGhvZCBjb25maWd1cmF0aW9uCi0gIGJ5IGNvcHlpbmcgb25lIG9mIHRoZSBjb25maWd1cmF0aW9ucyB0aGF0IHNoaXAgd2l0aCBFUEYgQ29tcG9zZXIgYW5kIG1vZGlmeSBpdCB0byBmaXQKLSAgeW91ciBzcGVjaWZpYyBuZWVkcy4gWW91IGNhbiBhZGQgb3IgcmVtb3ZlIHdob2xlIG1ldGhvZCBwbHVnLWlucyBhcyB3ZWxsIGFzCi0gIG1ha2Ugc2VsZWN0aW9uIHdpdGggZWFjaCBwbHVnLWluIGJ5IGNoZWNraW5nIG9yIHVuLWNoZWNraW5nIHBhY2thZ2VzLiA8L3A+Ci08cD4gWW91IGNhbiB1c2UgdGhlIHJlc3VsdGluZyBjb25maWd1cmF0aW9uIGFzIHlvdXIgd29ya2luZyBzZXQgZm9yIHlvdXIgRVBGIENvbXBvc2VyCi0gIHdvcmsuIFRoZSBhY3R1YWwgY29udGVudCBvZiB0aGUgY29uZmlndXJhdGlvbiwgaS5lLiB0aGUgaW5jbHVkZWQgbWV0aG9kIGNvbnRlbnQKLSAgYW5kIHByb2Nlc3MgZWxlbWVudHMgYXJlIGFsd2F5cyBhY2Nlc3NpYmxlIGluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuIFVzZSB0aGUKLSAgY29tYm8gYm94IGluIHRoZSB0b29sYmFyIHRvIHNlbGVjdCB0aGUgY3VycmVudGx5IHVzZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uPC9wPgotPGgzPlB1Ymxpc2hpbmcgT3ZlcnZpZXc8L2gzPgotPHA+TWV0aG9kIGNvbmZpZ3VyYXRpb25zIGFyZSB0aGUgYmFzaXMgZm9yIHB1Ymxpc2hpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4KLSAgQSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbiBpcyBhbiBodG1sIFdlYiBzaXRlIHRoYXQgcHJlc2VudHMgYWxsIHRoZSBtZXRob2QKLSAgY29udGVudCBhbmQgcHJvY2Vzc2VzIG9mIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiBhIG5hdmlnYWJsZSBhbmQgc2VhcmNoYWJsZQotICB3YXkuIEl0IHVzZXMgdGhlIHJlbGF0aW9uc2hpcHMgZXN0YWJsaXNoZWQgZHVyaW5nIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzCi0gIGF1dGhvcmluZyB0byBnZW5lcmF0ZSBoeXBlcmxpbmtzIGJldHdlZW4gZWxlbWVudHMgYXMgd2VsbCBhcyBwcm92aWRlcyB0cmVlCi0gIGJyb3dzZXJzIGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uIHZpZXcgYW5kIHVzZXItZGVmaW5lZCBjYXRlZ29yaXphdGlvbnMgb2YKLSAgdGhlIGNvbnRlbnQuIFRoZSBmaWd1cmUgYmVsb3cgc2hvd3MgYW4gZXhhbXBsZSBvZiB0aGUgcHVibGlzaGVkICdDbGFzc2ljIFJVUCcKLSAgbWV0aG9kIGNvbmZpZ3VyYXRpb24uPC9wPgotPHA+PGltZyBzcmM9InB1Yi5naWYiIHdpZHRoPSI1NTAiPjwvcD4KLTxwPkZvciBwdWJsaXNoaW5nIHNpbXBseSBjcmVhdGUgYW5kIHNlbGVjdCBhIGNvbmZpZ3VyYXRpb24uIFRoZSBwdWJsaWNhdGlvbiB3aXphcmQKLSAgd2lsbCBkbyB0aGUgcmVzdCBmb3IgeW91IGFuZCBvbmx5IHB1Ymxpc2ggY29udGVudCB0aGF0IGlzIHBhcnQgb2YgdGhlIG1ldGhvZAotICBjb25maWd1cmF0aW9uLiBJdCB3aWxsIGFsc28gYXV0b21hdGljYWxseSBhZG9wdCBjb250ZW50IHRvIHRoZSBjb25maWd1cmF0aW9uCi0gIHN1Y2ggYXMgcmVtb3ZpbmcKLSAgcmVmZXJlbmNlcyBvZiBtZXRob2QgY29udGVudCBlbGVtZW50cyB0byBlbGVtZW50cyBvdXRzaWRlIG9mIHRoZSBjb25maWd1cmF0aW9uCi0gIG9yIHJlbW92aW5nIGFjdGl2aXRpZXMgZnJvbSB5b3VyIHByb2Nlc3NlcyB0aGF0IG9ubHkgY29udGFpbiB3b3JrIGRlZmluZWQgb3V0c2lkZQotICBvZiB0aGUgY29uZmlndXJhdGlvbiBzZXQuIEhlbmNlLCBwdWJsaXNoaW5nIHdpbGwgb25seSBpbmNsdWRlIHRoZSBjb250ZW50IHRoYXQKLSAgeW91IHJlYWxseSBuZWVkLiBZb3UgY2FuIGFsd2F5cyBwcmV2aWV3IGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gdXNpbmcgRVBGIENvbXBvc2VyJ3MKLWJyb3dzaW5nIHBlcnNwZWN0aXZlLjwvcD4KLTxwPiZuYnNwOzwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmZpZ3VyYXRpb252aWV3Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25maWd1cmF0aW9udmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjYxOTJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmZpZ3VyYXRpb252aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDb25maWd1cmF0aW9uIFZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sI3VzZXJpbnRlcmZhY2VvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibGlicmFyeXZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjb25maWd1cmF0aW9udmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Db25maWd1cmF0aW9uIFZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNvbmZpZ3VyYXRpb252aWV3Ij48YSBuYW1lPSJjb25maWd1cmF0aW9udmlldyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNvbmZpZ3VyYXRpb24gVmlldzwvaDE+Ci08ZGl2PjxwPlRoZSBDb25maWd1cmF0aW9uIHZpZXcgc2hvd3MgdGhlIGNvbnRlbnQgZWxlbWVudHMgaW4gYSBsaWJyYXJ5IGZpbHRlcmVkCi1ieSBhIGNvbmZpZ3VyYXRpb24uIDwvcD4KLTxwPkEgY29uZmlndXJhdGlvbiBpcyBhIHN1YnNldCBvZiB0aGUgPGEgaHJlZj0ic3RhbmRhcmRtZXRob2RsaWJyYXJ5b3ZlcnZpZXcuaHRtbCNzdGFuZGFyZG1ldGhvZGxpYnJhcnlvdmVydmlldyI+bWV0aG9kIGxpYnJhcnk8L2E+IGNvbnRlbnQuIE9uY2UgYSBjb25maWd1cmF0aW9uIGlzIHNlbGVjdGVkCi1pbiB0aGUgQ29uZmlndXJhdGlvbiBzZWxlY3Rpb24gYm94LCB0aGUgQ29uZmlndXJhdGlvbiB2aWV3IGlzIHJlZnJlc2hlZCB3aXRoCi10aGUgY29udGVudCBmcm9tIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uLiBUaGUgY29udGVudCBpbiB0aGUgQ29uZmlndXJhdGlvbgotdmlldyBpcyBhbHdheXMgcHJlc2VudGVkIGluIHRoZSBzYW1lIHdheSBpbiBzdGFuZGFyZCBjYXRlZ29yaWVzLCBwcm9jZXNzZXMsCi1jdXN0b20gY2F0ZWdvcmllcywgYW5kIGd1aWRhbmNlLiBUaGUgQ29uZmlndXJhdGlvbiB2aWV3IGRvZXMgbm90IHNob3cgYW55Ci1waHlzaWNhbCBmb2xkZXJzLiBGb2xkZXJzIGFyZSBvbmx5IHNob3duIGluIHRoZSBMaWJyYXJ5IHZpZXcuPC9wPgotPHA+PC9wPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sIiB0aXRsZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6Ij5Ub29sIEludGVyZmFjZTwvYT48L2Rpdj4KLTxkaXYgY2xhc3M9InByZXZpb3VzbGluayI+PHN0cm9uZz5QcmV2aW91cyB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT48L2Rpdj4KLTxkaXYgY2xhc3M9Im5leHRsaW5rIj48c3Ryb25nPk5leHQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwiPkxpYnJhcnkgVmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCN1c2VyaW50ZXJmYWNlb3ZlcnZpZXciIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbnRyaWJ1dGVzLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb250cmlidXRlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzQxYmI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbnRyaWJ1dGVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDb250cmlidXRlcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZXh0ZW5kcy5odG1sI2V4dGVuZHMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InJlcGxhY2UuaHRtbCNyZXBsYWNlcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjb250cmlidXRlcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Db250cmlidXRlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY29udHJpYnV0ZXMiPjxhIG5hbWU9ImNvbnRyaWJ1dGVzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q29udHJpYnV0ZXM8L2gxPgotPGRpdj48cD5BIGNvbnRyaWJ1dGluZyBlbGVtZW50IGFkZHMgdG8gdGhlIGJhc2UgZWxlbWVudC4gQ29udHJpYnV0ZXMgcHJvdmlkZXMgYQotd2F5IGZvciBlbGVtZW50cyB0byBjb250cmlidXRlIHRoZWlyIHByb3BlcnRpZXMgaW50byB0aGVpciBiYXNlIGVsZW1lbnQgd2l0aG91dAotZGlyZWN0bHkgY2hhbmdpbmcgYW55IG9mIGl0cyBleGlzdGluZyBwcm9wZXJ0aWVzLCBzdWNoIGFzIGluIGFuIGFkZGl0aXZlIGZhc2hpb24uCi1UaGUgZWZmZWN0LCBhZnRlciBjb250cmlidXRpb24sIGlzIHRoYXQgdGhlIGJhc2UgZWxlbWVudCBpcyBsb2dpY2FsbHkgcmVwbGFjZWQKLXdpdGggYW4gZWxlbWVudCB0aGF0IGNvbWJpbmVzIHRoZSBhdHRyaWJ1dGVzIGFuZCBhc3NvY2lhdGlvbnMgb2YgdGhlIGNvbnRyaWJ1dGluZwotZWxlbWVudCB3aXRoIHRoZSBiYXNlIGVsZW1lbnQuPC9wPgotPHA+VXNlIHRoZSBDb250ZW50IFZhcmlhYmlsaXR5IHNlY3Rpb24gb24gdGhlIERlc2NyaXB0aW9uIHRhYiB0byBtYWtlIGFuIGVsZW1lbnQKLWNvbnRyaWJ1dGUgdG8gYW5vdGhlciBlbGVtZW50LiBTZWxlY3QgPHN0cm9uZz5Db250cmlidXRlczwvc3Ryb25nPiBhcyB0aGUgVmFyaWFiaWxpdHkKLXR5cGUgYW5kIHRoZW4gc2VsZWN0IHRoZSBiYXNlIGVsZW1lbnQgdG8gd2hpY2ggdGhpcyBlbGVtZW50IHdpbGwgY29udHJpYnV0ZS4KLVRoZSBiYXNlIGVsZW1lbnQgbXVzdCBiZSB0aGUgc2FtZSB0eXBlIG9mIGVsZW1lbnQgYXMgdGhlIGNvbnRyaWJ1dGluZyBlbGVtZW50LjwvcD4KLTxwPkFueSBpbmZvcm1hdGlvbiB5b3UgZW50ZXIgaW4gdGhlIGNvbnRyaWJ1dGluZyBlbGVtZW50IGlzIGFkZGVkIHRvIHRoZSBiYXNlCi1lbGVtZW50LiBUZXh0IGZpZWxkcyBpbiB0aGUgY29udHJpYnV0aW5nIGVsZW1lbnQgYXJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlCi1yZXNwZWN0aXZlIHRleHQgZmllbGRzIGluIHRoZSBiYXNlIGVsZW1lbnQuPC9wPgotPHA+Q29udHJpYnV0aW9uIG9ubHkgYWRkcyBhdHRyaWJ1dGVzIGFuZCBhc3NvY2lhdGlvbnMgdG8gdGhlIGJhc2UuIEl0IG5ldmVyCi1vdmVycmlkZXMgb3IgcmVwbGFjZXMgYW55IGluZm9ybWF0aW9uIGZyb20gdGhlIGJhc2UuIEluIG90aGVyIHdvcmRzLCBpZiB0aGUKLWJhc2UgaXMgYWxsb3dlZCBhbiBhc3NvY2lhdGlvbiB0byBleGFjdGx5IG9uZSBvdGhlciBlbGVtZW50IGFuZCBoYXMgdGhpcyBvbmUKLWFscmVhZHkgZGVmaW5lZCwgaXQgaXMgbm90IGJlaW5nIHJlcGxhY2VkIGJ5IGEgY29udHJpYnV0b3IncyBhc3NvY2lhdGlvbi48L3A+Ci08ZGl2IGNsYXNzPSJwIj48c3Ryb25nPkNvbnRyaWJ1dGlvbiBydWxlczo8L3N0cm9uZz48dWw+PGxpPkF0dHJpYnV0ZXMgYXJlIGFwcGVuZGVkIGV4Y2VwdCBmb3IgaWRlbnRpZnlpbmcvbmFtaW5nIGF0dHJpYnV0ZXMgYW5kIG5vbi1zdHJpbmcKLWF0dHJpYnV0ZXMgc3VjaCBhcyBib29sZWFuLCBkYXRlLCBldGMuPC9saT4KLTxsaT5PdXRnb2luZyB0by1vbmUgYXNzb2NpYXRpb25zIG9mIHRoZSBjb250cmlidXRvciBhcmUgaWdub3JlZCBpZiB0aGUgYmFzZQotYWxyZWFkeSBoYXMgc3VjaCBhbiBhc3NvY2lhdGlvbiBvciBpZiB0aGUgYmFzZSBlbGVtZW50IGhhcyBtb3JlIHRoYW4gb25lIGNvbnRyaWJ1dGluZwotZWxlbWVudCAoaS5lLiBpdCBjYW5ub3QgYmUgZGVjaWRlZCB3aGljaCBjb250cmlidXRpb24gc2hvdWxkIGJlIGNob3NlLCB0aGVuCi1ub25lIHdpbGwgYmUgY2hvc2VuKS48L2xpPgotPGxpPk91dGdvaW5nIHRvLW1hbnkgYXNzb2NpYXRpb25zIGFyZSBhZGRlZCB0byB0aGUgYmFzZSBlbGVtZW50cyBvZiBhIGNvbnRyaWJ1dGlvbi48L2xpPgotPGxpPkluY29taW5nIGFzc29jaWF0aW9ucyB0byB0aGUgY29udHJpYnV0aW5nIGVsZW1lbnQgd2l0aCBhIHRvLW9uZSBjb25zdHJhaW50Ci1vbiB0aGUgb3RoZXIgYXNzb2NpYXRpb24gZW5kIGFyZSBpZ25vcmVkIGlmIHRoZSBiYXNlIGFscmVhZHkgaGFzIHN1Y2ggYW4gaW5jb21pbmcKLWFzc29jaWF0aW9uIG9yIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgY29udHJpYnV0aW9uIHRvIGNvbnNpZGVyIGZvciB0aGUKLWJhc2UgZWxlbWVudC48L2xpPgotPGxpPk90aGVyIGluY29taW5nIGFzc29jaWF0aW9ucyB0byB0aGUgY29udHJpYnV0aW5nIGVsZW1lbnQgYXJlIGFkZGVkIHRvIHRoZQotYmFzZSBlbGVtZW50cyBvZiBhIGNvbnRyaWJ1dGlvbi48L2xpPgotPGxpPkEgYmFzZSBlbGVtZW50IG9mIGEgY29udHJpYnV0aW9uIGNhbiBoYXZlIG1vcmUgdGhhbiBvbmUgY29udHJpYnV0b3I8L2xpPgotPGxpPkNvbnRyaWJ1dGlvbiB3b3JrcyB0cmFuc2l0aXZlbHksIGkuZS4gYSBjb250cmlidXRpb24gZWxlbWVudCBjb250cmlidXRlcwotaXRzIG93biBjb250cmlidXRvcnMuPC9saT4KLTwvdWw+Ci1TZWUgPGEgaHJlZj0idmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMuaHRtbCN2YXJpYWJpbGl0eWFzc29jaWF0aW9ucyI+VmFyaWFiaWxpdHkgQXNzb2NpYXRpb25zPC9hPiB0byBmaW5kIHRoZSBhc3NvY2lhdGlvbnMgZm9yIGVhY2ggZWxlbWVudAotdHlwZS48L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIHRpdGxlPSJWYXJpYWJpbGl0eSBhbGxvd3MgZWxlbWVudHMgaW4gb25lIGNvbnRlbnQgcGFja2FnZSB0byBpbmZsdWVuY2Ugb3IgbW9kaWZ5IGVsZW1lbnRzIGluIG90aGVyIGNvbnRlbnQgcGFja2FnZXMgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQuIFZhcmlhYmlsaXR5IGVuYWJsZXMgY2hhbmdlcyB0byB0aGUgY29udGVudCB3aGlsZSBrZWVwaW5nIHRoZSBjaGFuZ2VzIHNlcGFyYXRlIGFuZCBvcHRpb25hbC4iPlZhcmlhYmlsaXR5PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJleHRlbmRzLmh0bWwjZXh0ZW5kcyI+RXh0ZW5kczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0icmVwbGFjZS5odG1sI3JlcGxhY2VzIj5SZXBsYWNlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb3B5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvcHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzZkZmUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvcHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYWNvbnRlbnRwYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhY29udGVudHBhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1OGI4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhY29udGVudHBhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0ZSBhIENvbnRlbnQgUGFja2FnZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCNtZXRob2Rjb250ZW50cGFja2FnZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCNjcmVhdGVhbWV0aG9kcGx1Z2luIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNyZWF0ZWNvbnRlbnRwYWNrYWdlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNyZWF0ZSBhIENvbnRlbnQgUGFja2FnZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlY29udGVudHBhY2thZ2UiPjxhIG5hbWU9ImNyZWF0ZWNvbnRlbnRwYWNrYWdlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIGEgQ29udGVudCBQYWNrYWdlPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+PHA+TWV0aG9kIGNvbnRlbnQgaXMgb3JnYW5pemVkIGludG8gY29udGVudCBwYWNrYWdlcyB3aGljaCwgaW4gdHVybiwKLWFyZSBjb250YWluZWQgaW4gbWV0aG9kIHBsdWctaW5zLjwvcD4KLUJlZm9yZSBjcmVhdGluZyBhIGNvbnRlbnQgcGFja2FnZSwgeW91Ci1zaG91bGQgY3JlYXRlIGEgbWV0aG9kIHBsdWctaW4uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0iY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sI2NyZWF0ZWFtZXRob2RwbHVnaW4iPkNyZWF0ZSBhIE1ldGhvZCBQbHVnLWluPC9hPi48L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPllvdSBzaG91bGQgYWx3YXlzIGNyZWF0ZSBhIG5ldyA8YSBocmVmPSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sI21ldGhvZGNvbnRlbnRwYWNrYWdlIj5NZXRob2QgQ29udGVudCBQYWNrYWdlPC9hPiBhbmQgPGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+TWV0aG9kIENvbnRlbnQ8L2E+IGluIGEgPGEgaHJlZj0ibWV0aG9kcGx1Z2luLmh0bWwjbWV0aG9kcGx1Z2luIj5NZXRob2QgUGx1Zy1pbjwvYT4gdGhhdAoteW91IHByb2R1Y2UuIFRoaXMgc2VwYXJhdGVzIHlvdXIgY29udGVudCBmcm9tIG9yaWdpbmFsIGNvbnRlbnQgc2hpcHBlZCB3aXRoCi10aGUgdG9vbCBhbmQgYWxsb3dzIHlvdSB0byB1cGRhdGUgeW91ciBvd24gbGlicmFyeSB3aXRoIG5ldyBsaWJyYXJ5IHJlbGVhc2VzCi13aXRob3V0IGFmZmVjdGluZyB0aGUgY29udGVudCB0aGF0IHlvdSBoYXZlIGNyZWF0ZWQgaW4geW91ciBvd24gcGx1Zy1pbnMuIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBZb3UKLWNhbm5vdCBjcmVhdGUgYSBuZXcgY29udGVudCBwYWNrYWdlIG9yIGFueSBvdGhlciBlbGVtZW50IGluIGEgbG9ja2VkIHBsdWctaW4uPC9kaXY+Ci08cD5UbwotY3JlYXRlIGEgY29udGVudCBwYWNrYWdlOjwvcD4KLTwvZGl2PgotPG9sPjxsaT48c3Bhbj5GaW5kIHlvdXIgbWV0aG9kIHBsdWctaW4gaW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4uPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+RHJpbGwgaW50byB0aGUgcGx1Zy1pbiB0byBsb2NhdGUgdGhlIHBhY2thZ2UgY2FsbGVkIDxzdHJvbmc+Q29udGVudAotUGFja2FnZXM8L3N0cm9uZz4uIFRoaXMgcGFja2FnZSBjb250YWlucyBhbGwgcGFja2FnZXMgdGhhdCBhcmUgYWxsb3dlZCB0byBjb250YWluCi1tZXRob2QgZWxlbWVudHMuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+UmlnaHQgY2xpY2sgdGhlIGNvbnRlbnQgcGFja2FnZSBhbmQgdGhlbiBzZWxlY3QgPHN0cm9uZz5OZXcgJmd0OyBDb250ZW50Ci1QYWNrYWdlPC9zdHJvbmc+LiBUaGUgY29udGVudCBwYWNrYWdlIGVkaXRvciBhcHBlYXJzLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlVuZGVyIEdlbmVyYWwgSW5mb3JtYXRpb24sIGdpdmUgdGhlIG5ldyBjb250ZW50IHBhY2thZ2UgYSB1bmlxdWUKLW5hbWUgYW5kIHByb3ZpZGUgYSBicmllZiBkZXNjcmlwdGlvbi48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5TYXZlIHRoZSBuZXcgY29udGVudCBwYWNrYWdlIGluIG9uZSBvZiB0aHJlZSB3YXlzOjwvc3Bhbj48b2wgdHlwZT0iYSI+PGxpPjxzcGFuPkNsaWNrIHRoZSBkaXNrIGljb24gaW4gdGhlIHRvb2xiYXIuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+U2VsZWN0IDxzdHJvbmc+RmlsZSAmZ3Q7IFNhdmU8L3N0cm9uZz4uPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+U2ltcGx5IGNsb3NlIHRoZSBjb250ZW50IGVkaXRvci48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBUaGUgdG9vbCBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgbm9kZXMgZm9yIDxhIGhyZWY9InRhc2suaHRtbCN0YXNrIj5UYXNrPC9hPiwgPGEgaHJlZj0icm9sZS5odG1sI3JvbGUiPlJvbGU8L2E+LCA8YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij5Xb3JrIFByb2R1Y3Q8L2E+LCBhbmQgPGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+IHVuZGVyIHRoZSBuZXcgY29udGVudCBwYWNrYWdlLjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0ibWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCI+TWV0aG9kIENvbnRlbnQgUGFja2FnZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sI21ldGhvZGNvbnRlbnRwYWNrYWdlIj5NZXRob2QgQ29udGVudCBQYWNrYWdlPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50Ij5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCNjcmVhdGVhbWV0aG9kcGx1Z2luIj5DcmVhdGUgYSBNZXRob2QgUGx1Zy1pbjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZGVmMmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0ZSBhIERlbGl2ZXJ5IFByb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InByb2Nlc3MuaHRtbCNwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkZWxpdmVyeXByb2Nlc3MuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNyZWF0ZSBhIERlbGl2ZXJ5IFByb2Nlc3M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MiPjxhIG5hbWU9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGUgYSBEZWxpdmVyeSBQcm9jZXNzPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+PHA+QSBEZWxpdmVyeSBQcm9jZXNzIGRlc2NyaWJlcyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoCi1mb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHR5cGUgb2YgcHJvamVjdC4gQSBEZWxpdmVyeSBQcm9jZXNzIGRlc2NyaWJlcyB3aGF0Ci1pcyBwcm9kdWNlZCwgaG93IGl0IGlzIHByb2R1Y2VkIGFuZCB0aGUgcmVxdWlyZWQgc3RhZmZpbmcgZm9yIHRoZSBlbnRpcmUgcHJvamVjdAotbGlmZWN5Y2xlLjwvcD4KLUEgRGVsaXZlcnkgUHJvY2VzcyBpcyBjcmVhdGVkIGZvciBhIHBhcnRpY3VsYXIgdHlwZSBvZiBwcm9qZWN0Ci10byByZWZsZWN0IHRoZSBzcGVjaWZpYyBwbGFubmluZyBhbmQgcHJvamVjdCBtYW5hZ2VtZW50IG5lZWRzLiA8cD5CZWZvcmUKLWNyZWF0aW5nIGEgZGVsaXZlcnkgcHJvY2Vzczo8L3A+Ci08dWw+PGxpPlNlbGVjdCBhIG1ldGhvZCBwbHVnLWluIHRvIGhvbGQgeW91ciBwcm9jZXNzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiI+TWV0aG9kIFBsdWctaW48L2E+LjwvbGk+Ci08bGk+RmluZCBvciBjcmVhdGUgYSBwcm9jZXNzIHBhY2thZ2UuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRoZXJlIGFyZSBzZXZlcmFsIHdheXMgdG8gcG9wdWxhdGUgYSBwcm9jZXNzIHdpdGggbWV0aG9kIGVsZW1lbnRzOjx1bD48bGk+QnkgaW5jb3Jwb3JhdGluZyBpbmRpdmlkdWFsIG1ldGhvZCBlbGVtZW50cyBieSBkcmFnZ2luZyB0aGUgZWxlbWVudHMgb250bwotYW4gYWN0aXZpdHkgaW4gdGhlIHByb2Nlc3MuPC9saT4KLTxsaT5CeSBpbmNsdWRpbmcgYWxyZWFkeSBkZWZpbmVkIGNhcGFiaWxpdHkgcGF0dGVybnMuPC9saT4KLTxsaT5CeSBpbmNsdWRpbmcgcGFydHMgb2YgYWxyZWFkeSBkZWZpbmVkIGNhcGFiaWxpdHkgcGF0dGVybnMuPC9saT4KLTxsaT5CeSBjcmVhdGluZyBkZXNjcmlwdG9ycyBkaXJlY3RseSBpbiB0aGUgcHJvY2Vzcywgd2hpY2ggYXJlIGVpdGhlciB1bnJlbGF0ZWQKLXRvIGFueSBtZXRob2QgY29udGVudCBvciByZWxhdGVkIHRvIG1ldGhvZCBjb250ZW50IGF0IGEgbGF0ZXIgcG9pbnQgaW4gdGltZS48L2xpPgotPC91bD4KLVRvIGNyZWF0ZSBhIERlbGl2ZXJ5IFByb2Nlc3M6PC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PbmNlIHlvdSBoYXZlIHNlbGVjdGVkIG9yIGNyZWF0ZWQgYSBwcm9jZXNzIHBhY2thZ2UsIHJpZ2h0IGNsaWNrCi10aGUgcHJvY2VzcyBwYWNrYWdlLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3Ryb25nPk5ldyAmZ3Q7IERlbGl2ZXJ5IFByb2Nlc3M8L3N0cm9uZz4uIFRoZSBOZXcgUHJvY2VzcyBDb21wb25lbnQKLWRpYWxvZyBhcHBlYXJzLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGEgbmFtZSBmb3IgdGhlIGRlbGl2ZXJ5IHByb2Nlc3MgaW50byB0aGUgPHN0cm9uZz5OYW1lPC9zdHJvbmc+IGZpZWxkCi1hbmQgdGhlbiBzZWxlY3QgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgZHJvcCBkb3duIGxpc3QuIFlvdXIgcHJvY2VzcwotY2FuIGNvbnRhaW4gY29udGVudCBmcm9tIG1hbnkgZGlmZmVyZW50IG1ldGhvZCBwbHVnLWlucy4gZm9yIHRoaXMgcmVhc29uIHlvdQotbmVlZCB0byBkZWZpbmUgYSBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgdmlzaWJsZSBzZXQgb2YgZWxlbWVudHMgYW5kCi1yZWxhdGlvbnNoaXBzIHdoZW4gdGhlIHByb2Nlc3MgaXMgYXV0aG9yZWQuIFRoaXMgcHJvY2VzcyBhdXRob3JpbmcgY29uZmlndXJhdGlvbgotaXMgcmVmZXJyZWQgdG8gYXMgdGhlIERlZmF1bHQgQ29uZmlndXJhdGlvbiBmb3IgdGhlIHByb2Nlc3MgYW5kIHNob3VsZCBkZWZpbmUKLXRoZSBsYXJnZXN0IHJlYXNvbmFibGUgc2V0IG9mIG1ldGhvZCBwbHVnLWlucywgY29udGVudCBwYWNrYWdlcywgYW5kIG90aGVyCi1wcm9jZXNzZXMgZnJvbSB0aGUgbWV0aG9kIGxpYnJhcnkgdGhhdCB3aWxsIGJlIHJlZmVycmVkIHRvIGJ5IHRoZSBwcm9jZXNzCi1hdCBzb21lIHBvaW50Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBUaGUgcHJvY2VzcyBpcyBjcmVhdGVkIGFuZCB0aGUgcHJvY2VzcyBlZGl0b3IKLWlzIG9wZW5lZC48L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBJZiB0aGUgUHJvcGVydGllcyB3aW5kb3cgb3BlbnMgdG8gdGhlIHJpZ2h0IG9mCi10aGUgcHJvY2VzcyBlZGl0b3IsIGNsaWNrIHRoZSA8c3Ryb25nPng8L3N0cm9uZz4gdG8gY2xvc2UgaXQuPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgcHJvY2VzcyBlZGl0b3IsIHVuZGVyIHRoZSBEZXNjcmlwdGlvbiB0YWIsIGRvY3VtZW50IHlvdXIKLXByb2Nlc3MgdXNpbmcgdGhlIGF2YWlsYWJsZSB0ZXh0IGZpZWxkcy48L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBZb3UgY2FuIHVzZSB0aGUKLVJpY2ggVGV4dCBFZGl0b3IgdG8gZWRpdCBvciBlbnRlciB0aGUgdGV4dCBmb3IgYW55IGZpZWxkIHRoYXQgaGFzIGEgdHdpc3R5Ci1zeW1ib2wgPGltZyBzcmM9ImNvbGxhcHNlZC5naWYiIGFsdD0iIiAvPi4gU2ltcGx5IGNsaWNrIHRoZSBzeW1ib2wKLXRvIGFjY2VzcyB0aGUgUmljaCBUZXh0IEVkaXRvci4gQ2xpY2sgdGhlIHN5bWJvbCBhZ2FpbiB0byBjbG9zZSB0aGUgUmljaCBUZXh0Ci1FZGl0b3IuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8YSBocmVmPSJyaWNodGV4dGVkaXRvci5odG1sI3JpY2h0ZXh0ZWRpdG9yIj5SaWNoIFRleHQgRWRpdG9yPC9hPjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RGVjaWRlIG9uIHlvdXIgcHJpbWFyeSBwcm9jZXNzIGF1dGhvcmluZyB2aWV3LiBZb3UgZGV2ZWxvcCBhIHByb2Nlc3MKLXVzaW5nIHRocmVlIGRpZmZlcmVudCB2aWV3czo8L3NwYW4+PHVsPjxsaT48c3Ryb25nPldvcmsgQnJlYWtkb3duIFN0cnVjdHVyZTwvc3Ryb25nPjogRGVmaW5lIGEgd29yayBicmVha2Rvd24gc3RydWN0dXJlCi1pbiB5b3VyIHByb2Nlc3MuIENyZWF0ZSBpdGVyYXRpb25zIGFuZCBhY3Rpdml0aWVzIGZpcnN0LCBhbmQgdGhlbiBwb3B1bGF0ZQoteW91ciBhY3Rpdml0aWVzIGJ5IGFwcGx5aW5nIHRhc2tzIGZyb20geW91ciBNZXRob2QgQ29udGVudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24KLXNlZSA8YSBocmVmPSJkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbCI+RGV2ZWxvcCBhIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZTwvYT4uPC9saT4KLTxsaT48c3Ryb25nPlRlYW0gQWxsb2NhdGlvbjwvc3Ryb25nPjogRGVmaW5lIHdoaWNoIHRlYW1zIGFuZCByb2xlcyBzaGFsbCBwYXJ0aWNpcGF0ZQotaW4gYWN0aXZpdGllcyBhbmQgdGhlbiBmaW5kIHJlc3BvbnNpYmxlIHdvcmsgcHJvZHVjdHMgYW5kIHRhc2tzIGZyb20gdGhlcmUuCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9ImRldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlIj5EZXZlbG9wIGEgVGVhbSBBbGxvY2F0aW9uIFN0cnVjdHVyZTwvYT4uPC9saT4KLTxsaT48c3Ryb25nPldvcmsgUHJvZHVjdCBVc2FnZTwvc3Ryb25nPjogRGVmaW5lIHdoaWNoIHdvcmsgcHJvZHVjdHMgc2hvdWxkIGJlIGNyZWF0ZWQKLWluIGFjdGl2aXRpZXMgYW5kIGZpbmQgdGFza3MgYW5kIHJvbGVzIGZyb20gdGhlcmUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8YSBocmVmPSJkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUiPkRldmVsb3AgYSBXb3JrIFByb2R1Y3QgVXNhZ2UgU3RydWN0dXJlPC9hPi48L2xpPgotPC91bD4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPjxhIGhyZWY9ImFwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4iPkFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuPC9hPiBvciBjYXBhYmlsaXR5IHBhdHRlcm4gcGFydHMgdG8gdGhlIGRlbGl2ZXJ5IHByb2Nlc3MuPC9zcGFuPjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PgotPHVsIGNsYXNzPSJ1bGxpbmtzIj4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iZGVsaXZlcnlwcm9jZXNzLmh0bWwiPkRlbGl2ZXJ5IFByb2Nlc3M8L2E+PC9zdHJvbmc+PGJyIC8+Ci08L2xpPgotPC91bD4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0icHJvY2Vzcy5odG1sI3Byb2Nlc3MiPlByb2Nlc3M8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY2FwYWJpbGl0eXBhdHRlcm4iPkNhcGFiaWxpdHkgUGF0dGVybjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbi5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJiYTQ2NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0ZSBhIE1ldGhvZCBDb25maWd1cmF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb25maWd1cmF0aW9ucy5odG1sI21ldGhvZGNvbmZpZ3VyYXRpb25zIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2RwbHVnaW4uaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCNtZXRob2Rjb250ZW50cGFja2FnZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb25maWd1cmF0aW9ucy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNyZWF0ZSBhIE1ldGhvZCBDb25maWd1cmF0aW9uPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbiI+PGEgbmFtZT0iY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24iPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGUgYSBNZXRob2QgQ29uZmlndXJhdGlvbjwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPjxwPkEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gYWxsb3dzIHlvdSB0byBzZWxlY3QgYW5kIGRlc2VsZWN0IGZyb20gdGhlCi1jb250ZW50IHBhY2thZ2VzIGFuZCBwcm9jZXNzIGF2YWlsYWJsZSBpbiB0aGUgbWV0aG9kIGxpYnJhcnkncyBzZXQgb2YgcGx1Zy1pbnMuCi1UaGUgc2VsZWN0aW9ucyB5b3UgbWFrZSBoZWxwIHlvdSBuYXJyb3cgZG93biB0aGUgY29udGVudCB5b3UgYXJlIHJlYWxseSBpbnRlcmVzdGVkCi1pbiB3b3JraW5nIHdpdGgsIGFzIHdlbGwgYXMgZGV0ZXJtaW5lIHRoZSBjb250ZW50IG9mIHRoZSBXZWIgc2l0ZSB5b3UgdWx0aW1hdGVseQotcHVibGlzaCB0byBkZXBsb3kgeW91ciBwcm9jZXNzLiBBIGNvbmZpZ3VyYXRpb24gaXMgZ2l2ZW4gYSBuYW1lIGFuZCB0aGVuIHNhdmVkCi1zbyBpdCBjYW4gYmUgY2hhbmdlZCBhbmQgdGhlbiByZS1wdWJsaXNoZWQgYXQgYSBsYXRlciBkYXRlLjwvcD4KLUJlZm9yZSBjcmVhdGluZwotYSBtZXRob2QgY29uZmlndXJhdGlvbiwgYXNzZXNzIHlvdXIgbmVlZHMgYW5kIGdvYWxzIGZvciB0aGUgY29uZmlndXJhdGlvbi48L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRoZXJlIGFyZSB0d28gd2F5cyB0byBjcmVhdGUgYSBtZXRob2QgY29uZmlndXJhdGlvbjo8YSBuYW1lPSJjcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbl9fY3JlYXRlIj48IS0tIC0tPjwvYT48dWwgaWQ9ImNyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uX19jcmVhdGUiPjxsaT5DcmVhdGUgYSBuZXcgbWV0aG9kIGNvbmZpZ3VyYXRpb24gZnJvbSBzY3JhdGNoLjwvbGk+Ci08bGk+Q3JlYXRlIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gYnkgY29weWluZyBhbiBleGlzdGluZyBjb25maWd1cmF0aW9uLjwvbGk+Ci08L3VsPgotPHN0cm9uZz5UbyBjcmVhdGUgYSBuZXcgbWV0aG9kIGNvbmZpZ3VyYXRpb24gZnJvbSBzY3JhdGNoOjwvc3Ryb25nPjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+TWFrZSBzdXJlIHlvdSBhcmUgd29ya2luZyBpbiB0aGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIExpYnJhcnkgdmlldywgcmlnaHQgY2xpY2sgdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbnM8L3N0cm9uZz4gZm9sZGVyCi1hbmQgdGhlbiBzZWxlY3QgPHN0cm9uZz5OZXcgJmd0OyBNZXRob2QgQ29uZmlndXJhdGlvbjwvc3Ryb25nPi4gWW91ciBuZXcgY29uZmlndXJhdGlvbgotaXMgY3JlYXRlZCBhbmQgdGhlIGNvbmZpZ3VyYXRpb24gZWRpdG9yIGlzIG9wZW5lZC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIGNvbmZpZ3VyYXRpb24gZWRpdG9yIHdpbmRvdywgdHlwZSBhIG5hbWUgZm9yIHlvdXIgY29uZmlndXJhdGlvbgotaW4gdGhlIDxzdHJvbmc+TmFtZTwvc3Ryb25nPiBmaWVsZC4gSWYgeW91IGNsaWNrIGFueXdoZXJlIGluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+IG9yIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwiPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4sIHlvdQotd2lsbCBiZSBhYmxlIHRvIHNlZSB5b3VyIG5ldyBjb25maWd1cmF0aW9uIG5hbWUgaW4gdGhlIENvbmZpZ3VyYXRpb25zIGZvbGRlcgotaW4gdGhlIExpYnJhcnkgdmlldyB0cmVlLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGEgZGVzY3JpcHRpb24gZm9yIHlvdXIgY29uZmlndXJhdGlvbiBpbiB0aGUgRGVzY3JpcHRpb24gZmllbGQsCi1hbmQgdGhlbiBzZWxlY3QgPHN0cm9uZz5GaWxlICZndDsgU2F2ZSBBbGw8L3N0cm9uZz4gdG8gc2F2ZSB5b3VyIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+QXQgdGhlIGJvdHRvbSBvZiB0aGUgZWRpdG9yIHdpbmRvdywgY2xpY2sgdGhlIDxzdHJvbmc+UGx1Zy1pbiBhbmQgUGFja2FnZQotU2VsZWN0aW9uPC9zdHJvbmc+IHRhYi4gPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBzZWxlY3Rpb24gc2VjdGlvbiBkaXNwbGF5cyBhIGxpc3Qgb2YgYWxsCi1tZXRob2QgcGx1Zy1pbnMgdGhlaXIgY29udGVudCBwYWNrYWdlcyBhbmQgcHJvY2Vzc2VzLiBVc2UgdGhlIGNoZWNrIGJveGVzCi10byBhZGQgb3IgcmVtb3ZlIHBsdWctaW5zLCBwYWNrYWdlcywgYW5kIHByb2Nlc3NlcyB0byBvciBmcm9tIHlvdXIgY29uZmlndXJhdGlvbi4KLUV4cGFuZCBlYWNoIHBsdWctaW4gdG8gc2VsZWN0IGFuZCBkZXNlbGVjdCBpbmRpdmlkdWFsIHBhY2thZ2VzIGFuZCBwcm9jZXNzZXMuPC9zcGFuPiA8cD5BcyB5b3UgbWFrZSB5b3VyIHNlbGVjdGlvbnMsIHdhcm5pbmcgc2lnbnMgbWF5IGFwcGVhciBhZ2FpbnN0Ci1zb21lIG9mIHRoZSBwbHVnLWluIGFuZCBwYWNrYWdlIG5hbWVzLCBhbmQgdGhlIENvbmZpZ3VyYXRpb24gV2FybmluZyBMb2cgdmlldwotbWF5IGJlIGRpc3BsYXllZC4gVGhlc2Ugd2FybmluZ3MgYXJlIGludGVuZGVkIHRvIGhlbHAgZW5zdXJlIHRoYXQgeW91IGNyZWF0ZQotYSBjb25maWd1cmF0aW9uIHRoYXQgIm1ha2VzIHNlbnNlIi48L3A+Ci08cD5JZiB5b3UgcmVmZXJlbmNlIGFuIGVsZW1lbnQgaW4gYQotcGFja2FnZSB0aGF0IGlzIGZyb20gYW5vdGhlciBwYWNrYWdlLCB5b3UgY2FuIG9ubHkgc2VlIHRoZSBmdWxsIGRldGFpbHMgZm9yCi10aGF0IGVsZW1lbnQgaW4gYSBwdWJsaXNoZWQgV2ViIHNpdGUgaWYgdGhlIHBhY2thZ2UgY29udGFpbmluZyB0aGUgZWxlbWVudAotaXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24uIElmIHRoZSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQgaXMgbm90IGluIHRoZQotY29uZmlndXJhdGlvbiwgdGhlICJvZmZlbmRpbmciIHBhY2thZ2UgaXMgbWFya2VkIHdpdGggYSB3YXJuaW5nIHNpZ24uIFlvdQotbWF5IGNob29zZSBub3QgdG8gaW5jbHVkZSB0aGUgZnVsbCBkZXRhaWxzIG9mIGEgcmVmZXJlbmNlZCBlbGVtZW50LiBDbGljawotdGhlIDxzdHJvbmc+QWRkIE1pc3NpbmcgUmVmZXJlbmNlczwvc3Ryb25nPiBidXR0b24gdG8gYXV0b21hdGljYWxseSBhbmQgcmVjdXJzaXZlbHkKLWFkZCBwYWNrYWdlcyBjb250YWluaW5nIGFueSBlbGVtZW50cyB0aGF0IGFyZSByZWZlcmVuY2VkIGluIGFscmVhZHkgc2VsZWN0ZWQKLXBhY2thZ2VzLiBTaW5jZSB0aGlzIGlzIHJlY3Vyc2l2ZSwgYSBsYXJnZSBudW1iZXIgb2YgcGFja2FnZXMgbWF5IGJlIGFkZGVkLAotcGVyaGFwcyBtYWtpbmcgeW91ciBjb25maWd1cmF0aW9uIGxhcmdlciB0aGFuIHlvdSB3YW50IGl0IHRvIGJlLjwvcD4KLTxwPklmCi15b3UgaGF2ZSBlbGVtZW50cyBpbiBhIHBhY2thZ2UgdGhhdCBjb250cmlidXRlIHRvLCBleHRlbmQsIG9yIHJlcGxhY2UgZWxlbWVudHMKLWluIGFub3RoZXIgcGFja2FnZSwgaXQgaXMgYW4gZXJyb3IgaWYgdGhlIGJhc2UgcGFja2FnZSBpcyBub3QgaW5jbHVkZWQgaW4KLXRoZSBjb25maWd1cmF0aW9uLiBFcnJvcnMgYXJlIG1hcmtlZCB3aXRoIGEgcmVkIGNyb3NzLiBJZiB5b3UgZHJpbGwgZG93biBpbnRvCi1hIHBsdWctaW4gb3IgcGFja2FnZSBtYXJrZWQgd2l0aCBhIGNyb3NzIHlvdSB3aWxsIGRpc2NvdmVyIHRoZSAib2ZmZW5kaW5nIgotcGFja2FnZSBhbmQgdGhlbiB5b3UgY2FuIGZpbmQgdGhlIHBhY2thZ2VzIHlvdSBuZWVkIHRvIGluY2x1ZGUgdG8gcmVzb2x2ZQotdGhlIGVycm9yLiBBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gY2xpY2sgdGhlIDxzdHJvbmc+TWFrZSBjbG9zdXJlIGJ5IGZpeGluZyBlcnJvcnM8L3N0cm9uZz4gYnV0dG9uCi10byBhdXRvbWF0aWNhbGx5IGZpeCB0aGUgZXJyb3JzIGJ5IGFkZGluZyB0aGUgbWlzc2luZyBiYXNlIHBhY2thZ2VzLjwvcD4KLTxwPlRoZQotQ29uZmlndXJhdGlvbiBXYXJuaW5nIExvZyBsaXN0cyBhbmQgZXhwbGFpbnMgYWxsIGVycm9ycyBhbmQgd2FybmluZ3MgaW4gdGhlCi1jb25maWd1cmF0aW9uLjwvcD4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCA8c3Ryb25nPkZpbGUgJmd0OyBTYXZlIEFsbDwvc3Ryb25nPjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5EZWZpbmUgdGhlIHZpZXdzIGZvciB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24uIEEgdmlldyBpcyBhIG5hdmlnYXRpb24KLXRyZWUgYnJvd3NlciBpbiBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLiBFdmVyeSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbiBjYW4KLWhhdmUgc2V2ZXJhbCB2aWV3cyB0aGF0IGFyZSBkaXNwbGF5ZWQgYXMgc3RhY2tlZCB0cmVlIGJyb3dzZXIgdGFicy4gVGhlIHN0cnVjdHVyZQotb2YgdGhlIHZpZXcgaXMgZGVmaW5lZCBhcyBhIEN1c3RvbSBDYXRlZ29yeS48L3NwYW4+PG9sIHR5cGU9ImEiPjxsaT48c3Bhbj5JbiB0aGUgQ29uZmlndXJhdGlvbiBFZGl0b3IsIGNsaWNrIHRoZSA8c3Ryb25nPlZpZXdzPC9zdHJvbmc+IHRhYi48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5BZGQgVmlldzwvc3Ryb25nPiBidXR0b24uIFRoZSBTZWxlY3QgQ2F0ZWdvcmllcyBkaWFsb2cKLWFwcGVhcnMuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+SWYgbmVlZGVkLCBjbGljayB0aGUgKCspIHNpZ24gdG8gZXhwYW5kIHRoZSBDdXN0b20gQ2F0ZWdvcmllcwotZm9sZGVyIGFuZCB0aGVuIHNlbGVjdCB0aGUgY2F0ZWdvcnkgeW91IHdhbnQgdG8gdXNlIGFzIHlvdXIgdmlldy4gQ2xpY2sgdGhlCi0oKykgc2lnbiB0byBleHBhbmQgeW91ciBjaG9zZW4gY2F0ZWdvcnkgYW5kIHZpZXcgaXQncyBjb250ZW50cy4gUHJlc3MgYW5kCi1ob2xkIHRoZSBDVFJMIGtleSB0byBzZWxlY3QgbXVsdGlwbGUgdmlld3MuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+Q2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVGhlIGRpYWxvZyB3aW5kb3cgZGlzYXBwZWFycyBhbmQgdGhlIHZpZXdzCi15b3Ugc2VsZWN0ZWQgYXJlIGFkZGVkIHRvIHRoZSBDb25maWd1cmF0aW9uLjwvc3Bhbj48L2xpPgotPC9vbD4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgdmlldyB5b3Ugd2FudCB0byBkaXNwbGF5IGFzIHlvdXIgY29uZmlndXJhdGlvbidzIHN0YXJ0LXVwCi12aWV3IGFuZCB0aGVuIGNsaWNrIHRoZSA8c3Ryb25nPk1ha2UgRGVmYXVsdDwvc3Ryb25nPiBidXR0b24uIFRoZSBzdGFydC11cCB2aWV3IGlzIHRoZQotZmlyc3QgdmlldyBzaG93biB3aGVuIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gaXMgZGlzcGxheWVkIGZvciB0aGUgZmlyc3QKLXRpbWUuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzdHJvbmc+RmlsZSAmZ3Q7IFNhdmUgYWxsPC9zdHJvbmc+IHRvIHNhdmUgeW91ciBjb25maWd1cmF0aW9uLjwvc3Bhbj48L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxzdHJvbmc+VG8gY3JlYXRlIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gYnkgY29weWluZyBhbiBleGlzdGluZyBjb25maWd1cmF0aW9uPC9zdHJvbmc+OjxvbD48bGk+TWFrZSBzdXJlIHlvdSBhcmUgd29ya2luZyBpbiB0aGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPi48cD48L3A+Ci08L2xpPgotPGxpPkluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+LAotZXhwYW5kIHRoZSBDb25maWd1cmF0aW9ucyBmb2xkZXIuPHA+PC9wPgotPC9saT4KLTxsaT4gUmlnaHQgY2xpY2sgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIHlvdSB3YW50IHRvIGNvcHkgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5Db3B5PC9zdHJvbmc+LjxwPjwvcD4KLTwvbGk+Ci08bGk+UmlnaHQgY2xpY2sgdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbnM8L3N0cm9uZz4gZm9sZGVyIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+UGFzdGU8L3N0cm9uZz4uCi1UeXBlIGEgbmFtZSBmb3IgdGhlIG5ldyBjb25maWd1cmF0aW9uIGluIHRoZSBwb3AtdXAgd2luZG93LiBUaGUgY29waWVkIG1ldGhvZAotY29uZmlndXJhdGlvbiBpcyBwYXN0ZWQgaW50byB0aGUgQ29uZmlndXJhdGlvbnMgZm9sZGVyLjxwPjwvcD4KLTwvbGk+Ci08bGk+RG91YmxlIGNsaWNrIHRoZSBuZXdseSBwYXN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdG8gb3BlbiBpdHMgY29uZmlndXJhdGlvbgotZWRpdG9yLjxwPjwvcD4KLTwvbGk+Ci08bGk+Rm9sbG93IHN0ZXBzIDMgdGhyb3VnaCAxMCBpbiA8c3Ryb25nPlRvIENyZWF0ZSBhIE5ldyBNZXRob2QgQ29uZmlndXJhdGlvbiBmcm9tCi1TY3JhdGNoPC9zdHJvbmc+IGFib3ZlIHRvIGNvbnRpbnVlLjwvbGk+Ci08L29sPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0ibWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCNtZXRob2Rjb25maWd1cmF0aW9ucyI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sIj5NZXRob2QgUGx1Zy1pbjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCNtZXRob2Rjb250ZW50cGFja2FnZSI+TWV0aG9kIENvbnRlbnQgUGFja2FnZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwiPkNyZWF0ZSBhIE1ldGhvZCBQbHVnLWluPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhkNjIzMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgYSBNZXRob2QgUGx1Zy1pbiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kcGx1Z2luLmh0bWwjbWV0aG9kcGx1Z2luIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sI21ldGhvZGNvbnRlbnRwYWNrYWdlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhY29udGVudHBhY2thZ2UuaHRtbCNjcmVhdGVjb250ZW50cGFja2FnZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kcGx1Z2luLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlYW1ldGhvZHBsdWdpbiIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgYSBNZXRob2QgUGx1Zy1pbjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlYW1ldGhvZHBsdWdpbiI+PGEgbmFtZT0iY3JlYXRlYW1ldGhvZHBsdWdpbiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0ZSBhIE1ldGhvZCBQbHVnLWluPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+PHA+TWV0aG9kIFBsdWctaW5zIGFsbG93IHRoZSBleHRlbnNpb24gb3IgY3VzdG9taXphdGlvbiBvZiBiYXNlIGxpYnJhcnkKLWNvbnRlbnQgd2l0aG91dCBkaXJlY3RseSBjaGFuZ2luZyB0aGF0IGJhc2UgY29udGVudCBieSBkZWZpbmluZyB0aGUgZGlmZmVyZW5jZXMKLXRvIHRoZSBjb250ZW50LiBZb3Ugc2hvdWxkIGFsd2F5cyBjcmVhdGUgbmV3IGNvbnRlbnQgaW4gYSBtZXRob2QgcGx1Zy1pbiB0aGF0Ci15b3UgcHJvZHVjZSB0byBzZXBhcmF0ZSB5b3VyIGNvbnRlbnQgZnJvbSB0aGUgb3JpZ2luYWwgT3BlblVQL0Jhc2ljIGNvbnRlbnQuIFRoaXMKLWFsc28gYWxsb3dzIHlvdSB0byB1cGRhdGUgeW91ciBvd24gbGlicmFyeSB3aXRoIG5ldyByZWxlYXNlcyBvZiB0aGUgT3BlblVQL0Jhc2ljIE1ldGhvZAotTGlicmFyeSB3aXRob3V0IGFmZmVjdGluZyB0aGUgY29udGVudCB0aGF0IHlvdSBoYXZlIGNyZWF0ZWQgaW4geW91ciBvd24gcGx1Zy1pbnMuPC9wPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFBsdWctaW5zCi10aGF0IGFyZSBzaGlwcGVkIHdpdGggRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBhcmUgbG9ja2VkIGFuZCByZWFkLW9ubHkuCi1UaGVzZSBwbHVnLWlucyBhcmUgZ3JheWVkIG91dCBpbiB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPiwgaW5kaWNhdGluZyB0aGF0IHRoZXkgYXJlIGxvY2tlZC48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gY3JlYXRlIGEgbmV3IE1ldGhvZCBQbHVnLWluOjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+TWFrZSBzdXJlIHlvdSBhcmUgaW4gdGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPllvdSBjYW4gYmVnaW4gdGhlIG1ldGhvZCBwbHVnLWluIGNyZWF0aW9uIHByb2Nlc3MgaW4gb25lIG9mIHR3bwotd2F5czo8L3NwYW4+PHVsPjxsaT5DbGljayA8c3Ryb25nPkZpbGUgJmd0OyBOZXcgJmd0OyBNZXRob2QgUGx1Zy1pbjwvc3Ryb25nPi4gT3IsPC9saT4KLTxsaT5JbiB0aGUgTGlicmFyeSB2aWV3LCByaWdodCBjbGljayBhbiBleGlzdGluZyBwbHVnLWluIGFuZCBzZWxlY3QgPHN0cm9uZz5OZXcKLU1ldGhvZCBQbHVnLWluPC9zdHJvbmc+LjwvbGk+Ci08L3VsPgotIFRoZSBOZXcgTWV0aG9kIFBsdWctaW4gd2l6YXJkIG9wZW5zLjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlR5cGUgYSBuYW1lIGZvciB5b3VyIG5ldyBwbHVnLWluIGluIHRoZSA8c3Ryb25nPk5hbWU8L3N0cm9uZz4gZmllbGQgYW5kIHRoZW4KLXNlbGVjdCBhIHBsdWdpbiBpbiB0aGUgPHN0cm9uZz5SZWZlcmVuY2VkIFBsdWctaW5zPC9zdHJvbmc+IGZpZWxkLiBUaGUgcGx1Zy1pbiB5b3UgY3JlYXRlCi1leHRlbmRzIHRoZSBwbHVnLWluIHlvdSBzZWxlY3QgZnJvbSB0aGUgbGlzdCBhbmQgYWxsb3dzIHlvdSB0byB1c2UgY29udGVudAotZnJvbSB0aGUgc2VsZWN0ZWQgcGx1Zy1pbiBhcyB5b3UgY3JlYXRlIHlvdXIgb3duIHBsdWctaW4gY29udGVudC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UHJvdmlkZSBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBwbHVnLWluIGFuZCBsaXN0IGl0cyBhdXRob3JzCi10byBoZWxwIHlvdSBhbmQgb3RoZXJzIGtlZXAgdHJhY2sgb2YgdGhlIHBsdWctaW5zIGluIHRoZSBsaWJyYXJ5LiBZb3UgY2FuCi1yZXR1cm4gdG8gZWRpdCB0aGlzIGluZm9ybWF0aW9uIGF0IGFueSB0aW1lLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3Ryb25nPkZpbmlzaDwvc3Ryb25nPi4gWW91ciBuZXcgcGx1Zy1pbiBub3cgYXBwZWFycyBpbiB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPiB3aXRoIHRoZSBvdGhlcgotTWV0aG9kIFBsdWctaW5zLjwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJtZXRob2RwbHVnaW4uaHRtbCI+TWV0aG9kIFBsdWctaW48L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kcGx1Z2luLmh0bWwjbWV0aG9kcGx1Z2luIj5NZXRob2QgUGx1Zy1pbjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCNtZXRob2Rjb250ZW50cGFja2FnZSI+TWV0aG9kIENvbnRlbnQgUGFja2FnZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhY29udGVudHBhY2thZ2UuaHRtbCNjcmVhdGVjb250ZW50cGFja2FnZSI+Q3JlYXRlIGEgQ29udGVudCBQYWNrYWdlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2R2aWV3d2l0aGN1c3RvbWNhdGVnb3JpZXMuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2R2aWV3d2l0aGN1c3RvbWNhdGVnb3JpZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBlZGE1Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kdmlld3dpdGhjdXN0b21jYXRlZ29yaWVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgYSBNZXRob2QgVmlldyB3aXRoIEN1c3RvbSBDYXRlZ29yaWVzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJwdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGVhbWV0aG9kdmlld3dpdGhjdXN0b21jYXRlZ29yaWVzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNyZWF0ZSBhIE1ldGhvZCBWaWV3IHdpdGggQ3VzdG9tIENhdGVnb3JpZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNyZWF0ZWFtZXRob2R2aWV3d2l0aGN1c3RvbWNhdGVnb3JpZXMiPjxhIG5hbWU9ImNyZWF0ZWFtZXRob2R2aWV3d2l0aGN1c3RvbWNhdGVnb3JpZXMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGUgYSBNZXRob2QgVmlldyB3aXRoIEN1c3RvbSBDYXRlZ29yaWVzPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0ic2VjdGlvbiI+Q3VzdG9tIGNhdGVnb3JpZXMgYWxsb3cgeW91IHRvIGNhdGVnb3JpemUgY29udGVudCBhY2NvcmRpbmcgdG8gYW55Ci1zY2hlbWUgeW91IHdhbnQuIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiB0aGVuIGJlIHVzZWQgdG8gY29tcG9zZSBwdWJsaXNoYWJsZQotdmlld3MsIHByb3ZpZGluZyBhIG1lYW5zIHRvIG9yZ2FuaXplIG1ldGhvZCBjb250ZW50IHByaW9yIHRvIHB1Ymxpc2hpbmcuPHA+VG8KLWNyZWF0ZSBhIG5ldyBjdXN0b20gY2F0ZWdvcnk6PC9wPgotPC9kaXY+Ci08b2w+PGxpPjxzcGFuPlN3aXRjaCB0byB0aGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPi48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5PcGVuIHRoZSA8c3Ryb25nPk1ldGhvZCBDb250ZW50PC9zdHJvbmc+IGZvbGRlciBpbiB0aGUgbWV0aG9kIHBsdWctaW4gd2hlcmUKLXlvdSB3YW50IHRvIGNyZWF0ZSB0aGUgY3VzdG9tIGNhdGVnb3J5Ljwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlJpZ2h0IGNsaWNrIHRoZSBDdXN0b20gQ2F0ZWdvcmllcyBmb2xkZXIgYW5kIHNlbGVjdCA8c3Ryb25nPk5ldyAmZ3Q7IEN1c3RvbQotQ2F0ZWdvcnk8L3N0cm9uZz4uIFRoZSBlZGl0b3Igd2luZG93IG9wZW5zLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlByb3ZpZGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1c3RvbSBjYXRlZ29yeSBpbiB0aGUKLWZpZWxkcyBhdmFpbGFibGUgdW5kZXIgdGhlIDxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz4gdGFiLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlVuZGVyIHRoZSA8c3Ryb25nPkFzc2lnbjwvc3Ryb25nPiB0YWIsIHlvdSBjYW4gc2VsZWN0IHRoZSB0aGluZ3MgeW91IHdhbnQKLXRvIGluY2x1ZGUgaW4gdGhlIGN1c3RvbSBjYXRlZ29yeS4gU2VsZWN0IGluZGl2aWR1YWwgbWV0aG9kIGVsZW1lbnRzLCBwcm9jZXNzZXMsCi1zdGFuZGFyZCBjYXRlZ29yaWVzIG9yIGN1c3RvbSBjYXRlZ29yaWVzLiBUaGUgY3VzdG9tIGNhdGVnb3J5Ci1pcyBhbHNvIGF2YWlsYWJsZSB0byBhZGQgdG8gaW5kaXZpZHVhbCBlbGVtZW50cyBvbiB0aGUgPHN0cm9uZz5DYXRlZ29yaWVzPC9zdHJvbmc+IHRhYgotaW4gdGhlIGFwcHJvcHJpYXRlIGVkaXRvci48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5PbmNlIHlvdSBhc3NpZ24gY29udGVudCB0byB0aGUgY3VzdG9tIGNhdGVnb3J5LCB5b3UgY2FuIG1vZGlmeQotdGhlIHNlcXVlbmNlIG9mIHRoZSBpdGVtcyBpbiB0aGUgY2F0ZWdvcnkuIFRoaXMgYWZmZWN0cyB0aGUgc2VxdWVuY2Ugb2YgdGhlCi1pdGVtcyBpbiB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPiBhbmQgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPiwgYXMKLXdlbGwgYXMgaW4gYSBwdWJsaXNoZWQgV2ViIHNpdGUgaWYgdGhlIGN1c3RvbSBjYXRlZ29yeSBpcyBpbmNsdWRlZCBhcyBhIHZpZXcKLWluIGEgY29uZmlndXJhdGlvbi48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5UbyBzYXZlIHlvdXIgbmV3IGN1c3RvbSBjYXRlZ29yeSwgY2xpY2sgPHN0cm9uZz5GaWxlICZndDsgU2F2ZTwvc3Ryb25nPiBvciBjbG9zZQotdGhlIGVkaXRvciBhbmQgY2xpY2sgPHN0cm9uZz5ZZXM8L3N0cm9uZz4gd2hlbiBwcm9tcHRlZCB0byBzYXZlIHRoZSBjaGFuZ2VzLjwvc3Bhbj48L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPllvdSBjYW4gbm93IHVzZSB0aGUgY3VzdG9tIGNhdGVnb3J5IGFzIGEgdmlldyBpbiBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLjxvbD48bGk+U3dpdGNoIHRvIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+LjwvbGk+Ci08bGk+SW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4sCi1kb3VibGUgY2xpY2sgdGhlIGNvbmZpZ3VyYXRpb24gdG8gd2hpY2ggeW91IHdhbnQgdG8gYWRkIGEgdmlldy4gVGhlIGNvbmZpZ3VyYXRpb24KLWVkaXRvciBvcGVucy48L2xpPgotPGxpPkNsaWNrIHRoZSA8c3Ryb25nPlZpZXdzPC9zdHJvbmc+IHRhYiBhbmQgdGhlbiBjbGljayB0aGUgPHN0cm9uZz5BZGQgVmlldzwvc3Ryb25nPiBidXR0b24uCi1UaGUgU2VsZWN0IENhdGVnb3JpZXMgZGlhbG9nIGFwcGVhcnMuIFRoZSBTZWxlY3QgQ2F0ZWdvcmllcyBkaWFsb2cgZGlzcGxheXMKLWFsbCB0aGUgc3RhbmRhcmQgYW5kIGN1c3RvbSBjYXRlZ29yaWVzIGluIHRoZSBjb25maWd1cmF0aW9uLjwvbGk+Ci08bGk+U2VsZWN0IG9uZSBvciBtb3JlIGNhdGVnb3JpZXMgdG8gaW5jbHVkZSBhcyBhIHZpZXcgaW4geW91ciBjb25maWd1cmF0aW9uCi1hbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBUaGUgdmlldyBkaXNwbGF5IHByb3ZpZGVzIGEgcHJldmlldyBvZiBob3cgdGhlIHZpZXcKLXdpbGwgYXBwZWFyIG4gdGhlIHB1Ymxpc2hlZCB0cmVlIGJyb3dzZXIuPC9saT4KLTxsaT5TZWxlY3QgYSB2aWV3IHRvIGRpc3BsYXkgYXMgdGhlIGRlZmF1bHQgc3RhcnQtdXAgdmlldyBpbiB0aGUgcHVibGlzaGVkCi1XZWIgc2l0ZSwgYW5kIHRoZW4gY2xpY2sgdGhlIDxzdHJvbmc+TWFrZSBEZWZhdWx0PC9zdHJvbmc+IGJ1dHRvbi48L2xpPgotPGxpPlRvIHNhdmUgdGhlIGNvbmZpZ3VyYXRpb24sIGNsaWNrIDxzdHJvbmc+RmlsZSAmZ3Q7IFNhdmU8L3N0cm9uZz4gb3IgY2xvc2UgdGhlIGNvbmZpZ3VyYXRpb24KLWVkaXRvciBhbmQgY2xpY2sgPHN0cm9uZz5ZZXM8L3N0cm9uZz4gd2hlbiBwcm9tcHRlZCB0byBzYXZlIHRoZSBjaGFuZ2VzLjwvbGk+Ci08L29sPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIj5NZXRob2QgQ29udGVudCBDYXRlZ29yaWVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJwdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbCI+UHVibGlzaGluZyBPdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybi5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM5ZDM2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0ZSBhIFJldXNhYmxlIENhcGFiaWxpdHkgUGF0dGVybiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icHJvY2Vzcy5odG1sI3Byb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InByb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sI3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2NyZWF0ZWFkZWxpdmVyeXByb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q3JlYXRlIGEgUmV1c2FibGUgQ2FwYWJpbGl0eSBQYXR0ZXJuPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybiI+PGEgbmFtZT0iY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4iPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGUgYSBSZXVzYWJsZSBDYXBhYmlsaXR5IFBhdHRlcm48L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj48cD5BIENhcGFiaWxpdHkgcGF0dGVybiBpcyBhIHNwZWNpYWwgcHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlCi1jbHVzdGVyIG9mIGFjdGl2aXRpZXMgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudAotZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiBDYXBhYmlsaXR5IHBhdHRlcm5zIGNhbiBiZSB1c2VkIGFzCi1idWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgZGVsaXZlcnkgcHJvY2Vzc2VzIG9yIGxhcmdlciBjYXBhYmlsaXR5IHBhdHRlcm5zLiA8L3A+Ci1CZWZvcmUKLWNyZWF0aW5nIGEgY2FwYWJpbGl0eSBwYXR0ZXJuOjx1bD48bGk+U2VsZWN0IGEgbWV0aG9kIHBsdWctaW4gdG8gaG9sZCB5b3VyIHByb2Nlc3MuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0ibWV0aG9kcGx1Z2luLmh0bWwjbWV0aG9kcGx1Z2luIj5NZXRob2QgUGx1Zy1pbjwvYT4uPC9saT4KLTxsaT5GaW5kIG9yIGNyZWF0ZSBhIHByb2Nlc3MgcGFja2FnZS48L2xpPgotPC91bD4KLTwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+QSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24KLW9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuIEluIG90aGVyIHdvcmRzLCBhIGNhcGFiaWxpdHkKLXBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHNvIHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhCi1kZWxpdmVyeSBwcm9jZXNzLiBUaGlzIGVuYWJsZXMgdGhlIHBhdHRlcm4ncyBhY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkCi10byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBkZWxpdmVyeSBwcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nCi1hcHBsaWVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjYXBhYmlsaXR5cGF0dGVybiI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9hPi48ZGl2IGNsYXNzPSJwIj5Zb3UgZG8gbm90IG5lZWQgdG8gZGV2ZWxvcCB5b3VyIHByb2Nlc3MgZnJvbSBzY3JhdGNoOwoteW91IGNhbiByZXVzZSBleGlzdGluZyBjYXBhYmlsaXR5IHBhdHRlcm5zIG9yIGV2ZW4gY2FwYWJpbGl0eSBwYXR0ZXJuIHBhcnRzLgotVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBwb3B1bGF0ZSBhIHByb2Nlc3Mgd2l0aCBtZXRob2QgZWxlbWVudHM6PHVsPjxsaT5CeSBpbmNvcnBvcmF0aW5nIGluZGl2aWR1YWwgbWV0aG9kIGVsZW1lbnRzIGJ5IGRyYWdnaW5nIHRoZSBlbGVtZW50cyBvbnRvCi1hbiBhY3Rpdml0eSBpbiB0aGUgcHJvY2Vzcy48L2xpPgotPGxpPkJ5IGluY2x1ZGluZyBhbHJlYWR5IGRlZmluZWQgY2FwYWJpbGl0eSBwYXR0ZXJucy48L2xpPgotPGxpPkJ5IGluY2x1ZGluZyBwYXJ0cyBvZiBhbHJlYWR5IGRlZmluZWQgY2FwYWJpbGl0eSBwYXR0ZXJucy48L2xpPgotPGxpPkJ5IGNyZWF0aW5nIGRlc2NyaXB0b3JzIGRpcmVjdGx5IGluIHRoZSBwcm9jZXNzLCB3aGljaCBhcmUgZWl0aGVyIHVucmVsYXRlZAotdG8gYW55IG1ldGhvZCBjb250ZW50IG9yIHJlbGF0ZWQgdG8gbWV0aG9kIGNvbnRlbnQgYXQgYSBsYXRlciBwb2ludCBpbiB0aW1lLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08cD4gVG8gY3JlYXRlIGEgY2FwYWJpbGl0eSBwYXR0ZXJuOjwvcD4KLTwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T25jZSB5b3UgaGF2ZSBzZWxlY3RlZCBvciBjcmVhdGVkIGEgcHJvY2VzcyBwYWNrYWdlLCByaWdodCBjbGljawotdGhlIDxzdHJvbmc+UHJvY2VzcyBQYWNrYWdlPC9zdHJvbmc+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3Ryb25nPk5ldyDigJMmZ3Q7IENhcGFiaWxpdHkgUGF0dGVybjwvc3Ryb25nPi4gVGhlIE5ldyBQcm9jZXNzIENvbXBvbmVudAotZGlhbG9nIGJveCBhcHBlYXJzLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGEgbmFtZSBmb3IgdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBpbnRvIHRoZSA8c3Ryb25nPk5hbWU8L3N0cm9uZz4gZmllbGQKLWFuZCB0aGVuIHNlbGVjdCBhIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBkcm9wIGRvd24gbGlzdC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVGhlIHByb2Nlc3MgaXMgY3JlYXRlZCBhbmQgdGhlIHByb2Nlc3MgZWRpdG9yCi1pcyBvcGVuZWQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBwcm9jZXNzIGVkaXRvciwgdW5kZXIgdGhlIERlc2NyaXB0aW9uIHRhYiwgZG9jdW1lbnQgeW91cgotcHJvY2VzcyB1c2luZyB0aGUgYXZhaWxhYmxlIHRleHQgZmllbGRzLjwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFlvdSBjYW4gdXNlIHRoZQotUmljaCBUZXh0IEVkaXRvciB0byBlZGl0IG9yIGVudGVyIHRoZSB0ZXh0IGZvciBhbnkgZmllbGQgdGhhdCBoYXMgYSB0d2lzdHkKLXN5bWJvbCA8aW1nIHNyYz0idHdpc3R5IHN5bWJvbDEuSlBHIiBhbHQ9IiIgLz4uIFNpbXBseSBjbGljawotdGhlIHN5bWJvbCB0byBhY2Nlc3MgdGhlIFJpY2ggVGV4dCBFZGl0b3IuIENsaWNrIHRoZSBzeW1ib2wgYWdhaW4gdG8gY2xvc2UKLXRoZSBSaWNoIFRleHQgRWRpdG9yLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0icmljaHRleHRlZGl0b3IuaHRtbCNyaWNodGV4dGVkaXRvciI+UmljaCBUZXh0IEVkaXRvcjwvYT48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkRlY2lkZSBvbiB5b3VyIHByaW1hcnkgcHJvY2VzcyBhdXRob3Jpbmcgdmlldy4gWW91IGRldmVsb3AgYSBwcm9jZXNzCi11c2luZyB0aHJlZSBkaWZmZXJlbnQgdmlld3M6IDwvc3Bhbj48dWw+PGxpPjxzdHJvbmc+V29yayBCcmVha2Rvd24gU3RydWN0dXJlPC9zdHJvbmc+OiBEZWZpbmUgYSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUKLWluIHlvdXIgcHJvY2Vzcy4gQ3JlYXRlIGl0ZXJhdGlvbnMgYW5kIGFjdGl2aXRpZXMgZmlyc3QsIGFuZCB0aGVuIHBvcHVsYXRlCi15b3VyIGFjdGl2aXRpZXMgYnkgYXBwbHlpbmcgdGFza3MgZnJvbSB5b3VyIG1ldGhvZCBjb250ZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbgotc2VlIDxhIGhyZWY9ImRldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZSI+RGV2ZWxvcCBhIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZTwvYT4uPC9saT4KLTxsaT48c3Ryb25nPlRlYW0gQWxsb2NhdGlvbjwvc3Ryb25nPjogRGVmaW5lIHdoaWNoIHRlYW1zIGFuZCByb2xlcyBzaGFsbCBwYXJ0aWNpcGF0ZQotaW4gYWN0aXZpdGllcyBhbmQgdGhlbiBmaW5kIHJlc3BvbnNpYmxlIHdvcmsgcHJvZHVjdHMgYW5kIHRhc2tzIGZyb20gdGhlcmUuCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9ImRldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUuaHRtbCI+RGV2ZWxvcCBhIFRlYW0gQWxsb2NhdGlvbiBTdHJ1Y3R1cmU8L2E+LjwvbGk+Ci08bGk+PHN0cm9uZz5Xb3JrIFByb2R1Y3QgVXNhZ2U8L3N0cm9uZz46IERlZmluZSB3aGljaCB3b3JrIHByb2R1Y3RzIHNob3VsZCBiZSBjcmVhdGVkCi1pbiBhY3Rpdml0aWVzIGFuZCBmaW5kIHRhc2tzIGFuZCByb2xlcyBmcm9tIHRoZXJlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0iZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlIj5EZXZlbG9wIGEgV29yayBQcm9kdWN0IFVzYWdlIFN0cnVjdHVyZTwvYT4uPC9saT4KLTwvdWw+Ci0gPHA+T25jZSB5b3UgaGF2ZSBjcmVhdGVkIHlvdXIgY2FwYWJpbGl0eSBwYXR0ZXJuLCB5b3UgbmVlZCB0byBhcHBseQotaXQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIDxhIGhyZWY9ImFwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4iPkFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuPC9hPi48L3A+Ci08L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj4KLTx1bCBjbGFzcz0idWxsaW5rcyI+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9ImNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwiPkNhcGFiaWxpdHkgUGF0dGVybjwvYT48L3N0cm9uZz48YnIgLz4KLTwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJwcm9jZXNzLmh0bWwjcHJvY2VzcyI+UHJvY2VzczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0icHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwjcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Ij5Qcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwjY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyI+Q3JlYXRlIGEgRGVsaXZlcnkgUHJvY2VzczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhcm9sZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXJvbGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVhNjkwMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhcm9sZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0ZSBhIFJvbGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF0YXNrLmh0bWwjY3JlYXRlYXRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sI2NyZWF0ZWF3b3JrcHJvZHVjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlZ3VpZGFuY2UuaHRtbCNjcmVhdGVndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNyZWF0ZWFyb2xlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNyZWF0ZSBhIFJvbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNyZWF0ZWFyb2xlIj48YSBuYW1lPSJjcmVhdGVhcm9sZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0ZSBhIFJvbGU8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj48cD5BIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5Sb2xlPC9zcGFuPiBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsCi1hbmQgcmVzcG9uc2liaWxpdGllcyBvZiBhbiBpbmRpdmlkdWFsIG9yIGluZGl2aWR1YWxzLjwvcD4KLVlvdSBzaG91bGQgYWx3YXlzCi1jcmVhdGUgbmV3IG1ldGhvZCBjb250ZW50IGluIGEgPGEgaHJlZj0ibWV0aG9kcGx1Z2luLmh0bWwjbWV0aG9kcGx1Z2luIj5NZXRob2QgUGx1Zy1pbjwvYT4gdGhhdCB5b3UgcHJvZHVjZS48L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIGNyZWF0ZSBhIHJvbGU6PC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5FeHBhbmQgdGhlIGNvbnRlbnQgcGFja2FnZSBpbiB3aGljaCB5b3Ugd2FudCB0byBjcmVhdGUgdGhlIHJvbGUuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0IGNsaWNrIDxzdHJvbmc+Um9sZXM8L3N0cm9uZz4sIGFuZCB0aGVuIHNlbGVjdCA8c3Ryb25nPk5ldyAmZ3Q7IFJvbGU8L3N0cm9uZz4uIFRoZQotcm9sZSBlZGl0b3IgYXBwZWFycyB3aXRoIHRoZSBEZXNjcmlwdGlvbiB0YWIgc2V0IGFzIHRoZSBkZWZhdWx0Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgTmFtZSBmaWVsZCwgdHlwZSBhIHVuaXF1ZSBuYW1lIGZvciB5b3VyIHJvbGUuIFRoZSByb2xlIG5hbWUKLWlzIHRoZSBmaWxlIG5hbWUgdGhhdCBhcHBlYXJzIGluIHRoZSBMaWJyYXJ5IHZpZXcuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcmVzZW50YXRpb24gbmFtZSBmaWVsZCwgdHlwZSBhIHByZXNlbnRhdGlvbiBuYW1lLiBUaGUgcHJlc2VudGF0aW9uCi1uYW1lIGlzIHRoZSBuYW1lIHRoYXQgYXBwZWFycyBpbiB5b3VyIHB1Ymxpc2hlZCBjb250ZW50IGFuZCBpbiB0aGUgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPi4gWW91IGNhbiBhbHNvIG1ha2UgdGhpcyBuYW1lIGFwcGVhciBpbiB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPiBieSB0b2dnbGluZyB0aGUgPHN0cm9uZz5TaG93IFByZXNlbnRhdGlvbiBOYW1lczwvc3Ryb25nPiBidXR0b24KLWluIHRoZSBMaWJyYXJ5IFZpZXcgdG9vbGJhci48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIEJyaWVmIERlc2NyaXB0aW9uIGZpZWxkLCB0eXBlIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlCi1uZXcgUm9sZS4gPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlR5cGUgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBuZXcgUm9sZSBpbiB0aGUgTWFpbiBEZXNjcmlwdGlvbgotZmllbGQuIFRoZSBtYWluIGRlc2NyaXB0aW9uIGlzIGEgbW9yZSBkZXRhaWxlZCB2ZXJzaW9uIG9mIHRoZSBkZXNjcmlwdGlvbgoteW91IHR5cGVkIGludG8gdGhlIEJyaWVmIERlc2NyaXB0aW9uIGZpZWxkLiBUaGVyZSBhcmUgdGhyZWUgd2F5cyB5b3UgY2FuIGNyZWF0ZQotdGV4dCBmb3IgdGhlIGRlc2NyaXB0aW9uOjwvc3Bhbj4gPHVsPjxsaT5EaXJlY3RseSwgYnkgdHlwaW5nIGl0IG1hbnVhbGx5IGluIHRoZSBlZGl0b3IuPC9saT4KLTxsaT5Db3B5IGZyb20gYW5vdGhlciBzaW1pbGFyIHJvbGUgYW5kIHRoZW4gbW9kaWZ5IGJ5IHVzaW5nIHRoZSBlZGl0b3IuPC9saT4KLTxsaT5Db3B5IGZyb20gYW4gSFRNTCBzb3VyY2Ugc3VjaCBhcyBhIHB1Ymxpc2hlZCBPcGVuVVAvQmFzaWMgV2ViIHNpdGUuPC9saT4KLTwvdWw+Ci08ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gWW91IGNhbiB1c2UgdGhlIFJpY2ggVGV4dCBFZGl0b3IgdG8gZWRpdCBvciBlbnRlciB0aGUgdGV4dCBmb3IKLWFueSBmaWVsZCB0aGF0IGhhcyBhIHR3aXN0eSBzeW1ib2wgPGltZyBzcmM9ImNvbGxhcHNlZC5naWYiIGFsdD0iIiAvPi4gU2ltcGx5IGNsaWNrIHRoZSBzeW1ib2wgdG8gYWNjZXNzIHRoZSBSaWNoIFRleHQgRWRpdG9yLiBDbGljayB0aGUKLXN5bWJvbCBhZ2FpbiB0byBjbG9zZSB0aGUgUmljaCBUZXh0IEVkaXRvci4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9InJpY2h0ZXh0ZWRpdG9yLmh0bWwjcmljaHRleHRlZGl0b3IiPlJpY2ggVGV4dCBFZGl0b3I8L2E+LjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VW5kZXIgVmVyc2lvbiBJbmZvcm1hdGlvbiwgcHJvdmlkZSBhbnkgcGVydGluZW50IHZlcnNpb24gaW5mb3JtYXRpb24KLWFib3V0IHRoZSByb2xlLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5Xb3JrIFByb2R1Y3RzPC9zdHJvbmc+IHRhYiBhbmQgdGhlbiBjbGljayB0aGUgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uCi10byB0aGUgcmlnaHQgb2YgdGhlICJSb2xlIGlzIHJlc3BvbnNpYmxlIGZvcjoiIGZpZWxkLiBUaGUgU2VsZWN0IERpYWxvZyBmb3IKLVdvcmsgUHJvZHVjdHMgZGlhbG9nIG9wZW5zLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3Qgb25lIG9yIG1vcmUgd29yayBwcm9kdWN0cyBmcm9tIHRoZSBsaXN0LiBBIGRlc2NyaXB0aW9uIG9mCi10aGUgd29yayBwcm9kdWN0IHlvdSBzZWxlY3QgYXBwZWFycyBpbiB0aGUgQnJpZWYgRGVzY3JpcHRpb24gZmllbGQgYXQgdGhlCi1ib3R0b20gb2YgdGhlIGRpYWxvZyBib3guPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gVGhlIGxpc3Qgb2Ygd29yayBwcm9kdWN0cyBpbiB0aGUKLSJXb3JrIHByb2R1Y3RzIHRoYXQgYXJlIG91dHB1dCBvZiB0YXNrcyB0aGF0IHRoaXMgcm9sZSBwZXJmb3JtcyIgZmllbGQgaXMKLWNhbGN1bGF0ZWQgYW5kIGNhbm5vdCBiZSBjaGFuZ2VkIHdpdGggdGhlIHJvbGUgZWRpdG9yLiBBIHdvcmsgcHJvZHVjdCBhcHBlYXJzCi1oZXJlIGlmIGl0IGlzIGFuIG91dHB1dCBvZiBhIHRhc2sgdGhhdCB0aGUgcm9sZSBwZXJmb3Jtcy48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRoZSBkaWFsb2cgYm94IGNsb3NlcyBhbmQgdGhlICJSb2xlIGlzIHJlc3BvbnNpYmxlCi1mb3I6IiBmaWVsZCBpcyBwb3B1bGF0ZWQuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gU2VsZWN0ZWQgZWxlbWVudHMgaW4gYW4gQWRkL1JlbW92ZQotc2VjdGlvbiBkaXNwbGF5IGJvdGggdGhlIGVsZW1lbnQgbmFtZSAocGx1Zy1pbiBuYW1lKSBhbmQgdGhlICJwYXRoIiAocGFja2FnZQotbmFtZSkgdG8gdGhhdCBlbGVtZW50LjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+R3VpZGFuY2U8L3N0cm9uZz4gdGFiLiBUaGlzIHBhcnQgb2YgdGhlIGVkaXRvciBhbGxvd3MgeW91Ci10byBhZGQgYW5kIHJlbW92ZSBndWlkYW5jZSBmb3IgdGhlIHJvbGUuIFRvIGFkZCBndWlkYW5jZSwgY2xpY2sgdGhlIDxzdHJvbmc+QWRkPC9zdHJvbmc+IGJ1dHRvbiwKLXNlbGVjdCB0aGUgZ3VpZGFuY2UgeW91IHdhbnQgdG8gYWRkLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBUbyByZW1vdmUgZ3VpZGFuY2UsCi1zZWxlY3QgaXQgaW4gdGhlIEd1aWRhbmNlIGZpZWxkIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+UmVtb3ZlPC9zdHJvbmc+LiBXaGVuIHlvdSBzZWxlY3QKLWEgZ3VpZGFuY2UgZWxlbWVudCwgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBndWlkYW5jZSBpcyBkaXNwbGF5ZWQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3Ryb25nPkNhdGVnb3JpZXM8L3N0cm9uZz4gdGFiLiBBIHJvbGUgY2FuIGJlIGluY2x1ZGVkIGluIG9uZQotb3IgbW9yZSByb2xlc2V0cyBhbmQgYW55IG51bWJlciBvZiBjdXN0b20gY2F0ZWdvcmllcy4gT3BlbiB0aGUgYXBwcm9wcmlhdGUKLVNlbGVjdCBkaWFsb2cgYnkgY2xpY2tpbmcgdGhlIDxzdHJvbmc+QWRkPC9zdHJvbmc+IGJ1dHRvbiBuZXh0IHRvIHRoZSBjYXRlZ29yeSBsaXN0cy4KLVlvdSBjYW4gcmVtb3ZlIGEgcm9sZSBmcm9tIGEgY2F0ZWdvcnkgYnkgc2VsZWN0aW5nIGl0IGFuZCB0aGVuIGNsaWNraW5nIHRoZSA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPiBidXR0b24uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3Ryb25nPlByZXZpZXc8L3N0cm9uZz4gdGFiIHRvIHZpZXcgdGhlIG5ld2x5IGNyZWF0ZWQKLXJvbGUgYW5kIHRoZW4gc2F2ZSBieSBjbG9zaW5nIHRoZSB0YWIuPC9zcGFuPjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCI+Q3JlYXRlIE1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxpbmtsaXN0Ij4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+TWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF0YXNrLmh0bWwjY3JlYXRlYXRhc2siPkNyZWF0ZSBhIFRhc2s8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sI2NyZWF0ZWF3b3JrcHJvZHVjdCI+Q3JlYXRlIGEgV29yayBQcm9kdWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVndWlkYW5jZS5odG1sI2NyZWF0ZWd1aWRhbmNlIj5DcmVhdGUgR3VpZGFuY2U8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIHRpdGxlPSJWYXJpYWJpbGl0eSBhbGxvd3MgZWxlbWVudHMgaW4gb25lIGNvbnRlbnQgcGFja2FnZSB0byBpbmZsdWVuY2Ugb3IgbW9kaWZ5IGVsZW1lbnRzIGluIG90aGVyIGNvbnRlbnQgcGFja2FnZXMgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQuIFZhcmlhYmlsaXR5IGVuYWJsZXMgY2hhbmdlcyB0byB0aGUgY29udGVudCB3aGlsZSBrZWVwaW5nIHRoZSBjaGFuZ2VzIHNlcGFyYXRlIGFuZCBvcHRpb25hbC4iPlZhcmlhYmlsaXR5PC9hPjwvZGl2PjwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhdGFzay5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXRhc2suaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyZTIwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhdGFzay5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0ZSBhIFRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFyb2xlLmh0bWwjY3JlYXRlYXJvbGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sI2NyZWF0ZWF3b3JrcHJvZHVjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlZ3VpZGFuY2UuaHRtbCNjcmVhdGVndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNyZWF0ZWF0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNyZWF0ZSBhIFRhc2s8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNyZWF0ZWF0YXNrIj48YSBuYW1lPSJjcmVhdGVhdGFzayI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0ZSBhIFRhc2s8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj48cD5BIHRhc2sgaXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuIEV2ZXJ5IHRhc2sgaXMgYXNzaWduZWQgdG8KLWEgc3BlY2lmaWMgcm9sZS4gVGhlIGdyYW51bGFyaXR5IG9mIGEgdGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcKLWRheXMgYW5kIHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIHVtYmVyIG9mIHdvcmsgcHJvZHVjdHMuPC9wPgotWW91Ci1zaG91bGQgYWx3YXlzIGNyZWF0ZSBuZXcgbWV0aG9kIGNvbnRlbnQgaW4gYSA8YSBocmVmPSJtZXRob2RwbHVnaW4uaHRtbCNtZXRob2RwbHVnaW4iPk1ldGhvZCBQbHVnLWluPC9hPiB0aGF0IHlvdSBwcm9kdWNlLiA8L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIGNyZWF0ZSBhIHRhc2s6PC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5FeHBhbmQgdGhlIGNvbnRlbnQgcGFja2FnZSBpbiB3aGljaCB5b3Ugd2FudCB0byBjcmVhdGUgdGhlIHRhc2suPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0IGNsaWNrIDxzdHJvbmc+VGFza3M8L3N0cm9uZz4sIGFuZCB0aGVuIHNlbGVjdCA8c3Ryb25nPk5ldyAmZ3Q7IFRhc2s8L3N0cm9uZz4uIFRoZQotdGFzayBlZGl0b3IgYXBwZWFycyB3aXRoIHRoZSA8c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+IHRhYiBzZXQgYXMgdGhlIGRlZmF1bHQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBOYW1lIGZpZWxkLCB0eXBlIGEgdW5pcXVlIG5hbWUgZm9yIHlvdXIgdGFzay4gdGhlIHRhc2sgbmFtZQotaXMgdGhlIGZpbGUgbmFtZSB0aGF0IGFwcGVhcnMgaW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcmVzZW50YXRpb24gbmFtZSBmaWVsZCwgdHlwZSBhIHByZXNlbnRhdGlvbiBuYW1lLiBUaGUgcHJlc2VudGF0aW9uCi1uYW1lIGlzIHRoZSBuYW1lIHRoYXQgYXBwZWFycyBpbiB5b3VyIHB1Ymxpc2hlZCBjb250ZW50IGFuZCBpbiB0aGUgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPi4KLVlvdSBjYW4gYWxzbyBtYWtlIHRoaXMgbmFtZSBhcHBlYXIgaW4gdGhlIExpYnJhcnkgdmlldyBieSB0b2dnbGluZyB0aGUgPHN0cm9uZz5TaG93Ci1QcmVzZW50YXRpb24gTmFtZXM8L3N0cm9uZz4gYnV0dG9uIGluIHRoZSBMaWJyYXJ5IHZpZXcgdG9vbGJhci48L3NwYW4+IDwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBCcmllZiBEZXNjcmlwdGlvbiBmaWVsZCwgdHlwZSBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZQotbmV3IHRhc2suPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlR5cGUgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBuZXcgdGFzayBpbiB0aGUgTWFpbiBEZXNjcmlwdGlvbgotZmllbGQuIFRoZSBtYWluIGRlc2NyaXB0aW9uIGlzIGEgbW9yZSBkZXRhaWxlZCB2ZXJzaW9uIG9mIHRoZSBkZXNjcmlwdGlvbgoteW91IHR5cGVkIGludG8gdGhlIEJyaWVmIERlc2NyaXB0aW9uIGZpZWxkLiBUaGVyZSBhcmUgdGhyZWUgd2F5cyB5b3UgY2FuIGNyZWF0ZQotdGV4dCBmb3IgdGhlIGRlc2NyaXB0aW9uOjwvc3Bhbj4gPHVsPjxsaT5EaXJlY3RseSwgYnkgdHlwaW5nIGl0IG1hbnVhbGx5IGluIHRoZSBlZGl0b3IuPC9saT4KLTxsaT5Db3B5IGZyb20gYW5vdGhlciBzaW1pbGFyIHJvbGUgYW5kIHRoZW4gbW9kaWZ5IGJ5IHVzaW5nIHRoZSBlZGl0b3IuPC9saT4KLTxsaT5Db3B5IGZyb20gYW4gSFRNTCBzb3VyY2Ugc3VjaCBhcyBhIHB1Ymxpc2hlZCBPcGVuVVAvQmFzaWMgV2ViIHNpdGUuPC9saT4KLTwvdWw+Ci08ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gWW91IGNhbiB1c2UgdGhlIFJpY2ggVGV4dCBFZGl0b3IgdG8gZWRpdCBvciBlbnRlciB0aGUgdGV4dCBmb3IKLWFueSBmaWVsZCB0aGF0IGhhcyBhIHR3aXN0eSBzeW1ib2wgPGltZyBzcmM9ImNvbGxhcHNlZC5naWYiIGFsdD0iIiAvPi4gU2ltcGx5IGNsaWNrIHRoZSBzeW1ib2wgdG8gYWNjZXNzIHRoZSBSaWNoIFRleHQgRWRpdG9yLiBDbGljayB0aGUKLXN5bWJvbCBhZ2FpbiB0byBjbG9zZSB0aGUgUmljaCBUZXh0IEVkaXRvci4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9InJpY2h0ZXh0ZWRpdG9yLmh0bWwjcmljaHRleHRlZGl0b3IiPlJpY2ggVGV4dCBFZGl0b3I8L2E+LjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q29tcGxldGUgdGhlIG90aGVyIHRhc2sgc3BlY2lmaWMgZmllbGRzIGluIERldGFpbCBJbmZvcm1hdGlvbiBhcwotbmVlZGVkLiBTZWUgPGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSI+VmFyaWFiaWxpdHk8L2E+IGZvcgotaW5mb3JtYXRpb24gb24gY3JlYXRpbmcgdmFyaWFiaWxpdHkuIDwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5TdGVwczwvc3Ryb25nPiB0YWIuIFRoZSBTdGVwcyBFZGl0b3IgYXBwZWFycy48L3NwYW4+IDxkaXYgY2xhc3M9InAiPkEKLXRhc2sgY2FuIGhhdmUgYSBzZXJpZXMgb2Ygc3RlcHMgdGhhdCBkZXRhaWwgaG93IHRvIHBlcmZvcm0gdGhhdCB0YXNrLiBUaGUKLVN0ZXAgRWRpdG9yIGFsbG93cyB5b3UgdG86PHVsPjxsaT5DcmVhdGUgYSBuZXcgc3RlcDx1bD48bGk+Q2xpY2sgdGhlIDxzdHJvbmc+TmV3PC9zdHJvbmc+IGJ1dHRvbi48L2xpPgotPGxpPkdpdmUgdGhlIFRhc2sgYSBuYW1lIGluIHRoZSA8c3Ryb25nPk5hbWU8L3N0cm9uZz4gZmllbGQuPC9saT4KLTxsaT5EZXNjcmliZSB0aGUgVGFzayBpbiB0aGUgPHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPiBmaWVsZC48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+UmVtb3ZlIGEgc3RlcDx1bD48bGk+U2VsZWN0IHRoZSBzdGVwIHRvIHJlbW92ZSBpbiB0aGUgPHN0cm9uZz5TdGVwczwvc3Ryb25nPiBmaWVsZC48L2xpPgotPGxpPkNsaWNrIHRoZSA8c3Ryb25nPkRlbGV0ZTwvc3Ryb25nPiBidXR0b24uPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPk1vdmUgYSBzdGVwIHVwIHRoZSBsaXN0PHVsPjxsaT5TZWxlY3QgdGhlIHN0ZXAgeW91IHdhbnQgdG8gbW92ZSB1cC48L2xpPgotPGxpPkNsaWNrIHRoZSA8c3Ryb25nPk1vdmUgVXA8L3N0cm9uZz4gYnV0dG9uLjwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5Nb3ZlIGEgc3RlcCBkb3duIHRoZSBsaXN0PHVsPjxsaT5TZWxlY3QgdGhlIHN0ZXAgeW91IHdhbnQgdG8gbW92ZSBkb3duLjwvbGk+Ci08bGk+Q2xpY2sgdGhlIDxzdHJvbmc+TW92ZSBEb3duPC9zdHJvbmc+IGJ1dHRvbjwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3Ryb25nPlJvbGVzPC9zdHJvbmc+IHRhYi4gVGhpcyBwYXJ0IG9mIHRoZSBlZGl0b3IgYWxsb3dzIHlvdQotdG8gZGVmaW5lIHRoZSByb2xlcyB0aGF0IHBlcmZvcm0gdGhlIHRhc2suIFlvdSBzaG91bGQgc2VsZWN0IGEgcm9sZSBhcyB0aGUKLVBlcmZvcm1pbmcgUm9sZSBmb3IgdGhpcyB0YXNrLiBZb3UgY2FuIGFsc28gYWRkIG9uZSBvciBtb3JlIHJvbGVzIGFzIEFkZGl0aW9uYWwKLVBlcmZvcm1lcnMuIFRvIGFkZCBhIHJvbGUsIGNsaWNrIHRoZSA8c3Ryb25nPlNlbGVjdDwvc3Ryb25nPiBvciA8c3Ryb25nPkFkZDwvc3Ryb25nPiBidXR0b24gYXMKLWFwcHJvcHJpYXRlLCBzZWxlY3QgdGhlIHJvbGUgeW91IHdhbnQgdG8gYWRkLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBUbwotcmVtb3ZlIGEgcm9sZSwgc2VsZWN0IGl0IGluIHRoZSBHdWlkYW5jZSBib3gsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+Q2xlYXI8L3N0cm9uZz4gb3IgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4gYXMKLWFwcHJvcHJpYXRlLiBXaGVuIHlvdSBzZWxlY3QgYSByb2xlIHRoZSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGF0IHJvbGUgaXMKLWRpc3BsYXllZC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+V29yayBQcm9kdWN0czwvc3Ryb25nPiB0YWIuIFRoaXMgcGFydCBvZiB0aGUgZWRpdG9yIGFsbG93cwoteW91IHRvIGRlZmluZSB0aGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIHRoaXMgdGFzay4KLVlvdSBjYW4gc2VsZWN0IGFueSBudW1iZXIgb2Ygd29yayBwcm9kdWN0cyBhcyBNYW5kYXRvcnkgSW5wdXRzLCBPcHRpb25hbCBJbnB1dHMsCi1hbmQgT3V0cHV0cy4gVG8gYWRkIGEgd29yayBwcm9kdWN0LCBjbGljayB0aGUgYXBwcm9wcmlhdGUgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uLAotc2VsZWN0IHRoZSB3b3JrIHByb2R1Y3RzIHlvdSB3YW50IHRvIGFkZCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVG8gcmVtb3ZlCi1hIHdvcmsgcHJvZHVjdCwgc2VsZWN0IGl0IGluIHRoZSBhcHByb3ByaWF0ZSBib3ggYW5kIHRoZW4gY2xpY2sgdGhlIGNvcnJlc3BvbmRpbmcgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4gYnV0dG9uLgotV2hlbiB5b3Ugc2VsZWN0IGEgd29yayBwcm9kdWN0IHRoZSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgd29yayBwcm9kdWN0IGlzCi1kaXNwbGF5ZWQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3Ryb25nPkd1aWRhbmNlPC9zdHJvbmc+IHRhYi4gVGhpcyBwYXJ0IG9mIHRoZSBlZGl0b3IgYWxsb3dzIHlvdQotdG8gYWRkIGFuZCByZW1vdmUgZ3VpZGFuY2UgZm9yIHRoZSB0YXNrLiBUbyBhZGQgZ3VpZGFuY2UsIGNsaWNrIHRoZSA8c3Ryb25nPkFkZDwvc3Ryb25nPiBidXR0b24sCi1zZWxlY3QgdGhlIGd1aWRhbmNlIHlvdSB3YW50IHRvIGFkZCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVG8gcmVtb3ZlIGd1aWRhbmNlLAotc2VsZWN0IGl0IGluIHRoZSBHdWlkYW5jZSBib3ggYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4uIFdoZW4geW91IHNlbGVjdAotYSBndWlkYW5jZSBlbGVtZW50IHRoZSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgZ3VpZGFuY2UgaXMgZGlzcGxheWVkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5DYXRlZ29yaWVzPC9zdHJvbmc+IHRhYi4gQSB0YXNrIGNhbiBiZSBpbmNsdWRlZCBpbiBvbmUKLWRpc2NpcGxpbmUgYW5kIGFueSBudW1iZXIgb2YgY3VzdG9tIGNhdGVnb3JpZXMuIE9wZW4gdGhlIFNlbGVjdCBkaWFsb2cgYnkKLWNsaWNraW5nIHRoZSBhcHByb3ByaWF0ZSA8c3Ryb25nPlNlbGVjdDwvc3Ryb25nPiBvciA8c3Ryb25nPkFkZDwvc3Ryb25nPiBidXR0b24gbmV4dCB0byB0aGUgY2F0ZWdvcnkKLWxpc3RzLiBTZWxlY3QgYSBzaW5nbGUgZGlzY2lwbGluZSBvciBhbnkgbnVtYmVyIG9mIGN1c3RvbSBjYXRlZ29yaWVzLCBhbmQKLXRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gWW91IGNhbiByZW1vdmUgYSB0YXNrIGZyb20gYSBjYXRlZ29yeSBieSBzZWxlY3RpbmcgaXQKLWFuZCB0aGVuIGNsaWNraW5nIHRoZSBhcHByb3ByaWF0ZSA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPiBidXR0b24uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3Ryb25nPlByZXZpZXc8L3N0cm9uZz4gdGFiIHRvIHZpZXcgdGhlIG5ld2x5IGNyZWF0ZWQgdGFzayBhcwotaXQgd2lsbCBhcHBlYXIgaW4gYSBwdWJsaXNoZWQgV2ViIHBhZ2UsIGFuZCB0aGVuIHNhdmUgYnkgY2xvc2luZyB0aGUgdGFiLjwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj5NZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgdGl0bGU9IlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZSBvciBtb2RpZnkgZWxlbWVudHMgaW4gb3RoZXIgY29udGVudCBwYWNrYWdlcyB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcgdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLiI+VmFyaWFiaWxpdHk8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXJvbGUuaHRtbCNjcmVhdGVhcm9sZSI+Q3JlYXRlIGEgUm9sZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0Ij5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWd1aWRhbmNlLmh0bWwjY3JlYXRlZ3VpZGFuY2UiPkNyZWF0ZSBHdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWF3b3JrcHJvZHVjdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjc0ZjkxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWF3b3JrcHJvZHVjdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0ZSBhIFdvcmsgUHJvZHVjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFyb2xlLmh0bWwjY3JlYXRlYXJvbGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF0YXNrLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWd1aWRhbmNlLmh0bWwjY3JlYXRlZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q3JlYXRlIGEgV29yayBQcm9kdWN0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGVhd29ya3Byb2R1Y3QiPjxhIG5hbWU9ImNyZWF0ZWF3b3JrcHJvZHVjdCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPjxkaXYgY2xhc3M9InAiPldvcmsgcHJvZHVjdCBpcyBhIGdlbmVyYWwgdGVybSBmb3IgdGFzayBpbnB1dHMgYW5kIG91dHB1dHMuIFRoZXJlCi1hcmUgdGhyZWUgdHlwZXMgb2Ygd29yayBwcm9kdWN0Ojx1bD48bGk+PGEgaHJlZj0iYXJ0aWZhY3QuaHRtbCNhcnRpZmFjdCI+QXJ0aWZhY3Q8L2E+PC9saT4KLTxsaT48YSBocmVmPSJvdXRjb21lLmh0bWwjb3V0Y29tZSI+T3V0Y29tZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImRlbGl2ZXJhYmxlLmh0bWwjZGVsaXZlcmFibGUiPkRlbGl2ZXJhYmxlPC9hPjwvbGk+Ci08L3VsPgotPC9kaXY+Ci1Zb3Ugc2hvdWxkIGFsd2F5cyBjcmVhdGUgbmV3IG1ldGhvZCBjb250ZW50IGluIGEgPGEgaHJlZj0ibWV0aG9kcGx1Z2luLmh0bWwjbWV0aG9kcGx1Z2luIj5NZXRob2QgUGx1Zy1pbjwvYT4gdGhhdCB5b3UgcHJvZHVjZS48L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIGNyZWF0ZSBhIHdvcmsgcHJvZHVjdDo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkV4cGFuZCB0aGUgQ29udGVudCBQYWNrYWdlIGluIHdoaWNoIHlvdSB3YW50IHRvIGNyZWF0ZSB0aGUgd29yawotcHJvZHVjdC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgPHN0cm9uZz5Xb3JrIFByb2R1Y3RzPC9zdHJvbmc+LCBhbmQgdGhlbiBzZWxlY3Qgb25lIG9mIHRoZSBmb2xsb3dpbmc6PC9zcGFuPiA8dWw+PGxpPjxzdHJvbmc+TmV3ICZndDsgQXJ0aWZhY3Q8L3N0cm9uZz48L2xpPgotPGxpPjxzdHJvbmc+TmV3ICZndDsgT3V0Y29tZTwvc3Ryb25nPjwvbGk+Ci08bGk+PHN0cm9uZz5OZXcgJmd0OyBEZWxpdmVyYWJsZTwvc3Ryb25nPjwvbGk+Ci08L3VsPgotVGhlIFdvcmsgUHJvZHVjdCBlZGl0b3IgZm9yIHRoZSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCB5b3UgYXJlCi1jcmVhdGluZyBhcHBlYXJzIHdpdGggdGhlIERlc2NyaXB0aW9uIHRhYiBzZXQgYXMgdGhlIGRlZmF1bHQuPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE5hbWUgZmllbGQsIHR5cGUgYSB1bmlxdWUgbmFtZSBmb3IgeW91ciB3b3JrIHByb2R1Y3QuIFRoZQotd29yayBwcm9kdWN0IG5hbWUgaXMgdGhlIGZpbGUgbmFtZSB0aGF0IGFwcGVhcnMgaW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4uIDwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJlc2VudGF0aW9uIG5hbWUgZmllbGQsIHR5cGUgYSBwcmVzZW50YXRpb24gbmFtZS4gdGhlIHByZXNlbnRhdGlvbgotbmFtZSBpcyB0aGUgbmFtZSB0aGF0IGFwcGVhcnMgaW4geW91ciBwdWJsaXNoZWQgY29udGVudCBhbmQgaW4gdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4uIFlvdSBjYW4gYWxzbyBtYWtlIHRoaXMgbmFtZSBhcHBlYXIgaW4gdGhlIGxpYnJhcnkKLXZpZXcgYnkgdG9nZ2xpbmcgdGhlIDxzdHJvbmc+U2hvdyBQcmVzZW50YXRpb24gTmFtZXM8L3N0cm9uZz4gYnV0dG9uIGluIHRoZSBsaWJyYXJ5Ci12aWV3IHRvb2xiYXIuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBCcmllZiBEZXNjcmlwdGlvbiBmaWVsZCwgdHlwZSBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZQotbmV3IHdvcmsgcHJvZHVjdC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIG5ldyB3b3JrIHByb2R1Y3QgaW4gdGhlCi1NYWluIERlc2NyaXB0aW9uIGZpZWxkLiBUaGUgbWFpbiBkZXNjcmlwdGlvbiBpcyBhIG1vcmUgZGV0YWlsZWQgdmVyc2lvbiBvZgotdGhlIGRlc2NyaXB0aW9uIHlvdSB0eXBlZCBpbnRvIHRoZSBCcmllZiBEZXNjcmlwdGlvbiBmaWVsZC4gVGhlcmUgYXJlIHRocmVlCi13YXlzIHRvIGNyZWF0ZSB0ZXh0IGZvciB0aGUgZGVzY3JpcHRpb246PC9zcGFuPiA8dWw+PGxpPkRpcmVjdGx5LCBieSB0eXBpbmcgaXQgbWFudWFsbHkgaW4gdGhlIGVkaXRvci48L2xpPgotPGxpPkNvcHkgZnJvbSBhbm90aGVyIHNpbWlsYXIgd29yayBwcm9kdWN0IGFuZCB0aGVuIG1vZGlmeSB1c2luZyB0aGUgZWRpdG9yLjwvbGk+Ci08bGk+Q29weSBmcm9tIGFuIEhUTUwgc291cmNlLCBzdWNoIGFzIGEgcHVibGlzaGVkIE9wZW5VUC9CYXNpYyBXZWIgc2l0ZS48L2xpPgotPC91bD4KLTxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBZb3UgY2FuIHVzZSB0aGUgUmljaCBUZXh0IEVkaXRvciB0byBlZGl0IG9yIGVudGVyIHRoZSB0ZXh0IGZvcgotYW55IGZpZWxkIHRoYXQgaGFzIGEgdHdpc3R5IHN5bWJvbCA8aW1nIHNyYz0iY29sbGFwc2VkLmdpZiIgYWx0PSIiIC8+LiBTaW1wbHkgY2xpY2sgdGhlIHN5bWJvbCB0byBhY2Nlc3MgdGhlIFJpY2ggVGV4dCBFZGl0b3IuIENsaWNrIHRoZQotc3ltYm9sIGFnYWluIHRvIGNsb3NlIHRoZSBSaWNoIFRleHQgRWRpdG9yLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0icmljaHRleHRlZGl0b3IuaHRtbCNyaWNodGV4dGVkaXRvciI+UmljaCBUZXh0IEVkaXRvcjwvYT4uPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5VbmRlciA8c3Ryb25nPk5vdGF0aW9uPC9zdHJvbmc+LCBwcm92aWRlIGFueSBub3RhdGlvbnMgYWJvdXQgdGhlIFdvcmsgUHJvZHVjdC48L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBBcnRpZmFjdHMgYW5kIERlbGl2ZXJhYmxlcyBjb250YWluIHRoZSBOb3RhdGlvbiBmaWVsZHMsIHdoaWxlCi1PdXRjb21lcyBkbyBub3QuPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5VbmRlciA8c3Ryb25nPkljb248L3N0cm9uZz4geW91IGNhbiBzZWxlY3QgYSBub2RlIGljb24gdG8gYXBwZWFyIHdpdGggdGhlCi13b3JrIHByb2R1Y3QgaW4gdGhlIExpYnJhcnkgYW5kIENvbmZpZ3VyYXRpb24gdmlld3MgYW5kIGluIHRoZSB0cmVlIGJyb3dzZXIKLWluIGEgcHVibGlzaGVkIFdlYiBzaXRlLiBUaGUgbm9kZSBpY29uIHNob3VsZCBiZSAxNiB4IDE2IHBpeGVscy4gWW91IGNhbiBhbHNvCi1zZWxlY3QgYSBTaGFwZSBpY29uIHRvIGFwcGVhciBhdCB0aGUgdG9wIG9mIHRoZSBwdWJsaXNoZWQgV2ViIHBhZ2UgZm9yIHRoZQotd29yayBwcm9kdWN0LiB0aGUgU2hhcGUgaWNvbiBzaG91bGQgYmUgMzIgeCAzMiBwaXhlbHMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNvbXBsZXRlIHRoZSBvdGhlciB3b3JrIHByb2R1Y3Qgc3BlY2lmaWMgZmllbGRzIGFzIG5lZWRlZC4gU2VlIDxhIGhyZWY9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiPlZhcmlhYmlsaXR5PC9hPiBmb3IgaW5mb3JtYXRpb24KLW9uIGFkZGluZyB2YXJpYWJpbGl0eSB0byB5b3VyIHdvcmsgcHJvZHVjdC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSA8c3Ryb25nPkd1aWRhbmNlPC9zdHJvbmc+IHRhYi4gVGhpcyBwYXJ0IG9mIHRoZSBlZGl0b3IgYWxsb3dzCi15b3UgdG8gYWRkIGFuZCByZW1vdmUgZ3VpZGFuY2UgZm9yIHRoZSB3b3JrIHByb2R1Y3QuIFRvIGFkZCBndWlkYW5jZSwgY2xpY2sKLXRoZSA8c3Ryb25nPkFkZDwvc3Ryb25nPiBidXR0b24sIHNlbGVjdCB0aGUgZ3VpZGFuY2UgeW91IHdhbnQgdG8gYWRkLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LgotVG8gcmVtb3ZlIGd1aWRhbmNlLCBzZWxlY3QgaXQgaW4gdGhlIEd1aWRhbmNlIGZpZWxkLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPi4KLVdoZW4geW91IHNlbGVjdCBhIGd1aWRhbmNlIGVsZW1lbnQgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBndWlkYW5jZSBpcwotZGlzcGxheWVkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIDxzdHJvbmc+Q2F0ZWdvcmllczwvc3Ryb25nPiB0YWIuIEEgd29yayBwcm9kdWN0IGNhbiBiZSBpbmNsdWRlZAotaW4gb25lIGRvbWFpbiwgYW55IG51bWJlciBvZiB3b3JrIHByb2R1Y3QgdHlwZXMsIGFuZCBhbnkgbnVtYmVyIG9mIGN1c3RvbQotY2F0ZWdvcmllcy4gT3BlbiB0aGUgYXBwcm9wcmlhdGUgU2VsZWN0IGRpYWxvZyBieSBjbGlja2luZyB0aGUgPHN0cm9uZz5TZWxlY3Q8L3N0cm9uZz4gb3IgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uCi1uZXh0IHRvIHRoZSBjYXRlZ29yeSBsaXN0cy4gU2VsZWN0IGEgc2luZ2xlIGRvbWFpbiBvciBhbnkgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdAota2luZHMgb3IgY3VzdG9tIGNhdGVnb3JpZXMgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gWW91IGNhbiByZW1vdmUgYSB3b3JrCi1wcm9kdWN0IGZyb20gYSBjYXRlZ29yeSBieSBzZWxlY3RpbmcgaXQgYW5kIHRoZW4gY2xpY2tpbmcgdGhlIGFwcHJvcHJpYXRlIDxzdHJvbmc+UmVtb3ZlPC9zdHJvbmc+IGJ1dHRvbi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgdGhlIHdvcmsgcHJvZHVjdCBpcyBhIGRlbGl2ZXJhYmxlLCB5b3UgY2FuIGRlZmluZSB3aGF0IHRoZSBkZWxpdmVyYWJsZQotY29uc2lzdHMgb2Ygb24gdGhlIERlbGl2ZXJhYmxlIFBhcnRzIHRhYi4gQ2xpY2sgdGhlIDxzdHJvbmc+RGVsaXZlcmFibGUgUGFydHM8L3N0cm9uZz4gdGFiLgotVGhpcyBwYXJ0IG9mIHRoZSBlZGl0b3Igb25seSBhcHBlYXJzIGZvciBkZWxpdmVyYWJsZXMgYW5kIGl0IGFsbG93cyB5b3UgdG8KLWFkZCBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIHBhcnQgb2YgdGhlIGRlbGl2ZXJhYmxlLiBUbyBhZGQgd29yayBwcm9kdWN0cywKLWNsaWNrIHRoZSA8c3Ryb25nPkFkZDwvc3Ryb25nPiBidXR0b24sIHNlbGVjdCB0aGUgd29yayBwcm9kdWN0cyB5b3Ugd2FudCB0byBhZGQsIGFuZAotdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBUbyByZW1vdmUgYSB3b3JrIHByb2R1Y3QsIHNlbGVjdCBpdCBpbiB0aGUgd29yayBwcm9kdWN0cwotYXMgZGVsaXZlcmFibGUgcGFydHM6IGZpZWxkLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPi4gV2hlbiB5b3Ugc2VsZWN0Ci1hIHdvcmsgcHJvZHVjdCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIHdvcmsgcHJvZHVjdCBpcyBkaXNwbGF5ZWQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgPHN0cm9uZz5QcmV2aWV3PC9zdHJvbmc+IHRhYiB0byB2aWV3IHRoZSBuZXdseSBjcmVhdGVkIHdvcmsgcHJvZHVjdCwKLWFuZCB0aGVuIHNhdmUgYnkgY2xvc2luZyB0aGUgdGFiLjwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiB0aXRsZT0iVmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlIG9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZyB0aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuIj5WYXJpYWJpbGl0eTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRlbWV0aG9kY29udGVudCI+Q3JlYXRlIE1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhcm9sZS5odG1sI2NyZWF0ZWFyb2xlIj5DcmVhdGUgYSBSb2xlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhdGFzay5odG1sIj5DcmVhdGUgYSBUYXNrPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVndWlkYW5jZS5odG1sI2NyZWF0ZWd1aWRhbmNlIj5DcmVhdGUgR3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlZ3VpZGFuY2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWd1aWRhbmNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZjMzMDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlZ3VpZGFuY2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgR3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhcm9sZS5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhdGFzay5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGVndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgR3VpZGFuY2U8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNyZWF0ZWd1aWRhbmNlIj48YSBuYW1lPSJjcmVhdGVndWlkYW5jZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0ZSBHdWlkYW5jZTwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPjxwPkd1aWRhbmNlIGlzIGEgZ2VuZXJhbCB0ZXJtIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gPGEgaHJlZj0icm9sZS5odG1sI3JvbGUiPlJvbGU8L2E+LCA8YSBocmVmPSJ0YXNrLmh0bWwjdGFzayI+VGFzazwvYT4sIGFuZCA8YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sIj5Xb3JrIFByb2R1Y3Q8L2E+LiBHdWlkYW5jZQotcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gaG93IHRvIHBlcmZvcm0geW91ciByb2xlLCBob3cgdG8gY3JlYXRlIGEgd29yayBwcm9kdWN0LAotaG93IHRvIHBlcmZvcm0geW91ciB0YXNrLCBhbmQgc28gb24uIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT4uPC9wPgotPHA+WW91IHNob3VsZCBhbHdheXMgY3JlYXRlIG5ldyA8YSBocmVmPSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj5NZXRob2QgQ29udGVudDwvYT4gaW4gYSA8YSBocmVmPSJtZXRob2RwbHVnaW4uaHRtbCNtZXRob2RwbHVnaW4iPk1ldGhvZCBQbHVnLWluPC9hPiB0aGF0Ci15b3UgcHJvZHVjZS48L3A+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIGNyZWF0ZTxzdHJvbmc+R3VpZGFuY2U8L3N0cm9uZz46PC9wPgotPC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5FeHBhbmQgdGhlIENvbnRlbnQgUGFja2FnZSBpbiB3aGljaCB5b3Ugd2FudCB0byBjcmVhdGUgR3VpZGFuY2UKLXVudGlsIHlvdSBzZWUgdGhlIE1ldGhvZCBFbGVtZW50cyAoUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzLCBHdWlkYW5jZSkuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0IGNsaWNrIDxzdHJvbmc+R3VpZGFuY2U8L3N0cm9uZz4gYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5OZXcgJmd0OyAiZ3VpZGFuY2UgdHlwZSI8L3N0cm9uZz4uCi1UaGUgZ3VpZGFuY2UgZWRpdG9yIGZvciB0aGF0IHBhcnRpY3VsYXIgZ3VpZGFuY2UgdHlwZSBvcGVucy4gPC9zcGFuPiA8ZGl2IGNsYXNzPSJwIj5UaGUKLWZvbGxvd2luZyBndWlkYW5jZSB0eXBlcyBoYXZlIHRoZSBzYW1lIGVkaXRvciB3aGljaCBpbmNsdWRlcyBhIERlc2NyaXB0aW9uCi10YWIgYW5kIGEgUHJldmlldyB0YWI6PHVsPjxsaT48YSBocmVmPSJjb25jZXB0Lmh0bWwjY29uY2VwdCI+Q29uY2VwdDwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImV4YW1wbGUuaHRtbCNleGFtcGxlIj5FeGFtcGxlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iZ3VpZGVsaW5lLmh0bWwjZ3VpZGVsaW5lIj5HdWlkZWxpbmU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJyZXBvcnQuaHRtbCNyZXBvcnQiPlJlcG9ydDwvYT48L2xpPgotPGxpPjxhIGhyZWY9InJldXNhYmxlYXNzZXQuaHRtbCNyZXVzYWJsZWFzc2V0Ij5SZXVzYWJsZSBBc3NldDwvYT48L2xpPgotPGxpPjxhIGhyZWY9InJvYWRtYXAuaHRtbCNyb2FkbWFwIj5Sb2FkbWFwPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ic3VwcG9ydGluZ21hdGVyaWFsLmh0bWwiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2E+PC9saT4KLTxsaT48YSBocmVmPSJ0ZXJtZGVmaW5pdGlvbi5odG1sI3Rlcm1kZWZpbml0aW9uIj5UZXJtIERlZmluaXRpb248L2E+PC9saT4KLTxsaT48YSBocmVmPSJ0b29sbWVudG9yLmh0bWwjdG9vbG1lbnRvciI+VG9vbCBNZW50b3I8L2E+PC9saT4KLTxsaT48YSBocmVmPSJ3aGl0ZXBhcGVyLmh0bWwjd2hpdGVwYXBlciI+V2hpdGVwYXBlcjwvYT48L2xpPgotPC91bD4KLTwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VXNlIHRoZSBmaWVsZHMgaW4gdGhlIGNvbnRlbnQgZWxlbWVudCBlZGl0b3IgdG8gc3BlY2lmeSB0aGUgZ3VpZGFuY2UKLWRldGFpbHMuIFN0YXJ0IGJ5IGFzc2lnbmluZyBhIHVuaXF1ZSBuYW1lIHRvIHRoZSBndWlkYW5jZSBlbGVtZW50IGFsb25nIHdpdGgKLWEgcHJlc2VudGF0aW9uIG5hbWUgdGhhdCBpcyB1c2VkIGFzIHRoZSBleHRlcm5hbCB2aXNpYmxlIG5hbWUgd2hlbiBvdGhlciBlbGVtZW50cwotcmVmZXIgdG8gdGhpcyBlbGVtZW50LCBvciB3aGVuIHRoZSBlbGVtZW50IGlzIHB1Ymxpc2hlZC4gRXZlcnkgZ3VpZGFuY2UgdHlwZQotaGFzIHNwZWNpZmljIGNvbnRlbnQgZmllbGRzIGluIHRoZSBjb250ZW50IGVkaXRvciB0aGF0IGFyZSBkaXN0cmlidXRlZCBvdmVyCi10d28gb3IgbW9yZSBzdGFja2VkIHRhYnMuIFVzZSB0aGUgY29udGVudCBmaWVsZHMgdG8gZGVzY3JpYmUgeW91ciBndWlkYW5jZQotdHlwZS48L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBZb3UgY2FuIHVzZSB0aGUgUmljaCBUZXh0IEVkaXRvciB0byBlZGl0IG9yIGVudGVyCi10aGUgdGV4dCBmb3IgYW55IGZpZWxkIHRoYXQgaGFzIGEgdHdpc3R5IHN5bWJvbCA8aW1nIHNyYz0iY29sbGFwc2VkLmdpZiIgYWx0PSIiIC8+LiBTaW1wbHkgY2xpY2sgdGhlIHN5bWJvbCB0byBhY2Nlc3MgdGhlIFJpY2ggVGV4dCBFZGl0b3IuCi1DbGljayB0aGUgc3ltYm9sIGFnYWluIHRvIGNsb3NlIHRoZSBSaWNoIFRleHQgRWRpdG9yLiBGb3IgbW9yZSBpbmZvcm1hdGlvbgotc2VlIDxhIGhyZWY9InJpY2h0ZXh0ZWRpdG9yLmh0bWwjcmljaHRleHRlZGl0b3IiPlJpY2ggVGV4dCBFZGl0b3I8L2E+LjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIEljb24gc2VjdGlvbiwgc2VsZWN0IGEgTm9kZSBpY29uIHRvIGFwcGVhciB3aXRoIHRoZSB3b3JrCi1wcm9kdWN0IGluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+IGFuZCA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+IGFuZAotaW4gdGhlIHRyZWUgYnJvd3NlciBpbiBhIHB1Ymxpc2hlZCBXZWIgc2l0ZS4gVGhlIG5vZGUgaWNvbiBzaG91bGQgYmUgMTYgeAotMTYgcGl4ZWxzLiBZb3UgY2FuIGFsc28gc2VsZWN0IGEgU2hhcGUgaWNvbiB0byBhcHBlYXIgYXQgdGhlIHRvcCBvZiB0aGUgcHVibGlzaGVkCi1wYWdlIGZvciB0aGUgd29yayBwcm9kdWN0LiBUaGUgc2hhcGUgaWNvbiBzaG91bGQgYmUgMzIgeCAzMiBwaXhlbHMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgPHN0cm9uZz5QcmV2aWV3PC9zdHJvbmc+IHRhYiB0byB2aWV3IHRoZSBuZXdseSBjcmVhdGVkIHdvcmsgcHJvZHVjdAotYW5kIHRoZW4gc2F2ZSBieSBjbG9zaW5nIHRoZSB0YWIuPC9zcGFuPjwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+SXQgaXMgcG9zc2libGUgdG8gY2hhbmdlIHRoZSB0eXBlcyBvZiBzb21lIHR5cGVzIG9mIGd1aWRhbmNlIHRvIGEKLWxpbWl0ZWQgbnVtYmVyIG9mIG90aGVyIGd1aWRhbmNlIHR5cGVzLiBUbyBjaGFuZ2UgYSBndWlkYW5jZSB0eXBlLCBjbGljayB0aGUgPHN0cm9uZz5DaGFuZ2UKLVR5cGU8L3N0cm9uZz4gYnV0dG9uIGFuZCBzZWxlY3QgYW4gYXZhaWxhYmxlIG5ldyB0eXBlLjxwPklmIHRoZSB0eXBlIG9mIGd1aWRhbmNlCi1pcyBhIDxhIGhyZWY9InByYWN0aWNlLmh0bWwjcHJhY3RpY2UiPlByYWN0aWNlPC9hPiwgeW91IGNhbiBhZGQKLXJlZmVyZW5jZXMgdG8gb3RoZXIgZWxlbWVudHMuIElmIHRoZSBndWlkYW5jZSBpcyBhIDxhIGhyZWY9InRlbXBsYXRlLmh0bWwiPlRlbXBsYXRlPC9hPiwKLXlvdSBjYW4gYXR0YWNoIGEgZmlsZSB0byB0aGUgZ3VpZGFuY2UuPC9wPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIj5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXJvbGUuaHRtbCI+Q3JlYXRlIGEgUm9sZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXRhc2suaHRtbCI+Q3JlYXRlIGEgVGFzazwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0Ij5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlbWV0aG9kY29udGVudC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlbWV0aG9kY29udGVudC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWYyNmZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0ZSBNZXRob2QgQ29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXJvbGUuaHRtbCNjcmVhdGVhcm9sZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXRhc2suaHRtbCNjcmVhdGVhdGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWd1aWRhbmNlLmh0bWwjY3JlYXRlZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFyb2xlLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF0YXNrLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVndWlkYW5jZS5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ2YXJpYWJpbGl0eS5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q3JlYXRlIE1ldGhvZCBDb250ZW50PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGVtZXRob2Rjb250ZW50Ij48YSBuYW1lPSJjcmVhdGVtZXRob2Rjb250ZW50Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIE1ldGhvZCBDb250ZW50PC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+PHA+TWV0aG9kIGNvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywKLWRlc2NyaWJpbmcgaG93IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUKLXBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuIFByb2Nlc3NlcyB0YWtlIHRoZQotbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZAotdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuPC9wPgotPHA+TWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgYXJlOjwvcD4KLTx1bD48bGk+PGEgaHJlZj0idGFzay5odG1sI3Rhc2siPlRhc2s8L2E+PC9saT4KLTxsaT48YSBocmVmPSJyb2xlLmh0bWwjcm9sZSI+Um9sZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiPldvcmsgUHJvZHVjdDwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwiPkd1aWRhbmNlPC9hPjwvbGk+Ci08L3VsPgotQ2xpY2sgaGVyZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCA8YSBocmVmPSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj5NZXRob2QgQ29udGVudDwvYT4uPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBjcmVhdGUgbWV0aG9kIGNvbnRlbnQ6PC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPiwKLWV4cGFuZCB0aGUgY29udGVudCBwYWNrYWdlIGluIHdoaWNoIHlvdSB3YW50IHRvIGNyZWF0ZSBuZXcgbWV0aG9kIGNvbnRlbnQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0IGNsaWNrIHRoZSBmb2xkZXIgY29udGFpbmluZyB0aGUgdHlwZSBvZiBtZXRob2QgZWxlbWVudCB5b3UKLXdhbnQgdG8gY3JlYXRlLCBjbGljayA8c3Ryb25nPk5ldzwvc3Ryb25nPiBhbmQgdGhlbiBzZWxlY3QgdGhlIGVsZW1lbnQgdGhhdCBhcHBlYXJzLgotVGhlIG5ldyBlbGVtZW50IGlzIGNyZWF0ZWQgYW5kIGl0cyByZXNwZWN0aXZlIGVkaXRvciBvcGVucy48L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBGb3IKLVdvcmsgUHJvZHVjdHMsIGNob29zZSBiZXR3ZWVuIEFydGlmYWN0LCBPdXRjb21lLCBvciBEZWxpdmVyYWJsZS4gRm9yIEd1aWRhbmNlLAotY2hvb3NlIGZyb20gdGhlIGxpc3Qgb2YgZ3VpZGFuY2UgdHlwZXMuPC9kaXY+Ci08L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj4KLTx1bCBjbGFzcz0idWxsaW5rcyI+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9ImNyZWF0ZWFyb2xlLmh0bWwiPkNyZWF0ZSBhIFJvbGU8L2E+PC9zdHJvbmc+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSJjcmVhdGVhdGFzay5odG1sIj5DcmVhdGUgYSBUYXNrPC9hPjwvc3Ryb25nPjxiciAvPgotPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwiPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvYT48L3N0cm9uZz48YnIgLz4KLTwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9ImNyZWF0ZWd1aWRhbmNlLmh0bWwiPkNyZWF0ZSBHdWlkYW5jZTwvYT48L3N0cm9uZz48YnIgLz4KLTwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9InZhcmlhYmlsaXR5Lmh0bWwiPlZhcmlhYmlsaXR5PC9hPjwvc3Ryb25nPjxiciAvPgotVmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlCi1vciBtb2RpZnkgZWxlbWVudHMgaW4gb3RoZXIgY29udGVudCBwYWNrYWdlcyB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZwotdGhlIG9yaWdpbmFsIGNvbnRlbnQuIFZhcmlhYmlsaXR5IGVuYWJsZXMgY2hhbmdlcyB0byB0aGUgY29udGVudCB3aGlsZSBrZWVwaW5nCi10aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuPC9saT4KLTwvdWw+Ci0KLTxkaXYgY2xhc3M9ImxpbmtsaXN0Ij4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXJvbGUuaHRtbCNjcmVhdGVhcm9sZSI+Q3JlYXRlIGEgUm9sZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXRhc2suaHRtbCNjcmVhdGVhdGFzayI+Q3JlYXRlIGEgVGFzazwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwiPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlZ3VpZGFuY2UuaHRtbCNjcmVhdGVndWlkYW5jZSI+Q3JlYXRlIEd1aWRhbmNlPC9hPjwvZGl2PjwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jdXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNmMTFkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jdXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGVsaXZlcmFibGUuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RlbGl2ZXJhYmxlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYjI2NmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGVsaXZlcmFibGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRlbGl2ZXJhYmxlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImFydGlmYWN0Lmh0bWwjYXJ0aWZhY3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im91dGNvbWUuaHRtbCNvdXRjb21lIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImRlbGl2ZXJhYmxlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkRlbGl2ZXJhYmxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJkZWxpdmVyYWJsZSI+PGEgbmFtZT0iZGVsaXZlcmFibGUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5EZWxpdmVyYWJsZTwvaDE+Ci08ZGl2PjxwPkEgZGVsaXZlcmFibGUgaXMgYSBjb2xsZWN0aW9uIG9mIHdvcmsgcHJvZHVjdHMsIHVzdWFsbHkgYXJ0aWZhY3RzLiBBIGRlbGl2ZXJhYmxlCi1pcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9mIHdvcmsgcHJvZHVjdHMKLXBhY2thZ2VkIGZvciBkZWxpdmVyeS4gRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhCi1wcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciwgb3Igb3RoZXIKLXN0YWtlaG9sZGVyLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiPldvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iYXJ0aWZhY3QuaHRtbCNhcnRpZmFjdCI+QXJ0aWZhY3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Im91dGNvbWUuaHRtbCNvdXRjb21lIj5PdXRjb21lPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sI2NyZWF0ZWF3b3JrcHJvZHVjdCI+Q3JlYXRlIGEgV29yayBQcm9kdWN0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RlbGl2ZXJ5cHJvY2Vzcy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGVsaXZlcnlwcm9jZXNzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNWU5YmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGVsaXZlcnlwcm9jZXNzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJEZWxpdmVyeSBQcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwjY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImRlbGl2ZXJ5cHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5EZWxpdmVyeSBQcm9jZXNzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJkZWxpdmVyeXByb2Nlc3MiPjxhIG5hbWU9ImRlbGl2ZXJ5cHJvY2VzcyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRlbGl2ZXJ5IFByb2Nlc3M8L2gxPgotPGRpdj48cD5BIERlbGl2ZXJ5IFByb2Nlc3MgaXMgdGhlIHByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUKLWZyb20gYmVnaW5uaW5nIHRvIGVuZC4gQSBEZWxpdmVyeSBQcm9jZXNzIGNhbiBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIHBsYW5uaW5nCi1hbmQgcnVubmluZyBhIHByb2plY3QuIEl0IHByb3ZpZGVzIGEgY29tcGxldGUgbGlmZWN5Y2xlIG1vZGVsIHdpdGggcHJlZGVmaW5lZAotcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcy48L3A+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sIj5DcmVhdGUgYSBEZWxpdmVyeSBQcm9jZXNzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbCNjcmVhdGVhZGVsaXZlcnlwcm9jZXNzIj5DcmVhdGUgYSBEZWxpdmVyeSBQcm9jZXNzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyM2E5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJEZXZlbG9wIGEgVGVhbSBBbGxvY2F0aW9uIFN0cnVjdHVyZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5EZXZlbG9wIGEgVGVhbSBBbGxvY2F0aW9uIFN0cnVjdHVyZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZSI+PGEgbmFtZT0iZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRldmVsb3AgYSBUZWFtIEFsbG9jYXRpb24gU3RydWN0dXJlPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+SW4gdGhlIFRlYW0gQWxsb2NhdGlvbiB2aWV3LCB5b3UgY2FuIGNyZWF0ZSBhIHByb2Nlc3MgYnkgZGVmaW5pbmcKLXdoaWNoIHJvbGVzIHBhcnRpY2lwYXRlIGluIGFjdGl2aXRpZXMgYW5kIGZpbmQgcmVzcG9uc2libGUgd29yayBwcm9kdWN0cyBhbmQKLXRhc2tzIGZyb20gdGhlcmUuIFlvdSBjYW4gYWxzbyByZXZpZXcgdGhlIHJvbGVzIGluIGEgcHJvY2VzcyB0aGF0IGhhcyBiZWVuCi1jcmVhdGVkIGJ5IGFkZGluZyB0YXNrcyBvciB3b3JrIHByb2R1Y3RzIHRvIHRoZSBwcm9jZXNzLiBCZWZvcmUgeW91IGNyZWF0ZQotYSB0ZWFtIGFsbG9jYXRpb24gc3RydWN0dXJlLCBlbnN1cmUgdGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0ZWQgaW4gdGhlIHRvb2wKLWJhciBpcyB0aGUgc2FtZSBhcyB0aGUgY29uZmlndXJhdGlvbiB5b3Ugc2VsZWN0ZWQgYXMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotZm9yIHlvdXIgcHJvY2Vzcy48L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIGRldmVsb3AgYSB0ZWFtIGFsbG9jYXRpb24gc3RydWN0dXJlOjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gYWNjZXNzIHRoZSB0ZWFtIGFsbG9jYXRpb24gZWRpdG9yLCBzZWxlY3QgdGhlIDxzdHJvbmc+VGVhbSBBbGxvY2F0aW9uPC9zdHJvbmc+IHRhYgotaW4gdGhlIHByb2Nlc3MgZWRpdG9yLjwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyB0b3BpYywgdGhlCi1icmVha2Rvd24gZWxlbWVudCBleGFtcGxlIHVzZWQgaXMgPGEgaHJlZj0iYWN0aXZpdHkuaHRtbCNhY3Rpdml0eSI+QWN0aXZpdHk8L2E+LgotT3RoZXIgYnJlYWtkb3duIGVsZW1lbnRzIGluY2x1ZGUgKGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8pIDxhIGhyZWY9InBoYXNlLmh0bWwjcGhhc2UiPlBoYXNlPC9hPiBhbmQgPGEgaHJlZj0iaXRlcmF0aW9uLmh0bWwjaXRlcmF0aW9uIj5JdGVyYXRpb248L2E+LgotVGhlIGVsZW1lbnQgeW91IHVzZSBkZXBlbmRzIG9uIHRoZSBzY29wZSBvZiB0aGUgcHJvY2VzcyB5b3UgY3JlYXRlLjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgdGhlIGVsZW1lbnQgKGVpdGhlciBhIDxhIGhyZWY9ImNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY2FwYWJpbGl0eXBhdHRlcm4iPkNhcGFiaWxpdHkgUGF0dGVybjwvYT4gb3IgPGEgaHJlZj0iZGVsaXZlcnlwcm9jZXNzLmh0bWwjZGVsaXZlcnlwcm9jZXNzIj5EZWxpdmVyeSBQcm9jZXNzPC9hPikgdG8gd2hpY2ggeW91IHdhbnQgdG8gYWRkIHN0cnVjdHVyZSwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5OZXcKLUNoaWxkICZndDsgQWN0aXZpdHk8L3N0cm9uZz4gdG8gY3JlYXRlIGEgbmV3IGFjdGl2aXR5LiBJZiBuZWVkZWQsIGNyZWF0ZSBtb3JlIGFjdGl2aXRpZXMKLXRvIHNldCB1cCB5b3VyIGJyZWFrZG93biBzdHJ1Y3R1cmUuIEFjdGl2aXRpZXMgKGFzIHdlbGwgYXMgcGhhc2VzIGFuZCBpdGVyYXRpb25zKQotY2FuIGJlIG5lc3RlZCBpbnNpZGUgZWFjaCBvdGhlciBhY2NvcmRpbmcgdG8gaG93IGVhY2ggcmVsYXRlcyBpbiB0aGUgaGllcmFyY2h5LgotWW91IGNhbiBhZGQgcm9sZXMgZGlyZWN0bHkgdG8geW91ciBhY3Rpdml0aWVzLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LCByZXZpZXcgdGhlIGxpc3Qgb2Ygcm9sZXMuIEluIHRoaXMgdmlldywKLXRhc2tzIGFyZSBzb3J0ZWQgYnkgcm9sZSBzZXRzLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5EcmlsbCBpbnRvIHRoZSByb2xlIHNldHMgaGllcmFyY2h5IHRvIHNlZSB3aGljaCByb2xlcyBhcmUgYXZhaWxhYmxlCi1pbiB0aGlzIGNvbmZpZ3VyYXRpb24uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCBhIHJvbGUgYW5kIGRyYWcgaXQgb24gdG9wIG9mIHRoZSBhcHByb3ByaWF0ZSBhY3Rpdml0eS4gVGhlCi1yb2xlIGlzIGFkZGVkIGFzIGEgcm9sZSBkZXNjcmlwdG9yLiBJZiB0aGUgcm9sZSBpcyByZXNwb25zaWJsZSBmb3Igd29yayBwcm9kdWN0cwotaW4gdGhlIGNvbmZpZ3VyYXRpb24ncyBtZXRob2QgY29udGVudCwgYSB3aXphcmQgYXBwZWFycyBwcm9tcHRpbmcgeW91IHRvIGFkZAotd29yayBwcm9kdWN0cy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gRm9yCi1lYWNoIHNlbGVjdGVkIHdvcmsgcHJvZHVjdCB0aGUgbmV4dCB3aXphcmQgd2luZG93IHByb21wdHMgeW91IHRvIHNlbGVjdCB0YXNrcwotdGhhdCBwcm9kdWNlIHRoZXNlIHdvcmsgcHJvZHVjdHMuIEFnYWluLCBzZWxlY3Qgb25lIG9yIG1vcmUgdGFza3MgYW5kIHRoZW4KLWNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4gdG8gYWRkIHRoZXNlIGVsZW1lbnRzIHRvIHlvdXIgcHJvY2Vzcy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmV2aWV3IHRoZSByb2xlIGRlc2NyaXB0b3IncyBkZXRhaWxzIGluIGl0cyBwcm9wZXJ0aWVzIHZpZXcuIElmCi10aGUgcHJvcGVydGllcyB2aWV3IGlzIG5vdCBkaXNwbGF5ZWQsIGluIHRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgZWRpdG9yLAotcmlnaHQgY2xpY2sgdGhlIHJvbGUgYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+UHJvcGVydGllczwvc3Ryb25nPi4gVXNlIHRoZSB0YWJzIG9uIHRoZQotc2lkZSBvZiB0aGUgcHJvcGVydGllcyB2aWV3IHRvIHJldmlldyBkaWZmZXJlbnQgYXNwZWN0cyBvZiB0aGUgcm9sZSBkZXNjcmlwdG9yLgotSW4gdGhlIHByb3BlcnRpZXMgdmlldywgeW91IGNhbiBhbHNvIHBlcmZvcm0gaW5kaXZpZHVhbCBtb2RpZmljYXRpb25zIG9mIHRoZQotcm9sZSBkZXNjcmlwdG9yLCBzdWNoIGFzIGNoYW5nZSB0aGUgcHJlc2VudGF0aW9uIG5hbWUsIGFkZCB0ZXh0dWFsIGRlc2NyaXB0aW9ucywKLWNoYW5nZSB3b3JrIHByb2R1Y3RzIHRoZSByb2xlIGlzIHJlc3BvbnNpYmxlIGZvciwgYW5kIG1vcmUuIFdoZW4gY2hhbmdpbmcKLXRoZSB0YXNrIGRlc2NyaXB0b3IncyByZWxhdGlvbnNoaXBzIHVuZGVyIHRoZSByb2xlcyBvciB3b3JrIHByb2R1Y3RzIHRhYnMsCi15b3UgY2FuIGFkZCBuZXcgZWxlbWVudHMgZnJvbSB5b3VyIG1ldGhvZCBjb250ZW50IGJ5IGNsaWNraW5nIHRoZSA8c3Ryb25nPkFkZC4uLjwvc3Ryb25nPiBidXR0b24sCi1vciBjb25uZWN0IHlvdXIgdGFzayBkZXNjcmlwdG9yIHdpdGggdGFza3MgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgYWN0aXZpdHkuCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9InByb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXcuaHRtbCNwcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3Ij5Qcm9jZXNzIEVsZW1lbnQgUHJvcGVydGllcyBWaWV3PC9hPjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Db250aW51ZSBhZGRpbmcgcm9sZXMgdG8geW91ciBhY3Rpdml0aWVzLjwvc3Bhbj48L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPllvdSBjYW4gcHJldmlldyB3aGF0IHlvdXIgcHJvY2VzcyB3aWxsIGxvb2sgbGlrZSBpbiBhIHB1Ymxpc2hlZCBXZWIKLXNpdGUgYXQgYW55IHRpbWUgYnkgc3dpdGNoaW5nIHRvIHRoZSA8YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT4gYW5kIHRoZW4gc2VsZWN0aW5nIHRoZSBwcm9jZXNzLCBvciBhbiBhY3Rpdml0eSBpbiB0aGUKLXByb2Nlc3MsIGluIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sIj5Db25maWd1cmF0aW9uIFZpZXc8L2E+LiBZb3UgY2FuIHVzZSB0aGUKLWxpbmtzIG9uIHRoZSBwYWdlIHRvIG5hdmlnYXRlIHRocm91Z2ggdGhlIHByb2Nlc3MuIFN3aXRjaCBiYWNrIHRvIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+IHRvCi1jb250aW51ZSBlZGl0aW5nIHlvdXIgcHJvY2Vzcy48L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImRldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZSI+RGV2ZWxvcCBhIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlIj5EZXZlbG9wIGEgV29yayBQcm9kdWN0IFVzYWdlIFN0cnVjdHVyZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzQ3ZWIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRGV2ZWxvcCBhIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZS5odG1sI2RldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+RGV2ZWxvcCBhIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlIj48YSBuYW1lPSJkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5EZXZlbG9wIGEgV29yayBCcmVha2Rvd24gU3RydWN0dXJlPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+QSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgaXMgYSBoaWVyYXJjaGljYWwgYnJlYWtkb3duIG9mIHdvcmssIHN1Y2gKLWFzIGFjdGl2aXRpZXMsIHRhc2tzLCBhbmQgc3RlcHMsIGRlZmluaW5nIGEgcHJvY2Vzcy4gPHA+QmVmb3JlIGNyZWF0aW5nIGEKLXdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSwgYmUgc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGVkIGluIHRoZSB0b29sCi1iYXIgaXMgdGhlIHNhbWUgYXMgdGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0ZWQgYXMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotZm9yIHlvdXIgcHJvY2Vzcy48L3A+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIGRldmVsb3AgYSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmU6PC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBhY2Nlc3MgdGhlIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3IsIHNlbGVjdCB0aGUgPHN0cm9uZz5Xb3JrCi1CcmVha2Rvd24gU3RydWN0dXJlPC9zdHJvbmc+IHRhYiBpbiBhIHByb2Nlc3MgZWRpdG9yLjwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEEgYnJlYWtkb3duCi1zdHJ1Y3R1cmUgaXMgY3JlYXRlZCB3aXRoIGJyZWFrZG93biBlbGVtZW50cy4gRXhhbXBsZXMgb2YgYnJlYWtkb3duIGVsZW1lbnRzCi1hcmUgPGEgaHJlZj0icGhhc2UuaHRtbCNwaGFzZSI+UGhhc2U8L2E+LCA8YSBocmVmPSJpdGVyYXRpb24uaHRtbCNpdGVyYXRpb24iPkl0ZXJhdGlvbjwvYT4sIDxhIGhyZWY9ImFjdGl2aXR5Lmh0bWwjYWN0aXZpdHkiPkFjdGl2aXR5PC9hPiwKLW9yIHRhc2sgZGVzY3JpcHRvci4gVHlwaWNhbGx5LCBhIHByb2Nlc3MgaXMgY3JlYXRlZCBieSBkZWZpbmluZwotaXRzIHBoYXNlcyBhbmQgaXRlcmF0aW9ucyB3aXRoaW4gb3IgYWNyb3NzIHRoZXNlIHBoYXNlcy4gUGhhc2VzIGFuZCBpdGVyYXRpb25zCi1hcmUgdGhlbiBmdXJ0aGVyIGJyb2tlbiBkb3duIGludG8gbGV2ZWxzIG9mIGFjdGl2aXRpZXMuIEZpbmFsbHksIHlvdSBjYW4gcG9wdWxhdGUKLWEgd29yayBicmVha2Rvd24gc3RydWN0dXJlJ3MgYWN0aXZpdHkgd2l0aCB0YXNrIGRlc2NyaXB0b3JzLjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgdGhlIGVsZW1lbnQgKGVpdGhlciBhIDxhIGhyZWY9ImNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY2FwYWJpbGl0eXBhdHRlcm4iPkNhcGFiaWxpdHkgUGF0dGVybjwvYT4gb3IgPGEgaHJlZj0iZGVsaXZlcnlwcm9jZXNzLmh0bWwjZGVsaXZlcnlwcm9jZXNzIj5EZWxpdmVyeSBQcm9jZXNzPC9hPikgdG8gd2hpY2ggeW91IHdhbnQgdG8gYWRkIHN0cnVjdHVyZSwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5OZXcKLUNoaWxkICZndDsgQWN0aXZpdHk8L3N0cm9uZz4gdG8gY3JlYXRlIHRoZSBuZXcgYWN0aXZpdHkuIElmIG5lZWRlZCwgY3JlYXRlIG1vcmUgYWN0aXZpdGllcwotdG8gc2V0IHVwIHlvdXIgYnJlYWtkb3duIHN0cnVjdHVyZS4gQWN0aXZpdGllcyAoYXMgd2VsbCBhcyBwaGFzZXMgYW5kIGl0ZXJhdGlvbnMpCi1jYW4gYmUgbmVzdGVkIGluc2lkZSBlYWNoIG90aGVyIGFjY29yZGluZyB0byBob3cgZWFjaCByZWxhdGVzIGluIHRoZSBoaWVyYXJjaHkuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0IGNsaWNrIHRoZSBhY3Rpdml0eSBhbmQgdGhlbiBzZWxlY3QgPHN0cm9uZz5Qcm9wZXJ0aWVzPC9zdHJvbmc+IHRvIG9wZW4KLXRoZSBQcm9wZXJ0aWVzIHZpZXcuIENvbXBsZXRlIHRoZSBpbmZvcm1hdGlvbiB1bmRlciB0aGUgRG9jdW1lbnRhdGlvbiB0YWIKLWZvciB0aGUgYWN0aXZpdHkuIFRoaXMgaW5mb3JtYXRpb24gYXBwZWFycyBpbiB0aGUgcHVibGlzaGVkIFdlYiBwYWdlIGZvciB0aGUKLWFjdGl2aXR5Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SZXZpZXcgdGhlIGxpc3Qgb2YgdGFza3MgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldyB0byBzZWUgd2hpY2gKLXRhc2tzIGFyZSBhdmFpbGFibGUuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCBhIHRhc2sgdG8gYWRkIHRvIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCB0aGVuIGRyYWcgaXQKLW9uIHRvcCBvZiB0aGUgYWN0aXZpdHkgdG8gd2hpY2ggeW91IHdhbnQgaXQgdG8gYmVsb25nLiBUaGUgdGFzayBpcyBhZGRlZCBhcwotYSB0YXNrIGRlc2NyaXB0b3IgdG8gdGhhdCBhY3Rpdml0eS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgdGhlIHByb3BlcnRpZXMgdmlldyBmb3IgdGhlIGFjdGl2aXR5IGlzIG5vdCBkaXNwbGF5ZWQsIHNlbGVjdAotdGhlIHRhc2sgaW4gdGhlIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3IsIHJpZ2h0IGNsaWNrLCBhbmQgdGhlbiBzZWxlY3QgPHN0cm9uZz5Qcm9wZXJ0aWVzPC9zdHJvbmc+LgotQ2xpY2sgdGhlIDxzdHJvbmc+RG9jdW1lbnRhdGlvbjwvc3Ryb25nPiB0YWIgYW5kIHRoZW4gY29tcGxldGUgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkCi11bmRlciB0aGlzIHRhYi4gVGhpcyBpbmZvcm1hdGlvbiBhcHBlYXJzIGluIHRoZSBwdWJsaXNoZWQgV2ViIHBhZ2UgZm9yIHRoZQotYWN0aXZpdHkuIFVzZSB0aGUgdGFicyBvbiB0aGUgc2lkZSBvZiB0aGUgcHJvcGVydGllcyB2aWV3IHRvIHJldmlldyBkaWZmZXJlbnQKLWFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRvci4gSW4gdGhlIHByb3BlcnRpZXMgdmlldywgeW91IGNhbiBwZXJmb3JtIGluZGl2aWR1YWwKLW1vZGlmaWNhdGlvbnMgb2YgdGhlIHRhc2sgZGVzY3JpcHRvciwgc3VjaCBhcyBjaGFuZ2UgdGhlIHByZXNlbnRhdGlvbiBuYW1lLAotYWRkIHRleHR1YWwgZGVzY3JpcHRpb25zLCBhbmQgY2hhbmdlIHBlcmZvcm1pbmcgcm9sZXMsIGFtb25nIG90aGVycy4gV2hlbgotY2hhbmdpbmcgdGhlIHRhc2sgZGVzY3JpcHRvcidzIHJlbGF0aW9uc2hpcHMgdW5kZXIgdGhlIHJvbGVzIG9yIHdvcmsgcHJvZHVjdHMKLXRhYnMsIHlvdSBjYW4gYWRkIG5ldyBlbGVtZW50cyBmcm9tIHlvdXIgbWV0aG9kIGNvbnRlbnQgYnkgY2xpY2tpbmcgdGhlIDxzdHJvbmc+QWRkLi4uPC9zdHJvbmc+IGJ1dHRvbiwKLW9yIGNvbm5lY3QgeW91ciB0YXNrIGRlc2NyaXB0b3Igd2l0aCB0YXNrcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBhY3Rpdml0eS4KLUZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0icHJvY2Vzc2VsZW1lbnRwcm9wZXJ0aWVzdmlldy5odG1sI3Byb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXciPlByb2Nlc3MgRWxlbWVudCBQcm9wZXJ0aWVzIFZpZXc8L2E+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Db250aW51ZSBhZGRpbmcgdGFza3MgdG8gdGhlIGFjdGl2aXR5IG9yIGFjdGl2aXRpZXMuPC9zcGFuPjwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+WW91IGNhbiBwcmV2aWV3IHdoYXQgeW91ciBwcm9jZXNzIHdpbGwgbG9vayBsaWtlIGluIGEgcHVibGlzaGVkIFdlYgotc2l0ZSBhdCBhbnkgdGltZSBieSBzd2l0Y2hpbmcgdG8gdGhlIDxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9hPiBhbmQgdGhlbiBzZWxlY3RpbmcgdGhlIHByb2Nlc3MsIG9yIGFuIGFjdGl2aXR5IGluIHRoZQotcHJvY2VzcywgaW4gdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwiPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4uIFlvdSBjYW4gdXNlIHRoZQotbGlua3Mgb24gdGhlIHBhZ2UgdG8gbmF2aWdhdGUgdGhyb3VnaCB0aGUgcHJvY2Vzcy4gU3dpdGNoIGJhY2sgdG8gdGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT4gdG8KLWNvbnRpbnVlIGVkaXRpbmcgeW91ciBwcm9jZXNzLjwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZS5odG1sI2RldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUiPkRldmVsb3AgYSBUZWFtIEFsbG9jYXRpb24gU3RydWN0dXJlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUiPkRldmVsb3AgYSBXb3JrIFByb2R1Y3QgVXNhZ2UgU3RydWN0dXJlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MGEwNjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJEZXZlbG9wIGEgV29yayBQcm9kdWN0IFVzYWdlIFN0cnVjdHVyZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+RGV2ZWxvcCBhIFdvcmsgUHJvZHVjdCBVc2FnZSBTdHJ1Y3R1cmU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImRldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZSI+PGEgbmFtZT0iZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RGV2ZWxvcCBhIFdvcmsgUHJvZHVjdCBVc2FnZSBTdHJ1Y3R1cmU8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj5JbiB0aGUgV29yayBQcm9kdWN0IFVzYWdlIHZpZXcsIHlvdSBjYW4gY3JlYXRlIGEgcHJvY2VzcyBieSBkZWZpbmluZwotd2hpY2ggd29yayBwcm9kdWN0cyB3aWxsIGJlIGNyZWF0ZWQgYW5kIHVzZWQgaW4gdGhlIHByb2Nlc3MsIGFuZCB0aGVuIGZpbmRpbmcKLXJlc3BvbnNpYmxlIHJvbGVzIGFuZCB0YXNrcyBmcm9tIHRoZXJlLiBZb3UgY2FuIGFsc28gcmV2aWV3IHRoZSB3b3JrIHByb2R1Y3RzCi1pbiBhIHByb2Nlc3MgdGhhdCBoYXMgYmVlbiBjcmVhdGVkIGJ5IGFkZGluZyB0YXNrcyBvciByb2xlcyB0byB0aGUgcHJvY2Vzcy48cD5CZWZvcmUKLXlvdSBjcmVhdGUgYSB3b3JrIHByb2R1Y3QgdXNhZ2Ugc3RydWN0dXJlLCBlbnN1cmUgdGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0ZWQKLWluIHRoZSB0b29sIGJhciBpcyB0aGUgc2FtZSBhcyB0aGUgY29uZmlndXJhdGlvbiB5b3Ugc2VsZWN0ZWQgYXMgdGhlIGRlZmF1bHQKLWNvbmZpZ3VyYXRpb24gZm9yIHlvdXIgcHJvY2Vzcy48L3A+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIGRldmVsb3AgYSB3b3JrIHByb2R1Y3QgdXNhZ2Ugc3RydWN0dXJlOjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gYWNjZXNzIHRoZSB3b3JrIHByb2R1Y3QgdXNhZ2UgZWRpdG9yLCBzZWxlY3QgdGhlIDxzdHJvbmc+V29yayBQcm9kdWN0Ci1Vc2FnZTwvc3Ryb25nPiB0YWIgaW4gdGhlIHByb2Nlc3MgZWRpdG9yLjwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEZvciB0aGUgcHVycG9zZXMgb2YKLXRoaXMgdG9waWMsIHRoZSBicmVha2Rvd24gZWxlbWVudCBleGFtcGxlIHVzZWQgaXMgPGEgaHJlZj0iYWN0aXZpdHkuaHRtbCNhY3Rpdml0eSI+QWN0aXZpdHk8L2E+LiBPdGhlciBicmVha2Rvd24gZWxlbWVudHMgaW5jbHVkZSAoYnV0IGFyZSBub3QgbGltaXRlZAotdG8pIDxhIGhyZWY9InBoYXNlLmh0bWwjcGhhc2UiPlBoYXNlPC9hPiBhbmQgPGEgaHJlZj0iaXRlcmF0aW9uLmh0bWwjaXRlcmF0aW9uIj5JdGVyYXRpb248L2E+LiBUaGUgZWxlbWVudCB5b3UgdXNlIGRlcGVuZHMgb24gdGhlIHNjb3BlIG9mIHRoZSBwcm9jZXNzCi15b3UgY3JlYXRlLjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgdGhlIGVsZW1lbnQgKGVpdGhlciBhIDxhIGhyZWY9ImNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY2FwYWJpbGl0eXBhdHRlcm4iPkNhcGFiaWxpdHkgUGF0dGVybjwvYT4gb3IgPGEgaHJlZj0iZGVsaXZlcnlwcm9jZXNzLmh0bWwjZGVsaXZlcnlwcm9jZXNzIj5EZWxpdmVyeSBQcm9jZXNzPC9hPikgdG8gd2hpY2ggeW91IHdhbnQgdG8gYWRkIHN0cnVjdHVyZSwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5OZXcKLUNoaWxkICZndDsgQWN0aXZpdHk8L3N0cm9uZz4gdG8gY3JlYXRlIGEgbmV3IGFjdGl2aXR5LiBJZiBuZWVkZWQsIGNyZWF0ZSBtb3JlIGFjdGl2aXRpZXMKLXRvIHNldCB1cCB5b3VyIGJyZWFrZG93biBzdHJ1Y3R1cmUuIEFjdGl2aXRpZXMgKGFzIHdlbGwgYXMgcGhhc2VzIGFuZCBpdGVyYXRpb25zKQotY2FuIGJlIG5lc3RlZCBpbnNpZGUgZWFjaCBvdGhlciBhY2NvcmRpbmcgdG8gaG93IGVhY2ggcmVsYXRlcyBpbiB0aGUgaGllcmFyY2h5Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SZXZpZXcgdGhlIGxpc3Qgb2Ygd29yayBwcm9kdWN0cyBpbiB0aGUgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPi4gSW4gdGhpcyB2aWV3LCB3b3JrIHByb2R1Y3RzIGFyZSBzb3J0ZWQgYnkgZG9tYWluIGFzCi13ZWxsIGFzIHdvcmsgcHJvZHVjdCBraW5kcy4gRHJpbGwgaW50byBlaXRoZXIgb2YgdGhlc2UgaGllcmFyY2hpZXMgdG8gc2VlCi13aGljaCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUgaW4gdGhpcyBjb25maWd1cmF0aW9uLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgYSB3b3JrIHByb2R1Y3QgdG8gYWRkIHRvIGFjdGl2aXR5IGFuZCB0aGVuIGRyYWcgaXQgb24gdG9wCi1vZiB0aGUgYWN0aXZpdHkgd2hpY2ggeW91IHdhbnQgaXQgdG8gYmVsb25nLiBUaGUgd29yayBwcm9kdWN0IGlzIGFkZGVkIGFzCi1hIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIHRvIHRoYXQgYWN0aXZpdHkuIElmIHRoZSB3b3JrIHByb2R1Y3QgaXMgYW4gb3V0cHV0Ci10byBvbmUgb3IgbW9yZSB0YXNrcyBpbiB0aGUgY29uZmlndXJhdGlvbiwgYSB3aXphcmQgYXBwZWFycyBwcm9tcHRpbmcgeW91Ci10byBhZGQgdGhlIHRhc2suIDwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEl0IGlzIG5vdCByZXF1aXJlZCB0byBhZGQgYSB0YXNrLiBBIHZhbGlkCi1wcm9jZXNzIGNhbiBjb250YWluIGp1c3Qgcm9sZXMgYW5kIHdvcmsgcHJvZHVjdHMuPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TcGVjaWZ5IHRoZSBlbnRyeSBhbmQgZXhpdCBzdGF0ZXMgb2YgdGhlIHdvcmsgcHJvZHVjdCBmb3IgdGhlIGFjdGl2aXR5Ci10byB3aGljaCBpdCB3YXMgYWRkZWQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJldmlldyB0aGUgbmV3IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGRldGFpbHMgaW4gdGhlIHByb3BlcnRpZXMKLXZpZXcuIElmIHRoZSBwcm9wZXJ0aWVzIHZpZXcgaXMgbm90IGRpc3BsYXllZCwgcmlnaHQgY2xpY2sgdGhlIHdvcmsgcHJvZHVjdAotZGVzY3JpcHRvciBpbiB0aGUgcHJvY2VzcyBlZGl0b3IsIGFuZCB0aGVuIHNlbGVjdCA8c3Ryb25nPlByb3BlcnRpZXM8L3N0cm9uZz4uIFVzZSB0aGUKLXRhYnMgb24gdGhlIHNpZGUgb2YgdGhlIHByb3BlcnRpZXMgdmlldyB0byByZXZpZXcgZGlmZmVyZW50IGFzcGVjdHMgb2YgdGhlCi13b3JrIHByb2R1Y3QgZGVzY3JpcHRvci4gSW4gdGhlIFByb3BlcnRpZXMgdmlldywgeW91IGNhbiBhbHNvIHBlcmZvcm0gaW5kaXZpZHVhbAotbW9kaWZpY2F0aW9ucyBvZiB0aGUgcm9sZSBkZXNjcmlwdG9yLCBzdWNoIGFzIGNoYW5nZSB0aGUgcHJlc2VudGF0aW9uIG5hbWUsCi1hZGQgdGV4dHVhbCBkZXNjcmlwdGlvbnMsIGFkZCBlbnRyeSBhbmQgZXhpdCBzdGF0ZXMsIGFuZCBtb3JlLiBXaGVuIGNoYW5naW5nCi10aGUgcm9sZSBkZXNjcmlwdG9yJ3MgcmVsYXRpb25zaGlwcyB1bmRlciB0aGUgUm9sZXMgb3IgV29yayBQcm9kdWN0cyB0YWJzLAoteW91IGNhbiBhZGQgbmV3IGVsZW1lbnRzIGZyb20geW91ciBtZXRob2QgY29udGVudCBieSBjbGlja2luZyB0aGUgPHN0cm9uZz5BZGQuLi48L3N0cm9uZz4gYnV0dG9uLAotb3IgY29ubmVjdCB5b3VyIHJvbGUgZGVzY3JpcHRvciB3aXRoIHRhc2tzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIGFjdGl2aXR5LgotRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSJwcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3Lmh0bWwjcHJvY2Vzc2VsZW1lbnRwcm9wZXJ0aWVzdmlldyI+UHJvY2VzcyBFbGVtZW50IFByb3BlcnRpZXMgVmlldzwvYT4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNvbnRpbnVlIGFkZGluZyB3b3JrIHByb2R1Y3RzIHRvIHlvdXIgYWN0aXZpdGllcy4gPC9zcGFuPjwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+U2VlIGFsc286PC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUiPkRldmVsb3AgYSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImRldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlIj5EZXZlbG9wIGEgVGVhbSBBbGxvY2F0aW9uIFN0cnVjdHVyZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kaWZmZXJlbmNlc2JldHdlZW5leGlzdGluZ2FuZG1pZ3JhdGVkY29udGVudC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGlmZmVyZW5jZXNiZXR3ZWVuZXhpc3RpbmdhbmRtaWdyYXRlZGNvbnRlbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUwYjFiMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kaWZmZXJlbmNlc2JldHdlZW5leGlzdGluZ2FuZG1pZ3JhdGVkY29udGVudC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRpZmZlcmVuY2VzIEJldHdlZW4gSUJNIFJVUCAyMDAzIGFuZCBNaWdyYXRlZCBDb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtaWdyYXRpb25vdmVydmlldy5odG1sI21pZ3JhdGlvbm92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtaWdyYXRlYW5ycHcyMDAzcGx1Z2luLmh0bWwjbWlncmF0ZWFucnB3MjAwM3BsdWdpbiIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJkaWZmZXJlbmNlc2JldHdlZW5leGlzdGluZ2FuZG1pZ3JhdGVkY29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5EaWZmZXJlbmNlcyBCZXR3ZWVuIElCTSBSVVAgMjAwMyBhbmQgTWlncmF0ZWQgQ29udGVudDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iZGlmZmVyZW5jZXNiZXR3ZWVuZXhpc3RpbmdhbmRtaWdyYXRlZGNvbnRlbnQiPjxhIG5hbWU9ImRpZmZlcmVuY2VzYmV0d2VlbmV4aXN0aW5nYW5kbWlncmF0ZWRjb250ZW50Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RGlmZmVyZW5jZXMgQmV0d2VlbiBJQk0gUlVQIDIwMDMgYW5kIE1pZ3JhdGVkIENvbnRlbnQ8L2gxPgotPGRpdj48cD5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGNvbnRlbnQgaXMgYmFzZWQgb24gSUJNIFVuaWZpZWQKLU1ldGhvZCBBcmNoaXRlY3R1cmUuPC9wPgotPHVsPjxsaT48c3Ryb25nPkFjdGl2aXRpZXMgaGF2ZSBiZWVuIHJlbmFtZWQgdG8gdGFzazwvc3Ryb25nPjogVG8gcHJvdmlkZSBhIHRpZ2h0ZXIgbGluawotdG8gcHJvY2VzcyBlbmFjdG1lbnQgYW5kIHByb2plY3QgbWFuYWdlbWVudCB3ZSByZW5hbWVkIHRoZSBsb3dlc3QgYXNzaWduYWJsZQotdW5pdHMgb2Ygd29yayB0byBUYXNrLCBiZWNhdXNlIHRoaXMgaXMgdGhlIHRlcm0gbW9zdCBjb21tb25seSB1c2VkLjwvbGk+Ci08bGk+PHN0cm9uZz5Xb3JrZmxvdyBkZXRhaWxzIHJlbmFtZWQgdG8gYWN0aXZpdHk8L3N0cm9uZz46IFdvcmtmbG93cyBhcmUgY29tbW9ubHkgZXhwcmVzc2VkCi1pbiBoaWVyYXJjaGllcyBvZiBhY3Rpdml0eSBkaWFncmFtcyAoZS5nLiBhY3Rpdml0eSBkaWFncmFtcyBkZWZpbmVkIGluIHRoZQotVU1MIDIuMCkuICBBbHRob3VnaCBSVVAgb25seSBwcm92aWRlZCBvbmUgbGV2ZWwgb2Ygd29ya2Zsb3cgYnJlYWtkb3duLCBVTUEKLWlzIGRlc2lnbmVkIHRvIHByb3ZpZGUgbXVsdGlwbGUgbGV2ZWxzIG9mIHN1Y2ggYSBicmVha2Rvd24uIEJlY2F1c2UgdGhlIHdvcmQKLUFjdGl2aXR5IHdhcyBtb3JlIGNvbW1vbmx5IHVzZWQgdG8gZXhwcmVzcyB0aGUgZWxlbWVudHMgb2YgYWN0aXZpdHkgZGlhZ3JhbXMKLWFzIHdlbGwgYXMgdGhlIGFjdGl2aXR5IGRpYWdyYW0gaXRzZWxmLCB3ZSBkZWNpZGVkIHRvIHJlcGxhY2UgdGhlIG5hbWUgV29ya2Zsb3cKLURldGFpbCB1c2VkIGluIFJVUCB3aXRoIHRoZSBuYW1lIEFjdGl2aXR5LiAgV2UgcmVhbGl6ZSB0aGF0IHRoZSBzaGlmdCBpbiB0aGUKLXVzYWdlIG9mIHRoZSB3b3JkIEFjdGl2aXR5IG1pZ2h0IGNhdXNlIGNvbmZ1c2lvbiB3aXRoIGV4aXN0aW5nIFJVUCB1c2Vycy4KLSBIb3dldmVyLCBvbmUgaW1wb3J0YW50IGdvYWwgb2YgdGhlIFVNQSB3b3JrIHdhcyB0byB1c2UgdGVybXMgaW4gdGhlIHdheSB0aGV5Ci1hcmUgbW9zdCBjb21tb25seSB1c2VkIGluIHN0YW5kYXJkcyBhbmQgaW5kdXN0cnkuIDwvbGk+Ci08bGk+PHN0cm9uZz5UYXNrcyAoZm9ybWVyIFJVUCBBY3Rpdml0aWVzKSBjYW4gYmUgcGVyZm9ybWVkIGJ5IG1hbnkgcm9sZXM8L3N0cm9uZz46IAotSW4gUlVQIDIwMDMgYW4gYWN0aXZpdHkgd2FzIG1vZGVsZWQgYXMgYW4gb3BlcmF0aW9uIG9mIGEgcm9sZS4gIEN1c3RvbWVyIGZlZWRiYWNrLAotYSBsb29rIGF0IG90aGVyIHByb2Nlc3MgbW9kZWxpbmcgYXBwcm9hY2hlcywgYXMgd2VsbCBhcyBjaGFuZ2VzIGludHJvZHVjZWQKLWluIFVNTCAyLjAgaW5kaWNhdGVkIHRoYXQgdGhpcyB3YXMgYSB0b28gcmVzdHJpY3RpdmUgd2F5IG9mIG1vZGVsaW5nIGh1bWFuCi1iZWhhdmlvci4gIFRoaXMgYXBwcm9hY2ggZGlkIG5vdCBhbGxvdyBleHByZXNzaW5nIHRoYXQgc29tZSB3b3JrIHdhcyBwZXJmb3JtZWQKLWFzIGEgY29sbGFib3JhdGlvbiBvZiBkaWZmZXJlbnQgcm9sZXMuICBVTUEgYWRkcmVzc2VzIHRoaXMgaXNzdWUgYnkgbWFraW5nCi1UYXNrIGFuIGluZGVwZW5kZW50IG1vZGVsIGVsZW1lbnQgdG8gd2hpY2ggcGVyZm9ybWluZyByb2xlcyBjYW4gYmUgYXNzaWduZWQKLWFzIHJlc291cmNlcy4gIFVNQSB0aGVyZWZvcmUgbm93IGFsbG93cyBzZXZlcmFsIHJvbGVzIHRvIGJlIGFzc2lnbmVkIHRvIGEKLXRhc2suICBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgaXQgc3RpbGwgYWxsb3dzIGEgcHJpbWFyeSBwZXJmb3JtaW5nIHJvbGUKLXRvIGJlIGlkZW50aWZpZWQgKGJlaW5nIHJlc3BvbnNpYmxlIGZvciB0aGUgdGFzaykgYXMgd2VsbCBhcyBzZXZlcmFsIGFkZGl0aW9uYWwKLXBlcmZvcm1lcnMuPC9saT4KLTxsaT48c3Ryb25nPlJlZmluZW1lbnQgb2YgdGhlIGFydGlmYWN0IGNvbmNlcHQ8L3N0cm9uZz46IFJVUCBvbmx5IHVzZWQgdGhlIGNvbmNlcHQgb2YKLWFydGlmYWN0IHRvIGRlZmluZSB0aGluZ3MgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LgotIFVNQSBkZWZpbmVzIGFuIGV4dGVuZGVkIHRheG9ub215IGZvciB0aGVzZSBjb25jZXB0cy4gIEl0IGRlZmluZXMgdGhlIGdlbmVyYWwKLWNvbmNlcHQgb2Ygd29yayBwcm9kdWN0LCB3aGljaCBoYXMgdGhyZWUgZGlmZmVyZW50IHNwZWNpYWxpemF0aW9ucyAoc3BlY2lmaWMKLXdvcmsgcHJvZHVjdCB0eXBlcyk6IEFydGlmYWN0cyAobWFuYWdlZCB3b3JrIHByb2R1Y3RzKSwgRGVsaXZlcmFibGVzIChwYWNrYWdlZAotd29yayBwcm9kdWN0cyB0aGF0IHdpbGwgYmUgZGVsaXZlcmVkIHRvIGEgc3Rha2Vob2xkZXIgZm9yIHJldmlldyksIGFuZCBPdXRjb21lCi0odW5tYW5hZ2VkLCBpbnRhbmdpYmxlIHdvcmsgcHJvZHVjdHMpLjwvbGk+Ci08bGk+PHN0cm9uZz5EaWZmZXJlbnQgY2F0ZWdvcml6YXRpb25zIGZvciB3b3JrIHByb2R1Y3RzIGFuZCByb2xlczwvc3Ryb25nPjogSW4gUlVQLAotYXJ0aWZhY3RzIGFuZCByb2xlcyB3ZXJlIGFsbCBjYXRlZ29yaXplZCBieSBkaXNjaXBsaW5lLiBIb3dldmVyLCBzb21ldGltZXMKLWFydGlmYWN0cyB3ZXJlIHVzZWQgYWNyb3NzIGRpc2NpcGxpbmVzIGFuZCBhIGNhdGVnb3JpemF0aW9uIHRvIG9ubHkgb25lIGRpc2NpcGxpbmUKLWNhdXNlZCBjb25mdXNpb24uICBJbiBVTUEgZGlmZmVyZW50IGNhdGVnb3JpZXMgaGF2ZSBiZWVuIGRlZmluZWQgZm9yIHdvcmsKLWRlZmluaXRpb25zIChkaXNjaXBsaW5lIGZvciB0YXNrcyBhbmQgYWN0aXZpdGllcyksIHdvcmsgcHJvZHVjdHMgKGRvbWFpbiBhbmQKLXdvcmsgcHJvZHVjdCBraW5kKSwgYW5kIHJvbGVzIChyb2xlIHNldHMpLjwvbGk+Ci08bGk+PHN0cm9uZz5Qcm9jZXNzIENvbXBvbmVudHMgcmVuYW1lZCB0byBNZXRob2QgUGFja2FnZTwvc3Ryb25nPjogIFRoZSBjb25jZXB0IG9mIGNvbXBvbmVudAotaXMgY29tbW9ubHkgdXNlZCBpbiBtYW55IHN0YW5kYXJkcyBhbmQgdGVjaG5vbG9naWVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgb2YKLWNvbXBvbmVudCBsaW5rIGl0IHRvIHRoZSBhYnN0cmFjdGlvbiBvZiBlbmNhcHN1bGF0aW9uIGRlZmluaW5nIGEgY29tcG9uZW50Ci1hcyBhIGJsYWNrIGJveCB3aGljaCBjYW4gYmUgdXNlZCB2aWEgd2VsbC1kZWZpbmVkIGludGVyZmFjZXMuICBSVVAgY29tcG9uZW50Ci1kaWQgbm90IGZ1bGZpbGwgdGhpcyBibGFjayBib3ggY3JpdGVyaW9uLiAgQWxzbyB0aGUgU1BFTSBzdGFuZGFyZCBkZWZpbmVkCi1wYWNrYWdlcyBhcyB3ZWxsIGFzIGNvbXBvbmVudHMuIFRvIGJlIGNvbXBsaWFudCB0byBTUEVNIGFuZCB0aGUgaW5kdXN0cnkgdXNhZ2UKLW9mIHRoZSB3b3JkIGNvbXBvbmVudCwgd2UgcmVuYW1lZCBQcm9jZXNzIENvbXBvbmVudCB0byBNZXRob2QgUGFja2FnZSAoJ21ldGhvZCcKLWJlY2F1c2UgaXQgY2FuIGNvbnRhaW4gbWV0aG9kIGVsZW1lbnRzIG9yIHByb2Nlc3MgZWxlbWVudHMpPC9saT4KLTxsaT48c3Ryb25nPlNlcGFyYXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgZnJvbSBwcm9jZXNzIGVsZW1lbnRzPC9zdHJvbmc+OiBJbgotUlVQIDIwMDMgeW91IGNyZWF0ZWQgYSBuZXcgcHJvY2VzcyBieSBkZWZpbmluZyBhIG5ldyBjb25maWd1cmF0aW9uIGFuZCBkb2N1bWVudGluZwotbWFudWFsbHkgaW4gYSBkZXZlbG9wbWVudCBjYXNlIGFydGlmYWN0IGNoYW5nZXMgdG8gc3RhbmRhcmQgUlVQLiAgVU1BIHByb3ZpZGVzCi1leHRlbmRlZCBjb25jZXB0cyBpbiBhZGRpdGlvbiB0byB0aGUgY29uZmlndXJhdGlvbiBjb25jZXB0IGZvciB0YWlsb3JpbmcgcHJvY2Vzc2VzLgotIEl0IGFsbG93cyB5b3UgdG8gbW9kZWwgY29uY3JldGVseSBmb3IgYSBwcm9jZXNzIHdoYXQgd29yayBkZWZpbmVkIGluIHRoZQotbWV0aG9kIGNvbnRlbnQgeW91IHdhbnQgdG8gYWN0dWFsbHkgZG8gaW4gZWFjaCBwaGFzZSwgYmVjYXVzZSB5b3UgY2FuIGVhc2lseQotYWRkLCByZW1vdmUsIGFuZCByZW9yZGVyIGVsZW1lbnRzIGluIHRoZSBwcm9jZXNzIHN0cnVjdHVyZSwgcmV1c2luZyBvciBub3QKLXJldXNpbmcgd2hhdGV2ZXIgeW91IHdhbnQgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQuIEl0IGFjaGlldmVzIHRoZXNlIGZlYXR1cmVzCi1ieSBhIG1vcmUgY2xlYXIgc2VwYXJhdGlvbiBvZiBtZXRob2QgY29udGVudCAoZS5nLiB0YXNrcyBkZWZpbmVkIGZvciBkaXNjaXBsaW5lcykKLWFuZCB0aGUgYXBwbGljYXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgaW4gcHJvY2VzcyAoZXhwcmVzc2VkIHdpdGggYWN0aXZpdHkKLWRpYWdyYW1zIGFuZC9vciB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmVzKSBhcyB3ZWxsIGFzIHRoZSBtb2RlbGluZyBvZiBwcm9jZXNzZXMKLShpLmUuIGNyZWF0aW5nIG5ldyBvciBhZGFwdGVkIGFjdGl2aXR5IGRpYWdyYW1zIG9yIG5ldyBvciBhZGFwdGVkIHdvcmsgYnJlYWtkb3duCi1zdHJ1Y3R1cmVzKS4gIEl0IGludHJvZHVjZXMgYSBmZXcgbmV3IGNvbmNlcHRzIHN1Y2ggYXMgZGVzY3JpcHRvciB0aGF0IHN1cHBvcnQKLXRoaXMgc2VwYXJhdGlvbiBhbmQgYWNoaWV2ZSBuZXcgY2FwYWJpbGl0aWVzIGZvciBtYWludGFpbmluZyBhbmQgcmV1c2luZyBtYW55Ci1kaWZmZXJlbnQgZmFtaWxpZXMgb2YgYWx0ZXJuYXRpdmUgcHJvY2Vzc2VzIGFuZCBwcm9jZXNzIHBhcnRzIGFsbCB3aXRoaW4gdGhlCi1zYW1lIGNvbmZpZ3VyYXRpb24uPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtaWdyYXRpb25vdmVydmlldy5odG1sI21pZ3JhdGlvbm92ZXJ2aWV3Ij5NaWdyYXRpb24gT3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWlncmF0ZWFucnB3MjAwM3BsdWdpbi5odG1sI21pZ3JhdGVhbnJwdzIwMDNwbHVnaW4iPk1pZ3JhdGUgYW4gSUJNIFJVUCAyMDAzLjA2IFBsdWdpbjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kaXNjaXBsaW5lLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kaXNjaXBsaW5lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNWEyOWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGlzY2lwbGluZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRGlzY2lwbGluZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJkaXNjaXBsaW5lIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkRpc2NpcGxpbmU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImRpc2NpcGxpbmUiPjxhIG5hbWU9ImRpc2NpcGxpbmUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5EaXNjaXBsaW5lPC9oMT4KLTxkaXY+PHA+QSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiA8YSBocmVmPSJ0YXNrLmh0bWwjdGFzayI+VGFza3M8L2E+IHRoYXQKLWFyZSByZWxhdGVkIHRvIGEgbWFqb3IgYXJlYSBvZiBjb25jZXJuIHdpdGhpbiB0aGUgb3ZlcmFsbCBJVCBlbnZpcm9ubWVudC4KLUZvciBleGFtcGxlLCBvbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QsIGl0IGlzIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4KLXJlcXVpcmVtZW50cyB0YXNrcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIHRhc2tzLiBTZXBhcmF0aW5nCi10aGVzZSB0YXNrcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSB0YXNrcyBlYXNpZXIgdG8gY29tcHJlaGVuZC4KLURpc2NpcGxpbmVzIGNhbiBiZSBvcmdhbml6ZWQgdXNpbmcgRGlzY2lwbGluZSBHcm91cGluZ3MuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyI+TWV0aG9kIENvbnRlbnQgQ2F0ZWdvcmllczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kb21haW4uaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RvbWFpbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTQyMzUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RvbWFpbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRG9tYWluIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImRvbWFpbiIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Eb21haW48L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImRvbWFpbiI+PGEgbmFtZT0iZG9tYWluIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RG9tYWluPC9oMT4KLTxkaXY+PHA+QSBEb21haW4gaXMgYSByZWZpbmVhYmxlLCBsb2dpY2FsLCBoaWVyYXJjaHkgb2YgcmVsYXRlZCA8YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij5Xb3JrIFByb2R1Y3RzPC9hPiBncm91cGVkIHRvZ2V0aGVyIGJhc2VkIG9uIHRpbWluZywgcmVzb3VyY2VzLAotb3IgcmVsYXRpb25zaGlwLiBXaGlsZSBhIERvbWFpbiBjYXRlZ29yaXplcyBtYW55IHdvcmsgcHJvZHVjdHMsIGEgd29yayBwcm9kdWN0Ci1iZWxvbmdzIHRvIG9ubHkgb25lIERvbWFpbi4gRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMuIDwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiPk1ldGhvZCBDb250ZW50IENhdGVnb3JpZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZXhhbXBsZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZXhhbXBsZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDFhNTEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2V4YW1wbGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkV4YW1wbGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZXhhbXBsZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5FeGFtcGxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJleGFtcGxlIj48YSBuYW1lPSJleGFtcGxlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RXhhbXBsZTwvaDE+Ci08ZGl2PjxwPkFuIEV4YW1wbGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYW4gZXhhbXBsZSBvZiBhCi1jb21wbGV0ZWQgd29yayBwcm9kdWN0LiA8L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9leHRlbmRzLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9leHRlbmRzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMWZiNDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZXh0ZW5kcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRXh0ZW5kcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icmVwbGFjZS5odG1sI3JlcGxhY2VzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjb250cmlidXRlcy5odG1sI2NvbnRyaWJ1dGVzIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImV4dGVuZHMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+RXh0ZW5kczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iZXh0ZW5kcyI+PGEgbmFtZT0iZXh0ZW5kcyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkV4dGVuZHM8L2gxPgotPGRpdj48cD5BbiBleHRlbmRpbmcgZWxlbWVudCBpbmhlcml0cyBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGJhc2UgZWxlbWVudC4gRXh0ZW5zaW9uCi1hbGxvd3MgTWV0aG9kIFBsdWctaW5zIHRvIGVhc2lseSByZXVzZSBlbGVtZW50cyBmcm9tIGEgYmFzZSBwbHVnLWluIGJ5IHByb3ZpZGluZwotYSBraW5kIG9mIGluaGVyaXRhbmNlIGZvciB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQuIEF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uCi1pbnN0YW5jZXMgYXJlIGluaGVyaXRlZCBmcm9tIHRoZSAiYmFzZWQtb24iIGVsZW1lbnQgdG8gdGhlIGV4dGVuZGluZyBlbGVtZW50LgotVGhlIHJlc3VsdCBpcyB0aGF0IHRoZSBleHRlbmRpbmcgZWxlbWVudCBoYXMgdGhlIHNhbWUgcHJvcGVydGllcyBhcyB0aGUgImJhc2VkLW9uIgotZWxlbWVudCwgYnV0IG1pZ2h0IGRlZmluZSBpdHMgb3duIGFkZGl0aW9ucy4gRXh0ZW5kcyBpcyBub3QgdXNlZCB0byBtb2RpZnkKLWNvbnRlbnQgb2YgdGhlIGJhc2UgcGx1Zy1pbiwgYnV0IHRvIHByb3ZpZGUgdGhlIGFiaWxpdHkgZm9yIHRoZSBleHRlbmRpbmcKLXBsdWctaW4gdG8gZGVmaW5lIGl0cyBvd24gY29udGVudCB3aGljaCBpcyBhIHZhcmlhbnQgb2YgY29udGVudCBhbHJlYWR5IGRlZmluZWQuCi1Gb3IgZXhhbXBsZSwgYSBzcGVjaWFsIHZlcnNpb24gb2YgYSBnZW5lcmljIFJldmlldyBSZWNvcmQgZm9yIGEgc3BlY2lmaWMgdHlwZQotb2YgcmV2aWV3LiBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB0aGUgYmFzZSBlbGVtZW50IGFuZCBhbnkgbnVtYmVyIG9mIGV4dGVuZGluZwotZWxlbWVudHMgY2FuIGJlIHVzZWQgc2lkZSBieSBzaWRlLCBidXQgcmVmZXIgdG8gZWFjaCBvdGhlciB0aHJvdWdoIHRoZSBleHRlbmRzCi1yZWxhdGlvbnNoaXAuIEV4dGVuZHMgYWxzbyBwcm92aWRlcyB0aGUga2V5IG1lY2hhbmlzbSBmb3IgYmluZGluZyBjYXBhYmlsaXR5Ci1wYXR0ZXJucyB0byBwcm9jZXNzZXM6IEEgcGF0dGVybiBpcyBhcHBsaWVkIGJ5IGRlZmluaW5nIGFuIGV4dGVuZHMgcmVsYXRpb25zaGlwCi1mcm9tIGFuIGFjdGl2aXR5IG9mIHRoZSBhcHBseWluZyBwcm9jZXNzZXMgdG8gdGhlIGNhcGFiaWxpdHkgcGF0dGVybi4gVGhlCi1hY3Rpdml0eSBpbmhlcml0cyBhc3NvY2lhdGlvbiBpbnN0YW5jZXMgZnJvbSB0aGUgcGF0dGVybiBhbmQgdGhlIHBhdHRlcm4gYXBwZWFycwotdG8gYmUgcGFydCBvZiB0aGUgcmVzdWx0aW5nIHByb2Nlc3MgYWZ0ZXIgaW50ZXJwcmV0YXRpb24uPC9wPgotPHA+VXNlIHRoZSBDb250ZW50IFZhcmlhYmlsaXR5IHNlY3Rpb24gb24gdGhlIERlc2NyaXB0aW9uIHRhYiB0byBtYWtlIGFuIGVsZW1lbnQKLWV4dGVuZCBhbm90aGVyIGVsZW1lbnQuIFNlbGVjdCA8c3Ryb25nPkV4dGVuZHM8L3N0cm9uZz4gYXMgdGhlIFZhcmlhYmlsaXR5IFR5cGUsIGFuZAotdGhlbiBzZWxlY3QgdGhlIGJhc2UgZWxlbWVudCB3aGljaCB0aGlzIGVsZW1lbnQgZXh0ZW5kcy4gVGhlIGJhc2UgZWxlbWVudAotbXVzdCBiZSB0aGUgc2FtZSB0eXBlIG9mIGVsZW1lbnQgYXMgdGhlIGV4dGVuZGluZyBlbGVtZW50LjwvcD4KLTxwPkFueSBpbmZvcm1hdGlvbiB5b3UgZW50ZXIgaW4gdGhlIGV4dGVuZGluZyBlbGVtZW50IGlzIGFkZGVkIHRvIHRoZSBiYXNlCi1lbGVtZW50IGluIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgZWxlbWVudC4gVGV4dCBmaWVsZHMgaW4gdGhlIGV4dGVuZGluZyBlbGVtZW50Ci1hcmUgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgcmVzcGVjdGl2ZSB0ZXh0IGZpZWxkcyBpbiB0aGUgYmFzZSBlbGVtZW50LjwvcD4KLTxwPkV4dGVuZHMgb25seSBkZWZpbmVzIGluaGVyaXRhbmNlIGZvciB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQuIFRoZSBiYXNlIHJlbWFpbnMKLXVudG91Y2hlZC4gSWYgdGhlIGV4dGVuZGluZyBlbGVtZW50IGlzIGFsbG93ZWQgYW4gYXNzb2NpYXRpb24gdG8gb25seSBvbmUKLW90aGVyIGVsZW1lbnQgYW5kIGhhcyBzdWNoIGFuIGVsZW1lbnQgZGVmaW5lZCBpdHNlbGYsIGluaGVyaXRhbmNlIHdpbGwgbm90Ci1vdmVycmlkZSB0aGlzIGFzc29jaWF0aW9uLjwvcD4KLTxkaXYgY2xhc3M9InAiPjxzdHJvbmc+RXh0ZW5kcyBydWxlczo8L3N0cm9uZz48dWw+PGxpPkF0dHJpYnV0ZSB2YWx1ZXMgb2YgdGhlIGJhc2UgZWxlbWVudCBhcmUgaW5oZXJpdGVkIHRvIHRoZSBleHRlbmRpbmcgZWxlbWVudAotaWYgdGhlIGV4dGVuZGluZyBlbGVtZW50IGhhcyBub3QgZGVmaW5lZCBpdHMgb3duIHZhbHVlcy48L2xpPgotPGxpPk91dGdvaW5nIHRvLW1hbnkgYXNzb2NpYXRpb25zIG9mIHRoZSBiYXNlIGVsZW1lbnQgYXJlIGluaGVyaXRlZCB0byB0aGUKLWV4dGVuZGluZyBlbGVtZW50LjwvbGk+Ci08bGk+T3V0Z29pbmcgdG8tb25lIGFzc29jaWF0aW9ucyBhcmUgb25seSBpbmhlcml0ZWQgaWYgdGhlIGV4dGVuZGluZyBlbGVtZW50Ci1kb2VzIG5vdCBkZWZpbmUgaXRzIG93biB0by1vbmUgYXNzb2NpYXRpb24uPC9saT4KLTxsaT5FeHRlbmRzIHdvcmtzIHRyYW5zaXRpdmVseSwgaS5lLiBpZiBhbiBleHRlbmRpbmcgZWxlbWVudCBpcyBleHRlbmRlZCBpdHNlbGYsCi10aGUgc2Vjb25kIGV4dGVuc2lvbiBpbmhlcml0cyBmcm9tIGl0cyBkaXJlY3QgYW5kIGluZGlyZWN0IGJhc2UgZWxlbWVudHMuPC9saT4KLTxsaT5Db250cmlidXRpb24gcHJlY2VkZXMgRXh0ZW5kcywgaS5lLiBjb250cmlidXRpb24gaXMgZXZhbHVhdGVkIGZpcnN0IGFuZAotdGhlbiBleHRlbmRpbmcgZWxlbWVudHMgaW5oZXJpdCBhZnRlcndhcmRzIGZyb20gdGhlIGJhc2UgZWxlbWVudCAoaW5jbHVkaW5nCi1hbGwgb2YgaXRzIGNvbnRyaWJ1dGlvbikuPC9saT4KLTxsaT5SZXBsYWNlIHByZWNlZGVzIEV4dGVuZHMsIGkuZS4gaWYgYSBiYXNlIGVsZW1lbnQgaGFzIGEgcmVwbGFjZSBhbmQgZXh0ZW5kcwotcmVsYXRpb25zaGlwLCB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQgaW5oZXJpdHMgZnJvbSB0aGUgcmVwbGFjaW5nIGVsZW1lbnQuPC9saT4KLTwvdWw+Ci1TZWUgPGEgaHJlZj0idmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMuaHRtbCN2YXJpYWJpbGl0eWFzc29jaWF0aW9ucyI+VmFyaWFiaWxpdHkgQXNzb2NpYXRpb25zPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgYXNzb2NpYXRpb25zIGZvciBlYWNoIGVsZW1lbnQKLXR5cGUuPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiB0aXRsZT0iVmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlIG9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZyB0aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuIj5WYXJpYWJpbGl0eTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0icmVwbGFjZS5odG1sI3JlcGxhY2VzIj5SZXBsYWNlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY29udHJpYnV0ZXMuaHRtbCNjb250cmlidXRlcyI+Q29udHJpYnV0ZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZmluZHJlcGxhY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZmluZHJlcGxhY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODM5NjNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2ZpbmRyZXBsYWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2d1aWRhbmNlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9ndWlkYW5jZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzcyYTRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2d1aWRhbmNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iR3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWd1aWRhbmNlLmh0bWwjY3JlYXRlZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+R3VpZGFuY2U8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Imd1aWRhbmNlIj48YSBuYW1lPSJndWlkYW5jZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkd1aWRhbmNlPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+R3VpZGFuY2UgaXMgYSBnZW5lcmFsIHRlcm0gZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byA8YSBocmVmPSJyb2xlLmh0bWwjcm9sZSI+cm9sZXM8L2E+LCA8YSBocmVmPSJ0YXNrLmh0bWwjdGFzayI+dGFza3M8L2E+LCBhbmQgPGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+d29yayBwcm9kdWN0czwvYT4uIEV4YW1wbGVzIG9mIGd1aWRhbmNlIGFyZTo8dWw+PGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImtleXdvcmQiPkd1aWRlbGluZTwvc3Bhbj48L3N0cm9uZz4gLSBQcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCBvbiBob3cKLXRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MsIG9yIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbAotZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLgotQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudAotYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uCi1vbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZQotdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZAotYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIGFuZCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzIGFuZCBtYXR1cml0eS48cD48L3A+Ci08L2xpPgotPGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImtleXdvcmQiPlRlbXBsYXRlPC9zcGFuPjwvc3Ryb25nPiAtIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0Ci1wcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmVkZWZpbmVkIHRhYmxlIG9mIGNvbnRlbnRzLCBzZWN0aW9ucywgcGFja2FnZXMsCi1hbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucwotYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seQotYmUgcHJvdmlkZWQgZm9yIGRvY3VtZW50cywgYnV0IGFsc28gZm9yIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEKLXN0b3Jlcy48cD48L3A+Ci08L2xpPgotPGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImtleXdvcmQiPkNoZWNrbGlzdDwvc3Bhbj48L3N0cm9uZz4gLSBBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdAotaWRlbnRpZmllcyBhIHNlcmllcyBvZiBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmlmaWVkLiBDaGVja2xpc3RzCi1hcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+VG9vbCBNZW50b3I8L3NwYW4+PC9zdHJvbmc+IC0gQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQKLXNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrLCBlaXRoZXIKLWluIHRoZSBjb250ZXh0IG9mLCBvciBpbmRlcGVuZGVudCBmcm9tLCBhIHRhc2sgb3IgYWN0aXZpdHkuPHA+PC9wPgotPC9saT4KLTxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9zcGFuPjwvc3Ryb25nPiAtIFVzZWQgYXMgYSBjYXRjaCBhbGwgZm9yCi1vdGhlciB0eXBlcyBvZiBndWlkYW5jZSBub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZAotdG8gYWxsIGtpbmRzIG9mIGNvbnRlbnQgZWxlbWVudHMsIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy48cD48L3A+Ci08L2xpPgotPGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImtleXdvcmQiPlJlcG9ydDwvc3Bhbj48L3N0cm9uZz4gLSBBIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdAotaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybQotb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwKLXdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbAotYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbgotaW50byBhIHJlcG9ydC48cD48L3A+Ci08L2xpPgotPGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImtleXdvcmQiPkNvbmNlcHQ8L3NwYW4+PC9zdHJvbmc+IC0gQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMKLWtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uCi1Db25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBndWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcwotc2V2ZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzIG9yIGFjdGl2aXRpZXMuPHA+PC9wPgotPC9saT4KLTxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5QcmFjdGljZTwvc3Bhbj48L3N0cm9uZz4gLSBSZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneQotb2YgZG9pbmcgd29yayB0byBhY2hpZXZlIGEgZ29hbCB0aGF0IGhhcyBhIHBvc2l0aXZlIGltcGFjdCBvbiB3b3JrIHByb2R1Y3QKLW9yIHByb2Nlc3MgcXVhbGl0eS4gUHJhY3RpY2VzIGFyZSBkZWZpbmVkIG9ydGhvZ29uYWwgdG8gbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLgotVGhleSBjb3VsZCBzdW1tYXJpemUgYXNwZWN0cyB0aGF0IGltcGFjdCBtYXkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yCi1zcGVjaWZpYyBwcm9jZXNzLiA8cD48L3A+Ci08L2xpPgotPGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImtleXdvcmQiPlJldXNhYmxlIEFzc2V0PC9zcGFuPjwvc3Ryb25nPiAtIFByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtCi1mb3IgYSBnaXZlbiBjb250ZXh0LiBUaGUgYXNzZXQgbWF5IGhhdmUgYSB2YXJpYWJpbGl0eSBwb2ludCwgd2hpY2ggaXMgYSBsb2NhdGlvbgotaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4KLVRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcgaG93IHRoZQotYXNzZXQgc2hvdWxkIGJlIHVzZWQuPHA+PC9wPgotPC9saT4KLTxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5UZXJtIERlZmluaXRpb248L3NwYW4+PC9zdHJvbmc+IC0gRGVmaW5lcyBjb25jZXB0cyBhbmQgaXMgdXNlZAotdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBBIHRlcm0gZGVmaW5pdGlvbiBpcyBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBjb250ZW50Ci1lbGVtZW50cywgYnV0IGl0cyByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSB0ZXJtIGlzIHVzZWQgaW4gdGhlCi1jb250ZW50IGVsZW1lbnRzIGRlc2NyaXB0aW9uIHRleHQuPHA+PC9wPgotPC9saT4KLTxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5XaGl0ZSBQYXBlcjwvc3Bhbj48L3N0cm9uZz4gLSBBIHNwZWNpYWwgY29uY2VwdCBndWlkYW5jZSB0aGF0Ci1oYXMgYmVlbiBleHRlcm5hbCByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluCi1pc29sYXRpb24gb2Ygb3RoZXIgY29udGVudCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuPHA+PC9wPgotPC9saT4KLTxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5FeGFtcGxlPC9zcGFuPjwvc3Ryb25nPiAtIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzCi1hbiBleGFtcGxlIG9mIGEgY29tcGxldGVkIHdvcmsgcHJvZHVjdC48L2xpPgotPC91bD4KLVNlZSBhbHNvOjwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlZ3VpZGFuY2UuaHRtbCNjcmVhdGVndWlkYW5jZSI+Q3JlYXRlIEd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2d1aWRlbGluZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZ3VpZGVsaW5lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZTc4OGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZ3VpZGVsaW5lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJHdWlkZWxpbmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZ3VpZGVsaW5lIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkd1aWRlbGluZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iZ3VpZGVsaW5lIj48YSBuYW1lPSJndWlkZWxpbmUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5HdWlkZWxpbmU8L2gxPgotPGRpdj48cD5BIEd1aWRlbGluZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbAotb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MsIG9yIHRoYXQgcHJvdmlkZXMKLWFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLgotQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudAotYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uCi1vbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZQotdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZAotYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MsIGFuZCBtYXR1cml0eS48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pYm1kaXRhLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2libWRpdGEuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGEyNmM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2libWRpdGEuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotLnVucmVzb2x2ZWQgeyBiYWNrZ3JvdW5kLWNvbG9yOiBza3libHVlOyB9Ci0ubm9UZW1wbGF0ZSB7IGJhY2tncm91bmQtY29sb3I6IHllbGxvdzsgfQotCi0uc2lkZWJhciB7YmFja2dyb3VuZDogc2lsdmVyIH0KLS50b2Mge2ZvbnQtc2l6ZTogc21hbGw7IH0KLQotLmJhc2UgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOyB9Ci0uYnJlYWRjcnVtYiB7IGZvbnQtc2l6ZSA6IHNtYWxsZXI7fQotLnByZXJlcSB7IG1hcmdpbi1sZWZ0IDogMjBweDt9Ci0uaGllcmFyY2h5IHsgZGlzcGxheTogYmxvY2s7IGJvcmRlci1zdHlsZTogc29saWQ7IHBhZGRpbmctbGVmdCA6IDNweDsgYm9yZGVyLXdpZHRoIDogMnB4OyBwYWRkaW5nLXJpZ2h0IDogM3B4OyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotCi0ubmVzdGVkMCB7IG1hcmdpbi10b3AgOiAxZW07fQotLm5lc3RlZDEgeyB9Ci0ubmVzdGVkMiB7IH0KLQotLnAge21hcmdpbi10b3A6IDFlbX0KLQotLnRhYmxlYm9yZGVyIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnRhYmxlbm9ib3JkZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci1jYXB0aW9uIHsgdGV4dC1hbGlnbjogbGVmdDsgZm9udC1zdHlsZTogaXRhbGljIH0KLS5zaW1wbGV0YWJsZWJvcmRlciB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5zaW1wbGV0YWJsZW5vYm9yZGVyIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmNob2ljZXRhYmxlYm9yZGVyIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmNob2ljZXRhYmxlbm9ib3JkZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0KLS5maWdjYXAgeyBmb250LXN0eWxlOiBpdGFsaWMgfQotLmZpZ2Rlc2MgeyBmb250LXN0eWxlOiBub3JtYWwgfQotCi0uZmlnbm9uZSB7bWFyZ2luLXRvcDogMWVtfQotLmZpZ2JvcmRlciB7IGJvcmRlci1zdHlsZTogc29saWQ7IHBhZGRpbmctbGVmdCA6IDNweDsgYm9yZGVyLXdpZHRoIDogMnB4OyBwYWRkaW5nLXJpZ2h0IDogM3B4OyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uZmlnc2lkZXMgeyBib3JkZXItbGVmdCA6IDJweCBzb2xpZDsgcGFkZGluZy1sZWZ0IDogM3B4OyBib3JkZXItcmlnaHQgOiAycHggc29saWQ7IHBhZGRpbmctcmlnaHQgOiAzcHg7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5maWd0b3AgeyBib3JkZXItdG9wIDogMnB4IHNvbGlkOyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uZmlnYm90dG9tIHsgYm9yZGVyLWJvdHRvbSA6IDJweCBzb2xpZDsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5maWd0b3Bib3QgeyBib3JkZXItdG9wIDogMnB4IHNvbGlkOyBib3JkZXItYm90dG9tIDogMnB4IHNvbGlkOyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0KLS5zeW5ub25lIHttYXJnaW4tdG9wOiAxZW19Ci0uc3luYm9yZGVyIHsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgcGFkZGluZy1sZWZ0IDogM3B4OyBib3JkZXItd2lkdGggOiAycHg7IHBhZGRpbmctcmlnaHQgOiAzcHg7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5zeW5zaWRlcyB7IGJvcmRlci1sZWZ0IDogMnB4IHNvbGlkOyBwYWRkaW5nLWxlZnQgOiAzcHg7IGJvcmRlci1yaWdodCA6IDJweCBzb2xpZDsgcGFkZGluZy1yaWdodCA6IDNweDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLnN5bnRvcCB7IGJvcmRlci10b3AgOiAycHggc29saWQ7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5zeW5ib3R0b20geyBib3JkZXItYm90dG9tIDogMnB4IHNvbGlkOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLnN5bnRvcGJvdCB7IGJvcmRlci10b3AgOiAycHggc29saWQ7IGJvcmRlci1ib3R0b20gOiAycHggc29saWQ7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLQotLnNraXAgeyBtYXJnaW4tdG9wOiAxZW0gfQotLnNraXBzcGFjZSB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS51bGxpbmtzIHsgbGlzdC1zdHlsZS10eXBlOiBub25lIH0KLS51bGNoaWxkbGluayB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5vbGNoaWxkbGluayB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5saW5rbGlzdCB7IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ubGlua2xpc3R3aXRoY2hpbGQgeyBtYXJnaW4tbGVmdDogMS41ZW07IG1hcmdpbi1ib3R0b206IDFlbSAgfQotLnN1YmxpbmtsaXN0IHsgbWFyZ2luLWxlZnQ6IDEuNWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gIH0KLS5yZWxjb25jZXB0cyB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5yZWx0YXNrcyB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5yZWxyZWYgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ucmVsaW5mbyB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLWRpdi5icmVhZGNydW1iIHttYXJnaW4tYm90dG9tOiAxZW0gfQotCi0udG9waWN0aXRsZTEgeyBtYXJnaW4tdG9wOiAwcGM7IG1hcmdpbi1ib3R0b206IC4xZW07IGZvbnQtc2l6ZTogMS4zNGVtOyB9Ci0udG9waWN0aXRsZTIgeyBtYXJnaW4tdG9wOiAxcGM7IG1hcmdpbi1ib3R0b206IC40NWVtOyBmb250LXNpemU6IDEuMTdlbTsgfQotLnRvcGljdGl0bGUzIHsgbWFyZ2luLXRvcDogMXBjOyBtYXJnaW4tYm90dG9tOiAuMTdlbTsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0udG9waWN0aXRsZTQgeyBtYXJnaW4tdG9wOiAuODNlbTsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0udG9waWN0aXRsZTUgeyBmb250LXNpemU6IDEuMTdlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS50b3BpY3RpdGxlNiB7IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLS5zZWN0aW9udGl0bGUgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDBlbTsgY29sb3I6IGJsYWNrOyBmb250LXNpemU6IDEuMTdlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7fQotLnNlY3Rpb24geyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uZXhhbXBsZSB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLQotLm5vdGUgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLm5vdGV0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5ub3RlbGlzdHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLnRpcCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0udGlwdGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uZmFzdHBhdGggeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLmZhc3RwYXRodGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uaW1wb3J0YW50IHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5pbXBvcnRhbnR0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5yZW1lbWJlciB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0ucmVtZW1iZXJ0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5yZXN0cmljdGlvbiB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0ucmVzdHJpY3Rpb250aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5hdHRlbnRpb24geyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLmF0dGVudGlvbnRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmRhbmdlcnRpdGxlIHsgbWFyZ2luLXRvcDogMWVtOyBmb250LXdlaWdodDogYm9sZCB9Ci0uZGFuZ2VyIHsgcGFkZGluZzogNXB4IDVweCA1cHggNXB4OyBib3JkZXI6IHNvbGlkOyBib3JkZXItd2lkdGg6IHRoaW47IGZvbnQtd2VpZ2h0OiBib2xkOyBtYXJnaW4tdG9wOiAycHg7IG1hcmdpbi1ib3R0b20gOiAxZW07IH0KLS5jYXV0aW9udGl0bGUgeyBtYXJnaW4tdG9wOiAxZW07IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5jYXV0aW9uIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbi1ib3R0b20gOiAxZW07IH0KLQotdWwuc2ltcGxlIHsgbGlzdC1zdHlsZS10eXBlOiBub25lIH0KLQotLmZpcnN0Y29sIHsgZm9udC13ZWlnaHQgOiBib2xkO30KLQotLmJvbGQgeyBmb250LXdlaWdodDogYm9sZDsgfQotLmJvbGRJdGFsaWMgeyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci0uaXRhbGljIHsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci0udW5kZXJsaW5lZCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0udWljb250cm9sIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5wYXJtbmFtZSB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0uZGVmcGFybW5hbWUgeyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KLS5rd2QgeyBmb250LXdlaWdodDogYm9sZDsgfQotLmRlZmt3ZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotLnZhciB7IGZvbnQtc3R5bGUgOiBpdGFsaWM7fQotLnNob3J0Y3V0IHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KLQotLnB0b2NIMSB7Zm9udC1zaXplOiB4LXNtYWxsOyB9Ci0ucHRvY0gyIHtmb250LXNpemU6IHgtc21hbGw7IH0KLQotLnNtYWxsQ2FwcyB7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGZvbnQtc2l6ZTogc21hbGxlcjsgfQotLnN0aXRsZSB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KLS5udGUge30KLQotLmRsdGVybSB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0uZGx0ZXJtZXhwYW5kIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbi10b3A6IDFlbTsgfQotLmRlZkxpc3RIZWFkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0ucGFybUxpc3RLd2QgeyBmb250LXdlaWdodDogYm9sZDsgfQotLnBhcm1MaXN0VmFyIHsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci0ucGsgeyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KLQotKltjb21wYWN0PSJ5ZXMiXT5saSB7IG1hcmdpbi10b3A6IDBlbTt9Ci0qW2NvbXBhY3Q9Im5vIl0+bGkgeyBtYXJnaW4tdG9wOiAuNTNlbTt9CQotLmxpZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnNsaWV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5kbGV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5kZGV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5zdGVwZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnN1YnN0ZXBleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0KLWRpdi5pbWFnZWxlZnQgeyB0ZXh0LWFsaWduOiBsZWZ0IH0KLWRpdi5pbWFnZWNlbnRlciB7IHRleHQtYWxpZ246IGNlbnRlciB9Ci1kaXYuaW1hZ2VyaWdodCB7IHRleHQtYWxpZ246IHJpZ2h0IH0KLWRpdi5pbWFnZWp1c3RpZnkgeyB0ZXh0LWFsaWduOiBqdXN0aWZ5IH0KLQotcHJlLnNjcmVlbiB7IHBhZGRpbmc6IDVweCA1cHggNXB4IDVweDsgYm9yZGVyOiBvdXRzZXQ7IGJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7IG1hcmdpbi10b3A6IDJweDsgbWFyZ2luLWJvdHRvbSA6IDJweDsgd2hpdGUtc3BhY2U6IHByZX0KLQotQ0lURSB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotRU0geyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLVNUUk9ORyB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci1WQVIgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgU3R5bGVzIGFkZGVkIHRvIHN1cHBvcnQgLk5FVCBvdXRwdXQuIE5vdCB1c2VkIGJ5IHN0YW5kYXJkIHByb2Nlc3NpbmcuIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYm9keS5kb3RuZXQgLyogVGhpcyBib2R5IHRhZyByZXF1aXJlcyB0aGUgdXNlIG9mIG9uZSBvZiB0aGUgc2V0cyBvZiBiYW5uZXIgYW5kL29yIHRleHQgZGl2IGlkcyAqLwotCXsKLQltYXJnaW46IDBweCAwcHggMHB4IDBweDsKLQlwYWRkaW5nOiAwcHggMHB4IDBweCAwcHg7Ci0JYmFja2dyb3VuZDogI2ZmZmZmZjsgCi0JY29sb3I6ICMwMDAwMDA7Ci0Jd2lkdGg6IDEwMCU7Ci0JfQotCi1kaXYubnN0ZXh0IC8qIENyZWF0ZXMgdGhlIHNjcm9sbGluZyB0ZXh0IGFyZWEgZm9yIE5vbnNjcm9sbGluZyByZWdpb24gdG9waWMgKi8KLQl7Ci0JcGFkZGluZzogNXB4IDEwcHggMHB4IDIycHg7IAotCX0KLQotZGl2Lm5zYmFubmVyIC8qIENyZWF0ZXMgTm9uc2Nyb2xsaW5nIGJhbm5lciByZWdpb24gKi8KLQl7Ci0JcG9zaXRpb246IHJlbGF0aXZlOwotCWxlZnQ6IDBweDsKLQlwYWRkaW5nOiAwcHggMHB4IDBweCAwcHg7Ci0JYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM5OTk5OTk7Ci0JfQotCi1kaXYuYmFubmVycm93MSAvKiBwcm92aWRlcyBmdWxsLXdpZHRoIGNvbG9yIHRvIHRvcCByb3cgaW4gcnVubmluZyBoZWFkICovCi0JewotCWJhY2tncm91bmQtY29sb3I6ICM5OWNjZmY7Ci0JfQotCi0vKiAgICAgICBTVFlMRVMgRk9SIFJVTk5JTkcgSEVBRFMgICAgICAqLwotCi10YWJsZS5iYW5uZXJwYXJ0aGVhZCwgdGFibGUuYmFubmVydGl0bGUgLyogR2VuZXJhbCB2YWx1ZXMgZm9yIHRoZSBSdW5uaW5nIEhlYWQgdGFibGVzICovCi0JewotCXBvc2l0aW9uOiByZWxhdGl2ZTsKLQlsZWZ0OiAwcHg7Ci0JdG9wOiAwcHg7Ci0JcGFkZGluZzogMHB4IDBweCAwcHggMHB4OwotCW1hcmdpbjogMHB4IDBweCAwcHggMHB4OwotCXdpZHRoOiAxMDAlOwotCWhlaWdodDogMjFweDsgCi0JYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKLQlib3JkZXItc3R5bGU6IHNvbGlkOwotCWJvcmRlci13aWR0aDogMHB4OwotCWJhY2tncm91bmQtY29sb3I6ICM5OWNjZmY7IAotCWZvbnQtc2l6ZTogMTAwJTsKLQl9Ci10YWJsZS5iYW5uZXJwYXJ0aGVhZCB0ZCAvKiBHZW5lcmFsIFZhbHVlcyBmb3IgY2VsbHMgaW4gdGhlIHRvcCByb3cgb2YgcnVubmluZyBoZWFkICovCi0JewotCW1hcmdpbjogMHB4IDBweCAwcHggMHB4OwotCXBhZGRpbmc6IDJweCAwcHggMHB4IDRweDsKLQl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwotCS8qYm9yZGVyLXdpZHRoOiAwcHggMHB4IDFweCAwcHg7ICovCi0JYm9yZGVyLXdpZHRoOiAwcHgKLQlib3JkZXItc3R5bGU6IHNvbGlkOwotCWJvcmRlci1jb2xvcjogIzk5OTk5OTsKLQliYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgCi0JZm9udC1zdHlsZTogaXRhbGljOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JfQotdGFibGUuYmFubmVycGFydGhlYWQgdGQucHJvZHVjdCAvKiBWYWx1ZXMgZm9yIHRvcCByaWdodCBjZWxsIGluIHJ1bm5pbmcgaGVhZCAqLwotCXsgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbG93cyBmb3IgYSBzZWNvbmQgdGV4dCBibG9jayBpbiB0aGUgcnVubmluZyBoZWFkICovCi0JdGV4dC1hbGlnbjogcmlnaHQ7Ci0JcGFkZGluZzogMnB4IDVweCAwcHggNXB4OwotCX0KLQotaDEuZHRIMSB7Ci0JbWFyZ2luLWxlZnQ6IC0xOHB4OwotCX0KLWRpdi50aXRsZXJvdyAvKiBwcm92aWRlcyBub24tc2Nyb2xsIHRvcGljIHRpdGxlIGFyZWEgKHJlcXVpcmVzIHNjcmlwdCkgKi8KLQl7Ci0Jd2lkdGg6IDEwMCU7IC8qIEZvcmNlcyB0YWJsZXMgdG8gaGF2ZSBjb3JyZWN0IHJpZ2h0IG1hcmdpbiAqLwotCXBhZGRpbmc6IDBweCAxMHB4IDBweCAyMnB4OyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTljY2ZmOyAgICAgICAgCi0JfQotZGl2LnRpdGxlcm93IGgxCi0JewotCW1hcmdpbi10b3A6IDBlbTsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAuMmVtCi0JfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaW5kZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2luZGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMWZiNzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaW5kZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2l0YWxpYy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pdGFsaWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmUzZTBkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2l0YWxpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pdGVyYXRpb24uaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2l0ZXJhdGlvbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTRhMzZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2l0ZXJhdGlvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iSXRlcmF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Iml0ZXJhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5JdGVyYXRpb248L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Iml0ZXJhdGlvbiI+PGEgbmFtZT0iaXRlcmF0aW9uIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+SXRlcmF0aW9uPC9oMT4KLTxkaXY+PHA+SXRlcmF0aW9uIGlzIGEgZ3JvdXAgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuCi1JdGVyYXRpb24gcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluCi1yZXBldGl0aXZlIGN5Y2xlcy48L3A+Ci08L2Rpdj4KLTxkaXY+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9saWJyYXJ5dmlldy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbGlicmFyeXZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YyN2U5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9saWJyYXJ5dmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTGlicmFyeSBWaWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCN1c2VyaW50ZXJmYWNlb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjb25maWd1cmF0aW9udmlldy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJicm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImxpYnJhcnl2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkxpYnJhcnkgVmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ibGlicmFyeXZpZXciPjxhIG5hbWU9ImxpYnJhcnl2aWV3Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TGlicmFyeSBWaWV3PC9oMT4KLTxkaXY+PHA+VGhlIExpYnJhcnkgVmlldyBkaXNwbGF5cyB0aGUgTWV0aG9kIFBsdWctaW5zIGFuZCBDb25maWd1cmF0aW9ucyBjb250YWluZWQKLWluIGEgPGEgaHJlZj0ic3RhbmRhcmRtZXRob2RsaWJyYXJ5b3ZlcnZpZXcuaHRtbCI+TWV0aG9kIExpYnJhcnk8L2E+LjwvcD4KLTxwPlRoZSBMaWJyYXJ5IFZpZXcgaXMgYXZhaWxhYmxlIG9ubHkgaW4gdGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT4gYW5kLAotd2hlbiBvcGVuLCBlbmFibGVzIHRoZSBjcmVhdGlvbiwgbW9kaWZpY2F0aW9uIGFuZCB2aWV3aW5nIG9mIGFsbCBlbGVtZW50IHR5cGVzLjwvcD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiI+VG9vbCBJbnRlcmZhY2U8L2E+PC9kaXY+Ci08ZGl2IGNsYXNzPSJwcmV2aW91c2xpbmsiPjxzdHJvbmc+UHJldmlvdXMgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwiPkNvbmZpZ3VyYXRpb24gVmlldzwvYT48L2Rpdj4KLTxkaXYgY2xhc3M9Im5leHRsaW5rIj48c3Ryb25nPk5leHQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImJyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Lmh0bWwiPkJyb3dzZSBhbmQgUHJldmlldyBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCN1c2VyaW50ZXJmYWNlb3ZlcnZpZXciIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTJjZWUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21jLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhfdnNfcHJvYy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRoX3ZzX3Byb2MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTQ1YWIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhfdnNfcHJvYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2RhdXRob3JpbmdvdmVydmlldy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlkNTY3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2RhdXRob3JpbmdvdmVydmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTWV0aG9kIENvbnRlbnQgQXV0aG9yaW5nIE92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0ibWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+TWV0aG9kIENvbnRlbnQgQXV0aG9yaW5nIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJtZXRob2RhdXRob3JpbmdvdmVydmlldyI+PGEgbmFtZT0ibWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXciPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5NZXRob2QgQ29udGVudCBBdXRob3JpbmcgT3ZlcnZpZXc8L2gxPgotPGRpdj48cD5NZXRob2QgY29udGVudCBpcyBkZXNjcmliZWQgYnkgZGVmaW5pbmcgdGFza3MgdGhhdCBoYXZlIHdvcmsgcHJvZHVjdHMgYXMKLWlucHV0cyBhbmQgb3V0cHV0cyBhbmQgdGhhdCBhcmUgcGVyZm9ybWVkIGJ5IHJvbGVzLiBUaGUgcm9sZXMgYWxzbyBkZWZpbmUKLXJlc3BvbnNpYmlsaXR5IHJlbGF0aW9uc2hpcHMgdG8gdGhlIHdvcmsgcHJvZHVjdHMuPC9wPgotPHA+PGltZyBzcmM9Im1jLmdpZiIgYWx0PSIiIC8+PC9wPgotPHA+VGhlIGZpZ3VyZSBhYm92ZSBkZXBpY3RzIHR5cGljYWwgc291cmNlcyBmb3IgbWV0aG9kIGNvbnRlbnQsIGFzIHdlbGwgYXMKLWhvdyB0aGUgbWV0aG9kIGNvbnRlbnQgaXMgcmVwcmVzZW50ZWQuIFRvIGxlYXJuIGFib3V0IGRldmVsb3BtZW50IG1ldGhvZHMsCi1wZW9wbGUgcmVzZWFyY2ggaW4gbGlicmFyaWVzIG9yIHJlY2VpdmUgdHJhaW5pbmcuIERldmVsb3BtZW50IG1ldGhvZHMgYXJlCi10eXBpY2FsbHkgZGVzY3JpYmVkIGluIHB1YmxpY2F0aW9ucyBzdWNoIGFzIGJvb2tzLCBhcnRpY2xlcywgdHJhaW5pbmcgbWF0ZXJpYWwsCi1zdGFuZGFyZHMgYW5kIHJlZ3VsYXRpb25zLCBvciBhbnkgb3RoZXIgZm9ybSBvZiBkb2N1bWVudGF0aW9uLiBUaGVzZSBzb3VyY2VzCi11c3VhbGx5IGRvY3VtZW50IG1ldGhvZHMgYnkgcHJvdmlkaW5nIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgZm9yIGEgcGFydGljdWxhcgotd2F5IG9mIGFjaGlldmluZyBhIHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWwgdW5kZXIgZ2VuZXJhbCBjaXJjdW1zdGFuY2VzLgotU29tZSBleGFtcGxlcyBhcmU6IHRyYW5zZm9ybWluZyBhIHJlcXVpcmVtZW50cyBkb2N1bWVudCBpbnRvIGFuIGFuYWx5c2lzIG1vZGVsOwotZGVmaW5pbmcgYW4gYXJjaGl0ZWN0dXJhbCBtZWNoYW5pc20gYmFzZWQgb24gZnVuY3Rpb25hbCBhbmQgbm9uLWZ1bmN0aW9uYWwKLXJlcXVpcmVtZW50czsgY3JlYXRpbmcgYSBwcm9qZWN0IHBsYW4gZm9yIGEgZGV2ZWxvcG1lbnQgaXRlcmF0aW9uOyBkZWZpbmluZwotYSBxdWFsaXR5IGFzc3VyYW5jZSBwbGFuIGZvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50czsgcmVkZXNpZ25pbmcgYSBidXNpbmVzcwotb3JnYW5pemF0aW9uIGJhc2VkIG9uIGEgbmV3IHN0cmF0ZWdpYyBkaXJlY3Rpb24sIGFuZCBzbyBvbi4gPC9wPgotPHA+VGhpcyB0b29sIHRha2VzIGNvbnRlbnQgc3VjaCBhcyB0aGUgY29udGVudCBkZXNjcmliZWQgYWJvdmUsIGFuZCBzdHJ1Y3R1cmVzCi1pdCBpbiBvbmUgc3BlY2lmaWMgd2F5IHVzaW5nIGEgcHJlZGVmaW5lZCBzY2hlbWEgb2YgY29uY2VwdHMuIFRoaXMgc2NoZW1hCi1zdXBwb3J0cyB0aGUgb3JnYW5pemF0aW9uIG9mIGxhcmdlIGFtb3VudHMgb2YgZGVzY3JpcHRpb25zIGZvciBkZXZlbG9wbWVudAotbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLiBTdWNoIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgZG8gbm90IGhhdmUgdG8gYmUKLWxpbWl0ZWQgdG8gc29mdHdhcmUgZW5naW5lZXJpbmcsIGJ1dCBjYW4gYWxzbyBjb3ZlciBvdGhlciBkZXNpZ24gYW5kIGVuZ2luZWVyaW5nCi1kaXNjaXBsaW5lcyBzdWNoIGFzIG1lY2hhbmljYWwgZW5naW5lZXJpbmcsIGJ1c2luZXNzIHRyYW5zZm9ybWF0aW9uLCBzYWxlcwotY3ljbGVzLCBhbmQgc28gb24uIDwvcD4KLTxwPlRoZSBzY2hlbWEgZm9yIG1ldGhvZCBjb250ZW50IGlzIHJlcHJlc2VudGVkIHRoaXMgdG9vbCBhcyBhIGNvbnN0cnVjdCBvZgotcm9sZXMgZGVmaW5pbmcgZGV2ZWxvcG1lbnQgc2tpbGxzIGFuZCByZXNwb25zaWJpbGl0aWVzIGZvciB3b3JrIHByb2R1Y3RzLgotVGhlc2Ugd29yayBwcm9kdWN0cyBhcmUgcHJvZHVjZWQgYnkgdGFza3MgdGhhdCBhcmUgcGVyZm9ybWVkIGJ5IHRoZSByb2xlcwotYW5kIGhhdmUgdGhlIHdvcmsgcHJvZHVjdHMgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiBUaGUgc2NyZWVuIGNhcHR1cmUgaW4gdGhlCi1maWd1cmUgYWJvdmUgc2hvd3MgaG93IHN1Y2ggbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiB0cmVlCi1icm93c2VycyBvbiB0aGUgbGVmdC4gVGhlc2UgdHJlZSBicm93c2Vycywgc2ltaWxhciB0byBhIGxpYnJhcnksIHByb3ZpZGUgZGlmZmVyZW50Ci1pbmRleGVzIG9mIHRoZSBhdmFpbGFibGUgZWxlbWVudHMgZm9yIHJhcGlkIGFjY2Vzcy4gVGhlIHNjcmVlbiBjYXB0dXJlIHNob3dzCi1vbiB0aGUgcmlnaHQgYW4gZXhhbXBsZSBvZiBhIHRhc2sgcHJlc2VudGF0aW9uLiBUaGlzIHRhc2sgcHJlc2VudGF0aW9uIGRlZmluZXMKLXRoZSB0YXNrIGluIHRlcm1zIG9mIHN0ZXBzIHRoYXQgbmVlZCB0byBiZSBwZXJmb3JtZWQgdG8gYWNoaWV2ZSB0aGUgdGFzaydzCi1wdXJwb3NlLiBZb3UgY2FuIHNlZSB0aGF0IHRoZSB0YXNrIGhhcyB2YXJpb3VzIHJlbGF0aW9uc2hpcHMsIHN1Y2ggYXMgcmVsYXRpb25zaGlwcwotdG8gcGVyZm9ybWluZyByb2xlcyBhcyB3ZWxsIGFzIHdvcmsgcHJvZHVjdHMgdGhhdCBzZXJ2ZSBhcyBpbnB1dHMgYW5kIG91dHB1dHMKLXRvIHRoZSB0YXNrLiBGaW5kIG1vcmUgZGV0YWlscyBvbiB0YXNrcywgcm9sZSwgYW5kIHdvcmsgcHJvZHVjdHMgaW4gdGhlIG9ubGluZQotaGVscCBoZXJlLiBJbiBhZGRpdGlvbiB0byByb2xlcywgdGFza3MsIGFuZCB3b3JrIHByb2R1Y3RzLCB0aGlzIHRvb2wgc3VwcG9ydHMKLXRoZSBhZGRpdGlvbiBvZiBndWlkYW5jZSBlbGVtZW50cy4gR3VpZGFuY2UgYXJlIHN1cHBsZW1lbnRhcnkgZnJlZS1mb3JtIGRvY3VtZW50YXRpb24KLXN1Y2ggYXMgd2hpdGUgcGFwZXJzLCBjb25jZXB0IGRlc2NyaXB0aW9ucywgZ3VpZGVsaW5lcywgdGVtcGxhdGVzLCBleGFtcGxlcywKLWFuZCBzbyBvbi4gPC9wPgotPHA+VGhpcyB0b29sIHByb3ZpZGVzIHZhcmlvdXMgZm9ybS1iYXNlZCBlZGl0b3JzIHRvIGNyZWF0ZSBuZXcgbWV0aG9kIGNvbnRlbnQKLWVsZW1lbnRzLiBEb2N1bWVudCB5b3VyIHRhc2ssIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudHMKLXVzaW5nIGludHVpdGl2ZSByaWNoLXRleHQgZWRpdG9ycyB0aGF0IGFsbG93IHlvdSB0byBjb3B5IGFuZCBwYXN0ZSB0ZXh0IGZyb20KLW90aGVyIHNvdXJjZXMgc3VjaCBhcyB3ZWIgcGFnZXMgb3IgZG9jdW1lbnRzLiBVc2Ugc2ltcGxlIGRpYWxvZ3MgdG8gZXN0YWJsaXNoCi1yZWxhdGlvbnNoaXBzIGJldHdlZW4gY29udGVudCBlbGVtZW50cy4gRm9yIGV4YW1wbGUsIG1ha2UgYSB3b3JrIHByb2R1Y3QgdGhlCi1pbnB1dCB0byB5b3VyIHRhc2sgc2ltcGx5IGJ5IHNlbGVjdGluZyBpdCBpbiBhIGRpYWxvZy48L3A+Ci08cD5Vc2luZyB0aGlzIHRvb2wsIHlvdSBjYW4gb3JnYW5pemUgY29udGVudCBpbiBwaHlzaWNhbCBjb250ZW50IHBhY2thZ2VzCi10aGF0IGFsbG93IHlvdSB0byBtYW5hZ2UgeW91ciBjb250ZW50IGluIGNvbmZpZ3VyYWJsZSB1bml0cy4gWW91IGNhbiBhbHNvCi1jYXRlZ29yaXplIHlvdXIgY29udGVudCBiYXNlZCBvbiBhIHNldCBvZiBwcmVkZWZpbmVkIGNhdGVnb3JpZXMgKGZvciBleGFtcGxlLAotY2F0ZWdvcml6ZSB5b3VyIHRhc2tzIGludG8gZGV2ZWxvcG1lbnQgZGlzY2lwbGluZXMsIG9yIHlvdXIgd29yayBwcm9kdWN0cwotaW50byBkb21haW5zKSBvciBjcmVhdGUgeW91ciBvd24gY2F0ZWdvcml6YXRpb24gc2NoZW1lcyBmb3IgeW91ciBjb250ZW50IHdpdGgKLXlvdXIgb3duIHVzZXItZGVmaW5lZCBjYXRlZ29yaWVzIHRoYXQgYWxsb3cgeW91IHRvIGluZGV4IGNvbnRlbnQgaW4gYW55IHdheQoteW91IHdhbnQuIDwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPk1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCI+Q3JlYXRlIE1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb25maWd1cmF0aW9ucy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzAwZjJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJNZXRob2QgQ29uZmlndXJhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24uaHRtbCNjcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJtZXRob2Rjb25maWd1cmF0aW9ucyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5NZXRob2QgQ29uZmlndXJhdGlvbjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ibWV0aG9kY29uZmlndXJhdGlvbnMiPjxhIG5hbWU9Im1ldGhvZGNvbmZpZ3VyYXRpb25zIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2gxPgotPGRpdj48cD5NZXRob2QgY29uZmlndXJhdGlvbnMgYXJlIHVzZXItZGVmaW5lZCBzdWJzZXRzIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBpbgotdGhlIE1ldGhvZCBMaWJyYXJ5LjwvcD4KLTxwPkEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gZGVmaW5lcyBhIHdvcmtpbmcgc2V0IG9mIHBhY2thZ2VzIHdpdGhpbiB0aGUgbWV0aG9kCi1saWJyYXJ5IHRoYXQgaGVscHMgeW91IGxpbWl0IHlvdXIgdmlldyB0byBhIHN1YnNldCBvZiBlbGVtZW50cy4gVGhlIGVsZW1lbnRzCi10aGF0IGFyZSBwYXJ0IG9mIGEgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBhcmUgZGlzcGxheWVkIGluIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+LiBNZXRob2QgY29uZmlndXJhdGlvbnMgYXJlIHVzZWQgZm9yIGNyZWF0aW5nIHByb2Nlc3NlcwotYW5kIGZvciBwdWJsaWNhdGlvbiBieSBkZWZpbmluZyB3aGljaCBlbGVtZW50cyBhcmUgcHVibGlzaGVkIGluIEhUTUwgYW5kIHdoaWNoCi1hcmUgbm90LjwvcD4KLTxwPkEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29uc2lzdHMgb2YgdGhyZWUgc3BlY2lmeWluZyBwYXJ0czo8L3A+Ci08dWw+PGxpPkEgZGVzY3JpcHRpb24gb2YgdGhlIGNvbmZpZ3VyYXRpb24uPC9saT4KLTxsaT5BIHNlbGVjdGlvbiBmcm9tIHRoZSBzZXQgb2YgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzLjwvbGk+Ci08bGk+QSBzZWxlY3Rpb24gb2Ygdmlld3MgdG8gYmUgcHVibGlzaGVkIGluIHRoZSBXZWIgc2l0ZS48L2xpPgotPC91bD4KLTxwPkluIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24sIHlvdSBhcmUgYWJsZSB0byBzZWxlY3QgYW5kIGRlc2VsZWN0IGZyb20gdGhlCi1jb250ZW50IHBhY2thZ2VzIGFuZCBwcm9jZXNzIGF2YWlsYWJsZSBpbiB0aGUgbWV0aG9kIGxpYnJhcnkncwotc2V0IG9mIHBsdWctaW5zLiBUaGUgc2VsZWN0aW9ucyB5b3UgbWFrZSBoZWxwIGRldGVybWluZSB0aGUgY29udGVudCBvZiB5b3VyCi1wdWJsaXNoZWQgV2ViIHNpdGUuIEEgY29uZmlndXJhdGlvbiBpcyBnaXZlbiBhIG5hbWUgYW5kIHRoZW4gc2F2ZWQgc28gaXQgY2FuCi1iZSBjaGFuZ2VkIGFuZCB0aGVuIHJlLXB1Ymxpc2hlZCBhdCBhIGxhdGVyIGRhdGUuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24uaHRtbCNjcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbiI+Q3JlYXRlIGEgTWV0aG9kIENvbmZpZ3VyYXRpb248L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2NiZGRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ik1ldGhvZCBDb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRlbWV0aG9kY29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sI2NyZWF0ZWFtZXRob2RwbHVnaW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPk1ldGhvZCBDb250ZW50PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPjxhIG5hbWU9ImNyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPk1ldGhvZCBDb250ZW50PC9oMT4KLTxkaXY+PHA+TWV0aG9kIGNvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZwotaG93IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCwgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudAotb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QKLWVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0bwotc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuPC9wPgotPHA+TWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgYXJlOjwvcD4KLTx1bD48bGk+PGEgaHJlZj0idGFzay5odG1sI3Rhc2siPlRhc2s8L2E+PC9saT4KLTxsaT48YSBocmVmPSJyb2xlLmh0bWwjcm9sZSI+Um9sZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiPldvcmsgUHJvZHVjdDwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwiPkd1aWRhbmNlPC9hPjwvbGk+Ci08L3VsPgotPHA+QSBQcm9jZXNzIEVuZ2luZWVyIGF1dGhvcnMgdGhlc2UgZWxlbWVudHMsIGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbgotdGhlbSwgYW5kIHRoZW4gY2F0ZWdvcml6ZXMgdGhlbS4gTWV0aG9kIGNvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywKLWRlc2NyaWJpbmcgaG93IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUKLXBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuIFByb2Nlc3NlcyB0YWtlIHRoZXNlCi1tZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkCi10byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy48L3A+Ci08cD5Gb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoYXQgZGV2ZWxvcHMgYW4gYXBwbGljYXRpb24KLWZyb20gc2NyYXRjaCBwZXJmb3JtcyBkZXZlbG9wbWVudCB0YXNrcyBzdWNoIGFzICJEZXZlbG9wIFZpc2lvbiIgb3IgIlVzZSBDYXNlCi1EZXNpZ24iIHNpbWlsYXIgdG8gYSBwcm9qZWN0IHRoYXQgZXh0ZW5kcyBhbiBleGlzdGluZyBzb2Z0d2FyZSBzeXN0ZW0uIEhvd2V2ZXIsCi10aGUgdHdvIHByb2plY3RzIHdpbGwgcGVyZm9ybSB0aGUgdGFza3MgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIHdpdGggYQotZGlmZmVyZW50IGVtcGhhc2lzLCBpLmUuLCB0aGV5IHBlcmZvcm0gdGhlIHN0ZXBzIG9mIHRoZXNlIHRhc2tzIGF0IGRpZmZlcmVudAotcG9pbnRzIG9mIHRpbWUgYW5kIHBlcmhhcHMgYXBwbHkgaW5kaXZpZHVhbCB2YXJpYXRpb25zIGFuZCBhZGRpdGlvbnMuIDwvcD4KLTxwPk1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGFyZSBjb250YWluZWQgd2l0aGluIG1ldGhvZCBjb250ZW50IHBhY2thZ2VzIHdoaWNoLAotaW4gdHVybiwgYXJlIGNvbnRhaW5lZCB3aXRoaW4gYSBNZXRob2QgcGx1Zy1pbi4gSW4gb3JkZXIgdG8gc2VwYXJhdGUgeW91cgotb3duIGNvbnRlbnQgZnJvbSBvcmlnaW5hbCBPcGVuVVAgY29udGVudCwgeW91IHNob3VsZCBhbHdheXMgY3JlYXRlIG5ldwotbWV0aG9kIGNvbnRlbnQgaW4gYSBtZXRob2QgcGx1Zy1pbiB0aGF0IHlvdSBwcm9kdWNlLiBDcmVhdGluZyBtZXRob2QgY29udGVudAotaW4gYSBtZXRob2QgcGx1Zy1pbiBvZiB5b3VyIG93biBhbHNvIGFsbG93cyB5b3UgdG8gdXBkYXRlIHlvdXIgb3duIGxpYnJhcnkKLXdpdGggbmV3IHJlbGVhc2VzIG9mIHRoZSBPcGVuVVAgbGlicmFyeSB3aXRob3V0IGFmZmVjdGluZyB0aGUgY29udGVudAotdGhhdCB5b3UgaGF2ZSBjcmVhdGVkIGluIHlvdXIgb3duIHBsdWctaW5zLjwvcD4KLTxwPlNlZSBhbHNvOjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiPk1ldGhvZCBDb250ZW50IENhdGVnb3JpZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sI2NyZWF0ZWFtZXRob2RwbHVnaW4iPkNyZWF0ZSBhIE1ldGhvZCBQbHVnLWluPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2E2NDk0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJNZXRob2QgQ29udGVudCBDYXRlZ29yaWVzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRlbWV0aG9kY29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCNtZXRob2Rjb250ZW50cGFja2FnZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5NZXRob2QgQ29udGVudCBDYXRlZ29yaWVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyI+PGEgbmFtZT0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5NZXRob2QgQ29udGVudCBDYXRlZ29yaWVzPC9oMT4KLTxkaXY+PHA+TWV0aG9kIENvbnRlbnQgZWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbnRvIGxvZ2ljYWwgY2F0ZWdvcmllcy4gVGhlIGNhdGVnb3JpZXMKLWNhbiBhcHBlYXIgaW4geW91ciBmaW5hbCwgcHVibGlzaGVkIFdlYiBzaXRlIGFzIHZpZXdzLjwvcD4KLTxwPlRoZXJlIGFyZSB0d28gdHlwZXMgb2YgY2F0ZWdvcnk6IFN0YW5kYXJkIGFuZCBDdXN0b20uPC9wPgotPHA+PC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlN0YW5kYXJkIENhdGVnb3JpZXM8L2g0PjxwPlN0YW5kYXJkIENhdGVnb3JpZXMgcHJvdmlkZQotYSBtZWFucyB0byBjYXRlZ29yaXplIGNvcmUgbWV0aG9kIGNvbnRlbnQgaW4gbGluZSB3aXRoIHRoZSBiZXN0IHByYWN0aWNlcwotZm9yIGNyZWF0aW5nIHN0cnVjdHVyZWQgbWV0aG9kcy4gU3RhbmRhcmQgQ2F0ZWdvcmllcyBhcmUgbGlua2VkIHdpdGggYSBzcGVjaWZpYwotbWV0aG9kIGNvbnRlbnQgdHlwZSwgZS5nLiBEaXNjaXBsaW5lcyBjb250YWluIG9ubHkgdGFza3MuIDwvcD4KLTxkaXYgY2xhc3M9InAiPlN0YW5kYXJkCi1DYXRlZ29yeSB0eXBlcyBhcmU6PHVsPjxsaT48c3Ryb25nPkRpc2NpcGxpbmVzPC9zdHJvbmc+IC0gQSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiA8YSBocmVmPSJ0YXNrLmh0bWwjdGFzayI+VGFza3M8L2E+IHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciBhcmVhIG9mIGNvbmNlcm4gd2l0aGluCi10aGUgb3ZlcmFsbCBJVCBlbnZpcm9ubWVudC4gRm9yIGV4YW1wbGUsIG9uIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwKLWl0IGlzIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIHRhc2tzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoCi1hbmFseXNpcyBhbmQgZGVzaWduIHRhc2tzLiBTZXBhcmF0aW5nIHRoZXNlIHRhc2tzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMKLW1ha2VzIHRoZSB0YXNrcyBlYXNpZXIgdG8gY29tcHJlaGVuZC4gRGlzY2lwbGluZXMgY2FuIGJlIG9yZ2FuaXplZCB1c2luZyBEaXNjaXBsaW5lCi1Hcm91cGluZ3MuPC9saT4KLTxsaT48c3Ryb25nPkRvbWFpbnM8L3N0cm9uZz4gLSBBIERvbWFpbiBpcyBhIHJlZmluZWFibGUsIGxvZ2ljYWwsIGhpZXJhcmNoeSBvZiByZWxhdGVkIDxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiPldvcmsgUHJvZHVjdHM8L2E+IGdyb3VwZWQKLXRvZ2V0aGVyIGJhc2VkIG9uIHRpbWluZywgcmVzb3VyY2VzLCBvciByZWxhdGlvbnNoaXAuIFdoaWxlIGEgRG9tYWluIGNhdGVnb3JpemVzCi1tYW55IHdvcmsgcHJvZHVjdHMsIGEgd29yayBwcm9kdWN0IGJlbG9uZ3MgdG8gb25seSBvbmUgRG9tYWluLiBEb21haW5zIGNhbgotYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMuIDwvbGk+Ci08bGk+PHN0cm9uZz5Xb3JrIFByb2R1Y3QgS2luZHM8L3N0cm9uZz4gLSBXb3JrIFByb2R1Y3QgS2luZCBpcyBhbm90aGVyIGNhdGVnb3J5IGZvcgotZ3JvdXBpbmcgPGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0czwvYT4uCi1BIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IHdvcmsgcHJvZHVjdCBraW5kcy4gQXMgYW4gZXhhbXBsZSwgeW91IG1pZ2h0Ci13YW50IHRvIGhhdmUgYSBzZXJpZXMgb2Ygd29yayBwcm9kdWN0IGtpbmRzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgb3ZlcmFsbAotaW50ZW50IG9mIHdvcmsgcHJvZHVjdHMsIHN1Y2ggYXMgc3BlY2lmaWNhdGlvbiwgcGxhbiwgb3IgbW9kZWwuPC9saT4KLTxsaT48c3Ryb25nPlJvbGUgU2V0czwvc3Ryb25nPiAtIEEgUm9sZSBTZXQgaXMgdXNlZCB0byBncm91cCA8YSBocmVmPSJyb2xlLmh0bWwjcm9sZSI+Um9sZXM8L2E+IHdpdGggY2VydGFpbiBjb21tb25hbGl0aWVzIHRvZ2V0aGVyLiBGb3IgZXhhbXBsZSwKLWluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIGFuIEFuYWx5c3Qgcm9sZSBzZXQgY291bGQgYmUgdXNlZCB0bwotZ3JvdXAgdG9nZXRoZXIgcm9sZXMgc3VjaCBhcyBCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QsIFN5c3RlbSBBbmFseXN0IGFuZAotUmVxdWlyZW1lbnRzIFNwZWNpZmllci4gRWFjaCBvZiB0aGVzZSByb2xlcyB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZAotaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBtYXkgYmUgcmVzcG9uc2libGUgZm9yIHBlcmZvcm1pbmcgY2VydGFpbiB0YXNrcwotYW5kIGNyZWF0aW5nIGNlcnRhaW4gd29yayBwcm9kdWN0cy4gUm9sZSBzZXRzIGNhbiBiZSBvcmdhbml6ZWQgdXNpbmcgUm9sZQotU2V0IEdyb3VwaW5ncy48L2xpPgotPGxpPjxzdHJvbmc+VG9vbHM8L3N0cm9uZz4gLSBUb29scyBpcyBhIGNvbnRhaW5lciBmb3IgPGEgaHJlZj0idG9vbG1lbnRvci5odG1sI3Rvb2xtZW50b3IiPlRvb2wgTWVudG9yczwvYT4uIFRvb2xzIGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMKLW9mIGEgdG9vbCBhbmQgaXQncyBnZW5lcmFsIGNhcGFiaWxpdGllcy48L2xpPgotPC91bD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+Q3VzdG9tIENhdGVnb3JpZXM8L2g0PjxwPkN1c3RvbSBDYXRlZ29yaWVzIGFyZSBoaWdobHkgY3VzdG9taXphYmxlCi1hbmQgY2FuIGNvbnRhaW4gYW55IHR5cGUgb2YgZWxlbWVudC4gQ3VzdG9tIENhdGVnb3JpZXMgYWxsb3cgeW91IHRvIGNhdGVnb3JpemUKLWNvbnRlbnQgYWNjb3JkaW5nIHRvIGFueSBzY2hlbWUgeW91IHdhbnQgYW5kIGNhbiB0aGVuIGJlIHVzZWQgdG8gY29tcG9zZSBwdWJsaXNoYWJsZQotVmlld3MsIHByb3ZpZGluZyBhIG1lYW5zIHRvIG9yZ2FuaXplIHRoZSBtZXRob2QgY29udGVudCBwcmlvciB0byBwdWJsaXNoaW5nLgotRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdGhhdCBsb2dpY2FsbHkgb3JnYW5pemVzIGNvbnRlbnQKLXJlbGV2YW50IHRvIHlvdXIgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnQsIHN1Y2ggYXMgYSBUZXN0aW5nIGNhdGVnb3J5Ci10aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudHMKLXJlbGV2YW50IHRvIHRlc3RpbmcuPC9wPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj5NZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCNtZXRob2Rjb250ZW50cGFja2FnZSI+TWV0aG9kIENvbnRlbnQgUGFja2FnZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRlbWV0aG9kY29udGVudCI+Q3JlYXRlIE1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50cGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTg1Zjk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJNZXRob2QgQ29udGVudCBQYWNrYWdlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhY29udGVudHBhY2thZ2UuaHRtbCNjcmVhdGVjb250ZW50cGFja2FnZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sI2NyZWF0ZWFtZXRob2RwbHVnaW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRwYWNrYWdlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPk1ldGhvZCBDb250ZW50IFBhY2thZ2U8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Im1ldGhvZGNvbnRlbnRwYWNrYWdlIj48YSBuYW1lPSJtZXRob2Rjb250ZW50cGFja2FnZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPk1ldGhvZCBDb250ZW50IFBhY2thZ2U8L2gxPgotPGRpdj48cD5BIE1ldGhvZCBwYWNrYWdlIGlzIGEgY29udGFpbmVyIGZvciBtZXRob2QgZWxlbWVudHMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQKLWluIG1ldGhvZCBwYWNrYWdlcyB0byBzdHJ1Y3R1cmUgYSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzCi1hcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuIE1ldGhvZCBlbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlCi1jYW4gcmV1c2UgZWxlbWVudHMgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIGxpbmsgYmV0d2VlbiB0aGVtLiBGb3IKLWV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yCi10YXNrcyBkZWZpbmVkIGluIGFub3RoZXIgcGFja2FnZSwgZW5zdXJpbmcgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YKLXRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gQWxzbywgbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseQotaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLjwvcD4KLTxwPjwvcD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TdHJ1Y3R1cmUgb2YgYSBNZXRob2QgUGFja2FnZTwvaDQ+PHA+QWx0aG91Z2ggYSBtZXRob2QKLXBhY2thZ2UgaXMgYSBjb250YWluZXIgZm9yIG1ldGhvZCBlbGVtZW50cywgaXRzIHN0cnVjdHVyZSBpcyBicm9rZW4gZG93biBpbnRvCi1zbWFsbGVyIHBhY2thZ2VzIHRvIGJldHRlciBvcmdhbml6ZSB0aGUgY29udGVudCwgc3VjaCBhcyBjb250ZW50IHBhY2thZ2VzLAotc3RhbmRhcmQgY2F0ZWdvcmllcywgYW5kIGN1c3RvbSBjYXRlZ29yaWVzLjwvcD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYWNvbnRlbnRwYWNrYWdlLmh0bWwjY3JlYXRlY29udGVudHBhY2thZ2UiPkNyZWF0ZSBhIENvbnRlbnQgUGFja2FnZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sI2NyZWF0ZWFtZXRob2RwbHVnaW4iPkNyZWF0ZSBhIE1ldGhvZCBQbHVnLWluPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRlbWV0aG9kY29udGVudCI+Q3JlYXRlIE1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZHBsdWdpbi5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kcGx1Z2luLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MzkwNGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kcGx1Z2luLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJNZXRob2QgUGx1Zy1pbiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sI2NyZWF0ZWFtZXRob2RwbHVnaW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0ibWV0aG9kcGx1Z2luIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPk1ldGhvZCBQbHVnLWluPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJtZXRob2RwbHVnaW4iPjxhIG5hbWU9Im1ldGhvZHBsdWdpbiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPk1ldGhvZCBQbHVnLWluPC9oMT4KLTxkaXY+PHA+QWxsIGNvbnRlbnQgaXMgb3JnYW5pemVkIGluIG1ldGhvZCBwbHVnLWlucy4gQSBtZXRob2QgcGx1Zy1pbiBpcyBhIGNvbnRhaW5lcgotZm9yIG1ldGhvZCBwYWNrYWdlcyB3aGljaCwgaW4gdHVybiwgY29udGFpbiB0aGUgbWV0aG9kIGFuZCBwcm9jZXNzIGNvbnRlbnQuCi1NZXRob2QgcGx1Zy1pbnMgYW5kIG1ldGhvZCBwYWNrYWdlcyBhbGxvdyB5b3UgdG8gb3JnYW5pemUgeW91ciBjb250ZW50IGF0Ci1hIGxldmVsIG9mIGdyYW51bGFyaXR5IHRoYXQgc3VpdHMgeW91ciBuZWVkcyBmb3IgYXV0aG9yaW5nIGFuZCByZXVzaW5nIHRoZQotY29udGVudC4gPC9wPgotPHA+V2hlbiB5b3UgY3JlYXRlIGEgbWV0aG9kIHBsdWctaW4sIHlvdSB3aWxsIHVzdWFsbHkgd2FudCB0byByZXVzZSBjb250ZW50Ci1pbiBvdGhlciBwbHVnLWlucy4gWW91IG1heSB3YW50IHRvIG1vZGlmeSBvciBleHRlbmQgdGhlIGNvbnRlbnQgaW4gdGhlc2Ugb3RoZXIKLXBsdWctaW5zIG9yIGFkZCB5b3VyIG93biBjb250ZW50LiBXaGVuIHlvdSBjcmVhdGUgYSBwbHVnLWluIHlvdQotY2FuIHJlZmVyZW5jZSBhbnkgbnVtYmVyIG9mIG90aGVyIHBsdWctaW5zIHRoYXQgd2FudCB0byB1c2UgaW4gdGhpcyB3YXkuIEEKLW1ldGhvZCBwbHVnLWluIGNhbiBhbHNvIGJlIHN0YW5kLWFsb25lIGFuZCBub3QgcmVmZXJlbmNlIG90aGVyIHBsdWctaW5zLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiPk1ldGhvZCBDb250ZW50IFBhY2thZ2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sI2NyZWF0ZWFtZXRob2RwbHVnaW4iPkNyZWF0ZSBhIE1ldGhvZCBQbHVnLWluPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21pbGVzdG9uZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWlsZXN0b25lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5Y2M3NzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWlsZXN0b25lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJNaWxlc3RvbmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0ibWlsZXN0b25lIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPk1pbGVzdG9uZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ibWlsZXN0b25lIj48YSBuYW1lPSJtaWxlc3RvbmUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5NaWxlc3RvbmU8L2gxPgotPGRpdj48cD5BIE1pbGVzdG9uZSBkZXNjcmliZXMgYSBzaWduaWZpY2FudCBldmVudCBpbiBhIHByb2plY3QsIHN1Y2gKLWFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kKLXN1Y2ggYXMgdGhlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlLjwvcD4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL29wZW5wZXJzcC5KUEcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vcGVucGVyc3AuSlBHCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTRhNjA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL29wZW5wZXJzcC5KUEcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vdXRjb21lLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vdXRjb21lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkM2ZiZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvb3V0Y29tZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iT3V0Y29tZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImFydGlmYWN0Lmh0bWwjYXJ0aWZhY3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRlbGl2ZXJhYmxlLmh0bWwjZGVsaXZlcmFibGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0ib3V0Y29tZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5PdXRjb21lPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJvdXRjb21lIj48YSBuYW1lPSJvdXRjb21lIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+T3V0Y29tZTwvaDE+Ci08ZGl2PjxwPkFuIG91dGNvbWUgaXMgYW4gaW50YW5naWJsZSB3b3JrIHByb2R1Y3QgdGhhdCBtYXkgYmUgYSByZXN1bHQgb3Igc3RhdGUuCi1PdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5Ci1kZWZpbmVkLiA8L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij5Xb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImFydGlmYWN0Lmh0bWwjYXJ0aWZhY3QiPkFydGlmYWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJkZWxpdmVyYWJsZS5odG1sI2RlbGl2ZXJhYmxlIj5EZWxpdmVyYWJsZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCI+Q3JlYXRlIGEgV29yayBQcm9kdWN0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL291dGRlbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvb3V0ZGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjQ2OTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvb3V0ZGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wYXN0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wYXN0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkN2U2OTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcGFzdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcGVyc3BlY3RpdmVzLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wZXJzcGVjdGl2ZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThjM2U1Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wZXJzcGVjdGl2ZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlBlcnNwZWN0aXZlcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InBlcnNwZWN0aXZlcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5QZXJzcGVjdGl2ZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InBlcnNwZWN0aXZlcyI+PGEgbmFtZT0icGVyc3BlY3RpdmVzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UGVyc3BlY3RpdmVzPC9oMT4KLTxkaXY+PHA+QSBQZXJzcGVjdGl2ZSBkZWZpbmVzIGEgc2V0IG9mIHZpZXdzIGFuZCBmdW5jdGlvbnMgYXZhaWxhYmxlIGZvciBzcGVjaWZpYwotdGFza3MuIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgY29udGFpbnMgdHdvIHdvcmtpbmcgcGVyc3BlY3RpdmVzOiBhbgotQXV0aG9yaW5nIFBlcnNwZWN0aXZlIGFuZCBhIEJyb3dzaW5nIFBlcnNwZWN0aXZlLjwvcD4KLTxwPlRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcKLVBlcnNwZWN0aXZlPC9hPiBwcm92aWRlcyB2aWV3cyBhbmQgZnVuY3Rpb25zIHRvIG5hdmlnYXRlIGFuZCBhdXRob3IgbWV0aG9kCi1jb250ZW50IGFuZCBwcm9jZXNzZXMsIHdoaWxlIHRoZSA8YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT4sIGFzIGl0cyBuYW1lIGltcGxpZXMsIGFsbG93cyB5b3UKLXRvIHByZXZpZXcgYW5kIG5hdmlnYXRlIHRocm91Z2ggYSA8YSBocmVmPSJtZXRob2Rjb25maWd1cmF0aW9ucy5odG1sI21ldGhvZGNvbmZpZ3VyYXRpb25zIj5NZXRob2QgQ29uZmlndXJhdGlvbjwvYT4gd2l0aG91dCBtYWtpbmcgYW55IGNoYW5nZXMuPC9wPgotPHA+VG8gc2VsZWN0IGEgcGVyc3BlY3RpdmUsIGNsaWNrIHRoZSBPcGVuIFBlcnNwZWN0aXZlIGJ1dHRvbiA8aW1nIHNyYz0ib3BlbnBlcnNwLkpQRyIgYWx0PSIiIC8+LjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sI3VzZXJpbnRlcmZhY2VvdmVydmlldyIgdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiI+VG9vbCBJbnRlcmZhY2U8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcGhhc2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3BoYXNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMmZlYTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcGhhc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlBoYXNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InBoYXNlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlBoYXNlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJwaGFzZSI+PGEgbmFtZT0icGhhc2UiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5QaGFzZTwvaDE+Ci08ZGl2PjxwPkEgUGhhc2UgaXMgYSBzcGVjaWFsIHR5cGUgb2YgYWN0aXZpdHkgdGhhdCByZXByZXNlbnRzIGEgc2lnbmlmaWNhbnQKLXBlcmlvZCBpbiBhIHByb2plY3QsIGVuZGluZyB3aXRoIGEgbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUKLW9yIHNldCBvZiBkZWxpdmVyYWJsZXMuPC9wPgotPC9kaXY+Ci08ZGl2PjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJhY3RpY2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ByYWN0aWNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzRjYTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJhY3RpY2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlByYWN0aWNlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InByYWN0aWNlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlByYWN0aWNlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJwcmFjdGljZSI+PGEgbmFtZT0icHJhY3RpY2UiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5QcmFjdGljZTwvaDE+Ci08ZGl2PjxwPkEgcHJhY3RpY2UgcmVwcmVzZW50cyBhIHByb3ZlbiB3YXkgb3Igc3RyYXRlZ3kgb2YgZG9pbmcgd29yayB0byBhY2hpZXZlCi1hIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gUHJhY3RpY2VzCi1hcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gVGhleSBjb3VsZCBzdW1tYXJpemUgYXNwZWN0cwotdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiBFeGFtcGxlcwotZm9yIHByYWN0aWNlcyB3b3VsZCBiZSBtYW5hZ2Ugcmlza3MsIGNvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSwgYXJjaGl0ZWN0dXJlCi1jZW50cmljLCBhbmQgY29tcG9uZW50IGJhc2VkIGRldmVsb3BtZW50LCB0byBuYW1lIGEgZmV3LjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ByZXZpZXcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ByZXZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhNGY5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcmV2aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJQcmV2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InByZXZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+UHJldmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icHJldmlldyI+PGEgbmFtZT0icHJldmlldyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlByZXZpZXc8L2gxPgotPGRpdj48cD5QcmV2aWV3IGRpc3BsYXlzIHlvdXIgY29udGVudCBpbiBicm93c2VyIGZvcm1hdCBzaW1pbGFyIHRvCi1ob3cgaXQgd2lsbCBhcHBlYXIgdG8gYW4gZW5kIHVzZXIgYnJvd3NpbmcgYSBwdWJsaXNoZWQgV2ViIHNpdGUuPC9wPgotPC9kaXY+Ci08ZGl2PjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2F1dGguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2F1dGguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmY4ZTg4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2NhdXRoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3MuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJmYzgyYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJQcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCNwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbCNjcmVhdGVhZGVsaXZlcnlwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InByb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+UHJvY2VzczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icHJvY2VzcyI+PGEgbmFtZT0icHJvY2VzcyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlByb2Nlc3M8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5BIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5wcm9jZXNzPC9zcGFuPiBkZXNjcmliZXMgaG93IGEgcGFydGljdWxhciBwaWVjZQotb2Ygd29yayBzaG91bGQgYmUgZG9uZS4gVGhlIHdvcmsgbWF5IGhhdmUgYSByZWxhdGl2ZWx5IHNtYWxsIHNjb3BlLCBpbiB3aGljaAotY2FzZSBpdCBjYW4gYmUgZGVzY3JpYmVkIGFzIGEgY2FwYWJpbGl0eSBwYXR0ZXJuLCBvciBtYXkgYWRkcmVzcyBhIGZ1bGwgcHJvamVjdAotbGlmZWN5Y2xlLCBpbiB3aGljaCBjYXNlIGl0IGNhbiBiZSBkZXNjcmliZWQgYXMgYSBkZWxpdmVyeSBwcm9jZXNzLiBBIHByb2Nlc3MKLWNhbiByZXVzZSBtZXRob2QgZWxlbWVudHMgYW5kIGNvbWJpbmVzIHRoZW0gaW50byBhIHN0cnVjdHVyZSBhbmQgc2VxdWVuY2UKLWZvciBjYXJyeWluZyBvdXQgd29yay48L3A+Ci08cD5UaGVyZSBhcmUgdHdvIG1haW4gdHlwZXMgb2YgcHJvY2VzcywgYSA8YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+IGFuZAotYSA8YSBocmVmPSJkZWxpdmVyeXByb2Nlc3MuaHRtbCNkZWxpdmVyeXByb2Nlc3MiPkRlbGl2ZXJ5IFByb2Nlc3M8L2E+LgotQSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgYSBzcGVjaWFsIHByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyCi1vZiBhY3Rpdml0aWVzIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLCB3aGlsZSBhIGRlbGl2ZXJ5IHByb2Nlc3MgZGVzY3JpYmVzCi1hIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgdHlwZSBvZiBwcm9qZWN0LjwvcD4KLTxwPkVhY2gKLXRpbWUgYSB0YXNrIGlzIGluY2x1ZGVkIGluIGEgcHJvY2VzcywgYSByZWZlcmVuY2Ugb2JqZWN0IHRvIHRoYXQgdGFzayBpcyBjcmVhdGVkCi1pbiB0aGUgY29udGV4dCBvZiB0aGUgcHJvY2Vzcy4gVGhpcyBpcyBjYWxsZWQgYSB0YXNrIGRlc2NyaXB0b3IuIFRoZSBzYW1lCi10YXNrIGNhbiBiZSByZWZlcmVuY2VkIGFueSBudW1iZXIgb2YgdGltZXMgaW4gdGhlIHNhbWUgcHJvY2Vzcy4gSW4gb3RoZXIgd29yZHMsCi1vbmUgdGFzayBjYW4gaGF2ZSBtYW55IHRhc2sgZGVzY3JpcHRvcnMuIEEgdGFzayBkZXNjcmlwdG9yIGNhbiBhbHNvIG1vZGlmeQotdGhlIGJhc2UgdGFzayB3aXRob3V0IGFjdHVhbGx5IGNoYW5naW5nIHRoZSB0YXNrLiBGb3IgZXhhbXBsZSwgcm9sZXMgYW5kIHdvcmsKLXByb2R1Y3RzIGNhbiBiZSBhZGRlZCBvciBzdXBwcmVzc2VkLCBhbmQgc3RlcHMgY2FuIGJlIHN1cHByZXNzZWQgb3IgcmUtc2VxdWVuY2VkLjwvcD4KLTxwPlJvbGVzCi1hbmQgd29yayBwcm9kdWN0cyBjYW4gYWxzbyBiZSBpbmNsdWRlZCBpbiBwcm9jZXNzZXMgYXMgcm9sZSBkZXNjcmlwdG9ycyBhbmQKLXdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycy4gUm9sZXMgYW5kIHdvcmsgcHJvZHVjdHMgY2FuIGJlIGN1c3RvbWl6ZWQgdG8gZml0Ci13aXRoIHRoZSBjb250ZW50IG9mIHRoZSBwcm9jZXNzIGluIHdoaWNoIHRoZXkgYXJlIHVzZWQuPC9wPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCNwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXciPlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbCNjcmVhdGVhZGVsaXZlcnlwcm9jZXNzIj5DcmVhdGUgYSBEZWxpdmVyeSBQcm9jZXNzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuIj5DcmVhdGUgYSBSZXVzYWJsZSBDYXBhYmlsaXR5IFBhdHRlcm48L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVjY2I0Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJQcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icHJvY2Vzcy5odG1sI3Byb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbCNjcmVhdGVhZGVsaXZlcnlwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJwcm9jZXNzLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXciPjxhIG5hbWU9InByb2Nlc3NhdXRob3JpbmdvdmVydmlldyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3PC9oMT4KLTxkaXY+PHA+QSBkZXZlbG9wbWVudCBwcm9jZXNzIGRlZmluZXMgc2VxdWVuY2VzIG9mIHRhc2tzIHBlcmZvcm1lZCBieSByb2xlcyBhbmQKLXdvcmsgcHJvZHVjdHMgcHJvZHVjZWQgb3ZlciB0aW1lLiA8L3A+Ci08cD48aW1nIHNyYz0icHJvY2F1dGguZ2lmIiBhbHQ9IiIgLz48L3A+Ci08cD5Qcm9jZXNzZXMgYXJlIHR5cGljYWxseSBleHByZXNzZWQgYXMgd29ya2Zsb3dzIG9yIGJyZWFrZG93bgotc3RydWN0dXJlcy4gRGVmaW5pbmcgYSBzdHJpY3Qgc2VxdWVuY2UgYXMgaW4gYSB3YXRlcmZhbGwgbW9kZWwgaXMgYXMgbXVjaAotYSBwcm9jZXNzIGFzIGRlZmluaW5nIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgaW4gaXRlcmF0aW9ucyBvZiBwYXJhbGxlbCB3b3JrLgotVGhleSBqdXN0IHJlcHJlc2VudCBkaWZmZXJlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2hlcy4gSGVuY2UsIGZvciBkZWZpbmluZwotYSBwcm9jZXNzLCBvbmUgY2FuIHRha2UgbWV0aG9kIGNvbnRlbnQgYW5kIGNvbWJpbmUgaXQgaW50byBzdHJ1Y3R1cmVzIHRoYXQKLXNwZWNpZnkgaG93IHRoZSB3b3JrIHNoYWxsIGJlIG9yZ2FuaXplZCBvdmVyIHRpbWUsIHRvIG1lZXQgdGhlIG5lZWRzIG9mIGEKLXBhcnRpY3VsYXIgdHlwZSBvZiBkZXZlbG9wbWVudCBwcm9qZWN0IChzdWNoIGFzIHNvZnR3YXJlIGZvciBhIG9ubGluZSBzeXN0ZW0KLXZlcnN1cyBzb2Z0d2FyZSBhbmQgaGFyZHdhcmUgZm9yIGFuIGVtYmVkZGVkIHN5c3RlbSkuIEVQRiBDb21wb3NlciBzdXBwb3J0cyBwcm9jZXNzZXMKLWJhc2VkIG9uIGRpZmZlcmVudCBkZXZlbG9wbWVudCBhcHByb2FjaGVzIGFjcm9zcyBtYW55IGRpZmZlcmVudCBsaWZlY3ljbGUKLW1vZGVscywgaW5jbHVkaW5nIHdhdGVyZmFsbCwgaW5jcmVtZW50YWwsIGFuZCBpdGVyYXRpdmUgbGlmZWN5Y2xlcy4gRVBGIENvbXBvc2VyIGFsc28KLXN1cHBvcnRzIGRpZmZlcmVudCBwcmVzZW50YXRpb25zIGZvciBwcm9jZXNzLCBzdWNoIGFzIHdvcmstYnJlYWtkb3duIHN0cnVjdHVyZQotb3Igd29ya2Zsb3cgcHJlc2VudGF0aW9ucy4gWW91IGNhbiBhbHNvIGRlZmluZSBwcm9jZXNzZXMgaW4gRVBGIENvbXBvc2VyIHRoYXQgdXNlIGEKLW1pbmltYWwgc2V0IG9mIG1ldGhvZCBjb250ZW50IHRvIGRlZmluZSBwcm9jZXNzZXMgZm9yIGFnaWxlLCBzZWxmLW9yZ2FuaXppbmcKLXRlYW1zLjwvcD4KLTxwPlRoZSBFUEYgQ29tcG9zZXIgc2NyZWVuIGNhcHR1cmUgYWJvdmUgc2hvd3MgYW4gZXhhbXBsZSBvZiBhIHByb2Nlc3MgcHJlc2VudGVkIGFzCi1hIGJyZWFrZG93biBzdHJ1Y3R1cmUgb2YgbmVzdGVkIGFjdGl2aXRpZXMgYXMgd2VsbCBhcyBhIHdvcmtmbG93IG9yIGFjdGl2aXR5Ci1kaWFncmFtIGZvciBvbmUgcGFydGljdWxhciBhY3Rpdml0eSwgdGhlIGluY2VwdGlvbiBwaGFzZS4gSXQgYWxzbyBpbmRpY2F0ZXMKLXdpdGggdGhlIHR3byBibHVlIGFycm93cyB0aGF0IHRoZSBwYXJ0aWN1bGFyIG1ldGhvZCBjb250ZW50IHRhc2sgIkRldGFpbCBhCi1Vc2UgQ2FzZSIgaGFzIGJlZW4gYXBwbGllZCBpbiB0aGUgcHJvY2VzcyB0d2ljZTsgZmlyc3RseSBpbiB0aGUgaW5jZXB0aW9uCi1waGFzZSB1bmRlciB0aGUgYWN0aXZpdHkgIkRlZmluZSB0aGUgU3lzdGVtLCIgYW5kIHNlY29uZGx5LCBpbiB0aGUgZWxhYm9yYXRpb24KLXBoYXNlIGluIHRoZSBhY3Rpdml0eSAiUmVmaW5lIHRoZSBzeXN0ZW0gZGVmaW5pdGlvbiIuIFlvdSBzZWUgYmVsb3cgZWFjaCBvZgotdGhlc2UgdGFzayBhcHBsaWNhdGlvbnMsIHJlZmVycmVkIHRvIGFzIGEgdGFzayBkZXNjcmlwdG9ycyBpbiBFUEYgQ29tcG9zZXIsIGxpc3RzIG9mCi10aGUgcGVyZm9ybWluZyByb2xlcyBhcyB3ZWxsIGFzIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuIElmIHlvdQotbG9vayBjbG9zZWx5LCB5b3Ugc2VlIHRoYXQgdGhlc2UgbGlzdHMgYXJlIGRpZmZlcmVudCBmb3IgZWFjaCBvZiB0aGVzZSB0d28KLXRhc2sgZGVzY3JpcHRvcnMsIGV4cHJlc3NpbmcgZGlmZmVyZW5jZXMgaW4gcGVyZm9ybWluZyB0aGUgIkRldGFpbCBhIFVzZSBDYXNlIgotbWV0aG9kIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZS4gWW91IHNlZSBkaWZmZXJlbnQgcm9sZXMgaW52b2x2ZWQgYW5kIGNoYW5nZXMKLWluIHRoZSBsaXN0IG9mIGlucHV0cyB0byBiZSBjb25zaWRlcmVkIGFuZCBvdXRwdXRzIHRvIGJlIHByb2R1Y2VkIG9yIHVwZGF0ZWQuCi1UaGVzZSBjaGFuZ2VzIHdlcmUgZGVmaW5lZCBieSB0aGUgYXV0aG9yIHRoYXQgY3JlYXRlZCB0aGlzIHByb2Nlc3MgdG8gZXhwcmVzcwotdGhlIGV4YWN0IGZvY3VzIG9mIHRoZSB0YXNrIHBlcmZvcm1hbmNlIGZvciBlYWNoIG9jY3VycmVuY2UuIEluIGFkZGl0aW9uIHRvCi11cGRhdGluZyB0aGUgcm9sZXMsIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cyBmb3IgYSB0YXNrIGRlc2NyaXB0b3IsCi15b3UgY2FuIGFsc28gcHJvdmlkZSBhZGRpdGlvbmFsIHRleHR1YWwgZGVzY3JpcHRpb25zIGFzIHdlbGwgYXMgZGVmaW5lIHRoZQotZXhhY3Qgc3RlcHMgb2YgdGhlIHRhc2sgdGhhdCBzaG91bGQgYW5kIHNob3VsZCBub3QgYmUgcGVyZm9ybWVkIGZvciB0aGlzIHBhcnRpY3VsYXIKLW9jY3VycmVuY2Ugb2YgdGhlIHRhc2suIDwvcD4KLTxwPkVQRiBDb21wb3NlciBwcm92aWRlcyB5b3Ugd2l0aCBhIHByb2Nlc3MgZWRpdG9yIHRoYXQgc3VwcG9ydHMgZGlmZmVyZW50IGJyZWFrZG93bgotc3RydWN0dXJlIHZpZXdzIGFzIHdlbGwgYXMgZ3JhcGhpY2FsIHByb2Nlc3MgcHJlc2VudGF0aW9ucy4gQXMgYSBwcm9jZXNzIGF1dGhvciwKLXlvdSB0eXBpY2FsbHkgc3RhcnQgYnkgY3JlYXRpbmcgYW4gYWN0aXZpdHkgYnJlYWtkb3duLCBkaXZpZGluZyBhbmQgYnJlYWtpbmcKLXlvdXIgcHJvY2VzcyBkb3duIGludG8gcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgaGlnaC1sZXZlbCBhY3Rpdml0aWVzLiBJbnN0ZWFkCi1vZiBjcmVhdGluZyB5b3VyIGFjdGl2aXRpZXMgaW4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZWRpdG9yLCB5b3UgY2FuIGFsdGVybmF0aXZlbHkKLXdvcmsgaW4gYSBncmFwaGljYWwgYWN0aXZpdHkgZGlhZ3JhbSBlZGl0b3IgdGhhdCBhbGxvd3MgeW91IHRvIGdyYXBoaWNhbGx5Ci1jcmVhdGUgYSB3b3JrZmxvdyBmb3IgeW91ciBhY3Rpdml0aWVzLiBUbyBhc3NpZ24gbWV0aG9kIGNvbnRlbnQgdG8geW91ciBwcm9jZXNzLAoteW91IHRoZW4gaGF2ZSB0aGUgY2hvaWNlIG9mIHdvcmtpbmcgaW4gZGlmZmVyZW50IHByb2Nlc3Mgdmlld3MgKHdvcmsgYnJlYWtkb3duCi1zdHJ1Y3R1cmUsIHdvcmsgcHJvZHVjdCB1c2FnZSwgb3IgdGVhbSBhbGxvY2F0aW9uIHZpZXcpLiBFYWNoIHZpZXcgc3VwcG9ydHMKLWEgZGlmZmVyZW50IGFwcHJvYWNoIGZvciBjcmVhdGluZyBhIHByb2Nlc3MuIFlvdSBjYW4gZGVmaW5lIHRoZSB3b3JrIHRvIGJlCi1kb25lLCBkZWZpbmUgdGhlIHJlc3VsdHMgdG8gYmUgcHJvZHVjZWQsIG9yIGRlZmluZSByZXNwb25zaWJpbGl0aWVzIGZvciB5b3VyCi1yb2xlcy4gSWYgcmVxdWVzdGVkLCB0aGUgZWRpdG9yIHVwZGF0ZXMgdGhlIG90aGVyIHByb2Nlc3Mgdmlld3Mgc2VtaS1hdXRvbWF0aWNhbGx5Ci11c2luZyB3aXphcmRzIHRoYXQgcHJvbXB0IHlvdSBmb3IgZGVjaXNpb25zIG9uIHNlbGVjdGluZyBtZXRob2QgY29udGVudCBlbGVtZW50cy4gPC9wPgotPC9kaXY+Ci08ZGl2PgotPHVsIGNsYXNzPSJ1bGxpbmtzIj4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0icHJvY2Vzcy5odG1sIj5Qcm9jZXNzPC9hPjwvc3Ryb25nPjxiciAvPgotPC9saT4KLTwvdWw+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InByb2Nlc3MuaHRtbCNwcm9jZXNzIj5Qcm9jZXNzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4iPkNyZWF0ZSBhIFJldXNhYmxlIENhcGFiaWxpdHkgUGF0dGVybjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2NyZWF0ZWFkZWxpdmVyeXByb2Nlc3MiPkNyZWF0ZSBhIERlbGl2ZXJ5IFByb2Nlc3M8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzc2VsZW1lbnRwcm9wZXJ0aWVzdmlldy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzc2VsZW1lbnRwcm9wZXJ0aWVzdmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTE0MmVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJQcm9jZXNzIEVsZW1lbnQgUHJvcGVydGllcyBWaWV3IiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InByb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+UHJvY2VzcyBFbGVtZW50IFByb3BlcnRpZXMgVmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icHJvY2Vzc2VsZW1lbnRwcm9wZXJ0aWVzdmlldyI+PGEgbmFtZT0icHJvY2Vzc2VsZW1lbnRwcm9wZXJ0aWVzdmlldyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlByb2Nlc3MgRWxlbWVudCBQcm9wZXJ0aWVzIFZpZXc8L2gxPgotPGRpdj48cD5XaGVuIHlvdSBhcmUgZWRpdGluZyBhIHByb2Nlc3MsIHRoZSBwcm9jZXNzIGVsZW1lbnQgcHJvcGVydGllcyB2aWV3IGFsbG93cwoteW91IHRvIGVkaXQgYWxsIHRoZSBkZXRhaWxzIGZvciBhIHNpbmdsZSBlbGVtZW50IGluIHRoZSBwcm9jZXNzLiBJZiB5b3UgY2xpY2sKLWluIGFueSByb3cgaW4gYSBwcm9jZXNzIGRpc3BsYXksIHlvdSB3aWxsIHNlZSB0aGUgZnVsbCBkZXRhaWxzIG9mIHRoZSBwcm9jZXNzCi1lbGVtZW50IGluIHRoZSByb3cgaW4gdGhlIHByb3BlcnRpZXMgdmlldy48L3A+Ci08cD5JZiB0aGUgcHJvcGVydGllcyB2aWV3IGlzIG5vdCBvcGVuLCByaWdodCBjbGljayBhbnkgcm93IGluIGEgcHJvY2VzcyBhbmQKLXNlbGVjdCA8c3Ryb25nPlNob3cgUHJvcGVydGllcyBWaWV3PC9zdHJvbmc+LjwvcD4KLTxwPlRoZSBwcm9wZXJ0aWVzIHZpZXcgaXMgdGhlIGVkaXRvciBmb3IgYWN0aXZpdGllcywgdGFzayBkZXNjcmlwdG9ycywgcm9sZXMKLWRlc2NyaXB0b3JzLCBhbmQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzLiBUaGUgaW5mb3JtYXRpb24gZm9yCi1hIGRlc2NyaXB0b3IgaXMgc2ltaWxhciB0byB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QgZWxlbWVudCBlZGl0b3IsIGJ1dCBpdAotYWxzbyBoYXMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgZWxlbWVudCBpbiB0aGUgcHJvY2Vzcy4gVGhlIHByb2Nlc3MgaW5mb3JtYXRpb24KLWlzIGFsc28gZGlzcGxheWVkIGluIHRoZSBjb3JyZXNwb25kaW5nIHJvdyBpbiB0aGUgcHJvY2VzcyBkaXNwbGF5LjwvcD4KLTxwPjxzdHJvbmc+R2VuZXJhbCBJbmZvcm1hdGlvbiB0YWI6PC9zdHJvbmc+PC9wPgotPHA+VGhlIE5hbWUgYW5kIFByZXNlbnRhdGlvbiBOYW1lIGRlZmF1bHQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbmFtZXMgaW4gdGhlCi1iYXNlIG1ldGhvZCBlbGVtZW50LiBUaGVzZSBuYW1lcyBjYW4gYmUgY2hhbmdlZCBpbiBhIGRlc2NyaXB0b3IuPC9wPgotPGRpdiBjbGFzcz0icCI+VGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSB1c2VkIHRvIHNwZWNpZnkgY2VydGFpbiBhc3BlY3RzIG9mIHRoZSBlbGVtZW50Ci1pbiB0aGUgcHJvY2VzcyBhbmQgY2FuIGJlIHNldCBmb3IgYWxsIHR5cGVzIG9mIHByb2Nlc3MgZWxlbWVudHM6PHVsPjxsaT48c3Ryb25nPk9wdGlvbmFsPC9zdHJvbmc+OiBJZiB0aGlzIGlzIGNoZWNrZWQgKHRydWUpLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZWxlbWVudAotaXMgY29uc2lkZXJlZCBvcHRpb25hbCBpbiB0aGUgcHJvY2Vzcy4gVGhpcyBtZWFucyB0aGF0IGl0IGlzIHNhZmUgdG8gcmVtb3ZlCi10aGUgZWxlbWVudC4gSWYgdGhpcyBpcyBub3QgY2hlY2tlZCAoZmFsc2UpLCB0aGUgZWxlbWVudCBpcyBjb25zaWRlcmVkIG1hbmRhdG9yeQotYW5kIHNob3VsZCBub3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBwcm9jZXNzLjwvbGk+Ci08bGk+PHN0cm9uZz5NdWx0aXBsZSBPY2N1cnJlbmNlczwvc3Ryb25nPjogSWYgdGhpcyBpcyBjaGVja2VkICh0cnVlKSwgaXQgaW5kaWNhdGVzIHRoYXQKLXdoZW4gdGhlIHByb2Nlc3MgaXMgaW5zdGFudGlhdGVkIGFzIGEgcHJvamVjdCBvciBvdGhlciBwcm9jZXNzLCBpdCBpcyBleHBlY3RlZAotdGhhdCB0aGVyZSB3aWxsIGJlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mIHRoaXMgZWxlbWVudC4gSWYgdGhpcyBpcyBub3QgY2hlY2tlZAotKGZhbHNlKSwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlcmUgc2hvdWxkIG9ubHkgYmUgYSBzaW5nbGUgb2NjdXJyZW5jZSBvZiB0aGlzCi1lbGVtZW50IHdoZW4gdGhlIHByb2Nlc3MgaXMgaW5zdGFudGlhdGVkLjwvbGk+Ci08bGk+PHN0cm9uZz5QbGFubmVkPC9zdHJvbmc+OiBJZiB0aGlzIGlzIGNoZWNrZWQgKHRydWUpLCB0aGUgZWxlbWVudCB3aWxsIGJlIGluY2x1ZGVkCi1pbiBhbiBleHBvcnQgdG8gYSBwcm9qZWN0IG1hbmFnZW1lbnQgdG9vbC4gSWYgdGhpcyBpcyBub3QgY2hlY2tlZCAoZmFsc2UpLAotaXQgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gYW4gZXhwb3J0LjwvbGk+Ci08bGk+PHN0cm9uZz5TdXBwcmVzc2VkPC9zdHJvbmc+OiBJZiB0aGlzIGlzIGNoZWNrZWQgKHRydWUpLCB0aGUgZWxlbWVudCB3aWxsIG5vdCBhcHBlYXIKLWluIGEgcHVibGlzaGVkIHByb2Nlc3MuIFRoaXMgaXMgdXN1YWxseSB1c2VkIHRvIG1vZGlmeSBhIGNhcGFiaWxpdHkgcGF0dGVybgotaW5jbHVkZWQgaW4gYSBwcm9jZXNzLiBUaGlzIGlzIG5vdCBjaGVja2VkIChmYWxzZSkgYXMgZGVmYXVsdC48L2xpPgotPC91bD4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+VGhlIGZvbGxvd2luZyBlbGVtZW50cyBjYW4gYmUgc2V0IGZvciB0YXNrIGRlc2NyaXB0b3JzIGFuZCBhY3Rpdml0aWVzOjx1bD48bGk+PHN0cm9uZz5FdmVudCBEcml2ZW48L3N0cm9uZz46IElmIHRoaXMgaXMgY2hlY2tlZCAodHJ1ZSksIGl0IGluZGljYXRlcyB0aGF0IHRoZQotdGFzayBvciBhY3Rpdml0eSB3aWxsIGJlIGluaXRpYXRlZCB3aGVuIGEgcGFydGljdWxhciBldmVudCBvY2N1cnMuIElmIHRoaXMKLWlzIG5vdCBjaGVja2VkIChmYWxzZSksIGl0IGluZGljYXRlcyB0aGF0IHRoZSB0YXNrIG9yIGFjdGl2aXR5IHdpbGwgYmUgaW5pdGlhdGVkCi1iYXNlZCBvbiBvdGhlciB0YXNrcyBpbiB0aGUgcHJvY2Vzcy48L2xpPgotPGxpPjxzdHJvbmc+T25nb2luZzwvc3Ryb25nPjogSWYgdGhpcyBpcyBjaGVja2VkICh0cnVlKSwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIHRhc2sKLW9yIGFjdGl2aXR5IGlzIGNvbnRpbnVvdXMuIElmIHRoaXMgaXMgbm90IGNoZWNrZWQgKGZhbHNlKSwgaXQgaW5kaWNhdGVzIHRoYXQKLXRoZSB0YXNrIG9yIGFjdGl2aXR5IGhhcyBhIGNsZWFyIHN0YXJ0IGFuZCBmaW5pc2ggaW4gdGhlIHByb2Nlc3MuPC9saT4KLTxsaT48c3Ryb25nPlJlcGVhdGFibGU8L3N0cm9uZz46IElmIHRoaXMgaXMgY2hlY2tlZCAodHJ1ZSksIGl0IGluZGljYXRlcyB0aGF0IHRoZSB0YXNrCi1vciBhY3Rpdml0eSBjYW4gaXRlcmF0ZSB3aGVuIHRoZSBwcm9jZXNzIGlzIGluc3RhbnRpYXRlZC4gSWYgdGhpcyBpcyBub3QgY2hlY2tlZAotKGZhbHNlKSwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIHRhc2sgb3IgYWN0aXZpdHkgd2lsbCBvbmx5IG9jY3VyIG9uY2UgaW4gdGhlCi1wcm9jZXNzLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08cD5EZXBlbmRlbmN5IEZpZWxkOiBZb3UgY2FuIGFkZCBvbmUgb3IgbW9yZSBkZXBlbmRlbmNpZXMgZm9yIGEgdGFzayBvciBhY3Rpdml0eS4KLUNsaWNrIHRoZSA8c3Ryb25nPkFkZC4uLjwvc3Ryb25nPiBidXR0b24gYW5kIGVudGVyIHRoZSBpbmRleCBudW1iZXIgZm9yIHRoZSB0YXNrIG9yCi1hY3Rpdml0eSBvbiB3aGljaCB0aGUgY3VycmVudCBlbGVtZW50IGlzIGRlcGVuZGVudC4gVGhlIGRlcGVuZGVuY3kgKHR5cGUpCi1kZWZhdWx0cyB0byBGaW5pc2gtdG8tU3RhcnQuIElmIHlvdSB3YW50IHRvIHNldCBhbm90aGVyIGRlcGVuZGVuY3kgdHlwZSwgY2xpY2sKLXRoZSA8c3Ryb25nPkVkaXQ8L3N0cm9uZz4gYnV0dG9uIGFuZCBzZWxlY3QgdGhlIHJlcXVpcmVkIGRlcGVuZGVuY3kgdHlwZSBpbiB0aGUgZGVwZW5kZW5jeQotZHJvcCBkb3duIGJveC4gWW91IGNhbiBlbnRlciBhIGRpZmZlcmVudCBpbmRleCBudW1iZXIgb24gdGhlIEVkaXQgZGlhbG9nLgotWW91IGNhbiBhbHNvIHJlbW92ZSBhIGRlcGVuZGVuY3kgYnkgc2VsZWN0aW5nIHRoZSBkZXBlbmRlbmN5IGFuZCBjbGlja2luZwotdGhlIDxzdHJvbmc+UmVtb3ZlPC9zdHJvbmc+IGJ1dHRvbi48L3A+Ci08cD5UaGUgYmFzZSBtZXRob2QgZWxlbWVudCBmb3IgdGhlIGRlc2NyaXB0b3IgaXMgZGlzcGxheWVkIG9uIHRoZSBwYWdlLiBZb3UKLWNhbiBzZWxlY3QgYSBkaWZmZXJlbnQgZWxlbWVudCBieSBjbGlja2luZyB0aGUgPHN0cm9uZz5MaW5rIE1ldGhvZCBFbGVtZW50PC9zdHJvbmc+IGJ1dHRvbgotYW5kIHNlbGVjdGluZyB0aGUgcmVxdWlyZWQgZWxlbWVudC48L3A+Ci08cD48c3Ryb25nPkRvY3VtZW50YXRpb24gdGFiOjwvc3Ryb25nPjwvcD4KLTxwPlRoZSBkb2N1bWVudGF0aW9uIHRhYiBjb250YWlucyBkZXNjcmlwdGl2ZSBhdHRyaWJ1dGVzIGZvciB0aGUgZGVzY3JpcHRvcgotb3IgYWN0aXZpdHkuPC9wPgotPHA+PHN0cm9uZz5Sb2xsLVVwIHRhYnM6PC9zdHJvbmc+PC9wPgotPHA+VGhlIHByb3BlcnRpZXMgdmlldyBmb3IgYW4gYWN0aXZpdHkgaW5jbHVkZXMgcm9sbC11cCB0YWJzIHRoYXQgcHJvdmlkZQotbGlzdHMgb2YgdGFza3MsIHJvbGVzLCBvciB3b3JrIHByb2R1Y3RzICJyb2xsZWQgdXAiLCBvciBzdW1tYXJpemVkLCBmb3IgdGhlCi1hY3Rpdml0eS48L3A+Ci08cD48c3Ryb25nPkFzc29jaWF0aW9uIHRhYnM6PC9zdHJvbmc+PC9wPgotPHA+VGhlIHJlbWFpbmluZyB0YWJzIGFyZSB1c2VkIHRvIGFkZCBvciByZW1vdmUgYXNzb2NpYXRpb25zIGJldHdlZW4gdGhlIGFjdGl2aXR5Ci1vciBkZXNjcmlwdG9yIHRvIG1ldGhvZCBlbGVtZW50cy48L3A+Ci08L2Rpdj4KLTxkaXY+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wdWIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHViLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcyNTQ3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wdWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wdWJsaXNoaW5nYW1ldGhvZGNvbmZpZ3VyYXRpb250b2FtZXRob2R3ZWIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyOWE1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wdWJsaXNoaW5nYW1ldGhvZGNvbmZpZ3VyYXRpb250b2FtZXRob2R3ZWIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlB1Ymxpc2hpbmcgYSBNZXRob2QgQ29uZmlndXJhdGlvbiB0byBhIE1ldGhvZCBXZWIiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InB1Ymxpc2hpbmdvdmVydmlldy5odG1sI3B1Ymxpc2hpbmdvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZXhwb3J0YXByb2Nlc3Nvcm1ldGhvZGNvbnRlbnR0b2FwbGFubmluZ3Rvb2wuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCNtZXRob2Rjb25maWd1cmF0aW9ucyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJwdWJsaXNoaW5nYW1ldGhvZGNvbmZpZ3VyYXRpb250b2FtZXRob2R3ZWIiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+UHVibGlzaGluZyBhIE1ldGhvZCBDb25maWd1cmF0aW9uIHRvIGEgTWV0aG9kIFdlYjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViIj48YSBuYW1lPSJwdWJsaXNoaW5nYW1ldGhvZGNvbmZpZ3VyYXRpb250b2FtZXRob2R3ZWIiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5QdWJsaXNoaW5nIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24gdG8gYSBNZXRob2QgV2ViPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+VXNpbmcgdGhlIFB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYXRpb24gd2l6YXJkLCB5b3UgY2FuIHNlbGVjdCBmcm9tCi1hIHNlcmllcyBvZiBwdWJsaWNhdGlvbiBvcHRpb25zIHRvIHR1cm4gYSBtZXRob2QgY29uZmlndXJhdGlvbiBpbnRvIGEgcHVibGlzaGVkCi1tZXRob2QgV2ViLjwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gcHVibGlzaCBhIG1ldGhvZCBjb25maWd1cmF0aW9uOjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RnJvbSB0aGUgdG9vbGJhciwgc2VsZWN0IDxzdHJvbmc+Q29uZmlndXJhdGlvbiAmZ3Q7IFB1Ymxpc2g8L3N0cm9uZz4uIFRoZSBQdWJsaXNoCi1NZXRob2QgQ29uZmlndXJhdGlvbiB3aXphcmQgYXBwZWFycy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T24gdGhlIFNlbGVjdCBDb25maWd1cmF0aW9uIHBhZ2UsIHNlbGVjdCB0aGUgY29uZmlndXJhdGlvbiB5b3UKLXdhbnQgdG8gcHVibGlzaCBmcm9tIHRoZSBsaXN0IG9mIG1ldGhvZCBjb25maWd1cmF0aW9ucyBpbiB0aGUgbGlicmFyeSBhbmQKLXRoZW4gY2xpY2sgPHN0cm9uZz5OZXh0PC9zdHJvbmc+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PbiB0aGUgU3BlY2lmeSBQdWJsaXNoaW5nIE9wdGlvbnMgcGFnZTo8L3NwYW4+PHVsPjxsaT5Qcm92aWRlIGEgZGVzdGluYXRpb24gZGlyZWN0b3J5IGZvciB0aGUgcHVibGlzaGVkIFdlYiBzaXRlIGluIHRoZQotUHVibGljYXRpb24gcGF0aCBmaWVsZC48L2xpPgotPGxpPlByb3ZpZGUgYSB0aXRsZSBmb3IgdGhlIHB1Ymxpc2hlZCBtZXRob2Qgd2ViLjwvbGk+Ci08bGk+U2VsZWN0IGEgYmFubmVyIGltYWdlIHRvIHVzZS48L2xpPgotPGxpPlNlbGVjdCBhIGZpbGUgdG8gdXNlIGZvciB0aGUgImFib3V0IiBpbmZvcm1hdGlvbi48L2xpPgotPGxpPlByb3ZpZGUgYSBmZWVkYmFjayBVUkw8L2xpPgotPGxpPkNob29zZSB0byBpbmNsdWRlIGEgZ2xvc3NhcnksIGluZGV4LCBzZWFyY2ggY2FwYWJpbGl0eSBhbmQvb3IgcHJvY2VzcwotdHJlZSBjdXN0b21pemF0aW9uLjwvbGk+Ci08bGk+Q2hvb3NlIHRvIGNoZWNrIHRoYXQgZXh0ZXJuYWwgaHlwZXJsaW5rcyBhcmUgdmFsaWQuPC9saT4KLTxsaT5DaG9vc2UgdG8gcHVibGlzaCBhY3Rpdml0eSBkaWFncmFtcyB0aGF0IGhhdmUgbm90IGJlZW4gZWRpdGVkLCBzdWNoCi1hcyBhY3Rpdml0eSBkaWFncmFtcyB0aGF0IGhhdmUgYmVlbiBnZW5lcmF0ZWQgYnkgdGhlIHRvb2wsIGJ1dCBub3QgbWFudWFsbHkKLWVkaXRlZC48L2xpPgotPC91bD4KLSA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gQ2hvb3NpbmcgdG8gaW5jbHVkZSBlaXRoZXIgdGhlIHNlYXJjaCBjYXBhYmlsaXR5IG9yIHRvIHN1cHBvcnQKLWN1c3RvbWl6YXRpb24gb2YgdGhlIHByb2Nlc3MgdmlldyB3aWxsIGluY2x1ZGUgdGhlIGJyb3dzZXIgYXBwbGV0IGluIHRoZSBwdWJsaXNoZWQKLVdlYiBzaXRlLiBJZiB5b3UgY2hvb3NlIG5vdCB0byBwdWJsaXNoIHdpdGggdGhlIGxhc3QgdHdvIG9wdGlvbnMsIHRoZSBicm93c2VyCi1hcHBsZXQgd2lsbCBub3QgYmUgaW5jbHVkZWQuPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3Ryb25nPkZpbmlzaDwvc3Ryb25nPi4gUHVibGlzaGluZyBpcyBpbml0aWF0ZWQuPC9zcGFuPjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0icHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwjcHVibGlzaGluZ292ZXJ2aWV3Ij5QdWJsaXNoaW5nIE92ZXJ2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJtZXRob2Rjb25maWd1cmF0aW9ucy5odG1sI21ldGhvZGNvbmZpZ3VyYXRpb25zIj5NZXRob2QgQ29uZmlndXJhdGlvbjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3B1Ymxpc2hpbmdvdmVydmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mzk4MGUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3B1Ymxpc2hpbmdvdmVydmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUHVibGlzaGluZyBPdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYW1ldGhvZHZpZXd3aXRoY3VzdG9tY2F0ZWdvcmllcy5odG1sI2NyZWF0ZWFtZXRob2R2aWV3d2l0aGN1c3RvbWNhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InB1Ymxpc2hpbmdhbWV0aG9kY29uZmlndXJhdGlvbnRvYW1ldGhvZHdlYi5odG1sI3B1Ymxpc2hpbmdhbWV0aG9kY29uZmlndXJhdGlvbnRvYW1ldGhvZHdlYiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZXhwb3J0YXByb2Nlc3Nvcm1ldGhvZGNvbnRlbnR0b2FwbGFubmluZ3Rvb2wuaHRtbCNleHBvcnRhcHJvY2Vzc29ybWV0aG9kY29udGVudHRvYXBsYW5uaW5ndG9vbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJwdWJsaXNoaW5nb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+UHVibGlzaGluZyBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icHVibGlzaGluZ292ZXJ2aWV3Ij48YSBuYW1lPSJwdWJsaXNoaW5nb3ZlcnZpZXciPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5QdWJsaXNoaW5nIE92ZXJ2aWV3PC9oMT4KLTxkaXY+PHA+VGhlIHVsdGltYXRlIG91dHB1dCBvZiBFUEYgQ29tcG9zZXIgaXMgYSBwdWJsaXNoZWQgV2ViIHNpdGUgd2l0aCBtZXRob2QKLWd1aWRhbmNlIGFuZCBwcm9jZXNzZXMgdGhhdCBjYW4gYmUgdXNlZCBieSBhIHByb2plY3QgdGVhbS4gVGhlIGluZm9ybWF0aW9uCi1jb250YWluZWQgaW4gdGhlIFdlYiBzaXRlIHByb3ZpZGVzIGEgcHJvamVjdCB0ZWFtIHdpdGggYSBjb25zaXN0ZW50IG1ldGhvZAotZm9yIHRoZSBlbnRpcmUgdGVhbSB0byBmb2xsb3cgYW5kIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlIGVuZC10by1lbmQKLXdvcmsgbGlmZWN5Y2xlLiA8L3A+Ci08cD5JdCBpcyBlYXN5IHRvIGNvbmZpZ3VyZSBhIHByb2Nlc3MgZm9yIGEgcGFydGljdWxhciB0eXBlIG9yIHNpemUgb2YgcHJvamVjdAotYW5kIHRvIHB1Ymxpc2ggdGhlIGd1aWRhbmNlIHRvIGEgV2ViIHNpdGUuIEEgTWV0aG9kIENvbmZpZ3VyYXRpb24gaXMgYSBzZWxlY3Rpb24KLW9mIENvbnRlbnQgUGFja2FnZXMgYWNyb3NzIGRpZmZlcmVudCBNZXRob2QgUGx1Zy1pbnMgY29udGFpbmluZyB0aGUgbWV0aG9kCi1hbmQgcHJvY2VzcyBjb250ZW50IHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgcHVibGlzaGVkIFdlYiBzaXRlLiBBdCBwdWJsaXNoaW5nCi10aW1lLCB0aGUgY29uZmlndXJhdGlvbiBpcyBjb21iaW5lZCB3aXRoIGRpZmZlcmVudCBNZXRob2QgVmlld3Mgd2hpY2ggZGVmaW5lCi10aGUgV2ViIHNpdGUncyBuYXZpZ2F0aW9uIHN0cnVjdHVyZXMgYW5kIGNvbnRlbnQgb3JnYW5pemF0aW9uLjwvcD4KLTxwPlRoZSBCcm93c2luZyBQZXJzcGVjdGl2ZSByZW5kZXJzIHRoZSBNZXRob2QgQ29uZmlndXJhdGlvbiBjb250ZW50IGluIEhUTUwKLWZvcm1hdCB3aXRoaW4gdGhlIHRvb2wsIHByb3ZpZGluZyBhIG5hdmlnYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0aG9kCi1vciBwcm9jZXNzIGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb25maWd1cmF0aW9uLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFtZXRob2R2aWV3d2l0aGN1c3RvbWNhdGVnb3JpZXMuaHRtbCNjcmVhdGVhbWV0aG9kdmlld3dpdGhjdXN0b21jYXRlZ29yaWVzIj5DcmVhdGUgYSBNZXRob2QgVmlldyB3aXRoIEN1c3RvbSBDYXRlZ29yaWVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJwdWJsaXNoaW5nYW1ldGhvZGNvbmZpZ3VyYXRpb250b2FtZXRob2R3ZWIuaHRtbCNwdWJsaXNoaW5nYW1ldGhvZGNvbmZpZ3VyYXRpb250b2FtZXRob2R3ZWIiPlB1Ymxpc2hpbmcgYSBNZXRob2QgQ29uZmlndXJhdGlvbiB0byBhIE1ldGhvZCBXZWI8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmVwbGFjZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmVwbGFjZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2VlMmYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JlcGxhY2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlJlcGxhY2VzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJleHRlbmRzLmh0bWwjZXh0ZW5kcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY29udHJpYnV0ZXMuaHRtbCNjb250cmlidXRlcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJyZXBsYWNlcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5SZXBsYWNlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icmVwbGFjZXMiPjxhIG5hbWU9InJlcGxhY2VzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UmVwbGFjZXM8L2gxPgotPGRpdj48cD5BIHJlcGxhY2luZyBlbGVtZW50IHJlcGxhY2VzIHBhcnRzIG9mIHRoZSBiYXNlIGVsZW1lbnQuIFJlcGxhY2VzIHByb3ZpZGVzCi1hIHdheSBmb3IgYW4gZWxlbWVudCB0byByZXBsYWNlIGEgYmFzZSBlbGVtZW50IHdpdGhvdXQgZGlyZWN0bHkgY2hhbmdpbmcgYW55Ci1vZiB0aGUgYmFzZSBlbGVtZW50J3MgZXhpc3RpbmcgcHJvcGVydGllcy4gVGhpcyBpcywgaW4gbW9zdCBjYXNlcywgdXNlZCBmb3IKLW1ldGhvZCBwbHVnLWlucyB0aGF0IGFpbSB0byByZXBsYWNlIHNwZWNpZmljIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyByb2xlcywKLXRhc2tzLCBvciBhY3Rpdml0aWVzIHdpdGggZWl0aGVyIGEgY29tcGxldGVseSBuZXcgdmFyaWFudCBvciB0byBjaGFuZ2UgdGhlCi1mdW5kYW1lbnRhbCByZWxhdGlvbnNoaXBzIG9mIHRoZXNlIGVsZW1lbnRzLiBUaGUgZWZmZWN0IG9mIHRoaXMsIGlzIHRoYXQgdGhlCi1iYXNlIGNvbnRlbnQgZWxlbWVudCBpcyBsb2dpY2FsbHkgcmVwbGFjZWQgd2l0aCB0aGUgbmV3IHJlcGxhY2luZyBlbGVtZW50Ci10byB3aGljaCBhbGwgaW5jb21pbmcgYXNzb2NpYXRpb25zIHN0aWxsIHBvaW50IGFzIGJlZm9yZSwgYnV0IHdoaWNoIGhhcyBwb3RlbnRpYWxseQotbmV3IGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIG91dGdvaW5nIGFzc29jaWF0aW9uIHByb3BlcnRpZXMuPC9wPgotPHA+VXNlIHRoZSBDb250ZW50IFZhcmlhYmlsaXR5IHNlY3Rpb24gb24gdGhlIERlc2NyaXB0aW9uIHRhYiB0byBtYWtlIGFuIGVsZW1lbnQKLXJlcGxhY2UgYW5vdGhlciBlbGVtZW50LiBTZWxlY3QgPHN0cm9uZz5SZXBsYWNlczwvc3Ryb25nPiBhcyB0aGUgdmFyaWFiaWxpdHkgdHlwZSBhbmQKLXNlbGVjdCB0aGUgYmFzZSBlbGVtZW50IHRoYXQgdGhpcyBlbGVtZW50IHdpbGwgcmVwbGFjZS4gVGhlIGJhc2UgZWxlbWVudCBtdXN0Ci1iZSB0aGUgc2FtZSB0eXBlIG9mIGVsZW1lbnQgYXMgdGhlIHJlcGxhY2luZyBlbGVtZW50LjwvcD4KLTxwPldoZW4geW91IHJlcGxhY2UgYW4gZWxlbWVudCwgYWxsIHRoZSBkZXNjcmlwdGlvbiBhdHRyaWJ1dGVzIGFyZSByZXBsYWNlZAotYnkgdGhlIHJlcGxhY2luZyBlbGVtZW50LiBJZiBhIGRlc2NyaXB0aW9uIGF0dHJpYnV0ZSBpbiB0aGUgcmVwbGFjaW5nIGVsZW1lbnQKLWlzIGJsYW5rLCBidXQgdGhlIGJhc2UgZWxlbWVudCBoYXMgY29udGVudCwgdGhlIGF0dHJpYnV0ZSB3aWxsIGJlIGJsYW5rIGluCi10aGUgcmVzdWx0aW5nIGVsZW1lbnQuPC9wPgotPHA+UmVwbGFjZSBhbHdheXMgcmVwbGFjZXMgYXR0cmlidXRlcyBhbmQgYXNzb2NpYXRpb25zIG9mIHRoZSBiYXNlIGVsZW1lbnQKLXdpdGggdGhlIHJlcGxhY2luZyBlbGVtZW50J3MgYXR0cmlidXRlcyBhbmQgYXNzb2NpYXRpb25zLCBleGNlcHQgZm9yIGluY29taW5nCi1hc3NvY2lhdGlvbnMsIHdoaWNoIGFyZSBvbmx5IGFkZGVkIHRvIHRoZSBiYXNlLCBidXQgZG8gbm90IHJlcGxhY2UgdGhlIGJhc2UncwotaW5jb21pbmcgYXNzb2NpYXRpb25zLjwvcD4KLTxkaXYgY2xhc3M9InAiPjxzdHJvbmc+UmVwbGFjZXMgcnVsZXM6PC9zdHJvbmc+PHVsPjxsaT5BdHRyaWJ1dGVzIG9mIHRoZSBiYXNlIGVsZW1lbnQgYXJlIHJlcGxhY2VkIHdpdGggYXR0cmlidXRlcyBvZiB0aGUgcmVwbGFjaW5nCi1lbGVtZW50IGluY2x1ZGluZyBpZGVudGlmaWVyIG9mIHRoZSBiYXNlIGVsZW1lbnQuPC9saT4KLTxsaT5PdXRnb2luZyB0by1vbmUgYW5kIHRvLW1hbnkgYXNzb2NpYXRpb25zIG9mIHRoZSByZXBsYWNpbmcgZWxlbWVudCByZXBsYWNlCi1hbnkgb3V0Z29pbmcgYXNzb2NpYXRpb25zIG9mIHRoZSBiYXNlIGVsZW1lbnQuIElmIHRoZSBjb250cmlidXRvciBkb2VzIG5vdAotaGF2ZSBhbnkgb3V0Z29pbmcgYXNzb2NpYXRpb25zLCB0aGVuIG5laXRoZXIgd2lsbCB0aGUgcmVzdWx0aW5nIGVsZW1lbnQuPC9saT4KLTxsaT5JbmNvbWluZyBhc3NvY2lhdGlvbnMgd2l0aCBhIHRvLW1hbnkgY29uc3RyYWludCBvbiB0aGUgb3RoZXIgYXNzb2NpYXRpb24KLWVuZCB0byB0aGUgcmVwbGFjZWQgZWxlbWVudCBhcmUgcHJlc2VydmVkIGFuZCBhdWdtZW50ZWQgd2l0aCBpbmNvbWluZyBhc3NvY2lhdGlvbnMKLW9mIHRoZSByZXBsYWNpbmcgZWxlbWVudC48L2xpPgotPGxpPkluY29taW5nIGFzc29jaWF0aW9ucyB3aXRoIGEgdG8tb25lIGNvbnN0cmFpbnQgb24gdGhlIG90aGVyIGFzc29jaWF0aW9uCi1lbmQgdG8gdGhlIHJlcGxhY2VkIGVsZW1lbnQgYXJlIHJlcGxhY2VkIHdpdGggdGhlIHJlc3BlY3RpdmUgaW5jb21pbmcgYXNzb2NpYXRpb24KLW9mIHRoZSByZXBsYWNpbmcgZWxlbWVudC4gSWYgdGhlIHJlcGxhY2luZyBlbGVtZW50IGRvZXMgbm90IGhhdmUgc3VjaCBhbiBhc3NvY2lhdGlvbgotdGhlbiB0aGUgcmVzdWx0aW5nIGVsZW1lbnQga2VlcHMgdGhlIGluY29taW5nIGFzc29jaWF0aW9uIG9mIHRoZSBiYXNlIGVsZW1lbnQuPC9saT4KLTxsaT5BIGJhc2UgZWxlbWVudCBvZiBhIHJlcGxhY2VtZW50IGNhbiBoYXZlIG9ubHkgb25lIHJlcGxhY2luZyBlbGVtZW50IHBlcgotY29uZmlndXJhdGlvbi4gSWYgbW9yZSB0aGFuIG9uZSByZXBsYWNpbmcgZWxlbWVudCBpcyBwcmVzZW50LCBubyByZXBsYWNlbWVudAotdGFrZXMgcGxhY2UuPC9saT4KLTxsaT5SZXBsYWNlbWVudCB3b3JrcyB0cmFuc2l0aXZlbHksIGkuZS4gaWYgYSByZXBsYWNpbmcgZWxlbWVudCBpcyByZXBsYWNlZAotaXRzZWxmLCB0aGUgZmluYWwgcmVwbGFjZXIgcHJldmFpbHMuPC9saT4KLTxsaT5Db250cmlidXRpb24gcHJlY2VkZXMgUmVwbGFjZW1lbnQsIGkuZS4gY29udHJpYnV0aW9uIGlzIGV2YWx1YXRlZCBmaXJzdAotYW5kIHRoZW4gcmVwbGFjZW1lbnQgcGVyZm9ybWVkIGFmdGVyd2FyZC4gVGhlIGV2YWx1YXRpb24gb2YgY29udHJpYnV0aW9uIGFuZAotcmVwbGFjZW1lbnQgaXMgcGVyZm9ybWVkIHRvcC1kb3duIGluIHRoZSBzcGVjaWFsaXphdGlvbiBoaWVyYXJjaHkuPC9saT4KLTwvdWw+Ci1TZWUgPGEgaHJlZj0idmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMuaHRtbCN2YXJpYWJpbGl0eWFzc29jaWF0aW9ucyI+VmFyaWFiaWxpdHkgQXNzb2NpYXRpb25zPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgYXNzb2NpYXRpb25zIGZvciBlYWNoIGVsZW1lbnQKLXR5cGUuPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiB0aXRsZT0iVmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlIG9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZyB0aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuIj5WYXJpYWJpbGl0eTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iZXh0ZW5kcy5odG1sI2V4dGVuZHMiPkV4dGVuZHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNvbnRyaWJ1dGVzLmh0bWwjY29udHJpYnV0ZXMiPkNvbnRyaWJ1dGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JlcG9ydC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmVwb3J0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNTNhMmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmVwb3J0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJSZXBvcnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icmVwb3J0IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlJlcG9ydDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icmVwb3J0Ij48YSBuYW1lPSJyZXBvcnQiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5SZXBvcnQ8L2gxPgotPGRpdj48cD5BIFJlcG9ydCBpcyBhIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlCi1iYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uCi1Gb3IgZXhhbXBsZSwgYSByZXBvcnQgbWF5IGNvbWJpbmUgYSBncmFwaGljYWwgbW9kZWwgZnJvbSBhIGRlc2lnbiB0b29sIHdpdGgKLXRleHR1YWwgaW5mb3JtYXRpb24gZG9jdW1lbnRzIGludG8gYSByZXBvcnQuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmV1c2FibGVhc3NldC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmV1c2FibGVhc3NldC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTAxMTRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JldXNhYmxlYXNzZXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlJldXNhYmxlIEFzc2V0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InJldXNhYmxlYXNzZXQiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+UmV1c2FibGUgQXNzZXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJldXNhYmxlYXNzZXQiPjxhIG5hbWU9InJldXNhYmxlYXNzZXQiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5SZXVzYWJsZSBBc3NldDwvaDE+Ci08ZGl2PjxwPkEgcmV1c2FibGUgYXNzZXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4KLVRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcgaG93IHRoZQotYXNzZXQgc2hvdWxkIGJlIHVzZWQuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmljaHRleHRlZGl0b3IuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JpY2h0ZXh0ZWRpdG9yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YzFhNDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmljaHRleHRlZGl0b3IuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlJpY2ggVGV4dCBFZGl0b3IiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icmljaHRleHRlZGl0b3IiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+UmljaCBUZXh0IEVkaXRvcjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icmljaHRleHRlZGl0b3IiPjxhIG5hbWU9InJpY2h0ZXh0ZWRpdG9yIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UmljaCBUZXh0IEVkaXRvcjwvaDE+Ci08ZGl2PjxwPlRoZSBSaWNoIFRleHQgRWRpdG9yIHByb3ZpZGVzIHNpbXBsZSB0ZXh0IGZvcm1hdHRpbmcgZnVuY3Rpb25zCi10aGF0IGFsbG93IGFuIGF1dGhvciB0byBjaGFuZ2UgaG93IHNlY3Rpb25zIG9mIHRleHQgYXBwZWFyIGluIGEgcHVibGlzaGVkCi1XZWIgc2l0ZS4gVGhlIFJpY2ggVGV4dCBFZGl0b3IgYWxsb3dzIGluZGl2aWR1YWwgY29tcG9uZW50cyBvZiB0ZXh0IHRvIGJlCi1jaGFuZ2VkIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGUgb3ZlcmFsbCBzdHlsZSBzaGVldChzKSB0aGF0IGRldGVybWluZSB0aGUKLXN0eWxlIGFuZCBmb3JtYXQgb2YgYSBwdWJsaXNoZWQgV2ViIHNpdGUuPC9wPgotPGRpdiBjbGFzcz0icCI+VGhlIFJpY2ggVGV4dCBFZGl0b3IgYWxsb3dzIHlvdSB0bzo8dWw+PGxpPkNvcHksIGN1dCBhbmQgcGFzdGUgdGV4dC4gU2ltcGx5IGhpZ2hsaWdodCB0aGUgdGV4dCB5b3Ugd2FudCB0byBjdXQgb3IKLWNvcHkgYW5kIHRoZW4gY2xpY2sgdGhlIEN1dCA8aW1nIHNyYz0iY3V0LmdpZiIgYWx0PSIiIC8+IG9yIENvcHkgPGltZyBzcmM9ImNvcHkuZ2lmIiBhbHQ9IiIgLz4gYnV0dG9ucy4gVG8gcGFzdGUgdGV4dCwgcGxhY2UgdGhlIGN1cnNvcgotd2hlcmUgeW91IHdhbnQgdG8gaW5jbHVkZSB0aGUgdGV4dCBhbmQgdGhlbiBjbGljayB0aGUgUGFzdGUgYnV0dG9uIDxpbWcgc3JjPSJwYXN0ZS5naWYiIGFsdD0iIiAvPi48L2xpPgotPGxpPlJlbW92ZSBhbGwgdGhlIGNvbnRlbnRzIGluIHRoZSB0ZXh0IGVkaXRvciB3aW5kb3cgYXQgb25jZSBieSBjbGlja2luZwotdGhlIENsZWFyIENvbnRlbnQgYnV0dG9uIDxpbWcgc3JjPSJjbGVhcmNvbnRlbnQuZ2lmIiBhbHQ9IiIgLz4uPC9saT4KLTxsaT5DaGFuZ2UgdGhlIGFwcGVhcmFuY2Ugb2YgeW91ciB0ZXh0IGJ5IG1ha2luZyBpdCBib2xkLCBpdGFsaWNpemVkLCBvciB1bmRlcmxpbmluZwotaXQuIEhpZ2hsaWdodCB0aGUgdGV4dCB5b3Ugd2FudCB0byBjaGFuZ2UgYW5kIHRoZW4gY2xpY2sgdGhlIEJvbGQgPGltZyBzcmM9ImJvbGQuZ2lmIiBhbHQ9IiIgLz4sIEl0YWxpY3MgPGltZyBzcmM9Iml0YWxpYy5naWYiIGFsdD0iIiAvPiwKLW9yIFVuZGVybGluZSA8aW1nIHNyYz0idW5kZXJsaW5lLmdpZiIgYWx0PSIiIC8+IGJ1dHRvbi48L2xpPgotPGxpPkNyZWF0ZSBTdXBlciBvciBTdWIgc2NyaXB0IGJ5IGNsaWNraW5nIHRoZSBTdXBlcnNjcmlwdCA8aW1nIHNyYz0ic3VwZXJzY3JpcHQuZ2lmIiBhbHQ9IiIgLz4gb3IgU3Vic2NyaXB0IDxpbWcgc3JjPSJzdWJzY3JpcHQuZ2lmIiBhbHQ9IiIgLz4gYnV0dG9ucy48L2xpPgotPGxpPkFkZCBudW1iZXJlZCBvciBidWxsZXRlZCBsaXN0cyB1c2luZyB0aGUgb3JkZXJlZCA8aW1nIHNyYz0iYWRkb3JkbGlzdF9jby5naWYiIGFsdD0iIiAvPiBvciB1bm9yZGVyZWQgbGlzdCA8aW1nIHNyYz0iYWRkdW5vcmRsaXN0X2NvLmdpZiIgYWx0PSIiIC8+IGJ1dHRvbnMuPC9saT4KLTxsaT5JbmRlbnQgb3IgT3V0ZGVudCB0ZXh0IHVzaW5nIHRoZSBJbmRlbnQgPGltZyBzcmM9ImluZGVudC5naWYiIGFsdD0iIiAvPiBvciBPdXRkZW50IDxpbWcgc3JjPSJvdXRkZW50LmdpZiIgYWx0PSIiIC8+IGJ1dHRvbnMuPC9saT4KLTxsaT5GaW5kIGFuZCByZXBsYWNlIHRleHQuIENsaWNrIHRoZSBGaW5kL1JlcGxhY2UgYnV0dG9uIDxpbWcgc3JjPSJmaW5kcmVwbGFjZS5naWYiIGFsdD0iIiAvPi4gVGhlIEZpbmQvUmVwbGFjZSBkaWFsb2cgYm94IGFwcGVhcnMuIFR5cGUgdGhlIHRleHQgeW91Ci13YW50IHRvIGZpbmQgaW4gdGhlIEZpbmQgZmllbGQgYW5kLCBpZiB5b3UgYXJlIHJlcGxhY2luZyB0aGF0IHRleHQsIHR5cGUgdGhlCi1yZXBsYWNlbWVudCB0ZXh0IGluIHRoZSBSZXBsYWNlIHdpdGggZmllbGQuIFlvdSBjYW4gc2VhcmNoIGZvcndhcmQgb3IgYmFjawotYW5kIHNwZWNpZnkgd2hldGhlciB5b3Ugd2FudCB5b3VyIHNlYXJjaCB0byBiZSBjYXNlIHNlbnNpdGl2ZSBvciBzZWFyY2ggZm9yCi1vbmx5IHBhcnRzIG9mIHdvcmRzLjwvbGk+Ci08bGk+QWRkIG9yIGNyZWF0ZSBoeXBlcmxpbmtzIHVzaW5nIHRoZSBBZGQgbGluayBidXR0b24gPGltZyBzcmM9ImFkZGxpbmtfY28uZ2lmIiBhbHQ9IiIgLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8YSBocmVmPSJhZGRhcmVmZXJlbmNlb3JoeXBlcmxpbmsuaHRtbCNhZGRhcmVmZXJlbmNlb3JoeXBlcmxpbmsiPkFkZCBhIFJlZmVyZW5jZSBvciBIeXBlcmxpbms8L2E+LjwvbGk+Ci08bGk+QWRkIGltYWdlcy4gQ2xpY2sgdGhlIEFkZCBJbWFnZSBidXR0b24gPGltZyBzcmM9ImFkZGltZ19jby5naWYiIGFsdD0iIiAvPi4gVGhlIEFkZCBJbWFnZSBkaWFsb2cgYm94IGFwcGVhcnMuIEJyb3dzZSBmb3IgdGhlIGltYWdlIHlvdSdkIGxpa2UKLXRvIGFkZCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LjwvbGk+Ci08bGk+QWRkIHRhYmxlcy4gQ2xpY2sgdGhlIEFkZCBUYWJsZSBidXR0b24gPGltZyBzcmM9ImFkZHRhYmxlX2NvLmdpZiIgYWx0PSIiIC8+LiBUaGUgQWRkIFRhYmxlIGRpYWxvZyBib3ggYXBwZWFycy4gU3BlY2lmeSB0aGUgdGFibGUgcGFyYW1ldGVycwotYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi48L2xpPgotPC91bD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9hZG1hcC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9hZG1hcC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTk5YmQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JvYWRtYXAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlJvYWRtYXAiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icm9hZG1hcCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Sb2FkbWFwPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyb2FkbWFwIj48YSBuYW1lPSJyb2FkbWFwIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Um9hZG1hcDwvaDE+Ci08ZGl2PjxwPkEgUm9hZG1hcCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBkZXNjcmliZXMgaG93IGEgcHJvY2VzcyBpcwotdHlwaWNhbGx5IHBlcmZvcm1lZC4gT2Z0ZW4gcHJvY2VzcyBjYW4gYmUgbXVjaCBlYXNpZXIgdW5kZXJzdG9vZCBieSBwcm92aWRpbmcKLWEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhlIHByb2Nlc3MuCi1JbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlCi1wcm9jZXNzIGlzIGJlaW5nIHBlcmZvcm1lZCwgYSByb2FkbWFwIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQKLWhvdyBhY3Rpdml0aWVzIGFuZCB0YXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuIDwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JvbGUuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JvbGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhYmQ5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2xlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJSb2xlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhcm9sZS5odG1sI2NyZWF0ZWFyb2xlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InJvbGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Um9sZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icm9sZSI+PGEgbmFtZT0icm9sZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlJvbGU8L2gxPgotPGRpdj48cD5BIFJvbGUgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcwotb2YgYW4gaW5kaXZpZHVhbCBvciBpbmRpdmlkdWFscy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhcm9sZS5odG1sI2NyZWF0ZWFyb2xlIj5DcmVhdGUgYSBSb2xlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JvbGVzZXQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JvbGVzZXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzliYmMxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2xlc2V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJSb2xlIFNldCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJyb2xlc2V0IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlJvbGUgU2V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyb2xlc2V0Ij48YSBuYW1lPSJyb2xlc2V0Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Um9sZSBTZXQ8L2gxPgotPGRpdj48cD5BIFJvbGUgU2V0IGlzIHVzZWQgdG8gZ3JvdXAgPGEgaHJlZj0icm9sZS5odG1sI3JvbGUiPlJvbGVzPC9hPiB3aXRoCi1jZXJ0YWluIGNvbW1vbmFsaXRpZXMgdG9nZXRoZXIuIEZvciBleGFtcGxlLCBpbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IGVudmlyb25tZW50LAotYW4gQW5hbHlzdCByb2xlIHNldCBjb3VsZCBiZSB1c2VkIHRvIGdyb3VwIHRvZ2V0aGVyIHJvbGVzIHN1Y2ggYXMgQnVzaW5lc3MKLVByb2Nlc3MgQW5hbHlzdCwgU3lzdGVtIEFuYWx5c3QgYW5kIFJlcXVpcmVtZW50cyBTcGVjaWZpZXIuIEVhY2ggb2YgdGhlc2UKLXJvbGVzIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgbWF5IGJlCi1yZXNwb25zaWJsZSBmb3IgcGVyZm9ybWluZyBjZXJ0YWluIHRhc2tzIGFuZCBjcmVhdGluZyBjZXJ0YWluIHdvcmsgcHJvZHVjdHMuCi1Sb2xlIHNldHMgY2FuIGJlIG9yZ2FuaXplZCB1c2luZyBSb2xlIFNldCBHcm91cGluZ3MuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyI+TWV0aG9kIENvbnRlbnQgQ2F0ZWdvcmllczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2xlc2V0Z3JvdXBpbmcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JvbGVzZXRncm91cGluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzc1ZmIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JvbGVzZXRncm91cGluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUm9sZSBTZXQgR3JvdXBpbmciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InJvbGVzZXQuaHRtbCNyb2xlc2V0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJyb2xlLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFyb2xlLmh0bWwjY3JlYXRlYXJvbGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icm9sZXNldGdyb3VwaW5nIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlJvbGUgU2V0IEdyb3VwaW5nPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyb2xlc2V0Z3JvdXBpbmciPjxhIG5hbWU9InJvbGVzZXRncm91cGluZyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlJvbGUgU2V0IEdyb3VwaW5nPC9oMT4KLTxkaXY+PHA+Um9sZSBzZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIHJvbGUgc2V0IGdyb3VwaW5ncy4gRm9yIGV4YW1wbGUsIGRpZmZlcmVudAotbWV0aG9kIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cyB3aGljaCwgaG93ZXZlciwgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkCi1mcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywKLWZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgc2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50Ci1Pcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0icm9sZXNldC5odG1sI3JvbGVzZXQiPlJvbGUgU2V0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJyb2xlLmh0bWwiPlJvbGU8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXJvbGUuaHRtbCNjcmVhdGVhcm9sZSI+Q3JlYXRlIGEgUm9sZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zZWFyY2hmb3JtZXRoY29udC5KUEcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zZWFyY2hmb3JtZXRoY29udC5KUEcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YzUwZGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc2VhcmNoZm9ybWV0aGNvbnQuSlBHCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc2VhcmNoZm9ybWV0aG9kY29udGVudC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc2VhcmNoZm9ybWV0aG9kY29udGVudC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGQyNTU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3NlYXJjaGZvcm1ldGhvZGNvbnRlbnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlNlYXJjaCBmb3IgTWV0aG9kIENvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJicm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InNlYXJjaGZvcm1ldGhvZGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+U2VhcmNoIGZvciBNZXRob2QgQ29udGVudDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ic2VhcmNoZm9ybWV0aG9kY29udGVudCI+PGEgbmFtZT0ic2VhcmNoZm9ybWV0aG9kY29udGVudCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNlYXJjaCBmb3IgTWV0aG9kIENvbnRlbnQ8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBTZWFyY2ggZm9yIE1ldGhvZCBDb250ZW50OjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VGhlcmUgYXJlIHRocmVlIHdheXMgdG8gYmVnaW4geW91ciBzZWFyY2ggZm9yIG1ldGhvZCBjb250ZW50Ljwvc3Bhbj48dWw+PGxpPlNlbGVjdCA8c3Ryb25nPlNlYXJjaCAmZ3Q7IFNlYXJjaDwvc3Ryb25nPjwvbGk+Ci08bGk+PHN0cm9uZz5TZWFyY2ggJmd0OyBGaWxlPC9zdHJvbmc+PC9saT4KLTxsaT5DbGljayB0aGUgU2VhcmNoIGJ1dHRvbiA8c3BhbiBjbGFzcz0idWljb250cm9sIj48aW1nIHNyYz0ic2VhcmNoZm9ybWV0aGNvbnQuSlBHIiBhbHQ9IiIgLz48L3NwYW4+IGluIHRoZSB0b29sIGJhci48L2xpPgotPC91bD4KLSBUaGUgU2VhcmNoIGRpYWxvZyB3aW5kb3cgb3BlbnMuPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgZWl0aGVyIHRoZSA8c3Ryb25nPkZpbGUgU2VhcmNoPC9zdHJvbmc+IHRhYiBvciB0aGUgPHN0cm9uZz5NZXRob2QgU2VhcmNoPC9zdHJvbmc+IHRhYgotYW5kIHRoZW4gc2V0IHlvdXIgY3JpdGVyaWEuIFVzaW5nIHRoZSA8c3Ryb25nPkZpbGUgU2VhcmNoPC9zdHJvbmc+IHRhYiwgeW91IGNhbiBzZWFyY2gKLWZvciBjb250ZW50IGJ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIGNvbnRlbnQuIFVzaW5nIHRoZSA8c3Ryb25nPk1ldGhvZCBTZWFyY2g8L3N0cm9uZz4gdGFiLAoteW91IGNhbiBzZWFyY2ggdGhlIG1ldGhvZCBjb250ZW50IGl0c2VsZi48L3NwYW4+PHVsPjxsaT48c3Ryb25nPlVzaW5nIEZpbGUgU2VhcmNoPC9zdHJvbmc+OiBUeXBlIGEgdGV4dCBzdHJpbmcgdG8gc2VhcmNoIGZvciB3aXRoaW4KLXRoZSBmaWxlcyAob3B0aW9uYWwpLCBvciB0eXBlIGEgZmlsZSBuYW1lIHBhdHRlcm4gdG8gdXNlIGZvciBtYXRjaGluZyBmaWxlCi1uYW1lcy4gWW91IG11c3QgdXNlIGEgcGF0dGVybi4gVXNlICogaWYgeW91IHdhbnQgdG8gc2VhcmNoIGZvciB0aGUgdGV4dCBpbgotYWxsIGZpbGVzLiBMZWF2ZSBhbGwgb3RoZXIgb3B0aW9ucyBhcyBkZWZhdWx0LjwvbGk+Ci08bGk+PHN0cm9uZz5Vc2luZyBNZXRob2QgU2VhcmNoPC9zdHJvbmc+OiBUeXBlIGEgdGV4dCBzdHJpbmcgdG8gc2VhcmNoIGZvciB3aXRoaW4KLXRoZSBmaWxlcyAob3B0aW9uYWwpLCBvciB0eXBlIGEgbmFtZSBwYXR0ZXJuIGZvciBtYXRjaGluZyBlbGVtZW50IG5hbWVzIGFuZAotcHJlc2VudGF0aW9uIG5hbWVzLiBZb3UgbXVzdCB1c2UgYSBwYXR0ZXJuLiBVc2UgKiBpZiB5b3Ugd2FudCB0byBzZWFyY2ggZm9yCi10ZXh0IGluIGFsbCBmaWxlcy4gSW4gdGhlIFNjb3BlIHNlY3Rpb24sIHlvdSBjYW4gcmVzdHJpY3QgeW91ciBzZWFyY2ggdG8gYQotc3Vic2V0IG9mIGVsZW1lbnQgdHlwZXMuPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3Ryb25nPlNlYXJjaDwvc3Ryb25nPi4gVGhlIFNlYXJjaCBWaWV3IG9wZW5zIHdpdGggeW91ciBzZWFyY2ggcmVzdWx0cy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFNlYXJjaCBWaWV3LCB5b3UgY2FuIGRyaWxsIGRvd24gaW50byB0aGUgc2VhcmNoIHJlc3VsdHMKLWFuZCBkb3VibGUtY2xpY2sgYW4gZWxlbWVudCB0byBvcGVuIHRoZSBlZGl0b3IgZm9yIHRoZSBzZWxlY3RlZCBlbGVtZW50LiBJZgoteW91IGhhdmUgTGluayB3aXRoIEVkaXRvciBzZWxlY3RlZCBpbiB0aGUgbGlicmFyeSB2aWV3LCB0aGUgbGlicmFyeSB2aWV3IGRpc3BsYXkKLWNoYW5nZXMgdG8gc2hvdyB5b3Ugd2hlcmUgdGhlIHNlbGVjdGVkIGVsZW1lbnQgaXMgaW4gdGhlIGxpYnJhcnkuPC9zcGFuPjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sIiB0aXRsZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6Ij5Ub29sIEludGVyZmFjZTwvYT48L2Rpdj4KLTxkaXYgY2xhc3M9InByZXZpb3VzbGluayI+PHN0cm9uZz5QcmV2aW91cyB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbCI+QnJvd3NlIGFuZCBQcmV2aWV3IE1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPk1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N0YW5kYXJkbWV0aG9kbGlicmFyeW92ZXJ2aWV3Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdGFuZGFyZG1ldGhvZGxpYnJhcnlvdmVydmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWJhZWFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N0YW5kYXJkbWV0aG9kbGlicmFyeW92ZXJ2aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTdGFuZGFyZCBNZXRob2QgTGlicmFyeSBPdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBtZXRob2QgcGx1Zy1pbnMgYW5kIG1ldGhvZCBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiBBbGwgbWV0aG9kIGVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBtZXRob2QgbGlicmFyeS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgbWV0aG9kIHBsdWctaW5zIGFuZCBtZXRob2QgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gQWxsIG1ldGhvZCBlbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgbWV0aG9kIGxpYnJhcnkuIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InN0YW5kYXJkbWV0aG9kbGlicmFyeW92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlN0YW5kYXJkIE1ldGhvZCBMaWJyYXJ5IE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJzdGFuZGFyZG1ldGhvZGxpYnJhcnlvdmVydmlldyI+PGEgbmFtZT0ic3RhbmRhcmRtZXRob2RsaWJyYXJ5b3ZlcnZpZXciPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TdGFuZGFyZCBNZXRob2QgTGlicmFyeSBPdmVydmlldzwvaDE+Ci08ZGl2PjxwPkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIG1ldGhvZCBwbHVnLWlucyBhbmQKLW1ldGhvZCBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiBBbGwgbWV0aG9kIGVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBtZXRob2QKLWxpYnJhcnkuPC9wPgotPHA+TXVjaCBsaWtlIGEgbGlicmFyeSBoYXMgYm9va3MsIGEgbWV0aG9kIGxpYnJhcnkgaGFzIG1ldGhvZCBwbHVnLWlucy4gV2hlcmUKLWEgbGlicmFyeSBib29rIGlzIG1hZGUgdXAgb2Ygc2VjdGlvbnMgb3IgY2hhcHRlcnMgYW5kIGNvbnRlbnQgd2l0aGluIHRob3NlCi1jaGFwdGVycywgPGEgaHJlZj0ibWV0aG9kcGx1Z2luLmh0bWwjbWV0aG9kcGx1Z2luIj5tZXRob2QKLXBsdWctaW5zPC9hPiBhcmUgbWFkZSB1cCBvZiA8YSBocmVmPSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj5tZXRob2QgY29udGVudDwvYT4gYW5kIHByb2Nlc3Nlcy4gTWV0aG9kIGNvbnRlbnQgY29udGFpbnMKLWNvbnRlbnQgcGFja2FnZXMgYW5kIGJvdGggPGEgaHJlZj0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyI+c3RhbmRhcmQgYW5kIGN1c3RvbSBjYXRlZ29yaWVzPC9hPiwgd2hpbGUgcHJvY2Vzc2VzIHN0cnVjdHVyZQotdGhpcyBjb250ZW50IGludG8gcHJvY2VzcyBmcmFnbWVudHMgY2FsbGVkIDxhIGhyZWY9ImNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY2FwYWJpbGl0eXBhdHRlcm4iPmNhcGFiaWxpdHkgcGF0dGVybnM8L2E+IGFuZCBmdWxsIGxpZmVjeWNsZSBwcm9jZXNzZXMgY2FsbGVkIDxhIGhyZWY9ImRlbGl2ZXJ5cHJvY2Vzcy5odG1sIj5kZWxpdmVyeSBwcm9jZXNzZXM8L2E+LjwvcD4KLTxwPkEgbWV0aG9kIGxpYnJhcnkgYWxzbyBoYXMgb25lIG9yIG1vcmUgPGEgaHJlZj0ibWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCNtZXRob2Rjb25maWd1cmF0aW9ucyI+bWV0aG9kIGNvbmZpZ3VyYXRpb25zPC9hPiB0aGF0IGZpbHRlciB0aGUgbGlicmFyeSBhbmQgcHJvdmlkZQotc21hbGxlciB3b3JraW5nIHNldHMgb2YgbGlicmFyeSBjb250ZW50IGZvciB0aGUgZW5kIHVzZXIuPC9wPgotPC9kaXY+Ci08ZGl2PjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3RlcC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3RlcC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWVkMGFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N0ZXAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlN0ZXAiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0ic3RlcCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5TdGVwPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJzdGVwIj48YSBuYW1lPSJzdGVwIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U3RlcDwvaDE+Ci08ZGl2PjxwPkEgU3RlcCBpcyBhIHBhcnQgb2YgdGhlIG92ZXJhbGwgd29yayBkZXNjcmliZWQgZm9yIGEgdGFzay4gVGhlIGNvbGxlY3Rpb24KLW9mIHN0ZXBzIGRlZmluZWQgZm9yIGEgdGFzayByZXByZXNlbnRzIGFsbCB0aGUgd29yayB0aGF0IHNob3VsZCBiZSBkb25lIHRvCi1hY2hpZXZlIHRoZSBvdmVyYWxsIGdvYWwgb2YgdGhlIHRhc2suIE5vdCBhbGwgc3RlcHMgYXJlIG5lY2Vzc2FyaWx5IHBlcmZvcm1lZAotZWFjaCB0aW1lIGEgdGFzayBpcyBpbnZva2VkIGluIGEgcHJvY2Vzcy48L3A+Ci08L2Rpdj4KLTxkaXY+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdWJzY3JpcHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3Vic2NyaXB0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAzM2M4My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdWJzY3JpcHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3VwZXJzY3JpcHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3VwZXJzY3JpcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzY3NWNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N1cGVyc2NyaXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N1cHBvcnRpbmdtYXRlcmlhbC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3VwcG9ydGluZ21hdGVyaWFsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYzZkMTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3VwcG9ydGluZ21hdGVyaWFsLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTdXBwb3J0aW5nIE1hdGVyaWFsIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InN1cHBvcnRpbmdtYXRlcmlhbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5TdXBwb3J0aW5nIE1hdGVyaWFsPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJzdXBwb3J0aW5nbWF0ZXJpYWwiPjxhIG5hbWU9InN1cHBvcnRpbmdtYXRlcmlhbCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2gxPgotPGRpdj48cD5TdXBwb3J0aW5nIE1hdGVyaWFsIGlzIGEgY2F0Y2gtYWxsIGZvciBvdGhlciB0eXBlcyBvZiBndWlkYW5jZQotbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIGNvbnRlbnQKLWVsZW1lbnRzLCBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdGFzay5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdGFzay5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzU1Nzc1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Rhc2suaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF0YXNrLmh0bWwjY3JlYXRlYXRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlRhc2s8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhc2siPjxhIG5hbWU9InRhc2siPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5UYXNrPC9oMT4KLTxkaXY+PHA+QSBUYXNrIGlzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIGEgc3BlY2lmaWMKLVJvbGUuIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMgYW5kCi11c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCB1bWJlciBvZiBXb3JrIFByb2R1Y3RzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF0YXNrLmh0bWwjY3JlYXRlYXRhc2siPkNyZWF0ZSBhIFRhc2s8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCI+Q3JlYXRlIE1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3RlbXBsYXRlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90ZW1wbGF0ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTU3MTEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3RlbXBsYXRlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJUZW1wbGF0ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJ0ZW1wbGF0ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5UZW1wbGF0ZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGVtcGxhdGUiPjxhIG5hbWU9InRlbXBsYXRlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VGVtcGxhdGU8L2gxPgotPGRpdj48cD5BIFRlbXBsYXRlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGEgd29yayBwcm9kdWN0Ci13aXRoIGEgcHJlZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsCi1hIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIG9mIGhvdyB0aGUgc2VjdGlvbnMKLWFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2FuIGJlIHByb3ZpZGVkCi1mb3IgZG9jdW1lbnRzIGFzIHdlbGwgYXMgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdGVybWRlZmluaXRpb24uaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Rlcm1kZWZpbml0aW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNWEzNTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdGVybWRlZmluaXRpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlRlcm0gRGVmaW5pdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJ0ZXJtZGVmaW5pdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5UZXJtIERlZmluaXRpb248L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRlcm1kZWZpbml0aW9uIj48YSBuYW1lPSJ0ZXJtZGVmaW5pdGlvbiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlRlcm0gRGVmaW5pdGlvbjwvaDE+Ci08ZGl2PjxwPlRlcm0gZGVmaW5pdGlvbnMgZGVmaW5lcyBhIHNwZWNpZmljIHRlcm0sIGNvbmNlcHQsIG9yIG90aGVyIGlkZWEgcmVsZXZhbnQKLXRvIG1ldGhvZCBhbmQgcHJvY2VzcyBjb250ZW50LiBBIHRlcm0gZGVmaW5pdGlvbiBpcyBub3QgZGlyZWN0bHkgcmVsYXRlZCB0bwotYW55IGNvbnRlbnQgZWxlbWVudHMsIGJ1dCByZWxhdGlvbnNoaXBzIGFyZSBkZXJpdmVkIHdoZW4gdGhlIHRlcm0gaXMgdXNlZAotaW4gdGhlIGRlc2NyaXB0aW9uIHRleHQgaW4gYSBjb250ZW50IGVsZW1lbnQuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdG9vbG1lbnRvci5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdG9vbG1lbnRvci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTNlZjQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Rvb2xtZW50b3IuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlRvb2wgTWVudG9yIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InRvb2xtZW50b3IiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+VG9vbCBNZW50b3I8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRvb2xtZW50b3IiPjxhIG5hbWU9InRvb2xtZW50b3IiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Ub29sIE1lbnRvcjwvaDE+Ci08ZGl2PjxwPkEgVG9vbCBNZW50b3IgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljCi10b29sIHRvIGFjY29tcGxpc2ggYSBwaWVjZSBvZiB3b3JrLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzEuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOTMwYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgMTogRXhwbG9yZSB0aGUgVXNlciBJbnRlcmZhY2UgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGJlY29tZSBmYW1pbGlhciB3aXRoIHRoZSBtYWpvciBwYXJ0cyBvZiB0aGUgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciB1c2VyIGludGVyZmFjZS4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHBlcnNwZWN0aXZlLiBUaGUgY3VycmVudCBwZXJzcGVjdGl2ZSBpcyBkaXNwbGF5ZWQgbmVhciB0aGUgdG9wIHJpZ2h0IG9mIHRoZSBzY3JlZW4uIFlvdSB3aWxsIHNlZSBlaXRoZXIgQXV0aG9yaW5nIG9yIEJyb3dzaW5nLiBDbGljayBvbiB0aGUgPHN0cm9uZz5PcGVuIFBlcnNwZWN0aXZlPC9zdHJvbmc+IGljb24sIGFuZCBzZWxlY3QgdGhlIG90aGVyIHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5FeHBsb3JlIHRoZSA8c3Ryb25nPkxpYnJhcnk8L3N0cm9uZz4gPHN0cm9uZz5WaWV3PC9zdHJvbmc+LiBUaGUgbGlicmFyeSB2aWV3IGlzIGF2YWlsYWJsZSBpbiBhdXRob3JpbmcgcGVyc3BlY3RpdmUgliBpdCBpcyBub3Qgc2hvd24gaW4gdGhlIGJyb3dzaW5nIHBlcnNwZWN0aXZlLiBUaGUgTGlicmFyeSBWaWV3IHNob3dzIHlvdSBhbGwgdGhlIGNvbnRlbnQgaW4gdGhlIGN1cnJlbnQgbGlicmFyeS4gVGhlIGhpZ2hlc3QgbGV2ZWwgY29udGVudCB1bml0IGlzIGEgcGx1Z2luLiBDbGljayBvbiBzb21lIDxzdHJvbmc+Kzwvc3Ryb25nPiBzaWducyBhbmQgZXhwbG9yZSB0aGUgY29udGVudC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+RHJpbGwgZG93biBpbnRvIGEgcGx1Z2luIGFzIGZvbGxvd3M6IDxzdHJvbmc+TWV0aG9kIENvbnRlbnQgJmd0OyBDb250ZW50IFBhY2thZ2VzICZndDsgW2FueV0gJmd0OyBUYXNrczwvc3Ryb25nPi4gRG91YmxlIGNsaWNrIG9uIGEgdGFzay4gVGhlIFRhc2sgRWRpdG9yIGlzIGRpc3BsYXllZCBvbiB0aGUgcmlnaHQgb2YgdGhlIHNjcmVlbi4gVGhlcmUgYXJlIHNlcGFyYXRlIGVkaXRvcnMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgY29udGVudCB0aGF0IHlvdSBjYW4gY3JlYXRlIGluIGEgbGlicmFyeS4gRWFjaCBlZGl0b3IgaGFzIGEgc2VyaWVzIG9mIHRhYnMgYW5kIGEgbnVtYmVyIG9mIGZvcm0gZWxlbWVudHMgb24gZWFjaCB0YWIuIFlvdSBjYW4gZmluZCBvdXQgbW9yZSBhYm91dCB0aGVzZSBpbiB0aGUgPHU+Q3JlYXRlIE1ldGhvZCBDb250ZW50IDwvdT50dXRvcmlhbC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgdGhlIDxzdHJvbmc+UHJldmlldyA8L3N0cm9uZz4gdGFiLiBBIHByZXZpZXcgb2YgYW4gSFRNTCBwYWdlIGlzIGRpc3BsYXllZC4gVGhpcyBpcyB3aGF0IHRoZSBzZWxlY3RlZCBlbGVtZW50IHdpbGwgbG9vayBsaWtlIGluIGEgcHVibGlzaGVkIHdlYiBzaXRlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggdG8gdGhlIDxzdHJvbmc+YnJvd3NpbmcgcGVyc3BlY3RpdmU8L3N0cm9uZz4uIFRoZSBDb25maWd1cmF0aW9uIFZpZXcgaXMgbm93IGRpc3BsYXllZC4gVGhlIGNvbmZpZ3VyYXRpb24gdmlldyBhbHdheXMgaGFzIHRoZSBzYW1lIHN0cnVjdHVyZSBidXQgdGhlIGNvbnRlbnQgY2hhbmdlcyBiYXNlZCBvbiB3aGljaCBjb25maWd1cmF0aW9uIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4gRHJpbGwgZG93biBpbnRvIHRoZSBEaXNjaXBsaW5lcyBmb2xkZXIgdW50aWwgeW91IGdldCB0byB0YXNrcyBhbmQgY2xpY2sgb24gYSB0YXNrLiBUaGUgSFRNTCBwcmV2aWV3IG9mIHRoZSBzZWxlY3RlZCBpdGVtIGlzIHNob3duIG9uIHRoZSByaWdodCBvZiB0aGUgc2NyZWVuLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggY29uZmlndXJhdGlvbnMuIFRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gaXMgZGlzcGxheWVkIGluIHRoZSBzZWxlY3Rpb24gYm94IGJlbG93IHRoZSBtYWluIG1lbnUgYmFyLiBTZWxlY3QgYSBjb25maWd1cmF0aW9uIGZyb20gdGhlIGRyb3AgZG93biBsaXN0LiBZb3Ugd2lsbCBzZWUgdGhlIENvbmZpZ3VyYXRpb24gVmlldyByZWZyZXNoIHdoZW4geW91IGRvIHRoaXMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPlN3aXRjaCB0byB0aGUgPHN0cm9uZz5hdXRob3Jpbmc8L3N0cm9uZz4gPHN0cm9uZz5wZXJzcGVjdGl2ZTwvc3Ryb25nPi4gRHJpbGwgZG93biBpbnRvIGEgcGx1Z2luIGFzIGZvbGxvd3M6IDxzdHJvbmc+UHJvY2Vzc2VzICZndDsgQ2FwYWJpbGl0eSBQYXR0ZXJucyAmZ3Q7IFthbnldICZndDsgQ2FwYWJpbGl0eSBQYXR0ZXJuczwvc3Ryb25nPi4gTm90ZSB0aGF0IG5vdCBhbGwgcGx1Z2lucyBoYXZlIGNhcGFiaWxpdHkgcGF0dGVybnMuIERvdWJsZS1jbGljayBvbiBhIGNhcGFiaWxpdHkgcGF0dGVybi4gVGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHNjcmVlbiBpcyBub3cgZmlsbGVkIHdpdGggdGhlIENhcGFiaWxpdHkgUGF0dGVybiBlZGl0b3IgYW5kIHRoZSBQcm9wZXJ0aWVzIFZpZXcuIFlvdSBjYW4gZmluZCBvdXQgbW9yZSBhYm91dCB0aGVzZSBpbiB0aGUgPHU+V29ya2luZyB3aXRoIFByb2Nlc3NlczwvdT4gdHV0b3JpYWwuPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF8yLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDdhOTIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDI6IEJyb3dzZSBNZXRob2QgQ29udGVudCB2aWEgQnJvd3NpbmcgUGVyc3BlY3RpdmUgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGJlY29tZSBmYW1pbGlhciB3aXRoIGJyb3dzaW5nIG1ldGhvZCBjb250ZW50IGluIGEgbGlicmFyeSB1c2luZyB0aGUgYnJvd3NpbmcgcGVyc3BlY3RpdmUuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPlNlbGVjdCA8c3Ryb25nPlJVUCBmb3IgU21hbGwgUHJvamVjdHMgPC9zdHJvbmc+IGluIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gZHJvcC1kb3duIGxpc3QgbG9jYXRlZCB1bmRlcm5lYXRoIHRoZSBtYWluIG1lbnUgYmFyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5TZWxlY3QgPHN0cm9uZz5Ccm93c2luZyBwZXJzcGVjdGl2ZTwvc3Ryb25nPi4gVGhlIENvbmZpZ3VyYXRpb24gVmlldyBhcHBlYXJzIG9uIHRoZSBsZWZ0LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5UbyB2aWV3IGEgVGFzaywgY2xpY2sgPHN0cm9uZz5EaXNjaXBsaW5lcyAmZ3Q7IFJVUCBEaXNjaXBsaW5lcyAmZ3Q7IEFuYWx5c2lzICZhbXA7IERlc2lnbiAmZ3Q7IERlc2lnbiB0aGUgVXNlciBJbnRlcmZhY2U8L3N0cm9uZz4uIEEgcHJldmlldyBvZiB0aGUgcHVibGlzaGVkIFdlYiBwYWdlIGZvciB0aGUgc2VsZWN0ZWQgZWxlbWVudCBpcyBkaXNwbGF5ZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIHRoZSA8c3Ryb25nPlByaW1hcnkgUGVyZm9ybWVyIDwvc3Ryb25nPmxpbmsgaW4gdGhlIHJlbGF0aW9uc2hpcHMgc2VjdGlvbi4gVGhpcyB3aWxsIHNob3cgdGhlIHByZXZpZXcgcGFnZSBmb3IgdGhlIFVzZXItSW50ZXJmYWNlIERlc2lnbmVyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5Zb3UgY2FuIGNsaWNrIG9uIGFueSBsaW5rcyBpbiB0aGUgcHJldmlldyBhbmQgdXNlIHRoZSBiYWNrIGljb24gaW4gdGhlIHByZXZpZXcgdG9vbGJhciB0byByZXR1cm4gdG8gcHJldmlvdXMgcGFnZXMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlZpZXcgb3RoZXIgZWxlbWVudHMgaW4gdGhlIENvbmZpZ3VyYXRpb24gVmlldyB0cmVlIJYgZS5nLiB1bmRlciBEb21haW5zLCBSb2xlIFNldHMsIGV0Yy4gPC9wPgotICA8L2xpPgotPC9vbD4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfMy5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF8zLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUxMWE4MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF8zLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSAzOiBCcm93c2UgUHJvY2VzcyBDb250ZW50IHZpYSBCcm93c2luZyBQZXJzcGVjdGl2ZSA8L2E+PC9oMj4KLTxwPiBUaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGJlY29tZSBmYW1pbGlhciB3aXRoIGJyb3dzaW5nIHByb2Nlc3MgY29udGVudCBpbiBhIGxpYnJhcnkgdXNpbmcgdGhlIGJyb3dzaW5nIHBlcnNwZWN0aXZlIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPk1ha2Ugc3VyZSB5b3UgYXJlIGluIHRoZSBCcm93c2luZyBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+VG8gdmlldyBhIENhcGFiaWxpdHkgUGF0dGVybiwgY2xpY2sgPHN0cm9uZz5Qcm9jZXNzZXMgJmd0OyBDYXBhYmlsaXR5IFBhdHRlcm5zICZndDsgQ2xhc3NpYyBSVVAgJmd0OyBEaXNjaXBsaW5lIFdvcmtmbG93cyAmZ3Q7IEFuYWx5c2lzIGFuZCBEZXNpZ248L3N0cm9uZz4uIEEgcHJldmlldyBvZiB0aGUgcHVibGlzaGVkIFdlYiBwYWdlIGZvciB0aGUgc2VsZWN0ZWQgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGRpc3BsYXllZC4gPC9wPgotICA8L2xpPgotICA8bGk+QSBDYXBhYmlsaXR5IFBhdHRlcm4gY29udGFpbnMgYSBsYXJnZSBhbW91bnQgb2YgaW5mb3JtYXRpb24gYW5kIGlzIGRpc3BsYXllZCBvdmVyIGZvdXIgdGFicyCWIERlc2NyaXB0aW9uLCBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBVc2FnZSBhbmQgVGVhbSBBbGxvY2F0aW9uLiBFeHBsb3JlIHRoZSBpbmZvcm1hdGlvbiBvbiBlYWNoIHRhYi4gCi0gICAgPHA+Tm90ZSB0aGF0IHdoZW4geW91IGNsaWNrIG9uIGEgdGFzayBpbiB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlIHRhYiB5b3UgcHJldmlldyBhIJFUYXNrIERlc2NyaXB0b3InLiBBIFRhc2sgRGVzY3JpcHRvciBpcyBhIHRhc2sgd2l0aGluIGEgcHJvY2Vzcy4gVGhlIHRhc2sgZGVzY3JpcHRvciBwYWdlIGhhcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFzayBhcyBpdCBpcyB1c2VkIGF0IGEgc3BlY2lmaWMgcG9pbnQgaW4gYSBwcm9jZXNzLiBUaGUgdGFzayBkZXNjcmlwdG9yIGhhcyBhIGxpbmsgdG8gdGhlIFRhc2sgb24gd2hpY2ggaXQgaXMgYmFzZWQuIDwvcD4KLSAgICA8cD5DbGlja2luZyBvbiBhIHJvbGUgb3Igd29yayBwcm9kdWN0IGluIGEgdGFzayBkZXNjcmlwdG9yIHRha2VzIHlvdSB0byBhIFJvbGUgRGVzY3JpcHRvciBvciBhIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yLiBUaGVzZSBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSByb2xlIG9yIHdvcmsgcHJvZHVjdCBhdCB0aGUgc2FtZSBwb2ludCBpbiB0aGUgcHJvY2VzcyBhbmQgYWxzbyBwcm92aWRlIGxpbmtzIGJhY2sgdG8gdGhlIGNvcmUgbWV0aG9kIGVsZW1lbnQgb24gd2hpY2ggdGhleSBhcmUgYmFzZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPlRvIHZpZXcgYSBEZWxpdmVyeSBQcm9jZXNzLCBjbGljayA8c3Ryb25nPlByb2Nlc3NlcyAmZ3Q7IERlbGl2ZXJ5IFByb2Nlc3NlcyAmZ3Q7IENsYXNzaWMgUlVQIExpZmVjeWNsZTwvc3Ryb25nPi4gVGhlIGRpc3BsYXkgZm9yIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBzaW1pbGFyIHRvIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuLiA8L2xpPgotPC9vbD4KLTxwPiZuYnNwOzwvcD4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfNC5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF80Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI2ZjQ1Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF80Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSA0OiBCcm93c2UgTWV0aG9kIENvbnRlbnQgdmlhIEF1dGhvcmluZyBQZXJzcGVjdGl2ZSA8L2E+PC9oMj4KLTxwPiBUaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGJlY29tZSBmYW1pbGlhciB3aXRoIGJyb3dzaW5nIGxpYnJhcnkgY29udGVudCB3aGlsZSBpbiB0aGUgYXV0aG9yaW5nIHBlcnNwZWN0aXZlLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggdG8gQXV0aG9yaW5nIHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5JbiB0aGUgTGlicmFyeSBWaWV3LCBuYXZpZ2F0ZSB0byA8c3Ryb25nPlJVUCAmZ3Q7IE1ldGhvZCBDb250ZW50ICZndDsgQ29udGVudCBQYWNrYWdlcyAmZ3Q7IERlc2lnbiAmZ3Q7IEdVSSBEZXNpZ24gJmd0OyBSb2xlPC9zdHJvbmc+cy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+U2VsZWN0IGEgcm9sZSAoZG91YmxlIGNsaWNrKSBhbmQgdXNlIHRoZSBwcmV2aWV3IHRhYiBhdCB0aGUgYm90dG9tIG9mIHRoZSByb2xlIHdpbmRvdyB0byB2aWV3IHRoZSBodG1sIHJlcHJlc2VudGF0aW9uIG9mIHRoYXQgcm9sZSBhbmQgaXRzIHJlbGF0aW9uc2hpcHMgdG8gb3RoZXIgbWV0aG9kIGVsZW1lbnRzLiBWaWV3IHRoZSBvdGhlciB0YWJzIHRvIHNlZSB0aGUgaW5mb3JtYXRpb24gcHJlc2VudGVkIHdoZW4gYXV0aG9yaW5nIHRoZSBtZXRob2QgY29udGVudCBhbmQgcmVsYXRpb25zaGlwcyBmb3IgYSByb2xlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5SZXBlYXQgc3RlcCAzIHRvIHByZXZpZXcgYSA8c3Ryb25nPnRhc2s8L3N0cm9uZz4gLCA8c3Ryb25nPndvcmsgcHJvZHVjdDwvc3Ryb25nPiwgYW5kIDxzdHJvbmc+Z3VpZGFuY2UgZWxlbWVudDwvc3Ryb25nPi4gPC9wPgotICA8L2xpPgotPC9vbD4KLTxwPiZuYnNwOzwvcD4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfNS5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF81Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE0NTFjNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF81Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSA1OiBTZWFyY2ggZm9yIE1ldGhvZCBDb250ZW50IDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBiZWNvbWUgZmFtaWxpYXIgd2l0aCB0aGUgc2VhcmNoIGZ1bmN0aW9uIGluIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCB0byA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz5wZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+T3BlbiB1cCB0aGUgU2VhcmNoIGRpYWxvZyBieSA6IDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBDbGlja2luZyBvbiB0aGUgRmxhc2hsaWdodCBpY29uIGluIHRoZSB0b29sYmFyIDwvcD4KLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxibG9ja3F1b3RlPgotICAgICAgICA8cD48c3Ryb25nPk9yIDwvc3Ryb25nPjwvcD4KLSAgICAgIDwvYmxvY2txdW90ZT4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IFNlbGVjdGluZyA8c3Ryb25nPlNlYXJjaCAvIFNlYXJjaDwvc3Ryb25nPiBpbiB0aGUgbWFpbiBtZW51LiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIG9uIHRoZSA8c3Ryb25nPk1ldGhvZCBTZWFyY2g8L3N0cm9uZz4gdGFiLiBFbnRlciA8c3BhbiBjbGFzcz0ic3R5bGUxIj5EYXRhYmFzZTwvc3Bhbj4gaW4gdGhlIHRleHQgYm94IGFuZCBjbGljayBvbiA8c3Ryb25nPlNlYXJjaDwvc3Ryb25nPi4gSXQgd2lsbCB0YWtlIGEgZmV3IHNlY29uZHMgdG8gZmluZCBhbGwgdGhlIGhpdHMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkRyaWxsIGRvd24gaW4gdGhlIHNlYXJjaCByZXN1bHRzIGFuZCBkb3VibGUtY2xpY2sgb24gYW4gZWxlbWVudC4gVGhlIGVkaXRvciBmb3IgdGhlIHNlbGVjdGVkIGl0ZW0gaXMgb3BlbmVkLiBJZiB5b3UgaGF2ZSA8c3Ryb25nPkxpbmsgd2l0aCBFZGl0b3I8L3N0cm9uZz4gc2VsZWN0ZWQgaW4gdGhlIGxpYnJhcnkgdmlldywgdGhlIGxpYnJhcnkgdmlldyBkaXNwbGF5IGNoYW5nZXMgdG8gc2hvdyB5b3Ugd2hlcmUgdGhlIHNlbGVjdGVkIGl0ZW0gaXMgaW4gdGhlIGxpYnJhcnkuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPk9wZW4gdGhlIHNlYXJjaCBkaWFsb2cgYWdhaW4gYW5kIHJlcGVhdCB0aGUgc2FtZSBzZWFyY2ggYnV0IHRoaXMgdGltZSByZWR1Y2UgdGhlIHNjb3BlIHRvIGp1c3QgbG9vayBmb3IgdGFza3MuIFVuY2hlY2sgYWxsIHRoZSBvdGhlciBjb250ZW50IHR5cGVzIGluIHRoZSBzY29wZSBwYW5lbC4gVGhlIHNlYXJjaCBzaG91bGQgYmUgcXVpY2tlciBhbmQgcmVzdWx0IGluIGZld2VyIGhpdHMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPk9wZW4gdGhlIHNlYXJjaCBkaWFsb2cgYWdhaW4gYW5kIHJlcGVhdCB0aGUgc2FtZSBzZWFyY2ggYnV0IHRoaXMgdGltZSBhZGQgPHN0cm9uZz5ydXBfKjwvc3Ryb25nPiBhcyBhIGZpbGUgbmFtZSBwYXR0ZXJuLiBNYWtlIHN1cmUgdGhlIHNjb3BlIGlzIHN0aWxsIHNldCB0byB0YXNrcy4gVGhlIHNlYXJjaCBzaG91bGQgYmUgZXZlbiBxdWlja2VyIGFuZCByZXN1bHQgaW4gZXZlbiBmZXdlciBoaXRzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5FeHBlcmltZW50IHdpdGggb3RoZXIgTWV0aG9kIFNlYXJjaGVzLjwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfaW50cm8uaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfaW50cm8uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWEyZGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2ludHJvLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMT48YT5UdXRvcmlhbDogCi0KLQotIE5hdmlnYXRlIHRoZSBVc2VyIEludGVyZmFjZQotCi08L2E+PC9oMT4KLTxoMj48YT5JbnRyb2R1Y3Rpb24gPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIHR1dG9yaWFsIGlzIHRvIGdldCBmYW1pbGlhciB3aXRoIHVzZXIgaW50ZXJmYWNlIGFuZCB0aGUgd2F5IG1ldGhvZCBhbmQgcHJvY2VzcyBjb250ZW50IGlzIHN0b3JlZCBhbmQgdmlld2VkLiA8L3A+Ci08cD5BIE1ldGhvZCBMaWJyYXJ5IGNvbnNpc3RzIG9mIGEgc2VyaWVzIG9mIDxzdHJvbmc+PGVtPm1ldGhvZCBwbHVnLWlucy4gPC9lbT48L3N0cm9uZz5XaXRoaW4gYSBwbHVnaW4sIGNvbnRlbnQgaXMgc2VwYXJhdGVkIGludG8gPHN0cm9uZz48ZW0+TWV0aG9kIENvbnRlbnQgPC9lbT48L3N0cm9uZz4gKHRhc2tzLCByb2xlcywgd29yayBwcm9kdWN0cyBhbmQgZ3VpZGFuY2UpIGFuZCA8c3Ryb25nPjxlbT5Qcm9jZXNzZXMgPC9lbT48L3N0cm9uZz4gKGNhcGFiaWxpdHkgcGF0dGVybnMgYW5kIGRlbGl2ZXJ5IHByb2Nlc3NlcykuIFRoaXMgaXMgaG93IHRoZSBMaWJyYXJ5IFZpZXcsIHdoaWNoIHNob3dzIGFsbCB0aGUgY29udGVudCBpbiB0aGUgbGlicmFyeSBpcyBvcmdhbml6ZWQuIDwvcD4KLTxwPkEgY29uZmlndXJhdGlvbiBpcyBhIHN1YnNldCBvZiB0aGUgbWV0aG9kIGxpYnJhcnkgY29udGVudC4gVGhlIENvbmZpZ3VyYXRpb24gVmlldyBzaG93cyB0aGUgY29udGVudCBpbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24uIE9uY2UgYSBjb25maWd1cmF0aW9uIGlzIHNlbGVjdGVkLCB0aGUgY29uZmlndXJhdGlvbiB2aWV3IGlzIHJlZnJlc2hlZCB3aXRoIHRoZSBjb250ZW50IGZyb20gdGhlIGNvbmZpZ3VyYXRpb24uIFRoZSBjb250ZW50IGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcgaXMgYWx3YXlzIGxhaWQgb3V0IHVzaW5nIHRoZSBzYW1lIHNldCBvZiBmb2xkZXJzIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggY29uZmlndXJhdGlvbiBpcyBzZWxlY3RlZC4gPC9wPgotPHA+RVBGIENvbXBvc2VyIGhhcyB0d28gkXBlcnNwZWN0aXZlcycuIFRoZSBBdXRob3JpbmcgUGVyc3BlY3RpdmUgcHJvdmlkZXMgZnVsbCBicm93c2luZyBhbmQgYXV0aG9yaW5nIGNhcGFiaWxpdGllcy4gVGhlIEJyb3dzaW5nIFBlcnNwZWN0aXZlIGFsbG93cyBicm93c2luZyBjb250ZW50IGluIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY29uZmlndXJhdGlvbi4gPC9wPgotPHA+Q29udGVudCBpcyBjcmVhdGVkIGFuZCBtYWludGFpbmVkIHVzaW5nIGEgc2VyaWVzIG9mIDxzdHJvbmc+PGVtPmVkaXRvcnMuIDwvZW0+PC9zdHJvbmc+PC9wPgotPGgyPiZuYnNwOzwvaDI+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8xLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDQxYzgyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPjwvYT48YT5FeGVyY2lzZSAxOiBDcmVhdGUgb3IgTW9kaWZ5IGEgTWV0aG9kIENvbnRlbnQgUGFja2FnZSA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgdGFzayBpcyB0byBjcmVhdGUgYSBuZXcgPHN0cm9uZz5Db250ZW50IFBhY2thZ2UgPC9zdHJvbmc+IHdpdGhpbiBhIDxzdHJvbmc+TWV0aG9kIFBsdWctaW48L3N0cm9uZz4uIDwvcD4KLTxwPlRvIGNyZWF0ZSBhIG5ldyBNZXRob2QgUGx1Zy1pbjogPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+IE1ha2Ugc3VyZSB5b3UgYXJlIGluIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPkNsaWNrIDxzdHJvbmc+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE1ldGhvZCBQbHVnLWluPC9zdHJvbmc+LiAKLSAgICA8cD5PciA8L3A+Ci0gICAgPHA+UmlnaHQtY2xpY2sgYW4gZXhpc3RpbmcgUGx1Zy1pbiBhbmQgc2VsZWN0IDxzdHJvbmc+TmV3IE1ldGhvZCBQbHVnLWluPC9zdHJvbmc+LiA8YnI+Ci0gIFRoZSBOZXcgTWV0aG9kIFBsdWctaW4gd2l6YXJkIGlzIGxhdW5jaGVkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5JbiB0aGUgTmV3IE1ldGhvZCBQbHVnLWluIHdpemFyZCwgcHJvdmlkZSBhIG5hbWUgZm9yIHRoZSBuZXcgcGx1Zy1pbi4gSW4gdGhpcyBpbnN0YW5jZSwgd2UnbGwgY2FsbCBpdCBNeSBQbHVnaW4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlNlbGVjdCA8c3Ryb25nPlJVUCA8L3N0cm9uZz4gaW4gdGhlIFJlZmVyZW5jZWQgUGx1Zy1pbnMgcGFuZWwsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+RmluaXNoPC9zdHJvbmc+LiBUaGlzIG1lYW5zIHRoYXQgeW91ciBwbHVnLWluIHdpbGwgZXh0ZW5kIHRoZSBSVVAgcGx1Zy1pbiBhbmQgeW91IHdpbGwgYmUgYWJsZSB0byBzZWxlY3QgY29udGVudCBmcm9tIHRoZSBSVVAgcGx1Zy1pbiBhcyB5b3UgY3JlYXRlIHlvdXIgb3duIHBsdWctaW4gY29udGVudC4gPGJyPgotICAgICAgPHNwYW4gY2xhc3M9InN0eWxlMSI+TXkgUGx1Z2luPC9zcGFuPiBub3cgYXBwZWFycyBpbiB0aGUgTGlicmFyeSBWaWV3IG9uIHRoZSBsZWZ0IHNpZGUgb2YgeW91ciBzY3JlZW4uIEl0IGlzIG5vdCBncmF5ZWQgb3V0IGluZGljYXRpbmcgdGhhdCBpdCBpcyBub3QgbG9ja2VkIGFuZCB0aGF0IHlvdSBjYW4gZWRpdCBpdC4gPC9wPgotICA8L2xpPgotICA8bGk+RG91YmxlIGNsaWNrIG9uIDxzcGFuIGNsYXNzPSJzdHlsZTEiPk15IFBsdWdpbjwvc3Bhbj4gdG8gb3BlbiB0aGUgUGx1Z2luIGVkaXRvci4gQWJvdXQgaGFsZndheSBkb3duIHRoZSBwYWdlIHlvdSB3aWxsIHNlZSB0aGUgkUxvY2sgUGx1Z2luJyBjaGVja2JveC4gVGhpcyB3aWxsIGJlIHVuY2hlY2tlZCBmb3IgeW91ciBuZXcgcGx1Z2luLiBJZiB5b3Ugb3BlbiB0aGUgcGx1Z2luIGVkaXRvciBmb3IgdGhlIFJVUCBwbHVnaW4gdGhpcyBmaWVsZCB3aWxsIGJlIGNoZWNrZWQuIDwvbGk+Ci08L29sPgotPHA+VG8gY3JlYXRlIGEgTWV0aG9kIFBhY2thZ2U6IDwvcD4KLTxvbCBzdGFydD0iNiI+Ci0gIDxsaT4KLSAgICA8cD5JbiB0aGUgTGlicmFyeSBWaWV3LCBjbGljayA8c3Ryb25nPk15IFBsdWdpbiAmZ3Q7IE1ldGhvZCBDb250ZW50ICZndDsgQ29udGVudCBQYWNrYWdlczwvc3Ryb25nPi4gIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlJpZ2h0LWNsaWNrIDxzdHJvbmc+Q29udGVudCBQYWNrYWdlczwvc3Ryb25nPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEhpZ2hsaWdodCA8c3Ryb25nPk5ldzwvc3Ryb25nPiBhbmQgdGhlbiBjbGljayA8c3Ryb25nPkNvbnRlbnQgUGFja2FnZTwvc3Ryb25nPiB0byBjcmVhdGUgYSBuZXcgQ29udGVudCBQYWNrYWdlLiA8YnI+Ci0gICAgICBUaGUgQ29udGVudCBQYWNrYWdlIGVkaXRvciBpcyBkaXNwbGF5ZWQgYW5kIHlvdSBjYW4gbmFtZSB0aGUgcGFja2FnZSBhbmQgcHJvdmlkZSBhIEJyaWVmIERlc2NyaXB0aW9uLiBXZSdsbCBjYWxsIGl0IJNNeSBDb250ZW50IFBhY2thZ2WULiA8YnI+Ci0gICAgICA8c3Ryb25nPk5vdGU6IDwvc3Ryb25nPiBZb3UgY2Fubm90IGNyZWF0ZSBhIG5ldyBDb250ZW50IFBhY2thZ2Ugb3IgYW55IG90aGVyIGVsZW1lbnQgaW4gYSBsb2NrZWQgcGx1Z2luLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5TYXZlIHlvdXIgbmV3IGNvbnRlbnQuIDwvbGk+Ci08L29sPgotPHA+PHN0cm9uZz5Ob3RlOiA8L3N0cm9uZz4gV2hlbiB5b3UgY3JlYXRlIGEgbmV3IGVsZW1lbnQgb3IgbW9kaWZ5IGFuIGV4aXN0aW5nIGVsZW1lbnQsIGEgkSonIGFwcGVhcnMgaW4gdGhlIHRhYiBuZXh0IHRvIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50LCBpbmRpY2F0aW5nIHRoYXQgdGhlIGVsZW1lbnQgbmVlZHMgdG8gYmUgc2F2ZWQuIEFuIGVsZW1lbnQgY2FuIGJlIHNhdmVkIGJ5IGNsb3NpbmcgdGhlIGVkaXRvciwgY2xpY2tpbmcgdGhlIGRpc2sgaWNvbiBpbiB0aGUgdG9vbGJhciwgb3IgY2xpY2tpbmcgPHN0cm9uZz5GaWxlICZndDsgU2F2ZSA8L3N0cm9uZz4uIDwvcD4KLTxwPjxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+IEVQRiBDb21wb3NlciBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgbm9kZXMgZm9yIHRhc2tzLCByb2xlcywgd29yayBwcm9kdWN0cyBhbmQgZ3VpZGFuY2UgdW5kZXIgdGhlIG5ldyBjb250ZW50IHBhY2thZ2UuIDwvcD4KLTxoMT4mbmJzcDs8L2gxPgotPGgyPiZuYnNwOzwvaDI+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzIuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZjQ1NTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPkV4ZXJjaXNlIDI6IENyZWF0ZSBXb3JrIFByb2R1Y3Q8L2E+cyA8L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBjcmVhdGUgbmV3IG1ldGhvZCBjb250ZW50LiBTcGVjaWZpY2FsbHksIDxzdHJvbmc+V29yayBQcm9kdWN0cyA8L3N0cm9uZz5vZiB0eXBlIDxzdHJvbmc+IEFydGlmYWN0IDwvc3Ryb25nPi4gWW91IGNhbiBjcmVhdGUgYW55IGNvbnRlbnQgYnV0IHNvbWUgZXhhbXBsZXMgYXJlIHByb3ZpZGVkIGlmIHlvdSB3YW50IHRvIHVzZSB0aGVtLiBUaGVzZSBleGFtcGxlcyBhcmUgcmVmZXJyZWQgdG8gaW4gb3RoZXIgdHV0b3JpYWxzLiA8L3A+Ci08cD5NZXRob2QgYW5kIFByb2Nlc3MgZWxlbWVudHMgaGF2ZSB0d28gbmFtZXMgaW4gRVBGIENvbXBvc2VyOiBOYW1lIGFuZCBQcmVzZW50YXRpb24gTmFtZS4gPC9wPgotPHA+VGhlIE5hbWUgZmllbGQgaXMgdXNlZCBhcyB0aGUgZmlsZSBuYW1lIGZvciB0aGUgaXRlbS4gSW4gUlVQLCB3ZSBhcmUgY2FyZWZ1bCBob3cgd2UgbmFtZSB0aGUgZmlsZXMgYW5kIHVzZSBjb252ZW50aW9ucyBzdWNoIGFzIGxvd2VyIGNhc2UsIG5vIHNwYWNlcywgYW5kIG5vIHNwZWNpYWwgY2hhcmFjdGVycy4gV2UgZG8gdGhpcyBzbyB0aGF0IHRoZSBuYW1lIGlzIGEgdmFsaWQgZmlsZSBuYW1lIG9uIGFsbCBvcGVyYXRpbmcgc3lzdGVtcyBhbmQgZm9yIGludGVncmF0aW9uIHdpdGggc291cmNlIGNvbnRyb2wgc29mdHdhcmUgaW4gdGhlIGZ1dHVyZS4gVGhlIE5hbWUgaXMgc2hvd24gaW4gdGhlIExpYnJhcnkgVmlldy4gPC9wPgotPHA+VGhlIFByZXNlbnRhdGlvbiBOYW1lIGlzIHRoZSBuYW1lIHRoYXQgaXMgc2hvd24gb24gcHVibGlzaGVkIHBhZ2VzIGFuZCBpdCBpcyBhbHNvIHNob3duIGluIHRoZSBDb25maWd1cmF0aW9uIFZpZXcuIFRoaXMgbmFtZSBjYW4gY29udGFpbiBhbnkgY2hhcmFjdGVycywgYnV0IGJ5IGNvbnZlbnRpb24gaW4gUlVQLCB3ZSB1c2UgdGhlIHNhbWUgdGV4dCBhcyB0aGUgTmFtZSwganVzdCBwcmV0dGllci4gPC9wPgotPHA+SW4gdGhlIExpYnJhcnkgdmlldyB5b3UgY2FuIGNob29zZSB0byBkaXNwbGF5IE5hbWVzIG9yIFByZXNlbnRhdGlvbiBOYW1lcy4gWW91IGNhbiBzd2l0Y2ggdGhlIG5hbWUgZGlzcGxheSB1c2luZyB0aGUgkVNob3cgUHJlc2VudGF0aW9uIE5hbWVzJyBidXR0b24gaW4gdGhlIExpYnJhcnkgdmlldyB0b29sYmFyLiA8L3A+Ci08cD5JbiBnZW5lcmFsLCB5b3UgY3JlYXRlIG5ldyBlbGVtZW50cyBieSByaWdodC1jbGlja2luZyB0aGUgZm9sZGVyIHRoYXQgd2lsbCBjb250YWluIHRoZSBuZXcgZWxlbWVudC4gRm9yIGV4YW1wbGUsIHRvIGNyZWF0ZSBhIG5ldyByb2xlIGluIGEgY29udGVudCBwYWNrYWdlLCByaWdodC1jbGljayB0aGUgPHN0cm9uZz5Sb2xlcyA8L3N0cm9uZz4gZm9sZGVyLCBoaWdobGlnaHQgPHN0cm9uZz5OZXcgPC9zdHJvbmc+IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+Um9sZTwvc3Ryb25nPi4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+TWFrZSBzdXJlIHlvdSBhcmUgaW4gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFdpdGhpbiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5NeSBDb250ZW50IFBhY2thZ2U8L3NwYW4+IHJpZ2h0LWNsaWNrIG9uIHRoZSA8c3Ryb25nPldvcmsgUHJvZHVjdHM8L3N0cm9uZz4gZm9sZGVyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gSGlnaGxpZ2h0IDxzdHJvbmc+TmV3PC9zdHJvbmc+IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+QXJ0aWZhY3Q8L3N0cm9uZz4uIFRoZSBhcnRpZmFjdCBlZGl0b3IgaXMgZGlzcGxheWVkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gSW4gdGhlIE5hbWUgZmllbGQsIHR5cGUgdGhlIG5ldyBBcnRpZmFjdCBuYW1lLiBJbiB0aGlzIGluc3RhbmNlLCB3ZSdsbCBjYWxsIGl0IDxzdHJvbmc+bXlfcnVwX25hdm1hcDwvc3Ryb25nPi4gPC9wPgotICA8L2xpPgotICA8bGk+IEluIHRoZSA8c3Ryb25nPlByZXNlbnRhdGlvbiBOYW1lPC9zdHJvbmc+IGZpZWxkLCB0eXBlOiA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD5NeSBSVVAgTmF2aWdhdGlvbiBNYXA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPkluIHRoZSA8c3Ryb25nPkJyaWVmIERlc2NyaXB0aW9uPC9zdHJvbmc+IGZpZWxkLCB0eXBlOgotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHA+VGhlIE5hdmlnYXRpb24gTWFwIGV4cHJlc3NlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSB1c2VyLWludGVyZmFjZSBlbGVtZW50cyBpbiB0aGUgc3lzdGVtLCBhbG9uZyB3aXRoIHRoZWlyIHBvdGVudGlhbCBuYXZpZ2F0aW9uIHBhdGh3YXlzLjwvcD4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gIDwvbGk+Ci0gIDxsaT4gSW4gdGhlIDxzdHJvbmc+UHVycG9zZTwvc3Ryb25nPiBmaWVsZCB0eXBlOiAKLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwPlRoZXJlIGlzIG9uZSBOYXZpZ2F0aW9uIE1hcCBwZXIgc3lzdGVtLiBUaGUgcHVycG9zZSBvZiB0aGUgTmF2aWdhdGlvbiBNYXAgaXMgdG8gZXhwcmVzcyB0aGUgcHJpbmNpcGFsIHVzZXIgaW50ZXJmYWNlIHBhdGhzIHRocm91Z2ggdGhlIHN5c3RlbS4gVGhlc2UgYXJlIHRoZSBtYWluIHBhdGh3YXlzIHRocm91Z2ggdGhlIHNjcmVlbnMgb2YgdGhlIHN5c3RlbSBhbmQgbm90IG5lY2Vzc2FyaWx5IGFsbCBvZiB0aGUgcG9zc2libGUgcGF0aHMuIEl0IGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEgcm9hZCBtYXAgb2YgdGhlIHN5c3RlbSdzIHVzZXIgaW50ZXJmYWNlLiBUaGUgTmF2aWdhdGlvbiBNYXAgbWFrZXMgaXQgZWFzeSB0byBzZWUgaG93IG1hbnkgJnF1b3Q7Y2xpY2tzJnF1b3Q7IGl0IHdpbGwgdGFrZSBhIHVzZXIgdG8gZ2V0IHRvIGEgc3BlY2lmaWMgc2NyZWVuLiA8L3A+Ci0gICAgPC9ibG9ja3F1b3RlPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgdGhlIHByZXZpZXcgdGFiIHRvIHZpZXcgdGhlIG5ldyBBcnRpZmFjdC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNhdmUgdGhlIEFydGlmYWN0LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gUmVwZWF0IHN0ZXBzIDIgdGhyb3VnaCA5IHVzaW5nIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246IAotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+QXJ0aWZhY3QgTmFtZTwvc3Ryb25nPjogbXlfcnVwX3VzZXJfaW50ZXJmYWNlX3Byb3RvdHlwZSA8L3A+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5QcmVzZW50YXRpb24gTmFtZTwvc3Ryb25nPjogTXkgUlVQIFVJIFByb3RvdHlwZSA8L3A+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5CcmllZiBEZXNjcmlwdGlvbjwvc3Ryb25nPjogQSB1c2VyLWludGVyZmFjZSBwcm90b3R5cGUgaXMgYW4gZXhhbXBsZSBvZiB0aGUgdXNlciBpbnRlcmZhY2UgdGhhdCBpcyBidWlsdCBpbiBvcmRlciB0byBleHBsb3JlIGFuZC9vciB2YWxpZGF0ZSB0aGUgdXNlci1pbnRlcmZhY2UgZGVzaWduLiA8L3A+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5QdXJwb3NlOiA8L3N0cm9uZz4gVGhlIGZvbGxvd2luZyByb2xlcyB1c2UgdGhlIHVzZXItaW50ZXJmYWNlIHByb3RvdHlwZTogPC9wPgotICAgICAgPGJsb2NrcXVvdGU+Ci0gICAgICAgIDxwPi0gPHN0cm9uZz51c2VyLWludGVyZmFjZSBkZXNpZ25lcnM8L3N0cm9uZz4gLCB0byBleHBsb3JlIGFuZC9vciB2YWxpZGF0ZSB0aGUgdXNlci1pbnRlcmZhY2UgZGVzaWduIGJlZm9yZSB0b28gbXVjaCBpcyBpbnZlc3RlZCBpbiBpdCA8L3A+Ci0gICAgICAgIDxwPi0gPHN0cm9uZz5yZXF1aXJlbWVudHMgc3BlY2lmaWVycyA8L3N0cm9uZz4sIHRvIHVuZGVyc3RhbmQgdGhlIHVzZXIgaW50ZXJmYWNlIGZvciBhIFVzZSBDYXNlIDwvcD4KLSAgICAgICAgPHA+PHN0cm9uZz4tIHN5c3RlbSBhbmFseXN0cyA8L3N0cm9uZz4sIHRvIHVuZGVyc3RhbmQgaG93IHRoZSB1c2VyIGludGVyZmFjZSBpbXBhY3RzIHRoZSBhbmFseXNpcyBvZiB0aGUgc3lzdGVtIDwvcD4KLSAgICAgICAgPHA+LSA8c3Ryb25nPmRlc2lnbmVycyA8L3N0cm9uZz4sIHRvIHVuZGVyc3RhbmQgaG93IHRoZSB1c2VyIGludGVyZmFjZSBpbXBhY3RzIGFuZCB3aGF0IGl0IHJlcXVpcmVzIGZyb20gdGhlICZxdW90O2luc2lkZSZxdW90OyBvZiB0aGUgc3lzdGVtIDwvcD4KLSAgICAgICAgPHA+IC0gPHN0cm9uZz5tYW5hZ2VycyA8L3N0cm9uZz4sIHRvIHBsYW4gZGV2ZWxvcG1lbnQgYW5kIHRlc3RpbmcgYWN0aXZpdGllcyA8L3A+Ci0gICAgICA8L2Jsb2NrcXVvdGU+Ci0gICAgPC9ibG9ja3F1b3RlPgotICA8L2xpPgotPC9vbD4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8zLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGQ2ZTg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPjwvYT48YT5FeGVyY2lzZSAzOiBDcmVhdGUgUm9sZXMgPC9hPjwvaDI+Ci08cD5UbyBjcmVhdGUgYSBSb2xlIGluIE15IENvbnRlbnQgUGFja2FnZTogPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+IE1ha2Ugc3VyZSB5b3UgYXJlIGluIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPldpdGhpbiBNeSBDb250ZW50IFBhY2thZ2UgcmlnaHQtY2xpY2sgb24gdGhlIDxzdHJvbmc+Um9sZXMgPC9zdHJvbmc+IGZvbGRlci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+SGlnaGxpZ2h0IDxzdHJvbmc+TmV3IDwvc3Ryb25nPiBhbmQgdGhlbiBjbGljayA8c3Ryb25nPlJvbGU8L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkluIHRoZSA8c3Ryb25nPk5hbWUgZmllbGQgPC9zdHJvbmc+IHR5cGU6IG15X3J1cF91c2VyX2ludGVyZmFjZV9kZXNpZ25lci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+SW4gdGhlIDxzdHJvbmc+UHJlc2VudGF0aW9uIE5hbWU8L3N0cm9uZz4gZmllbGQgdHlwZTogTXkgVUkgRGVzaWduZXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPkluIHRoZSA8c3Ryb25nPkJyaWVmIERlc2NyaXB0aW9uIDwvc3Ryb25nPiBmaWVsZCB0eXBlOiA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD5UaGUgdXNlci1pbnRlcmZhY2UgZGVzaWduZXIgY29vcmRpbmF0ZXMgdGhlIGRlc2lnbiBvZiB0aGUgdXNlciBpbnRlcmZhY2UuIFVzZXItaW50ZXJmYWNlIGRlc2lnbmVycyBhcmUgYWxzbyBpbnZvbHZlZCBpbiBnYXRoZXJpbmcgdXNhYmlsaXR5IHJlcXVpcmVtZW50cyBhbmQgcHJvdG90eXBpbmcgY2FuZGlkYXRlIHVzZXItaW50ZXJmYWNlIGRlc2lnbnMgdG8gbWVldCB0aG9zZSByZXF1aXJlbWVudHMuIDwvcD4KLSAgICA8cD48c3Ryb25nPlRpcCA8L3N0cm9uZz4gLSB0aGVyZSBhcmUgZGlmZmVyZW50IHdheXMgdGhhdCB5b3UgY2FuIGNyZWF0ZSB0aGUgdGV4dCBhYm92ZSBmb3IgdGhlIG5ldyByb2xlOiA8L3A+Ci0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgRGlyZWN0bHksIGJ5IHR5cGluZyBpdCBtYW51YWxseSBpbiB0aGUgRVBGIENvbXBvc2VyIGVkaXRvci4gPC9wPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IEJ5IGNvcHlpbmcgZnJvbSBhbm90aGVyIHNpbWlsYXIgcm9sZSBhbmQgdGhlbiBtb2RpZnkgdXNpbmcgdGhlIGVkaXRvcnMgKGUuZy4gcnVwX3VzZXJfaW50ZXJmYWNlX2Rlc2lnbmVyKS4gPC9wPgotICAgICYjMTQ5OyZuYnNwO0J5IGNvcHlpbmcgZnJvbSBhbiBodG1sIHNvdXJjZSBzdWNoIGFzIHRoZSB0dXRvcmlhbCB5b3UgYXJlIHJlYWRpbmcuIDwvYmxvY2txdW90ZT4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+ICAgIFRyeSB0aGUgPHN0cm9uZz5SaWNoIFRleHQgRWRpdG9yIDwvc3Ryb25nPiBmb3IgZWRpdGluZyB0aGUgPHN0cm9uZz5NYWluIERlc2NyaXB0aW9uLiA8L3N0cm9uZz5Zb3UgY2FuIG9wZW4gdGhlIFJpY2ggVGV4dCBFZGl0b3IgZm9yIGFueSBpdGVtIHRoYXQgaGFzIGEgkXR3aXN0eScgPGltZyB3aWR0aD0iMTMiIGhlaWdodD0iMTMiIHNyYz0idHV0b3JpYWxfMl9leF8zX2NsaXBfaW1hZ2UwMDIuZ2lmIj5zeW1ib2wgCi0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgVGhlIHVzZXItaW50ZXJmYWNlIGRlc2lnbmVyIHJvbGUgaXMgbm90IHJlc3BvbnNpYmxlIGZvciBpbXBsZW1lbnRpbmcgdGhlIHVzZXIgaW50ZXJmYWNlLiBJbnN0ZWFkLCB0aGlzIHJvbGUgZm9jdXNlcyBvbiB0aGUgZGVzaWduIGFuZCB0aGUgJnF1b3Q7dmlzdWFsIHNoYXBpbmcmcXVvdDsgb2YgdGhlIHVzZXIgaW50ZXJmYWNlLCBieTogPC9wPgotICAgIDwvYmxvY2txdW90ZT4KLSAgPC9saT4KLSAgPG9sPgotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHA+IC0gQ2FwdHVyaW5nIHJlcXVpcmVtZW50cyBvbiB0aGUgdXNlciBpbnRlcmZhY2UsIGluY2x1ZGluZyB1c2FiaWxpdHkgcmVxdWlyZW1lbnRzLiA8L3A+Ci0gICAgICA8cD4tIEJ1aWxkaW5nIHVzZXItaW50ZXJmYWNlIHByb3RvdHlwZXMuPC9wPgotICAgICAgPHA+LSBJbnZvbHZpbmcgb3RoZXIgc3Rha2Vob2xkZXJzIG9mIHRoZSB1c2VyIGludGVyZmFjZSwgc3VjaCBhcyBlbmQtdXNlcnMsIGluIHVzYWJpbGl0eSByZXZpZXdzIGFuZCB1c2UgdGVzdGluZyBzZXNzaW9ucy4gPC9wPgotICAgICAgPHA+LSBSZXZpZXdpbmcgYW5kIHByb3ZpZGluZyB0aGUgYXBwcm9wcmlhdGUgZmVlZGJhY2sgb24gdGhlIGZpbmFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSB1c2VyIGludGVyZmFjZSwgYXMgY3JlYXRlZCBieSBvdGhlciBkZXZlbG9wZXJzOyB0aGF0IGlzLCBkZXNpZ25lcnMgYW5kIGltcGxlbWVudGVycy4gPC9wPgotICAgIDwvYmxvY2txdW90ZT4KLSAgPC9vbD4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+IJYgaWYgeW91IGNvcHkgdGV4dCBmcm9tIGEgTWljcm9zb2Z0IFdvcmQgZG9jdW1lbnQgeW91IHdpbGwgZ2V0IGEgbG90IG9mIGZvcm1hdHRpbmcgaW5mb3JtYXRpb24gdGhhdCBpcyBub3QgbmVlZGVkIGluIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIuIFlvdSBjYW4gc2VlIHRoaXMgaWYgeW91IG9wZW4gdGhlIEhUTUwgZWRpdG9yIGluIHRoZSBSaWNoIFRleHQgRWRpdG9yLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIHRoZSA8c3Ryb25nPldvcmtQcm9kdWN0cyA8L3N0cm9uZz4gdGFiOyBtYWtlIHRoaXMgbmV3IHJvbGUgcmVzcG9uc2libGUgZm9yIHRoZSBteV9ydXBfbmF2bWFwIGFuZCBteV9ydXBfdXNlcl9pbnRlcmZhY2VfcHJvdG90eXBlIGFydGlmYWN0cyB0aGF0IHlvdSBwcmV2aW91c2x5IGNyZWF0ZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIHRoZSA8c3Ryb25nPkFkZCA8L3N0cm9uZz4gYnV0dG9uLiBUaGlzIGRpc3BsYXlzIGEgc2VsZWN0aW9uIGRpYWxvZyB3aGVyZSB5b3UgY2FuIHNlbGVjdCB0aGUgV29yayBQcm9kdWN0cyB0byBhZGQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPk9uY2UgeW91IGhhdmUgc2VsZWN0ZWQgdGhlIGFwcHJvcHJpYXRlIFdvcmsgUHJvZHVjdHMsIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRoZSB3b3JrIHByb2R1Y3RzIHlvdSBzZWxlY3RlZCBhcHBlYXIgaW4gdGhlIDxzdHJvbmc+UmVzcG9uc2libGUgZm9yOiA8L3N0cm9uZz4gcGFuZWwuIAotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHA+Tm90ZSB0aGF0IHNlbGVjdGVkIGVsZW1lbnRzIGluIGFuIEFkZC9SZW1vdmUgc2VjdGlvbiBkaXNwbGF5IGJvdGggdGhlIGVsZW1lbnQgbmFtZSBhbmQgdGhlIJFwYXRoJyB0byB0aGF0IGVsZW1lbnQgliB0aGUgUGx1Z2luIG5hbWUgYW5kIHBhY2thZ2UgbmFtZS4gPC9wPgotICAgIDwvYmxvY2txdW90ZT4KLSAgPC9saT4KLSAgPGxpPkNsaWNrIHRoZSA8c3Ryb25nPlByZXZpZXcgPC9zdHJvbmc+IHRhYiB0byB2aWV3IHRoZSBuZXdseSBjcmVhdGVkIHJvbGUgYW5kIHRoZW4gc2F2ZSBieSBjbG9zaW5nIHRoZSBlZGl0b3IuIDwvbGk+Ci08L29sPgotPGgyPiZuYnNwOzwvaDI+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzNfY2xpcF9pbWFnZTAwMi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8zX2NsaXBfaW1hZ2UwMDIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjJmYzgxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzNfY2xpcF9pbWFnZTAwMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF80Lmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWY5MjFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPjwvYT48YT48L2E+PGE+RXhlcmNpc2UgNDogQ3JlYXRlIFRhc2tzIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBjcmVhdGUgYSB0YXNrIGFuZCB0aGVuIHJlbGF0ZSB0aGF0IHRhc2sgdG8gdGhlIG90aGVyIGVsZW1lbnRzIHlvdSBoYXZlIGNyZWF0ZWQuIDwvcD4KLTxwPlRvIGNyZWF0ZSBhIFRhc2sgaW4gTXkgQ29udGVudCBQYWNrYWdlOiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5NYWtlIHN1cmUgeW91IGFyZSBpbiB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gV2l0aGluIE15IENvbnRlbnQgUGFja2FnZSByaWdodC1jbGljayBvbiB0aGUgPHN0cm9uZz5UYXNrcyA8L3N0cm9uZz4gZm9sZGVyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gSGlnaGxpZ2h0IDxzdHJvbmc+TmV3IDwvc3Ryb25nPiBhbmQgdGhlbiBjbGljayA8c3Ryb25nPlRhc2s8L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPlVzZSB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSB0aGUgdGFzazogIDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPlRhc2s6IDwvc3Ryb25nPiBteV9kZXNpZ25fdXNlcl9pbnRlcmZhY2UgPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPlByZXNlbnRhdGlvbiBOYW1lIDwvc3Ryb25nPjogTXkgRGVzaWduIFVzZXIgSW50ZXJmYWNlIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5CcmllZiBEZXNjcmlwdGlvbjogPC9zdHJvbmc+IFRvIHByb2R1Y2UgYSBkZXNpZ24gb2YgdGhlIHVzZXIgaW50ZXJmYWNlIHRoYXQgc3VwcG9ydHMgdGhlIHJlYXNvbmluZyBhYm91dCwgYW5kIHRoZSBlbmhhbmNlbWVudCBvZiwgaXRzIHVzYWJpbGl0eS4gPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPlN0ZXBzIDwvc3Ryb25nPihVc2Ugc3RlcHMgdGFiKTo8L3A+Ci0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8cD4tIERlc2NyaWJlIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcmVsYXRlZCB1c2VycyA8L3A+Ci0gICAgLSBJZGVudGlmeSB0aGUgcHJpbWFyeSB1c2VyIGludGVyZmFjZSBlbGVtZW50cyA8L2Jsb2NrcXVvdGU+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+Um9sZXMgKFByaW1hcnkgUGVyZm9ybWVyKTogPC9zdHJvbmc+bXlfcnVwX3VzZXJfaW50ZXJmYWNlX2Rlc2lnbmVyIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5Xb3JrIFByb2R1Y3RzIChNYW5kYXRvcnkgSW5wdXQpIDwvc3Ryb25nPiBydXBfc29mdHdhcmVfcmVxdWlyZW1lbnQgKHVuZGVyIHJlcXVpcmVtZW50cykgPHN0cm9uZz48L3N0cm9uZz48L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+V29yayBQcm9kdWN0cyA8L3N0cm9uZz4gKE91dHB1dHMpOiBteV9ydXBfbmF2bWFwIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5HdWlkYW5jZTogPC9zdHJvbmc+cmVwcmVzZW50aW5nX2dyYXBoaWNhbF91c2VyLWludGVyZmFjZXMgKHVuZGVyIGd1aV9kZXNpZ24pIDxzdHJvbmc+PC9zdHJvbmc+PC9wPgotICAmIzE0OTsmbmJzcDsgPHN0cm9uZz5DYXRlZ29yaWVzOiA8L3N0cm9uZz5ydXBfYW5hbHlzaXNfZGVzaWduX2Rpc2NpcGxpbmUgPHN0cm9uZz48L3N0cm9uZz48L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD5DbGljayB0aGUgPHN0cm9uZz5QcmV2aWV3IDwvc3Ryb25nPiB0YWIgdG8gdmlldyB0aGUgbmV3bHkgY3JlYXRlZCB0YXNrIGFuZCBzYXZlIGJ5IGNsb3NpbmcgdGhlIGVkaXRvci4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIENyZWF0ZSBhbm90aGVyIHRhc2sgdXNpbmcgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPlRhc2s6IDwvc3Ryb25nPiBteV9wcm90b3R5cGVfdXNlcl9pbnRlcmZhY2UgPC9wPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+UHJlc2VudGF0aW9uIG5hbWUgPC9zdHJvbmc+OiBNeSBQcm90b3R5cGUgVXNlciBJbnRlcmZhY2UgPC9wPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+QnJpZWYgRGVzY3JpcHRpb246IDwvc3Ryb25nPiBUbyBwcm90b3R5cGUgdGhlIHN5c3RlbSdzIHVzZXIgaW50ZXJmYWNlIGluIGFuIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhlIHVzZXItaW50ZXJmYWNlIGRlc2lnbiBhZ2FpbnN0IHRoZSBmdW5jdGlvbmFsIGFuZCB1c2FiaWxpdHkgcmVxdWlyZW1lbnRzLiA8L3A+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5TdGVwczogPC9zdHJvbmc+PC9wPgotICAgICAgPGJsb2NrcXVvdGU+Ci0gICAgICAgIDxwPi0mbmJzcDsgRGVzaWduIHRoZSB1c2VyIGludGVyZmFjZSBwcm90b3R5cGUgPC9wPgotICAgICAgICA8cD4tJm5ic3A7IEltcGxlbWVudCB0aGUgdXNlciBpbnRlcmZhY2UgcHJvdG90eXBlIDwvcD4KLSAgICAgIDwvYmxvY2txdW90ZT4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPlJvbGVzIChQcmltYXJ5IFBlcmZvcm1lcik6IDwvc3Ryb25nPm15X3J1cF91c2VyX2ludGVyZmFjZV9kZXNpZ25lciA8L3A+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5Xb3JrIFByb2R1Y3RzIChNYW5kYXRvcnkgSW5wdXQpIDwvc3Ryb25nPiBteV9ydXBfbmF2bWFwIDwvcD4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPldvcmsgUHJvZHVjdHMgKE91dHB1dHMpOiA8L3N0cm9uZz5teV9ydXBfdXNlcl9pbnRlcmZhY2VfcHJvdG90eXBlIDwvcD4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPkNhdGVnb3JpZXM6IDwvc3Ryb25nPnJ1cF9hbmFseXNpc19kZXNpZ25fZGlzY2lwbGluZSA8L3A+Ci0gICAgPC9ibG9ja3F1b3RlPgotICA8L2xpPgotICA8L29sPgotPGgyPiZuYnNwOzwvaDI+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzUuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYWRlYWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfNS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPjwvYT48YT5FeGVyY2lzZSA1OiBXb3JraW5nIHdpdGggU3RlcHMgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIHVuZGVyc3RhbmQgdGhlIFN0ZXAgRWRpdG9yIHRoYXQgaXMgcGFydCBvZiB0aGUgVGFzayBFZGl0b3IuIDwvcD4KLTxwPldoZW4geW91IGNyZWF0ZSBhIHRhc2ssIHlvdSBjYW4gZGVmaW5lIGEgc2VyaWVzIG9mIHN0ZXBzIHRoYXQgZGV0YWlsIGhvdyB0byBwZXJmb3JtIHRoZSB0YXNrLiBUaGUgU3RlcCBFZGl0b3IgYWxsb3dzIHlvdSB0byBhZGQgbmV3IHN0ZXBzLCBjaGFuZ2UgdGhlIHNlcXVlbmNlIG9mIHN0ZXBzIGFuZCB0byBkZWxldGUgc3RlcHMuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPk9wZW4gdGhlIG15X2Rlc2lnbl91c2VyX2ludGVyZmFjZSB0YXNrIG9yIGNyZWF0ZSBhIG5ldyB0YXNrLiBDbGljayBvbiB0aGUgPHN0cm9uZz5TdGVwczwvc3Ryb25nPiB0YWIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPkNyZWF0ZSBhIG5ldyBzdGVwOiAgPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+JiMxNDk7IEVudGVyIGEgbmFtZSBmb3IgdGhlIHN0ZXAgaW4gdGhlIJFTdGVwcycgYm94LiA8L3A+Ci0gICAgPHA+JiMxNDk7IEVudGVyIGEgPHN0cm9uZz5EZXNjcmlwdGlvbiA8L3N0cm9uZz4gliB5b3UgY2FuIHVzZSB0aGUgUmljaCBUZXh0IEVkaXRvciBmb3IgdGhpcy4gPC9wPgotICAgIDxwPiYjMTQ5OyBDbGljayB0aGUgPHN0cm9uZz5BZGQgPC9zdHJvbmc+IGJ1dHRvbi4gPC9wPgotICAgIDxwPiYjMTQ5OyBTZWUgdGhlIHJlc3VsdHMgb24gdGhlIDxzdHJvbmc+UHJldmlldyA8L3N0cm9uZz4gdGFiLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPiAgICBSZW1vdmUgYSBzdGVwIDogPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+JiMxNDk7IFJldHVybiB0byB0aGUgPHN0cm9uZz5TdGVwczwvc3Ryb25nPiB0YWIuIDwvcD4KLSAgICA8cD4mIzE0OTsgQ2xpY2sgdGhlIHN0ZXAgdG8gcmVtb3ZlIGluIHRoZSBTdGVwcyBwYW5lbC4gPC9wPgotICAgIDxwPiYjMTQ5OyBDbGljayB0aGUgPHN0cm9uZz5EZWxldGUgPC9zdHJvbmc+IGJ1dHRvbi4gPC9wPgotICAgIDxwPiYjMTQ5OyBTZWUgdGhlIHJlc3VsdHMgb24gdGhlIDxzdHJvbmc+UHJldmlldyA8L3N0cm9uZz4gdGFiLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPiAgICBNb3ZlIGEgc3RlcCB1cCB0aGUgbGlzdDogPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IFJldHVybiB0byB0aGUgPHN0cm9uZz5TdGVwczwvc3Ryb25nPiB0YWIuIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgQ2xpY2sgdGhlIHN0ZXAgeW91IHdhbnQgdG8gbW92ZSB1cC48L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IENsaWNrIHRoZSA8c3Ryb25nPlVwIDwvc3Ryb25nPiBidXR0b24uPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBTZWUgdGhlIHJlc3VsdHMgb24gdGhlIDxzdHJvbmc+UHJldmlldyA8L3N0cm9uZz4gdGFiLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPk1vdmUgYSBzdGVwIGRvd24gdGhlIGxpc3QgOiAgPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IFJldHVybiB0byB0aGUgPHN0cm9uZz5TdGVwczwvc3Ryb25nPiB0YWIuIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgQ2xpY2sgdGhlIHN0ZXAgeW91IHdhbnQgdG8gbW92ZSBkb3duLjwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgQ2xpY2sgdGhlIDxzdHJvbmc+RG93biA8L3N0cm9uZz4gYnV0dG9uLjwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgU2VlIHRoZSByZXN1bHRzIG9uIHRoZSA8c3Ryb25nPlByZXZpZXcgPC9zdHJvbmc+IHRhYi4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci08L29sPgotPGgyPiZuYnNwOzwvaDI+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzYuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MTJkZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPjwvYT48YT5FeGVyY2lzZSA2OiBDcmVhdGUgR3VpZGFuY2UgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGNyZWF0ZSBtZXRob2QgPHN0cm9uZz5HdWlkYW5jZSA8L3N0cm9uZz4gZWxlbWVudHMuIFRoZXJlIGlzIGEgcmFuZ2Ugb2YgZGlmZmVyZW50IHR5cGVzIG9mIGd1aWRhbmNlIHRoYXQgY2FuIGJlIGNyZWF0ZWQuIEZvciB0aGlzIHRhc2sgd2Ugd2lsbCBzaW1wbHkgY3JlYXRlIGEgcmVwcmVzZW50YXRpdmUgZ3VpZGFuY2UgZWxlbWVudCwgYSBjaGVja2xpc3QuIE9uY2UgeW91IGhhdmUgZG9uZSB0aGlzLCB0cnkgYXV0aG9yaW5nIGFkZGl0aW9uYWwgR3VpZGFuY2UgdHlwZXMuIDwvcD4KLTxwPkluIGEgY2hlY2tsaXN0LCBDaGVjayBJdGVtcyBhcmUgY3JlYXRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgU3RlcHMgaW4gYSB0YXNrIGFyZSBjcmVhdGVkIHVzaW5nIHRoZSA8c3Ryb25nPkNoZWNrIEl0ZW1zIDwvc3Ryb25nPiB0YWIgaW4gdGhlIDxzdHJvbmc+Q2hlY2tsaXN0IEVkaXRvcjwvc3Ryb25nPi4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+TWFrZSBzdXJlIHlvdSBhcmUgaW4gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+V2l0aGluIDxzcGFuIGNsYXNzPSJzdHlsZTEiPk15IENvbnRlbnQgUGFja2FnZTwvc3Bhbj4gcmlnaHQtY2xpY2sgb24gdGhlIDxzdHJvbmc+R3VpZGFuY2UgPC9zdHJvbmc+IGZvbGRlci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+SGlnaGxpZ2h0IDxzdHJvbmc+TmV3IDwvc3Ryb25nPiBhbmQgdGhlbiBjbGljayA8c3Ryb25nPkNoZWNrbGlzdDwvc3Ryb25nPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+TmFtZSB0aGUgZ3VpZGFuY2UsIG15X2NyZWF0ZV9waHlzaWNhbF9hcHBlYXJhbmNlX2NoZWNrbGlzdCwgYW5kIHByb3ZpZGUgdGhlIHByZXNlbnRhdGlvbiBuYW1lLCBNeSBDcmVhdGUgUGh5c2ljYWwgQXBwZWFyYW5jZSBDaGVja2xpc3QuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBBZGQgdGhlIGZvbGxvd2luZyBjaGVjayBpdGVtczogPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IENyZWF0ZSBicmFuZGluZyBzcGVjaWZpY2F0aW9ucyA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IERlZmluZSBwaHlzaWNhbCBzcGVjaWZpY2F0aW9ucyA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPkFkZCB0aGUgY2hlY2tsaXN0IHRvIHRoZSA8c3Ryb25nPiBteV9wcm90b3R5cGVfdXNlcl9pbnRlcmZhY2UgPC9zdHJvbmc+dGFzayBhbmQgdGhlbiBsb29rIGZvciBpdCBvbiB0aGUgcHJldmlldyBwYWdlLiA8L2xpPgotPC9vbD4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF83Lmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWQ0NjBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPjwvYT48YT48L2E+PGE+PC9hPjxhPkV4ZXJjaXNlIDc6IE1hbmFnZSBHdWlkYW5jZSA8L2E+PC9oMj4KLTxwPkd1aWRhbmNlIGNhbiBiZSBhdHRhY2hlZCB0byBhbnkgQ29yZSBNZXRob2QgQ29udGVudCBvciBQcm9jZXNzIEVsZW1lbnQuIEd1aWRhbmNlIGNhbiBldmVuIGJlIGF0dGFjaGVkIHRvIGEgR3VpZGFuY2UgZWxlbWVudC4gPC9wPgotPHA+VGhlIGdvYWwgb2YgdGhpcyBleGVyY2lzZSBpcyB0byBjYXJyeSBvdXQgc29tZSBzaW1wbGUgZ3VpZGFuY2UgbWFuYWdlbWVudCB0YXNrcyAoaS5lLiwgYWRkaW5nIGFuZCByZW1vdmluZyBndWlkYW5jZS4pPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+TmF2aWdhdGUgdG8gdGhlIGFydGlmYWN0IDxzdHJvbmc+bXlfcnVwX25hdm1hcCA8L3N0cm9uZz4gdGhhdCB5b3UgY3JlYXRlZCBpbiBleGVyY2lzZSAyIGluIHRoaXMgdHV0b3JpYWwuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBBZGQgdGhlIENvbmNlcHQgUGFwZXIgPHN0cm9uZz5wcm9jZXNzX3ZpZXcgPC9zdHJvbmc+IGZyb20gdGhlIFJVUCBwbHVnLWluLiA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD5UaGUgbGlzdCBvZiBpdGVtcyBpbiB0aGUgU2VsZWN0IERpYWxvZyBpcyByZXN0cmljdGVkIHRvIGp1c3QgdGhvc2UgaXRlbXMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSBhZGRlZC4gVGhlIGxpc3QgY2FuIGJlIGxvbmcgdGhvdWdoLiBZb3UgY2FuIGVudGVyIGEgc2VhcmNoIHN0cmluZywgc3VjaCBhcyCRcHJvJyBpbiB0aGUgkU5hbWUgcGF0dGVybnMnIGJveCB0byBmaWx0ZXIgdGhlIGl0ZW1zIHRoYXQgYXJlIGRpc3BsYXllZC4gTm90ZSB0aGF0IHlvdSBjYW4gdXNlIHRoZSBDb2xsYXBzZSBBbGwgYW5kIEV4cGFuZCBBbGwgYnV0dG9ucyBvbiB0aGlzIGRpYWxvZyB0byBjaGFuZ2UgdGhlIHdheSB0aGUgdHJlZSBpcyBkaXNwbGF5ZWQuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+Ci0gICAgPHA+QWRkIDxzdHJvbmc+bXlfY3JlYXRlX3BoeXNpY2FsX2FwcGVhcmFuY2VfY2hlY2tsaXN0IDwvc3Ryb25nPiBDaGVja2xpc3QuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIHRoZSA8c3Ryb25nPlByZXZpZXcgPC9zdHJvbmc+IHRhYiB0byB2aWV3IHlvdXIgd29yay4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+UmVtb3ZlIHRoZSBDb25jZXB0IFBhcGVyIHByb2Nlc3Nfdmlldy4gPC9wPgotICA8L2xpPgotICA8bGk+Q2xpY2sgdGhlIDxzdHJvbmc+UHJldmlldyA8L3N0cm9uZz4gdGFiIHRvIHZpZXcgeW91ciB3b3JrLiA8L2xpPgotPC9vbD4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF84Lmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzguaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDIzNjk0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzguaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPjwvYT48YT48L2E+PGE+PC9hPjxhPjwvYT48YT48L2E+PGE+RXhlcmNpc2UgODogQ3JlYXRlIE5ldyBTdGFuZGFyZCBDYXRlZ29yeSA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gdW5kZXJzdGFuZCBhbmQgdXNlIDxzdHJvbmc+U3RhbmRhcmQgQ2F0ZWdvcmllcy4gPC9zdHJvbmc+SW4gcHJhY3RpY2UsIHRoaXMgd2lsbCBub3QgYmUgZG9uZSB2ZXJ5IG9mdGVuLCBhcyBTdGFuZGFyZCBDYXRlZ29yaWVzIHRlbmQgdG8gYmUgcmVsYXRpdmVseSBzdGFibGUuIEFsc28sIGlmIHlvdSBhcmUgY3JlYXRpbmcgYSBwbHVnLWluIHRoYXQgZXh0ZW5kcyBSVVAsIHlvdSBzaG91bGQgYXR0ZW1wdCB0byB1c2UgdGhlIFJVUCBTdGFuZGFyZCBDYXRlZ29yaWVzIGJlZm9yZSBjcmVhdGluZyBuZXcgb25lcy4gPC9wPgotPHA+PHN0cm9uZz5TdGFuZGFyZCBDYXRlZ29yaWVzIDwvc3Ryb25nPiBwcm92aWRlIGEgbWVhbnMgdG8gY2F0ZWdvcml6ZSBjb3JlIG1ldGhvZCBjb250ZW50IGluIGxpbmUgd2l0aCBiZXN0IHByYWN0aWNlcyBmb3IgY3JlYXRpbmcgc3RydWN0dXJlZCBtZXRob2RzLiBJbiBvcmRlciB0byBlbmNvdXJhZ2UgZ29vZCBtZXRob2Qgc3RydWN0dXJlIHdlIHByb3ZpZGUgc3RhbmRhcmQgY2F0ZWdvcmllcyBmb3IgZ3JvdXBpbmcgPHN0cm9uZz5UYXNrcyA8L3N0cm9uZz5pbnRvIDxzdHJvbmc+PGVtPkRpc2NpcGxpbmVzIDwvZW0+PC9zdHJvbmc+LCA8c3Ryb25nPldvcmsgUHJvZHVjdHMgPC9zdHJvbmc+IGludG8gPHN0cm9uZz48ZW0+RG9tYWlucyA8L2VtPjwvc3Ryb25nPiwgPHN0cm9uZz5Sb2xlcyA8L3N0cm9uZz4gaW50byA8c3Ryb25nPjxlbT5Sb2xlIFNldHMgPC9lbT48L3N0cm9uZz4sIGFuZCA8c3Ryb25nPlRvb2wtTWVudG9ycyA8L3N0cm9uZz4gaW50byA8c3Ryb25nPjxlbT5Ub29scyA8L2VtPjwvc3Ryb25nPi4gVW5saWtlIDxzdHJvbmc+PGVtPkN1c3RvbSA8L2VtPiBDYXRlZ29yaWVzIDwvc3Ryb25nPiwgPHN0cm9uZz5TdGFuZGFyZCBDYXRlZ29yaWVzIDwvc3Ryb25nPiBieSBkZWZpbml0aW9uIGFyZSBsaW5rZWQgd2l0aCBhIHNwZWNpZmljIG1ldGhvZCBjb250ZW50IHR5cGUgliBlLmcuIFJvbGUgU2V0cyB3aXRoIFJvbGVzLCBEaXNjaXBsaW5lcyB3aXRoIFRhc2tzLCBhbmQgRG9tYWlucyB3aXRoIFdvcmsgUHJvZHVjdHMuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPkNsaWNrIDxzdHJvbmc+TXkgUGx1Z2luICZndDsgTWV0aG9kIENvbnRlbnQgJmd0OyBTdGFuZGFyZCBDYXRlZ29yaWVzPC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ3JlYXRlIGEgbmV3IDxzdHJvbmc+Um9sZSBTZXQgPC9zdHJvbmc+bmFtZWQgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfZGVzaWduPC9zcGFuPiB3aXRoIGEgcHJlc2VudGF0aW9uIG5hbWUgb2YgPHNwYW4gY2xhc3M9InN0eWxlMSI+TXkgRGVzaWduPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIEFkZCB0aGUgcm9sZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9ydXBfdXNlcl9pbnRlcmZhY2VfZGVzaWduZXI8L3NwYW4+IHRvIHRoZTxzcGFuIGNsYXNzPSJzdHlsZTEiPiBteV9kZXNpZ248L3NwYW4+IDxzdHJvbmc+Um9sZSBTZXQ8L3N0cm9uZz4uIDwvbGk+Ci08L29sPgotPGJsb2NrcXVvdGU+Ci0gIDxwPlRoZXJlIGFyZSB0d28gd2F5cyB5b3UgY2FuIGRvIHRoaXM6IDwvcD4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IEluIHRoZSBTdGFuZGFyZCBDYXRlZ29yeSBlZGl0b3IgZm9yIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2Rlc2lnbjwvc3Bhbj4sIG9wZW4gdGhlIDxzdHJvbmc+Um9sZXM8L3N0cm9uZz4gdGFiLCBhbmQgYWRkIHRoZSByb2xlIHRvIHRoZSByb2xlc2V0LiA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7SW4gdGhlIFJvbGUgZWRpdG9yIGZvciA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9ydXBfdXNlcl9pbnRlcmZhY2VfZGVzaWduZXI8L3NwYW4+LCBvcGVuIHRoZSA8c3Ryb25nPkNhdGVnb3JpZXM8L3N0cm9uZz4gdGFiIGFuZCBhZGQgdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2Rlc2lnbjwvc3Bhbj4gY2F0ZWdvcnkgYXMgYSBTZWxlY3RlZCBSb2xlc2V0LiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLTwvYmxvY2txdW90ZT4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF85Lmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTc4OTMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPjwvYT48YT48L2E+PGE+PC9hPjxhPjwvYT48YT48L2E+PGE+RXhlcmNpc2UgOTogPC9hPkFkZGluZyBZb3VyIFBsdWctaW4gdG8gdGhlIENvbmZpZ3VyYXRpb24gVmlldyA8L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBsZWFybiBob3cgdG8gaW5jbHVkZSB5b3VyIHBsdWctaW4gaW4gYSBjb25maWd1cmF0aW9uLiA8L3A+Ci08cD5CZWZvcmUgeW91ciBuZXcgZWxlbWVudHMgY2FuIGJlIHNlZW4gaW4gdGhlIENvbmZpZ3VyYXRpb24gVmlldywgeW91IG5lZWQgdG8gZmlyc3QgYWRkIHlvdXIgbmV3IHBsdWctaW4gdG8gYSBjb25maWd1cmF0aW9uLiBXZSdsbCBhZGQgdGhlIG5ldyBwbHVnLWluIHRvIHRoZSBDb25maWcgZm9yIFJVUCBjb25maWd1cmF0aW9uIGFuZCBzZWUgdGhlIHJlc3VsdHMgaW4gdGhlIENvbmZpZ3VyYXRpb24gVmlldy4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIHRoZSA8c3Ryb25nPkJyb3dzaW5nIDwvc3Ryb25nPnBlcnNwZWN0aXZlIGFuZCBpbiB0aGUgPHN0cm9uZz5Db25maWd1cmF0aW9uIFZpZXcgPC9zdHJvbmc+dHJ5IHRvIGZpbmQgeW91ciBuZXcgY29udGVudC4gRm9yIGV4YW1wbGUgbG9vayBmb3IgTXkgRGVzaWduIFJvbGVzZXQuIFlvdSBzaG91bGRuJ3Qgc2VlIGl0LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU3dpdGNoIHRvIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz5wZXJzcGVjdGl2ZSBhbmQgdGhlbiBjbGljayA8c3Ryb25nPkNvbmZpZ3VyYXRpb25zIDwvc3Ryb25nPiBhdCB0aGUgYm90dG9tIG9mIHRoZSB0cmVlIGRpc3BsYXkuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBNYWtlIGEgY29weSBvZiB0aGUgPHN0cm9uZz5SVVAgZm9yIFNtYWxsIFByb2plY3RzIDwvc3Ryb25nPiBjb25maWd1cmF0aW9uLiBSaWdodC1jbGljayBvbiB0aGUgPHN0cm9uZz5SVVAgZm9yIFNtYWxsIFByb2plY3RzIDwvc3Ryb25nPiBjb25maWd1cmF0aW9uIGFuZCBzZWxlY3QgPHN0cm9uZz5Db3B5IDwvc3Ryb25nPi4gVGhlbiByaWdodC1jbGljayBvbiB0aGUgQ29uZmlndXJhdGlvbnMgZm9sZGVyIGFuZCBjbGljayA8c3Ryb25nPlBhc3RlIDwvc3Ryb25nPi4gTmFtZSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gPHN0cm9uZz5NeSBSVVAgZm9yIFNtYWxsIFByb2plY3RzLiA8L3N0cm9uZz48L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gRG91YmxlLWNsaWNrIG9uIHRoZSA8c3Ryb25nPk15IFJVUCBmb3IgU21hbGwgUHJvamVjdHMgPC9zdHJvbmc+IGNvbmZpZ3VyYXRpb24gdG8gb3BlbiB0aGUgQ29uZmlndXJhdGlvbiBFZGl0b3IuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDbGljayBvbiB0aGUgPHN0cm9uZz5QbHVnLWluIGFuZCBQYWNrYWdlIFNlbGVjdGlvbjwvc3Ryb25nPiB0YWIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgPHN0cm9uZz5NeSBQbHVnaW4gPC9zdHJvbmc+IHRvIHRoZSBjb25maWd1cmF0aW9uIGJ5IGNoZWNraW5nIHRoZSBib3ggbmV4dCB0byBpdCBpbiB0aGUgQ29uZmlndXJhdGlvbiBDb21wb25lbnRzIGZpZWxkLiBJZiB5b3UgZXhwYW5kIDxzdHJvbmc+TXkgUGx1Z2luIDwvc3Ryb25nPiB5b3Ugd2lsbCBzZWUgdGhhdCB0aGUgZnVsbCBjb250ZW50cyBvZiB0aGUgcGx1Zy1pbiBoYXZlIGJlZW4gc2VsZWN0ZWQuIAotICAgICAgWW91IG1heSBzZWUgc29tZSBlcnJvcnMgaW4gdGhlIExpYnJhcnkgRXJyb3IgTG9nIHZpZXcuIFlvdSBjYW4gY2xpY2sgdGhyb3VnaCB0aGVzZSBlcnJvcnMgb3IgaWdub3JlIHRoZW0gZm9yIG5vdy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENsb3NlIHRoZSBlZGl0b3IgYW5kIHNhdmUgdGhlIGNoYW5nZXMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDaGFuZ2UgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiB0byA8c3Ryb25nPk15IFJVUCBmb3IgU21hbGwgUHJvamVjdHMgPC9zdHJvbmc+aW4gdGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0aW9uIGJveCBpbiB0aGUgRVBGIENvbXBvc2VyIHRvb2xiYXIsIGp1c3QgYmVsb3cgdGhlIG1haW4gbWVudSBiYXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiBTd2l0Y2ggdG8gdGhlIDxzdHJvbmc+QnJvd3NpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlIGFuZCBub3cgbG9vayBmb3IgeW91ciBjb250ZW50IGluIHRoZSA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gVmlldzwvc3Ryb25nPi4gWW91IHNob3VsZCBub3cgc2VlIDxzdHJvbmc+TXkgRGVzaWduIFJvbGVzZXQgPC9zdHJvbmc+LiBZb3Ugc2hvdWxkIGFsc28gc2VlIHlvdXIgbmV3IFdvcmsgUHJvZHVjdHMgaW4gdGhlIFVuY2F0ZWdvcml6ZWQgZm9sZGVyIHVuZGVyIERvbWFpbnMuIDwvbGk+Ci08L29sPgotPGJsb2NrcXVvdGU+Jm5ic3A7PC9ibG9ja3F1b3RlPgotPGgyPiZuYnNwOzwvaDI+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2ludHJvLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2ludHJvLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNlY2E4OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9pbnRyby5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDE+PGE+VHV0b3JpYWw6IENyZWF0ZSBNZXRob2QgQ29udGVudCA8L2E+PC9oMT4KLTxoMj48YT5JbnRyb2R1Y3Rpb24gPC9hPjwvaDI+Ci08cD5FUEYgQ29tcG9zZXIgc2VwYXJhdGVzIHJldXNhYmxlIDxzdHJvbmc+bWV0aG9kIGNvbnRlbnQgPC9zdHJvbmc+IGZyb20gaXRzIGFwcGxpY2F0aW9uIGluIDxzdHJvbmc+cHJvY2Vzc2VzIDwvc3Ryb25nPi4gVGhlIHByaW1hcnkgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgYXJlIDxzdHJvbmc+dGFza3MgPC9zdHJvbmc+LCA8c3Ryb25nPnJvbGVzIDwvc3Ryb25nPiwgPHN0cm9uZz53b3JrIHByb2R1Y3RzIDwvc3Ryb25nPiBhbmQgPHN0cm9uZz5ndWlkYW5jZSA8L3N0cm9uZz4uIEEgUHJvY2VzcyBFbmdpbmVlciB1c2VzIEVQRiBDb21wb3NlciB0byBhdXRob3IgdGhlc2UgZWxlbWVudHMsIGRlZmluZSB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZW0sIGFuZCB0byBjYXRlZ29yaXplIHRoZW0uIE1ldGhvZCBjb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcgaG93IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gPC9wPgotPHA+RVBGIENvbXBvc2VyIHN1cHBvcnRzIHRoZSBjb25jZXB0IG9mIDxzdHJvbmc+TWV0aG9kIFBsdWctaW5zIDwvc3Ryb25nPiB0aGF0IGFsbG93cyB0aGUgZXh0ZW5zaW9uIG9yIGN1c3RvbWl6YXRpb24gb2YgYmFzZSBsaWJyYXJ5IGNvbnRlbnQgd2l0aG91dCBkaXJlY3RseSBjaGFuZ2luZyB0aGF0IGJhc2UgY29udGVudC4gV2hlbiB3ZSBzaGlwIGEgbGlicmFyeSB3aXRoIEVQRiBDb21wb3NlciB0aGUgbGlicmFyeSBpcyBwcm90ZWN0ZWQgZnJvbSBkaXJlY3QgbW9kaWZpY2F0aW9uLiBUaGUgUlVQIHBsdWdpbnMgYXJlIGdyYXllZCBvdXQgaW4gdGhlIExpYnJhcnkgdmlldyBpbmRpY2F0aW5nIHRoYXQgdGhleSBhcmUgbG9ja2VkLiA8L3A+Ci08cD48c3Ryb25nPllvdSBzaG91bGQgYWx3YXlzIGNyZWF0ZSBuZXcgY29udGVudCBpbiBhIE1ldGhvZCBQbHVnLWluIHRoYXQgeW91IHByb2R1Y2UuIDwvc3Ryb25nPlRoaXMgc2VwYXJhdGVzIHlvdXIgY29udGVudCBmcm9tIHRoZSBvcmlnaW5hbCBPcGVuVVAgY29udGVudCBhbmQgYWxsb3dzIHlvdSB0byB1cGRhdGUgeW91ciBvd24gbGlicmFyeSB3aXRoIG5ldyByZWxlYXNlcyBvZiB0aGUgT3BlblVQIGxpYnJhcnkgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNvbnRlbnQgdGhhdCB5b3UgaGF2ZSBjcmVhdGVkIGluIHlvdXIgb3duIHBsdWctaW5zLiA8L3A+Ci08cD5JbiB0aGlzIHR1dG9yaWFsIHlvdSB3aWxsIHVzZSBzZXZlcmFsIJFlZGl0b3JzJy4gRWFjaCBlZGl0b3Igb3BlbnMgaW4gaXRzIG93biB0YWIgaW4gdGhlIGNvbnRlbnQgZGlzcGxheSBzZWN0aW9uIG9mIHRoZSBzY3JlZW4uIEl0IGlzIGdvb2QgcHJhY3RpY2UgdG8gY2xvc2UgYW4gZWRpdG9yIHdoZW4geW91IGhhdmUgZmluaXNoZWQgd2l0aCBpdC4gVGhpcyBlbnN1cmVzIHRoYXQgeW91IHNhdmUgYW55IGNoYW5nZXMgeW91IG1ha2UuIDwvcD4KLTxwPklmIHlvdSBkbyBoYXZlIHNldmVyYWwgZWRpdG9ycyBvcGVuLCB5b3UgbWF5IHdhbnQgdG8gdHVybiBvbiB0aGUgkUxpbmsgd2l0aCBFZGl0b3InIGZlYXR1cmUgYnkgY2xpY2tpbmcgb24gdGhlIExpbmsgd2l0aCBFZGl0b3IgYnV0dG9uIGluIHRoZSBMaWJyYXJ5IHZpZXcgdG9vbGJhci4gSWYgdGhpcyBpcyBzZWxlY3RlZCwgd2hlbiB5b3Ugc3dpdGNoIGJldHdlZW4gZWRpdG9ycywgdGhlIGVsZW1lbnQgaW4gdGhlIGN1cnJlbnQgZWRpdG9yIGlzIGhpZ2hsaWdodGVkIGluIHRoZSBMaWJyYXJ5IHZpZXcuIDwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgZXhlcmNpc2VzIHRha2UgeW91IHRocm91Z2ggdGhlIGNyZWF0aW9uIG9mIJNjb3JlIG1ldGhvZCBjb250ZW50lC4gPC9wPgotPGgyPiZuYnNwOzwvaDI+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzEuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODliMDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgMTogQWRkaW5nIHRvIGJhc2UgbWV0aG9kIGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIGEgcm9sZSB1c2luZyBDb250cmlidXRpb24gPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGV4dGVuZCBhIHJvbGUgaW4gUlVQIHVzaW5nIJFjb250cmlidXRpb24nLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggdG8gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+VGhpcyBleGVyY2lzZSBhZGRzIGNvbnRlbnQgdG8gdGhlIE15IFBsdWdpbiBwbHVnaW4uIElmIHlvdSBoYXZlIG5vdCBjYXJyaWVkIG91dCB0aGUgkUNyZWF0ZSBDb3JlIE1ldGhvZCBDb250ZW50IHR1dG9yaWFsLCBjcmVhdGUgaXQgbm93LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DcmVhdGUgYSBDb250ZW50IFBhY2thZ2UgaW4gdGhlIE15IFBsdWdpbiBwbHVnLWluIGNhbGxlZCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5Db250cmlidXRpb248L3NwYW4+IFRlc3QuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkluIHRoZSBuZXcgQ29udHJpYnV0aW9uIFRlc3QgY29udGVudCBwYWNrYWdlLCBjcmVhdGUgYSBuZXcgUm9sZTogPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfY29udHJpYnV0aW5nX3VpX2Rlc2lnbmVyPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+UGFnZSBkb3duIHRoZSBEZXNjcmlwdGlvbiB0YWIgdG8gdGhlIENvbnRlbnQgVmFyaWFiaWxpdHkgc2VjdGlvbiBhbmQgdGhlbiwgaW4gdGhlIDxzdHJvbmc+VmFyaWFiaWxpdHkgVHlwZSA8L3N0cm9uZz4sIHNlbGVjdCA8c3Ryb25nPkNvbnRyaWJ1dGVzIDwvc3Ryb25nPiBhbmQgY2hvb3NlIHRoZSBiYXNlIHJvbGU6IDxzdHJvbmc+cnVwX3VzZXJfaW50ZXJmYWNlX2Rlc2lnbmVyIDwvc3Ryb25nPi4gWW91IHdpbGwgZmluZCB0aGlzIGluIDxzdHJvbmc+UlVQICZndDsgRGVzaWduICZndDsgR1VJIERlc2lnbjwvc3Ryb25nPi4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIENvbXBsZXRlIHRoZSBmb2xsb3dpbmc6IDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBBZGQgQnJpZWYgRGVzY3JpcHRpb246IENvbnRyaWJ1dGluZyBicmllZiBkZXNjcmlwdGlvbiB0ZXh0IDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgQWRkIE1haW4gRGVzY3JpcHRpb24gOiBDb250cmlidXRpbmcgbWFpbiBkZXNjcmlwdGlvbiB0ZXh0IDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgU2F2ZSAoYnkgY2xvc2luZyB0aGUgcm9sZSBlZGl0b3IpLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPgotICAgIDxwPkNyZWF0ZSBhIG5ldyBDb25maWd1cmF0aW9uIGJ5IHNlbGVjdGluZyB0aGUgPHN0cm9uZz5Db25maWd1cmF0aW9ucyA8L3N0cm9uZz4gZm9sZGVyIGluIHRoZSBMaWJyYXJ5IFZpZXcgdHJlZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+UmlnaHQgY2xpY2sgdGhlIGZvbGRlciB0byBjcmVhdGUgbmV3IGNvbmZpZ3VyYXRpb24gYW5kIHRoZW4gbmFtZSB0aGUgY29uZmlndXJhdGlvbiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5WYXJpYWJpbGl0eSBDb25maWd1cmF0aW9uPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNlbGVjdCB0aGUgUlVQIGJhc2UgYW5kIHlvdXIgcGx1Zy1pbiAoTXkgUGx1Z2luKSBieSBtYXJraW5nIHRoZSBjaGVja2JveGVzLiBTYXZlIHRoZSBjb25maWd1cmF0aW9uIChjbG9zZSB0aGUgY29uZmlndXJhdGlvbiB0YWIpLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5TZXQgk2N1cnJlbnQgY29uZmlndXJhdGlvbpQgliBsb2NhdGVkIHVuZGVyIG1haW4gbWVudSBiYXIgYXMgk1ZhcmlhYmlsaXR5IENvbmZpZ3VyYSB0aW9ulC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIHRoZSA8c3Ryb25nPkJyb3dzaW5nPC9zdHJvbmc+IHBlcnNwZWN0aXZlIGFuZCB0aGVuIG9wZW4gdGhlIFVzZXItSW50ZXJmYWNlIERlc2lnbmVyIHJvbGUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBZb3Ugc2hvdWxkIHNlZSB0aGUgdGV4dCB0aGF0IHlvdSBpbmNsdWRlZCBpbiB0aGUgQ29udHJpYnV0aW5nIHJvbGUgZGlzcGxheWVkIGluIHRoZSBVc2VyLUludGVyZmFjZSBEZXNpZ25lci4gPC9saT4KLTwvb2w+Ci08YmxvY2txdW90ZT4KLSAgPHA+PHN0cm9uZz5Ob3RlOiA8L3N0cm9uZz4gVGhlIENvbmZpZ3VyYXRpb24gVmlldyByZXNvbHZlcyB0aGUgdmFyaWFiaWxpdHkgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHJlbGF0ZWQgcGx1Zy1pbnMgaW4gYSBjb25maWd1cmF0aW9uIGFuZCBzaG93cyB0aGUgcmVzdWx0cyBhcyB0aGV5IHdpbGwgYmUgcHVibGlzaGVkIGluIGEgcHVibGlzaGVkIHdlYiBzaXRlLiA8L3A+Ci08L2Jsb2NrcXVvdGU+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfMi5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF8yLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3OTczZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF8yLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSAyOiBBZGRpbmcgdG8gYmFzZSBtZXRob2QgY29udGVudCBhc3NvY2lhdGVkIHdpdGggYSB3b3JrIHByb2R1Y3QgdXNpbmcgPHU+Q29udHJpYnV0aW9uPC91PiA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gZXh0ZW5kIGEgPHN0cm9uZz5Xb3JrIFByb2R1Y3QgPC9zdHJvbmc+ICg8c3Ryb25nPkFydGlmYWN0PC9zdHJvbmc+KSBpbiBSVVAgdXNpbmcgkWNvbnRyaWJ1dGlvbicuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCB0byB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gV2l0aGluIHRoZSBDb250cmlidXRpb24gVGVzdCBwYWNrYWdlIGNyZWF0ZSBhIG5ldyBhcnRpZmFjdCBjYWxsZWQgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfY29udHJpYnV0aW5nX25hdm1hcDwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgYSA8c3Ryb25nPkJyaWVmIERlc2NyaXB0aW9uLCBNYWluIERlc2NyaXB0aW9uPC9zdHJvbmc+LCA8c3Ryb25nPlB1cnBvc2U8L3N0cm9uZz4sIGV0Yy4sIDogPHNwYW4gY2xhc3M9InN0eWxlMSI+Q29udHJpYnV0aW5nIEJyaWVmIERlc2NyaXB0aW9uLCBDb250cmlidXRpbmcgTWFpbiBEZXNjcmlwdGlvbiwgYW5kIENvbnRyaWJ1dGluZyBQdXJwb3NlPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEluIDxzdHJvbmc+VmFyaWFiaWxpdHkgUmVsYXRpb25zaGlwIDwvc3Ryb25nPiBzZWxlY3QgPHN0cm9uZz5Db250cmlidXRlcyA8L3N0cm9uZz4sIGFuZCBmb3IgPHN0cm9uZz5iYXNlIGFydGlmYWN0IDwvc3Ryb25nPiBzZWxlY3QgPHNwYW4gY2xhc3M9InN0eWxlMSI+cnVwX25hdm1hcDwvc3Bhbj4uIFNhdmUgYnkgY2xvc2luZyB0aGUgV29yayBQcm9kdWN0IGVkaXRvci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFN3aXRjaCB0byB0aGUgQnJvd3NpbmcgcGVyc3BlY3RpdmUgYW5kIHZpZXcgdGhlIE5hdmlnYXRpb24gTWFwIGFydGlmYWN0IGluIHRoZSA8c3Ryb25nPkFuYWx5c2lzIGFuZCBEZXNpZ24gRG9tYWluIDwvc3Ryb25nPiBmb2xkZXIgaW4gPHN0cm9uZz5Db25maWd1cmF0aW9uIFZpZXcuIDwvc3Ryb25nPjwvcD4KLSAgPC9saT4KLSAgPGxpPiBZb3Ugc2hvdWxkIHNlZSB0aGUgdGV4dCB0aGF0IHlvdSBpbmNsdWRlZCBpbiB0aGUgQ29udHJpYnV0aW5nIHJvbGUgZGlzcGxheWVkIGluIHRoZSBVc2VyLUludGVyZmFjZSBEZXNpZ25lci4gPC9saT4KLTwvb2w+Ci08YmxvY2txdW90ZT4mbmJzcDs8L2Jsb2NrcXVvdGU+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfMy5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF8zLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ0ZDkwYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF8zLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSAzOiBBZGRpbmcgYmFzZSBtZXRob2QgY29udGVudCBhc3NvY2lhdGVkIHdpdGggYSB0YXNrIHVzaW5nIDx1PkNvbnRyaWJ1dGlvbjwvdT4gPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGV4dGVuZCBhIDxzdHJvbmc+VGFzayA8L3N0cm9uZz4gaW4gUlVQIHVzaW5nIJFjb250cmlidXRpb24nLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggdG8gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+V2l0aGluIHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5Db250cmlidXRpb24gVGVzdCA8L3NwYW4+cGFja2FnZSBjcmVhdGUgYSBuZXcgPHN0cm9uZz5UYXNrPC9zdHJvbmc+OiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9jb250cmlidXRpbmdfZGVzaWduX3VzZXJfaW50ZXJmYWNlPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCBhIDxzdHJvbmc+QnJpZWYgRGVzY3JpcHRpb24sIE1haW4gZGVzY3JpcHRpb24gPC9zdHJvbmc+LCA8c3Ryb25nPlB1cnBvc2U8L3N0cm9uZz4sIGV0Yy4sOiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5Db250cmlidXRpbmcgQnJpZWYgRGVzY3JpcHRpb24gdGV4dCwgQ29udHJpYnV0aW5nIE1haW4gRGVzY3JpcHRpb24gdGV4dCwgYW5kIENvbnRyaWJ1dGluZyBQdXJwb3NlIHRleHQuIDwvc3Bhbj48L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIHR3byBuZXcgc3RlcHM6IDxzcGFuIGNsYXNzPSJzdHlsZTEiPkNvbnRyaWJ1dGluZyBTdGVwIDEgPC9zcGFuPmFuZDxzcGFuIGNsYXNzPSJzdHlsZTEiPiBDb250cmlidXRpbmcgU3RlcCAyPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEluIDxzdHJvbmc+VmFyaWFiaWxpdHkgUmVsYXRpb25zaGlwIDwvc3Ryb25nPiBzZWxlY3QgPHN0cm9uZz5Db250cmlidXRlczwvc3Ryb25nPiwgYW5kIGZvciBiYXNlIDxzdHJvbmc+dGFzayA8L3N0cm9uZz4gc2VsZWN0LCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5kZXNpZ25fdXNlcl9pbnRlcmZhY2U8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gR28gYmFjayB0byB0aGUgPHN0cm9uZz5TdGVwcyA8L3N0cm9uZz4gdGFiIGFuZCBjbGljayB0aGUgPHN0cm9uZz5PcmRlciA8L3N0cm9uZz4gYnV0dG9uLiBZb3UgY2FuIG5vdyBpbnNlcnQgeW91ciBuZXcgc3RlcHMgaW50byB0aGUgb3JpZ2luYWwgc3RlcHMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlNhdmUgdGhlIG5ldyB0YXNrIGJ5IGNsb3NpbmcgdGhlIHRhc2sgZWRpdG9yLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU3dpdGNoIHRvIHRoZSBCcm93c2luZyBwZXJzcGVjdGl2ZSBhbmQgdmlldyB0aGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+RGVzaWduIHRoZSBVc2VyIEludGVyZmFjZTwvc3Bhbj4gdGFzayBpbiB0aGUgPHN0cm9uZz5EaXNjaXBsaW5lcyA8L3N0cm9uZz4gZm9sZGVyIGluIDxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3IDwvc3Ryb25nPi4gWW91IHdpbGwgZmluZCBpdCB1bmRlciB0aGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+QW5hbHlzaXNfJmFtcDsgRGVzaWduPC9zcGFuPiBkaXNjaXBsaW5lLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gTG9vayBhdCB0aGUgZGVzY3JpcHRpb25zIGFuZCB0aGUgc3RlcHMgdG8gc2VlIGhvdyB5b3VyIG5ldyBtYXRlcmlhbCB3YXMgY29udHJpYnV0ZWQuIFlvdSBzaG91bGQgc2VlIHRoZSB0ZXh0IHRoYXQgeW91IGluY2x1ZGVkIGluIHRoZSBDb250cmlidXRpbmcgcm9sZSBkaXNwbGF5ZWQgaW4gdGhlIFVzZXIgSW50ZXJmYWNlIHRhc2suIDwvcD4KLSAgPC9saT4KLSAgPGxpPiBZb3UgY2FuIGFsc28gdHJ5IHNwZWNpZnlpbmcgYWRkaXRpb25hbCA8c3Ryb25nPmFydGlmYWN0cyA8L3N0cm9uZz4sIDxzdHJvbmc+Z3VpZGFuY2UgPC9zdHJvbmc+LCA8c3Ryb25nPmFkZGl0aW9uYWwgcGVyZm9ybWVyIHJvbGVzPC9zdHJvbmc+LCBldGMuLCBpbiB0aGUgY29udHJpYnV0aW5nIHRhc2sgKGluIEF1dGhvcmluZyBwZXJzcGVjdGl2ZSkgYW5kIHRoZW4gdmlldyB0aGUgcmVzdWx0IGluIHRoZSBDb25maWd1cmF0aW9uIFZpZXcgdG8gc2VlIHRoZSBiZWhhdmlvci4gPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF80Lmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDVjZTQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDQ6IEV4dGVuZGluZyBiYXNlIG1ldGhvZCBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCBhIHJvbGUgdXNpbmcgPHU+RXh0ZW5kczwvdT4gPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGV4dGVuZCBiYXNlIG1ldGhvZCBjb250ZW50IHZpYSBleHRlbmRzIHZhcmlhYmlsaXR5LiBFeHRlbmRzIHZhcmlhYmlsaXR5IHdvcmtzIGRpZmZlcmVudGx5IHRoYW4gQ29udHJpYnV0ZXMgdmFyaWFiaWxpdHkgaW4gdGhhdCB0aGUgbWV0aG9kIGNvbnRlbnQgZWxlbWVudCB0aGF0IGV4dGVuZHMgdGhlIGJhc2UgbWV0aG9kIGVsZW1lbnQgaW5oZXJpdHMgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGV4dGVuZGVkIGJhc2UgZWxlbWVudC4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+IFN3aXRjaCB0byB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ3JlYXRlIGEgbmV3IDxzdHJvbmc+Q29udGVudCBQYWNrYWdlIDwvc3Ryb25nPiBpbiB0aGUgTXkgUGx1Z2luIFBsdWctaW4gY2FsbGVkIEV4dGVuZHMgVGVzdC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENyZWF0ZSBhIG5ldyA8c3Ryb25nPlJvbGUgPC9zdHJvbmc+OiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9leHRlbmRzX3VpX2Rlc2lnbmVyLDwvc3Bhbj4gd2l0aCB0aGUgcHJlc2VudGF0aW9uIG5hbWUsIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkV4dGVuZHMgUlVQIFVJIERlc2lnbmVyPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEluIHRoZSBWYXJpYWJpbGl0eSBUeXBlIHNlbGVjdCA8c3Ryb25nPkV4dGVuZHMgPC9zdHJvbmc+IGFuZCBjaG9vc2UgdGhlIGJhc2Ugcm9sZTogPHNwYW4gY2xhc3M9InN0eWxlMSI+cnVwX3VzZXJfaW50ZXJmYWNlX2Rlc2lnbmVyPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCBhIDxzdHJvbmc+QnJpZWYgRGVzY3JpcHRpb248L3N0cm9uZz46IEV4dGVuZHMgUm9sZSBCcmllZiBEZXNjcmlwdGlvbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCBhIDxzdHJvbmc+TWFpbiBEZXNjcmlwdGlvbiA8L3N0cm9uZz46IEV4dGVuZHMgUm9sZSBNYWluIERlc2NyaXB0aW9uLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2F2ZSB0aGUgbmV3IHJvbGUgYnkgY2xvc2luZyB0aGUgcm9sZSBlZGl0b3IuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiBVcGRhdGUgdGhlIFZhcmlhYmlsaXR5IENvbmZpZ3VyYXRpb24gdG8gaW5jbHVkZSB0aGUgbmV3IGNvbnRlbnQgcGFja2FnZS4gPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+ICYjMTQ5OyZuYnNwO09wZW4gdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPlZhcmlhYmlsaXR5IENvbmZpZ3VyYXRpb248L3NwYW4+IGFuZCBleHBhbmQgPHN0cm9uZz5NeSBQbHVnaW4gJmd0OyBNZXRob2QgQ29udGVudCAmZ3Q7IENvbnRlbnQgUGFja2FnZXMuIDwvc3Ryb25nPiA8L3A+Ci0gICAgPHA+JiMxNDk7IFVuY2hlY2sgQ29udHJpYnV0aW9uIFRlc3QuIDwvcD4KLSAgICA8cD4mIzE0OTsgTWFrZSBzdXJlIDxzdHJvbmc+RXh0ZW5kcyBUZXN0IDwvc3Ryb25nPmlzIGNoZWNrZWQuIFRoaXMgaXMgZG9uZSBzbyB0aGVyZSB0aGF0IGFyZSBubyBjb25mbGljdGluZyBleHRlbnNpb25zIHRvIHRoZSBzYW1lIG1ldGhvZCBlbGVtZW50LiA8L3A+Ci0gICAgPHA+JiMxNDk7IENsb3NlIGFuZCBzYXZlIHRoZSBjaGFuZ2VzIHRvIHRoZSBjb25maWd1cmF0aW9uLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPgotICAgIDxwPiBTd2l0Y2ggdG8gPHN0cm9uZz5Ccm93c2luZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiBJbiB0aGUgPHN0cm9uZz5Db25maWd1cmF0aW9uIFZpZXc8L3N0cm9uZz4sIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+RXh0ZW5kcyBSVVAgVUkgRGVzaWduZXIgcm9sZTwvc3Bhbj4gaW4gdGhlIFVuY2F0ZWdvcml6ZWQgUm9sZXMgZm9sZGVyIHVuZGVyIHRoZSCTPHN0cm9uZz5Sb2xlIFNldHM8L3N0cm9uZz6UIGZvbGRlci4gWW91IHdpbGwgc2VlIGluIHRoZSBodG1sIHBhZ2UgdGhhdCBjb250ZW50IGVudGVyZWQgaW4gdGhlIGV4dGVuZGluZyByb2xlIGhhcyBiZWVuIHJlcGxhY2VkLCB3aGVyZWFzIGNvbnRlbnQgbm90IHByb3ZpZGVkIGhhcyBiZWVuIGluaGVyaXRlZCBmcm9tIHRoZSBiYXNlIGFydGlmYWN0LiBOb3RlIHRoYXQgdGhlIGV4dGVuZGVkIHJvbGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+VXNlci1JbnRlcmZhY2UgRGVzaWduZXI8L3NwYW4+IHJlbWFpbnMgdW5jaGFuZ2VkLiA8L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzUuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0Yjg1MWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgNTogRXh0ZW5kaW5nIGJhc2UgbWV0aG9kIGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIGEgV29yayBQcm9kdWN0IHVzaW5nIDx1PkV4dGVuZHM8L3U+IDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBleHRlbmQgYSBiYXNlIG1ldGhvZCB3b3JrIHByb2R1Y3QgdXNpbmcgZXh0ZW5kcyB2YXJpYWJpbGl0eS4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+IFN3aXRjaCB0byB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ3JlYXRlIGEgbmV3IDxzdHJvbmc+V29yayBQcm9kdWN0IDwvc3Ryb25nPiBpbiB0aGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+RXh0ZW5kcyBUZXN0PC9zcGFuPiBDb250ZW50IFBhY2thZ2UgY2FsbGVkIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2V4dGVuZHNfcnVwX25hdm1hcDwvc3Bhbj4gd2l0aCB0aGUgcHJlc2VudGF0aW9uIG5hbWUsIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkV4dGVuZHMgUlVQIE5hdm1hcDwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBJbiB0aGUgPHN0cm9uZz5WYXJpYWJpbGl0eSBUeXBlIDwvc3Ryb25nPiBzZWxlY3QgPHN0cm9uZz5leHRlbmRzIDwvc3Ryb25nPiBhbmQgY2hvb3NlIHRoZSBiYXNlIDxzdHJvbmc+V29yayBQcm9kdWN0IDwvc3Ryb25nPjxzcGFuIGNsYXNzPSJzdHlsZTEiPnJ1cF9uYXZtYXA8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIGEgPHN0cm9uZz5CcmllZiBEZXNjcmlwdGlvbiA8L3N0cm9uZz46IEV4dGVuZHMgTmF2bWFwIEJyaWVmIERlc2NyaXB0aW9uLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2F2ZSBhbmQgdGhlbiBzd2l0Y2ggdG8gdGhlIDxzdHJvbmc+QnJvd3NpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5JbiB0aGUgPHN0cm9uZz5Db25maWd1cmF0aW9uIFZpZXc8L3N0cm9uZz4sIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+RXh0ZW5kcyBSVVAgTmF2bWFwPC9zcGFuPiB3b3JrIHByb2R1Y3QgaW4gdGhlIDxzdHJvbmc+VW5jYXRlZ29yaXplZCBGb2xkZXIgPC9zdHJvbmc+IHVuZGVyIDxzdHJvbmc+RG9tYWlucyA8L3N0cm9uZz4uIFlvdSB3aWxsIHNlZSBpbiB0aGUgaHRtbCBwYWdlIHRoYXQgY29udGVudCBlbnRlcmVkIGluIHRoZSBleHRlbmRpbmcgYXJ0aWZhY3QgaGFzIGJlZW4gcmVwbGFjZWQsIHdoZXJlYXMgY29udGVudCBub3QgcHJvdmlkZWQgaGFzIGJlZW4gaW5oZXJpdGVkIGZyb20gdGhlIGJhc2UgYXJ0aWZhY3QuIE5vdGUgdGhhdCB0aGUgZXh0ZW5kZWQgYXJ0aWZhY3QgPHNwYW4gY2xhc3M9InN0eWxlMSI+TmF2aWdhdGlvbiBNYXA8L3NwYW4+IHJlbWFpbnMgdW5jaGFuZ2VkLjwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNi5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF82Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiNGM1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF82Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSA2OiBFeHRlbmRpbmcgYmFzZSBtZXRob2QgY29udGVudCBhc3NvY2lhdGVkIHdpdGggYSBUYXNrIHVzaW5nIDx1PkV4dGVuZHM8L3U+IDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBleHRlbmQgYSBiYXNlIG1ldGhvZCB0YXNrIHVzaW5nIGV4dGVuZHMgdmFyaWFiaWxpdHkuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPiBDcmVhdGUgYSBuZXcgPHN0cm9uZz50YXNrIDwvc3Ryb25nPiBpbiB0aGUgRXh0ZW5kcyBUZXN0IGNvbnRlbnQgcGFja2FnZSBjYWxsZWQgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfZXh0ZW5kc19kZXNpZ25fdXNlcl9pbnRlcmZhY2U8L3NwYW4+LCB3aXRoIHByZXNlbnRhdGlvbiBuYW1lLCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5FeHRlbmRzIERlc2lnbiBVc2VyIEludGVyZmFjZS4gPC9zcGFuPjwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBJbiB0aGUgPHN0cm9uZz5WYXJpYWJpbGl0eSBUeXBlLCA8L3N0cm9uZz4gc2VsZWN0IDxzdHJvbmc+ZXh0ZW5kcyA8L3N0cm9uZz4gYW5kIGNob29zZSB0aGUgYmFzZSB0YXNrIGRlc2lnbl91c2VyX2ludGVyZmFjZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCBhIDxzdHJvbmc+QnJpZWYgRGVzY3JpcHRpb24gPC9zdHJvbmc+OiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5FeHRlbmRzIFRhc2sgQnJpZWYgRGVzY3JpcHRpb248L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIDxzdHJvbmc+U3RlcHMgPC9zdHJvbmc+OiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5FeHRlbmQgU3RlcCAxLCBFeHRlbmQgU3RlcCAyIDwvc3Bhbj48L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIHRoZSA8c3Ryb25nPlJvbGUgPC9zdHJvbmc+IGNyZWF0ZWQgaW4gZXhlcmNpc2UgNDogPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfZXh0ZW5kc191aV9kZXNpZ25lcjwvc3Bhbj4sIGFzIFByaW1hcnkgUGVyZm9ybWVyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIHRoZSBXb3JrIFByb2R1Y3QgY3JlYXRlZCBpbiBleGVyY2lzZSA1OiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9leHRlbmRzX3J1cF9uYXZtYXA8L3NwYW4+LCBhcyBhbiBPdXRwdXQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgPHN0cm9uZz5HdWlkYW5jZSA8L3N0cm9uZz4oY2hvb3NlIGFueSBndWlkYW5jZSkgPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCB0aGUgPHN0cm9uZz50YXNrIDwvc3Ryb25nPiB0byB0aGUgYXBwcm9wcmlhdGUgU3RhbmRhcmQgQ2F0ZWdvcnk6IDxzcGFuIGNsYXNzPSJzdHlsZTEiPnJ1cF9hbmFseXNpc19kZXNpZ25fZGlzY2lwbGluZTwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTYXZlIGFuZCB0aGVuIHN3aXRjaCB0byB0aGUgPHN0cm9uZz5Ccm93c2luZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPkluIHRoZSA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gVmlldzwvc3Ryb25nPiwgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5FeHRlbmRzIERlc2lnbiBVc2VyIEludGVyZmFjZTwvc3Bhbj4gdGFzayB1bmRlciB0aGUgPHN0cm9uZz5EaXNjaXBsaW5lcyA8L3N0cm9uZz4gZm9sZGVyIGluIHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5BbmFseXNpcyAmYW1wOyBEZXNpZ248L3NwYW4+IGRpc2NpcGxpbmUuIFlvdSB3aWxsIHNlZSBpbiB0aGUgaHRtbCBwYWdlIHRoYXQgbWV0aG9kIGNvbnRlbnQgYW5kIHJlbGF0aW9uc2hpcHMgaGF2ZSBiZWVuIGluaGVyaXRlZCBmcm9tIHRoZSBiYXNlIHRhc2sgYW5kIGV4dGVuZGVkIGJ5IHRoZSBwbHVnLWluIGV4dGVuZGluZyBjb250ZW50IGFuZCByZWxhdGlvbnNoaXBzLiBOb3RlIHRoYXQgdGhlIGV4dGVuZGVkIHRhc2sgcmVtYWlucyB1bmNoYW5nZWQuPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF83Lmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTE1ZDQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDc6IEV4dGVuZGluZyBiYXNlIG1ldGhvZCBjb250ZW50IHVzaW5nIDx1PlJlcGxhY2U8L3U+IHZhcmlhYmlsaXR5IDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBleHRlbmQgYmFzZSBtZXRob2QgY29udGVudCB1c2luZyByZXBsYWNlIHZhcmlhYmlsaXR5LiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggdG8gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENyZWF0ZSBhIG5ldyA8c3Ryb25nPmNvbnRlbnQgcGFja2FnZSA8L3N0cm9uZz4gbmFtZWQsIDxzcGFuIGNsYXNzPSJzdHlsZTEiPlJlcGxhY2UgVGVzdDwvc3Bhbj4sIGluIHRoZSBNeSBQbHVnaW4gcGx1Zy1pbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENyZWF0ZSBhIG5ldyA8c3Ryb25nPnJvbGUgPC9zdHJvbmc+OiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9yZXBsYWNlX3VpX2Rlc2lnbmVyIHJvbGU8L3NwYW4+IHdpdGggcHJlc2VudGF0aW9uIG5hbWUsIDxzcGFuIGNsYXNzPSJzdHlsZTEiPk15IFJlcGxhY2UgVUkgRGVzaWduZXI8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gSW4gdGhlIDxzdHJvbmc+VmFyaWFiaWxpdHkgVHlwZSA8L3N0cm9uZz4gc2VsZWN0IDxzdHJvbmc+cmVwbGFjZXMgPC9zdHJvbmc+IGFuZCB0aGVuIGNob29zZSB0aGUgPHN0cm9uZz5iYXNlIHJvbGUgPC9zdHJvbmc+OiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5ydXBfdXNlcl9pbnRlcmZhY2VfZGVzaWduZXI8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIGEgPHN0cm9uZz5CcmllZiBEZXNjcmlwdGlvbiA8L3N0cm9uZz46IDxzcGFuIGNsYXNzPSJzdHlsZTEiPlJlcGxhY2UgQnJpZWYgRGVzY3JpcHRpb24uPC9zcGFuPiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIGEgPHN0cm9uZz5NYWluIERlc2NyaXB0aW9uIDwvc3Ryb25nPjogPHNwYW4gY2xhc3M9InN0eWxlMSI+UmVwbGFjZSBNYWluIERlc2NyaXB0aW9uPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNhdmUgdGhlIHJvbGUgYnkgY2xvc2luZyB0aGUgcm9sZSBlZGl0b3IuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBVcGRhdGUgdGhlIFZhcmlhYmlsaXR5IFRlc3QgQ29uZmlndXJhdGlvbjogPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+ICYjMTQ5OyZuYnNwO09wZW4gdGhlIFZhcmlhYmlsaXR5IENvbmZpZ3VyYXRpb24gYW5kIGV4cGFuZCA8c3Ryb25nPk15IFBsdWdpbiAmZ3Q7IE1ldGhvZCBDb250ZW50ICZndDsgQ29udGVudCBQYWNrYWdlczwvc3Ryb25nPi4gPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwO1VuY2hlY2sgPHN0cm9uZz5FeHRlbmRzIFRlc3Q8L3N0cm9uZz4uIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDtDaGVjayA8c3Ryb25nPlJlcGxhY2UgVGVzdDwvc3Ryb25nPi4gVGhpcyBpcyBkb25lIHNvIHRoZXJlIGFyZSBubyBjb25mbGljdGluZyBleHRlbnNpb25zIGluIHRoZSBzYW1lIG1ldGhvZCBlbGVtZW50LiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPgotICAgIDxwPiBTd2l0Y2ggdG8gdGhlIDxzdHJvbmc+QnJvd3NpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5JbiB0aGUgPHN0cm9uZz5Db25maWd1cmF0aW9uIFZpZXc8L3N0cm9uZz4sIHlvdSB3aWxsIHNlZSB0aGF0IHRoZXJlIGlzIG5vIGxvbmdlciBhIChSVVApIDxzcGFuIGNsYXNzPSJzdHlsZTEiPlVzZXItSW50ZXJmYWNlIERlc2lnbmVyPC9zcGFuPiByb2xlIGluIHRoZSA8c3Ryb25nPlJvbGUgU2V0cyA8L3N0cm9uZz4gZm9sZGVyLiBJdCB3YXMgcmVwbGFjZWQgYnkgPHNwYW4gY2xhc3M9InN0eWxlMSI+TXkgUmVwbGFjZSBVSSBEZXNpZ25lcjwvc3Bhbj4gcm9sZS4gTW9yZW92ZXIsIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgaW4gdGhlIGJhc2UgcGx1Zy1pbiB0aGF0IHJlZmVyZW5jZWQgdGhlIChSVVApIDxzcGFuIGNsYXNzPSJzdHlsZTEiPlVzZXItSW50ZXJmYWNlIERlc2lnbmVyPC9zcGFuPiByb2xlIG5vdyByZWZlcmVuY2UgdGhlIHJlcGxhY2luZyByb2xlIGluc3RlYWQgKGUuZy4sIGlmIHlvdSBvcGVuIHRoZSBkaXNjaXBsaW5lcyBmb2xkZXIgYW5kIHZpZXcgdGhlIHRhc2sgPHNwYW4gY2xhc3M9InN0eWxlMSI+RGVzaWduIFRoZSBVc2VyIEludGVyZmFjZTwvc3Bhbj4geW91IHdpbGwgc2VlIHRoYXQgdGhlIDxzdHJvbmc+UGVyZm9ybWluZyBSb2xlIDwvc3Ryb25nPiBpcyBub3cgPHNwYW4gY2xhc3M9InN0eWxlMSI+TXkgUmVwbGFjZSBVSSBEZXNpZ25lcjwvc3Bhbj4uKSA8c3Ryb25nPlJlcGxhY2UgPC9zdHJvbmc+IHdvcmtzIGluIGEgc2ltaWxhciB3YXkgZm9yIDxzdHJvbmc+dGFza3M8L3N0cm9uZz4sIDxzdHJvbmc+YXJ0aWZhY3RzIDwvc3Ryb25nPiwgPHN0cm9uZz5ndWlkYW5jZSA8L3N0cm9uZz4gYW5kIDxzdHJvbmc+Y2F0ZWdvcmllcyA8L3N0cm9uZz4gKGZlZWwgZnJlZSB0byB0cnkgaXQgb3V0KS4gPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19pbnRyby5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19pbnRyby5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYTc4Y2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfaW50cm8uaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPjwvYT48YT48L2E+PGE+PC9hPjxhPjwvYT48YT48L2E+PC9oMj4KLTxoMT48YT48L2E+PGE+VHV0b3JpYWw6IENyZWF0ZSBSZXVzYWJsZSBNZXRob2QgQ29udGVudCA8L2E+PC9oMT4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgdHV0b3JpYWwgaXMgdG8gdW5kZXJzdGFuZCB0aGUgdmFyaWV0eSBvZiB3YXlzIGluIHdoaWNoIHRoZSBjb250ZW50IGluIGEgYmFzZSBwbHVnLWluIGNhbiBiZSBleHRlbmRlZCBhbmQgbW9kaWZpZWQgYnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gPC9wPgotPHA+VGhlIJFDcmVhdGUgQ29yZSBNZXRob2QgQ29udGVudCcgdHV0b3JpYWwgc2hvd3MgaG93IHRvIGNyZWF0ZSBuZXcgY29udGVudCBpbiBhIHBsdWctaW4uIEluIHRoaXMgdHV0b3JpYWwgd2Ugd2lsbCBzZWUgaG93IHRvIGV4dGVuZCBleGlzdGluZyBjb250ZW50IGluIGEgcGx1Zy1pbi4gPC9wPgotPHA+PHN0cm9uZz5Ob3RlOiA8L3N0cm9uZz5JbiB0aGUgZm9sbG93aW5nIGV4ZXJjaXNlcyB3ZSBjcmVhdGUgc2VwYXJhdGUgQ29udGVudCBQYWNrYWdlcyB0byBkZW1vbnN0cmF0ZSBlYWNoIG9mIHRoZSB3YXlzIHRoYXQgYSBtZXRob2QgcGx1Zy1pbiBjYW4gbW9kaWZ5IGNvbnRlbnQgaW4gYW5vdGhlciBwbHVnLWluIChpLmUuIGV4dGVuZHMsIHJlcGxhY2VzLCBhbmQvb3IgY29udHJpYnV0ZXMpLiBUaGlzIGlzIGZvciBlYXN5IGlsbHVzdHJhdGlvbiBvZiB0aGUgZWZmZWN0IG9mIGFwcGx5aW5nIGVhY2ggdHlwZSBvZiBtZXRob2QgZWxlbWVudCB2YXJpYWJpbGl0eS4gPC9wPgotTWFuYWdpbmcgY29udGVudCB2aWEgdGhlIE1ldGhvZCBQbHVnLWluIG1lY2hhbmlzbSBpcyBhIGtleSBhbmQgdmVyeSBwb3dlcmZ1bCBmZWF0dXJlIG9mIEVQRiBDb21wb3Nlci4gVGhpcyB0dXRvcmlhbCBleHBsb3JlcyB0aGUgZWZmZWN0cyBvZiB0aGUgZGlmZmVyZW50IHZhcmlhYmlsaXR5IHR5cGVzIGluIHRoZSBmb2xsb3dpbmcgZXhlcmNpc2VzLgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfZXhfMS5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF8xLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ2MzMzYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF8xLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSAxOiBQdWJsaXNoaW5nIGEgcHJlLWRlZmluZWQgY29uZmlndXJhdGlvbiA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gcHVibGlzaCBhIDxzdHJvbmc+Q29uZmlndXJhdGlvbiA8L3N0cm9uZz50aGF0IGlzIGluY2x1ZGVkIGluIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIEluIHRoZSA8c3Ryb25nPkxpYnJhcnkgVmlldzwvc3Ryb25nPiwgb3BlbiB0aGUgQ29uZmlndXJhdGlvbnMgZm9sZGVyIGFuZCBzZWxlY3QgdGhlIGNvbmZpZ3VyYXRpb246IE15IFJVUCBmb3IgU21hbGwgUHJvamVjdHMuIFRoaXMgb3BlbnMgdGhlIENvbmZpZ3VyYXRpb24gRWRpdG9yLiAKLSAgICA8cD5UaGUgUGx1ZyBpbiBhbmQgUGFja2FnZSBTZWxlY3Rpb24gdGFiIHNob3dzIHRoZSBwbHVnLWlucyBhbmQgcGFja2FnZXMgd2l0aGluIGVhY2ggcGx1Zy1pbiB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgQ29uZmlndXJhdGlvbi4gVGhlIHBsdWctaW5zIGFuZCBwYWNrYWdlcyBpbiB0aGUgQ29uZmlndXJhdGlvbiBjYW4gYmUgYWRqdXN0ZWQgYnkgc2VsZWN0aW5nIGFuZCBkZXNlbGVjdGluZyB0aGVtIGluIHRoZSB0cmVlIGRpc3BsYXkuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBSZXZpZXcgPHN0cm9uZz5Db25maWd1cmF0aW9uIDwvc3Ryb25nPjxzdHJvbmc+Vmlld3MgPC9zdHJvbmc+OiAoaS5lLiBob3cgdGhlIHB1Ymxpc2hlZCBzaXRlIHdpbGwgYmUgbGFpZCBvdXQpLiAKLSAgICA8cD5TZWxlY3QgdGhlIDxzdHJvbmc+Vmlld3MgPC9zdHJvbmc+IHRhYiBpbiB0aGUgY29uZmlndXJhdGlvbiBlZGl0b3IuIEEgVmlldyBpcyBhIEN1c3RvbSBDYXRlZ29yeSB0aGF0IGlzIGRlc2lnbmVkIGZvciBwdWJsaWNhdGlvbi4gUmVxdWlyZWQgcGFja2FnZXMgYW5kIGNvbnRlbnQgZWxlbWVudHMgYXJlIGFzc2lnbmVkIHRvIGEgQ3VzdG9tIENhdGVnb3J5LiBUaGUgQ3VzdG9tIENhdGVnb3J5IGNhbiB0aGVuIGJlIGFkZGVkIGFzIGEgVmlldyB0byBhIENvbmZpZ3VyYXRpb24uIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBTZWxlY3QgPHN0cm9uZz5EZWZhdWx0PC9zdHJvbmc+IFZpZXcuCi0gICAgPHA+T25lIG9mIHRoZSB2aWV3cyBjYW4gYmUgc2VsZWN0ZWQgYXMgdGhlIERlZmF1bHQgVmlldyBieSBzZWxlY3RpbmcgdGhlIFZpZXcgYW5kIGNsaWNraW5nIHRoZSCRTWFrZSBEZWZhdWx0JyBidXR0b24uIFdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gaXMgcHVibGlzaGVkLCB0aGUgRGVmYXVsdCBWaWV3IHdpbGwgYmUgc2VsZWN0ZWQgd2hlbiB0aGUgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gaXMgb3BlbmVkIGluIHRoZSBFUEYgQ29tcG9zZXIgQnJvd3Nlci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENsb3NlIHRoZSBjb25maWd1cmF0aW9uIGVkaXRvci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNlbGVjdCA8c3Ryb25nPk15IFJVUCBmb3IgU21hbGwgUHJvamVjdHM8L3N0cm9uZz4gaW4gdGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0aW9uIGJveCBpbiB0aGUgRVBGIENvbXBvc2VyIHRvb2xiYXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgPHN0cm9uZz5Db25maWd1cmF0aW9uICZndDsgUHVibGlzaCA8L3N0cm9uZz4gZnJvbSB0aGUgbWFpbiBtZW51IGJhci4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIFN0ZXAgdGhyb3VnaCBQdWJsaXNoIHdpemFyZCwgYWNjZXB0aW5nIHRoZSBkZWZhdWx0cywgYW5kIHB1Ymxpc2ggdGhlIGNvbmZpZ3VyYXRpb24uIEl0IHdpbGwgdGFrZSBhIGZldyBtaW51dGVzIHRvIGdlbmVyYXRlIHRoZSB3ZWIgc2l0ZS4gQXNzdW1pbmcgdGhhdCB5b3UgaGF2ZSB0aGUgcmlnaHQgamF2YSBlbnZpcm9ubWVudCwgdGhlIEVQRiBDb21wb3NlciBCcm93c2VyIGFwcGxldCBzaG91bGQgbGF1bmNoIGFsbG93aW5nIHlvdSB0byB2aWV3IHRoZSByZXN1bHRpbmcgcHVibGlzaGVkIHdlYiBzaXRlIChhY2NlcHQgdGhlIHNlY3VyaXR5IHdhcm5pbmdzIHdoZW4gdGhlIGFwcGxldCBmaXJlcyB1cCkuIDwvbGk+Ci08L29sPgotPGJsb2NrcXVvdGU+Ci0gIDxwPjxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+IFRoZSBwdWJsaXNoZWQgd2ViIHNpdGUgaGFzIGEgcmljaGVyIG9yZ2FuaXphdGlvbiBhbmQgbGF5LW91dCBhcyBkZWZpbmVkIGJ5IHRoZSBDb25maWd1cmF0aW9uIFZpZXcsIGFzIGNvbXBhcmVkIHRvIHRoZSBtb3JlIHNpbXBsZSB2aWV3IG9mIHRoZSBjb25maWd1cmF0aW9uIGNvbnRlbnQgYXZhaWxhYmxlIHdpdGhpbiB0aGUgRVBGIENvbXBvc2VyIDxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3PC9zdHJvbmc+LiA8L3A+Ci08L2Jsb2NrcXVvdGU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF8yLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2M4ZTM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDI6IENyZWF0ZSBOZXcgQ3VzdG9tIENhdGVnb3J5IDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byB1bmRlcnN0YW5kIGFuZCB1c2UgPHN0cm9uZz5DdXN0b20gQ2F0ZWdvcmllcyA8L3N0cm9uZz4uIDwvcD4KLTxwPjxzdHJvbmc+Q3VzdG9tIENhdGVnb3JpZXMgPC9zdHJvbmc+IGFsbG93IHlvdSB0byBjYXRlZ29yaXplIGNvbnRlbnQgYWNjb3JkaW5nIHRvIGFueSBzY2hlbWUgeW91IHdhbnQuIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiB0aGVuIGJlIHVzZWQgdG8gY29tcG9zZSBwdWJsaXNoYWJsZSA8c3Ryb25nPlZpZXdzIDwvc3Ryb25nPiBwcm92aWRpbmcgYSBtZWFucyB0byBvcmdhbml6ZSBtZXRob2QgY29udGVudCBwcmlvciB0byBwdWJsaXNoaW5nLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5NYWtlIHN1cmUgeW91IGFyZSBpbiB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gTmF2aWdhdGUgdG8gPHN0cm9uZz5NeSBQbHVnLWluICZndDsgTWV0aG9kIENvbnRlbnQgJmd0OyBDdXN0b20gQ2F0ZWdvcmllczwvc3Ryb25nPi4gSWYgeW91IGhhdmUgbm90IGFscmVhZHkgY3JlYXRlZCB0aGlzIHBsdWdpbiwgY3JlYXRlIGl0IG5vdywgb3IgZ28gdGhyb3VnaCB0aGUgPHU+Q3JlYXRlIENvcmUgTWV0aG9kIENvbnRlbnQ8L3U+IHR1dG9yaWFsLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ3JlYXRlIGEgbmV3IGN1c3RvbSBjYXRlZ29yeSBuYW1lZCwgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfY3VzdG9tX2NhdGVnb3J5PC9zcGFuPi4gUmlnaHQtY2xpY2sgb24gdGhlIDxzdHJvbmc+Q3VzdG9tIENhdGVnb3JpZXM8L3N0cm9uZz4gZm9sZGVyLCBoaWdobGlnaHQgPHN0cm9uZz5OZXcsIDwvc3Ryb25nPiBhbmQgdGhlbiBjbGljayA8c3Ryb25nPkN1c3RvbSBDYXRlZ29yeSA8L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBPcGVuIHRoZSA8c3Ryb25nPkFzc2lnbiA8L3N0cm9uZz4gdGFiLiBJZiB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfY29udGVudF9wYWNrYWc8L3NwYW4+ZSwgYWRkIHRoZSA8c3Ryb25nPnJvbGVzIDwvc3Ryb25nPiwgPHN0cm9uZz5hcnRpZmFjdHM8L3N0cm9uZz4sIDxzdHJvbmc+dGFza3MsIDwvc3Ryb25nPiBhbmQgPHN0cm9uZz5ndWlkYW5jZSA8L3N0cm9uZz4gZnJvbSBpdCBpbnRvIHRoZSBjdXN0b20gY2F0ZWdvcnkuIElmIHlvdSBkbyBub3QgaGF2ZSB0aGlzIHBhY2thZ2UsIGFkZCBjb250ZW50IGZyb20gYW5vdGhlciBhcmVhIGluIHRoZSBsaWJyYXJ5LiA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD48c3Ryb25nPk5vdGU6IDwvc3Ryb25nPiBZb3UgY2FuIGRvIG11bHRpcGxlIHNlbGVjdCB1c2luZyBzaGlmdCBvciBjb250cm9sIGtleSAuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+Ci0gICAgPHA+IEFkZCB0aGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+cnVwX2FuYWx5c2lzX2Rlc2lnbl9kaXNjaXBsaW5lPC9zcGFuPi4gWW91IHdpbGwgZmluZCB0aGlzIHVuZGVyIDxzdHJvbmc+UlVQICZndDsgRGlzY2lwbGluZXMgJmd0OyBydXBfZGlzY2lwbGluZXMuIDwvc3Ryb25nPjwvcD4KLSAgPC9saT4KLSAgPGxpPiBPcGVuIG9uZSBvZiB0aGUgZWxlbWVudHMgeW91IGFzc2lnbmVkIHRvIHRoZSBuZXcgY3VzdG9tIGNhdGVnb3J5LiBPYnNlcnZlIGhvdyB0aGUgY3VzdG9tIGNhdGVnb3J5IGlzIG5vdyByZWZsZWN0ZWQgaW4gdGhlIDxzdHJvbmc+Q2F0ZWdvcmllcyA8L3N0cm9uZz4gdGFiLiA8L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzMuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfZXhfMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZDEzOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfZXhfMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgMzogQ3JlYXRlIGEgY3VzdG9taXplZCBjb25maWd1cmF0aW9uIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBjcmVhdGUgeW91ciBvd24gY3VzdG9taXplZCBjb25maWd1cmF0aW9uLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5NYWtlIHN1cmUgeW91IGFyZSBpbiB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DbGljayA8c3Ryb25nPkZpbGUgJmd0OyBOZXcgJmd0OyBDb25maWd1cmF0aW9uPC9zdHJvbmc+LiBPciwgeW91IGNhbiByaWdodC1jbGljayBvbiB0aGUgPHN0cm9uZz5Db25maWd1cmF0aW9uczwvc3Ryb25nPiBmb2xkZXIgaW4gdGhlIExpYnJhcnkgVmlldyBhbmQgc2VsZWN0IDxzdHJvbmc+TmV3IENvbmZpZ3VyYXRpb24uIDwvc3Ryb25nPlRoZSBDb25maWd1cmF0aW9uIEVkaXRvciBpcyBsYXVuY2hlZC48L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gTmFtZSB0aGUgY29uZmlndXJhdGlvbiwgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfY29uZmlndXJhdGlvbjwvc3Bhbj4uPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENsaWNrIG9uIHRoZSA8c3Ryb25nPlBsdWctaW4gYW5kIFBhY2thZ2UgU2VsZWN0aW9uIDwvc3Ryb25nPiB0YWIuIEluIHRoZSBsaXN0IG9mIFBsdWdpbnMsIGNoZWNrIE15IFBsdWdpbiB0aGF0IHlvdSBjcmVhdGVkIGluIHRoZSA8dT5DcmVhdGUgQ29yZSBNZXRob2QgQ29udGVudDwvdT4gdHV0b3JpYWwuIFRoaXMgcGx1Z2luIGhhcyBSVVAgYXMgYSBiYXNlIGFuZCByZWZlcmVuY2VzIHBhcnRzIG9mIHRoZSBSVVAgY29udGVudCwgYW5kIGFsc28gaGFzIGVsZW1lbnRzIHRoYXQgZXh0ZW5kLCBjb250cmlidXRlIHRvLCBhbmQgcmVwbGFjZSBiYXNlIFJVUCBjb250ZW50LiA8YnI+Ci0gICAgICBJZiB5b3UgZG8gbm90IGhhdmUgdGhpcyBwbHVnaW4sIGNvbnNpZGVyIGNvbXBsZXRpbmcgdGhlIDx1PkNyZWF0ZSBDb3JlIE1ldGhvZCBDb250ZW50PC91PiB0dXRvcmlhbCBiZWZvcmUgY29udGludWluZyB3aXRoIHRoaXMgdHV0b3JpYWwuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBUaGUgZGlzcGxheSB3aWxsIGdpdmUgeW91IGEgc2VyaWVzIG9mIHdhcm5pbmdzIGFuZCB0aGUgTGlicmFyeSBFcnJvciBMb2cgdmlldyB3aWxsIGJlIGRpc3BsYXllZC4gPGJyPgotICAgICAgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBnaXZlcyB0aGVzZSB3YXJuaW5ncyB0byBoZWxwIGVuc3VyZSB0aGF0IHlvdSBjcmVhdGUgYSBjb25maWd1cmF0aW9uIHRoYXQgkW1ha2VzIHNlbnNlJy4gSWYgeW91IHJlZmVyZW5jZSBhbiBlbGVtZW50LCB5b3Ugd2lsbCBvbmx5IGJlIGFibGUgdG8gc2VlIHRoZSBmdWxsIGRldGFpbHMgZm9yIHRoYXQgZWxlbWVudCBpbiBhIHB1Ymxpc2hlZCB3ZWIgc2l0ZSBpZiB0aGUgcGFja2FnZSBjb250YWluaW5nIHRoZSBlbGVtZW50IGlzIGluIHRoZSBjb25maWd1cmF0aW9uLiBJZiB0aGUgcGFja2FnZSBjb250YWluaW5nIHRoZSBlbGVtZW50IGlzIG5vdCBpbiB0aGUgY29uZmlndXJhdGlvbiwgdGhlIJFvZmZlbmRpbmcnIHBhY2thZ2UgaXMgbWFya2VkIGFzIGEgd2FybmluZyCWIHlvdSBtYXkgY2hvb3NlIG5vdCB0byBpbmNsdWRlIHRoZSBmdWxsIGRldGFpbHMgb2YgdGhlIHJlZmVyZW5jZWQgZWxlbWVudC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENoZWNrIHRoZSA8c3Ryb25nPkFkZCBNaXNzaW5nIFJlZmVyZW5jZXM8L3N0cm9uZz4gYnV0dG9uLiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBhbmQgcmVjdXJzaXZlbHkgYWRkIHBhY2thZ2VzIGNvbnRhaW5pbmcgYW55IGVsZW1lbnRzIHRoYXQgYXJlIHJlZmVyZW5jZWQgaW4gYWxyZWFkeSBzZWxlY3RlZCBwYWNrYWdlcy4gRXhwbG9yZSB3aGF0IHBhY2thZ2VzIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgY29uZmlndXJhdGlvbi4gWW91IHdpbGwgcHJvYmFibHkgbm93IHNlZSBhbGwgb2YgUlVQIHNlbGVjdGVkLiBUaGlzIGlzIGJlY2F1c2Ugb2YgdGhlIGludGVyLWNvbm5lY3RlZCBuYXR1cmUgb2YgUlVQLiBVbmNoZWNrIFJVUCB0byByZXN0b3JlIHRoZSB3YXJuaW5ncy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IERyaWxsIGRvd24gaW50byB0aGUgY29udGVudCBwYWNrYWdlcyBpbiB0aGUgTXkgUGx1Z2luLCBwbHVnaW4gcGFja2FnZSAgIGJ5IGNsaWNraW5nIG9uIHRoZSA8c3Ryb25nPis8L3N0cm9uZz4gc2lnbnMuIFVuY2hlY2sgdGhlPHN0cm9uZz4gRXh0ZW5kcyBUZXN0IDwvc3Ryb25nPmFuZCA8c3Ryb25nPlJlcGxhY2UgVGVzdCA8L3N0cm9uZz5jb250ZW50IHBhY2thZ2VzLiBVbmNoZWNraW5nIHRoZXNlIGF2b2lkcyBjb25mbGljdHMgdGhhdCBtYXkgb2NjdXIgYmVjYXVzZSB0aGUgc2FtZSBiYXNlIGVsZW1lbnQgaXMgYWZmZWN0ZWQgYnkgdGhlIHBsdWdpbnMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBUaGVyZSBzaG91bGQgYmUgYSA8c3Ryb25nPis8L3N0cm9uZz4gYnkgdGhlIDxzdHJvbmc+Q29udHJpYnV0aW9uIFRlc3Q8L3N0cm9uZz4gcGFja2FnZS4gQ2xpY2sgdGhlIDxzdHJvbmc+TWFrZSBDbG9zdXJlIGJ5IEZpeGluZyBFcnJvcnM8L3N0cm9uZz4gYnV0dG9uLiBUaGlzIGF1dG9tYXRpY2FsbHkgbWFrZXMgeW91ciBjb25maWd1cmF0aW9uIGNvbXBsZXRlIGJhc2VkIG9uIHdoYXQgaXMgY3VycmVudGx5IHNlbGVjdGVkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gRHJpbGwgZG93biBpbnRvIHRoZSBSVVAgcGx1Z2luLCBhbmQgc2VlIHdoYXQgcGFja2FnZXMgaGF2ZSBiZWVuIHNlbGVjdGVkLiBUaGVzZSB3aWxsIGJlIHRoZSBwYWNrYWdlcyB0aGF0IGNvbnRhaW4gdGhlIGVsZW1lbnRzIHVzZWQgYXMgYmFzZSBlbGVtZW50cyBpbiB0aGUgQ29uZmlndXJhdGlvbiBUZXN0IGNvbnRlbnQgcGFja2FnZS4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIENsaWNrIG9uIHRoZSA8c3Ryb25nPlZpZXdzPC9zdHJvbmc+IHRhYi4gCi0gICAgPHA+QW55IGN1c3RvbSBjYXRlZ29yeSBjYW4gYmUgYWRkZWQgYXMgYSB2aWV3IHRvIGEgY29uZmlndXJhdGlvbi4gWW91IGNhbiBjcmVhdGVkIGFueSBudW1iZXIgb2YgY3VzdG9tIGNhdGVnb3JpZXMgYW5kIHRoZXkgYXJlIHZlcnkgZmxleGlibGUgaW4gdGVybXMgb2YgdGhlIGNvbnRlbnQgdGhhdCB5b3UgY2FuIGFkZCB0byBhIGN1c3RvbSBjYXRlZ29yeSBhbmQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBjb250ZW50IGFwcGVhcnMuIDwvcD4KLSAgICA8cD5BZGQgdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2N1c3RvbV9jYXRlZ29yeTwvc3Bhbj4gY3VzdG9tIGNhdGVnb3J5IGFzIGEgdmlldyBpbiB0aGUgY29uZmlndXJhdGlvbi4gPC9wPgotICAgIDxwPkV4cGVyaW1lbnQgd2l0aCBhZGRpbmcgb3RoZXIgY3VzdG9tIGNhdGVnb3JpZXMgYXMgdmlld3MuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBNYWtlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2N1c3RvbV9jYXRlZ29yeTwvc3Bhbj4gdGhlIGRlZmF1bHQgdmlldyBieSBzZWxlY3RpbmcgdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2N1c3RvbV9jYXRlZ29yeTwvc3Bhbj4gdGFiIGFuZCBjbGlja2luZyB0aGUgPHN0cm9uZz5NYWtlIERlZmF1bHQ8L3N0cm9uZz4gYnV0dG9uLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2F2ZSB0aGUgY29uZmlndXJhdGlvbiBieSBjbG9zaW5nIHRoZSBDb25maWd1cmF0aW9uIEVkaXRvci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNlbGVjdCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9jb25maWd1cmF0aW9uPC9zcGFuPiBpbiB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3Rpb24gYm94IGF0IHRoZSB0b3Agb2YgdGhlIHNjcmVlbi4gWW91IHdpbGwgc2VlIHRoZSBpdGVtcyBkaXNwbGF5ZWQgaW4gdGhlIENvbmZpZ3VyYXRpb24gVmlldyBjaGFuZ2UuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiBTd2l0Y2ggdG8gdGhlIDxzdHJvbmc+QnJvd3Npbmc8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIEV4cGxvcmUgdGhlIGNvbnRlbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldy4gWW91IHNob3VsZCBzZWUgdGhlIGNvbnRlbnQgeW91IGNyZWF0ZWQgaW4geW91ciBwbHVnaW5zIGFuZCBzb21lIFJVUCBjb250ZW50LiA8L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzQuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfZXhfNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkOGJlMWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfZXhfNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgNDogUHVibGlzaGluZyBhIGN1c3RvbSBjb25maWd1cmF0aW9uIDwvYT48L2gyPgotPG9sPgotICA8bGk+Ci0gICAgPHA+IFNlbGVjdCA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gJmd0OyBQdWJsaXNoIDwvc3Ryb25nPiBmcm9tIHRoZSBtYWluIG1lbnUgYmFyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2VsZWN0IG15LWNvbmZpZ3VyYXRpb24gaW4gdGhlIGxpc3Qgb2YgY29uZmlndXJhdGlvbnMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiBTdGVwIHRocm91Z2ggUHVibGlzaCB3aXphcmQsIGFjY2VwdGluZyB0aGUgZGVmYXVsdHMsIGFuZCBwdWJsaXNoIHRoZSBjb25maWd1cmF0aW9uLiBJdCB3aWxsIHRha2UgYSBmZXcgbWludXRlcyB0byBnZW5lcmF0ZSB0aGUgd2ViIHNpdGUuIEFzc3VtaW5nIHRoYXQgeW91IGhhdmUgdGhlIHJpZ2h0IGphdmEgZW52aXJvbm1lbnQsIHRoZSBFUEYgQ29tcG9zZXIgQnJvd3NlciBhcHBsZXQgc2hvdWxkIGxhdW5jaCBhbGxvd2luZyB5b3UgdG8gdmlldyB0aGUgcmVzdWx0aW5nIHB1Ymxpc2hlZCB3ZWIgc2l0ZSAoYWNjZXB0IHRoZSBzZWN1cml0eSB3YXJuaW5ncyB3aGVuIHRoZSBhcHBsZXQgZmlyZXMgdXApLiA8L2xpPgotPC9vbD4KLTxibG9ja3F1b3RlPgotICA8cD48c3Ryb25nPk5vdGU6IDwvc3Ryb25nPiBUaGUgcHVibGlzaGVkIHdlYiBzaXRlIGhhcyBhIHJpY2hlciBvcmdhbml6YXRpb24gYW5kIGxheS1vdXQgYXMgZGVmaW5lZCBieSB0aGUgQ29uZmlndXJhdGlvbiBWaWV3LCBhcyBjb21wYXJlZCB0byB0aGUgbW9yZSBzaW1wbGUgdmlldyBvZiB0aGUgY29uZmlndXJhdGlvbiBjb250ZW50IGF2YWlsYWJsZSB3aXRoaW4gdGhlIEVQRiBDb21wb3NlciA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gVmlldyA8L3N0cm9uZz4uIDwvcD4KLTwvYmxvY2txdW90ZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2ludHJvLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2ludHJvLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIxZGI3ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9pbnRyby5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDE+PGE+VHV0b3JpYWw6IFB1Ymxpc2hpbmcgYW5kIEV4cG9ydGluZyA8L2E+PC9oMT4KLTxwPkVQRiBDb21wb3NlciBpcyBlc3NlbnRpYWxseSBhIGNvbnRlbnQgbWFuYWdlbWVudCBhcHBsaWNhdGlvbi4gVGhlIHVsdGltYXRlIG91dHB1dCBvZiBFUEYgQ29tcG9zZXIgaXMgYSBXZWIgc2l0ZSB3aXRoIHB1Ymxpc2hlZCBtZXRob2QgZ3VpZGFuY2UgYW5kIHByb2Nlc3NlcyB0aGF0IGNhbiBiZSB2aWV3ZWQgYnkgYSBwcm9qZWN0IHRlYW0uIDwvcD4KLTxwPkVQRiBDb21wb3NlciBtYWtlcyBpdCBlYXN5IHRvIGNvbmZpZ3VyZSBhIHByb2Nlc3MgZm9yIGEgcGFydGljdWxhciB0eXBlIG9yIHNpemUgb2YgcHJvamVjdCBhbmQgdG8gcHVibGlzaCB0aGUgZ3VpZGFuY2UgdG8gYSBXZWIgc2l0ZS4gQSBNZXRob2QgPHN0cm9uZz5Db25maWd1cmF0aW9uIDwvc3Ryb25nPiBpcyBhIHNlbGVjdGlvbiBvZiA8c3Ryb25nPkNvbnRlbnQgUGFja2FnZXMgPC9zdHJvbmc+IGFjcm9zcyBkaWZmZXJlbnQgPHN0cm9uZz5NZXRob2QgUGx1Zy1pbnMgPC9zdHJvbmc+IGNvbnRhaW5pbmcgdGhlIG1ldGhvZCBhbmQgcHJvY2VzcyBjb250ZW50IHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgcHVibGlzaGVkIHdlYiBzaXRlLiBBdCBwdWJsaXNoaW5nIHRpbWUsIHRoZSBjb25maWd1cmF0aW9uIGlzIGNvbWJpbmVkIHdpdGggZGlmZmVyZW50IE1ldGhvZCA8c3Ryb25nPlZpZXdzIDwvc3Ryb25nPiB3aGljaCBkZWZpbmUgdGhlIHdlYnNpdGUncyBuYXZpZ2F0aW9uIHN0cnVjdHVyZXMgYW5kIGNvbnRlbnQgb3JnYW5pemF0aW9uLiA8L3A+Ci08cD5UaGUgRVBGIENvbXBvc2VyIDxzdHJvbmc+QnJvd3NpbmcgUGVyc3BlY3RpdmUgPC9zdHJvbmc+IHJlbmRlcnMgdGhlIE1ldGhvZCA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gPC9zdHJvbmc+IGNvbnRlbnQgaW4gaHRtbCBmb3JtYXQgd2l0aGluIEVQRiBDb21wb3NlciwgcHJvdmlkaW5nIGEgbmF2aWdhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXRob2QvcHJvY2VzcyBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCB0aGF0IENvbmZpZ3VyYXRpb24uIDwvcD4KLTxwPlRoaXMgdHV0b3JpYWwgdXNlcyBjb250ZW50IHRoYXQgaXMgY3JlYXRlZCBpbiB0aGUgkUNyZWF0ZSBDb3JlIE1ldGhvZCBDb250ZW50JyBhbmQgkUV4dGVuZGluZyBiYXNlIG1ldGhvZCBjb250ZW50IHVzaW5nIFZhcmlhYmlsaXR5JyB0dXRvcmlhbHMuIDwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzEuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMmI4MWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgMTogQnJvd3NlIFByb2Nlc3MgQ29udGVudCB1c2luZyBCcm93c2luZyBQZXJzcGVjdGl2ZSA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gZ2V0IGEgYmFzaWMgdW5kZXJzdGFuZGluZyBvZiBwcm9jZXNzZXMgaW4gRVBGIENvbXBvc2VyLiA8L3A+Ci08cD4oTm90ZSB0aGF0IHRoaXMgaXMgYSByZXBlYXQgb2YgZXhlcmNpc2UgMiBpbiB0aGUgPHU+QnJvd3NlIHRoZSBMaWJyYXJ5PC91PiB0dXRvcmlhbC4pIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPk1ha2Ugc3VyZSB5b3UgYXJlIGluIHRoZSA8c3Ryb25nPkJyb3dzaW5nPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2VsZWN0IHRoZSA8c3Ryb25nPk15IFJVUCBmb3IgU21hbGwgUHJvamVjdHM8L3N0cm9uZz4gY29uZmlndXJhdGlvbi4gSWYgeW91IGhhdmUgbm90IGNyZWF0ZWQgdGhpcyBjb25maWd1cmF0aW9uLCBzZWxlY3QgdGhlIDxzdHJvbmc+UlVQIGZvciBTbWFsbCBQcm9qZWN0czwvc3Ryb25nPiBjb25maWd1cmF0aW9uLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gVG8gdmlldyBhIENhcGFiaWxpdHkgUGF0dGVybiwgY2xpY2sgPHN0cm9uZz5Qcm9jZXNzZXMgJmd0OyBDYXBhYmlsaXR5IFBhdHRlcm5zICZndDsgQ2xhc3NpYyBSVVAgJmd0OyBEaXNjaXBsaW5lIFdvcmtmbG93cyAmZ3Q7IEFuYWx5c2lzIGFuZCBEZXNpZ248L3N0cm9uZz4uIEEgcHJldmlldyBvZiB0aGUgcHVibGlzaGVkIFdlYiBwYWdlIGZvciB0aGUgc2VsZWN0ZWQgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGRpc3BsYXllZC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvbnRhaW5zIGEgbGFyZ2UgYW1vdW50IG9mIGluZm9ybWF0aW9uIGFuZCBpcyBkaXNwbGF5ZWQgb3ZlciBmb3VyIHRhYnMgliA8c3Ryb25nPkRlc2NyaXB0aW9uLCBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBVc2FnZSwgPC9zdHJvbmc+YW5kPHN0cm9uZz4gVGVhbSBBbGxvY2F0aW9uPC9zdHJvbmc+LiBFeHBsb3JlIHRoZSBpbmZvcm1hdGlvbiBvbiBlYWNoIHRhYi4gPC9wPgotICA8L2xpPgotICA8bGk+VG8gdmlldyBhIERlbGl2ZXJ5IFByb2Nlc3MsIGNsaWNrIDxzdHJvbmc+UHJvY2Vzc2VzICZndDsgRGVsaXZlcnkgUHJvY2Vzc2VzICZndDsgQ2xhc3NpYyBSVVAgTGlmZWN5Y2xlPC9zdHJvbmc+LiBUaGUgZGlzcGxheSBmb3IgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIHNpbWlsYXIgdG8gYSBDYXBhYmlsaXR5IFBhdHRlcm4uIDwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfMi5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF8yLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4ZWZhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF8yLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+RXhlcmNpc2UgMjogRXhwbG9yZSBhIFByb2Nlc3MgdXNpbmcgQXV0aG9yaW5nIHBlcnNwZWN0aXZlIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyB0dXRvcmlhbCBpcyB0byBleHBsb3JlIHRoZSBpbmZvcm1hdGlvbiBhbmQgZWRpdG9ycyBmb3IgcHJvY2Vzc2VzLiBBIENhcGFiaWxpdHkgUGF0dGVybiBpcyB1c2VkIGFzIGFuIGV4YW1wbGUgYnV0IHRoZSBzYW1lIGFwcGxpZXMgdG8gRGVsaXZlcnkgUHJvY2Vzc2VzLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggdG8gPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5JbiB0aGUgTGlicmFyeSBWaWV3LCBjbGljayA8c3Ryb25nPlJVUCAmZ3Q7IFByb2Nlc3NlcyAmZ3Q7IENhcGFiaWxpdHkgUGF0dGVybnMgJmd0OyBDbGFzc2ljIFJVUCAmZ3Q7IERpc2NpcGxpbmUgV29ya2Zsb3dzPC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5Eb3VibGUgY2xpY2sgdGhlIDxzdHJvbmc+QW5hbHlzaXMgYW5kIERlc2lnbiBDYXBhYmlsaXR5IFBhdHRlcm48L3N0cm9uZz4gYW5kIGV4YW1pbmUgdGhlIENhcGFiaWxpdHkgUGF0dGVybi4gPC9wPgotICA8L2xpPgotICA8bGk+VGhlIDxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz4gdGFiIHByb3ZpZGVzIGEgbnVtYmVyIG9mIHNlY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gZnVsbHkgZGVzY3JpYmUgdGhlIENhcGFiaWxpdHkgUGF0dGVybi4gCi0gICAgPHA+QSBDYXBhYmlsaXR5IFBhdHRlcm4gb3IgRGVsaXZlcnkgUHJvY2VzcyBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBhdCBsZWFzdCBvbmUgY29uZmlndXJhdGlvbiBidXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBtYW55LiBUaGUgY29uZmlndXJhdGlvbiBzZXRzIHRoZSBzY29wZSBmb3IgY29yZSBtZXRob2QgY29udGVudCBhbmQgb3RoZXIgcHJvY2VzcyBlbGVtZW50cyB0aGF0IGNhbiBiZSBpbmNsdWRlZCBpbiBhIHByb2Nlc3MuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBDbGljayB0aGUgPHN0cm9uZz5Xb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L3N0cm9uZz4gdGFiLiAKLSAgICA8cD5UaGlzIHNob3dzIHRoZSBBY3Rpdml0aWVzIGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gYW5kIHRoZSAoY29yZSBtZXRob2QgY29udGVudCkgdGFza3MgdGhhdCBhcmUgaW5jbHVkZWQgaW4gZWFjaCBBY3Rpdml0eS4gPC9wPgotICAgIDxwPldoZW4gYSB0YXNrIGlzIGFkZGVkIHRvIGEgcHJvY2VzcywgdGhlIHJvbGVzIGFuZCB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzayBhcmUgYWxzbyBwdWxsZWQgaW50byB0aGUgcHJvY2Vzcy4gPC9wPgotICAgIDxwPkVhY2ggdGFzaywgcm9sZSwgYW5kIHdvcmsgcHJvZHVjdCBzaG93biBpbiB0aGUgYWN0aXZpdHkgaXMgYWN0dWFsbHkgYW4gaW5zdGFuY2Ugb2YgdGhlIGVsZW1lbnQgYXMgaXQgaXMgdXNlZCBhdCB0aGUgcGFydGljdWxhciBwb2ludCBpbiB0aGUgcHJvY2Vzcy4gU28gd2hhdCB5b3Ugc2VlIGluIHRoZSBwcm9jZXNzIGFyZSBhY3R1YWxseSBUYXNrIERlc2NyaXB0b3JzLCBSb2xlIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBDbGljayB0aGUgPHN0cm9uZz5UZWFtIEFsbG9jYXRpb248L3N0cm9uZz4gdGFiLiAKLSAgICA8cD5UaGlzIHNob3dzIHRoZSBhY3Rpdml0aWVzIGluIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gYW5kIHRoZSByb2xlcyB0aGF0IGFyZSB0aGUgcGVyZm9ybWVycyBvZiB0aGUgdGFza3MgaW4gdGhlIGFjdGl2aXRpZXMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBDbGljayB0aGUgPHN0cm9uZz5Xb3JrIFByb2R1Y3QgVXNhZ2U8L3N0cm9uZz4gdGFiLiAKLSAgICA8cD5UaGlzIHNob3dzIHRoZSBhY3Rpdml0aWVzIGluIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gYW5kIHRoZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGlucHV0IGFuZCBvdXRwdXRzIG9mIHRoZSB0YXNrcyBpbiB0aGUgYWN0aXZpdGllcy4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIENsaWNrIG9uIHRoZSA8c3Ryb25nPkNvbnNvbGlkYXRlZCBWaWV3PC9zdHJvbmc+IHRhYi4gCi0gICAgPHA+VGhpcyBzaG93cyB0aGUgZnVsbCBzZXQgb2YgaW5mb3JtYXRpb24gZm9yIGVhY2ggYWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybi4gSXQgc2hvd3MgdGhlIHRhc2tzLCB3b3JrIHByb2R1Y3RzIGFuZCByb2xlcyB3aXRoaW4gZWFjaCBhY3Rpdml0eS4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIFJpZ2h0IGNsaWNrIGFueSA8c3Ryb25nPnRhc2sgPC9zdHJvbmc+IGluIHRoZSA8c3Ryb25nPldvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSB2aWV3LCA8L3N0cm9uZz4gYW5kIGNsaWNrIG9uIDxzdHJvbmc+U2hvdyBQcm9wZXJ0aWVzIFZpZXc8L3N0cm9uZz4uIAotICAgIDxwPlRoaXMgZGlzcGxheXMgYSBuZXcgdmlldyB0aGF0IHNob3dzIGFsbCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhc2sgKHRhc2sgZGVzY3JpcHRvcikgYXMgaXQgaXMgdXNlZCBpbiB0aGUgcHJvY2VzcyBhbmQgYWxsb3dzIHlvdSB0byBjdXN0b21pemUgdGhlIHRhc2sgYXMgaXQgaXMgdXNlZCBhdCB0aGlzIHBvaW50IGluIHRoZSBwcm9jZXNzLiA8L3A+Ci0gICAgPHA+VGhlIFByb3BlcnRpZXMgVmlldyBoYXMgYSBudW1iZXIgb2YgdGFicyB0aGF0IG9yZ2FuaXplIHRoZSB0YXNrIGRlc2NyaXB0b3IgaW5mb3JtYXRpb24uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIG9uIHRoZSA8c3Ryb25nPkRvY3VtZW50YXRpb248L3N0cm9uZz4gdGFiLiBUaGlzIGFsbG93cyB5b3UgdG8gZW50ZXIgaW5mb3JtYXRpb24gdGhhdCBpcyBzcGVjaWZpYyB0byB0aGlzIFRhc2sgRGVzY3JpcHRvci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgb24gdGhlIDxzdHJvbmc+Um9sZXM8L3N0cm9uZz4gdGFiLiBUaGlzIGFsbG93cyB5b3UgdG8gcmVwbGFjZSwgcmVtb3ZlIG9yIGFkZCB0byB0aGUgcm9sZXMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JlIG1ldGhvZCB0YXNrIGZvciB0aGlzIHNwZWNpZmljIGluc3RhbmNlIG9mIHRoZSB0YXNrIGluIHRoZSBwcm9jZXNzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DbGljayBvbiB0aGUgPHN0cm9uZz5Xb3JrIFByb2R1Y3RzPC9zdHJvbmc+IHRhYi4gVGhpcyBhbGxvd3MgeW91IHRvIHJlcGxhY2UsIHJlbW92ZSBvciBhZGQgdG8gdGhlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JlIG1ldGhvZCB0YXNrIGZvciB0aGlzIHNwZWNpZmljIGluc3RhbmNlIG9mIHRoZSB0YXNrIGluIHRoZSBwcm9jZXNzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DbGljayBvbiB0aGUgPHN0cm9uZz5TdGVwczwvc3Ryb25nPiB0YWIuIFRoaXMgYWxsb3dzIHlvdSB0byBhZGp1c3QgdGhlIHRhc2sgc3RlcHMgYXMgdGhleSBhcmUgYXBwbGllZCBhdCB0aGlzIHBvaW50IGluIHRoZSBwcm9jZXNzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5XaGVuIGEgcm9sZSBpcyBzZWxlY3RlZCBpbiB0aGUgVGVhbSBBbGxvY2F0aW9uIHZpZXcsIG9yIGEgd29yayBwcm9kdWN0IGlzIHNlbGVjdGVkIGluIHRoZSBXb3JrIFByb2R1Y3QgVXNhZ2UgdmlldywgdGhlIFByb3BlcnRpZXMgVmlldyBhbGxvd3MgeW91IHRvIGVkaXQgdGhlc2UgZWxlbWVudHMgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHByb2Nlc3MuIDwvcD4KLSAgPC9saT4KLSAgPGxpPkNsaWNrIG9uIGFuIDxzdHJvbmc+QWN0aXZpdHk8L3N0cm9uZz4gaW4gdGhlIHByb2Nlc3MuIDxicj4KLSAgICBUaGUgcHJvcGVydGllcyB2aWV3IGFsbG93cyB5b3UgdG8gc2VlIHJvbGwtdXBzIG9mIHRoZSB0YXNrcywgcm9sZXMsIGFuZCB3b3JrIHByb2R1Y3RzIGluIHRoZSBhY3Rpdml0eS4gUm9sbC11cHMgY2FuIGFsc28gYmUgZGlzcGxheWVkIGluIHRoZSBtYWluIGNvbnRlbnQgd2luZG93IGJ5IHNlbGVjdGluZyB0aGUgPHN0cm9uZz5Sb2xsLVVwPC9zdHJvbmc+IG9wdGlvbiBpbiB0aGUgY29udGV4dCBzZW5zaXRpdmUgbWVudS4gVGhlIFJvbGwtVXAgdmlldyBjYW4gYmUgdHVybmVkIG9mZiBieSBzZWxlY3RpbmcsIDxzdHJvbmc+Um9sbC1Eb3duPC9zdHJvbmc+LiA8L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzMuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MzVhZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPkV4ZXJjaXNlIDM6IENyZWF0ZSBhIERlbGl2ZXJ5IFByb2Nlc3MgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGxlYXJuIGhvdyB0byBjcmVhdGUgYSBkZWxpdmVyeSBwcm9jZXNzIHVzaW5nIGNvcmUgbWV0aG9kIGNvbnRlbnQgZGlyZWN0bHkuIDwvcD4KLTxwPkluIDxzdHJvbmc+UHJvY2VzcyBBdXRob3JpbmcgPC9zdHJvbmc+IHdlIGRvIG5vdCBkaXJlY3RseSBpbmNsdWRlIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgY29yZSBtZXRob2QgZWxlbWVudHMgaW4gdGhlIFdCUyBidXQgcmF0aGVyIGNyZWF0ZSBsb2NhbCByZWZlcmVuY2VzIHRlcm1lZCA8c3Ryb25nPmRlc2NyaXB0b3JzIDwvc3Ryb25nPiB0aGF0IHJlZmVyIGJhY2sgdG8gdGhlIGVsZW1lbnRzIGluIHRoZSBtZXRob2QgbGlicmFyeSBidXQgYWxzbyBjb250YWluIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhhdCBpcyBvbmx5IHJlbGV2YW50IHRvIHRoZSBsb2NhbCBwcm9jZXNzLiA8L3A+Ci08cD5EZXNjcmlwdG9ycyBhbHNvIHByb3ZpZGUgYSBtZWNoYW5pc20gd2hlcmVieSByZWxhdGlvbnNoaXBzIGRlZmluZWQgaW4gY29yZSBtZXRob2QgYXV0aG9yaW5nIChlLmcuIHJvbGVzIGFzc29jaWF0ZWQgd2l0aCBhIHRhc2ssIGlucHV0IGFuZCBvdXRwdXQsIHdvcmsgcHJvZHVjdHMsIGV0Yy4pLCBjYW4gYmUgZGVmaW5lZCBvciBjaGFuZ2VkIGxvY2FsbHkgd2l0aGluIHRoZSBwcm9jZXNzLiA8L3A+Ci08b2w+Ci0gIDxsaT4gICAgQ3JlYXRlIGEgbmV3IERlbGl2ZXJ5IFByb2Nlc3MgaW4gdGhlIE15IFBsdWdpbiwgcGx1Zy1pbiBjYWxsZWQsIE15IFJVUC4gPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+V2hlbiB5b3UgY3JlYXRlIGEgcHJvY2VzcyB5b3UgYXJlIGFza2VkIHRvIGlkZW50aWZ5IHRoZSBkZWZhdWx0IENvbmZpZ3VyYXRpb24gdG8gYmUgdXNlZCB3aXRoIHRoZSBwcm9jZXNzLiBTZWxlY3QgdGhlIE15IFJVUCBmb3IgU21hbGwgUHJvamVjdHMgY29uZmlndXJhdGlvbi4gSWYgeW91IG5hdmUgbm90IGNyZWF0ZWQgdGhpcyBjb25maWd1cmF0aW9uLCBzZWxlY3QgUlVQIGZvciBTbWFsbCBQcm9qZWN0cy4gPC9wPgotICAgIDxwPkEgcHJvY2VzcyBoYXMgYSBoaWVyYXJjaHkgb2YgYWN0aXZpdGllcyBhbmQgY2FuIGluY2x1ZGUgdGhlIHNwZWNpYWwgdHlwZXMgb2YgYWN0aXZpdHkgliBQaGFzZXMgYW5kIEl0ZXJhdGlvbnMuIFRoZXNlIHN0cnVjdHVyZXMgY2FuIGFsc28gYmUgY3JlYXRlZCBpbiBDYXBhYmlsaXR5IFBhdHRlcm5zLiBGaXJzdCBvZiBhbGwsIHdlJ2xsIGNyZWF0ZSBzb21lIGFjdGl2aXRpZXMgZGlyZWN0bHkgYW5kIHJldXNlIHNvbWUgY2FwYWJpbGl0eSBwYXR0ZXJucyBsYXRlci4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD4gVG8gY3JlYXRlIHRoZSBJbmNlcHRpb24gUGhhc2UsIGluIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUgdmlldywgcmlnaHQgY2xpY2sgdGhlIDxzdHJvbmc+TXkgUlVQIDwvc3Ryb25nPlByb2Nlc3MsIGFuZCB0aGVuIHNlbGVjdCwgPHN0cm9uZz5OZXcgQ2hpbGQgJmd0OyBQaGFzZSA8L3N0cm9uZz4uIENhbGwgdGhlIFBoYXNlLCA8c3Ryb25nPkluY2VwdGlvbjwvc3Ryb25nPi4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIAotICAgIDxwPlRvIGNyZWF0ZSB0aGUgUmVxdWlyZW1lbnRzIERpc2NpcGxpbmUgaW4gSW5jZXB0aW9uLCBpbiB0aGUgPHN0cm9uZz5Xb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUgPC9zdHJvbmc+IHZpZXcsIHJpZ2h0IGNsaWNrIDxzdHJvbmc+SW5jZXB0aW9uLCA8L3N0cm9uZz4gYW5kIHNlbGVjdCA8c3Ryb25nPk5ldyA8L3N0cm9uZz48c3Ryb25nPkNoaWxkICZndDsgQWN0aXZpdHkgPC9zdHJvbmc+LiBDYWxsIHRoaXMgPHN0cm9uZz5SZXF1aXJlbWVudHM8L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPlRvIGFkZCBUYXNrcyB0byB0aGUgUmVxdWlyZW1lbnRzIGFjdGl2aXR5LCBpbiB0aGUgPHN0cm9uZz5Db25maWd1cmF0aW9uIDwvc3Ryb25nPiB2aWV3LCBvcGVuIHRoZSBSZXF1aXJlbWVudHMgRGlzY2lwbGluZSBhbmQgdGhlbiBkcmFnIGFuZCBkcm9wIHRoZSBmb2xsb3dpbmcgdGFza3Mgb250byB0aGUgUmVxdWlyZW1lbnRzIEFjdGl2aXR5IHlvdSBoYXZlIGp1c3QgY3JlYXRlZDogIDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBEZXZlbG9wIFZpc2lvbiA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IERldGFpbCB0aGUgU29mdHdhcmUgUmVxdWlyZW1lbnRzIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgRmluZCBBY3RvcnMgYW5kIHVzZSBDYXNlcyA8L3A+Ci0gICAgPHA+V2hlbiB5b3UgaW5jbHVkZSB0aGVzZSB0YXNrcyBpbiB5b3VyIHByb2Nlc3MsIHRoZSBhc3NvY2lhdGVkIHJvbGVzIGFuZCB3b3JrIHByb2R1Y3RzIGFyZSBhbHNvIGluY2x1ZGVkIGluIHRoZSBwcm9jZXNzLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPgotICAgIDxwPiBZb3UgY2FuIHJldmlldyB0aGUgaW5mb3JtYXRpb24gZm9yIGVhY2ggbWV0aG9kIGVsZW1lbnQgaW4gdGhlIDxzdHJvbmc+UHJvcGVydGllcyA8L3N0cm9uZz4gdmlldy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEN1c3RvbWl6ZSB0aGUgc3RlcHMgZnJvbSB0aGUgRmluZCBBY3RvcnMgYW5kIFVzZSBDYXNlcyB0YXNrIGZvciB0aGUgSW5jZXB0aW9uIHBoYXNlLiBDbGljayBvbiB0aGUgPHN0cm9uZz5GaW5kIEFjdG9ycyBhbmQgVXNlIENhc2VzPC9zdHJvbmc+IHRhc2sgZGVzY3JpcHRvciwgYW5kIG9wZW4gdGhlIDxzdHJvbmc+UHJvcGVydGllczwvc3Ryb25nPiB2aWV3LiBDbGljayBvbiB0aGUgPHN0cm9uZz5TdGVwczwvc3Ryb25nPiB0YWIuIFJlbW92ZSB0aGUgbGFzdCBmb3VyIHN0ZXBzIGFuZCBjbG9zZSB0aGUgcHJvcGVydGllcyB2aWV3LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU3dpdGNoIHRvIHRoZSA8c3Ryb25nPkJyb3dzaW5nPC9zdHJvbmc+IHBlcnNwZWN0aXZlIGFuZCBzZWxlY3QgPHN0cm9uZz5Qcm9jZXNzZXMgJmd0OyBEZWxpdmVyeSBQcm9jZXNzZXMgJmd0OyBNeSBSVVA8L3N0cm9uZz4uIFRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUgdGFiIGlzIGRpc3BsYXllZC4gQ2xpY2sgb24gPHN0cm9uZz5GaW5kIEFjdG9ycyBhbmQgVXNlIENhc2VzPC9zdHJvbmc+LiBPbmx5IHRoZSBmaXJzdCB0aHJlZSBzdGVwcyBmcm9tIHRoZSBjb3JlIG1ldGhvZCB0YXNrIGFyZSBpbmNsdWRlZC4gPC9wPgotICA8L2xpPgotICA8bGk+TWFrZSBvdGhlciBjaGFuZ2VzIHRvIHRoZSB0YXNrcyBpbiB0aGUgZGVsaXZlcnkgcHJvY2VzcyB5b3UgaGF2ZSBqdXN0IGNyZWF0ZWQgYW5kIHNlZSBob3cgdGhleSBhcmUgcmVmbGVjdGVkIHdoZW4geW91IHZpZXcgdGhlIHByb2Nlc3MgaW4gdGhlIEJyb3dzaW5nIHBlcnNwZWN0aXZlLjwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfNC5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF80Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI2MGQyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF80Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSA0OiBDcmVhdGUgYSBuZXcgZGVsaXZlcnkgUHJvY2VzcyB1c2luZyBjYXBhYmlsaXR5IHBhdHRlcm5zLiA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gbGVhcm4gaG93IHRvIGNyZWF0ZSBhIGRlbGl2ZXJ5IHByb2Nlc3MgdXNpbmcgPHN0cm9uZz5DYXBhYmlsaXR5IFBhdHRlcm5zIDwvc3Ryb25nPi4gPC9wPgotPHA+QSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBwcm9jZXNzIJFmcmFnbWVudCcuIEl0IHJlcHJlc2VudHMgYSBwcm9jZXNzIHRoYXQgY2FuIGJlIHJldXNlZCBtYW55IHRpbWVzIGluIHRoZSBzYW1lIHByb2Nlc3MgYW5kIC8gb3IgaW4gZGlmZmVyZW50IHByb2Nlc3Nlcy4gT3JnYW5pemluZyBjb3JlIG1ldGhvZCBjb250ZW50IGludG8gY2FwYWJpbGl0eSBwYXR0ZXJucyBhbmQgdGhlbiB1c2luZyB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJucyB0byBjb25zdHJ1Y3QgZnVsbCBsaWZlLWN5Y2xlIGRlbGl2ZXJ5IHByb2Nlc3NlcyBpcyBhIGtleSBmZWF0dXJlIG9mIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIuIDwvcD4KLTxwPkEgY2FwYWJpbGl0eSBwYXR0ZXJuIGNhbiBiZSBpbmNsdWRlZCBpbiBhbm90aGVyIHByb2Nlc3MgKGFub3RoZXIgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGEgZGVsaXZlcnkgcHJvY2VzcykgaW4gdHdvIHdheXM6IDwvcD4KLTxibG9ja3F1b3RlPgotICA8cD4mIzE0OTsmbmJzcDsgQ29weSCWIHRoaXMgY3JlYXRlcyBhIGZ1bGwgY29weSBvZiB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGluIHRoZSB0YXJnZXQgcHJvY2VzcyBidXQgZG9lcyBub3QgcmV0YWluIGFueSBsaW5rcyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjYXBhYmlsaXR5IHBhdHRlcm4uIFRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gY2FuIGJlIGN1c3RvbWl6ZWQgaW4gdGhlIG5ldyBwcm9jZXNzLiBBbnkgY2hhbmdlcyB0aGF0IGFyZSBzdWJzZXF1ZW50bHkgbWFkZSB0byB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGFyZSBub3QgcmVmbGVjdGVkIGluIHRoZSBwcm9jZXNzIGludG8gd2hpY2ggaXQgd2FzIGNvcGllZC4gPC9wPgotICA8cD4mIzE0OTsmbmJzcDsgRXh0ZW5kcyCWIHRoaXMgZXh0ZW5kcyB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGludG8gdGhlIHByb2Nlc3MuIFRoZSBwcm9jZXNzIHJldGFpbnMgbGlua3MgdG8gdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBhbmQgYW55IHN1YnNlcXVlbnQgY2hhbmdlcyB0byB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGFyZSByZWZsZWN0ZWQgaW4gdGhlIHByb2Nlc3MgaW50byB3aGljaCBpdCBpcyBleHRlbmRlZC4gVGhlIGNhcGFiaWxpdHkgcGF0dGVybiBjYW4gYmUgY3VzdG9taXplZCBieSBzdXBwcmVzc2luZyB0YXNrcywgcm9sZXMsIGFuZCB3b3JrIHByb2R1Y3RzLiBPdGhlciBjaGFuZ2VzIGNhbm5vdCBiZSBtYWRlLiA8L3A+Ci08L2Jsb2NrcXVvdGU+Ci08cD5XZSB3aWxsIGFkZCBzb21lIENhcGFiaWxpdHkgUGF0dGVybnMgdG8gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgeW91IGNyZWF0ZWQgaW4gRXhlcmNpc2UgMy4gPC9wPgotPHA+VG8gYWRkIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHVzaW5nIENvcHk6IDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPiBTd2l0Y2ggdG8gdGhlIGF1dGhvcmluZyBwZXJzcGVjdGl2ZSBhbmQgb3BlbiB0aGUgTXkgUlVQIGRlbGl2ZXJ5IHByb2Nlc3MgeW91IGNyZWF0ZWQgaW4gRXhlcmNpc2UgMy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEluIHRoZSBDb25maWd1cmF0aW9ucyBWaWV3IGNsaWNrIDxzdHJvbmc+UHJvY2Vzc2VzICZndDsgQ2FwYWJpbGl0eSBQYXR0ZXJucyAmZ3Q7IENsYXNzaWMgUlVQICZndDsgRGlzY2lwbGluZSBXb3JrZmxvd3MgJmd0OyBQcm9qZWN0IE1hbmFnZW1lbnQuIDwvc3Ryb25nPjwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBEcmFnIGFuZCBkcm9wIHRoZSA8c3Ryb25nPlByb2plY3QgTWFuYWdlbWVudCA8L3N0cm9uZz4gQ2FwYWJpbGl0eSBQYXR0ZXJuIG9udG8gdGhlIEluY2VwdGlvbiBwaGFzZSBpbiBNeSBSVVAgZGVsaXZlcnkgcHJvY2Vzcy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNlbGVjdCA8c3Ryb25nPkNvcHkgPC9zdHJvbmc+IGluIHRoZSBwb3AtdXAgYm94LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICBFeHBhbmQgb25lIG9mIHRoZSBhY3Rpdml0aWVzIGluIHRoZSBQcm9qZWN0IE1hbmFnZW1lbnQgY2FwYWJpbGl0eSBwYXR0ZXJuIHRvIHRoZSBUYXNrIGxldmVsLiBOb3RlIHRoYXQgdGhlIHRhc2sgbmFtZSBpcyBkaXNwbGF5ZWQgaW4gYmxhY2suIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHRhc2sgaXMgYXZhaWxhYmxlIGZvciB5b3UgdG8gZWRpdC4gQW55IGNoYW5nZXMgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiB3aWxsIG5vdCBiZSByZWZsZWN0ZWQgaW4geW91ciBwcm9jZXNzLiBZb3UgY2FuIGVkaXQgdGhlIHRhc2sgaW4gdGhlIFByb3BlcnRpZXMgdmlldy4gPC9saT4KLTwvb2w+Ci08cD5UbyBhZGQgYSBDYXBhYmlsaXR5IFBhdHRlcm4gdXNpbmcgRXh0ZW5kczogIDwvcD4KLTxvbCBzdGFydD0iNiI+Ci0gIDxsaT4KLSAgICA8cD4gQ3JlYXRlIGEgbmV3IFBoYXNlIGluIHRoZSBNeSBSVVAgZGVsaXZlcnkgcHJvY2Vzcy4gUmlnaHQtY2xpY2sgb24gdGhlIGZpcnN0IHJvdyBhbmQgc2VsZWN0IDxzdHJvbmc+TmV3IENoaWxkICZndDsgUGhhc2UgPC9zdHJvbmc+LiBDYWxsIHRoZSBwaGFzZSwgRWxhYm9yYXRpb24uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDcmVhdGUgYSBuZXcgSXRlcmF0aW9uIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZS4gUmlnaHQtY2xpY2sgb24gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIGFuZCBzZWxlY3QgPHN0cm9uZz5OZXcgQ2hpbGQgJmd0OyBJdGVyYXRpb24gPC9zdHJvbmc+LiBDYWxsIHRoZSBpdGVyYXRpb24sIEVsYWJvcmF0aW9uIEl0ZXJhdGlvbiAxLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gSW4gdGhlIENvbmZpZ3VyYXRpb25zIFZpZXcsIGNsaWNrIDxzdHJvbmc+UHJvY2Vzc2VzICZndDsgQ2FwYWJpbGl0eSBQYXR0ZXJucyAmZ3Q7IENsYXNzaWMgUlVQICZndDsgRGlzY2lwbGluZSBXb3JrZmxvd3MgJmd0OyBQcm9qZWN0IE1hbmFnZW1lbnQuIDwvc3Ryb25nPjwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBEcmFnIGFuZCBkcm9wIHRoZSA8c3Ryb25nPlByb2plY3QgTWFuYWdlbWVudCA8L3N0cm9uZz4gQ2FwYWJpbGl0eSBQYXR0ZXJuIG9udG8gdGhlIEVsYWJvcmF0aW9uIEl0ZXJhdGlvbiAxIGl0ZXJhdGlvbiBpbiBNeSBSVVAgUHJvY2Vzcy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNlbGVjdCA8c3Ryb25nPkV4dGVuZCA8L3N0cm9uZz4gaW4gdGhlIHBvcC11cCBib3guIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBFeHBhbmQgb25lIG9mIHRoZSBhY3Rpdml0aWVzIGluIHRoZSBQcm9qZWN0IE1hbmFnZW1lbnQgY2FwYWJpbGl0eSBwYXR0ZXJuIHlvdSBoYXZlIGp1c3QgYWRkZWQgdG8gdGhlIFRhc2sgbGV2ZWwuIE5vdGUgdGhhdCB0aGUgdGFzayBuYW1lIGlzIGRpc3BsYXllZCBpbiBncmVlbiBpdGFsaWNzLiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSB0YXNrIGlzIGluIGEgcGFydCBvZiBhIHByb2Nlc3MgZGVmaW5lZCBlbHNld2hlcmUgliBhIENhcGFiaWxpdHkgUGF0dGVybi4gQW55IGNoYW5nZXMgdG8gdGhlIENhcGFiaWxpdHkgUGF0dGVybiB3aWxsIGJlIHJlZmxlY3RlZCBpbiB5b3VyIHByb2Nlc3MuIEFsc28sIHRoZSBQcm9wZXJ0aWVzIHZpZXcgc2hvd3MgdGhlIHRhc2sgZGV0YWlscywgYnV0IHRoZXkgY2Fubm90IGJlIGVkaXRlZC4gPC9wPgotICA8L2xpPgotICA8bGk+UmlnaHQgY2xpY2sgb24gYSB0YXNrIGluIHRoZSBleHRlbmRlZCBjYXBhYmlsaXR5IHBhdHRlcm4gYW5kIHNlbGVjdCA8c3Ryb25nPlN1cHByZXNzIDwvc3Ryb25nPi4gVGhlIHRhc2sgaXMgZ3JheWVkIG91dC4gVGhlIHRhc2sgd2lsbCBub3QgYXBwZWFyIGluIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZiB0aGUgZGVsaXZlcnkgcHJvY2Vzcywgbm9yIHdpbGwgaXQgYmUgaW5jbHVkZWQgaW4gYW4gZXhwb3J0IG9mIHRoZSBwcm9jZXNzLjwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfNS5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF81Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiZjgyZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF81Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+RXhlcmNpc2UgNTogQ3JlYXRlIFByb2Nlc3MgRGlhZ3JhbXMgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGV4cGxvcmUgdGhlIGRpYWdyYW0gZmVhdHVyZXMgb2YgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3Nlci4gPC9wPgotPHA+RVBGIENvbXBvc2VyIHN1cHBvcnRzIHRocmVlIHR5cGVzIG9mIHByb2Nlc3MgZGlhZ3JhbS4gVGhlc2UgYXJlOiA8L3A+Ci08YmxvY2txdW90ZT4KLSAgICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+QWN0aXZpdHkgRGlhZ3JhbTwvc3Ryb25nPiA8L3A+Ci0gICAgICAgIDxibG9ja3F1b3RlPgotICAgICAgICAgIDxwPiAgICAgICAgICAgIFRoaXMgc2hvd3MgdGhlIChzdWIpIGFjdGl2aXRpZXMgaW4gYSBoaWdoZXIgbGV2ZWwgYWN0aXZpdHkuIEl0IHNob3dzIHRoZSBzZXF1ZW5jZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gdGhlIGFjdGl2aXRpZXMuIDwvcD4KLSAgICAgICAgPC9ibG9ja3F1b3RlPgotICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5BY3Rpdml0eSBEZXRhaWw8L3N0cm9uZz4gliBzaW1pbGFyIHRvIFJVUCBXb3JrZmxvdyBEZXRhaWwgPC9wPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4gICAgICBUaGlzIHNob3dzIHRoZSB0YXNrcyBpbiBhbiBhY3Rpdml0eSB3aXRoIHRoZWlyIHBlcmZvcm1pbmcgcm9sZXMgYW5kIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW08L3N0cm9uZz4gPC9wPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD5UaGlzIGRpYWdyYW0gY2FuIGJlIHVzZWQgdG8gc2hvdyBob3cgYSB3b3JrIHByb2R1Y3QgaXMgZGVwZW5kZW50IG9uIG90aGVyIHdvcmsgcHJvZHVjdHMuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotPC9ibG9ja3F1b3RlPgotPHA+VGhlc2UgZGlhZ3JhbXMgY2FuIHRoZW4gYmUgaW5jbHVkZWQgaW4gdGhlIHB1Ymxpc2hlZCB3ZWIgc2l0ZS4gVGhlIGRpYWdyYW1zIGFyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCAodG8gYSBkZWdyZWUpIGFuZCBpbmhlcmVudGx5IHN5bmNocm9uaXplZCB3aXRoIHRoZSBXQlMuIENoYW5nZXMgdG8gdGhlIHByb2Nlc3Mgc3RydWN0dXJlIHVzaW5nIHRoZSBkaWFncmFtIGVkaXRvciBhcmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gdGhlIFdCUywgYW5kIHZpY2UgdmVyc2EuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCB0byA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlNlbGVjdCB0aGUgTXkgUlVQIGRlbGl2ZXJ5IHByb2Nlc3MgdGhhdCB5b3UgaGF2ZSBiZWVuIHdvcmtpbmcgb24uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkhpZ2hsaWdodCB0aGUgZGVsaXZlcnkgcHJvY2VzcyBpbiB0aGUgV0JTIGFuZCB0aGVuIHJpZ2h0LWNsaWNrLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DbGljayA8c3Ryb25nPkRpYWdyYW1zICZndDsgT3BlbiBBY3Rpdml0eSBEaWFncmFtPC9zdHJvbmc+LiBUaGUgZGlhZ3JhbSBlZGl0b3Igc2hvdWxkIG9wZW4sIHNob3dpbmcgdGhlIHRvcCBsZXZlbCBhY3Rpdml0aWVzIC0gcGhhc2VzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5FeHBhbmQgdGhlIDxzdHJvbmc+UGFsZXR0ZSA8L3N0cm9uZz4gb24gdGhlIHJpZ2h0IG9mIHRoZSBkaWFncmFtIHZpZXcuIEFsbCB0aGUgZWxlbWVudHMgcmVxdWlyZWQgdG8gY3JlYXRlIGFuIDxzdHJvbmc+QWN0aXZpdHkgRGlhZ3JhbSA8L3N0cm9uZz4gYXJlIGF2YWlsYWJsZSBvbiB0aGUgcGFsZXR0ZS4gQWRkIGEgbmV3IHBoYXNlIHRvIHRoZSBkaWFncmFtIJYgY2FsbCBpdCwgQ29uc3RydWN0aW9uLiBDcmVhdGUgbGlua3MgYmV0d2VlbiB0aGUgcGhhc2VzIHRvIHNob3cgdGhlIHNlcXVlbmNlIG9mIHRoZSBwaGFzZXMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCBiYWNrIHRvIHRoZSA8c3Ryb25nPldvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSA8L3N0cm9uZz52aWV3IGFuZCBub3RpY2UgdGhlIG5ldyBwaGFzZS4gQWxzbyBub3RpY2UgdGhhdCB0aGUgbGlua3MgeW91IGFkZGVkIG9uIHRoZSBkaWFncmFtIGFyZSByZWZsZWN0ZWQgaW4gdGhlIFByZWRlY2Vzc29ycyBjb2x1bW4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkRvdWJsZSBjbGljayB0aGUgPHN0cm9uZz5JbmNlcHRpb24gUGhhc2U8L3N0cm9uZz4gaW4gdGhlIGRpYWdyYW0gliBpdCB3aWxsIGRyaWxsIGRvd24gdG8gc2hvdyB0aGUgY29udGFpbmVkIEFjdGl2aXRpZXMgKHRoZSBydWxlIGlzIHRoYXQgdGhlIGVkaXRvciB3aWxsIGRpc3BsYXkgdGhlIHByb2Nlc3MgZWxlbWVudHMgYXQgdGhlIGxldmVsIGJlbG93IHRoZSBjdXJyZW50IHNlbGVjdGVkIGVsZW1lbnQpLiBTdWNjZXNzaXZlIGRyaWxsIGRvd24gdGhyb3VnaCB0aGUgbGV2ZWxzIGlzIHBvc3NpYmxlIGJ5IGNsaWNraW5nIG9uIHRoZSBkaWFncmFtIGVsZW1lbnRzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DbG9zZSB0aGUgZGlhZ3JhbXMgeW91IGhhdmUgb3BlbmVkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5JbiB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCByaWdodC1jbGljayBvbiB0aGUgUmVxdWlyZW1lbnRzIGFjdGl2aXR5IGFuZCBzZWxlY3QsIDxzdHJvbmc+RGlhZ3JhbXMgJmd0OyBPcGVuIEFjdGl2aXR5IERldGFpbCBEaWFncmFtLiA8L3N0cm9uZz5UaGUgQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuIEl0IHNob3dzOiAgPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IFRoZSBSb2xlcyB0aGF0IHBlcmZvcm0gdGFza3MgaW4gdGhlIGFjdGl2aXR5IDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgVGhlIFRhc2tzIHRoYXQgdGhlIHJvbGVzIHBlcmZvcm0gPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBUaGUgaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzIGZvciBlYWNoIHRhc2sgPC9wPgotICAgIDxwPllvdSBjYW4gY2hhbmdlIHRoZSBsYXlvdXQgb2YgdGhlIGRpYWdyYW0gYnV0IHlvdSBjYW5ub3QgYWRkIG9yIHJlbW92ZSBhbnkgZWxlbWVudHMgZnJvbSB0aGUgZGlhZ3JhbS4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD5DbG9zZSB0aGUgZGlhZ3JhbXMgeW91IGhhdmUgb3BlbmVkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgSW4gdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgcmlnaHQtY2xpY2sgb24gdGhlIFJlcXVpcmVtZW50cyBhY3Rpdml0eSBhbmQgc2VsZWN0LCA8c3Ryb25nPkRpYWdyYW1zICZndDsgT3BlbiBXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtLiA8L3N0cm9uZz5UaGUgd29yayBwcm9kdWN0cyB1c2VkIGluIHRoZSBhY3Rpdml0eSBhcmUgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgZGlhZ3JhbS4gIDwvbGk+Ci08L29sPgotPGJsb2NrcXVvdGU+Ci0gIDxwPkFkZCBhIChkZXBlbmRlbmN5KSBsaW5rIGJldHdlZW4gdHdvIHdvcmsgcHJvZHVjdHMuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHdvcmsgcHJvZHVjdCBhdCB0aGUgYXJyb3cgZW5kIG9mIHRoZSBsaW5rIGlzIGRlcGVuZGVudCBvbiB0aGUgb3RoZXIgd29yayBwcm9kdWN0LCBpLmUuLCB0aGUgb3RoZXIgd29yayBwcm9kdWN0IG5lZWRzIHRvIGJlIGNyZWF0ZWQgaW4gb3JkZXIgdG8gY3JlYXRlIHRoZSBzZWNvbmQgd29yayBwcm9kdWN0LgotICA8L3A+Ci0gIDxwPkFkZCBhIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIHRvIHRoZSBkaWFncmFtLiA8L3A+Ci08L2Jsb2NrcXVvdGU+Ci08b2wgc3RhcnQ9IjEyIj4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCBiYWNrIHRvIHRoZSBkZWxpdmVyeSBwcm9jZXNzIGFuZCBvcGVuIHRoZSA8c3Ryb25nPldvcmsgUHJvZHVjdCBVc2FnZTwvc3Ryb25nPiB2aWV3LiBOb3RpY2UgdGhlIG5ldyB3b3JrIHByb2R1Y3QgaW4gdGhlIFJlcXVpcmVtZW50cyBhY3Rpdml0eS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+T25jZSB5b3UgaGF2ZSBlZGl0ZWQgYSBkaWFncmFtLCB5b3UgY2FuIGNob29zZSB0byBpbmNsdWRlIGl0IG9yIGV4Y2x1ZGUgaXQgd2hlbiBwdWJsaXNoaW5nIHRoZSBwcm9jZXNzIGluIGEgY29uZmlndXJhdGlvbi4gSW4gdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgcmlnaHQtY2xpY2sgb24gdGhlIDxzdHJvbmc+UmVxdWlyZW1lbnRzPC9zdHJvbmc+IGFjdGl2aXR5IGFuZCBzZWxlY3QgPHN0cm9uZz5EaWFncmFtcyAmZ3Q7IFB1Ymxpc2hpbmcgT3B0aW9ucy4gPC9zdHJvbmc+Q2hlY2sgb3IgdW5jaGVjayB0aGUgdHlwZXMgb2YgZGlhZ3JhbSBsaXN0ZWQuIElmIGEgZGlhZ3JhbSB0eXBlIGlzIG5vdCBsaXN0ZWQsIGl0IG1lYW5zIHRoYXQgeW91IGhhdmUgbm90IGVkaXRlZCB0aGF0IGRpYWdyYW0gdHlwZSBmb3IgdGhlIGFjdGl2aXR5IHlldC4gPC9wPgotICA8L2xpPgotICA8L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfaW50cm8uaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfaW50cm8uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWEzNTEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2ludHJvLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMT48YT48L2E+PGE+VHV0b3JpYWw6IFdvcmtpbmcgd2l0aCBQcm9jZXNzZXMgPC9hPjwvaDE+Ci08cD48c3Ryb25nPjxlbT5Qcm9jZXNzIEF1dGhvcmluZyA8L2VtPjwvc3Ryb25nPiBhbGxvd3MgYSBQcm9jZXNzIEVuZ2luZWVyIHRvIGluY29ycG9yYXRlIDxzdHJvbmc+PGVtPk1ldGhvZCBFbGVtZW50cyA8L2VtPjwvc3Ryb25nPiBpbnRvIHByb2Nlc3Mgc3RydWN0dXJlcy4gRm9yIGV4YW1wbGUsIGEgV29yayBCcmVha2Rvd24gU3RydWN0dXJlIGZvcm1hdCBmYW1pbGlhciB0byBQcm9qZWN0IE1hbmFnZXJzLiBUaGUgcHJvY2Vzc2VzIGNhbiBiZSBpbmNsdWRlZCBpbiBhIGNvbmZpZ3VyYXRpb24gdG8gYmUgcHVibGlzaGVkIGFzIHBhcnQgb2YgdGhlIHB1Ymxpc2hlZCB3ZWIgc2l0ZS4gPC9wPgotPHA+SW4gPHN0cm9uZz48ZW0+TWV0aG9kIDwvZW0+IEF1dGhvcmluZyA8L3N0cm9uZz4gdGhlIFByb2Nlc3MgRW5naW5lZXIgZGVmaW5lcyByb2xlcywgdGFza3MsIHdvcmsgcHJvZHVjdHMgYW5kIGd1aWRhbmNlIGFuZCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gdGhlc2UgZWxlbWVudHMuIDwvcD4KLTxwPkluIDxzdHJvbmc+PGVtPlByb2Nlc3MgPC9lbT4gQXV0aG9yaW5nIDwvc3Ryb25nPiB0aGUgcHJvY2VzcyBlbmdpbmVlciBkZWZpbmVzIGFkZGl0aW9uYWwgbGlmZWN5Y2xlIGVsZW1lbnRzIHN1Y2ggYXMgPHN0cm9uZz5BY3Rpdml0aWVzIDwvc3Ryb25nPiAoc3VtbWFyeSB0YXNrcyksIDxzdHJvbmc+UGhhc2VzIDwvc3Ryb25nPiwgPHN0cm9uZz5JdGVyYXRpb25zIDwvc3Ryb25nPiBhbmQgPHN0cm9uZz5NaWxlc3RvbmVzIDwvc3Ryb25nPiwgdGhhdCBjYW4gdGhlbiBiZSB1c2VkIHRvIGNvbXBvc2UgdGhlIGNvcmUgZWxlbWVudHMgaW50byBwcm9jZXNzZXMuIEEgY29tcGxldGUgcHJvY2VzcyBjb3JyZXNwb25kaW5nIHRvIGEgcHJvamVjdCBwbGFuIG9yIGEgcGhhc2Ugd2UgY2FsbCBhIDxzdHJvbmc+PGVtPkRlbGl2ZXJ5IFByb2Nlc3MgPC9lbT48L3N0cm9uZz48ZW0+KGNvcnJlc3BvbmRpbmcgdG8gU21hbGwgUlVQLCBmb3IgZXhhbXBsZSkgPC9lbT4uIFdlIGNhbiBhbHNvIGNyZWF0ZSBzbWFsbGVyIG1vcmUgZ3JhbnVsYXIgc2VjdGlvbnMgb2YgcHJvY2VzcywgdGVybWVkIDxzdHJvbmc+PGVtPkNhcGFiaWxpdHkgUGF0dGVybnMgPC9lbT48L3N0cm9uZz4gdGhhdCBjYW4gYmUgdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gbW9yZSBlYXNpbHkgY29tcG9zZSBkZWxpdmVyeSBwcm9jZXNzZXMuIDwvcD4KLTxwPkVhY2ggdGltZSBhIHRhc2sgaXMgaW5jbHVkZWQgaW4gYSBwcm9jZXNzLCBhIGNvcHkgb2YgdGhhdCB0YXNrIGlzIGNyZWF0ZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHByb2Nlc3MuIFdlIGNhbGwgdGhpcyBhIFRhc2sgRGVzY3JpcHRvci4gVGhlIHNhbWUgdGFzayBjYW4gYmUgaW5jbHVkZWQgYW55IG51bWJlciBvZiB0aW1lcyBpbiB0aGUgc2FtZSBwcm9jZXNzLiBUaGlzIGFsbG93cywgZm9yIGV4YW1wbGUsIHRoZSBzYW1lIFJVUCB0YXNrIHRvIGJlIGluY2x1ZGVkIGluIGVhY2ggSXRlcmF0aW9uIGluIGVhY2ggUlVQIFBoYXNlLiBBIFRhc2sgRGVzY3JpcHRvciBjYW4gYWxzbyBtb2RpZnkgdGhlIGJhc2UgdGFzayB3aXRob3V0IGFjdHVhbGx5IGNoYW5naW5nIHRoZSB0YXNrLiBGb3IgZXhhbXBsZSwgcm9sZXMgYW5kIHdvcmsgcHJvZHVjdHMgY2FuIGJlIGFkZGVkIG9yIHN1cHByZXNzZWQsIHN0ZXBzIGNhbiBiZSBzdXBwcmVzc2VkIG9yIHJlLXNlcXVlbmNlZC4gPC9wPgotPHA+b2xlcyBhbmQgV29yayBQcm9kdWN0cyBhcmUgYWxzbyBpbmNsdWRlZCBpbiBwcm9jZXNzZXMgYXMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiBTbyByb2xlcyBhbmQgd29yayBwcm9kdWN0cyBjYW4gYWxzbyBiZSBjdXN0b21pemVkIHRvIGZpdCB3aXRoIHRoZSBjb250ZXh0IG9mIHRoZSBwcm9jZXNzIGluIHdoaWNoIHRoZXkgYXJlIHVzZWQuPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHdpc3R5IHN5bWJvbDEuSlBHIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHdpc3R5IHN5bWJvbDEuSlBHCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2IxMWIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R3aXN0eSBzeW1ib2wxLkpQRworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VtYV9odW1wLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VtYV9odW1wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmNDU0NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91bWFfaHVtcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91bmRlcmxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdW5kZXJsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI3NjhjOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91bmRlcmxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdXNlcmludGVyZmFjZS5KUEcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91c2VyaW50ZXJmYWNlLkpQRwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIzNjhhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91c2VyaW50ZXJmYWNlLkpQRworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMjgzOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJUb29sIEludGVyZmFjZSIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImxpYnJhcnl2aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImJyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InNlYXJjaGZvcm1ldGhvZGNvbnRlbnQuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+VG9vbCBJbnRlcmZhY2U8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InVzZXJpbnRlcmZhY2VvdmVydmlldyI+PGEgbmFtZT0idXNlcmludGVyZmFjZW92ZXJ2aWV3Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VG9vbCBJbnRlcmZhY2U8L2gxPgotPGRpdj48cD5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQKLURldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6PC9wPgotPHA+PGltZyBzcmM9InVzZXJpbnRlcmZhY2UuSlBHIiBhbHQ9IiIgLz48L3A+Ci08ZGl2IGNsYXNzPSJwIj48dWw+PGxpPjxzdHJvbmc+Q29uZmlndXJhdGlvbiBkcm9wLWRvd24gc2VsZWN0aW9uIGJveDwvc3Ryb25nPiAtIFRoZSBjb25maWd1cmF0aW9uIGRyb3AtZG93bgotc2VsZWN0aW9uIGJveCBhbGxvd3MgeW91IHRvIHNlbGVjdCBhIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPmNvbmZpZ3VyYXRpb248L2E+IGluIHdoaWNoIHRvIHdvcmsuIDwvbGk+Ci08bGk+PHN0cm9uZz5PcGVuIFBlcnNwZWN0aXZlIGJ1dHRvbjwvc3Ryb25nPiAtIENsaWNrIHRoZSBPcGVuIFBlcnNwZWN0aXZlIGJ1dHRvbgotdG8gc2VsZWN0IGEgPGEgaHJlZj0icGVyc3BlY3RpdmVzLmh0bWwjcGVyc3BlY3RpdmVzIj5wZXJzcGVjdGl2ZTwvYT4uCi1UaGVyZSBhcmUgdHdvIHBlcnNwZWN0aXZlcyB0byBzZWxlY3QgZnJvbTogVGhlIDxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9hPiBhbmQgdGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT4uIDwvbGk+Ci08bGk+PHN0cm9uZz5MaWJyYXJ5IFZpZXc8L3N0cm9uZz4gLSBUaGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeQotVmlldzwvYT4gZGlzcGxheXMgdGhlIE1ldGhvZCBQbHVnLWlucyBhbmQgQ29uZmlndXJhdGlvbnMgY29udGFpbmVkIGluIGEKLU1ldGhvZCBMaWJyYXJ5LjwvbGk+Ci08bGk+PHN0cm9uZz5Db25maWd1cmF0aW9uIFZpZXc8L3N0cm9uZz4gLSBUaGUgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPiBzaG93cyB0aGUgY29udGVudCBlbGVtZW50cyBpbiBhIGxpYnJhcnkKLWZpbHRlcmVkIGJ5IGEgY29uZmlndXJhdGlvbi48L2xpPgotPGxpPjxzdHJvbmc+Q29udGVudCBFZGl0b3JzIGFuZCBQcmV2aWV3PC9zdHJvbmc+IC0gV2hlbiB5b3UgYXJlIHdvcmtpbmcgaW4gdGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZwotUGVyc3BlY3RpdmU8L2E+LCB0aGUgd2luZG93IG9uIHRoZSByaWdodCBzaWRlIG9mIHlvdXIgc2NyZWVuIGNvbnRhaW5zIGNvbnRlbnQKLWVkaXRvcnMsIHdoaWNoIGFsbG93IHlvdSB0byBjcmVhdGUgb3IgbW9kaWZ5IGVsZW1lbnQgdHlwZXMuIFdoZW4gdGhlIDxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiPkJyb3dzaW5nCi1QZXJzcGVjdGl2ZTwvYT4gaXMgb3BlbiwgdGhlIHdpbmRvdyBvbiB0aGUgcmlnaHQgY29udGFpbnMgYSBwcmV2aWV3IG9mCi15b3VyIGNvbnRlbnQgYXMgaXQgd2lsbCBhcHBlYXIgaW4gYSBwdWJsaXNoZWQgV2ViIHNpdGUuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTxvbD4KLTxsaSBjbGFzcz0ib2xjaGlsZGxpbmsiPjxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT48YnIgLz4KLTwvbGk+Ci08bGkgY2xhc3M9Im9sY2hpbGRsaW5rIj48YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9hPjxiciAvPgotPC9saT4KLTxsaSBjbGFzcz0ib2xjaGlsZGxpbmsiPjxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwiPkNvbmZpZ3VyYXRpb24gVmlldzwvYT48YnIgLz4KLTwvbGk+Ci08bGkgY2xhc3M9Im9sY2hpbGRsaW5rIj48YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sIj5MaWJyYXJ5IFZpZXc8L2E+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJvbGNoaWxkbGluayI+PGEgaHJlZj0iYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbCI+QnJvd3NlIGFuZCBQcmV2aWV3IE1ldGhvZCBDb250ZW50PC9hPjxiciAvPgotPC9saT4KLTxsaSBjbGFzcz0ib2xjaGlsZGxpbmsiPjxhIGhyZWY9InNlYXJjaGZvcm1ldGhvZGNvbnRlbnQuaHRtbCI+U2VhcmNoIGZvciBNZXRob2QgQ29udGVudDwvYT48YnIgLz4KLTwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VzZXJyb2xlc2FuZHJvbGVzcGVjaWZpY3Rhc2tzLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91c2Vycm9sZXNhbmRyb2xlc3BlY2lmaWN0YXNrcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGYxNjQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VzZXJyb2xlc2FuZHJvbGVzcGVjaWZpY3Rhc2tzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idG9waWMiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVXNlciBSb2xlcyBhbmQgUm9sZSBTcGVjaWZpYyBUYXNrcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJ1c2Vycm9sZXNhbmRyb2xlc3BlY2lmaWN0YXNrcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Vc2VyIFJvbGVzIGFuZCBSb2xlIFNwZWNpZmljIFRhc2tzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ1c2Vycm9sZXNhbmRyb2xlc3BlY2lmaWN0YXNrcyI+PGEgbmFtZT0idXNlcnJvbGVzYW5kcm9sZXNwZWNpZmljdGFza3MiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Vc2VyIFJvbGVzIGFuZCBSb2xlIFNwZWNpZmljIFRhc2tzPC9oMT4KLTxkaXY+PHA+VGhlcmUgYXJlIGZvdXIgcHJpbWFyeSByb2xlcyBwbGF5ZWQgYnkgdGhlIHVzZXJzIG9mIHRoaXMgdG9vbDo8L3A+Ci08dWw+PGxpPk1ldGhvZCBBdXRob3I8L2xpPgotPGxpPlByb2Nlc3MgQXV0aG9yPC9saT4KLTxsaT5Qcm9jZXNzIENvbmZpZ3VyYXRvcjwvbGk+Ci08bGk+UHJhY3RpdGlvbmVyPC9saT4KLTwvdWw+Ci08ZGl2IGNsYXNzPSJwIj48c3Ryb25nPk1ldGhvZCBBdXRob3I8L3N0cm9uZz4gLSBUaGUgTWV0aG9kIEF1dGhvciB1c2VzIHRoZSB0b29sIG9uIGEgcmVndWxhciBiYXNpcwotdG8gcHJvdmlkZSBzdGFuZGFyZCBwcm9jZXNzZXMgZm9yIHVzZSBpbiBhbiBvcmdhbml6YXRpb24uIFRoZSBNZXRob2QgQXV0aG9yCi11c2VzIHRoZSBmdWxsIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIHRvb2wgdG86PHVsPjxsaT5DcmVhdGUgcGx1Zy1pbnMuPC9saT4KLTxsaT5DcmVhdGUgbmV3IG1ldGhvZCBlbGVtZW50cy48L2xpPgotPGxpPkV4dGVuZCBleGlzdGluZyBtZXRob2QgZWxlbWVudHMuPC9saT4KLTxsaT5DcmVhdGUgcmV1c2FibGUgY2FwYWJpbGl0eSBwYXR0ZXJucyBieSByZXVzaW5nIG1ldGhvZCBlbGVtZW50cy48L2xpPgotPGxpPkNyZWF0ZSBkZWxpdmVyeSBwcm9jZXNzZXMgYnkgcmV1c2luZyBjYXBhYmlsaXR5IHBhdHRlcm5zIGFuZCBtZXRob2QgZWxlbWVudHMuPC9saT4KLTxsaT5DcmVhdGUgY3VzdG9tIGNhdGVnb3JpZXMgZm9yIHVzZSBhcyB2aWV3cyBpbiBhIGNvbmZpZ3VyYXRpb24uPC9saT4KLTxsaT5DcmVhdGUgYW5kIG1vZGlmeSBjb25maWd1cmF0aW9ucy48L2xpPgotPGxpPlB1Ymxpc2ggY29uZmlndXJhdGlvbnMgb3IgcHJvY2Vzc2VzLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJwIj48c3Ryb25nPlByb2Nlc3MgQXV0aG9yPC9zdHJvbmc+IC0gVGhlIFByb2Nlc3MgQXV0aG9yJ3MgZ29hbCBpcyB0byBwcm9kdWNlIGEgZGVsaXZlcnkKLXByb2Nlc3MgZm9yIHRoZWlyIHByb2plY3QocykgYnkgcmV1c2luZyBtZXRob2QgZWxlbWVudHMuIFRoZSBQcm9jZXNzIEF1dGhvcgotdXNlcyB0aGUgdG9vbCBvY2Nhc2lvbmFsbHksIGFzIHByb2plY3QgbmVlZHMgZGljdGF0ZSwgdHlwaWNhbGx5IHN1cHBvcnRpbmcKLW9uZSBvciwgbW9yZSBsaWtlbHksIHNldmVyYWwgcHJvamVjdHMgYnkgc3BlY2lmeWluZyB0aGUgcHJvY2Vzc2VzIHRvIGJlIGZvbGxvd2VkLgotVGhlIFByb2Nlc3MgQXV0aG9yIHVzZXMgdGhlIHByb2Nlc3MgYXV0aG9yaW5nIGFuZCBjb25maWd1cmF0aW9uIHB1Ymxpc2hpbmcKLWZ1bmN0aW9uYWxpdHkgb2YgdGhpcyB0b29sIHRvOjx1bD48bGk+Q3JlYXRlIHBsdWctaW5zLjwvbGk+Ci08bGk+Q3JlYXRlIHJldXNhYmxlIGNhcGFiaWxpdHkgcGF0dGVybnMgYnkgcmV1c2luZyBtZXRob2QgZWxlbWVudHMuPC9saT4KLTxsaT5DcmVhdGUgZGVsaXZlcnkgcHJvY2Vzc2VzIGJ5IHJldXNpbmcgY2FwYWJpbGl0eSBwYXR0ZXJucyBhbmQgbWV0aG9kIGVsZW1lbnRzLjwvbGk+Ci08bGk+Q3JlYXRlIGN1c3RvbSBjYXRlZ29yaWVzIGZvciB1c2UgYXMgdmlld3MgaW4gYSBjb25maWd1cmF0aW9uLiA8L2xpPgotPGxpPkNyZWF0ZSBhbmQgbW9kaWZ5IGNvbmZpZ3VyYXRpb25zLjwvbGk+Ci08bGk+UHVibGlzaCBjb25maWd1cmF0aW9ucyBvciBwcm9jZXNzZXMuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InAiPjxzdHJvbmc+UHJvY2VzcyBDb25maWd1cmF0b3I8L3N0cm9uZz4gLSBUaGUgUHJvY2VzcyBDb25maWd1cmF0b3IncyBnb2FsIGlzIHRvIHByb2R1Y2UKLWEgZGVsaXZlcnkgcHJvY2VzcyBmb3IgdGhlaXIgcHJvamVjdChzKSBieSByYXBpZGx5IGxldmVyYWdpbmcgcmVhZHktbWFkZSBwbHVnLWlucy4KLVRoZSBQcm9jZXNzIENvbmZpZ3VyYXRvciB1c2VzIHRoaXMgdG9vbCBvY2Nhc2lvbmFsLCBhcyBwcm9qZWN0IG5lZWRzIGRpY3RhdGUsCi10eXBpY2FsbHkgc3VwcG9ydGluZyBvbmUgb3Igc2V2ZXJhbCBwcm9qZWN0cyBieSBzcGVjaWZ5aW5nIHRoZSBwcm9jZXNzIGZvcgotdGhlIHByb2plY3RzLiBUaGUgUHJvY2VzcyBDb25maWd1cmF0b3IgdXNlcyB0aGUgY29uZmlndXJhdGlvbgotcHVibGlzaGluZyBmdW5jdGlvbmFsaXR5IGluIHRoaXMgdG9vbCB0bzo8dWw+PGxpPkNyZWF0ZSBhbmQgbW9kaWZ5IGNvbmZpZ3VyYXRpb25zLjwvbGk+Ci08bGk+UHVibGlzaCBjb25maWd1cmF0aW9ucyBvciBwcm9jZXNzZXMuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxwPjxzdHJvbmc+UHJhY3RpdGlvbmVyPC9zdHJvbmc+IC0gQSBQcmFjdGl0aW9uZXIncyBnb2FsIGlzIHRvIGNvcnJlY3RseSB1c2UgdGhlIG9yZ2FuaXphdGlvbidzCi1wcm9jZXNzZXMgYW5kIGJlc3QgcHJhY3RpY2VzIGVmZmVjdGl2ZWx5LiBBIFByYWN0aXRpb25lciB1c2VzIGEgcHVibGlzaGVkCi1jb25maWd1cmF0aW9uIG9uIGEgcmVndWxhciBiYXNpcyBkcml2ZW4gYnkgdGhlIHdvcmsgYmVpbmcgcGVyZm9ybWVkIHRvIHZpZXcKLXByb2Nlc3NlcyBhbmQgbWV0aG9kcy48L3A+Ci08L2Rpdj4KLTxkaXY+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC92YXJpYWJpbGl0eS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdmFyaWFiaWxpdHkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRhYTliNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC92YXJpYWJpbGl0eS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlZhcmlhYmlsaXR5IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZSBvciBtb2RpZnkgZWxlbWVudHMgaW4gb3RoZXIgY29udGVudCBwYWNrYWdlcyB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcgdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJWYXJpYWJpbGl0eSBhbGxvd3MgZWxlbWVudHMgaW4gb25lIGNvbnRlbnQgcGFja2FnZSB0byBpbmZsdWVuY2Ugb3IgbW9kaWZ5IGVsZW1lbnRzIGluIG90aGVyIGNvbnRlbnQgcGFja2FnZXMgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQuIFZhcmlhYmlsaXR5IGVuYWJsZXMgY2hhbmdlcyB0byB0aGUgY29udGVudCB3aGlsZSBrZWVwaW5nIHRoZSBjaGFuZ2VzIHNlcGFyYXRlIGFuZCBvcHRpb25hbC4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5YXNzb2NpYXRpb25zLmh0bWwjdmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNvbnRyaWJ1dGVzLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InJlcGxhY2UuaHRtbCNyZXBsYWNlcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZXh0ZW5kcy5odG1sI2V4dGVuZHMiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0idmFyaWFiaWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+VmFyaWFiaWxpdHk8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InZhcmlhYmlsaXR5Ij48YSBuYW1lPSJ2YXJpYWJpbGl0eSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlZhcmlhYmlsaXR5PC9oMT4KLTxkaXY+PHA+VmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlCi1vciBtb2RpZnkgZWxlbWVudHMgaW4gb3RoZXIgY29udGVudCBwYWNrYWdlcyB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZwotdGhlIG9yaWdpbmFsIGNvbnRlbnQuIFZhcmlhYmlsaXR5IGVuYWJsZXMgY2hhbmdlcyB0byB0aGUgY29udGVudCB3aGlsZSBrZWVwaW5nCi10aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuPC9wPgotPHA+VmFyaWFiaWxpdHkgYWxsb3dzIHlvdSB0byBmYWN0b3IgeW91ciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGludGVycmVsYXRlZAotdW5pdHMgYW5kIHRvIGFyY2hpdGVjdCBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGxheWVycyB0aGF0IGV4dGVuZAotZWFjaCBvdGhlciB3aXRoIG5ldyBjYXBhYmlsaXRpZXMuIFZhcmlhYmlsaXR5IGFsc28gYWxsb3dzIHlvdSB0byBleHRlbmQgYW5kCi10YWlsb3IgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyB5b3UgZG8gbm90IG93biBhbmQgY2Fubm90IGRpcmVjdGx5IG1vZGlmeSwKLWFuZCB0byBlYXNpbHkgdXBncmFkZSB0byBuZXdlciB2ZXJzaW9ucyBieSBzaW1wbHkgcmVhcHBseWluZyB5b3VyIHBlcnNvbmFsCi1jaGFuZ2VzIHRvIHRoZSB1cGdyYWRlcy48L3A+Ci08cD5UaGUgdXNlIG9mIHZhcmlhYmlsaXR5IGFmZmVjdHMgdHdvIGNoYXJhY3RlcmlzdGljcyBvZiBhIG1ldGhvZCBlbGVtZW50OgotaXRzIGF0dHJpYnV0ZXMgYW5kIGl0cyByZWxhdGlvbnNoaXBzIHdpdGggb3RoZXIgY29udGVudCBlbGVtZW50cy4gSWYgYW4gZWxlbWVudAotYWxsb3dzIHZhcmlhYmlsaXR5LCB0aGUgc3BlY2lmaWNhdGlvbiBpcyBzaG93biBhdCB0aGUgYm90dG9tIG9mIHRoZSBlbGVtZW50J3MKLWRlc2NyaXB0aW9uIHZpZXcuPC9wPgotPGRpdiBjbGFzcz0icCI+Rm9yIHRoZSBwdXJwb3NlcyBvZiB2YXJpYWJpbGl0eSwgdGhlcmUgYXJlIHRocmVlIGdyb3VwcyBvZiBpbmZvcm1hdGlvbgotZm9yIGFueSBlbGVtZW50IHRvIGJlIGNvbnNpZGVyZWQ6PHVsPjxsaT48c3Ryb25nPkF0dHJpYnV0ZXM8L3N0cm9uZz4gLSBwaWVjZXMgb2YgZGF0YSBhYm91dCBhbiBlbGVtZW50IHN1Y2ggYXMgTWFpbiBEZXNjcmlwdGlvbi48L2xpPgotPGxpPjxzdHJvbmc+SW5jb21pbmcgQXNzb2NpYXRpb25zPC9zdHJvbmc+IC0gYXNzb2NpYXRpb25zIHRvIG90aGVyIGVsZW1lbnRzIHdoZXJlIHRoZQotYXNzb2NpYXRpb24gcmVmZXJlbmNlIGlzIGhlbGQgaW4gdGhlIG90aGVyIGVsZW1lbnQuIEluIG90aGVyIHdvcmRzLCB0aGUgb3RoZXIKLWVsZW1lbnQgaGFzIHJlZmVyZW5jZXMgdG8gdGhlIHN1YmplY3QgZWxlbWVudC48L2xpPgotPGxpPjxzdHJvbmc+T3V0Z29pbmcgQXNzb2NpYXRpb25zPC9zdHJvbmc+IC0gYXNzb2NpYXRpb25zIHRvIG90aGVyIGVsZW1lbnRzIHdoZXJlIHRoZQotYXNzb2NpYXRpb24gcmVmZXJlbmNlIGlzIGhlbGQgaW4gdGhlIHN1YmplY3QgZWxlbWVudC4gSW4gb3RoZXIgd29yZHMsIHRoZQotc3ViamVjdCBlbGVtZW50IGhhcyByZWZlcmVuY2VzIHRvIHRoZSBvdGhlciBlbGVtZW50LjwvbGk+Ci08L3VsPgotSW4gYWRkaXRpb24sIGFzc29jaWF0aW9ucyBjYW4gYmUgb25lLXRvLW9uZSBvciBvbmUtdG8tbWFueS4gU2VlIDxhIGhyZWY9InZhcmlhYmlsaXR5YXNzb2NpYXRpb25zLmh0bWwjdmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMiPlZhcmlhYmlsaXR5IEFzc29jaWF0aW9uczwvYT4gZm9yCi1hIGZ1bGwgbGlzdCBvZiB0aGUgYXNzb2NpYXRpb25zIGZvciBlYWNoIHR5cGUgb2YgZWxlbWVudC48L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5WYXJpYWJpbGl0eSBUeXBlPC9oND48ZGl2IGNsYXNzPSJwIj5WYXJpYWJpbGl0eQotdHlwZSBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IG9uZSBlbGVtZW50IGFmZmVjdHMgYW5vdGhlciBlbGVtZW50IHVzaW5nIHZhcmlhYmlsaXR5LgotVGhlIHZhcmlhYmlsaXR5IHR5cGVzIGFyZTo8dWw+PGxpPjxzdHJvbmc+Tm90IEFwcGxpY2FibGU8L3N0cm9uZz4gLSBUaGUgZWxlbWVudCBpcyBhIGJhc2UgZWxlbWVudCBhbmQgZG9lcyBub3QgYWZmZWN0Ci1hbm90aGVyIGVsZW1lbnQgdGhyb3VnaCB2YXJpYWJpbGl0eS4gVGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhbiBlbGVtZW50J3MKLXZhcmlhYmlsaXR5IHR5cGUuPC9saT4KLTwvdWw+Ci08dWw+PGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImtleXdvcmQiPkNvbnRyaWJ1dGVzPC9zcGFuPjwvc3Ryb25nPiAtCi1BIGNvbnRyaWJ1dGluZyBlbGVtZW50IGFkZHMgdG8gdGhlIGJhc2UgZWxlbWVudC4gQ29udHJpYnV0ZXMgcHJvdmlkZXMgYSB3YXkKLWZvciBlbGVtZW50cyB0byBjb250cmlidXRlIHRoZWlyIHByb3BlcnRpZXMgaW50byB0aGVpciBiYXNlIGVsZW1lbnQgd2l0aG91dAotZGlyZWN0bHkgY2hhbmdpbmcgYW55IG9mIGl0cyBleGlzdGluZyBwcm9wZXJ0aWVzLCBzdWNoIGFzIGluIGFuIGFkZGl0aXZlIGZhc2hpb24uCi1UaGUgZWZmZWN0LCBhZnRlciBjb250cmlidXRpb24sIGlzIHRoYXQgdGhlIGJhc2UgZWxlbWVudCBpcyBsb2dpY2FsbHkgcmVwbGFjZWQKLXdpdGggYW4gZWxlbWVudCB0aGF0IGNvbWJpbmVzIHRoZSBhdHRyaWJ1dGVzIGFuZCBhc3NvY2lhdGlvbnMgb2YgdGhlIGNvbnRyaWJ1dGluZwotZWxlbWVudCB3aXRoIHRoZSBiYXNlIGVsZW1lbnQuPC9saT4KLTwvdWw+Ci08dWw+PGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImtleXdvcmQiPlJlcGxhY2VzPC9zcGFuPjwvc3Ryb25nPiAtCi1BIHJlcGxhY2luZyBlbGVtZW50IHJlcGxhY2VzIHBhcnRzIG9mIHRoZSBiYXNlIGVsZW1lbnQuIFJlcGxhY2VzIHByb3ZpZGVzCi1hIHdheSBmb3IgYW4gZWxlbWVudCB0byByZXBsYWNlIGEgYmFzZSBlbGVtZW50IHdpdGhvdXQgZGlyZWN0bHkgY2hhbmdpbmcgYW55Ci1vZiB0aGUgYmFzZSBlbGVtZW50J3MgZXhpc3RpbmcgcHJvcGVydGllcy4gVGhpcyBpcywgaW4gbW9zdCBjYXNlcywgdXNlZCBmb3IKLW1ldGhvZCBwbHVnLWlucyB0aGF0IGFpbSB0byByZXBsYWNlIHNwZWNpZmljIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyByb2xlcywKLXRhc2tzLCBvciBhY3Rpdml0aWVzIHdpdGggZWl0aGVyIGEgY29tcGxldGVseSBuZXcgdmFyaWFudCBvciB0byBjaGFuZ2UgdGhlCi1mdW5kYW1lbnRhbCByZWxhdGlvbnNoaXBzIG9mIHRoZXNlIGVsZW1lbnRzLiBUaGUgZWZmZWN0IG9mIHRoaXMsIGlzIHRoYXQgdGhlCi1iYXNlIGNvbnRlbnQgZWxlbWVudCBpcyBsb2dpY2FsbHkgcmVwbGFjZWQgd2l0aCB0aGUgbmV3IHJlcGxhY2luZyBlbGVtZW50Ci10byB3aGljaCBhbGwgaW5jb21pbmcgYXNzb2NpYXRpb25zIHN0aWxsIHBvaW50IGFzIGJlZm9yZSwgYnV0IHdoaWNoIGhhcyBwb3RlbnRpYWxseQotbmV3IGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIG91dGdvaW5nIGFzc29jaWF0aW9uIHByb3BlcnRpZXMuPC9saT4KLTwvdWw+Ci08dWw+PGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImtleXdvcmQiPkV4dGVuZHM8L3NwYW4+PC9zdHJvbmc+IC0KLUFuIGV4dGVuZGluZyBlbGVtZW50IGluaGVyaXRzIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgYmFzZSBlbGVtZW50LiBFeHRlbnNpb24KLWFsbG93cyBNZXRob2QgUGx1Zy1pbnMgdG8gZWFzaWx5IHJldXNlIGVsZW1lbnRzIGZyb20gYSBiYXNlIHBsdWctaW4gYnkgcHJvdmlkaW5nCi1hIGtpbmQgb2YgaW5oZXJpdGFuY2UgZm9yIHRoZSBleHRlbmRpbmcgZWxlbWVudC4gQXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24KLWluc3RhbmNlcyBhcmUgaW5oZXJpdGVkIGZyb20gdGhlICJiYXNlZC1vbiIgZWxlbWVudCB0byB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQuCi1UaGUgcmVzdWx0IGlzIHRoYXQgdGhlIGV4dGVuZGluZyBlbGVtZW50IGhhcyB0aGUgc2FtZSBwcm9wZXJ0aWVzIGFzIHRoZSAiYmFzZWQtb24iCi1lbGVtZW50LCBidXQgbWlnaHQgZGVmaW5lIGl0cyBvd24gYWRkaXRpb25zLiBFeHRlbmRzIGlzIG5vdCB1c2VkIHRvIG1vZGlmeQotY29udGVudCBvZiB0aGUgYmFzZSBwbHVnLWluLCBidXQgdG8gcHJvdmlkZSB0aGUgYWJpbGl0eSBmb3IgdGhlIGV4dGVuZGluZwotcGx1Zy1pbiB0byBkZWZpbmUgaXRzIG93biBjb250ZW50IHdoaWNoIGlzIGEgdmFyaWFudCBvZiBjb250ZW50IGFscmVhZHkgZGVmaW5lZC4KLUZvciBleGFtcGxlLCBhIHNwZWNpYWwgdmVyc2lvbiBvZiBhIGdlbmVyaWMgUmV2aWV3IFJlY29yZCBmb3IgYSBzcGVjaWZpYyB0eXBlCi1vZiByZXZpZXcuIFRoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IHRoZSBiYXNlIGVsZW1lbnQgYW5kIGFueSBudW1iZXIgb2YgZXh0ZW5kaW5nCi1lbGVtZW50cyBjYW4gYmUgdXNlZCBzaWRlIGJ5IHNpZGUsIGJ1dCByZWZlciB0byBlYWNoIG90aGVyIHRocm91Z2ggdGhlIGV4dGVuZHMKLXJlbGF0aW9uc2hpcC4gRXh0ZW5kcyBhbHNvIHByb3ZpZGVzIHRoZSBrZXkgbWVjaGFuaXNtIGZvciBiaW5kaW5nIGNhcGFiaWxpdHkKLXBhdHRlcm5zIHRvIHByb2Nlc3NlczogQSBwYXR0ZXJuIGlzIGFwcGxpZWQgYnkgZGVmaW5pbmcgYW4gZXh0ZW5kcyByZWxhdGlvbnNoaXAKLWZyb20gYW4gYWN0aXZpdHkgb2YgdGhlIGFwcGx5aW5nIHByb2Nlc3NlcyB0byB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuLiBUaGUKLWFjdGl2aXR5IGluaGVyaXRzIGFzc29jaWF0aW9uIGluc3RhbmNlcyBmcm9tIHRoZSBwYXR0ZXJuIGFuZCB0aGUgcGF0dGVybiBhcHBlYXJzCi10byBiZSBwYXJ0IG9mIHRoZSByZXN1bHRpbmcgcHJvY2VzcyBhZnRlciBpbnRlcnByZXRhdGlvbi48L2xpPgotPC91bD4KLTwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ2YXJpYWJpbGl0eWFzc29jaWF0aW9ucy5odG1sI3ZhcmlhYmlsaXR5YXNzb2NpYXRpb25zIj5WYXJpYWJpbGl0eSBBc3NvY2lhdGlvbnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNvbnRyaWJ1dGVzLmh0bWwiPkNvbnRyaWJ1dGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJyZXBsYWNlLmh0bWwjcmVwbGFjZXMiPlJlcGxhY2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJleHRlbmRzLmh0bWwjZXh0ZW5kcyI+RXh0ZW5kczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC92YXJpYWJpbGl0eWFzc29jaWF0aW9ucy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlhM2QyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC92YXJpYWJpbGl0eWFzc29jaWF0aW9ucy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlZhcmlhYmlsaXR5IEFzc29jaWF0aW9ucyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idmFyaWFiaWxpdHkuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJ2YXJpYWJpbGl0eWFzc29jaWF0aW9ucyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5WYXJpYWJpbGl0eSBBc3NvY2lhdGlvbnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InZhcmlhYmlsaXR5YXNzb2NpYXRpb25zIj48YSBuYW1lPSJ2YXJpYWJpbGl0eWFzc29jaWF0aW9ucyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlZhcmlhYmlsaXR5IEFzc29jaWF0aW9uczwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPlRoZSBmb2xsb3dpbmcgdGFibGUgbGlzdHMgdGhlIGluY29taW5nIGFuZCBvdXRnb2luZyBhc3NvY2lhdGlvbnMgZm9yIGVhY2gKLWVsZW1lbnQgdHlwZSBmb3Igd2hpY2ggdmFyaWFiaWxpdHkgY2FuIGJlIHVzZWQuIEFzc29jaWF0aW9ucyBhbHNvIGhhdmUgYSBjYXJkaW5hbGl0eQotb2YgdG8tbWFueSBvciB0by1vbmUuCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIiBzdW1tYXJ5PSIiIGZyYW1lPSJib3JkZXIiIGJvcmRlcj0iMSIgcnVsZXM9ImFsbCI+PHRoZWFkIGFsaWduPSJsZWZ0Ij48dHIgdmFsaWduPSJib3R0b20iPjx0aCB2YWxpZ249ImJvdHRvbSIgaWQ9ImQwZTE2Ij5FbGVtZW50IFR5cGU8L3RoPgotPHRoIHZhbGlnbj0iYm90dG9tIiBpZD0iZDBlMTgiPkFzc29jaWF0ZWQgRWxlbWVudCBUeXBlPC90aD4KLTx0aCB2YWxpZ249ImJvdHRvbSIgaWQ9ImQwZTIwIj5Bc3NvY2lhdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT48dHI+PHRkIHJvd3NwYW49IjgiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPldvcmsgUHJvZHVjdDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y29udGFpbmVkIGFydGlmYWN0czwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+ZGVsaXZlcmFibGUgcGFydHM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmd1aWRhbmNlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jb250YWluZXIgYXJ0aWZhY3Q8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW9uZTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5kZWxpdmVyYWJsZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tb25lPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPnJlc3BvbnNpYmxlIHJvbGU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW9uZTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5pbnB1dCBhbmQgb3V0cHV0IHRvIHRhc2tzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNhdGVnb3JpZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgcm93c3Bhbj0iNCIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2ICI+Um9sZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+cmVzcG9uc2libGUgZm9yIHdvcmsgcHJvZHVjdDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Z3VpZGFuY2U8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPnBlcmZvcm1lciBpbiB0YXNrPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNhdGVnb3JpZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgcm93c3Bhbj0iNyIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2ICI+VGFzazwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+cHJpbWFyeSBwZXJmb3JtZXIgcm9sZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW9uZTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5hZGRpdGlvbmFsIHBlcmZvcm1lciByb2xlczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+aW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5ndWlkYW5jZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+c3RlcHM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNhdGVnb3JpZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+ZGlzY2lwbGluZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tb25lPC90ZD4KLTwvdHI+Ci08dHI+PHRkIGNvbHNwYW49IjMiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiBkMGUxOCBkMGUyMCAiPkNhdGVnb3JpZXM8L3RkPgotPC90cj4KLTx0cj48dGQgcm93c3Bhbj0iMiIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2ICI+Q3VzdG9tIENhdGVnb3J5PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaXplZCBlbGVtZW50czwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+b3RoZXIgY3VzdG9tIGNhdGVnb3JpZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgcm93c3Bhbj0iNCIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2ICI+RGlzY2lwbGluZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y2F0ZWdvcml6ZWQgdGFza3M8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPnJlZmVyZW5jZWQgd29ya2Zsb3cgYWN0aXZpdHk8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1vbmU8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+ZGlzY2lwbGluZSBncm91cGluZzwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tb25lPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmN1c3RvbSBjYXRlZ29yaWVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHJvd3NwYW49IjIiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPkRpc2NpcGxpbmUgR3JvdXBpbmc8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNhdGVnb3JpemVkIGRpc2NpcGxpbmVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jdXN0b20gY2F0ZWdvcmllczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCByb3dzcGFuPSI0IiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgIj5Eb21haW48L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNhdGVnb3JpemVkIHdvcmsgcHJvZHVjdHM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPnN1Yi1kb21haW5zPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5zdXBlci1kb21haW5zPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1vbmU8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y3VzdG9tIGNhdGVnb3JpZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgcm93c3Bhbj0iMiIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2ICI+V29yayBQcm9kdWN0IFR5cGU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNhdGVnb3JpemVkIHdvcmsgcHJvZHVjdHM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmN1c3RvbSBjYXRlZ29yaWVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHJvd3NwYW49IjMiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPlJvbGUgU2V0PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaXplZCByb2xlczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+cm9sZSBzZXQgZ3JvdXBpbmc8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW9uZTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jdXN0b20gY2F0ZWdvcmllczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCByb3dzcGFuPSIyIiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgIj5Sb2xlIFNldCBHcm91cGluZzwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y2F0ZWdvcml6ZWQgcm9sZSBzZXRzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jdXN0b20gY2F0ZWdvcmllczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBjb2xzcGFuPSIzIiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgZDBlMTggZDBlMjAgIj5HdWlkYW5jZTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgIj5QcmFjdGljZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y29udGVudCBlbGVtZW50PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgIj5PdGhlciBHdWlkYW5jZSBUeXBlczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+c2VjdGlvbnMgdmlhIGNvbnRlbnQgZGVzY3JpcHRpb25zPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9InZhcmlhYmlsaXR5Lmh0bWwiIHRpdGxlPSJWYXJpYWJpbGl0eSBhbGxvd3MgZWxlbWVudHMgaW4gb25lIGNvbnRlbnQgcGFja2FnZSB0byBpbmZsdWVuY2Ugb3IgbW9kaWZ5IGVsZW1lbnRzIGluIG90aGVyIGNvbnRlbnQgcGFja2FnZXMgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQuIFZhcmlhYmlsaXR5IGVuYWJsZXMgY2hhbmdlcyB0byB0aGUgY29udGVudCB3aGlsZSBrZWVwaW5nIHRoZSBjaGFuZ2VzIHNlcGFyYXRlIGFuZCBvcHRpb25hbC4iPlZhcmlhYmlsaXR5PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIHRpdGxlPSJWYXJpYWJpbGl0eSBhbGxvd3MgZWxlbWVudHMgaW4gb25lIGNvbnRlbnQgcGFja2FnZSB0byBpbmZsdWVuY2Ugb3IgbW9kaWZ5IGVsZW1lbnRzIGluIG90aGVyIGNvbnRlbnQgcGFja2FnZXMgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQuIFZhcmlhYmlsaXR5IGVuYWJsZXMgY2hhbmdlcyB0byB0aGUgY29udGVudCB3aGlsZSBrZWVwaW5nIHRoZSBjaGFuZ2VzIHNlcGFyYXRlIGFuZCBvcHRpb25hbC4iPlZhcmlhYmlsaXR5PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvY29uZi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL2NvbmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTVlNmI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvY29uZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL21jLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvbWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDM0MmMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvbWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9tY192c19wLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvbWNfdnNfcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZjFiMDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9tY192c19wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvbWV0aG9kYXV0aG9yaW5nLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL21ldGhvZGF1dGhvcmluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzhkZDA1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvbWV0aG9kYXV0aG9yaW5nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08aHRtbD4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aGVhZD4KLTx0aXRsZT5NZXRob2QgQ29udGVudCBBdXRob3JpbmcgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDM+TWV0aG9kIENvbnRlbnQgQXV0aG9yaW5nIE92ZXJ2aWV3PC9oMz4KLTxwPk1ldGhvZCBjb250ZW50IGRlc2NyaWJlcyByb2xlcywgdGhlIHRhc2tzIHRoYXQgdGhleSBwZXJmb3JtLCB0aGUgd29yayBwcm9kdWN0cwotICB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZCBieSB0aG9zZSB0YXNrcywgYW5kIHN1cHBvcnRpbmcgZ3VpZGFuY2UuPC9wPgotPHA+PGltZyBzcmM9Im1jLmdpZiI+PC9wPgotPHA+VGhlIGZpZ3VyZSBhYm92ZSBkZXBpY3RzIHR5cGljYWwgc291cmNlcyBmb3IgbWV0aG9kIGNvbnRlbnQsIGFzIHdlbGwgYXMgaG93Ci0gIHRoZSBtZXRob2QgY29udGVudCBpcyByZXByZXNlbnRlZCBpbiBFUEYgQ29tcG9zZXIuIE1hbnkgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhcmUgZGVzY3JpYmVkCi0gIGluIHB1YmxpY2F0aW9ucyBzdWNoIGFzIGJvb2tzLCBhcnRpY2xlcywgdHJhaW5pbmcgbWF0ZXJpYWwsIHN0YW5kYXJkcyBhbmQgcmVndWxhdGlvbnMsCi0gIGFuZCBvdGhlciBmb3JtcyBvZiBkb2N1bWVudGF0aW9uLiBUaGVzZSBzb3VyY2VzIHVzdWFsbHkgZG9jdW1lbnQgbWV0aG9kcyBieQotICBwcm92aWRpbmcgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBmb3IgYSBwYXJ0aWN1bGFyIHdheSBvZiBhY2hpZXZpbmcgYSBzcGVjaWZpYwotICBkZXZlbG9wbWVudCBnb2FsIHVuZGVyIGdlbmVyYWwgY2lyY3Vtc3RhbmNlcy4gU29tZSBleGFtcGxlcyBhcmU6IHRyYW5zZm9ybWluZwotICBhIHJlcXVpcmVtZW50cyBkb2N1bWVudCBpbnRvIGFuIGFuYWx5c2lzIG1vZGVsOyBkZWZpbmluZyBhbiBhcmNoaXRlY3R1cmFsIG1lY2hhbmlzbQotICBiYXNlZCBvbiBmdW5jdGlvbmFsIGFuZCBub24tZnVuY3Rpb25hbCByZXF1aXJlbWVudHM7IGNyZWF0aW5nIGEgcHJvamVjdCBwbGFuCi0gIGZvciBhIGRldmVsb3BtZW50IGl0ZXJhdGlvbjsgZGVmaW5pbmcgYSBxdWFsaXR5IGFzc3VyYW5jZSBwbGFuIGZvciBmdW5jdGlvbmFsCi0gIHJlcXVpcmVtZW50czsgcmVkZXNpZ25pbmcgYSBidXNpbmVzcyBvcmdhbml6YXRpb24gYmFzZWQgb24gYSBuZXcgc3RyYXRlZ2ljIGRpcmVjdGlvbiwKLSAgYW5kIHNvIG9uLjwvcD4KLTxwPkVQRiBDb21wb3NlciB0YWtlcyBjb250ZW50IHN1Y2ggYXMgdGhhdCBkZXNjcmliZWQgYWJvdmUsIGFuZCBzdHJ1Y3R1cmVzIGl0IGluIGEgc3BlY2lmaWMKLSAgc2NoZW1hIG9mIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlLiBUaGlzIHNjaGVtYSBzdXBwb3J0cyB0aGUKLSAgb3JnYW5pemF0aW9uIG9mIGxhcmdlIGFtb3VudHMgb2YgZGVzY3JpcHRpb25zIGZvciBkZXZlbG9wbWVudCBtZXRob2RzIGFuZCBwcm9jZXNzZXMuCi0gIFN1Y2ggbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBkbyBub3QgaGF2ZSB0byBiZSBsaW1pdGVkIHRvIHNvZnR3YXJlIGVuZ2luZWVyaW5nLAotICBidXQgY2FuIGFsc28gY292ZXIgb3RoZXIgZGVzaWduIGFuZCBlbmdpbmVlcmluZyBkaXNjaXBsaW5lcyBzdWNoIGFzIG1lY2hhbmljYWwKLSAgZW5naW5lZXJpbmcsIGJ1c2luZXNzIHRyYW5zZm9ybWF0aW9uLCBzYWxlcyBjeWNsZXMsIGFuZCBzbyBvbi48L3A+Ci08cD4gVGhlIEVQRiBDb21wb3NlciBzY3JlZW4gY2FwdHVyZSBpbiB0aGUgZmlndXJlIGFib3ZlIHNob3dzIGhvdyBzdWNoIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzCi0gIGFyZSBvcmdhbml6ZWQgaW4gdHJlZSBicm93c2VycyBvbiB0aGUgbGVmdC4gVGhlc2UgdHJlZSBicm93c2Vycywgc2ltaWxhciB0bwotICBhIGxpYnJhcnksIHByb3ZpZGUgZGlmZmVyZW50IGluZGV4ZXMgb2YgdGhlIGF2YWlsYWJsZSBlbGVtZW50cyBmb3IgcmFwaWQgYWNjZXNzLgotICBUaGUgc2NyZWVuIGNhcHR1cmUgc2hvd3Mgb24gdGhlIHJpZ2h0IGFuIGV4YW1wbGUgb2YgYSB0YXNrIHByZXNlbnRhdGlvbi4gVGhpcwotICB0YXNrIHByZXNlbnRhdGlvbiBkZWZpbmVzIHRoZSB0YXNrIGluIHRlcm1zIG9mIHN0ZXBzIHRoYXQgbmVlZCB0byBiZSBwZXJmb3JtZWQKLSAgdG8gYWNoaWV2ZSB0aGUgdGFzaydzIHB1cnBvc2UuIFlvdSBjYW4gc2VlIHRoYXQgdGhlIHRhc2sgaGFzIHZhcmlvdXMgcmVsYXRpb25zaGlwcywKLSAgc3VjaCBhcyByZWxhdGlvbnNoaXBzIHRvIHBlcmZvcm1pbmcgcm9sZXMgYXMgd2VsbCBhcyB3b3JrIHByb2R1Y3RzIHRoYXQgc2VydmUKLSAgYXMgaW5wdXRzIGFuZCBvdXRwdXRzIHRvIHRoZSB0YXNrLiBGaW5kIG91dCBtb3JlIGRldGFpbHMgb24gdGFza3MsIHJvbGUsIGFuZAotICB3b3JrIHByb2R1Y3RzIGluIHRoZSBvbmxpbmUgaGVscCA8YSBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCI+aGVyZTwvYT4uCi0gIEluIGFkZGl0aW9uIHRvIHJvbGVzLCB0YXNrcywgYW5kIHdvcmsgcHJvZHVjdHMsIEVQRiBDb21wb3NlciBzdXBwb3J0cyB0aGUgYWRkaXRpb24gb2YKLSAgZ3VpZGFuY2UgZWxlbWVudHMuIEd1aWRhbmNlIGFyZSBzdXBwbGVtZW50YXJ5IGZyZWUtZm9ybSBkb2N1bWVudGF0aW9uIHN1Y2ggYXMKLSAgd2hpdGVwYXBlcnMsIGNvbmNlcHQgZGVzY3JpcHRpb25zLCBndWlkZWxpbmVzLCB0ZW1wbGF0ZXMsIGV4YW1wbGVzLCBhbmQgc28gb24uPC9wPgotPHA+RVBGIENvbXBvc2VyIHByb3ZpZGVzIHZhcmlvdXMgZm9ybS1iYXNlZCBlZGl0b3JzIHRvIGNyZWF0ZSBuZXcgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMuCi0gIERvY3VtZW50IHlvdXIgdGFzaywgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIGFuZCBndWlkYW5jZSBlbGVtZW50cyB1c2luZyBpbnR1aXRpdmUKLSAgcmljaC10ZXh0IGVkaXRvcnMgdGhhdCBhbGxvdyB5b3UgdG8gY29weSBhbmQgcGFzdGUgdGV4dCBmcm9tIG90aGVyIHNvdXJjZXMgc3VjaAotICBhcyB3ZWIgcGFnZXMgb3IgZG9jdW1lbnRzLiBVc2Ugc2ltcGxlIGRpYWxvZ3MgdG8gZXN0YWJsaXNoIHJlbGF0aW9uc2hpcHMgYmV0d2VlbgotICBjb250ZW50IGVsZW1lbnRzLjwvcD4KLTxwPkVQRiBDb21wb3NlciBvcmdhbml6ZXMgY29udGVudCBpbiBwaHlzaWNhbCBjb250ZW50IHBhY2thZ2VzIHRoYXQgYWxsb3cgeW91IHRvIG1hbmFnZQotICB5b3VyIGNvbnRlbnQgaW4gY29uZmlndXJhYmxlIHVuaXRzLiBFUEYgQ29tcG9zZXIgYWxzbyBhbGxvd3MgeW91IHRvIGNhdGVnb3JpemUgeW91ciBjb250ZW50Ci0gIGJhc2VkIG9uIGEgc2V0IG9mIHByZWRlZmluZWQgY2F0ZWdvcmllcyAoZm9yIGV4YW1wbGUsIGNhdGVnb3JpemUgeW91ciB0YXNrcwotICBpbnRvIGRldmVsb3BtZW50IGRpc2NpcGxpbmVzLCBvciB5b3VyIHdvcmsgcHJvZHVjdHMgaW50byBkb21haW5zKSBvciBjcmVhdGUKLSAgeW91ciBvd24gY2F0ZWdvcml6YXRpb24gc2NoZW1lcyBmb3IgeW91ciBjb250ZW50IHdpdGggeW91ciBvd24gdXNlci1kZWZpbmVkCi0gIGNhdGVnb3JpZXMgdGhhdCBhbGxvdyB5b3UgdG8gaW5kZXggY29udGVudCBpbiBhbnkgd2F5IHlvdSB3YW50LjwvcD4KLTxwPkZvciBtb3JlIGRldGFpbHMgb24gbWV0aG9kIGNvbnRlbnQgYXV0aG9yaW5nIHNlZSB0aGUgb25saW5lIGhlbHA6PC9wPgotPGRpdiBhbGlnbj0ibGVmdCI+Ci08dWw+Ci0gIDxsaT48YSBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCI+TWV0aG9kCi0gICAgICBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+PC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxwPiZuYnNwOzwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvb3ZlcnZpZXcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvb3ZlcnZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNmOTE0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL292ZXJ2aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotPGh0bWw+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGhlYWQ+Ci08dGl0bGU+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMz5JbnRyb2R1Y3Rpb24gdG8gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciAoRVBGIENvbXBvc2VyKTwvaDM+Ci08cD5XZWxjb21lIHRvIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgKEVQRiBDb21wb3NlcikuIEVQRiBDb21wb3NlciBpcyBhIHRvb2wgcGxhdGZvcm0gdGhhdCBlbmFibGVzCi0gIHByb2Nlc3MgZW5naW5lZXJzIGFuZCBtYW5hZ2VycyB0byBpbXBsZW1lbnQsIGRlcGxveSwgYW5kIG1haW50YWluIHByb2Nlc3NlcwotICBmb3Igb3JnYW5pemF0aW9ucyBvciBpbmRpdmlkdWFsIHByb2plY3RzLiBUeXBpY2FsbHksIHR3byBrZXkgcHJvYmxlbXMgbmVlZCB0bwotICBiZSBhZGRyZXNzZWQgdG8gc3VjY2Vzc2Z1bGx5IGRlcGxveSBuZXcgcHJvY2Vzc2VzLjwvcD4KLTxwPiBGaXJzdCwgZGV2ZWxvcG1lbnQgdGVhbXMgbmVlZCB0byBiZSBlZHVjYXRlZCBvbiB0aGUgbWV0aG9kcyBhcHBsaWNhYmxlIHRvCi0gIHRoZSByb2xlcyB0aGF0IHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gU29mdHdhcmUgZGV2ZWxvcGVycyB0eXBpY2FsbHkgbmVlZAotICB0bwotICBsZWFybgotICBob3cKLSAgdG8KLSAgZG8gYW5hbHlzaXMgYW5kIGRlc2lnbiwgdGVzdGVycyBuZWVkIHRvIGxlYXJuIGhvdyB0byB0ZXN0IGltcGxlbWVudGF0aW9ucyBhZ2FpbnN0Ci0gICByZXF1aXJlbWVudHMsIG1hbmFnZXJzIG5lZWQgdG8gbGVhcm4gaG93IHRvIG1hbmFnZSB0aGUgcHJvamVjdCBzY29wZSBhbmQgY2hhbmdlLAotCi0gIGFuZCBzbyBvbi4gU29tZSBvcmdhbml6YXRpb25zIGFzc3VtZSB0aGF0IGRldmVsb3BlcnMgaW1wbGljaXRseSBrbm93IGhvdyB0bwotICAgZG8gc3VjaCB3b3JrIHdpdGhvdXQgZG9jdW1lbnRpbmcgdGhlaXIgbWV0aG9kcywgYnV0IG1hbnkgb3JnYW5pemF0aW9ucyB3YW50Ci0KLSAgdG8gZXN0YWJsaXNoIGNvbW1vbiBhbmQgcmVndWxhdGVkIHByYWN0aWNlcywgdG8gZHJpdmUgc3BlY2lmaWMgaW1wcm92ZW1lbnQKLSAgb2JqZWN0aXZlcywgIGFuZCB0byBtZWV0IGNvbXBsaWFuY2Ugc3RhbmRhcmRzLjwvcD4KLTxwPiBTZWNvbmQsIGRldmVsb3BtZW50IHRlYW1zIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdG8gYXBwbHkgdGhlc2UgbWV0aG9kcyB0aHJvdWdob3V0Ci0gIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiBUaGF0IGlzLCB0aGV5IG5lZWQgdG8gZGVmaW5lIG9yIHNlbGVjdCBhIGRldmVsb3BtZW50Ci0gIHByb2Nlc3MuIEZvcgotCi0gIGV4YW1wbGUsIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50IG1ldGhvZHMgaGF2ZSB0byBiZSBhcHBsaWVkIGRpZmZlcmVudGx5IGluCi0gIGVhcmx5ICBwaGFzZXMgb2YgYSBwcm9qZWN0IHdoZXJlIHRoZSBmb2N1cyBpcyBvbiBlbGljaXRhdGlvbiBvZiBzdGFrZWhvbGRlcgotICBuZWVkcyBhbmQKLSAgcmVxdWlyZW1lbnRzIGFuZCBzY29waW5nIGEgdmlzaW9uLCB0aGFuIGluIGxhdGVyIHBoYXNlcyB3aGVyZSB0aGUgZm9jdXMgaXMKLSAgb24gIG1hbmFnaW5nIHJlcXVpcmVtZW50cyB1cGRhdGVzIGFuZCBjaGFuZ2VzIGFuZCBwZXJmb3JtaW5nIGltcGFjdCBhbmFseXNpcwotICBvZgotICB0aGVzZSByZXF1aXJlbWVudHMgY2hhbmdlcy4gVGVhbXMgYWxzbyBuZWVkIGNsZWFyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZQotICBkaWZmZXJlbnQgIHRhc2tzIG9mIHRoZSBtZXRob2RzIHJlbGF0ZSB0byBlYWNoIG90aGVyLCBmb3IgZXhhbXBsZSwgaG93IHRoZQotICBjaGFuZ2UgbWFuYWdlbWVudAotICBtZXRob2QgaW1wYWN0cyB0aGUgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQgbWV0aG9kIGFzIHdlbGwgYXMgcmVncmVzc2lvbiB0ZXN0aW5nCi0gICBtZXRob2QgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlLiBFdmVuIHNlbGYtb3JnYW5pemluZyB0ZWFtcyBuZWVkIHRvIGRlZmluZQotICBhCi0gIHByb2Nlc3MgdGhhdCBnaXZlcyBhdCBtaW5pbXVtIHNvbWUgZ3VpZGFuY2Ugb24gaG93IHRoZSBkZXZlbG9wbWVudCB3aWxsIGJlCi0gIHNjb3BlZCAgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlLCB3aGVuIG1pbGVzdG9uZXMgd2lsbCBiZSBhY2hpZXZlZCBhbmQgdmVyaWZpZWQsCi0gIGFuZAotICBzbyBvbi4gPC9wPgotPHA+VG8gdGhhdCBlbmQsIEVQRiBDb21wb3NlciBoYXMgdHdvIG1haW4gcHVycG9zZXM6IDwvcD4KLTxkaXYgYWxpZ249ImxlZnQiPjx1bD4KLSAgPGxpPlRvIHByb3ZpZGUgYSBrbm93bGVkZ2UgYmFzZSBvZiBpbnRlbGxlY3R1YWwgY2FwaXRhbCB3aGljaCB5b3UgY2FuIGJyb3dzZSwKLSAgICBtYW5hZ2UgYW5kIGRlcGxveS4gVGhpcyBjb250ZW50IGNhbiBpbmNsdWRlIGV4dGVybmFsbHkgZGV2ZWxvcGVkIGNvbnRlbnQsCi0gICAgYW5kLCBtb3JlIGltcG9ydGFudGx5LCBjYW4gaW5jbHVkZSB5b3VyIG93biBjb250ZW50IGluY2x1ZGluZyBvZiB3aGl0ZXBhcGVycywKLSAgICBndWlkZWxpbmVzLCB0ZW1wbGF0ZXMsIHByaW5jaXBsZXMsIGJlc3QgcHJhY3RpY2VzLCBpbnRlcm5hbCBwcm9jZWR1cmVzIGFuZAotICAgIHJlZ3VsYXRpb25zLCB0cmFpbmluZyBtYXRlcmlhbCwgYW5kIGFueSBvdGhlciBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB5b3VyCi0gICAgbWV0aG9kcy4gVGhpcyBrbm93bGVkZ2UgYmFzZSBjYW4gdXNlZCBmb3IgcmVmZXJlbmNlIGFuZCBlZHVjYXRpb24uIEl0IGFsc28KLSAgICBmb3JtcyB0aGUgYmFzaXMgZm9yIGRldmVsb3BpbmcgcHJvY2Vzc2VzICh0aGUgc2Vjb25kIHB1cnBvc2UpLiBFUEYgQ29tcG9zZXIgaXMgZGVzaWduZWQKLSAgICB0byBiZSBhIGNvbnRlbnQgbWFuYWdlbWVudCBzeXN0ZW0gdGhhdCBwcm92aWRlcyBhIGNvbW1vbiBtYW5hZ2VtZW50IHN0cnVjdHVyZQotICAgIGFuZCBsb29rIGFuZCBmZWVsIGZvciBhbGwgb2YgeW91ciBjb250ZW50LCByYXRoZXIgdGhhbiBiZWluZyBhIGRvY3VtZW50IG1hbmFnZW1lbnQKLSAgICBzeXN0ZW0gaW4gd2hpY2ggeW91IHdvdWxkIHN0b3JlIGFuZCBhY2Nlc3MgaGFyZCB0byBtYWludGFpbiBsZWdhY3kgZG9jdW1lbnRzCi0gICAgYWxsIGluIHRoZWlyIG93biBzaGFwZXMgYW5kIGZvcm1hdHMuIEFsbCBjb250ZW50IG1hbmFnZWQgaW4gRVBGIENvbXBvc2VyIGNhbiBiZSBwdWJsaXNoZWQKLSAgICB0byBodG1sIGFuZCBkZXBsb3llZCB0byBXZWIgc2VydmVycyBmb3IgZGlzdHJpYnV0ZWQgdXNhZ2UuPGJyPgotICA8L2xpPgotICA8bGk+VG8gcHJvdmlkZSBwcm9jZXNzIGVuZ2luZWVyaW5nIGNhcGFiaWxpdGllcyBieSBzdXBwb3J0aW5nIHByb2Nlc3MgZW5naW5lZXJzCi0gICAgYW5kIHByb2plY3QgbWFuYWdlcnMgaW4gc2VsZWN0aW5nLCB0YWlsb3JpbmcsIGFuZCByYXBpZGx5IGFzc2VtYmxpbmcgcHJvY2Vzc2VzCi0gICAgZm9yIHRoZWlyIGNvbmNyZXRlIGRldmVsb3BtZW50IHByb2plY3RzLiBFUEYgQ29tcG9zZXIgcHJvdmlkZXMgY2F0YWxvZ3Mgb2YgcHJlLWRlZmluZWQKLSAgICBwcm9jZXNzZXMgZm9yIHR5cGljYWwgcHJvamVjdCBzaXR1YXRpb25zIHRoYXQgY2FuIGJlIGFkYXB0ZWQgdG8gaW5kaXZpZHVhbAotICAgIG5lZWRzLiBJdCBhbHNvIHByb3ZpZGVzIHByb2Nlc3MgYnVpbGRpbmcgYmxvY2tzLCBjYWxsZWQgY2FwYWJpbGl0eSBwYXR0ZXJucywKLSAgICB0aGF0IHJlcHJlc2VudCBiZXN0IGRldmVsb3BtZW50IHByYWN0aWNlcyBmb3Igc3BlY2lmaWMgZGlzY2lwbGluZXMsIHRlY2hub2xvZ2llcywKLSAgICBvciBtYW5hZ2VtZW50IHN0eWxlcy4gVGhlc2UgYnVpbGRpbmcgYmxvY2tzIGZvcm0gYSB0b29sa2l0IGZvciBxdWljayBhc3NlbWJseQotICAgIG9mIHByb2Nlc3NlcyBiYXNlZCBvbiBwcm9qZWN0LXNwZWNpZmljIG5lZWRzLiBFUEYgQ29tcG9zZXIgYWxzbyBhbGxvd3MgeW91IHRvIHNldCB1cAotICAgIHlvdXIgb3duIG9yZ2FuaXphdGlvbi1zcGVjaWZpYyBjYXBhYmlsaXR5IHBhdHRlcm4gbGlicmFyaWVzLiBGaW5hbGx5LCB0aGUKLSAgICBwcm9jZXNzZXMgY3JlYXRlZCB3aXRoIEVQRiBDb21wb3NlciBjYW4gYmUgcHVibGlzaGVkIGFuZCBkZXBsb3llZCBhcyBXZWIgc2l0ZXMuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxoMz5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyJ3MgS2V5IENhcGFiaWxpdGllczwvaDM+Ci08cD5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgbmV3IGtleSBjYXBhYmlsaXRpZXM6PC9wPgotICA8ZGl2IGFsaWduPSJsZWZ0Ij4KLTx1bD4KLSAgPGxpPiBQcm92aWRlcyBjb21wbGV0ZWx5IHJlZGVzaWduZWQgdG9vbHMgZm9yIGF1dGhvcmluZywgY29uZmlndXJpbmcsIHZpZXdpbmcsCi0gICAgYW5kIHB1Ymxpc2hpbmcgZGV2ZWxvcG1lbnQgcHJvY2Vzc2VzLjwvbGk+Ci0gIDxsaT4gUHJvdmlkZXMganVzdC1pbi10aW1lIGdlbmVyYXRpb24gb2YgcHVibGljYXRpb24gcHJldmlld3MgaW4gZGVkaWNhdGVkIGJyb3dzaW5nCi0gICAgcGVyc3BlY3RpdmUgdGhhdCBhbGxvd3MgcmFwaWQgY29uZmlndXJhdGlvbiBzd2l0Y2hpbmcuPC9saT4KLSAgPGxpPiBNYW5hZ2VzIG1ldGhvZCBjb250ZW50IHVzaW5nIHNpbXBsZSBmb3JtLWJhc2VkIHVzZXIgaW50ZXJmYWNlcy4gVGhlcmVmb3JlLAotICAgIFVNTCBtb2RlbGluZyBza2lsbHMgYXJlIG5vIGxvbmdlciByZXF1aXJlZC48L2xpPgotICA8bGk+IFByb3ZpZGVzIGludHVpdGl2ZSByaWNoIHRleHQgZWRpdG9ycyBmb3IgY3JlYXRpbmcgaWxsdXN0cmF0aXZlIGNvbnRlbnQKLSAgICBkZXNjcmlwdGlvbnMuIEVkaXRvcnMgYWxsb3cgdXNlIG9mIHN0eWxlcywgaW1hZ2VzLCB0YWJsZXMsIGh5cGVybGlua3MsIGFuZAotICAgIGRpcmVjdCBodG1sIGVkaXRpbmcuPC9saT4KLSAgPGxpPkFsbG93cyBjcmVhdGluZyBwcm9jZXNzZXMgd2l0aCBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvcnMgYW5kIHdvcmtmbG93Ci0gICAgZGlhZ3JhbXMgdGhyb3VnaCB1c2Ugb2YgbXVsdGktcHJlc2VudGF0aW9uIHByb2Nlc3MgZWRpdG9ycy4gQnJlYWtkb3duIHN0cnVjdHVyZQotICAgIGVkaXRvciBzdXBwb3J0cyBkaWZmZXJlbnQgcHJvY2VzcyB2aWV3czogd29yay1icmVha2Rvd24gdmlldywgd29yayBwcm9kdWN0Ci0gICAgdXNhZ2UgdmlldywgYW5kIHRlYW0gYWxsb2NhdGlvbiB2aWV3LiBFUEYgQ29tcG9zZXIgYXV0b21hdGljYWxseSBzeW5jaHJvbml6ZXMgYWxsIHByZXNlbnRhdGlvbnMKLSAgICB3aXRoIHByb2Nlc3MgY2hhbmdlcy4gPC9saT4KLSAgPGxpPlByb3ZpZGVzIHN1cHBvcnQgZm9yIG1hbnkgYWx0ZXJuYXRpdmUgbGlmZWN5Y2xlCi0gICAgbW9kZWxzLiBGb3IgZXhhbXBsZSwgd2F0ZXJmYWxsLCBpbmNyZW1lbnRhbCwgb3IgaXRlcmF0aXZlIG1vZGVscyBjYW4gYmUgY3JlYXRlZAotICAgIHdpdGggdGhlIHNhbWUgb3ZlcmxhcHBpbmcgbWV0aG9kIGNvbnRlbnQuPC9saT4KLSAgPGxpPkltcHJvdmVkIHJldXNlIGFuZCBleHRlbnNpYmlsaXR5IGNhcGFiaWxpdGllcy4gVGhlIHBsdWctaW4gbWVjaGFuaXNtcyBmcm9tCi0gICAgcGFzdCB2ZXJzaW9ucyBoYXZlIGJlZW4gZXh0ZW5kZWQgdG8gc3VwcG9ydCBleHRlbnNpb25zIGZvciBicmVha2Rvd24gc3RydWN0dXJlcy48L2xpPgotICA8bGk+U3VwcG9ydHMgcmV1c2FibGUgZHluYW1pY2FsbHktbGlua2VkIHByb2Nlc3MgcGF0dGVybnMgb2YgYmVzdCBwcmFjdGljZXMKLSAgICBmb3IgcmFwaWQgcHJvY2VzcyBhc3NlbWJseSB2aWEgZHJhZy1hbmQtZHJvcC48L2xpPgotPC91bD4KLTwvZGl2PgotPGgzPktleSBUZXJtaW5vbG9neSBhbmQgQ29uY2VwdHM8L2gzPgotPHA+VG8gZWZmZWN0aXZlbHkgd29yayB3aXRoIEVQRiBDb21wb3NlciwgeW91IG5lZWQgdG8gdW5kZXJzdGFuZCBhIGZldyBjb25jZXB0cwotICB0aGF0IGFyZSB1c2VkIHRvIG9yZ2FuaXplIHRoZSBjb250ZW50LiBUaGUgcGFnZXMgPGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiPk1ldGhvZAotICBDb250ZW50IEF1dGhvcmluZyBPdmVydmlldzwvYT4gYW5kIDxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCI+UHJvY2VzcwotICBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+IGNvbnRhaW4gbW9yZSBkZXRhaWwgYW5kIGNvbmNyZXRlIGV4YW1wbGVzIG9mIGhvdyB0byB3b3JrCi0gIGluIHRoZSB0b29sLiBUaGlzIHBhZ2UgcHJvdmlkZXMgeW91IHdpdGggYSBnZW5lcmFsIG92ZXJ2aWV3IG9mIHRoZXNlIGNvbmNlcHRzLjwvcD4KLTxwPlRoZSBtb3N0IGZ1bmRhbWVudGFsIHByaW5jaXBsZSBpbiBFUEYgQ29tcG9zZXIgaXMgdGhlIHNlcGFyYXRpb24gb2YgcmV1c2FibGUgY29yZSBtZXRob2QKLSAgY29udGVudCBmcm9tIGl0cyBhcHBsaWNhdGlvbiBpbiBwcm9jZXNzZXMuIFRoaXMgZGlyZWN0bHkgcmVsYXRlcyBiYWNrIHRvIHRoZQotICB0d28gcHVycG9zZXMgb2YgRVBGIENvbXBvc2VyIGRlc2NyaWJlZCBpbiB0aGUgZmlyc3Qgc2VjdGlvbi4gQWxtb3N0IGFsbCBvZiBFUEYgQ29tcG9zZXIncyBjb25jZXB0cwotICBhcmUgY2F0ZWdvcml6ZWQgYWxvbmcgdGhpcyBzZXBhcmF0aW9uLiBNZXRob2QgY29udGVudCBkZXNjcmliZXMgd2hhdCBpcyB0byBiZQotICBwcm9kdWNlZCwgdGhlIG5lY2Vzc2FyeSBza2lsbHMgcmVxdWlyZWQgYW5kIHRoZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIGRlc2NyaWJpbmcKLSAgaG93IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZC4gVGhlc2UgbWV0aG9kIGNvbnRlbnQgZGVzY3JpcHRpb25zCi0gIGFyZSBpbmRlcGVuZGVudCBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gUHJvY2Vzc2VzIGRlc2NyaWJlIHRoZSBkZXZlbG9wbWVudAotICBsaWZlY3ljbGUuIFByb2Nlc3NlcyB0YWtlIHRoZSBtZXRob2QgY29udGVudCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQKLSAgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuPC9wPgotPHA+PGltZyBzcmM9InVtYV9odW1wLmdpZiI+PC9wPgotPHA+VGhlIGZpZ3VyZSBhYm92ZSBzaG93cyBob3cgdGhpcyBzZXBhcmF0aW9uIGlzIGRlcGljdGVkIGluIEJhc2ljIFVuaWZpZWQKLSAgUHJvY2Vzcy4gTWV0aG9kIGNvbnRlbnQsIGRlc2NyaWJpbmcgaG93IGRldmVsb3BtZW50IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkLAotICBpcyBjYXRlZ29yaXplZCBieSBkaXNjaXBsaW5lcyBhbG9uZyB0aGUgeS1heGlzIG9mIHRoZSBkaWFncmFtLiBUaGUgd29yayBkZXNjcmliZWQKLSAgaW4gYSBwcm9jZXNzIGlzIHNlZW4gYWxvbmcgdGhlIHgtYXhpcyByZXByZXNlbnRpbmcgdGhlIHRpbWVsaW5lLiBUaGlzIGlzIHRoZQotICBsaWZlY3ljbGUgb2YgYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBJdCBleHByZXNzZXMgd2hlbiB3aGF0IHdvcmsgd2lsbCBiZSBwZXJmb3JtZWQuCi0gIFRoZSBncmFwaCBpbiB0aGUgaWxsdXN0cmF0aW9uIHJlcHJlc2VudHMgYW4gZXN0aW1hdGVkIHdvcmtsb2FkIGZvciBlYWNoIGRpc2NpcGxpbmUuCi0gIEFzIHlvdSBzZWUsIGZvciBleGFtcGxlLCBvbmUgbmV2ZXIgc3RvcHMgd29ya2luZyBvbiByZXF1aXJlbWVudHMgaW4gUlVQLCBidXQKLSAgdGhlcmUgYXJlIGNlcnRhaW5seSBwZWFrIHRpbWVzIGluIHdoaWNoIG1vc3Qgb2YgdGhlIHJlcXVpcmVtZW50cyBlbGljaXRhdGlvbgotICBhbmQgZGVzY3JpcHRpb24gd29yayBpcyBwZXJmb3JtZWQuIFRoZXJlIGFyZSBhbHNvIHRpbWVzIGF0IHdoaWNoIGEgZG93bndhcmQKLSAgdHJlbmQgbmVlZHMgdG8gYmUgb2JzZXJ2ZWQgd2hlcmUgZmV3ZXIgYW5kIGZld2VyIHJlcXVpcmVtZW50cyBjaGFuZ2VzIGhhdmUgdG8KLSAgYmUgcHJvY2Vzc2VkIHRvIGJyaW5nIHRoZSBwcm9qZWN0IHRvIGEgY2xvc2UuIFRoaXMgYXZvaWRzIHdoYXQgaXMgcmVmZXJyZWQgdG8KLSAgYXMgZmVhdHVyZSBjcmVlcCBpbiB3aGljaCByZXF1aXJlbWVudHMgd29yayByZW1haW5zIGNvbnN0YW50IG9yIGV2ZW4gaW5jcmVhc2VzLgotICBIZW5jZSwgYSBsaWZlY3ljbGUgKHByb2Nlc3MpIGV4cHJlc3NlcyB0aGUgdmFyaWFuY2VzIG9mIHdvcmsgcGVyZm9ybWVkIGluIHRoZQotICB2YXJpb3VzIGRpc2NpcGxpbmVzIChtZXRob2QgY29udGVudCkuPC9wPgotPHA+PGltZyBzcmM9Im1jX3ZzX3AuZ2lmIj48L3A+Ci08cD5UaGUgcGljdHVyZSBhYm92ZSBwcm92aWRlcyBhIHN1bW1hcnkgb2YgdGhlIGtleSBlbGVtZW50cyB1c2VkIGluIEVQRiBDb21wb3NlciBhbmQgaG93Ci0gIHRoZXkgcmVsYXRlIHRvIG1ldGhvZCBjb250ZW50IG9yIHByb2Nlc3MuIEFzIHlvdSBzZWUsIG1ldGhvZCBjb250ZW50IGlzIHByaW1hcmlseQotICBleHByZXNzZWQgdXNpbmcgd29yayBwcm9kdWN0cywgcm9sZXMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UuIEd1aWRhbmNlLCBzdWNoIGFzCi0gIGNoZWNrbGlzdHMsIGV4YW1wbGVzLCBvciByb2FkbWFwcywgY2FuIGFsc28gYmUgZGVmaW5lZCB0byBwcm92aWRlIGV4ZW1wbGFyeQotICB3YWxrdGhyb3VnaHMgb2YgYSBwcm9jZXNzLiBPbiB0aGUgcmlnaHQtaGFuZCBzaWRlIG9mIHRoZSBkaWFncmFtLCB5b3Ugc2VlIHRoZQotICBlbGVtZW50cyB1c2VkIHRvIHJlcHJlc2VudCBwcm9jZXNzZXMgaW4gRVBGIENvbXBvc2VyLiBUaGUgbWFpbiBlbGVtZW50IGlzIHRoZSBhY3Rpdml0eQotICB0aGF0IGNhbiBiZSBuZXN0ZWQgdG8gZGVmaW5lIGJyZWFrZG93biBzdHJ1Y3R1cmVzIGFzIHdlbGwgYXMgcmVsYXRlZCB0byBlYWNoCi0gIG90aGVyIHRvIGRlZmluZSBhIGZsb3cgb2Ygd29yay4gQWN0aXZpdGllcyBhbHNvIGNvbnRhaW4gZGVzY3JpcHRvcnMgdGhhdCByZWZlcmVuY2UKLSAgbWV0aG9kIGNvbnRlbnQuIEFjdGl2aXRpZXMgYXJlIHVzZWQgdG8gZGVmaW5lIHByb2Nlc3NlcyBvZiB3aGljaCBFUEYgQ29tcG9zZXIgc3VwcG9ydAotICB0d28gbWFpbiBraW5kczogZGVsaXZlcnkgcHJvY2Vzc2VzIGFuZCBjYXBhYmlsaXR5IHBhdHRlcm5zLiBEZWxpdmVyeSBwcm9jZXNzZXMKLSAgcmVwcmVzZW50IGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgcHJvY2VzcyB0ZW1wbGF0ZSBmb3IgcGVyZm9ybWluZyBvbmUgc3BlY2lmaWMKLSAgdHlwZSBvZiBwcm9qZWN0LiBUaGV5IGRlc2NyaWJlIGEgY29tcGxldGUgZW5kLXRvLWVuZCBwcm9qZWN0IGxpZmVjeWNsZSBhbmQgYXJlCi0gIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcy4gQ2FwYWJpbGl0eQotICBwYXR0ZXJucyBhcmUgcHJvY2Vzc2VzIHRoYXQgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEKLSAga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIGRpc2NpcGxpbmUgb3IgYSBiZXN0IHByYWN0aWNlLiBUaGV5IGFyZSBhbHNvCi0gIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIGRlbGl2ZXJ5IHByb2Nlc3NlcyBvciBsYXJnZXIgY2FwYWJpbGl0eQotICBwYXR0ZXJucy4gVGhpcyBlbnN1cmVzIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZWlyIGtleSBiZXN0IHByYWN0aWNlcwotICBpbiBwcm9jZXNzIGF1dGhvcmluZyBhY3Rpdml0aWVzIGluIEVQRiBDb21wb3Nlci4gPC9wPgotCi08cD5Gb3IgbW9yZSBkZXRhaWxzIG9uIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIsIHNlZSB0aGUgb25saW5lIGhlbHA6PC9wPgotPGRpdiBhbGlnbj0ibGVmdCI+Ci08dWw+Ci0gIDxsaT48YSBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWJvdXRlcGZjb21wb3Nlci5odG1sIj5PdmVydmlldzwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N0YW5kYXJkbWV0aG9kbGlicmFyeW92ZXJ2aWV3Lmh0bWwiPkdldHRpbmcKLSAgICAgIFN0YXJ0ZWQ8L2E+PC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxwPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjg2ODg3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3Byb2Nlc3NhdXRob3JpbmcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvcHJvY2Vzc2F1dGhvcmluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mzg0MjJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvcHJvY2Vzc2F1dGhvcmluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPGh0bWw+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGhlYWQ+Ci08dGl0bGU+UHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDM+UHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXc8L2gzPgotPHA+QSBkZXZlbG9wbWVudCBwcm9jZXNzIGRlZmluZXMgc2VxdWVuY2VzIG9mIHRhc2tzIHBlcmZvcm1lZCBieSByb2xlcyBhbmQgd29yawotICBwcm9kdWN0cyBwcm9kdWNlZCBvdmVyIHRpbWUuPC9wPgotPHA+PGltZyBzcmM9InAuZ2lmIj48L3A+Ci08cD5UaGUgZmlndXJlIGFib3ZlIHNob3dzIHRoYXQgcHJvY2Vzc2VzIGFyZSB0eXBpY2FsbHkgZXhwcmVzc2VkIGFzIHdvcmtmbG93cwotICBvciBicmVha2Rvd24gc3RydWN0dXJlcy4gRGVmaW5pbmcgYSBzdHJpY3Qgc2VxdWVuY2UgYXMgaW4gYSB3YXRlcmZhbGwgbW9kZWwKLSAgaXMgYXMgbXVjaCBhIHByb2Nlc3MgYXMgZGVmaW5pbmcgc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyBpbiBpdGVyYXRpb25zIG9mIHBhcmFsbGVsCi0gIHdvcmsuIFRoZXkganVzdCByZXByZXNlbnQgZGlmZmVyZW50IGRldmVsb3BtZW50IGFwcHJvYWNoZXMuIEhlbmNlLCBmb3IgZGVmaW5pbmcKLSAgYSBwcm9jZXNzLCBvbmUgY2FuIHRha2UgbWV0aG9kIGNvbnRlbnQgYW5kIGNvbWJpbmUgaXQgaW50byBzdHJ1Y3R1cmVzIHRoYXQgc3BlY2lmeQotICBob3cgdGhlIHdvcmsgc2hhbGwgYmUgb3JnYW5pemVkIG92ZXIgdGltZSwgdG8gbWVldCB0aGUgbmVlZHMgb2YgYSBwYXJ0aWN1bGFyCi0gIHR5cGUgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdCAoc3VjaCBhcyBzb2Z0d2FyZSBmb3IgYSBvbmxpbmUgc3lzdGVtIHZlcnN1cyBzb2Z0d2FyZQotICBhbmQgaGFyZHdhcmUgZm9yIGFuIGVtYmVkZGVkIHN5c3RlbSkuIEVQRiBDb21wb3NlciBzdXBwb3J0cyBwcm9jZXNzZXMgYmFzZWQgb24gZGlmZmVyZW50Ci0gIGRldmVsb3BtZW50IGFwcHJvYWNoZXMgYWNyb3NzIG1hbnkgZGlmZmVyZW50IGxpZmVjeWNsZSBtb2RlbHMsIGluY2x1ZGluZyB3YXRlcmZhbGwsCi0gIGluY3JlbWVudGFsLCBhbmQgaXRlcmF0aXZlIGxpZmVjeWNsZXMuIEVQRiBDb21wb3NlciBhbHNvIHN1cHBvcnRzIGRpZmZlcmVudCBwcmVzZW50YXRpb25zCi0gIGZvciBwcm9jZXNzLCBzdWNoIGFzIHdvcmstYnJlYWtkb3duIHN0cnVjdHVyZSBvciB3b3JrZmxvdyBwcmVzZW50YXRpb25zLiBZb3UKLSAgY2FuIGFsc28gZGVmaW5lIHByb2Nlc3NlcyBpbiBFUEYgQ29tcG9zZXIgdGhhdCB1c2UgYSBtaW5pbWFsIHNldCBvZiBtZXRob2QgY29udGVudCB0bwotICBkZWZpbmUgcHJvY2Vzc2VzIGZvciBhZ2lsZSwgc2VsZi1vcmdhbml6aW5nIHRlYW1zLjwvcD4KLTxwPiBUaGUgRVBGIENvbXBvc2VyIHNjcmVlbiBjYXB0dXJlIGFib3ZlIHNob3dzIGFuIGV4YW1wbGUgb2YgYSBwcm9jZXNzIHByZXNlbnRlZCBhcyBhCi0gIGJyZWFrZG93biBzdHJ1Y3R1cmUgb2YgbmVzdGVkIGFjdGl2aXRpZXMgYXMgd2VsbCBhcyBhIHdvcmtmbG93IG9yIGFjdGl2aXR5IGRpYWdyYW0KLSAgZm9yIG9uZSBwYXJ0aWN1bGFyIGFjdGl2aXR5LCB0aGUgaW5jZXB0aW9uIHBoYXNlLiBJdCBhbHNvIGluZGljYXRlcyB3aXRoIHRoZQotICB0d28gYmx1ZSBhcnJvd3MgdGhhdCB0aGUgcGFydGljdWxhciBtZXRob2QgY29udGVudCB0YXNrICZxdW90O0RldGFpbCBhIFVzZSBDYXNlJnF1b3Q7Ci0gIGhhcyBiZWVuIGFwcGxpZWQgaW4gdGhlIHByb2Nlc3MgdHdpY2U7IGZpcnN0bHkgaW4gdGhlIGluY2VwdGlvbiBwaGFzZSB1bmRlcgotICB0aGUgYWN0aXZpdHkgJnF1b3Q7RGVmaW5lIHRoZSBTeXN0ZW0sJnF1b3Q7IGFuZCBzZWNvbmRseSwgaW4gdGhlIGVsYWJvcmF0aW9uCi0gIHBoYXNlIGluIHRoZSBhY3Rpdml0eSAmcXVvdDtSZWZpbmUgdGhlIHN5c3RlbSBkZWZpbml0aW9uJnF1b3Q7LiBZb3Ugc2VlIGJlbG93Ci0gIGVhY2ggb2YgdGhlc2UgdGFzayBhcHBsaWNhdGlvbnMsIHJlZmVycmVkIHRvIGFzIGEgdGFzayBkZXNjcmlwdG9ycyBpbiBFUEYgQ29tcG9zZXIsIGxpc3RzCi0gIG9mIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFzIHdlbGwgYXMgdGhlIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gSWYgeW91Ci0gIGxvb2sgY2xvc2VseSwgeW91IHNlZSB0aGF0IHRoZXNlIGxpc3RzIGFyZSBkaWZmZXJlbnQgZm9yIGVhY2ggb2YgdGhlc2UgdHdvIHRhc2sKLSAgZGVzY3JpcHRvcnMsIGV4cHJlc3NpbmcgZGlmZmVyZW5jZXMgaW4gcGVyZm9ybWluZyB0aGUgJnF1b3Q7RGV0YWlsIGEgVXNlIENhc2UmcXVvdDsKLSAgbWV0aG9kIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZS4gWW91IHNlZSBkaWZmZXJlbnQgcm9sZXMgaW52b2x2ZWQgYW5kIGNoYW5nZXMKLSAgaW4gdGhlIGxpc3Qgb2YgaW5wdXRzIHRvIGJlIGNvbnNpZGVyZWQgYW5kIG91dHB1dHMgdG8gYmUgcHJvZHVjZWQgb3IgdXBkYXRlZC4KLSAgVGhlc2UgY2hhbmdlcyB3ZXJlIGRlZmluZWQgYnkgdGhlIGF1dGhvciB0aGF0IGNyZWF0ZWQgdGhpcyBwcm9jZXNzIHRvIGV4cHJlc3MKLSAgdGhlIGV4YWN0IGZvY3VzIG9mIHRoZSB0YXNrIHBlcmZvcm1hbmNlIGZvciBlYWNoIG9jY3VycmVuY2UuIEluIGFkZGl0aW9uIHRvCi0gIHVwZGF0aW5nIHRoZSByb2xlcywgaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzIGZvciBhIHRhc2sgZGVzY3JpcHRvciwgeW91Ci0gIGNhbiBhbHNvIHByb3ZpZGUgYWRkaXRpb25hbCB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcyB3ZWxsIGFzIGRlZmluZSB0aGUgZXhhY3QKLSAgc3RlcHMgb2YgdGhlIHRhc2sgdGhhdCBzaG91bGQgYW5kIHNob3VsZCBub3QgYmUgcGVyZm9ybWVkIGZvciB0aGlzIHBhcnRpY3VsYXIKLSAgb2NjdXJyZW5jZSBvZiB0aGUgdGFzay48L3A+Ci08cD5FUEYgQ29tcG9zZXIgcHJvdmlkZXMgeW91IHdpdGggYSBwcm9jZXNzIGVkaXRvciB0aGF0IHN1cHBvcnRzIGRpZmZlcmVudCBicmVha2Rvd24gc3RydWN0dXJlCi0gIHZpZXdzIGFzIHdlbGwgYXMgZ3JhcGhpY2FsIHByb2Nlc3MgcHJlc2VudGF0aW9ucy4gQXMgYSBwcm9jZXNzIGF1dGhvciwgeW91IHR5cGljYWxseQotICBzdGFydCBieSBjcmVhdGluZyBhbiBhY3Rpdml0eSBicmVha2Rvd24sIGRpdmlkaW5nIGFuZCBicmVha2luZyB5b3VyIHByb2Nlc3MKLSAgZG93biBpbnRvIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGhpZ2gtbGV2ZWwgYWN0aXZpdGllcy4gSW5zdGVhZCBvZiBjcmVhdGluZwotICB5b3VyIGFjdGl2aXRpZXMgaW4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZWRpdG9yLCB5b3UgY2FuIGFsdGVybmF0aXZlbHkgd29yawotICBpbiBhIGdyYXBoaWNhbCBhY3Rpdml0eSBkaWFncmFtIGVkaXRvciB0aGF0IGFsbG93cyB5b3UgdG8gZ3JhcGhpY2FsbHkgY3JlYXRlCi0gIGEgd29ya2Zsb3cgZm9yIHlvdXIgYWN0aXZpdGllcy4gVG8gYXNzaWduIG1ldGhvZCBjb250ZW50IHRvIHlvdXIgcHJvY2VzcywgeW91Ci0gIHRoZW4gaGF2ZSB0aGUgY2hvaWNlIG9mIHdvcmtpbmcgaW4gZGlmZmVyZW50IHByb2Nlc3Mgdmlld3MgKHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSwKLSAgd29yayBwcm9kdWN0IHVzYWdlLCBvciB0ZWFtIGFsbG9jYXRpb24gdmlldykuIEVhY2ggdmlldyBzdXBwb3J0cyBhIGRpZmZlcmVudAotICBhcHByb2FjaCBmb3IgY3JlYXRpbmcgYSBwcm9jZXNzLiBZb3UgY2FuIGRlZmluZSB0aGUgd29yayB0byBiZSBkb25lLCBkZWZpbmUKLSAgdGhlIHJlc3VsdHMgdG8gYmUgcHJvZHVjZWQsIG9yIGRlZmluZSByZXNwb25zaWJpbGl0aWVzIGZvciB5b3VyIHJvbGVzLiBJZiByZXF1ZXN0ZWQsCi0gIHRoZSBlZGl0b3IgdXBkYXRlcyB0aGUgb3RoZXIgcHJvY2VzcyB2aWV3cyBzZW1pLWF1dG9tYXRpY2FsbHkgdXNpbmcgd2l6YXJkcwotICB0aGF0IHByb21wdCB5b3UgZm9yIGRlY2lzaW9ucyBvbiBzZWxlY3RpbmcgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMuPC9wPgotPHA+Rm9yIG1vcmUgZGV0YWlscyBvbiBwcm9jZXNzIGF1dGhvcmluZyBzZWUgdGhlIG9ubGluZSBoZWxwOjwvcD4KLTxkaXYgYWxpZ249ImxlZnQiPgotPHVsPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sIj5Qcm9jZXNzCi0gIEF1dGhvcmluZyBPdmVydmlldzwvYT48L2xpPgotPC91bD4KLTwvZGl2PgotPHA+Jm5ic3A7PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9wdWIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9wdWIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzI1NDc0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvcHViLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvcHVibGlzaGluZy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9wdWJsaXNoaW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYjhjMWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9wdWJsaXNoaW5nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08aHRtbD4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aGVhZD4KLTx0aXRsZT5Db25maWd1cmF0aW9uIGFuZCBQdWJsaXNoaW5nPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgzPk1ldGhvZCBDb25maWd1cmF0aW9ucyBPdmVydmlldzwvaDM+Ci08cD5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIHNoaXBzIHdpdGggYSBsb3Qgb2YgY29udGVudCBvdXQgb2YgdGhlIGJveC4gSXQgaW5jbHVkZXMKLSAgdGhlIE9wZW4gVW5pZmllZCBQcm9jZXNzIChPcGVuVVApIGZyYW1ld29yayBhbmQgdmFyaW91cyBwbHVnLWlucyBleHRlbmRpbmcKLSAgT3BlblVQL0Jhc2ljIHdpdGggZG9tYWluLXNwZWNpZmljIGFkZGl0aW9ucy4gTm8gb3JnYW5pemF0aW9uIG9yIHByb2plY3QgcmVxdWlyZXMgYWxsIG9mIHRoaXMKLSAgZG9jdW1lbnRhdGlvbiBhbGwgYXQgb25jZSwgYnV0IHdvdWxkIHdvcmsgd2l0aCBhIHNlbGVjdGlvbiBvZiBzcGVjaWZpYyBzdWJzZXRzLjwvcD4KLTxwPiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIChFUEYgQ29tcG9zZXIpIG1hbmFnZXMgZm9yIHRoYXQgcHVycG9zZSBzby1jYWxsZWQgbWV0aG9kCi0gIGNvbmZpZ3VyYXRpb25zLCB3aGljaCBhbGxvdyB5b3UgdG8gc3BlY2lmeSB3b3JraW5nIHNldHMgb2YgY29udGVudCBhbmQgcHJvY2Vzc2VzCi0gIGZvciBhIHNwZWNpZmljIGNvbnRleHQsIHN1Y2ggYXMgYSBzcGVjaWZpYyB2YXJpYW50IG9mIHRoZSBSVVAgZnJhbWV3b3JrIHRoYXQKLSAgeW91IHdhbnQgdG8gcHVibGlzaCBhbmQgZGVwbG95IGZvciBhIGdpdmVuIHNvZnR3YXJlIHByb2plY3Qgb3IgYXMgYSBmb3VuZGF0aW9uCi0gIGZvciBhIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbi4gQWxsIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBFUEYgQ29tcG9zZXIgYXJlIG9yZ2FuaXplZAotICBpbiBtZXRob2QgcGx1Zy1pbnMsIHdoaWNoIGFyZSBvcmdhbml6ZWQgaW50byBtZXRob2QgcGFja2FnZXMuIEEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLSAgaXMgc2ltcGx5IGEgc2VsZWN0aW9uIG9mIHRoZSBtZXRob2QgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzLjwvcD4KLTxwPjxpbWcgc3JjPSJjb25mLmdpZiI+PC9wPgotPHA+WW91IGNyZWF0ZSBhbmQgc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gdXNpbmcgdGhlIGNvbmZpZ3VyYXRpb24gZWRpdG9yIGRlcGljdGVkCi0gIGluIHRoZSBmaWd1cmUgYWJvdmUuIFlvdSBjb3VsZCBzdGFydCBjcmVhdGluZyB5b3VyIG93biBtZXRob2QgY29uZmlndXJhdGlvbgotICBieSBjb3B5aW5nIG9uZSBvZiB0aGUgY29uZmlndXJhdGlvbnMgdGhhdCBzaGlwIHdpdGggRVBGIENvbXBvc2VyIGFuZCBtb2RpZnkgaXQgdG8gZml0Ci0gIHlvdXIgc3BlY2lmaWMgbmVlZHMuIFlvdSBjYW4gYWRkIG9yIHJlbW92ZSB3aG9sZSBtZXRob2QgcGx1Zy1pbnMgYXMgd2VsbCBhcwotICBtYWtlIHNlbGVjdGlvbiB3aXRoIGVhY2ggcGx1Zy1pbiBieSBjaGVja2luZyBvciB1bi1jaGVja2luZyBwYWNrYWdlcy4gPC9wPgotPHA+IFlvdSBjYW4gdXNlIHRoZSByZXN1bHRpbmcgY29uZmlndXJhdGlvbiBhcyB5b3VyIHdvcmtpbmcgc2V0IGZvciB5b3VyIEVQRiBDb21wb3NlcgotICB3b3JrLiBUaGUgYWN0dWFsIGNvbnRlbnQgb2YgdGhlIGNvbmZpZ3VyYXRpb24sIGkuZS4gdGhlIGluY2x1ZGVkIG1ldGhvZCBjb250ZW50Ci0gIGFuZCBwcm9jZXNzIGVsZW1lbnRzIGFyZSBhbHdheXMgYWNjZXNzaWJsZSBpbiB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LiBVc2UgdGhlCi0gIGNvbWJvIGJveCBpbiB0aGUgdG9vbGJhciB0byBzZWxlY3QgdGhlIGN1cnJlbnRseSB1c2VkIG1ldGhvZCBjb25maWd1cmF0aW9uLjwvcD4KLTxoMz5QdWJsaXNoaW5nIE92ZXJ2aWV3PC9oMz4KLTxwPk1ldGhvZCBjb25maWd1cmF0aW9ucyBhcmUgdGhlIGJhc2lzIGZvciBwdWJsaXNoaW5nIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuCi0gIEEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gaXMgYW4gaHRtbCBXZWIgc2l0ZSB0aGF0IHByZXNlbnRzIGFsbCB0aGUgbWV0aG9kCi0gIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBvZiB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gYSBuYXZpZ2FibGUgYW5kIHNlYXJjaGFibGUKLSAgd2F5LiBJdCB1c2VzIHRoZSByZWxhdGlvbnNoaXBzIGVzdGFibGlzaGVkIGR1cmluZyBtZXRob2QgY29udGVudCBhbmQgcHJvY2VzcwotICBhdXRob3JpbmcgdG8gZ2VuZXJhdGUgaHlwZXJsaW5rcyBiZXR3ZWVuIGVsZW1lbnRzIGFzIHdlbGwgYXMgcHJvdmlkZXMgdHJlZQotICBicm93c2VycyBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3IGFuZCB1c2VyLWRlZmluZWQgY2F0ZWdvcml6YXRpb25zIG9mCi0gIHRoZSBjb250ZW50LiBUaGUgZmlndXJlIGJlbG93IHNob3dzIGFuIGV4YW1wbGUgb2YgdGhlIHB1Ymxpc2hlZCAnQ2xhc3NpYyBSVVAnCi0gIG1ldGhvZCBjb25maWd1cmF0aW9uLjwvcD4KLTxwPjxpbWcgc3JjPSJwdWIuZ2lmIj48L3A+Ci08cD5Gb3IgcHVibGlzaGluZyBzaW1wbHkgY3JlYXRlIGFuZCBzZWxlY3QgYSBjb25maWd1cmF0aW9uLiBUaGUgcHVibGljYXRpb24gd2l6YXJkCi0gIHdpbGwgZG8gdGhlIHJlc3QgZm9yIHlvdSBhbmQgb25seSBwdWJsaXNoIGNvbnRlbnQgdGhhdCBpcyBwYXJ0IG9mIHRoZSBtZXRob2QKLSAgY29uZmlndXJhdGlvbi4gSXQgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgYWRvcHQgY29udGVudCB0byB0aGUgY29uZmlndXJhdGlvbgotICBzdWNoIGFzIHJlbW92aW5nCi0gIHJlZmVyZW5jZXMgb2YgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgdG8gZWxlbWVudHMgb3V0c2lkZSBvZiB0aGUgY29uZmlndXJhdGlvbgotICBvciByZW1vdmluZyBhY3Rpdml0aWVzIGZyb20geW91ciBwcm9jZXNzZXMgdGhhdCBvbmx5IGNvbnRhaW4gd29yayBkZWZpbmVkIG91dHNpZGUKLSAgb2YgdGhlIGNvbmZpZ3VyYXRpb24gc2V0LiBIZW5jZSwgcHVibGlzaGluZyB3aWxsIG9ubHkgaW5jbHVkZSB0aGUgY29udGVudCB0aGF0Ci0gIHlvdSByZWFsbHkgbmVlZC4gWW91IGNhbiBhbHdheXMgcHJldmlldyBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIHVzaW5nIEVQRiBDb21wb3NlcidzCi1icm93c2luZyBwZXJzcGVjdGl2ZS48L3A+Ci08cD4mbmJzcDs8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3VtYV9odW1wLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvdW1hX2h1bXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTk4ZjI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvdW1hX2h1bXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2hpdGVwYXBlci5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2hpdGVwYXBlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWNlMzNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3doaXRlcGFwZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IldoaXRlcGFwZXIiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0id2hpdGVwYXBlciIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5XaGl0ZXBhcGVyPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ3aGl0ZXBhcGVyIj48YSBuYW1lPSJ3aGl0ZXBhcGVyIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V2hpdGVwYXBlcjwvaDE+Ci08ZGl2PjxwPkEgV2hpdGVwYXBlciBpcyBhIHNwZWNpYWwgdHlwZSBvZiBjb25jZXB0IGd1aWRhbmNlIHRoYXQgaXMgZXh0ZXJuYWxseSByZXZpZXdlZAotb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbiBpc29sYXRpb24gb2Ygb3RoZXIgY29udGVudAotZWxlbWVudHMgYW5kIGd1aWRhbmNlLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dvcmtwcm9kdWN0Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93b3JrcHJvZHVjdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGEyYzEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dvcmtwcm9kdWN0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXb3JrIFByb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sI2NyZWF0ZWF3b3JrcHJvZHVjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJ3b3JrcHJvZHVjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Xb3JrIFByb2R1Y3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Indvcmtwcm9kdWN0Ij48YSBuYW1lPSJ3b3JrcHJvZHVjdCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldvcmsgUHJvZHVjdDwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPldvcmsgcHJvZHVjdCBpcyBhIGdlbmVyYWwgdGVybSBmb3IgdGFzayBpbnB1dHMgYW5kIG91dHB1dHMsCi1kZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwKLW9yIG1vZGlmaWVkIGJ5IGEgdGFzay4gVGhlIHRocmVlIHR5cGVzIG9mIHdvcmsgcHJvZHVjdCBhcmU6PHVsPjxsaT48YSBocmVmPSJhcnRpZmFjdC5odG1sI2FydGlmYWN0Ij5BcnRpZmFjdDwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im91dGNvbWUuaHRtbCNvdXRjb21lIj5PdXRjb21lPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iZGVsaXZlcmFibGUuaHRtbCNkZWxpdmVyYWJsZSI+RGVsaXZlcmFibGU8L2E+PC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sI2NyZWF0ZWF3b3JrcHJvZHVjdCI+Q3JlYXRlIGEgV29yayBQcm9kdWN0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dvcmtwcm9kdWN0ZGVzY3JpcHRvcnMuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dvcmtwcm9kdWN0ZGVzY3JpcHRvcnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRmY2E5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93b3JrcHJvZHVjdGRlc2NyaXB0b3JzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Indvcmtwcm9kdWN0ZGVzY3JpcHRvcnMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+V29yayBQcm9kdWN0IERlc2NyaXB0b3JzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ3b3JrcHJvZHVjdGRlc2NyaXB0b3JzIj48YSBuYW1lPSJ3b3JrcHJvZHVjdGRlc2NyaXB0b3JzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V29yayBQcm9kdWN0IERlc2NyaXB0b3JzPC9oMT4KLTxkaXY+PHA+QSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBpcyBhIHdvcmsgcHJvZHVjdCBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMKLWFjdGl2aXR5LiBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YKLXdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyBvZiB0YXNrIGRlc2NyaXB0b3JzIGFuZCByb2xlIGRlc2NyaXB0b3JzLiBPbmUgd29yawotcHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMsIGVhY2ggd2l0aGluIHRoZQotY29udGV4dCBvZiBhbiBhY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sIj5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd29ya3Byb2R1Y3RraW5kLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93b3JrcHJvZHVjdGtpbmQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdkZGIyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93b3JrcHJvZHVjdGtpbmQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IldvcmsgUHJvZHVjdCBLaW5kIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Indvcmtwcm9kdWN0a2luZCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Xb3JrIFByb2R1Y3QgS2luZDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0id29ya3Byb2R1Y3RraW5kIj48YSBuYW1lPSJ3b3JrcHJvZHVjdGtpbmQiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Xb3JrIFByb2R1Y3QgS2luZDwvaDE+Ci08ZGl2PjxwPldvcmsgUHJvZHVjdCBLaW5kIGlzIGFub3RoZXIgY2F0ZWdvcnkgZm9yIGdyb3VwaW5nIDxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiPldvcmsgUHJvZHVjdHM8L2E+LiBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IHdvcmsgcHJvZHVjdAota2luZHMuIEFzIGFuIGV4YW1wbGUsIHlvdSBtaWdodCB3YW50IHRvIGhhdmUgYSBzZXJpZXMgb2Ygd29yayBwcm9kdWN0IGtpbmRzCi10aGF0IGNvcnJlc3BvbmQgdG8gdGhlIG92ZXJhbGwgaW50ZW50IG9mIHdvcmsgcHJvZHVjdHMsIHN1Y2ggYXMgc3BlY2lmaWNhdGlvbiwKLXBsYW4sIG9yIG1vZGVsLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiPk1ldGhvZCBDb250ZW50IENhdGVnb3JpZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL21haW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL21haW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTMzYTI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9tYWluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iRVBGIENvbXBvc2VyIiA+Ci08dG9waWMgbGFiZWw9Ik92ZXJ2aWV3Ij4KLQk8YW5jaG9yIGlkPSJvdmVydmlld19pZCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iR2V0dGluZyBzdGFydGVkIj4KLQk8YW5jaG9yIGlkPSJnZXR0aW5nX3N0YXJ0ZWRfaWQiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIHJldXNhYmxlIG1ldGhvZCBjb250ZW50Ij4KLQk8YW5jaG9yIGlkPSJjcmVhdGluZ19tZXRob2RfY29udGVudF9pZCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iQ2F0ZWdvcml6aW5nIHJldXNhYmxlIG1ldGhvZCBjb250ZW50Ij4KLQk8YW5jaG9yIGlkPSJjYXRlZ29yaXppbmdfbWV0aG9kX2NvbnRlbnRfaWQiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIHByb2Nlc3NlcyI+Ci0JPGFuY2hvciBpZD0iY3JlYXRpbmdfcHJvY2Vzc2VzX2lkIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJQdWJsaXNoaW5nIGFuZCBleHBvcnRpbmciPgotCTxhbmNob3IgaWQ9InB1Ymxpc2hpbmdfZXhwb3J0aW5nX2lkIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJVc2luZyB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtIiA+Ci0JPGFuY2hvciBpZD0idmVyc2lvbl9jb250cm9sX2lkIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJBY2Nlc3NpYmlsaXR5IiA+Ci0JPGFuY2hvciBpZD0iYWNjZXNzaWJpbGl0eV9pZCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iR2xvc3NhcnkiPgotCTxhbmNob3IgaWQ9Imdsb3NzYXJ5X2lkIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJUdXRvcmlhbHMiID4KLQk8YW5jaG9yIGlkPSJ0dXRvcmlhbHNfaWQiLz4KLTwvdG9waWM+Ci08L3RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvb3ZlcnZpZXcueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL292ZXJ2aWV3LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE5NGU4NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvb3ZlcnZpZXcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPHRvYyBsYWJlbD0iRVBGIENvbXBvc2VyIG92ZXJ2aWV3IiBsaW5rX3RvPSJtYWluLnhtbCNvdmVydmlld19pZCI+Ci0gICA8dG9waWMgbGFiZWw9IkVQRiBDb21wb3NlciBvdmVydmlldyIgaHJlZj0iaHRtbC9vdmVydmlldy9hX3Byb2R1Y3Rfb3ZlcnZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29udGVudCBhdXRob3Jpbmcgb3ZlcnZpZXciIGhyZWY9Imh0bWwvb3ZlcnZpZXcvYV9tZXRob2RfY29udGVudF9hdXRob3Jpbmdfb3ZlcnZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJQcm9jZXNzIGF1dGhvcmluZyBvdmVydmlldyIgaHJlZj0iaHRtbC9vdmVydmlldy9hX3Byb2Nlc3NfYXV0aG9yaW5nX292ZXJ2aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbmZpZ3VyYXRpb25zIG92ZXJ2aWV3IiBocmVmPSJodG1sL292ZXJ2aWV3L2FfbWV0aG9kX2NvbmZpZ3VyYXRpb25zX292ZXJ2aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iS2V5IGNvbmNlcHRzIj4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGxpYnJhcnkiIGhyZWY9Imh0bWwvdG9waWNzL2NfbWV0aG9kX2xpYnJhcnkuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC90b3BpY3MvY19tZXRob2RfY29udGVudC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb250ZW50IHBhY2thZ2UiIGhyZWY9Imh0bWwvdG9waWNzL2NfbWV0aG9kX2NvbnRlbnRfcGFja2FnZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb25maWd1cmF0aW9ucyIgaHJlZj0iaHRtbC90b3BpY3MvY19tZXRob2RfY29uZmlndXJhdGlvbnMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgcGx1Zy1pbiIgaHJlZj0iaHRtbC90b3BpY3MvY19tZXRob2RfcGx1Z2luLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iR3VpZGFuY2UiIGhyZWY9Imh0bWwvdG9waWNzL2NfZ3VpZGFuY2UuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJQcm9jZXNzIiBocmVmPSJodG1sL3RvcGljcy9jX3Byb2Nlc3MuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29udGVudCB2YXJpYWJpbGl0eSIgaHJlZj0iaHRtbC90b3BpY3MvY192YXJpYWJpbGl0eS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlVzZXIgcm9sZXMgYW5kIHJvbGUtc3BlY2lmaWMgdGFza3MiIGhyZWY9Imh0bWwvdG9waWNzL2NfdXNlcl9yb2xlcy5odG1sIi8+Ci08L3RvcGljPgotPC90b2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDJhNWI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgRG9jdW1lbnRhdGlvbgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLQotIyBDaGVhdCBTaGVldHMKLW1ldGhvZEF1dGhvcmluZ0NoZWF0U2hlZXRzTmFtZT1NZXRob2QgQXV0aG9yaW5nIENoZWF0IFNoZWV0cwotQ2hlYXRzaGVldEdldHN0YXJ0ZWRDYXRlZ29yeVRleHQ9R2V0dGluZyBTdGFydGVkCi1DaGVhdHNoZWV0UmV1c2FibGVDb250ZW50Q2F0ZWdvcnlUZXh0PUNyZWF0ZSBSZXVzYWJsZSBNZXRob2QgQ29udGVudAotQ2hlYXRzaGVldFdyaXRlQ29udGVudENhdGVnb3J5VGV4dD1Xcml0ZSBNZXRob2QgQ29udGVudAotQ2hlYXRzaGVldFByb2Nlc3Nlc0NhdGVnb3J5VGV4dD1Xb3JrIHdpdGggUHJvY2Vzc2VzCi1DaGVhdHNoZWV0TmF2aWdhdGVNZXRob2RDb250ZW50PU5hdmlnYXRlIE1ldGhvZCBDb250ZW50Ci1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbj1DcmVhdGUgeW91ciBvd24gTWV0aG9kIENvbmZpZ3VyYXRpb24KLUNoZWF0c2hlZXRDcmVhdGVNZXRob2RQbHVnaW49Q3JlYXRlIHlvdXIgb3duIE1ldGhvZCBQbHVnLWluCi1DaGVhdHNoZWV0QWRkTWV0aG9kQ29udGVudD1BZGQgbmV3IE1ldGhvZCBDb250ZW50IHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzLCBvciBHdWlkYW5jZQotQ2hlYXRzaGVldFRhaWxvck1ldGhvZEVsZW1lbnRzPVRhaWxvciBleGlzdGluZyBNZXRob2QgRWxlbWVudHMgKFJvbGVzLCBUYXNrcywgV29yayBQcm9kdWN0cyBvciBHdWlkYW5jZSkgVXNpbmcgQ29udHJpYnV0aW9uCi1DaGVhdHNoZWV0UmVwbGFjZU1laHRvZEVsZW1lbnRzPVJlcGxhY2UgZXhpc3RpbmcgTWV0aG9kIEVsZW1lbnRzIChSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMgb3IgR3VpZGFuY2UpCi1DaGVhdHNoZWV0QWRkTWV0aG9kUmVmT3JIeXBlcmxpbms9QWRkIGEgTWV0aG9kIFJlZmVyZW5jZSBvciBIeXBlcmxpbmsgKFVSTCkKLUNoZWF0c2hlZXRBcHBseUNhcGFiaWxpdHlQYXR0ZXJuPUFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuCi1DaGVhdHNoZWV0Q3JlYXRlUHJvY2Vzcz1DcmVhdGUgYSBQcm9jZXNzIChDYXBhYmlsaXR5IFBhdHRlcm4gb3IgRGVsaXZlcnkgUHJvY2VzcykKLQotCi0KLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNDI2YmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgICAgCTx0b2MKLSAgICAgICAgICAgIGZpbGU9Im1haW4ueG1sIgotICAgICAgICAgICAgcHJpbWFyeT0idHJ1ZSI+Ci0gICAgICAJPC90b2M+Ci0gICAgICAJPHRvYwotCQlmaWxlPSJnZXR0aW5nX3N0YXJ0ZWQueG1sIj4KLSAgICAgIAk8L3RvYz4KLSAgICAgIAk8dG9jCi0JCWZpbGU9Im92ZXJ2aWV3LnhtbCI+Ci0gICAgICAJPC90b2M+Ci0KLSAgICAgIAk8dG9jCi0JCWZpbGU9ImNyZWF0aW5nX21ldGhvZF9jb250ZW50LnhtbCI+Ci0gICAgICAJPC90b2M+Ci0KLSAgICAgIAk8dG9jCi0JCWZpbGU9ImNhdGVnb3JpemluZ19tZXRob2RfY29udGVudC54bWwiPgotICAgICAgCTwvdG9jPgotCi0gICAgICAJPHRvYwotCQlmaWxlPSJjcmVhdGluZ19wcm9jZXNzZXMueG1sIj4KLSAgICAgIAk8L3RvYz4KLQotICAgICAgCTx0b2MKLQkJZmlsZT0icHVibGlzaGluZ19leHBvcnRpbmcueG1sIj4KLSAgICAgIAk8L3RvYz4KLQotCTx0b2MKLQkJZmlsZT0idmVyc2lvbl9jb250cm9sLnhtbCI+Ci0JPC90b2M+Ci0JPHRvYwotCQlmaWxlPSJhY2Nlc3NpYmlsaXR5LnhtbCI+Ci0JPC90b2M+Ci0JPHRvYwotCQlmaWxlPSJnbG9zc2FyeS54bWwiPgotCTwvdG9jPgotCTx0b2MKLQkJZmlsZT0idHV0b3JpYWxzLnhtbCI+Ci0JPC90b2M+Ci0gICA8L2V4dGVuc2lvbj4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gRjEgY29udGV4dCBmaWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI+IAotCQk8Y29udGV4dHMgZmlsZT0iJG5sJC9jb250ZXh0c19hdXRob3JpbmdfdWkueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiLz4gCi0JPC9leHRlbnNpb24+Ci0KLSAJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI+IAotICAgICAgPGNvbnRleHRzIGZpbGU9IiRubCQvY29udGV4dHNfU2VhcmNoLnhtbCIgcGx1Z2luPSJvcmcuZWNsaXBzZS5zZWFyY2giLz4gCi0gICAJPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiAKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5jaGVhdFNoZWV0Q29udGVudCIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMiCi0gICAgICAgICBuYW1lPSIlbWV0aG9kQXV0aG9yaW5nQ2hlYXRTaGVldHNOYW1lIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5nZXRzdGFydGVkIiAKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0R2V0c3RhcnRlZENhdGVnb3J5VGV4dCIvPgotICAgICAgPGNoZWF0c2hlZXQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMubmF2aWdhdGVtZXRob2Rjb250ZW50IgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5nZXRzdGFydGVkIgotICAgICAgICAgICAgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvbmF2aWdhdGVtZXRob2Rjb250ZW50LnhtbCIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0TmF2aWdhdGVNZXRob2RDb250ZW50Ii8+Ci0gICAgICA8Y2hlYXRzaGVldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5jcmVhdGVtZXRob2Rjb25maWd1cmF0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5nZXRzdGFydGVkIgotICAgICAgICAgICAgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvY3JlYXRlbWV0aG9kY29uZmlndXJhdGlvbi54bWwiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldENyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDxjaGVhdHNoZWV0Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLmNyZWF0ZW1ldGhvZHBsdWdpbiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMuZ2V0c3RhcnRlZCIKLSAgICAgICAgICAgIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL2NyZWF0ZW1ldGhvZHBsdWdpbi54bWwiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldENyZWF0ZU1ldGhvZFBsdWdpbiIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5jaGVhdFNoZWV0Q29udGVudCIgCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzIiAKLSAgICAgICAgIG5hbWU9IiVtZXRob2RBdXRob3JpbmdDaGVhdFNoZWV0c05hbWUiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLnJlc3VhYmxlLmNvbnRlbnQiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldFJldXNhYmxlQ29udGVudENhdGVnb3J5VGV4dCIvPgotICAgICAgPGNoZWF0c2hlZXQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMuYWRkbmV3bWV0aG9kY29udGVudCIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMucmVzdWFibGUuY29udGVudCIKLSAgICAgICAgICAgIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL2FkZG5ld21ldGhvZGNvbnRlbnQueG1sIgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRBZGRNZXRob2RDb250ZW50Ii8+Ci0gICAgICA8Y2hlYXRzaGVldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy50YWlsb3JleGlzdGluZ21ldGhvZGVsZW1lbnRzIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5yZXN1YWJsZS5jb250ZW50IgotICAgICAgICAgICAgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvdGFpbG9yZXhpc3RpbmdtZXRob2RlbGVtZW50cy54bWwiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldFRhaWxvck1ldGhvZEVsZW1lbnRzIi8+Ci0gICAgICA8Y2hlYXRzaGVldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5yZXBsYWNlZXhpc3RpbmdtZXRob2RlbGVtZW50cyIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMucmVzdWFibGUuY29udGVudCIKLSAgICAgICAgICAgIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL3JlcGxhY2VleGlzdGluZ21ldGhvZGVsZW1lbnRzLnhtbCIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0UmVwbGFjZU1laHRvZEVsZW1lbnRzIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLmNoZWF0U2hlZXRDb250ZW50IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cyIKLSAgICAgICAgIG5hbWU9IiVtZXRob2RBdXRob3JpbmdDaGVhdFNoZWV0c05hbWUiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLndyaXRlLmNvbnRlbnQiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldFdyaXRlQ29udGVudENhdGVnb3J5VGV4dCIvPgotICAgICAgPGNoZWF0c2hlZXQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMuYWRkbWV0aG9kcmVmX29yX2h5cGVybGluayIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMud3JpdGUuY29udGVudCIKLSAgICAgICAgICAgIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL2FkZG1ldGhvZHJlZl9vcl9oeXBlcmxpbmsueG1sIgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRBZGRNZXRob2RSZWZPckh5cGVybGluayIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5jaGVhdFNoZWV0Q29udGVudCIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMiCi0gICAgICAgICBuYW1lPSIlbWV0aG9kQXV0aG9yaW5nQ2hlYXRTaGVldHNOYW1lIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5wcm9jZXNzZXMiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldFByb2Nlc3Nlc0NhdGVnb3J5VGV4dCIvPgotICAgICAgPGNoZWF0c2hlZXQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMuYXBwbHljYXBhYmlsaXR5cGF0dGVybiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMucHJvY2Vzc2VzIgotICAgICAgICAgICAgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvYXBwbHljYXBhYmlsaXR5cGF0dGVybi54bWwiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldEFwcGx5Q2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICAgIDxjaGVhdHNoZWV0Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLmNyZWF0ZWFwcm9jZXNzIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5wcm9jZXNzZXMiCi0gICAgICAgICAgICBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9jcmVhdGVhcHJvY2Vzcy54bWwiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldENyZWF0ZVByb2Nlc3MiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcHVibGlzaGFuZGV4cG9ydC54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcHVibGlzaGFuZGV4cG9ydC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMmVjMzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3B1Ymxpc2hhbmRleHBvcnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJQdWJsaXNoaW5nIGFuZCBleHBvcnRpbmciIGxpbmtfdG89Im1haW4ueG1sI3B1Ymxpc2hhbmRleHBvcnRfaWQiPgotICAgPHRvcGljIGxhYmVsPSJQdWJsaXNoaW5nIG92ZXJ2aWV3IiBocmVmPSJodG1sL2hlbHAvcHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUHVibGlzaGluZyBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHRvIGEgbWV0aG9kIHdlYiIgaHJlZj0iaHRtbC9oZWxwL3B1Ymxpc2hpbmdhbWV0aG9kY29uZmlndXJhdGlvbnRvYW1ldGhvZHdlYi5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wdWJsaXNoaW5nX2V4cG9ydGluZy54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcHVibGlzaGluZ19leHBvcnRpbmcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDllOTIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wdWJsaXNoaW5nX2V4cG9ydGluZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHRvYyBsYWJlbD0iUHVibGlzaGluZyBhbmQgZXhwb3J0aW5nIG1ldGhvZCBjb250ZW50IiBsaW5rX3RvPSJtYWluLnhtbCNwdWJsaXNoaW5nX2V4cG9ydGluZ19pZCI+ICAKLQk8dG9waWMgbGFiZWw9IlB1Ymxpc2hpbmcgYSBjb25maWd1cmF0aW9uIGFzIGEgd2ViIHNpdGUiIGhyZWY9Imh0bWwvdG9waWNzL3RfcHVibGlzaGluZ19odG1sLmh0bWwiLz4KLQk8dG9waWMgbGFiZWw9IkV4cG9ydGluZyB0byBNaWNyb3NvZnQgUHJvamVjdCIgaHJlZj0iaHRtbC90b3BpY3MvdF9tc3Byb2plY3RfZXhwb3J0Lmh0bWwiLz4KLQk8dG9waWMgbGFiZWw9IkV4cG9ydGluZyBhIGxpYnJhcnkgY29uZmlndXJhdGlvbiIgaHJlZj0iaHRtbC90b3BpY3MvdF9jb25maWd1cmF0aW9uX2V4cG9ydC5odG1sIi8+CQotCTx0b3BpYyBsYWJlbD0iSW1wb3J0aW5nIGEgbGlicmFyeSBjb25maWd1cmF0aW9uIiBocmVmPSJodG1sL3RvcGljcy90X2NvbmZpZ3VyYXRpb25faW1wb3J0Lmh0bWwiLz4KLQk8dG9waWMgbGFiZWw9IkV4cG9ydGluZyBhIHBsdWctaW4iIGhyZWY9Imh0bWwvdG9waWNzL3RfcGx1Z2luX2V4cG9ydC5odG1sIi8+CQotCTx0b3BpYyBsYWJlbD0iSW1wb3J0aW5nIGEgcGx1Zy1pbiIgaHJlZj0iaHRtbC90b3BpY3MvdF9wbHVnaW5faW1wb3J0Lmh0bWwiLz4KLQk8dG9waWMgbGFiZWw9IkV4cG9ydGluZyBYTUwiIGhyZWY9Imh0bWwvdG9waWNzL3RfeG1sX2V4cG9ydC5odG1sIi8+Ci0JPHRvcGljIGxhYmVsPSJJbXBvcnRpbmcgWE1MIiBocmVmPSJodG1sL3RvcGljcy90X3htbF9pbXBvcnQuaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcmVmZXJlbmNlLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9yZWZlcmVuY2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2E2YmJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9yZWZlcmVuY2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJSZWZlcmVuY2UiIGxpbmtfdG89Im1haW4ueG1sI3JlZmVyZW5jZV9pZCI+Ci0gICA8dG9waWMgbGFiZWw9IlN1cG9ydCBmb3IgY29kZSBtYW5hZ2VtZW50IHN5c3RlbXMiIGhyZWY9Imh0bWwvaGVscC9jbV9vdmVydmlldy5odG1sIj4KLSAgIDx0b3BpYyBsYWJlbD0iU3VwcG9ydCBmb3IgQ1ZTIiBocmVmPSJodG1sL2hlbHAvY21fY3ZzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iU3Vwb3J0IGZvciBSYXRpb25hbCBDbGVhckNhc2UiIGhyZWY9Imh0bWwvaGVscC9jbV9yYXRpb25hbGNjLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iU3VwcG9ydCBmb3IgUmF0aW9uYWwgQ0NSQyIgaHJlZj0iaHRtbC9oZWxwL2NtX2NjcmMuaHRtbCIvPgotPC90b3BpYz4KLQotICAgPHRvcGljIGxhYmVsPSJBY2Nlc3NpYmlsaXR5IiBocmVmPSJodG1sL2hlbHAvYWNfbWFpbi5odG1sIj4KLSAgIDx0b3BpYyBsYWJlbD0iS2V5Ym9hcmQgbmF2aWdhdGlvbiIgaHJlZj0iaHRtbC9oZWxwL2FjX25hdmlnYXRpb24uaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJGb250cyBhbmQgY29sb3JzIiBocmVmPSJodG1sL2hlbHAvYWNfZm9udHNhbmRjb2xvcnMuaHRtbCIvPgotPC90b3BpYz4KLSAgIAotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvc3JjL29yZy9lY2xpcHNlL2VwZi9oZWxwL2RvYy9Eb2NQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9zcmMvb3JnL2VjbGlwc2UvZXBmL2hlbHAvZG9jL0RvY1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2RhOTNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9zcmMvb3JnL2VjbGlwc2UvZXBmL2hlbHAvZG9jL0RvY1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2NQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgRG9jUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgRG9jUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRG9jUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0vLwkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gRG9jUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotLy8JCXRyeSB7Ci0vLwkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotLy8JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0vLwkJCXJldHVybiBrZXk7Ci0vLwkJfQotLy8JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotLy8JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotLy8JCXRyeSB7Ci0vLwkJCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotLy8JCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5Eb2NQbHVnaW5SZXNvdXJjZXMiKTsKLS8vCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotLy8JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0vLwkJfQotLy8JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLS8vCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuCi0JICogcGx1Zy1pbiByZWxhdGl2ZSBwYXRoLgotCSAqCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0vLwlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLS8vCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKCJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MiLCBwYXRoKTsKLS8vCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9zcmMvb3JnL2VjbGlwc2UvZXBmL2hlbHAvZG9jL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9zcmMvb3JnL2VjbGlwc2UvZXBmL2hlbHAvZG9jL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJkYjg2ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvc3JjL29yZy9lY2xpcHNlL2VwZi9oZWxwL2RvYy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgYWN0aXZhdG9yIGZvciBtYW5hZ2luZyB0aGUgRG9jdW1lbnRhdGlvbiBwbHVnLWluJ3MgbGlmZSBjeWNsZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdGFza3MueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3Rhc2tzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ0NjE2NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdGFza3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJUYXNrcyIgbGlua190bz0ibWFpbi54bWwjdGFza3NfaWQiPiAgCi0KLSAgPCEtLSBDcmVhdGluZyByZXVzYWJsZSBtZXRob2QgY29udGVudCAtLT4KLSAgPHRvcGljIGxhYmVsPSJDcmVhdGluZyByZXVzYWJsZSBtZXRob2QgY29udGVudCI+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiIGhyZWY9Imh0bWwvaGVscC9jb250ZW50X2NhdGVnb3JpZXMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBtZXRob2QgdmlldyB3aXRoIGN1c3RvbSBjYXRlZ29yaWVzIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2N1c3RvbV9jYXRlZ29yaWVzLmh0bWwiLz4gCi0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9tZXRob2RfY29udGVudC5odG1sIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgcm9sZSIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9yb2xlLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgdGFzayIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV90YXNrLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgd29yayBwcm9kdWN0IiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX3dvcmtwcm9kdWN0Lmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGd1aWRhbmNlIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2d1aWRhbmNlLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIENvbnRlbnQgVmFyaWFiaWxpdHkiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eS5odG1sIj4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iQ29udHJpYnV0ZXMiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eV9jb250cmlidXRlcy5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkV4dGVuZHMiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eV9leHRlbmRzLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iUmVwbGFjZXMiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eV9yZXBsYWNlLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iQXNzb2NpYXRpb25zIGltcGFjdGVkIGJ5IHZhcmlhYmlsaXR5IiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfYXNzb2NpYXRpb25zLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iQnJvd3NpbmcgdmFyaWFiaWxpdHkgYXNzb2NpYXRpb25zIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfYnJvd3NpbmcuaHRtbCIvPgotICAgICAgPC90b3BpYz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IkJyb3dzZSBhbmQgcHJldmlldyBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL2Jyb3dzZV9jb250ZW50Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgaW5kZXggZW50cmllcyIgaHJlZj0iaHRtbC9oZWxwL2luZGV4aW5nLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgZ2xvc3NhcnkgZW50cmllcyIgaHJlZj0iaHRtbC9oZWxwL2dsb3NzYXJ5X2VudHJpZXMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDaGFuZ2luZyBjb3B5cmlnaHQgbm90aWNlcyIgaHJlZj0iaHRtbC9oZWxwL2NoYW5naW5nX2NvcHlyaWdodC5odG1sIi8+Ci08L3RvcGljPgotCi0gIDwhLS0gQ2F0ZWdvcml6aW5nIG1ldGhvZCBjb250ZW50IC0tPgotICA8dG9waWMgbGFiZWw9IkNhdGVnb3JpemluZyBtZXRob2QgY29udGVudCI+Ci0gIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgY2F0ZWdvcmllcyIgaHJlZj0iaHRtbC9oZWxwL2NvbnRlbnRfY2F0ZWdvcmllcy5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgbWV0aG9kIHZpZXcgd2l0aCBjdXN0b20gY2F0ZWdvcmllcyIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9jdXN0b21fY2F0ZWdvcmllcy5odG1sIi8+PC90b3BpYz4KLQotICA8IS0tIENyZWF0aW5nIHByb2Nlc3NlcyAtLT4KLSAgPHRvcGljIGxhYmVsPSJDcmVhdGluZyBwcm9jZXNzZXMiPgotICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHJldXNhYmxlIGNhcGFiaWxpdHkgcGF0dGVybiIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9jYXBhYmlsaXR5X3BhdHRlcm4uaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIGRlbGl2ZXJ5IHByb2Nlc3MiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfZGVsaXZlcnlfcHJvY2Vzcy5odG1sIj4KLSAgPHRvcGljIGxhYmVsPSJEZXZlbG9wIGEgd29yayBicmVha2Rvd24gc3RydWN0dXJlIiBocmVmPSJodG1sL2hlbHAvZGV2ZWxvcF93YnMuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkRldmVsb3AgYSB0ZWFtIGFsbG9jYXRpb24gc3RydWN0dXJlIiBocmVmPSJodG1sL2hlbHAvZGV2ZWxvcF90ZWFtX3N0cnVjdHVyZS5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iRGV2ZWxvcCBhIHdvcmsgcHJvZHVjdCB1c2FnZSBzdHJ1Y3R1cmUiIGhyZWY9Imh0bWwvaGVscC9kZXZlbG9wX3dvcmtwcm9kdWN0X3N0cnVjdHVyZS5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iQXBwbHkgYSBjYXBhYmlsaXR5IHBhdHRlcm4iIGhyZWY9Imh0bWwvaGVscC9hcHBseV9jYXBhYmlsaXR5cGF0dGVybi5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iUHJvY2VzcyBlbGVtZW50IHByb3BlcnRpZXMgVmlldyIgaHJlZj0iaHRtbC9oZWxwL3Byb3BlcnRpZXNfdmlldy5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iVXNpbmcgZGVlcCBjb3B5IiBocmVmPSJodG1sL2hlbHAvdXNpbmdfZGVlcF9jb3B5Lmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJVc2luZyBhY3Rpdml0eSB2YXJpYWJpbGl0eSIgaHJlZj0iaHRtbC9oZWxwL3VzaW5nX2FjdGl2aXR5X3ZhcmlhYmlsaXR5Lmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggcHJvY2VzcyBkaWFncmFtcyIgaHJlZj0iaHRtbC9oZWxwL3Byb2Nlc3NfZGlhZ3JhbXMuaHRtbCI+Ci0gIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIGFjdGl2aXR5IGRpYWdyYW1zIiBocmVmPSJodG1sL2hlbHAvYWN0aXZpdHlfZGlhZ3JhbXMuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbXMiIGhyZWY9Imh0bWwvaGVscC9hY3Rpdml0eV9kZXRhaWxfZGlhZ3JhbXMuaHRtbCIvPgotCi0gIDwvdG9waWM+Ci0KLSAgPCEtLSBQdWJsaXNoaW5nIE1ldGhvZCBDb250ZW50IC0tPgotICA8dG9waWMgbGFiZWw9IlB1Ymxpc2hpbmcgYW5kIGV4cG9ydGluZyBtZXRob2QgY29udGVudCI+Ci0gICA8dG9waWMgbGFiZWw9IlB1Ymxpc2hpbmcgYSBtZXRob2QgY29uZmlndXJhdGlvbiB0byBhIG1ldGhvZCB3ZWIiIGhyZWY9Imh0bWwvaGVscC9wdWJsaXNoaW5nLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRXhwb3J0aW5nIHRvIE1pY3Jvc29mdCBQcm9qZWN0IiBocmVmPSJodG1sL2hlbHAvZXhwb3J0X3RvX21zcHJvamVjdC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlhNTCBJbXBvcnQvRXhwb3J0IiBocmVmPSJodG1sL2hlbHAvZXhwb3J0X3RvX3htbC5odG1sIi8+Ci0gPC90b3BpYz4KLQotICA8IS0tIFdvcmtpbmcgd2l0aCBUZXh0dWFsIERlc2NyaXB0aW9ucyAtLT4KLSA8dG9waWMgbGFiZWw9IlJpY2ggdGV4dCBlZGl0b3IiIGhyZWY9Imh0bWwvaGVscC9yaWNodGV4dGVkaXRvci5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkFkZCBhIHJlZmVyZW5jZSBvciBoeXBlcmxpbmsiIGhyZWY9Imh0bWwvaGVscC9hZGRfaHlwZXJsaW5rLmh0bWwiLz4KLSAgPC90b3BpYz4KLSAgPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvYy54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1OTZjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIiB0b3BpYz0iaHRtbC90b2MuaHRtbCI+Ci0gICA8dG9waWMgbGFiZWw9IkdldHRpbmcgU3RhcnRlZCI+Ci0gICAgICA8YW5jaG9yIGlkPSJnZXR0aW5nc3RhcnRlZCIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iQ29uY2VwdHMiPgotICAgICAgPGFuY2hvciBpZD0iY29uY2VwdHMiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IlRhc2tzIj4KLSAgICAgIDxhbmNob3IgaWQ9InRhc2tzIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJSZWZlcmVuY2UiPgotICAgICAgPGFuY2hvciBpZD0icmVmZXJlbmNlIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJTYW1wbGVzIj4KLSAgICAgIDxhbmNob3IgaWQ9InNhbXBsZXMiLz4KLSAgIDwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2Njb25jZXB0cy54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jY29uY2VwdHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjA5ZTExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2Njb25jZXB0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iQ29uY2VwdHMiIGxpbmtfdG89InRvYy54bWwjY29uY2VwdHMiPiAKLQk8dG9waWMgbGFiZWw9Ik1haW4gVG9waWMiICBocmVmPSJodG1sL2NvbmNlcHRzL21haW50b3BpYy5odG1sIj4gCi0JCTx0b3BpYyBsYWJlbD0iU3ViIFRvcGljIiBocmVmPSJodG1sL2NvbmNlcHRzL3N1YnRvcGljLmh0bWwiIC8+IAotCTwvdG9waWM+Ci0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIDIiPgotCQk8dG9waWMgbGFiZWw9IlN1YiBUb3BpYyAyIiBocmVmPSJodG1sL2NvbmNlcHRzL3N1YnRvcGljMi5odG1sIiAvPiAKLQk8L3RvcGljPiAKLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY2dldHRpbmdzdGFydGVkLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2NnZXR0aW5nc3RhcnRlZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYWIzMTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY2dldHRpbmdzdGFydGVkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJHZXR0aW5nIFN0YXJ0ZWQiIGxpbmtfdG89InRvYy54bWwjZ2V0dGluZ3N0YXJ0ZWQiPiAKLQk8dG9waWMgbGFiZWw9Ik1haW4gVG9waWMiICBocmVmPSJodG1sL2dldHRpbmdzdGFydGVkL21haW50b3BpYy5odG1sIj4gCi0JCTx0b3BpYyBsYWJlbD0iU3ViIFRvcGljIiBocmVmPSJodG1sL2dldHRpbmdzdGFydGVkL3N1YnRvcGljLmh0bWwiIC8+IAotCTwvdG9waWM+Ci0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIDIiPgotCQk8dG9waWMgbGFiZWw9IlN1YiBUb3BpYyAyIiBocmVmPSJodG1sL2dldHRpbmdzdGFydGVkL3N1YnRvcGljMi5odG1sIiAvPgotCTwvdG9waWM+IAotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jcmVmZXJlbmNlLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2NyZWZlcmVuY2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTVjNWEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2NyZWZlcmVuY2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IlJlZmVyZW5jZSIgbGlua190bz0idG9jLnhtbCNyZWZlcmVuY2UiPiAKLQk8dG9waWMgbGFiZWw9Ik1haW4gVG9waWMiICBocmVmPSJodG1sL3JlZmVyZW5jZS9tYWludG9waWMuaHRtbCI+IAotCQk8dG9waWMgbGFiZWw9IlN1YiBUb3BpYyIgaHJlZj0iaHRtbC9yZWZlcmVuY2Uvc3VidG9waWMuaHRtbCIgLz4gCi0JPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9Ik1haW4gVG9waWMgMiI+Ci0JCTx0b3BpYyBsYWJlbD0iU3ViIFRvcGljIDIiIGhyZWY9Imh0bWwvcmVmZXJlbmNlL3N1YnRvcGljMi5odG1sIiAvPiAKLQk8L3RvcGljPiAKLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY3NhbXBsZXMueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY3NhbXBsZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTdlZmI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2NzYW1wbGVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJTYW1wbGVzIiBsaW5rX3RvPSJ0b2MueG1sI3NhbXBsZXMiPiAKLQk8dG9waWMgbGFiZWw9Ik1haW4gVG9waWMiICBocmVmPSJodG1sL3NhbXBsZXMvbWFpbnRvcGljLmh0bWwiPiAKLQkJPHRvcGljIGxhYmVsPSJTdWIgVG9waWMiIGhyZWY9Imh0bWwvc2FtcGxlcy9zdWJ0b3BpYy5odG1sIiAvPiAKLQk8L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iTWFpbiBUb3BpYyAyIj4KLQkJPHRvcGljIGxhYmVsPSJTdWIgVG9waWMgMiIgaHJlZj0iaHRtbC9zYW1wbGVzL3N1YnRvcGljMi5odG1sIiAvPiAKLQk8L3RvcGljPiAKLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY3Rhc2tzLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2N0YXNrcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMTQ1NDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY3Rhc2tzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJUYXNrcyIgbGlua190bz0idG9jLnhtbCN0YXNrcyI+IAotCTx0b3BpYyBsYWJlbD0iTWFpbiBUb3BpYyIgIGhyZWY9Imh0bWwvdGFza3MvbWFpbnRvcGljLmh0bWwiPiAKLQkJPHRvcGljIGxhYmVsPSJTdWIgVG9waWMiIGhyZWY9Imh0bWwvdGFza3Mvc3VidG9waWMuaHRtbCIgLz4gCi0JPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9Ik1haW4gVG9waWMgMiI+Ci0JCTx0b3BpYyBsYWJlbD0iU3ViIFRvcGljIDIiIGhyZWY9Imh0bWwvdGFza3Mvc3VidG9waWMyLmh0bWwiIC8+IAotCTwvdG9waWM+IAotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdHV0b3JpYWxzLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90dXRvcmlhbHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2E4NjhlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90dXRvcmlhbHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJUdXRvcmlhbHMiIGxpbmtfdG89Im1haW4ueG1sI3R1dG9yaWFsc19pZCI+Ci0gICA8dG9waWMgbGFiZWw9IkV4cGxvcmUgdGhlIHVzZXIgaW50ZXJmYWNlIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQxX2ludHJvLmh0bSI+Ci0JPHRvcGljIGxhYmVsPSJDb25jZXB0cyIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0MV9jb25jZXB0cy5odG0iIC8+IAotICAgCTx0b3BpYyBsYWJlbD0iQmFzaWMgbmF2aWdhdGlvbiIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0MV9leDEuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQnJvd3NlIG1ldGhvZCBjb250ZW50IiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQxX2V4Mi5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJCcm93c2UgcHJvY2VzcyBjb250ZW50IiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQxX2V4My5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJCcm93c2Ugd2hpbGUgYXV0aG9yaW5nIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQxX2V4NC5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJTZWFyY2giIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDFfZXg1Lmh0bSIgLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9pbnRyby5odG0iPgotCTx0b3BpYyBsYWJlbD0iQ29uY2VwdHMiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDJfY29uY2VwdHMuaHRtIiAvPiAKLQk8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIGNvbnRlbnQgcGFja2FnZSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9leDEuaHRtIiAvPgotCTx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgd29yayBwcm9kdWN0IiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQyX2V4Mi5odG0iIC8+Ci0JPHRvcGljIGxhYmVsPSJDcmVhdGUgYSByb2xlIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQyX2V4My5odG0iIC8+Ci0JPHRvcGljIGxhYmVsPSJDcmVhdGUgYSB0YXNrIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQyX2V4NC5odG0iIC8+Ci0JPHRvcGljIGxhYmVsPSJXb3JrIHdpdGggc3RlcHMiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDJfZXg1Lmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIGd1aWRhbmNlIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQyX2V4Ni5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJNYW5hZ2UgZ3VpZGFuY2UiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDJfZXg3Lmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHN0YW5kYXJkIGNhdGVnb3J5IiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQyX2V4OC5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJBZGQgYSBwbHVnLWluIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQyX2V4OS5odG0iIC8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJSZXVzZSBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0M19pbnRyby5odG0iPgotICAgCTx0b3BpYyBsYWJlbD0iQ29uY2VwdHMiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDNfY29uY2VwdHMuaHRtIiAvPiAKLSAgIAk8dG9waWMgbGFiZWw9IkNvbnRyaWJ1dGUgdG8gYSByb2xlIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQzX2V4MS5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJDb250cmlidXRlIHRvIGEgd29yayBwcm9kdWN0IiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQzX2V4Mi5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJDb250cmlidXRlIHRvIGEgdGFzayIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0M19leDMuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iRXh0ZW5kIGEgcm9sZSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0M19leDQuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iRXh0ZW5kIGEgd29yayBwcm9kdWN0IiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQzX2V4NS5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJFeHRlbmQgYSB0YXNrIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQzX2V4Ni5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJSZXBsYWNlIGEgcm9sZSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0M19leDcuaHRtIiAvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIHByb2Nlc3NlcyIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NV9pbnRyby5odG0iPgotICAgICAgIAk8dG9waWMgbGFiZWw9IkNvbmNlcHRzIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQ1X2NvbmNlcHRzLmh0bSIgLz4gCi0gICAJPHRvcGljIGxhYmVsPSJCcm93c2UgcHJvY2VzcyBjb250ZW50IiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQ1X2V4MS5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJFeHBsb3JlIHByb2Nlc3MgY29udGVudCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NV9leDIuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgZGVsaXZlcnkgcHJvY2VzcyIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NV9leDMuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iVXNlIGNhcGFiaWxpdHkgcGF0dGVybnMiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDVfZXg0Lmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHByb2Nlc3MgZGlhZ3JhbSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NV9leDUuaHRtIiAvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iUHVibGlzaGluZyBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NF9pbnRyby5odG0iPgotICAgICAgIAk8dG9waWMgbGFiZWw9IkNvbmNlcHRzIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQ0X2NvbmNlcHRzLmh0bSIgLz4gCi0gICAJPHRvcGljIGxhYmVsPSJQdWJsaXNoIGEgY29uZmlndXJhdGlvbiIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NF9leDEuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQ0X2V4Mi5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBjdXN0b20gY29uZmlndXJhdGlvbiIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NF9leDMuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iUHVibGlzaCBhIGN1c3RvbSBjb25maWd1cmF0aW9uIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQ0X2V4NC5odG0iIC8+Ci0gICA8L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdmVyc2lvbl9jb250cm9sLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy92ZXJzaW9uX2NvbnRyb2wueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmNjMjI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy92ZXJzaW9uX2NvbnRyb2wueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx0b2MgbGFiZWw9IlVzaW5nIHZlcnNpb24gY29udHJvbCBzeXN0ZW1zIiBsaW5rX3RvPSJtYWluLnhtbCN2ZXJzaW9uX2NvbnRyb2xfaWQiPgotICAgPHRvcGljIGxhYmVsPSJVc2luZyBSYXRpb25hbCBDbGVhckNhc2UiID4KLSAgIAk8dG9waWMgbGFiZWw9IkludGVncmF0aW9uIHdpdGggUmF0aW9uYWwgQ2xlYXJDYXNlIiBocmVmPSJodG1sL3RvcGljcy9jX2NsZWFyY2FzZV9vdmVydmlldy5odG1sIi8+Ci0gCTx0b3BpYyBsYWJlbD0iSW5zdGFsbGluZyBhbmQgY29uZmlndXJpbmcgUmF0aW9uYWwgQ2xlYXJDYXNlIiBocmVmPSJodG1sL3RvcGljcy90X2NsZWFyY2FzZV9pbnN0YWxsLmh0bWwiLz4KLQk8dG9waWMgbGFiZWw9Ikluc3RhbGxpbmcgYW5kIGNvbmZpZ3VyaW5nIFJhdGlvbmFsIENDUkMiIGhyZWY9Imh0bWwvdG9waWNzL3RfY2xlYXJjYXNlX2NjcmNfaW5zdGFsbC5odG1sIi8+ICAgCi0gICAgCTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBDbGVhckNhc2UgdmlldyIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfY3JlYXRlX3ZpZXcuaHRtbCIvPgotICAgCTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSB2aWV3IiBocmVmPSJodG1sL3RvcGljcy90X2NsZWFyY2FzZV9uZXdfdmlldy5odG1sIi8+Ci0gCTx0b3BpYyBsYWJlbD0iVXNpbmcgQ2xlYXJDYXNlIGR5bmFtaWMgdmlld3MiIGhyZWY9Imh0bWwvdG9waWNzL3RfY2xlYXJjYXNlX2R5bmFtaWNfdmlld3MuaHRtbCIvPgotICAgCTx0b3BpYyBsYWJlbD0iQWRkaW5nIGEgbmV3IGxpYnJhcnkgdG8gQ2xlYXJDYXNlIiBocmVmPSJodG1sL3RvcGljcy90X2NsZWFyY2FzZV9uZXdfbGlicmFyeS5odG1sIi8+Ci0JPHRvcGljIGxhYmVsPSJBZGRpbmcgYW4gZXhpc3RpbmcgbGlicmFyeSB0byBDbGVhckNhc2UiIGhyZWY9Imh0bWwvdG9waWNzL3RfY2xlYXJjYXNlX2V4aXN0aW5nX2xpYnJhcnkuaHRtbCIvPgotICAgCTx0b3BpYyBsYWJlbD0iSW1wb3J0aW5nIGEgbGlicmFyeSBjb25maWd1cmF0aW9uIHdpdGggQ2xlYXJDYXNlIiBocmVmPSJodG1sL3RvcGljcy90X2NsZWFyY2FzZV9pbXBvcnRfY29uZmlndXJhdGlvbi5odG1sIi8+Ci0gIAk8dG9waWMgbGFiZWw9IkFkZGluZyBhIHBsdWctaW4gdG8gQ2xlYXJDYXNlIiBocmVmPSJodG1sL3RvcGljcy90X2NsZWFyY2FzZV9hZGRfcGx1Z2luLmh0bWwiLz4KLSAgCTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBuZXcgY29uZmlndXJhdGlvbiB3aXRoIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfbmV3X2NvbmZpZ3VyYXRpb24uaHRtbCIvPgotICAgCTx0b3BpYyBsYWJlbD0iQWRkaW5nIGEgY29udGVudCBwYWNrYWdlIHRvIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfY29udGVudF9wYWNrYWdlLmh0bWwiLz4gCi0gICAJPHRvcGljIGxhYmVsPSJBZGRpbmcgYSBuZXcgbWV0aG9kIGVsZW1lbnQgdG8gQ2xlYXJDYXNlIiBocmVmPSJodG1sL3RvcGljcy90X2NsZWFyY2FzZV9hZGRfZWxlbWVudC5odG1sIi8+Ci0gIAk8dG9waWMgbGFiZWw9IkVkaXRpbmcgbWV0aG9kIGVsZW1lbnRzIHdpdGggQ2xlYXJDYXNlIiBocmVmPSJodG1sL3RvcGljcy90X2NsZWFyY2FzZV9lZGl0X2VsZW1lbnQuaHRtbCIvPgotICAgCTx0b3BpYyBsYWJlbD0iRGVsZXRpbmcgbWV0aG9kIGVsZW1lbnRzIHdpdGggQ2xlYXJDYXNlIiBocmVmPSJodG1sL3RvcGljcy90X2NsZWFyY2FzZV9kZWxldGVfZWxlbWVudC5odG1sIi8+Ci0gICAJPHRvcGljIGxhYmVsPSJNb3ZpbmcgbWV0aG9kIGVsZW1lbnRzIHdpdGggQ2xlYXJDYXNlIiBocmVmPSJodG1sL3RvcGljcy90X2NsZWFyY2FzZV9tb3ZlX2VsZW1lbnQuaHRtbCIvPgotICAgCTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBjYXBhYmlsaXR5IHBhdHRlcm4gd2l0aCBDbGVhckNhc2UiIGhyZWY9Imh0bWwvdG9waWNzL3RfY2xlYXJjYXNlX2NhcGFiaWxpdHlfcGF0dGVybi5odG1sIi8+Ci0gCTx0b3BpYyBsYWJlbD0iTXVsdGktVXNlciBzY2VuYXJpb3Mgd2l0aCBDbGVhckNhc2UiIGhyZWY9Imh0bWwvdG9waWNzL2NfY2xlYXJjYXNlX211bHRpdXNlci5odG1sIi8+Ci0gIAk8dG9waWMgbGFiZWw9IkRpc2FibGluZyBSYXRpb25hbCBDQ1JDIiBocmVmPSJodG1sL3RvcGljcy90X2NsZWFyY2FzZV9jY3JjX2Rpc2FibGUuaHRtbCIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iVXNpbmcgQ1ZTIiA+Ci0gICAJPHRvcGljIGxhYmVsPSJJbnN0YWxsaW5nIGFuZCBjb25maWd1cmluZyBDVlMiIGhyZWY9Imh0bWwvdG9waWNzL3RfY3ZzX2luc3RhbGwuaHRtbCIvPgotICAgCTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBuZXcgdmlldyB3aXRoIENWUyIgaHJlZj0iaHRtbC90b3BpY3MvdF9jdnNfbmV3X3ZpZXcuaHRtbCIvPgotICAgCTx0b3BpYyBsYWJlbD0iQWRkaW5nIGEgbmV3IGxpYnJhcnkgdG8gQ1ZTIiBocmVmPSJodG1sL3RvcGljcy90X2N2c19uZXdfbGlicmFyeS5odG1sIi8+Ci0gICAJPHRvcGljIGxhYmVsPSJBZGRpbmcgYSBwbHVnLWluIHRvIENWUyIgaHJlZj0iaHRtbC90b3BpY3MvdF9jdnNfYWRkX3BsdWdpbi5odG1sIi8+Ci0gICAJPHRvcGljIGxhYmVsPSJBZGRpbmcgYW4gZWxlbWVudCB0byBDVlMiIGhyZWY9Imh0bWwvdG9waWNzL3RfY3ZzX2FkZF9lbGVtZW50Lmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9IkRlbGV0aW5nIGFuIGVsZW1lbnQgdW5kZXIgQ1ZTIiBocmVmPSJodG1sL3RvcGljcy90X2N2c19kZWxldGVfZWxlbWVudC5odG1sIi8+Ci0gICAJPHRvcGljIGxhYmVsPSJFZGl0aW5nIGFuIGVsZW1lbnQgdW5kZXIgQ1ZTIiBocmVmPSJodG1sL3RvcGljcy90X2N2c19lZGl0X2VsZW1lbnQuaHRtbCIvPgotICAgCTx0b3BpYyBsYWJlbD0iTW92aW5nIGFuIGVsZW1lbnQgdW5kZXIgQ1ZTIiBocmVmPSJodG1sL3RvcGljcy90X2N2c19tb3ZlX2VsZW1lbnQuaHRtbCIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iVmVyc2lvbiBjb250cm9sIHJlZmVyZW5jZSIgPgotICAgCTx0b3BpYyBsYWJlbD0iVmVyc2lvbiBjb250cm9sIGZvciBzcGVjaWZpYyBmaWxlcyIgaHJlZj0iaHRtbC90b3BpY3Mvcl9jbGVhcmNhc2VfZmlsZXMuaHRtbCIvPgotICAgCTx0b3BpYyBsYWJlbD0iQ29tbW9uIGFjdGlvbnMgaW1wYWN0IG9uIHNwZWNpZmljIGZpbGVzIiBocmVmPSJodG1sL3RvcGljcy9yX2NsZWFyY2FzZV9hY3Rpb25zLmh0bWwiLz4KLSAgIDwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy93b3Jrd2l0aHRleHRkZXNjLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy93b3Jrd2l0aHRleHRkZXNjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI4NzZmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvd29ya3dpdGh0ZXh0ZGVzYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9Ildvcmtpbmcgd2l0aCBUZXh0dWFsIERlc2NyaXB0aW9ucyIgbGlua190bz0ibWFpbi54bWwjd29ya3dpdGh0ZXh0ZGVzY19pZCI+Ci0gICA8dG9waWMgbGFiZWw9IlJpY2ggVGV4dCBFZGl0b3IiIGhyZWY9Imh0bWwvaGVscC9yaWNodGV4dGVkaXRvci5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkFkZCBhIFJlZmVyZW5jZSBvciBIeXBlcmxpbmsiIGhyZWY9Imh0bWwvaGVscC9hZGRfaHlwZXJsaW5rLmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzOWQxZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIHhtbCBpbXBvcnQgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI3NTk5YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMzZlZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWw7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5JbXBvcnRYTUxQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbCwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwsCi0gb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwucHJlZmVyZW5jZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuc2VydmljZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwud2l6YXJkcwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhiY2MyZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL2ljb25zL2V0b29sMTYvaW1wX3htbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9pY29ucy9ldG9vbDE2L2ltcF94bWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGVlNzRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL2ljb25zL2V0b29sMTYvaW1wX3htbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9pY29ucy9mdWxsL3dpemJhbi9pbXBfeG1sX3dpemJhbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9pY29ucy9mdWxsL3dpemJhbi9pbXBfeG1sX3dpemJhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZDg0NmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvaWNvbnMvZnVsbC93aXpiYW4vaW1wX3htbF93aXpiYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU1NDdmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBJbXBvcnQgWE1MIFBsdWctaW4KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIEltcG9ydCBYTUwgV2l6YXJkCi1pbXBvcnRYTUxXaXphcmROYW1lPVhNTAotaW1wb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249SW1wb3J0IG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgc3RvcmVkIGluIGEgWE1MIGZpbGUuCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ0NWU0OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pbXBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkuaW1wb3J0V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC53aXphcmRzLkltcG9ydFhNTFdpemFyZCIKLSAgICAgICAgICAgIGljb249Imljb25zL2V0b29sMTYvaW1wX3htbC5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwud2l6YXJkcy5JbXBvcnRYTUxXaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlaW1wb3J0WE1MV2l6YXJkTmFtZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAlaW1wb3J0WE1MV2l6YXJkRGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLnVpLmltcG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwud2l6YXJkcy5JbXBvcnRYTUxXaXphcmQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9JbXBvcnRYTUxQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9JbXBvcnRYTUxQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE0MWJjZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvSW1wb3J0WE1MUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRYTUxQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgSW1wb3J0WE1MUGx1Z2luIHBsdWdpbjsKLQlwcml2YXRlIFVtYVBhY2thZ2UgdW1hUGFja2FnZTsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEltcG9ydFhNTFBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQkJCi0JCS8vQWxsb3cgVW1hUGFja2FnZSBiZSBpbml0aWFsaXplZCBiZWZvcmUgYW55IGltcG9ydCBhY3Rpb24KLQkJdW1hUGFja2FnZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQkKLQkJLy8gc2V0IHRoaXMgdG8gYWxsb3cgcGFyc2UgbGFyZ2UgeG1sIGZpbGUKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJlbnRpdHlFeHBhbnNpb25MaW1pdCIsICIxMDAwMDAwMDAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbXBvcnRYTUxQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9JbXBvcnRYTUxSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9JbXBvcnRYTUxSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAzMmM2ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvSW1wb3J0WE1MUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIEV4cG9ydCBYTUwgbWVzc2FnZSByZXNvdXJjZSBidW5kbGUgYWNjZXNzb3IgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSW1wb3J0WE1MUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IEltcG9ydFhNTFJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEltcG9ydFhNTFJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0WE1MV2l6YXJkX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RYTUxGaWxlUGFnZV9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBicm93c2VCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wdGlvbkdyb3VwX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3B0aW9uR3JvdXAxX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdmVyd3JpdGVSYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWVyZ2VSYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0aW5nWE1MX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXZpZXdfbG9nX2ZpbGVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0WE1MRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0WE1MRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFhNTEZpbGVfZXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfbm90X2hhbmRsZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfd2l0aG91dF9pZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFhNTFNlcnZpY2VfaW1wb3J0X2ZhaWxlZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFhNTFNlcnZpY2VfbWlzc2luZ19wbHVnaW47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRYTUxTZXJ2aWNlX2Vycm9yX21pc3NpbmdfcGx1Z2luczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlfZXJyb3Jfbm9fZWNsYXNzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeV9ub19wYWNrYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlfb2JqZWN0X3N0cmluZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2VfMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25NaXNtYXRjaF9vbGREYXRhOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25NaXNtYXRjaF9vbGRUb29sOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd247Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBJbXBvcnRYTUxSZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZjRlM2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMKLSMgTWVzc2FnZSBJRCBSYW5nZToKLSMKLQotIyBJbXBvcnQgWE1MIFdpemFyZAotaW1wb3J0WE1MV2l6YXJkX3RpdGxlPUltcG9ydCBYTUwKLQotIyBTZWxlY3QgSW1wb3J0IFhNTCBGaWxlIFdpemFyZCBQYWdlCi1zZWxlY3RYTUxGaWxlUGFnZV90aXRsZT1TcGVjaWZ5IGltcG9ydCBmaWxlCi1zZWxlY3RYTUxGaWxlUGFnZV9kZXNjPVNwZWNpZnkgdGhlIFhNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgdG8gaW1wb3J0LCBhbmQgc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBpbXBvcnQgb3BlcmF0aW9uIHRvIHBlcmZvcm0uCi1maWxlTGFiZWxfdGV4dD1YTUwgRmlsZToKLWJyb3dzZUJ1dHRvbl90ZXh0PUJyb3dzZS4uLgotb3B0aW9uR3JvdXBfdGV4dD1NZXJnZSBvcHRpb24KLW9wdGlvbkdyb3VwMV90ZXh0PUNoZWNrIGJhc2UgcGx1Zy1pbiBvcHRpb24KLW92ZXJ3cml0ZVJhZGlvQnV0dG9uX3RleHQ9T3ZlcnJpZGUgZXhpc3RpbmcgbWV0aG9kIGxpYnJhcnkgY29udGVudCB3aXRoIHRoZSBpbXBvcnRlZCBjb250ZW50Ci1tZXJnZVJhZGlvQnV0dG9uX3RleHQ9TWVyZ2UgaW1wb3J0ZWQgY29udGVudCBpbnRvIHRoZSBleGlzdGluZyBtZXRob2QgbGlicmFyeQotCi0jIFByb2dyZXNzIE1lc3NhZ2VzCi1pbXBvcnRpbmdYTUxfdGV4dD1JbXBvcnRpbmcgWE1MIGxpYnJhcnkgY29udGVudCBpbnRvIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5Li4uCi0KLSMgSW1wb3J0IFhNTCBFcnJvciBEaWFsb2cKLXJldmlld19sb2dfZmlsZXM9VGhlIGltcG9ydCBvcGVyYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiBSZXZpZXcgdGhlIGxvZyBmaWxlcyBpbiB0aGUgXG4nJ3swfScnIGZvbGRlciBmb3IgYW55IGVycm9ycy4KLWltcG9ydFhNTEVycm9yX21zZz1JVVBNMDAwMEU6IFRoZSBpbXBvcnQgb3BlcmF0aW9uIGNhbm5vdCBwcm9jZWVkLgotaW1wb3J0WE1MRXJyb3JfcmVhc29uPUlVUE0wMDA5RTogVGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgaXMgcmVhZC1vbmx5LlxuXG5NYWtlIHN1cmUgdGhhdCAnJ3swfScnIGlzIHdyaXRhYmxlIG9yIGNyZWF0ZSBhIG5ldyBtZXRob2QgbGlicmFyeSBhbmQgdHJ5IGFnYWluLgotCi0jIEVycm9yIE1lc3NhZ2VzCi1pbnZhbGlkWE1MRmlsZV9lcnJvcj1UaGUgc3BlY2lmaWVkIFhNTCBmaWxlIGlzIG5vdCB2YWxpZC4KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUE0wMDEwRTogVGhlIHNwZWNpZmllZCBYTUwgZmlsZSB3YXMgZXhwb3J0ZWQgYnkgYSBwcmV2aW91cyB2ZXJzaW9uICh7MH0pIG9mIHsxfS4gVGhlIGZpbGVzIG11c3QgYmUgZXhwb3J0ZWQgdXNpbmcgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB7MX0uCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duPUlVUE0wMDExRTogVGhlIHNwZWNpZmllZCBYTUwgZmlsZSB3YXMgZXhwb3J0ZWQgYnkgYSBwcmV2aW91cyB2ZXJzaW9uIG9mIHswfS4gVGhlIGZpbGVzIG11c3QgYmUgZXhwb3J0ZWQgdXNpbmcgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB7MH0uCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1JVVBNMDAxMkU6IFRoZSBzcGVjaWZpZWQgWE1MIGZpbGUgd2FzIGV4cG9ydGVkIGJ5IGEgbmV3ZXIgdmVyc2lvbiAoezB9KSBvZiB7MX0uIFlvdSBtdXN0IHVwZ3JhZGUgezF9IGluIG9yZGVyIHRvIGltcG9ydCB0aGUgZmlsZS4gIAotdmVyc2lvbk1pc21hdGNoX29sZFRvb2xfdW5rbm93bj1JVVBNMDAxM0U6IFRoZSBzcGVjaWZpZWQgWE1MIGZpbGUgY2Fubm90IGJlIG9wZW5lZC4gWW91IG11c3QgdXBncmFkZSB7MH0gaW4gb3JkZXIgdG8gaW1wb3J0IHRoZSBmaWxlLiAgCi0KLWltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF9ub3RfaGFuZGxlZD1FbGVtZW50IG5vdCBoYW5kbGVkOiB7MH0KLWltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF93aXRob3V0X2lkPUVsZW1lbnQgd2l0aG91dCBJRDogezB9Ci1pbXBvcnRYTUxTZXJ2aWNlX2ltcG9ydF9mYWlsZWQ9SW1wb3J0IGZhaWxlZDogezB9Ci1pbXBvcnRYTUxTZXJ2aWNlX21pc3NpbmdfcGx1Z2luPU1pc3NpbmcgcmVxdWlyZWQgcGx1Zy1pbiB7MH0KLWltcG9ydFhNTFNlcnZpY2VfZXJyb3JfbWlzc2luZ19wbHVnaW5zPU1pc3NpbmcgcmVxdWlyZWQgcGx1Zy1pbihzKS4gUGxlYXNlIGNoZWNrIHRoZSBsb2cgZmlsZXMgZm9yIGRldGFpbHMKLQotbGlicmFyeV9lcnJvcl9ub19lY2xhc3M9RXJyb3IgY3JlYXRpbmcgQ29udGVudENhdGVnb3J5OiBVbmFibGUgdG8gZ2V0IEVDbGFzcyBmb3IgezB9Ci1saWJyYXJ5X25vX3BhY2thZ2U9VW5hYmxlIHRvIGZpbmQgb3duaW5nIHBhY2thZ2UgZm9yIG9iamVjdCB7MH0KLWxpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ9RXJyb3IgY3JlYXRpbmcgZWxlbWVudDogezB9Ci1saWJyYXJ5X29iamVjdF9zdHJpbmc9b2JqZWN0IHswfSwgZmVhdHVyZSB7MX0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8yPUVycm9yIHNldHRpbmcgYXR0cmlidXRlOiBJbnZhbGlkIGF0dHJpYnV0ZSBmZWF0dXJlIHZhbHVlIHswfQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlPUVycm9yIHNldHRpbmcgYXR0cmlidXRlIGZvciBvYmplY3QgezB9LCBmZWF0dXJlIHsxfSwgYW5kIHZhbHVlIHsyfQotbGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzM9RG8gbm90IGtub3cgaG93IHRvIHNldCBhdHRyaWJ1dGUgZm9yIG9iamVjdCB7MH0sIGZlYXR1cmUgezF9LCBhbmQgdmFsdWUgezJ9Ci1saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2U9RXJyb3Igc2V0dGluZyByZWZlcmVuY2UgZm9yIGZlYXR1cmUgezB9OiBubyBlbGVtZW50IHdpdGggaWQgezF9Ci1saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2VfMj1FcnJvciBzZXR0aW5nIHJlZmVyZW5jZSBmb3Igb2JqZWN0IHswfSwgZmVhdHVyZSB7MX0sIGFuZCB2YWx1ZSB7Mn0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYTcyMzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBhY3RpdmF0b3IgZm9yIG1hbmFnaW5nIHRoZSBJbXBvcnQgWE1MIHBsdWctaW4ncyBsaWZlIGN5Y2xlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9wcmVmZXJlbmNlcy9JbXBvcnRYTUxQcmVmZXJlbmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3ByZWZlcmVuY2VzL0ltcG9ydFhNTFByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YWUxNTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3ByZWZlcmVuY2VzL0ltcG9ydFhNTFByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5JbXBvcnRYTUxQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIFRoZSBFeHBvcnQgWE1MIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFhNTFByZWZlcmVuY2VzIHsKLQotCS8qKgotCSAqIFRoZSBpbXBvcnQgWE1MIGZpbGUgcHJlZmVyZW5jZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0ZJTEUgPSAieG1sRmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBtZXJnZSBvcHRpb24gcHJlZmVyZW5jZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVSR0VfT1BUSU9OID0gIm1lcmdlT3B0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIGxhc3QgaW1wb3J0IGNoZWNrIHBsdWdpbnMgb3B0aW9uIHByZWZlcmVuY2Uga2V5Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tfQkFTRV9QTFVHSU5TX09QVElPTiA9ICJjaGVja0Jhc2VQbHVnaW5zT3B0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIHsKLQkJLy8gSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IEltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoWE1MX0ZJTEUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlzdG9yZS5zZXREZWZhdWx0KE1FUkdFX09QVElPTiwgZmFsc2UpOyAKLQkJc3RvcmUuc2V0RGVmYXVsdChDSEVDS19CQVNFX1BMVUdJTlNfT1BUSU9OLCB0cnVlKTsgCQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltcG9ydCBYTUwgZmlsZSBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGltcG9ydCBYTUwgZmlsZSBwcmVmZXJlbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0WE1MRmlsZSgpIHsKLQkJcmV0dXJuIEltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCVhNTF9GSUxFKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbXBvcnQgWE1MIGZpbGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIGFic29sdXRlIHBhdGggdG8gYSBYTUwgZmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRYTUxGaWxlKFN0cmluZyBwYXRoKSB7Ci0JCUltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoWE1MX0ZJTEUsCi0JCQkJcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWVyZ2Ugb3B0aW9uIGZpbGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXJnZSBvcHRpb24gZmlsZSBwcmVmZXJlbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldE1lcmdlT3B0aW9uKCkgewotCQlyZXR1cm4gSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKAotCQkJCU1FUkdFX09QVElPTik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWVyZ2Ugb3B0aW9uIGZpbGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWVyZ2VPcHRpb24KLQkgKiAgICAgICAgICAgIHRoZSB1c2VyIHNwZWNpZmllZCBtZXJnZSBvcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0TWVyZ2VPcHRpb24oYm9vbGVhbiBtZXJnZU9wdGlvbikgewotCQlJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKAotCQkJCU1FUkdFX09QVElPTiwgbWVyZ2VPcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGVja0Jhc2VQbHVnaW5zIG9wdGlvbiBmaWxlIHByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgY2hlY2tCYXNlUGx1Z2lucyBvcHRpb24gZmlsZSBwcmVmZXJlbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldENoZWNrQmFzZVBsdWdpbnNPcHRpb24oKSB7Ci0JCXJldHVybiBJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oCi0JCQkJQ0hFQ0tfQkFTRV9QTFVHSU5TX09QVElPTik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY2hlY2tCYXNlUGx1Z2lucyBvcHRpb24gZmlsZSBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBiCi0JICogICAgICAgdGhlIHVzZXIgc3BlY2lmaWVkIGNoZWNrQmFzZVBsdWdpbnMgb3B0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENoZWNrQmFzZVBsdWdpbnNPcHRpb24oYm9vbGVhbiBiKSB7Ci0JCUltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoCi0JCQkJQ0hFQ0tfQkFTRV9QTFVHSU5TX09QVElPTiwgYik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIxNjRmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgcHJlZmVyZW5jZSBzdXBwb3J0IGZvciB0aGUgSW1wb3J0IFhNTCBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9JbXBvcnRSZXNvdXJjZUhhbmRsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9JbXBvcnRSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUxZGQ1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvSW1wb3J0UmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5CYXNlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5VcmxJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogcmVzb3VyY2UgaGFuZGxlciBmb3IgY29udGVudCBpbiB0aGUgaW1wb3J0ZWQgbGlicmFyeQotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFJlc291cmNlSGFuZGxlciBleHRlbmRzIEJhc2VSZXNvdXJjZUhhbmRsZXIgewotCi0JCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBzb3VyY2VMaWJSb290Ci0JICogQHBhcmFtIHRhcmdldExpYlJvb3QKLQkgKi8KLQlwdWJsaWMgSW1wb3J0UmVzb3VyY2VIYW5kbGVyKEZpbGUgc291cmNlTGliUm9vdCwgRmlsZSB0YXJnZXRMaWJSb290KSB7Ci0JCXN1cGVyKHNvdXJjZUxpYlJvb3QsIHRhcmdldExpYlJvb3QpOwotCX0KLQkKLQkvKioKLQkgKiByZXNvbHZlIHRoZSB1cmwuIHB1dCB0aGUgcmVzb3VyY2VzIGludG8gdGhlIGxvY2F0aW9uIGJhc2VkIG9uIHRoZSBsaWJyYXJ5IHJlc291cmNlIHN0cnVjdHVyZSBkZWZpbml0aW9uLgotCSAqLwotCXB1YmxpYyBVcmxJbmZvIHJlc29sdmVGaWxlVXJsKE9iamVjdCBvd25lciwgU3RyaW5nIHNyY1VybCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJVXJsSW5mbyBpbmZvID0gbmV3IFVybEluZm8oKTsKLQotCQlpbmZvLnNvdXJjZVVybCA9IHNyY1VybDsKLQkJaW5mby5zb3VyY2VGaWxlID0gbmV3IEZpbGUoc291cmNlTGliUm9vdCwgc3JjVXJsKS5nZXRDYW5vbmljYWxGaWxlKCk7Ci0JCWluZm8udGFyZ2V0VXJsID0gc3JjVXJsOyAKLQkJaW5mby50YXJnZXRGaWxlID0gbnVsbDsKLQotCQlpZiAoaW5mby5zb3VyY2VGaWxlID09IG51bGwgfHwgIWluZm8uc291cmNlRmlsZS5leGlzdHMoKSApIHsKLQkJCXJldHVybiBpbmZvOwotCQl9Ci0JCQotCQlpZiAoIG93bmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApIHsKLQkJCS8vIGZpeCB0aGUgdGFyZ2V0IHVybCBhbmQgCi0JCQlpbmZvLnRhcmdldFVybCA9IGZpeFVybChzcmNVcmwpOwotCQkJCi0JCQkvL1N0cmluZyBlbGVtZW50UGF0aCA9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRSZXNvdXJjZVBhdGgob3duZXIpOwotCQkJU3RyaW5nIGVsZW1lbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoIChNZXRob2RFbGVtZW50KW93bmVyKTsKLQkJCUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIGxpYlJlc01nciA9IFJlc291cmNlSGVscGVyLmdldFJlc291cmNlTWdyKChNZXRob2RFbGVtZW50KW93bmVyKTsKLQkJCVN0cmluZyBzcmNQbHVnaW5QYXRoID0gbGliUmVzTWdyLmdldFBoeXNpY2FsUGx1Z2luUGF0aCgoTWV0aG9kRWxlbWVudClvd25lcik7Ci0JCQlGaWxlIHNyY1Jvb3QgPSAobmV3IEZpbGUoc3JjUGx1Z2luUGF0aCkpLmdldFBhcmVudEZpbGUoKTsKLQkJCWluZm8udGFyZ2V0RmlsZSA9IG5ldyBGaWxlKG5ldyBGaWxlKHNyY1Jvb3QsIGVsZW1lbnRQYXRoKSwgaW5mby50YXJnZXRVcmwpOwkKLQkJfSBlbHNlIHsKLQkJCWluZm8udGFyZ2V0VXJsID0gc3JjVXJsOyAKLQkJCWluZm8uc291cmNlRmlsZSA9IG5ldyBGaWxlKHNvdXJjZUxpYlJvb3QsIHNyY1VybCk7Ci0JCX0KLQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBmaXhVcmwoU3RyaW5nIHVybCkgewotCQl1cmwgPSB1cmwucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7ICAKLQkJaW50IGluZHggPSB1cmwubGFzdEluZGV4T2YoUmVzb3VyY2VIZWxwZXIuUkVTT1VSQ0VfRk9MREVSICsgIi8iKTsgIC8vJE5PTi1OTFMtMSQKLQkJaWYgKCBpbmR4ID49MCApIHsKLQkJCXJldHVybiB1cmwuc3Vic3RyaW5nKGluZHgpOwotCQl9Ci0JCQotCQkvLyBwdXQgdGhlIHJlc291cmNlIGludG8gdGhlIHJlc291cmNlcyBmb2xkZXIKLQkJcmV0dXJuIG5ldyBGaWxlKFJlc291cmNlSGVscGVyLlJFU09VUkNFX0ZPTERFUiwgdXJsKQotCQkJLnRvU3RyaW5nKCkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7IAotCX0KLQkKLQkvKioKLQkgKiBjb3B5aW5nIHRoZSByZXNvdXJjZSBmaWxlIGZyb20gdGhlIHNvdXJjZSBsaWJyYXJ5IHRvIHRoZSB0YXJnZXQKLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlRmlsZSB0aGUgZmlsZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2Ugcm9vdAotCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlSZXNvdXJjZShTdHJpbmcgc291cmNlRmlsZSwgRU9iamVjdCBvYmosIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luIHVtYVBsdWdpbikgewotCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciBsaWJSZXNNZ3IgPSBSZXNvdXJjZUhlbHBlci5nZXRSZXNvdXJjZU1ncih1bWFQbHVnaW4pOwotCQlTdHJpbmcgdGd0UGx1Z2luUGF0aCA9IGxpYlJlc01nci5nZXRQaHlzaWNhbFBsdWdpblBhdGgodW1hUGx1Z2luKTsKLQkJRmlsZSB0Z3RQbHVnaW5Sb290ID0gbmV3IEZpbGUodGd0UGx1Z2luUGF0aCk7Ci0JCUZpbGUgc3JjUGx1Z2luUm9vdCA9IG5ldyBGaWxlKHNvdXJjZUxpYlJvb3QsIHVtYVBsdWdpbi5nZXROYW1lKCkpOwotCQkKLQkJRmlsZSBzcmMgPSBuZXcgRmlsZShzcmNQbHVnaW5Sb290LCBzb3VyY2VGaWxlKTsKLQkJaWYgKCBzcmMuZXhpc3RzKCkgKSB7Ci0JCQlGaWxlIHRndCA9IG5ldyBGaWxlKHRndFBsdWdpblJvb3QsIHNvdXJjZUZpbGUpOwotCQkJRmlsZVV0aWwuY29weUZpbGUoc3JjLCB0Z3QpOwotCQl9Ci0JfQotCQotLy8JLyoqCi0vLwkgKiB0aGUgcmVzb3VyY2UgcGF0aCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBsaWJhcnkgcm9vdC4gdXJscyBuZWVkcyB0byBiZSBmaXhlZAotLy8JICogCi0vLwkgKiBAcGFyYW0gb3duZXIgdGhlIG93bmVyIG9iamVjdCBpbiB0aGUgdGFyZ2V0IGxpYnJhcnkKLS8vCSAqIEBwYXJhbSBzcmNVcmwgdGhlIHVybCByZWZlcmVuY2VkIGluIHRoZSBzb3VyY2UgY29udGVudAotLy8JICogQHJldHVybgotLy8JICovCi0vLwlwcml2YXRlIFVybEluZm8gbG9hZFVybEluZm9XaXRoRml4ZWRQYXRoKE9iamVjdCBvd25lciwgU3RyaW5nIHNyY1VybCkgewotLy8JCVVybEluZm8gaW5mbyA9IG5ldyBVcmxJbmZvKCk7Ci0vLwkJaW5mby5zb3VyY2VVcmwgPSBzcmNVcmw7Ci0vLwkJaW5mby50YXJnZXRVcmwgPSBzcmNVcmw7Ci0vLwkJaW5mby5zb3VyY2VGaWxlID0gbmV3IEZpbGUoc291cmNlTGliUm9vdCwgc3JjVXJsKTsKLS8vCQlpbmZvLnRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXRMaWJSb290LCBzcmNVcmwpOwotLy8KLS8vCQlpZiAoIG93bmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgIHsKLS8vCQkJU3RyaW5nIGJhY2tQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0QmFja1BhdGgoIChNZXRob2RFbGVtZW50KW93bmVyKTsKLS8vCQkJaW5mby50YXJnZXRVcmwgPSBiYWNrUGF0aCArIHNyY1VybDsKLS8vCQl9Ci0vLwkJcmV0dXJuIGluZm87CQotLy8JfQotLy8JCi0vLwkvKioKLS8vCSAqIHRoZSByZXNvdXJjZSBwYXRoIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIG93bmVyIGVsZW1lbnQuIAotLy8JICogdXJscyB3aWxsIG5vdCBiZSBjaGFuZ2VkIGJ1dCByZXNvdXJjZSBmaWxlcyBpcyByZWxpY2F0ZWQuCi0vLwkgKiBAcGFyYW0gb3duZXIgb3duZXIgdGhlIG93bmVyIG9iamVjdCBpbiB0aGUgdGFyZ2V0IGxpYnJhcnkKLS8vCSAqIEBwYXJhbSBzcmNVcmwKLS8vCSAqIEByZXR1cm4KLS8vCSAqLwotLy8JcHJpdmF0ZSBVcmxJbmZvIGxvYWRVcmxJbmZvV2l0aFJlbGF0aXZlUGF0aChPYmplY3Qgb3duZXIsIFN0cmluZyBzcmNVcmwpIHsKLS8vCQlVcmxJbmZvIGluZm8gPSBuZXcgVXJsSW5mbygpOwotLy8JCWluZm8uc291cmNlVXJsID0gc3JjVXJsOwotLy8JCWluZm8udGFyZ2V0VXJsID0gaW5mby5zb3VyY2VVcmw7IC8vIG5vIHVybCBjaGFuZ2UKLS8vCQlpbmZvLnNvdXJjZUZpbGUgPSBuZXcgRmlsZShzb3VyY2VMaWJSb290LCBzcmNVcmwpOwotLy8JCQotLy8JCWlmICggb3duZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSAgewotLy8JCQkvL1N0cmluZyBlbGVtZW50UGF0aCA9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRSZXNvdXJjZVBhdGgob3duZXIpOwotLy8JCQlTdHJpbmcgZWxlbWVudFBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UmVzb3VyY2VQYXRoKChNZXRob2RFbGVtZW50KW93bmVyKTsKLS8vCQkJaW5mby50YXJnZXRGaWxlID0gbmV3IEZpbGUobmV3IEZpbGUodGFyZ2V0TGliUm9vdCwgZWxlbWVudFBhdGgpLCBzcmNVcmwpOwkJCQotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIGluZm87Ci0vLwl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvSW1wb3J0WE1MU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL0ltcG9ydFhNTFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIzYzQyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvSW1wb3J0WE1MU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5FRGF0YU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LlZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuQ29udGVudFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuSVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkRpYWdyYW1IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcy5GZWF0dXJlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcy5YTUxMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5GaWxlTW9kaWZ5Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkxpYnJhcnlJbXBvcnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkcy5QbHVnaW5Nb2RpZnlJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLkltcG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5JbXBvcnRYTUxSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uSU1pZ3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uTWFwcGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBYbWwgaW1wb3J0IHNlcnZpY2UgY2xhc3MgdG8gcHJvY2VzcyB0aGUgaW1wb3J0aW5nIHRhc2sKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFhNTFNlcnZpY2UgewotCi0JcHJpdmF0ZSBMaXN0IHVubG9ja2VkUGx1Z2luczsgCi0JCi0JcHJpdmF0ZSBib29sZWFuIGVycm9yID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBNYXAgcmVuYW1lRWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIG92ZXJ3cml0ZSA9IGZhbHNlOwotCQotCXByaXZhdGUgSVN0YXR1cyBmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgeG1sUGF0aDsKLQotCXByaXZhdGUgWE1MTGlicmFyeSB4bWxMaWI7Ci0KLQlwcml2YXRlIFVtYUxpYnJhcnkgdW1hTGliOwotCi0JcHJpdmF0ZSBJbXBvcnRYTUxvZ2dlciBsb2dnZXIgPSBuZXcgSW1wb3J0WE1Mb2dnZXIoKTsKLQotCXByaXZhdGUgTGlzdCBkaXNjYXJkZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgRGlhZ3JhbUhhbmRsZXIgZGlhZ3JhbUhhbmRsZXI7Ci0JCi0JLy90ZHMgd2l0aCBzdGVwcwotCXByaXZhdGUgTWFwPFN0cmluZywgVGFza0Rlc2NyaXB0b3I+IHRkTWFwOwotCQotCS8vIG1hcCB4bWwgV29ya09yZGVyIHRvIHVtYSBXb3JrT3JkZXIKLQlNYXAgd29ya09yZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwcml2YXRlIElNaWdyYXRvciBtaWdyYXRvcjsKLQkKLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tCYXNlUGx1Z2lucyA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSW1wb3J0WE1MU2VydmljZSgpIHsKLQotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSB4bWwgZmlsZS4KLQkgKiBAcGFyYW0geG1sUGF0aAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZWVkcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBsb2FkWG1sKGZpbmFsIFN0cmluZyB4bWxQYXRoKSB7Ci0JCVN0cmluZyB2ZXJzaW9uRXJyb3IgPSB2ZXJzaW9uQ2hlY2soeG1sUGF0aCwJSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFdpemFyZF90aXRsZSk7CQkKLQkJaWYgKHZlcnNpb25FcnJvciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCQkKLQkJdGhpcy54bWxQYXRoID0geG1sUGF0aDsKLQotCQlsb2dnZXIubG9nTWVzc2FnZSgiTG9hZGluZyB4bWwgbGlicmFyeSAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMueG1sTGliID0gbmV3IFhNTExpYnJhcnkobnVsbCwgbG9nZ2VyLCB4bWxQYXRoKTsKLQkJCXRoaXMueG1sTGliLmxvYWQoKTsKLQkJCXJldCA9IGNoZWNrT2xkUGx1Z2lucygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKE5MUy5iaW5kKAotCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9sb2FkX3htbCwgeG1sUGF0aCksIGUpOwotCQkJZmluYWwgU3RyaW5nIGVyclN0ciA9IGUudG9TdHJpbmcoKTsKLQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsJCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewkKLQkJCQkJSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlOTFMuYmluZChFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9sb2FkX3htbCwgeG1sUGF0aCksIGVyclN0cik7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJCi0JCXJldHVybiByZXQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjaGVja09sZFBsdWdpbnMoKSB7Ci0JCQotCQl1bmxvY2tlZFBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZmlsZU5hbWVUb0NoZWNrID0gbmV3IEFycmF5TGlzdCgpOwotCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJTWFwIGd1aWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlMaXN0IGJhc2VQbHVnaW5zID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQkJCQkJCQkJCS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmFzZVBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbikgYmFzZVBsdWdpbnMuZ2V0KGkpOwotCQkJbWFwLnB1dChwbHVnaW4uZ2V0TmFtZSgpLCBwbHVnaW4pOwotCQkJZ3VpZE1hcC5wdXQocGx1Z2luLmdldEd1aWQoKSwgcGx1Z2luKTsKLQkJfQotCQkKLQkJTGlzdCBwbHVnaW5zID0gKChNZXRob2RMaWJyYXJ5KSB4bWxMaWIuZ2V0Um9vdCgpKS5nZXRNZXRob2RQbHVnaW4oKTsKLQkJTGlzdCBndWlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IChNZXRob2RFbGVtZW50KSBwbHVnaW5zLmdldChpKTsKLQkJCWd1aWRzLmFkZChlbGVtLmdldElkKCkpOwotCQkJCi0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luID0gCi0JCQkJKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luKSBtYXAuZ2V0KGVsZW0uZ2V0TmFtZSgpKTsKLQkJCWJvb2xlYW4gdG9BZGQgPSBmYWxzZTsKLQkJCWlmIChiYXNlUGx1Z2luICE9IG51bGwgJiYgISBiYXNlUGx1Z2luLmdldEd1aWQoKS5lcXVhbHMoZWxlbS5nZXRJZCgpKQotCQkJCQkmJiAhIGJhc2VQbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKSkgewotCQkJCXRvQWRkID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJYmFzZVBsdWdpbiA9IAotCQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4pIGd1aWRNYXAuZ2V0KGVsZW0uZ2V0SWQoKSk7Ci0JCQkJaWYgKGJhc2VQbHVnaW4gIT0gbnVsbCAvKiYmICEgYmFzZVBsdWdpbi5nZXROYW1lKCkuZXF1YWxzKGVsZW0uZ2V0TmFtZSgpKSovCi0JCQkJCQkmJiAhIGJhc2VQbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKSkgewotCQkJCQl0b0FkZCA9IHRydWU7Ci0JCQkJfSAKLQkJCX0KLQkJCWlmICh0b0FkZCkgewotCQkJCXVubG9ja2VkUGx1Z2lucy5hZGQoYmFzZVBsdWdpbi5nZXRHdWlkKCkpOwotCQkJCWJhc2VQbHVnaW4uc2V0VXNlckNoYW5nZWFibGUobmV3IEJvb2xlYW4odHJ1ZSkpOwotCQkJCVJlc291cmNlIHJlcyA9IGJhc2VQbHVnaW4uZVJlc291cmNlKCk7Ci0JCQkJaWYgKHJlcyAhPSBudWxsICYmIHJlcy5nZXRVUkkoKSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBmaWxlTmFtZSA9IHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQkJZmlsZU5hbWVUb0NoZWNrLmFkZChmaWxlTmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChmaWxlTmFtZVRvQ2hlY2suc2l6ZSgpID4gMCkgewotCQkJZmluYWwgTGlzdCBtb2RpZmllZEZpbGVzID0gZmlsZU5hbWVUb0NoZWNrOwkKLQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWZpbGVDaGVja2VkT3V0U3RhdHVzID0gRmlsZU1vZGlmeUNoZWNrZXIuY2hlY2tNb2RpZnkobW9kaWZpZWRGaWxlcyk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJCi0JCWlmICghIHVubG9ja2VkUGx1Z2lucy5pc0VtcHR5KCkgJiYgKGZpbGVDaGVja2VkT3V0U3RhdHVzICE9IG51bGwpCi0JCQkJJiYgIWZpbGVDaGVja2VkT3V0U3RhdHVzLmlzT0soKSkgewotCQkJLy8gbG9nIGVycm9yCi0JCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlTdHJpbmcgdGl0bGUgPSBJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MV2l6YXJkX3RpdGxlOyAKLQkJCQkJU3RyaW5nIG1zZyA9IEltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxTZXJ2aWNlX2ltcG9ydF9mYWlsZWQ7IAotCQkJCQluZXcgTXNnRGlhbG9nKEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkpCi0JCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIGZpbGVDaGVja2VkT3V0U3RhdHVzKTsKLQkJCQkJfQotCQkJfSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWZpbmFsIFBsdWdpbk1vZGlmeUluZm8gbW9kaWZ5SW5mbyA9IFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2UKLQkJCQkJCQkJCQkuY2hlY2tNb2RpZnkoZ3VpZHMsIE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSwgZmFsc2UpOwkJCi0KLQkJLy8gYWxsb3cgdXNlciB0byBwcm9jZWVkIHdpdGggbG9ja2VkIHBsdWdpbnMKLQkJaWYgKCBtb2RpZnlJbmZvLmxvY2tlZFBsdWdpbnMuc2l6ZSgpID4gMCApIHsKLQkJCWZpbmFsIGJvb2xlYW4gcmV0W10gPSBuZXcgYm9vbGVhblsxXTsKLQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCVN0cmluZyBXSVpBUkRfVElUTEUgPSBJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MV2l6YXJkX3RpdGxlOyAKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBtb2RpZnlJbmZvLmdldExvY2tlZE1lc3NhZ2UoKS50b1N0cmluZygpICsKLQkJCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRQbHVnaW5XaXphcmRfY29uZmlybV9jb250aW51ZTsgCi0JCQkJCXJldFswXSA9IEltcG9ydFhNTFBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUNvbmZpcm1hdGlvbihXSVpBUkRfVElUTEUsIG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0pOwkJCi0JCQlyZXR1cm4gcmV0WzBdOwotCQl9IAkJCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgbG9nIGZpbGUuCi0JICovCi0JcHVibGljIEZpbGUgZ2V0TG9nUGF0aCgpIHsKLQkJcmV0dXJuIGxvZ2dlci5nZXRMb2dQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQkJZGlzY2FyZGVkRWxlbWVudHMuY2xlYXIoKTsKLQkJd29ya09yZGVyTWFwLmNsZWFyKCk7Ci0JCWxvZ2dlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogRG9lcyBYTUwgZXhwb3J0LgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0ltcG9ydChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIHJlZnJlc2ggPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuaXNFbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlpZiAocmVmcmVzaCkgewotCQkJCS8vIGRpc2FibGUgcmVzb3VyY2UgcmVmcmVzaGluZyBkdXJpbmcgaW1wb3J0Ci0JCQkJLy8KLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCQkKLQkJCWhhbmRsZVR5cGVDaGFuZ2VzKCk7Ci0JCQkKLQkJCUlSZXNvdXJjZUhhbmRsZXIgaGFuZGxlciA9IG5ldyBJbXBvcnRSZXNvdXJjZUhhbmRsZXIobmV3IEZpbGUoCi0JCQkJCXhtbFBhdGgpLmdldFBhcmVudEZpbGUoKSwgbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpKSk7Ci0KLQkJCUNvbnRlbnRQcm9jZXNzb3IgY29udGVudFByb2MgPSBuZXcgQ29udGVudFByb2Nlc3NvcihoYW5kbGVyLAotCQkJCQl0aGlzLmxvZ2dlcik7Ci0JCQkKLQkJCWRpYWdyYW1IYW5kbGVyID0gbmV3IERpYWdyYW1IYW5kbGVyKG5ldyBGaWxlKAotCQkJCQl4bWxQYXRoKS5nZXRQYXJlbnRGaWxlKCksIG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpKSkgewkJCQkKLQkJCQkvL1swXTogc291cmNlRmlsZQotCQkJCS8vWzFdOiB0YXJnZXRGaWxlCi0JCQkJcHJvdGVjdGVkIEZpbGVbXSBnZXRGaWxlcyhvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQgZWxlbSkgewotCQkJCQlGaWxlW10gZmlsZXMgPSBzdXBlci5nZXRGaWxlcyhlbGVtLCBmYWxzZSk7Ci0JCQkJCQkJCQkJCi0JCQkJCUVEYXRhT2JqZWN0IHhtbE9iaiA9IHhtbExpYi5nZXRFbGVtZW50KGVsZW0uZ2V0R3VpZCgpKTsKLQkJCQkJaWYgKHhtbE9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MpIHsKLQkJCQkJCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgcHJvYyA9IAotCQkJCQkJCQkob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcykgeG1sT2JqOwotCQkJCQkJU3RyaW5nIHVyaSA9IHByb2MuZ2V0RGlhZ3JhbVVSSSgpOwotCQkJCQkJaWYgKHVyaSAhPSBudWxsICYmIHVyaS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShnZXRTb3VyY2VMaWJSb290KCksIHVyaSk7Ci0JCQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkxEOiBmaWxlOiAiICsgZmlsZSk7Ci0JCQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQkJZmlsZXNbMF0gPSBmaWxlOwotCQkJCQkJCQlmaWxlc1sxXSA9IG5ldyBGaWxlKGdldFRhcmdldExpYlJvb3QoKSwgdXJpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiTEQ6IGZpbGVzWzBdOiAiICsgZmlsZXNbMF0pOwotCQkJCQkJCX0KLQkJCQkJCX0JCQkJCQotCQkJCQl9Ci0JCQkJCQotCQkJCQlyZXR1cm4gZmlsZXM7Ci0JCQkJfQotCQkJCQotCQkJfTsKLQotCQkJdGhpcy54bWxMaWIuZml4TGlicmFyeUZvckltcG9ydCgpOwotCi0JCQkvLyBtYWtlIHN1cmUgYWxsIHRoZSBkZXBlbmRlbnQgcGx1Z2lucyBhcmUgdGhlcmUKLQkJCUxpc3QgcmVmZXJlbmNlZFBsdWdpbnMgPSB4bWxMaWIuZ2V0UmVmZXJlbmNlZFBsdWdpbnMoKTsKLQkJCWlmIChyZWZlcmVuY2VkUGx1Z2lucy5zaXplKCkgPiAwKSB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZQotCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQkJCUxpc3QgcGx1Z2lucyA9IGxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlTdHJpbmcgaWQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luKSBpdAotCQkJCQkJCQkubmV4dCgpKS5nZXRHdWlkKCk7Ci0JCQkJCQlyZWZlcmVuY2VkUGx1Z2lucy5yZW1vdmUoaWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoaXNDaGVja0Jhc2VQbHVnaW5zKCkgJiYgcmVmZXJlbmNlZFBsdWdpbnMuc2l6ZSgpID4gMCkgewotCQkJCSBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IHhtbExpYi5nZXRHdWlkVG9QbHVnTmFtZU1hcCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZWZlcmVuY2VkUGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCVN0cmluZyBuYW1lQW5kSWQgPSAiIjsJCS8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIGlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBuYW1lID0gbWFwLmdldChpZCk7Ci0JCQkJCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJbmFtZUFuZElkICs9IG5hbWUgKyAiLCAiOy8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQluYW1lQW5kSWQgKz0gaWQ7Ci0JCQkJCWxvZ2dlci5sb2dFcnJvcihOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MU2VydmljZV9taXNzaW5nX3BsdWdpbiwgbmFtZUFuZElkKSwKLQkJCQkJCQludWxsKTsJCQkKLQkJCQl9Ci0KLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKAotCQkJCQkJSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFNlcnZpY2VfZXJyb3JfbWlzc2luZ19wbHVnaW5zKTsKLQkJCX0KLQotCQkJdGhpcy51bWFMaWIgPSBuZXcgVW1hTGlicmFyeShyZW5hbWVFbGVtZW50TWFwLCBjb250ZW50UHJvYywgbG9nZ2VyLCBvdmVyd3JpdGUpOwotCi0JCQlFRGF0YU9iamVjdCB4bWxSb290ID0gdGhpcy54bWxMaWIuZ2V0Um9vdCgpOwotCQkJRURhdGFPYmplY3QgdW1hUm9vdCA9IHRoaXMudW1hTGliLmdldFJvb3QoKTsKLQkJCQotCQkJbG9nZ2VyLmxvZ01lc3NhZ2UoImNyZWF0ZSB0YXJnZXQgbGlicmFyeSBlbGVtZW50cyAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRFRGF0YU9iamVjdFRyZWUoeG1sUm9vdCwgdW1hUm9vdCk7Ci0KLQkJCWxvZ2dlcgotCQkJCQkubG9nTWVzc2FnZSgiY29weWluZyBhbGwgZmVhdHVyZSB2YWx1ZXMgZm9yIHRhcmdldCBsaWJyYXJ5IGVsZW1lbnRzIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQlpdGVyYXRFRGF0YU9iamVjdCgoTWV0aG9kRWxlbWVudCkgeG1sUm9vdCk7Ci0KLQkJCWxvZ2dlci5sb2dNZXNzYWdlKCJmaXggdGhlIHRhcmdldCBsaWJyYXJ5IC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQl1bWFMaWIuZml4TGlicmFyeSgpOwotCQkJdW1hTGliLmZpeFRhc2tEZXNjcmlwdG9ycyh0ZE1hcCk7Ci0KLQkJCUxpYnJhcnlJbXBvcnRNYW5hZ2VyLmhhbmRsZU5hbWVSZXBsYWNlKHJlbmFtZUVsZW1lbnRNYXApOwotCQkJCi0JCQlkaWFncmFtSGFuZGxlci5wb3N0UmVnaXN0ZXJFbGVtZW50cygpOwotCQkJCi0JCQkvLyBkZWxldGUgdGhlIHVuLW5lZWRlZCBlbGVtZW50cwotCQkJbG9nZ2VyLmxvZ01lc3NhZ2UoImRlbGV0ZSB1bm5lZWRlZCBlbGVtZW50cyAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJdW1hTGliLmRlbGV0ZUVsZW1lbnRzKCk7Ci0JCQkKLQkJCWZpbmFsIExpc3QgbW9kaWZpZWRGaWxlcyA9IEZpbGVNb2RpZnlDaGVja2VyLmdldE1vZGlmaWVkRmlsZXMoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS4KLQkJCQkJCQkJCQlnZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpOwotCQkJbW9kaWZpZWRGaWxlcy5hZGRBbGwoZGlhZ3JhbUhhbmRsZXIuZ2V0TW9kaWZpZWRGaWxlcygpKTsKLQkJCWZpbmFsIElTdGF0dXMgZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBGaWxlTW9kaWZ5Q2hlY2tlci5zeW5jRXhlY0NoZWNrTW9kaWZ5KG1vZGlmaWVkRmlsZXMpOwotCQkJCi0JCQlpZiAoZmlsZUNoZWNrZWRPdXRTdGF0dXMuaXNPSygpKSB7Ci0JCQkKLQkJCQlsb2dnZXIubG9nTWVzc2FnZSgic2F2aW5nIHRhcmdldCBsaWJyYXJ5IC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCi0JCQkJTGlzdCBjb25maWdzID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQkJCWludCBjb25maWdTeiA9IGNvbmZpZ3MgPT0gbnVsbCA/IDAgOiBjb25maWdzLnNpemUoKTsKLQkJCQlmb3IgKGludCBpPTA7IGk8Y29uZmlnU3o7IGkrKykgewotCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gCi0JCQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uICkgY29uZmlncy5nZXQoaSk7Ci0JCQkJCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihudWxsLCBjb25maWcpOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoY29uZmlnU3ogIT0gMCkgewotCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkgY3VyckxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGN1cnJMaWIuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSkuZ2V0UGVyc2lzdGVyKCk7Ci0JCQkJCWlmIChwZXJzaXN0ZXIgaW5zdGFuY2VvZiBJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcikgewotCQkJCQkJSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgaXAgPSAoSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpIHBlcnNpc3RlcjsKLQkJCQkJCUZpbGUgY29uZmlnRm9sZGVyID0gaXAuZ2V0RGVmYXVsdE1ldGhvZENvbmZpZ3VyYXRpb25Gb2xkZXIoY3VyckxpYik7Ci0JCQkJCQlpZiAoY29uZmlnRm9sZGVyICE9IG51bGwpIHsKLQkJCQkJCQlpcC5zZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihjdXJyTGliLCBjb25maWdGb2xkZXIpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKAotCQkJCQkJCQkJSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFNlcnZpY2VfaW1wb3J0X2ZhaWxlZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJLy8gZG9uJ3QgcmVmcmVzaCB0aGUgd29ya3NwYWNlCi0JCQkJaWYgKHVubG9ja2VkUGx1Z2lucyAhPSBudWxsICYmICEgdW5sb2NrZWRQbHVnaW5zLmlzRW1wdHkoKSkgewotCQkJCQlMaWJyYXJ5SW1wb3J0TWFuYWdlci5sb2NrVW5sb2NrZWRQbHVnaW5zKHVubG9ja2VkUGx1Z2lucyk7Ci0JCQkJfQotCQkJCUxpYnJhcnlVdGlsLnNhdmVMaWJyYXJ5KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBmYWxzZSwgZmFsc2UpOwotCQkJCWRpYWdyYW1IYW5kbGVyLmV4ZWN1dGUoKTsJCQkJCi0JCi0JCQkJbG9nZ2VyLmxvZ01lc3NhZ2UoInJlLW9wZW4gdGFyZ2V0IGxpYnJhcnkgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlb3BlbkN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJaWYgKG1pZ3JhdG9yICE9IG51bGwpIHsKLQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQkJbWlncmF0b3IubWlncmF0ZVhtbEltcG9ydGVkTGliKGxpYiwgbW9uaXRvcik7CQkJCQkKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCX0KLQkJCQkJCi0JCQkJbG9nZ2VyLmxvZ01lc3NhZ2UoImltcG9ydCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJU3RyaW5nIHRpdGxlID0gSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFdpemFyZF90aXRsZTsgCi0JCQkJCQlTdHJpbmcgbXNnID0gSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFNlcnZpY2VfaW1wb3J0X2ZhaWxlZDsgCi0JCQkJCQluZXcgTXNnRGlhbG9nKEltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkpCi0JCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnLCBmaWxlQ2hlY2tlZE91dFN0YXR1cyk7Ci0JCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9CQotCQkJCQkJCi0JCQkvL1Jlc291cmNlVXRpbC5yZWZyZXNoUmVzb3VyY2VzKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCS8vCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwgbW9uaXRvcik7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcihOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MU2VydmljZV9pbXBvcnRfZmFpbGVkLCBlLmdldE1lc3NhZ2UoKSksIGUpOwotCi0JCQl0aHJvdyBlOwotCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVmcmVzaCkgewotCQkJCS8vIHJlLWVuYWJsZSByZXNvdXJjZSByZWZyZXNoaW5nCi0JCQkJLy8KLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdEVEYXRhT2JqZWN0VHJlZShFRGF0YU9iamVjdCB4bWxPYmosIEVEYXRhT2JqZWN0IHVtYU9iaikgewotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSB4bWxPYmouZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRURhdGFPYmplY3QgY2hpbGQgPSAoRURhdGFPYmplY3QpIGl0Lm5leHQoKTsKLQkJCWNyZWF0ZVJtY09iamVjdChjaGlsZCwgdW1hT2JqKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVSbWNPYmplY3QoRURhdGFPYmplY3QgeG1sRWxlbWVudCwKLQkJCUVEYXRhT2JqZWN0IHRhcmdldENvbnRhaW5lcikgewotCQlpZiAoeG1sRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIGdldCB0aGUgdGFyZ2V0Q29udGFpbmVyJ3MgY29udGFpbmluZyBmZWF0dXJlCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0geG1sRWxlbWVudC5lQ29udGFpbm1lbnRGZWF0dXJlKCk7Ci0JCWNyZWF0ZVJtY09iamVjdCh4bWxFbGVtZW50LCB0YXJnZXRDb250YWluZXIsIGZlYXR1cmUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlUm1jT2JqZWN0KEVEYXRhT2JqZWN0IHhtbEVsZW1lbnQsCi0JCQlFRGF0YU9iamVjdCB0YXJnZXRDb250YWluZXIsIFN0cmluZyBjb250YWlubWVudFhtbEZlYXR1cmUpIHsKLQotCQl0cnkgewotCQkJaWYgKHhtbEVsZW1lbnQgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJRURhdGFPYmplY3QgdW1hRWxlbWVudCA9IG51bGw7Ci0KLQkJCS8vIGRvbid0IGNyZWF0ZSBjb250ZW50IGNhdGVnb3J5IHBhY2thZ2Ugc2luY2UgaW4gdW1hLCBpdCdzCi0JCQkvLyBzZXBlcmF0ZWQgYmFzZWQgb24gdHlwZQotCQkJaWYgKHhtbEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgeG1sRWxlbWVudDsKLQkJCQl1bWFFbGVtZW50ID0gdW1hTGliLmNyZWF0ZU1ldGhvZFBsdWdpbihwbHVnaW4uZ2V0SWQoKSwgcGx1Z2luCi0JCQkJCQkuZ2V0TmFtZSgpKTsKLQkJCX0gZWxzZSBpZiAoeG1sRWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UpIHsKLQkJCQkvLyBkb24ndCBjcmVhdGUsIGRvIG5vdGhpbmcKLQkJCQkvLyBtYXJrIGFzIGRpc2NhcmRlZCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNvcHkgaXQncyBhdHRyaWJ1dGVzCi0JCQkJc2V0RGlzY2FyZGVkKCgoQ29udGVudENhdGVnb3J5UGFja2FnZSkgeG1sRWxlbWVudCkuZ2V0SWQoKSk7Ci0KLQkJCX0gZWxzZSBpZiAoKHhtbEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpCi0JCQkJCSYmICEoeG1sRWxlbWVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBEb21haW4gCi0JCQkJCQkJfHwgeG1sRWxlbWVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKQotCQkJCQl8fCAoeG1sRWxlbWVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKSkgewotCQkJCS8vIGNyZWF0ZSB0aGUgY29udGVudCBjYXRlZ29yaWVzIGZvciByb290IGNvbnRlbnQgY2F0ZWdvcmllcywKLQkJCQkvLyBub3QgZm9yIHN1Yi1kb21haW4gYW5kIHN1Yi1kaXNjaXBsaW5lCi0JCQkJLy8gMTU0MTQzIC0gaW1wb3J0IHhtbCBkaWQgbm90IHJlc2VydmUgdGhlIHN1Yi1kaXNjaXBsaW5lIHN0cnVjdHVyZQotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGdldFBsdWdpbih4bWxFbGVtZW50KS5nZXRJZCgpOwotCQkJCXVtYUVsZW1lbnQgPSB1bWFMaWIuY3JlYXRlQ29udGVudENhdGVnb3J5KHBsdWdpbklkLCB4bWxFbGVtZW50Ci0JCQkJCQkuZUNsYXNzKCkuZ2V0TmFtZSgpLCB4bWxFbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCksCi0JCQkJCQl4bWxMaWIuZ2V0RWxlbWVudElkKHhtbEVsZW1lbnQpKTsKLQkJCX0gZWxzZSB7Ci0KLQkJCQkvLyBpZiB0aGlzIGlzIHJvb3QgbGV2ZWwgcGFja2FnZSwgZmluZCB0aGUgY29ycmVzcG9uZGluZwotCQkJCS8vIGNvbnRhaW5lciBmb3IgdGhlIFVNQSBvYmplY3QKLQkJCQlpZiAoeG1sRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UKLQkJCQkJCSYmIHhtbEVsZW1lbnQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCWlmICh4bWxFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQkJCXRhcmdldENvbnRhaW5lciA9IHVtYUxpYgotCQkJCQkJCQkuZ2V0Q29udGVudFJvb3RQYWNrYWdlKHRhcmdldENvbnRhaW5lcik7Ci0JCQkJCX0gZWxzZSBpZiAoeG1sRWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCU9iamVjdCBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSB4bWxFbGVtZW50KQotCQkJCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJCQkJaWYgKHByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQkJCXRhcmdldENvbnRhaW5lciA9IHVtYUxpYgotCQkJCQkJCQkJLmdldENhcGFiaWxpdHlQYXR0ZXJuUm9vdFBhY2thZ2UodGFyZ2V0Q29udGFpbmVyKTsKLQkJCQkJCX0gZWxzZSBpZiAocHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQkJCXRhcmdldENvbnRhaW5lciA9IHVtYUxpYgotCQkJCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc1Jvb3RQYWNrYWdlKHRhcmdldENvbnRhaW5lcik7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoeG1sRWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJCQlMaXN0IHByb2NzID0geG1sTGliCi0JCQkJCQkJCS5nZXRBbGxQcm9jZXNzZXMoKE1ldGhvZFBhY2thZ2UpIHhtbEVsZW1lbnQpOwotCQkJCQkJaWYgKHByb2NzICE9IG51bGwgJiYgcHJvY3Muc2l6ZSgpID4gMCkgewotCQkJCQkJCU9iamVjdCBwcm9jID0gcHJvY3MuZ2V0KDApOwotCQkJCQkJCWlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQkJCQkJdGFyZ2V0Q29udGFpbmVyID0gdW1hTGliCi0JCQkJCQkJCQkJLmdldENhcGFiaWxpdHlQYXR0ZXJuUm9vdFBhY2thZ2UodGFyZ2V0Q29udGFpbmVyKTsKLQkJCQkJCQl9IGVsc2UgaWYgKHByb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJCQkJdGFyZ2V0Q29udGFpbmVyID0gdW1hTGliCi0JCQkJCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc1Jvb3RQYWNrYWdlKHRhcmdldENvbnRhaW5lcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmICh0YXJnZXRDb250YWluZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yICYmCi0JCQkJCWNvbnRhaW5tZW50WG1sRmVhdHVyZS5lcXVhbHMoInN0ZXAiKSkgewkvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gZ2V0IHRoZSBjb250YWlubWVudCBmZWF0dXJlIHNvIHdlIGNhbiBjcmVhdGUgdGhlIG9iamVjdCBvZgotCQkJCS8vIHRoZSBzYW1lIHR5cGUKLQkJCQl1bWFFbGVtZW50ID0gdW1hTGliLmNyZWF0ZUVsZW1lbnQodGFyZ2V0Q29udGFpbmVyLAotCQkJCQkJY29udGFpbm1lbnRYbWxGZWF0dXJlLCB4bWxFbGVtZW50LmVDbGFzcygpLmdldE5hbWUoKSwKLQkJCQkJCXhtbEVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKSwgeG1sTGliCi0JCQkJCQkJCS5nZXRFbGVtZW50SWQoeG1sRWxlbWVudCkpOwotCQkJCQotCQkJCWlmICh4bWxFbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIHhtbEVsZW1lbnQ7Ci0JCQkJCWlmICh0ZC5nZXRUYXNrKCkgIT0gbnVsbCkgewotCQkJCQkJTGlzdCBzdGVwcyA9IHRkLmdldFN0ZXAoKTsKLQkJCQkJCWlmIChzdGVwcyAhPSBudWxsICYmICFzdGVwcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQlpZiAodGRNYXAgPT0gbnVsbCkgewotCQkJCQkJCQl0ZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgVGFza0Rlc2NyaXB0b3I+KCk7Ci0JCQkJCQkJfQotCQkJCQkJCXRkTWFwLnB1dCh0ZC5nZXRJZCgpLCB0ZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyB4bWwgV29ya09yZGVyIGRvZXMgbm90IGhhdmUgYW4gaWQsIG5lZWQgdG8gbWFwIHRoZSB1bWEgT2JqZWN0Ci0JCQkJaWYgKHhtbEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkJCQkJd29ya09yZGVyTWFwLnB1dCh4bWxFbGVtZW50LCB1bWFFbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHJlY3Vyc2l2ZSwKLQkJCS8vIG5vdGUsIHVtYSBlbGVtZW50IG1pZ2h0IGJlIG51bGwgc2luY2Ugd2UgY2FuJ3QgZGV0ZXJtaW5lIHRoZQotCQkJLy8gb3duZXIgb2YgdGhlIGVsZW1lbnQgeWV0Ci0JCQljcmVhdEVEYXRhT2JqZWN0VHJlZSh4bWxFbGVtZW50LCB1bWFFbGVtZW50KTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIHRoZSBlcnJvciBhbmQgY29udGludWU/Pz8KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE1ldGhvZFBsdWdpbiBnZXRQbHVnaW4oRU9iamVjdCBlbGVtZW50KSB7Ci0JCXdoaWxlICgoZWxlbWVudCAhPSBudWxsKSAmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCQllbGVtZW50ID0gZWxlbWVudC5lQ29udGFpbmVyKCk7Ci0JCX0KLQotCQlyZXR1cm4gKE1ldGhvZFBsdWdpbikgZWxlbWVudDsKLQl9Ci0KLQlwcml2YXRlIEVEYXRhT2JqZWN0IGdldFJtY09iamVjdChNZXRob2RFbGVtZW50IHhtbE9iaikgewotCQlpZiAoeG1sT2JqIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJcmV0dXJuIHVtYUxpYi5nZXRSb290KCk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgaWQgPSB4bWxPYmouZ2V0SWQoKTsKLQkJCXJldHVybiB0aGlzLnVtYUxpYi5nZXRFbGVtZW50KGlkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpdGVyYXRFRGF0YU9iamVjdChNZXRob2RFbGVtZW50IHNyY09iaikgewotCQlpdGVyYXRFRGF0YU9iamVjdF8oc3JjT2JqKTsKLQkJRURhdGFPYmplY3QgdGFyZ2V0T2JqID0gZ2V0Um1jT2JqZWN0KHNyY09iaik7Ci0JCWlmICh0YXJnZXRPYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpIHsKLQkJCWRpYWdyYW1IYW5kbGVyLnJlZ2lzdGVyRWxlbWVudCgob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KSB0YXJnZXRPYmopOyAKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaXRlcmF0RURhdGFPYmplY3RfKE1ldGhvZEVsZW1lbnQgc3JjT2JqKSB7Ci0KLQkJbG9nZ2VyCi0JCQkJLmxvZ01lc3NhZ2UoIiA9PT0gcHJvY2Vzc2luZyBlbGVtZW50ICIgKyBzcmNPYmouZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6ICIgKyBzcmNPYmouZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaWYgKGlzUHJvY2Vzc2VkKHNyY09iai5nZXRJZCgpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXNldFByb2Nlc3NlZChzcmNPYmouZ2V0SWQoKSk7Ci0KLQkJLy8gaWYgb2JqZWN0IGlzIG5vdCBjcmVhdGVkLCBpdCdzIHhtbCB3cmFwcGVyIHBhY2thZ2UKLQkJaWYgKHNyY09iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UpIHsKLQotCQkJLy8gaXRlcmF0ZSB0aGUgY2hpbGQgcGFja2FnZXMKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSAoKENvbnRlbnRDYXRlZ29yeVBhY2thZ2UpIHNyY09iaikKLQkJCQkJLmdldENvbnRlbnRDYXRlZ29yeSgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlpdGVyYXRFRGF0YU9iamVjdCgoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCUVEYXRhT2JqZWN0IHRhcmdldE9iaiA9IGdldFJtY09iamVjdChzcmNPYmopOwotCQlFQ2xhc3MgZUNsYXNzID0gc3JjT2JqLmVDbGFzcygpOwotCi0JCUVMaXN0IGZlYXR1cmVzID0gZUNsYXNzLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJYm9vbGVhbiBpc05ld0VsZW1lbnQgPSB1bWFMaWIuaXNOZXdFbGVtZW50KHNyY09iai5nZXRJZCgpKSB8fCBzcmNPYmogaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5OwotCQlib29sZWFuIGlzT2xkUGx1Z2luID0gIWlzTmV3RWxlbWVudCAmJiAoc3JjT2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKTsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0Lm5leHQoKTsKLQkJCQkJCQotCQkJaWYgKEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmlzVW5uZWVkZWRYbWxGZWF0dXJlKGZlYXR1cmUuZ2V0TmFtZSgpKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGlzT2xkUGx1Z2luICYmIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpID09IGZlYXR1cmUpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJT2JqZWN0IHZhbHVlID0gc3JjT2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQl0cnkgewotCQkJCWJvb2xlYW4gaXNNZXAgPSBmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoIm1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIpOyAvLyROT04tTkxTLTEkCQotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QgJiYgISBpc01lcCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0diA9ICgoTGlzdCkgdmFsdWUpLml0ZXJhdG9yKCk7IGl0dgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3Qgc3JjX3ZhbHVlID0gaXR2Lm5leHQoKTsKLQotCQkJCQkJaWYgKHNyY192YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCi0JCQkJCQkJLy8gaXQncyBhbiBpZCByZWZlcmVuY2UKLQkJCQkJCQl1bWFMaWIuc2V0UmVmZXJlbmNlVmFsdWUodGFyZ2V0T2JqLCBmZWF0dXJlCi0JCQkJCQkJCQkuZ2V0TmFtZSgpLCAoU3RyaW5nKSBzcmNfdmFsdWUpOwotCQkJCQkJfSBlbHNlIGlmIChzcmNfdmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQkJLy8gc2V0IHRoZSByZWZlcmVuY2UKLQkJCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgc3JjX3ZhbHVlOwotCQkJCQkJCVN0cmluZyBndWlkID0gZS5nZXRJZCgpOwotCi0JCQkJCQkJLy8gZG9uJ3Qgc2V0IHRoZSBjb250YWlubWVudCBmZWF0dXJlIHZhbHVlIHNpbmNlCi0JCQkJCQkJLy8gaXQncyBhbHJlYWR5IGhhbmRsZWQKLQkJCQkJCQkvLyB3aGVuIGNyZWF0aW5nIHRoZSBsaWJyYXJ5IHN0cnVjdHVyZQotCQkJCQkJCWlmICghaXNEaXNjYXJkZWQoZ3VpZCkgJiYgZS5lQ29udGFpbmVyKCkgIT0gc3JjT2JqKSB7Ci0JCQkJCQkJCXVtYUxpYi5zZXRSZWZlcmVuY2VWYWx1ZSh0YXJnZXRPYmosIGZlYXR1cmUKLQkJCQkJCQkJCQkuZ2V0TmFtZSgpLCBndWlkKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlpdGVyYXRFRGF0YU9iamVjdCgoTWV0aG9kRWxlbWVudCkgc3JjX3ZhbHVlKTsKLQkJCQkJCX0gZWxzZSBpZiAoc3JjX3ZhbHVlIGluc3RhbmNlb2YgV29ya09yZGVyKSB7Ci0JCQkJCQkJLy8gV29ya09yZGVyIGlzIG5vdCBtZXRob2QgZWxlbWVudCBhbmQgZG9lcyBub3QgaGF2ZQotCQkJCQkJCS8vIGFuIGlkLCBuZWVkIHNwZWNpYWwgaGFuZGxpbmcKLQkJCQkJCQkvLyBzZXQgdGhlIHByZWRlCi0JCQkJCQkJV29ya09yZGVyIHdyID0gKFdvcmtPcmRlcikgc3JjX3ZhbHVlOwotCQkJCQkJCU9iamVjdCB1bWFXciA9IHdvcmtPcmRlck1hcC5nZXQod3IpOwotCQkJCQkJCXVtYUxpYi5zZXRXb3JrT3JkZXIodW1hV3IsIHdyLmdldFZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlsb2dnZXIKLQkJCQkJCQkJCS5sb2dNZXNzYWdlKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfbm90X2hhbmRsZWQsIHNyY192YWx1ZSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSAmJiAhIGlzTWVwKSB7Ci0KLQkJCQkJLy8gZ2V0IHRoZSB4bWwgb2JqZWN0IGFuZCBpdGVyYXRlIGFnYWluCi0JCQkJCU9iamVjdCBzcmNfdmFsdWUgPSB2YWx1ZTsKLQotCQkJCQlpZiAoc3JjX3ZhbHVlIGluc3RhbmNlb2YgV29ya09yZGVyKSB7Ci0JCQkJCQlsb2dnZXIubG9nTWVzc2FnZSgid29ya29yZGVyIHZhbHVlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBlbHNlIGlmIChzcmNfdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcKLQkJCQkJCQkmJiAhaXNEaXNjYXJkZWQoKFN0cmluZykgc3JjX3ZhbHVlKSkgewotCQkJCQkJLy8gaXQncyBhbiBpZCByZWZlcmVuY2UKLQkJCQkJCXVtYUxpYi5zZXRSZWZlcmVuY2VWYWx1ZSh0YXJnZXRPYmosIGZlYXR1cmUuZ2V0TmFtZSgpLAotCQkJCQkJCQkoU3RyaW5nKSBzcmNfdmFsdWUpOwotCQkJCQl9IGVsc2UgaWYgKHNyY192YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCS8vIHNldCB0aGUgcmVmZXJlbmNlCi0JCQkJCQlTdHJpbmcgZ3VpZCA9ICgoTWV0aG9kRWxlbWVudCkgc3JjX3ZhbHVlKS5nZXRJZCgpOwotCQkJCQkJaWYgKGd1aWQgPT0gbnVsbCkgewotCQkJCQkJCWxvZ2dlcgotCQkJCQkJCQkJLmxvZ1dhcm5pbmcoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF93aXRob3V0X2lkLCAoKE1ldGhvZEVsZW1lbnQpIHNyY192YWx1ZSkKLQkJCQkJCQkJCS5nZXROYW1lKCkpKTsKLQkJCQkJCX0KLQkJCQkJCWlmICghaXNEaXNjYXJkZWQoZ3VpZCkpIHsKLQkJCQkJCQl1bWFMaWIuc2V0UmVmZXJlbmNlVmFsdWUodGFyZ2V0T2JqLCBmZWF0dXJlCi0JCQkJCQkJCQkuZ2V0TmFtZSgpLCBndWlkKTsKLQkJCQkJCX0KLQkJCQkJCWl0ZXJhdEVEYXRhT2JqZWN0KChNZXRob2RFbGVtZW50KSBzcmNfdmFsdWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbG9nZ2VyCi0JCQkJCQkJCS5sb2dXYXJuaW5nKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfbm90X2hhbmRsZWQsIHNyY192YWx1ZSkpOwotCQkJCQl9Ci0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAodGFyZ2V0T2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5UGFja2FnZSkgewotCQkJCQkJbG9nZ2VyLmxvZ01lc3NhZ2UoImhycmUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgV29ya09yZGVyVHlwZSkgewotCQkJCQkJdmFsdWUgPSAoKFdvcmtPcmRlclR5cGUpIHZhbHVlKS5nZXROYW1lKCk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWJvb2xlYW4gcmVuYW1lID0gZmFsc2U7Ci0JCQkJCWlmICghaXNOZXdFbGVtZW50ICYmIGZlYXR1cmUgPT0gb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSkgewotCQkJCQkJU3RyaW5nIG9sZE5hbWUgPSAoU3RyaW5nKXRhcmdldE9iai5lR2V0KG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQkJCQlTdHJpbmcgbmV3TmFtZSA9IChTdHJpbmcpc3JjT2JqLmVHZXQoZmVhdHVyZSk7CQkJCQotCQkJCQkJaWYgKCFuZXdOYW1lLmVxdWFscyhvbGROYW1lKSkgewotCQkJCQkJCUxpYnJhcnlJbXBvcnRNYW5hZ2VyLmVuc3VyZVVuaXF1ZU5hbWVGb3JFeGlzdGluZ0VsZW1lbnQKLQkJCQkJCQkJKChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpIHRhcmdldE9iaiwgb2xkTmFtZSwgbmV3TmFtZSwgcmVuYW1lRWxlbWVudE1hcCk7Ci0JCQkJCQkJcmVuYW1lID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIXJlbmFtZSkgewotCQkJCQkJdW1hTGliLnNldEF0cmlidXRlRmVhdHVyZVZhbHVlKHRhcmdldE9iaiwKLQkJCQkJCQkJZmVhdHVyZS5nZXROYW1lKCksIHZhbHVlKTsKLQkJCQkJfQotCQkJCQlpZiAoaXNOZXdFbGVtZW50ICYmIGZlYXR1cmUgPT0gb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSkgewotCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50IGVsZW0gPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KSB0YXJnZXRPYmo7Ci0JCQkJCQlFT2JqZWN0IGNlb2JqID0gZWxlbS5lQ29udGFpbmVyKCk7CQkJCQkJCi0JCQkJCQlpZiAoY2VvYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQgJiYgCi0JCQkJCQkJCSEgdW1hTGliLmlzTmV3RWxlbWVudCgoKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkgY2VvYmopLmdldEd1aWQoKSkpIHsKLQkJCQkJCQlMaWJyYXJ5SW1wb3J0TWFuYWdlci5lbnN1cmVVbmlxdWVOYW1lKGNlb2JqLCBlbGVtLCByZW5hbWVFbGVtZW50TWFwKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBsb2cgdGhlIGVycm9yIGFuZCBjb250aW51ZT8/PwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0KLQkJfQotCi0JfQotCi0JLy8gZ29pZCBvZiBwcm9jZXNzZWQgZWxlbWVudAotCXByaXZhdGUgTGlzdCBwcm9jZXNzZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1Byb2Nlc3NlZChTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gcHJvY2Vzc2VkRWxlbWVudHMuY29udGFpbnMoZ3VpZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFByb2Nlc3NlZChTdHJpbmcgZ3VpZCkgewotCQlpZiAoIXByb2Nlc3NlZEVsZW1lbnRzLmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQlwcm9jZXNzZWRFbGVtZW50cy5hZGQoZ3VpZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEaXNjYXJkZWQoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBkaXNjYXJkZWRFbGVtZW50cy5jb250YWlucyhpZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERpc2NhcmRlZChTdHJpbmcgaWQpIHsKLQkJZGlzY2FyZGVkRWxlbWVudHMuYWRkKGlkKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyBvdmVyd3JpdGUgYXR0cmlidXRlLgotCSAqIEBwYXJhbSBiCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcndyaXRlKGJvb2xlYW4gYikgewotCQlvdmVyd3JpdGUgPSBiOwotCX0JCi0JCi0JcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbkNoZWNrKGZpbmFsIFN0cmluZyB4bWxQYXRoLCBmaW5hbCBTdHJpbmcgdGl0bGUpIHsKLQkJZmluYWwgU3RyaW5nW10gcmV0ID0gbmV3IFN0cmluZ1sxXTsKLQkJcmV0WzBdID0gbnVsbDsKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewkKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsJCQkJCi0JCQkJVmVyc2lvblV0aWwuVmVyc2lvbkNoZWNrSW5mbyBpbmZvID0gVmVyc2lvblV0aWwuY2hlY2tYTUxWZXJzaW9uKG5ldyBGaWxlKHhtbFBhdGgpKTsKLQkJCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQkJCXJldFswXSA9IE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duLCBuZXcgT2JqZWN0W10gewotCQkJCQkJCVBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsJCQkJCQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChpbmZvLnJlc3VsdCA8IDApIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbWlncmF0b3IgPSBNYXBwaW5nVXRpbC5nZXRNaWdyYXRvckJ5TGliUGF0aCh4bWxQYXRoKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJcmV0WzBdID0gZS50b1N0cmluZygpOwotCQkJCQkJfQotCQkJCQkJaWYgKG1pZ3JhdG9yID09IG51bGwgJiYgcmV0WzBdID09IG51bGwpIHsKLQkJCQkJCQlpZiAoaW5mby50b29sSUQuZXF1YWxzKFZlcnNpb25VdGlsLmdldFByaW1hcnlUb29sSUQoKSkpIHsKLQkJCQkJCQkJcmV0WzBdID0gTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaF9vbGREYXRhLCBuZXcgT2JqZWN0W10gewotCQkJCQkJCQkJCWluZm8udG9vbFZlcnNpb24sIFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93biwgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQlQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpfSk7CQkJCQkKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoaW5mby5yZXN1bHQgPiAwKSB7Ci0JCQkJCQlpZiAoaW5mby50b29sSUQuZXF1YWxzKFZlcnNpb25VdGlsLmdldFByaW1hcnlUb29sSUQoKSkpIHsKLQkJCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZFRvb2wsIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCWluZm8udG9vbFZlcnNpb24sIFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmV0WzBdID0gTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd24sIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQlQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpfSk7Ci0JCQkJCQl9Ci0JCQkJCX0gCi0JCQkJfQotCQkJCWlmIChyZXRbMF0gIT0gbnVsbCkgewotCQkJCQlJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwgcmV0WzBdKTsJCQkJCQotCQkJCX0KLQkJCX0KLQkJfSk7CQkKLQkJcmV0dXJuIHJldFswXTsKLQl9Ci0JCi0JIHB1YmxpYyB2b2lkIGhhbmRsZVR5cGVDaGFuZ2VzKCkgewotCQlvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkgYmFzZUxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlIYXNoTWFwIGJhc2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5jb2xsZWN0UG90ZW50aWFsVHlwZUNoYW5nZWQoYmFzZUxpYiwgYmFzZU1hcCk7Ci0JCQotCQlIYXNoTWFwIGVDbGFzc09iak1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUhhc2hNYXAgaW1wb3J0TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHhtbExpYi5nZXRSb290KCkuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UgfHwKLQkJCQlvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCU1ldGhvZEVsZW1lbnQgeG1sRWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQkJU3RyaW5nIGVDbGFzc05hbWUgPSB4bWxFbGVtZW50LmVDbGFzcygpLmdldE5hbWUoKTsKLQkJCQlPYmplY3QgZUNsYXNzT2JqID0gZUNsYXNzT2JqTWFwLmdldChlQ2xhc3NOYW1lKTsKLQkJCQlpZiAoZUNsYXNzT2JqID09IG51bGwpIHsKLQkJCQkJRUNsYXNzIG9iakVDbGFzcyA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFJtY0VDbGFzcyhlQ2xhc3NOYW1lKTsKLQkJCQkJaWYgKG9iakVDbGFzcyAhPSBudWxsKSB7Ci0JCQkJCQllQ2xhc3NPYmogPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUob2JqRUNsYXNzKTsKLQkJCQkJCWVDbGFzc09iak1hcC5wdXQoZUNsYXNzTmFtZSwgZUNsYXNzT2JqKTsJCi0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGVDbGFzc09iaiAhPSBudWxsKSB7Ci0JCQkJCWltcG9ydE1hcC5wdXQoeG1sRWxlbWVudC5nZXRJZCgpLCBlQ2xhc3NPYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UuaGFuZGxlVHlwZUNoYW5nZXMoYmFzZU1hcCwgaW1wb3J0TWFwKTsJCi0JfQotCSAKLQlwcml2YXRlIGJvb2xlYW4gaXNDaGVja0Jhc2VQbHVnaW5zKCkgewotCQlyZXR1cm4gY2hlY2tCYXNlUGx1Z2luczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGVja0Jhc2VQbHVnaW5zKGJvb2xlYW4gY2hlY2tCYXNlUGx1Z2lucykgewotCQl0aGlzLmNoZWNrQmFzZVBsdWdpbnMgPSBjaGVja0Jhc2VQbHVnaW5zOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9JbXBvcnRYTUxvZ2dlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL0ltcG9ydFhNTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MmQwZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL0ltcG9ydFhNTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5GaWxlTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotCi0vKioKLSAqIExvZ2dlciBjbGFzcyBmb3IgeG1sIGltcG9ydAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0WE1Mb2dnZXIgZXh0ZW5kcyBGaWxlTG9nZ2VyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1NfRk9MREVSID0gImxvZ3MvaW1wb3J0L3htbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBJbXBvcnRYTUxvZ2dlcigpIHsKLQkJc3VwZXIobmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCksIExPR1NfRk9MREVSKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvVW1hTGlicmFyeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL1VtYUxpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzExMGNmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvVW1hTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuQ29udGVudFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuSUxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcy5GZWF0dXJlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5JbXBvcnRYTUxQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuSW1wb3J0WE1MUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotCi0vKioKLSAqIFVtYUxpYnJhcnkgcmVwcmVzZW50cyBhIG1ldGhvZCBsaWJyYXJ5IGFuZCBwcm92aWRlIG1ldGhvZHMgdG8gY3JlYXRlIGVsZW1lbnRzCi0gKiBhbmQgc2V0IGF0dHJpYnV0ZXMgYW5kIGZlYXR1cmUgdmFsdWVzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFMaWJyYXJ5IHsKLQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZyA9IEltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBvdmVyd3JpdGUgPSBmYWxzZTsJCi0JCi0JcHJpdmF0ZSBJTG9nZ2VyIGxvZ2dlcjsKLQotCXByaXZhdGUgQ29udGVudFByb2Nlc3NvciBjb250ZW50UHJvYyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBNYXAgbmV3RWxlbWVudHNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByaXZhdGUgTWFwIHJlbmFtZUVsZW1lbnRNYXA7Ci0KLQkvLyBtYXAgb2YgY3JlYXRlZCBlbGVtZW50cywgZ3VpZCAtIEVEYXRhT2JqZWN0Ci0JTWFwIGVsZW1lbnRzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIGtlZXAgdGhlIHNvdXJjZSBlbGVtZW50IGlkcyBzbyB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSBlbGVtZW50cyB0aGF0IGFyZSBub3QgaW4gdGhlIHhtbCBzb3VyY2UgbGlicmFyeQotCS8vIHRoaXMgaXMgbmVlZGVkIGZvciBkZWxldGluZyB1bi1uZWVkZWQgZWxlbWVudHMKLQkvLyAxNTQxNDkgLSBhbGxvdyBwYWNrYWdlIGxldmVsIG1lcmdpbmcgZm9yIHhtbCBpbXBvcnQKLQlIYXNoU2V0IHNvdXJjZUVsZW1lbnRJRHMgPSBuZXcgSGFzaFNldCgpOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKiBAcGFyYW0gY29udGVudFByb2MKLQkgKiBAcGFyYW0gbG9nZ2VyCi0JICogQHBhcmFtIG92ZXJ3cml0ZQotCSAqLwotCXB1YmxpYyBVbWFMaWJyYXJ5KE1hcCByZW5hbWVFbGVtZW50TWFwLCBDb250ZW50UHJvY2Vzc29yIGNvbnRlbnRQcm9jLCBJTG9nZ2VyIGxvZ2dlciwgYm9vbGVhbiBvdmVyd3JpdGUpIHsKLQkJdGhpcy5yZW5hbWVFbGVtZW50TWFwID0gcmVuYW1lRWxlbWVudE1hcDsKLQkJdGhpcy5sb2dnZXIgPSBsb2dnZXI7Ci0JCXRoaXMuY29udGVudFByb2MgPSBjb250ZW50UHJvYzsKLQkJdGhpcy5vdmVyd3JpdGUgPSBvdmVyd3JpdGU7Ci0KLQkJYnVpbGRFbGVtZW50c01hcCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgbGlicmFyeSBhcyB0aGUgcm9vdCBvYmplY3QuCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0Um9vdCgpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRFbGVtZW50c01hcCgpIHsKLQkJLy8gYnVpbGQgdGhlIGVsZW1lbnRzIG1hcCBmb3IgZWFzeSBvcGVyYXRpb24KLQotCQllbGVtZW50c01hcC5jbGVhcigpOwotCQllbGVtZW50c01hcC5wdXQoZ2V0Um9vdCgpLmdldEd1aWQoKSwgZ2V0Um9vdCgpKTsKLQkJVHJlZUl0ZXJhdG9yIGl0ID0gZ2V0Um9vdCgpLmVBbGxDb250ZW50cygpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgZSA9IGl0Lm5leHQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCWVsZW1lbnRzTWFwLnB1dCgoKE1ldGhvZEVsZW1lbnQpIGUpLmdldEd1aWQoKSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29udGVudCBjYXRlcmdvcnkuCi0JICogQHBhcmFtIHBsdWdpbklkCi0JICogQHBhcmFtIHhtbEVDbGFzc05hbWUKLQkgKiBAcGFyYW0geG1sRWxlbWVudFR5cGUKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IGNyZWF0ZUNvbnRlbnRDYXRlZ29yeShTdHJpbmcgcGx1Z2luSWQsCi0JCQlTdHJpbmcgeG1sRUNsYXNzTmFtZSwgU3RyaW5nIHhtbEVsZW1lbnRUeXBlLCBTdHJpbmcgaWQpIHsKLQotCQlzZXRTb3VyY2VJZChpZCk7Ci0JCQotCQkvLyBtYWtlIHN1cmUgdGhlIHNhbWUgb2JqZWN0IGNyZWF0ZWQgb25seSBvbmNlCi0JCUVEYXRhT2JqZWN0IG9iaiA9IGdldEVsZW1lbnQoaWQpOwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCXJldHVybiBvYmo7Ci0JCX0KLQotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgZ2V0RWxlbWVudChwbHVnaW5JZCk7Ci0KLQkJRUNsYXNzIG9iakNsYXNzID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuZ2V0Um1jRUNsYXNzKHhtbEVDbGFzc05hbWUpOwotCQlpZiAob2JqQ2xhc3MgPT0gbnVsbCkgewotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfZXJyb3Jfbm9fZWNsYXNzLCB4bWxFQ2xhc3NOYW1lKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCW9iaiA9IChFRGF0YU9iamVjdCkgRWNvcmVVdGlsLmNyZWF0ZShvYmpDbGFzcyk7Ci0JCXNldEVsZW1lbnQoaWQsIG9iaik7Ci0KLQkJQ29udGVudFBhY2thZ2Ugcm9vdFBrZyA9IChDb250ZW50UGFja2FnZSkgZ2V0Um9vdFBhY2thZ2UocGx1Z2luLCBvYmopOwotCQlyb290UGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZCgoQ29udGVudENhdGVnb3J5KW9iaik7Ci0JCXJldHVybiBvYmo7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcm9vdCBwYWNrYWdlCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1ldGhvZFBhY2thZ2UgZ2V0Um9vdFBhY2thZ2UoTWV0aG9kUGx1Z2luIHBsdWdpbiwgT2JqZWN0IG9iaikgewotCi0JCVN0cmluZ1tdIHBhdGggPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCXBhdGggPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aDsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lCi0JCQkJfHwgb2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSB7Ci0JCQlwYXRoID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGg7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQlwYXRoID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kb21haW5QYXRoOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQgfHwgb2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKSB7Ci0JCQlwYXRoID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aDsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUb29sKSB7Ci0JCQlwYXRoID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aDsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpIHsKLQkJCXBhdGggPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGg7Ci0JCX0KLQotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sIHBhdGgpOwotCQl9IGVsc2UgewotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfbm9fcGFja2FnZSwgb2JqKSk7IAotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG1ldGhvZCBwbHVnaW4uCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgY3JlYXRlTWV0aG9kUGx1Z2luKFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCS8vIG1ha2Ugc3VyZSB0aGUgc2FtZSBvYmplY3QgY3JlYXRlZCBvbmx5IG9uY2UKLQkJRURhdGFPYmplY3Qgb2JqID0gZ2V0RWxlbWVudChpZCk7Ci0JCWJvb2xlYW4gaXNPbGQgPSBvYmogIT0gbnVsbDsKLQkJaWYgKG9iaiA9PSBudWxsKSB7Ci0JCQlNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlvcHRpb25zLnB1dCgicmVuYW1lRWxlbWVudE1hcCIsIHJlbmFtZUVsZW1lbnRNYXApOwotCQkJb2JqID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUGx1Z2luKG5hbWUsIGlkLCBvcHRpb25zKTsKLQotCQkJc2V0RWxlbWVudChpZCwgb2JqKTsKLQkJfQotCi0JCS8vIG1ha2Ugc3VyZSB0aGUgc3lzdGVtIHBhY2thZ2VzIGFyZSBpbmNsdWRlZAotCQlzZXRTb3VyY2VJZChpZCk7Ci0JCUxpc3QgcGtncyA9IFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMoKE1ldGhvZFBsdWdpbilvYmopOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGtncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kUGFja2FnZSBwa2cgPSAoTWV0aG9kUGFja2FnZSlpdC5uZXh0KCk7Ci0JCQlzZXRTb3VyY2VJZChwa2cuZ2V0R3VpZCgpKTsKLQkJCWlmICghaXNPbGQpIHsKLQkJCQluZXdFbGVtZW50c01hcC5wdXQocGtnLmdldEd1aWQoKSwgcGtnKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG9iajsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGNvbnRlbnQncyByb290IHBhY2thZ2UuCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgZ2V0Q29udGVudFJvb3RQYWNrYWdlKEVEYXRhT2JqZWN0IHBsdWdpbikgewotCQlpZiAoIShwbHVnaW4gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZSgoTWV0aG9kUGx1Z2luKSBwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgY2FwYWJpbGl0eSBwYXR0ZXJuJyByb290IHBhY2thZ2UuCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgZ2V0Q2FwYWJpbGl0eVBhdHRlcm5Sb290UGFja2FnZShFRGF0YU9iamVjdCBwbHVnaW4pIHsKLQkJaWYgKCEocGx1Z2luIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UoKE1ldGhvZFBsdWdpbikgcGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGRlbGl2ZXJ5IHByb2Nlc3MnIHJvb3QgcGFja2FnZS4KLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBnZXREZWxpdmVyeVByb2Nlc3NSb290UGFja2FnZShFRGF0YU9iamVjdCBwbHVnaW4pIHsKLQkJaWYgKCEocGx1Z2luIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UoKE1ldGhvZFBsdWdpbikgcGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aCk7Ci0JfQotCi0vLwlwdWJsaWMgRURhdGFPYmplY3QgZ2V0UHJvY2Vzc0NvbnRyaWJ1dGlvblJvb3RQYWNrYWdlKEVEYXRhT2JqZWN0IHBsdWdpbikgewotLy8JCWlmICghKHBsdWdpbiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJfQotLy8JCXJldHVybiBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKChNZXRob2RQbHVnaW4pIHBsdWdpbiwKLS8vCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGgpOwotLy8JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlbGVtZW50LgotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiBAcGFyYW0geG1sRmVhdHVyZU5hbWUKLQkgKiBAcGFyYW0geG1sRUNsYXNzTmFtZQotCSAqIEBwYXJhbSB4bWxFbGVtZW50VHlwZQotCSAqIEBwYXJhbSBpZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgY3JlYXRlRWxlbWVudChFRGF0YU9iamVjdCBjb250YWluZXIsCi0JCQlTdHJpbmcgeG1sRmVhdHVyZU5hbWUsIFN0cmluZyB4bWxFQ2xhc3NOYW1lLCBTdHJpbmcgeG1sRWxlbWVudFR5cGUsCi0JCQlTdHJpbmcgaWQpIHsKLQotCQlzZXRTb3VyY2VJZChpZCk7Ci0KLQkJLy8gbWFrZSBzdXJlIHRoZSBzYW1lIG9iamVjdCBjcmVhdGVkIG9ubHkgb25jZQotCQlFRGF0YU9iamVjdCBvYmogPSBnZXRFbGVtZW50KGlkKTsKLQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlFT2JqZWN0IGVvYmogPSBvYmouZUNvbnRhaW5lcigpOwotCQkJCWlmIChlb2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJUHJvY2Vzc1BhY2thZ2UgcCA9IChQcm9jZXNzUGFja2FnZSkgZW9iajsKLQkJCQkJc2V0U291cmNlSWQocC5nZXRHdWlkKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBvYmo7Ci0JCX0KLQotCQkvLyBpZiAoIG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiApIHsKLQkJLy8gcmV0dXJuIGdldEVsZW1lbnQoaWQpOwotCQkvLyB9Ci0KLQkJLy8gLy8gdGhpcyBpcyBhbiBlYXNpZXIgd2F5LCB0ZXN0IGl0LAotCQkvLyAvLyBkb2VzIG5vdCB3b3JrIHNpbmNlIGZlYXR1cmUuZ2V0RVR5cGUoKSByZXR1cm5zIHRoZSBiYXNlIGVsZW1lbnQKLQkJLy8gdHlwZSwgbm90IHRoZSBleHRlbmRlZCBvbmUKLQkJLy8gLy8gZm9yIGV4YW1wbGUsIGl0IHJldHVybnMgTWV0aG9kUGFja2FnZSBpbnN0ZWFkIG9mIFByb2Nlc3NQYWNrYWdlIG9yCi0JCS8vIENvbnRlbnRQYWNrYWdlCi0JCS8vIC8vIHNvIHdlIG5lZWQgdG8gbWFrZSBvdXIgb3duIG1hcAotCQkvLyBFQ2xhc3NpZmllciBjID0gZmVhdHVyZS5nZXRFVHlwZSgpOwotCi0JCUVDbGFzcyBvYmpDbGFzcyA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFJtY0VDbGFzcyh4bWxFQ2xhc3NOYW1lKTsKLQkJaWYgKG9iakNsYXNzID09IG51bGwpIHsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5saWJyYXJ5X2Vycm9yX25vX2VjbGFzcywgeG1sRUNsYXNzTmFtZSkpOyAKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJb2JqID0gKEVEYXRhT2JqZWN0KSBFY29yZVV0aWwuY3JlYXRlKG9iakNsYXNzKTsJCi0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtPcmRlcikgewotCQkJLy8gV29ya09yZGVyIGlzIG5vdCBhIG1ldGhvZCBlbGVtZW50IGluIHhtbCB1bWEsIG5lZWQgdG8gY3JlYXRlIGl0Ci0JCQkvLyB3aXRoIGEgZ3VpZAotCQkJLy9pZCA9IEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKTsKLQotCQkJLy8gYWxzbyBuZWVkIHRvIGFkZCB0aGUgZWxlbWVudCBpbnRvIHRoZSBjb250YWluZXIgb2YgdGhlIG93bmVyCi0JCQkoKFByb2Nlc3NQYWNrYWdlKSBjb250YWluZXIuZUNvbnRhaW5lcigpKS5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoCi0JCQkJCShXb3JrT3JkZXIpb2JqKTsKLQkJfQotCi0JCXNldEVsZW1lbnQoaWQsIG9iaik7Ci0KLQkJdHJ5IHsKLQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgY29udGFpbmVyOwotCQkJCS8vIG5lZWQgc3BlY2lhbCBoYW5kbGluZyBmb3IgbmV3IHBsdWdpbgotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCQkvLyBjb250ZW50IHBhY2thZ2UgYW5kIG93bmVyIGlzIFBsdWdpbiwgZ290byB0aGUgcm9vdAotCQkJCQkvLyBjb250ZW50IHBhY2thZ2UKLQkJCQkJTWV0aG9kUGFja2FnZSBwa2dfY29yZV9jb250ZW50ID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZSgKLQkJCQkJCQlwbHVnaW4sIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQkJCQkJcGtnX2NvcmVfY29udGVudC5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKChDb250ZW50UGFja2FnZSlvYmopOwotCQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlNZXRob2RQYWNrYWdlIHBrZ19jcCA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoKTsKLQkJCQkJcGtnX2NwLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKFByb2Nlc3NDb21wb25lbnQpb2JqKTsKLQotCQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJLy8gdGhpcyBpcyBhIHJvb3QgcHJvY2VzcyBwYWNrYWdlCi0JCQkJCS8vIHB1dCBpbnRvIHRoZSByb290IGRlbGl2ZXJ5IHByb2Nlc3NlcyBwYWNrYWdlCi0JCQkJCU1ldGhvZFBhY2thZ2UgcGtnX2RwID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoKTsKLQkJCQkJcGtnX2RwLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKFByb2Nlc3NQYWNrYWdlKW9iaik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UKLQkJCQkJCS5nZXRSbWNGZWF0dXJlKGNvbnRhaW5lci5lQ2xhc3MoKSwgeG1sRmVhdHVyZU5hbWUpOwotCQkJCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJaWYgKChjb250YWluZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkJCQkJCSYmIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCkKLQkJCQkJCSYmIG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQotCQkJCQkvLyB0aGUgY29udGFpbmVyIG5lZWRzIHRvIGJlIGEgcHJvY2VzcyBwYWNrYWdlCi0JCQkJCUVPYmplY3QgcGtnID0gY29udGFpbmVyOwotCQkJCQl3aGlsZSAoKHBrZyAhPSBudWxsKSAmJiAhKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSkgewotCQkJCQkJcGtnID0gcGtnLmVDb250YWluZXIoKTsKLQkJCQkJfQotCi0JCQkJCS8vIGlmIHRoZSBvYmplY3QgaXMgYW4gYWN0aXZpdHksIGNyZWF0ZSBhIHBhY2thZ2UgZm9yIGl0IGFuZAotCQkJCQkvLyBhbGwgaXQncyBicmVha2Rvd24gZWxlbWVudHMKLQkJCQkJaWYgKChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCQkJCUxpc3QgY2hpbGRQa2dzID0gKChQcm9jZXNzUGFja2FnZSkgcGtnKQotCQkJCQkJCQkuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQkJCQkJUHJvY2Vzc1BhY2thZ2UgcHAgPSBudWxsOwotCQkJCQkJaWYgKHRydWUgfHwgY2hpbGRQa2dzLnNpemUoKSA9PSAwKSB7CS8vMTU4MzYzOiBhbHdheXMgY3JlYXRlIGEgcGFja2FnZSBmb3IgYWN0Ci0JCQkJCQkJcHAgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJCQkJCXBwLnNldE5hbWUoKChNZXRob2RFbGVtZW50KSBjb250YWluZXIpLmdldE5hbWUoKSk7Ci0JCQkJCQkJc2V0RWxlbWVudChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCksIHBwKTsKLQkJCQkJCQlzZXRTb3VyY2VJZChwcC5nZXRHdWlkKCkpOwotCQkJCQkJCWNoaWxkUGtncy5hZGQocHApOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwcCA9IChQcm9jZXNzUGFja2FnZSkgY2hpbGRQa2dzLmdldCgwKTsKLQkJCQkJCX0KLQotCQkJCQkJcGtnID0gcHA7Ci0JCQkJCX0KLQotCQkJCQkoKFByb2Nlc3NQYWNrYWdlKSBwa2cpLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZCgoUHJvY2Vzc0VsZW1lbnQpb2JqKTsKLQkJCQl9Ci0KLQkJCQkvLyBub3RlOiBhbGwgZWxlbWVudCByZWZlcmVuY2VzIGFyZSBzdHJpbmcgdHlwZSAoaWQpCi0JCQkJLy8gcGFja2FnZSByZWZlcmVuY2VzIGFyZSBvYmplY3QgcmVmZXJlbmNlcwotCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCUxpc3QgdmFsdWVzID0gKExpc3QpIGNvbnRhaW5lci5lR2V0KGZlYXR1cmUpOwotCQkJCQl2YWx1ZXMuYWRkKG9iaik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29udGFpbmVyLmVTZXQoZmVhdHVyZSwgb2JqKTsKLQkJCQl9Ci0JCQl9CQkJCQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5saWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50LCBlLmdldE1lc3NhZ2UoKSkpOwotCQkJLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCXJldHVybiBvYmo7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEVsZW1lbnQoU3RyaW5nIGd1aWQsIEVEYXRhT2JqZWN0IG9iaikgewotCQkvLyBhZGRFbGVtZW50VG9Db250YWluZXIoY29udGFpbmVyLCBvYmopOwotCQkJCQotCQlpZiAoIWVsZW1lbnRzTWFwLmNvbnRhaW5zS2V5KGd1aWQpKSB7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJKChNZXRob2RFbGVtZW50KSBvYmopLnNldEd1aWQoZ3VpZCk7Ci0JCQl9Ci0KLQkJCWVsZW1lbnRzTWFwLnB1dChndWlkLCBvYmopOwotCQkJCQkKLQkJCXNldERpcnR5KG9iaik7Ci0JCQluZXdFbGVtZW50c01hcC5wdXQoZ3VpZCwgb2JqKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTb3VyY2VJZChTdHJpbmcgaWQpIHsKLQkJLy8gMTU0MTQ5IC0gYWxsb3cgcGFja2FnZSBsZXZlbCBtZXJnaW5nIGZvciB4bWwgaW1wb3J0Ci0JCWlmICggIXNvdXJjZUVsZW1lbnRJRHMuY29udGFpbnMoaWQpICkgewotCQkJc291cmNlRWxlbWVudElEcy5hZGQoaWQpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXREaXJ0eShFT2JqZWN0IG9iaikgewotCQkvLyBtYXJrIHRoZSByZXNvdXJjZSBhcyBkaXJ0eQotCQlSZXNvdXJjZSByZXMgPSBvYmouZVJlc291cmNlKCk7Ci0JCWlmICggcmVzICE9IG51bGwgJiYgIXJlcy5pc01vZGlmaWVkKCkgKSB7Ci0JCQlyZXMuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBlbGVtZW50IGdpdmVuIHRoZSBndWlkLgotCSAqIEBwYXJhbSBndWlkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBnZXRFbGVtZW50KFN0cmluZyBndWlkKSB7Ci0JCXJldHVybiAoRURhdGFPYmplY3QpIGVsZW1lbnRzTWFwLmdldChndWlkKTsKLQl9Ci0KLQlwcml2YXRlIERhdGUgY3JlYXRlRGF0ZShTdHJpbmcgZGF0ZVN0cikgewotCQlkYXRlU3RyID0gZGF0ZVN0ci5yZXBsYWNlKCdUJywgJyAnKTsKLQkJU2ltcGxlRGF0ZUZvcm1hdCBmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQgaGg6bW06c3MiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZi5wYXJzZShkYXRlU3RyLCBuZXcgUGFyc2VQb3NpdGlvbigwKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgc3RyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXN0ciA9IExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKChNZXRob2RFbGVtZW50KSBvYmopOwotCQl9IGVsc2UgaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQlzdHIgPSBvYmoudG9TdHJpbmcoKTsKLQkJfQotCi0JCXJldHVybiBzdHI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBhdHRyaWJ1dGUgZmVhdHVyZSB2YWx1ZS4KLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIGZlYXR1cmVOYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHJpYnV0ZUZlYXR1cmVWYWx1ZShFRGF0YU9iamVjdCBvYmosIFN0cmluZyBmZWF0dXJlTmFtZSwKLQkJCU9iamVjdCB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gb2xkTm90aWZ5ID0gb2JqLmVEZWxpdmVyKCk7Ci0JCW9iai5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCXNldEF0cmlidXRlRmVhdHVyZVZhbHVlXyhvYmosIGZlYXR1cmVOYW1lLCB2YWx1ZSk7Ci0JCW9iai5lU2V0RGVsaXZlcihvbGROb3RpZnkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0QXRyaWJ1dGVGZWF0dXJlVmFsdWVfKEVEYXRhT2JqZWN0IG9iaiwgU3RyaW5nIGZlYXR1cmVOYW1lLAotCQkJT2JqZWN0IHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKG9iaiA9PSBudWxsIHx8IGZlYXR1cmVOYW1lID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXN0IHx8IHZhbHVlIGluc3RhbmNlb2YgRURhdGFPYmplY3QpIHsKLQkJCWlmIChmZWF0dXJlTmFtZS5lcXVhbHMoIm1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIpKSB7CQkvLyROT04tTkxTLTEkCi0JCQkJc2V0TWVwRmVhdHVyZVZhbHVlKG9iaiwgZmVhdHVyZU5hbWUsIHZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgRXhjZXB0aW9uKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMiwgdmFsdWUpKTsgCi0JCX0KLQotCQkvLyBmaW5kIHRoZSBmZWF0dXJlIGFuZCBzZXQgdGhlIHZhbHVlCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuZ2V0Um1jRmVhdHVyZShvYmoKLQkJCQkuZUNsYXNzKCksIGZlYXR1cmVOYW1lKTsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgewotCQkJT2JqZWN0W10gcGFyYXMgPSBuZXcgT2JqZWN0W10geyBnZXRTdHJpbmcob2JqKSwgZmVhdHVyZU5hbWUsIHZhbHVlIH07Ci0JCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlLCBwYXJhcykgKyBvYmopOyAKLQkJCXJldHVybjsKLQkJfSAKLQkJCi0JCXNldERpcnR5KG9iaik7Ci0KLQkJLy8gMTU4Njg4IC0gTWlzc2luZyB0ZW1wbGF0ZSBmaWxlcyBpbiBleHBvcnRlZCB4bWwgbGlicmFyeQotCQkvLyBwcm9jZXNzIHRoZSBhdHRhY2htZW50IHVybAotCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50cygpICkgewotCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgewotCQkJCXZhbHVlID0gY29udGVudFByb2MucmVzb2x2ZUF0dGFjaG1lbnRSZXNvdXJjZXMob2JqLCB2YWx1ZS50b1N0cmluZygpLnRyaW0oKSk7Ci0JCQl9Ci0JCQlvYmouZVNldChmZWF0dXJlLCB2YWx1ZSk7Ci0JCX0KLQkJCi0JCWVsc2UgaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlICYmIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkvLyBpZiB0aGUgdW1hIGZlYXR1cmUgaXMgYSByZWZlcmVuY2UgZmVhdHVyZQotCQkJLy8gYnV0IHRoZSB4bWwgZmVhdHVyZSBpcyBhbiBhdHRyaWJ1dGUKLQkJCS8vIHRoZSBhdHRyaWJ1dGUgdmFsdWUgbXVzdCBiZSBhIGd1aWQKLQkJCU9iamVjdCBlID0gZ2V0RWxlbWVudCgoU3RyaW5nKSB2YWx1ZSk7Ci0JCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJKChMaXN0KSBvYmouZUdldChmZWF0dXJlKSkuYWRkKGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW9iai5lU2V0KGZlYXR1cmUsIGUpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJT2JqZWN0W10gcGFyYXMgPSBuZXcgT2JqZWN0W10geyBnZXRTdHJpbmcob2JqKSwKLQkJCQkJCWZlYXR1cmUuZ2V0TmFtZSgpLCB2YWx1ZSB9OwotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlLCBwYXJhcyk7IAotCQkJCWxvZ2dlci5sb2dXYXJuaW5nKG1zZyk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygidmFyaWFiaWxpdHlUeXBlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQl2YWx1ZSA9IFZhcmlhYmlsaXR5VHlwZS5nZXQodmFsdWUudG9TdHJpbmcoKSk7Ci0JCQkJfSBlbHNlIGlmIChmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoImxpbmtUeXBlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQl2YWx1ZSA9IFdvcmtPcmRlclR5cGUuZ2V0KHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJCX0gZWxzZSBpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpKSB7Ci0JCQkJCS8vIGNvbnZlcnQgamF2YS51dGlsLkRhdGUgdG8geG1sIERhdGUKLQkJCQkJdmFsdWUgPSBjcmVhdGVEYXRlKHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJCX0gZWxzZSBpZiAoZmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJub2RlaWNvbiIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXx8IGZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygic2hhcGVpY29uIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlNZXRob2RQbHVnaW4gdGd0UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKE1ldGhvZEVsZW1lbnQpIG9iaik7Ci0JCQkJCWludCBpeCA9IHRndFBsdWdpbi5nZXROYW1lKCkubGVuZ3RoKCkgKyAxOwotCQkJCQkJCQkJCQotCQkJCQl2YWx1ZSA9IG5ldyBqYXZhLm5ldC5VUkkodmFsdWUudG9TdHJpbmcoKS5zdWJzdHJpbmcoaXgpKTsKLQotCQkJCQkvLyBuZWVkIHRvIGNvcHkgdGhlIHJlc291cmNlIGZpbGUgdG8gdGhlIHRhcmdldCBsaWJyYXJ5Ci0JCQkJCWNvbnRlbnRQcm9jLmNvcHlSZXNvdXJjZSgoKGphdmEubmV0LlVSSSkgdmFsdWUpLmdldFBhdGgoKSwgb2JqLCB0Z3RQbHVnaW4pOwotCQkJCX0gZWxzZSBpZiAoKGNvbnRlbnRQcm9jICE9IG51bGwpCi0JCQkJCQkmJiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkKLQkJCQkJCSYmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHsKLQkJCQkJdmFsdWUgPSBjb250ZW50UHJvYy5yZXNvbHZlUmVzb3VyY2VGaWxlcygKLQkJCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLCAoU3RyaW5nKSB2YWx1ZSk7Ci0JCQkJfQotCQkJCW9iai5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCU9iamVjdFtdIHBhcmFzID0gbmV3IE9iamVjdFtdIHsgZ2V0U3RyaW5nKG9iaiksIGZlYXR1cmVOYW1lLAotCQkJCQkJdmFsdWUgfTsKLQkJCQlsb2dnZXIubG9nRXJyb3IoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZSwgcGFyYXMpLCBlKTsgCi0JCQkJLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCU9iamVjdFtdIHBhcmFzID0gbmV3IE9iamVjdFtdIHsgZ2V0U3RyaW5nKG9iaiksIGZlYXR1cmVOYW1lLCB2YWx1ZSB9OwotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8zLCBwYXJhcykpOyAKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE1lcEZlYXR1cmVWYWx1ZShFRGF0YU9iamVjdCBvYmosIFN0cmluZyBmZWF0dXJlTmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCUxpc3Qgc3JjTGlzdCA9IChMaXN0KSB2YWx1ZTsKLQkJaW50IHN6ID0gc3JjTGlzdCA9PSBudWxsID8gMCA6IHNyY0xpc3Quc2l6ZSgpOwkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuZ2V0Um1jRmVhdHVyZShvYmoKLQkJCQkuZUNsYXNzKCksIGZlYXR1cmVOYW1lKTsKLQkJTGlzdCB0Z3RMaXN0ID0gKExpc3QpIG9iai5lR2V0KGZlYXR1cmUpOwotCQlpbnQgdHN6ID0gdGd0TGlzdCA9PSBudWxsID8gMCA6IHRndExpc3Quc2l6ZSgpOwotCi0JCS8vU291cmNlIGxpc3QgaXMgZW1wdHkKLQkJaWYgKHN6ID09IDApIHsKLQkJCWlmICh0c3ogPT0gMCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXRndExpc3QucmVtb3ZlQWxsKHRndExpc3QpOwotCQkJc2V0RGlydHkob2JqKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy9Tb3J1Y2UgYW5kIHRhcmdldCBhcmUgcG90ZW50aWFsbHkgdGhlIHNhbWUKLQkJYm9vbGVhbiBzYW1lID0gZmFsc2U7Ci0JCWlmIChzeiA9PSB0c3opIHsKLQkJCXNhbWUgPSB0cnVlOwotCQkJZm9yIChpbnQgaT0wOyBpIDwgc3o7IGkrKykgewotCQkJCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBzcmNNZXAgPSAKLQkJCQkJKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgc3JjTGlzdC5nZXQoaSk7Ci0JCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHRndE1lcCA9IAotCQkJCQkoTWV0aG9kRWxlbWVudFByb3BlcnR5KSB0Z3RMaXN0LmdldChpKTsKLQkJCQlpZiAoISBzcmNNZXAuZ2V0TmFtZSgpLmVxdWFscyh0Z3RNZXAuZ2V0TmFtZSgpKSkgewotCQkJCQlzYW1lID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoISBzcmNNZXAuZ2V0VmFsdWUoKS5lcXVhbHModGd0TWVwLmdldFZhbHVlKCkpKSB7Ci0JCQkJCXNhbWUgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzYW1lKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vU29ydWNlIGFuZCB0YXJnZXQgYXJlIG5vdCB0aGUgc2FtZQotCQl0Z3RMaXN0LnJlbW92ZUFsbCh0Z3RMaXN0KTsKLQkJZm9yIChpbnQgaT0wOyBpIDwgc3o7IGkrKykgewotCQkJT2JqZWN0IHNyY0l0ZW0gPSBzcmNMaXN0LmdldChpKTsKLQkJCWlmIChzcmNJdGVtIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5KSB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5IG1lcCA9IAotCQkJCQkJKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgc3JjSXRlbTsKLQkJCQlFQ2xhc3Mgb2JqQ2xhc3MgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRQotCQkJCS5nZXRSbWNFQ2xhc3MoIk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIpOwkvLyROT04tTkxTLTEkCi0JCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHhtbE1lcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpIEVjb3JlVXRpbC5jcmVhdGUob2JqQ2xhc3MpOwotCQkJCXhtbE1lcC5zZXRWYWx1ZShtZXAuZ2V0VmFsdWUoKSk7Ci0JCQkJeG1sTWVwLnNldE5hbWUobWVwLmdldE5hbWUoKSk7Ci0JCQkJdGd0TGlzdC5hZGQoeG1sTWVwKTsKLQkJCX0KLQkJfQotCQlzZXREaXJ0eShvYmopOwotCQkvL29iai5lU2V0KGZlYXR1cmUsIHRndExpc3QpOwotCX0KLQotCS8qKgotCSAqIFNldHMgcmVmZXJlbmNlIHZhbHVlLgotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gZmVhdHVyZU5hbWUKLQkgKiBAcGFyYW0gaWQKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZVZhbHVlKEVEYXRhT2JqZWN0IG9iaiwgU3RyaW5nIGZlYXR1cmVOYW1lLCBTdHJpbmcgaWQpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKG9iaiA9PSBudWxsIHx8IGZlYXR1cmVOYW1lID09IG51bGwgfHwgaWQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlFT2JqZWN0IHZhbHVlID0gZ2V0RWxlbWVudChpZCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlLCBmZWF0dXJlTmFtZSwgaWQpKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZmluZCB0aGUgZmVhdHVyZSBhbmQgc2V0IHRoZSB2YWx1ZQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFJtY0ZlYXR1cmUob2JqCi0JCQkJLmVDbGFzcygpLCBmZWF0dXJlTmFtZSk7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCU9iamVjdFtdIHBhcmFzID0gbmV3IE9iamVjdFtdIHsgZ2V0U3RyaW5nKG9iaiksIGZlYXR1cmVOYW1lLCBpZCB9OwotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZV8yLCBwYXJhcykpOyAKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGRvbid0IGl0ZXJhdGUgdGhlIGNvbnRhaW5tZW50IGZlYXR1cmUKLQkJaWYgKHZhbHVlLmVDb250YWluZXIoKSA9PSBvYmopIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFN0cmluZyBzdHIgPSBmZWF0dXJlLmdldEVUeXBlKCkuZ2V0TmFtZSgpOwotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJdHJ5IHsKLQkJCQlMaXN0IGl0ZW1zID0gKExpc3QpIG9iai5lR2V0KGZlYXR1cmUpOwotCQkJCWlmICghaXRlbXMuY29udGFpbnModmFsdWUpKSB7Ci0JCQkJCWl0ZW1zLmFkZCh2YWx1ZSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJT2JqZWN0W10gcGFyYXMgPSBuZXcgT2JqZWN0W10geyBnZXRTdHJpbmcob2JqKSwgZmVhdHVyZU5hbWUsIGlkIH07Ci0JCQkJbG9nZ2VyCi0JCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCU5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2VfMiwgcGFyYXMpLCBlKTsgCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlvYmouZVNldChmZWF0dXJlLCB2YWx1ZSk7Ci0JCX0KLQkJCi0JCXNldERpcnR5KG9iaik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB3b3JrIG9yZGVyLgotCSAqIEBwYXJhbSB1bWFXb3JrT3JkZXIKLQkgKiBAcGFyYW0gcHJlZElkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29ya09yZGVyKE9iamVjdCB1bWFXb3JrT3JkZXIsIFN0cmluZyBwcmVkSWQpIHsKLQkJaWYgKHVtYVdvcmtPcmRlciBpbnN0YW5jZW9mIFdvcmtPcmRlcikgewotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudChwcmVkSWQpOwotCQkJKChXb3JrT3JkZXIpIHVtYVdvcmtPcmRlcikuc2V0UHJlZChlKTsKLQkJCQotCQkJc2V0RGlydHkoKEVPYmplY3QpdW1hV29ya09yZGVyKTsKLQotCQl9Ci0JfQotCi0JLyoqCi0JICogRml4ZXMgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXhMaWJyYXJ5KCkgewotCQlNZXRob2RMaWJyYXJ5IHJvb3RPYmplY3QgPSBnZXRSb290KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSAoKE1ldGhvZExpYnJhcnkpIHJvb3RPYmplY3QpLmdldE1ldGhvZFBsdWdpbnMoKQotCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlmaXhQbHVnaW4oKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBmaXggdGFzayBkZXNjcmlwdG9ycyBmb3IgaW1wb3J0Ci0JICogCi0JICovCi0JcHVibGljIHZvaWQgZml4VGFza0Rlc2NyaXB0b3JzKE1hcDxTdHJpbmcsIFRhc2tEZXNjcmlwdG9yPiB0ZE1hcCkgewotCQlpZiAodGRNYXAgPT0gbnVsbCB8fCB0ZE1hcC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQkJCi0JCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgVGFza0Rlc2NyaXB0b3I+PiBpdCA9IHRkTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5PFN0cmluZywgVGFza0Rlc2NyaXB0b3I+IGVudHJ5ID0gaXQubmV4dCgpOwotCQkJU3RyaW5nIGd1aWQgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IgdW1hVGQgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcikgZWxlbWVudHNNYXAuZ2V0KGd1aWQpOwotCQkJYXNzZXJ0KHVtYVRkICE9IG51bGwpOwotCQkJaWYgKHVtYVRkID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUxpc3Qgc3RlcHMgPSB0ZC5nZXRTdGVwKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8c3RlcHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50IHN0ZXAgPSAob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCkgc3RlcHMuZ2V0KGkpOwotCQkJCVNlY3Rpb24gdW1hU3RlcCA9ICAoU2VjdGlvbikgZWxlbWVudHNNYXAuZ2V0KHN0ZXAuZ2V0SWQoKSk7Ci0JCQkJYXNzZXJ0KHVtYVN0ZXAgIT0gbnVsbCk7Ci0JCQkJaWYgKHVtYVN0ZXAgIT0gbnVsbCkgewotCQkJCQl1bWFUZC5nZXRTZWxlY3RlZFN0ZXBzKCkuYWRkKHVtYVN0ZXApOwotCQkJCX0KLQkJCX0JCQkKLQkJfQkJCi0JfQotCi0JcHJpdmF0ZSBNZXRob2RQYWNrYWdlIGNwUm9vdCA9IG51bGw7Ci0KLQlwcml2YXRlIE1ldGhvZFBhY2thZ2UgZHBSb290ID0gbnVsbDsKLQotLy8JcHJpdmF0ZSBNZXRob2RQYWNrYWdlIHBjUm9vdCA9IG51bGw7Ci0KLQlwcml2YXRlIHZvaWQgZml4UGx1Z2luKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQotCQkvLyBmaXggdGhlIHJvb3QgY3VzdG9tIGNhdGVnb3JpZXMKLQkJZml4Q3VzdG9tQ2F0ZWdvcmllcyhwbHVnaW4pOwotCi0JCUxpc3QgY3BQa2dzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGRwUGtncyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQlMaXN0IHBjUGtncyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQljcFJvb3QgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCk7Ci0JCWRwUm9vdCA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aCk7Ci0vLwkJcGNSb290ID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0vLwkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnByb2Nlc3NDb250cmlidXRpb25QYXRoKTsKLQkJZ2V0QWxsUGFja2FnZXMoY3BSb290LCBjcFBrZ3MpOwotCQlnZXRBbGxQYWNrYWdlcyhkcFJvb3QsIGRwUGtncyk7Ci0JCQotLy8JCWlmICggcGNQa2dzICE9IG51bGwgKSB7Ci0vLwkJCWdldEFsbFBhY2thZ2VzKHBjUm9vdCwgcGNQa2dzKTsKLS8vCQl9Ci0JCQkKLQkJTGlzdCBwcm9jcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbi5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpaXQubmV4dCgpOwotCQkJYm9vbGVhbiBvbGROb3RpZnkgPSBvLmVEZWxpdmVyKCk7Ci0JCQl0cnkJewotCQkJCS8vIHR1cm4gb2ZmIG5vdGlmaWNhdGlvbnMgdG8gYXZvaWQgcG9zc2libGUgZGVhZGxvY2sgb3IgdGhyZWFkIGlzc3VlCi0JCQkJLy8gMTU0MTQyIC0gaW1wb3J0IHhtbCBjYXVzZWQgdGhyZWFkIGFjY2VzcyBlcnJvcgotCQkJCW8uZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJCQotCQkJCWlmIChvIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlwcm9jcy5hZGQobyk7Ci0JCQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJCVN0cmluZyBwTmFtZSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBvKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJCWlmIChwTmFtZSA9PSBudWxsIHx8IHBOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCSgoRGVzY3JpYmFibGVFbGVtZW50KSBvKQotCQkJCQkJCQkuc2V0UHJlc2VudGF0aW9uTmFtZSgoKERlc2NyaWJhYmxlRWxlbWVudCkgbykKLQkJCQkJCQkJCQkuZ2V0TmFtZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkKLQkJCQkvLyBmaXggdGhlIG5hbWUgc3RyaW5nCi0JCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmICEobyBpbnN0YW5jZW9mIFNlY3Rpb24pKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gKChNZXRob2RFbGVtZW50KSBvKS5nZXROYW1lKCk7Ci0JCQkJCVN0cmluZyBuZXdfbmFtZSA9IFN0clV0aWwubWFrZVZhbGlkRmlsZU5hbWUobmFtZSk7Ci0JCQkJCWlmICggIW5ld19uYW1lLmVxdWFscyhuYW1lKSApIHsKLQkJCQkJCSgoTWV0aG9kRWxlbWVudCkgbykuc2V0TmFtZShuZXdfbmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCW8uZVNldERlbGl2ZXIob2xkTm90aWZ5KTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9jcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcHJvY3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcGMgPSAoUHJvY2Vzc0NvbXBvbmVudCkgaXQubmV4dCgpOwotCQkJCU9iamVjdCBwcm9jID0gcGMuZ2V0UHJvY2VzcygpOwotCQkJCWlmIChwcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCWlmICghZHBQa2dzLmNvbnRhaW5zKHBjKSkgewotCQkJCQkJbW92ZVByb2Nlc3NDb21wb25lbnQocGMsIGRwUm9vdCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQlpZiAoIWNwUGtncy5jb250YWlucyhwYykpIHsKLQkJCQkJCW1vdmVQcm9jZXNzQ29tcG9uZW50KHBjLCBjcFJvb3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldEFsbFBhY2thZ2VzKE1ldGhvZFBhY2thZ2UgcGtnLCBMaXN0IHBrZ3MpIHsKLQkJcGtncy5hZGQocGtnKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJZ2V0QWxsUGFja2FnZXMoKE1ldGhvZFBhY2thZ2UpIGl0Lm5leHQoKSwgcGtncyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBtb3ZlIHRoZSBwcm9jZXNzIHBhY2thZ2UgdG8gdGhlIHNwZWNpZmllZCBjb250YWluZXIsIGlmIHRoZSBwYWNrYWdlIGlzCi0JICogdGhlIG9ubHkgY2hpbGQgb2YgaXQncyBwYXJlbnQsIG1vdmUgaXQncyBwYXJlbnQKLQkgKiAKLQkgKiBAcGFyYW0gcGtnCi0JICogQHBhcmFtIGNvbnRhaW5lcgotCSAqLwotCXByaXZhdGUgdm9pZCBtb3ZlUHJvY2Vzc0NvbXBvbmVudChQcm9jZXNzUGFja2FnZSBwa2csCi0JCQlNZXRob2RQYWNrYWdlIGNvbnRhaW5lcikgewotCQkvLyBtYWtlIHN1cmUgQ2FwYWJpbGl0eSBwYXR0ZXJucyBhcmUgaW4gdGhlIENhcGFiaWxpdHkgcGFja2FnZXMKLQkJT2JqZWN0IG8gPSBwa2cuZUNvbnRhaW5lcigpOwotCQlpZiAoKG8gaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkKLQkJCQkmJiAoKChQcm9jZXNzUGFja2FnZSkgbykuZ2V0Q2hpbGRQYWNrYWdlcygpLnNpemUoKSA9PSAxKQotCQkJCSYmIG8gIT0gY3BSb290ICYmIG8gIT0gZHBSb290ICkgewotCQkJbW92ZVByb2Nlc3NDb21wb25lbnQoKFByb2Nlc3NQYWNrYWdlKSBvLCBjb250YWluZXIpOwotCQl9IGVsc2UgewotCQkJY29udGFpbmVyLmdldENoaWxkUGFja2FnZXMoKS5hZGQocGtnKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGZpbmQgdGhlIHJvb3QgY3VzdG9tIGNhZ2Vnb3J5IGFuZCBwdXQgdG8gdGhlIHJvb3QgcGFja2FnZQotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIE1ldGhvZFBsdWdpbgotCSAqLwotCXByaXZhdGUgdm9pZCBmaXhDdXN0b21DYXRlZ29yaWVzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoKTsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QocGtnLmdldENvbnRlbnRFbGVtZW50cygpKTsKLQotCQlMaXN0IHJvb3RJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCUN1c3RvbUNhdGVnb3J5IGNjID0gKEN1c3RvbUNhdGVnb3J5KSBpdGVtcy5yZW1vdmUoMCk7Ci0JCQlyb290SXRlbXMuYWRkKGNjKTsKLQkJCQotCQkJLy8gMTU4NjkxQ3VzdG9tIENhdGVnb3J5IGlzIGRpZmZlcmVudCBpbiBleHBvcnRlZCBsaWJyYXJ5Ci0JCQkvLyBuZWVkIHRvIHJlbW92ZSBzdWItY2F0ZWdvcmllcyByZWN1cnNpdmVseQotCQkJZml4Q3VzdG9tQ2F0ZWdvcmllcyhjYywgaXRlbXMsIHJvb3RJdGVtcyk7Ci0JCX0KLQotCQlUbmdVdGlsLmdldFJvb3RDdXN0b21DYXRlZ29yeShwbHVnaW4pLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5hZGRBbGwoCi0JCQkJcm9vdEl0ZW1zKTsKLQotCX0KLQkKLQkvKioKLQkgKiBmaW5kIHRoZSByb290IGN1c3RvbSBjYXRlZ29yaWVzIGJ5IHJlbW92aW5nIHRoZSBzdWItY2F0ZWdvcmllcyByZWN1cnNpdmVseQotCSAqIAotCSAqIEBwYXJhbSBjYwotCSAqIEBwYXJhbSBpdGVtcwotCSAqIEBwYXJhbSByb290SXRlbXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgZml4Q3VzdG9tQ2F0ZWdvcmllcyhDdXN0b21DYXRlZ29yeSBjYywgTGlzdCBpdGVtcywgTGlzdCByb290SXRlbXMpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGNjLmdldFN1YkNhdGVnb3JpZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLQkJCWl0ZW1zLnJlbW92ZShpdGVtKTsKLQkJCXJvb3RJdGVtcy5yZW1vdmUoaXRlbSk7Ci0JCQlmaXhDdXN0b21DYXRlZ29yaWVzKChDdXN0b21DYXRlZ29yeSlpdGVtLCBpdGVtcywgcm9vdEl0ZW1zKTsKLQkJfQotCQkKLQkJLy8gYWxzbyBpdGVyYXRlIHRoZSBjb250YWluZWQgZWxlbWVudHMKLQkJZm9yIChJdGVyYXRvciBpdCA9IGNjLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdAotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlpdGVtcy5yZW1vdmUoaXRlbSk7Ci0JCQkJcm9vdEl0ZW1zLnJlbW92ZShpdGVtKTsKLQkJCQlmaXhDdXN0b21DYXRlZ29yaWVzKChDdXN0b21DYXRlZ29yeSlpdGVtLCBpdGVtcywgcm9vdEl0ZW1zKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBkZWxldGUgdGhlIHVuLW5lZWRlZCBlbGVtZW50cyBhcmUgY2xlYXIgcmVzb3VyY2VzIAotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZUVsZW1lbnRzKCkgewotCQkKLQkJSUZpbGVNYW5hZ2VyIGZpbGVNZ3IgPSBTZXJ2aWNlcy5nZXRGaWxlTWFuYWdlcigpOwotCi0JCUxpc3QgZGVsZXRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpaXQubmV4dCgpOwotCQkJU3RyaW5nIGlkID0gKFN0cmluZyllbnRyeS5nZXRLZXkoKTsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWVudHJ5LmdldFZhbHVlKCk7Ci0JCQlpZiAoIHNvdXJjZUVsZW1lbnRJRHMuY29udGFpbnMoaWQpICkgewotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmIChvdmVyd3JpdGUpIHsKLQkJCQlib29sZWFuIHRvRGVsZXRlID0gIShlIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSB8fCBlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luCi0JCQkJCQkJCQl8fCBlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQkJaWYgKHRvRGVsZXRlKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCQkJCXRvRGVsZXRlID0gcGx1Z2luICE9IG51bGwgJiYgIWlzTmV3RWxlbWVudChwbHVnaW4uZ2V0R3VpZCgpKQotCQkJCQkmJiBzb3VyY2VFbGVtZW50SURzLmNvbnRhaW5zKHBsdWdpbi5nZXRHdWlkKCkpOwotCQkJCX0KLQkJCQlpZiAodG9EZWxldGUpIHsKLQkJCQkJZGVsZXRlZEVsZW1lbnRzLmFkZChlKTsKLQkJCQkJaGFuZGxlQWN0aXZpdHlSZW1vdmFsKGUpOwotCQkJCQkvL0Vjb3JlVXRpbC5yZW1vdmUoZSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKCAoZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSAmJiBUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KCAoQ3VzdG9tQ2F0ZWdvcnkpZSApICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQkJCQotCQkJCi0JCQkvLyBkZWxldGUgdGhlIGVsZW1lbnQgaWYgdGhlIGNvbnRhaW5nIHBhY2thZ2UgaXMgaW4gdGhlIHNvdXJjZSBsaWJyYXJ5Ci0JCQkvLyBkb24ndCBkZWxldGUgaWYgdGhlIHBhY2thZ2UgaXMgbm90IGluIHRoZSB4bWwgbGlicmFyeQotCQkJTWV0aG9kUGFja2FnZSBwa2cgPSBUbmdVdGlsLmdldE1ldGhvZFBhY2thZ2UoZSk7Ci0JCQkKLQkJCWlmICggcGtnICE9IG51bGwgKSB7IAotCQkJCVN0cmluZyBwaWQgPSBwa2cuZ2V0R3VpZCgpOwotCQkJCWlmICggc291cmNlRWxlbWVudElEcy5jb250YWlucyhwaWQpICkgewotCQkJCQlkZWxldGVkRWxlbWVudHMuYWRkKGUpOwotCQkJCQloYW5kbGVBY3Rpdml0eVJlbW92YWwoZSk7Ci0JCQkJCQotCQkJCQkvLyBkZWxldGUgdGhlIGVsZW1lbnQgZnJvbSB0aGUgbGlicmFyeQotCQkJCQkvL0Vjb3JlVXRpbC5yZW1vdmUoZSk7CQkJCQotCQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQotCQkJCQlib29sZWFuIHRvQ2hlY2sgPSB0cnVlOwotCQkJCQlNZXRob2RQYWNrYWdlIHBjID0gcGtnOwkJCQkJCi0JCQkJCXdoaWxlKHBjICE9IG51bGwgJiYgISAocGMgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSkgewotCQkJCQkJcGMgPSBUbmdVdGlsLmdldFBhcmVudE1ldGhvZFBhY2thZ2UocGMpOwotCQkJCQl9Ci0JCQkJCWlmIChwYyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCXRvQ2hlY2sgPSBzb3VyY2VFbGVtZW50SURzLmNvbnRhaW5zKHBjLmdldEd1aWQoKSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmICh0b0NoZWNrKSB7Ci0JCQkJCQlwa2cgPSBUbmdVdGlsLmdldE1ldGhvZFBhY2thZ2UocGtnKTsKLQkJCQkJCXdoaWxlIChwa2cgIT0gbnVsbCkgewotCQkJCQkJCXBpZCA9IHBrZy5nZXRHdWlkKCk7Ci0JCQkJCQkJaWYgKHNvdXJjZUVsZW1lbnRJRHMuY29udGFpbnMocGlkKSkgewotCQkJCQkJCQlkZWxldGVkRWxlbWVudHMuYWRkKGUpOwotCQkJCQkJCQloYW5kbGVBY3Rpdml0eVJlbW92YWwoZSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCQlwa2cgPSBUbmdVdGlsLmdldFBhcmVudE1ldGhvZFBhY2thZ2UocGtnKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gZGVsZXRlIHRoZSByZXNvdXJjZXMKLQkJZGVsZXRlUmVzb3J1Y2VzKGRlbGV0ZWRFbGVtZW50cyk7Ci0JfQotCi0JLy8JMTY0NTgxCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUFjdGl2aXR5UmVtb3ZhbChNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKCEoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQnJlYWtkb3duRWxlbWVudCBlYWN0ID0gKEJyZWFrZG93bkVsZW1lbnQpIGU7Ci0JCUFjdGl2aXR5IHNhY3QgPSBlYWN0LmdldFN1cGVyQWN0aXZpdGllcygpOwotCQlpZiAoc2FjdCAhPSBudWxsKSB7Ci0JCQlzYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlKGVhY3QpOwotCQl9Ci0JfQotCQotCS8vIGNsZWFyIHJlc291cmNlcyBmb3IgZGVsZXRlZCBlbGVtZW50cwotCXByaXZhdGUgdm9pZCBkZWxldGVSZXNvcnVjZXMoTGlzdCBkZWxldGVkRWxlbWVudHMpIHsKLQkJaWYgKCBkZWxldGVkRWxlbWVudHMuc2l6ZSgpID09IDAgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUlGaWxlTWFuYWdlciBmaWxlTWdyID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGVsZXRlZEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0JCQkKLQkJCUVPYmplY3Qgb2JqID0gbnVsbDsKLQkJCWlmICggZSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCApIHsKLQkJCQlvYmogPSAoKERlc2NyaWJhYmxlRWxlbWVudCllKS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCX0gZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gfHwKLQkJCQkJb3ZlcndyaXRlICYmIGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJb2JqID0gZTsKLQkJCX0KLQkJCWlmICggb2JqICE9IG51bGwgKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJCQlSZXNvdXJjZSBwbHVnaW5SZXMgPSBwbHVnaW4gPT0gbnVsbCA/IG51bGwgOiBwbHVnaW4uZVJlc291cmNlKCk7Ci0JCQkJCi0JCQkJUmVzb3VyY2UgcmVzID0gb2JqLmVSZXNvdXJjZSgpOwotCQkJCWlmICggcmVzICE9IG51bGwgJiYgcmVzICE9IHBsdWdpblJlcykgewkJLy9Qcm90ZWN0ZWQgZnJvbSBidWdzIGxpa2UgMTc3MDQyCi0JCQkJCVN0cmluZyBmaWxlID0gcmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJCQlpZiAoIGRlYnVnICkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJkZWxldGluZyByZXNvdXJjZTogIiArIGZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmICggIWZpbGVNZ3IuZGVsZXRlKGZpbGUpICkgewotCQkJCQkJaWYgKCBkZWJ1ZyApIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuYWJsZSB0byBkZWxldGUgZmlsZTogIiArIGZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCUVPYmplY3QgcmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UmVzb3VyY2VNYW5hZ2VyKHJlcyk7Ci0JCQkJCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShyZXNNZ3IpOwotCQkJCQl9Ci0JCQkJCUVPYmplY3QgcmVzRGVzID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKHJlcyk7Ci0JCQkJCWlmIChyZXNEZXMgIT0gbnVsbCkgewotCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShyZXNEZXMpOwotCQkJCQl9Ci0JCQkJCWlmIChvdmVyd3JpdGUpIHsJCQkJCQkKLQkJCQkJCUZpbGUgZm9sZGVyID0gbmV3IEZpbGUoZmlsZSkuZ2V0UGFyZW50RmlsZSgpOwotCQkJCQkJRmlsZSBmaWxlc1tdID0gZm9sZGVyLmxpc3RGaWxlcygpOwotCQkJCQkJaWYgKGZpbGVzID09IG51bGwgfHwgZmlsZXMubGVuZ3RoID09IDAgKSB7Ci0JCQkJCQkJaWYgKCBkZWJ1ZyApIHsKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJkZWxldGluZyBmb2xkZXIgcmVzb3VyY2U6ICIgKyBmb2xkZXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWlmICggIWZpbGVNZ3IuZGVsZXRlKGZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSkgKSB7Ci0JCQkJCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuYWJsZSB0byBkZWxldGUgZm9sZGVyIGZpbGU6ICIgKyBmb2xkZXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9CQkJCQkJCQkKLQkJCX0KLQkJCQotCQkJRWNvcmVVdGlsLnJlbW92ZShlKTsKLQkJfQotCX0KLQkJCQotCS8qKgotCSAqIEBwYXJhbSBndWlkCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50IGdpdmVuIGJ5IGd1aWQgaXMgbmV3LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmV3RWxlbWVudChTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gbmV3RWxlbWVudHNNYXAuY29udGFpbnNLZXkoZ3VpZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzliMTY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBhbmQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBJbXBvcnQgWE1MIHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3dpemFyZHMvSW1wb3J0WE1MV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvd2l6YXJkcy9JbXBvcnRYTUxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE1YWE5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvd2l6YXJkcy9JbXBvcnRYTUxXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuU2F2ZUFsbEVkaXRvcnNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLkltcG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5JbXBvcnRYTUxSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwucHJlZmVyZW5jZXMuSW1wb3J0WE1MUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuc2VydmljZXMuSW1wb3J0WE1MU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLkxpYnJhcnlCYWNrdXBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIFRoZSBJbXBvcnQgWE1MIHdpemFyZC4KLSAqIDxwPgotICogVGhpcyB3aXphcmQgaXMgdXNlZCB0byBpbXBvcnQgbWV0aG9kIGxpYnJhcnkgY29udGVudCBzdG9yZWQgaW4gYSBYTUwgZmlsZS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0WE1MV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCB7Ci0KLQlJbXBvcnRYTUxTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgSW1wb3J0WE1MU2VydmljZSgpOwotCi0JcHJpdmF0ZSBib29sZWFuIHN1Y2NlZWQgPSB0cnVlOwotCQotCXByaXZhdGUgU2VsZWN0WE1MRmlsZVBhZ2UgZmlsZVBhZ2UgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSW1wb3J0WE1MV2l6YXJkKCkgewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZShJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MV2l6YXJkX3RpdGxlKTsKLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCS8vIGNoZWNrIG91dCB0aGUgbGlicmFyeSBmaXJzdAotCQlJRmlsZU1hbmFnZXIgZmlsZU1nciA9IFNlcnZpY2VzLmdldEZpbGVNYW5hZ2VyKCk7Ci0JCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgIT0gbnVsbCkgewotCQkJZmlsZU1nci5jaGVja01vZGlmeShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpLAotCQkJCQlNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkpOwotCQl9Ci0KLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsICYmIG1hbmFnZXIuaXNNZXRob2RMaWJyYXJ5UmVhZE9ubHkoKSkgewotCQkJRmlsZSBsaWJyYXJ5RmlsZSA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKSwKLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9MSUJSQVJZX01PREVMX0ZJTEVOQU1FKTsKLQkJCUltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MV2l6YXJkX3RpdGxlLAotCQkJCQlJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MRXJyb3JfbXNnLAotCQkJCQlOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MRXJyb3JfcmVhc29uLAotCQkJCQkJCWxpYnJhcnlGaWxlLmdldEFic29sdXRlUGF0aCgpKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTYXZlQWxsRWRpdG9yc1BhZ2UuYWRkUGFnZUlmTmVlZGVkKHRoaXMsIHRydWUsIG51bGwsIG51bGwsIEltcG9ydFhNTFBsdWdpbgotCQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZ1bGwvd2l6YmFuL0ltcG9ydFhNTC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWZpbGVQYWdlID0gbmV3IFNlbGVjdFhNTEZpbGVQYWdlKCk7Ci0JCWFkZFBhZ2UoZmlsZVBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlFeHBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCQkJImZ1bGwvb2JqMTYvWE1MRmlsZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWJvb2xlYW4gcmVmcmVzaCA9IFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5pc0VuYWJsZWQoKTsKLQkJaWYgKHJlZnJlc2gpIHsKLQkJCS8vTmVlZGVkOiBiZWNhdXNlIExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIGFkZHMgZXZlbnRzIHRvIFJlZnJlc2hKb2IgYXQgdGhlCi0JCQkvL2VuZCBvZiAicnVuIiBjYWxsIQotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9CQkKLQkJZmluYWwgYm9vbGVhbiByZXRbXSA9IG5ldyBib29sZWFuWzFdOwkJCi0JCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCXJldFswXSA9IHBlcmZvcm1GaW5pc2hfKCk7Ci0JCQl9CQkJCi0JCX0pOwotCQlpZiAocmVmcmVzaCkgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7IC8vIHRlbXAgc29sdXRpb24gZm9yIHBvdGVudGlhbCByYWNpbmcKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCQkKLQkJCi0JCXJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMucmV2aWV3X2xvZ19maWxlcywKLQkJCQkJCXNlcnZpY2UuZ2V0TG9nUGF0aCgpKTsKLQkJCQkJTXNnQm94LnByb21wdChtc2csIFNXVC5PSyk7Ci0JCQl9CQkJCi0JCX0pOwkJCi0JCQotCQlSZXNvdXJjZVV0aWwucmVmcmVzaFJlc291cmNlcyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJcmV0dXJuIHJldFswXTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcGVyZm9ybUZpbmlzaF8oKSB7Ci0JCUxpYnJhcnlCYWNrdXBVdGlsLnByb21wdEJhY2t1cEN1cnJlbnRMaWJyYXJ5KG51bGwsIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkpOwotCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5iZWdpblRhc2soSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydGluZ1hNTF90ZXh0LAotCQkJCQkJCUlQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0KLQkJCQkJU3RyaW5nIHhtbEZpbGUgPSBmaWxlUGFnZS5nZXRQYXRoKCk7Ci0JCQkJCWJvb2xlYW4gbWVyZ2VPcHRpb24gPSBmaWxlUGFnZS5nZXRNZXJnZU9wdGlvbigpOwotCQkJCQlib29sZWFuIGNoZWNrQmFzZVBsdWdpbnMgPSBmaWxlUGFnZS5nZXRDaGVja0Jhc2VQbHVnaW5zKCk7Ci0JCQkJCXNlcnZpY2Uuc2V0T3ZlcndyaXRlKCFtZXJnZU9wdGlvbik7Ci0JCQkJCXNlcnZpY2Uuc2V0Q2hlY2tCYXNlUGx1Z2lucyhjaGVja0Jhc2VQbHVnaW5zKTsKLQkJCQkJc3VjY2VlZCA9IHNlcnZpY2UubG9hZFhtbCh4bWxGaWxlKTsKLQkJCQkJaWYgKCEgc3VjY2VlZCkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9CQkJCQkKLQkJCQkJc2VydmljZS5kb0ltcG9ydChtb25pdG9yKTsKLQkJCQkJSW1wb3J0WE1MUHJlZmVyZW5jZXMuc2V0WE1MRmlsZSh4bWxGaWxlKTsKLQkJCQkJSW1wb3J0WE1MUHJlZmVyZW5jZXMuc2V0TWVyZ2VPcHRpb24obWVyZ2VPcHRpb24pOwotCQkJCQlJbXBvcnRYTUxQcmVmZXJlbmNlcy5zZXRDaGVja0Jhc2VQbHVnaW5zT3B0aW9uKGNoZWNrQmFzZVBsdWdpbnMpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQotCQkJfQotCQl9OwotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIGZhbHNlLCBvcCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgcmVhbEV4Y2VwdGlvbiA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQlJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFdpemFyZF90aXRsZSwKLQkJCQkJcmVhbEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIHJlYWxFeGNlcHRpb24pOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCFzdWNjZWVkKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy9TdHJpbmcgbXNnID0gTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLnJldmlld19sb2dfZmlsZXMsCi0JCS8vCXNlcnZpY2UuZ2V0TG9nUGF0aCgpKTsKLQkJLy9Nc2dCb3gucHJvbXB0KG1zZywgU1dULk9LKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBvZiB0aGlzIHdpemFyZCBhbmQgZnJlZXMgYWxsIFNXVCByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc2VydmljZS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3dpemFyZHMvU2VsZWN0WE1MRmlsZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC93aXphcmRzL1NlbGVjdFhNTEZpbGVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZjU0OWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3dpemFyZHMvU2VsZWN0WE1MRmlsZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuSW1wb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLkltcG9ydFhNTFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5wcmVmZXJlbmNlcy5JbXBvcnRYTUxQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBYTUwgZmlsZSB0byBpbXBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdFhNTEZpbGVQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0WE1MRmlsZVBhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBUZXh0IHBhdGhUZXh0OwotCi0JcHJpdmF0ZSBTdHJpbmcgcGF0aDsKLQotCXByaXZhdGUgYm9vbGVhbiBtZXJnZU9wdGlvbiA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrQmFzZVBsdWdpbnMgPSB0cnVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0WE1MRmlsZVBhZ2UoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEltcG9ydFhNTFJlc291cmNlcy5zZWxlY3RYTUxGaWxlUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEltcG9ydFhNTFJlc291cmNlcy5zZWxlY3RYTUxGaWxlUGFnZV9kZXNjKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9pbXBfeG1sX3dpemJhbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBmaWxlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWZpbGVMYWJlbC5zZXRUZXh0KEltcG9ydFhNTFJlc291cmNlcy5maWxlTGFiZWxfdGV4dCk7IAotCi0JCXBhdGhUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJcGF0aFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXBhdGhUZXh0LnNldFRleHQoSW1wb3J0WE1MUHJlZmVyZW5jZXMuZ2V0WE1MRmlsZSgpKTsJCQotCQlwYXRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoaXNWYWxpZFBhdGgocGF0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKSkpIHsKLQkJCQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKEltcG9ydFhNTFJlc291cmNlcy5pbnZhbGlkWE1MRmlsZV9lcnJvcik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlCdXR0b24gYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCkpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChJbXBvcnRYTUxSZXNvdXJjZXMuYnJvd3NlQnV0dG9uX3RleHQpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJRmlsZURpYWxvZyBmZCA9IG5ldyBGaWxlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULk9QRU4pOwotCQkJCWZkLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsgIioueG1sIiwgIiouKiIgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCVN0cmluZyBwYXRoID0gZmQub3BlbigpOwotCQkJCWJvb2xlYW4gb2sgPSBmYWxzZTsKLQkJCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJCXBhdGhUZXh0LnNldFRleHQocGF0aCk7Ci0JCQkJCW9rID0gaXNWYWxpZFBhdGgocGF0aCk7Ci0JCQkJfQotCQkJCXNldFBhZ2VDb21wbGV0ZShvayk7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyb3VwIG9wdGlvbkdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlvcHRpb25Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlvcHRpb25Hcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJb3B0aW9uR3JvdXAuc2V0VGV4dChJbXBvcnRYTUxSZXNvdXJjZXMub3B0aW9uR3JvdXBfdGV4dCk7Ci0KLQkJbWVyZ2VPcHRpb24gPSBJbXBvcnRYTUxQcmVmZXJlbmNlcy5nZXRNZXJnZU9wdGlvbigpOwotCQkJCi0JCUJ1dHRvbiBvdmVyd3JpdGVSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKG9wdGlvbkdyb3VwLAotCQkJCUltcG9ydFhNTFJlc291cmNlcy5vdmVyd3JpdGVSYWRpb0J1dHRvbl90ZXh0LCAxLCAhbWVyZ2VPcHRpb24pOwotCQlvdmVyd3JpdGVSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQltZXJnZU9wdGlvbiA9IGZhbHNlOwotCQkJfQotCQl9KTsKLQkJCi0JCUJ1dHRvbiBtZXJnZVJhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24ob3B0aW9uR3JvdXAsCi0JCQkJSW1wb3J0WE1MUmVzb3VyY2VzLm1lcmdlUmFkaW9CdXR0b25fdGV4dCwgMSwgbWVyZ2VPcHRpb24pOwotCQltZXJnZVJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW1lcmdlT3B0aW9uID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkKLQkJR3JvdXAgb3B0aW9uR3JvdXAxID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlvcHRpb25Hcm91cDEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhMSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YTEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlvcHRpb25Hcm91cDEuc2V0TGF5b3V0RGF0YShncmlkRGF0YTEpOwotCQlvcHRpb25Hcm91cDEuc2V0VGV4dChJbXBvcnRYTUxSZXNvdXJjZXMub3B0aW9uR3JvdXAxX3RleHQpOwotCQljaGVja0Jhc2VQbHVnaW5zID0gSW1wb3J0WE1MUHJlZmVyZW5jZXMuZ2V0Q2hlY2tCYXNlUGx1Z2luc09wdGlvbigpOwotCQkJCi0JCUJ1dHRvbiBjaGVja0Jhc2VSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKG9wdGlvbkdyb3VwMSwKLQkJCQlJbXBvcnRSZXNvdXJjZXMuY2hlY2tCYXNlUmFkaW9CdXR0b25fdGV4dCwgMSwgY2hlY2tCYXNlUGx1Z2lucyk7CQotCQljaGVja0Jhc2VSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljaGVja0Jhc2VQbHVnaW5zID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlCdXR0b24gaWdub3JlUmVtb3ZlUmFkaW9CdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihvcHRpb25Hcm91cDEsCi0JCQkJSW1wb3J0UmVzb3VyY2VzLmlnbm9yZVJlbW92ZVJhZGlvQnV0dG9uX3RleHQsIDEsICFjaGVja0Jhc2VQbHVnaW5zKTsKLQkJaWdub3JlUmVtb3ZlUmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY2hlY2tCYXNlUGx1Z2lucyA9IGZhbHNlOwotCQkJfQotCQl9KTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzVmFsaWRQYXRoKHBhdGhUZXh0LmdldFRleHQoKS50cmltKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgdXNlciBzcGVjaWZpYyBwYXRoIGlzIHZhbGlkLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgdXNlciBzcGVjaWZpYyBwYXRoCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXNlciBzcGVjaWZpZWQgcGF0aCBpcyB2YWxpZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCWlmIChmaWxlLmV4aXN0cygpICYmIGZpbGUuaXNGaWxlKCkpIHsKLQkJCXRoaXMucGF0aCA9IHBhdGg7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgWE1MIGZpbGUuCi0JICogCi0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBYTUwgZmlsZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgaW1wb3J0IG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1c2VyIHNlbGVjdGVkIHRoZSBtZXJnZSBvcHRpb24sCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHVzZXIgc2VsZWN0ZWQgdGhlIG92ZXJ3cml0ZSBvcHRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRNZXJnZU9wdGlvbigpIHsKLQkJcmV0dXJuIG1lcmdlT3B0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShMaWJyYXJ5VUlSZXNvdXJjZXMubm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5pc1BhZ2VDb21wbGV0ZSgpOwotCX0JCi0JCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgY2hlY2sgYmFzZSBwbHVnaW4gb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgc2VsZWN0ZWQgdGhlIGNoZWNrIGJhc2UgcGx1Z2luIG9wdGlvbiwKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgdXNlciBzZWxlY3RlZCB0aGUgaWdub3JlIGNoZWNrIGJhc2UgcGx1Z2luIG9wdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldENoZWNrQmFzZVBsdWdpbnMoKSB7Ci0JCXJldHVybiBjaGVja0Jhc2VQbHVnaW5zOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC93aXphcmRzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC93aXphcmRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhlZTYyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvd2l6YXJkcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB3aXphcmRzIGZvciBpbXBvcnRpbmcgbWV0aG9kIGxpYnJhcnkgY29udGVudCBzdG9yZWQgaW4gWE1MLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Ly5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNlY2Q5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Ly5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSBJbXBvcnQgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Ly5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY0NDE1MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmltcG9ydDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdhMDJlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQ7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLAotIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmFwYWNoZS5hbnQsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWksCi0gb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZSwKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcywKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWksCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNzgwY2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvQXV0aG9yaW5nLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvQXV0aG9yaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMxYmFmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL0F1dGhvcmluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL0ltcG9ydGluZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL0ltcG9ydGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NjM5NGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9JbXBvcnRpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9ldG9vbDE2L2ltcF9saWJfY29uZi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL2V0b29sMTYvaW1wX2xpYl9jb25mLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMzMmNlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL2V0b29sMTYvaW1wX2xpYl9jb25mLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvZXRvb2wxNi9pbXBfbWV0aF9wbHVnaW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9ldG9vbDE2L2ltcF9tZXRoX3BsdWdpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OTQ0M2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9ldG9vbDE2L2ltcF9tZXRoX3BsdWdpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL2Z1bGwvd2l6YmFuL2ltcF9saWJfY29uZl93aXpiYW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9mdWxsL3dpemJhbi9pbXBfbGliX2NvbmZfd2l6YmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5MWUyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL2Z1bGwvd2l6YmFuL2ltcF9saWJfY29uZl93aXpiYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9mdWxsL3dpemJhbi9pbXBfbWV0aF9wbHVnaW5fd2l6YmFuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvZnVsbC93aXpiYW4vaW1wX21ldGhfcGx1Z2luX3dpemJhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYmQ2NmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9mdWxsL3dpemJhbi9pbXBfbWV0aF9wbHVnaW5fd2l6YmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTIxOTg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIEltcG9ydAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgSW1wb3J0IFdpemFyZCBDYXRlZ29yeQotaW1wb3J0Q2F0ZWdvcnlOYW1lPU1ldGhvZAotCi0jIEltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkCi1pbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZE5hbWU9TGlicmFyeSBDb25maWd1cmF0aW9uCi1pbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZFRleHQ9SW1wb3J0IGEgbGlicmFyeSBjb25maWd1cmF0aW9uLgotCi0jIEltcG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkCi1pbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkTmFtZT1NZXRob2QgUGx1Zy1pbnMKLWltcG9ydE1ldGhvZFBsdWdpbnNXaXphcmRUZXh0PUltcG9ydCBvbmUgb3IgbW9yZSBtZXRob2QgcGx1Zy1pbnMuCi0KLQotCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNWM5NmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pbXBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkuaW1wb3J0V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHMuSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZCIKLSAgICAgICAgICAgIGljb249Ii9pY29ucy9ldG9vbDE2L2ltcF9saWJfY29uZi5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzLkltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlaW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4gCi0gICAgICAgICAgICAgICAlaW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmRUZXh0Ci0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLmltcG9ydFdpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzLkltcG9ydFBsdWdpbldpemFyZCIKLSAgICAgICAgICAgIGljb249Ii9pY29ucy9ldG9vbDE2L2ltcF9tZXRoX3BsdWdpbi5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzLkltcG9ydFBsdWdpbldpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVpbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkTmFtZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAlaW1wb3J0TWV0aG9kUGx1Z2luc1dpemFyZFRleHQKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLnVpLmltcG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzLkltcG9ydFBsdWdpbldpemFyZCIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYudWkuaW1wb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkIGlkPSJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHMuSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZCIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5jb21tYW5kTGluZVJ1bm5lcnMiPgotICAgICAgPGNvbW1hbmRMaW5lUnVubmVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db21tYW5kTGluZVBsdWdpbkltcG9ydGVyIgotICAgICAgICAgICAgcnVubmVySWQ9ImNvbW1hbmRMaW5lUGx1Z2luSW1wb3J0ZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvSW1wb3J0UGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL0ltcG9ydFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTNiYjg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvSW1wb3J0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi0vKioKLSAqIFRoZSBJbXBvcnQgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgSW1wb3J0UGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEltcG9ydFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbXBvcnRQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvSW1wb3J0UmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL0ltcG9ydFJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTljYzE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvSW1wb3J0UmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSW1wb3J0UmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLlJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbXBvcnRSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFBsdWdpbnNXaXphcmRfRVJSX0ltcG9ydF9wbHVnaW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9NU0cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfRVJSX0ltcG9ydF9jb25maWd1cmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydENvbmZpZ1JlcG9ydFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0UGx1Z2luV2l6YXJkX3JlYWRvbmx5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydFBsdWdpbldpemFyZF9NU0cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydFBsdWdpbldpemFyZF9lcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9leGlzdGluZ19wbHVnaW5zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydFBsdWdpbldpemFyZF9jb25maXJtX2NvbnRpbnVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydFBsdWdpbldpemFyZF93YXJuX2NpcmN1bGFyX3BsdWdpbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0Q29uZmlnc1RvSW1wb3J0X2xhYmVsMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfTVNHMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV90aXRsZTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vdF91c2VkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub19wYXRoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub19kaXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3BsdWdpbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfdmVyc2lvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX3JlYWRvbmx5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0czOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlmZlJlcG9ydFZpZXdlcl9jb250ZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpZmZSZXBvcnRWaWV3ZXJfaW5faW1wb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFBsdWdpbnNUb0ltcG9ydF9NU0cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpZmZSZXBvcnRMYWJlbFByb3ZpZGVyX3llczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RQbHVnaW5zVG9JbXBvcnRfZXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlmZlJlcG9ydFZpZXdlcl9pbl9saWI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlmZlJlcG9ydFZpZXdlcl9zdGF0dXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5FeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5Ob3RFeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNFeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY05vU2VsZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNEYXRhTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGFiZWxfY29uZmlnczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19wYXRoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5Ob1NlbGVjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX2RpcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9yZWFkb25seTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9sb2NrZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9lcnJvcl9ub3RfdXBkYXRhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5EYXRhTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlmZlJlcG9ydFZpZXdlcl90eXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25NaXNtYXRjaF9vbGREYXRhOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbk1pc21hdGNoX29sZFRvb2w7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbk1pc21hdGNoX29sZFRvb2xfdW5rbm93bjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcHRpb25Hcm91cF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrQmFzZVJhZGlvQnV0dG9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaWdub3JlUmVtb3ZlUmFkaW9CdXR0b25fdGV4dDsKLQkJCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSW1wb3J0UmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZmMxOTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMjAwRSAtIElVUEUwMjk5RQotIwotCi0jIEltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkCi1pbXBvcnRDb25maWdXaXphcmRfdGl0bGU9SW1wb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbgotc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90aXRsZT1TcGVjaWZ5IGltcG9ydCBkaXJlY3RvcnkKLXNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGV4dD1TcGVjaWZ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgbGlicmFyeSBjb25maWd1cmF0aW9uIHRvIGltcG9ydC4KLXJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RpdGxlPVJldmlldyBsaWJyYXJ5IGNoYW5nZXMKLXJldmlld0NoYW5nZXNXaXphcmRQYWdlX3RleHQ9UmV2aWV3IHRoZSBjaGFuZ2VzIHRoYXQgd2lsbCBiZSBtYWRlIHRvIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5Lgotc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RpdGxlPVNlbGVjdCBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb25zCi1zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGV4dD1TZWxlY3Qgb25lIG9yIG1vcmUgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucyB0byBpbXBvcnQuCi0KLSMgSW1wb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQKLWltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGU9SW1wb3J0IE1ldGhvZCBQbHVnLWlucwotc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGl0bGU9U3BlY2lmeSBpbXBvcnQgZGlyZWN0b3J5Ci1zZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90ZXh0PVNwZWNpZnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBtZXRob2QgcGx1Zy1pbnMgdG8gaW1wb3J0Lgotc2VsZWN0UGx1Z2luc1dpemFyZFBhZ2VfdGl0bGU9U2VsZWN0IG1ldGhvZCBwbHVnLWlucwotc2VsZWN0UGx1Z2luc1dpemFyZFBhZ2VfdGV4dD1TZWxlY3Qgb25lIG9yIG1vcmUgbWV0aG9kIHBsdWctaW5zIHRvIGltcG9ydC4gSWYgYSBzZWxlY3RlZCBwbHVnLWluIGFscmVhZHkgZXhpc3RzIGluIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LCB2ZXJpZnkgdGhlIHZlcnNpb24gZGlmZmVyZW5jZXMuCi1pbXBvcnRQbHVnaW5zV2l6YXJkX0VSUl9JbXBvcnRfcGx1Z2luPUltcG9ydCBwbHVnLWluIGZhaWxlZAotCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cwPVZhbGlkYXRpbmcgc2VsZWN0ZWQgbGlicmFyeSBjb25maWd1cmF0aW9uLi4uCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cxPVRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBjb25maWd1cmF0aW9uLgotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMz1JbXBvcnRpbmcgbWV0aG9kIGNvbmZpZ3VyYXRpb24uLi4KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzI9Q2Fubm90IGltcG9ydCB0aGUgY3VycmVudGx5IG9wZW5lZCBsaWJyYXJ5IGludG8gaXRzZWxmLgotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9NU0cxPUltcG9ydGluZyBtZXRob2QgY29uZmlndXJhdGlvbi4uLgotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9FUlJfSW1wb3J0X2NvbmZpZ3VyYXRpb249SW1wb3J0IGNvbmZpZ3VyYXRpb24gZmFpbGVkCi0KLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF90aXRsZT1DaGVja291dCBmYWlsZWQKLUZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF9tc2c9U29tZSBmaWxlcyBhcmUgbm90IGNoZWNrZWQgb3V0LCBkbyB5b3Ugd2FudCB0byB0cnkgYWdhaW4/Ci0KLUltcG9ydENvbmZpZ1JlcG9ydFBhZ2VfdGl0bGU9SW1wb3J0aW5nIENvbmZpZ3VyYXRpb24gUmVwb3J0Ci1JbXBvcnRQbHVnaW5XaXphcmRfcmVhZG9ubHk9SVVQRTAyMDFFOiBMaWJyYXJ5IGlzIHJlYWQtb25seS4KLUltcG9ydFBsdWdpbldpemFyZF9NU0cxPUltcG9ydGluZyBtZXRob2QgcGx1Zy1pbi4uLgotSW1wb3J0UGx1Z2luV2l6YXJkX2Vycm9yPUVycm9yCi1JbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9leGlzdGluZ19wbHVnaW5zPUlVUEUwMjAwRTogVGhlIGZvbGxvd2luZyBzZWxlY3RlZCBwbHVnLWluKHMpIGFscmVhZHkgZXhpc3QgYW5kIHJlLWltcG9ydGluZyB0aGUgc2FtZSBwbHVnLWluKHMpIHdpbGwgb3ZlcndyaXRlIHRoZSBleGlzdGluZyBvbmUocyk6XG5cbiB7MH0gXG5cbkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjb250aW51ZT8KLUltcG9ydFBsdWdpbldpemFyZF9jb25maXJtX2NvbnRpbnVlPVxuXG5BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/Ci1JbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9jaXJjdWxhcl9wbHVnaW5zPUNpcmN1bGFyIHJlZmVyZW5jZXMgZGV0ZWN0ZWQgYW1vbmcgdGhlIGZvbGxvd2luZyBwbHVnLWlucwotCi1TZWxlY3RDb25maWdzVG9JbXBvcnRfbGFiZWwxPVRoZSBmb2xsb3dpbmcgZWxlbWVudHMgd2lsbCBiZSBpbXBvcnRlZDoKLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfZXJyb3I9RXJyb3IKLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfTVNHMT1BbmFseXppbmcKLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX3RpdGxlMj1TZWxlY3QgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucyB0byBpbXBvcnQKLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub3RfdXNlZD1ub3RfdXNlZAotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX3BhdGg9VGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fZGlyPU5vIGRpcmVjdG9yeSBzcGVjaWZpZWQKLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9wbHVnaW5zPUF2YWlsYWJsZSBwbHVnLWlucyBpbiB0aGUgaW1wb3J0IGRpcmVjdG9yeToKLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9hdXRob3I9QXV0aG9yOgotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3ZlcnNpb249VmVyc2lvbjoKLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9kZXNjPUJyaWVmIGRlc2NyaXB0aW9uOgotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9yZWFkb25seT1JVVBFMDIwMUU6IExpYnJhcnkgaXMgcmVhZC1vbmx5LgotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cwPVZhbGlkYXRpbmcgc2VsZWN0ZWQgcGx1Zy1pbnMuLi4KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMT1UaGUgc3BlY2lmaWVkIHBhdGggZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIG1ldGhvZCBwbHVnLWluLgotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0czPUltcG9ydGluZyBtZXRob2QgcGx1Zy1pbi4uLgotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c1PVRoZSBzZWxlY3RlZCBtZXRob2QgcGx1Zy1pbiBjYW5ub3QgYmUgaW1wb3J0ZWQuIEl0cyBkZXBlbmRlbnQgcGx1Zy1pbiAnJ3swfScnIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNj1UaGUgc2VsZWN0ZWQgbWV0aG9kIHBsdWctaW4gY2Fubm90IGJlIGltcG9ydGVkLiBBIGRlcGVuZGVudCBwbHVnLWluIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLURpZmZSZXBvcnRWaWV3ZXJfY29udGVudD1Db250ZW50Ci1EaWZmUmVwb3J0Vmlld2VyX2luX2ltcG9ydD1JbiBJbXBvcnQKLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9NU0cxPUFuYWx5emluZyBmaWxlcy4uLgotRGlmZlJlcG9ydExhYmVsUHJvdmlkZXJfeWVzPVllcwotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2Vycm9yPUVycm9yCi1EaWZmUmVwb3J0Vmlld2VyX2luX2xpYj1JbiBMaWJyYXJ5Ci1EaWZmUmVwb3J0Vmlld2VyX3N0YXR1cz1TdGF0dXMKLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luRXhpc3RzPVNlbGVjdGVkIHBsdWctaW4gZm91bmQgaW4gdGhlIGN1cnJlbnQgbGlicmFyeQotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5Ob3RFeGlzdHM9U2VsZWN0ZWQgcGx1Zy1pbiBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgbGlicmFyeQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNFeGlzdHM9Q29uZmlndXJhdGlvbiBmb3VuZCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5Ci1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjTm9TZWxlY3Rpb249Tm8gY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uIHNlbGVjdGVkLgotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY0RhdGFMYWJlbD1TZWxlY3RlZCBjb25maWd1cmF0aW9uIGluIHRoZSBpbXBvcnQgZGlyZWN0b3J5Ci1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9jb25maWdzPUF2YWlsYWJsZSBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb25zIGluIHRoZSBpbXBvcnQgZGlyZWN0b3J5OgotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub3RfdXNlZD1ub3RfdXNlZAotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGFiZWxfZGVzYz1CcmllZiBkZXNjcmlwdGlvbjoKLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm9fcGF0aD1UaGUgc3BlY2lmaWVkIHBhdGggZG9lcyBub3QgZXhpc3QuCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luTm9TZWxlY3Rpb249Tm8gcGx1Zy1pbiBzZWxlY3RlZC4KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm9fZGlyPU5vIGRpcmVjdG9yeSBzcGVjaWZpZWQKLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX3JlYWRvbmx5PVBsdWctaW4gezB9IGlzIHJlYWQtb25seVxuCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9sb2NrZWQ9SVVQRTAyMDNFOiBQbHVnLWluIHswfSBpcyBsb2NrZWRcbgotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9lcnJvcl9ub3RfdXBkYXRhYmxlPVNvbWUgb2YgdGhlIHBsdWctaW4ocykgaW4gdGhlIGxpYnJhcnkgYXJlIGVpdGhlciBsb2NrZWQgb3IgcmVhZC1vbmx5LlxuIFBsZWFzZSB1bmxvY2sgdGhlIHBsdWctaW5zIGFuZCBtYWtlIHN1cmUgdGhlIGZpbGVzIGFyZSB1cGRhdGFibGUuCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luRGF0YUxhYmVsPVNlbGVjdGVkIHBsdWctaW4gaW4gdGhlIGltcG9ydCBkaXJlY3RvcnkKLURpZmZSZXBvcnRWaWV3ZXJfdHlwZT1Db250ZW50IFR5cGUKLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzPVNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gbm90IGZvdW5kIGluIHRoZSBjdXJyZW50IGxpYnJhcnkuCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YT1JVVBFMDIwNEU6IFRoZSBzcGVjaWZpZWQgZmlsZXMgd2VyZSBleHBvcnRlZCBieSBhIHByZXZpb3VzIHZlcnNpb24gKHswfSkgb2YgezF9LiBUaGUgZmlsZXMgbXVzdCBiZSBleHBvcnRlZCB1c2luZyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHsxfS4KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd249SVVQRTAyMDVFOiBUaGUgc3BlY2lmaWVkIGZpbGVzIHdlcmUgZXhwb3J0ZWQgYnkgYSBwcmV2aW91cyB2ZXJzaW9uIG9mIHswfS4gVGhlIGZpbGVzIG11c3QgYmUgZXhwb3J0ZWQgdXNpbmcgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB7MH0uCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbD1JVVBFMDIwNkU6IFRoZSBzcGVjaWZpZWQgZmlsZXMgd2VyZSBleHBvcnRlZCBieSBhIG5ld2VyIHZlcnNpb24gKHswfSkgb2YgezF9LiBZb3UgbXVzdCB1cGdyYWRlIHsxfSBpbiBvcmRlciB0byBpbXBvcnQgdGhlIGZpbGVzLiAgCi12ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duPUlVUEUwMjA3RTogVGhlIHNwZWNpZmllZCBmaWxlcyBjYW5ub3QgYmUgb3BlbmVkLiBZb3UgbXVzdCB1cGdyYWRlIHswfSBpbiBvcmRlciB0byBpbXBvcnQgdGhlIGZpbGVzLgotb3B0aW9uR3JvdXBfdGV4dD1JbXBvcnQgb3B0aW9uCi1jaGVja0Jhc2VSYWRpb0J1dHRvbl90ZXh0PUNoZWNrIGJhc2UgcGx1Zy1pbnMKLWlnbm9yZVJlbW92ZVJhZGlvQnV0dG9uX3RleHQ9SWdub3JlIGFuZCByZW1vdmUgdW5yZXNvbHZlZCByZWZlcmVuY2VzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmI5MDMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGFjdGl2YXRvciBmb3IgbWFuYWdpbmcgdGhlIEltcG9ydCBwbHVnLWluJ3MgbGlmZSBjeWNsZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbW1hbmRMaW5lUGx1Z2luSW1wb3J0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29tbWFuZExpbmVQbHVnaW5JbXBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmRlYjdiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29tbWFuZExpbmVQbHVnaW5JbXBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuQ29tbWFuZExpbmVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBmb3IgaW1wb3J0aW5nIHBsdWdpbiBkcml2ZW4gYnkgY29tbWFuZCBsaW5lCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWFuZExpbmVQbHVnaW5JbXBvcnRlciBleHRlbmRzIENvbW1hbmRMaW5lUnVubmVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBJbXBvcnRQbHVnaW5zVGFnID0gIkltcG9ydFBsdWdpbnMiOyAJLy8kTk9OLU5MUy0xJCIJCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNlbGVjdGVkUGx1Z2luVGFnID0gIlNlbGVjdGVkUGx1Z2luIjsgLy8kTk9OLU5MUy0xJCIKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQmFzZUxpYnJhcnlGb2xkZXJVcmlBdHQ9ICJiYXNlTGlicmFyeUZvbGRlclVyaSI7CQkvLyROT04tTkxTLTEkIgotCXByaXZhdGUgc3RhdGljIFN0cmluZyBJbXBvcnRMaWJyYXJ5Rm9sZGVyVXJpQXR0PSAiaW1wb3J0TGlicmFyeUZvbGRlclVyaSI7CQkvLyROT04tTkxTLTEkIgotCXByaXZhdGUgc3RhdGljIFN0cmluZyBOYW1lQXR0PSAibmFtZSI7CQkvLyROT04tTkxTLTEkIgotCi0JcHJpdmF0ZSBTdHJpbmcgYmFzZUxpYlBhdGg7Ci0JcHJpdmF0ZSBTdHJpbmcgaW1wb3J0TGliUGF0aDsKLQkKLQlwcml2YXRlIFNldDxTdHJpbmc+IHNlbGVjdGVkUGx1Z2luczsKLQkKLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaWYgKCEgc3VwZXIuZXhlY3V0ZShhcmdzKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXRyeSB7Ci0JCQlsb2FkSW5wdXRGaWxlKCk7Ci0JCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLQkJCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQl0cnkgewotCQkJCQkJbW9uaXRvci5zZXRUYXNrTmFtZSgiT3Blbm5pbmcgYmFzZSBsaWJyYXJ5IGFuZCBwcmVwYXJpbmcgaW1wb3J0IC4uLiIpOy8vJE5PTi1OTFMtMSQiCi0JCQkJCQlYTUlMaWJyYXJ5VXRpbC5vcGVuTWV0aG9kTGlicmFyeShiYXNlTGliUGF0aCk7Ci0KLQkJCQkJCUZpbGUgaW1wb3J0TGliRm9sZGVyID0gbmV3IEZpbGUoaW1wb3J0TGliUGF0aCk7Ci0KLQkJCQkJCVBsdWdpbkltcG9ydERhdGEgZGF0YSA9IG5ldyBQbHVnaW5JbXBvcnREYXRhKCk7Ci0JCQkJCQlkYXRhLmxsRGF0YS5zZXRMaWJOYW1lKGltcG9ydExpYkZvbGRlci5nZXROYW1lKCkpOwotCQkJCQkJZGF0YS5sbERhdGEuc2V0UGFyZW50Rm9sZGVyKGltcG9ydExpYkZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCQlmaW5hbCBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgUGx1Z2luSW1wb3J0aW5nU2VydmljZShkYXRhKTsKLQkJCQkJCXNlcnZpY2UudmFsaWRhdGUobnVsbCk7Ci0JCQkJCQkKLQkJCQkJCUxpc3QgaW1wb3J0UGx1Z2lucyA9IGRhdGEuZ2V0UGx1Z2lucygpOwotCQkJCQkJZm9yIChpbnQgaT0wOyBpIDwgaW1wb3J0UGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJCQkJCVBsdWdpbkluZm8gaW5mbyA9IChQbHVnaW5JbmZvKSBpbXBvcnRQbHVnaW5zLmdldChpKTsKLQkJCQkJCQlpbmZvLnNlbGVjdGVkID0gc2VsZWN0ZWRQbHVnaW5zLmlzRW1wdHkoKSB8fCBzZWxlY3RlZFBsdWdpbnMuY29udGFpbnMoaW5mby5uYW1lKTsJCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXNlcnZpY2UucGVyZm9ybUltcG9ydChtb25pdG9yKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQkKLQkJCVByb2dyZXNzTW9uaXRvckRpYWxvZyBwbURpYWxvZyA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSk7Ci0JCQlwbURpYWxvZy5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7Ci0JCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkSW5wdXRGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gWE1MVXRpbC5sb2FkWG1sKGdldElucHV0RmlsZSgpKTsJCi0JCUVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCQlpZiAoISByb290LmdldFRhZ05hbWUoKS5lcXVhbHMoSW1wb3J0UGx1Z2luc1RhZykpIHsKLQkJCVN0cmluZyBtc2cgPSAiVGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlOiAgIiArIEltcG9ydFBsdWdpbnNUYWc7ICAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtc2cpOwotCQl9Ci0JCWJhc2VMaWJQYXRoID0gcm9vdC5nZXRBdHRyaWJ1dGUoQmFzZUxpYnJhcnlGb2xkZXJVcmlBdHQpOwotCQlpbXBvcnRMaWJQYXRoID0gcm9vdC5nZXRBdHRyaWJ1dGUoSW1wb3J0TGlicmFyeUZvbGRlclVyaUF0dCk7Ci0JCXNlbGVjdGVkUGx1Z2lucyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJCi0JCU5vZGVMaXN0IG5vZGVzID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBzeiA9IG5vZGVzID09IG51bGwgPyAwIDogbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxzejsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKGkpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0VGFnTmFtZSgpLmVxdWFscyhTZWxlY3RlZFBsdWdpblRhZykpIHsKLQkJCQkJU3RyaW5nIG5hbWUgID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoTmFtZUF0dCk7CQkJCQkKLQkJCQkJc2VsZWN0ZWRQbHVnaW5zLmFkZChuYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ1NwZWNzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ1NwZWNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4OTY5NzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWdTcGVjcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uU3BlYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLQotLyoqCi0gKiBNb2RlbHMgYSBsaXN0IG9mIGxpYnJhcnkgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ1NwZWNzIHsKLQotCS8vIEEgbGlzdCBvZiBjb25maWd1cmF0aW9uIGVudHJpZXMuCi0JcHVibGljIExpc3QgY29uZmlncyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ1NwZWNzKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgZW50cnkuCi0JICovCi0JcHVibGljIEVudHJ5IG5ld0VudHJ5KCkgewotCQlFbnRyeSBlID0gbmV3IEVudHJ5KCk7Ci0JCWNvbmZpZ3MuYWRkKGUpOwotCi0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBpdGVyYXRvciBmb3IgdGhlIGNvbmZpZyBzcGVjcy4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBjb25maWdzLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIGNsYXNzIEVudHJ5IHsKLQotCQlwdWJsaWMgQ29uZmlndXJhdGlvblNwZWMgY29uZmlnU3BlYyA9IG51bGw7Ci0KLQkJcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZXhpc3RpbmdDb25maWcgPSBudWxsOwotCi0JCXB1YmxpYyBib29sZWFuIHNlbGVjdGVkID0gdHJ1ZTsKLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJaWYgKGNvbmZpZ1NwZWMgIT0gbnVsbCkKLQkJCQlpZiAoY29uZmlnU3BlYy5uYW1lICE9IG51bGwpCi0JCQkJCXJldHVybiBjb25maWdTcGVjLm5hbWU7Ci0JCQlyZXR1cm4gInVua25vd24gY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlnU3BlY3NJbXBvcnRNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ1NwZWNzSW1wb3J0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDA2OWIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlnU3BlY3NJbXBvcnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25TcGVjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuTGlicmFyeURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBpbXBvcnQgb2YgbGlicmFyeSBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb25zLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlnU3BlY3NJbXBvcnRNYW5hZ2VyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JQ29uZmlnU3BlY3NJbXBvcnRNYW5hZ2VyKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbmZpZyBzcGVjcyBpbiB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIENvbmZpZ1NwZWNzIGdldENvbmZpZ1NwZWNzKGZpbmFsIExpYnJhcnlEb2N1bWVudCBkb2N1bWVudCkgewotCQlmaW5hbCBDb25maWdTcGVjcyBjb25maWdTcGVjcyA9IG5ldyBDb25maWdTcGVjcygpOwotCi0JCS8vIFJlbW92ZSB0aGUgdW5uZWVkZWQgY29uZmlndXJhdGlvbnMuCi0JCUZpbGUgY29uZmlnRGlyID0gbmV3IEZpbGUoZG9jdW1lbnQuZ2V0RmlsZSgpLmdldFBhcmVudCgpLCBNdWx0aUZpbGVTYXZlVXRpbC5NRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSk7CQkJCi0JCUxpYnJhcnlEb2N1bWVudC5Db25maWdEb2NWaXNpdG9yIHZpc2l0b3IgPSBuZXcgTGlicmFyeURvY3VtZW50LkNvbmZpZ0RvY1Zpc2l0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2aXNpdChGaWxlIGZpbGUsIEVsZW1lbnQgbm9kZSkgewotCQkJCUNvbmZpZ1NwZWNzLkVudHJ5IGVudHJ5ID0gY29uZmlnU3BlY3MubmV3RW50cnkoKTsKLQkJCQllbnRyeS5jb25maWdTcGVjID0gZG9jdW1lbnQuZ2V0Q29uZmlndXJhdGlvblNwZWMobm9kZSk7Ci0JCQkJZW50cnkuZXhpc3RpbmdDb25maWcgPSBnZXRFeGlzdGluZ0NvbmZpZyhlbnRyeS5jb25maWdTcGVjLmd1aWQpOwotCQkJfQotCQl9OwkJCQotCQlMaWJyYXJ5RG9jdW1lbnQudmlzaXRDb25maWdGaWxlcyhjb25maWdEaXIsIHZpc2l0b3IpOwkJCQotCQlyZXR1cm4gY29uZmlnU3BlY3M7Ci0JfQotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGdldEV4aXN0aW5nQ29uZmlnKFN0cmluZyBndWlkKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25zKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJaWYgKGNvbmZpZ3MgPT0gbnVsbCB8fCBjb25maWdzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb25maWdzW2ldOwotCQkJaWYgKGNvbmZpZy5nZXRHdWlkKCkuZXF1YWxzKGd1aWQpKSB7Ci0JCQkJcmV0dXJuIGNvbmZpZzsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEltcG9ydHMgdGhlIHNlbGVjdGVkIGxpYnJhcnkgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gc3BlY3MKLQkgKiAgICAgICAgICAgIEEgbGlicmFyeSBjb25maWd1cmF0aW9uIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0ltcG9ydChDb25maWdTcGVjcyBzcGVjcykgewotCQl0cnkgewotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCi0JCQlMaWJyYXJ5VXRpbC5sb2FkQWxsKGxpYik7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBzcGVjcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJQ29uZmlnU3BlY3MuRW50cnkgZW50cnkgPSAoQ29uZmlnU3BlY3MuRW50cnkpIGl0Lm5leHQoKTsKLQkJCQlpZiAoZW50cnkuc2VsZWN0ZWQpIHsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBjcmVhdGVDb25maWcoZW50cnkuY29uZmlnU3BlYyk7Ci0KLQkJCQkJaWYgKGVudHJ5LmV4aXN0aW5nQ29uZmlnICE9IG51bGwpIHsKLQkJCQkJCS8vIE1lcmdlIHRoZSBuZXcgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzIGludG8gdGhlIGV4aXN0aW5nCi0JCQkJCQkvLyBvbmUsCi0JCQkJCQkvLyBhbnl0aGluZyBpbiB0aGUgY3VycmVudCBjb25maWd1YXRpb24gc2hvdWxkIGJlIGtlcHQuCi0JCQkJCQkvLyBFY29yZVV0aWwucmVwbGFjZShlbnRyeS5leGlzdGluZ0NvbmZpZywgY29uZmlnKTsKLQkJCQkJCUxpc3QgcGx1Z2lucyA9IGVudHJ5LmV4aXN0aW5nQ29uZmlnCi0JCQkJCQkJCS5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJCQkJCUxpc3QgcGtncyA9IGVudHJ5LmV4aXN0aW5nQ29uZmlnCi0JCQkJCQkJCS5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCQkJCQlMaXN0IHZpZXdzID0gZW50cnkuZXhpc3RpbmdDb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCk7Ci0KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRwID0gY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpCi0JCQkJCQkJCS5pdGVyYXRvcigpOyBpdHAuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBlID0gaXRwLm5leHQoKTsKLQkJCQkJCQlpZiAoIXBsdWdpbnMuY29udGFpbnMoZSkpIHsKLQkJCQkJCQkJcGx1Z2lucy5hZGQoZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0cCA9IGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0cC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IGUgPSBpdHAubmV4dCgpOwotCQkJCQkJCWlmICghcGtncy5jb250YWlucyhlKSkgewotCQkJCQkJCQlwa2dzLmFkZChlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRwID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpLml0ZXJhdG9yKCk7IGl0cAotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBlID0gaXRwLm5leHQoKTsKLQkJCQkJCQlpZiAoIXBrZ3MuY29udGFpbnMoZSkpIHsKLQkJCQkJCQkJdmlld3MuYWRkKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIEFkZCB0aGUgY29uZmlndXJhdGlvbi4KLQkJCQkJCWxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5hZGQoY29uZmlnKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJTGlicmFyeVV0aWwuc2F2ZUxpYnJhcnkobGliLCBmYWxzZSwgZmFsc2UpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY3JlYXRlQ29uZmlnKENvbmZpZ3VyYXRpb25TcGVjIHNwZWMpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkJLy8gU2V0IHRoZSBhdHRyaWJ1dGVzLgotCQljb25maWcuc2V0TmFtZShzcGVjLm5hbWUpOwotCQljb25maWcuc2V0QnJpZWZEZXNjcmlwdGlvbihzcGVjLmJyaWVmX2Rlc2MpOwotCQljb25maWcuc2V0R3VpZChzcGVjLmd1aWQpOwotCi0JCUxpc3QgcGx1Z2lucyA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJTGlzdCBwa2dzID0gY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJTGlzdCB2aWV3cyA9IGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKTsKLQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBzcGVjLnBsdWdpbklkcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiAhcGx1Z2lucy5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQlwbHVnaW5zLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBzcGVjLnBhY2thZ2VJZHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gbWFuYWdlci5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgIXBrZ3MuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQkJcGtncy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc3BlYy52aWV3SWRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQlPYmplY3QgZWxlbWVudCA9IG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsICYmICF2aWV3cy5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQl2aWV3cy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlndXJhdGlvbkltcG9ydERhdGEuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlndXJhdGlvbkltcG9ydERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0Y2U2MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25JbXBvcnREYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuTGlicmFyeUxvY2F0aW9uRGF0YTsKLQotCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyB0aGUgaW5wdXQgZGF0YSByZXF1aXJlZCB0byBpbXBvcnQgYSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uSW1wb3J0RGF0YSB7Ci0KLQlwdWJsaWMgTGlicmFyeUxvY2F0aW9uRGF0YSBsbERhdGEgPSBuZXcgTGlicmFyeUxvY2F0aW9uRGF0YSgpOwotCi0JcHJpdmF0ZSBFcnJvckluZm8gZXJyb3IgPSBuZXcgRXJyb3JJbmZvKCk7Ci0KLQkvLyBJZiBzcGVjcyAhPSBudWxsLCBpdCdzIGEgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uIG9ubHkuCi0JcHVibGljIENvbmZpZ1NwZWNzIHNwZWNzID0gbnVsbDsKLQotCXB1YmxpYyBMaXN0IGltcG9ydExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyBJbmRpY2F0ZSBpZiB5b3Ugd2FudCB0byByZXBsYWNlIGV4aXN0aW5nIG1ldGhvZCBwYWNrYWdlcy4KLQlwdWJsaWMgYm9vbGVhbiByZXBsYWNlRXhpc3RpbmcgPSB0cnVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkltcG9ydERhdGEoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSBpZiBhbnkuCi0JICovCi0JcHVibGljIEVycm9ySW5mbyBnZXRFcnJvckluZm8oKSB7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgRXJyb3JJbmZvIHsKLQotCQlwcml2YXRlIFN0cmluZ0J1ZmZlciBlcnJvck1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJcHVibGljIEVycm9ySW5mbygpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCQllcnJvck1lc3NhZ2UuYXBwZW5kKG1lc3NhZ2UpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRFcnJvcigpIHsKLQkJCXJldHVybiBlcnJvck1lc3NhZ2UudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkJZXJyb3JNZXNzYWdlLnNldExlbmd0aCgwKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzM3M2E4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5WZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5MaWJyYXJ5RG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudXRpbC5Db252ZXJ0R3VpZGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnV0aWwuVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLk9wZW5MaWJyYXJ5V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuQ2FsZW5kYXI7Ci0KLQotLyoqCi0gKiBJbXBvcnRzIGEgbGlicmFyeSBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UgewotCi0JcHJpdmF0ZSBib29sZWFuIGxvY2FsRGVidWcgPSBmYWxzZTsKLQkKLQlwcml2YXRlIFVwZ3JhZGVDYWxsZXJJbmZvIHVwR3JhZGVJbmZvOwotCQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkltcG9ydERhdGEgZGF0YTsKLQotCUxpYnJhcnlEb2N1bWVudCBpbXBvcnRpbmdMaWJEb2MgPSBudWxsOwotCi0JTGlicmFyeURpZmZNYW5hZ2VyIGRpZmZNZ3IgPSBudWxsOwotCi0JQ29uZmlnU3BlY3NJbXBvcnRNYW5hZ2VyIHNwZWNzTWdyID0gbnVsbDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZShDb25maWd1cmF0aW9uSW1wb3J0RGF0YSBkYXRhKSB7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogQW5hbHl6ZXMgdGhlIGltcG9ydGVkIGxpYnJhcnkgd2l0aCByZXNwZWN0IHRvIHRoZSBiYXNlIGxpYnJhcnkuCi0JICovCi0JcHVibGljIHZvaWQgYW5hbHl6ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLnNldFRhc2tOYW1lKEltcG9ydFJlc291cmNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cwKTsKLQkJCX0KLQotCQkJZGF0YS5nZXRFcnJvckluZm8oKS5jbGVhcigpOwotCi0JCQkvLyBQcmVwYXJlIHRoZSBsaWJyYXJ5IGZpbGVzLgotCQkJU3RyaW5nIHBhdGggPSBkYXRhLmxsRGF0YS5nZXRQYXJlbnRGb2xkZXIoKTsKLQkJCWlmIChwYXRoLmluZGV4T2YoRmlsZS5zZXBhcmF0b3IgKyBMaWJyYXJ5RG9jdW1lbnQubGlicmFyeUZpbGUpIDwgMCkgewotCQkJCXBhdGggKz0gRmlsZS5zZXBhcmF0b3IgKyBMaWJyYXJ5RG9jdW1lbnQubGlicmFyeUZpbGU7Ci0JCQl9Ci0JCQlGaWxlIGltcG9ydGluZ0xpYlBhdGggPSBuZXcgRmlsZShwYXRoKTsKLQkJCQotCQkJYm9vbGVhbiBpc0xpYnJhcnlGaWxlID0gdHJ1ZTsKLQkJCWlmICghaW1wb3J0aW5nTGliUGF0aC5leGlzdHMoKSkgewotCQkJCWltcG9ydGluZ0xpYlBhdGggPSBuZXcgRmlsZShpbXBvcnRpbmdMaWJQYXRoLmdldFBhcmVudEZpbGUoKSwKLQkJCQkJCUxpYnJhcnlEb2N1bWVudC5leHBvcnRGaWxlKTsKLQkJCQlpc0xpYnJhcnlGaWxlID0gZmFsc2U7Ci0JCQl9Ci0KLQkJCWlmICghaW1wb3J0aW5nTGliUGF0aC5leGlzdHMoKSkgewotCQkJCWRhdGEKLQkJCQkJCS5nZXRFcnJvckluZm8oKQotCQkJCQkJLmFkZEVycm9yKAotCQkJCQkJCQlOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMSwgaW1wb3J0aW5nTGliUGF0aC5nZXRQYXJlbnQoKSkpOyAKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWJvb2xlYW4gaGFuZGxlVmVyc2lvbiA9IGlzTGlicmFyeUZpbGU7Ci0JCQlpZiAoaGFuZGxlVmVyc2lvbikgewotCQkJCXVwR3JhZGVJbmZvID0gbmV3IENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlLlVwZ3JhZGVJbmZvKFVwZ3JhZGVDYWxsZXJJbmZvLnVwZ3JhZGVJbXBvcnRDb25maWcsIGltcG9ydGluZ0xpYlBhdGgpOwotCQkJCWlmICghIGhhbmRsZVRvb2xWZXJzaW9uKGltcG9ydGluZ0xpYlBhdGgsIHVwR3JhZGVJbmZvKSkgewotCQkJCQlkYXRhCi0JCQkJCS5nZXRFcnJvckluZm8oKQotCQkJCQkuYWRkRXJyb3IoCi0JCQkJCQkJTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLkltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfRVJSX0ltcG9ydF9jb25maWd1cmF0aW9uLCBpbXBvcnRpbmdMaWJQYXRoLmdldFBhcmVudCgpKSk7IAotCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKHVwR3JhZGVJbmZvLmdldENvcGllZExpYkZpbGUoKSAhPSBudWxsKSB7Ci0JCQkJCWltcG9ydGluZ0xpYlBhdGggPSB1cEdyYWRlSW5mby5nZXRDb3BpZWRMaWJGaWxlKCk7Ci0JCQkJfQotCQkJfQotCQkJCQkJCi0JCQlpbXBvcnRpbmdMaWJEb2MgPSBuZXcgTGlicmFyeURvY3VtZW50KGltcG9ydGluZ0xpYlBhdGgpOwotCQkJCi0JCQlpZiAoISBoYW5kbGVWZXJzaW9uKSB7Ci0JCQkJU3RyaW5nIHZlcnNpb25FcnJvciA9IHZlcnNpb25DaGVjayhpbXBvcnRpbmdMaWJQYXRoLmdldEFic29sdXRlUGF0aCgpLCAKLQkJCQkJCQkJCQlJbXBvcnRSZXNvdXJjZXMuaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlKTsKLQkJCQlpZiAodmVyc2lvbkVycm9yICE9IG51bGwpIHsKLQkJCQkJZGF0YS5nZXRFcnJvckluZm8oKS5hZGRFcnJvcih2ZXJzaW9uRXJyb3IpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQlib29sZWFuIGlzQ29uZmlnU3BlY3MgPSBpbXBvcnRpbmdMaWJEb2MuaXNDb25maWdTcGVjc09ubHkoKTsKLQotCQkJaWYgKGlzQ29uZmlnU3BlY3MpIHsKLQotCQkJCXNwZWNzTWdyID0gbmV3IENvbmZpZ1NwZWNzSW1wb3J0TWFuYWdlcigpOwotCi0JCQkJLy8gU2NhbiB0aGUgbGlicmFyeSBmaWxlIGZvciBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgotCQkJCWRhdGEuc3BlY3MgPSBzcGVjc01nci5nZXRDb25maWdTcGVjcyhpbXBvcnRpbmdMaWJEb2MpOwotCi0JCQl9IGVsc2UgewotCQkJCWlmICghaXNMaWJyYXJ5RmlsZSkgewotCQkJCQlkYXRhCi0JCQkJCS5nZXRFcnJvckluZm8oKQotCQkJCQkuYWRkRXJyb3IoCi0JCQkJCQkJTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzEsIGltcG9ydGluZ0xpYlBhdGguZ2V0UGFyZW50KCkpKTsgCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJZGF0YS5zcGVjcyA9IG51bGw7Ci0KLQkJCQkvLyBPcGVuIHRoZSBsaWJyYXJ5IGFuZCBjb21wYXJlIHRoZSBkaWZmZXJlbmNlLgotCQkJCQotCQkJCS8vIG5lZWQgdG8gb3BlbiBhbmQgY2xvc2UgdGhlIGxpYnJhcnkgdG8gaGF2ZSB0aGUgcHJvamVjdCByZXNvdXJjZXMgaW5pdGlhbGl6ZWQgcHJvcGVybHkKLQkJCQlTdHJpbmcgbGliRGlyID0gaW1wb3J0aW5nTGliUGF0aC5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLQkJCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAiQ29uZmlndXJhdGlvbiBJbXBvcnQgUHJvamVjdCAoIiAvLyROT04tTkxTLTEkCi0JCQkJCQkrIEludGVnZXIudG9IZXhTdHJpbmcobGliRGlyLmhhc2hDb2RlKCkpICsgIikiOyAvLyROT04tTkxTLTEkCi0JCQkJCi0JCQkJTWV0aG9kTGlicmFyeVByb2plY3Qub3BlblByb2plY3QobGliRGlyLCBwcm9qZWN0TmFtZSwgbW9uaXRvcik7Ci0JCQkJdHJ5IHsKLQkJCQkJTWV0aG9kTGlicmFyeSBpbXBvcnRMaWJyYXR5ID0gTGlicmFyeVV0aWwKLQkJCQkJCQkubG9hZExpYnJhcnkoaW1wb3J0aW5nTGliUGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCU1ldGhvZExpYnJhcnkgYmFzZUxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJCQotCQkJCQloYW5kbGVUeXBlQ2hhbmdlcyhiYXNlTGlicmFyeSwgaW1wb3J0TGlicmF0eSk7Ci0JCQkJCQotCQkJCQlTdHJpbmcgYmFzZUxpYkRpciA9IG51bGw7Ci0JCQkJCXRyeSB7CS8vTm90IG5lY2Nlc3NhcnksIGJ1dCBwcmV2ZW50IGludHJvZHVjaW5nIGFueSBwb3RlbnRpYWwgcmVncmVzc2lvbiBkdWUgdG8gdGhpcyBjaGFuZ2UKLQkJCQkJCUZpbGUgYkZpbGUgPSBuZXcgRmlsZShiYXNlTGlicmFyeS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50RmlsZSgpOzsKLQkJCQkJCWJhc2VMaWJEaXIgPSBiRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsJCQkJCQkKLQkJCQkJfQotCQkJCQlpZiAobGliRGlyLmVxdWFsc0lnbm9yZUNhc2UoYmFzZUxpYkRpcikpIHsKLQkJCQkJCWRhdGEKLQkJCQkJCQkJLmdldEVycm9ySW5mbygpCi0JCQkJCQkJCS5hZGRFcnJvcigKLQkJCQkJCQkJCQlOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMiwgaW1wb3J0aW5nTGliUGF0aC5nZXRQYXJlbnQoKSkpOyAKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQkKLQkJCQkJZml4SW1wb3J0TGlicmFyeVN5c3RlbVBhY2thZ2VHVUlEcyhiYXNlTGlicmFyeSwgaW1wb3J0TGlicmF0eSk7Ci0JCQkJCQotCQkJCQlkaWZmTWdyID0gbmV3IExpYnJhcnlEaWZmTWFuYWdlcihiYXNlTGlicmFyeSwgaW1wb3J0TGlicmF0eSk7Ci0JCQkJCWRpZmZNZ3IuYnVpbGREaWZmVHJlZSgpOwotCQkJCQkKLQkJCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQkJCWRpZmZNZ3Iucm9vdERpZmZUcmVlLmRlYnVnRHVtcCgpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCU1ldGhvZExpYnJhcnlQcm9qZWN0LmNsb3NlUHJvamVjdChsaWJEaXIsIG1vbml0b3IpOwotCQkJCU1ldGhvZExpYnJhcnlQcm9qZWN0LmRlbGV0ZVByb2plY3QobGliRGlyLCBtb25pdG9yKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1wb3J0IGRhdGEuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25JbXBvcnREYXRhIGdldEltcG9ydERhdGEoKSB7Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgc3BlYyBvbmx5IGF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNzT25seSgpIHsKLQkJcmV0dXJuIChkYXRhLnNwZWNzICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpZmYgdHJlZS4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudERpZmZUcmVlIGdldERpZmZUcmVlKCkgewotCQlyZXR1cm4gZGlmZk1nci5nZXREaWZmVHJlZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltcG9ydCBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldEltcG9ydGluZ0xpYnJhcnkoKSB7Ci0JCXJldHVybiBkaWZmTWdyLmdldEltcG9ydGluZ0xpYnJhcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgaW1wb3J0LgotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1JbXBvcnQoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQotCQkvLyBuZWVkIHRvIGRpc2FibGUgdGhlIHdvcmtzcGFjZSByZWZyZXNoaW5nCi0JCWJvb2xlYW4gcmVmcmVzaCA9IFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5pc0VuYWJsZWQoKTsKLQkJaWYocmVmcmVzaCkgewotCQkJLy8gZGlzYWJsZSByZXNvdXJjZSByZWZyZXNoaW5nIGR1cmluZyBpbXBvcnQKLQkJCS8vCi0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci5zZXRUYXNrTmFtZShJbXBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMyk7Ci0JCQl9Ci0KLQkJCWlmIChpc1NwZWNzT25seSgpKSB7Ci0JCQkJc3BlY3NNZ3IuZG9JbXBvcnQoZGF0YS5zcGVjcyk7Ci0JCQl9IGVsc2UgewotCQkJCUxpYnJhcnlJbXBvcnRNYW5hZ2VyIGltcG9ydGluZ01nciA9IG5ldyBMaWJyYXJ5SW1wb3J0TWFuYWdlcihkaWZmTWdyLCBkYXRhLmltcG9ydExpc3QpOwkJCQotCQkJCWltcG9ydGluZ01nci5kb01lcmdlKGRhdGEucmVwbGFjZUV4aXN0aW5nLCBtb25pdG9yKTsKLQkJCX0KLQkJCQotCQkJLy8gcmVmcmVzaCBsaWJyYXJ5IGZpbGVzIGluIHdvcmtzcGFjZQotCQkJLy8KLQkJCU1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJUmVzb3VyY2VVdGlsLnJlZnJlc2hSZXNvdXJjZXMobGliLCBtb25pdG9yKTsKLQkJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmKHJlZnJlc2gpIHsKLQkJCQkvLyByZS1lbmFibGUgcmVzb3VyY2UgcmVmcmVzaGluZyAKLQkJCQkvLwotCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQkJaWYgKHVwR3JhZGVJbmZvICE9IG51bGwpIHsKLQkJCQl1cEdyYWRlSW5mby5yZW1vdmVDb3BpZWRMaWJyYXJ5KCk7Ci0JCQkJdXBHcmFkZUluZm8gPSBudWxsOwotCQkJfQotCQl9CQotCQkKLQkJdHJ5IHsKLQkJCS8vIFJlb3BlbiB0aGUgbGlicmFyeS4KLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVvcGVuQ3VycmVudE1ldGhvZExpYnJhcnkoKTsJCQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0aGUgdG9vbCB2ZXJzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25DaGVjayhmaW5hbCBTdHJpbmcgeG1sUGF0aCwgZmluYWwgU3RyaW5nIHRpdGxlKSB7Ci0JCWZpbmFsIFN0cmluZ1tdIHJldCA9IG5ldyBTdHJpbmdbMV07Ci0JCXJldFswXSA9IG51bGw7Ci0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsJCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7CQkJCQotCQkJCVZlcnNpb25VdGlsLlZlcnNpb25DaGVja0luZm8gaW5mbyA9IFZlcnNpb25VdGlsLmNoZWNrTGlicmFyeVZlcnNpb24obmV3IEZpbGUoeG1sUGF0aCkpOwotCQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQkJcmV0WzBdID0gTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd24sIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKX0pOwkJCQkJCi0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGluZm8ucmVzdWx0IDwgMCkgewotCQkJCQkJaWYgKGluZm8udG9vbElELmVxdWFscyhWZXJzaW9uVXRpbC5nZXRQcmltYXJ5VG9vbElEKCkpKSB7Ci0JCQkJCQkJcmV0WzBdID0gTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaF9vbGREYXRhLCBuZXcgT2JqZWN0W10gewotCQkJCQkJCQkJaW5mby50b29sVmVyc2lvbiwgUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKX0pOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93biwgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCVBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsJCQkJCQotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKGluZm8ucmVzdWx0ID4gMCkgewotCQkJCQkJaWYgKGluZm8udG9vbElELmVxdWFscyhWZXJzaW9uVXRpbC5nZXRQcmltYXJ5VG9vbElEKCkpKSB7Ci0JCQkJCQkJcmV0WzBdID0gTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaF9vbGRUb29sLCBuZXcgT2JqZWN0W10gewotCQkJCQkJCQkJaW5mby50b29sVmVyc2lvbiwgUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKX0pOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZFRvb2xfdW5rbm93biwgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCVBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsKLQkJCQkJCX0KLQkJCQkJfSAKLQkJCQl9Ci0JCQkJaWYgKHJldFswXSAhPSBudWxsKSB7Ci0JCQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLCByZXRbMF0pOwkJCQkJCi0JCQkJfQotCQkJfQotCQl9KTsJCQotCQlyZXR1cm4gcmV0WzBdOwotCX0KLQkKLQkvKioKLQkgKiBGaXhlcyB0aGUgaW1wb3J0ZWQgbGlicmFyeSdzIHN5c3RlbSBwYWNrYWdlIGd1aWRzIHdpdGggdGhvc2UgYmFzZSdzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmaXhJbXBvcnRMaWJyYXJ5U3lzdGVtUGFja2FnZUdVSURzKE1ldGhvZExpYnJhcnkgYmFzZUxpYnJhcnksIE1ldGhvZExpYnJhcnkgaW1wb3J0TGlicmF0eSkgewotCQlIYXNoTWFwIHBsdWdpbnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlMaXN0IHBsdWdpbnMgPSBiYXNlTGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoaW50IGk9MDsgaSA8IHBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBwbHVnaW5zLmdldChpKTsKLQkJCXBsdWdpbnNNYXAucHV0KHBsdWdpbi5nZXRHdWlkKCksIHBsdWdpbik7Ci0JCX0KLQkJaWYgKHBsdWdpbnNNYXAuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUxpc3QgaW1wb3J0UGx1Z2luc1RvRml4ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGltcG9ydFBsdWdpbnMgPSBpbXBvcnRMaWJyYXR5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChpbnQgaT0wOyBpIDwgaW1wb3J0UGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGltcG9ydFBsdWdpbnMuZ2V0KGkpOwotCQkJaWYgKHBsdWdpbnNNYXAuY29udGFpbnNLZXkocGx1Z2luLmdldEd1aWQoKSkpIHsKLQkJCQlpbXBvcnRQbHVnaW5zVG9GaXguYWRkKHBsdWdpbik7Ci0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoaW50IGk9MDsgaSA8IGltcG9ydFBsdWdpbnNUb0ZpeC5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIGltcG9ydFBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGltcG9ydFBsdWdpbnNUb0ZpeC5nZXQoaSk7Ci0JCQlNZXRob2RQbHVnaW4gYmFzZVBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHBsdWdpbnNNYXAuZ2V0KGltcG9ydFBsdWdpbi5nZXRHdWlkKCkpOwotCQkJaWYgKGJhc2VQbHVnaW4gPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJTGlzdCBpbXBvcnRQYWNrYWdlcyA9IFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMoaW1wb3J0UGx1Z2luKTsKLQkJCUhhc2hNYXAgaW1wb3J0UGFja2FnZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKGludCBqPTA7IGogPCBpbXBvcnRQYWNrYWdlcy5zaXplKCk7IGorKykgewotCQkJCU1ldGhvZEVsZW1lbnQgaW1wb3J0UGFja2FnZSA9IChNZXRob2RFbGVtZW50KSBpbXBvcnRQYWNrYWdlcy5nZXQoaik7Ci0JCQkJaW1wb3J0UGFja2FnZU1hcC5wdXQoaW1wb3J0UGFja2FnZS5nZXROYW1lKCksIGltcG9ydFBhY2thZ2UpOwotCQkJfQotCQkJCi0JCQlMaXN0IGJhc2VQYWNrYWdlcyA9IFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMoYmFzZVBsdWdpbik7CQkJCi0JCQlmb3IgKGludCBqPTA7IGogPCBiYXNlUGFja2FnZXMuc2l6ZSgpOyBqKyspIHsKLQkJCQlNZXRob2RFbGVtZW50IGJhc2VQYWNrYWdlID0gKE1ldGhvZEVsZW1lbnQpIGJhc2VQYWNrYWdlcy5nZXQoaik7Ci0JCQkJTWV0aG9kRWxlbWVudCBpbXBvcnRQYWNrYWdlID0gKE1ldGhvZEVsZW1lbnQpIGltcG9ydFBhY2thZ2VNYXAuZ2V0KGJhc2VQYWNrYWdlLmdldE5hbWUoKSk7Ci0JCQkJaWYgKGltcG9ydFBhY2thZ2UgPT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJU3RyaW5nIGd1aWQgPSBiYXNlUGFja2FnZS5nZXRHdWlkKCk7Ci0JCQkJaWYgKCEgaW1wb3J0UGFja2FnZS5nZXRHdWlkKCkuZXF1YWxzKGd1aWQpKSB7Ci0JCQkJCWltcG9ydFBhY2thZ2Uuc2V0R3VpZChndWlkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVR5cGVDaGFuZ2VzKE1ldGhvZExpYnJhcnkgYmFzZUxpYiwgTWV0aG9kTGlicmFyeSBpbXBvcnRMaWIpIHsKLQkJSGFzaE1hcCBiYXNlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJY29sbGVjdFBvdGVudGlhbFR5cGVDaGFuZ2VkKGJhc2VMaWIsIGJhc2VNYXApOwotCQlIYXNoTWFwIGltcG9ydE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWNvbGxlY3RQb3RlbnRpYWxUeXBlQ2hhbmdlZChpbXBvcnRMaWIsIGltcG9ydE1hcCk7Ci0JCWhhbmRsZVR5cGVDaGFuZ2VzKGJhc2VNYXAsIGltcG9ydE1hcCk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBNZXRob2RFbGVtZW50IHR5cGUgY2hhbmdlcy4gTm90ZTogZm9yIE1ldGhvZEVsZW1lbnQgb2JqZWN0cyBpbiBpbXBvcnRNYXAKLQkgKiBvbmx5IGVDbGFzcyB0eXBlIGlzIHVzZWQgaW4gdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZVR5cGVDaGFuZ2VzKEhhc2hNYXAgYmFzZU1hcCwgSGFzaE1hcCBpbXBvcnRNYXApIHsKLQkJQXJyYXlMaXN0IHRvQ2hhbmdlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGltcG9ydE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCBndWlkID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQlNZXRob2RFbGVtZW50IGJhc2VFbGVtID0gKE1ldGhvZEVsZW1lbnQpIGJhc2VNYXAuZ2V0KGd1aWQpOwotCQkJaWYgKGJhc2VFbGVtICE9IG51bGwpIHsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW0gPSAoTWV0aG9kRWxlbWVudCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoISBlbGVtLmVDbGFzcygpLmVxdWFscyhiYXNlRWxlbS5lQ2xhc3MoKSkpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtUGFpcltdID0gbmV3IE1ldGhvZEVsZW1lbnRbXSB7YmFzZUVsZW0sIGVsZW19OwotCQkJCQl0b0NoYW5nZUxpc3QuYWRkKGVsZW1QYWlyKTsKLQkJCQl9Ci0JCQl9CQkJCi0JCX0KLQkJZm9yIChpbnQgaT0wOyBpPHRvQ2hhbmdlTGlzdC5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtUGFpcltdID0gKE1ldGhvZEVsZW1lbnRbXSkgdG9DaGFuZ2VMaXN0LmdldChpKTsKLQkJCWZpbmFsIE1ldGhvZEVsZW1lbnQgYmFzZUVsZW0gPSBlbGVtUGFpclswXTsKLQkJCWZpbmFsIE1ldGhvZEVsZW1lbnQgaW1wb3J0RWxlbSA9IGVsZW1QYWlyWzFdOwotCQkJaWYgKGJhc2VFbGVtIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUNvbnZlcnRHdWlkYW5jZVR5cGUuY29udmVydEd1aWRhbmNlKChHdWlkYW5jZSkgYmFzZUVsZW0sIE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSwgbnVsbCwgaW1wb3J0RWxlbS5lQ2xhc3MoKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0gZWxzZSBpZiAoYmFzZUVsZW0gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCVR5cGVDb252ZXJ0ZXIuY29udmVydEFjdGl2aXR5KChBY3Rpdml0eSkgYmFzZUVsZW0sIGltcG9ydEVsZW0uZUNsYXNzKCkpOyAKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbGxlY3RzIGVsZW1lbnRzIGluIGxpYiB0aGF0IG1heSBoYXZlIHR5cGUgY2hhbmdlcyAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29sbGVjdFBvdGVudGlhbFR5cGVDaGFuZ2VkKE1ldGhvZExpYnJhcnkgbGliLCBIYXNoTWFwIG1hcCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGliLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlIHx8Ci0JCQkJb2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW0gPSAoTWV0aG9kRWxlbWVudCkgb2JqOwotCQkJCW1hcC5wdXQoZWxlbS5nZXRHdWlkKCksIGVsZW0pOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYW5kbGVUb29sVmVyc2lvbihGaWxlIGxpYkZpbGUsIGZpbmFsIFVwZ3JhZGVDYWxsZXJJbmZvIGluZm8pIHsKLQkJZmluYWwgU3RyaW5nIGxpYkZvbGRlclBhdGggPSBsaWJGaWxlLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJZmluYWwgYm9vbGVhbiByZXRbXSA9IG5ldyBib29sZWFuWzFdOwotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJldFswXSA9IE9wZW5MaWJyYXJ5V2l6YXJkLmhhbmRsZVRvb2xWZXJzaW9uKGxpYkZvbGRlclBhdGgsIGluZm8pOwotCQkJfQotCQl9KTsJCQkJCQkJCQotCQlyZXR1cm4gcmV0WzBdOwotCX0JCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFVwZ3JhZGVJbmZvIGV4dGVuZHMgVXBncmFkZUNhbGxlckluZm8gewotCQkKLQkJcHVibGljIFVwZ3JhZGVJbmZvKGludCBjYWxsZXJUeXBlLCBGaWxlIGxpYkZpbGUpIHsKLQkJCXN1cGVyKGNhbGxlclR5cGUsIGxpYkZpbGUpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBjb3B5TGlicmFyeSgpIHsKLQkJCVN0cmluZyB1c2VySG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBkZXNMaWJGb2xkZXJQYXRoID0gdXNlckhvbWUgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkrICJFUEYiICsgRmlsZS5zZXBhcmF0b3IgKyAiRXhwb3J0IiArIEZpbGUuc2VwYXJhdG9yIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkrIExvbmcudG9IZXhTdHJpbmcoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lSW5NaWxsaXMoKSkgKyBGaWxlLnNlcGFyYXRvcjsJCQotCQkJRmlsZSBkZXNMaWJGb2xkZXIgPSBuZXcgRmlsZShkZXNMaWJGb2xkZXJQYXRoKTsKLQkJCWlmICghZGVzTGliRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJZGVzTGliRm9sZGVyLm1rZGlycygpOwotCQkJfSBlbHNlIHsKLQkJCQlGaWxlVXRpbC5kZWxldGVBbGxGaWxlcyhkZXNMaWJGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJfQotCQkJCi0JCQlQbHVnaW5FeHBvcnRTZXJ2aWNlLmNvcHlEaXIoZ2V0TGliRmlsZSgpLmdldFBhcmVudEZpbGUoKSwgZGVzTGliRm9sZGVyKTsKLQkJCXNldENvcGllZExpYkZpbGUobmV3IEZpbGUoZGVzTGliRm9sZGVyUGF0aCArIGdldExpYkZpbGUoKS5nZXROYW1lKCkpKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlQ29waWVkTGlicmFyeSgpIHsKLQkJCWlmIChnZXRDb3BpZWRMaWJGaWxlKCkgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCUZpbGVVdGlsLmRlbGV0ZUFsbEZpbGVzKGdldENvcGllZExpYkZpbGUoKS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJZ2V0Q29waWVkTGliRmlsZSgpLmdldFBhcmVudEZpbGUoKS5kZWxldGUoKTsKLQkJCXNldENvcGllZExpYkZpbGUobnVsbCk7Ci0JCX0KLQl9OwkKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0RpckNvcHkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvRGlyQ29weS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTFjNDg3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvRGlyQ29weS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci0KLQotLyoqCi0gKiB1dGlsaXR5IGNsYXNzIHRvIGNvcHkgZmlsZXMgZnJvbSBvbmUgZGlyIHRvIGFub3RoZXIsIGFuZCBkZWxldGUgdGhlIHVuLW5lZWRlZCBmaWxlcyBmcm9tIHNvdXJjZSBkaXIuCi0gKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpckNvcHkgewotCi0JLy9wcml2YXRlIElTdGF0dXMgZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBudWxsOwotCQotCUZpbGUgc3JjRGlyOwotCUZpbGUgdGFyZ2V0RGlyOwotCQotCS8vIG5ldyBmaWxlcyB0byBiZSBhZGRlZCB0byB0aGUgdGFyZ2V0Ci0JTGlzdCBuZXdGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkvLyBmaWxlcyBleGlzdHMgaW4gYm90aCBzcmMgYW5kIHRhcmdldCBkaXIKLQlMaXN0IG9sZEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCS8vIGZpbGVzIG9ubHkgaW4gdGFyZ2V0IGRpciwgdGhlc2UgZmlsZXMgYXJlIHRyZWF0ZWQgYXMgZGVsZXRlZCBpbiB0aGUgc3JjIGZvbGRlci4KLQlMaXN0IGRlbGV0ZWRGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaXJDb3B5KEZpbGUgc3JjRGlyLCBGaWxlIHRhcmdldERpcikgewotCQl0aGlzLnNyY0RpciA9IHNyY0RpcjsKLQkJdGhpcy50YXJnZXREaXIgPSB0YXJnZXREaXI7Ci0JCQotCQlwcmVwYXJlKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBDUF9GT0RMRVIgPSBNdWx0aUZpbGVTYXZlVXRpbC5DQVBBQklMSVRZX1BBVFRFUk5fUEFUSCArICIvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBEUF9GT0RMRVIgPSBNdWx0aUZpbGVTYXZlVXRpbC5ERUxJVkVSWV9QUk9DRVNTX1BBVEggKyAiLyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBjaGVjayBvdXQgdGhlIGV4aXN0aW5nIGZpbGVzLCBkZWxldGUgdGhlIGZpbGVzIGZyb20gY20sIGFuZCBhZGQgbmV3IGZpbGVzLCBjb3B5IHRoZSBmaWxlcyBvdmVyCi0JICoKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCkgewotCQkJCi0JCS8vIGNoZWNrIG91dCBmaWxlcwotCQlMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKCBJdGVyYXRvciBpdCA9IG9sZEZpbGVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpaXQubmV4dCgpOwkJCQkJCQotCQkJaWYgKG5lZWRDb3B5KG5ldyBGaWxlKHNyY0RpciwgcGF0aCksIG5ldyBGaWxlKHRhcmdldERpciwgcGF0aCkpKSB7CS8vMTU0MzIxCi0JCQkJZmlsZXMuYWRkKG5ldyBGaWxlKHRhcmdldERpciwgcGF0aCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJfQotCQl9Ci0JCQotCQlJU3RhdHVzIGZpbGVDaGVja2VkT3V0U3RhdHVzID0gRmlsZU1vZGlmeUNoZWNrZXIuY2hlY2tNb2RpZnkoZmlsZXMpOwotCQkKLQkJaWYgKCAhZmlsZUNoZWNrZWRPdXRTdGF0dXMuaXNPSygpICkgewotCQkJcmV0dXJuIGZpbGVDaGVja2VkT3V0U3RhdHVzOwotCQl9Ci0JCQkKLQkJLy8gZGVsZXRlIGZpbGVzCi0JCUlGaWxlTWFuYWdlciBmaWxlTWdyID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKTsKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBkZWxldGVkRmlsZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBwYXRoID0gKFN0cmluZylpdC5uZXh0KCk7Ci0JCQlGaWxlIGYgPSBuZXcgRmlsZSh0YXJnZXREaXIsIHBhdGgpOwotCQkJZmlsZU1nci5kZWxldGUoZi5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkKLQkJCS8vIGRlbGV0ZSB0aGUgZW1wdHkgQ1AgYW5kIERQIGZvbGRlcgotCQkJcGF0aCA9IHBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7IAotCQkJaWYgKCBwYXRoLnN0YXJ0c1dpdGgoQ1BfRk9ETEVSKSB8fCBwYXRoLnN0YXJ0c1dpdGgoRFBfRk9ETEVSKSApIHsKLQkJCQlGaWxlIGZvbGRlciA9IGYuZ2V0UGFyZW50RmlsZSgpOwotCQkJCVN0cmluZ1tdIGl0ZW1zID0gZm9sZGVyLmxpc3QoKTsKLQkJCQlpZiAoIGl0ZW1zID09IG51bGwgfHwgaXRlbXMubGVuZ3RoID09IDAgKSB7Ci0JCQkJCWZpbGVNZ3IuZGVsZXRlKGZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSk7CQkJCQotCQkJCX0KLQkJCX0KLQkJfQkKLQkJCi0JCS8vIGNvcHkgb2xkIGZpbGVzCi0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gb2xkRmlsZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBwYXRoID0gKFN0cmluZylpdC5uZXh0KCk7Ci0JCQlGaWxlVXRpbC5jb3B5RmlsZShuZXcgRmlsZShzcmNEaXIsIHBhdGgpLCBuZXcgRmlsZSh0YXJnZXREaXIsIHBhdGgpKTsKLQkJfQotCQkKLQkJLy8gY29weSBuZXcgZmlsZXMKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBuZXdGaWxlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKWl0Lm5leHQoKTsKLQkJCUZpbGVVdGlsLmNvcHlGaWxlKG5ldyBGaWxlKHNyY0RpciwgcGF0aCksIG5ldyBGaWxlKHRhcmdldERpciwgcGF0aCkpOwotCQl9Ci0JCQotCQlyZXR1cm4gZmlsZUNoZWNrZWRPdXRTdGF0dXM7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBwcmVwYXJlKCkgewotCQlMaXN0IGFsbFNyY0ZpbGVzID0gZ2V0QWxsRmlsZXMoc3JjRGlyKTsKLQkJTGlzdCBhbGxUYXJnZXRGaWxlcyA9IGdldEFsbEZpbGVzKHRhcmdldERpcik7Ci0KLQkJd2hpbGUgKCBhbGxUYXJnZXRGaWxlcy5zaXplKCkgPiAwICkgewotCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKWFsbFRhcmdldEZpbGVzLnJlbW92ZSgwKTsKLQkJCWlmICggYWxsU3JjRmlsZXMuY29udGFpbnMocGF0aCkgKSB7Ci0JCQkJb2xkRmlsZXMuYWRkKHBhdGgpOwotCQkJCWFsbFNyY0ZpbGVzLnJlbW92ZShwYXRoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVsZXRlZEZpbGVzLmFkZChwYXRoKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gdGhlIHJlbWFpbmluZyBmaWxlcyBpbiB0aGUgdGFyZ2V0IGxpc3QgaXMgdGhlIG5ldyBmaWxlcwotCQluZXdGaWxlcy5hZGRBbGwoYWxsU3JjRmlsZXMpOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgYWxsIHRoZSBmaWxlcyB3aXRoIHJlbGF0aXZlIHBhdGggdG8gdGhlIHJvb3QKLQkgKiBAcGFyYW0gZGlyIHRoZSByb290IGRpcgotCSAqIEByZXR1cm4gTGlzdCBhbGwgZmlsZXMgaW4gdGhlIGRpciwgd2l0aCByZWxhdGl2ZSBwYXRoIHRvIHRoZSByb290Ci0JICovCi0JcHJpdmF0ZSBMaXN0IGdldEFsbEZpbGVzKEZpbGUgZGlyKSB7Ci0JCUxpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUZpbGVVdGlsLmdldEFsbEZpbGVzKGRpciwgZmlsZXMsIHRydWUpOwotCi0JCS8vIGNvbnZlcnQgdG8gbGlzdCBvZiBwYXRoLCBub3QgRmlsZQotCQlVUkkgYmFzZVVybCA9IGRpci50b1VSSSgpOwotCQkKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoIGkgPCBmaWxlcy5zaXplKCkgKSB7Ci0JCQlGaWxlIGYgPSAoRmlsZSlmaWxlcy5nZXQoaSk7Ci0JCQlpZiAoIGNhbklnbm9yZShmLmdldEFic29sdXRlUGF0aCgpKSB8fCBjYW5JZ25vcmUoZikpIHsKLQkJCQlmaWxlcy5yZW1vdmUoaSk7Ci0JCQl9IGVsc2UgewotCQkJCVVSSSByZWwgPSBiYXNlVXJsLnJlbGF0aXZpemUoZi50b1VSSSgpKTsKLQkJCQlmaWxlcy5zZXQoaSwgcmVsLmdldFBhdGgoKSk7CQotCQkJCWkrKzsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmaWxlczsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENWU19GT0xERVIgPSBGaWxlLnNlcGFyYXRvciArICJDVlMiICsgRmlsZS5zZXBhcmF0b3I7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1ZOX0ZPTERFUiA9IEZpbGUuc2VwYXJhdG9yICsgIi5zdm4iICsgRmlsZS5zZXBhcmF0b3I7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgYm9vbGVhbiBjYW5JZ25vcmUoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKCBwYXRoLmluZGV4T2YoQ1ZTX0ZPTERFUikgPj0wICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKCBwYXRoLmluZGV4T2YoU1ZOX0ZPTERFUikgPj0wICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gaWdub3JlRmlsZXMgPSB7Ci0JCQkJCQkJCQkiLmNvcHlhcmVhLmRhdCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSIuY29weWFyZWEuZGIiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCX07CQkJCi0JcHJpdmF0ZSBib29sZWFuIGNhbklnbm9yZShGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGlnbm9yZUZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoaWdub3JlRmlsZXNbaV0pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBjb3B5IGFjdGlvbiBpcyBuZWVkZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG5lZWRDb3B5KEZpbGUgc291cmNlLCBGaWxlIGRlc3QpIHsKLQkJYm9vbGVhbiByZXQgPSB0cnVlOwotCQlpZiAoZGVzdC5leGlzdHMoKSkgewotCQkJcmV0ID0gKGRlc3QubGFzdE1vZGlmaWVkKCkgIT0gc291cmNlLmxhc3RNb2RpZmllZCgpKQotCQkJCQl8fCAoZGVzdC5sZW5ndGgoKSAhPSBzb3VyY2UubGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvRWxlbWVudERpZmZUcmVlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0VsZW1lbnREaWZmVHJlZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWI4MTkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvRWxlbWVudERpZmZUcmVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0KLS8qKgotICogRGlzcGxheXMgdGhlIGVsZW1lbnQgZGlmZmVyZW5jZXMgaW4gYSB0cmVlLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudERpZmZUcmVlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJRkZfU1RBVEVfU0FNRSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUZGX1NUQVRFX05FVyA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUZGX1NUQVRFX0NIQU5HRUQgPSA0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElGRl9TVEFURV9PTERfT05MWSA9IDU7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZTE7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZTI7Ci0KLQkvLyBUaGUgcGFyZW50IGluIHRoZSBiYXNlIGxpYnJhcnkgaWYgZTIgaXMgYSBuZXcgZWxlbWVudC4KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZTFfcGFyZW50OwotCi0JcHJpdmF0ZSBFbGVtZW50RGlmZlRyZWUgcGFyZW50ID0gbnVsbDsKLQotCS8vIERlZmluZSB0aGUgZGlmZiBzdGF0ZSBvZiB0aGUgc2Vjb25kIGVsZW1lbnQgY29tcGFyZWQgdG8gdGhlIGZpcnN0IG9uZS4KLQlwcml2YXRlIGludCBkaWZmU3RhdGUgPSBESUZGX1NUQVRFX1NBTUU7Ci0KLQlwcml2YXRlIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzRGlydHlDaGlsZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudERpZmZUcmVlKE1ldGhvZEVsZW1lbnQgZTEsIE1ldGhvZEVsZW1lbnQgZTIpIHsKLQkJdGhpcyhlMSwgZTIsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEVsZW1lbnREaWZmVHJlZShNZXRob2RFbGVtZW50IGUxLCBNZXRob2RFbGVtZW50IGUyLAotCQkJTWV0aG9kRWxlbWVudCBlMV9wYXJlbnQpIHsKLQkJdGhpcy5lMV9wYXJlbnQgPSBlMV9wYXJlbnQ7Ci0JCXRoaXMuZTEgPSBlMTsKLQkJdGhpcy5lMiA9IGUyOwotCi0JCXJlc29sdmVEaWZmU3RhdGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYmFzZSBtZXRob2QgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRCYXNlRWxlbWVudCgpIHsKLQkJcmV0dXJuIGUxOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJhc2UgbWV0aG9kIGVsZW1lbnQncyBwYXJlbnQuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0QmFzZVBhcmVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlMV9wYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1wb3J0IG1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEltcG9ydEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlMjsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZWxlbWVudCBpcyBuZXcgdG8gdGhlIGxpYnJhcnkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXcoKSB7Ci0JCXJldHVybiAoZTEgPT0gbnVsbCkgJiYgKGUyICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBlbGVtZW50IGV4aXN0cyBvbmx5IGluIHRoZSBsaWJyYXJ5IGFuZCBub3QgaW4gdGhlCi0JICogY29uZmlndXJhdGlvbiB0byBiZSBpbXBvcnRlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09sZE9ubHkoKSB7Ci0JCXJldHVybiAoZTEgIT0gbnVsbCkgJiYgKGUyID09IG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBib3RoIGJhc2UgYW5kIGltcG9ydCBlbGVtZW50cyBhcmUgbm90IG51bGwsIAotCSAqIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQm90aCgpIHsKLQkJcmV0dXJuIChlMSAhPSBudWxsKSAmJiAoZTIgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGNoaWxkIG5vZGUuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2hpbGQoRWxlbWVudERpZmZUcmVlIGNoaWxkKSB7Ci0JCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCWNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBoYXNEaXJ0eUNoaWxkIGF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNEaXJ0eUNoaWxkKCkgewotCQlyZXR1cm4gdGhpcy5oYXNEaXJ0eUNoaWxkOwotCX0KLQotCS8qKgotCSAqIFNldHMgaGFzRGlydHlDaGlsZCBhdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlydHlDaGlsZChib29sZWFuIGZsYWcpIHsKLQkJaGFzRGlydHlDaGlsZCA9IGhhc0RpcnR5Q2hpbGQgfHwgZmxhZzsKLQkJaWYgKGhhc0RpcnR5Q2hpbGQgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5zZXREaXJ0eUNoaWxkKGhhc0RpcnR5Q2hpbGQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFBhcmVudChFbGVtZW50RGlmZlRyZWUgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQlpZiAoZGlmZlN0YXRlICE9IERJRkZfU1RBVEVfU0FNRSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LnNldERpcnR5Q2hpbGQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQuCi0JICovCi0JcHVibGljIEVsZW1lbnREaWZmVHJlZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBoYXNDaGlsZHJlbiBhdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiAoY2hpbGRyZW4gIT0gbnVsbCkgJiYgKGNoaWxkcmVuLnNpemUoKSA+IDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoaWxkIGxpc3QuCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaWZmIHN0YXRlIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBjb21wYXJpbmcgdG8gdGhlIGZpcnN0IG9uZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldERpZmZTdGF0ZSgpIHsKLQkJcmV0dXJuIGRpZmZTdGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWVzc2FnZSBzdHJpbmcuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaWZmTWVzc2FnZSgpIHsKLQkJcmV0dXJuICJbIiArIGdldFZlcnNpb24oZTEpICsgIl0gOiBbIiArIGdldFZlcnNpb24oZTIpICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCXByaXZhdGUgdm9pZCByZXNvbHZlRGlmZlN0YXRlKCkgewotCQkvLyBob3cgdG8gZmlkZCB0d28gZWxlbWVudHM/Ci0JCS8vIDEuIGF0dHJpYnV0ZXMKLQkJLy8gMi4gdmVyc2lvbiBudW1iZXIKLQkJLy8gMy4gY2hpbGRyZW4KLQkJLy8gNC4gcmVmZXJlbmNlcwotCQkvLyA1LiAuLi4KLQkJaWYgKGUxID09IG51bGwpIHsKLQkJCWRpZmZTdGF0ZSA9IERJRkZfU1RBVEVfTkVXOwotCQl9IGVsc2UgaWYgKGUyID09IG51bGwpIHsKLQkJCWRpZmZTdGF0ZSA9IERJRkZfU1RBVEVfT0xEX09OTFk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZTEgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJZGlmZlN0YXRlID0gRElGRl9TVEFURV9TQU1FOwotCQkJfSBlbHNlIHsKLQkJCQlkaWZmU3RhdGUgPSBESUZGX1NUQVRFX0NIQU5HRUQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRWZXJzaW9uKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBnZXRQYWNrYWdlKGVsZW1lbnQpLmdldFZlcnNpb24oKTsKLQl9Ci0KLQlwcml2YXRlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCBnZXRQYWNrYWdlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCkgewotCQkJcmV0dXJuIChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQpIGVsZW1lbnQ7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0UGFja2FnZSgoTWV0aG9kRWxlbWVudCkgZWxlbWVudC5lQ29udGFpbmVyKCkpOwotCX0KLQotCS8vIFV0aWxpdHkgbWV0aG9kIHRvIGdldCB0aGUgZWxlbWVudCBpbmZvcm1hdGlvbi4KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKGUxICE9IG51bGwpIHsKLQkJCXJldHVybiBlMS5nZXROYW1lKCk7Ci0JCX0KLQkJaWYgKGUyICE9IG51bGwpIHsKLQkJCXJldHVybiBlMi5nZXROYW1lKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewotCQlNZXRob2RFbGVtZW50IGUgPSBlMTsKLQkJaWYgKGUgPT0gbnVsbCkgewotCQkJZSA9IGUyOwotCQl9Ci0KLQkJaWYgKGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGUuZ2V0VHlwZSgpLmdldE5hbWUoKTsKLQkJfQotCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCBkZWJ1Z0R1bXAoKSB7Ci0JCWRlYnVnRHVtcCgwLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRlYnVnRHVtcChpbnQgbGV2ZWwsIFN0cmluZyBpbmRlbnQpIHsKLQkJU3RyaW5nIGxpbmUgPSBudWxsOwotCQlpZiAoZTEgPT0gbnVsbCkgewotCQkJbGluZSA9ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJbGluZSA9IGUxLmdldEd1aWQoKSArICIsICIgKyBlMS5nZXROYW1lKCkgKyAiLCAiICsgZTEuZUNsYXNzKCkuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlvdXRMbihsZXZlbCwgaW5kZW50LCBsaW5lKTsKLQkJCi0JCWlmIChlMiA9PSBudWxsKSB7Ci0JCQlsaW5lID0gIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlsaW5lID0gZTIuZ2V0R3VpZCgpICsgIiwgIiArIGUyLmdldE5hbWUoKSArICIsICIgKyBlMi5lQ2xhc3MoKS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCW91dExuKGxldmVsLCBpbmRlbnQsIGxpbmUpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlmb3IgKGludCBpPTA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJRWxlbWVudERpZmZUcmVlIGNoaWxkID0gKEVsZW1lbnREaWZmVHJlZSkgY2hpbGRyZW4uZ2V0KGkpOwotCQkJY2hpbGQuZGVidWdEdW1wKGxldmVsICsgMSwgaW5kZW50ICsgIiAgICIpOyAvLyROT04tTkxTLTEkCi0JCX0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgb3V0TG4oaW50IGxldmVsLCBTdHJpbmcgaW5kZW50LCBTdHJpbmcgbGluZSkgewotCQlTdHJpbmcgc3RyID0gaW5kZW50ICsgbGV2ZWwgKyAiOiAiICsgbGluZTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvRmlsZU1vZGlmeUNoZWNrZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvRmlsZU1vZGlmeUNoZWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk5ODI4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0ZpbGVNb2RpZnlDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci0KLQotLyoqCi0gKiB1dGlsaXR5IGNsYXNzIHRvIGNoZWNrIGZpbGVzIGZvciBtb2RpZmljYXRpb25zCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRmlsZU1vZGlmeUNoZWNrZXIgewotCi0JLyoqCi0JICogQ2hlY2tzIG1vZGlmaWNhdGlvbiBzdGF0dXMgb2YgdGhlIGdpdmVuIGxpc3Qgb2YgZmlsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KExpc3QgbW9kaWZpZWRGaWxlcykgewotCQkKLQkJdHJ5IHsKLQkJCVN0cmluZ1tdIHBhdGhzID0gbmV3IFN0cmluZ1ttb2RpZmllZEZpbGVzLnNpemUoKV07Ci0JCQltb2RpZmllZEZpbGVzLnRvQXJyYXkocGF0aHMpOwotCQkJCi0JCQlJRmlsZU1hbmFnZXIgZmlsZU1nciA9IFNlcnZpY2VzLmdldEZpbGVNYW5hZ2VyKCk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IGZpbGVNZ3IuY2hlY2tNb2RpZnkocGF0aHMsIE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSk7Ci0KLQkJCS8vIG1ha2Ugc3VyZSBhbGwgdGhlIGZpbGVzIGFyZSB1cGRhdGFibGUJCQkKLQkJCUxpc3QgcmVhZG9ubHlGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKysgKSB7Ci0JCQkJRmlsZSBmID0gbmV3IEZpbGUocGF0aHNbaV0pOwotCQkJCWlmICggZi5leGlzdHMoKSAmJiAhZi5jYW5Xcml0ZSgpICkgewotCQkJCQlyZWFkb25seUZpbGVzLmFkZChwYXRoc1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoIHJlYWRvbmx5RmlsZXMuc2l6ZSgpID4gMCApIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBJbXBvcnRSZXNvdXJjZXMuRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX3RpdGxlOyAKLQkJCQlTdHJpbmcgbXNnID0gSW1wb3J0UmVzb3VyY2VzLkZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF9tc2c7IAotCQkJCWlmICggbmV3IE1zZ0RpYWxvZyhJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpKS5kaXNwbGF5UHJvbXB0KHRpdGxlLCBtc2cpICkgewotCQkJCQlyZXR1cm4gY2hlY2tNb2RpZnkocmVhZG9ubHlGaWxlcyk7Ci0JCQkJfQotCQkJfQkJCi0JCQlyZXR1cm4gc3RhdHVzOwotCQkJCi0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0SWQoKSwgMCwgZS5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/ICIiIDogZS5nZXRNZXNzYWdlKCksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIG1vZGlmaWNhdGlvbiBzdGF0dXMgb2YgdGhlIGdpdmVuIGxpc3Qgb2YgZmlsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHN5bmNFeGVjQ2hlY2tNb2RpZnkoZmluYWwgTGlzdCBtb2RpZmllZEZpbGVzKSB7Ci0JCWZpbmFsIElTdGF0dXNbXSByZXQgPSBuZXcgSVN0YXR1c1sxXTsKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJldFswXSA9IEZpbGVNb2RpZnlDaGVja2VyLmNoZWNrTW9kaWZ5KG1vZGlmaWVkRmlsZXMpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHJldFswXTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0cnVucyB0aGUgbW9kaWZpZWQgZmlsZSBsaXN0IG9mIHRoZSBnaXZlbiByZXNvdXJjZSBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE1vZGlmaWVkRmlsZXMoUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJTGlzdCByZXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCWlmIChyZXMgIT0gbnVsbCAmJiByZXMuaXNNb2RpZmllZCgpKSB7Ci0JCQkJcmV0LmFkZChyZXMuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvTGlicmFyeURpZmZNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0xpYnJhcnlEaWZmTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWQxNGFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvTGlicmFyeURpZmZNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci0KLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIG1ldGhvZCBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBsaWJyYXJ5IGFuZAotICogdGhvc2UgdGhhdCB3aWxsIGJlIGltcG9ydGVkLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeURpZmZNYW5hZ2VyIHsKLQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBiYXNlTGlicmFyeTsKLQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBpbXBvcnRMaWJyYXR5OwotCi0JLy8gTWFwIG9mIHVpZCB0byBFbGVtZW50RGlmZlRyZWUsIHRoZSByb290IG9mIHRoZSBFbGVtZW50RGlmZlRyZWUgaXMgdGhlCi0JLy8gbGlicmFyeS4KLQlwcml2YXRlIE1hcCBkaWZmRWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvLyBNYXAgb2YgdWlkIHRvIGVsZW1lbnQgZm9yIGltcG9ydCBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uCi0JcHJpdmF0ZSBNYXAgaW1wb3J0RWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvLyBpZCB0byBlbGVtZW50IG1hcCBvZiB0aGUgY3VycmVudCBsaWJyYXJ5LgotCXByaXZhdGUgTWFwIGN1cnJlbnRFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIFRoZSBkaWZmIHRyZWUuCi0JRWxlbWVudERpZmZUcmVlIHJvb3REaWZmVHJlZSA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGVidWcgPSBJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5RGlmZk1hbmFnZXIoTWV0aG9kTGlicmFyeSBiYXNlTGlicmFyeSwKLQkJCU1ldGhvZExpYnJhcnkgaW1wb3J0TGlicmF0eSkgewotCQl0aGlzLmJhc2VMaWJyYXJ5ID0gYmFzZUxpYnJhcnk7Ci0JCXRoaXMuaW1wb3J0TGlicmF0eSA9IGltcG9ydExpYnJhdHk7Ci0KLQkJcm9vdERpZmZUcmVlID0gbmV3IEVsZW1lbnREaWZmVHJlZShiYXNlTGlicmFyeSwgaW1wb3J0TGlicmF0eSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1wb3J0IGxpYnJhcnkuCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0SW1wb3J0aW5nTGlicmFyeSgpIHsKLQkJcmV0dXJuIHRoaXMuaW1wb3J0TGlicmF0eTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZHMgdGhlIGRpZmZlcmVuY2UgdHJlZS4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudERpZmZUcmVlIGJ1aWxkRGlmZlRyZWUoKSB7Ci0JCS8vIEJ1aWxkIHRoZSB1aWQgdG8gZWxlbWVudCBtYXAgZm9yIHRoZSBpbXBvcnQgbGlicmFyeS4KLQkJYnVpbGRVSURNYXAoaW1wb3J0TGlicmF0eS5lQ29udGVudHMoKSwgaW1wb3J0RWxlbWVudE1hcCwgdHJ1ZSwgZmFsc2UpOwotCi0JCWJ1aWxkVUlETWFwKGJhc2VMaWJyYXJ5LmVDb250ZW50cygpLCBjdXJyZW50RWxlbWVudE1hcCwgdHJ1ZSwgdHJ1ZSk7Ci0KLQkJLy8gR2V0IGFsbCB0aGUgc3lzdGVtIHBhY2thZ2VzIGluIGVhY2ggcGx1Zy1pbiBzbyB3ZSBjYW4gZmlsdGVyIG91dAotCQkvLyB0aG9zZSBwYWNrYWdlcyB3aGVuIGNvbXBhcmluZyB0aGUgbGlicmFyaWVzLgotCi0JCS8vIEl0ZXJhdGUgdGhlIGVsZW1lbnQgaW4gdGhlIGN1cnJlbnQgbGlicmFyeSwgYW5kIGJ1aWxkIGEgZGlmZiB0cmVlIGJ5Ci0JCS8vIGNvbXBhcmluZyB0byB0aGUgaW1wb3J0IGxpYnJhcnkuCi0JCUxpc3QgcGx1Z2lucyA9IGJhc2VMaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCUxpc3Qgc3lzdGVtUGFja2FnZXMgPSBUbmdVdGlsLmdldEFsbFN5c3RlbVBhY2thZ2VzKHBsdWdpbik7Ci0JCQkKLQkJCS8vIGNvbnRlbnQgY2F0ZWdvcnkgcGFja2FnZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGludG8gdGhlIGRpZmYgdHJlZSAKLQkJCS8vIG90aGVyd2lzZSB0aGUgY2F0ZWdvcnkgaW5mb3JtYXRpb24gd2lsbCBiZSBsb3N0Ci0JCQlMaXN0IGNhdGVnb3J5TGlzdCA9IFRuZ1V0aWwuZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZXMocGx1Z2luKTsKLQkJCWZvciAoIEl0ZXJhdG9yIGl0YyA9IGNhdGVnb3J5TGlzdC5pdGVyYXRvcigpOyBpdGMuaGFzTmV4dCgpOyApIHsKLQkJCQlPYmplY3QgbyA9IGl0Yy5uZXh0KCk7Ci0JCQkJaWYgKCBzeXN0ZW1QYWNrYWdlcy5jb250YWlucyhvKSApIHsKLQkJCQkJc3lzdGVtUGFja2FnZXMucmVtb3ZlKG8pOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gdGhlIHJvb3QgY3VzdG9tY2F0ZWdvdHkgcGFja2FnZSBuZWVkcyB0byBiZSBpbmNsdWRlZCBpbnRvIHRoZSBkaWZmIHRyZWUKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgc3lzdGVtUGFja2FnZXMuc2l6ZSgpICkgewotCQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gKE1ldGhvZFBhY2thZ2Upc3lzdGVtUGFja2FnZXMuZ2V0KGkpOwotCQkJCWlmICggVG5nVXRpbC5pc1Jvb3RDdXRvbUNhdGVnb3J5UGFja2FnZShwa2cpICkgewotCQkJCQlzeXN0ZW1QYWNrYWdlcy5yZW1vdmUocGtnKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gQnVpbGQgdGhlIGRpZmYgdHJlZSBieSBpdGVyYXRpbmcgdGhlIGN1cnJlbnQgbGlicmFyeS4KLQkJCWl0ZXJhdGVFbGVtZW50KHBsdWdpbiwgcm9vdERpZmZUcmVlLCBzeXN0ZW1QYWNrYWdlcyk7Ci0JCX0KLQotCQlMaXN0IGNvbmZpZ3MgPSBiYXNlTGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGNvbmZpZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXQubmV4dCgpOwotCi0JCQkvLyBCdWlsZCB0aGUgZGlmZiB0cmVlIGJ5IGl0ZXJhdGluZyB0aGUgY3VycmVudCBsaWJyYXJ5LgotCQkJaXRlcmF0ZUVsZW1lbnQoY29uZmlnLCByb290RGlmZlRyZWUsIG5ldyBBcnJheUxpc3QoKSk7Ci0JCX0KLQotCQkvLyBQcm9jZXNzIHRoZSBuZXcgZWxlbWVudHMgaW4gdGhlIGltcG9ydCBsaWJyYXJ5IGFuZCBhZGQgdGhlbSB0byB0aGUKLQkJLy8gZGlmZiB0cmVlLgotCQloYW5kbGVOZXdFbGVtZW50cyhpbXBvcnRMaWJyYXR5KTsKLQotCQlyZXR1cm4gcm9vdERpZmZUcmVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpZmZlcm5lY2UgdHJlZS4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudERpZmZUcmVlIGdldERpZmZUcmVlKCkgewotCQlyZXR1cm4gcm9vdERpZmZUcmVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpZmZlcm5lY2UgbWFwLgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0RGlmZlRyZWVNYXAoKSB7Ci0JCXJldHVybiBkaWZmRWxlbWVudE1hcDsKLQl9Ci0KLQkvKioKLQkgKiBJdGVyYXRlcyB0aGUgZWxlbWVudCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5IGFuZCBidWlsZCBhIGRpZmYgdHJlZSBieQotCSAqIGNvbXBhcmluZyB0byB0aGUgaW1wb3J0IGxpYnJhcnkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGl0ZXJhdGVFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCUVsZW1lbnREaWZmVHJlZSBkaWZmVHJlZSwgTGlzdCBzeXN0ZW1QYWNrYWdlcykgewotCQlpZiAoIXNlbGVjdGFibGUoZWxlbWVudCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFVwZGF0ZSB0aGUgZGlmZmVsZW1lbnQgVUlEIG1hcC4KLQkJaWYgKCFzeXN0ZW1QYWNrYWdlcy5jb250YWlucyhlbGVtZW50KQotCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpKSB7Ci0JCQlTdHJpbmcgdWlkID0gZWxlbWVudC5nZXRHdWlkKCk7Ci0JCQlFbGVtZW50RGlmZlRyZWUgZGlmZkNoaWxkID0gbmV3IEVsZW1lbnREaWZmVHJlZShlbGVtZW50LAotCQkJCQkoTWV0aG9kRWxlbWVudCkgaW1wb3J0RWxlbWVudE1hcC5nZXQodWlkKSk7Ci0JCQlkaWZmRWxlbWVudE1hcC5wdXQodWlkLCBkaWZmQ2hpbGQpOwotCQkJZGlmZlRyZWUuYWRkQ2hpbGQoZGlmZkNoaWxkKTsKLQkJCWRpZmZUcmVlID0gZGlmZkNoaWxkOwotCQl9Ci0KLQkJLy8gQ2hlY2sgd2l0aCB0aGUgaW1wb3J0aW5nIGVsZW1lbnQgYW5kIGNyZWF0ZSBhbiBFbGVtZW50RGlmZkluZm8gb2JqZWN0Ci0JCUVMaXN0IGNoaWxkcmVuID0gZWxlbWVudC5lQ29udGVudHMoKTsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGUgPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgY2hpbGQgPSAoTWV0aG9kRWxlbWVudCkgZTsKLQkJCQkJaWYgKHNlbGVjdGFibGUoY2hpbGQpKSB7Ci0JCQkJCQlpdGVyYXRlRWxlbWVudChjaGlsZCwgZGlmZlRyZWUsIHN5c3RlbVBhY2thZ2VzKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChkZWJ1ZyApIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIkVycm9yISAiICsgZSArICIgaXMgbm90IGEgTWV0aG9kRWxlbWVudCBvYmplY3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGVyZSBhcmUgbmV3bHkgYWRkZWQgZWxlbWVudHMgaW4gdGhlIGltcG9ydGluZyBsaWJyYXJ5LCBhZGQgdGhlIG5ldwotCSAqIGVsZW1lbnRzIGludG8gdGhlIHBhcmVudAotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVOZXdFbGVtZW50cyhNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKCFzZWxlY3RhYmxlKGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoaXNOZXdFbGVtZW50KGVsZW1lbnQpKSB7Ci0JCQkvLyBUaGlzIGlzIGEgbmV3IGVsZW1lbnQsIGZpbmQgdGhlIHBhcmVudCBpbiB0aGUgYmFzZSBsaWJyYXJ5LgotCQkJTWV0aG9kRWxlbWVudCBwYXJlbnQgPSAoTWV0aG9kRWxlbWVudCkgZWxlbWVudC5lQ29udGFpbmVyKCk7Ci0JCQl3aGlsZSAoaXNOZXdFbGVtZW50KHBhcmVudCkpIHsKLQkJCQllbGVtZW50ID0gcGFyZW50OwotCQkJCXBhcmVudCA9IChNZXRob2RFbGVtZW50KSBwYXJlbnQuZUNvbnRhaW5lcigpOwotCQkJfQotCi0JCQkvLyBBbHdheXMgbWVyZ2UgbGlicmF5IHBsdWdpbnMgZXZlbiBpdCdzIGZyb20gYSBkaWZmZXJlbnQgbGlicmFyeS4KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJcGFyZW50ID0gYmFzZUxpYnJhcnk7Ci0JCQl9Ci0KLQkJCS8vIE5lZWQgdG8gZmluZCB0aGUgcGFyZW50IGVsZW1lbnQgaW4gdGhlIGN1cnJlbnQgbGlicmFyeSBzbyB0aGF0IHdlCi0JCQkvLyBrbm93IHdoZXJlIHRvIGFkZCB0aGUgbmV3IGVsZW1lbnQuCi0JCQlNZXRob2RFbGVtZW50IGxpYl9wYXJlbnQgPSAoTWV0aG9kRWxlbWVudCkgY3VycmVudEVsZW1lbnRNYXAKLQkJCQkJLmdldChwYXJlbnQuZ2V0R3VpZCgpKTsKLQkJCWlmIChsaWJfcGFyZW50ID09IG51bGwpIHsKLQkJCQlsaWJfcGFyZW50ID0gYmFzZUxpYnJhcnk7Ci0JCQl9Ci0JCQlFbGVtZW50RGlmZlRyZWUgZWxlbWVudERpZmZUcmVlID0gbmV3IEVsZW1lbnREaWZmVHJlZShudWxsLAotCQkJCQllbGVtZW50LCBsaWJfcGFyZW50KTsKLQotCQkJLy8gRmluZCB0aGUgcGFyZW50IGRpZmYgdHJlZS4KLQkJCUVsZW1lbnREaWZmVHJlZSBwYXJlbnREaWZmVHJlZSA9IG51bGw7Ci0JCQl3aGlsZSAoKHBhcmVudERpZmZUcmVlID09IG51bGwpICYmIChwYXJlbnQgIT0gbnVsbCkpIHsKLQkJCQlwYXJlbnREaWZmVHJlZSA9IChFbGVtZW50RGlmZlRyZWUpIGRpZmZFbGVtZW50TWFwLmdldChwYXJlbnQKLQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJCXBhcmVudCA9IChNZXRob2RFbGVtZW50KSBwYXJlbnQuZUNvbnRhaW5lcigpOwotCQkJfQotCi0JCQlpZiAocGFyZW50RGlmZlRyZWUgPT0gbnVsbCkgewotCQkJCXBhcmVudERpZmZUcmVlID0gcm9vdERpZmZUcmVlOwotCQkJfQotCi0JCQlwYXJlbnREaWZmVHJlZS5hZGRDaGlsZChlbGVtZW50RGlmZlRyZWUpOwotCQl9IGVsc2UgewotCQkJLy8gSXRlcmF0ZSB0aGUgY2hpbGRyZW4uCi0JCQlMaXN0IGNoaWxkcmVuID0gZWxlbWVudC5lQ29udGVudHMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRjID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRjLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRjLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgb2JqOyAKLQkJCQkJaGFuZGxlTmV3RWxlbWVudHMoZSk7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXdFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuICFjdXJyZW50RWxlbWVudE1hcC5jb250YWluc0tleShlbGVtZW50LmdldEd1aWQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVUlETWFwKExpc3QgZWxlbWVudHMsIE1hcCBlbGVtZW50VUlETWFwLCBib29sZWFuIHJlY3Vyc2l2ZSwgYm9vbGVhbiBmdWxsKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gaXQubmV4dCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBlOwotCQkJCWlmIChzZWxlY3RhYmxlKGVsZW1lbnQpIHx8IGZ1bGwpIHsKLQkJCQkJU3RyaW5nIHVpZCA9IGVsZW1lbnQuZ2V0R3VpZCgpOwotCQkJCQllbGVtZW50VUlETWFwLnB1dCh1aWQsIGVsZW1lbnQpOwotCi0JCQkJCWlmIChyZWN1cnNpdmUpIHsKLQkJCQkJCWJ1aWxkVUlETWFwKGVsZW1lbnQuZUNvbnRlbnRzKCksIGVsZW1lbnRVSURNYXAsCi0JCQkJCQkJCXJlY3Vyc2l2ZSwgZnVsbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKCAhKGUgaW5zdGFuY2VvZiBQb2ludCB8fCBlIGluc3RhbmNlb2YgRGltZW5zaW9uIHx8IGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50UHJvcGVydHkpICl7Ci0JCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJCQkiSW1wb3J0IGVycm9yLiAiICsgZSArICIgaXMgbm90IGEgTWV0aG9kRWxlbWVudCBvYmplY3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgbWV0aG9kIGVsZW1lbnQgaXMgc2VsZWN0YWJsZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZWxlY3RhYmxlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5Ci0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbgotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlCi0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4aXN0aW5nIG1ldGhvZCBlbGVtZW50IGdpdmVuIGJ5IHRoZSBndWlkLgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEV4aXN0aW5nRWxlbWVudChTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gKE1ldGhvZEVsZW1lbnQpY3VycmVudEVsZW1lbnRNYXAuZ2V0KGd1aWQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9MaWJyYXJ5SW1wb3J0TWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9MaWJyYXJ5SW1wb3J0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mjk2MmJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvTGlicmFyeUltcG9ydE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5EaWFncmFtSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JSGVscGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBpbXBvcnRpbmcgb2YgYSBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeUltcG9ydE1hbmFnZXIgewotCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlbmFtZVBsdWdpbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCXByaXZhdGUgTWFwIHJlbmFtZUVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgTWFwIHNldEVsZW1lbnRNYXAgPSBudWxsOwotCi0JcHJpdmF0ZSBMaWJyYXJ5RGlmZk1hbmFnZXIgZGlmZk1ncjsKLQlwcml2YXRlIEVsZW1lbnREaWZmVHJlZSByb290VHJlZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gY29uZmlnRm9sZGVyRXJyb3IgPSBmYWxzZTsKLQotCS8vcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gbnVsbDsKLQotCS8vcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGFmY3AgPSBudWxsOwotCi0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGJhc2VMaWJyYXJ5ID0gbnVsbDsKLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgaW1wb3J0aW5nTGlicmFyeSA9IG51bGw7Ci0KLQkvLyBndWlkIG9mIHJlcGxhY2VkIGVsZW1lbnQgaWQgdG8gdGhlIGVsZW1lbnQgaW4gdGhlIGJhc2UgbGlicmFyeQotCS8vIHdlIG5lZWQgdGhpcyB0byByZWRpcmVjdCB0aGUgcmVmZXJlbmNlIG9mIG5ldyBlbGVtZW50cyBmcm9tIHRoZSBpbXBvcnRpbmcKLQkvLyBsaWJyYXR5IHRvIHRoZSBiYXNlIGxpYnJhcnkKLQlwcml2YXRlIE1hcCByZXBsYWNlZEVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8ga2VlcCB0aGUgbmV3IGVsZW1lbnRzLCB3ZSBuZWVkIHRvIGl0ZXJhdGUgdGhlaXIgZmVhdHVyZSB2YWx1ZSBhbmQKLQkvLyByZWRpcmVjdCB0aGUgdmFsZXUgZWxlbWVudAotCS8vIGZyb20gdGhlIGltcG9ydGluZyBsaWJyYXJ5IHRvIHRoZSBiYXNlIGxpYnJhcnkKLQlwcml2YXRlIExpc3QgbmV3RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCS8vIGRlbGV0ZWQgZWxlbWVudHMsCi0JcHJpdmF0ZSBMaXN0IGRlbGV0ZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZGVidWcgPSBJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JCi0JLy8gbGlzdCBvZiB1c2VyIHNlbGVjdGVkIGl0ZW1zIHRvIGJlIGltcG9ydGVkCi0JTGlzdCBjaGVja2VkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkvLyBmbGFnIHRvIGluZGljYXRlIHRoZSBmaWxlIGNoZW91dCBzdGF0dXMKLQlJU3RhdHVzIGZpbGVDaGVja2VkT3V0U3RhdHVzID0gbnVsbDsKLQkKLQkvLyByZXNvdXJjZSBmaWxlIHBhdGggZm9yIG5ldyByZXNvcnVjZXMKLQlMaXN0IG5ld1Jlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlSZXNvdXJjZVNjYW5uZXIgcmVzU2Nhbm5lcjsKLQkKLQlwcml2YXRlIERpYWdyYW1IYW5kbGVyIGRpYWdyYW1IYW5kbGVyOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExpYnJhcnlJbXBvcnRNYW5hZ2VyKExpYnJhcnlEaWZmTWFuYWdlciBkaWZmTWdyLAotCQkJTGlzdCBjaGVja2VkSXRlbXMpIHsKLQkJdGhpcy5kaWZmTWdyID0gZGlmZk1ncjsKLQkJdGhpcy5yb290VHJlZSA9IGRpZmZNZ3IuZ2V0RGlmZlRyZWUoKTsKLQkJCi0JCWlmICggY2hlY2tlZEl0ZW1zICE9IG51bGwgKSB7Ci0JCQkvLyBjaGVja2VkTGlzdCBjb250YWlucyBhIGxpc3Qgb2YgRWxlbWVudERpZmZUcmVlIG9iamVjdHMKLQkJCS8vIGdldCB0aGUgcGFja2FnZXMgYXMgd2VsbAotCQkJdGhpcy5jaGVja2VkTGlzdC5hZGRBbGwoY2hlY2tlZEl0ZW1zKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjaGVja2VkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQlFbGVtZW50RGlmZlRyZWUgZGlmZlRyZWUgPSAoRWxlbWVudERpZmZUcmVlKSBpdC5uZXh0KCk7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gZGlmZlRyZWUuZ2V0QmFzZUVsZW1lbnQoKTsKLQkJCQlpZiAoIGUgIT0gbnVsbCApIHsKLQkJCQkJY2hlY2tlZExpc3QuYWRkKGUpOwotCQkJCX0KLQkJCQkJCQkJCi0JCQkJaWYgKCBlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCApIHsKLQkJCQkJTGlicmFyeVV0aWwuZ2V0QWxsQ2hpbGRQYWNrYWdlcygoTWV0aG9kUGFja2FnZSllLCBjaGVja2VkTGlzdCk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIGFsc28gaW5jbGR1ZSB0aGUgaGlkZGVuIHJvb3QgY3VzdG9tIHBhY2thZ2UgaWYgdGhlIHBhY2thZ2UgaXMgdGhlIEN1c3RvbUNhdGVnb3JpZXMgcGFja2FnZQotCQkJCS8vIDE1MDg5NSAtIEltcG9ydCBDb25maWc6IEN1c3RvbUNhdGVnb3J5IGRpZCBub3Qgc3luYyB1cCBieSBpbXBvcnQKLQkJCQlpZiAoIGUgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlICkgewotCQkJCQlMaXN0IGNoaWxkcmVuID0gKChNZXRob2RQYWNrYWdlKWUpLmdldENoaWxkUGFja2FnZXMoKTsKLQkJCQkJaWYgKCBjaGlsZHJlbi5zaXplKCkgPT0gMSApIHsKLQkJCQkJCU1ldGhvZFBhY2thZ2UgcGtnICA9IChNZXRob2RQYWNrYWdlKWNoaWxkcmVuLmdldCgwKTsKLQkJCQkJCWlmICggVG5nVXRpbC5pc1Jvb3RDdXRvbUNhdGVnb3J5UGFja2FnZShwa2cpICkgewotCQkJCQkJCWNoZWNrZWRMaXN0LmFkZChwa2cpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWUgPSBkaWZmVHJlZS5nZXRJbXBvcnRFbGVtZW50KCk7Ci0JCQkJaWYgKCBlICE9IG51bGwgKSB7Ci0JCQkJCWNoZWNrZWRMaXN0LmFkZChlKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKCBlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCApIHsKLQkJCQkJTGlicmFyeVV0aWwuZ2V0QWxsQ2hpbGRQYWNrYWdlcygoTWV0aG9kUGFja2FnZSllLCBjaGVja2VkTGlzdCk7Ci0JCQkJfQotCi0JCQkJCi0JCQkJLy8gZm9yIG5ldyBpdGVtLCBhZGQgYWxsIHRoZSBzdWIgcGFja2FnZXMKLQkJCQlpZiAoIGRpZmZUcmVlLmlzTmV3KCkgKSB7Ci0JCQkJCWlmICggZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiApIHsKLQkJCQkJCWNoZWNrZWRMaXN0LmFkZEFsbChMaWJyYXJ5VXRpbC5nZXRBbGxQYWNrYWdlcygoTWV0aG9kUGx1Z2luKWUpKTsKLQkJCQkJfSBlbHNlIGlmICggZSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UgKSB7Ci0JCQkJCQlMaWJyYXJ5VXRpbC5nZXRBbGxDaGlsZFBhY2thZ2VzKChNZXRob2RQYWNrYWdlKWUsIGNoZWNrZWRMaXN0KTsKLQkJCQkJfSAKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfSBlbHNlIHsKLQkJCWNoZWNrZWRMaXN0ID0gbnVsbDsKLQkJfQotCQkKLQkJCi0JCWluaXQoKTsKLQotCQkvLyBHZXQgdGhlIGN1cnJlbnQgbGlicmFyeS4KLQkJYmFzZUxpYnJhcnkgPSAoTWV0aG9kTGlicmFyeSkgdGhpcy5yb290VHJlZS5nZXRCYXNlRWxlbWVudCgpOwotCQlpbXBvcnRpbmdMaWJyYXJ5ID0gKE1ldGhvZExpYnJhcnkpIHRoaXMucm9vdFRyZWUKLQkJCQkuZ2V0SW1wb3J0RWxlbWVudCgpOwotCi0JCS8vIGNyZWF0ZSB0aGUgcmVzb3VyY2Ugc2Nhbm5lcgotCQlyZXNTY2FubmVyID0gbmV3IFJlc291cmNlU2Nhbm5lcigKLQkJCQlMaWJyYXJ5VXRpbC5nZXRMaWJyYXJ5Um9vdFBhdGgoaW1wb3J0aW5nTGlicmFyeSksIAotCQkJCUxpYnJhcnlVdGlsLmdldExpYnJhcnlSb290UGF0aChiYXNlTGlicmFyeSksIHJlbmFtZVBsdWdpbk1hcCk7Ci0JCQkKLQkJZGlhZ3JhbUhhbmRsZXIgPSBuZXcgRGlhZ3JhbUhhbmRsZXIoCi0JCQkJTGlicmFyeVV0aWwuZ2V0TGlicmFyeVJvb3RQYXRoKGltcG9ydGluZ0xpYnJhcnkpLCAKLQkJCQlMaWJyYXJ5VXRpbC5nZXRMaWJyYXJ5Um9vdFBhdGgoYmFzZUxpYnJhcnkpKSB7CQkJCQotCQkJLy9bMF06IHNvdXJjZUZpbGUKLQkJCS8vWzFdOiB0YXJnZXRGaWxlCi0JCQlwcm90ZWN0ZWQgRmlsZVtdIGdldEZpbGVzKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEZpbGVzKGVsZW0sIGZhbHNlKTsKLQkJCX0KLQkJCQotCQl9OwotCQkKLQl9Ci0JCQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotLy8JCS8vIFNldCB0aGUgdHJlZSBjb250ZW50LgotLy8JCUxpc3QgZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCWZhY3Rvcmllcy5hZGQobmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0vLwkJZmFjdG9yaWVzLmFkZChuZXcgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0vLwkJZmFjdG9yaWVzLmFkZChuZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotLy8KLS8vCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoCi0vLwkJCQlmYWN0b3JpZXMpOwotLy8JCWFmY3AgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpOwotLy8KLS8vCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsKLS8vCi0vLwkJLy8gQ3JlYXRlIHRoZSBlZGl0aW5nIGRvbWFpbiB3aXRoIGEgc3BlY2lhbCBjb21tYW5kIHN0YWNrLgotLy8JCWVkaXRpbmdEb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKGFkYXB0ZXJGYWN0b3J5LAotLy8JCQkJY29tbWFuZFN0YWNrLCBuZXcgSGFzaE1hcCgpKTsKLS8vCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzU2VsZWN0ZWQoRWxlbWVudERpZmZUcmVlIGRpZmZUcmVlKSB7Ci0JCWlmICggY2hlY2tlZExpc3QgPT0gbnVsbCB8fCBjaGVja2VkTGlzdC5jb250YWlucyhkaWZmVHJlZSkgKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJTWV0aG9kRWxlbWVudCBlID0gZGlmZlRyZWUuZ2V0QmFzZUVsZW1lbnQoKTsJCQotCQlpZiAoIGUgPT0gbnVsbCApIHsKLQkJCWUgPSBkaWZmVHJlZS5nZXRJbXBvcnRFbGVtZW50KCk7Ci0JCX0KLQkJCi0JCXJldHVybiBpc1NlbGVjdGVkKGUpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNTZWxlY3RlZChNZXRob2RFbGVtZW50IGUpIHsKLQkJCi0JCWlmICggY2hlY2tlZExpc3QgPT0gbnVsbCB8fCAKLQkJCQllIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uIHx8IAotCQkJCWUuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uIHx8IAotCQkJCWUgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5ICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWlmICggY2hlY2tlZExpc3Quc2l6ZSgpID09IDAgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmICggZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24gKSB7Ci0JCQlyZXR1cm4gY2hlY2tlZExpc3QuY29udGFpbnMoZSk7Ci0JCX0KLQkJCi0JCU1ldGhvZEVsZW1lbnQgbyA9IChNZXRob2RFbGVtZW50KUxpYnJhcnlVdGlsLmdldFNlbGVjdGFibGUoZSk7Ci0JCWlmICggbyA9PSBudWxsICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IAotCQkKLQkJaWYgKCBvIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlyZXR1cm4gY2hlY2tlZExpc3QuY29udGFpbnMobyk7Ci0JfQotCQotCS8qKgotCSAqIERvZXMgbWVyZ2UgZnJvbSB0aGUgaW1wb3J0IGxpYnJhcnkgaW50byB0aGUgYmFzZSBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyB2b2lkIGRvTWVyZ2UoYm9vbGVhbiByZXBsYWNlRXhpc3RpbmcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvbmZpZ0ZvbGRlckVycm9yID0gZmFsc2U7Ci0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJNZXJnaW5nIGNvbmZpZ3VyYXRpb24gLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkJCi0JCS8vIFNhdmUgdGhlIGxpYnJhcnkgcGF0aCBiZWZvcmUgZGV0YWNoaW5nIHRoZSByZXNvdXJjZS4KLQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJsb2FkaW5nIGxpYnJhcnkgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJTGlzdCB1bmxvY2tlZFBsdWdpbnMgPSB1bmxvY2tQbHVnaW5zKCk7Ci0JCWlmICghIHVubG9ja2VkUGx1Z2lucy5pc0VtcHR5KCkgJiYgKGZpbGVDaGVja2VkT3V0U3RhdHVzICE9IG51bGwpCi0JCQkJJiYgIWZpbGVDaGVja2VkT3V0U3RhdHVzLmlzT0soKSkgewotCQkJLy8gbG9nIGVycm9yCi0JCQlmaWxlQ2hlY2tPdXRFcnJvcigpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlicmFyeVV0aWwubG9hZEFsbChiYXNlTGlicmFyeSk7Ci0JCUxpYnJhcnlVdGlsLmxvYWRBbGwoaW1wb3J0aW5nTGlicmFyeSk7Ci0KLQkJLy8gRGV0YWNoIHRoZSBuZXcgbGlicmFyeSBmcm9tIHRoZSBjdXJyZW50IHJlc291cmNlIHNvIGl0IGNhbiBiZQotCQkvLyBhZGRlZCB0byBhIG5ldyBMaWJyYXJ5IFByb2Nlc3NvciBpbnN0YW5jZS4KLQkJTGlicmFyeVV0aWwuZGV0YWNoRnJvbVJlc291cmNlKGltcG9ydGluZ0xpYnJhcnkpOwotCi0JCS8vIGZvciB0ZXN0Ci0JCWltcG9ydGluZ0xpYnJhcnkuc2V0TmFtZSgiSW1wb3J0aW5nTGliOiAiICsgaW1wb3J0aW5nTGlicmFyeS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzIGNvbmZpZ3VyYXRpb24gZGlmZiB0cmVlIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBiZWZvcmUgcHJvY2Vzc2luZywgc2F2ZSB0aGUgb3JpZ2luYWwgcmVzb3VyY2VzIAotCQkvLyBzbyB0aGF0IHdlIGNhbiBmaW5kIHRoZSBuZXdseSBhZGRlZCByZXNvdXJjZXMKLQkJTGlzdCBvbGRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KAotCQkJCWJhc2VMaWJyYXJ5LmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpOwotCQkKLQkJLy8gSXRlcmF0ZSBlYWNoIGVsZW1lbnQgYW5kIHRoZSBuZWNlc3NhcnkgbWVyZ2VzLgotCQlwcm9jZXNzRGlmZlRyZWUocm9vdFRyZWUsIHJlcGxhY2VFeGlzdGluZyk7Ci0KLQkJaGFuZGxlU2V0RWxlbWVudHMoKTsKLQkJCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInBlcmZvcm0gaW50ZWdyaXR5IGNoZWNraW5nIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBwZXJmb3JtIGFuIGludGVncml0eSBjaGVjayBvZiB0aGUgbGlicmFyeQotCQkvLyBmaXggYW55IGRhbmZsaW5nIGVsZW1lbnRzIGR1ZSB0byBwYWNrYWdlL2VsZW1lbnQgcmVwbGFjZW1lbnQKLQkJZG9JbnRlZ3JpdHlDaGVjaygpOwotCi0JCS8vIG5vdyBwcm9jZXNzIHRoZSBuZXcgcmVzb3VyY2VzIGFuZCBtYXJrIHRoZW0gZGlyc3Qgc28gdGhhdCAKLQkJLy8gdGhlIGRhdGEgd2lsbCBiZSBzYXZlZCBhZ2Fpbi4gCi0JCS8vIFRoaXMgc3RlcCBpcyBjcml0aWNhbCBzaW5jZSB0aGUgZmlyc3Qgcm91bmQgb25seSBjcmVhdGVkIHRoZSBkYXRhIHN0cnVjdHVyZQotCQkvLyBzb21lIG9mIHRoZSBjcm9zcy1yZWZlcmVuY2VkIGVsZW1lbnRzIG1pZ2h0IGJlIGxvc3Qgb24gdGhlIGZpcnN0IHNhdmluZwotCQkvLyBmb3IgZXhhbXBsZSwgd2hlbiBjcmVhdGUgYSBtZXRob2QgY29uZmlndXJhdGlvbiB3aXRoIHJlZmVyZW5jZXMgdG8gYSBuZXcgcGx1Z2luLAotCQkvLyB3aGljaCBhcmUgbm90IHNhdmVkIHlldCwgdGhvc2UgcmVmZXJlbmNlcyB3aWxsIGJlIGxvc3QuCi0JCS8vIDE0NTg5MSAtIEltcG9ydCBDb25maWd1cmF0aW9uOiBkZWZhdWx0IGNvbmZpZyBpcyBsb3NzIGFmdGVyIGltcG9ydAotCQloYW5kbGVOZXdSZXNvdXJjZXMob2xkUmVzb3VyY2VzKTsKLQkJCi0JCWhhbmRsZU5hbWVSZXBsYWNlKHJlbmFtZUVsZW1lbnRNYXApOwotCQkKLQkJZGlhZ3JhbUhhbmRsZXIucG9zdFJlZ2lzdGVyRWxlbWVudHMoKTsKLQkJCi0JCS8vIGdldCBhbGwgdGhlIG1vZGlmaWVkIHJlc291cmNlcyBhbmQgcmVzb3VyY2UgZmlsZXMKLQkJLy8gY2hlY2sgQ00gZm9yIGZpbGUgY2hlY2stb3V0Ci0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoZWNrIG91dCBmaWxlcyAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQkvLyBjbGVhciByZXNvdXJjZXMgZm9yIGRlbGV0ZWQgZWxlbWVudHMKLQkJZGVsZXRlUmVzb3J1Y2VzKCk7Ci0JCi0JCWNoZWNrTW9kaWZpZWRGaWxlcygpOwotCQkJCQotCQlpZiAoIGZpbGVDaGVja2VkT3V0U3RhdHVzLmlzT0soKSApIHsKLQkJIAotCQkJaWYgKCBkZWJ1ZyApIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNvcHlpbmcgcmVzb3VyY2UgZmlsZXMgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJlc1NjYW5uZXIuZXhlY3V0ZSgpOwotCQkJZGlhZ3JhbUhhbmRsZXIuZXhlY3V0ZSgpOwotCi0JCQlpZiAoIGRlYnVnICkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2F2aW5nIGxpYnJhcnkgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJaWYgKCEgY29uZmlnRm9sZGVyRXJyb3IpIHsKLQkJCQlpZiAodW5sb2NrZWRQbHVnaW5zLnNpemUoKSA+IDApIHsKLQkJCQkJbG9ja1VubG9ja2VkUGx1Z2lucyh1bmxvY2tlZFBsdWdpbnMpOwotCQkJCX0KLQkJCQlMaWJyYXJ5VXRpbC5zYXZlTGlicmFyeShiYXNlTGlicmFyeSwgZmFsc2UsIGZhbHNlKTsKLQkJCX0KLQkJfSAKLQkJZWxzZSB7Ci0JCQlmaWxlQ2hlY2tPdXRFcnJvcigpOwotCQl9CQotLy8gaWYgKCBkZWJ1ZyApIHsKLS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29weWluZyByZXNvdXJjZSBmaWxlcyAuLi4iKTsgLy8kTk9OLU5MUy0xJAotLy8gfQotLy8KLS8vIC8vIENvcHkgdGhlIHJlc291cmNlIGZpbGVzIGluIHRoZSBjdXJyZW50IGxpYnJhcnkgdG8gdGhlIG5ldyBsaWJyYXJ5LgotLy8gLy8gRm9yIHNpbXBsaWNpdHkgc2FrZSwgY29weSBhbGwgcmVzb3VyY2UgZmlsZXMgaWYgdGhlIGZpbGVzIGRvIG5vdAotLy8gLy8gZXhpc3QgaW4gdGhlIHRhcmdldCBsaWJyYXJ5IG9yIGlmIHRoZSBmaWxlcyBhcmUgbmV3ZXIuCi0vLyBTdHJpbmcgaW5jbHVkZXMgPSAicmVzb3VyY2VzLyoqLCAqKi9yZXNvdXJjZXMvKioiOyAvLyROT04tTkxTLTEkCi0vLwotLy8gTGF5b3V0UmVzb3VyY2VzLmNvcHlEaXIoc3JjRGlyLCBkZXN0RGlyLCBpbmNsdWRlcywgbnVsbCk7Ci0KLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTWVyZ2luZyBjb25maWd1cmF0aW9uIGRvbmUuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpbGVDaGVja091dEVycm9yKCkgewotCQkvLyBsb2cgZXJyb3IKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVN0cmluZyB0aXRsZSA9IEltcG9ydFJlc291cmNlcy5pbXBvcnRDb25maWdXaXphcmRfdGl0bGU7IAotCQkJCVN0cmluZyBtc2cgPSBJbXBvcnRSZXNvdXJjZXMuSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9FUlJfSW1wb3J0X2NvbmZpZ3VyYXRpb247IAotCQkJCW5ldyBNc2dEaWFsb2coSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKSkKLQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnLCBmaWxlQ2hlY2tlZE91dFN0YXR1cyk7Ci0JCQkJfQotCQl9KTsKLQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDaGVja291dCBmaWxlcyBmYWlsZWQgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZU5ld1Jlc291cmNlcyhMaXN0IG9sZFJlc291cmNlcykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYmFzZUxpYnJhcnkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKQotCQkJCS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKWl0Lm5leHQoKTsKLQkJCWlmICggIW9sZFJlc291cmNlcy5jb250YWlucyhyZXMpICkgewotCQkJCWxvZ05ld1Jlc291cmNlKHJlcyk7Ci0JCQl9Ci0JCX0JCi0JfQotCQotCQotCS8qKgotCSAqIFByb2Nlc3NlcyB0aGUgZGlmZiB0cmVlLiBPbmx5IG5lZWQgdG8gZG8gdGhlIGZpcnN0IGxldmVsIHNpbmNlIHRoZQotCSAqIHJlcGxhY2Ugb3IgYWRkIGlzIGRvbmUgYXQgdGhlIG1ldGhvZCBwYWNrYWdlIGxldmVsLgotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzRGlmZlRyZWUoRWxlbWVudERpZmZUcmVlIGRpZmZUcmVlLAotCQkJYm9vbGVhbiByZXBsYWNlRXhpc3RpbmcpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoZGlmZlRyZWUgPT0gbnVsbCB8fCAhaXNTZWxlY3RlZChkaWZmVHJlZSkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBUaGVyZSBpcyBhIGNoYW5nZS4KLQkJaW50IHN0YXRlID0gZGlmZlRyZWUuZ2V0RGlmZlN0YXRlKCk7Ci0JCU1ldGhvZEVsZW1lbnQgYmFzZSA9IGRpZmZUcmVlLmdldEJhc2VFbGVtZW50KCk7Ci0JCU1ldGhvZEVsZW1lbnQgaW1wID0gZGlmZlRyZWUuZ2V0SW1wb3J0RWxlbWVudCgpOwotCQlpZiAocmVwbGFjZUV4aXN0aW5nICYmIChzdGF0ZSA9PSBFbGVtZW50RGlmZlRyZWUuRElGRl9TVEFURV9DSEFOR0VEKSApIHsKLQotCQkJaWYgKCAoYmFzZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pKSB7Ci0JCQkJLy8gcmVwbGFjZSB0aGUgY29uZmlndXJhdGlvbiBieSBhZGRpbmcgdGhlIG5ldyBwYWNrYWdlcyBpbnRvIHRoZQotCQkJCS8vIGNvbmZpZ3VyYXRpb24KLQkJCQlkb1JlcGxhY2VDb25maWd1cmF0aW9uKChNZXRob2RDb25maWd1cmF0aW9uKSBiYXNlLCAoTWV0aG9kQ29uZmlndXJhdGlvbikgaW1wKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCAoYmFzZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJCQkvLyBSZXBsYWNlIHRoZSBwbHVnaW4gd2l0aCB0aGUgbm9uLXBhY2thZ2UgZmVhdHVyZXMuCi0JCQkJZG9SZXBsYWNlUGx1Z2luKChNZXRob2RQbHVnaW4pIGJhc2UsIChNZXRob2RQbHVnaW4pIGltcCk7Ci0JCQl9Ci0JCQllbHNlIGlmICggKGJhc2UgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSkgewotCQkJCS8vIFJlcGxhY2UgdGhlIHBhY2thZ2UuCi0JCQkJZG9SZXBsYWNlUGFja2FnZSgoTWV0aG9kUGFja2FnZSkgYmFzZSwgKE1ldGhvZFBhY2thZ2UpIGltcCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKGRlYnVnICkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldoYXQgaXMgdGhpczogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGJhc2UpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChzdGF0ZSA9PSBFbGVtZW50RGlmZlRyZWUuRElGRl9TVEFURV9ORVcpIHsKLQkJCS8vIEFkZCB0aGUgbmV3IHBhY2thZ2UgZnJvbSBpbXBvcnQgbGlicmFyeS4KLQkJCWRvQWRkKGRpZmZUcmVlLmdldEJhc2VQYXJlbnRFbGVtZW50KCksIGRpZmZUcmVlLmdldEltcG9ydEVsZW1lbnQoKSk7IAotCQl9Ci0KLQkJLy8gUHJvY2VzcyB0aGUgY2hpbGRyZW4gcmVjdXJzaXZlbHkgaWYgaXQncyBub3QgYSBuZXcgb25lLgotCQlpZiAoc3RhdGUgIT0gRWxlbWVudERpZmZUcmVlLkRJRkZfU1RBVEVfTkVXKSB7Ci0JCQlMaXN0IGNoaWxkcmVuID0gZGlmZlRyZWUuZ2V0Q2hpbGRyZW4oKTsKLQkJCWlmIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlwcm9jZXNzRGlmZlRyZWUoKEVsZW1lbnREaWZmVHJlZSkgaXQubmV4dCgpLAotCQkJCQkJCXJlcGxhY2VFeGlzdGluZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uIGJ5IHJlcGxhY2luZyB0aGUgbm9uLXBhY2thZ2UgZmVhdHVyZXMsIGFuZAotCSAqIGFkZGluZyB0aGUgbmV3IHBhY2thZ2VzIGludG8gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gb2xkT2JqCi0JICogICAgICAgICAgICBNZXRob2RDb25maWd1cmF0aW9uCi0JICogQHBhcmFtIG5ld09iagotCSAqICAgICAgICAgICAgTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBkb1JlcGxhY2VDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gb2xkT2JqLCBNZXRob2RDb25maWd1cmF0aW9uIG5ld09iaikKLQl7Ci0JCWlmICggaXNSZXBsYWNlZChvbGRPYmopICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXNldFJlcGxhY2VkKG9sZE9iaik7Ci0JCQotCQlMaXN0IGZlYXR1cmVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKG9sZE9iaik7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gb2xkT2JqLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJCS8vIGRvbid0IGRlbGV0ZSBvbGQgZmVhdHVyZSB2YWx1ZXMKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSBuZXdPYmouZUdldChmZWF0dXJlKTsKLQkJCQlzZXRGZWF0dXJlVmFsdWUob2xkT2JqLCBmZWF0dXJlLCBuZXdWYWx1ZSwgZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0vLyBwcml2YXRlIHZvaWQgbWVyZ2VFbGVtZW50TGlzdChMaXN0IHNvdXJjZSwgTGlzdCB0YXJnZXQpCi0vLyB7Ci0vLyBMaXN0IGlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vIGZvciAoIEl0ZXJhdG9yIGl0ID0gdGFyZ2V0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotLy8gewotLy8gTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotLy8gaWRzLmFkZChlLmdldEd1aWQoKSk7Ci0vLyB9Ci0vLwotLy8gZm9yICggSXRlcmF0b3IgaXQgPSBzb3VyY2UuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApCi0vLyB7Ci0vLyBNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0vLyBpZiAoICFpZHMuY29udGFpbnMoZS5nZXRHdWlkKCkpICkKLS8vIHsKLS8vIHRhcmdldC5hZGQoZSk7Ci0vLyB9Ci0vLyB9Ci0vLyB9Ci0KLQkvKioKLQkgKiByZXBsYWNlIHRoZSBwbHVnaW4gZmVhdHVyZXMsIGJ1dCBub3QgdGhlIHBsdWdpbiBvYmplY3QgYW5kIGl0J3MgcGFja2FnZXMKLQkgKiAKLQkgKiBAcGFyYW0gb2xkT2JqCi0JICogICAgICAgICAgICBNZXRob2RQbHVnaW4KLQkgKiBAcGFyYW0gbmV3T2JqCi0JICogICAgICAgICAgICBNZXRob2RQbHVnaW4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZG9SZXBsYWNlUGx1Z2luKE1ldGhvZFBsdWdpbiBvbGRPYmosIE1ldGhvZFBsdWdpbiBuZXdPYmopIHsKLQkJaWYgKCBpc1JlcGxhY2VkKG9sZE9iaikgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0UmVwbGFjZWQob2xkT2JqKTsKLQkJCi0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMob2xkT2JqKTsKLS8vCQlMaXN0IHByb3BlcnRpZXMgPSBvbGRPYmouZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChmZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7Ci0JCQkJaWYgKCBmZWF0dXJlICE9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlcygpICkKLQkJCQl7Ci0JCQkJCU9iamVjdCBuZXdWYWx1ZSA9IG5ld09iai5lR2V0KGZlYXR1cmUpOwotCQkJCQlzZXRGZWF0dXJlVmFsdWUob2xkT2JqLCBmZWF0dXJlLCBuZXdWYWx1ZSwgdHJ1ZSk7Ci0JCQkJfQotCQkJCS8qIE5vLCBkb24ndCBkbyB0aGlzLCBmaXggdGhlIGRpZmYgbWFuYWdlciB0byBpbmNsdWRlIHRoZSByb290IHBhY2thZ2UgaW5zdGVhZAotCQkJCSAqIDE1MDg5NSAtIEltcG9ydCBDb25maWc6IEN1c3RvbUNhdGVnb3J5IGRpZCBub3Qgc3luYyB1cCBieSBpbXBvcnQKLQkJCQllbHNlIHsKLQkJCQkJLy8gY3VzdG9tIGNhdGVnb3JpZXMgcGFja2FnZSBuZWVkcyBzcGVjaWFsIGhhbmRpbmcKLQkJCQkJLy8gd2UgbmVlZCB0byBzdGFydCB3aXRoIHRoZSByb290IGN1c3RvbSBjYXRlZ29yeSBvdGhlcndpc2UKLQkJCQkJLy8gYWxsIGNoaWxkIGNhdGVnb3JpZXMgd2lsbCBiZSBsb3N0Ci0JCQkJCU1ldGhvZFBhY2thZ2Ugb2xkUGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2Uob2xkT2JqLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxUX0NVU1RPTV9DQVRFR09SWV9QQVRIKTsKLS8vIENvbnRlbnRQYWNrYWdlIG5ld1BrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKG5ld09iaiwKLS8vIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuREVGQVVMVF9DVVNUT01fQ0FURUdPUllfUEFUSCk7Ci0JCQkJCXNldFJlcGxhY2VkKG9sZFBrZyk7Ci0JCQkJCQotCQkJCQkvLyBmaW5kIHRoZSByb290IGN1c3RvbSBjYXRlZ29yeSBhbmQgc3RhcnQgZnJvbSB0aGVyZQotCQkJCQlDdXN0b21DYXRlZ29yeSBvbGRDQyA9IFRuZ1V0aWwuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KG9sZE9iaik7Ci0JCQkJCUN1c3RvbUNhdGVnb3J5IG5ld0NDID0gVG5nVXRpbC5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkobmV3T2JqKTsKLQkJCQkJb2xkUGtnID0gKE1ldGhvZFBhY2thZ2Upb2xkQ0MuZUNvbnRhaW5lcigpOwotCQkJCQlzZXRSZXBsYWNlZChvbGRQa2cpOwotCQkJCQlkb1JlcGxhY2VFbGVtZW50KG9sZENDLCBuZXdDQyk7Ci0JCQkJfQotCQkJCSovCi0JCQl9Ci0JCX0KLQotCX0KLQotCi0KLQkvKioKLQkgKiBSZXBsYWNlcyB0aGUgYXRycmlidXRlcyBhbmQgY29udGFpbmVkIGVsZW1lbnRzLCBidXQgbm90IHRoZSBjaGlsZAotCSAqIHBhY2thZ2VzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvUmVwbGFjZVBhY2thZ2UoTWV0aG9kUGFja2FnZSBvbGRPYmosIE1ldGhvZFBhY2thZ2UgbmV3T2JqKSB7Ci0JCWlmICggaXNSZXBsYWNlZChvbGRPYmopICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXNldFJlcGxhY2VkKG9sZE9iaik7Ci0KLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVwbGFjaW5nIHBhY2thZ2UgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG9sZE9iaikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJTGlzdCBmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhvbGRPYmopOwotLy8JCUxpc3QgcHJvcGVydGllcyA9IG9sZE9iai5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJCi0JCWJvb2xlYW4gaXNQcm9jZXNzUGFja2FnZSA9IG9sZE9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlOwotCQkKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkgJiYKLQkJCQkJICFpc1Byb2Nlc3NQYWNrYWdlKQotCQkJCXsJCQkJCQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlPYmplY3QgbmV3VmFsdWUgPSBuZXdPYmouZUdldChmZWF0dXJlKTsKLQkJCQlzZXRGZWF0dXJlVmFsdWUob2xkT2JqLCBmZWF0dXJlLCBuZXdWYWx1ZSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotLy8gcHJpdmF0ZSBNZXRob2RFbGVtZW50IG9iak9sZCA9IG51bGw7Ci0vLyBwcml2YXRlIE1ldGhvZEVsZW1lbnQgb2JqTmV3ID0gbnVsbDsKLS8vIHByaXZhdGUgdm9pZCB0ZXN0SXQoKSB7Ci0vLyBpZiAoIG9iak9sZCAhPSBudWxsICkgewotLy8gU3lzdGVtLm91dC5wcmludGxuKCJPbGQgY29udGFpbmVyID0iICsgb2JqT2xkLmVDb250YWluZXIoKSk7Ci0vLyBTeXN0ZW0ub3V0LnByaW50bG4oIk5ldyBjb250YWluZXIgPSIgKyBvYmpOZXcuZUNvbnRhaW5lcigpKTsKLS8vIGlmICggb2JqT2xkLmVDb250YWluZXIoKSA9PSBudWxsICkgewotLy8gU3lzdGVtLm91dC5wcmludGxuKCJvbGQgaXMgZ29uZSEiKTsKLS8vIH0KLS8vIGlmICggb2JqTmV3LmVDb250YWluZXIoKSA9PSBudWxsICkgewotLy8gU3lzdGVtLm91dC5wcmludGxuKCJuZXcgaXMgZ29uZSEiKTsKLS8vIH0KLS8vIH0KLS8vIH0KLQkKLQkvKioKLQkgKiByZXBsYWNlIHRoZSBlbGVtZW50IGJ5IHJlcGxhY2luZyB0aGUgZmVhdHVyZSB2YWx1ZXMsIGJ1dCBkb24ndCByZXBsYWNlCi0JICogdGhlIG9iamVjdCBpZiBpdCBpcyBtYXJrZWQgYXMgbm90IHJlcGxhY2VhYmxlLiByZWN1cnNpdmUgdGhlIGZlYXR1cmUKLQkgKiB2YWx1ZSBhbmQgcmVwbGFjZSBpdAotCSAqIAotCSAqIEBwYXJhbSBvbGRPYmoKLQkgKiAgICAgICAgICAgIE1ldGhvZFBsdWdpbgotCSAqIEBwYXJhbSBuZXdPYmoKLQkgKiAgICAgICAgICAgIE1ldGhvZFBsdWdpbgotCSAqLwotCXByaXZhdGUgdm9pZCBkb1JlcGxhY2VFbGVtZW50KE1ldGhvZEVsZW1lbnQgb2xkT2JqLCBNZXRob2RFbGVtZW50IG5ld09iaikgewotCQkKLQkJLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSByZXBsYWNlZCBvciBub3QKLQkJaWYgKCBpc1JlcGxhY2VkKG9sZE9iaikgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoIGRpZmZNZ3Iuc2VsZWN0YWJsZShvbGRPYmopICkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCAhaXNTZWxlY3RlZChvbGRPYmopICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBpZiBjb250ZW50IGRlc2NyaXB0aW9uLCBjaGVjayBpZiBpdCdzIGNoYW5nZWQgb3Igbm90Ci0JCWlmICggKG9sZE9iaiBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgJiYgKG5ld09iaiBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgKSB7Ci0JCQlpZiAoIExpYnJhcnlVdGlsLmlzSWRlbnRpY2FsKChDb250ZW50RGVzY3JpcHRpb24pb2xkT2JqLCAoQ29udGVudERlc2NyaXB0aW9uKW5ld09iaikgKSB7Ci0JCQkJaWYgKGRlYnVnICkgewotCQkJCQlSZXNvdXJjZSByZXMgPSBvbGRPYmouZVJlc291cmNlKCk7Ci0JCQkJCWlmICggcmVzICE9IG51bGwgKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIklkZW50aWNhbCBlbGVtZW50IG5vdCByZXBsYWNlZDogIiArIHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSApOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJLy8gZXZlbiB0aG91Z2ggdGhlIGNvbnRlbnQgaXMgdGhlIHNhbWUsIHdlIHN0aWxsIG5lZWQgdG8gY29weSB0aGUgcmVzb3VyY2VzCi0JCQkJc2NhblJlc291cmNlcyhvbGRPYmosIHRydWUpOwotCQkJCXJldHVybjsKLQkJCX0gCi0JCX0KLQkJCi0JCS8vIHNldCByZXBhbGNlZCBmaXJzdCB0byBhdm9pZCBjYWxsaW5nIGludG8gdGhlIHNhbWUgb2JqZWN0IHJlY3Vyc2l2ZWx5Ci0JCXNldFJlcGxhY2VkKG9sZE9iaik7Ci0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXBsYWNpbmcgZWxlbWVudCAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUob2xkT2JqKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlMaXN0IGZlYXR1cmVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKG9sZE9iaik7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gb2xkT2JqLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCi0JCQkJLy8gcGFja2FnZSBzdHJ1Y3R1cmUgaXMgaGFuZGxlZCBieSB0aGUgZGlmZiB0cmVlCi0JCQkJLy8gc28gd2UgZG9uJ3QgcHJvY2VzcyB0aGUgcmVsYXRlZCBmZWF0dXJlCi0JCQkJaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlcygpCi0JCQkJCQl8fCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpIAotCQkJCQkJfHwgZmVhdHVyZS5pc0Rlcml2ZWQoKSApCi0JCQkJewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlPYmplY3QgbmV3VmFsdWUgPSBuZXdPYmouZUdldChmZWF0dXJlKTsKLQkJCQlzZXRGZWF0dXJlVmFsdWUob2xkT2JqLCBmZWF0dXJlLCBuZXdWYWx1ZSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgbmV3IHZhbHVlIGZyb20gdGhlIGltcG9ydGluZyBsaWJyYXJ5IHRvIHRoZSBvbGQgb2JqZWN0IGluIHRoZQotCSAqIGJhc2UgbGlicmFyeS4gaWYgdGhlIHZhbHVlIG9yIG9ubGUgb2YgdmFsdWVzIGFyZSBub3QgcmVwbGFjZWFibGUsIHN1YWNoCi0JICogYXMgTWV0aG9kTGlicmFyeSwgTWV0aG9kUGx1Z2luLCBNZXRob2RQYWNrYWdlLCBldGMsIHRob3NlIHZhbHVlcyBzaG91bGQKLQkgKiBiZSBzdWJzdGl0dWVkIHdpdGggdGhlIG9uZSBpbiB0aGUgb2xkIGxpYnJhcnkKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JCi0KLQlzdGF0aWMgTWV0aG9kRWxlbWVudCBuZXdDb250ID0gbnVsbDsKLQlzdGF0aWMgTWV0aG9kRWxlbWVudCBuZXdFbGVtID0gbnVsbDsKLQlwcml2YXRlIHZvaWQgc2V0RmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSwgYm9vbGVhbiBkb0RlbGV0ZSkKLQl7CQkKLQkJaWYgKCBjYW5JZ25vcmUoZmVhdHVyZSkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWJvb2xlYW4gb2xkTm90aWZ5ID0gZWxlbWVudC5lRGVsaXZlcigpOwotCQl0cnkKLQkJewotCQkJLy8gdHVybiBvZmYgbm90aWZpY2F0aW9ucyB0byBhdm9pZCBwb3NzaWJsZSBkZWFkbG9jayBvciB0aHJlYWQgaXNzdWUKLQkJCWVsZW1lbnQuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJCi0JCQlpZiAoIGNhblJlc2V0KGZlYXR1cmUpICkgewotCQkJCWVsZW1lbnQuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JCQl9Ci0JCQllbHNlIGlmICggZmVhdHVyZS5pc01hbnkoKSAmJiBuZXdWYWx1ZSBpbnN0YW5jZW9mIExpc3QpCi0JCQl7Ci0JCQkJTGlzdCBvbGRWYWx1ZSA9IChMaXN0KWVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJCQlpZiAoZmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJtZXRob2RFbGVtZW50UHJvcGVydHkiKSkgewkJLy8kTk9OLU5MUy0xJAotCQkJCQlzZXRNZXBGZWF0dXJlVmFsdWUoZWxlbWVudCwgZmVhdHVyZSwgb2xkVmFsdWUsIChMaXN0KSBuZXdWYWx1ZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJRWxlbWVudExpc3REaWZmIGRpZmYgPSBuZXcgRWxlbWVudExpc3REaWZmKG9sZFZhbHVlLCAoTGlzdCluZXdWYWx1ZSk7Ci0JCQkJaWYgKCBkb0RlbGV0ZSAmJiBkaWZmLmRlbGV0ZWRJdGVtcy5zaXplKCkgPiAwICkgewotCQkJCQlvbGRWYWx1ZS5yZW1vdmVBbGwoZGlmZi5kZWxldGVkSXRlbXMpOwotCQkJCQlsb2dSZW1vdmVkRWxlbWVudHMoZGlmZi5kZWxldGVkSXRlbXMpOwotCQkJCQlpZiAoIGRlYnVnICkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIERlbGV0aW5nIGZlYXR1cmUgdmFsdWUsIGZlYXR1cmU6ICIgKyBmZWF0dXJlLmdldE5hbWUoKSArICIsICBlbGVtZW50OiAiICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSArICIsIHZhbHVlczogIiArICBkaWZmLmRlbGV0ZWRJdGVtcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICggZGlmZi5uZXdJdGVtcy5zaXplKCkgPiAwICkgewkJCQkJCi0JCQkJCS8vIHNhdmUgdGhlIG5ldyBlbGVtZW50cyBhbmQgZml4IHRoZSByZWZlcmVuY2VzIGxhdGVyCi0JCQkJCS8vIG5vdGU6IHRoZSBuZXdseSBhZGRlZCBmZWF0dXJlIHZhbHVlcyBtaWdodCBub3QgYmUgUkVBTExZCi0JCQkJCS8vIG5ldyBlbGVtZW50IHRvIHRoZSBiYXNlIGxpYnJhcnkKLQkJCQkJLy8gaXQgbWlnaHQgYmUganVzdCBhIG5ld2x5IGFkZGVkIHJlZmVyZW5jZSwgc28gY2hlY2sgYW5kCi0JCQkJCS8vIG1ha2Ugc3VyZQotCQkJCQkvLyBpZiBpdCdzIG9sZCBlbGVtZW50LCBkbyByZXBsYWNlIGFnYWluCi0JCQkJCWZvciAoIEl0ZXJhdG9yIGl0biA9IGRpZmYubmV3SXRlbXMuaXRlcmF0b3IoKTsgaXRuLmhhc05leHQoKTsgKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IG5ld09iaiA9IChNZXRob2RFbGVtZW50KWl0bi5uZXh0KCk7Ci0JCQkJCQkKLQkJCQkJCS8vIG9ubHkgcHJvY2VzcyB0aGUgbmV3IG9iamVjdCBpZiBpdCdzIHNlbGVjdGVkCi0JCQkJCQlpZiAoIGlzU2VsZWN0ZWQobmV3T2JqKSApIHsKLQkJCQkJCQlNZXRob2RFbGVtZW50IG9sZE9iaiA9IGRpZmZNZ3IuZ2V0RXhpc3RpbmdFbGVtZW50KG5ld09iai5nZXRHdWlkKCkpOwotCQkJCQkJCWlmICggb2xkT2JqID09IG51bGwgKSB7Ci0JCQkJCQkJCW9sZFZhbHVlLmFkZChuZXdPYmopOwotCQkJCQkJCQkvL2xvZ05ld0VsZW1lbnQobmV3T2JqKTsKLQkJCQkJCQkJbG9nTmV3RWxlbWVudFVuZGVyRXhpc3RpbmdQbHVnaW4obmV3T2JqKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlvbGRWYWx1ZS5hZGQob2xkT2JqKTsKLQkJCQkJCQkJZG9SZXBsYWNlRWxlbWVudChvbGRPYmosIG5ld09iaik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoIGRlYnVnICkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIEFkZGluZyBmZWF0dXJlIHZhbHVlLCBmZWF0dXJlOiAiICsgZmVhdHVyZS5nZXROYW1lKCkgKyAiLCAgZWxlbWVudDogIiAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCSsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkgKyAiLCB2YWx1ZXM6ICIgKyAgZGlmZi5uZXdJdGVtcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQkKLQkJCQl9Ci0KLQkJCQlpZiAoIGRpZmYub2xkTmV3TWFwLnNpemUoKSA+IDAgKSB7Ci0JCQkJCWZvciAoIEl0ZXJhdG9yIGl0ID0gZGlmZi5vbGROZXdNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJCQkJTWV0aG9kRWxlbWVudCBvbGRPYmogPSAoTWV0aG9kRWxlbWVudCllbnRyeS5nZXRLZXkoKTsKLQkJCQkJCQotCQkJCQkJLy8gb25seSBwcm9jZXNzIHRoZSBuZXcgb2JqZWN0IGlmIGl0J3Mgc2VsZWN0ZWQKLQkJCQkJCWlmICggIWlzU2VsZWN0ZWQob2xkT2JqKSApIHsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJTWV0aG9kRWxlbWVudCBuZXdPYmogPSAoTWV0aG9kRWxlbWVudCllbnRyeS5nZXRWYWx1ZSgpOwotCQkJCQkJaWYgKCBjYW5SZXNldChvbGRPYmopICkgewotCQkJCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICBSZXNldHRpbmcgZmVhdHVyZSB2YWx1ZSwgZmVhdHVyZTogIiArIGZlYXR1cmUuZ2V0TmFtZSgpICsgIiwgIGVsZW1lbnQ6ICIgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCSsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkgKyAiLCB2YWx1ZTogIiArICBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShvbGRPYmopKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQotCQkJCQkJCUVjb3JlVXRpbC5yZXBsYWNlKGVsZW1lbnQsIGZlYXR1cmUsIG9sZE9iaiwgbmV3T2JqKTsKLQkJCQkJCQlsb2dSZXNldEVsZW1lbnQobmV3T2JqKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZG9SZXBsYWNlRWxlbWVudChvbGRPYmosIG5ld09iaik7IAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KQotCQkJewotCQkJCS8vIGlmIHRoZSBvbGQgYW5kIG5ldyBlbGVtZW50IGFyZSB0aGUgc2FtZSwKLQkJCQkvLyBvbmx5IHJlcGxhY2UgdGhlIGZlYXR1cmUgdmFsdWUKLQkJCQlNZXRob2RFbGVtZW50IG8gPSAoTWV0aG9kRWxlbWVudCllbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCQkJTWV0aG9kRWxlbWVudCBuID0gKE1ldGhvZEVsZW1lbnQpbmV3VmFsdWU7Ci0JCQkJCi0JCQkJLy8gb25seSBwcm9jZXNzIHRoZSBuZXcgb2JqZWN0IGlmIGl0J3Mgc2VsZWN0ZWQKLQkJCQlpZiAoIChvID09IG51bGwgfHwgaXNTZWxlY3RlZChvKSkgJiYgaXNTZWxlY3RlZChuKSApIHsKLQotCQkJCQlpZiAoIGRlYnVnICkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIFJlcGxhY2luZ2luZyBmZWF0dXJlIHZhbHVlLCBmZWF0dXJlOiAiICsgZmVhdHVyZS5nZXROYW1lKCkgKyAiLCAgZWxlbWVudDogIiAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCSsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkgKyAiLCB2YWx1ZTogIiArICBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShvKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQotCQkJCQlpZiAoIG5ld1ZhbHVlIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uICkgewotCQkJCQkJLy8gYWx3YXlzIHJlcGxhY2UgY29udGVudCBkZXNjcmlwdGlvbiAobm90IHJlc2V0KSB0bwotCQkJCQkJLy8gcmVzZXJ2ZSB0aGUgZXhpc3RpbmcgcmVzb3VyY2UgKHhtaSBmaWxlKQotCQkJCQkJLy8gc2luY2UgdGhlIGNvbnRlbnREZXNjcmlwdGlvbiBpcyB1bmlxdWUgdGhlIGEgbWV0aG9kCi0JCQkJCQkvLyBlbGVtZW50LCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNvbXBhcmUgdGhlIGd1aWQKLQkJCQkJCQkJCQkJCQotCQkJCQkJLy8gaWYgYm90aCBvYmplY3QgaGFzIG5vIGNvbnRhaW5lciwgdGhlcmUgaXMgbm8gc3VjaAotCQkJCQkJLy8gZGVzY3JpcHRpb24sIGlnbm9yZSBpdAotCQkJCQkJaWYgKCBvLmVDb250YWluZXIoKSAhPSBudWxsIHx8IG4uZUNvbnRhaW5lcigpICE9IG51bGwgKSB7Ci0JCQkJCQkJaWYgKCBvLmVDb250YWluZXIoKSA9PSBudWxsICkgewotCQkJCQkJCQllbGVtZW50LmVTZXQoZmVhdHVyZSwgbyk7Ci0JCQkJCQkJfQotCQkJCQkJCWRvUmVwbGFjZUVsZW1lbnQobywgbik7CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gaWYgdGhlIGVsZW1lbnQgY2FuIGJlIHJlcGxhY2VkLCBzdWNoIGFzIGZvcgotCQkJCQkvLyBDb250ZW50RGVzY3JpcHRpb24gZWxlbWVudAotCQkJCQkvLyBzZXQgdGhlIHZhbHVlIGRpcmVjdGx5Ci0JCQkJCWVsc2UgaWYgKCBjYW5SZXNldChuKSApIHsKLQkJCQkJCWVsZW1lbnQuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JCQkJCQkvL2xvZ05ld0VsZW1lbnQobik7Ci0JCQkJCQlsb2dOZXdFbGVtZW50VW5kZXJFeGlzdGluZ1BsdWdpbihuKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCWlmICggbyAhPSBudWxsICYmIG4gIT0gbnVsbCAmJiBvLmdldEd1aWQoKS5lcXVhbHMobi5nZXRHdWlkKCkpICkgewotCQkJCQkJCSBkb1JlcGxhY2VFbGVtZW50KG8sIG4pOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7CQkJCQkJCQkJCQkJCQotCQkJCQkJCXJlZ2lzdGVyU2V0RWxlbWVudChlbGVtZW50LCBmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JCQkJCQkJCi0JCQkJCQkJZWxlbWVudC5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLQkJCQkJCQkvL2xvZ05ld0VsZW1lbnQobik7Ci0JCQkJCQkJbG9nTmV3RWxlbWVudFVuZGVyRXhpc3RpbmdQbHVnaW4obik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpICkgewotCQkJCS8vIGNoZWNrIGRpZmZlcmVuY2UgbmFtZSwgaWYgcmVwbGFjZSwgbmVlZCB0byByZW5hbWUgcmVzb3VyY2VzIGlmIGlmIGhhcyBpdCdzIG93biByZXNvdXJjZQotCQkJCS8vIGxpa2UgY29udGVudCBlbGVtZW50cywgcGx1Z2lucywgY29uZmlndWlyYXRpb25zLCBhbmQgcHJvY2VzcyBjb21wb25lbnRzCQkJCQkKLQkJCQlpZiAoISAobmV3VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKSB7Ci0JCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkTmFtZSA9IChTdHJpbmcpZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZE5hbWUpKSB7CQkJCQkKLQkJCQkJZW5zdXJlVW5pcXVlTmFtZUZvckV4aXN0aW5nRWxlbWVudChlbGVtZW50LCBvbGROYW1lLCAoU3RyaW5nKSBuZXdWYWx1ZSwgcmVuYW1lRWxlbWVudE1hcCk7CQkJCQkJCQkJCQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZWxlbWVudC5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLQkJCQkKLQkJCQkvLyBzY2FuIGFuZCBjb3B5IHRoZSByZXNvdXJjZXMKLQkJCQlzY2FuUmVzb3VyY2VzKGVsZW1lbnQsIGZlYXR1cmUsIG5ld1ZhbHVlKTsKLQkJCX0KLQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWZpbmFsbHkKLQkJewotCQkJZWxlbWVudC5lU2V0RGVsaXZlcihvbGROb3RpZnkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE1lcEZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBMaXN0IG9sZFZhbHVlLCBMaXN0IG5ld1ZhbHVlKSB7Ci0JCWludCBzeiA9IG5ld1ZhbHVlLnNpemUoKTsKLQkJaWYgKG9sZFZhbHVlLnNpemUoKSA9PSBzeikgewotCQkJaWYgKHN6ID09IDApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlib29sZWFuIHNhbWUgPSB0cnVlOwotCQkJZm9yIChpbnQgaT0wOyBpIDwgc3o7IGkrKykgewotCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBvbGRNZXAgPSAoTWV0aG9kRWxlbWVudFByb3BlcnR5KSBvbGRWYWx1ZS5nZXQoaSk7Ci0JCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IG5ld01lcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpIG5ld1ZhbHVlLmdldChpKTsKLQkJCQlpZiAoISBvbGRNZXAuZ2V0TmFtZSgpLmVxdWFscyhuZXdNZXAuZ2V0TmFtZSgpKSB8fAotCQkJCQkhIG9sZE1lcC5nZXRWYWx1ZSgpLmVxdWFscyhuZXdNZXAuZ2V0VmFsdWUoKSkpIHsKLQkJCQkJc2FtZSA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoc2FtZSkgewotCQkJCXJldHVybjsKLQkJCX0JCQkJCQotCQl9Ci0JCW9sZFZhbHVlLnJlbW92ZUFsbChvbGRWYWx1ZSk7Ci0JCW9sZFZhbHVlLmFkZEFsbChuZXdWYWx1ZSk7CQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2NhblJlc291cmNlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gcmVjdXJzaXZlKSB7Ci0KLQkJaWYgKCBlbGVtZW50ID09IG51bGwgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoZWxlbWVudCk7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCQlpZiAoICEoZmVhdHVyZSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpICkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCQkJc2NhblJlc291cmNlcyhlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmICggIXJlY3Vyc2l2ZSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnQuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KWl0Lm5leHQoKTsKLQkJCQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIAotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlIAotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCWlmICggb2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApIHsKLQkJCQlzY2FuUmVzb3VyY2VzKChNZXRob2RFbGVtZW50KW9iaiwgZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzY2FuUmVzb3VyY2VzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlkaWFncmFtSGFuZGxlci5yZWdpc3RlckVsZW1lbnQoZWxlbWVudCk7Ci0JCQotCQkvLyBzY2FuIHRoZSByZXNvdXJjZXMKLQkJaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKSApIHsKLQkJCS8vIHByb2Nlc3MgdGhlIGF0dGFjaG1lbnRzCi0JCQlTdHJpbmcgdXJscyA9IChTdHJpbmcpbmV3VmFsdWU7Ci0JCQlpZiAoICh1cmxzICE9IG51bGwpICYmIHVybHMubGVuZ3RoKCkgIT0gMCApIHsKLQkJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHVybHMsICJ8Iik7IC8vIHRoaXMgaXMgaGFyZGNvZGVkIHNvbWVob3cgLy8kTk9OLU5MUy0xJAotCQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkgKSB7Ci0JCQkJCVN0cmluZyB1cmwgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQkJcmVzU2Nhbm5lci5jb3B5UmVzb3VyY2UgKGVsZW1lbnQsIHVybCk7Ci0JCQkJfQkJCQkJCQotCQkJfQotCQl9IGVsc2UgaWYgKCBuZXdWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZyApIHsKLQkJCXJlc1NjYW5uZXIuc2NhbihlbGVtZW50LCBuZXdWYWx1ZS50b1N0cmluZygpKTsKLQkJfSBlbHNlIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIFVSSSApIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkJCXJlc1NjYW5uZXIuY29weVJlc291cmNlICggKChVUkkpbmV3VmFsdWUpLmdldFBhdGgoKSwgcGx1Z2luKTsKLQkJfQotCi0JfQotCQotCXByaXZhdGUgdm9pZCBkb0FkZChFT2JqZWN0IG93bmVyLCBNZXRob2RFbGVtZW50IG5ld09iaikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyBlbGVtZW50ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZSgoTWV0aG9kRWxlbWVudCluZXdPYmopKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gdGhlIG93bmVyIGNhbiBvbmx5IGJlIGxpYnJhcnkgYW5kIHBhY2thZ2UKLQkJaWYgKG93bmVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJZW5zdXJlVW5pcXVlTmFtZShvd25lciwgbmV3T2JqLCByZW5hbWVFbGVtZW50TWFwKTsKLQkJCi0JCWJvb2xlYW4gZXJyb3IgPSBmYWxzZTsKLQkJCi0JCWlmIChvd25lciBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsJCQkKLQkJCS8vIGNhbiBiZSBjb25maWd1cmF0aW9uIG9yIHBsdWdpbgotCQkJaWYgKG5ld09iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKW5ld09iajsJCQkJCi0JCQkJCi0JCQkJY2hlY2tNb2RpZmllZEZpbGVzKCk7CQkJCQotCQkJCWVycm9yID0gISBmaWxlQ2hlY2tlZE91dFN0YXR1cy5pc09LKCk7CQkJCQotCQkJCQkJCQkKLQkJCQkvLyBkb24ndCBpbnRpdGlhbGl6ZSB0aGUgc3RvcmFnZSBzaW5jZSB0aGlzIHdpbGwgcmVjcmVhdGUgdGhlIGdsb2JhbCBwYWNrYWdlcwotCQkJCS8vIGFuZCBzdWNoIGNhdXNpbmcgdHdvIHNldCBvZiBnbG9iYWwgcGFja2FnZXMKLQkJCQkvLyAxNDU4NTAgLSBJbXBvcnQgQ29uZmlndXJhdGlvbjogQ1AvRFBzIGRpZCBub3Qgc2hvd24gaW4gYXV0aGVyaW5nCi0JCQkJLy8gTW9kZWxTdG9yYWdlLmluaXRpYWxpemUocGx1Z2luKTsKLQkJCQkvLyBOTywgc2luY2UgdGhlIGdsb2JhbCBwYWNrYWdlcyBhcmUgYWxyZWFkeSBjcmVhdGVkCi0JCQkJaWYgKCFlcnJvcikgewotCQkJCQkoKE1ldGhvZExpYnJhcnkpb3duZXIpLmdldE1ldGhvZFBsdWdpbnMoKS5hZGQocGx1Z2luKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCU11bHRpRmlsZVhNSUhlbHBlckltcGwudW5tb2RpZmllZEdldFZhbHVlID0gdHJ1ZTsKLQkJCQkJCUxpYnJhcnlVdGlsLnNhdmVMaWJyYXJ5KChNZXRob2RMaWJyYXJ5KW93bmVyLCBmYWxzZSwgZmFsc2UpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJTXVsdGlGaWxlWE1JSGVscGVySW1wbC51bm1vZGlmaWVkR2V0VmFsdWUgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkJCQkJCi0JCQl9IGVsc2UgaWYgKG5ld09iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24gKSB7Ci0JCQkJY2hlY2tNb2RpZmllZEZpbGVzKCk7CQkJCQotCQkJCWVycm9yID0gY29uZmlnRm9sZGVyRXJyb3IgfHwgISBmaWxlQ2hlY2tlZE91dFN0YXR1cy5pc09LKCk7Ci0JCQkJaWYgKCFlcnJvcikgewotCQkJCQlNZXRob2RMaWJyYXJ5IGxpYiA9IChNZXRob2RMaWJyYXJ5KW93bmVyOwotCQkJCQlsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkuYWRkKChNZXRob2RDb25maWd1cmF0aW9uKW5ld09iaik7Ci0JCQkJCUlMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9ICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBsaWIuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSkuZ2V0UGVyc2lzdGVyKCk7Ci0JCQkJCWlmIChwZXJzaXN0ZXIgaW5zdGFuY2VvZiBJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcikgewotCQkJCQkJSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgaXAgPSAoSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpIHBlcnNpc3RlcjsKLQkJCQkJCUZpbGUgY29uZmlnRm9sZGVyID0gaXAuZ2V0RGVmYXVsdE1ldGhvZENvbmZpZ3VyYXRpb25Gb2xkZXIobGliKTsKLQkJCQkJCWlmIChjb25maWdGb2xkZXIgIT0gbnVsbCkgewotCQkJCQkJCWlwLnNldERlZmF1bHRNZXRob2RDb25maWd1cmF0aW9uRm9sZGVyKGxpYiwgY29uZmlnRm9sZGVyKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZXJyb3IgPSB0cnVlOwotCQkJCQkJCWNvbmZpZ0ZvbGRlckVycm9yID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoISBlcnJvcikgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlNdWx0aUZpbGVYTUlIZWxwZXJJbXBsLnVubW9kaWZpZWRHZXRWYWx1ZSA9IHRydWU7Ci0JCQkJCQkJTGlicmFyeVV0aWwuc2F2ZUxpYnJhcnkoKE1ldGhvZExpYnJhcnkpb3duZXIsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCU11bHRpRmlsZVhNSUhlbHBlckltcGwudW5tb2RpZmllZEdldFZhbHVlID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWVycm9yID0gdHJ1ZTsJCQkKLQkJCX0KLQkJfSBlbHNlIGlmICggKG93bmVyIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgCi0JCQkJJiYgKG93bmVyLmVDb250YWluZXIoKSAhPSBudWxsKSAKLQkJCQkmJiAobmV3T2JqIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgKSB7Ci0JCQkoKE1ldGhvZFBhY2thZ2Upb3duZXIpLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKE1ldGhvZFBhY2thZ2UpbmV3T2JqKTsKLQkJfSBlbHNlIHsKLQkJCWVycm9yID0gdHJ1ZTsKLQkJfQotCQkJCi0JCWlmICggZXJyb3IgKSB7Ci0JCQlTdHJpbmcgb3duZXJTdHIgPSBvd25lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgPyAKLQkJCQkJTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoKE1ldGhvZEVsZW1lbnQpb3duZXIpIDogb3duZXIudG9TdHJpbmcoKTsKLQkJCQkJCi0JCQlTdHJpbmcgbXNnID0gImNhbid0IGFkZCAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUobmV3T2JqKSAvLyROT04tTkxTLTEkCi0JCQkrICIgdG8gIiArIG93bmVyU3RyOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IobXNnKTsgCi0JCQlpZiAoIGRlYnVnICkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJfQotCQl9IGVsc2UgewotCQkJbG9nTmV3RWxlbWVudChuZXdPYmopOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrTW9kaWZpZWRDb25maWdzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJTGlzdCBjb25maWdMaXN0ID0gTGlicmFyeVV0aWwuZ2V0QXNzb2NpYXRlZENvbmZpZ3VyYXRpb25zKHBsdWdpbik7Ci0JCUxpc3QgYmFzZUNvbmZpZ3MgPSBiYXNlTGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJTWFwIGJhc2VDb25maWdNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpPTA7IGk8YmFzZUNvbmZpZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGJhc2VDb25maWdzLmdldChpKTsKLQkJCWJhc2VDb25maWdNYXAucHV0KGNvbmZpZy5nZXRHdWlkKCksIGNvbmZpZyk7Ci0JCX0KLQkJZmluYWwgTGlzdCBtb2RpZmllZEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpPTA7IGk8Y29uZmlnTGlzdC5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgY29uZmlnTGlzdC5nZXQoaSk7Ci0JCQljb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgYmFzZUNvbmZpZ01hcC5nZXQoY29uZmlnLmdldEd1aWQoKSk7Ci0JCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCQlSZXNvdXJjZSByZXMgPSBjb25maWcuZVJlc291cmNlKCk7Ci0JCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJCW1vZGlmaWVkRmlsZXMuYWRkKHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IEZpbGVNb2RpZnlDaGVja2VyLmNoZWNrTW9kaWZ5KG1vZGlmaWVkRmlsZXMpOwotCQkJfQotCQl9KTsKLQkJZmlsZUNoZWNrT3V0RXJyb3IoKTsKLQkJCi0JCXJldHVybiBmaWxlQ2hlY2tlZE91dFN0YXR1cy5pc09LKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvSW50ZWdyaXR5Q2hlY2soKQotCXsJCQotCQkvLyBub3cgdGhlIG5ld2x5IGFkZGVkIGVsZW1lbnRzIG1heSBoYXZlIGZlYXR1cmUgdmFsdWUgZWxlbWVudCB0aGF0Ci0JCS8vIHN0aWxsIHBvaW50aW5nIHRvIHRoZSBpbXBvcnRpbmcgbGlicmFyeQotCQkvLyB3ZSBuZWVkIHRvIHJlcGxhY2UgdGhvc2Ugd2l0aCB0aGUgb25lIGluIHRoZSBiYXNlIGxpYnJhcnkKLQkJd2hpbGUgKG5ld0VsZW1lbnRzLnNpemUoKSA+IDApIHsKLQkJCU1ldGhvZEVsZW1lbnQgbmV3T2JqID0gKE1ldGhvZEVsZW1lbnQpbmV3RWxlbWVudHMucmVtb3ZlKDApOwotCQkJdHJ5IHsKLQkJCQlpZiAoIG5ld09iaiBpbnN0YW5jZW9mIERpYWdyYW1FbGVtZW50ICkgewotCQkJCQlmaXhEaWFncmFtKChEaWFncmFtRWxlbWVudCluZXdPYmopOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZpeE5ld0VsZW1lbnRSZWZlcmVuY2VzKG5ld09iaik7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gd2hpbGUgZml4aW5nIG5ldyBlbGVtZW50ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShuZXdPYmopKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCQotCQkvLyB0aGUgY29uZmlndXJhdGlvbnMgbmVlZHMgdG8gYmUgZml4ZWQKLQkJTGlzdCBjb25maWdzID0gYmFzZUxpYnJhcnkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gY29uZmlncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLQkJewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbilpdC5uZXh0KCk7Ci0JCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24obnVsbCwgY29uZmlnKTsKLQkJfQotCX0KLQotCXByaXZhdGUgTGlzdCBwcm9jZXNzZWROZXdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkKLQkKLQkvKioKLQkgKiBpdGVyYXRlIGFsbCBmZWF0dXJlcywgaWYgdGhlIGZlYXR1cmUgdmFsdWUgcmVmZXJlbmNlcyBhbiBlbGVtZW50IHdoaWNoIGlzCi0JICogYW4gb2xkIGVsZW1lbnQsIHJlcGxhY2UgaXQgd2l0aCB0aGUgb2xkIGVsZW1lbnQuIGlmIHRoZSBlbGVtZW50IGlzIG5ldywKLQkgKiBpdGVyYXRlIGl0J3MgY29udGFpbm1lbnQgZWxlbWVudHMKLQkgKiAKLQkgKiBAcGFyYW0gbmV3T2JqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpeE5ld0VsZW1lbnRSZWZlcmVuY2VzKE1ldGhvZEVsZW1lbnQgbmV3T2JqKSB7Ci0JCWlmICggcHJvY2Vzc2VkTmV3RWxlbWVudHMuY29udGFpbnMobmV3T2JqKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJcHJvY2Vzc2VkTmV3RWxlbWVudHMuYWRkKG5ld09iaik7Ci0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaXhpbmcgZWxlbWVudCAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUobmV3T2JqKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJTGlzdCBmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhuZXdPYmopOwotLy8JCUxpc3QgcHJvcGVydGllcyA9IG5ld09iai5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCQlPYmplY3QgdmFsdWUgPSBuZXdPYmouZUdldChmZWF0dXJlKTsKLQotCQkJCWlmICggdmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJCQotCQkJCQkvLyBmaXhpbmcgdGhlIGZlYXR1cmUgdmFsdWUgbWF5IGNhdXNlIHRoZSBsaXN0IHRvIGNoYW5nZQotCQkJCQkvLyBpdGVyYXRlIG9uIGEgbmV3IGNvcHkgdG8gYXZvaWQKLQkJCQkJLy8gQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0PSBuZXcgQXJyYXlMaXN0KCgoTGlzdCl2YWx1ZSkpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCQkJCWZpeE5ld0VsZW1lbnRGZWF0dXJlVmFsdWUobmV3T2JqLCBmZWF0dXJlLCBvKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWZpeE5ld0VsZW1lbnRGZWF0dXJlVmFsdWUobmV3T2JqLCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9CQotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgZml4RGlhZ3JhbShEaWFncmFtRWxlbWVudCBuZXdPYmopIHsJCQotCi0JCWlmICggcHJvY2Vzc2VkTmV3RWxlbWVudHMuY29udGFpbnMobmV3T2JqKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJcHJvY2Vzc2VkTmV3RWxlbWVudHMuYWRkKG5ld09iaik7Ci0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaXhpbmcgZGlhZ3JhbSBlbGVtZW50ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShuZXdPYmopKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlMaXN0IGZlYXR1cmVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKG5ld09iaik7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gbmV3T2JqLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJCU9iamVjdCB2YWx1ZSA9IG5ld09iai5lR2V0KGZlYXR1cmUpOwotCi0JCQkJaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJCi0JCQkJCS8vIGZpeGluZyB0aGUgZmVhdHVyZSB2YWx1ZSBtYXkgY2F1c2UgdGhlIGxpc3QgdG8gY2hhbmdlCi0JCQkJCS8vIGl0ZXJhdGUgb24gYSBuZXcgY29weSB0byBhdm9pZAotCQkJCQkvLyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uCi0JCQkJCWZvciAoSXRlcmF0b3IgaXQ9IG5ldyBBcnJheUxpc3QoKChMaXN0KXZhbHVlKSkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJCQkJaWYgKCBvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApIHsKLQkJCQkJCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCkgKSB7Ci0JCQkJCQkJCWZpeE5ld0VsZW1lbnRGZWF0dXJlVmFsdWUobmV3T2JqLCBmZWF0dXJlLCBvKTsKLQkJCQkJCQl9IGVsc2UgaWYgKCAobyBpbnN0YW5jZW9mIERpYWdyYW1FbGVtZW50KSApIHsKLQkJCQkJCQkJZml4RGlhZ3JhbSgoRGlhZ3JhbUVsZW1lbnQpbyk7Ci0JCQkJCQkJfSAKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoIHZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApIHsKLQkJCQkJaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFVNQVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpICkgewotCQkJCQkJZml4TmV3RWxlbWVudEZlYXR1cmVWYWx1ZShuZXdPYmosIGZlYXR1cmUsIHZhbHVlKTsKLQkJCQkJfSBlbHNlIGlmICggKHZhbHVlIGluc3RhbmNlb2YgRGlhZ3JhbUVsZW1lbnQpICkgewotCQkJCQkJZml4RGlhZ3JhbSgoRGlhZ3JhbUVsZW1lbnQpdmFsdWUpOwotCQkJCQl9IAotCQkJCX0KLQkJCX0KLQkJfQkKLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIHZhbHVlIGlzIGFuIG9sZCBlbGVtZW50IGluIHRoZSBiYXNlLCBpZiB5ZXMsIHJlcGxhY2UgaXQgd2l0aAotCSAqIHRoZSBvbGQgb25lIGlmIGl0J3MgbmV3LCBpdGVyYXRlIGl0J3MgZmVhdHVyZSB2YWx1ZQotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIG9iagotCSAqLwotCXByaXZhdGUgdm9pZCBmaXhOZXdFbGVtZW50RmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBvYmopIHsKLQkJaWYgKCAhKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJmaXhpbmcgZWxlbWVudCBmZWF0dXJlIHZhbHVlICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSArICIsIGZlYXR1cmU9IiArIGZlYXR1cmUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlib29sZWFuIG9sZE5vdGlmeSA9IGVsZW1lbnQuZURlbGl2ZXIoKTsKLQkJdHJ5Ci0JCXsKLQkJCWVsZW1lbnQuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJCi0JCQlNZXRob2RFbGVtZW50IG5ld09iaiA9IChNZXRob2RFbGVtZW50KW9iajsKLQkJCU1ldGhvZEVsZW1lbnQgb2xkT2JqID0gZ2V0UmVwbGFjZWQobmV3T2JqLmdldEd1aWQoKSk7Ci0JCQlpZiAoIG9sZE9iaiA9PSBudWxsICkgewotCQkJCS8vIGdldCBleGlzdGluZyBlbGVtZW50LCBmb3IgZXhhbXBsZSwgdGhlIGdsb2JhbCBwYWNrYWdlcyBpbiB0aGUKLQkJCQkvLyBjb25maWd1cmF0aW9uIGZlYXR1cmUKLQkJCQlvbGRPYmogPSBkaWZmTWdyLmdldEV4aXN0aW5nRWxlbWVudChuZXdPYmouZ2V0R3VpZCgpKTsKLQkJCX0KLQkJCQotCQkJaWYgKCBvbGRPYmogPT0gbnVsbCApIHsKLQkJCQkvLyBpdCdzIGEgbmV3IG9uZQotCQkJCWZpeE5ld0VsZW1lbnRSZWZlcmVuY2VzKG5ld09iaik7Ci0JCQl9IGVsc2UgewotCQkJCQotCQkJCXRyeSB7Ci0JCQkJCS8vIHJlcGxhY2UgdGhlIG5ld09iaiB3aXRoIHRoZSBvbGRPYmoKLQkJCQkJRWNvcmVVdGlsLnJlcGxhY2UoZWxlbWVudCwgZmVhdHVyZSwgbmV3T2JqLCBvbGRPYmopOyAKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkvLyBpZiByZXBsYWNlIGZhaWxlZCwgcmVtb3ZlIHRoZSBmZWF0dXJlCi0JCQkJCUVjb3JlVXRpbC5yZW1vdmUoZWxlbWVudCwgZmVhdHVyZSwgbmV3T2JqKTsgCi0JCQkJCWlmIChkZWJ1ZyApIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVwbGFjZWluZyBmZWF0dXJlIHZhbHVlIGZhaWxlZCBmb3IgZWxlbWVudCBbIiAgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkrIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICsgIl0sIGZlYXR1cmUgWyIgIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJKyBmZWF0dXJlLmdldE5hbWUoKSArICJdLCB2YWx1ZT0iICAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgbmV3T2JqICsgIi4gVGhlIGZlYXR1cmUgdmFsdWUgaXMgcmVtb3ZlZC4gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQotCQkJCQl9Ci0JCQkJfQotCQkJfQkKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlmaW5hbGx5Ci0JCXsKLQkJCWVsZW1lbnQuZVNldERlbGl2ZXIob2xkTm90aWZ5KTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY2FuUmVzZXQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWJvb2xlYW4gcmVzZXQgPSBmYWxzZTsKLQkJCi0JCS8vIGFuIGVsZW1lbnQgY2FuIGJlIHJlc2V0IGlmIHlvdSBhcmUgc3VyZSB0aGF0IG5vIG90aGVyIGVsZW1lbnQocykKLQkJLy8gcmVmZXJlbmNlIHRvIGl0Ci0JCS8vIHJlc2V0IGVsZW1lbnRzIG1heSBoYXZlIHJlZmVyZW5jZXMgdG8gb3RoZXIgZWxlbWVudHMgaW4gdGhlIGltcG9ydGluZwotCQkvLyBsaWJyYXJ5LCB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkIGxhdGVyCi0JCQotCQkvLyBmb3IgYW55dGhpbmcgY29udGFpbmVkIGJ5IENvbnRlbnREZXNjcmlwdGlvbiwgcmVzZXQgaXQKLQkJaWYgKCBlID09IG51bGwgLyogfHwgZS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gKi8KLQkJCQl8fCBlIGluc3RhbmNlb2YgRGlhZ3JhbUVsZW1lbnQpIHsKLQkJCXJlc2V0ID0gdHJ1ZTsKLQkJfQotCQkJCQotCQlyZXR1cm4gcmVzZXQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNhblJlc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCS8vIGZvciBhbnl0aGluZyBjb250YWluZWQgYnkgQ29udGVudERlc2NyaXB0aW9uLCByZXNldCBpdAotCQkvLyBubyBkb24ndCByZXNldCB0aGUgc2VjdGlvbnMgc2luY2UgaXQgd2lsbCBjYXVzZSB0aGUgb25lIGluIHRoZQotCQkvLyBpbXBvcnRpbmcgbGlicmFyeSByZW1vdmVkCi0JCS8vIHdoaWNoIGNhdXNlZCBwcm9ibGVtIGZvciBUYXNrRGVzY3JpcHRpb24gd2hlcmUgdGhlIHNhbWUgZmVhdHVyZQotCQkvLyAoU3RlcHMpIGNhbid0IGZpbmQgdGhlIHN0ZXBzIGZyb20gdGhlIGltcG9ydGluZyBsaWJyYXJ5Ci0JCS8vIHdoaWNoIHRoZW4gd2lsbCB0cmVhdCB0aGUgc3RlcHMgaW4gdGhlIGJhc2UgbGlicmFyeSBiZWluZyBkZXRldGVkCi0vLyBpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCkpIHsKLS8vIHJldHVybiB0cnVlOwotLy8gfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNhbklnbm9yZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQkvLyBkb24ndCByZXNldCB0aGUgcGx1Z2luIGxvY2sgc3RhdHVzCi0JCWlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvLyAxNDYxNDQgLSBJbXBvcnQgQ29uZmlndXJhdGlvbjogc29tZSB1bmNoYW5nZSBlbGVtZW50cyBkaXNhcHBlYXIgaW4gYXV0aG9yaW5nIGFmdGVyIGltcG9ydAotCQkvLyB0aGlzIGlzIGNhdXNlZCBieSBhIGJ1ZyBpbiBBcnRpZmFjdEltcGwsIHdoZW4gc2V0Q29udGFpbmVyQXJ0aWZhY3QgdG8gbnVsbCwgCi0JCS8vICBpdCBzZXQgdGhlIGVDb250YWluZXIgdG8gbnVsbCwgaWYgdGhlIGVDb250YWluZXIgaXMgYSBjb250ZW50IHBhY2thZ2UsIAotCQkvLyB0aGUgYXJ0aWZhY3QgaXMgcmVtb3ZlZCBmcm9tIHRoZSBwYWNrYWdlCi0JCS8vICB0aGlzIGJ1ZyB3aWxsIGJlIGZpeGVkIGluIE00LiAKLQkJLy8gZm9yIG5vdywgaWdub3JlIHRoaXMgZmVhdHVyZSBzaW5jZSB0aGlzIGlzIGFuIG9wcG9zaXRlIGZlYXR1cmUsIHdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIGl0CQotCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVyQXJ0aWZhY3QoKSApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVwbGFjZWQoTWV0aG9kRWxlbWVudCBvbGRPYmopIHsKLQkJcmV0dXJuIHJlcGxhY2VkRWxlbWVudE1hcC5jb250YWluc0tleShvbGRPYmouZ2V0R3VpZCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UmVwbGFjZWQoTWV0aG9kRWxlbWVudCBvbGRPYmopIHsKLQkJU3RyaW5nIGd1aWQgPSBvbGRPYmouZ2V0R3VpZCgpOwotCQlpZiAoICFyZXBsYWNlZEVsZW1lbnRNYXAuY29udGFpbnNLZXkoZ3VpZCkgKSB7Ci0JCQlyZXBsYWNlZEVsZW1lbnRNYXAucHV0KGd1aWQsIG9sZE9iaik7Ci0JCQlzZXRNb2RpZmllZChvbGRPYmopOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgb2xkIGVsZW1lbnQgYmVlbiByZXBsYWNlZAotCSAqIAotCSAqIEBwYXJhbSBvbGRPYmoKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGdldFJlcGxhY2VkKFN0cmluZyBndWlkKSB7Ci0JCXJldHVybiAoTWV0aG9kRWxlbWVudClyZXBsYWNlZEVsZW1lbnRNYXAuZ2V0KGd1aWQpOwotCX0KLQkKLQkvKioKLQkgKiB3aGVuIG5ldyBlbGVtZW50cyBhcmUgYWRkZWQgaW50byB0aGUgbGlicmFyeSwgdGhlIGFzc29jaWF0ZWQgcmVzb3VyY2UKLQkgKiBmaWxlcyBtdXN0IGJlIGNvcGllZCBvdmVyIGFzIHdlbGwKLQkgKiAKLQkgKiBAcGFyYW0gbmV3T2JqCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNvcHlOZXdFbGVtZW50UmVzb3VyY2VzKE1ldGhvZEVsZW1lbnQgbmV3T2JqKSB7Ci0JCQotLy8JCUxpc3QgcHJvcGVydGllcyA9IG5ld09iai5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLS8vCQlpZiAocHJvcGVydGllcyAhPSBudWxsKSB7Ci0vLwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5zaXplKCk7IGkrKykgewotLy8JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBwcm9wZXJ0aWVzLmdldChpKTsKLS8vCQkJCU9iamVjdCB2YWx1ZSA9IG5ld09iai5lR2V0KGZlYXR1cmUpOwotLy8JCQkJaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIFVSSSApIHsKLS8vCQkJCQlyZXNTY2FubmVyLmNvcHlSZXNvdXJjZSgoKFVSSSl2YWx1ZSkuZ2V0UGF0aCgpKTsKLS8vCQkJCX0gZWxzZSBpZiAoIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nICkgewotLy8JCQkJCXJlc1NjYW5uZXIuc2NhbihuZXdPYmosIChTdHJpbmcpdmFsdWUpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8JCQotLy8JCWZvciAoIEl0ZXJhdG9yIGl0ID0gbmV3T2JqLmVDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0vLwkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotLy8JCQlpZiAoIG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICkgewotLy8JCQkJY29weU5ld0VsZW1lbnRSZXNvdXJjZXMoKE1ldGhvZEVsZW1lbnQpbyk7Ci0vLwkJCX0KLS8vCQl9Ci0JCQotCQlzY2FuUmVzb3VyY2VzKG5ld09iaiwgdHJ1ZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2dOZXdFbGVtZW50KE1ldGhvZEVsZW1lbnQgbmV3T2JqKSB7Ci0JCQotCQkvLyBtYWtlIHN1cmUgdGhlIGVsZW1lbnQgaXMgbm90IGluIHRoZSBvcmlnaW5hbCBsaWJyYXJ5Ci0JCS8vIHNpbmNlIHdlIGhhdmUgdGhlIGd1aWQtZWxlbWVudCBtYXAgYnVpbGQgdXAgaW4gdGhlIGRpZmYgbWFuYWdlciwKLQkJLy8gY2hlY2sgdGhlcmUKLQkJaWYgKCAhbmV3RWxlbWVudHMuY29udGFpbnMobmV3T2JqKSAmJiBkaWZmTWdyLmdldEV4aXN0aW5nRWxlbWVudChuZXdPYmouZ2V0R3VpZCgpKSA9PSBudWxsKSB7Ci0JCQluZXdFbGVtZW50cy5hZGQobmV3T2JqKTsKLQkJCWNvcHlOZXdFbGVtZW50UmVzb3VyY2VzKG5ld09iaik7Ci0JCQlzZXRNb2RpZmllZChuZXdPYmopOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2dSZXNldEVsZW1lbnQoTWV0aG9kRWxlbWVudCBuZXdPYmopIHsKLQkJaWYgKCAhbmV3RWxlbWVudHMuY29udGFpbnMobmV3T2JqKSApIHsKLQkJCW5ld0VsZW1lbnRzLmFkZChuZXdPYmopOwotCQkJc2V0TW9kaWZpZWQobmV3T2JqKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsb2dOZXdSZXNvdXJjZShSZXNvdXJjZSByZXMgKSB7Ci0JCWlmICggcmVzICE9IG51bGwgKSB7Ci0JCQkKLQkJCS8vIG1hcmsgdGhlIHJlc291cmNlIGFzIGRpcnR5IHNvIHRoYXQgd2UgY2FuIHNhdmUgaXQgYWdhaW4KLQkJCS8vIHRoZSBmaXJzdCBzYXZlIG1heSBsb3NlIGNyb3NzIHJlZmVyZW5jZXMgCi0JCQlyZXMuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQlTdHJpbmcgZmlsZSA9IHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCWlmICggIW5ld1Jlc291cmNlcy5jb250YWlucyhmaWxlKSApIHsKLQkJCQluZXdSZXNvdXJjZXMuYWRkKGZpbGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2dSZW1vdmVkRWxlbWVudHMoTGlzdCBpdGVtcykgewotCQkKLQkJaWYgKCBpdGVtcyA9PSBudWxsIHx8IGl0ZW1zLnNpemUoKSA9PSAwICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyByZW1vdmVkIGVsZW1lbnRzIGNhbiBiZSByZW1vdmVkIGZyb20gYW55IGZlYXR1cmUKLQkJLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQncyBjb250YWluZXIgaXMgbnVsbAotCQkvLyBpZiBpcywgdGhlbiB0aGUgZWxlbWVudCBpcyBkZWxldGVkIGFuZCB0aGUgcmVzb3VyY2Ugc2hvdWxkIGJlIGRlbGV0ZWQKLQkJLy8gYXMgd2VsbAotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0Lm5leHQoKTsKLQkJCWlmICggKGUuZUNvbnRhaW5lcigpID09IG51bGwpICYmICFkZWxldGVkRWxlbWVudHMuY29udGFpbnMoZSkgKSB7CQkJCi0JCQkJZGVsZXRlZEVsZW1lbnRzLmFkZChlKTsKLQkJCX0JCQkKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0TW9kaWZpZWQoRU9iamVjdCBvYmopIHsKLQkJaWYgKCBvYmogIT0gbnVsbCApIHsKLQkJCVJlc291cmNlIHJlcyA9IG9iai5lUmVzb3VyY2UoKTsKLQkJCWlmICggcmVzICE9IG51bGwgKSB7Ci0JCQkJaWYgKCAhcmVzLmlzTW9kaWZpZWQoKSApIHsKLQkJCQkJcmVzLnNldE1vZGlmaWVkKHRydWUpOwkJCQkKLQkJCQl9Ci0vLyB9IGVsc2UgewotLy8gU3lzdGVtLm91dC5wcmludGxuKCJObyByZXNvdXJjZSBmb3IgIiArIG9iaik7Ci0JCQkJCi0JCQkJaWYgKGRlYnVnICYmIHJlcy5pc01vZGlmaWVkKCkgKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTW9kaWZpZWQ6ICIgKyByZXMuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0TW9kaWZpZWRSZXNvdXJjZXMoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJCi0JCS8vIGF2b2lkIHRoZSBuZXdseSBhZGRlZCBlbGVtZW50IHJlc291cmNlcwotCQlMaXN0IG1vZGlmaWVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJUmVzb3VyY2UgcmVzID0gbGliLmVSZXNvdXJjZSgpOwotCQlpZiAoIHJlcyAhPSBudWxsICkgewotCQkJUmVzb3VyY2VTZXQgcmVzU2V0ID0gcmVzLmdldFJlc291cmNlU2V0KCk7Ci0JCQlmb3IgKCBJdGVyYXRvciBpdCA9IHJlc1NldC5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCXJlcyA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCWlmICggcmVzICE9IG51bGwgJiYgcmVzLmlzTW9kaWZpZWQoKSApIHsKLQkJCQkJU3RyaW5nIGZpbGUgPSByZXMuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0JCQkJCWlmICggbmV3UmVzb3VyY2VzLmNvbnRhaW5zKGZpbGUpICkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlIG1vZGlmaWVkOiAiICsgZmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQkJCi0JCQkJCW1vZGlmaWVkTGlzdC5hZGQoZmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZExpc3Q7Ci0JfQotCi0JLy8gY2xlYXIgcmVzb3VyY2VzIGZvciBkZWxldGVkIGVsZW1lbnRzCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZVJlc29ydWNlcygpIHsKLQkJaWYgKCBkZWxldGVkRWxlbWVudHMuc2l6ZSgpID09IDAgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUlGaWxlTWFuYWdlciBmaWxlTWdyID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGVsZXRlZEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0JCQkKLQkJCUVPYmplY3Qgb2JqID0gbnVsbDsKLQkJCWlmICggZSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCApIHsKLQkJCQlvYmogPSAoKERlc2NyaWJhYmxlRWxlbWVudCllKS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCX0gZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gKSB7Ci0JCQkJb2JqID0gZTsKLQkJCX0KLQkJCWlmICggb2JqICE9IG51bGwgKSB7Ci0JCQkJUmVzb3VyY2UgcmVzID0gb2JqLmVSZXNvdXJjZSgpOwotCQkJCWlmICggcmVzICE9IG51bGwgKSB7Ci0JCQkJCVN0cmluZyBmaWxlID0gcmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJCQlpZiAoIGRlYnVnICkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJkZWxldGluZyByZXNvdXJjZTogIiArIGZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmICggIWZpbGVNZ3IuZGVsZXRlKGZpbGUpICkgewotCQkJCQkJaWYgKCBkZWJ1ZyApIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuYWJsZSB0byBkZWxldGUgZmlsZTogIiArIGZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9CQkJCQkJCQkKLQkJCX0KLQkJfQotCX0KLQotCQotCXB1YmxpYyBjbGFzcyBFbGVtZW50TGlzdERpZmYgewotCi0JCUxpc3QgbmV3SXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZGVsZXRlZEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJLy8gdXNlIExpbmtlZEhhc2hNYXAgdG8gcmVzZXJ2ZSB0aGUgb3JkZXIgb2YgdGhlIHZhbHVlcwotCQlNYXAgb2xkTmV3TWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLQotCQkvLyB3aXRoIHRoZSBvbGQgYW5kIG5ldyBsaXN0IG9mIE1ldGhvZEVsZW1lbnRzLAotCQkvLyBmaW5kIHRoZSBjb21tb24gb25lcywgdGhlIGRlbGV0ZWQgb25lcywgYW5kIHRoZSBuZXcgb25lcwotCQlwdWJsaWMgRWxlbWVudExpc3REaWZmKExpc3Qgb2xkTGlzdCwgTGlzdCBuZXdMaXN0KSB7Ci0JCQkvLyBNYXAgb2xkTGlzdEd1aWRNYXAgPSBnZXRHdWlkTWFwKG9sZExpc3QpOwotCQkJTWFwIG5ld0xpc3RHdWlkTWFwID0gZ2V0R3VpZE1hcChuZXdMaXN0KTsKLQotCQkJbmV3SXRlbXMuYWRkQWxsKG5ld0xpc3QpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gb2xkTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCU1ldGhvZEVsZW1lbnQgb2xkT2JqID0gKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotCQkJCVN0cmluZyBndWlkID0gb2xkT2JqLmdldEd1aWQoKTsKLQkJCQlPYmplY3QgbmV3T2JqID0gbmV3TGlzdEd1aWRNYXAuZ2V0KGd1aWQpOwotCQkJCWlmICggbmV3T2JqICE9IG51bGwgKSB7Ci0JCQkJCW9sZE5ld01hcC5wdXQob2xkT2JqLCBuZXdPYmopOwotCQkJCQluZXdJdGVtcy5yZW1vdmUobmV3T2JqKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLy8gaXQncyBiZWVuIGRlbGV0ZWQKLQkJCQkJZGVsZXRlZEl0ZW1zLmFkZChvbGRPYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgTWFwIGdldEd1aWRNYXAoTGlzdCBpdGVtcykgewotCQkJTWFwIG0gPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChJdGVyYXRvciBpdD0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0JCQkJbS5wdXQoZS5nZXRHdWlkKCksIGUpOwotCQkJfQotCi0JCQlyZXR1cm4gbTsKLQkJfQotCX0JCi0JCi0JLyoqCi0JICogSGFuZGxlcyBuYW1lIHJlcGxhY2VtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBoYW5kbGVOYW1lUmVwbGFjZShNYXAgcmVuYW1lRWxlbWVudE1hcCkgewotCQlJdGVyYXRvciBpdCA9IHJlbmFtZUVsZW1lbnRNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3RbXSB2YWwgPSAoT2JqZWN0W10pZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIHZhbFswXTsKLQkJCVN0cmluZyBuZXdOYW1lID0gdmFsLmxlbmd0aCA9PSA0ID8gZWxlbWVudC5nZXRHdWlkKCkgOiAoU3RyaW5nKSB2YWxbMV07Ci0JCQlyZW5hbWUoZWxlbWVudCwgbmV3TmFtZSk7Ci0JCQlpZiAodmFsLmxlbmd0aCA9PSA0KSB7Ci0JCQkJZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSB2YWxbMl07Ci0JCQkJbmV3TmFtZSA9IChTdHJpbmcpIHZhbFszXTsKLQkJCQlyZW5hbWUoZWxlbWVudCwgbmV3TmFtZSk7Ci0JCQkJCi0JCQkJZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSB2YWxbMF07Ci0JCQkJbmV3TmFtZSA9IChTdHJpbmcpIHZhbFsxXTsKLQkJCQlyZW5hbWUoZWxlbWVudCwgbmV3TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vTWFrZSByZXNvdWNlcyBkaXJ0eSBhZ2FpbiwgYXMgcmVuYW1lIHByb2Nlc3Mgd291bGQgbWFyayByZXNvdWNlIHVuLW1vZGlmaWVkCi0JCWl0ID0gcmVuYW1lRWxlbWVudE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCU9iamVjdFtdIHZhbCA9IChPYmplY3RbXSllbnRyeS5nZXRWYWx1ZSgpOwkJCQotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIHZhbFswXTsKLQkJCWVsZW1lbnQuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW5hbWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAobmV3TmFtZS5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gfHwgZWxlbWVudC5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQllbGVtZW50LnNldE5hbWUobmV3TmFtZSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIGVsZW1lbnQpCi0JCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJCXByb2Muc2V0TmFtZShuZXdOYW1lKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUxpYnJhcnlWaWV3LnJ1blJlbmFtZShlbGVtZW50LCBuZXdOYW1lKTsKLQkJfQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyU2V0RWxlbWVudChNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIGd1aWQwID0gKChNZXRob2RFbGVtZW50KW5ld1ZhbHVlKS5nZXRHdWlkKCk7Ci0JCVN0cmluZyBndWlkMSA9IGVsZW1lbnQuZ2V0R3VpZCgpOwotCQlPYmplY3RbXSB2YWwgPSBuZXcgT2JqZWN0WzNdOwotCQl2YWxbMF0gPSBmZWF0dXJlOwotCQl2YWxbMV0gPSBuZXdWYWx1ZTsKLQkJdmFsWzJdID0gZWxlbWVudDsKLQkJaWYgKHNldEVsZW1lbnRNYXAgPT0gbnVsbCkgewotCQkJc2V0RWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJc2V0RWxlbWVudE1hcC5wdXQoZWxlbWVudC5nZXROYW1lKCkgKyBndWlkMCArIGd1aWQxLCB2YWwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlU2V0RWxlbWVudHMoKSB7Ci0JCWlmIChzZXRFbGVtZW50TWFwID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc2V0RWxlbWVudE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCU9iamVjdFtdIHZhbCA9IChPYmplY3RbXSllbnRyeS5nZXRWYWx1ZSgpOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSB2YWxbMF07Ci0JCQlNZXRob2RFbGVtZW50IG5ld1ZhbHVlID0gKE1ldGhvZEVsZW1lbnQpIHZhbFsxXTsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSB2YWxbMl07Ci0JCQlTdHJpbmcgZ3VpZCA9IG5ld1ZhbHVlLmdldEd1aWQoKTsKLQkJCU1ldGhvZEVsZW1lbnQgbWVyZ2VkVmFsdWUgPSAoTWV0aG9kRWxlbWVudCkgcmVwbGFjZWRFbGVtZW50TWFwLmdldChndWlkKTsKLQkJCWlmIChtZXJnZWRWYWx1ZSAhPSBudWxsICYmIG1lcmdlZFZhbHVlICE9IG5ld1ZhbHVlKSB7Ci0JCQkJZWxlbWVudC5lU2V0KGZlYXR1cmUsIG1lcmdlZFZhbHVlKTsKLQkJCX0JCQkKLQkJfQotCX0KLQotCS8qKgotCSAqIEVuc3VyZXMgdW5pcXVlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGVuc3VyZVVuaXF1ZU5hbWUoRU9iamVjdCBvd25lciwgTWV0aG9kRWxlbWVudCBuZXdPYmosIE1hcCByZW5hbWVFbGVtZW50TWFwKSB7Ci0JCWlmIChvd25lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ2xhc3MgY2xzID0gbmV3T2JqLmdldENsYXNzKCk7Ci0JCU1hcCBuYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaT0wOyBpIDwgb3duZXIuZUNvbnRlbnRzKCkuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvbGRPYmogPSBvd25lci5lQ29udGVudHMoKS5nZXQoaSk7Ci0JCQlpZiAob2xkT2JqLmdldENsYXNzKCkgPT0gY2xzICYmIG9sZE9iaiAhPSBuZXdPYmopIHsKLQkJCQlNZXRob2RFbGVtZW50IG9sZEVsZW0gPSAoTWV0aG9kRWxlbWVudCkgb2xkT2JqOwotCQkJCW5hbWVNYXAucHV0KG9sZEVsZW0uZ2V0TmFtZSgpLCBvbGRFbGVtKTsKLQkJCX0KLQkJfQotCQlTdHJpbmcgbmFtZSA9IG5ld09iai5nZXROYW1lKCk7Ci0JCVN0cmluZyByZW5hbWVkID0gbmFtZTsKLQkJd2hpbGUgKG5hbWVNYXAuY29udGFpbnNLZXkocmVuYW1lZCkpIHsKLQkJCXJlbmFtZWQgKz0gIl9yZW5hbWVkIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChyZW5hbWVkICE9IG5hbWUpIHsKLQkJCW5ld09iai5zZXROYW1lKHJlbmFtZWQpOwotCQkJCi0JCQlPYmplY3RbXSBlbnRyeVZhbCA9IG5ldyBPYmplY3RbNF07Ci0JCQllbnRyeVZhbFswXSA9IG5ld09iajsKLQkJCWVudHJ5VmFsWzFdID0gbmFtZTsKLQkJCWVudHJ5VmFsWzJdID0gbmFtZU1hcC5nZXQobmFtZSk7Ci0JCQllbnRyeVZhbFszXSA9IHJlbmFtZWQ7Ci0JCQlyZW5hbWVFbGVtZW50TWFwLnB1dChuZXdPYmouZ2V0R3VpZCgpLCBlbnRyeVZhbCk7CQkJCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRW5zdXJlcyB1bmlxdWUgbmFtZSBmb3IgZXhpc3RpbmcgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5zdXJlVW5pcXVlTmFtZUZvckV4aXN0aW5nRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSwgTWFwIHJlbmFtZUVsZW1lbnRNYXApIHsKLQkJRU9iamVjdCBlbGVtZW50T3duZXIgPSBlbGVtZW50LmVDb250YWluZXIoKTsJCQkJCQotCQlpZiAoZWxlbWVudE93bmVyICE9IG51bGwpIHsKLQkJCWVsZW1lbnQuc2V0TmFtZShuZXdOYW1lKTsKLQkJCWVuc3VyZVVuaXF1ZU5hbWUoZWxlbWVudE93bmVyLCBlbGVtZW50LCByZW5hbWVFbGVtZW50TWFwKTsKLQkJCWlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKG5ld05hbWUpKSB7CS8vaWYgaGFuZGxlZCB0aGVuIHJldHVybgotCQkJCXJldHVybjsKLQkJCX0JCQkKLQkJCWVsZW1lbnQuc2V0TmFtZShvbGROYW1lKTsKLQkJfQkJCQotCQlPYmplY3RbXSBlbnRyeVZhbCA9IG5ldyBPYmplY3RbMl07Ci0JCWVudHJ5VmFsWzBdID0gZWxlbWVudDsKLQkJZW50cnlWYWxbMV0gPSBuZXdOYW1lOwotCQlyZW5hbWVFbGVtZW50TWFwLnB1dChlbGVtZW50LmdldEd1aWQoKSwgZW50cnlWYWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja01vZGlmaWVkRmlsZXMoKSB7Ci0JCWZpbmFsIExpc3QgbW9kaWZpZWRGaWxlcyA9IGdldE1vZGlmaWVkUmVzb3VyY2VzKGJhc2VMaWJyYXJ5KTsKLQkJbW9kaWZpZWRGaWxlcy5hZGRBbGwocmVzU2Nhbm5lci5nZXRGaWxlc1RvYmVSZXBsYWNlZCgpKTsKLQkJbW9kaWZpZWRGaWxlcy5hZGRBbGwoZGlhZ3JhbUhhbmRsZXIuZ2V0TW9kaWZpZWRGaWxlcygpKTsKLQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBGaWxlTW9kaWZ5Q2hlY2tlci5jaGVja01vZGlmeShtb2RpZmllZEZpbGVzKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IHVubG9ja1BsdWdpbnMoKSB7Ci0KLQkJTGlzdCBwbHVnaW5JZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlNYXA8U3RyaW5nLCBNZXRob2RQbHVnaW4+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kUGx1Z2luPigpOwotCQlNYXA8U3RyaW5nLCBNZXRob2RQbHVnaW4+IGd1aWRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZFBsdWdpbj4oKTsKLQkJTGlzdDxNZXRob2RQbHVnaW4+IGJhc2VQbHVnaW5zID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQkJCQkJCQkJCS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmFzZVBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBiYXNlUGx1Z2lucy5nZXQoaSk7Ci0JCQltYXAucHV0KHBsdWdpbi5nZXROYW1lKCksIHBsdWdpbik7Ci0JCQlndWlkTWFwLnB1dChwbHVnaW4uZ2V0R3VpZCgpLCBwbHVnaW4pOwotCQl9Ci0JCQotCQlpZiAobWFwLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHBsdWdpbklkczsKLQkJfQotCQkKLQkJTGlzdCBmaWxlTmFtZVRvQ2hlY2sgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBpbXBvcnRQbHVnaW5zID0gaW1wb3J0aW5nTGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0UGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IGltcG9ydFBsdWdpbnMuZ2V0KGkpOwotCQkJU3RyaW5nIG5hbWUgPSBwbHVnaW4uZ2V0TmFtZSgpOwotCQkJU3RyaW5nIGd1aWQgPSBwbHVnaW4uZ2V0R3VpZCgpOwotCQkJCi0JCQlNZXRob2RQbHVnaW4gYmFzZVBsdWdpbjAgPSBndWlkTWFwLmdldChndWlkKTsKLQkJCWlmIChiYXNlUGx1Z2luMCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG5hbWUwID0gYmFzZVBsdWdpbjAuZ2V0TmFtZSgpOwotCQkJCWlmICghIG5hbWUwLmVxdWFscyhuYW1lKSkgewotCQkJCQlyZW5hbWVQbHVnaW5NYXAucHV0KG5hbWUwLCBuYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCU1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luID0gbWFwLmdldChuYW1lKTsKLQkJCWJvb2xlYW4gdG9BZGQgPSBmYWxzZTsKLQkJCWlmIChiYXNlUGx1Z2luICE9IG51bGwgJiYgISBiYXNlUGx1Z2luLmdldEd1aWQoKS5lcXVhbHMoZ3VpZCkKLQkJCQkJJiYgISBiYXNlUGx1Z2luLmdldFVzZXJDaGFuZ2VhYmxlKCkpIHsKLQkJCQl0b0FkZCA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWJhc2VQbHVnaW4gPSBndWlkTWFwLmdldChndWlkKTsKLQkJCQlpZiAoYmFzZVBsdWdpbiAhPSBudWxsIC8qJiYgISBiYXNlUGx1Z2luLmdldE5hbWUoKS5lcXVhbHMobmFtZSkqLwotCQkJCQkJJiYgISBiYXNlUGx1Z2luLmdldFVzZXJDaGFuZ2VhYmxlKCkpIHsKLQkJCQkJdG9BZGQgPSB0cnVlOwotCQkJCX0gCi0JCQl9Ci0JCQkKLQkJCWlmICh0b0FkZCl7CQkJCQotCQkJCXBsdWdpbklkcy5hZGQoYmFzZVBsdWdpbi5nZXRHdWlkKCkpOwotCQkJCWJhc2VQbHVnaW4uc2V0VXNlckNoYW5nZWFibGUobmV3IEJvb2xlYW4odHJ1ZSkpOwotCQkJCVJlc291cmNlIHJlcyA9IGJhc2VQbHVnaW4uZVJlc291cmNlKCk7Ci0JCQkJaWYgKHJlcyAhPSBudWxsICYmIHJlcy5nZXRVUkkoKSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBmaWxlTmFtZSA9IHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQkJZmlsZU5hbWVUb0NoZWNrLmFkZChmaWxlTmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9CQotCQkKLQkJaWYgKGZpbGVOYW1lVG9DaGVjay5zaXplKCkgPiAwKSB7Ci0JCQlmaW5hbCBMaXN0IG1vZGlmaWVkRmlsZXMgPSBmaWxlTmFtZVRvQ2hlY2s7CQotCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBGaWxlTW9kaWZ5Q2hlY2tlci5jaGVja01vZGlmeShtb2RpZmllZEZpbGVzKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKLQkJcmV0dXJuIHBsdWdpbklkczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdW5sb2NrZWRQbHVnaW5zCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvY2tVbmxvY2tlZFBsdWdpbnMoTGlzdCB1bmxvY2tlZFBsdWdpbnMpIHsKLQkJTGlzdCBwbHVnaW5zID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCWlmICh1bmxvY2tlZFBsdWdpbnMuY29udGFpbnMocGx1Z2luLmdldEd1aWQoKSkpIHsKLQkJCQlwbHVnaW4uc2V0VXNlckNoYW5nZWFibGUobmV3IEJvb2xlYW4oZmFsc2UpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9nTmV3RWxlbWVudFVuZGVyRXhpc3RpbmdQbHVnaW4oTWV0aG9kRWxlbWVudCBuZXdPYmopIHsKLQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgbGliUmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3IobmV3T2JqKTsKLQkJU3RyaW5nIHBsdWdpblBhdGggPSBsaWJSZXNNZ3IuZ2V0UGh5c2ljYWxQbHVnaW5QYXRoKG5ld09iaik7Ci0JCWlmIChwbHVnaW5QYXRoICE9IG51bGwpIHsKLQkJCWxvZ05ld0VsZW1lbnQobmV3T2JqKTsKLQkJfQotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL1BsdWdpbkltcG9ydERhdGEuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvUGx1Z2luSW1wb3J0RGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDllMmJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvUGx1Z2luSW1wb3J0RGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5TG9jYXRpb25EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyB0aGUgaW5wdXQgZGF0YSByZXF1aXJlZCB0byBpbXBvcnQgYSBtZXRob2QgcGx1Zy1pbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkltcG9ydERhdGEgewotCi0JLy8gdGhlc2UgYXJlIHNldCBieSB0aGUgd2l6YXJkCi0JcHVibGljIExpYnJhcnlMb2NhdGlvbkRhdGEgbGxEYXRhID0gbmV3IExpYnJhcnlMb2NhdGlvbkRhdGEoKTsKLQotCXB1YmxpYyBib29sZWFuIGRlbGV0ZUV4aXN0aW5nUGx1Z2luczsKLQotCS8vIHRoZXNlIGFyZSBmaWxsZWQgaW4gYnkgdGhlIGltcG9ydGluZyBzZXJ2aWNlCi0JcHVibGljIFN0cmluZyBsaWJyYXJ5VmVyc2lvbjsKLQotCXByaXZhdGUgTGlzdCBwbHVnaW5zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBMaXN0IGNvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIEVycm9ySW5mbyBlcnJvciA9IG5ldyBFcnJvckluZm8oKTsKLQotCS8vIGFwIHRoZSBndWlkIHRvIHVybCBmb3IgYmFzZSBwbHVnaW4sIHRoaXMgaXMgdGhlIG9ubHkgZm9ybWF0aW9uIGF2YWlsYWJsZQotCXB1YmxpYyBNYXAgYmFzZVBsdWdpblVybE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQbHVnaW5JbXBvcnREYXRhKCkgewotCX0KLQotCS8qKgotCSAqIENsZWFycyB0aGUgY29udGVudHMuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXBsdWdpbnMuY2xlYXIoKTsKLQkJY29uZmlncy5jbGVhcigpOwotCQllcnJvci5lcnJvck1lc3NhZ2Uuc2V0TGVuZ3RoKDApOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgcGx1Z2lucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVBsdWdpbnMoKSB7Ci0JCVBsdWdpbkluZm8gaW5mbzsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IHBsdWdpbnMuc2l6ZSgpKSB7Ci0JCQlpbmZvID0gKFBsdWdpbkluZm8pIHBsdWdpbnMuZ2V0KGkpOwotCQkJaWYgKGluZm8udXJsID09IG51bGwpIHsKLQkJCQlwbHVnaW5zLnJlbW92ZShpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIFBsdWdpbkluZm8gb2JqZWN0IGdpdmVuIHRoZSBndWlkLgotCSAqLwotCXB1YmxpYyBQbHVnaW5JbmZvIGdldFBsdWdpbkluZm8oU3RyaW5nIGd1aWQpIHsKLQkJUGx1Z2luSW5mbyBpbmZvOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlpbmZvID0gKFBsdWdpbkluZm8pIGl0Lm5leHQoKTsKLQkJCWlmIChpbmZvLmd1aWQuZXF1YWxzKGd1aWQpKSB7Ci0JCQkJcmV0dXJuIGluZm87Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgUGx1Z2luSW5mbyBvYmplY3QgZ2l2ZW4gdGhlIGd1aWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUGx1Z2luSW5mbyhTdHJpbmcgZ3VpZCkgewotCQlQbHVnaW5JbmZvIGluZm87Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWluZm8gPSAoUGx1Z2luSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKGluZm8uZ3VpZC5lcXVhbHMoZ3VpZCkpIHsKLQkJCQlwbHVnaW5zLnJlbW92ZShpbmZvKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIENvbmZpZ3VhcmF0aW9uSW5mbyBvYmplY3QgZ2l2ZW4gdGhlIGd1aWQuCi0JICovCi0JcHVibGljIENvbmZpZ3VhcmF0aW9uSW5mbyBnZXRDb25maWdJbmZvKFN0cmluZyBndWlkKSB7Ci0KLQkJaWYgKCBndWlkID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbyBjaW5mbzsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGdldENvbmZpZ3MoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQljaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKGd1aWQuZXF1YWxzKGNpbmZvLmd1aWQpICkgewotCQkJCXJldHVybiBjaW5mbzsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCS8qKgotCSAqIHJldHVybiBhIGxpc3Qgb2YgUGx1Z2luSW5mbyBvYmplY3QKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIFBsdWdpbkluZm8gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFBsdWdpbnMoKSB7Ci0JCXJldHVybiBwbHVnaW5zOwotCX0KLQotCS8qKgotCSAqIHJldHVybiBhIGxpc3Qgb2YgQ29uZmlnSW5mbyBvYmplY3RzCi0JICogCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0Q29uZmlncygpIHsKLQkJcmV0dXJuIGNvbmZpZ3M7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBlcnJvciBtZXNzYWdlIGlmIGFueQotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIEVycm9ySW5mbyBnZXRFcnJvckluZm8oKSB7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgUGx1Z2luSW5mbyB7Ci0KLQkJLy8gSWYgbm90IG51bGwsIHRoaXMgaXMgYSB2YWxpZCBwbHVnLWluLgotCQlwdWJsaWMgU3RyaW5nIHVybCA9IG51bGw7Ci0KLQkJcHVibGljIFN0cmluZyBuYW1lOwotCi0JCXB1YmxpYyBTdHJpbmcgZ3VpZDsKLQotCQlwdWJsaWMgU3RyaW5nIHZlcnNpb247Ci0KLQkJcHVibGljIFN0cmluZyBicmllZl9kZXNjOwotCi0JCXB1YmxpYyBTdHJpbmcgYXV0aG9yczsKLQotCQlwdWJsaWMgU3RyaW5nIGNoYW5nZURhdGU7Ci0KLQkJcHVibGljIExpc3QgdXNlZFBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gSWYgbnVsbCwgdGhpcyBwbHVnLWluIGRvZXMgbm90IGV4aXN0cyBpbiB0aGUgY3VycmVudCBsaWJyYXJ5LgotCQlwdWJsaWMgTWV0aG9kUGx1Z2luIGV4aXN0aW5nUGx1Z2luID0gbnVsbDsKLQotCQkvLyBJZiB0cnVlLCByZXBsYWNlIHRoZSBjdXJyZW50IHBsdWctaW4gd2l0aCB0aGUgb25lIGluIHRoZSBpbXBvcnQKLQkJLy8gbGlicmFyeS4gSWYgZmFsc2UsIGRvbid0IGltcG9ydCB0aGUgcGx1Zy1pbi4KLQkJcHVibGljIGJvb2xlYW4gc2VsZWN0ZWQgPSBmYWxzZTsKLQotCQlwdWJsaWMgUGx1Z2luSW5mbygpIHsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBDb25maWd1YXJhdGlvbkluZm8gewotCi0JCXB1YmxpYyBTdHJpbmcgbmFtZTsKLQotCQlwdWJsaWMgU3RyaW5nIGd1aWQ7Ci0KLQkJcHVibGljIFN0cmluZyB2ZXJzaW9uOwotCi0JCS8vIFRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGV4aXN0aW5nQ29uZmlnID0gbnVsbDsKLQotCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3RlZCA9IHRydWU7Ci0KLQkJcHVibGljIENvbmZpZ3VhcmF0aW9uSW5mbygpIHsKLQkJfQotCi0JfQotCi0JcHVibGljIGNsYXNzIEVycm9ySW5mbyB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZXJyb3JNZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCXB1YmxpYyBFcnJvckluZm8oKSB7Ci0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCQllcnJvck1lc3NhZ2UuYXBwZW5kKG1lc3NhZ2UpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRFcnJvcigpIHsKLQkJCXJldHVybiBlcnJvck1lc3NhZ2UudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkJZXJyb3JNZXNzYWdlLnNldExlbmd0aCgwKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL1BsdWdpbkltcG9ydGluZ1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ0MThkYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL1BsdWdpbkltcG9ydGluZ1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNvcHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5MaWJyYXJ5RG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5QbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLlBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JU2F2ZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBJbXBvcnRzIGEgbWV0aG9kIHBsdWctaW4gaW50byB0aGUgY3VycmVudCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkltcG9ydGluZ1NlcnZpY2UgewotCi0JcHJpdmF0ZSBVcGdyYWRlQ2FsbGVySW5mbyB1cEdyYWRlSW5mbzsKLQkKLQkvL1RlbXAgZmxhZyBpbmRpY2F0aW5nIHVzZSBvZiB0aGUgbmV3IG1lcmdlIHNjaGVtZQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbmV3TWVyZ2VTY2hlbWUgPSB0cnVlOyAKLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGxvY2FsRGVidWcgPSBmYWxzZTsKLQkKLQlwcml2YXRlIFBsdWdpbkltcG9ydERhdGEgZGF0YTsKLQotCUxpYnJhcnlEb2N1bWVudCBpbXBvcnRpbmdMaWJEb2M7Ci0JTGlicmFyeURvY3VtZW50IHRhcmdldExpYkRvYzsKLQotCS8vIEZsYWcgdG8gaW5kaWNhdGUgdGhlIGZpbGUgY2hlY2tvdXQgc3RhdHVzLgotCUlTdGF0dXMgZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBudWxsOwotCQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0Jhc2VQbHVnaW5zID0gdHJ1ZTsKLQkKLQlwcml2YXRlIEZpbGUgZGVmYXVsdENvbmZpZ0ZvbGRlcjsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIEZpbGU+IHRhcmdldEZpbGVNYXA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlKFBsdWdpbkltcG9ydERhdGEgZGF0YSkgewotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgcGx1Zy1pbiBhZ2FpbnN0IHRoZSBjdXJyZW50IGxpYnJhcnksIGNvbGxlY3RzIGFsbCB0aGUKLQkgKiBpbmZvcm1hdGlvbnMgaW5jbHVkaW5nIHBsdWctaW4gaW5mbywgY29uZmlndWF0aW9uIGluZm8gYW5kIGVycm9yIGluZm8uCi0JICogQ2FsbCB0aGlzIG1ldGhvZCwgdGhlbiBjYWxsIGdldEVycm9yKCksIGdldFBsdWdpbnMoKSwgZ2V0Q29uZmlncygpLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3Iuc2V0VGFza05hbWUoSW1wb3J0UmVzb3VyY2VzLlBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMCk7IAotCQkJfQotCi0JCQlpZiAodGhpcy5kYXRhID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCXRoaXMuZGF0YS5jbGVhcigpOwotCi0JCQkvLyBQcmVwYXJlIHRoZSBsaWIgZmlsZXMuCi0JCQlGaWxlIGltcG9ydGluZ0xpYlBhdGggPSBuZXcgRmlsZShkYXRhLmxsRGF0YS5nZXRQYXJlbnRGb2xkZXIoKQotCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgTGlicmFyeURvY3VtZW50LmV4cG9ydEZpbGUpOwotCQkJaWYgKCFpbXBvcnRpbmdMaWJQYXRoLmV4aXN0cygpKSB7Ci0JCQkJZGF0YQotCQkJCQkJLmdldEVycm9ySW5mbygpCi0JCQkJCQkuYWRkRXJyb3IoCi0JCQkJCQkJCU5MUy5iaW5kKEltcG9ydFJlc291cmNlcy5QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzEsIGltcG9ydGluZ0xpYlBhdGgudG9TdHJpbmcoKSkpOyAKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWJvb2xlYW4gaGFuZGxlVmVyc2lvbiA9IHRydWU7Ci0JCQlpZiAoaGFuZGxlVmVyc2lvbikgewotCQkJCXVwR3JhZGVJbmZvID0gbmV3IENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlLlVwZ3JhZGVJbmZvKFVwZ3JhZGVDYWxsZXJJbmZvLnVwZ3JhZGVJbXBvcnRQbHVnaW4sIGltcG9ydGluZ0xpYlBhdGgpOwotCQkJCWlmICghIENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlLmhhbmRsZVRvb2xWZXJzaW9uKGltcG9ydGluZ0xpYlBhdGgsIHVwR3JhZGVJbmZvKSkgewotCQkJCQlkYXRhCi0JCQkJCS5nZXRFcnJvckluZm8oKQotCQkJCQkuYWRkRXJyb3IoCi0JCQkJCQkJTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLmltcG9ydFBsdWdpbnNXaXphcmRfRVJSX0ltcG9ydF9wbHVnaW4sIGltcG9ydGluZ0xpYlBhdGgudG9TdHJpbmcoKSkpOyAKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAodXBHcmFkZUluZm8uZ2V0Q29waWVkTGliRmlsZSgpICE9IG51bGwpIHsKLQkJCQkJaW1wb3J0aW5nTGliUGF0aCA9IHVwR3JhZGVJbmZvLmdldENvcGllZExpYkZpbGUoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVN0cmluZyB2ZXJzaW9uRXJyb3IgPSBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZS52ZXJzaW9uQ2hlY2soaW1wb3J0aW5nTGliUGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSwgCi0JCQkJCQlJbXBvcnRSZXNvdXJjZXMuaW1wb3J0UGx1Z2luc1dpemFyZF90aXRsZSk7Ci0JCQkJaWYgKHZlcnNpb25FcnJvciAhPSBudWxsKSB7Ci0JCQkJCWRhdGEuZ2V0RXJyb3JJbmZvKCkuYWRkRXJyb3IodmVyc2lvbkVycm9yKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQotCQkJaW1wb3J0aW5nTGliRG9jID0gbmV3IExpYnJhcnlEb2N1bWVudChpbXBvcnRpbmdMaWJQYXRoKTsKLQkJCQotCQkJRmlsZSBsaWJGaWxlID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKS5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQkudG9GaWxlU3RyaW5nKCkpOwotCQkJdGFyZ2V0TGliRG9jID0gbmV3IExpYnJhcnlEb2N1bWVudChsaWJGaWxlKTsKLQotCQkJc2NhbkxpYnJhcnlGaWxlKGltcG9ydGluZ0xpYkRvYyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIGltcG9ydC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtSW1wb3J0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy8gbmVlZCB0byBkaXNhYmxlIHRoZSB3b3Jrc3BhY2UgcmVmcmVzaGluZwotCQlib29sZWFuIHJlZnJlc2ggPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuaXNFbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlpZiAocmVmcmVzaCkgewotCQkJCS8vIGRpc2FibGUgcmVzb3VyY2UgcmVmcmVzaGluZyBkdXJpbmcgaW1wb3J0Ci0JCQkJLy8KLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCV9fZG9JbXBvcnQobW9uaXRvcik7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChyZWZyZXNoKSB7Ci0JCQkJLy8gcmUtZW5hYmxlIHJlc291cmNlIHJlZnJlc2hpbmcKLQkJCQkvLwotCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQkJaWYgKHVwR3JhZGVJbmZvICE9IG51bGwpIHsKLQkJCQl1cEdyYWRlSW5mby5yZW1vdmVDb3BpZWRMaWJyYXJ5KCk7Ci0JCQkJdXBHcmFkZUluZm8gPSBudWxsOwotCQkJfQotCQkJZGVmYXVsdENvbmZpZ0ZvbGRlciA9IG51bGw7Ci0JCQl0YXJnZXRGaWxlTWFwID0gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBfX2RvSW1wb3J0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3Iuc2V0VGFza05hbWUoSW1wb3J0UmVzb3VyY2VzLlBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMyk7IAotCQkJfQotCi0JCQlMaXN0IHVubG9ja2VkUGx1Z2lucyA9IHVubG9ja1BsdWdpbnMoKTsKLQkJCWlmICgoZmlsZUNoZWNrZWRPdXRTdGF0dXMgIT0gbnVsbCkKLQkJCQkJJiYgIWZpbGVDaGVja2VkT3V0U3RhdHVzLmlzT0soKSkgewotCQkJCS8vIGxvZyBlcnJvcgotCQkJCWRpc3BsYXlDaGVja091dEVycm9yKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBUbyBpbXBvcnQgdGhlIHBsdWctaW5zLCB3ZSBuZWVkIHRvIGRvIHRoZSBmb2xsb3dpbmc6Ci0JCQkvLyAxLiBEZWxldGUgdGhlIHBsdWctaW5zIGluIHRoZSBjdXJyZW50IGxpYnJhcnkgaWYgdXNlciBzcGVjaWZ5Ci0JCQkvLyByZW1vdmUKLQkJCS8vIDIuIENvcHkgdGhlIHNlbGVjdGVkIHBsdWdpbiBmaWxlcyB0byB0aGUgZGVzdGluYXRpb24KLQkJCS8vIDMuIFVwZGF0ZSB0aGUgbGlicmFyeS54bWkKLQkJCS8vIDQuIFJlbG9hZCB0aGUgbGlicmFyeQotCQkJCi0JCQlGaWxlIGxpYkZpbGUgPSB0YXJnZXRMaWJEb2MuZ2V0RmlsZSgpOwotCQkJZGVmYXVsdENvbmZpZ0ZvbGRlciA9IG51bGw7Ci0JCQl0YXJnZXRGaWxlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBGaWxlPigpOwotCQkJCi0JCQlpZiAobmV3TWVyZ2VTY2hlbWUpIHsJCQkKLQkJCQlpZiAoISBtZXJnZSh0YXJnZXRMaWJEb2MpKSB7Ci0JCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBJbXBvcnRSZXNvdXJjZXMuaW1wb3J0UGx1Z2luc1dpemFyZF90aXRsZTsKLQkJCQkJCQlTdHJpbmcgbXNnID0gSW1wb3J0UmVzb3VyY2VzLmltcG9ydFBsdWdpbnNXaXphcmRfRVJSX0ltcG9ydF9wbHVnaW47IAotCQkJCQkJCW5ldyBNc2dEaWFsb2coSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKSkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZyk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmICh1bmxvY2tlZFBsdWdpbnMuc2l6ZSgpID4gMCkgewotCQkJCQlsb2NrVW5sb2NrZWRQbHVnaW5zKHVubG9ja2VkUGx1Z2lucyk7Ci0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2F2ZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVvcGVuQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQl9Ci0JCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJUmVzb3VyY2VVdGlsLnJlZnJlc2hSZXNvdXJjZXMobGliLCBtb25pdG9yKTsKLQkJCQlyZXR1cm47Ci0JCQl9CQkJCi0KLQkJCS8vIC8vIFJlbW92ZSBleGlzdGluZyBlbnRyaWVzLgotCQkJLy8gcmVtb3ZlRXhpc3RpbmdFbnRyaWVzKHRhcmdldExpYkRvYyk7Ci0KLQkJCS8vIEltcG9ydCBlbnRyaWVzIGFuZCBjb3B5IGZpbGVzLgotCQkJaWYgKGltcG9ydEVudHJpZXModGFyZ2V0TGliRG9jKSkgewotCQkJCS8vIFNhdmUgdGhlIHVwZGF0ZWQgbGlicmFyeSBmaWxlLgotCQkJCXRhcmdldExpYkRvYy5zYXZlKCk7Ci0KLQkJCQkvLyBSZXBsYWNlIHRoZSBndWlkIG9mIHRoZSBvbGQgTWV0aG9kTGlicmFyeSB3aXRoIHRoZSBuZXcgb25lLgotCQkJCWZpeExpYnJhcnlHdWlkKGxpYkZpbGUuZ2V0UGFyZW50RmlsZSgpLCBpbXBvcnRpbmdMaWJEb2MKLQkJCQkJCS5nZXRMaWJyYXJ5R3VpZCgpLCB0YXJnZXRMaWJEb2MuZ2V0TGlicmFyeUd1aWQoKSk7Ci0KLQkJCQkvLyBSZW9wZW4gdGhlIGxpYnJhcnkuCi0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCi0JCQkJLy8gRmluYWxseSwgcmUtbG9jayB0aGUgdW5sb2NrZWQgcGx1Z2lucyBhbmQgc2F2ZSB0aGUgbGlicmFyeQotCQkJCS8vIGFnYWluLgotCQkJCWlmICh1bmxvY2tlZFBsdWdpbnMuc2l6ZSgpID4gMCkgewotCQkJCQlsb2NrVW5sb2NrZWRQbHVnaW5zKHVubG9ja2VkUGx1Z2lucyk7Ci0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2F2ZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBSZS1vcGVuIGxpYnJhcnkgYW5kIGZyZXNoIHRoZSB3b3Jrc3BhY2UuCi0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlb3BlbkN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkJCS8vIHJlZnJlc2ggbGlicmFyeSBmaWxlcyBpbiB3b3Jrc3BhY2UKLQkJCS8vCi0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCVJlc291cmNlVXRpbC5yZWZyZXNoUmVzb3VyY2VzKGxpYiwgbW9uaXRvcik7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgdW5sb2NrUGx1Z2lucygpIHsKLQotCQlMaXN0IHBsdWdpbklkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCU1hcDxTdHJpbmcsIE1ldGhvZFBsdWdpbj4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZXRob2RQbHVnaW4+KCk7Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBiYXNlUGx1Z2lucyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKQotCQkJCQkJCQkJCQkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJhc2VQbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gYmFzZVBsdWdpbnMuZ2V0KGkpOwotCQkJbWFwLnB1dChwbHVnaW4uZ2V0TmFtZSgpLCBwbHVnaW4pOwotCQl9Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBwb3NzaWJsZUV4dHJhVW5sb2NrUGx1Z2lucyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPigpOwotCi0JCVBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGl0Lm5leHQoKTsKLQkJCWlmICgoaW5mby5leGlzdGluZ1BsdWdpbiAhPSBudWxsKSAmJiBpbmZvLnNlbGVjdGVkKSB7Ci0JCQkJaWYgKGluZm8uZXhpc3RpbmdQbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKS5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZSkgewotCQkJCQlpbmZvLmV4aXN0aW5nUGx1Z2luLnNldFVzZXJDaGFuZ2VhYmxlKG5ldyBCb29sZWFuKHRydWUpKTsKLQkJCQkJcGx1Z2luSWRzLmFkZChpbmZvLmV4aXN0aW5nUGx1Z2luLmdldEd1aWQoKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGluZm8uc2VsZWN0ZWQpIHsKLQkJCQlNZXRob2RQbHVnaW4gYmFzZVBsdWdpbiA9IG1hcC5nZXQoaW5mby5uYW1lKTsKLQkJCQlpZiAoYmFzZVBsdWdpbiAhPSBudWxsICYmICEgYmFzZVBsdWdpbi5nZXRHdWlkKCkuZXF1YWxzKGluZm8uZ3VpZCkKLQkJCQkJCSYmICEgYmFzZVBsdWdpbi5nZXRVc2VyQ2hhbmdlYWJsZSgpKSB7Ci0JCQkJCXBvc3NpYmxlRXh0cmFVbmxvY2tQbHVnaW5zLmFkZChiYXNlUGx1Z2luKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWhhbmRsZUV4dHJhVW5sb2NrUGx1Z2lucyhwbHVnaW5JZHMsIHBvc3NpYmxlRXh0cmFVbmxvY2tQbHVnaW5zKTsKLQkJCi0JCXJldHVybiBwbHVnaW5JZHM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUV4dHJhVW5sb2NrUGx1Z2lucyhMaXN0IHBsdWdpbklkcywKLQkJCUxpc3Q8TWV0aG9kUGx1Z2luPiBwb3NzaWJsZUV4dHJhVW5sb2NrUGx1Z2lucykgewotCQlpZiAocG9zc2libGVFeHRyYVVubG9ja1BsdWdpbnMgPT0gbnVsbCB8fCBwb3NzaWJsZUV4dHJhVW5sb2NrUGx1Z2lucy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTGlzdCBmaWxlTmFtZVRvQ2hlY2sgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zc2libGVFeHRyYVVubG9ja1BsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBwb3NzaWJsZUV4dHJhVW5sb2NrUGx1Z2lucy5nZXQoaSk7Ci0JCQlTdHJpbmcgZ3VpZCA9IHBsdWdpbi5nZXRHdWlkKCk7Ci0JCQlpZiAoISBwbHVnaW5JZHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQlwbHVnaW4uc2V0VXNlckNoYW5nZWFibGUobmV3IEJvb2xlYW4odHJ1ZSkpOwotCQkJCXBsdWdpbklkcy5hZGQoZ3VpZCk7Ci0JCQkJUmVzb3VyY2UgcmVzID0gcGx1Z2luLmVSZXNvdXJjZSgpOwotCQkJCWlmIChyZXMgIT0gbnVsbCAmJiByZXMuZ2V0VVJJKCkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSByZXMuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0JCQkJCWZpbGVOYW1lVG9DaGVjay5hZGQoZmlsZU5hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChmaWxlTmFtZVRvQ2hlY2suc2l6ZSgpID4gMCkgewotCQkJZmluYWwgTGlzdCBtb2RpZmllZEZpbGVzID0gZmlsZU5hbWVUb0NoZWNrOwkKLQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWZpbGVDaGVja2VkT3V0U3RhdHVzID0gRmlsZU1vZGlmeUNoZWNrZXIuY2hlY2tNb2RpZnkobW9kaWZpZWRGaWxlcyk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9ja1VubG9ja2VkUGx1Z2lucyhMaXN0IHVubG9ja2VkUGx1Z2lucykgewotCQlMaXN0IHBsdWdpbnMgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCQkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJaWYgKHVubG9ja2VkUGx1Z2lucy5jb250YWlucyhwbHVnaW4uZ2V0R3VpZCgpKSkgewotCQkJCXBsdWdpbi5zZXRVc2VyQ2hhbmdlYWJsZShuZXcgQm9vbGVhbihmYWxzZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGltcG9ydEVudHJpZXMoTGlicmFyeURvY3VtZW50IHRhcmdldExpYkRvYykgewotCQkvLyAxLiBGaW5kIHRoZSBlbnRyaWVzIHRvIGJlIHJlbW92ZWQuCi0JCUxpc3QgaW1wb3J0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbzsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBpdC5uZXh0KCk7Ci0JCQlpZiAoaW5mby5zZWxlY3RlZCkgewotCQkJCWlmIChpbmZvLmV4aXN0aW5nUGx1Z2luID09IG51bGwpIHsKLQkJCQkJbmV3TGlzdC5hZGQoaW5mby5ndWlkKTsKLQkJCQl9Ci0KLQkJCQlpbXBvcnRMaXN0LmFkZChpbmZvLmd1aWQpOwotCQkJfQotCQl9Ci0KLQkJUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8gY2luZm87Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldENvbmZpZ3MoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQljaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKGNpbmZvLnNlbGVjdGVkKSB7Ci0JCQkJaWYgKGNpbmZvLmV4aXN0aW5nQ29uZmlnID09IG51bGwpIHsKLQkJCQkJbmV3TGlzdC5hZGQoY2luZm8uZ3VpZCk7Ci0JCQkJfQotCi0JCQkJaW1wb3J0TGlzdC5hZGQoY2luZm8uZ3VpZCk7Ci0KLQkJCX0KLQkJfQotCi0JCS8vIDIuIEl0ZXJhdGUgdGhlIGRvY3VlbW50IGFuZCBhZGQgdGhlIG5ldyBlbnRyaWVzLgotCQlpZiAoIW5ld01lcmdlU2NoZW1lKSB7Ci0JCQlpbXBvcnRMaWJFbnRyaWVzKHRhcmdldExpYkRvYywgbmV3TGlzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCWVuc3VyZVVuaXF1ZU5hbWVzKGxpYi5nZXRNZXRob2RQbHVnaW5zKCkpOwotCQkJZW5zdXJlVW5pcXVlTmFtZXMobGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY29weUZpbGVzKHRhcmdldExpYkRvYywgaW1wb3J0TGlzdCwgbmV3TGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGltcG9ydExpYkVudHJpZXMoTGlicmFyeURvY3VtZW50IHRhcmdldExpYkRvYywgTGlzdCBuZXdMaXN0KSB7Ci0KLQkJaWYgKG5ld0xpc3QgPT0gbnVsbCB8fCBuZXdMaXN0LnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBBZGQgcGx1Zy1pbnMuCi0JCU5vZGVMaXN0IG5vZGVzID0gaW1wb3J0aW5nTGliRG9jLmdldFBsdWdpbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBndWlkID0gTGlicmFyeURvY3VtZW50LmdldEd1aWQobm9kZSk7Ci0JCQlpZiAobmV3TGlzdC5jb250YWlucyhndWlkKSkgewotCQkJCXRhcmdldExpYkRvYy5hZGRQbHVnaW4obm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBBZGQgY29uZmlndXJhdGlvbnMuCi0JCW5vZGVzID0gaW1wb3J0aW5nTGliRG9jLmdldENvbmZpZ3VyYXRpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgZ3VpZCA9IExpYnJhcnlEb2N1bWVudC5nZXRHdWlkKG5vZGUpOwotCQkJaWYgKG5ld0xpc3QuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQl0YXJnZXRMaWJEb2MuYWRkQ29uZmlndXJhdGlvbihub2RlKTsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCByZXNvdXJjZSBlbnRyaWVzCi0JCW5vZGVzID0gaW1wb3J0aW5nTGliRG9jLmdldFJlc291cmNlRGVzY3JpcHRvcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBndWlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfaWQpOwotCQkJaWYgKG5ld0xpc3QuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQl0YXJnZXRMaWJEb2MuYWRkUmVzb3VyY2Uobm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBBZGQgdGhlIHJlc291cmNlIHN1YiBtYW5hZ2Vycy4KLQkJbm9kZXMgPSBpbXBvcnRpbmdMaWJEb2MuZ2V0UmVzb3VyY2VTdWJNYW5hZ2VycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIGd1aWQgPSBMaWJyYXJ5RG9jdW1lbnQuZ2V0U3ViTWFuYWdlckJhc2VHdWlkKG5vZGUKLQkJCQkJLmdldEF0dHJpYnV0ZShMaWJyYXJ5RG9jdW1lbnQuQVRUUl9ocmVmKSk7Ci0JCQlpZiAobmV3TGlzdC5jb250YWlucyhndWlkKSkgewotCQkJCXRhcmdldExpYkRvYy5hZGRSZXNvdXJjZShub2RlKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvcHlGaWxlcyhMaWJyYXJ5RG9jdW1lbnQgdGFyZ2V0TGliRG9jLCBMaXN0IGltcG9ydExpc3QsCi0JCQlMaXN0IG5ld0xpc3QpIHsKLQkJZmluYWwgTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW1wb3J0TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBzcmNfdXJpID0gaW1wb3J0aW5nTGliRG9jLmdldFJlc291cmNlVXJpKGd1aWQpOwotCQkJU3RyaW5nIHRhcmdldF91cmk7Ci0JCQlpZiAoc3JjX3VyaSA9PSBudWxsIHx8IHNyY191cmkubGVuZ3RoKCkgPT0gMCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQl0YXJnZXRfdXJpID0gc3JjX3VyaTsKLQkJCS8qCi0JCQlpZiAobmV3TGlzdC5jb250YWlucyhndWlkKSkgewotCQkJCXRhcmdldF91cmkgPSBzcmNfdXJpOwotCQkJfSBlbHNlIHsKLQkJCQl0YXJnZXRfdXJpID0gdGFyZ2V0TGliRG9jLmdldFJlc291cmNlVXJpKGd1aWQpOyAvLyB0aGUgcmVzb3VyY2UKLQkJCQkvLyBtaWdodCBiZQotCQkJCS8vIHJlbmFtZWQKLQkJCX0KLQkJCSovCi0KLQkJCS8vIENoZWNrIHRoZSBwbHVnaW4ueG1pIGZpbGUuIElmIGl0IGV4aXN0cywgY29weSB0aGUgZm9sZGVyIHRvCi0JCQkvLyB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgotCQkJZmluYWwgRmlsZSBzcmNfZmlsZSA9IGltcG9ydGluZ0xpYkRvYy5nZXRGaWxlRnJvbVVyaShzcmNfdXJpKTsKLQkJCWlmIChzcmNfZmlsZS5leGlzdHMoKSkgewotLyoJCQkJZmluYWwgRmlsZSB0YXJnZXRfZmlsZSA9IHRhcmdldExpYkRvYwotCQkJCQkJLmdldEZpbGVGcm9tVXJpKHRhcmdldF91cmkpOyovCi0JCQkJCi0JCQkJZmluYWwgRmlsZSB0YXJnZXRfZmlsZSA9IGdldFRhcmdldEZpbGUobGliLCBndWlkKTsKLQkJCQlpZiAodGFyZ2V0X2ZpbGUgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXRhcmdldEZpbGVNYXAucHV0KGd1aWQsIHRhcmdldF9maWxlKTsKLQotCQkJCS8vIGlmIGl0J3MgYSBjb25maWd1cmF0aW9uLCBvbmx5IGNvcHkgdGhlIGZpbGUsCi0JCQkJLy8gaWYgaXQncyBhIHBsdWdpbiwgY29weSB0aGUgd2hvbGUgZGlyZWN0b3J5Ci0KLQkJCQlpZiAoZGF0YS5nZXRQbHVnaW5JbmZvKGd1aWQpICE9IG51bGwpIHsKLQkJCQkJaWYgKHRhcmdldF9maWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlEaXJDb3B5IGNvcHkgPSBuZXcgRGlyQ29weShzcmNfZmlsZQotCQkJCQkJCQkJCS5nZXRQYXJlbnRGaWxlKCksIHRhcmdldF9maWxlCi0JCQkJCQkJCQkJLmdldFBhcmVudEZpbGUoKSk7Ci0JCQkJCQkJCWZpbGVDaGVja2VkT3V0U3RhdHVzID0gY29weS5leGVjdXRlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljb3B5RGlyKHNyY19maWxlLmdldFBhcmVudEZpbGUoKSwgdGFyZ2V0X2ZpbGUKLQkJCQkJCQkJLmdldFBhcmVudEZpbGUoKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGRhdGEuZ2V0Q29uZmlnSW5mbyhndWlkKSAhPSBudWxsICYmIERpckNvcHkubmVlZENvcHkoc3JjX2ZpbGUsIHRhcmdldF9maWxlKSkgewotCQkJCQlmaW5hbCBMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlpZiAodGFyZ2V0X2ZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCWZpbGVzLmFkZCh0YXJnZXRfZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IEZpbGVNb2RpZnlDaGVja2VyCi0JCQkJCQkJCQkJLmNoZWNrTW9kaWZ5KGZpbGVzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfQotCi0JCQkJCWlmIChmaWxlQ2hlY2tlZE91dFN0YXR1cyA9PSBudWxsCi0JCQkJCQkJfHwgZmlsZUNoZWNrZWRPdXRTdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQlGaWxlVXRpbC5jb3B5RmlsZShzcmNfZmlsZSwgdGFyZ2V0X2ZpbGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKChmaWxlQ2hlY2tlZE91dFN0YXR1cyAhPSBudWxsKQotCQkJCQkJJiYgIWZpbGVDaGVja2VkT3V0U3RhdHVzLmlzT0soKSkgewotCQkJCQkvLyBsb2cgZXJyb3IKLQkJCQkJZGlzcGxheUNoZWNrT3V0RXJyb3IoKTsKLQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3BsYXlDaGVja091dEVycm9yKCkgewotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU3RyaW5nIHRpdGxlID0gSW1wb3J0UmVzb3VyY2VzLmltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGU7IAotCQkJCVN0cmluZyBtc2cgPSBJbXBvcnRSZXNvdXJjZXMuaW1wb3J0UGx1Z2luc1dpemFyZF9FUlJfSW1wb3J0X3BsdWdpbjsgCi0JCQkJbmV3IE1zZ0RpYWxvZyhJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpKQotCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnLAotCQkJCQkJCQlmaWxlQ2hlY2tlZE91dFN0YXR1cyk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBkaXJlY3RvcmllcyBmcm9tICJmcm9tRGlyIiB0byAidG9EaXIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RGlyKEZpbGUgZnJvbURpciwgRmlsZSB0b0RpcikgewotCQlDb3B5IGNwID0gbmV3IENvcHkoKTsKLQkJY3Auc2V0T3ZlcndyaXRlKHRydWUpOwotCQlGaWxlU2V0IHNldCA9IG5ldyBGaWxlU2V0KCk7Ci0JCXNldC5zZXRFeGNsdWRlcyhDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZS5leGNsdWRlcyk7Ci0JCXNldC5zZXREaXIoZnJvbURpcik7Ci0JCWNwLmFkZEZpbGVzZXQoc2V0KTsKLQkJY3Auc2V0VG9kaXIodG9EaXIpOwotCQljcC5zZXRQcm9qZWN0KG5ldyBQcm9qZWN0KCkpOwotCQljcC5leGVjdXRlKCk7Ci0KLQl9Ci0KLQkvLyAvKioKLQkvLyAqIHJlbW92ZSB0aGUgcGx1Z2luIGVudHJ5IGZyb20gdGhlIGxpYnJhcnkgZG9jdW1lbnQKLQkvLyAqCi0JLy8gKiBAcGFyYW0gZG9jdW1lbnQKLQkvLyAqIExpYnJhcnlEb2N1bWVudAotCS8vICogQHBhcmFtIGd1aWQKLQkvLyAqIFN0cmluZyBndWlkIG9mIHRoZSBwbHVnaW4KLQkvLyAqLwotCS8vIHByaXZhdGUgdm9pZCByZW1vdmVFeGlzdGluZ0VudHJpZXMoTGlicmFyeURvY3VtZW50IGRvY3VtZW50KSB7Ci0JLy8gLy8gMS4gRmluZCB0aGUgZW50cmllcyB0byBiZSByZW1vdmVkLgotCS8vIExpc3QgcmVtb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbzsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCS8vIGluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBpdC5uZXh0KCk7Ci0JLy8gaWYgKChpbmZvLmV4aXN0aW5nUGx1Z2luICE9IG51bGwpICYmIGluZm8uc2VsZWN0ZWQpIHsKLQkvLyByZW1vdmVMaXN0LmFkZChpbmZvLmd1aWQpOwotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLyBQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbyBjaW5mbzsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRDb25maWdzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCS8vIGNpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvKSBpdC5uZXh0KCk7Ci0JLy8gaWYgKChjaW5mby5leGlzdGluZ0NvbmZpZyAhPSBudWxsKSAmJiBjaW5mby5zZWxlY3RlZCkgewotCS8vIHJlbW92ZUxpc3QuYWRkKGNpbmZvLmd1aWQpOwotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLyAvLyAyLiBJdGVyYXRlIHRoZSBkb2N1ZW1udCBhbmQgcmVtb3ZlIHRoZSBlbnRyaWVzLgotCS8vIGRvY3VtZW50LnJlbW92ZVBsdWdpbnMocmVtb3ZlTGlzdCk7Ci0JLy8gZG9jdW1lbnQucmVtb3ZlQ29uZmlndXJhdGlvbnMocmVtb3ZlTGlzdCk7Ci0JLy8gZG9jdW1lbnQucmVtb3ZlUmVzb3VyY2VFbnRyaWVzKHJlbW92ZUxpc3QpOwotCS8vIH0KLQotCSAvKiogCi0JICAqIFZhbGlkYXRlcyBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB2YWxpZGF0ZVNlbGVjdGlvbigpIHsKLQkJaWYgKCEgaXNDaGVja0Jhc2VQbHVnaW5zKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWRhdGEuZ2V0RXJyb3JJbmZvKCkuY2xlYXIoKTsKLQotCQkvLyBJdGVyYXRlIHRoZSBuZXcgcGx1Z2lucywgbWFrZSBzdXJlIHRoZSBiYXNlIGlzIGluY2x1ZGVkCi0JCS8vIGVpdGhlciBhcyBhbiBpbXBvcnRpbmcgcGx1Z2luLCBvciBpcyBpbiB0aGUgY3VycmVudCBsaWJyYXJ5Ci0JCS8vIGdldCB0aGUgbWV0aG9kIHBsdWdpbnMgaW4gdGhlIGN1cnJlbnQgbGlicmFyeS4KLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlMaXN0IHBsdWdpbnMgPSAobGlicmFyeSA9PSBudWxsKSA/IG5ldyBBcnJheUxpc3QoKSA6IGxpYnJhcnkKLQkJCQkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlNYXAgcGx1Z2luaWRzID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCXBsdWdpbmlkcy5wdXQocGx1Z2luLmdldEd1aWQoKSwgcGx1Z2luKTsKLQkJfQotCi0JCS8vIFRoZSBiYXNlIHBsdWctaW5zIE1VU1QgYmUgZWl0aGVyIGEgc2VsZWN0ZWQgb25lIG9yIGFuIGV4aXN0aW5nIG9uZQotCQkvLyBvdGhlcndpc2UsIGNhbid0IGltcG9ydAotCQlTZXQgYmFzZVBsdWdpbnMgPSBuZXcgSGFzaFNldCgpOwotCi0JCVNldCBuZXdQbHVnaW5zID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaXQKLQkJCQkJLm5leHQoKTsKLQkJCS8vaWYgKGluZm8uc2VsZWN0ZWQgJiYgKGluZm8uZXhpc3RpbmdQbHVnaW4gPT0gbnVsbCkpIHsKLQkJCWlmIChpbmZvLnNlbGVjdGVkKSB7Ci0JCQkJbmV3UGx1Z2lucy5hZGQoaW5mby5ndWlkKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0YiA9IGluZm8udXNlZFBsdWdpbnMuaXRlcmF0b3IoKTsgaXRiLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGJhc2UgPSBpdGIubmV4dCgpOwotCQkJCQlpZiAoIWJhc2VQbHVnaW5zLmNvbnRhaW5zKGJhc2UpKSB7Ci0JCQkJCQliYXNlUGx1Z2lucy5hZGQoYmFzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAobmV3UGx1Z2lucy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYmFzZVBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCVN0cmluZyB1cmkgPSAoU3RyaW5nKSBkYXRhLmJhc2VQbHVnaW5VcmxNYXAuZ2V0KGd1aWQpOwotCQkJCWlmICghbmV3UGx1Z2lucy5jb250YWlucyhndWlkKSAmJiAhcGx1Z2luaWRzLmNvbnRhaW5zS2V5KGd1aWQpKSB7Ci0JCQkJCVN0cmluZyBtZXNzYWdlOwotCQkJCQlpZiAodXJpICE9IG51bGwgJiYgdXJpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJbWVzc2FnZSA9IE5MUy5iaW5kKEltcG9ydFJlc291cmNlcy5QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzUsIHVyaSk7IAotCQkJCQl9IGVsc2UgewotCQkJCQkJTWFwPFN0cmluZywgU3RyaW5nPiBndWlkVG9QbHVnTmFtZU1hcCA9IGltcG9ydGluZ0xpYkRvYy5nZXRHdWlkVG9QbHVnTmFtZU1hcCgpOwotCQkJCQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBndWlkVG9QbHVnTmFtZU1hcCA9PSBudWxsID8gbnVsbCA6IGd1aWRUb1BsdWdOYW1lTWFwLmdldChndWlkKTsKLQkJCQkJCWlmIChwbHVnaW5OYW1lID09IG51bGwgfHwgcGx1Z2luTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJbWVzc2FnZSA9IEltcG9ydFJlc291cmNlcy5QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzY7IAotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQltZXNzYWdlID0gTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLlBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNSwgCi0JCQkJCQkJCQlwbHVnaW5OYW1lICsgIiwgIiArIGd1aWQpOyAJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlkYXRhLmdldEVycm9ySW5mbygpLmFkZEVycm9yKG1lc3NhZ2UpOwotCi0JCQkJCWlmICh1cmkgPT0gbnVsbCB8fCB1cmkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZGF0YS5nZXRFcnJvckluZm8oKS5nZXRFcnJvcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzY2FuTGlicmFyeUZpbGUoTGlicmFyeURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXZpc2l0TGliVGFnKGRvY3VtZW50KTsKLQkJdmlzaXRSZXNvdXJjZVRhZyhkb2N1bWVudCk7Ci0JCWRhdGEudmFsaWRhdGVQbHVnaW5zKCk7Ci0KLQkJLy8gQ2hlY2sgYmFzZSBwbHVnLWluIGRlcGVuZGVuY2llcy4KLQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaXQKLQkJCQkJLm5leHQoKTsKLQkJCWlmIChpbmZvLmV4aXN0aW5nUGx1Z2luID09IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0YmFzZSA9IGluZm8udXNlZFBsdWdpbnMuaXRlcmF0b3IoKTsgaXRiYXNlCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIGl0YmFzZS5uZXh0KCk7Ci0JCQkJCWlmICghZGF0YS5iYXNlUGx1Z2luVXJsTWFwLmNvbnRhaW5zS2V5KGd1aWQpKSB7Ci0JCQkJCQlkYXRhLmJhc2VQbHVnaW5VcmxNYXAucHV0KGd1aWQsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZpc2l0TGliVGFnKExpYnJhcnlEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyBSZWxvYWQgdGhlIGVsZW1lbnQgbWFwcGluZy4KLQkJTm9kZUxpc3Qgbm9kZXMgPSBkb2N1bWVudC5nZXRQbHVnaW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gcGkgPSBkYXRhLm5ldyBQbHVnaW5JbmZvKCk7Ci0JCQlwaS5ndWlkID0gTGlicmFyeURvY3VtZW50LmdldEd1aWQobm9kZSk7Ci0JCQlkYXRhLmdldFBsdWdpbnMoKS5hZGQocGkpOwotCi0JCQkvLyBDaGVjayB3aXRoIHRoZSBjdXJyZW50IGxpYnJhcnksIGdldCB0aGUgcmVsYXRlZCBpbmZvcm1hdGlvbi4KLQkJCWxvYWRFeGlzdGluZ1BsdWdpbkluZm8ocGkpOwotCQl9Ci0KLQkJLy8gUmVtb3ZlIHRoZSB1bm5lZWRlZCBjb25maWd1cmF0aW9ucy4KLQkJYnVpbGRDb25maWdJbmZvRnJvbUZpbGVzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZpc2l0UmVzb3VyY2VUYWcoTGlicmFyeURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCU5vZGVMaXN0IG5vZGVzID0gZG9jdW1lbnQuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIGd1aWQgPSBub2RlLmdldEF0dHJpYnV0ZShMaWJyYXJ5RG9jdW1lbnQuQVRUUl9pZCk7Ci0JCQlTdHJpbmcgdXJpID0gbm9kZS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfdXJpKTsKLQotCQkJLy8gTG9hZCB0aGUgcGx1Z2luLnhtaSBmaWxlIGZvciBkZXRhaWwgaW5mb3JtYXRpb24uCi0JCQlGaWxlIGZpbGUgPSBkb2N1bWVudC5nZXRGaWxlRnJvbVVyaSh1cmkpOwotCi0JCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gcGkgPSBkYXRhLmdldFBsdWdpbkluZm8oZ3VpZCk7Ci0JCQlpZiAocGkgIT0gbnVsbCkgewotCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWxvYWRQbHVnaW5JbmZvKGZpbGUsIHBpKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBSZW1vdmUgdGhlIHBsdWctaW4gaW5mbyBlbnRyeSBzaW5jZSB0aGlhcyBpcyBub3QKLQkJCQkJLy8gYSB2YWxpZCBwbHVnLWluIHRvIGltcG9ydC4KLQkJCQkJZGF0YS5yZW1vdmVQbHVnaW5JbmZvKGd1aWQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gaWYgbm90IHBsdWdpbiwgbWlnaHQgYmUgYSBjb25maWd1cmF0aW9uCi0JCQkJUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8gY2kgPSBkYXRhCi0JCQkJCQkuZ2V0Q29uZmlnSW5mbyhndWlkKTsKLQkJCQlpZiAoY2kgIT0gbnVsbCkgewotCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJbG9hZENvbmZpZ0luZm8oZmlsZSwgY2kpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZENvbmZpZ0luZm8oRmlsZSBzb3VyY2UsCi0JCQlQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbyBpbmZvKSB7Ci0JCXRyeSB7Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9IFhNTFV0aWwubG9hZFhtbChzb3VyY2UpOwotCQkJRWxlbWVudCByb290ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLQkJCUVsZW1lbnQgY29uZmlnVGFnID0gbnVsbDsKLQkJCWlmIChyb290LmdldFRhZ05hbWUoKS5lcXVhbHMoCi0JCQkJCSJvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCWNvbmZpZ1RhZyA9IHJvb3Q7Ci0JCQl9IGVsc2UgewotCQkJCU5vZGVMaXN0IG5vZGVzID0gcm9vdAotCQkJCQkJLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChub2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQkJY29uZmlnVGFnID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oMCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoY29uZmlnVGFnICE9IG51bGwpIHsKLQkJCQlpbmZvLm5hbWUgPSBjb25maWdUYWcuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkUGx1Z2luSW5mbyhGaWxlIHNvdXJjZSwgUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm8pIHsKLQkJdHJ5IHsKLQkJCURvY3VtZW50IGRvY3VtZW50ID0gWE1MVXRpbC5sb2FkWG1sKHNvdXJjZSk7Ci0JCQlFbGVtZW50IHJvb3QgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQotCQkJRWxlbWVudCBwbHVnaW5UYWcgPSBudWxsOwotCQkJaWYgKHJvb3QuZ2V0VGFnTmFtZSgpLmVxdWFscygib3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4iKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCXBsdWdpblRhZyA9IHJvb3Q7Ci0JCQl9IGVsc2UgewotCQkJCU5vZGVMaXN0IG5vZGVzID0gcm9vdAotCQkJCQkJLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKG5vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJCQlwbHVnaW5UYWcgPSAoRWxlbWVudCkgbm9kZXMuaXRlbSgwKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChwbHVnaW5UYWcgIT0gbnVsbCkgewotCQkJCWluZm8ubmFtZSA9IHBsdWdpblRhZy5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWluZm8udmVyc2lvbiA9IExpYnJhcnlEb2N1bWVudC5nZXRDaGlsZFZhbHVlKHBsdWdpblRhZywKLQkJCQkJCSJ2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmZvLmJyaWVmX2Rlc2MgPSBMaWJyYXJ5RG9jdW1lbnQuZ2V0Q2hpbGRWYWx1ZShwbHVnaW5UYWcsCi0JCQkJCQkiYnJpZWZEZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW5mby5hdXRob3JzID0gTGlicmFyeURvY3VtZW50LmdldENoaWxkVmFsdWUocGx1Z2luVGFnLAotCQkJCQkJImF1dGhvcnMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWluZm8uY2hhbmdlRGF0ZSA9IExpYnJhcnlEb2N1bWVudC5nZXRDaGlsZFZhbHVlKHBsdWdpblRhZywKLQkJCQkJCSJjaGFuZ2VEYXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmZvLnVybCA9IHNvdXJjZS50b1N0cmluZygpOwotCi0JCQkJLy8gR2V0IHRoZSBiYXNlIHBsdWctaW5zLgotCQkJCU5vZGVMaXN0IG5vZGVzID0gcGx1Z2luVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJiYXNlcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJCQlTdHJpbmcgZ3VpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX2hyZWYpOwotCi0JCQkJCWludCBpbmR4ID0gZ3VpZC5pbmRleE9mKCIjIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGluZHggPiAwKSB7Ci0JCQkJCQlndWlkID0gZ3VpZC5zdWJzdHJpbmcoaW5keCArIDEpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaW5keCA9IGd1aWQuaW5kZXhPZigidW1hOi8vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChpbmR4ID49IDApIHsKLQkJCQkJCQlndWlkID0gZ3VpZC5zdWJzdHJpbmcoaW5keCArIDYpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWluZm8udXNlZFBsdWdpbnMuYWRkKGd1aWQpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZEV4aXN0aW5nUGx1Z2luSW5mbyhQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbykgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCUxpc3QgcGx1Z2lucyA9IChsaWJyYXJ5ID09IG51bGwpID8gbmV3IEFycmF5TGlzdCgpIDogbGlicmFyeQotCQkJCS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQlpZiAocGx1Z2luLmdldEd1aWQoKS5lcXVhbHMoaW5mby5ndWlkKSkgewotCQkJCWluZm8uZXhpc3RpbmdQbHVnaW4gPSBwbHVnaW47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZEV4aXN0aW5nQ29uZmlnSW5mbyhQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbyBpbmZvKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25zKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJaWYgKGNvbmZpZ3MgPT0gbnVsbCB8fCBjb25maWdzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gY29uZmlnc1tpXTsKLQkJCWlmIChjb25maWcuZ2V0R3VpZCgpLmVxdWFscyhpbmZvLmd1aWQpKSB7Ci0JCQkJaW5mby5leGlzdGluZ0NvbmZpZyA9IGNvbmZpZzsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcGxhY2VzIHRoZSBndWlkIG9mIHRoZSBvbGQgbWV0aG9kIGxpYnJhcnkgd2l0aCB0aGUgbmV3IG9uZS4KLQkgKiA8cD4KLQkgKiBTZWFyY2ggZm9yIHRoZSBmb2xsb3dpbmcgZmlsZXM6IGxpYnJhcnkueG1pLCBwbHVnaW4ueG1pLCBtb2RlbC54bWkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpeExpYnJhcnlHdWlkKEZpbGUgcGF0aCwgU3RyaW5nIG9sZEd1aWQsIFN0cmluZyBuZXdHdWlkKSB7Ci0JCWlmICghcGF0aC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlGaWxlW10gZmlsZXMgPSBwYXRoLmxpc3RGaWxlcyhuZXcgRmlsZUZpbHRlcigpIHsKLQotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZikgewotCi0JCQkJaWYgKGYuaXNEaXJlY3RvcnkoKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IGYuZ2V0TmFtZSgpOwotCQkJCXJldHVybiBuYW1lLmVxdWFscygibGlicmFyeS54bWkiKSB8fCBuYW1lLmVxdWFscygicGx1Z2luLnhtaSIpIHx8IG5hbWUuZXF1YWxzKCJtb2RlbC54bWkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJfSk7Ci0KLQkJaWYgKGZpbGVzID09IG51bGwgfHwgZmlsZXMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJZml4TGlicmFyeUd1aWQoZmlsZXNbaV0sIG9sZEd1aWQsIG5ld0d1aWQpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBSZWFkIGluIHRoZSBmaWxlLCB1cGRhdGUgaXQgYW5kIHNhdmUgdGhlIGZpbGUuCi0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIHNvdXJjZSA9IEZpbGVVdGlsLnJlYWRGaWxlKGZpbGVzW2ldLAotCQkJCQkJCUZpbGVVdGlsLkVOQ09ESU5HX1VURl84KS50b1N0cmluZygpOwotCQkJCQlpZiAoc291cmNlLmluZGV4T2Yob2xkR3VpZCkgPj0gMCkgewotCQkJCQkJLy8gVE9ETzogVGhpcyBpcyBhIHJlZ2V4cCByZXBhbGNlbWVudCwgaXMgaXQgc2FmZT8KLQkJCQkJCXNvdXJjZSA9IHNvdXJjZS5yZXBsYWNlQWxsKG9sZEd1aWQsIG5ld0d1aWQpOwotCi0JCQkJCQlGaWxlVXRpbC53cml0ZVVURjhGaWxlKGZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpLAotCQkJCQkJCQlzb3VyY2UpOwotCQkJCQl9Ci0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBtZXJnZShMaWJyYXJ5RG9jdW1lbnQgdGFyZ2V0TGliRG9jKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy9Db3B5IGZpbGVzIG9ubHkgYXMgbmV3TWVyZ2VTY2hlbWUgPSB0cnVlCi0JCWlmICghIGltcG9ydEVudHJpZXModGFyZ2V0TGliRG9jKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJUmVzb3VyY2UgcmVzMCA9IGxpYi5lUmVzb3VyY2UoKTsKLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01ncjAgPSAoUmVzb3VyY2VNYW5hZ2VyKSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRSZXNvdXJjZU1hbmFnZXIocmVzMCk7Ci0JCVJlc291cmNlU2V0IHJlc1NldCA9IHJlczAuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCi0JCW1lcmdlUGx1Z2lucyh0YXJnZXRMaWJEb2MsIGxpYiwgcmVzTWdyMCwgcmVzU2V0KTsJCQotCQltZXJnZUNvbmZpZ3ModGFyZ2V0TGliRG9jLCBsaWIsIHJlc01ncjAsIHJlc1NldCk7Ci0JCQotCQlsaWIuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQotCQlzYXZlKGxpYiwgbnVsbCk7CQkJCQotCQkKLQkJLy9maXhMaWJyYXJ5R3VpZCh0YXJnZXRMaWJEb2MuZ2V0RmlsZSgpLmdldFBhcmVudEZpbGUoKSwgaW1wb3J0aW5nTGliRG9jCi0JCS8vCQkuZ2V0TGlicmFyeUd1aWQoKSwgdGFyZ2V0TGliRG9jLmdldExpYnJhcnlHdWlkKCkpOwotCQkKLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkKLQkJaWYgKCEgaXNDaGVja0Jhc2VQbHVnaW5zKCkpIHsKLQkJCWxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCUxpYnJhcnlVdGlsLmxvYWRBbGwobGliKTsKLQkJCUxpc3Q8TWV0aG9kUGx1Z2luPiBtaXNzaW5nQmFzZVBsdWdpbnMgPSBjb2xsZWN0TWlzc2luZ0Jhc2VQbHVnaW5zKGxpYik7Ci0JCQlMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGNvbmZpZ3MgPSBsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ly8gY29sbGVjdEltcG9ydGVkQ29uZmlndXJhdGlvbnMobGliKTsJCQkKLQkJCWNoZWNrTW9kaWZ5KGNvbmZpZ3MpOwotCQkJaWYgKCEgbWlzc2luZ0Jhc2VQbHVnaW5zLmlzRW1wdHkoKSB8fCAhIGNvbmZpZ3MuaXNFbXB0eSgpKSB7CQkJCi0JCQkJbGliLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwkJCQkKLQkJCQlTZXQ8UmVzb3VyY2U+IHJlc291cmVzVG9TYXZlID0gbmV3IExpbmtlZEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCQkJY29sbGVjdFJlc291cmNlc3RvU2F2ZShyZXNvdXJlc1RvU2F2ZSwgbWlzc2luZ0Jhc2VQbHVnaW5zKTsKLQkJCQljb2xsZWN0UmVzb3VyY2VzdG9TYXZlKHJlc291cmVzVG9TYXZlLCBjb25maWdzKTsKLQkJCQlzYXZlKGxpYiwgcmVzb3VyZXNUb1NhdmUpOwkJCQkKLQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlb3BlbkN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja01vZGlmeShMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGNvbmZpZ3MpIHsKLQkJaWYgKGNvbmZpZ3MgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZpbmFsIExpc3QgY29uZmlnRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb25maWdzLmdldChpKTsKLQkJCVJlc291cmNlIHJlcyA9IGNvbmZpZy5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXMgIT0gbnVsbCkgewotCQkJCVN0cmluZyBmaWxlID0gcmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJCWNvbmZpZ0ZpbGVzLmFkZChmaWxlKTsKLQkJCX0KLQkJfQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBGaWxlTW9kaWZ5Q2hlY2tlci5jaGVja01vZGlmeShjb25maWdGaWxlcyk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIExpc3Q8TWV0aG9kUGx1Z2luPiBjb2xsZWN0TWlzc2luZ0Jhc2VQbHVnaW5zKE1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiByZXQgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4oKTsKLQkJCi0JCU1hcCBtYXAgPSBNZXRob2RFbGVtZW50VXRpbC5idWlsZE1hcChsaWIuZ2V0TWV0aG9kUGx1Z2lucygpKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKGluZm8uc2VsZWN0ZWQgKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIG1hcC5nZXQoaW5mby5ndWlkKTsKLQkJCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCQkJTGlzdDxNZXRob2RQbHVnaW4+IGJhc2VzID0gcGx1Z2luLmdldEJhc2VzKCk7Ci0JCQkJCWZvciAoaW50IGk9MDsgaSA8IGJhc2VzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlNZXRob2RQbHVnaW4gYmFzZSA9IGJhc2VzLmdldChpKTsKLQkJCQkJCWlmICghIG1hcC5jb250YWluc0tleShiYXNlLmdldEd1aWQoKSkpIHsKLQkJCQkJCQlyZXQuYWRkKHBsdWdpbik7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiByZXQ7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgY29sbGVjdFJlc291cmNlc3RvU2F2ZShTZXQ8UmVzb3VyY2U+IHJlc291cmNlcywgTGlzdDw/IGV4dGVuZHMgTWV0aG9kRWxlbWVudD4gZWxlbWVudHMpIHsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwgfHwgZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0JCQotCQlmb3IgKGludCBpPTA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJY29sbGVjdFJlc291cmNlc3RvU2F2ZShyZXNvdXJjZXMsIGVsZW1lbnRzLmdldChpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RSZXNvdXJjZXN0b1NhdmUoU2V0PFJlc291cmNlPiByZXNvdXJjZXMsIE1ldGhvZEVsZW1lbnQgcGFyZW50KSB7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsJCQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBhcmVudC5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCVJlc291cmNlIHJlcyA9IGVsZW1lbnQuZVJlc291cmNlKCk7Ci0JCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJCXJlc291cmNlcy5hZGQocmVzKTsKLQkJCQkJcmVzLnNldE1vZGlmaWVkKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlSZXNvdXJjZSByZXMgPSBwYXJlbnQuZVJlc291cmNlKCk7Ci0JCXJlc291cmNlcy5hZGQocmVzKTsKLQkJcmVzLnNldE1vZGlmaWVkKHRydWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2F2ZShJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyLCBTZXQ8UmVzb3VyY2U+IHJlc291cmVzVG9TYXZlKSAKLQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChyZXNvdXJlc1RvU2F2ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChJdGVyYXRvcjxSZXNvdXJjZT4gaXQgPSByZXNvdXJlc1RvU2F2ZS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgaXQubmV4dCgpOwotCQkJdHJ5IHsKLQkJCQlpZiAoISByZXMuaXNTeW5jaHJvbml6ZWQoKSkgewotCQkJCQlyZXMubG9hZChyZXMuZ2V0UmVzb3VyY2VTZXQoKS5nZXRMb2FkT3B0aW9ucygpKTsKLQkJCQl9Ci0JCQkJcGVyc2lzdGVyLnNhdmUocmVzKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQkKLQotCXByaXZhdGUgdm9pZCBzYXZlKE1ldGhvZExpYnJhcnkgbGliLCBTZXQ8UmVzb3VyY2U+IHJlc291cmVzVG9TYXZlKSB7Ci0JCS8vTGlicmFyeVV0aWwuc2F2ZUxpYnJhcnkobGliLCBmYWxzZSwgZmFsc2UpOwotCQkKLQkJLy9UaGlzIGlzIHRlbXAsIGFuZCBjYW4gYmUgcmV2b212ZWQgYWZ0ZXIgYSBmaXggaXMgZG9uZSBmb3IgcGFzc2luZyBwZXJzaXN0ZXIncyBvcHRpb24gdG8gc2F2ZQotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBsaWIuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJTWFwIGRlZmF1bHRTYXZlT3B0aW9ucyA9IHJlc291cmNlU2V0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQlPYmplY3Qgb2xkRGVmYXVsdE9wdGlvblZhbCA9IGRlZmF1bHRTYXZlT3B0aW9ucy5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMpOwotCQkKLQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJTWFwIHNhdmVPcHRpb25zID0gcGVyc2lzdGVyLmdldFNhdmVPcHRpb25zKCk7Ci0JCWlmICghIGlzQ2hlY2tCYXNlUGx1Z2lucygpICYmIHJlc291cmVzVG9TYXZlICE9IG51bGwpIHsKLQkJCXNhdmVPcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5ESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUywgQm9vbGVhbi5UUlVFKTsKLQkJCWRlZmF1bHRTYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMsIEJvb2xlYW4uVFJVRSk7Ci0JCX0KLQotCQl0cnkgewotCQkJc2F2ZShwZXJzaXN0ZXIsIHJlc291cmVzVG9TYXZlKTsKLQkJCXBlcnNpc3Rlci5zYXZlKGxpYi5lUmVzb3VyY2UoKSk7Ci0JCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQotCQl9IGZpbmFsbHkgewotCQkJaWYgKCEgaXNDaGVja0Jhc2VQbHVnaW5zKCkgJiYgcmVzb3VyZXNUb1NhdmUgIT0gbnVsbCkgewkJCQkKLQkJCQlpZiAob2xkRGVmYXVsdE9wdGlvblZhbCA9PSBudWxsKSB7Ci0JCQkJCWRlZmF1bHRTYXZlT3B0aW9ucy5yZW1vdmUoTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRlZmF1bHRTYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMsIG9sZERlZmF1bHRPcHRpb25WYWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBtZXJnZVBsdWdpbnMoTGlicmFyeURvY3VtZW50IHRhcmdldExpYkRvYywgTWV0aG9kTGlicmFyeSBsaWIsIFJlc291cmNlTWFuYWdlciByZXNNZ3IwLCBSZXNvdXJjZVNldCByZXNTZXQpIHsKLQkJTGlzdCBleGlzdGluZ1BsdWdpbkd1aWRzID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKGluZm8uc2VsZWN0ZWQgJiYgaW5mby5leGlzdGluZ1BsdWdpbiAhPSBudWxsKSB7Ci0JCQkJaWYgKGV4aXN0aW5nUGx1Z2luR3VpZHMgPT0gbnVsbCkgewotCQkJCQlleGlzdGluZ1BsdWdpbkd1aWRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCX0KLQkJCQlleGlzdGluZ1BsdWdpbkd1aWRzLmFkZChpbmZvLmd1aWQpOwotCQkJfQotCQl9Ci0JCQotCQlNYXAgcGdUb1JnTWFwID0gaW1wb3J0aW5nTGliRG9jLmJ1aWxkUGx1Z2luR3VpZFRvUmVzTWdyR3VpZE1hcChleGlzdGluZ1BsdWdpbkd1aWRzKTsJCQkJCi0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBpdC5uZXh0KCk7Ci0JCQlpZiAoaW5mby5zZWxlY3RlZCAmJiBpbmZvLmV4aXN0aW5nUGx1Z2luID09IG51bGwpIHsKLQkJCQltZXJnZUVsZW1lbnQoaW5mby5ndWlkLCB0YXJnZXRMaWJEb2MsIGxpYiwgcmVzTWdyMCwgcmVzU2V0LCBsaWIuZ2V0TWV0aG9kUGx1Z2lucygpKTsKLQkJCX0gZWxzZSBpZiAoaW5mby5zZWxlY3RlZCAmJiBwZ1RvUmdNYXAgIT0gbnVsbCkgewkvLzE1MTc4NgotCQkJCVJlc291cmNlIHJlcyA9IGluZm8uZXhpc3RpbmdQbHVnaW4uZVJlc291cmNlKCk7Ci0JCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IChSZXNvdXJjZU1hbmFnZXIpIE11bHRpRmlsZVNhdmVVdGlsLmdldFJlc291cmNlTWFuYWdlcihyZXMpOwotCQkJCVN0cmluZyBleGlzdGluZ0d1aWQgPSByZXNNZ3IuZ2V0R3VpZCgpOwotCQkJCVN0cmluZyBpbXBvcnRlZEd1aWQgPSAoU3RyaW5nKSBwZ1RvUmdNYXAuZ2V0KGluZm8uZ3VpZCk7Ci0JCQkJaWYgKGltcG9ydGVkR3VpZCAhPSBudWxsICYmICFpbXBvcnRlZEd1aWQuZXF1YWxzKGV4aXN0aW5nR3VpZCkpIHsKLQkJCQkJcmVzTWdyLnNldEd1aWQoaW1wb3J0ZWRHdWlkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG1lcmdlQ29uZmlncyhMaWJyYXJ5RG9jdW1lbnQgdGFyZ2V0TGliRG9jLCBNZXRob2RMaWJyYXJ5IGxpYiwgUmVzb3VyY2VNYW5hZ2VyIHJlc01ncjAsIFJlc291cmNlU2V0IHJlc1NldCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRDb25maWdzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8gaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKGluZm8uc2VsZWN0ZWQgJiYgaW5mby5leGlzdGluZ0NvbmZpZyA9PSBudWxsKSB7Ci0JCQkJbWVyZ2VFbGVtZW50KGluZm8uZ3VpZCwgdGFyZ2V0TGliRG9jLCBsaWIsIHJlc01ncjAsIHJlc1NldCwgbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpKTsKLQkJCX0JCQkJCQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBtZXJnZUVsZW1lbnQoU3RyaW5nIGd1aWQsIExpYnJhcnlEb2N1bWVudCB0YXJnZXRMaWJEb2MsIAotCQkJTWV0aG9kTGlicmFyeSBsaWIsIFJlc291cmNlTWFuYWdlciByZXNNZ3IwLCBSZXNvdXJjZVNldCByZXNTZXQsIExpc3QgZWxlbWVudHMpewotCQlTdHJpbmcgc3JjX3VyaSA9IGltcG9ydGluZ0xpYkRvYy5nZXRSZXNvdXJjZVVyaShndWlkKTsKLQkJaWYgKHNyY191cmkgPT0gbnVsbCB8fCBzcmNfdXJpLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQkvL0ZpbGUgdGFyZ2V0X2ZpbGUgPSB0YXJnZXRMaWJEb2MuZ2V0RmlsZUZyb21Vcmkoc3JjX3VyaSk7Ci0JCUZpbGUgdGFyZ2V0X2ZpbGUgPSB0YXJnZXRGaWxlTWFwLmdldChndWlkKTsKLQkJCi0JCVN0cmluZyBwYXRoID0gdGFyZ2V0X2ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkocGF0aCk7Ci0JCVJlc291cmNlIHJlcyA9IHJlc1NldC5nZXRSZXNvdXJjZSh1cmksIHRydWUpOwotCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXMpOwotCQllbGVtZW50cy5hZGQoZWxlbWVudCk7CQkKLQkJCi0JCU11bHRpRmlsZVNhdmVVdGlsLnJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcihyZXNNZ3IwLCBlbGVtZW50LCB1cmkpOwotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gKFJlc291cmNlTWFuYWdlcikgTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UmVzb3VyY2VNYW5hZ2VyKHJlcyk7Ci0JCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJcmVzTWdyMC5nZXRTdWJNYW5hZ2VycygpLmFkZChyZXNNZ3IpOwotCQl9Ci0JfQkJCi0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29uZmlnSW5mb0Zyb21GaWxlcygpIHsJCi0JCUZpbGUgY29waWVkTGliUGF0aCA9IHVwR3JhZGVJbmZvID09IG51bGwgPyBudWxsIDogdXBHcmFkZUluZm8uZ2V0Q29waWVkTGliRmlsZSgpOwotCQlGaWxlIGltcG9ydGluZ0xpYlBhdGggPSBjb3BpZWRMaWJQYXRoID09IG51bGwgPyBuZXcgRmlsZShkYXRhLmxsRGF0YS5nZXRQYXJlbnRGb2xkZXIoKQotCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyBMaWJyYXJ5RG9jdW1lbnQuZXhwb3J0RmlsZSkgOiBjb3BpZWRMaWJQYXRoOwotCQlGaWxlIGNvbmZpZ0RpciA9IG5ldyBGaWxlKGltcG9ydGluZ0xpYlBhdGguZ2V0UGFyZW50KCksIE11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FKTsKLQkJCi0JCUxpYnJhcnlEb2N1bWVudC5Db25maWdEb2NWaXNpdG9yIHZpc2l0b3IgPSBuZXcgTGlicmFyeURvY3VtZW50LkNvbmZpZ0RvY1Zpc2l0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2aXNpdChGaWxlIGZpbGUsIEVsZW1lbnQgbm9kZSkgewotCQkJCVBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvIGNpID0gZGF0YS5uZXcgQ29uZmlndWFyYXRpb25JbmZvKCk7Ci0JCQkJY2kuZ3VpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX2d1aWQpOwotCQkJCWNpLm5hbWUgPSBub2RlLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHVyaSA9IE11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlLmdldE5hbWUoKTsKLQkJCQlpbXBvcnRpbmdMaWJEb2MuYWRkVG9HdWlkVG9VcmlNYXAoY2kuZ3VpZCwgdXJpKTsKLQkJCQlkYXRhLmdldENvbmZpZ3MoKS5hZGQoY2kpOwotCQkJCS8vIENoZWNrIHdpdGggdGhlIGN1cnJlbnQgbGlicmFyeSwgZ2V0IHRoZSByZWxhdGVkIGluZm9ybWF0aW9uLgotCQkJCWxvYWRFeGlzdGluZ0NvbmZpZ0luZm8oY2kpOwotCQkJCWlmIChjaS5leGlzdGluZ0NvbmZpZyAhPSBudWxsKSB7Ci0JCQkJCVVSSSByZXNVcmkgPSBjaS5leGlzdGluZ0NvbmZpZy5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKLQkJCQkJdXJpID0gTXVsdGlGaWxlU2F2ZVV0aWwuTUVUSE9EX0NPTkZJR1VSQVRJT05fRk9MREVSX05BTUUgKyBGaWxlLnNlcGFyYXRvciArIHJlc1VyaS5sYXN0U2VnbWVudCgpOwotCQkJCQl1cmkgPSB0YXJnZXRMaWJEb2MuZGVjb2RlVXJpKHVyaSk7Ci0JCQkJCXRhcmdldExpYkRvYy5hZGRUb0d1aWRUb1VyaU1hcChjaS5ndWlkLCB1cmkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJCi0JCUxpYnJhcnlEb2N1bWVudC52aXNpdENvbmZpZ0ZpbGVzKGNvbmZpZ0RpciwgdmlzaXRvcik7CQkJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZW5zdXJlVW5pcXVlTmFtZXMoTGlzdCBlbGVtZW50cykgewotCQlpZiAoZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJTWFwIG5hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpPTA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnRzLmdldChpKTsKLQkJCW5hbWVNYXAucHV0KGVsZW0uZ2V0TmFtZSgpLnRvVXBwZXJDYXNlKCksIGVsZW0pOwotCQl9Ci0JCQotCQlMaXN0IGltcG9ydGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBpbXBvcnRlZEV4aXN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGVsZW1lbnRzLmdldCgwKSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGl0Lm5leHQoKTsKLQkJCQlpZiAoaW5mby5zZWxlY3RlZCkgewotCQkJCQlpZiAoaW5mby5leGlzdGluZ1BsdWdpbiA9PSBudWxsIHx8IAotCQkJCQkJCSFpbmZvLmV4aXN0aW5nUGx1Z2luLmdldE5hbWUoKS5lcXVhbHMoaW5mby5uYW1lKSkgewotCQkJCQkJaW1wb3J0ZWRMaXN0LmFkZChpbmZvLm5hbWUpOwotCQkJCQkJaWYgKGluZm8uZXhpc3RpbmdQbHVnaW4gIT0gbnVsbCkgewotCQkJCQkJCWltcG9ydGVkRXhpc3RMaXN0LmFkZChpbmZvKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldENvbmZpZ3MoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8gaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbykgaXQubmV4dCgpOwotCQkJCWlmIChpbmZvLnNlbGVjdGVkKSB7Ci0JCQkJCWlmIChpbmZvLmV4aXN0aW5nQ29uZmlnID09IG51bGwgfHwgCi0JCQkJCQkJIWluZm8uZXhpc3RpbmdDb25maWcuZ2V0TmFtZSgpLmVxdWFscyhpbmZvLm5hbWUpKSB7Ci0JCQkJCQlpbXBvcnRlZExpc3QuYWRkKGluZm8ubmFtZSk7Ci0JCQkJCQlpZiAoaW5mby5leGlzdGluZ0NvbmZpZyAhPSBudWxsKSB7Ci0JCQkJCQkJaW1wb3J0ZWRFeGlzdExpc3QuYWRkKGluZm8pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQkJCQkKLQkJCX0KLQkJfQotCQlmb3IgKGludCBpPTA7IGk8aW1wb3J0ZWRMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGltcG9ydGVkTGlzdC5nZXQoaSk7Ci0JCQlTdHJpbmcgcmVuYW1lZCA9IG5hbWU7Ci0JCQl3aGlsZSAobmFtZU1hcC5jb250YWluc0tleShyZW5hbWVkLnRvVXBwZXJDYXNlKCkpKSB7Ci0JCQkJcmVuYW1lZCArPSAiX3JlbmFtZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAocmVuYW1lZCAhPSBuYW1lKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gKE1ldGhvZEVsZW1lbnQpIG5hbWVNYXAuZ2V0KG5hbWUudG9VcHBlckNhc2UoKSk7Ci0JCQkJTGlicmFyeVZpZXcucnVuUmVuYW1lKGVsZW0sIHJlbmFtZWQpOwotCQkJfQkJCQotCQl9CQkJCQotCQlmb3IgKGludCBpPTA7IGk8aW1wb3J0ZWRFeGlzdExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBpbmZvID0gaW1wb3J0ZWRFeGlzdExpc3QuZ2V0KGkpOwotCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gaW5mbyBpbnN0YW5jZW9mIFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyA/IAotCQkJCQkoTWV0aG9kRWxlbWVudCkoKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaW5mbykuZXhpc3RpbmdQbHVnaW4gOgotCQkJCQkoTWV0aG9kRWxlbWVudCkoKFBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvKSBpbmZvKS5leGlzdGluZ0NvbmZpZzsKLQkJCVN0cmluZyBuZXdOYW1lID0gaW5mbyBpbnN0YW5jZW9mIFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyA/IAotCQkJCQkoU3RyaW5nKSgoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBpbmZvKS5uYW1lIDoKLQkJCQkJKFN0cmluZykoKFBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvKSBpbmZvKS5uYW1lOwkJCQkJCQkJCi0JCQlMaWJyYXJ5Vmlldy5ydW5SZW5hbWUoZWxlbSwgbmV3TmFtZSk7CQkKLQkJfQkKLQkJCi0JCQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBGaWxlIGdldFRhcmdldEZpbGUoZmluYWwgTWV0aG9kTGlicmFyeSBsaWIsIFN0cmluZyBndWlkKSB7Ci0JCUZpbGUgcGFyZW50ID0gbnVsbDsKLQkJZmluYWwgRmlsZVtdIHBmaWxlcyA9IG5ldyBGaWxlWzFdOyAKLQkJZmluYWwgSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gKElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudFBlcnNpc3RlcigpOwotCQlDb25maWd1YXJhdGlvbkluZm8gY2luZm8gPSBkYXRhLmdldENvbmZpZ0luZm8oZ3VpZCk7Ci0JCWlmIChjaW5mbyAhPSBudWxsKSB7Ci0JCQlGaWxlIGZpbGUgPSBnZXRSZXNvdXJjZUZpbGUoY2luZm8uZXhpc3RpbmdDb25maWcpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBmaWxlOwotCQkJfQotCQkJaWYgKGRlZmF1bHRDb25maWdGb2xkZXIgPT0gbnVsbCkgewotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJcGZpbGVzWzBdID0gcGVyc2lzdGVyLmdldERlZmF1bHRNZXRob2RDb25maWd1cmF0aW9uRm9sZGVyKGxpYik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlwYXJlbnQgPSBwZmlsZXNbMF07Ci0JCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlkZWZhdWx0Q29uZmlnRm9sZGVyID0gcGFyZW50OwotCQkJfSBlbHNlIHsKLQkJCQlwYXJlbnQgPSBkZWZhdWx0Q29uZmlnRm9sZGVyOwotCQkJfQotCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBkZWZhdWx0Q29uZmlnRm9sZGVyOiAiICsgcGFyZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJUGx1Z2luSW5mbyBwaW5mbyA9IGRhdGEuZ2V0UGx1Z2luSW5mbyhndWlkKTsKLQkJCWlmIChwaW5mbyAhPSBudWxsKSB7Ci0JCQkJRmlsZSBmaWxlID0gZ2V0UmVzb3VyY2VGaWxlKHBpbmZvLmV4aXN0aW5nUGx1Z2luKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBmaWxlOwotCQkJCX0KLQkJCQlwYXJlbnQgPSBwZXJzaXN0ZXIuY3JlYXRlTWV0aG9kUGx1Z2luRm9sZGVyKHBpbmZvLm5hbWUsIGxpYik7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGZpbGVOYW1lID0gY2luZm8gPT0gbnVsbCA/IE11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfUExVR0lOX01PREVMX0ZJTEVOQU1FIDogCi0JCQkJCQkJCQljaW5mby5uYW1lICsgTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTjsJCi0JCXJldHVybiBuZXcgRmlsZShwYXJlbnQsIGZpbGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NoZWNrQmFzZVBsdWdpbnMoKSB7Ci0JCXJldHVybiBjaGVja0Jhc2VQbHVnaW5zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoZWNrQmFzZVBsdWdpbnMoYm9vbGVhbiBjaGVja0Jhc2VQbHVnaW5zKSB7Ci0JCXRoaXMuY2hlY2tCYXNlUGx1Z2lucyA9IGNoZWNrQmFzZVBsdWdpbnM7Ci0JfQotCQotCXByaXZhdGUgRmlsZSBnZXRSZXNvdXJjZUZpbGUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVJlc291cmNlIHJlcyA9IGVsZW1lbnQuZVJlc291cmNlKCk7Ci0JCVVSSSB1cmkgPSByZXMuZ2V0VVJJKCk7Ci0JCXJldHVybiBuZXcgRmlsZSh1cmkudG9GaWxlU3RyaW5nKCkpOwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL1Jlc291cmNlU2Nhbm5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9SZXNvdXJjZVNjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYzOWJiMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL1Jlc291cmNlU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLQotLyoqCi0gKiB1dGlsaXR5IGNsYXNzIHRvIHNjYW4gYW5kIGNvcHkgcmVzb3VyY2VzIGZyb20gdGhlIHNvdXJjZSBsaWJyYXJ5IHRvIHRoZSB0YXJnZXQgbGlicmFyeQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVNjYW5uZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfc3JjX3JlZiA9IFBhdHRlcm4uY29tcGlsZSgic3JjXFxzKj1cXHMqXCIoLio/KVwiIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0vLwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9saW5rX3JlZiA9IFBhdHRlcm4uY29tcGlsZSgiPGFcXHMrPyhbXj5dKik+KC4qPyk8L2E+IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfaHJlZl9yZWYgPSBQYXR0ZXJuLmNvbXBpbGUoImhyZWZcXHMqPVxccypcIiguKj8pXCIiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCUZpbGUgc3JjTGliUm9vdDsKLQlGaWxlIHRhcmdldExpYlJvb3Q7Ci0JCi0JcHJpdmF0ZSBNYXAgbmV3RmlsZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBNYXAgZXhpc3RpbmdGaWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQlNYXA8U3RyaW5nLCBTdHJpbmc+IHJlbmFtZVBsdWdpbk1hcDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwkKLQlwdWJsaWMgUmVzb3VyY2VTY2FubmVyKEZpbGUgc3JjTGliUm9vdCwgRmlsZSB0YXJnZXRMaWJSb290LCBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlbmFtZVBsdWdpbk1hcCkgewotCQl0aGlzLnNyY0xpYlJvb3QgPSBzcmNMaWJSb290OwotCQl0aGlzLnRhcmdldExpYlJvb3QgPSB0YXJnZXRMaWJSb290OwotCQl0aGlzLnJlbmFtZVBsdWdpbk1hcCA9IHJlbmFtZVBsdWdpbk1hcDsKLQl9Ci0JCi0JLyoqCi0JICogc2NhbiB0aCBldGV4dCBhbmQgY29weSB0aGUgcmVzb3VyY2VzCi0JICogQHBhcmFtIG93bmVyIE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gc291cmNlIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNjYW4oTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIHNvdXJjZSkgewotCQkKLQkJdHJ5Ci0JCXsKLQkJCS8vIHByb2Nlc3MgaW1hZ2VzIGFuZCBvdGhlciBzcmMgcmVzb3VyY2VzCi0JCQlNYXRjaGVyIG0gPSBwX3NyY19yZWYubWF0Y2hlcihzb3VyY2UpOwotCQkJd2hpbGUgKCBtLmZpbmQoKSApCi0JCQl7Ci0JCQkJU3RyaW5nIHVybCA9IG0uZ3JvdXAoMSk7Ci0JCQkJcHJvY2Vzc1VybChvd25lciwgdXJsKTsKLQkJCX0KLQotCQkJLy8gcHJvY2VzcyBocmVmcwotCQkJbSA9IHBfaHJlZl9yZWYubWF0Y2hlcihzb3VyY2UpOwotCQkJCi0JCQl3aGlsZSAoIG0uZmluZCgpICkKLQkJCXsKLQkJCQlTdHJpbmcgdXJsID0gbS5ncm91cCgxKTsKLQkJCQlwcm9jZXNzVXJsKG93bmVyLCB1cmwpOwotCQkJfQkJCQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpCi0JCXsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIHByb2Nlc3MgdGhlIHVybCBhbmQgY29weSB0aGUgcmVzb3VyY2UKLQkgKiBpZiB0aGUgb3duZXIgZWxlbWVudCBpcyBzcGVjaWZpZWQsIHRoZSB1cmwgaXMgcmVsYXRpdmUgdG8gdGhlIG93bmVyIGVsZW1lbnQsIAotCSAqb3RoZXJ3aXNlIGl0J3MgcmVsYXRpdmUgdG8gdGhlIGxpYnJhcnkKLQkgKgotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSB1cmwKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1VybChNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgdXJsKSB7Ci0JCXByb2Nlc3NVcmwob3duZXIsIHVybCwgbnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwcm9jZXNzVXJsKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyB1cmwsIE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJCi0JCWlmICggdXJsID09IG51bGwgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWludCBpbmRleCA9IHVybC5pbmRleE9mKCIjIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCBpbmRleCA+PSAwICkKLQkJewotCQkJdXJsID0gdXJsLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCX0KLQkJCi0JCWluZGV4ID0gdXJsLmluZGV4T2YoIj8iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIGluZGV4ID49IDAgKQotCQl7Ci0JCQl1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJfQotCQkKLQkJaWYgKHVybC50cmltKCkubGVuZ3RoKCkgPT0gMCApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gdGhlIHVybCBpcyByZWxhdGl2ZSB0byB0aGUgb3duZXIgZWxlbWVudAotCQkvLyBuZWVkIHRvIGNvbnZlcnQgdG8gdGhlIHBhdGggcmVsYXRpdmUgdG8gdGhlIGxpYnJhcnkgcm9vdAotCQlGaWxlIHNyY0ZpbGUgPSBudWxsOwotCQlGaWxlIHRhcmdldEZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKCBvd25lciAhPSBudWxsICkgewotCQkJCUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIGxpYlJlc01nciA9IFJlc291cmNlSGVscGVyLmdldFJlc291cmNlTWdyKG93bmVyKTsKLQkJCQlTdHJpbmcgZWxlbWVudFBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChvd25lcik7Ci0JCQkJLy9zcmNGaWxlID0gbmV3IEZpbGUobmV3IEZpbGUoc3JjTGliUm9vdCwgZWxlbWVudFBhdGgpLCB1cmwpOwotCQkJCS8vaWYgKCFzcmNGaWxlLmlzRmlsZSgpIHx8ICFzcmNGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWVsZW1lbnRQYXRoID0gZ2V0RWxlbWVudFBhdGhXaXRoUmVuYW1lZFBsdWdpbihlbGVtZW50UGF0aCk7Ci0JCQkJCXNyY0ZpbGUgPSBuZXcgRmlsZShuZXcgRmlsZShzcmNMaWJSb290LCBlbGVtZW50UGF0aCksIHVybCk7Ci0JCQkJLy99Ci0JCQkJaWYgKCFzcmNGaWxlLmlzRmlsZSgpIHx8ICFzcmNGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCXVybCA9IE5ldFV0aWwuZGVjb2RlVVJMKHVybCk7Ci0JCQkJCXNyY0ZpbGUgPSBuZXcgRmlsZShuZXcgRmlsZShzcmNMaWJSb290LCBlbGVtZW50UGF0aCksIHVybCk7Ci0JCQkJfQotCQkJCS8vdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKG5ldyBGaWxlKHRhcmdldExpYlJvb3QsIGVsZW1lbnRQYXRoKSwgdXJsKTsKLQkJCQlTdHJpbmcgcGx1Z2luUGF0aCA9IGxpYlJlc01nci5nZXRQaHlzaWNhbFBsdWdpblBhdGgob3duZXIpOwotCQkJCUZpbGUgdGFyZ2V0Um9vdCA9IChuZXcgRmlsZShwbHVnaW5QYXRoKSkuZ2V0UGFyZW50RmlsZSgpOwotCQkJCXRhcmdldEZpbGUgPSBuZXcgRmlsZShuZXcgRmlsZSh0YXJnZXRSb290LCBlbGVtZW50UGF0aCksIHVybCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCQl9CQkJCi0JCQkJRmlsZSBzcmNQbHVnaW5Sb290ID0gbmV3IEZpbGUoc3JjTGliUm9vdCwgcGx1Z2luLmdldE5hbWUoKSk7Ci0JCQkJc3JjRmlsZSA9IG5ldyBGaWxlKHNyY1BsdWdpblJvb3QsIHVybCk7Ci0JCQkJaWYgKCFzcmNGaWxlLmlzRmlsZSgpIHx8ICFzcmNGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCXVybCA9IE5ldFV0aWwuZGVjb2RlVVJMKHVybCk7Ci0JCQkJCXNyY0ZpbGUgPSBuZXcgRmlsZShzcmNQbHVnaW5Sb290LCB1cmwpOwotCQkJCX0KLQkJCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciBsaWJSZXNNZ3IgPSBSZXNvdXJjZUhlbHBlci5nZXRSZXNvdXJjZU1ncihwbHVnaW4pOwkJCQkKLQkJCQlTdHJpbmcgc3JjUGx1Z2luUm9vdFBhdGggPSBsaWJSZXNNZ3IuZ2V0UGh5c2ljYWxQbHVnaW5QYXRoKHBsdWdpbik7CQotCQkJCXRhcmdldEZpbGUgPSBuZXcgRmlsZShzcmNQbHVnaW5Sb290UGF0aCwgdXJsKTsJCQkJCi0JCQl9Ci0JCQkKLQkJCWlmICggc3JjRmlsZS5pc0ZpbGUoKSAmJiBzcmNGaWxlLmV4aXN0cygpICkgewotCi0JCQkJc3JjRmlsZSA9IHNyY0ZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpOwotCQkJCXRhcmdldEZpbGUgPSB0YXJnZXRGaWxlLmdldENhbm9uaWNhbEZpbGUoKTsKLQkJCQkKLQkJCQlpZiAoIHRhcmdldEZpbGUuZXhpc3RzKCkgKSB7Ci0JCQkJCWlmICggIWV4aXN0aW5nRmlsZU1hcC5jb250YWluc0tleShzcmNGaWxlKSApIHsKLQkJCQkJCWlmICggc3JjRmlsZS5sZW5ndGgoKSAhPSB0YXJnZXRGaWxlLmxlbmd0aCgpIAotCQkJCQkJCQl8fCBzcmNGaWxlLmxhc3RNb2RpZmllZCgpICE9IHRhcmdldEZpbGUubGFzdE1vZGlmaWVkKCkgKQotCQkJCQkJewotCQkJCQkJCWV4aXN0aW5nRmlsZU1hcC5wdXQoc3JjRmlsZSwgdGFyZ2V0RmlsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoICFuZXdGaWxlTWFwLmNvbnRhaW5zS2V5KHNyY0ZpbGUpICkgewotCQkJCQkJbmV3RmlsZU1hcC5wdXQoc3JjRmlsZSwgdGFyZ2V0RmlsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIExvZyB0aGUgZXJyb3IgYW5kIHByb2NlZWQuIFRPRE8KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEVsZW1lbnRQYXRoV2l0aFJlbmFtZWRQbHVnaW4oU3RyaW5nIGVsZW1lbnRQYXRoKSB7Ci0JCWlmIChyZW5hbWVQbHVnaW5NYXAgIT0gbnVsbCAmJiAhIHJlbmFtZVBsdWdpbk1hcC5pc0VtcHR5KCkpIHsKLQkJCWludCBpeCA9IGVsZW1lbnRQYXRoLmluZGV4T2YoIlxcIik7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKGl4ID4gMCkgewotCQkJCVN0cmluZyBiYXNlUGx1Z2luTmFtZSA9ICBlbGVtZW50UGF0aC5zdWJzdHJpbmcoMCwgaXgpOwotCQkJCVN0cmluZyBpbXBvcnRQbHVnaW5OYW1lID0gcmVuYW1lUGx1Z2luTWFwLmdldChiYXNlUGx1Z2luTmFtZSk7Ci0JCQkJaWYgKGltcG9ydFBsdWdpbk5hbWUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gaW1wb3J0UGx1Z2luTmFtZSArIGVsZW1lbnRQYXRoLnN1YnN0cmluZyhpeCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50UGF0aDsKLQl9Ci0JCi0JLyoqCi0JICogQ29waWVzIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlSZXNvdXJjZShTdHJpbmcgdXJsLCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCXByb2Nlc3NVcmwobnVsbCwgdXJsLCBwbHVnaW4pOwotCX0KLQkKLQkvKioKLQkgKiBDb3BpZXMgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHZvaWQgY29weVJlc291cmNlKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyB1cmwpIHsKLQkJcHJvY2Vzc1VybChvd25lciwgdXJsKTsKLQl9Ci0JCi0JLyoqCi0JICogcmV0dXJuIGEgbGlzdCBvZiBhbGwgdGhlIGZpbGVzIHRvIGJlIHJlcGxhY2VkCi0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiBmaWxlIHBhdGggc3RyaW5nCi0JICovCi0JcHVibGljIExpc3QgZ2V0RmlsZXNUb2JlUmVwbGFjZWQoKSB7Ci0JCUxpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICggZXhpc3RpbmdGaWxlTWFwLnNpemUoKSA+IDAgKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZXhpc3RpbmdGaWxlTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJRmlsZSBmID0gKEZpbGUpaXQubmV4dCgpOwotCQkJCWlmIChmICE9IG51bGwgKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gZi5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQkJaWYgKCAhZmlsZXMuY29udGFpbnMocGF0aCkgKSB7Ci0JCQkJCQlmaWxlcy5hZGQocGF0aCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmaWxlczsKLQl9Ci0JCi0JLyoqCi0JICogY29weSBhbGwgdGhlIGZpbGVzIHRvIHRoZSBkZXN0aW5hdGlvbgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBuZXdGaWxlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpaXQubmV4dCgpOwotCQkJRmlsZSBzcmNGaWxlID0gKEZpbGUpIGVudHJ5LmdldEtleSgpOwotCQkJRmlsZSB0YXJnZXRGaWxlID0gKEZpbGUpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlGaWxlVXRpbC5jb3B5RmlsZShzcmNGaWxlLCB0YXJnZXRGaWxlKTsKLQkJfQkKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBleGlzdGluZ0ZpbGVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSlpdC5uZXh0KCk7Ci0JCQlGaWxlIHNyY0ZpbGUgPSAoRmlsZSkgZW50cnkuZ2V0S2V5KCk7Ci0JCQlGaWxlIHRhcmdldEZpbGUgPSAoRmlsZSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNyY0ZpbGUsIHRhcmdldEZpbGUpOwotCQl9CQotCX0KLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYjExMTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBhbmQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBtZXRob2QgcGx1Zy1pbiBhbmQgY29uZmlndXJhdGlvbiBpbXBvcnQgc2VydmljZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0RpZmZSZXBvcnRDb250ZW50UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9EaWZmUmVwb3J0Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZjc2NDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0RpZmZSZXBvcnRDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuRWxlbWVudERpZmZUcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogVGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBkaWZmIHJlcG9ydC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpZmZSZXBvcnRDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaWZmUmVwb3J0Q29udGVudFByb3ZpZGVyKCkgewotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnREaWZmVHJlZSkgewotCQkJCi0JCQlNZXRob2RFbGVtZW50IGUgPSAoKEVsZW1lbnREaWZmVHJlZSlpbnB1dEVsZW1lbnQpLmdldEJhc2VFbGVtZW50KCk7Ci0JCQkKLQkJCS8vIGRvbid0IHNob3cgc3ViLXBhY2thZ2VzIHVuZGVyIHByb2Nlc3MgY29tcG9uZW50LCBoaWRlIHRoZSBwcm9jZXNzIGRldGlhbAotCQkJaWYgKCAoZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpICkgewotCQkJCXJldHVybiBuZXcgT2JqZWN0W10ge307Ci0JCQl9Ci0KLQkJCUxpc3QgaXRlbXMgPSAoKEVsZW1lbnREaWZmVHJlZSkgaW5wdXRFbGVtZW50KS5nZXRDaGlsZHJlbigpOwotCQkJaWYgKGl0ZW1zICE9IG51bGwpIHsKLQkJCQlMaXN0IGRpcnR5SXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJRWxlbWVudERpZmZUcmVlIGl0ZW0gPSAoRWxlbWVudERpZmZUcmVlKSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChpdGVtLmlzT2xkT25seSgpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gMTUwODk1SW1wb3J0IENvbmZpZzogQ3VzdG9tQ2F0ZWdvcnkgZGlkIG5vdCBzeW5jIHVwIGJ5IGltcG9ydAotCQkJCQkvLyB0byBmaXggdGhpcyBwcm9ibGVtLCB3ZSBuZWVkIHRvIGluY2x1ZGUgdGhlIEhpZGRlbiByb290IGN1c3RvbUNhdGVnb3J5IHBhY2thZ2UgCi0JCQkJCS8vIGJ1dCBuZWVkIHRvIGhpZGUgaGVyZQotCQkJCQlNZXRob2RFbGVtZW50IGJhc2UgPSBpdGVtLmdldEJhc2VFbGVtZW50KCk7Ci0JCQkJCWlmICggKGJhc2UgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSAKLQkJCQkJCQkmJiBUbmdVdGlsLmlzUm9vdEN1dG9tQ2F0ZWdvcnlQYWNrYWdlKChNZXRob2RQYWNrYWdlKWJhc2UpICkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWRpcnR5SXRlbXMuYWRkKGl0ZW0pOwotCQkJCX0KLQotCQkJCXJldHVybiBkaXJ0eUl0ZW1zLnRvQXJyYXkoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHt9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudHMocGFyZW50RWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudERpZmZUcmVlKSB7Ci0JCQlyZXR1cm4gKChFbGVtZW50RGlmZlRyZWUpIGVsZW1lbnQpLmdldFBhcmVudCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudERpZmZUcmVlKSB7Ci0JCQlyZXR1cm4gKChFbGVtZW50RGlmZlRyZWUpIGVsZW1lbnQpLmhhc0NoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0RpZmZSZXBvcnRMYWJlbFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvRGlmZlJlcG9ydExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBjOWZjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvRGlmZlJlcG9ydExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5FbGVtZW50RGlmZlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0vKioKLSAqIFRoZSBsYWJlbCBwcm92aWRlciBmb3IgdGhlIGRpZmYgcmVwb3J0LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlmZlJlcG9ydExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciwKLQkJSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaWZmUmVwb3J0TGFiZWxQcm92aWRlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2VGcm9tT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCXJldHVybiB0aGlzLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFbGVtZW50RGlmZlRyZWUpIHsKLQkJCUVsZW1lbnREaWZmVHJlZSBkaWZmVHJlZSA9IChFbGVtZW50RGlmZlRyZWUpIG9iamVjdDsKLQkJCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCQkJcmV0dXJuIGRpZmZUcmVlLmdldE5hbWUoKTsKLQotCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKSB7Ci0JCQkJcmV0dXJuIGRpZmZUcmVlLmdldENvbnRlbnRUeXBlKCk7Ci0JCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDIpIHsKLQkJCQlyZXR1cm4gKGRpZmZUcmVlLmdldEltcG9ydEVsZW1lbnQoKSA9PSBudWxsKSA/ICIiIDogSW1wb3J0UmVzb3VyY2VzLkRpZmZSZXBvcnRMYWJlbFByb3ZpZGVyX3llczsgLy8kTk9OLU5MUy0xJAkJCQotIAotCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAzKSB7Ci0JCQkJcmV0dXJuIChkaWZmVHJlZS5nZXRCYXNlRWxlbWVudCgpID09IG51bGwpID8gIiIgOiBJbXBvcnRSZXNvdXJjZXMuRGlmZlJlcG9ydExhYmVsUHJvdmlkZXJfeWVzOyAvLyROT04tTkxTLTEkCQkKLSAKLQkJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gNCkgewotCQkJCXJldHVybiBkaWZmVHJlZS5nZXREaWZmTWVzc2FnZSgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb2x1bW5UZXh0KG9iamVjdCwgMCk7Ci0JfQotCi0JLyoqCi0JICogU2luY2Ugd2Ugd29uJ3QgZXZlciBnZW5lcmF0ZSB0aGVzZSBub3RpZmljYXRpb25zLCB3ZSBjYW4ganVzdCBpZ25vcmUKLQkgKiB0aGlzLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQl9Ci0KLQkvKioKLQkgKiBTaW5jZSB3ZSB3b24ndCBldmVyIGFkZCBsaXN0ZW5lcnMsIHdlIGNhbiBqdXN0IGlnbm9yZSB0aGlzLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQl9Ci0KLQkvKioKLQkgKiBBbHdheXMgcmV0dXJucyB0cnVlIGZvciBub3cuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBvYmplY3QsIFN0cmluZyBpZCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0RpZmZSZXBvcnRWaWV3ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9EaWZmUmVwb3J0Vmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZjY0MDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0RpZmZSZXBvcnRWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgYmVmb3JlIGFuZCBhZnRlciBtZXRob2QgbGlicmFyeSBkaWZmZXJlbmNlcyBmb3IgYW4gaW1wb3J0Ci0gKiBvcGVyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpZmZSZXBvcnRWaWV3ZXIgewotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlwcm90ZWN0ZWQgQ2hlY2tib3hUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlDb25maWd1cmF0aW9uSW1wb3J0RGF0YSBkYXRhOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JRGlmZlJlcG9ydFZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBDb25maWd1cmF0aW9uSW1wb3J0RGF0YSBkYXRhKSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLmRhdGEgPSBkYXRhOwotCQkKLQkJdHJlZVZpZXdlciA9IG5ldyBDaGVja2JveFRyZWVWaWV3ZXIocGFyZW50KTsKLQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkKLQkJCQkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBEaWZmUmVwb3J0Q29udGVudFByb3ZpZGVyKCkpOwotCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IERpZmZSZXBvcnRMYWJlbFByb3ZpZGVyKCkpOwotCQljcmVhdGVUYWJsZUNvbHVtbnMoKTsKLQkJCi0JCWFkZExpc3RlbmVycygpOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWJsZSBjb2x1bW5zLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUYWJsZUNvbHVtbnMoKSB7Ci0JCVRyZWUgdHJlZSA9IHRyZWVWaWV3ZXIuZ2V0VHJlZSgpOwotCQl0cmVlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRyZWUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0JCVRyZWVDb2x1bW4gY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUsIDApOwotCQljb2x1bW4uc2V0VGV4dChJbXBvcnRSZXNvdXJjZXMuRGlmZlJlcG9ydFZpZXdlcl9jb250ZW50KTsgCi0JCWNvbHVtbi5zZXRXaWR0aCgyMDApOwotCi0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FLCAxKTsKLQkJY29sdW1uLnNldFRleHQoSW1wb3J0UmVzb3VyY2VzLkRpZmZSZXBvcnRWaWV3ZXJfdHlwZSk7IAotCQljb2x1bW4uc2V0V2lkdGgoMTUwKTsKLQotCQljb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSwgMik7Ci0JCWNvbHVtbi5zZXRUZXh0KEltcG9ydFJlc291cmNlcy5EaWZmUmVwb3J0Vmlld2VyX2luX2ltcG9ydCk7IAotCQljb2x1bW4uc2V0V2lkdGgoNzUpOwotCi0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FLCAzKTsKLQkJY29sdW1uLnNldFRleHQoSW1wb3J0UmVzb3VyY2VzLkRpZmZSZXBvcnRWaWV3ZXJfaW5fbGliKTsgCi0JCWNvbHVtbi5zZXRXaWR0aCg3NSk7Ci0KLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUsIDQpOwotCQljb2x1bW4uc2V0VGV4dChJbXBvcnRSZXNvdXJjZXMuRGlmZlJlcG9ydFZpZXdlcl9zdGF0dXMpOyAKLQkJY29sdW1uLnNldFdpZHRoKDEwMCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIHJldml3LgotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dSZXBvcnQoT2JqZWN0IGlucHV0KSB7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldFZpc2libGUoZmFsc2UpOwotCQl0cmVlVmlld2VyLnNldElucHV0KGlucHV0KTsKLQkJc2V0Q2hlY2tTdGF0ZXMoKTsKLQkJdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQkvLyBhZGQgYSBjaGVjayBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXIKLQkJdHJlZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJYm9vbGVhbiBjaGVja2VkID0gZXZlbnQuZ2V0Q2hlY2tlZCgpOwotCQkJCXVwZGF0ZUNoZWNrU3RhdGVzKGV2ZW50LmdldEVsZW1lbnQoKSwgY2hlY2tlZCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2hlY2tTdGF0ZXMoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gY2hlY2tlZCkgewotCi0JCS8vIE9iamVjdCBlbGVtZW50ID0gZXZlbnQuZ2V0RWxlbWVudCgpOwotCi0JCWlmIChjaGVja2VkID09IHRydWUpIHsKLQkJCUlUcmVlQ29udGVudFByb3ZpZGVyIGNwID0gKElUcmVlQ29udGVudFByb3ZpZGVyKSB0cmVlVmlld2VyCi0JCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCWNoZWNrUGFyZW50KGNwLCBlbGVtZW50KTsKLQkJCS8vIHRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChlbGVtZW50LCB0cnVlKTsKLQkJfQotCQllbHNlCi0JCQl0cmVlVmlld2VyLnNldENoZWNrZWQoZWxlbWVudCwgZmFsc2UpOwotCQkJCi0JCXNlbGVjdGlvbkNoaWxkcmVuKGVsZW1lbnQsIGNoZWNrZWQpOwotCi0JCXNldERhdGEodHJlZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjaGVja2VkCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gY2hlY2tlZCkgewotCQlJVHJlZUNvbnRlbnRQcm92aWRlciBjcCA9IChJVHJlZUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlcgotCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJT2JqZWN0W10gY2hpbGRzID0gY3AuZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cmVlVmlld2VyLnNldENoZWNrZWQoY2hpbGRzW2ldLCBjaGVja2VkKTsKLQkJCXNlbGVjdGlvbkNoaWxkcmVuKGNoaWxkc1tpXSwgY2hlY2tlZCk7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBjaGVja1BhcmVudChJVHJlZUNvbnRlbnRQcm92aWRlciBjcCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSAvKgotCQkJCQkJCQkJCQkJCQkJCSAqIHx8IGVsZW1lbnQgPT0KLQkJCQkJCQkJCQkJCQkJCQkgKiBjdXJyZW50Um9vdE5vZGUKLQkJCQkJCQkJCQkJCQkJCQkgKi8pIHsKLQkJCXJldHVybjsKLQkJfQotCQlPYmplY3QgcGFyZW50ID0gTGlicmFyeVV0aWwudW53cmFwKGNwLmdldFBhcmVudChlbGVtZW50KSk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKHBhcmVudCwgdHJ1ZSk7Ci0JCQkvLyBjb25maWdGYWN0b3J5LmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuYWRkKChFT2JqZWN0KXBhcmVudCwKLQkJCS8vIGZhbHNlKTsKLQkJCWNoZWNrUGFyZW50KGNwLCBwYXJlbnQpOwotCQl9Ci0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldENoZWNrU3RhdGVzKCkgewotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJdHJ5IHsKLQkJCU9iamVjdCBlbGVtZW50ID0gdHJlZVZpZXdlci5nZXRJbnB1dCgpOwotCQkJc2VsZWN0aW9uQ2hpbGRyZW4oZWxlbWVudCwgdHJ1ZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0KLQkJc2V0RGF0YSh0cmVlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldERhdGEoT2JqZWN0W10gc2VscykgewotCQlpZiAoIHNlbHMgPT0gbnVsbCApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJZGF0YS5pbXBvcnRMaXN0LmNsZWFyKCk7Ci0JCWZvciAoIGludCBpID0gMDsgaSA8IHNlbHMubGVuZ3RoOyBpKysgKSB7Ci0JCQlkYXRhLmltcG9ydExpc3QuYWRkKHNlbHNbaV0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0ltcG9ydENvbmZpZ1JlcG9ydFBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRDb25maWdSZXBvcnRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZWIzYzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0ltcG9ydENvbmZpZ1JlcG9ydFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IGRpc3BsYXlzIHRoZSByZXN1bHQgb2YgYW4gaW1wb3J0IG9wZXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydENvbmZpZ1JlcG9ydFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlIGltcG9ydGluZ1NlcnZpY2U7Ci0KLQlEaWZmUmVwb3J0Vmlld2VyIHZpZXdlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEltcG9ydENvbmZpZ1JlcG9ydFBhZ2UoQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UgaW1wb3J0aW5nU2VydmljZSkgewotCQlzdXBlcihJbXBvcnRSZXNvdXJjZXMuSW1wb3J0Q29uZmlnUmVwb3J0UGFnZV90aXRsZSk7Ci0JCXRoaXMuaW1wb3J0aW5nU2VydmljZSA9IGltcG9ydGluZ1NlcnZpY2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgKLQkJCQl8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpKTsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USAotCQkJCXwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCkpOwotCi0JCXZpZXdlciA9IG5ldyBEaWZmUmVwb3J0Vmlld2VyKGNvbnRhaW5lciwgaW1wb3J0aW5nU2VydmljZQotCQkJCS5nZXRJbXBvcnREYXRhKCkpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQotCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFNob3cgcmVzdWx0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dSZXN1bHQoKSB7Ci0JCS8vIEFuYWx5emUgdGhlIGltcG9ydGluZyBjb25maWd1cmF0aW9uIGFuZCByZXBvcnQgcmVzdWx0LgotCQlpbXBvcnRpbmdTZXJ2aWNlLmFuYWx5emUobnVsbCk7Ci0KLQkJdmlld2VyLnNob3dSZXBvcnQoaW1wb3J0aW5nU2VydmljZS5nZXREaWZmVHJlZSgpKTsKLQotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0ltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA5YWFhNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuU2F2ZUFsbEVkaXRvcnNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5MaWJyYXJ5QmFja3VwVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEEgd2l6YXJkIHRoYXQgaW1wb3J0cyBleHBvcnRlZCBsaWJyYXJ5IGNvbmZpZ3VyYXRpb25zIGludG8gdGhlIGN1cnJlbnQgbWV0aG9kCi0gKiBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElJbXBvcnRXaXphcmQgewotCi0JcHVibGljIGJvb2xlYW4gb2tUb0NvbXBsZXRlID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZSBwYWdlMTsKLQotCXByb3RlY3RlZCBTZWxlY3RDb25maWdzVG9JbXBvcnQgY29uZmlnUGFnZTsKLQotCXByb3RlY3RlZCBTZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZSBzcGVjc1BhZ2U7Ci0KLQlwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbkltcG9ydERhdGEgZGF0YSA9IG5ldyBDb25maWd1cmF0aW9uSW1wb3J0RGF0YSgpOwotCi0JcHJvdGVjdGVkIENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UoCi0JCQlkYXRhKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQoKSB7Ci0JCXNldFdpbmRvd1RpdGxlKEltcG9ydFJlc291cmNlcy5pbXBvcnRDb25maWdXaXphcmRfdGl0bGUpOwotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChJV29ya2JlbmNoLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJSUZpbGVNYW5hZ2VyIGZpbGVNZ3IgPSBTZXJ2aWNlcy5nZXRGaWxlTWFuYWdlcigpOwotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpICE9IG51bGwpIHsKLQkJCWZpbGVNZ3IuY2hlY2tNb2RpZnkoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKS5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQkudG9GaWxlU3RyaW5nKCksIE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSk7Ci0JCX0KLQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwgJiYgbWFuYWdlci5pc01ldGhvZExpYnJhcnlSZWFkT25seSgpKSB7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJSW1wb3J0UmVzb3VyY2VzLmltcG9ydENvbmZpZ1dpemFyZF90aXRsZSwKLQkJCQkJSW1wb3J0UmVzb3VyY2VzLkltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfcmVhZG9ubHkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU2F2ZUFsbEVkaXRvcnNQYWdlLmFkZFBhZ2VJZk5lZWRlZCh0aGlzLCB0cnVlLCBudWxsLCBudWxsLCBJbXBvcnRQbHVnaW4KLQkJCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmdWxsL3dpemJhbi9JbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlwYWdlMSA9IG5ldyBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlKGRhdGEsIHNlcnZpY2UpOwotCQlhZGRQYWdlKHBhZ2UxKTsKLQotCQljb25maWdQYWdlID0gbmV3IFNlbGVjdENvbmZpZ3NUb0ltcG9ydChzZXJ2aWNlKTsKLQkJYWRkUGFnZShjb25maWdQYWdlKTsKLQotCQlzcGVjc1BhZ2UgPSBuZXcgU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2UoZGF0YSk7Ci0JCWFkZFBhZ2Uoc3BlY3NQYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLQkJc3VwZXIuY3JlYXRlUGFnZUNvbnRyb2xzKHBhZ2VDb250YWluZXIpOwotCQlwYWdlQ29udGFpbmVyLmdldFNoZWxsKCkuc2V0SW1hZ2UoCi0JCQkJTGlicmFyeVVJSW1hZ2VzLklNR19NRVRIT0RfQ09ORklHVVJBVE9OKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2NhbkZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlyZXR1cm4gb2tUb0NvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJLy8gUHJvbXB0IHRoZSB1c2VyIHRvIGJhY2sgdXAgbGlicmFyeS4KLQkJTGlicmFyeUJhY2t1cFV0aWwucHJvbXB0QmFja3VwQ3VycmVudExpYnJhcnkobnVsbCwgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKSk7Ci0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gU3RhcnQgdGhlIGltcG9ydC4KLQkJCQkJbW9uaXRvci5iZWdpblRhc2soCi0JCQkJCQkJSW1wb3J0UmVzb3VyY2VzLkltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfTVNHMSwKLQkJCQkJCQlJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOwotCQkJCQlzZXJ2aWNlLnBlcmZvcm1JbXBvcnQobW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgZmFsc2UsIG9wKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVRocm93YWJsZSByZWFsRXhjZXB0aW9uID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlJbXBvcnRSZXNvdXJjZXMuSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9lcnJvciwKLQkJCQkJcmVhbEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gU2F2ZSB0aGUgaW1wb3J0IHBhdGggdG8gcHJlZmVyZW5jZSBzdG9yZS4KLQkJSW1wb3J0VUlQcmVmZXJlbmNlcy5hZGRJbXBvcnRDb25maWdEaXIoZGF0YS5sbERhdGEuZ2V0UGFyZW50Rm9sZGVyKCkpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0ltcG9ydFBsdWdpbldpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0ltcG9ydFBsdWdpbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWRjZTMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRQbHVnaW5XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TYXZlQWxsRWRpdG9yc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLlBsdWdpbkltcG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uUGx1Z2luRGVwSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTGlicmFyeUJhY2t1cFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEEgd2l6YXJkIHRoYXQgaW1wb3J0cyBhbiBleHBvcnRlZCBtZXRob2QgcGx1Zy1pbnMgaW50byB0aGUgY3VycnJlbnQgbWV0aG9kCi0gKiBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0UGx1Z2luV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCB7Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlIHBhZ2UxOwotCi0JcHJvdGVjdGVkIFNlbGVjdFBsdWdpbnNUb0ltcG9ydCBwYWdlMjsKLQotCXByb3RlY3RlZCBQbHVnaW5JbXBvcnREYXRhIGRhdGEgPSBuZXcgUGx1Z2luSW1wb3J0RGF0YSgpOwotCi0JcHJvdGVjdGVkIFBsdWdpbkltcG9ydGluZ1NlcnZpY2Ugc2VydmljZSA9IG5ldyBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlKGRhdGEpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSW1wb3J0UGx1Z2luV2l6YXJkKCkgewotCQlzZXRXaW5kb3dUaXRsZShJbXBvcnRSZXNvdXJjZXMuaW1wb3J0UGx1Z2luc1dpemFyZF90aXRsZSk7Ci0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQkvLyBjaGVjayBvdXQgdGhlIGxpYnJhcnkgZmlyc3QKLQkJSUZpbGVNYW5hZ2VyIGZpbGVNZ3IgPSBTZXJ2aWNlcy5nZXRGaWxlTWFuYWdlcigpOwotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpICE9IG51bGwpIHsKLQkJCWZpbGVNZ3IuY2hlY2tNb2RpZnkoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKS5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQkudG9GaWxlU3RyaW5nKCksIE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSk7Ci0JCX0KLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsICYmIG1hbmFnZXIuaXNNZXRob2RMaWJyYXJ5UmVhZE9ubHkoKSkgewotCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUltcG9ydFJlc291cmNlcy5pbXBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlLAotCQkJCQlJbXBvcnRSZXNvdXJjZXMuSW1wb3J0UGx1Z2luV2l6YXJkX3JlYWRvbmx5KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVNhdmVBbGxFZGl0b3JzUGFnZS5hZGRQYWdlSWZOZWVkZWQodGhpcywgdHJ1ZSwgbnVsbCwgbnVsbCwgSW1wb3J0UGx1Z2luCi0JCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC93aXpiYW4vSW1wb3J0TWV0aG9kUGx1Z2lucy5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlwYWdlMSA9IG5ldyBTZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2UoZGF0YSwgc2VydmljZSk7Ci0JCWFkZFBhZ2UocGFnZTEpOwotCi0JCXBhZ2UyID0gbmV3IFNlbGVjdFBsdWdpbnNUb0ltcG9ydChkYXRhLCBzZXJ2aWNlKTsKLQkJYWRkUGFnZShwYWdlMik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKExpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX1BMVUdJTik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJaWYgKHRoaXMuZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKSAhPSBwYWdlMikKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHBhZ2UyLmlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQkvLyBDaGVjayBpZiB0aGUgc2VsZWN0ZWQgcGx1Zy1pbnMgYXJlIHVwZGF0YWJsZSBvciBub3QuCi0JCVBsdWdpbk1vZGlmeUluZm8gbW9kaWZ5SW5mbyA9IGNoZWNrTW9kaWZ5KCk7Ci0KLQkJLy8gaWYgb25seSBsb2NrZWQsIHdlIGNhbiBhdXRvLXVubG9jayBhbmQgcmVsb2NrIHRoZSBwbHVnaW5zCi0JCS8vIGlmIHRoZSBwbHVpbiBpcyByZWFkb25seSwgdXNlciBuZWVkIHRvIG1hbnVhbGx5IG1ha2UgaXQgdXBkYXRhYmxlCi0JCS8vIGN1c3RvbWVycyBuZWVkIHRvIG1hbnVhbGx5IHVubG9jayBhbmQgbG9jayBwbHVnaW5zCi0JCS8vIGR1cmluZyBjb250ZW50IGxpYnJhcnkgdXBncmFkZQotCi0JCWlmIChtb2RpZnlJbmZvLnJlYWRvbmx5UGx1Z2lucy5zaXplKCkgPiAwKSB7Ci0JCQkvLyBEaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UuCi0JCQlTdHJpbmcgZXJyb3IgPSBtb2RpZnlJbmZvLmdldFJlYWRvbmx5TWVzc2FnZSgpLnRvU3RyaW5nKCk7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJSW1wb3J0UmVzb3VyY2VzLkltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfZXJyb3IsIGVycm9yKTsKLQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm87Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKChpbmZvLmV4aXN0aW5nUGx1Z2luICE9IG51bGwpICYmIGluZm8uc2VsZWN0ZWQpIHsKLQkJCQlpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkgewotCQkJCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWJ1ZmZlci5hcHBlbmQoIlx0IikuYXBwZW5kKGluZm8ubmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCWlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0JCQlib29sZWFuIHllcyA9IEltcG9ydFBsdWdpbgotCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQlJbXBvcnRSZXNvdXJjZXMuaW1wb3J0UGx1Z2luc1dpemFyZF90aXRsZSwKLQkJCQkJCQlOTFMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlJbXBvcnRSZXNvdXJjZXMuSW1wb3J0UGx1Z2luV2l6YXJkX3dhcm5fZXhpc3RpbmdfcGx1Z2lucywKLQkJCQkJCQkJCQkJYnVmZmVyLnRvU3RyaW5nKCkpKTsKLQotCQkJaWYgKCF5ZXMpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQkvLyBhbGxvdyB1c2VyIHRvIHByb2NlZWQgd2l0aCBsb2NrZWQgcGx1Z2lucwotCQlpZiAobW9kaWZ5SW5mby5sb2NrZWRQbHVnaW5zLnNpemUoKSA+IDApIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gbW9kaWZ5SW5mby5nZXRMb2NrZWRNZXNzYWdlKCkudG9TdHJpbmcoKQotCQkJCQkrIEltcG9ydFJlc291cmNlcy5JbXBvcnRQbHVnaW5XaXphcmRfY29uZmlybV9jb250aW51ZTsKLQkJCWJvb2xlYW4geWVzID0gSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQlJbXBvcnRSZXNvdXJjZXMuaW1wb3J0UGx1Z2luc1dpemFyZF90aXRsZSwgbWVzc2FnZSk7Ci0JCQlpZiAoIXllcykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCS8vIFByb21wdCB1c2VyIHRvIGJhY2sgdXAgbGlicmFyeS4KLQkJTGlicmFyeUJhY2t1cFV0aWwucHJvbXB0QmFja3VwQ3VycmVudExpYnJhcnkobnVsbCwgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKSk7Ci0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5iZWdpblRhc2soSW1wb3J0UmVzb3VyY2VzLkltcG9ydFBsdWdpbldpemFyZF9NU0cxLAotCQkJCQkJCUlQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0KLQkJCQkJLy8gU3RhcnQgdGhlIGltcG9ydC4KLQkJCQkJc2VydmljZS5wZXJmb3JtSW1wb3J0KG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIGZhbHNlLCBvcCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgcmVhbEV4Y2VwdGlvbiA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJSW1wb3J0UmVzb3VyY2VzLkltcG9ydFBsdWdpbldpemFyZF9lcnJvciwgCi0JCQkJCXJlYWxFeGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQljaGVja1BsdWdpbkNpcmN1bGFyRGVwZW5kZW5jeSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCS8vIFNhdmUgdGhlIGltcG9ydCBwYXRoIHRvIHByZWZlcmVuY2Ugc3RvcmUuCi0JCUltcG9ydFVJUHJlZmVyZW5jZXMuYWRkSW1wb3J0UGx1Z2luRGlyKGRhdGEubGxEYXRhLmdldFBhcmVudEZvbGRlcigpKTsKLQotCQlJbXBvcnRVSVByZWZlcmVuY2VzLnNldENoZWNrQmFzZVBsdWdpbnMoc2VydmljZS5pc0NoZWNrQmFzZVBsdWdpbnMoKSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBQbHVnaW5Nb2RpZnlJbmZvIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgUGx1Z2luTW9kaWZ5SW5mbyBjaGVja01vZGlmeSgpIHsKLQkJLy8gU3RyaW5nQnVmZmVyIGVycm9yID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlQbHVnaW5Nb2RpZnlJbmZvIG1vZGlmeUluZm8gPSBuZXcgUGx1Z2luTW9kaWZ5SW5mbygpOwotCi0JCVBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGl0Lm5leHQoKTsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBpbmZvLmV4aXN0aW5nUGx1Z2luOwotCQkJaWYgKChwbHVnaW4gIT0gbnVsbCkgJiYgaW5mby5zZWxlY3RlZCkgewotCQkJCWlmIChwbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKS5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZSkgewotCQkJCQkvLyBUaGUgcGx1Zy1pbiBpcyBsb2NrZWQKLQkJCQkJbW9kaWZ5SW5mby5sb2NrZWRQbHVnaW5zLmFkZChwbHVnaW4pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIFRoZSBwbHVnLWluIGV4aXN0cyBpbiB0aGUgY3VycmVudCBsaWJyYXJ5LCBtYWtlIHN1cmUgdGhlCi0JCQkJCS8vIHBsdWctaW4gaXMgdXBkYXRhYmxlLgotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KHBsdWdpbiwgZ2V0U2hlbGwoKSk7Ci0JCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJbW9kaWZ5SW5mby5yZWFkb25seVBsdWdpbnMuYWRkKHBsdWdpbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbW9kaWZ5SW5mbzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tQbHVnaW5DaXJjdWxhckRlcGVuZGVuY3koKSB7Ci0JCVBsdWdpbkRlcGVuZGVuY3lJbmZvTWdyIG1nciA9IG5ldyBQbHVnaW5EZXBlbmRlbmN5SW5mb01ncigKLQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQlQbHVnaW5EZXBlbmRlbmN5SW5mb01nci5DaGVja1Jlc3VsdCByZXN1bHQgPSBtZ3IKLQkJCQkuY2hlY2tDaXJjdWxhckRlcGVuZG5lY3kobnVsbCwgZmFsc2UpOwotCQlpZiAocmVzdWx0LmNpcmN1bGFyTGlzdCAhPSBudWxsICYmICFyZXN1bHQuY2lyY3VsYXJMaXN0LmlzRW1wdHkoKSkgewotCQkJTGlzdCBjaXJQbHVnaW5zID0gKExpc3QpIHJlc3VsdC5jaXJjdWxhckxpc3QuZ2V0KDApOwotCQkJU3RyaW5nIG1zZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNpclBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlQbHVnaW5EZXBJbmZvIHBpbmZvID0gKFBsdWdpbkRlcEluZm8pIGNpclBsdWdpbnMuZ2V0KGkpOwotCQkJCWlmIChpICE9IDApIHsKLQkJCQkJbXNnICs9ICIsICI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJbXNnICs9IHBpbmZvLmdldFBsdWdpbigpLmdldE5hbWUoKTsKLQkJCX0KLQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheVdhcm5pbmcoCi0JCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9jaXJjdWxhcl9wbHVnaW5zLAotCQkJCQltc2cpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0ltcG9ydFVJUHJlZmVyZW5jZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRVSVByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwODI5MzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0ltcG9ydFVJUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5QcmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBJbXBvcnQgVUkgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRVSVByZWZlcmVuY2VzIHsKLQotCS8vIFRoZSBpbXBvcnQgcGx1Zy1pbiBkaXJlY3RvcmllcyBwcmVmZXJlbmNlIGtleS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX1BMVUdJTl9ESVJTID0gImltcG9ydFBsdWdpbkRpcnMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgaW1wb3J0IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3JpZXMgcHJlZmVyZW5jZSBrZXkuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9DT05GSUdfRElSUyA9ICJpbXBvcnRDb25maWdEaXJzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIGNoZWNrIGJhc2UgcGx1Zy1pbnMgcHJlZmVyZW5jZSBrZXkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19CQVNFX1BMVUdJTlMgPSAiY2hlY2tCYXNlUGx1Z2lucyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBkZWZhdWx0IGltcG9ydCBwbHVnLWluIGRpcmVjdG9yeSBuYW1lLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lNUE9SVF9QTFVHSU5fRElSX05BTUUgPSAiRXhwb3J0IiArIEZpbGVVdGlsLkZJTEVfU0VQICsgIlBsdWdpbnMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJIAotCi0JLy8gVGhlIGRlZmF1bHQgaW1wb3J0IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5IG5hbWUuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfSU1QT1JUX0NPTkZJR19ESVJfTkFNRSA9ICJFeHBvcnQiICsgRmlsZVV0aWwuRklMRV9TRVAgKyAiQ29uZmlndXJhdGlvbnMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJIAotCi0JLy8gVGhlIGRlZmF1bHQgaW1wb3J0IHBsdWctaW4gZGlyZWN0b3J5LgotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0SW1wb3J0UGx1Z2luRGlyID0gbnVsbDsKLQotCS8vIFRoZSBkZWZhdWx0IGltcG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yeS4KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdEltcG9ydENvbmZpZ0RpciA9IG51bGw7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBzcGVjaWZpYyBwcmVmZXJlbmNlIHN0b3JlLgotCXByaXZhdGUgc3RhdGljIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0Jc3RhdGljIHsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoSU1QT1JUX1BMVUdJTl9ESVJTLCBnZXREZWZhdWx0SW1wb3J0UGx1Z2luRGlyKCkpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChJTVBPUlRfQ09ORklHX0RJUlMsIGdldERlZmF1bHRJbXBvcnRDb25maWdEaXIoKSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KENIRUNLX0JBU0VfUExVR0lOUywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBpbXBvcnQgcGx1Zy1pbiBkaXJlY3RvcnkuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBpbXBvcnQgcGx1Zy1pbiBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0SW1wb3J0UGx1Z2luRGlyKCkgewotCQlpZiAoZGVmYXVsdEltcG9ydFBsdWdpbkRpciA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0SW1wb3J0UGx1Z2luRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGFwcE5hbWUgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpOwotCQkJaWYgKGFwcE5hbWUgIT0gbnVsbCAmJiBhcHBOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCWRlZmF1bHRJbXBvcnRQbHVnaW5EaXIgPSBkZWZhdWx0SW1wb3J0UGx1Z2luRGlyCi0JCQkJCQkrIEZpbGVVdGlsLkZJTEVfU0VQICsgYXBwTmFtZSArIEZpbGVVdGlsLkZJTEVfU0VQCi0JCQkJCQkrIERFRkFVTFRfSU1QT1JUX1BMVUdJTl9ESVJfTkFNRTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVmYXVsdEltcG9ydFBsdWdpbkRpciA9IGRlZmF1bHRJbXBvcnRQbHVnaW5EaXIKLQkJCQkJCSsgRmlsZVV0aWwuRklMRV9TRVAgKyBERUZBVUxUX0lNUE9SVF9QTFVHSU5fRElSX05BTUU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRJbXBvcnRQbHVnaW5EaXI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW1wb3J0IHBsdWctaW4gZGlyZWN0b3JpZXMgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRJbXBvcnRQbHVnaW5EaXJzKCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuZ2V0U3RyaW5nVmFsdWVzKHByZWZTdG9yZSwgSU1QT1JUX1BMVUdJTl9ESVJTKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbXBvcnQgcGx1Zy1pbiBkaXJlY3RvcmllcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIGltcG9ydCBwbHVnLWluIGRpcmVjdG9yaWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0SW1wb3J0UGx1Z2luRGlyc0xpc3QoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRMaXN0KHByZWZTdG9yZSwgSU1QT1JUX1BMVUdJTl9ESVJTKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgaW1wb3J0IGRpcmVjdG9yeSB0byB0aGUgaW1wb3J0IHBsdWctaW4gZGlyZWN0b3JpZXMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICBhbiBpbXBvcnQgZGlyZWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEltcG9ydFBsdWdpbkRpcihTdHJpbmcgZGlyKSB7Ci0JCVByZWZlcmVuY2VVdGlsLmFkZFRvTGlzdChwcmVmU3RvcmUsIElNUE9SVF9QTFVHSU5fRElSUywgZGlyKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IGltcG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGltcG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRJbXBvcnRDb25maWdEaXIoKSB7Ci0JCWlmIChkZWZhdWx0SW1wb3J0Q29uZmlnRGlyID09IG51bGwpIHsKLQkJCWRlZmF1bHRJbXBvcnRDb25maWdEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYXBwTmFtZSA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldEFwcGxpY2F0aW9uU2hvcnROYW1lKCk7Ci0JCQlpZiAoYXBwTmFtZSAhPSBudWxsICYmIGFwcE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZGVmYXVsdEltcG9ydENvbmZpZ0RpciA9IGRlZmF1bHRJbXBvcnRDb25maWdEaXIKLQkJCQkJCSsgRmlsZVV0aWwuRklMRV9TRVAgKyBhcHBOYW1lICsgRmlsZVV0aWwuRklMRV9TRVAKLQkJCQkJCSsgREVGQVVMVF9JTVBPUlRfQ09ORklHX0RJUl9OQU1FOwotCQkJfSBlbHNlIHsKLQkJCQlkZWZhdWx0SW1wb3J0Q29uZmlnRGlyID0gZGVmYXVsdEltcG9ydENvbmZpZ0RpcgotCQkJCQkJKyBGaWxlVXRpbC5GSUxFX1NFUCArIERFRkFVTFRfSU1QT1JUX0NPTkZJR19ESVJfTkFNRTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdEltcG9ydENvbmZpZ0RpcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbXBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcmllcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEltcG9ydENvbmZpZ0RpcnMoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRTdHJpbmdWYWx1ZXMocHJlZlN0b3JlLCBJTVBPUlRfQ09ORklHX0RJUlMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGltcG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yaWVzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgaW1wb3J0IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3JpZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRJbXBvcnRDb25maWdEaXJzTGlzdCgpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldExpc3QocHJlZlN0b3JlLCBJTVBPUlRfQ09ORklHX0RJUlMpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBpbXBvcnQgZGlyZWN0b3J5IHRvIHRoZSBpbXBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcmllcwotCSAqIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIGRpcgotCSAqICAgICAgICAgICAgYW4gaW1wb3J0IGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRJbXBvcnRDb25maWdEaXIoU3RyaW5nIGRpcikgewotCQlQcmVmZXJlbmNlVXRpbC5hZGRUb0xpc3QocHJlZlN0b3JlLCBJTVBPUlRfQ09ORklHX0RJUlMsIGRpcik7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY2hlY2sgYmFzZSBwbHVnLWlucyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Q2hlY2tCYXNlUGx1Z2lucygpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKENIRUNLX0JBU0VfUExVR0lOUyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbm90Q2hlY2tCYXNlUGx1Z2lucyBvcHRpb24gZmlsZSBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2hlY2tCYXNlUGx1Z2lucyhib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShDSEVDS19CQVNFX1BMVUdJTlMsIHZhbHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9QbHVnaW5Nb2RpZnlJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvUGx1Z2luTW9kaWZ5SW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGYyOWE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9QbHVnaW5Nb2RpZnlJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGNvbnN0cnVjdCBhIG1lc3NhZ2UgdGhhdCBsaXN0cyBhbGwgdGhlIGxvY2tlZCBvciByZWFkLW9ubHkKLSAqIG1ldGhvZCBwbHVnLWlucyBpbiB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luTW9kaWZ5SW5mbyB7Ci0KLQlwdWJsaWMgTGlzdDxNZXRob2RQbHVnaW4+IGxvY2tlZFBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4oKTsKLQotCXB1YmxpYyBMaXN0PE1ldGhvZFBsdWdpbj4gcmVhZG9ubHlQbHVnaW5zID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQbHVnaW5Nb2RpZnlJbmZvKCkgewotCX0KLQotCS8qKgotCSAqIEdldHMgYSBtZXNzYWdlIHRoYXQgbGlzdHMgYWxsIHRoZSBsb2NrZWQgbWV0aG9kIHBsdWctaW5zLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5TdHJpbmdCdWZmZXI8Y29kZT4gY29udGFpbmluZyB0aGUgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0TG9ja2VkTWVzc2FnZSgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGxvY2tlZFBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBtc2cgPSBOTFMKLQkJCQkJLmJpbmQoCi0JCQkJCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX2xvY2tlZCwKLQkJCQkJCQlwbHVnaW4uZ2V0TmFtZSgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQobXNnKTsKLQkJfQotCi0JCXJldHVybiBidWZmZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIG1lc3NhZ2UgdGhhdCBsaXN0cyBhbGwgdGhlIHJlYWQtb25seSBtZXRob2QgcGx1Zy1pbnMuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPlN0cmluZ0J1ZmZlcjxjb2RlPiBjb250YWluaW5nIHRoZSBtZXNzYWdlCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBnZXRSZWFkb25seU1lc3NhZ2UoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSByZWFkb25seVBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBtc2cgPSBOTFMKLQkJCQkJLmJpbmQoCi0JCQkJCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX3JlYWRvbmx5LAotCQkJCQkJCXBsdWdpbi5nZXROYW1lKCkpOwotCQkJYnVmZmVyLmFwcGVuZChtc2cpOwotCQl9Ci0KLQkJcmV0dXJuIGJ1ZmZlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MmQ3NTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWdTcGVjczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgdGhlIGNvbmZpZ3VyYXRpb24KLSAqIHNwZWNpZmljYWl0b25zIHRvIGltcG9ydC4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cwotCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLCBJQ2hlY2tTdGF0ZUxpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGxpYnJhcnlDb25maWdTcGVjRXhpc3RzID0gSW1wb3J0UmVzb3VyY2VzLlNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjRXhpc3RzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGxpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzID0gSW1wb3J0UmVzb3VyY2VzLlNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGNvbmZpZ1NwZWNOb1NlbGVjdGlvbiA9IEltcG9ydFJlc291cmNlcy5TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjTm9TZWxlY3Rpb247Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29uZmlnU3BlY0RhdGFMYWJlbCA9IEltcG9ydFJlc291cmNlcy5TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjRGF0YUxhYmVsOwotCi0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIGN0cmxfY2hrYm94VGFibGVWaWV3ZXI7Ci0KLQkvLyAyIGNvbnRyb2xzIGZvciBkaXNwbGF5aW5nIGNvbmZpZ3NwZWMgaW5mbyBmb3IgcGx1Z2lucyBpbiBpbXBvcnQgZGlyZWN0b3J5Ci0JcHJpdmF0ZSBUZXh0IGN0cmxfYnJpZWZEZXNjSW1wb3J0OwotCi0JcHJpdmF0ZSBMYWJlbCBpbXBvcnRDb25maWdTcGVjTGFiZWw7Ci0KLQkvLyAyIGNvbnRyb2xzIGZvciBkaXNwbGF5aW5nIGNvbmZpZ3NwZWMgaW5mbyBmb3IgcGx1Z2lucyBpbiB0aGUgbGlicmFyeQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmRGVzY0xpYnJhcnk7Ci0KLQlwcml2YXRlIExhYmVsIGxpYnJhcnlDb25maWdTcGVjTGFiZWw7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb250YWluZXI7Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25JbXBvcnREYXRhIGRhdGE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZShDb25maWd1cmF0aW9uSW1wb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEltcG9ydFJlc291cmNlcy5zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihJbXBvcnRSZXNvdXJjZXMuc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2ltcF9saWJfY29uZl93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQljb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQotCQlDb21wb3NpdGUgdGFibGVDb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQl0YWJsZUNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGFibGVDb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJY3JlYXRlTGFiZWwodGFibGVDb250YWluZXIsCi0JCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2NvbmZpZ3MsIDIpOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyID0gY3JlYXRlQ2hlY2tib3hUYWJsZVZpZXdlcih0YWJsZUNvbnRhaW5lciwgMSk7Ci0KLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX0NPTkZJR1VSQVRPTjsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQl9Ci0JCX07Ci0KLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0KLQkJQ29tcG9zaXRlIGltcG9ydENvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWltcG9ydENvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWltcG9ydENvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQljcmVhdGVJbXBvcnRDb25maWdTcGVjSW5mbyhpbXBvcnRDb250YWluZXIpOwotCi0JCUNvbXBvc2l0ZSBsaWJyYXJ5Q29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShjb250YWluZXIsIFNXVC5OT05FKTsKLQkJbGlicmFyeUNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWxpYnJhcnlDb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3JlYXRlTGlicmFyeUNvbmZpZ1NwZWNJbmZvKGxpYnJhcnlDb250YWluZXIpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlSW1wb3J0Q29uZmlnU3BlY0luZm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlpbXBvcnRDb25maWdTcGVjTGFiZWwgPSBjcmVhdGVMYWJlbChjb250YWluZXIsIGNvbmZpZ1NwZWNOb1NlbGVjdGlvbiwgMSk7Ci0JCWNyZWF0ZUxpbmUoY29udGFpbmVyLCAxKTsKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsCi0JCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2Rlc2MsIDEpOwotCQljdHJsX2JyaWVmRGVzY0ltcG9ydCA9IGNyZWF0ZU11bHRpTGluZVRleHQoY29udGFpbmVyLCAiIiwgMjc1LCAxMDAsIDEpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUxpYnJhcnlDb25maWdTcGVjSW5mbyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWxpYnJhcnlDb25maWdTcGVjTGFiZWwgPSBjcmVhdGVMYWJlbChjb250YWluZXIsIGNvbmZpZ1NwZWNOb1NlbGVjdGlvbiwKLQkJCQkxKTsKLQkJY3JlYXRlTGluZShjb250YWluZXIsIDEpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwKLQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGFiZWxfZGVzYywgMSk7Ci0JCWN0cmxfYnJpZWZEZXNjTGlicmFyeSA9IGNyZWF0ZU11bHRpTGluZVRleHQoY29udGFpbmVyLCAiIiwgMjc1LCAxMDAsIDEpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyI2NoZWNrU3RhdGVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gY29uZmlncyA9IHNlbGVjdGlvbi50b0FycmF5KCk7Ci0JCQlzZXREaXNwbGF5QXR0cmlidXRlcygoQ29uZmlnU3BlY3MuRW50cnkpIGNvbmZpZ3NbMF0pOwotCQl9IGVsc2UgewotCQkJY2xlYXJEaXNwbGF5QXR0cmlidXRlcygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERpc3BsYXlBdHRyaWJ1dGVzKENvbmZpZ1NwZWNzLkVudHJ5IHNwZWMpIHsKLQkJY3RybF9icmllZkRlc2NJbXBvcnQKLQkJCQkuc2V0VGV4dChzcGVjLmNvbmZpZ1NwZWMuYnJpZWZfZGVzYyA9PSBudWxsID8gIiIgOiBzcGVjLmNvbmZpZ1NwZWMuYnJpZWZfZGVzYyk7IC8vJE5PTi1OTFMtMSQKLQkJaW1wb3J0Q29uZmlnU3BlY0xhYmVsLnNldFRleHQoY29uZmlnU3BlY0RhdGFMYWJlbCk7Ci0KLQkJaWYgKHNwZWMuZXhpc3RpbmdDb25maWcgIT0gbnVsbCkgewotCQkJY3RybF9icmllZkRlc2NMaWJyYXJ5LnNldFRleHQoc3BlYy5leGlzdGluZ0NvbmZpZwotCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJCWxpYnJhcnlDb25maWdTcGVjTGFiZWwuc2V0VGV4dChsaWJyYXJ5Q29uZmlnU3BlY0V4aXN0cyk7Ci0JCX0gZWxzZSB7Ci0JCQlsaWJyYXJ5Q29uZmlnU3BlY0xhYmVsLnNldFRleHQobGlicmFyeUNvbmZpZ1NwZWNOb3RFeGlzdHMpOwotCQkJY3RybF9icmllZkRlc2NMaWJyYXJ5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJEaXNwbGF5QXR0cmlidXRlcygpIHsKLQkJY3RybF9icmllZkRlc2NJbXBvcnQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9icmllZkRlc2NMaWJyYXJ5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWxpYnJhcnlDb25maWdTcGVjTGFiZWwuc2V0VGV4dChjb25maWdTcGVjTm9TZWxlY3Rpb24pOwotCQlpbXBvcnRDb25maWdTcGVjTGFiZWwuc2V0VGV4dChjb25maWdTcGVjTm9TZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKS5sZW5ndGggPiAwKSB7Ci0JCQkvLyBTZXQgZGF0YS5zcGVjcy5jb25maWdzIGxpc3QsIGZpeCB0aGUgc2VsZWN0ZWQgZmllbGQgb2YgZWFjaAotCQkJLy8gZW50cnkuCi0JCQlJdGVyYXRvciBpdGVyID0gZGF0YS5zcGVjcy5jb25maWdzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlDb25maWdTcGVjcy5FbnRyeSBlID0gKENvbmZpZ1NwZWNzLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRDaGVja2VkKGUpKQotCQkJCQllLnNlbGVjdGVkID0gdHJ1ZTsKLQkJCQllbHNlCi0JCQkJCWUuc2VsZWN0ZWQgPSBmYWxzZTsKLQkJCX0KLQkJCSgoSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLm9rVG9Db21wbGV0ZSA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQkoKEltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQpIGdldFdpemFyZCgpKS5va1RvQ29tcGxldGUgPSBmYWxzZTsKLQkJfQotCi0JCS8vIEFsd2F5cyByZXR1cm4gZmFsc2Ugc28gdGhhdCB0aGUgIk5leHQiIGJ1dHRvbiBpcyBuZXZlciBlbmFibGVkLgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNjYW5GbGlwVG9OZXh0UGFnZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmxpcFRvTmV4dFBhZ2UoKSB7Ci0JCXJldHVybiBpc1BhZ2VDb21wbGV0ZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2Ujb25FbnRlclBhZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG9uRW50ZXJQYWdlKE9iamVjdCBvYmopIHsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRJbnB1dChkYXRhLnNwZWNzLmNvbmZpZ3MpOwotCQlpZiAoZGF0YS5zcGVjcy5jb25maWdzLnNpemUoKSA+IDApIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQlkYXRhLnNwZWNzLmNvbmZpZ3MuZ2V0KDApKTsKLQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RDb25maWdzVG9JbXBvcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RDb25maWdzVG9JbXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ1ZWM5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0Q29uZmlnc1RvSW1wb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBkaXNwbGF5cyB0aGUgbGlicmFyeSBjb25maWd1cmF0aW9uIGVsZW1lbnRzIHRoYXQgd2lsbCBiZQotICogaW1wb3J0ZWQuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RDb25maWdzVG9JbXBvcnQgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RDb25maWdzVG9JbXBvcnQuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlIHNlcnZpY2U7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb250YWluZXI7Ci0KLQlwcml2YXRlIERpZmZSZXBvcnRWaWV3ZXIgZGlmZjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdENvbmZpZ3NUb0ltcG9ydChDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZSBzZXJ2aWNlKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEltcG9ydFJlc291cmNlcy5yZXZpZXdDaGFuZ2VzV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEltcG9ydFJlc291cmNlcy5yZXZpZXdDaGFuZ2VzV2l6YXJkUGFnZV90ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9pbXBfbGliX2NvbmZfd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAkJCi0JCXRoaXMuc2VydmljZSA9IHNlcnZpY2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQljb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsIEltcG9ydFJlc291cmNlcy5TZWxlY3RDb25maWdzVG9JbXBvcnRfbGFiZWwxLCAxKTsKLQkJZGlmZiA9IG5ldyBEaWZmUmVwb3J0Vmlld2VyKGNvbnRhaW5lciwgc2VydmljZS5nZXRJbXBvcnREYXRhKCkpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJKChJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkub2tUb0NvbXBsZXRlID0gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2Ujb25FbnRlclBhZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG9uRW50ZXJQYWdlKE9iamVjdCBvYmopIHsKLQkJZGlmZi5zaG93UmVwb3J0KHNlcnZpY2UuZ2V0RGlmZlRyZWUoKSk7Ci0JCSgoSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLm9rVG9Db21wbGV0ZSA9IHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQzMWY3MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLkRlc3RpbmF0aW9uQ29tbW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlCi0gKiBjb25maWd1cmF0aW9ucyB0byBpbXBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlIGV4dGVuZHMgRGVzdGluYXRpb25Db21tb25QYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdGF0dXMgb2tTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssCi0JCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub3RfdXNlZCwgMCwKLQkJCSIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uSW1wb3J0RGF0YSBkYXRhOwotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZSBzZXJ2aWNlOwotCi0JcHJpdmF0ZSBTdGF0dXMgc3RhdHVzID0gb2tTdGF0dXM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlKENvbmZpZ3VyYXRpb25JbXBvcnREYXRhIGRhdGEsCi0JCQlDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZSBzZXJ2aWNlKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSwgZGF0YS5sbERhdGEpOwotCQlzZXRUaXRsZShJbXBvcnRSZXNvdXJjZXMuc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEltcG9ydFJlc291cmNlcy5zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2ltcF9saWJfY29uZl93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCQkKLQkJdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMgd2l0aCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250cm9scygpIHsKLQkJU3RyaW5nW10gZXhwb3J0RGlycyA9IEltcG9ydFVJUHJlZmVyZW5jZXMuZ2V0SW1wb3J0Q29uZmlnRGlycygpOwotCQlpZiAoZXhwb3J0RGlycyAhPSBudWxsICYmIGV4cG9ydERpcnMubGVuZ3RoID4gMCkgewotCQkJZXhwb3J0UGF0aENvbWJvLnNldEl0ZW1zKGV4cG9ydERpcnMpOwotCQkJZXhwb3J0UGF0aENvbWJvLnNldFRleHQoZXhwb3J0RGlyc1swXSk7Ci0JCX0KLQkJc3VwZXIuaW5pdENvbnRyb2xzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgPT0gbnVsbCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKExpYnJhcnlVSVJlc291cmNlcy5ub09wZW5MaWJyYXJ5V2FybmluZ19tc2cpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWJvb2xlYW4gcmV0dXJuVmFsdWUgPSBmYWxzZTsKLQkJc3RhdHVzID0gb2tTdGF0dXM7Ci0JCWlmIChleHBvcnRQYXRoQ29tYm8uZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCkgewotCQkJc2F2ZVRvRGF0YU1vZGVsKCk7Ci0JCQlGaWxlIGxpYkRpciA9IG5ldyBGaWxlKGV4cG9ydFBhdGhDb21iby5nZXRUZXh0KCkpOwotCQkJaWYgKCFsaWJEaXIuZXhpc3RzKCkpIHsKLQkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzKAotCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkLAotCQkJCQkJMCwKLQkJCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX3BhdGgsCi0JCQkJCQludWxsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuVmFsdWUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFwcGx5VG9TdGF0dXNMaW5lKCk7Ci0JCXJldHVybiByZXR1cm5WYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXNhdmVUb0RhdGFNb2RlbCgpOwotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3BlcmF0aW9uID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soCi0JCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9NU0cxLAotCQkJCQkJSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQkJCQlzZXJ2aWNlLmFuYWx5emUobW9uaXRvcik7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQkvLyBUaGlzIHJ1bnMgdGhlIG9wdGlvbnMsIGFuZCBzaG93cyBwcm9ncmVzcy4KLQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnJ1bih0cnVlLCBmYWxzZSwgb3BlcmF0aW9uKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcgdGhhdCBzaG91bGRuJ3QuCi0JCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlTdHJpbmcgZXJyb3IgPSBkYXRhLmdldEVycm9ySW5mbygpLmdldEVycm9yKCk7Ci0JCWlmIChlcnJvciAhPSBudWxsICYmIGVycm9yLmxlbmd0aCgpID4gMCkgewotCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub3RfdXNlZCwKLQkJCQkJMCwgZXJyb3IsIG51bGwpOwotCQkJYXBwbHlUb1N0YXR1c0xpbmUoKTsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCUJhc2VXaXphcmRQYWdlIHBhZ2UgPSBudWxsOwotCQlpZiAoZGF0YS5zcGVjcyAhPSBudWxsKQotCQkJcGFnZSA9ICgoSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLnNwZWNzUGFnZTsKLQkJZWxzZSB7Ci0JCQlQbHVnaW5Nb2RpZnlJbmZvIG1vZGlmeUluZm8gPSBjaGVja01vZGlmeSgpOwotCi0JCQkvLyBpZiBvbmx5IGxvY2tlZCwgd2UgY2FuIGF1dG8tdW5sb2NrIGFuZCByZWxvY2sgdGhlIHBsdWdpbnMKLQkJCS8vIGlmIHRoZSBwbHVpbiBpcyByZWFkb25seSwgdXNlciBuZWVkIHRvIG1hbnVhbGx5IG1ha2UgaXQgdXBkYXRhYmxlCi0JCQkvLyBjdXN0b21lcnMgbmVlZCB0byBtYW51YWxseSB1bmxvY2sgYW5kIGxvY2sgcGx1Z2lucyBkdXJpbmcgY29udGVudAotCQkJLy8gbGlicmFyeSB1cGdyYWRlCi0KLQkJCWlmIChtb2RpZnlJbmZvLnJlYWRvbmx5UGx1Z2lucy5zaXplKCkgPiAwKSB7Ci0KLQkJCQllcnJvciA9IG1vZGlmeUluZm8uZ2V0UmVhZG9ubHlNZXNzYWdlKCkudG9TdHJpbmcoKTsKLQotCQkJCS8vIHNob3cgZXJyb3IgbWVzc2FnZSBib3gKLQkJCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yLCBlcnJvcik7Ci0KLQkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzKAotCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkLAotCQkJCQkJMCwKLQkJCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX2Vycm9yX25vdF91cGRhdGFibGUsCi0JCQkJCQludWxsKTsKLQkJCQlhcHBseVRvU3RhdHVzTGluZSgpOwotCQkJCXJldHVybiB0aGlzOwotCQkJfQotCi0JCQkvLyBhbGxvdyB1c2VyIHRvIHByb2NlZWQgd2l0aCBsb2NrZWQgcGx1Z2lucwotCQkJaWYgKG1vZGlmeUluZm8ubG9ja2VkUGx1Z2lucy5zaXplKCkgPiAwKSB7Ci0JCQkJU3RyaW5nIFdJWkFSRF9USVRMRSA9IEltcG9ydFJlc291cmNlcy5pbXBvcnRDb25maWdXaXphcmRfdGl0bGU7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBtb2RpZnlJbmZvLmdldExvY2tlZE1lc3NhZ2UoKS50b1N0cmluZygpCi0JCQkJCQkrIEltcG9ydFJlc291cmNlcy5JbXBvcnRQbHVnaW5XaXphcmRfY29uZmlybV9jb250aW51ZTsKLQkJCQlib29sZWFuIHllcyA9IEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKFdJWkFSRF9USVRMRSwgbWVzc2FnZSk7Ci0JCQkJaWYgKCF5ZXMpIHsKLQkJCQkJc3RhdHVzID0gbmV3IFN0YXR1cygKLQkJCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkLAotCQkJCQkJCTAsCi0JCQkJCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfZXJyb3Jfbm90X3VwZGF0YWJsZSwKLQkJCQkJCQludWxsKTsKLQkJCQkJYXBwbHlUb1N0YXR1c0xpbmUoKTsKLQkJCQkJcmV0dXJuIHRoaXM7Ci0JCQkJfQotCQkJfQotCQkJcGFnZSA9ICgoSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLmNvbmZpZ1BhZ2U7Ci0JCX0KLQkJcGFnZS5vbkVudGVyUGFnZShudWxsKTsKLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIFBsdWdpbk1vZGlmeUluZm8gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBQbHVnaW5Nb2RpZnlJbmZvIGNoZWNrTW9kaWZ5KCkgewotCQlyZXR1cm4gY2hlY2tNb2RpZnkoTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luR3VpZHMoc2VydmljZQotCQkJCS5nZXRJbXBvcnRpbmdMaWJyYXJ5KCkpLCBnZXRTaGVsbCgpLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgUGx1Z2luTW9kaWZ5SW5mbyBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBQbHVnaW5Nb2RpZnlJbmZvIGNoZWNrTW9kaWZ5KExpc3QgZ3VpZHMsIFNoZWxsIHNoZWxsLAotCQkJYm9vbGVhbiBjaGVja0VkaXQpIHsKLQkJUGx1Z2luTW9kaWZ5SW5mbyBtb2RpZnlJbmZvID0gbmV3IFBsdWdpbk1vZGlmeUluZm8oKTsKLQkJLy8gU3RyaW5nQnVmZmVyIGVycm9yID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkvLyBMaXN0IGd1aWRzID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luR3VpZHMoc2VydmljZQotCQkvLyAuZ2V0SW1wb3J0aW5nTGlicmFyeSgpKTsKLQotCQlMaXN0IHBsdWdpbnMgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCQkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJaWYgKGd1aWRzLmNvbnRhaW5zKHBsdWdpbi5nZXRHdWlkKCkpKSB7Ci0JCQkJaWYgKHBsdWdpbi5nZXRVc2VyQ2hhbmdlYWJsZSgpLmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSB7Ci0JCQkJCS8vIHBsdWdpbiBpcyBsb2NrZWQKLQkJCQkJbW9kaWZ5SW5mby5sb2NrZWRQbHVnaW5zLmFkZChwbHVnaW4pOwotCQkJCX0gZWxzZSBpZiAoY2hlY2tFZGl0KSB7Ci0JCQkJCS8vIHBsdWdpbiBleGlzdHMgaW4gdGhlIGN1cnJlbnQgbGlicmFyeSwgbWFrZSBzdXJlIHRoZQotCQkJCQkvLyBwbHVnaW4gaXMgdXBkYXRhYmxlCi0JCQkJCS8vIElTdGF0dXMgc3RhdHVzID0gVG5nVXRpbC5jaGVja0VkaXQocGx1Z2luLCBnZXRTaGVsbCgpKTsKLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChwbHVnaW4sIHNoZWxsKTsKLQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQltb2RpZnlJbmZvLnJlYWRvbmx5UGx1Z2lucy5hZGQocGx1Z2luKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBtb2RpZnlJbmZvOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjY2FuRmxpcFRvTmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgewotCQlyZXR1cm4gaXNQYWdlQ29tcGxldGUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXBwbHlUb1N0YXR1c0xpbmUoKSB7Ci0JCWlmIChzdGF0dXMgIT0gb2tTdGF0dXMpCi0JCQlzZXRFcnJvck1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCWVsc2UgewotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYmEzNzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdEltcG9ydFBsdWdpblNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLkRlc3RpbmF0aW9uQ29tbW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLlBsdWdpbkltcG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZQotICogbWV0aG9kIHBsdWctaW5zIHRvIGltcG9ydC4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdEltcG9ydFBsdWdpblNvdXJjZSBleHRlbmRzIERlc3RpbmF0aW9uQ29tbW9uUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdGF0dXMgT0tfU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLAotCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub3RfdXNlZCwgMCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFBsdWdpbkltcG9ydERhdGEgZGF0YTsKLQotCXByaXZhdGUgUGx1Z2luSW1wb3J0aW5nU2VydmljZSBzZXJ2aWNlOwotCi0JcHJpdmF0ZSBTdGF0dXMgc3RhdHVzID0gT0tfU1RBVFVTOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlKFBsdWdpbkltcG9ydERhdGEgZGF0YSwKLQkJCVBsdWdpbkltcG9ydGluZ1NlcnZpY2Ugc2VydmljZSkgewotCQlzdXBlcihQQUdFX05BTUUsIGRhdGEubGxEYXRhKTsKLQkJc2V0VGl0bGUoSW1wb3J0UmVzb3VyY2VzLnNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oSW1wb3J0UmVzb3VyY2VzLnNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2ltcF9tZXRoX3BsdWdpbl93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuc2VydmljZSA9IHNlcnZpY2U7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCVN0cmluZ1tdIGV4cG9ydERpcnMgPSBJbXBvcnRVSVByZWZlcmVuY2VzLmdldEltcG9ydFBsdWdpbkRpcnMoKTsKLQkJaWYgKGV4cG9ydERpcnMgIT0gbnVsbCAmJiBleHBvcnREaXJzLmxlbmd0aCA+IDApIHsKLQkJCWV4cG9ydFBhdGhDb21iby5zZXRJdGVtcyhleHBvcnREaXJzKTsKLQkJCWV4cG9ydFBhdGhDb21iby5zZXRUZXh0KGV4cG9ydERpcnNbMF0pOwotCQl9Ci0JCXN1cGVyLmluaXRDb250cm9scygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShMaWJyYXJ5VUlSZXNvdXJjZXMubm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlib29sZWFuIHJldHVyblZhbHVlID0gZmFsc2U7Ci0JCXN0YXR1cyA9IE9LX1NUQVRVUzsKLQkJaWYgKGV4cG9ydFBhdGhDb21iby5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzYXZlVG9EYXRhTW9kZWwoKTsKLQkJCUZpbGUgbGliRGlyID0gbmV3IEZpbGUoZXhwb3J0UGF0aENvbWJvLmdldFRleHQoKSk7Ci0JCQlpZiAoIWxpYkRpci5leGlzdHMoKSkgewotCQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm90X3VzZWQsIDAsCi0JCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX3BhdGgsIG51bGwpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm5WYWx1ZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXBwbHlUb1N0YXR1c0xpbmUoKTsKLQkJcmV0dXJuIHJldHVyblZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJc2F2ZVRvRGF0YU1vZGVsKCk7Ci0KLQkJLy8gVmFsaWRhdGUgZmlyc3QgYmVmb3JlIGdvaW5nIHRvIHRoZSBuZXh0IHBhZ2UuCi0JCXNlcnZpY2UudmFsaWRhdGUobnVsbCk7Ci0JCVN0cmluZyBlcnJvciA9IGRhdGEuZ2V0RXJyb3JJbmZvKCkuZ2V0RXJyb3IoKTsKLQkJaWYgKGVycm9yICE9IG51bGwgJiYgZXJyb3IubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzdXBlci5zZXRFcnJvck1lc3NhZ2UoZXJyb3IpOwotCQkJcmV0dXJuIHRoaXM7Ci0JCX0gZWxzZSB7Ci0JCQlTZWxlY3RQbHVnaW5zVG9JbXBvcnQgcGFnZSA9ICgoSW1wb3J0UGx1Z2luV2l6YXJkKSBnZXRXaXphcmQoKSkucGFnZTI7Ci0JCQlwYWdlLm9uRW50ZXJQYWdlKG51bGwpOwotCQkJcmV0dXJuIHBhZ2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2NhbkZsaXBUb05leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLQkJcmV0dXJuIGlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFwcGx5VG9TdGF0dXNMaW5lKCkgewotCQlpZiAoc3RhdHVzICE9IE9LX1NUQVRVUykKLQkJCXNldEVycm9yTWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBZGRpdGlvbmFsQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBvcHRpb25Hcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJb3B0aW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJb3B0aW9uR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCW9wdGlvbkdyb3VwLnNldFRleHQoSW1wb3J0UmVzb3VyY2VzLm9wdGlvbkdyb3VwX3RleHQpOwotCi0JCWJvb2xlYW4gY2hlY2tCYXNlUGx1Z2lucyA9IEltcG9ydFVJUHJlZmVyZW5jZXMuZ2V0Q2hlY2tCYXNlUGx1Z2lucygpOwotCQlzZXRDaGVja0Jhc2VQbHVnaW5zKGNoZWNrQmFzZVBsdWdpbnMpOwotCi0JCUJ1dHRvbiBjaGVja0Jhc2VSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKG9wdGlvbkdyb3VwLAotCQkJCUltcG9ydFJlc291cmNlcy5jaGVja0Jhc2VSYWRpb0J1dHRvbl90ZXh0LCAxLCBjaGVja0Jhc2VQbHVnaW5zKTsKLQkJY2hlY2tCYXNlUmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0Q2hlY2tCYXNlUGx1Z2lucyh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJQnV0dG9uIGlnbm9yZVJlbW92ZVJhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24ob3B0aW9uR3JvdXAsCi0JCQkJSW1wb3J0UmVzb3VyY2VzLmlnbm9yZVJlbW92ZVJhZGlvQnV0dG9uX3RleHQsIDEsCi0JCQkJIWNoZWNrQmFzZVBsdWdpbnMpOwotCQlpZ25vcmVSZW1vdmVSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZXRDaGVja0Jhc2VQbHVnaW5zKGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q2hlY2tCYXNlUGx1Z2lucyhib29sZWFuIGNoZWNrQmFzZVBsdWdpbnMpIHsKLQkJc2VydmljZS5zZXRDaGVja0Jhc2VQbHVnaW5zKGNoZWNrQmFzZVBsdWdpbnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdFBsdWdpbnNUb0ltcG9ydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdFBsdWdpbnNUb0ltcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWY5MTRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RQbHVnaW5zVG9JbXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5QbHVnaW5JbXBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0aW5nU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLlBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHRoZSBtZXRob2QgcGx1Zy1pbnMgdG8gaW1wb3J0LgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0UGx1Z2luc1RvSW1wb3J0IGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cwotCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLCBJQ2hlY2tTdGF0ZUxpc3RlbmVyLCBMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RQbHVnaW5zVG9JbXBvcnQuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbGlicmFyeVBsdWdpbkV4aXN0cyA9IEltcG9ydFJlc291cmNlcy5TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGlicmFyeVBsdWdpbkV4aXN0czsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBsaWJyYXJ5UGx1Z2luTm90RXhpc3RzID0gSW1wb3J0UmVzb3VyY2VzLlNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luTm90RXhpc3RzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHBsdWdpbk5vU2VsZWN0aW9uID0gSW1wb3J0UmVzb3VyY2VzLlNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5Ob1NlbGVjdGlvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBwbHVnaW5EYXRhTGFiZWwgPSBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0UGx1Z2luc1RvSW1wb3J0X3BsdWdpbkRhdGFMYWJlbDsKLQotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBjdHJsX2Noa2JveFRhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYXV0aG9ySW1wb3J0OwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfdmVyc2lvbkltcG9ydDsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmRGVzY0ltcG9ydDsKLQotCXByaXZhdGUgTGFiZWwgaW1wb3J0UGx1Z2luTGFiZWw7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9hdXRob3JMaWJyYXJ5OwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfdmVyc2lvbkxpYnJhcnk7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9icmllZkRlc2NMaWJyYXJ5OwotCi0JcHJpdmF0ZSBMYWJlbCBsaWJyYXJ5UGx1Z2luTGFiZWw7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb250YWluZXI7Ci0KLQlwcml2YXRlIGludCBjaGVja2VkQ291bnQgPSAwOwotCi0JcHJpdmF0ZSBMaXN0IGNoZWNrZWRQbHVnaW5MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBQbHVnaW5JbXBvcnREYXRhIGRhdGE7Ci0KLQlwcml2YXRlIFBsdWdpbkltcG9ydGluZ1NlcnZpY2Ugc2VydmljZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdFBsdWdpbnNUb0ltcG9ydChQbHVnaW5JbXBvcnREYXRhIGRhdGEsCi0JCQlQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoSW1wb3J0UmVzb3VyY2VzLnNlbGVjdFBsdWdpbnNXaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oSW1wb3J0UmVzb3VyY2VzLnNlbGVjdFBsdWdpbnNXaXphcmRQYWdlX3RleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2ltcF9tZXRoX3BsdWdpbl93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCQkKLQkJdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotCi0JCUNvbXBvc2l0ZSB0YWJsZUNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCXRhYmxlQ29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZUNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQljcmVhdGVMYWJlbCh0YWJsZUNvbnRhaW5lciwKLQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3BsdWdpbnMsIDIpOwotCi0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIgPSBjcmVhdGVDaGVja2JveFRhYmxlVmlld2VyKHRhYmxlQ29udGFpbmVyLCAyKTsKLQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gTGlicmFyeVVJSW1hZ2VzLklNR19NRVRIT0RfUExVR0lOOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlyZXR1cm4gKChNZXRob2RQbHVnaW4pIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0KLQkJQ29tcG9zaXRlIGltcG9ydENvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWltcG9ydENvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJY3JlYXRlSW1wb3J0UGx1Z2luSW5mbyhpbXBvcnRDb250YWluZXIpOwotCi0JCUNvbXBvc2l0ZSBsaWJyYXJ5Q29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShjb250YWluZXIsIFNXVC5OT05FKTsKLQkJbGlicmFyeUNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJY3JlYXRlTGlicmFyeVBsdWdpbkluZm8obGlicmFyeUNvbnRhaW5lcik7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVJbXBvcnRQbHVnaW5JbmZvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJaW1wb3J0UGx1Z2luTGFiZWwgPSBjcmVhdGVMYWJlbChjb250YWluZXIsIHBsdWdpbk5vU2VsZWN0aW9uLCAxKTsKLQkJY3JlYXRlTGluZShjb250YWluZXIsIDEpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwKLQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvciwgMSk7Ci0JCWN0cmxfYXV0aG9ySW1wb3J0ID0gY3JlYXRlTXVsdGlMaW5lVGV4dChjb250YWluZXIsICIiLCAyNzUsIDQwLCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwKLQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3ZlcnNpb24sIDEpOwotCQljdHJsX3ZlcnNpb25JbXBvcnQgPSBjcmVhdGVUZXh0KGNvbnRhaW5lciwgIiIsIDI3NSwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsCi0JCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9kZXNjLCAxKTsKLQkJY3RybF9icmllZkRlc2NJbXBvcnQgPSBjcmVhdGVNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgIiIsIDI3NSwgMTAwLCAxKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVMaWJyYXJ5UGx1Z2luSW5mbyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWxpYnJhcnlQbHVnaW5MYWJlbCA9IGNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgcGx1Z2luTm9TZWxlY3Rpb24sIDEpOwotCQljcmVhdGVMaW5lKGNvbnRhaW5lciwgMSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLAotCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfYXV0aG9yLCAxKTsKLQkJY3RybF9hdXRob3JMaWJyYXJ5ID0gY3JlYXRlTXVsdGlMaW5lVGV4dChjb250YWluZXIsICIiLCAyNzUsIDQwLCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwKLQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3ZlcnNpb24sIDEpOwotCQljdHJsX3ZlcnNpb25MaWJyYXJ5ID0gY3JlYXRlVGV4dChjb250YWluZXIsICIiLCAyNzUsIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLAotCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfZGVzYywgMSk7Ci0JCWN0cmxfYnJpZWZEZXNjTGlicmFyeSA9IGNyZWF0ZU11bHRpTGluZVRleHQoY29udGFpbmVyLCAiIiwgMjc1LCAxMDAsIDEpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyI2NoZWNrU3RhdGVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdCBvYmogPSBldmVudC5nZXRFbGVtZW50KCk7Ci0KLQkJLy8gU2V0IHRoZSBmbGFnIHRvIGltcG9ydCB0aGUgc2VsZWN0ZWQgcGx1Zy1pbnMuCi0JCWlmIChvYmogaW5zdGFuY2VvZiBQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIHsKLQkJCSgoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBvYmopLnNlbGVjdGVkID0gZXZlbnQuZ2V0Q2hlY2tlZCgpOwotCQl9Ci0JCVN0cmluZyBtZXNzYWdlID0gc2VydmljZS52YWxpZGF0ZVNlbGVjdGlvbigpOwotCQlpZiAobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzdXBlci5zZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCX0KLQotCQlpZiAoZXZlbnQuZ2V0Q2hlY2tlZCgpKSB7Ci0JCQljaGVja2VkQ291bnQrKzsKLQkJCWNoZWNrZWRQbHVnaW5MaXN0LmFkZChvYmopOwotCQl9IGVsc2UgewotCQkJY2hlY2tlZENvdW50LS07Ci0JCQljaGVja2VkUGx1Z2luTGlzdC5yZW1vdmUob2JqKTsKLQkJfQotCi0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gcGx1Z2luID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCXNldERpc3BsYXlBdHRyaWJ1dGVzKChQbHVnaW5JbmZvKSBwbHVnaW5bMF0pOwotCQl9IGVsc2UgewotCQkJY2xlYXJEaXNwbGF5QXR0cmlidXRlcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGlzcGxheUF0dHJpYnV0ZXMoUGx1Z2luSW5mbyBwbHVnaW4pIHsKLQkJY3RybF9hdXRob3JJbXBvcnQuc2V0VGV4dChwbHVnaW4uYXV0aG9ycyA9PSBudWxsID8gIiIgOiBwbHVnaW4uYXV0aG9ycyk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF92ZXJzaW9uSW1wb3J0Ci0JCQkJLnNldFRleHQocGx1Z2luLnZlcnNpb24gPT0gbnVsbCA/ICIiIDogcGx1Z2luLnZlcnNpb24pOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfYnJpZWZEZXNjSW1wb3J0Ci0JCQkJLnNldFRleHQocGx1Z2luLmJyaWVmX2Rlc2MgPT0gbnVsbCA/ICIiIDogcGx1Z2luLmJyaWVmX2Rlc2MpOyAvLyROT04tTkxTLTEkCi0JCWltcG9ydFBsdWdpbkxhYmVsLnNldFRleHQocGx1Z2luRGF0YUxhYmVsKTsKLQotCQlpZiAocGx1Z2luLmV4aXN0aW5nUGx1Z2luICE9IG51bGwpIHsKLQkJCWxpYnJhcnlQbHVnaW5MYWJlbC5zZXRUZXh0KGxpYnJhcnlQbHVnaW5FeGlzdHMpOwotCQkJY3RybF9hdXRob3JMaWJyYXJ5LnNldFRleHQocGx1Z2luLmV4aXN0aW5nUGx1Z2luLmdldEF1dGhvcnMoKSk7Ci0JCQljdHJsX3ZlcnNpb25MaWJyYXJ5LnNldFRleHQocGx1Z2luLmV4aXN0aW5nUGx1Z2luLmdldFZlcnNpb24oKSk7Ci0JCQljdHJsX2JyaWVmRGVzY0xpYnJhcnkuc2V0VGV4dChwbHVnaW4uZXhpc3RpbmdQbHVnaW4KLQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCX0gZWxzZSB7Ci0JCQlsaWJyYXJ5UGx1Z2luTGFiZWwuc2V0VGV4dChsaWJyYXJ5UGx1Z2luTm90RXhpc3RzKTsKLQkJCWN0cmxfYXV0aG9yTGlicmFyeS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJY3RybF92ZXJzaW9uTGlicmFyeS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJY3RybF9icmllZkRlc2NMaWJyYXJ5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJEaXNwbGF5QXR0cmlidXRlcygpIHsKLQkJaW1wb3J0UGx1Z2luTGFiZWwuc2V0VGV4dChwbHVnaW5Ob1NlbGVjdGlvbik7Ci0JCWN0cmxfYXV0aG9ySW1wb3J0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfdmVyc2lvbkltcG9ydC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2JyaWVmRGVzY0ltcG9ydC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWxpYnJhcnlQbHVnaW5MYWJlbC5zZXRUZXh0KHBsdWdpbk5vU2VsZWN0aW9uKTsKLQkJY3RybF9hdXRob3JMaWJyYXJ5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfdmVyc2lvbkxpYnJhcnkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9icmllZkRlc2NMaWJyYXJ5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKGNoZWNrZWRDb3VudCA+IDApOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2Ujb25FbnRlclBhZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG9uRW50ZXJQYWdlKE9iamVjdCBvYmopIHsKLQkJTGlzdCBwbHVnaW5zID0gZGF0YS5nZXRQbHVnaW5zKCk7Ci0JCWlmIChwbHVnaW5zICE9IG51bGwpIHsKLQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0SW5wdXQocGx1Z2lucy50b0FycmF5KCkpOwotCQkJaWYgKCFwbHVnaW5zLmlzRW1wdHkoKSkgewotCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocGx1Z2lucwotCQkJCQkJLmdldCgwKSk7Ci0JCQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNjEwN2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHdpemFyZHMgZm9yIGltcG9ydGluZyBtZXRob2QgcGx1Zy1pbnMgYW5kIGNvbmZpZ3VyYXRpb25zLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgzOWQ5Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNiOTA5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogTGlicmFyeSBFZGl0IFVJIFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLkxpYnJhcnlFZGl0VUlQbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk4NjNlMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNjQxMzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aUhlbHBlciI+Ci0gICAgICA8dWlIZWxwZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVJSGVscGVyIj4KLSAgICAgIDwvdWlIZWxwZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL0xpYnJhcnlFZGl0VUlQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvTGlicmFyeUVkaXRVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWVjZWVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvTGlicmFyeUVkaXRVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlFZGl0VUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBMaWJyYXJ5RWRpdFVJUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgTGlicmFyeUVkaXRVSVBsdWdpbigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW5zI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlicmFyeUVkaXRVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9Qcm9jZXNzTGlzdFNlbGVjdGlvbkRpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9Qcm9jZXNzTGlzdFNlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzllMGVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3RTZWxlY3Rpb25EaWFsb2c7Ci0KLS8qKgotICogVGhpcyBqYXZhIGZpbGUgZXh0ZW5kcyBqZmFjZSBMaXN0U2VsZWN0aW9uRGlhbG9nIGFuZCByZW1vdmUgY2FuY2VsIGJ1dHRvbgotICogZnJvbSBkaWFsb2cKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzTGlzdFNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIExpc3RTZWxlY3Rpb25EaWFsb2cgewotCi0JcHVibGljIFByb2Nlc3NMaXN0U2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBPYmplY3QgaW5wdXQsCi0gICAgICAgICAgICBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0gICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLCBTdHJpbmcgbWVzc2FnZSkKLQl7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBpbnB1dCwgY29udGVudFByb3ZpZGVyLCBsYWJlbFByb3ZpZGVyLCBtZXNzYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0gICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9UZWFtU2VsZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1RlYW1TZWxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM0NDRiOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1RlYW1TZWxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQWRhcHRlckZhY3RvcnlJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogVUkgRGlhbG9nIGNsYXNzIHdoaWNoIHdpbGwgYXNrIHVzZXIgdG8gYXNzaWduIGEgcm9sZSB0byB0ZWFtIGF1dG9tYXRpY2FsbHkuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZWFtU2VsZWN0aW9uIHsKLQotCS8qKgotCSAqIEl0IHNob3dzIGRpYWxvZyBib3ggYWxsIHRlYW1zLiBSZXR1cm5zIHRlYW0gdXNlciBzZWxlY3RlZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVhbVByb2ZpbGUgZ2V0U2VsZWN0ZWRUZWFtKExpc3QgdGVhbUxpc3QsIFJvbGUgcm9sZSwgU2hlbGwgc2hlbGwpIHsKLS8vCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLS8vCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLS8vCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmopIHsKLS8vCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotLy8JCQkJCXJldHVybiAoKFRlYW1Qcm9maWxlKSBvYmopLmdldE5hbWUoKTsKLS8vCQkJCX0KLS8vCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotLy8JCQl9Ci0vLwkJfTsKLS8vCQlpZihzaGVsbCA9PSBudWxsKSB7Ci0vLwkJCXRyeSB7Ci0vLwkJCQlzaGVsbCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsgLy9Nc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCk7Ci0vLwkJCX0KLS8vCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLS8vCQkJCQotLy8JCQl9Ci0vLwkJfQotLy8JCUVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyhzaGVsbCwgbGFiZWxQcm92aWRlcik7Ci0vLwotLy8JCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLS8vCQlkbGcuc2V0RWxlbWVudHModGVhbUxpc3QudG9BcnJheSgpKTsKLS8vCQlkbGcuc2V0TXVsdGlwbGVTZWxlY3Rpb24oZmFsc2UpOwotLy8JCWRsZwotLy8JCQkJLnNldE1lc3NhZ2UoTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuc2VsZWN0VGVhbXNEaWFsb2dfdGV4dCwgKG5ldyBPYmplY3RbXSB7IHJvbGUuZ2V0TmFtZSgpIH0pKSk7IAotLy8JCWRsZy5zZXRUaXRsZShMaWJyYXJ5RWRpdFJlc291cmNlcy5zZWxlY3RUZWFtc0RpYWxvZ190aXRsZSk7IC8vJE5PTi1OTFMtMSQKLS8vCQlkbGcuc2V0RmlsdGVyKG51bGwpOwotLy8JCWRsZy5vcGVuKCk7Ci0vLwkJT2JqZWN0IG9iaiA9IGRsZy5nZXRGaXJzdFJlc3VsdCgpOwotLy8JCS8vIGRpc3Bvc2UKLS8vCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLS8vCQlyZXR1cm4gKFRlYW1Qcm9maWxlKSBvYmo7Ci0JCQotCQlmaW5hbCBJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyCi0JCQkJLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCWlmICh1aUhhbmRsZXIgIT0gbnVsbCkgewotCQkJZmluYWwgSUl0ZW1MYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlJdGVtTGFiZWxQcm92aWRlcigKLQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQlmaW5hbCBTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5zZWxlY3RUZWFtc0RpYWxvZ190aXRsZTsKLQkJCWZpbmFsIFN0cmluZyBtc2cgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5zZWxlY3RUZWFtc0RpYWxvZ190ZXh0LCAobmV3IE9iamVjdFtdIHsgcm9sZS5nZXROYW1lKCkgfSkpOwotCQkJZmluYWwgTGlzdCBmaW5hbFNlbGVjdGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZmluYWwgTGlzdCBmaW5hbFRlYW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZmluYWxUZWFtcy5hZGRBbGwodGVhbUxpc3QpOwotCi0JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5ydW5TYWZlbHkobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJTGlzdCBzZWxlY3RlZCA9IHVpSGFuZGxlci5zZWxlY3QoZmluYWxUZWFtcywgbGFiZWxQcm92aWRlciwgZmFsc2UsCi0JCQkJCQkJZmluYWxUZWFtcywgdGl0bGUsIG1zZyk7Ci0KLQkJCQkJaWYgKHNlbGVjdGVkICE9IG51bGwpCi0JCQkJCQlmaW5hbFNlbGVjdGVkLmFkZEFsbChzZWxlY3RlZCk7Ci0JCQkJfQotCQkJfSwgdHJ1ZSk7Ci0KLQkJCWlmIChmaW5hbFNlbGVjdGVkID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWlmKGZpbmFsU2VsZWN0ZWQuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gKFRlYW1Qcm9maWxlKSBmaW5hbFNlbGVjdGVkLmdldCgwKTsKLQkJfQotCi0JCS8vIG5vIHVzZXIgaW50ZXJhY3Rpb24gaGFuZGxlciBhdmFpbGFibGUKLQkJLy8gcmV0dXJuIG51bGwKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1VJSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1VJSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MDI2YWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9VSUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWk7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuV29ya3NwYWNlSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXhwb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLk1lc3NhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLk1vZGFsQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5Xb3JrYmVuY2hKb2I7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBVSUhlbHBlciBpbXBsZW1lbnRzIElVSUhlbHBlciB7Ci0JLyoqCi0JICogR2V0IHRlYW1zIGluIHNjb3BlCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gcm9sZQotCSAqIEBwYXJhbSB0ZWFtTGlzdAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0VGVhbXNJblNjb3BlKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQnJlYWtkb3duRWxlbWVudCBlLCBSb2xlIHJvbGUsIExpc3QgdGVhbUxpc3QpIHsKLQkJLy8gZ2V0IGNoaWxkcmVuIGZvciBhY3Rpdml0eQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoZSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IGl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihlKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBvYmo7Ci0JCQkJTGlzdCBhbGxUZWFtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkvLyBnZXQgYWxsIHN1YiB0ZWFtcyBhcyB3ZWxsCi0JCQkJUHJvY2Vzc1V0aWwuZ2V0QWxsU3ViVGVhbXModGVhbSwgYWxsVGVhbXMpOwotCi0JCQkJZm9yIChJdGVyYXRvciB0ZWFtSXRvciA9IGFsbFRlYW1zLml0ZXJhdG9yKCk7IHRlYW1JdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbyA9IHRlYW1JdG9yLm5leHQoKTsKLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCQkJLy8gZ2V0IHJvbGVzIGZyb20gdGVhbXMKLQkJCQkJCUxpc3Qgcm9sZXMgPSBQcm9jZXNzVXRpbC5nZXRSb2xlcygoKFRlYW1Qcm9maWxlKSBvKQotCQkJCQkJCQkuZ2V0VGVhbVJvbGVzKCkpOwotCQkJCQkJaWYgKHJvbGVzLmNvbnRhaW5zKHJvbGUpKSB7Ci0JCQkJCQkJdGVhbUxpc3QuYWRkKG8pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gZ2V0IHBhcmVudAotCQlPYmplY3QgY3VycmVudFBhcmVudCA9IGl0ZW1Qcm92aWRlci5nZXRQYXJlbnQoZSk7Ci0JCWlmIChjdXJyZW50UGFyZW50ICE9IG51bGwpIHsKLQkJCS8vIGdvIHVwCi0JCQlnZXRUZWFtc0luU2NvcGUoYWRhcHRlckZhY3RvcnksIChCcmVha2Rvd25FbGVtZW50KSBjdXJyZW50UGFyZW50LAotCQkJCQlyb2xlLCB0ZWFtTGlzdCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVVJSGVscGVyI2dldFRlYW0ob3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSwgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBUZWFtUHJvZmlsZSBnZXRUZWFtKEFjdGl2aXR5IGFjdGl2aXR5LCBSb2xlIHJvbGUsIE9iamVjdCBVSUNvbnRleHQpIHsKLQkJTGlzdCB0ZWFtTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkvLyBmaW5kIG91dCBhbGwgdGVhbSBpbiB2aXNpYmxlIHNjb3BlCi0JCWdldFRlYW1zSW5TY29wZShhZGFwdGVyRmFjdG9yeSwgYWN0aXZpdHksIHJvbGUsIHRlYW1MaXN0KTsKLQkJaWYgKHRlYW1MaXN0LnNpemUoKSA9PSAxKSB7Ci0JCQlyZXR1cm4gKFRlYW1Qcm9maWxlKSB0ZWFtTGlzdC5nZXQoMCk7Ci0JCX0KLQkJaWYgKHRlYW1MaXN0LnNpemUoKSA+IDEpIHsKLQkJCXJldHVybiBUZWFtU2VsZWN0aW9uLmdldFNlbGVjdGVkVGVhbSh0ZWFtTGlzdCwgcm9sZSwKLQkJCQkJVUlDb250ZXh0IGluc3RhbmNlb2YgU2hlbGwgPyAoU2hlbGwpIFVJQ29udGV4dCA6IG51bGwpOwotCQl9Ci0JCS8vIHRoZXJlIGFyZSBubyB0ZWFtcyB0byBhc3NpZ24KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklVSUhlbHBlciNydW5Jbk1vZGFsQ29udGV4dChvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzLCBib29sZWFuLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBydW5Jbk1vZGFsQ29udGV4dChmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3BlcmF0aW9uLAotCQkJYm9vbGVhbiBmb3JrLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIE9iamVjdCB1aUNvbnRleHQpIHsKLQkJb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCW9wZXJhdGlvbi5ydW4obW9uaXRvcik7Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJdHJ5IHsKLQkJCU1vZGFsQ29udGV4dC5ydW4ob3AsIHRydWUsIG1vbml0b3IsICgoU2hlbGwpdWlDb250ZXh0KQotCQkJCQkuZ2V0RGlzcGxheSgpKTsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJVGhyb3dhYmxlIGV4OwotCQkJaWYgKGUgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0JCQkJZXggPSAoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIGUpCi0JCQkJCQkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQl9IGVsc2UgewotCQkJCWV4ID0gZTsKLQkJCX0KLQkJCVN0cmluZyBtc2cgPSBUbmdVdGlsLnRvU3RhY2tUcmFjZVN0cmluZyhleCk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwgMCwKLQkJCQkJbXNnLCBleCk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBMaXN0IHNlbGVjdFRhc2tzKExpc3QgdGFza0xpc3QsIFdvcmtQcm9kdWN0IHdwKSB7Ci0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqLCBpbnQgY29sdW1uKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShvYmopOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmopOwotCQkJfQotCQl9OwotCi0JCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKExpc3QpIG9iamVjdCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQlQcm9jZXNzTGlzdFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2coCi0JCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkuZ2V0U2hlbGwoKSwKLQkJCQkJdGFza0xpc3QsCi0JCQkJCWNvbnRlbnRQcm92aWRlciwKLQkJCQkJbGFiZWxQcm92aWRlciwKLQkJCQkJTkxTCi0JCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy51aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd3BsaXN0ZGxnX21zZywKLQkJCQkJCQkJCXdwLmdldE5hbWUoKSkpOwotCi0JCQlkbGcuc2V0VGl0bGUoTGlicmFyeUVkaXRSZXNvdXJjZXMudWlfVXNlckludGVyYWN0aW9uSGVscGVyX3Rhc2tzKTsKLQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWRsZy5vcGVuKCk7Ci0JCQlPYmplY3RbXSBvYmpzID0gZGxnLmdldFJlc3VsdCgpOwotCi0JCQlMaXN0IHNlbGVjdGVkVGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAoKG9ianMgIT0gbnVsbCkgJiYgKG9ianMubGVuZ3RoID4gMCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspIHsKLQkJCQkJc2VsZWN0ZWRUYXNrcy5hZGQob2Jqc1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHNlbGVjdGVkVGFza3M7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBkaXNwb3NlCi0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCWNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgTGlzdCBzZWxlY3RXb3JrUHJvZHVjdHMoTGlzdCB3cExpc3QsIFJvbGUgcm9sZSkgewotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iaiwgaW50IGNvbHVtbikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCXJldHVybiBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUob2JqKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqKTsKLQkJCX0KLQkJfTsKLQotCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gKChMaXN0KSBvYmplY3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IFByb2Nlc3NMaXN0U2VsZWN0aW9uRGlhbG9nKAotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJLmdldFNoZWxsKCksCi0JCQkJCS8vIE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSwKLQkJCQkJd3BMaXN0LAotCQkJCQljb250ZW50UHJvdmlkZXIsCi0JCQkJCWxhYmVsUHJvdmlkZXIsCi0JCQkJCU5MUwotCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMudWlfVXNlckludGVyYWN0aW9uSGVscGVyX3JvbGVsaXN0ZGxnX21zZywKLQkJCQkJCQkJCXJvbGUuZ2V0TmFtZSgpKSk7Ci0KLQkJCWRsZwotCQkJCQkuc2V0VGl0bGUoTGlicmFyeUVkaXRSZXNvdXJjZXMudWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dvcmtwcm9kdWN0cyk7IAotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZGxnLm9wZW4oKTsKLQkJCU9iamVjdFtdIG9ianMgPSBkbGcuZ2V0UmVzdWx0KCk7Ci0KLQkJCUxpc3Qgc2VsZWN0ZWRXcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAoKG9ianMgIT0gbnVsbCkgJiYgKG9ianMubGVuZ3RoID4gMCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspIHsKLQkJCQkJc2VsZWN0ZWRXcHMuYWRkKG9ianNbaV0pOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzZWxlY3RlZFdwczsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIGRpc3Bvc2UKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJY29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSdW5uYWJsZVdpdGhQcm9ncmVzcyBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCQlwcml2YXRlIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcGVyYXRpb247Ci0KLQkJcHVibGljIFJ1bm5hYmxlV2l0aFByb2dyZXNzKElSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCkgewotCQkJdGhpcy5vcGVyYXRpb24gPSBvcDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCW9wZXJhdGlvbi5ydW4obW9uaXRvcik7Ci0JCX0KLQkJCi0JfQotCi0JcHVibGljIElTdGF0dXMgcnVuQXNKb2IoZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLCBTdHJpbmcgdGFza05hbWUsCi0JCQlPYmplY3Qgc2hlbGwpIHsKLQkJSm9iIGpvYiA9IG5ldyBXb3Jrc3BhY2VKb2IodGFza05hbWUpIHsKLQotCQkJcHVibGljIElTdGF0dXMgcnVuSW5Xb3Jrc3BhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gbW9uaXRvci5iZWdpblRhc2sodGFza05hbWUsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0JCQkJCXJ1bm5hYmxlLnJ1bihtb25pdG9yKTsKLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRocm93YWJsZSBleDsKLQkJCQkJaWYgKGUuZ2V0Q2F1c2UoKSAhPSBudWxsKSB7Ci0JCQkJCQlleCA9IGUuZ2V0Q2F1c2UoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWV4ID0gZTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbgotCQkJCQkJCS5nZXRQbHVnaW4oKS5nZXRJZCgpLCAwLCBleC50b1N0cmluZygpLCBleCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbgotCQkJCQkJCS5nZXRQbHVnaW4oKS5nZXRJZCgpLCAwLCBlLnRvU3RyaW5nKCksIGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnNob3dJbkRpYWxvZygoU2hlbGwpIHNoZWxsLCBqb2IpOwotCQlqb2Iuc2NoZWR1bGUoKTsKLQkJcmV0dXJuIGpvYi5nZXRSZXN1bHQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBydW5JblVJKElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwKLQkJCUlTY2hlZHVsaW5nUnVsZSBydWxlLCBPYmplY3Qgc2hlbGwpIHsKLQkJaWYgKHNoZWxsID09IG51bGwpIHsKLQkJCXNoZWxsID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvbnRleHQoKTsKLQkJfQotCQlJUnVubmFibGVDb250ZXh0IGNvbnRleHQgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKChTaGVsbCkgc2hlbGwpOwotCQl0cnkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5ydW5JblVJKGNvbnRleHQsCi0JCQkJCW5ldyBSdW5uYWJsZVdpdGhQcm9ncmVzcyhydW5uYWJsZSksIHJ1bGUpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZTsKLQkJCUV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKS5nZXRNZXNzZW5nZXIoKQotCQkJCS5zaG93RXJyb3IodGl0bGUsIGUudG9TdHJpbmcoKSwgbnVsbCwgZSk7Ci0vLwkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsCi0vLwkJCQkJZS50b1N0cmluZygpLCBlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJ1bldpdGhQcm9ncmVzcyhmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsCi0JCQlmaW5hbCBJUnVubmFibGVDb250ZXh0IHJ1bm5hYmxlQ29udGV4dCwgZmluYWwgYm9vbGVhbiBjYW5DYW5jZWwsIGZpbmFsIFN0cmluZyBtc2cpIHsKLQkJZmluYWwgTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLk9LLAotCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yX3JlYXNvbiwgbnVsbCk7IAotCi0JCWZpbmFsIG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3BlcmF0aW9uID0gbmV3IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2sobXNnLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOwotCQkJCW1vbml0b3Iuc3ViVGFzaygiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cnkgewotCQkJCQlydW5uYWJsZS5ydW4obW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN0cmluZyBtc2c7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgTWVzc2FnZUV4Y2VwdGlvbikgewotCQkJCQkJbXNnID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmdXcml0ZXIgc3RyV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHN0cldyaXRlcikpOwotCQkJCQkJbXNnID0gc3RyV3JpdGVyLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksIDAsCi0JCQkJCQkJbXNnLCBlKSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0KLQkJdHJ5IHsKLQkJCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKSB7Ci0JCQkJLy8gY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdXNlci1pbnRlcmZhY2UgdGhyZWFkCi0JCQkJLy8KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlydW5uYWJsZUNvbnRleHQucnVuKHRydWUsIGNhbkNhbmNlbCwgb3BlcmF0aW9uKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJcnVubmFibGVDb250ZXh0LnJ1bih0cnVlLCBjYW5DYW5jZWwsIG9wZXJhdGlvbik7Ci0JCQl9Ci0KLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCUV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKQotCQkJCQkJLmdldE1lc3NlbmdlcigpLnNob3dFcnJvcigKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yX21zZ1dpdGhEZXRhaWxzLAotCQkJCQkJCQlzdGF0dXMpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcgdGhhdCBzaG91bGRuJ3QuCi0JCQkvLwotCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4Y2VwdGlvbik7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcnVuV2l0aFByb2dyZXNzKElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwKLQkJCWJvb2xlYW4gY2FuQ2FuY2VsLCBTdHJpbmcgbXNnKSB7Ci0JCXJldHVybiBydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIGdldFJ1bm5hYmxlQ29udGV4dCgpLCBmYWxzZSwgbXNnKTsKLQl9Ci0KLQlwdWJsaWMgSVJ1bm5hYmxlQ29udGV4dCBnZXRSdW5uYWJsZUNvbnRleHQoKSB7Ci0JCVNoZWxsIHNoZWxsOwotCQlPYmplY3QgdWlDdHggPSBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCkuZ2V0VUlDb250ZXh0KCk7Ci0JCWlmICh1aUN0eCBpbnN0YW5jZW9mIFNoZWxsKSB7Ci0JCQlzaGVsbCA9IChTaGVsbCkgdWlDdHg7Ci0JCX0gZWxzZSB7Ci0JCQlzaGVsbCA9IE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKTsKLQkJfQotCQlyZXR1cm4gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVmlld2VyIGRvR2V0Vmlld2VyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBQcm9jZXNzIHByb2MpIHsKLQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KAotCQkJCQkoKEV4cG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJLmdldENoYW5nZUxpc3RlbmVycygpKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgbGlzdGVuZXIgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBJQ29udGVudFByb3ZpZGVyICYmIGxpc3RlbmVyIGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKSB7CQkJCQkKLQkJCQkJVmlld2VyIHZpZXdlciA9ICgoSVZpZXdlclByb3ZpZGVyKSBsaXN0ZW5lcikuZ2V0Vmlld2VyKCk7Ci0JCQkJCWlmICh2aWV3ZXIuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQKLQkJCQkJCQkmJiAoKFByb2Nlc3NDb21wb25lbnQpIHZpZXdlci5nZXRJbnB1dCgpKQotCQkJCQkJCQkJLmdldFByb2Nlc3MoKSA9PSBwcm9jKQotCQkJCQkJcmV0dXJuIHZpZXdlcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVmcmVzaE5lZWRlZChBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyKSB7Ci0JCVByb2Nlc3MgcHJvY2VzcyA9IChQcm9jZXNzKSBpdGVtUHJvdmlkZXIuZ2V0VG9wSXRlbSgpOwotCQlpZiAocHJvY2VzcyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vIGNoZWNrIGlmIHRoZSBnaXZlbiBwcm9jZXNzIGlzIGN1cnJlbnRseSBvcGVuZWQgaW4gZWRpdG9yCi0JCS8vCi0JCVZpZXdlciB2aWV3ZXIgPSBkb0dldFZpZXdlcihhZGFwdGVyRmFjdG9yeSwgcHJvY2Vzcyk7Ci0JCWlmICh2aWV3ZXIgIT0gbnVsbCAmJiB2aWV3ZXIuZ2V0Q29udHJvbCgpICE9IG51bGwKLQkJCQkmJiAhdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gVG5nVXRpbC5nZXRDb250cmlidXRvcnMocHJvY2Vzcyk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQoZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChyZWZyZXNoTmVlZGVkKGFkYXB0ZXJGYWN0b3J5LCBhZGFwdGVyKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKHByb2Nlc3MsCi0JCQkJVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KGVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAocmVmcmVzaE5lZWRlZChhZGFwdGVyRmFjdG9yeSwgYWRhcHRlcikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaEFsbFZpZXdlcnMoZmluYWwgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1blNhZmVseShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KAotCQkJCQkJYWRhcHRlckZhY3RvcnkuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbGlzdGVuZXIgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSUNvbnRlbnRQcm92aWRlciAmJiBsaXN0ZW5lciBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgewkJCQkJCi0JCQkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpIGxpc3RlbmVyKS5nZXRWaWV3ZXIoKTsKLQkJCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCAmJiB2aWV3ZXIuZ2V0Q29udHJvbCgpICE9IG51bGwKLQkJCQkJCQkJJiYgIXZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpCi0JCQkJCQkJCSYmIHZpZXdlci5nZXRJbnB1dCgpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaFZpZXdlcihBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBQcm9jZXNzIHByb2MpIHsKLQkJZmluYWwgVmlld2VyIHZpZXdlciA9IGRvR2V0Vmlld2VyKGZhY3RvcnksIHByb2MpOwotCQlpZiAodmlld2VyICE9IG51bGwgJiYgdmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsCi0JCQkJJiYgIXZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5ydW5TYWZlbHkobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCQkKLQkJCX0sIHRydWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaElEc0luVmlld2VyKGZpbmFsIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5ydW5TYWZlbHkobmV3IFJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgKLQkJCQkJCWFkYXB0ZXJGYWN0b3J5LmdldENoYW5nZUxpc3RlbmVycygpKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGxpc3RlbmVyID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIElDb250ZW50UHJvdmlkZXIgJiYgbGlzdGVuZXIgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsJCQkJCQotCQkJCQkJVmlld2VyIHZpZXdlciA9ICgoSVZpZXdlclByb3ZpZGVyKSBsaXN0ZW5lcikuZ2V0Vmlld2VyKCk7Ci0JCQkJCQlpZiAodmlld2VyICE9IG51bGwgJiYgdmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsCi0JCQkJCQkJCSYmICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKQotCQkJCQkJCQkmJiB2aWV3ZXIuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIHZpZXdlci5nZXRJbnB1dCgpKQotCQkJCQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCQkJCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJCQkJLmFkYXB0KHByb2MsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQkJaWYgKGl0ZW1Qcm92aWRlci5pc1JlZnJlc2hBbGxJRHNSZXF1aXJlZCgpKSB7Ci0JCQkJCQkJCVByb2Nlc3NVdGlsLnVwZGF0ZUlEcyhhZGFwdGVyRmFjdG9yeSwgcHJvYyk7Ci0JCQkJCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCQkJCWl0ZW1Qcm92aWRlci5zZXRSZWZyZXNoQWxsSURzUmVxdWlyZWQoZmFsc2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQl9LCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFZpZXdlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgUHJvY2VzcyBwcm9jKSB7Ci0JCXJldHVybiBkb0dldFZpZXdlcihhZGFwdGVyRmFjdG9yeSwgcHJvYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuU2FmZWx5KGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlLCBib29sZWFuIHN5bmNocm9ub3VzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLwotCQl9Ci0JCQotCQlSdW5uYWJsZSBydW5uZXIgPSBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlydW5uYWJsZS5ydW4oKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQotCQlpZihkaXNwbGF5ID09IG51bGwpIHsKLQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJLy8KLQkJCXRyeSB7Ci0JCQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJfQotCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQotCQkJfQotCQkJaWYoZGlzcGxheSAhPSBudWxsKSB7Ci0JCQkJaWYoc3luY2hyb25vdXMpIHsKLQkJCQkJZGlzcGxheS5zeW5jRXhlYyhydW5uZXIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZGlzcGxheS5hc3luY0V4ZWMocnVubmVyKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlydW5uZXIucnVuKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBjdXJyZW50IHRocmVhZCBpcyBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJLy8KLQkJCWlmKHN5bmNocm9ub3VzKSB7Ci0JCQkJcnVubmVyLnJ1bigpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZGlzcGxheS5hc3luY0V4ZWMocnVubmVyKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bldpdGhCdXN5SW5kaWNhdG9yKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBydW5uYWJsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuSW5VSShmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsIFN0cmluZyB0YXNrTmFtZSkgewotCQlTaGVsbCBzaGVsbCA9IChTaGVsbCkgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvbnRleHQoKTsKLQkJaWYgKHNoZWxsID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcnVubmFibGUucnVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCXJldHVybjsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCUpvYiBqb2IgPSBuZXcgV29ya2JlbmNoSm9iKHRhc2tOYW1lKSB7Ci0KLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cnkgewotCQkJCQlydW5uYWJsZS5ydW4obW9uaXRvcik7Ci0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQlUaHJvd2FibGUgZXg7Ci0JCQkJCWlmIChlLmdldENhdXNlKCkgIT0gbnVsbCkgewotCQkJCQkJZXggPSBlLmdldENhdXNlKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlleCA9IGU7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4KLQkJCQkJCQkuZ2V0UGx1Z2luKCkuZ2V0SWQoKSwgMCwgZXgudG9TdHJpbmcoKSwgZXgpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4KLQkJCQkJCQkuZ2V0UGx1Z2luKCkuZ2V0SWQoKSwgMCwgZS50b1N0cmluZygpLCBlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5zaG93SW5EaWFsb2coc2hlbGwsIGpvYik7Ci0JCWpvYi5zY2hlZHVsZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ly5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGFiMTEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZQotb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ly5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3MGZiNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVlZGNlZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzO3Zpc2liaWxpdHk6PXJlZXhwb3J0Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmludGVybmFsLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmludGVybmFsLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWksCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24sCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU4YjA4Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLwotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2NoZWNrZWRfYm94LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvY2hlY2tlZF9ib3guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2FjYjk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvY2hlY2tlZF9ib3guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfQWN0aXZpdHkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfQWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUFjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX0FjdGl2aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X2NvbmNlcHRzQW5kUGFwZXJzX0NvbmNlcHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfY29uY2VwdHNBbmRQYXBlcnNfQ29uY2VwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZjg0ZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfY29uY2VwdHNBbmRQYXBlcnNfQ29uY2VwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDdXN0b21DYXRlZ29yeV9jYXRlZ29yaXplZEVsZW1lbnRzX0N1c3RvbUNhdGVnb3J5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUN1c3RvbUNhdGVnb3J5X2NhdGVnb3JpemVkRWxlbWVudHNfQ3VzdG9tQ2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQ3OTgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUN1c3RvbUNhdGVnb3J5X2NhdGVnb3JpemVkRWxlbWVudHNfQ3VzdG9tQ2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19DdXN0b21DYXRlZ29yeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX0N1c3RvbUNhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY0Nzk4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX0N1c3RvbUNhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpc2NpcGxpbmVHcm91cGluZ19kaXNjaXBsaW5lc19EaXNjaXBsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpc2NpcGxpbmVHcm91cGluZ19kaXNjaXBsaW5lc19EaXNjaXBsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViZDQ3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfRGlzY2lwbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmFjdGljZV9zdWJQcmFjdGljZV9QcmFjdGljZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmFjdGljZV9zdWJQcmFjdGljZV9QcmFjdGljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MjA5Y2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJhY3RpY2Vfc3ViUHJhY3RpY2VfUHJhY3RpY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX1JvbGVTZXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX1JvbGVTZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDk5ZmVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJvbGVTZXRHcm91cGluZ19yb2xlU2V0c19Sb2xlU2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdvcmtQcm9kdWN0X2VzdGltYXRlX0VzdGltYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdvcmtQcm9kdWN0X2VzdGltYXRlX0VzdGltYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM2NDNkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrUHJvZHVjdF9lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXJ0aWZhY3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0FydGlmYWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxZDIxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXJ0aWZhY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJucy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm5zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcxNDc2NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm5zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DaGVja2xpc3RzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DaGVja2xpc3RzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhmNmQ4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2hlY2tsaXN0cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uY2VwdHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbmNlcHRzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRmODRkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uY2VwdHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbmZpZ3VyYXRpb25zLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25maWd1cmF0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMjRmZGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbmZpZ3VyYXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhMzExZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ3VzdG9tQ2F0ZWdvcmllcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ3VzdG9tQ2F0ZWdvcmllcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYTVkN2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0N1c3RvbUNhdGVnb3JpZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJhYmxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMTA1NjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJhYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3Nlcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjI0YTlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3Nlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlzY2lwbGluZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rpc2NpcGxpbmVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1M2MxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlzY2lwbGluZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0RvbWFpbnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0RvbWFpbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjI4OTI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Eb21haW5zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzg0ZTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXhhbXBsZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0V4YW1wbGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI5NDRmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXhhbXBsZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0ZvbGRlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY0MTlkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HdWlkYW5jZUZvbGRlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGFuY2VGb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2IxNDE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HdWlkYW5jZUZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGFja2FnZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBhY2thZ2VzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMzOGNlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGFja2FnZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L091dGNvbWUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L091dGNvbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzAzNTE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9PdXRjb21lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QbGFubmluZ1RlbXBsYXRlcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGxhbm5pbmdUZW1wbGF0ZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWI2ZWQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QbGFubmluZ1RlbXBsYXRlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJhY3RpY2VzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QcmFjdGljZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzIwOWNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QcmFjdGljZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29udHJpYnV0aW9ucy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbnRyaWJ1dGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGQ4YzJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29udHJpYnV0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlsaWVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzRmFtaWxpZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjFiYTZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzRmFtaWxpZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3Nlcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc2VzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkOGMyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc2VzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXBvcnRzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXBvcnRzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVmM2UwYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVwb3J0cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmV1c2FibGVBc3NldHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JldXNhYmxlQXNzZXRzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyY2ZmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmV1c2FibGVBc3NldHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvYWRtYXBzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2FkbWFwcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMWJjNWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvYWRtYXBzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGEzZjY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3RhbmRhcmRDYXRlZ29yaWVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdGFuZGFyZENhdGVnb3JpZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njk4MzgyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdGFuZGFyZENhdGVnb3JpZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1N1cHBvcnRpbmdNYXRlcmlhbHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1N1cHBvcnRpbmdNYXRlcmlhbHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWEyMWVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdXBwb3J0aW5nTWF0ZXJpYWxzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzhiZDgzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza3NfY2Z2LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrc19jZnYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTUzYzFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrc19jZnYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlY2huaXF1ZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlY2huaXF1ZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjg2NmQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWNobmlxdWVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZW1wbGF0ZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlbXBsYXRlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NjMyNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlbXBsYXRlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVybURlZmluaXRpb25zLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZXJtRGVmaW5pdGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjFiZmUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZXJtRGVmaW5pdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rvb2xNZW50b3JzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Ub29sTWVudG9ycy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMWI4NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rvb2xNZW50b3JzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Ub29scy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjRmOGUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Ub29scy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV2hpdGVwYXBlcnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1doaXRlcGFwZXJzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTViNDgwMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV2hpdGVwYXBlcnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0R3VpZGVsaW5lcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RHdWlkZWxpbmVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3ZmE2NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RHdWlkZWxpbmVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFR5cGVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFR5cGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyODkyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RUeXBlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjI4OTI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L2VtcHR5X3BhY2tfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9lbXB0eV9wYWNrX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ODI4NGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L2VtcHR5X3BhY2tfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9wYWNrYWdlX29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvcGFja2FnZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzFjMjhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9wYWNrYWdlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvcHJvY2ZvbGRfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9wcm9jZm9sZF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDhlMjcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9wcm9jZm9sZF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L3Rvb2xzZXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L3Rvb2xzZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjRmOGUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi90b29sc2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvdW5jaGVja2VkX2JveC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL3VuY2hlY2tlZF9ib3guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmI5ZjhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvdW5jaGVja2VkX2JveC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAxMzliNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBMaWJyYXJ5IEVkaXQKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi1fVUlfQ29udGVudF9ncm91cD1NZXRob2QgQ29udGVudAotCi1fVUlfRGlzY2lwbGluZXNfZ3JvdXA9RGlzY2lwbGluZXMKLV9VSV9Eb21haW5zX2dyb3VwPURvbWFpbnMKLV9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwPVdvcmsgUHJvZHVjdCBLaW5kcwotX1VJX1JvbGVfU2V0c19ncm91cD1Sb2xlIFNldHMKLV9VSV9Ub29sc19ncm91cD1Ub29scwotX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXA9U3RhbmRhcmQgQ2F0ZWdvcmllcwotX1VJX0N1c3RvbV9DYXRlZ29yaWVzX2dyb3VwPUN1c3RvbSBDYXRlZ29yaWVzCi1fVUlfTWV0aG9kQ29udGVudF9ncm91cD1Db250ZW50IFBhY2thZ2VzCi0KLV9VSV9Qcm9jZXNzZXNfZ3JvdXA9UHJvY2Vzc2VzCi1fVUlfUGxhbm5pbmdUZW1wbGF0ZXNfZ3JvdXA9UGxhbm5pbmcgVGVtcGxhdGVzCi0KLV9VSV9DYXBhYmlsaXR5UGF0dGVybnNfdGV4dD1DYXBhYmlsaXR5IFBhdHRlcm5zCi1fVUlfRGVsaXZlcnlQcm9jZXNzZXNfdGV4dD1EZWxpdmVyeSBQcm9jZXNzZXMKLV9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uc190ZXh0PURpZmZlcmVudGlhbCBQcm9jZXNzZXMKLV9VSV9QbGFubmluZ1RlbXBsYXRlc190ZXh0PVBsYW5uaW5nIFRlbXBsYXRlcwotCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1DYXBhYmlsaXR5IFBhdHRlcm4KLV9VSV9EZWxpdmVyeVByb2Nlc3NfdGV4dD1EZWxpdmVyeSBQcm9jZXNzCi1fVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0PURpZmZlcmVudGlhbCBQcm9jZXNzCi0KLV9VSV9Db25maWd1cmF0aW9uc190ZXh0PUNvbmZpZ3VyYXRpb25zCi0KLV9VSV9Qcm9jZXNzRmFtaWxpZXNfdGV4dD1Qcm9jZXNzIEZhbWlsaWVzCi0KLV9VSV9VbmNhdGVnb3JpemVkX3RleHQ9VW5jYXRlZ29yaXplZAotX1VJX1VuY2F0ZWdvcml6ZWRfVGFza3NfdGV4dD1VbmNhdGVnb3JpemVkIFRhc2tzCi1fVUlfVW5jYXRlZ29yaXplZF9Sb2xlc190ZXh0PVVuY2F0ZWdvcml6ZWQgUm9sZXMKLQotX1VJX0d1aWRhbmNlc19ncm91cD1HdWlkYW5jZQotX1VJX0d1aWRhbmNlc19DaGVja2xpc3RzPUNoZWNrbGlzdHMKLV9VSV9HdWlkYW5jZXNfQ29uY2VwdHM9Q29uY2VwdHMKLV9VSV9HdWlkYW5jZXNfRXhhbXBsZXM9RXhhbXBsZXMKLV9VSV9HdWlkYW5jZXNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPUVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMKLV9VSV9HdWlkYW5jZXNfUHJhY3RpY2VzPVByYWN0aWNlcwotX1VJX0d1aWRhbmNlc19SZXBvcnRzPVJlcG9ydHMKLV9VSV9HdWlkYW5jZXNfUmV1c2FibGVBc3NldHM9UmV1c2FibGUgQXNzZXRzCi1fVUlfR3VpZGFuY2VzX1JvYWRtYXA9Um9hZG1hcAotX1VJX0d1aWRhbmNlc19TdXBwb3J0aW5nTWF0ZXJpYWxzPVN1cHBvcnRpbmcgTWF0ZXJpYWxzCi1fVUlfR3VpZGFuY2VzX1RlY2huaXF1ZXM9VGVjaG5pcXVlcwotX1VJX0d1aWRhbmNlc19UZW1wbGF0ZXM9VGVtcGxhdGVzCi1fVUlfR3VpZGFuY2VzX1Rlcm1EZWZpbml0aW9ucz1UZXJtIERlZmluaXRpb25zCi1fVUlfR3VpZGFuY2VzX1Rvb2xNZW50b3JzPVRvb2wgTWVudG9ycwotX1VJX0d1aWRhbmNlc19XaGl0ZXBhcGVycz1XaGl0ZXBhcGVycwotX1VJX0d1aWRhbmNlc19Xb3JrUHJvZHVjdEd1aWRlbGluZXM9R3VpZGVsaW5lcwotCi0KLV9VSV9Sb2xlc19ncm91cD1Sb2xlcwotX1VJX1Rhc2tzX2dyb3VwPVRhc2tzCi1fVUlfV29ya1Byb2R1Y3RzX2dyb3VwPVdvcmsgUHJvZHVjdHMKLQotIyBCcmVha2Rvd24gc3RydWN0dXJlIGNvbHVtbiBkaXNwbGF5IG5hbWVzCi1CU19Db2x1bW5fbmFtZT1OYW1lCi1CU19Db2x1bW5fcHJlZml4PVByZWZpeAotQlNfQ29sdW1uX2lkPUluZGV4Ci1CU19Db2x1bW5fcHJlZGVjZXNzb3JzPVByZWRlY2Vzc29ycwotQlNfQ29sdW1uX2lzX3JlcGVhdGFibGU9UmVwZWF0YWJsZQotQlNfQ29sdW1uX2lzX29uZ29pbmc9T25nb2luZwotQlNfQ29sdW1uX2lzX2V2ZW50X2RyaXZlbj1FdmVudC1Ecml2ZW4KLUJTX0NvbHVtbl9lbnRyeV9zdGF0ZT1FbnRyeSBTdGF0ZQotQlNfQ29sdW1uX2V4aXRfc3RhdGU9RXhpdCBTdGF0ZQotQlNfQ29sdW1uX3RlYW1zPVRlYW0KLUJTX0NvbHVtbl90eXBlPVR5cGUKLUJTX0NvbHVtbl9tb2RlbF9pbmZvPU1vZGVsIEluZm8KLUJTX0NvbHVtbl9wcmVzZW50YXRpb25fbmFtZT1QcmVzZW50YXRpb24gTmFtZQotQlNfQ29sdW1uX2RlbGl2ZXJhYmxlPURlbGl2ZXJhYmxlCi1CU19Db2x1bW5faXNfb3B0aW9uYWw9T3B0aW9uYWwKLUJTX0NvbHVtbl9pc19wbGFubmVkPVBsYW5uZWQKLUJTX0NvbHVtbl9oYXNfbXVsdGlwbGVfb2NjdXJyZW5jZXM9TXVsdGlwbGUgT2NjdXJyZW5jZXMKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTNmYzczLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idGV4dFJlZmVyZW5jZVJlcGxhY2VyIiBuYW1lPSJUZXh0IFJlZmVyZW5jZSBSZXBsYWNlciIgc2NoZW1hPSJzY2hlbWEvdGV4dFJlZmVyZW5jZVJlcGxhY2VyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImRpYWdyYW1NYW5hZ2VyIiBuYW1lPSJEaWFncmFtIE1hbmFnZXIiIHNjaGVtYT0ic2NoZW1hL2RpYWdyYW1NYW5hZ2VyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImNvbW1hbmRMaXN0ZW5lcnMiIG5hbWU9IkNvbW1hbmQgTGlzdGVuZXJzIiBzY2hlbWE9InNjaGVtYS9jb21tYW5kTGlzdGVuZXJzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImxpYnJhcnlJbnNwZWN0b3IiIG5hbWU9IkxpYnJhcnkgSW5zcGVjdG9yIiBzY2hlbWE9InNjaGVtYS9saWJyYXJ5SW5zcGVjdG9yLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im5lc3RlZENvbW1hbmRQcm92aWRlcnMiIG5hbWU9Ik5lc3RlZCBDb21tYW5kIFByb3ZpZGVycyIgc2NoZW1hPSJzY2hlbWEvbmVzdGVkQ29tbWFuZFByb3ZpZGVycy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJvcHBvc2l0ZUZlYXR1cmVMb2FkZXJzIiBuYW1lPSJPcHBvc2l0ZUZlYXR1cmUgTG9hZGVycyIgc2NoZW1hPSJzY2hlbWEvb3Bwb3NpdGVGZWF0dXJlTG9hZGVycy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ1c2VySW50ZXJhY3Rpb25IYW5kbGVyIiBuYW1lPSJVc2VyIEludGVyYWN0aW9uIEhhbmRsZXIiIHNjaGVtYT0ic2NoZW1hL3VzZXJJbnRlcmFjdGlvbkhhbmRsZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idmFsaWRhdGlvblN1cHBvcnQiIG5hbWU9IlZhbGlkYXRpb24gU3VwcG9ydCIgc2NoZW1hPSJzY2hlbWEvdmFsaWRhdGlvblN1cHBvcnQuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idWlIZWxwZXIiIG5hbWU9IlVJIEhlbHBlciIgc2NoZW1hPSJzY2hlbWEvdWlIZWxwZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ibGlicmFyeVZpZXdBZGFwdGVyRmFjdG9yeSIgbmFtZT0iTGlicmFyeVZpZXcgQWRhcHRlckZhY3RvcnkiIHNjaGVtYT0ic2NoZW1hL2xpYnJhcnlWaWV3QWRhcHRlckZhY3RvcnkuZXhzZCIvPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgPHBhY2thZ2UgCi0gICAgICAgdXJpID0gImh0dHA6Ly8vY29tL2libS91bWEvZWRpdC90bmcvdXRpbC9tb2RlbC5lY29yZSIgCi0gICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZSIgLz4KLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvY29tbWFuZExpc3RlbmVycy5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvY29tbWFuZExpc3RlbmVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTNhNzA1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2NvbW1hbmRMaXN0ZW5lcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ij4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0IiBpZD0iY29tbWFuZExpc3RlbmVycyIgbmFtZT0iQ29tbWFuZCBMaXN0ZW5lcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbW1hbmRMaXN0ZW5lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb21tYW5kTGlzdGVuZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSBtaWdyYXRvci4gVGhpcyBjbGFzcyBtdXN0IGJlIGEgcHVibGljIGltcGxlbWVudGF0aW9uIG9mICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbW1hbmRMaXN0ZW5lciZsdDsvY29kZSZndDsgd2l0aCBhIHB1YmxpYyAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2RpYWdyYW1NYW5hZ2VyLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9kaWFncmFtTWFuYWdlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzc1N2E5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2RpYWdyYW1NYW5hZ2VyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCIgaWQ9ImRpYWdyYW1NYW5hZ2VyIiBuYW1lPSJEaWFncmFtIE1hbmFnZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRpYWdyYW1NYW5hZ2VyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZGlhZ3JhbU1hbmFnZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2xpYnJhcnlJbnNwZWN0b3IuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2xpYnJhcnlJbnNwZWN0b3IuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQyMTFhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9saWJyYXJ5SW5zcGVjdG9yLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCIgaWQ9ImxpYnJhcnlJbnNwZWN0b3IiIG5hbWU9IkxpYnJhcnkgSW5zcGVjdG9yIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEluc3BlY3QgY29udGVudHMgb2YgbGliYXJ5IGZvciBkZWJ1ZyBvciB0ZXN0aW5nIHB1cnBvc2UuIFRoZSBpbnRlbnRpb24gaXMgdG8gcHJvdmlkZSBhIGNvbnZlaWVudCBwbGFjZSB0byBob29rIGFueSBleHRlcm5hbCBkZWJ1ZyBvciB0ZXN0aW5nIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgbm90IHBhcnQgb2YgRVBGLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibGlicmFyeUluc3BlY3RvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImxpYnJhcnlJbnNwZWN0b3IiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JTGlicmFyeUluc3BlY3RvcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvbGlicmFyeVZpZXdBZGFwdGVyRmFjdG9yeS5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvbGlicmFyeVZpZXdBZGFwdGVyRmFjdG9yeS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzliYTk3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2xpYnJhcnlWaWV3QWRhcHRlckZhY3RvcnkuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ij4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0IiBpZD0ibGlicmFyeVZpZXdBZGFwdGVyRmFjdG9yeSIgbmFtZT0iTGlicmFyeVZpZXcgQWRhcHRlckZhY3RvcnkiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFkYXB0ZXJGYWN0b3J5Ii8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJhZGFwdGVyRmFjdG9yeSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeToiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL25lc3RlZENvbW1hbmRQcm92aWRlcnMuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL25lc3RlZENvbW1hbmRQcm92aWRlcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlkOTM3Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9uZXN0ZWRDb21tYW5kUHJvdmlkZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+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+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9GZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNmZjNjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9GZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogQSBzdWJjbGFzcyBvZiBEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciB0aGF0IGtlZXBzIGEgcmVmZXJlbmNlIHRvIHRoZQotICogY29udGFpbmluZyBmZWF0dXJlIG9mIHRoZSB3cmFwcGVkIHZhbHVlIGFuZCBpbXBsZW1lbnRzIENvbXBhcmFibGUgdG8gc3VwcG9ydAotICogc29ydGluZy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIENvbXBhcmFibGUgewotCi0JcHVibGljIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBmZWF0dXJlLCBDb21tYW5kUGFyYW1ldGVyLk5PX0lOREVYLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZTsKLQl9CQkKLQotCXB1YmxpYyBMaXN0IGdldE5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMoKSB7Ci0JCWlmKGNoYW5nZU5vdGlmaWVyIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoKENvbGxlY3Rpb24pIGNoYW5nZU5vdGlmaWVyKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIjY3JlYXRlV3JhcHBlcihqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSkKLQkgKi8KLQlwcm90ZWN0ZWQgSVdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKG51bGwsIHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEZpbGxzIHRoZSBnaXZlbiB3cmFwcGVycyBieSBrZWVwaW5nIGV4aXN0aW5nLCByZW1vdmluZy9kaXNwb3NlIG9sZCwgYW5kCi0JICogYWRkaW5nIG5ldyBvbmVzLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVycwotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIHZhbHVlcwotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKENvbGxlY3Rpb24gd3JhcHBlcnMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJQ29sbGVjdGlvbiB2YWx1ZXMsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3JhcHBlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikgaXRlcgotCQkJCQkubmV4dCgpOwotCQkJaWYgKCF2YWx1ZXMucmVtb3ZlKHdyYXBwZXIuZ2V0VmFsdWUoKSkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCXdyYXBwZXIuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHZhbHVlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCXdyYXBwZXJzLmFkZChuZXcgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcihmZWF0dXJlLCBpdGVyCi0JCQkJCS5uZXh0KCksIG93bmVyLCBhZGFwdGVyRmFjdG9yeSkpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKLQkJT2JqZWN0IG90aGVyVmFsdWUgPSAoKElXcmFwcGVySXRlbVByb3ZpZGVyKSBvKS5nZXRWYWx1ZSgpOwotCQlpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpCi0JCQkJfHwgIShvdGhlclZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudCkgdmFsdWUpLmdldE5hbWUoKS5jb21wYXJlVG8oCi0JCQkJKChNZXRob2RFbGVtZW50KSBvdGhlclZhbHVlKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEzNTNmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lBZGFwdGVyRmFjdG9yeVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIgewotCS8qKgotCSAqIEdldHMgYWRhcHRlciBmYWN0b3J5IGZvciB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUFkYXB0ZXJGYWN0b3J5IGdldFdCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGVhbSB1c2FnZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlBZGFwdGVyRmFjdG9yeSBnZXRUQlNBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyBhZGFwdGVyIGZhY3RvcnkgZm9yIHdvcmsgcHJvZHVjdCB1c2FnZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlBZGFwdGVyRmFjdG9yeSBnZXRXUEJTQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgYWRhcHRlciBmYWN0b3J5IGZvciBjb25zb2xpZGF0ZWQgdmlldyBvZiB0aGUgcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JQWRhcHRlckZhY3RvcnkgZ2V0Q0JTQWRhcHRlckZhY3RvcnkoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWVlZWYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgYnJlYWsgZG93biBlbGVtZW50IGl0ZW0gcHJvdmlkZXJzIHRoYXQgd2FudAotICogdG8gbWFudGFpbiBhIGxpc3QgY2FjaGVkIGNoaWxkcmVuLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjYWNoZWQgY2hpbGRyZW4uCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgY2FjaGVkIGNoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUNhY2hlKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjYWNoZWQgcm9sbHVwIGNoaWxkZW4uCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgY2FjaGVkIHJvbGx1cCBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSb2xsdXBDaGlsZHJlbkZyb21DYWNoZSgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb21tYW5kTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbW1hbmRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjQ3YmI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbW1hbmRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgY29tbWFuZHMgdGhhdCB3YW50IHRvIG5vdGlmeSB0aGVpciBsaXN0ZW5lcnMgb2YKLSAqIGNlcnRhaW4gZXZlbnRzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBza2Fubm9vcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb21tYW5kTGlzdGVuZXIgewotCS8qKgotCSAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiBwcmlvciB0byB0aGUgZXhlY3V0aW9uIHRoZSBnaXZlbiBjb21tYW5kCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVFeGVjdXRlKENvbW1hbmQgY29tbWFuZCk7Ci0KLQkvKioKLQkgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gdGhhdCBhIGNvbW1hbmQgaGFzIGJlZW4gZXhlY3V0ZWQuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIGEgY29tbWFuZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUV4ZWN1dGVkKENvbW1hbmQgY29tbWFuZCk7Ci0KLQkvKioKLQkgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gcHJpb3IgdG8gdGhlIHVuZG8gb2YgdGhlIGdpdmVuIGNvbW1hbmQKLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqICAgICAgICAgICAgYW4gdW5kbyBjb21tYW5kCi0JICovCi0JcHVibGljIHZvaWQgcHJlVW5kbyhDb21tYW5kIGNvbW1hbmQpOwotCi0JCi0JLyoqCi0JICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIGFmdGVyIHVuZG8KLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBwb3N0VW5kbyhDb21tYW5kIGNvbW1hbmQpOwotCS8qKgotCSAqIEdldHMgdGhlIGNvbW1hbmQgY2xhc3MuCi0JICogCi0JICogQHJldHVybiBhIGNvbW1hbmQgY2xhc3MuCi0JICovCi0JcHVibGljIENsYXNzIGdldENvbW1hbmRUeXBlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbmZpZ3VyYWJsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOGI2ZGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgaXRlbSBwcm92aWRlcnMgdGhhdCBjYW4gYmUgY29uZmlndXJlZCB0byBkaXNwbGF5IGEKLSAqIGZpbHRlcmVkIGxpc3Qgb2YgY2hpbGRyZW4gYW5kIGhhdmUgdGhlaXIgZGVmYXVsdCBsYWJlbCBvdmVyd3JpdHRlbiBhdAotICogcnVudGltZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJhYmxlIHsKLQotCS8qKgotCSAqIFNldHMgdGhlIGZpbHRlciB0aGF0IGlzIHVzZWQgdG8gZmlsdGVyIHRoaXMgb2JqZWN0J3MgY2hpbGRyZW4uCi0JICogCi0JICogQHBhcmFtIGZpbHRlcgotCSAqICAgICAgICAgICAgYW4gPGNvZGU+SUZpbHRlcjwvY29kZT4gb2JqZWN0Ci0JICogQHNlZSBJRmlsdGVyCi0JICovCi0Jdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFiZWwgZm9yIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhCi0JICogICAgICAgICAgICBzdHJpbmcgbGFiZWwKLQkgKi8KLQl2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb25maWd1cmF0aW9uQXBwbGljYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGJlZjI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IHRvIG9idGFpbiBhbmQgcmVzb2x2ZSBtZXRob2QgZWxlbWVudCBhdHRyaWJ1dGVzIGFuZAotICogcmVmZXJlbmNlcyBpbiBhIG1ldGhvZCBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgewotCi0JLyoqCi0JICogR2V0cyB0aGUgYXR0cmlidXRlIHZhbHVlIG9mIGEgdmFyaWFiaWxpdHkgZWxlbWVudCBpbiBhIG1ldGhvZAotCSAqIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHZlCi0JICogICAgICAgICAgICBhIHZhcmlhYmlsaXR5IGVsZW1lbnQKLQkgKiBAcGFyYW0gYXR0cgotCSAqICAgICAgICAgICAgYW4gYXR0cmlidXRlCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgZGVyaXZlZCBmcm9tIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqICAgICAgICAgY2xvc3VyZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwgRUF0dHJpYnV0ZSBhdHRyLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgYXR0cmlidXRlIHZhbHVlIG9mIGEgY29udGVudCBkZXNjcmlwdGlvbiBpbiBhIG1ldGhvZAotCSAqIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGRlc2MKLQkgKiAgICAgICAgICAgIGEgY29udGVudCBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBvd25lcgotCSAqICAgICAgICAgICAgdGhlIG93bmVyIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGF0dHIKLQkgKiAgICAgICAgICAgIGFuIGF0dHJpYnV0ZSBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIGRlcml2ZWQgZnJvbSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiAgICAgICAgIGNsb3N1cmUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShDb250ZW50RGVzY3JpcHRpb24gZGVzYywgRGVzY3JpYmFibGVFbGVtZW50IG93bmVyLAotCQkJRUF0dHJpYnV0ZSBhdHRyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZWZlcmVuY2UgdmFsdWUgb2YgYSB2YXJpYWJpbGl0eSBlbGVtZW50IGluIGEgbWV0aG9kCi0JICogY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdmUKLQkgKiAgICAgICAgICAgIGEgdmFyaWFiaWxpdHkgZWxlbWVudAotCSAqIEBwYXJhbSByZWYKLQkgKiAgICAgICAgICAgIGEgcmVmZXJlbmNlIHJlcHJlc2VudGF0aW9uCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSByZWZlcmVuY2UgZGVyaXZlZCBmcm9tIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqICAgICAgICAgY2xvc3VyZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVmZXJlbmNlKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwgRVJlZmVyZW5jZSByZWYsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZWZlcmVuY2UgdmFsdWUgb2YgYSBjb250ZW50IGRlc2NyaXB0aW9uIGluIGEgbWV0aG9kCi0JICogY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzYwotCSAqICAgICAgICAgICAgYSBjb250ZW50IGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICB0aGUgb3duZXIgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gcmVmCi0JICogICAgICAgICAgICBhIHJlZmVyZW5jZSByZXByZXNlbnRhdGlvbgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIGRlcml2ZWQgZnJvbSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiAgICAgICAgIGNsb3N1cmUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmVyZW5jZShDb250ZW50RGVzY3JpcHRpb24gZGVzYywgRGVzY3JpYmFibGVFbGVtZW50IG93bmVyLAotCQkJRVJlZmVyZW5jZSByZWYsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHJlZmVyZW5jZSB2YWx1ZSBvZiBhIG1ldGhvZCBlbGVtZW50IG9wcG9zaXRlIGZlYXR1cmUgaW4gYSBtZXRob2QKLQkgKiBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIGFuIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBkZXJpdmVkIGZyb20gdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogICAgICAgICBjbG9zdXJlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotCS8qKgotCSAqIFJlc29sdmVzIHRoZSBnaXZlbiBvYmplY3QgdXNpbmcgdGhlIGdpdmVuIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0aGUgcmVzb2x2ZWQgbWV0aG9kIGVsZW1lbnQgZGVyaXZlZCBmcm9tIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqICAgICAgICAgY2xvc3VyZQotCSAqLwotCU9iamVjdCByZXNvbHZlKE9iamVjdCBvYmplY3QsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb25maWd1cmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhkMzg1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb25maWd1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgaXRlbSBwcm92aWRlcnMgYW5kIGNvbW1hbmRzIHRoYXQgd2FudCB0byBmaWx0ZXIKLSAqIGRvd24gcmVsYXRlZCBtZXRob2QgZWxlbWVudHMgaW4gYSBtZXRob2QgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRvciBleHRlbmRzIElNZXRob2RDb25maWd1cmF0aW9uUHJvdmlkZXIsIElGaWx0ZXIsIEFkYXB0ZXIgewotCi0Jdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotCS8qKgotCSAqIElmIHRoaXMgbWV0aG9kIHJldHVybiBhIG5vbi1OVUxMLCB0aGUgaXRlbSBwcm92aWRlciB3aWxsIHVzZSB0aGUgcmV0dXJuZWQKLQkgKiBjb2xsZWN0aW9uIGFzIGNoaWxkcmVuIGluIHBsYWNlIG9mIGl0cyBkZWZhdWx0IGNoaWxyZW4uCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBjaGlsZEZlYXR1cmUKLQkgKiBAcmV0dXJuCi0JICovCi0JQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlKTsKLQotCS8qKgotCSAqIFJlc29sdmVzIHRoaXMgb2JqZWN0IGFjY29yZGluZyB0byB2YXJpYWJpbGl0eSBydWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybiByZXNvbHZlZCBvYmplY3QgdGhhdCBpcyBlaXRoZXIgdGhlIG9iamVjdCBpdHNlbGYsIG9yIGl0cyByZXBsYWNlcgotCSAqICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSB2YXJpYWJpbGl0eSBvZiB0aGlzIG9iamVjdCBpbiB0aGUgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlPYmplY3QgcmVzb2x2ZShPYmplY3Qgb2JqZWN0KTsKLQotCS8qKgotCSAqIEdldHMgdmFyaWFiaWxpdHkgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBWYXJpYWJpbGl0eUVsZW1lbnQgY2FsY3VsYXRlZAotCSAqIGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoaXMgY29uZmlndXJhdG9yIGFuZCBhY2NvcmRpbmcgdG8gdGhlCi0JICogdmFyaWFiaWxpdHkgcnVsZXMuCi0JICogCi0JICogQHBhcmFtIHZlCi0JICogQHJldHVybgotCSAqIEBzZWUgVmFyaWFiaWxpdHlJbmZvCi0JICovCi0JVmFyaWFiaWxpdHlJbmZvIGdldFZhcmlhYmlsaXR5SW5mbyhWYXJpYWJpbGl0eUVsZW1lbnQgdmUpOwotCQotCS8qKgotCSAqIGdldCBmaWx0ZXIgZm9yIHVuY2F0ZWdvcml6ZWQgdGFza3MKLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRVbmNhdGVnb3JpemVkVGFza0ZpbHRlcigpOwotCQotCS8qKgotCSAqIGdldCBmaWx0ZXIgZm9yIHdvcmtwcm9kdWN0cyB3aXRob3V0IGEgZG9tYWluCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0RG9tYWluVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0RmlsdGVyKCk7Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3Igd29ya3Byb2R1Y3RzIHdpdGhvdXQgYSBXUCBUeXBlCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0V3BUeXBlVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0RmlsdGVyKCk7Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3IgdW5jYXRlZ29yaXplZCByb2xlcwotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFVuY2F0ZWdvcml6ZWRSb2xlRmlsdGVyKCk7Ci0KLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciB1bmNhdGVnb3JpemVkIHRvb2wgbWVudG9ycwotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFVuY2F0ZWdvcml6ZWRUb29sTWVudG9yRmlsdGVyKCk7Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3IgZGlzY2lwbGluZXMgYW5kIGRpc3BsaW5lIGdyb3VwaW5ncwotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldERpc2NpcGxpbmVzRmlsdGVyKCk7Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3Igcm9sZXNldHMgYW5kIHJvbGVzZXQgZ3JvdXBpbmdzCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0Um9sZVNldHNGaWx0ZXIoKTsKLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb25maWd1cmF0b3JGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb25maWd1cmF0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViY2I5OGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIGNvbmZpZ3VyYXRpb24gZmlsdGVyIGZhY3RvcnkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRvckZhY3RvcnkgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbmZpZ3VyYXRpb24gZmlsdGVyLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgY29uZmlndXJhdGlvbiBmaWx0ZXIuCi0JICovCi0JSUNvbmZpZ3VyYXRvciBjcmVhdGVDb25maWd1cmF0b3IoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lEZWZhdWx0TmFtZVNldHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JRGVmYXVsdE5hbWVTZXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmMGE3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lEZWZhdWx0TmFtZVNldHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IGl0ZW0gcHJvdmlkZXJzIHRoYXQgd2FudCB0byBhc3NpZ24gYSBkZWZhdWx0IG5hbWUKLSAqIGZvciBlYWNoIG5ld2x5IGNyZWF0ZWQgbWV0aG9kIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURlZmF1bHROYW1lU2V0dGVyIHsKLQotCS8qKgotCSAqIFNldHMgdGhlIGRlZmF1bHQgbmFtZSBmb3IgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIElEIG9mIHRoZSBmZWF0dXJlIHRoYXQgY29udGFpbnMgbWV0aG9kIGVsZW1lbnRzIHdob3NlIGRlZmF1bHQKLQkgKiBuYW1lIHNldCB0aHJvdWdoIHRoaXMgaW50ZXJmYWNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIElEIG9mIGEgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgb3duZXIgY2xhc3Mgb2YgdGhlIGZlYXR1cmUgdGhhdCBjb250YWlucyBtZXRob2QgZWxlbWVudHMgd2hvc2UKLQkgKiBkZWZhdWx0IG5hbWUgc2V0IHRocm91Z2ggdGhpcyBpbnRlcmZhY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgb3duZXIgY2xhc3Mgb2YgYSBmZWF0dXJlCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjkyYTA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotLyoqCi0gKiBBIGdlbmVyaWMgZmlsdGVyIHRoYXQgdXNlcyB0aGUgdmlzaXRvciBkZXNpZ24gcGF0dGVybi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRmlsdGVyIHsKLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gb2JqZWN0IGNhbiBiZSBhY2NlcHRlZCBieSB0aGlzIGZpbHRlci4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICB0aGUgdmlzaXRpbmcgb2JqZWN0Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGFjY2VwdGVkLCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZQotCSAqLwotCWJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lHcm91cENvbnRhaW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JR3JvdXBDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAyMDU0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lHcm91cENvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IGl0ZW0gcHJvdmlkZXJzIHRoYXQgd2FudCB0byBsZXQgY2xpZW50cyBhY2Nlc3MgaXRzCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciA8ZW0+Z3JvdXAgaXRlbSBwcm92aWRlcnM8L2VtPn0KLSAqIGJ5IG5hbWUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUdyb3VwQ29udGFpbmVyIHsKLQotCS8qKgotCSAqIEdldHMgdGhlIGdyb3VwIGl0ZW0gcHJvdmlkZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGdyb3VwIGl0ZW0gcHJvdmlkZXIKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI8Y29kZT4gb2JqZWN0Ci0JICovCi0JT2JqZWN0IGdldEdyb3VwSXRlbVByb3ZpZGVyKFN0cmluZyBuYW1lKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTJhNTNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUxpYnJhcnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IGl0ZW0gcHJvdmlkZXJzIHRoYXQgd2FudCB0byBpbmNsdWRlIFVJIGZvbGRlcnMKLSAqIGFuZCBmZWF0dXJlIGRlcml2ZWQgY2hpbGRyZW4uIAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFNldHMgdGhlIHBhcmVudCBvZiB0aGlzIGl0ZW0gcHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgYSBwYXJlbnQgb2JqZWN0LCB0eXBpY2FsbHkgYSBtZXRob2QgZWxlbWVudAotCSAqLwotCXZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgY2hpbGRyZW4gZmVhdHVyZXMuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIGZlYXR1cmVzIGZvciByZXRyaWV2aW5nIHRoZSBjaGlsZCBlbGVtZW50cwotCSAqLwotCUNvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JTWV0aG9kQ29uZmlndXJhdGlvblByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lNZXRob2RDb25maWd1cmF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM5OGUwNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lNZXRob2RDb25maWd1cmF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5lIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRob2RDb25maWd1cmF0aW9uUHJvdmlkZXIgewotCU1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JUGx1Z2luVUlQYWNrYWdlQ29udGV4dENoYW5nZWRMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JUGx1Z2luVUlQYWNrYWdlQ29udGV4dENoYW5nZWRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGEyODYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVBsdWdpblVJUGFja2FnZUNvbnRleHRDaGFuZ2VkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVBsdWdpblVJUGFja2FnZUNvbnRleHRDaGFuZ2VkTGlzdGVuZXIgewotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gUGx1Z2luIFBhY2thZ2UgcHJlc2VudGF0aW9uIGNoYW5nZWQuCi0JICogQHBhcmFtIGlzRmxhdCBpZiA8Y29kZT50cnVlPC9jb2RlPiwgbGF5b3V0IGlzIG5vdyBmbGF0IG1vZGUuIGlmIDxjb2RlPmZhbHNlPC9jb2RlPiwKLQkgKiBsYXlvdXQgaXMgaGllcmFyY2hpY2FsLgotCSAqLwotCXZvaWQgbGF5b3V0Q2hhbmdlZChib29sZWFuIGlzRmxhdCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVJlZmVyZW5jZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVJlZmVyZW5jZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJlOTQyYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lSZWZlcmVuY2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgYWRhcHRlciBmYWN0b3JpZXMgZm9yIGNsZWFuaW5nIHVwIHJlZmVyZW5jZXMgdG8KLSAqIHVudXNlZCBpdGVtIHByb3ZpZGVycy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVmZXJlbmNlciB7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiByZWZlcmVuY2UgdG8gYW4gaXRlbSBwcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gcmVmCi0JICogICAgICAgICAgICBhIHJlZmVyZW5jZSB0byBhbiBpdGVtIHByb3ZpZGVyCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVmZXJlbmNlIGlzIHN1Y2Nlc3NmdWxseSByZW1vdmVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCByZWYpOwotCi0JLyoqCi0JICogQ2xlYW5zIHVwIGFsbCB1bnVzZWQgcmVmZXJlbmNlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhblVwKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVN0YXRlZnVsSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lTdGF0ZWZ1bEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjMyY2UzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVN0YXRlZnVsSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgc3RhdGVmdWx0IGl0ZW0gcHJvdmlkZXJzIHRoYXQgbmVlZCB0byBiZQotICogZGlzcG9zZWQgYWZ0ZXIgdGhleSBhcmUgbm8gbG9uZ2VyIHVzZWQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIGV4dGVuZHMgSURpc3Bvc2FibGUgewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lXcmFwcGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZDY1OTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJV3JhcHBlciB7Ci0KLQlPYmplY3Qgd3JhcChFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwKLQkJCWludCBpbmRleCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzNmZjFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLQotLyoqCi0gKiBGYWN0b3J5IHRvIGNyZWF0ZSB7QGxpbmsgSVdyYXBwZXJJdGVtUHJvdmlkZXJ9Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gQXVnIDIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIHdyYXBwZXIgb2YgZ2l2ZW4gdmFsdWUgZm9yIHRoZSBnaXZlbiBvd25lcgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEByZXR1cm4KLQkgKi8KLQlJV3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVXcmFwcGVyKE9iamVjdCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGF0IHdoaWNoIHRoZSB2YWx1ZSBpcyBsb2NhdGVkLiBJZiBmZWF0dXJlIGlzIG5vbi1udWxsLCB0aGlzIGluZGV4IGlzIHdpdGhpbiB0aGF0IGZlYXR1cmUuCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHJldHVybgotCSAqLwotCUlXcmFwcGVySXRlbVByb3ZpZGVyIGNyZWF0ZVdyYXBwZXIoT2JqZWN0IHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2M2RhNmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEF1ZyAyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyIHsKLQlJV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkgZ2V0V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvTGlicmFyeUVkaXRQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvTGlicmFyeUVkaXRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEzNzJhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0xpYnJhcnlFZGl0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5BYnN0cmFjdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgTGlicmFyeSBFZGl0IHBsdWctaW4gY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlFZGl0UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RBY3RpdmF0b3IgewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgTGlicmFyeUVkaXRQbHVnaW4gcGx1Z2luOwotCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5RWRpdFBsdWdpbiBJTlNUQU5DRTsKLQotCS8vIFRoZSBzaGFyZWQgaW1hZ2UgaGFzaCBtYXAuCi0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gaW1hZ2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeUVkaXRQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCUlOU1RBTkNFID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuY29yZS5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuY29yZS5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5RWRpdFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlicmFyeUVkaXRQbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN5bWJvbGljIG5hbWUgb2YgdGhpcyBwbHVnLWluLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHN5bWJvbGljIG5hbWUgb2YgdGhpcyBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3ltYm9saWNOYW1lKCkgewotCQlyZXR1cm4gZ2V0SWQoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKFN0cmluZyBrZXkpIHsKLQkgICAgT2JqZWN0IHJlc3VsdCA9IGltYWdlcy5nZXQoa2V5KTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJlc3VsdCA9IGRvR2V0SW1hZ2Uoa2V5KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJfQotCQkJaWYocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlpbWFnZXMucHV0KGtleSwgcmVzdWx0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgT2JqZWN0IGRvR2V0SW1hZ2UoU3RyaW5nIGtleSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkgICAgVVJMIHVybCA9IG5ldyBVUkwoaWNvblVSTCArIGtleSArICIuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSB1cmwub3BlblN0cmVhbSgpOyAKLQkgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkgICAgcmV0dXJuIHVybDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW1hZ2UgZ2l2ZW4gdGhlIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2VVUkkKLQkgKiAgICAgICAgICAgIFRoZSBpbWFnZSdzIFVSSS4KLQkgKiBAcmV0dXJuIFRoZSBpbWFnZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNoYXJlZEltYWdlKFVSSSBpbWFnZVVSSSkgewotCQl0cnkgewotCQkJcmV0dXJuIGltYWdlVVJJLnRvVVJMKCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvTGlicmFyeUVkaXRSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvTGlicmFyeUVkaXRSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3MTk1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0xpYnJhcnlFZGl0UmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIExpYnJhcnkgRWRpdCBtZXNzYWdlIHJlc291cmNlIGJ1bmRsZSBhY2Nlc3NvciBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMaWJyYXJ5RWRpdFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cxOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbm5vdF9jb3B5X29yX2V4dGVuZF9kZWxpdmVyeV9wcm9jZXNzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlybURlc2NyaXB0b3JzRGVsZXRpb25fbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlybURlc2NyaXB0b3JzRGVsZXRpb25fdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZpbmdSZXNvdXJjZXNfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhcmlhYmlsaXR5X2Vycm9yX21zZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaXJjdWxhcl9kZXBlbmRlbmN5X2Vycm9yX21zZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YXJpYWJpbGl0eV9lbGVtZW50X2NpcmN1bGFyX2xvb3BfZXJyb3JfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nICByZXBsYWNpbmdfYW5jZXN0b3JfZXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXBwbHlfcGF0dGVybl9lcnJvcl9tc2cxOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHVwbGljYXRlRmVhdHVyZVZhbHVlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZV9tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weWluZ0FjdGl2aXRpZXNfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYWxSZXBsYWNlbWVudEFuZERlZXBDb3B5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWVwQ29weV9wcm9tcHRNc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWVwQ29weV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmVEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX2Nhbm5vdFJlbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZVJlZmVyZW5jZXNEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RGVsaXZlcmFibGVzRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RGVsaXZlcmFibGVzRGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdQcm9jZXNzQ29tcG9uZW50RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0Q29uZmlnTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VQcm9jZXNzTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VkT25Qcm9jZXNzZXNMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0QXNzb2NpYXRpb25MYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlQXNzb2NpYXRpb25EaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFRlYW1zRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0VGVhbXNEaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tTZWxlY3Rpb25EaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0aXRsZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW1wdHlFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZzI7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZEVsZW1lbnROYW1lRXJyb3IxX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRFbGVtZW50TmFtZUVycm9yMl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkRWxlbWVudE5hbWVFcnJvcjNfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRFbGVtZW50TmFtZUVycm9yNF9tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFBsdWdpbk5hbWVFcnJvcl9tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZVBhdGhOYW1lVG9vTG9uZ19tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm9Db25maWdFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub0RlbGl2ZXJ5UHJvY2Vzc0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vRGVmYXVsdENvbmZpZ0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vQmFzZVByb2Nlc3NFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVQcm9jZXNzRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlRWxlbWVudEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZUVsZW1lbnRFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3Jfc2ltcGxlX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZG9Db21tYW5kRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFByZWRlY2Vzc29yRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBkYXRlX291dG9mc3luY2hfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBkYXRlX291dG9mc3luY2hfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JfbXNnV2l0aERldGFpbHM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdXBwcmVzc2lvbl9uYW1lRHVwbGljYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdXBwcmVzc2lvbl9wcmVzZW50YXRpb25OYW1lRHVwbGljYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlUHJvY2Vzc0Vycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZVJlZmVyZW5jZXNFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlRmlsZUVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRSZWZlcmVuY2VzRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5yZXNvbHZlZE9iamVjdEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURyb3BDb21tYW5kX2RlZXBDb3B5X3Byb21wdENvbmZpZ3VyYXRpb25Nc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGluZ1Byb2Nlc3NDb21wb25lbnRUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzaW5nUmVmZXJlbmNlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0aW5nRWxlbWVudHNUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja2luZ1JlZmVyZW5jZXNUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmluZ1JlZmVyZW5jZXN0YXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tBZmZlY3RlZFJlc291cmNlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmluZ1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmluZ0ZpbGVzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weWluZ1Jlc291cmNlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmluZ0ZpbGVUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVFbGVtZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVQcm9jZXNzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250cmlidXRlc1RvX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhbENvbnRyaWJ1dGVzVG9fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVuZHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VzX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZW5kc19yZXBsYWNlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYWxSZXBsYWNlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudFR5cGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udHJpYnV0ZVRvQWN0aXZpdHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RHJvcENvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlQWN0aXZpdHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpcmVjdG9yeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5yZXNvbHZlZF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXNzaXN0c190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5rbm93bl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tbWFuZF9kb25lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHl3aXRocGx1Z2luX2luZm87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVdGlsX2xhYmVscGF0aF92YXJpYWJpbGl0eV9pbmZvOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfcmVmX2RlbGV0ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX3JlZl9kZWxldGUyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfcmVmZXJlbmNlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX3dvcmtwcm9kdWN0X2Rlc2NyaXB0b3JfZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1aV93b3JrcHJvZHVjdGRlc2NyaXB0b3Jfb3B0aW9uczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vdXRwdXRsYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9kZWxldGVfdGFzazsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9kZWZhdWx0Y29uZmlnY2hlY2s7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZ2VuZXJpY0Vycl9tZXNzYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uX25vRGVzY3JpcHRvclRvU3luY2g7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9yZWZlcnNoaW5ndmlld2VyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlybV9yZW1vdmVfcmVmZXJlbmNlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfdW5oYW5kbGVkX2V4Y2VwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfYnJlYWtkb3duX2VsZW1lbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd3BsaXN0ZGxnX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9yb2xlbGlzdGRsZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9mYXRhbGVycjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93b3JrcHJvZHVjdHM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX3N1Yl9lbGVtZW50OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF9Qcm9jZXNzVXRpbF9lcnJfd3JvbmdfZWxlbWVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHV0aWxfUHJvY2Vzc1V0aWxfZXJyX2NoaWxkX2VsZW1lbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfdGFza3M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1aV9hc3NvY2lhdGlvbl90YXNrX3NlbGVjdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHV0aWxfUHJvY2Vzc1V0aWxfY2hpbGRhZGFwdGVyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2V0cGFyZW50OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF90bmd1dGlsX2Nhbm5vdF9lZGl0X3Jlc291cmNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF9Qcm9jZXNzVXRpbF9jb250cmlidXRlc3RvOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF9Qcm9jZXNzVXRpbF9sb2NhbENvbnRyaWJ1dGVzdG87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzX2V4dGVuZHM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzX3JlcGxhY2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc19sb2NhbFJlcGxhY2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZWdyb3VwaW5nc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3doaXRlcGFwZXJzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfdG9vbG1lbnRvcnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c190b29sc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3JvbGVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfdGFza3NfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19yZXVzYWJsZWFzc2V0c190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2FsbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3Byb2Nlc3Nlc190ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19hY3Rpdml0aWVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfcHJhY3RpY2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfdGVtcGxhdGVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfY2hlY2tsaXN0c190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2d1aWRlbGluZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19yb2xlc2V0c190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2d1aWRhbmNlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfY29uY2VwdHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19leGFtcGxlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRwYWNrYWdlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3JvbGVkZXNjcmlwdG9yc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRncm9wdWluZ3NfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c190YXNrZGVzY3JpcHRvcnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19jb250ZW50ZWxlbWVudHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fcHJlcGFyZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdGRlc2NyaXB0b3JzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfYWxsY29udGVudGVsZW1lbnRzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfc3VwcG9ydGluZ21hdGVyaWFsc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfZXJyb3JTYXZpbmdGaWxlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19jdXN0b21jYXRlZ29yaWVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3R0eXBlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRfd2FybmluZ01zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19tZXRob2RwbHVnaW5zX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VySW50ZXJhY3Rpb25IZWxwZXJfbG9ja2VkUGx1Z2luOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2RvbWFpbnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19yb2FkbWFwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfcmVwb3J0c190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b1N5bmNocm9uaXplQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbnVhbFN5bmNocm9uaXplQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfc3VjZXNzZnVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bmNocm9uaXplQ29tcGxldGVEaWFsb2dfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VySW50ZXJhY3Rpb25IZWxwZXJfUHJvY2Vzc1BhY2thZ2VfTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0VsZW1lbnRfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZF9NZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU29ydFR5cGVfTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0VHlwZV9NYW51YWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0VHlwZV9BbHBoYWJldGljOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvcnRUeXBlX1JldmVyc2VBbHBoYWJldGljOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvcnRUeXBlX01ldGhvZFR5cGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3BlY2lmeU5hbWVUZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtPcmRlclR5cGVBYmJyZXZpYXRpb25fRklOSVNIX1RPX1NUQVJUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtPcmRlclR5cGVBYmJyZXZpYXRpb25fRklOSVNIX1RPX0ZJTklTSDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrT3JkZXJUeXBlQWJicmV2aWF0aW9uX1NUQVJUX1RPX0ZJTklTSDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrT3JkZXJUeXBlQWJicmV2aWF0aW9uX1NUQVJUX1RPX1NUQVJUOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTGlicmFyeUVkaXRSZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1BsdWdpblVJUGFja2FnZUNvbnRleHQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGRiMTRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFN0b3JlcyAoaW4gbWVtb3J5IG9ubHkpIHRoZSBGbGF0L0hpZXJhcmNoaWNhbCBwbHVnaW4tcGFja2FnZSBsYXlvdXQKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpblVJUGFja2FnZUNvbnRleHQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGx1Z2luVUlQYWNrYWdlQ29udGV4dCBJTlNUQU5DRSA9IG5ldyBQbHVnaW5VSVBhY2thZ2VDb250ZXh0KCk7IAotCi0JcHJpdmF0ZSBib29sZWFuIGlzRmxhdExheW91dCA9IGZhbHNlOwotCQotCXByaXZhdGUgTGlzdDxJUGx1Z2luVUlQYWNrYWdlQ29udGV4dENoYW5nZWRMaXN0ZW5lcj4gbGlzdGVuZXJzOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSElFUkFSQ0hJQ0FMX0xBWU9VVD0gImhpZXJhcmNoaWNhbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFUX0xBWU9VVD0gImZsYXQiOyAvLyROT04tTkxTLTEkCi0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZsYXRMYXlvdXQoKSB7Ci0JCXJldHVybiBpc0ZsYXRMYXlvdXQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRvZ2dsZUxheW91dCgpIHsKLQkJaXNGbGF0TGF5b3V0ID0gIWlzRmxhdExheW91dDsKLQkJbm90aWZ5TGlzdGVuZXJzKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGF5b3V0QXNTdHJpbmcoKSB7Ci0JCWlmIChpc0ZsYXRMYXlvdXQoKSkgewotCQkJcmV0dXJuIEZMQVRfTEFZT1VUOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIEhJRVJBUkNISUNBTF9MQVlPVVQ7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TGF5b3V0SGllcmFyY2hpY2FsKCkgewotCQlpc0ZsYXRMYXlvdXQgPSBmYWxzZTsKLQkJbm90aWZ5TGlzdGVuZXJzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGF5b3V0RmxhdCgpIHsKLQkJaXNGbGF0TGF5b3V0ID0gdHJ1ZTsKLQkJbm90aWZ5TGlzdGVuZXJzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElQbHVnaW5VSVBhY2thZ2VDb250ZXh0Q2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJUGx1Z2luVUlQYWNrYWdlQ29udGV4dENoYW5nZWRMaXN0ZW5lcj4oKTsKLQkJfQotCQlpZiAoIWxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElQbHVnaW5VSVBhY2thZ2VDb250ZXh0Q2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJaWYgKGxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXJzKCkgewotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3I8SVBsdWdpblVJUGFja2FnZUNvbnRleHRDaGFuZ2VkTGlzdGVuZXI+IGl0ZXIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJUGx1Z2luVUlQYWNrYWdlQ29udGV4dENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IGl0ZXIubmV4dCgpOwotCQkJCWxpc3RlbmVyLmxheW91dENoYW5nZWQoaXNGbGF0TGF5b3V0KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUHJlc2VudGF0aW9uQ29udGV4dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9QcmVzZW50YXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyM2Y5YjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9QcmVzZW50YXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9ycy5UeXBlQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciA3LCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJlc2VudGF0aW9uQ29udGV4dCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBQcmVzZW50YXRpb25Db250ZXh0IElOU1RBTkNFID0gbmV3IFByZXNlbnRhdGlvbkNvbnRleHQoKTsgCi0KLQlwcml2YXRlIGJvb2xlYW4gc2hvd1ByZXNlbnRhdGlvbk5hbWVzID0gZmFsc2U7Ci0JcHJpdmF0ZSBDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBDb21wYXJhdG9ycy5ERUZBVUxUX0NPTVBBUkFUT1I7Ci0JcHJpdmF0ZSBDb21wYXJhdG9yIHJldmVyc2VDb21wYXJhdG9yID0gQ29tcGFyYXRvcnMuUkVWRVJTRV9ERUZBVUxUX0NPTVBBUkFUT1I7Ci0JcHJpdmF0ZSBDb21wYXJhdG9yIG1ldGhvZEVsZW1lbnRUeXBlQ29tcGFyYXRvciA9IENvbXBhcmF0b3JzLk1FVEhPRF9UWVBFX0NPTVBBUkFUT1I7Ci0JCi0JCi0JcHJpdmF0ZSBDb21wYXJhdG9yIGd1aWRhbmNlVHlwZUNvbXBhcmF0b3IgPSBuZXcgVHlwZUNvbXBhcmF0b3IoKSB7Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnMuVHlwZUNvbXBhcmF0b3IjZ2V0RGVmYXVsdENvbXBhcmF0b3IoKQotCQkgKi8KLQkJcHJvdGVjdGVkIENvbXBhcmF0b3IgZ2V0RGVmYXVsdENvbXBhcmF0b3IoKSB7Ci0JCQlyZXR1cm4gY29tcGFyYXRvcjsKLQkJfQotCi0JCXByb3RlY3RlZCBpbnQgZ2V0T3JkZXJJZChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQlpbnQgaWQgPSAoKEd1aWRhbmNlKSBvYmopLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpOwotCQkJCWlmIChpZCA9PSBVbWFQYWNrYWdlLlRFUk1fREVGSU5JVElPTikgewotCQkJCQlpZCA9IEludGVnZXIuTUFYX1ZBTFVFOwotCQkJCX0KLQkJCQlyZXR1cm4gaWQ7Ci0JCQl9Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBDb21wYXJhdG9yIHByb2Nlc3NQYWNrYWdlQ29tcGFyYXRvciA9IG5ldyBUeXBlQ29tcGFyYXRvcigpIHsKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9ycy5UeXBlQ29tcGFyYXRvciNnZXREZWZhdWx0Q29tcGFyYXRvcigpCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ29tcGFyYXRvciBnZXREZWZhdWx0Q29tcGFyYXRvcigpIHsKLQkJCXJldHVybiBjb21wYXJhdG9yOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgaW50IGdldE9yZGVySWQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlyZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9OwotCi0KLQkKLQlwcml2YXRlIFByZXNlbnRhdGlvbkNvbnRleHQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTaG93UHJlc2VudGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBzaG93UHJlc2VudGF0aW9uTmFtZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2hvd1ByZXNlbnRhdGlvbk5hbWVzKGJvb2xlYW4gc2hvd1ByZXNlbnRhdGlvbk5hbWVzKSB7Ci0JCXRoaXMuc2hvd1ByZXNlbnRhdGlvbk5hbWVzID0gc2hvd1ByZXNlbnRhdGlvbk5hbWVzOwotCQljb21wYXJhdG9yID0gc2hvd1ByZXNlbnRhdGlvbk5hbWVzID8gQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUiA6IENvbXBhcmF0b3JzLkRFRkFVTFRfQ09NUEFSQVRPUjsKLQkJcmV2ZXJzZUNvbXBhcmF0b3IgPSBzaG93UHJlc2VudGF0aW9uTmFtZXMgPyBDb21wYXJhdG9ycy5SRVZFUlNFX1BSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IgOiBDb21wYXJhdG9ycy5SRVZFUlNFX0RFRkFVTFRfQ09NUEFSQVRPUjsKLQkJbWV0aG9kRWxlbWVudFR5cGVDb21wYXJhdG9yID0gc2hvd1ByZXNlbnRhdGlvbk5hbWVzID8gQ29tcGFyYXRvcnMuTUVUSE9EX1RZUEVfUFJFU19OQU1FX0NPTVBBUkFUT1IgOiBDb21wYXJhdG9ycy5NRVRIT0RfVFlQRV9DT01QQVJBVE9SOwotCX0KLQotCXB1YmxpYyBDb21wYXJhdG9yIGdldENvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBjb21wYXJhdG9yOwotCX0KLQotCXB1YmxpYyBDb21wYXJhdG9yIGdldFJldmVyc2VDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gcmV2ZXJzZUNvbXBhcmF0b3I7Ci0JfQotCi0JcHVibGljIENvbXBhcmF0b3IgZ2V0R3VpZGFuY2VUeXBlQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIGd1aWRhbmNlVHlwZUNvbXBhcmF0b3I7Ci0JfQotCi0JcHVibGljIENvbXBhcmF0b3IgZ2V0UHJvY2Vzc1BhY2thZ2VDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gcHJvY2Vzc1BhY2thZ2VDb21wYXJhdG9yOwotCX0KLQkKLQlwdWJsaWMgQ29tcGFyYXRvciBnZXRNZXRob2RFbGVtZW50VHlwZUNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50VHlwZUNvbXBhcmF0b3I7Ci0JfQotCQotCXB1YmxpYyBDb21wYXJhdG9yIGdldFByZXNOYW1lQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1I7Ci0JfQotCi0JcHVibGljIENvbXBhcmF0b3IgZ2V0UHJlc05hbWVSZXZlcnNlQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIENvbXBhcmF0b3JzLlJFVkVSU0VfUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUjsKLQl9Ci0JCi0JcHVibGljIENvbXBhcmF0b3IgZ2V0UHJlc05hbWVNZXRob2RFbGVtZW50VHlwZUNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBDb21wYXJhdG9ycy5NRVRIT0RfVFlQRV9QUkVTX05BTUVfQ09NUEFSQVRPUjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUHJvdmlkZXJzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Byb3ZpZGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTExMGY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUHJvdmlkZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvdmlkZXJzIHsKLQotCXByaXZhdGUgc3RhdGljIElDb25maWd1cmF0b3JGYWN0b3J5IGNvbmZpZ3VyYXRvckZhY3Rvcnk7Ci0KLQlwcml2YXRlIHN0YXRpYyBJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlndXJhdGlvbkFwcGxpY2F0b3I7Ci0KLQlwcml2YXRlIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBwcmVmZXJlbmNlU3RvcmU7Ci0KLQlwcml2YXRlIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBhdXRob3JpbmdQbHVnaW5QcmVmZXJlbmNlU3RvcmU7Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXAgY29tbWFuZFR5cGVUb0xpc3RlbmVyc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIFByb3ZpZGVycygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElDb25maWd1cmF0b3JGYWN0b3J5IGdldENvbmZpZ3VyYXRvckZhY3RvcnkoKSB7Ci0JCXJldHVybiBjb25maWd1cmF0b3JGYWN0b3J5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb25maWd1cmF0b3JGYWN0b3J5KAotCQkJSUNvbmZpZ3VyYXRvckZhY3RvcnkgY29uZmlndXJhdG9yRmFjdG9yeSkgewotCQlQcm92aWRlcnMuY29uZmlndXJhdG9yRmFjdG9yeSA9IGNvbmZpZ3VyYXRvckZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKSB7Ci0JCXJldHVybiBjb25maWd1cmF0aW9uQXBwbGljYXRvcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoCi0JCQlJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlndXJhdGlvbkFwcGxpY2F0b3IpIHsKLQkJUHJvdmlkZXJzLmNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yID0gY29uZmlndXJhdGlvbkFwcGxpY2F0b3I7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBwcmVmZXJlbmNlU3RvcmU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFByZWZlcmVuY2VTdG9yZShJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBwcmVmZXJlbmNlU3RvcmUpIHsKLQkJUHJvdmlkZXJzLnByZWZlcmVuY2VTdG9yZSA9IHByZWZlcmVuY2VTdG9yZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIGdldEF1dGhvcmluZ1BsdWdpblByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIGF1dGhvcmluZ1BsdWdpblByZWZlcmVuY2VTdG9yZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QXV0aG9yaW5nUGx1Z2luUHJlZmVyZW5jZVN0b3JlKElQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHN0b3JlKSB7Ci0JCWF1dGhvcmluZ1BsdWdpblByZWZlcmVuY2VTdG9yZSA9IHN0b3JlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckNvbW1hbmRMaXN0ZW5lcihJQ29tbWFuZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCUxpc3QgbGlzdGVuZXJzID0gKExpc3QpIGNvbW1hbmRUeXBlVG9MaXN0ZW5lcnNNYXAuZ2V0KGxpc3RlbmVyCi0JCQkJLmdldENvbW1hbmRUeXBlKCkpOwotCQlpZiAobGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNvbW1hbmRUeXBlVG9MaXN0ZW5lcnNNYXAucHV0KGxpc3RlbmVyLmdldENvbW1hbmRUeXBlKCksIGxpc3RlbmVycyk7Ci0JCX0gZWxzZSBpZiAobGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVDb21tYW5kTGlzdGVuZXIoSUNvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlMaXN0IGxpc3RlbmVycyA9IChMaXN0KSBjb21tYW5kVHlwZVRvTGlzdGVuZXJzTWFwLmdldChsaXN0ZW5lcgotCQkJCS5nZXRDb21tYW5kVHlwZSgpKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJCWlmIChsaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQkJY29tbWFuZFR5cGVUb0xpc3RlbmVyc01hcC5yZW1vdmUobGlzdGVuZXIuZ2V0Q29tbWFuZFR5cGUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q29tbWFuZExpc3RlbmVycyhDbGFzcyBjb21tYW5kVHlwZSkgewotCQlyZXR1cm4gKExpc3QpIGNvbW1hbmRUeXBlVG9MaXN0ZW5lcnNNYXAuZ2V0KGNvbW1hbmRUeXBlKTsKLQl9Ci0KLQlzdGF0aWMgewotCQkvLyByZWdpc3RlciBjb21tYW5kIGxpc3RlbmVycyB0aGF0IGhhdmUgYmVlbiBjb250cmlidXRlZCB2aWEgZXh0ZW5zaW9uIHBvaW50IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZExpc3RlbmVycwotCQkvLwotCQl0cnkgewotCQkJU3RyaW5nIG5hbWVzcGFjZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpOwotCQkJU3RyaW5nIGV4dGVuc2lvblBvaW50TmFtZSA9ICJjb21tYW5kTGlzdGVuZXJzIjsgLy8kTk9OLU5MUy0xJAotCQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KG5hbWVzcGFjZSwgZXh0ZW5zaW9uUG9pbnROYW1lKTsKLQkJCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQkJCQkJT2JqZWN0IGV4dCA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotCQkJCQkJCQlpZihleHQgaW5zdGFuY2VvZiBJQ29tbWFuZExpc3RlbmVyKSB7Ci0JCQkJCQkJCQlyZWdpc3RlckNvbW1hbmRMaXN0ZW5lcigoSUNvbW1hbmRMaXN0ZW5lcikgZXh0KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmJhNWZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBHZW5lcmljIERpYWxvZyBUaXRsZXMKLW1vdmVEaWFsb2dfdGl0bGU9TW92ZQotZGVsZXRlRGlhbG9nX3RpdGxlPURlbGV0ZSBFbGVtZW50Ci1lcnJvckRpYWxvZ190aXRsZT1FcnJvcgotZXJyb3JEaWFsb2dfY2Fubm90UmVuYW1lPUNhbm5vdCByZW5hbWUgezB9ICcnezF9JycgdG8gJyd7Mn0nJy4gUmVzb2x2ZSB0aGUgaXNzdWUgc2hvd24gaW4gRGV0YWlscyBhbmQgY2xpY2sgT0sgdG8gY29udGludWUgb3IgQ2FuY2VsIHRvIGFib3J0IHRoaXMgb3BlcmF0aW9uLgotCi0jIENvbmZpcm0gUmVmZXJlbmNlcyBSZW1vdmFsIERpYWxvZwotZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190aXRsZT1Db25maXJtIFJlZmVyZW5jZXMgUmVtb3ZhbAotZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190ZXh0PVRoZSBlbGVtZW50KHMpIHlvdSBhcmUgYWJvdXQgdG8gZGVsZXRlIGFyZSBzdGlsbCBiZWluZyByZWZlcmVuY2VkIGJ5IG90aGVyIGVsZW1lbnRzIGluIHRoZSBtZXRob2QgbGlicmFyeS4gRGVsZXRpbmcgdGhlc2UgZWxlbWVudHMgd2lsbCByZW1vdmUgcmVmZXJlbmNlcyB0byB0aGVtLCB0aGVyZWZvcmUsIHdpbGwgdXBkYXRlIHRoZSByZWZlcnJpbmcgZWxlbWVudHMgYXMgd2VsbC4gIE1ha2Ugc3VyZSB5b3UgaGF2ZSBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB0aGUgcmVmZXJyaW5nIGVsZW1lbnRzIGJlZm9yZSBjbGlja2luZyBPSy4gIENsaWNrIERldGFpbHMgdG8gcmV2aWV3IHRoZSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlIHRoZSBlbGVtZW50KHMpIHRoYXQgeW91IGFyZSBhYm91dCB0byBkZWxldGUuCi0KLSMgUmVzb2x2ZSBOYW1lIENvbmZsaWN0IERpYWxvZwotcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190aXRsZT1SZXNvbHZlIEVsZW1lbnQgTmFtZSBDb25mbGljdAotcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190ZXh0PUVudGVyIGEgbmV3IHswfSBmb3IgJyd7MX0nJzoKLQotIyBTZWxlY3QgRGVsaXZlcmFibGVzIERpYWxvZwotc2VsZWN0RGVsaXZlcmFibGVzRGlhbG9nX3RpdGxlPVNlbGVjdCBEZWxpdmVyYWJsZXMKLXNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190ZXh0PVNlbGVjdCBhIGRlbGl2ZXJhYmxlIHdoZXJlIHlvdSB3YW50IHdvcmsgcHJvZHVjdCAnJ3swfScnIHRvIGJlIGFzc2lnbmVkLgotCi0jIE5ldyBQcm9jZXNzIENvbXBvbmVudCBEaWFsb2cKLW5ld1Byb2Nlc3NDb21wb25lbnREaWFsb2dfdGl0bGU9TmV3IFByb2Nlc3MgQ29tcG9uZW50Ci1uYW1lTGFiZWxfdGV4dD1OYW1lOgotZGVmYXVsdENvbmZpZ0xhYmVsX3RleHQ9RGVmYXVsdCBDb25maWd1cmF0aW9uOgotYmFzZVByb2Nlc3NMYWJlbF90ZXh0PUJhc2UgUHJvY2VzczoKLWJhc2VkT25Qcm9jZXNzZXNMYWJlbF90ZXh0PUJhc2VkIG9uIFByb2Nlc3NlczoKLVNwZWNpZnlOYW1lVGV4dD1TcGVjaWZ5IGEgdmFsaWQgbmFtZS4KLQotIyBSb2xlIEFzc29jaWF0aW9uIERpYWxvZwotc2VsZWN0QXNzb2NpYXRpb25MYWJlbF90ZXh0PVNlbGVjdCBhc3NvY2lhdGlvbiBmb3IgdGhlIHRhc2sgJyd7MH0nJwotCi0jIFJlbW92ZSBBc3NvY2lhdGlvbiBkaWFsb2cKLXJlbW92ZUFzc29jaWF0aW9uRGlhbG9nX3RleHQ9UmVtb3ZlIEFzc29jaWF0aW9uCi0KLSMgU2VsZWN0IFRlYW1zIERpYWxvZwotc2VsZWN0VGVhbXNEaWFsb2dfdGl0bGU9U2VsZWN0IFRlYW1zCi1zZWxlY3RUZWFtc0RpYWxvZ190ZXh0PVNlbGVjdCBhIHRlYW0gd2hlcmUgeW91IHdhbnQgYSByb2xlICcnezB9JycgdG8gYmUgYXNzaWduZWQuCi0KLSMgVGFzayBTZWxlY3Rpb24gRGlhbG9nCi10YXNrU2VsZWN0aW9uRGlhbG9nX3RpdGxlPVRhc2sgU2VsZWN0aW9uCi10aXRsZUxhYmVsX3RleHQ9U2VsZWN0IHRhc2tzLi4KLQotIyBFcnJvciBNZXNzYWdlcwotZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZz1JVVBMMDEwMEU6IFRoZSB7MH0gbmFtZSBpcyBtaXNzaW5nLlxuQWxsIG1ldGhvZCBhbmQgcHJvY2VzcyBlbGVtZW50cyBtdXN0IGhhdmUgYSBuYW1lLlxuRW50ZXIgYSB2YWxpZCBuYW1lIGFuZCB0cnkgYWdhaW4uCi1lbXB0eUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZz1UaGUgbmFtZSBjYW5ub3QgYmUgZW1wdHkuIFBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgbmFtZS4KLWR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEwwMTAxRTogVGhlIG5hbWUgJyd7MH0nJyBhbHJlYWR5IGV4aXN0cy5cbkEgbWV0aG9kIGVsZW1lbnQgbXVzdCBoYXZlIGEgdW5pcXVlIG5hbWUuXG5FbnRlciBhIGRpZmZlcmVudCBuYW1lIGFuZCB0cnkgYWdhaW4uCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZzI9RW50ZXIgYSBkaWZmZXJlbnQgbmFtZSBhbmQgdHJ5IGFnYWluLgotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnPVRoZSBuYW1lIGFscmVhZHkgZXhpc3RzLiBQbGVhc2Ugc3BlY2lmeSBhbm90aGVyIG5hbWUuCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjFfbXNnPUlVUEwwMTAyRTogVGhlIG5hbWUgJyd7MH0nJyBpcyBpbnZhbGlkLlxuQSBtZXRob2QgZWxlbWVudCBuYW1lIGNhbm5vdCBzdGFydCB3aXRoIGEgc3BhY2UuXG5FbnRlciBhIHZhbGlkIG5hbWUgYW5kIHRyeSBhZ2Fpbi4KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMl9tc2c9SVVQTDAxMDNFOiBUaGUgbmFtZSAnJ3swfScnIGlzIGludmFsaWQuXG5BIG1ldGhvZCBlbGVtZW50IG5hbWUgY2Fubm90IGVuZCB3aXRoIGEgcGVyaW9kLlxuRW50ZXIgYSB2YWxpZCBuYW1lIGFuZCB0cnkgYWdhaW4uCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjNfbXNnPUlVUEwwMTA0RTogVGhlIG5hbWUgJyd7MH0nJyBpcyBpbnZhbGlkLlxuQSBtZXRob2QgZWxlbWVudCBuYW1lIGNhbm5vdCBjb250YWluIHRoZXNlIGNoYXJhY3RlcnM6IFxcIC8gOiAqID8gIiA8ID4gOyB8XG5FbnRlciBhIHZhbGlkIG5hbWUgYW5kIHRyeSBhZ2Fpbi4KLWludmFsaWRFbGVtZW50TmFtZUVycm9yNF9tc2c9SVVQTDAxMDVFOiBUaGUgbmFtZSAnJ3swfScnIGlzIGludmFsaWQuXG5BIG1ldGhvZCBlbGVtZW50IG5hbWUgY2Fubm90IGNvbnRhaW4gdGhlIGNoYXJhY3RlcjogJlxuRW50ZXIgYSB2YWxpZCBuYW1lIGFuZCB0cnkgYWdhaW4uCi1pbnZhbGlkUGx1Z2luTmFtZUVycm9yX21zZz1JVVBMMDEyMUU6IFRoZSBuYW1lICcnezB9JycgaXMgaW52YWxpZC5cbkEgbWV0aG9kIHBsdWctaW4nJ3MgbmFtZSBjYW5ub3QgY29udGFpbiB0aGVzZSBjaGFyYWN0ZXJzOiBcXCAvIDogKiA/ICIgPCA+IDsgfCAjICUgJydcbkVudGVyIGEgdmFsaWQgbmFtZSBhbmQgdHJ5IGFnYWluLgotZmlsZVBhdGhOYW1lVG9vTG9uZ19tc2c9RmlsZSBwYXRoIG5hbWUgdG9vIGxvbmcgKGV4Y2VlZGluZyAnJ3swfScnKSAKLW5vQ29uZmlnRXJyb3JfbXNnPVRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IGRvZXMgbm90IGNvbnRhaW4gYW55IG1ldGhvZCBjb25maWd1cmF0aW9uLlxuQSBtZXRob2QgY29uZmlndXJhdGlvbiBpcyBuZWVkZWQgdG8gY3JlYXRlIGEgbmV3IHByb2Nlc3MuXG5DcmVhdGUgYSBtZXRob2QgY29uZmlndXJhdGlvbiBhbmQgdHJ5IGFnYWluLgotbm9EZWxpdmVyeVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDZFOiBUaGUgY3VycmVudCBtZXRob2QgbGlicmFyeSBkb2VzIG5vdCBjb250YWluIGFueSBkZWxpdmVyeSBwcm9jZXNzZXMuXG5BIGJhc2UgZGVsaXZlcnkgcHJvY2VzcyBpcyBuZWVkZWQgdG8gY3JlYXRlIGEgbmV3IHByb2Nlc3MgY29udHJpYnV0aW9uLlxuQ3JlYXRlIGEgZGVsaXZlcnkgcHJvY2VzcyBhbmQgdHJ5IGFnYWluLgotbm9EZWZhdWx0Q29uZmlnRXJyb3JfbXNnPUlVUEwwMTA3RTogTm8gbWV0aG9kIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gc2VsZWN0ZWQuXG5BIGRlZmF1bHQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbXVzdCBiZSBhc3NpZ25lZCB0byB0aGUgbmV3IHByb2Nlc3MuXG5TZWxlY3QgYSBtZXRob2QgY29uZmlndXJhdGlvbiBhbmQgdHJ5IGFnYWluLgotbm9CYXNlUHJvY2Vzc0Vycm9yX21zZz1JVVBMMDEwOEU6IE5vIGRlbGl2ZXJ5IHByb2Nlc3MgaGFzIGJlZW4gc2VsZWN0ZWQuXG5BIHByb2Nlc3MgY29udHJpYnV0aW9uIHJlcXVpcmVzIGEgYmFzZSBkZWxpdmVyeSBwcm9jZXNzLlxuU2VsZWN0IGEgZGVsaXZlcnkgcHJvY2VzcyBhbmQgdHJ5IGFnYWluLgotY3JlYXRlUHJvY2Vzc0Vycm9yX21zZz1JVVBMMDEwOUU6IFRoZSBwcm9jZXNzIGNhbm5vdCBiZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KLWNyZWF0ZUVsZW1lbnRFcnJvcl9tc2c9SVVQTDAxMTBFOiBUaGUgZWxlbWVudCBjYW5ub3QgYmUgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCi1kZWxldGVFbGVtZW50RXJyb3JfbXNnPUlVUEwwMTExRTogVGhlIGVsZW1lbnQgY2Fubm90IGJlIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5LgotZHVwbGljYXRlQ29udGVudEZpbGVFcnJvcl9tc2c9SVVQTDAxMTJFOiBUaGUgY29udGVudCBmaWxlIGZvciB0aGUgZWxlbWVudCBjYW5ub3QgYmUgY3JlYXRlZCBvciByZW5hbWVkIHRvIG1hdGNoIHRoZSBlbGVtZW50IG5hbWUuXG5cbkEgZmlsZSAnJ3swfScnIGFscmVhZHkgZXhpc3RzLlxuXG5FbnRlciBhIGRpZmZlcmVudCBuYW1lIGFuZCB0cnkgYWdhaW4uCi1kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX3NpbXBsZV9tc2c9QSBjb250ZW50IGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lIGV4aXRzLiBQbGVhc2Ugc3BlY2lmeSBhbm90aGVyIG5hbWUuCi11bmRvQ29tbWFuZEVycm9yX21zZz1JVVBMMDExM0U6IFRoZSB1bmRvIGNvbW1hbmQgJyd7MH0nJyBjYW5ub3QgYmUgY29tcGxldGVkLlxuXG5BbiBlcnJvciBoYXMgb2NjdXJyZWQ6IHsxfQotaW52YWxpZFByZWRlY2Vzc29yRXJyb3JfbXNnPUlVUEwwMTE0RTogVGhlIHNwZWNpZmllZCBwcmVkZWNlc3NvciBpbmRleCBpcyBpbnZhbGlkLlxuXG5BIHByZWRlY2Vzc29yIGluZGV4IG11c3QgYmUgYW4gaW50ZWdlciB2YWx1ZSBmcm9tIHRoZSAnSW5kZXgnIGNvbHVtbi5cblxuU3BlY2lmeSBhIHZhbGlkIHZhbHVlIGFuZCB0cnkgYWdhaW4uCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzPUlVUEwwMTAwVzogJyd7MH0nJyBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgdG8gJyd7MX0nJy4gIE9ubHkgb25lIGFzc29jaWF0aW9uIG9mIHRoaXMga2luZCBpcyBhbGxvd2VkLiAgVG8gYXNzaWduICcnezB9JycgdG8gJyd7Mn0nJyB5b3UgbmVlZCB0byBmaXJzdCByZW1vdmUgaXQgZnJvbSAnJ3sxfScnLgotZXJyb3JfbXNnV2l0aERldGFpbHM9SVVQTDAxMTZFOiBBbiBlcnJvciBoYXMgb2NjdXJyZWQuIENsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1lcnJvcl9tc2c9SVVQTDAxMTdFOiBBbiBlcnJvciBoYXMgb2NjdXJyZWQuIFNlZSBlcnJvciBsb2cgZm9yIG1vcmUgZGV0YWlscy4KLVN1cHByZXNzaW9uX25hbWVEdXBsaWNhdGlvbj1JVVBMMDExOEU6IE5hbWUgY29uZmxpY3Qgd2lsbCBvY2N1ciBhZnRlciB0aGlzIG9wZXJhdGlvbi4gQ2hlY2sgZWxlbWVudCdzIG5hbWUgZm9yIGR1cGxpY2F0aW9uIGFuZCB0cnkgYWdhaW4KLVN1cHByZXNzaW9uX3ByZXNlbnRhdGlvbk5hbWVEdXBsaWNhdGlvbj1JVVBMMDExOUU6IE5hbWUgY29uZmxpY3Qgd2lsbCBvY2N1ciBhZnRlciB0aGlzIG9wZXJhdGlvbi4gQ2hlY2sgZWxlbWVudCdzIHByZXNlbnRhdGlvbiBuYW1lIGZvciBkdXBsaWNhdGlvbiBhbmQgdHJ5IGFnYWluCi0KLSMgRXJyb3IgUmVhc29ucwotZXJyb3JfcmVhc29uPUFuIGVycm9yIGhhcyBvY2N1cnJlZC4gQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLXNhdmVQcm9jZXNzRXJyb3JfcmVhc29uPUFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSBzYXZpbmcgdGhlIHByb2Nlc3MgJyd7MH0nJy4gQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLWRlbGV0ZVJlZmVyZW5jZXNFcnJvcl9yZWFzb249QW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoaWxlIHJlbW92aW5nIHJlZmVyZW5jZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWxlbWVudC4gQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLXNhdmVGaWxlRXJyb3JfcmVhc29uPUFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSBzYXZpbmcgdGhlIGZpbGUgJyd7MH0nJy4gQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLWludmFsaWRSZWZlcmVuY2VzRXJyb3JfcmVhc29uPURldGVjdGVkIG1ldGhvZCBlbGVtZW50cyB3aXRoIGludmFsaWQgcmVmZXJlbmNlcyBhcyBhIHJlc3VsdCBvZiBjcm9zcyBwbHVnLWluIGNvcHkuXG5UaGVzZSByZWZlcmVuY2VzIHdpbGwgYmUgcmVtb3ZlZC4gRG8geW91IHdhbnQgdG8gY29udGludWU/Ci11bnJlc29sdmVkT2JqZWN0RXJyb3JfcmVhc29uPUNhbm5vdCBtb2RpZnkgYW4gdW5yZXNvbHZlZCBvYmplY3Q6IHswfShVUkkgPSB7MX0pezJ9Ci0KLSMgV2FybmluZyBtZXNzYWdlcwotTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE4VzogQ291bGQgbm90IGZpbmQgb25lIG9yIG1vcmUgc291cmNlIGVsZW1lbnRzLiBBc3NvY2lhdGVkIGZpbGVzIGluIHRoZSByZXNvdXJjZXMgZm9sZGVyIHdpbGwgbm90IGJlIGNvcGllZC4KLUFjdGl2aXR5QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2c9SVVQTDAxMTlXOiBDb3VsZCBub3QgZmluZCBvbmUgb3IgbW9yZSBzb3VyY2UgZWxlbWVudHMuIEFzc29jaWF0ZWQgUHJvY2VzcyBQYWNrYWdlcyB3aWxsIG5vdCBiZSBjb3BpZWQuCi1BY3Rpdml0eURyb3BDb21tYW5kX2RlZXBDb3B5X3Byb21wdENvbmZpZ3VyYXRpb25Nc2c9RG8geW91IHdhbnQgdG8gY29weSBhbGwgZGVzY3JpcHRvcnM/XG5cbkNsaWNraW5nIG9uIE5vIHdpbGwgY29weSBvbmx5IHRoZSBkZXNjcmlwdG9ycyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi1kZWVwQ29weV9wcm9tcHRNc2c9WW91IHdpbGwgZ2V0IGEgY29weSBvZiBhbGwgZHluYW1pY2FsbHkgbGlua2VkIGVsZW1lbnRzIHRoYXQgeW91IG5lZWQgdG8gbWFpbnRhaW4gc2VwYXJhdGVseSBmcm9tIG5vdyBvbi4gRG8geW91IHdhbnQgdG8gY29udGludWU/Ci1kZWVwQ29weV90aXRsZT1EZWVwIENvcHkKLQotIyBQcm9ncmVzcyBtZXNzYWdlcwotY3JlYXRpbmdQcm9jZXNzQ29tcG9uZW50VGFza19uYW1lPUNyZWF0aW5nIHByb2Nlc3MgY29tcG9uZW50ICcnezB9JycuLi4KLXByb2Nlc3NpbmdSZWZlcmVuY2VzVGFza19uYW1lPVByb2Nlc3NpbmcgcmVmZXJlbmNlcy4uLgotZGVsZXRpbmdFbGVtZW50c1Rhc2tfbmFtZT1EZWxldGluZyBlbGVtZW50cyBhbmQgYXNzb2NpYXRlZCBmaWxlcy4uLgotY2hlY2tpbmdSZWZlcmVuY2VzVGFza19uYW1lPUNoZWNraW5nIGZvciByZWZlcmVuY2VzLi4uCi1yZW1vdmluZ1JlZmVyZW5jZXN0YXNrX25hbWU9UmVtb3ZpbmcgcmVmZXJlbmNlcy4uLgotc2F2aW5nTW9kaWZpZWRGaWxlc1Rhc2tfbmFtZT1TYXZpbmcgbW9kaWZpZWQgZmlsZShzKS4uLgotY2hlY2tBZmZlY3RlZFJlc291cmNlc1Rhc2tfbmFtZT1DaGVja2luZyBhZmZlY3RlZCByZXNvdXJjZXMuLi4KLW1vdmluZ1Rhc2tfbmFtZT1Nb3ZpbmcuLi4KLW1vdmluZ0ZpbGVzVGFza19uYW1lPU1vdmluZyBmaWxlcy4uLgotY29weWluZ1Jlc291cmNlc1Rhc2tfbmFtZT1Db3B5aW5nIHJlc291cmNlcy4uLgotY29weWluZ0FjdGl2aXRpZXNfbXNnPUNvcHlpbmcgYWN0aXZpdHkgJyd7MH0nJwotc2F2aW5nRmlsZVRhc2tfbmFtZT1TYXZpbmcgZmlsZSAnJ3swfScnLi4uCi1zYXZpbmdSZXNvdXJjZXNfbXNnPVNhdmluZyByZXNvdXJjZXMKLQotIyBVSSBUZXh0Ci1lbGVtZW50X3RleHQ9ZWxlbWVudAotY3JlYXRlRWxlbWVudF90ZXh0PUNyZWF0ZSBFbGVtZW50Ci1jcmVhdGVQcm9jZXNzX3RleHQ9Q3JlYXRlIFByb2Nlc3MKLWNvbnRyaWJ1dGVzVG9fdGV4dD1Db250cmlidXRlcyB0bwotbG9jYWxDb250cmlidXRlc1RvX3RleHQ9TG9jYWxseSBDb250cmlidXRlcyB0bwotZXh0ZW5kc190ZXh0PUV4dGVuZHMKLXJlcGxhY2VzX3RleHQ9UmVwbGFjZXMKLWV4dGVuZHNfcmVwbGFjZXNfdGV4dD1FeHRlbmRzIGFuZCBSZXBsYWNlcwotbG9jYWxSZXBsYWNlc190ZXh0PUxvY2FsbHkgUmVwbGFjZXMKLWxvY2FsUmVwbGFjZW1lbnRBbmREZWVwQ29weV90ZXh0PUxvY2FsIFJlcGxhY2VtZW50IGFuZCBEZWVwIENvcCZ5Ci1lbGVtZW50VHlwZV90ZXh0PXswfTogezF9Ci1kZWxpdmVyYWJsZXNfdGV4dD1EZWxpdmVyYWJsZXMKLWNvbnRyaWJ1dGVUb0FjdGl2aXR5X3RleHQ9Q29udHJpYnV0ZSBUbyBBY3Rpdml0eQotQWN0aXZpdHlEcm9wQ29tbWFuZF9sYWJlbD1Ecm9wIEFjdGl2aXR5Ci1yZXBsYWNlQWN0aXZpdHlfdGV4dD1SZXBsYWNlIEFjdGl2aXR5Ci1maWxlX3RleHQ9ZmlsZQotZGlyZWN0b3J5X3RleHQ9ZGlyZWN0b3J5Ci11bnJlc29sdmVkX3RleHQ9KHVucmVzb2x2ZWQgJyd7MH0nJykKLWFzc2lzdHNfdGV4dD1Bc3Npc3RzCi11bmtub3duX3RleHQ9VW5rbm93bgotY29tbWFuZF9kb25lPURvbmUKLQotIyBUaGUgZm9sbG93aW5nIFVJIHRleHQgc2hvdWxkIGJlIHJldmlld2VkLgotVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHl3aXRocGx1Z2luX2luZm89ezB9ICh7MX0gJyd7Mn0nJyBpbiAnJ3szfScnKQotVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHlfaW5mbz17MH0gKHsxfSAnJ3syfScnKQotdWlfcmVmX2RlbGV0ZT1UaGUgZGVzY3JpcHRvciAnJ3swfScnIGhhcyB0aGUgZm9sbG93aW5nIHJlZmVyZW5jZXMgd2hpY2ggYXJlIG5vdCB1c2VkIGFueXdoZXJlLlxuU2VsZWN0IHRoZSBvbmVzIHdoaWNoIHlvdSB3b3VsZCBsaWtlIHRvIGRlbGV0ZToKLXVpX3JlZl9kZWxldGUyPVRoZXNlIGZvbGxvd2luZyByZWZlcmVuY2VzIGFyZSBub3QgYmVpbmcgdXNlZCBhbnl3aGVyZS5cblNlbGVjdCB0aGUgb25lcyB3aGljaCB5b3Ugd291bGQgbGlrZSB0byBkZWxldGU6Ci11aV9yZWZlcmVuY2VzPVJlZmVyZW5jZXMKLXVpX3dvcmtwcm9kdWN0X2Rlc2NyaXB0b3JfZGVzY3JpcHRpb249V29yayBwcm9kdWN0IGRlc2NyaXB0b3IgJyd7MH0nJyBpcyBhc3NvY2lhdGVkIChPdXRwdXQgRnJvbSkgd2l0aCB0YXNrIGRlc2NyaXB0b3IgJyd7MX0nJwotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX29wdGlvbnM9T3B0aW9ucwotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX291dHB1dGxhYmVsPVJlbW92ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBhcyBvdXRwdXQgb2YgdGhlIHRhc2sgZGVzY3JpcHRvcgotdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX2RlbGV0ZV90YXNrPURlbGV0ZSB0YXNrIGRlc2NyaXB0b3IgZnJvbSB0aGUgYWN0aXZpdHkKLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9kZWZhdWx0Y29uZmlnY2hlY2s9VGhlIHNlbGVjdGVkIGVsZW1lbnQgJyd7MH0nJyBpcyBub3QgaW4gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB5b3VyIHByb2Nlc3MuXG5EbyB5b3Ugd2FudCB0byBhZGQgaXQgYW5kIGl0cyBkZXBlbmRlbmNpZXMgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbj8KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9nZW5lcmljRXJyX21lc3NhZ2VfdGV4dD1FcnJvcnMgb2NjdXJyZWQgaW4gdGhlIG9wZXJhdGlvbi4gQ2xpY2sgb24gZGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbgotUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9ub0Rlc2NyaXB0b3JUb1N5bmNoPU5vIGRlc2NyaXB0b3Igd2l0aCBsaW5rZWQgbWV0aG9kIGVsZW1lbnQgZm91bmQgdG8gc3luY2hyb25pemUKLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3JlZmVyc2hpbmd2aWV3ZXI9RXJyb3IgcmVmcmVzaGluZyB2aWV3ZXIKLWNvbmZpcm1fcmVtb3ZlX3JlZmVyZW5jZXNfdGV4dD1FbGVtZW50KHMpIGxpc3RlZCBpbiBEZXRhaWxzIG1pZ2h0IGhhdmUgaWxsZWdhbCByZWZlcmVuY2VzIHRvIHRoaXMgZ3VpZGFuY2UgYWZ0ZXIgY29udmVyc2lvbi4gQ2xpY2sgT0sgdG8gcmVtb3ZlIHRoZW0gYW5kIGNvbnRpbnVlLgotY29uZmlybURlc2NyaXB0b3JzRGVsZXRpb25fdGl0bGU9Q29uZmlybSBEZXNjcmlwdG9ycyBEZWxldGlvbgotY29uZmlybURlc2NyaXB0b3JzRGVsZXRpb25fbXNnPVRoZSBlbGVtZW50KHMpIHlvdSBhcmUgYWJvdXQgdG8gZGVsZXRlIGFyZSBzdGlsbCBiZWluZyByZWZlcmVuY2VkIGJ5IGRlc2NyaXB0b3JzIGluIHRoZSBtZXRob2QgbGlicmFyeS4gIENsaWNrIFllcyBpZiB5b3Ugd2FudCB0byBkZWxldGUgdGhlc2UgZGVzY3JpcHRvcnMgYXMgd2VsbC4gIE1ha2Ugc3VyZSB5b3UgaGF2ZSBwZXJtaXNzaW9uIHRvIGRlbGV0ZSB0aGUgZGVzY3JpcHRvcnMgYmVmb3JlIGNsaWNraW5nIFllcy4gIENsaWNrIERldGFpbHMgdG8gcmV2aWV3IHRoZSBsaXN0IG9mIGRlc2NyaXB0b3JzIHRoYXQgcmVmZXJlbmNlIHRoZSBlbGVtZW50KHMpIHRoYXQgeW91IGFyZSBhYm91dCB0byBkZWxldGUuCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl91bmhhbmRsZWRfZXhjZXB0aW9uPVVuaGFuZGxlZCBleGNlcHRpb24KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfYnJlYWtkb3duX2VsZW1lbnQ9Q2Fubm90IGhhdmUgdGhlIHNhbWUgYnJlYWtkb3duIGVsZW1lbnQgYXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvcgotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dwbGlzdGRsZ19tc2c9VGhlIHdvcmsgcHJvZHVjdCAnJ3swfScnIGlzIGFuIG91dHB1dCB0byB0aGUgZm9sbG93aW5nIHRhc2tzLlxuU2VsZWN0IHRoZSB0YXNrcyBmb3Igd2hpY2ggeW91IHdvdWxkIGxpa2UgdG8gY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIGRlc2NyaXB0b3JzLgotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3JvbGVsaXN0ZGxnX21zZz1UaGUgcm9sZSAnJ3swfScnIGhhcyB0aGUgZm9sbG93aW5nIHJlc3BvbnNpYmxlIHdvcmsgcHJvZHVjdHMuXG5TZWxlY3QgdGhlIHdvcmsgcHJvZHVjdHMgZm9yIHdoaWNoIHlvdSB3b3VsZCBsaWtlIHRvIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBkZXNjcmlwdG9ycy4KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX2ZhdGFsZXJyPUZhdGFsIGVycm9yCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd29ya3Byb2R1Y3RzPVdvcmsgUHJvZHVjdHMKLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfc3ViX2VsZW1lbnQ9Q2Fubm90IGxpbmsgYSBicmVha2Rvd24gZWxlbWVudCB0byBvbmUgb2YgaXRzIHN1Yi1lbGVtZW50LgotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfd3JvbmdfZWxlbWVudD1DYW5ub3QgbGluayB0byBlbGVtZW50IG90aGVyIHRoYW4gd29yayBicmVha2Rvd24gZWxlbWVudC4KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX2NoaWxkX2VsZW1lbnQ9Q2Fubm90IGxpbmsgYSBicmVha2Rvd24gZWxlbWVudCB0byBvbmUgb2YgaXRzIGNoaWxkcmVuLgotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3Rhc2tzPVRhc2tzCi11aV9hc3NvY2lhdGlvbl90YXNrX3NlbGVjdGlvbj1UYXNrIFNlbGVjdGlvbi4uLgotdXRpbF9Qcm9jZXNzVXRpbF9jaGlsZGFkYXB0ZXI9XCBcIGNoaWxkJ3MgYWRhcHRlcjoKLQotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2V0cGFyZW50PUNvdWxkIG5vdCBzZXQgcGFyZW50IGZvciBjaGlsZAotdXRpbF90bmd1dGlsX2Nhbm5vdF9lZGl0X3Jlc291cmNlPUNhbm5vdCBlZGl0IHJlc291cmNlLgotdXRpbF9Qcm9jZXNzVXRpbF9jb250cmlidXRlc3RvPWNvbnRyaWJ1dGVzIHRvICcnezB9JycKLXV0aWxfUHJvY2Vzc1V0aWxfbG9jYWxDb250cmlidXRlc3RvPWxvY2FsbHkgY29udHJpYnV0ZXMgdG8gJyd7MH0nJwotcHJvY2Vzc19leHRlbmRzPWV4dGVuZHMgJyd7MH0nJwotcHJvY2Vzc19yZXBsYWNlcz1yZXBsYWNlcyAnJ3swfScnCi1wcm9jZXNzX2xvY2FsUmVwbGFjZXM9bG9jYWxseSByZXBsYWNlcyAnJ3swfScnCi0jIEZpbHRlciBjb25zdGFudHMgZXh0ZXJuYWxpemVkIHN0cmluZ3MuCi1GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZXNfdGV4dD1EaXNjaXBsaW5lcwotRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVncm91cGluZ3NfdGV4dD1EaXNjaXBsaW5lIEdyb3VwaW5ncwotRmlsdGVyQ29uc3RhbnRzX3doaXRlcGFwZXJzX3RleHQ9V2hpdGVwYXBlcnMKLUZpbHRlckNvbnN0YW50c190b29sbWVudG9yc190ZXh0PVRvb2wgTWVudG9ycwotRmlsdGVyQ29uc3RhbnRzX3Rvb2xzX3RleHQ9VG9vbHMKLUZpbHRlckNvbnN0YW50c19yb2xlc190ZXh0PVJvbGVzCi1GaWx0ZXJDb25zdGFudHNfdGFza3NfdGV4dD1UYXNrcwotRmlsdGVyQ29uc3RhbnRzX3JldXNhYmxlYXNzZXRzX3RleHQ9UmV1c2FibGUgQXNzZXRzCi1GaWx0ZXJDb25zdGFudHNfYWxsX3RleHQ9QWxsCi1GaWx0ZXJDb25zdGFudHNfcHJvY2Vzc2VzX3RleHQ9UHJvY2Vzc2VzCi1GaWx0ZXJDb25zdGFudHNfYWN0aXZpdGllc190ZXh0PUFjdGl2aXRpZXMKLUZpbHRlckNvbnN0YW50c19wcmFjdGljZXNfdGV4dD1QcmFjdGljZXMKLUZpbHRlckNvbnN0YW50c190ZW1wbGF0ZXNfdGV4dD1UZW1wbGF0ZXMKLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHNfdGV4dD1Xb3JrIFByb2R1Y3RzCi1GaWx0ZXJDb25zdGFudHNfY2hlY2tsaXN0c190ZXh0PUNoZWNrbGlzdHMKLUZpbHRlckNvbnN0YW50c19ndWlkZWxpbmVzX3RleHQ9R3VpZGVsaW5lcwotRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRzX3RleHQ9Um9sZSBTZXRzCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGFuY2VfdGV4dD1HdWlkYW5jZQotRmlsdGVyQ29uc3RhbnRzX2NvbmNlcHRzX3RleHQ9Q29uY2VwdHMKLUZpbHRlckNvbnN0YW50c19leGFtcGxlc190ZXh0PUV4YW1wbGVzCi1GaWx0ZXJDb25zdGFudHNfY29udGVudHBhY2thZ2VzX3RleHQ9Q29udGVudCBQYWNrYWdlcwotRmlsdGVyQ29uc3RhbnRzX3JvbGVkZXNjcmlwdG9yc190ZXh0PVJvbGUgRGVzY3JpcHRvcnMKLUZpbHRlckNvbnN0YW50c19yb2xlc2V0Z3JvcHVpbmdzX3RleHQ9Um9sZSBTZXQgR3JvdXBpbmdzCi1GaWx0ZXJDb25zdGFudHNfdGFza2Rlc2NyaXB0b3JzX3RleHQ9VGFzayBEZXNjcmlwdG9ycwotRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRlbGVtZW50c190ZXh0PUNvbnRlbnQgRWxlbWVudHMKLVByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fcHJlcGFyZT1QcmVwYXJpbmcgc3luY2hyb25pemF0aW9uLi4uCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RkZXNjcmlwdG9yc190ZXh0PVdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycwotRmlsdGVyQ29uc3RhbnRzX2FsbGNvbnRlbnRlbGVtZW50c190ZXh0PUFsbCBDb250ZW50IEVsZW1lbnRzCi1GaWx0ZXJDb25zdGFudHNfc3VwcG9ydGluZ21hdGVyaWFsc190ZXh0PVN1cHBvcnRpbmcgTWF0ZXJpYWxzCi1NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9lcnJvclNhdmluZ0ZpbGVzPUVycm9yIHNhdmluZyBmaWxlKHMpCi1GaWx0ZXJDb25zdGFudHNfY3VzdG9tY2F0ZWdvcmllc190ZXh0PUN1c3RvbSBDYXRlZ29yaWVzCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3R0eXBlc190ZXh0PVdvcmsgUHJvZHVjdCBLaW5kcwotRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRfd2FybmluZ01zZz1EZWxldGlvbiBjb21wbGV0ZWQgd2l0aCB3YXJuaW5nCi1GaWx0ZXJDb25zdGFudHNfbWV0aG9kcGx1Z2luc190ZXh0PU1ldGhvZCBQbHVnLWlucwotVXNlckludGVyYWN0aW9uSGVscGVyX2xvY2tlZFBsdWdpbj1JVVBMMDEyMEU6IFRoZSBwbHVnLWluICcnezB9JycgaXMgbG9ja2VkLgotRmlsdGVyQ29uc3RhbnRzX2RvbWFpbnNfdGV4dD1Eb21haW5zCi1GaWx0ZXJDb25zdGFudHNfcm9hZG1hcF90ZXh0PVJvYWRtYXBzCi1GaWx0ZXJDb25zdGFudHNfcmVwb3J0c190ZXh0PVJlcG9ydHMKLUF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWw9RGVmYXVsdCBTJnluY2hyb25pemF0aW9uIGZyb20gTWV0aG9kIENvbnRlbnQKLU1hbnVhbFN5bmNocm9uaXplQ29tbWFuZF9sYWJlbD1DdXN0b20gU3luY2hyb25pJnphdGlvbi4uLgotU3luY2hyb25pemVDb21wbGV0ZURpYWxvZ19UaXRsZT1TeW5jaHJvbml6YXRpb24gQ29tcGxldGUKLUF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfc3VjZXNzZnVsPVN5bmNocm9uaXphdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Lgotc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZV9tc2c9VGhlIGZvbGxvd2luZyBkZXNjcmlwdG9ycyBhcmUgbm90IHVzZWQgYW55d2hlcmUgYWZ0ZXIgZGVsZXRpb24gb2YgdGhlIHNlbGVjdGVkIGVsZW1lbnRzLlxuU2VsZWN0IGRlc2NyaXB0b3JzIHlvdSB3YW50IHRvIGRlbGV0ZS4KLQotQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmRfTWVzc2FnZT1TcGVjaWZ5IG5hbWUgYW5kIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgdGhlIHswfSB0byBiZSBjcmVhdGVkLgotIyBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9Qcm9jZXNzUGFja2FnZV9OYW1lPU5hbWU6Ci0KLSMgTWV0aG9kQ3JlYXRlQ2hpbGRDb21tYW5kCi1uZXdFbGVtZW50X3RleHQ9TmV3IHswfQotdXBkYXRlX291dG9mc3luY2hfdGl0bGU9VXBkYXRlIGNvbmZsaWN0Ci11cGRhdGVfb3V0b2ZzeW5jaF9tc2c9VGhlIGZpbGUocykgaGFzIGJlZW4gY2hhbmdlZCBvbiB0aGUgZmlsZSBzeXN0ZW0uIERvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgY2hhbmdlcz8KLWR1cGxpY2F0ZUZlYXR1cmVWYWx1ZT1DYW5ub3QgaGF2ZSAyIGVsZW1lbnRzIHVuZGVyICcnezB9Jycgd2l0aCB0aGUgc2FtZSB2YWx1ZSBmb3IgJyd7MX0nJwotYXBwbHlfcGF0dGVybl9lcnJvcl9tc2c9Q2Fubm90IGFwcGx5IGFjdGl2aXR5ICcnezB9JycgdG8gdGhlIHByb2Nlc3MgJyd7MX0nJyBzaW5jZSBpdCB3aWxsIHJlc3VsdCBpbiBjaXJjdWxhciBkZXBlbmRlbmN5LgotYXBwbHlfcGF0dGVybl9lcnJvcl9tc2cxPUNhbm5vdCBhcHBseSBhY3Rpdml0eSAnJ3swfScnIHRvIHRoZSBwcm9jZXNzICcnezF9Jycgc2luY2UgJyd7MH0nJyBhbHJlYWR5IGhhcyBvbmUgb3IgbW9yZSBjb250cmlidXRlZC9yZXBsYWNlZCBhY3Rpdml0aWVzIGFzIGl0cyBjaGlsZHJlbi4KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzE9QWN0aXZpdHkgJyd7MH0nJyBjYW5ub3Qgc2V0IHZhcmlhYmlsaXR5IHdpdGggb25lIG9mIGl0cyBkaXJlY3QgcGFyZW50LgotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMj1BY3Rpdml0eSAnJ3swfScnIGNhbm5vdCBzZXQgdmFyaWFiaWxpdHkgd2l0aCAnJ3sxfScnIHNpbmNlIGl0IHdpbGwgcmVzdWx0IGluIGNpcmN1bGFyIGRlcGVuZGVuY3kuCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2czPUNhbm5vdCByZXBsYWNlcyBhIHRvcCBwcm9jZXNzIHdpdGggYW4gYWN0aXZpdHkuCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2c9QWN0aXZpdHkgJyd7MH0nJyBjYW5ub3Qgc2V0IHZhcmlhYmlsaXR5IHdpdGggJyd7MX0nJyBzaW5jZSAnJ3sxfScnIGFscmVhZHkgaGFzIG9uZSBvciBtb3JlIGNvbnRyaWJ1dGVkL3JlcGxhY2VkIGFjdGl2aXRpZXMgYXMgaXRzIGNoaWxkcmVuLgotdmFyaWFiaWxpdHlfZXJyb3JfbXNnPVZhcmlhYmlsaXR5IGVsZW1lbnQgJyd7MH0nJyBjYW5ub3Qgc2V0IHZhcmlhYmlsaXR5IHdpdGggJyd7MX0nJyBzaW5jZSBpdCB3aWxsIHJlc3VsdCBpbiBjaXJjdWxhciBkZXBlbmRlbmN5LgotY2lyY3VsYXJfZGVwZW5kZW5jeV9lcnJvcl9tc2c9Q2Fubm90IHBlcmZvcm0gdGhlIG9wZXJhdGlvbiBzaW5jZSBpdCB3aWxsIHJlc3VsdCBpbiBjaXJjdWxhciBkZXBlbmRlbmN5LgotCi0jIFZhbGlkYXRpb24gbWVzc2FnZXMKLXZhcmlhYmlsaXR5X2VsZW1lbnRfY2lyY3VsYXJfbG9vcF9lcnJvcl9tc2c9Q2lyY3VsYXIgZGVwZW5kZW5jeSBsb29wIGRldGVjdGVkIC4uLiAKLXJlcGxhY2luZ19hbmNlc3Rvcl9lcnJvcl9tc2c9UmVwbGFjaW5nIGFuIGFuY2VzdG9yIGVycm9yIGlzIGRldGVjdGVkLgotY2Fubm90X2NvcHlfb3JfZXh0ZW5kX2RlbGl2ZXJ5X3Byb2Nlc3M9Q2Fubm90IGNvcHkgb3IgZXh0ZW5kIGEgZGVsaXZlcnkgcHJvY2VzcyBvciBhbnkgb2YgaXRzIGFjdGl2aXRpZXMuCi0KLSMgU29ydCBvcHRpb25zCi1Tb3J0VHlwZV9MYWJlbD1Tb3J0IFR5cGU6Ci1Tb3J0VHlwZV9NYW51YWw9TWFudWFsCi1Tb3J0VHlwZV9BbHBoYWJldGljPUFscGhhYmV0aWMKLVNvcnRUeXBlX1JldmVyc2VBbHBoYWJldGljPVJldmVyc2UgQWxwaGFiZXRpYwotU29ydFR5cGVfTWV0aG9kVHlwZT1FbGVtZW50IFR5cGUKLQotV29ya09yZGVyVHlwZUFiYnJldmlhdGlvbl9GSU5JU0hfVE9fU1RBUlQ9RlMKLVdvcmtPcmRlclR5cGVBYmJyZXZpYXRpb25fRklOSVNIX1RPX0ZJTklTSD1GRgotV29ya09yZGVyVHlwZUFiYnJldmlhdGlvbl9TVEFSVF9UT19GSU5JU0g9U0YKLVdvcmtPcmRlclR5cGVBYmJyZXZpYXRpb25fU1RBUlRfVE9fU1RBUlQ9U1MKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvU3RydWN0dXJlZE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9TdHJ1Y3R1cmVkTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMmYwMDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9TdHJ1Y3R1cmVkTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBzdHJ1Y3R1cmVkIG1ldGhvZCBwbHVnLWluLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCU1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElHcm91cENvbnRhaW5lciwKLQkJSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBNYXAgZ3JvdXBJdGVtUHJvdmlkZXJNYXA7Ci0KLQlwcml2YXRlIE1vZGVsU3RydWN0dXJlIG1vZGVsU3RydWN0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9kZWxTdHJ1Y3R1cmUoTW9kZWxTdHJ1Y3R1cmUgbW9kZWxTdHJ1Y3QpIHsKLQkJdGhpcy5tb2RlbFN0cnVjdCA9IG1vZGVsU3RydWN0OwotCX0KLQotCXB1YmxpYyBNb2RlbFN0cnVjdHVyZSBnZXRNb2RlbFN0cnVjdHVyZSgpIHsKLQkJcmV0dXJuIG1vZGVsU3RydWN0OwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0R3JvdXBJdGVtUHJvdmlkZXIoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGdyb3VwSXRlbVByb3ZpZGVyTWFwID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdyb3VwSXRlbVByb3ZpZGVyTWFwLmdldChuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGx1Z2luX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGdyb3VwSXRlbVByb3ZpZGVyTWFwICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdyb3VwSXRlbVByb3ZpZGVyTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgYWRhcHRlciA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSURpc3Bvc2FibGUpIHsKLQkJCQkJKChJRGlzcG9zYWJsZSkgYWRhcHRlcikuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLmNsZWFyKCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcCA9IG51bGw7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1RuZ0FkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1RuZ0FkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZGFkYmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9UbmdBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaW50ZXJuYWwuVG5nQWRhcHRlckZhY3RvcnlJbXBsOwotCi0vKioKLSAqIFRoZSBmYWN0b3J5IGZvciBhbGwgdGhlIGFkYXB0ZXIgZmFjdG9yaWVzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRuZ0FkYXB0ZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgVG5nQWRhcHRlckZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgVG5nQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBZGFwdGVyRmFjdG9yeVtdIHByb2Nlc3NBZGFwdGVyRmFjdG9yaWVzID0gewotCQlJTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQlJTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQlJTlNUQU5DRS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQlJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JfTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIExpYnJhcnkgdmlldy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBMaWJyYXJ5IHZpZXcKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50IGZpbHRlcgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIENvbmZpZ3VyYXRpb24gdmlldwotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRDb25maWd1cmF0aW9uVmlld19BZGFwdGVyRmFjdG9yeShJRmlsdGVyIGZpbHRlcik7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZS4gQ2xpZW50IGlzCi0JICogcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdCBhZnRlciB1c2UgYnkgY2FsbGluZwotCSAqIHtAbGlua3BsYWluIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpfQotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlV0JTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUuIENsaWVudCBpcwotCSAqIHJlc3BvbnNpYmxlIGZvciBkaXNwb3NpbmcgaXQgYWZ0ZXIgdXNlIGJ5IGNhbGxpbmcKLQkgKiB7QGxpbmtwbGFpbiBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5I2Rpc3Bvc2UoKX0KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVRCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmYWN0b3J5IGZvciBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZS4KLQkgKiBDbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdCBhZnRlciB1c2UgYnkgY2FsbGluZwotCSAqIHtAbGlua3BsYWluIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpfQotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVXUEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBDb25zb2xpZGF0ZWQgQnJlYWtkb3duIFN0cnVjdHVyZS4KLQkgKiBDbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdCBhZnRlciB1c2UgYnkgY2FsbGluZwotCSAqIHtAbGlua3BsYWluIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpfQotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgQ29uc29saWRhdGVkIEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBwdWJsaXNoZWQgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLgotCSAqIENsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nIGl0IGFmdGVyIHVzZSBieSBjYWxsaW5nCi0JICoge0BsaW5rcGxhaW4gQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSNkaXNwb3NlKCl9Ci0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBwdWJsaXNoZWQgV29yayBCcmVha2Rvd24gU3RydWN0dXJlCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlUHVibGlzaGluZ1dCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZmFjdG9yeSBmb3IgcHVibGlzaGVkIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZS4KLQkgKiBDbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdCBhZnRlciB1c2UgYnkgY2FsbGluZwotCSAqIHtAbGlua3BsYWluIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpfQotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgcHVibGlzaGVkIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVB1Ymxpc2hpbmdUQlNBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZhY3RvcnkgZm9yIHB1Ymxpc2hlZCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duCi0JICogU3RydWN0dXJlLiBDbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdCBhZnRlciB1c2UgYnkgY2FsbGluZwotCSAqIHtAbGlua3BsYWluIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpfQotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgcHVibGlzaGVkIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24KLQkgKiAgICAgICAgIFN0cnVjdHVyZQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVB1Ymxpc2hpbmdXUEJTQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgcHVibGlzaGVkIENvbnNvbGlkYXRlZCBCcmVha2Rvd24KLQkgKiBTdHJ1Y3R1cmUuIENsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nIGl0IGFmdGVyIHVzZSBieSBjYWxsaW5nCi0JICoge0BsaW5rcGxhaW4gQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSNkaXNwb3NlKCl9Ci0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBwdWJsaXNoZWQgQ29uc29saWRhdGVkIEJyZWFrZG93bgotCSAqICAgICAgICAgU3RydWN0dXJlCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlUHVibGlzaGluZ0NCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaW5nbGV0b24gY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgV29yayBQcm9kdWN0Ci0JICogQnJlYWtkb3duIFN0cnVjdHVyZSBlZGl0b3IuCi0JICogCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKiAgICAgICAgIGVkaXRvcgotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaW5nbGV0b24gY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgVGVhbSBCcmVha2Rvd24KLQkgKiBTdHJ1Y3R1cmUgZWRpdG9yLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc2luZ2xldG9uIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSBmb3IgV29yayBQcm9kdWN0IEJyZWFrZG93bgotCSAqIFN0cnVjdHVyZSBlZGl0b3IuCi0JICogCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKiAgICAgICAgIGVkaXRvcgotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaW5nbGV0b24gY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgQ29uc29saWRhdGVkCi0JICogQnJlYWtkb3duIFN0cnVjdHVyZSBlZGl0b3IuCi0JICogCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgQ29uc29saWRhdGVkIEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKiAgICAgICAgIGVkaXRvcgotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaW5nbGV0b24gY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIENvbmZpZ3VyYXRpb24gdmlldwotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldENvbmZpZ3VyYXRpb25WaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgYWRhcHRlciBmYWN0b3J5IGZvciBJdGVtc0ZpbHRlciBwYWNrYWdlLiBFaXRoZXIKLQkgKiBnZXRGaWx0ZXJWaWV3X0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKSBvcgotCSAqIGdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKSBzaG91bGQgYmUgdXNlZC4gQm90aCBjYW4gYmUKLQkgKiB1c2VkIGF0IHRoZSBzYW1lIHRpbWUgZGVwZW5kcyBvbiBwdXJwb3NlLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShJRmlsdGVyIGZpbHRlcik7Ci0KLQkvKioKLQkgKiBHZXRzIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBmaWx0ZXIuCi0JICogCi0JICogQHBhcmFtIGZpbHRlcgotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudCBmaWx0ZXIKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0T0JTRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKTsKLQotCS8qKgotCSAqIEdldHMgYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUgZmlsdGVyLgotCSAqIAotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQgZmlsdGVyCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZQotCSAqICAgICAgICAgZmlsdGVyCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFBCU0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShJRmlsdGVyIGZpbHRlcik7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaW5nbGV0b24gY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgVGVhbSBCcmVha2Rvd24KLQkgKiBTdHJ1Y3R1cmUgZmlsdGVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRPQlNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc2luZ2xldG9uIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFdvcmsgUHJvZHVjdAotCSAqIEJyZWFrZG93biBTdHJ1Y3R1cmUgZmlsdGVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlCi0JICogICAgICAgICBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRQQlNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc2luZ2xldG9uIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIGl0ZW0gZmlsdGVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIGl0ZW0gZmlsdGVyCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0SXRlbXNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogUmVzZXRzIHRoZSBhZGFwdGVyIGZhY3Rvcmllcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldCgpOwotCi0JLyoqCi0JICogUmVsZWFzZXMgdW51c2VkIG9iamVjdHMuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW5VcCgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1RyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1RyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YzNkY2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuSUVsZW1lbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luOwotCi0vKioKLSAqIEl0ZW0gcHJvdmlkZXIgZm9yIFVJIHRyYW5zaWVudCBvYmplY3RzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ3JvdXAvb3JnYW5pemUKLSAqIG1vZGVsIG9iamVjdHMgaW4gYSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsCi0JCUlFbGVtZW50SXRlbVByb3ZpZGVyLCBJQ29uZmlndXJhYmxlLCBJRGVmYXVsdE5hbWVTZXR0ZXIsCi0JCUlMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotCXByb3RlY3RlZCBJRmlsdGVyIGNoaWxkRmlsdGVyOwotCi0JcHJvdGVjdGVkIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlOb3RpZmllciBwYXJlbnQpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQlwYXJlbnQuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU5vdGlmaWVyIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQlwYXJlbnQuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoY2hpbGRGaWx0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNoaWxkRmlsdGVyLmFjY2VwdChvYmopOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCXJldHVybiB0YXJnZXQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE5ld0NoaWxkRGVzY3JpcHRvcnModGFyZ2V0LCBlZGl0aW5nRG9tYWluLCBzaWJsaW5nKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UmVzb3VyY2VMb2NhdG9yKCkKLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS5sYW5nLk9iamVjdCwgaW50LAotCSAqICAgICAgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCUNvbW1hbmQgY21kID0gc3VwZXIuY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kKGRvbWFpbiwgKEVPYmplY3QpIHRhcmdldCwKLQkJCQlmZWF0dXJlLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZDoKLQkJLy8gY2FuIGV4ZWN1dGU6ICIgKyBjbWQuY2FuRXhlY3V0ZSgpKTsKLQkJcmV0dXJuIGNtZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlQWRkQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS51dGlsLkNvbGxlY3Rpb24sIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCUNvbGxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChhY2NlcHRBc0NoaWxkKGVsZW1lbnQpKSB7Ci0JCQkJc2VsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZChzdXBlci5jcmVhdGVBZGRDb21tYW5kKGRvbWFpbiwKLQkJCQkoRU9iamVjdCkgdGFyZ2V0LCBmZWF0dXJlLCBzZWxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZVJlbW92ZUNvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZVJlbW92ZUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCUNvbW1hbmQgY21kID0gc3VwZXIuY3JlYXRlUmVtb3ZlQ29tbWFuZChkb21haW4sIChFT2JqZWN0KSB0YXJnZXQsCi0JCQkJZmVhdHVyZSwgY29sbGVjdGlvbik7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY3JlYXRlUmVtb3ZlQ29tbWFuZDogY2FuCi0JCS8vIGV4ZWN1dGU6ICIgKyBjbWQuY2FuRXhlY3V0ZSgpKTsKLQkJcmV0dXJuIGNtZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlTW92ZUNvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVNb3ZlQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlDb21tYW5kIGNtZCA9IHN1cGVyLmNyZWF0ZU1vdmVDb21tYW5kKGRvbWFpbiwgKEVPYmplY3QpIHRhcmdldCwKLQkJCQlmZWF0dXJlLCB2YWx1ZSwgaW5kZXgpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NyZWF0ZU1vdmVDb21tYW5kOiBjYW4KLQkJLy8gZXhlY3V0ZTogIiArIGNtZC5jYW5FeGVjdXRlKCkpOwotCQlyZXR1cm4gY21kOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUNvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuQ2xhc3MsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3Qgb2JqZWN0LCBFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUNsYXNzIGNvbW1hbmRDbGFzcywgQ29tbWFuZFBhcmFtZXRlciBjb21tYW5kUGFyYW1ldGVyKSB7Ci0JCWlmIChjb21tYW5kQ2xhc3MgPT0gUmVtb3ZlQ29tbWFuZC5jbGFzcykgewotCQkJY29tbWFuZFBhcmFtZXRlci5zZXRPd25lcih0YXJnZXQpOwotCQl9Ci0JCUNvbW1hbmQgY21kID0gc3VwZXIuY3JlYXRlQ29tbWFuZChvYmplY3QsIGRvbWFpbiwgY29tbWFuZENsYXNzLAotCQkJCWNvbW1hbmRQYXJhbWV0ZXIpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NyZWF0ZUNvbW1hbmQ6ICIgKwotCQkvLyBjb21tYW5kQ2xhc3MgKyAiLCBjYW4gZXhlY3V0ZTogIiArIGNtZC5jYW5FeGVjdXRlKCkgKyAiLCBvd25lcjogIiArCi0JCS8vIGNvbW1hbmRQYXJhbWV0ZXIuZ2V0T3duZXIoKSArICIsIGNvbGxlY3Rpb246ICIgKwotCQkvLyBjb21tYW5kUGFyYW1ldGVyLmdldENvbGxlY3Rpb24oKSk7Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDaGlsZHJlblN0b3JlIHN0b3JlID0gZ2V0Q2hpbGRyZW5TdG9yZSh0YXJnZXQpOwotCQlpZiAoc3RvcmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIHN0b3JlLmdldENoaWxkcmVuKCk7Ci0JCX0KLQotCQlzdG9yZSA9IGNyZWF0ZUNoaWxkcmVuU3RvcmUodGFyZ2V0KTsKLQkJTGlzdCByZXN1bHQgPSBzdG9yZSAhPSBudWxsID8gbnVsbCA6IG5ldyBBcnJheUxpc3QoKTsKLQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIHRhcmdldDsKLQotCQlpZiAodGFyZ2V0ID09IG51bGwpIHJldHVybiByZXN1bHQ7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDaGlsZHJlbkZlYXR1cmVzKHRhcmdldCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGkubmV4dCgpOwotCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCWZvciAoSXRlcmF0b3IgY2kgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBjaS5oYXNOZXh0KCk7IGluZGV4KyspIHsKLQkJCQkJT2JqZWN0IGNoaWxkID0gY2kubmV4dCgpOwotCQkJCQlpZiAoYWNjZXB0QXNDaGlsZChjaGlsZCkpIHsKLQkJCQkJCWNoaWxkID0gd3JhcChlT2JqZWN0LCBmZWF0dXJlLCBjaGlsZCwgaW5kZXgpOwotCQkJCQkJaWYgKHN0b3JlICE9IG51bGwpIHsKLQkJCQkJCQlzdG9yZS5nZXRMaXN0KGZlYXR1cmUpLmFkZChjaGlsZCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJlc3VsdC5hZGQoY2hpbGQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlPYmplY3QgY2hpbGQgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKGFjY2VwdEFzQ2hpbGQoY2hpbGQpKSB7Ci0JCQkJCWNoaWxkID0gd3JhcChlT2JqZWN0LCBmZWF0dXJlLCBjaGlsZCwKLQkJCQkJCQlDb21tYW5kUGFyYW1ldGVyLk5PX0lOREVYKTsKLQkJCQkJaWYgKHN0b3JlICE9IG51bGwpIHsKLQkJCQkJCXN0b3JlLnNldFZhbHVlKGZlYXR1cmUsIGNoaWxkKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJlc3VsdC5hZGQoY2hpbGQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUxpc3QgY2hpbGRyZW4gPSBzdG9yZSAhPSBudWxsID8gc3RvcmUuZ2V0Q2hpbGRyZW4oKSA6IHJlc3VsdDsKLQkJQ29sbGVjdGlvbnMuc29ydChjaGlsZHJlbiwgUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRDb21wYXJhdG9yKCkpOwotCQkKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBmbG9hdCwgaW50LCBpbnQsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCU9iamVjdCBvd25lciwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWJvb2xlYW4gY2FuRXhlYyA9IHRydWU7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoIWFjY2VwdEFzQ2hpbGQoaXRlci5uZXh0KCkpKSB7Ci0JCQkJY2FuRXhlYyA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCUNvbW1hbmQgY21kOwotCQlpZiAoY2FuRXhlYykgewotCQkJY21kID0gc3VwZXIuY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKGRvbWFpbiwgb3duZXIsIGxvY2F0aW9uLAotCQkJCQlvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pOwotCQl9IGVsc2UgewotCQkJY21kID0gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NyZWF0ZU1vdmVDb21tYW5kOiBjYW4KLQkJLy8gZXhlY3V0ZTogIiArIGNtZC5jYW5FeGVjdXRlKCkpOwotCQlyZXR1cm4gY21kOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKHRoaXMsIG1zZyk7Ci0KLQkJLy8gaWYobXNnLmdldE5vdGlmaWVyKCkgPT0gdGFyZ2V0KSB7Ci0JCS8vIGlmKGZlYXR1cmVJZCA9PSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUykgewotCQkvLyBib29sZWFuIG5vdGlmeSA9IGZhbHNlOwotCQkvLyBzd2l0Y2gobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJLy8gY2FzZSBOb3RpZmljYXRpb24uTU9WRToKLQkJLy8gT2JqZWN0IG9iaiA9IG1zZy5nZXROZXdWYWx1ZSgpOwotCQkvLyBub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCS8vIG9iaiA9IG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkvLyBub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJLy8gQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkvLyBmb3JfY2hlY2s6Ci0JCS8vIGZvcihJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gaWYoYWNjZXB0QXNDaGlsZChpdGVyLm5leHQoKSkpIHsKLQkJLy8gbm90aWZ5ID0gdHJ1ZTsKLQkJLy8gYnJlYWsgZm9yX2NoZWNrOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gYnJlYWs7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkvLyBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkvLyBmb3JfY2hlY2s6Ci0JCS8vIGZvcihJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gaWYoYWNjZXB0QXNDaGlsZChpdGVyLm5leHQoKSkpIHsKLQkJLy8gbm90aWZ5ID0gdHJ1ZTsKLQkJLy8gYnJlYWsgZm9yX2NoZWNrOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gYnJlYWs7Ci0JCS8vCi0JCS8vIH0KLQkJLy8gaWYobm90aWZ5KSB7Ci0JCS8vIGZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obXNnLCB0aGlzLCB0cnVlLCBmYWxzZSkpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldENvbmZpZ3VyYXRpb24ob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmNoaWxkRmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRm9sZGVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1ZhcmlhYmlsaXR5SW5mby5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9WYXJpYWJpbGl0eUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAwZTc0MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1ZhcmlhYmlsaXR5SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3Igc3RvcmluZyB2YXJpYWJpbGl0eSBpbmZvcm1hdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZhcmlhYmlsaXR5SW5mbyB7Ci0KLQlwcml2YXRlIFZhcmlhYmlsaXR5RWxlbWVudCBvd25lcjsKLQotCXByaXZhdGUgTGlzdCBpbmhlcml0YW5jZUxpc3Q7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBjb250cmlidXRvcnM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqICAgICAgICAgICAgYSB2YXJpYWJpbGl0eSBlbGVtZW50Ci0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5SW5mbyhWYXJpYWJpbGl0eUVsZW1lbnQgb3duZXIpIHsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG93bmVyIG9mIHRoaXMgVmFyaWFiaWxpdHlJbmZvIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvd25lciBvZiB0aGlzIFZhcmlhYmlsaXR5SW5mbyBvYmplY3QuCi0JICovCi0JcHVibGljIGZpbmFsIFZhcmlhYmlsaXR5RWxlbWVudCBnZXRPd25lcigpIHsKLQkJcmV0dXJuIG93bmVyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJlYWxpemVkIGluaGVyaXRhbmNlIGxpc3QgaW4gdGhlIG9yZGVyIGZyb20gdGhlIHJlc29sdmVkIG9iamVjdAotCSAqIG9mIHRoZSBvd25lciB0byB0aGUgaXRzIHRvcCBiYXNlLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbmhlcml0YW5jZUxpc3QoKSB7Ci0JCWlmIChpbmhlcml0YW5jZUxpc3QgPT0gbnVsbCkgewotCQkJaW5oZXJpdGFuY2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBpbmhlcml0YW5jZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlzdCBvZiBhbGwgY29udHJpYnV0b3IgdG8KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q29udHJpYnV0b3JzKCkgewotCQlpZiAoY29udHJpYnV0b3JzID09IG51bGwpIHsKLQkJCWNvbnRyaWJ1dG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gY29udHJpYnV0b3JzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9icmVha2Rvd25lbGVtZW50L0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2JyZWFrZG93bmVsZW1lbnQvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjN2E2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2JyZWFrZG93bmVsZW1lbnQvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5icmVha2Rvd25lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIHNrYW5ub29yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkFjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCXB1YmxpYyBBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eV90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlPYmplY3QgaW1nID0gVG5nVXRpbC5nZXRJbWFnZShvYmplY3QpOwotCQlyZXR1cm4gaW1nICE9IG51bGwgPyBpbWcgOiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvYnJlYWtkb3duZWxlbWVudC9NaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvYnJlYWtkb3duZWxlbWVudC9NaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI4ZDc5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2JyZWFrZG93bmVsZW1lbnQvTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuYnJlYWtkb3duZWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIEBhdXRob3Igc2thbm5vb3IKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWxlc3RvbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1pbGVzdG9uZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgTWlsZXN0b25lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX01pbGVzdG9uZV90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9DdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0N1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM0Yjc1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0N1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJDdXN0b20gQ2F0ZWdvcmllcyIgZm9sZGVyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEN1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSB0YXJnZXQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0YXJnZXQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoIXN1cGVyLmFjY2VwdEFzQ2hpbGQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGFjY2VwdChvYmopOwotCi0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJTGlzdCBteUNhdGVnb3JpZXMgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkuZ2V0Q3VzdG9tQ2F0ZWdvcmllcygoQ3VzdG9tQ2F0ZWdvcnkpIG9iaik7Ci0JCQlpZiAobXlDYXRlZ29yaWVzLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlpZiAobXlDYXRlZ29yaWVzLnNpemUoKSA9PSAxKSB7Ci0JCQkJLy8gcm9vdCBjdXN0b20gY2F0ZWdvcnkgaXMgdW5kZSB0aGUgaGlkZGVuIHBhY2thZ2UgYW5kIHdpbGwgbm90Ci0JCQkJLy8gYmUgcHJvY2Vzc2VkLgotCQkJCS8vIG5lZWQgdG8gc2hvdyBzdWIgY2F0ZWdvcmllcyB1bmRlciBpdAotCQkJCUN1c3RvbUNhdGVnb3J5IGMgPSAoQ3VzdG9tQ2F0ZWdvcnkpIG15Q2F0ZWdvcmllcy5nZXQoMCk7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoYykpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ3VzdG9tQ2F0ZWdvcmllcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKFRuZ1V0aWwuZXh0cmFjdCgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfQ1VTVE9NX0NBVEVHT1JZKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2Q4ZDE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuRU1GRWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNhdGVnb3J5U29ydEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgY3VzdG9tIGNhdGVnb3J5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRGVmYXVsdE5hbWVTZXR0ZXIsIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQkvLyB0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCi0JCS8vIEN1c3RvbUNhdGVnb3J5IGNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBvYmplY3Q7Ci0JCS8vIGlmKGNhdGVnb3J5LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCS8vIHJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJLy8gfQotCQkvLwkJCi0JCS8vIGlmKHBhcmVudCAhPSBudWxsKSB7Ci0JCS8vIHJldHVybiBwYXJlbnQ7Ci0JCS8vIH0KLQkJLy8JCQotCQkvLyBpZihvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCS8vIE1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgb2JqZWN0KTsKLQkJLy8gLy9pZihwbHVnaW4gPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCS8vCQkJCi0JCS8vIGlmKHBsdWdpbiAhPSBudWxsKSB7Ci0JCS8vIFN0cmluZ1tdIHBhdGggPSB7Ci0JCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKQotCQkvLyAsTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXAiKQotCQkvLyB9OwotCQkvLyByZXR1cm4gVG5nVXRpbC5nZXRBZGFwdGVyKHBsdWdpbiwgcGF0aCk7Ci0JCS8vIH0KLQkJLy8JCQkKLQkJLy8gfQotCi0JCWlmIChUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgb2JqZWN0KSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUN1c3RvbUNhdGVnb3J5KCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJLy8gY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcmllcygpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCkpOwotCQkJLy8gY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnlfUHJvY2Vzc0VsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQuSGVscGVyI2dldENyZWF0ZUNoaWxkSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRlQ2hpbGRJbWFnZShPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UgJiYgY2hpbGQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChFUmVmZXJlbmNlKSBmZWF0dXJlOwotCQkJRUNsYXNzIHBhcmVudENsYXNzID0gcmVmZXJlbmNlLmdldEVDb250YWluaW5nQ2xhc3MoKTsKLQkJCUVDbGFzcyBjaGlsZENsYXNzID0gKChFT2JqZWN0KSBjaGlsZCkuZUNsYXNzKCk7Ci0JCQlTdHJpbmcgbmFtZSA9ICJmdWxsL2N0b29sMTYvQ3JlYXRlIiArIHBhcmVudENsYXNzLmdldE5hbWUoKSArICJfIiArIHJlZmVyZW5jZS5nZXROYW1lKCkgKyAiXyIgKyBjaGlsZENsYXNzLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKG5hbWUpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIEVNRkVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvY3Rvb2wxNi9DcmVhdGVDaGlsZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBoYW5kbGVSZW1vdmVkKEN1c3RvbUNhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCWlmIChBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKGNhdGVnb3J5KS5pc0VtcHR5KCkpIHsKLQkJCS8vIHJlbW92ZSBhbGwgc3ViY2F0ZWdvcmllcwotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNhdGVnb3J5LmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlFY29yZVV0aWwucmVtb3ZlKGNhdGVnb3J5KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc2V0RGVmYXVsdE5hbWUobm90aWZpY2F0aW9uKTsKLQotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCUNvbnRlbnRQYWNrYWdlIHBrZzsKLQkJLy8gYm9vbGVhbiByZWZyZXNoQ3VzdG9tQ2F0ZWdvcnlSb290ID0gZmFsc2U7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDdXN0b21DYXRlZ29yeS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19OQU1FOgotCQkJVG5nVXRpbC5yZWZyZXNoQ29udHJpYnV0b3JzKHRoaXMsIG5vdGlmaWNhdGlvbiwgZmFsc2UsIHRydWUpOwotCQkJLy9mb3IgZXBmIGRlZmVjdDoxNzQwNDMKLQkJCWlmKCFUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkpewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBNZXRob2RFbGVtZW50VXRpbC5nZXRNZXRob2RNb2RlbChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJaWYocGx1Z2luICE9bnVsbCl7Ci0JCQkJCUN1c3RvbUNhdGVnb3J5IHJvb3QgPSBUbmdVdGlsLmdldFJvb3RDdXN0b21DYXRlZ29yeShwbHVnaW4pOwotCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgcm9vdCwgdHJ1ZSwgZmFsc2UpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCWJyZWFrOwotCQkvLyBjYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUklFUzoKLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFM6Ci0JCQlwa2cgPSAoQ29udGVudFBhY2thZ2UpICgoRU9iamVjdCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpCi0JCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAoKHBrZyAhPSBudWxsKQotCQkJCQkmJiAoTW9kZWxTdHJ1Y3R1cmUuSElEREVOX1BBQ0tBR0VfTkFNRQotCQkJCQkJCS5lcXVhbHMocGtnLmdldE5hbWUoKSkpKSB7Ci0JCQkJLy8gbm90aWZpZXIgaXMgdGhlIHJvb3QgY3VzdG9tIGNhdGVnb3J5Ci0JCQkJLy8KLQkJCQlwa2cgPSAoQ29udGVudFBhY2thZ2UpIHBrZy5lQ29udGFpbmVyKCk7Ci0JCQl9Ci0JCQlPYmplY3Qgb2JqOwotCQkJQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnk7Ci0JCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCW9iaiA9IG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCQljYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgb2JqOwotCQkJCQlpZiAoY2F0ZWdvcnkuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJCXBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoY2F0ZWdvcnkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gcmVmcmVzaEN1c3RvbUNhdGVnb3J5Um9vdCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlvYmogPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJCQljYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgb2JqOwotCQkJCQkJaWYgKGNhdGVnb3J5LmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQkJcGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChjYXRlZ29yeSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIHJlZnJlc2hDdXN0b21DYXRlZ29yeVJvb3QgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJCQotCQkJCS8vIHJlbW92aW5nIHN1YmNhdGVnb3JpZXMgaXMgaGFuZGxlZCBieSB0aGUgcmVtb3ZlIGNvbW1hbmQKLQkJCQkvLwotLy8JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0vLwkJCQlvYmogPSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKTsKLS8vCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotLy8JCQkJCWhhbmRsZVJlbW92ZWQoKEN1c3RvbUNhdGVnb3J5KSBvYmopOwotLy8JCQkJfQotLy8JCQkJYnJlYWs7Ci0vLwkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotLy8JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSkKLS8vCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJCW9iaiA9IGl0ZXIubmV4dCgpOwotLy8JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotLy8JCQkJCQloYW5kbGVSZW1vdmVkKChDdXN0b21DYXRlZ29yeSkgb2JqKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQotCQkJLy8gLy8gcmVmcmVzaCB3cmFwcGVycwotCQkJLy8gLy8KLQkJCS8vIGlmKHdyYXBwZXJzICE9IG51bGwpIHsKLQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3Qod3JhcHBlcnMpLml0ZXJhdG9yKCk7Ci0JCQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkJCS8vIGZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJLy8gaXRlci5uZXh0KCksIHRydWUsIGZhbHNlKSk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLwkJCQotCQkJLy8gaWYocmVmcmVzaEN1c3RvbUNhdGVnb3J5Um9vdCkgewotCQkJLy8gLy8gc3ViIGNhdGVnb3J5IGhhcyBiZWVuIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgY3VzdG9tCi0JCQkvLyBjYXRlZ29yeQotCQkJLy8gLy8gbmVlZCB0byByZWZyZXNoIHRoZSBmb2xkZXIgZm9yIGFsbCBjdXN0b20gY2F0ZWdvcmllcwotCQkJLy8gLy8KLQkJCS8vIE1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgdGFyZ2V0KTsKLQkJCS8vCQkJCQotCQkJLy8gaWYocGx1Z2luICE9IG51bGwpIHsKLQkJCS8vIFN0cmluZ1tdIHBhdGggPSB7Ci0JCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikKLQkJCS8vICxMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DdXN0b21fQ2F0ZWdvcmllc19ncm91cCIpCi0JCQkvLyB9OwotCQkJLy8gZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkvLyBUbmdVdGlsLmdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaXNXcmFwcGluZ05lZWRlZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1dyYXBwaW5nTmVlZGVkKG9iamVjdCkpCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCXJldHVybiBUbmdVdGlsLmNyZWF0ZVdyYXBwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsCi0JCQkJaW5kZXgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX0N1c3RvbUNhdGVnb3J5X3R5cGUiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUN1c3RvbUNhdGVnb3J5IGNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBvYmplY3Q7Ci0JCXJldHVybiAhY2F0ZWdvcnkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLmlzRW1wdHkoKQotCQkvLyB8fCAhY2F0ZWdvcnkuZ2V0U3ViQ2F0ZWdvcmllcygpLmlzRW1wdHkoKQotCQk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoTm90aWZpY2F0aW9uIG1zZykgewotCQlJRGVmYXVsdE5hbWVTZXR0ZXIgZGVmYXVsdE5hbWVTZXR0ZXIgPSB0aGlzOwotCQlpZiAoZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgIT0gbnVsbCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoZGVmYXVsdE5hbWVTZXR0ZXIKLQkJCQkJLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpKTsKLQkJCWlmIChmZWF0dXJlSWQgPT0gZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpKSB7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCXNldERlZmF1bHROYW1lKG1zZy5nZXROZXdWYWx1ZSgpLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCXNldERlZmF1bHROYW1lKGl0ZXIubmV4dCgpLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmosIE9iamVjdCBwYXJlbnQpIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlTdHJpbmcgY2NOYW1lID0gKChDdXN0b21DYXRlZ29yeSlvYmopLmdldE5hbWUoKTsKLQkJCWlmIChjY05hbWUgPT0gbnVsbCB8fCBjY05hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19DVVNUT01fQ0FURUdPUlk7Ci0JCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoQ3VzdG9tQ2F0ZWdvcnkpIHBhcmVudCwgKEN1c3RvbUNhdGVnb3J5KSBvYmosIGJhc2VOYW1lKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBDdXN0b21DYXRlZ29yeS5jbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJQ29sbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCS8vIGNoZWNrIGN1c3RvbSBjYXRlZ29yeSBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeQotCQkJCS8vCi0JCQkJaWYgKCEob3duZXIgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQgJiYgVG5nVXRpbAotCQkJCQkJLmlzQW5jZXNzb3JPZigoQ3VzdG9tQ2F0ZWdvcnkpIGVsZW1lbnQsCi0JCQkJCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG93bmVyKSkpIHsKLQkJCQkJc2VsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVSZW1vdmVDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVSZW1vdmVDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlyZXR1cm4gc3VwZXIuY3JlYXRlUmVtb3ZlQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKFRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBvYmplY3QpKQotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yaWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSB7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJaWYgKCgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkgIT0gbnVsbCkgewotCQkJCQlVUkkgaW1nVXJpID0gVG5nVXRpbC5nZXRGdWxsUGF0aG9mTm9kZW9yU2hhcGVJY29uVVJJKAotCQkJCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCwKLQkJCQkJCQkoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KS5nZXROb2RlaWNvbigpKTsKLQkJCQkJT2JqZWN0IGltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0U2hhcmVkSW1hZ2UoaW1nVXJpKTsKLQkJCQkJaWYgKGltYWdlICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gaW1hZ2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCS8vIGRvIG5vdGhpbmcsIGFscmVhZHkgaGFuZGxlZCBieSBzZXREZWZhdWx0TmFtZShOb3RpZmljYXRpb24pCi0JfQotCi0JcHVibGljIExpc3QgZ2V0Tm90aWZ5Q2hhbmdlZExpc3RlbmVycygpIHsKLQkJaWYoY2hhbmdlTm90aWZpZXIgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgoQ29sbGVjdGlvbikgY2hhbmdlTm90aWZpZXIpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkKLQkJQ29sbGVjdGlvbiBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlpZihUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSlvYmplY3QpKXsKLQkJCUxpc3Qgc29ydExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzb3J0TGlzdC5hZGRBbGwoY29sKTsKLQkJCUNvbGxlY3Rpb25zLnNvcnQoc29ydExpc3QsIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0Q29tcGFyYXRvcigpKTsKLQkJCXJldHVybiBzb3J0TGlzdDsKLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlMaXN0IHNvcnRMaXN0ID0gQ2F0ZWdvcnlTb3J0SGVscGVyLnNvcnRDYXRlZ29yeUVsZW1lbnRzKChNZXRob2RFbGVtZW50KW9iamVjdCwgY29sLnRvQXJyYXkoKSk7Ci0JCQlyZXR1cm4gc29ydExpc3Q7Ci0JCX0KLQkJcmV0dXJuIGNvbDsKLQl9Ci0JCi19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIyM2Q4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0Rpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkRpc2NpcGxpbmVzIiBmb2xkZXIuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSByZW5hbWVkIGFzIERpc2NpcGxpbmVzSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlUcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSB0YXJnZXQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0YXJnZXQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyI2lzSW5oZXJpdGVkKG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5oZXJpdGVkKENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSkgewotCQlyZXR1cm4gKGNhdGVnb3J5IGluc3RhbmNlb2YgRGlzY2lwbGluZSB8fCBjYXRlZ29yeSBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykKLQkJCQkmJiBjYXRlZ29yeS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZURpc2NpcGxpbmUoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJTGlzdCBncm91cHMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lR3JvdXBzKChEaXNjaXBsaW5lKSBvYmopOwotCQkJaWYgKGdyb3Vwcy5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChPYmplY3QgZ3JvdXAgOiBncm91cHMpIHsKLQkJCQkJaWYgKGdyb3VwIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSB7Ci0JCQkJCQlpZiAoVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKERpc2NpcGxpbmVHcm91cGluZylncm91cCkgPT0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKERpc2NpcGxpbmUpb2JqKSkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYWNjZXB0KG9iaik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9EaXNjaXBsaW5lcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQkJRGlzY2lwbGluZSBjaGlsZCA9IChEaXNjaXBsaW5lKSBlbGVtZW50OwotCQkJCURpc2NpcGxpbmVJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKERpc2NpcGxpbmVJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkJCS5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLmFkYXB0KGNoaWxkLAotCQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWl0ZW1Qcm92aWRlci5zZXRQYXJlbnQob2JqZWN0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKFRuZ1V0aWwuZXh0cmFjdCgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgRGlzY2lwbGluZS5jbGFzcyksCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmosIExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ESVNDSVBMSU5FKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoVG5nVXRpbC5leHRyYWN0KCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCBEaXNjaXBsaW5lR3JvdXBpbmcuY2xhc3MpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRElTQ0lQTElORV9HUk9VUElORyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0Rpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDc3NjhmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5FTUZFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZGlzY2lwbGluZSBncm91cGluZy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlbmFtZWQgYXMgRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRGVmYXVsdE5hbWVTZXR0ZXIsIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZURpc2NpcGxpbmUoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBvYmplY3QpOwotCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nW10gcGF0aCA9IHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQksCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJfTsKLQotCQkJCXJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKTsKLQkJCX0KLQkJfQotCi0JCS8vIE1ldGhvZFBsdWdpbiBtb2RlbCA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChNZXRob2RFbGVtZW50KSBvYmplY3QpOwotCQkvLyBpZihtb2RlbCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJLy8gSUdyb3VwQ29udGFpbmVyIGdyb3VwQ29udGFpbmVyID0gKElHcm91cENvbnRhaW5lcikKLQkJLy8gVG5nVXRpbC5nZXRBZGFwdGVyKChFT2JqZWN0KW1vZGVsLCBJR3JvdXBDb250YWluZXIuY2xhc3MpOwotCQkvLyBpZihncm91cENvbnRhaW5lciAhPSBudWxsKSB7Ci0JCS8vIGdyb3VwQ29udGFpbmVyID0gKElHcm91cENvbnRhaW5lcikKLQkJLy8gZ3JvdXBDb250YWluZXIuZ2V0R3JvdXBJdGVtUHJvdmlkZXIoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpKTsKLQkJLy8gcmV0dXJuCi0JCS8vIGdyb3VwQ29udGFpbmVyLmdldEdyb3VwSXRlbVByb3ZpZGVyKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIikpOwotCQkvLyB9Ci0JCS8vIC8vIE1ldGhvZE1vZGVsSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChNZXRob2RNb2RlbEl0ZW1Qcm92aWRlcikKLQkJLy8gVG5nVXRpbC5nZXRBZGFwdGVyKChFT2JqZWN0KW1vZGVsLCBNZXRob2RNb2RlbEl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCS8vIC8vIGlmKGl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCS8vIC8vIHJldHVybiBpdGVtUHJvdmlkZXIuZ2V0RGlzY2lwbGluZUNhdGVnb3JpZXMoKTsKLQkJLy8gLy8gfQotCi0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlpZiAoY2hpbGRyZW4gaW5zdGFuY2VvZiBMaXN0KQotCQkJQ29sbGVjdGlvbnMuc29ydCgoTGlzdCkgY2hpbGRyZW4sIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UKLQkJCQkJLmdldENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kLkhlbHBlciNnZXRDcmVhdGVDaGlsZEltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0ZUNoaWxkSW1hZ2UoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlICYmIGNoaWxkIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRVJlZmVyZW5jZSByZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgZmVhdHVyZTsKLQkJCUVDbGFzcyBwYXJlbnRDbGFzcyA9IHJlZmVyZW5jZS5nZXRFQ29udGFpbmluZ0NsYXNzKCk7Ci0JCQlFQ2xhc3MgY2hpbGRDbGFzcyA9ICgoRU9iamVjdCkgY2hpbGQpLmVDbGFzcygpOwotCQkJU3RyaW5nIG5hbWUgPSAiZnVsbC9jdG9vbDE2L0NyZWF0ZSIgKyBwYXJlbnRDbGFzcy5nZXROYW1lKCkgKyAiXyIgKyByZWZlcmVuY2UuZ2V0TmFtZSgpICsgIl8iICsgY2hpbGRDbGFzcy5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl0cnkgewotCQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZShuYW1lKTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBFTUZFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL2N0b29sMTYvQ3JlYXRlQ2hpbGQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJLy8gU3RyaW5nIGxhYmVsID0gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsCi0JCS8vIGdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVHcm91cGluZ190eXBlIikpOwotCQkvLyBDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ29udGVudENhdGVnb3J5KSBvYmplY3Q7Ci0JCS8vIGlmKGNhdGVnb3J5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCS8vIE1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luID0KLQkJLy8gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0ZWdvcnkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJLy8gaWYoYmFzZVBsdWdpbiAhPSBudWxsKSB7Ci0JCS8vIGxhYmVsID0gbGFiZWwgKyAiIChpbmhlcml0ZWQgZnJvbSAiICsgYmFzZVBsdWdpbi5nZXROYW1lKCkgKyAnKSc7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyByZXR1cm4gbGFiZWw7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLQkJCQlnZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfdHlwZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCS8vIGNvbW1lbnRpbmcgYmVsb3csIHVzZWZ1bCBmb3Igc3RhdGVmdWwgaXRlbXByb3ZpZGVyLgotCQkvL1RuZ1V0aWwuc2V0RGVmYXVsdE5hbWUodGhpcywgbm90aWZpY2F0aW9uKTsKLQkJCi0JCS8vIEZvciBzdGF0ZWxlc3MgaXRlbXByb3ZpZGVyLCBuZWVkIHRoaXMuCi0JCXNldERlZmF1bHROYW1lKG5vdGlmaWNhdGlvbik7Ci0JCQotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlDb250ZW50UGFja2FnZSBwa2c7Ci0JCURpc2NpcGxpbmUgZGlzY2lwbGluZTsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERpc2NpcGxpbmVHcm91cGluZy5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkVTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQotCQkJYm9vbGVhbiByZWZyZXNoUGFyZW50ID0gZmFsc2U7Ci0JCQlwa2cgPSAoQ29udGVudFBhY2thZ2UpICgoRU9iamVjdCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpCi0JCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQkJaWYgKGRpc2NpcGxpbmUuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJcGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChkaXNjaXBsaW5lKTsKLQkJCQl9IGVsc2UgaWYgKGRpc2NpcGxpbmUuZUNvbnRhaW5lcigpID09IHBrZykgewotCQkJCQlyZWZyZXNoUGFyZW50ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlkaXNjaXBsaW5lID0gKERpc2NpcGxpbmUpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZGlzY2lwbGluZS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQkJcGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChkaXNjaXBsaW5lKTsKLQkJCQkJfSBlbHNlIGlmIChkaXNjaXBsaW5lLmVDb250YWluZXIoKSA9PSBwa2cpIHsKLQkJCQkJCXJlZnJlc2hQYXJlbnQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJcmVmcmVzaFBhcmVudCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAocmVmcmVzaFBhcmVudCkgewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJZ2V0UGFyZW50KHRhcmdldCksIHRydWUsIGZhbHNlKSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlpZiAoIWlzV3JhcHBpbmdOZWVkZWQob2JqZWN0KSkKLQkJCXJldHVybiB2YWx1ZTsKLQkJcmV0dXJuIFRuZ1V0aWwuY3JlYXRlV3JhcHBlcihhZGFwdGVyRmFjdG9yeSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQlpbmRleCk7Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkvLyBDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBEaXNjaXBsaW5lIGNoaWxkID0gKERpc2NpcGxpbmUpIGl0ZXIubmV4dCgpOwotCS8vIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKERpc2NpcGxpbmVJdGVtUHJvdmlkZXIpCi0JLy8gYWRhcHRlckZhY3RvcnkuYWRhcHQoY2hpbGQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JLy8gaXRlbVByb3ZpZGVyLnNldFBhcmVudChvYmplY3QpOwotCS8vIH0KLQkvLyByZXR1cm4gY2hpbGRyZW47Ci0JLy8gfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoTm90aWZpY2F0aW9uIG1zZykgewotCQlJRGVmYXVsdE5hbWVTZXR0ZXIgZGVmYXVsdE5hbWVTZXR0ZXIgPSB0aGlzOwotCQlpZiAoZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgIT0gbnVsbCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoZGVmYXVsdE5hbWVTZXR0ZXIKLQkJCQkJLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpKTsKLQkJCWlmIChmZWF0dXJlSWQgPT0gZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpKSB7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCXNldERlZmF1bHROYW1lKG1zZy5nZXROZXdWYWx1ZSgpLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCXNldERlZmF1bHROYW1lKGl0ZXIubmV4dCgpLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmosIE9iamVjdCBwYXJlbnQpIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0RJU0NJUExJTkU7Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCS8vIE1ha2luZyBwbHVnaW4gbGV2ZWwgdW5pcXVlbmVzcyBvZiBkaXNjaXBsaW5lLCBvbiByZW1vdmluZyBkaXNjaXBsaW5lIHJlZmVyZW5jZSAKLQkJCS8vIGZyb20gZGlzY2lwbGluZSBncm91cGluZywgZGlzY2lwbGluZSBnb2VzIGJhY2sgdG8gdG9wbGV2ZWwgY2F1c2luZyBkdXBsaWNhdGUuIAotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShUbmdVdGlsLmV4dHJhY3QoCi0JCQkJCSgoQ29udGVudFBhY2thZ2UpICgoKERpc2NpcGxpbmVHcm91cGluZykgcGFyZW50KQotCQkJCQkJCS5lQ29udGFpbmVyKCkpKS5nZXRDb250ZW50RWxlbWVudHMoKSwKLQkJCQkJRGlzY2lwbGluZS5jbGFzcyksIChNZXRob2RFbGVtZW50KSBvYmosCi0JCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ESVNDSVBMSU5FKTsKLQkJfQotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0RJU0NJUExJTkU7Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChEaXNjaXBsaW5lR3JvdXBpbmcpIHRhcmdldCkKLQkJCQkJLmdldERpc2NpcGxpbmVzKCksIChNZXRob2RFbGVtZW50KSBvYmosIGJhc2VOYW1lKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKChBZGRDb21tYW5kKSBzdXBlci5jcmVhdGVBZGRDb21tYW5kKAotCQkJCWRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlciNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9EaXNjaXBsaW5lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNTdjYmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9EaXNjaXBsaW5lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGRpc2NpcGxpbmUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkRpc2NpcGxpbmVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJTGlicmFyeUl0ZW1Qcm92aWRlciwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyLCBJRGVmYXVsdE5hbWVTZXR0ZXIgewotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLS8vCQlpZiAocGFyZW50ICE9IG51bGwpCi0vLwkJCXJldHVybiBwYXJlbnQ7Ci0vLwkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSlvYmplY3Q7Ci0JCWlmKGRpc2NpcGxpbmUuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgRGlzY2lwbGluZSl7Ci0JCQlwYXJlbnQgPSAgc3VwZXIuZ2V0UGFyZW50KGRpc2NpcGxpbmUpOwotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCQkKLQkJTWV0aG9kUGx1Z2luIG1vZGVsID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZGlzY2lwbGluZSk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nW10gcGF0aCA9IHsKLQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCSwKLQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJfTsKLQotCQlyZXR1cm4gVG5nVXRpbC5nZXRBZGFwdGVyKG1vZGVsLCBwYXRoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0RGlzY2lwbGluZV9TdWJkaXNjaXBsaW5lKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc2NpcGxpbmUoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWlmKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCl7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9TdWJkaXNjaXBsaW5lKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSh0aGlzLCBub3RpZmljYXRpb24pOwotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlUbmdVdGlsLnJlZnJlc2hQYXJlbnRJZk5hbWVDaGFuZ2VkKG5vdGlmaWNhdGlvbiwgdGhpcyk7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaXNjaXBsaW5lLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fTkFNRToKLQkJCVRuZ1V0aWwucmVmcmVzaENvbnRyaWJ1dG9ycyh0aGlzLCBub3RpZmljYXRpb24sIGZhbHNlLCB0cnVlKTsKLQkJCWJyZWFrOwotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fVEFTS1M6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCi0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1dTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCS8vIHJlZnJlc2ggdW5jYXRlZ29yaXplZCB0YXNrcyBmb2xkZXIKLQkJCS8vIFRuZ1V0aWwucmVmcmVzaEFkYXB0ZXIoTGlicmFyeUVkaXRDb25zdGFudHMuVU5DQVRFR09SSVpFRF9UQVNLU19QQVRILAotCQkJLy8gbm90aWZpY2F0aW9uKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQkRJU0NJUExJTkU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwkJCi0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQkJCi0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbCgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QsCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZV90eXBlIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlpZiAoIWlzV3JhcHBpbmdOZWVkZWQob2JqZWN0KSkKLQkJCXJldHVybiB2YWx1ZTsKLQkJcmV0dXJuIFRuZ1V0aWwuY3JlYXRlV3JhcHBlcihhZGFwdGVyRmFjdG9yeSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQlpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldE5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMoKSB7Ci0JCWlmKGNoYW5nZU5vdGlmaWVyIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoKENvbGxlY3Rpb24pIGNoYW5nZU5vdGlmaWVyKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIENoYW5nZSBDYXRlZ29yaWVzIGRpc3BsYXkgaW4gTGlicmFyeSBOYXZpZ2F0b3IKLQkJLy8gKGNvbW1lbnRlZCBmb3IgdGhpcyBkZWZlY3QpCi0JCS8vIHJldHVybiAhKChEaXNjaXBsaW5lKSBvYmplY3QpLmdldFRhc2tzKCkuaXNFbXB0eSgpOwotCQkvL3JldHVybiBmYWxzZTsKLQkJcmV0dXJuIHN1cGVyLmhhc0NoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCS8vIHJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpCi0JCS8vIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwgaW5kZXgpKTsKLQkJLy9yZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJQ29sbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQkJc2VsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKChBZGRDb21tYW5kKSBzdXBlci5jcmVhdGVBZGRDb21tYW5kKAotCQkJCWRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQkRJU0NJUExJTkU7Ci0JfQotCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gRGlzY2lwbGluZS5jbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0RJU0NJUExJTkU7Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChEaXNjaXBsaW5lKSB0YXJnZXQpLmdldFN1YmRpc2NpcGxpbmUoKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwgYmFzZU5hbWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkvL3JldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJaWYgKGNoaWxkcmVuIGluc3RhbmNlb2YgTGlzdCkKLQkJCUNvbGxlY3Rpb25zLnNvcnQoKExpc3QpIGNoaWxkcmVuLCBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Eb21haW5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU3OTkxOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5GZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGRvbWFpbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Eb21haW5JdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRGVmYXVsdE5hbWVTZXR0ZXIsIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERvbWFpbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldERvbWFpbl9TdWJkb21haW5zKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURvbWFpbigpKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluX1N1YmRvbWFpbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJRG9tYWluIGRvbWFpbiA9IChEb21haW4pIG9iamVjdDsKLQkJaWYgKGRvbWFpbi5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCQlNZXRob2RQbHVnaW4gbW9kZWwgPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihkb21haW4pOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZ1tdIHBhdGggPSB7Ci0JCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQksCi0JCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCSwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRG9tYWluc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJfTsKLQotCQlyZXR1cm4gVG5nVXRpbC5nZXRBZGFwdGVyKG1vZGVsLCBwYXRoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLQkJCQlnZXRTdHJpbmcoIl9VSV9Eb21haW5fdHlwZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkvL1RuZ1V0aWwuc2V0RGVmYXVsdE5hbWUodGhpcywgbm90aWZpY2F0aW9uKTsKLQkJc2V0RGVmYXVsdE5hbWUobm90aWZpY2F0aW9uKTsKLQotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERvbWFpbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19OQU1FOgotCQkJVG5nVXRpbC5yZWZyZXNoQ29udHJpYnV0b3JzKHRoaXMsIG5vdGlmaWNhdGlvbiwgZmFsc2UsIHRydWUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJaWYgKGNoaWxkcmVuIGluc3RhbmNlb2YgTGlzdCkKLQkJCUNvbGxlY3Rpb25zLnNvcnQoKExpc3QpIGNoaWxkcmVuLCBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFCi0JCQkJCS5nZXRDb21wYXJhdG9yKCkpOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlpZiAoIWlzV3JhcHBpbmdOZWVkZWQob2JqZWN0KSkKLQkJCXJldHVybiB2YWx1ZTsKLQkJcmV0dXJuIFRuZ1V0aWwuY3JlYXRlV3JhcHBlcihhZGFwdGVyRmFjdG9yeSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQlpbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gY3JlYXRlV3JhcHBlcnMoQ29sbGVjdGlvbiBvYmplY3RzKSB7Ci0JCWlmICh3cmFwcGVycyA9PSBudWxsKSB7Ci0JCQl3cmFwcGVycyA9IG5ldyBEaXNwb3NhYmxlKCk7Ci0JCX0KLQkJRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlci5maWxsKHdyYXBwZXJzLCBudWxsLCBvYmplY3RzLCB0aGlzLAotCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KHdyYXBwZXJzKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoTm90aWZpY2F0aW9uIG1zZykgewotCQlJRGVmYXVsdE5hbWVTZXR0ZXIgZGVmYXVsdE5hbWVTZXR0ZXIgPSB0aGlzOwotCQlpZiAoZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgIT0gbnVsbCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoZGVmYXVsdE5hbWVTZXR0ZXIKLQkJCQkJLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpKTsKLQkJCWlmIChmZWF0dXJlSWQgPT0gZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpKSB7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCXNldERlZmF1bHROYW1lKG1zZy5nZXROZXdWYWx1ZSgpLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCXNldERlZmF1bHROYW1lKGl0ZXIubmV4dCgpLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmosIE9iamVjdCBwYXJlbnQpIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRE9NQUlOOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoRG9tYWluKSBwYXJlbnQpCi0JCQkJCS5nZXRTdWJkb21haW5zKCksIChNZXRob2RFbGVtZW50KSBvYmosIGJhc2VOYW1lKTsKLQkJfQotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRE9NQUlOOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoRG9tYWluKSB0YXJnZXQpLmdldFN1YmRvbWFpbnMoKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwgYmFzZU5hbWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTlM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gRG9tYWluLmNsYXNzOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlDb2xsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJCXNlbGVjdGlvbi5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSU1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRG9tYWluc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Eb21haW5zSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzOTgzZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Eb21haW5zSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiRG9tYWlucyIgZm9sZGVyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21haW5zSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERvbWFpbnNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSB0YXJnZXQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0YXJnZXQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRG9tYWluKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBEb21haW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0RvbWFpbnMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoVG5nVXRpbC5leHRyYWN0KCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCBEb21haW4uY2xhc3MpLCAoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRE9NQUlOKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Sb2xlU2V0Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvUm9sZVNldENhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MzA2MjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Sb2xlU2V0Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LkVNRkVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSByb2xlIHNldCBncm91cGluZy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlbmFtZWQgYXMgUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldENhdGVnb3J5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Sb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRGVmYXVsdE5hbWVTZXR0ZXIsIElMaWJyYXJ5SXRlbVByb3ZpZGVyLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBEaXNwb3NhYmxlIGNoaWxkcmVuOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVNldENhdGVnb3J5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVJvbGVTZXQoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIG9iamVjdCk7Ci0JCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCQlTdHJpbmdbXSBwYXRoID0gewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQksCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSwKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJfTsKLQotCQkJCXJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKTsKLQkJCX0KLQkJfQotCi0JCS8vIE1ldGhvZE1vZGVsSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChNZXRob2RNb2RlbEl0ZW1Qcm92aWRlcikKLQkJLy8gVG5nVXRpbC5nZXRBZGFwdGVyKChFT2JqZWN0KW1vZGVsLCBNZXRob2RNb2RlbEl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCS8vIGlmKGl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCS8vIHJldHVybiBpdGVtUHJvdmlkZXIuZ2V0Um9sZVNldHMoKTsKLQkJLy8gfQotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZC5IZWxwZXIjZ2V0Q3JlYXRlQ2hpbGRJbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSAmJiBjaGlsZCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVSZWZlcmVuY2UgcmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIGZlYXR1cmU7Ci0JCQlFQ2xhc3MgcGFyZW50Q2xhc3MgPSByZWZlcmVuY2UuZ2V0RUNvbnRhaW5pbmdDbGFzcygpOwotCQkJRUNsYXNzIGNoaWxkQ2xhc3MgPSAoKEVPYmplY3QpIGNoaWxkKS5lQ2xhc3MoKTsKLQkJCVN0cmluZyBuYW1lID0gImZ1bGwvY3Rvb2wxNi9DcmVhdGUiICsgcGFyZW50Q2xhc3MuZ2V0TmFtZSgpICsgIl8iICsgcmVmZXJlbmNlLmdldE5hbWUoKSArICJfIiArIGNoaWxkQ2xhc3MuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UobmFtZSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gRU1GRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9jdG9vbDE2L0NyZWF0ZUNoaWxkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0KLQkJLy8gU3RyaW5nIGxhYmVsID0gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsCi0JCS8vIGdldFN0cmluZygiX1VJX1JvbGVTZXRHcm91cGluZ190eXBlIikpOwotCQkvLyBDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ29udGVudENhdGVnb3J5KSBvYmplY3Q7Ci0JCS8vIGlmKGNhdGVnb3J5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCS8vIE1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luID0KLQkJLy8gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0ZWdvcnkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJLy8gaWYoYmFzZVBsdWdpbiAhPSBudWxsKSB7Ci0JCS8vIGxhYmVsID0gbGFiZWwgKyAiIChpbmhlcml0ZWQgZnJvbSAiICsgYmFzZVBsdWdpbi5nZXROYW1lKCkgKyAnKSc7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyByZXR1cm4gbGFiZWw7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlU2V0R3JvdXBpbmdfdHlwZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JLy8gcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2hpbGRyZW4oTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCS8vIEVPYmplY3Qgb2JqZWN0ID0gKEVPYmplY3Qpbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JLy8gQ2hpbGRyZW5TdG9yZSBjaGlsZHJlblN0b3JlID0gZ2V0Q2hpbGRyZW5TdG9yZShvYmplY3QpOwotCS8vCQkKLQkvLyBpZiAoY2hpbGRyZW5TdG9yZSAhPSBudWxsKQotCS8vIHsKLQkvLyBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9Ci0JLy8gKEVTdHJ1Y3R1cmFsRmVhdHVyZSlub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpOwotCS8vIEVMaXN0IGNoaWxkcmVuID0gY2hpbGRyZW5TdG9yZS5nZXRMaXN0KGZlYXR1cmUpOwotCS8vIGlmIChjaGlsZHJlbiAhPSBudWxsKQotCS8vIHsKLQkvLyBpbnQgaW5kZXggPSBub3RpZmljYXRpb24uZ2V0UG9zaXRpb24oKTsKLQkvLwkJCQkKLQkvLyBzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkKLQkvLyB7Ci0JLy8gY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCS8vIHsKLQkvLyBFTGlzdCB2YWx1ZXMgPSAoRUxpc3Qpb2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JLy8JCQkJCQkKLQkvLyBpZiAodmFsdWVzLnNpemUoKSA9PSAwKQotCS8vIHsKLQkvLyBkaXNwb3NlV3JhcHBlcnMoY2hpbGRyZW4pOwotCS8vIHJldHVybjsKLQkvLyB9Ci0JLy8gYnJlYWs7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vCQkKLQkvLyBzdXBlci51cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Sb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCS8vVG5nVXRpbC5zZXREZWZhdWx0TmFtZSh0aGlzLCBub3RpZmljYXRpb24pOwotCQlzZXREZWZhdWx0TmFtZShub3RpZmljYXRpb24pOwotCQkKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlDb250ZW50UGFja2FnZSBwa2c7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSb2xlU2V0R3JvdXBpbmcuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTOgotCi0JCQlwa2cgPSAoQ29udGVudFBhY2thZ2UpICgoRU9iamVjdCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpCi0JCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQlSb2xlU2V0IHJvbGVTZXQ7Ci0JCQlib29sZWFuIHJlZnJlc2hQYXJlbnQgPSBmYWxzZTsKLQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJcm9sZVNldCA9IChSb2xlU2V0KSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQlpZiAocm9sZVNldC5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQlwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKHJvbGVTZXQpOwotCQkJCX0gZWxzZSBpZiAocm9sZVNldC5lQ29udGFpbmVyKCkgPT0gcGtnKSB7Ci0JCQkJCXJlZnJlc2hQYXJlbnQgPSB0cnVlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCXJvbGVTZXQgPSAoUm9sZVNldCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChyb2xlU2V0LmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQlwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKHJvbGVTZXQpOwotCQkJCQl9IGVsc2UgaWYgKHJvbGVTZXQuZUNvbnRhaW5lcigpID09IHBrZykgewotCQkJCQkJcmVmcmVzaFBhcmVudCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQlyZWZyZXNoUGFyZW50ID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlpZiAocmVmcmVzaFBhcmVudCkgewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJZ2V0UGFyZW50KHRhcmdldCksIHRydWUsIGZhbHNlKSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIFJvbGVTZXQgY2hpbGQgPSAoUm9sZVNldCkgaXRlci5uZXh0KCk7Ci0JCS8vIFJvbGVTZXRJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKFJvbGVTZXRJdGVtUHJvdmlkZXIpCi0JCS8vIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGNoaWxkLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyBpdGVtUHJvdmlkZXIuc2V0UGFyZW50KG9iamVjdCk7Ci0JCS8vIH0KLQkJaWYgKGNoaWxkcmVuIGluc3RhbmNlb2YgTGlzdCkKLQkJCUNvbGxlY3Rpb25zLnNvcnQoKExpc3QpIGNoaWxkcmVuLCBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQotCQkvLyByZXR1cm4gY3JlYXRlV3JhcHBlcnMoY2hpbGRyZW4pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1dyYXBwaW5nTmVlZGVkKG9iamVjdCkpCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCXJldHVybiBUbmdVdGlsLmNyZWF0ZVdyYXBwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsCi0JCQkJaW5kZXgpOwotCX0KLQotCS8vIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gT2JqZWN0IHdyYXBwZXIgPSBUbmdVdGlsLmNyZWF0ZVdyYXBwZXIoYWRhcHRlckZhY3RvcnksIChFT2JqZWN0KSB0YXJnZXQsCi0JLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCksIG9iamVjdCwgLTEpOwotCS8vIGlmKHdyYXBwZXJzID09IG51bGwpIHsKLQkvLyB3cmFwcGVycyA9IG5ldyBEaXNwb3NhYmxlKCk7Ci0JLy8gfQotCS8vIHdyYXBwZXJzLmFkZCh3cmFwcGVyKTsKLQkvLyByZXR1cm4gd3JhcHBlcjsKLQkvLyB9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjcmVhdGVXcmFwcGVycyhDb2xsZWN0aW9uIG9iamVjdHMpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IERpc3Bvc2FibGUoKTsKLQkJfQotCQlGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyLmZpbGwoY2hpbGRyZW4sIG51bGwsIG9iamVjdHMsIHRhcmdldCwKLQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChjaGlsZHJlbik7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbi5kaXNwb3NlKCk7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJSURlZmF1bHROYW1lU2V0dGVyIGRlZmF1bHROYW1lU2V0dGVyID0gdGhpczsKLQkJaWYgKGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpICE9IG51bGwpIHsKLQkJCWludCBmZWF0dXJlSWQgPSBtc2cuZ2V0RmVhdHVyZUlEKGRlZmF1bHROYW1lU2V0dGVyCi0JCQkJCS5nZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSk7Ci0JCQlpZiAoZmVhdHVyZUlkID09IGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSkgewotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlzZXREZWZhdWx0TmFtZShtc2cuZ2V0TmV3VmFsdWUoKSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlzZXREZWZhdWx0TmFtZShpdGVyLm5leHQoKSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqLCBPYmplY3QgcGFyZW50KSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ST0xFX1NFVDsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJLy8gTWFraW5nIHBsdWdpbiBsZXZlbCB1bmlxdWVuZXNzIG9mIHJvbGVzZXQsIG9uIHJlbW92aW5nIHJvbGVzZXQgcmVmZXJlbmNlIAotCQkJLy8gZnJvbSByb2xlc2V0IGdyb3VwaW5nLCByb2xlc2V0IGdvZXMgYmFjayB0byB0b3BsZXZlbCBjYXVzaW5nIGR1cGxpY2F0ZS4gCi0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKFRuZ1V0aWwuZXh0cmFjdCgKLQkJCQkJKChDb250ZW50UGFja2FnZSkgKCgoUm9sZVNldEdyb3VwaW5nKSBwYXJlbnQpCi0JCQkJCQkJLmVDb250YWluZXIoKSkpLmdldENvbnRlbnRFbGVtZW50cygpLAotCQkJCQkJCVJvbGVTZXQuY2xhc3MpLCAoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfUk9MRV9TRVQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ST0xFX1NFVDsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKFJvbGVTZXRHcm91cGluZykgdGFyZ2V0KS5nZXRSb2xlU2V0cygpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gUm9sZVNldEdyb3VwaW5nLmNsYXNzOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKChBZGRDb21tYW5kKSBzdXBlci5jcmVhdGVBZGRDb21tYW5kKAotCQkJCWRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlciNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Sb2xlU2V0SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1JvbGVTZXRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZmNGIxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1JvbGVTZXRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcm9sZSBzZXQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlJvbGVTZXRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJTGlicmFyeUl0ZW1Qcm92aWRlciwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJvbGVTZXRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Sb2xlU2V0SXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIG9iamVjdCk7Ci0JCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCQlTdHJpbmdbXSBwYXRoID0gewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQksCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSwKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJfTsKLQotCQkJCXJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQkvLyBpZihjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJLy8gY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpKTsKLQkJLy8gfQotCQkvLyByZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJvbGVTZXQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTkFNRToKLQkJCVRuZ1V0aWwucmVmcmVzaENvbnRyaWJ1dG9ycyh0aGlzLCBub3RpZmljYXRpb24sIGZhbHNlLCB0cnVlKTsKLQkJCWJyZWFrOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEVTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQotCQkJLy8gcmVmcmVzaCB3cmFwcGVycwotCQkJLy8KLQkJCWlmICh3cmFwcGVycyAhPSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdCh3cmFwcGVycykuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIGl0ZXIKLQkJCQkJCQkubmV4dCgpLCB0cnVlLCBmYWxzZSkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gcmVmcmVzaCB1bmNhdGVnb3JpemVkIHJvbGVzCi0JCQkvLwotCQkJLy8gVG5nVXRpbC5yZWZyZXNoQWRhcHRlcihMaWJyYXJ5RWRpdENvbnN0YW50cy5VTkNBVEVHT1JJWkVEX1JPTEVTX1BBVEgsCi0JCQkvLyBub3RpZmljYXRpb24pOwotCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbCgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QsCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZVNldF90eXBlIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlpZiAoIWlzV3JhcHBpbmdOZWVkZWQob2JqZWN0KSkKLQkJCXJldHVybiB2YWx1ZTsKLQkJcmV0dXJuIFRuZ1V0aWwuY3JlYXRlV3JhcHBlcihhZGFwdGVyRmFjdG9yeSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQlpbmRleCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Tm90aWZ5Q2hhbmdlZExpc3RlbmVycygpIHsKLQkJaWYoY2hhbmdlTm90aWZpZXIgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgoQ29sbGVjdGlvbikgY2hhbmdlTm90aWZpZXIpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCQotCS8vIENoYW5nZSBDYXRlZ29yaWVzIGRpc3BsYXkgaW4gTGlicmFyeSBOYXZpZ2F0b3IKLQkvLyBBZGQgYmVsb3cgbWV0aG9kIHRvIGF2b2lkIGNoaWxkcmVuIGZvciB0aGlzIEl0ZW1Qcm92aWRlci4gKwotCS8vIHNpZ24gdG9vLgotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JLy8gKi8KLQkvLyBwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gTGlzdCBuZXdDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBSb2xlU2V0IHJvbGVTZXQgPSAoUm9sZVNldCkgb2JqZWN0OwotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHJvbGVTZXQuZ2V0Um9sZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBSb2xlIHJvbGUgPSAoUm9sZSkgaXRlci5uZXh0KCk7Ci0JLy8gLy8gbG9vayBpZiB0aGVyZSBpcyBhbiBleGlzdGluZyBPYmplY3RMaW5rSXRlbVByb3ZpZGVyIGZvciB0aGlzIHRhc2sgaW4KLQkvLyB0aGUgY3VycmVudCBjaGlsZHJlbiBsaXN0IGZpcnN0Ci0JLy8gLy8KLQkvLyBPYmplY3RMaW5rSXRlbVByb3ZpZGVyIGNoaWxkID0gZmluZEV4aXN0aW5nT2JqZWN0TGlua0l0ZW1Qcm92aWRlcihyb2xlKTsKLQkvLyBpZihjaGlsZCA9PSBudWxsKSB7Ci0JLy8gY2hpbGQgPSBuZXcgT2JqZWN0TGlua0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgb2JqZWN0LCByb2xlKTsKLQkvLyB9Ci0JLy8gZWxzZSB7Ci0JLy8gY2hpbGRyZW4ucmVtb3ZlKGNoaWxkKTsKLQkvLyB9Ci0JLy8gbmV3Q2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkvLyB9Ci0JLy8gLy8gZGlzcG9zZSB0aGUgb2xkIGNoaWxkcmVuCi0JLy8gLy8KLQkvLyBpZihjaGlsZHJlbiAhPSBudWxsKSB7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gT2JqZWN0TGlua0l0ZW1Qcm92aWRlciBjaGlsZCA9IChPYmplY3RMaW5rSXRlbVByb3ZpZGVyKSBpdGVyLm5leHQoKTsKLQkvLyBjaGlsZC5kaXNwb3NlKCk7Ci0JLy8gfQotCS8vIH0KLQkvLyBjaGlsZHJlbiA9IG5ld0NoaWxkcmVuOwotCS8vIHJldHVybiBjaGlsZHJlbjsKLQkvLyB9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJLy8gcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkKLQkJLy8gc3VwZXIuY3JlYXRlQWRkQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvUm9sZVNldHNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvUm9sZVNldHNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwOGUwNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1JvbGVTZXRzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJSb2xlIFNldHMiIGZvbGRlci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldHNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBUcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVNldHNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSB0YXJnZXQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0YXJnZXQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyI2lzSW5oZXJpdGVkKG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5oZXJpdGVkKENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSkgewotCQlyZXR1cm4gKGNhdGVnb3J5IGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nIHx8IGNhdGVnb3J5IGluc3RhbmNlb2YgUm9sZVNldCkKLQkJCQkmJiBjYXRlZ29yeS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVJvbGVTZXRHcm91cGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVJvbGVTZXQoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoIXN1cGVyLmFjY2VwdEFzQ2hpbGQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGFjY2VwdChvYmopOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJTGlzdCBncm91cHMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRSb2xlU2V0R3JvdXBzKChSb2xlU2V0KSBvYmopOwotCQkJaWYgKGdyb3Vwcy5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChPYmplY3QgZ3JvdXAgOiBncm91cHMpIHsKLQkJCQkJaWYgKGdyb3VwIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKSB7Ci0JCQkJCQlpZiAoVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKFJvbGVTZXRHcm91cGluZylncm91cCkgPT0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKFJvbGVTZXQpb2JqKSkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Sb2xlcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShUbmdVdGlsLmV4dHJhY3QoKChDb250ZW50UGFja2FnZSkgdGFyZ2V0KQotCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRzKCksIFJvbGVTZXRHcm91cGluZy5jbGFzcyksCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmosCi0JCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ST0xFX1NFVF9HUk9VUElORyk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShUbmdVdGlsLmV4dHJhY3QoKChDb250ZW50UGFja2FnZSkgdGFyZ2V0KQotCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRzKCksIFJvbGVTZXQuY2xhc3MpLCAoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfUk9MRV9TRVQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1N0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9TdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmZjUzMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1N0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJTdGFuZGFyZCBDYXRlZ29yaWVzIiBmb2xkZXIuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciBleHRlbmRzIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUdyb3VwQ29udGFpbmVyIHsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGNoaWxkcmVuOwotCi0JcHJpdmF0ZSBNYXAgZ3JvdXBJdGVtUHJvdmlkZXJNYXA7Ci0KLQlwdWJsaWMgU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTm90aWZpZXIgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgcGFyZW50LCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJLy8gKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCS8vIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSwKLQkJLy8gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudFBhY2thZ2UoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9TdGFuZGFyZENhdGVnb3JpZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKG1zZy5nZXROb3RpZmllcigpID09IHRhcmdldCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoQ29udGVudFBhY2thZ2UuY2xhc3MpOwotCQkJaWYgKGZlYXR1cmVJZCA9PSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVMpIHsKLQkJCQlib29sZWFuIG5vdGlmeSA9IGZhbHNlOwotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLk1PVkU6Ci0JCQkJCU9iamVjdCBvYmogPSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJbm90aWZ5ID0gYWNjZXB0QXNDaGlsZChvYmopOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCW9iaiA9IG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWZvcl9jaGVjazogZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCWlmIChhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZm9yX2NoZWNrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQljb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlmb3JfY2hlY2s6IGZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlpZiAoYWNjZXB0QXNDaGlsZChpdGVyLm5leHQoKSkpIHsKLQkJCQkJCQlub3RpZnkgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGZvcl9jaGVjazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCX0KLQkJCQlpZiAobm90aWZ5KSB7Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obXNnLCB0aGlzLCB0cnVlLAotCQkJCQkJCWZhbHNlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQkvLyBpZihvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkvLyBUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoQ29udGVudFBhY2thZ2UpdGFyZ2V0KS5nZXRDaGlsZFBhY2thZ2VzKCksCi0JCS8vIChNZXRob2RFbGVtZW50KSBvYmosICJOZXcgQ29udGVudCBQYWNrYWdlIik7Ci0JCS8vIH0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIENvbnRlbnRQYWNrYWdlLmNsYXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCVN0cmluZyBuYW1lOwotCQkJSUxpYnJhcnlJdGVtUHJvdmlkZXIgY2hpbGQ7Ci0KLQkJCS8vIGNyZWF0ZSB0aGUgZGlzY2lwbGluZXMgY2F0ZWdvcmllcyBmb2xkZXIKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsCi0JCQkJCS5nZXRNZXRob2RQbHVnaW4oKEVsZW1lbnQpICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgb2JqZWN0KQotCQkJCQkJCS5nZXRUYXJnZXQoKSk7Ci0JCQlDb250ZW50UGFja2FnZSBjb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0JCQlpZiAoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNoaWxkID0gbmV3IERpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQkJY29udGVudFBrZywgbmFtZSk7Ci0JCQkJY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJfQotCi0JCQkvLyBjcmVhdGUgZG9tYWluIGNhdGVnb3JpZXMgZm9sZGVyCi0JCQljb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGgpOwotCQkJaWYgKGNvbnRlbnRQa2cgIT0gbnVsbCkgewotCQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNoaWxkID0gbmV3IERvbWFpbnNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2csCi0JCQkJCQluYW1lKTsKLQkJCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJfQotCi0JCQkvLyBjcmVhdGUgd29yayBwcm9kdWN0IHR5cGVzIGZvbGRlcgotCQkJY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoKTsKLQkJCWlmIChjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljaGlsZCA9IG5ldyBXb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQkJY29udGVudFBrZywgbmFtZSk7Ci0JCQkJY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJCX0KLQotCQkJLy8gY3JlYXRlIHJvbGUgc2V0IGZvbGRlcgotCQkJY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aCk7Ci0JCQlpZiAoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljaGlsZCA9IG5ldyBSb2xlU2V0c0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZywKLQkJCQkJCW5hbWUpOwotCQkJCWNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0JCQl9Ci0KLQkJCS8vIGNyZWF0ZSB0b29sIGZvbGRlcgotCQkJY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCk7Ci0JCQlpZiAoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Rvb2xzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljaGlsZCA9IG5ldyBUb29sc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZywgbmFtZSk7Ci0JCQkJY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lciNnZXRHcm91cEl0ZW1Qcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0R3JvdXBJdGVtUHJvdmlkZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdyb3VwSXRlbVByb3ZpZGVyTWFwLmdldChuYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvVG9vbEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Ub29sSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNTk2YjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Ub29sSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGEgdG9vbC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVG9vbEl0ZW1Qcm92aWRlciBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVG9vbEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElMaWJyYXJ5SXRlbVByb3ZpZGVyLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVG9vbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgb2JqZWN0KTsKLQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCVN0cmluZ1tdIHBhdGggPSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSwKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVG9vbHNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJfTsKLQotCQkJCXJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbF9Ub29sTWVudG9ycygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaXNjaXBsaW5lLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCQlUbmdVdGlsLnJlZnJlc2hDb250cmlidXRvcnModGhpcywgbm90aWZpY2F0aW9uLCBmYWxzZSwgdHJ1ZSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLQkJCQlnZXRTdHJpbmcoIl9VSV9Ub29sX3R5cGUiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCWlmICghaXNXcmFwcGluZ05lZWRlZChvYmplY3QpKQotCQkJcmV0dXJuIHZhbHVlOwotCQlyZXR1cm4gVG5nVXRpbC5jcmVhdGVXcmFwcGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlLAotCQkJCWluZGV4KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1Rvb2xzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1Rvb2xzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNjM0ODEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Ub29sc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJUb29scyIgZm9sZGVyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sc0l0ZW1Qcm92aWRlciBleHRlbmRzIFRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUb29sc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbnRlbnRQYWNrYWdlIHRhcmdldCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRhcmdldCwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVUb29sKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBUb29sOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVG9vbHMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gVG9vbCBjaGlsZCA9IChUb29sKSBpdGVyLm5leHQoKTsKLQkJLy8gVG9vbEl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoVG9vbEl0ZW1Qcm92aWRlcikKLQkJLy8gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLmFkYXB0KGNoaWxkLAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyBpdGVtUHJvdmlkZXIuc2V0UGFyZW50KG9iamVjdCk7Ci0JCS8vIH0KLQotCQkvLyBDaGFuZ2UgQ2F0ZWdvcmllcyBkaXNwbGF5IGluIExpYnJhcnkgTmF2aWdhdG9yCi0JCS8vIChjb21tZW50ZWQgZm9yIHRoaXMgZGVmZWN0KQotCQkvLyBNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVsZW1lbnQpCi0JCS8vICgoSXRlbVByb3ZpZGVyQWRhcHRlcilvYmplY3QpLmdldFRhcmdldCgpKTsKLQkJLy8gQ29udGVudFBhY2thZ2UgY29yZUNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCS8vIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQkJLy8gVW5jYXRlZ29yaXplZFRvb2xNZW50b3JzSXRlbVByb3ZpZGVyIHVuY2F0ZWdvcml6ZWQgPSBuZXcKLQkJLy8gVW5jYXRlZ29yaXplZFRvb2xNZW50b3JzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb3JlQ29udGVudFBrZyk7Ci0JCS8vIGNoaWxkcmVuLmFkZCh1bmNhdGVnb3JpemVkKTsKLQkJLy8gaWYoZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPT0gbnVsbCkgewotCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCS8vIH0KLQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KHVuY2F0ZWdvcml6ZWQuZ2V0VGV4dChudWxsKSwgdW5jYXRlZ29yaXplZCk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgVG9vbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShUbmdVdGlsLmV4dHJhY3QoKChDb250ZW50UGFja2FnZSkgdGFyZ2V0KQotCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRzKCksIFRvb2wuY2xhc3MpLCAoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfVE9PTCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1RyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzcyODlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSBjYXRlZ29yeSBmb2xkZXJzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgcmVuYW1lZCBhcyBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJR3JvdXBDb250YWluZXIgewotCi0JcHJvdGVjdGVkIE1hcCBncm91cEl0ZW1Qcm92aWRlck1hcDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU5vdGlmaWVyIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHBhcmVudCwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlPYmplY3QgdW5jYXRlZ29yaXplZCA9IGNyZWF0ZVVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIoKTsKLQkJaWYgKHVuY2F0ZWdvcml6ZWQgIT0gbnVsbCkgewotCQkJY2hpbGRyZW4uYWRkKHVuY2F0ZWdvcml6ZWQpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKG1zZy5nZXROb3RpZmllcigpID09IHRhcmdldCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoQ29udGVudFBhY2thZ2UuY2xhc3MpOwotCQkJaWYgKGZlYXR1cmVJZCA9PSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUykgewotCQkJCWJvb2xlYW4gbm90aWZ5ID0gZmFsc2U7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uTU9WRToKLQkJCQkJT2JqZWN0IG9iaiA9IG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJb2JqID0gbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCW5vdGlmeSA9IGFjY2VwdEFzQ2hpbGQob2JqKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJZm9yX2NoZWNrOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJaWYgKGFjY2VwdEFzQ2hpbGQoaXRlci5uZXh0KCkpKSB7Ci0JCQkJCQkJbm90aWZ5ID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBmb3JfY2hlY2s7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWZvcl9jaGVjazogZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCWlmIChhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZm9yX2NoZWNrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAobm90aWZ5KSB7Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obXNnLCB0aGlzLCB0cnVlLAotCQkJCQkJCWZhbHNlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luaGVyaXRlZChDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQkJcmV0dXJuIGFjY2VwdEFzQ2hpbGQoY2F0ZWdvcnkpCi0JCQkJJiYgY2F0ZWdvcnkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldEludGVyZXN0ZWRGZWF0dXJlQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBDb250ZW50UGFja2FnZS5jbGFzczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lciNnZXRHcm91cEl0ZW1Qcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0R3JvdXBJdGVtUHJvdmlkZXIoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGdyb3VwSXRlbVByb3ZpZGVyTWFwID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdyb3VwSXRlbVByb3ZpZGVyTWFwLmdldChuYW1lKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1dvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Xb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYwZWNhNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1dvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHdvcmsgcHJvZHVjdCBraW5kLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgcmVuYW1lZCBhcyBXb3JrUHJvZHVjdEtpbmRJdGVtUHJvdmlkZXIgaW4gRVBGIE01LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLldvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlMaWJyYXJ5SXRlbVByb3ZpZGVyLCBJV3JhcHBlciwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgb2JqZWN0KTsKLQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCVN0cmluZ1tdIHBhdGggPSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSwKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJfTsKLQotCQkJCXJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGlzY2lwbGluZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19OQU1FOgotCQkJVG5nVXRpbC5yZWZyZXNoQ29udHJpYnV0b3JzKHRoaXMsIG5vdGlmaWNhdGlvbiwgZmFsc2UsIHRydWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbCgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QsCi0JCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlX3R5cGUiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCWlmICghaXNXcmFwcGluZ05lZWRlZChvYmplY3QpKQotCQkJcmV0dXJuIHZhbHVlOwotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJcmV0dXJuIG5ldyBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKGZlYXR1cmUsIHZhbHVlLCBvYmplY3QsCi0JCQkJCWFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gVG5nVXRpbC5jcmVhdGVXcmFwcGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlLAotCQkJCWluZGV4KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIENoYW5nZSBDYXRlZ29yaWVzIGRpc3BsYXkgaW4gTGlicmFyeSBOYXZpZ2F0b3IKLQkJLy8gcmV0dXJuICEoKFdvcmtQcm9kdWN0VHlwZSkgb2JqZWN0KS5nZXRXb3JrUHJvZHVjdHMoKS5pc0VtcHR5KCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI3dyYXAob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIE9iamVjdCB3cmFwKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBzdXBlci53cmFwKG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsIGluZGV4KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Xb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMGRlMjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Xb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiV29yayBQcm9kdWN0IEtpbmRzIiBmb2xkZXIuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSByZW5hbWVkIGFzIFdvcmtQcm9kdWN0S2luZHNJdGVtUHJvdmlkZXIgaW4gRVBGIE01LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSB0YXJnZXQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0YXJnZXQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdHMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCi0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBXb3JrUHJvZHVjdFR5cGUgY2hpbGQgPSAoV29ya1Byb2R1Y3RUeXBlKSBpdGVyLm5leHQoKTsKLQkJLy8gV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9Ci0JCS8vIChXb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIpCi0JCS8vIFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KS5hZGFwdChjaGlsZCwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gaXRlbVByb3ZpZGVyLnNldFBhcmVudChvYmplY3QpOwotCQkvLyB9Ci0KLQkJLy8gQ2hhbmdlIENhdGVnb3JpZXMgZGlzcGxheSBpbiBMaWJyYXJ5IE5hdmlnYXRvcgotCQkvLyAoY29tbWVudGVkIGZvciB0aGlzIGRlZmVjdCkKLQkJLy8gTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFbGVtZW50KQotCQkvLyAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpb2JqZWN0KS5nZXRUYXJnZXQoKSk7Ci0JCS8vIENvbnRlbnRQYWNrYWdlIGNvcmVDb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkvLyBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0JCS8vIFdvcmtQcm9kdWN0VHlwZVVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlciB1bmNhdGVnb3JpemVkID0KLQkJLy8gbmV3Ci0JCS8vIFdvcmtQcm9kdWN0VHlwZVVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJLy8gY29yZUNvbnRlbnRQa2cpOwotCQkvLyBjaGlsZHJlbi5hZGQodW5jYXRlZ29yaXplZCk7Ci0JCS8vIGlmKGdyb3VwSXRlbVByb3ZpZGVyTWFwID09IG51bGwpIHsKLQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkvLyB9Ci0JCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dCh1bmNhdGVnb3JpemVkLmdldFRleHQobnVsbCksIHVuY2F0ZWdvcml6ZWQpOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShUbmdVdGlsLmV4dHJhY3QoKChDb250ZW50UGFja2FnZSkgdGFyZ2V0KQotCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRzKCksIFdvcmtQcm9kdWN0VHlwZS5jbGFzcyksCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmosCi0JCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19XT1JLX1BST0RVQ1RfVFlQRSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNzZiMmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBkaXNwbGF5IGFuZCBlZGl0aW5nIHN1cHBvcnQgZm9yIHN0YW5kYXJkIGFuZCBjdXN0b20gY2F0ZWdvcmllcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQWN0aW9uTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0FjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBhMzc5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5TZXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBleGVjdXRpb24gb2YgZWRpdGluZyBjb21tYW5kcyB3aXRoIGZ1bGwgc3VwcG9ydCBmb3IgZGlydHkgZmxhZywKLSAqIHVuZG8gYW5kIHJlZG8uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25NYW5hZ2VyIGltcGxlbWVudHMgSUFjdGlvbk1hbmFnZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBNYXAgUkVTT1VSQ0VfVE9fTU9ESUZJRVJTX01BUCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKLQotCXByaXZhdGUgRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjazsKLQotCXB1YmxpYyBBY3Rpb25NYW5hZ2VyKCkgewotCQljb21tYW5kU3RhY2sgPSBjcmVhdGVDb21tYW5kU3RhY2soKTsKLQkJZWRpdGluZ0RvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJCQljb21tYW5kU3RhY2spOwotCX0KLQotCXByb3RlY3RlZCBGdWxseVJldmVydGlibGVDb21tYW5kU3RhY2sgY3JlYXRlQ29tbWFuZFN0YWNrKCkgewotCQlyZXR1cm4gbmV3IEZ1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjayh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckFzTW9kaWZpZXJPZihFT2JqZWN0IG9iamVjdCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG9iamVjdC5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXJlZ2lzdGVyQXNNb2RpZmllck9mKHJlc291cmNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckFzTW9kaWZpZXJPZihSZXNvdXJjZSByZXNvdXJjZSkgewotCQlzeW5jaHJvbml6ZWQgKFJFU09VUkNFX1RPX01PRElGSUVSU19NQVApIHsKLQkJCVNldCBtb2RzID0gKFNldCkgUkVTT1VSQ0VfVE9fTU9ESUZJRVJTX01BUC5nZXQocmVzb3VyY2UpOwotCQkJaWYgKG1vZHMgPT0gbnVsbCkgewotCQkJCW1vZHMgPSBuZXcgSGFzaFNldCgpOwotCQkJCVJFU09VUkNFX1RPX01PRElGSUVSU19NQVAucHV0KHJlc291cmNlLCBtb2RzKTsKLQkJCX0KLQkJCW1vZHMuYWRkKHRoaXMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdW5yZWdpc3RlckFzTW9kaWZpZXIoKSB7Ci0JCXN5bmNocm9uaXplZCAoUkVTT1VSQ0VfVE9fTU9ESUZJRVJTX01BUCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCVNldCBtb2RzID0gKFNldCkgUkVTT1VSQ0VfVE9fTU9ESUZJRVJTX01BUC5nZXQocmVzb3VyY2UpOwotCQkJCWlmIChtb2RzICE9IG51bGwpIHsKLQkJCQkJbW9kcy5yZW1vdmUodGhpcyk7Ci0JCQkJCWlmIChtb2RzLmlzRW1wdHkoKSkgewotCQkJCQkJLy8gc2F2ZSB0aGUgcmVzb3VyY2UgYmVmb3JlIGl0IHJlbW92ZWQgZnJvbQotCQkJCQkJLy8gUkVTT1VSQ0VfVE9fTU9ESUZJRVJTX01BUAotCQkJCQkJLy8gCi0JCQkJCQlzYXZlKHJlc291cmNlKTsKLQkJCQkJCVJFU09VUkNFX1RPX01PRElGSUVSU19NQVAucmVtb3ZlKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGRvQWN0aW9uKGludCBhY3Rpb25UeXBlLCBFT2JqZWN0IG9iamVjdCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlDb21tYW5kIGNtZCA9IG51bGw7Ci0JCU9iamVjdCBvbGRWYWx1ZSA9IG51bGw7Ci0JCXN3aXRjaCAoYWN0aW9uVHlwZSkgewotCQljYXNlIEFERDogewotCQkJaWYgKGluZGV4ID49IDApIHsKLQkJCQljbWQgPSBuZXcgQWRkQ29tbWFuZChlZGl0aW5nRG9tYWluLCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlLAotCQkJCQkJaW5kZXgpOwotCQkJfSBlbHNlIHsKLQkJCQljbWQgPSBuZXcgQWRkQ29tbWFuZChlZGl0aW5nRG9tYWluLCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgQUREX01BTlk6IHsKLQkJCWlmIChpbmRleCA+PSAwKSB7Ci0JCQkJY21kID0gbmV3IEFkZENvbW1hbmQoZWRpdGluZ0RvbWFpbiwgb2JqZWN0LCBmZWF0dXJlLAotCQkJCQkJKENvbGxlY3Rpb24pIHZhbHVlLCBpbmRleCk7Ci0JCQl9IGVsc2UgewotCQkJCWNtZCA9IG5ldyBBZGRDb21tYW5kKGVkaXRpbmdEb21haW4sIG9iamVjdCwgZmVhdHVyZSwKLQkJCQkJCShDb2xsZWN0aW9uKSB2YWx1ZSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFJFTU9WRTogewotCQkJY21kID0gbmV3IFJlbW92ZUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFJFTU9WRV9NQU5ZOiB7Ci0JCQljbWQgPSBuZXcgUmVtb3ZlQ29tbWFuZChlZGl0aW5nRG9tYWluLCBvYmplY3QsIGZlYXR1cmUsCi0JCQkJCShDb2xsZWN0aW9uKSB2YWx1ZSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNFVDogewotCQkJb2xkVmFsdWUgPSBvYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCWlmICgob2xkVmFsdWUgIT0gbnVsbCAmJiAhb2xkVmFsdWUuZXF1YWxzKHZhbHVlKSkKLQkJCQkJfHwgKG9sZFZhbHVlID09IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkpIHsKLQkJCQljbWQgPSBuZXcgU2V0Q29tbWFuZChlZGl0aW5nRG9tYWluLCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCX0KLQkJaWYgKGNtZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29tbWFuZFN0YWNrLmRvRXhlY3V0ZShjbWQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQljb21tYW5kU3RhY2sudW5kbygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWNvbW1hbmRTdGFjay5yZWRvKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdW5kb0FsbCgpIHsKLQkJYm9vbGVhbiBiID0gY29tbWFuZFN0YWNrLnVuZG9BbGwoKTsKLQkJdW5yZWdpc3RlckFzTW9kaWZpZXIoKTsKLQkJLy8gZmlyZU5vdGlmeUNoYW5nZWQobnVsbCk7Ci0JCXJldHVybiBiOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVJc0RvbmUoKSB7Ci0JCWNvbW1hbmRTdGFjay5zYXZlSXNEb25lKCk7Ci0JCXVucmVnaXN0ZXJBc01vZGlmaWVyKCk7Ci0JCS8vIGZpcmVOb3RpZnlDaGFuZ2VkKG51bGwpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2F2ZU5lZWRlZCgpIHsKLQkJYm9vbGVhbiByZXQgPSBjb21tYW5kU3RhY2suaXNTYXZlTmVlZGVkKCk7Ci0JCWlmICghcmV0KQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJY29tbWFuZFN0YWNrLmZsdXNoKCk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCXN5bmNocm9uaXplZCAoUkVTT1VSQ0VfVE9fTU9ESUZJRVJTX01BUCkgewotCQkJQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQLmVudHJ5U2V0KCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCVNldCBtb2RzID0gKFNldCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAobW9kcy5jb250YWlucyh0aGlzKSkgewotCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoZW50cnkuZ2V0S2V5KCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQkJfQotCX0KLQotCS8vIHB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkvLyBjaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCS8vIH0KLQkvLwotCS8vIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JLy8gY2hhbmdlTm90aWZpZXIuYWRkKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JLy8gfQotCS8vCi0JLy8gcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpCi0JLy8gewotCS8vIGNoYW5nZU5vdGlmaWVyLnJlbW92ZShub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCS8vIH0KLQotCS8qKgotCSAqIERvZXMgbm90aGluZyBoZXJlLCBzdWJjbGFzcyBzaG91bGQgaW1wbGVtZW50IHRvIHByb3ZpZGUgc2F2aW5nIHRoZQotCSAqIHJlc291cmNlIGJlZm9yZSBpdCBnb3QgcmVtb3ZlZCBmcm9tIFJFU09VUkNFX1RPX01PRElGSUVSU19NQVAKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlKFJlc291cmNlIHJlc291cmNlKSB7Ci0JfQotCi0JcHVibGljIENvbW1hbmRTdGFjayBnZXRDb21tYW5kU3RhY2soKSB7Ci0JCXJldHVybiBjb21tYW5kU3RhY2s7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZShJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY21kKSB7Ci0JCWlmIChjbWQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbW1hbmRTdGFjay5kb0V4ZWN1dGUoY21kKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQWRkVG9DYXRlZ29yeUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9BZGRUb0NhdGVnb3J5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWI3NWIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9BZGRUb0NhdGVnb3J5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1pc2M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gYXNzaWduIGEgbWV0aG9kIGVsZW1lbnQgdG8gYSBjYXRlZ29yeS4gSWYgdGhlIGNhdGVnb3J5Ci0gKiBpcyBpbiBhIGJhc2UgbWV0aG9kIHBsdWctaW4gb2YgdGhlIGVsZW1lbnQsIHRoaXMgY29tbWFuZCB3aWxsIGF1dG9tYXRpY2FsbHkKLSAqIGNyZWF0ZSBhIGNvbnRyaWJ1dG9yIHRvIHRoZSBiYXNlIGNhdGVnb3J5IGFuZCBhc3NpZ24gdGhlIGVsZW1lbnQgdG8gdGhlCi0gKiBjb250cmlidXRpbmcgY2F0ZWdvcnkuIFRoaXMgaXMgYXZvaWRzIG1vZGlmeWluZyB0aGUgYmFzZSBtZXRob2QgcGx1Zy1pbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFkZFRvQ2F0ZWdvcnlDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgQ29udGVudENhdGVnb3J5IGNhdGVnb3J5OwotCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCi0JcHJpdmF0ZSBTdHJpbmdbXSBjYXRlZ29yeVBrZ1BhdGg7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tGb3JFeGlzdGluZ0NvbnRyaWJ1dG9yOwotCi0JcHJpdmF0ZSBDb250ZW50Q2F0ZWdvcnkgdXNlZENhdGVnb3J5ID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiBjcmVhdGVOZXdDb250cmlidXRvciA9IGZhbHNlOwotCi0JcHJpdmF0ZSBDb250ZW50UGFja2FnZSBjYXRlZ29yeVBrZzsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgT2JqZWN0IG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlOwotCQotCXByaXZhdGUgTGlzdCB1c2VkQ2F0ZWdvcmllczsKLQotCXB1YmxpYyBBZGRUb0NhdGVnb3J5Q29tbWFuZChDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnksCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJU3RyaW5nW10gY2F0ZWdvcnlQa2dQYXRoLCBib29sZWFuIGNoZWNrRm9yRXhpc3RpbmdDb250cmlidXRvciwKLQkJCUxpc3QgdXNlZENhdGVnb3JpZXMpIHsKLQkJdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLmNhdGVnb3J5UGtnUGF0aCA9IGNhdGVnb3J5UGtnUGF0aDsKLQkJdGhpcy5jaGVja0ZvckV4aXN0aW5nQ29udHJpYnV0b3IgPSBjaGVja0ZvckV4aXN0aW5nQ29udHJpYnV0b3I7Ci0JCXRoaXMudXNlZENhdGVnb3JpZXMgPSB1c2VkQ2F0ZWdvcmllczsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQkvLyBjaGVjayBpZiB0aGlzIG9wZXJhdGlvbiB3aWxsIG1vZGlmeSB0aGUgZWxlbWVudCBpbiBvcHBvc2l0ZSBmZWF0dXJlCi0JCS8vIHZhbHVlCi0JCS8vCi0JCXJldHVybiBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnlPcHBvc2l0ZShjYXRlZ29yeSwgZmVhdHVyZSwKLQkJCQllbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0TGFiZWwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiAiQWRkIFRvIENhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIGNyZWF0ZSBjb250cmlidXRvciBmb3IgY2F0ZWdvcnkgaWYgaXQgaXMgbm90IGluIHRoZSBzYW1lIHBsdWdpbiB3aXRoCi0JCS8vIHRoZSBlbGVtZW50Ci0JCS8vCi0JCU1ldGhvZFBsdWdpbiBlbGVtZW50UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JCU1ldGhvZFBsdWdpbiBjYXRlZ29yeVBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNhdGVnb3J5KTsKLQkJaWYgKGNhdGVnb3J5UGx1Z2luICE9IGVsZW1lbnRQbHVnaW4KLQkJCQkmJiBNaXNjLmlzQmFzZU9mKGNhdGVnb3J5UGx1Z2luLCBlbGVtZW50UGx1Z2luKSkgewotCQkJaWYgKGNhdGVnb3J5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJDb3VsZCBub3QgYWRkIGVsZW1lbnQgdG8gYW4gZXh0ZW5kZWQgY2F0ZWdvcnkgdGhhdCBpcyBpbiBhIGRpZmZlcmVudCBwbHVnLWluOiAiICsgY2F0ZWdvcnkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoIWZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCWNhdGVnb3J5UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoZWxlbWVudFBsdWdpbiwKLQkJCQkJY2F0ZWdvcnlQa2dQYXRoKTsKLQkJCUNvbnRlbnRDYXRlZ29yeSBjb250cmliID0gbnVsbDsKLQkJCWlmIChjaGVja0ZvckV4aXN0aW5nQ29udHJpYnV0b3IpIHsKLQkJCQkvLyBsb29rIGZvciB0aGUgZXhpc3RpbmcgY29udHJpYnV0b3IgZm9yIHRoZSBjYXRlZ29yeQotCQkJCS8vCi0JCQkJY29udHJpYiA9IFRuZ1V0aWwuZmluZENvbnRyaWJ1dG9yKGNhdGVnb3J5UGtnLCBjYXRlZ29yeSk7Ci0JCQl9Ci0KLQkJCWlmIChjb250cmliID09IG51bGwpIHsKLQkJCQljcmVhdGVOZXdDb250cmlidXRvciA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCXVzZWRDYXRlZ29yeSA9IGNvbnRyaWI7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl1c2VkQ2F0ZWdvcnkgPSBjYXRlZ29yeTsKLQkJfQotCi0JCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQotCQlyZWRvKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYgKGNyZWF0ZU5ld0NvbnRyaWJ1dG9yKSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgY29udHJpYiA9IChDb250ZW50Q2F0ZWdvcnkpIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGUoY2F0ZWdvcnkuZUNsYXNzKCkpOwotCQkJY29udHJpYi5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KGNhdGVnb3J5KTsKLQkJCWNvbnRyaWIuc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUyk7Ci0JCQljYXRlZ29yeVBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoY29udHJpYik7Ci0JCQl1c2VkQ2F0ZWdvcnkgPSBjb250cmliOwotCQkJaWYgKHVzZWRDYXRlZ29yeSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdCA9IFRuZ1V0aWwuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KFVtYVV0aWwKLQkJCQkJCS5nZXRNZXRob2RQbHVnaW4odXNlZENhdGVnb3J5KSk7Ci0JCQkJTGlzdCBsaXN0ID0gcm9vdC5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0JCQkJbGlzdC5hZGQodXNlZENhdGVnb3J5KTsKLQkJCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKHJvb3QsIChDdXN0b21DYXRlZ29yeSl1c2VkQ2F0ZWdvcnksIGNhdGVnb3J5LmdldE5hbWUoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXVzZWRDYXRlZ29yeS5zZXROYW1lKGNhdGVnb3J5LmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9IE9wcG9zaXRlRmVhdHVyZQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmUoZmVhdHVyZSk7Ci0JCU11bHRpUmVzb3VyY2VFT2JqZWN0IG1yRU9iaiA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudDsKLQkJb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUgPSBtckVPYmouZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZ2V0KAotCQkJCW9wcG9zaXRlRmVhdHVyZSk7Ci0JCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgdXNlZENhdGVnb3J5LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAob2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUgIT0gbnVsbCAmJiAhb3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJaWYgKG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlICE9IHVzZWRDYXRlZ29yeSkgewotCQkJCQlFT2JqZWN0IG9sZE9wcFZhbCA9IChFT2JqZWN0KSBvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZTsKLQkJCQkJKChDb2xsZWN0aW9uKSBvbGRPcHBWYWwuZUdldChmZWF0dXJlKSkucmVtb3ZlKGVsZW1lbnQpOwotCQkJCQlpZiAob2xkT3BwVmFsLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChvbGRPcHBWYWwuZVJlc291cmNlKCkpOwotCQkJCQl9Ci0KLQkJCQkJY29sbGVjdGlvbi5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFjb2xsZWN0aW9uLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJY29sbGVjdGlvbi5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAob2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUgIT0gbnVsbCAmJiAhb3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJaWYgKG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlICE9IHVzZWRDYXRlZ29yeSkgewotCQkJCQlFT2JqZWN0IG9sZE9wcFZhbCA9IChFT2JqZWN0KSBvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZTsKLQkJCQkJb2xkT3BwVmFsLmVTZXQoZmVhdHVyZSwgbnVsbCk7Ci0JCQkJCWlmIChvbGRPcHBWYWwuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKG9sZE9wcFZhbC5lUmVzb3VyY2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodXNlZENhdGVnb3J5ICE9IG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlKSB7Ci0JCQkJdXNlZENhdGVnb3J5LmVTZXQoZmVhdHVyZSwgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodXNlZENhdGVnb3J5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZCh1c2VkQ2F0ZWdvcnkuZVJlc291cmNlKCkpOwotCQl9Ci0JCWlmICh1c2VkQ2F0ZWdvcmllcy5jb250YWlucyhjYXRlZ29yeSkpIHsKLQkJCXVzZWRDYXRlZ29yaWVzLnJlbW92ZShjYXRlZ29yeSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gT3Bwb3NpdGVGZWF0dXJlCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZShmZWF0dXJlKTsKLQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSB1c2VkQ2F0ZWdvcnkuZUdldChmZWF0dXJlKTsKLQkJCWNvbGxlY3Rpb24ucmVtb3ZlKGVsZW1lbnQpOwotCQl9IGVsc2UgewotCQkJdXNlZENhdGVnb3J5LmVTZXQoZmVhdHVyZSwgbnVsbCk7Ci0JCX0KLQotCQkvLyByZXN0b3JlIG9sZCB2YWx1ZSBvZiB0aGUgc2luZ2xlLXZhbHVlIG9wcG9zaXRlIGZlYXR1cmUKLQkJLy8KLQkJaWYgKCFvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkgJiYgb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUgIT0gbnVsbAotCQkJCSYmIG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlICE9IHVzZWRDYXRlZ29yeSkgewotCQkJRU9iamVjdCBvbGRPcHBWYWwgPSAoRU9iamVjdCkgb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWU7Ci0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCSgoQ29sbGVjdGlvbikgb2xkT3BwVmFsLmVHZXQoZmVhdHVyZSkpLmFkZChlbGVtZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJb2xkT3BwVmFsLmVTZXQoZmVhdHVyZSwgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY3JlYXRlTmV3Q29udHJpYnV0b3IpIHsKLQkJCWlmIChUbmdVdGlsLmlzRW1wdHkodXNlZENhdGVnb3J5KSkgewotCQkJCU1ldGhvZFBsdWdpbiB1c2VkQ2F0ZWdvcnlQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbih1c2VkQ2F0ZWdvcnkpOwotCQkJCUVjb3JlVXRpbC5yZW1vdmUodXNlZENhdGVnb3J5KTsKLQkJCQlpZiAodXNlZENhdGVnb3J5IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJVG5nVXRpbC5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkodXNlZENhdGVnb3J5UGx1Z2luKQotCQkJCQkJCS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkucmVtb3ZlKHVzZWRDYXRlZ29yeSk7Ci0JCQkJfQotCQkJCXVzZWRDYXRlZ29yeSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJaWYgKCF1c2VkQ2F0ZWdvcmllcy5jb250YWlucyhjYXRlZ29yeSkpIHsKLQkJCXVzZWRDYXRlZ29yaWVzLmFkZChjYXRlZ29yeSk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodXNlZENhdGVnb3J5KTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDY2NjIKLQkJLy8gQmVsb3cgYWRkaW5nIGNhdGVnb3J5J3MgcmVzb3VyY2UgdG8gbW9kaWZpZWRSZXNvdXJjZXMgaXMgbmVlZGVkLCAKLQkJLy8gYmVjYXVzZSBiZWZvcmUgZXhlY3V0aW5nIGNvbW1hbmQsIG5lZWQgdG8gdmVyaWZ5IGlmIHJlc291cmNlIGlzIG11dGFibGUgb3Igbm90Ci0JCS8vIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgY2FsbGVkIGJlZm9yZSBleGVjdXRpbmcgYWN0dWFsIGV4ZWN1dGUoKSBpbiBmZXcgY2FzZXMuCi0JCS8vIFVzZWZ1bCBpbiBzcGVjaWFsIGNhc2VzIGxpa2UgaWYgcmVzb3VyY2UgaXMgaW4gdmVyc2lvbiBjb250cm9sLgotCQkvLwotCQlpZihjYXRlZ29yeSAhPSBudWxsICYmIGNhdGVnb3J5LmVSZXNvdXJjZSgpICE9IG51bGwKLQkJCQkmJiBtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKXsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChjYXRlZ29yeS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJCi0JCWlmIChtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9BZGRUb1NlY3Rpb25MaXN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDVlNTI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9BZGRUb1NlY3Rpb25MaXN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlNlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGFkZCBhIG5ldyBzZWN0aW9uIHRvIHRoZSBzZWN0aW9uIGxpc3QuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRUb1NlY3Rpb25MaXN0Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50OwotCi0JcHJpdmF0ZSBTZWN0aW9uTGlzdCBzZWN0aW9uTGlzdDsKLQotCXByaXZhdGUgU2VjdGlvbiBzZWN0aW9uOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBib29sZWFuIGFkZGVkOwotCi0JcHVibGljIEFkZFRvU2VjdGlvbkxpc3RDb21tYW5kKENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50LAotCQkJU2VjdGlvbiBzZWN0aW9uLCBTZWN0aW9uTGlzdCBzZWN0aW9uTGlzdCkgewotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCXRoaXMuc2VjdGlvbkxpc3QgPSBzZWN0aW9uTGlzdDsKLQkJdGhpcy5zZWN0aW9uID0gc2VjdGlvbjsKLQotCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCkpOwotCQl9ZWxzZXsKLQkJCS8vIFRoaXMgY2hlY2sgaXMgZG9uZSB0byBieXBhc3MgYWRkaXRpb24gb2Ygc2VjdGlvbiB0byBtZXRob2QgZWxlbWVudAotCQkJLy8gZm9yIGZpcnN0IHRpbWUsIGlmIHBsdWdpbi54bWkgZmlsZSBjaGVja2VkLW91dCB3aXRoIHZlcnNpb24gY29udHJvbC4gCi0JCQlpZihjb250ZW50RWxlbWVudC5lUmVzb3VyY2UoKSAhPSBudWxsKXsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoY29udGVudEVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCQlpZiAoY29udGVudEVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJc2VjdGlvbkxpc3QuYWRkKHNlY3Rpb24pOwotCQlhZGRlZCA9IHRydWU7Ci0JCXNlY3Rpb25MaXN0LmFwcGx5KCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoYWRkZWQpIHsKLQkJCXNlY3Rpb25MaXN0LnJlbW92ZShzZWN0aW9uKTsKLQkJCXNlY3Rpb25MaXN0LmFwcGx5KCk7Ci0JCQlhZGRlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChjb250ZW50RWxlbWVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQmF0Y2hDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQmF0Y2hDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZjE2OGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0JhdGNoQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBmZWF0dXJlcyBvZiBtdWx0aXBsZSBvYmplY3RzIGluCi0gKiBhIHNpbmdsZSBiYXRjaC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXRjaENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCXByaXZhdGUgTWFwIG9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcDsKLQlwcml2YXRlIE1hcCBvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXA7Ci0JcHJpdmF0ZSBib29sZWFuIGNsZWFyOwotCQotCS8qKgotCSAqIEBwYXJhbSBjbGVhciBpZiB0cnVlIHdpbGwgY2xlYXIgdGhlIG1hbnktdmFsdWVkIGZlYXR1cmUgYmVmb3JlIGFkZGluZyBuZXcgdmFsdWVzIAotCSAqLwotCXB1YmxpYyBCYXRjaENvbW1hbmQoYm9vbGVhbiBjbGVhcikgewotCQlzdXBlcigpOwotCQl0aGlzLmNsZWFyID0gY2xlYXI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNjYW5FeGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwICE9IG51bGwgJiYgIW9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcC5pc0VtcHR5KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJaWYob2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwID09IG51bGwgfHwgb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZihvYmplY3RUb09sZEZlYXR1cmVWYWx1ZXNNYXAgPT0gbnVsbCkgewotCQkJb2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcC5lbnRyeVNldCgpCi0JCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgZW50cnkuZ2V0S2V5KCk7Ci0JCQlNYXAgZmVhdHVyZU1hcCA9IChNYXApIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZmVhdHVyZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBlbnRyeQotCQkJCQkJLmdldEtleSgpOwotCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCWlmKGNsZWFyKSB7Ci0JCQkJCQllT2JqLmVTZXQoZmVhdHVyZSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkoKExpc3QpIGVPYmouZUdldChmZWF0dXJlKSkuYWRkQWxsKChDb2xsZWN0aW9uKSBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCU9iamVjdCBvbGRWYWx1ZSA9IGVPYmouZUdldChmZWF0dXJlKTsKLQkJCQkJaWYgKG9sZFZhbHVlICE9IGVudHJ5LmdldFZhbHVlKCkpIHsKLQkJCQkJCXNhdmVPbGRGZWF0dXJlVmFsdWUoZU9iaiwgZmVhdHVyZSk7Ci0JCQkJCQllT2JqLmVTZXQoZmVhdHVyZSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKG9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCAhPSBudWxsICYmICFvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAuZW50cnlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIGVudHJ5LmdldEtleSgpOwotCQkJCU1hcCBmZWF0dXJlTWFwID0gKE1hcCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZmVhdHVyZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQllbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBlbnRyeQotCQkJCQkJCS5nZXRLZXkoKTsKLQkJCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCSgoTGlzdCkgZU9iai5lR2V0KGZlYXR1cmUpKQotCQkJCQkJCQkucmVtb3ZlQWxsKChDb2xsZWN0aW9uKSBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0JCQkKLQkJfQotCi0JCS8vIHJlc3RvcmUgb2xkIHZhbHVlCi0JCS8vCi0JCWlmIChvYmplY3RUb09sZEZlYXR1cmVWYWx1ZXNNYXAgIT0gbnVsbCAmJiAhb2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwLmVudHJ5U2V0KCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlNYXAgZmVhdHVyZU1hcCA9IChNYXApIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGZlYXR1cmVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZW50cnkKLQkJCQkJCQkuZ2V0S2V5KCk7Ci0JCQkJCWVPYmouZVNldChmZWF0dXJlLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlvYmplY3RUb09sZEZlYXR1cmVWYWx1ZXNNYXAuY2xlYXIoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRGZWF0dXJlVmFsdWUoRU9iamVjdCBvYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJYWRkRmVhdHVyZVZhbHVlKGdldE9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCgpLCBvYmosIGZlYXR1cmUsIHZhbHVlKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB2YWx1ZXMgdG8gYSAnbWFueScgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIGZlYXR1cmUgdGhlIGZlYXR1cmUgd2l0aCBtYW55IHZhbHVlcwotCSAqIEBwYXJhbSB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRGZWF0dXJlVmFsdWVzKEVPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiB2YWx1ZXMpIHsKLQkJYWRkRmVhdHVyZVZhbHVlcyhnZXRPYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAoKSwgb2JqLCBmZWF0dXJlLCB2YWx1ZXMpOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0T2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwKCkgewotCQlpZihvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAgPT0gbnVsbCkgewotCQkJb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlyZXR1cm4gb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzYXZlT2xkRmVhdHVyZVZhbHVlKEVPYmplY3QgZU9iaiwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGVPYmouZUdldChmZWF0dXJlKTsKLQkJaWYoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJdmFsdWUgPSBuZXcgQXJyYXlMaXN0KChMaXN0KXZhbHVlKTsKLQkJfQotCQlNYXAgZmVhdHVyZU1hcCA9IChNYXApIG9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcC5nZXQoZU9iaik7Ci0JCWlmIChmZWF0dXJlTWFwID09IG51bGwpIHsKLQkJCWZlYXR1cmVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJb2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwLnB1dChlT2JqLCBmZWF0dXJlTWFwKTsKLQkJfQotCQlmZWF0dXJlTWFwLnB1dChmZWF0dXJlLCB2YWx1ZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAgIT0gbnVsbCkgewotCQkJb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwLmNsZWFyKCk7Ci0JCQlvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAgPSBudWxsOwotCQl9Ci0JCQotCQlpZihvYmplY3RUb09sZEZlYXR1cmVWYWx1ZXNNYXAgIT0gbnVsbCkgewotCQkJb2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwLmNsZWFyKCk7Ci0JCQlvYmplY3RUb09sZEZlYXR1cmVWYWx1ZXNNYXAgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEZlYXR1cmVWYWx1ZShNYXAgZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCwKLQkJCUVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCU1hcCBmZWF0dXJlTWFwID0gKE1hcCkgZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcC5nZXQob2JqZWN0KTsKLQkJaWYgKGZlYXR1cmVNYXAgPT0gbnVsbCkgewotCQkJZmVhdHVyZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLnB1dChvYmplY3QsIGZlYXR1cmVNYXApOwotCQl9Ci0JCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgZmVhdHVyZU1hcC5nZXQoZmVhdHVyZSk7Ci0JCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmZWF0dXJlTWFwLnB1dChmZWF0dXJlLCBsaXN0KTsKLQkJCX0KLQkJCWxpc3QuYWRkKHZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCWZlYXR1cmVNYXAucHV0KGZlYXR1cmUsIHZhbHVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGZWF0dXJlVmFsdWVzKE1hcCBkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLAotCQkJRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIHZhbHVlcykgewotCQlNYXAgZmVhdHVyZU1hcCA9IChNYXApIGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAuZ2V0KG9iamVjdCk7Ci0JCWlmIChmZWF0dXJlTWFwID09IG51bGwpIHsKLQkJCWZlYXR1cmVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcC5wdXQob2JqZWN0LCBmZWF0dXJlTWFwKTsKLQkJfQotCQlMaXN0IGxpc3QgPSAoTGlzdCkgZmVhdHVyZU1hcC5nZXQoZmVhdHVyZSk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmZWF0dXJlTWFwLnB1dChmZWF0dXJlLCBsaXN0KTsKLQkJfQotCQlsaXN0LmFkZEFsbCh2YWx1ZXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Db21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Db21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UyMTc3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLS8qKgotICogTGlzdGVucyB0byBjaGFuZ2VzIHRvIGEgY29tbWVuZCBzdGFjay4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRTdGFja0NoYW5nZWRFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQVZFRCA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWEVDVVRFRCA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRPID0gNDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVORE9fQUxMID0gODsKLQotCXByaXZhdGUgaW50IHR5cGU7Ci0KLQlwdWJsaWMgQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50KE9iamVjdCBzb3VyY2UsIGludCB0eXBlKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU2NzI3Mjk0NjA0MjkyOTE2TDsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Db21tYW5kU3RhdHVzQ2hlY2tlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0NvbW1hbmRTdGF0dXNDaGVja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNGVmNjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0NvbW1hbmRTdGF0dXNDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBDaGVja3MgdGhlIHN0YXR1cyBvZiBhbiBleGVjdXRlZCBjb21tYW5kLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAyMSwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29tbWFuZFN0YXR1c0NoZWNrZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGhhc1JvbGxiYWNrRXJyb3IoSVN0YXR1cyBzdGF0dXMpIHsKLQkJcmV0dXJuIGhhc0Vycm9yKHN0YXR1cywgU2F2ZVN0YXR1cy5ST0xMQkFDS19FUlJPUik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGhhc1NhdmVFcnJvcihJU3RhdHVzIHN0YXR1cykgewotCQlyZXR1cm4gaGFzRXJyb3Ioc3RhdHVzLCBTYXZlU3RhdHVzLlNBVkVfRVJST1IpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBoYXNFcnJvcihJU3RhdHVzIHN0YXR1cywgaW50IGVyckNvZGUpIHsKLQkJaWYgKHN0YXR1cyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUlTdGF0dXNbXSBzdGF0dXNlcyA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotCQlib29sZWFuIHJldCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXR1c2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJU3RhdHVzIGNoaWxkU3RhdHVzID0gc3RhdHVzZXNbaV07Ci0JCQlpZiAoY2hpbGRTdGF0dXMgaW5zdGFuY2VvZiBTYXZlU3RhdHVzCi0JCQkJCSYmIChjaGlsZFN0YXR1cy5nZXRDb2RlKCkgJiBlcnJDb2RlKSA9PSBlcnJDb2RlKSB7Ci0JCQkJcmV0ID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0RlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MDBmYjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0RlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50c0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb21tYW5kTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JUmVmZXJlbmNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBkZWxldGUgYSBtZXRob2QgZWxlbWVudCBwZXJtYW5lbnRseS4gVGhpcyBpbnZvbHZlcwotICogZGVsZXRpbmcgdGhlIHN0b3JhZ2UgY29udGVudCBhbmQgcmVtb3ZpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhpcyBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kV3JhcHBlciB7Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBlbGVtZW50czsKLQotCXByaXZhdGUgYm9vbGVhbiByZWZSZW1vdmVkOwotCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBjb21tYW5kTGlzdGVuZXJzOwotCi0JcHJpdmF0ZSBGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyOwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBlbGVtZW50c1RvRGVsZXRlQ29udGVudDsKLQotCXByb3RlY3RlZCBTZXQ8UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JLy8gTWFwIG9mIGVsZW1lbnQgdG8gTWFwIG9mIGl0cyByZWZlcmVuY2VyIHRvIGZlYXR1cmVzIGxpc3QKLQkvLwotCXByb3RlY3RlZCBNYXA8RU9iamVjdCwgTWFwPEVPYmplY3QsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPj4+IGVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwOwotCi0JcHJpdmF0ZSBCYXRjaENvbW1hbmQgYmF0Y2hDb21tYW5kID0gbmV3IEJhdGNoQ29tbWFuZCh0cnVlKTsKLQotCS8qKgotCSAqIExpc3Qgb2YgUmVmZXJlbmNlIG9iamVjdHMKLQkgKiAKLQkgKiBAc2VlIFJlZmVyZW5jZQotCSAqLwotCXByb3RlY3RlZCBBcnJheUxpc3QgcmVtb3ZlZFJlZmVyZW5jZXM7Ci0KLQlwdWJsaWMgYm9vbGVhbiBmYWlsZWQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29uZmlybVJlbW92ZVJlZmVyZW5jZXM7Ci0JCi0JcHJpdmF0ZSBBcnJheUxpc3Q8Q29tbWFuZD4gbmVzdGVkQ29tbWFuZHM7Ci0KLQlwcml2YXRlIEhhc2hTZXQ8RGVzY3JpcHRvcj4gZGVzY3JpcHRvcnM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudCBvYmplY3RzIHRvIGJlIHBlcm1hbmVudGx5IGRlbGV0ZWQuCi0JICovCi0JcHVibGljIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKENvbW1hbmQgY29tbWFuZCwgQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQl0aGlzKGNvbW1hbmQsIGVsZW1lbnRzLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQoQ29tbWFuZCBjb21tYW5kLCBDb2xsZWN0aW9uIGVsZW1lbnRzLAotCQkJYm9vbGVhbiBjb25maXJtUmVtb3ZlUmVmcykgewotCQlzdXBlcihjb21tYW5kKTsKLQkJdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzID09IG51bGwgPyBudWxsIDogbmV3IEFycmF5TGlzdChlbGVtZW50cyk7Ci0JCWNvbW1hbmRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWNvbmZpcm1SZW1vdmVSZWZlcmVuY2VzID0gY29uZmlybVJlbW92ZVJlZnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJYmF0Y2hDb21tYW5kLmRpc3Bvc2UoKTsKLQkJaWYgKGNvbW1hbmRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJY29tbWFuZExpc3RlbmVycy5jbGVhcigpOwotCQl9Ci0JCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQllbGVtZW50cy5jbGVhcigpOwotCQl9Ci0JCWlmIChlbGVtZW50c1RvRGVsZXRlQ29udGVudCAhPSBudWxsKSB7Ci0JCQllbGVtZW50c1RvRGVsZXRlQ29udGVudC5jbGVhcigpOwotCQl9Ci0JCWlmIChlbGVtZW50VG9SZW1vdmVkUmVmc01hcCAhPSBudWxsKSB7Ci0JCQllbGVtZW50VG9SZW1vdmVkUmVmc01hcC5jbGVhcigpOwotCQl9Ci0JCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5jbGVhcigpOwotCQl9Ci0JCWlmIChyZW1vdmVkUmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQlyZW1vdmVkUmVmZXJlbmNlcy5jbGVhcigpOwotCQl9Ci0JCS8vIERpc3Bvc2UgbmVzdGVkIGNvbW1hbmRzLgotCQlpZihuZXN0ZWRDb21tYW5kcyAhPSBudWxsKXsKLQkJCWlmKCFuZXN0ZWRDb21tYW5kcy5pc0VtcHR5KCkpewotCQkJCWZvciAoQ29tbWFuZCBjb21tYW5kIDogbmVzdGVkQ29tbWFuZHMpIHsKLQkJCQkJY29tbWFuZC5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKGRlc2NyaXB0b3JzICE9IG51bGwpIHsKLQkJCWRlc2NyaXB0b3JzLmNsZWFyKCk7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdXBlckV4ZWN1dGUoKSB7Ci0JCXN1cGVyLmV4ZWN1dGUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbm90aWZ5UHJlRXhlY3V0ZSgpIHsKLQkJTGlzdCBjb21tYW5kTGlzdGVuZXJzID0gUHJvdmlkZXJzCi0JCQkJLmdldENvbW1hbmRMaXN0ZW5lcnMoRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQuY2xhc3MpOwotCQlpZiAoY29tbWFuZExpc3RlbmVycyAhPSBudWxsICYmICFjb21tYW5kTGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29tbWFuZExpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJQ29tbWFuZExpc3RlbmVyIGNtZExpc3RlbmVyID0gKElDb21tYW5kTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJCXRyeSB7Ci0JCQkJCWNtZExpc3RlbmVyLnByZUV4ZWN1dGUodGhpcyk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBub3RpZnlQcmVVbmRvKCkgewotCQlMaXN0IGNvbW1hbmRMaXN0ZW5lcnMgPSBQcm92aWRlcnMKLQkJCQkuZ2V0Q29tbWFuZExpc3RlbmVycyhEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5jbGFzcyk7Ci0JCWlmIChjb21tYW5kTGlzdGVuZXJzICE9IG51bGwgJiYgIWNvbW1hbmRMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21tYW5kTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlDb21tYW5kTGlzdGVuZXIgY21kTGlzdGVuZXIgPSAoSUNvbW1hbmRMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJY21kTGlzdGVuZXIucHJlVW5kbyh0aGlzKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlcGFyZUVsZW1lbnRzKCkgewotCQlBcnJheUxpc3QgbmV3RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlSZW1vdmVDb21tYW5kIGNtZCA9IGdldFJlbW92ZUNvbW1hbmQoZWxlbWVudCk7Ci0JCQkJaWYgKGNtZC5nZXRGZWF0dXJlKCkgaW5zdGFuY2VvZiBFUmVmZXJlbmNlCi0JCQkJCQkmJiAoKEVSZWZlcmVuY2UpIGNtZC5nZXRGZWF0dXJlKCkpLmlzQ29udGFpbm1lbnQoKQotCQkJCQkJJiYgY21kLmdldE93bmVyTGlzdCgpLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJCS8vIGN1c3RvbSBjYXRlZ29yeSB3aWxsIGJlIGRlbGV0ZWQgcGVybWFuZW50bHkKLQkJCQkJLy8gZmluZCBhbGwgc3ViY2F0ZWdvcnkgdGhhdCBhcmUgbm90IHJlZmVyZW5jZWQgYnkgYW55IG90aGVyCi0JCQkJCS8vIGN1c3RvbSBjYXRlZ29yeQotCQkJCQkvLyBpbiB0aGUgc2FtZSBwbHVnaW4gdG8gZGVsZXRlIHRoZW0gYXMgd2VsbAotCQkJCQkvLwotCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBUbmdVdGlsCi0JCQkJCQkJLmdldEV4Y2x1c2l2ZVN1YkN1c3RvbUNhdGVnb3JpZXMoKEN1c3RvbUNhdGVnb3J5KSBlbGVtZW50KTsKLQkJCQkJaWYgKCFjb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3Qgc3ViQ2F0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCWlmICghZWxlbWVudHMuY29udGFpbnMoc3ViQ2F0KQotCQkJCQkJCQkJJiYgIW5ld0VsZW1lbnRzLmNvbnRhaW5zKHN1YkNhdCkpIHsKLS8vCQkJCQkJCQljbWQuZ2V0Q29sbGVjdGlvbigpLmFkZChzdWJDYXQpOwotCQkJCQkJCQlDb2xsZWN0aW9uIGNvbCA9IGNtZC5nZXRDb2xsZWN0aW9uKCk7Ci0JCQkJCQkJCWNvbC5hZGQoc3ViQ2F0KTsJCQkJCQkJCQotCQkJCQkJCQluZXdFbGVtZW50cy5hZGQoc3ViQ2F0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxlbWVudHMuYWRkQWxsKG5ld0VsZW1lbnRzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBSZW1vdmVDb21tYW5kIGZvciB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBSZW1vdmVDb21tYW5kIGdldFJlbW92ZUNvbW1hbmQoT2JqZWN0IGUpIHsKLQkJaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBSZW1vdmVDb21tYW5kKSB7Ci0JCQlpZiAoKChSZW1vdmVDb21tYW5kKSBjb21tYW5kKS5nZXRDb2xsZWN0aW9uKCkuY29udGFpbnMoZSkpIHsKLQkJCQlyZXR1cm4gKFJlbW92ZUNvbW1hbmQpIGNvbW1hbmQ7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIENvbXBvdW5kQ29tbWFuZCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb21wb3VuZENvbW1hbmQpIGNvbW1hbmQpLmdldENvbW1hbmRMaXN0KCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjbWQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoY21kIGluc3RhbmNlb2YgUmVtb3ZlQ29tbWFuZCkgewotCQkJCQlSZW1vdmVDb21tYW5kIHJlbW92ZUNvbW1hbmQgPSAoUmVtb3ZlQ29tbWFuZCkgY21kOwotCQkJCQlpZiAocmVtb3ZlQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkuY29udGFpbnMoZSkpIHsKLQkJCQkJCXJldHVybiByZW1vdmVDb21tYW5kOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXByZXBhcmVFbGVtZW50cygpOwotCi0JCW5vdGlmeVByZUV4ZWN1dGUoKTsKLQotCQllbGVtZW50c1RvRGVsZXRlQ29udGVudCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZGVzY3JpcHRvcnMgPSBuZXcgSGFzaFNldDxEZXNjcmlwdG9yPigpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQljb2xsZWN0T2JqZWN0c1RvRGVsZXRlQ29udGVudChlbGVtZW50c1RvRGVsZXRlQ29udGVudCwKLQkJCQkJCShNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJcHJlcGFyZVJlbW92aW5nUmVmZXJlbmNlcygpOwotCQkJfQotCi0JCX07Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsCi0JCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMucHJvY2Vzc2luZ1JlZmVyZW5jZXNUYXNrX25hbWUpOyAKLQotCi0JCWlmKCFjb25maXJtUmVtb3ZpbmdSZWZlcmVuY2VzKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJU2V0IHVubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCi0JCS8vIGdldCB0aGUgb3duZXIgcmVzb3VyY2VzIGJlZm9yZSB0aGUgZWxlbWVudHMgZ290IHJlbW92ZWQgZnJvbQotCQkvLyBjb250YWluZXIgaW4gc3VwZXJFeGVjdXRlKCkKLQkJLy8KLQkJY29sbGVjdE93bmVyUmVzb3VyY2VzKG1vZGlmaWVkUmVzb3VyY2VzLCB1bm1vZGlmaWVkUmVzb3VyY2VzKTsKLQotCQlzdXBlckV4ZWN1dGUoKTsKLQkJCi0JCWV4ZWN1dGVOZXN0ZWRDb21tYW5kcygpOwotCQkKLQkJLy8gQ29sbGVjdCB0aGUgbmVzdGVkIGNvbW1hbmQgbW9kaWZpZWQgcmVzb3VyY2VzIGZvciBzYXZpbmcuIAotCQljb2xsZWN0TmVzdGVkQ29tbWFuZFJlc291cmNlcyhtb2RpZmllZFJlc291cmNlcyk7Ci0KLQkJLy8gZ2V0IHJlc291cmNlcyBvZiB0aGUgb2JqZWN0cyB0aGF0IGhhdmUgYmVlbiBhZmZlY3RlZCBieSB0aGlzIGNvbW1hbmQKLQkJLy8gdW50aWwgbm93Ci0JCS8vCi0JCWNvbGxlY3RSZXNvdXJjZXMobW9kaWZpZWRSZXNvdXJjZXMsIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpKTsKLQotCQltb2RpZmllZFJlc291cmNlcy5yZW1vdmVBbGwodW5tb2RpZmllZFJlc291cmNlcyk7Ci0KLQkJZmluYWwgRXhjZXB0aW9uW10gZXhjZXB0aW9ucyA9IG5ldyBFeGNlcHRpb25bMV07Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1bldpdGhCdXN5SW5kaWNhdG9yKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCXJlbW92ZVJlZmVyZW5jZXMoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlleGNlcHRpb25zWzBdID0gZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJaWYgKGV4Y2VwdGlvbnNbMF0gIT0gbnVsbCkgewotCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dFcnJvcigKLQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRlRGlhbG9nX3RpdGxlLAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGVFbGVtZW50RXJyb3JfbXNnLAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGVSZWZlcmVuY2VzRXJyb3JfcmVhc29uLAotCQkJCQlleGNlcHRpb25zWzBdKTsKLQkJCQkKLQkJCXVuZG8oKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbChnZXRSZWZlcmVuY2luZ1Jlc291cmNlcygpKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50c1RvRGVsZXRlQ29udGVudC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50LmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCi0JCWVsZW1lbnRzVG9EZWxldGVDb250ZW50LmFkZEFsbChlbGVtZW50cyk7Ci0JCQotCQlIYXNoU2V0PFJlc291cmNlPiBkZWxldGVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9EZWxldGVDb250ZW50Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCEgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpKSB7Ci0JCQkJb2JqID0gVG5nVXRpbC51bndyYXAob2JqKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJRU9iamVjdCBlID0gKEVPYmplY3QpIG9iajsKLQkJCQlVbWFVdGlsLmdldFJlc291cmNlcyhlLCBkZWxldGVkUmVzb3VyY2VzKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gZXhjbHVkZSBkZWxldGVkIHJlc291cmNlcyBmcm9tIHRoZSBzZXQgb2YgbW9kaWZpZWQgcmVzb3VyY2VzCi0JCS8vCi0JCW1vZGlmaWVkUmVzb3VyY2VzLnJlbW92ZUFsbChkZWxldGVkUmVzb3VyY2VzKTsKLQkJCi0JCS8vIGV4Y2x1ZGUgYW55IHJlc291cmNlIHRoYXQgaXMgY29udGFpbmVkIGJ5IHRoZSBkZWxldGVkIHJlc291cmNlcwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2RpZmllZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBkZWxldGVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgZGVsZXRlZFJlc291cmNlID0gKFJlc291cmNlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYoZ2V0UGVyc2lzdGVyKCkuaXNDb250YWluZWRCeShyZXNvdXJjZSwgZGVsZXRlZFJlc291cmNlKSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQkJCi0JCQotCQkvLyBjaGVjayBhZmZlY3RlZCByZXNvdXJjZXMgZm9yIHVubW9kaWZpYWJsZQotCQkvLwotCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShtb2RpZmllZFJlc291cmNlcywKLQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29udGV4dCgpKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd0Vycm9yKAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGVEaWFsb2dfdGl0bGUsCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZUVsZW1lbnRFcnJvcl9tc2csIHN0YXR1cyk7Ci0KLQkJCXVuZG8oKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAzKTsgLy8kTk9OLU5MUy0xJAotCQkJCWdldFBlcnNpc3RlcigpOwotCi0JCQkJLy8gc2F2ZSByZXNvdXJjZXMgdGhhdCBoYWQgYmVlbiBjaGFuZ2VkIGFmdGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JCQkJLy8gZGVsZXRlZCBlbGVtZW50cwotCQkJCS8vIGhhZCBiZWVuIHJlbW92ZWQKLQkJCQkvLwotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3IKLQkJCQkJCQkuc3ViVGFzayhMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGluZ0VsZW1lbnRzVGFza19uYW1lKTsKLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCWRlbGV0ZUNvbnRlbnQoKTsKLQotCQkJCQkvLyBzYXZlIG1vZGlmaWVkIHJlc291cmNlcwotCQkJCQkvLwotCQkJCQltb25pdG9yLnN1YlRhc2soTGlicmFyeUVkaXRSZXNvdXJjZXMuc2F2aW5nUmVzb3VyY2VzX21zZyk7Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2RpZmllZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCi0JCQkJCWV4ZWN1dGVkID0gdHJ1ZTsKLQotCQkJCQlyZW1vdmVBZGFwdGVycygpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCWZhaWxlZCA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0JCQkJCQl0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0KLQkJLy8gaWYgKCFVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLAotCQkvLyBMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGluZ0VsZW1lbnRzVGFza19uYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCS8vIGlmIChmYWlsZWQpIHsKLQkJLy8gbm90aWZ5RmFpbHVyZSgpOwotCQkvLyB9IGVsc2UgewotCQkvLyB1bmRvKCk7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuOwotCQkvLyB9Ci0KLS8vCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuSW5VSShydW5uYWJsZSwgKFNoZWxsKSBudWxsKTsKLQkJCi0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIExpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0aW5nRWxlbWVudHNUYXNrX25hbWUpOwotCi0JCWlmIChleGVjdXRlZCkgewotCQkJdHJ5IHsKLQkJCQlMaXN0IHdhcm5pbmdzID0gcGVyc2lzdGVyLmdldFdhcm5pbmdzKCk7Ci0JCQkJaWYgKCF3YXJuaW5ncy5pc0VtcHR5KCkpIHsKLQkJCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRlRGlhbG9nX3RpdGxlOwotCQkJCQlTdHJpbmcgbXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRfd2FybmluZ01zZzsKLQkJCQkJU3RyaW5nQnVmZmVyIHJlYXNvbiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd2FybmluZ3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFeGNlcHRpb24gZSA9IChFeGNlcHRpb24pIGl0ZXIubmV4dCgpOwotCQkJCQkJU3RyaW5nIHN0ciA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCQkJaWYgKCFTdHJVdGlsLmlzQmxhbmsoc3RyKSkgewotCQkJCQkJCXJlYXNvbi5hcHBlbmQoc3RyKS5hcHBlbmQoJ1xuJyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd1dhcm5pbmcodGl0bGUsIG1zZywgcmVhc29uCi0JCQkJCQkJLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQkJCi0JCQlub3RpZnlFeGVjdXRlZCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGZhaWxlZCkgewotCQkJCW5vdGlmeUZhaWx1cmUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdW5kbygpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbmZpcm1SZW1vdmluZ1JlZmVyZW5jZXMoKSB7Ci0JCWlmICghZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXAuaXNFbXB0eSgpKSB7Ci0JCQkvLyBjb2xsZWN0IHNldCBvZiByZWZlcmVuY2VycwotCQkJSGFzaFNldDxFT2JqZWN0PiByZWZlcmVuY2VycyA9IG5ldyBIYXNoU2V0PEVPYmplY3Q+KCk7Ci0JCQlmb3IgKE1hcDxFT2JqZWN0LCBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4+IHJlZmVyZW5jZXJUb0ZlYXR1cmVzTWFwIDogZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXAudmFsdWVzKCkpIHsKLQkJCQkvLyBjb2xsZWN0IG9ubHkgcmVmZXJlbmNlciB3aXRoIGFuIHVuaWRpcmVjdGlvbmFsIG9yIGNvbnRhaW5tZW50Ci0JCQkJLy8gcmVsYXRpb25zaGlwCi0JCQkJLy8KLQkJCQlmb3IgKE1hcC5FbnRyeTxFT2JqZWN0LCBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4+IGVudHJ5IDogcmVmZXJlbmNlclRvRmVhdHVyZXNNYXAuZW50cnlTZXQoKSkgewotCQkJCQlDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZmVhdHVyZXMgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCQlib29sZWFuIGNhbkNvbGxlY3QgPSBmYWxzZTsKLQkJCQkJYm9vbGVhbiBoYXNEZXNjcmlwdG9yID0gZmFsc2U7Ci0JCQkJCWNoZWNrX3JlZjogZm9yIChFU3RydWN0dXJhbEZlYXR1cmUgZiA6IGZlYXR1cmVzKSB7Ci0JCQkJCQlpZiAoIWNhbkNvbGxlY3QgJiYgZiBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpIHsKLQkJCQkJCQlFUmVmZXJlbmNlIHJlZiA9IChFUmVmZXJlbmNlKSBmOwotCQkJCQkJCWlmIChyZWYuaXNDb250YWlubWVudCgpCi0JCQkJCQkJCQl8fCByZWYuZ2V0RU9wcG9zaXRlKCkgPT0gbnVsbCkgewotCQkJCQkJCQljYW5Db2xsZWN0ID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZighaGFzRGVzY3JpcHRvciAmJiAoZiA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCkKLQkJCQkJCQkJfHwgZiA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCkKLQkJCQkJCQkJfHwgZiA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKSkpIHsKLQkJCQkJCQloYXNEZXNjcmlwdG9yID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJCWlmKGNhbkNvbGxlY3QgJiYgaGFzRGVzY3JpcHRvcikgewotCQkJCQkJCWJyZWFrIGNoZWNrX3JlZjsJCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGNhbkNvbGxlY3QpIHsKLQkJCQkJCXJlZmVyZW5jZXJzLmFkZChlbnRyeS5nZXRLZXkoKSk7Ci0JCQkJCX0KLQkJCQkJaWYoaGFzRGVzY3JpcHRvciAmJiBlbnRyeS5nZXRLZXkoKSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQkJCWRlc2NyaXB0b3JzLmFkZCgoRGVzY3JpcHRvcikgZW50cnkuZ2V0S2V5KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBjb25maXJtIHdpdGggdXNlciBiZWZvcmUgcmVtb3ZpbmcgaWxsZWdhbCByZWZlcmVuY2VzCi0JCQkvLwotCQkJaWYgKGNvbmZpcm1SZW1vdmVSZWZlcmVuY2VzKSB7CQkJCQotCQkJCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksIDAsCi0JCQkJCQkiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJCQlpZighZGVzY3JpcHRvcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCS8vIGFzayB1c2VyIHRvIGRlbGV0ZSB0aGUgZGVzY3JpcHRvcnMgdGhhdCBhcmUgYXNzb2NpYXRlZAotCQkJCQkvLyB3aXRoIHRoZSBjb250ZW50IGVsZW1lbnQgdG8gYmUgZGVsZXRlZAotCQkJCQkvLwotCQkJCQlmb3IgKEVPYmplY3QgZSA6IGRlc2NyaXB0b3JzKSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmVsZW1lbnRUeXBlX3RleHQsIFRuZ1V0aWwuZ2V0VHlwZVRleHQoZSksIFRuZ1V0aWwKLQkJCQkJCQkJCQkuZ2V0TGFiZWxXaXRoUGF0aChlKSk7Ci0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLAotCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkJMCwgbXNnLCBudWxsKTsKLQkJCQkJCW11bHRpU3RhdHVzLmFkZChzdGF0dXMpOwotCQkJCQl9Ci0JCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIKLQkJCQkJCQkuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJCQkJaWYgKHVpSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJCQlzd2l0Y2ggKHVpSGFuZGxlcgotCQkJCQkJCQkuc2VsZWN0T25lKAotCQkJCQkJCQkJCW5ldyBpbnRbXSB7Ci0JCQkJCQkJCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fWUVTLAotCQkJCQkJCQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX05PLAotCQkJCQkJCQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTCB9LAotCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmNvbmZpcm1EZXNjcmlwdG9yc0RlbGV0aW9uX3RpdGxlLAotCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmNvbmZpcm1EZXNjcmlwdG9yc0RlbGV0aW9uX21zZywKLQkJCQkJCQkJCQltdWx0aVN0YXR1cykpIHsKLQkJCQkJCWNhc2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTDoKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9OTzoKLQkJCQkJCQlkZXNjcmlwdG9ycy5jbGVhcigpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmKCFkZXNjcmlwdG9ycy5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gcmVtb3ZlIHRoZSBkZXNjcmlwdG9ycyB0aGF0IHVzZXIgd2FudGVkIHRvIGRlbGV0ZSBmcm9tIHRoZSByZWZlcmVuY2VycwotCQkJCQkvLwotCQkJCQlyZWZlcmVuY2Vycy5yZW1vdmVBbGwoZGVzY3JpcHRvcnMpOwotCQkJCX0KLQkJCQltdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cygKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLCAwLAotCQkJCQkJIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChFT2JqZWN0IGUgOiByZWZlcmVuY2VycykgewotCQkJCQkvLyBkb24ndCBzaG93IHByZWRlZmluZWQgZWxlbWVudAotCQkJCQkvLwotCQkJCQlpZiAoIShlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBUbmdVdGlsLmlzUHJlZGVmaW5lZCgoTWV0aG9kRWxlbWVudCkgZSkpKSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmVsZW1lbnRUeXBlX3RleHQsIFRuZ1V0aWwuZ2V0VHlwZVRleHQoZSksIFRuZ1V0aWwKLQkJCQkJCQkJCQkuZ2V0TGFiZWxXaXRoUGF0aChlKSk7Ci0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLAotCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkJMCwgbXNnLCBudWxsKTsKLQkJCQkJCW11bHRpU3RhdHVzLmFkZChzdGF0dXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChtdWx0aVN0YXR1cy5nZXRDaGlsZHJlbigpLmxlbmd0aCA+IDApIHsKLQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlcgotCQkJCQkJCS5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQkJCQlpZiAodWlIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJCWlmICh1aUhhbmRsZXIKLQkJCQkJCQkJLnNlbGVjdE9uZSgKLQkJCQkJCQkJCQluZXcgaW50W10gewotCQkJCQkJCQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX09LLAotCQkJCQkJCQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTCB9LAotCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZVJlZmVyZW5jZXNEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190ZXh0LCBtdWx0aVN0YXR1cykgPT0gSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTCkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gY2hlY2sgaWYgdGhlIHJlZmVyZW5jZXJzIGNhbiBiZSBjaGFuZ2VkCi0JCQkvLwotCQkJZm9yIChFT2JqZWN0IGUgOiByZWZlcmVuY2VycykgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KGUsIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb250ZXh0KCkpOwotCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0UKLQkJCQkJCQkuc2hvd0Vycm9yKAotCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRlRGlhbG9nX3RpdGxlLAotCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRlRWxlbWVudEVycm9yX21zZywKLQkJCQkJCQkJCXN0YXR1cyk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIGFsbCBzdGF0ZWZ1bCBhZGFwdGVycywgdGhlbiByZW1vdmVzIGFsbCBhZGFwdGVycyB0aGF0IGFyZQotCSAqIGF0dGFjaGVkIHRvIHRoZSBnaXZlbiBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBZGFwdGVycyhFT2JqZWN0IGVsZW1lbnQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBBcnJheUxpc3QoZWxlbWVudC5lQWRhcHRlcnMoKSkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlcikgewotCQkJCSgoSVN0YXRlZnVsSXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5kaXNwb3NlKCk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyKQotCQkJCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJUmVmZXJlbmNlcikgewotCQkJCQkJKChJUmVmZXJlbmNlcikgYWRhcHRlckZhY3RvcnkpLnJlbW92ZShhZGFwdGVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbGVtZW50LmVBZGFwdGVycygpLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgYWxsIHN0YXRlZnVsIGFkYXB0ZXJzLCB0aGVuIHJlbW92ZXMgYWxsIGFkYXB0ZXJzIHRoYXQgYXJlCi0JICogYXR0YWNoZWQgdG8gdGhlIGRlbGV0ZWQgZWxlbWVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBZGFwdGVycygpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgb2JqOwotCQkJCWlmIChlbGVtZW50LmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmVBbGxDb250ZW50cygpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFT2JqZWN0IGUgPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJcmVtb3ZlQWRhcHRlcnMoZSk7Ci0JCQkJCX0KLQkJCQkJcmVtb3ZlQWRhcHRlcnMoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeUZhaWx1cmUoKSB7Ci0JCUV2ZW50T2JqZWN0IGV2ZW50T2JqZWN0ID0gbmV3IEV2ZW50T2JqZWN0KHRoaXMpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbW1hbmRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb21tYW5kTGlzdGVuZXIgbGlzdGVuZXIgPSAoQ29tbWFuZExpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCWxpc3RlbmVyLm5vdGlmeUZhaWx1cmUoZXZlbnRPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgZ2V0UGVyc2lzdGVyKCkgewotCQlpZiAocGVyc2lzdGVyID09IG51bGwpIHsKLQkJCXBlcnNpc3RlciA9IFNlcnZpY2VzLmdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVyKCkKLQkJCQkJLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHBlcnNpc3RlcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbm90aWZ5RXhlY3V0ZWQoKSB7Ci0JCUV2ZW50T2JqZWN0IGV2ZW50T2JqZWN0ID0gbmV3IEV2ZW50T2JqZWN0KHRoaXMpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMuY29tbWFuZExpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUNvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lciA9IChDb21tYW5kTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJbGlzdGVuZXIubm90aWZ5RXhlY3V0ZWQoZXZlbnRPYmplY3QpOwotCQl9Ci0KLQkJTGlzdCBjb21tYW5kTGlzdGVuZXJzID0gUHJvdmlkZXJzCi0JCQkJLmdldENvbW1hbmRMaXN0ZW5lcnMoRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQuY2xhc3MpOwotCQlpZiAoY29tbWFuZExpc3RlbmVycyAhPSBudWxsICYmICFjb21tYW5kTGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29tbWFuZExpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJQ29tbWFuZExpc3RlbmVyIGNtZExpc3RlbmVyID0gKElDb21tYW5kTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJCXRyeSB7Ci0JCQkJCWNtZExpc3RlbmVyLm5vdGlmeUV4ZWN1dGVkKHRoaXMpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0UmVmZXJlbmNpbmdSZXNvdXJjZXMoKSB7Ci0JCUhhc2hTZXQgcmVmZXJyZXJzID0gbmV3IEhhc2hTZXQoKTsKLQotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZW1vdmVkUmVmZXJlbmNlc01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gTWFwIHJlZmVycmVyVG9GZWF0dXJlc01hcCA9IChNYXApIGl0ZXIubmV4dCgpOwotCQkvLyByZWZlcnJlcnMuYWRkQWxsKHJlZmVycmVyVG9GZWF0dXJlc01hcC5rZXlTZXQoKSk7Ci0JCS8vIH0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZW1vdmVkUmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlZmVyZW5jZSByZWYgPSAoUmVmZXJlbmNlKSBpdGVyLm5leHQoKTsKLQkJCXJlZmVycmVycy5hZGQocmVmLm93bmVyKTsKLQkJfQotCi0JCUhhc2hTZXQgcmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJyZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCXJlc291cmNlcy5hZGQoZWxlbWVudC5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiBDb2xsZWN0cyBvd25lciByZXNvdXJjZXMgb2YgdGhlIGVsZW1lbnRzIHRvIGJlIGRlbGV0ZWQgdG8gc2F2ZSBsYXRlci4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RPd25lclJlc291cmNlcyhTZXQgcmVzb3VyY2VzLCBTZXQgdW5tb2RpZmllZFJlc291cmNlcykgewotCQlJTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBTZXJ2aWNlcy5nZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJRU9iamVjdCBjb250YWluZXIgPSAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLmVDb250YWluZXIoKTsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNvbnRhaW5lci5lUmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQlpZiAocGVyc2lzdGVyLmhhc093blJlc291cmNlV2l0aG91dFJlZmVycmVyKGVsZW1lbnQpKSB7Ci0JCQkJCQl1bm1vZGlmaWVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbGxlY3RSZXNvdXJjZXMoU2V0IHJlc291cmNlcywgQ29sbGVjdGlvbiBvYmplY3RzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCUVPYmplY3QgZU9iaiA9IChNZXRob2RFbGVtZW50KSBlbGVtZW50OwotCQkJCWlmIChlT2JqLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJcmVzb3VyY2VzLmFkZChlT2JqLmVSZXNvdXJjZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JCXN1cGVyLnJlZG8oKTsKLQkJcmVtb3ZlUmVmZXJlbmNlcygpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlQ29udGVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0PE1ldGhvZEVsZW1lbnQ+IHRvRGVsZXRlTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kRWxlbWVudD4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb0RlbGV0ZUNvbnRlbnQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBlbGVtZW50OwotCQkJCWlmIChlLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCXRvRGVsZXRlTGlzdC5hZGQoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXBlcnNpc3Rlci5kZWxldGUodG9EZWxldGVMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFbGVtZW50c1RvUmVtb3ZlUmVmZXJlbmNlcygpIHsKLQkJQ29sbGVjdGlvbiBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJCSYmIHdpbGxSZW1vdmVFbGVtZW50RnJvbUNvbnRhaW5lcigoRU9iamVjdCkgZWxlbWVudCkpIHsKLQkJCQlsaXN0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZW1vdmVSZWZlcmVuY2VzKE1ldGhvZEVsZW1lbnQgZSkgewotCQkvLyBpZiBlIGlzIG9uZSBvZiB0aGUgZGVsZXRlZCBlbGVtZW50cywgbWFrZSBzdXJlIHRoYXQgaXQgYWN0dWFsbHkgZ290Ci0JCS8vIGRlbGV0ZWQgYnkgY2hlY2tpbmcgaXRzIGNvbnRhaW5lcgotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAoZSA9PSBvYmopIHsKLQkJCQlyZXR1cm4gZS5lQ29udGFpbmVyKCkgPT0gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyBhbGwgb3Bwb3NpdGUgZmVhdHVyZXMgb2YgdGhlIGVsZW1lbnRzIHRvIGJlIGRlbGV0ZWQKLQkgKiAKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgZWxlbWVudHMgd2hvc2Ugb3Bwb3NpdGUgZmVhdHVyZXMgYXJlIGxvYWRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGxvYWRPcHBvc2l0ZUZlYXR1cmVzKCkgewotCQlIYXNoU2V0IG9wcG9zaXRlRmVhdHVyZXMgPSBuZXcgSGFzaFNldCgpOwotCQlIYXNoU2V0IGRlbGV0ZWRHVUlEcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUFycmF5TGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRFbGVtZW50c1RvUmVtb3ZlUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgb2JqOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlLmVBbGxDb250ZW50cygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQkJCU1hcCBvcHBvc2l0ZUZlYXR1cmVNYXAgPSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlbGVtZW50KQotCQkJCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCk7Ci0JCQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlTWFwICE9IG51bGwKLQkJCQkJCQkJJiYgIW9wcG9zaXRlRmVhdHVyZU1hcC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlvcHBvc2l0ZUZlYXR1cmVzCi0JCQkJCQkJCQkuYWRkQWxsKG9wcG9zaXRlRmVhdHVyZU1hcC5rZXlTZXQoKSk7Ci0JCQkJCQkJZGVsZXRlZEdVSURzLmFkZCgoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpCi0JCQkJCQkJCQkuZ2V0R3VpZCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbGVtZW50cy5hZGQoZSk7Ci0JCQkJTWFwIG9wcG9zaXRlRmVhdHVyZU1hcCA9ICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGUpCi0JCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCk7Ci0JCQkJaWYgKG9wcG9zaXRlRmVhdHVyZU1hcCAhPSBudWxsICYmICFvcHBvc2l0ZUZlYXR1cmVNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJCW9wcG9zaXRlRmVhdHVyZXMuYWRkQWxsKG9wcG9zaXRlRmVhdHVyZU1hcC5rZXlTZXQoKSk7Ci0JCQkJCWRlbGV0ZWRHVUlEcy5hZGQoKChNZXRob2RFbGVtZW50KSBlKS5nZXRHdWlkKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWxvYWRPcHBvc2l0ZUZlYXR1cmVzKG5ldyBBcnJheUxpc3Qob3Bwb3NpdGVGZWF0dXJlcyksIGRlbGV0ZWRHVUlEcyk7Ci0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0NvbnRhaW5lZEJ5RGVsZXRlZEVsZW1lbnQoRU9iamVjdCBlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGRlbGV0ZWQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAoZGVsZXRlZCBpbnN0YW5jZW9mIEVPYmplY3QgJiYgVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KGUsIGRlbGV0ZWQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENvbGxlY3RzIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZCBpZiA8Y29kZT5lbGVtZW50VG9EZWxldGU8L2NvZGU+Ci0JICogd2lsbCBiZSByZW1vdmVkIGZyb20gPGNvZGU+cmVmZXJlbmNlczwvY29kZT4gb2YgPGNvZGU+cmVmZXJlbmNlcjwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIG9iamVjdHNUb1JlbW92ZQotCSAqICAgICAgICAgICAgb3V0cHV0Ci0JICogQHBhcmFtIHJlZmVyZW5jZXIKLQkgKiAgICAgICAgICAgIGVsZW1lbnQgdGhhdCByZWZlcmVuY2VzIHRvIGVsZW1lbnRUb0RlbGV0ZQotCSAqIEBwYXJhbSByZWZlcmVuY2VzCi0JICogICAgICAgICAgICBjb2xsZWN0aW9uIG9mIHtAbGluayBFUmVmZXJlbmNlfSB0aGF0IGNvbnRhaW5zIGVsZW1lbnRUb0RlbGV0ZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBvbmUgb2YgdGhlIGNvbGxlY3RlZCBvYmplY3RzIGlzIHRoZQotCSAqICAgICAgICAgPGNvZGU+cmVmZXJlbmNlcjwvY29kZT4gb3IgdGhlIGNvbnRhaW5lciBvZgotCSAqICAgICAgICAgPGNvZGU+cmVmZXJlbmNlcjwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb2xsZWN0T2JqZWN0c1RvUmVtb3ZlKENvbGxlY3Rpb24gb2JqZWN0c1RvUmVtb3ZlLAotCQkJRU9iamVjdCBlbGVtZW50VG9EZWxldGUsIEVPYmplY3QgcmVmZXJlbmNlciwgQ29sbGVjdGlvbiByZWZlcmVuY2VzKSB7Ci0JCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0JCUxpc3QgY29tbWFuZExpc3RlbmVycyA9IFByb3ZpZGVycwotCQkJCS5nZXRDb21tYW5kTGlzdGVuZXJzKERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLmNsYXNzKTsKLQkJaWYgKGNvbW1hbmRMaXN0ZW5lcnMgIT0gbnVsbCAmJiAhY29tbWFuZExpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbW1hbmRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNtZExpc3RlbmVyID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGNtZExpc3RlbmVyIGluc3RhbmNlb2YgSURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kTGlzdGVuZXIpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWJvb2xlYW4gYiA9ICgoSURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kTGlzdGVuZXIpIGNtZExpc3RlbmVyKQotCQkJCQkJCQkuY29sbGVjdE9iamVjdHNUb1JlbW92ZShvYmplY3RzVG9SZW1vdmUsCi0JCQkJCQkJCQkJZWxlbWVudFRvRGVsZXRlLCByZWZlcmVuY2VyLCByZWZlcmVuY2VzKTsKLQkJCQkJCWlmIChiKSB7Ci0JCQkJCQkJcmV0ID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gd2lsbFJlbW92ZUVsZW1lbnRGcm9tQ29udGFpbmVyKEVPYmplY3QgZWxlbWVudCkgewotCQlpZiAod2lsbFJlbW92ZUVsZW1lbnRGcm9tQ29udGFpbmVyKGNvbW1hbmQsIGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChjb21tYW5kIGluc3RhbmNlb2YgQ29tcG91bmRDb21tYW5kKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbXBvdW5kQ29tbWFuZCkgY29tbWFuZCkuZ2V0Q29tbWFuZExpc3QoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQ29tbWFuZCBjbWQgPSAoQ29tbWFuZCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHdpbGxSZW1vdmVFbGVtZW50RnJvbUNvbnRhaW5lcihjbWQsIGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB3aWxsUmVtb3ZlRWxlbWVudEZyb21Db250YWluZXIoQ29tbWFuZCBjbWQsCi0JCQlFT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGNtZCBpbnN0YW5jZW9mIFJlbW92ZUNvbW1hbmQpIHsKLQkJCVJlbW92ZUNvbW1hbmQgcmVtb3ZlQ29tbWFuZCA9ICgoUmVtb3ZlQ29tbWFuZCkgY21kKTsKLQkJCXJldHVybiByZW1vdmVDb21tYW5kLmdldENvbGxlY3Rpb24oKS5jb250YWlucyhlbGVtZW50KQotCQkJCQkmJiByZW1vdmVDb21tYW5kLmdldE93bmVyKCkgPT0gZWxlbWVudC5lQ29udGFpbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZXBhcmVSZW1vdmluZ1JlZmVyZW5jZXMoKSB7Ci0JCUxpc3QgZWxlbWVudHMgPSBsb2FkT3Bwb3NpdGVGZWF0dXJlcygpOwotCi0JCWVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwID0gbmV3IEhhc2hNYXA8RU9iamVjdCwgTWFwPEVPYmplY3QsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPj4+KCk7Ci0JCUhhc2hTZXQgb2JqZWN0c1RvUmVtb3ZlID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlNYXA8RU9iamVjdCwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+PiByZWZNYXAgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRSZWZlcmVuY2VNYXAoZWxlbWVudCk7Ci0JCQlpZiAoIXJlZk1hcC5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVmTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChFbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlFT2JqZWN0IHJlZmVyZW5jZXIgPSAoRU9iamVjdCkgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJCUNvbGxlY3Rpb24gcmVmZXJlbmNlcyA9IChDb2xsZWN0aW9uKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCQlib29sZWFuIGIgPSBjb2xsZWN0T2JqZWN0c1RvUmVtb3ZlKG9iamVjdHNUb1JlbW92ZSwKLQkJCQkJCQllbGVtZW50LCByZWZlcmVuY2VyLCByZWZlcmVuY2VzKTsKLQkJCQkJaWYgKGIgfHwgZWxlbWVudHMuY29udGFpbnMocmVmZXJlbmNlcikKLQkJCQkJCQl8fCBpc0NvbnRhaW5lZEJ5RGVsZXRlZEVsZW1lbnQocmVmZXJlbmNlcikpIHsKLQkJCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghcmVmTWFwLmlzRW1wdHkoKSkKLQkJCQkJZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXAucHV0KGVsZW1lbnQsIHJlZk1hcCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgZW50cmllcyBmb3Igb2JqZWN0c1RvUmVtb3ZlIHRvIGVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdHNUb1JlbW92ZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJTWFwPEVPYmplY3QsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPj4gbWFwID0gZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXAuZ2V0KG9iaik7Ci0JCQlpZiAobWFwID09IG51bGwpIHsKLQkJCQltYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwLnB1dChvYmosIG1hcCk7Ci0JCQl9Ci0JCQlFT2JqZWN0IGNvbnRhaW5lciA9IG9iai5lQ29udGFpbmVyKCk7Ci0JCQlFUmVmZXJlbmNlIGNvbnRhaW5tZW50RmVhdHVyZSA9IG9iai5lQ29udGFpbm1lbnRGZWF0dXJlKCk7Ci0JCQlDb2xsZWN0aW9uIHJlZnMgPSAoQ29sbGVjdGlvbikgbWFwLmdldChjb250YWluZXIpOwotCQkJaWYgKHJlZnMgPT0gbnVsbCkgewotCQkJCXJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJcmVmcy5hZGQoY29udGFpbm1lbnRGZWF0dXJlKTsKLQkJCQltYXAucHV0KGNvbnRhaW5lciwgcmVmcyk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghcmVmcy5jb250YWlucyhjb250YWlubWVudEZlYXR1cmUpKSB7Ci0JCQkJCXJlZnMuYWRkKGNvbnRhaW5tZW50RmVhdHVyZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gcmVtb3ZlIGFsbCBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBlbGVtZW50OwotCQkJCU1hcCBvYmpUb1JlZnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWZvciAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yIGZlYXR1cmVJdGVyYXRvciA9IChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IpIGVPYmplY3QKLQkJCQkJCS5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgZmVhdHVyZUl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgZmVhdHVyZUl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJRVJlZmVyZW5jZSBlUmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIGZlYXR1cmVJdGVyYXRvcgotCQkJCQkJCS5mZWF0dXJlKCk7Ci0JCQkJCWlmIChlUmVmZXJlbmNlLmdldEVPcHBvc2l0ZSgpICE9IG51bGwpIHsKLQkJCQkJCUxpc3QgcmVmcyA9IChMaXN0KSBvYmpUb1JlZnNNYXAuZ2V0KGVPYmopOwotCQkJCQkJaWYgKHJlZnMgPT0gbnVsbCkgewotCQkJCQkJCXJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJb2JqVG9SZWZzTWFwLnB1dChlT2JqLCByZWZzKTsKLQkJCQkJCX0KLQkJCQkJCXJlZnMuYWRkKGVSZWZlcmVuY2UuZ2V0RU9wcG9zaXRlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCU1hcCBtYXAgPSAoTWFwKSBlbGVtZW50VG9SZW1vdmVkUmVmc01hcC5nZXQoZU9iamVjdCk7Ci0JCQkJaWYgKG1hcCA9PSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwLnB1dChlT2JqZWN0LCBvYmpUb1JlZnNNYXApOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIG1lcmdlIG9ialRvUmVmc01hcCB0byBtYXAKLQkJCQkJLy8KLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG9ialRvUmVmc01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCU9iamVjdCBvYmogPSBlbnRyeS5nZXRLZXkoKTsKLQkJCQkJCUNvbGxlY3Rpb24gcmVmcyA9IChDb2xsZWN0aW9uKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCQkJQ29sbGVjdGlvbiBleGlzdGluZ1JlZnMgPSAoQ29sbGVjdGlvbikgbWFwLmdldChvYmopOwotCQkJCQkJaWYgKGV4aXN0aW5nUmVmcyAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gcmVmcy5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlPYmplY3QgcmVmID0gKE9iamVjdCkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmICghZXhpc3RpbmdSZWZzLmNvbnRhaW5zKHJlZikpIHsKLQkJCQkJCQkJCWV4aXN0aW5nUmVmcy5hZGQocmVmKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJbWFwLnB1dChvYmosIHJlZnMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29sbGVjdGVkT2JqZWN0cwotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgZWxlbWVudCB0aGF0IHdpbGwgYmUgZGVsZXRlZCBieSB0aGlzIGNvbW1hbmQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0T2JqZWN0c1RvRGVsZXRlQ29udGVudChDb2xsZWN0aW9uIGNvbGxlY3RlZE9iamVjdHMsCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJLy8gdGhpcyBzcGVjaWFsIGhhbmRsaW5nIGlzIG5vIGxvbmdlciBuZWVkZWQgc2luY2UgYWZmZWN0ZWQKLQkJLy8gc3ViY2F0ZWdvcmllcyBhcmUgYWRkZWQKLQkJLy8gdG8gdGhlIGxpc3Qgb2YgZWxlbWVudHMgdG8gYmUgZGVsZXRlZAotCQkvLwotCQkvLyBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCS8vIC8vIGhhdmUgdG8gaGFuZGxlIEN1c3RvbUNhdGVnb3J5IHNwZWNpYWxseSBzaW5jZSBkZWxldGluZyBhCi0JCS8vIC8vIEN1c3RvbUNhdGVnb3J5IG1pZ2h0IHRyaWdlciBkZWxldGluZwotCQkvLyAvLyBpdHMgc3ViY2F0ZWdvcmllcyBldmVuIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhIEN1c3RvbUNhdGVnb3J5Ci0JCS8vIGFuZAotCQkvLyAvLyBpdHMgc3ViY2F0ZWdvcmllcyBpcwotCQkvLyAvLyBub24tY29udGFpbm1lbnQgcmVmZXJlbmNlCi0JCS8vIC8vCi0JCS8vIEl0ZXJhdG9yIGl0ZXIxID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGVsZW1lbnQsIGZhbHNlKSB7Ci0JCS8vCi0JCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02Mjg1OTY5OTIzMTM4NzgxNDM3TDsKLQkJLy8gcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBDb2xsZWN0aW9uIGNhdEVsZW1lbnRzID0gKChDdXN0b21DYXRlZ29yeSkgb2JqZWN0KQotCQkvLyAuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY2F0RWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJLy8gLmhhc05leHQoKTspIHsKLQkJLy8gT2JqZWN0IGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCS8vIGlmIChlIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJLy8gY2hpbGRyZW4uYWRkKGUpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gfTsKLQkJLy8gd2hpbGUgKGl0ZXIxLmhhc05leHQoKSkgewotCQkvLyBjb2xsZWN0ZWRPYmplY3RzLmFkZChpdGVyMS5uZXh0KCkpOwotCQkvLyB9Ci0JCS8vIH0KLQotCQlMaXN0IGNvbW1hbmRMaXN0ZW5lcnMgPSBQcm92aWRlcnMKLQkJCQkuZ2V0Q29tbWFuZExpc3RlbmVycyhEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5jbGFzcyk7Ci0JCWlmIChjb21tYW5kTGlzdGVuZXJzICE9IG51bGwgJiYgIWNvbW1hbmRMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21tYW5kTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjbWRMaXN0ZW5lciA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChjbWRMaXN0ZW5lciBpbnN0YW5jZW9mIElEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZExpc3RlbmVyKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQkoKElEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZExpc3RlbmVyKSBjbWRMaXN0ZW5lcikKLQkJCQkJCQkJLmNvbGxlY3RPYmplY3RzVG9EZWxldGVDb250ZW50KAotCQkJCQkJCQkJCWNvbGxlY3RlZE9iamVjdHMsIGVsZW1lbnQpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmVmZXJlbmNlcygpIHsKLQkJaWYgKHJlZlJlbW92ZWQpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHJlbW92ZWRSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXJlbW92ZWRSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlZFJlZmVyZW5jZXMuY2xlYXIoKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50VG9SZW1vdmVkUmVmc01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlNZXRob2RFbGVtZW50IHJlZmVyZW5jZWQgPSAoTWV0aG9kRWxlbWVudCkgZW50cnkuZ2V0S2V5KCk7Ci0JCQlpZiAoY2FuUmVtb3ZlUmVmZXJlbmNlcyhyZWZlcmVuY2VkKSkgewotCQkJCU1hcCByZW1vdmVkUmVmTWFwID0gKE1hcCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVtb3ZlZFJlZk1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlFT2JqZWN0IHJlZmVyZW5jZXIgPSAoRU9iamVjdCkgZW50LmdldEtleSgpOwotCQkJCQlDb2xsZWN0aW9uIGZlYXR1cmVzID0gKENvbGxlY3Rpb24pIGVudC5nZXRWYWx1ZSgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXRlcjEuaGFzTmV4dCgpOykgewotCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyMQotCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQlMaXN0IGxpc3QgPSAoKExpc3QpIHJlZmVyZW5jZXIuZUdldChmZWF0dXJlKSk7Ci0KLQkJCQkJCQlpbnQgaW5kZXggPSBsaXN0LmluZGV4T2YocmVmZXJlbmNlZCk7Ci0JCQkJCQkJLy8gbGlzdC5yZW1vdmUoaW5kZXgpOwotCQkJCQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCQkJCQlsaXN0LnJlbW92ZShpbmRleCk7Ci0JCQkJCQkJCXJlbW92ZWRSZWZlcmVuY2VzLmFkZChuZXcgUmVmZXJlbmNlKHJlZmVyZW5jZXIsCi0JCQkJCQkJCQkJZmVhdHVyZSwgcmVmZXJlbmNlZCwgaW5kZXgpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpZiAoVG5nVXRpbC5ERUJVRykgewotCQkJCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJCQkucHJpbnRsbigiRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQucmVtb3ZlUmVmZXJlbmNlcygpOiBpbmRleD0iICsgaW5kZXggKyAiLCBzaXplPSIgKyBsaXN0LnNpemUoKSArICIsIHJlZmVyZW5jZXI9IiArIHJlZmVyZW5jZXIgKyAiLCByZWZlcmVuY2VkPSIgKyByZWZlcmVuY2VkICsgIiwgZmVhdHVyZT0iICsgZmVhdHVyZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJCQkJCQl9Ci0JCQkJCQkJCS8vIHdvcmstYXJvdW5kOiB0cnkgdG8gZmluZCB0aGUgcHJveHkgYW5kIHJlbW92ZQotCQkJCQkJCQkvLyBpdC4KLQkJCQkJCQkJLy8gVE9ETzoga2luZCBvZiBoYWNrLCBuZWVkcyByZXZpc2l0Ci0JCQkJCQkJCS8vCi0JCQkJCQkJCVN0cmluZyBndWlkID0gKChNZXRob2RFbGVtZW50KSByZWZlcmVuY2VkKQotCQkJCQkJCQkJCS5nZXRHdWlkKCk7Ci0JCQkJCQkJCWZpbmRfcHJveHk6IGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCQkJCQkJSW50ZXJuYWxFT2JqZWN0IHJlZiA9IChJbnRlcm5hbEVPYmplY3QpIGxpc3QKLQkJCQkJCQkJCQkJLmdldChpKTsKLQkJCQkJCQkJCVVSSSB1cmkgPSByZWYuZVByb3h5VVJJKCk7Ci0JCQkJCQkJCQlpZiAodXJpICE9IG51bGwKLQkJCQkJCQkJCQkJJiYgZ3VpZC5lcXVhbHModXJpLmZyYWdtZW50KCkpKSB7Ci0JCQkJCQkJCQkJbGlzdC5yZW1vdmUoaSk7Ci0JCQkJCQkJCQkJcmVtb3ZlZFJlZmVyZW5jZXMuYWRkKG5ldyBSZWZlcmVuY2UoCi0JCQkJCQkJCQkJCQlyZWZlcmVuY2VyLCBmZWF0dXJlLAotCQkJCQkJCQkJCQkJcmVmZXJlbmNlZCwgaSkpOwotCQkJCQkJCQkJCWJyZWFrIGZpbmRfcHJveHk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJlZmVyZW5jZXIuZVNldChmZWF0dXJlLCBudWxsKTsKLQkJCQkJCQlyZW1vdmVkUmVmZXJlbmNlcy5hZGQobmV3IFJlZmVyZW5jZShyZWZlcmVuY2VyLAotCQkJCQkJCQkJZmVhdHVyZSwgcmVmZXJlbmNlZCwgLTEpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChUbmdVdGlsLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJyZW1vdmVkUmVmZXJlbmNlczogc2l6ZT0iICsgcmVtb3ZlZFJlZmVyZW5jZXMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJYmF0Y2hDb21tYW5kLmdldE9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCgpLmNsZWFyKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlbW92ZWRSZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVmZXJlbmNlIHJlZiA9IChSZWZlcmVuY2UpIGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZi5nZXRGZWF0dXJlKCkgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UKSB7Ci0JCQkJYmF0Y2hDb21tYW5kCi0JCQkJCQkuYWRkRmVhdHVyZVZhbHVlKAotCQkJCQkJCQlyZWYuZ2V0T3duZXIoKSwKLQkJCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFLAotCQkJCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUKLQkJCQkJCQkJCQkuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQkJCWlmIChyZWYuZ2V0T3duZXIoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCS8vIEZpbGwgYmxhbmsgcHJlc2VudGF0aW9uIG5hbWUgb2YgZXh0ZW5kZWQvbG9jYWxseQotCQkJCQkvLyBjb250cmlidXRpbmcgYWN0aXZpdHkgd2l0aCBwcmVzZW50YXRpb24gbmFtZQotCQkJCQkvLyBmcm9tIGJhc2UgYWN0aXZpdHkgd2hlbiBiYXNlIGlzIGRlbGV0ZWQKLQkJCQkJLy8KLQkJCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSByZWYuZ2V0T3duZXIoKTsKLQkJCQkJVmFyaWFiaWxpdHlUeXBlIHZUeXBlID0gYWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCQlpZiAoKHZUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTIHx8IHZUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pCi0JCQkJCQkJJiYgU3RyVXRpbC5pc051bGwoYWN0LmdldFByZXNlbnRhdGlvbk5hbWUoKSkpIHsKLQkJCQkJCUFjdGl2aXR5IGJhc2UgPSAoQWN0aXZpdHkpIHJlZi5nZXRWYWx1ZSgpOwotCQkJCQkJYmF0Y2hDb21tYW5kCi0JCQkJCQkJCS5hZGRGZWF0dXJlVmFsdWUoCi0JCQkJCQkJCQkJYWN0LAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJCQkJCQkJCVByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoYmFzZSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChiYXRjaENvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQliYXRjaENvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0KLQkJcmVmUmVtb3ZlZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3Mgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJlc29sdmUgYWxsIHRhcmdldCBmZWF0dXJlcyBzbwotCSAqIG9wcG9zaXRlIGZlYXR1cmVzIG9mIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50IGFyZSBmdWxseSBsb2FkZWQuCi0JICogCi0JICogQHBhcmFtIGRlbGV0ZWRHVUlEcwotCSAqIAotCSAqIEBwYXJhbSBlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZE9wcG9zaXRlRmVhdHVyZXMoTGlzdCBvcHBvc2l0ZUZlYXR1cmVzLCBTZXQgZGVsZXRlZEdVSURzKSB7Ci0JCS8vCi0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlc3RvcmVSZWZlcmVuY2VzKExpc3QgcmVtb3ZlZFJlZmVyZW5jZXMpIHsKLQkJZm9yIChpbnQgaSA9IHJlbW92ZWRSZWZlcmVuY2VzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgcmVtb3ZlZFJlZmVyZW5jZXMuZ2V0KGkpOwotCQkJaWYgKHJlZi5mZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJTGlzdCBsaXN0ID0gKExpc3QpIHJlZi5vd25lci5lR2V0KHJlZi5mZWF0dXJlKTsKLQkJCQlpZiAocmVmLmluZGV4ICE9IC0xKSB7Ci0JCQkJCS8vIFRPRE86IG5lZWQgcmV2aXNpdHMKLQkJCQkJLy8KLQkJCQkJaWYgKCFsaXN0LmNvbnRhaW5zKHJlZi52YWx1ZSkpIHsKLQkJCQkJCWlmIChyZWYuaW5kZXggPCBsaXN0LnNpemUoKSkgewotCQkJCQkJCWxpc3QuYWRkKHJlZi5pbmRleCwgcmVmLnZhbHVlKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaWYgKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJCS5wcmludGxuKCJEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5yZW1vdmVSZWZlcmVuY2VzKCk6IGluZGV4PSIgKyByZWYuaW5kZXggKyAiLCBzaXplPSIgKyBsaXN0LnNpemUoKSArICIsIHJlZmVyZW5jZXI9IiArIHJlZi5vd25lciArICIsIHJlZmVyZW5jZWQ9IiArIHJlZi52YWx1ZSArICIsIGZlYXR1cmU9IiArIHJlZi5mZWF0dXJlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQkJCQkJfQotCQkJCQkJCWxpc3QuYWRkKHJlZi52YWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoVG5nVXRpbC5ERUJVRykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5yZW1vdmVSZWZlcmVuY2VzKCk6IHJlZmVyZW5jZSBhbHJlYWR5IGV4aXN0czogcmVmZXJlbmNlcj0iICsgcmVmLm93bmVyICsgIiwgcmVmZXJlbmNlZD0iICsgcmVmLnZhbHVlICsgIiwgZmVhdHVyZT0iICsgcmVmLmZlYXR1cmUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlsaXN0LmFkZChyZWYudmFsdWUpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmVmLm93bmVyLmVTZXQocmVmLmZlYXR1cmUsIHJlZi52YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlUmVmZXJlbmNlcygpIHsKLQkJaWYgKCFyZWZSZW1vdmVkKQotCQkJcmV0dXJuOwotCi0JCWJhdGNoQ29tbWFuZC51bmRvKCk7Ci0JCXJlc3RvcmVSZWZlcmVuY2VzKHJlbW92ZWRSZWZlcmVuY2VzKTsKLQotCQlyZWZSZW1vdmVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJbm90aWZ5UHJlVW5kbygpOwotCQl0cnkgewotCQkJc3VwZXIudW5kbygpOwotCQkJcmVzdG9yZVJlZmVyZW5jZXMoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCW5vdGlmeUZhaWx1cmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJaWYgKGV4ZWN1dGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENvbW1hbmRMaXN0ZW5lcihDb21tYW5kTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKCFjb21tYW5kTGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJY29tbWFuZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29tbWFuZExpc3RlbmVyKENvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQljb21tYW5kTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQ29tbWFuZExpc3RlbmVyIHsKLQkJdm9pZCBub3RpZnlFeGVjdXRlZChFdmVudE9iamVjdCBldmVudE9iamVjdCk7Ci0KLQkJdm9pZCBub3RpZnlGYWlsdXJlKEV2ZW50T2JqZWN0IGV2ZW50T2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlTmVzdGVkQ29tbWFuZHMoKSB7Ci0JCUxpc3QgbmVzdGVkQ29tbWFuZFByb3ZpZGVycyA9IEV4dGVuc2lvbk1hbmFnZXIKLQkJCQkuZ2V0TmVzdGVkQ29tbWFuZFByb3ZpZGVycygpOwotCQlpZiAoIW5lc3RlZENvbW1hbmRQcm92aWRlcnMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJCW5lc3RlZENvbW1hbmRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5lc3RlZENvbW1hbmRQcm92aWRlcnMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJSU5lc3RlZENvbW1hbmRQcm92aWRlciBjbWRQcm92aWRlciA9IChJTmVzdGVkQ29tbWFuZFByb3ZpZGVyKSBpdGVyCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUNvbW1hbmQgY21kID0gY21kUHJvdmlkZXIucmVtb3ZlUmVsYXRlZE9iamVjdHMoZWxlbWVudHMsCi0JCQkJCQkJCXRoaXMpOwotCQkJCQkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQkJCQljbWQuZXhlY3V0ZSgpOwotCQkJCQkJCW5lc3RlZENvbW1hbmRzLmFkZChjbWQpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBtb2RpZmllZFJlc291cmNlczIKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29sbGVjdE5lc3RlZENvbW1hbmRSZXNvdXJjZXMoU2V0PFJlc291cmNlPiBtb2RpZmllZFJlc291cmNlcykgewotCQkKLQkJaWYgKG5lc3RlZENvbW1hbmRzICE9IG51bGwgJiYgIW5lc3RlZENvbW1hbmRzLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IG5lc3RlZENvbW1hbmRzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJQ29tbWFuZCBjbWQgPSAoQ29tbWFuZCkgbmVzdGVkQ29tbWFuZHMuZ2V0KGkpOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChjbWQgaW5zdGFuY2VvZiBJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIHsKLQkJCQkJCUNvbGxlY3Rpb24gcmVzb3VyY2VzID0gKChJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIGNtZCkKLQkJCQkJCQkJLmdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCQkJCQlpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwocmVzb3VyY2VzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbjxEZXNjcmlwdG9yPiBnZXREZXNjcmlwdG9yc1RvRGVsZXRlKCkgewotCQlyZXR1cm4gZGVzY3JpcHRvcnM7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRXhlY3V0ZWQoKSB7Ci0JCXJldHVybiBleGVjdXRlZDsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNWY2N2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0Z1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBBIGNvbW1hbmQgc3RhY2sgdGhhdCB0cmllcyBpdHMgYmVzdCB0byBmdWxseSByZXZlcnQgdG8gaXRzIGluaXRpYWwgc3RhdGUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGdWxseVJldmVydGlibGVDb21tYW5kU3RhY2sgZXh0ZW5kcyBCYXNpY0NvbW1hbmRTdGFjayB7Ci0KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBJRXJyb3JSZXBvcnRlciB7Ci0JCXZvaWQgc2hvd0Vycm9yKFN0cmluZyBtc2cpOwotCX0KLQotCXByaXZhdGUgSUVycm9yUmVwb3J0ZXIgZXJyUmVwb3J0ZXI7Ci0KLQlwcml2YXRlIEFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JcHVibGljIEZ1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjayhBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQl0aGlzLmFjdGlvbk1nciA9IGFjdGlvbk1ncjsKLQl9Ci0KLQlwdWJsaWMgRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrKEFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLAotCQkJSUVycm9yUmVwb3J0ZXIgZXJyUmVwb3J0ZXIpIHsKLQkJdGhpcyhhY3Rpb25NZ3IpOwotCQl0aGlzLmVyclJlcG9ydGVyID0gZXJyUmVwb3J0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JSZXBvcnRlcihJRXJyb3JSZXBvcnRlciBlcnJSZXBvcnRlcikgewotCQl0aGlzLmVyclJlcG9ydGVyID0gZXJyUmVwb3J0ZXI7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZWdpc3RlckFzTW9kaWZpZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCVNldDxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXMgPSBUbmdVdGlsLmdldE1vZGlmaWVkUmVzb3VyY2VzKGNvbW1hbmQpOwotCQlpZighbW9kaWZpZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2RpZmllZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJYWN0aW9uTWdyLnJlZ2lzdGVyQXNNb2RpZmllck9mKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGRvRXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJaWYgKCFjb21tYW5kLmNhblVuZG8oKSkKLQkJCXJldHVybiBmYWxzZTsgLy8gdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90Ci0JCS8vIGV4ZWN1dGUgY29tbWFuZCB0aGF0IGNhbm5vdCBkZSB1bmRvbmUiKTsKLQkJc3VwZXIuZXhlY3V0ZShjb21tYW5kKTsKLQkJCi0JCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIEFjdGl2aXR5RHJvcENvbW1hbmQKLQkJLy8KLQkJLy8gVE9ETzogYWxsIGNvbW1hbmRzIG11c3QgcmV0dXJuIGEgY29ycmVjdCB2YWx1ZSBpbiBnZXRBZmZlY3RlZE9iamVjdCgpCi0JCS8vIGlmIGdldEFmZmVjdGVkT2JqZWN0KCkgcmV0dXJuIGFuIGVtcHR5IGNvbGxlY3Rpb24sIHRoZSBhY3Rpb24gbWFuYWdlcgotCQkvLyB3aWxsIG5vdCByZWdpc3RlciBpdCBhcyBhIG1vZGlmaWVyIG9mIHRoZSByZXNvdXJjZXMgcmV0dXJuZWQgYnkgZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCQkvLyBhbmQgdGhlIGVkaXRvciBtaWdodCBub3QgYmUgbWFya2VkIGRpcnR5IGFzIHRoZSByZXN1bHQuCi0JCS8vCi0JCWlmKGNvbW1hbmQgaW5zdGFuY2VvZiBCU0RyYWdBbmREcm9wQ29tbWFuZCAmJiBjb21tYW5kLmdldEFmZmVjdGVkT2JqZWN0cygpLmlzRW1wdHkoKSkgewotCQkJaWYodG9wICE9IC0xKSB7Ci0JCQkJY29tbWFuZExpc3QucmVtb3ZlKHRvcC0tKTsKLQkJCQlpZih0b3AgIT0gLTEpIHsKLQkJCQkJbW9zdFJlY2VudENvbW1hbmQgPSAoQ29tbWFuZCkgY29tbWFuZExpc3QuZ2V0KHRvcCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQltb3N0UmVjZW50Q29tbWFuZCA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlib29sZWFuIHJldCA9IGdldE1vc3RSZWNlbnRDb21tYW5kKCkgIT0gbnVsbDsKLQkJaWYgKHJldCAmJiBhY3Rpb25NZ3IgIT0gbnVsbCkgewkJCQotCQkJcmVnaXN0ZXJBc01vZGlmaWVyKGNvbW1hbmQpOwotCQl9Ci0JCW5vdGlmeUxpc3RlbmVycyhuZXcgQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50KHRoaXMsCi0JCQkJQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50LkVYRUNVVEVEKSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJZG9FeGVjdXRlKGNvbW1hbmQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCXN1cGVyLnJlZG8oKTsKLQkJbm90aWZ5TGlzdGVuZXJzKG5ldyBDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQodGhpcywKLQkJCQlDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQuRVhFQ1VURUQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoY2FuVW5kbygpKSB7Ci0JCQlDb21tYW5kIGNvbW1hbmQgPSAoQ29tbWFuZCkgY29tbWFuZExpc3QuZ2V0KHRvcC0tKTsKLQkJCXRyeSB7Ci0JCQkJY29tbWFuZC51bmRvKCk7Ci0JCQkJbW9zdFJlY2VudENvbW1hbmQgPSBjb21tYW5kOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5sb2cobmV3IFdyYXBwZWRFeGNlcHRpb24oCi0JCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9JZ25vcmVFeGNlcHRpb25fZXhjZXB0aW9uIiksIGV4Y2VwdGlvbikuZmlsbEluU3RhY2tUcmFjZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJbW9zdFJlY2VudENvbW1hbmQgPSBudWxsOwotCQkJCXRvcCsrOwotCi0JCQkJaWYgKGVyclJlcG9ydGVyICE9IG51bGwpIHsKLQkJCQkJT2JqZWN0W10gb2JqZWN0ID0gbmV3IE9iamVjdFsxXTsKLQkJCQkJb2JqZWN0WzBdID0gY29tbWFuZDsKLQkJCQkJb2JqZWN0WzFdID0gZXhjZXB0aW9uOwotCQkJCQllcnJSZXBvcnRlci5zaG93RXJyb3IoTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMudW5kb0NvbW1hbmRFcnJvcl9tc2csIG9iamVjdCkpOyAKLQkJCQl9Ci0JCQl9Ci0JCQlub3RpZnlMaXN0ZW5lcnMobmV3IENvbW1hbmRTdGFja0NoYW5nZWRFdmVudCh0aGlzLAotCQkJCQlDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQuVU5ETykpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdW5kb0FsbCgpIHsKLQkJdHJ5IHsKLQkJCXdoaWxlIChjYW5VbmRvKCkpIHsKLQkJCQlDb21tYW5kIGNvbW1hbmQgPSAoQ29tbWFuZCkgY29tbWFuZExpc3QuZ2V0KHRvcC0tKTsKLQkJCQl0cnkgewotCQkJCQljb21tYW5kLnVuZG8oKTsKLQkJCQkJbW9zdFJlY2VudENvbW1hbmQgPSBjb21tYW5kOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5sb2cobmV3IFdyYXBwZWRFeGNlcHRpb24oCi0JCQkJCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFN0cmluZygiX1VJX0lnbm9yZUV4Y2VwdGlvbl9leGNlcHRpb24iKSwgZXhjZXB0aW9uKS5maWxsSW5TdGFja1RyYWNlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJbW9zdFJlY2VudENvbW1hbmQgPSBudWxsOwotCQkJCQl0b3ArKzsKLQotCQkJCQlpZiAoZXJyUmVwb3J0ZXIgIT0gbnVsbCkgewotCQkJCQkJLy8gZXJyUmVwb3J0ZXIuc2hvd0Vycm9yKCJDYW5ub3QgdW5kbyBjb21tYW5kOiAnIiArCi0JCQkJCQkvLyBjb21tYW5kICsgIicsIGV4Y2VwdGlvbjogIiArIGV4Y2VwdGlvbik7Ci0JCQkJCQlPYmplY3RbXSBvYmplY3QgPSBuZXcgT2JqZWN0WzFdOwotCQkJCQkJb2JqZWN0WzBdID0gY29tbWFuZDsKLQkJCQkJCW9iamVjdFsxXSA9IGV4Y2VwdGlvbjsKLQkJCQkJCWVyclJlcG9ydGVyCi0JCQkJCQkJCS5zaG93RXJyb3IoTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMudW5kb0NvbW1hbmRFcnJvcl9tc2csIG9iamVjdCkpOyAKLQkJCQkJfQotCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlub3RpZnlMaXN0ZW5lcnMobmV3IENvbW1hbmRTdGFja0NoYW5nZWRFdmVudCh0aGlzLAotCQkJCQlDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQuVU5ET19BTEwpKTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUxpc3RlbmVycyhFdmVudE9iamVjdCBldmVudCkgewotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkoKENvbW1hbmRTdGFja0xpc3RlbmVyKSBpLm5leHQoKSkuY29tbWFuZFN0YWNrQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoKSB7Ci0JCS8vCi0JfQotCi0JcHVibGljIHZvaWQgc2F2ZUlzRG9uZSgpIHsKLQkJc3VwZXIuc2F2ZUlzRG9uZSgpOwotCQlub3RpZnlMaXN0ZW5lcnMobmV3IENvbW1hbmRTdGFja0NoYW5nZWRFdmVudCh0aGlzLAotCQkJCUNvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5TQVZFRCkpOwotCQljb21tYW5kTGlzdC5jbGVhcigpOwotCQl0b3AgPSAtMTsKLQkJc2F2ZUluZGV4ID0gLTE7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2sjaXNTYXZlTmVlZGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVOZWVkZWQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1NhdmVOZWVkZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JQWN0aW9uTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lBY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZjA3ZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lBY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGNsYXNzIGlzIHVzZWQgdG8gc3VwcG9ydCB1bmRvIG9wZXJhdGlvbnMgaW4gdGhlCi0gKiBmb3JtIGVkaXRvcnMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGlvbk1hbmFnZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VUID0gTm90aWZpY2F0aW9uLlNFVDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERCA9IE5vdGlmaWNhdGlvbi5BREQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkUgPSBOb3RpZmljYXRpb24uUkVNT1ZFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREX01BTlkgPSBOb3RpZmljYXRpb24uQUREX01BTlk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkVfTUFOWSA9IE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWTsKLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBhY3Rpb24gYXMgZGVzY3JpYmVkIGluIHBhcmFtZXRlcnMKLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uVHlwZQotCSAqICAgICAgICAgICAgb25lIG9mIHRoZSBhYm92ZSBkZWZpbmVkIGFjdGlvbiBjb25zdGFudHMKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHBlcmZvcm0gYWN0aW9uIHVwb24KLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgdGhlIGZlYXR1cmUgdG8gYmUgbW9kaWZpZWQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBmZWF0dXJlIHZhbHVlCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBzcGVjaWZ5IC0xIGlmIG5vIGluZGV4Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzdWNjZXNzZnVsbCwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UKLQkgKi8KLQlib29sZWFuIGRvQWN0aW9uKGludCBhY3Rpb25UeXBlLCBFT2JqZWN0IG9iamVjdCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gY29tbWFuZAotCSAqIAotCSAqIEBwYXJhbSBjbWQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHN1Y2Nlc3NmdWxsLCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZQotCSAqLwotCWJvb2xlYW4gZXhlY3V0ZShJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY21kKTsKLQotCXZvaWQgdW5kbygpOwotCi0Jdm9pZCByZWRvKCk7Ci0KLQlib29sZWFuIHVuZG9BbGwoKTsKLQotCXZvaWQgc2F2ZUlzRG9uZSgpOwotCi0JYm9vbGVhbiBpc1NhdmVOZWVkZWQoKTsKLQotCS8qKgotCSAqIEdldHMgcmVzb3VyY2VzIGZpcnN0IG1vZGlmaWVkIGJ5IHRoaXMgYWN0aW9uIG1hbmFnZXIKLQkgKi8KLQlDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0KLQl2b2lkIGRpc3Bvc2UoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMDcxMmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbW1hbmRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgMTcsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kTGlzdGVuZXIgZXh0ZW5kcyBJQ29tbWFuZExpc3RlbmVyIHsKLQkvKioKLQkgKiBDb2xsZWN0cyBvYmplY3RzIHdob3NlIGNvbnRlbnQgbXVzdCBiZSBkZWxldGVkIGlmIHRoZSBnaXZlbiBlbGVtZW50IGlzIGRlbGV0ZWQuCi0JICogCi0JICogQHBhcmFtIGNvbGxlY3RlZE9iamVjdHMKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0aGF0IHdpbGwgYmUgZGVsZXRlZC4KLQkgKi8KLQl2b2lkIGNvbGxlY3RPYmplY3RzVG9EZWxldGVDb250ZW50KENvbGxlY3Rpb24gY29sbGVjdGVkT2JqZWN0cywgTWV0aG9kRWxlbWVudCBlbGVtZW50KTsJCi0KLQkvKioKLQkgKiBDb2xsZWN0cyBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWQgaWYgPGNvZGU+ZWxlbWVudFRvRGVsZXRlPC9jb2RlPiB3aWxsIGJlIHJlbW92ZWQgZnJvbSAKLQkgKiA8Y29kZT5yZWZlcmVuY2VzPC9jb2RlPiBvZiA8Y29kZT5yZWZlcmVuY2VyPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0c1RvUmVtb3ZlIG91dHB1dCAKLQkgKiBAcGFyYW0gcmVmZXJlbmNlciBlbGVtZW50IHRoYXQgcmVmZXJlbmNlcyB0byBlbGVtZW50VG9EZWxldGUKLQkgKiBAcGFyYW0gcmVmZXJlbmNlcyBjb2xsZWN0aW9uIG9mIHtAbGluayBFUmVmZXJlbmNlfSB0aGF0IGNvbnRhaW5zIGVsZW1lbnRUb0RlbGV0ZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBvbmUgb2YgdGhlIGNvbGxlY3RlZCBvYmplY3RzIGlzIHRoZSA8Y29kZT5yZWZlcmVuY2VyPC9jb2RlPiBvciBjb250YWluZXIgb2YgPGNvZGU+cmVmZXJlbmNlcjwvY29kZT4KLQkgKi8KLQlib29sZWFuIGNvbGxlY3RPYmplY3RzVG9SZW1vdmUoQ29sbGVjdGlvbiBvYmplY3RzVG9SZW1vdmUsIEVPYmplY3QgZWxlbWVudFRvRGVsZXRlLCBFT2JqZWN0IHJlZmVyZW5jZXIsIENvbGxlY3Rpb24gcmVmZXJlbmNlcyk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JSW50ZXJhY3RpdmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JSW50ZXJhY3RpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNiMWMwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSUludGVyYWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMywgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSW50ZXJhY3RpdmUgewotCXZvaWQgc2V0VXNlckludGVyYWN0aW9uSGFuZGxlcihJVXNlckludGVyYWN0aW9uSGFuZGxlciBoYW5kbGVyKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JTW9kaWZ5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lNb2RpZnlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YjQ0OTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lNb2RpZnlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kaWZ5Q29tbWFuZCB7Ci0JCi0JQ29sbGVjdGlvbiBnZXRNb2RpZmllZE9iamVjdHMoKTsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JTmVzdGVkQ29tbWFuZFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSU5lc3RlZENvbW1hbmRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDU4ZTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JTmVzdGVkQ29tbWFuZFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotCi0vKioKLSAqIFByb3ZpZGVzIG5lc3RlZCBjb21tYW5kcyB0byBleGVjdXRlIHJpZ2h0IGFmdGVyIHRoZSBleGVjdXRpb24gb2YgdGhlIG1haW4gY29tbWFuZAotICogIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgMTcsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU5lc3RlZENvbW1hbmRQcm92aWRlciB7Ci0JQ29tbWFuZCBjcmVhdGVSZWxhdGVkT2JqZWN0cyhDb2xsZWN0aW9uIGNyZWF0ZWRFbGVtZW50cywgQ29tbWFuZCBjcmVhdGVDb21tYW5kKTsKLQlDb21tYW5kIHJlbW92ZVJlbGF0ZWRPYmplY3RzKENvbGxlY3Rpb24gZGVsZXRlZEVsZW1lbnRzLCBDb21tYW5kIGRlbGV0ZUNvbW1hbmQpOwotCUNvbW1hbmQgY3JlYXRlTmVzdGVkQ29tbWFuZChDb21tYW5kIGNvbW1hbmQpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lSZXNvdXJjZUF3YXJlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lSZXNvdXJjZUF3YXJlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDUwZDYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JUmVzb3VyY2VBd2FyZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgcmVzb3VyY2UgYXdhcmUgY29tbWFuZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCUNvbGxlY3Rpb248UmVzb3VyY2U+IGdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JVXNlckludGVyYWN0aW9uSGFuZGxlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lVc2VySW50ZXJhY3Rpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOTE5NWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lVc2VySW50ZXJhY3Rpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIGhhbmRsZSB1c2VyIGludGVyYWN0aW9ucyBkdXJpbmcgY29tbWFuZCBleGVjdXRpb24KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMywgMjAwNgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHsKLQkvKioKLQkgKiBEZWxpdmVycyBtZXNzYWdlcyB0byB1c2VycwotCSAqIAotCSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDI2LCAyMDA2Ci0JICogQHNpbmNlIDEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIElNZXNzZW5nZXIgewotCQkvKioKLQkJICogU2hvd3MgaW5mb3JtYXRpb24gbWVzc2FnZQotCQkgKiAKLQkJICogQHBhcmFtIHRpdGxlCi0JCSAqIEBwYXJhbSBtc2cKLQkJICovCi0JCXZvaWQgc2hvd0luZm8oU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKTsKLQotCQkvKioKLQkJICogU2hvd3Mgd2FybmluZyBtZXNzYWdlCi0JCSAqIAotCQkgKiBAcGFyYW0gdGl0bGUKLQkJICogQHBhcmFtIG1zZwotCQkgKi8KLQkJdm9pZCBzaG93V2FybmluZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpOwotCi0JCS8qKgotCQkgKiBTaG93cyB3YXJuaW5nIG1lc3NhZ2Ugd2l0aCByZWFzb24KLQkJICogCi0JCSAqIEBwYXJhbSB0aXRsZQotCQkgKiBAcGFyYW0gbXNnCi0JCSAqIEBwYXJhbSBzdHJpbmcKLQkJICovCi0JCXZvaWQgc2hvd1dhcm5pbmcoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uKTsKLQotCQkvKioKLQkJICogU2hvd3MgZXJyb3IgbWVzc2FnZQotCQkgKiAKLQkJICogQHBhcmFtIHRpdGxlCi0JCSAqIEBwYXJhbSBtc2cKLQkJICovCi0JCXZvaWQgc2hvd0Vycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZyk7Ci0KLQkJLyoqCi0JCSAqIFNob3dzIGVycm9yIG1lc3NhZ2Ugd2l0aCBzdGF0dXMKLQkJICogCi0JCSAqIEBwYXJhbSB0aXRsZQotCQkgKiBAcGFyYW0gbXNnCi0JCSAqIEBwYXJhbSBzdGF0dXMKLQkJICovCi0JCXZvaWQgc2hvd0Vycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgSVN0YXR1cyBzdGF0dXMpOwotCi0JCS8qKgotCQkgKiBTaG93cyBlcnJvciBtZXNzYWdlIHdpdGggcmVhc29uIGFuZCBleGNlcHRpb24KLQkJICogCi0JCSAqIEBwYXJhbSB0aXRsZQotCQkgKiBAcGFyYW0gbXNnCi0JCSAqIEBwYXJhbSByZWFzb24KLQkJICogQHBhcmFtIGV4Y2VwdGlvbgotCQkgKi8KLQkJdm9pZCBzaG93RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLAotCQkJCUV4Y2VwdGlvbiBleGNlcHRpb24pOwotCi0JCXZvaWQgc2hvd0Vycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGRldGFpbHMsCi0JCQkJRXhjZXB0aW9uIGV4Y2VwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQWN0aW9uIGNvbnN0YW50IGZvciB1c2VyIGFjY2VwdGFuY2UKLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IEFDVElPTl9PSyA9IDA7Ci0KLQkvKioKLQkgKiBBY3Rpb24gY29uc3RhbnQgZm9yIHVzZXIgY2FuY2VsbGF0aW9uCi0JICovCi0Jc3RhdGljIGZpbmFsIGludCBBQ1RJT05fQ0FOQ0VMID0gMTsKLQotCS8qKgotCSAqIEFjdGlvbiBjb25zdGFudCBmb3IgcmV0cnkKLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IEFDVElPTl9SRVRSWSA9IDI7Ci0KLQkvKioKLQkgKiBBY3Rpb24gY29uc3RhbnQgZm9yIGFib3J0Ci0JICovCi0Jc3RhdGljIGZpbmFsIGludCBBQ1RJT05fQUJPUlQgPSAzOwotCQotCXN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1lFUyA9IDQ7Ci0JCi0Jc3RhdGljIGZpbmFsIGludCBBQ1RJT05fTk8gPSA1OwotCi0JLyoqCi0JICogU2VsZWN0cyBvYmplY3RzIGZyb20gdGhlIHNwZWNpZmllZCBsaXN0IDxjb2RlPm9iamVjdHNUb1NlbGVjdDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIG9iamVjdHNUb1NlbGVjdAotCSAqICAgICAgICAgICAgb2JqZWN0cyBmb3IgdXNlciB0byBzZWxlY3QKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlcgotCSAqICAgICAgICAgICAgbGFiZWwgcHJvdmlkZXIgdXNlZCB0byBkaXNwbGF5IHRoZSBnaXZlbiBvYmplY3RzIHRvIHVzZXIKLQkgKiBAcGFyYW0gbXVsdGlwbGUKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+IHdpbGwgYWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9uLCBzaW5nbGUKLQkgKiAgICAgICAgICAgIHNlbGVjdGlvbiBpZiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSB0aXRsZSBvZiB0aGlzIHNlbGVjdGlvbiBhY3Rpb24gdG8gZGlzcGxheSB0byB1c2VyCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheSB0byB1c2VyCi0JICogQHJldHVybiB0aGUgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBlbGVtZW50cywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgICAgICAgIHRoZSBzZWxlY3Rpb24gd2FzIGNhbmNlbGVkLgotCSAqLwotCUxpc3Qgc2VsZWN0KExpc3Qgb2JqZWN0c1RvU2VsZWN0LCBJSXRlbUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkJCWJvb2xlYW4gbXVsdGlwbGUsIExpc3QgaW50aXRpYWxTZWxlY3Rpb24sIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZyk7Ci0KLQkvKioKLQkgKiBTZWxlY3RzIG9ubHkgb25lIGFjdGlvbiBmcm9tIHRoZSBnaXZlbiBhcnJheSBvZiBhY3Rpb25zLiBUaGUgYWN0aW9ucyBtdXN0Ci0JICogYmUgdGhlIGNvbnN0YW50cyB7QGxpbmsgI0FDVElPTl9BQk9SVH0sIHtAbGluayAjQUNUSU9OX0NBTkNFTH0sCi0JICoge0BsaW5rICNBQ1RJT05fT0t9LCB7QGxpbmsgI0FDVElPTl9SRVRSWX0sIEFDVElPTl9YWFgKLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9ucwotCSAqIEBwYXJhbSB0aXRsZQotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogQHJldHVybgotCSAqLwotCWludCBzZWxlY3RPbmUoaW50W10gYWN0aW9ucywgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBJU3RhdHVzIHN0YXR1cyk7Ci0KLQkvKioKLQkgKiBSZXF1ZXN0cyB1c2VyIGlucHV0cy4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiBAcGFyYW0gbXNnCi0JICogQHBhcmFtIHVzZXJJbnB1dHMKLQkgKiAgICAgICAgICAgIGxpc3Qgb2Yge0BsaW5rIFVzZXJJbnB1dCB1c2VyIGlucHV0c30gdGhhdCBoYXZlIGluZm9ybWF0aW9uCi0JICogICAgICAgICAgICBhYm91dCBpbnB1dCByZXF1ZXN0cyBhbmQgcmVmZXJlbmNlIHRvIHRoZSBpbnB1dC4gVGhlIGlucHV0Ci0JICogICAgICAgICAgICByZWZlcmVuY2Ugc2hvdWxkIGJlIHNldCB0byB0aGUgb2JqZWN0IHRoYXQgdXNlciBzcGVjaWZpZWQgb3IKLQkgKiAgICAgICAgICAgIHNlbGVjdGVkLgotCSAqIEByZXR1cm4gZmFsc2UgaWYgdXNlciBjYW5jZWxsZWQgdGhpcyByZXF1ZXN0Ci0JICovCi0JYm9vbGVhbiByZXF1ZXN0SW5wdXQoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBMaXN0PFVzZXJJbnB1dD4gdXNlcklucHV0cyk7Ci0KLQkvKioKLQkgKiBHZXRzIFVJIGNvbnRleHQKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBVSSBjb250ZXh0Ci0JICovCi0JT2JqZWN0IGdldFVJQ29udGV4dCgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgbWVzc2VuZ2VyCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUlNZXNzZW5nZXIgZ2V0TWVzc2VuZ2VyKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTWV0aG9kRWxlbWVudEFkZENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50QWRkQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjRhOTFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50QWRkQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklUZXh0UmVmZXJlbmNlUmVwbGFjZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1lc3NlbmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWlzYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5OYW1lQ2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbC5VbmlxdWVuZXNzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5kb21haW4uVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuTWVzc2FnZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGFkZCBhIG1ldGhvZCBlbGVtZW50IHRvIGEgY29udGFpbmluZyBtZXRob2QgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCBleHRlbmRzIENvbW1hbmRXcmFwcGVyIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxFQ2xhc3MsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPj4gdHlwZVRvRXhjbHVkZWRGZWF0dXJlc0Zyb21DaGVjayA9IG5ldyBIYXNoTWFwPEVDbGFzcywgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+PigpOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBleGNsdWRlRnJvbUNoZWNrKEVDbGFzcyB0eXBlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZmVhdHVyZXMgPSB0eXBlVG9FeGNsdWRlZEZlYXR1cmVzRnJvbUNoZWNrLmdldCh0eXBlKTsKLQkJaWYoZmVhdHVyZXMgPT0gbnVsbCkgewotCQkJZmVhdHVyZXMgPSBuZXcgSGFzaFNldDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7Ci0JCX0KLQkJZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNhblVuZG8gPSB0cnVlOwotCi0JcHJvdGVjdGVkIEFkZENvbW1hbmQgYWRkQ29tbWFuZDsKLQotCS8vIHByb3RlY3RlZCBNYXAgZWxlbWVudFRvTmV3TmFtZU1hcDsKLQlwcm90ZWN0ZWQgTWFwIGVsZW1lbnRUb09sZFBsdWdpbk1hcDsKLQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZVhSZWZSZXF1aXJlZDsKLQotCXByb3RlY3RlZCBNZXRob2RQbHVnaW4gb3duZXJQbHVnaW47Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGFkZExpc3Q7Ci0KLQlwcm90ZWN0ZWQgTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuT0ssICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcnVuV2l0aFByb2dyZXNzOwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdDxFU3RydWN0dXJhbEZlYXR1cmU+IGZlYXR1cmVzVG9DaGVjazsKLQotCXByaXZhdGUgQXJyYXlMaXN0IG5lc3RlZENvbW1hbmRzOwotCi0JcHJpdmF0ZSBIYXNoU2V0IG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHVibGljIE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKENvbW1hbmQgY29tbWFuZCkgewotCQl0aGlzKGNvbW1hbmQsIHRydWUpOwotCX0KLQotCXB1YmxpYyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZChDb21tYW5kIGNvbW1hbmQsIGJvb2xlYW4gcnVuV2l0aFByb2dyZXNzKSB7Ci0JCXN1cGVyKGNvbW1hbmQpOwotCQlhZGRDb21tYW5kID0gKEFkZENvbW1hbmQpIFRuZ1V0aWwudW53cmFwKGNvbW1hbmQpOwotCQlzZXRSdW5XaXRoUHJvZ3Jlc3MocnVuV2l0aFByb2dyZXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSdW5XaXRoUHJvZ3Jlc3MoYm9vbGVhbiBydW5XaXRoUHJvZ3Jlc3MpIHsKLQkJdGhpcy5ydW5XaXRoUHJvZ3Jlc3MgPSBydW5XaXRoUHJvZ3Jlc3M7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIGNhblVuZG87Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXIjZ2V0UmVzdWx0KCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUVycm9yKElTdGF0dXMgZXJyb3JTdGF0dXMpIHsKLQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dFcnJvcihnZXRMYWJlbCgpLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5jcmVhdGVFbGVtZW50RXJyb3JfbXNnLCBlcnJvclN0YXR1cyk7Ci0JCXN0YXR1cy5hZGQoZXJyb3JTdGF0dXMpOwotCQlzdGF0dXMuYWRkQWxsKGVycm9yU3RhdHVzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewkKLQkJLy8gZGlzcG9zZSB0aGUgbmVzdGVkIGNvbW1hbmRzCi0JCWlmIChuZXN0ZWRDb21tYW5kcyAhPSBudWxsICYmICFuZXN0ZWRDb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSBuZXN0ZWRDb21tYW5kcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCUNvbW1hbmQgY21kID0gKENvbW1hbmQpIG5lc3RlZENvbW1hbmRzLmdldChpKTsKLQkJCQl0cnkgewotCQkJCQljbWQuZGlzcG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJT2JqZWN0IHNoZWxsID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvbnRleHQoKTsKLQkJLy8gQ2hlY2sgd2hldGhlciB0aGUgb3duZXIgcmVzb3VyY2UgY2FuIGJlIG1vZGlmaWVkLgotCQkvLwotCQlDb2xsZWN0aW9uIHJlc291cmNlc1RvQ2hhbmdlID0gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQkJSVN0YXR1cyBleGVjU3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KAotCQkJCXJlc291cmNlc1RvQ2hhbmdlLCBzaGVsbCk7Ci0JCWlmICghZXhlY1N0YXR1cy5pc09LKCkpIHsKLQkJCWhhbmRsZUVycm9yKGV4ZWNTdGF0dXMpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWV4ZWNTdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tDb25maWd1cmF0aW9uc1RvVXBkYXRlKAotCQkJCWFkZENvbW1hbmQsIHNoZWxsKTsKLQkJaWYgKCFleGVjU3RhdHVzLmlzT0soKSkgewotCQkJaGFuZGxlRXJyb3IoZXhlY1N0YXR1cyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHdpbGxTYXZlTW9kaWZpZWRSZXNvdXJjZXMoKQotCQkJCSYmICFVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tPdXRPZlN5bmNoKHJlc291cmNlc1RvQ2hhbmdlKSkgewotCQkJc3RhdHVzLmFkZChTdGF0dXMuQ0FOQ0VMX1NUQVRVUyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBpZighY2hlY2tGb2xkZXIoc2hlbGwpKSB7Ci0JCS8vIHJldHVybjsKLQkJLy8gfQotCi0JCWRvQWRkKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXIjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJdW5kb05lc3RlZENvbW1hbmRzKCk7Ci0JCXN1cGVyLnVuZG8oKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgdW5kb05lc3RlZENvbW1hbmRzKCkgewotCQlpZiAobmVzdGVkQ29tbWFuZHMgIT0gbnVsbCAmJiAhbmVzdGVkQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gbmVzdGVkQ29tbWFuZHMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlDb21tYW5kIGNtZCA9IChDb21tYW5kKSBuZXN0ZWRDb21tYW5kcy5nZXQoaSk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGNtZC5jYW5VbmRvKCkpIHsKLQkJCQkJCWNtZC51bmRvKCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNtZC5kaXNwb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrRm9sZGVyKE9iamVjdCBzaGVsbCkgewotCQkvLyBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIHRvIGJlIGFkZGVkIHdpbGwgYmUgc2F2ZWQgaW4gaXRzIG93biBmaWxlCi0JCS8vIGNoZWNrIGlmIHRoZSBmb2xkZXIgdG8gc2F2ZSB0aGUgZmlsZSB0byBjYW4gYmUgbW9kaWZpZWQKLQkJLy8KLQkJSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gKElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKSBTZXJ2aWNlcy5nZXRMaWJyYXJ5UGVyc2lzdGVyKFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFKTsKLQkJQXJyYXlMaXN0IGZvbGRlcnNUb0NoZWNrID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCSYmIHBlcnNpc3Rlci5oYXNPd25SZXNvdXJjZShlbGVtZW50KSkgewotCQkJCVN0cmluZyBmb2xkZXIgPSBwZXJzaXN0ZXIuZ2V0Rm9sZGVyUmVsYXRpdmVQYXRoKAotCQkJCQkJCQkoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGFkZENvbW1hbmQKLQkJCQkJCS5nZXRPd25lcigpKTsKLQkJCQlTdHJpbmcgYmFzZUZvbGRlciA9IG51bGw7Ci0JCQkJaWYgKHBsdWdpbiA9PSBudWxsKSB7Ci0JCQkJCU1ldGhvZExpYnJhcnkgbGliID0gVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KGFkZENvbW1hbmQKLQkJCQkJCQkuZ2V0T3duZXIoKSk7Ci0JCQkJCWJhc2VGb2xkZXIgPSBuZXcgRmlsZShsaWIuZVJlc291cmNlKCkuZ2V0VVJJKCkKLQkJCQkJCQkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJhc2VGb2xkZXIgPSBuZXcgRmlsZShwbHVnaW4uZVJlc291cmNlKCkuZ2V0VVJJKCkKLQkJCQkJCQkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpOwotCQkJCX0KLQkJCQlmb2xkZXJzVG9DaGVjay5hZGQoYmFzZUZvbGRlciArIEZpbGUuc2VwYXJhdG9yICsgZm9sZGVyKTsKLQkJCX0KLQkJfQotCQlpZiAoIWZvbGRlcnNUb0NoZWNrLmlzRW1wdHkoKSkgewotCQkJU3RyaW5nW10gZm9sZGVycyA9IG5ldyBTdHJpbmdbZm9sZGVyc1RvQ2hlY2suc2l6ZSgpXTsKLQkJCWZvbGRlcnNUb0NoZWNrLnRvQXJyYXkoZm9sZGVycyk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IFNlcnZpY2VzLmdldEZpbGVNYW5hZ2VyKCkKLQkJCQkJLmNoZWNrTW9kaWZ5KGZvbGRlcnMsIHNoZWxsKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCWhhbmRsZUVycm9yKHN0YXR1cyk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNNb3ZlKCkgewotCQlDb21tYW5kIGNtZCA9IFRuZ1V0aWwudW53cmFwKGNvbW1hbmQpOwotCQlpZiAoY21kIGluc3RhbmNlb2YgQWRkQ29tbWFuZCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChBZGRDb21tYW5kKSBjbWQpLmdldENvbGxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBvd25lclBsdWdpbgotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBMaXN0IG9mIFJlZmVyZW5jZSBvYmplY3RzIHRoYXQga2VlcHMgdGhlIGluZm8gb2YgaWxsZWdhbCBvdXRnb2luZwotCSAqICAgICAgICAgcmVmZXJlbmNlcwotCSAqIEBzZWUgUmVmZXJlbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFJlZmVyZW5jZT4gZ2V0SWxsZWdhbE91dGdvaW5nUmVmZXJlbmNlcygKLQkJCU1ldGhvZFBsdWdpbiBvd25lclBsdWdpbiwgRU9iamVjdCBlLCBDb2xsZWN0aW9uPFJlZmVyZW5jZT4gaWxsZWdhbFJlZmVyZW5jZXMpIHsKLQkJaWYgKGlsbGVnYWxSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWlsbGVnYWxSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdDxSZWZlcmVuY2U+KCk7Ci0JCX0KLQkJZm9yIChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3I8RU9iamVjdD4gZmVhdHVyZUl0ZXJhdG9yID0gKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvcjxFT2JqZWN0PikgZQotCQkJCS5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgZmVhdHVyZUl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBmZWF0dXJlSXRlcmF0b3IubmV4dCgpOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlSXRlcmF0b3IuZmVhdHVyZSgpOwotCQkJaWYgKCFmZWF0dXJlLmlzRGVyaXZlZCgpKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVPYmplY3QpOwotCQkJCWlmIChwbHVnaW4gIT0gbnVsbCAmJiBwbHVnaW4gIT0gb3duZXJQbHVnaW4KLQkJCQkJCSYmICFNaXNjLmlzQmFzZU9mKHBsdWdpbiwgb3duZXJQbHVnaW4pKSB7Ci0JCQkJCS8vIGlsbGVnYWwgcmVmZXJlbmNlIHRvIGJlIHJlbW92ZWQKLQkJCQkJLy8KLQkJCQkJaWxsZWdhbFJlZmVyZW5jZXMKLQkJCQkJCQkuYWRkKG5ldyBSZWZlcmVuY2UoZSwgZmVhdHVyZSwgZU9iamVjdCwgLTEpKTsKLQkJCQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCQkJZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQkJCWlsbGVnYWxSZWZlcmVuY2VzCi0JCQkJCQkJLmFkZChuZXcgUmVmZXJlbmNlKGUsIGZlYXR1cmUsIGUuZUdldChmZWF0dXJlKSwgLTEpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaWxsZWdhbFJlZmVyZW5jZXM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVSZWZlcmVuY2VzKENvbGxlY3Rpb248UmVmZXJlbmNlPiByZWZlcmVuY2VzKSB7Ci0JCWZvciAoUmVmZXJlbmNlIHJlZjogcmVmZXJlbmNlcykgewotCQkJaWYgKHJlZi5mZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJTGlzdDw/PiBsaXN0ID0gKChMaXN0PD8+KSByZWYub3duZXIuZUdldChyZWYuZmVhdHVyZSkpOwotCQkJCWxpc3QucmVtb3ZlKHJlZi52YWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXJlZi5vd25lci5lU2V0KHJlZi5mZWF0dXJlLCBudWxsKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBMaXN0IG9mIFJlZmVyZW5jZSBvYmplY3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFJlZmVyZW5jZT4gcmVtb3ZlSWxsZWdhbFJlZmVyZW5jZXMoTWV0aG9kUGx1Z2luIG93bmVyUGx1Z2luLAotCQkJRU9iamVjdCBlKSB7Ci0JCUNvbGxlY3Rpb248UmVmZXJlbmNlPiByZW1vdmVSZWZzID0gZ2V0SWxsZWdhbE91dGdvaW5nUmVmZXJlbmNlcyhvd25lclBsdWdpbiwgZSwKLQkJCQludWxsKTsKLQotCQkvLyByZW1vdmUgaWxsZWdhbCByZWZlcmVuY2VzCi0JCS8vCi0JCXJlbW92ZVJlZmVyZW5jZXMocmVtb3ZlUmVmcyk7Ci0KLQkJcmV0dXJuIHJlbW92ZVJlZnM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNOZXh0KEl0ZXJhdG9yIGl0ZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBpdGVyLmhhc05leHQoKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgZXg7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzSWxsZWdhbFJlZmVyZW5jZShNZXRob2RQbHVnaW4gb3duZXJQbHVnaW4sCi0JCQlFT2JqZWN0IGUsIENvbGxlY3Rpb24gbW92ZUxpc3QpIHsKLQkJZm9yIChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IgZmVhdHVyZUl0ZXJhdG9yID0gKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvcikgZQotCQkJCS5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgaGFzTmV4dChmZWF0dXJlSXRlcmF0b3IpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGZlYXR1cmVJdGVyYXRvci5uZXh0KCk7Ci0KLQkJCS8vIGNoZWNrIGlmIHRoZSB4LXJlZiBvYmplY3QgaXMgaW4gdGhlIG1vdmUgbGlzdAotCQkJLy8KLQkJCWlmICghbW92ZUxpc3QuY29udGFpbnMoZU9iamVjdCkpIHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZU9iamVjdCk7Ci0JCQkJaWYgKHBsdWdpbiAhPSBudWxsICYmIHBsdWdpbiAhPSBvd25lclBsdWdpbgotCQkJCQkJJiYgIU1pc2MuaXNCYXNlT2YocGx1Z2luLCBvd25lclBsdWdpbikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgaXMgcmVmZXJlbmNlZCBpbGxlZ2FsbHkgYWZ0ZXIgdGhlIG1vdmUuCi0JICogCi0JICogQHBhcmFtIG93bmVyUGx1Z2luCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gbW92ZUxpc3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVmZXJlbmNlZElsbGVnYWxseShNZXRob2RQbHVnaW4gb3duZXJQbHVnaW4sCi0JCQlNZXRob2RFbGVtZW50IGUsIENvbGxlY3Rpb24gbW92ZUxpc3QpIHsKLQkJQ29sbGVjdGlvbiByZWZlcmVuY2VzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVmZXJlbmNlcyhlKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQotCQkJaWYgKGlzRXhjbHVkZWRGcm9tT3V0Z29pbmdSZWZlcmVuY2VDaGVjayhlbGVtZW50KSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoIW1vdmVMaXN0LmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQkJCWlmIChwbHVnaW4gIT0gbnVsbCAmJiBwbHVnaW4gIT0gb3duZXJQbHVnaW4KLQkJCQkJCSYmICFNaXNjLmlzQmFzZU9mKG93bmVyUGx1Z2luLCBwbHVnaW4pKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja01vZGlmeShFT2JqZWN0IGVsZW1lbnQpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChlbGVtZW50LCBudWxsKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQl0aHJvdyBuZXcgTWVzc2FnZUV4Y2VwdGlvbihUbmdVdGlsLmdldE1lc3NhZ2Uoc3RhdHVzKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gcmVtb3ZlSWxsZWdhbFJlZmVyZW5jZXNUbygKLQkJCU1ldGhvZFBsdWdpbiBvd25lclBsdWdpbiwgTWV0aG9kRWxlbWVudCBlLCBDb2xsZWN0aW9uIG1vdmVMaXN0KSB7Ci0JCUFycmF5TGlzdCBhZmZlY3RlZFJlZmVyZW5jZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlDb2xsZWN0aW9uIHJlZmVyZW5jZXMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRSZWZlcmVuY2VzKGUpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKCFtb3ZlTGlzdC5jb250YWlucyhlbGVtZW50KSkgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkJCQlpZiAocGx1Z2luICE9IG51bGwgJiYgcGx1Z2luICE9IG93bmVyUGx1Z2luCi0JCQkJCQkmJiAhTWlzYy5pc0Jhc2VPZihvd25lclBsdWdpbiwgcGx1Z2luKSkgewotCQkJCQljaGVja01vZGlmeShlbGVtZW50KTsKLQkJCQkJcmVtb3ZlUmVmZXJlbmNlcyhlbGVtZW50LCBlKTsKLQkJCQkJYWZmZWN0ZWRSZWZlcmVuY2Vycy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhZmZlY3RlZFJlZmVyZW5jZXJzOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIGNyb3NzIHJlZmVyZW5jZXMgb2YgPGNvZGU+cmVmZXJlbmNlcjwvY29kZT4gdG8KLQkgKiA8Y29kZT5yZWZlcmVuY2VkPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSByZWZlcmVuY2VyCi0JICogQHBhcmFtIHJlZmVyZW5jZWQKLQkgKiBAcGFyYW0geFJlZmVyZW5jZXMKLQkgKiAgICAgICAgICAgIG91dHB1dCBjb2xsZWN0aW9uIG9mIEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3RzCi0JICogQHJldHVybiBjb2xsZWN0aW9uIG9mIEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3RzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiBnZXRYUmVmZXJlbmNlcyhFT2JqZWN0IHJlZmVyZW5jZXIsCi0JCQlFT2JqZWN0IHJlZmVyZW5jZWQsIENvbGxlY3Rpb24geFJlZmVyZW5jZXMpIHsKLQkJaWYgKHhSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXhSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWZvciAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yIGZlYXR1cmVJdGVyYXRvciA9IChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IpIHJlZmVyZW5jZXIKLQkJCQkuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGZlYXR1cmVJdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgZmVhdHVyZUl0ZXJhdG9yLm5leHQoKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZmVhdHVyZUl0ZXJhdG9yLmZlYXR1cmUoKTsKLQkJCS8vIGlmKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCS8vIGlmKCgoTGlzdClyZWZlcmVuY2VyLmVHZXQoZmVhdHVyZSkpLmNvbnRhaW5zKHJlZmVyZW5jZWQpKSB7Ci0JCQkvLyB4UmVmZXJlbmNlcy5hZGQoZmVhdHVyZSk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyBlbHNlCi0JCQlpZiAoZU9iamVjdCA9PSByZWZlcmVuY2VkKSB7Ci0JCQkJeFJlZmVyZW5jZXMuYWRkKGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB4UmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gPGNvZGU+cmVmZXJlbmNlZDwvY29kZT4gZnJvbQotCSAqIDxjb2RlPnJlZmVyZW5jZXI8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHJlZmVyZW5jZXIKLQkgKiBAcGFyYW0gcmVmZXJlbmNlZAotCSAqIEByZXR1cm4gQ29sbGVjdGlvbiBvZiByZWZlcmVuY2VzIHRvIHRoZSA8Y29kZT5yZWZlcmVuY2VkPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiByZW1vdmVSZWZlcmVuY2VzKEVPYmplY3QgcmVmZXJlbmNlciwKLQkJCUVPYmplY3QgcmVmZXJlbmNlZCkgewotCQlDb2xsZWN0aW9uIHJlbW92ZVJlZnMgPSBnZXRYUmVmZXJlbmNlcyhyZWZlcmVuY2VyLCByZWZlcmVuY2VkLCBudWxsKTsKLQotCQkvLyByZW1vdmUgaWxsZWdhbCByZWZlcmVuY2VzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlbW92ZVJlZnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGYuaXNNYW55KCkpIHsKLQkJCQkoKENvbGxlY3Rpb24pIHJlZmVyZW5jZXIuZUdldChmKSkucmVtb3ZlKHJlZmVyZW5jZWQpOwotCQkJfSBlbHNlIHsKLQkJCQlyZWZlcmVuY2VyLmVTZXQoZiwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVtb3ZlUmVmczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzSWxsZWdhbFJlZmVyZW5jZUluY2x1ZGluZ0FsbENoaWxkcmVuKAotCQkJTWV0aG9kUGx1Z2luIG93bmVyUGx1Z2luLCBNZXRob2RFbGVtZW50IGUsIENvbGxlY3Rpb24gbW92ZUxpc3QpIHsKLQkJaWYgKG93bmVyUGx1Z2luID09IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGUpKSB7Ci0JCQkvLyBtb3ZlIHdpdGhpbiB0aGUgc2FtZSBwbHVnaW4sIG5vIGZ1cnRoZXIgY2hlY2sKLQkJCS8vCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGhhc0lsbGVnYWxSZWZlcmVuY2Uob3duZXJQbHVnaW4sIGUsIG1vdmVMaXN0KSkKLQkJCXJldHVybiB0cnVlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZS5lQWxsQ29udGVudHMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJaWYgKGhhc0lsbGVnYWxSZWZlcmVuY2Uob3duZXJQbHVnaW4sIChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCksCi0JCQkJCW1vdmVMaXN0KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3VwZXJFeGVjdXRlKCkgewotCQlzdXBlci5leGVjdXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0RmVhdHVyZXNUb0NoZWNrKCkgewotCQlpZiAoZmVhdHVyZXNUb0NoZWNrID09IG51bGwpIHsKLQkJCWZlYXR1cmVzVG9DaGVjayA9IG5ldyBBcnJheUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPigpOwotCQkJZmVhdHVyZXNUb0NoZWNrLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJCQotCQl9Ci0JCXJldHVybiBmZWF0dXJlc1RvQ2hlY2s7Ci0JfQotCi0JcHJvdGVjdGVkIElWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKEVPYmplY3QgZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCi0JCWlmKGFkZENvbW1hbmQuZ2V0RmVhdHVyZSgpIGluc3RhbmNlb2YgRVJlZmVyZW5jZSl7Ci0JCQl2YWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVWYWxpZGF0b3IoYWRkQ29tbWFuZC5nZXRPd25lcigpLCAoRVJlZmVyZW5jZSkgYWRkQ29tbWFuZC5nZXRGZWF0dXJlKCksIChFQ2xhc3MpbnVsbCwgZSwgZmVhdHVyZSk7Ci0JCX0KLQotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIG9iamVjdHNUb0NoZWNrTmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBnZXRPZmZTdHJpbmdUb0NoZWNrTmFtZShPYmplY3QgZSwgQ29sbGVjdGlvbiBvYmplY3RzVG9DaGVja05hbWUpIHsKLQkJLy8gaWYoYWRkQ29tbWFuZC5nZXRPd25lcigpIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UgJiYKLQkJLy8gYWRkQ29tbWFuZC5nZXRGZWF0dXJlKCkgPT0KLQkJLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkKLQkJLy8gJiYgZSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29udGVudFBhY2thZ2UpZSkuZUFsbENvbnRlbnRzKCk7Ci0JCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJLy8gb2JqZWN0c1RvQ2hlY2tOYW1lLmFkZChlbGVtZW50KTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gZWxzZQotCQlpZiAoYWRkQ29tbWFuZC5nZXRPd25lcigpIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UKLQkJCQkmJiBhZGRDb21tYW5kLmdldEZlYXR1cmUoKSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpCi0JCQkJJiYgZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlCi0JCQkJJiYgIShlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkpIHsKLQkJCWdldFByb2Nlc3NDb21wb25lbnRzKChQcm9jZXNzUGFja2FnZSkgZSwgb2JqZWN0c1RvQ2hlY2tOYW1lKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIG9iamVjdHNUb0NoZWNrTmFtZQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0UHJvY2Vzc0NvbXBvbmVudHMoUHJvY2Vzc1BhY2thZ2UgcGtnLAotCQkJQ29sbGVjdGlvbiBvYmplY3RzVG9DaGVja05hbWUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZFBrZyA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkUGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCW9iamVjdHNUb0NoZWNrTmFtZS5hZGQoY2hpbGRQa2cpOwotCQkJfSBlbHNlIGlmIChjaGlsZFBrZyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJZ2V0UHJvY2Vzc0NvbXBvbmVudHMoKFByb2Nlc3NQYWNrYWdlKSBjaGlsZFBrZywKLQkJCQkJCW9iamVjdHNUb0NoZWNrTmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tTdHJpbmdWYWx1ZShOYW1lZEVsZW1lbnQgZSwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIG9iamVjdHNUb0FkZCkgewotCQlDb2xsZWN0aW9uIGV4Y2x1ZGVkRmVhdHVyZXNUb0NoZWNrID0gdHlwZVRvRXhjbHVkZWRGZWF0dXJlc0Zyb21DaGVjay5nZXQoZS5lQ2xhc3MoKSk7IAotCQlpZihleGNsdWRlZEZlYXR1cmVzVG9DaGVjayAhPSBudWxsICYmIGV4Y2x1ZGVkRmVhdHVyZXNUb0NoZWNrLmNvbnRhaW5zKGZlYXR1cmUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBjcmVhdGVWYWxpZGF0b3IoZSwgZmVhdHVyZSk7Ci0JCWlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotCQkJU3RyaW5nIG5ld05hbWUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQluZXdOYW1lID0gY2hlY2tTdHJpbmdWYWx1ZShlLCBmZWF0dXJlLCB2YWxpZGF0b3IsIG9iamVjdHNUb0FkZCk7Ci0JCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBleCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChuZXdOYW1lICE9IG51bGwpIHsKLQkJCQluZXdOYW1lID0gbmV3TmFtZS50cmltKCk7Ci0JCQkJZS5lU2V0KGZlYXR1cmUsIG5ld05hbWUpOwotCQkJCWZlYXR1cmVDaGFuZ2VkKGUsIGZlYXR1cmUsIG5ld05hbWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrU3RyaW5nVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJQXJyYXlMaXN0IG9iamVjdHNUb0NoZWNrTmFtZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ29sbGVjdGlvbiBvYmplY3RzVG9BZGQgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKTsKLQotCQkvLyBmZWF0dXJlIHZhbHVlIGNoZWNrCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdHNUb0FkZC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5hbWVkRWxlbWVudCBlID0gKE5hbWVkRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoIWNoZWNrU3RyaW5nVmFsdWUoZSwgZmVhdHVyZSwgb2JqZWN0c1RvQWRkKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJZ2V0T2ZmU3RyaW5nVG9DaGVja05hbWUoZSwgb2JqZWN0c1RvQ2hlY2tOYW1lKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdHNUb0NoZWNrTmFtZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5hbWVkRWxlbWVudCBlID0gKE5hbWVkRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCk7Ci0JCQlpZiAoIWNoZWNrU3RyaW5nVmFsdWUoZSwgZiwgb2JqZWN0c1RvQ2hlY2tOYW1lKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBkZWFsIHdpdGggZWxlbWVudCBjaGFuZ2UgZHVyaW5nIGFkZAotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmVhdHVyZUNoYW5nZWQoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IG5ld1ZhbHVlKSB7Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzVG9DaGVja05hbWUoQWRkQ29tbWFuZCBhZGRDb21tYW5kKSB7Ci0JCUFycmF5TGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJLy8gbmVlZCB0byBnZXQgYWxsIHByb2Nlc3MgY29tcG9uZW50cyBpbiB0aGlzIHBhY2thZ2UgdG8gY2hlY2sKLQkJCQkvLyBuYW1lCi0JCQkJLy8KLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihlbGVtZW50LCBmYWxzZSkgewotCi0JCQkJCS8qKgotCQkJCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJCQkgKi8KLQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJCQlyZXR1cm4gKChQcm9jZXNzUGFja2FnZSkgb2JqZWN0KS5nZXRDaGlsZFBhY2thZ2VzKCkKLQkJCQkJCQkJCS5pdGVyYXRvcigpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9OwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IHBrZyA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCWVsZW1lbnRzLmFkZChwa2cpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgdGhlIG5hbWUgb2YgYWxsIGVsZW1lbnRzIHRvIGJlIGFkZGVkLgotCSAqIAotCSAqIEBwYXJhbSBhZGRDb21tYW5kCi0JICogQHJldHVybiBhIGVsZW1lbnQgdG8gbmV3IGZlYXR1cmUgbmFtZSBtYXAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdXNlcgotCSAqICAgICAgICAgY2FuY2VsZWQgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1hcCBjaGVja05hbWUoQWRkQ29tbWFuZCBhZGRDb21tYW5kKSB7Ci0JCUNvbGxlY3Rpb24gZWxlbWVudHNUb0NoZWNrID0gZ2V0RWxlbWVudHNUb0NoZWNrTmFtZShhZGRDb21tYW5kKTsKLQkJSGFzaE1hcCBlbGVtZW50VG9OZXdOYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQkvLyBmZWF0dXJlIHZhbHVlIGNoZWNrCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9DaGVjay5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5hbWVkRWxlbWVudCBlID0gKE5hbWVkRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlJVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQkJCWlmIChlIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQl2YWxpZGF0b3IgPSBuZXcgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yKGFkZENvbW1hbmQKLQkJCQkJCS5nZXRPd25lcigpLCBhZGRDb21tYW5kLmdldEZlYXR1cmUoKSwKLQkJCQkJCShDb250ZW50RWxlbWVudCkgZSwgbmV3IFZhbGlkYXRvckZhY3RvcnkuVHlwZUZpbHRlcihlKSk7Ci0JCQl9IGVsc2UgewotCQkJCXZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZU5hbWVWYWxpZGF0b3IoCi0JCQkJCQlhZGRDb21tYW5kLmdldE93bmVyKCksIGUpOwotCQkJfQotCi0JCQlTdHJpbmcgbmV3TmFtZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW5ld05hbWUgPSBjaGVja1N0cmluZ1ZhbHVlKGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgdmFsaWRhdG9yLCBlbGVtZW50c1RvQ2hlY2spOwotCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZXgpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWlmIChuZXdOYW1lICE9IG51bGwpIHsKLQkJCQkvLyBuZXcgbmFtZSByZXF1aXJlZCwgY2hlY2sgaWYgdGhlIGVsZW1lbnQgY2FuIGJlIG1vZGlmaWVkCi0JCQkJLy8KLQkJCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShlLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29udGV4dCgpKTsKLQkJCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZTsgCi0JCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JEaWFsb2dfY2Fubm90UmVuYW1lLAotCQkJCQkJbmV3IE9iamVjdFtdIHsgVG5nVXRpbC5nZXRUeXBlVGV4dChlKSwgZS5nZXROYW1lKCksCi0JCQkJCQkJCW5ld05hbWUgfSk7Ci0JCQkJd2hpbGUgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJCQkJaWYgKHVpSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJCQlpZiAodWlIYW5kbGVyLnNlbGVjdE9uZShuZXcgaW50W10gewotCQkJCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fT0ssCi0JCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUwgfSwgdGl0bGUsCi0JCQkJCQkJCW1zZywgbnVsbCkgPT0gSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTCkgewotCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gY2FuY2VsIHRoZSBvcGVyYXRpb24gaWYgdGhlcmUgaXMgbm8gdXNlciBpbnRlcmFjdGlvbiBoYW5kbGVyCi0JCQkJCQkvLwotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxlbWVudFRvTmV3TmFtZU1hcC5wdXQoZSwgbmV3TmFtZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFRvTmV3TmFtZU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgZmVhdHVyZSB2YWx1ZQotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gdmFsaWRhdG9yCi0JICogQHBhcmFtIG9iamVjdHNUb0FkZAotCSAqIEByZXR1cm4gbmV3IGZlYXR1cmUgdmFsdWUgdGhhdCB1c2VyIGhhcyBjaG9vc2VuIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogICAgICAgICB0aGUgZmVhdHVyZSB2YWx1ZSBpcyB2YWxpZAotCSAqIEB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1N0cmluZ1ZhbHVlKE5hbWVkRWxlbWVudCBlLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIElWYWxpZGF0b3IgdmFsaWRhdG9yLAotCQkJQ29sbGVjdGlvbiBvYmplY3RzVG9BZGQpIHRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE86IFRoZSB2YWxpZGF0b3IgaXMgZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIHRoYXQgaXMgdG9vIGxvbmcgZm9yCi0JCS8vIHRoZSBkaWFsb2cuCi0JCS8vIGZlYXR1cmUgdmFsdWUgY2hlY2sKLQkJZmluYWwgU3RyaW5nVmFsaWRhdG9yIHN0clZhbGlkYXRvciA9IGdldFN0cmluZ1ZhbGlkYXRvcigpOwotCQlzdHJWYWxpZGF0b3Iuc2V0RWxlbWVudHMob2JqZWN0c1RvQWRkKTsKLQkJc3RyVmFsaWRhdG9yLnNldEZlYXR1cmUoZmVhdHVyZSk7Ci0JCXN0clZhbGlkYXRvci5zZXRWYWxpZGF0b3IodmFsaWRhdG9yKTsKLQotCQlTdHJpbmcgc3RyID0gKFN0cmluZykgZS5lR2V0KGZlYXR1cmUpOwotCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID4gMCkgewotCQkJU3RyaW5nIG1zZyA9IHN0clZhbGlkYXRvci5pc1ZhbGlkKHN0cik7Ci0JCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZmVhdHVyZVR4dCA9IFRuZ1V0aWwuZ2V0RmVhdHVyZVRleHQoZmVhdHVyZSk7Ci0JCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMucmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190aXRsZTsgCi0JCQkJU3RyaW5nIGRsZ01zZyA9IE5MUy5iaW5kKAotCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMucmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190ZXh0LAotCQkJCQkJU3RyVXRpbC50b0xvd2VyKGZlYXR1cmVUeHQpLCBlLmdldE5hbWUoKSk7Ci0JCQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IChTdHJpbmcpIGUuZUdldChmZWF0dXJlKTsKLQotCQkJCUlWYWxpZGF0b3IgaW5wdXRWYWxpZGF0b3IgPSBuZXcgQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3IoKSB7Ci0KLQkJCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJCQlpZiAoc3RyVmFsaWRhdG9yICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCQkJCQkuZ2V0U2ltcGxlRXJyb3JNZXNzYWdlKHN0clZhbGlkYXRvcgotCQkJCQkJCQkJCQkuaXNWYWxpZChuZXdUZXh0KSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJfTsKLQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCQkJaWYodWlIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJVXNlcklucHV0IGlucHV0ID0gbmV3IFVzZXJJbnB1dCgiIiwgVXNlcklucHV0LlRFWFQsIGZhbHNlLCBudWxsLCBudWxsLCBpbnB1dFZhbGlkYXRvciwgbnVsbCk7Ci0JCQkJCWlucHV0LnNldElucHV0KGN1cnJlbnRWYWx1ZSk7Ci0JCQkJCUxpc3Q8VXNlcklucHV0PiB1c2VySW5wdXRzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChpbnB1dCk7Ci0JCQkJCWlmKHVpSGFuZGxlci5yZXF1ZXN0SW5wdXQodGl0bGUsIGRsZ01zZywgdXNlcklucHV0cykpIHsKLQkJCQkJCXJldHVybiAoU3RyaW5nKSB1c2VySW5wdXRzLmdldCgwKS5nZXRJbnB1dCgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlciNnZXRBZmZlY3RlZE9iamVjdHMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJQ29sbGVjdGlvbiBhZmZlY3RlZE9iamVjdHMgPSBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQkJaWYgKGFmZmVjdGVkT2JqZWN0cyA9PSBudWxsKSB7Ci0JCQlFT2JqZWN0IG93bmVyID0gYWRkQ29tbWFuZC5nZXRPd25lcigpOwotCQkJYWZmZWN0ZWRPYmplY3RzID0gb3duZXIgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVAotCQkJCQk6IENvbGxlY3Rpb25zLnNpbmdsZXRvbihvd25lcik7Ci0JCX0KLQkJcmV0dXJuIGFmZmVjdGVkT2JqZWN0czsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRFbGVtZW50c1RvQ2hlY2tGb3JJbGxlZ2FsUmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFeGNsdWRlZEZyb21PdXRnb2luZ1JlZmVyZW5jZUNoZWNrKE9iamVjdCBlKSB7Ci0JCS8vIGRvbid0IGNoZWNrIG9uIFByb2Nlc3NQYWNrYWdlLCBQcm9jZXNzRWxlbWVudCBmb3IgaWxsZWdhbCByZWZlcmVuY2VzCi0JCS8vIGIvYyBwcm9jZXNzIHZhbGlkYXRpb24gaXMgYmFzZWQgb24gY29uZmlndXJhdGlvbiwgbm90IHBsdWdpbgotCQkvLyB2aXNpYmlsaXR5Ci0JCS8vCi0JCXJldHVybiBlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UgfHwgZSBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgY2hlY2tGb3JJbGxlZ2FsUmVmZXJlbmNlcygpIHsKLQkJQ29sbGVjdGlvbiBlbGVtZW50cyA9IGdldEVsZW1lbnRzVG9DaGVja0ZvcklsbGVnYWxSZWZlcmVuY2VzKCk7Ci0JCWFkZExpc3QgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnRzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkvLyBTdHJpbmcgbmV3TmFtZSA9IChTdHJpbmcpIGVsZW1lbnRUb05ld05hbWVNYXAuZ2V0KGVsZW1lbnQpOwotCQkJLy8gaWYobmV3TmFtZSAhPSBudWxsKSB7Ci0JCQkvLyBlbGVtZW50LnNldE5hbWUobmV3TmFtZSk7Ci0JCQkvLyB9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudC5lQWxsQ29udGVudHMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCWFkZExpc3QuYWRkKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBpZiB0aGVyZSBpcyBhbnkgaWxsZWdhbCByZWZlcmVuY2UgaW4gdGhlIG1vdmVkIG9iamVjdHMKLQkJLy8JCQotCQlvd25lclBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGFkZENvbW1hbmQuZ2V0T3duZXIoKSk7Ci0JCXJlbW92ZVhSZWZSZXF1aXJlZCA9IGZhbHNlOwotCQlmaW5kX3hQbHVnaW5SZWY6IGZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpCi0JCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQotCQkJaWYgKGlzRXhjbHVkZWRGcm9tT3V0Z29pbmdSZWZlcmVuY2VDaGVjayhlbGVtZW50KSkgewotCQkJCWNvbnRpbnVlIGZpbmRfeFBsdWdpblJlZjsKLQkJCX0KLQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJaWYgKGhhc0lsbGVnYWxSZWZlcmVuY2VJbmNsdWRpbmdBbGxDaGlsZHJlbihvd25lclBsdWdpbiwKLQkJCQkJCShNZXRob2RFbGVtZW50KSBlbGVtZW50LCBhZGRMaXN0KSkgewotCQkJCQlyZW1vdmVYUmVmUmVxdWlyZWQgPSB0cnVlOwotCQkJCQlicmVhayBmaW5kX3hQbHVnaW5SZWY7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKHJlbW92ZVhSZWZSZXF1aXJlZCkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLmludmFsaWRSZWZlcmVuY2VzRXJyb3JfcmVhc29uOyAKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJfQotCQlpZiAoYWRkRmVhdHVyZUlzQ29udGFpbm1lbnQoKSkgewotCQkJSUxpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gU2VydmljZXMuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZXIoKTsKLQkJCWJvb2xlYW4gc2F2ZU93bmVyUmVzb3VyY2UgPSBmYWxzZTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmICghcGVyc2lzdGVyLmhhc093blJlc291cmNlV2l0aG91dFJlZmVycmVyKGUpKSB7Ci0JCQkJCXNhdmVPd25lclJlc291cmNlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoc2F2ZU93bmVyUmVzb3VyY2UpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWRkQ29tbWFuZC5nZXRPd25lcigpLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhZGRDb21tYW5kLmdldE93bmVyKCkuZVJlc291cmNlKCkpOwotCQl9Ci0KLQkJaWYgKG5lc3RlZENvbW1hbmRzICE9IG51bGwgJiYgIW5lc3RlZENvbW1hbmRzLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IG5lc3RlZENvbW1hbmRzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJQ29tbWFuZCBjbWQgPSAoQ29tbWFuZCkgbmVzdGVkQ29tbWFuZHMuZ2V0KGkpOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChjbWQgaW5zdGFuY2VvZiBJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIHsKLQkJCQkJCUNvbGxlY3Rpb24gcmVzb3VyY2VzID0gKChJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIGNtZCkKLQkJCQkJCQkJLmdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCQkJCQlpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwocmVzb3VyY2VzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gd2lsbFNhdmVNb2RpZmllZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGdldFBlcnNpc3RlcigpIHsKLQkJcmV0dXJuIFNlcnZpY2VzLmdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlTW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBnZXRQZXJzaXN0ZXIoKTsKLQkJdHJ5IHsKLQotCQkJLy8gc2F2ZSB0aGUgbW9kaWZpZWQgcmVzb3VyY2VzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJY2FuVW5kbyA9IGZhbHNlOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnNhdmVGaWxlRXJyb3JfcmVhc29uLCAKLQkJCQkJCQlyZXNvdXJjZS5nZXRVUkkoKS5pc0ZpbGUoKSA/IHJlc291cmNlCi0JCQkJCQkJCQkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkgOiByZXNvdXJjZS50b1N0cmluZygpKTsKLQkJCQkJc3RhdHVzLmFkZChuZXcgU2F2ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQkJCVNhdmVTdGF0dXMuU0FWRV9FUlJPUiwgbXNnLCBlKSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJCUNvbGxlY3Rpb24gZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRBZmZlY3RlZE9iamVjdHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQllbGVtZW50c1RvQ29weVJlZkNvbnRlbnRzLmFkZChUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSkpOwotCQkJCX0KLQotCQkJCUNvbGxlY3Rpb24gbW9kaWZpZWQgPSByZXNNZ3IuY29weVJlZmVyZW5jZWRDb250ZW50cygKLQkJCQkJCWVsZW1lbnRzVG9Db3B5UmVmQ29udGVudHMsIGVsZW1lbnRUb09sZFBsdWdpbk1hcCk7Ci0JCQkJbW9kaWZpZWQKLQkJCQkJCS5hZGRBbGwocmVwbGFjZVRleHRSZWZlcmVuY2VzKGVsZW1lbnRzVG9Db3B5UmVmQ29udGVudHMpKTsKLQkJCQlpZiAobW9kaWZpZWQgIT0gbnVsbCAmJiAhbW9kaWZpZWQuaXNFbXB0eSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJLmxvZ0Vycm9yKGUpOwotCQkJCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZCgKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnNhdmVGaWxlRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJcmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJCQkJCXN0YXR1cy5hZGQobmV3IFNhdmVTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkJCVNhdmVTdGF0dXMuU0FWRV9FUlJPUiwgbXNnLCBlKSk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nV3JpdGVyIG1zZyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihtc2cpKTsKLQkJCUlTdGF0dXMgbmV3U3RhdHVzID0gbmV3IFNhdmVTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCVNhdmVTdGF0dXMuU0FWRV9FUlJPUiwgbXNnLnRvU3RyaW5nKCksIGUpOwotCQkJc3RhdHVzLmFkZChuZXdTdGF0dXMpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCVN0cmluZ1dyaXRlciBtc2cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihtc2cpKTsKLQkJCQkJSVN0YXR1cyBuZXdTdGF0dXMgPSBuZXcgU2F2ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQkJCVNhdmVTdGF0dXMuUk9MTEJBQ0tfRVJST1IsIG1zZy50b1N0cmluZygpLCBlKTsKLQkJCQkJc3RhdHVzLmFkZChuZXdTdGF0dXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIElmIHRleHR1YWwgZGVzY3JpcHRpb25zIGluIHRoZSBjb3BpZWQgZWxlbWVudHMgY29udGFpbiByZWZlcmVuY2VzIChVUkxzKQotCSAqIHRvIG90aGVyIGVsZW1lbnRzIHdpdGhpbiB0aGUgc2FtZSBjb3BpZWQgcHJvY2VzcyB0aGVuIHJlcGxhY2UgdGhlc2UKLQkgKiByZWZlcmVuY2VzIHdpdGggcmVmZXJlbmNlcyB0aGF0IHBvaW50IHRvIHRoZSBuZXcgZWxlbWVudHMgaW4gdGhlIGNvcGllZAotCSAqIHN0cnVjdHVyZXMuCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIHJlcGxhY2VUZXh0UmVmZXJlbmNlcygKLQkJCUNvbGxlY3Rpb24gZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cykgewotCQlDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJSVRleHRSZWZlcmVuY2VSZXBsYWNlciB0eHRSZWZSZXBsYWNlciA9IEV4dGVuc2lvbk1hbmFnZXIKLQkJCQkuZ2V0VGV4dFJlZmVyZW5jZVJlcGxhY2VyKCk7Ci0JCWlmICh0eHRSZWZSZXBsYWNlciA9PSBudWxsKQotCQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JCS8vIGdldCBtYXAKLQkJRWRpdGluZ0RvbWFpbiBlZCA9IGFkZENvbW1hbmQuZ2V0RG9tYWluKCk7Ci0JCWlmIChlZCBpbnN0YW5jZW9mIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJTWFwIGNvcHlUb09yaWdpbmFsTWFwID0gKChUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGVkKQotCQkJCQkuZ2V0Q29weVRvT3JpZ2luYWxNYXAoKTsKLQkJCS8vIHRoZSBUZXh0UmVmZXJlbmNlUmVwbGFjZXIgZXhwZWN0cyBhIG1hcCBvZiBvbGQtdG8tbmV3LiB3ZQotCQkJLy8gaGF2ZSBhIG1hcCBvZiBuZXctdG8tb2xkLCBzbyBjb252ZXJ0IGl0Ci0JCQlNYXAgb2xkVG9OZXdPYmplY3RNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29weVRvT3JpZ2luYWxNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IGtleSA9IGVudHJ5LmdldEtleSgpOwotCQkJCU9iamVjdCB2YWwgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWlmIChrZXkgIT0gbnVsbCAmJiB2YWwgIT0gbnVsbCkKLQkJCQkJb2xkVG9OZXdPYmplY3RNYXAucHV0KHZhbCwga2V5KTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9Db3B5UmVmQ29udGVudHMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGNoaWxkSXRlciA9IGVsZW1lbnQuZUFsbENvbnRlbnRzKCk7IGNoaWxkSXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBjaGlsZCA9IChFT2JqZWN0KSBjaGlsZEl0ZXIubmV4dCgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGF0dHJpYnV0ZXMgPSBjaGlsZC5lQ2xhc3MoKQotCQkJCQkJCS5nZXRFQWxsQXR0cmlidXRlcygpLml0ZXJhdG9yKCk7IGF0dHJpYnV0ZXMKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJRUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoRUF0dHJpYnV0ZSkgYXR0cmlidXRlcy5uZXh0KCk7Ci0JCQkJCQlpZiAoYXR0cmlidXRlLmlzQ2hhbmdlYWJsZSgpCi0JCQkJCQkJCSYmICFhdHRyaWJ1dGUuaXNEZXJpdmVkKCkKLQkJCQkJCQkJJiYgKGF0dHJpYnV0ZS5pc01hbnkoKSB8fCBjaGlsZAotCQkJCQkJCQkJCS5lSXNTZXQoYXR0cmlidXRlKSkKLQkJCQkJCQkJJiYgYXR0cmlidXRlLmdldEVBdHRyaWJ1dGVUeXBlKCkKLQkJCQkJCQkJCQkuZ2V0SW5zdGFuY2VDbGFzcygpID09IExpdGVyYWxzLlNUUklORwotCQkJCQkJCQkJCS5nZXRJbnN0YW5jZUNsYXNzKCkpIHsKLQkJCQkJCQlTdHJpbmcgdGV4dCA9IChTdHJpbmcpIGNoaWxkLmVHZXQoYXR0cmlidXRlKTsKLQkJCQkJCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQkJCQkJCVN0cmluZyBuZXd0ZXh0ID0gdHh0UmVmUmVwbGFjZXIucmVwbGFjZSh0ZXh0LAotCQkJCQkJCQkJCWNoaWxkLCBvbGRUb05ld09iamVjdE1hcCk7Ci0JCQkJCQkJCWlmICghbmV3dGV4dC5lcXVhbHModGV4dCkpIHsKLQkJCQkJCQkJCWNoaWxkLmVTZXQoYXR0cmlidXRlLCBuZXd0ZXh0KTsKLQkJCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChjaGlsZC5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvQWRkKCkgewotCQl0cnkgewotCQkJLy8gY2hlY2sgZmVhdHVyZSB2YWx1ZXMKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRGZWF0dXJlc1RvQ2hlY2soKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoIWNoZWNrU3RyaW5nVmFsdWUoZmVhdHVyZSkpIHsKLQkJCQkJLy8gdXNlciBjYW5jZWxlZCB0aGUgb3BlcmFpb24KLQkJCQkJLy8KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQotCQkJYm9vbGVhbiBzaG93V2FybmluZyA9IGZhbHNlOwotCQkJRWRpdGluZ0RvbWFpbiBlZCA9IGFkZENvbW1hbmQuZ2V0RG9tYWluKCk7Ci0JCQlpZiAoZWQgaW5zdGFuY2VvZiBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCQlNYXAgY29weVRvT3JpZ2luYWxNYXAgPSAoKFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZWQpCi0JCQkJCQkuZ2V0Q29weVRvT3JpZ2luYWxNYXAoKTsKLQotCQkJCS8vIGNoZWNrIGZpcnN0IGVsZW1lbnQgb2YgYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkKLQkJCQkvLyBpZiBpdCdzIGEga2V5IGluIHRoZSBDb3B5VG9PcmlnaW5hbE1hcCwgd2UgYXJlIHBhc3RpbmcgYW5kCi0JCQkJLy8gbWF5IG5lZWQgdG8gd2FybiB0aGUgdXNlcgotCQkJCS8vIGlmIGl0J3Mgbm90IGEga2V5IGluIHRoZSBDb3B5VG9PcmlnaW5hbE1hcCwgdGhlbiB3ZSBhcmUKLQkJCQkvLyBwcm9iYWJseSBhZGRpbmcgYSBuZXcgZWxlbWVudAotCQkJCWlmIChhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKSAhPSBudWxsCi0JCQkJCQkmJiBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS5zaXplKCkgPiAwCi0JCQkJCQkmJiBjb3B5VG9PcmlnaW5hbE1hcC5jb250YWluc0tleShhZGRDb21tYW5kCi0JCQkJCQkJCS5nZXRDb2xsZWN0aW9uKCkudG9BcnJheSgpWzBdKSkgewotCQkJCQllbGVtZW50VG9PbGRQbHVnaW5NYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQlJdGVyYXRvciBpdGVyID0gY29weVRvT3JpZ2luYWxNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChFbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJCQkJJiYgIShlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikpIHsKLQkJCQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbAotCQkJCQkJCQkJLmdldE1ldGhvZFBsdWdpbigoTWV0aG9kRWxlbWVudCkgZW50cnkKLQkJCQkJCQkJCQkJLmdldFZhbHVlKCkpOwotCQkJCQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCQkJCQllbGVtZW50VG9PbGRQbHVnaW5NYXAucHV0KGVudHJ5LmdldEtleSgpLAotCQkJCQkJCQkJCXBsdWdpbik7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gcGx1Z2luID09IG51bGwsIG9yaWdpbmFsIGVsZW1lbnQgd2FzIHByb2JhYmx5Ci0JCQkJCQkJCS8vIGRlbGV0ZWQKLQkJCQkJCQkJc2hvd1dhcm5pbmcgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHNob3dXYXJuaW5nKSB7Ci0JCQkJCU1lc3Nlbmdlci5JTlNUQU5DRQotCQkJCQkJLnNob3dXYXJuaW5nKAotCQkJCQkJCQlnZXRMYWJlbCgpLAotCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2cpOwotCQkJfQotCi0JCQlmaW5hbCBTdHJpbmdCdWZmZXIgbXNnQnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcGVyYXRpb24gPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQlTdHJpbmcgbXNnID0gY2hlY2tGb3JJbGxlZ2FsUmVmZXJlbmNlcygpOwotCQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJCW1zZ0J1ZmYuYXBwZW5kKG1zZyk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX07Ci0KLQkJCUlQcm9ncmVzc01vbml0b3IgZGVmYXVsdE1vbml0b3IgPSBudWxsOwotCQkJaWYgKCFydW5XaXRoUHJvZ3Jlc3MpIHsKLQkJCQlkZWZhdWx0TW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQl9Ci0KLQkJCWlmIChydW5XaXRoUHJvZ3Jlc3MpIHsKLQkJCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKG9wZXJhdGlvbiwKLQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmNoZWNraW5nUmVmZXJlbmNlc1Rhc2tfbmFtZSk7IAotCQkJfSBlbHNlIHsKLQkJCQl0cnkgewotCQkJCQlvcGVyYXRpb24ucnVuKGRlZmF1bHRNb25pdG9yKTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl0aHJvdyBlOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobXNnQnVmZi5sZW5ndGgoKSA+IDApIHsKLQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCQkJaWYodWlIYW5kbGVyICAhPSBudWxsKSB7Ci0JCQkJCWludCByZXQgPSB1aUhhbmRsZXIuc2VsZWN0T25lKG5ldyBpbnRbXSB7SVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX1lFUywgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX05PIH0sIAotCQkJCQkJCWdldExhYmVsKCksIG1zZ0J1ZmYudG9TdHJpbmcoKSwgbnVsbCk7Ci0JCQkJCWlmKHJldCA9PSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fTk8pIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJSVN0YXR1cy5PSywKLQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfZXJyb3JTYXZpbmdGaWxlcywKLQkJCQkJbnVsbCk7IAotCQkJb3BlcmF0aW9uID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJaWYgKHJlbW92ZVhSZWZSZXF1aXJlZCkgewotCQkJCQkJbW9uaXRvci5zdWJUYXNrKCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCQkJcmVtb3ZlSWxsZWdhbFJlZmVyZW5jZXMob3duZXJQbHVnaW4sIGVsZW1lbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIGFkZCB0aGUgZWxlbWVudHMKLQkJCQkJLy8KLQkJCQkJc3VwZXJFeGVjdXRlKCk7Ci0KLQkJCQkJZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCk7Ci0KLQkJCQkJaWYgKHdpbGxTYXZlTW9kaWZpZWRSZXNvdXJjZXMoKSkgewotCQkJCQkJSVN0YXR1cyByZXN1bHQgPSBzYXZlTmV3RWxlbWVudHNXaXRoT3duUmVzb3VyY2UoKTsKLQkJCQkJCWlmIChyZXN1bHQuaXNPSygpKSB7Ci0JCQkJCQkJbW9uaXRvcgotCQkJCQkJCQkJLnN1YlRhc2soTGlicmFyeUVkaXRSZXNvdXJjZXMuc2F2aW5nTW9kaWZpZWRGaWxlc1Rhc2tfbmFtZSk7IAotCQkJCQkJCXNhdmVNb2RpZmllZFJlc291cmNlcygpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlzdGF0dXMuYWRkKHJlc3VsdCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCS8vIEZJWE1FOiB0aGlzIGNhdXNlcyBkZWFkLWxvY2sgYXQKLQkJCQkJCS8vIExpYnJhcnlQcm9jZXNzb3Iubm90aWZ5TGlzdGVuZXJzKCkuIFRoZSBtZXRob2QKLQkJCQkJCS8vIGlzIHN5bmNocm9uaXplZCwgdGhpcyBtaWdodCBiZSB0aGUgY2F1c2Ugb2YgdGhlCi0JCQkJCQkvLyBkZWFkLWxvY2sKLQkJCQkJCS8vCi0JCQkJCQl1bmRvKCk7Ci0JCQkJCQkKLQkJCQkJCWlmKENvbW1hbmRTdGF0dXNDaGVja2VyLmhhc1JvbGxiYWNrRXJyb3Ioc3RhdHVzKSkgewotCQkJCQkJCUNvbGxlY3Rpb248Pz4gY3JlYXRlZEVsZW1lbnRzID0gY29tbWFuZC5nZXRSZXN1bHQoKTsKLQkJCQkJCQlJTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBTZXJ2aWNlcy5nZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlcigpOwotCQkJCQkJCWZvciAoT2JqZWN0IG9iamVjdCA6IGNyZWF0ZWRFbGVtZW50cykgewotCQkJCQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCXBlcnNpc3Rlci5kZWxldGUoKE1ldGhvZEVsZW1lbnQpIG9iamVjdCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0JCQkJCQkJCQotCQkJCQkJfQkJCQkJCQotCQkJCQl9Ci0JCQkJfQotCi0JCQl9OwotCQkJaWYgKHJ1bldpdGhQcm9ncmVzcykgewotCQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3Mob3BlcmF0aW9uLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJdHJ5IHsKLQkJCQkJb3BlcmF0aW9uLnJ1bihkZWZhdWx0TW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd0Vycm9yKGdldExhYmVsKCksIExpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yX21zZ1dpdGhEZXRhaWxzLCBzdGF0dXMpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd0Vycm9yKGdldExhYmVsKCksIExpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yX21zZywgbnVsbCwgZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYWRkRmVhdHVyZUlzQ29udGFpbm1lbnQoKSB7Ci0JCXJldHVybiBhZGRDb21tYW5kLmdldEZlYXR1cmUoKSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UKLQkJCQkmJiAoKEVSZWZlcmVuY2UpIGFkZENvbW1hbmQuZ2V0RmVhdHVyZSgpKS5pc0NvbnRhaW5tZW50KCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgYWRkZWQgZWxlbWVudHMgdGhhdCBhcmUgbmV3IHRvIHRoZSBsaWJyYXJ5IGFuZCBjYW4gaGF2ZSBvd24KLQkgKiByZXNvdXJjZSB0aGF0IG5vIG90aGVyIHJlc291cmNlIHJlZmVycyB0byAobGlrZSBNZXRob2RDb25maWd1cmF0aW9uKQotCSAqIAotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgc2F2ZU5ld0VsZW1lbnRzV2l0aE93blJlc291cmNlKCkgewotCQlpZiAoYWRkRmVhdHVyZUlzQ29udGFpbm1lbnQoKSkgewotCQkJSUxpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gU2VydmljZXMuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZXIoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IChNZXRob2RFbGVtZW50KSBlbGVtZW50OwotCi0JCQkJCWlmIChtZSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50IHx8Ci0JCQkJCQltZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCAKLQkJCQkJCW1lIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewkJCQkJCQotCQkJCQkJSVN0YXR1cyBpcyA9IGNoZWNrRmlsZVBhdGhMZW5ndGhCZWZvcmVTYXZlKG1lKTsKLQkJCQkJCWlmIChpcyAhPSBudWxsKSB7Ci0JCQkJCQkJcmV0dXJuIGlzOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKHBlcnNpc3Rlci5oYXNPd25SZXNvdXJjZVdpdGhvdXRSZWZlcnJlcihtZSkpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcGVyc2lzdGVyLnNhdmUobWUpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQkJCQkJaWYgKFN0clV0aWwuaXNCbGFuayhtc2cpKSB7Ci0JCQkJCQkJCW1zZyA9IGUudG9TdHJpbmcoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIG5ldyBTYXZlU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJCQlTYXZlU3RhdHVzLlNBVkVfRVJST1IsIG1zZywgZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgY2hlY2tGaWxlUGF0aExlbmd0aEJlZm9yZVNhdmUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCU1ldGhvZEVsZW1lbnQgcGFyZW50RWxlbWVudFdpdGhSZXNvdXJjZSA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlwYXJlbnRFbGVtZW50V2l0aFJlc291cmNlID0gVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KGVsZW1lbnQpOwotCQl9IGVsc2UgewotCQkJcGFyZW50RWxlbWVudFdpdGhSZXNvdXJjZSA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQl9Ci0JCWlmICghIE5hbWVDaGVja2VyLmNoZWNrRmlsZVBhdGhMZW5ndGgocGFyZW50RWxlbWVudFdpdGhSZXNvdXJjZSwgZWxlbWVudCwgZWxlbWVudC5nZXROYW1lKCksIAotCQkJCUlWYWxpZGF0b3IuTWF4RmlsZVBhdGhOYW1lTGVuZ3RoLCBudWxsKSkgewotCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmZpbGVQYXRoTmFtZVRvb0xvbmdfbXNnLCAKLQkJCQkJbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIoSVZhbGlkYXRvci5NYXhGaWxlUGF0aE5hbWVMZW5ndGgpIH0gKTsKLQkJCXJldHVybiBuZXcgU2F2ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJU2F2ZVN0YXR1cy5TQVZFX0VSUk9SLCBtc2csIG51bGwpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVOZXN0ZWRDb21tYW5kcygpIHsKLQkJTGlzdCBuZXN0ZWRDb21tYW5kUHJvdmlkZXJzID0gRXh0ZW5zaW9uTWFuYWdlcgotCQkJCS5nZXROZXN0ZWRDb21tYW5kUHJvdmlkZXJzKCk7Ci0JCWlmICghbmVzdGVkQ29tbWFuZFByb3ZpZGVycy5pc0VtcHR5KCkpIHsKLQkJCWlmICghYWRkTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQluZXN0ZWRDb21tYW5kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXN0ZWRDb21tYW5kUHJvdmlkZXJzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlOZXN0ZWRDb21tYW5kUHJvdmlkZXIgY21kUHJvdmlkZXIgPSAoSU5lc3RlZENvbW1hbmRQcm92aWRlcikgaXRlcgotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlDb21tYW5kIGNtZCA9IGNtZFByb3ZpZGVyLmNyZWF0ZVJlbGF0ZWRPYmplY3RzKGFkZExpc3QsCi0JCQkJCQkJCXRoaXMpOwotCQkJCQkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQkJCQljbWQuZXhlY3V0ZSgpOwotCQkJCQkJCW5lc3RlZENvbW1hbmRzLmFkZChjbWQpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb250YWlubWVudEluZm8gewotCQlFT2JqZWN0IGNvbnRhaW5lcjsKLQotCQlpbnQgaW5kZXg7Ci0KLQkJQ29udGFpbm1lbnRJbmZvKEVPYmplY3QgY29udGFpbmVyLCBpbnQgaW5kZXgpIHsKLQkJCXRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOwotCQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSWxsZWdhbFJlZmVyZW5jZVJlbW92ZXIgewotCQlwcml2YXRlIE1ldGhvZFBsdWdpbiB0YXJnZXRQbHVnaW47Ci0KLQkJcHJpdmF0ZSBDb2xsZWN0aW9uIGVsZW1lbnRzVG9Nb3ZlOwotCi0JCS8qKgotCQkgKiBsaXN0IG9mIFJlZmVyZW5jZSBvYmplY3RzCi0JCSAqIAotCQkgKiBAc2VlIFJlZmVyZW5jZQotCQkgKi8KLQkJcHJpdmF0ZSBMaXN0IGlsbGVnYWxSZWZlcmVuY2VzOwotCi0JCXByaXZhdGUgU2V0IGFmZmVjdGVkUmVzb3VyY2VzOwotCi0JCXByaXZhdGUgQXJyYXlMaXN0IHJlbW92ZWRSZWZlcmVuY2VzOwotCi0JCXByaXZhdGUgYm9vbGVhbiBzZWFyY2hPdXRnb2luZ1JlZnM7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHNlYXJjaEluY29taW5nUmVmczsKLQotCQlwdWJsaWMgSWxsZWdhbFJlZmVyZW5jZVJlbW92ZXIoTWV0aG9kUGx1Z2luIHRhcmdldFBsdWdpbiwKLQkJCQlDb2xsZWN0aW9uIGVsZW1lbnRzVG9Nb3ZlLCBib29sZWFuIHNlYXJjaE91dGdvaW5nUmVmcywKLQkJCQlib29sZWFuIHNlYXJjaEluY29taW5nUmVmcykgewotCQkJdGhpcy50YXJnZXRQbHVnaW4gPSB0YXJnZXRQbHVnaW47Ci0JCQl0aGlzLmVsZW1lbnRzVG9Nb3ZlID0gZWxlbWVudHNUb01vdmU7Ci0JCQl0aGlzLnNlYXJjaE91dGdvaW5nUmVmcyA9IHNlYXJjaE91dGdvaW5nUmVmczsKLQkJCXRoaXMuc2VhcmNoSW5jb21pbmdSZWZzID0gc2VhcmNoSW5jb21pbmdSZWZzOwotCQl9Ci0KLQkJcHVibGljIFNldCBnZXRBZmZlY3RlZFJlc291cmNlcygpIHsKLQkJCWlmIChhZmZlY3RlZFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQkJaWxsZWdhbFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnRzVG9Nb3ZlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCi0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgb2JqOwotCi0JCQkJCQkvLyBnZXQgb3V0Z29pbmcgcmVmZXJlbmNlcwotCQkJCQkJLy8KLQkJCQkJCWlmIChzZWFyY2hPdXRnb2luZ1JlZnMKLQkJCQkJCQkJJiYgIWlzRXhjbHVkZWRGcm9tT3V0Z29pbmdSZWZlcmVuY2VDaGVjayhvYmopKSB7Ci0JCQkJCQkJZ2V0SWxsZWdhbE91dGdvaW5nUmVmZXJlbmNlcyh0YXJnZXRQbHVnaW4sIGUsCi0JCQkJCQkJCQlpbGxlZ2FsUmVmZXJlbmNlcyk7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIGdldCBpbmNvbWluZyByZWZlcmVuY2VzCi0JCQkJCQkvLwotCQkJCQkJaWYgKHNlYXJjaEluY29taW5nUmVmcykgewotCQkJCQkJCUNvbGxlY3Rpb24gcmVmZXJlbmNlcyA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJCQkuZ2V0UmVmZXJlbmNlcyhlKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpdGVyCi0JCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQkJaWYgKCFlbGVtZW50c1RvTW92ZS5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQkJCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwKLQkJCQkJCQkJCQkJLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkJCQkJCQkJCWlmIChwbHVnaW4gIT0gbnVsbAotCQkJCQkJCQkJCQkmJiBwbHVnaW4gIT0gdGFyZ2V0UGx1Z2luCi0JCQkJCQkJCQkJCSYmICFNaXNjLmlzQmFzZU9mKHRhcmdldFBsdWdpbiwKLQkJCQkJCQkJCQkJCQlwbHVnaW4pKSB7Ci0JCQkJCQkJCQkJQ29sbGVjdGlvbiB4UmVmcyA9IGdldFhSZWZlcmVuY2VzKAotCQkJCQkJCQkJCQkJZWxlbWVudCwgZSwgbnVsbCk7Ci0JCQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IHhSZWZzLml0ZXJhdG9yKCk7IGl0ZXIxCi0JCQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIxCi0JCQkJCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQkJCQkJaWxsZWdhbFJlZmVyZW5jZXMKLQkJCQkJCQkJCQkJCQkuYWRkKG5ldyBSZWZlcmVuY2UoZWxlbWVudCwKLQkJCQkJCQkJCQkJCQkJCWYsIGUpKTsKLQkJCQkJCQkJCQl9Ci0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWFmZmVjdGVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbGxlZ2FsUmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChyZWYub3duZXIuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCQkJYWZmZWN0ZWRSZXNvdXJjZXMuYWRkKHJlZi5vd25lci5lUmVzb3VyY2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gYWZmZWN0ZWRSZXNvdXJjZXM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVJbGxlZ2FsUmVmZXJlbmNlcygpIHsKLQkJCXJlbW92ZWRSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gaWxsZWdhbFJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVmZXJlbmNlIHJlZiA9IChSZWZlcmVuY2UpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChyZWYuZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlMaXN0IGxpc3QgPSAoKExpc3QpIHJlZi5vd25lci5lR2V0KHJlZi5mZWF0dXJlKSk7Ci0JCQkJCS8vIFRPRE86IG5lZWRzIHJldmlzaXQKLQkJCQkJLy8gVGhpcyBjb2RlIHRocm93cwotCQkJCQkvLyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCRCYXNpY0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLQkJCQkJLy8gc29tZXRpbWVzCi0JCQkJCS8vCi0JCQkJCS8vIGlmKHJlZi5pbmRleCAhPSAtMSkgewotCQkJCQkvLyBsaXN0LnJlbW92ZShyZWYuaW5kZXgpOwotCQkJCQkvLyB9Ci0JCQkJCS8vIGVsc2UgewotCQkJCQkvLyBsaXN0LnJlbW92ZShyZWYudmFsdWUpOwotCQkJCQkvLyB9Ci0KLQkJCQkJbGlzdC5yZW1vdmUocmVmLnZhbHVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAocmVmLmZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5VHlwZSgpKSB7Ci0JCQkJCQkvL1Nob3VsZCBxdWVyeSB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBleHRlbmRlZCBmb3IgYW55IGF0dHJpYnV0ZSBmZWF0dXJlCi0JCQkJCQlyZWYub3duZXIuZVNldChyZWYuZmVhdHVyZSwgVmFyaWFiaWxpdHlUeXBlLk5BKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJlZi5vd25lci5lU2V0KHJlZi5mZWF0dXJlLCBudWxsKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZW1vdmVkUmVmZXJlbmNlcy5hZGQocmVmKTsKLQkJCX0KLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVzdG9yZVJlbW92ZWRSZWZlcmVuY2VzKCkgewotCQkJaWYgKHJlbW92ZWRSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gcmVtb3ZlZFJlZmVyZW5jZXMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgcmVtb3ZlZFJlZmVyZW5jZXMuZ2V0KGkpOwotCQkJCWlmIChyZWYuZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlMaXN0IGxpc3QgPSAoKExpc3QpIHJlZi5vd25lci5lR2V0KHJlZi5mZWF0dXJlKSk7Ci0JCQkJCWlmIChyZWYuaW5kZXggIT0gLTEpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLy8gVE9ETzogbmVlZCByZXZpc2l0cwotCQkJCQkJCS8vCi0JCQkJCQkJaWYgKCFsaXN0LmNvbnRhaW5zKHJlZi52YWx1ZSkpIHsKLQkJCQkJCQkJaWYgKHJlZi5pbmRleCA8IGxpc3Quc2l6ZSgpKSB7Ci0JCQkJCQkJCQlsaXN0LmFkZChyZWYuaW5kZXgsIHJlZi52YWx1ZSk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlsaXN0LmFkZChyZWYudmFsdWUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJdGhyb3cgZTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWxpc3QuYWRkKHJlZi52YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZWYub3duZXIuZVNldChyZWYuZmVhdHVyZSwgcmVmLnZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE1vdmVPcGVyYXRpb24gewotCQkvKiogQ29uc3RhbnRzIGZvciBzdGF0ZSBvZiB0aGUgbW92ZSBvcGVyYXRpb24gKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NUQVJUID0gMDsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU0FWRURfRklMRVMgPSA4MDsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfTU9WRURfRklMRVMgPSA3MDsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09QSUVEX1JFU09VUkNFUyA9IDkwOwotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9FTkQgPSAxMDA7Ci0KLQkJLy8gcHJpdmF0ZSBDb21tYW5kIGNvbW1hbmQ7Ci0JCXByaXZhdGUgQWRkQ29tbWFuZCBhZGRDb21tYW5kOwotCi0JCXByaXZhdGUgQ29sbGVjdGlvbiBtb3ZlTGlzdDsKLQotCQlwcml2YXRlIGJvb2xlYW4gcmVtb3ZlWFJlZlJlcXVpcmVkID0gZmFsc2U7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGlzUmVmZW5yZWNlZElsbGVnYWxseSA9IGZhbHNlOwotCi0JCXByaXZhdGUgTWV0aG9kUGx1Z2luIG93bmVyUGx1Z2luOwotCi0JCXByaXZhdGUgTWFwIGVsZW1lbnRUb09sZFBsdWdpbk1hcDsKLQotCQlwcml2YXRlIE1hcCBlbGVtZW50VG9OZXdOYW1lTWFwOwotCi0JCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCi0JCXByaXZhdGUgT2JqZWN0IHNoZWxsOwotCi0JCXByaXZhdGUgSGFzaFNldCBtb3ZlZFJlc291cmNlczsKLQotCQlwcml2YXRlIE11bHRpU3RhdHVzIHN0YXR1czsKLQotCQkvKioKLQkJICogQ3VycmVudCBzdGF0ZSBvZiB0aGUgbW92ZSBvcGVyYXRpb24sIGl0IGNhbiBiZSBvbmUgb2YgdGhlIHN0YXRlCi0JCSAqIGNvbnN0YW50cwotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgc3RhdGU7Ci0KLQkJcHJvdGVjdGVkIFNldCBtb2RpZmllZFJlc291cmNlczsKLQotCQlwcml2YXRlIElsbGVnYWxSZWZlcmVuY2VSZW1vdmVyIGlsbGVnYWxSZWZlcmVuY2VSZW1vdmVyOwotCi0JCXByaXZhdGUgSGFzaE1hcCBlbGVtZW50VG9PbGRDb250YWluZXJNYXA7Ci0KLQkJcHVibGljIE1vdmVPcGVyYXRpb24oQ29tbWFuZCBjb21tYW5kLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQkJT2JqZWN0IHNoZWxsKSB7Ci0JCQkvLyB0aGlzLmNvbW1hbmQgPSBjb21tYW5kOwotCQkJYWRkQ29tbWFuZCA9IChBZGRDb21tYW5kKSBUbmdVdGlsLnVud3JhcChjb21tYW5kKTsKLQkJCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JCQl0aGlzLnNoZWxsID0gc2hlbGw7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBzdGF0dXMuCi0JCSAqLwotCQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENoZWNrcyBpZiByZWxvYWRpbmcgbGlicmFyeSBpcyBuZWVkZWQgaW4gY2FzZSBvZiBtb3ZlIGZhaWx1cmUKLQkJICogCi0JCSAqIEByZXR1cm4KLQkJICogQHNlZSAjZ2V0U3RhdHVzKCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHJlbG9hZE5lZWRlZCgpIHsKLQkJCXJldHVybiBzdGF0dXMgIT0gbnVsbAotCQkJCQkmJiBDb21tYW5kU3RhdHVzQ2hlY2tlci5oYXNSb2xsYmFja0Vycm9yKHN0YXR1cyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgdW5kbygpIHsKLQkJCS8vIHVuZG8gbmFtZSBjaGFuZ2UKLQkJCS8vCi0JCQlpZiAoZWxlbWVudFRvTmV3TmFtZU1hcCAhPSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudFRvTmV3TmFtZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCQlOYW1lZEVsZW1lbnQgZSA9IChOYW1lZEVsZW1lbnQpIGVudHJ5LmdldEtleSgpOwotCQkJCQllLnNldE5hbWUoKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoZWxlbWVudFRvT2xkQ29udGFpbmVyTWFwICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50VG9PbGRDb250YWluZXJNYXAuZW50cnlTZXQoKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJRU9iamVjdCBlID0gKEVPYmplY3QpIGVudHJ5LmdldEtleSgpOwotCQkJCQlDb250YWlubWVudEluZm8gY29udGFpbm1lbnRJbmZvID0gKENvbnRhaW5tZW50SW5mbykgZW50cnkKLQkJCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSBhZGRDb21tYW5kLmdldEZlYXR1cmUoKTsKLQkJCQkJaWYgKGYuaXNNYW55KCkpIHsKLQkJCQkJCSgoTGlzdCkgY29udGFpbm1lbnRJbmZvLmNvbnRhaW5lci5lR2V0KGYpKS5hZGQoCi0JCQkJCQkJCWNvbnRhaW5tZW50SW5mby5pbmRleCwgZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljb250YWlubWVudEluZm8uY29udGFpbmVyLmVTZXQoZiwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChpbGxlZ2FsUmVmZXJlbmNlUmVtb3ZlciAhPSBudWxsKSB7Ci0JCQkJaWxsZWdhbFJlZmVyZW5jZVJlbW92ZXIucmVzdG9yZVJlbW92ZWRSZWZlcmVuY2VzKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlzdGF0ZSA9IFNUQVRFX1NUQVJUOwotCi0JCQlzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLk9LLAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvcl9yZWFzb24sIG51bGwpOyAKLQotCQkJaWYgKGNoZWNrTmFtZSgpKSB7Ci0JCQkJLy8gY2hlY2sgaWYgdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIHRoaXMKLQkJCQkvLyBjb21tYW5kIGNhbiBiZSBtb2RpZmllZAotCQkJCS8vCi0JCQkJSVN0YXR1cyBleGVjU3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCQkuY2hlY2tDb25maWd1cmF0aW9uc1RvVXBkYXRlKGFkZENvbW1hbmQsIHNoZWxsKTsKLQkJCQlpZiAoIWV4ZWNTdGF0dXMuaXNPSygpKSB7Ci0JCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoTGlicmFyeUVkaXRSZXNvdXJjZXMubW92ZURpYWxvZ190aXRsZSwgbnVsbCwgZXhlY1N0YXR1cyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlmaW5hbCBTdHJpbmdCdWZmZXIgbXNnQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQltb25pdG9yCi0JCQkJCQkJCS5zdWJUYXNrKExpYnJhcnlFZGl0UmVzb3VyY2VzLmNoZWNraW5nUmVmZXJlbmNlc1Rhc2tfbmFtZSk7IAotCQkJCQkJU3RyaW5nIG1zZyA9IGNoZWNrRm9ySWxsZWdhbFJlZmVyZW5jZXMoKTsKLQkJCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQkJCW1zZ0J1ZmZlci5hcHBlbmQobXNnKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfTsKLQotCQkJCUlTdGF0dXMgc3RhdCA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1bkluTW9kYWxDb250ZXh0KHJ1bm5hYmxlLCB0cnVlLCBtb25pdG9yLCBzaGVsbCk7Ci0JCQkJaWYoIXN0YXQuaXNPSygpKSB7Ci0JCQkJCXN0YXR1cy5hZGQoc3RhdCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlpZiAobXNnQnVmZmVyLmxlbmd0aCgpID4gMCkgewotCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCQkJCWlmKHVpSGFuZGxlciAgIT0gbnVsbCkgewotCQkJCQkJaW50IHJldCA9IHVpSGFuZGxlci5zZWxlY3RPbmUobmV3IGludFtdIHtJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fWUVTLCBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fTk8gfSwgCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLm1vdmVEaWFsb2dfdGl0bGUsIG1zZ0J1ZmZlci50b1N0cmluZygpLCBudWxsKTsKLQkJCQkJCWlmKHJldCA9PSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fTk8pIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzYXZlIHJlZmVyZW5jZSB0byBvbGQgcmVzb3VyY2Ugb2YgYWxsIGVsZW1lbnRzIGluIHRoZQotCQkJCS8vIG1vdmVMaXN0Ci0JCQkJLy8KLQkJCQlmaW5hbCBNYXAgZWxlbWVudFRvT2xkUmVzb3VyY2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vdmVMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJLy8gc2F2ZSB0aGUgcmVmZXJlbmNlIHRvIG9sZCByZXNvdXJjZQotCQkJCQkJLy8KLQkJCQkJCWVsZW1lbnRUb09sZFJlc291cmNlTWFwLnB1dChlbGVtZW50LCBlbGVtZW50Ci0JCQkJCQkJCS5lUmVzb3VyY2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAocmVtb3ZlWFJlZlJlcXVpcmVkIHx8IGlzUmVmZW5yZWNlZElsbGVnYWxseSkgewotCQkJCQkvLyBnZXQgc2V0IG9mIHJlc291cmNlcyB0aGF0IHdpbGwgYmUgbW9kaWZpZWQgZHVyaW5nIHRoaXMKLQkJCQkJLy8gbW92ZQotCQkJCQkvLwotCQkJCQlpbGxlZ2FsUmVmZXJlbmNlUmVtb3ZlciA9IG5ldyBJbGxlZ2FsUmVmZXJlbmNlUmVtb3ZlcigKLQkJCQkJCQlvd25lclBsdWdpbiwgbW92ZUxpc3QsIHJlbW92ZVhSZWZSZXF1aXJlZCwKLQkJCQkJCQlpc1JlZmVucmVjZWRJbGxlZ2FsbHkpOwotCQkJCQlydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQkJbW9uaXRvcgotCQkJCQkJCQkJLnN1YlRhc2soTGlicmFyeUVkaXRSZXNvdXJjZXMuY2hlY2tBZmZlY3RlZFJlc291cmNlc1Rhc2tfbmFtZSk7IAotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzID0gaWxsZWdhbFJlZmVyZW5jZVJlbW92ZXIKLQkJCQkJCQkJCS5nZXRBZmZlY3RlZFJlc291cmNlcygpOwotCQkJCQkJfQotCi0JCQkJCX07Ci0JCQkJCXN0YXQgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5ydW5Jbk1vZGFsQ29udGV4dChydW5uYWJsZSwgdHJ1ZSwgbW9uaXRvciwgc2hlbGwpOwotCQkJCQlpZighc3RhdC5pc09LKCkpIHsKLQkJCQkJCXN0YXR1cy5hZGQoc3RhdCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQkvLyBjaGVjayBhZmZlY3RlZCByZXNvdXJjZXMgZm9yIHVubW9kaWZpYWJsZQotCQkJCQlleGVjU3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KAotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLCBzaGVsbCk7Ci0JCQkJCWlmICghZXhlY1N0YXR1cy5pc09LKCkpIHsKLQkJCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoTGlicmFyeUVkaXRSZXNvdXJjZXMubW92ZURpYWxvZ190aXRsZSwgbnVsbCwgZXhlY1N0YXR1cyk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQl0cnkgewotCQkJCQkJbW9uaXRvcgotCQkJCQkJCQkuc3ViVGFzayhMaWJyYXJ5RWRpdFJlc291cmNlcy5yZW1vdmluZ1JlZmVyZW5jZXN0YXNrX25hbWUpOyAKLQkJCQkJCWlsbGVnYWxSZWZlcmVuY2VSZW1vdmVyLnJlbW92ZUlsbGVnYWxSZWZlcmVuY2VzKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl1bmRvKCk7Ci0JCQkJCQlTdHJpbmcgbXNnID0gVG5nVXRpbC50b1N0YWNrVHJhY2VTdHJpbmcoZSk7Ci0JCQkJCQlzdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJCTAsIG1zZywgZSkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJCQltb25pdG9yLnN1YlRhc2soIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQkJLy8gc2V0IG5ldyBuYW1lIGlmIHRoZXJlIGlzIGFueQotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudFRvTmV3TmFtZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCQlOYW1lZEVsZW1lbnQgZWxlbWVudCA9IChOYW1lZEVsZW1lbnQpIGVudHJ5LmdldEtleSgpOwotCQkJCQllbGVtZW50LnNldE5hbWUoKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChlbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RVbml0KSB7Ci0JCQkJCQltb3ZlZFJlc291cmNlcy5hZGQoZWxlbWVudC5lUmVzb3VyY2UoKSk7Ci0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCQkJQ29udGVudEVsZW1lbnQgZSA9IChDb250ZW50RWxlbWVudCkgZWxlbWVudDsKLQkJCQkJCQlpZiAoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24oZSkpIHsKLQkJCQkJCQkJbW92ZWRSZXNvdXJjZXMuYWRkKGUuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIG1vdmUgZWxlbWVudHMKLQkJCQkvLwotCQkJCXJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCW1vbml0b3IKLQkJCQkJCQkJLnNldFRhc2tOYW1lKExpYnJhcnlFZGl0UmVzb3VyY2VzLm1vdmluZ1Rhc2tfbmFtZSk7IAotCQkJCQkJZG9Nb3ZlKG1vbml0b3IsIGVsZW1lbnRUb09sZFJlc291cmNlTWFwLAotCQkJCQkJCQltb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJCX0KLQotCQkJCX07Ci0JCQkJc3RhdCA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1bkluTW9kYWxDb250ZXh0KHJ1bm5hYmxlLCB0cnVlLCBtb25pdG9yLCBzaGVsbCk7Ci0JCQkJaWYoIXN0YXQuaXNPSygpKSB7Ci0JCQkJCXVuZG8oKTsKLQkJCQkJc3RhdHVzLmFkZChzdGF0KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCi0JCQkJLy8gY2hlY2sgbW92ZWQgcmVzb3VyY2VzIHRoYXQgYXJlIG5vdCBpbiBtb2RpZmlhYmxlIHJlc291cmNlcwotCQkJCS8vIGZvciB1bm1vZGlmaWFibGUKLQkJCQkvLwotCQkJCUxpc3QgcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdChtb3ZlZFJlc291cmNlcyk7Ci0JCQkJcmVzb3VyY2VzLnJlbW92ZUFsbChtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJZXhlY1N0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkJLmNoZWNrTW9kaWZ5KHJlc291cmNlcywgc2hlbGwpOwotCQkJCWlmICghZXhlY1N0YXR1cy5pc09LKCkpIHsKLQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dFcnJvcihMaWJyYXJ5RWRpdFJlc291cmNlcy5tb3ZlRGlhbG9nX3RpdGxlLCBudWxsLCBleGVjU3RhdHVzKTsKLQotCQkJCQl1bmRvKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQkvLyBzYXZlIHJlc291cmNlcwotCQkJCS8vCi0JCQkJcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlJU3RhdHVzIHNhdmVTdGF0dXMgPSBzYXZlKG1vbml0b3IpOwotCQkJCQkJCWlmICghc2F2ZVN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQkJc3RhdHVzLmFkZChzYXZlU3RhdHVzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQkJdGhyb3cgZTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfTsKLQkJCQlzdGF0ID0gVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucnVuSW5Nb2RhbENvbnRleHQocnVubmFibGUsIHRydWUsIG1vbml0b3IsIHNoZWxsKTsKLQkJCQlpZighc3RhdC5pc09LKCkpIHsKLQkJCQkJc3RhdHVzLmFkZChzdGF0KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJfQotCi0JCQlzdGF0ZSA9IFNUQVRFX0VORDsKLQkJfQotCi0JCS8qKgotCQkgKiBpbnRlcmFjdHMgd2l0aCB1c2VyCi0JCSAqIAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gY2hlY2tOYW1lKCkgewotCQkJZWxlbWVudFRvTmV3TmFtZU1hcCA9IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kLmNoZWNrTmFtZShhZGRDb21tYW5kKTsKLQkJCXJldHVybiBlbGVtZW50VG9OZXdOYW1lTWFwICE9IG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogTG9uZyBydW5uaW5nIG1ldGhvZAotCQkgKiAKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgY2hlY2tGb3JJbGxlZ2FsUmVmZXJlbmNlcygpIHsKLQkJCWVsZW1lbnRUb09sZFBsdWdpbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJCW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdChhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKSk7Ci0JCQltb3ZlZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0KLQkJCQkvLyAvLyBzZXQgbmV3IG5hbWUgaWYgdGhlcmUgaXMgYW55Ci0JCQkJLy8gLy8KLQkJCQkvLyBTdHJpbmcgbmV3TmFtZSA9IChTdHJpbmcpIGVsZW1lbnRUb05ld05hbWVNYXAuZ2V0KGVsZW1lbnQpOwotCQkJCS8vIGlmKG5ld05hbWUgIT0gbnVsbCkgewotCQkJCS8vICgoTmFtZWRFbGVtZW50KWVsZW1lbnQpLnNldE5hbWUobmV3TmFtZSk7Ci0JCQkJLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFVuaXQpIHsKLQkJCQkvLyBtb3ZlZFJlc291cmNlcy5hZGQoZWxlbWVudC5lUmVzb3VyY2UoKSk7Ci0JCQkJLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJLy8gQ29udGVudEVsZW1lbnQgZSA9IChDb250ZW50RWxlbWVudCkgZWxlbWVudDsKLQkJCQkvLyBpZihDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihlKSkgewotCQkJCS8vIG1vdmVkUmVzb3VyY2VzLmFkZChlLmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyB9Ci0KLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJZWxlbWVudFRvT2xkUGx1Z2luTWFwLnB1dChlbGVtZW50LCBVbWFVdGlsCi0JCQkJCQkJLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KSk7Ci0JCQkJfQotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmVBbGxDb250ZW50cygpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJbW92ZUxpc3QuYWRkKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBjaGVjayBpZiB0aGVyZSBpcyBhbnkgaWxsZWdhbCByZWZlcmVuY2UgaW4gdGhlIG1vdmVkIG9iamVjdHMKLQkJCS8vCQkJCi0JCQlvd25lclBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGFkZENvbW1hbmQuZ2V0T3duZXIoKSk7Ci0JCQlmaW5kX3hQbHVnaW5SZWY6IGZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCi0JCQkJaWYgKGlzRXhjbHVkZWRGcm9tT3V0Z29pbmdSZWZlcmVuY2VDaGVjayhlbGVtZW50KSkgewotCQkJCQljb250aW51ZSBmaW5kX3hQbHVnaW5SZWY7Ci0JCQkJfQotCi0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWlmIChoYXNJbGxlZ2FsUmVmZXJlbmNlSW5jbHVkaW5nQWxsQ2hpbGRyZW4ob3duZXJQbHVnaW4sCi0JCQkJCQkJKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQsIG1vdmVMaXN0KSkgewotCQkJCQkJcmVtb3ZlWFJlZlJlcXVpcmVkID0gdHJ1ZTsKLQkJCQkJCWJyZWFrIGZpbmRfeFBsdWdpblJlZjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJZmluZF9pbGxlZ2FsUmVmZXJlbmNlcjogZm9yIChJdGVyYXRvciBpdGVyID0gbW92ZUxpc3QuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWlmIChpc1JlZmVyZW5jZWRJbGxlZ2FsbHkob3duZXJQbHVnaW4sCi0JCQkJCQkJKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQsIG1vdmVMaXN0KSkgewotCQkJCQkJaXNSZWZlbnJlY2VkSWxsZWdhbGx5ID0gdHJ1ZTsKLQkJCQkJCWJyZWFrIGZpbmRfaWxsZWdhbFJlZmVyZW5jZXI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocmVtb3ZlWFJlZlJlcXVpcmVkIHx8IGlzUmVmZW5yZWNlZElsbGVnYWxseSkgewotCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkUmVmZXJlbmNlc0Vycm9yX3JlYXNvbjsgCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBMb25nIHJ1bm5pbmcgbWV0aG9kCi0JCSAqIAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgZG9Nb3ZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCQlNYXAgZWxlbWVudFRvT2xkUmVzb3VyY2VNYXAsIFNldCBtb2RpZmllZFJlc291cmNlcykgewotCQkJbW9uaXRvci5zdWJUYXNrKCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQllbGVtZW50VG9PbGRDb250YWluZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJRU9iamVjdCBjb250YWluZXIgPSBlbGVtZW50LmVDb250YWluZXIoKTsKLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBlbGVtZW50LmVDb250YWluaW5nRmVhdHVyZSgpOwotCQkJCQlpbnQgaW5kZXg7Ci0JCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQlpbmRleCA9ICgoTGlzdCkgY29udGFpbmVyLmVHZXQoZmVhdHVyZSkpCi0JCQkJCQkJCS5pbmRleE9mKGVsZW1lbnQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaW5kZXggPSAtMTsKLQkJCQkJfQotCQkJCQllbGVtZW50VG9PbGRDb250YWluZXJNYXAucHV0KGVsZW1lbnQsIG5ldyBDb250YWlubWVudEluZm8oCi0JCQkJCQkJY29udGFpbmVyLCBpbmRleCkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gbW92ZSB0aGUgZWxlbWVudHMKLQkJCS8vCi0JCQlhZGRDb21tYW5kLmV4ZWN1dGUoKTsKLQotCQkJLy8gY29sbGVjdCByZXNvdXJjZXMgdGhhdCBoYWQgYmVlbiBtb2RpZmVkIGFzIHJlc3VsdCBvZiB0aGlzIG1vdmUKLQkJCS8vCi0JCQlSZXNvdXJjZSBuZXdSZXNvdXJjZSA9IGFkZENvbW1hbmQuZ2V0T3duZXIoKS5lUmVzb3VyY2UoKTsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChuZXdSZXNvdXJjZSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRDb21tYW5kLmdldEFmZmVjdGVkT2JqZWN0cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlFT2JqZWN0IG9sZENvbnRhaW5lciA9ICgoQ29udGFpbm1lbnRJbmZvKSBlbGVtZW50VG9PbGRDb250YWluZXJNYXAKLQkJCQkJCQkuZ2V0KGVsZW1lbnQpKS5jb250YWluZXI7Ci0JCQkJCWlmIChvbGRDb250YWluZXIuZVJlc291cmNlKCkgIT0gbmV3UmVzb3VyY2UKLQkJCQkJCQkmJiAhb2xkQ29udGFpbmVyLmVSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkKLQkJCQkJCQkJCS5pc0VtcHR5KCkpIHsKLQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChvbGRDb250YWluZXIuZVJlc291cmNlKCkpOwotCQkJCQkJUmVzb3VyY2Ugb2xkUmVzb3VyY2UgPSAoUmVzb3VyY2UpIGVsZW1lbnRUb09sZFJlc291cmNlTWFwCi0JCQkJCQkJCS5nZXQoZWxlbWVudCk7Ci0JCQkJCQlpZiAob2xkQ29udGFpbmVyLmVSZXNvdXJjZSgpICE9IG9sZFJlc291cmNlKSB7Ci0JCQkJCQkJbW92ZWRSZXNvdXJjZXMuYWRkKG9sZFJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCU9iamVjdCBwbHVnaW4gPSBlbGVtZW50VG9PbGRQbHVnaW5NYXAuZ2V0KGVsZW1lbnQpOwotCQkJCQlpZiAob3duZXJQbHVnaW4gIT0gcGx1Z2luKSB7Ci0JCQkJCQkvLyBpdCdzIGEgY3Jvc3MtcGx1Z2luIG1vdmUsIGFkZCB0aGUgcmVzb3VyY2VzIG9mIHRob3NlCi0JCQkJCQkvLyBjaGlsZHJlbiB0aGF0IGhhdmUgZGlyZWN0IHJlc291cmNlCi0JCQkJCQkvLyB0byB0aGUgbW92ZVJlc291cmNlcyBsaXN0Ci0JCQkJCQkvLwkJCQkJCQotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUFsbENvbnRlbnRzKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJRU9iamVjdCBlID0gKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlpZiAoVW1hVXRpbC5oYXNEaXJlY3RSZXNvdXJjZShlKSkgewotCQkJCQkJCQltb3ZlZFJlc291cmNlcy5hZGQoZS5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJCWVsZW1lbnRUb09sZFBsdWdpbk1hcC5wdXQoZSwgcGx1Z2luKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQgJiYKLQkJCQkJCS8vIENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuaGFzUHJlc2VudGF0aW9uKChEZXNjcmliYWJsZUVsZW1lbnQpCi0JCQkJCQkvLyBlbGVtZW50KSkgewotCQkJCQkJLy8gbW92ZWRSZXNvdXJjZXMuYWRkKCgoRGVzY3JpYmFibGVFbGVtZW50KWVsZW1lbnQpLmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpKTsKLQkJCQkJCS8vIGVsZW1lbnRUb09sZFBsdWdpbk1hcC5wdXQoKChEZXNjcmliYWJsZUVsZW1lbnQpZWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkvLyBwbHVnaW4pOwotCQkJCQkJLy8gfQotCQkJCQkJLy8gZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUFsbENvbnRlbnRzKCk7Ci0JCQkJCQkvLyBpdGVyYXRvcgotCQkJCQkJLy8gLmhhc05leHQoKTspIHsKLQkJCQkJCS8vIE9iamVjdCBlID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJLy8gaWYoZSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCAmJgotCQkJCQkJLy8gQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24oKERlc2NyaWJhYmxlRWxlbWVudCkKLQkJCQkJCS8vIGUpKSB7Ci0JCQkJCQkvLyBtb3ZlZFJlc291cmNlcy5hZGQoKChEZXNjcmliYWJsZUVsZW1lbnQpZSkuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCkpOwotCQkJCQkJLy8gZWxlbWVudFRvT2xkUGx1Z2luTWFwLnB1dCgoKERlc2NyaWJhYmxlRWxlbWVudCllKS5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCS8vIHBsdWdpbik7Ci0JCQkJCQkvLyB9Ci0JCQkJCQkvLyB9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIElTdGF0dXMgc2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCU11bHRpU3RhdHVzIHN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cygKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCUlTdGF0dXMuT0ssCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX2Vycm9yU2F2aW5nRmlsZXMsCi0JCQkJCW51bGwpOyAKLQotCQkJbW9uaXRvci5zdWJUYXNrKExpYnJhcnlFZGl0UmVzb3VyY2VzLnNhdmluZ01vZGlmaWVkRmlsZXNUYXNrX25hbWUpOyAKLQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBTZXJ2aWNlcwotCQkJCQkuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJc2F2ZTogZG8gewotCQkJCXRyeSB7Ci0KLQkJCQkJaWYgKCFtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCW1vbml0b3IKLQkJCQkJCQkJLnN1YlRhc2soTGlicmFyeUVkaXRSZXNvdXJjZXMubW92aW5nRmlsZXNUYXNrX25hbWUpOyAKLQotCQkJCQkJLy8gbW92ZSB0aGUgbW92ZWQgcmVzb3VyY2VzCi0JCQkJCQkvLwotCQkJCQkJcGVyc2lzdGVyLmFkanVzdExvY2F0aW9uKG1vdmVkUmVzb3VyY2VzKTsKLQkJCQkJfQotCQkJCQlzdGF0ZSA9IFNUQVRFX01PVkVEX0ZJTEVTOwotCi0JCQkJCS8vIHNhdmUgdGhlIG1vZGlmaWVkIHJlc291cmNlcwotCQkJCQkvLwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2RpZmllZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLy8gbW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJTYXZpbmcKLQkJCQkJCQkvLyAnJ3swfScnIiwgcGF0aEFyZ3MpKTsKLQkJCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKAotCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuc2F2ZUZpbGVFcnJvcl9yZWFzb24sCi0JCQkJCQkJCQlyZXNvdXJjZS5nZXRVUkkoKS5pc0ZpbGUoKSA/IHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpIDogcmVzb3VyY2UudG9TdHJpbmcoKSk7Ci0JCQkJCQkJc3RhdHVzLmFkZChuZXcgU2F2ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQkJCQkJU2F2ZVN0YXR1cy5TQVZFX0VSUk9SLCBtc2csIGUpKTsKLQkJCQkJCQlicmVhayBzYXZlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJc3RhdGUgPSBTVEFURV9TQVZFRF9GSUxFUzsKLQotCQkJCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCQkJCW1vbml0b3IKLQkJCQkJCQkJLnN1YlRhc2soTGlicmFyeUVkaXRSZXNvdXJjZXMuY29weWluZ1Jlc291cmNlc1Rhc2tfbmFtZSk7IAotCi0JCQkJCQlDb2xsZWN0aW9uIGVsZW1lbnRzVG9Db3B5UmVmQ29udGVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb3ZlZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJCWVsZW1lbnRzVG9Db3B5UmVmQ29udGVudHMuYWRkQWxsKHJlc291cmNlCi0JCQkJCQkJCQkuZ2V0Q29udGVudHMoKSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCWVsZW1lbnRzVG9Db3B5UmVmQ29udGVudHMuYWRkQWxsKGFkZENvbW1hbmQKLQkJCQkJCQkJLmdldEFmZmVjdGVkT2JqZWN0cygpKTsKLQotCQkJCQkJQ29sbGVjdGlvbiBtb2RpZmllZCA9IHJlc01nci5jb3B5UmVmZXJlbmNlZENvbnRlbnRzKAotCQkJCQkJCQllbGVtZW50c1RvQ29weVJlZkNvbnRlbnRzLAotCQkJCQkJCQllbGVtZW50VG9PbGRQbHVnaW5NYXApOwotCQkJCQkJaWYgKG1vZGlmaWVkICE9IG51bGwgJiYgIW1vZGlmaWVkLmlzRW1wdHkoKSkgewotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQkJT2JqZWN0W10gcGF0aEFyZ3MgPSB7IHJlc291cmNlLmdldFVSSSgpLmlzRmlsZSgpID8gcmVzb3VyY2UuZ2V0VVJJKCkKLQkJCQkJCQkJCQkudG9GaWxlU3RyaW5nKCkgOiByZXNvdXJjZS50b1N0cmluZygpfTsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCW1vbml0b3IKLQkJCQkJCQkJCQkJLnN1YlRhc2soTWVzc2FnZUZvcm1hdAotCQkJCQkJCQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5zYXZpbmdGaWxlVGFza19uYW1lLAotCQkJCQkJCQkJCQkJCQkJcGF0aEFyZ3MpKTsgCi0JCQkJCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdAotCQkJCQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnNhdmVGaWxlRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJCQkJCXBhdGhBcmdzKTsgCi0JCQkJCQkJCQlzdGF0dXMuYWRkKG5ldyBTYXZlU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQkJCQkJCQlTYXZlU3RhdHVzLlNBVkVfRVJST1IsIG1zZywgZSkpOwotCQkJCQkJCQkJYnJlYWsgc2F2ZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCXN0YXRlID0gU1RBVEVfQ09QSUVEX1JFU09VUkNFUzsKLQotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQlTdHJpbmdXcml0ZXIgbXNnID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJCQllLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIobXNnKSk7Ci0JCQkJCUlTdGF0dXMgbmV3U3RhdHVzID0gbmV3IFNhdmVTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQlTYXZlU3RhdHVzLlNBVkVfRVJST1IsIG1zZy50b1N0cmluZygpLCBlKTsKLQkJCQkJc3RhdHVzLmFkZChuZXdTdGF0dXMpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQkJU3RyaW5nV3JpdGVyIG1zZyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCQkJCQllLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIobXNnKSk7Ci0JCQkJCQkJSVN0YXR1cyBuZXdTdGF0dXMgPSBuZXcgU2F2ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQkJCQkJU2F2ZVN0YXR1cy5ST0xMQkFDS19FUlJPUiwgbXNnLnRvU3RyaW5nKCksCi0JCQkJCQkJCQllKTsKLQkJCQkJCQlzdGF0dXMuYWRkKG5ld1N0YXR1cyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IHdoaWxlIChmYWxzZSk7Ci0KLQkJCW1vbml0b3Iuc3ViVGFzayhMaWJyYXJ5RWRpdFJlc291cmNlcy5jb21tYW5kX2RvbmUpOyAKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBSZXNvdXJjZU1hbmFnZXIgewotCi0JCS8qKgotCQkgKiBDb3BpZXMgdGhlIGNvbnRlbnQgcmVzb3VyY2VzIHRoYXQgYXJlIHJlZmVyZW5jZWQgYnkgdGhlIGNvbnRlbnQgb2YKLQkJICogdGhlIGdpdmVuIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIG1vdmVkL2NvcGllZCB0byBuZXcgbG9jYXRpb24uCi0JCSAqIAotCQkgKiBAcGFyYW0gZWxlbWVudHMKLQkJICogICAgICAgICAgICBFbGVtZW50cyB0aGF0IGFyZSBtb3ZlZCBvciBjb3BpZWQuCi0JCSAqIEByZXR1cm4gY29sbGVjdGlvbiBvZiBtb2RpZmllZCByZXNvdXJjZXMgYXMgdGhlIHJlc3VsdCBvZiB0aGlzIGNhbGwuCi0JCSAqLwotCQlDb2xsZWN0aW9uPFJlc291cmNlPiBjb3B5UmVmZXJlbmNlZENvbnRlbnRzKENvbGxlY3Rpb248TWV0aG9kRWxlbWVudD4gZWxlbWVudHMsCi0JCQkJTWFwPE1ldGhvZEVsZW1lbnQsIE1ldGhvZFBsdWdpbj4gZWxlbWVudFRvT2xkUGx1Z2luTWFwKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEJhc2ljUmVzb3VyY2VNYW5hZ2VyIGltcGxlbWVudHMgUmVzb3VyY2VNYW5hZ2VyIHsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQuUmVzb3VyY2VNYW5hZ2VyI2NvcHlSZWZlcmVuY2VkQ29udGVudHMoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JCSAqLwotCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY29weVJlZmVyZW5jZWRDb250ZW50cyhDb2xsZWN0aW9uPE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRzLAotCQkJCU1hcDxNZXRob2RFbGVtZW50LCBNZXRob2RQbHVnaW4+IGVsZW1lbnRUb09sZFBsdWdpbk1hcCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSZXNvdXJjZU1hbmFnZXIoUmVzb3VyY2VNYW5hZ2VyIHJlc01ncikgewotCQlNZXRob2RFbGVtZW50QWRkQ29tbWFuZC5yZXNNZ3IgPSByZXNNZ3I7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nVmFsaWRhdG9yIGdldFN0cmluZ1ZhbGlkYXRvcigpIHsKLQkJaWYgKHN0cmluZ1ZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQlzdHJpbmdWYWxpZGF0b3IgPSBuZXcgU3RyaW5nVmFsaWRhdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ1ZhbGlkYXRvcjsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1ZhbGlkYXRvciBzdHJpbmdWYWxpZGF0b3IgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RyaW5nVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3IgewotCi0JCXByaXZhdGUgQ29sbGVjdGlvbiBlbGVtZW50czsKLQotCQlwcml2YXRlIElWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0JCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmdWYWxpZGF0b3IoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGVsZW1lbnRzCi0JCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnRzIHRvIGluY2x1ZGUgaW4gdGhlIGNoZWNrLgotCQkgKi8KLQkJcHVibGljIFN0cmluZ1ZhbGlkYXRvcihDb2xsZWN0aW9uIGVsZW1lbnRzLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQkJdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOwotCQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBTZXRzIHRoZSBlbGVtZW50cyB0byBpbmNsdWRlIGluIHRoZSBjaGVjay4KLQkJICogCi0JCSAqIEBwYXJhbSBlbGVtZW50cwotCQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50cyB0byBpbmNsdWRlIGluIHRoZSBjaGVjay4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRzKENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklJbnB1dFZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJCWlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBVbmlxdWVuZXNzVmFsaWRhdG9yKSB7Ci0JCQkJRU9iamVjdCBvYmogPSAoKFVuaXF1ZW5lc3NWYWxpZGF0b3IpIHZhbGlkYXRvcikuZ2V0RU9iamVjdCgpOwotCQkJCWludCBjbGFzc0lEID0gb2JqLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpOwotCQkJCW5ld1RleHQgPSBuZXdUZXh0LnRyaW0oKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBlID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQlTdHJpbmcgc3RyID0gKFN0cmluZykgZS5lR2V0KGZlYXR1cmUpOwotCQkJCQlpZiAob2JqICE9IGUgJiYgY2xhc3NJRCA9PSBlLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpCi0JCQkJCQkJJiYgbmV3VGV4dC5lcXVhbHNJZ25vcmVDYXNlKHN0cikpIHsKLQkJCQkJCS8vIHJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksCi0JCQkJCQkvLyBkYXRhKTsKLQkJCQkJCXJldHVybiBOTFMKLQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2csCi0JCQkJCQkJCQkJbmV3VGV4dCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdmFsaWRhdG9yLmlzVmFsaWQobmV3VGV4dCk7Ci0JCX0KLQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWZkY2JlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBjcmVhdGUgYSBjaGlsZCBtZXRob2QgZWxlbWVudCBhbmQgYWRkIGl0IHRvIHRoZQotICogY29udGFpbmluZyBtZXRob2QgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQgZXh0ZW5kcyBDcmVhdGVDaGlsZENvbW1hbmQgewotCi0JcHJpdmF0ZSBib29sZWFuIGV4ZWN1dGVkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIElWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgY2hpbGQsIGludCBpbmRleCwKLQkJCUNvbGxlY3Rpb24gc2VsZWN0aW9uLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXN1cGVyKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNoaWxkLCBpbmRleCwgc2VsZWN0aW9uLCBoZWxwZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdXBlckV4ZWN1dGUoKSB7Ci0JCXN1cGVyLmV4ZWN1dGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlpZih2YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJdmFsaWRhdG9yID0gbmV3IEFic3RyYWN0U3RyaW5nVmFsaWRhdG9yKCkgewotCQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQkJCQlpZiAobmV3VGV4dC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJU3RyaW5nIGVsZW1lbnRUZXh0ID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZWxlbWVudF90ZXh0OyAKLQkJCQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnLCBlbGVtZW50VGV4dCk7IAotCQkJCQl9Ci0JCQkJCUxpc3QgY2hpbGRyZW4gPSAoTGlzdCkgb3duZXIuZUdldChmZWF0dXJlKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlOYW1lZEVsZW1lbnQgY2hpbGQgPSAoTmFtZWRFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChjaGlsZC5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuZXdUZXh0KSkgewotCQkJCQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCQkJCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2csIG5ld1RleHQpOyAKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiB2YWxpZGF0b3I7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXIjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJU3RyaW5nIHRpdGxlID0gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMubmV3RWxlbWVudF90ZXh0LCBoZWxwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKSk7IAotCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IGdldFZhbGlkYXRvcigpOwotLy8JCWZpbmFsIFN0cmluZyBuYW1lID0gVXNlckludGVyYWN0aW9uSGVscGVyLnJlcXVlc3ROYW1lKGNoaWxkLAotLy8JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgdGl0bGUsIHZhbGlkYXRvcik7Ci0JCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJVXNlcklucHV0IHVzZXJJbnB1dCA9IG5ldyBVc2VySW5wdXQoTGlicmFyeUVkaXRSZXNvdXJjZXMubmFtZUxhYmVsX3RleHQsIFVzZXJJbnB1dC5URVhULCAKLQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgdmFsaWRhdG9yLCB0aGlzKTsJCQotCQlpZih1aUhhbmRsZXIucmVxdWVzdElucHV0KHRpdGxlLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5TcGVjaWZ5TmFtZVRleHQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodXNlcklucHV0KSkpIHsgCi0JCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIHVzZXJJbnB1dC5nZXRJbnB1dCgpOwotCQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJCSgoTmFtZWRFbGVtZW50KSBjaGlsZCkuc2V0TmFtZShuYW1lKTsKLQkJCQlzdXBlckV4ZWN1dGUoKTsKLQkJCQlleGVjdXRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kI2dldEFmZmVjdGVkT2JqZWN0cygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlpZiAoZXhlY3V0ZWQpIHsKLQkJCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChvd25lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZCNnZXRSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJaWYgKGV4ZWN1dGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiBvd25lcjsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRDaGlsZCgpIHsKLQkJcmV0dXJuIGNoaWxkOwotCX0KLQkKLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Nb3ZlSW5DYXRlZ29yeUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Nb3ZlSW5DYXRlZ29yeUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM2ZThmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTW92ZUluQ2F0ZWdvcnlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db250ZW50RWxlbWVudE9yZGVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWlzYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gcmVvcmRlciBhIG1ldGhvZCBlbGVtZW50IHdpdGhpbiBhIGNhdGVnb3J5LgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1vdmVJbkNhdGVnb3J5Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeTsKLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQlwcml2YXRlIExpc3QgZWxlbWVudHNMaXN0OwotCQotCXByaXZhdGUgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgZWxlbWVudE9yZGVyTGlzdDsKLQotCXByaXZhdGUgU3RyaW5nW10gY2F0ZWdvcnlQa2dQYXRoOwotCi0JcHJpdmF0ZSBDb250ZW50Q2F0ZWdvcnkgdXNlZENhdGVnb3J5ID0gbnVsbDsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgVVAgPSAxOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IERvd24gPSAwOwotCi0JcHJpdmF0ZSBpbnQgZGlyZWN0aW9uID0gLTE7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbW92ZWQ7Ci0KLQlwdWJsaWMgTW92ZUluQ2F0ZWdvcnlDb21tYW5kKENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSwgTGlzdCBlbGVtZW50c0xpc3QsCi0JCQlDb250ZW50RWxlbWVudE9yZGVyTGlzdCBvcmRlckxpc3QsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgU3RyaW5nW10gY2F0ZWdvcnlQa2dQYXRoLAotCQkJaW50IGRpcmVjdGlvbikgewotCQl0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCXRoaXMuZWxlbWVudHNMaXN0ID0gZWxlbWVudHNMaXN0OwkJCi0JCXRoaXMuZWxlbWVudE9yZGVyTGlzdCA9IG9yZGVyTGlzdCA7Ci0JCXRoaXMuY2F0ZWdvcnlQa2dQYXRoID0gY2F0ZWdvcnlQa2dQYXRoOwotCQl0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKi8KLQlwdWJsaWMgTW92ZUluQ2F0ZWdvcnlDb21tYW5kKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIE1vdmVJbkNhdGVnb3J5Q29tbWFuZChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNhdGVnb3J5LmVSZXNvdXJjZSgpKTsKLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJTWV0aG9kUGx1Z2luIGNhdGVnb3J5UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0ZWdvcnkpOwotCQlNZXRob2RQbHVnaW4gZWxlbWVudFBsdWdpbiA9IFVtYVV0aWwKLQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChNZXRob2RFbGVtZW50KSBlbGVtZW50c0xpc3QuZ2V0KDApKTsKLQotCQlpZiAoY2F0ZWdvcnlQbHVnaW4gIT0gZWxlbWVudFBsdWdpbgotCQkJCSYmIE1pc2MuaXNCYXNlT2YoY2F0ZWdvcnlQbHVnaW4sIGVsZW1lbnRQbHVnaW4pKSB7Ci0JCQl1c2VkQ2F0ZWdvcnkgPSBUbmdVdGlsLmZpbmRDb250cmlidXRvcihVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSgKLQkJCQkJZWxlbWVudFBsdWdpbiwgY2F0ZWdvcnlQa2dQYXRoKSwgY2F0ZWdvcnkpOwotCQl9IGVsc2UgewotCQkJdXNlZENhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JCX0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYgKHVzZWRDYXRlZ29yeSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHNMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCWludCBpbmRleCA9IGVsZW1lbnRPcmRlckxpc3QuaW5kZXhPZihvYmplY3QpOwotCQkJCWlmIChkaXJlY3Rpb24gPT0gVVApIHsKLQkJCQkJaWYgKGluZGV4ID4gMCkKLQkJCQkJCWVsZW1lbnRPcmRlckxpc3QubW92ZShpbmRleCAtIDEsIG9iamVjdCk7Ci0JCQkJfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRG93bikgewotCQkJCQlpZiAoaW5kZXggPCBlbGVtZW50T3JkZXJMaXN0LnNpemUoKSkKLQkJCQkJCWVsZW1lbnRPcmRlckxpc3QubW92ZShpbmRleCArIGVsZW1lbnRzTGlzdC5zaXplKCksIG9iamVjdCk7Ci0JCQkJfQotCQkJCW1vdmVkID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdXNlZENhdGVnb3J5LmVTZXQoZmVhdHVyZSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxlbWVudE9yZGVyTGlzdC5hcHBseSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChtb3ZlZCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlpbnQgaW5kZXggPSBlbGVtZW50T3JkZXJMaXN0LmluZGV4T2Yob2JqZWN0KTsKLQkJCQkJaWYgKGRpcmVjdGlvbiA9PSBVUCkgewotCQkJCQlpZiAoaW5kZXggPCBlbGVtZW50T3JkZXJMaXN0LnNpemUoKSkKLQkJCQkJCWVsZW1lbnRPcmRlckxpc3QubW92ZShpbmRleCArIGVsZW1lbnRzTGlzdC5zaXplKCksIG9iamVjdCk7Ci0JCQkJCX0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERvd24pIHsKLQkJCQkJCWlmIChpbmRleCA+IDApCi0JCQkJCQkJZWxlbWVudE9yZGVyTGlzdC5tb3ZlKGluZGV4IC0gMSwgb2JqZWN0KTsKLQkJCQkJfQotCQkJCQltb3ZlZCA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdXNlZENhdGVnb3J5LmVTZXQoZmVhdHVyZSwgb2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbGVtZW50T3JkZXJMaXN0LmFwcGx5KCk7Ci0JCQltb3ZlZCA9IGZhbHNlOwotCQl9Ci0JCWlmIChUbmdVdGlsLmlzRW1wdHkodXNlZENhdGVnb3J5KSkgewotCQkJRWNvcmVVdGlsLnJlbW92ZSh1c2VkQ2F0ZWdvcnkpOwotCQkJdXNlZENhdGVnb3J5ID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uPENvbnRlbnRDYXRlZ29yeT4gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh1c2VkQ2F0ZWdvcnkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTW92ZUluQ29uZmlndXJhdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlhODQ0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTW92ZUluQ29uZmlndXJhdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gbW92ZSBhIHZpZXcgaW4gYSBtZXRob2QgY29uZmlndXJhdGlvbgotICogQGF1dGhvciBYaWFuZyBEb25nIEh1Ci0gKiBAc2luY2UgMS4yCi0gKiBmaXggZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzM4MjcKLSAqLwotcHVibGljIGNsYXNzIE1vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQkKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCXByaXZhdGUgTGlzdCBlbGVtZW50c0xpc3Q7Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IFVQID0gMTsKLQotCXByaXZhdGUgc3RhdGljIGludCBEb3duID0gMDsKLQotCXByaXZhdGUgaW50IGRpcmVjdGlvbiA9IC0xOwotCi0JcHJpdmF0ZSBib29sZWFuIG1vdmVkOwotCQotCXB1YmxpYyBNb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgTGlzdCBlbGVtZW50c0xpc3QsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGRpcmVjdGlvbikgewotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJdGhpcy5lbGVtZW50c0xpc3QgPSBlbGVtZW50c0xpc3Q7Ci0JCXRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJcmVkbygpOwotCi0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYgKGNvbmZpZyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHNMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUVMaXN0IGxpc3QgPSAoRUxpc3QpIGNvbmZpZy5lR2V0KGZlYXR1cmUpOwotCQkJCWludCBpbmRleCA9IGxpc3QuaW5kZXhPZihvYmplY3QpOwotCQkJCWlmIChkaXJlY3Rpb24gPT0gVVApIHsKLQkJCQkJaWYgKGluZGV4ID4gMCkKLQkJCQkJCWxpc3QubW92ZShpbmRleCAtIDEsIG9iamVjdCk7Ci0JCQkJfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRG93bikgewotCQkJCQlpZiAoaW5kZXggPCBsaXN0LnNpemUoKSkKLQkJCQkJCWxpc3QubW92ZShpbmRleCArIGVsZW1lbnRzTGlzdC5zaXplKCksIG9iamVjdCk7Ci0JCQkJfQotCQkJCW1vdmVkID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29uZmlnLmVTZXQoZmVhdHVyZSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNvbmZpZy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoY29uZmlnLmVSZXNvdXJjZSgpKTsKLQkJfQotCi0JfQotCQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChtb3ZlZCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlFTGlzdCBsaXN0ID0gKEVMaXN0KSBjb25maWcuZUdldChmZWF0dXJlKTsKLQkJCQkJaW50IGluZGV4ID0gbGlzdC5pbmRleE9mKG9iamVjdCk7Ci0JCQkJCWlmIChkaXJlY3Rpb24gPT0gVVApIHsKLQkJCQkJCWlmIChpbmRleCA8IGxpc3Quc2l6ZSgpKQotCQkJCQkJCWxpc3QubW92ZShpbmRleCArIGVsZW1lbnRzTGlzdC5zaXplKCksIG9iamVjdCk7Ci0JCQkJCX0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERvd24pIHsKLQkJCQkJCWlmIChpbmRleCA+IDApCi0JCQkJCQkJbGlzdC5tb3ZlKGluZGV4IC0gMSwgb2JqZWN0KTsKLQkJCQkJfQotCQkJCQltb3ZlZCA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29uZmlnLmVTZXQoZmVhdHVyZSwgb2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQltb3ZlZCA9IGZhbHNlOwotCQl9Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY29uZmlnKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Nb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Nb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhmNmM1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1pc2M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlNlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byByZW9yZGVyIGEgc2VjdGlvbiB3aXRoaW4gYSBzZWN0aW9uIGxpc3QuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQ7Ci0KLQlwcml2YXRlIFNlY3Rpb25MaXN0IHNlY3Rpb25MaXN0OwotCi0JcHJpdmF0ZSBMaXN0PD8gZXh0ZW5kcyBTZWN0aW9uPiBlbGVtZW50c0xpc3Q7Ci0KLQlwcml2YXRlIENvbnRlbnRFbGVtZW50IHVzZWRDb250ZW50RWxlbWVudCA9IG51bGw7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgVVAgPSAxOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IERvd24gPSAwOwotCi0JcHJpdmF0ZSBpbnQgZGlyZWN0aW9uID0gLTE7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbW92ZWQ7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZChDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCwKLQkJCUxpc3Q8PyBleHRlbmRzIFNlY3Rpb24+IGVsZW1lbnRzTGlzdCwgU2VjdGlvbkxpc3Qgc2VjdGlvbkxpc3QsIGludCBkaXJlY3Rpb24pIHsKLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCQl0aGlzLnNlY3Rpb25MaXN0ID0gc2VjdGlvbkxpc3Q7Ci0JCXRoaXMuZWxlbWVudHNMaXN0ID0gZWxlbWVudHNMaXN0OwotCQl0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLQotCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICovCi0JcHVibGljIE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZChTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobGFiZWwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNvbnRlbnRFbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJTWV0aG9kUGx1Z2luIHRhc2tQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjb250ZW50RWxlbWVudCk7Ci0JCU1ldGhvZFBsdWdpbiBlbGVtZW50UGx1Z2luID0gVW1hVXRpbAotCQkJCS5nZXRNZXRob2RQbHVnaW4oKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnRzTGlzdC5nZXQoMCkpOwotCi0JCWlmICh0YXNrUGx1Z2luICE9IGVsZW1lbnRQbHVnaW4KLQkJCQkmJiBNaXNjLmlzQmFzZU9mKHRhc2tQbHVnaW4sIGVsZW1lbnRQbHVnaW4pKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBUbmdVdGlsLmdldENvbnRyaWJ1dG9ycyhjb250ZW50RWxlbWVudCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAodmUgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudAotCQkJCQkJJiYgVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4odmUpID09IGVsZW1lbnRQbHVnaW4pIHsKLQkJCQkJdXNlZENvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSB2ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh1c2VkQ29udGVudEVsZW1lbnQgPT0gbnVsbCkgewotCQkJdXNlZENvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlpZiAodXNlZENvbnRlbnRFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBzaXplID0gZWxlbWVudHNMaXN0LnNpemUoKTsKLQkJZm9yIChTZWN0aW9uIG9iamVjdCA6IGVsZW1lbnRzTGlzdCkgewotCQkJaW50IGluZGV4ID0gc2VjdGlvbkxpc3QuaW5kZXhPZihvYmplY3QpOwotCQkJaWYgKGRpcmVjdGlvbiA9PSBVUCkgewotCQkJCWlmIChpbmRleCA+IDApCi0JCQkJCXNlY3Rpb25MaXN0Lm1vdmUoaW5kZXggLSAxLCBvYmplY3QpOwotCQkJfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRG93bikgewotCQkJCWlmIChpbmRleCA8IHNlY3Rpb25MaXN0LnNpemUoKSkKLQkJCQkJc2VjdGlvbkxpc3QubW92ZShpbmRleCArIHNpemUsIG9iamVjdCk7Ci0JCQl9Ci0JCQltb3ZlZCA9IHRydWU7Ci0JCX0KLQkJc2VjdGlvbkxpc3QuYXBwbHkoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChtb3ZlZCkgewotCQkJaW50IHNpemUgPSBlbGVtZW50c0xpc3Quc2l6ZSgpOwotCQkJZm9yIChTZWN0aW9uIG9iamVjdCA6IGVsZW1lbnRzTGlzdCkgewotCQkJCWludCBpbmRleCA9IHNlY3Rpb25MaXN0LmluZGV4T2Yob2JqZWN0KTsKLQkJCQlpZiAoZGlyZWN0aW9uID09IFVQKSB7Ci0JCQkJCWlmIChpbmRleCA8IHNlY3Rpb25MaXN0LnNpemUoKSkKLQkJCQkJCXNlY3Rpb25MaXN0Lm1vdmUoaW5kZXggKyBzaXplLCBvYmplY3QpOwotCQkJCX0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERvd24pIHsKLQkJCQkJaWYgKGluZGV4ID4gMCkKLQkJCQkJCXNlY3Rpb25MaXN0Lm1vdmUoaW5kZXggLSAxLCBvYmplY3QpOwotCQkJCX0KLQkJCQltb3ZlZCA9IHRydWU7Ci0JCQl9Ci0JCQlzZWN0aW9uTGlzdC5hcHBseSgpOwotCQkJbW92ZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodXNlZENvbnRlbnRFbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9OZXN0ZWRDb21tYW5kRXhjZWN1dG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTmVzdGVkQ29tbWFuZEV4Y2VjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmM2OTBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9OZXN0ZWRDb21tYW5kRXhjZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgTmVzdGVkQ29tbWFuZEV4Y2VjdXRvciB7Ci0JcHJpdmF0ZSBDb21tYW5kIGNvbW1hbmQ7Ci0JcHJpdmF0ZSBBcnJheUxpc3Q8Q29tbWFuZD4gbmVzdGVkQ29tbWFuZHM7Ci0KLQlwdWJsaWMgTmVzdGVkQ29tbWFuZEV4Y2VjdXRvcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLQl9Ci0JCi0JcHVibGljIExpc3Q8Q29tbWFuZD4gZ2V0TmVzdGVkQ29tbWFuZHMoKSB7Ci0JCWlmKG5lc3RlZENvbW1hbmRzID09IG51bGwpIHsKLQkJCW5lc3RlZENvbW1hbmRzID0gbmV3IEFycmF5TGlzdDxDb21tYW5kPigpOwotCQl9Ci0JCXJldHVybiBuZXN0ZWRDb21tYW5kczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlTmVzdGVkQ29tbWFuZHMoKSB7Ci0JCUxpc3Q8SU5lc3RlZENvbW1hbmRQcm92aWRlcj4gbmVzdGVkQ29tbWFuZFByb3ZpZGVycyA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0TmVzdGVkQ29tbWFuZFByb3ZpZGVycygpOwotCQlpZighbmVzdGVkQ29tbWFuZFByb3ZpZGVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSU5lc3RlZENvbW1hbmRQcm92aWRlciBjbWRQcm92aWRlciA6IG5lc3RlZENvbW1hbmRQcm92aWRlcnMpIHsKLQkJCQl0cnkgewotCQkJCQlDb21tYW5kIGNtZCA9IGNtZFByb3ZpZGVyLmNyZWF0ZU5lc3RlZENvbW1hbmQoY29tbWFuZCk7Ci0JCQkJCWlmKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsJCQkJCQkJCi0JCQkJCQljbWQuZXhlY3V0ZSgpOwotCQkJCQkJZ2V0TmVzdGVkQ29tbWFuZHMoKS5hZGQoY21kKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9CQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG9OZXN0ZWRDb21tYW5kcygpIHsKLQkJaWYobmVzdGVkQ29tbWFuZHMgIT0gbnVsbCAmJiAhbmVzdGVkQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IoaW50IGkgPSBuZXN0ZWRDb21tYW5kcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCUNvbW1hbmQgY21kID0gKENvbW1hbmQpIG5lc3RlZENvbW1hbmRzLmdldChpKTsKLQkJCQl0cnkgewotCQkJCQlpZihjbWQuY2FuVW5kbygpKSB7Ci0JCQkJCQljbWQudW5kbygpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCXRyeSB7IGNtZC5kaXNwb3NlKCk7IH0gY2F0Y2goRXhjZXB0aW9uIGUpIHt9Ci0JCQkJfQotCQkJfQotCQkJbmVzdGVkQ29tbWFuZHMuY2xlYXIoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKG5lc3RlZENvbW1hbmRzICE9IG51bGwgJiYgIW5lc3RlZENvbW1hbmRzLmlzRW1wdHkoKSkgewotCQkJZm9yKGludCBpID0gbmVzdGVkQ29tbWFuZHMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlDb21tYW5kIGNtZCA9IChDb21tYW5kKSBuZXN0ZWRDb21tYW5kcy5nZXQoaSk7Ci0JCQkJdHJ5IHsgY21kLmRpc3Bvc2UoKTsgfSBjYXRjaChFeGNlcHRpb24gZSkge30KLQkJCX0KLQkJCW5lc3RlZENvbW1hbmRzLmNsZWFyKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlDb2xsZWN0aW9uPFJlc291cmNlPiBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCQlpZihuZXN0ZWRDb21tYW5kcyAhPSBudWxsICYmICFuZXN0ZWRDb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCWZvcihpbnQgaSA9IG5lc3RlZENvbW1hbmRzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJQ29tbWFuZCBjbWQgPSAoQ29tbWFuZCkgbmVzdGVkQ29tbWFuZHMuZ2V0KGkpOwotCQkJCWlmKGNtZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCQl0cnkgewotCQkJCQkJQ29sbGVjdGlvbiByZXNvdXJjZXMgPSAoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCljbWQpLmdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCQkJCQlpZihyZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbChyZXNvdXJjZXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzLmlzRW1wdHkoKSA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZWZlcmVuY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmOGQ4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZmVyZW5jZSB7Ci0JCi0JRU9iamVjdCBvd25lcjsKLQotCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JT2JqZWN0IHZhbHVlOwotCi0JaW50IGluZGV4ID0gLTE7Ci0KLQlwdWJsaWMgUmVmZXJlbmNlKEVPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgb3duZXIuZUdldChmZWF0dXJlKTsKLQkJCWluZGV4ID0gbGlzdC5pbmRleE9mKHZhbHVlKTsKLQkJfQotCX0KLQotCVJlZmVyZW5jZShFT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuaW5kZXggPSBpbmRleDsKLQl9Ci0KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRPd25lcigpIHsKLQkJcmV0dXJuIG93bmVyOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZUZyb21DYXRlZ29yeUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZW1vdmVGcm9tQ2F0ZWdvcnlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZTEwYmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZUZyb21DYXRlZ29yeUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NaXNjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byByZW1vdmUgYSBtZXRob2QgZWxlbWVudCBmcm9tIGEgY2F0ZWdvcnkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVGcm9tQ2F0ZWdvcnlDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgQ29udGVudENhdGVnb3J5IGNhdGVnb3J5OwotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JcHJpdmF0ZSBTdHJpbmdbXSBjb250ZW50UGtnUGF0aDsKLQotCXByaXZhdGUgQ29udGVudENhdGVnb3J5IHVzZWRDYXRlZ29yeTsKLQotCXByaXZhdGUgaW50IHJlbW92ZWRFbGVtZW50SW5kZXggPSAtMTsKLQotCXByaXZhdGUgYm9vbGVhbiByZW1vdmVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIExpc3QgdXNlZENhdGVnb3JpZXM7Ci0KLQlwdWJsaWMgUmVtb3ZlRnJvbUNhdGVnb3J5Q29tbWFuZChDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnksCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJU3RyaW5nW10gY29udGVudFBrZ1BhdGgsIExpc3QgdXNlZENhdGVnb3JpZXMpIHsKLQkJdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLmNvbnRlbnRQa2dQYXRoID0gY29udGVudFBrZ1BhdGg7Ci0JCXRoaXMudXNlZENhdGVnb3JpZXMgPSB1c2VkQ2F0ZWdvcmllczsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKHVzZWRDYXRlZ29yeSAhPSBudWxsICYmIHVzZWRDYXRlZ29yeS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh1c2VkQ2F0ZWdvcnkuZVJlc291cmNlKCkpOwotCQl9Ci0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJTWV0aG9kUGx1Z2luIGNhdGVnb3J5UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0ZWdvcnkpOwotCQlNZXRob2RQbHVnaW4gZWxlbWVudFBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCi0JCWlmIChjYXRlZ29yeVBsdWdpbiAhPSBlbGVtZW50UGx1Z2luCi0JCQkJJiYgTWlzYy5pc0Jhc2VPZihjYXRlZ29yeVBsdWdpbiwgZWxlbWVudFBsdWdpbikpIHsKLQkJCXVzZWRDYXRlZ29yeSA9IFRuZ1V0aWwuZmluZENvbnRyaWJ1dG9yKFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKAotCQkJCQllbGVtZW50UGx1Z2luLCBjb250ZW50UGtnUGF0aCksIGNhdGVnb3J5KTsKLQkJfSBlbHNlIHsKLQkJCXVzZWRDYXRlZ29yeSA9IGNhdGVnb3J5OwotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWlmICh1c2VkQ2F0ZWdvcnkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIHVzZWRDYXRlZ29yeS5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKGNvbGxlY3Rpb24gaW5zdGFuY2VvZiBFTGlzdCkgewotCQkJCXJlbW92ZWRFbGVtZW50SW5kZXggPSAoKEVMaXN0KSBjb2xsZWN0aW9uKS5pbmRleE9mKGVsZW1lbnQpOwotCQkJfQotCQkJcmVtb3ZlZCA9IGNvbGxlY3Rpb24ucmVtb3ZlKGVsZW1lbnQpOwotCQl9IGVsc2UgewotCQkJdXNlZENhdGVnb3J5LmVTZXQoZmVhdHVyZSwgbnVsbCk7Ci0JCQlyZW1vdmVkID0gdHJ1ZTsKLQkJfQotCQlpZiAocmVtb3ZlZCkgewotCQkJaWYgKCF1c2VkQ2F0ZWdvcmllcy5jb250YWlucyhjYXRlZ29yeSkpIHsKLQkJCQl1c2VkQ2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChyZW1vdmVkKSB7Ci0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSB1c2VkQ2F0ZWdvcnkuZUdldChmZWF0dXJlKTsKLQkJCQlpZiAoY29sbGVjdGlvbiBpbnN0YW5jZW9mIEVMaXN0ICYmIHJlbW92ZWRFbGVtZW50SW5kZXggIT0gLTEpIHsKLQkJCQkJKChFTGlzdCkgY29sbGVjdGlvbikuYWRkKHJlbW92ZWRFbGVtZW50SW5kZXgsIGVsZW1lbnQpOwotCQkJCX0gZWxzZQotCQkJCQljb2xsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdXNlZENhdGVnb3J5LmVTZXQoZmVhdHVyZSwgZWxlbWVudCk7Ci0JCQl9Ci0JCQlyZW1vdmVkID0gZmFsc2U7Ci0JCX0KLQkJaWYgKHVzZWRDYXRlZ29yaWVzLmNvbnRhaW5zKGNhdGVnb3J5KSkgewotCQkJdXNlZENhdGVnb3JpZXMucmVtb3ZlKGNhdGVnb3J5KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNnZXRSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJaWYgKHJlbW92ZWQpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZUZyb21TZWN0aW9uTGlzdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZUZyb21TZWN0aW9uTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjRhZGUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZW1vdmVGcm9tU2VjdGlvbkxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byByZW1vdmUgYSBzZWN0aW9uIGZyb20gYSBzZWN0aW9uIGxpc3QuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVGcm9tU2VjdGlvbkxpc3QgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudDsKLQotCXByaXZhdGUgU2VjdGlvbkxpc3Qgc2VjdGlvbkxpc3Q7Ci0KLQlwcml2YXRlIFNlY3Rpb24gc2VjdGlvbjsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgYm9vbGVhbiByZW1vdmVkOwotCi0JcHJpdmF0ZSBpbnQgcmVtb3ZlZE9iamVjdEluZGV4ID0gLTE7Ci0KLQlwdWJsaWMgUmVtb3ZlRnJvbVNlY3Rpb25MaXN0KENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50LAotCQkJU2VjdGlvbiBzZWN0aW9uLCBTZWN0aW9uTGlzdCBzZWN0aW9uTGlzdCkgewotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCXRoaXMuc2VjdGlvbkxpc3QgPSBzZWN0aW9uTGlzdDsKLQkJdGhpcy5zZWN0aW9uID0gc2VjdGlvbjsKLQotCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCkpOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYgKGNvbnRlbnRFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXJlbW92ZWRPYmplY3RJbmRleCA9IHNlY3Rpb25MaXN0LmluZGV4T2Yoc2VjdGlvbik7Ci0JCXNlY3Rpb25MaXN0LnJlbW92ZShzZWN0aW9uKTsKLQkJcmVtb3ZlZCA9IHRydWU7Ci0JCXNlY3Rpb25MaXN0LmFwcGx5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKHJlbW92ZWQpIHsKLQkJCWlmIChyZW1vdmVkT2JqZWN0SW5kZXggIT0gLTEpIHsKLQkJCQlzZWN0aW9uTGlzdC5hZGQocmVtb3ZlZE9iamVjdEluZGV4LCBzZWN0aW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VjdGlvbkxpc3QuYWRkKHNlY3Rpb24pOwotCQkJfQotCQkJc2VjdGlvbkxpc3QuYXBwbHkoKTsKLQkJCXJlbW92ZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY29udGVudEVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZVJlZmVyZW5jZXNDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVtb3ZlUmVmZXJlbmNlc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcxODk0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVtb3ZlUmVmZXJlbmNlc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gcmVtb3ZlIG1ldGhvZCBlbGVtZW50IHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVSZWZlcmVuY2VzQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIE1ldGhvZFBsdWdpbiBwbHVnaW47Ci0KLQlwcml2YXRlIE1ldGhvZFBsdWdpbiBiYXNlOwotCi0JcHJpdmF0ZSBNYXA8RmVhdHVyZVZhbHVlUGFpciwgT2JqZWN0PiBmZWF0dXJlVmFsdWVQYWlyVG9PYmplY3RNYXA7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIGNvbW1hbmQgdG8gcmVtb3ZlIGFsbCByZWZlcmVuY2VzIGluIDxjb2RlPnBsdWdpbjwvY29kZT4KLQkgKiB0aGF0IGFyZSBlbGVtZW50cyBvZiA8Y29kZT5iYXNlPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcGFyYW0gYmFzZQotCSAqLwotCXB1YmxpYyBSZW1vdmVSZWZlcmVuY2VzQ29tbWFuZChNZXRob2RQbHVnaW4gcGx1Z2luLCBNZXRob2RQbHVnaW4gYmFzZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLQkJdGhpcy5iYXNlID0gYmFzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjcHJlcGFyZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlmZWF0dXJlVmFsdWVQYWlyVG9PYmplY3RNYXAgPSBuZXcgSGFzaE1hcDxGZWF0dXJlVmFsdWVQYWlyLCBPYmplY3Q+KCk7Ci0JCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0KLQkJZm9yIChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IgZmVhdHVyZUl0ZXJhdG9yID0gKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvcikgcGx1Z2luCi0JCQkJLmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBmZWF0dXJlSXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCByZWYgPSAoRU9iamVjdCkgZmVhdHVyZUl0ZXJhdG9yLm5leHQoKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gZmVhdHVyZUl0ZXJhdG9yLmZlYXR1cmUoKTsKLQkJCWlmIChmICE9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9CYXNlcygpCi0JCQkJCSYmIFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHJlZikgPT0gYmFzZSkgewotCQkJCWZlYXR1cmVWYWx1ZVBhaXJUb09iamVjdE1hcC5wdXQobmV3IEZlYXR1cmVWYWx1ZVBhaXIoZiwgcmVmKSwKLQkJCQkJCXBsdWdpbik7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwbHVnaW4uZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCi0JCQkvLyBpZ25vcmUgUHJvY2Vzc0VsZW1lbnQgYi9jIGl0IGNhbiByZWZlcmVuY2VzIGFueXRoaW5nCi0JCQkvLwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlmb3IgKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvciBmZWF0dXJlSXRlcmF0b3IgPSAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yKSBlbGVtZW50Ci0JCQkJCS5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgZmVhdHVyZUl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IHJlZiA9IChFT2JqZWN0KSBmZWF0dXJlSXRlcmF0b3IubmV4dCgpOwotCi0JCQkJaWYgKFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHJlZikgPT0gYmFzZSkgewotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IGZlYXR1cmVJdGVyYXRvci5mZWF0dXJlKCk7Ci0JCQkJCWZlYXR1cmVWYWx1ZVBhaXJUb09iamVjdE1hcC5wdXQoCi0JCQkJCQkJbmV3IEZlYXR1cmVWYWx1ZVBhaXIoZiwgcmVmKSwgZWxlbWVudCk7Ci0JCQkJCWlmKGYgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UKSB7Ci0JCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQkJCQkJCWZlYXR1cmVWYWx1ZVBhaXJUb09iamVjdE1hcC5wdXQoCi0JCQkJCQkJCW5ldyBGZWF0dXJlVmFsdWVQYWlyKGZlYXR1cmUsIGVsZW1lbnQuZUdldChmZWF0dXJlKSksIGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZVZhbHVlUGFpclRvT2JqZWN0TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCUZlYXR1cmVWYWx1ZVBhaXIgZnZQYWlyID0gKEZlYXR1cmVWYWx1ZVBhaXIpIGVudHJ5LmdldEtleSgpOwotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlpZiAoZnZQYWlyLmZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkoKENvbGxlY3Rpb24pIGVsZW1lbnQuZUdldChmdlBhaXIuZmVhdHVyZSkpCi0JCQkJCQkucmVtb3ZlKGZ2UGFpci52YWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWVsZW1lbnQuZVNldChmdlBhaXIuZmVhdHVyZSwgbnVsbCk7Ci0JCQl9Ci0JCQlpZiAoZWxlbWVudC5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZlYXR1cmVWYWx1ZVBhaXJUb09iamVjdE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlGZWF0dXJlVmFsdWVQYWlyIGZ2UGFpciA9IChGZWF0dXJlVmFsdWVQYWlyKSBlbnRyeS5nZXRLZXkoKTsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJaWYgKGZ2UGFpci5mZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJKChDb2xsZWN0aW9uKSBlbGVtZW50LmVHZXQoZnZQYWlyLmZlYXR1cmUpKS5hZGQoZnZQYWlyLnZhbHVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZWxlbWVudC5lU2V0KGZ2UGFpci5mZWF0dXJlLCBmdlBhaXIudmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWJhc2UgPSBwbHVnaW4gPSBudWxsOwotCQlpZihmZWF0dXJlVmFsdWVQYWlyVG9PYmplY3RNYXAgIT0gbnVsbCkgewotCQkJZmVhdHVyZVZhbHVlUGFpclRvT2JqZWN0TWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmVhdHVyZVZhbHVlUGFpciB7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JCU9iamVjdCB2YWx1ZTsKLQotCQlGZWF0dXJlVmFsdWVQYWlyKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmLCBPYmplY3QgdikgewotCQkJZmVhdHVyZSA9IGY7Ci0JCQl2YWx1ZSA9IHY7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1Jlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRkYTNlZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQ7Ci0KLS8qKgotICogQSBjb21wb3VuZCBjb21tYW5kIHRoYXQgaXMgcmVzb3VyY2UgYXdhcmUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kIGV4dGVuZHMgQ29tcG91bmRDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZChMaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZChTdHJpbmcgbGFiZWwsIExpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIobGFiZWwsIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwKLQkJCUxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uLCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoaW50IHJlc3VsdEluZGV4KSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZChpbnQgcmVzdWx0SW5kZXgsIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgbGFiZWwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKGludCByZXN1bHRJbmRleCwgU3RyaW5nIGxhYmVsLAotCQkJU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKGludCByZXN1bHRJbmRleCwgTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKGludCByZXN1bHRJbmRleCwgU3RyaW5nIGxhYmVsLAotCQkJTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgbGFiZWwsIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZChpbnQgcmVzdWx0SW5kZXgsIFN0cmluZyBsYWJlbCwKLQkJCVN0cmluZyBkZXNjcmlwdGlvbiwgTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgbGFiZWwsIGRlc2NyaXB0aW9uLCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCUNvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21tYW5kTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjbWQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjbWQgaW5zdGFuY2VvZiBJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwoKChJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIGNtZCkKLQkJCQkJCS5nZXRNb2RpZmllZFJlc291cmNlcygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVzb3VyY2VBd2FyZURyYWdBbmREcm9wQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1Jlc291cmNlQXdhcmVEcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU2MjEyZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVzb3VyY2VBd2FyZURyYWdBbmREcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5EcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5lIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VBd2FyZURyYWdBbmREcm9wQ29tbWFuZCBleHRlbmRzIERyYWdBbmREcm9wQ29tbWFuZCAKLWltcGxlbWVudHMgSVJlc291cmNlQXdhcmVDb21tYW5kCi17Ci0KLQlwcml2YXRlIFNldDxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHBhcmFtIG9wZXJhdGlvbnMKLQkgKiBAcGFyYW0gb3BlcmF0aW9uCi0JICogQHBhcmFtIGNvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZURyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgT2JqZWN0IG93bmVyLAotCQkJZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEBwYXJhbSBvcGVyYXRpb25zCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uCi0JICogQHBhcmFtIG9wdGltaXplCi0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVEcmFnQW5kRHJvcENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIE9iamVjdCBvd25lciwKLQkJCWZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwKLQkJCUNvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgYm9vbGVhbiBvcHRpbWl6ZSkgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uLAotCQkJCW9wdGltaXplKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmKG1vZGlmaWVkUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCWlmKGRyb3BDb21tYW5kICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcyA9IFRuZ1V0aWwuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoZHJvcENvbW1hbmQpOwotCQkJfQotCQkJaWYobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCB8fCBtb2RpZmllZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcyA9IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVzb3VyY2VBd2FyZVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZXNvdXJjZUF3YXJlUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzlkMzE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZXNvdXJjZUF3YXJlUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUF3YXJlUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCBleHRlbmRzCi0JCVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQgaW1wbGVtZW50cyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JLyoqCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIG9wdGltaXplCi0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLCBpbnQgaW5kZXgsIGJvb2xlYW4gb3B0aW1pemUpIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIG9wdGltaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsIGludCBpbmRleCkgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBmZWF0dXJlLCBpbmRleCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCUNvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlpZihvd25lciBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKChFT2JqZWN0KW93bmVyKS5lUmVzb3VyY2UoKTsKLQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbW1hbmQuZ2V0Q29tbWFuZExpc3QoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjbWQgPSBpdGVyLm5leHQoKTsKLQkJCXdoaWxlKCEoY21kIGluc3RhbmNlb2YgSVJlc291cmNlQXdhcmVDb21tYW5kKSAmJiBjbWQgaW5zdGFuY2VvZiBDb21tYW5kV3JhcHBlcikgewotCQkJCWNtZCA9ICgoQ29tbWFuZFdyYXBwZXIpY21kKS5nZXRDb21tYW5kKCk7Ci0JCQl9Ci0JCQlpZiAoY21kIGluc3RhbmNlb2YgSVJlc291cmNlQXdhcmVDb21tYW5kKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkQWxsKCgoSVJlc291cmNlQXdhcmVDb21tYW5kKSBjbWQpCi0JCQkJCQkuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1NhdmVTdGF0dXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9TYXZlU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZjUwOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1NhdmVTdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLS8qKgotICogVGhlIHN0YXR1cyBvZiBhIHNhdmUgb3BlcmF0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2F2ZVN0YXR1cyBleHRlbmRzIFN0YXR1cyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQVZFX0VSUk9SID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPTExCQUNLX0VSUk9SID0gMjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHNldmVyaXR5Ci0JICogQHBhcmFtIHBsdWdpbklkCi0JICogQHBhcmFtIGNvZGUKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgU2F2ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBwbHVnaW5JZCwgaW50IGNvZGUsIFN0cmluZyBtZXNzYWdlLAotCQkJVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlzdXBlcihzZXZlcml0eSwgcGx1Z2luSWQsIGNvZGUsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvU2V0T3Bwb3NpdGVGZWF0dXJlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1NldE9wcG9zaXRlRmVhdHVyZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY0YzY4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvU2V0T3Bwb3NpdGVGZWF0dXJlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldCBhbiBvcHBvc2l0ZSBmZWF0dXJlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2V0T3Bwb3NpdGVGZWF0dXJlQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQotCXByaXZhdGUgT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZTsKLQotCXByaXZhdGUgRU9iamVjdCB2YWx1ZTsKLQotCXByaXZhdGUgRU9iamVjdCBvbGRWYWx1ZTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNldE9wcG9zaXRlRmVhdHVyZUNvbW1hbmQoTWV0aG9kRWxlbWVudCBlLAotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSwgRU9iamVjdCB2YWx1ZSkgewotCQl0aGlzLmVsZW1lbnQgPSBlOwotCQl0aGlzLm9wcG9zaXRlRmVhdHVyZSA9IG9wcG9zaXRlRmVhdHVyZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNwcmVwYXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5T3Bwb3NpdGUoCi0JCQkJCShNZXRob2RFbGVtZW50KSB2YWx1ZSwgb3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKSwKLQkJCQkJZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkVmFsdWUgPSAoRU9iamVjdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUob3Bwb3NpdGVGZWF0dXJlKTsKLQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCi0JCXJlZG8oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlpZiAob2xkVmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSA9PSBudWxsKSB7Ci0JCQlpZiAob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKS5pc01hbnkoKSkgewotCQkJCSgoQ29sbGVjdGlvbikgb2xkVmFsdWUuZUdldChvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpKSkKLQkJCQkJCS5yZW1vdmUoZWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCW9sZFZhbHVlLmVTZXQob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKSwgbnVsbCk7Ci0JCQl9Ci0JCQlpZiAob2xkVmFsdWUuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChvbGRWYWx1ZS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCkuaXNNYW55KCkpIHsKLQkJCQkoKENvbGxlY3Rpb24pIHZhbHVlLmVHZXQob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKSkpCi0JCQkJCQkuYWRkKGVsZW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQl2YWx1ZS5lU2V0KG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCksIGVsZW1lbnQpOwotCQkJfQotCQkJaWYgKHZhbHVlLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQodmFsdWUuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQlpZiAob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKS5pc01hbnkoKSkgewotCQkJCSgoQ29sbGVjdGlvbikgdmFsdWUuZUdldChvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpKSkKLQkJCQkJCS5yZW1vdmUoZWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCXZhbHVlLmVTZXQob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAob2xkVmFsdWUgIT0gbnVsbCkgewotCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCkuaXNNYW55KCkpIHsKLQkJCQkoKENvbGxlY3Rpb24pIG9sZFZhbHVlLmVHZXQob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKSkpCi0JCQkJCQkuYWRkKGVsZW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQlvbGRWYWx1ZS5lU2V0KG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCksIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvVXNlcklucHV0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvVXNlcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMmYzYmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1VzZXJJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotCi0vKioKLSAqIENsYXNzIHRoYXQga2VlcHMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnB1dCByZXF1ZXN0IGFuZCByZWZlcmVuY2UgdG8gdGhlCi0gKiBpbnB1dCB1c2VyIHNwZWNpZmllZCBvciBzZWxlY3RlZAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVXNlcklucHV0IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTEVDVElPTiA9IDE7Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCXByaXZhdGUgaW50IHR5cGU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbXVsdGlwbGU7Ci0KLQlwcml2YXRlIExpc3QgY2hvaWNlczsKLQotCXByaXZhdGUgT2JqZWN0IGlucHV0OwotCi0JcHJpdmF0ZSBJSXRlbUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQotCXByaXZhdGUgT2JqZWN0IGNvbnRleHQ7Ci0KLQlwcml2YXRlIElWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0JcHVibGljIFVzZXJJbnB1dChTdHJpbmcgbGFiZWwsIGludCB0eXBlLCBib29sZWFuIG11bHRpcGxlLCBMaXN0IGNob2ljZXMsCi0JCQlJSXRlbUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwgT2JqZWN0IGNvbnRleHQpIHsKLQkJdGhpcyhsYWJlbCwgdHlwZSwgbXVsdGlwbGUsIGNob2ljZXMsIGxhYmVsUHJvdmlkZXIsIG51bGwsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIG11bHRpcGxlCi0JICogQHBhcmFtIGNob2ljZXMKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlcgotCSAqICAgICAgICAgICAgdGhlIGxhYmVsIHByb3ZpZGVyIHRvIHJlcHJlc2VudCB0aGUgZWxlbWVudCBpbiB0aGUKLQkgKiAgICAgICAgICAgIDxjb2RlPmNob2ljZXM8L2NvZGU+IGxpc3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgICAgICAgICAgIDxjb2RlPmNob2ljZXM8L2NvZGU+IGxpc3QgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gdmFsaWRhdG9yCi0JICogICAgICAgICAgICB0aGUgdmFsaWRhdG9yIHRvIHZhbGlkYXRlIHRoZSBpbnB1dAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICB0aGUgY29udGV4dCBvZiB0aGUgdXNlciBpbnB1dCB0aGF0IGlzIGNvbW1hbmQtc3BlY2lmaWMgYW5kIGNhbgotCSAqICAgICAgICAgICAgY29udGFpbiBhZGRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlciBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgVXNlcklucHV0KFN0cmluZyBsYWJlbCwgaW50IHR5cGUsIGJvb2xlYW4gbXVsdGlwbGUsIExpc3QgY2hvaWNlcywKLQkJCUlJdGVtTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLCBJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IGNvbnRleHQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLm11bHRpcGxlID0gbXVsdGlwbGU7Ci0JCXRoaXMuY2hvaWNlcyA9IGNob2ljZXM7Ci0JCXRoaXMubGFiZWxQcm92aWRlciA9IGxhYmVsUHJvdmlkZXI7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW5wdXQoKSB7Ci0JCXJldHVybiBpbnB1dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpIHsKLQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENob2ljZXMoKSB7Ci0JCXJldHVybiBjaG9pY2VzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc011bHRpcGxlKCkgewotCQlyZXR1cm4gbXVsdGlwbGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsYWJlbCBwcm92aWRlcgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxhYmVsIHByb3ZpZGVyCi0JICovCi0JcHVibGljIElJdGVtTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbGFiZWxQcm92aWRlcjsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdmFsaWRhdG9yCi0JICogCi0JICogQHJldHVybiB0aGUgdmFsaWRhdG9yCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRleHQgb2YgdGhpcyB1c2VyIGlucHV0Ci0JICogCi0JICogQHJldHVybiB0aGUgY29udGV4dAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZDdjZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGNvbW1hbmRzIGZvciBlZGl0aW5nIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZmYzMzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhbiBhY3Rpdml0eSBpbiB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIFByb2Nlc3MgcHJvY2VzczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIFByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJaWYgKHByb2Nlc3MgPT0gbnVsbCkgewotCQkJT2JqZWN0IHRvcCA9IGdldFRvcEl0ZW0oKTsKLQkJCWlmICh0b3AgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkJcHJvY2VzcyA9IChQcm9jZXNzKSB0b3A7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCXJldHVybiAgY2hpbGQgaW5zdGFuY2VvZiBNaWxlc3RvbmUgCi0JCQl8fCAoY2hpbGQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCSYmICFUbmdVdGlsLmlzQ29udHJpYnV0b3JPclJlcGxhY2VyKChWYXJpYWJpbGl0eUVsZW1lbnQpIGNoaWxkKQotCQkJCSYmIFByb2Nlc3NVdGlsLmFjY2VwdCgoQWN0aXZpdHkpIGNoaWxkLCBnZXRGaWx0ZXIoKSwgdHJ1ZSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCi0JCS8vIHJlbW92ZSBhbnkgc3VwcHJlc3NlZCBjaGlsZAotCQkvLwotCQlQcm9jZXNzIHByb2MgPSBnZXRQcm9jZXNzKCk7Ci0JCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCS8vIGdldFByb2Nlc3MoKSBtaWdodCByZXR1cm4gbnVsbCBpZiBnZXRDaGlsZHJlbihPYmplY3QpIGlzIGNhbGxlZAotCQkJLy8gb24gYmFzZSBhY3Rpdml0eSB0bwotCQkJLy8gcmV0cmlldmUgaXRzIGNoaWxkcmVuCi0JCQkvLwotCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihwcm9jKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChzdXBwcmVzc2lvbi5pc1N1cHByZXNzZWQoY2hpbGQpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFjdGl2aXR5LmNsYXNzKSA9PSBVbWFQYWNrYWdlLkFDVElWSVRZX19TVVBQUkVTU0VEKSB7Ci0JCQkvLyByZWZyZXNoIHBhcmVudCBjb250ZW50Ci0JCQkvLwotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCWdldFBhcmVudChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0NhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9DYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5N2ZkNjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0NhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgYmFzZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgY2xhc3MgZm9yIHRoZSBzdGFuZGFyZCBjYXRlZ29yaWVzIGluCi0gKiBhIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsCi0JCUlDb25maWd1cmFibGUsIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBMaXN0IGNoaWxkcmVuOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gY2F0ZWdvcnlQa2dQYXRoOwotCi0JcHJvdGVjdGVkIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBPYmplY3QgaW1hZ2U7Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciB1bmNhdGVnb3JpemVkRmlsdGVyOwotCi0JcHJvdGVjdGVkIFN0cmluZyB1bmNhdGVnb3JpemVkTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBjYXRlZ29yaXplZEZpbHRlcjsKLQotCXByb3RlY3RlZCBPYmplY3QgdW5jYXRlZ29yaXplZEltYWdlOwotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnOwotCi0JcHJpdmF0ZSBVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyIHVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIFN0cmluZyBuYW1lLCBPYmplY3QgaW1hZ2UsCi0JCQlTdHJpbmdbXSBjYXRlZ29yeVBrZ1BhdGgpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQkvLyBtZXRob2RDb25maWcuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQl0aGlzLm1ldGhvZENvbmZpZyA9IG1ldGhvZENvbmZpZzsKLQkJbGFiZWwgPSBuYW1lOwotCQl0aGlzLmNhdGVnb3J5UGtnUGF0aCA9IGNhdGVnb3J5UGtnUGF0aDsKLQkJdGhpcy5pbWFnZSA9IGltYWdlOwotCX0KLQotCXByb3RlY3RlZCBVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyIGNyZWF0ZVVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIoKSB7Ci0JCWlmICh1bmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIgPSBuZXcgVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcigKLQkJCQkJYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywgdW5jYXRlZ29yaXplZEZpbHRlciwKLQkJCQkJdW5jYXRlZ29yaXplZExhYmVsLCB1bmNhdGVnb3JpemVkSW1hZ2UpOwotCQl9Ci0JCXJldHVybiB1bmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQl9IGVsc2UgewotCQkJY2hpbGRyZW4uY2xlYXIoKTsKLQkJfQotCQkvLyBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSB0YXJnZXQ7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1ldGhvZENvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJY2F0ZWdvcnlQa2dQYXRoKTsKLQkJCWlmIChwa2cgIT0gbnVsbCAvKgotCQkJCQkJCSAqICYmCi0JCQkJCQkJICogbWV0aG9kQ29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jb250YWlucyhwa2cpCi0JCQkJCQkJICovKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJQ29udGVudENhdGVnb3J5IGVsZW1lbnQgPSAoQ29udGVudENhdGVnb3J5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChjYXRlZ29yaXplZEZpbHRlci5hY2NlcHQoZWxlbWVudCkKLQkJCQkJCQkmJiAoZmlsdGVyICE9IG51bGwgPyBmaWx0ZXIuYWNjZXB0KGVsZW1lbnQpIDogdHJ1ZSkpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHNldCBwYXJlbnQKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IChUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRSkKLQkJCQkJLmdldENvbmZpZ3VyYXRpb25WaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdCgKLQkJCQkJCQlpdGVyLm5leHQoKSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCS8vIE9iamVjdCBhZGFwdGVyID0KLQkJCS8vIChUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRSkuZ2V0SXRlbXNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKS5hZGFwdChpdGVyLm5leHQoKSwKLQkJCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgYWRhcHRlcikuc2V0UGFyZW50KHRoaXMpOwotCQkJfQotCQkJLy8gVGhpcyBpcyBuZWVkIGZvcmNpbmcgdG8gc2V0IHRoZSBJQ29uZmlndXJhdG9yIHRvIENoaWxkcmVucwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhYmxlKSB7Ci0JCQkJKChJQ29uZmlndXJhYmxlKSBhZGFwdGVyKS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCX0KLQkJfQotCi0JCWlmICh1bmNhdGVnb3JpemVkRmlsdGVyICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuLmFkZChjcmVhdGVVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKCkpOwotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCS8vIHJldHVybiBzdXBlci5nZXROZXdDaGlsZERlc2NyaXB0b3JzKHRhcmdldCwgZWRpdGluZ0RvbWFpbiwgc2libGluZyk7Ci0JCXJldHVybiBzdXBlci5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG1ldGhvZENvbmZpZywgZWRpdGluZ0RvbWFpbiwKLQkJCQlzaWJsaW5nKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gcGFyZW50OwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCXJldHVybiBsYWJlbDsKLQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhdGVnb3JpemVkRmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCWNhdGVnb3JpemVkRmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVuY2F0ZWdvcml6ZWRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdW5jYXRlZ29yaXplZEZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVbmNhdGVnb3JpemVkTGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXVuY2F0ZWdvcml6ZWRMYWJlbCA9IGxhYmVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVuY2F0ZWdvcml6ZWRJbWFnZShPYmplY3QgaW1nKSB7Ci0JCXVuY2F0ZWdvcml6ZWRJbWFnZSA9IGltZzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAodW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQl1bmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0NhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI3YTZlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJDYXBhYmlsaXR5IFBhdHRlcm5zIiBhbmQgIkRlbGl2ZXJ5Ci0gKiBQcm9jZXNzZXMiIGZvbGRlcnMgaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsCi0JCUlDb25maWd1cmFibGUsIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCUxpc3QgY2hpbGRyZW47Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCXByaXZhdGUgU3RyaW5nW10gcGtnUGF0aDsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIE9iamVjdCBpbWFnZTsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWc7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBTdHJpbmcgbmFtZSwgT2JqZWN0IGltYWdlLAotCQkJU3RyaW5nW10gcGtnUGF0aCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMubWV0aG9kQ29uZmlnID0gbWV0aG9kQ29uZmlnOwotCQlsYWJlbCA9IG5hbWU7Ci0JCXRoaXMucGtnUGF0aCA9IHBrZ1BhdGg7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfSBlbHNlIHsKLQkJCWNoaWxkcmVuLmNsZWFyKCk7Ci0JCX0KLQkJQXJyYXlMaXN0IHByb2NQa2dzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZXRob2RDb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlNZXRob2RQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLCBwa2dQYXRoKTsKLQkJCWlmIChwa2cgIT0gbnVsbAotCQkJCQkmJiBtZXRob2RDb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKHBrZykpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCVByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmNvbGxlY3RDaGlsZHJlbihjaGlsZHJlbiwKLQkJCQkJCQllbGVtZW50LCBmaWx0ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghcHJvY1BrZ3MuaXNFbXB0eSgpKSB7Ci0JCQljaGlsZHJlbi5hZGRBbGwoMCwgcHJvY1BrZ3MpOwotCi0JCQkvLyBUT0RPOiBzb3J0IGFscGhhYmV0aWNhbGx5LCBwcm9jZXNzIHBhY2thZ2VzIGJlZm9yZSBwcm9jZXNzZXMKLQkJfQotCi0JCS8vIHNldCBwYXJlbnQKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCVByb2Nlc3NVdGlsLnNldFBhcmVudChjaGlsZCwgb2JqZWN0LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMobWV0aG9kQ29uZmlnLCBlZGl0aW5nRG9tYWluLAotCQkJCXNpYmxpbmcpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChsYWJlbCAhPSBudWxsKQotCQkJcmV0dXJuIGxhYmVsOwotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9DdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vQ3VzdG9tQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTZhZjIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9DdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkN1c3RvbSBDYXRlZ29yaWVzIiBmb2xkZXIgaW4gdGhlCi0gKiBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIHsKLQotCXB1YmxpYyBDdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIFN0cmluZyBuYW1lLCBPYmplY3QgaW1hZ2UsCi0JCQlTdHJpbmdbXSBjYXRlZ29yeVBrZ1BhdGgpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywgbmFtZSwgaW1hZ2UsIGNhdGVnb3J5UGtnUGF0aCk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0gZWxzZSB7Ci0JCQljaGlsZHJlbi5jbGVhcigpOwotCQl9Ci0JCS8vIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIHRhcmdldDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbWV0aG9kQ29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQljYXRlZ29yeVBrZ1BhdGgpOwotCQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdCA9IFRuZ1V0aWwuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KHBsdWdpbik7Ci0JCQlpZiAocm9vdCAhPSBudWxsICYmIHBrZyAhPSBudWxsCi0JCQkJCSYmIG1ldGhvZENvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuY29udGFpbnMocGtnKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByb290LmdldENhdGVnb3JpemVkRWxlbWVudHMoKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChmaWx0ZXIgIT0gbnVsbCA/IGZpbHRlci5hY2NlcHQoZWxlbWVudCkgOiB0cnVlKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBzZXQgcGFyZW50Ci0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSAoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UpCi0JCQkJCS5nZXRDb25maWd1cmF0aW9uVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoCi0JCQkJCQkJaXRlci5uZXh0KCksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgYWRhcHRlcikuc2V0UGFyZW50KHRoaXMpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0Rpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0Rpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTk3ZDI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZGlzY2lwbGluZSBncm91cGluZyBpbiB0aGUgQ29uZmlndXJhdGlvbgotICogdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUNvbmZpZ3VyYWJsZSB7Ci0KLQlwcml2YXRlIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5EaXNjaXBsaW5lQ2F0ZWdvcnlJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW47Ci0KLQkJLy8gVE9ETzogY29tbWVudGVkIG91dCB1bnRpbCBKaW5odWEgZml4ZWQgYnVncyBpbiBDb25maWd1cmF0aW9uRmlsdGVyCi0JCWlmIChjb25maWd1cmF0b3IgIT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBjb25maWd1cmF0b3IuZ2V0Q2hpbGRyZW4ob2JqZWN0LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCkpOwotCQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKCk6IHJldHVybmVkIGZyb20gY29uZmlndXJhdG9yOiAiICsgY2hpbGRyZW4pOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGNoaWxkcmVuOwotCQkJfQotCQl9Ci0KLQkJY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlEaXNjaXBsaW5lR3JvdXBpbmcgZ3JvdXBpbmcgPSAoRGlzY2lwbGluZUdyb3VwaW5nKSBvYmplY3Q7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZiA9IChNZXRob2RDb25maWd1cmF0aW9uKSAoKENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIGdldFBhcmVudChvYmplY3QpKQotCQkJCS5nZXRUYXJnZXQoKTsKLQkJVG5nVXRpbC5hZGRFeHRlbmRlZENoaWxkcmVuKGdyb3VwaW5nLCBtZXRob2RDb25mLCBjaGlsZHJlbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0KLQkJLy8gc2V0IHBhcmVudAotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFKQotCQkJCQkuZ2V0Q29uZmlndXJhdGlvblZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KAotCQkJCQkJCWl0ZXIubmV4dCgpLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudCh0aGlzKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yKSB7Ci0JCQljb25maWd1cmF0b3IgPSAoSUNvbmZpZ3VyYXRvcikgZmlsdGVyOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlmMDk4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGRpc2NpcGxpbmUgaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRGlzY2lwbGluZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRpc2NpcGxpbmVJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9UYXNrcygpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXREaXNjaXBsaW5lX1N1YmRpc2NpcGxpbmUoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Eb21haW5JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Eb21haW5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZmMjZiYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vRG9tYWluSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZG9tYWluIGluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERvbWFpbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRG9tYWluSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERvbWFpbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW5fU3ViZG9tYWlucygpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0d1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9HdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyM2VkMGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0d1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LklFbGVtZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgZ3VpZGFuY2UgZm9sZGVycy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwKLQkJSUVsZW1lbnRJdGVtUHJvdmlkZXIsIElHcm91cENvbnRhaW5lciwgSUNvbmZpZ3VyYWJsZSB7Ci0KLQlwcml2YXRlIE1hcCBncm91cEl0ZW1Qcm92aWRlck1hcDsKLQotCXByb3RlY3RlZCBBcnJheUxpc3QgY2hpbGRyZW47Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIEEgbWFwIG9mIEVDbGFzcyAvIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZm9yIGVhY2ggdHlwZSBvZiBndWlkYW5jZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgY2hlY2tMaXN0RmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgQ2hlY2tsaXN0OwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgY29uY2VwdEZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuICgob2JqIGluc3RhbmNlb2YgQ29uY2VwdCkgJiYgKCEob2JqIGluc3RhbmNlb2YgV2hpdGVwYXBlcikpKTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIGV4YW1wbGVGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBFeGFtcGxlOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgcHJhY3RpY2VGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBQcmFjdGljZTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHJlcG9ydEZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFJlcG9ydDsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHJldXNhYmxlQXNzZXRGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0OwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgcm9hZG1hcEZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFJvYWRtYXA7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciBzdXBwb3J0aW5nTWF0ZXJpYWxGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWw7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciBndWlkZWxpbmVGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBHdWlkZWxpbmU7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciB0ZW1wbGF0ZUZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFRlbXBsYXRlOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgdGVybURlZmluaXRpb25GaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbjsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHRvb2xNZW50b3JGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgd2hpdGVQYXBlckZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFdoaXRlcGFwZXI7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5tZXRob2RDb25maWcgPSBtZXRob2RDb25maWc7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQkJLy8gY2hlY2tsaXN0Ci0JCQlPYmplY3QgaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvQ2hlY2tsaXN0cyIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfQ2hlY2tsaXN0cyIpOyAvLyROT04tTkxTLTEkCi0JCQlHdWlkYW5jZUl0ZW1Qcm92aWRlciBjaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcigKLQkJCQkJYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywgbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIoY2hlY2tMaXN0RmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBjb25jZXB0Ci0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9Db25jZXB0cyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19Db25jZXB0cyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcihjb25jZXB0RmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBlc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKGVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gZXhhbXBsZQotCQkJaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvRXhhbXBsZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfRXhhbXBsZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQkJbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIoZXhhbXBsZUZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gcHJhY3RpY2UKLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L1ByYWN0aWNlcyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19QcmFjdGljZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQkJbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIocHJhY3RpY2VGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIFJlcG9ydAotCQkJaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUmVwb3J0cyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19SZXBvcnRzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKHJlcG9ydEZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gUmV1c2FibGUgQXNzZXQKLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L1JldXNhYmxlQXNzZXRzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKHJldXNhYmxlQXNzZXRGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIFJldXNhYmxlIEFzc2V0Ci0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9Sb2FkbWFwcyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19Sb2FkbWFwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKHJvYWRtYXBGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIFN1cHBvcnRpbmcgTWF0ZXJpYWwKLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L1N1cHBvcnRpbmdNYXRlcmlhbHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfU3VwcG9ydGluZ01hdGVyaWFscyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcihzdXBwb3J0aW5nTWF0ZXJpYWxGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIC8vIFRlY2huaXF1ZQotCQkJLy8gaW1hZ2UgPQotCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVGVjaG5pcXVlcyIpOwotCQkJLy8gbmFtZSA9Ci0JCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfVGVjaG5pcXVlcyIpOwotCQkJLy8gY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCS8vIG5hbWUsIGltYWdlKTsKLQkJCS8vIGNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKHRlY2huaXF1ZUZpbHRlcik7Ci0JCQkvLyBjaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gVGVtcGxhdGUKLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L1RlbXBsYXRlcyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19UZW1wbGF0ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQkJbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIodGVtcGxhdGVGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIFRlcm0gRGVmaW5pdGlvbgotCQkJaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvVGVybURlZmluaXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1Rlcm1EZWZpbml0aW9ucyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcih0ZXJtRGVmaW5pdGlvbkZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gVG9vbCBNZW50b3IKLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L1Rvb2xNZW50b3JzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1Rvb2xNZW50b3JzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKHRvb2xNZW50b3JGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIFdoaXRlcGFwZXIKLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L1doaXRlcGFwZXJzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1doaXRlcGFwZXJzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKHdoaXRlUGFwZXJGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIEd1aWRlbGluZXMKLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L1dvcmtQcm9kdWN0R3VpZGVsaW5lcyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19Xb3JrUHJvZHVjdEd1aWRlbGluZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQkJbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIoZ3VpZGVsaW5lRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQl9Ci0JCQotCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCS8vIFNob3VsZCBmaWx0ZXIgb25seSBjb3B5IG9ubHksIG5vdCBvcmdpbmFsIGNhY2hlZCBjaGlsZHJlbiBsaXN0LgotCQkJTGlzdCBjb3B5ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY29weS5hZGRBbGwoY2hpbGRyZW4pOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvcHkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUd1aWRhbmNlSXRlbVByb3ZpZGVyIG9iaiA9IChHdWlkYW5jZUl0ZW1Qcm92aWRlcikgaXRlcmF0b3IKLQkJCQkJCS5uZXh0KCk7Ci0JCQkJb2JqLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJCWlmIChvYmouZ2V0Q2hpbGRyZW4ob2JqKS5pc0VtcHR5KCkpIHsKLQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNvcHk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCQkKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0d1aWRhbmNlRm9sZGVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lciNnZXRHcm91cEl0ZW1Qcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0R3JvdXBJdGVtUHJvdmlkZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdyb3VwSXRlbVByb3ZpZGVyTWFwLmdldChuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBtZXRob2RDb25maWc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9HdWlkYW5jZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0d1aWRhbmNlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4Yzk4ZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0d1aWRhbmNlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBndWlkYW5jZSBzcGVjaWZpYyBmb2xkZXIuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLAotCQlJQ29uZmlndXJhYmxlLCBJTGlicmFyeUl0ZW1Qcm92aWRlciB7Ci0JTGlzdCBjaGlsZHJlbjsKLQotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCXByaXZhdGUgT2JqZWN0IGltYWdlOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGd1aWRhbmNlRmlsdGVyOwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZzsKLQotCXB1YmxpYyBjbGFzcyBDb21wYXJlQnlOYW1lIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvYmoxLCBPYmplY3Qgb2JqMikgewotCQkJU3RyaW5nIG5hbWUxID0gKChNZXRob2RFbGVtZW50KSBvYmoxKS5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgbmFtZTIgPSAoKE1ldGhvZEVsZW1lbnQpIG9iajIpLmdldE5hbWUoKTsKLQkJCXJldHVybiBuYW1lMS5jb21wYXJlVG9JZ25vcmVDYXNlKG5hbWUyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEd1aWRhbmNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIFN0cmluZyBuYW1lLCBPYmplY3QgaW1hZ2UpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQkvLyBtZXRob2RDb25maWcuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQlsYWJlbCA9IG5hbWU7Ci0JCXRoaXMubWV0aG9kQ29uZmlnID0gbWV0aG9kQ29uZmlnOwotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSB0YXJnZXQ7Ci0KLQkJQXJyYXlMaXN0IGZpbHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChndWlkYW5jZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlmaWx0ZXJMaXN0LmFkZChndWlkYW5jZUZpbHRlcik7Ci0JCX0KLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQlmaWx0ZXJMaXN0LmFkZChmaWx0ZXIpOwotCQl9Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QoCi0JCQkJbWV0aG9kQ29uZmlnLCBmaWx0ZXJMaXN0KTsKLQkJTGlzdCBlbGVtZW50cyA9IGVsZW1lbnRMaXN0LmdldExpc3QoKTsKLQotCQkvLyBzb3J0IGJ5IG5hbWUKLQkJQ29sbGVjdGlvbnMuc29ydChlbGVtZW50cywgbmV3IENvbXBhcmVCeU5hbWUoKSk7Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQlyZXR1cm4gc3VwZXIuZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhtZXRob2RDb25maWcsIGVkaXRpbmdEb21haW4sCi0JCQkJc2libGluZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJcmV0dXJuIHBhcmVudDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGxhYmVsICE9IG51bGwpCi0JCQlyZXR1cm4gbGFiZWw7Ci0JCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRHdWlkYW5jZUZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQlndWlkYW5jZUZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NWFlYjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmJyZWFrZG93bmVsZW1lbnQuTWlsZXN0b25lSXRlbVByb3ZpZGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uQWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRBZGFwdGVyKCkgewotCQlpZiAocHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyID0gbmV3IFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuTWV0aG9kcGx1Z2luSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlTWV0aG9kUGx1Z2luQWRhcHRlcigpCi0JICovCi0JLyoKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RQbHVnaW5BZGFwdGVyKCkgewotCQlNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgYWRhcHRlciA9IG5ldyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCWFkYXB0ZXIuc2V0TW9kZWxTdHJ1Y3R1cmUoTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVCk7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQkqLwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuTWV0aG9kcGx1Z2luSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJvY2Vzc1BhY2thZ2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVBoYXNlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGhhc2VBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZURpc2NpcGxpbmVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNjaXBsaW5lQWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IERpc2NpcGxpbmVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURvbWFpbkFkYXB0ZXIoKSB7Ci0JCWlmIChkb21haW5JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZG9tYWluSXRlbVByb3ZpZGVyID0gbmV3IERvbWFpbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkb21haW5JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUm9sZVNldEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVTZXRBZGFwdGVyKCkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgUm9sZVNldEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTWlsZXN0b25lSXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9NZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9NZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg5MzRlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBLZWVwcyB0cmFjayBvZiBhIGxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzIGluIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCB7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnOwotCi0JcHJpdmF0ZSBMaXN0IGZpbHRlckxpc3Q7Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgRWxlbWVudEl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgewotCi0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTIyOTE0Mzg5NzAxMjM5ODU5MDZMOwotCi0JCXByb3RlY3RlZCBFbGVtZW50SXRlcmF0b3IoQ29udGVudFBhY2thZ2UgY29udGVudFBrZykgewotCQkJc3VwZXIoY29udGVudFBrZywgZmFsc2UpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbkxpc3QoT2JqZWN0IG9iamVjdCkgewotCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlDb250ZW50UGFja2FnZSBwa2cgPSAoQ29udGVudFBhY2thZ2UpIG9iamVjdDsKLQkJCQlMaXN0IHBhY2thZ2VzID0gcGtnLmdldENoaWxkUGFja2FnZXMoKTsKLQkJCQlpbnQgc2l6ZSA9IHBhY2thZ2VzLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlPYmplY3Qgb2JqID0gcGFja2FnZXMuZ2V0KGkpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UKLQkJCQkJCQkmJiBtZXRob2RDb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKG9iaikpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChvYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKGNoZWNrQWNjZXB0YW5jZSgpKSB7Ci0JCQkJCUxpc3QgZWxlbWVudHMgPSBwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCk7Ci0JCQkJCXNpemUgPSBlbGVtZW50cy5zaXplKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gZWxlbWVudHMuZ2V0KGkpOwotCQkJCQkJaWYgKGFjY2VwdChvYmopKSB7Ci0JCQkJCQkJY2hpbGRyZW4uYWRkKG9iaik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNoaWxkcmVuLmFkZEFsbChwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5MaXN0KG9iamVjdCkuaXRlcmF0b3IoKTsKLQkJfQotCQkKLQl9OwotCQotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsCi0JCQlMaXN0IGZpbHRlckxpc3QpIHsKLQkJdGhpcy5tZXRob2RDb25maWcgPSBtZXRob2RDb25maWc7Ci0JCXRoaXMuZmlsdGVyTGlzdCA9IGZpbHRlckxpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tBY2NlcHRhbmNlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmplY3QpIHsKLQkJaW50IHNpemUgPSBmaWx0ZXJMaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlGaWx0ZXIgZmlsdGVyID0gKElGaWx0ZXIpIGZpbHRlckxpc3QuZ2V0KGkpOwotCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KG9iamVjdCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmF0b3IgbmV3SXRlcmF0b3IoQ29udGVudFBhY2thZ2UgcGtnKSB7Ci0JCXJldHVybiBuZXcgRWxlbWVudEl0ZXJhdG9yKHBrZyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldEFsbEVsZW1lbnRzKENvbnRlbnRQYWNrYWdlIHBrZywgTGlzdCBsaXN0KSB7Ci0JCWZvcihJdGVyYXRvciBpdGVyID0gbmV3SXRlcmF0b3IocGtnKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYoIShlIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKSB7Ci0JCQkJbGlzdC5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRMaXN0KCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1ldGhvZENvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJZ2V0QWxsRWxlbWVudHMocGtnLCBsaXN0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBsaXN0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMDU5MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Sb2xlU2V0c0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiB0aGUgQ29uZmlndXJhdGlvbgotICogdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUdyb3VwQ29udGFpbmVyLCBJQ29uZmlndXJhYmxlLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBNYXAgZ3JvdXBJdGVtUHJvdmlkZXJNYXA7Ci0KLQkvLyBjaGFuZ2VkIHRvIHByb3RlY3RlZCwgZXh0ZW5kZWQgY2xhc3MgY2FuIHBsYXkgd2l0aCBjaGlsZHJlbiB2YXJpYWJsZS4KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGNoaWxkcmVuOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGRpc2NpcGxpbmVzRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBlbGVtZW50ID0gKENvbnRlbnRDYXRlZ29yeSkgb2JqOwotCQkJLy8gQnJvd3Npbmc6IFdpdGggY2F0ZWdvcmllcywgcmVwbGFjZSBnZW5lcmFsaXphdGlvbgotCQkJLy8gY2F1c2VzIGJvdGggcmVwbGFjZW1lbnQgYW5kIGJhc2UgdG8gYmVjb21lIGludmlzaWJsZSB0byBicm93c2luZwotCQkJcmV0dXJuIERpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmFjY2VwdChlbGVtZW50KSAvKgotCQkJCQkJCQkJCQkJCQkJCQkgKiAmJgotCQkJCQkJCQkJCQkJCQkJCQkgKiBlbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PQotCQkJCQkJCQkJCQkJCQkJCQkgKiBudWxsCi0JCQkJCQkJCQkJCQkJCQkJCSAqLzsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIGRvbWFpbkZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkvLyBCcm93c2luZzogV2l0aCBjYXRlZ29yaWVzLCByZXBsYWNlIGdlbmVyYWxpemF0aW9uCi0JCQkvLyBjYXVzZXMgYm90aCByZXBsYWNlbWVudCBhbmQgYmFzZSB0byBiZWNvbWUgaW52aXNpYmxlIHRvIGJyb3dzaW5nCi0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgRG9tYWluIC8qCi0JCQkJCQkJCQkJCSAqICYmCi0JCQkJCQkJCQkJCSAqICgoRG9tYWluKW9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09Ci0JCQkJCQkJCQkJCSAqIG51bGwKLQkJCQkJCQkJCQkJICovOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciB3b3JrUHJvZHVjdFR5cGVzRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCS8vIEJyb3dzaW5nOiBXaXRoIGNhdGVnb3JpZXMsIHJlcGxhY2UgZ2VuZXJhbGl6YXRpb24KLQkJCS8vIGNhdXNlcyBib3RoIHJlcGxhY2VtZW50IGFuZCBiYXNlIHRvIGJlY29tZSBpbnZpc2libGUgdG8gYnJvd3NpbmcKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUgLyoKLQkJCQkJCQkJCQkJCQkgKiAmJgotCQkJCQkJCQkJCQkJCSAqICgoV29ya1Byb2R1Y3RUeXBlKW9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09Ci0JCQkJCQkJCQkJCQkJICogbnVsbAotCQkJCQkJCQkJCQkJCSAqLzsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgSUZpbHRlciByb2xlU2V0c0ZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkvLyBCcm93c2luZzogV2l0aCBjYXRlZ29yaWVzLCByZXBsYWNlIGdlbmVyYWxpemF0aW9uCi0JCQkvLyBjYXVzZXMgYm90aCByZXBsYWNlbWVudCBhbmQgYmFzZSB0byBiZWNvbWUgaW52aXNpYmxlIHRvIGJyb3dzaW5nCi0JCQlyZXR1cm4gUm9sZVNldHNJdGVtUHJvdmlkZXIuYWNjZXB0KG9iaikgLyoKLQkJCQkJCQkJCQkJCQkgKiAmJgotCQkJCQkJCQkJCQkJCSAqICgoVmFyaWFiaWxpdHlFbGVtZW50KW9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09Ci0JCQkJCQkJCQkJCQkJICogbnVsbAotCQkJCQkJCQkJCQkJCSAqLzsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHRvb2xzRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCS8vIEJyb3dzaW5nOiBXaXRoIGNhdGVnb3JpZXMsIHJlcGxhY2UgZ2VuZXJhbGl6YXRpb24KLQkJCS8vIGNhdXNlcyBib3RoIHJlcGxhY2VtZW50IGFuZCBiYXNlIHRvIGJlY29tZSBpbnZpc2libGUgdG8gYnJvd3NpbmcKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBUb29sIC8qCi0JCQkJCQkJCQkJICogJiYKLQkJCQkJCQkJCQkgKiAoKFRvb2wpb2JqKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0KLQkJCQkJCQkJCQkgKiBudWxsCi0JCQkJCQkJCQkJICovOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciBjdXN0b21DYXRlZ29yaWVzRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCS8vIEJyb3dzaW5nOiBXaXRoIGNhdGVnb3JpZXMsIHJlcGxhY2UgZ2VuZXJhbGl6YXRpb24KLQkJCS8vIGNhdXNlcyBib3RoIHJlcGxhY2VtZW50IGFuZCBiYXNlIHRvIGJlY29tZSBpbnZpc2libGUgdG8gYnJvd3NpbmcKLQkJCXJldHVybiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkN1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIKLQkJCQkJLmFjY2VwdChvYmopIC8qCi0JCQkJCQkJCQkgKiAmJgotCQkJCQkJCQkJICogKChWYXJpYWJpbGl0eUVsZW1lbnQpb2JqKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0KLQkJCQkJCQkJCSAqIG51bGwKLQkJCQkJCQkJCSAqLzsKLQkJfQotCi0JfTsKLQkKLQkvLyB1cGNhdGVnb3JpemVkIGZpbHRlcnMgY2FuIGJlIHJlc2V0IGJhc2VkIG9uIGNvbmZpZ3VyYXRvci4KLQlwcml2YXRlIElGaWx0ZXIgdW5jYXRlZ29yaXplZFRhc2tGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFRhc2sKLQkJCQkJJiYgQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZXMoKFRhc2spIG9iaikuaXNFbXB0eSgpOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBJRmlsdGVyIGRvbWFpblVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QKLQkJCQkJJiYgIUFzc29jaWF0aW9uSGVscGVyLmdldERvbWFpbnMoKFdvcmtQcm9kdWN0KSBvYmopLmlzRW1wdHkoKTsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgSUZpbHRlciB3cFR5cGVVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Ci0JCQkJCSYmIEFzc29jaWF0aW9uSGVscGVyLmdldFdvcmtQcm9kdWN0VHlwZXMoKFdvcmtQcm9kdWN0KSBvYmopCi0JCQkJCQkJLmlzRW1wdHkoKTsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgSUZpbHRlciB1bmNhdGVnb3JpemVkUm9sZUZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgUm9sZQotCQkJCQkmJiBBc3NvY2lhdGlvbkhlbHBlci5nZXRSb2xlU2V0cygoUm9sZSkgb2JqKS5pc0VtcHR5KCk7Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIElGaWx0ZXIgdW5jYXRlZ29yaXplZFRvb2xNZW50b3JGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yCi0JCQkJCSYmIEFzc29jaWF0aW9uSGVscGVyLmdldFRvb2xzKChUb29sTWVudG9yKSBvYmopLmlzRW1wdHkoKTsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChncm91cEl0ZW1Qcm92aWRlck1hcCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBncm91cEl0ZW1Qcm92aWRlck1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGFkYXB0ZXIgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElEaXNwb3NhYmxlKSB7Ci0JCQkJCSgoSURpc3Bvc2FibGUpIGFkYXB0ZXIpLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5jbGVhcigpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBudWxsOwotCQl9Ci0KLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuLmNsZWFyKCk7Ci0JCQljaGlsZHJlbiA9IG51bGw7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyBpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCS8vIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24obmV3Ci0JCS8vIE9iamVjdExpbmtJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgKE5vdGlmaWVyKSBvYmplY3QpKTsKLQkJLy8gfQotCQkvLyBNZXRob2RDb25maWd1cmF0aW9uIGNvbmYgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikKLQkJLy8gKChPYmplY3RMaW5rSXRlbVByb3ZpZGVyKSBvYmplY3QpLmdldExpbmtlZE9iamVjdCgpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmYgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgb2JqZWN0OwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlTdHJpbmcgbmFtZTsKLQkJCU9iamVjdCB1bmNhdGVnb3JpemVkSW1hZ2U7Ci0JCQlDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIGNoaWxkOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5LAotCQkJCQljb25mLAotCQkJCQluYW1lLAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9UYXNrc19jZnYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQoY29uZik7Ci0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkRmlsdGVyKHVuY2F0ZWdvcml6ZWRUYXNrRmlsdGVyKTsKLQkJCWNoaWxkLnNldENhdGVnb3JpemVkRmlsdGVyKGRpc2NpcGxpbmVzRmlsdGVyKTsKLQkJCWNoaWxkLnNldFVuY2F0ZWdvcml6ZWRMYWJlbChMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVW5jYXRlZ29yaXplZF9UYXNrc190ZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCQl1bmNhdGVnb3JpemVkSW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVGFza3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQuc2V0VW5jYXRlZ29yaXplZEltYWdlKHVuY2F0ZWdvcml6ZWRJbWFnZSk7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29uZiwgbmFtZSwKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRG9tYWlucyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQoY29uZik7Ci0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkRmlsdGVyKGRvbWFpblVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlcik7Ci0JCQl1bmNhdGVnb3JpemVkSW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkLnNldFVuY2F0ZWdvcml6ZWRJbWFnZSh1bmNhdGVnb3JpemVkSW1hZ2UpOwotCQkJY2hpbGQuc2V0Q2F0ZWdvcml6ZWRGaWx0ZXIoZG9tYWluRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29uZiwKLQkJCQkJbmFtZSwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RzIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoKTsKLQkJCWNoaWxkLnNldFBhcmVudChjb25mKTsKLQkJCWNoaWxkLnNldFVuY2F0ZWdvcml6ZWRGaWx0ZXIod3BUeXBlVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0RmlsdGVyKTsKLQkJCXVuY2F0ZWdvcml6ZWRJbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQuc2V0VW5jYXRlZ29yaXplZEltYWdlKHVuY2F0ZWdvcml6ZWRJbWFnZSk7Ci0JCQljaGlsZC5zZXRDYXRlZ29yaXplZEZpbHRlcih3b3JrUHJvZHVjdFR5cGVzRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbmYsIG5hbWUsCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1JvbGVzIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQoY29uZik7Ci0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkRmlsdGVyKHVuY2F0ZWdvcml6ZWRSb2xlRmlsdGVyKTsKLQkJCWNoaWxkLnNldENhdGVnb3JpemVkRmlsdGVyKHJvbGVTZXRzRmlsdGVyKTsKLQkJCWNoaWxkLnNldFVuY2F0ZWdvcml6ZWRMYWJlbChMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVW5jYXRlZ29yaXplZF9Sb2xlc190ZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCQl1bmNhdGVnb3JpemVkSW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUm9sZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQuc2V0VW5jYXRlZ29yaXplZEltYWdlKHVuY2F0ZWdvcml6ZWRJbWFnZSk7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Rvb2xzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbmYsIG5hbWUsCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1Rvb2xzIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQoY29uZik7Ci0JCQljaGlsZC5zZXRDYXRlZ29yaXplZEZpbHRlcih0b29sc0ZpbHRlcik7Ci0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkRmlsdGVyKHVuY2F0ZWdvcml6ZWRUb29sTWVudG9yRmlsdGVyKTsKLQkJCXVuY2F0ZWdvcml6ZWRJbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Ub29scyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkSW1hZ2UodW5jYXRlZ29yaXplZEltYWdlKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc2VzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCU9iamVjdCBvdGhlckNoaWxkID0gbmV3IFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29uZiwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVCk7Ci0JCQljaGlsZHJlbi5hZGQob3RoZXJDaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgb3RoZXJDaGlsZCk7Ci0KLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29uZiwgbmFtZSwKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGFja2FnZXMiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQoY29uZik7Ci0JCQljaGlsZC5zZXRDYXRlZ29yaXplZEZpbHRlcihjdXN0b21DYXRlZ29yaWVzRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCUd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIgY2hpbGQxID0gbmV3IEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5LCBjb25mKTsKLQkJCWNoaWxkMS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZDEpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkMSk7Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkvLyByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKG9iamVjdCk7Ci0JLy8gfQotCS8vICAgIAotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHN1cGVyLmhhc0NoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyI2dldEdyb3VwSXRlbVByb3ZpZGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRHcm91cEl0ZW1Qcm92aWRlcihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ3JvdXBJdGVtUHJvdmlkZXJNYXAuZ2V0KG5hbWUpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQkKLQkJaWYgKCAoZmlsdGVyICE9IGNvbmZpZ3VyYXRvcikgJiYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpICkgewotCQkJY29uZmlndXJhdG9yID0gKElDb25maWd1cmF0b3IpIGZpbHRlcjsKLQkJCWlmICggY29uZmlndXJhdG9yICE9IG51bGwgKSB7CQkJCi0JCQkJLy8gY3JlYXRlIHRoZSB1bmNhdGVnb3JpemVkIGZpbHRlcnMuIElmIElDb25maWd1cmF0b3IgaXMgc2V0LCBnZXQgdGhlIGZpbGRlcnMgZnJvbSB0aGVyZS4KLQkJCQkvLyBvdGhlcndpemUsIHVzZSB0aGUgZGVmYXVsdCBvbmUuCi0JCQkJLy8gVGhpcyBpcyBuZWVkZWQgdG8gYWxsb3cgZXh0cmEgdW5jYXRlZ29yaXplZCBlbGVtZW50cyBkdWUgdG8gcmVhbGl6YXRpb24gCi0JCQkJLy8gdG8gc2hvdyB1cCBpbiB0aGUgdW4tY2F0ZWdvcml6ZWQgZm9sZGVyLgotCQkJCS8vIEZvciBleGFtcGxlLCBpZiBhIGRpc2NpcGxlIGlzIHJlcGxhY2VkIGJ5IGFub3RoZXIsIHRoZSB0YXNrcyBpbiB0aGUgcmVwbGFjZWQgZGlzY2lwbGllCi0JCQkJLy8gc2hvdWxkIHNob3cgdXAgaW4gdGhlIHVuLWNhdGVnb3JpemVkIHRhc2tzIGZvbGRlcgotCQkJCS8vIDE1NjQzOCAtIFZhcmlhYmlsaXR5IG9mIGRpc2NpcGxpbmVzIGlzIG5vdCB3b3JraW5nIGNvcnJlY3RseQotCQkJCQotCQkJCXVuY2F0ZWdvcml6ZWRUYXNrRmlsdGVyID0gY29uZmlndXJhdG9yLmdldFVuY2F0ZWdvcml6ZWRUYXNrRmlsdGVyKCk7Ci0JCQkJZG9tYWluVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0RmlsdGVyID0gY29uZmlndXJhdG9yLmdldERvbWFpblVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlcigpOwotCQkJCXdwVHlwZVVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlciA9IGNvbmZpZ3VyYXRvci5nZXRXcFR5cGVVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIoKTsKLQkJCQl1bmNhdGVnb3JpemVkUm9sZUZpbHRlciA9IGNvbmZpZ3VyYXRvci5nZXRVbmNhdGVnb3JpemVkUm9sZUZpbHRlcigpOwotCQkJCXVuY2F0ZWdvcml6ZWRUb29sTWVudG9yRmlsdGVyID0gY29uZmlndXJhdG9yLmdldFVuY2F0ZWdvcml6ZWRUb29sTWVudG9yRmlsdGVyKCk7Ci0JCQkJCi0JCQkJLy8gW0J1ZyAxNjI2MDNdIE5ldzogUmVwbGFjaW5nIGRpc2NpcGxpbmVzIGRvIGFwcGVhciBpbnNpZGUgdGhlaXIgcmVwbGFjZWQgZWxlbWVudHMgZGlzY2lwbGluZSBncm91cGluZ3MgYXMgd2VsbCBhcyBvdXRzaWRlIG9mIHRoZSBkaXNjaXBsaW5lIGdyb3VwaW5nCi0JCQkJLy8gbmVlZCB0byBjdXN0b21pemUgdGhlIGZpbHRlcnMgZm9yIGRpc2NpcGxpbmVzIGFuZCByb2xlc2V0cwotCQkJCWRpc2NpcGxpbmVzRmlsdGVyID0gY29uZmlndXJhdG9yLmdldERpc2NpcGxpbmVzRmlsdGVyKCk7Ci0JCQkJcm9sZVNldHNGaWx0ZXIgPSBjb25maWd1cmF0b3IuZ2V0Um9sZVNldHNGaWx0ZXIoKTsKLQkJCQkKLQkJCX0KLQkJfQotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi0JLy8gcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCS8vIHJldHVybiBwbHVnaW47Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQotCQlpZiAoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjoKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJCWNvbmZpZ3VyYXRvci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2NjNjAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudCBpbiB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUHJvY2Vzc0NvbXBvbmVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19OQU1FOgotCQkJUHJvY2Vzc0NvbXBvbmVudCBwYyA9IChQcm9jZXNzQ29tcG9uZW50KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChwYy5nZXRQcm9jZXNzKCkgIT0gbnVsbCkgewotCQkJCWJvb2xlYW4gb2xkID0gcGMuZ2V0UHJvY2VzcygpLmVEZWxpdmVyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcGMuZ2V0UHJvY2VzcygpLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQkJcGMuZ2V0UHJvY2VzcygpLnNldE5hbWUocGMuZ2V0TmFtZSgpKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlwYy5nZXRQcm9jZXNzKCkuZVNldERlbGl2ZXIob2xkKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI0ODA3OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBwcm9jZXNzIHBhY2thZ2UgaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKFByb2Nlc3MgcHJvY2VzcykgewotCQlyZXR1cm4gIVRuZ1V0aWwuaXNDb250cmlidXRvck9yUmVwbGFjZXIocHJvY2VzcykKLQkJCQkmJiAhcHJvY2Vzcy5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbGxlY3RDaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBPYmplY3QgZWxlbWVudCwKLQkJCUlGaWx0ZXIgZmlsdGVyKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJUHJvY2VzcyBwcm9jZXNzID0gKChQcm9jZXNzQ29tcG9uZW50KSBlbGVtZW50KS5nZXRQcm9jZXNzKCk7Ci0JCQlpZiAocHJvY2VzcyAhPSBudWxsKSB7Ci0JCQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLQkJCQkJT2JqZWN0IGNoaWxkID0gKChJQ29uZmlndXJhdG9yKSBmaWx0ZXIpLnJlc29sdmUocHJvY2Vzcyk7Ci0JCQkJCWlmICghY2hpbGRyZW4uY29udGFpbnMoY2hpbGQpICYmIGZpbHRlci5hY2NlcHQoY2hpbGQpKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQocHJvY2VzcykpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKHByb2Nlc3MpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChlbGVtZW50KSkgewotCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbGxlY3RDaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gY29sbGVjdENoaWxkcmVuKGNoaWxkcmVuLCBlbGVtZW50LCBmaWx0ZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJY29sbGVjdENoaWxkcmVuKGNoaWxkcmVuLCBpdGVyLm5leHQoKSk7Ci0JCX0KLQotCQkvLyBzZXQgcGFyZW50IGZvciB0aGUgY29sbGVjdGVkIGNoaWxkcmVuCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlQcm9jZXNzVXRpbC5zZXRQYXJlbnQoY2hpbGQsIG9iamVjdCwgYWRhcHRlckZhY3RvcnkpOwotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJaWYgKGNvbGxlY3RDaGlsZHJlbihjaGlsZHJlbiwgaXRlci5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcikgewotCQkJKChJQ29uZmlndXJhdG9yKSBmaWx0ZXIpLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1Byb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1Byb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzNjYTk3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Qcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5BYnN0cmFjdFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIlByb2Nlc3NlcyIgZm9sZGVyIGluIHRoZSBDb25maWd1cmF0aW9uCi0gKiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBNb2RlbFN0cnVjdHVyZSBtb2RlbFN0cnVjdCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgbW9kZWxTdHJ1Y3QpOwotCQl0aGlzLm1ldGhvZENvbmZpZyA9IG1ldGhvZENvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJaWYgKGdyb3VwSXRlbVByb3ZpZGVyTWFwID09IG51bGwpIHsKLQkJCQlncm91cEl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQl9Ci0KLQkJCWZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQ7Ci0JCQkJfQotCi0JCQl9OwotCi0JCQlPYmplY3QgaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm5zIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBuYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0NhcGFiaWxpdHlQYXR0ZXJuc190ZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCUNhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGNoaWxkID0gbmV3IENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKAotCQkJCQlhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLCBuYW1lLCBpbWFnZSwKLQkJCQkJbW9kZWxTdHJ1Y3QuY2FwYWJpbGl0eVBhdHRlcm5QYXRoKTsKLQkJCWNoaWxkLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzc2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzZXNfdGV4dCIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkJbWV0aG9kQ29uZmlnLCBuYW1lLCBpbWFnZSwgbW9kZWxTdHJ1Y3QuZGVsaXZlcnlQcm9jZXNzUGF0aCk7Ci0JCQljaGlsZC5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBtZXRob2RDb25maWc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Sb2xlU2V0SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2RiZDc0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Sb2xlU2V0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcm9sZSBzZXQgaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuUm9sZVNldEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlU2V0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNhdGVnb3J5LlJvbGVTZXRJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9VbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDlmOWI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9VbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgdW5jYXRlZ29yaXplZCBmb2xkZXJzIGFuZCBlbGVtZW50cyBpbiB0aGUKLSAqIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwKLQkJSUNvbmZpZ3VyYWJsZSB7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjaGlsZHJlbjsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZzsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCXByaXZhdGUgSUZpbHRlciB1bmNhdGVnb3JpemVkRmlsdGVyOwotCi0JcHJpdmF0ZSBPYmplY3QgaW1hZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIElGaWx0ZXIgZmlsdGVyLCBTdHJpbmcgbGFiZWwsCi0JCQlPYmplY3QgaW1hZ2UpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLm1ldGhvZENvbmZpZyA9IG1ldGhvZENvbmZpZzsKLQkJdGhpcy51bmNhdGVnb3JpemVkRmlsdGVyID0gZmlsdGVyOwotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0IGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCgKLQkJCUxpc3QgZmlsdGVyTGlzdCkgewotCQlyZXR1cm4gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdChtZXRob2RDb25maWcsIGZpbHRlckxpc3QpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZUZpbHRlckxpc3QoKSB7Ci0JCUFycmF5TGlzdCBmaWx0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAodW5jYXRlZ29yaXplZEZpbHRlciAhPSBudWxsKSB7Ci0JCQlmaWx0ZXJMaXN0LmFkZCh1bmNhdGVnb3JpemVkRmlsdGVyKTsKLQkJfQotCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCWZpbHRlckxpc3QuYWRkKGZpbHRlcik7Ci0JCX0KLQkJcmV0dXJuIGZpbHRlckxpc3Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0KGNyZWF0ZUZpbHRlckxpc3QoKSkKLQkJCQkuZ2V0TGlzdCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gQWx3YXlzIHJldHVybiB0cnVlIHRvIGF2b2lkIGV4cGVuc2l2ZSBjYWxsIHRvIGdldENoaWxkcmVuKCkgdGhhdCB3YWxrCi0JCS8vIHRocnUgdGhlCi0JCS8vIHdob2xlIGxpYnJhcnkgdG8gZmluZCBhbGwgdGhlIHRhc2tzIHRoYXQgaXMgbm90IGFzc2lnbmVkIHRvIGFueQotCQkvLyBkaXNjaXBsaW5lLgotCQkvLwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChsYWJlbCAhPSBudWxsKQotCQkJcmV0dXJuIGxhYmVsOwotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVW5jYXRlZ29yaXplZF90ZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGltYWdlICE9IG51bGwpCi0JCQlyZXR1cm4gaW1hZ2U7Ci0JCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1dvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNjMDI0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuV3JhcHBlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIldvcmsgUHJvZHVjdCBLaW5kcyIgZm9sZGVyIGluIHRoZQotICogQ29uZmlndXJhdGlvbiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIFN0cmluZyBuYW1lLCBPYmplY3QgaW1hZ2UsCi0JCQlTdHJpbmdbXSBjYXRlZ29yeVBrZ1BhdGgpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywgbmFtZSwgaW1hZ2UsIGNhdGVnb3J5UGtnUGF0aCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciNjcmVhdGVVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlciBjcmVhdGVVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQl0aGlzLnVuY2F0ZWdvcml6ZWRGaWx0ZXIsIHRoaXMudW5jYXRlZ29yaXplZExhYmVsLAotCQkJCXRoaXMudW5jYXRlZ29yaXplZEltYWdlKSB7Ci0JCQlmaW5hbCBjbGFzcyBFbGVtZW50TGlzdCBleHRlbmRzIE1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCB7Ci0KLQkJCQkvKioKLQkJCQkgKiBAcGFyYW0gbWV0aG9kQ29uZmlnCi0JCQkJICogQHBhcmFtIGZpbHRlckxpc3QKLQkJCQkgKi8KLQkJCQlwdWJsaWMgRWxlbWVudExpc3QoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsCi0JCQkJCQlMaXN0IGZpbHRlckxpc3QpIHsKLQkJCQkJc3VwZXIobWV0aG9kQ29uZmlnLCBmaWx0ZXJMaXN0KTsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5NZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QjbmV3SXRlcmF0b3Iob3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZSkKLQkJCQkgKi8KLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgbmV3SXRlcmF0b3IoQ29udGVudFBhY2thZ2UgcGtnKSB7Ci0JCQkJCXJldHVybiBuZXcgRWxlbWVudEl0ZXJhdG9yKHBrZykgewotCQkJCQkJLyoqCi0JCQkJCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJCQkJICovCi0JCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMzA3MTM2MzA3NjU3MzU5MjgyTDsKLQotCQkJCQkJLyoKLQkJCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkJCSAqIAotCQkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0LkVsZW1lbnRJdGVyYXRvciNnZXRDaGlsZHJlbkxpc3QoamF2YS5sYW5nLk9iamVjdCkKLQkJCQkJCSAqLwotCQkJCQkJcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW5MaXN0KE9iamVjdCBvYmplY3QpIHsKLQkJCQkJCQlMaXN0IGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW5MaXN0KG9iamVjdCk7Ci0JCQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCQkJCWNoaWxkcmVuLmFkZEFsbCgoKEFydGlmYWN0KSBvYmplY3QpCi0JCQkJCQkJCQkJLmdldENvbnRhaW5lZEFydGlmYWN0cygpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIGNoaWxkcmVuOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLk1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCNjaGVja0FjY2VwdGFuY2UoKQotCQkJCSAqLwotCQkJCXByb3RlY3RlZCBib29sZWFuIGNoZWNrQWNjZXB0YW5jZSgpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIHN1cGVyQWNjZXB0KE9iamVjdCBvYmplY3QpIHsKLQkJCQkJcmV0dXJuIHN1cGVyLmFjY2VwdChvYmplY3QpOwotCQkJCX0KLQkJCX07Ci0KLQkJCS8vIGtlZXBzIHdyYXBwZXJzIG9mIGFydGlmYWN0cyB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHdvcmsKLQkJCS8vIHByb2R1Y3QgdHlwZQotCQkJLy8KLQkJCXByaXZhdGUgV3JhcHBlck1hbmFnZXIgd3JhcHBlck1hbmFnZXIgPSBuZXcgV3JhcHBlck1hbmFnZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJLyoKLQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJICogCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuV3JhcHBlck1hbmFnZXIjY3JlYXRlV3JhcHBlcihqYXZhLmxhbmcuT2JqZWN0LAotCQkJCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwKLQkJCQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5KQotCQkJCSAqLwotCQkJCXByb3RlY3RlZCBJV3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVXcmFwcGVyKE9iamVjdCB2YWx1ZSwKLQkJCQkJCU9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJCQkJcmV0dXJuIG5ldyBEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcih2YWx1ZSwgb3duZXIsCi0JCQkJCQkJbnVsbCwgQ29tbWFuZFBhcmFtZXRlci5OT19JTkRFWCwgYWRhcHRlckZhY3RvcnkpIHsKLQkJCQkJCS8qCi0JCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCQkgKiAKLQkJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJCQkJCSAqLwotCQkJCQkJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJCS8vIFN1Yi1hcnRpZmFjdCBjYW4gaGF2ZSBhIGRpZmZlcmVudCBzZXQgb2Ygd29yawotCQkJCQkJCS8vIHByb2R1Y3QgdHlwZXMgdGhhbiB0aGUgY29udGFpbmluZyBhcnRpZmFjdC4KLQkJCQkJCQkvLyBEbyBub3Qgc2hvdyB0aGUgY29tcG9zaXRpb24gaGllcmFyY2hpZXMgaW4gdGhlCi0JCQkJCQkJLy8gV29yayBQcm9kdWN0IFR5cGUgdHJlZSBicm93c2VycyBpbiBMaWIuIE5hdi4KLQkJCQkJCQkvLyBhbmQgQ29uZmlnLiBFeHBsb3Jlci4gU2hvdyB0aGVtIGluIGZsYXQgbGlzdHMKLQkJCQkJCQkvLyBhY2NvcmRpbmcgdG8gdGhlaXIgY2F0ZWdvcml6YXRpb25zIGluc3RlYWQuCi0JCQkJCQkJLy8KLQkJCQkJCQkvLyBUaGlzIGlzIG5vdCB0cnVlIGZvciBEb21haW5zLCB3aGljaCBzaG91bGQgc2hvdwotCQkJCQkJCS8vIHRoZSBhcnRpZmFjdCBuZXN0aW5nIQotCQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJCQkJfQotCi0JCQkJCQkvKgotCQkJCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCQkJICogCi0JCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCQkJCQkgKi8KLQkJCQkJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJfQotCQkJfTsKLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlciNjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QoamF2YS51dGlsLkxpc3QpCi0JCQkgKi8KLQkJCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QgY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0KAotCQkJCQlMaXN0IGZpbHRlckxpc3QpIHsKLQkJCQlyZXR1cm4gbmV3IEVsZW1lbnRMaXN0KG1ldGhvZENvbmZpZywgZmlsdGVyTGlzdCk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCUVsZW1lbnRMaXN0IGVsZW1lbnRMaXN0ID0gKEVsZW1lbnRMaXN0KSBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QoY3JlYXRlRmlsdGVyTGlzdCgpKTsKLQkJCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gZWxlbWVudExpc3QuZ2V0TGlzdCgpOwotCQkJCUFycmF5TGlzdCBhcnRpZmFjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50TGlzdC5zdXBlckFjY2VwdChlbGVtZW50KSkgewotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQkJCWFydGlmYWN0cy5hZGQoZWxlbWVudCk7Ci0JCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJd3JhcHBlck1hbmFnZXIudXBkYXRlKGFydGlmYWN0cyk7Ci0JCQkJY2hpbGRyZW4uYWRkQWxsKHdyYXBwZXJNYW5hZ2VyLmdldFdyYXBwZXJzKCkpOwotCQkJCXJldHVybiBjaGlsZHJlbjsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCXdyYXBwZXJNYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc3ZGZhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZGlzcGxheSBhbmQgZWRpdGluZyBzdXBwb3J0IGZvciBtZXRob2QgY29uZmlndXJhdGlvbnMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0FydGlmYWN0SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvQXJ0aWZhY3RJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY5M2Y3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvQXJ0aWZhY3RJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYW4gYXJ0aWZhY3QuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFydGlmYWN0SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5BcnRpZmFjdEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlEZWZhdWx0TmFtZVNldHRlciwgSUxpYnJhcnlJdGVtUHJvdmlkZXIsIElDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFydGlmYWN0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBvYmplY3Q7Ci0JCWlmIChhcnRpZmFjdCAhPSBudWxsICYmIGFydGlmYWN0LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TmF2aWdhdG9yUGFyZW50SXRlbVByb3ZpZGVyKGFydGlmYWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUFydGlmYWN0KCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0KLQkJLy9UbmdVdGlsLnNldERlZmF1bHROYW1lKHRoaXMsIG5vdGlmaWNhdGlvbik7Ci0JCXNldERlZmF1bHROYW1lKG5vdGlmaWNhdGlvbik7Ci0JCQotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQkKLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCQkKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERpc2NpcGxpbmUuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTkFNRToKLQkJCVRuZ1V0aWwucmVmcmVzaENvbnRyaWJ1dG9ycyh0aGlzLCBub3RpZmljYXRpb24sIGZhbHNlLCB0cnVlKTsKLQkJCWJyZWFrOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJVG5nVXRpbC5yZWZyZXNoV29ya1Byb2R1Y3RUeXBlVW5jYXRlZ29yaXplZChVbWFVdGlsCi0JCQkJCS5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIHRhcmdldCksIG5vdGlmaWNhdGlvbik7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCQotCS8qKgotCSAqIE1ldGhvZCB0byBzZXREZWZhdWx0TmFtZS4gSURlZmF1bHROYW1lU2V0dGVyIGNhbm5vdCBiZSB1c2VkIAotCSAqIGluIGNhc2Ugb2YgU3RhdGVsZXNzIEl0ZW1Qcm92aWRlci4KLQkgKiBUaGlzIGlzIHdvcmstYXJvdW5kIGZvciBub3cuIElEZWZhdWx0TmFtZVNldHRlciB3aWxsIGJlIG1vZGlmaWVkIGxhdGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJSURlZmF1bHROYW1lU2V0dGVyIGRlZmF1bHROYW1lU2V0dGVyID0gdGhpczsKLQkJaWYgKGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpICE9IG51bGwpIHsKLQkJCWludCBmZWF0dXJlSWQgPSBtc2cuZ2V0RmVhdHVyZUlEKGRlZmF1bHROYW1lU2V0dGVyCi0JCQkJCS5nZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSk7Ci0JCQlpZiAoZmVhdHVyZUlkID09IGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSkgewotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlzZXREZWZhdWx0TmFtZShtc2cuZ2V0TmV3VmFsdWUoKSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlzZXREZWZhdWx0TmFtZShpdGVyLm5leHQoKSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqLCBPYmplY3QgcGFyZW50KSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfQVJUSUZBQ1Q7Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChBcnRpZmFjdCkgcGFyZW50KQotCQkJCQkuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCksIChNZXRob2RFbGVtZW50KSBvYmosIGJhc2VOYW1lKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqIG5vdCBpbiB1c2UgKGZvciBzdGF0ZWxlc3MgaXRlbXByb3ZpZGVyKSBzZWUgYWJvdmUgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaiwgT2JqZWN0IHBhcmVudCkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0FSVElGQUNUOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoQXJ0aWZhY3QpIHRhcmdldCkuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCksCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmosIGJhc2VOYW1lKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gQXJ0aWZhY3QuY2xhc3M7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9BcnRpZmFjdF90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCWlmICgoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KS5nZXROb2RlaWNvbigpICE9IG51bGwpIHsKLQkJCQlVUkkgaW1nVXJpID0gVG5nVXRpbC5nZXRGdWxsUGF0aG9mTm9kZW9yU2hhcGVJY29uVVJJKAotCQkJCQkJKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0LAotCQkJCQkJKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSk7Ci0JCQkJT2JqZWN0IGltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTaGFyZWRJbWFnZShpbWdVcmkpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKQotCQkJCQlyZXR1cm4gaW1hZ2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoCi0JCQkJZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwgaW5kZXgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCUNvbGxlY3Rpb24gY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjb2wuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkgewotCQkJCQlpdG9yLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29sOwotCX0KLQotCS8vIHByaXZhdGUgYm9vbGVhbiBpc1BhcmVudHNBY2NlcHRlZChPYmplY3QgY2hpbGQpIHsKLQkvLyBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gZ2V0SGllcmFyY2h5TGlzdChsaXN0LCBjaGlsZCk7Ci0JLy8gZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkvLyBPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JLy8gaWYgKG9iaiBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JLy8gaWYgKGZpbHRlci5hY2NlcHQob2JqKSkKLQkvLyByZXR1cm4gdHJ1ZTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0JLy8KLQkvLyBwcml2YXRlIGJvb2xlYW4gY2hlY2tDaGlsZHJlbnNBY2NlcHRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gQXJ0aWZhY3QgcGFyZW50YXJ0aWZhY3QgPSAoKEFydGlmYWN0KSBvYmplY3QpLmdldENvbnRhaW5lckFydGlmYWN0KCk7Ci0JLy8gaWYgKHBhcmVudGFydGlmYWN0ICE9IG51bGwpIHsKLQkvLyBpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkvLyBpZiAoZmlsdGVyLmFjY2VwdChwYXJlbnRhcnRpZmFjdCkpCi0JLy8gcmV0dXJuIHRydWU7Ci0JLy8gZWxzZSB7Ci0JLy8gcmV0dXJuIGNoZWNrQ2hpbGRyZW5zQWNjZXB0ZWQocGFyZW50YXJ0aWZhY3QpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0JLy8KLQkvLyBwcml2YXRlIHZvaWQgZ2V0SGllcmFyY2h5TGlzdChMaXN0IGxpc3QsIE9iamVjdCBvYmplY3QpIHsKLQkvLyBBcnRpZmFjdCBwYXJlbnQgPSAoKEFydGlmYWN0KSBvYmplY3QpLmdldENvbnRhaW5lckFydGlmYWN0KCk7Ci0JLy8gaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JLy8gbGlzdC5hZGQocGFyZW50KTsKLQkvLyBnZXRIaWVyYXJjaHlMaXN0KGxpc3QsIHBhcmVudCk7Ci0JLy8gfQotCS8vIH0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0NvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0NvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTAwYTg4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Db250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgY29udGVudCBkZXNjcmlwdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Db250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQSBtYXAgb2YgRUNsYXNzIC8gSXRlbVByb3ZpZGVyQWRhcHRlciBmb3IgZWFjaCB0eXBlIG9mIENvbnRlbnREZXNjcmlwdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBpdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8JCi0JcHVibGljIENvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWl0ZW1Qcm92aWRlck1hcC5jbGVhcigpOwotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiBnZXRBZGFwdGVyKChFT2JqZWN0KSBvYmplY3QpLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQcm9wZXJ0eURlc2NyaXB0b3IoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0LAotCQkJT2JqZWN0IHByb3BlcnR5SWQpIHsKLQkJcmV0dXJuIGdldEFkYXB0ZXIoKEVPYmplY3QpIG9iamVjdCkuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwKLQkJCQlwcm9wZXJ0eUlkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0RWRpdGFibGVWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRBZGFwdGVyKChFT2JqZWN0KSBvYmplY3QpLmdldEVkaXRhYmxlVmFsdWUob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuR3VpZGFuY2VJdGVtUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiBnZXRBZGFwdGVyKChFT2JqZWN0KSBvYmplY3QpLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkd1aWRhbmNlSXRlbVByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSXRlbVByb3ZpZGVyQWRhcHRlciBnZXRBZGFwdGVyKEVPYmplY3QgZU9iaikgewotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgaXRlbVByb3ZpZGVyTWFwCi0JCQkJLmdldChlT2JqLmVDbGFzcygpKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5jcmVhdGVBZGFwdGVyKGVPYmopOwotCQkJaXRlbVByb3ZpZGVyTWFwLnB1dChlT2JqLmVDbGFzcygpLCBhZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0NvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2YjRkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkNvbnRlbnQgUGFja2FnZXMiIGZvbGRlciBpbiB0aGUgTGlicmFyeQotICogdmlldy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlbmFtZWQgYXMgQ29udGVudFBhY2thZ2VzSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVsZW1lbnRJdGVtUHJvdmlkZXIsIElMaWJyYXJ5SXRlbVByb3ZpZGVyLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIFJvbGVzSXRlbVByb3ZpZGVyIHJvbGVzOwotCi0JcHJvdGVjdGVkIFRhc2tzSXRlbVByb3ZpZGVyIHRhc2tzOwotCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlciB3b3JrUHJvZHVjdHM7Ci0KLQlwcm90ZWN0ZWQgR3VpZGFuY2VzSXRlbVByb3ZpZGVyIGd1aWRhbmNlczsKLQotCXByb3RlY3RlZCBTdHJpbmcgbGFiZWw7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJvbGVzLgotCSAqLwotCXB1YmxpYyBSb2xlc0l0ZW1Qcm92aWRlciBnZXRSb2xlcygpIHsKLQkJcmV0dXJuIHJvbGVzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGFza3MuCi0JICovCi0JcHVibGljIFRhc2tzSXRlbVByb3ZpZGVyIGdldFRhc2tzKCkgewotCQlyZXR1cm4gdGFza3M7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB3b3JrUHJvZHVjdHMuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlciBnZXRXb3JrUHJvZHVjdHMoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdHM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQkvLyBwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkvLyBpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JLy8gY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSk7Ci0JLy8gfQotCS8vIHJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCS8vIH0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgYWxsQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUNoaWxkcmVuU3RvcmUgc3RvcmUgPSBnZXRDaGlsZHJlblN0b3JlKG9iamVjdCk7Ci0JCUxpc3QgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHN0b3JlID09IG51bGwpIHsKLQkJCXN0b3JlID0gY3JlYXRlQ2hpbGRyZW5TdG9yZShvYmplY3QpOwotCQkJcmVzdWx0ID0gc3RvcmUgIT0gbnVsbCA/IG51bGwgOiBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCi0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCkuaXRlcmF0b3IoKTsgaQotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaS5uZXh0KCk7Ci0JCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQkJCUxpc3QgY29udGVudFBrZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCWZvciAoSXRlcmF0b3IgY2kgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBjaS5oYXNOZXh0KCk7IGluZGV4KyspIHsKLQkJCQkJCU9iamVjdCBjaGlsZCA9IGNpLm5leHQoKTsKLQkJCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJCQkJY2hpbGQgPSB3cmFwKGVPYmplY3QsIGZlYXR1cmUsIGNoaWxkLCBpbmRleCk7Ci0JCQkJCQkJLy8gaWYgKHN0b3JlICE9IG51bGwpCi0JCQkJCQkJLy8gewotCQkJCQkJCS8vIHN0b3JlLmdldExpc3QoZmVhdHVyZSkuYWRkKGNoaWxkKTsKLQkJCQkJCQkvLyB9Ci0JCQkJCQkJLy8gZWxzZQotCQkJCQkJCS8vIHsKLQkJCQkJCQkvLyByZXN1bHQuYWRkKGNoaWxkKTsKLQkJCQkJCQkvLyB9Ci0JCQkJCQkJY29udGVudFBrZ3MuYWRkKGNoaWxkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gY2xlYXIgcGFyZW50IGZvciBjaGlsZHJlbgotCQkJCQkvLwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBjaGlsZCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChjaGlsZCwKLQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRQYXJlbnQobnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyBzb3J0aW5nIHRoZSBjb250ZW50IHBhY2thZ2VzCi0JCQkJCS8vCi0JCQkJCUNvbGxlY3Rpb25zLnNvcnQoY29udGVudFBrZ3MsIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0Q29tcGFyYXRvcigpKTsKLQotCQkJCQlpZiAoc3RvcmUgIT0gbnVsbCkgewotCQkJCQkJc3RvcmUuZ2V0TGlzdChmZWF0dXJlKS5hZGRBbGwoY29udGVudFBrZ3MpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVzdWx0LmFkZEFsbChjb250ZW50UGtncyk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlPYmplY3QgY2hpbGQgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJCQljaGlsZCA9IHdyYXAoZU9iamVjdCwgZmVhdHVyZSwgY2hpbGQsCi0JCQkJCQkJCUNvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgpOwotCQkJCQkJaWYgKHN0b3JlICE9IG51bGwpIHsKLQkJCQkJCQlzdG9yZS5zZXRWYWx1ZShmZWF0dXJlLCBjaGlsZCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJlc3VsdC5hZGQoY2hpbGQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFsbENoaWxkcmVuLmFkZEFsbChzdG9yZSAhPSBudWxsID8gc3RvcmUuZ2V0Q2hpbGRyZW4oKSA6IHJlc3VsdCk7Ci0JCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cgPSAoQ29udGVudFBhY2thZ2UpIG9iamVjdDsKLQotCQkvLyByZW1vdmUgb2xkIGFkYXB0ZXJzIChyb2xlcywgdGFza3MsIHdvcmtwcm9kdWN0cykgZnJvbSB0aGUgdGhlCi0JCS8vIGNvbnRlbnRQa2cKLQkJLy8KLQkJLy8gRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIG9iamVjdDsKLQkJaWYgKHJvbGVzID09IG51bGwpIHsKLQkJCS8vIGVPYmouZUFkYXB0ZXJzKCkucmVtb3ZlKHJvbGVzKTsKLQkJCXJvbGVzID0gbmV3IFJvbGVzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnKTsKLQkJfQotCQlpZiAodGFza3MgPT0gbnVsbCkgewotCQkJLy8gZU9iai5lQWRhcHRlcnMoKS5yZW1vdmUodGFza3MpOwotCQkJdGFza3MgPSBuZXcgVGFza3NJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2cpOwotCQl9Ci0JCWlmICh3b3JrUHJvZHVjdHMgPT0gbnVsbCkgewotCQkJLy8gZU9iai5lQWRhcHRlcnMoKS5yZW1vdmUod29ya1Byb2R1Y3RzKTsKLQkJCXdvcmtQcm9kdWN0cyA9IG5ldyBXb3JrUHJvZHVjdHNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJCWNvbnRlbnRQa2cpOwotCQl9Ci0JCWlmIChndWlkYW5jZXMgPT0gbnVsbCkgewotCQkJLy8gZU9iai5lQWRhcHRlcnMoKS5yZW1vdmUoZ3VpZGFuY2VzKTsKLQkJCWd1aWRhbmNlcyA9IG5ldyBHdWlkYW5jZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2cpOwotCQl9Ci0KLQkJYWxsQ2hpbGRyZW4uYWRkKHJvbGVzKTsKLQkJYWxsQ2hpbGRyZW4uYWRkKHRhc2tzKTsKLQkJYWxsQ2hpbGRyZW4uYWRkKHdvcmtQcm9kdWN0cyk7Ci0JCWFsbENoaWxkcmVuLmFkZChndWlkYW5jZXMpOwotCQlyZXR1cm4gYWxsQ2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKCkpKTsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5DbGFzcywKLQkvLyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXIpCi0JLy8gKi8KLQkvLyBwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKE9iamVjdCBvYmplY3QsIEVkaXRpbmdEb21haW4gZG9tYWluLAotCS8vIENsYXNzIGNvbW1hbmRDbGFzcywgQ29tbWFuZFBhcmFtZXRlciBjb21tYW5kUGFyYW1ldGVyKSB7Ci0JLy8gLy8gY29tbWFuZFBhcmFtZXRlci5zZXRPd25lcigoKEVPYmplY3Qpb2JqZWN0KS5lQ29udGFpbmVyKCkpOwotCS8vIENvbW1hbmQgY21kID0gc3VwZXIuY3JlYXRlQ29tbWFuZChvYmplY3QsIGRvbWFpbiwgY29tbWFuZENsYXNzLAotCS8vIGNvbW1hbmRQYXJhbWV0ZXIpOwotCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY3JlYXRlQ29tbWFuZDogIiArCi0JLy8gY29tbWFuZENsYXNzICsgIiwgY2FuIGV4ZWN1dGU6ICIgKyBjbWQuY2FuRXhlY3V0ZSgpICsgIiwgb3duZXI6ICIgKwotCS8vIGNvbW1hbmRQYXJhbWV0ZXIuZ2V0T3duZXIoKSArICIsIGNvbGxlY3Rpb246ICIgKwotCS8vIGNvbW1hbmRQYXJhbWV0ZXIuZ2V0Q29sbGVjdGlvbigpKTsKLQkvLyByZXR1cm4gY21kOwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIHR4dDsKLQkJaWYgKGxhYmVsICE9IG51bGwpIHsKLQkJCXR4dCA9IGxhYmVsOwotCQl9IGVsc2UgewotCQkJdHh0ID0gVG5nVXRpbAotCQkJCQkuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9Db250ZW50UGFja2FnZV90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gY2hlY2sgaWYgdGhlIG9iamVjdCBoYXMgaXRzIG93biByZXNvdXJjZSBhbmQgaXQgaXMgbW9kaWZpZWQgdG8gYWRkCi0JCS8vIHRoZSBkaXJ0eSBmbGFnCi0JCS8vCi0JCVJlc291cmNlIHJlcyA9ICgoRU9iamVjdCkgb2JqZWN0KS5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlcyAhPSBudWxsICYmIHJlcy5nZXRDb250ZW50cygpLmdldCgwKSA9PSBvYmplY3QKLQkJCQkmJiByZXMuaXNNb2RpZmllZCgpKSB7Ci0JCQl0eHQgPSB0eHQgKyAiKiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdHh0OwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQYWNrYWdlID0gKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQ7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShjb250ZW50UGFja2FnZS5nZXRDaGlsZFBhY2thZ2VzKCksCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmosICJjb250ZW50X3BhY2thZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShjb250ZW50UGFja2FnZS5nZXRDaGlsZFBhY2thZ2VzKCksCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmosICJtZXRob2RfcGFja2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobXNnLCB0aGlzKTsKLQotCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoQ29udGVudFBhY2thZ2UuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFM6Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOgotCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQlzZXREZWZhdWx0TmFtZShtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlzZXREZWZhdWx0TmFtZShpdGVyLm5leHQoKSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2VzSXRlbVByb3ZpZGVyIGdldEd1aWRhbmNlcygpIHsKLQkJcmV0dXJuIGd1aWRhbmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJcmV0dXJuIHBhcmVudDsKLQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCX0KLQotCS8vIHB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCS8vIHJldHVybiBUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L01ldGhvZFBhY2thZ2VzIik7Ci0JLy8gfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCUFycmF5TGlzdCBzZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCi0JCQkvLyBtYWtlIHN1cmUgdGhhdCB5b3UgY2Fubm90IGFkZCBNZXRob2RQYWNrYWdlIHRoYXQgaXMgbm90IGEKLQkJCS8vIENvbnRlbnRQYWNrYWdlCi0JCQkvLwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlCi0JCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlzZWxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBzZWxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChndWlkYW5jZXMgIT0gbnVsbCkgewotCQkJZ3VpZGFuY2VzLmRpc3Bvc2UoKTsKLQkJCWd1aWRhbmNlcyA9IG51bGw7Ci0JCX0KLQkJaWYgKHJvbGVzICE9IG51bGwpIHsKLQkJCXJvbGVzLmRpc3Bvc2UoKTsKLQkJCXJvbGVzID0gbnVsbDsKLQkJfQotCQlpZiAodGFza3MgIT0gbnVsbCkgewotCQkJdGFza3MuZGlzcG9zZSgpOwotCQkJdGFza3MgPSBudWxsOwotCQl9Ci0JCWlmICh3b3JrUHJvZHVjdHMgIT0gbnVsbCkgewotCQkJd29ya1Byb2R1Y3RzLmRpc3Bvc2UoKTsKLQkJCXdvcmtQcm9kdWN0cyA9IG51bGw7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0d1aWRhbmNlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvR3VpZGFuY2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzYWU5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvR3VpZGFuY2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBndWlkYW5jZSBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuR3VpZGFuY2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQSBtYXAgb2YgRUNsYXNzIC8gSXRlbVByb3ZpZGVyQWRhcHRlciBmb3IgZWFjaCB0eXBlIG9mIGd1aWRhbmNlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWl0ZW1Qcm92aWRlck1hcC5jbGVhcigpOwotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuR3VpZGFuY2VJdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5EZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5HdWlkYW5jZUl0ZW1Qcm92aWRlciNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gZ2V0QWRhcHRlcigoRU9iamVjdCkgb2JqZWN0KS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UHJvcGVydHlEZXNjcmlwdG9yKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCwKLQkJCU9iamVjdCBwcm9wZXJ0eUlkKSB7Ci0JCXJldHVybiBnZXRBZGFwdGVyKChFT2JqZWN0KSBvYmplY3QpLmdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsCi0JCQkJcHJvcGVydHlJZCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEVkaXRhYmxlVmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0QWRhcHRlcigoRU9iamVjdCkgb2JqZWN0KS5nZXRFZGl0YWJsZVZhbHVlKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkd1aWRhbmNlSXRlbVByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCWlmICgoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KS5nZXROb2RlaWNvbigpICE9IG51bGwpIHsKLQkJCQlVUkkgaW1nVXJpID0gVG5nVXRpbC5nZXRGdWxsUGF0aG9mTm9kZW9yU2hhcGVJY29uVVJJKAotCQkJCQkJKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0LAotCQkJCQkJKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSk7Ci0JCQkJT2JqZWN0IGltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTaGFyZWRJbWFnZShpbWdVcmkpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKQotCQkJCQlyZXR1cm4gaW1hZ2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiBnZXRBZGFwdGVyKChFT2JqZWN0KSBvYmplY3QpLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJdGVtUHJvdmlkZXJBZGFwdGVyIGdldEFkYXB0ZXIoRU9iamVjdCBlT2JqKSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBpdGVtUHJvdmlkZXJNYXAKLQkJCQkuZ2V0KGVPYmouZUNsYXNzKCkpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJLmNyZWF0ZUFkYXB0ZXIoZU9iaik7Ci0JCQlpdGVtUHJvdmlkZXJNYXAucHV0KGVPYmouZUNsYXNzKCksIGFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5HdWlkYW5jZUl0ZW1Qcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCWlmIChlT2JqID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJLmdldEFkYXB0ZXIoZU9iaiwgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoaXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBpdGVtUHJvdmlkZXIuZ2V0R3VpZGFuY2VzKCk7Ci0JCX0KLQkJcmV0dXJuIGVPYmo7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoCi0JCQkJZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwgaW5kZXgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkd1aWRhbmNlSXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQkJCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvR3VpZGFuY2VzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvR3VpZGFuY2VzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMGQ4MzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0d1aWRhbmNlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiR3VpZGFuY2UiIGZvbGRlciBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgcmVuYW1lZCBhcyBHdWlkYW5jZUZvbGRlckl0ZW1Qcm92aWRlciBpbiBFUEYgTTUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlc0l0ZW1Qcm92aWRlciBleHRlbmRzIFRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEd1aWRhbmNlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuZWxlbWVudC5UcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgR3VpZGFuY2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvR3VpZGFuY2VGb2xkZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkvLyAoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJLy8gKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLAotCQkvLyBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBdHRhY2htZW50KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQ2hlY2tsaXN0KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQ29uY2VwdCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUV4YW1wbGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVHdWlkZWxpbmUoKSkpOwotCi0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCS8vIC5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJLy8gLmNyZWF0ZUVzdGltYXRlKCkpKTsKLQkJLy8KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpKSk7Ci0KLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJLy8gLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkvLyAuY3JlYXRlRXN0aW1hdGluZ01ldHJpYygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVByYWN0aWNlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUmVwb3J0KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUmV1c2FibGVBc3NldCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVJvYWRtYXAoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwoKSkpOwotCi0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCS8vIC5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJLy8gLmNyZWF0ZVRlY2huaXF1ZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVRlbXBsYXRlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVGVybURlZmluaXRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVUb29sTWVudG9yKCkpKTsKLQotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkvLyAoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJLy8gKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLAotCQkvLyBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUcmFpbmluZ0NsYXNzKCkpKTsKLQkJLy8KLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJLy8gKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCS8vIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwKLQkJLy8gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHJhaW5pbmdNb2R1bGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVXaGl0ZXBhcGVyKCkpKTsKLQotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkvLyAuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCS8vIC5jcmVhdGVXb3JrUHJvZHVjdEd1aWRlbGluZSgpKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JLy8gcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCS8vIEVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkvLyBpZihlT2JqID09IG51bGwpIHJldHVybiBudWxsOwotCS8vIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikKLQkvLyBUbmdVdGlsLmdldEFkYXB0ZXIoZU9iaiwgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuY2xhc3MpOwotCS8vIGlmKGl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JLy8gcmV0dXJuIGl0ZW1Qcm92aWRlci5nZXRHdWlkYW5jZXMoKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIGVPYmo7Ci0JLy8gfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0NIRUNLTElTVDsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBXaGl0ZXBhcGVyKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19XSElURVBBUEVSOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0NPTkNFUFQ7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT047Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRVhBTVBMRTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBQcmFjdGljZSkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfUFJBQ1RJQ0U7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUmVwb3J0KSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19SRVBPUlQ7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUm9hZG1hcCkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfUk9BRE1BUDsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19SRVVTQUJMRV9BU1NFVDsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0JCQkvLyB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRlY2huaXF1ZSkgewotCQkJLy8gYmFzZU5hbWUgPSAibmV3X1RlY2huaXF1ZSI7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVGVtcGxhdGUpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1RFTVBMQVRFOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19URVJNX0RFRklOSVRJT047Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfVE9PTF9NRU5UT1I7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19HVUlERUxJTkU7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0dVSURBTkNFOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCAoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmVsZW1lbnQuVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIjbmV3Q2hpbGRBZGRlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hpbGRyZW5DaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJYm9vbGVhbiByZWZyZXNoID0gZmFsc2U7Ci0JCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCWlmIChtc2cuZ2V0TmV3VmFsdWUoKSBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCQlyZWZyZXNoID0gdHJ1ZTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQlpZiAobXNnLmdldE9sZFZhbHVlKCkgaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJcmVmcmVzaCA9IHRydWU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQljaGVja19hZGQ6IGZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlpZiAoaXRlci5uZXh0KCkgaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJCXJlZnJlc2ggPSB0cnVlOwotCQkJCQlicmVhayBjaGVja19hZGQ7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJY2hlY2tfcmVtb3ZlOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJaWYgKGl0ZXIubmV4dCgpIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCQlyZWZyZXNoID0gdHJ1ZTsKLQkJCQkJYnJlYWsgY2hlY2tfcmVtb3ZlOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChyZWZyZXNoKQotCQkJVG5nVXRpbC5yZWZyZXNoVW5jYXRlZ29yaXplZFRvb2xNZW50b3JzSXRlbVByb3ZpZGVyKFVtYVV0aWwKLQkJCQkJLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgdGFyZ2V0KSwgbXNnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IGNoaWxkcmVuID0gbnVsbDsKLQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJaWYgKGNvbGxlY3Rpb24gaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQljaGlsZHJlbiA9IChMaXN0KSBjb2xsZWN0aW9uOwotCQl9IGVsc2UgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KGNvbGxlY3Rpb24pOwotCQl9Ci0JCUNvbGxlY3Rpb25zLnNvcnQoY2hpbGRyZW4sIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0R3VpZGFuY2VUeXBlQ29tcGFyYXRvcigpKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0lFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvSUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNmNzc3MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvSUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotLyoqCi0gKiBUaGUgYmFzZSBpbnRlcmZhY2UgZm9yIGEgbWV0aG9kIGVsZW1lbnQgaXRlbSBwcm92aWRlci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFbGVtZW50SXRlbVByb3ZpZGVyIHsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1JvbGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Sb2xlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYTNhYzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1JvbGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcm9sZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZUl0ZW1Qcm92aWRlciBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUm9sZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IGNvbnRlbnRQa2cgPSAoRU9iamVjdCkgc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCWlmIChjb250ZW50UGtnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJLmdldEFkYXB0ZXIoY29udGVudFBrZywgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlyZXR1cm4gaXRlbVByb3ZpZGVyICE9IG51bGwgPyBpdGVtUHJvdmlkZXIuZ2V0Um9sZXMoKSA6IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfUm9sZV90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlJvbGVJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCQkKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Sb2xlc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1JvbGVzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OTY0OWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1JvbGVzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiUm9sZXMiIGZvbGRlciBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlc0l0ZW1Qcm92aWRlciBleHRlbmRzIFRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJvbGVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQ29udGVudFBhY2thZ2UgY29udGVudFBrZykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlzeW5jaHJvbml6ZWQgcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUm9sZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUm9sZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUm9sZSgpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgUm9sZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZSkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfUk9MRTsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwgYmFzZU5hbWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5lbGVtZW50LlRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyI25ld0NoaWxkQWRkZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoaWxkcmVuQ2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCVRuZ1V0aWwucmVmcmVzaFVuY2F0ZWdvcml6ZWRSb2xlc0l0ZW1Qcm92aWRlcihVbWFVdGlsCi0JCQkJLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgdGFyZ2V0KSwgbXNnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXN1cGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1NlY3Rpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9TZWN0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYTRmZGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1NlY3Rpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgc2VjdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VjdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuU2VjdGlvbkl0ZW1Qcm92aWRlciB7Ci0KLQlwdWJsaWMgU2VjdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9TZWN0aW9uX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UYXNrSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvVGFza0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmRiMjc5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UYXNrSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHRhc2suCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tJdGVtUHJvdmlkZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlRhc2tJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGFza0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCBjb250ZW50UGtnID0gKEVPYmplY3QpIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQlpZiAoY29udGVudFBrZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCS5nZXRBZGFwdGVyKGNvbnRlbnRQa2csIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJcmV0dXJuIGl0ZW1Qcm92aWRlciAhPSBudWxsID8gaXRlbVByb3ZpZGVyLmdldFRhc2tzKCkgOiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUNvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuQ2xhc3MsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXIpCi0JICovCi0JLy8gcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3Qgb2JqZWN0LCBFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkvLyBDbGFzcyBjb21tYW5kQ2xhc3MsIENvbW1hbmRQYXJhbWV0ZXIgY29tbWFuZFBhcmFtZXRlcikgewotCS8vIC8vIGlmKGNvbW1hbmRDbGFzcyA9PSBSZW1vdmVDb21tYW5kLmNsYXNzKSB7Ci0JLy8gLy8gY29tbWFuZFBhcmFtZXRlci5zZXRPd25lcigoKEVPYmplY3Qpb2JqZWN0KS5lQ29udGFpbmVyKCkpOwotCS8vIC8vIH0KLQkvLyBDb21tYW5kIGNtZCA9IHN1cGVyLmNyZWF0ZUNvbW1hbmQob2JqZWN0LCBkb21haW4sIGNvbW1hbmRDbGFzcywKLQkvLyBjb21tYW5kUGFyYW1ldGVyKTsKLQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NyZWF0ZUNvbW1hbmQ6ICIgKwotCS8vIGNvbW1hbmRDbGFzcyArICIsIGNhbiBleGVjdXRlOiAiICsgY21kLmNhbkV4ZWN1dGUoKSArICIsIG93bmVyOiAiICsKLQkvLyBjb21tYW5kUGFyYW1ldGVyLmdldE93bmVyKCkgKyAiLCBjb2xsZWN0aW9uOiAiICsKLQkvLyBjb21tYW5kUGFyYW1ldGVyLmdldENvbGxlY3Rpb24oKSk7Ci0JLy8gcmV0dXJuIGNtZDsKLQkvLyB9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX1Rhc2tfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlRhc2tJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLS8vCQlzd2l0Y2gobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0vLwkJY2FzZSBFdmVudFR5cGVzLk1BS0VfUFJPWFk6Ci0vLwkJCS8vIHJlZnJlc2ggcGFyZW50Ci0vLwkJCS8vCi0vLwkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBnZXRQYXJlbnQobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpLCB0cnVlLCBmYWxzZSkpOwotLy8JCQkKLS8vCQkJLy8gcmVmcmVzaCBpdHNlbGYKLS8vCQkJLy8KLS8vCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCB0cnVlKSk7Ci0vLwkJCQotLy8JCQlyZXR1cm47Ci0vLwkJfQotCQkKLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCQkKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UYXNrc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1Rhc2tzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MjEwNzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1Rhc2tzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJUYXNrcyIgZm9sZGVyIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tzSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGFza3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSBjb250ZW50UGtnKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Rhc2tzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1Rhc2tzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVGFzaygpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5lbGVtZW50LlRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBUYXNrOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19UQVNLOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCAoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmVsZW1lbnQuVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIjbmV3Q2hpbGRBZGRlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hpbGRyZW5DaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJLy8gcmVmcmVzaCB0aGUgdW5jYXRlZ29yaXplZCB0YXNrcyBncm91cAotCQkvLwotCQlUbmdVdGlsLnJlZnJlc2hVbmNhdGVnb3JpemVkVGFza3NJdGVtUHJvdmlkZXIoVW1hVXRpbAotCQkJCS5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIHRhcmdldCksIG1zZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1RyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZGRjZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1RyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiQ29udGVudCBQYWNrYWdlcyIgc3ViIGZvbGRlcnMgaW4gdGhlCi0gKiBMaWJyYXJ5IHZpZXcuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSByZW5hbWVkIGFzIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKG1zZy5nZXROb3RpZmllcigpID09IHRhcmdldCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoQ29udGVudFBhY2thZ2UuY2xhc3MpOwotCQkJaWYgKGZlYXR1cmVJZCA9PSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUykgewotCQkJCWJvb2xlYW4gbm90aWZ5ID0gZmFsc2U7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uTU9WRToKLQkJCQkJT2JqZWN0IG9iaiA9IG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJb2JqID0gbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCW5vdGlmeSA9IGFjY2VwdEFzQ2hpbGQob2JqKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJZm9yX2NoZWNrOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJaWYgKGFjY2VwdEFzQ2hpbGQoaXRlci5uZXh0KCkpKSB7Ci0JCQkJCQkJbm90aWZ5ID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBmb3JfY2hlY2s7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWZvcl9jaGVjazogZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCWlmIChhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZm9yX2NoZWNrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKLQkJCQkJaWYobXNnLmdldE5ld1ZhbHVlKCkgIT0gbXNnLmdldE9sZFZhbHVlKCkpIHsKLQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChub3RpZnkpIHsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihtc2csIHRoaXMsIHRydWUsCi0JCQkJCQkJZmFsc2UpKTsKLQkJCQkJY2hpbGRyZW5DaGFuZ2VkKG1zZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjaGlsZHJlbkNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gQ29udGVudFBhY2thZ2UuY2xhc3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Xb3JrUHJvZHVjdEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2FkYWIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Xb3JrUHJvZHVjdEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHdvcmsgcHJvZHVjdC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLldvcmtQcm9kdWN0SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5kZWxlZ2F0ZUl0ZW1Qcm92aWRlciA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoZGVsZWdhdGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRlbGVnYXRlSXRlbVByb3ZpZGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJaWYgKGVPYmogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkuZ2V0QWRhcHRlcihlT2JqLCBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCWlmIChpdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGl0ZW1Qcm92aWRlci5nZXRXb3JrUHJvZHVjdHMoKTsKLQkJfQotCQlyZXR1cm4gZU9iajsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX0FydGlmYWN0X3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9EZWxpdmVyYWJsZV90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgT3V0Y29tZSkgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9PdXRjb21lX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlpZiAoKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSAhPSBudWxsKSB7Ci0JCQkJVVJJIGltZ1VyaSA9IFRuZ1V0aWwuZ2V0RnVsbFBhdGhvZk5vZGVvclNoYXBlSWNvblVSSSgKLQkJCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCwKLQkJCQkJCSgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkpOwotCQkJCU9iamVjdCBpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U2hhcmVkSW1hZ2UoaW1nVXJpKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGltYWdlOwotCQkJfQotCQl9Ci0JCWlmIChkZWxlZ2F0ZUl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGVJdGVtUHJvdmlkZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0FydGlmYWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGVsaXZlcmFibGUiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE91dGNvbWUpIHsKLQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L091dGNvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCQkKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Xb3JrUHJvZHVjdHNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Xb3JrUHJvZHVjdHNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhOTM0Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJXb3JrIFByb2R1Y3RzIiBmb2xkZXIgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQ29udGVudFBhY2thZ2UgY29udGVudFBrZykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdHNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUFydGlmYWN0KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRGVsaXZlcmFibGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVPdXRjb21lKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLmVsZW1lbnQuVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoIXN1cGVyLmFjY2VwdEFzQ2hpbGQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfQVJUSUZBQ1Q7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0RFTElWRVJBQkxFOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE91dGNvbWUpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX09VVENPTUU7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1dPUktQUk9EVUNUOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCAoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmVsZW1lbnQuVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIjbmV3Q2hpbGRBZGRlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hpbGRyZW5DaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJVG5nVXRpbC5yZWZyZXNoVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlcnMoVW1hVXRpbAotCQkJCS5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIHRhcmdldCksIG1zZyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJmYmY5OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZGlzcGxheSBhbmQgZWRpdGluZyBzdXBwb3J0IGZvciBjb3JlIG1ldGhvZCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pbnRlcm5hbC9UbmdBZGFwdGVyRmFjdG9yeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaW50ZXJuYWwvVG5nQWRhcHRlckZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNTRkYTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pbnRlcm5hbC9UbmdBZGFwdGVyRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlBCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4cG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgbWV0aG9kIGxpYnJhcnkgYWRhcHRlciBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVG5nQWRhcHRlckZhY3RvcnlJbXBsIGltcGxlbWVudHMgVG5nQWRhcHRlckZhY3RvcnkgewotCi0JcHJpdmF0ZSBFeHBvc2VkQWRhcHRlckZhY3Rvcnkgd2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCi0JcHJpdmF0ZSBFeHBvc2VkQWRhcHRlckZhY3Rvcnkgb2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCi0JcHJpdmF0ZSBFeHBvc2VkQWRhcHRlckZhY3RvcnkgcGJzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeVtdIHdic0FkYXB0ZXJGYWN0b3JpZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeVtdIG9ic0FkYXB0ZXJGYWN0b3JpZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeVtdIHBic0FkYXB0ZXJGYWN0b3JpZXMgPSBudWxsOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5W10gcHJvY0FkYXB0ZXJGYWN0b3JpZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBFeHBvc2VkQWRhcHRlckZhY3RvcnkgbmF2aWdhdG9yQWRhcHRlckZhY3Rvcnk7Ci0KLQlwcm90ZWN0ZWQgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IGNvbmZpZ3VyYXRpb25BZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IGNvbmZpZ1Byb2Nlc3NWaWV3QWRhcHRlckZhY3Rvcnk7Ci0KLQlwcml2YXRlIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBpdGVtc0ZpbHRlckFkYXB0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBFeHBvc2VkQWRhcHRlckZhY3RvcnkgcGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBFeHBvc2VkQWRhcHRlckZhY3Rvcnkgb2JzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5OwotCi0JcHJvdGVjdGVkIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBwcm9jQWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgVG5nQWRhcHRlckZhY3RvcnlJbXBsKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcuVG5nQWRhcHRlckZhY3RvcnkjZ2V0V0JTX0FkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKHdic0FkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmICh3YnNBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCXdic0FkYXB0ZXJGYWN0b3J5ID0gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQkJCQlnZXRXQlNfQWRhcHRlckZhY3RvcmllcygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcuVG5nQWRhcHRlckZhY3RvcnkjZ2V0T0JTX0FkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG9ic0FkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChvYnNBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCW9ic0FkYXB0ZXJGYWN0b3J5ID0gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQkJCQlnZXRPQlNfQWRhcHRlckZhY3RvcmllcygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9ic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcuVG5nQWRhcHRlckZhY3RvcnkjZ2V0UEJTX0FkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKHBic0FkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChwYnNBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCXBic0FkYXB0ZXJGYWN0b3J5ID0gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQkJCQlnZXRQQlNfQWRhcHRlckZhY3RvcmllcygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlbXSBnZXRXQlNfQWRhcHRlckZhY3RvcmllcygpIHsKLQkJaWYgKHdic0FkYXB0ZXJGYWN0b3JpZXMgPT0gbnVsbCkgewotCQkJV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG5ldyBXQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOwotCQkJd2JzQWRhcHRlckZhY3RvcmllcyA9IG5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCWZhY3RvcnksCi0JCQkJCS8vIG5ldyBCU1Byb2Nlc3N0eXBlc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KGZhY3RvcnkpLAotCQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfTsKLQkJfQotCQlyZXR1cm4gd2JzQWRhcHRlckZhY3RvcmllczsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5W10gZ2V0T0JTX0FkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCWlmIChvYnNBZGFwdGVyRmFjdG9yaWVzID09IG51bGwpIHsKLQkJCU9CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQkJCW9ic0FkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQlmYWN0b3J5LAotCQkJCQkvLyBuZXcgQlNQcm9jZXNzdHlwZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeShmYWN0b3J5KSwKLQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH07Ci0JCX0KLQkJcmV0dXJuIG9ic0FkYXB0ZXJGYWN0b3JpZXM7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeVtdIGdldFBCU19BZGFwdGVyRmFjdG9yaWVzKCkgewotCQlpZiAocGJzQWRhcHRlckZhY3RvcmllcyA9PSBudWxsKSB7Ci0JCQlQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFBCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlwYnNBZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJLy8gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJZmFjdG9yeSwKLQkJCQkJLy8gbmV3IEJTUHJvY2Vzc3R5cGVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoZmFjdG9yeSksCi0JCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9OwotCQl9Ci0JCXJldHVybiBwYnNBZGFwdGVyRmFjdG9yaWVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChuYXZpZ2F0b3JBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAobmF2aWdhdG9yQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQlPYmplY3QgZXh0ID0gRXh0ZW5zaW9uTWFuYWdlci5jcmVhdGVFeHRlbnNpb24oTGlicmFyeUVkaXRQbHVnaW4uUExVR0lOX0lELCAibGlicmFyeVZpZXdBZGFwdGVyRmFjdG9yeSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmKGV4dCBpbnN0YW5jZW9mIENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkJCW5hdmlnYXRvckFkYXB0ZXJGYWN0b3J5ID0gKEV4cG9zZWRBZGFwdGVyRmFjdG9yeSkgZXh0OwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbmF2aWdhdG9yQWRhcHRlckZhY3RvcnkgPSBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCQkJCQluZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQkJCQkJLy8gbmV3Ci0JCQkJCQkJCQkJLy8gUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJCW5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmF2aWdhdG9yQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNnZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCSAqLwotCS8vIHB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldEZpbHRlclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkvLyBpZihmaWx0ZXJBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JLy8gc3luY2hyb25pemVkKHRoaXMpIHsKLQkvLyBpZihmaWx0ZXJBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JLy8gZmlsdGVyQWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkvLyBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JLy8gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkvLyBuZXcgY29tLmlibS5saWJyYXJ5LmVkaXQuZmlsdGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JLy8gbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpCi0JLy8gfSk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGZpbHRlckFkYXB0ZXJGYWN0b3J5OwotCS8vIH0KLQkvLyAgICAKLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRDb25maWd1cmF0aW9uVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAoY29uZmlndXJhdGlvbkFkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChjb25maWd1cmF0aW9uQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQljb25maWd1cmF0aW9uQWRhcHRlckZhY3RvcnkgPSBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCQkJCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQluZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb25maWd1cmF0aW9uQWRhcHRlckZhY3Rvcnk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2dldE5hdmlnYXRvclZpZXdfRmlsdGVyQWRhcHRlckZhY3RvcnkoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0Q29uZmlndXJhdGlvblZpZXdfQWRhcHRlckZhY3RvcnkoSUZpbHRlciBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJBZGFwdGVyRmFjdG9yeSgKLQkJCQlnZXRDb25maWd1cmF0aW9uVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGZpbHRlcik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmlsdGVySXRlbVByb3ZpZGVyIGltcGxlbWVudHMgQWRhcHRlciwKLQkJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldDxDbGFzczw/Pj4gQ0xBU1NFU19FWENMVURFRF9GUk9NX1NPUlRJTkcgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKTsKLQotCQlzdGF0aWMgewotCQkJQ0xBU1NFU19FWENMVURFRF9GUk9NX1NPUlRJTkcuYWRkKEFjdGl2aXR5LmNsYXNzKTsKLQkJCUNMQVNTRVNfRVhDTFVERURfRlJPTV9TT1JUSU5HLmFkZChDdXN0b21DYXRlZ29yeS5jbGFzcyk7Ci0JCQlDTEFTU0VTX0VYQ0xVREVEX0ZST01fU09SVElORy5hZGQoVGFza0Rlc2NyaXB0b3IuY2xhc3MpOwotCQkJQ0xBU1NFU19FWENMVURFRF9GUk9NX1NPUlRJTkcuYWRkKFRlYW1Qcm9maWxlLmNsYXNzKTsKLQkJfQotCi0JCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyOwotCi0JCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGlzQWRhcHRlckNvbmZpZ3VyYWJsZTsKLQotCQlGaWx0ZXJJdGVtUHJvdmlkZXIoSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyLCBJRmlsdGVyIGZpbHRlcikgewotCQkJdGhpcy5hZGFwdGVyID0gYWRhcHRlcjsKLQkJCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhYmxlKSB7Ci0JCQkJaXNBZGFwdGVyQ29uZmlndXJhYmxlID0gdHJ1ZTsKLQkJCQkoKElDb25maWd1cmFibGUpIGFkYXB0ZXIpLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJfQotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCWFkYXB0ZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI2dldFRhcmdldCgpCi0JCSAqLwotCQlwdWJsaWMgTm90aWZpZXIgZ2V0VGFyZ2V0KCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjc2V0VGFyZ2V0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgewotCQkJYWRhcHRlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNpc0FkYXB0ZXJGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb248Pz4gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJTGlzdDxPYmplY3Q+IGNoaWxkcmVuID0gbnVsbDsKLQkJCWZha2VfbG9vcDogZG8gewotCQkJCQotCQkJCS8vIE9yZGVyIGlzIG5vdCBpbXBvcnRhbnQsIElmIGFkYXB0ZXIgaXMgSUxpYnJhcnlJdGVtUHJvdmlkZXIKLQkJCQkvLyBhbmQgcmVwbGFjZUNoaWxkcmVuIGlzIGZhbHNlIGFuZCBJQ29uZmlndXJhYmxlLCBpdCBzaG91bGQgIAotCQkJCS8vIGdvIHRvIGlzQWRhcHRlckNvbmZpZ3VyYWJsZSwgbm90IHRvIHJlZ3VsYXIgaXRlcmF0aW9uLgotCi0JCQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IKLQkJCQkJCSYmIGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCQlJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IChJQ29uZmlndXJhdG9yKSBmaWx0ZXI7Ci0JCQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQkJCWJvb2xlYW4gcmVwbGFjZUNoaWxkcmVuID0gZmFsc2U7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpCi0JCQkJCQkJLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlcgotCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJQ29sbGVjdGlvbiBvdGhlckNoaWxkcmVuID0gY29uZmlndXJhdG9yLmdldENoaWxkcmVuKAotCQkJCQkJCQlvYmplY3QsIGZlYXR1cmUpOwotCQkJCQkJaWYgKG90aGVyQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCQkJCXJlcGxhY2VDaGlsZHJlbiA9IHRydWU7Ci0JCQkJCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJV3JhcHBlcikgewotCQkJCQkJCQlJV3JhcHBlciB3cmFwcGVyID0gKElXcmFwcGVyKSBhZGFwdGVyOwotCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gb3RoZXJDaGlsZHJlbgotCQkJCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQlPYmplY3QgY2hpbGQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCQljaGlsZHJlbi5hZGQod3JhcHBlci53cmFwKChFT2JqZWN0KSBvYmplY3QsCi0JCQkJCQkJCQkJCWZlYXR1cmUsIGNoaWxkLAotCQkJCQkJCQkJCQlDb21tYW5kUGFyYW1ldGVyLk5PX0lOREVYKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQljaGlsZHJlbi5hZGRBbGwob3RoZXJDaGlsZHJlbik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChyZXBsYWNlQ2hpbGRyZW4pIHsKLQkJCQkJCWJyZWFrIGZha2VfbG9vcDsKLQkJCQkJfQotCQkJCX0gCi0JCQkJaWYgKGlzQWRhcHRlckNvbmZpZ3VyYWJsZSkgewotCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBhZGFwdGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQkJCWlmIChjb2xsZWN0aW9uIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQkJY2hpbGRyZW4gPSAoTGlzdCkgY29sbGVjdGlvbjsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdChjb2xsZWN0aW9uKTsKLQkJCQkJfQotCQkJCQlicmVhayBmYWtlX2xvb3A7Ci0JCQkJfQotCQkJCQotCQkJCS8vIHJlZ3VsYXIgYWRhcHRlcgotCQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdChhZGFwdGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoZWxlbWVudCkpIHsKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IHdoaWxlIChmYWxzZSk7Ci0KLQkJCS8vIGFscGhhYmV0aWNhbGx5IHNvcnQgdGhlIGNoaWxkcmVuCi0JCQkvLwotCQkJaWYgKCFUbmdVdGlsLmlzSW5zdGFuY2VPZihDTEFTU0VTX0VYQ0xVREVEX0ZST01fU09SVElORywgVG5nVXRpbAotCQkJCQkudW53cmFwKG9iamVjdCkpKSB7Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChjaGlsZHJlbiwKLQkJCQkJCUNvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQkJfQotCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbHRlckl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbigpIHJldHVybmVkICIgKwotCQkJLy8gY2hpbGRyZW4pOwotCQkJcmV0dXJuIGNoaWxkcmVuOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBhZGFwdGVyLmdldFBhcmVudChvYmplY3QpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciNnZXROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhvYmplY3QsIGVkaXRpbmdEb21haW4sCi0JCQkJCXNpYmxpbmcpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciNjcmVhdGVDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5DbGFzcywKLQkJICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXIpCi0JCSAqLwotCQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKE9iamVjdCBvYmplY3QsCi0JCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBDbGFzcyBjb21tYW5kQ2xhc3MsCi0JCQkJQ29tbWFuZFBhcmFtZXRlciBjb21tYW5kUGFyYW1ldGVyKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5jcmVhdGVDb21tYW5kKG9iamVjdCwgZWRpdGluZ0RvbWFpbiwgY29tbWFuZENsYXNzLAotCQkJCQljb21tYW5kUGFyYW1ldGVyKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRFbGVtZW50cyhvYmplY3QpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yCi0JCQkJCSYmIGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCS8vIGFsd2F5cyByZXR1cm4gdHJ1ZSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlCi0JCQkJLy8KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KXsKLQkJCQlyZXR1cm4gYWRhcHRlci5oYXNDaGlsZHJlbihvYmplY3QpOwotCQkJfQotCQkJaWYoVG5nVXRpbC51bndyYXAob2JqZWN0KSBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBhZGFwdGVyLmdldFRleHQob2JqZWN0KTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBhZGFwdGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlEZXNjcmlwdG9yKGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCwKLQkJCQlPYmplY3QgcHJvcGVydHlJRCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHlJRCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2UjZ2V0RWRpdGFibGVWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBhZGFwdGVyLmdldEVkaXRhYmxlVmFsdWUob2JqZWN0KTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmlsdGVyQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeSwKLQkJCUlDaGFuZ2VOb3RpZmllciwgSURpc3Bvc2FibGUgewotCi0JCXByaXZhdGUgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBGaWx0ZXJBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJCUlGaWx0ZXIgZmlsdGVyKSB7Ci0JCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JCQlpZihhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJfQotCQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5I2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiBhZGFwdGVyRmFjdG9yeS5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSNhZGFwdChqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iamVjdCwgdHlwZSk7Ci0JCQlpZiAoYWRhcHRlciA9PSBudWxsIHx8IGFkYXB0ZXIgaW5zdGFuY2VvZiBGaWx0ZXJJdGVtUHJvdmlkZXIKLQkJCQkJfHwgIShhZGFwdGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJCXJldHVybiBuZXcgRmlsdGVySXRlbVByb3ZpZGVyKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyLCBmaWx0ZXIpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSNhZGFwdChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllciwKLQkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCQkJQWRhcHRlciBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQodGFyZ2V0LCB0eXBlKTsKLQkJCWlmIChhZGFwdGVyID09IG51bGwgfHwgYWRhcHRlciBpbnN0YW5jZW9mIEZpbHRlckl0ZW1Qcm92aWRlcgotCQkJCQl8fCAhKGFkYXB0ZXIgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQkJcmV0dXJuIG5ldyBGaWx0ZXJJdGVtUHJvdmlkZXIoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXIsIGZpbHRlcik7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5I2FkYXB0TmV3KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyLAotCQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gYWRhcHRlckZhY3RvcnkuYWRhcHROZXcodGFyZ2V0LCB0eXBlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkjYWRhcHRBbGxOZXcob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGFwdEFsbE5ldyhOb3RpZmllciBub3RpZmllcikgewotCQkJYWRhcHRlckZhY3RvcnkuYWRhcHRBbGxOZXcobm90aWZpZXIpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXIjZmlyZU5vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJYWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQkJYWRhcHRlckZhY3RvcnkuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQkJYWRhcHRlckZhY3RvcnkucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGUjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJZmlsdGVyID0gbnVsbDsKLQkJfQotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNjcmVhdGVXQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVXQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJbmV3IFdCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH07Ci0JCXJldHVybiBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3JpZXMpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVB1Ymxpc2hpbmdXQlNBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlUHVibGlzaGluZ1dCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQluZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQluZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmcuV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKQotCQkJCX0KLQkJKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNjcmVhdGVUQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVUQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJbmV3IE9CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH07Ci0JCXJldHVybiBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3JpZXMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjY3JlYXRlUHVibGlzaGluZ1RCU0FkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVQdWJsaXNoaW5nVEJTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCW5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZy5UQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpCi0JCQkJfQotCQkpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVdQQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVXUEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCW5ldyBQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9OwotCQlyZXR1cm4gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yaWVzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHByZWZTdG9yZSA9IFByb3ZpZGVycy5nZXRBdXRob3JpbmdQbHVnaW5QcmVmZXJlbmNlU3RvcmUoKTsKLQkJaWYgKHByZWZTdG9yZSAhPSBudWxsKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeS5zZXRDb2x1bW5JbmRleFRvTmFtZU1hcChQcm9jZXNzVXRpbAotCQkJCQkudG9Db2x1bW5JbmRleFRvTmFtZU1hcChwcmVmU3RvcmUKLQkJCQkJCQkuZ2V0U3RyaW5nKExpYnJhcnlFZGl0Q29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpKSk7Ci0JCX0KLQkJQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCWFkYXB0ZXJGYWN0b3J5LCBuZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfTsKLQotCQlyZXR1cm4gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yaWVzKTsKLQl9Ci0KLQkvLyBTZWN0aW9uIGZvciBUTkcgRmlsdGVyIG1vZGlmaWNhdGlvbiBwcm9jZXNzLgotCS8vIGZpbHRlciBtb2RpZmljYXRpb24gY29kZS4gU2ltaWxhciB0byBnZXRGaWx0ZXJWaWV3X0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIKLQkvLyBmaWx0ZXIpCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyQWRhcHRlckZhY3RvcnkoCi0JCQkJZ2V0SXRlbXNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBmaWx0ZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjZ2V0SXRlbXNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0SXRlbXNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKGl0ZW1zRmlsdGVyQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaWYgKGl0ZW1zRmlsdGVyQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQlpdGVtc0ZpbHRlckFkYXB0ZXJGYWN0b3J5ID0gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQkJCQluZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQkJCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGl0ZW1zRmlsdGVyQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFBCU0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShJRmlsdGVyIGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlckFkYXB0ZXJGYWN0b3J5KGdldFBCU0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJZmlsdGVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRQQlNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKHBic0ZpbHRlckFkYXBhdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAocGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCQkJcGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ID0gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQkJCQluZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQkJCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBic0ZpbHRlckFkYXBhdGVyRmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0T0JTRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyQWRhcHRlckZhY3RvcnkoZ2V0T0JTRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJCQlmaWx0ZXIpOwotCX0KLQotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldE9CU0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAob2JzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChvYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQlvYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkgPSBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCQkJCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQluZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5PQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gb2JzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAocHJvY0FkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChwcm9jQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQkJCQkJZmluYWwgSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgcHJlZlN0b3JlID0gUHJvdmlkZXJzLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkJCQlpZiAocHJlZlN0b3JlICE9IG51bGwpIHsKLQkJCQkJCWFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJCS5zZXRDb2x1bW5JbmRleFRvTmFtZU1hcChQcm9jZXNzVXRpbAotCQkJCQkJCQkJCS50b0NvbHVtbkluZGV4VG9OYW1lTWFwKHByZWZTdG9yZQotCQkJCQkJCQkJCQkJLmdldFN0cmluZyhMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKSkpOwotCQkJCQkJcHJlZlN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoYWRhcHRlckZhY3RvcnkpOwotCQkJCQkJCi0JCQkJCQkvLyBJbml0aWFsaXplICJhdXRvIGluaGVyaXQgc3VwcHJlc3Npb24gc3RhdGVzIiBmbGFnIGZvciBjYWxjdWxhdGluZyBzdXBwcmVzc2lvbgotCQkJCQkJLy8gYW5kIGFkZCBsaXN0ZW5lciB0byBpdHMgY2hhbmdlCi0JCQkJCQkvLwotCQkJCQkJU3VwcHJlc3Npb24uc2V0QXV0b0luaGVyaXRTdXBwcmVzc2lvblN0YXRlcyhwcmVmU3RvcmUuZ2V0Qm9vbGVhbihMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX0lOSEVSSVRfU1VQUFJFU1NJT05fU1RBVEUpKTsKLQkJCQkJCXByZWZTdG9yZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoKSB7Ci0KLQkJCQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShJUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIgZXZlbnQpIHsKLQkJCQkJCQkJaWYoTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9JTkhFUklUX1NVUFBSRVNTSU9OX1NUQVRFLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eSgpKSkgewotCQkJCQkJCQkJU3VwcHJlc3Npb24uc2V0QXV0b0luaGVyaXRTdXBwcmVzc2lvblN0YXRlcyhwcmVmU3RvcmUuZ2V0Qm9vbGVhbihMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX0lOSEVSSVRfU1VQUFJFU1NJT05fU1RBVEUpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQotCQkJCQkJfSk7Ci0JCQkJCX0JCQkJCQotCQkJCQotCQkJCQlwcm9jQWRhcHRlckZhY3RvcmllcyA9IG5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCQlhZGFwdGVyRmFjdG9yeSwKLQkJCQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfTsKLQotCQkJCQlwcm9jQWRhcHRlckZhY3RvcnkgPSBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCQkJCXByb2NBZGFwdGVyRmFjdG9yaWVzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcHJvY0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjcmVzZXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlpZiAobmF2aWdhdG9yQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJbmF2aWdhdG9yQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYgKGl0ZW1zRmlsdGVyQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJaXRlbXNGaWx0ZXJBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQlpdGVtc0ZpbHRlckFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKG9ic0ZpbHRlckFkYXBhdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlvYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJb2JzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKHBic0ZpbHRlckFkYXBhdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlwYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJcGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJfQotCQkKLQkJCi0JCWlmIChjb25maWdQcm9jZXNzVmlld0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCWNvbmZpZ1Byb2Nlc3NWaWV3QWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYgKGNvbmZpZ3VyYXRpb25BZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQljb25maWd1cmF0aW9uQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYgKHdic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXdic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCXdic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJfQotCi0JCWlmIChvYnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlvYnNBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQlvYnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCX0KLQotCQlpZiAocGJzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGJzQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJcGJzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQl9Ci0KLQkJaWYgKHByb2NBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkvLyByZW1vdmUgYWRhcHRlciBmYWN0b3J5IGFzIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmcm9tCi0JCQkvLyBwcmVmZXJlbmNlIHN0b3JlCi0JCQkvLwotCQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgcHJlZlN0b3JlID0gUHJvdmlkZXJzLmdldEF1dGhvcmluZ1BsdWdpblByZWZlcmVuY2VTdG9yZSgpOwotCQkJaWYgKHByZWZTdG9yZSAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9jQWRhcHRlckZhY3Rvcmllcy5sZW5ndGg7IGkrKykgewotCQkJCQlPYmplY3QgYWRhcHRlckZhY3RvcnkgPSBwcm9jQWRhcHRlckZhY3Rvcmllc1tpXTsKLQkJCQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKSB7Ci0JCQkJCQlwcmVmU3RvcmUKLQkJCQkJCQkJLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcikgYWRhcHRlckZhY3RvcnkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcHJvY0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCXByb2NBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVB1Ymxpc2hpbmdDQlNBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlUHVibGlzaGluZ0NCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQluZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQluZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmcuQ0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKQotCQkJCX0KLQkJKTsKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjY3JlYXRlUHVibGlzaGluZ1dQQlNBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlUHVibGlzaGluZ1dQQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJCQkJbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nLldQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpCi0JCQkJfQotCQkpOwotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNjbGVhblVwKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhblVwKCkgewotCQlTdXBwcmVzc2lvbi5jbGVhblVwKCk7Ci0KLQkJaWYgKG5hdmlnYXRvckFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCW5hdmlnYXRvckFkYXB0ZXJGYWN0b3J5LmNsZWFuVXAoKTsKLQkJfQotCi0JCWlmIChpdGVtc0ZpbHRlckFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCWl0ZW1zRmlsdGVyQWRhcHRlckZhY3RvcnkuY2xlYW5VcCgpOwotCQl9Ci0JCQotCQlpZiAob2JzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCW9ic0ZpbHRlckFkYXBhdGVyRmFjdG9yeS5jbGVhblVwKCk7Ci0JCX0KLQkJCi0JCWlmIChwYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5LmNsZWFuVXAoKTsKLQkJfQotCQkKLQkJCi0JCWlmIChjb25maWdQcm9jZXNzVmlld0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCWNvbmZpZ1Byb2Nlc3NWaWV3QWRhcHRlckZhY3RvcnkuY2xlYW5VcCgpOwotCQl9Ci0KLQkJaWYgKGNvbmZpZ3VyYXRpb25BZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQljb25maWd1cmF0aW9uQWRhcHRlckZhY3RvcnkuY2xlYW5VcCgpOwotCQl9Ci0KLQkJaWYgKHdic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXdic0FkYXB0ZXJGYWN0b3J5LmNsZWFuVXAoKTsKLQkJfQotCi0JCWlmIChvYnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlvYnNBZGFwdGVyRmFjdG9yeS5jbGVhblVwKCk7Ci0JCX0KLQotCQlpZiAocGJzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGJzQWRhcHRlckZhY3RvcnkuY2xlYW5VcCgpOwotCQl9Ci0KLQkJaWYgKHByb2NBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlwcm9jQWRhcHRlckZhY3RvcnkuY2xlYW5VcCgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2ludGVybmFsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaW50ZXJuYWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjRmZTY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaW50ZXJuYWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZGlzcGxheSBhbmQgZWRpdGluZyBzdXBwb3J0IGZvciBtZXRob2QgbGlicmFyeSBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMGE0YjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYW4gYWN0aXZpdHkgaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbgotICogZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3QgY2hpbGQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlpZihjaGlsZCBpbnN0YW5jZW9mIE1pbGVzdG9uZSlyZXR1cm4gdHJ1ZTsKLQkJCi0JCXJldHVybiBzdXBlci5hY2NlcHRBc0NoaWxkKGNoaWxkKTsKLQl9Ci0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCUNvbGxlY3Rpb24gY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJRmlsdGVyVXRpbAotCQkJCS5pdGVyYXRlQ29sbGVjdGlvbihjb2wsIFByb2Nlc3NVdGlsLmdldEZpbHRlcihhZGFwdGVyRmFjdG9yeSkpOwotCQlyZXR1cm4gY29sOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA0NjFmMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBicmVha2Rvd24gc3RydWN0dXJlIGFjdGl2aXR5IGluIHRoZQotICogbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBhZGRJbmhlcml0ZWQoT2JqZWN0IG9iamVjdCwgTGlzdCBteUNoaWxkcmVuKSB7Ci0JCUNvbGxlY3Rpb24gY29sID0gc3VwZXIuYWRkSW5oZXJpdGVkKG9iamVjdCwgbXlDaGlsZHJlbik7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29sOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQlzdXBlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMTc1MWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJDYXBhYmlsaXR5IFBhdHRlcm5zIiBhbmQgIkRlbGl2ZXJ5Ci0gKiBQcm9jZXNzZXMiIGZvbGRlcnMgaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLAotCQlJQ29uZmlndXJhYmxlIHsKLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCS8vIHByaXZhdGUgU3RyaW5nW10gcGtnUGF0aDsKLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBPYmplY3QgaW1hZ2U7Ci0KLQkvLyBwcml2YXRlIE1ldGhvZFBsdWdpbiBwbHVnaW47Ci0JcHJpdmF0ZSBNZXRob2RQYWNrYWdlIHBrZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kUGFja2FnZSBwa2csIFN0cmluZyBuYW1lLCBPYmplY3QgaW1hZ2UpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQlsYWJlbCA9IG5hbWU7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQkJdGhpcy5wa2cgPSBwa2c7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCU9iamVjdCBjaGlsZCA9IGVsZW1lbnQ7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQljaGlsZCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgZWxlbWVudCkuZ2V0UHJvY2VzcygpOwotCQkJfQotCQkJaWYgKGZpbHRlci5hY2NlcHQoY2hpbGQpKSB7Ci0JCQkJaWYgKCFpc0VtcHR5UGFja2FnZShjaGlsZCkpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBjaGlsZFBhY2thZ2VzKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9ICgoUHJvY2Vzc1BhY2thZ2UpIG9iamVjdCkuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCW5ld0xpc3QuYWRkQWxsKGNoaWxkcmVuKTsKLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXdMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWlmICghZmlsdGVyLmFjY2VwdChpdGVyLm5leHQoKSkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eVBhY2thZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCB8fCBvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzKQotCQkJcmV0dXJuIGZhbHNlOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gdGhpcy5jaGlsZFBhY2thZ2VzKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJaWYgKCFpc0VtcHR5UGFja2FnZShpdGVyLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE5ld0NoaWxkRGVzY3JpcHRvcnModGFyZ2V0LCBlZGl0aW5nRG9tYWluLCBzaWJsaW5nKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGxhYmVsICE9IG51bGwpCi0JCQlyZXR1cm4gbGFiZWw7Ci0JCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJlZGNkMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5UcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSBjb250ZW50IGNhdGVnb3J5IGZvbGRlcnMgaW4gdGhlIG1ldGhvZAotICogZWxlbWVudCBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUNvbmZpZ3VyYWJsZSB7Ci0KLQlJRmlsdGVyIGZpbHRlcjsKLQotCU9iamVjdCBpbWFnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlOb3RpZmllciBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCS8vIHJldHVybiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSB8fCAob2JqIGluc3RhbmNlb2YKLQkJLy8gRGlzY2lwbGluZSAmJgotCQkvLyBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lR3JvdXBzKChEaXNjaXBsaW5lKW9iaikuaXNFbXB0eSgpKTsKLQkJaWYgKCF0aGlzLmZpbHRlci5hY2NlcHQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUKLQkJCQkmJiAhQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZUdyb3VwcygoRGlzY2lwbGluZSkgb2JqKQotCQkJCQkJLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQKLQkJCQkmJiAhQXNzb2NpYXRpb25IZWxwZXIuZ2V0Um9sZVNldEdyb3VwcygoUm9sZVNldCkgb2JqKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYWNjZXB0KG9iaik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGNvbnRlbnRBZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoY29udGVudEFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGNvbnRlbnRBZGFwdGVyKS5zZXRQYXJlbnQob2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQl0aGlzLmltYWdlID0gb2JqZWN0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ODllNGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LlRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBjb250ZW50IGNhdGVnb3J5IGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElDb25maWd1cmFibGUgewotCi0JSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlOb3RpZmllciBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZXMoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gZmlsdGVyLmFjY2VwdChvYmopOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgY29udGVudEFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KG9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChjb250ZW50QWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgY29udGVudEFkYXB0ZXIpLnNldFBhcmVudChvYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50RWxlbWVudHNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM3ZTA5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBmb2xkZXJzIGluIHRoZSBtZXRob2QKLSAqIGVsZW1lbnQgc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudEVsZW1lbnRzSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJQ29uZmlndXJhYmxlIHsKLQotCUlGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIENvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU5vdGlmaWVyIHBhcmVudCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBDb250ZW50RWxlbWVudHNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlOb3RpZmllciBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW5Db2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gY2hpbGRyZW5Db2wuaXRlcmF0b3IoKTsgaXRlcjEuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlcjEubmV4dCgpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSUNvbmZpZ3VyYWJsZSkKLQkJCQkoKElDb25maWd1cmFibGUpIGNoaWxkKS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpCi0JCQkJaXRlcjEucmVtb3ZlKCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuQ29sOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoIXN1cGVyLmFjY2VwdEFzQ2hpbGQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMTdlNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBjb250ZW50IHBhY2thZ2UgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyYWJsZSB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IGdldENoaWxkcmVuSW5jbHVkaW5nRW1wdHlPbmVzKG9iamVjdCk7Ci0KLQkJLy8gcmVtb3ZlIHRoZSBlbXB0eSBwYWNrYWdlcyBmcm9tIHRoZSBjaGlsZHJlbiBsaXN0Ci0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJaWYgKGlzRW1wdHlQYWNrYWdlKGl0ZXIubmV4dCgpKSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldENoaWxkcmVuSW5jbHVkaW5nRW1wdHlPbmVzKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGl0ZXIubmV4dCgpKSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0VtcHR5UGFja2FnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW5JbmNsdWRpbmdFbXB0eU9uZXMob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoIWlzRW1wdHlQYWNrYWdlKGl0ZXIubmV4dCgpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2M5MjZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGN1c3RvbSBjYXRlZ29yeSBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlIHsKLQotCUlGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyBTZXQgdGhlIGNoaWxkcmVuU3RvcmVNYXAgdG8gbnVsbCwgdG8gZ2V0IHRoZSB1cGRhdGVkIGN1c3RvbWNhdGVnb3JpZXMKLQkJY2hpbGRyZW5TdG9yZU1hcCA9IG51bGw7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlpZiAodGhpcy5maWx0ZXIgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlciBvYmogPSAoRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikgaXRlcgotCQkJCQkJLm5leHQoKTsKLQkJCQlpZiAoIXRoaXMuZmlsdGVyLmFjY2VwdChvYmouZ2V0VmFsdWUoKSkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0Rpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZmNTgzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0Rpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZGlzY2lwbGluZSBncm91cGluZyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyYWJsZSwgSUxpYnJhcnlJdGVtUHJvdmlkZXIsIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZXMoKSk7Ci0JCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbjsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChvYmplY3QpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCi0JCQkvLyBUT0RPOiBjb21tZW50ZWQgb3V0IHVudGlsIEppbmh1YSBmaXhlZCBidWdzIGluCi0JCQkvLyBDb25maWd1cmF0aW9uRmlsdGVyCi0JCQlpZiAoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCQljaGlsZHJlbiA9IGNvbmZpZ3VyYXRvci5nZXRDaGlsZHJlbihvYmplY3QsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCkpOwotCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKCk6IHJldHVybmVkIGZyb20gY29uZmlndXJhdG9yOiAiICsgY2hpbGRyZW4pOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBjaGlsZHJlbjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCURpc2NpcGxpbmVHcm91cGluZyBncm91cGluZyA9IChEaXNjaXBsaW5lR3JvdXBpbmcpIG9iamVjdDsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZiA9IChNZXRob2RDb25maWd1cmF0aW9uKSAoKENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIGdldFBhcmVudChvYmplY3QpKQotCQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCQlUbmdVdGlsLmFkZEV4dGVuZGVkQ2hpbGRyZW4oZ3JvdXBpbmcsIG1ldGhvZENvbmYsIGNoaWxkcmVuLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0KLQkJCS8vIHNldCBwYXJlbnQKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGl0ZXIubmV4dCgpLAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudCh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfSBlbHNlIHsKLQkJCUNvbGxlY3Rpb24gY2hpbGRyZW5Db2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW5Db2wuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGZpbHRlciAhPSBudWxsKQotCQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGQpKQotCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJCXJldHVybiBjaGlsZHJlbkNvbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5sbGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5sbGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQkJLy8gaWYob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkvLyBNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIG9iamVjdCk7Ci0JCS8vIGlmKHBsdWdpbiAhPSBudWxsKSB7Ci0JCS8vIFN0cmluZ1tdIHBhdGggPSB7Ci0JCS8vIFRuZ0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJLy8gLFRuZ0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpCi0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJLy8gLFRuZ0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKQotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vIH07Ci0JCS8vIE9iamVjdCBhZGFwdGVyID0KLQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0SXRlbXNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKS5hZGFwdChwbHVnaW4sCi0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCS8vIC8vIElHcm91cENvbnRhaW5lciBncm91cHMgPSAoSUdyb3VwQ29udGFpbmVyKQotCQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpLmFkYXB0KHBsdWdpbiwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gLy8gaW50IGk7Ci0JCS8vIC8vIGZvcihpID0gMDsgaSA8IHBhdGgubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCS8vIC8vIGdyb3VwcyA9IChJR3JvdXBDb250YWluZXIpIGdyb3Vwcy5nZXRHcm91cEl0ZW1Qcm92aWRlcihwYXRoW2ldKTsKLQkJLy8gLy8gaWYoZ3JvdXBzID09IG51bGwpIHJldHVybiBudWxsOwotCQkvLyAvLyB9Ci0JCS8vIC8vIHJldHVybiAoSXRlbVByb3ZpZGVyQWRhcHRlcikgZ3JvdXBzLmdldEdyb3VwSXRlbVByb3ZpZGVyKHBhdGhbaV0pOwotCQkvLyByZXR1cm4gVG5nVXRpbC5nZXRBZGFwdGVyKHBsdWdpbiwgcGF0aCk7Ci0JCS8vIC8vcmV0dXJuIGFkYXB0ZXI7Ci0JCS8vIH0KLQkJLy8gfQotCi0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9EaXNjaXBsaW5lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YjI5ZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9EaXNjaXBsaW5lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZGlzY2lwbGluZSBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uRGlzY2lwbGluZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQlPYmplY3QgcGFyZW50OwotCi0JcHVibGljIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY29sOwotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG9iamVjdCk7Ci0JCQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCQkJY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCQotCQl9IGVsc2UgewotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIChUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRSkKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KG9iamVjdCwKLQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJY29sID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJRmlsdGVyVXRpbC5pdGVyYXRlQ29sbGVjdGlvbihjb2wsIGZpbHRlcik7Ci0JCX0KLQotCQlyZXR1cm4gY29sOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCURpc2NpcGxpbmUgZGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKSBvYmplY3Q7Ci0JCWlmIChkaXNjaXBsaW5lLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCQlNZXRob2RQbHVnaW4gbW9kZWwgPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihkaXNjaXBsaW5lKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQlzdXBlci5zZXRQYXJlbnQocGFyZW50KTsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Eb21haW5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiZjhkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZG9tYWluIGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkRvbWFpbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlDb25maWd1cmFibGUgewotCU9iamVjdCBwYXJlbnQ7Ci0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBEb21haW5JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJRG9tYWluIGRvbWFpbiA9IChEb21haW4pIG9iamVjdDsKLQkJaWYgKGRvbWFpbi5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCQlNZXRob2RQbHVnaW4gbW9kZWwgPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihkb21haW4pOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXN1cGVyLnNldFBhcmVudChwYXJlbnQpOwotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY29sOwotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG9iamVjdCk7Ci0JCQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCQkJY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCQotCQl9IGVsc2UgewotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIChUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRSkKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KG9iamVjdCwKLQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJY29sID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0JCS8vIElmIGZpbHRlciBub3QgbnVsbCBpdGVyYXRlIGNvbGxlY3Rpb24uCi0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJRmlsdGVyVXRpbC5pdGVyYXRlQ29sbGVjdGlvbihjb2wsIGZpbHRlcik7Ci0JCX0KLQotCQlyZXR1cm4gY29sOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVyQ29uc3RhbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0ZpbHRlckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTliMWYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVyQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgZ2xvYmFsIGNvbnN0YW50cyB1c2VkIGluIHRoZSBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJDb25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NBVEVHT1JJRVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfY3VzdG9tY2F0ZWdvcmllc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPX1BMVUdJTlMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfbWV0aG9kcGx1Z2luc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfUEFDS0FHRVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfY29udGVudHBhY2thZ2VzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRVNFVFMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfcm9sZXNldHNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDSVBMSU5FUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19kaXNjaXBsaW5lc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktQUk9EVUNUVFlQRVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3R0eXBlc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPTUFJTlMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfZG9tYWluc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3Rvb2xzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMX0VMRU1FTlRTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2FsbF90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3JvbGVzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS1MgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfdGFza3NfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLUFJPRFVDVFMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJREFOQ0UgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfZ3VpZGFuY2VfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTRVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfcHJvY2Vzc2VzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZJVElFUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19hY3Rpdml0aWVzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcnNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX0RFU0NSSVBUT1JTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3JvbGVkZXNjcmlwdG9yc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfREVTQ1JJUFRPUlMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfdGFza2Rlc2NyaXB0b3JzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05MWV9DT05URU5UX0VMRU1FTlRTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRlbGVtZW50c190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19DT05URU5UX0VMRU1FTlQgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfYWxsY29udGVudGVsZW1lbnRzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9BRE1BUCA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19yb2FkbWFwX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tMSVNUUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19jaGVja2xpc3RzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OQ0VQVFMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfY29uY2VwdHNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkFDVElDRVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfcHJhY3RpY2VzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1JUUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19yZXBvcnRzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVVU0FCTEVfQVNTRVRTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3JldXNhYmxlYXNzZXRzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0hJVEVfUEFQRVJTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3doaXRlcGFwZXJzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3RlbXBsYXRlc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURFTElORVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfZ3VpZGVsaW5lc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUFBPUlRJTkdfTUFURVJJQUxTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3N1cHBvcnRpbmdtYXRlcmlhbHNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX01FTlRPUlMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfdG9vbG1lbnRvcnNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWEFNUExFUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19leGFtcGxlc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfU0VUX0dST1VQSU5HUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19yb2xlc2V0Z3JvcHVpbmdzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ0lQTElORV9HUk9VUElOR1MgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZWdyb3VwaW5nc190ZXh0OyAKLQotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nCi0KLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBHVUlEQU5DRV9UWVBFUyA9IG5ldyBTdHJpbmdbXXsKLQkvLyBDSEVDS0xJU1RTLCBDT05DRVBUUywgRVhBTVBMRVMsIFBSQUNUSUNFUywgUkVQT1JUUywgUkVVU0FCTEVfQVNTRVRTLAotCS8vIFNVUFBPUlRJTkdfTUFURVJJQUxTLCBURU1QTEFURVMsIFRPT0xfTUVOVE9SUywgV0hJVEVfUEFQRVJTLAotCS8vIEdVSURFTElORVMsUk9BRE1BUH07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTlRFTlRfRUxFTUVOVFMgPSBuZXcgU3RyaW5nW10geyBST0xFUywKLQkJCVRBU0tTLCBXT1JLUFJPRFVDVFMsIEdVSURBTkNFLCBTVVBQT1JUSU5HX01BVEVSSUFMUywKLQkJCU9OTFlfQ09OVEVOVF9FTEVNRU5UUywgVE9PTF9NRU5UT1JTIH07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTlRFTlRfQ0FURUdPUklFUyA9IG5ldyBTdHJpbmdbXSB7IFJPTEVTRVRTLAotCQkJV09SS1BST0RVQ1RUWVBFUywgRElTQ0lQTElORVMsIFRPT0xTLCBET01BSU5TIH07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEJSRUFLRE9XTl9FTEVNRU5UUyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQlXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUlMsIFRBU0tfREVTQ1JJUFRPUlMsIFJPTEVfREVTQ1JJUFRPUlMgfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBjb250ZW50RWxlbWVudFN0cnMgPSBBcnJheXMKLQkJCS5hc0xpc3QoQ09OVEVOVF9FTEVNRU5UUyk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgY2F0ZWdvcnlTdHJzID0gQXJyYXlzLmFzTGlzdChDT05URU5UX0NBVEVHT1JJRVMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gQXJyYXlzCi0JCQkuYXNMaXN0KEJSRUFLRE9XTl9FTEVNRU5UUyk7Ci0KLQlwdWJsaWMgc3RhdGljIEhhc2hNYXAgaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3BhY2UgPSAiLSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVTVElNQVRFX0NPTlNJREVSQVRJT05TID0gTGlicmFyeUVkaXRQbHVnaW4KLQkJCS5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1fREVGSU5JVElPTlMgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKQotCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19UZXJtRGVmaW5pdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOWV9TVFJJTkcgPSAiKiI7ICAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOWV9DSEFSQUNURVIgPSAiPyI7ICAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0ZpbHRlckhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9GaWx0ZXJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI5YWM5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0ZpbHRlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3IgbWFuYWdpbmcgZWxlbWVudCBmaWx0ZXJpbmcgaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbgotICogZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJIZWxwZXIgewotCi0JcHJpdmF0ZSBTdHJpbmcgcGF0dGVybjsKLQotCXByaXZhdGUgU3RyaW5nIHR5cGU7Ci0KLQlwcml2YXRlIFBhdHRlcm4gcmVnZXg7Ci0KLQlwcml2YXRlIFN0cmluZyB0YWJTdHI7Ci0KLQlwcml2YXRlIE9iamVjdCBjb250ZW50RWxlbWVudDsKLQotCXByaXZhdGUgTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBib29sZWFuIHNob3dQcmVzZW50YXRpb25OYW1lID0gZmFsc2U7Ci0JCi0JLy8gVGhpcyBpcyBzZXBhcmF0ZSBoYW5kbGluZyBmb3IgQ29udGVudENvbnRlZ29yeSAKLQlwcml2YXRlIFN0cmluZyBjb250ZW50Q2F0ZWdvcnlUYWJTdHI7Ci0KLQlwdWJsaWMgRmlsdGVySGVscGVyKE9iamVjdCBjb250ZW50RWxlbWVudCwgU3RyaW5nIHRhYlN0ciwgU3RyaW5nIHBhdHRlcm4sCi0KLQlTdHJpbmcgZmlsdGVyVHlwZVN0ciwgTGlzdCBhbHJlYWR5U2VsZWN0ZWRMaXN0KSB7Ci0KLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCi0JCXRoaXMudGFiU3RyID0gdGFiU3RyOwotCi0JCXRoaXMudHlwZSA9IGZpbHRlclR5cGVTdHI7Ci0KLQkJdGhpcy5leGlzdGluZ0VsZW1lbnRzID0gYWxyZWFkeVNlbGVjdGVkTGlzdDsKLQotCQl0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOwotCi0JCXNob3dQcmVzZW50YXRpb25OYW1lID0gUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRQotCQkuaXNTaG93UHJlc2VudGF0aW9uTmFtZXMoKTsKLQotCi0JfQotCS8qCi0JICogbWV0aG9kIHRvIHNldCBjb250ZW50Q2F0ZWdvcnlUYWJTdHIsIHRoaXMgCi0JICogc3BlY2lhbCBoYW5kbGUgZm9yIGNvbnRlbnQgY2F0ZWdvcnksIHRhYlN0ciBpbXBsZW1lbnRhdGlvbiAKLQkgKiBkb25vdCB3b3JrIGZvciB0aGlzLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50Q2F0ZWdvcnlUYWJTdHIoU3RyaW5nIGNvbnRlbnRDYXRlZ29yeVRhYlN0cil7Ci0JCXRoaXMuY29udGVudENhdGVnb3J5VGFiU3RyID0gY29udGVudENhdGVnb3J5VGFiU3RyOwotCX0KLQkvKgotCSAqIG1ldGhvZCB0byBzZXQgY29udGVudENhdGVnb3J5VGFiU3RyLCB0aGlzIAotCSAqIHNwZWNpYWwgaGFuZGxlIGZvciBjb250ZW50IGNhdGVnb3J5LCB0YWJTdHIgaW1wbGVtZW50YXRpb24gCi0JICogZG9ub3Qgd29yayBmb3IgdGhpcy4gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50Q2F0ZWdvcnlUYWJTdHIoKXsKLQkJcmV0dXJuIHRoaXMuY29udGVudENhdGVnb3J5VGFiU3RyOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEFscmVhZHlTZWxlY3RlZExpc3QoKSB7Ci0KLQkJcmV0dXJuIGV4aXN0aW5nRWxlbWVudHM7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KExpc3QgYWxyZWFkeVNlbGVjdGVkTGlzdCkgewotCi0JCXRoaXMuZXhpc3RpbmdFbGVtZW50cyA9IGFscmVhZHlTZWxlY3RlZExpc3Q7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaFBhdHRlcm4oT2JqZWN0IG9iaikgewotCQlyZXR1cm4gbWF0Y2gob2JqKTsKLQl9Ci0KLQkvKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIHRvIGNoZWNrIGFueSBDYXRlZ29yaXplZEVsZW1lbnRzICh0cmVlIHRyYXZlcnNhbCkgb2YKLQkgKiBDdXN0b21DYXRlZ29yeSBoYXMgYW55IG1hdGNoIHdpdGggbWF0Y2hlci4gQHBhcmFtIEN1c3RvbUNhdGVnb3J5Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc01hdGNoZWRDaGlsZEN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5IHRvcENhdGVnb3J5KSB7Ci0JCUxpc3QgbGlzdCA9IHRvcENhdGVnb3J5LmdldENhdGVnb3JpemVkRWxlbWVudHMoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdDsKLQkJCQlpZiAobWF0Y2hlcihjYXRlZ29yeSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIGlmIChoYXNNYXRjaGVkQ2hpbGRDdXN0b21DYXRlZ29yeShjYXRlZ29yeSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIHRvIGNoZWNrIGFueSBzdWJBcnRpZmFjdHMgKHRyZWUgdHJhdmVyc2FsKSBvZiBBcnRpZmFjdAotCSAqIGhhcyBhbnkgbWF0Y2ggd2l0aCBtYXRjaGVyLiBAcGFyYW0gQ3VzdG9tQ2F0ZWdvcnkKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzTWF0Y2hlZEFydGlmYWN0KEFydGlmYWN0IGFydGlmYWN0KSB7Ci0KLQkJTGlzdCBsaXN0ID0gYXJ0aWZhY3QuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQlBcnRpZmFjdCBzdWJhcnRpZmFjdCA9IChBcnRpZmFjdCkgb2JqZWN0OwotCQkJCWlmIChtYXRjaGVyKHN1YmFydGlmYWN0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKGhhc01hdGNoZWRBcnRpZmFjdChzdWJhcnRpZmFjdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoKLQkgKiBDb252ZW5pZW50IG1ldGhvZCB0byBjaGVjayBhbnkgc3ViQXJ0aWZhY3RzICh0cmVlIHRyYXZlcnNhbCkgb2YgQXJ0aWZhY3QKLQkgKiBoYXMgYW55IG1hdGNoIHdpdGggIGFscmVhZHlleGlzdGluZyBlbGVtZW50cy4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzTWF0Y2hlZEFydGlmYWN0KEFydGlmYWN0IGFydGlmYWN0LCBMaXN0IGV4aXN0aW5nTGlzdCkgewotCi0JCUxpc3QgbGlzdCA9IGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJQXJ0aWZhY3Qgc3ViYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIG9iamVjdDsKLQkJCQlpZighZXhpc3RpbmdMaXN0LmNvbnRhaW5zKHN1YmFydGlmYWN0KSl7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2QgdG8gY2hlY2sgYW55IENoaWxkUGFja2FnZXMgKHRyZWUgdHJhdmVyc2FsKSBvZiBDb250ZW50Ci0JICogUGFja2FnZSBoYXMgYW55IG1hdGNoIHdpdGggbWF0Y2hlci4KLQkgKiAKLQkgKiBAcGFyYW0gQ3VzdG9tQ2F0ZWdvcnkKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzTWF0Y2hlZENoaWxkKENvbnRlbnRQYWNrYWdlIHBrZykgewotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGRQa2cgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZFBrZyBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJQ29udGVudFBhY2thZ2UgY29udGVudFBrZyA9IChDb250ZW50UGFja2FnZSkgY2hpbGRQa2c7Ci0JCQkJaWYgKG1hdGNoZXIoY29udGVudFBrZykpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIGlmIChoYXNNYXRjaGVkQ2hpbGQoY29udGVudFBrZykpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIHRvIGNoZWNrIGFueSBzdWJEb21haW4gKHRyZWUgdHJhdmVyc2FsKSBvZiBEb21haW4gaGFzCi0JICogYW55IG1hdGNoIHdpdGggbWF0Y2hlciA8bGluaz5tYXRjaGVyKE9iamVjdCBvYmopPC9saW5rPgotCSAqIAotCSAqIEBwYXJhbSBDdXN0b21DYXRlZ29yeQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNNYXRjaGVkU3ViRG9tYWlucyhEb21haW4gZG9tYWluKSB7Ci0JCUxpc3QgbGlzdCA9IGRvbWFpbi5nZXRTdWJkb21haW5zKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBzdWJkb21haW4gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobWF0Y2hlcihzdWJkb21haW4pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKGhhc01hdGNoZWRTdWJEb21haW5zKChEb21haW4pIHN1YmRvbWFpbikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNNYXRjaGVkU3ViRGlzY2lwbGluZShEaXNjaXBsaW5lIGRpc2NpcGxpbmUpewotCQlMaXN0IGxpc3QgPSBkaXNjaXBsaW5lLmdldFN1YmRpc2NpcGxpbmUoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHN1YmRpc2NpcGxpbmUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobWF0Y2hlcihzdWJkaXNjaXBsaW5lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmIChoYXNNYXRjaGVkU3ViRGlzY2lwbGluZSgoRGlzY2lwbGluZSkgc3ViZGlzY2lwbGluZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNNYXRjaGVkRGlzY2lwbGluZXMoRGlzY2lwbGluZUdyb3VwaW5nIGdyb3VwaW5nKXsKLQkJTGlzdCBsaXN0ID0gZ3JvdXBpbmcuZ2V0RGlzY2lwbGluZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHN1YmRpc2NpcGxpbmUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobWF0Y2hlcihzdWJkaXNjaXBsaW5lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmIChoYXNNYXRjaGVkU3ViRGlzY2lwbGluZSgoRGlzY2lwbGluZSkgc3ViZGlzY2lwbGluZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIHRvIGNoZWNrIGFueSBhY3Rpdml0eSAodHJlZSB0cmF2ZXJzYWwpIG9mIGFjdGl2aXR5IGhhcwotCSAqIGFueSBtYXRjaCB3aXRoIG1hdGNoZXIgPGxpbms+bWF0Y2hlcihPYmplY3Qgb2JqKTwvbGluaz4KLQkgKiAKLQkgKiBAcGFyYW0gQ3VzdG9tQ2F0ZWdvcnkKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzTWF0Y2hlZEFjdGl2aXRpZXMoQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJTGlzdCBsaXN0ID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJaWYgKG1hdGNoZXIoZWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIGlmIChoYXNNYXRjaGVkQWN0aXZpdGllcygoQWN0aXZpdHkpIGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2QgdG8gY2hlY2sgYW55IGFjdGl2aXR5ICh0cmVlIHRyYXZlcnNhbCkgb2YgUHJvY2Vzc1BhY2thZ2UgaGFzCi0JICogYW55IG1hdGNoIHdpdGggbWF0Y2hlciA8bGluaz5tYXRjaGVyKE9iamVjdCBvYmopPC9saW5rPgotCSAqIAotCSAqIEBwYXJhbSBDdXN0b21DYXRlZ29yeQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNNYXRjaGVkQWN0aXZpdGllcyhQcm9jZXNzUGFja2FnZSBwcm9jUGFja2FnZSkgewotCQlMaXN0IGxpc3QgPSBwcm9jUGFja2FnZS5nZXRQcm9jZXNzRWxlbWVudHMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJaWYgKG1hdGNoZXIoZWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIGlmIChoYXNNYXRjaGVkQWN0aXZpdGllcygoQWN0aXZpdHkpIGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBjaGVjayBjaGlsZCBwYWNrYWdlcwotCQlsaXN0ID0gcHJvY1BhY2thZ2UuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlpZiAoaGFzTWF0Y2hlZEFjdGl2aXRpZXMoKFByb2Nlc3NQYWNrYWdlKSBlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRGaWx0ZXJUeXBlU3RyKCkgewotCi0JCS8vIFRyaW0gIi0iKGh5cGhlbikgZnJvbSB0aGUgc3RyaW5ncyAodHlwZXMpLiAgT25seSBpbiBjYXNlIG1ldGhvZHBsdWdpbgotCQkvLyBkb24ndCB0cmltICItIiBiZWNhdXNlIG1ldGhvZHBsdWctaW4gY29udGFpbiAiLSIgKGh5cGhlbilhbmQgdXNlZnVsLgotCQl3aGlsZSAodHlwZSAhPSBudWxsICYmIHR5cGUuaW5kZXhPZihGaWx0ZXJDb25zdGFudHMuc3BhY2UpID4gLTEKLQkJCQkmJiAhdHlwZS5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLk1FVEhPX1BMVUdJTlMpKSB7Ci0JCQl0eXBlID0gdHlwZS5zdWJzdHJpbmcodHlwZS5pbmRleE9mKEZpbHRlckNvbnN0YW50cy5zcGFjZSkgKyAxLCB0eXBlCi0JCQkJCS5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuKCkgewotCi0JCXJldHVybiBwYXR0ZXJuOwotCi0JfQotCi0JcHVibGljIFBhdHRlcm4gZ2V0UmVnZXhQYXR0ZXJuKCkgewotCi0JCXJldHVybiByZWdleDsKLQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFiU3RyKCkgewotCi0JCXJldHVybiB0YWJTdHI7Ci0KLQl9Ci0KLQkvKgotCSAqIAotCSAqIE1ldGhvZCBjaGVja3Mgd2hldGhlciBhcmJpdHJhcnkgb2JqZWN0IHBhc3NlZCBpcwotCSAqIAotCSAqIGVxdWFsIHRvIGN1cnJlbnQgY29udGVudCBlbGVtZW50J3MgdmFyaWFiaWxpdHkgb3Igbm90LgotCSAqIAotCSAqIElmIHZhcmlhYmlsaXR5IG9mIENvbnRlbnRFbGVtZW50IG1hdGNoZXMgYXJiaXRyYXJ5IG9iamVjdCwKLQkgKiAKLQkgKiByZXR1cm5zIHRydWUuCi0JICogCi0JICogQHJldHVuIGJvb2xlYW4uCi0JICogCi0JICovCi0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja1ZhcmlhYmlsaXR5KE9iamVjdCBvYmopIHsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQotCQkJT2JqZWN0IHZhcmlhYmlsaXR5T2JqZWN0ID0gKChDb250ZW50RWxlbWVudCkgY29udGVudEVsZW1lbnQpCi0JCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAodmFyaWFiaWxpdHlPYmplY3QgIT0gbnVsbCkgewotCQkJCWlmIChvYmouZXF1YWxzKHZhcmlhYmlsaXR5T2JqZWN0KSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0KLQkJcmV0dXJuIGNvbnRlbnRFbGVtZW50OwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udGVudEVsZW1lbnQoT2JqZWN0IGNvbnRlbnRFbGVtZW50KSB7Ci0KLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyVHlwZVN0cihTdHJpbmcgZmlsdGVyVHlwZVN0cikgewotCi0JCXRoaXMudHlwZSA9IGZpbHRlclR5cGVTdHI7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKSB7Ci0KLQkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZ2V4UGF0dGVybihQYXR0ZXJuIHJlZ2V4UGF0dGVybikgewotCi0JCXRoaXMucmVnZXggPSByZWdleFBhdHRlcm47Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYWJTdHIoU3RyaW5nIHRhYlN0cikgewotCi0JCXRoaXMudGFiU3RyID0gdGFiU3RyOwotCi0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFBhdGhCYXNlZE9uVGFiU3RyaW5nKFN0cmluZyB0YWJTdHIpIHsKLQotCQlpZiAoRmlsdGVyQ29uc3RhbnRzLmNvbnRlbnRFbGVtZW50U3Rycy5jb250YWlucyh0YWJTdHIpKSB7Ci0JCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGg7Ci0JCX0gZWxzZSBpZiAodGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFMpCi0JCQkJfHwgdGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUk9MRV9TRVRfR1JPVVBJTkdTKSkgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGg7Ci0JCX0gZWxzZSBpZiAodGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVMpCi0JCQkJfHwgdGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORV9HUk9VUElOR1MpKSB7Ci0JCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGg7Ci0JCX0gZWxzZSBpZiAodGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuVE9PTFMpKSB7Ci0JCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aDsKLQkJfSBlbHNlIGlmICh0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFRZUEVTKSkgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aDsKLQkJfSBlbHNlIGlmICh0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ET01BSU5TKSkgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aDsKLQkJfSBlbHNlIGlmICh0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUykpIHsKLQkJCXJldHVybiBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aDsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGg7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBUaGlzIGlzIGNvbnZlbmllbnQgbWV0aG9kIHRvIGNoZWNrIGFsbCB0aGUgY29uZGl0aW9uLCBsaWtlIG1hdGNoUGF0dGVybiwKLQkgKiBpZiBvYmplY3QgZXhpc3RzIGluIGFscmVhZHkgc2VsZWN0ZWQgbGlzdCwgY2hlY2sgdmFyaWFiaWxpdHkgbWF0Y2gsIGFuZAotCSAqIGlzIG9iamVjdCBpdHNlbGYgZG9ub3QgZGlzcGxheS4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja09iamVjdEFjY2VwdGVkKE9iamVjdCBvYmopIHsKLQotCQlpZiAoIW1hdGNoKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIENoZWNrIGlmIGFscmVhZHkgZXhpc3RpbmcgKGFzc29jaWF0ZWQgZWxlbWVudHMpIGRvbid0IGRpc3BsYXkuCi0JCWlmIChnZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkgIT0gbnVsbAotCQkJCSYmIGdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucyhvYmopKXsKLQkJCS8vIHNwZWNpYWwgY2FzZSBoYW5kbGluZyBmb3IgQXJ0aWZhY3QgYW5kIHN1Yi1hcnRpZmFjdC4KLQkJCWlmKG9iaiBpbnN0YW5jZW9mIEFydGlmYWN0KXsKLQkJCQlpZighaGFzTWF0Y2hlZEFydGlmYWN0KChBcnRpZmFjdClvYmosZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfWVsc2V7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJaWYgKGNoZWNrVmFyaWFiaWxpdHkob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyBpZiBvYmplY3QgaXRzZWxmIGRvbid0IGRpc3BsYXkKLQkJLy8gRG8gZXF1YWwgY2hlY2sgb25seSBvbiBlbGVtZW50cyBvdGhlcnRoYW4gbWV0aG9kIHBsdWdpbiwgSW4gY2FzZSBvZgotCQkvLyBDb3B5cmlnaHQoc3VwcG9ydGluZyBtYXRlcmlhbCkgYXNzb2NpYXRpbmcgdG8gbWV0aG9kcGx1Z2luLCBpZgotCQkvLyBtZXRob2RwbHVnaW4gKGNvbnRlbnRFbGVtdG4pIGVxdWFscwotCQkvLyBvYmosIHRoZW4gcmVzdWx0cyBmYWxzZS5QbHVnaW4gd2lsbCBsb3N0IGZyb20gdHJlZSBpbiB0aGUgZmlsdGVyLiBJbgotCQkvLyB0dXJuIHN1cHBvcnRpbmcgbWF0ZXJpYWwgZm9yIHRoYXQgcGFydGljdWxhciBwbHVnaW4gd2lsbCBub3QgYmUKLQkJLy8gZGlzcGxheWVkLgotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCAmJiBvYmouZXF1YWxzKGNvbnRlbnRFbGVtZW50KSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBDb252ZW5pZW50IG1ldGhvZCBmb3IgY2hlY2tpbmcgTWV0aG9kUGx1Z2luIGFjY2VwdGVkIG9yIG5vdC4gTWV0aG9kIG5lZWRzCi0JICogdG8gaW52b2tlZCBvbmx5IGZvciBNZXRob2RQbHVnaW4gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdE1ldGhvZFBsdWdpbihPYmplY3Qgb2JqKSB7Ci0JCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAoTWV0aG9kRWxlbWVudFV0aWwuZ2V0QWxsTW9kZWxzKGNvbnRlbnRFbGVtZW50KS5jb250YWlucyhvYmopKQotCQkJCXJldHVybiB0cnVlOwotCQkJZWxzZQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2QgZm9yIGNoZWNraW5nIENvbnRlbnQgUGFja2FnZSBhY2NlcHRlZCBvciBub3QuIE1ldGhvZAotCSAqIG5lZWRzIHRvIGludm9rZWQgb25seSBmb3IgQ29udGVudCBQYWNrYWdlIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0Q29udGVudFBhY2thZ2UoT2JqZWN0IG9iaikgewotCi0JCWlmICgoKENvbnRlbnRQYWNrYWdlKSBvYmopLmdldENoaWxkUGFja2FnZXMoKS5pc0VtcHR5KCkKLQkJCQkmJiAoKENvbnRlbnRQYWNrYWdlKSBvYmopLmdldENvbnRlbnRFbGVtZW50cygpLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZWxzZQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPYmplY3RJblNlbGVjdGVkSXRlbXMoT2JqZWN0IG9iaikgewotCi0JCWlmIChnZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkgIT0gbnVsbAotCQkJCSYmIGdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucyhvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbHNlCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRyaWJ1dG9yKENvbnRlbnRFbGVtZW50IGVsZW1lbnQpIHsKLQkJLy8gSnVzdCByZXR1cm5pbmcgdHJ1ZSwgYmVjYXVzZSBjb250cmlidXRpb24gY2hlY2tlZCBpbiBvdGhlciBwbGFjZS4KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hdGNoUGF0dGVybkJhc2VkT25UeXBlKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG1hdGNoKG9iaik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hQYXR0ZXJuT25QcmVzZW50YXRpb25OYW1lKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG1hdGNoKG9iaik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTaG93UHJlc2VudGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHNob3dQcmVzZW50YXRpb25OYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNob3dQcmVzZW50YXRpb25OYW1lKGJvb2xlYW4gc2hvd1ByZXNlbnRhdGlvbk5hbWUpIHsKLQkJdGhpcy5zaG93UHJlc2VudGF0aW9uTmFtZSA9IHNob3dQcmVzZW50YXRpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEdlbmVyaWMgbWV0aG9kIHRvIGNoZWNrIG1hdGNoIG9mIGFuIG9iamVjdCBiYXNlZCBvbiByZWd1bGFyIGV4cHJlc3Npb24KLQkgKiBhbHNvIGJhc2VkIG9uIHR5cGUgdGhhdCBzZWxlY3RlZCBpbiB0aGUgZGlhbG9nLgotCSAqLwotCi0JcHJpdmF0ZSBib29sZWFuIG1hdGNoKE9iamVjdCBvYmopIHsKLQotCQkvLyBEbyBub3QgZG8gUGF0dGVybiBtYXRjaCBpZiB0eXBlIG9yIHBhdHRlcm4gc3RyaW5nIGlzIG51bGwuCi0JCWlmICh0eXBlID09IG51bGwgfHwgcGF0dGVybiA9PSBudWxsIHx8IHBhdHRlcm4uZXF1YWxzSWdub3JlQ2FzZSgiIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOwotCi0JCS8vIENoZWNrIGlmIHR5cGUgaXMgb2YgQ29udGVudCBQYWNrYWdlCi0JCWlmICh0eXBlLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQ09OVEVOVF9QQUNLQUdFUykpIHsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0KLQkJCQlpZiAobWF0Y2hlcihvYmopIHx8IGhhc01hdGNoZWRDaGlsZCgoQ29udGVudFBhY2thZ2UpIG9iaikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQotCQkJCS8vIGVsc2UgZm9yIGFsbCBjb250ZW50IGVsZW1lbnRzLCBpZiB0aGVpciBjb250ZW50IHBha2NhZ2UKLQkJCQkvLyBtYXRjaGVzICwgcmV0dXJuIHRydWUuCi0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCU9iamVjdCBjb250YWluZXIgPSAoKENvbnRlbnRFbGVtZW50KSBvYmopLmdldENvbnRhaW5lcigpOwotCQkJCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQkJCWlmICghbWF0Y2hlcihjb250YWluZXIpKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5NRVRIT19QTFVHSU5TKSkgewotCQkJLy8gQ2hlY2sgaWYgdHlwZSBpcyBvZiBNZXRob2QgUGx1Z2lucwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCS8vIGlmIGlzIGEgTWV0aG9kUGx1Z2luLCByZXR1cm4gdHJ1ZSBpZiBtYXRjaGVzIHRoZSBwYXR0ZXJuCi0JCQkJcmV0dXJuIG1hdGNoZXIob2JqKTsKLQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5BQ1RJVklUSUVTKSkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJaWYgKG1hdGNoZXIob2JqKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gaGFzTWF0Y2hlZEFjdGl2aXRpZXMoKEFjdGl2aXR5KW9iaik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCXJldHVybiBoYXNNYXRjaGVkQWN0aXZpdGllcygoUHJvY2Vzc1BhY2thZ2Upb2JqKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAodHlwZSAhPSBudWxsKSB7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudAotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQotCQkJCWlmICh0eXBlLmluZGV4T2YoRmlsdGVyQ29uc3RhbnRzLnNwYWNlKSA+IC0xKSB7Ci0JCQkJCXR5cGUgPSB0eXBlLnN1YnN0cmluZyh0eXBlLmluZGV4T2YoRmlsdGVyQ29uc3RhbnRzLnNwYWNlKSwgdHlwZS5sZW5ndGgoKSk7Ci0JCQkJfQotCi0JCQkJQ2xhc3MgY2xzID0gRmlsdGVySW5pdGlhbGl6ZXIuZ2V0SW5zdGFuY2UoKS5nZXRDbGFzc0ZvclR5cGUoCi0JCQkJCQl0eXBlKTsKLQkJCQlpZiAoY2xzICE9IG51bGwgJiYgIWNscy5pc0luc3RhbmNlKG9iaikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQkJaWYgKG1hdGNoZXIob2JqKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCi0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkKLQkJCQkJCXJldHVybiBoYXNNYXRjaGVkQ2hpbGRDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaik7Ci0KLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCQlyZXR1cm4gaGFzTWF0Y2hlZEFydGlmYWN0KChBcnRpZmFjdCkgb2JqKTsKLQkJCQkJfQotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQkJCQlyZXR1cm4gaGFzTWF0Y2hlZFN1YkRvbWFpbnMoKERvbWFpbikgb2JqKTsKLQkJCQkJfQotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSl7Ci0JCQkJCQlyZXR1cm4gaGFzTWF0Y2hlZFN1YkRpc2NpcGxpbmUoKERpc2NpcGxpbmUpb2JqKTsKLQkJCQkJfQotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKXsKLQkJCQkJCXJldHVybiBoYXNNYXRjaGVkRGlzY2lwbGluZXMoKERpc2NpcGxpbmVHcm91cGluZylvYmopOwotCQkJCQl9Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9IGVsc2UgeyAvLyBlbHNlIGZvciBhbGwgb3RoZXIgdHlwZXMgb2YgZWxlbWVudHMKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQl9IGVsc2UKLQkJCS8vIHRoZSBBbGwgY2FzZQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2Qgd2hpY2ggZG9lcyBhY3R1YWwgbWF0Y2hpbmcgb2YgZ2l2ZW4gb2JqZWN0IHdpdGggcmVndWxhcgotCSAqIGV4cHJlc3Npb24uIENoZWNrcyB0byBkbyBwcmVzZW50YXRpb25uYW1lIG9yIG5hbWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcihPYmplY3Qgb2JqKSB7Ci0JCWlmKHJlZ2V4ICE9IG51bGwpewotCQkJTWF0Y2hlciBtID0gcmVnZXgubWF0Y2hlcigoKE1ldGhvZEVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpKTsKLQkJCWlmIChzaG93UHJlc2VudGF0aW9uTmFtZSkgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQKLQkJCQkJCSYmICgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmopLmdldFByZXNlbnRhdGlvbk5hbWUoKSAhPSBudWxsKQotCQkJCQltID0gcmVnZXgubWF0Y2hlcigoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqKQotCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCQkJfQotCQkJcmV0dXJuIG0ubWF0Y2hlcygpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVySW5pdGlhbGl6ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVySW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ2ZWUxNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0ZpbHRlckluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciBzZXR0aW5nIHVwIHRoZSBuZWNlc3NhcnkgbWFwcyB1c2VkIGZvciBlbGVtZW50IGZpbHRlcmluZwotICogaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZpbHRlckluaXRpYWxpemVyIHsKLQotCXByaXZhdGUgc3RhdGljIEZpbHRlckluaXRpYWxpemVyIGluaXRpYWxpemVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIG1hcDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEZpbHRlckluaXRpYWxpemVyKCkgewotCQlzdXBlcigpOwotCQlsb2FkVHlwZUNsYXNzKCk7Ci0JfQotCi0JLyoKLQkgKiBTaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWx0ZXJJbml0aWFsaXplciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluaXRpYWxpemVyID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoRmlsdGVySW5pdGlhbGl6ZXIuY2xhc3MpIHsKLQkJCQlpZiAoaW5pdGlhbGl6ZXIgPT0gbnVsbCkgewotCQkJCQlpbml0aWFsaXplciA9IG5ldyBGaWx0ZXJJbml0aWFsaXplcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5pdGlhbGl6ZXI7Ci0JfQotCi0JLyoKLQkgKiBMb2FkIHRoZSBGaWx0ZXIgVHlwZXMgYW5kIHJlc3BlY3RpdmUgY2xhc3Nlcy4gVGhpcyBuZWVkIGluIGNhc2Ugb2YgaTExOG4gLQotCSAqIENvbnN0YW50cyB2YWx1ZXMgYXJlIGRpZmZlcmVudC4KLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFR5cGVDbGFzcygpIHsKLQkJbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RUWVBFUywgV29ya1Byb2R1Y3RUeXBlLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuRE9NQUlOUywgRG9tYWluLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTLCBXb3JrUHJvZHVjdC5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVMsIFdvcmtQcm9kdWN0VHlwZS5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlMsIERvbWFpbi5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUywgV29ya1Byb2R1Y3QuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FX0dST1VQSU5HUywgRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVMsIERpc2NpcGxpbmUuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5UQVNLUywgVGFzay5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLlJPTEVfU0VUX0dST1VQSU5HUywgUm9sZVNldEdyb3VwaW5nLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFMsIFJvbGVTZXQuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5ST0xFUywgUm9sZS5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLkNIRUNLTElTVFMsIENoZWNrbGlzdC5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLkNPTkNFUFRTLCBDb25jZXB0LmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuRVNUSU1BVEVfQ09OU0lERVJBVElPTlMsCi0JCQkJRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuRVhBTVBMRVMsIEV4YW1wbGUuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5HVUlERUxJTkVTLCBHdWlkZWxpbmUuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5QUkFDVElDRVMsIFByYWN0aWNlLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuUkVQT1JUUywgUmVwb3J0LmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuUkVVU0FCTEVfQVNTRVRTLCBSZXVzYWJsZUFzc2V0LmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuUk9BRE1BUCwgUm9hZG1hcC5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTLCBTdXBwb3J0aW5nTWF0ZXJpYWwuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5URU1QTEFURVMsIFRlbXBsYXRlLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuVEVSTV9ERUZJTklUSU9OUywgVGVybURlZmluaXRpb24uY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5UT09MX01FTlRPUlMsIFRvb2xNZW50b3IuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5XSElURV9QQVBFUlMsIFdoaXRlcGFwZXIuY2xhc3MpOwotCQkvLyBtYXAucHV0KEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRSwgR3VpZGFuY2UuY2xhc3MpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgQ2xhc3MgZm9yIGEgdHlwZSBmcm9tIHRoZSBtYXAuCi0JICovCi0JcHVibGljIENsYXNzIGdldENsYXNzRm9yVHlwZShTdHJpbmcgdHlwZSkgewotCQlPYmplY3Qgb2JqID0gbWFwLmdldCh0eXBlKTsKLQkJcmV0dXJuIChDbGFzcykgb2JqOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVyVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9GaWx0ZXJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNzYwYzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9GaWx0ZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiBBIHV0aWxpdHkgY2xhc3MgZm9yIG1hbmFnaW5nIGVsZW1lbnQgZmlsdGVyaW5nIGluIHRoZSBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24KLSAqIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyVXRpbCB7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGl0ZXJhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb24gY2hpbGRyZW4sIElGaWx0ZXIgZmlsdGVyKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGQpKQotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGZvciBjb2xsZWN0aW5nIHRoZSBwYXJlbnRzIGNoYWluICh1cHdhcmQpIG9mIGFuIGJyZWFrZG93bmVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIEFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIEJyZWFrZG93bkVsZW1lbnQKLQkgKiBAcGFyYW0gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRQYXJlbnRzSW5TY29wZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCwgamF2YS51dGlsLkxpc3QgYWN0aXZpdHlMaXN0KSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChlbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJYWN0aXZpdHlMaXN0LmFkZChwYXJlbnQpOwotCQkJZ2V0UGFyZW50c0luU2NvcGUoYWRhcHRlckZhY3RvcnksIChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQsCi0JCQkJCWFjdGl2aXR5TGlzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgYWxsIGNoaWxkcmVuIG9mIHRoZSBhY3Rpdml0eSByZWN1cnNpdmVseSBkb3dud2FyZHMuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBhY3Rpdml0eUxpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0Q2hpbGRBY3Rpdml0aWVzSW5TY29wZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUFjdGl2aXR5IHBhcmVudCwgTGlzdCBhY3Rpdml0eUxpc3QpIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQotCQlPYmplY3QgbyA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJaWYgKG8gaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIG87Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWFjdGl2aXR5TGlzdC5hZGQob2JqKTsKLQkJCQkJZ2V0Q2hpbGRBY3Rpdml0aWVzSW5TY29wZShhZGFwdGVyRmFjdG9yeSwgKEFjdGl2aXR5KSBvYmosCi0JCQkJCQkJYWN0aXZpdHlMaXN0KTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlPYmplY3QgbzEgPSAoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VmFsdWUoKTsKLQkJCQkJYWN0aXZpdHlMaXN0LmFkZChvMSk7Ci0JCQkJCWdldENoaWxkQWN0aXZpdGllc0luU2NvcGUoYWRhcHRlckZhY3RvcnksIChBY3Rpdml0eSkgbzEsCi0JCQkJCQkJYWN0aXZpdHlMaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW50IG1ldGhvZCBmb3IgcmV0cml2aW5nIGFsbCB0aGUgY29udHJpYnV0b3JzIG9mCi0JICogdmFyaWFiaWxpdHllbGVtZW50IGluIGEgbGlzdC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0Q29udHJpYnV0b3JzKExpc3QgbGlzdCwgTGlzdCBnZW5lcmFsaXplcnMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBUbmdVdGlsLmdldENvbnRyaWJ1dG9ycygoVmFyaWFiaWxpdHlFbGVtZW50KSBlKTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJZ2VuZXJhbGl6ZXJzLmFkZChpdGVyLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2QgZm9yIHJldHJpdmluZyBhbGwgdGhlIGNvbnRyaWJ1dG9ycyBvZgotCSAqIHZhcmlhYmlsaXR5ZWxlbWVudCBpbiBhIGxpc3QuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldEdlbmVyYWxpemVycyhMaXN0IGxpc3QsIExpc3QgZ2VuZXJhbGl6ZXJzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlJdGVyYXRvciBpdGVyID0gVG5nVXRpbC5nZXRHZW5lcmFsaXplcnMoKFZhcmlhYmlsaXR5RWxlbWVudCkgZSk7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCWdlbmVyYWxpemVycy5hZGQoaXRlci5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIGZvciByZXRyaXZpbmcgYWxsIHRoZSB2YXJpYWJpbGl0eSBiYXNlcyBvZgotCSAqIHZhcmlhYmlsaXR5ZWxlbWVudCBpbiBhIGxpc3QuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFZhcmlhYmlsaXR5QmFzZShMaXN0IGxpc3QsIExpc3QgdmFyaWFiaWxpdHliYXNlcykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqOwotCQkJCWZvciAoOyBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsOyB2YXJpYWJpbGl0eWJhc2VzCi0JCQkJCQkuYWRkKGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlCi0JCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpKQotCQkJCQk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgcGFyZW50IGFjdGl2aXR5IGZvciBicmVha2Rvd25lbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGJyRWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRQYXJlbnRBY3Rpdml0eShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50KSB7Ci0JCWlmIChickVsZW1lbnQgIT0gbnVsbCkgewotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChickVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJCWJyRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQ7Ci0JCQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChickVsZW1lbnQsCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFN1YlRyZWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlciwgQWN0aXZpdHkgYWN0aXZpdHksCi0JCQlMaXN0IHRyZWVMaXN0KSB7Ci0JCUZpbHRlclV0aWwuZ2V0UGFyZW50c0luU2NvcGUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgYWN0aXZpdHksIHRyZWVMaXN0KTsKLQkJRmlsdGVyVXRpbC5nZXRDaGlsZEFjdGl2aXRpZXNJblNjb3BlKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGFjdGl2aXR5LCB0cmVlTGlzdCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFN1YlRyZWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlciwgTGlzdCBsaXN0LAotCQkJTGlzdCB0cmVlTGlzdCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJZ2V0U3ViVHJlZShhZGFwdGVyLCAoQWN0aXZpdHkpIG9iaiwgdHJlZUxpc3QpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0d1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzFkODI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSBndWlkYW5jZSBmb2xkZXJzIGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5HdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUNvbmZpZ3VyYWJsZSB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gbWV0aG9kQ29uZmlnCi0JICovCi0JcHVibGljIEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjb2wuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAoIWZpbHRlci5hY2NlcHQob2JqKSkKLQkJCQlpdG9yLnJlbW92ZSgpOwotCQl9Ci0JCXJldHVybiBjb2w7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lBbGxGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUFsbEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGU2ZTU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUFsbEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotLyoqCi0gKiBBIGZpbHRlciB0aGF0IGRpc3BsYXlzIGFsbCBtZXRob2QgZWxlbWVudHMgaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbgotICogZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFsbEZpbHRlciBleHRlbmRzIElGaWx0ZXIgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQ2F0ZWdvcnlGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUNhdGVnb3J5RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNWQyMjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQ2F0ZWdvcnlGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLS8qKgotICogQSBmaWx0ZXIgdGhhdCBkaXNwbGF5cyBvbmx5IGNhdGVnb3J5IGVsZW1lbnRzIGluIHRoZSBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24KLSAqIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYXRlZ29yeUZpbHRlciBleHRlbmRzIElGaWx0ZXIgewotCi0JU3RyaW5nW10gZ2V0Q2F0ZWdvcnlQYWNrYWdlUGF0aCgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lDb250ZW50RmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lDb250ZW50RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YWRlYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQ29udGVudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotLyoqCi0gKiBBIGZpbHRlciB0aGF0IGRpc3BsYXlzIG9ubHkgY29udGVudCBlbGVtZW50cyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uCi0gKiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29udGVudEZpbHRlciBleHRlbmRzIElGaWx0ZXIgewotCi0JU3RyaW5nW10gZ2V0Q29udGVudFBhY2thZ2VQYXRoKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUN1c3RvbUZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQ3VzdG9tRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNTcxMTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQ3VzdG9tRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi0vKioKLSAqIEEgZmlsdGVyIHRoYXQgZGlzcGxheXMgb25seSBjdXN0b20gY2F0ZWdvcmllcyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uCi0gKiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ3VzdG9tRmlsdGVyIGV4dGVuZHMgSUZpbHRlciB7Ci0KLQlTdHJpbmdbXSBnZXRDb250ZW50UGFja2FnZVBhdGgoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE4ZDY5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLS8qKgotICogQSBnZW5lcmljIGZpbHRlciBmb3IgZmlsdGVyaW5nIG91dCBtZXRob2QgZWxlbWVudHMgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWx0ZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXIgewotCi0JLyoKLQkgKiBnZXRPYmplY3QoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCk7Ci0KLQkvKgotCSAqIHNldEhlbHBlcigpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGVscGVyKEZpbHRlckhlbHBlciBoZWxwZXIpOwotCi0JLyoqCi0JICogQWRkZWQgZm9yIGZ1dGhlciBmaWx0ZXJpbmcuIEZvciBleGFtcGxlLCB3ZSBtYXkgc2V0IGEgZmlsZXIgdG8gcHJldmVudAotCSAqIGdlbmVyYWxpemVycyBhcyBiYXNlIGVsZW1lbnQgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeQotCSAqIAotCSAqIEBwYXJhbSBhZGRpdGlvbmFsRmlsdGVycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkZGl0aW9uYWxGaWx0ZXJzKAotCQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyW10gYWRkaXRpb25hbEZpbHRlcnMpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lQcm9jZXNzRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lQcm9jZXNzRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYzZkMzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JUHJvY2Vzc0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotLyoqCi0gKiBBIGZpbHRlciB0aGF0IGRpc3BsYXlzIG9ubHkgcHJvY2VzcyBlbGVtZW50cyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uCi0gKiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJvY2Vzc0ZpbHRlciBleHRlbmRzIElGaWx0ZXIgewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYjIxYzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVDdXN0b21DYXRlZ29yeUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUN1c3RvbUNhdGVnb3J5QWRhcHRlcigpIHsKLQkJaWYgKGN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyID0gbmV3IEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZU1ldGhvZExpYnJhcnlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RMaWJyYXJ5QWRhcHRlcigpIHsKLQkJaWYgKG1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciA9IG5ldyBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBtZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFBsdWdpbkFkYXB0ZXIoKSB7Ci0JCWlmIChtZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyID0gbmV3IE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnRQYWNrYWdlQWRhcHRlcigpIHsKLQkJaWYgKGNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyID0gbmV3IENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBjb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50Y2F0ZWdvcmllc0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKSB7Ci0JCS8vIGlmKGRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKXsKLQkJLy8gZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyID0gbmV3Ci0JCS8vIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gfQotCQkvLyByZXR1cm4gZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyOwotCQlyZXR1cm4gbmV3IERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0R3JvdXBpbmdBZGFwdGVyKCkgewotCQkvLyBpZihyb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCl7Ci0JCS8vIHJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBSb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIHJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlcjsKLQkJcmV0dXJuIG5ldyBSb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZVNldEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUm9sZVNldEl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0vLwkJaWYgKGRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0vLwkJCWRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlciA9IG5ldyBEZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIodGhpcyk7Ci0vLwkJfQotLy8KLS8vCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyOwotCQkKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUGhhc2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaGFzZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRG9tYWluQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBEb21haW5JdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzY2lwbGluZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMzQ4YzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXN1cGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcikgewotCQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWNoaWxkcmVuID0gbnVsbDsKLQkJQ29sbGVjdGlvbiBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCi0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJRmlsdGVyVXRpbC5pdGVyYXRlQ29sbGVjdGlvbihjb2wsIGZpbHRlcik7Ci0JCX0KLQkJcmV0dXJuIGNvbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZDUyOTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgbWV0aG9kIGxpYnJhcnkgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUNvbmZpZ3VyYWJsZSB7Ci0KLQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCUNvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50OwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8vIHByaXZhdGUgYm9vbGVhbiBpc0FkYXB0ZXJDb25maWd1cmFibGU7Ci0JLy8gcHJpdmF0ZSBBcnJheUxpc3QgY2hpbGRyZW47Ci0JLy8gcHJpdmF0ZSBNZXRob2RQbHVnaW4gcGx1Z2luOwotCS8vIHByaXZhdGUgTW9kZWxTdHJ1Y3R1cmUgbW9kZWxTdHJ1Y3Q7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBjb250ZW50RWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUlGaWx0ZXIgZmlsdGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSUNvbmZpZ3VyYWJsZSkgewotCQkJLy8gaXNBZGFwdGVyQ29uZmlndXJhYmxlID0gdHJ1ZTsKLQkJCSgoSUNvbmZpZ3VyYWJsZSkgYWRhcHRlckZhY3RvcnkpLnNldEZpbHRlcihmaWx0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0bwotCSAqIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluCi0JICoge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQkvLyBzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2lucygpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRNZXRob2RMaWJyYXJ5X1ByZWRlZmluZWRDb25maWd1cmF0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlcjEuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlcjEubmV4dCgpOwotCQkJaWYgKGZpbHRlci5hY2NlcHQoY2hpbGQpICYmIGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIHAgPSBuZXcgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKAotCQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCQkJCXAuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQkJQ29sbGVjdGlvbiBjaGlsZHMgPSBwLmdldENoaWxkcmVuKGNoaWxkKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGNoaWxkSXRlciA9IGNoaWxkcy5pdGVyYXRvcigpOyBjaGlsZEl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBjaGlsZE9iaiA9IGNoaWxkSXRlci5uZXh0KCk7Ci0JCQkJCWlmIChjaGlsZE9iaiBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCQkJaWYgKCFjaGVja0NoaWxkcmVucyhjaGlsZE9iaikpCi0JCQkJCQkJY2hpbGRJdGVyLnJlbW92ZSgpOwotCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGRPYmopKSB7Ci0JCQkJCQkJY2hpbGRJdGVyLnJlbW92ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChjaGlsZHMuaXNFbXB0eSgpKQotCQkJCQlpdGVyMS5yZW1vdmUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkKLQkJCQkJaXRlcjEucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0NoaWxkcmVucyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlvYmplY3QgPSAoKElXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3QpLmdldFZhbHVlKCk7Ci0JCQlpZiAoIWZpbHRlci5hY2NlcHQob2JqZWN0KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUNvbGxlY3Rpb24gY2hpbGRPYmpDaGlsZHMgPSAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgb2JqZWN0KQotCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCWZvciAoSXRlcmF0b3IgY2hpbGRPYmpJdGVyID0gY2hpbGRPYmpDaGlsZHMuaXRlcmF0b3IoKTsgY2hpbGRPYmpJdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkT2JqQ2hpbGQgPSBjaGlsZE9iakl0ZXIubmV4dCgpOwotCQkJCWlmIChjaGlsZE9iakNoaWxkIGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJCXJldHVybiBjaGVja0NoaWxkcmVucyhjaGlsZE9iakNoaWxkKTsKLQkJCQl9Ci0JCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkT2JqQ2hpbGQpKSB7Ci0JCQkJCWNoaWxkT2JqSXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY2hpbGRPYmpDaGlsZHMuaXNFbXB0eSgpKQotCQkJCS8vIGNoaWxkSXRlci5yZW1vdmUoKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL01ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODUyODQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBtZXRob2QgcGx1Zy1pbiBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyYWJsZSB7Ci0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IGNvbCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUNhdGVnb3J5RmlsdGVyKSB7Ci0JCQljb2wuYWRkQWxsKGdldENhdGVnb3J5SXRlbVByb3ZpZGVyKG9iamVjdCkuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQlyZXR1cm4gY29sOwotCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDb250ZW50RmlsdGVyKSB7Ci0JCQlyZXR1cm4gZ2V0Q29udGVudChvYmplY3QpOwotCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIElBbGxGaWx0ZXIpIHsKLQkJCXJldHVybiBnZXRBbGxDb250ZW50RWxlbWVudHMob2JqZWN0KTsKLQkJfSBlbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQ3VzdG9tRmlsdGVyKSB7Ci0JCQlyZXR1cm4gZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhvYmplY3QpOwotCQl9IGVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkvLyBUT0RPOiBmaWx0ZXIKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCUN1c3RvbUNhdGVnb3J5IHJvb3RDdXN0b21DYXRlZ29yeSA9IFRuZ1V0aWwKLQkJCQkuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KChNZXRob2RQbHVnaW4pIG9iamVjdCk7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQocm9vdEN1c3RvbUNhdGVnb3J5LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkoKElDb25maWd1cmFibGUpIGFkYXB0ZXIpLnNldEZpbHRlcihmaWx0ZXIpOwotCQlyZXR1cm4gYWRhcHRlci5nZXRDaGlsZHJlbihyb290Q3VzdG9tQ2F0ZWdvcnkpOwotCX0KLQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBnZXRDYXRlZ29yeUl0ZW1Qcm92aWRlcihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKChNZXRob2RQbHVnaW4pIG9iamVjdCwKLQkJCQkoKElDYXRlZ29yeUZpbHRlcikgZmlsdGVyKS5nZXRDYXRlZ29yeVBhY2thZ2VQYXRoKCkpOwotCQlDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIgY29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyID0gbmV3IENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlcigKLQkJCQlhZGFwdGVyRmFjdG9yeSwgcGtnLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJY29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCQljb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuc2V0UGFyZW50KG9iamVjdCk7Ci0JCXJldHVybiBjb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldENvbnRlbnQoT2JqZWN0IG9iamVjdCkgewotCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSgoTWV0aG9kUGx1Z2luKSBvYmplY3QsCi0JCQkJKChJQ29udGVudEZpbHRlcikgZmlsdGVyKS5nZXRDb250ZW50UGFja2FnZVBhdGgoKSk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChwa2csIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCSgoSUNvbmZpZ3VyYWJsZSkgYWRhcHRlcikuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCXJldHVybiBhZGFwdGVyLmdldENoaWxkcmVuKHBrZyk7Ci0JfQotCi0JLy8gcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGdldENvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlcihPYmplY3Qgb2JqZWN0KQotCS8vIHsKLQkvLyBDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSgoTWV0aG9kUGx1Z2luKW9iamVjdCwKLQkvLyBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0JLy8gQ29udGVudEVsZW1lbnRzSXRlbVByb3ZpZGVyIGNvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlciA9IG5ldwotCS8vIENvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgcGtnKTsKLQkvLyBjb250ZW50RWxlbWVudHNJdGVtUHJvdmlkZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JLy8gcmV0dXJuIGNvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlcjsKLQkvLyB9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0QWxsQ29udGVudEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVN0cmluZ1tdIGNvcmVDb250ZW50UGF0aCA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoOwotCQlDb250ZW50UGFja2FnZSBjb3JlUGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoCi0JCQkJKE1ldGhvZFBsdWdpbikgb2JqZWN0LCBjb3JlQ29udGVudFBhdGgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGNvbnRlbnRBZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGNvcmVQa2csIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCSgoSUNvbmZpZ3VyYWJsZSkgY29udGVudEFkYXB0ZXIpLnNldEZpbHRlcihmaWx0ZXIpOwotCQlsaXN0LmFkZEFsbChjb250ZW50QWRhcHRlci5nZXRDaGlsZHJlbihjb3JlUGtnKSk7Ci0KLQkJU3RyaW5nW11bXSBjYXRlZ29yeVBhdGhzID0gbmV3IFN0cmluZ1tdW10gewotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoIH07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yeVBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmdbXSBwYXRoID0gY2F0ZWdvcnlQYXRoc1tpXTsKLQkJCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKAotCQkJCQkoTWV0aG9kUGx1Z2luKSBvYmplY3QsIHBhdGgpOwotCQkJQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlciBjb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyID0gbmV3IENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5LCBwa2csIGdldE5hbWUocGF0aCkpOwotCQkJY29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCWNvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIuc2V0SW1hZ2UoZ2V0SW1hZ2UocGF0aCkpOwotCQkJY29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlci5zZXRQYXJlbnQob2JqZWN0KTsKLQkJCWxpc3QuYWRkKGNvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpOwotCQl9Ci0KLQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdEN1c3RvbUNhdGVnb3J5ID0gVG5nVXRpbAotCQkJCS5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkoKE1ldGhvZFBsdWdpbikgb2JqZWN0KTsKLQkJaWYgKHJvb3RDdXN0b21DYXRlZ29yeSAhPSBudWxsKSB7Ci0JCQlsaXN0LmFkZChyb290Q3VzdG9tQ2F0ZWdvcnkpOwotCQl9Ci0KLQkJLy8gU3RyaW5nIG5hbWUgPQotCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Qcm9jZXNzZXNfZ3JvdXAiKTsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQlQcm9jZXNzZXNJdGVtUHJvdmlkZXIgcHJvY2Vzc0l0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIoCi0JCQkJYWRhcHRlckZhY3RvcnksIChNZXRob2RQbHVnaW4pIG9iamVjdCk7Ci0JCXByb2Nlc3NJdGVtUHJvdmlkZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCXByb2Nlc3NJdGVtUHJvdmlkZXIuc2V0UGFyZW50KG9iamVjdCk7Ci0JCWxpc3QuYWRkKHByb2Nlc3NJdGVtUHJvdmlkZXIpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIxLm5leHQoKTsKLQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpCi0JCQkJaXRlcjEucmVtb3ZlKCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLy8gcHJpdmF0ZSBDb2xsZWN0aW9uIGdldFByb2Nlc3NlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIC8vIFN0cmluZyBuYW1lID0KLQkvLyAvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Qcm9jZXNzZXNfZ3JvdXAiKTsKLQkvLyAvLyAvLyROT04tTkxTLTEkCi0JLy8gUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIHByb2Nlc3NJdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKAotCS8vIGFkYXB0ZXJGYWN0b3J5LCAoTWV0aG9kUGx1Z2luKSBvYmplY3QpOwotCS8vIHByb2Nlc3NJdGVtUHJvdmlkZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JLy8gbGlzdC5hZGQocHJvY2Vzc0l0ZW1Qcm92aWRlcik7Ci0JLy8gcmV0dXJuIGxpc3Q7Ci0JLy8gfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0SW1hZ2UoU3RyaW5nW10gcGF0aCkgewotCQlpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9EaXNjaXBsaW5lcyIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGgpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Eb21haW5zIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwYXRoID09IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFR5cGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwYXRoID09IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Sb2xlcyIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVG9vbHMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZShTdHJpbmdbXSBwYXRoKSB7Ci0JCWlmIChwYXRoID09IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwYXRoID09IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCi0JCX0gZWxzZSBpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwYXRoID09IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGgpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Ub29sc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL09CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL09CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZmVjM2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9PQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGFjdGl2aXRpZXMgaW4gdGhlIFRlYW0gQWxsb2NhdGlvbiBwYWdlIG9mIGEKLSAqIFByb2Nlc3MgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBPQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0T2JqZWN0KG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE9iamVjdChEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRFQ2xhc3NlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9PQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9PQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzI0MDQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYnJlYWsgZG93biBlbGVtZW50cyBpbiB0aGUgVGVhbSBBbGxvY2F0aW9uIHBhZ2UKLSAqIG9mIGEgUHJvY2VzcyBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IE9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBPQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBzdXBlcgotCQkJCS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBPQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBzdXBlcgotCQkJCS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9PQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL09CU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcwNjljNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL09CU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBwcm9jZXNzZXMgaW4gdGhlIFRlYW0gQWxsb2NhdGlvbiBwYWdlCi0gKiBvZiBhIFByb2Nlc3MgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9CU1Byb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBPQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHVibGljIE9CU1Byb2Nlc3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5kZWxlZ2F0ZUl0ZW1Qcm92aWRlciA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5BY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JCQkJCS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2wuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpCi0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJc3VwZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9QQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9QQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjY0NjJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGFjdGl2aXRpZXMgaW4gdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZQotICogcGFnZSBvZiBhIFByb2Nlc3MgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLy8gSUZpbHRlciBmaXRsZXI7Ci0JcHVibGljIFBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCQlDb2xsZWN0aW9uIGNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCS8vIFRoaXMgY2FsbCB0byBQQlNBY3RpaXZpdHlJdGVtUHJvdmlkZXIocHJvY2VzcyBwYWNrYWdlKSBpcyBkb25lCi0JCS8vIC0gaW4gb3JkZXIgcmVtb3ZlIGR1cGxpY2F0ZSBzdWJhcnRpZmFjdC4KLQkJY29sID0gUHJvY2Vzc1V0aWwucmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGNvbCwgZmFsc2UpOwotCQlyZXR1cm4gY29sOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE9iamVjdChEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRQQlNFY2xhc3NlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9QQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9QQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGExOTFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYnJlYWsgZG93biBlbGVtZW50cyBpbiB0aGUgV29yayBQcm9kdWN0IFVzYWdlCi0gKiBwYWdlIG9mIGEgUHJvY2VzcyBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBzdXBlcgotCQkJCS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBzdXBlcgotCQkJCS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9QQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNiY2MwYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgcHJvY2Vzc2VzIGluIHRoZSBXb3JrIFByb2R1Y3QgVXNhZ2UgcGFnZQotICogb2YgYSBQcm9jZXNzIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQQlNQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMgUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlIHsKLQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwdWJsaWMgUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLmRlbGVnYXRlSXRlbVByb3ZpZGVyID0gZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkFjdGl2aXR5SXRlbVByb3ZpZGVyI2dldFByb3BlcnR5RGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkJCQkJLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29sOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQlzdXBlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI4Yzk2ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGViMmIwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHByb2Nlc3MgcGFja2FnZSBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvL3ByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbkluY2x1ZGluZ0VtcHR5T2JqZWN0cyhvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWlmIChpc0VtcHR5UGFja2FnZShpdGVyLm5leHQoKSkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5JbmNsdWRpbmdFbXB0eU9iamVjdHMoT2JqZWN0IG9iamVjdCkgewotCQlBcnJheUxpc3QgY29sID0gbmV3IEFycmF5TGlzdCgpOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBjaGlsZCA9IGVsZW1lbnQ7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCWNoaWxkID0gKChQcm9jZXNzQ29tcG9uZW50KSBlbGVtZW50KS5nZXRQcm9jZXNzKCk7Ci0JCQkJfQotCQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQljb2wuYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0VtcHR5UGFja2FnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJfHwgIShvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuSW5jbHVkaW5nRW1wdHlPYmplY3RzKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJaWYgKCFpc0VtcHR5UGFja2FnZShpdGVyLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gcHJpdmF0ZSBib29sZWFuIGFueVByb2Nlc3NDb21wb25lbnQoT2JqZWN0IHBhcmVudFByb2Nlc1BhY2thZ2UpIHsKLQkvLyBMaXN0IGxpc3QgPSAoKFByb2Nlc3NQYWNrYWdlKSBwYXJlbnRQcm9jZXNQYWNrYWdlKS5nZXRQcm9jZXNzRWxlbWVudHMoKTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCS8vIE9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkvLyBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCS8vIGlmIChmaWx0ZXIuYWNjZXB0KG9iaikpCi0JLy8gcmV0dXJuIHRydWU7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCS8vdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1Byb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Qcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjczMjRkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1Byb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuSUVsZW1lbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiUHJvY2Vzc2VzIiBmb2xkZXIgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElFbGVtZW50SXRlbVByb3ZpZGVyLCBJR3JvdXBDb250YWluZXIsCi0JCUlDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBNYXAgZ3JvdXBJdGVtUHJvdmlkZXJNYXA7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGNoaWxkcmVuOwotCi0JcHJvdGVjdGVkIE1ldGhvZFBsdWdpbiBwbHVnaW47Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIE1ldGhvZFBsdWdpbgotCSAqIEBwYXJhbSBNb2RlbFN0cnVjdHVyZQotCSAqIAotCSAqIFBsdWdpbiBpcyByZXF1aXJlZCB0byBwYXNzLCB1c2VkIGluIGZpbmRpbmcgTWV0aG9kUGFja2FnZSBmb3IgcGFydGljdWxhcgotCSAqIE1vZGVsU3RydWN0dXJlLCBNb2RlbFN0cnVjdHVyZSBpcyBvcHRpb25hbC4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMucGx1Z2luID0gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW10gewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9DYXBhYmlsaXR5UGF0dGVybnNfdGV4dCIpLCAvLyROT04tTkxTLTEkCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uc190ZXh0IikgfTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW11bXSBwcm9jZXNzUGF0aHMgPSBuZXcgU3RyaW5nW11bXSB7Ci0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGgsCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGggfTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvY2Vzc1BhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2UgcGtnMSA9IChQcm9jZXNzUGFja2FnZSkgVW1hVXRpbAotCQkJCQkJLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwgcHJvY2Vzc1BhdGhzW2ldKTsKLQkJCQlpZiAocGtnMSAhPSBudWxsKSB7Ci0JCQkJCU9iamVjdCBpbWFnZSA9IFVtYUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCQkJImZ1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCUNhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IG5ldyBDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcigKLQkJCQkJCQlhZGFwdGVyRmFjdG9yeSwgcGtnMSwgbmFtZXNbaV0sIGltYWdlKTsKLQkJCQkJaXRlbVByb3ZpZGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJCQljaGlsZHJlbi5hZGQoaXRlbVByb3ZpZGVyKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3NlcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Byb2Nlc3Nlc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lciNnZXRHcm91cEl0ZW1Qcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0R3JvdXBJdGVtUHJvdmlkZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdyb3VwSXRlbVByb3ZpZGVyTWFwLmdldChuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Sb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MzljMGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Sb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiUm9sZSBTZXRzIiBmb2xkZXJzIGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Sb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlLCBJTGlicmFyeUl0ZW1Qcm92aWRlciwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuOwotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG9iamVjdCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSB7Ci0KLQkJCS8vIFRPRE86IGNvbW1lbnRlZCBvdXQgdW50aWwgSmluaHVhIGZpeGVkIGJ1Z3MgaW4KLQkJCS8vIENvbmZpZ3VyYXRpb25GaWx0ZXIKLQkJCWlmIChjb25maWd1cmF0b3IgIT0gbnVsbCkgewotCQkJCWNoaWxkcmVuID0gY29uZmlndXJhdG9yLmdldENoaWxkcmVuKG9iamVjdCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0cygpKTsKLQkJCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIlJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbigpOiByZXR1cm5lZCBmcm9tIGNvbmZpZ3VyYXRvcjogIiArIGNoaWxkcmVuKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gY2hpbGRyZW47Ci0JCQkJfQotCQkJfQotCi0JCQljaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQlSb2xlU2V0R3JvdXBpbmcgZ3JvdXBpbmcgPSAoUm9sZVNldEdyb3VwaW5nKSBvYmplY3Q7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmYgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgKChDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSBnZXRQYXJlbnQob2JqZWN0KSkKLQkJCQkJLmdldFRhcmdldCgpOwotCQkJVG5nVXRpbC5hZGRFeHRlbmRlZENoaWxkcmVuKGdyb3VwaW5nLCBtZXRob2RDb25mLCBjaGlsZHJlbiwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aCk7Ci0KLQkJCS8vIHNldCBwYXJlbnQKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGl0ZXIubmV4dCgpLAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudCh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfSBlbHNlIHsKLQkJCUNvbGxlY3Rpb24gY2hpbGRyZW5Db2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW5Db2wuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBjb250ZW50QWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJLmFkYXB0KGNoaWxkLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChjb250ZW50QWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGNvbnRlbnRBZGFwdGVyKS5zZXRQYXJlbnQob2JqZWN0KTsKLQkJCQl9Ci0JCQkJaWYgKGZpbHRlciAhPSBudWxsKQotCQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGQpKQotCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJCXJldHVybiBjaGlsZHJlbkNvbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0JCS8vIGlmKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJLy8gTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBvYmplY3QpOwotCQkvLyBpZihwbHVnaW4gIT0gbnVsbCkgewotCQkvLyBTdHJpbmdbXSBwYXRoID0gewotCQkvLyBUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCS8vICxUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKQotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vICxUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpCi0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJLy8gfTsKLQkJLy8gT2JqZWN0IGFkYXB0ZXIgPQotCQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpLmFkYXB0KHBsdWdpbiwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gLy8gSUdyb3VwQ29udGFpbmVyIGdyb3VwcyA9IChJR3JvdXBDb250YWluZXIpCi0JCS8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcikuYWRhcHQocGx1Z2luLAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyAvLyBpbnQgaTsKLQkJLy8gLy8gZm9yKGkgPSAwOyBpIDwgcGF0aC5sZW5ndGggLSAxOyBpKyspIHsKLQkJLy8gLy8gZ3JvdXBzID0gKElHcm91cENvbnRhaW5lcikgZ3JvdXBzLmdldEdyb3VwSXRlbVByb3ZpZGVyKHBhdGhbaV0pOwotCQkvLyAvLyBpZihncm91cHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCS8vIC8vIH0KLQkJLy8gLy8gcmV0dXJuIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBncm91cHMuZ2V0R3JvdXBJdGVtUHJvdmlkZXIocGF0aFtpXSk7Ci0JCS8vIHJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKTsKLQkJLy8gLy9yZXR1cm4gYWRhcHRlcjsKLQkJLy8gfQotCQkvLyB9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Sb2xlU2V0SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1JvbGVTZXRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIxZTM4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1JvbGVTZXRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSByb2xlIHNldCBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uUm9sZVNldEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlDb25maWd1cmFibGUsIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBSb2xlU2V0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY29sID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChnZXRQYXJlbnQob2JqZWN0KSk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSB7Ci0JCQljb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQkJRmlsdGVyVXRpbC5pdGVyYXRlQ29sbGVjdGlvbihjb2wsIGZpbHRlcik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElBbGxGaWx0ZXIKLQkJCQkJfHwgZmlsdGVyIGluc3RhbmNlb2YgSUNhdGVnb3J5RmlsdGVyKSB7Ci0JCQkJcmV0dXJuIGNvbDsKLQkJCX0KLQkJCS8vIEl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9Ci0JCQkvLyAoSXRlbVByb3ZpZGVyQWRhcHRlcikoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UpLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JCQkvLyAuYWRhcHQob2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJLy8gY29sID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBjb2w7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQlzdXBlci5zZXRQYXJlbnQocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JCS8vIHJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1ZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjcyMjkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIFRoaXMgaXMgYSBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBzZWxlY3Rpb24uIFRoZSBmaWx0ZXIgd2lsbAotICogY2hlY2sgaWYgb2JqZWN0IGNhbiBiZSBhY2NlcHRlZCBhcyB0aGUgYmFzZSBlbGVtZW50IG9mIHRoZSBmaWx0ZXIgb3duZXIuCi0gKiAKLSAqIEZpbHRlciBydWxlczoKLSAqIAotICogMS4gVGhlIGVsZW1lbnQgaXRzZWxmIGFuZCBpdCdzIGdlbmVyYWxpemVycyAoY29udHJpYnV0b3IsIHJlcGxhY2VyLCBvcgotICogZXh0ZW5kZXIpIHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQKLSAqIDIuIEFueSBlbGVtZW50cyBpbiB0aGUgY29udGFpbm1lbnQgY2hhaW4gb2YgdGhlIGFib3ZlLCBzaG91bGQgYmUgZmlsdGVyZWQKLSAqIG91dAotICogMy4gaWYgYW55IG9mIHRoZSBiYXNlIGVsZW1lbnRzIGNhbid0IGJlIHNlbGVjdGVkLCB0aGVuIHRoaXMgZWxlbWVudCBjYW4ndAotICogYmUgc2VsZWN0ZWQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyIGltcGxlbWVudHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyIHsKLQotCXByaXZhdGUgVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQ7Ci0KLQlwcml2YXRlIExpc3QgYmFkZ3V5cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0KLQkJLy8gZmlyc3Qgb2YgYWxsLCB5b3UgY2FuJ3QgdmFyeSB5b3Vyc2VsZgotCQliYWRndXlzLmFkZChlbGVtZW50KTsKLQotCQkvLyBnZXQgYWxsIG15IGdlbmVyYWxpemVycwotCQlJdGVyYXRvciBpdCA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKGVsZW1lbnQpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQliYWRndXlzLmFkZCh2ZSk7Ci0KLQkJCS8vIHRoZSBjb250YWlubWVudCBjaGFpbiBvbiBteSBnZW5lcmFsaXplcnMgY2FuJ3QgYmUgbXkgYmFzZQotCQkJaGFuZGxlQ29udGFpbm1lbnRDaGFpbih2ZSk7Ci0JCX0KLQotCQkvLyBlbGVtZW50J3MgaW4gbXkgY2hhaW4gY2FuJ3QgYmUgbXkgYmFzZQotCQloYW5kbGVDb250YWlubWVudENoYWluKGVsZW1lbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVDb250YWlubWVudENoYWluKFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JCWlmICghaGFzQ29udGFpbm1lbnRGZWF0dXJlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChlIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCUxpc3Qgcm9vdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlsb2FkUm9vdEN1c3RvbUNhdGVnb3JpZXMoKEN1c3RvbUNhdGVnb3J5KSBlLCByb290cyk7Ci0JCQliYWRndXlzLmFkZEFsbChyb290cyk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQlMaXN0IHJvb3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZGVsaXZlcmFibGVQYXJ0cygoRGVsaXZlcmFibGUpIGUsIHJvb3RzKTsKLQkJCWJhZGd1eXMuYWRkQWxsKHJvb3RzKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGlmIHRoZSBlbGVtZW50IGhhcyBjb250YWlubWVudCBmZWF0dXJlLAotCQkJLy8geW91IGNhbid0IHNlbGVjdCB0aGUgZWxlbWVudCBpbiB0aGUgY29udGFpbm1lbnQgY2hhaW4KLQkJCUVPYmplY3Qgcm9vdCA9IGdldENoYWluUm9vdChlKTsKLQkJCWlmICghYmFkZ3V5cy5jb250YWlucyhyb290KSkgewotCQkJCWJhZGd1eXMuYWRkKHJvb3QpOwotCQkJfQotCi0JCQkvKgotCQkJICogaG9sZCBvZmYgZm9yIG5vdyAvLyBhbHNvIG9ubHkgb25lIGVsZW1lbnQgaW4gYSBjaGFpbiBjYW4gYmUKLQkJCSAqIHNlbGVjdGVkIGFzIGJhc2UgLy8gc28gZ2V0IGFsbCB0aGUgYmFzZSBlbGVtZW50cyBpbiB0aGUgZWxlbWVudAotCQkJICogY2hhaW4sIGFuZCBibG9jayB0aGUgZWxlbWVudCBjaGFpbiBvZiB0aGUgYmFzZSBlbGVtZW50cwotCQkJICogZmlsdGVyVXNlZEJhc2VDaGFpbigoVmFyaWFiaWxpdHlFbGVtZW50KXJvb3QpOyBmb3IgKEl0ZXJhdG9yIGl0ID0KLQkJCSAqIHJvb3QuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTsgKSB7IE9iamVjdCBvID0gaXQubmV4dCgpOyBpZiAoCi0JCQkgKiBvLmdldENsYXNzKCkuaXNJbnN0YW5jZShlbGVtZW50KSApIHsKLQkJCSAqIGZpbHRlclVzZWRCYXNlQ2hhaW4oKFZhcmlhYmlsaXR5RWxlbWVudClvKTsgfSB9Ci0JCQkgKi8KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbGl2ZXJhYmxlUGFydHMoRGVsaXZlcmFibGUgZSwgTGlzdCByb290cykgewotCQlMaXN0IGxpc3QgPSAoKERlbGl2ZXJhYmxlKSBlKS5nZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCQlyb290cy5hZGQob2JqKTsKLQkJCQkJZGVsaXZlcmFibGVQYXJ0cygoRGVsaXZlcmFibGUpIG9iaiwgcm9vdHMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkUm9vdEN1c3RvbUNhdGVnb3JpZXMoQ3VzdG9tQ2F0ZWdvcnkgZSwgTGlzdCByb290cykgewotCQlMaXN0IGNzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhlKTsKLQkJaWYgKGNzICE9IG51bGwgJiYgY3Muc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlDdXN0b21DYXRlZ29yeSBjYyA9IChDdXN0b21DYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJCWlmICghVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeShjYykpIHsKLQkJCQkJbG9hZFJvb3RDdXN0b21DYXRlZ29yaWVzKGNjLCByb290cyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKCFyb290cy5jb250YWlucyhlKSkgewotCQkJCQkJcm9vdHMuYWRkKGUpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmICghcm9vdHMuY29udGFpbnMoZSkpIHsKLQkJCXJvb3RzLmFkZChlKTsKLQkJfQotCX0KLQotCS8vIHByaXZhdGUgdm9pZCBmaWx0ZXJVc2VkQmFzZUNoYWluKFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JLy8gVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkvLyBpZiAoYmFzZSAhPSBudWxsKSB7Ci0JLy8gLy8gaWYgdGhlIGVsZW1lbnQgY2hhaW4gaXMgc2VsZWN0ZWQgYXMgYmFzZSBpbiB0aGUgY3VycmVudCBjaGFpbiwKLQkvLyAvLyBubyBlbGVtZW50IGluIHRoYXQgY2hhaW4gY2FuIGJlIGZ1dGhlciBzZWxlY3RlZAotCS8vIE9iamVjdCByb290ID0gZ2V0Q2hhaW5Sb290KGJhc2UpOwotCS8vIGlmICghYmFkZ3V5cy5jb250YWlucyhyb290KSkgewotCS8vIGJhZGd1eXMuYWRkKHJvb3QpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0NvbnRhaW5tZW50RmVhdHVyZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBEb21haW4gfHwgZWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5Ci0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIEFydGlmYWN0IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBQcmFjdGljZQotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgZ2V0Q2hhaW5Sb290KE1ldGhvZEVsZW1lbnQgZSkgewotCQlFT2JqZWN0IHJvb3QgPSBlOwotCQlPYmplY3QgdHlwZSA9IGVsZW1lbnQuZ2V0VHlwZSgpOwotCQlFT2JqZWN0IHBhcmVudCA9IGU7Ci0JCXdoaWxlICgocGFyZW50ID0gcGFyZW50LmVDb250YWluZXIoKSkgIT0gbnVsbAotCQkJCSYmICgoTWV0aG9kRWxlbWVudCkgcGFyZW50KS5nZXRUeXBlKCkgPT0gdHlwZSkgewotCQkJcm9vdCA9IHBhcmVudDsKLQkJfQotCi0JCXJldHVybiByb290OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0KLQkJLy8gYWx3YXlzIGFjY2VwdCBwYWNrYWdlcwotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSB8fCBvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4KLQkJCQl8fCBvYmogaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlCi0JCQkJfHwgb2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvLyBtdXN0IGJlIHZhcmlhYmlsaXR5IGVsZW1lbnQgYW5kIGNhbid0IGJlIGl0c2VsZgotCQlpZiAob2JqID09IGVsZW1lbnQgfHwgIShvYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBtdXN0IGJlIHRoZSBzYW1lIHR5cGUKLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqOwotCQlpZiAodmUuZ2V0VHlwZSgpICE9IGVsZW1lbnQuZ2V0VHlwZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBjYW4ndCBiZSBteSBhbnkgb2YgbXkgZ2VuZXJhbGl6ZXJzCi0JCWlmIChiYWRndXlzLmNvbnRhaW5zKG9iaikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGlmIHRoaXMgZWxlbWVudCdzIGJhc2UgY2hhaW4gaXMgYSBiYWRndXksIGNhbid0IGFjY2VwdCwgb3RoZXJ3aXNlLCBhCi0JCS8vIGNpcmN1bGFyIGxvY2sKLQkJd2hpbGUgKCh2ZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgIT0gbnVsbCkgewotCQkJaWYgKGJhZGd1eXMuY29udGFpbnModmUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCS8vIGFueXRoaW5nIGVsc2UgPwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMzA0YzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpdGVtIHByb3ZpZGVycyBmb3IgZGlzcGxheWluZyBhbmQgZmlsdGVyaW5nIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0Fic3RyYWN0UHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9BYnN0cmFjdFByb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjkzMGJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0Fic3RyYWN0UHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuSUVsZW1lbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBiYXNlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBjbGFzcyBmb3IgdGhlICJQcm9jZXNzZXMiIGZvbGRlciBpbgotICogdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcm9jZXNzZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsCi0JCUlFbGVtZW50SXRlbVByb3ZpZGVyLCBJR3JvdXBDb250YWluZXIgewotCXByb3RlY3RlZCBNYXAgZ3JvdXBJdGVtUHJvdmlkZXJNYXA7Ci0KLQlwcm90ZWN0ZWQgTW9kZWxTdHJ1Y3R1cmUgbW9kZWxTdHJ1Y3Q7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGNoaWxkcmVuOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIHByb2Nlc3NDb250cmlidXRpb25FbmFibGVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlciBwcmVmU3RvcmVMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1vZGVsU3RydWN0dXJlIG1vZGVsU3RydWN0KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5tb2RlbFN0cnVjdCA9IG1vZGVsU3RydWN0OwotCi0JCS8vIGZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gUHJvdmlkZXJzLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkvLyBpZiAocHJlZlN0b3JlICE9IG51bGwpIHsKLQkJLy8gcHJvY2Vzc0NvbnRyaWJ1dGlvbkVuYWJsZWQgPSBwcmVmU3RvcmUKLQkJLy8gLmdldEJvb2xlYW4oTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9FTkFCTEVfUFJPQ0VTU19DT05UUklCVVRJT04pOwotCQkvLyBwcmVmU3RvcmVMaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJLy8KLQkJLy8gcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKSA9PQotCQkvLyBMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX0VOQUJMRV9QUk9DRVNTX0NPTlRSSUJVVElPTikgewotCQkvLyBib29sZWFuIG5ld1ZhbHVlID0gcHJlZlN0b3JlLmdldEJvb2xlYW4oZXZlbnQKLQkJLy8gLmdldFByb3BlcnR5KCkpOwotCQkvLyBpZiAocHJvY2Vzc0NvbnRyaWJ1dGlvbkVuYWJsZWQgIT0gbmV3VmFsdWUpIHsKLQkJLy8gcHJvY2Vzc0NvbnRyaWJ1dGlvbkVuYWJsZWQgPSBuZXdWYWx1ZTsKLQkJLy8gZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbigKLQkJLy8gbmV3IE5vdGlmaWNhdGlvbkltcGwoLTEsIC0xLCAtMSksCi0JCS8vIEFic3RyYWN0UHJvY2Vzc2VzSXRlbVByb3ZpZGVyLnRoaXMsIHRydWUsCi0JCS8vIGZhbHNlKSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCS8vCi0JCS8vIH07Ci0JCS8vIHByZWZTdG9yZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByZWZTdG9yZUxpc3RlbmVyKTsKLQkJLy8gfQotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHByZWZTdG9yZSA9IFByb3ZpZGVycy5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJaWYgKHByZWZTdG9yZSAhPSBudWxsICYmIHByZWZTdG9yZUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCXByZWZTdG9yZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByZWZTdG9yZUxpc3RlbmVyKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXIjZ2V0R3JvdXBJdGVtUHJvdmlkZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEdyb3VwSXRlbVByb3ZpZGVyKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBncm91cEl0ZW1Qcm92aWRlck1hcC5nZXQobmFtZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Qcm9jZXNzZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Qcm9jZXNzZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0NhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZGNiNjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBjYXBhYmlsaXR5IHBhdHRlcm4gaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkNhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwKLQkJCQkuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9DYXBhYmlsaXR5UGF0dGVybl90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0NvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Db25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGNiYzc1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0NvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkNvbmZpZ3VyYXRpb25zIiBmb2xkZXIgaW4gdGhlIExpYnJhcnkKLSAqIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIgewotCi0JLy8gcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IG1ldGhvZExpYnJhcnk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZExpYnJhcnkgbGliLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgbGliLCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE1ldGhvZExpYnJhcnlfUHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gIShvYmogaW5zdGFuY2VvZiBQcm9jZXNzRmFtaWx5KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0NvbmZpZ3VyYXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChNZXRob2RMaWJyYXJ5KSB0YXJnZXQpCi0JCQkJCS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0NPTkZJR1VSQVRJT04pOyAKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVDbGFzcygpCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIE1ldGhvZExpYnJhcnkuY2xhc3M7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNjcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kKGRvbWFpbiwgKEVPYmplY3QpIHRhcmdldCwKLQkJCQlmZWF0dXJlLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24sIHRoaXMpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQjZ2V0VmFsaWRhdG9yKCkKLQkJCSAqLwotCQkJcHJvdGVjdGVkIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlTmFtZVZhbGlkYXRvcihvd25lciwgKE1ldGhvZENvbmZpZ3VyYXRpb24pY2hpbGQpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VmFsaWRhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvQ29udGVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvQ29udGVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWNjMTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0NvbnRlbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LlN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuSUVsZW1lbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIk1ldGhvZCBDb250ZW50IiBmb2xkZXIgaW4gdGhlIExpYnJhcnkKLSAqIHZpZXcuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSByZW5hbWVkIGFzICJNZXRob2RDb250ZW50SXRlbVByb3ZpZGVyIiBpbiBFUEYgTTUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsCi0JCUlFbGVtZW50SXRlbVByb3ZpZGVyLCBJR3JvdXBDb250YWluZXIgewotCi0JcHJvdGVjdGVkIE1ldGhvZFBsdWdpbiBwbHVnaW47Ci0KLQlwcm90ZWN0ZWQgTW9kZWxTdHJ1Y3R1cmUgbW9kZWxTdHJ1Y3Q7Ci0KLQlwcm90ZWN0ZWQgTWFwIGdyb3VwSXRlbVByb3ZpZGVyTWFwOwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBjaGlsZHJlbjsKLQotCXByb3RlY3RlZCBDb250ZW50UGFja2FnZSBjb3JlQ29udGVudFBrZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbnRlbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luLCBNb2RlbFN0cnVjdHVyZSBtb2RlbFN0cnVjdCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMucGx1Z2luID0gcGx1Z2luOwotCQl0aGlzLm1vZGVsU3RydWN0ID0gbW9kZWxTdHJ1Y3Q7Ci0JfQotCQotCXB1YmxpYyBDb250ZW50UGFja2FnZSBnZXRDb3JlQ29udGVudFBhY2thZ2UoKSB7Ci0JCXJldHVybiBjb3JlQ29udGVudFBrZzsKLQl9Ci0JCi0JcHVibGljIE5vdGlmaWVyIGdldFRhcmdldCgpIHsKLQkJcmV0dXJuIGNvcmVDb250ZW50UGtnOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJU3RyaW5nIG5hbWU7Ci0JCQlJTGlicmFyeUl0ZW1Qcm92aWRlciBjaGlsZDsKLQotCQkJLy8gZmluZCBjb3JlIGNvbnRlbnQgcGFja2FnZQotCQkJQ29udGVudFBhY2thZ2UgY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJbW9kZWxTdHJ1Y3QuY29yZUNvbnRlbnRQYXRoKTsKLQkJCWNvcmVDb250ZW50UGtnID0gY29udGVudFBrZzsKLQkJCWlmIChjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9NZXRob2RDb250ZW50X2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljaGlsZCA9IG5ldyBNZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkJCWNvbnRlbnRQa2csIG5hbWUpOwotCQkJCWNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCQkvLyBjb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCS8vIG1vZGVsU3RydWN0LmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0JCQkJLy8gaWYoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJLy8gbmFtZSA9Ci0JCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKTsKLQkJCQkvLyBjaGlsZCA9IG5ldyBEaXNjaXBsaW5lQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkvLyBjb250ZW50UGtnLCBuYW1lKTsKLQkJCQkvLyBjaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJLy8gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJCS8vIH0KLQkJCQkvLwkgICAgICAgIAotCQkJCS8vIGNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJLy8gbW9kZWxTdHJ1Y3QuZG9tYWluUGF0aCk7Ci0JCQkJLy8gaWYoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJLy8gbmFtZSA9Ci0JCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRG9tYWluc19ncm91cCIpOwotCQkJCS8vIGNoaWxkID0gbmV3IERvbWFpbnNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2csCi0JCQkJLy8gbmFtZSk7Ci0JCQkJLy8gY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQkJCS8vIGNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJCQkvLyB9Ci0JCQkJLy8JCi0JCQkJLy8gY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkvLyBtb2RlbFN0cnVjdC53b3JrUHJvZHVjdFR5cGVQYXRoKTsKLQkJCQkvLyBpZihjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQkvLyBuYW1lID0KLQkJCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwIik7Ci0JCQkJLy8gY2hpbGQgPSBuZXcgV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkvLyBjb250ZW50UGtnLCBuYW1lKTsKLQkJCQkvLyBjaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJLy8gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJCS8vIH0KLQkJCQkvLwkgICAgICAgIAotCQkJCS8vIGNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJLy8gbW9kZWxTdHJ1Y3Qucm9sZVNldFBhdGgpOwotCQkJCS8vIGlmKGNvbnRlbnRQa2cgIT0gbnVsbCkgewotCQkJCS8vIG5hbWUgPQotCQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpOwotCQkJCS8vIGNoaWxkID0gbmV3IFJvbGVTZXRzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnLAotCQkJCS8vIG5hbWUpOwotCQkJCS8vIGNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQkvLyBjaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0JCQkJLy8gfQotCQkJCS8vCSAgICAgICAgCi0JCQkJLy8gY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkvLyBtb2RlbFN0cnVjdC50b29sUGF0aCk7Ci0JCQkJLy8gaWYoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJLy8gbmFtZSA9Ci0JCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVG9vbHNfZ3JvdXAiKTsKLQkJCQkvLyBjaGlsZCA9IG5ldyBUb29sc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZywKLQkJCQkvLyBuYW1lKTsKLQkJCQkvLyBjaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJLy8gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJCS8vIH0KLQotCQkJCS8vIGNyZWF0ZSB0aGUgc3RhbmRhcmQgY2F0ZWdvcmllcyBmb2xkZXIKLQkJCQljb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQkJbW9kZWxTdHJ1Y3Quc3RhbmRhcmRDYXRlZ29yeVBhdGgpOwotCQkJCWlmIChjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQljaGlsZCA9IG5ldyBTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJCQkJY29udGVudFBrZywgbmFtZSk7Ci0JCQkJCWNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJCQl9Ci0KLQkJCQkvLyBjcmVhdGUgdGhlIGN1c3RvbWUgY2F0ZWdvcmllcyBmb2xkZXIKLQkJCQkvLyBjb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCS8vIG1vZGVsU3RydWN0LmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JCQkJLy8gaWYoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJLy8gbmFtZSA9Ci0JCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXAiKTsKLQkJCQkvLyBjaGlsZCA9IG5ldyBDdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LAotCQkJCS8vIGNvbnRlbnRQa2csIG5hbWUpOwotCQkJCS8vIGNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQkvLyBjaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0JCQkJLy8gfQotCi0JCQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdEN1c3RvbUNhdGVnb3J5ID0gVG5nVXRpbAotCQkJCQkJLmdldFJvb3RDdXN0b21DYXRlZ29yeShwbHVnaW4pOwotCQkJCWlmIChyb290Q3VzdG9tQ2F0ZWdvcnkgIT0gbnVsbCkgewotCQkJCQlib29sZWFuIG5vdGlmeSA9IHJvb3RDdXN0b21DYXRlZ29yeS5lRGVsaXZlcigpOwotCQkJCQl0cnkgewotCQkJCQkJcm9vdEN1c3RvbUNhdGVnb3J5LmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQkJCXJvb3RDdXN0b21DYXRlZ29yeS5zZXROYW1lKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9DdXN0b21fQ2F0ZWdvcmllc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJcm9vdEN1c3RvbUNhdGVnb3J5LmVTZXREZWxpdmVyKG5vdGlmeSk7Ci0JCQkJCX0KLQkJCQkJY2hpbGRyZW4uYWRkKHJvb3RDdXN0b21DYXRlZ29yeSk7Ci0JCQkJfQotCi0JCQkJLy8gSUNvbmZpZ3VyYWJsZSBhZGFwdGVyID0gKElDb25maWd1cmFibGUpCi0JCQkJLy8gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLmFkYXB0KGNvbnRlbnRQa2csCi0JCQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkvLyBhZGFwdGVyLnNldExhYmVsKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX01ldGhvZENvbnRlbnRfZ3JvdXAiKSk7Ci0JCQkJLy8gY2hpbGRyZW4uYWRkKGNvbnRlbnRQa2cpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ29udGVudCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyI2dldEdyb3VwSXRlbVByb3ZpZGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRHcm91cEl0ZW1Qcm92aWRlcihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ3JvdXBJdGVtUHJvdmlkZXJNYXAgIT0gbnVsbCA/IGdyb3VwSXRlbVByb3ZpZGVyTWFwLmdldChuYW1lKQotCQkJCTogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGdyb3VwSXRlbVByb3ZpZGVyTWFwICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdyb3VwSXRlbVByb3ZpZGVyTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgYWRhcHRlciA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSURpc3Bvc2FibGUpIHsKLQkJCQkJKChJRGlzcG9zYWJsZSkgYWRhcHRlcikuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLmNsZWFyKCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcCA9IG51bGw7Ci0JCX0KLQkJaWYoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJY2hpbGRyZW4uY2xlYXIoKTsKLQkJfQotCQlwbHVnaW4gPSBudWxsOwotCQljb3JlQ29udGVudFBrZyA9IG51bGw7Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9EZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI5Y2ZhNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9EZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBkZWxpdmVyeSBwcm9jZXNzIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCi0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMzhlZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JUmVmZXJlbmNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmJyZWFrZG93bmVsZW1lbnQuQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5icmVha2Rvd25lbGVtZW50Lk1pbGVzdG9uZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRGlzY2lwbGluZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LlJvbGVTZXRDYXRlZ29yeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LlJvbGVTZXRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Ub29sSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5BcnRpZmFjdEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuR3VpZGFuY2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LlJvbGVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LlNlY3Rpb25JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LlRhc2tJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LldvcmtQcm9kdWN0SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBVbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQlpbXBsZW1lbnRzIElSZWZlcmVuY2VyIHsKLQotCXByb3RlY3RlZCBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlciB3b3JrUHJvZHVjdEl0ZW1Qcm92aWRlcjsKLQotCXByb3RlY3RlZCBBcnRpZmFjdEl0ZW1Qcm92aWRlciBteUFydGlmYWN0SXRlbVByb3ZpZGVyOwotCi0JcHJvdGVjdGVkIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGd1aWRhbmNlSXRlbVByb3ZpZGVyOwotCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyIG15T3V0Y29tZUl0ZW1Qcm92aWRlcjsKLQotCXByb3RlY3RlZCBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlciBteURlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogUmVmZXJlbmNlcyB0byBzdGF0ZWZ1bCBhZGFwdGVycyBjcmVhdGVkIGJ5IHRoaXMgYWRhcHRlciBmYWN0b3J5Ci0JICovCi0JcHJvdGVjdGVkIFNldCBkaXNwb3NhYmxlQWRhcHRlcnMgPSBuZXcgSGFzaFNldCgpOwotCi0JLy8gcHJvdGVjdGVkIENvbGxlY3Rpb24gYWRhcHRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjYWRhcHQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBzdXBlci5hZGFwdChub3RpZmllciwgdHlwZSk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSVN0YXRlZnVsSXRlbVByb3ZpZGVyCi0JCQkJJiYgbm90aWZpZXIgaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJJiYgKChFT2JqZWN0KSBub3RpZmllcikuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCWRpc3Bvc2FibGVBZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29yZWNvbnRlbnRBZGFwdGVyRmFjdG9yeSNjcmVhdGVSb2xlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZUFkYXB0ZXIoKSB7Ci0JCWlmIChyb2xlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJvbGVJdGVtUHJvdmlkZXIgPSBuZXcgUm9sZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gcm9sZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db3JlY29udGVudEFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRhc2tBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrQWRhcHRlcigpIHsKLQkJaWYgKHRhc2tJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGFza0l0ZW1Qcm92aWRlciA9IG5ldyBUYXNrSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHRhc2tJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuV29ya3Byb2R1Y3RzQWRhcHRlckZhY3RvcnkjY3JlYXRlQXJ0aWZhY3RBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcnRpZmFjdEFkYXB0ZXIoKSB7Ci0JCWlmIChteUFydGlmYWN0SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW15QXJ0aWZhY3RJdGVtUHJvdmlkZXIgPSBuZXcgQXJ0aWZhY3RJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbXlBcnRpZmFjdEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdEFkYXB0ZXIoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3b3JrUHJvZHVjdEl0ZW1Qcm92aWRlciA9IG5ldyBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gd29ya1Byb2R1Y3RJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuV29ya3Byb2R1Y3RzQWRhcHRlckZhY3RvcnkjY3JlYXRlRGVsaXZlcmFibGVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyYWJsZUFkYXB0ZXIoKSB7Ci0JCWlmIChteURlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW15RGVsaXZlcmFibGVJdGVtUHJvdmlkZXIgPSBuZXcgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHN1cGVyLmNyZWF0ZURlbGl2ZXJhYmxlQWRhcHRlcigpKTsKLQkJfQotCi0JCXJldHVybiBteURlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLldvcmtwcm9kdWN0c0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZU91dGNvbWVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRjb21lQWRhcHRlcigpIHsKLQkJaWYgKG15T3V0Y29tZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlteU91dGNvbWVJdGVtUHJvdmlkZXIgPSBuZXcgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHN1cGVyLmNyZWF0ZU91dGNvbWVBZGFwdGVyKCkpOwotCQl9Ci0KLQkJcmV0dXJuIG15T3V0Y29tZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25BZGFwdGVyKCkgewotCQlpZiAobWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQltZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyID0gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZU1ldGhvZExpYnJhcnlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RMaWJyYXJ5QWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIGFkYXB0ZXJzLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByb2Nlc3NGYW1pbHlBZGFwdGVyKCkKLQkgKi8KLQkvKgotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NGYW1pbHlBZGFwdGVyKCkgewotCQlpZiAocHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyID0gbmV3IFByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlcjsKLQl9Ci0JKi8KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnRQYWNrYWdlQWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyBhZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFBsdWdpbkFkYXB0ZXIoKSB7Ci0JCU1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBhZGFwdGVyID0gbmV3IE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJYWRhcHRlci5zZXRNb2RlbFN0cnVjdHVyZShNb2RlbFN0cnVjdHVyZS5ERUZBVUxUKTsKLQkJLy8gYWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5NZXRob2Rtb2RlbHNBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzQ29tcG9uZW50QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5NZXRob2Rtb2RlbHNBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NQYWNrYWdlQWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyBhZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnRjYXRlZ29yaWVzQWRhcHRlckZhY3RvcnkjY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nQWRhcHRlcigpIHsKLQkJaWYgKGRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCQlyZXR1cm4gZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnRjYXRlZ29yaWVzQWRhcHRlckZhY3RvcnkjY3JlYXRlRG9tYWluQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRG9tYWluQWRhcHRlcigpIHsKLQkJaWYgKGRvbWFpbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkb21haW5JdGVtUHJvdmlkZXIgPSBuZXcgRG9tYWluSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRvbWFpbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0R3JvdXBpbmdBZGFwdGVyKCkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgUm9sZVNldENhdGVnb3J5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyBhZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnRjYXRlZ29yaWVzQWRhcHRlckZhY3RvcnkjY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVBZGFwdGVyKCkgewotCQkvLyBpZiAoZGlzY2lwbGluZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCS8vIGRpc2NpcGxpbmVJdGVtUHJvdmlkZXIgPSBuZXcgRGlzY2lwbGluZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gfQotCQkvLwotCQkvLyByZXR1cm4gZGlzY2lwbGluZUl0ZW1Qcm92aWRlcjsKLQotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgRGlzY2lwbGluZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gYWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50Y2F0ZWdvcmllc0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVJvbGVTZXRBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0QWRhcHRlcigpIHsKLQkJLy8gaWYgKHJvbGVTZXRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkvLyByb2xlU2V0SXRlbVByb3ZpZGVyID0gbmV3IFJvbGVTZXRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gcmV0dXJuIHJvbGVTZXRJdGVtUHJvdmlkZXI7Ci0KLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IFJvbGVTZXRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIGFkYXB0ZXJzLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkNvbnRlbnRjYXRlZ29yaWVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlVG9vbEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRvb2xBZGFwdGVyKCkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgVG9vbEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gYWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQ29udGVudGNhdGVnb3JpZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVXb3JrUHJvZHVjdFR5cGVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdFR5cGVBZGFwdGVyKCkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyBhZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYUFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUd1aWRhbmNlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCkgewotCQlpZiAoZ3VpZGFuY2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZ3VpZGFuY2VJdGVtUHJvdmlkZXIgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGd1aWRhbmNlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVDaGVja2xpc3RBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDaGVja2xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUNvbmNlcHRBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25jZXB0QWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVFc3RpbWF0ZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVzdGltYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMKLQkgKiAgICAgIEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9uc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlRXN0aW1hdGluZ01ldHJpY0FkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVzdGltYXRpbmdNZXRyaWNBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUV4YW1wbGVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeGFtcGxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcmFjdGljZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByYWN0aWNlQWRhcHRlcigpIHsKLQkJaWYgKHByYWN0aWNlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByYWN0aWNlSXRlbVByb3ZpZGVyID0gbmV3IFByYWN0aWNlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBwcmFjdGljZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUmVwb3J0QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVwb3J0QWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVSb2FkbWFwQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9hZG1hcEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUmV1c2FibGVBc3NldEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJldXNhYmxlQXNzZXRBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlVGVjaG5pcXVlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVjaG5pcXVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVUZW1wbGF0ZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlbXBsYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVUZXJtRGVmaW5pdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlcm1EZWZpbml0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVUb29sTWVudG9yQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVG9vbE1lbnRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlV29ya1Byb2R1Y3RHdWlkZWxpbmVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdEd1aWRlbGluZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN0aW9uQWRhcHRlcigpIHsKLQkJaWYgKHNlY3Rpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc2VjdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBTZWN0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNlY3Rpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUN1c3RvbUNhdGVnb3J5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ3VzdG9tQ2F0ZWdvcnlBZGFwdGVyKCkgewotCQlpZiAoY3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgPSBuZXcgQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2hpdGVwYXBlckFkYXB0ZXIoKSB7Ci0JCS8vIGlmICh3aGl0ZXBhcGVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJLy8gd2hpdGVwYXBlckl0ZW1Qcm92aWRlciA9IG5ldyBXaGl0ZXBhcGVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyB9Ci0JCS8vCi0JCS8vIHJldHVybiB3aGl0ZXBhcGVySXRlbVByb3ZpZGVyOwotCi0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCWlmIChjYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciA9IG5ldyBDYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJaWYgKGRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIgPSBuZXcgRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlR3VpZGVsaW5lQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGVsaW5lQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChjb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID0gbmV3IENvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcmFjdGljZURlc2NyaXB0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVJvbGVEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRhc2tEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSB7Ci0JCWlmIChtaWxlc3RvbmVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWlsZXN0b25lSXRlbVByb3ZpZGVyID0gbmV3IE1pbGVzdG9uZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gbWlsZXN0b25lSXRlbVByb3ZpZGVyOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBoYXNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGd1aWRhbmNlSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWd1aWRhbmNlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCWd1aWRhbmNlSXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJfQotCQlpZiAobXlBcnRpZmFjdEl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlteUFydGlmYWN0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCW15QXJ0aWZhY3RJdGVtUHJvdmlkZXIgPSBudWxsOwotCQl9Ci0JCWlmIChteURlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCW15RGVsaXZlcmFibGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJbXlEZWxpdmVyYWJsZUl0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCX0KLQkJaWYgKG15T3V0Y29tZUl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlteU91dGNvbWVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJbXlPdXRjb21lSXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJfQotCQlpZiAod29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJd29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJd29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgPSBudWxsOwotCQl9Ci0KLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChhZGFwdGVycykuaXRlcmF0b3IoKTsKLQkJLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIE9iamVjdCBhZGFwdGVyID0gaXRlci5uZXh0KCk7Ci0JCS8vIGlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJRGlzcG9zYWJsZSkgewotCQkvLyAoKElEaXNwb3NhYmxlKWFkYXB0ZXIpLmRpc3Bvc2UoKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIGFkYXB0ZXJzLmNsZWFyKCk7Ci0KLQkJaWYgKCFkaXNwb3NhYmxlQWRhcHRlcnMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaXNwb3NhYmxlQWRhcHRlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSURpc3Bvc2FibGUgYWRhcHRlciA9IChJRGlzcG9zYWJsZSkgaXRlci5uZXh0KCk7Ci0JCQkJYWRhcHRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlkaXNwb3NhYmxlQWRhcHRlcnMuY2xlYXIoKTsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklSZWZlcmVuY2VyI3JlbW92ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgcmVmKSB7Ci0JCXJldHVybiBkaXNwb3NhYmxlQWRhcHRlcnMucmVtb3ZlKHJlZik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklSZWZlcmVuY2VyI2NsZWFuVXAoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFuVXAoKSB7Ci0JCUFycmF5TGlzdCBhZGFwdGVyc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KGRpc3Bvc2FibGVBZGFwdGVycykuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcikgaXRlci5uZXh0KCk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlcgotCQkJCQkmJiBhZGFwdGVyLmdldFRhcmdldCgpID09IG51bGwpIHsKLQkJCQlhZGFwdGVyc1RvUmVtb3ZlLmFkZChhZGFwdGVyKTsKLQkJCX0KLQkJfQotCQlpZiAoVG5nVXRpbC5ERUJVRykgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuY2xlYW5VcCgpOiBudW1iZXIgb2YgYWRhcHRlcnMgdG8gcmVtb3ZlOiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIGFkYXB0ZXJzVG9SZW1vdmUuc2l6ZSgpKTsKLQkJfQotCQlkaXNwb3NhYmxlQWRhcHRlcnMucmVtb3ZlQWxsKGFkYXB0ZXJzVG9SZW1vdmUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2E1Mjk5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBsaWIgPSAoRU9iamVjdCkgcGFyZW50OwotCQkJaWYgKGxpYiA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCQkuZ2V0QWRhcHRlcihsaWIsIE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQkJcmV0dXJuIGl0ZW1Qcm92aWRlciAhPSBudWxsID8gaXRlbVByb3ZpZGVyLmdldENvbmZpZ3VyYXRpb25zKCkKLQkJCQkJOiBudWxsOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjllN2JhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QbHVnaW5VSVBhY2thZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlBsdWdpblVJUGFja2FnZXNNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyIGNvbmZpZ3VyYXRpb25zOwotCQotCXByaXZhdGUgTWFwPFN0cmluZywgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcj4gcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyPigpOwotCQotCi0JLy9wcml2YXRlIFByb2Nlc3NGYW1pbGllc0l0ZW1Qcm92aWRlciBwcm9jRmFtaWxpZXM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2lucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW5zKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZU1ldGhvZFBsdWdpbigpKSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IGNoaWxkcmVuOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSAmJiAhUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5JTlNUQU5DRS5pc0ZsYXRMYXlvdXQoKSkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlMaXN0PE1ldGhvZFBsdWdpbj4gcGx1Z2lucyA9IGdldE1ldGhvZFBsdWdpbnMoKE1ldGhvZExpYnJhcnkpb2JqZWN0KTsKLQkJCWFkZENoaWxkcmVuKGNoaWxkcmVuLCBwbHVnaW5zLCBvYmplY3QpOwotCQkJQ29sbGVjdGlvbnMuc29ydChjaGlsZHJlbiwgQ29tcGFyYXRvcnMuUExVR0lOUEFDS0FHRV9DT01QQVJBVE9SKTsKLQkJfSBlbHNlIHsgCi0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJaWYgKGNvbGxlY3Rpb24gaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJY2hpbGRyZW4gPSAoTGlzdCkgY29sbGVjdGlvbjsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KGNvbGxlY3Rpb24pOwotCQkJfQotCQkJLy8gc2V0IHBhcmVudHMKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoaXRlci5uZXh0KCksCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgYWRhcHRlcikuc2V0UGFyZW50KHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJQ29sbGVjdGlvbnMuc29ydChjaGlsZHJlbiwgQ29tcGFyYXRvcnMuUExVR0lOUEFDS0FHRV9DT01QQVJBVE9SKTsKLQkJfQotCQlpZiAoY29uZmlndXJhdGlvbnMgPT0gbnVsbCkgewotCQkJY29uZmlndXJhdGlvbnMgPSBuZXcgQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJCShNZXRob2RMaWJyYXJ5KSBvYmplY3QsIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFN0cmluZygiX1VJX0NvbmZpZ3VyYXRpb25zX3RleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljaGlsZHJlbi5hZGQoY29uZmlndXJhdGlvbnMpOwotCi0JCS8vIFJlbW92ZSAnUHJvY2VzcyBGYW1pbGllcycgdW50aWwgaXQgaXMgZnVsbHkgaW1wbGVtZW50ZWQKLQkJLy8KLQkJLy8gaWYocHJvY0ZhbWlsaWVzID09IG51bGwpIHsKLQkJLy8gcHJvY0ZhbWlsaWVzID0gbmV3IFByb2Nlc3NGYW1pbGllc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJLy8gKE1ldGhvZExpYnJhcnkpIG9iamVjdCwKLQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0ZhbWlsaWVzX3RleHQiKSk7Ci0JCS8vIH0KLQkJLy8gY2hpbGRyZW4uYWRkKHByb2NGYW1pbGllcyk7Ci0JCQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZENoaWxkcmVuKENvbGxlY3Rpb24gY2hpbGRyZW4sIExpc3Q8TWV0aG9kUGx1Z2luPiBwbHVnaW5zLCBPYmplY3QgcGFyZW50KSB7Ci0JCVBsdWdpblVJUGFja2FnZXNNYXAgbWFwID0gbmV3IFBsdWdpblVJUGFja2FnZXNNYXAoKTsKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RQbHVnaW4+IGl0ZXIgPSBwbHVnaW5zLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgcGx1Z2luTmFtZSA9IHBsdWdpbi5nZXROYW1lKCk7Ci0JCQlpbnQgZG90SWR4ID0gcGx1Z2luTmFtZS5pbmRleE9mKFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIuUEFDS0FHRV9TRVBBUkFUT1IpOwotCQkJaWYgKGRvdElkeCAhPSAtMSkgewotCQkJCW1hcC5hZGQocGx1Z2luTmFtZS5zdWJzdHJpbmcoMCwgZG90SWR4KSwgcGx1Z2luKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hpbGRyZW4uYWRkKHBsdWdpbik7Ci0JCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChwbHVnaW4sCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgYWRhcHRlcikuc2V0UGFyZW50KHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlDb2xsZWN0aW9uPFN0cmluZz4gZXhpc3RpbmdOYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJZm9yIChJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBTZXQ8TWV0aG9kUGx1Z2luPj4+IGl0ZXIgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5PFN0cmluZywgU2V0PE1ldGhvZFBsdWdpbj4+IGVudHJ5ID0gaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9IGVudHJ5LmdldEtleSgpOwotCQkJU2V0PE1ldGhvZFBsdWdpbj4gcGx1Z1NldCA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLmdldChuYW1lKTsKLQkJCWlmIChwcm92aWRlciA9PSBudWxsKSB7Ci0JCQkJcHJvdmlkZXIgPSBuZXcgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbmFtZSwgcGx1Z1NldCk7Ci0JCQkJcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLnB1dChuYW1lLCBwcm92aWRlcik7Ci0JCQl9IGVsc2UgewotCQkJCXByb3ZpZGVyLnNldFBsdWdpbnMocGx1Z1NldCk7Ci0JCQl9Ci0JCQlleGlzdGluZ05hbWVzLmFkZChuYW1lKTsKLQkJCXByb3ZpZGVyLnNldFBhcmVudChwYXJlbnQpOwotCQkJY2hpbGRyZW4uYWRkKHByb3ZpZGVyKTsKLQkJfQotCQlyZXRhaW5QbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnMoZXhpc3RpbmdOYW1lcyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZXRhaW5QbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnMoQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcga2V5TmFtZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCFuYW1lcy5jb250YWlucyhrZXlOYW1lKSkgewotCQkJCVBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSBwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAuZ2V0KGtleU5hbWUpOwotCQkJCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJCXByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3Q8TWV0aG9kUGx1Z2luPiBnZXRNZXRob2RQbHVnaW5zKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlMaXN0PE1ldGhvZFBsdWdpbj4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4oKTsKLQkJRUxpc3QgZWxlbWVudHMgPSBsaWJyYXJ5LmVDb250ZW50cygpOwotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCWl0ZW1zLmFkZCgoTWV0aG9kUGx1Z2luKWVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0KLQlwdWJsaWMgT2JqZWN0IGdldENvbmZpZ3VyYXRpb25zKCkgewotCQlyZXR1cm4gY29uZmlndXJhdGlvbnM7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcm9jZXNzRmFtaWxpZXMoKSB7Ci0JCS8vcmV0dXJuIHByb2NGYW1pbGllczsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVBZGRDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS51dGlsLkNvbGxlY3Rpb24sIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZChzdXBlci5jcmVhdGVBZGRDb21tYW5kKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoY29uZmlndXJhdGlvbnMgIT0gbnVsbCkgewotCQkJY29uZmlndXJhdGlvbnMuZGlzcG9zZSgpOwotCQkJY29uZmlndXJhdGlvbnMgPSBudWxsOwotCQl9Ci0JCQotCQlpZiAocGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwICE9IG51bGwpIHsKLQkJCXBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5jbGVhcigpOwotCQkJcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwID0gbnVsbDsKLQkJfQotCQkKLQkJLyoKLQkJaWYgKHByb2NGYW1pbGllcyAhPSBudWxsKSB7Ci0JCQlwcm9jRmFtaWxpZXMuZGlzcG9zZSgpOwotCQkJcHJvY0ZhbWlsaWVzID0gbnVsbDsKLQkJfQotCQkqLwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcmV0dXJuIHRoZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGZvciB0aGUgcGx1Z2luIC0gZWl0aGVyIGEgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIG9yIGEgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlci4gbnVsbCBpZiBub25lIGZvdW5kCi0JICovCi0JcHVibGljIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZ2V0UGx1Z2luSXRlbVByb3ZpZGVyKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBwbHVnaW4uZ2V0TmFtZSgpOwotCQlpbnQgZG90SWR4ID0gcGx1Z2luTmFtZS5pbmRleE9mKFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIuUEFDS0FHRV9TRVBBUkFUT1IpOwotCQlpZiAoZG90SWR4ICE9IC0xKSB7Ci0JCQlTdHJpbmcgcGFja2FnZVByb3ZpZGVyTmFtZSA9IHBsdWdpbk5hbWUuc3Vic3RyaW5nKDAsIGRvdElkeCk7Ci0JCQlpZiAocGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwICE9IG51bGwpIHsKLQkJCQlQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLmdldChwYWNrYWdlUHJvdmlkZXJOYW1lKTsKLQkJCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCQkJfQotCQkJfQkJCQotCQl9IGVsc2UgewotCQkJcmV0dXJuIChNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkuZ2V0QWRhcHRlcihwbHVnaW4sIE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kUGFja2FnZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMzY0NjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kUGFja2FnZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkNvbnRlbnQgUGFja2FnZXMiIGZvbGRlciBpbiB0aGUgTGlicmFyeQotICogdmlldy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlbmFtZWQgYXMgIkNvbnRlbnRQYWNrYWdlc0l0ZW1Qcm92aWRlciIgaW4gRVBGIE01LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlciBleHRlbmRzIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTm90aWZpZXIgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgcGFyZW50LCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGFja2FnZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKG1zZy5nZXROb3RpZmllcigpID09IHRhcmdldCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoQ29udGVudFBhY2thZ2UuY2xhc3MpOwotCQkJaWYgKGZlYXR1cmVJZCA9PSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVMpIHsKLQkJCQlib29sZWFuIG5vdGlmeSA9IGZhbHNlOwotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLk1PVkU6Ci0JCQkJCU9iamVjdCBvYmogPSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJbm90aWZ5ID0gYWNjZXB0QXNDaGlsZChvYmopOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCW9iaiA9IG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWZvcl9jaGVjazogZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCWlmIChhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZm9yX2NoZWNrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQljb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlmb3JfY2hlY2s6IGZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlpZiAoYWNjZXB0QXNDaGlsZChpdGVyLm5leHQoKSkpIHsKLQkJCQkJCQlub3RpZnkgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGZvcl9jaGVjazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCX0KLQkJCQlpZiAobm90aWZ5KSB7Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obXNnLCB0aGlzLCB0cnVlLAotCQkJCQkJCWZhbHNlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoCi0JCQkJCSgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkuZ2V0Q2hpbGRQYWNrYWdlcygpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfQ09OVEVOVF9QQUNLQUdFKTsgCi0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIENvbnRlbnRQYWNrYWdlLmNsYXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSAoTGlzdCkgc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQotCQkvLyBzb3J0aW5nIHRoZSBjb250ZW50IHBhY2thZ2VzCi0JCS8vCi0JCUNvbGxlY3Rpb25zLnNvcnQoY2hpbGRyZW4sIENvbXBhcmF0b3JzLkRFRkFVTFRfQ09NUEFSQVRPUik7Ci0KLQkJLy8gc2V0IHBhcmVudCBmb3IgY2hpbGRyZW4KLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoY2hpbGQsCi0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgYWRhcHRlcikuc2V0UGFyZW50KG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDAyZjA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlBsdWdpblVJUGFja2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5TdHJ1Y3R1cmVkTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBtZXRob2QgcGx1Zy1pbiBpbiB0aGUgTGlicmFyeQotICogdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIGV4dGVuZHMgU3RydWN0dXJlZE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciwgSUxpYnJhcnlJdGVtUHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gY2hpbGRyZW47Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgb2YgdGhpcyBJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIG9iamVjdDsKLQotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJCVN0cmluZyBuYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJT2JqZWN0IGNoaWxkID0gbmV3IENvbnRlbnRJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIHBsdWdpbiwKLQkJCQkJZ2V0TW9kZWxTdHJ1Y3R1cmUoKSk7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Byb2Nlc3Nlc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIHBsdWdpbiwKLQkJCQkJZ2V0TW9kZWxTdHJ1Y3R1cmUoKSk7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbi5jbGVhcigpOwotCQkJY2hpbGRyZW4gPSBudWxsOwotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKChNZXRob2RQbHVnaW4pIG9iamVjdCkuZ2V0VXNlckNoYW5nZWFibGUoKS5ib29sZWFuVmFsdWUoKSkgPyBVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJLmdldEltYWdlKCJmdWxsL29iajE2L01ldGhvZFBsdWdpbiIpIDogLy8kTk9OLU5MUy0xJAotCQkJCVVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGx1Z2luX2dyZXkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE1ldGhvZFBsdWdpbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX0NPUFlSSUdIVF9TVEFURU1FTlQ6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTkFNRToKLQkJCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIHRydWUpKTsKLQkJCVRuZ1V0aWwucmVmcmVzaFBsdWdpbkV4dGVuZGVycyh0aGlzLCBub3RpZmljYXRpb24sIHRydWUsIHRydWUpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBuYW1lID0gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCQkKLQkJaWYgKChnZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpICYmICFQbHVnaW5VSVBhY2thZ2VDb250ZXh0LklOU1RBTkNFLmlzRmxhdExheW91dCgpKSB7Ci0JCQlTdHJpbmcgZGVsdGFOYW1lID0gUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlci5nZXROYW1lRGVsdGEoKFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpZ2V0UGFyZW50KCksIG9iamVjdCk7Ci0JCQlyZXR1cm4gZGVsdGFOYW1lOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCX0KLQotCQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Njk2Y2NiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1BsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlBsdWdpblVJUGFja2FnZXNNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyOwotCi0vKioKLSAqIEl0ZW0gUHJvdmlkZXIgQWRhcHRlciB0aGF0IHJlcHJlc2VudHMgYSBwbHVnaW4tcGFja2FnZS4gIFRoaXMgaXMgYSBVSSBmb2xkZXIgb25seQotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElMaWJyYXJ5SXRlbVByb3ZpZGVyLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9TRVBBUkFUT1IgPSAiLiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQkKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQotCXByaXZhdGUgQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnM7Ci0KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXI+IHBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcj4oKTsKLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgU3RyaW5nIHBhY2thZ2VOYW1lLCBDb2xsZWN0aW9uPE1ldGhvZFBsdWdpbj4gcGx1Z2lucykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMubmFtZSA9IHBhY2thZ2VOYW1lOwotCQl0aGlzLnBsdWdpbnMgPSBwbHVnaW5zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgb2YgdGhpcyBJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbmFtZTsgCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9wYWNrYWdlX29iaiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZURlbHRhKFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIgdG9wT2JqZWN0LCBPYmplY3QgYm90dG9tT2JqZWN0KSB7Ci0JCQotCQlTdHJpbmcgdG9wTmFtZT0gdG9wT2JqZWN0LmdldEZ1bGxOYW1lKCk7Ci0JCVN0cmluZyBib3R0b21OYW1lID0gbnVsbDsKLQkJaWYgKGJvdHRvbU9iamVjdCBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpIHsKLQkJCWJvdHRvbU5hbWUgPSAoKFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpYm90dG9tT2JqZWN0KS5nZXRGdWxsTmFtZSgpOwotCQkJCi0JCX0gZWxzZSBpZiAoYm90dG9tT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlib3R0b21OYW1lID0gKChNZXRob2RQbHVnaW4pYm90dG9tT2JqZWN0KS5nZXROYW1lKCk7Ci0JCX0KLQkJCi0JCWlmKGJvdHRvbU5hbWUgPT0gbnVsbCB8fCB0b3BOYW1lLmVxdWFscyhib3R0b21OYW1lKSkKLQkJCXJldHVybiB0b3BOYW1lOwotCQl0cnkgewotCQkJU3RyaW5nIGRlbHRhbmFtZT0gYm90dG9tTmFtZS5zdWJzdHJpbmcodG9wTmFtZS5sZW5ndGgoKSsxKTsKLQkJCXJldHVybiBkZWx0YW5hbWU7Ci0JCX0gY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGJvdHRvbU5hbWU7Ci0JCX0KLQl9Ci0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbjxPYmplY3Q+IGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCXJldHVybiBhZGRDaGlsZHJlbihwbHVnaW5zKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPE9iamVjdD4gYWRkQ2hpbGRyZW4oQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnMpIHsKLQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJUGx1Z2luVUlQYWNrYWdlc01hcCBtYXAgPSBuZXcgUGx1Z2luVUlQYWNrYWdlc01hcCgpOwotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZFBsdWdpbj4gaXRlciA9IHBsdWdpbnMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBkZWx0YU5hbWUgPSBnZXROYW1lRGVsdGEodGhpcywgcGx1Z2luKTsKLQkJCWludCBkb3RJZHggPSBkZWx0YU5hbWUuaW5kZXhPZihQQUNLQUdFX1NFUEFSQVRPUik7Ci0JCQlpZiAoZG90SWR4ICE9IC0xKSB7Ci0JCQkJbWFwLmFkZChkZWx0YU5hbWUuc3Vic3RyaW5nKDAsIGRvdElkeCksIHBsdWdpbik7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkcmVuLmFkZChwbHVnaW4pOwotCQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQocGx1Z2luLAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudCh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGV4aXN0aW5nTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgU2V0PE1ldGhvZFBsdWdpbj4+PiBpdGVyID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeTxTdHJpbmcsIFNldDxNZXRob2RQbHVnaW4+PiBlbnRyeSA9IGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCVNldDxNZXRob2RQbHVnaW4+IHBsdWdTZXQgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlciBwcm92aWRlciA9IHBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5nZXQoZ2V0RnVsbE5hbWUoKSArIFBBQ0tBR0VfU0VQQVJBVE9SICsgbmFtZSk7Ci0JCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkgewotCQkJCXByb3ZpZGVyID0gbmV3IFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG5hbWUsIHBsdWdTZXQpOwotCQkJCXBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5wdXQoZ2V0RnVsbE5hbWUoKSArIFBBQ0tBR0VfU0VQQVJBVE9SICsgbmFtZSwgcHJvdmlkZXIpOwotCQkJfSBlbHNlIHsKLQkJCQlwcm92aWRlci5zZXRQbHVnaW5zKHBsdWdTZXQpOwotCQkJfQotCQkJZXhpc3RpbmdOYW1lcy5hZGQoZ2V0RnVsbE5hbWUoKSArIFBBQ0tBR0VfU0VQQVJBVE9SICsgbmFtZSk7Ci0JCQlwcm92aWRlci5zZXRQYXJlbnQodGhpcyk7Ci0JCQljaGlsZHJlbi5hZGQocHJvdmlkZXIpOwotCQl9Ci0JCXJldGFpblBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVycyhleGlzdGluZ05hbWVzKTsKLQkJQ29sbGVjdGlvbnMuc29ydChjaGlsZHJlbiwgQ29tcGFyYXRvcnMuUExVR0lOUEFDS0FHRV9DT01QQVJBVE9SKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgewotCQlTdHJpbmcgZnVsbE5hbWUgPSBnZXROYW1lKCk7Ci0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKLQkJd2hpbGUgKHBhcmVudCBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpIHsKLQkJCWZ1bGxOYW1lID0gKChQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKXBhcmVudCkuZ2V0TmFtZSgpICsgUEFDS0FHRV9TRVBBUkFUT1IgKyBmdWxsTmFtZTsKLQkJCXBhcmVudCA9ICgoUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcilwYXJlbnQpLmdldFBhcmVudCgpOwotCQl9Ci0JCXJldHVybiBmdWxsTmFtZTsKLQkJCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gcGFyZW50OwotCQlyZXR1cm4gdGFyZ2V0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kUGx1Z2luLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTkFNRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIHRydWUpKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIHJlbW92ZSB0aGlzIGZyb20gdGhlIHBsdWdpbnMnIGFkYXB0ZXIgbGlzdAotCQlpZiAocGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwICE9IG51bGwpIHsKLQkJCXBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5jbGVhcigpOwotCQkJcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwID0gbnVsbDsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZXRhaW5QbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnMoQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcga2V5TmFtZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCFuYW1lcy5jb250YWlucyhrZXlOYW1lKSkgewotCQkJCVBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSBwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAuZ2V0KGtleU5hbWUpOwotCQkJCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJCXByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IGdldFBsdWdpbnMoKSB7Ci0JCXJldHVybiBwbHVnaW5zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBsdWdpbnMoQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnMpIHsKLQkJdGhpcy5wbHVnaW5zID0gcGx1Z2luczsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEByZXR1cm4gdGhlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZm9yIHRoZSBwbHVnaW4gLSBlaXRoZXIgYSBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgb3IgYSBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyLiBudWxsIGlmIG5vbmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgSXRlbVByb3ZpZGVyQWRhcHRlciBnZXRQbHVnaW5JdGVtUHJvdmlkZXIoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlTdHJpbmcgZGVsdGFOYW1lID0gZ2V0TmFtZURlbHRhKHRoaXMsIHBsdWdpbik7Ci0JCWludCBkb3RJZHggPSBkZWx0YU5hbWUuaW5kZXhPZihQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyLlBBQ0tBR0VfU0VQQVJBVE9SKTsKLQkJaWYgKGRvdElkeCAhPSAtMSkgewotCQkJU3RyaW5nIHBhY2thZ2VQcm92aWRlck5hbWUgPSBkZWx0YU5hbWUuc3Vic3RyaW5nKDAsIGRvdElkeCk7Ci0JCQlpZiAocGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwICE9IG51bGwpIHsKLQkJCQlQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLmdldChnZXRGdWxsTmFtZSgpICsgUEFDS0FHRV9TRVBBUkFUT1IgKyBwYWNrYWdlUHJvdmlkZXJOYW1lKTsKLQkJCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCQkJfQotCQkJfQkJCQotCQl9IGVsc2UgewotCQkJcmV0dXJuIChNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkuZ2V0QWRhcHRlcihwbHVnaW4sIE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJhY3RpY2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1ByYWN0aWNlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZWZlZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJhY3RpY2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBwcmFjdGljZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJhY3RpY2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByYWN0aWNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSURlZmF1bHROYW1lU2V0dGVyIHsKLQotCXB1YmxpYyBQcmFjdGljZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByYWN0aWNlSXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlX1N1YlByYWN0aWNlcygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVQcmFjdGljZSgpKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJhY3RpY2VJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFByYWN0aWNlX1N1YlByYWN0aWNlcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlPYmplY3QgcGFyZW50ID0gVG5nVXRpbAotCQkJCS5nZXROYXZpZ2F0b3JQYXJlbnRJdGVtUHJvdmlkZXIoKEd1aWRhbmNlKSBvYmplY3QpOwotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9QcmFjdGljZV90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCWlmICgoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KS5nZXROb2RlaWNvbigpICE9IG51bGwpIHsKLQkJCQlVUkkgaW1nVXJpID0gVG5nVXRpbC5nZXRGdWxsUGF0aG9mTm9kZW9yU2hhcGVJY29uVVJJKAotCQkJCQkJKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0LAotCQkJCQkJKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSk7Ci0JCQkJT2JqZWN0IGltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTaGFyZWRJbWFnZShpbWdVcmkpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKQotCQkJCQlyZXR1cm4gaW1hZ2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKHRoaXMsIG1zZyk7Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJUHJhY3RpY2UgcHJhY3RpY2UgPSAoUHJhY3RpY2UpIGdldFBhcmVudChvYmopOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUocHJhY3RpY2UuZ2V0U3ViUHJhY3RpY2VzKCksCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmosIExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19QUkFDVElDRSk7IAotCQl9Ci0JfQotCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFUzsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gUHJhY3RpY2UuY2xhc3M7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoCi0JCQkJZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwgaW5kZXgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyM2Y0NWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQkvLyBpZihjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJLy8gY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCkpOwotCQkvLyAvLwotCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzUGFja2FnZV9CcmVha2Rvd25FbGVtZW50cygpKTsKLQkJLy8gLy8KLQkJLy8gY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BhY2thZ2VfV0JTKCkpOwotCQkvLyAvLwotCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzUGFja2FnZV9PQlMoKSk7Ci0JCS8vIC8vCi0JCS8vIGNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlX1BCUygpKTsKLQkJLy8gfQotCQkvLyByZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBvYmplY3QpLmdldFByb2Nlc3MoKTsKLQkJaWYgKHByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJuIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzQ29tcG9uZW50X3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUHJvY2Vzc0NvbXBvbmVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19OQU1FOgotCQkJUHJvY2Vzc0NvbXBvbmVudCBwYyA9IChQcm9jZXNzQ29tcG9uZW50KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChwYy5nZXRQcm9jZXNzKCkgIT0gbnVsbCkgewotCQkJCWJvb2xlYW4gb2xkID0gcGMuZ2V0UHJvY2VzcygpLmVEZWxpdmVyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcGMuZ2V0UHJvY2VzcygpLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQkJcGMuZ2V0UHJvY2VzcygpLnNldE5hbWUocGMuZ2V0TmFtZSgpKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlwYy5nZXRQcm9jZXNzKCkuZVNldERlbGl2ZXIob2xkKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCi0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3NGYW1pbGllc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc0ZhbWlsaWVzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZjgwNTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc0ZhbWlsaWVzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIlByb2Nlc3MgRmFtaWxpZXMiIGZvbGRlciBpbiB0aGUgTGlicmFyeQotICogdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NGYW1pbGllc0l0ZW1Qcm92aWRlciBleHRlbmRzIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NGYW1pbGllc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZExpYnJhcnkgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgcGFyZW50LCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzRmFtaWx5KCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE1ldGhvZExpYnJhcnlfUHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgUHJvY2Vzc0ZhbWlseTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3NGYW1pbGllcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzRmFtaWx5KQotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKE1ldGhvZExpYnJhcnkpIHRhcmdldCkKLQkJCQkJLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLCAoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfUFJPQ0VTU19GQU1JTFkpOyAKLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKE1ldGhvZExpYnJhcnkpIHRhcmdldCkKLQkJCQkJLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLCAoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfQ09ORklHVVJBVElPTik7IAotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeS5jbGFzczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRiZDMyYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlIHByb2Nlc3MgZmFtaWx5IGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Qcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCUVPYmplY3QgbGliID0gKEVPYmplY3QpIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQlpZiAobGliID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCS5nZXRBZGFwdGVyKGxpYiwgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXJldHVybiBpdGVtUHJvdmlkZXIgIT0gbnVsbCA/IGl0ZW1Qcm92aWRlci5nZXRQcm9jZXNzRmFtaWxpZXMoKSA6IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX1Byb2Nlc3NGYW1pbHlfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU0ZDE5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSVByb2Nlc3NJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHByb2Nlc3MgcGFja2FnZSBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJUHJvY2Vzc0l0ZW1Qcm92aWRlciwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBFQ2xhc3MgcHJvY2Vzc1R5cGU7Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NUeXBlKCkgewotCQlyZXR1cm4gcHJvY2Vzc1R5cGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVByb2Nlc3NDb21wb25lbnQoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIShjaGlsZCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpCi0JCQkJCSYmIChjaGlsZCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSkgewotCQkJCVByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJCS5hZGFwdChjaGlsZCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAocHJvY2Vzc1R5cGUgIT0gbnVsbCkKLQkJCQkJaXRlbVByb3ZpZGVyLnNldFByb2Nlc3NUeXBlKHByb2Nlc3NUeXBlKTsKLQkJCX0KLQkJfQotCi0JCUNvbGxlY3Rpb25zLnNvcnQoKExpc3QpIGNoaWxkcmVuLCBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NQYWNrYWdlQ29tcGFyYXRvcigpKTsKLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCXJldHVybiBsYWJlbDsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJRUNsYXNzIHByb2NUeXBlID0gZ2V0UHJvY2Vzc1R5cGUoKTsKLQkJaWYgKHByb2NUeXBlICE9IG51bGwpIHsKLQkJCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQob2JqZWN0KTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbAotCQkJCQkmJiBwYXJlbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Qcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlpZiAocHJvY1R5cGUKLQkJCQkJCS5lcXVhbHMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKSkpCi0JCQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybnMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVsc2UgaWYgKHByb2NUeXBlLmVxdWFscyhVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2VzcygpKSkKLQkJCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzc2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Qcm9jZXNzUGFja2FnZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzVHlwZShFQ2xhc3MgcHJvY2Vzc1R5cGUpIHsKLQkJdGhpcy5wcm9jZXNzVHlwZSA9IHByb2Nlc3NUeXBlOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCwKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmNyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZCgpIik7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXJldHVybiBuZXcgQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQoZG9tYWluLCBvd25lciwgZmVhdHVyZSwKLQkJCQkJdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uLCB0aGlzKTsKLQkJfQotCQkvLyByZXR1cm4gc3VwZXIuY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIHZhbHVlLAotCQkvLyBpbmRleCwgY29sbGVjdGlvbik7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLAotCQkJCXZhbHVlLCBpbmRleCwgY29sbGVjdGlvbiwgdGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJRUNsYXNzIHByb2Nlc3NUeXBlID0gZ2V0UHJvY2Vzc1R5cGUoKTsKLQkJCWlmIChwcm9jZXNzVHlwZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHByb2Nlc3NUeXBlLmVxdWFscyhVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENhcGFiaWxpdHlQYXR0ZXJuKCkpKSB7Ci0JCQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgaWYgKHByb2Nlc3NUeXBlLmVxdWFscyhVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2VzcygpKSkgewotCQkJCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzX3RleHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSBpZiAocHJvY2Vzc1R5cGUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpKSB7Ci0JCQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV90eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0ZUNoaWxkSW1hZ2UoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJRUNsYXNzIHByb2Nlc3NUeXBlID0gZ2V0UHJvY2Vzc1R5cGUoKTsKLQkJCWlmIChwcm9jZXNzVHlwZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHByb2Nlc3NUeXBlLmVxdWFscyhVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENhcGFiaWxpdHlQYXR0ZXJuKCkpKSB7Ci0JCQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgaWYgKHByb2Nlc3NUeXBlLmVxdWFscyhVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2VzcygpKSkgewotCQkJCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSBpZiAocHJvY2Vzc1R5cGUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpKSB7Ci0JCQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRJbWFnZShvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUFkZENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEudXRpbC5Db2xsZWN0aW9uLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlDb2xsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJLy8gY2hlY2sgdG8gZXhjbHVkZSBhbnkgcGFzdGVkLWluIHBhY2thZ2UgdGhhdCBjb250YWlucwotCQkJCS8vIHByb2Nlc3Mgb2YgZGlmZmVyZW50IHR5cGUgdGhhbiB0aGF0IG9mIHRoaXMgcGFja2FnZQotCQkJCS8vCi0JCQkJaWYgKCFQcm9jZXNzVXRpbC5oYXNQcm9jZXNzTm90T2ZUeXBlKChQcm9jZXNzUGFja2FnZSkgZWxlbWVudCwKLQkJCQkJCXByb2Nlc3NUeXBlKSkgewotCQkJCQlzZWxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQotCQkvLyByZXR1cm4gc3VwZXIuY3JlYXRlQWRkQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLAotCQkvLyBpbmRleCk7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoCi0JCQkJZG9tYWluLCBvd25lciwgZmVhdHVyZSwgc2VsZWN0aW9uLCBpbmRleCkpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGZlYXR1cmVDaGFuZ2VkKEVPYmplY3Qgb2JqZWN0LAotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQKLQkJCQkJCSYmIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpIHsKLQkJCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBvYmplY3QpLmdldFByb2Nlc3MoKTsKLQkJCQkJaWYgKHByb2MgIT0gbnVsbCkgewotCQkJCQkJcHJvYy5zZXROYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFkODE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIlByb2Nlc3NlcyIgZm9sZGVyIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0UHJvY2Vzc2VzSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTX0NPTlRSSUJVVElPTlNfTEFCRUwgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJLmdldFN0cmluZygiX1VJX1Byb2Nlc3NDb250cmlidXRpb25zX3RleHQiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBNZXRob2RQbHVnaW4gcGx1Z2luOwotCi0JcHJpdmF0ZSBQcm9jZXNzUGFja2FnZSBwcm9jZXNzQ29udHJpYnV0aW9uc1BhY2thZ2U7Ci0JcHJpdmF0ZSBQcm9jZXNzUGFja2FnZSBjYXBhYmlsaXR5UGF0dGVyblBhY2thZ2U7Ci0JcHJpdmF0ZSBQcm9jZXNzUGFja2FnZSBkZWxpdmVyeVByb2Nlc3NQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiwgTW9kZWxTdHJ1Y3R1cmUgbW9kZWxTdHJ1Y3QpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIG1vZGVsU3RydWN0KTsKLQkJdGhpcy5wbHVnaW4gPSBwbHVnaW47Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlIHBrZyA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlKSBVbWFVdGlsCi0JCQkJCS5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJCQkJbW9kZWxTdHJ1Y3QuY2FwYWJpbGl0eVBhdHRlcm5QYXRoKTsKLQkJCWNhcGFiaWxpdHlQYXR0ZXJuUGFja2FnZSA9IHBrZzsKLQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCVByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkJCS5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLmFkYXB0KHBrZywKLQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlhZGFwdGVyLnNldFByb2Nlc3NUeXBlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKSk7Ci0JCQkJYWRhcHRlci5zZXRMYWJlbChMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX0NhcGFiaWxpdHlQYXR0ZXJuc190ZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCQkJYWRhcHRlci5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJY2hpbGRyZW4uYWRkKHBrZyk7Ci0JCQl9Ci0JCQlwa2cgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSkgVW1hVXRpbAotCQkJCQkuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLCBtb2RlbFN0cnVjdC5kZWxpdmVyeVByb2Nlc3NQYXRoKTsKLQkJCWRlbGl2ZXJ5UHJvY2Vzc1BhY2thZ2UgPSBkZWxpdmVyeVByb2Nlc3NQYWNrYWdlOwotCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCQkJLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSkuYWRhcHQocGtnLAotCQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWFkYXB0ZXIuc2V0UHJvY2Vzc1R5cGUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3MoKSk7Ci0JCQkJYWRhcHRlci5zZXRMYWJlbChMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlhZGFwdGVyLnNldFBhcmVudCh0aGlzKTsKLQkJCQljaGlsZHJlbi5hZGQocGtnKTsKLQkJCX0KLQotCQkJaWYgKHByb2Nlc3NDb250cmlidXRpb25FbmFibGVkKSB7Ci0JCQkJY2hpbGRyZW4uYWRkKGdldFByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSgpKTsKLQkJCX0KLQotCQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJLy8gU3RyaW5nIG5hbWUgPQotCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUGxhbm5pbmdUZW1wbGF0ZXNfZ3JvdXAiKTsKLQkJCS8vIE9iamVjdCBjaGlsZCA9IG5ldyBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCS8vIHBsdWdpbiwgbmFtZSk7Ci0JCQkvLyBjaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gY29tbWVudCBvdXQgdGhlIHBsYW5uaW5nIHRlbXBsYXRlcyBmb3IgVE5HIHJlbGVhc2Ugb25lIGF0Ci0JCQkvLyAyMDA1LTA1LTA5Ci0JCQkvLyBwa2cgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSkKLQkJCS8vIFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJLy8gbW9kZWxTdHJ1Y3QucHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVQYXRoKTsKLQkJCS8vIGlmKHBrZyA9PSBudWxsKSB7Ci0JCQkvLyBwa2cgPQotCQkJLy8gTW9kZWxTdHJ1Y3R1cmUuY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVQYWNrYWdlKHBsdWdpbik7Ci0JCQkvLyB9Ci0JCQkvLyBhZGFwdGVyID0gKFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKQotCQkJLy8gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLmFkYXB0KHBrZywKLQkJCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkvLyBhZGFwdGVyLnNldFByb2Nlc3NUeXBlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkpOwotCQkJLy8gYWRhcHRlci5zZXRMYWJlbChMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9QbGFubmluZ1RlbXBsYXRlc190ZXh0IikpOwotCQkJLy8gY2hpbGRyZW4uYWRkKHBrZyk7Ci0KLQkJfSBlbHNlIHsKLQkJCWlmIChwcm9jZXNzQ29udHJpYnV0aW9uRW5hYmxlZCkgewotCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IGdldFByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSgpOwotCQkJCWlmICghY2hpbGRyZW4uY29udGFpbnMocGtnKSkgewotCQkJCQljaGlsZHJlbi5hZGQocGtnKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IGdldFByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSgpOwotCQkJCWNoaWxkcmVuLnJlbW92ZShwa2cpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXByaXZhdGUgUHJvY2Vzc1BhY2thZ2UgZ2V0UHJvY2Vzc0NvbnRyaWJ1dGlvbnNQYWNrYWdlKCkgewotCQlpZiAocHJvY2Vzc0NvbnRyaWJ1dGlvbnNQYWNrYWdlID09IG51bGwpIHsKLQkJCXByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlKSBVbWFVdGlsCi0JCQkJCS5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJCQkJbW9kZWxTdHJ1Y3QucHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGgpOwotCQkJaWYgKHByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSA9PSBudWxsKSB7Ci0JCQkJcHJvY2Vzc0NvbnRyaWJ1dGlvbnNQYWNrYWdlID0gTW9kZWxTdHJ1Y3R1cmUKLQkJCQkJCS5jcmVhdGVQcm9jZXNzQ29udHJpYnV0aW9uUGFja2FnZShwbHVnaW4pOwotCQkJfQotCQkJUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJLmFkYXB0KHByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSwKLQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJYWRhcHRlci5zZXRMYWJlbChQUk9DRVNTX0NPTlRSSUJVVElPTlNfTEFCRUwpOwotCQkJYWRhcHRlci5zZXRQYXJlbnQodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHVibGljIFByb2Nlc3NQYWNrYWdlIGdldENhcGFiaWxpdHlQYXR0ZXJuUGFja2FnZSgpIHsKLQkJcmV0dXJuIGNhcGFiaWxpdHlQYXR0ZXJuUGFja2FnZTsKLQl9Ci0JCi0JcHVibGljIFByb2Nlc3NQYWNrYWdlIGdldERlbGl2ZXJ5UHJvY2Vzc1BhY2thZ2UoKSB7Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NQYWNrYWdlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRhZTM1OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpdGVtIHByb3ZpZGVycyBmb3IgZGlzcGxheWluZyBhbmQgZWRpdGluZyBtZXRob2QgbGlicmFyeSBlbGVtZW50cyBpbiB0aGUgTGlicmFyeSB2aWV3LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNDY4YmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgZGlzcGxheWluZyBhbmQgZWRpdGluZyBtZXRob2QgbGlicmFyeSBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjdlNDE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBJdGVtIHByb3ZpZGVyIGZvciBhY3Rpdml0eSB1c2VkIGJ5IGNvbmZpZ3VyYXRpb24gdmlldyBhbmQgZmlsdGVyIGRpYWxvZy4gVGhpcyBpdGVtIHByb3ZpZGVyIHJldHVybgotICogY2hpbGRyZW4gbGlzdCB0aGF0IGNvbnRhaW4gb25seSBpdHMgb3duIGFjdGl2aXRpZXMgYWZ0ZXIgcmVhbGl6YXRpb24gYWdhaW5zdCBzZWxlY3RlZCBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1biAzMCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldE9iamVjdChvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3QoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0RUNsYXNzZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3QgY2hpbGQpIHsKLQkJcmV0dXJuIGNoaWxkIGluc3RhbmNlb2YgQWN0aXZpdHk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2lzUm9sbGVkVXAoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUm9sbGVkVXAoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjYmFzaWNTZXRSb2xsZWRVcChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIGJhc2ljU2V0Um9sbGVkVXAoYm9vbGVhbiBiKSB7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI3NldFJvbGxlZFVwKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sbGVkVXAoYm9vbGVhbiBiKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0FjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0FjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2ZkMTlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcihBY3Rpdml0eSB2YWx1ZSwgT2JqZWN0IG93bmVyLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKEFjdGl2aXR5IGFjdGl2aXR5LCBPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhY3Rpdml0eSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkRlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChnZXRSZWZyZXNoRWxlbWVudChub3RpZmljYXRpb24pID09IGdldERlbGVnYXRlVmFsdWUoKSkgewotCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFjdGl2aXR5LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJCQlQcm9jZXNzIHByb2MgPSAoUHJvY2VzcykgZ2V0VG9wSXRlbSgpOwotCQkJCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkuYWRhcHQocHJvYywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJaWYgKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIFdCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlpdGVtUHJvdmlkZXIuc2V0UmVmcmVzaEFsbElEc1JlcXVpcmVkKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlJQlNJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJYm9vbGVhbiBvbGRSb2xsZWRVcCA9IGZhbHNlOwotCQl0cnkgewotCQkJaWYgKGRlbGVnYXRlSXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0JCQkJb2xkUm9sbGVkVXAgPSBpdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpOwotCQkJCWlmKGlzUm9sbGVkVXAoKSAhPSBvbGRSb2xsZWRVcCkgewotCQkJCQlpZihpdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpaXRlbVByb3ZpZGVyKS5iYXNpY1NldFJvbGxlZFVwKGlzUm9sbGVkVXAoKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpdGVtUHJvdmlkZXIuc2V0Um9sbGVkVXAoaXNSb2xsZWRVcCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmKGl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJLy8gcmVzdG9yZSByb2xsZWQtdXAgZmxhZwotCQkJCS8vCi0JCQkJaWYoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJCQkoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpaXRlbVByb3ZpZGVyKS5iYXNpY1NldFJvbGxlZFVwKG9sZFJvbGxlZFVwKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWl0ZW1Qcm92aWRlci5zZXRSb2xsZWRVcChvbGRSb2xsZWRVcCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0RGVsZWdhdGluZ0l0ZW1Qcm92aWRlcigpewotCQlyZXR1cm4gZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAwYzk1ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5WYXJpYWJpbGl0eUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQWN0aXZpdHlBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5HcmFwaGljYWxEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5QcmVkZWNlc3Nvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkFjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFjdGl2aXR5J3MgaXRlbSBwcm92aWRlcnMgdXNlZCBieSB0aGUgUHJvY2VzcyBFZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQWN0aXZpdHlJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJUHJvY2Vzc0l0ZW1Qcm92aWRlciwgSUJTSXRlbVByb3ZpZGVyLAotCQlJVGFibGVJdGVtTGFiZWxQcm92aWRlciwgSUNvbmZpZ3VyYWJsZSwgSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCXByaXZhdGUgaW50IGlkOwotCi0JcHJvdGVjdGVkIE9iamVjdCB0b3BJdGVtID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiByb2xsZWRVcDsKLQotCXByaXZhdGUgR3JhcGhpY2FsRGF0YSBncmFwaGljYWxEYXRhOwotCi0JcHJpdmF0ZSBQcmVkZWNlc3Nvckxpc3QgcHJlZGVjZXNzb3JzOwotCi0JcHJpdmF0ZSBCb29sZWFuIGV4cGFuZGVkOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXIgYmFzZUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGNoaWxkRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVmcmVzaEFsbElEc1JlcXVpcmVkOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCXByb3RlY3RlZCBMaXN0IGNhY2hlZENoaWxkcmVuOwotCi0JcHJvdGVjdGVkIExpc3QgY2FjaGVkUm9sbHVwQ2hpbGRyZW47Ci0KLQlwcml2YXRlIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotCi0JcHJpdmF0ZSBEaXNwb3NhYmxlIGNvbnRyaWJ1dGVkV3JhcHBlcnM7Ci0KLQlwcml2YXRlIFZhcmlhYmlsaXR5SW5mbyB2YXJpYWJpbGl0eUluZm87Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZVZhcmlhYmlsaXR5SW5mbyA9IHRydWU7Ci0KLQlwcml2YXRlIERpc3Bvc2FibGUgcm9sbGVkVXBXcmFwcGVyczsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoYmFzZUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCUVPYmplY3QgY3VycmVudEJhc2UgPSAoRU9iamVjdCkgYmFzZUxpc3RlbmVyLmdldFRhcmdldCgpOwotCQkJaWYoY3VycmVudEJhc2UgIT0gbnVsbCkgewotCQkJCWN1cnJlbnRCYXNlLmVBZGFwdGVycygpLnJlbW92ZShiYXNlTGlzdGVuZXIpOwotCQkJfQotCQkJaWYgKGdldFRhcmdldCgpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldFRhcmdldCgpOwotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJCWJhc2UuZUFkYXB0ZXJzKCkucmVtb3ZlKGJhc2VMaXN0ZW5lcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKHByZWRlY2Vzc29ycyAhPSBudWxsKSB7Ci0JCQlwcmVkZWNlc3NvcnMuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYoY2FjaGVkQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJY2FjaGVkQ2hpbGRyZW4uY2xlYXIoKTsKLQkJCWNhY2hlZENoaWxkcmVuID0gbnVsbDsKLQkJfQotCQkKLQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4uY2xlYXIoKTsKLQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbnVsbDsKLQkJfQotCQkKLQkJaWYoY29udHJpYnV0ZWRXcmFwcGVycyAhPSBudWxsKSB7Ci0JCQljb250cmlidXRlZFdyYXBwZXJzLmRpc3Bvc2UoKTsKLQkJCWNvbnRyaWJ1dGVkV3JhcHBlcnMgPSBudWxsOwotCQl9Ci0JCQotCQlpZihyb2xsZWRVcFdyYXBwZXJzICE9IG51bGwpIHsKLQkJCXJvbGxlZFVwV3JhcHBlcnMuZGlzcG9zZSgpOwotCQkJcm9sbGVkVXBXcmFwcGVycyA9IG51bGw7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG9iamVjdCBjYW4gYmUgYWNjZXB0ZWQgYXMgYSBjaGlsZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBjaGlsZCkgewotCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBmaWx0ZXIuYWNjZXB0KGNoaWxkKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG9iamVjdCBjYW4gYmUgYWNjZXB0ZWQgYXMgYSByb2xsZWQtdXAgY2hpbGQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNSb2xsZWRVcENoaWxkKE9iamVjdCBjaGlsZCkgewotCQljaGlsZCA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJaWYgKGZpbHRlciAhPSBudWxsICYmICEoY2hpbGQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkJCQkmJiAhKGNoaWxkIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpKSB7Ci0JCQlyZXR1cm4gZmlsdGVyLmFjY2VwdChjaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZGVzY3JpcHRvciAoZS5nOiBhCi0JICogVGFza0Rlc2NyaXB0b3IgaXMgYXNzb2NpYXRlZCB3aXRoIGEgVGFzaykuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBnZXRPYmplY3QoRGVzY3JpcHRvciBkZXNjcmlwdG9yKTsKLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwgRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQkvLyBkaXNhbGxvdyBjcmVhdGluZyBuZXcgY2hpbGQgaWYgdGhpcyBpdGVtIHByb3ZpZGVyIGlzIHJvbGxlZCB1cAotCQkvLwotCQlpZihpc1JvbGxlZFVwKCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhvYmplY3QsIGVkaXRpbmdEb21haW4sIHNpYmxpbmcpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJLy8gaWYoaXNUb3BBY3Rpdml0eShvYmplY3QpKSB7Ci0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCS8vIChjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkvLyAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwKLQkJLy8gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGhhc2UoKSkpOwotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkvLyAoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJLy8gKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksCi0JCS8vIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUl0ZXJhdGlvbigpKSk7Ci0JCS8vIH0KLQkJLy8gZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBQaGFzZSkgewotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkvLyAoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJLy8gKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksCi0JCS8vIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUl0ZXJhdGlvbigpKSk7Ci0JCS8vIH0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2lzRXhwYW5kZWQoKQotCSAqLwotCXB1YmxpYyBCb29sZWFuIGlzRXhwYW5kZWQoKSB7Ci0JCXJldHVybiBleHBhbmRlZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldEV4cGFuZGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwYW5kZWQoQm9vbGVhbiBiKSB7Ci0JCWV4cGFuZGVkID0gYjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldElkKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRUb3BJdGVtKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFRvcEl0ZW0oKSB7Ci0JCWlmICh0b3BJdGVtID09IG51bGwpIHsKLQkJCWlmKFByb2Nlc3NVdGlsLmlzVG9wUHJvY2Vzcyh0YXJnZXQpKSB7Ci0JCQkJcmV0dXJuIHRhcmdldDsKLQkJCX0KLQkJCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQodGFyZ2V0KTsKLQkJCWlmKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IGlwID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmKGlwIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgaXA7Ci0JCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCU9iamVjdCB0b3AgPSBhZGFwdGVyLmdldFRvcEl0ZW0oKTsKLQkJCQkJCWlmICh0b3AgPT0gbnVsbCAmJiBwYXJlbnQgaW5zdGFuY2VvZiBQcm9jZXNzCi0JCQkJCQkJCSYmICgoUHJvY2VzcykgcGFyZW50KS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJCQkJdG9wID0gcGFyZW50OwotCQkJCQkJCWFkYXB0ZXIuc2V0VG9wSXRlbSh0b3ApOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIHRvcDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdG9wSXRlbTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldElkKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChpbnQgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUb3BBY3Rpdml0eShPYmplY3Qgb2JqZWN0KSB7Ci0JCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCU9iamVjdCBwYXJlbnQgPSBlT2JqLmVDb250YWluZXIoKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCVByb2Nlc3NDb21wb25lbnQgcGMgPSAoUHJvY2Vzc0NvbXBvbmVudCkgcGFyZW50OwotCQkJcmV0dXJuIG9iamVjdCA9PSBwYy5nZXRQcm9jZXNzKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGhhc0NoaWxkRGVzY3JpcHRvcihBY3Rpdml0eSBhY3QpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UGFyZW50Rm9yKE9iamVjdCBjaGlsZCwgT2JqZWN0IHBhcmVudCkgewotCQlQcm9jZXNzVXRpbC5zZXRQYXJlbnQoY2hpbGQsIHBhcmVudCwgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkpOwotCX0KLQotLy8JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldERpcmVjdENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLS8vCQlMaXN0IG15Q2hpbGRyZW47Ci0vLwkJQ2hpbGRyZW5TdG9yZSBzdG9yZSA9IGdldENoaWxkcmVuU3RvcmUob2JqZWN0KTsKLS8vCQlpZiAoc3RvcmUgIT0gbnVsbCkgewotLy8JCQlteUNoaWxkcmVuID0gc3RvcmUuZ2V0Q2hpbGRyZW4oKTsKLS8vCQl9IGVsc2UgewotLy8JCQkvLyBzdG9yZSA9IGNyZWF0ZUNoaWxkcmVuU3RvcmUob2JqZWN0KTsKLS8vCQkJTGlzdCByZXN1bHQgPSBzdG9yZSAhPSBudWxsID8gbnVsbCA6IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIG9iamVjdDsKLS8vCi0vLwkJCWZvciAoSXRlcmF0b3IgaSA9IGdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KS5pdGVyYXRvcigpOyBpCi0vLwkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaS5uZXh0KCk7Ci0vLwkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewkJCQkJCi0vLwkJCQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0vLwkJCQkJCi0vLy8vCQkJCQkvL0NoYW5nZSBmb3IgQWN0aXZpdHkgVmFyaWFiaWxpdHkuIFRvIGRvIHJlYWxpemF0aW9uIGZvcgotLy8vLwkJCQkJLy9Ccm93c2luZyBhbmQgUHVibGlzaGluZy4KLS8vLy8JCQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLy8vCQkJCQlpZihmaWx0ZXIgIT0gbnVsbCAmJiBmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yKXsKLS8vLy8JCQkJCQljaGlsZHJlbi5hZGRBbGwoKChJQ29uZmlndXJhdG9yKWZpbHRlcikuZ2V0Q2hpbGRyZW4ob2JqZWN0LCBmZWF0dXJlKSk7Ci0vLy8vCQkJCQl9Ci0vLy8vCQkJCQllbHNlewotLy8vLwkJCQkJCWNoaWxkcmVuID0gKExpc3QpIGVPYmplY3QuZUdldChmZWF0dXJlKTsKLS8vLy8JCQkJCX0KLS8vCQkJCQkKLS8vCQkJCQlpbnQgaW5kZXggPSAwOwotLy8JCQkJCWZvciAoSXRlcmF0b3IgY2kgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBjaS5oYXNOZXh0KCk7IGluZGV4KyspIHsKLS8vCQkJCQkJT2JqZWN0IGNoaWxkID0gY2kubmV4dCgpOwotLy8JCQkJCQlpZiAoYWNjZXB0QXNDaGlsZChjaGlsZCkpIHsKLS8vCQkJCQkJCWNoaWxkID0gd3JhcChlT2JqZWN0LCBmZWF0dXJlLCBjaGlsZCwgaW5kZXgpOwotLy8JCQkJCQkJc2V0UGFyZW50Rm9yKGNoaWxkLCBvYmplY3QpOwotLy8JCQkJCQkJLy8gSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKQotLy8JCQkJCQkJLy8gZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoY2hpbGQsCi0vLwkJCQkJCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotLy8JCQkJCQkJLy8gYWRhcHRlci5zZXRSb2xsZWRVcChmYWxzZSk7Ci0vLwkJCQkJCQlpZiAoc3RvcmUgIT0gbnVsbCkgewotLy8JCQkJCQkJCXN0b3JlLmdldExpc3QoZmVhdHVyZSkuYWRkKGNoaWxkKTsKLS8vCQkJCQkJCX0gZWxzZSB7Ci0vLwkJCQkJCQkJcmVzdWx0LmFkZChjaGlsZCk7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9IGVsc2UgewotLy8JCQkJCU9iamVjdCBjaGlsZCA9IGVPYmplY3QuZUdldChmZWF0dXJlKTsKLS8vCQkJCQlpZiAoYWNjZXB0QXNDaGlsZChjaGlsZCkpIHsKLS8vCQkJCQkJY2hpbGQgPSB3cmFwKGVPYmplY3QsIGZlYXR1cmUsIGNoaWxkLAotLy8JCQkJCQkJCUNvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgpOwotLy8JCQkJCQlzZXRQYXJlbnRGb3IoY2hpbGQsIG9iamVjdCk7Ci0vLwkJCQkJCS8vIElCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikKLS8vCQkJCQkJLy8gZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoY2hpbGQsCi0vLwkJCQkJCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0vLwkJCQkJCS8vIGFkYXB0ZXIuc2V0Um9sbGVkVXAoZmFsc2UpOwotLy8KLS8vCQkJCQkJaWYgKHN0b3JlICE9IG51bGwpIHsKLS8vCQkJCQkJCXN0b3JlLnNldFZhbHVlKGZlYXR1cmUsIGNoaWxkKTsKLS8vCQkJCQkJfSBlbHNlIHsKLS8vCQkJCQkJCXJlc3VsdC5hZGQoY2hpbGQpOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCW15Q2hpbGRyZW4gPSBzdG9yZSAhPSBudWxsID8gc3RvcmUuZ2V0Q2hpbGRyZW4oKSA6IHJlc3VsdDsKLS8vCQl9Ci0vLwkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IGFkZEluaGVyaXRlZChvYmplY3QsIG15Q2hpbGRyZW4pOwotLy8JCXJldHVybiBjaGlsZHJlbjsKLS8vCX0KLQkKLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0SW1tZWRpYXRlQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZihhY2NlcHRBc0NoaWxkKGNoaWxkKSkgewotCQkJCWlmKGNvbmZpZ3VyYXRvciAhPSBudWxsKSB7Ci0JCQkJCWNoaWxkID0gY29uZmlndXJhdG9yLnJlc29sdmUoY2hpbGQpOwotCQkJCX0KLQkJCQlpZihjaGlsZCAhPSBudWxsICYmICFjaGlsZHJlbi5jb250YWlucyhjaGlsZCkpIHsKLQkJCQkJc2V0UGFyZW50Rm9yKGNoaWxkLCBvYmplY3QpOwotCQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljaGlsZHJlbiA9IGFkZEluaGVyaXRlZChvYmplY3QsIChMaXN0KSBjaGlsZHJlbik7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldFJvbGxlZFVwQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAocm9sbGVkVXBXcmFwcGVycyAhPSBudWxsKSB7Ci0JCQlyb2xsZWRVcFdyYXBwZXJzLmRpc3Bvc2UoKTsKLQkJfQotCi0JCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFic3RyYWN0VHJlZUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3Iob2JqZWN0LCBmYWxzZSkgewotCi0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zMTU5NTM3NjI5NjE5NzM3MzY4TDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJSXRlcmF0b3IgaXRlcmF0b3I7Ci0JCQkJCWJvb2xlYW4gYiA9IGFkYXB0ZXIuaXNSb2xsZWRVcCgpOwotCQkJCQl0cnkgewotCQkJCQkJYWRhcHRlci5iYXNpY1NldFJvbGxlZFVwKGZhbHNlKTsKLQkJCQkJCWl0ZXJhdG9yID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQlhZGFwdGVyLmJhc2ljU2V0Um9sbGVkVXAoYik7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGl0ZXJhdG9yOwotCQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIKLQkJCQkJCSYmICEob2JqZWN0IGluc3RhbmNlb2YgVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyKSkgewotCQkJCQlyZXR1cm4gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqZWN0KQotCQkJCQkJCS5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgb25seSBvbmUgZGVzY3JpcHRvciBmb3IgZWFjaCBjb250ZW50IGVsZW1lbnQgaW4gdGhlIHJvbGwtdXAgbGlzdAotCQkvLwotCQlMaXN0IGRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGFjY2VwdEFzUm9sbGVkVXBDaGlsZChjaGlsZCkpIHsKLQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJCQlpZihlIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCQlPYmplY3QgZGVzYyA9IGZpbmREZXNjcmlwdG9yKGRlc2NyaXB0b3JzLCBlKTsKLQkJCQkJaWYoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQlpZihpc1dyYXBwaW5nUm9sbHVwTmVlZGVkKGNoaWxkKSkgewotCQkJCQkJCWNoaWxkID0gY3JlYXRlUm9sbHVwV3JhcHBlcihjaGlsZCwgb2JqZWN0LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJCQl9Ci0JCQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCQkJZGVzY3JpcHRvcnMuYWRkKGNoaWxkKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmKGlzV3JhcHBpbmdSb2xsdXBOZWVkZWQoY2hpbGQpKSB7Ci0JCQkJCQkJQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBjb21wb3NlZFdyYXBwZXIgPSBQcm9jZXNzVXRpbC5nZXRDb21wb3NlZFdyYXBwZXIoZGVzYyk7Ci0JCQkJCQkJaWYoY29tcG9zZWRXcmFwcGVyICE9IG51bGwpIHsKLQkJCQkJCQkJY29tcG9zZWRXcmFwcGVyLmFkZEVsZW1lbnQoY2hpbGQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZGVzY3JpcHRvcnMuY2xlYXIoKTsKLQkJZGVzY3JpcHRvcnMgPSBudWxsOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB3cmFwcGluZyBvZiB0aGUgc3BlY2lmaWVkIHJvbGx1cCBlbGVtZW50IGlzIG5lZWRlZC4gSWYgaXQncwotCSAqIG5lZWRlZCwgdGhlIGNhbGxlciB3aWxsIHVzZQotCSAqIHtAbGluayAjY3JlYXRlUm9sbHVwV3JhcHBlcihPYmplY3QsIE9iamVjdCwgQWRhcHRlckZhY3RvcnkpfSB0byBjcmVhdGUKLQkgKiB3cmFwcGVyIGZvciB0aGUgcm9sbHVwIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nUm9sbHVwTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVDb21wb3NlZFdyYXBwZXIoT2JqZWN0IG9iamVjdCwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIob2JqZWN0LCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVJvbGx1cFdyYXBwZXIoT2JqZWN0IG9iamVjdCwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewkJCi0JCUNvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IGNyZWF0ZUNvbXBvc2VkV3JhcHBlcihvYmplY3QsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCXdyYXBwZXIucmVhZE9ubHkgPSB0cnVlOwotCQl3cmFwcGVyLmlzUm9sbHVwQ2hpbGQgPSB0cnVlOwotCQkKLQkJaWYocm9sbGVkVXBXcmFwcGVycyA9PSBudWxsKSB7Ci0JCQlyb2xsZWRVcFdyYXBwZXJzID0gbmV3IERpc3Bvc2FibGUoKTsKLQkJfQotCQlyb2xsZWRVcFdyYXBwZXJzLmFkZCh3cmFwcGVyKTsKLQotCQlyZXR1cm4gd3JhcHBlcjsgCQkKLQl9CQkKLQkKLQlwcml2YXRlIENvbGxlY3Rpb24gZG9HZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJcmV0dXJuIGdldFJvbGxlZFVwQ2hpbGRyZW4ob2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBnZXRJbW1lZGlhdGVDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgb2JqZWN0OwotCQlpZihjb25maWd1cmF0b3IgIT0gbnVsbCkgewotCQkJCi0JCQkvL1RPRE86IHJlbW92ZSB0aGUgZW5hYmxlVmFyaWFiaWxpdHlJbmZvRmxhZyBhbmQgIAotCQkJLy8gY3JlYXRlIGFuIGludGVyZmFjZSBvciBkbyBkaWZmZXJlbnRseQotCQkJaWYoZW5hYmxlVmFyaWFiaWxpdHlJbmZvKQotCQkJCXZhcmlhYmlsaXR5SW5mbyA9IGNvbmZpZ3VyYXRvci5nZXRWYXJpYWJpbGl0eUluZm8oYWN0aXZpdHkpOwotCQkJZWxzZSAKLQkJCQl2YXJpYWJpbGl0eUluZm8gPSBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJdmFyaWFiaWxpdHlJbmZvID0gbnVsbDsKLQkJfQotCQlpZih2YXJpYWJpbGl0eUluZm8gIT0gbnVsbCkgewotCQkJT2JqZWN0IHJlc29sdmVkID0gdmFyaWFiaWxpdHlJbmZvLmdldEluaGVyaXRhbmNlTGlzdCgpLmdldCgwKTsKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaXAgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQocmVzb2x2ZWQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7CQkJCi0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuOwotCQkJYm9vbGVhbiBiID0gaXAuaXNSb2xsZWRVcCgpOwotCQkJdHJ5IHsKLQkJCQlpcC5iYXNpY1NldFJvbGxlZFVwKGlzUm9sbGVkVXAoKSk7Ci0JCQkJY2hpbGRyZW4gPSBpcC5kb0dldENoaWxkcmVuKHJlc29sdmVkKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlwLmJhc2ljU2V0Um9sbGVkVXAoYik7Ci0JCQl9Ci0JCQlpZighdmFyaWFiaWxpdHlJbmZvLmdldENvbnRyaWJ1dG9ycygpLmlzRW1wdHkoKSkgewotCQkJCUFycmF5TGlzdCBjb250cmlidXRlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHZhcmlhYmlsaXR5SW5mby5nZXRDb250cmlidXRvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJCQkJaXAgPSAoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpYWRhcHRlcik7Ci0JCQkJCQliID0gaXAuaXNSb2xsZWRVcCgpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpcC5iYXNpY1NldFJvbGxlZFVwKGlzUm9sbGVkVXAoKSk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGlwLmdldEltbWVkaWF0ZUNoaWxkcmVuKGUpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJZSA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLnJlc29sdmUoZSwgY29uZmlndXJhdG9yLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJCQkJCWlmKGUgIT0gbnVsbCAmJiAhVG5nVXRpbC5jb250YWlucyhjaGlsZHJlbiwgZSkpIHsKLQkJCQkJCQkJCWNvbnRyaWJ1dGVkQ2hpbGRyZW4uYWRkKGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJaXAuYmFzaWNTZXRSb2xsZWRVcChiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZighY29udHJpYnV0ZWRDaGlsZHJlbi5pc0VtcHR5KCkpIHsKLQkJCQkJY2hpbGRyZW4uYWRkQWxsKHdyYXBDb250cmlidXRlZChhY3Rpdml0eSwgY29udHJpYnV0ZWRDaGlsZHJlbikpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfQotCQlyZXR1cm4gZG9HZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYWNoZWRDaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0vLwkJaWYoaXNSb2xsZWRVcCgpKSB7Ci0vLwkJCWlmKGNhY2hlZFJvbGx1cENoaWxkcmVuID09IG51bGwpIHsKLS8vCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChjaGlsZHJlbik7Ci0vLwkJCX0KLS8vCQkJZWxzZSB7Ci0vLwkJCQljYWNoZWRSb2xsdXBDaGlsZHJlbi5jbGVhcigpOwotLy8JCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuKTsKLS8vCQkJfQotLy8JCX0KLS8vCQllbHNlIHsKLS8vCQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotLy8JCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KGNoaWxkcmVuKTsKLS8vCQkJfQotLy8JCQllbHNlIHsKLS8vCQkJCWNhY2hlZENoaWxkcmVuLmNsZWFyKCk7Ci0vLwkJCQljYWNoZWRDaGlsZHJlbi5hZGRBbGwoY2hpbGRyZW4pOwotLy8JCQl9Ci0vLwkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZyb21DYWNoZSgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQ2FjaGUoKSB7Ci0JCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCWdldENoaWxkcmVuKHRhcmdldCk7Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlciNnZXRSb2xsdXBDaGlsZHJlbkZyb21DYWNoZSgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Um9sbHVwQ2hpbGRyZW5Gcm9tQ2FjaGUoKSB7Ci0JCWlmKGNhY2hlZFJvbGx1cENoaWxkcmVuID09IG51bGwpIHsKLQkJCWJvb2xlYW4gb2xkUm9sbGVkVXAgPSByb2xsZWRVcDsKLQkJCXRyeSB7Ci0JCQkJcm9sbGVkVXAgPSB0cnVlOwotCQkJCWdldENoaWxkcmVuKHRhcmdldCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlyb2xsZWRVcCA9IG9sZFJvbGxlZFVwOwotCQkJfQkJCQotCQl9Ci0JCXJldHVybiBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQl9Ci0JCi0JcHJpdmF0ZSBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBmaW5kV3JhcHBlcihPYmplY3Qgb3duZXIsIE9iamVjdCB2YWx1ZSkgewotCQkvLyBmaW5kIGlmIGEgd3JhcHBlciBhbHJlYWR5IGV4aXN0IGZvciB0aGUgZ2l2ZW4gdmFsdWUgYW5kIG93bmVyCi0JCS8vCi0JCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQodmFsdWUsCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IG51bGw7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQlMaXN0IGxpc3RlbmVycyA9ICgoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5nZXRMaXN0ZW5lcnMoKTsKLQkJCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCWZpbmRfd3JhcHBlcl9sb29wOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudDsKLQkJCQkJCWlmICh3cmFwcGVyLmdldFZhbHVlKCkgPT0gdmFsdWUKLQkJCQkJCQkJJiYgd3JhcHBlci5nZXRQYXJlbnQodmFsdWUpID09IG93bmVyKSB7Ci0JCQkJCQkJYnJlYWsgZmluZF93cmFwcGVyX2xvb3A7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXdyYXBwZXIgPSBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB3cmFwcGVyOwotCX0KLQotCXByaXZhdGUgTGlzdCB3cmFwSW5oZXJpdGVkKEFjdGl2aXR5IG93bmVyLCBDb2xsZWN0aW9uIGJyZWFrZG93bkVsZW1lbnRzKSB7Ci0JCWlmICh3cmFwcGVycyA9PSBudWxsKSB7Ci0JCQl3cmFwcGVycyA9IG5ldyBEaXNwb3NhYmxlKCk7Ci0JCX0JCi0JCXJldHVybiB3cmFwKG93bmVyLCBicmVha2Rvd25FbGVtZW50cywgdHJ1ZSwgZmFsc2UsIHdyYXBwZXJzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IHdyYXBDb250cmlidXRlZChBY3Rpdml0eSBvd25lciwgQ29sbGVjdGlvbiBicmVha2Rvd25FbGVtZW50cykgewotCQlpZihjb250cmlidXRlZFdyYXBwZXJzID09IG51bGwpIHsKLQkJCWNvbnRyaWJ1dGVkV3JhcHBlcnMgPSBuZXcgRGlzcG9zYWJsZSgpOwotCQl9Ci0JCXJldHVybiB3cmFwKG93bmVyLCBicmVha2Rvd25FbGVtZW50cywgZmFsc2UsIHRydWUsIGNvbnRyaWJ1dGVkV3JhcHBlcnMpOwotCX0KLQkKLQlwcml2YXRlIElXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSBnZXRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlpZihhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyKSB7Ci0JCQlmYWN0b3J5ID0gKChJV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnlQcm92aWRlcilhZGFwdGVyRmFjdG9yeSkuZ2V0V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkoKTsKLQkJfQotCQlpZihmYWN0b3J5ID09IG51bGwpIHsKLQkJCWZhY3RvcnkgPSBJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQkKLQlwcml2YXRlIExpc3Qgd3JhcChBY3Rpdml0eSBvd25lciwgQ29sbGVjdGlvbiBicmVha2Rvd25FbGVtZW50cywgYm9vbGVhbiBpbmhlcml0ZWQsIGJvb2xlYW4gY29udHJpYnV0ZWQsIERpc3Bvc2FibGUgd3JhcHBlcnMpIHsKLQkJQXJyYXlMaXN0IHdyYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJV3JhcHBlckl0ZW1Qcm92aWRlckZhY3Rvcnkgd3JhcHBlckZhY3RvcnkgPSBnZXRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBicmVha2Rvd25FbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCB1bldyYXBwZWQgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQkJaWYgKHVuV3JhcHBlZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgdW5XcmFwcGVkOwotCQkJCWlmICghVG5nVXRpbC5pc0Jhc2Uob3duZXIuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSwgZSkpIHsKLQkJCQkJT2JqZWN0IGNoaWxkID0gZ2V0V3JhcHBlcihvd25lciwgZSwgd3JhcHBlcnMpOwotCQkJCQlpZihjaGlsZCA9PSBudWxsKSB7Ci0JCQkJCQljaGlsZCA9IHdyYXBwZXJGYWN0b3J5LmNyZWF0ZVdyYXBwZXIoZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBiZVdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGNoaWxkOwotCQkJCQkJCWlmKGluaGVyaXRlZCkgewotCQkJCQkJCQliZVdyYXBwZXIuaXNJbmhlcml0ZWQgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmKGNvbnRyaWJ1dGVkKSB7Ci0JCQkJCQkJCWJlV3JhcHBlci5jb250cmlidXRlZCA9IHRydWU7Ci0JCQkJCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyCi0JCQkJCQkJCQkJJiYgKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilvYmplY3QpLmlzSW5oZXJpdGVkKCkpIHsKLQkJCQkJCQkJCWJlV3JhcHBlci5pc0luaGVyaXRlZCA9IHRydWU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl3cmFwcGVycy5yZW1vdmUoY2hpbGQpOwotCQkJCQl9Ci0JCQkJCXdyYXBwZXJMaXN0LmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXdyYXBwZXJzLmRpc3Bvc2UoKTsKLQkJd3JhcHBlcnMuYWRkQWxsKHdyYXBwZXJMaXN0KTsKLQkJcmV0dXJuIHdyYXBwZXJMaXN0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgZ2V0V3JhcHBlcihBY3Rpdml0eSBvd25lciwgQnJlYWtkb3duRWxlbWVudCBlLCBDb2xsZWN0aW9uIHdyYXBwZXJzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHdyYXBwZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSVdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChJV3JhcHBlckl0ZW1Qcm92aWRlcikgaXRlci5uZXh0KCk7Ci0JCQlpZih3cmFwcGVyLmdldE93bmVyKCkgPT0gb3duZXIgJiYgd3JhcHBlci5nZXRWYWx1ZSgpID09IGUpIHsKLQkJCQlyZXR1cm4gd3JhcHBlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFkYXB0ZXIgY3JlYXRlQmFzZUxpc3RlbmVyKCkgewotCQlpZiAoYmFzZUxpc3RlbmVyID09IG51bGwpIHsKLQkJCWJhc2VMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQWN0aXZpdHlJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCQkJICovCi0JCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci50aGlzCi0JCQkJCQkJLmdldFRhcmdldCgpOwotCQkJCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQWN0aXZpdHkuY2xhc3MpKSB7Ci0JCQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkJCQlpZiAoUHJvY2Vzc1V0aWwuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoYWN0KSkgewotCQkJCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24oCi0JCQkJCQkJCQlub3RpZmljYXRpb24sIGFjdCwgZmFsc2UsIHRydWUpKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCi0JCQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fTkFNRToKLQkJCQkJCWlmIChhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKAotCQkJCQkJCQkJbm90aWZpY2F0aW9uLCBhY3QsIGZhbHNlLCB0cnVlKSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQotCQkJCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1NVUFBSRVNTRUQ6Ci0JCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCQkJYWN0LCB0cnVlLCBmYWxzZSkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJCQlhY3QsIHRydWUsIHRydWUpKTsKLQkJCQkJCXJlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKTsKLQkJCQkJCWJyZWFrOwotCi0JCQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTOiB7Ci0JCQkJCQlpZihoYW5kbGVSZXBsYWNlQnJlYWtkb3duRWxlbWVudChub3RpZmljYXRpb24pKSB7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlMaXN0IGxpc3QgPSBnZXRBZmZlY3RlZENoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCQkJCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJYm9vbGVhbiB1cGRhdGVMYWJlbCA9IHJlZnJlc2hDaGlsZHJlbkRhdGEoCi0JCQkJCQkJCQlub3RpZmljYXRpb24sIGxpc3QpOwotCi0JCQkJCQkJLy8gZm9yd2FyZCBub3RpZmljYXRpb24KLQkJCQkJCQkvLwotCQkJCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24oCi0JCQkJCQkJCQlub3RpZmljYXRpb24sIGFjdCwgdHJ1ZSwgdXBkYXRlTGFiZWwpKTsKLQotCQkJCQkJCS8vIFByb2Nlc3NVdGlsLnJlZnJlc2hWaWV3ZXIoZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJLy8gKFByb2Nlc3MpIGdldFRvcEl0ZW0oKSk7Ci0JCQkJCQkJcmVmcmVzaEFmZmVjdGVkVmlld2VycygpOwotCQkJCQkJfQotCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXJldHVybiBiYXNlTGlzdGVuZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEFjdGl2aXR5IGxpc3RlblRvQmFzZUFjdGl2aXR5KCkgewotCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIHRhcmdldDsKLQkJaWYgKCFQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhhY3QpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlBY3Rpdml0eSBiYXNlQWN0OwotCQlpZih2YXJpYWJpbGl0eUluZm8gIT0gbnVsbCkgewotCQkJaWYodmFyaWFiaWxpdHlJbmZvLmdldEluaGVyaXRhbmNlTGlzdCgpLnNpemUoKSA+IDEpIHsKLQkJCQliYXNlQWN0ID0gKEFjdGl2aXR5KSB2YXJpYWJpbGl0eUluZm8uZ2V0SW5oZXJpdGFuY2VMaXN0KCkuZ2V0KDEpOwotCQkJfQkJCQotCQkJZWxzZSB7Ci0JCQkJYmFzZUFjdCA9IChBY3Rpdml0eSkgY29uZmlndXJhdG9yLnJlc29sdmUoYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQliYXNlQWN0ID0gKEFjdGl2aXR5KSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQl9Ci0JCWlmIChiYXNlQWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQljcmVhdGVCYXNlTGlzdGVuZXIoKTsKLQkJCi0JCS8vIHJlbW92ZSBiYXNlTGlzdGVuZXIgZnJvbSBvbGQgYmFzZSwgaWYgdGhlcmUgaXMgYW55Ci0JCS8vCi0JCUVPYmplY3Qgb2xkQmFzZSA9IChFT2JqZWN0KSBiYXNlTGlzdGVuZXIuZ2V0VGFyZ2V0KCk7Ci0JCWlmKG9sZEJhc2UgIT0gbnVsbCkgewotCQkJb2xkQmFzZS5lQWRhcHRlcnMoKS5yZW1vdmUoYmFzZUxpc3RlbmVyKTsKLQkJfQotCQkKLQkJaWYgKCFiYXNlQWN0LmVBZGFwdGVycygpLmNvbnRhaW5zKGJhc2VMaXN0ZW5lcikpIHsKLQkJCWJhc2VBY3QuZUFkYXB0ZXJzKCkuYWRkKGJhc2VMaXN0ZW5lcik7Ci0JCX0KLQotCQlPYmplY3QgaXAgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChiYXNlQWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZihpcCBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBpcDsKLQkJCWFkYXB0ZXIubGlzdGVuVG9CYXNlQWN0aXZpdHkoKTsKLQkJfQotCQllbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQl9Ci0JCXJldHVybiBiYXNlQWN0OwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGFkZEluaGVyaXRlZChPYmplY3Qgb2JqZWN0LCBMaXN0IG15Q2hpbGRyZW4pIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG9iamVjdDsKLQkJCUFjdGl2aXR5IGJhc2VBY3QgPSBsaXN0ZW5Ub0Jhc2VBY3Rpdml0eSgpOwotCQkJaWYgKGJhc2VBY3QgIT0gbnVsbCkgewotCQkJCVZhcmlhYmlsaXR5VHlwZSBleHRlbmRUeXBlID0gYWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCWlmIChleHRlbmRUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVCkgewotCQkJCQlyZXR1cm4gbXlDaGlsZHJlbjsKLQkJCQl9IGVsc2UgaWYgKGV4dGVuZFR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTgotCQkJCQkJfHwgZXh0ZW5kVHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUykgewotCQkJCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJCS5hZGFwdChiYXNlQWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQlMaXN0IGFsbENoaWxkcmVuOwkJCQkJCi0JCQkJCWJvb2xlYW4gb2xkUm9sbGVkVXAgPSBhZGFwdGVyLmlzUm9sbGVkVXAoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmKG9sZFJvbGxlZFVwKSB7Ci0JCQkJCQkJYWRhcHRlci5iYXNpY1NldFJvbGxlZFVwKGZhbHNlKTsKLQkJCQkJCX0KLQkJCQkJCWFsbENoaWxkcmVuID0gd3JhcEluaGVyaXRlZChhY3QsIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oYmFzZUFjdCkpOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJaWYob2xkUm9sbGVkVXApIHsKLQkJCQkJCQlhZGFwdGVyLmJhc2ljU2V0Um9sbGVkVXAodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLS8vCQkJCQkvLyBnbyB0aHJ1IG93biBjaGlsZHJlbiBsaXN0IGFuZCBpbnNlcnQgaXQgdG8gdGhlIGNvbWJpbmVkCi0vLwkJCQkJLy8gY2hpbGQgbGlzdCBhdCB0aGUgcmlnaHQgcGxhY2UuCi0vLwkJCQkJLy8KLS8vCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBteUNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlcgotLy8JCQkJCQkJCS5uZXh0KCk7Ci0vLwkJCQkJCVRuZ1V0aWwuYWRkVG8oYWxsQ2hpbGRyZW4sIGVsZW1lbnQsIG9iamVjdCwgVG5nVXRpbAotLy8JCQkJCQkJCS5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpKTsKLS8vCQkJCQl9Ci0JCQkJCWlmKGFsbENoaWxkcmVuLmlzRW1wdHkoKSkgewotCQkJCQkJcmV0dXJuIG15Q2hpbGRyZW47Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlUbmdVdGlsLmFkZEFsbFRvKGFsbENoaWxkcmVuLCBteUNoaWxkcmVuKTsKLQkJCQkJCXJldHVybiBhbGxDaGlsZHJlbjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbXlDaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlcmUgaXMgbm8gZGVzY3JpcHRvciBpbiA8Y29kZT5jaGlsZHJlbjwvY29kZT4gcmVmZXJyaW5nIHRvCi0JICogdGhlIHNhbWUgb2JqZWN0IGFzIHRoZSBzcGVjaWZpZWQgZGVzY3JpcHRvciA8Y29kZT5jaGlsZDwvY29kZT4gZG9lcy4KLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGRyZW4KLQkgKiBAcGFyYW0gY2hpbGQKLQkgKiBAcmV0dXJuIHRydWUgaWYgbm8gZGVzY3JpcHRvciBpcyBmb3VuZCBpbiB0aGUgY2hpbGRyZW4gbGlzdCB0aGF0IHJlZmVycwotCSAqICAgICAgICAgdG8gdGhlIHNhbWUgb2JqZWN0IGFzIHRoZSBzcGVjaWZpZWQgY2hpbGQgZG9lcywgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTmV3RGVzY3JpcHRvcihMaXN0IGNoaWxkcmVuLCBPYmplY3QgY2hpbGQpIHsKLQkJcmV0dXJuIGZpbmREZXNjcmlwdG9yKGNoaWxkcmVuLCBjaGlsZCkgPT0gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdCBmaW5kRGVzY3JpcHRvcihMaXN0IGNoaWxkcmVuLCBPYmplY3QgY2hpbGQpIHsKLQkJT2JqZWN0IG9iaiA9IGdldE9iamVjdCgoRGVzY3JpcHRvcikgVG5nVXRpbC51bndyYXAoY2hpbGQpKTsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWZvciAoaW50IGkgPSBjaGlsZHJlbi5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJT2JqZWN0IG8gPSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQlpZiAob2JqID09IGdldE9iamVjdCgoRGVzY3JpcHRvcikgVG5nVXRpbC51bndyYXAobykpKQotCQkJCXJldHVybiBvOwotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZC5IZWxwZXIjZ2V0Q3JlYXRlQ2hpbGRJbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIHJldHVybgotCQkvLyBUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL2N0b29sMTYvQ3JlYXRlQWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfQWN0aXZpdHkiKTsKLQkJcmV0dXJuIGdldEltYWdlKGNoaWxkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlUmVtb3ZlQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlUmVtb3ZlQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVJlbW92ZUNvbW1hbmQoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRJdGVtUHJvdmlkZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIElCU0l0ZW1Qcm92aWRlciBnZXRJdGVtUHJvdmlkZXIoRU9iamVjdCBlT2JqKSB7Ci0JCXJldHVybiAoSUJTSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJLmdldEFkYXB0ZXIoZU9iaiwgSUJTSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlwYXJlbnQgPSBvYmplY3Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYocGFyZW50ID09IG51bGwpIHsKLQkJCWlmKHRhcmdldCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJcmV0dXJuICgoQWN0aXZpdHkpdGFyZ2V0KS5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpc3Qgb2YgY2hpbGRyZW4gdGhhdCBoYWQgYmVlbiBhZmZlY3RlZCBhZnRlciBhIGFuIEFERCwgUkVNT1ZFLAotCSAqIG9yIE1PVkUgb3BlcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEFmZmVjdGVkQ2hpbGRyZW4oTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0QWZmZWN0ZWRFbGVtZW50cyhub3RpZmljYXRpb24sIGNoaWxkRmlsdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWZyZXNoQ2hpbGRyZW5EYXRhKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sCi0JCQlMaXN0IGFmZmVjdGVkQ2hpbGRyZW4pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvUmVmcmVzaENoaWxkcmVuKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sCi0JCQlMaXN0IGFmZmVjdGVkQ2hpbGRyZW4pIHsKLQkJcmVmcmVzaENoaWxkcmVuRGF0YShub3RpZmljYXRpb24sIGFmZmVjdGVkQ2hpbGRyZW4pOwotCi0JCVByb2Nlc3MgdG9wQWN0ID0gKFByb2Nlc3MpIGdldFRvcEl0ZW0oKTsKLQkJQWRhcHRlckZhY3Rvcnkgcm9vdEFkYXB0ZXJGYWN0b3J5ID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCVByb2Nlc3NVdGlsLnJlZnJlc2hWaWV3ZXIocm9vdEFkYXB0ZXJGYWN0b3J5LCB0b3BBY3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hDaGlsZHJlbihmaW5hbCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLAotCQkJZmluYWwgTGlzdCBuZXdPck9sZENoaWxkcmVuKSB7Ci0JCWlmICghbmV3T3JPbGRDaGlsZHJlbi5pc0VtcHR5KCkpIHsKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlkb1JlZnJlc2hDaGlsZHJlbihub3RpZmljYXRpb24sIG5ld09yT2xkQ2hpbGRyZW4pOwotCQkJCX0KLQotCQkJfTsKLQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1blNhZmVseShydW5uYWJsZSwgZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEFmZmVjdGVkVmlld2VycygpIHsKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlkb1JlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKTsKLQkJCX0KLQotCQl9OwotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5ydW5TYWZlbHkocnVubmFibGUsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1JlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKSB7Ci0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlUHJlZGVjZXNzb3JMaXN0Q2hhbmdlKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJcmV0dXJuIFRuZ1V0aWwuaGFuZGxlUHJlZGVjZXNzb3JMaXN0Q2hhbmdlKHRoaXMsIG5vdGlmaWNhdGlvbik7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZVJlcGxhY2VCcmVha2Rvd25FbGVtZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5TRVQgJiYgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkgIT0gbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpIHsKLQkJCWlmKG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQlpZighQXNzb2NpYXRpb25IZWxwZXIuZ2V0TGlua1RvU3VjY2Vzc29yKGUpLmlzRW1wdHkoKSkgewotCQkJCQlQcm9jZXNzVXRpbC5yZWZyZXNoUHJlZGVjY2Vzc29yTGlzdHMoYWRhcHRlckZhY3RvcnksIChQcm9jZXNzKSBnZXRUb3BJdGVtKCkpOwotCQkJCX0KLQkJCX0KLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQlnZXRUYXJnZXQoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCWlmIChoYW5kbGVQcmVkZWNlc3Nvckxpc3RDaGFuZ2Uobm90aWZpY2F0aW9uKSkKLQkJCXJldHVybjsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQWN0aXZpdHkuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTOgotCQkJaWYoaGFuZGxlUmVwbGFjZUJyZWFrZG93bkVsZW1lbnQobm90aWZpY2F0aW9uKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCUxpc3QgbmV3T3JPbGRDaGlsZHJlbiA9IGdldEFmZmVjdGVkQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJCWlmICghbmV3T3JPbGRDaGlsZHJlbi5pc0VtcHR5KCkpIHsKLQkJCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJY3JlYXRlT3JNb3ZlUGFja2FnZUZvcihuZXdPck9sZENoaWxkcmVuKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCQlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQotCQkJCS8vIHJlZnJlc2hDaGlsZHJlbihub3RpZmljYXRpb24sIG5ld09yT2xkQ2hpbGRyZW4pOwotCi0JCQkJcmVmcmVzaEFmZmVjdGVkVmlld2VycygpOwotCQkJfQotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1NVUFBSRVNTRUQ6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRToKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCi0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCB0cnVlKSk7Ci0KLQkJCS8vIFByb2Nlc3NVdGlsLnJlZnJlc2hWaWV3ZXIoZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIChQcm9jZXNzKQotCQkJLy8gZ2V0VG9wSXRlbSgpKTsKLQotCQkJcmVmcmVzaEFmZmVjdGVkVmlld2VycygpOwotCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld09yT2xkQ2hpbGRyZW4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVPck1vdmVQYWNrYWdlRm9yKExpc3Q8Pz4gbmV3Q2hpbGRyZW4pIHsKLQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSAoKEVPYmplY3QpIHRhcmdldCkuZUNvbnRhaW5lcigpOwotCQlpZihwa2cgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoT2JqZWN0IGVsZW1lbnQgOiBuZXdDaGlsZHJlbikgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZWxlbWVudDsKLQkJCQlpZiAoYWN0LmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCS8vIGNyZWF0ZSBuZXcgUHJvY2Vzc1BhY2thZ2UgZm9yIHRoZSBhY3Rpdml0eQotCQkJCQkvLwotCQkJCQlQcm9jZXNzUGFja2FnZSBuZXdQa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJCQluZXdQa2cuc2V0TmFtZShhY3QuZ2V0TmFtZSgpKTsKLQkJCQkJcGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQobmV3UGtnKTsKLQkJCQkJbmV3UGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChhY3QpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIENoZWNrIGlmIHRoZSBhY3Rpdml0eSdzIFByb2Nlc3NQYWNrYWdlIGlzIGF0IHRoZSByaWdodAotCQkJCQkvLyBwbGFjZS4KLQkJCQkJLy8gSWYgbm90LCBtb3ZlIGl0IHRvIHRoZSByaWdodCBQcm9jZXNzQ29tcG9uZW50LgotCQkJCQkvLwotCQkJCQlQcm9jZXNzUGFja2FnZSBvbGRQa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdC5lQ29udGFpbmVyKCk7Ci0JCQkJCWlmIChvbGRQa2cuZUNvbnRhaW5lcigpICE9IHBrZykgewotCQkJCQkJcGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQob2xkUGtnKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQpIHsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKChQcm9jZXNzRWxlbWVudCkgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldEFsbEJyZWFrZG93bkVsZW1lbnRzKFNldCBzZXQsIEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlib29sZWFuIHJldCA9IHNldC5hZGQoZSk7Ci0JCWlmIChyZXQgJiYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQWN0aXZpdHkpIGUpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlnZXRBbGxCcmVha2Rvd25FbGVtZW50cyhzZXQsIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaCB0aGUgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcHJlZGVjZXNzb3IgSURzIGluIHRoZSB2aWV3ZXIKLQkgKiAKLQkgKiBAcGFyYW0gYWZmZWN0ZWRCcmVha2Rvd25FbGVtZW50cwotCSAqLwotCXByaXZhdGUgdm9pZCByZWZyZXNoUHJlZGVjZXNzb3JzKE5vdGlmaWNhdGlvbiBtc2csCi0JCQlMaXN0IGFmZmVjdGVkQnJlYWtkb3duRWxlbWVudHMpIHsKLQotCQlTZXQgcmVmcmVzaExpc3QgPSBuZXcgSGFzaFNldCgpOwotCQlTZXQgYWxsQnJlYWtkb3duRWxlbWVudHMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZmZlY3RlZEJyZWFrZG93bkVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFCi0JCQkJCXx8IG1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlkpIHsKLQkJCQlzZXRQYXJlbnRGb3IoZSwgbnVsbCk7Ci0JCQl9Ci0JCQlnZXRBbGxCcmVha2Rvd25FbGVtZW50cyhhbGxCcmVha2Rvd25FbGVtZW50cywgZSk7Ci0JCX0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLnJlZnJlc2hQcmVkZWNlc3NvcnMoKToKLQkJLy8gYWxsQnJlYWtkb3duRWxlbWVudHM9IithbGxCcmVha2Rvd25FbGVtZW50cyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhbGxCcmVha2Rvd25FbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRMaW5rVG9TdWNjZXNzb3IoCi0JCQkJCWVsZW1lbnQpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMS5oYXNOZXh0KCk7KSB7Ci0JCQkJV29ya09yZGVyIHdvcmtPcmRlciA9IChXb3JrT3JkZXIpIGl0ZXJhdG9yMS5uZXh0KCk7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBzdWNjID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCS5nZXRTdWNjZXNzb3Iod29ya09yZGVyKTsKLQkJCQlpZiAoIWFsbEJyZWFrZG93bkVsZW1lbnRzLmNvbnRhaW5zKHN1Y2MpKSB7Ci0JCQkJCXJlZnJlc2hMaXN0LmFkZChzdWNjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIucmVmcmVzaFByZWRlY2Vzc29ycygpOgotCQkvLyByZWZyZXNoTGlzdD0iICsgcmVmcmVzaExpc3QpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZnJlc2hMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG1zZywgY2hpbGQsIGZhbHNlLCB0cnVlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlUGFja2FnZUZvcihBY3Rpdml0eSBhY3Rpdml0eSwgRU9iamVjdCBwYXJlbnRBY3Rpdml0eSkgewotCQlQcm9jZXNzUGFja2FnZSBwYXJlbnQgPSAoUHJvY2Vzc1BhY2thZ2UpIHBhcmVudEFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJUHJvY2Vzc1BhY2thZ2UgbmV3UGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJbmV3UGtnLnNldE5hbWUoYWN0aXZpdHkuZ2V0TmFtZSgpKTsKLQkJcGFyZW50LmdldENoaWxkUGFja2FnZXMoKS5hZGQobmV3UGtnKTsKLQkJQXJyYXlMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlicmVha2Rvd25FbGVtZW50cy5hZGQoYWN0aXZpdHkpOwotCQlicmVha2Rvd25FbGVtZW50cy5hZGRBbGwoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSk7Ci0JCW5ld1BrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwoYnJlYWtkb3duRWxlbWVudHMpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29sdW1uTmFtZShpbnQgY29sdW1uSW5kZXgpIHsKLQkJQWRhcHRlckZhY3Rvcnkgcm9vdEFkYXB0ZXJGYWN0b3J5ID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWlmIChyb290QWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJQ29sdW1uQXdhcmUpIHsKLQkJCU1hcCBjb2x1bW5JbmRleFRvTmFtZU1hcCA9ICgoSUNvbHVtbkF3YXJlKSByb290QWRhcHRlckZhY3RvcnkpCi0JCQkJCS5nZXRDb2x1bW5JbmRleFRvTmFtZU1hcCgpOwotCQkJaWYgKGNvbHVtbkluZGV4VG9OYW1lTWFwICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gKFN0cmluZykgY29sdW1uSW5kZXhUb05hbWVNYXAuZ2V0KG5ldyBJbnRlZ2VyKAotCQkJCQkJY29sdW1uSW5kZXgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJU3RyaW5nIGNvbE5hbWUgPSBnZXRDb2x1bW5OYW1lKGNvbHVtbkluZGV4KTsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0Q29sdW1uSW1hZ2Uob2JqZWN0LCBjb2xOYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVN0cmluZyBjb2xOYW1lID0gZ2V0Q29sdW1uTmFtZShjb2x1bW5JbmRleCk7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUob2JqZWN0LCBjb2xOYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRUb3BJdGVtKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9wSXRlbShPYmplY3QgdG9wKSB7Ci0JCXRvcEl0ZW0gPSB0b3A7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNpc1JvbGxlZFVwKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JvbGxlZFVwKCkgewotCQlyZXR1cm4gcm9sbGVkVXA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRSb2xsZWRVcChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGxlZFVwKGJvb2xlYW4gYikgewotCQlyb2xsZWRVcCA9IGI7Ci0JCWlmICghcm9sbGVkVXApIHsKLQkJCS8vIHVzZXIgcm9sbCBkb3duIHRoaXMgYWN0aXZpdHksIHNldCByb2xsZWRVcCBmbGFnIG9mIGFsbCBpdHMKLQkJCS8vIG9mZnN0cmluZyB0byBmYWxzZQotCQkJLy8KLQkJCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IodGFyZ2V0LCBmYWxzZSkgewotCi0JCQkJLyoqCi0JCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkgKi8KLQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzg0MDY4NzI2NDc1MzY0MDI1MEw7Ci0KLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJLmFkYXB0KG9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pdGVyYXRvcigpOwotCQkJCX0KLQotCQkJfTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBjaGlsZCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoY2hpbGQsCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCSgoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRSb2xsZWRVcChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIEdyYXBoaWNhbERhdGEgZ2V0R3JhcGhpY2FsRGF0YSgpIHsKLQkJcmV0dXJuIGdyYXBoaWNhbERhdGE7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0R3JhcGhpY2FsRGF0YShHcmFwaGljYWxEYXRhIGRhdGEpIHsKLQkJZ3JhcGhpY2FsRGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSwgdGhpcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wLCBTdHJpbmcgdHh0KSB7Ci0JCUFjdGl2aXR5IGUgPSAoQWN0aXZpdHkpIG9iamVjdDsKLQkJUHJvY2Vzc1V0aWwuc2V0QXR0cmlidXRlKGUsIHByb3AsIHR4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS5sYW5nLk9iamVjdCwgaW50LAotCSAqICAgICAgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEl0ZXJhdGlvbikgewotCQkJKChJdGVyYXRpb24pIHZhbHVlKS5zZXRJc1JlcGVhdGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIHZhbHVlLAotCQkJCWluZGV4LCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldExpc3RlbmVycygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0TGlzdGVuZXJzKCkgewotCQlpZiAoY2hhbmdlTm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgoTGlzdCkgY2hhbmdlTm90aWZpZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0UHJlZGVjZXNzb3JzKCkKLQkgKi8KLQlwdWJsaWMgUHJlZGVjZXNzb3JMaXN0IGdldFByZWRlY2Vzc29ycygpIHsKLQkJaWYgKHByZWRlY2Vzc29ycyA9PSBudWxsKSB7Ci0JCQlwcmVkZWNlc3NvcnMgPSBuZXcgUHJlZGVjZXNzb3JMaXN0KFRuZ1V0aWwKLQkJCQkJLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSksIHRhcmdldCk7Ci0JCX0KLQkJcmV0dXJuIHByZWRlY2Vzc29yczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpcnN0RWxlbWVudChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5pc0ZpcnN0RWxlbWVudChnZXRSb290QWRhcHRlckZhY3RvcnkoKSwgdGhpcywgb2JqKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhc3RFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmlzTGFzdEVsZW1lbnQoZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIHRoaXMsIG9iaik7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVVwKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlPYmplY3QgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJVG5nVXRpbC5tb3ZlVXAoKEFjdGl2aXR5KSBwYXJlbnQsIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVEb3duKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlPYmplY3QgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJVG5nVXRpbC5tb3ZlRG93bigoQWN0aXZpdHkpIHBhcmVudCwgb2JqLCBnZXRFQ2xhc3NlcygpLCBhY3Rpb25NZ3IpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgQWN0aXZpdHlBZGRDb21tYW5kKChBZGRDb21tYW5kKSBzdXBlci5jcmVhdGVBZGRDb21tYW5kKAotCQkJCWRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkFjdGl2aXR5SXRlbVByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCU9iamVjdCBpbWcgPSBUbmdVdGlsLmdldEltYWdlKG9iamVjdCk7Ci0JCXJldHVybiBpbWcgIT0gbnVsbCA/IGltZyA6IHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIElGaWx0ZXIgZ2V0Q2hpbGRGaWx0ZXIoKSB7Ci0JCXJldHVybiBjaGlsZEZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZyZXNoQWxsSURzUmVxdWlyZWQoYm9vbGVhbiBiKSB7Ci0JCXJlZnJlc2hBbGxJRHNSZXF1aXJlZCA9IGI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWZyZXNoQWxsSURzUmVxdWlyZWQoKSB7Ci0JCXJldHVybiByZWZyZXNoQWxsSURzUmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gdGhpcy5maWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJaWYoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcikgewotCQkJY29uZmlndXJhdG9yID0gKElDb25maWd1cmF0b3IpZmlsdGVyOwotCQl9Ci0JCWVsc2UgewotCQkJY29uZmlndXJhdG9yID0gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjY3JlYXRlRHJvcENvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY3JlYXRlRHJvcENvbW1hbmQoT2JqZWN0IG93bmVyLAotCQkJTGlzdCBkcm9wRWxlbWVudHMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGJhc2ljU2V0Um9sbGVkVXAoYm9vbGVhbiBiKSB7Ci0JCXJvbGxlZFVwID0gYjsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgZW5hYmxlVmFyaWFiaWxpdHlJbmZvCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVWYXJpYWJpbGl0eUluZm8oKSB7Ci0JCXJldHVybiBlbmFibGVWYXJpYWJpbGl0eUluZm87Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVuYWJsZVZhcmlhYmlsaXR5SW5mbyB0aGUgZW5hYmxlVmFyaWFiaWxpdHlJbmZvIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZVZhcmlhYmlsaXR5SW5mbyhib29sZWFuIGVuYWJsZVZhcmlhYmlsaXR5SW5mbykgewotCQl0aGlzLmVuYWJsZVZhcmlhYmlsaXR5SW5mbyA9IGVuYWJsZVZhcmlhYmlsaXR5SW5mbzsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBNb3ZlQ29tbWFuZEV4IGV4dGVuZHMgTW92ZUNvbW1hbmQgaW1wbGVtZW50cyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JCXByaXZhdGUgU2V0PFJlc291cmNlPiBtb2RpZmllZFJlc291cmNlczsKLQotCQlwdWJsaWMgTW92ZUNvbW1hbmRFeChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCQlzdXBlcihkb21haW4sIG93bmVyLCBmZWF0dXJlLCB2YWx1ZSwgaW5kZXgpOwotCQl9CQkJCQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCS8vIHRyYW5zbGF0ZSB2aWV3IGluZGV4IHRvIGluZGV4IGluIGJyZWFrZG93biBlbGVtZW50cyBsaXN0Ci0JCQkvLwotCQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBnZXRDaGlsZHJlbihnZXRUYXJnZXQoKSk7Ci0JCQlPYmplY3QgY2hpbGQgPSBjaGlsZHJlbi5nZXQoaW5kZXgpOwotCQkJaW5kZXggPSBvd25lckxpc3QuaW5kZXhPZihjaGlsZCk7Ci0JCQlpZihpbmRleCAhPSAtMSkgewotCQkJCXN1cGVyLmRvRXhlY3V0ZSgpOwotCQkJfQotCQkJCi0JCQkvL1RPRE86IG1vdmUgaW4gYmV0d2VlbiBncmVlbiBlbGVtZW50cwotCQl9Ci0KLQkJcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCQlpZihtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBvd25lci5lUmVzb3VyY2UoKTsKLQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uKHJlc291cmNlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzID0gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVNb3ZlQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTW92ZUNvbW1hbmRFeChkb21haW4sIG93bmVyLCBmZWF0dXJlLCB2YWx1ZSwgaW5kZXgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA1NjYxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuUmVzb3VyY2VBd2FyZURyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5HZW5lcmljRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByZWRlY2Vzc29yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci0KLQotLyoqCi0gKiBCYXNlIGl0ZW0gcHJvdmlkZXIgZm9yIGFsbCBicmVha2Rvd24gZWxlbWVudHMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJUHJvY2Vzc0l0ZW1Qcm92aWRlciwgSUJTSXRlbVByb3ZpZGVyLCBJVGFibGVJdGVtTGFiZWxQcm92aWRlciwgSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCXByaXZhdGUgaW50IGlkOwotCi0JcHJpdmF0ZSBPYmplY3QgdG9wSXRlbTsKLQotCXByaXZhdGUgYm9vbGVhbiByb2xsZWRVcDsKLQotCXByaXZhdGUgQm9vbGVhbiBleHBhbmRlZDsKLQotCXByaXZhdGUgUHJlZGVjZXNzb3JMaXN0IHByZWRlY2Vzc29yczsKLQotCXByb3RlY3RlZCBJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCQotCXByb3RlY3RlZCBMaXN0IGNhY2hlZENoaWxkcmVuOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5kZWxlZ2F0ZUl0ZW1Qcm92aWRlciA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAocHJlZGVjZXNzb3JzICE9IG51bGwpIHsKLQkJCXByZWRlY2Vzc29ycy5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYoY2FjaGVkQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJY2FjaGVkQ2hpbGRyZW4uY2xlYXIoKTsKLQkJCWNhY2hlZENoaWxkcmVuID0gbnVsbDsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChkZWxlZ2F0ZUl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGVJdGVtUHJvdmlkZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2lzRXhwYW5kZWQoKQotCSAqLwotCXB1YmxpYyBCb29sZWFuIGlzRXhwYW5kZWQoKSB7Ci0JCXJldHVybiBleHBhbmRlZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldEV4cGFuZGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwYW5kZWQoQm9vbGVhbiBiKSB7Ci0JCWV4cGFuZGVkID0gYjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3Qgb2JqKSB7Ci0JCXBhcmVudCA9IG9iajsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJcmV0dXJuICgoQnJlYWtkb3duRWxlbWVudClvYmplY3QpLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0SWQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldElkKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChpbnQgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0VG9wSXRlbSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRUb3BJdGVtKCkgewotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KHRhcmdldCk7Ci0JCWlmICh0b3BJdGVtID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlPYmplY3QgdG9wID0gYWRhcHRlci5nZXRUb3BJdGVtKCk7Ci0JCQkJaWYgKHRvcCA9PSBudWxsICYmIHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3MKLQkJCQkJCSYmICgoUHJvY2VzcykgcGFyZW50KS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJCXRvcCA9IHBhcmVudDsKLQkJCQkJYWRhcHRlci5zZXRUb3BJdGVtKHRvcCk7Ci0JCQkJfQotCQkJCXJldHVybiB0b3A7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRvcEl0ZW07Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBjb2x1bW5JbmRleCkgewotCQlBZGFwdGVyRmFjdG9yeSByb290QWRhcHRlckZhY3RvcnkgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQkJaWYgKHJvb3RBZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElDb2x1bW5Bd2FyZSkgewotCQkJTWFwIGNvbHVtbkluZGV4VG9OYW1lTWFwID0gKChJQ29sdW1uQXdhcmUpIHJvb3RBZGFwdGVyRmFjdG9yeSkKLQkJCQkJLmdldENvbHVtbkluZGV4VG9OYW1lTWFwKCk7Ci0JCQlpZiAoY29sdW1uSW5kZXhUb05hbWVNYXAgIT0gbnVsbCkgewotCQkJCXJldHVybiAoU3RyaW5nKSBjb2x1bW5JbmRleFRvTmFtZU1hcC5nZXQobmV3IEludGVnZXIoCi0JCQkJCQljb2x1bW5JbmRleCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkvLyBTdHJpbmcgY29sTmFtZSA9IChTdHJpbmcpIGNvbHVtbkluZGV4VG9OYW1lTWFwLmdldChuZXcKLQkJLy8gSW50ZWdlcihjb2x1bW5JbmRleCkpOwotCQlTdHJpbmcgY29sTmFtZSA9IGdldENvbHVtbk5hbWUoY29sdW1uSW5kZXgpOwotCQlyZXR1cm4gVG5nVXRpbC5nZXRDb2x1bW5JbWFnZShvYmplY3QsIGNvbE5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJLy8gU3RyaW5nIGNvbE5hbWUgPSAoU3RyaW5nKSBjb2x1bW5JbmRleFRvTmFtZU1hcC5nZXQobmV3Ci0JCS8vIEludGVnZXIoY29sdW1uSW5kZXgpKTsKLQkJU3RyaW5nIGNvbE5hbWUgPSBnZXRDb2x1bW5OYW1lKGNvbHVtbkluZGV4KTsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShvYmplY3QsIGNvbE5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldFRvcEl0ZW0oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb3BJdGVtKE9iamVjdCB0b3ApIHsKLQkJdG9wSXRlbSA9IHRvcDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2lzUm9sbGVkVXAoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUm9sbGVkVXAoKSB7Ci0JCXJldHVybiByb2xsZWRVcDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldFJvbGxlZFVwKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sbGVkVXAoYm9vbGVhbiBiKSB7Ci0JCXJvbGxlZFVwID0gYjsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoamF2YS51dGlsLk1hcCkKLQkvLyAqLwotCS8vIHB1YmxpYyB2b2lkIHNldENvbHVtbkluZGV4VG9OYW1lTWFwKE1hcCBtYXApIHsKLQkvLyBpZiAobWFwICE9IG51bGwpCi0JLy8gewotCS8vIGNvbHVtbkluZGV4VG9OYW1lTWFwID0gbWFwOwotCS8vIH0KLQkvLyB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5LCB0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3AsIFN0cmluZyB0eHQpIHsKLQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgb2JqZWN0OwotCQlpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUpIHsKLQkJCWUuc2V0TmFtZSh0eHQpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlMpIHsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOKSB7Ci0JCQllLnNldElzRXZlbnREcml2ZW4oQm9vbGVhbi52YWx1ZU9mKHR4dCkpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HKSB7Ci0JCQllLnNldElzT25nb2luZyhCb29sZWFuLnZhbHVlT2YodHh0KSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUpIHsKLQkJCWUuc2V0SXNSZXBlYXRhYmxlKEJvb2xlYW4udmFsdWVPZih0eHQpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0TGlzdGVuZXJzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChjaGFuZ2VOb3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KChMaXN0KSBjaGFuZ2VOb3RpZmllcik7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldFByZWRlY2Vzc29ycygpCi0JICovCi0JcHVibGljIFByZWRlY2Vzc29yTGlzdCBnZXRQcmVkZWNlc3NvcnMoKSB7Ci0JCWlmIChwcmVkZWNlc3NvcnMgPT0gbnVsbCkgewotCQkJcHJlZGVjZXNzb3JzID0gbmV3IFByZWRlY2Vzc29yTGlzdChUbmdVdGlsCi0JCQkJCS5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLCB0YXJnZXQpOwotCQl9Ci0JCXJldHVybiBwcmVkZWNlc3NvcnM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGaXJzdEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuaXNGaXJzdEVsZW1lbnQoZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIHRoaXMsIG9iaik7Ci0KLQkJLy8gT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCS8vIGlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpCi0JCS8vIHsKLQkJLy8gQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCS8vIExpc3QgZWxlbWVudHMgPSBnZXRGaWx0ZXJlZEJyZWFrZG93bkVsZW1lbnRzKGFjdGl2aXR5LCBvYmopOwotCQkvLwkJCQotCQkvLyAvLyBpZiBpdCdzIGZpcnN0IGVsZW1lbnQsIHJldHVybiB0cnVlCi0JCS8vIGlmIChlbGVtZW50cy5nZXQoMCkuZXF1YWxzKG9iaikpCi0JCS8vIHsKLQkJLy8gcmV0dXJuIHRydWU7Ci0JCS8vIH0KLQkJLy8gZWxzZSByZXR1cm4gZmFsc2U7Ci0JCS8vIH0KLQkJLy8JCQotCQkvLyByZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhc3RFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmlzTGFzdEVsZW1lbnQoZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIHRoaXMsIG9iaik7Ci0KLQkJLy8gT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCS8vIGlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpCi0JCS8vIHsKLQkJLy8gQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCS8vIExpc3QgZWxlbWVudHMgPSBnZXRGaWx0ZXJlZEJyZWFrZG93bkVsZW1lbnRzKGFjdGl2aXR5LCBvYmopOwotCQkvLwkJCQotCQkvLyAvLyBpZiBpdCdzIGxhc3QgZWxlbWVudCwgcmV0dXJuIHRydWUKLQkJLy8gaWYgKGVsZW1lbnRzLmdldChlbGVtZW50cy5zaXplKCkgLSAxKS5lcXVhbHMob2JqKSkKLQkJLy8gewotCQkvLyByZXR1cm4gdHJ1ZTsKLQkJLy8gfQotCQkvLyBlbHNlIHJldHVybiBmYWxzZTsKLQkJLy8gfQotCQkvLwkJCi0JCS8vIHJldHVybiB0cnVlOwotCi0JfQotCi0JcHVibGljIHZvaWQgbW92ZVVwKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlPYmplY3QgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJVG5nVXRpbC5tb3ZlVXAoKEFjdGl2aXR5KSBwYXJlbnQsIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZURvd24oT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSB0aGlzLmdldFBhcmVudChvYmopOwotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlUbmdVdGlsLm1vdmVEb3duKChBY3Rpdml0eSkgcGFyZW50LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJLy8gaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5EZXNjcmlwdG9ySXRlbVByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChkZWxlZ2F0ZUl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGVJdGVtUHJvdmlkZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuRGVzY3JpcHRvckl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKFRuZ1V0aWwuaGFuZGxlUHJlZGVjZXNzb3JMaXN0Q2hhbmdlKHRoaXMsIG5vdGlmaWNhdGlvbikpCi0JCQlyZXR1cm47Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hDaGlsZHJlbihOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLAotCQkJQ29sbGVjdGlvbiBuZXdPck9sZENoaWxkcmVuKSB7Ci0JCWlmICghbmV3T3JPbGRDaGlsZHJlbi5pc0VtcHR5KCkpIHsKLQkJCS8vIC8vIHJlY2FsY3VsYXRlIHRoZSBJRHMgb2YgYnJlYWtkb3duIGVsZW1lbnRzIGFuZCByZWZyZXNoIHRoZW0KLQkJCS8vIC8vCi0JCQkvLyBBY3Rpdml0eSB0b3BBY3QgPSAoQWN0aXZpdHkpIGdldFRvcEl0ZW0oKTsKLQkJCS8vIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkvLyBQcm9jZXNzVXRpbC51cGRhdGVJRHMoYWRhcHRlckZhY3RvcnksIG5ldwotCQkJLy8gQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoYWRhcHRlckZhY3RvcnksIHRvcEFjdCksIHRvcEFjdCk7Ci0KLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgR2VuZXJpY0Ryb3BDb21tYW5kLkVsZW1lbnRBZGFwdGVyIGNyZWF0ZURyb3BBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2NyZWF0ZURyb3BDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlQXdhcmVDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwKLQkJCUxpc3QgZHJvcEVsZW1lbnRzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRnJvbUNhY2hlKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21DYWNoZSgpIHsKLQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJZ2V0Q2hpbGRyZW4odGFyZ2V0KTsKLQkJfQotCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyI2dldFJvbGx1cENoaWxkcmVuRnJvbUNhY2hlKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSb2xsdXBDaGlsZHJlbkZyb21DYWNoZSgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBPYmplY3Qgb3duZXIsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgUmVzb3VyY2VBd2FyZURyYWdBbmREcm9wQ29tbWFuZChkb21haW4sIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywKLQkJCQlvcGVyYXRpb24sIGNvbGxlY3Rpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0JyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg0YWI2OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByZWRlY2Vzc29yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1JvbGxlZFVwOwotCi0JcHJpdmF0ZSBQcmVkZWNlc3Nvckxpc3QgcHJlZGVjZXNzb3JzOwotCi0JcHJpdmF0ZSBCb29sZWFuIGV4cGFuZGVkOwotCQotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcihPYmplY3QgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgbnVsbCwgQ29tbWFuZFBhcmFtZXRlci5OT19JTkRFWCwgYWRhcHRlckZhY3RvcnkpOwotCQlpZih2YWx1ZSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCURlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB2YWx1ZTsKLQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJZmVhdHVyZSA9ICgoRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIpIHZhbHVlKS5nZXRGZWF0dXJlKCk7Ci0JCQl9Ci0JCQlzZXRSZWFkT25seSh3cmFwcGVyLmlzUmVhZE9ubHkoKSk7Ci0JCQlzZXRSb2xsZWRVcCh3cmFwcGVyLmlzUm9sbHVwQ2hpbGQoKSk7Ci0JCQlpc0luaGVyaXRlZCA9IHdyYXBwZXIuaXNJbmhlcml0ZWQ7Ci0JCQljb250cmlidXRlZCA9IHdyYXBwZXIuY29udHJpYnV0ZWQ7Ci0JCX0JCQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcihCcmVha2Rvd25FbGVtZW50IHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIoQnJlYWtkb3duRWxlbWVudCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2lzRXhwYW5kZWQoKQotCSAqLwotCXB1YmxpYyBCb29sZWFuIGlzRXhwYW5kZWQoKSB7Ci0JCXJldHVybiBleHBhbmRlZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldEV4cGFuZGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwYW5kZWQoQm9vbGVhbiBiKSB7Ci0JCWV4cGFuZGVkID0gYjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2lzUm9sbGVkVXAoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUm9sbGVkVXAoKSB7Ci0JCXJldHVybiBpc1JvbGxlZFVwOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0Um9sbGVkVXAoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xsZWRVcChib29sZWFuIGIpIHsKLQkJaXNSb2xsZWRVcCA9IGI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSwgdGhpcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSwgU3RyaW5nIHRleHRWYWx1ZSkgewotCQlQcm9jZXNzVXRpbC5zZXRBdHRyaWJ1dGUoKFdvcmtCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcChvYmplY3QpLAotCQkJCXByb3BlcnR5LCB0ZXh0VmFsdWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5EZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyI2RvQ3JlYXRlV3JhcHBlcihqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSkKLQkgKi8KLQlwcm90ZWN0ZWQgSVdyYXBwZXJJdGVtUHJvdmlkZXIgZG9DcmVhdGVXcmFwcGVyKE9iamVjdCB2YWx1ZSwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlyZXR1cm4gSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVXcmFwcGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoZGVsZWdhdGVJdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBJVGFibGVJdGVtTGFiZWxQcm92aWRlcikgewotCQkJcmV0dXJuICgoSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIpIGRlbGVnYXRlSXRlbVByb3ZpZGVyKQotCQkJCQkuZ2V0Q29sdW1uSW1hZ2Uob2JqZWN0LCBjb2x1bW5JbmRleCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldFByZWRlY2Vzc29ycygpCi0JICovCi0JcHVibGljIFByZWRlY2Vzc29yTGlzdCBnZXRQcmVkZWNlc3NvcnMoKSB7Ci0JCWlmIChwcmVkZWNlc3NvcnMgPT0gbnVsbCkgewotCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKHRoaXMpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJcHJlZGVjZXNzb3JzID0gbmV3IFByZWRlY2Vzc29yTGlzdChUbmdVdGlsCi0JCQkJCQkuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KSwgdGhpcyk7Ci0JCQl9IGVsc2UgewotCQkJCXByZWRlY2Vzc29ycyA9IFByZWRlY2Vzc29yTGlzdC5FTVBUWV9MSVNUOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcmVkZWNlc3NvcnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciNjcmVhdGVDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLkNsYXNzLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoT2JqZWN0IG9iamVjdCwgRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlDbGFzcyBjb21tYW5kQ2xhc3MsIENvbW1hbmRQYXJhbWV0ZXIgY29tbWFuZFBhcmFtZXRlcikgewotCQkvLyBTeXN0ZW0ub3V0Ci0JCS8vIC5wcmludGxuKCJCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlci5jcmVhdGVDb21tYW5kKCk6Iik7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIG9iamVjdDogIiArIG9iamVjdCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGNvbW1hbmRDbGFzczogIiArIGNvbW1hbmRDbGFzcyk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGNvbW1hbmRQYXJhbWV0ZXI6ICIgKyBjb21tYW5kUGFyYW1ldGVyKTsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbW1hbmQob2JqZWN0LCBkb21haW4sIGNvbW1hbmRDbGFzcywKLQkJCQljb21tYW5kUGFyYW1ldGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyI2dldE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGaXJzdEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhc3RFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RmlsdGVyZWRCcmVha2Rvd25FbGVtZW50cyhPYmplY3QgYWN0aXZpdHksIE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVVwKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCi0JfQotCi0JcHVibGljIHZvaWQgbW92ZURvd24oT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAocHJlZGVjZXNzb3JzICE9IG51bGwpIHsKLQkJCXByZWRlY2Vzc29ycy5kaXNwb3NlKCk7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMzk2Y2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQlwcml2YXRlIExpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKE9iamVjdCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCWFkZEVsZW1lbnQodmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRWYWx1ZXMoKSB7Ci0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRWxlbWVudChPYmplY3QgZSkgewotCQlnZXRWYWx1ZXMoKS5hZGQoZSk7Ci0JfQotCQotCS8qKgotCSAqIERlY2lkZXMgaWYgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkgb2YgYWxsIGVsZW1lbnRzIGluIHRoaXMgY29tcG9zZWQgd3JhcHBlciBjYW4gYmUgbWVyZ2VkLgotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5NZXJnZShTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTzsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWlmKCF2YWx1ZXMuaXNFbXB0eSgpKSB7Ci0JCQlpZihjYW5NZXJnZShwcm9wZXJ0eSkpIHsKLQkJCQlVbmlxdWVFTGlzdCBtb2RlbEluZm9zID0gbmV3IFVuaXF1ZUVMaXN0KCk7CQkJCQotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHZhbHVlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCQkJU3RyaW5nIGluZm87Ci0JCQkJCWlmKG8gaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCWluZm8gPSAoKElCU0l0ZW1Qcm92aWRlcilvKS5nZXRBdHRyaWJ1dGUobywgcHJvcGVydHkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJSUJTSXRlbVByb3ZpZGVyIGlwID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQobywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCWluZm8gPSBpcC5nZXRBdHRyaWJ1dGUobywgcHJvcGVydHkpOwotCQkJCQl9Ci0JCQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsoaW5mbykpIHsKLQkJCQkJCW1vZGVsSW5mb3MuYWRkKGluZm8pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKCFtb2RlbEluZm9zLmlzRW1wdHkoKSkgewotCQkJCQlTdHJpbmdCdWZmZXIgbW9kZWxJbmZvID0gbmV3IFN0cmluZ0J1ZmZlcigoU3RyaW5nKW1vZGVsSW5mb3MuZ2V0KDApKTsKLQkJCQkJaW50IG1heCA9IG1vZGVsSW5mb3Muc2l6ZSgpOwotCQkJCQlmb3IgKGludCBpID0gMTsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJCQltb2RlbEluZm8uYXBwZW5kKCcsJykuYXBwZW5kKG1vZGVsSW5mb3MuZ2V0KGkpKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbW9kZWxJbmZvLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzSW5oZXJpdGVkKCkgewotCQlmb3IoaW50IGkgPSB2YWx1ZXMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCU9iamVjdCBvID0gdmFsdWVzLmdldChpKTsKLQkJCWlmKCEobyBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIAotCQkJCQl8fCAhKChEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKW8pLmlzSW5oZXJpdGVkKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2VkV1BEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2VkV1BEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmE1OTFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NlZFdQRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEZlYiAyMywgMjAwNgotICogQHNpbmNlICA3LjAuMQotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zZWRXUERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIExpc3Qgbm90aWZpZXJzOwotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIENvbXBvc2VkV1BEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcihPYmplY3QgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCQlpZih2YWx1ZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil2YWx1ZSk7Ci0JCQlyZWFkT25seSA9IHdyYXBwZXIuaXNSZWFkT25seSgpOwotCQkJaXNJbmhlcml0ZWQgPSB3cmFwcGVyLmlzSW5oZXJpdGVkOwotCQl9Ci0JCWlzUm9sbHVwQ2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8gdGhlIG5vdGlmaWVyIGxpc3Qgb2YgdGhpcyB3cmFwcGVyLiBUaGUgZ2l2ZW4gd29yayBwcm9kdWN0IGRlc2NyaXB0b3IKLQkgKiBtdXN0IGJlIGxpbmtlZCB0byB0aGUgc2FtZSB3b3JrIHByb2R1Y3QgYXMgdGhlIGRlbGVnYXRlIHZhbHVlIGlzIAotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIG9yIGl0cyB3cmFwcGVyCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYWRkV29ya1Byb2R1Y3REZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlbGVnYXRlV3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgVG5nVXRpbC51bndyYXAoZ2V0RGVsZWdhdGVWYWx1ZSgpKTsKLQkJaWYoZGVsZWdhdGVXcGQgPT0gd3BkKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJT2JqZWN0IHdwID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoZGVsZWdhdGVXcGQpOwotCQlpZih3cCA9PSBudWxsIHx8IHdwID09IHdwZC5nZXRXb3JrUHJvZHVjdCgpKSB7Ci0JCQlPYmplY3QgaXRlbVByb3ZpZGVyID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQod3BkLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIElDaGFuZ2VOb3RpZmllcikKLQkJCXsKLQkJCQkoKElDaGFuZ2VOb3RpZmllcilpdGVtUHJvdmlkZXIpLmFkZExpc3RlbmVyKHRoaXMpOwotCQkJCWlmKG5vdGlmaWVycyA9PSBudWxsKSB7Ci0JCQkJCW5vdGlmaWVycyA9IG5ldyBVbmlxdWVFTGlzdCgpOwotCQkJCX0KLQkJCQlub3RpZmllcnMuYWRkKGl0ZW1Qcm92aWRlcik7Ci0JCQl9Ci0JCX0JCi0JCQotCQlpZihpc0luaGVyaXRlZCAmJiBvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciAmJgotCQkJCSEoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKW9iamVjdCkuaXNJbmhlcml0ZWQpIHsKLQkJCXRoaXMuaXNJbmhlcml0ZWQgPSBmYWxzZTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYobm90aWZpZXJzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vdGlmaWVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJQ2hhbmdlTm90aWZpZXIgbm90aWZpZXIgPSAoSUNoYW5nZU5vdGlmaWVyKSBpdGVyLm5leHQoKTsKLQkJCQlub3RpZmllci5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJCW5vdGlmaWVycy5jbGVhcigpOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmKG5vdGlmaWVycyAhPSBudWxsICYmIG5vdGlmaWVycy5jb250YWlucyhub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkpIHsKLQkJCXN3aXRjaChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WSU5HX0FEQVBURVI6Ci0JCQkJaWYobm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkgPT0gdGhpcykgewotCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgdGhpcywgZmFsc2UsIHRydWUpKTsJCQkJCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQ6Ci0JCQkJc3dpdGNoKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzKSkgewotCQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEU6Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZCh3cmFwTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbikpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlpZihwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8gJiYgZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCVN0cmluZyBpbmZvID0gKChDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWdldFZhbHVlKCkpLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsoaW5mbykpIHsKLQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbmZvLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJSGFzaFNldCBpbmZvU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlTdHJpbmdCdWZmZXIgaW5mb3MgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCk7Ci0JCQkJCWlmKGluZm9TZXQuYWRkKHRva2VuKSkgewotCQkJCQkJaW5mb3MuYXBwZW5kKHRva2VuKS5hcHBlbmQoJywnKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpbmZvcy5kZWxldGVDaGFyQXQoaW5mb3MubGVuZ3RoKCkgLSAxKTsKLQkJCQlpbmZvID0gaW5mb3MudG9TdHJpbmcoKTsKLQkJCX0KLQkJCXJldHVybiBpbmZvOwotCQl9Ci0JCWlmKG5vdGlmaWVycyAhPSBudWxsICYmICFub3RpZmllcnMuaXNFbXB0eSgpCi0JCQkJJiYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfRU5UUllfU1RBVEUgfHwgcHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFKSkgewotCQkJU3RyaW5nQnVmZmVyIHN0cmJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCVN0cmluZyBzdHIgPSBzdXBlci5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKHN0cikpIHsKLQkJCQlzdHJidWYuYXBwZW5kKHN0cik7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub3RpZmllcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIpIGl0ZXIubmV4dCgpOwotCQkJCXN0ciA9IGl0ZW1Qcm92aWRlci5nZXRBdHRyaWJ1dGUoaXRlbVByb3ZpZGVyLmdldFRhcmdldCgpLCBwcm9wZXJ0eSk7Ci0JCQkJaWYoIVN0clV0aWwuaXNCbGFuayhzdHIpKSB7Ci0JCQkJCWlmKHN0cmJ1Zi5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCXN0cmJ1Zi5hcHBlbmQoJywnKTsKLQkJCQkJfQotCQkJCQlzdHJidWYuYXBwZW5kKHN0cik7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHN0cmJ1Zi50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYWZhOTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuR2VuZXJpY0Ryb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLk9CU0RyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5HZW5lcmljRHJvcENvbW1hbmQuRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlciBleHRlbmRzIFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgRWxlbWVudEFkYXB0ZXIgZHJvcEFkYXB0ZXI7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkRlc2NyaXB0b3JJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKENvbXBvc2l0ZVJvbGUuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2lzV3JhcHBpbmdOZWVkZWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZVdyYXBwZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCURlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IG5ldyBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKAotCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIHZhbHVlLCBvYmplY3QsIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpKTsKLQkJLy8gd3JhcHBlci5zZXRDb2x1bW5JbmRleFRvTmFtZU1hcChjb2x1bW5JbmRleFRvTmFtZU1hcCk7Ci0JCXJldHVybiB3cmFwcGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkvLyBDb21wb3NpdGVSb2xlIGNvbXBvc2l0ZVJvbGUgPSAoQ29tcG9zaXRlUm9sZSkgb2JqZWN0OwotCS8vIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JLy8gQ29sbGVjdGlvbiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21wb3NpdGVSb2xlLmdldEFnZ3JlZ2F0ZWRSb2xlcygpLml0ZXJhdG9yKCk7Ci0JLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gY2hpbGRyZW4uYWRkKG5ldwotCS8vIERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIoKERlc2NyaWJhYmxlRWxlbWVudCkgaXRlci5uZXh0KCksCi0JLy8gdGhpcywgYWRhcHRlckZhY3RvcnkpKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIGNoaWxkcmVuOwotCS8vIH0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgZmxvYXQsIGludCwgaW50LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlPYmplY3Qgb3duZXIsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IE9CU0RyYWdBbmREcm9wQ29tbWFuZChkb21haW4sIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywKLQkJCQlvcGVyYXRpb24sIGNvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyBHZW5lcmljRHJvcENvbW1hbmQuRWxlbWVudEFkYXB0ZXIgY3JlYXRlRHJvcEFkYXB0ZXIoKSB7Ci0JCWlmIChkcm9wQWRhcHRlciA9PSBudWxsKSB7Ci0JCQlkcm9wQWRhcHRlciA9IG5ldyBHZW5lcmljRHJvcENvbW1hbmQuRWxlbWVudEFkYXB0ZXIoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBkcm9wRWxlbWVudCkgewotCQkJCQlpZiAoZHJvcEVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlCi0JCQkJCQkJJiYgISgoQ29tcG9zaXRlUm9sZSkgZ2V0VGFyZ2V0KCkpCi0JCQkJCQkJCQkuZ2V0QWdncmVnYXRlZFJvbGVzKCkuY29udGFpbnMoZHJvcEVsZW1lbnQpKSB7Ci0JCQkJCQlyZXR1cm4gZHJvcEVsZW1lbnQ7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQl9OwotCQl9Ci0JCXJldHVybiBkcm9wQWRhcHRlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NpdGVSb2xlV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2l0ZVJvbGVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MDYyYmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2l0ZVJvbGVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVSb2xlV3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcm9sZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIENvbXBvc2l0ZVJvbGVXcmFwcGVySXRlbVByb3ZpZGVyKENvbXBvc2l0ZVJvbGUgcm9sZSwgT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIocm9sZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvRGVsaXZlcmFibGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0RlbGl2ZXJhYmxlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIyYjEyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvRGVsaXZlcmFibGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcmFibGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcmFibGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcigKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB2YWx1ZSwgT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0Rlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9EZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMzM4MzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0Rlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5QcmVkZWNlc3Nvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0KLS8qKgotICogV3JhcHBlciBpdGVtIHByb3ZpZGVyIGZvciBEZXNjcmlibGVFbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJQlNJdGVtUHJvdmlkZXIsCi0JCUlUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyIHsKLQotCXByaXZhdGUgaW50IGlkOwotCi0JcHJpdmF0ZSBPYmplY3QgdG9wSXRlbTsKLQotCXByb3RlY3RlZCBib29sZWFuIHJlYWRPbmx5ID0gdHJ1ZTsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luaGVyaXRlZCA9IGZhbHNlOwotCQotCXByb3RlY3RlZCBib29sZWFuIGNvbnRyaWJ1dGVkID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSb2xsdXBDaGlsZCA9IGZhbHNlOwotCQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKERlc2NyaWJhYmxlRWxlbWVudCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcyh2YWx1ZSwgb3duZXIsIG51bGwsIENvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKERlc2NyaWJhYmxlRWxlbWVudCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIoT2JqZWN0IHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCX0JCi0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhpcyB3cmFwcGVyIGlzIHJlYWQtb25seQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiByZWFkT25seTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHJlYWRPbmx5Ci0JICogICAgICAgICAgICBUaGUgcmVhZE9ubHkgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpIHsKLQkJdGhpcy5yZWFkT25seSA9IHJlYWRPbmx5OwotCX0JCi0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBjb250cmlidXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29udHJpYnV0ZWQoKSB7Ci0JCXJldHVybiBjb250cmlidXRlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0luaGVyaXRlZCgpIHsKLQkJcmV0dXJuIGlzSW5oZXJpdGVkOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1JvbGx1cENoaWxkKCkgewotCQlyZXR1cm4gaXNSb2xsdXBDaGlsZDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRJZCgpCi0JICovCi0JcHVibGljIGludCBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0SWQoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKGludCBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IG9iaikgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0VG9wSXRlbSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRUb3BJdGVtKCkgewotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG51bGwpOwotCQlpZiAodG9wSXRlbSA9PSBudWxsICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpCi0JCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IHRvcCA9IGFkYXB0ZXIuZ2V0VG9wSXRlbSgpOwotCQkJCWlmICh0b3AgPT0gbnVsbCAmJiBwYXJlbnQgaW5zdGFuY2VvZiBQcm9jZXNzCi0JCQkJCQkmJiAoKFByb2Nlc3MpIHBhcmVudCkuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkgewotCQkJCQl0b3AgPSBwYXJlbnQ7Ci0JCQkJCWFkYXB0ZXIuc2V0VG9wSXRlbSh0b3ApOwotCQkJCX0KLQkJCQlyZXR1cm4gdG9wOwotCQkJfQotCQl9Ci0JCXJldHVybiB0b3BJdGVtOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0VG9wSXRlbShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvcEl0ZW0oT2JqZWN0IHRvcCkgewotCQl0b3BJdGVtID0gdG9wOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjaXNSb2xsZWRVcCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSb2xsZWRVcCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0Um9sbGVkVXAoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xsZWRVcChib29sZWFuIGIpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2lzRmlyc3RFbGVtZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGaXJzdEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNpc0xhc3RFbGVtZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYXN0RWxlbWVudChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldEZpbHRlcmVkQnJlYWtkb3duRWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIExpc3QgZ2V0RmlsdGVyZWRCcmVha2Rvd25FbGVtZW50cyhPYmplY3QgYWN0aXZpdHlPYmosIE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNtb3ZlVXAoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgbW92ZVVwKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjbW92ZURvd24oamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgbW92ZURvd24oT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRFQ2xhc3NlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlEZXNjcmliYWJsZUVsZW1lbnQgZSA9IChEZXNjcmliYWJsZUVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUpIHsKLQkJCXJldHVybiBlLmdldE5hbWUoKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lEKSB7Ci0JCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoaWQpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUpIHsKLQkJCVN0cmluZyBuYW1lID0gZS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQlpZiAoU3RyVXRpbC5pc0JsYW5rKG5hbWUpKSB7Ci0JCQkJbmFtZSA9IGUuZ2V0TmFtZSgpOwotCQkJfQotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSwgU3RyaW5nIHRleHRWYWx1ZSkgewotCi0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUNvbHVtbkF3YXJlI3NldENvbHVtbkluZGV4VG9OYW1lTWFwKGphdmEudXRpbC5NYXApCi0JLy8gKi8KLQkvLyBwdWJsaWMgdm9pZCBzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChNYXAgbWFwKSB7Ci0JLy8gaWYgKG1hcCAhPSBudWxsKQotCS8vIHsKLQkvLyBjb2x1bW5JbmRleFRvTmFtZU1hcCA9IG1hcDsKLQkvLyBjb2x1bW5JbmRleFRvTmFtZU1hcENoYW5nZWQgPSB0cnVlOwotCS8vIH0KLQkvLyB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldFByZWRlY2Vzc29ycygpCi0JICovCi0JcHVibGljIFByZWRlY2Vzc29yTGlzdCBnZXRQcmVkZWNlc3NvcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjaXNFeHBhbmRlZCgpCi0JICovCi0JcHVibGljIEJvb2xlYW4gaXNFeHBhbmRlZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRFeHBhbmRlZChqYXZhLmxhbmcuQm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBhbmRlZChCb29sZWFuIGIpIHsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciNjcmVhdGVXcmFwcGVyKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSkKLQkgKi8KLQlwcm90ZWN0ZWQgSVdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsIE9iamVjdCBvd25lciwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUlXcmFwcGVySXRlbVByb3ZpZGVyIHdpcCA9IGRvQ3JlYXRlV3JhcHBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYod2lwIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHdpcDsKLQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJd3JhcHBlci5mZWF0dXJlID0gKChEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcikgdmFsdWUpCi0JCQkJLmdldEZlYXR1cmUoKTsKLQkJCX0KLQkJCXdyYXBwZXIuc2V0UmVhZE9ubHkocmVhZE9ubHkpOwotCQkJd3JhcHBlci5pc1JvbGx1cENoaWxkID0gaXNSb2xsdXBDaGlsZDsKLQkJCXdyYXBwZXIuaXNJbmhlcml0ZWQgPSBpc0luaGVyaXRlZDsKLQkJCXdyYXBwZXIuY29udHJpYnV0ZWQgPSBpc0NvbnRyaWJ1dGVkKCk7Ci0JCX0JCQotCQlyZXR1cm4gd2lwOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVdyYXBwZXJJdGVtUHJvdmlkZXIgZG9DcmVhdGVXcmFwcGVyKE9iamVjdCB2YWx1ZSwgT2JqZWN0IG93bmVyLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcCh2YWx1ZSk7Ci0JCWlmIChlIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSBuZXcgRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcigKLQkJCQkJKERlc2NyaWJhYmxlRWxlbWVudCkgZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCXJldHVybiB3cmFwcGVyOwotCQl9Ci0JCXJldHVybiBzdXBlci5jcmVhdGVXcmFwcGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoZGVsZWdhdGVJdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBJVGFibGVJdGVtTGFiZWxQcm92aWRlcikgewotCQkJcmV0dXJuICgoSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIpIGRlbGVnYXRlSXRlbVByb3ZpZGVyKQotCQkJCQkuZ2V0Q29sdW1uSW1hZ2Uob2JqZWN0LCBjb2x1bW5JbmRleCk7Ci0JCX0KLQkJaWYgKGNvbHVtbkluZGV4ID09IDAKLQkJCQkmJiBkZWxlZ2F0ZUl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIElJdGVtTGFiZWxQcm92aWRlcikgewotCQkJcmV0dXJuICgoSUl0ZW1MYWJlbFByb3ZpZGVyKSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29sdW1uTmFtZShpbnQgY29sdW1uSW5kZXgpIHsKLQkJQWRhcHRlckZhY3Rvcnkgcm9vdEFkYXB0ZXJGYWN0b3J5ID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWlmIChyb290QWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJQ29sdW1uQXdhcmUpIHsKLQkJCU1hcCBjb2x1bW5JbmRleFRvTmFtZU1hcCA9ICgoSUNvbHVtbkF3YXJlKSByb290QWRhcHRlckZhY3RvcnkpCi0JCQkJCS5nZXRDb2x1bW5JbmRleFRvTmFtZU1hcCgpOwotCQkJaWYgKGNvbHVtbkluZGV4VG9OYW1lTWFwICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gKFN0cmluZykgY29sdW1uSW5kZXhUb05hbWVNYXAuZ2V0KG5ldyBJbnRlZ2VyKAotCQkJCQkJY29sdW1uSW5kZXgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCS8vIFN0cmluZyBjb2xOYW1lID0gKFN0cmluZykgY29sdW1uSW5kZXhUb05hbWVNYXAuZ2V0KG5ldwotCQkvLyBJbnRlZ2VyKGNvbHVtbkluZGV4KSk7Ci0JCVN0cmluZyBjb2xOYW1lID0gZ2V0Q29sdW1uTmFtZShjb2x1bW5JbmRleCk7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUob2JqZWN0LCBjb2xOYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldExpc3RlbmVycygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0TGlzdGVuZXJzKCkgewotCQlpZiAoY2hhbmdlTm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgoTGlzdCkgY2hhbmdlTm90aWZpZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSU1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2NyZWF0ZURyb3BDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlQXdhcmVDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwKLQkJCUxpc3QgZHJvcEVsZW1lbnRzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCU9iamVjdCBvID0gVG5nVXRpbC51bndyYXAodGhpcyk7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpICsgIiAod3JhcHBlZCBvYmplY3Q6ICIgKyBvICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQyN2YwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTykgewotCQkJU3RyaW5nQnVmZmVyIG1vZGVsSW5mbyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCU9iamVjdCBlID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIG9iamVjdCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGU7Ci0JCQkJT2JqZWN0IGJhc2UgPSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCQkvLyBsb29rIGZvciBleGlzdGluZyBkZXNjcmlwdG9yIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZQotCQkJCQkvLyBiYXNlIGluIHRoZSBhY3Rpdml0eQotCQkJCQkvLwotCQkJCQlPYmplY3QgcGFyZW50ID0gbnVsbDsKLQkJCQkJZm9yIChwYXJlbnQgPSBnZXRQYXJlbnQob2JqZWN0KTsgcGFyZW50ICE9IG51bGwKLQkJCQkJCQkmJiAhKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KTspIHsKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHBhcmVudCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpCi0JCQkJCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlPYmplY3QgZGVzYyA9IG51bGw7Ci0JCQkJCQlmaW5kX2Rlc2NyaXB0b3JfbG9vcDogZm9yIChJdGVyYXRvciBpdGVyID0gYWRhcHRlcgotCQkJCQkJCQkuZ2V0Q2hpbGRyZW4ocGFyZW50KS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgY2hpbGQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgRGVzY3JpcHRvcgotCQkJCQkJCQkJJiYgUHJvY2Vzc1V0aWwKLQkJCQkJCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBjaGlsZCkgPT0gYmFzZSkgewotCQkJCQkJCQlkZXNjID0gY2hpbGQ7Ci0JCQkJCQkJCWJyZWFrIGZpbmRfZGVzY3JpcHRvcl9sb29wOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQkJCQlTdHJpbmcgc3RyID0gbnVsbDsKLQkJCQkJCQlpZiAodmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpIHsKLQkJCQkJCQkJc3RyID0gTGlicmFyeUVkaXRSZXNvdXJjZXMucHJvY2Vzc19leHRlbmRzOyAKLQkJCQkJCQl9IGVsc2UgaWYgKHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUykgewotCQkJCQkJCQlzdHIgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5wcm9jZXNzX3JlcGxhY2VzOyAKLQkJCQkJCQl9Ci0JCQkJCQkJU3RyaW5nIG5hbWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgZGVzYykKLQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJCQkJaWYgKHN0ciAhPSBudWxsKQotCQkJCQkJCQltb2RlbEluZm8uYXBwZW5kKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHN0ciwKLQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyBuYW1lIH0pKTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCW1vZGVsSW5mby5hcHBlbmQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0vLwkJCQkJUHJvY2Vzc1V0aWwuZ2V0TW9kZWxJbmZvRm9yV29ya1Byb2R1Y3REZXNjcmlwdG9yKG1vZGVsSW5mbywKLS8vCQkJCQkJCShXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iamVjdCk7Ci0JCQkJCVByb2Nlc3NVdGlsLmdldFdQRE1vZGVsSW5mbyhtb2RlbEluZm8sIG9iamVjdCwgdGhpcyk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG1vZGVsSW5mby50b1N0cmluZygpOyAKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JQlNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JQlNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ2YTFmMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSUJTSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJlZGVjZXNzb3JMaXN0OwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgYmFzZSBpbnRlcmZhY2Ugb2YgYWxsIGl0ZW0gcHJvdmlkZXJzIGZvciBicmVha2Rvd24gZWxlbWVudCB1c2VkCi0gKiBieSB0aGUgUHJvY2VzcyBFZGl0b3IuIEl0IGRlZmluZXMgdGhlIGNvbnN0YW50cyBmb3IgY29sdW1uIG5hbWVzIGFuZCBtZXRob2RzCi0gKiB0byBzdXBwb3J0IHJvdyBpbmRleCwgcm9sbC11cCB2aWV3LCBnZXR0aW5nL3NldHRpbmcgYnJlYWtkb3duIGVsZW1lbnQncwotICogYXR0cmlidXRlcywgcHJlZGVjZXNzb3IgbGlzdC4uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCU0l0ZW1Qcm92aWRlciBleHRlbmRzIC8vSUxpYnJhcnlJdGVtUHJvdmlkZXIsCi0JCUlTdGF0ZWZ1bEl0ZW1Qcm92aWRlciB7Ci0KLQkvKiogQ29sdW1uIElEIGNvbnN0YW50cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfUFJFRklYID0gInByZWZpeCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9QUkVERUNFU1NPUlMgPSAicHJlZGVjZXNzb3JzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0lTX1JFUEVBVEFCTEUgPSAiaXNfcmVwZWF0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9JU19PTkdPSU5HID0gImlzX29uZ29pbmciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfSVNfRVZFTlRfRFJJVkVOID0gImlzX2V2ZW50X2RyaXZlbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9FTlRSWV9TVEFURSA9ICJlbnRyeV9zdGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9FWElUX1NUQVRFID0gImV4aXRfc3RhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfVEVBTVMgPSAidGVhbXMiOyAvLyROT04tTkxTLTEkICAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfTU9ERUxfSU5GTyA9ICJtb2RlbF9pbmZvIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX1BSRVNFTlRBVElPTl9OQU1FID0gInByZXNlbnRhdGlvbl9uYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0RFTElWRVJBQkxFID0gImRlbGl2ZXJhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0lTX09QVElPTkFMID0gImlzX29wdGlvbmFsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0lTX1BMQU5ORUQgPSAiaXNfcGxhbm5lZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSAiaGFzX211bHRpcGxlX29jY3VycmVuY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT0xVTU5TID0geyBDT0xfTkFNRSwgQ09MX1BSRUZJWCwgQ09MX0lELAotCQkJQ09MX1BSRURFQ0VTU09SUywgQ09MX0lTX1JFUEVBVEFCTEUsIENPTF9JU19PTkdPSU5HLAotCQkJQ09MX0lTX0VWRU5UX0RSSVZFTiwgQ09MX0VOVFJZX1NUQVRFLCBDT0xfRVhJVF9TVEFURSwgQ09MX1RFQU1TLAotCQkJQ09MX1RZUEUsIENPTF9NT0RFTF9JTkZPLCBDT0xfUFJFU0VOVEFUSU9OX05BTUUsIENPTF9ERUxJVkVSQUJMRSB9OwotCQotCWludCBnZXRJZCgpOwotCi0Jdm9pZCBzZXRJZChpbnQgaWQpOwotCi0JLy8gSUJTSXRlbVByb3ZpZGVyIGdldEl0ZW1Qcm92aWRlcihFT2JqZWN0IGVPYmopOwotCi0Jdm9pZCBzZXRQYXJlbnQoT2JqZWN0IG9iaik7Ci0KLQlPYmplY3QgZ2V0VG9wSXRlbSgpOwotCi0Jdm9pZCBzZXRUb3BJdGVtKE9iamVjdCB0b3ApOwotCi0JYm9vbGVhbiBpc1JvbGxlZFVwKCk7Ci0KLQl2b2lkIHNldFJvbGxlZFVwKGJvb2xlYW4gYik7Ci0KLQlib29sZWFuIGlzRmlyc3RFbGVtZW50KE9iamVjdCBvYmopOwotCi0JYm9vbGVhbiBpc0xhc3RFbGVtZW50KE9iamVjdCBvYmopOwotCi0JLy8gTGlzdCBnZXRGaWx0ZXJlZEJyZWFrZG93bkVsZW1lbnRzKE9iamVjdCBhY3Rpdml0eU9iaiwgT2JqZWN0IG9iaik7Ci0KLQl2b2lkIG1vdmVVcChPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpOwotCi0Jdm9pZCBtb3ZlRG93bihPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpOwotCi0JQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpOwotCi0JLy8gR3JhcGhpY2FsRGF0YSBnZXRHcmFwaGljYWxEYXRhKCk7Ci0KLQkvLyB2b2lkIHNldEdyYXBoaWNhbERhdGEoR3JhcGhpY2FsRGF0YSBkYXRhKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0IGFzIGEgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKiAgICAgICAgICAgIG9uZSBvZiB0aGUgY29sdW1uIElEIGNvbnN0YW50cyBDT0xfWFhYCi0JICogQHJldHVybiBTdHJpbmcgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqICAgICAgICAgICAgb25lIG9mIHRoZSBjb2x1bW4gSUQgY29uc3RhbnRzIENPTF9YWFgKLQkgKiBAcGFyYW0gdGV4dFZhbHVlCi0JICovCi0Jdm9pZCBzZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LCBTdHJpbmcgdGV4dFZhbHVlKTsKLQotCUxpc3QgZ2V0TGlzdGVuZXJzKCk7Ci0KLQlQcmVkZWNlc3Nvckxpc3QgZ2V0UHJlZGVjZXNzb3JzKCk7Ci0KLQlCb29sZWFuIGlzRXhwYW5kZWQoKTsKLQotCXZvaWQgc2V0RXhwYW5kZWQoQm9vbGVhbiBiKTsKLQotCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsIExpc3QgZHJvcEVsZW1lbnRzKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MTYyZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5pbnRlcm5hbC5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkgZXh0ZW5kcyBJV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JQ29sdW1uQXdhcmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JQ29sdW1uQXdhcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IzODIwYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSUNvbHVtbkF3YXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIHRvIHBhc3MgdGhlIGNvbHVtbiBpbmRleCAvIG5hbWUgbWFwIGZyb20gdGhlIHVzZXIgaW50ZXJmYWNlIHRvCi0gKiB0aGUgYWRhcHRlciB0aGF0IGltcGxlbWVudHMgaXQgc28gdGhlIGFkYXB0ZXIgY2FuIHByb3ZpZGUgdGhlIGNvcnJlY3QgZGF0YQotICogZm9yIHRoZSBjb2x1bW5zIGV2ZW4gdGhlaXIgaW5kZXggaGF2ZSBjaGFuZ2VkLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb2x1bW5Bd2FyZSB7Ci0KLQlNYXAgZ2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoKTsKLQotCXZvaWQgc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoTWFwIG1hcCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0Yzg0NjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJvY2Vzc0l0ZW1Qcm92aWRlciB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMDUyNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJaW1wbGVtZW50cyBJQ29sdW1uQXdhcmUgewotCi0JcHJpdmF0ZSBNYXAgY29sdW1uSW5kZXhUb05hbWVNYXA7Ci0KLQkvKioKLQkgKiBSZWZlcmVuY2VzIHRvIHN0YXRlZnVsIGFkYXB0ZXJzIGNyZWF0ZWQgYnkgdGhpcyBhZGFwdGVyIGZhY3RvcnkKLQkgKi8KLQlwcml2YXRlIFNldCBkaXNwb3NhYmxlQWRhcHRlcnMgPSBuZXcgSGFzaFNldCgpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotCQkvLyBjcmVhdGVkQWRhcHRlcnMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFjdGl2aXR5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVQaGFzZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBoYXNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUJyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHN1cGVyLmNyZWF0ZUJyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkRlc2NyaXB0b3JzQWRhcHRlckZhY3RvcnkjY3JlYXRlRGVzY3JpcHRvckFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IERlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlRGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuRGVzY3JpcHRvcnNBZGFwdGVyRmFjdG9yeSNjcmVhdGVSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuRGVzY3JpcHRvcnNBZGFwdGVyRmFjdG9yeSNjcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuRGVzY3JpcHRvcnNBZGFwdGVyRmFjdG9yeSNjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUNvbHVtbkF3YXJlI3NldENvbHVtbkluZGV4VG9OYW1lTWFwKGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoTWFwIG1hcCkgewotCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCWNvbHVtbkluZGV4VG9OYW1lTWFwID0gbWFwOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUNvbHVtbkF3YXJlKSB7Ci0JCQkoKElDb2x1bW5Bd2FyZSkgYWRhcHRlcikKLQkJCQkJLnNldENvbHVtbkluZGV4VG9OYW1lTWFwKGNvbHVtbkluZGV4VG9OYW1lTWFwKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gc3VwZXIuYWRhcHQobm90aWZpZXIsIHR5cGUpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDb2x1bW5Bd2FyZSkgewotCQkJKChJQ29sdW1uQXdhcmUpIGFkYXB0ZXIpCi0JCQkJCS5zZXRDb2x1bW5JbmRleFRvTmFtZU1hcChjb2x1bW5JbmRleFRvTmFtZU1hcCk7Ci0JCX0KLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3RhdGVmdWxJdGVtUHJvdmlkZXIKLQkJCQkmJiBub3RpZmllciBpbnN0YW5jZW9mIEVPYmplY3QKLQkJCQkmJiAoKEVPYmplY3QpIG5vdGlmaWVyKS5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJZGlzcG9zYWJsZUFkYXB0ZXJzLmFkZChhZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Qcm9jZXNzdHlwZXNBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzQWRhcHRlcigpCi0JICovCi0JLy8gcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JLy8gcmV0dXJuIG5ldyBQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMpOwotCS8vIH0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJvY2Vzc3R5cGVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpCi0JICovCi0JLy8gcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkvLyByZXR1cm4gY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKTsKLQkvLyB9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByb2Nlc3N0eXBlc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpCi0JICovCi0JLy8gcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCS8vIHJldHVybiBjcmVhdGVQcm9jZXNzQWRhcHRlcigpOwotCS8vIH0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50QWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NQYWNrYWdlQWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyID0gbmV3IFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVDb21wb3NpdGVSb2xlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcG9zaXRlUm9sZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVDb21wb3NpdGVSb2xlQWRhcHRlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUm9sZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVBZGFwdGVyKCkgewotCQlpZiAocm9sZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyb2xlSXRlbVByb3ZpZGVyID0gbmV3IFJvbGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHJvbGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya09yZGVyQWRhcHRlcigpIHsKLQkJaWYgKHdvcmtPcmRlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3b3JrT3JkZXJJdGVtUHJvdmlkZXIgPSBuZXcgV29ya09yZGVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiB3b3JrT3JkZXJJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklDb2x1bW5Bd2FyZSNnZXRDb2x1bW5JbmRleFRvTmFtZU1hcCgpCi0JICovCi0JcHVibGljIE1hcCBnZXRDb2x1bW5JbmRleFRvTmFtZU1hcCgpIHsKLQkJcmV0dXJuIGNvbHVtbkluZGV4VG9OYW1lTWFwOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoIWRpc3Bvc2FibGVBZGFwdGVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpc3Bvc2FibGVBZGFwdGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJRGlzcG9zYWJsZSBhZGFwdGVyID0gKElEaXNwb3NhYmxlKSBpdGVyLm5leHQoKTsKLQkJCQlhZGFwdGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWRpc3Bvc2FibGVBZGFwdGVycy5jbGVhcigpOwotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL01pbGVzdG9uZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9NaWxlc3RvbmVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3Y2UxZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL01pbGVzdG9uZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWlsZXN0b25lV3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBNaWxlc3RvbmVXcmFwcGVySXRlbVByb3ZpZGVyKE1pbGVzdG9uZSB2YWx1ZSwgT2JqZWN0IG93bmVyLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1pbGVzdG9uZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIE1pbGVzdG9uZVdyYXBwZXJJdGVtUHJvdmlkZXIoTWlsZXN0b25lIG1pbGVzdG9uZSwgT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIobWlsZXN0b25lLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL09CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4M2U0OWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL09CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5PQlNEcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuT0JTRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogSXRlbSBwcm92aWRlciBmb3IgVGVhbSBBbGxvY2F0aW9uIGFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBEaXNwb3NhYmxlIHJvbGxlZFVwV3JhcHBlcnM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIEFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgb2JqZWN0OwotCQkvLyBpZihoYXNDaGlsZERlc2NyaXB0b3IoYWN0KSkgewotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkvLyAoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJLy8gKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksCi0JCS8vIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkpKTsKLQkJLy8gICAgCQkKLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJLy8gKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCS8vIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLAotCQkvLyBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZWFtUHJvZmlsZSgpKSk7Ci0JCS8vCi0JCS8vIH0KLQkJLy8gZWxzZSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVBoYXNlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVJdGVyYXRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUFjdGl2aXR5KCkpKTsKLQotCQkvLyBpZihhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pc0VtcHR5KCkpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUm9sZURlc2NyaXB0b3IoKSkpOwotCi0JCS8vIENPTVBPU0lURSBST0xFIEZFQVRVUkUgSVMgTk9UIEFWQUlMQUJMRSBGT1IgRklSU1QgUkVMRUFTRS4KLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJLy8gKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCS8vIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLAotCQkvLyBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb21wb3NpdGVSb2xlKCkpKTsKLQkJLy8JCQkJCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVRlYW1Qcm9maWxlKCkpKTsKLQotCQkvLyB9Ci0JCS8vIH0KLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVNaWxlc3RvbmUoKSkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCWNoaWxkID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCi0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IGNoaWxkIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IKLQkJCQl8fCBjaGlsZCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlIHx8IGNoaWxkIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQlyZXR1cm4gc3VwZXIuYWNjZXB0QXNDaGlsZChjaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldE9iamVjdChvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3QoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKChSb2xlRGVzY3JpcHRvcikgZGVzY3JpcHRvcikuZ2V0Um9sZSgpOwotCQl9Ci0JCWNhdGNoKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjY3JlYXRlRHJvcENvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY3JlYXRlRHJvcENvbW1hbmQoT2JqZWN0IG93bmVyLAotCQkJTGlzdCBkcm9wRWxlbWVudHMpIHsKLQkJcmV0dXJuIG5ldyBPQlNEcm9wQ29tbWFuZCgoQWN0aXZpdHkpIG93bmVyLCBkcm9wRWxlbWVudHMpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCU9iamVjdCBvd25lciwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCS8vIFN5c3RlbS5vdXQKLQkJLy8gLnByaW50bG4oIkVOVEVSOgotCQkvLyBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChkb21haW4sCi0JCS8vIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uKSIpOwotCQlDb21tYW5kIGNtZCA9IG5ldyBPQlNEcmFnQW5kRHJvcENvbW1hbmQoZG9tYWluLCBvd25lciwgbG9jYXRpb24sCi0JCQkJb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uKTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBjYW4gZXhlY3V0ZTogIiArIGNtZC5jYW5FeGVjdXRlKCkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBvd25lcjogIiArIG93bmVyKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgY29sbGVjdGlvbjogIiArIGNvbGxlY3Rpb24pOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBsb2NhdGlvbjogIiArIGxvY2F0aW9uKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgb3BlcmF0aW9uczogIiArIG9wZXJhdGlvbnMpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBvcGVyYXRpb246ICIgKyBvcGVyYXRpb24pOwotCQkvLyAgICAgICAgCi0JCS8vIFN5c3RlbS5vdXQKLQkJLy8gLnByaW50bG4oIkVYSVQ6Ci0JCS8vIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIjY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKGRvbWFpbiwKLQkJLy8gb3duZXIsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pIik7Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNyZWZyZXNoQ2hpbGRyZW4ob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uLAotCS8vIGphdmEudXRpbC5MaXN0KQotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENoaWxkcmVuKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sIExpc3QKLQkvLyBuZXdPck9sZENoaWxkcmVuKSB7Ci0JLy8gaWYoIW5ld09yT2xkQ2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0JLy8gUHJvY2VzcyB0b3BBY3QgPSAoUHJvY2VzcykgZ2V0VG9wSXRlbSgpOwotCS8vIEFkYXB0ZXJGYWN0b3J5IHJvb3RBZGFwdGVyRmFjdG9yeSA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCS8vCQkJCQkJCi0JLy8gUHJvY2Vzc1V0aWwucmVmcmVzaFZpZXdlcihyb290QWRhcHRlckZhY3RvcnksIHRvcEFjdCk7Ci0JLy8JCQkKLQkvLyByZXR1cm47Ci0JLy8KLQkvLyB9Ci0JLy8gfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2lzTmV3RGVzY3JpcHRvcihqYXZhLnV0aWwuTGlzdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05ld0Rlc2NyaXB0b3IoTGlzdCBjaGlsZHJlbiwgT2JqZWN0IGNoaWxkKSB7Ci0JCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCS8vIGNvbGxlY3QgYWxsIHJvbGUgZGVzY3JpcHRvcnMgb3IgdGhlaXIgd3JhcHBlcnMgZmlyc3QgZm9yIG1hdGNoaW5nIHdpdGggdGVhbSBwcm9maWxlcwotCQkvLyBhbmQgZWxpbWluYXRlIHRoZSBkdXBsaWNhdGVzIGxhdGVyIGluIGdldENoaWxkcmVuKCkKLQkJLy8KLQkJaWYob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc05ld0Rlc2NyaXB0b3IoY2hpbGRyZW4sIG9iaik7Ci0JfQkJCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHJvbGxlZFVwV3JhcHBlcnMgIT0gbnVsbCkgewotCQkJcm9sbGVkVXBXcmFwcGVycy5kaXNwb3NlKCk7Ci0JCX0KLQotCQlpZiAoaXNSb2xsZWRVcCgpKSB7Ci0JCQlMaXN0IHRlYW1Qcm9maWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUxpc3Qgcm9sZURlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSGFzaFNldCByb2xlVGVhbVBhaXJzID0gbmV3IEhhc2hTZXQoKTsKLQkJCUhhc2hTZXQgcm9sZURlc2NyaXB0b3JzV2l0aG91dExpbmtlZEVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLQkJCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJCi0JCQkvLyBjb2xsZWN0IGFsbCB0ZWFtIHByb2ZpbGVzIHVuZGVyIHRoaXMgYWN0aXZpdHkKLQkJCS8vCi0JCQlIYXNoU2V0IHZhbGlkVGVhbVByb2ZpbGVzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChvKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJCWlmKHZhbGlkVGVhbVByb2ZpbGVzLmFkZChlKSkgewotCQkJCQkJdGVhbVByb2ZpbGVzLmFkZChvKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQlSb2xlRGVzY3JpcHRvciBkZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBlOwotCQkJCQlMaXN0IGxpc3Q7Ci0JCQkJCUxpc3QgZGVzY3JpcHRvcnMgPSBudWxsOwotCQkJCQlDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGNvbXBvc2VkV3JhcHBlciA9IG51bGw7CQkJCQkKLQkJCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCU9iamVjdCB2YWx1ZSA9ICgoUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKWNoaWxkKS5nZXRWYWx1ZSgpOwotCQkJCQkJaWYodmFsdWUgaW5zdGFuY2VvZiBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJY29tcG9zZWRXcmFwcGVyID0gKENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHZhbHVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmKGNvbXBvc2VkV3JhcHBlciAhPSBudWxsKSB7Ci0JCQkJCQlsaXN0ID0gbmV3IFVuaXF1ZUVMaXN0KCk7Ci0JCQkJCQlkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb21wb3NlZFdyYXBwZXIuZ2V0VmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgbyA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKG8pOwotCQkJCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQkJCQlMaXN0IHRlYW1zID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0VGVhbVByb2ZpbGVzKChSb2xlRGVzY3JpcHRvcikgZWxlbWVudCk7Ci0JCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHRlYW1zLml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJT2JqZWN0IHRlYW0gPSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJCWlmKGxpc3QuYWRkKHRlYW0pKSB7Ci0JCQkJCQkJCQkJZGVzY3JpcHRvcnMuYWRkKG8pOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlsaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0VGVhbVByb2ZpbGVzKGRlc2MpOwotCQkJCQl9Ci0JCQkJCWludCBzaXplID0gbGlzdC5zaXplKCk7IAotCQkJCQlpZihzaXplID4gMSkgewotCQkJCQkJaWYgKHJvbGxlZFVwV3JhcHBlcnMgPT0gbnVsbCkgewotCQkJCQkJCXJvbGxlZFVwV3JhcHBlcnMgPSBuZXcgRGlzcG9zYWJsZSgpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlib29sZWFuIHJlYWRPbmx5ID0gZmFsc2U7Ci0JCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJCXJlYWRPbmx5ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgY2hpbGQpCi0JCQkJCQkJLmlzUmVhZE9ubHkoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJLy8gc2hvdyBvbmUgZGVzY3JpcHRvciBwZXIgdGVhbQotCQkJCQkJLy8KLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQkJVGVhbVJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IG5ldyBUZWFtUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIoCi0JCQkJCQkJCQlkZXNjcmlwdG9ycy5nZXQoaSksIG9iamVjdCwgYWRhcHRlckZhY3RvcnkpOwotCQkJCQkJCWl0ZW1Qcm92aWRlci5yZWFkT25seSA9IHJlYWRPbmx5OwotCQkJCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIGxpc3QuZ2V0KGkpOwotCQkJCQkJCQotLy8JCQkJCQkJLy8gYWRkIHRlYW0gdG8gdGhlIHRlYW0gbGlzdCBvbmx5IGlmIHRoZSB0ZWFtIGlzIHVuZGVyIHRoaXMgYWN0aXZpdHkKLS8vCQkJCQkJCS8vCi0vLwkJCQkJCQlpZih2YWxpZFRlYW1Qcm9maWxlcy5jb250YWlucyh0ZWFtKSkgewotLy8JCQkJCQkJCWFkZFRlYW1Qcm9maWxlcyhvYmplY3QsIHRlYW1Qcm9maWxlcywgdGVhbSk7Ci0vLwkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJaXRlbVByb3ZpZGVyLnRlYW0gPSB0ZWFtOwotCQkJCQkJCXJvbGxlZFVwV3JhcHBlcnMuYWRkKGl0ZW1Qcm92aWRlcik7Ci0JCQkJCQkJcm9sZURlc2NyaXB0b3JzLmFkZChpdGVtUHJvdmlkZXIpOwotCQkJCQkJCXJvbGVUZWFtUGFpcnMuYWRkKG5ldyBSb2xlVGVhbVBhaXIoKFJvbGUpIGdldE9iamVjdChkZXNjKSwgdGVhbSkpOwotCQkJCQkJfQkJCQkJCQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJUm9sZSByb2xlID0gKFJvbGUpIGdldE9iamVjdChkZXNjKTsKLQkJCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIChzaXplID09IDEgPyBsaXN0LmdldCgwKSA6IG51bGwpOwotCQkJCQkJaWYocm9sZSA9PSBudWxsKSB7Ci0JCQkJCQkJaWYoIXJvbGVEZXNjcmlwdG9yc1dpdGhvdXRMaW5rZWRFbGVtZW50cy5jb250YWlucyhlKSkgewotCQkJCQkJCQlyb2xlRGVzY3JpcHRvcnMuYWRkKGNoaWxkKTsKLQkJCQkJCQkJCi0vLwkJCQkJCQkJLy8gYWRkIHRlYW0gdG8gdGhlIHRlYW0gbGlzdCBvbmx5IGlmIHRoZSB0ZWFtIGlzIHVuZGVyIHRoaXMgYWN0aXZpdHkKLS8vCQkJCQkJCQkvLwotLy8JCQkJCQkJCWlmKHRlYW0gIT0gbnVsbCAmJiB2YWxpZFRlYW1Qcm9maWxlcy5jb250YWlucyh0ZWFtKSkgewotLy8JCQkJCQkJCQlhZGRUZWFtUHJvZmlsZXMob2JqZWN0LCB0ZWFtUHJvZmlsZXMsIHRlYW0pOwotLy8JCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJCXJvbGVEZXNjcmlwdG9yc1dpdGhvdXRMaW5rZWRFbGVtZW50cy5hZGQoZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJUm9sZVRlYW1QYWlyIHJvbGVUZWFtUGFpciA9IG5ldyBSb2xlVGVhbVBhaXIocm9sZSwgdGVhbSk7Ci0JCQkJCQkJaWYoIXJvbGVUZWFtUGFpcnMuY29udGFpbnMocm9sZVRlYW1QYWlyKSkgewotCQkJCQkJCQlyb2xlRGVzY3JpcHRvcnMuYWRkKGNoaWxkKTsKLQkJCQkJCQkJCi0vLwkJCQkJCQkJLy8gYWRkIHRlYW0gdG8gdGhlIHRlYW0gbGlzdCBvbmx5IGlmIHRoZSB0ZWFtIGlzIHVuZGVyIHRoaXMgYWN0aXZpdHkKLS8vCQkJCQkJCQkvLwotLy8JCQkJCQkJCWlmKHRlYW0gIT0gbnVsbCAmJiB2YWxpZFRlYW1Qcm9maWxlcy5jb250YWlucyh0ZWFtKSkgewotLy8JCQkJCQkJCQlhZGRUZWFtUHJvZmlsZXMob2JqZWN0LCB0ZWFtUHJvZmlsZXMsIHRlYW0pOwotLy8JCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJCXJvbGVUZWFtUGFpcnMuYWRkKHJvbGVUZWFtUGFpcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcm9sZVRlYW1QYWlycy5jbGVhcigpOwotCQkJcm9sZVRlYW1QYWlycyA9IG51bGw7Ci0JCQlDb2xsZWN0aW9ucy5zb3J0KHRlYW1Qcm9maWxlcywgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCQlDb2xsZWN0aW9ucy5zb3J0KHJvbGVEZXNjcmlwdG9ycywgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QodGVhbVByb2ZpbGVzKTsKLQkJCWNoaWxkcmVuLmFkZEFsbChyb2xlRGVzY3JpcHRvcnMpOwotCQkJCi0JCQl1cGRhdGVDYWNoZWRDaGlsZHJlbihjaGlsZHJlbik7Ci0JCQkKLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfQotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJdXBkYXRlQ2FjaGVkQ2hpbGRyZW4oY2hpbGRyZW4pOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0T0JTRWNsYXNzZXMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFRlYW1Qcm9maWxlcyhPYmplY3Qgb3duZXIsIENvbGxlY3Rpb24gdGVhbVByb2ZpbGVzLCBUZWFtUHJvZmlsZSB0ZWFtUHJvZmlsZSkgewotCQlpZiAoIVRuZ1V0aWwuY2hlY2tFeGlzdCh0ZWFtUHJvZmlsZXMsIHRlYW1Qcm9maWxlKSkgewotCQkJVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSBuZXcgVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyKAotCQkJCQl0ZWFtUHJvZmlsZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJCQkKLS8vCQkJCQkvLyBkb24ndCBzaG93IHJvbGUgZGVzY3JpcHRvcnMKLS8vCQkJCQkvLwotLy8JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJCQlPYmplY3QgY2hpbGQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0vLwkJCQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLS8vCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9CQotCQkJCQkKLQkJCQkJcmV0dXJuIGNoaWxkcmVuOwotCQkJCX0KLQkJCQkKLQkJCX07Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdCh0ZWFtUHJvZmlsZSwKLQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJd3JhcHBlci5yZWFkT25seSA9IChnZXRUb3BJdGVtKCkgIT0gYWRhcHRlci5nZXRUb3BJdGVtKCkpOwotCQkJdGVhbVByb2ZpbGVzLmFkZCh3cmFwcGVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFRlYW1Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCQlSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgewotCQkKLQkJCi0JCXB1YmxpYyBUZWFtUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIoT2JqZWN0IHZhbHVlLCBPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gdmFsdWUKLQkJICogQHBhcmFtIG93bmVyCi0JCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCQkgKi8KLQkJcHVibGljIFRlYW1Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcihSb2xlRGVzY3JpcHRvciB2YWx1ZSwKLQkJCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCXJlYWRPbmx5ID0gZmFsc2U7Ci0JCX0KLQotCQlwcml2YXRlIFRlYW1Qcm9maWxlIHRlYW07Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1RFQU1TICYmIHRlYW0gIT0gbnVsbCkgewotCQkJCXJldHVybiBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUodGVhbSk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyI2NyZWF0ZVdyYXBwZXIoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSkKLQkJICovCi0JCXByb3RlY3RlZCBJV3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVXcmFwcGVyKE9iamVjdCB2YWx1ZSwKLQkJCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBzdXBlcgotCQkJCQkuY3JlYXRlV3JhcHBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCXdyYXBwZXIucmVhZE9ubHkgPSByZWFkT25seTsKLQkJCXJldHVybiB3cmFwcGVyOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUm9sZVRlYW1QYWlyIHsKLQkJcHJpdmF0ZSBSb2xlIHJvbGU7Ci0JCXByaXZhdGUgVGVhbVByb2ZpbGUgdGVhbTsKLQotCQlSb2xlVGVhbVBhaXIoUm9sZSByb2xlLCBUZWFtUHJvZmlsZSB0ZWFtKSB7Ci0JCQl0aGlzLnJvbGUgPSByb2xlOwotCQkJdGhpcy50ZWFtID0gdGVhbTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmKG9iaiA9PSB0aGlzKSByZXR1cm4gdHJ1ZTsKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIFJvbGVUZWFtUGFpcikgewotCQkJCVJvbGVUZWFtUGFpciBvdGhlciA9IChSb2xlVGVhbVBhaXIpIG9iajsKLQkJCQlyZXR1cm4gcm9sZSA9PSBvdGhlci5yb2xlICYmICh0ZWFtID09IG90aGVyLnRlYW0gfHwgKHRlYW0gPT0gbnVsbCAmJiBvdGhlci50ZWFtID09IG51bGwpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCVN0cmluZyBzdHIgPSByb2xlLmdldEd1aWQoKTsKLQkJCWlmKHRlYW0gIT0gbnVsbCkgewotCQkJCXN0ciA9IHN0ciArIHRlYW0uZ2V0R3VpZCgpOwotCQkJfQotCQkJcmV0dXJuIHN0ci5oYXNoQ29kZSgpOwkJCQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdSb2xsdXBOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlpZihUbmdVdGlsLnVud3JhcChvYmplY3QpIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc1dyYXBwaW5nUm9sbHVwTmVlZGVkKG9iamVjdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVSb2xsdXBXcmFwcGVyKE9iamVjdCBvYmplY3QsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJT2JqZWN0IHdyYXBwZXIgPSBzdXBlci5jcmVhdGVSb2xsdXBXcmFwcGVyKG9iamVjdCwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJcmV0dXJuIG5ldyBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIod3JhcHBlciwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTQwMGQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFjdGl2aXR5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IE9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVQaGFzZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBoYXNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRlYW1Qcm9maWxlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFRlYW1Qcm9maWxlSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmNyZWF0ZVRlYW1Qcm9maWxlQWRhcHRlcigpKTsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRlYW1Qcm9maWxlQWRhcHRlcigpCi0JLy8gKi8KLQkvLyBwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wb3NpdGVSb2xlQWRhcHRlcigpIHsKLQkvLyByZXR1cm4gbmV3IE9CU0NvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlUGhhc2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNaWxlc3RvbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IE9CU01pbGVzdG9uZUl0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVNaWxlc3RvbmVBZGFwdGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzQWRhcHRlcigpCi0JICovCi0JLy8gcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JLy8gcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCS8vIH0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBPQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvT0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvT0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYWExZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL09CU01pbGVzdG9uZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIHsKLQotCS8vIHByaXZhdGUgQ29sbGVjdGlvbiBlQ2xhc3NlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIE9CU01pbGVzdG9uZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCS8vICovCi0JLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCS8vIHJldHVybiBUbmdVdGlsLmdldEFsbENoaWxkcmVuKChQcm9jZXNzQ29udHJpYnV0aW9uKSBvYmplY3QsCi0JLy8gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSwKLQkvLyBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSkpOwotCS8vIH0KLQkvLyAgICAKLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCS8vICovCi0JLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCS8vIENvbGxlY3Rpb24gZWxlbWVudHMgPSBzdXBlci5nZXRFbGVtZW50cyhvYmplY3QpOwotCS8vIHJldHVybiBlbGVtZW50czsKLQkvLyB9Ci0KLQkvLyBwdWJsaWMgTGlzdCBnZXRGaWx0ZXJlZEJyZWFrZG93bkVsZW1lbnRzKE9iamVjdCBhY3Rpdml0eSwgT2JqZWN0IG9iaikKLQkvLyB7Ci0JLy8gTGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gKChBY3Rpdml0eSlhY3Rpdml0eSkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ID0gYnJlYWtkb3duRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkvLyB7Ci0JLy8gT2JqZWN0IGVsZW1lbnRPYmogPSBpdC5uZXh0KCk7Ci0JLy8gaWYgKChlbGVtZW50T2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHx8IChlbGVtZW50T2JqIGluc3RhbmNlb2YKLQkvLyBUZWFtUHJvZmlsZSkgfHwgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB8fCAoZWxlbWVudE9iagotCS8vIGluc3RhbmNlb2YgTWlsZXN0b25lKSB8fCAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSkKLQkvLyB7Ci0JLy8gZWxlbWVudHMuYWRkKGVsZW1lbnRPYmopOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGVsZW1lbnRzOwotCS8vIH0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0T0JTRWNsYXNzZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzMxZTUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9CU1Byb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBPQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0KLQlwdWJsaWMgT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLmRlbGVnYXRlSXRlbVByb3ZpZGVyID0gZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkFjdGl2aXR5SXRlbVByb3ZpZGVyI2dldFByb3BlcnR5RGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkJCQkJLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjE1ZmExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlBCU0RyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5QQlNEcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIAotaW1wbGVtZW50cyBJQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIKLXsKLQotCXByaXZhdGUgRGlzcG9zYWJsZSByb2xsZWRVcFdyYXBwZXJzOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQkvLyBBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG9iamVjdDsKLQkJLy8gaWYoaGFzQ2hpbGREZXNjcmlwdG9yKGFjdCkpIHsKLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJLy8gKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCS8vIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLAotCQkvLyBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSkpOwotCQkvLyB9Ci0JCS8vIGVsc2UgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVQaGFzZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlSXRlcmF0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVBY3Rpdml0eSgpKSk7Ci0KLQkJLy8gaWYoYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKSk7Ci0JCS8vIH0KLQotCQkvLyB9Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlTWlsZXN0b25lKCkpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBjaGlsZCkgewotCQljaGlsZCA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCXx8IGNoaWxkIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yCi0JCQkJfHwgY2hpbGQgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCXJldHVybiBzdXBlci5hY2NlcHRBc0NoaWxkKGNoaWxkKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHJvbGxlZFVwV3JhcHBlcnMgIT0gbnVsbCkgewotCQkJcm9sbGVkVXBXcmFwcGVycy5kaXNwb3NlKCk7Ci0JCX0KLQotCQlpZiAoaXNSb2xsZWRVcCgpKSB7Ci0JCQlNYXAgd29ya1Byb2R1Y3RUb1dyYXBwZXJzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlOwotCQkJCQlMaXN0IGxpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXREZWxpdmVyYWJsZURlc2NyaXB0b3JzKGRlc2MpOwotCQkJCQlPYmplY3Qgd3JhcHBlcktleSA9IGRlc2MuZ2V0V29ya1Byb2R1Y3QoKSA9PSBudWxsID8gKE9iamVjdClkZXNjIDogZGVzYy5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQlMaXN0IHdyYXBwZXJzID0gKExpc3QpIHdvcmtQcm9kdWN0VG9XcmFwcGVyc01hcC5nZXQod3JhcHBlcktleSk7Ci0JCQkJCWlmIChsaXN0LnNpemUoKSA8IDEpIHsKLQkJCQkJCS8vIGNoZWNrIGlmIHRoZSBkZXNjcmlwdG9yIGFscmVhZHkgZXhpc3RzIGluIHRoZQotCQkJCQkJLy8gcm9sbHVwIGxpc3QKLQkJCQkJCS8vCi0JCQkJCQlpZih3cmFwcGVycyA9PSBudWxsKSB7Ci0JCQkJCQkJd3JhcHBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJd29ya1Byb2R1Y3RUb1dyYXBwZXJzTWFwLnB1dCh3cmFwcGVyS2V5LCB3cmFwcGVycyk7Ci0JCQkJCQkJd3JhcHBlcnMuYWRkKG5ldyBDb21wb3NlZFdQRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoY2hpbGQsIG9iamVjdCwgYWRhcHRlckZhY3RvcnkpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWZvciAoaW50IGkgPSB3cmFwcGVycy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCQkJCQkoKENvbXBvc2VkV1BEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcil3cmFwcGVycy5nZXQoaSkpLmFkZFdvcmtQcm9kdWN0RGVzY3JpcHRvcihjaGlsZCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJCWJvb2xlYW4gY2hlY2tFeGlzdCA9IHRydWU7CQkJCQkJCQotCQkJCQkJCWlmKHdyYXBwZXJzID09IG51bGwpIHsKLQkJCQkJCQkJd3JhcHBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCXdvcmtQcm9kdWN0VG9XcmFwcGVyc01hcC5wdXQod3JhcHBlcktleSwgd3JhcHBlcnMpOwotCQkJCQkJCQljaGVja0V4aXN0ID0gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJCWlmKGNoZWNrRXhpc3QpIHsKLQkJCQkJCQkJLy8gcmVtb3ZlIGFueSB3cmFwcGVyIHRoYXQgaXMgbm90IG9mIHR5cGUgRGVsaXZlcmFibGVXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZnJvbSB0aGUgd3JhcHBlciBsaXN0Ci0JCQkJCQkJCS8vCi0JCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB3cmFwcGVycy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQlPYmplY3Qgd3JhcHBlciA9IChPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJCWlmKCEod3JhcHBlciBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKSkgewotCQkJCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJCWNoZWNrRXhpc3QgPSB3cmFwcGVycy5zaXplKCkgPiAwOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQkvLyBzaG93IG9uZSBkZXNjcmlwdG9yIHBlciBkZWxpdmVyYWJsZQotCQkJCQkJCS8vCi0JCQkJCQkJYWRkX2Rlc2NyaXB0b3JzOgotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQkJT2JqZWN0IGRlbGl2ZXJhYmxlRGVzY3JpcHRvciA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYoY2hlY2tFeGlzdCkgewotCQkJCQkJCQkJZm9yIChpbnQgaSA9IHdyYXBwZXJzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJCQkJCQkJRGVsaXZlcmFibGVXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChEZWxpdmVyYWJsZVdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcikgd3JhcHBlcnMuZ2V0KGkpOwotCQkJCQkJCQkJCWlmKHdyYXBwZXIuZGVsaXZlcmFibGVEZXNjcmlwdG9yID09IGRlbGl2ZXJhYmxlRGVzY3JpcHRvcikgewotCQkJCQkJCQkJCQl3cmFwcGVyLmFkZFdvcmtQcm9kdWN0RGVzY3JpcHRvcihjaGlsZCk7Ci0JCQkJCQkJCQkJCWNvbnRpbnVlIGFkZF9kZXNjcmlwdG9yczsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQotCQkJCQkJCQlEZWxpdmVyYWJsZVdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSBuZXcgRGVsaXZlcmFibGVXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIoCi0JCQkJCQkJCQkJZGVzYywgb2JqZWN0LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJCQkJCWl0ZW1Qcm92aWRlci5kZWxpdmVyYWJsZURlc2NyaXB0b3IgPSBkZWxpdmVyYWJsZURlc2NyaXB0b3I7Ci0JCQkJCQkJCXdyYXBwZXJzLmFkZChpdGVtUHJvdmlkZXIpOwotCQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJTGlzdCByb2xsZWRVcENoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd29ya1Byb2R1Y3RUb1dyYXBwZXJzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCXJvbGxlZFVwQ2hpbGRyZW4uYWRkQWxsKChDb2xsZWN0aW9uKSBpdGVyLm5leHQoKSk7Ci0JCQkJCi0JCQl9Ci0JCQlMaXN0IHJlc3VsdCA9IHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihyb2xsZWRVcENoaWxkcmVuLCB0cnVlKTsKLQkJCWlmKHJvbGxlZFVwV3JhcHBlcnMgPT0gbnVsbCkgewotCQkJCXJvbGxlZFVwV3JhcHBlcnMgPSBuZXcgRGlzcG9zYWJsZSgpOwotCQkJfQotCQkJcm9sbGVkVXBXcmFwcGVycy5hZGRBbGwocmVzdWx0KTsKLQkJCQotCQkJLy8gZGlzcG9zZSB3cmFwcGVycyBvZiBzdWJhcnRpZmFjdAotCQkJLy8KLQkJCWZvcihpbnQgaSA9IHJvbGxlZFVwQ2hpbGRyZW4uc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlJV3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKElXcmFwcGVySXRlbVByb3ZpZGVyKSByb2xsZWRVcENoaWxkcmVuLmdldChpKTsKLQkJCQlpZighcm9sbGVkVXBXcmFwcGVycy5jb250YWlucyh3cmFwcGVyKSkgewotCQkJCQl3cmFwcGVyLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCUNvbGxlY3Rpb25zLnNvcnQocmVzdWx0LCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJCQotCQkJdXBkYXRlQ2FjaGVkQ2hpbGRyZW4ocmVzdWx0KTsKLQkJCQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSwgZmFsc2UpOwotCQkKLQkJdXBkYXRlQ2FjaGVkQ2hpbGRyZW4oY2hpbGRyZW4pOwotCQkKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYocm9sbGVkVXBXcmFwcGVycyAhPSBudWxsKSB7Ci0JCQlyb2xsZWRVcFdyYXBwZXJzLmRpc3Bvc2UoKTsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNpc05ld0Rlc2NyaXB0b3IoamF2YS51dGlsLkxpc3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXdEZXNjcmlwdG9yKExpc3QgY2hpbGRyZW4sIE9iamVjdCBjaGlsZCkgewotCQkvLyByZXR1cm4gdHJ1ZSB0byBsZXQgb3ZlcnJpZGVuIGdldENoaWxkcmVuKCkgdG8gaGFuZGxlIHRoZSB1bmlxdWVuZXNzIG9mIHRoZSByb2xsdXAgbGlzdAotCQkvLwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjcmVhdGVPck1vdmVQYWNrYWdlRm9yKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU9yTW92ZVBhY2thZ2VGb3IoTGlzdCBuZXdDaGlsZHJlbikgewotCQlzdXBlci5jcmVhdGVPck1vdmVQYWNrYWdlRm9yKG5ld0NoaWxkcmVuKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXdDaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCS8vIGFkZCBkZWxpdmVyYWJsZSBwYXJ0cyB0byB0aGUgYWN0aXZpdHkncyBwYWNrYWdlCi0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGU7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHdwZC5nZXREZWxpdmVyYWJsZVBhcnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBwYXJ0ID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgaXRlcmF0b3IKLQkJCQkJCQkubmV4dCgpOwotCQkJCQlQcm9jZXNzVXRpbC5hZGRUb0NvbnRhaW5lcihwYXJ0LCB0aGlzLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0T2JqZWN0KG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE9iamVjdChEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJcmV0dXJuICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5nZXRXb3JrUHJvZHVjdCgpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCU9iamVjdCBvd25lciwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgUEJTRHJhZ0FuZERyb3BDb21tYW5kKGRvbWFpbiwgb3duZXIsIGxvY2F0aW9uLCBvcGVyYXRpb25zLAotCQkJCW9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjY3JlYXRlRHJvcENvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY3JlYXRlRHJvcENvbW1hbmQoT2JqZWN0IG93bmVyLAotCQkJTGlzdCBkcm9wRWxlbWVudHMpIHsKLQkJcmV0dXJuIG5ldyBQQlNEcm9wQ29tbWFuZCgoQWN0aXZpdHkpIG93bmVyLCBkcm9wRWxlbWVudHMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2FjY2VwdEFzUm9sbGVkVXBDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzUm9sbGVkVXBDaGlsZChPYmplY3QgY2hpbGQpIHsKLQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yICYmICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKW9iaikuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHN1cGVyLmFjY2VwdEFzUm9sbGVkVXBDaGlsZChvYmopOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldFBCU0VjbGFzc2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVsaXZlcmFibGVXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQkJQ29tcG9zZWRXUERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQotCQlwcml2YXRlIE9iamVjdCBkZWxpdmVyYWJsZURlc2NyaXB0b3I7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSB2YWx1ZQotCQkgKiBAcGFyYW0gb3duZXIKLQkJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JCSAqLwotCQlwdWJsaWMgRGVsaXZlcmFibGVXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIoCi0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHZhbHVlLCBPYmplY3Qgb3duZXIsCi0JCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCQkJcmVhZE9ubHkgPSBmYWxzZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9ERUxJVkVSQUJMRSkgewotCQkJCXJldHVybiBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZGVsaXZlcmFibGVEZXNjcmlwdG9yKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBMaXN0IHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBib29sZWFuIHVud3JhcCkgewotCQlMaXN0PD8+IGxpc3QgPSBQcm9jZXNzVXRpbC5yZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4sIHVud3JhcCk7Ci0JCWlmKGxpc3Quc2l6ZSgpICE9ICBjaGlsZHJlbi5zaXplKCkpIHsKLQkJCS8vIHBhcmVudCBvZiBkZXNjcmlwdG9ycyBvZiBzdWJhcnRpZmFjdHMgaGFzIGJlZW4gc2V0IHRvIHRoaXMgYWN0aXZpdHkKLQkJCS8vIGl0ZXJhdGUgdGhlIHN1YnRyZWUgb2YgdGhlIGFydGlmYWN0IGRlc2NyaXB0b3JzIGluIGNoaWRyZW4gbGlzdCB0byBjb3JyZWN0IHRoaXMKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IChPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZihjaGlsZCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvciAmJiAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvciljaGlsZCkuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCWZvcihBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjw/PiBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yPE9iamVjdD4oYWRhcHRlckZhY3RvcnksIGNoaWxkKTsKLQkJCQkJCWl0ZXIuaGFzTmV4dCgpOyBpdGVyLm5leHQoKSk7CQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ1JvbGx1cE5lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKFRuZ1V0aWwudW53cmFwKG9iamVjdCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc1dyYXBwaW5nUm9sbHVwTmVlZGVkKG9iamVjdCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1BCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFiZmQxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVQaGFzZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUEJTTWlsZXN0b25lSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVBoYXNlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGhhc2VBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByb2Nlc3NBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFBCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMxODg4MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBCU01pbGVzdG9uZUl0ZW1Qcm92aWRlciBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgewotCi0JLy8gcHJpdmF0ZSBDb2xsZWN0aW9uIGVDbGFzc2VzID0gbmV3IEhhc2hTZXQoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBQQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkvLyByZXR1cm4gVG5nVXRpbC5nZXRBbGxDaGlsZHJlbigoUHJvY2Vzc0NvbnRyaWJ1dGlvbikgb2JqZWN0LAotCS8vIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCksCi0JLy8gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpKTsKLQkvLyB9Ci0JLy8gICAgCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkvLyBDb2xsZWN0aW9uIGVsZW1lbnRzID0gc3VwZXIuZ2V0RWxlbWVudHMob2JqZWN0KTsKLQkvLyByZXR1cm4gZWxlbWVudHM7Ci0JLy8gfQotCi0JLy8gcHVibGljIExpc3QgZ2V0RmlsdGVyZWRCcmVha2Rvd25FbGVtZW50cyhPYmplY3QgYWN0aXZpdHksIE9iamVjdCBvYmopCi0JLy8gewotCS8vIExpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gTGlzdCBicmVha2Rvd25FbGVtZW50cyA9ICgoQWN0aXZpdHkpYWN0aXZpdHkpLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JLy8gZm9yIChJdGVyYXRvciBpdCA9IGJyZWFrZG93bkVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JLy8gewotCS8vIE9iamVjdCBlbGVtZW50T2JqID0gaXQubmV4dCgpOwotCS8vIGlmICgoZWxlbWVudE9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgfHwgKGVsZW1lbnRPYmoKLQkvLyBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgfHwgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkpCi0JLy8gewotCS8vIGVsZW1lbnRzLmFkZChlbGVtZW50T2JqKTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBlbGVtZW50czsKLQkvLyB9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldFBCU0VjbGFzc2VzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NmMWIwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotCi1wdWJsaWMgY2xhc3MgUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzIFBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQotCXB1YmxpYyBQQlNQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuZGVsZWdhdGVJdGVtUHJvdmlkZXIgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCQkJCQkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2YzYmU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJUHJvY2Vzc0l0ZW1Qcm92aWRlciB7Ci0KLQkvLyBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm9jZXNzTGlzdGVuZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JLy8gcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGl0ZW1Qcm92aWRlcjsKLQkvLyBwcml2YXRlIE9iamVjdCByZWZyZXNoT2JqOwotCS8vCi0JLy8gLyoqCi0JLy8gKgotCS8vICovCi0JLy8gcHVibGljIFByb2Nlc3NMaXN0ZW5lcihJdGVtUHJvdmlkZXJBZGFwdGVyIGl0ZW1Qcm92aWRlciwgT2JqZWN0Ci0JLy8gcmVmcmVzaE9iaikgewotCS8vIHRoaXMuaXRlbVByb3ZpZGVyID0gaXRlbVByb3ZpZGVyOwotCS8vIHRoaXMucmVmcmVzaE9iaiA9IHJlZnJlc2hPYmo7Ci0JLy8gfQotCS8vICAgICAgICAKLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkvLyAqLwotCS8vIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCS8vIHN3aXRjaChtc2cuZ2V0RmVhdHVyZUlEKFByb2Nlc3MuY2xhc3MpKSB7Ci0JLy8gY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkvLyBpdGVtUHJvdmlkZXIuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihtc2csIHJlZnJlc2hPYmosCi0JLy8gdHJ1ZSwgZmFsc2UpKTsKLQkvLyByZXR1cm47Ci0JLy8gfQotCS8vIH0KLQkvLyB9OwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUHJvY2Vzc0NvbXBvbmVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19OQU1FOgotCQkJUHJvY2Vzc0NvbXBvbmVudCBwYyA9IChQcm9jZXNzQ29tcG9uZW50KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChwYy5nZXRQcm9jZXNzKCkgIT0gbnVsbCkgewotCQkJCWJvb2xlYW4gb2xkID0gcGMuZ2V0UHJvY2VzcygpLmVEZWxpdmVyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcGMuZ2V0UHJvY2VzcygpLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQkJcGMuZ2V0UHJvY2VzcygpLnNldE5hbWUocGMuZ2V0TmFtZSgpKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlwYy5nZXRQcm9jZXNzKCkuZVNldERlbGl2ZXIob2xkKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJCQotCQkvLyBhdm9pZCByZWZyZXNoaW5nIHZpZXdlcnMgd2hlbiBuZXcgcHJvY2VzcyBlbGVtZW50IG9yIGRpYWdyYW0gaXMgYWRkZWQgdG8gdGhlIHByb2Nlc3MgY29tcG9uZW50Ci0JCS8vCi0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTU19FTEVNRU5UUzoKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19ESUFHUkFNUzoKLQkJCXJldHVybjsKLQkJCQotCQl9CQkKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkvLyBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIFByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudClvYmplY3QpLmdldFByb2Nlc3MoKTsKLQkvLyBpZihwcm9jICE9IG51bGwpIHsKLQkvLyBpZihUbmdVdGlsLmdldEFkYXB0ZXIocHJvYywgUHJvY2Vzc0xpc3RlbmVyLmNsYXNzKSA9PSBudWxsKSB7Ci0JLy8gcHJvYy5lQWRhcHRlcnMoKS5hZGQobmV3IFByb2Nlc3NMaXN0ZW5lcih0aGlzLCBvYmplY3QpKTsKLQkvLyB9Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gcHJvYy5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkvLyBjaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGNoaWxkcmVuOwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCS8vIHB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCS8vIHJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCS8vIH0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0NvbXBvbmVudF90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCS8vIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JLy8gLy8gcmVtb3ZlIGFsbCBwcm9jZXNzIGxpc3RlbmVycyBmcm9tIGFsbCB0YXJnZXRzCi0JLy8gLy8KLQkvLyBpZiAodGFyZ2V0ICE9IG51bGwpCi0JLy8gewotCS8vIHRhcmdldC5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JLy8gaWYgKHRhcmdldHMgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gZm9yIChJdGVyYXRvciBpID0gdGFyZ2V0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCS8vIHsKLQkvLyBOb3RpZmllciBvdGhlclRhcmdldCA9IChOb3RpZmllcilpLm5leHQoKTsKLQkvLyBvdGhlclRhcmdldC5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLyBzdXBlci5kaXNwb3NlKCk7Ci0JLy8gfQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDRmMzhlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIFNlcCAzMCwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTY2YWEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldE9CU0VjbGFzc2VzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOTgzODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1JvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQkKLQlwcm90ZWN0ZWQgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKE9iamVjdCB2YWx1ZSwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKFJvbGVEZXNjcmlwdG9yIHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoUm9sZURlc2NyaXB0b3IgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNJbmhlcml0ZWQoKSB7Ci0JCWlmKGdldFZhbHVlKCkgaW5zdGFuY2VvZiBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gKChDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWdldFZhbHVlKCkpLmlzSW5oZXJpdGVkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzSW5oZXJpdGVkKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1JvbGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Sb2xlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NDU5ZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1JvbGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlJvbGVJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFJvbGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkRlc2NyaWJhYmxlRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhlYWIxNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzoKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRXQlNFY2xhc3NlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1Rhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1Rhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDg0ZmQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB7CQotCi0JcHJvdGVjdGVkIFRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcihPYmplY3QgdmFsdWUsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKFRhc2tEZXNjcmlwdG9yIHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlpZihnZXRWYWx1ZSgpIGluc3RhbmNlb2YgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuICgoQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilnZXRWYWx1ZSgpKS5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNJbmhlcml0ZWQoKSB7Ci0JCWlmKGdldFZhbHVlKCkgaW5zdGFuY2VvZiBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gKChDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWdldFZhbHVlKCkpLmlzSW5oZXJpdGVkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzSW5oZXJpdGVkKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1RlYW1Qcm9maWxlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJiNjRlNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5HZW5lcmljRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuT0JTRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIHsKLQotCS8vIHByaXZhdGUgQ29sbGVjdGlvbiBlQ2xhc3NlczsKLQkvLyBwcml2YXRlIENvbGxlY3Rpb24gdGVhbVJvbGVXcmFwcGVyczsKLQlwcml2YXRlIEdlbmVyaWNEcm9wQ29tbWFuZC5FbGVtZW50QWRhcHRlciBkcm9wQWRhcHRlcjsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBUZWFtUHJvZmlsZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVRlYW1Qcm9maWxlKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKSk7Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjcmVhdGVEcm9wQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZUF3YXJlQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsCi0JCQlMaXN0IGRyb3BFbGVtZW50cykgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNEcm9wQ29tbWFuZCgoVGVhbVByb2ZpbGUpIG93bmVyLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwgZHJvcEVsZW1lbnRzLAotCQkJCWdldERyb3BBZGFwdGVyKG93bmVyKSk7Ci0JfQotCi0JcHJpdmF0ZSBHZW5lcmljRHJvcENvbW1hbmQuRWxlbWVudEFkYXB0ZXIgZ2V0RHJvcEFkYXB0ZXIoT2JqZWN0IG93bmVyKSB7Ci0JCUJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChvd25lciwgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlyZXR1cm4gYWRhcHRlci5jcmVhdGVEcm9wQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0KLQkJLy8gYWRkIHRlYW0gcm9sZXMKLQkJLy8KLQkJSUZpbHRlciBmaWx0ZXIgPSBQcm9jZXNzVXRpbC5nZXRGaWx0ZXIoYWRhcHRlckZhY3RvcnkpOwotCQlib29sZWFuIG51bGxGaWx0ZXIgPSBmaWx0ZXIgPT0gbnVsbDsKLQkJVGVhbVByb2ZpbGUgdGVhbVByb2ZpbGUgPSAoVGVhbVByb2ZpbGUpIG9iamVjdDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGVhbVByb2ZpbGUuZ2V0VGVhbVJvbGVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlSb2xlRGVzY3JpcHRvciBkZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCWlmIChkZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwgJiYgKG51bGxGaWx0ZXIgfHwgZmlsdGVyLmFjY2VwdChkZXNjKSkpIHsKLQkJCQljaGlsZHJlbi5hZGQoZGVzYyk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBzZXQgcGFyZW50IGZvciB0aGUgY2hpbGRyZW4ncyBpdGVtIHByb3ZpZGVycwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVByb2Nlc3NVdGlsLnNldFBhcmVudChpdGVyLm5leHQoKSwgb2JqZWN0LCBnZXRSb290QWRhcHRlckZhY3RvcnkoKSk7Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCS8vIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gdGVhbVJvbGVXcmFwcGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBJV3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKElXcmFwcGVySXRlbVByb3ZpZGVyKSBpdGVyLm5leHQoKTsKLQkvLyB3cmFwcGVyLmRpc3Bvc2UoKTsKLQkvLyB9Ci0JLy8gdGVhbVJvbGVXcmFwcGVycy5jbGVhcigpOwotCS8vCQkKLQkvLyBzdXBlci5kaXNwb3NlKCk7Ci0JLy8gfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChUZWFtUHJvZmlsZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU06Ci0JCQlpbnQgZXZlbnRUeXBlID0gbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpOwotCQkJaWYgKGV2ZW50VHlwZSA9PSBOb3RpZmljYXRpb24uQURECi0JCQkJCXx8IGV2ZW50VHlwZSA9PSBOb3RpZmljYXRpb24uQUREX01BTlkpIHsKLQkJCQlMaXN0IHN1YlRlYW1zID0gUHJvY2Vzc1V0aWwuZ2V0QWZmZWN0ZWRFbGVtZW50cyhub3RpZmljYXRpb24sCi0JCQkJCQludWxsKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdWJUZWFtcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJVGVhbVByb2ZpbGUgc3ViVGVhbSA9IChUZWFtUHJvZmlsZSkgaXRlci5uZXh0KCk7Ci0JCQkJCVByb2Nlc3NVdGlsLmFkZFRvQ29udGFpbmVyKHN1YlRlYW0sIHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1RFQU1fUk9MRVM6Ci0JCQlMaXN0IGVsZW1lbnRzID0gUHJvY2Vzc1V0aWwuZ2V0QWZmZWN0ZWRFbGVtZW50cyhub3RpZmljYXRpb24sIG51bGwpOwotCQkJZXZlbnRUeXBlID0gbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpOwotCQkJYm9vbGVhbiByZWZyZXNoVGVhbSA9IGZhbHNlOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChldmVudFR5cGUgPT0gTm90aWZpY2F0aW9uLkFERAotCQkJCQkJfHwgZXZlbnRUeXBlID09IE5vdGlmaWNhdGlvbi5BRERfTUFOWSkgewotCQkJCQlQcm9jZXNzVXRpbC5hZGRUb0NvbnRhaW5lcihlLCB0aGlzLCBmYWxzZSk7Ci0JCQkJfQotCQkJCWlmIChlLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsKLQkJCQkJcmVmcmVzaFRlYW0gPSB0cnVlOwkJCQkJCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgZSwKLQkJCQkJCWZhbHNlLCB0cnVlKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocmVmcmVzaFRlYW0pIHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJfQotCi0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJVGVhbVByb2ZpbGUgdGVhbVByb2ZpbGUgPSAoVGVhbVByb2ZpbGUpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIHRlYW1Qcm9maWxlLAotCQkJCQlmYWxzZSwgdHJ1ZSkpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGVhbVByb2ZpbGUuZ2V0VGVhbVJvbGVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yID0gKFJvbGVEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCXJvbGVEZXNjcmlwdG9yLCBmYWxzZSwgdHJ1ZSkpOwotCQkJfQotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1NVUFBSRVNTRUQ6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldE9CU0VjbGFzc2VzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGZsb2F0LCBpbnQsIGludCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJT2JqZWN0IG93bmVyLCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sCi0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBPQlNEcmFnQW5kRHJvcENvbW1hbmQoZG9tYWluLCBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsCi0JCQkJb3BlcmF0aW9uLCBjb2xsZWN0aW9uKQotCQkvLyB7Ci0JCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJLy8gQ29sbGVjdGlvbiB3cmFwcGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCkuaXRlcmF0b3IoKTsKLQkJLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIFJvbGVEZXNjcmlwdG9yIGRlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkvLyB3cmFwcGVycy5hZGQoVG5nVXRpbC5nZXRXcmFwcGVyKHRlYW1Sb2xlV3JhcHBlcnMsIGRlc2MuZ2V0Um9sZSgpKSk7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIHdyYXBwZXJzOwotCQkvLyB9Ci0JCS8vIH0KLQkJOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBkZXNjcmlwdG9yRXhpc3RzKE9iamVjdCByb2xlKSB7Ci0JCVRlYW1Qcm9maWxlIHRlYW1Qcm9maWxlID0gKFRlYW1Qcm9maWxlKSBnZXRUYXJnZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGVhbVByb2ZpbGUuZ2V0VGVhbVJvbGVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlSb2xlRGVzY3JpcHRvciBkZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCWlmIChkZXNjLmdldFJvbGUoKSA9PSByb2xlKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgR2VuZXJpY0Ryb3BDb21tYW5kLkVsZW1lbnRBZGFwdGVyIGNyZWF0ZURyb3BBZGFwdGVyKCkgewotCQlpZiAoZHJvcEFkYXB0ZXIgPT0gbnVsbCkgewotCQkJZHJvcEFkYXB0ZXIgPSBuZXcgR2VuZXJpY0Ryb3BDb21tYW5kLkVsZW1lbnRBZGFwdGVyKCkgewotCi0JCQkJcHVibGljIE9iamVjdCBhZGFwdChPYmplY3QgZHJvcEVsZW1lbnQpIHsKLQkJCQkJaWYgKGRyb3BFbGVtZW50IGluc3RhbmNlb2YgUm9sZQotCQkJCQkJCSYmICFkZXNjcmlwdG9yRXhpc3RzKGRyb3BFbGVtZW50KQotCQkJCQkvLyAmJiBUbmdVdGlsLmdldFdyYXBwZXIodGVhbVJvbGVXcmFwcGVycywgZHJvcEVsZW1lbnQpID09Ci0JCQkJCS8vIG51bGwKLQkJCQkJKSB7Ci0JCQkJCQlyZXR1cm4gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKChSb2xlKSBkcm9wRWxlbWVudCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQl9OwotCQl9Ci0JCXJldHVybiBkcm9wQWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1RFQU1TKSB7Ci0JCQlyZXR1cm4gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKCgoVGVhbVByb2ZpbGUpIG9iamVjdCkKLQkJCQkJLmdldFN1cGVyVGVhbSgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVVcChPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCVRuZ1V0aWwubW92ZVVwKChBY3Rpdml0eSkgcGFyZW50LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSkgewotCQkJVGVhbVByb2ZpbGUgdGVhbSA9ICgoVGVhbVByb2ZpbGUpIHBhcmVudCk7Ci0JCQlMaXN0IGxpc3QgPSB0ZWFtLmdldFN1YlRlYW0oKTsKLQkJCWludCBsb2NhdGlvbiA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlpZiAob2JqLmVxdWFscyhsaXN0LmdldChpKSkpIHsKLQkJCQkJbG9jYXRpb24gPSBpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCSgoRUxpc3QpIHRlYW0uZ2V0U3ViVGVhbSgpKS5tb3ZlKGxvY2F0aW9uLCBsb2NhdGlvbiAtIDEpOwotCi0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IHRoaXMuZ2V0QWN0aXZpdHkob2JqKTsKLQkJCVRuZ1V0aWwubW92ZVVwKGFjdGl2aXR5LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlRG93bihPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCVRuZ1V0aWwubW92ZURvd24oKEFjdGl2aXR5KSBwYXJlbnQsIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQkJfQotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpKSB7Ci0JCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBwYXJlbnQ7Ci0JCQlMaXN0IGxpc3QgPSB0ZWFtLmdldFN1YlRlYW0oKTsKLQkJCWludCBsb2NhdGlvbiA9IDA7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCWlmIChvYmouZXF1YWxzKGxpc3QuZ2V0KGkpKSkgewotCQkJCQlsb2NhdGlvbiA9IGk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJKChFTGlzdCkgdGVhbS5nZXRTdWJUZWFtKCkpLm1vdmUobG9jYXRpb24sIGxvY2F0aW9uICsgMSk7Ci0KLQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gdGhpcy5nZXRBY3Rpdml0eShvYmopOwotCQkJVG5nVXRpbC5tb3ZlRG93bihhY3Rpdml0eSwgb2JqLCBnZXRFQ2xhc3NlcygpLCBhY3Rpb25NZ3IpOwotCQl9Ci0JfQotCi0JcHVibGljIEFjdGl2aXR5IGdldEFjdGl2aXR5KE9iamVjdCBvYmplY3QpIHsKLQkJZm9yIChPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG9iamVjdCk7IHBhcmVudCAhPSBudWxsOykgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KQotCQkJCXJldHVybiAoQWN0aXZpdHkpIHBhcmVudDsKLQkJCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nVXRpbAotCQkJCQkuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQkJcGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocGFyZW50KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkN2I3YmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1RlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBUZWFtUHJvZmlsZVdyYXBwZXJJdGVtUHJvdmlkZXIoVGVhbVByb2ZpbGUgdmFsdWUsIE9iamVjdCBvd25lciwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlcihUZWFtUHJvZmlsZSB2YWx1ZSwgT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1RFQU1TKSB7Ci0JCQlyZXR1cm4gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKCgoVGVhbVByb2ZpbGUpIFRuZ1V0aWwKLQkJCQkJLnVud3JhcChvYmplY3QpKS5nZXRTdXBlclRlYW0oKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZDUzYTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuV0JTRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLldCU0Ryb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUGhhc2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUl0ZXJhdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQWN0aXZpdHkoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVNaWxlc3RvbmUoKSkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCWNoaWxkID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQlpZihjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IGNoaWxkIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IKLQkJCQl8fCBjaGlsZCBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJcmV0dXJuIHN1cGVyLmFjY2VwdEFzQ2hpbGQoY2hpbGQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRPYmplY3Qob3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0T2JqZWN0KERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlyZXR1cm4gKChUYXNrRGVzY3JpcHRvcikgZGVzY3JpcHRvcikuZ2V0VGFzaygpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCU9iamVjdCBvd25lciwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLAotCQkJQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRU5URVI6Ci0JCS8vIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIjY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKGRvbWFpbiwKLQkJLy8gb3duZXIsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pIik7Ci0JCUNvbW1hbmQgY21kID0gbmV3IFdCU0RyYWdBbmREcm9wQ29tbWFuZChkb21haW4sIG93bmVyLCBsb2NhdGlvbiwKLQkJCQlvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pOwotCi0vLwkJIFN5c3RlbS5vdXQucHJpbnRsbigiIGNhbiBleGVjdXRlOiAiICsgY21kLmNhbkV4ZWN1dGUoKSk7Ci0vLwkJIFN5c3RlbS5vdXQucHJpbnRsbigiIG93bmVyOiAiICsgb3duZXIpOwotLy8JCSBTeXN0ZW0ub3V0LnByaW50bG4oIiBjb2xsZWN0aW9uOiAiICsgY29sbGVjdGlvbik7Ci0vLwkJIFN5c3RlbS5vdXQucHJpbnRsbigiIGxvY2F0aW9uOiAiICsgbG9jYXRpb24pOwotLy8JCSBTeXN0ZW0ub3V0LnByaW50bG4oIiBvcGVyYXRpb25zOiAiICsgb3BlcmF0aW9ucyk7Ci0vLwkJIFN5c3RlbS5vdXQucHJpbnRsbigiIG9wZXJhdGlvbjogIiArIG9wZXJhdGlvbik7Ci0JCS8vICAgICAgICAKLQkJLy8gU3lzdGVtLm91dAotCQkvLyAucHJpbnRsbigiRVhJVDoKLQkJLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQoZG9tYWluLAotCQkvLyBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbikiKTsKLQkJcmV0dXJuIGNtZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjcmVhdGVEcm9wQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZUF3YXJlQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsCi0JCQlMaXN0IGRyb3BFbGVtZW50cykgewotCQlyZXR1cm4gbmV3IFdCU0Ryb3BDb21tYW5kKChBY3Rpdml0eSkgb3duZXIsIGRyb3BFbGVtZW50cyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjYWNjZXB0QXNSb2xsZWRVcENoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNSb2xsZWRVcENoaWxkKE9iamVjdCBjaGlsZCkgewotCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQlpZihvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIHN1cGVyLmFjY2VwdEFzUm9sbGVkVXBDaGlsZChvYmopOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JLy8gaW50KQotCS8vICovCi0JLy8gcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkvLyBCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudClvYmplY3Q7Ci0JLy8gU3RyaW5nIHByb3BlcnR5ID0gKFN0cmluZykgY29sdW1uSW5kZXhUb05hbWVNYXAuZ2V0KG5ldwotCS8vIEludGVnZXIoY29sdW1uSW5kZXgpKTsKLQkvLyBCb29sZWFuIGIgPSBudWxsOwotCS8vIGlmKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOKSB7Ci0JLy8gYiA9IGUuZ2V0SXNFdmVudERyaXZlbigpOwotCS8vIH0KLQkvLyBlbHNlIGlmKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORykgewotCS8vIGIgPSBlLmdldElzT25nb2luZygpOwotCS8vIH0KLQkvLyBlbHNlIGlmKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSkgewotCS8vIGIgPSBlLmdldElzUmVwZWF0YWJsZSgpOwotCS8vIH0KLQkvLyBpZihiICE9IG51bGwpIHsKLQkvLyBpZihiLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JLy8gcmV0dXJuIFRuZ0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImNoZWNrZWRfYm94Iik7Ci0JLy8gfQotCS8vIGVsc2UgewotCS8vIHJldHVybiBUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJ1bmNoZWNrZWRfYm94Iik7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gc3VwZXIuZ2V0Q29sdW1uSW1hZ2Uob2JqZWN0LCBjb2x1bW5JbmRleCk7Ci0JLy8gfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRXQlNFY2xhc3NlcygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI3JlZnJlc2hDaGlsZHJlbkRhdGEob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uLAotCSAqICAgICAgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVmcmVzaENoaWxkcmVuRGF0YShOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLAotCQkJTGlzdCBhZmZlY3RlZENoaWxkcmVuKSB7Ci0JCS8vIHJlY2FsY3VsYXRlIHRoZSBJRHMgb2YgYnJlYWtkb3duIGVsZW1lbnRzIGFuZCByZWZyZXNoIHRoZW0KLQkJLy8KLQkJUHJvY2VzcyB0b3BBY3QgPSAoUHJvY2VzcykgZ2V0VG9wSXRlbSgpOwotCQlBZGFwdGVyRmFjdG9yeSByb290QWRhcHRlckZhY3RvcnkgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQotCQlQcm9jZXNzVXRpbC51cGRhdGVJRHMocm9vdEFkYXB0ZXJGYWN0b3J5LCB0b3BBY3QpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2RvUmVmcmVzaEFmZmVjdGVkVmlld2VycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9SZWZyZXNoQWZmZWN0ZWRWaWV3ZXJzKCkgewotCQlPYmplY3QgcHJvYyA9IGdldFRvcEl0ZW0oKTsKLQkJT2JqZWN0IGl0ZW1Qcm92aWRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHByb2MsCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCSgoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgaXRlbVByb3ZpZGVyKQotCQkJCQkuc2V0UmVmcmVzaEFsbElEc1JlcXVpcmVkKHRydWUpOwotCQl9Ci0KLQkJUHJvY2Vzc1V0aWwKLQkJCQkucmVmcmVzaElEc0luVmlld2VycygoRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQl1cGRhdGVDYWNoZWRDaGlsZHJlbihjaGlsZHJlbik7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ1JvbGx1cE5lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKFRuZ1V0aWwudW53cmFwKG9iamVjdCkgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzV3JhcHBpbmdSb2xsdXBOZWVkZWQob2JqZWN0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVJvbGx1cFdyYXBwZXIoT2JqZWN0IG9iamVjdCwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlPYmplY3Qgd3JhcHBlciA9IHN1cGVyLmNyZWF0ZVJvbGx1cFdyYXBwZXIob2JqZWN0LCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCQlyZXR1cm4gbmV3IFRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcih3cmFwcGVyLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVDb21wb3NlZFdyYXBwZXIoT2JqZWN0IG9iamVjdCwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIob2JqZWN0LCBvd25lciwgYWRhcHRlckZhY3RvcnkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2FuTWVyZ2UoU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSUQgfHwgcHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlMKLQkJCQkJfHwgcHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPOwotCQkJfQotCQl9OwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9XQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NzM4MjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQlpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlciB7Ci0KLQlwdWJsaWMgV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVGFibGVJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVBoYXNlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGhhc2VBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlUGhhc2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNaWxlc3RvbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdCU01pbGVzdG9uZUl0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVNaWxlc3RvbmVBZGFwdGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIjcHJvcGVydHlDaGFuZ2Uob3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIpCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoSVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyIGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKSkgewotCQkJc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoUHJvY2Vzc1V0aWwKLQkJCQkJLnRvQ29sdW1uSW5kZXhUb05hbWVNYXAoKFN0cmluZykgZXZlbnQuZ2V0TmV3VmFsdWUoKSkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZjA5YWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU01pbGVzdG9uZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciB7Ci0KLQkvLyBwcml2YXRlIENvbGxlY3Rpb24gZUNsYXNzZXMgPSBuZXcgSGFzaFNldCgpOwotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRToKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc6Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JLy8gKi8KLQkvLyBwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gcmV0dXJuIFRuZ1V0aWwuZ2V0QWxsQ2hpbGRyZW4oKFByb2Nlc3NDb250cmlidXRpb24pIG9iamVjdCwKLQkvLyBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpLAotCS8vIFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KSk7Ci0JLy8gfQotCS8vICAgIAotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JLy8gKi8KLQkvLyBwdWJsaWMgQ29sbGVjdGlvbiBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gQ29sbGVjdGlvbiBlbGVtZW50cyA9IHN1cGVyLmdldEVsZW1lbnRzKG9iamVjdCk7Ci0JLy8gcmV0dXJuIGVsZW1lbnRzOwotCS8vIH0KLQotCS8vIHB1YmxpYyBMaXN0IGdldEZpbHRlcmVkQnJlYWtkb3duRWxlbWVudHMoT2JqZWN0IGFjdGl2aXR5LCBPYmplY3Qgb2JqKQotCS8vIHsKLQkvLyBMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIExpc3QgYnJlYWtkb3duRWxlbWVudHMgPSAoKEFjdGl2aXR5KWFjdGl2aXR5KS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCS8vIGZvciAoSXRlcmF0b3IgaXQgPSBicmVha2Rvd25FbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCS8vIHsKLQkvLyBPYmplY3QgZWxlbWVudE9iaiA9IGl0Lm5leHQoKTsKLQkvLyBpZiAoKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgfHwgKGVsZW1lbnRPYmogaW5zdGFuY2VvZgotCS8vIE1pbGVzdG9uZSkgfHwgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkpCi0JLy8gewotCS8vIGVsZW1lbnRzLmFkZChlbGVtZW50T2JqKTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBlbGVtZW50czsKLQkvLyB9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldFdCU0VjbGFzc2VzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmNTdkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXQlNQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMgV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCi0JcHVibGljIFdCU1Byb2Nlc3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5kZWxlZ2F0ZUl0ZW1Qcm92aWRlciA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5BY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JCQkJCS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dvcmtPcmRlckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dvcmtPcmRlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDM5Mjc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Xb3JrT3JkZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrT3JkZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLldvcmtPcmRlckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXIpCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JLy8gRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCS8vIHJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5EZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc5ODg0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuV29ya1Byb2R1Y3REZXNjcmlwdG9yQ3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMgRGVzY3JpcHRvckl0ZW1Qcm92aWRlcgotaW1wbGVtZW50cyBJQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIKLXsKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjYWNoZWRDaGlsZHJlbjsKLQkKLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyBBY3Rpdml0eSBnZXRBY3Rpdml0eShPYmplY3Qgb2JqZWN0KSB7Ci0JCWZvciAoT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChvYmplY3QpOyBwYXJlbnQgIT0gbnVsbDspIHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkJCQlyZXR1cm4gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCQlwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChwYXJlbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IGdldERlc2NyaXB0b3IoQWN0aXZpdHkgYWN0aXZpdHksIEFydGlmYWN0IGFydGlmYWN0KSB7Ci0JCWlmIChhY3Rpdml0eSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpc3QgbGlzdCA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gbGlzdC5nZXQoaSk7Ci0JCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikKLQkJCQkJJiYgKGFydGlmYWN0ID09ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmopCi0JCQkJCQkJLmdldFdvcmtQcm9kdWN0KCkpKSB7Ci0JCQkJcmV0dXJuIG9iajsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkKLQkJLy8gewotCQkvLyBjaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpKTsKLQkJLy8gfQotCQkvLyByZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNhY2hlZENoaWxkcmVuKENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLS8vCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0vLwkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChjaGlsZHJlbik7Ci0vLwkJfQotLy8JCWVsc2UgewotLy8JCQljYWNoZWRDaGlsZHJlbi5jbGVhcigpOwotLy8JCQljYWNoZWRDaGlsZHJlbi5hZGRBbGwoY2hpbGRyZW4pOwotLy8JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29udGFpbmVkQXJ0aWZhY3REZXNjcmlwdG9ycyhXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjLCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCUFjdGl2aXR5IGFjdGl2aXR5ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eSh3cERlc2MpOwotCQlpZihhY3Rpdml0eSAhPSBudWxsKSB7Ci0JCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgd3BEZXNjLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQlMaXN0IGxpc3QgPSBhcnRpZmFjdC5nZXRDb250YWluZWRBcnRpZmFjdHMoKTsKLQkJCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCQlpZihzaXplID4gMCkgewotCQkJCUFycmF5TGlzdCBhcnRpZmFjdERlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCU9iamVjdCBkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcihhY3Rpdml0eSwgKEFydGlmYWN0KSBsaXN0Ci0JCQkJCQkJLmdldChpKSk7Ci0JCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJCWFydGlmYWN0RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKCFhcnRpZmFjdERlc2NyaXB0b3JzLmlzRW1wdHkoKSkgewotCQkJCQlDb2xsZWN0aW9ucy5zb3J0KGFydGlmYWN0RGVzY3JpcHRvcnMsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQkJCQljaGlsZHJlbi5hZGRBbGwoYXJ0aWZhY3REZXNjcmlwdG9ycyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqZWN0OwotCQkKLQkJLy8gZG9uJ3Qgc2hvdyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vbi1kZWxpdmVyYWJsZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcgotCQkvLyB0aGF0IGlzIGRlbGl2ZXJhYmxlIHBhcnQgb2YgYSBkZWxpdmVyYWJsZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcgotCQkvLwotCQlpZighKHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpKSB7Ci0JCQlPYmplY3QgcGFyZW50ID0gVG5nVXRpbC51bndyYXAoZ2V0UGFyZW50KG9iamVjdCkpOwotCQkJaWYocGFyZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yCi0JCQkJCSYmICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKXBhcmVudCkuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7CQkJCQotCQkJCXVwZGF0ZUNhY2hlZENoaWxkcmVuKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJfQotCQl9Ci0JCQotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQotCQkvLyBhZGQgZGVsaXZlcmFibGUgcGFydHMKLQkJLy8KLQkJaWYoIXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChkZXNjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGdldCBkZXNjcmlwdG9ycyBvZiBjb250YWluZWQgYXJ0aWZhY3RzCi0JCS8vCQkKLQkJaWYgKHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWFkZENvbnRhaW5lZEFydGlmYWN0RGVzY3JpcHRvcnMod3BEZXNjLCBjaGlsZHJlbik7Ci0JCX0KLQotCQkvLyBzZXQgcGFyZW50Ci0JCS8vCi0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFGYWN0b3J5LmFkYXB0KGl0ZXIKLQkJCQkJLm5leHQoKSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWFkYXB0ZXIuc2V0UGFyZW50KG9iamVjdCk7Ci0JCX0KLQkJCi0JCXVwZGF0ZUNhY2hlZENoaWxkcmVuKGNoaWxkcmVuKTsKLQkJCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBjaGlsZHJlbiBmcm9tIGNhY2hlLCBmaWxsIHRoZSBjaGlsZHJlbiBjYWNoZSBpZiBpdCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Ci0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUNhY2hlKCkgewotCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQlnZXRDaGlsZHJlbih0YXJnZXQpOwotCQl9Ci0JCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIjZ2V0Um9sbHVwQ2hpbGRyZW5Gcm9tQ2FjaGUoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJvbGx1cENoaWxkcmVuRnJvbUNhY2hlKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoY2FjaGVkQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJY2FjaGVkQ2hpbGRyZW4uY2xlYXIoKTsKLQkJCWNhY2hlZENoaWxkcmVuID0gbnVsbDsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzKSkgewotLy8JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUX1RPOgotLy8JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVRfVE86Ci0vLwkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVF9UTzoKLS8vCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09VVFBVVF9GUk9NOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTOgotCQkJTGlzdCBlbGVtZW50cyA9IFByb2Nlc3NVdGlsLmdldEFmZmVjdGVkRWxlbWVudHMobm90aWZpY2F0aW9uLCBudWxsKTsKLQkJCWludCBldmVudFR5cGUgPSBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCk7Ci0JCQlib29sZWFuIHJlZnJlc2ggPSBmYWxzZTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZXZlbnRUeXBlID09IE5vdGlmaWNhdGlvbi5BREQKLQkJCQkJCXx8IGV2ZW50VHlwZSA9PSBOb3RpZmljYXRpb24uQUREX01BTlkpIHsKLQkJCQkJUHJvY2Vzc1V0aWwuYWRkVG9Db250YWluZXIoZSwgdGhpcywgZmFsc2UpOwotCQkJCX0KLQkJCQlpZiAoZS5nZXRTdXBlckFjdGl2aXRpZXMoKSAhPSBudWxsKSB7Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBlLAotCQkJCQkJCWZhbHNlLCB0cnVlKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVmcmVzaCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocmVmcmVzaCkgewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQl9Ci0KLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKTsKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCB3cGQsIGZhbHNlLAotCQkJCQl0cnVlKSk7Ci0JCQlpZiAod3BkLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwZC5nZXREZWxpdmVyYWJsZVBhcnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGRlc2NyaXB0b3IgPSBpdGVyLm5leHQoKTsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCQkJZGVzY3JpcHRvciwgZmFsc2UsIHRydWUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fU1VQUFJFU1NFRDoKLQkJCU9iamVjdCBub3RpZmllciA9IG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJV29ya1Byb2R1Y3Qgd3A7Ci0JCQlib29sZWFuIGNvbnRlbnRSZWZyZXNoID0gbm90aWZpZXIgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkJCQkmJiAoKHdwID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3Ipbm90aWZpZXIpLmdldFdvcmtQcm9kdWN0KCkpIGluc3RhbmNlb2YgQXJ0aWZhY3QKLQkJCQkJCXx8IHdwIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpOwotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgY29udGVudFJlZnJlc2gsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3AsIFN0cmluZyB0eHQpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iamVjdDsKLQotCQlpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0VOVFJZX1NUQVRFKSB7Ci0JCQl3cGQuc2V0QWN0aXZpdHlFbnRyeVN0YXRlKHR4dCk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0VYSVRfU1RBVEUpIHsKLQkJCXdwZC5zZXRBY3Rpdml0eUV4aXRTdGF0ZSh0eHQpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuc2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcCwgdHh0KTsKLQkJfQotCX0KLQotCS8vIHByaXZhdGUgYm9vbGVhbiBpc1RvcExldmVsQXJ0aWZhY3RJbkFjdGl2aXR5KEFjdGl2aXR5IGFjdGl2aXR5LCBPYmplY3QKLQkvLyBvYmopCi0JLy8gewotCS8vIEFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotCS8vICAgICAgICAKLQkvLyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikKLQkvLyBhRmFjdG9yeS5hZGFwdChhY3Rpdml0eSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkvLyBDb2xsZWN0aW9uIGNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbihhY3Rpdml0eSk7Ci0JLy8gaWYgKGNoaWxkcmVuLmNvbnRhaW5zKG9iaikpCi0JLy8gewotCS8vIC8vU3lzdGVtLm91dC5wcmludGxuKCJjaGlsZCAtICIgKyBvYmopOwotCS8vIHJldHVybiB0cnVlOwotCS8vIH0KLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRQQlNFY2xhc3NlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVVcChPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCVRuZ1V0aWwubW92ZVVwKChBY3Rpdml0eSkgcGFyZW50LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikpIHsKLQkJCVdvcmtQcm9kdWN0IHdwID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHBhcmVudCkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCWlmICh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIHdwOwotCQkJCUxpc3QgbGlzdCA9IGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCQkJCVdvcmtQcm9kdWN0IG9ialdQID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaikKLQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCi0JCQkJaW50IGxvY2F0aW9uID0gMDsKLQkJCQkvLyBMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCWlmIChvYmpXUC5lcXVhbHMobGlzdC5nZXQoaSkpKSB7Ci0JCQkJCQlsb2NhdGlvbiA9IGk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQotCQkJCSgoRUxpc3QpIGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpKS5tb3ZlKGxvY2F0aW9uLAotCQkJCQkJbG9jYXRpb24gLSAxKTsKLQkJCX0KLQotCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSB0aGlzLmdldEFjdGl2aXR5KG9iaik7Ci0JCQlUbmdVdGlsLm1vdmVVcChhY3Rpdml0eSwgb2JqLCBnZXRFQ2xhc3NlcygpLCBhY3Rpb25NZ3IpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZURvd24oT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSB0aGlzLmdldFBhcmVudChvYmopOwotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlUbmdVdGlsLm1vdmVEb3duKChBY3Rpdml0eSkgcGFyZW50LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikpIHsKLQkJCVdvcmtQcm9kdWN0IHdwID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHBhcmVudCkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCWlmICh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIHdwOwotCQkJCUxpc3QgbGlzdCA9IGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCQkJCVdvcmtQcm9kdWN0IG9ialdQID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaikKLQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCi0JCQkJaW50IGxvY2F0aW9uID0gMDsKLQkJCQkvLyBMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCWlmIChvYmpXUC5lcXVhbHMobGlzdC5nZXQoaSkpKSB7Ci0JCQkJCQlsb2NhdGlvbiA9IGk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQotCQkJCSgoRUxpc3QpIGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpKS5tb3ZlKGxvY2F0aW9uLAotCQkJCQkJbG9jYXRpb24gKyAxKTsKLQkJCX0KLQotCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSB0aGlzLmdldEFjdGl2aXR5KG9iaik7Ci0JCQlUbmdVdGlsLm1vdmVEb3duKGFjdGl2aXR5LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXIpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yQ3JlYXRlQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2ZhY3RvclJlbW92ZUNvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBmYWN0b3JSZW1vdmVDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBDb21tYW5kUGFyYW1ldGVyIGNvbW1hbmRQYXJhbWV0ZXIpIHsKLQkJaWYoIShjb21tYW5kUGFyYW1ldGVyLmdldE93bmVyKCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IGdldEFjdGl2aXR5KHRhcmdldCk7Ci0JCQlpZihhY3QgIT0gbnVsbCkgewotCQkJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGFjdCwgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQkJCWNvbW1hbmRQYXJhbWV0ZXIuc2V0T3duZXIoYWN0KTsKLQkJCQlyZXR1cm4gYWRhcHRlci5jcmVhdGVDb21tYW5kKGFjdCwgZG9tYWluLCBSZW1vdmVDb21tYW5kLmNsYXNzLCBjb21tYW5kUGFyYW1ldGVyKTsJCQkJCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmZhY3RvclJlbW92ZUNvbW1hbmQoZG9tYWluLCBjb21tYW5kUGFyYW1ldGVyKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCS8vIEVQRiBidWcjOiAxNDQ4MjAgU29tZSBuZXN0ZWQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIHNob3cgd3JvbmcgbW9kZWwgaW5mbyBpbiB3b3JrIHByb2R1Y3QgdXNhZ2UgdmlldwotCQkvLyBmb3IgZGVmZWN0LCBvdmVycmlkZSB0aGUgbWV0aG9kLCBwcmV2aW91c2x5IERlc2NyaXB0b3JJdGVtUHJvdmlkZS5nZXRBdHRyaWJ1dGUgdXNlIHRvIGhhdmUgdGhpcyBjb2RlLCBtb3ZlZCB0byBoZXJlLiAKLQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTykgewotCQkJU3RyaW5nQnVmZmVyIG1vZGVsSW5mbyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0vLwkJCQkJUHJvY2Vzc1V0aWwuZ2V0TW9kZWxJbmZvRm9yV29ya1Byb2R1Y3REZXNjcmlwdG9yKG1vZGVsSW5mbywKLS8vCQkJCQkJCShXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iamVjdCk7Ci0JCQkJCVByb2Nlc3NVdGlsLmdldFdQRE1vZGVsSW5mbyhtb2RlbEluZm8sIG9iamVjdCwgdGhpcyk7Ci0JCQkJfQotLy8JCQl9Ci0JCQlyZXR1cm4gbW9kZWxJbmZvLnRvU3RyaW5nKCk7IAotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTExMDNkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgewotCQotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKE9iamVjdCB2YWx1ZSwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcihXb3JrUHJvZHVjdERlc2NyaXB0b3IgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgdmFsdWUsIE9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FjdGl2aXR5QWRkQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlBZGRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNTc1YTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlBZGRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXNzZW5nZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbi5UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci0KLS8qKgotICogQWRkQ29tbWFuZCBmb3IgYWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBTZXAgMTYsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqIEBzZWUgCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUFkZENvbW1hbmQgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEFkZENvbW1hbmQgewotCXByaXZhdGUgTGlzdCBwcm9jUGFja2FnZXM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eUFkZENvbW1hbmQoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXN1cGVyKGNvbW1hbmQpOwotCX0KLQotCXByaXZhdGUgTWFwIGdldENvcHlUb09yaWdpbmFsTWFwKCkgewotCQlFZGl0aW5nRG9tYWluIGVkID0gYWRkQ29tbWFuZC5nZXREb21haW4oKTsKLQkJaWYgKGVkIGluc3RhbmNlb2YgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQlyZXR1cm4gKChUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGVkKQotCQkJCQkuZ2V0Q29weVRvT3JpZ2luYWxNYXAoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29weVByb2Nlc3NQYWNrYWdlcygpIHsKLQkJaWYgKHByb2NQYWNrYWdlcyA9PSBudWxsKSB7Ci0JCQlpZiAoaGFzQ29weVRvT3JpZ2luYWxNYXAoKSkgewotCQkJCWJvb2xlYW4gc2hvd1dhcm5pbmcgPSBmYWxzZTsKLQkJCQlwcm9jUGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJQXJyYXlMaXN0PEFjdGl2aXR5PiBjb3BpZWRBY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQkJLy8gY2hlY2sgZmlyc3QgZWxlbWVudCBvZiBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKQotCQkJCS8vIGlmIGl0J3MgYSBrZXkgaW4gdGhlIENvcHlUb09yaWdpbmFsTWFwLCB3ZSBhcmUgcGFzdGluZyBhbmQKLQkJCQkvLyBtYXkgbmVlZCB0byB3YXJuIHRoZSB1c2VyCi0JCQkJLy8gaWYgaXQncyBub3QgYSBrZXkgaW4gdGhlIENvcHlUb09yaWdpbmFsTWFwLCB0aGVuIHdlIGFyZQotCQkJCS8vIHByb2JhYmx5IGFkZGluZyBhIG5ldyBlbGVtZW50CQkJCQotCQkJCWlmIChhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKSAhPSBudWxsCi0JCQkJCQkmJiBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS5zaXplKCkgPiAwCi0JCQkJCQkmJiBnZXRPcmlnaW5hbChhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS50b0FycmF5KClbMF0pICE9IG51bGwpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCUFjdGl2aXR5IG9yaWcgPSAoQWN0aXZpdHkpIGdldE9yaWdpbmFsKGVsZW1lbnQpOwotCQkJCQkJCWlmIChvcmlnICE9IG51bGwpIHsKLQkJCQkJCQkJaWYgKG9yaWcuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCQkJCQkJCXByb2NQYWNrYWdlcy5hZGQob3JpZy5lQ29udGFpbmVyKCkpOwotCQkJCQkJCQkJY29waWVkQWN0aXZpdGllcy5hZGQoKEFjdGl2aXR5KSBlbGVtZW50KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXNob3dXYXJuaW5nID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoc2hvd1dhcm5pbmcpIHsKLQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFCi0JCQkJCQkJLnNob3dXYXJuaW5nKAotCQkJCQkJCQkJZ2V0TGFiZWwoKSwKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLkFjdGl2aXR5QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2cpOwotCQkJCX0KLQotCQkJCWlmICghcHJvY1BhY2thZ2VzLmlzRW1wdHkoKSkgewotCQkJCQkvLyBjb3B5IHRoZSBQcm9jZXNzUGFja2FnZSBvZiB0aGUgb3JpZ2luYWwgQWN0aXZpdHkgdG8gYWRkCi0JCQkJCS8vIGl0IHRvIHRoZSBQcm9jZXNzUGFja2FnZQotCQkJCQkvLyBvZiB0aGUgdGFyZ2V0IEFjdGl2aXR5LgotCQkJCQkvLwotCQkJCQkvLyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IG5ldwotCQkJCQkvLyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCQkJCQkvLyAsIG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJCQkJQ29tbWFuZCBjb21tYW5kID0gQ29weUNvbW1hbmQuY3JlYXRlKAotCQkJCQkJCWFkZENvbW1hbmQuZ2V0RG9tYWluKCksIHByb2NQYWNrYWdlcyk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljb21tYW5kLmV4ZWN1dGUoKTsKLQotCQkJCQkJLy8gUmVmcmVzaCB0aGUgQWRkQ29tbWFuZC5jb2xsZWN0aW9uIHdpdGggbmV3IGFjdGl2aXR5IGNvcGllcy4KLQkJCQkJCS8vCi0JCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpKTsKLQkJCQkJCUNvbGxlY3Rpb24gZWxlbWVudHMgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKTsJCQkJCQkKLQkJCQkJCWVsZW1lbnRzLmNsZWFyKCk7CQotCQkJCQkJQ29sbGVjdGlvbiBjb2wgPSBjb21tYW5kLmdldFJlc3VsdCgpOwotCQkJCQkJQXJyYXlMaXN0PFByb2Nlc3NQYWNrYWdlPiBwcm9jUGtnQ29waWVzID0gbmV3IEFycmF5TGlzdDxQcm9jZXNzUGFja2FnZT4oY29sKTsKLS8vCQkJCQkJQXJyYXlMaXN0PFByb2Nlc3NQYWNrYWdlPiBwcm9jUGtnQ29waWVzID0gbmV3IEFycmF5TGlzdDxQcm9jZXNzUGFja2FnZT4oY29tbWFuZC5nZXRSZXN1bHQoKSk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQkJCWludCBpbmRleCA9IGNvcGllZEFjdGl2aXRpZXMuaW5kZXhPZihlbGVtZW50KTsKLQkJCQkJCQlpZihpbmRleCAhPSAtMSkgewotCQkJCQkJCQlQcm9jZXNzUGFja2FnZSBjb3B5ID0gcHJvY1BrZ0NvcGllcy5nZXQoaW5kZXgpOwotCQkJCQkJCQllbGVtZW50ID0gZ2V0QWN0aXZpdHlDb3B5KGNvcHkpOwotCQkJCQkJCX0KLQkJCQkJCQlpZihlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotCQkJCQkJCWNvbW1hbmQuZGlzcG9zZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpdml0eSBnZXRBY3Rpdml0eUNvcHkoUHJvY2Vzc1BhY2thZ2UgY29weSkgewotCQlpZiAoY29weSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCUFjdGl2aXR5IGFjdENvcHkgPSAoKFByb2Nlc3NDb21wb25lbnQpIGNvcHkpCi0JCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkvLyBjb3B5IGRhdGEgZnJvbSBQcm9jZXNzQ29tcG9uZW50IHRvIGEgbmV3Ci0JCQkvLyBQcm9jZXNzUGFja2FnZQotCQkJUHJvY2Vzc1BhY2thZ2UgcGtnQ29weSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJcGtnQ29weS5zZXROYW1lKGFjdENvcHkuZ2V0TmFtZSgpKTsKLQkJCXBrZ0NvcHkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKGFjdENvcHkpOwotCQkJcGtnQ29weS5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwoCi0JCQkJCWNvcHkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkpOwotCQkJcGtnQ29weS5nZXREaWFncmFtcygpCi0JCQkJCS5hZGRBbGwoY29weS5nZXREaWFncmFtcygpKTsKLQkJCXBrZ0NvcHkuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZEFsbCgKLQkJCQkJY29weS5nZXRDaGlsZFBhY2thZ2VzKCkpOwotCi0JCQlyZXR1cm4gYWN0Q29weTsKLQkJfSBlbHNlIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb3B5LmdldFByb2Nlc3NFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlyZXR1cm4gKEFjdGl2aXR5KSBlbGVtZW50OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJcHJlcGFyZUFkZExpc3QoKTsKLQkJY29weVByb2Nlc3NQYWNrYWdlcygpOwotCQlzdXBlci5leGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGUgaXMgYSBjaGlsZCwgZGlyZWN0IG9yIG9mIGFjdAotCSAqIAotCSAqIEBwYXJhbSBhY3QKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ2hpbGRPZihPYmplY3QgcGFyZW50LCBPYmplY3QgZSkgewotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgcGFyZW50OwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlID09IGNoaWxkKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlpZiAoaXNDaGlsZE9mKGNoaWxkLCBlKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJLy8gV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcilwYXJlbnQpLmdldFdvcmtQcm9kdWN0KCk7Ci0JCS8vIGlmKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJLy8gaWYoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkvLyBpZihVbWFVdGlsLmlzQ29udGFpbmVkQnkoKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpZSkuZ2V0V29ya1Byb2R1Y3QoKSwKLQkJLy8gd3ApKSB7Ci0JCS8vIHJldHVybiB0cnVlOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ2hpbGRPZihDb2xsZWN0aW9uIGVsZW1lbnRzLCBPYmplY3QgZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWlmIChpc0NoaWxkT2YoaXRlci5uZXh0KCksIGUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaGFzQ29weVRvT3JpZ2luYWxNYXAoKSB7Ci0JCUVkaXRpbmdEb21haW4gZWQgPSBhZGRDb21tYW5kLmdldERvbWFpbigpOwotCQlpZiAoZWQgaW5zdGFuY2VvZiBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCVRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGVkKTsKLQkJCXJldHVybiAoZWRpdGluZ0RvbWFpbi5nZXRDb3B5VG9PcmlnaW5hbE1hcCgpICE9IG51bGwgJiYKLQkJCQkJIWVkaXRpbmdEb21haW4uZ2V0Q29weVRvT3JpZ2luYWxNYXAoKS5pc0VtcHR5KCkpCi0JCQkJfHwgKGVkaXRpbmdEb21haW4uZ2V0Q2xpcGJvYXJkVG9PcmlnaW5hbE1hcCgpICE9IG51bGwgJiYKLQkJCQkJCSFlZGl0aW5nRG9tYWluLmdldENsaXBib2FyZFRvT3JpZ2luYWxNYXAoKS5pc0VtcHR5KCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBPYmplY3QgZ2V0T3JpZ2luYWwoT2JqZWN0IGNvcHkpIHsKLQkJVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkID0gKFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgYWRkQ29tbWFuZC5nZXREb21haW4oKTsKLQkJT2JqZWN0IG9yaWdpbmFsID0gZWQuZ2V0Q29weVRvT3JpZ2luYWxNYXAoKS5nZXQoY29weSk7Ci0JCWlmKG9yaWdpbmFsID09IG51bGwgJiYgZWQuZ2V0Q2xpcGJvYXJkVG9PcmlnaW5hbE1hcCgpICE9IG51bGwpIHsKLQkJCW9yaWdpbmFsID0gZWQuZ2V0Q2xpcGJvYXJkVG9PcmlnaW5hbE1hcCgpLmdldChjb3B5KTsKLQkJfQotCQlyZXR1cm4gb3JpZ2luYWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByZXBhcmVBZGRMaXN0KCkgewotCQkvLyBjbGVhbnVwIGVsZW1lbnQgbGlzdCBiZWZvcmUgYWRkaW5nIGl0IHRvIHRoZSBhY3Rpdml0eSB0byBhdm9pZCBhZGRpbmcKLQkJLy8gZWxlbWVudHMgbXVsdGlwbGUgdGltZXMKLQkJLy8JCQotCQlpZiAoaGFzQ29weVRvT3JpZ2luYWxNYXAoKSkgewotCQkJQXJyYXlMaXN0IG9yaWdpbmFscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCU1hcCBvcmlnaW5hbFRvQ29weU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3Qgb3JpZ2luYWwgPSBnZXRPcmlnaW5hbChlbGVtZW50KTsKLQkJCQlpZiAob3JpZ2luYWwgIT0gbnVsbCkgewotCQkJCQlvcmlnaW5hbHMuYWRkKG9yaWdpbmFsKTsKLQkJCQkJb3JpZ2luYWxUb0NvcHlNYXAucHV0KG9yaWdpbmFsLCBlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUFycmF5TGlzdCByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJLy8gQXJyYXlMaXN0IGFkZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvcmlnaW5hbHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoaXNDaGlsZE9mKG9yaWdpbmFscywgZWxlbWVudCkpIHsKLQkJCQkJcmVtb3ZlTGlzdC5hZGQob3JpZ2luYWxUb0NvcHlNYXAuZ2V0KGVsZW1lbnQpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS5yZW1vdmVBbGwocmVtb3ZlTGlzdCk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BY3Rpdml0eURlZXBDb3B5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2YjgxNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BY3Rpdml0eURlZXBDb3B5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlZhcmlhYmlsaXR5SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYXRpb25TZXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbnN0cmFpbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5EZXB0aExldmVsQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVRleHRSZWZlcmVuY2VSZXBsYWNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFBoeXNpY2FsbHkgY29waWVzIGFuIGFjdGl2aXR5IHdpdGggYWxsIG9mIGl0cyBkaXJlY3Qgb3IgaW5oZXJpdGVkIHN0cnVjdHVyYWwgZmVhdHVyZXMgYW5kIHJlZmVyZW5jZXMuCi0gKiAgIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdW4gMjEsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURlZXBDb3B5Q29tbWFuZCBleHRlbmRzIENvcHlDb21tYW5kIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXMgPSB7Ci0JCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQl9OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIGRpYWdyYW1UeXBlcyA9IHsKLQkJSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNLAotCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSwKLQkJSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0KLQl9OwotCQotCXB1YmxpYyBzdGF0aWMgQWRhcHRlckZhY3RvcnlbXSBnZXRBZGFwdGVyRmFjdG9yaWVzKCkgewotCQlyZXR1cm4gYWRhcHRlckZhY3RvcmllczsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBFZGl0aW5nRG9tYWluIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIHsKLQotCQkvKioKLQkJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JCSAqIEBwYXJhbSBjb21tYW5kU3RhY2sKLQkJICovCi0JCXB1YmxpYyBFZGl0aW5nRG9tYWluKCkgewotCQkJc3VwZXIoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCkpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiNjcmVhdGVDb21tYW5kKGphdmEubGFuZy5DbGFzcywgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyKQotCQkgKi8KLQkJcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDbGFzcyBjb21tYW5kQ2xhc3MsIENvbW1hbmRQYXJhbWV0ZXIgY29tbWFuZFBhcmFtZXRlcikgewotCQkJaWYoY29tbWFuZENsYXNzID09IENyZWF0ZUNvcHlDb21tYW5kLmNsYXNzKSB7Ci0JCQkJcmV0dXJuIG5ldyBDcmVhdGVEZWVwQ29weUNvbW1hbmQodGhpcywgY29tbWFuZFBhcmFtZXRlci5nZXRFT3duZXIoKSwgKEhlbHBlcikgY29tbWFuZFBhcmFtZXRlci5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJCWlmKGNvbW1hbmRDbGFzcyA9PSBJbml0aWFsaXplQ29weUNvbW1hbmQuY2xhc3MpIHsKLQkJCQlyZXR1cm4gbmV3IEluaXRpYWxpemVEZWVwQ29weUNvbW1hbmQodGhpcywgY29tbWFuZFBhcmFtZXRlci5nZXRFT3duZXIoKSwgKEhlbHBlcikgY29tbWFuZFBhcmFtZXRlci5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5jcmVhdGVDb21tYW5kKGNvbW1hbmRDbGFzcywgY29tbWFuZFBhcmFtZXRlcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ3JlYXRlQ29weUNvbW1hbmRzKENvbXBvdW5kQ29tbWFuZCBjb21wb3VuZENvbW1hbmQsCi0JCQlFT2JqZWN0IG9iamVjdCkgewotCi0JCS8vIE9wZXJhdGlvbiB0byBoYW5kbGUgY29weSByZXBsYWNlcnMKLQkJLy8gCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSAmJglvYmplY3QgIT0gdGhpcy5hY3Rpdml0eS5lQ29udGFpbmVyKCkgKSB7CQkJCi0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2Upb2JqZWN0OwotCQkJYm9vbGVhbiBpc1JlcGxhY2VkID0gZmFsc2U7Ci0JCQlBY3Rpdml0eSByZXBsYWNlciA9IG51bGw7Ci0JCQlBY3Rpdml0eSBvcmlnbmFsQWN0aXZpdHkgPSBudWxsOwotCQkJZm9yKE9iamVjdCBwcm9jZXNFbGVtZW50IDogcGtnLmdldFByb2Nlc3NFbGVtZW50cygpKXsKLQkJCQlpZiAocHJvY2VzRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCXJlcGxhY2VyID0gZ2V0UmVwbGFjZXIoIChBY3Rpdml0eSlwcm9jZXNFbGVtZW50ICk7Ci0JCQkJCWlmIChyZXBsYWNlciAhPSBudWxsICkgewotCQkJCQkJaXNSZXBsYWNlZCA9IHRydWU7Ci0JCQkJCQlvcmlnbmFsQWN0aXZpdHkgPSAoQWN0aXZpdHkpcHJvY2VzRWxlbWVudDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGlzUmVwbGFjZWQpIHsJCQkJCi0JCQkJY29weUhlbHBlci5kZWNyZW1lbnREZWZlcnJlZEluaXRpYWxpemF0aW9uQ291bnQoKTsKLQkJCQlBY3Rpdml0eURlZXBDb3B5Q29tbWFuZCBjbWQgPSBuZXcgQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQocmVwbGFjZXIsIChDb3B5SGVscGVyKWNvcHlIZWxwZXIsIGNvbmZpZywgCi0JCQkJCQl0YXJnZXRQcm9jZXNzLCBtb25pdG9yLCBmYWxzZSxhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKTsKLQkJCQljbWQuZ3VpZExpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KEFjdGl2aXR5RGVlcENvcHlDb21tYW5kLnRoaXMuZ3VpZExpc3QpOwotCQkJCWNtZC5ndWlkTGlzdC5hZGRBbGwoUHJvY2Vzc1V0aWwuZ2V0R3VpZExpc3QoQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQudGhpcy5hY3Rpdml0eSwgb3JpZ25hbEFjdGl2aXR5KSk7Ci0JCQkJdHJ5IHsKLQkJCQkJY21kLmV4ZWN1dGUoKTsKLQkJCQkJUHJvY2Vzc1BhY2thZ2UgcGtnQ29weSA9IGNtZC5wa2dDb3B5OwkJCQkJCi0JCQkJCS8vYmFzaWMgcHV0OiBvcmlnaW5hbCBwcmMgcGtnIHRvIGNvcGllZCBwa2cgYmFzZWQgb24gcmVwbGFjZWQgcGFja2FnZS4KLQkJCQkJKChDb3B5SGVscGVyKWNvcHlIZWxwZXIpLmJhc2ljUHV0KG9iamVjdCwgcGtnQ29weSk7CQkJCi0JCQkJCS8vYmFzaWMgcHV0IG9yaWdpbmFsIGFjdGl2aXR5IHRvIHRoZSBjb3B5IG9mIHJlcGxhY2VyIGFjdGl2aXR5LgotCQkJCQkoKENvcHlIZWxwZXIpY29weUhlbHBlcikuYmFzaWNQdXQob3JpZ25hbEFjdGl2aXR5LCBjb3B5SGVscGVyLmdldChyZXBsYWNlcikpOwotCQkJCX1maW5hbGx5ewotCQkJCQljbWQuZGlzcG9zZSgpOwotCQkJCX0JCi0JCQkJY29weUhlbHBlci5pbmNyZW1lbnREZWZlcnJlZEluaXRpYWxpemF0aW9uQ291bnQoKTsJCQkJCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQlzdXBlci5hZGRDcmVhdGVDb3B5Q29tbWFuZHMoY29tcG91bmRDb21tYW5kLCBvYmplY3QpOwotCQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgZm9yIHRoZSByZXBsYWNlciBvZiBhY3Rpdml0eSBpbiB0aGUgY29weSBiYXNlZCBjb25maWd1cmF0aW9uLgotCSAqICAKLQkgKiBAcGFyYW0gYWN0aXZpdHkgdGFyZ2V0IGFjdGl2aXR5Ci0JICogQHJldHVybiByZXBsY2FjZXIgb3IgbnVsbCBpZiBpdCBkb2Vzbid0IGhhdmUgb25lCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5IGdldFJlcGxhY2VyKEFjdGl2aXR5IGFjdGl2aXR5KXsJCQotCQlDb25maWd1cmF0aW9uU2V0dGVyIGNvbmZpZ1NldHRlciA9IG5ldyBDb25maWd1cmF0aW9uU2V0dGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQl0cnkgewotCQkJaWYgKGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IgIT0gbnVsbCApIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBjb25maWdTZXR0ZXIuZ2V0T2xkQ29uZmlndXJhdGlvbigpOyAKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvcHlDb25maWcgPSBjb25maWcgPT0gbnVsbCA/IChjdXJyZW50Q29uZmlnICE9IG51bGwgPyBjdXJyZW50Q29uZmlnCi0JCQkJCQk6IHRhcmdldFByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKSkKLQkJCQkJCTogY29uZmlnOwotCQkJCWFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3Iuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjb3B5Q29uZmlnKTsJCQkJCi0KLQkJCQlWYXJpYWJpbGl0eUluZm8gdmFyaWFiaWxpdHlJbmZvID0gYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvci5nZXRWYXJpYWJpbGl0eUluZm8oYWN0aXZpdHkpOwotCi0JCQkJaWYgKHZhcmlhYmlsaXR5SW5mbyAhPSBudWxsICYmICEgdmFyaWFiaWxpdHlJbmZvLmdldEluaGVyaXRhbmNlTGlzdCgpLmlzRW1wdHkoKSApIHsKLQkJCQkJQWN0aXZpdHkgcmVwbGFjZXIgPSAoQWN0aXZpdHkpdmFyaWFiaWxpdHlJbmZvLmdldEluaGVyaXRhbmNlTGlzdCgpLmdldCgwKTsKLQkJCQkJcmV0dXJuICByZXBsYWNlciA9PSBhY3Rpdml0eSA/IG51bGwgOiByZXBsYWNlcjsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBmaW5hbGx5ewotCQkJaWYgKGNvbmZpZ1NldHRlciAhPSBudWxsICkgewotCQkJCWNvbmZpZ1NldHRlci5yZXN0b3JlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGZvciB0aGUgY29udHJpYnV0b3JzIG9mIGFjdGl2aXR5IGluIHRoZSBjb3B5IGJhc2VkIGNvbmZpZ3VyYXRpb24uCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHJldHVybiBhIGxpc3QgaW5jbHVkaW5nIGNvbnRyaWJ1dG9ycyBvciBlbXB0eSBsaXN0Ci0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0Q29udHJpYnV0b3JzKEFjdGl2aXR5IGFjdGl2aXR5KXsKLQkJQ29uZmlndXJhdGlvblNldHRlciBjb25maWdTZXR0ZXIgPSBuZXcgQ29uZmlndXJhdGlvblNldHRlcihnZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJdHJ5IHsKLQkJCWlmIChhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yICE9IG51bGwgKSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gY29uZmlnU2V0dGVyLmdldE9sZENvbmZpZ3VyYXRpb24oKTsgCi0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb3B5Q29uZmlnID0gY29uZmlnID09IG51bGwgPyAoY3VycmVudENvbmZpZyAhPSBudWxsID8gY3VycmVudENvbmZpZwotCQkJCQkJOiB0YXJnZXRQcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkpCi0JCQkJCQk6IGNvbmZpZzsKLQkJCQlhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29weUNvbmZpZyk7CQkJCQotCi0JCQkJVmFyaWFiaWxpdHlJbmZvIHZhcmlhYmlsaXR5SW5mbyA9IGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IuZ2V0VmFyaWFiaWxpdHlJbmZvKGFjdGl2aXR5KTsKLQotCQkJCWlmICh2YXJpYWJpbGl0eUluZm8gIT0gbnVsbCApIHsKLQkJCQkJcmV0dXJuIHZhcmlhYmlsaXR5SW5mby5nZXRDb250cmlidXRvcnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfSBmaW5hbGx5ewotCQkJaWYgKGNvbmZpZ1NldHRlciAhPSBudWxsICkgewotCQkJCWNvbmZpZ1NldHRlci5yZXN0b3JlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBjbGFzcyBDcmVhdGVEZWVwQ29weUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVDb3B5Q29tbWFuZCB7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBkb21haW4KLQkJICogQHBhcmFtIG93bmVyCi0JCSAqIEBwYXJhbSBjb3B5SGVscGVyCi0JCSAqLwotCQlwdWJsaWMgQ3JlYXRlRGVlcENvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLCBIZWxwZXIgY29weUhlbHBlcikgewotCQkJc3VwZXIoZG9tYWluLCBvd25lciwgY29weUhlbHBlcik7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNvcHlDb21tYW5kI2RvR2V0Q2hpbGRyZW5Ub0NvcHkoKQotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb248Pz4gZG9HZXRDaGlsZHJlblRvQ29weSgpIHsKLQkJCUNvbmZpZ3VyYXRpb25TZXR0ZXIgY29uZmlnU2V0dGVyID0gbmV3IENvbmZpZ3VyYXRpb25TZXR0ZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCQl0cnkgewotCQkJCWNvbmZpZ1NldHRlci5zZXQoY29uZmlnKTsKLQkJCQlJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IGNvbmZpZ1NldHRlci5nZXRDb25maWd1cmF0b3IoKTsKLQkJCQkKLQkJCQkvLyBDcmVhdGUgY29tbWFuZHMgdG8gY3JlYXRlIGNvcGllcyBvZiB0aGUgY2hpbGRyZW4uCi0JCQkJLy8KLQkJCQlMaXN0PE9iamVjdD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQkJZm9yIChJdGVyYXRvcjxFT2JqZWN0PiBpID0gb3duZXIuZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLQkJCQl7Ci0JCQkJCU9iamVjdCBvID0gaS5uZXh0KCk7Ci0JCQkJCWlmKG8gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJLy8gbWFrZSBzdXJlIHRoYXQgQWN0aXZpdHkgd2lsbCBiZSBjb3BpZWQgZmlyc3QKLQkJCQkJCS8vIHNvIHJlZmVyZW5jZXMgdG8gaXRzIGluaGVyaXRlZCBlbGVtZW50cyBjYW4gYmUgcmVzb2x2ZWQKLQkJCQkJCS8vIHByb3Blcmx5Ci0JCQkJCQkvLwotCQkJCQkJaWYoY29uZmlndXJhdG9yID09IG51bGwgfHwgY29uZmlndXJhdG9yLmFjY2VwdChvKSkgewotCQkJCQkJCXJlc3VsdC5hZGQoMCwgbyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXN1bHQuYWRkKG8pOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQljb25maWdTZXR0ZXIucmVzdG9yZSgpOwotCQkJfQotCQl9Ci0JCQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIEluaXRpYWxpemVEZWVwQ29weUNvbW1hbmQgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kIHsKLQkJLyoqCi0JCSAqIExpc3Qgb2YgR1VJRHMgb2YgYWN0aXZpdHkgc3RhcnRpbmcgZnJvbSB0aGUgdG9wIHByb2Nlc3MgdG8gCi0JCSAqLwotCQlwcml2YXRlIExpc3Q8U3RyaW5nPiBndWlkTGlzdDsKLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gZG9tYWluCi0JCSAqIEBwYXJhbSBvd25lcgotCQkgKiBAcGFyYW0gY29weUhlbHBlcgotCQkgKi8KLQkJcHVibGljIEluaXRpYWxpemVEZWVwQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsIEhlbHBlciBjb3B5SGVscGVyKSB7Ci0JCQlzdXBlcihkb21haW4sIG93bmVyLCBjb3B5SGVscGVyKTsKLQkJCWNvcHkgPSAoRU9iamVjdCkgY29weUhlbHBlci5nZXQob3duZXIpOwotCQl9Ci0JCQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQjY29weVJlZmVyZW5jZXMoKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgY29weVJlZmVyZW5jZXMoKSB7Ci0JCQlBY3Rpdml0eSBiYXNlID0gbnVsbDsKLQkJCUFjdGl2aXR5IGJhc2VDb3B5ID0gbnVsbDsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjaGlsZEJhc2VDb3BpZXMgPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQlDb25maWd1cmF0aW9uU2V0dGVyIGNvbmZpZ1NldHRlciA9IG51bGw7Ci0JCQlJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IG51bGw7Ci0JCQlib29sZWFuIGJhc2VBY2NlcHRlZCA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlpZihvd25lciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBvd25lcjsKLQkJCQkJaWYoUHJvY2Vzc1V0aWwuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoYWN0aXZpdHkpKSB7Ci0JCQkJCQljb25maWdTZXR0ZXIgPSBuZXcgQ29uZmlndXJhdGlvblNldHRlcihnZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCQkJCWNvbmZpZ1NldHRlci5zZXQoY29uZmlnKTsKLQkJCQkJCWNvbmZpZ3VyYXRvciA9IGNvbmZpZ1NldHRlci5nZXRDb25maWd1cmF0b3IoKTsKLQkJCQkJCS8vIGNvcHkgaW5oZXJpdGVkIGVsZW1lbnRzIGJ5IGRlZXAtY29weWluZyBiYXNlIGFjdGl2aXR5Ci0JCQkJCQkvLwotCQkJCQkJLy8gZGVlcCBjb3B5IG9mIGJhc2UgYWN0aXZpdHkgYXQgdGhpcyBwb2ludCBpcyBlc3NlbnRpYWwgc28gcmVmZXJlbmNlcyB0byBwcmVkZWNlc3NvcnMKLQkJCQkJCS8vIHdpbGwgYmUgY29waWVkIGNvcnJlY3RseQotCQkJCQkJLy8KLQkJCQkJCWJhc2UgPSAoQWN0aXZpdHkpIGFjdGl2aXR5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJCWJhc2VBY2NlcHRlZCA9IGNvbmZpZ3VyYXRvciA9PSBudWxsIHx8IGNvbmZpZ3VyYXRvci5hY2NlcHQoYmFzZSk7Ci0JCQkJCQlpZihiYXNlQWNjZXB0ZWQpIHsJCQkJCQkJCi0JCQkJCQkJQ29weUhlbHBlciBoZWxwZXIgPSAoQ29weUhlbHBlciljb3B5SGVscGVyOwotCQkJCQkJCUFjdGl2aXR5IG9sZEJhc2VDb3B5ID0gKEFjdGl2aXR5KSBoZWxwZXIuZ2V0KGJhc2UpOwotCQkJCQkJCS8vIHRoaXMgd2lsbCByZWRpcmVjdCBhbnkgcmVmZXJlbmNlIHRvIGNvcHkgb2YgYmFzZSBpbiBkaWFncmFtIHRvIHRoZSBjb3B5IG9mIHRoZSBhY3Rpdml0eQotCQkJCQkJCS8vCi0JCQkJCQkJaGVscGVyLnB1dFZhcmlhYmlsaXR5RWxlbWVudChiYXNlLCBhY3Rpdml0eSk7Ci0JCQkJCQkJQXJyYXlMaXN0IGNoaWxkQmFzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCQkJCQkJaWYoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZTsKLQkJCQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlRWxlbWVudCA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJCQkJCWlmKGJhc2VFbGVtZW50ICE9IG51bGwgJiYKLQkJCQkJCQkJCQkJKHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04gfHwgdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKSkKLQkJCQkJCQkJCXsKLQkJCQkJCQkJCQloZWxwZXIucHV0VmFyaWFiaWxpdHlFbGVtZW50KGJhc2VFbGVtZW50LCB2ZSk7Ci0JCQkJCQkJCQkJY2hpbGRCYXNlcy5hZGQoYmFzZUVsZW1lbnQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCi0JCQkJCQkJQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQgY21kID0gbmV3IEFjdGl2aXR5RGVlcENvcHlDb21tYW5kKGJhc2UsIGhlbHBlciwgY29uZmlnLCB0YXJnZXRQcm9jZXNzLCBtb25pdG9yLCBmYWxzZSxhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKTsKLQkJCQkJCQljbWQuZ3VpZExpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KEFjdGl2aXR5RGVlcENvcHlDb21tYW5kLnRoaXMuZ3VpZExpc3QpOwotCQkJCQkJCWNtZC5ndWlkTGlzdC5hZGRBbGwoUHJvY2Vzc1V0aWwuZ2V0R3VpZExpc3QoQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQudGhpcy5hY3Rpdml0eSwgYWN0aXZpdHkpKTsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQljbWQuZXhlY3V0ZSgpOwotCi0JCQkJCQkJCWJhc2VDb3B5ID0gKEFjdGl2aXR5KSBoZWxwZXIuZ2V0KGJhc2UpOwotCQkJCQkJCQlpZihhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUykgewotCQkJCQkJCQkJLy8ga2VlcCBhY3Rpdml0eSBvbmx5IGFzIGJhY2t1cCBjb3B5IG9mIGJhc2UKLQkJCQkJCQkJCS8vCi0JCQkJCQkJCQloZWxwZXIucmVtb3ZlVmFyaWFiaWxpdHlFbGVtZW50KGJhc2UpOwotCQkJCQkJCQkJaGVscGVyLnB1dEJhY2t1cENvcHkoYmFzZSwgYWN0aXZpdHkpOwotCi0JCQkJCQkJCQkvLyBwdXQgYmFjayBvbGRCYXNlQ29weQotCQkJCQkJCQkJaWYob2xkQmFzZUNvcHkgIT0gbnVsbCkgewotCQkJCQkJCQkJCWhlbHBlci5iYXNpY1B1dChiYXNlLCBvbGRCYXNlQ29weSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQotCQkJCQkJCQkvLyByZW1vdmUgdGhlIGNvcGllcyBvZiBhbGwgYmFzZSBzaW5jZSBiYXNlIGNvcGllcyBhcmUgbm90IGFkZGVkIHRvIHRoZSBwcm9jZXNzCi0JCQkJCQkJCS8vCi0JCQkJCQkJCWhlbHBlci5yZW1vdmUoYmFzZSk7Ci0JCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkQmFzZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQlFT2JqZWN0IGNoaWxkQmFzZUNvcHkgPSAoRU9iamVjdCkgaGVscGVyLnJlbW92ZShpdGVyLm5leHQoKSk7Ci0JCQkJCQkJCQlpZihjaGlsZEJhc2VDb3B5ICE9IG51bGwpIHsKLQkJCQkJCQkJCQljaGlsZEJhc2VDb3BpZXMuYWRkKGNoaWxkQmFzZUNvcHkpOwotCQkJCQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoY2hpbGRCYXNlQ29weS5lQ29udGFpbmVyKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJQWN0aXZpdHkgYWN0aXZpdHlDb3B5ID0gKEFjdGl2aXR5KSBjb3B5OwotCi0JCQkJCQkJCS8vIHJlbW92ZSB0aGUgY29waWVzIG9mIGJhc2UgZGlhZ3JhbSBpZiB0aGUgYWN0aXZpdHkgYWxyZWFkeSBoYXZlIGRpYWdyYW0gb2YgdGhlIHNhbWUgdHlwZQotCQkJCQkJCQkvLwotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpYWdyYW1UeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQkJaW50IHR5cGUgPSBkaWFncmFtVHlwZXNbaV07Ci0JCQkJCQkJCQlpZihkaWFncmFtTWdyLmdldERpYWdyYW0oYWN0aXZpdHksIHR5cGUpICE9IG51bGwpIHsKLQkJCQkJCQkJCQlEaWFncmFtIGRpYWdyYW0gPSBkaWFncmFtTWdyLmdldERpYWdyYW0oYWN0aXZpdHlDb3B5LCB0eXBlKTsKLQkJCQkJCQkJCQlpZihkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShkaWFncmFtKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQotCQkJCQkJCQkvLyBtb3ZlIGNvbnRlbnQgb2YgYmFzZSBwYWNrYWdlIG92ZXIgdG8gdGhlIGFjdGl2aXR5J3MgcGFja2FnZQotCQkJCQkJCQkvLwotCQkJCQkJCQltb3ZlQ29udGVudChjbWQucGtnQ29weSwgYWN0aXZpdHlDb3B5KTsJCi0KLQkJCQkJCQkJLy8gcmVjb3JkIHRoZSBjb3B5IG9mIHRoZSB3cmFwcGVycwotCQkJCQkJCQkvLwotCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYmFzZUNvcHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJCWlmKCFjaGlsZEJhc2VDb3BpZXMuY29udGFpbnMoZSkpIHsKLQkJCQkJCQkJCQlCcmVha2Rvd25FbGVtZW50IG9yaWdpbmFsID0gKEJyZWFrZG93bkVsZW1lbnQpIGhlbHBlci5nZXRPcmlnaW5hbChlKTsKLQkJCQkJCQkJCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihjbWQuZ3VpZExpc3QpOwotCQkJCQkJCQkJCWxpc3QuYWRkKG9yaWdpbmFsLmdldEd1aWQoKSk7Ci0JCQkJCQkJCQkJaGVscGVyLnB1dFdyYXBwZXJDb3B5KFByb2Nlc3NVdGlsLnRvR3VpZFBhdGgobGlzdCksIGUpOwkJCQkJCQkJCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJCWNtZC5kaXNwb3NlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJc3VwZXIuY29weVJlZmVyZW5jZXMoKTsKLQotCQkJCWlmKGJhc2UgIT0gbnVsbCkgewotCQkJCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgb3duZXI7Ci0JCQkJCUFjdGl2aXR5IGFjdGl2aXR5Q29weSA9ICgoQWN0aXZpdHkpIGNvcHkpOwkJCQkJCi0JCQkJCQotCQkJCQlpZihiYXNlQWNjZXB0ZWQpIHsKLQkJCQkJCS8vIGNvcHkgaW5oZXJpdGVkIGJyZWFrZG93biBlbGVtZW50cyBmcm9tIHRoZSBiYXNlIGFjdGl2aXR5IGluIHRoZSByaWdodCBvcmRlcgotCQkJCQkJLy8KLQkJCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IGNvbmZpZ1NldHRlci5nZXRPbGRDb25maWd1cmF0aW9uKCk7Ci0KLQkJCQkJCS8vIEFkZCBicmVha2Rvd24gZWxlbWVudHMgZnJvbSBiYXNlIGNvcHkgdG8gdGhlIGFjdGl2aXR5IGNvcHkuIAotCQkJCQkJLy8gRG9uJ3QgYWRkIGNvcHkgb2YgYmFzZSBlbGVtZW50IG9mIHRoZSBleGlzdGluZyBjaGlsZHJlbgotCQkJCQkJLy8KLQkJCQkJCUxpc3Q8QnJlYWtkb3duRWxlbWVudD4gYnJlYWtkb3duRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PEJyZWFrZG93bkVsZW1lbnQ+KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yPEJyZWFrZG93bkVsZW1lbnQ+IGl0ZXIgPSBiYXNlQ29weS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmKCFjaGlsZEJhc2VDb3BpZXMuY29udGFpbnMoZSkgJiYgKGNvbmZpZ3VyYXRvciA9PSBudWxsIHx8IGNvbmZpZ3VyYXRvci5hY2NlcHQoZSkpKSB7Ci0JCQkJCQkJCWJyZWFrZG93bkVsZW1lbnRzLmFkZChlKTsKLQkJCQkJCQl9CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCQlhY3Rpdml0eUNvcHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwoMCwgYnJlYWtkb3duRWxlbWVudHMpOwotCQkJCQkJYmFzZUNvcHkuc2V0U3VwZXJBY3Rpdml0aWVzKG51bGwpOwotCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShiYXNlQ29weSk7Ci0KLQotCQkJCQkJLy8gY29weSBvdGhlciBzdHJpbmcgYXR0cmlidXRlcyBhcyB3ZWxsIGFmdGVyIHJlYWxpemUgdGhlbQotCQkJCQkJLy8KLQkJCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29weUNvbmZpZyA9IGNvbmZpZyA9PSBudWxsID8gKGN1cnJlbnRDb25maWcgIT0gbnVsbCA/IGN1cnJlbnRDb25maWcKLQkJCQkJCQkJOiB0YXJnZXRQcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkpCi0JCQkJCQkJCTogY29uZmlnOwotCQkJCQkJZm9yIChFQXR0cmlidXRlIGF0dHJpYnV0ZSA6IGdldEF0dHJpYnV0ZXNUb0NvcHkoKSkgewotCQkJCQkJCWlmIChhdHRyaWJ1dGUuaXNDaGFuZ2VhYmxlKCkgJiYgIWF0dHJpYnV0ZS5pc0Rlcml2ZWQoKSkgewotCQkJCQkJCQlPYmplY3QgdmFsdWUgPSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5nZXRBdHRyaWJ1dGUoYWN0aXZpdHksIGF0dHJpYnV0ZSwgY29weUNvbmZpZyk7Ci0JCQkJCQkJCWFjdGl2aXR5Q29weS5lU2V0KGF0dHJpYnV0ZSwgdmFsdWUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gYWN0aXZpdHkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQkJCQlmb3IgKEVBdHRyaWJ1dGUgYXR0cmlidXRlIDogY29udGVudC5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpKSB7Ci0JCQkJCQkJaWYgKGF0dHJpYnV0ZS5pc0NoYW5nZWFibGUoKSAmJiAhYXR0cmlidXRlLmlzRGVyaXZlZCgpCi0JCQkJCQkJCQkmJiBhdHRyaWJ1dGUuZ2V0RUF0dHJpYnV0ZVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkgPT0gTGl0ZXJhbHMuU1RSSU5HLmdldEluc3RhbmNlQ2xhc3MoKSkKLQkJCQkJCQl7Ci0JCQkJCQkJCU9iamVjdCB2YWx1ZSA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldEF0dHJpYnV0ZShjb250ZW50LCBhY3Rpdml0eSwgYXR0cmlidXRlLCBjb3B5Q29uZmlnKTsKLQkJCQkJCQkJYWN0aXZpdHlDb3B5LmdldFByZXNlbnRhdGlvbigpLmVTZXQoYXR0cmlidXRlLCB2YWx1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLy8gY29weSBwcmVzZW50YXRpb24gbmFtZQotCQkJCQkvLwotCQkJCQlhY3Rpdml0eUNvcHkuc2V0UHJlc2VudGF0aW9uTmFtZShQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKGFjdGl2aXR5KSk7CQkJCQkKLQotCQkJCQkvLyBjbGVhciB0aGUgdmFyaWFiaWxpdHkgZGF0YQotCQkJCQkvLwotCQkJCQlhY3Rpdml0eUNvcHkuc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChudWxsKTsKLQkJCQkJYWN0aXZpdHlDb3B5LnNldFZhcmlhYmlsaXR5VHlwZShudWxsKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy9jb3B5IGNvbnRyaWJ1dG9ycwkJCQkKLQkJCQlpZiAob3duZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSAmJiBjb3B5Q29udHJpYnV0b3JzICkgewotCQkJCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSlvd25lcjsJCQkJCQotCQkJCQlMaXN0IGNvbnRyaWJ1dG9ycyA9IGdldENvbnRyaWJ1dG9ycyhhY3Rpdml0eSk7Ci0JCQkJCWlmICghY29udHJpYnV0b3JzLmlzRW1wdHkoKSkgewotCQkJCQkJZG9Db3B5Q29udHJpYnV0b3JzKGNvbnRyaWJ1dG9ycyxhY3Rpdml0eSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJLy8gY2xlYXIgdGhlIHZhcmlhYmlsaXR5IGRhdGEgb2YgcmVwbGFjZXIKLQkJCQkvLwotCQkJCWlmIChjb3B5IGluc3RhbmNlb2YgQWN0aXZpdHkgJiYgVG5nVXRpbC5pc1JlcGxhY2VyKChWYXJpYWJpbGl0eUVsZW1lbnQpY29weSkpIHsKLQkJCQkJKChBY3Rpdml0eSljb3B5KS5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KG51bGwpOwotCQkJCQkoKEFjdGl2aXR5KWNvcHkpLnNldFZhcmlhYmlsaXR5VHlwZShudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZihjb25maWdTZXR0ZXIgIT0gbnVsbCkgewotCQkJCQljb25maWdTZXR0ZXIucmVzdG9yZSgpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYoY29weSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWN0aXZpdHkgYWN0aXZpdHlDb3B5ID0gKChBY3Rpdml0eSkgY29weSk7CQkJCQkKLQotCQkJCS8vIGNsZWFyIHN1cHByZXNzaW9uIGRhdGEKLQkJCQkvLwotCQkJCUNvbnN0cmFpbnQgcnVsZSA9IENvbnN0cmFpbnRNYW5hZ2VyLmdldENvbnN0cmFpbnQoYWN0aXZpdHlDb3B5LCBDb25zdHJhaW50TWFuYWdlci5QUk9DRVNTX1NVUFBSRVNTSU9OLCBmYWxzZSk7Ci0JCQkJaWYocnVsZSAhPSBudWxsKSB7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUocnVsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkKLQkJLyoqCi0JCSAqIENvcHkgY29udHJpYnV0b3JzCi0JCSAqIEBwYXJhbSBjb250cmlidXRvcnMKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGRvQ29weUNvbnRyaWJ1dG9ycyhMaXN0IGNvbnRyaWJ1dG9ycywgQWN0aXZpdHkgb3duZXIgKSB7Ci0JCQlDb25maWd1cmF0aW9uU2V0dGVyIGNvbmZpZ1NldHRlciA9IG5ldyBDb25maWd1cmF0aW9uU2V0dGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJdHJ5IHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBjb25maWdTZXR0ZXIuZ2V0T2xkQ29uZmlndXJhdGlvbigpOwotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29weUNvbmZpZyA9IGNvbmZpZyA9PSBudWxsID8gKGN1cnJlbnRDb25maWcgIT0gbnVsbCA/IGN1cnJlbnRDb25maWcKLQkJCQkJCTogdGFyZ2V0UHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpKQotCQkJCQkJOiBjb25maWc7Ci0JCQkJY29uZmlnU2V0dGVyLnNldChjb3B5Q29uZmlnKTsKLQkJCQlJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IGNvbmZpZ1NldHRlci5nZXRDb25maWd1cmF0b3IoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29udHJpYnV0b3JzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJQWN0aXZpdHkgY29udHJpYnV0ZWRBY3Rpdml0eSA9IChBY3Rpdml0eSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlDb3B5SGVscGVyIGhlbHBlciA9IChDb3B5SGVscGVyKWNvcHlIZWxwZXI7Ci0JCQkJCUFjdGl2aXR5IGNvbnRyaWJ1dG9yQ29weSA9IChBY3Rpdml0eSkgaGVscGVyLmdldChjb250cmlidXRlZEFjdGl2aXR5KTsKLQkJCQkJQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQgY21kID0gbmV3IEFjdGl2aXR5RGVlcENvcHlDb21tYW5kKGNvbnRyaWJ1dGVkQWN0aXZpdHksIGhlbHBlciwgCi0JCQkJCQkJY29uZmlnLCB0YXJnZXRQcm9jZXNzLCBtb25pdG9yLCBmYWxzZSxhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKTsKLQkJCQkJY21kLmNvcHlDb250cmlidXRvcnMgPSBmYWxzZTsKLQkJCQkJY21kLmd1aWRMaXN0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPihBY3Rpdml0eURlZXBDb3B5Q29tbWFuZC50aGlzLmd1aWRMaXN0KTsKLQkJCQkJY21kLmd1aWRMaXN0LmFkZEFsbChQcm9jZXNzVXRpbC5nZXRHdWlkTGlzdChBY3Rpdml0eURlZXBDb3B5Q29tbWFuZC50aGlzLmFjdGl2aXR5LCBvd25lcikpOwotCQkJCQl0cnkgewotCQkJCQkJY21kLmV4ZWN1dGUoKTsKLQotCQkJCQkJY29udHJpYnV0b3JDb3B5ID0gKEFjdGl2aXR5KSBoZWxwZXIuZ2V0KGNvbnRyaWJ1dGVkQWN0aXZpdHkpOwotCi0JCQkJCQlBY3Rpdml0eSBhY3Rpdml0eUNvcHkgPSAoQWN0aXZpdHkpIGNvcHk7Ci0KLQkJCQkJCS8vIHJlbW92ZSB0aGUgY29waWVzIG9mIGJhc2UgZGlhZ3JhbSBpZiB0aGUgYWN0aXZpdHkgYWxyZWFkeSBoYXZlIGRpYWdyYW0gb2YgdGhlIHNhbWUgdHlwZQotCQkJCQkJLy8KLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlhZ3JhbVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJaW50IHR5cGUgPSBkaWFncmFtVHlwZXNbaV07Ci0JCQkJCQkJaWYoZGlhZ3JhbU1nci5nZXREaWFncmFtKGFjdGl2aXR5LCB0eXBlKSAhPSBudWxsKSB7Ci0JCQkJCQkJCURpYWdyYW0gZGlhZ3JhbSA9IGRpYWdyYW1NZ3IuZ2V0RGlhZ3JhbShhY3Rpdml0eUNvcHksIHR5cGUpOwotCQkJCQkJCQlpZihkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoZGlhZ3JhbSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIG1vdmUgY29udGVudCBvZiBiYXNlIHBhY2thZ2Ugb3ZlciB0byB0aGUgYWN0aXZpdHkncyBwYWNrYWdlCi0JCQkJCQkvLwotCQkJCQkJbW92ZUNvbnRlbnQoY21kLnBrZ0NvcHksIGFjdGl2aXR5Q29weSk7CQotCi0JCQkJCQlMaXN0PEJyZWFrZG93bkVsZW1lbnQ+IGJyZWFrZG93bkVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxCcmVha2Rvd25FbGVtZW50PigpOwotCQkJCQkJZm9yIChJdGVyYXRvcjxCcmVha2Rvd25FbGVtZW50PiBpdGVyID0gY29udHJpYnV0b3JDb3B5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJQnJlYWtkb3duRWxlbWVudCBlID0gaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYoY29uZmlndXJhdG9yID09IG51bGwgfHwgY29uZmlndXJhdG9yLmFjY2VwdChlKSl7Ci0JCQkJCQkJCWJyZWFrZG93bkVsZW1lbnRzLmFkZChlKTsKLQkJCQkJCQl9CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCQlhY3Rpdml0eUNvcHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwoYnJlYWtkb3duRWxlbWVudHMpOwotCQkJCQkJY29udHJpYnV0b3JDb3B5LnNldFN1cGVyQWN0aXZpdGllcyhudWxsKTsKLQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoY29udHJpYnV0b3JDb3B5KTsKLQotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJY21kLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX1maW5hbGx5ewotCQkJCWlmIChjb25maWdTZXR0ZXIgIT0gbnVsbCApIHsKLQkJCQkJY29uZmlnU2V0dGVyLnJlc3RvcmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvY2Vzc1BhY2thZ2UgcGtnQ29weTsKLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JcHJvdGVjdGVkIElEaWFncmFtTWFuYWdlciBkaWFncmFtTWdyOwotCi0JcHJvdGVjdGVkIFByb2Nlc3MgdGFyZ2V0UHJvY2VzczsKLQotCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0KLQlwcm90ZWN0ZWQgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIExpbmtlZExpc3Q8U3RyaW5nPiBndWlkTGlzdDsKLQotCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcjsKLQkKLQkvL3VzZWQgdG8gcmV0cmlldmUgcmVwbGFjZXJzIGFuZCBjb250cmlidXRvcnMKLQlwcml2YXRlIElDb25maWd1cmF0b3IgYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcjsKLQkKLQkvLwotCXByaXZhdGUgYm9vbGVhbiBjb3B5Q29udHJpYnV0b3JzID0gdHJ1ZTsKLQkKLQlwcml2YXRlIEFjdGl2aXR5RGVlcENvcHlDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBDb3B5SGVscGVyIGNvcHlIZWxwZXIsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgUHJvY2VzcyB0YXJnZXRQcm9jZXNzLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBib29sZWFuIGluaXRHdWlkTGlzdCxJQ29uZmlndXJhdG9yIGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IpIHsKLQkJc3VwZXIobnVsbCwgYWN0aXZpdHkuZUNvbnRhaW5lcigpLCBjb3B5SGVscGVyKTsKLQkJQXNzZXJ0LmlzVHJ1ZShhY3Rpdml0eS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSwgIkFjdGl2aXR5J3MgY29udGFpbmVyIG11c3QgYmUgYSBQcm9jZXNzUGFja2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQkJZG9tYWluID0gbmV3IEVkaXRpbmdEb21haW4oKTsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCXRoaXMudGFyZ2V0UHJvY2VzcyA9IHRhcmdldFByb2Nlc3M7Ci0JCWRpYWdyYW1NZ3IgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERpYWdyYW1NYW5hZ2VyKCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZGlhZ3JhbU1nciwgIkNvdWxkIG5vdCBsb2FkIGRpYWdyYW0gbWFuYWdlciIpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JCWlmKGluaXRHdWlkTGlzdCkgewotCQkJZ3VpZExpc3QgPSBQcm9jZXNzVXRpbC5nZXRHdWlkTGlzdChudWxsLCB0aGlzLmFjdGl2aXR5KTsKLQkJfQotCQl0aGlzLmFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IgPSBhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yOwotCX0KLQkKLQlwdWJsaWMgQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIENvcHlIZWxwZXIgY29weUhlbHBlciwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQcm9jZXNzIHRhcmdldFByb2Nlc3MsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElDb25maWd1cmF0b3IgYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcikgewotCQl0aGlzKGFjdGl2aXR5LCBjb3B5SGVscGVyLCBjb25maWcsIHRhcmdldFByb2Nlc3MsIG1vbml0b3IsIHRydWUsYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcik7CQkKLQl9Ci0JCi0JcHVibGljIEFjdGl2aXR5RGVlcENvcHlDb21tYW5kKE9iamVjdCBhY3Rpdml0eU9yV3JhcHBlciwgQ29weUhlbHBlciBjb3B5SGVscGVyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCVByb2Nlc3MgdGFyZ2V0UHJvY2VzcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQ29uZmlndXJhdG9yIGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IpIHsKLQkJdGhpcygoQWN0aXZpdHkpVG5nVXRpbC51bndyYXAoYWN0aXZpdHlPcldyYXBwZXIpLCBjb3B5SGVscGVyLCBjb25maWcsIHRhcmdldFByb2Nlc3MsIG1vbml0b3IsIAotCQkJCWFjdGl2aXR5T3JXcmFwcGVyIGluc3RhbmNlb2YgQWN0aXZpdHksYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcik7Ci0JCWlmKGFjdGl2aXR5T3JXcmFwcGVyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCXdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGFjdGl2aXR5T3JXcmFwcGVyOwotCQkJZ3VpZExpc3QgPSBQcm9jZXNzVXRpbC5nZXRHdWlkTGlzdCh3cmFwcGVyKTsKLQkJfQotCX0JCi0JCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pZG9tYWluKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW1vbml0b3Iuc3ViVGFzayhOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5jb3B5aW5nQWN0aXZpdGllc19tc2csIFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoYWN0aXZpdHkpKSk7Ci0JCXN1cGVyLmV4ZWN1dGUoKTsKLQkJQ29sbGVjdGlvbjw/PiByZXN1bHQgPSBzdXBlci5nZXRSZXN1bHQoKTsKLQkJaWYoIXJlc3VsdC5pc0VtcHR5KCkpIHsKLQkJCXBrZ0NvcHkgPSAoUHJvY2Vzc1BhY2thZ2UpIHJlc3VsdC5pdGVyYXRvcigpLm5leHQoKTsKLQkJCWZpeFByb2Nlc3NDb21wb25lbnQoKTsKLQkJCXJlcGxhY2VUZXh0UmVmZXJlbmNlcygpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIGZpeCB0aGUgcHJvY2VzcyBjb21wb25lbnQgdG8gbWFrZSBpdCBhIHByb2Nlc3MgcGFja2FnZS4KLQkgKiBUaGlzIG1ldGhvZCBtaWdodCBiZSBvdmVycmlkZW4gYnkgc3ViY2xhc3MgdG8gYWNoaXZlIGRpZmZlcmVuY2UgcmVzdWx0LgotCSAqIEZvciBleGFtcGxlLCAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXhQcm9jZXNzQ29tcG9uZW50KCkgewotCQlpZihwa2dDb3B5IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJLy8gcmVwbGFjZSB0aGUgUHJvY2Vzc0NvbXBvbmVudCB3aXRoIGEgZXF1aXZhbGVudCBQcm9jZXNzUGFja2FnZQotCQkJLy8KLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQlDb2xsZWN0aW9uIGZlYXR1cmVzID0gbmV3IEFycmF5TGlzdChwa2dDb3B5LmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKSk7Ci0JCQlmZWF0dXJlcy5yZXRhaW5BbGwocGtnLmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCB2YWx1ZSA9IHBrZ0NvcHkuZUdldChmZWF0dXJlKTsKLQkJCQlwa2cuZVNldChmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9Ci0JCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpcGtnQ29weSkuZ2V0UHJvY2VzcygpOwotCQkJaWYocHJvYyAhPSBudWxsKSB7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZCgwLCBwcm9jKTsKLQkJCX0KLQkJCXBrZ0NvcHkgPSBwa2c7Ci0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBJZiB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBpbiB0aGUgY29waWVkIGVsZW1lbnRzIGNvbnRhaW4gcmVmZXJlbmNlcyAoVVJMcykgdG8gb3RoZXIgZWxlbWVudHMgCi0JICogd2l0aGluIHRoZSBzYW1lIGNvcGllZCBwcm9jZXNzIHRoZW4gcmVwbGFjZSB0aGVzZSByZWZlcmVuY2VzIHdpdGggcmVmZXJlbmNlcyB0aGF0IHBvaW50IHRvIAotCSAqIHRoZSBuZXcgZWxlbWVudHMgaW4gdGhlIGNvcGllZCBzdHJ1Y3R1cmVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2VUZXh0UmVmZXJlbmNlcygpIHsKLQkJSVRleHRSZWZlcmVuY2VSZXBsYWNlciB0eHRSZWZSZXBsYWNlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0VGV4dFJlZmVyZW5jZVJlcGxhY2VyKCk7Ci0JCWlmKHR4dFJlZlJlcGxhY2VyID09IG51bGwpIHJldHVybjsKLQotCQlNYXAgb2xkVG9OZXdPYmplY3RNYXAgPSAoKENvcHlIZWxwZXIpIGNvcHlIZWxwZXIpLmdldE9iamVjdFRvQ29weU1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2dDb3B5LmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWZvciAoSXRlcmF0b3IgYXR0cmlidXRlcyA9IGVsZW1lbnQuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOyBhdHRyaWJ1dGVzLmhhc05leHQoKTsgKQotCQkJewotCQkJCUVBdHRyaWJ1dGUgYXR0cmlidXRlID0gKEVBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMubmV4dCgpOwotCQkJCWlmIChhdHRyaWJ1dGUuaXNDaGFuZ2VhYmxlKCkgJiYgIWF0dHJpYnV0ZS5pc0Rlcml2ZWQoKSAmJiAoYXR0cmlidXRlLmlzTWFueSgpIHx8IGVsZW1lbnQuZUlzU2V0KGF0dHJpYnV0ZSkpCi0JCQkJCQkmJiBhdHRyaWJ1dGUuZ2V0RUF0dHJpYnV0ZVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkgPT0gTGl0ZXJhbHMuU1RSSU5HLmdldEluc3RhbmNlQ2xhc3MoKSkKLQkJCQl7Ci0JCQkJCVN0cmluZyB0ZXh0ID0gKFN0cmluZykgZWxlbWVudC5lR2V0KGF0dHJpYnV0ZSk7Ci0JCQkJCWlmKHRleHQgIT0gbnVsbCkgewotCQkJCQkJdGV4dCA9IHR4dFJlZlJlcGxhY2VyLnJlcGxhY2UodGV4dCwgdGFyZ2V0UHJvY2Vzcywgb2xkVG9OZXdPYmplY3RNYXApOwotCQkJCQkJZWxlbWVudC5lU2V0KGF0dHJpYnV0ZSwgdGV4dCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCNnZXRSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPD8+IGdldFJlc3VsdCgpIHsKLQkJaWYocGtnQ29weSAhPSBudWxsKSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSBQcm9jZXNzVXRpbC5maW5kQWN0aXZpdHkocGtnQ29weSk7Ci0JCQlpZihhY3QgIT0gbnVsbCkgewotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGFjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCQotCS8qKgotCSAqIE1vdmVzIGNvbnRlbnQgb2Ygc291cmNlIG9iamVjdCA8Y29kZT5zcmM8L2NvZGU+IG92ZXIgdG8gdGhlIHRhcmdldCBvYmplYyA8Y29kZT50YXJnZXQ8L2NvZGU+Ci0JICogQHBhcmFtIHNyYwotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIG1vdmVDb250ZW50KFByb2Nlc3NQYWNrYWdlIHNyYywgQWN0aXZpdHkgYWN0KSB7Ci0JCVByb2Nlc3NQYWNrYWdlIHRhcmdldCA9IChQcm9jZXNzUGFja2FnZSkgYWN0LmVDb250YWluZXIoKTsKLQkJLy8gbW92ZSBjb250ZW50IG9mIGJhc2UgcGFja2FnZSBvdmVyIHRvIHRoZSBhY3Rpdml0eSdzIHBhY2thZ2UJCQkJCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KHNyYy5lQ29udGVudHMoKSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGUgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IGUuZUNvbnRhaW5pbmdGZWF0dXJlKCk7CQkJCQkJCi0JCQlpZihmLmlzTWFueSgpKSB7Ci0JCQkJKChMaXN0KXRhcmdldC5lR2V0KGYpKS5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQkJaWYoc3JjIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJUHJvY2VzcyBiYXNlQ29weSA9ICgoUHJvY2Vzc0NvbXBvbmVudClzcmMpLmdldFByb2Nlc3MoKTsKLQkJCXRhcmdldC5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoYmFzZUNvcHkpOwotCQl9Ci0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQnJlYWtkb3duRWxlbWVudCBnZXRUb3BFbGVtZW50KEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlpZihlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUJyZWFrZG93bkVsZW1lbnQgdG9wID0gZTsKLQkJZm9yKEJyZWFrZG93bkVsZW1lbnQgbyA9IGUuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7IG8gIT0gbnVsbDsgbyA9IG8uZ2V0U3VwZXJBY3Rpdml0aWVzKCkpIHsKLQkJCXRvcCA9IG87Ci0JCX0KLQkJcmV0dXJuIHRvcDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY29weVN1cHByZXNzaW9uU3RhdGVzKCkgewotCQlDb2xsZWN0aW9uPD8+IHJlc3VsdCA9IGdldFJlc3VsdCgpOwotCQlpZihyZXN1bHQuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIHdyYXBwZXJQYXRoID0gd3JhcHBlciAhPSBudWxsID8gUHJvY2Vzc1V0aWwudG9HdWlkUGF0aChndWlkTGlzdCkgOiBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0ZXJGYWN0b3JpZXMubGVuZ3RoOyBpKyspIHsKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcmllc1tpXTsKLQkJCWJvb2xlYW4gaXNXQlMgPSBhZGFwdGVyRmFjdG9yeSA9PSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJSUZpbHRlciBmaWx0ZXIgPSBQcm9jZXNzVXRpbC5nZXRGaWx0ZXIoYWRhcHRlckZhY3RvcnkpOwotCQkJSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSBudWxsOwotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gbnVsbDsKLQkJCWlmKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLQkJCQljb25maWd1cmF0b3IgPSAoSUNvbmZpZ3VyYXRvcikgZmlsdGVyOwotCQkJCWN1cnJlbnRDb25maWcgPSBjb25maWd1cmF0b3IuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJCWNvbmZpZ3VyYXRvci5zZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCUFjdGl2aXR5IGFjdCA9IFByb2Nlc3NVdGlsLmZpbmRBY3Rpdml0eSgoUHJvY2Vzc1BhY2thZ2UpIG93bmVyKTsKLQkJCQlQcm9jZXNzVXRpbC5pbml0aWFsaXplSXRlbVByb3ZpZGVyUGF0aChhY3QsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KTsKLQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKHByb2MpOwotCQkJCURlcHRoTGV2ZWxBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjw/PiBpdGVyID0gbmV3IERlcHRoTGV2ZWxBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjxPYmplY3Q+KGFkYXB0ZXJGYWN0b3J5LCBwcm9jKTsKLQkJCQlpbnQgZGVwdGhMZXZlbCA9IC0xOwotCQkJCWZpbmRfZGVlcF9jb3BpZWRfYWN0aXZpdHk6Ci0JCQkJCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQotCQkJCQkJLy8gc2V0IGRlcHRoIGxldmVsIGlmIHRoZSBjdXJyZW50IGNoaWxkIGlzIHRoZSBkZWVwLWNvcGllZCBhY3Rpdml0eQotCQkJCQkJLy8KLQkJCQkJCWlmKHdyYXBwZXIgPT0gbnVsbCkgewotCQkJCQkJCWlmKGNoaWxkID09IGFjdGl2aXR5KSB7Ci0JCQkJCQkJCWRlcHRoTGV2ZWwgPSBpdGVyLmdldERlcHRoTGV2ZWwoKTsKLQkJCQkJCQkJYnJlYWsgZmluZF9kZWVwX2NvcGllZF9hY3Rpdml0eTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlpZihjaGlsZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJCVN0cmluZyBwYXRoID0gU3VwcHJlc3Npb24uZ2V0UGF0aFdpdGhvdXRWaWV3VHlwZSgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGNoaWxkKS50b1N0cmluZygpOwotCQkJCQkJCQlpZih3cmFwcGVyUGF0aC5lcXVhbHMocGF0aCkpIHsKLQkJCQkJCQkJCWRlcHRoTGV2ZWwgPSBpdGVyLmdldERlcHRoTGV2ZWwoKTsKLQkJCQkJCQkJCWJyZWFrIGZpbmRfZGVlcF9jb3BpZWRfYWN0aXZpdHk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9CQkJCQkKLQkJCQkJfQotCQkJCQotCQkJCS8vIGNvcHkgc3VwcHJlc3Npb24gc3RhdGUgb2YgYWxsIHN1cHByZXNzZWQgZWxlbWVudHMgdW5kZXIgZGVlcC1jb3BpZWQgYWN0aXZpdHkKLQkJCQkvLwotCQkJCUNvcHlIZWxwZXIgaGVscGVyID0gKENvcHlIZWxwZXIpY29weUhlbHBlcjsKLQkJCQlNYXA8PywgPz4gb3JpZ2luYWxUb0NvcHlNYXAgPSBoZWxwZXIuZ2V0T2JqZWN0VG9Db3B5TWFwKCk7Ci0JCQkJTWFwPE9iamVjdCwgT2JqZWN0PiBlbGVtZW50T3JXcmFwcGVyVG9Db3B5TWFwID0gbnVsbDsKLQkJCQlpZihpc1dCUykgewotCQkJCQllbGVtZW50T3JXcmFwcGVyVG9Db3B5TWFwID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7Ci0JCQkJCUFjdGl2aXR5IGRlZXBDb3B5ID0gKEFjdGl2aXR5KSByZXN1bHQuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQkJCWVsZW1lbnRPcldyYXBwZXJUb0NvcHlNYXAucHV0KHdyYXBwZXIgIT0gbnVsbCA/IHdyYXBwZXIgOiBhY3Rpdml0eSwgZGVlcENvcHkpOwotCQkJCX0KLQkJCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotCQkJCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYoaXRlci5nZXREZXB0aExldmVsKCkgPiBkZXB0aExldmVsKSB7Ci0JCQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJCQkJCWlmKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQkJaWYoIWlzV0JTICYmIGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCQkvLyBza2lwIGNvcHlpbmcgc3VwcHJlc3Npb24gc3RhdGUgYW5kIG9yZGVyaW5nCi0JCQkJCQkJCS8vIGJyZWFrZG93biBlbGVtZW50cyBmb3IgYWN0aXZpdHkgaW4gb3RoZXIgdmlldwotCQkJCQkJCQkvLyB0aGFuIFdCUwotCQkJCQkJCQkvLwotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0vLwkJCQkJCQlCcmVha2Rvd25FbGVtZW50IG9yaWdpbmFsID0gKEJyZWFrZG93bkVsZW1lbnQpIGU7Ci0vLwkJCQkJCQlCcmVha2Rvd25FbGVtZW50IGNvcHkgPSAoQnJlYWtkb3duRWxlbWVudCkgb3JpZ2luYWxUb0NvcHlNYXAuZ2V0KG9yaWdpbmFsKTsKLS8vCQkJCQkJCQotLy8JCQkJCQkJaWYoVG5nVXRpbC5ERUJVRykgewotLy8JCQkJCQkJCVN0cmluZyBjb3B5TmFtZSA9IChjb3B5ICE9IG51bGwgPyBjb3B5LmdldE5hbWUoKSA6IG51bGwpOwotLy8JCQkJCQkJCUJyZWFrZG93bkVsZW1lbnQgdG9wID0gZ2V0VG9wRWxlbWVudChjb3B5KTsKLS8vCQkJCQkJCQlpZihjb3B5ID09IG51bGwgfHwgIW9yaWdpbmFsLmdldE5hbWUoKS5lcXVhbHMoY29weU5hbWUpIHx8IHRvcCAhPSBkZWVwQ29weSkgewotLy8JCQkJCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIm9yaWdpbmFsOiAnIiArIG9yaWdpbmFsLmdldE5hbWUoKSArICInLCBjb3B5OiAnIiArIGNvcHlOYW1lICsgIicsIGNvcHkncyB0b3AgYWN0aXZpdHk6ICIgKyB0b3ApOwotLy8JCQkJCQkJCX0KLS8vCQkJCQkJCX0KLQkJCQkJCQlCcmVha2Rvd25FbGVtZW50IGNvcHkgPSBudWxsOwotCQkJCQkJCWJvb2xlYW4gaXNTdXBwcmVzc2VkID0gc3VwcHJlc3Npb24uaXNTdXBwcmVzc2VkKGNoaWxkKTsKLQkJCQkJCQkKLQkJCQkJCQkvLyBmaW5kIGNvcHkgdG8gc3VwcHJlc3Mgb3IsIGlmIGVsZW1lbnQgaXMgYW4gYWN0aXZpdHksIHRvIHJlb3JkZXIgaXRzIGJyZWFrZG93biBlbGVtZW50cwotCQkJCQkJCS8vCi0JCQkJCQkJaWYoaXNTdXBwcmVzc2VkIHx8IGlzV0JTKSB7Ci0JCQkJCQkJCWlmKGNoaWxkID09IGUpIHsJCi0JCQkJCQkJCQljb3B5ID0gKEJyZWFrZG93bkVsZW1lbnQpIG9yaWdpbmFsVG9Db3B5TWFwLmdldChlKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIGlmKGNoaWxkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGNoaWxkV3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgY2hpbGQ7Ci0JCQkJCQkJCQlpZihjaGlsZFdyYXBwZXIuaXNJbmhlcml0ZWQoKSkgewotCQkJCQkJCQkJCVN0cmluZyBndWlkUGF0aCA9IFN1cHByZXNzaW9uLmdldFBhdGhXaXRob3V0Vmlld1R5cGUoY2hpbGRXcmFwcGVyKS50b1N0cmluZygpOwotCQkJCQkJCQkJCWNvcHkgPSBoZWxwZXIuZ2V0V3JhcHBlckNvcHkoZ3VpZFBhdGgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmKGNvcHkgIT0gbnVsbCkgewotCQkJCQkJCQkJaWYoaXNTdXBwcmVzc2VkKSB7Ci0JCQkJCQkJCQkJY29weS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4uVFJVRSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZihpc1dCUykgewotCQkJCQkJCQkJCWVsZW1lbnRPcldyYXBwZXJUb0NvcHlNYXAucHV0KGNoaWxkLCBjb3B5KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIHJlb3JkZXIgYnJlYWtkb3duIGVsZW1lbnRzIG9mIGFjdGl2aXRpZXMKLQkJCQkvLwotCQkJCWlmKGlzV0JTKSB7Ci0JCQkJCWZvciAoTWFwLkVudHJ5PE9iamVjdCwgT2JqZWN0PiBlbnRyeSA6IGVsZW1lbnRPcldyYXBwZXJUb0NvcHlNYXAuZW50cnlTZXQoKSkgewotCQkJCQkJT2JqZWN0IG8gPSBlbnRyeS5nZXRLZXkoKTsKLQkJCQkJCU9iamVjdCBjb3B5ID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQkJCWlmKGNvcHkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpcCA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG8sIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQkJQ29sbGVjdGlvbjw/PiBjaGlsZHJlbiA9IGlwLmdldENoaWxkcmVuKG8pOwotCQkJCQkJCUVMaXN0PD8+IGxpc3QgPSAgKEVMaXN0PD8+KSAoKEFjdGl2aXR5KSBjb3B5KS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJCQkJCUxpc3Q8Pz4gY2hpbGRyZW5MaXN0ID0gY2hpbGRyZW4gaW5zdGFuY2VvZiBMaXN0PD8+ID8gKExpc3Q8Pz4pIGNoaWxkcmVuIDogbmV3IEFycmF5TGlzdDxPYmplY3Q+KGNoaWxkcmVuKTsKLQkJCQkJCQlpbnQgc2l6ZSA9IGNoaWxkcmVuTGlzdC5zaXplKCk7Ci0JCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKLQkJCQkJCQkJT2JqZWN0IGNoaWxkID0gY2hpbGRyZW5MaXN0LmdldChqKTsKLQkJCQkJCQkJT2JqZWN0IGNoaWxkQ29weSA9IGVsZW1lbnRPcldyYXBwZXJUb0NvcHlNYXAuZ2V0KGNoaWxkKTsKLQkJCQkJCQkJaWYoY2hpbGRDb3B5ICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmKGogPCBzaXplIC0gMSkgewotCQkJCQkJCQkJCU9iamVjdCBuZXh0Q2hpbGQgPSBjaGlsZHJlbkxpc3QuZ2V0KGogKyAxKTsKLQkJCQkJCQkJCQlPYmplY3QgbmV4dENoaWxkQ29weSA9IGVsZW1lbnRPcldyYXBwZXJUb0NvcHlNYXAuZ2V0KG5leHRDaGlsZCk7CQotCQkJCQkJCQkJCWlmKG5leHRDaGlsZENvcHkgIT0gbnVsbCkgewotCQkJCQkJCQkJCQlpbnQgc3VjY0lkID0gbGlzdC5pbmRleE9mKG5leHRDaGlsZENvcHkpOwotCQkJCQkJCQkJCQlpZihzdWNjSWQgIT0gLTEpIHsKLQkJCQkJCQkJCQkJCWludCBpZCA9IGxpc3QuaW5kZXhPZihjaGlsZENvcHkpOwotCQkJCQkJCQkJCQkJaWYoaWQgIT0gc3VjY0lkIC0gMSkgewotCQkJCQkJCQkJCQkJCWlmKGlkIDwgc3VjY0lkKSB7Ci0JCQkJCQkJCQkJCQkJCWxpc3QubW92ZShzdWNjSWQgLSAxLCBpZCk7Ci0JCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCQkJCQlsaXN0Lm1vdmUoaWQsIHN1Y2NJZCk7Ci0JCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQl9CQkJCQkJCQkJCQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQllbHNlIGlmKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQkJCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJFbGVtZW50IGRvZXMgbm90IGhhdmUgY29weTogIiArIG5leHRDaGlsZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSBpZihUbmdVdGlsLkRFQlVHKSB7Ci0JCQkJCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkVsZW1lbnQgZG9lcyBub3QgaGF2ZSBjb3B5OiAiICsgY2hpbGQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZihjb25maWd1cmF0b3IgIT0gbnVsbCkgewotCQkJCQljb25maWd1cmF0b3Iuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjdXJyZW50Q29uZmlnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIENvcHlIZWxwZXIgZ2V0Q29weUhlbHBlcigpIHsKLQkJcmV0dXJuIChDb3B5SGVscGVyKSBjb3B5SGVscGVyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BY3Rpdml0eURyb3BDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BY3Rpdml0eURyb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YzI0N2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlEcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklBY3Rpb25UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkFjdGl2aXR5SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci0KLQotLyoqCi0gKiBEcm9wIGNvbW1hbmQgZm9yIGFjdGl2aXR5IHRoYXQgc3VwcG9ydHMgZXh0ZW5kLCBjb3B5LCBhbmQgZGVlcCBjb3B5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEcm9wQ29tbWFuZCBleHRlbmRzIEJTRHJvcENvbW1hbmQgewotCi0JcHJpdmF0ZSBPYmplY3Qgdmlld2VyOwotCi0JcHJpdmF0ZSBMaXN0PENhcGFiaWxpdHlQYXR0ZXJuPiBvbGRQYXR0ZXJuczsKLQotCXByaXZhdGUgTGlzdDxDYXBhYmlsaXR5UGF0dGVybj4gcGF0dGVybnM7Ci0KLQlwcm90ZWN0ZWQgUHJvY2VzcyB0YXJnZXRQcm9jZXNzOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVsaXZlcnlQcm9jZXNzOwotCi0JcHJpdmF0ZSBpbnQgdHlwZTsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb248QWN0aXZpdHk+IGFwcGxpZWRBY3Rpdml0aWVzOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JcHJvdGVjdGVkIEFjdGl2aXR5SGFuZGxlciBhY3Rpdml0eUhhbmRsZXI7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVFeGVjdXRlZDsKLQotCXByb3RlY3RlZCBIYXNoU2V0PD8+IGFkZGVkT2JqZWN0czsKLQkKLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRvciBhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yOwotCi0JcHVibGljIEFjdGl2aXR5RHJvcENvbW1hbmQoQWN0aXZpdHkgdGFyZ2V0LCBMaXN0IGFjdGl2aXRpZXMsIE9iamVjdCB2aWV3ZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHRhcmdldCwgYWN0aXZpdGllcyk7Ci0JCXNldExhYmVsKExpYnJhcnlFZGl0UmVzb3VyY2VzLkFjdGl2aXR5RHJvcENvbW1hbmRfbGFiZWwpOyAKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQkJdGFyZ2V0UHJvY2VzcyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyh0YXJnZXQpOwotCQkKLQkJaXNEZWxpdmVyeVByb2Nlc3MgPSB0YXJnZXRQcm9jZXNzIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzOwotCQlpZiAoaXNEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCW9sZFBhdHRlcm5zID0gbmV3IEFycmF5TGlzdCgoKERlbGl2ZXJ5UHJvY2VzcykgdGFyZ2V0UHJvY2VzcykKLQkJCQkJLmdldEluY2x1ZGVzUGF0dGVybnMoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIEFjdGl2aXR5RHJvcENvbW1hbmQoQWN0aXZpdHkgdGFyZ2V0LCBMaXN0IGFjdGl2aXRpZXMsIE9iamVjdCB2aWV3ZXIsIAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksSUNvbmZpZ3VyYXRvciBkZWVwQ29weUNvbmZpZ3VyYXRvcil7Ci0JCXRoaXModGFyZ2V0LCBhY3Rpdml0aWVzLCB2aWV3ZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5hY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yID0gZGVlcENvcHlDb25maWd1cmF0b3I7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHByZXBhcmVEcm9wRWxlbWVudHMoKSB7Ci0JCS8vIHJlbW92ZSBhbnkgZHJvcCBlbGVtZW50IHRoYXQgaXMgc3VwcHJlc3MKLQkJLy8KLQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gZHJvcEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlbGVtZW50KTsKLQkJCWlmKHByb2MgIT0gbnVsbCkgewotCQkJCVN1cHByZXNzaW9uIHN1cHAgPSBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihwcm9jKTsKLQkJCQlpZihzdXBwLmlzU3VwcHJlc3NlZChlbGVtZW50KSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXN1cGVyLnByZXBhcmVEcm9wRWxlbWVudHMoKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCWlmKHR5cGUgPT0gSUFjdGlvblR5cGVQcm92aWRlci5ERUVQX0NPUFkpIHsKLQkJCXJ1bkFzSm9iID0gdHJ1ZTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyBjaGVja0NvcHkoKSB7Ci0JCWZvciAoT2JqZWN0IGUgOiBkcm9wRWxlbWVudHMpIHsKLQkJCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gY2hlY2tDaXJjdWxhcigoQWN0aXZpdHkpIGUpOwotCQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyBjaGVja0V4dGVuZCgpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZHJvcEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0vLwkJCQotLy8JCQlpZiAoKFByb2Nlc3NVdGlsLmhhc0NvbnRyaWJ1dG9yT3JSZXBsYWNlcigoQWN0aXZpdHkpIGVsZW1lbnQpKSl7Ci0vLwkJCQljYW5FeHRlbmQgPSBmYWxzZTsKLS8vCQkJCWJyZWFrOwotLy8JCQl9Ci0vLwkJCQotLy8JCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZWxlbWVudCk7Ci0vLwkJCWlmICh0YXJnZXRQcm9jZXNzLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBwcm9jKSB7Ci0vLwkJCQljYW5FeHRlbmQgPSBmYWxzZTsKLS8vCQkJCWJyZWFrOwotLy8JCQl9Ci0vLwkJCQotLy8JCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuICYmIHByb2MgIT0gdGFyZ2V0UHJvY2VzcykgewotLy8JCQkJY2FuRXh0ZW5kID0gdHJ1ZTsKLS8vCQkJCWJyZWFrOwotLy8JCQl9Ci0JCQkKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgaXRlci5uZXh0KCk7Ci0JCQlQcm9jZXNzIHNyY1Byb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KTsKLQkJCWlmKHNyY1Byb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MgJiYgc3JjUHJvYyAhPSB0YXJnZXRQcm9jZXNzKSB7Ci0JCQkJLy8gY2Fubm90IGV4dGVuZCBhIGRpZmZlcmVudCBkZWxpdmVyeSBwcm9jZXNzIG9yIGFueSBvZiBpdHMgYWN0aXZpdGllcwotCQkJCS8vCi0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uUExVR0lOX0lELCAwLAotCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuY2Fubm90X2NvcHlfb3JfZXh0ZW5kX2RlbGl2ZXJ5X3Byb2Nlc3MsCi0JCQkJCQludWxsKTsKLQkJCX0KLQkJCUlTdGF0dXMgc3RhdHVzID0gY2hlY2tDaXJjdWxhcihhY3QpOwotCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJfQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQlwcml2YXRlIElTdGF0dXMgY2hlY2tDaXJjdWxhcihBY3Rpdml0eSBhY3QpIHsKLQkJYm9vbGVhbiByZXN1bHQ7Ci0JCWlmIChEZXBlbmRlbmN5Q2hlY2tlci5uZXdDaGVja0FjdCkgewotCQkJcmVzdWx0ID0gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckZvck1vdmluZ1ZhcmlhYmlsaXR5RWxlbWVudAotCQkJCQkJCShhY3Rpdml0eSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChhY3QpLCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdCwgYWN0aXZpdHkpLmlzT0soKTsKLQkJfQotCQlpZighcmVzdWx0KSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmNpcmN1bGFyX2RlcGVuZGVuY3lfZXJyb3JfbXNnLAotCQkJCQludWxsKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCUlBY3Rpb25UeXBlUHJvdmlkZXIgYWN0aW9uVHlwZVByb3ZpZGVyID0gKElBY3Rpb25UeXBlUHJvdmlkZXIpIHZpZXdlcjsKLQkJaWYgKCB2aWV3ZXIgIT0gbnVsbCkgewotCQkJdmlld2VyID0gbnVsbDsKLQkJCWJvb2xlYW4gY2FuQ29weSA9IGNoZWNrQ29weSgpLmlzT0soKTsKLQkJCWJvb2xlYW4gY2FuRXh0ZW5kID0gY2hlY2tFeHRlbmQoKS5pc09LKCk7Ci0JCQlpbnRbXSBjaG9pY2VzID0gbmV3IGludFsxICsgKGNhbkNvcHkgPyAxIDogMCkgKyAoY2FuRXh0ZW5kID8gMSA6IDApXTsKLQkJCWludCBpID0gMDsKLQkJCWlmKGNhbkNvcHkpIHsKLQkJCQljaG9pY2VzW2krK10gPSBJQWN0aW9uVHlwZVByb3ZpZGVyLkNPUFk7Ci0JCQl9Ci0JCQlpZihjYW5FeHRlbmQpIHsKLQkJCQljaG9pY2VzW2krK10gPSBJQWN0aW9uVHlwZVByb3ZpZGVyLkVYVEVORDsKLQkJCX0KLQkJCWNob2ljZXNbaV0gPSBJQWN0aW9uVHlwZVByb3ZpZGVyLkRFRVBfQ09QWTsKLQkJCQotCQkJLy8gZGVsZWdhdGUgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNvbW1hbmQKLQkJCS8vCi0JCQlhY3Rpb25UeXBlUHJvdmlkZXIuZXhlY3V0ZSh0aGlzLCBjaG9pY2VzKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYWN0aXZpdHlIYW5kbGVyID0gbmV3IEFjdGl2aXR5SGFuZGxlcigpOwotCQl0cnkgewotCQkJaWYgKHR5cGUgPT0gSUFjdGlvblR5cGVQcm92aWRlci5ERUVQX0NPUFkpIHsKLQkJCQlkb0RlZXBDb3B5KCk7Ci0JCQl9IGVsc2UgewotCQkJCXN1cGVyLmV4ZWN1dGUoKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWFjdGl2aXR5SGFuZGxlci5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCWlmKFRuZ1V0aWwuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWN0aXZpdHlEcm9wQ29tbWFuZC5leGVjdXRlKCk6IGRvbmUiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvRGVlcENvcHkoKSB7Ci0JCWlmKCFVc2VySW50ZXJhY3Rpb25IZWxwZXIuY29uZmlybURlZXBDb3B5KGRyb3BFbGVtZW50cykpIHsKLQkJCXJldHVybjsKLQkJfQotCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZXBDb3B5Q29uZmlnID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRlZXBDb3B5Q29uZmlnID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNob29zZURlZXBDb3B5Q29uZmlndXJhdGlvbih0YXJnZXRQcm9jZXNzLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCX0KLQkJY2F0Y2goT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWFjdGl2aXR5SGFuZGxlci5zZXREZWVwQ29weUNvbmZpZyhkZWVwQ29weUNvbmZpZyk7Ci0JCWFjdGl2aXR5SGFuZGxlci5zZXRUYXJnZXRQcm9jZXNzKHRhcmdldFByb2Nlc3MpOwotCQkKLQkJLy8gU2V0IGEgY29uZmlndXJhdG9yIHRvIHJlc292bGUgYW5kIGRlZXAgY29weSBjb250cmlidXRvcnMgYW5kIHJlcGxhY2VycwotCQlhY3Rpdml0eUhhbmRsZXIuc2V0QWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcihhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKTsKLQkJCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJYWN0aXZpdHlIYW5kbGVyLnNldE1vbml0b3IobW9uaXRvcik7Ci0JCQkJcHJlRXhlY3V0ZWQgPSBwcmVFeGVjdXRlKCk7Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgZ2V0TGFiZWwoKSk7CQkJCi0JCWlmIChwcmVFeGVjdXRlZCkgewotCQkJcmVkbygpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNwcmVFeGVjdXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVFeGVjdXRlKCkgewotCQlpZiAoIXN1cGVyLnByZUV4ZWN1dGUoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyBwcm9jZXNzIHRoZSBzZWxlY3RlZCBhY3Rpdml0aWVzIGFuZCBkZWVwLWNvcHkgdGhlIHZhbGlkIG9uZXMKLQkJLy8KLQkJaWYgKGlzRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQlwYXR0ZXJucyA9IG5ldyBBcnJheUxpc3Q8Q2FwYWJpbGl0eVBhdHRlcm4+KCk7Ci0JCX0KLQkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRyb3BFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkJCS8vICYmIGVsZW1lbnQgIT0gdGFyZ2V0Ci0JCQkpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGVsZW1lbnQ7Ci0JCQkJCi0vLwkJCQlpZih0eXBlID09IElBY3Rpb25UeXBlUHJvdmlkZXIuREVFUF9DT1BZKSB7Ci0vLwkJCQkJYWN0aXZpdHlIYW5kbGVyLmRlZXBDb3B5KGFjdCk7Ci0vLwkJCQl9Ci0vLwkJCQllbHNlIHsKLS8vCQkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KTsKLS8vCQkJCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuICYmIHByb2MgIT0gdGFyZ2V0UHJvY2VzcykgewotLy8JCQkJCQlpZiAodHlwZSA9PSBJQWN0aW9uVHlwZVByb3ZpZGVyLkVYVEVORCkgewotLy8JCQkJCQkJYWN0aXZpdHlIYW5kbGVyLmV4dGVuZChhY3QpOwotLy8JCQkJCQkJaWYgKHBhdHRlcm5zICE9IG51bGwpCi0vLwkJCQkJCQkJcGF0dGVybnMuYWRkKHByb2MpOwotLy8JCQkJCQl9IGVsc2UgewotLy8JCQkJCQkJYWN0aXZpdHlIYW5kbGVyLmNvcHkoYWN0KTsKLS8vCQkJCQkJfQotLy8JCQkJCX0gZWxzZSB7Ci0vLwkJCQkJCWFjdGl2aXR5SGFuZGxlci5jb3B5KGFjdCk7Ci0vLwkJCQkJfQotLy8JCQkJfQotCQkJCQotCQkJCXN3aXRjaCh0eXBlKSB7Ci0JCQkJY2FzZSBJQWN0aW9uVHlwZVByb3ZpZGVyLkRFRVBfQ09QWToKLQkJCQkJYWN0aXZpdHlIYW5kbGVyLmRlZXBDb3B5KGVsZW1lbnQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElBY3Rpb25UeXBlUHJvdmlkZXIuRVhURU5EOgotCQkJCQlhY3Rpdml0eUhhbmRsZXIuZXh0ZW5kKGFjdCk7Ci0JCQkJCWlmIChwYXR0ZXJucyAhPSBudWxsKSB7Ci0JCQkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KTsKLQkJCQkJCWlmKHByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQkJCXBhdHRlcm5zLmFkZCgoQ2FwYWJpbGl0eVBhdHRlcm4pIHByb2MpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUFjdGlvblR5cGVQcm92aWRlci5DT1BZOgotCQkJCQlhY3Rpdml0eUhhbmRsZXIuY29weShhY3QpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlhcHBsaWVkQWN0aXZpdGllcyA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHk+KGFjdGl2aXR5SGFuZGxlci5nZXRBY3Rpdml0aWVzKCkpOwotCi0JCXJldHVybiAhYXBwbGllZEFjdGl2aXRpZXMuaXNFbXB0eSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZG9FeGVjdXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCUl0ZXJhdG9yPEFjdGl2aXR5PiBpdG9yID0gYXBwbGllZEFjdGl2aXRpZXMuaXRlcmF0b3IoKTsKLQotCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJd2hpbGUgKGl0b3IuaGFzTmV4dCgpKSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGl0b3IubmV4dCgpOwotCi0JCQlpZiAoYWN0LmVDb250YWluZXIoKSAhPSBudWxsCi0JCQkJCSYmIGFjdC5lQ29udGFpbmVyKCkuZUNvbnRhaW5lcigpICE9IHBrZykgewotCQkJCXBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKChNZXRob2RQYWNrYWdlKSBhY3QuZUNvbnRhaW5lcigpKTsKLQkJCX0KLQotCQkJaWYgKHBhdHRlcm5zICE9IG51bGwgJiYgIXBhdHRlcm5zLmlzRW1wdHkoKSkgewotCQkJCURlbGl2ZXJ5UHJvY2VzcyBwcm9jID0gKERlbGl2ZXJ5UHJvY2VzcykgdGFyZ2V0UHJvY2VzczsKLQkJCQlmb3IgKENhcGFiaWxpdHlQYXR0ZXJuIHBhdHRlcm4gOiBwYXR0ZXJucykgewotCQkJCQlpZiAoIXByb2MuZ2V0SW5jbHVkZXNQYXR0ZXJucygpLmNvbnRhaW5zKHBhdHRlcm4pKSB7Ci0JCQkJCQlwcm9jLmdldEluY2x1ZGVzUGF0dGVybnMoKS5hZGQocGF0dGVybik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJbG9uZyB0aW1lID0gMDsKLQkJaWYoVG5nVXRpbC5ERUJVRykgewotCQkJdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKGFwcGxpZWRBY3Rpdml0aWVzKTsKLQkJaWYoVG5nVXRpbC5ERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJBY3Rpdml0eURyb3BDb21tYW5kLmRvRXhlY3V0ZSgpOiBuZXcgYWN0aXZpdGllcyBhZGRlZC4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpKTsKLQkJfQotCQlpZighYWN0aXZpdHlIYW5kbGVyLmdldERlZXBDb3BpZXMoKS5pc0VtcHR5KCkpIHsKLQkJCWlmKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQl0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCQlwb3N0RGVlcENvcHkoKTsKLQkJCWlmKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFjdGl2aXR5RHJvcENvbW1hbmQuZG9FeGVjdXRlKCk6IHBvc3REZWVwQ29weSgpLiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkpOwotCQkJfQotCQl9Ci0KLQkJLy8gSGFjayB0byByZWZyZXNoIHByb3ZpZGVycyBmb3JjZWZ1bGx5IGJlZm9yZSBjYWxsaW5nIGZpeER1cGxpY2F0ZU5hbWVzCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoYWN0aXZpdHksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWFkYXB0ZXIuZ2V0Q2hpbGRyZW4oYWN0aXZpdHkpOwotCQkKLQkJLy8gZml4IGR1cGxpY2F0ZSBuYW1lcyBvZiBuZXdseSBhZGRlZCBlbGVtZW50cwotCQlmaXhEdXBsaWNhdGVOYW1lcygpOwotCQkKLQkJZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBwb3N0RGVlcENvcHkoKSB7Ci0JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGF0aW9uIG9mIHRoZSB0YXJnZXQgcHJvY2VzcyBhbnkgbWlzc2luZyBjb250ZW50Ci0JCQkJLy8KLQkJCQlpZihhZGRlZE9iamVjdHMgPT0gbnVsbCkgewotCQkJCQlhZGRlZE9iamVjdHMgPSBuZXcgSGFzaFNldCgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYWRkZWRPYmplY3RzLmNsZWFyKCk7Ci0JCQkJfQotCQkJCWJvb2xlYW4gZGVmYXVsdENvbmZpZ0NoYW5nZWQgPSBmYWxzZTsKLS8vCQkJCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uIG9uIGNoYW5nZSB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgdGFyZ2V0IHByb2Nlc3MgdG8gYXZvaWQgZXhjZXNzaXZlIFVJIHJlZnJlc2hlcwotLy8JCQkJLy8KLS8vCQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gdGFyZ2V0UHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpLmVEZWxpdmVyKCk7Ci0vLwkJCQl0YXJnZXRQcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkuZVNldERlbGl2ZXIoZmFsc2UpOwotLy8JCQkJdHJ5IHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpdml0eUhhbmRsZXIuZ2V0RGVlcENvcGllcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihpdGVyLm5leHQoKSkgewotCi0JCQkJCQkvKioKLQkJCQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkJCQkgKi8KLQkJCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJCXJldHVybiAoKEFjdGl2aXR5KW9iamVjdCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCQkJfQotCi0JCQkJCX07CQkJCQkKLQkJCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQlPYmplY3QgZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IFByb2Nlc3NVdGlsLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBlKTsKLQkJCQkJCQlpbnQgc2l6ZSA9IGFkZGVkT2JqZWN0cy5zaXplKCk7Ci0JCQkJCQkJUHJvY2Vzc1V0aWwuYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbih0YXJnZXRQcm9jZXNzLCBtZSwgYWRkZWRPYmplY3RzKTsKLQkJCQkJCQlpZighZGVmYXVsdENvbmZpZ0NoYW5nZWQgJiYgKHNpemUgIT0gYWRkZWRPYmplY3RzLnNpemUoKSkpIHsKLQkJCQkJCQkJZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5hZGQodGFyZ2V0UHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJZGVmYXVsdENvbmZpZ0NoYW5nZWQgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLS8vCQkJCX0KLS8vCQkJCWZpbmFsbHkgewotLy8JCQkJCXRhcmdldFByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKS5lU2V0RGVsaXZlcihvbGROb3RpZnkpOwotLy8JCQkJfQotCQkJfQotCQkJCi0JCX07Ci0JCQotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBnZXRMYWJlbCgpKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gZGVlcENvcHlDb25maWcgPSBhY3Rpdml0eUhhbmRsZXIuZ2V0RGVlcENvcHlDb25maWcoKTsJCQkKLQotCQlpZihkZWVwQ29weUNvbmZpZyAhPSBudWxsKSB7Ci0JCQkvLyBzeW5jaHJvbml6ZSB0aGUgZGVlcCBjb3BpZXMgd2l0aCBkZWVwIGNvcHkgY29uZmlndXJhdGlvbgkJCQkKLQkJCS8vCi0JCQlmaW5hbCBTeW5jaHJvbml6ZUNvbW1hbmQgc3luY2hDbWQgPSBuZXcgU3luY2hyb25pemVDb21tYW5kKGFjdGl2aXR5SGFuZGxlci5nZXREZWVwQ29waWVzKCksIGRlZXBDb3B5Q29uZmlnLCBudWxsLCBmYWxzZSk7Ci0JCQl0cnkgewotCQkJCXJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXN5bmNoQ21kLmluaXRpbGl6ZSgpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX07Ci0JCQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgTGlicmFyeUVkaXRSZXNvdXJjZXMuUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9wcmVwYXJlKTsKLQkJCQlpZihzeW5jaENtZC5pc0ludGlhbGl6ZWQoKSkgewotCQkJCQlzeW5jaENtZC5leGVjdXRlKCk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJc3luY2hDbWQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbigpIHsKLQkJcmV0dXJuIFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKHRhcmdldFByb2Nlc3MpOwotCX0KLQotCS8qKgotCSAqIEZpeGVzIGR1cGxpY2F0ZSBuYW1lcyBvZiBuZXdseSBhZGRlZCBlbGVtZW50cwotCSAqLwotCXByaXZhdGUgdm9pZCBmaXhEdXBsaWNhdGVOYW1lcygpIHsKLQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBnZXRTdXBwcmVzc2lvbigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhcHBsaWVkQWN0aXZpdGllcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgaXRlci5uZXh0KCk7Ci0JCQlmaXhEdXBsaWNhdGVOYW1lcyhhY3QsIHN1cHByZXNzaW9uKTsKLQkJCWZpeFRlYW1Qcm9maWxlRHVwbGljYXRlTmFtZXMoYWN0LCBzdXBwcmVzc2lvbik7Ci0JCX0JCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpeER1cGxpY2F0ZU5hbWVzKEJyZWFrZG93bkVsZW1lbnQgZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJZml4RHVwbGljYXRlTmFtZXMoZSwgc3VwcHJlc3Npb24sIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaXhEdXBsaWNhdGVOYW1lcyhCcmVha2Rvd25FbGVtZW50IGUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBlLmdldE5hbWUoKTsKLQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQnJlYWtkb3duRWxlbWVudE5hbWUoYWRhcHRlckZhY3RvcnksIGUsIGJhc2VOYW1lLCBzdXBwcmVzc2lvbikgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDE7IHRydWU7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gYmFzZU5hbWUgKyAnXycgKyBpOwotCQkJCWlmIChQcm9jZXNzVXRpbC5jaGVja0JyZWFrZG93bkVsZW1lbnROYW1lKGFkYXB0ZXJGYWN0b3J5LCBlLCBuYW1lLCBzdXBwcmVzc2lvbikgPT0gbnVsbCkgewotCQkJCQllLnNldE5hbWUobmFtZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQliYXNlTmFtZSA9IFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZSk7Ci0JCWlmIChQcm9jZXNzVXRpbC5jaGVja0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKGFkYXB0ZXJGYWN0b3J5LCBlLCBiYXNlTmFtZSwgc3VwcHJlc3Npb24pICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAxOyB0cnVlOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGJhc2VOYW1lICsgJ18nICsgaTsKLQkJCQlpZiAoUHJvY2Vzc1V0aWwuY2hlY2tCcmVha2Rvd25FbGVtZW50UHJlc2VudGF0aW9uTmFtZShhZGFwdGVyRmFjdG9yeSwgZSwgbmFtZSwgc3VwcHJlc3Npb24pID09IG51bGwpIHsKLQkJCQkJZS5zZXRQcmVzZW50YXRpb25OYW1lKG5hbWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CQkKLQkKLQlwcml2YXRlIHZvaWQgZml4VGVhbVByb2ZpbGVEdXBsaWNhdGVOYW1lcyhBY3Rpdml0eSBhY3QsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCWZvciAoaW50IGkgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5nZXQoaSk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQlmaXhEdXBsaWNhdGVOYW1lcygoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudCwgc3VwcHJlc3Npb24sIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJfQotCQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlmaXhUZWFtUHJvZmlsZUR1cGxpY2F0ZU5hbWVzKChBY3Rpdml0eSkgZWxlbWVudCwgc3VwcHJlc3Npb24pOwotCQkJfQotCQl9Ci0JfQotCQkKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZG9VbmRvKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VuZG8oKSB7Ci0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKGFwcGxpZWRBY3Rpdml0aWVzKTsKLQkJaWYgKGlzRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQlEZWxpdmVyeVByb2Nlc3MgcHJvYyA9IChEZWxpdmVyeVByb2Nlc3MpIHRhcmdldFByb2Nlc3M7Ci0JCQlwcm9jLmdldEluY2x1ZGVzUGF0dGVybnMoKS5jbGVhcigpOwotCQkJcHJvYy5nZXRJbmNsdWRlc1BhdHRlcm5zKCkuYWRkQWxsKG9sZFBhdHRlcm5zKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXROYW1lKExpc3Qgc2libGluZ3MsIEFjdGl2aXR5IGUpIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gZS5nZXROYW1lKCk7Ci0JCWlmICghaXNOYW1lVGFrZW4oc2libGluZ3MsIGUsIGJhc2VOYW1lKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGkgPSAxOyB0cnVlOyBpKyspIHsKLQkJCVN0cmluZyBuYW1lID0gYmFzZU5hbWUgKyAnXycgKyBpOwotCQkJaWYgKCFpc05hbWVUYWtlbihzaWJsaW5ncywgZSwgbmFtZSkpIHsKLQkJCQllLnNldE5hbWUobmFtZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRQcmVzZW50YXRpb25OYW1lKExpc3Qgc2libGluZ3MsIEFjdGl2aXR5IGUpIHsKLQkJLy8gaWYoZS5nZXRQcmVzZW50YXRpb25OYW1lKCkgIT0gbnVsbCAmJgotCQkvLyBlLmdldFByZXNlbnRhdGlvbk5hbWUoKS50cmltKCkubGVuZ3RoKCkgPiAwKSByZXR1cm47Ci0KLQkJU3RyaW5nIGJhc2VQcmVzZW50YXRpb25OYW1lID0gUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShlKTsKLQkJaWYgKCFpc1ByZXNlbnRhdGlvbk5hbWVUYWtlbihzaWJsaW5ncywgZSwgYmFzZVByZXNlbnRhdGlvbk5hbWUpKSB7Ci0JCQkvLyBlLnNldFByZXNlbnRhdGlvbk5hbWUoYmFzZVByZXNlbnRhdGlvbk5hbWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGkgPSAxOyB0cnVlOyBpKyspIHsKLQkJCVN0cmluZyBuYW1lID0gYmFzZVByZXNlbnRhdGlvbk5hbWUgKyAnXycgKyBpOwotCQkJaWYgKCFpc1ByZXNlbnRhdGlvbk5hbWVUYWtlbihzaWJsaW5ncywgZSwgbmFtZSkpIHsKLQkJCQllLnNldFByZXNlbnRhdGlvbk5hbWUobmFtZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05hbWVUYWtlbihMaXN0IHNpYmxpbmdzLCBEZXNjcmliYWJsZUVsZW1lbnQgZSwKLQkJCVN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSBzaWJsaW5ncy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJQnJlYWtkb3duRWxlbWVudCBzaWJsaW5nID0gKEJyZWFrZG93bkVsZW1lbnQpIHNpYmxpbmdzLmdldChpKTsKLQkJCS8vIGlmKHNpYmxpbmcgIT0gZSAmJiBuYW1lLmVxdWFscyhzaWJsaW5nLmdldFByZXNlbnRhdGlvbk5hbWUoKSkpIHsKLQkJCWlmIChzaWJsaW5nICE9IGUgJiYgbmFtZS5lcXVhbHMoc2libGluZy5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNQcmVzZW50YXRpb25OYW1lVGFrZW4oTGlzdCBzaWJsaW5ncywKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBlLCBTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gc2libGluZ3Muc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCUJyZWFrZG93bkVsZW1lbnQgc2libGluZyA9IChCcmVha2Rvd25FbGVtZW50KSBzaWJsaW5ncy5nZXQoaSk7Ci0JCQkvLyBpZihzaWJsaW5nICE9IGUgJiYgbmFtZS5lcXVhbHMoc2libGluZy5nZXRQcmVzZW50YXRpb25OYW1lKCkpKSB7Ci0JCQlpZiAoc2libGluZyAhPSBlCi0JCQkJCSYmIG5hbWUuZXF1YWxzKFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoc2libGluZykpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCWlmKGV4ZWN1dGVkKSB7Ci0JCQlyZXR1cm4gYXBwbGllZEFjdGl2aXRpZXM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldFJlc3VsdCgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248Pz4gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JcHVibGljIEFjdGl2aXR5SGFuZGxlciBnZXRBY3Rpdml0eUhhbmRsZXIoKSB7Ci0JCXJldHVybiBhY3Rpdml0eUhhbmRsZXI7Ci0JfQotCXB1YmxpYyBBY3Rpdml0eSBnZXRBY3Rpdml0eSgpewotCQlyZXR1cm4gYWN0aXZpdHk7Ci0JfQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKAotCQkJSUNvbmZpZ3VyYXRvciBhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKSB7Ci0JCXRoaXMuYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvciA9IGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3I7Ci0JfQotCQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlWYXJpYWJpbGl0eUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FjdGl2aXR5VmFyaWFiaWxpdHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDVmYjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlWYXJpYWJpbGl0eUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLQotLyoqCi0gKiBDb21tYW5kIHRvIHNldCB2YXJpYWJpbGl0eSBvbiB0aGUgYWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5VmFyaWFiaWxpdHlDb21tYW5kIGV4dGVuZHMgQWRkTWV0aG9kRWxlbWVudENvbW1hbmQgewotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgVmFyaWFiaWxpdHlFbGVtZW50IHZlOwotCi0JcHJpdmF0ZSBWYXJpYWJpbGl0eVR5cGUgdHlwZTsKLQotCXByaXZhdGUgTGlzdCBlbGVtZW50czsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwdWJsaWMgQWN0aXZpdHlWYXJpYWJpbGl0eUNvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwKLQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlLCBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcikgewotCi0JCXN1cGVyKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3Rpdml0eSkpOwotCi0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQkJdGhpcy52ZSA9IHZlOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLmNvbmZpZ3VyYXRvciA9IGNvbmZpZ3VyYXRvcjsKLQotCQllbGVtZW50cyA9IEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHsgdmUgfSk7Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCi0JCS8vIGFkZCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgbm90IHRoZXJlIGFscmVhZHkKLQkJaWYgKCFzdXBlci5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKGVsZW1lbnRzLCBjb25maWd1cmF0b3IpKQotCQkJcmV0dXJuOwotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJYWN0aXZpdHkuc2V0VmFyaWFiaWxpdHlUeXBlKHR5cGUpOwotCQlhY3Rpdml0eS5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KHZlKTsKLQotCQkKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmICghZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBiYXNpY2FsbHkgcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhbnl0aGluZyB3YXMgYWRkZWQKLQkJCXN1cGVyLnVuZG8oKTsKLQkJCWFjdGl2aXR5LnNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUuTkEpOwotCQkJYWN0aXZpdHkuc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChudWxsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWRkR3VpZGFuY2VUb0FjdGl2aXR5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWRkR3VpZGFuY2VUb0FjdGl2aXR5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWI1YTdlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FkZEd1aWRhbmNlVG9BY3Rpdml0eUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotCi0KLS8qKgotICogQ29tbWFuZCB0byBhZGQgZ3VpZGFuY2UgdG8gYWN0aXZpdHkKLSAqICAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRHdWlkYW5jZVRvQWN0aXZpdHlDb21tYW5kIGV4dGVuZHMgQWRkTWV0aG9kRWxlbWVudENvbW1hbmQgewotCi0JcHJpdmF0ZSBMaXN0IGd1aWRhbmNlczsKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwdWJsaWMgQWRkR3VpZGFuY2VUb0FjdGl2aXR5Q29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCBndWlkYW5jZXMpIHsKLQotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0aXZpdHkpKTsKLQotCQl0aGlzLmd1aWRhbmNlcyA9IGd1aWRhbmNlczsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQotCQkvLyBhZGQgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIG5vdCB0aGVyZSBhbHJlYWR5Ci0JCWlmICghc3VwZXIuYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihndWlkYW5jZXMpKQotCQkJcmV0dXJuOwotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJaWYgKCFndWlkYW5jZXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ3VpZGFuY2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBvYmo7Ci0KLQkJCQkJLy8gZ3VpZGFuY2VzIGZvciBjb250ZW50IGVsZW1lbnQKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJCWFjdGl2aXR5LmdldENoZWNrbGlzdHMoKS5hZGQoKENoZWNrbGlzdCkgaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJCWFjdGl2aXR5LmdldENvbmNlcHRzKCkuYWRkKChDb25jZXB0KSBpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQkJYWN0aXZpdHkuZ2V0RXhhbXBsZXMoKS5hZGQoKEV4YW1wbGUpIGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJCWFjdGl2aXR5LmdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5hZGQoKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQkJYWN0aXZpdHkuZ2V0R3VpZGVsaW5lcygpLmFkZCgoR3VpZGVsaW5lKSBpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQkJYWN0aXZpdHkuZ2V0UmV1c2FibGVBc3NldHMoKS5hZGQoKFJldXNhYmxlQXNzZXQpIGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSb2FkbWFwKSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRSb2FkbWFwcygpLmFkZCgoUm9hZG1hcCkgaXRlbSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJLmxvZ0Vycm9yKCJDYW50IHNldCBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKCFndWlkYW5jZXMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBiYXNpY2FsbHkgcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhbnl0aGluZyB3YXMgYWRkZWQKLQkJCXN1cGVyLnVuZG8oKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdCA9IGd1aWRhbmNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgb2JqOwotCi0JCQkJCS8vIGd1aWRhbmNlcyBmb3IgY29udGVudCBlbGVtZW50Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRDaGVja2xpc3RzKCkucmVtb3ZlKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRDb25jZXB0cygpLnJlbW92ZShpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQkJYWN0aXZpdHkuZ2V0RXhhbXBsZXMoKS5yZW1vdmUoaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQkJYWN0aXZpdHkuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLnJlbW92ZShpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRHdWlkZWxpbmVzKCkucmVtb3ZlKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRSZXVzYWJsZUFzc2V0cygpLnJlbW92ZShpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUm9hZG1hcCkgewotCQkJCQkJYWN0aXZpdHkuZ2V0Um9hZG1hcHMoKS5yZW1vdmUoaXRlbSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJLmxvZ0Vycm9yKCJDYW50IHNldCBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAoIWd1aWRhbmNlcy5pc0VtcHR5KCkgKSB7Ci0JCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJaWYgKGFjdGl2aXR5ICE9IG51bGwpIHsKLQkJCXJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7IGFjdGl2aXR5IH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BZGRHdWlkYW5jZVRvQnJlYWtkb3duRWxlbWVudENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FkZEd1aWRhbmNlVG9CcmVha2Rvd25FbGVtZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGYxMjU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FkZEd1aWRhbmNlVG9CcmVha2Rvd25FbGVtZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotCi0vKioKLSAqIENvbW1hbmQgdG8gYWRkIGd1aWRhbmNlIHRvIGJyZWFrZG93biBlbGVtZW50L2FjdGl2aXR5Ci0gKiAgCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuNQotICovCi1wdWJsaWMgY2xhc3MgQWRkR3VpZGFuY2VUb0JyZWFrZG93bkVsZW1lbnRDb21tYW5kIGV4dGVuZHMgQWRkTWV0aG9kRWxlbWVudENvbW1hbmQgewotCi0JcHJpdmF0ZSBMaXN0PEd1aWRhbmNlPiBndWlkYW5jZXM7Ci0KLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50OwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHVibGljIEFkZEd1aWRhbmNlVG9CcmVha2Rvd25FbGVtZW50Q29tbWFuZChCcmVha2Rvd25FbGVtZW50IGJyRWxlbWVudCwgTGlzdDxHdWlkYW5jZT4gZ3VpZGFuY2VzKSB7Ci0KLQkJc3VwZXIoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGJyRWxlbWVudCkpOwotCi0JCXRoaXMuZ3VpZGFuY2VzID0gZ3VpZGFuY2VzOwotCQl0aGlzLmJyRWxlbWVudCA9IGJyRWxlbWVudDsKLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0KLQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBub3QgdGhlcmUgYWxyZWFkeQotCQlpZiAoIXN1cGVyLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oZ3VpZGFuY2VzKSkKLQkJCXJldHVybjsKLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JCWlmICghZ3VpZGFuY2VzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGd1aWRhbmNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgb2JqOwotCi0JCQkJCS8vIGd1aWRhbmNlcyBmb3IgY29udGVudCBlbGVtZW50Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCQlickVsZW1lbnQuZ2V0Q2hlY2tsaXN0cygpLmFkZCgoQ2hlY2tsaXN0KSBpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQkJYnJFbGVtZW50LmdldENvbmNlcHRzKCkuYWRkKChDb25jZXB0KSBpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQkJYnJFbGVtZW50LmdldEV4YW1wbGVzKCkuYWRkKChFeGFtcGxlKSBpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCQlickVsZW1lbnQuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLmFkZCgoU3VwcG9ydGluZ01hdGVyaWFsKSBpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCQlickVsZW1lbnQuZ2V0R3VpZGVsaW5lcygpLmFkZCgoR3VpZGVsaW5lKSBpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQkJYnJFbGVtZW50LmdldFJldXNhYmxlQXNzZXRzKCkuYWRkKChSZXVzYWJsZUFzc2V0KSBpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUm9hZG1hcCkgewotCQkJCQkJaWYgKGJyRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJKChBY3Rpdml0eSkgYnJFbGVtZW50KS5nZXRSb2FkbWFwcygpLmFkZCgoUm9hZG1hcCkgaXRlbSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJLmxvZ0Vycm9yKCJDYW50IHNldCBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKCFndWlkYW5jZXMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBiYXNpY2FsbHkgcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhbnl0aGluZyB3YXMgYWRkZWQKLQkJCXN1cGVyLnVuZG8oKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdCA9IGd1aWRhbmNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgb2JqOwotCi0JCQkJCS8vIGd1aWRhbmNlcyBmb3IgY29udGVudCBlbGVtZW50Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCQlickVsZW1lbnQuZ2V0Q2hlY2tsaXN0cygpLnJlbW92ZShpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQkJYnJFbGVtZW50LmdldENvbmNlcHRzKCkucmVtb3ZlKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCQlickVsZW1lbnQuZ2V0RXhhbXBsZXMoKS5yZW1vdmUoaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQkJYnJFbGVtZW50LmdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5yZW1vdmUoaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQkJYnJFbGVtZW50LmdldEd1aWRlbGluZXMoKS5yZW1vdmUoaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJCWJyRWxlbWVudC5nZXRSZXVzYWJsZUFzc2V0cygpLnJlbW92ZShpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUm9hZG1hcCkgewotCQkJCQkJaWYgKGJyRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJKChBY3Rpdml0eSkgYnJFbGVtZW50KS5nZXRSb2FkbWFwcygpLnJlbW92ZSgoUm9hZG1hcCkgaXRlbSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJLmxvZ0Vycm9yKCJDYW50IHNldCBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAoIWd1aWRhbmNlcy5pc0VtcHR5KCkgKSB7Ci0JCQlpZiAoYnJFbGVtZW50LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoYnJFbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlpZiAoYnJFbGVtZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7IGJyRWxlbWVudCB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWRkTWV0aG9kRWxlbWVudENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FkZE1ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYzZhY2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWRkTWV0aG9kRWxlbWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0KLS8qKgotICogQmFzZSBDb21tYW5kIGZvciBhZGQgbWV0aG9kIGVsZW1lbnRzIHRvIGRlc2NyaXB0b3IuIAotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkTWV0aG9kRWxlbWVudENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJvdGVjdGVkIExpc3QgZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZzsKLQotCXByaXZhdGUgSGFzaFNldCBhZGRlZE9iamVjdHM7Ci0KLQlwcml2YXRlIFByb2Nlc3MgcHJvY2VzczsKLQotCXB1YmxpYyBBZGRNZXRob2RFbGVtZW50Q29tbWFuZChQcm9jZXNzIHByb2Nlc3MpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLnByb2Nlc3MgPSBwcm9jZXNzOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBhbmQgYWRkcyBlbGVtZW50cyB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHJldHVybiBmYWxzZSBpZiB1c2VyIGNhbmNlbGVkIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKExpc3QgZWxlbWVudHMpCi0JewotCQlyZXR1cm4gYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihlbGVtZW50cywgbnVsbCk7Ci0JfQotCQotCQotCS8qKgotCSAqIENoZWNrcyBhbmQgYWRkcyBlbGVtZW50cyB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHJldHVybiBmYWxzZSBpZiB1c2VyIGNhbmNlbGVkIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKExpc3QgZWxlbWVudHMsIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yKSB7Ci0JCWlmIChlbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnID09IG51bGwpIHsKLQkJCWVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQotCQkJCXN3aXRjaCAoVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrQWdhaW5zdERlZmF1bHRDb25maWd1cmF0aW9uKAotCQkJCQkJcHJvY2VzcywgZWxlbWVudCwgY29uZmlndXJhdG9yKSkgewotCQkJCWNhc2UgMDoKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOgotCQkJCQllbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnLmFkZChlbGVtZW50KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAtMToKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZy5pc0VtcHR5KCkpIHsKLQkJCQlhZGRlZE9iamVjdHMgPSBuZXcgSGFzaFNldCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQlQcm9jZXNzVXRpbC5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2Nlc3MsIGVsZW1lbnQsCi0JCQkJCQkJYWRkZWRPYmplY3RzKTsKLQkJCQl9Ci0JCQkJaWYgKCFhZGRlZE9iamVjdHMuaXNFbXB0eSgpKSB7Ci0JCQkJCWdldE1vZGlmaWVkUmVzb3VyY2VzKCkuYWRkKAotCQkJCQkJCXByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKS5lUmVzb3VyY2UoKSk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoYWRkZWRPYmplY3RzICE9IG51bGwgJiYgIWFkZGVkT2JqZWN0cy5pc0VtcHR5KCkpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gZGVmYXVsdENvbmZpZyA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZGVkT2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCWRlZmF1bHRDb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkucmVtb3ZlKGVsZW1lbnQpOwotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJZGVmYXVsdENvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkucmVtb3ZlKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BZGRSb2xlVG9UZWFtQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWRkUm9sZVRvVGVhbUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU0ZDZiNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BZGRSb2xlVG9UZWFtQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci0KLQotLyoqCi0gKiBDb21tYW5kIHRvIGFkZCByb2xlIHRvIHRlYW0gcHJvZmlsZQotICogIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFkZFJvbGVUb1RlYW1Db21tYW5kIGV4dGVuZHMgQWRkTWV0aG9kRWxlbWVudENvbW1hbmQgewotCi0JcHJpdmF0ZSBMaXN0IHJvbGVzOwotCi0JcHJpdmF0ZSBMaXN0IHJvbGVEZXNjTGlzdDsKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIFRlYW1Qcm9maWxlIHRlYW07Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIExpc3QgZXhpc3RpbmdSb2xlRGVzY0xpc3Q7Ci0KLQlwdWJsaWMgQWRkUm9sZVRvVGVhbUNvbW1hbmQoVGVhbVByb2ZpbGUgdGVhbSwgTGlzdCByb2xlcykgewotCi0JCXN1cGVyKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyh0ZWFtKSk7Ci0KLQkJdGhpcy5yb2xlcyA9IHJvbGVzOwotCQl0aGlzLnRlYW0gPSB0ZWFtOwotCi0JCXRoaXMuYWN0aXZpdHkgPSAoQWN0aXZpdHkpIFByb2Nlc3NVdGlsLmdldFBhcmVudEFjdGl2aXR5T2ZUZWFtKHRlYW0pOwotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQotCQkvLyBhZGQgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIG5vdCB0aGVyZSBhbHJlYWR5Ci0JCWlmICghc3VwZXIuYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihyb2xlcykpCi0JCQlyZXR1cm47Ci0KLQkJcm9sZURlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSByb2xlcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gUHJvY2Vzc1V0aWwKLQkJCQkJLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKChSb2xlKSBpdG9yLm5leHQoKSk7Ci0JCQlyb2xlRGVzY0xpc3QuYWRkKHJvbGVEZXNjKTsKLQkJfQotCi0JCS8vIGF1dG9tYXRpYyBhc3NpZ25tZW50Ci0JCWV4aXN0aW5nUm9sZURlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlQcm9jZXNzVXRpbC5nZXRSb2xlRGVzY3JpcHRvcihUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBhY3Rpdml0eSwKLQkJCQlleGlzdGluZ1JvbGVEZXNjTGlzdCwgcm9sZXMpOwotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJaWYgKCFyb2xlRGVzY0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSByb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5hZGQoKFJvbGVEZXNjcmlwdG9yKSBpdG9yLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWV4aXN0aW5nUm9sZURlc2NMaXN0LmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gZXhpc3RpbmdSb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkuYWRkKChSb2xlRGVzY3JpcHRvcikgaXRvci5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmICghcm9sZURlc2NMaXN0LmlzRW1wdHkoKSkgewotCQkJLy8gYmFzaWNhbGx5IHJlbW92ZSBmcm9tIGNvbmZpZ3VyYXRpb24gaWYgYW55dGhpbmcgd2FzIGFkZGVkCi0JCQlzdXBlci51bmRvKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSByb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5yZW1vdmUoKFJvbGVEZXNjcmlwdG9yKSBpdG9yLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFleGlzdGluZ1JvbGVEZXNjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGV4aXN0aW5nUm9sZURlc2NMaXN0Lml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQl0ZWFtLmdldFRlYW1Sb2xlcygpLnJlbW92ZSgoUm9sZURlc2NyaXB0b3IpIGl0b3IubmV4dCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCi0JCWlmIChyb2xlcyAhPSBudWxsICYmICFyb2xlcy5pc0VtcHR5KCkpIHsKLQkJCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJCWlmICh0ZWFtLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQodGVhbS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJaWYgKHJvbGVEZXNjTGlzdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcm9sZURlc2NMaXN0OwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25QcmltYXJ5UGVyZm9ybWVyVG9UYXNrRGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduUHJpbWFyeVBlcmZvcm1lclRvVGFza0Rlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVhOWZlMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25QcmltYXJ5UGVyZm9ybWVyVG9UYXNrRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLQotCi0vKioKLSAqIAotICogQ29tbWFuZCB0byBhc3NpZ24gcHJpbWFyeSBwZXJmb3JtZXIgdG8gdGFzayBkZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NpZ25QcmltYXJ5UGVyZm9ybWVyVG9UYXNrRGVzY3JpcHRvciBleHRlbmRzCi0JCUFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQlwcml2YXRlIFJvbGVEZXNjcmlwdG9yIG5ld1JvbGVEZXNjID0gbnVsbDsKLQotCXByaXZhdGUgUm9sZURlc2NyaXB0b3Igb2xkUm9sZURlc2MgPSBudWxsOwotCi0JcHJpdmF0ZSBSb2xlIHJvbGU7Ci0KLQlwcml2YXRlIExpc3Qgcm9sZXM7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBUYXNrRGVzY3JpcHRvciB0YXNrRGVzYzsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCS8vIHByaXZhdGUgYm9vbGVhbiBkZXNjRXhpc3RzID0gZmFsc2U7Ci0KLQlwcml2YXRlIFRlYW1Qcm9maWxlIHRlYW07Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzTmV3Um9sZURlc2NyaXB0b3IgPSBmYWxzZTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBc3NpZ25QcmltYXJ5UGVyZm9ybWVyVG9UYXNrRGVzY3JpcHRvcihUYXNrRGVzY3JpcHRvciB0YXNrRGVzYywKLQkJCVJvbGUgcm9sZSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJc3VwZXIoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHRhc2tEZXNjKSk7Ci0KLQkJdGhpcy5yb2xlID0gcm9sZTsKLQkJdGhpcy50YXNrRGVzYyA9IHRhc2tEZXNjOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQotCQlyb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcm9sZXMuYWRkKHJvbGUpOwotCi0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCXRhc2tEZXNjLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQodGFza0Rlc2MpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXRoaXMuYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkJfQotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOyAKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIGFkZCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgbm90IHRoZXJlIGFscmVhZHkKLQkJaWYgKCFzdXBlci5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKHJvbGVzKSkKLQkJCXJldHVybjsKLQotCQlpZiAoIXJvbGVzLmlzRW1wdHkoKSkgewotCQkJaXNOZXdSb2xlRGVzY3JpcHRvciA9IGZhbHNlOwotCQkJLy8gY2hlY2sgZm9yIGxvY2FsIGRlc2NyaXB0b3IKLQkJCW5ld1JvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0RGVzY3JpcHRvcigKLQkJCQkJcm9sZSwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQlpZiAobmV3Um9sZURlc2MgPT0gbnVsbCkgewotCQkJCS8vIGNoZWNrIGZvciBpbmhlcml0ZWQgZGVzY3JpcHRvcgotCQkJCW5ld1JvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJCS5nZXRJbmhlcml0ZWREZXNjcmlwdG9yKHJvbGUsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCWlmIChuZXdSb2xlRGVzYyA9PSBudWxsKSB7Ci0KLQkJCQkJbmV3Um9sZURlc2MgPSBQcm9jZXNzVXRpbC5jcmVhdGVSb2xlRGVzY3JpcHRvcihyb2xlKTsKLQkJCQkJaXNOZXdSb2xlRGVzY3JpcHRvciA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBnZXQgdGVhbQotCQkJdGVhbSA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRUZWFtKGFjdGl2aXR5LCByb2xlKTsKLQotCQkJcmVkbygpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JCXRhc2tEZXNjLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkuYWRkKG5ld1JvbGVEZXNjKTsKLQotCQlpZiAoaXNOZXdSb2xlRGVzY3JpcHRvcikgewotCQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQobmV3Um9sZURlc2MpOwotCQl9Ci0KLQkJaWYgKHRlYW0gIT0gbnVsbCkgewotCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5hZGQobmV3Um9sZURlc2MpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQotCQlpZiAoIXJvbGVzLmlzRW1wdHkoKSkgewotCQkJLy8gcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhZGRlZAotCQkJc3VwZXIudW5kbygpOwotCi0JCQl0YXNrRGVzYy5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpLnJlbW92ZShuZXdSb2xlRGVzYyk7Ci0KLQkJCWlmIChpc05ld1JvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmUobmV3Um9sZURlc2MpOwotCQkJfQotCQkJaWYgKHRlYW0gIT0gbnVsbCkgewotCQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkucmVtb3ZlKG5ld1JvbGVEZXNjKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCi0JCWlmIChyb2xlICE9IG51bGwpIHsKLQkJCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJCWlmICh0YXNrRGVzYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHRhc2tEZXNjLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYmExYjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci0KLQotLyoqCi0gKiBDb21tYW5kIGZvciBhc3NpZ24gcm9sZXMgdG8gdGFzayBkZXNjcmlwdG9yLiBJdCB3aWxsIGFzc2lnbiBwcmltYXJ5LCBhZGRpdGlvbmFsCi0gKiBwZXJmb3JtZXJzIGFuZCBhc3Npc3RlZCBieSB0byBhIHRhc2sgZGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3IgZXh0ZW5kcyBBZGRNZXRob2RFbGVtZW50Q29tbWFuZCB7Ci0KLQlwcml2YXRlIExpc3Qgcm9sZXM7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBUYXNrRGVzY3JpcHRvciB0YXNrRGVzYzsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgaW50IGFjdGlvbjsKLQotCUxpc3QgZXhpc3RpbmdSb2xlRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlMaXN0IG5ld1JvbGVEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCXByaXZhdGUgYm9vbGVhbiBpc05ld1JvbGVEZXNjcmlwdG9yID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBBc3NpZ24gcm9sZSB0byB0YXNrIGRlc2NyaXB0b3IgVXNlZCBmb3IgYm90aCBhZGRpdGlvbmFsbHkgcGVyZm9ybWVkIGJ5Ci0JICogYW5kIGFzc2lzdGVkIGJ5Ci0JICovCi0JcHVibGljIEFzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yKFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjLCBMaXN0IHJvbGVzLAotCQkJaW50IGFjdGlvbiwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3ModGFza0Rlc2MpKTsKLQotCQl0aGlzLnJvbGVzID0gcm9sZXM7Ci0JCXRoaXMudGFza0Rlc2MgPSB0YXNrRGVzYzsKLQkJdGhpcy5hY3Rpb24gPSBhY3Rpb247Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCi0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCXRhc2tEZXNjLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQodGFza0Rlc2MpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXRoaXMuYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkJfQotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCi0JCS8vIGFkZCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgbm90IHRoZXJlIGFscmVhZHkKLQkJaWYgKCFzdXBlci5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKHJvbGVzKSkKLQkJCXJldHVybjsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm9sZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJLy8gYm9vbGVhbiBkZXNjRXhpc3RzID0gZmFsc2U7Ci0JCQlSb2xlIHJvbGUgPSAoUm9sZSkgaXQubmV4dCgpOwotCi0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IG51bGw7Ci0JCQlpc05ld1JvbGVEZXNjcmlwdG9yID0gZmFsc2U7Ci0JCQkvLyBjaGVjayBmb3IgbG9jYWwgZGVzY3JpcHRvcgotCQkJcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbC5nZXREZXNjcmlwdG9yKHJvbGUsCi0JCQkJCWFjdGl2aXR5LCBjb25maWcpOwotCQkJaWYgKHJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkvLyBjaGVjayBmb3IgaW5oZXJpdGVkIGRlc2NyaXB0b3IKLQkJCQlyb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsCi0JCQkJCQkuZ2V0SW5oZXJpdGVkRGVzY3JpcHRvcihyb2xlLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQlpZiAocm9sZURlc2MgPT0gbnVsbCkgewotCQkJCQlyb2xlRGVzYyA9IFByb2Nlc3NVdGlsLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKHJvbGUpOwotCQkJCQlpc05ld1JvbGVEZXNjcmlwdG9yID0gdHJ1ZTsKLQotCQkJCX0KLQkJCX0KLQkJCWlmIChpc05ld1JvbGVEZXNjcmlwdG9yKQotCQkJCW5ld1JvbGVEZXNjTGlzdC5hZGQocm9sZURlc2MpOwotCQkJZWxzZQotCQkJCWV4aXN0aW5nUm9sZURlc2NMaXN0LmFkZChyb2xlRGVzYyk7Ci0KLQkJCS8vIGdldCB0ZWFtCi0JCQlUZWFtUHJvZmlsZSB0ZWFtID0gVXNlckludGVyYWN0aW9uSGVscGVyLmdldFRlYW0oYWN0aXZpdHksIHJvbGUpOwotCQkJaWYgKHRlYW0gIT0gbnVsbCkgewotCQkJCW1hcC5wdXQocm9sZURlc2MsIHRlYW0pOwotCQkJfQotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCQlpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9QUklNQVJZX1BFUkZPUk1FUikgewotCQkJdGFza0Rlc2MuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKS5hZGRBbGwoZXhpc3RpbmdSb2xlRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKS5hZGRBbGwobmV3Um9sZURlc2NMaXN0KTsKLQkJfSBlbHNlIGlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0FERElUSU9OQUxfUEVSRk9STUVSKSB7Ci0JCQl0YXNrRGVzYy5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmFkZEFsbChleGlzdGluZ1JvbGVEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmFkZEFsbChuZXdSb2xlRGVzY0xpc3QpOwotCQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfQVNTSVNURURfQlkpIHsKLQkJCXRhc2tEZXNjLmdldEFzc2lzdGVkQnkoKS5hZGRBbGwoZXhpc3RpbmdSb2xlRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0QXNzaXN0ZWRCeSgpLmFkZEFsbChuZXdSb2xlRGVzY0xpc3QpOwotCQl9Ci0KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwobmV3Um9sZURlc2NMaXN0KTsKLQotCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCVNldCBrZXlzZXQgPSBtYXAua2V5U2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBrZXlzZXQuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGtleSA9IGl0b3IubmV4dCgpOwotCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIG1hcC5nZXQoa2V5KTsKLQotCQkJCS8vIGFkZCB0byB0ZWFtCi0JCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5hZGQoKFJvbGVEZXNjcmlwdG9yKSBrZXkpOwotCQkJfQotCQl9Ci0KLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQotCQkvLyBiYXNpY2FsbHkgcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhbnl0aGluZyB3YXMgYWRkZWQKLQkJc3VwZXIudW5kbygpOwotCi0JCWlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0FERElUSU9OQUxfUEVSRk9STUVSKSB7Ci0JCQl0YXNrRGVzYy5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpLnJlbW92ZUFsbCgKLQkJCQkJZXhpc3RpbmdSb2xlRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKS5yZW1vdmVBbGwobmV3Um9sZURlc2NMaXN0KTsKLQkJfSBlbHNlCWlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0FERElUSU9OQUxfUEVSRk9STUVSKSB7Ci0JCQl0YXNrRGVzYy5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLnJlbW92ZUFsbCgKLQkJCQkJZXhpc3RpbmdSb2xlRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5yZW1vdmVBbGwobmV3Um9sZURlc2NMaXN0KTsKLQkJfSBlbHNlIGlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0FTU0lTVEVEX0JZKSB7Ci0JCQl0YXNrRGVzYy5nZXRBc3Npc3RlZEJ5KCkucmVtb3ZlQWxsKGV4aXN0aW5nUm9sZURlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldEFzc2lzdGVkQnkoKS5yZW1vdmVBbGwobmV3Um9sZURlc2NMaXN0KTsKLQkJfQotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbChuZXdSb2xlRGVzY0xpc3QpOwotCi0JCWlmIChtYXAgIT0gbnVsbCkgewotCQkJU2V0IGtleXNldCA9IG1hcC5rZXlTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGtleXNldC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qga2V5ID0gaXRvci5uZXh0KCk7Ci0JCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgbWFwLmdldChrZXkpOwotCi0JCQkJLy8gcmVtb3ZlIGl0IGZyb20gdGVhbQotCQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkucmVtb3ZlKChSb2xlRGVzY3JpcHRvcikga2V5KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCi0JCWlmIChyb2xlcyAhPSBudWxsICYmICFyb2xlcy5pc0VtcHR5KCkpIHsKLQkJCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJCWlmICh0YXNrRGVzYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHRhc2tEZXNjLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25XUFRvRGVsaXZlcmFibGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnbldQVG9EZWxpdmVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmU2NDUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnbldQVG9EZWxpdmVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogCi0gKiBDb21tYW5kIHRvIGFzc2lnbiBkZWxpdmVyYWJsZSBwYXJ0cyB0byB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXNzaWduV1BUb0RlbGl2ZXJhYmxlIGV4dGVuZHMgQWRkTWV0aG9kRWxlbWVudENvbW1hbmQgewotCi0JcHJpdmF0ZSBMaXN0IHdvcmtQcm9kdWN0czsKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2M7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCUxpc3QgZXhpc3RpbmdXUERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JTGlzdCBuZXdXUERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEFzc2lnbldQVG9EZWxpdmVyYWJsZShXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjLCBMaXN0IHdvcmtQcm9kdWN0cykgewotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Mod3BEZXNjKSk7Ci0KLQkJdGhpcy53b3JrUHJvZHVjdHMgPSB3b3JrUHJvZHVjdHM7Ci0JCXRoaXMud3BEZXNjID0gd3BEZXNjOwotCi0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnRBY3Rpdml0eSh3cERlc2MpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXRoaXMuYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkJfQotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCi0JfQotCi0JLyoqCi0JICogR2V0IHBhcmVudCBhY3Rpdml0eSBmb3IgYnJlYWtkb3duZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBickVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0UGFyZW50QWN0aXZpdHkoQnJlYWtkb3duRWxlbWVudCBickVsZW1lbnQpIHsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoYnJFbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlickVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50OwotCQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChickVsZW1lbnQsCi0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0KLQkJTGlzdCBicmVha2Rvd25FbGVtZW50cyA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0KLQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBub3QgdGhlcmUgYWxyZWFkeQotCQlpZiAoIXN1cGVyLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24od29ya1Byb2R1Y3RzKSkKLQkJCXJldHVybjsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gd29ya1Byb2R1Y3RzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWJvb2xlYW4gZGVzY0V4aXN0cyA9IGZhbHNlOwotCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIGl0Lm5leHQoKTsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBuZXdXcERlc2MgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBicmVha2Rvd25FbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBicmVha2Rvd25FbGVtZW50cwotCQkJCQkJLmdldChpKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQluZXdXcERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJCQlXb3JrUHJvZHVjdCBlbGVtZW50V1AgPSBuZXdXcERlc2MuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQkJaWYgKHdwLmVxdWFscyhlbGVtZW50V1ApKSB7Ci0JCQkJCQkvLyBpZiBmb3VuZCB1bmRlciB0aGUgcGFyZW50IGFjdGl2aXR5LCByZXR1cm4gdGhhdAotCQkJCQkJLy8gd3BkZXNjcmlwdG9yCi0JCQkJCQlkZXNjRXhpc3RzID0gdHJ1ZTsKLQotCQkJCQkJZXhpc3RpbmdXUERlc2NMaXN0LmFkZChlbGVtZW50KTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0KLQkJCWlmICghZGVzY0V4aXN0cykgewotCQkJCW5ld1dQRGVzY0xpc3QuYWRkKFByb2Nlc3NVdGlsLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3cCkpOwotCQkJfQotCi0JCQkvLyBnZXQgZGVsaXZlcmFibGUKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxpdmVyYWJsZSA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkuZ2V0RGVsaXZlcmFibGUoYWN0aXZpdHksIHdwKTsKLQkJCWlmIChkZWxpdmVyYWJsZSAhPSBudWxsKSB7Ci0JCQkJbWFwLnB1dChuZXdXcERlc2MsIGRlbGl2ZXJhYmxlKTsKLQkJCX0KLQkJfQotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGRBbGwoZXhpc3RpbmdXUERlc2NMaXN0KTsKLQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGRBbGwobmV3V1BEZXNjTGlzdCk7Ci0KLQkJLy8gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwobmV3V1BEZXNjTGlzdCk7Ci0KLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQotCQkvLyBiYXNpY2FsbHkgcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhbnl0aGluZyB3YXMgYWRkZWQKLQkJc3VwZXIudW5kbygpOwotCi0JCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkucmVtb3ZlQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkucmVtb3ZlQWxsKG5ld1dQRGVzY0xpc3QpOwotCi0JCS8vIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKG5ld1dQRGVzY0xpc3QpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAod29ya1Byb2R1Y3RzICE9IG51bGwgJiYgICF3b3JrUHJvZHVjdHMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCQlpZiAod3BEZXNjLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQod3BEZXNjLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduV1BUb1JvbGVEZXNjcmlwdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25XUFRvUm9sZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRkNTY0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25XUFRvUm9sZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBDb21tYW5kIHRvIGFzc2lnbiB3b3JrIHByb2R1Y3RzIHRvIHJvbGUgZGVzY3JpcHRvcnMuIEl0IHdpbGwgc2V0IHJlcG9uc2libGUKLSAqIHJvbGUgZmVhdHVyZS4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFzc2lnbldQVG9Sb2xlRGVzY3JpcHRvciBleHRlbmRzIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQotCXByaXZhdGUgTGlzdCB3b3JrUHJvZHVjdHM7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBSb2xlRGVzY3JpcHRvciByb2xlRGVzYzsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBpbnQgYWN0aW9uOwotCi0JTGlzdCBleGlzdGluZ1dQRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlMaXN0IG5ld1dQRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEFzc2lnbldQVG9Sb2xlRGVzY3JpcHRvcihSb2xlRGVzY3JpcHRvciByb2xlRGVzYywgTGlzdCB3b3JrUHJvZHVjdHMsCi0JCQlpbnQgYWN0aW9uLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCi0JCXN1cGVyKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyhyb2xlRGVzYykpOwotCi0JCXRoaXMud29ya1Byb2R1Y3RzID0gd29ya1Byb2R1Y3RzOwotCQl0aGlzLnJvbGVEZXNjID0gcm9sZURlc2M7Ci0JCXRoaXMuYWN0aW9uID0gYWN0aW9uOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQlyb2xlRGVzYywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHJvbGVEZXNjKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQl0aGlzLmFjdGl2aXR5ID0gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JCX0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkvLyBhZGQgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIG5vdCB0aGVyZSBhbHJlYWR5Ci0JCWlmICghc3VwZXIuYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbih3b3JrUHJvZHVjdHMpKQotCQkJcmV0dXJuOwotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSB3b3JrUHJvZHVjdHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIGl0Lm5leHQoKTsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBuZXdXcERlc2MgPSBudWxsOwotCi0JCQlib29sZWFuIGlzTmV3RGVzY3JpcHRvciA9IGZhbHNlOwotCQkJLy8gY2hlY2sgZm9yIGxvY2FsIGRlc2NyaXB0b3IKLQkJCW5ld1dwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbAotCQkJCQkuZ2V0RGVzY3JpcHRvcih3cCwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQlpZiAobmV3V3BEZXNjID09IG51bGwpIHsKLQkJCQkvLyBjaGVjayBmb3IgaW5oZXJpdGVkIGRlc2NyaXB0b3IKLQkJCQluZXdXcERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJCS5nZXRJbmhlcml0ZWREZXNjcmlwdG9yKHdwLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQlpZiAobmV3V3BEZXNjID09IG51bGwpIHsKLQkJCQkJbmV3V3BEZXNjID0gUHJvY2Vzc1V0aWwuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKHdwKTsKLQkJCQkJaXNOZXdEZXNjcmlwdG9yID0gdHJ1ZTsKLQotCQkJCX0KLQkJCX0KLQkJCWlmIChpc05ld0Rlc2NyaXB0b3IpCi0JCQkJbmV3V1BEZXNjTGlzdC5hZGQobmV3V3BEZXNjKTsKLQkJCWVsc2UKLQkJCQlleGlzdGluZ1dQRGVzY0xpc3QuYWRkKG5ld1dwRGVzYyk7Ci0KLQkJCS8vIGdldCBkZWxpdmVyYWJsZQotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlbGl2ZXJhYmxlID0gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCS5nZXREZWxpdmVyYWJsZShhY3Rpdml0eSwgd3ApOwotCQkJaWYgKGRlbGl2ZXJhYmxlICE9IG51bGwpIHsKLQkJCQltYXAucHV0KG5ld1dwRGVzYywgZGVsaXZlcmFibGUpOwotCQkJfQotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCQlpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9SRVNQT05TSUJMRV9GT1IpIHsKLQkJCXJvbGVEZXNjLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCQlyb2xlRGVzYy5nZXRSZXNwb25zaWJsZUZvcigpLmFkZEFsbChuZXdXUERlc2NMaXN0KTsKLQkJfQotCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKG5ld1dQRGVzY0xpc3QpOwotCi0JCWlmIChtYXAgIT0gbnVsbCkgewotCQkJU2V0IGtleXNldCA9IG1hcC5rZXlTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGtleXNldC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qga2V5ID0gaXRvci5uZXh0KCk7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG1hcAotCQkJCQkJLmdldChrZXkpOwotCi0JCQkJLy8gYWRkIHRvIGRlbGl2ZXJhYmxlCi0JCQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGQoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikga2V5KTsKLQkJCX0KLQkJfQotCi0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQkJLy8gcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhbnl0aGluZyB3YXMgYWRkZWQKLQkJc3VwZXIudW5kbygpOwotCi0JCWlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX1JFU1BPTlNJQkxFX0ZPUikgewotCQkJcm9sZURlc2MuZ2V0UmVzcG9uc2libGVGb3IoKS5yZW1vdmVBbGwoZXhpc3RpbmdXUERlc2NMaXN0KTsKLQkJCXJvbGVEZXNjLmdldFJlc3BvbnNpYmxlRm9yKCkucmVtb3ZlQWxsKG5ld1dQRGVzY0xpc3QpOwotCQl9Ci0KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwobmV3V1BEZXNjTGlzdCk7Ci0KLQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQlTZXQga2V5c2V0ID0gbWFwLmtleVNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0ga2V5c2V0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBrZXkgPSBpdG9yLm5leHQoKTsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgbWFwCi0JCQkJCQkuZ2V0KGtleSk7Ci0KLQkJCQkvLyByZW1vdmUgaXQgZnJvbSBkZWxpdmVyYWJsZQotCQkJCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkKLQkJCQkJCS5yZW1vdmUoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikga2V5KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAod29ya1Byb2R1Y3RzICE9IG51bGwgJiYgICF3b3JrUHJvZHVjdHMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCQlpZiAocm9sZURlc2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyb2xlRGVzYy5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnbldQVG9UYXNrRGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMzg5ZGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQ29tbWFuZCB0byBhc3NpZ24gd29yayBwcm9kdWN0cyB0byB0YXNrIGRlc2NyaXB0b3IuIEl0IHdpbGwgc2V0IGV4dGVybmFsCi0gKiBpbnB1dHMsIG1hbmRhdG9yeSBpbnB1dHMsIG9wdGlvbmFsIGlucHV0cyBhbmQgb3V0cHV0cy4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFzc2lnbldQVG9UYXNrRGVzY3JpcHRvciBleHRlbmRzIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQotCXByaXZhdGUgTGlzdCB3b3JrUHJvZHVjdHM7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBUYXNrRGVzY3JpcHRvciB0YXNrRGVzYzsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgaW50IGFjdGlvbjsKLQotCXByaXZhdGUgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JTGlzdCBleGlzdGluZ1dQRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlMaXN0IG5ld1dQRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEFzc2lnbldQVG9UYXNrRGVzY3JpcHRvcihUYXNrRGVzY3JpcHRvciB0YXNrRGVzYywgTGlzdCB3b3JrUHJvZHVjdHMsCi0JCQlpbnQgYWN0aW9uLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3ModGFza0Rlc2MpKTsKLQotCQl0aGlzLndvcmtQcm9kdWN0cyA9IHdvcmtQcm9kdWN0czsKLQkJdGhpcy50YXNrRGVzYyA9IHRhc2tEZXNjOwotCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0KLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJdGFza0Rlc2MsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudCh0YXNrRGVzYyk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJdGhpcy5hY3Rpdml0eSA9IChBY3Rpdml0eSkgcGFyZW50OwotCQl9Ci0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBub3QgdGhlcmUgYWxyZWFkeQotCQlpZiAoIXN1cGVyLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24od29ya1Byb2R1Y3RzKSkKLQkJCXJldHVybjsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gd29ya1Byb2R1Y3RzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBpdC5uZXh0KCk7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmV3V3BEZXNjID0gbnVsbDsKLQotCQkJYm9vbGVhbiBpc05ld0Rlc2NyaXB0b3IgPSBmYWxzZTsKLQkJCS8vIGNoZWNrIGZvciBsb2NhbCBkZXNjcmlwdG9yCi0JCQluZXdXcERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJLmdldERlc2NyaXB0b3Iod3AsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJaWYgKG5ld1dwRGVzYyA9PSBudWxsKSB7Ci0JCQkJLy8gY2hlY2sgZm9yIGluaGVyaXRlZCBkZXNjcmlwdG9yCi0JCQkJbmV3V3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsCi0JCQkJCQkuZ2V0SW5oZXJpdGVkRGVzY3JpcHRvcih3cCwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJaWYgKG5ld1dwRGVzYyA9PSBudWxsKSB7Ci0JCQkJCW5ld1dwRGVzYyA9IFByb2Nlc3NVdGlsLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3cCk7Ci0JCQkJCWlzTmV3RGVzY3JpcHRvciA9IHRydWU7Ci0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXNOZXdEZXNjcmlwdG9yKQotCQkJCW5ld1dQRGVzY0xpc3QuYWRkKG5ld1dwRGVzYyk7Ci0JCQllbHNlCi0JCQkJZXhpc3RpbmdXUERlc2NMaXN0LmFkZChuZXdXcERlc2MpOwotCi0JCQkvLyBnZXQgZGVsaXZlcmFibGUKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxpdmVyYWJsZSA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkuZ2V0RGVsaXZlcmFibGUoYWN0aXZpdHksIHdwKTsKLQkJCWlmIChkZWxpdmVyYWJsZSAhPSBudWxsKSB7Ci0JCQkJbWFwLnB1dChuZXdXcERlc2MsIGRlbGl2ZXJhYmxlKTsKLQkJCX0KLQkJfQotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfRVhURVJOQUxfSU5QVVQpIHsKLQkJCXRhc2tEZXNjLmdldEV4dGVybmFsSW5wdXQoKS5hZGRBbGwoZXhpc3RpbmdXUERlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldEV4dGVybmFsSW5wdXQoKS5hZGRBbGwobmV3V1BEZXNjTGlzdCk7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9NQU5EQVRPUllfSU5QVVQpIHsKLQkJCXRhc2tEZXNjLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZEFsbChuZXdXUERlc2NMaXN0KTsKLQkJfSBlbHNlIGlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX09QVElPTkFMX0lOUFVUKSB7Ci0JCQl0YXNrRGVzYy5nZXRPcHRpb25hbElucHV0KCkuYWRkQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRPcHRpb25hbElucHV0KCkuYWRkQWxsKG5ld1dQRGVzY0xpc3QpOwotCQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfT1VUUFVUKSB7Ci0JCQl0YXNrRGVzYy5nZXRPdXRwdXQoKS5hZGRBbGwoZXhpc3RpbmdXUERlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldE91dHB1dCgpLmFkZEFsbChuZXdXUERlc2NMaXN0KTsKLQkJfQotCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKG5ld1dQRGVzY0xpc3QpOwotCi0JCWlmIChtYXAgIT0gbnVsbCkgewotCQkJU2V0IGtleXNldCA9IG1hcC5rZXlTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGtleXNldC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qga2V5ID0gaXRvci5uZXh0KCk7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG1hcAotCQkJCQkJLmdldChrZXkpOwotCi0JCQkJLy8gYWRkIHRvIGRlbGl2ZXJhYmxlCi0JCQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGQoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikga2V5KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQkJLy8gcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhbnl0aGluZyB3YXMgYWRkZWQKLQkJc3VwZXIudW5kbygpOwotCi0JCWlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0VYVEVSTkFMX0lOUFVUKSB7Ci0JCQl0YXNrRGVzYy5nZXRFeHRlcm5hbElucHV0KCkucmVtb3ZlQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRFeHRlcm5hbElucHV0KCkucmVtb3ZlQWxsKG5ld1dQRGVzY0xpc3QpOwotCQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfTUFOREFUT1JZX0lOUFVUKSB7Ci0JCQl0YXNrRGVzYy5nZXRNYW5kYXRvcnlJbnB1dCgpLnJlbW92ZUFsbChleGlzdGluZ1dQRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0TWFuZGF0b3J5SW5wdXQoKS5yZW1vdmVBbGwobmV3V1BEZXNjTGlzdCk7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9PUFRJT05BTF9JTlBVVCkgewotCQkJdGFza0Rlc2MuZ2V0T3B0aW9uYWxJbnB1dCgpLnJlbW92ZUFsbChleGlzdGluZ1dQRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0T3B0aW9uYWxJbnB1dCgpLnJlbW92ZUFsbChuZXdXUERlc2NMaXN0KTsKLQkJfSBlbHNlIGlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX09VVFBVVCkgewotCQkJdGFza0Rlc2MuZ2V0T3V0cHV0KCkucmVtb3ZlQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRPdXRwdXQoKS5yZW1vdmVBbGwobmV3V1BEZXNjTGlzdCk7Ci0JCX0KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwobmV3V1BEZXNjTGlzdCk7Ci0KLQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQlTZXQga2V5c2V0ID0gbWFwLmtleVNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0ga2V5c2V0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBrZXkgPSBpdG9yLm5leHQoKTsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgbWFwCi0JCQkJCQkuZ2V0KGtleSk7Ci0KLQkJCQkvLyByZW1vdmUgaXQgZnJvbSBkZWxpdmVyYWJsZQotCQkJCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkKLQkJCQkJCS5yZW1vdmUoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikga2V5KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAod29ya1Byb2R1Y3RzICE9IG51bGwgJiYgICF3b3JrUHJvZHVjdHMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCQlpZiAodGFza0Rlc2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZCh0YXNrRGVzYy5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0JTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9CU0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjY3ZWZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0JTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5JZGVudGl0eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuUmVzb3VyY2VBd2FyZURyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0KLS8qKgotICogQWJzdHJhY3QgZHJhZyBhbmQgZHJvcCBjb21tYW5kIGZvciBwcm9jZXNzIGF1dGhvcmluZwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJTRHJhZ0FuZERyb3BDb21tYW5kIGV4dGVuZHMgUmVzb3VyY2VBd2FyZURyYWdBbmREcm9wQ29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHBhcmFtIG9wZXJhdGlvbnMKLQkgKiBAcGFyYW0gb3BlcmF0aW9uCi0JICogQHBhcmFtIGNvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQlNEcmFnQW5kRHJvcENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIE9iamVjdCBvd25lciwKLQkJCWZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGRvbWFpbiwgb3duZXIsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmVEcm9wQ29weU9uKCkgewotCQlyZXR1cm4gcHJlcGFyZURyb3BMaW5rT24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlRHJvcExpbmtPbigpIHsKLQkJZHJhZ0NvbW1hbmQgPSBJZGVudGl0eUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCWRyb3BDb21tYW5kID0gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQXJyYXlMaXN0IGFjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0JCQlpZiAoVG5nVXRpbC5pc0xvY2tlZCgoRU9iamVjdCkgb3duZXIpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChhY2NlcHQoZSkpIHsKLQkJCQlsaXN0LmFkZChlKTsKLQkJCX0KLQkJCS8vIGVsc2UgaWYob2JqIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJLy8gLy8gZGlzYWxsb3cgZHJvcCBhIHByb2Nlc3MgYXMgYW4gYWN0aXZpdHkKLQkJCS8vIH0KLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSAmJiBvd25lciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWN0aXZpdHkgdGFyZ2V0ID0gKEFjdGl2aXR5KSBvd25lcjsKLQkJCQlpZiAoRGVwZW5kZW5jeUNoZWNrZXIubmV3Q2hlY2tBY3QpIHsKLQkJCQkJaWYgKCEgRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckZvck1vdmluZ1ZhcmlhYmlsaXR5RWxlbWVudAotCQkJCQkJCSh0YXJnZXQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZSksIHRydWUpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0JCQkJCQotCQkJCX0gZWxzZSBpZiAoIURlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KChBY3Rpdml0eSkgZSwgdGFyZ2V0KS5pc09LKCkpewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotLy8JCQkJUHJvY2VzcyBzcmNQcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBvYmopOwotLy8JCQkJUHJvY2VzcyB0YXJnZXRQcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHRhcmdldCk7Ci0vLwotLy8JCQkJaWYgKCEoc3JjUHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcyAmJiB0YXJnZXRQcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pKSB7Ci0vLwkJCQkJYWN0TGlzdC5hZGQob2JqKTsKLS8vCQkJCX0KLQkJCQkKLQkJCQkvLyBubyBtb3JlIGNoZWNrIHRvIHByZXZlbnQgYXBwbHlpbmcgYW4gYWN0aXZpdHkgb2YgYSBkZWxpdmVyeSBwcm9jZXNzIG9udG8gYSBjYXBhYmlsaXR5IHBhdHRlcgotCQkJCS8vIHNpbmNlIGludHJvZHVjdGlvbiBvZiBkZWVwLWNvcHkuIERlZXAgY29weSBjYW4gYWx3YXlzIGJlIGFwcGxpZWQgcmVnYXJkbGVzcyBvZiBzb3VyY2UgYW5kIHRhcmdldAotCQkJCS8vIHByb2Nlc3Nlcy4KLQkJCQkvLwotCQkJCWFjdExpc3QuYWRkKG9iaik7Ci0JCQl9Ci0JCX0KLQotCQlib29sZWFuIHJlc3VsdDsKLQkJaWYgKGxpc3QuaXNFbXB0eSgpICYmIGFjdExpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCUNvbXBvdW5kQ29tbWFuZCBjbWQgPSBuZXcgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZCgpOwotCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCWNtZC5hcHBlbmQoY3JlYXRlRHJvcENvbW1hbmQob3duZXIsIGxpc3QpKTsKLQkJCX0KLQkJCWlmICghYWN0TGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlpZiAob3duZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkJCQkJY21kLmFwcGVuZChuZXcgQWN0aXZpdHlEcm9wQ29tbWFuZCgoQWN0aXZpdHkpIG93bmVyLCBhY3RMaXN0LAotCQkJCQkJZ2V0VGFyZ2V0Vmlld2VyKCksICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKWRvbWFpbikuZ2V0QWRhcHRlckZhY3RvcnkoKSkpOwotCQkJfQotCQkJZHJvcENvbW1hbmQgPSBjbWQ7Ci0JCQlyZXN1bHQgPSBkcm9wQ29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFRhcmdldFZpZXdlcigpIHsKLQkJaWYgKGRvbWFpbiBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBvd25lcik7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9ICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBkb21haW4pCi0JCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJcmV0dXJuIFVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLmdldFZpZXdlcihhZGFwdGVyRmFjdG9yeSwgcHJvYyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5EcmFnQW5kRHJvcENvbW1hbmQjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBkcm9wQ29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKTsJCQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwgTGlzdCBkcm9wU3JjKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQlNEcm9wQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQlNEcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDNmYjkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0JTRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0aW9uQXBwbGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5CYXRjaENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklOZXN0ZWRDb21tYW5kUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTmVzdGVkQ29tbWFuZEV4Y2VjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBEcm9wQ29tbWFuZCBjbGFzcyBmb3IgYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3IKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJTRHJvcENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gREVGQVVMVF9TWU5DSF9GRUFUVVJFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChuZXcgSGFzaFNldDxFU3RydWN0dXJhbEZlYXR1cmU+KEFycmF5cy5hc0xpc3QoCi0JCQluZXcgRVN0cnVjdHVyYWxGZWF0dXJlW10gewotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCksCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCksCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfU3RlcHMoKSwJCQkJCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKQotCQkJfQotCSkpKTsKLQkKLQkvKioKLQkgKiBNYXAgb2YgbGlua2VkIGVsZW1lbnQncyBmZWF0dXJlIHRvIGRlc2NyaXB0b3IncyBmZWF0dXJlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBFU3RydWN0dXJhbEZlYXR1cmU+IEZFQVRVUkVfTUFQID0gbmV3IEhhc2hNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBFU3RydWN0dXJhbEZlYXR1cmU+KCk7Ci0Jc3RhdGljIHsKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpKTsKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCkpOwotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCkpOwotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19TdGVwcygpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCkpOwotLy8JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFc3RpbWF0ZWRNZXRob2RFbGVtZW50X0VzdGltYXRlKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVzdGltYXRlZE1ldGhvZEVsZW1lbnRfRXN0aW1hdGUoKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpOwotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcm90ZWN0ZWQgTGlzdDxPYmplY3Q+IGRyb3BFbGVtZW50czsKLQkKLQlwcm90ZWN0ZWQgTGlzdDxPYmplY3Q+IHVud3JhcHBlZERyb3BFbGVtZW50czsKLQotCXByaXZhdGUgU2V0PFJlc291cmNlPiBtb2RpZmllZFJlc291cmNlczsKLQotCXByb3RlY3RlZCBMaXN0PE9iamVjdD4gZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZzsKLQotCXByb3RlY3RlZCBTZXQ8T2JqZWN0PiBhZGRlZE9iamVjdHM7Ci0KLQlwcml2YXRlIFByb2Nlc3MgcHJvY2VzczsKLQotCXByaXZhdGUgYm9vbGVhbiBhZGRlZFRvRGVmYXVsdENvbmZpZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3luY2hyb25pemUgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBBcnJheUxpc3Q8VGFza0Rlc2NyaXB0b3I+IHRhc2tEZXNjTGlzdDsKLQotCXByb3RlY3RlZCBBcnJheUxpc3Q8RGVzY3JpcHRvcj4gdGFza0Rlc2NyaXB0b3JzVG9VcGRhdGU7Ci0KLS8vCXByb3RlY3RlZCBTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2g7Ci0KLQkvKioKLQkgKiBNYXAgb2YgZGVzY3JpcHRvciB0byBvbGQgcmVmcmVzaGFibGUgZmVhdHVyZSBtYXAKLQkgKi8KLQlwcml2YXRlIE1hcDxEZXNjcmlwdG9yLCBNYXA8PywgPz4+IGRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXA7Ci0KLQkvKioKLQkgKiBNYXAgb2YgZGVzY3JpcHRvciB0byBtYXAgb2YgZmVhdHVyZSB0byBuZXcgdmFsdWVzCi0JICovCi0vLwlwcm90ZWN0ZWQgTWFwIGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXA7Ci0vLwlwcml2YXRlIEhhc2hNYXAgZGVzY3JpcHRvclRvT2xkRmVhdHVyZVZhbHVlc01hcDsJCi0JcHJvdGVjdGVkIERlc2NyaXB0b3JVcGRhdGVCYXRjaENvbW1hbmQgYmF0Y2hDb21tYW5kOwotCi0vLwlwcml2YXRlIEhhc2hNYXAgd3BkVG9PbGRSZXNwb25zaWJsZVJvbGVNYXA7Ci0KLQkvKioKLQkgKiBNYXAgb2YgVGFza0Rlc2NyaXB0b3IgdG8gbGlzdCBvZiBuZXdseSBhZGRlZCBzdGVwcwotCSAqLwotCXByaXZhdGUgTWFwIHRhc2tEZXNjVG9OZXdTdGVwc01hcDsKLQotCXByaXZhdGUgTWFwIHRhc2tEZXNjVG9PbGRFc3RpbWF0ZU1hcDsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5jZWxlZDsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQlwcm90ZWN0ZWQgU2V0IHN5bmNoRmVhdHVyZXMgPSBERUZBVUxUX1NZTkNIX0ZFQVRVUkVTOwotCi0JcHJpdmF0ZSBCYXRjaENvbW1hbmQgcmVmcmVzaFJlc3BvbnNpYmxlRm9yQ29tbWFuZDsKLQotCXByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVkOwotCi0vLwlwcm90ZWN0ZWQgT2JqZWN0IFVJQ29udGV4dDsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBydW5Bc0pvYjsKLQkKLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLQotCXByaXZhdGUgaW50IHdvcmtlZFVuaXRzOwotCi0JcHJpdmF0ZSBOZXN0ZWRDb21tYW5kRXhjZWN1dG9yIG5lc3RlZENvbW1hbmRFeGNlY3V0b3I7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogICAgICAgICAgICB0aGUgYWN0aXZpdHkgdGhhdCB0aGUgZ2l2ZW4gZWxlbWVudHMgYXJlIGRyb3BwZWQgb24KLQkgKiBAcGFyYW0gZHJvcEVsZW1lbnRzCi0JICogICAgICAgICAgICB0aGUgZWxlbWVudHMgdG8gZHJvcCBvbiB0aGUgZ2l2ZW4gYWN0aXZpdHkKLQkgKi8KLQlwdWJsaWMgQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdDxPYmplY3Q+IGRyb3BFbGVtZW50cykgewotCQl0aGlzKGFjdGl2aXR5LCBkcm9wRWxlbWVudHMsIG51bGwsIG51bGwsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3luY2gKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIHRoZSBjb21tYW5kIHdpbGwgY2xlYW4gdGhlIGNvbnRlbnQgYW5kIHJlbGF0aW9uc2hpcHMKLQkgKiAgICAgICAgICAgIG9mIGV4aXN0aW5nIGRlc2NyaXB0b3JzIGFuZCByZWZyZXNoIHRoZW0gd2l0aCB0aGUgbGlua2VkCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIEJTRHJvcENvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIExpc3Q8T2JqZWN0PiBkcm9wRWxlbWVudHMsIGJvb2xlYW4gc3luY2gpIHsKLQkJdGhpcyhhY3Rpdml0eSwgZHJvcEVsZW1lbnRzLCBudWxsLCBudWxsLCBzeW5jaCk7Ci0JfQotCi0JLyoqCi0JICogU3luY2hyb25pemUgdGhlIGdpdmVuIGNvbnRlbnQgZWxlbWVudHMgdG8gaXRzIFRhc2tEZXNjcmlwdG9ycyBpbiB0aGUKLQkgKiBnaXZlbiBhY3Rpdml0eSB1c2luZyB0aGUgZ2l2ZW4gTWV0aG9kQ29uZmlndXJhdGlvbiBhbmQgbGlzdCBvZgotCSAqIHN5bmNocm9uaXphYmxlIGZlYXR1cmVzLgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBkcm9wRWxlbWVudHMKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50cyB0byBzeW5jaHJvbml6ZQotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gc3luY2hGZWF0dXJlcwotCSAqICAgICAgICAgICAgdGhlIHN5bmNocm9uaXphYmxlIGZlYXR1cmVzLCBpZiA8Y29kZT5udWxsPC9jb2RlPiB0aGUgREVGQVVMVF9TWU5DSF9GRUFUVVJFUyB3aWxsIGJlIHVzZWQuCi0JICovCi0JcHVibGljIEJTRHJvcENvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIExpc3Q8T2JqZWN0PiBkcm9wRWxlbWVudHMsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU2V0IHN5bmNoRmVhdHVyZXMpIHsKLQkJdGhpcyhhY3Rpdml0eSwgZHJvcEVsZW1lbnRzLCBjb25maWcsIHN5bmNoRmVhdHVyZXMsIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdDxPYmplY3Q+IGRyb3BFbGVtZW50cywKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTZXQgc3luY2hGZWF0dXJlcywgYm9vbGVhbiBzeW5jaCkgewotCQlzdXBlcigpOwotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JCXByb2Nlc3MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0aXZpdHkpOwotCQl0aGlzLnN5bmNocm9uaXplID0gc3luY2g7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQlpZiAoc3luY2hGZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQl0aGlzLnN5bmNoRmVhdHVyZXMgPSBERUZBVUxUX1NZTkNIX0ZFQVRVUkVTOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5zeW5jaEZlYXR1cmVzID0gc3luY2hGZWF0dXJlczsKLQkJfQotCQkKLQkJdGhpcy5kcm9wRWxlbWVudHMgPSBkcm9wRWxlbWVudHM7Ci0JCW5lc3RlZENvbW1hbmRFeGNlY3V0b3IgPSBjcmVhdGVOZXN0ZWRDb21tYW5kRXhjZWN1dG9yKCk7Ci0JfQotCQotCXByb3RlY3RlZCBOZXN0ZWRDb21tYW5kRXhjZWN1dG9yIGNyZWF0ZU5lc3RlZENvbW1hbmRFeGNlY3V0b3IoKSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkQ29tbWFuZEV4Y2VjdXRvcih0aGlzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGVOZXN0ZWRDb21tYW5kcygpIHsKLQkJCQlpZih0YXNrRGVzY0xpc3QgIT0gbnVsbCAmJiAhdGFza0Rlc2NMaXN0LmlzRW1wdHkoKSkgewotCQkJCQlMaXN0IG5lc3RlZENvbW1hbmRQcm92aWRlcnMgPSBFeHRlbnNpb25NYW5hZ2VyCi0JCQkJCS5nZXROZXN0ZWRDb21tYW5kUHJvdmlkZXJzKCk7Ci0JCQkJCWlmICghbmVzdGVkQ29tbWFuZFByb3ZpZGVycy5pc0VtcHR5KCkpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5lc3RlZENvbW1hbmRQcm92aWRlcnMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlJTmVzdGVkQ29tbWFuZFByb3ZpZGVyIGNtZFByb3ZpZGVyID0gKElOZXN0ZWRDb21tYW5kUHJvdmlkZXIpIGl0ZXIKLQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCUNvbW1hbmQgY21kID0gY21kUHJvdmlkZXIuY3JlYXRlUmVsYXRlZE9iamVjdHMoCi0JCQkJCQkJCQkJdGFza0Rlc2NMaXN0LCBCU0Ryb3BDb21tYW5kLnRoaXMpOwotCQkJCQkJCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgewotCQkJCQkJCQkJY21kLmV4ZWN1dGUoKTsKLQkJCQkJCQkJCWdldE5lc3RlZENvbW1hbmRzKCkuYWRkKGNtZCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJLmxvZ0Vycm9yKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCXN1cGVyLmV4ZWN1dGVOZXN0ZWRDb21tYW5kcygpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCWlmKG1vbml0b3IgPT0gbnVsbCkgewotCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIG1vbml0b3I7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHByZXBhcmVEcm9wRWxlbWVudHMoKSB7CQkKLQkJQXJyYXlMaXN0PE9iamVjdD4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQl1bndyYXBwZWREcm9wRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJZm9yIChPYmplY3QgbyA6IGRyb3BFbGVtZW50cykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvKTsKLQkJCWVsZW1lbnQgPSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5yZXNvbHZlKGVsZW1lbnQsIGNvbmZpZyk7Ci0JCQlpZiAoIWVsZW1lbnRzLmNvbnRhaW5zKGVsZW1lbnQpCi0JCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QgJiYgKChFT2JqZWN0KSBlbGVtZW50KQotCQkJCQkJCS5lSXNQcm94eSgpKSkgewkJCQkKLQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJdW53cmFwcGVkRHJvcEVsZW1lbnRzLmFkZChvKTsKLQkJCX0KLQkJfQotCQlkcm9wRWxlbWVudHMgPSBlbGVtZW50czsKLQl9Ci0JCi0vLwkvKioKLS8vCSAqIFNldHMgVUkgY29udGV4dCBmb3IgdGhpcyBjb21tYW5kLCB0aGlzIGNhbiBiZSBhIFNoZWxsIG9iamVjdAotLy8JICogQHBhcmFtIFVJQ29udGV4dAotLy8JICovCi0vLwlwdWJsaWMgdm9pZCBzZXRVSUNvbnRleHQoT2JqZWN0IFVJQ29udGV4dCkgewotLy8JCXRoaXMuVUlDb250ZXh0ID0gVUlDb250ZXh0OwotLy8JfQotCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJaWYoY29uZmlnID09IG51bGwpIHsKLQkJCWNvbmZpZyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3Rpdml0eSkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJfQotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZHJvcEVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWRyb3BFbGVtZW50cy5jbGVhcigpOwotCQl9Ci0JCWlmKHVud3JhcHBlZERyb3BFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQl1bndyYXBwZWREcm9wRWxlbWVudHMuY2xlYXIoKTsKLQkJfQotCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJfQotCQlpZiAoZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZyAhPSBudWxsKSB7Ci0JCQllbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKGFkZGVkT2JqZWN0cyAhPSBudWxsKSB7Ci0JCQlhZGRlZE9iamVjdHMuY2xlYXIoKTsKLQkJfQotCQlpZiAoZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcCAhPSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHRhc2tEZXNjTGlzdCAhPSBudWxsKSB7Ci0JCQl0YXNrRGVzY0xpc3QuY2xlYXIoKTsKLQkJfQotCQlpZiAodGFza0Rlc2NUb05ld1N0ZXBzTWFwICE9IG51bGwpIHsKLQkJCXRhc2tEZXNjVG9OZXdTdGVwc01hcC5jbGVhcigpOwotCQl9Ci0JCWlmICh0YXNrRGVzY1RvT2xkRXN0aW1hdGVNYXAgIT0gbnVsbCkgewotCQkJdGFza0Rlc2NUb09sZEVzdGltYXRlTWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHJlZnJlc2hSZXNwb25zaWJsZUZvckNvbW1hbmQgIT0gbnVsbCkgewotCQkJcmVmcmVzaFJlc3BvbnNpYmxlRm9yQ29tbWFuZC5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKHRhc2tEZXNjcmlwdG9yc1RvVXBkYXRlICE9IG51bGwpIHsKLQkJCXRhc2tEZXNjcmlwdG9yc1RvVXBkYXRlLmNsZWFyKCk7Ci0JCX0KLQkJaWYoYmF0Y2hDb21tYW5kICE9IG51bGwpIHsKLQkJCWJhdGNoQ29tbWFuZC5kaXNwb3NlKCk7Ci0JCX0KLQkJYWN0aXZpdHkgPSBwcm9jZXNzID0gbnVsbDsKLQkJaWYobmVzdGVkQ29tbWFuZEV4Y2VjdXRvciAhPSBudWxsKSB7Ci0JCQluZXN0ZWRDb21tYW5kRXhjZWN1dG9yLmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQkKLQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkQWxsKG5lc3RlZENvbW1hbmRFeGNlY3V0b3IuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSk7Ci0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIENsZWFycyBhbGwgdGhlIHJlZnJlc2hhYmxlIGZlYXR1cmVzIG9mIHRoZSBnaXZlbiBkZXNjcmlwdG9yCi0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2xlYXJEZXNjcmlwdG9yKERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlTZXQgZXhjbHVkZVN5bmNoRmVhdHVyZXMgPSBuZXcgSGFzaFNldChERUZBVUxUX1NZTkNIX0ZFQVRVUkVTKTsKLQkJZXhjbHVkZVN5bmNoRmVhdHVyZXMucmVtb3ZlQWxsKHN5bmNoRmVhdHVyZXMpOwotCQlTZXQgZXhjbHVkZUZlYXR1cmVzOwotCQlpZiAoZXhjbHVkZVN5bmNoRmVhdHVyZXMuaXNFbXB0eSgpKSB7Ci0JCQlleGNsdWRlRmVhdHVyZXMgPSBleGNsdWRlU3luY2hGZWF0dXJlczsKLQkJfQotCQllbHNlIHsKLQkJCWV4Y2x1ZGVGZWF0dXJlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBleGNsdWRlU3luY2hGZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldERlc2NyaXB0b3JGZWF0dXJlKChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIubmV4dCgpKTsKLQkJCQlpZihmZWF0dXJlICE9IG51bGwpIHsKLQkJCQkJZXhjbHVkZUZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYm9vbGVhbiByZXQgPSBQcm9jZXNzQ29tbWFuZFV0aWwuY2xlYXJEZXNjcmlwdG9yKGRlc2NyaXB0b3IsCi0JCQkJZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcCwgZXhjbHVkZUZlYXR1cmVzKTsKLQkJaWYgKHJldCAmJiBkZXNjcmlwdG9yIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCWlmICh0YXNrRGVzY3JpcHRvcnNUb1VwZGF0ZSA9PSBudWxsKSB7Ci0JCQkJdGFza0Rlc2NyaXB0b3JzVG9VcGRhdGUgPSBuZXcgQXJyYXlMaXN0PERlc2NyaXB0b3I+KCk7Ci0JCQl9Ci0JCQl0YXNrRGVzY3JpcHRvcnNUb1VwZGF0ZS5hZGQoZGVzY3JpcHRvcik7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RGVzY3JpcHRvckZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGxpbmtlZEVsZW1lbnRGZWF0dXJlKSB7Ci0JCXJldHVybiAoRVN0cnVjdHVyYWxGZWF0dXJlKSBGRUFUVVJFX01BUC5nZXQobGlua2VkRWxlbWVudEZlYXR1cmUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVFeGVjdXRlKCkgewotCQlwcmVwYXJlRHJvcEVsZW1lbnRzKCk7Ci0JCQotCQlib29sZWFuIGIgPSAhZHJvcEVsZW1lbnRzLmlzRW1wdHkoKTsKLQkJaWYgKGIpIHsKLS8vCQkJZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQliYXRjaENvbW1hbmQgPSBuZXcgRGVzY3JpcHRvclVwZGF0ZUJhdGNoQ29tbWFuZChmYWxzZSwgc3luY2hGZWF0dXJlcywgY29uZmlnKTsgLy9UT0RPOiB3aHkgY2xlYXIgbXVzdCBiZSBmYWxzZSA/Pz8KLQotLy8JCQlpZiAoc3luY2hyb25pemUpIHsKLS8vCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoID0gbmV3IEhhc2hTZXQoKTsKLS8vCQkJfQotCQl9Ci0JCXJldHVybiBiOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb2xsZWN0RWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZygpIHsKLQkJaWYgKGVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcgPT0gbnVsbCkgewotCQkJZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZHJvcEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJc3dpdGNoIChVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tBZ2FpbnN0RGVmYXVsdENvbmZpZ3VyYXRpb24oCi0JCQkJCQlwcm9jZXNzLCBlbGVtZW50KSkgewotCQkJCWNhc2UgMDoKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOgotCQkJCQllbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnLmFkZChlbGVtZW50KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAtMToKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGVsZW1lbnRzIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgZGVmYXVsdCBjb25maWd1cmF0aW9uIGhhcyBiZWVuIG1vZGlmaWVkLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbigpIHsKLQkJaWYgKCFhZGRlZFRvRGVmYXVsdENvbmZpZyAmJiBlbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnICE9IG51bGwgJiYgIWVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcuaXNFbXB0eSgpKSB7Ci0JCQlpZihhZGRlZE9iamVjdHMgPT0gbnVsbCkgewotCQkJCWFkZGVkT2JqZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhZGRlZE9iamVjdHMuY2xlYXIoKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcuaXRlcmF0b3IoKTsgaXRlcgotCQkJLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJUHJvY2Vzc1V0aWwuYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jZXNzLCBlbGVtZW50LAotCQkJCQkJYWRkZWRPYmplY3RzKTsKLQkJCX0KLQkJCWlmICghYWRkZWRPYmplY3RzLmlzRW1wdHkoKSkgewotCQkJCWdldE1vZGlmaWVkUmVzb3VyY2VzKCkuYWRkKAotCQkJCQkJcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpLmVSZXNvdXJjZSgpKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWFkZGVkVG9EZWZhdWx0Q29uZmlnID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgZ2V0VG90YWxXb3JrKCkgewotCQlyZXR1cm4gMjA7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHdvcmtlZChpbnQgdW5pdHNPZldvcmspIHsKLQkJbW9uaXRvci53b3JrZWQodW5pdHNPZldvcmspOwotCQl3b3JrZWRVbml0cyA9IHdvcmtlZFVuaXRzICsgdW5pdHNPZldvcms7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgZ2V0UmVtYWluaW5nV29yaygpIHsKLQkJaW50IHJlbWFpbmluZyA9IGdldFRvdGFsV29yaygpIC0gd29ya2VkVW5pdHM7Ci0JCWlmKHJlbWFpbmluZyA8IDApIHsKLQkJCXJlbWFpbmluZyA9IDA7Ci0JCX0KLQkJcmV0dXJuIHJlbWFpbmluZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVEZWZhdWx0Q29uZmlndXJhdGlvbk5lZWRlZCgpIHsKLQkJcmV0dXJuICFzeW5jaHJvbml6ZTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewkJCi0JCS8vIEJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCS8vCQkJCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLy8gY2FuY2VsZWQgPSAhYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbigpOwotCQkvLyB9Ci0JCS8vCQkJCi0JCS8vIH0pOwotCQkvLwkJCi0JCS8vIC8vVE9ETzogVGhpcyBjYXVzZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gb3IgVGhyZWFkQWNjZXNzRXJyb3Igd2hlbgotCQkvLyBzaG93aW5nIHNlbGVjdGlvbiBkaWFsb2cgaXMgbmVlZGVkCi0JCS8vIC8vCi0JCS8vIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCS8vCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cwotCQkvLyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCS8vIGNhbmNlbGVkID0gIXByZUV4ZWN1dGUoKTsKLQkJLy8gfQotCQkvLwkJCQotCQkvLyB9OwotCQkvLyBVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBudWxsKTsKLQkJLy8JCQotCQkvLyBpZighY2FuY2VsZWQpIHsKLQkJLy8gQnVzeUluZGljYXRvci5zaG93V2hpbGUoRGlzcGxheS5nZXRDdXJyZW50KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJLy8JCQkJCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLy8gcmVkbygpOwotCQkvLyB9Ci0JCS8vCQkJCQotCQkvLyB9KTsKLQkJLy8gfQotCi0vLwkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoRGlzcGxheS5nZXRDdXJyZW50KCksIG5ldyBSdW5uYWJsZSgpIHsKLS8vCi0vLwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLS8vCQkJCWlmICgoIXN5bmNocm9uaXplICYmIGFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oKSkgJiYgcHJlRXhlY3V0ZSgpKSB7Ci0vLwkJCQkJcmVkbygpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwotLy8JCX0pOwotCQkKLQkJaWYodXBkYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25OZWVkZWQoKSkgewotCQkJaWYoIWNvbGxlY3RFbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCWZpbmFsIFN0cmluZyB0YXNrTmFtZSA9IChsYWJlbCA9PSBudWxsID8gIiIgOiBsYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLmJlZ2luVGFzayh0YXNrTmFtZSwgZ2V0VG90YWxXb3JrKCkpOwotCQkJCQlCU0Ryb3BDb21tYW5kLnRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JCQkJCXdvcmtlZChnZXRSZW1haW5pbmdXb3JrKCkgLyAzKTsKLQkJCQkJCi0JCQkJCS8vIHRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHByZUV4ZWN1dGUoKSB0byBhZGQgcmVxdWlyZWQgZWxlbWVudHMgdG8gY29uZmlndXJhdGlvbgotCQkJCQkvLyBzbyB0aGUgY29tbWFuZCBjYW4gcmVhbGl6ZSBkYXRhIGNvcnJlY3RseQotCQkJCQkvLwotCQkJCQlhZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKCk7Ci0JCQkJCXdvcmtlZChnZXRSZW1haW5pbmdXb3JrKCkgLyAzKTsKLQkJCQkJCi0JCQkJCWlmIChwcmVFeGVjdXRlKCkpIHsKLQkJCQkJCXdvcmtlZChnZXRSZW1haW5pbmdXb3JrKCkgLyAzKTsKLQkJCQkJCXJlZG8oKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX07Ci0JCWlmKHJ1bkFzSm9iKSB7Ci0JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuQXNKb2IocnVubmFibGUsIHRhc2tOYW1lKTsKLQkJfQotCQllbHNlIHsKLS8vCQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bkluVUkocnVubmFibGUsIChTaGVsbCludWxsKTsKLQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIG51bGwpOwotCQl9Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJdHJ5IHsKLQkJCS8vIGFkZCBlbGVtZW50cyB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIG5lZWRlZAotCQkJLy8KLQkJCWFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oKTsKLQkJCQotCQkJZG9FeGVjdXRlKCk7Ci0JCQl1cGRhdGVEZXNjcmlwdG9ycygpOwotCQkJCi0JCQlsb25nIHRpbWUgPSAwOwotCQkJaWYoVG5nVXRpbC5ERUJVRykgewotCQkJCXRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJCW5lc3RlZENvbW1hbmRFeGNlY3V0b3IuZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCk7Ci0JCQlpZihUbmdVdGlsLkRFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJCU0Ryb3BDb21tYW5kLnJlZG8oKTogZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCkuICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSk7Ci0JCQl9Ci0JCQkKLQkJCWV4ZWN1dGVkID0gdHJ1ZTsKLQkJfQotCQljYXRjaChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWlmKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgZGVzY3JpcHRvcnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZXNjcmlwdG9ycygpIHsKLQkJaWYgKHN5bmNocm9uaXplKSB7Ci0JCQljbGVhckRlc2NyaXB0b3JzKCk7Ci0JCX0KLQotCQkvLyB1cGRhdGUgbmV3IHZhbHVlczsKLQkJLy8KLQkJYmF0Y2hDb21tYW5kLmV4ZWN1dGUoKTsKLQkJCi0JCXVwZGF0ZVRhc2tEZXNjcmlwdG9ycygpOwotCi0JCXNldFJlc3BvbnNpYmxlUm9sZXMoKTsKLQl9Ci0KLS8vCS8qKgotLy8JICogQHBhcmFtIGRlc2MKLS8vCSAqIEBwYXJhbSBmZWF0dXJlCi0vLwkgKiBAcGFyYW0gdmFsdWUKLS8vCSAqLwotLy8JcHJvdGVjdGVkIHZvaWQgc2F2ZU9sZEZlYXR1cmVWYWx1ZShEZXNjcmlwdG9yIGRlc2MsCi0vLwkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLwkJaWYgKGRlc2NyaXB0b3JUb09sZEZlYXR1cmVWYWx1ZXNNYXAgPT0gbnVsbCkgewotLy8JCQlkZXNjcmlwdG9yVG9PbGRGZWF0dXJlVmFsdWVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLS8vCQl9Ci0vLwkJT2JqZWN0IHZhbHVlID0gZGVzYy5lR2V0KGZlYXR1cmUpOwotLy8JCWlmKGZlYXR1cmUuaXNNYW55KCkpIHsKLS8vCQkJdmFsdWUgPSBuZXcgQXJyYXlMaXN0KChMaXN0KXZhbHVlKTsKLS8vCQl9Ci0vLwkJTWFwIGZlYXR1cmVNYXAgPSAoTWFwKSBkZXNjcmlwdG9yVG9PbGRGZWF0dXJlVmFsdWVzTWFwLmdldChkZXNjKTsKLS8vCQlpZiAoZmVhdHVyZU1hcCA9PSBudWxsKSB7Ci0vLwkJCWZlYXR1cmVNYXAgPSBuZXcgSGFzaE1hcCgpOwotLy8JCQlkZXNjcmlwdG9yVG9PbGRGZWF0dXJlVmFsdWVzTWFwLnB1dChkZXNjLCBmZWF0dXJlTWFwKTsKLS8vCQl9Ci0vLwkJZmVhdHVyZU1hcC5wdXQoZmVhdHVyZSwgdmFsdWUpOwotLy8JfQotCi0JcHJvdGVjdGVkIHZvaWQgdW5kb1VwZGF0ZURlc2NyaXB0b3JzKCkgewotCQl1bmRvU2V0UmVzcG9uc2libGVSb2xlKCk7Ci0KLQkJdW5kb1VwZGF0ZVRhc2tEZXNjcmlwdG9ycygpOwotCi0JCS8vIHJlc3RvcmUgb2xkIHZhbHVlcwotCQkvLwotCQliYXRjaENvbW1hbmQudW5kbygpOwotCi0JCS8vIHJlc3RvcmUgdmFsdWUgZm9yIHJlZnJlc2hhYmxlIGZlYXR1cmVzIHRoYXQgaGFkIGJlZW4gY2xlYXJlZAotCQkvLwotCQlpZiAoc3luY2hyb25pemUpIHsKLQkJCXVuZG9DbGVhckRlc2NyaXB0b3JzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYXJEZXNjcmlwdG9ycygpIHsKLQkJaWYgKGRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlpZiAoIWJhdGNoQ29tbWFuZC5nZXREZXNjcmlwdG9yc1RvUmVmcmVzaCgpLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGJhdGNoQ29tbWFuZC5nZXREZXNjcmlwdG9yc1RvUmVmcmVzaCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCWNsZWFyRGVzY3JpcHRvcigoRGVzY3JpcHRvcikgaXRlci5uZXh0KCkpOwotCQkJCX0KLQkJCQkvLyBkZXNjcmlwdG9yc1RvUmVmcmVzaC5jbGVhcigpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBhZmZlY3RlZCB0YXNrIGRlc2NyaXB0b3JzIHdpdGggbmV3IGRhdGEgZnJvbSBtZXRob2QgY29udGVudAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVUYXNrRGVzY3JpcHRvcnMoKSB7Ci0JCWlmICh0YXNrRGVzY3JpcHRvcnNUb1VwZGF0ZSAhPSBudWxsKSB7Ci0JCQkvLyByZWZyZXNoIHN0ZXBzIGZyb20gdGhlIGFzc29jaWF0ZWQgdGFzawotCQkJLy8KLQkJCWlmKHN5bmNoRmVhdHVyZXMuY29udGFpbnMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19TdGVwcygpKSkgewotCQkJCWlmICh0YXNrRGVzY1RvTmV3U3RlcHNNYXAgPT0gbnVsbCkgewotCQkJCQl0YXNrRGVzY1RvTmV3U3RlcHNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCX0KLQkJCQlJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlnQXBwbGljYXRvciA9IFByb3ZpZGVycwotCQkJCS5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhc2tEZXNjcmlwdG9yc1RvVXBkYXRlLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJCVRhc2sgdGFzayA9IHRhc2tEZXNjLmdldFRhc2soKTsKLQkJCQkJaWYgKHRhc2sgIT0gbnVsbCAmJiAhKChFT2JqZWN0KSB0YXNrKS5lSXNQcm94eSgpKSB7Ci0JCQkJCQlMaXN0IHN0ZXBzID0gKExpc3QpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKHRhc2sKLQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCB0YXNrLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCksIGNvbmZpZyk7Ci0JCQkJCQkKLQkJCQkJCS8vIGFkZCB0aG9zZSBzdGVwcyB0byBUYXNrRGVzY3JpcHRvciBpZiB0aGV5IGFyZSBub3QgdGhlcmUKLQkJCQkJCS8vIHlldC4KLQkJCQkJCS8vCi0JCQkJCQlBcnJheUxpc3QgbmV3U3RlcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQl0YXNrRGVzYy5nZXRTZWxlY3RlZFN0ZXBzKCkucmV0YWluQWxsKHN0ZXBzKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBzdGVwcy5pdGVyYXRvcigpOyBpdGVyMS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IHN0ZXAgPSBpdGVyMS5uZXh0KCk7Ci0JCQkJCQkJaWYgKCF0YXNrRGVzYy5nZXRTZWxlY3RlZFN0ZXBzKCkuY29udGFpbnMoc3RlcCkpIHsKLQkJCQkJCQkJbmV3U3RlcHMuYWRkKHN0ZXApOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmICghbmV3U3RlcHMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJdGFza0Rlc2MuZ2V0U2VsZWN0ZWRTdGVwcygpLmFkZEFsbChuZXdTdGVwcyk7Ci0JCQkJCQkJdGFza0Rlc2NUb05ld1N0ZXBzTWFwLnB1dCh0YXNrRGVzYywgbmV3U3RlcHMpOwotLy8JCQkJCQkJU3lzdGVtLm91dAotLy8JCQkJCQkJLnByaW50bG4oIkJTRHJvcENvbW1hbmQudXBkYXRlVGFza0Rlc2NyaXB0b3JzKCk6IGNoYW5nZWQiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVuZG9VcGRhdGVUYXNrRGVzY3JpcHRvcnMoKSB7Ci0JCWlmICh0YXNrRGVzY1RvTmV3U3RlcHNNYXAgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFza0Rlc2NUb05ld1N0ZXBzTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gKFRhc2tEZXNjcmlwdG9yKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQl0YXNrRGVzYy5nZXRTZWxlY3RlZFN0ZXBzKCkucmVtb3ZlQWxsKAotCQkJCQkJKENvbGxlY3Rpb24pIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR28gdGhydSBhbGwgdGhlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyBvZiB0aGlzIGFjdGl2aXR5IGFuZCBzZXQgdGhlCi0JICogcmVzcG9uc2libGUgcm9sZSBmb3IgdGhlbSBpZiB0aGVyZSBpcyBhbnkKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0UmVzcG9uc2libGVSb2xlcygpIHsKLQkJaWYoIXN5bmNoRmVhdHVyZXMuY29udGFpbnMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZihyZWZyZXNoUmVzcG9uc2libGVGb3JDb21tYW5kICE9IG51bGwpIHsKLQkJCXJlZnJlc2hSZXNwb25zaWJsZUZvckNvbW1hbmQuZGlzcG9zZSgpOwotCQl9Ci0JCXJlZnJlc2hSZXNwb25zaWJsZUZvckNvbW1hbmQgPSBuZXcgQmF0Y2hDb21tYW5kKHRydWUpOwotIAotCQlMaXN0IGJyRWxlbWVudHMgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQlMaXN0IHdwRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgcm9sZURlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBickVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCXdwRGVzY0xpc3QuYWRkKG9iaik7Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJcm9sZURlc2NyaXB0b3JzLmFkZChvYmopOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdG9yID0gcm9sZURlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0b3IubmV4dCgpOwotCQkJUm9sZSByb2xlID0gcm9sZURlc2MuZ2V0Um9sZSgpOwotCQkJaWYgKHJvbGUgIT0gbnVsbCkgewkJCQkKLQkJCQlMaXN0IHJlc3BvbnNpYmxlV29ya1Byb2R1Y3RzID0gKExpc3QpIFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldFJlZmVyZW5jZShyb2xlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksIGNvbmZpZyk7Ci0JCQkJTGlzdCByZXNwb25zaWJsZVdQRExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgaiA9IHdwRGVzY0xpc3Quc2l6ZSgpIC0gMTsgaiA+IC0xOyBqLS0pIHsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHdwRGVzY0xpc3QKLQkJCQkJCQkuZ2V0KGopOwotLy8JCQkJCVJvbGVEZXNjcmlwdG9yIHJlc3BvbnNpYmxlUm9sZURlc2MgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRSZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9yKHdwRGVzYyk7Ci0vLwkJCQkJaWYgKHJlc3BvbnNpYmxlV29ya1Byb2R1Y3RzLmNvbnRhaW5zKHdwRGVzYwotLy8JCQkJCQkJLmdldFdvcmtQcm9kdWN0KCkpCi0vLwkJCQkJCQkmJiAgcmVzcG9uc2libGVSb2xlRGVzYyAhPSByb2xlRGVzYykgewotLy8JCQkJCQl3cGRUb09sZFJlc3BvbnNpYmxlUm9sZU1hcC5wdXQod3BEZXNjLCByZXNwb25zaWJsZVJvbGVEZXNjKTsKLS8vLy8JCQkJCQl3cERlc2Muc2V0UmVzcG9uc2libGVSb2xlKHJvbGVEZXNjKTsKLS8vCQkJCQkJcm9sZURlc2MuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQod3BEZXNjKTsKLS8vCQkJCQl9Ci0JCQkJCQotCQkJCQlpZihyZXNwb25zaWJsZVdvcmtQcm9kdWN0cy5jb250YWlucyh3cERlc2MuZ2V0V29ya1Byb2R1Y3QoKSkpIHsKLQkJCQkJCXJlc3BvbnNpYmxlV1BETGlzdC5hZGQod3BEZXNjKTsKLQkJCQkJfQotCQkJCX0JCQkJCi0JCQkJaWYoIXJvbGVEZXNjLmdldFJlc3BvbnNpYmxlRm9yKCkuZXF1YWxzKHJlc3BvbnNpYmxlV1BETGlzdCkpIHsKLQkJCQkJcmVmcmVzaFJlc3BvbnNpYmxlRm9yQ29tbWFuZC5hZGRGZWF0dXJlVmFsdWVzKHJvbGVEZXNjLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpLCByZXNwb25zaWJsZVdQRExpc3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmVmcmVzaFJlc3BvbnNpYmxlRm9yQ29tbWFuZC5leGVjdXRlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCW5lc3RlZENvbW1hbmRFeGNlY3V0b3IudW5kb05lc3RlZENvbW1hbmRzKCk7Ci0JCQotCQkvLyByZW1vdmUgYW55IG9iamVjdCB0aGF0IGhhZCBiZWVuIGFkZGVkIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkJLy8KLQkJaWYgKGFkZGVkT2JqZWN0cyAhPSBudWxsICYmICFhZGRlZE9iamVjdHMuaXNFbXB0eSgpKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZGVkT2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLnJlbW92ZShlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQlhZGRlZFRvRGVmYXVsdENvbmZpZyA9IGZhbHNlOwotCQl9Ci0KLQkJdW5kb1VwZGF0ZURlc2NyaXB0b3JzKCk7Ci0KLQkJZG9VbmRvKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVuZG9DbGVhckRlc2NyaXB0b3JzKCkgewotCQlpZihkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAuZW50cnlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJRGVzY3JpcHRvciBkZXNjID0gKERlc2NyaXB0b3IpIGVudHJ5LmdldEtleSgpOwotCQkJCU1hcCBmZWF0dXJlTWFwID0gKE1hcCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZmVhdHVyZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWRlc2MKLQkJCQkJLmVTZXQoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZW50cnkuZ2V0S2V5KCksIGVudHJ5Ci0JCQkJCQkJLmdldFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFVuZG9lcyB0aGUgY2hhbmdlIG1hZGUgYnkKLQkgKiB7QGxpbmsgI3NldFJlc3BvbnNpYmxlUm9sZXMoKSBzZXRSZXNwb25zaWJsZVJvbGVzKCkgfQotCSAqLwotCXByaXZhdGUgdm9pZCB1bmRvU2V0UmVzcG9uc2libGVSb2xlKCkgewotLy8JCWlmKHdwZFRvT2xkUmVzcG9uc2libGVSb2xlTWFwICE9IG51bGwgJiYgIXdwZFRvT2xkUmVzcG9uc2libGVSb2xlTWFwLmlzRW1wdHkoKSkgewotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cGRUb09sZFJlc3BvbnNpYmxlUm9sZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotLy8JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5LmdldEtleSgpOwotLy8JCQkJKChSb2xlRGVzY3JpcHRvcikgZW50cnkuZ2V0VmFsdWUoKSkuZ2V0UmVzcG9uc2libGVGb3IoKS5yZW1vdmUod3BkKTsKLS8vCQkJfQotLy8JCX0KLQkJaWYocmVmcmVzaFJlc3BvbnNpYmxlRm9yQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQlyZWZyZXNoUmVzcG9uc2libGVGb3JDb21tYW5kLnVuZG8oKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb0V4ZWN1dGUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvVW5kbygpOwotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSUV4ZWN1dG9yIHsKLQkJYm9vbGVhbiBwcmVFeGVjdXRlKCk7Ci0KLQkJdm9pZCBkb0V4Y2VjdXRlKCk7Ci0KLQkJdm9pZCBkb1VuZG8oKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9CYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Jhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTgwZTAxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Jhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSA3LjAKLSAqLwotcHVibGljIGNsYXNzIEJhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZAotCQlpbXBsZW1lbnRzIElSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTZXQgTk9ORU1QVFlfQVRUUklCVVRFUyA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QoCi0JCQluZXcgRVN0cnVjdHVyYWxGZWF0dXJlW10gewotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKQotCQkJfQotCSkpOwotCQotCi0JcHJvdGVjdGVkIERlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQlwcm90ZWN0ZWQgU2V0IHN5bmNoRmVhdHVyZXM7Ci0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCXByaXZhdGUgSGFzaE1hcCBmZWF0dXJlTWFwOwotCi0JcHVibGljIEJhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZChEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFNldCBzeW5jaEZlYXR1cmVzLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotCQlpZiAoc3luY2hGZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQl0aGlzLnN5bmNoRmVhdHVyZXMgPSBCU0Ryb3BDb21tYW5kLkRFRkFVTFRfU1lOQ0hfRkVBVFVSRVM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnN5bmNoRmVhdHVyZXMgPSBzeW5jaEZlYXR1cmVzOwotCQl9Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYoZGVzY3JpcHRvci5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChkZXNjcmlwdG9yLmVSZXNvdXJjZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNhdmVPbGRGZWF0dXJlVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJaWYgKGZlYXR1cmVNYXAgPT0gbnVsbCkgewotCQkJZmVhdHVyZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJZmVhdHVyZU1hcC5wdXQoZmVhdHVyZSwgZGVzY3JpcHRvci5lR2V0KGZlYXR1cmUpKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbGlua2VkIGVsZW1lbnQgaWYgcmVxdWlyZWQKLQkJLy8KLQkJTWV0aG9kRWxlbWVudCBlID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCU9iamVjdCByZXNvbHZlZCA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLnJlc29sdmUoZSwgY29uZmlnKTsKLQkJaWYocmVzb2x2ZWQgIT0gZSkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0JCQlpZihkZXNjcmlwdG9yIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQlmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpOwkJCQkJCi0JCQl9Ci0JCQllbHNlIGlmKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCk7CQkJCQkKLQkJCX0KLQkJCWVsc2UgaWYoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKTsJCQkJCQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZmVhdHVyZSA9IG51bGw7Ci0JCQl9Ci0JCQlzYXZlT2xkRmVhdHVyZVZhbHVlKGZlYXR1cmUpOwotCQkJZSA9IChNZXRob2RFbGVtZW50KSByZXNvbHZlZDsKLQkJCWRlc2NyaXB0b3IuZVNldChmZWF0dXJlLCBlKTsKLQkJfQotCQkKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3luY2hGZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBmID0gaXRlci5uZXh0KCk7Ci0JCQlpZihmIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgewotCQkJCUVBdHRyaWJ1dGUgYXR0cmliID0gKEVBdHRyaWJ1dGUpIGY7IAotCQkJCUVBdHRyaWJ1dGUgZGVzY0F0dHJpYiA9IChFQXR0cmlidXRlKSBCU0Ryb3BDb21tYW5kLkZFQVRVUkVfTUFQLmdldChhdHRyaWIpOwotCQkJCWlmKGRlc2NBdHRyaWIgIT0gbnVsbCkgewotCQkJCQlpZihOT05FTVBUWV9BVFRSSUJVVEVTLmNvbnRhaW5zKGF0dHJpYikpIHsKLQkJCQkJCS8vIHJlZnJlc2ggYXR0cmlidXRlIHRoYXQgY2FuIG5vdCBiZSBlbXB0eQotCQkJCQkJLy8KLQkJCQkJCU9iamVjdCB2YWx1ZSA9ICBlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50ID8gCi0JCQkJCQkJCShTdHJpbmcpIFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldEF0dHJpYnV0ZSgoVmFyaWFiaWxpdHlFbGVtZW50KSBlLCBhdHRyaWIsIGNvbmZpZykgCi0JCQkJCQkJCTogZS5lR2V0KGF0dHJpYik7Ci0JCQkJCQkvLyBpZiBhdHRyaXVidXRlIGlzIHByZXNlbnRhdGlvbiBuYW1lIGFuZCBuZXcgdmFsdWUgaXMgYmxhbmssIGNvcHkgbmFtZSBvdmVyCi0JCQkJCQlpZiAoKGRlc2NBdHRyaWIuZXF1YWxzKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpKSkgJiYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUuZXF1YWxzKCIiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl2YWx1ZSA9IGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgPyAKLQkJCQkJCQkJCShTdHJpbmcpIFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldEF0dHJpYnV0ZSgoVmFyaWFiaWxpdHlFbGVtZW50KSBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLCBjb25maWcpIAotCQkJCQkJCQkJOiBlLmVHZXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQkJCQlPYmplY3QgZGVzY1ZhbHVlID0gZGVzY3JpcHRvci5lR2V0KGRlc2NBdHRyaWIpOwotCQkJCQkKLQkJCQkJCWlmKCh2YWx1ZSA9PSBudWxsICYmIGRlc2NWYWx1ZSAhPSBudWxsKSB8fCAodmFsdWUgIT0gbnVsbCAmJiAhdmFsdWUuZXF1YWxzKGRlc2NWYWx1ZSkpKSB7Ci0JCQkJCQkJc2F2ZU9sZEZlYXR1cmVWYWx1ZShkZXNjQXR0cmliKTsKLQkJCQkJCQlkZXNjcmlwdG9yLmVTZXQoZGVzY0F0dHJpYiwgdmFsdWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gcmVzZXQgYXR0cmlidXRlIHRvIGl0cyBkZWZhdWx0IHZhbHVlCi0JCQkJCQkvLwotCQkJCQkJc2F2ZU9sZEZlYXR1cmVWYWx1ZShkZXNjQXR0cmliKTsKLQkJCQkJCWRlc2NyaXB0b3IuZVNldChkZXNjQXR0cmliLCBkZXNjQXR0cmliLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmKGZlYXR1cmVNYXAgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGZlYXR1cmVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBlbnRyeQotCQkJCS5nZXRLZXkoKTsKLQkJCQl0cnkgewotCQkJCQlkZXNjcmlwdG9yLmVTZXQoZmVhdHVyZSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJCWNhdGNoKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQkJCX0JCi0JCQlmZWF0dXJlTWFwLmNsZWFyKCk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihmZWF0dXJlTWFwICE9IG51bGwpIHsKLQkJCWZlYXR1cmVNYXAuY2xlYXIoKTsKLQkJCWZlYXR1cmVNYXAgPSBudWxsOwotCQl9CQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0NvbnRyaWJ1dGVUb0FjdGl2aXR5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQ29udHJpYnV0ZVRvQWN0aXZpdHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MzUyNzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQ29udHJpYnV0ZVRvQWN0aXZpdHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDEwLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cmlidXRlVG9BY3Rpdml0eUNvbW1hbmQgZXh0ZW5kcyBWYXJ5QWN0aXZpdHlDb21tYW5kIHsKLQotCS8qKgotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICovCi0JcHVibGljIENvbnRyaWJ1dGVUb0FjdGl2aXR5Q29tbWFuZCgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJc3VwZXIod3JhcHBlcik7Ci0JCXNldExhYmVsKExpYnJhcnlFZGl0UmVzb3VyY2VzLmNvbnRyaWJ1dGVUb0FjdGl2aXR5X3RleHQpOyAKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5WYXJ5QWN0aXZpdHlDb21tYW5kI2RvVmFyeSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9WYXJ5KCkgewotCQlQcm9jZXNzVXRpbC5jb250cmlidXRlVG9BY3Rpdml0eSh3cmFwcGVyLCBjcmVhdGVkQWN0aXZpdGllcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Db3B5SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Db3B5SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOTlmZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQ29weUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotcHVibGljIGNsYXNzIENvcHlIZWxwZXIgZXh0ZW5kcyBDb3B5Q29tbWFuZC5IZWxwZXIgewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTI2NDM4OTM5Mzk1NTYzOTAwNEw7Ci0KLQlwcml2YXRlIE1hcCBjb3B5VG9PcmlnaW5hbE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHJpdmF0ZSBNYXAgYmFzZVRvVmFyaWFiaWxpdHlFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIE1hcCBiYXNlVG9CYWNrdXBWYXJpYWJpbGl0eUVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBCcmVha2Rvd25FbGVtZW50PiB3cmFwcGVyUGF0aFRvQ29weU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQnJlYWtkb3duRWxlbWVudD4oKTsKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLnV0aWwuSGFzaE1hcCNjbGVhcigpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7CQkKLQkJc3VwZXIuY2xlYXIoKTsKLQkJY29weVRvT3JpZ2luYWxNYXAuY2xlYXIoKTsKLQkJYmFzZVRvQmFja3VwVmFyaWFiaWxpdHlFbGVtZW50TWFwLmNsZWFyKCk7Ci0JCWJhc2VUb1ZhcmlhYmlsaXR5RWxlbWVudE1hcC5jbGVhcigpOwotCQl3cmFwcGVyUGF0aFRvQ29weU1hcC5jbGVhcigpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldE9yaWdpbmFsKE9iamVjdCBjb3B5KSB7Ci0JCXJldHVybiBjb3B5VG9PcmlnaW5hbE1hcC5nZXQoY29weSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgcHV0VmFyaWFiaWxpdHlFbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCBiYXNlLCBWYXJpYWJpbGl0eUVsZW1lbnQgdmUpIHsKLQkJcmV0dXJuIGJhc2VUb1ZhcmlhYmlsaXR5RWxlbWVudE1hcC5wdXQoYmFzZSwgdmUpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IHJlbW92ZVZhcmlhYmlsaXR5RWxlbWVudChWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSkgewotCQlyZXR1cm4gYmFzZVRvVmFyaWFiaWxpdHlFbGVtZW50TWFwLnJlbW92ZShiYXNlKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBwdXRCYWNrdXBDb3B5KFZhcmlhYmlsaXR5RWxlbWVudCBiYXNlLCBWYXJpYWJpbGl0eUVsZW1lbnQgYmFja3VwKSB7Ci0JCXJldHVybiBiYXNlVG9CYWNrdXBWYXJpYWJpbGl0eUVsZW1lbnRNYXAucHV0KGJhc2UsIGJhY2t1cCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXIjcHV0KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEVPYmplY3QgcHV0KEVPYmplY3Qga2V5LCBFT2JqZWN0IHZhbHVlKSB7Ci0JCWNvcHlUb09yaWdpbmFsTWFwLnB1dCh2YWx1ZSwga2V5KTsKLQkJcmV0dXJuIHN1cGVyLnB1dChrZXksIHZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBiYXNpY1B1dChFT2JqZWN0IGtleSwgRU9iamVjdCB2YWx1ZSkgewotCQlPYmplY3Qgb2xkID0gc3VwZXIucHV0KGtleSwgdmFsdWUpOwotCQlpbml0aWFsaXphdGlvbkxpc3QucmVtb3ZlKGtleSk7Ci0JCXJldHVybiBvbGQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyI2dldENvcHkob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0Q29weShFT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCU9iamVjdCB2ZSA9IGdldFZhcmlhYmlsaXR5RWxlbWVudChiYXNlVG9WYXJpYWJpbGl0eUVsZW1lbnRNYXAsIG9iamVjdCk7Ci0JCQlpZih2ZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldENvcHkoKEVPYmplY3QpIHZlKTsKLQkJCX0KLQkJfQotCQlFT2JqZWN0IGNvcHkgPSBzdXBlci5nZXRDb3B5KG9iamVjdCk7Ci0JCWlmKGNvcHkgPT0gbnVsbCkgewotCQkJLy8gZ2V0IGJhY2t1cCBjb3B5Ci0JCQkvLwotCQkJT2JqZWN0IHZlID0gZ2V0VmFyaWFiaWxpdHlFbGVtZW50KGJhc2VUb0JhY2t1cFZhcmlhYmlsaXR5RWxlbWVudE1hcCwgb2JqZWN0KTsKLQkJCWlmKHZlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0Q29weSgoRU9iamVjdCkgdmUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb3B5OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgZ2V0VmFyaWFiaWxpdHlFbGVtZW50KE1hcCBiYXNlVG9WYXJpYWJpbGl0eUVsZW1lbnRNYXAsIE9iamVjdCBiYXNlKSB7Ci0JCU9iamVjdCB2ZSA9IG51bGw7CQkKLQkJZG8gewotCQkJYmFzZSA9IGJhc2VUb1ZhcmlhYmlsaXR5RWxlbWVudE1hcC5nZXQoYmFzZSk7Ci0JCQlpZihiYXNlICE9IG51bGwpIHsKLQkJCQl2ZSA9IGJhc2U7Ci0JCQl9Ci0JCX0gd2hpbGUgKGJhc2UgIT0gbnVsbCk7Ci0JCXJldHVybiB2ZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXIjZ2V0Q29weVRhcmdldChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRDb3B5VGFyZ2V0KEVPYmplY3QgdGFyZ2V0LCBib29sZWFuIGNvcHlSZXF1aXJlZCkgewotCQlpZihjb3B5UmVxdWlyZWQpIHsKLQkJCXJldHVybiBzdXBlci5nZXRDb3B5KHRhcmdldCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlFT2JqZWN0IGNvcGllZCA9IGdldENvcHkodGFyZ2V0KTsKLQkJCWlmIChjb3BpZWQgPT0gbnVsbCkKLQkJCXsKLQkJCQlyZXR1cm4gdGFyZ2V0OwotCQkJfQotCQkJcmV0dXJuIGNvcGllZDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgTWFwIGdldE9iamVjdFRvQ29weU1hcCgpIHsKLQkJSGFzaFNldCBvYmplY3RzID0gbmV3IEhhc2hTZXQoYmFzZVRvQmFja3VwVmFyaWFiaWxpdHlFbGVtZW50TWFwLmtleVNldCgpKTsKLQkJb2JqZWN0cy5hZGRBbGwoYmFzZVRvVmFyaWFiaWxpdHlFbGVtZW50TWFwLmtleVNldCgpKTsKLQkJb2JqZWN0cy5hZGRBbGwoa2V5U2V0KCkpOwkJCi0JCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJbWFwLnB1dChvYmplY3QsIGdldENvcHkoKEVPYmplY3QpIG9iamVjdCkpOwotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQkJCi0KLQlwdWJsaWMgdm9pZCBwdXRXcmFwcGVyQ29weShTdHJpbmcgZ3VpZFBhdGgsIEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlpZihlLmdldE5hbWUoKS5lcXVhbHMoImNsb3NlLW91dF9wcm9qZWN0IikpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQl9Ci0JCXdyYXBwZXJQYXRoVG9Db3B5TWFwIC5wdXQoZ3VpZFBhdGgsIGUpOwotCX0KLQkKLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudCBnZXRXcmFwcGVyQ29weShTdHJpbmcgZ3VpZFBhdGgpIHsKLQkJcmV0dXJuIHdyYXBwZXJQYXRoVG9Db3B5TWFwLmdldChndWlkUGF0aCk7Ci0JfQotCi0JcHVibGljIE1hcDxTdHJpbmcsIEJyZWFrZG93bkVsZW1lbnQ+IGdldFdyYXBwZXJQYXRoVG9Db3B5TWFwKCkgewotCQlyZXR1cm4gd3JhcHBlclBhdGhUb0NvcHlNYXA7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0NyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9DcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjRlNDViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0NyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuVXNlcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLlByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5BZGFwdGVyRmFjdG9yeUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5NZXNzYWdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLQotLyoqCi0gKiBFeGVjdXRlcyB0aGUgQ3JlYXRlIFByb2Nlc3MgQ29tcG9uZW50IGNvbW1hbmQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZCBleHRlbmRzIENyZWF0ZUNoaWxkQ29tbWFuZCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uPEVDbGFzcz4gRUNMQVNTRVMgPSBuZXcgSGFzaFNldDxFQ2xhc3M+KCk7Ci0KLQlwcml2YXRlIFByb2Nlc3MgcHJvY2VzczsKLQotCXByaXZhdGUgSVN0YXR1cyBzdGF0dXM7Ci0KLQlzdGF0aWMgewotCQlFQ0xBU1NFUy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIENvbXBhcmVCeU5hbWUgaW1wbGVtZW50cyBDb21wYXJhdG9yPE1ldGhvZEVsZW1lbnQ+IHsKLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoTWV0aG9kRWxlbWVudCBvYmoxLCBNZXRob2RFbGVtZW50IG9iajIpIHsKLQkJCVN0cmluZyBuYW1lMSA9ICgoTWV0aG9kRWxlbWVudCkgb2JqMSkuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIG5hbWUyID0gKChNZXRob2RFbGVtZW50KSBvYmoyKS5nZXROYW1lKCk7Ci0JCQlyZXR1cm4gbmFtZTEuY29tcGFyZVRvSWdub3JlQ2FzZShuYW1lMik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgQ29uZmlnVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvciB7Ci0KLQkJcHVibGljIElTdGF0dXMgaXNWYWxpZChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqID09IG51bGwpIHsKLQkJCQlTdHJpbmcgbXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMubm9EZWZhdWx0Q29uZmlnRXJyb3JfbXNnOwotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJLmdldElkKCksIDAsIG1zZywgbnVsbCk7Ci0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IGNoaWxkLCBpbnQgaW5kZXgsCi0JCQlDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbiwgSGVscGVyIGhlbHBlcikgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgaW5kZXgsIHNlbGVjdGlvbiwgaGVscGVyKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkob3duZXIpOwotCQkKLQkJT2JqZWN0IHNoZWxsID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvbnRleHQoKTsKLQkJCi0JCS8vIFRoZSBvd25lciBtdXN0IGJlIHVwZGF0YWJsZS4KLQkJLy8KLQkJc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KG93bmVyLCBzaGVsbCk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdCBjb25maWdzID0gbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQlMaXN0IG1ldGhvZENvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbmZpZ3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NGYW1pbHkpKSB7Ci0JCQkJbWV0aG9kQ29uZmlncy5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobWV0aG9kQ29uZmlncy5pc0VtcHR5KCkpIHsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksCi0JCQkJCQkJCTAsIExpYnJhcnlFZGl0UmVzb3VyY2VzLm5vQ29uZmlnRXJyb3JfbXNnLCBudWxsKTsKLS8vCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dFcnJvcigKLS8vCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5jcmVhdGVQcm9jZXNzX3RleHQsCi0vLwkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMubm9Db25maWdFcnJvcl9tc2cpOwkJCQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcikgaGVscGVyOwotCi0JCUFycmF5TGlzdCBwcm9jQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGFkYXB0ZXIuZ2V0UHJvY2Vzc1R5cGUoKSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpKSB7Ci0JCQlwcm9jQ2xhc3Nlcy5hZGQoRGVsaXZlcnlQcm9jZXNzLmNsYXNzKTsKLQkJCXByb2NDbGFzc2VzLmFkZChDYXBhYmlsaXR5UGF0dGVybi5jbGFzcyk7Ci0JCX0KLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFbGVtZW50KSBvd25lcik7CQkKLQkJTGlzdCBiYXNlUHJvY0xpc3QgPSBUbmdVdGlsLmdldEF2YWlsYWJsZUJhc2VQcm9jZXNzZXMocGx1Z2luLAotCQkJCXByb2NDbGFzc2VzKTsKLQotCQkvLyBzb3J0IGJ5IG5hbWUKLQkJQ29sbGVjdGlvbnMuc29ydChtZXRob2RDb25maWdzLCBuZXcgQ29tcGFyZUJ5TmFtZSgpKTsKLQotCQlNZXRob2RDb25maWd1cmF0aW9uW10gcHJvY0N0eHMgPSBuZXcgTWV0aG9kQ29uZmlndXJhdGlvblttZXRob2RDb25maWdzCi0JCQkJLnNpemUoKV07Ci0JCW1ldGhvZENvbmZpZ3MudG9BcnJheShwcm9jQ3R4cyk7Ci0KLQkJUHJvY2Vzc1tdIGJhc2VQcm9jZXNzZXMgPSBuZXcgUHJvY2Vzc1tiYXNlUHJvY0xpc3Quc2l6ZSgpXTsKLQkJYmFzZVByb2NMaXN0LnRvQXJyYXkoYmFzZVByb2Nlc3Nlcyk7Ci0KLQkJZmluYWwgUHJvY2Vzc0NvbXBvbmVudCBwcm9jQ29tcCA9IChQcm9jZXNzQ29tcG9uZW50KSBjaGlsZDsKLQkJRUNsYXNzIHByb2NUeXBlID0gYWRhcHRlci5nZXRQcm9jZXNzVHlwZSgpOwotCQlwcm9jQ29tcC5zZXRQcm9jZXNzKChQcm9jZXNzKSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUocHJvY1R5cGUpKTsKLQkJCi0JCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJTGlzdCB1c2VySW5wdXRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVmFsaWRhdG9yIG5hbWVWYWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVOYW1lVmFsaWRhdG9yKAotCQkJCW93bmVyLCBwcm9jQ29tcCk7Ci0JCS8vIG5hbWUKLQkJVXNlcklucHV0IG5hbWVJbnB1dCA9IG5ldyBVc2VySW5wdXQoTGlicmFyeUVkaXRSZXNvdXJjZXMubmFtZUxhYmVsX3RleHQsIFVzZXJJbnB1dC5URVhULAotCQkJCWZhbHNlLCBudWxsLCBudWxsLCBuYW1lVmFsaWRhdG9yLCBudWxsKTsKLQkJdXNlcklucHV0cy5hZGQobmFtZUlucHV0KTsKLQkJCi0JCS8vIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCQkvLwotCQlVc2VySW5wdXQgZGVmYXVsdENvbmZpZ0lucHV0ID0gbmV3IFVzZXJJbnB1dChMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWZhdWx0Q29uZmlnTGFiZWxfdGV4dCwgVXNlcklucHV0LlNFTEVDVElPTiwKLQkJCQlmYWxzZSwgbWV0aG9kQ29uZmlncywgbmV3IEl0ZW1MYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfSwgbmV3IENvbmZpZ1ZhbGlkYXRvcigpLCBudWxsKTsKLQkJdXNlcklucHV0cy5hZGQoZGVmYXVsdENvbmZpZ0lucHV0KTsKLQkJLy8gYmFzZSBwcm9jZXNzCi0JCVVzZXJJbnB1dCBiYXNlUHJvY0lucHV0ID0gbnVsbDsKLQkJCi0JCWlmKHByb2NDb21wLmdldFByb2Nlc3MoKSBpbnN0YW5jZW9mIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKSB7Ci0JCQliYXNlUHJvY0lucHV0ID0gbmV3IFVzZXJJbnB1dChMaWJyYXJ5RWRpdFJlc291cmNlcy5iYXNlZE9uUHJvY2Vzc2VzTGFiZWxfdGV4dCwgVXNlcklucHV0LlNFTEVDVElPTiwKLQkJCQkJdHJ1ZSwgYmFzZVByb2NMaXN0LCBuZXcgQWRhcHRlckZhY3RvcnlJdGVtTGFiZWxQcm92aWRlcihUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSksICBudWxsKTsKLQkJCXVzZXJJbnB1dHMuYWRkKGJhc2VQcm9jSW5wdXQpOwotCQl9Ci0JCQotCQlib29sZWFuIGNhbkV4ZWN1dGUgPSBmYWxzZTsKLQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLkNyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kX01lc3NhZ2UsIAotCQkJCVRuZ1V0aWwuZ2V0VHlwZVRleHQocHJvY1R5cGUuZ2V0TmFtZSgpKS50b0xvd2VyQ2FzZSgpKTsKLQkJCi0JCS8vIHJlcXVlc3QgaW5wdXQKLQkJaWYgKHVpSGFuZGxlci5yZXF1ZXN0SW5wdXQoTGlicmFyeUVkaXRSZXNvdXJjZXMubmV3UHJvY2Vzc0NvbXBvbmVudERpYWxvZ190aXRsZSwgCi0JCQkJbXNnLCB1c2VySW5wdXRzKSkgewotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBuYW1lSW5wdXQuZ2V0SW5wdXQoKTsKLQkJCXByb2NDb21wLnNldE5hbWUobmFtZSk7Ci0JCQlwcm9jZXNzID0gcHJvY0NvbXAuZ2V0UHJvY2VzcygpOwotCQkJcHJvY2Vzcy5zZXROYW1lKG5hbWUpOwotCQkJcHJvY2Vzcy5zZXRQcmVzZW50YXRpb25OYW1lKG5hbWUpOwotCQkJcHJvY2Vzcy5zZXREZWZhdWx0Q29udGV4dCgoTWV0aG9kQ29uZmlndXJhdGlvbikgZGVmYXVsdENvbmZpZ0lucHV0LmdldElucHV0KCkpOwotCQkJaWYoYmFzZVByb2NJbnB1dCAhPSBudWxsKSB7Ci0JCQkJTGlzdCBsaXN0ID0gKExpc3QpIGJhc2VQcm9jSW5wdXQuZ2V0SW5wdXQoKTsKLQkJCQlpZighbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJKChQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSlwcm9jQ29tcCkuZ2V0QmFzZWRPblByb2Nlc3NlcygpLmFkZEFsbChsaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQljYW5FeGVjdXRlID0gdHJ1ZTsKLQkJfQotCi0JCWlmIChjYW5FeGVjdXRlKSB7Ci0JCQkvLyBjcmVhdGUgcHJvY2VzcyBjb21wb25lbnQgbmVlZCB0byB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gdGhhdAotCQkJLy8gaGFzIGJlZW4gc2VsZWN0ZWQgYXMKLQkJCS8vIGRlZmF1bHQgY29udGV4dCBvZiBpdHMgcHJvY2Vzcy4gQ2hlY2sgaWYgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQotCQkJLy8gaXMgdXBkYXRhYmxlCi0JCQkvLwotCQkJc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KHByb2NDb21wLmdldFByb2Nlc3MoKQotCQkJCQkuZ2V0RGVmYXVsdENvbnRleHQoKSwgc2hlbGwpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlzdXBlci5leGVjdXRlKCk7Ci0KLQkJCUNvbW1hbmQgY21kID0gZ2V0Q29tbWFuZCgpOwotCQkJaWYgKGNtZCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSAoKE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKSBjbWQpLmdldFN0YXR1cygpOwotCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkgewotCQkJCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQotCQkJZmluYWwgTWV0aG9kQ29uZmlndXJhdGlvbiBwcm9jQ3R4ID0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJCi0JCQkvLyBuZWVkIHRvIGFkZCB0aGUgcGFyZW50IHBhY2thZ2VzIGFuZCBwbHVnaW4gaW50byB0aGUgY29uZmlndXJhdGlvbgotCQkJLy8gYXMgd2VsbAotCQkJLy8gTmV3IHByb2Nlc3MgaW4gbmV3IHBsdWctaW4gbm90IGF1dG9tYXRpY2FsbHkgdmlzaWJsZSBpbgotCQkJLy8gY29uZmlndXJhdGlvbiB2aWV3Ci0JCQlMaXN0IHBrZ3MgPSBwcm9jQ3R4LmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJCWZvciAoRU9iamVjdCBvYmogPSBwcm9jQ29tcDsgb2JqICE9IG51bGw7IG9iaiA9IG9iai5lQ29udGFpbmVyKCkpIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCQlwa2dzLmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJCXByb2NDdHguZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCQkKLQkJCXByb2Nlc3MuZ2V0VmFsaWRDb250ZXh0KCkuYWRkKHByb2NDdHgpOwotCQkJcHJvY2Vzcy5zZXRQcmVzZW50YXRpb24oQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotCQkJCQkuY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKHByb2Nlc3MpKTsKLQotCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkvLyBzYXZlIHRoZSByZXNvdXJjZSBvZiBwYXJlbnQgUHJvY2Vzc1BhY2thZ2UKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKEVPYmplY3QpIG93bmVyKS5lUmVzb3VyY2UoKTsKLQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBTZXJ2aWNlcy5nZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlcigpCi0JCQkJCQkJCS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQkvLyBzYXZlIHRoZSByZXNvdXJjZSBvZiBuZXdseSBjcmVhdGVkCi0JCQkJCQkJLy8gUHJvY2Vzc0NvbXBvbmVudCBhZ2FpbiBhZnRlciBjcmVhdGluZyBwcm9jZXNzJ3MKLQkJCQkJCQkvLyBwcmVzZW50YXRpb24KLQkJCQkJCQlwZXJzaXN0ZXIuc2F2ZShwcm9jQ29tcC5lUmVzb3VyY2UoKSk7Ci0KLQkJCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0KLQkJCQkJCQkvLyBzYXZlIHRoZSByZXNvdXJjZSBvZiB0aGUgcHJvY2VzcydzIGRlZmF1bHQKLQkJCQkJCQkvLyBjb250ZXh0Ci0JCQkJCQkJcGVyc2lzdGVyLnNhdmUocHJvY0N0eC5lUmVzb3VyY2UoKSk7Ci0KLQkJCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCQkJCi0JCQkJCQkJLy8gY3JlYXRlIG5ldyBkaWFncmFtIGZpbGUKLQkJCQkJCQkvLwotCQkJCQkJCQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGV4KTsKLQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlzdGF0dXMgPSBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkJCQl0aHJvdyBuZXcgTWVzc2FnZUV4Y2VwdGlvbigKLQkJCQkJCQkJCU5MUwotCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5zYXZlUHJvY2Vzc0Vycm9yX3JlYXNvbiwKLQkJCQkJCQkJCQkJCQlwcm9jQ29tcC5nZXROYW1lKCkpLCBlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0KLQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkucnVuV2l0aFByb2dyZXNzKAotCQkJCQkJCXJ1bm5hYmxlLAotCQkJCQkJCU1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmNyZWF0aW5nUHJvY2Vzc0NvbXBvbmVudFRhc2tfbmFtZSwKLQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgcHJvY0NvbXAuZ2V0TmFtZSgpIH0pKTsgCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlzdXBlci5yZWRvKCk7Ci0JCVByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSAoUHJvY2Vzc0NvbXBvbmVudCkgY2hpbGQ7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gcHJvY0N0eCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJaWYgKHByb2NDdHggaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkoKE1ldGhvZENvbmZpZ3VyYXRpb24pIHByb2NDdHgpLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQoCi0JCQkJCXByb2NDb21wKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBwcm9jQ3R4ID0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlpZiAocHJvY0N0eCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCSgoTWV0aG9kQ29uZmlndXJhdGlvbikgcHJvY0N0eCkuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLnJlbW92ZSgKLQkJCQkJY2hpbGQpOwotCQl9Ci0JCXN1cGVyLnVuZG8oKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlUm9sZURlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVJvbGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NDc3ZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlUm9sZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlJlZmVyZW5jZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLTsKLQotLyoqCi0gKiBEZWxldGUgcm9sZSBkZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZVJvbGVEZXNjcmlwdG9yIGV4dGVuZHMgUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kIHsKLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBSb2xlRGVzY3JpcHRvciByb2xlRGVzYzsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgTGlzdCBub3RVc2VkUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBmb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXM7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGVsZXRlUm9sZURlc2NyaXB0b3IoUm9sZURlc2NyaXB0b3Igcm9sZURlc2MpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLnJvbGVEZXNjID0gcm9sZURlc2M7Ci0KLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJcm9sZURlc2MsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChyb2xlRGVzYyk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJdGhpcy5hY3Rpdml0eSA9IChBY3Rpdml0eSkgcGFyZW50OwotCQl9Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQl9Ci0JCWlmIChyb2xlRGVzYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQocm9sZURlc2MuZVJlc291cmNlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIERlbGV0ZVJvbGVEZXNjcmlwdG9yKFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjLAotCQkJYm9vbGVhbiBmb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXMpIHsKLQkJdGhpcyhyb2xlRGVzYyk7Ci0JCXRoaXMuZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzID0gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJU2V0IHJlZkxpc3QgPSBuZXcgSGFzaFNldCgpOwotCi0JCS8vIGdldCBSb2xlRGVzY3JpcHRvciByZWxhdGlvbnNoaXBzIHJlZmVyZW5jZXMKLQkJTGlzdCBhc3Npc3RlZFRhc2tEZXNjcmlwdG9ycyA9IEFzc29jaWF0aW9uSGVscGVyLmdldEFzc2lzdGVkVGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKTsKLQkJTGlzdCBhZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0QWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYyk7Ci0JCUxpc3QgcHJpbWFyeVRhc2tEZXNjcmlwdG9ycyA9IEFzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpOwotCQlyZWZMaXN0LmFkZEFsbChhc3Npc3RlZFRhc2tEZXNjcmlwdG9ycyk7Ci0JCXJlZkxpc3QuYWRkQWxsKGFkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMpOwotCQlyZWZMaXN0LmFkZEFsbChwcmltYXJ5VGFza0Rlc2NyaXB0b3JzKTsKLQkJcmVmTGlzdC5hZGRBbGwocm9sZURlc2MuZ2V0UmVzcG9uc2libGVGb3IoKSk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdG9yID0gcmVmTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdG9yLm5leHQoKTsKLQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQlpZiAoIVByb2Nlc3NVdGlsLmNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMocm9sZURlc2MsCi0JCQkJCQkoRGVzY3JpcHRvcikgb2JqZWN0KSkgewotCQkJCQlpZiAoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhvYmplY3QpKSAvLyBjaGVjawotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZvcgotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGxvY2FsCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gZGVzY3JpcHRvcgotCQkJCQkJbm90VXNlZFJlZmVyZW5jZXMuYWRkKG9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCEobm90VXNlZFJlZmVyZW5jZXMuaXNFbXB0eSgpKSkgewotCQkJdHJ5IHsKLQkJCQlPYmplY3RbXSByZWZUb0JlRGVsZXRlZCA9IGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlcyA/IG5vdFVzZWRSZWZlcmVuY2VzCi0JCQkJCQkudG9BcnJheSgpCi0JCQkJCQk6IFJlZmVyZW5jZVNlbGVjdGlvbi5nZXRSZWZlcmVuY2VzKG5vdFVzZWRSZWZlcmVuY2VzLAotCQkJCQkJCQlyb2xlRGVzYyk7Ci0JCQkJCQkKLQkJCQkJCWRlbGV0ZShyZWZUb0JlRGVsZXRlZCk7Ci0JCQl9Ci0JCQljYXRjaChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJYWJvcnRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjbGVhciByZWxhdGlvbnNoaXBzCi0vLwkJY2xlYXIocm9sZURlc2MuZ2V0QXNzaXN0c0luKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhc3Npc3RlZFRhc2tEZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCXRkLmdldEFzc2lzdGVkQnkoKS5yZW1vdmUocm9sZURlc2MpOwotCQl9Ci0vLwkJY2xlYXIocm9sZURlc2MuZ2V0UGVyZm9ybXNBZGRpdGlvbmFsbHkoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQl0ZC5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLnJlbW92ZShyb2xlRGVzYyk7Ci0JCX0KLS8vCQljbGVhcihyb2xlRGVzYy5nZXRQZXJmb3Jtc0FzT3duZXIoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHByaW1hcnlUYXNrRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQl0ZC5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpLnJlbW92ZShyb2xlRGVzYyk7Ci0JCX0KLQkJY2xlYXIocm9sZURlc2MuZ2V0UmVzcG9uc2libGVGb3IoKSk7Ci0KLQkJLy8gaWYgcm9sZSBpcyBwYXJ0IG9mIGFueSB0ZWFtLCBwbGVhc2UgcmVtb3ZlIGl0IGZyb20gdGVhbSBhcyB3ZWxsCi0JCUxpc3QgdGVhbXMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRUZWFtUHJvZmlsZXMocm9sZURlc2MpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB0ZWFtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIGl0b3IubmV4dCgpOwotCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5yZW1vdmUocm9sZURlc2MpOwotCi0JCQkvLyBmaW5kIG1hdGNoaW5nIHJvbGVEZXNjcmlwdG9yIGluIHRlYW0gcm9sZXMKLQkJCU9iamVjdCB0ZWFtUm9sZURlc2MgPSBQcm9jZXNzVXRpbAotCQkJCQkuZmluZFJvbGVEZXNjcmlwdG9yKHRlYW0sIHJvbGVEZXNjKTsKLQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkucmVtb3ZlKHRlYW1Sb2xlRGVzYyk7Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyKExpc3QgbGlzdCkgewotCQl0cnkgewotCQkJaWYgKChsaXN0ICE9IG51bGwpICYmIChsaXN0LnNpemUoKSA+IDApKSB7Ci0KLQkJCQlsaXN0LmNsZWFyKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCi0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVUYXNrRGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlVGFza0Rlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNlYTkzMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVUYXNrRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuUmVmZXJlbmNlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotCi0KLS8qKgotICogRGVsZXRlIFRhc2sgZGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlVGFza0Rlc2NyaXB0b3IgZXh0ZW5kcyBSZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgewotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBMaXN0IG5vdFVzZWRSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBib29sZWFuIGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlczsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBEZWxldGVUYXNrRGVzY3JpcHRvcihUYXNrRGVzY3JpcHRvciB0YXNrRGVzYykgewotCQlzdXBlcigpOwotCi0JCXRoaXMudGFza0Rlc2MgPSB0YXNrRGVzYzsKLQotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQl0YXNrRGVzYywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHRhc2tEZXNjKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQl0aGlzLmFjdGl2aXR5ID0gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JCX0KLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJaWYgKHRhc2tEZXNjLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZCh0YXNrRGVzYy5lUmVzb3VyY2UoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRGVsZXRlVGFza0Rlc2NyaXB0b3IoVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MsCi0JCQlib29sZWFuIGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlcykgewotCQl0aGlzKHRhc2tEZXNjKTsKLQkJdGhpcy5mb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXMgPSBmb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlTZXQgcmVmTGlzdCA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJLy8gZ2V0IFRhc2tEZXNjcmlwdG9yIHJlbGF0aW9uc2hpcHMgcmVmZXJlbmNlcwotCQlyZWZMaXN0LmFkZEFsbCh0YXNrRGVzYy5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJcmVmTGlzdC5hZGRBbGwodGFza0Rlc2MuZ2V0QXNzaXN0ZWRCeSgpKTsKLQkJcmVmTGlzdC5hZGQodGFza0Rlc2MuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSk7Ci0JCXJlZkxpc3QuYWRkQWxsKHRhc2tEZXNjLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQlyZWZMaXN0LmFkZEFsbCh0YXNrRGVzYy5nZXRFeHRlcm5hbElucHV0KCkpOwotCQlyZWZMaXN0LmFkZEFsbCh0YXNrRGVzYy5nZXRPcHRpb25hbElucHV0KCkpOwotCQlyZWZMaXN0LmFkZEFsbCh0YXNrRGVzYy5nZXRPdXRwdXQoKSk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdG9yID0gcmVmTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdG9yLm5leHQoKTsKLQotCQkJLy8gY2hlY2sgYWxsIGl0J3MgcmVmZXJlbmNlcwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQlpZiAoIVByb2Nlc3NVdGlsLmNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXModGFza0Rlc2MsCi0JCQkJCQkoRGVzY3JpcHRvcikgb2JqZWN0KSkgewotCQkJCQlpZiAoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhvYmplY3QpKSAvLyBjaGVjawotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZvcgotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGxvY2FsCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gZGVzY3JpcHRvcgotCQkJCQkJbm90VXNlZFJlZmVyZW5jZXMuYWRkKG9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCEobm90VXNlZFJlZmVyZW5jZXMuaXNFbXB0eSgpKSkgewotCQkJdHJ5IHsKLQkJCQlPYmplY3RbXSByZWZUb0JlRGVsZXRlZCA9IGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlcyA/IG5vdFVzZWRSZWZlcmVuY2VzCi0JCQkJCQkudG9BcnJheSgpCi0JCQkJCQk6IFJlZmVyZW5jZVNlbGVjdGlvbi5nZXRSZWZlcmVuY2VzKG5vdFVzZWRSZWZlcmVuY2VzLAotCQkJCQkJCQl0YXNrRGVzYyk7Ci0JCQkJCQkKLQkJCQkJCWRlbGV0ZShyZWZUb0JlRGVsZXRlZCk7Ci0JCQl9Ci0JCQljYXRjaChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJYWJvcnRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjbGVhciBvdXQgYWxsIHRhc2tkZXNjcmlwdG9yIHJlbGF0aW9uc2hpcAotCQljbGVhcih0YXNrRGVzYy5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJY2xlYXIodGFza0Rlc2MuZ2V0QXNzaXN0ZWRCeSgpKTsKLQkJY2xlYXIodGFza0Rlc2MuZ2V0TWFuZGF0b3J5SW5wdXQoKSk7Ci0JCWNsZWFyKHRhc2tEZXNjLmdldEV4dGVybmFsSW5wdXQoKSk7Ci0JCWNsZWFyKHRhc2tEZXNjLmdldE9wdGlvbmFsSW5wdXQoKSk7Ci0JCWNsZWFyKHRhc2tEZXNjLmdldE91dHB1dCgpKTsKLQkJY2xlYXIodGFza0Rlc2MuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSk7Ci0KLQkJcmVkbygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhcihMaXN0IGxpc3QpIHsKLQkJdHJ5IHsKLQkJCWlmICgobGlzdCAhPSBudWxsKSAmJiAobGlzdC5zaXplKCkgPiAwKSkgewotCQkJCWxpc3QuY2xlYXIoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVRlYW1Qcm9maWxlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVUZWFtUHJvZmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzM4YTE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVRlYW1Qcm9maWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlVGVhbVByb2ZpbGUgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIFRlYW1Qcm9maWxlIHRlYW07Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGVsZXRlVGVhbVByb2ZpbGUoVGVhbVByb2ZpbGUgdGVhbSkgewotCQlzdXBlcigpOwotCi0JCXRoaXMudGVhbSA9IHRlYW07Ci0KLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudEFjdGl2aXR5KHRlYW0pOwotCi0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJdGhpcy5hY3Rpdml0eSA9IChBY3Rpdml0eSkgcGFyZW50OwotCQl9Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQl9Ci0JCWlmICh0ZWFtLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZCh0ZWFtLmVSZXNvdXJjZSgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gZ2V0IGFsbCBzdWJ0ZWFtIHJlY3Vyc2l2ZWx5Ci0JCUxpc3QgdGVhbUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldFN1YlRlYW1zKHRlYW0sIHRlYW1MaXN0KTsKLQotCQl0ZWFtTGlzdC5hZGQodGVhbSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZWFtTGlzdC5zaXplKCk7IGkrKykgewotCQkJVGVhbVByb2ZpbGUgdHQgPSAoVGVhbVByb2ZpbGUpIHRlYW1MaXN0LmdldChpKTsKLQkJCS8vIGNsZWFyIHRlYW0ncyByb2xlZGVzY3JpcHRvcgotCQkJdHQuZ2V0VGVhbVJvbGVzKCkuY2xlYXIoKTsKLQkJfQotCi0JCXJlZG8oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0U3ViVGVhbXMoVGVhbVByb2ZpbGUgdGVhbSwgTGlzdCB0ZWFtTGlzdCkgewotCQlMaXN0IGxpc3QgPSB0ZWFtLmdldFN1YlRlYW0oKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlUZWFtUHJvZmlsZSB0dCA9IChUZWFtUHJvZmlsZSkgaXRvci5uZXh0KCk7Ci0JCQkJdGVhbUxpc3QuYWRkKHR0KTsKLQkJCQlnZXRTdWJUZWFtcyh0dCwgdGVhbUxpc3QpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHBhcmVudCBhY3Rpdml0eSBmb3IgYnJlYWtkb3duZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBickVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0UGFyZW50QWN0aXZpdHkoQnJlYWtkb3duRWxlbWVudCBickVsZW1lbnQpIHsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoYnJFbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlickVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50OwotCQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChickVsZW1lbnQsCi0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2Mzk3MWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUludGVyYWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQWRhcHRlckZhY3RvcnlJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIENvbW1hbmQgZm9yIGNsZWFuLXVwIHVudXNlZCBkZXNjcmlwdG9ycwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kIGV4dGVuZHMgQ29tcG91bmRDb21tYW5kIAotaW1wbGVtZW50cyBJSW50ZXJhY3RpdmUKLXsKLQlwcml2YXRlIENvbGxlY3Rpb24gZWxlbWVudHM7Ci0JcHJpdmF0ZSBMaXN0IGRlc2NyaXB0b3JzVG9EZWxldGU7Ci0JcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVDaGlsZHJlbjsKLQlwcml2YXRlIENvbGxlY3Rpb24gZGVsZXRlZERlc2NyaXB0b3JzOwotCXByaXZhdGUgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdXNlckludGVyYWN0aW9uSGFuZGxlcjsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50cyBsaXN0IG9mIGVsZW1lbnRzIHRvIGNoZWNrIGZvciB1bnVzZWQgZGVzY3JpcHRvcnMgdG8gZGVsZXRlIAotCSAqIEBwYXJhbSBpbmNsdWRlQ2hpbGRyZW4gaWYgPGNvZGU+dHJ1ZTwvY29kZT4gd2lsbCBjaGVjayB0aGUgb2Zmc3RyaW5nIG9mIGFjdGl2aXRpZXMgaW4gdGhlIGdpdmVuIGVsZW1lbnRzCi0JICovCi0JcHVibGljIERlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZChDb2xsZWN0aW9uIGVsZW1lbnRzLCBib29sZWFuIGluY2x1ZGVDaGlsZHJlbiwgQ29sbGVjdGlvbiBkZWxldGVkRGVzY3JpcHRvcnMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOwotCQl0aGlzLmluY2x1ZGVDaGlsZHJlbiA9IGluY2x1ZGVDaGlsZHJlbjsKLQkJdGhpcy5kZWxldGVkRGVzY3JpcHRvcnMgPSBkZWxldGVkRGVzY3JpcHRvcnM7Ci0JfQotCQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIHNwZWNpZmllZCBlbGVtZW50cy4gU3ViY2xhc3NzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHJldHVybiB0aGUgZXhlY3V0ZWQgY29tbWFuZCB0aGF0IGRlbGV0ZWQgdGhlIGdpdmVuIGVsZW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbW1hbmQgZGVsZXRlKExpc3QgZWxlbWVudHMpOwotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIGZpbmQgYWxsIHJvbGUgYW5kIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyB0aGF0IGFyZSBub3QgdXNlZAotCQkvLyBpbiBhbnkgcmVsYXRpb25zaGlwCi0JCS8vIGFuZCBkZWxldGUgdGhlbQotCQkvLwotCQlpZiAoZGVzY3JpcHRvcnNUb0RlbGV0ZSA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9yc1RvRGVsZXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSXRlcmF0b3IgaXRlcjsKLQkJCWlmKGluY2x1ZGVDaGlsZHJlbikgewotCQkJCWl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZWxlbWVudHMsIGZhbHNlKSB7Ci0JCQkJCQotCQkJCQkKLQkJCQkJLyoqCi0JCQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkJCSAqLwotCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0NzE4ODg5NDA5NDAzMTQxNzA3TDsKLQkJCQkJCi0JCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQlpZiAob2JqZWN0ID09IGVsZW1lbnRzKSB7Ci0JCQkJCQkJcmV0dXJuIGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JCQkJCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJcmV0dXJuICgoQWN0aXZpdHkpIG9iamVjdCkKLQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCX07Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsKLQkJCX0KLQkJCUFycmF5TGlzdCBjdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmKGRlbGV0ZWREZXNjcmlwdG9ycyAhPSBudWxsKSB7Ci0JCQkJLy8gYWRkIGRlbGV0ZWQgZGVzY3JpcHRvcnMgdG8gdGhlIGxpc3QgYmVmb3JlIGNoZWNraW5nIGZvciB1bnVzZWQgZGVzY3JpcHRvcnMKLQkJCQkvLyB0aG9zZSBkZWxldGVkIGRlc2NyaXB0b3JzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IGFmdGVyIHRoZSBjaGVjawotCQkJCS8vCi0JCQkJY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUuYWRkQWxsKGRlbGV0ZWREZXNjcmlwdG9ycyk7Ci0JCQl9Ci0JCQlmb3IgKDsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCWlmICghUHJvY2Vzc1V0aWwuY2hlY2tEZXNjcmlwdG9yUmVmZXJlbmNlcygKLQkJCQkJCQljdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZSwgKERlc2NyaXB0b3IpIGVsZW1lbnQpKSB7Ci0JCQkJCQljdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZS5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZS5yZW1vdmVBbGwoZGVsZXRlZERlc2NyaXB0b3JzKTsKLQkJCWlmICghY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUuaXNFbXB0eSgpKSB7Ci0JCQkJc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZShjdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZSk7Ci0JCQkJaWYoIWN1cnJlbnREZXNjcmlwdG9yc1RvRGVsZXRlLmlzRW1wdHkoKSkgewotCQkJCQlDb21tYW5kIGNtZCA9IGRlbGV0ZShjdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZSk7Ci0JCQkJCWlmIChjbWQgIT0gbnVsbCkgewotCQkJCQkJY29tbWFuZExpc3QuYWRkKGNtZCk7Ci0JCQkJCQlkZXNjcmlwdG9yc1RvRGVsZXRlLmFkZEFsbChjdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZighZGVzY3JpcHRvcnNUb0RlbGV0ZS5pc0VtcHR5KCkpIHsKLQkJCQljb21tYW5kTGlzdC5jbGVhcigpOwotCQkJCWFwcGVuZChkZWxldGUoZGVzY3JpcHRvcnNUb0RlbGV0ZSkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlKExpc3QgZGVzY3JpcHRvcnNUb0RlbGV0ZSkgewotCQlpZih1c2VySW50ZXJhY3Rpb25IYW5kbGVyICE9IG51bGwpIHsKLQkJCUlJdGVtTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5SXRlbUxhYmVsUHJvdmlkZXIoCi0JCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy51aV9yZWZlcmVuY2VzOwotCQkJU3RyaW5nIG1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnNlbGVjdERlc2NyaXB0b3JzVG9EZWxldGVfbXNnOwkJCQotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChkZXNjcmlwdG9yc1RvRGVsZXRlKTsKLQkJCUNvbGxlY3Rpb24gc2VsZWN0ZWQgPSB1c2VySW50ZXJhY3Rpb25IYW5kbGVyLnNlbGVjdChsaXN0LCBsYWJlbFByb3ZpZGVyLCB0cnVlLCBsaXN0LCB0aXRsZSwgbXNnKTsKLQkJCWlmKHNlbGVjdGVkID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWRlc2NyaXB0b3JzVG9EZWxldGUucmV0YWluQWxsKHNlbGVjdGVkKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JSW50ZXJhY3RpdmUjc2V0VXNlckludGVyYWN0aW9uSGFuZGxlcihvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlckludGVyYWN0aW9uSGFuZGxlcihJVXNlckludGVyYWN0aW9uSGFuZGxlciBoYW5kbGVyKSB7Ci0JCXVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgPSBoYW5kbGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMzJhMzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlJlZmVyZW5jZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogRGVsZXRlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVXb3JrUHJvZHVjdERlc2NyaXB0b3IgZXh0ZW5kcyBSZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgewotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2M7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIExpc3Qgbm90VXNlZFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERlbGV0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcihXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy53cERlc2MgPSB3cERlc2M7Ci0KLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJd3BEZXNjLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQod3BEZXNjKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQl0aGlzLmFjdGl2aXR5ID0gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JCX0KLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJaWYgKHdwRGVzYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQod3BEZXNjLmVSZXNvdXJjZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBEZWxldGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYywKLQkJCWJvb2xlYW4gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzKSB7Ci0JCXRoaXMod3BEZXNjKTsKLQkJdGhpcy5mb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXMgPSBmb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlTZXQgcmVmTGlzdCA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJTGlzdCBtYW5kYXRvcnlJbnB1dFRvID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0TWFuZGF0b3J5SW5wdXRUbyh3cERlc2MpOwotCQlMaXN0IGV4dGVybmFsSW5wdXRUbyA9IEFzc29jaWF0aW9uSGVscGVyLmdldEV4dGVybmFsSW5wdXRUbyh3cERlc2MpOwotCQlMaXN0IG9wdGlvbmFsSW5wdXRUbyA9IEFzc29jaWF0aW9uSGVscGVyLmdldE9wdGlvbmFsSW5wdXRUbyh3cERlc2MpOwotCQlMaXN0IG91dHB1dEZyb20gPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRPdXRwdXRGcm9tKHdwRGVzYyk7Ci0JCUxpc3QgcmVzcG9uc2libGVSb2xlRGVzY0xpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRSZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9ycyh3cERlc2MpOwotCQkvLyBnZXQgV29ya1Byb2R1Y3REZXNjcmlwdG9yIHJlbGF0aW9uc2hpcHMgcmVmZXJlbmNlcwotCQlyZWZMaXN0LmFkZEFsbCh3cERlc2MuZ2V0SW1wYWN0ZWRCeSgpKTsKLQkJcmVmTGlzdC5hZGRBbGwod3BEZXNjLmdldEltcGFjdHMoKSk7Ci0JCXJlZkxpc3QuYWRkQWxsKG1hbmRhdG9yeUlucHV0VG8pOwotCQlyZWZMaXN0LmFkZEFsbChleHRlcm5hbElucHV0VG8pOwotCQlyZWZMaXN0LmFkZEFsbChvcHRpb25hbElucHV0VG8pOwotCQlyZWZMaXN0LmFkZEFsbChvdXRwdXRGcm9tKTsKLQkJcmVmTGlzdC5hZGQocmVzcG9uc2libGVSb2xlRGVzY0xpc3QpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHJlZkxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0KLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKCFQcm9jZXNzVXRpbC5jaGVja0Rlc2NyaXB0b3JSZWZlcmVuY2VzKHdwRGVzYywKLQkJCQkJCShEZXNjcmlwdG9yKSBvYmplY3QpKSB7Ci0JCQkJCWlmIChhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmNvbnRhaW5zKG9iamVjdCkpIC8vIGNoZWNrCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gZm9yCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gbG9jYWwKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBkZXNjcmlwdG9yCi0JCQkJCQlub3RVc2VkUmVmZXJlbmNlcy5hZGQob2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIShub3RVc2VkUmVmZXJlbmNlcy5pc0VtcHR5KCkpKSB7Ci0JCQl0cnkgewotCQkJCU9iamVjdFtdIHJlZlRvQmVEZWxldGVkID0gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzID8gbm90VXNlZFJlZmVyZW5jZXMKLQkJCQkJCS50b0FycmF5KCkKLQkJCQkJCTogUmVmZXJlbmNlU2VsZWN0aW9uLmdldFJlZmVyZW5jZXMobm90VXNlZFJlZmVyZW5jZXMsCi0JCQkJCQkJCXdwRGVzYyk7Ci0JCQkJCQlkZWxldGUocmVmVG9CZURlbGV0ZWQpOwotCQkJfQotCQkJY2F0Y2goT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCWFib3J0ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgd2hldGhlciB3cGRlc2MgYXJ0aWZhY3QgaGFzIGFueSBzdWItYXJ0aWZhY3RzCi0JCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICh3cERlc2MuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgd3BEZXNjLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQlMaXN0IGxpc3QgPSBhcnRpZmFjdC5nZXRDb250YWluZWRBcnRpZmFjdHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCU9iamVjdCBkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcih3cERlc2MsIChBcnRpZmFjdCkgbGlzdAotCQkJCQkJLmdldChpKSk7Ci0JCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQljaGlsZHJlbi5hZGQoZGVzY3JpcHRvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJTGlzdCBvYmplY3RzVG9DbGVhcmVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlvYmplY3RzVG9DbGVhcmVkLmFkZCh3cERlc2MpOwotCQlvYmplY3RzVG9DbGVhcmVkLmFkZEFsbChjaGlsZHJlbik7Ci0KLQkJZm9yIChJdGVyYXRvciBpdG9yID0gb2JqZWN0c1RvQ2xlYXJlZC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjT2JqID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqOwotCi0JCQkJLy8gd3BEZXNjT2JqLmdldEltcGFjdGVkQnkoKS5jbGVhcigpOwotCQkJCS8vIHdwRGVzY09iai5nZXRJbXBhY3RzKCkuY2xlYXIoKTsKLQkJCQkvLyB3cERlc2NPYmouZ2V0TWFuZGF0b3J5SW5wdXRUbygpLmNsZWFyKCk7Ci0JCQkJLy8gd3BEZXNjT2JqLmdldEV4dGVybmFsSW5wdXRUbygpLmNsZWFyKCk7Ci0JCQkJLy8gd3BEZXNjT2JqLmdldE9wdGlvbmFsSW5wdXRUbygpLmNsZWFyKCk7Ci0JCQkJLy8gd3BEZXNjT2JqLmdldE91dHB1dEZyb20oKS5jbGVhcigpOwotCQkJCS8vIHdwRGVzY09iai5nZXRXb3JrZWRPbkJ5KCkuY2xlYXIoKTsKLQkJCQljbGVhcih3cERlc2NPYmouZ2V0SW1wYWN0ZWRCeSgpKTsKLQkJCQljbGVhcih3cERlc2NPYmouZ2V0SW1wYWN0cygpKTsKLS8vCQkJCWNsZWFyKHdwRGVzY09iai5nZXRFeHRlcm5hbElucHV0VG8oKSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZXh0ZXJuYWxJbnB1dFRvLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJdGQuZ2V0RXh0ZXJuYWxJbnB1dCgpLnJlbW92ZSh3cERlc2NPYmopOwotCQkJCX0KLS8vCQkJCWNsZWFyKHdwRGVzY09iai5nZXRNYW5kYXRvcnlJbnB1dFRvKCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1hbmRhdG9yeUlucHV0VG8uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCQl0ZC5nZXRNYW5kYXRvcnlJbnB1dCgpLnJlbW92ZSh3cERlc2NPYmopOwotCQkJCX0KLS8vCQkJCWNsZWFyKHdwRGVzY09iai5nZXRPcHRpb25hbElucHV0VG8oKSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb3B0aW9uYWxJbnB1dFRvLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJdGQuZ2V0T3B0aW9uYWxJbnB1dCgpLnJlbW92ZSh3cERlc2NPYmopOwotCQkJCX0KLS8vCQkJCWNsZWFyKHdwRGVzY09iai5nZXRPdXRwdXRGcm9tKCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG91dHB1dEZyb20uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCQl0ZC5nZXRPdXRwdXQoKS5yZW1vdmUod3BEZXNjT2JqKTsKLQkJCQl9Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzcG9uc2libGVSb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCQlyb2xlRGVzYy5nZXRSZXNwb25zaWJsZUZvcigpLnJlbW92ZSh3cERlc2NPYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHRoaXMuYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmUod3BEZXNjKTsKLQotCQlyZWRvKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyKExpc3QgbGlzdCkgewotCQl0cnkgewotCQkJaWYgKChsaXN0ICE9IG51bGwpICYmIChsaXN0LnNpemUoKSA+IDApKQotCQkJCWxpc3QuY2xlYXIoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0RGVzY3JpcHRvcihPYmplY3QgcGFyZW50RGVzY3JpcHRvciwgQXJ0aWZhY3QgYXJ0aWZhY3QpIHsKLQkJLy8gQWN0aXZpdHkgYWN0aXZpdHkgPSBnZXRBY3Rpdml0eShwYXJlbnREZXNjcmlwdG9yKTsKLQkJaWYgKGFjdGl2aXR5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTGlzdCBsaXN0ID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBsaXN0LmdldChpKTsKLQkJCWlmICgob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKQotCQkJCQkmJiAoYXJ0aWZhY3QgPT0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaikKLQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKSkpIHsKLQkJCQlyZXR1cm4gb2JqOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVzY3JpcHRvclN5bmNocm9uaXplQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVzY3JpcHRvclN5bmNocm9uaXplQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODUwOTRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Rlc2NyaXB0b3JTeW5jaHJvbml6ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLQotLyoqCi0gKiBDb21tYW5kIHRvIHN5bmNocm9uaXplIGRlc2NyaXB0b3IncyBhdHRyaWJ1dGVzIGFuZCBvd24gcmVmZXJlbmNlcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEZlYiAxLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvclN5bmNocm9uaXplQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRvclN5bmNocm9uaXplQ29tbWFuZCgpIHsKLQkJc3VwZXIoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JTeW5jaHJvbml6ZUNvbW1hbmQoU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JTeW5jaHJvbml6ZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZXNjcmlwdG9yVXBkYXRlQmF0Y2hDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZXNjcmlwdG9yVXBkYXRlQmF0Y2hDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NGVjYzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVzY3JpcHRvclVwZGF0ZUJhdGNoQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5CYXRjaENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gRmViIDksIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yVXBkYXRlQmF0Y2hDb21tYW5kIGV4dGVuZHMgQmF0Y2hDb21tYW5kIHsKLQlwcml2YXRlIFNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaDsKLQlwcml2YXRlIENvbXBvdW5kQ29tbWFuZCByZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kOwotCXByaXZhdGUgU2V0IHN5bmNoRmVhdHVyZXM7Ci0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkKLQkvKioKLQkgKiBAcGFyYW0gY2xlYXIKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRvclVwZGF0ZUJhdGNoQ29tbWFuZChib29sZWFuIGNsZWFyLCBTZXQgc3luY2hGZWF0dXJlcywgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJc3VwZXIoY2xlYXIpOwotCQl0aGlzLnN5bmNoRmVhdHVyZXMgPSBzeW5jaEZlYXR1cmVzOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldERlc2NyaXB0b3JzVG9SZWZyZXNoKCkgewotCQlpZihkZXNjcmlwdG9yc1RvUmVmcmVzaCA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9yc1RvUmVmcmVzaCA9IG5ldyBIYXNoU2V0KCk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3JzVG9SZWZyZXNoOwotCX0KLQkKLQl2b2lkIHNldERlc2NyaXB0b3JzVG9SZWZyZXNoKFNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaCkgewotCQl0aGlzLmRlc2NyaXB0b3JzVG9SZWZyZXNoID0gZGVzY3JpcHRvcnNUb1JlZnJlc2g7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkJhdGNoQ29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5jbGVhcigpOwotCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2ggPSBudWxsOwotCQl9Ci0JCQotCQlpZihyZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kICE9IG51bGwpIHsKLQkJCXJlZnJlc2hEZXNjcmlwdG9yc0NvbW1hbmQuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5CYXRjaENvbW1hbmQjY2FuRXhlY3V0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKSB8fCAoZGVzY3JpcHRvcnNUb1JlZnJlc2ggIT0gbnVsbCAmJiAhZGVzY3JpcHRvcnNUb1JlZnJlc2guaXNFbXB0eSgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkJhdGNoQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlzdXBlci5leGVjdXRlKCk7Ci0JCQotCQkvLyBjcmVhdGUgcmVmcmVzaERlc2NyaXB0b3JzQ29tbWFuZAotCQkvLwotCQlpZihkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsICYmICFkZXNjcmlwdG9yc1RvUmVmcmVzaC5pc0VtcHR5KCkKLQkJCQkmJiByZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kID09IG51bGwpIHsKLQkJCXJlZnJlc2hEZXNjcmlwdG9yc0NvbW1hbmQgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZXNjcmlwdG9yc1RvUmVmcmVzaC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlEZXNjcmlwdG9yIGRlc2MgPSAoRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJcmVmcmVzaERlc2NyaXB0b3JzQ29tbWFuZC5hcHBlbmQobmV3IEJhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZChkZXNjLCBzeW5jaEZlYXR1cmVzLCBjb25maWcpKTsJCQkJCi0JCQl9Ci0JCX0KLQotCQkvLyByZWZyZXNoIGRlc2NyaXB0b3JzCi0JCS8vCi0JCWlmKHJlZnJlc2hEZXNjcmlwdG9yc0NvbW1hbmQgIT0gbnVsbCkgewotCQkJcmVmcmVzaERlc2NyaXB0b3JzQ29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkJhdGNoQ29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZihyZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kICE9IG51bGwpIHsKLQkJCXJlZnJlc2hEZXNjcmlwdG9yc0NvbW1hbmQudW5kbygpOwotCQl9Ci0JCQotCQlzdXBlci51bmRvKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvR2VuZXJpY0Ryb3BDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9HZW5lcmljRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2OThmMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9HZW5lcmljRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLQotLyoqCi0gKiBEcm9wIGNvbW1hbmQgdG8gZHJvcCBhbnkgb2JqZWN0IG9uIGEgdGFyZ2V0IHRoYXQgc3VwcG9ydHMgYWRhcHRpbmcgZHJvcAotICogb2JqZWN0IHRvIGl0cyBvd24gb2JqZWN0LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0Ryb3BDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBkcm9wRWxlbWVudHM7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBmZWF0dXJlRWxlbWVudHM7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIEVPYmplY3QgdGFyZ2V0OwotCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCXByaXZhdGUgRWxlbWVudEFkYXB0ZXIgZHJvcEFkYXB0ZXI7Ci0KLQlwdWJsaWMgR2VuZXJpY0Ryb3BDb21tYW5kKEVPYmplY3QgdGFyZ2V0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCUNvbGxlY3Rpb24gZHJvcEVsZW1lbnRzLCBFbGVtZW50QWRhcHRlciBkcm9wQWRhcHRlcikgewotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJdGhpcy5kcm9wRWxlbWVudHMgPSBkcm9wRWxlbWVudHM7Ci0JCXRoaXMuZHJvcEFkYXB0ZXIgPSBkcm9wQWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjcHJlcGFyZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gY29tcGlsZSB0aGUgZmVhdHVyZUVsZW1lbnRzIGxpc3QKLQkJLy8KLQkJZmVhdHVyZUVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkcm9wRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWVsZW1lbnQgPSBkcm9wQWRhcHRlci5hZGFwdChlbGVtZW50KTsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQlmZWF0dXJlRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJfQotCQkJLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCS8vIGlmKGNyZWF0ZURlc2NyaXB0b3IpIHsKLQkJCS8vIGZlYXR1cmVFbGVtZW50cy5hZGQoUHJvY2Vzc1V0aWwuY3JlYXRlUm9sZURlc2NyaXB0b3IoKFJvbGUpCi0JCQkvLyBlbGVtZW50KSk7Ci0JCQkvLyB9Ci0JCQkvLyBlbHNlIHsKLQkJCS8vIGZlYXR1cmVFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlpZiAoIWZlYXR1cmVFbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCSgoTGlzdCkgdGFyZ2V0LmVHZXQoZmVhdHVyZSkpLmFkZEFsbChmZWF0dXJlRWxlbWVudHMpOwotCQkJaWYgKHRhcmdldC5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5hZGQodGFyZ2V0LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkoKExpc3QpIHRhcmdldC5lR2V0KGZlYXR1cmUpKS5yZW1vdmVBbGwoZmVhdHVyZUVsZW1lbnRzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBmZWF0dXJlRWxlbWVudHM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRWxlbWVudEFkYXB0ZXIgewotCQkvKioKLQkJICogQWRhcHRzIHRoZSBkcm9wIGVsZW1lbnQgdG8gdGhlIHJpZ2h0IGVsZW1lbnQgZm9yIHRoZSBkcm9wIHRhcmdldC4KLQkJICogCi0JCSAqIEBwYXJhbSBkcm9wRWxlbWVudAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlPYmplY3QgYWRhcHQoT2JqZWN0IGRyb3BFbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0lBY3Rpb25UeXBlQ29uc3RhbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9JQWN0aW9uVHlwZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTU4YTFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0lBY3Rpb25UeXBlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotcHVibGljIGNsYXNzIElBY3Rpb25UeXBlQ29uc3RhbnRzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERF9QUklNQVJZX1BFUkZPUk1FUiA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfQURESVRJT05BTF9QRVJGT1JNRVIgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREX0FTU0lTVEVEX0JZID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERF9FWFRFUk5BTF9JTlBVVCA9IDM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfTUFOREFUT1JZX0lOUFVUID0gNDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERF9PUFRJT05BTF9JTlBVVCA9IDU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfT1VUUFVUID0gNjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERF9SRVNQT05TSUJMRV9GT1IgPSA3OwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTGlua01ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9MaW5rTWV0aG9kRWxlbWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ0NGRlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9MaW5rTWV0aG9kRWxlbWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBDb21tYW5kIGZvciBsaW5raW5nIG1ldGhvZCBlbGVtZW50IHRvIGRlc2NyaXB0b3IKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgTGlua01ldGhvZEVsZW1lbnRDb21tYW5kIGV4dGVuZHMgQWRkTWV0aG9kRWxlbWVudENvbW1hbmQgewotCi0JcHJpdmF0ZSBEZXNjcmlwdG9yIGRlc2M7Ci0KLQlwcml2YXRlIE9iamVjdCBvYmo7Ci0KLQlwcml2YXRlIExpc3Qgb2JqZWN0czsKLQotCXByaXZhdGUgaW50IGZlYXR1cmVJRDsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCS8qKgotCSAqIEFzc2lnbiByb2xlIHRvIHRhc2sgZGVzY3JpcHRvciBVc2VkIGZvciBib3RoIGFkZGl0aW9uYWxseSBwZXJmb3JtZWQgYnkKLQkgKiBhbmQgYXNzaXN0ZWQgYnkKLQkgKi8KLQlwdWJsaWMgTGlua01ldGhvZEVsZW1lbnRDb21tYW5kKERlc2NyaXB0b3IgZGVzYywgT2JqZWN0IG9iaiwgaW50IGZlYXR1cmVJRCkgewotCi0JCXN1cGVyKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhkZXNjKSk7Ci0KLQkJdGhpcy5kZXNjID0gZGVzYzsKLQkJdGhpcy5vYmogPSBvYmo7Ci0JCXRoaXMuZmVhdHVyZUlEID0gZmVhdHVyZUlEOwotCi0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJb2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCW9iamVjdHMuYWRkKG9iaik7Ci0JCX0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCi0JCWlmIChkZXNjID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBub3QgdGhlcmUgYWxyZWFkeQotCQlpZiAoIXN1cGVyLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24ob2JqZWN0cykpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFvYmplY3RzLmlzRW1wdHkoKSkKLQkJCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0s6Ci0JCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5zZXRUYXNrKChUYXNrKSBvYmopOwotCQkJYnJlYWs7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEU6Ci0JCQkoKFJvbGVEZXNjcmlwdG9yKSBkZXNjKS5zZXRSb2xlKChSb2xlKSBvYmopOwotCQkJYnJlYWs7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUOgotCQkJKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlc2MpLnNldFdvcmtQcm9kdWN0KChXb3JrUHJvZHVjdCkgb2JqKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKCFvYmplY3RzLmlzRW1wdHkoKSkgewotCQkJLy8gYmFzaWNhbGx5IHJlbW92ZSBmcm9tIGNvbmZpZ3VyYXRpb24gaWYgYW55dGhpbmcgd2FzIGFkZGVkCi0JCQlzdXBlci51bmRvKCk7Ci0KLQkJCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLnNldFRhc2sobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJCSgoUm9sZURlc2NyaXB0b3IpIGRlc2MpLnNldFJvbGUobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVDoKLQkJCQkoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZGVzYykuc2V0V29ya1Byb2R1Y3QobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKGRlc2MuZVJlc291cmNlKCkgIT0gbnVsbCAmJiAhb2JqZWN0cy5pc0VtcHR5KCkpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChkZXNjLmVSZXNvdXJjZSgpKTsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTG9jYWxseVJlcGxhY2VBbmREZWVwQ29weUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0xvY2FsbHlSZXBsYWNlQW5kRGVlcENvcHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NzI5NDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTG9jYWxseVJlcGxhY2VBbmREZWVwQ29weUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5BY3Rpdml0eUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdWwgNiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIExvY2FsbHlSZXBsYWNlQW5kRGVlcENvcHlDb21tYW5kIGV4dGVuZHMgUmVwbGFjZUFjdGl2aXR5Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqLwotCXB1YmxpYyBMb2NhbGx5UmVwbGFjZUFuZERlZXBDb3B5Q29tbWFuZChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCXN1cGVyKHdyYXBwZXIpOwkJCi0JCXNldExhYmVsKExpYnJhcnlFZGl0UmVzb3VyY2VzLmxvY2FsUmVwbGFjZW1lbnRBbmREZWVwQ29weV90ZXh0KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUmVwbGFjZUFjdGl2aXR5Q29tbWFuZCNkb1ZhcnkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVmFyeSgpIHsKLQkJLy8gZGVlcCBjb3B5IHRoZSBhY3Rpdml0eQotCQkvLwotCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCWlmKCFVc2VySW50ZXJhY3Rpb25IZWxwZXIuY29uZmlybURlZXBDb3B5KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoYWN0aXZpdHkpKSkgewotCQkJcmV0dXJuOwotCQl9CQkKLQkJUHJvY2VzcyB0YXJnZXRQcm9jZXNzID0gKFByb2Nlc3MpIHdyYXBwZXIuZ2V0VG9wSXRlbSgpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZXBDb3B5Q29uZmlnID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRlZXBDb3B5Q29uZmlnID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNob29zZURlZXBDb3B5Q29uZmlndXJhdGlvbih0YXJnZXRQcm9jZXNzLCB3cmFwcGVyLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQl9Ci0JCWNhdGNoKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlBY3Rpdml0eUhhbmRsZXIgYWN0aXZpdHlIYW5kbGVyID0gbmV3IEFjdGl2aXR5SGFuZGxlcigpOwotCQlhY3Rpdml0eUhhbmRsZXIuc2V0RGVlcENvcHlDb25maWcoZGVlcENvcHlDb25maWcpOwotCQlhY3Rpdml0eUhhbmRsZXIuc2V0VGFyZ2V0UHJvY2Vzcyh0YXJnZXRQcm9jZXNzKTsKLQkJYWN0aXZpdHlIYW5kbGVyLmRlZXBDb3B5KGFjdGl2aXR5KTsKLQkJQWN0aXZpdHkgY29weSA9IChBY3Rpdml0eSkgYWN0aXZpdHlIYW5kbGVyLmdldEFjdGl2aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlzdXBlci5kb1ZhcnkoKTsKLQkJCi0JCS8vIHJlcGxhY2UgdGhlIGxvY2FsIHJlcGxhY2VtZW50IHdpdGggZGVlcCBjb3B5Ci0JCS8vCi0JCWludCBwb3MgPSBjcmVhdGVkQWN0aXZpdGllcy5zaXplKCkgLSAxOwotCQlBY3Rpdml0eSBsb2NhbFJlcGxhY2VtZW50ID0gKEFjdGl2aXR5KSBjcmVhdGVkQWN0aXZpdGllcy5nZXQocG9zKTsJCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsb2NhbFJlcGxhY2VtZW50LmdldE9wcG9zaXRlRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSAoT3Bwb3NpdGVGZWF0dXJlKSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCB2YWx1ZSA9IGxvY2FsUmVwbGFjZW1lbnQuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUob3Bwb3NpdGVGZWF0dXJlKTsKLQkJCWlmKHZhbHVlICE9IG51bGwpIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCk7Ci0JCQkJaWYob3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQXJyYXlMaXN0KCgoQ29sbGVjdGlvbil2YWx1ZSkpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7CQkKLQkJCQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJTGlzdCBsaXN0ID0gKExpc3QpIG8uZUdldChmZWF0dXJlKTsKLQkJCQkJCQlsaXN0LnJlbW92ZShsb2NhbFJlcGxhY2VtZW50KTsKLQkJCQkJCQlsaXN0LmFkZChjb3B5KTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCW8uZVNldChmZWF0dXJlLCBjb3B5KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIHZhbHVlOwotCQkJCQlpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgby5lR2V0KGZlYXR1cmUpOwotCQkJCQkJbGlzdC5yZW1vdmUobG9jYWxSZXBsYWNlbWVudCk7Ci0JCQkJCQlsaXN0LmFkZChjb3B5KTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW8uZVNldChmZWF0dXJlLCBjb3B5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljcmVhdGVkQWN0aXZpdGllcy5zZXQocG9zLCBjb3B5KTsKLQkJY29weS5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KGxvY2FsUmVwbGFjZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJY29weS5zZXRWYXJpYWJpbGl0eVR5cGUobG9jYWxSZXBsYWNlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKSk7Ci0JCWNvcHkuc2V0UHJlc2VudGVkQWZ0ZXIobG9jYWxSZXBsYWNlbWVudC5nZXRQcmVzZW50ZWRBZnRlcigpKTsKLQkJY29weS5zZXRQcmVzZW50ZWRCZWZvcmUobG9jYWxSZXBsYWNlbWVudC5nZXRQcmVzZW50ZWRCZWZvcmUoKSk7Ci0JCUFjdGl2aXR5IHN1cGVyQWN0ID0gbG9jYWxSZXBsYWNlbWVudC5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJaW50IGlkID0gc3VwZXJBY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pbmRleE9mKGxvY2FsUmVwbGFjZW1lbnQpOwotCQlzdXBlckFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLnNldChpZCwgY29weSk7Ci0JCQotCQkvLyBhZGQgY29weSBwYWNrYWdlIHRvIHRoZSBwYWNrYWdlIG9mIHN1cGVyIGFjdGl2aXR5Ci0JCS8vCi0JCSgoUHJvY2Vzc1BhY2thZ2Upc3VwZXJBY3QuZUNvbnRhaW5lcigpKS5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKChNZXRob2RQYWNrYWdlKSBjb3B5LmVDb250YWluZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTW92ZURvd25Db21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Nb3ZlRG93bkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ4ZDJhNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Nb3ZlRG93bkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLQotCi0vKioKLSAqIENvbW1hbmQgdG8gbW92ZSBkb3duIGVsZW1lbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTW92ZURvd25Db21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBpbnQgZWxlbWVudExvY2F0aW9uID0gMDsKLQotCXByaXZhdGUgaW50IHRyYW5zZmVyTG9jYXRpb24gPSAwOwotCi0JcHJpdmF0ZSBPYmplY3QgZWxlbWVudE9iajsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBlQ2xhc3NlczsKLQkKLQlwcml2YXRlIGJvb2xlYW4gYWRqYWNlbnQgPSBmYWxzZTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBNb3ZlRG93bkNvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIE9iamVjdCBlbGVtZW50T2JqLAotCQkJQ29sbGVjdGlvbiBlQ2xhc3NlcykgewotCQlzdXBlcigpOwotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JCXRoaXMuZWxlbWVudE9iaiA9IGVsZW1lbnRPYmo7Ci0JCXRoaXMuZUNsYXNzZXMgPSBlQ2xhc3NlczsKLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJTGlzdCBhbGxFbGVtZW50cyA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGFsbEVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChvYmouZXF1YWxzKGVsZW1lbnRPYmopKSB7Ci0JCQkJZWxlbWVudExvY2F0aW9uID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWZvciAoaW50IGkgPSBlbGVtZW50TG9jYXRpb24gKyAxOyBpIDw9IGFsbEVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gYWxsRWxlbWVudHMuZ2V0KGkpOwotCQkJaWYgKFRuZ1V0aWwuaXNFQ2xhc3NJbnN0YW5jZU9mKGVDbGFzc2VzLCBvYmopKSB7Ci0JCQkJdHJhbnNmZXJMb2NhdGlvbiA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlCcmVha2Rvd25FbGVtZW50IG5leHQgPSAgKEJyZWFrZG93bkVsZW1lbnQpIGFsbEVsZW1lbnRzLmdldCh0cmFuc2ZlckxvY2F0aW9uKTsKLQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnRPYmo7Ci0JCWlmKGUuZ2V0UHJlc2VudGVkQWZ0ZXIoKSA9PSBuZXh0KSB7Ci0JCQlhZGphY2VudCA9IHRydWU7Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlpZihhZGphY2VudCkgewotCQkJLy8gc3dhcCAicHJlbnNlbnRlZC1hZnRlciIgZWxlbWVudAotCQkJLy8KLQkJCUJyZWFrZG93bkVsZW1lbnQgbmV4dCA9ICAoQnJlYWtkb3duRWxlbWVudCkgYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5nZXQodHJhbnNmZXJMb2NhdGlvbik7Ci0JCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudE9iajsKLQkJCWUuc2V0UHJlc2VudGVkQWZ0ZXIobmV4dC5nZXRQcmVzZW50ZWRBZnRlcigpKTsKLQkJCW5leHQuc2V0UHJlc2VudGVkQWZ0ZXIoZSk7Ci0JCX0KLQkJKChFTGlzdCkgYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSkubW92ZSh0cmFuc2ZlckxvY2F0aW9uLAotCQkJCWVsZW1lbnRMb2NhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJKChFTGlzdCkgYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSkubW92ZShlbGVtZW50TG9jYXRpb24sCi0JCQkJdHJhbnNmZXJMb2NhdGlvbik7Ci0JCWlmKGFkamFjZW50KSB7Ci0JCQkvLyByZXN0b3JlICJwcmVuc2VudGVkLWFmdGVyIiBlbGVtZW50Ci0JCQkvLwotCQkJQnJlYWtkb3duRWxlbWVudCBuZXh0ID0gIChCcmVha2Rvd25FbGVtZW50KSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmdldCh0cmFuc2ZlckxvY2F0aW9uKTsKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50T2JqOwotCQkJbmV4dC5zZXRQcmVzZW50ZWRBZnRlcihlLmdldFByZXNlbnRlZEFmdGVyKCkpOwotCQkJZS5zZXRQcmVzZW50ZWRBZnRlcihuZXh0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTW92ZVVwQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTW92ZVVwQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTI5ZGQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL01vdmVVcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLQotCi0vKioKLSAqIENvbW1hbmQgdG8gbW92ZSB1cCB0aGUgZWxlbWVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNb3ZlVXBDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBpbnQgZWxlbWVudExvY2F0aW9uID0gMDsKLQotCXByaXZhdGUgaW50IHRyYW5zZmVyTG9jYXRpb24gPSAwOwotCi0JcHJpdmF0ZSBPYmplY3QgZWxlbWVudE9iajsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBlQ2xhc3NlczsKLQkKLQlwcml2YXRlIGJvb2xlYW4gYWRqYWNlbnQgPSBmYWxzZTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBNb3ZlVXBDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBPYmplY3QgZWxlbWVudE9iaiwKLQkJCUNvbGxlY3Rpb24gZUNsYXNzZXMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCQl0aGlzLmVsZW1lbnRPYmogPSBlbGVtZW50T2JqOwotCQl0aGlzLmVDbGFzc2VzID0gZUNsYXNzZXM7Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCUxpc3QgYWxsRWxlbWVudHMgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBhbGxFbGVtZW50cy5nZXQoaSk7Ci0JCQlpZiAob2JqLmVxdWFscyhlbGVtZW50T2JqKSkgewotCQkJCWVsZW1lbnRMb2NhdGlvbiA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZm9yIChpbnQgaSA9IGVsZW1lbnRMb2NhdGlvbiAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlPYmplY3Qgb2JqID0gYWxsRWxlbWVudHMuZ2V0KGkpOwotCQkJaWYgKFRuZ1V0aWwuaXNFQ2xhc3NJbnN0YW5jZU9mKGVDbGFzc2VzLCBvYmopKSB7Ci0JCQkJdHJhbnNmZXJMb2NhdGlvbiA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JCUJyZWFrZG93bkVsZW1lbnQgcHJldiA9ICAoQnJlYWtkb3duRWxlbWVudCkgYWxsRWxlbWVudHMuZ2V0KHRyYW5zZmVyTG9jYXRpb24pOwkJCi0JCWlmKHByZXYuZ2V0UHJlc2VudGVkQWZ0ZXIoKSA9PSBlbGVtZW50T2JqKSB7Ci0JCQlhZGphY2VudCA9IHRydWU7Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlpZihhZGphY2VudCkgewotCQkJLy8gc3dhcCAicHJlc2VudGVkLWFmdGVyIiBlbGVtZW50Ci0JCQkvLwotCQkJQnJlYWtkb3duRWxlbWVudCBwcmV2ID0gIChCcmVha2Rvd25FbGVtZW50KSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmdldCh0cmFuc2ZlckxvY2F0aW9uKTsJCQotCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnRPYmo7Ci0JCQlwcmV2LnNldFByZXNlbnRlZEFmdGVyKGUuZ2V0UHJlc2VudGVkQWZ0ZXIoKSk7Ci0JCQllLnNldFByZXNlbnRlZEFmdGVyKHByZXYpOwotCQl9Ci0JCSgoRUxpc3QpIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkpLm1vdmUodHJhbnNmZXJMb2NhdGlvbiwKLQkJCQllbGVtZW50TG9jYXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCSgoRUxpc3QpIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkpLm1vdmUoZWxlbWVudExvY2F0aW9uLAotCQkJCXRyYW5zZmVyTG9jYXRpb24pOwotCQlpZihhZGphY2VudCkgewotCQkJLy8gcmVzdG9yZSAicHJlc2VudGVkLWFmdGVyIiBlbGVtZW50Ci0JCQkvLwotCQkJQnJlYWtkb3duRWxlbWVudCBwcmV2ID0gIChCcmVha2Rvd25FbGVtZW50KSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmdldCh0cmFuc2ZlckxvY2F0aW9uKTsJCQotCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnRPYmo7Ci0JCQllLnNldFByZXNlbnRlZEFmdGVyKHByZXYuZ2V0UHJlc2VudGVkQWZ0ZXIoKSk7Ci0JCQlwcmV2LnNldFByZXNlbnRlZEFmdGVyKGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9PQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL09CU0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjkxMTZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL09CU0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBEcmFnIGFuZCBkcm9wIGNvbW1hbmQgZm9yIGRyYWdnaW5nIHJvbGUgaW50byBUZWFtIEFsbG9jYXRpb24KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNEcmFnQW5kRHJvcENvbW1hbmQgZXh0ZW5kcyBCU0RyYWdBbmREcm9wQ29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHBhcmFtIG9wZXJhdGlvbnMKLQkgKiBAcGFyYW0gb3BlcmF0aW9uCi0JICogQHBhcmFtIGNvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgT0JTRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBPYmplY3Qgb3duZXIsCi0JCQlmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZSkgewotCQkJaWYgKG93bmVyIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCXJldHVybiBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0VmFsaWREZXNjcmlwdG9yKG9iaiwKLS8vCQkJCQkJKEFjdGl2aXR5KSBvd25lciwKLS8vCQkJCQkJKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGRvbWFpbikKLS8vCQkJCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKSkgPT0gbnVsbDsKLQkJCX0gZWxzZSBpZiAob3duZXIgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCWlmIChQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoCi0JCQkJCQkoKFRlYW1Qcm9maWxlKSBvd25lcikuZ2V0VGVhbVJvbGVzKCkpLmNvbnRhaW5zKG9iaikpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwgTGlzdCBkcm9wU3JjKSB7Ci0JCWlmIChvd25lciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlyZXR1cm4gbmV3IE9CU0Ryb3BDb21tYW5kKChBY3Rpdml0eSkgb3duZXIsIGRyb3BTcmMpOwotCQl9IGVsc2UgaWYgKG93bmVyIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCS8vIHJldHVybiBuZXcgR2VuZXJpY0Ryb3BDb21tYW5kKChUZWFtUHJvZmlsZSkgb3duZXIsCi0JCQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwgZHJvcFNyYywKLQkJCS8vIGdldERyb3BBZGFwdGVyKG93bmVyKSk7Ci0JCQlyZXR1cm4gbmV3IEFkZFJvbGVUb1RlYW1Db21tYW5kKChUZWFtUHJvZmlsZSkgb3duZXIsIGRyb3BTcmMpOwotCQl9IGVsc2UgaWYgKG93bmVyIGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJcmV0dXJuIG5ldyBHZW5lcmljRHJvcENvbW1hbmQoKENvbXBvc2l0ZVJvbGUpIG93bmVyLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlcygpLAotCQkJCQlkcm9wU3JjLCBnZXREcm9wQWRhcHRlcihvd25lcikpOwotCQl9Ci0KLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi0JcHJpdmF0ZSBHZW5lcmljRHJvcENvbW1hbmQuRWxlbWVudEFkYXB0ZXIgZ2V0RHJvcEFkYXB0ZXIoT2JqZWN0IG93bmVyKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGRvbWFpbikKLQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KG93bmVyLCBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXJldHVybiBhZGFwdGVyLmNyZWF0ZURyb3BBZGFwdGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvT0JTRHJvcENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL09CU0Ryb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNGNiNjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvT0JTRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLlVuaXF1ZU5hbWVQTmFtZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0vKioKLSAqIENvbW1hbmQgdG8gZHJhcCBhbmQgZHJvcCByb2xlcyB0byBUZWFtIEFsbG9jYXRpb24gYnJlYWtkb3duIHN0cnVjdHVyZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9CU0Ryb3BDb21tYW5kIGV4dGVuZHMgQlNEcm9wQ29tbWFuZCB7Ci0JcHJpdmF0ZSBBcnJheUxpc3Qgd3BEZXNjTGlzdDsKLQotCXByaXZhdGUgQXJyYXlMaXN0IHJvbGVEZXNjTGlzdDsKLQotCXByaXZhdGUgTWFwPFJvbGVEZXNjcmlwdG9yLCBUZWFtUHJvZmlsZT4gcm9sZURlc2NUZWFtUHJvZmlsZU1hcDsKLQotCXByaXZhdGUgTWFwIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0czsKLQotCXByaXZhdGUgSGFzaE1hcDxXb3JrUHJvZHVjdERlc2NyaXB0b3IsIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXA7Ci0KLQlwcml2YXRlIEhhc2hNYXAgd3BkVG9UYXNrRmVhdHVyZXNNYXA7IC8vIG1hcCBvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IgdG8KLQotCS8vIG1hcCBvZiB0YXNrIG90IGZlYXR1cmUgbGlzdAotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGNvbmZpZ3JhdG9yOwotCi0JcHJpdmF0ZSBib29sZWFuIG5ld0R1cGxpY2F0ZXNSZW1vdmVkOwotCQotCXB1YmxpYyBPQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3QsIExpc3Qgcm9sZXMpIHsKLQkJc3VwZXIoYWN0LCByb2xlcyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRyb3BFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgUm9sZSkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGRyb3BFbGVtZW50cwotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gc3luY2hGZWF0dXJlcwotCSAqLwotCXB1YmxpYyBPQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCBkcm9wRWxlbWVudHMsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU2V0IHN5bmNoRmVhdHVyZXMsCi0JCQlJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcikgewotCQlzdXBlcihhY3Rpdml0eSwgZHJvcEVsZW1lbnRzLCBjb25maWcsIHN5bmNoRmVhdHVyZXMpOwotCQl0aGlzLmNvbmZpZ3JhdG9yID0gY29uZmlndXJhdG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjcHJlRXhlY3V0ZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlRXhlY3V0ZSgpIHsKLQkJaWYgKCFzdXBlci5wcmVFeGVjdXRlKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcm9sZURlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0YXNrRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdwRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJU2V0IGRlc2NyaXB0b3JzVG9SZWZyZXNoID0gc3luY2hyb25pemUgPyBiYXRjaENvbW1hbmQKLQkJCQkuZ2V0RGVzY3JpcHRvcnNUb1JlZnJlc2goKSA6IG51bGw7Ci0KLQkJTGlzdCBiZXMgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQlVbmlxdWVOYW1lUE5hbWVIYW5kbGVyIHVuaXF1ZU5hbWVzSGFuZGxlciA9IG5ldyBVbmlxdWVOYW1lUE5hbWVIYW5kbGVyKGJlcywgYmVzKTsKLQkJCQkKLQkJaW50IHNpemUgPSBkcm9wRWxlbWVudHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJUm9sZSByb2xlID0gKFJvbGUpIGRyb3BFbGVtZW50cy5nZXQoaSk7Ci0JCQlpZiAoVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKHJvbGUpKSB7Ci0JCQkJcm9sZSA9IChSb2xlKSBUbmdVdGlsLmdldEJhc2Uocm9sZSk7Ci0JCQl9Ci0KLQkJCS8vIGNoZWNrIGlmIHRoZSByb2xlIGRlc2NyaXB0b3Igb2YgdGhlIHJvbGUgZXhpc3RzIHVuZGVyIHRoaXMKLQkJCS8vIGFjdGl2aXR5Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IG51bGw7Ci0JCQlpZiAoc3luY2hyb25pemUpIHsKLQkJCQlyb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsCi0JCQkJCS5nZXREZXNjcmlwdG9yKHJvbGUsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJfQotCi0JCQlpZiAocm9sZURlc2MgPT0gbnVsbCkgewotCQkJCS8vIGNyZWF0ZSByb2xlIGRlc2NyaXB0b3Igb2JqZWN0Ci0JCQkJcm9sZURlc2MgPSBQcm9jZXNzVXRpbC5jcmVhdGVSb2xlRGVzY3JpcHRvcihyb2xlKTsKLQkJCQl1bmlxdWVOYW1lc0hhbmRsZXIuZW5zdXJlVW5pcXVlKHJvbGVEZXNjKTsKLQkJCQlyb2xlRGVzY0xpc3QuYWRkKHJvbGVEZXNjKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gbmVlZCB0byBjbGVhciBhbGwgdGhlIHJlZnJlc2hhYmxlIGZlYXR1cmVzIG9mIHRoZSBleGlzdGluZwotCQkJCS8vIGRlc2NyaXB0b3IKLQkJCQkvLwotCQkJCWlmIChzeW5jaHJvbml6ZQotCQkJCQkJJiYgcm9sZURlc2MuZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkJCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCWJhdGNoQ29tbWFuZC5nZXREZXNjcmlwdG9yc1RvUmVmcmVzaCgpLmFkZChyb2xlRGVzYyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gaWYgbm90IGEgc3luY2hyb25pemF0aW9uLCBnZXQgYWxsIHdvcmtwcm9kdWN0cyB3aGljaCBoYXZlIHJvbGUgYXMKLQkJLy8gcmVzcG9uc2libGUgcm9sZSBmb3IKLQkJLy8gd2hpY2ggd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgbmVlZHMgdG8gYmUgY3JlYXRlZAotCQkvLwotCQlpZiAoIXN5bmNocm9uaXplKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVJvbGUgcm9sZSA9IChSb2xlKSBkcm9wRWxlbWVudHMuZ2V0KGkpOwotCQkJCUxpc3Qgd29ya1Byb2R1Y3RzID0gUHJvY2Vzc1V0aWwuZ2V0V29ya1Byb2R1Y3RzRm9yUm9sZShyb2xlLAotCQkJCQkJY29uZmlnKTsKLQkJCQlpZiAoKHdvcmtQcm9kdWN0cyAhPSBudWxsKSAmJiAoISh3b3JrUHJvZHVjdHMuaXNFbXB0eSgpKSkpIHsKLQkJCQkJSGFzaE1hcCB3cFRvRXhpc3RpbmdEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkJTGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoYWN0aXZpdHkKLQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSk7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbCh3cERlc2NMaXN0KTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd29ya1Byb2R1Y3RzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIGl0ZXIubmV4dCgpOwkJCQkJCQotCQkJCQkJT2JqZWN0IHdwZCA9IFByb2Nlc3NVdGlsLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcih3cERlc2NMaXN0LCB3cCk7Ci0JCQkJCQlpZih3cGQgPT0gbnVsbCkgewotCQkJCQkJCXdwZCA9IFByb2Nlc3NDb21tYW5kVXRpbC5nZXREZXNjcmlwdG9yKHdwLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQkJCX0KLQkJCQkJCWlmICh3cGQgIT0gbnVsbCkgewotCQkJCQkJCXdwVG9FeGlzdGluZ0Rlc2NyaXB0b3JNYXAucHV0KHdwLCB3cGQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCUxpc3Qgc2VsZWN0ZWRXb3JrUHJvZHVjdHMgPSBuZXcgQXJyYXlMaXN0KAotCQkJCQkJCXdwVG9FeGlzdGluZ0Rlc2NyaXB0b3JNYXAua2V5U2V0KCkpOwotCQkJCQl3b3JrUHJvZHVjdHMucmVtb3ZlQWxsKHNlbGVjdGVkV29ya1Byb2R1Y3RzKTsKLQkJCQkJCi0JCQkJCWZpbmFsIExpc3QgZmluYWxTZWxlY3RlZFdwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaWYgKCF3b3JrUHJvZHVjdHMuaXNFbXB0eSgpKSB7Ci0JCQkJCQlmaW5hbCBMaXN0IGZpbmFsV3BzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZmluYWxXcHMuYWRkQWxsKHdvcmtQcm9kdWN0cyk7Ci0JCQkJCQlmaW5hbCBSb2xlIGZpbmFsUm9sZSA9IHJvbGU7Ci0JCQkJCQkKLQkJCQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1blNhZmVseShuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlMaXN0IHNlbGVjdGVkID0gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCQkJCQkJLnNlbGVjdFdvcmtQcm9kdWN0cyhmaW5hbFdwcywgZmluYWxSb2xlKTsKLQkJCQkJCQkJaWYgKHNlbGVjdGVkICE9IG51bGwpIHsKLQkJCQkJCQkJCWZpbmFsU2VsZWN0ZWRXcHMuYWRkQWxsKHNlbGVjdGVkKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0sIHRydWUpOwotCQkJCQl9Ci0KLQkJCQkJc2VsZWN0ZWRXb3JrUHJvZHVjdHMuYWRkQWxsKGZpbmFsU2VsZWN0ZWRXcHMpOwotCQkJCQlpZiAoIXNlbGVjdGVkV29ya1Byb2R1Y3RzLmlzRW1wdHkoKSkgewotCQkJCQkJSGFzaFNldCBhbGxTZWxlY3RlZFRhc2tzID0gbmV3IEhhc2hTZXQoKTsKLQotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzZWxlY3RlZFdvcmtQcm9kdWN0cy5zaXplKCk7IGorKykgewotCQkJCQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBzZWxlY3RlZFdvcmtQcm9kdWN0cwotCQkJCQkJCQkJLmdldChqKTsKLQotCQkJCQkJCWlmIChUbmdVdGlsLmlzQ29udHJpYnV0b3Iod3ApKSB7Ci0JCQkJCQkJCXdwID0gKFdvcmtQcm9kdWN0KSBUbmdVdGlsLmdldEJhc2Uod3ApOwotCQkJCQkJCX0KLQkJCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgd3BUb0V4aXN0aW5nRGVzY3JpcHRvck1hcC5nZXQod3ApOwotCQkJCQkJCWlmICh3cERlc2MgPT0gbnVsbCkgewotCQkJCQkJCQl3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJCQkJCQkuZ2V0RGVzY3JpcHRvcih3cCwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmICh3cERlc2MgPT0gbnVsbCkgewotCQkJCQkJCQl3cERlc2MgPSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJCQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKHdwLAotCQkJCQkJCQkJCQkJY29uZmlnLAotCQkJCQkJCQkJCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzKTsKLQkJCQkJCQkJd3BEZXNjTGlzdC5hZGQod3BEZXNjKTsKLQotCQkJCQkJCQkvLyBhdXRvbWF0aWMgYWRkaW5nIHRvIHRoZSBleGlzdGluZyBkZWxpdmVyYWJsZQotCQkJCQkJCQkvLyBkZXNjcmlwdG9yIGluIHRoZSBhY3Rpdml0eSdzIHNjb3BlIGlmIHRoZXJlCi0JCQkJCQkJCS8vIGlzCi0JCQkJCQkJCS8vIGFueQotCQkJCQkJCQkvLyB2YWxpZCBvbmUuCi0JCQkJCQkJCS8vCi0JCQkJCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCQkJCQkJLmdldERlbGl2ZXJhYmxlKGFjdGl2aXR5LCB3cCk7Ci0JCQkJCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJCQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLnB1dCh3cERlc2MsCi0JCQkJCQkJCQkJCWRlc2NyaXB0b3IpOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpZiAoZGVzY3JpcHRvcnNUb1JlZnJlc2ggIT0gbnVsbAotCQkJCQkJCQkJCSYmIHdwRGVzYy5nZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCQkJCQkJCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5hZGQod3BEZXNjKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAod3AgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZQotCQkJCQkJCQkJCSYmIHN5bmNoRmVhdHVyZXMKLQkJCQkJCQkJCQkJCS5jb250YWlucyhVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCkpKSB7Ci0JCQkJCQkJCQlQcm9jZXNzQ29tbWFuZFV0aWwuY3JlYXRlRGVsaXZlcmFibGVQYXJ0cygKLQkJCQkJCQkJCQkJd3BEZXNjLCAoRGVsaXZlcmFibGUpIHdwLCBjb25maWcsCi0JCQkJCQkJCQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cywKLQkJCQkJCQkJCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2gpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCi0JCQkJCQkJLy8gZ2V0IGFsbCBwb3NzaWJsZSB0YXNrcyBmb3IgdGhpcyB3b3JrcHJvZHVjdCBmb3IKLQkJCQkJCQkvLyB3aGljaCB0YXNrIGRlc2NyaXB0b3IgbmVlZHMgdG8gYmUgY3JlYXRlZAotCQkJCQkJCUxpc3QgdGFza3MgPSBQcm9jZXNzVXRpbC5nZXRUYXNrc0ZvcldvcmtQcm9kdWN0KHdwLAotCQkJCQkJCQkJY29uZmlnKTsKLQotCQkJCQkJCWlmICgodGFza3MgIT0gbnVsbCkgJiYgKHRhc2tzLnNpemUoKSA+IDApKSB7Ci0JCQkJCQkJCS8vIGV4Y2x1ZGUgYW55IHRhc2sgdGhhdCBpcyBhbHJlYWR5IHNlbGVjdGVkIG9yIGFscmVhZHkgZXhpc3RzIGluIGFjdGl2aXR5Ci0JCQkJCQkJCS8vCi0JCQkJCQkJCXRhc2tzLnJlbW92ZUFsbChhbGxTZWxlY3RlZFRhc2tzKTsKLQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFza3MuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXRlci5uZXh0KCk7Ci0JCQkJCQkJCQlPYmplY3QgdGQgPSBQcm9jZXNzVXRpbC5nZXRUYXNrRGVzY3JpcHRvcih0YXNrRGVzY0xpc3QsIHRhc2spOyAKLQkJCQkJCQkJCWlmKHRkID09IG51bGwpIHsKLQkJCQkJCQkJCQl0ZCA9IFByb2Nlc3NDb21tYW5kVXRpbC5nZXREZXNjcmlwdG9yKHRhc2ssIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYodGQgIT0gbnVsbCkgewotCQkJCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQotCQkJCQkJCQlpZiAoIXRhc2tzLmlzRW1wdHkoKSkgewotCQkJCQkJCQkJZmluYWwgTGlzdCBmaW5hbFRhc2tzID0gdGFza3M7Ci0JCQkJCQkJCQlmaW5hbCBXb3JrUHJvZHVjdCBmaW5hbFdwID0gd3A7Ci0JCQkJCQkJCQlmaW5hbCBMaXN0IGZpbmFsU2VsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCQlMaXN0IHNlbGVjdGVkVGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCQkvLyBzaG93IHRhc2sgc2VsZWN0aW9ucyBkaWFsb2cKLQkJCQkJCQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1blNhZmVseShuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCQlMaXN0IHNlbGVjdGVkID0gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCQkJCQkJCS5zZWxlY3RUYXNrcyhmaW5hbFRhc2tzLCBmaW5hbFdwKTsKLQkJCQkJCQkJCQkJZmluYWxTZWxlY3RlZC5hZGRBbGwoc2VsZWN0ZWQpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0sIHRydWUpOwotCQkJCQkJCQkJc2VsZWN0ZWRUYXNrcy5hZGRBbGwoZmluYWxTZWxlY3RlZCk7Ci0JCQkJCQkJCQlpZiAoKHNlbGVjdGVkVGFza3MgIT0gbnVsbCkKLQkJCQkJCQkJCQkJJiYgKCghc2VsZWN0ZWRUYXNrcy5pc0VtcHR5KCkpKSkgewotCQkJCQkJCQkJCWFsbFNlbGVjdGVkVGFza3MuYWRkQWxsKHNlbGVjdGVkVGFza3MpOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQkvLyBJZiBubyB0YXNrcyBhcmUgc2VsZWN0ZWQsIGFkZAotCQkJCQkJCQkJCS8vIFJlc3BvbnNpYmxlIHJvbGUgdG8gd3AKLQkJCQkJCQkJCQlQcm9jZXNzQ29tbWFuZFV0aWwuYWRkUmVzcG9uc2libGVSb2xlRGVzY3JpcHRvcnMoCi0JCQkJCQkJCQkJCQl3cERlc2MsIGFjdGl2aXR5LCByb2xlRGVzY0xpc3QsCi0JCQkJCQkJCQkJCQludWxsLCBjb25maWcpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gSWYgdGhlcmUgYXJlIG5vIHRhc2tzIHRvIHNob3csIGFkZAotCQkJCQkJCQkvLyBSZXNwb25zaWJsZSByb2xlIHRvIHdwCi0JCQkJCQkJCVByb2Nlc3NDb21tYW5kVXRpbC5hZGRSZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9ycyh3cERlc2MsCi0JCQkJCQkJCQkJYWN0aXZpdHksIHJvbGVEZXNjTGlzdCwgbnVsbCwgY29uZmlnKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIGNyZWF0ZSB0YXNrIGRlc2NyaXB0b3JzIGZvciB0aGlzIHdvcmtwcm9kdWN0Ci0JCQkJCQlpZiAoKGFsbFNlbGVjdGVkVGFza3MgIT0gbnVsbCkKLQkJCQkJCQkJJiYgKCEoYWxsU2VsZWN0ZWRUYXNrcy5pc0VtcHR5KCkpKSkgewotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGFsbFNlbGVjdGVkVGFza3MuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQotCQkJCQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXRvci5uZXh0KCk7Ci0KLQkJCQkJCQkJLy8gY2FsbCB0aGlzIG1ldGhvZCBldmVuIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUKLQkJCQkJCQkJLy8gZ2l2ZW4gdGFzayBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIGFjdGl2aXR5Ci0JCQkJCQkJCS8vIHRvIGFkZCBhbnkgYWRkaXRpb25hbCByZWxhdGlvbnNoaXBzIGluIGNhc2UKLQkJCQkJCQkJLy8gb2YKLQkJCQkJCQkJLy8gcmVjZW50IGNoYW5nZSBpbiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0JCQkJCQkJCS8vIG9mIHRoZSBwcm9jZXNzLgotCQkJCQkJCQlQQlNEcm9wQ29tbWFuZAotCQkJCQkJCQkJCS5hZGRUb0Rlc2NyaXB0b3JMaXN0cygKLQkJCQkJCQkJCQkJCXRhc2ssCi0JCQkJCQkJCQkJCQlhY3Rpdml0eSwKLQkJCQkJCQkJCQkJCXRhc2tEZXNjTGlzdCwKLQkJCQkJCQkJCQkJCXJvbGVEZXNjTGlzdCwKLQkJCQkJCQkJCQkJCXdwRGVzY0xpc3QsCi0JCQkJCQkJCQkJCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMsCi0JCQkJCQkJCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaCwKLQkJCQkJCQkJCQkJCWJhdGNoQ29tbWFuZAotCQkJCQkJCQkJCQkJCQkuZ2V0T2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwKCksCi0JCQkJCQkJCQkJCQljb25maWcsIHN5bmNocm9uaXplLCBzeW5jaEZlYXR1cmVzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBlbnN1cmUgdW5pcXVlIG5hbWVzIGZvciB3cCBkZXNjcmlwdG9ycwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdwRGVzY0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB3cERlc2NMaXN0LmdldChpKTsJCQkKLQkJCWlmICh3cERlc2MgIT0gbnVsbCkgewotCQkJCXVuaXF1ZU5hbWVzSGFuZGxlci5lbnN1cmVVbmlxdWUod3BEZXNjKTsJCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICghcm9sZURlc2NMaXN0LmlzRW1wdHkoKSAvLyB8fCAhcm9sZUFzc29jaWF0aW9uTGlzdC5pc0VtcHR5KCkKLQkJCQl8fCAhdGFza0Rlc2NMaXN0LmlzRW1wdHkoKQotCQkJCXx8ICF3cERlc2NMaXN0LmlzRW1wdHkoKQotCQkJCXx8ICh3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMgIT0gbnVsbCAmJiAhd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzCi0JCQkJCQkuaXNFbXB0eSgpKSB8fCAhd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuaXNFbXB0eSgpKQotCQkJCXx8IChkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsICYmICFkZXNjcmlwdG9yc1RvUmVmcmVzaAotCQkJCQkJLmlzRW1wdHkoKSkgfHwgYmF0Y2hDb21tYW5kLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI2RvRXhlY3V0ZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQlyZW1vdmVOZXdEdXBsaWNhdGVzKCk7Ci0KLQkJLy8gYWRkIHJvbGUgZGVzY3JpcHRvcnMgdG8gYWN0aXZpdHkKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwocm9sZURlc2NMaXN0KTsKLQotCQlpZiAocm9sZURlc2NUZWFtUHJvZmlsZU1hcCA9PSBudWxsKSB7Ci0JCQkvLyBwcmVwYXJlIGZvciBhdXRvbWF0aWMgYXNzaWdubWVudCBvZiByb2xlIGRlc2NyaXB0b3IgdG8gdGVhbQotCQkJLy8gcHJvZmlsZQotCQkJLy8KLQkJCXJvbGVEZXNjVGVhbVByb2ZpbGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcm9sZURlc2NMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQlUZWFtUHJvZmlsZSB0ZWFtUHJvZmlsZSA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRUZWFtKAotCQkJCQkJYWN0aXZpdHksIHJvbGVEZXNjLmdldFJvbGUoKSk7Ci0JCQkJaWYgKHRlYW1Qcm9maWxlICE9IG51bGwpIHsKLQkJCQkJcm9sZURlc2NUZWFtUHJvZmlsZU1hcC5wdXQocm9sZURlc2MsIHRlYW1Qcm9maWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgcm9sZSBkZXNjcmlwdG9ycyB0byB0ZWFtIHByb2ZpbGVzCi0JCS8vCi0JCWZvciAoTWFwLkVudHJ5PFJvbGVEZXNjcmlwdG9yLCBUZWFtUHJvZmlsZT4gZW50cnkgOiByb2xlRGVzY1RlYW1Qcm9maWxlTWFwLmVudHJ5U2V0KCkpIHsKLQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQl0ZWFtLmdldFRlYW1Sb2xlcygpLmFkZChlbnRyeS5nZXRLZXkoKSk7Ci0JCX0KLQotCQkvLyBhdXRvbWF0aWNhbGx5IGFkZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byBkZWxpdmVyYWJsZSBwYXJ0Ci0JCS8vCi0JCWlmICghd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKE1hcC5FbnRyeTxXb3JrUHJvZHVjdERlc2NyaXB0b3IsIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZW50cnkgOgotCQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmVudHJ5U2V0KCkpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVsaXZlcmFibGUgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbnRyeQotCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQkJZGVsaXZlcmFibGUuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmFkZChlbnRyeS5nZXRLZXkoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCS8vCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKHdwRGVzY0xpc3QpOwotCi0JCS8vIGFkZCB0YXNrIGRlc2NyaXB0b3JzCi0JCS8vCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKHRhc2tEZXNjTGlzdCk7Ci0KLQkJLy8gYWRkIGRlbGl2ZXJhYmxlIHBhcnRzIHRvIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJLy8KLQkJaWYgKCF3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5Ci0JCQkJCQkuZ2V0S2V5KCk7Ci0JCQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGRBbGwoCi0JCQkJCQkoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgbmV3IGRlc2NyaXB0b3JzIHRvIGFjdGl2aXR5J3MgcGFja2FnZQotCQkvLwotCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKHRhc2tEZXNjTGlzdCk7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKHJvbGVEZXNjTGlzdCk7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKHdwRGVzY0xpc3QpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JCS8vIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgbmV3IGVsZW1lbnRzIHRoYXQgYXJlIGR1cGxpY2F0ZSBiL2MgdGhleSBhcmUgY3JlYXRlZCBieSB0aGUKLQkgKiBwcmV2aW91cyBXQlNEcm9wQ29tbWFuZAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVOZXdEdXBsaWNhdGVzKCkgewotCQlpZiAoc3luY2hyb25pemUpIHsKLQkJCWlmICghbmV3RHVwbGljYXRlc1JlbW92ZWQpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2NMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgaXRlcgotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCU9iamVjdCBkZXNjID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldERlc2NyaXB0b3Iod3BkCi0JCQkJCQkJLmdldFdvcmtQcm9kdWN0KCksIGFjdGl2aXR5LAotCQkJCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQlpZiAod3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzICE9IG51bGwpIHsKLQkJCQkJCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMucmVtb3ZlKHdwZCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAod3BkVG9UYXNrRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkJCQkJCXdwZFRvVGFza0ZlYXR1cmVzTWFwLnJlbW92ZSh3cGQpOwotCQkJCQkJfQotCQkJCQkJaWYgKHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwICE9IG51bGwpIHsKLQkJCQkJCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5yZW1vdmUod3BkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQluZXdEdXBsaWNhdGVzUmVtb3ZlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI2RvVW5kbygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9VbmRvKCkgewotCQkvLyByZW1vdmUgcm9sZSBkZXNjcmlwdG9ycyBmcm9tIGFjdGl2aXR5Ci0JCS8vCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKHJvbGVEZXNjTGlzdCk7Ci0KLQkJLy8gcmVtb3ZlIHJvbGUgZGVzY3JpcHRvcnMgZnJvbSB0ZWFtIHByb2ZpbGVzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJvbGVEZXNjVGVhbVByb2ZpbGVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkucmVtb3ZlKGVudHJ5LmdldEtleSgpKTsKLQkJfQotCi0JCS8vIHJlbW92ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwod3BEZXNjTGlzdCk7Ci0KLQkJLy8gcmVtb3ZlIHRhc2sgZGVzY3JpcHRvcnMKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwodGFza0Rlc2NMaXN0KTsKLQotCQkvLyAvLyBkaXNhc3NvY2lhdGUgbmV3IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyB3aXRoIHRhc2sgZGVzY3JpcHRvcnMKLQkJLy8gLy8KLQkJLy8gaWYod3BkVG9UYXNrRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cGRUb1Rhc2tGZWF0dXJlc01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJLy8gTWFwIHRhc2tGZWF0dXJlcyA9IChNYXApIGVudHJ5LmdldFZhbHVlKCk7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB0YXNrRmVhdHVyZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkvLyAuaGFzTmV4dCgpOykgewotCQkvLyBNYXAuRW50cnkgZW50ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkvLyBUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikKLQkJLy8gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldERlc2NyaXB0b3IoZW50LmdldEtleSgpLCBhY3Rpdml0eSwKLQkJLy8gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSAoKENvbGxlY3Rpb24pZW50LmdldFZhbHVlKCkpLml0ZXJhdG9yKCk7Ci0JCS8vIGl0ZXJhdG9yMQotCQkvLyAuaGFzTmV4dCgpOykgewotCQkvLyBFU3RydWN0dXJhbEZlYXR1cmUgZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXJhdG9yMS5uZXh0KCk7Ci0JCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBkZXNjRmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpCi0JCS8vIEZFQVRVUkVfTUFQLmdldChmKTsKLQkJLy8gaWYoZGVzY0ZlYXR1cmUuaXNNYW55KCkpIHsKLQkJLy8gKChMaXN0KXRhc2tEZXNjLmVHZXQoZGVzY0ZlYXR1cmUpKS5yZW1vdmUoZW50cnkuZ2V0S2V5KCkpOwotCQkvLyB9Ci0JCS8vIGVsc2UgewotCQkvLyB0YXNrRGVzYy5lU2V0KGRlc2NGZWF0dXJlLCBudWxsKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0KLQkJLy8gcmVtb3ZlIGRlbGl2ZXJhYmxlIHBhcnRzIHRvIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJLy8KLQkJaWYgKCF3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5Ci0JCQkJCQkuZ2V0S2V5KCk7Ci0JCQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5yZW1vdmVBbGwoCi0JCQkJCQkoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyByZW1vdmUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgZnJvbSBkZWxpdmVyYWJsZSBwYXJ0Ci0JCS8vCi0JCWlmICghd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5lbnRyeVNldCgpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVsaXZlcmFibGUgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbnRyeQotCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQkJZGVsaXZlcmFibGUuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLnJlbW92ZShlbnRyeS5nZXRLZXkoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyByZW1vdmUgcm9sZSBkZXNjcmlwdG9ycyBmcm9tIGFjdGl2aXR5J3MgcGFja2FnZQotCQkvLwotCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKHRhc2tEZXNjTGlzdCk7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKHJvbGVEZXNjTGlzdCk7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKHdwRGVzY0xpc3QpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKChDb2xsZWN0aW9uKSBpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyAvKioKLQkvLyAqIEdldCB0YXNrIGRlc2NyaXB0b3JzIG1hcCBmb3IgYW4gYWN0aXZpdHkKLQkvLyAqIEBwYXJhbSBhY3Rpdml0eQotCS8vICogQHJldHVybgotCS8vICovCi0JLy8gcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCBnZXRUYXNrc01hcEZvckFjdGl2aXR5KEFjdGl2aXR5IGFjdGl2aXR5KQotCS8vIHsKLQkvLyBMaXN0IGVsZW1lbnRzID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkvLyBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JLy8gZm9yIChpbnQgaT0wOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspCi0JLy8gewotCS8vIE9iamVjdCBvYmogPSBlbGVtZW50cy5nZXQoaSk7Ci0JLy8gaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKQotCS8vIHsKLQkvLyBUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgb2JqOwotCS8vIFRhc2sgdGFzayA9IHRhc2tEZXNjLmdldFRhc2soKTsKLQkvLyBpZiAodGFzayAhPSBudWxsKQotCS8vIHsKLQkvLyBtYXAucHV0KHRhc2ssIHRhc2tEZXNjKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gbWFwOwotCS8vIH0KLQkvLwkKLQkvLwkKLQkvLyAvKioKLQkvLyAqIFNob3cgUm9sZUFzc29jaWF0aW9uIERpYWxvZwotCS8vICogQHBhcmFtIHRhc2tzCi0JLy8gKi8KLQkvLyBwcml2YXRlIHN0YXRpYyBpbnQgc2hvd1JvbGVBc3NvY2lhdGlvbkRpYWxvZyhUYXNrIHRhc2spCi0JLy8gewotCS8vCQkKLQkvLyBSb2xlQXNzb2NpYXRpb25EaWFsb2cgcm9sZUFzc29jID0gbmV3Ci0JLy8gUm9sZUFzc29jaWF0aW9uRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHRhc2spOwotCS8vIHJvbGVBc3NvYy5vcGVuKCk7Ci0JLy8JCQotCS8vIC8vIHNlbGVjdGVkIHRhc2tzOwotCS8vIHJldHVybiByb2xlQXNzb2MuZ2V0Um9sZUFzc29jaWF0aW9uKCk7Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldEFmZmVjdGVkT2JqZWN0cygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlpZiAocm9sZURlc2NMaXN0ICE9IG51bGwpIHsKLQkJCXJldHVybiByb2xlRGVzY0xpc3Q7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChyb2xlRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJcm9sZURlc2NMaXN0LmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHJvbGVEZXNjVGVhbVByb2ZpbGVNYXAgIT0gbnVsbCkgewotCQkJcm9sZURlc2NUZWFtUHJvZmlsZU1hcC5jbGVhcigpOwotCQl9Ci0JCWlmICh3cERlc2NMaXN0ICE9IG51bGwpIHsKLQkJCXdwRGVzY0xpc3QuY2xlYXIoKTsKLQkJfQotCQlpZiAod3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzICE9IG51bGwpIHsKLQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5jbGVhcigpOwotCQl9Ci0JCWlmICh3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCAhPSBudWxsKSB7Ci0JCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5jbGVhcigpOwotCQl9Ci0JCWlmICh3cGRUb1Rhc2tGZWF0dXJlc01hcCAhPSBudWxsKSB7Ci0JCQl3cGRUb1Rhc2tGZWF0dXJlc01hcC5jbGVhcigpOwotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1BCU0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUEJTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ODQyZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUEJTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLS8qKgotICogRHJhZyBhbmQgZHJvcCBjb21tYW5kIGZvciBkcm9wcGluZyB3b3JrIHByb2R1Y3RzIGludG8gV1AgVXNhZ2Ugc3RydWN0dXJlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUEJTRHJhZ0FuZERyb3BDb21tYW5kIGV4dGVuZHMgQlNEcmFnQW5kRHJvcENvbW1hbmQgewotCi0JLyoqCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEBwYXJhbSBvcGVyYXRpb25zCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uCi0JICovCi0JcHVibGljIFBCU0RyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgT2JqZWN0IG93bmVyLAotCQkJZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcmFnQW5kRHJvcENvbW1hbmQjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJb2JqID0gVG5nVXRpbC51bndyYXAob2JqKTsKLQotCQlpZihvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJaWYob3duZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXJldHVybiB0cnVlOwotLy8JCQkJcmV0dXJuIFByb2Nlc3NDb21tYW5kVXRpbC5nZXRWYWxpZERlc2NyaXB0b3Iob2JqLCAoQWN0aXZpdHkpIG93bmVyLAotLy8JCQkJCQkoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkpID09IG51bGw7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJhZ0FuZERyb3BDb21tYW5kI2NyZWF0ZURyb3BDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsIExpc3QgZHJvcFNyYykgewotCQlyZXR1cm4gbmV3IFBCU0Ryb3BDb21tYW5kKChBY3Rpdml0eSkgb3duZXIsIGRyb3BTcmMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUEJTRHJvcENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1BCU0Ryb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMWI1NzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUEJTRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkJhdGNoQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLlVuaXF1ZU5hbWVQTmFtZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIENvbW1hbmQgdG8gZHJhZyBhbmQgZHJvcCB3b3JrIHByb2R1Y3RzIHRvIFdvcmsgUHJvZHVjdCBVc2FnZSBicmVha2Rvd24KLSAqIHN0cnVjdHVyZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBCU0Ryb3BDb21tYW5kIGV4dGVuZHMgQlNEcm9wQ29tbWFuZCB7Ci0JcHJpdmF0ZSBBcnJheUxpc3Qgd3BEZXNjTGlzdDsKLQotCXByaXZhdGUgQXJyYXlMaXN0IHJvbGVEZXNjTGlzdDsKLQotCXByaXZhdGUgTWFwIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0czsKLQotCXByaXZhdGUgSGFzaE1hcDxXb3JrUHJvZHVjdERlc2NyaXB0b3IsIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXA7Ci0KLQlwcml2YXRlIEJhdGNoQ29tbWFuZCB1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kOwotCi0JcHJpdmF0ZSBib29sZWFuIG5ld0R1cGxpY2F0ZXNSZW1vdmVkOwotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGxpbmtlZFRhc2tzOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHdwZFRvVGFza0ZlYXR1cmVzTWFwOwotCi0JcHVibGljIFBCU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IHdvcmtQcm9kdWN0cykgewotCQlzdXBlcihhY3Rpdml0eSwgd29ya1Byb2R1Y3RzKTsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkcm9wRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gZHJvcEVsZW1lbnRzCi0JICogQHBhcmFtIHN5bmNoCi0JICovCi0JcHVibGljIFBCU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IGRyb3BFbGVtZW50cywgYm9vbGVhbiBzeW5jaCkgewotCQlzdXBlcihhY3Rpdml0eSwgZHJvcEVsZW1lbnRzLCBzeW5jaCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGRyb3BFbGVtZW50cwotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gc3luY2hGZWF0dXJlcwotCSAqLwotCXB1YmxpYyBQQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCBkcm9wRWxlbWVudHMsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU2V0IHN5bmNoRmVhdHVyZXMsIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yKSB7Ci0JCXN1cGVyKGFjdGl2aXR5LCBkcm9wRWxlbWVudHMsIGNvbmZpZywgc3luY2hGZWF0dXJlcyk7Ci0JCXRoaXMuY29uZmlndXJhdG9yID0gY29uZmlndXJhdG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjcHJlRXhlY3V0ZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlRXhlY3V0ZSgpIHsKLQkJaWYgKCFzdXBlci5wcmVFeGVjdXRlKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJd3BEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdGFza0Rlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyb2xlRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlpZighc3luY2hyb25pemUgfHwgKHN5bmNocm9uaXplICYmIHN5bmNoRmVhdHVyZXMuY29udGFpbnMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkpKSkgewotCQkJLy8gYWRkIHN1YmFydGlmYWN0cyB0byBkcm9wRWxlbWVudHMgbGlzdCBpZiB0aGVyZSBpcyBhbnkKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KGRyb3BFbGVtZW50cykuaXRlcmF0b3IoKTsgaXRlcgotCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZWxlbWVudCwgZmFsc2UpIHsKLQkJCQkJCQotCQkJCQkJLyoqCi0JCQkJCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJCQkJICovCi0JCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDgyMDQ3Nzg4NzQyNjA4NzI2Mkw7Ci0JCQkJCQkKLQkJCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQkJT2JqZWN0IHN1YkFydGlmYWN0cyA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldFJlZmVyZW5jZSgKLQkJCQkJCQkJCShWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpLAotCQkJCQkJCQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJCQkJCQlyZXR1cm4gKChDb2xsZWN0aW9uKXN1YkFydGlmYWN0cykuaXRlcmF0b3IoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9OwotCQkJCQkKLQkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJQXJ0aWZhY3Qgc3ViQXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmICghZHJvcEVsZW1lbnRzLmNvbnRhaW5zKHN1YkFydGlmYWN0KSAmJiBwcmVwYXJlQWRkKChXb3JrUHJvZHVjdCkgc3ViQXJ0aWZhY3QpKSAKLQkJCQkJCXsKLQkJCQkJCQlkcm9wRWxlbWVudHMuYWRkKHN1YkFydGlmYWN0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQlTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2ggPSBzeW5jaHJvbml6ZSA/IGJhdGNoQ29tbWFuZC5nZXREZXNjcmlwdG9yc1RvUmVmcmVzaCgpIDogbnVsbDsKLQkJCi0JCUxpc3QgYmVzID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJVW5pcXVlTmFtZVBOYW1lSGFuZGxlciB1bmlxdWVOYW1lc0hhbmRsZXIgPSBuZXcgVW5pcXVlTmFtZVBOYW1lSGFuZGxlcihiZXMsIGJlcyk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGRyb3BFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIGRyb3BFbGVtZW50cy5nZXQoaSk7CQkJCi0JCQlpZiAoVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKHdwKSkgewotCQkJCXdwID0gKFdvcmtQcm9kdWN0KSBUbmdVdGlsLmdldEJhc2Uod3ApOwotCQkJfQotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IG51bGw7Ci0JCQlpZiAoc3luY2hyb25pemUpIHsKLQkJCQl3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJLmdldERlc2NyaXB0b3Iod3AsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJfQotCQkJaWYgKHdwRGVzYyA9PSBudWxsKSB7Ci0JCQkJd3BEZXNjID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3cCwgY29uZmlnLAotCQkJCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzKTsKLS8vCQkJCXVuaXF1ZU5hbWVzSGFuZGxlci5lbnN1cmVVbmlxdWUod3BEZXNjKTsKLQkJCQl3cERlc2NMaXN0LmFkZCh3cERlc2MpOwotCi0JCQkJLy8gYXV0b21hdGljIGFkZGluZyB0byB0aGUgZXhpc3RpbmcgZGVsaXZlcmFibGUgZGVzY3JpcHRvciBpbgotCQkJCS8vIHRoZSBhY3Rpdml0eSdzIHNjb3BlIGlmIHRoZXJlIGlzIGFueQotCQkJCS8vIHZhbGlkIG9uZS4KLQkJCQkvLwotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCQkuZ2V0RGVsaXZlcmFibGUoYWN0aXZpdHksIHdwKTsKLQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLnB1dCh3cERlc2MsIGRlc2NyaXB0b3IpOwotCQkJCX0KLQkJCQkKLQkJCQlpZih3cGRUb1Rhc2tGZWF0dXJlc01hcCAhPSBudWxsKSB7Ci0JCQkJCS8vIHJlcGxhY2Ugd29yayBwcm9kdWN0IHdpdGggaXRzIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGluIHdwZFRvVGFza0ZlYXR1cmVzTWFwCi0JCQkJCS8vCi0JCQkJCU1hcCBmZWF0dXJlc01hcCA9IChNYXApIHdwZFRvVGFza0ZlYXR1cmVzTWFwLmdldCh3cCk7Ci0JCQkJCWlmKGZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJCQkJCXdwZFRvVGFza0ZlYXR1cmVzTWFwLnJlbW92ZSh3cCk7Ci0JCQkJCQl3cGRUb1Rhc2tGZWF0dXJlc01hcC5wdXQod3BEZXNjLCBmZWF0dXJlc01hcCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwgJiYgd3BEZXNjLmdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLmFkZCh3cERlc2MpOwotCQkJCX0KLQkJCQlpZiAod3AgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSAmJiBzeW5jaEZlYXR1cmVzLmNvbnRhaW5zKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpKSkgewotCQkJCQlQcm9jZXNzQ29tbWFuZFV0aWwuY3JlYXRlRGVsaXZlcmFibGVQYXJ0cyh3cERlc2MsCi0JCQkJCQkJKERlbGl2ZXJhYmxlKSB3cCwgY29uZmlnLCB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMsIGRlc2NyaXB0b3JzVG9SZWZyZXNoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYod3BkVG9UYXNrRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkJCQl3cGRUb1Rhc2tGZWF0dXJlc01hcC5yZW1vdmUod3ApOwotCQkJCX0KLQkJCX0KLQotCQkKLQkJCWlmICghc3luY2hyb25pemUpIHsKLQkJCQkvLyBnZXQgYWxsIHBvc3NpYmxlIHRhc2tzIGZvciB0aGlzIHdvcmtwcm9kdWN0IGZvcgotCQkJCS8vIHdoaWNoIHRhc2sgZGVzY3JpcHRvciBuZWVkcyB0byBiZSBjcmVhdGVkCi0JCQkJTGlzdCB0YXNrcyA9IFByb2Nlc3NVdGlsLmdldFRhc2tzRm9yV29ya1Byb2R1Y3Qod3AsIGNvbmZpZyk7Ci0KLQkJCQlpZiAoKHRhc2tzICE9IG51bGwpICYmICh0YXNrcy5zaXplKCkgPiAwKSkgewotCQkJCQkvLyBzaG93IHRhc2sgc2VsZWN0aW9ucyBkaWFsb2cJCQotCQkJCQlmaW5hbCBMaXN0IGZpbmFsVGFza3MgPSB0YXNrczsKLQkJCQkJZmluYWwgV29ya1Byb2R1Y3QgZmluYWxXcCA9IHdwOwotCQkJCQlmaW5hbCBMaXN0IGZpbmFsU2VsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCUxpc3Qgc2VsZWN0ZWRUYXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJLy8gc2hvdyB0YXNrIHNlbGVjdGlvbnMgZGlhbG9nCi0JCQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1blNhZmVseShuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJTGlzdCBzZWxlY3RlZCA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5zZWxlY3RUYXNrcygKLQkJCQkJCQkJCWZpbmFsVGFza3MsIGZpbmFsV3ApOwkJCQkJCQotCQkJCQkJCWZpbmFsU2VsZWN0ZWQuYWRkQWxsKHNlbGVjdGVkKTsKLQkJCQkJCX0KLQkJCQkJfSwgdHJ1ZSk7Ci0JCQkJCXNlbGVjdGVkVGFza3MuYWRkQWxsKGZpbmFsU2VsZWN0ZWQpOwotCQkJCQkKLQkJCQkJLy8gY3JlYXRlIHRhc2sgZGVzY3JpcHRvcnMgZm9yIHRoaXMgd29ya3Byb2R1Y3QKLQkJCQkJaWYgKChzZWxlY3RlZFRhc2tzICE9IG51bGwpICYmICghKHNlbGVjdGVkVGFza3MuaXNFbXB0eSgpKSkpIHsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2VsZWN0ZWRUYXNrcy5zaXplKCk7IGorKykgewotCQkJCQkJCVRhc2sgdGFzayA9IChUYXNrKSBzZWxlY3RlZFRhc2tzLmdldChqKTsKLQotCQkJCQkJCS8vIGNhbGwgdGhpcyBtZXRob2QgZXZlbiB0aGUgZGVzY3JpcHRvciBmb3IgdGhlCi0JCQkJCQkJLy8gZ2l2ZW4gdGFzayBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIGFjdGl2aXR5Ci0JCQkJCQkJLy8gdG8gYWRkIGFueSBhZGRpdGlvbmFsIHJlbGF0aW9uc2hpcHMgaW4gY2FzZSBvZgotCQkJCQkJCS8vIHJlY2VudCBjaGFuZ2UgaW4gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCQkJCQkJCS8vIG9mIHRoZSBwcm9jZXNzLgotCQkJCQkJCVBCU0Ryb3BDb21tYW5kLmFkZFRvRGVzY3JpcHRvckxpc3RzKHRhc2ssIGFjdGl2aXR5LAotCQkJCQkJCQkJdGFza0Rlc2NMaXN0LCByb2xlRGVzY0xpc3QsIHdwRGVzY0xpc3QsCi0JCQkJCQkJCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMsCi0JCQkJCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaCwKLQkJCQkJCQkJCWJhdGNoQ29tbWFuZC5nZXRPYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAoKSwgCi0JCQkJCQkJCQljb25maWcsIHRydWUsIHN5bmNoRmVhdHVyZXMpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gSWYgbm8gdGFza3MgYXJlIHNlbGVjdGVkLCBhZGQgUmVzcG9uc2libGUgcm9sZSB0byB3cAotCQkJCQkJUHJvY2Vzc0NvbW1hbmRVdGlsLmFkZFJlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzKHdwRGVzYywgYWN0aXZpdHksCi0JCQkJCQkJCXJvbGVEZXNjTGlzdCwgZGVzY3JpcHRvcnNUb1JlZnJlc2gsIGNvbmZpZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vCUlmIHRoZXJlIGFyZSBubyB0YXNrcyB0byBzaG93LCBhZGQgUmVzcG9uc2libGUgcm9sZSB0byB3cAotCQkJCQlQcm9jZXNzQ29tbWFuZFV0aWwuYWRkUmVzcG9uc2libGVSb2xlRGVzY3JpcHRvcnMod3BEZXNjLCBhY3Rpdml0eSwJcm9sZURlc2NMaXN0LCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwgY29uZmlnKTsKLQkJCQl9Ci0JCQl9Ci0vLwkJCWVsc2UgewotLy8JCQkJLy8JaW4gY2FzZSBvZiBzeW5jaHJvbml6YXRpb24sIGFkZCBSZXNwb25zaWJsZSByb2xlIHRvIHdwCi0vLwkJCQlpZiAoc3luY2hGZWF0dXJlcy5jb250YWlucyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkpKQotLy8JCQkJCVBCU0Ryb3BDb21tYW5kLmFkZFJlc3BvbnNpYmxlUm9sZSh3cERlc2MsIGFjdGl2aXR5LAlyb2xlRGVzY0xpc3QsIGRlc2NyaXB0b3JzVG9SZWZyZXNoLCBjb25maWcpOwotLy8JCQl9CQkJCQotCQl9Ci0KLQkJaWYoIXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5pc0VtcHR5KCkpIHsKLQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQgPSBuZXcgQmF0Y2hDb21tYW5kKHRydWUpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3Qgd3BEZXNjID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZC5nZXRPYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAoKS5wdXQod3BEZXNjLCAKLQkJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpLCBlbnRyeS5nZXRWYWx1ZSgpKSk7Ci0JCQl9Ci0JCX0KLQkJCi0KLQkJLy8gZW5zdXJlIHVuaXF1ZSBuYW1lcyBmb3Igd3AgZGVzY3JpcHRvcnMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3cERlc2NMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgd3BEZXNjTGlzdAotCQkJCQkuZ2V0KGkpOwotCQkJaWYgKHdwRGVzYyAhPSBudWxsKSB7Ci0JCQkJdW5pcXVlTmFtZXNIYW5kbGVyLmVuc3VyZVVuaXF1ZSh3cERlc2MpOwotCQkJfQotCQl9Ci0JCXJldHVybiAhdGFza0Rlc2NMaXN0LmlzRW1wdHkoKQotCQkJCXx8ICFyb2xlRGVzY0xpc3QuaXNFbXB0eSgpCi0JCQkJfHwgIXdwRGVzY0xpc3QuaXNFbXB0eSgpCi0JCQkJfHwgKHVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQgIT0gbnVsbCAmJiB1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kLmNhbkV4ZWN1dGUoKSkKLQkJCQl8fCAhd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuaXNFbXB0eSgpCi0JCQkJfHwgKGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwgJiYgIWRlc2NyaXB0b3JzVG9SZWZyZXNoCi0JCQkJCQkuaXNFbXB0eSgpKQotCQkJCXx8IGJhdGNoQ29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzdWJBcnRpZmFjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcHJlcGFyZUFkZChXb3JrUHJvZHVjdCB3cCkgewotCQlpZiAoc3luY2hyb25pemUpIHsJCi0JCQkvLyBnZXQgbGlua2VkIHRhc2tzIG9mIHRoZSB0YXNrIGRlc2NyaXB0b3JzIGluIHRoZSBhY3Rpdml0eSBmb3IgdGhlIGNvbmZpZ3VyYXRpb24KLQkJCS8vCi0JCQlMaXN0IHRhc2tzID0gZ2V0TGlua2VkVGFza3MoKTsKLQkJCQotCQkJaWYoIXRhc2tzLmlzRW1wdHkoKSkgewotCQkJCS8vIHNlbGVjdCBvbmx5IHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgaW5wdXQgb3Igb3V0cHV0IG9mIGFuIGV4aXN0aW5nIHRhc2sgaW4gdGhlIGFjdGl2aXR5Ci0JCQkJLy8JCi0JCQkJTWFwIGZlYXR1cmVzTWFwID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldEZlYXR1cmVzTWFwKHRhc2tzLCB3cCwgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJCQlpZighZmVhdHVyZXNNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJCS8vIHVzZSB0aGUgd3AgdG8gdGhlIGtleSBpbiB0aGUgbWFwIHJpZ2h0IG5vdyBhbmQgcmVwbGFjZSBpdCB3aXRoCi0JCQkJCS8vIGl0cyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBsYXRlcgotCQkJCQkvLwotCQkJCQlpZih3cGRUb1Rhc2tGZWF0dXJlc01hcCA9PSBudWxsKSB7Ci0JCQkJCQl3cGRUb1Rhc2tGZWF0dXJlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCX0KLQkJCQkJd3BkVG9UYXNrRmVhdHVyZXNNYXAucHV0KHdwLCBmZWF0dXJlc01hcCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldExpbmtlZFRhc2tzKCkgewotCQlpZihsaW5rZWRUYXNrcyA9PSBudWxsKSB7Ci0JCQlsaW5rZWRUYXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJVGFzayB0YXNrID0gKChUYXNrRGVzY3JpcHRvcillbGVtZW50KS5nZXRUYXNrKCk7Ci0JCQkJCWlmKHRhc2sgIT0gbnVsbCAmJiBjb25maWd1cmF0b3IuYWNjZXB0KGVsZW1lbnQpKSB7Ci0JCQkJCQlsaW5rZWRUYXNrcy5hZGQodGFzayk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpbmtlZFRhc2tzOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgbmV3IGVsZW1lbnRzIHRoYXQgYXJlIGR1cGxpY2F0ZSBiL2MgdGhleSBhcmUgY3JlYXRlZCBieSB0aGUgcHJldmlvdXMgV0JTRHJvcENvbW1hbmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTmV3RHVwbGljYXRlcygpIHsKLQkJaWYoc3luY2hyb25pemUpIHsKLQkJCWlmKCFuZXdEdXBsaWNhdGVzUmVtb3ZlZCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJvbGVEZXNjTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCQlPYmplY3QgZGVzYyA9IFByb2Nlc3NDb21tYW5kVXRpbC5nZXREZXNjcmlwdG9yKHJvbGVEZXNjLmdldFJvbGUoKSwgYWN0aXZpdHksIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJCWlmKGRlc2MgIT0gbnVsbCkgewotCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQluZXdEdXBsaWNhdGVzUmVtb3ZlZCA9IHRydWU7CQkJCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI2RvRXhlY3V0ZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQlyZW1vdmVOZXdEdXBsaWNhdGVzKCk7Ci0JCQotCQkvLyBhdXRvbWF0aWNhbGx5IGFkZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byBkZWxpdmVyYWJsZSBwYXJ0Ci0JCS8vCi0JCWlmICghd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKE1hcC5FbnRyeTxXb3JrUHJvZHVjdERlc2NyaXB0b3IsIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZW50cnkgOiAKLQkJCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5lbnRyeVNldCgpKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlbGl2ZXJhYmxlID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZW50cnkKLQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJCWRlbGl2ZXJhYmxlLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGQoZW50cnkuZ2V0S2V5KCkpOwotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycwotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbCh3cERlc2NMaXN0KTsKLQotCQkvLyBhZGQgdGFzayBkZXNjcmlwdG9ycwotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbCh0YXNrRGVzY0xpc3QpOwotCi0JCS8vIGFkZCByb2xlIGRlc2NyaXB0b3JzCi0JCS8vCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKHJvbGVEZXNjTGlzdCk7Ci0JCQotCQkvLyBhc3NvY2lhdGUgbmV3IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyB3aXRoIHRhc2sgZGVzY3JpcHRvcnMKLQkJLy8KLQkJaWYod3BkVG9UYXNrRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BkVG9UYXNrRmVhdHVyZXNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlNYXAgdGFza0ZlYXR1cmVzID0gKE1hcCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdGFza0ZlYXR1cmVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsLmdldERlc2NyaXB0b3IoZW50LmdldEtleSgpLCBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLCBnZXRNZXRob2RDb25maWd1cmF0aW9uKCksIGZhbHNlKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSAoKENvbGxlY3Rpb24pZW50LmdldFZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMQotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGRlc2NGZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgRkVBVFVSRV9NQVAuZ2V0KGYpOwotCQkJCQkJaWYoZGVzY0ZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkoKExpc3QpdGFza0Rlc2MuZUdldChkZXNjRmVhdHVyZSkpLmFkZChlbnRyeS5nZXRLZXkoKSk7CQkJCQkJCQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gVE9ETzogbmVlZCB0byBiYWNrIHVwIG9sZCB2YWx1ZSBoZXJlCi0JCQkJCQkJLy8KLQkJCQkJCQl0YXNrRGVzYy5lU2V0KGRlc2NGZWF0dXJlLCBlbnRyeS5nZXRLZXkoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgbmV3IGRlc2NyaXB0b3JzIHRvIGFjdGl2aXR5J3MgcGFja2FnZQotCQkvLwotCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKHRhc2tEZXNjTGlzdCk7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKHJvbGVEZXNjTGlzdCk7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKHdwRGVzY0xpc3QpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0vLwkJZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI3VwZGF0ZURlc2NyaXB0b3JzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZXNjcmlwdG9ycygpIHsKLQkJc3VwZXIudXBkYXRlRGVzY3JpcHRvcnMoKTsKLQkJCi0JCS8vIGFkZCBkZWxpdmVyYWJsZSBwYXJ0cyB0byB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCS8vCi0JCWlmKHVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQgIT0gbnVsbCkgewotCQkJdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZC5leGVjdXRlKCk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCN1bmRvVXBkYXRlRGVzY3JpcHRvcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVuZG9VcGRhdGVEZXNjcmlwdG9ycygpIHsKLQkJLy8gcmVtb3ZlIGRlbGl2ZXJhYmxlIHBhcnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJLy8KLQkJaWYodXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZCAhPSBudWxsKSB7Ci0JCQl1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kLnVuZG8oKTsKLQkJfQotCi0JCXN1cGVyLnVuZG9VcGRhdGVEZXNjcmlwdG9ycygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZG9VbmRvKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VuZG8oKSB7Ci0JCS8vIHJlbW92ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwod3BEZXNjTGlzdCk7Ci0KLQkJLy8gcmVtb3ZlIHJvbGUgZGVzY3JpcHRvcnMKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwocm9sZURlc2NMaXN0KTsKLQotCQkvLyByZW1vdmUgdGFzayBkZXNjcmlwdG9ycwotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbCh0YXNrRGVzY0xpc3QpOwotCi0JCS8vIHJlbW92ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBmcm9tIGRlbGl2ZXJhYmxlIHBhcnQKLQkJLy8KLQkJaWYgKCF3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmVudHJ5U2V0KCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxpdmVyYWJsZSA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5Ci0JCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCQlkZWxpdmVyYWJsZS5nZXREZWxpdmVyYWJsZVBhcnRzKCkucmVtb3ZlKGVudHJ5LmdldEtleSgpKTsKLQkJCX0KLQkJfQotCi0JCS8vIHJlbW92ZSBkZXNjcmlwdG9ycyBmcm9tIGFjdGl2aXR5J3MgcGFja2FnZQotCQkvLwotCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKHRhc2tEZXNjTGlzdCk7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKHJvbGVEZXNjTGlzdCk7Ci0JCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKHdwRGVzY0xpc3QpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKChDb2xsZWN0aW9uKSBpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGRpc2Fzc29jaWF0ZSBuZXcgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIHdpdGggdGFzayBkZXNjcmlwdG9ycwotCQkvLwotCQlpZih3cGRUb1Rhc2tGZWF0dXJlc01hcCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cGRUb1Rhc2tGZWF0dXJlc01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCU1hcCB0YXNrRmVhdHVyZXMgPSAoTWFwKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB0YXNrRmVhdHVyZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGVudCA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbC5nZXREZXNjcmlwdG9yKGVudC5nZXRLZXkoKSwgYWN0aXZpdHksIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IxID0gKChDb2xsZWN0aW9uKWVudC5nZXRWYWx1ZSgpKS5pdGVyYXRvcigpOyBpdGVyYXRvcjEKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGRlc2NGZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgRkVBVFVSRV9NQVAuZ2V0KGYpOwotCQkJCQkJaWYoZGVzY0ZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkoKExpc3QpdGFza0Rlc2MuZUdldChkZXNjRmVhdHVyZSkpLnJlbW92ZShlbnRyeS5nZXRLZXkoKSk7CQkJCQkJCQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJdGFza0Rlc2MuZVNldChkZXNjRmVhdHVyZSwgbnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCWlmICh3cERlc2NMaXN0ICE9IG51bGwpIHsKLQkJCXJldHVybiB3cERlc2NMaXN0OwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB0YXNrCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIHRhc2tEZXNjTGlzdAotCSAqIEBwYXJhbSByb2xlRGVzY0xpc3QKLQkgKiBAcGFyYW0gd3BEZXNjTGlzdAotCSAqIEBwYXJhbSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcnNUb1JlZnJlc2gKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgbmV3IFRhc2tEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgZm9yIHRoZQotCSAqICAgICAgICAgZ2l2ZW4gdGFzaywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXN0YXRpYyBib29sZWFuIGFkZFRvRGVzY3JpcHRvckxpc3RzKFRhc2sgdGFzaywgQWN0aXZpdHkgYWN0aXZpdHksCi0JCQlMaXN0IHRhc2tEZXNjTGlzdCwgTGlzdCByb2xlRGVzY0xpc3QsIExpc3Qgd3BEZXNjTGlzdCwKLQkJCU1hcCB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMsIFNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwKLQkJCU1hcCBkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiB1c2VFeGlzdGluZ0Rlc2NyaXB0b3IsIFNldCBzeW5jaEZlYXR1cmVzKSB7Ci0JCVRhc2tEZXNjcmlwdG9yIGRlc2MgPSBQcm9jZXNzQ29tbWFuZFV0aWwuY3JlYXRlVGFza0Rlc2NyaXB0b3IodGFzaywgYWN0aXZpdHksCi0JCQkJcm9sZURlc2NMaXN0LCB3cERlc2NMaXN0LCB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMsIG51bGwsCi0JCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2gsIGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAsIAotCQkJCWNvbmZpZywgdXNlRXhpc3RpbmdEZXNjcmlwdG9yLCBzeW5jaEZlYXR1cmVzKTsKLQkJaWYgKChkZXNjICE9IG51bGwpICYmICh0YXNrRGVzY0xpc3QgIT0gbnVsbCkKLQkJCQkmJiAhdGFza0Rlc2NMaXN0LmNvbnRhaW5zKGRlc2MpKSB7Ci0JCQl0YXNrRGVzY0xpc3QuYWRkKGRlc2MpOwotCQl9Ci0JCXJldHVybiBkZXNjICE9IG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihyb2xlRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJcm9sZURlc2NMaXN0LmNsZWFyKCk7Ci0JCX0KLQkJaWYod3BEZXNjTGlzdCAhPSBudWxsKSB7Ci0JCQl3cERlc2NMaXN0LmNsZWFyKCk7Ci0JCX0KLQkJaWYod3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzICE9IG51bGwpIHsKLQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5jbGVhcigpOwotCQl9Ci0JCWlmKHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwICE9IG51bGwpIHsKLQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYod3BkVG9UYXNrRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkJd3BkVG9UYXNrRmVhdHVyZXNNYXAuY2xlYXIoKTsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NDb21tYW5kVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUHJvY2Vzc0NvbW1hbmRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMGQxYmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUHJvY2Vzc0NvbW1hbmRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdGlvbkFwcGxpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkJhdGNoQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTm92IDIzLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9jZXNzQ29tbWFuZFV0aWwgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlW10gREVTQ1JJUFRPUl9SRUZSRVNIQUJMRV9GRUFUVVJFUyA9IHsKLQkJLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpIAotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIFRBU0tfREVTQ1JJUFRPUl9SRUZSRVNIQUJMRV9GRUFUVVJFUyA9IHsKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpIAotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIFJPTEVfREVTQ1JJUFRPUl9SRUZSRVNIQUJMRV9GRUFUVVJFUyA9IHsgCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCkgCi0JfTsKLQotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmVbXSBXT1JLX1BST0RVQ1RfUkVGUkVTSEFCTEVfRkVBVFVSRVMgPSB7Ci0vLwotLy8JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSByZWZyZXNoYWJsZSBmZWF0dXJlIG1hcCBmb3IgdGhlIGdpdmVuIGRlc2NyaXB0b3IuIEEgZGVzY3JpcHRvcgotCSAqIGZlYXR1cmUgaXMgY29uc2lkZXJlZCByZWZyZXNoYWJsZSBpZiB0aGVyZSBpcyBhIHNpbWlsaWFyIGZlYXR1cmUgaW4gaXRzCi0JICogbGlua2VkIE1ldGhvZEVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gdGhlIHJlZnJlc2hhYmxlIGZlYXR1cmUgbWFwIGZvciB0aGUgZ2l2ZW4gZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGNyZWF0ZVJlZnJlc2hhYmxlRmVhdHVyZU1hcChEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFNldCBleGNsdWRlRmVhdHVyZXMpIHsKLQkJTWFwIGZlYXR1cmVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlhZGRUb0ZlYXR1cmVNYXAoZGVzY3JpcHRvciwgREVTQ1JJUFRPUl9SRUZSRVNIQUJMRV9GRUFUVVJFUywgZmVhdHVyZU1hcCwgZXhjbHVkZUZlYXR1cmVzKTsKLQkJaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJYWRkVG9GZWF0dXJlTWFwKGRlc2NyaXB0b3IsIFRBU0tfREVTQ1JJUFRPUl9SRUZSRVNIQUJMRV9GRUFUVVJFUywKLQkJCQkJZmVhdHVyZU1hcCwgZXhjbHVkZUZlYXR1cmVzKTsKLQkJfSBlbHNlIGlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCWFkZFRvRmVhdHVyZU1hcChkZXNjcmlwdG9yLCBST0xFX0RFU0NSSVBUT1JfUkVGUkVTSEFCTEVfRkVBVFVSRVMsCi0JCQkJCWZlYXR1cmVNYXAsIGV4Y2x1ZGVGZWF0dXJlcyk7Ci0JCX0gZWxzZSBpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlc2NyaXB0b3I7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKTsKLQkJCWlmICh3cGQuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlICYmICFleGNsdWRlRmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCQlmZWF0dXJlTWFwLnB1dChmZWF0dXJlLCB3cGQuZ2V0RGVsaXZlcmFibGVQYXJ0cygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmVhdHVyZU1hcDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFRvRmVhdHVyZU1hcChFT2JqZWN0IGVPYmplY3QsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmVbXSBmZWF0dXJlcywgTWFwIGZlYXR1cmVNYXAsIFNldCBleGNsdWRlRmVhdHVyZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlc1tpXTsKLQkJCWlmICghZXhjbHVkZUZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpKSB7Ci0JCQkJT2JqZWN0IHZhbHVlID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCXZhbHVlID0gbmV3IEFycmF5TGlzdCgoQ29sbGVjdGlvbikgdmFsdWUpOwotCQkJCX0KLQkJCQlmZWF0dXJlTWFwLnB1dChmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRSZWZlcmVuY2UoRU9iamVjdCBlKSB7Ci0JLy8gaWYgKGUuZUlzUHJveHkoKSkgewotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0JLy8gaWYgKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JLy8gTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gUHJvY2Vzc1V0aWwKLQkvLyAuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIGUpOwotCS8vIGlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudC5lSXNQcm94eSgpKSB7Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIHRydWU7Ci0JLy8gfQotCi0JLyoqCi0JICogQ2xlYXJzIGFsbCBhdHRyaWJ1dGVzLiBGb3IgcmVmZXJlbmNlcywgcmVtb3ZlIG9ubHkgdGhvc2UgdGhhdCBhcmUKLQkgKiBkZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBhbnkgY29udGVudCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGNsZWFyUmVmcmVzaGFibGVGZWF0dXJlcyhEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFNldCBleGNsdWRlRmVhdHVyZXMpIHsKLQkJTWFwIGZlYXR1cmVNYXAgPSBjcmVhdGVSZWZyZXNoYWJsZUZlYXR1cmVNYXAoZGVzY3JpcHRvciwgZXhjbHVkZUZlYXR1cmVzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpIHsKLQkJCQlkZXNjcmlwdG9yLmVTZXQoZmVhdHVyZSwgZmVhdHVyZS5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCS8vIHdvcmsgYXJvdW5kIHRvIGF2b2lkIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotCQkJCQkvLwotCQkJCQlMaXN0IGxpc3QgPSAoKExpc3QpIGRlc2NyaXB0b3IuZUdldChmZWF0dXJlKSk7Ci0JCQkJCXN3aXRjaCAobGlzdC5zaXplKCkpIHsKLQkJCQkJY2FzZSAwOgotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCWxpc3QucmVtb3ZlKDApOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlsaXN0LmNsZWFyKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlkZXNjcmlwdG9yLmVTZXQoZmVhdHVyZSwgZmVhdHVyZS5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCQkJfQotCQkJCS8vIGlmKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkvLyBMaXN0IGxpc3QgPSAoKExpc3QpZGVzY3JpcHRvci5lR2V0KGZlYXR1cmUpKTsKLQkJCQkvLyBMaXN0IGVsZW1lbnRzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJLy8gZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkvLyAuaGFzTmV4dCgpOykgewotCQkJCS8vIEVPYmplY3QgZSA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJLy8gaWYoIWlzVmFsaWRSZWZlcmVuY2UoZSkpIHsKLQkJCQkvLyBlbGVtZW50c1RvUmVtb3ZlLmFkZChlKTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIGlmKCFlbGVtZW50c1RvUmVtb3ZlLmlzRW1wdHkoKSkgewotCQkJCS8vIGxpc3QucmVtb3ZlQWxsKGVsZW1lbnRzVG9SZW1vdmUpOwotCQkJCS8vIFN5c3RlbS5vdXQKLQkJCQkvLyAucHJpbnRsbigiUHJvY2Vzc0NvbW1hbmRVdGlsLmNsZWFyUmVmcmVzaGFibGVGZWF0dXJlcygpOgotCQkJCS8vIGNoYW5nZWQiKTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIGVsc2UgewotCQkJCS8vIEVPYmplY3Qgb2JqID0gKEVPYmplY3QpIGRlc2NyaXB0b3IuZUdldChmZWF0dXJlKTsKLQkJCQkvLyBpZihvYmogIT0gbnVsbCAmJiBvYmogIT0gZmVhdHVyZS5nZXREZWZhdWx0VmFsdWUoKSAmJgotCQkJCS8vICFpc1ZhbGlkUmVmZXJlbmNlKG9iaikpIHsKLQkJCQkvLyBkZXNjcmlwdG9yLmVTZXQoZmVhdHVyZSwgZmVhdHVyZS5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCQkJLy8gU3lzdGVtLm91dAotCQkJCS8vIC5wcmludGxuKCJQcm9jZXNzQ29tbWFuZFV0aWwuY2xlYXJSZWZyZXNoYWJsZUZlYXR1cmVzKCk6Ci0JCQkJLy8gY2hhbmdlZCIpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmVhdHVyZU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgYWxsIHRoZSByZWZyZXNoYWJsZSBmZWF0dXJlcyBvZiB0aGUgZ2l2ZW4gZGVzY3JpcHRvcgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICogQHBhcmFtIGRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAKLQkgKiBAcGFyYW0gZXhjbHVkZUZlYXR1cmVzIGZlYXR1cmVzIHRvIGV4Y2x1ZGUgZnJvbSByZWZyZXNoaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsZWFyRGVzY3JpcHRvcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0JCQlNYXAgZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcCwKLQkJCVNldCBleGNsdWRlRmVhdHVyZXMpIHsKLQkJaWYgKGRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkJLy8gbmVlZCB0byBjbGVhciBhbGwgdGhlIHJlZnJlc2hhYmxlIGZlYXR1cmVzIG9mIHRoZSBleGlzdGluZwotCQkJLy8gZGVzY3JpcHRvcgotCQkJLy8KLQkJCWlmICghZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcC5jb250YWluc0tleShkZXNjcmlwdG9yKSkgewotCQkJCWRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAKLQkJCQkJCS5wdXQoZGVzY3JpcHRvciwgY2xlYXJSZWZyZXNoYWJsZUZlYXR1cmVzKGRlc2NyaXB0b3IsIGV4Y2x1ZGVGZWF0dXJlcykpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRGVzY3JpcHRvck9mKE9iamVjdCBlbGVtZW50LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgT2JqZWN0IGRlc2NyaXB0b3IsIGJvb2xlYW4gZXhjbHVkZVN1cHByZXNzZWQpIHsJCQotCQlpZihkZXNjcmlwdG9yIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJRGVzY3JpcHRvciBkZXNjID0gICgoRGVzY3JpcHRvcilkZXNjcmlwdG9yKTsKLQkJCWlmKGV4Y2x1ZGVTdXBwcmVzc2VkICYmIGRlc2MuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlPYmplY3QgZWxlbWVudE9iaiA9IFByb2Nlc3NVdGlsLmdldEFzc29jaWF0ZWRFbGVtZW50KGRlc2MpOwotCQkJZWxlbWVudE9iaiA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLnJlc29sdmUoZWxlbWVudE9iaiwgY29uZmlnKTsKLQkJCXJldHVybiBlbGVtZW50ID09IGVsZW1lbnRPYmo7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIDxjb2RlPm9iamVjdDwvY29kZT4gaXMgYSB2YWxpZCBkZXNjcmlwdG9yIG9yIGRlc2NyaXB0b3Igd3JhcHBlciBvZiB0aGUgZ2l2ZW4gPGNvZGU+ZWxlbWVudDwvY29kZT4KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZERlc2NyaXB0b3JPckRlc2NyaXB0b3JXcmFwcGVyT2YoT2JqZWN0IGVsZW1lbnQsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJaWYoc3VwcHJlc3Npb24uaXNJblN1cHByZXNzZWRMaXN0KChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqZWN0KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBpc1ZhbGlkRGVzY3JpcHRvck9mKGVsZW1lbnQsIGNvbmZpZywgVG5nVXRpbC51bndyYXAob2JqZWN0KSwgZmFsc2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpc1ZhbGlkRGVzY3JpcHRvck9mKGVsZW1lbnQsIGNvbmZpZywgb2JqZWN0LCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1bnN1cHByZXNzZWQgZGVzY3JpcHRvciBmcm9tIGEgZGVzY3JpcHRvciBsaXN0LiBUaGUgZGVzY3JpcHRvciBsaXN0IGlzIHVzdWFsbHkKLQkgKiB0aGUgYnJlYWtkb3duIGVsZW1lbnRzIG9mIGFuIGFjdGl2aXR5LgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gZGVzY3JpcHRvckxpc3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RGVzY3JpcHRvcihPYmplY3Qgb2JqLCBMaXN0IGRlc2NyaXB0b3JMaXN0LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlyZXR1cm4gZ2V0RGVzY3JpcHRvcihvYmosIGRlc2NyaXB0b3JMaXN0LCBjb25maWcsIHRydWUpOwotCX0KLQkKLQlzdGF0aWMgT2JqZWN0IGdldERlc2NyaXB0b3IoT2JqZWN0IG9iaiwgTGlzdCBkZXNjcmlwdG9yTGlzdCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIGJvb2xlYW4gZXhjbHVkZVN1cHByZXNzZWQpIHsKLQkJaW50IHNpemUgPSBkZXNjcmlwdG9yTGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7Ci0JCQkvLyBpdGVyYXRlIHRocnUgbGlzdCB0byBzZWUgd2hldGhlciBhIHZhbGlkIGRlc2NyaXB0b3IgbGlua2VkIHdpdGggdGhlIGdpdmVuIG9iamVjdAotCQkJLy8gYWxyZWFkeSBleGlzdHMKLQkJCS8vCi0JCQlPYmplY3Qgb2JqZWN0ID0gZGVzY3JpcHRvckxpc3QuZ2V0KGopOwotCQkJaWYoaXNWYWxpZERlc2NyaXB0b3JPZihvYmosIGNvbmZpZywgb2JqZWN0LCBleGNsdWRlU3VwcHJlc3NlZCkpIHsKLQkJCQlyZXR1cm4gb2JqZWN0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB2YWxpZCBkZXNjcmlwdG9yLCBlaXRoZXIgbG9jYWwgb3IgaW5oZXJpdGVkLCBvZiB0aGUgZ2l2ZW4gb2JqZWN0IHVuZGVyIHRoZSBnaXZlbiBhY3Rpdml0eQotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBEZXNjcmlwdG9yIGdldFZhbGlkRGVzY3JpcHRvcihPYmplY3Qgb2JqLCBBY3Rpdml0eSBhY3Rpdml0eSwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdGl2aXR5KTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBwcm9jLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoYWN0aXZpdHksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oYWN0aXZpdHkpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZihpc1ZhbGlkRGVzY3JpcHRvck9yRGVzY3JpcHRvcldyYXBwZXJPZihvYmosIGNvbmZpZywgU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24ocHJvYyksIGNoaWxkKSkgewotCQkJCXJldHVybiAoRGVzY3JpcHRvcikgVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQotCS8qKgotCSAqIEdldHMgdGhlIGxvY2FsIHVuc3VwcHJlc3NlZCBkZXNjcmlwdG9yIG9mIHRoZSBnaXZlbiByb2xlLCB0YXNrLCBvciB3b3JrUHJvZHVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHJldHVybiBUaGUgZGVzY3JpcHRvciBvZiB0aGUgb2JqZWN0LCBvciBudWxsIGlmIG5vdCBleGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXREZXNjcmlwdG9yKE9iamVjdCBvYmosIEFjdGl2aXR5IGFjdGl2aXR5LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlyZXR1cm4gZ2V0RGVzY3JpcHRvcihvYmosIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCksIGNvbmZpZyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBSb2xlIERlc2NyaXB0b3JzIGZvciB0aGUgcmVzcG9uc2libGUgcm9sZXMgb2YgdGhlIGdpdmVuIHdvcmsgcHJvZHVjdAotCSAqIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIHdwRGVzYwotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSByb2xlRGVzY3JpcHRvcnMgbmV3bHkgY3JlYXRlZCByb2xlIGRlc2NyaXB0b3JzIHdpbGwgYmUgYWRkZWQgdG8gdGhpcyBsaXN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRSZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9ycygKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MsIEFjdGl2aXR5IGFjdGl2aXR5LAotCQkJTGlzdDxSb2xlRGVzY3JpcHRvcj4gcm9sZURlc2NyaXB0b3JzLCBTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2gsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmICh3cERlc2MgIT0gbnVsbCkgewotCQkJV29ya1Byb2R1Y3Qgd3AgPSB3cERlc2MuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCWlmICh3cCAhPSBudWxsKSB7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNDb250cmlidXRvcih3cCkpIHsKLQkJCQkJd3AgPSAoV29ya1Byb2R1Y3QpIFRuZ1V0aWwuZ2V0QmFzZSh3cCk7Ci0JCQkJfQotCQkJCS8vIGdldCByZXNwb25zaWJsZSByb2xlIGZvciB3b3JrIHByb2R1Y3QKLQkJCQlMaXN0IHJvbGVzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVzcG9uc2libGVSb2xlcyh3cCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJvbGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJUm9sZSByb2xlID0gKFJvbGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKFRuZ1V0aWwuaXNDb250cmlidXRvcihyb2xlKSkgewotCQkJCQkJcm9sZSA9IChSb2xlKSBUbmdVdGlsLmdldEJhc2Uocm9sZSk7Ci0JCQkJCX0KLQkJCQkJYm9vbGVhbiBpc05ld0Rlc2NyaXB0b3IgPSBmYWxzZTsKLQkJCQkJLy8gY2hlY2sgZm9yIHJvbGVkZXNjcmlwdG9yIHdoZXRoZXIgaXQncyBwcmVzZW50IGluIGFjdGl2aXR5Ci0JCQkJCS8vIGJyZWFrZG93biBlbGVtZW50cwotCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvcigKLQkJCQkJCQlyb2xlLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQkJaWYgKHJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkJCS8vIGNoZWNrIGZvciByb2xlZGVzY3JpcHRvciB3aGV0aGVyIGl0J3MgcHJlc2VudCBpbiBiYXNlCi0JCQkJCQkvLyBhY3Rpdml0eS4KLQkJCQkJCXJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0SW5oZXJpdGVkRGVzY3JpcHRvcigKLQkJCQkJCQkJcm9sZSwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJCQlpZiAocm9sZURlc2MgPT0gbnVsbCkgewotCQkJCQkJCS8vIGNoZWNrIGZvciByb2xlZGVzY3JpcHRvciB3aGV0aGVyIGl0J3MgcHJlc2VudCBpbgotCQkJCQkJCS8vIGxpc3Qgb2Ygcm9sZWRlc2NyaXB0b3JzIHBhc3NlZCBpbgotCQkJCQkJCXJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKHJvbGUsCi0JCQkJCQkJCQlyb2xlRGVzY3JpcHRvcnMsIGNvbmZpZyk7Ci0JCQkJCQkJaWYgKHJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkJCQkJcm9sZURlc2MgPSBQcm9jZXNzVXRpbC5jcmVhdGVSb2xlRGVzY3JpcHRvcihyb2xlKTsKLQkJCQkJCQkJcm9sZURlc2NyaXB0b3JzLmFkZChyb2xlRGVzYyk7Ci0JCQkJCQkJCWlzTmV3RGVzY3JpcHRvciA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghaXNOZXdEZXNjcmlwdG9yICYmIGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwgCi0JCQkJCQkJJiYgcm9sZURlc2MuZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLmFkZChyb2xlRGVzYyk7Ci0JCQkJCX0JCQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb2xsZWN0cyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgZm9yIHRoZSBnaXZlbgotCSAqIDxjb2RlPnRhc2tEZXNjcmlwdG9yRmVhdHVyZTwvY29kZT4gYmFzZWQgb24gdGhlIGNvcnJlc3BvbmRpbmcgZmVhdHVyZQotCSAqIGluIHRoZSBsaW5rZWQgdGFzayBvZiB0aGUgZ2l2ZW4gPGNvZGU+dGFza0Rlc2NyaXB0b3I8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHRhc2sgdGhlIHRhc2sgdGhhdCB0aGUgdGFzayBkZXNjcmlwdG9yIGlzIGxpbmtlZCB0bwotCSAqIEBwYXJhbSB0YXNrRGVzY3JpcHRvciB0aGUgdGFzayBkZXNjcmlwdG9yIHdob3NlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyBpbiB0aGUgZ2l2ZW4gPGNvZGU+dGFza0Rlc2NyaXB0b3JGZWF0dXJlPC9jb2RlPgotCSAqICAgICAgICB3aWxsIGJlIGNvbGxlY3RlZAotCSAqIEBwYXJhbSB0YXNrRmVhdHVyZSB0aGUgdGFzayBmZWF0dXJlIHRoYXQgaXMgY29ycmVzcG9uZGluZyB0byB0aGUgdGFzayBkZXNjcmlwdG9yIGZlYXR1cmUKLQkgKiBAcGFyYW0gdGFza0Rlc2NyaXB0b3JGZWF0dXJlIHRoZSBmZWF0dXJlIG9mIHRhc2sgZGVzY3JpcHRvciB0aGF0IGhvbGRzIHJlZmVyZW5jZXMgdG8gCi0JICogICAgICAgIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byBjb2xsZWN0Ci0JICogQHBhcmFtIGFjdGl2aXR5IHRoZSBhY3Rpdml0eSBvZiBkZXNjcmlwdG9ycwotCSAqIEBwYXJhbSBjb25maWcgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gd3BEZXNjcmlwdG9ycwotCSAqIEBwYXJhbSB3cGRUb0RlbGl2ZXJhYmxlUGFydHNNYXAKLQkgKiBAcGFyYW0gd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcnNUb1JlZnJlc2gKLQkgKiAgICAgICAgICAgIG91cHV0IHRoYXQga2VlcHMgdGhlIGRlc2NyaXB0b3IgZmVhdHVyZXMgdGhhdCBuZWVkIHRvIGJlCi0JICogICAgICAgICAgICByZWZyZXNoZWQKLQkgKiBAcGFyYW0gZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcAotCSAqICAgICAgICAgICAgb3V0cHV0IHRoYXQga2VlcHMgdGhlIGNvbGxlY3RlZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbGxlY3RXb3JrUHJvZHVjdERlc2NydGlwdG9ycygKLQkJCVRhc2sgdGFzaywKLQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yLCBFUmVmZXJlbmNlIHRhc2tGZWF0dXJlLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHRhc2tEZXNjcmlwdG9yRmVhdHVyZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCB3cERlc2NyaXB0b3JzLAotCQkJTWFwIHdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCwgTWFwIHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLAotCQkJU2V0IGRlc2NyaXB0b3JzVG9SZWZyZXNoLCBNYXAgZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCkgewotCQlMaXN0IHdvcmtQcm9kdWN0cyA9IChMaXN0KSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKQotCQkJCS5nZXRSZWZlcmVuY2UodGFzaywgdGFza0ZlYXR1cmUsIGNvbmZpZyk7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcnMod29ya1Byb2R1Y3RzLCBsaXN0LCBhY3Rpdml0eSwKLQkJCQl3cERlc2NyaXB0b3JzLCB3cGRUb0RlbGl2ZXJhYmxlUGFydHNNYXAsCi0JCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAsIGRlc2NyaXB0b3JzVG9SZWZyZXNoLCBjb25maWcpOwotCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlCYXRjaENvbW1hbmQuYWRkRmVhdHVyZVZhbHVlcyhkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLCB0YXNrRGVzY3JpcHRvciwKLQkJCQkJdGFza0Rlc2NyaXB0b3JGZWF0dXJlLCBsaXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIGZyb20gdGhlIGdpdmVuIHdvcmsgcHJvZHVjdHMgZm9yIHRoZQotCSAqIGdpdmVuIGFjdGl2aXR5IGlmIGl0IGRvZXMgbm90IGhhdmUgdGhlbSBhbHJlYWR5Ci0JICogCi0JICogQHBhcmFtIHdvcmtQcm9kdWN0cwotCSAqICAgICAgICAgICAgV29ya1Byb2R1Y3QgbGlzdAotCSAqIEBwYXJhbSBmZWF0dXJlVmFsdWUKLQkgKiAgICAgICAgICAgIHRhcmdldCBXb3JrUHJvZHVjdERlc2NyaXB0b3IgbGlzdCBmb3IgdGhlIGdpdmVuIFdvcmtQcm9kdWN0Ci0JICogICAgICAgICAgICBsaXN0Ci0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIHdwRGVzY3JpcHRvcnMKLQkgKiAgICAgICAgICAgIG5ld2x5IGNyZWF0ZWQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgKG91dHB1dCkKLQkgKi8KLQlzdGF0aWMgdm9pZCBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JzKExpc3Qgd29ya1Byb2R1Y3RzLAotCQkJTGlzdCBmZWF0dXJlVmFsdWUsIEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IHdwRGVzY3JpcHRvcnMsCi0JCQlNYXAgd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwLCBNYXAgd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAsCi0JCQlTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2gsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmICh3b3JrUHJvZHVjdHMgIT0gbnVsbCkgewotCQkJYm9vbGVhbiB3YXNFbXB0eSA9IGZlYXR1cmVWYWx1ZS5pc0VtcHR5KCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHdvcmtQcm9kdWN0cy5zaXplKCk7IGorKykgewotCQkJCVdvcmtQcm9kdWN0IHdwT2JqID0gKFdvcmtQcm9kdWN0KSB3b3JrUHJvZHVjdHMuZ2V0KGopOwotCQkJCWlmICh3cE9iaiAhPSBudWxsKSB7Ci0JCQkJCWlmIChUbmdVdGlsLmlzQ29udHJpYnV0b3Iod3BPYmopKSB7Ci0JCQkJCQl3cE9iaiA9IChXb3JrUHJvZHVjdCkgVG5nVXRpbC5nZXRCYXNlKHdwT2JqKTsKLQkJCQkJfQotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvcih3cE9iaiwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJCWlmICh3cERlc2MgPT0gbnVsbCkgewotCQotCQkJCQkJLy8gZ2V0IGluaGVyaXRlZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJCQkJCXdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbAotCQkJCQkJCQkuZ2V0SW5oZXJpdGVkRGVzY3JpcHRvcih3cE9iaiwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJCQlpZiAod3BEZXNjID09IG51bGwpIHsKLQkJCQkJCQl3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKHdwT2JqLCB3cERlc2NyaXB0b3JzLCBjb25maWcpOwotCQkJCQkJCWlmICh3cERlc2MgPT0gbnVsbCkgewotCQkJCQkJCQl3cERlc2MgPSBQcm9jZXNzQ29tbWFuZFV0aWwuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKHdwT2JqLAotCQkJCQkJCQkJCWNvbmZpZywgd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwKTsKLQkJCQkJCQkJd3BEZXNjcmlwdG9ycy5hZGQod3BEZXNjKTsKLQkKLQkJCQkJCQkJLy8gYXV0b21hdGljIGFkZGluZyB0byB0aGUgZXhpc3RpbmcgZGVsaXZlcmFibGUKLQkJCQkJCQkJLy8gZGVzY3JpcHRvciBpbiB0aGUgYWN0aXZpdHkncyBzY29wZSBpZiB0aGVyZQotCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkvLyBhbnkKLQkJCQkJCQkJLy8gdmFsaWQgb25lLgotCQkJCQkJCQkvLwotCQkJCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkJCQkJCS5nZXREZWxpdmVyYWJsZShhY3Rpdml0eSwgd3BPYmopOwotCQkJCQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCQkJCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5wdXQod3BEZXNjLAotCQkJCQkJCQkJCQlkZXNjcmlwdG9yKTsKLQkJCQkJCQkJfQotCQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmIChkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5hZGQod3BEZXNjKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAod3BPYmogaW5zdGFuY2VvZiBEZWxpdmVyYWJsZQotCQkJCQkJCQkJCSYmIHdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlQcm9jZXNzQ29tbWFuZFV0aWwuY3JlYXRlRGVsaXZlcmFibGVQYXJ0cyh3cERlc2MsCi0JCQkJCQkJCQkJCShEZWxpdmVyYWJsZSkgd3BPYmosIGNvbmZpZywKLQkJCQkJCQkJCQkJd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwLCBkZXNjcmlwdG9yc1RvUmVmcmVzaCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHdhc0VtcHR5IHx8ICFmZWF0dXJlVmFsdWUuY29udGFpbnMod3BEZXNjKSkgewotCQkJCQkJZmVhdHVyZVZhbHVlLmFkZCh3cERlc2MpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRhc2sgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHRhc2sgd2l0aGluIHRoZSBhY3Rpdml0eSBpZiBpdAotCSAqIGRvZXMgbm90IGV4aXN0IGFscmVhZHksIGFuZCB1cGRhdGUgdGhlIHJvbGVEZXNjcmlwdG9ycyBhbmQgd3BEZXNjcmlwdG9ycyBsaXN0cwotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFRhc2sgZGVzY3JpcHRvci4gQ2FsbGVyIHNob3VsZCBhZGQgdGhlIG5ldyB0YXNrCi0JICogZGVzY3JpcHRvciBhbmQgdGhlIG90aGVyRGVzY3JpcHRvcnMgaW50byB0aGUgYWN0aXZpdHkncyBicmVha2Rvd24gZWxlbWVudAotCSAqIGxpc3QuCi0JICogCi0JICogQHBhcmFtIHRhc2sKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gcm9sZURlc2NyaXB0b3JzCi0JICogICAgICAgICAgICBMaXN0IHRvIGhvbGQgdGhlIGNyZWF0ZWQgcm9sZSBkZXNjcmlwdG9ycyBhc3NvY2lhdGVkIHdpdGggdGhpcwotCSAqICAgICAgICAgICAgbmV3IHRhc2sgZGVzY3JpcHRvciwgbm8gcm9sZSBkZXNjcmlwdG9yIHdpbGwgYmUgY3JlYXRlZCBpZgotCSAqICAgICAgICAgICAgcm9sZURlc2NyaXB0b3JzIGlzIG51bGwKLQkgKiAKLQkgKiBAcGFyYW0gd3BEZXNjcmlwdG9ycwotCSAqICAgICAgICAgICAgTGlzdCB0byBob2xkIHRoZSBjcmVhdGVkIHdvcmtwcm9kdWN0IGRlc2NyaXB0b3JzIGFzc29jaWF0ZWQKLQkgKiAgICAgICAgICAgIHdpdGggdGhpcyBuZXcgdGFzayBkZXNjcmlwdG9yLCBubyB3b3JrcHJvZHVjdCBkZXNjcmlwdG9yIHdpbGwKLQkgKiAgICAgICAgICAgIGJlIGNyZWF0ZWQgaWYgd3BEZXNjcmlwdG9ycyBpcyBudWxsCi0JICogCi0JICogQHBhcmFtIHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwIAotCSAqICAgICAgICAgICAgTWFwIHRvIGhvbGQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgYW5kIGRlbGl2ZXJhYmxlIGRlc2NyaXB0b3IgdG8gYXNzaWduCi0JICogICAgICAgICAgICB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8KLQkgKiAgICAgICAgICAgICAKLQkgKiBAcmV0dXJuIFRhc2tEZXNjcmlwdG9yIG9yIG51bGwgaWYgdGhlIHRhc2sgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHRhc2sKLQkgKiAgICAgICAgIGFscmVhZHkgZXhpc3RzLCBhbmQgdXBkYXRlZCB0aGUgcm9sZURlc2NyaXB0b3JzIGFuZCB3cERlc2NyaXB0b3JzCi0JICogICAgICAgICBsaXN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGFza0Rlc2NyaXB0b3IgY3JlYXRlVGFza0Rlc2NyaXB0b3IoVGFzayB0YXNrLAotCQkJQWN0aXZpdHkgYWN0aXZpdHksIExpc3Qgcm9sZURlc2NyaXB0b3JzLCBMaXN0IHdwRGVzY3JpcHRvcnMsCi0JCQlNYXAgd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwLCBNYXAgd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAsCi0JCQlTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2gsIE1hcCBkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIGJvb2xlYW4gdXNlRXhpc3RpbmdEZXNjcmlwdG9yLCBTZXQgc3luY2hGZWF0dXJlcykgewotCQlpZiAoVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKHRhc2spKSB7Ci0JCQl0YXNrID0gKFRhc2spIFRuZ1V0aWwuZ2V0QmFzZSh0YXNrKTsKLQkJfQotCQotCQkvLyBjcmVhdGUgdGFzayBkZXNjcmlwdG9yIG9iamVjdAotCQkvLwotCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IG51bGw7Ci0JCWlmICh1c2VFeGlzdGluZ0Rlc2NyaXB0b3IpCi0JCQl0YXNrRGVzYyA9IAkoVGFza0Rlc2NyaXB0b3IpIGdldERlc2NyaXB0b3IodGFzaywgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCWJvb2xlYW4gaXNOZXdUYXNrRGVzY3JpcHRvciA9IGZhbHNlOwotCQotCQkvLyBpZiAoIHRhc2tEZXNjICE9IG51bGwgKQotCQkvLyB7Ci0JCS8vIHJldHVybiB0YXNrRGVzYzsKLQkJLy8gfQotCQkvLyB0YXNrRGVzYyA9IGNyZWF0ZVRhc2tEZXNjcmlwdG9yKHRhc2spOwotCQotCQlpZiAodGFza0Rlc2MgPT0gbnVsbCkgewotCQkJdGFza0Rlc2MgPSBQcm9jZXNzQ29tbWFuZFV0aWwuY3JlYXRlVGFza0Rlc2NyaXB0b3IodGFzayk7Ci0JCQlpc05ld1Rhc2tEZXNjcmlwdG9yID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCWlmIChkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsICYmIHRhc2tEZXNjLmdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2guYWRkKHRhc2tEZXNjKTsKLQkJCX0KLQkJfQotCQotCQlJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlnQXBwbGljYXRvciA9IFByb3ZpZGVycwotCQkJCS5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpOwotCQotCQlpZiAoaXNOZXdUYXNrRGVzY3JpcHRvcikgewotCQkJLy8gYWRkIGFsbCB0YXNrIHN0ZXBzIHRvIFRhc2tEZXNjcmlwdG9yIHN0ZXAgc2VsZWN0aW9uCi0JCQkvLwotCQkJTGlzdCBzdGVwcyA9IChMaXN0KSBjb25maWdBcHBsaWNhdG9yLmdldFJlZmVyZW5jZSh0YXNrCi0JCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgdGFzaywgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpLCBjb25maWcpOwotCQkJdGFza0Rlc2MuZ2V0U2VsZWN0ZWRTdGVwcygpLmFkZEFsbChzdGVwcyk7Ci0JCQkKLQkJfQotCQotCQkvLyBtb3ZlZCB0aGlzIGNvZGUgdG8gQlNEcm9wQ29tbWFuZCNleGVjdXRlKCkgdG8gc3VwcG9ydCB1bmRvIGFuZAotCQkvLyBwcm9ncmVzcyBtb25pdG9yCi0JCS8vCi0JCS8vIGVsc2UgewotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdGVwcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gT2JqZWN0IHN0ZXAgPSBpdGVyLm5leHQoKTsKLQkJLy8gaWYgKCF0YXNrRGVzYy5nZXRTZWxlY3RlZFN0ZXBzKCkuY29udGFpbnMoc3RlcCkpIHsKLQkJLy8gdGFza0Rlc2MuZ2V0U2VsZWN0ZWRTdGVwcygpLmFkZChzdGVwKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkKLQkJaWYgKHJvbGVEZXNjcmlwdG9ycyAhPSBudWxsKSB7Ci0JCQkvLyBnZXQvY3JlYXRlIHJvbGUgZGVzY3JpcHRvciBmb3IgcHJpbWFyeSBwZXJmb3JtZXJzCi0JCQkvLwotCQkJRVJlZmVyZW5jZSByZWYgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0JCQlMaXN0IHByaW1hcnlQZXJmb3JtZXJzID0gc3luY2hGZWF0dXJlcy5jb250YWlucyhyZWYpID8gKExpc3QpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKHRhc2ssCi0JCQkJCXJlZiwgY29uZmlnKSA6IG51bGw7Ci0JCQlpZiAocHJpbWFyeVBlcmZvcm1lcnMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJpbWFyeVBlcmZvcm1lcnMuc2l6ZSgpOyBqKyspIHsKLQkJCQkJUm9sZSByb2xlID0gKFJvbGUpIHByaW1hcnlQZXJmb3JtZXJzLmdldChqKTsKLQkJCQkJaWYgKHJvbGUgIT0gbnVsbCkgewotCQkJCQkJLy8gaWYgKFRuZ1V0aWwuaXNDb250cmlidXRvcihyb2xlKSkgewotCQkJCQkJLy8gcm9sZSA9IChSb2xlKSBUbmdVdGlsLmdldEJhc2Uocm9sZSk7Ci0JCQkJCQkvLyB9Ci0JCQkKLQkJCQkJCS8vIGNoZWNrIGZvciBsb2NhbCBkZXNjcmlwdG9yCi0JCQkJCQlSb2xlRGVzY3JpcHRvciBwcmltYXJ5Um9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGdldERlc2NyaXB0b3IoCi0JCQkJCQkJCXJvbGUsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCQkJYm9vbGVhbiBpc05ld1JvbGVEZXNjcmlwdG9yID0gZmFsc2U7Ci0JCQkJCQlpZiAocHJpbWFyeVJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkJCQkvLyBjaGVjayBmb3IgaW5oZXJpdGVkIGRlc2NyaXB0b3IKLQkJCQkJCQlwcmltYXJ5Um9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbC5nZXRJbmhlcml0ZWREZXNjcmlwdG9yKAotCQkJCQkJCQkJcm9sZSwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJCQkJaWYgKHByaW1hcnlSb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCS8vIGNoZWNrIGZvciBkZXNjcmlwdG9yIGluIHBhc3NlZCBpbiBkZXNjcmlwdG9yIGxpc3QKLQkJCQkJCQkJcHJpbWFyeVJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKHJvbGUsCi0JCQkJCQkJCQkJcm9sZURlc2NyaXB0b3JzLCBjb25maWcpOwotCQkJCQkJCQlpZiAocHJpbWFyeVJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkJCQkJCXByaW1hcnlSb2xlRGVzYyA9IFByb2Nlc3NVdGlsLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKHJvbGUpOwotCQkJCQkJCQkJaXNOZXdSb2xlRGVzY3JpcHRvciA9IHRydWU7Ci0JCQkJCQkJCQlyb2xlRGVzY3JpcHRvcnMuYWRkKHByaW1hcnlSb2xlRGVzYyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZGVzY3JpcHRvcnNUb1JlZnJlc2ggIT0gbnVsbCAmJiAhaXNOZXdSb2xlRGVzY3JpcHRvcgotCQkJCQkJCQkmJiBwcmltYXJ5Um9sZURlc2MuZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5hZGQocHJpbWFyeVJvbGVEZXNjKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChpc05ld1Rhc2tEZXNjcmlwdG9yICYmIGlzTmV3Um9sZURlc2NyaXB0b3IpIHsKLQkJCQkJCQl0YXNrRGVzYy5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpLmFkZChwcmltYXJ5Um9sZURlc2MpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlCYXRjaENvbW1hbmQuYWRkRmVhdHVyZVZhbHVlKGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAsIHRhc2tEZXNjLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksCi0JCQkJCQkJCQlwcmltYXJ5Um9sZURlc2MpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQotCQkJLy8gZ2V0L2NyZWF0ZSByb2xlIGRlc2NyaXB0b3JzIGZvciBhZGRpdGlvbmFsIHBlcmZvcm1pbmcgcm9sZXMKLQkJCS8vCi0JCQlyZWYgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7CQkJCi0JCQlMaXN0IGFkZGl0aW9uYWxQZXJmb3JtZXJzID0gc3luY2hGZWF0dXJlcy5jb250YWlucyhyZWYpID8gKExpc3QpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKAotCQkJCQl0YXNrLCByZWYsIGNvbmZpZykgOiBudWxsOwotCQkJaWYgKGFkZGl0aW9uYWxQZXJmb3JtZXJzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGFkZGl0aW9uYWxQZXJmb3JtZXJzLnNpemUoKTsgaisrKSB7Ci0JCQkJCVJvbGUgcm9sZU9iaiA9IChSb2xlKSBhZGRpdGlvbmFsUGVyZm9ybWVycy5nZXQoaik7Ci0JCQkJCS8vIGNoZWNrIGZvciBsb2NhbCBkZXNjcmlwdG9yCi0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKAotCQkJCQkJCXJvbGVPYmosIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCQlib29sZWFuIGlzTmV3Um9sZURlc2NyaXB0b3IgPSBmYWxzZTsKLQkJCQkJaWYgKHJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkJCS8vIGNoZWNrIGZvciBpbmhlcml0ZWQgZGVzY3JpcHRvcgotCQkJCQkJcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbC5nZXRJbmhlcml0ZWREZXNjcmlwdG9yKAotCQkJCQkJCQlyb2xlT2JqLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQkJCWlmIChyb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGdldERlc2NyaXB0b3Iocm9sZU9iaiwKLQkJCQkJCQkJCXJvbGVEZXNjcmlwdG9ycywgY29uZmlnKTsKLQkJCQkJCQlpZiAocm9sZURlc2MgPT0gbnVsbCkgewotCQkJCQkJCQlyb2xlRGVzYyA9IFByb2Nlc3NVdGlsLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKHJvbGVPYmopOwotCQkJCQkJCQlpc05ld1JvbGVEZXNjcmlwdG9yID0gdHJ1ZTsKLQkJCQkJCQkJcm9sZURlc2NyaXB0b3JzLmFkZChyb2xlRGVzYyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsICYmICFpc05ld1JvbGVEZXNjcmlwdG9yCi0JCQkJCQkJJiYgcm9sZURlc2MuZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLmFkZChyb2xlRGVzYyk7Ci0JCQkJCX0KLQkJCQkJaWYgKGlzTmV3VGFza0Rlc2NyaXB0b3IgJiYgaXNOZXdSb2xlRGVzY3JpcHRvcikgewotCQkJCQkJdGFza0Rlc2MuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5hZGQocm9sZURlc2MpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJQmF0Y2hDb21tYW5kLmFkZEZlYXR1cmVWYWx1ZSgKLQkJCQkJCQkJZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCwKLQkJCQkJCQkJdGFza0Rlc2MsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksCi0JCQkJCQkJCXJvbGVEZXNjKTsKLQkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkKLQkJaWYgKHdwRGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJaWYgKCFpc05ld1Rhc2tEZXNjcmlwdG9yICYmICFzeW5jaEZlYXR1cmVzLmNvbnRhaW5zKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpKSkgewotCQkJCXdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCA9IG51bGw7Ci0JCQl9Ci0JCQkKLQkJCS8vIGNyZWF0ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBmb3IgaW5wdXQgd29ya3Byb2R1Y3RzCi0JCQkvLwotCQkJaWYgKGlzTmV3VGFza0Rlc2NyaXB0b3IgfHwgc3luY2hGZWF0dXJlcy5jb250YWlucyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCkpKSB7Ci0JCQkJY29sbGVjdFdvcmtQcm9kdWN0RGVzY3J0aXB0b3JzKHRhc2ssIHRhc2tEZXNjLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpLCBjb25maWcsIGFjdGl2aXR5LAotCQkJCQkJd3BEZXNjcmlwdG9ycywgd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwLAotCQkJCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAsIGRlc2NyaXB0b3JzVG9SZWZyZXNoLAotCQkJCQkJZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCk7Ci0JCQl9Ci0JCQlpZiAoaXNOZXdUYXNrRGVzY3JpcHRvciB8fCBzeW5jaEZlYXR1cmVzLmNvbnRhaW5zKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpKSkgewotCQkJCWNvbGxlY3RXb3JrUHJvZHVjdERlc2NydGlwdG9ycyh0YXNrLCB0YXNrRGVzYywgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCksIGNvbmZpZywgYWN0aXZpdHksCi0JCQkJCQl3cERlc2NyaXB0b3JzLCB3cGRUb0RlbGl2ZXJhYmxlUGFydHNNYXAsCi0JCQkJCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCwgZGVzY3JpcHRvcnNUb1JlZnJlc2gsCi0JCQkJCQlkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwKTsKLQkJCX0KLQkKLQkJCS8vIGNyZWF0ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBmb3Igb3V0cHV0IHdvcmtwcm9kdWN0cwotCQkJLy8KLQkJCWlmIChpc05ld1Rhc2tEZXNjcmlwdG9yIHx8IHN5bmNoRmVhdHVyZXMuY29udGFpbnMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKSkpIHsKLQkJCQljb2xsZWN0V29ya1Byb2R1Y3REZXNjcnRpcHRvcnModGFzaywgdGFza0Rlc2MsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0VGFza19PdXRwdXQoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSwgY29uZmlnLCBhY3Rpdml0eSwKLQkJCQkJCXdwRGVzY3JpcHRvcnMsIHdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCwKLQkJCQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwKLQkJCQkJCWRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXApOwotCQkJfQotCQl9Ci0JCi0JCWlmIChpc05ld1Rhc2tEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gdGFza0Rlc2M7Ci0JCX0KLQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVGFza0Rlc2NyaXB0b3IgY3JlYXRlVGFza0Rlc2NyaXB0b3IoVGFzayB0YXNrKSB7Ci0JCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza0Rlc2NyaXB0b3IoKTsKLQkJdGFza0Rlc2Muc2V0VGFzayh0YXNrKTsKLQkJdGFza0Rlc2Muc2V0TmFtZSh0YXNrLmdldE5hbWUoKSk7Ci0JCXRhc2tEZXNjLnNldFByZXNlbnRhdGlvbk5hbWUoU3RyVXRpbAotCQkJCS5pc0JsYW5rKHRhc2suZ2V0UHJlc2VudGF0aW9uTmFtZSgpKSA/IHRhc2suZ2V0TmFtZSgpIDogdGFzawotCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCQkvLyB0YXNrRGVzYy5zZXRCcmllZkRlc2NyaXB0aW9uKHRhc2suZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJcmV0dXJuIHRhc2tEZXNjOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZGVsaXZlcmFibGUgcGFydHMgZm9yIHRoZSBnaXZlbiB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBmcm9tIHRoZQotCSAqIGRlbGl2ZXJhYmxlIHdvcmsgcHJvZHVjdHMgb2YgdGhlIGdpdmVuIGRlbGl2ZXJhYmxlIGFkZCBwdXQgdGhlbSBpbgotCSAqIDxjb2RlPndwRGVzY1RvRGVsaXZlcmFibGVQYXJ0czwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gd3BkCi0JICogQHBhcmFtIGRlbGl2ZXJhYmxlCi0JICogQHBhcmFtIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cwotCSAqICAgICAgICAgICAgKG91dHB1dCkgbWFwIG9mIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIHRvIGl0cyBuZXdseSBjcmVhdGVkCi0JICogICAgICAgICAgICBkZWxpdmVyYWJsZSBwYXJ0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVEZWxpdmVyYWJsZVBhcnRzKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQsCi0JCQlEZWxpdmVyYWJsZSBkZWxpdmVyYWJsZSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlNYXAgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLCBTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2gpIHsKLQkJSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIGNvbmZpZ0FwcGxpY2F0b3IgPSBQcm92aWRlcnMKLQkJCQkuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKTsKLQkKLQkJTGlzdCBkZWxpdmVyZWRXUHMgPSAoTGlzdCkgY29uZmlnQXBwbGljYXRvci5nZXRSZWZlcmVuY2UoZGVsaXZlcmFibGUsCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCksCi0JCQkJY29uZmlnKTsKLQkJTGlzdCBwYXJ0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHdwZC5nZXREZWxpdmVyYWJsZVBhcnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZWxpdmVyZWRXUHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJcGFydHMuYWRkKFByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoCi0JCQkJCQkoV29ya1Byb2R1Y3QpIGl0ZXIubmV4dCgpLCBjb25maWcsCi0JCQkJCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRlbGl2ZXJlZFdQcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdCB3b3JrUHJvZHVjdCA9IChXb3JrUHJvZHVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKHdvcmtQcm9kdWN0LCB3cGQuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLCBjb25maWcpOwotCQkJCWlmIChkZXNjID09IG51bGwpIHsKLQkJCQkJZGVzYyA9IFByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoCi0JCQkJCQkJd29ya1Byb2R1Y3QsIGNvbmZpZywgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZihkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsKSB7Ci0JCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5hZGQoZGVzYyk7Ci0JCQkJCX0KLQkJCQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJCWNyZWF0ZURlbGl2ZXJhYmxlUGFydHMoZGVzYywgKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCwKLQkJCQkJCQkJY29uZmlnLCB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMsIGRlc2NyaXB0b3JzVG9SZWZyZXNoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlwYXJ0cy5hZGQoZGVzYyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFwYXJ0cy5pc0VtcHR5KCkpIHsKLQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5wdXQod3BkLCBwYXJ0cyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gd29yayBwcm9kdWN0Ci0JICogCi0JICogQHBhcmFtIHdwCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMKLQkgKiAgICAgICAgICAgIChvdXRwdXQpIG1hcCBvZiB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byBpdHMgbmV3bHkgY3JlYXRlZAotCSAqICAgICAgICAgICAgZGVsaXZlcmFibGUgcGFydHMKLQkgKiBAcmV0dXJuIG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogICAgICAgICBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gd29yayBwcm9kdWN0IGFscmVhZHkgZXhpc3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3IgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKAotCQkJV29ya1Byb2R1Y3Qgd3AsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJTWFwIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cykgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gUHJvY2Vzc1V0aWwuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKHdwKTsKLQkJaWYgKHdwIGluc3RhbmNlb2YgRGVsaXZlcmFibGUgJiYgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzICE9IG51bGwpIHsKLQkJCWNyZWF0ZURlbGl2ZXJhYmxlUGFydHMod3BkLCAoRGVsaXZlcmFibGUpIHdwLCBjb25maWcsCi0JCQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cywgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIHdwZDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgaW5oZXJ0aWVkIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiByb2xlLCB0YXNrIG9yIHdvcmtQcm9kdWN0LiBVbmxpa2UgbG9jYWwgZGVzY3JpcHRvciwgYW4gaW5oZXJpdGVkIAotCSAqIGRlc2NyaXB0b3IgdGhhdCBpcyBleHRlcm5hbGx5IHN1cHByZXNzZWQgaXMgY29uc2lkZXJlZCB2YWxpZC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHJldHVybiBkZXNjcmlwdG9yIG9mIHRoZSBvYmplY3QsIG51bGwgaWYgbm90IGV4aXN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEluaGVyaXRlZERlc2NyaXB0b3IoT2JqZWN0IG9iaiwgQWN0aXZpdHkgYWN0aXZpdHksIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWZvciAoVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IGFjdGl2aXR5LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJdmFyaWFiaWxpdHlUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTIHx8IHZhcmlhYmlsaXR5VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OOwotCQkJdmFyaWFiaWxpdHlUeXBlID0gYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50ID0gYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFjdGl2aXR5IGJhc2VBY3Rpdml0eSA9IChBY3Rpdml0eSkgZWxlbWVudDsKLQkJCQlPYmplY3QgZGVzYyA9IGdldERlc2NyaXB0b3Iob2JqLCBiYXNlQWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSwgY29uZmlnLCBmYWxzZSk7Ci0JCQkJaWYoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBkZXNjOwotCQkJCX0KLQkJCQlhY3Rpdml0eSA9IGJhc2VBY3Rpdml0eTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIG1hcCBvZiB0YXNrIHRvIGZlYXR1cmVzIHRoYXQgY29udGFpbiB0aGUgd29yayBwcm9kdWN0IAotCSAqIChpbnB1dCBvciBvdXRwdXQgb2YgdGhlIHRhc2spCi0JICogCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIHdwCi0JICogQHJldHVybiBNYXAgb2YgdGFzayB0byBmZWF0dXJlcyB0aGF0IGNvbnRhaW4gdGhlIHdvcmsgcHJvZHVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldEZlYXR1cmVzTWFwKExpc3QgdGFza3MsIFdvcmtQcm9kdWN0IHdwLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlNYXAgZmVhdHVyZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlFUmVmZXJlbmNlW10gdGFza0ZlYXR1cmVzID0gewotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpCi0JCX07Ci0JCWZvciAoaW50IGkgPSB0YXNrcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJVGFzayB0YXNrID0gKFRhc2spIHRhc2tzLmdldChpKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgdGFza0ZlYXR1cmVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJRVJlZmVyZW5jZSBmZWF0dXJlID0gdGFza0ZlYXR1cmVzW2pdOwotCQkJCU9iamVjdCB2YWx1ZSA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldFJlZmVyZW5jZSh0YXNrLCBmZWF0dXJlLCBjb25maWcpOwotCQkJCWlmKChmZWF0dXJlLmlzTWFueSgpICYmICgoTGlzdCl2YWx1ZSkuY29udGFpbnMod3ApKSB8fAotCQkJCQkJdmFsdWUgPT0gd3ApIAotCQkJCXsKLQkJCQkJQ29sbGVjdGlvbiBmZWF0dXJlcyA9IChDb2xsZWN0aW9uKSBmZWF0dXJlc01hcC5nZXQodGFzayk7Ci0JCQkJCWlmKGZlYXR1cmVzID09IG51bGwpIHsKLQkJCQkJCWZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwkKLQkJCQkJCWZlYXR1cmVzTWFwLnB1dCh0YXNrLCBmZWF0dXJlcyk7Ci0JCQkJCX0KLQkJCQkJZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmVhdHVyZXNNYXA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUHJvY2Vzc0RlZXBDb3B5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUHJvY2Vzc0RlZXBDb3B5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmJmMDQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NEZWVwQ29weUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTmVzdGVkQ29tbWFuZEV4Y2VjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotCi0vKioKLSAqIFBoeXNpY2FsbHkgY29waWVzIGEgcHJvY2VzcyB3aXRoIGFsbCBvZiBpdHMgZGlyZWN0IG9yIGluaGVyaXRlZCBzdHJ1Y3R1cmFsIGZlYXR1cmVzIGFuZCByZWZlcmVuY2VzLgotICogQWRkIHRoZSBuZXdseSBjcmVhdGVkIHByb2Nlc3MgdG8gdGhlIHNwZWNpZmllZCBwcm9jZXNzIHBhY2thZ2UuCi0gKiAgICAKLSAqIFRoaXMgY2xhc3MgZXh0ZW5kcyB0aGUgQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQgdG8gcmV1c2UgbW9zdCBvZiBpdCdzIGZ1bmN0aW9uYWxpdHkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NEZWVwQ29weUNvbW1hbmQgZXh0ZW5kcyBBY3Rpdml0eURlZXBDb3B5Q29tbWFuZCB7Ci0KLQlwcml2YXRlIFByb2Nlc3NQYWNrYWdlIHRhcmdldFBhY2thZ2U7Ci0JcHJpdmF0ZSBQcm9jZXNzQ29tcG9uZW50IHRlbXBQYzsKLQlwcml2YXRlIFN0cmluZyBuZXdQcm9jZXNzTmFtZTsKLQlwcml2YXRlIE5lc3RlZENvbW1hbmRFeGNlY3V0b3IgbmVzdGVkQ29tbWFuZEV4ZWN1dG9yOwotCQotCXB1YmxpYyBQcm9jZXNzRGVlcENvcHlDb21tYW5kKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jZXNzLCBTdHJpbmcgbmV3UHJvY2Vzc05hbWUsCi0JCQlDb3B5SGVscGVyIGNvcHlIZWxwZXIsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQcm9jZXNzUGFja2FnZSB0YXJnZXRQYWNrYWdlLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yKSB7Ci0KLQkJc3VwZXIocHJvY2VzcywgY29weUhlbHBlciwgY29uZmlnLCBudWxsLCBtb25pdG9yLCBjb25maWd1cmF0b3IpOwotCi0JCXRoaXMubmV3UHJvY2Vzc05hbWUgPSBuZXdQcm9jZXNzTmFtZTsJCQotCQl0aGlzLnRhcmdldFBhY2thZ2UgPSB0YXJnZXRQYWNrYWdlOwotCQljcmVhdGV0YXJnZXRQcm9jZXNzKCk7Ci0JCS8vVE9ETzogZGlzYWJsZSBjb3B5aW5nIGRpYWdyYW1zIGZvciBub3cKLQkJLy8KLS8vCQluZXN0ZWRDb21tYW5kRXhlY3V0b3IgPSBuZXcgTmVzdGVkQ29tbWFuZEV4Y2VjdXRvcih0aGlzKTsKLQl9CQotCQotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQkKLQkKLQlwdWJsaWMgUHJvY2VzcyBnZXRUYXJnZXRQcm9jZXNzKCkgewotCQlyZXR1cm4gdGFyZ2V0UHJvY2VzczsKLQl9Ci0JCi0JcHVibGljIFByb2Nlc3MgZ2V0U291cmNlUHJvY2VzcygpIHsKLQkJcmV0dXJuIChQcm9jZXNzKSBhY3Rpdml0eTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZXRhcmdldFByb2Nlc3MoKSB7Ci0JCS8vIGNyZWF0ZSBhIHBsYWNlaG9sZGVyIGZvciB0aGUgbmV3IHByb2Nlc3MKLQkJLy8gc2luY2UgdGhlIGNvbnRlbnQgcHJvY2Vzc29yIG5lZWRzIHRvIGtub3cgdGhlIHRhcmV0IHByb2Nlc3MgaW4gb3JkZXIgdG8gZml4IHRoZSB1cmxzCi0JCQotCQl0ZW1wUGMgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzQ29tcG9uZW50KCk7Ci0JCXRhcmdldFBhY2thZ2UuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZCh0ZW1wUGMpOwotCQkKLQkJaWYgKCBzdXBlci5hY3Rpdml0eSBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcyApIHsKLQkJCXRhcmdldFByb2Nlc3MgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyeVByb2Nlc3MoKTsKLQkJfSBlbHNlIHsKLQkJCXRhcmdldFByb2Nlc3MgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpOwkJCQotCQl9Ci0JCXRhcmdldFByb2Nlc3Muc2V0TmFtZShuZXdQcm9jZXNzTmFtZSk7Ci0JCXRhcmdldFByb2Nlc3Muc2V0UHJlc2VudGF0aW9uTmFtZShuZXdQcm9jZXNzTmFtZSk7Ci0JCXRlbXBQYy5zZXROYW1lKG5ld1Byb2Nlc3NOYW1lKTsKLQotCQl0ZW1wUGMuc2V0UHJvY2Vzcyh0YXJnZXRQcm9jZXNzKTsJCQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihuZXN0ZWRDb21tYW5kRXhlY3V0b3IgIT0gbnVsbCkgewotCQkJbmVzdGVkQ29tbWFuZEV4ZWN1dG9yLmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsJCQkJCi0JCXN1cGVyLmV4ZWN1dGUoKTsJCi0JCQkJCi0JCS8vIG5ldyBjb3B5IG9mIHRoZSBwcm9jZXNzIG11c3QgYmUgc2F2ZWQgc28gb3RoZXIgbmVzdGVkIGNvbW1hbmRzIGxpa2UgZGlhZ3JhbSBjb3B5IGNvbW1hbmQgCi0JCS8vIGNhbiBiZSBleGVjdXRlZC4KLQkJaWYocGtnQ29weSAhPSBudWxsICYmIHBrZ0NvcHkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gU2VydmljZXMuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJdHJ5IHsKLQkJCQlwZXJzaXN0ZXIuc2F2ZShwa2dDb3B5LmVSZXNvdXJjZSgpKTsKLQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQl9Ci0JCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYobmVzdGVkQ29tbWFuZEV4ZWN1dG9yICE9IG51bGwpIHsKLQkJCW5lc3RlZENvbW1hbmRFeGVjdXRvci5leGVjdXRlTmVzdGVkQ29tbWFuZHMoKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZihuZXN0ZWRDb21tYW5kRXhlY3V0b3IgIT0gbnVsbCkgewotCQkJbmVzdGVkQ29tbWFuZEV4ZWN1dG9yLnVuZG9OZXN0ZWRDb21tYW5kcygpOwotCQl9Ci0JCXN1cGVyLnVuZG8oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZml4UHJvY2Vzc0NvbXBvbmVudCgpIHsKLQkJLy8gcmVwbGFjZSB0aGUgcGxhY2UgaG9sZGVyIHdpdGggdGhlIGFjdHVhbCBjb3BpZWQgcHJvY2VzcwotCQlpZiAocGtnQ29weSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQgKSB7Ci0JCQlwa2dDb3B5LnNldE5hbWUobmV3UHJvY2Vzc05hbWUpOwotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpcGtnQ29weSkuZ2V0UHJvY2VzcygpOwotCQkJcHJvYy5zZXROYW1lKG5ld1Byb2Nlc3NOYW1lKTsKLQkJCXByb2Muc2V0UHJlc2VudGF0aW9uTmFtZShuZXdQcm9jZXNzTmFtZSk7Ci0JCQl0YXJnZXRQcm9jZXNzID0gcHJvYzsKLQkJCUVjb3JlVXRpbC5yZXBsYWNlKHRlbXBQYywgcGtnQ29weSk7Ci0JCX0KLQl9Ci0JCi0JLyogCi0JICogcmV0dXJucyBhIENvbGxlY3Rpb24gY29udGFpbmluZyB0aGUgbmV3IHByb2Nlc3MKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjZ2V0UmVzdWx0KCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXRSZXN1bHQoKSB7Ci0JCWlmKHBrZ0NvcHkgIT0gbnVsbCAmJiBwa2dDb3B5IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoICgoUHJvY2Vzc0NvbXBvbmVudClwa2dDb3B5KS5nZXRQcm9jZXNzKCkpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzRWxlbWVudEFkZENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NFbGVtZW50QWRkQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWY2NDE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NFbGVtZW50QWRkQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gU2VwIDE2LCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRWxlbWVudEFkZENvbW1hbmQgZXh0ZW5kcyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCAKLWltcGxlbWVudHMgSVJlc291cmNlQXdhcmVDb21tYW5kCi17Ci0KLQlwdWJsaWMgUHJvY2Vzc0VsZW1lbnRBZGRDb21tYW5kKENvbW1hbmQgY29tbWFuZCkgewotCQkvLyBkaXNhYmxlIHJ1biB3aXRoIHByb2dyZXNzIGJhciB3aGVuIGFkZGluZyBpbiBwcm9jZXNzIGVkaXRvcgotCQkvLwotCQlzdXBlcihjb21tYW5kLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIFByb2Nlc3NFbGVtZW50QWRkQ29tbWFuZChDb21tYW5kIGNvbW1hbmQsIGJvb2xlYW4gcnVuV2l0aFByb2dyZXNzKSB7Ci0JCXN1cGVyKGNvbW1hbmQsIHJ1bldpdGhQcm9ncmVzcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kI2dldEZlYXR1cmVzVG9DaGVjaygpCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0RmVhdHVyZXNUb0NoZWNrKCkgewotCQlpZiAoZmVhdHVyZXNUb0NoZWNrID09IG51bGwpIHsKLQkJCXN1cGVyLmdldEZlYXR1cmVzVG9DaGVjaygpLmFkZCgKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpOwotCQl9Ci0JCXJldHVybiBmZWF0dXJlc1RvQ2hlY2s7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZCN3aWxsU2F2ZU1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB3aWxsU2F2ZU1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQkvLyBkb24ndCBzYXZlIHRoZSByZXNvdXJjZXMgYWZ0ZXIgZWFjaCBhZGQKLQkJLy8KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZCNzYXZlTW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVNb2RpZmllZFJlc291cmNlcygpIHsKLQkJLy8gZG9uJ3Qgc2F2ZSB0aGUgcmVzb3VyY2VzIGFmdGVyIGVhY2ggYWRkCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kI2NyZWF0ZVZhbGlkYXRvcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKi8KLQlwcm90ZWN0ZWQgSVZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoRU9iamVjdCBlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlFZGl0aW5nRG9tYWluIGRvbWFpbiA9IGFkZENvbW1hbmQuZ2V0RG9tYWluKCk7Ci0JCWlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudAotCQkJCSYmIGFkZENvbW1hbmQuZ2V0RmVhdHVyZSgpIGluc3RhbmNlb2YgRVJlZmVyZW5jZQotCQkJCSYmIGRvbWFpbiBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJcmV0dXJuIElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZVZhbGlkYXRvcihhZGRDb21tYW5kLmdldE93bmVyKCksIG51bGwsIGUsCi0JCQkJCWZlYXR1cmUsICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jcmVhdGVWYWxpZGF0b3IoZSwgZmVhdHVyZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUHJvY2Vzc0VsZW1lbnREZWxldGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzRWxlbWVudERlbGV0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY2ODY2MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzRWxlbWVudERlbGV0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKYW4gMjYsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRWxlbWVudERlbGV0ZUNvbW1hbmQgZXh0ZW5kcwotCQlEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCB7Ci0JcHJpdmF0ZSBTZXQgY29udGVudHNUb1JlbW92ZTsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGVsZW1lbnRzVG9SZW1vdmVSZWZlcmVuY2VzOwotCi0JcHJpdmF0ZSBib29sZWFuIG93bmVkRWxlbWVudHNJbmNsdWRlZDsKLQotCS8qKgotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICovCi0JcHVibGljIFByb2Nlc3NFbGVtZW50RGVsZXRlQ29tbWFuZChDb21tYW5kIGNvbW1hbmQsIENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJc3VwZXIoY29tbWFuZCwgZWxlbWVudHMpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEBwYXJhbSBjb25maXJtUmVtb3ZlUmVmcwotCSAqLwotCXB1YmxpYyBQcm9jZXNzRWxlbWVudERlbGV0ZUNvbW1hbmQoQ29tbWFuZCBjb21tYW5kLCBDb2xsZWN0aW9uIGVsZW1lbnRzLCBib29sZWFuIGNvbmZpcm1SZW1vdmVSZWZzKSB7Ci0JCXN1cGVyKGNvbW1hbmQsIGVsZW1lbnRzLCBjb25maXJtUmVtb3ZlUmVmcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmKCFvd25lZEVsZW1lbnRzSW5jbHVkZWQpIHsKLQkJCUNvbGxlY3Rpb24gb3duZWRFbGVtZW50cyA9IGdldE93bmVkRWxlbWVudHMoZWxlbWVudHMpOwotCQkJaWYoIW93bmVkRWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkJaW5jbHVkZUVsZW1lbnRzKG93bmVkRWxlbWVudHMpOwotCQkJfQotCQkJb3duZWRFbGVtZW50c0luY2x1ZGVkID0gdHJ1ZTsKLQkJfQotCQkKLQkJc3VwZXIuZXhlY3V0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRPd25lZEVsZW1lbnRzKENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJQXJyYXlMaXN0IG93bmVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpZWxlbWVudCk7Ci0JCQkJV29ya1Byb2R1Y3Qgd3AgPSB3cGQuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQlpZih3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXIxID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKHdwLCBmYWxzZSkgewotCi0JCQkJCQkvKioKLQkJCQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkJCQkgKi8KLQkJCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQyMjE4MTc4MjI2ODg3ODI4OUw7Ci0KLQkJCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQkJcmV0dXJuICgoQXJ0aWZhY3Qpb2JqZWN0KS5nZXRDb250YWluZWRBcnRpZmFjdHMoKS5pdGVyYXRvcigpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX07Ci0JCQkJCUhhc2hTZXQgd29ya1Byb2R1Y3RzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQkJd2hpbGUoaXRlcjEuaGFzTmV4dCgpKSB7Ci0JCQkJCQl3b3JrUHJvZHVjdHMuYWRkKGl0ZXIxLm5leHQoKSk7Ci0JCQkJCX0KLQkJCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KHdwZCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBiZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmIChiZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgotCQkJCQkJCQkmJiB3b3JrUHJvZHVjdHMuY29udGFpbnMoKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGJlKQotCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpKSkgewotCQkJCQkJCW93bmVkRWxlbWVudHMuYWRkKGJlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG93bmVkRWxlbWVudHM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhjbHVkZUVsZW1lbnRzKENvbGxlY3Rpb24gZXhjbHVkZWRFbGVtZW50cykgewotCQllbGVtZW50cy5yZW1vdmVBbGwoZXhjbHVkZWRFbGVtZW50cyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGV4Y2x1ZGVkRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJUmVtb3ZlQ29tbWFuZCBjbWQgPSBnZXRSZW1vdmVDb21tYW5kKGVsZW1lbnQpOwotCQkJaWYoY21kICE9IG51bGwpIHsKLQkJCQljbWQuZ2V0Q29sbGVjdGlvbigpLnJlbW92ZShlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbmNsdWRlRWxlbWVudHMoQ29sbGVjdGlvbiBpbmNsdWRlZEVsZW1lbnRzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGluY2x1ZGVkRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYoIWVsZW1lbnRzLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCVJlbW92ZUNvbW1hbmQgY21kID0gZ2V0UmVtb3ZlQ29tbWFuZChlbGVtZW50KTsKLQkJCQlpZihjbWQgIT0gbnVsbCkgewotCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBjbWQuZ2V0Q29sbGVjdGlvbigpOwotCQkJCQlpZighY29sbGVjdGlvbi5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQkJY29sbGVjdGlvbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFbGVtZW50c1RvUmVtb3ZlUmVmZXJlbmNlcygpIHsKLQkJaWYgKGVsZW1lbnRzVG9SZW1vdmVSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWVsZW1lbnRzVG9SZW1vdmVSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUVPYmplY3QgcGtnID0gKChBY3Rpdml0eSkgZWxlbWVudCkuZUNvbnRhaW5lcigpOwotCQkJCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCQkJCWVsZW1lbnRzVG9SZW1vdmVSZWZlcmVuY2VzLmFkZChwa2cpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMuYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuUmVtb3ZlUmVmZXJlbmNlcyhvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZWZlcmVuY2VzKCkgewotCQljb250ZW50c1RvUmVtb3ZlID0gbmV3IEhhc2hTZXQoKTsKLQkJLy8gaGF2ZSB0byByZW1vdmUgdGhlIGRlbGV0ZWQgcHJvY2VzcyBlbGVtZW50cyBmcm9tIGl0cyBjb250YWluZXIKLQkJLy8gYW5kL29yIHJlc291cmNlCi0JCS8vIHNvIHN1cGVyLnJlbW92ZVJlZmVyZW5jZXMoKSBjYW4gcmVtb3ZlIHRoZWlyIHJlZmVyZW5jZXMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBvYmo7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgb2JqOwotCi0JCQkJCS8vIHJlbW92ZSBjb250ZW50IG9mIHRoZSBhY3Rpdml0eSBmcm9tIGl0cyByZXNvdXJjZQotCQkJCQkvLwotCQkJCQkvLyByZW1vdmVDb250ZW50RnJvbVJlc291cmNlKGFjdCwgbW9kaWZpZWRSZXNvdXJjZXMpOwotCQkJCQlpZiAoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24oYWN0KSkgewotCQkJCQkJY29udGVudHNUb1JlbW92ZS5hZGQoYWN0LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQkJfQotCi0JCQkJCS8vIHJlbW92ZSB0aGUgcHJvY2VzcyBwYWNrYWdlIG9mIHRoaXMgYWN0aXZpdHkKLQkJCQkJLy8KLQkJCQkJRU9iamVjdCBjb250YWluZXIgPSBlT2JqLmVDb250YWluZXIoKTsKLQkJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCQlFY29yZVV0aWwucmVtb3ZlKGNvbnRhaW5lcik7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29udGFpbmVyLmVBbGxDb250ZW50cygpOyBpdGVyYXRvcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQkJYWN0ID0gKEFjdGl2aXR5KSBlbGVtZW50OwotCi0JCQkJCQkJCS8vIHJlbW92ZSBjb250ZW50IG9mIHRoZSBhY3Rpdml0eSBmcm9tIGl0cwotCQkJCQkJCQkvLyByZXNvdXJjZQotCQkJCQkJCQkvLwotCQkJCQkJCQkvLyByZW1vdmVDb250ZW50RnJvbVJlc291cmNlKGFjdCwKLQkJCQkJCQkJLy8gbW9kaWZpZWRSZXNvdXJjZXMpOwotCQkJCQkJCQlpZiAoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotCQkJCQkJCQkJCS5oYXNQcmVzZW50YXRpb24oYWN0KSkgewotCQkJCQkJCQkJY29udGVudHNUb1JlbW92ZS5hZGQoYWN0Ci0JCQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlFY29yZVV0aWwucmVtb3ZlKChFT2JqZWN0KSBvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXN1cGVyLnJlbW92ZVJlZmVyZW5jZXMoKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCNkZWxldGVDb250ZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVDb250ZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRlbnRzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFY29yZVV0aWwucmVtb3ZlKChFT2JqZWN0KSBpdGVyLm5leHQoKSk7Ci0JCX0KLQkJZWxlbWVudHNUb0RlbGV0ZUNvbnRlbnQuYWRkQWxsKGNvbnRlbnRzVG9SZW1vdmUpOwotCQlzdXBlci5kZWxldGVDb250ZW50KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kI2NvbGxlY3RPYmplY3RzVG9SZW1vdmUoamF2YS51dGlsLkNvbGxlY3Rpb24sIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29sbGVjdE9iamVjdHNUb1JlbW92ZShDb2xsZWN0aW9uIG9iamVjdHNUb1JlbW92ZSwgRU9iamVjdCBlbGVtZW50VG9EZWxldGUsIEVPYmplY3QgcmVmZXJlbmNlciwgQ29sbGVjdGlvbiByZWZlcmVuY2VzKSB7Ci0JCWJvb2xlYW4gcmV0ID0gc3VwZXIuY29sbGVjdE9iamVjdHNUb1JlbW92ZShvYmplY3RzVG9SZW1vdmUsIGVsZW1lbnRUb0RlbGV0ZSwKLQkJCQlyZWZlcmVuY2VyLCByZWZlcmVuY2VzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVSZWZlcmVuY2UgcmVmID0gKEVSZWZlcmVuY2UpIGl0ZXIubmV4dCgpOwotCQkJaWYocmVmID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFVNQVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpKSB7Ci0JCQkJRU9iamVjdCBjb250YWluZXIgPSByZWZlcmVuY2VyLmVDb250YWluZXIoKTsKLQkJCQlpZihjb250YWluZXIgIT0gbnVsbCAmJiBjb250YWluZXIuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCQkJb2JqZWN0c1RvUmVtb3ZlLmFkZChjb250YWluZXIpOwotCQkJCQlyZXQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoY29udGVudHNUb1JlbW92ZSAhPSBudWxsKSB7Ci0JCQljb250ZW50c1RvUmVtb3ZlLmNsZWFyKCk7Ci0JCX0KLQkJaWYoZWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJZWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMuY2xlYXIoKTsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZDZjNzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBOb3YgMzAsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdFtdIFRBU0tfREVTQ1JJUFRPUl9fUkVMQVRJT05TSElQUyA9IHsKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwJCQotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKQotCX07Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBST0xFX0RFU0NSSVBUT1JfX1JFTEFUSU9OU0hJUFMgPSB7Ci0JCUFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX0Fzc2lzdHNJbl9UYXNrRGVzY3JpcHRvcnMsCi0JCUFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX0FkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMsCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCkKLQl9OwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0W10gV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1JFTEFUSU9OU0hJUFMgPSB7Ci0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RlZEJ5KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCksCi0JCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycywKLQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMsCi0JCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzLAotCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbV9UYXNrRGVzY3JpcHRvcnMsCi0JCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9SZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9ycwotCX07Ci0JCi0JcHJpdmF0ZSBIYXNoU2V0IHJlbW92ZWREZXNjcmlwdG9yczsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhYm9ydGVkOyAKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBSZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICovCi0JcHVibGljIFJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZChTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobGFiZWwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBSZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNBYm9ydGVkKCkgewotCQlyZXR1cm4gYWJvcnRlZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBnZXRQYXJlbnQoRGVzY3JpcHRvciBvYmopIHsKLQkJLy8gQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCS8vIGlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkvLyBmYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJLy8gLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCS8vIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJLy8gZmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCS8vIC5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkvLyB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkvLyBmYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJLy8gLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gSXRlbVByb3ZpZGVyQWRhcHRlciBwcm92aWRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKQotCQkvLyBmYWN0b3J5LmFkYXB0KG9iaiwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gT2JqZWN0IGFjdCA9IHByb3ZpZGVyLmdldFBhcmVudChvYmopOwotCQkvLwotCQkvLyByZXR1cm4gYWN0OwotCi0JCXJldHVybiBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KG9iaik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlKE9iamVjdFtdIHJlZlRvYmVEZWxldGVkKSB7Ci0JCWlmIChyZWZUb2JlRGVsZXRlZCAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZlRvYmVEZWxldGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRGVzY3JpcHRvciBvYmogPSAoRGVzY3JpcHRvcikgcmVmVG9iZURlbGV0ZWRbaV07Ci0JCQkJLy8gZ2V0IHBhcmVudCBhbmQgcmVtb3ZlIHJlZiBvYmplY3QKLQkJCQlPYmplY3QgYWN0ID0gZ2V0UGFyZW50KG9iaik7Ci0JCQkJaWYgKGFjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWlmICgoKEFjdGl2aXR5KSBhY3QpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlKG9iaikpIHsKLQkJCQkJCWdldFJlbW92ZWREZXNjcmlwdG9ycygpLmFkZChvYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVtb3ZlZERlc2NyaXB0b3JzKCkgewotCQlpZiAocmVtb3ZlZERlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXJlbW92ZWREZXNjcmlwdG9ycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCX0KLQkJcmV0dXJuIHJlbW92ZWREZXNjcmlwdG9yczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JlcGxhY2VBY3Rpdml0eUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JlcGxhY2VBY3Rpdml0eUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIzZjkwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9SZXBsYWNlQWN0aXZpdHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDEwLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBsYWNlQWN0aXZpdHlDb21tYW5kIGV4dGVuZHMgVmFyeUFjdGl2aXR5Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqLwotCXB1YmxpYyBSZXBsYWNlQWN0aXZpdHlDb21tYW5kKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJc3VwZXIod3JhcHBlcik7Ci0JCXNldExhYmVsKExpYnJhcnlFZGl0UmVzb3VyY2VzLmxvY2FsUmVwbGFjZXNfdGV4dCk7IAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlZhcnlBY3Rpdml0eUNvbW1hbmQjZG9WYXJ5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1ZhcnkoKSB7Ci0JCVByb2Nlc3NVdGlsLnJlcGxhY2VBY3Rpdml0eUxvY2FsbHkod3JhcHBlciwgY3JlYXRlZEFjdGl2aXRpZXMpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JvbGVBc3NvY2lhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUm9sZUFzc29jaWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkODZhNzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUm9sZUFzc29jaWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZUFzc29jaWF0aW9uIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU1BUlkgPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQURESVRJT05BTCA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU1NJU1RFRCA9IDI7Ci0KLQlwcml2YXRlIGludCB0eXBlOwotCi0JcHJpdmF0ZSBSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvcjsKLQotCXByaXZhdGUgVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3I7Ci0KLQlwcml2YXRlIFJvbGVEZXNjcmlwdG9yIG9sZFJvbGVEZXNjcmlwdG9yOwotCi0JcHVibGljIFJvbGVBc3NvY2lhdGlvbihpbnQgdHlwZSwgUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IsCi0JCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvcikgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLnJvbGVEZXNjcmlwdG9yID0gcm9sZURlc2NyaXB0b3I7Ci0JCXRoaXMudGFza0Rlc2NyaXB0b3IgPSB0YXNrRGVzY3JpcHRvcjsKLQl9Ci0KLQlwdWJsaWMgUm9sZURlc2NyaXB0b3IgZ2V0T2xkUm9sZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBvbGRSb2xlRGVzY3JpcHRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPbGRSb2xlRGVzY3JpcHRvcihSb2xlRGVzY3JpcHRvciBvbGRSb2xlRGVzY3JpcHRvcikgewotCQl0aGlzLm9sZFJvbGVEZXNjcmlwdG9yID0gb2xkUm9sZURlc2NyaXB0b3I7Ci0JfQotCi0JcHVibGljIFJvbGVEZXNjcmlwdG9yIGdldFJvbGVEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gcm9sZURlc2NyaXB0b3I7Ci0JfQotCi0JcHVibGljIFRhc2tEZXNjcmlwdG9yIGdldFRhc2tEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gdGFza0Rlc2NyaXB0b3I7Ci0JfQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JvbGVUZWFtUHJvZmlsZUFzc29jaWF0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Sb2xlVGVhbVByb2ZpbGVBc3NvY2lhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTkyOGYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JvbGVUZWFtUHJvZmlsZUFzc29jaWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1bCAyOSwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRlYW1Qcm9maWxlQXNzb2NpYXRpb24gewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9TeW5jaHJvbml6ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1N5bmNocm9uaXplQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjllNTFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1N5bmNocm9uaXplQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkJhdGNoQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXNzZW5nZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIENvbW1hbmQgZm9yIG9uZS13YXkgc3luY2hyb25pemF0aW9uIGZyb20gbWV0aG9kIHRvIHByb2Nlc3MuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTm92IDIyLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZUNvbW1hbmQgZXh0ZW5kcyBDb21wb3VuZENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGVsZW1lbnRzOwotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotCXByb3RlY3RlZCBib29sZWFuIGFib3J0ZWQ7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBkZWxldGVMaXN0OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlRXhlY1N1Y2Nlc3NmdWw7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBkZWxldGVDb21tYW5kTGlzdDsKLQotCXByb3RlY3RlZCBib29sZWFuIHN1Y2Nlc3NmdWw7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJpdmF0ZSBTZXQgc3luY2hGZWF0dXJlczsKLQotCXByaXZhdGUgRGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kIGRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZDsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb24gYWN0aXZpdGllczsKLQotCXByaXZhdGUgYm9vbGVhbiBzaG93U3VjY2Vzc2Z1bE1zZyA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW50aWFsaXplZDsKLQkKLQlwcml2YXRlIEJhdGNoQ29tbWFuZCBiYXRjaENvbW1hbmQgPSBuZXcgQmF0Y2hDb21tYW5kKGZhbHNlKTsKLQlwcml2YXRlIE1hcDxWYXJpYWJpbGl0eUVsZW1lbnQsIFZhcmlhYmlsaXR5RWxlbWVudD4gcmVwbGFjZXJUb0Jhc2VNYXAgPSBuZXcgSGFzaE1hcDxWYXJpYWJpbGl0eUVsZW1lbnQsIFZhcmlhYmlsaXR5RWxlbWVudD4oKTsgIAotCi0vLwlwcml2YXRlIE9iamVjdCBVSUNvbnRleHQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgU3luY2hyb25pemVDb21tYW5kIHRoYXQgdXNlIHRoZSBwcm9jZXNzIGRlZmF1bHQKLQkgKiBjb25maWd1cmF0aW9uIHRvIHN5bmNocm9uaXplIGFsbCB0aGUgc3luY2hyb25pemFibGUgZmVhdHVyZXMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBCcmVha2Rvd25FbGVtZW50IG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVDb21tYW5kKFN0cmluZyBsYWJlbCwgQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQlzdXBlcihsYWJlbCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFN5bmNocm9uaXplQ29tbWFuZCB0aGF0IHVzZSB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiAKLQkgKiBhbmQgbGlzdCBvZiBzeW5jaHJvbml6YWJsZSBmZWF0dXJlcyB0byBzeW5jaHJvbml6ZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEBwYXJhbSBjb25maWcgdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gc3luY2hGZWF0dXJlcyB0aGUgc3luY2hyb25pemFibGUgZmVhdHVyZXMKLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVDb21tYW5kKENvbGxlY3Rpb24gZWxlbWVudHMsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTZXQgc3luY2hGZWF0dXJlcywgYm9vbGVhbiBzaG93U3VjY2Vzc2Z1bE1zZykgewotCQlzdXBlcihMaWJyYXJ5RWRpdFJlc291cmNlcy5BdXRvU3luY2hyb25pemVDb21tYW5kX2xhYmVsKTsgCi0JCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCXRoaXMuc3luY2hGZWF0dXJlcyA9IHN5bmNoRmVhdHVyZXM7Ci0JCXRoaXMuc2hvd1N1Y2Nlc3NmdWxNc2cgPSBzaG93U3VjY2Vzc2Z1bE1zZzsgCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCWlmKGNvbmZpZ3VyYXRvciAhPSBudWxsKSB7Ci0JCQljb25maWd1cmF0b3Iuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFN5bmNocm9uaXphdGlvbkZlYXR1cmVzKFNldCBzeW5jaEZlYXR1cmVzKSB7Ci0JCXRoaXMuc3luY2hGZWF0dXJlcyA9IHN5bmNoRmVhdHVyZXM7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBkb0luaXRpYWxpemUoKSB7Ci0JCWNvbW1hbmRMaXN0LmNsZWFyKCk7Ci0JCQotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCB8fCBlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWRlbGV0ZUNvbW1hbmRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlkZWxldGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlhY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlhZGRUb0RlbGV0ZUxpc3QoZWxlbWVudCwgZGVsZXRlTGlzdCk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlhY3Rpdml0aWVzLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQllbGVtZW50cy5yZW1vdmVBbGwoZGVsZXRlTGlzdCk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKERlc2NyaXB0b3IpIG9iamVjdDsKLQkJCQlpZiAoZGVzY3JpcHRvci5nZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKS5ib29sZWFuVmFsdWUoKQotCQkJCQkJJiYgIWRlbGV0ZUxpc3QuY29udGFpbnMoZGVzY3JpcHRvcikpIHsKLQkJCQkJaWYoZGVzY3JpcHRvci5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7CQkJCQkJCi0JCQkJCQkvLyBkZXNjcmlwdG9yIGlzIHVzZWQgYnkgVGVhbVByb2ZpbGUgdG8gcmVwcmVzZW50IGEgcm9sZSBvciB1c2VkIGJ5IGEgZGVsaXZlcmFibGUgZGVzY3JpcHRvciB0bwotCQkJCQkJLy8gcmVwcmVzZW50IGEgZGVsaXZlcmFibGUgcGFydAotCQkJCQkJLy8KLQkJCQkJCWlmKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IgJiYgKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpZGVzY3JpcHRvcikuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJCQkJYXBwZW5kKG5ldyBTeW5jaHJvbml6ZURlbGl2ZXJhYmxlRGVzY3JpcHRvckNvbW1hbmQoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZGVzY3JpcHRvciwgc3luY2hGZWF0dXJlcywgY29uZmlnKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlhcHBlbmQobmV3IEJhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZChkZXNjcmlwdG9yLCBzeW5jaEZlYXR1cmVzLCBjb25maWcpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUFjdGl2aXR5IGFjdCA9IGRlc2NyaXB0b3IuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCQlUYXNrIHRhc2sgPSAoKFRhc2tEZXNjcmlwdG9yKSBvYmplY3QpLmdldFRhc2soKTsKLQkJCQkJCQlpZiAodGFzayAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmKHJlcGxhY2VyVG9CYXNlTWFwLmNvbnRhaW5zS2V5KHRhc2spKSB7Ci0JCQkJCQkJCQl0YXNrID0gKFRhc2spIHJlcGxhY2VyVG9CYXNlTWFwLmdldCh0YXNrKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlhcHBlbmQobmV3IFdCU0Ryb3BDb21tYW5kKGFjdCwgQ29sbGVjdGlvbnMKLQkJCQkJCQkJCQkuc2luZ2xldG9uTGlzdCh0YXNrKSwgY29uZmlnLCBzeW5jaEZlYXR1cmVzKSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQkJCVJvbGUgcm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIG9iamVjdCkuZ2V0Um9sZSgpOwotCQkJCQkJCWlmIChyb2xlICE9IG51bGwpIHsKLQkJCQkJCQkJaWYocmVwbGFjZXJUb0Jhc2VNYXAuY29udGFpbnNLZXkocm9sZSkpIHsKLQkJCQkJCQkJCXJvbGUgPSAoUm9sZSkgcmVwbGFjZXJUb0Jhc2VNYXAuZ2V0KHJvbGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWFwcGVuZChuZXcgT0JTRHJvcENvbW1hbmQoYWN0LCBDb2xsZWN0aW9ucwotCQkJCQkJCQkJCS5zaW5nbGV0b25MaXN0KHJvbGUpLCBjb25maWcsIHN5bmNoRmVhdHVyZXMsIGNvbmZpZ3VyYXRvcikpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqZWN0KQotCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQkJCWlmICh3cCAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmKHJlcGxhY2VyVG9CYXNlTWFwLmNvbnRhaW5zS2V5KHdwKSkgewotCQkJCQkJCQkJd3AgPSAoV29ya1Byb2R1Y3QpIHJlcGxhY2VyVG9CYXNlTWFwLmdldCh3cCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJYXBwZW5kKG5ldyBQQlNEcm9wQ29tbWFuZChhY3QsIENvbGxlY3Rpb25zCi0JCQkJCQkJCQkJLnNpbmdsZXRvbkxpc3Qod3ApLCBjb25maWcsIHN5bmNoRmVhdHVyZXMsIGNvbmZpZ3VyYXRvcikpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlhcHBlbmRDb21tYW5kcygoQWN0aXZpdHkpIG9iamVjdCk7Ci0JCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJYXBwZW5kQ29tbWFuZHMoKFRlYW1Qcm9maWxlKW9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICFkZWxldGVMaXN0LmlzRW1wdHkoKSB8fCAhY29tbWFuZExpc3QuaXNFbXB0eSgpIHx8ICFhY3Rpdml0aWVzLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpbml0aWxpemUoKSB7Ci0JCWJvb2xlYW4gYiA9IGlzUHJlcGFyZWQ7Ci0JCXRyeSB7Ci0JCQkvLyBzaW5jZSBFY2xpcHNlIDMuMywgQ29tcG91bmRDb21tYW5kLmFwcGVuZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgaXNQcmVwYXJlZCBpcyBhbHJlYWR5IHNldAotCQkJLy8gYnV0IHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBpc1ByZXBhcmVkIGlzIHNldCBpbiBjYW5FeGVjdXRlKCkgYW5kIGl0IG1ha2VzIG1hbnkgY2FsbHMgdG8gYXBwZW5kKCkKLQkJCS8vIHdvcmstYXJvdW5kIGlzIHRvIHVuc2V0IGlzUHJlcGFyZWQgYXQgYmVnaW5uaW5nIG9mIHRoaXMgbWV0aG9kIGFuZCBzZXQgaXQgYmFjayB0byBvbGQgdmFsdWUgYXQgbWV0aG9kIGVuZC4KLQkJCS8vCi0JCQlpc1ByZXBhcmVkID0gZmFsc2U7Ci0JCQlyZXR1cm4gaW50aWFsaXplZCA9IGRvSW5pdGlhbGl6ZSgpOwkJCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlpc1ByZXBhcmVkID0gYjsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBpbnRpYWxpemVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnRpYWxpemVkKCkgewotCQlyZXR1cm4gaW50aWFsaXplZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kQ29tbWFuZHMoQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJTGlzdCB0YXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCByb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB3b3JrUHJvZHVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgYWN0aXZpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQlpZiAoKChEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCQkJCQkJLmJvb2xlYW5WYWx1ZSgpCi0JCQkJCQkmJiAhZGVsZXRlTGlzdC5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCQlUYXNrIHRhc2sgPSAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRUYXNrKCk7Ci0JCQkJCQlpZiAodGFzayAhPSBudWxsKSB7Ci0JCQkJCQkJaWYocmVwbGFjZXJUb0Jhc2VNYXAuY29udGFpbnNLZXkodGFzaykpIHsKLQkJCQkJCQkJdGFzayA9IChUYXNrKSByZXBsYWNlclRvQmFzZU1hcC5nZXQodGFzayk7Ci0JCQkJCQkJfQotCQkJCQkJCXRhc2tzLmFkZCh0YXNrKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJCVJvbGUgcm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFJvbGUoKTsKLQkJCQkJCWlmIChyb2xlICE9IG51bGwpIHsKLQkJCQkJCQlpZihyZXBsYWNlclRvQmFzZU1hcC5jb250YWluc0tleShyb2xlKSkgewotCQkJCQkJCQlyb2xlID0gKFJvbGUpIHJlcGxhY2VyVG9CYXNlTWFwLmdldChyb2xlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcm9sZXMuYWRkKHJvbGUpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCVdvcmtQcm9kdWN0IHdwID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQkJaWYgKHdwICE9IG51bGwpIHsKLQkJCQkJCQlpZihyZXBsYWNlclRvQmFzZU1hcC5jb250YWluc0tleSh3cCkpIHsKLQkJCQkJCQkJd3AgPSAoV29ya1Byb2R1Y3QpIHJlcGxhY2VyVG9CYXNlTWFwLmdldCh3cCk7Ci0JCQkJCQkJfQotCQkJCQkJCXdvcmtQcm9kdWN0cy5hZGQod3ApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlhY3Rpdml0aWVzLmFkZChlbGVtZW50KTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJYXBwZW5kQ29tbWFuZHMoKFRlYW1Qcm9maWxlKWVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWlmICghdGFza3MuaXNFbXB0eSgpKSB7Ci0JCQlhcHBlbmQobmV3IFdCU0Ryb3BDb21tYW5kKGFjdGl2aXR5LCB0YXNrcywgY29uZmlnLCBzeW5jaEZlYXR1cmVzKSk7Ci0JCX0KLQkJaWYgKCFyb2xlcy5pc0VtcHR5KCkpIHsKLQkJCWFwcGVuZChuZXcgT0JTRHJvcENvbW1hbmQoYWN0aXZpdHksIHJvbGVzLCBjb25maWcsIHN5bmNoRmVhdHVyZXMsIGNvbmZpZ3VyYXRvcikpOwotCQl9Ci0JCWlmICghd29ya1Byb2R1Y3RzLmlzRW1wdHkoKSkgewotCQkJYXBwZW5kKG5ldyBQQlNEcm9wQ29tbWFuZChhY3Rpdml0eSwgd29ya1Byb2R1Y3RzLCBjb25maWcsCi0JCQkJCXN5bmNoRmVhdHVyZXMsIGNvbmZpZ3VyYXRvcikpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2aXRpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlhcHBlbmRDb21tYW5kcygoQWN0aXZpdHkpIGl0ZXIubmV4dCgpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYXBwZW5kQ29tbWFuZHMoVGVhbVByb2ZpbGUgdGVhbSkgewotCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKHRlYW0sIGZhbHNlKSB7Ci0KLQkJCS8qKgotCQkJICogCi0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoKFRlYW1Qcm9maWxlKW9iamVjdCk7Ci0JCQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHRlYW0uZ2V0U3ViVGVhbSgpKTsKLQkJCQkJY2hpbGRyZW4uYWRkQWxsKHRlYW0uZ2V0VGVhbVJvbGVzKCkpOwotCQkJCQlyZXR1cm4gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX07Ci0JCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkKLQkJCS8vIHN5bmNoIG9ubHkgb3duIHJvbGUgZGVzY3JpcHRvciBvZiB0ZWFtIHByb2ZpbGUKLQkJCS8vCi0JCQlpZihvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvciAmJiAoKFJvbGVEZXNjcmlwdG9yKW9iaikuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkgewotCQkJCWFwcGVuZChuZXcgQmFzaWNTeW5jaHJvbml6ZURlc2NyaXB0b3JDb21tYW5kKChEZXNjcmlwdG9yKSBvYmosIHN5bmNoRmVhdHVyZXMsIGNvbmZpZykpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlIYXNoU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29tbWFuZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkKLQkJCU9iamVjdCBjbWQgPSBpdGVyLm5leHQoKTsKLQkJCWlmKGNtZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbCgoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCljbWQpLmdldE1vZGlmaWVkUmVzb3VyY2VzKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0JCi0vLwlwdWJsaWMgdm9pZCBzZXRVSUNvbnRleHQoT2JqZWN0IFVJQ29udGV4dCkgewotLy8JCXRoaXMuVUlDb250ZXh0ID0gVUlDb250ZXh0OwotLy8JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIGRlbGV0ZSBhbGwgZGVzY3JpcHRvcnMgd2hvc2UgbGlua2VkIGVsZW1lbnQgYXJlIG5vIGxvbmdlciBpbiB0aGUKLQkJLy8gY29uZmlndXJhdGlvbgotCQkvLwotCQlpZiAoIWRlbGV0ZUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlDb21tYW5kIGNtZCA9IGRlbGV0ZShkZWxldGVMaXN0KTsKLQkJCWlmIChjbWQgIT0gbnVsbCkgewotCQkJCWRlbGV0ZUNvbW1hbmRMaXN0LmFkZChjbWQpOwotCQkJfQotCQl9Ci0JCQotCQliYXRjaENvbW1hbmQuZXhlY3V0ZSgpOwotCQkKLQkJaWYgKCFhYm9ydGVkKSB7Ci0vLwkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0vLwotLy8JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLS8vCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLS8vCQkJCQlwcmVFeGVjU3VjY2Vzc2Z1bCA9IHByZUV4ZWN1dGUoKTsKLS8vCQkJCX0KLS8vCi0vLwkJCX07Ci0vLwkJCQkJCQotLy8JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBmYWxzZSwgbnVsbCk7Ci0vLwotLy8JCQlpZiAocHJlRXhlY1N1Y2Nlc3NmdWwpIHsKLS8vCQkJCXRyeSB7Ci0vLwkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoRGlzcGxheS5nZXRDdXJyZW50KCksIG5ldyBSdW5uYWJsZSgpIHsKLS8vCQkJCQkJCi0vLwkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLS8vCQkJCQkJCXN1cGVyUmVkbygpOwotLy8JCQkJCQkJc3VjY2Vzc2Z1bCA9IHRydWU7Ci0vLwkJCQkJCX0KLS8vCQkJCQkJCi0vLwkJCQkJfSk7Ci0vLwkJCQl9Ci0vLwkJCQljYXRjaChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLS8vCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKGdldExhYmVsKCksIGUudG9TdHJpbmcoKSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJCQotCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXByZUV4ZWNTdWNjZXNzZnVsID0gcHJlRXhlY3V0ZSgpOwotCQkJCQlpZihwcmVFeGVjdXRlKCkpIHsKLQkJCQkJCXN1cGVyUmVkbygpOwotCQkJCQkJc3VjY2Vzc2Z1bCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX07Ci0JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuSW5VSShydW5uYWJsZSwgZ2V0TGFiZWwoKSk7Ci0JCQkKLQkJCWlmIChzdWNjZXNzZnVsKSB7CQkJCQotCQkJCWlmKCFhY3Rpdml0aWVzLmlzRW1wdHkoKSkgewotCQkJCQlpZihkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgPT0gbnVsbCkgewotCQkJCQkJZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kID0gbmV3IERlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZChlbGVtZW50cywgdHJ1ZSwgZGVsZXRlTGlzdCkgewotCQkJCQkJCQotCQkJCQkJCXByb3RlY3RlZCBDb21tYW5kIGRlbGV0ZShMaXN0IGVsZW1lbnRzKSB7Ci0JCQkJCQkJCXJldHVybiBTeW5jaHJvbml6ZUNvbW1hbmQudGhpcy5kZWxldGUoZWxlbWVudHMpOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCX07Ci0JCQkJCQlkZWxldGVDb21tYW5kTGlzdC5hZGQoZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kKTsKLQkJCQkJfQotCQkJCQlkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuZXhlY3V0ZSgpOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoc2hvd1N1Y2Nlc3NmdWxNc2cpIHsKLQkJCQkJaWYoIXJlcGxhY2VyVG9CYXNlTWFwLmlzRW1wdHkoKSkgewotCQkJCQkJcmVmcmVzaFZpZXdlcigpOwotCQkJCQl9Ci0JCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93SW5mbygKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLlN5bmNocm9uaXplQ29tcGxldGVEaWFsb2dfVGl0bGUsCi0JCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5BdXRvU3luY2hyb25pemVDb21tYW5kX3N1Y2Vzc2Z1bCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hWaWV3ZXIoKSB7Ci0JCWlmKGVsZW1lbnRzLmlzRW1wdHkoKSkgIHJldHVybjsKLQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGVsZW1lbnRzLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJaWYocHJvYyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IFRuZ0FkYXB0ZXJGYWN0b3J5LnByb2Nlc3NBZGFwdGVyRmFjdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5wcm9jZXNzQWRhcHRlckZhY3Rvcmllc1tpXTsKLQkJCQlQcm9jZXNzVXRpbC5yZWZyZXNoVmlld2VyKGFkYXB0ZXJGYWN0b3J5LCBwcm9jKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdXBlclJlZG8oKSB7Ci0JCXN1cGVyLnJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3VjZXNzZnVsKCkgewotCQlyZXR1cm4gc3VjY2Vzc2Z1bDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVFeGVjdXRlKCkgewotCQlmb3IgKExpc3RJdGVyYXRvciBjb21tYW5kcyA9IGNvbW1hbmRMaXN0Lmxpc3RJdGVyYXRvcigpOyBjb21tYW5kcwotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY29tbWFuZCA9IGNvbW1hbmRzLm5leHQoKTsKLQkJCWlmKGNvbW1hbmQgaW5zdGFuY2VvZiBCU0Ryb3BDb21tYW5kICYmICEoKEJTRHJvcENvbW1hbmQpY29tbWFuZCkucHJlRXhlY3V0ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQkvLyBiZSBwb2xpdGUgdG8gb3RoZXIgdGhyZWFkcyAobm8gZWZmZWN0IG9uIHNvbWUgcGxhdGZvcm1zKQotCQkJLy8KLQkJCVRocmVhZC55aWVsZCgpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIHNwZWNpZmllZCBlbGVtZW50cwotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEByZXR1cm4gdGhlIGV4ZWN1dGVkIGNvbW1hbmQgdGhhdCBkZWxldGVkIHRoZSBnaXZlbiBlbGVtZW50cwotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGRlbGV0ZShMaXN0IGVsZW1lbnRzKSB7Ci0JCUVkaXRpbmdEb21haW4gZG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCW5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJQ29tbWFuZCBjbWQgPSBuZXcgUHJvY2Vzc0VsZW1lbnREZWxldGVDb21tYW5kKFJlbW92ZUNvbW1hbmQuY3JlYXRlKGRvbWFpbiwKLQkJCQllbGVtZW50cyksIGVsZW1lbnRzKTsKLQkJY21kLmV4ZWN1dGUoKTsKLQkJcmV0dXJuIGNtZDsKLQl9Ci0KLQlwcml2YXRlIElDb25maWd1cmF0b3IgZ2V0Q29uZmlndXJhdG9yKCkgewotCQlpZiAoY29uZmlndXJhdG9yID09IG51bGwpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gdGhpcy5jb25maWc7Ci0JCQlpZihjb25maWcgPT0gbnVsbCkgewotCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudHMKLQkJCQkJCS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQkJY29uZmlnID0gcHJvYy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJfQotCQkJY29uZmlndXJhdG9yID0gUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRvckZhY3RvcnkoKQotCQkJCQkuY3JlYXRlQ29uZmlndXJhdG9yKGNvbmZpZyk7Ci0JCX0KLQkJcmV0dXJuIGNvbmZpZ3VyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBkZWxldGVMaXN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRvRGVsZXRlTGlzdChPYmplY3QgZWxlbWVudCwgTGlzdCBkZWxldGVMaXN0KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJaWYgKCFnZXRDb25maWd1cmF0b3IoKS5hY2NlcHQoZWxlbWVudCkpIHsKLQkJCQlNZXRob2RFbGVtZW50IGxpbmtlZEVsZW1lbnQgPSBQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudCgoRGVzY3JpcHRvcikgZWxlbWVudCk7CQkJCQotCQkJCWlmKGxpbmtlZEVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgJiYgVG5nVXRpbC5pc1JlcGxhY2VyKChWYXJpYWJpbGl0eUVsZW1lbnQpIGxpbmtlZEVsZW1lbnQpKSB7Ci0JCQkJCS8vIGlmIHRoZSBsaW5rZWQgZWxlbWVudCBvZiB0aGUgZGVzY3JpcHRvciBpcyBhIHJlcGxhY2VyLCBkZWxldGUgdGhlIGRlc2NyaXB0b3IgaW4gdGhpcyBzeW5jaHJvbml6YXRpb24KLQkJCQkJLy8gb25seSBpZiB0aGUgYmFzZSBvZiBsaW5rZWQgZWxlbWVudCBpcyBub3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkJCQkJLy8KLQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSAoKFZhcmlhYmlsaXR5RWxlbWVudClsaW5rZWRFbGVtZW50KS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCXdoaWxlKGJhc2UgIT0gbnVsbCAmJiBUbmdVdGlsLmlzQ29udHJpYnV0b3JPclJlcGxhY2VyKGJhc2UpKSB7Ci0JCQkJCQliYXNlID0gYmFzZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQkJaWYoYmFzZSAhPSBudWxsKSB7Ci0JCQkJCQlpZighZ2V0Q29uZmlndXJhdG9yKCkuYWNjZXB0KGJhc2UpKSB7Ci0JCQkJCQkJZGVsZXRlTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQliYXRjaENvbW1hbmQuYWRkRmVhdHVyZVZhbHVlKChFT2JqZWN0KSBlbGVtZW50LCAKLQkJCQkJCQkJCVByb2Nlc3NVdGlsLmdldExpbmtSZWZlcmVuY2UoKERlc2NyaXB0b3IpIGVsZW1lbnQpLCBiYXNlKTsKLQkJCQkJCQlyZXBsYWNlclRvQmFzZU1hcC5wdXQoKFZhcmlhYmlsaXR5RWxlbWVudCkgbGlua2VkRWxlbWVudCwgYmFzZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWRlbGV0ZUxpc3QuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQWN0aXZpdHkpIGVsZW1lbnQpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWFkZFRvRGVsZXRlTGlzdChpdGVyLm5leHQoKSwgZGVsZXRlTGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3VwZXJVbmRvKCkgewotCQlzdXBlci51bmRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1bldpdGhCdXN5SW5kaWNhdG9yKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICghZGVsZXRlQ29tbWFuZExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCWZvciAoTGlzdEl0ZXJhdG9yIGNvbW1hbmRzID0gZGVsZXRlQ29tbWFuZExpc3QKLQkJCQkJCQkubGlzdEl0ZXJhdG9yKGRlbGV0ZUNvbW1hbmRMaXN0LnNpemUoKSk7IGNvbW1hbmRzCi0JCQkJCQkJLmhhc1ByZXZpb3VzKCk7KSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUNvbW1hbmQgY29tbWFuZCA9IChDb21tYW5kKSBjb21tYW5kcy5wcmV2aW91cygpOwotCQkJCQkJCWNvbW1hbmQudW5kbygpOwotCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJCQkvLyBTa2lwIG92ZXIgdGhlIGNvbW1hbmQgdGhhdCB0aHJldyB0aGUgZXhjZXB0aW9uLgotCQkJCQkJCS8vCi0JCQkJCQkJY29tbWFuZHMubmV4dCgpOwotCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJLy8gSXRlcmF0ZSBmb3J3YXJkIG92ZXIgdGhlIHVuZG9uZSBjb21tYW5kcyB0bwotCQkJCQkJCQkvLyByZWRvIHRoZW0uCi0JCQkJCQkJCS8vCi0JCQkJCQkJCXdoaWxlIChjb21tYW5kcy5oYXNOZXh0KCkpIHsKLQkJCQkJCQkJCUNvbW1hbmQgY29tbWFuZCA9IChDb21tYW5kKSBjb21tYW5kcy5uZXh0KCk7Ci0JCQkJCQkJCQljb21tYW5kLnJlZG8oKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gbmVzdGVkRXhjZXB0aW9uKSB7Ci0JCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCS5sb2cobmV3IFdyYXBwZWRFeGNlcHRpb24oCi0JCQkJCQkJCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJLmdldFN0cmluZygiX1VJX0lnbm9yZUV4Y2VwdGlvbl9leGNlcHRpb24iKSwgbmVzdGVkRXhjZXB0aW9uKS5maWxsSW5TdGFja1RyYWNlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCi0JCQkJCQkJdGhyb3cgZXhjZXB0aW9uOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJc3VwZXJVbmRvKCk7Ci0JCQkJCi0JCQkJYmF0Y2hDb21tYW5kLnVuZG8oKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjcHJlcGFyZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoYWN0aXZpdGllcyAhPSBudWxsKSB7Ci0JCQlhY3Rpdml0aWVzLmNsZWFyKCk7Ci0JCX0KLQkJaWYoZGVsZXRlQ29tbWFuZExpc3QgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVsZXRlQ29tbWFuZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQ29tbWFuZCBjbWQgPSAoQ29tbWFuZCkgaXRlci5uZXh0KCk7Ci0JCQkJY21kLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlpZihkZWxldGVMaXN0ICE9IG51bGwpIHsKLQkJCWRlbGV0ZUxpc3QuY2xlYXIoKTsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1N5bmNocm9uaXplRGVsaXZlcmFibGVEZXNjcmlwdG9yQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvU3luY2hyb25pemVEZWxpdmVyYWJsZURlc2NyaXB0b3JDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NzVlN2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvU3luY2hyb25pemVEZWxpdmVyYWJsZURlc2NyaXB0b3JDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIENvbW1hbmQgdG8gc3luY2hyb25pemUgYXR0cmlidXRlcyBhbmQgZGVsaXZlcmFibGUgcGFydHMgb2YgYSBkZWxpdmVyYWJsZSBkZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gRmViIDksIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZURlbGl2ZXJhYmxlRGVzY3JpcHRvckNvbW1hbmQgZXh0ZW5kcwotCQlCYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQgewotCQotCXByaXZhdGUgU2V0IGRlc2NyaXB0b3JzVG9SZWZyZXNoOwotCXByaXZhdGUgTWFwIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0czsKLQlwcml2YXRlIERlc2NyaXB0b3JVcGRhdGVCYXRjaENvbW1hbmQgIHVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQ7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKiBAcGFyYW0gc3luY2hGZWF0dXJlcwotCSAqIEBwYXJhbSBjb25maWcKLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVEZWxpdmVyYWJsZURlc2NyaXB0b3JDb21tYW5kKFdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yLAotCQkJU2V0IHN5bmNoRmVhdHVyZXMsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyKGRlc2NyaXB0b3IsIHN5bmNoRmVhdHVyZXMsIGNvbmZpZyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQmFzaWNTeW5jaHJvbml6ZURlc2NyaXB0b3JDb21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIHVwZGF0ZSBsaW5rZWQgZWxlbWVudCBpZiBuZWVkZWQKLQkJLy8gc3luY2hyb25pemUgYXR0cmlidXRlcwotCQkvLwotCQlzdXBlci5leGVjdXRlKCk7Ci0JCQotCQlpZihkZXNjcmlwdG9yc1RvUmVmcmVzaCA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9yc1RvUmVmcmVzaCA9IG5ldyBIYXNoU2V0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5jbGVhcigpOwotCQl9Ci0JCWlmKHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyA9PSBudWxsKSB7Ci0JCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCWVsc2UgewotCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmNsZWFyKCk7Ci0JCX0KLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlc2NyaXB0b3I7Ci0JCVByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVEZWxpdmVyYWJsZVBhcnRzKHdwZCwgKERlbGl2ZXJhYmxlKXdwZC5nZXRXb3JrUHJvZHVjdCgpLCBjb25maWcsCi0JCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLCBkZXNjcmlwdG9yc1RvUmVmcmVzaCk7Ci0JCQotCQlpZighd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmlzRW1wdHkoKSB8fCAhZGVzY3JpcHRvcnNUb1JlZnJlc2guaXNFbXB0eSgpKSB7Ci0JCQlpZih1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kID09IG51bGwpIHsKLQkJCQl1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kID0gbmV3IERlc2NyaXB0b3JVcGRhdGVCYXRjaENvbW1hbmQodHJ1ZSwgc3luY2hGZWF0dXJlcywgY29uZmlnKTsKLQkJCQl1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kLnNldERlc2NyaXB0b3JzVG9SZWZyZXNoKGRlc2NyaXB0b3JzVG9SZWZyZXNoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQuZ2V0T2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwKCkuY2xlYXIoKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IHdwRGVzYyA9IGVudHJ5LmdldEtleSgpOwotCQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQuZ2V0T2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwKCkucHV0KHdwRGVzYywgCi0JCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwgZW50cnkuZ2V0VmFsdWUoKSkpOwotCQkJfQotCQkJCi0JCQl1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kLmV4ZWN1dGUoKTsKLQkJfQkJCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZih1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kICE9IG51bGwpIHsKLQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQudW5kbygpOwotCQl9Ci0JCQotCQlzdXBlci51bmRvKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsJCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQotCQlpZih1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kICE9IG51bGwpIHsKLQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQuZGlzcG9zZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNzgzNTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEZlYiAxMCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgU3VwcHJlc3Npb24gc3VwcHJlc3Npb247Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGVsZW1lbnRzOwotCXByaXZhdGUgSGFzaFNldCBpbmhlcml0ZWRFbGVtZW50czsKLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCXByaXZhdGUgQ29sbGVjdGlvbiBhZmZlY3RlZE9iamVjdHM7Ci0JcHJpdmF0ZSBIYXNoTWFwIG9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBVcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQ29tbWFuZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKi8KLQlwdWJsaWMgVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBDb2xsZWN0aW9uIGVsZW1lbnRzLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJc3VwZXIobGFiZWwpOwotCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQkJdGhpcy5zdXBwcmVzc2lvbiA9IHN1cHByZXNzaW9uOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKGFmZmVjdGVkT2JqZWN0cyAhPSBudWxsKSB7Ci0JCQlhZmZlY3RlZE9iamVjdHMuY2xlYXIoKTsKLQkJCWFmZmVjdGVkT2JqZWN0cyA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmKGluaGVyaXRlZEVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWluaGVyaXRlZEVsZW1lbnRzLmNsZWFyKCk7Ci0JCQlpbmhlcml0ZWRFbGVtZW50cyA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmKG9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcCAhPSBudWxsKSB7Ci0JCQlvYmplY3RUb1N1cHByZXNzaW9uU3RhdGVNYXAuY2xlYXIoKTsKLQkJCW9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcCA9IG51bGw7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBzdXBwcmVzc2lvbi5nZXRQcm9jZXNzKCkuZVJlc291cmNlKCk7Ci0JCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHJlc291cmNlKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCWlmKGFmZmVjdGVkT2JqZWN0cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gYWZmZWN0ZWRPYmplY3RzOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJaWYoYWZmZWN0ZWRPYmplY3RzID09IG51bGwpIHsKLQkJCWFmZmVjdGVkT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQllbHNlIHsKLQkJCWFmZmVjdGVkT2JqZWN0cy5jbGVhcigpOwotCQl9Ci0JCQotCQlpZihvYmplY3RUb1N1cHByZXNzaW9uU3RhdGVNYXAgPT0gbnVsbCkgewotCQkJb2JqZWN0VG9TdXBwcmVzc2lvblN0YXRlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQllbHNlIHsKLQkJCW9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcC5jbGVhcigpOwotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRJbmhlcml0ZWRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgaXRlci5uZXh0KCk7Ci0JCQlib29sZWFuIHdhc1N1cHByZXNzZWQgPSBzdXBwcmVzc2lvbi5pc0luU3VwcHJlc3NlZExpc3Qod3JhcHBlcik7Ci0JCQlpZihzdXBwcmVzc2lvbi51cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlKHdyYXBwZXIpKSB7Ci0JCQkJYWZmZWN0ZWRPYmplY3RzLmFkZCh3cmFwcGVyKTsKLQkJCQlvYmplY3RUb1N1cHByZXNzaW9uU3RhdGVNYXAucHV0KHdyYXBwZXIsIEJvb2xlYW4udmFsdWVPZih3YXNTdXBwcmVzc2VkKSk7Ci0JCQl9CQkJCQkJCQkJCQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsJCQotCQlleGVjdXRlKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYob2JqZWN0VG9TdXBwcmVzc2lvblN0YXRlTWFwICE9IG51bGwgJiYgIW9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCUJvb2xlYW4gc3VwcHJlc3NlZCA9IChCb29sZWFuKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWlmKHN1cHByZXNzZWQuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJc3VwcHJlc3Npb24uc3VwcHJlc3MoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChlbnRyeS5nZXRLZXkoKSkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3VwcHJlc3Npb24ucmV2ZWFsKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZW50cnkuZ2V0S2V5KCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlhZmZlY3RlZE9iamVjdHMuY2xlYXIoKTsKLQkJCWFmZmVjdGVkT2JqZWN0cy5hZGRBbGwoZWxlbWVudHMpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjcHJlcGFyZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldEluaGVyaXRlZEVsZW1lbnRzKCkgewotCQlpZihpbmhlcml0ZWRFbGVtZW50cyA9PSBudWxsKSB7Ci0JCQlpbmhlcml0ZWRFbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWZvciAoSXRlcmF0b3IgdHJlZUl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoYWRhcHRlckZhY3RvcnksIGVsZW1lbnQpOyB0cmVlSXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlID0gdHJlZUl0ZXIubmV4dCgpOwotCQkJCQlpZihQcm9jZXNzVXRpbC5pc0luaGVyaXRlZChlKSkgewotCQkJCQkJaW5oZXJpdGVkRWxlbWVudHMuYWRkKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbmhlcml0ZWRFbGVtZW50czsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvVmFyeUFjdGl2aXR5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvVmFyeUFjdGl2aXR5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjQzYmVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1ZhcnlBY3Rpdml0eUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbW1hbmRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAxMCwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFyeUFjdGl2aXR5Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcjsKLQotCXByaXZhdGUgUHJvY2VzcyBwcm9jOwotCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlZEFjdGl2aXRpZXM7Ci0JCi0JcHVibGljIEFjdGl2aXR5IHN1cGVyQWN0aXZpdHk7Ci0KLQlwdWJsaWMgVmFyeUFjdGl2aXR5Q29tbWFuZChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCXRoaXMud3JhcHBlciA9IHdyYXBwZXI7Ci0JCXByb2MgPSAoUHJvY2Vzcykgd3JhcHBlci5nZXRUb3BJdGVtKCk7Ci0JfQotCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGdldFdyYXBwZXIoKSB7Ci0JCXJldHVybiB3cmFwcGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAocHJvYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChwcm9jLmVSZXNvdXJjZSgpKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjcHJlcGFyZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlpZiAoY3JlYXRlZEFjdGl2aXRpZXMgPT0gbnVsbCkgewotCQkJY3JlYXRlZEFjdGl2aXRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0gZWxzZSB7Ci0JCQljcmVhdGVkQWN0aXZpdGllcy5jbGVhcigpOwotCQl9Ci0KLQkJZG9WYXJ5KCk7Ci0KLQkJTGlzdCBsaXN0ZW5lcnMgPSBQcm92aWRlcnMKLQkJCQkuZ2V0Q29tbWFuZExpc3RlbmVycyhWYXJ5QWN0aXZpdHlDb21tYW5kLmNsYXNzKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUNvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lciA9IChJQ29tbWFuZExpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCQlsaXN0ZW5lci5ub3RpZnlFeGVjdXRlZCh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvVmFyeSgpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQkvLyBmaW5kIHRoZSBuZXcgd3JhcHBlcgotCQkvLwotCQlPYmplY3Qgb3duZXIgPSB3cmFwcGVyLmdldE93bmVyKCk7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpcCA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHdyYXBwZXIuZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdChvd25lciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gaXAuZ2V0Q2hpbGRyZW4ob3duZXIpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7CQkKLQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgJiYKLQkJCQkJKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciljaGlsZCkuZ2V0VmFsdWUoKSA9PSB3cmFwcGVyLmdldFZhbHVlKCkpIHsKLQkJCQl3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBjaGlsZDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJZXhlY3V0ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlMaXN0IGxpc3RlbmVycyA9IFByb3ZpZGVycwotCQkJCS5nZXRDb21tYW5kTGlzdGVuZXJzKFZhcnlBY3Rpdml0eUNvbW1hbmQuY2xhc3MpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJQ29tbWFuZExpc3RlbmVyIGxpc3RlbmVyID0gKElDb21tYW5kTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJCWxpc3RlbmVyLnByZVVuZG8odGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWNyZWF0ZWRBY3Rpdml0aWVzLmlzRW1wdHkoKSkgewotCQkJcmVzdG9yZU9yZGVyKCk7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGNyZWF0ZWRBY3Rpdml0aWVzLmdldCgwKTsKLQkJCXN1cGVyQWN0aXZpdHkgPSBhY3QuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQlhY3Quc2V0U3VwZXJBY3Rpdml0aWVzKG51bGwpOwotCQkJY3JlYXRlZEFjdGl2aXRpZXMuY2xlYXIoKTsKLQkJfQotCQkKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUNvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lciA9IChJQ29tbWFuZExpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCQlsaXN0ZW5lci5wb3N0VW5kbyh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlc3RvcmVzIHRoZSBvcmRlciBvZiB0aGUgc2libGluZ3Mgb2YgdGhlIHdyYXBwZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlT3JkZXIoKSB7Ci0JCUFjdGl2aXR5IHZhcmllZEFjdCA9IChBY3Rpdml0eSkgY3JlYXRlZEFjdGl2aXRpZXMuZ2V0KGNyZWF0ZWRBY3Rpdml0aWVzLnNpemUoKSAtIDEpOwotCQlCcmVha2Rvd25FbGVtZW50IGJlID0gKEJyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlCcmVha2Rvd25FbGVtZW50IHByZXYgPSB2YXJpZWRBY3QuZ2V0UHJlc2VudGVkQmVmb3JlKCk7Ci0JCWlmKHByZXYgIT0gbnVsbCAmJiBwcm9jID09IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhwcmV2KSkgewotCQkJcHJldi5zZXRQcmVzZW50ZWRBZnRlcihiZSk7Ci0JCX0KLQkJQnJlYWtkb3duRWxlbWVudCBuZXh0ID0gdmFyaWVkQWN0LmdldFByZXNlbnRlZEFmdGVyKCk7Ci0JCWlmKG5leHQgIT0gbnVsbCAmJiBwcm9jID09IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhuZXh0KSkgewotCQkJbmV4dC5zZXRQcmVzZW50ZWRCZWZvcmUoYmUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldFJlc3VsdCgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gY3JlYXRlZEFjdGl2aXRpZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvV0JTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9XQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEzZTFmMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9XQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotCi0vKioKLSAqIERyYWcgYW5kIGRyb3AgY29tbWFuZCB0byBkcm9wIHRhc2tzIGluIFdCUyBzdHJ1Y3R1cmUKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFdCU0RyYWdBbmREcm9wQ29tbWFuZCBleHRlbmRzIEJTRHJhZ0FuZERyb3BDb21tYW5kIHsKLQotCS8qKgotCSAqIEBwYXJhbSBkb21haW4KLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiBAcGFyYW0gb3BlcmF0aW9ucwotCSAqIEBwYXJhbSBvcGVyYXRpb24KLQkgKiBAcGFyYW0gY29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBXQlNEcmFnQW5kRHJvcENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIE9iamVjdCBvd25lciwKLQkJCWZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGRvbWFpbiwgb3duZXIsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJhZ0FuZERyb3BDb21tYW5kI2FjY2VwdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiV0JTRHJhZ0FuZERyb3BDb21tYW5kLmFjY2VwdCgpOiBvYmo9IitvYmopOwotCi0JCWlmKG9iaiBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCWlmKG93bmVyIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCXJldHVybiBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0VmFsaWREZXNjcmlwdG9yKG9iaiwgKEFjdGl2aXR5KSBvd25lciwKLS8vCQkJCQkJKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pZG9tYWluKS5nZXRBZGFwdGVyRmFjdG9yeSgpKSA9PSBudWxsOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0RyYWdBbmREcm9wQ29tbWFuZCNjcmVhdGVEcm9wQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRHJvcENvbW1hbmQoT2JqZWN0IG93bmVyLCBMaXN0IGRyb3BTcmMpIHsKLQkJcmV0dXJuIG5ldyBXQlNEcm9wQ29tbWFuZCgoQWN0aXZpdHkpIG93bmVyLCBkcm9wU3JjKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1dCU0Ryb3BDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9XQlNEcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGIwYmZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1dCU0Ryb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5VbmlxdWVOYW1lUE5hbWVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQ29tbWFuZCB0byBkcmFwIGFuZCBkcm9wIHRhc2tzIG9udG8gYW4gYWN0aXZpdHkgaW4gd29yayBicmVha2Rvd24gc3RydWN0dXJlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdCU0Ryb3BDb21tYW5kIGV4dGVuZHMgQlNEcm9wQ29tbWFuZCB7Ci0JcHJpdmF0ZSBBcnJheUxpc3Qgcm9sZURlc2NMaXN0OwotCi0JcHJpdmF0ZSBBcnJheUxpc3Qgd3BEZXNjTGlzdDsKLQotCXByaXZhdGUgSGFzaE1hcCB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHM7Ci0KLQlwcml2YXRlIEhhc2hNYXA8V29ya1Byb2R1Y3REZXNjcmlwdG9yLCBXb3JrUHJvZHVjdERlc2NyaXB0b3I+IHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwOwotCi0JcHJpdmF0ZSBIYXNoTWFwPFJvbGVEZXNjcmlwdG9yLCBUZWFtUHJvZmlsZT4gcm9sZURlc2NUZWFtUHJvZmlsZU1hcDsKLQkKLQlwcml2YXRlIElFeGVjdXRvciBleGVjdXRvcjsKLQotCXByaXZhdGUgY2xhc3MgRXhlY3V0b3IgaW1wbGVtZW50cyBJRXhlY3V0b3IgewotCi0JCXB1YmxpYyBib29sZWFuIHByZUV4ZWN1dGUoKSB7Ci0JCQl0YXNrRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlyb2xlRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl3cERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzID0gbmV3IEhhc2hNYXAoKTsKLQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCVNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaCA9IHN5bmNocm9uaXplID8gYmF0Y2hDb21tYW5kLmdldERlc2NyaXB0b3JzVG9SZWZyZXNoKCkgOiBudWxsOwotCi0JCQlMaXN0IGJlcyA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCQlVbmlxdWVOYW1lUE5hbWVIYW5kbGVyIHVuaXF1ZU5hbWVzSGFuZGxlciA9IG5ldyBVbmlxdWVOYW1lUE5hbWVIYW5kbGVyKGJlcywgYmVzKTsKLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkcm9wRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgZHJvcEVsZW1lbnRzLmdldChpKTsKLQkJCQlUYXNrRGVzY3JpcHRvciBkZXNjID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKHRhc2ssCi0JCQkJCQlhY3Rpdml0eSwgcm9sZURlc2NMaXN0LCB3cERlc2NMaXN0LAotCQkJCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLAotCQkJCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAsIGRlc2NyaXB0b3JzVG9SZWZyZXNoLAotCQkJCQkJYmF0Y2hDb21tYW5kLmdldE9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCgpLCAKLQkJCQkJCVdCU0Ryb3BDb21tYW5kLnRoaXMuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLAotCQkJCQkJc3luY2hyb25pemUsCi0JCQkJCQlzeW5jaEZlYXR1cmVzKTsKLQkJCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCXVuaXF1ZU5hbWVzSGFuZGxlci5lbnN1cmVVbmlxdWUoZGVzYyk7Ci0JCQkJCXRhc2tEZXNjTGlzdC5hZGQoZGVzYyk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBBZGQgdW5pcXVlIG5hbWUgY2hlY2sgZm9yIHJvbGVkZXNjIGFuZCB3cCBkZXNjcmlwdG9ycyBhcyB3ZWxsCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJvbGVEZXNjTGlzdC5zaXplKCk7IGkrKykgewotCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSByb2xlRGVzY0xpc3QuZ2V0KGkpOwkJCQotCQkJCWlmIChyb2xlRGVzYyAhPSBudWxsKSB7Ci0JCQkJCXVuaXF1ZU5hbWVzSGFuZGxlci5lbnN1cmVVbmlxdWUocm9sZURlc2MpOwkKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHdwRGVzY0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgd3BEZXNjTGlzdC5nZXQoaSk7CQkJCi0JCQkJaWYgKHdwRGVzYyAhPSBudWxsKSB7Ci0JCQkJCXVuaXF1ZU5hbWVzSGFuZGxlci5lbnN1cmVVbmlxdWUod3BEZXNjKTsJCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuICF0YXNrRGVzY0xpc3QuaXNFbXB0eSgpCi0JCQkJCXx8ICFyb2xlRGVzY0xpc3QuaXNFbXB0eSgpCi0JCQkJCXx8ICF3cERlc2NMaXN0LmlzRW1wdHkoKQotCQkJCQl8fCAhd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmlzRW1wdHkoKQotCQkJCQl8fCAhd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuaXNFbXB0eSgpCi0JCQkJCXx8IGJhdGNoQ29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkb0V4Y2VjdXRlKCkgewotCQkJLy8gYXV0b21hdGljYWxseSBhZGQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8gZGVsaXZlcmFibGUgcGFydAotCQkJLy8KLQkJCWlmICghd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChNYXAuRW50cnk8V29ya1Byb2R1Y3REZXNjcmlwdG9yLCBXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGVudHJ5IDogCi0JCQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmVudHJ5U2V0KCkpIHsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlbGl2ZXJhYmxlID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZW50cnkKLQkJCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKCFkZWxpdmVyYWJsZS5nZXREZWxpdmVyYWJsZVBhcnRzKCkuY29udGFpbnMoCi0JCQkJCQkJZW50cnkuZ2V0S2V5KCkpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWRlbGl2ZXJhYmxlLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGQoCi0JCQkJCQkJCQllbnRyeS5nZXRLZXkoKSk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkubG9nKCJXQlNEcm9wQ29tbWFuZDo6ZG9FeGVjdXRlIC0gQWRkaW5nIGRlbGl2ZXJhYmxlIHBhcnQgdG8gZGVsaXZlcmFibGUiICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gYWRkIHRhc2sgZGVzY3JpcHRvcnMKLQkJCS8vCi0JCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbCh0YXNrRGVzY0xpc3QpOwotCi0JCQkvLyBhZGQgcm9sZSBkZXNjcmlwdG9ycwotCQkJLy8KLQkJCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKHJvbGVEZXNjTGlzdCk7Ci0KLQkJCS8vIGFkZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJCS8vCi0JCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbCh3cERlc2NMaXN0KTsKLQotCQkJLy8gYWRkIGRlbGl2ZXJhYmxlIHBhcnRzIHRvIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJCS8vCi0JCQlpZiAoIXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuZW50cnlTZXQoKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5Ci0JCQkJCQkJLmdldEtleSgpOwotCQkJCQl3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmFkZEFsbCgKLQkJCQkJCQkoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZihyb2xlRGVzY1RlYW1Qcm9maWxlTWFwID09IG51bGwpIHsKLQkJCQlyb2xlRGVzY1RlYW1Qcm9maWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJVGVhbVByb2ZpbGUgdGVhbVByb2ZpbGUgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VGVhbSgKLQkJCQkJCQlhY3Rpdml0eSwgcm9sZURlc2MuZ2V0Um9sZSgpKTsKLQkJCQkJaWYgKHRlYW1Qcm9maWxlICE9IG51bGwpIHsKLQkJCQkJCXJvbGVEZXNjVGVhbVByb2ZpbGVNYXAucHV0KHJvbGVEZXNjLCB0ZWFtUHJvZmlsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyBhZGQgcm9sZSBkZXNjcmlwdG9ycyB0byB0ZWFtIHByb2ZpbGVzCi0JCQkvLwotCQkJZm9yIChNYXAuRW50cnk8Um9sZURlc2NyaXB0b3IsIFRlYW1Qcm9maWxlPiBlbnRyeSA6IHJvbGVEZXNjVGVhbVByb2ZpbGVNYXAuZW50cnlTZXQoKSkgewotCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5hZGQoZW50cnkuZ2V0S2V5KCkpOwotCQkJfQotCi0JCQkvLyBhZGQgbmV3IGRlc2NyaXB0b3JzIHRvIGFjdGl2aXR5J3MgcGFja2FnZQotCQkJLy8KLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgYWN0aXZpdHkuZUNvbnRhaW5lcigpOwotCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbCh0YXNrRGVzY0xpc3QpOwotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwocm9sZURlc2NMaXN0KTsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKHdwRGVzY0xpc3QpOwotCQkJfQotCQkJCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBkb1VuZG8oKSB7Ci0JCQkKLQkJCS8vIHJlbW92ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJCS8vCi0JCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbCh3cERlc2NMaXN0KTsKLQotCQkJLy8gcmVtb3ZlIHJvbGUgZGVzY3JpcHRvcnMKLQkJCS8vCi0JCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbChyb2xlRGVzY0xpc3QpOwotCi0JCQkvLyByZW1vdmUgdGFzayBkZXNjcmlwdG9ycwotCQkJLy8KLQkJCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKHRhc2tEZXNjTGlzdCk7Ci0KLQkJCS8vIHJlbW92ZSBkZWxpdmVyYWJsZSBwYXJ0cyB0byB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCQkvLwotCQkJaWYgKCF3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmVudHJ5U2V0KCkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbnRyeQotCQkJCQkJCS5nZXRLZXkoKTsKLQkJCQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5yZW1vdmVBbGwoCi0JCQkJCQkJKENvbGxlY3Rpb24pIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gcmVtb3ZlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGZyb20gZGVsaXZlcmFibGUgcGFydAotCQkJLy8KLQkJCWlmICghd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuZW50cnlTZXQoKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlbGl2ZXJhYmxlID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZW50cnkKLQkJCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCQkJZGVsaXZlcmFibGUuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLnJlbW92ZShlbnRyeS5nZXRLZXkoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyByZW1vdmUgcm9sZSBkZXNjcmlwdG9ycyBmcm9tIHRlYW0gcHJvZmlsZXMKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlRGVzY1RlYW1Qcm9maWxlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5yZW1vdmUoZW50cnkuZ2V0S2V5KCkpOwotCQkJfQotCi0JCQkvLyByZW1vdmUgZGVzY3JpcHRvcnMgZnJvbSBhY3Rpdml0eSdzIHBhY2thZ2UKLQkJCS8vCi0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5yZW1vdmVBbGwodGFza0Rlc2NMaXN0KTsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKHJvbGVEZXNjTGlzdCk7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZUFsbCh3cERlc2NMaXN0KTsKLQkJCX0KLQkJfQotCi0JfTsKLQotCS8qKgotCSAqIEBwYXJhbSBhY3QKLQkgKiAgICAgICAgICAgIHRoZSBhY3Rpdml0eSB0aGF0IHRoZSBnaXZlbiB0YXNrcyBhcmUgZHJvcHBlZCBvbgotCSAqIEBwYXJhbSB0YXNrcwotCSAqICAgICAgICAgICAgdGhlIHRhc2tzIHRvIGRyb3Agb24gdGhlIGdpdmVuIGFjdGl2aXR5Ci0JICovCi0JcHVibGljIFdCU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdCwgTGlzdCB0YXNrcykgewotCQlzdXBlcihhY3QsIHRhc2tzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZHJvcEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrKSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gZHJvcEVsZW1lbnRzCi0JICogQHBhcmFtIHN5bmNoCi0JICovCi0JcHVibGljIFdCU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IGRyb3BFbGVtZW50cywgYm9vbGVhbiBzeW5jaCkgewotCQlzdXBlcihhY3Rpdml0eSwgZHJvcEVsZW1lbnRzLCBzeW5jaCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGRyb3BFbGVtZW50cwotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gc3luY2hGZWF0dXJlcwotCSAqLwotCXB1YmxpYyBXQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCBkcm9wRWxlbWVudHMsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU2V0IHN5bmNoRmVhdHVyZXMpIHsKLQkJc3VwZXIoYWN0aXZpdHksIGRyb3BFbGVtZW50cywgY29uZmlnLCBzeW5jaEZlYXR1cmVzKTsKLQl9Ci0KLQlwdWJsaWMgSUV4ZWN1dG9yIGdldEV4ZWN1dG9yKCkgewotCQlpZiAoZXhlY3V0b3IgPT0gbnVsbCkgewotCQkJZXhlY3V0b3IgPSBuZXcgRXhlY3V0b3IoKTsKLQkJfQotCQlyZXR1cm4gZXhlY3V0b3I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNwcmVFeGVjdXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVFeGVjdXRlKCkgewotCQlpZiAoIXN1cGVyLnByZUV4ZWN1dGUoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gZ2V0RXhlY3V0b3IoKS5wcmVFeGVjdXRlKCk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZG9FeGVjdXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCWV4ZWN1dG9yLmRvRXhjZWN1dGUoKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldEFmZmVjdGVkT2JqZWN0cygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlpZiAodGFza0Rlc2NMaXN0ICE9IG51bGwpIHsKLQkJCXJldHVybiB0YXNrRGVzY0xpc3Q7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNkb1VuZG8oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVW5kbygpIHsKLQkJZXhlY3V0b3IuZG9VbmRvKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAocm9sZURlc2NMaXN0ICE9IG51bGwpIHsKLQkJCXJvbGVEZXNjTGlzdC5jbGVhcigpOwotCQl9Ci0JCWlmIChyb2xlRGVzY1RlYW1Qcm9maWxlTWFwICE9IG51bGwpIHsKLQkJCXJvbGVEZXNjVGVhbVByb2ZpbGVNYXAuY2xlYXIoKTsKLQkJfQotCQlpZiAod3BEZXNjTGlzdCAhPSBudWxsKSB7Ci0JCQl3cERlc2NMaXN0LmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyAhPSBudWxsKSB7Ci0JCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuY2xlYXIoKTsKLQkJfQotCQlpZiAod3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAgIT0gbnVsbCkgewotCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuY2xlYXIoKTsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JDcmVhdGVDb3B5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvV29ya1Byb2R1Y3REZXNjcmlwdG9yQ3JlYXRlQ29weUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzY2ZiZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JDcmVhdGVDb3B5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbi5UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAxMiwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yQ3JlYXRlQ29weUNvbW1hbmQgZXh0ZW5kcwotCQlNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQgewotCi0JLyoqCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBjb3B5SGVscGVyCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvckNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGNvcHlIZWxwZXIpIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgY29weUhlbHBlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQjZG9FeGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCXN1cGVyLmRvRXhlY3V0ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDb3B5Q29tbWFuZCNkb0dldENoaWxkcmVuVG9Db3B5KCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBkb0dldENoaWxkcmVuVG9Db3B5KCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZG9HZXRDaGlsZHJlblRvQ29weSgpOwotCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvd25lcjsKLQkJV29ya1Byb2R1Y3Qgd3AgPSB3cGQuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJaWYgKHdwIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwZC5nZXREZWxpdmVyYWJsZVBhcnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBwYXJ0ID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgaXRlcgotCQkJCQkJLm5leHQoKTsKLQkJCQlpZiAocGFydC5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsICYmIHBhcnQgIT0gd3BkKSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChwYXJ0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJaWYgKGRvbWFpbiBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGRvbWFpbikKLQkJCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJLmFkYXB0KG93bmVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihvd25lcikuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJY2hpbGRyZW4uYWRkKFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kI2RvR2V0UmVzdWx0KCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBkb0dldFJlc3VsdCgpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdWx0LmFkZChjb3B5KTsKLQotCQkvLyBDaGlsZHJlbiB0aGF0IGFyZSBzaG93biBpbiBCUyBkdWUgdG8gY2hpbGQgcmVsYXRpb25zaGlwIG9mIGl0cyBsaW5rZWQKLQkJLy8gQ29udGVudEVsZW1lbnQKLQkJLy8gYnV0IHRoZXkgYXJlIG5vdCBkaXJlY3RseSBhc3NvY2lhdGVkIHdpdGggdGhlIG93bmVyLiBXZSBuZWVkIHRvIGFkZAotCQkvLyB0aGVpciBjb3BpZXMgdG8gdGhlIHJlc3VsdAotCQkvLyBzbyB0aGV5IHdpbGwgYmUgYWRkZWQgdG8gY2xpcGJvYXJkIGZvciBsYXRlciBwYXN0ZQotCQkvLwotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb3duZXI7Ci0JCVdvcmtQcm9kdWN0IHdwID0gd3BkLmdldFdvcmtQcm9kdWN0KCk7Ci0JCWlmICh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQlpZiAoZG9tYWluIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZG9tYWluKQotCQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKAotCQkJCQkJYWRhcHRlckZhY3RvcnksIHdwZCwgZmFsc2UpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGNoaWxkQ29weSA9IGNvcHlIZWxwZXIuZ2V0KFRuZ1V0aWwudW53cmFwKGl0ZXIKLQkJCQkJCQkubmV4dCgpKSk7Ci0JCQkJCWlmIChjaGlsZENvcHkgIT0gbnVsbCkgewotCQkJCQkJcmVzdWx0LmFkZChjaGlsZENvcHkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGRvbWFpbiBpbnN0YW5jZW9mIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikKLQkJCSgoVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBkb21haW4pLmFkZENvcHlJbmZvKHJlc3VsdCwKLQkJCQkJY29weUhlbHBlcik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNDk4NzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgY29tbWFuZHMgZm9yIGVkaXRpbmcgYnJlYWtkb3duIGVsZW1lbnRzIGluIGEgUHJvY2VzcyBlZGl0b3IuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjY2OWZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXhwb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIEFjdGl2aXR5IGl0ZW0gcHJvdmlkZXIgZm9yIGNvbnNvbGlkYXRlZCB2aWV3Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0T2JqZWN0KG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE9iamVjdChEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJcmV0dXJuICgoVGFza0Rlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldFRhc2soKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZG9SZWZyZXNoQWZmZWN0ZWRWaWV3ZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1JlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKSB7Ci0JCU9iamVjdCBwcm9jID0gZ2V0VG9wSXRlbSgpOwotCQlPYmplY3QgaXRlbVByb3ZpZGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQocHJvYywKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJKChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBpdGVtUHJvdmlkZXIpCi0JCQkJCS5zZXRSZWZyZXNoQWxsSURzUmVxdWlyZWQodHJ1ZSk7Ci0JCX0KLQotCQlQcm9jZXNzVXRpbAotCQkJCS5yZWZyZXNoSURzSW5WaWV3ZXJzKChFeHBvc2VkQWRhcHRlckZhY3RvcnkpIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKENvbGxlY3Rpb24gY2hpbGRyZW4sIGJvb2xlYW4gdW53cmFwKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5yZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4sIHVud3JhcCk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iaikgewotCQlMaXN0IG5ld0NoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJY2hpbGRyZW4gPSByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4sIGZhbHNlKTsKLQkJTGlzdCByb2xlRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgd3BEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0JCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCQkKLQkJCS8vIGRvbid0IHJldHVybiByb2xlZGVzY3JpcHRvciB3aGljaCBhcmUgbGlua2VkIHRvIHRhc2tkZXNjcmlwdG9yCi0JCQkvLyAKLQkJCWlmIChlIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgZTsKLQkJCQlpZihBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKS5pc0VtcHR5KCkgJiYKLQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLmdldEFkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpLmlzRW1wdHkoKSAmJgotCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuZ2V0QXNzaXN0ZWRUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpLmlzRW1wdHkoKSkgCi0JCQkJewotCQkJCQlyb2xlRGVzY3JpcHRvcnMuYWRkKG9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQkJLy8gZG9uJ3QgcmV0dXJuIHdwZGVzY3JpcHRvciB3aGljaCBhcmUgbGlua2VkIHRvIGVpdGhlcgotCQkJLy8gdGFza2Rlc2NyaXB0b3Igb3Igcm9sZWRlc2NyaXB0b3IKLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZTsKLQkJCQlpZihBc3NvY2lhdGlvbkhlbHBlci5nZXRFeHRlcm5hbElucHV0VG8od3BEZXNjKS5pc0VtcHR5KCkgJiYKLQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLmdldE1hbmRhdG9yeUlucHV0VG8od3BEZXNjKS5pc0VtcHR5KCkgJiYKLQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLmdldE9wdGlvbmFsSW5wdXRUbyh3cERlc2MpLmlzRW1wdHkoKSAmJgotCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3V0cHV0RnJvbSh3cERlc2MpLmlzRW1wdHkoKSAmJgotCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVzcG9uc2libGVSb2xlRGVzY3JpcHRvcnMod3BEZXNjKS5pc0VtcHR5KCkpCi0JCQkJewotCQkJCQl3cERlc2NyaXB0b3JzLmFkZChvYmplY3QpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbmV3Q2hpbGRyZW4uYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkKLQkJbmV3Q2hpbGRyZW4uYWRkQWxsKHJvbGVEZXNjcmlwdG9ycyk7Ci0JCW5ld0NoaWxkcmVuLmFkZEFsbCh3cERlc2NyaXB0b3JzKTsKLQkJCi0JCXVwZGF0ZUNhY2hlZENoaWxkcmVuKG5ld0NoaWxkcmVuKTsKLQkJCi0JCXJldHVybiBuZXdDaGlsZHJlbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Um9sbHVwQ2hpbGRyZW5Gcm9tQ2FjaGUoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJvbGx1cENoaWxkcmVuRnJvbUNhY2hlKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjaXNSb2xsZWRVcCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSb2xsZWRVcCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjQyOThjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRlYW1Qcm9maWxlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBXQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRlYW1Qcm9maWxlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFRlYW1Qcm9maWxlSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmNyZWF0ZVRlYW1Qcm9maWxlQWRhcHRlcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTBhOWU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIFByb2Nlc3MgaXRlbSBwcm92aWRlciBmb3IgY29uc29saWRhdGVkIHZpZXcKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0KLQlwdWJsaWMgUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLmRlbGVnYXRlSXRlbVByb3ZpZGVyID0gZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkFjdGl2aXR5SXRlbVByb3ZpZGVyI2dldFByb3BlcnR5RGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkJCQkJLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUHJvY2Vzc0NvbXBvbmVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJLy8gbmVlZCB0byB1cGRhdGUgdGhlIGxpYnJhcnkgdmlldwotCQkJLy8gYnV0IFByb2Nlc3NDb21wb25lbnRzIGRvbid0IGhhdmUgYSBQcmVzZW50YXRpb24gTmFtZSwgc28KLQkJCS8vIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgcHJvY0NvbXAgdG8gaXRzZWxmCi0JCQkvLyB0aGlzIHdpbGwgY2F1c2UgYSByZWZyZXNoCi0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvYyA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJaWYgKHByb2MuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCQlib29sZWFuIG9sZCA9IHByb2MuZUNvbnRhaW5lcigpLmVEZWxpdmVyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJvYy5lQ29udGFpbmVyKCkuZVNldERlbGl2ZXIodHJ1ZSk7Ci0JCQkJCWlmIChwcm9jLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpCi0JCQkJCQkoKFByb2Nlc3NDb21wb25lbnQpcHJvYy5lQ29udGFpbmVyKCkpLnNldE5hbWUoKChQcm9jZXNzQ29tcG9uZW50KXByb2MuZUNvbnRhaW5lcigpKS5nZXROYW1lKCkpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXByb2MuZUNvbnRhaW5lcigpLmVTZXREZWxpdmVyKG9sZCk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY3ZGE2YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5XcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogUm9sZURlc2NyaXB0b3IgSXRlbSBwcm92aWRlciBmb3IgY29uc29saWRhdGVkIHZpZXcKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChuZXcgQ29tbWFuZFBhcmFtZXRlcih0YXJnZXQsCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNpc1dyYXBwaW5nTmVlZGVkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDcmVhdGVDaGlsZFRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBnZXRGZWF0dXJlVGV4dChmZWF0dXJlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q3JlYXRlQ2hpbGRJbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBpbWcgPSBUbmdVdGlsLmdldEltYWdlKGNoaWxkKTsKLQkJcmV0dXJuIGltZyAhPSBudWxsID8gaW1nIDogc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRJbWFnZShvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZVdyYXBwZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIElCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV3JhcHBlcih2YWx1ZSwgb2JqZWN0LCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCQl3cmFwcGVyLnNldFJlYWRPbmx5KGZhbHNlKTsKLQkJcmV0dXJuIHdyYXBwZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJvbGVEZXNjcmlwdG9yLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQlyZWZyZXNoQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hDaGlsZHJlbihOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChQcm9jZXNzVXRpbC5pc1JlZnJlc2hSZXF1aXJlZChub3RpZmljYXRpb24sIG51bGwpKSB7Ci0JCQlQcm9jZXNzIHRvcEFjdCA9IChQcm9jZXNzKSBnZXRUb3BJdGVtKCk7Ci0JCQlBZGFwdGVyRmFjdG9yeSByb290QWRhcHRlckZhY3RvcnkgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQotCQkJUHJvY2Vzc1V0aWwucmVmcmVzaFZpZXdlcihyb290QWRhcHRlckZhY3RvcnksIHRvcEFjdCk7Ci0JCX0KLQkJCi0JCS8vIHJlZnJlc2ggY2hpbGRyZW4gb2YgdGhpcyBpdGVtIHByb3ZpZGVyLCBpdHMgcGFyZW50IGFjdGl2aXR5IGFuZAotCQkvLyBhbGwgZXh0ZW5kZXJzLCBsb2NhbCBjb250cmlidXRvcnMgb2YgdGhlIHBhcmVudCBhY3Rpdml0eQotCQkvLwotCQlUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5yZWZyZXNoQ2hpbGRyZW4odGhpcywgbm90aWZpY2F0aW9uKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNhY2hlZENoaWxkcmVuKENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLS8vCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0vLwkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChjaGlsZHJlbik7Ci0vLwkJfQotLy8JCWVsc2UgewotLy8JCQljYWNoZWRDaGlsZHJlbi5jbGVhcigpOwotLy8JCQljYWNoZWRDaGlsZHJlbi5hZGRBbGwoY2hpbGRyZW4pOwotLy8JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqKSB7Ci0JCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBvYmo7Ci0JCUxpc3QgbmV3Q2hpbGRyZW47Ci0JCi0JCS8vIElmIHJvbGVzIGhhcyBhbnkgb2YgdGFza2Rlc2NyaXB0b3IgbGlua2VkIHRoZW4gZG9uJ3Qgc2hvdyBhbnkKLQkJLy8gY2hpbGRyZW4gb3RoZXJ3aXNlIHNob3cgaXQncyBsaW5rZWQgd29ya3Byb2R1Y3QgZGVzY3JpcHRvcgotCQlpZighQXNzb2NpYXRpb25IZWxwZXIuZ2V0UHJpbWFyeVRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYykuaXNFbXB0eSgpIHx8Ci0JCQkJIUFzc29jaWF0aW9uSGVscGVyLmdldEFkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpLmlzRW1wdHkoKSB8fAotCQkJCSFBc3NvY2lhdGlvbkhlbHBlci5nZXRBc3Npc3RlZFRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYykuaXNFbXB0eSgpKQotCQl7Ci0JCQluZXdDaGlsZHJlbiA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBnZXQgY2hpbGRyZW4KLQkJCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmopOwotCQkJbmV3Q2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJRmlsdGVyIGZpbHRlciA9IGdldEZpbHRlcihvYmopOwotCQkJCi0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgbyA9IGl0b3IubmV4dCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlPYmplY3QgY2hpbGQgPSAoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIG8pLmdldFZhbHVlKCk7Ci0JCQkJCWlmICgoZmlsdGVyICE9IG51bGwpICYmIChmaWx0ZXIuYWNjZXB0KGNoaWxkKSkpIHsKLQkJCQkJCW5ld0NoaWxkcmVuLmFkZChvKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8JCSBzb3J0IHRoZSBjaGlsZHJlbgotCQlDb2xsZWN0aW9ucy5zb3J0KG5ld0NoaWxkcmVuLCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJCi0JCXVwZGF0ZUNhY2hlZENoaWxkcmVuKG5ld0NoaWxkcmVuKTsKLQkJcmV0dXJuIG5ld0NoaWxkcmVuOwotCX0KLQotCXByaXZhdGUgSUZpbHRlciBnZXRGaWx0ZXIoT2JqZWN0IG9iaikgewotCQlJRmlsdGVyIGZpbHRlciA9IG51bGw7Ci0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQob2JqKTsKLQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXRSb290QWRhcHRlckZhY3RvcnkoKQotCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCWZpbHRlciA9ICgoQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLmdldEZpbHRlcigpOwotCQl9Ci0KLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0ZTA3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkd1aWRhbmNlSXRlbVByb3ZpZGVyLkNvbXBhcmVCeU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvcyBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGNhY2hlZENoaWxkcmVuOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIFRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKG5ldyBDb21tYW5kUGFyYW1ldGVyKHRhcmdldCwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpKTsKLQkJCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpKTsKLQkJCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCkpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCkpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaXNXcmFwcGluZ05lZWRlZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q3JlYXRlQ2hpbGRUZXh0KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gZ2V0RmVhdHVyZVRleHQoZmVhdHVyZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENyZWF0ZUNoaWxkSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRlQ2hpbGRJbWFnZShPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlPYmplY3QgaW1nID0gVG5nVXRpbC5nZXRJbWFnZShjaGlsZCk7Ci0JCXJldHVybiBpbWcgIT0gbnVsbCA/IGltZyA6IHN1cGVyLmdldENyZWF0ZUNoaWxkSW1hZ2Uob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVXcmFwcGVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVdyYXBwZXIodmFsdWUsIG9iamVjdCwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJd3JhcHBlci5zZXRSZWFkT25seShmYWxzZSk7Ci0JCXJldHVybiB3cmFwcGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChUYXNrRGVzY3JpcHRvci5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWToKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUOgotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQlyZWZyZXNoQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0JCi0Jc3RhdGljIHZvaWQgcmVmcmVzaENoaWxkcmVuKEl0ZW1Qcm92aWRlckFkYXB0ZXIgaXBhLCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CQkKLQkJaWYgKFByb2Nlc3NVdGlsLmlzUmVmcmVzaFJlcXVpcmVkKG5vdGlmaWNhdGlvbiwgbnVsbCkpIHsKLQkJCWlwYS5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGlwYS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCi0JCQlpZihub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkvLyBuZWVkIHRvIHJlZnJlc2ggY2hpbGRyZW4gb2YgcGFyZW50IGFjdGl2aXR5Ci0JCQkJLy8KLQkJCQlBY3Rpdml0eSBwYXJlbnQgPSAoKEJyZWFrZG93bkVsZW1lbnQpbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQocGFyZW50LAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQkJKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyKQotCQkJCQkuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCQkJcGFyZW50LCB0cnVlLCBmYWxzZSkpOwotCQkJCX0KLQotCQkJCS8vIHJlZnJlc2ggZXh0ZW5kZXJzIGFuZCBsb2NhbCBjb250cmlidXRvcnMgb2YgdGhlIHBhcmVudAotCQkJCS8vCi0JCQkJaWYocGFyZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKHBhcmVudCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZih2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUwotCQkJCQkJCQl8fCB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OKSB7Ci0JCQkJCQkJYWRhcHRlciA9IFRuZ1V0aWwuZ2V0QWRhcHRlckJ5VHlwZSh2ZSwgYWRhcHRlckZhY3RvcnkpOwotCQkJCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQkJCQkoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXIpCi0JCQkJCQkJCS5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCQkJCQl2ZSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hDaGlsZHJlbihOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXJlZnJlc2hDaGlsZHJlbih0aGlzLCBub3RpZmljYXRpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVDYWNoZWRDaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0vLwkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotLy8JCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoY2hpbGRyZW4pOwotLy8JCX0KLS8vCQllbHNlIHsKLS8vCQkJY2FjaGVkQ2hpbGRyZW4uY2xlYXIoKTsKLS8vCQkJY2FjaGVkQ2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuKTsKLS8vCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iaikgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJTGlzdCBuZXdDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBwcmltYXJ5UGVyZm9ybWVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBhZGRpdGlvbmFsUGVyZm9ybWVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBhc3NpdGVkQnkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgbWFuZGF0b3J5SW5wdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZXh0ZXJuYWxJbnB1dCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBvcHRpb25hbElucHV0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IG91dHB1dCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlJRmlsdGVyIGZpbHRlciA9IGdldEZpbHRlcihvYmopOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCU9iamVjdCBjaGlsZCA9ICgoV3JhcHBlckl0ZW1Qcm92aWRlcikgbykuZ2V0VmFsdWUoKTsKLQkJCQkKLQkJCQkKLQkJCQlpZiAoKGZpbHRlciAhPSBudWxsKSAmJiAoZmlsdGVyLmFjY2VwdChjaGlsZCkpKSB7Ci0JCQkJCWlmICgoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIG8pLmdldEZlYXR1cmUoKS5lcXVhbHMoCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpKSkgewotCQkJCQkJcHJpbWFyeVBlcmZvcm1lcnMuYWRkKG8pOwotCQkJCQl9IGVsc2UgaWYgKCgoV3JhcHBlckl0ZW1Qcm92aWRlcikgbykKLQkJCQkJCQkuZ2V0RmVhdHVyZSgpCi0JCQkJCQkJLmVxdWFscygKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKSkgewotCQkJCQkJYWRkaXRpb25hbFBlcmZvcm1lcnMuYWRkKG8pOwotCQkJCQl9IGVsc2UgaWYgKCgoV3JhcHBlckl0ZW1Qcm92aWRlcikgbykuZ2V0RmVhdHVyZSgpCi0JCQkJCQkJLmVxdWFscygKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCkpKSB7Ci0JCQkJCQlhc3NpdGVkQnkuYWRkKG8pOwotCQkJCQl9IGVsc2UgaWYgKCgoV3JhcHBlckl0ZW1Qcm92aWRlcikgbykuZ2V0RmVhdHVyZSgpLmVxdWFscygKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCkpKSB7Ci0JCQkJCQltYW5kYXRvcnlJbnB1dC5hZGQobyk7Ci0JCQkJCX0gZWxzZSBpZiAoKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvKS5nZXRGZWF0dXJlKCkuZXF1YWxzKAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpKSkgewotCQkJCQkJZXh0ZXJuYWxJbnB1dC5hZGQobyk7Ci0JCQkJCX0gZWxzZSBpZiAoKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvKS5nZXRGZWF0dXJlKCkuZXF1YWxzKAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpKSkgewotCQkJCQkJb3B0aW9uYWxJbnB1dC5hZGQobyk7Ci0JCQkJCX0gZWxzZSBpZiAoKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvKS5nZXRGZWF0dXJlKCkuZXF1YWxzKAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpKSkgewotCQkJCQkJb3V0cHV0LmFkZChvKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHNvcnQgZm9yIGFsbCBjaGlsZHJlbgotCQlDb2xsZWN0aW9ucy5zb3J0KHByaW1hcnlQZXJmb3JtZXJzLCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJQ29sbGVjdGlvbnMuc29ydChhZGRpdGlvbmFsUGVyZm9ybWVycywgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoYXNzaXRlZEJ5LCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJQ29sbGVjdGlvbnMuc29ydChleHRlcm5hbElucHV0LCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJQ29sbGVjdGlvbnMuc29ydChtYW5kYXRvcnlJbnB1dCwgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCUNvbGxlY3Rpb25zLnNvcnQob3B0aW9uYWxJbnB1dCwgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCUNvbGxlY3Rpb25zLnNvcnQob3V0cHV0LCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJCi0JCW5ld0NoaWxkcmVuLmFkZEFsbChwcmltYXJ5UGVyZm9ybWVycyk7Ci0JCW5ld0NoaWxkcmVuLmFkZEFsbChhZGRpdGlvbmFsUGVyZm9ybWVycyk7Ci0JCW5ld0NoaWxkcmVuLmFkZEFsbChhc3NpdGVkQnkpOwotCQluZXdDaGlsZHJlbi5hZGRBbGwoZXh0ZXJuYWxJbnB1dCk7Ci0JCW5ld0NoaWxkcmVuLmFkZEFsbChtYW5kYXRvcnlJbnB1dCk7Ci0JCW5ld0NoaWxkcmVuLmFkZEFsbChvcHRpb25hbElucHV0KTsKLQkJbmV3Q2hpbGRyZW4uYWRkQWxsKG91dHB1dCk7Ci0JCQotCQluZXdDaGlsZHJlbiA9IHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihuZXdDaGlsZHJlbiwgdHJ1ZSk7Ci0JCXVwZGF0ZUNhY2hlZENoaWxkcmVuKG5ld0NoaWxkcmVuKTsKLQkJcmV0dXJuIG5ld0NoaWxkcmVuOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbiwgYm9vbGVhbiB1bndyYXApIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLnJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihjaGlsZHJlbiwgdW53cmFwKTsKLQl9Ci0KLQlwcml2YXRlIElGaWx0ZXIgZ2V0RmlsdGVyKE9iamVjdCBvYmopIHsKLQkJSUZpbHRlciBmaWx0ZXIgPSBudWxsOwotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG9iaik7Ci0JCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIEFjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQlmaWx0ZXIgPSAoKEFjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5nZXRGaWx0ZXIoKTsKLQkJfQotCi0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5Gcm9tQ2FjaGUoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUNhY2hlKCkgewotCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQlnZXRDaGlsZHJlbih0YXJnZXQpOwotCQl9Ci0JCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlciNnZXRSb2xsdXBDaGlsZHJlbkZyb21DYWNoZSgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Um9sbHVwQ2hpbGRyZW5Gcm9tQ2FjaGUoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7IAotCQlpZihjYWNoZWRDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQljYWNoZWRDaGlsZHJlbi5jbGVhcigpOwotCQkJY2FjaGVkQ2hpbGRyZW4gPSBudWxsOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE5OTVkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotCi0vKioKLSAqIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBJdGVtIHByb3ZpZGVyIGZvciBjb25zb2xpZGF0ZWQgdmlldwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNpc1dyYXBwaW5nTmVlZGVkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDcmVhdGVDaGlsZFRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBnZXRGZWF0dXJlVGV4dChmZWF0dXJlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q3JlYXRlQ2hpbGRJbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBpbWcgPSBUbmdVdGlsLmdldEltYWdlKGNoaWxkKTsKLQkJcmV0dXJuIGltZyAhPSBudWxsID8gaW1nIDogc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRJbWFnZShvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZVdyYXBwZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIElCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV3JhcHBlcih2YWx1ZSwgb2JqZWN0LCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCQl3cmFwcGVyLnNldFJlYWRPbmx5KGZhbHNlKTsKLQkJcmV0dXJuIHdyYXBwZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJLy8gc3dpdGNoKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUm9sZURlc2NyaXB0b3IuY2xhc3MpKSB7Ci0JCS8vIGNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJLy8gcmVmcmVzaENoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCS8vIH0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkRlc2NyaXB0b3JJdGVtUHJvdmlkZXIjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqKSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmopOwotCQlMaXN0IG5ld0NoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQluZXdDaGlsZHJlbi5hZGRBbGwoY2hpbGRyZW4pOwotCQkvLyBzb3J0IHRoZSBjaGlsZHJlbgotCQlDb2xsZWN0aW9ucy5zb3J0KG5ld0NoaWxkcmVuLCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQotCQlyZXR1cm4gbmV3Q2hpbGRyZW47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyYTc3Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGl0ZW0gcHJvdmlkZXJzIGZvciBkaXNwbGF5aW5nIGFuZCBlZGl0aW5nIGJyZWFrZG93biBlbGVtZW50cyBpbiBhIFByb2Nlc3MgZWRpdG9yJ3MgQ29uc29saWRhdGVkIFZpZXcgcGFnZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvaW50ZXJuYWwvQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvaW50ZXJuYWwvQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZDA1YWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2ludGVybmFsL0JyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Db21wb3NpdGVSb2xlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuRGVsaXZlcmFibGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuTWlsZXN0b25lV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkgaW1wbGVtZW50cwotCQlJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5IHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5I2NyZWF0ZVdyYXBwZXIoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5KQotCSAqLwotCXB1YmxpYyBJV3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVXcmFwcGVyKE9iamVjdCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJcmV0dXJuIGNyZWF0ZVdyYXBwZXIodmFsdWUsIG93bmVyLCBudWxsLCBDb21tYW5kUGFyYW1ldGVyLk5PX0lOREVYLAotCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSNjcmVhdGVXcmFwcGVyKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBpbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgSVdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQl2YWx1ZSA9IFRuZ1V0aWwudW53cmFwKHZhbHVlKTsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXJldHVybiBuZXcgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKChBY3Rpdml0eSkgdmFsdWUsIG93bmVyLAotCQkJCQlmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQlyZXR1cm4gbmV3IE1pbGVzdG9uZVdyYXBwZXJJdGVtUHJvdmlkZXIoKE1pbGVzdG9uZSkgdmFsdWUsIG93bmVyLAotCQkJCQlmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJcmV0dXJuIG5ldyBDb21wb3NpdGVSb2xlV3JhcHBlckl0ZW1Qcm92aWRlcigoQ29tcG9zaXRlUm9sZSkgdmFsdWUsCi0JCQkJCW93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBuZXcgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKAotCQkJCQkoUm9sZURlc2NyaXB0b3IpIHZhbHVlLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsCi0JCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gbmV3IFRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcigKLQkJCQkJKFRhc2tEZXNjcmlwdG9yKSB2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LAotCQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJcmV0dXJuIG5ldyBUZWFtUHJvZmlsZVdyYXBwZXJJdGVtUHJvdmlkZXIoKFRlYW1Qcm9maWxlKSB2YWx1ZSwKLQkJCQkJb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB2YWx1ZTsKLQkJCWlmICh3cGQuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJcmV0dXJuIG5ldyBEZWxpdmVyYWJsZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKHdwZCwgb3duZXIsCi0JCQkJCQlmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKHdwZCwgb3duZXIsCi0JCQkJCWZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlyZXR1cm4gbmV3IEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKAotCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgdmFsdWUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwKLQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2ludGVybmFsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OGVhODcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2ludGVybmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIGRpc3BsYXlpbmcgYW5kIGVkaXRpbmcgYSBwcm9jZXNzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmZjNTZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpdGVtIHByb3ZpZGVycyBmb3IgZGlzcGxheWluZyBhbmQgZWRpdGluZyBicmVha2Rvd24gZWxlbWVudHMgaW4gYSBQcm9jZXNzIGVkaXRvci4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5MDlmMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5BY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIEFjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBDQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuQWN0aXZpdHlJdGVtUHJvdmlkZXIjcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGphdmEudXRpbC5Db2xsZWN0aW9uLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBib29sZWFuIHVud3JhcCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwucmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGNoaWxkcmVuLCB1bndyYXAsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQkJfQotCQllbHNlIHsKLQkJCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI0NGE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgQ0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0JCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENCU1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENCU1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E1MGFhNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuUHJvY2Vzc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDQlNQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMgUHJvY2Vzc0l0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQ0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQkJfQotCQllbHNlIHsKLQkJCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5BY3Rpdml0eUl0ZW1Qcm92aWRlciNyZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oamF2YS51dGlsLkNvbGxlY3Rpb24sIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKENvbGxlY3Rpb24gY2hpbGRyZW4sIGJvb2xlYW4gdW53cmFwKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5yZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4sIHVud3JhcCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxY2FiYTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIENCU1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIENCU1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQl9Ci0JCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmJhOGFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ0JTVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQ0JTVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBib29sZWFuIHVud3JhcCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwucmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGNoaWxkcmVuLCB1bndyYXAsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTQwNDI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLldvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIENCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQ0JTV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQl9Ci0JCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1RCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9UQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWY0NzYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1RCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIE9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBUQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5PQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoaXNSb2xsZWRVcCgpKSB7Ci0JCQlpZihjYWNoZWRSb2xsdXBDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZFJvbGx1cENoaWxkcmVuOwotCQl9Ci0JCWVsc2UgewotCQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1RCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9UQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2ZkZjA1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1RCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzCi0JCU9CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBUQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBUQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFRCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9UQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9UQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYmQxM2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvVEJTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRCU1Byb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBPQlNQcm9jZXNzSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBUQlNQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoaXNSb2xsZWRVcCgpKSB7Ci0JCQlpZihjYWNoZWRSb2xsdXBDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZFJvbGx1cENoaWxkcmVuOwotCQl9Ci0JCWVsc2UgewotCQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWMyNzc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZihpc1JvbGxlZFVwKCkpIHsKLQkJCWlmKGNhY2hlZFJvbGx1cENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRSb2xsdXBDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkUm9sbHVwQ2hpbGRyZW47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzN2I3N2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIFdCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0JCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4MDA5Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNQcm9jZXNzSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBXQlNQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoaXNSb2xsZWRVcCgpKSB7Ci0JCQlpZihjYWNoZWRSb2xsdXBDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZFJvbGx1cENoaWxkcmVuOwotCQl9Ci0JCWVsc2UgewotCQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU2M2EwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5QQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV1BCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQkJfQotCQllbHNlIHsKLQkJCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3QgcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKENvbGxlY3Rpb24gY2hpbGRyZW4sIGJvb2xlYW4gdW53cmFwKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5yZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4sIHVud3JhcCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU3NmQ0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5QQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzCi0JCVBCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBXUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlBCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFjdGl2aXR5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV1BCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpKTsKLQl9Ci0JCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdQQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdQQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dQQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMmYzZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlBCU1Byb2Nlc3NJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQQlNQcm9jZXNzSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBXUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQkJfQotCQllbHNlIHsKLQkJCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbiwgYm9vbGVhbiB1bndyYXApIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLnJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihjaGlsZHJlbiwgdW53cmFwLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MzcxN2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdQQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBXUEJTV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJfQotCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIjYWRkQ29udGFpbmVkQXJ0aWZhY3REZXNjcmlwdG9ycyhvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29udGFpbmVkQXJ0aWZhY3REZXNjcmlwdG9ycyhXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjLCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCUFjdGl2aXR5IGFjdGl2aXR5ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eSh3cERlc2MpOwotCQlpZihhY3Rpdml0eSAhPSBudWxsKSB7Ci0JCQkvLyBjb2xsZWN0IGFsbCBhcnRpZmFjdCBkZXNjcmlwdG9ycyBvciB0aGVpciB3cmFwcGVycyB1bmRlciB0aGUgc2FtZSBhY3Rpdml0eQotCQkJLy8KLQkJCUxpc3QgYXJ0aWZhY3REZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUNvbGxlY3Rpb24gc2libGluZ3MgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJSUZpbHRlciBmaWx0ZXIgPSBQcm9jZXNzVXRpbC5nZXRGaWx0ZXIoYWRhcHRlckZhY3RvcnkpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2libGluZ3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCQlpZihlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yIAotCQkJCQkJJiYgKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpZSkuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIEFydGlmYWN0Ci0JCQkJCQkmJiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChlKSkpIHsKLQkJCQkJYXJ0aWZhY3REZXNjTGlzdC5hZGQoZSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQljaGlsZHJlbi5hZGRBbGwoUHJvY2Vzc1V0aWwuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzRGVzY3JpcHRvcnMod3BEZXNjLCBhcnRpZmFjdERlc2NMaXN0KSk7CQkJCi0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVkOGM4Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpdGVtIHByb3ZpZGVycyBmb3IgZGlzcGxheWluZyBhIHByb2Nlc3MgaW4gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL0lBY3Rpb25UeXBlUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvSUFjdGlvblR5cGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmRiYjc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvSUFjdGlvblR5cGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGlvblR5cGVQcm92aWRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT1BZID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYVEVORCA9IDI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVFUF9DT1BZID0gMzsKLQotCXZvaWQgc2V0SW5wdXREYXRhKE9iamVjdCBvYmplY3QpOwotCi0Jdm9pZCBzZXRBY3Rpb25NYW5hZ2VyKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncik7Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyBnaXZlbiBjb21tYW5kIGJhc2VkIG9uIHRoZSBjaG9pY2UgdGhhdCB1c2VyIHNlbGVjdGVkIGZyb20gZ2l2ZW4KLQkgKiA8Y29kZT5jaG9pY2VzPC9jb2RlPi4gQ2hvaWNlIGNhbiBiZSBvbmUgb2YgdGhlIGNvbnN0YW50IHtAbGluayAjQ09QWX0sCi0JICoge0BsaW5rICNFWFRFTkR9LCBvciB7QGxpbmsgI0RFRVBfQ09QWX0KLQkgKiAKLQkgKiBAcGFyYW0gY21kCi0JICogQHBhcmFtIGNob2ljZXMKLQkgKi8KLQl2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjbWQsIGludFtdIGNob2ljZXMpOwotCi0vLwlpbnQgZ2V0QWN0aW9uVHlwZSgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL0lVSUhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9JVUlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU2ZWZhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL0lVSUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVSUhlbHBlciB7Ci0JcHVibGljIHZvaWQgcnVuU2FmZWx5KFJ1bm5hYmxlIHJ1bm5hYmxlLCBib29sZWFuIHN5bmNocm9ub3VzKTsKLQkKLQlwdWJsaWMgdm9pZCBydW5XaXRoQnVzeUluZGljYXRvcihSdW5uYWJsZSBydW5uYWJsZSk7Ci0JCi0JcHVibGljIGJvb2xlYW4gcnVuV2l0aFByb2dyZXNzKElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwgYm9vbGVhbiBjYW5DYW5jZWwsIFN0cmluZyBtc2cpOwotCi0JcHVibGljIElTdGF0dXMgcnVuQXNKb2IoSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLCBTdHJpbmcgdGFza05hbWUsCi0JCQlPYmplY3Qgc2hlbGwpOwotCi0JcHVibGljIGJvb2xlYW4gcnVuSW5VSShJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsCi0JCQlJU2NoZWR1bGluZ1J1bGUgcnVsZSwgT2JqZWN0IHNoZWxsKTsKLQkKLQlwdWJsaWMgdm9pZCBydW5JblVJKElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwKLQkJCVN0cmluZyB0YXNrTmFtZSk7Ci0KLQlJU3RhdHVzIHJ1bkluTW9kYWxDb250ZXh0KElSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcGVyYXRpb24sIGJvb2xlYW4gZm9yaywKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgT2JqZWN0IHVpQ29udGV4dCk7Ci0KLQlwdWJsaWMgVGVhbVByb2ZpbGUgZ2V0VGVhbShBY3Rpdml0eSBhY3Rpdml0eSwgUm9sZSByb2xlLCBPYmplY3QgVUlDb250ZXh0KTsKLQotCS8qKgotCSAqIFNlbGVjdCB0YXNrcyB3aGljaCBoYXMgZ2l2ZW4gd29ya3Byb2R1Y3QgYXMgb3V0cHV0LgotCSAqIAotCSAqIEBwYXJhbSB0YXNrTGlzdAotCSAqIEBwYXJhbSB3cAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBzZWxlY3RUYXNrcyhMaXN0IHRhc2tMaXN0LCBXb3JrUHJvZHVjdCB3cCk7Ci0KLQkvKioKLQkgKiBTZWxlY3QgcmVzcG9uc2libGUgd29yayBwcm9kdWN0cyBmb3IgdGhlIGdpdmVuIHJvbGUKLQkgKiAKLQkgKiBAcGFyYW0gd3BMaXN0Ci0JICogQHBhcmFtIHJvbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3Qgc2VsZWN0V29ya1Byb2R1Y3RzKExpc3Qgd3BMaXN0LCBSb2xlIHJvbGUpOwotCi0JcHVibGljIGJvb2xlYW4gcmVmcmVzaE5lZWRlZChBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyKTsKLQotCXB1YmxpYyB2b2lkIHJlZnJlc2hWaWV3ZXIoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwgUHJvY2VzcyBwcm9jKTsKLQkKLQlwdWJsaWMgdm9pZCByZWZyZXNoQWxsVmlld2VycyhmaW5hbCBFeHBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpOwotCi0JcHVibGljIHZvaWQgcmVmcmVzaElEc0luVmlld2VyKEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSk7Ci0JCi0JcHVibGljIE9iamVjdCBnZXRWaWV3ZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFByb2Nlc3MgcHJvYyk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvUmVmZXJlbmNlU2VsZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1JlZmVyZW5jZVNlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJjZDQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvUmVmZXJlbmNlU2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5BZGFwdGVyRmFjdG9yeUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFVJIERpYWxvZyBjbGFzcyB3aGljaCB3aWxsIGdpdmUgdXNlciB0byBzZWxlY3QgcmVmZXJlbmNlcyB0byBiZSBkZWxldGVkCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VTZWxlY3Rpb24gewotCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBnZXRSZWZlcmVuY2VzKExpc3QgcmVmLCBEZXNjcmlwdG9yIGRlc2MpIHsKLQkJcmV0dXJuIGdldFJlZmVyZW5jZXMocmVmLCBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy51aV9yZWZfZGVsZXRlLAotCQkJCWRlc2MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogU2hvd3MgZGlhbG9nIGJveCBmb3IgYWxsIHJlZmVyZW5jZXMgdG8gYmUgZGVsZXRlZCBmb3IgdGhlIGdpdmVuCi0JICogZGVzY3JpcHRvci4gVGhlc2UgcmVmZXJlbmNlcyBhcmUgbm90IGJlaW5nIHVzZWQgYW55d2hlcmUgZWxzZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVmCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gZ2V0UmVmZXJlbmNlcyhMaXN0IHJlZikgewotCi0JCVN0cmluZyBtZXNzYWdlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudWlfcmVmX2RlbGV0ZTI7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0UmVmZXJlbmNlcyhyZWYsIG1lc3NhZ2UpOwotCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEl0IHNob3dzIHNlbGVjdGlvbiBkaWFsb2cgYm94IHdpdGggbGlzdCBvZiByZWZlcmVuY2UgKDxjb2RlPnJlZjwvY29kZT4pCi0JICogZm9yIHVzZXIgdG8gc2VsZWN0LgotCSAqIAotCSAqIEBwYXJhbSByZWYKLQkgKiBAcmV0dXJuCi0JICogQGV4Y2VwdGlvbiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHVzZXIgY2FuY2VsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGdldFJlZmVyZW5jZXMoTGlzdCByZWYsIFN0cmluZyBtc2cpCi0JCQl0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQkvLyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcKLQkJLy8gQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCS8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCS8vIC5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkvLyBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkvLyByZXR1cm4gKChMaXN0KSBvYmplY3QpLnRvQXJyYXkoKTsKLQkJLy8gfQotCQkvLyB9OwotCQkvLyBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJLy8gLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJLy8KLQkJLy8gdHJ5IHsKLQkJLy8gUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3Ci0JCS8vIFByb2Nlc3NMaXN0U2VsZWN0aW9uRGlhbG9nKFBsYXRmb3JtVUkKLQkJLy8gLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIHJlZiwKLQkJLy8gY29udGVudFByb3ZpZGVyLCBsYWJlbFByb3ZpZGVyLCBtc2cpOwotCQkvLwotCQkvLyBkbGcuc2V0VGl0bGUoTGlicmFyeUVkaXRSZXNvdXJjZXMudWlfcmVmZXJlbmNlcyk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkvLyBpZiAoZGxnLm9wZW4oKSA9PSBEaWFsb2cuQ0FOQ0VMKSB7Ci0JCS8vIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkvLyB9Ci0JCS8vIE9iamVjdCBvYmpzW10gPSBkbGcuZ2V0UmVzdWx0KCk7Ci0JCS8vIHJldHVybiBvYmpzOwotCQkvLyB9IGZpbmFsbHkgewotCQkvLyBjb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCQkvLyBsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJLy8gfQotCi0JCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIKLQkJCQkuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJaWYgKHVpSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlJSXRlbUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUl0ZW1MYWJlbFByb3ZpZGVyKAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy51aV9yZWZlcmVuY2VzOwotCQkJTGlzdCBzZWxlY3RlZCA9IHVpSGFuZGxlci5zZWxlY3QocmVmLCBsYWJlbFByb3ZpZGVyLCB0cnVlLCByZWYsCi0JCQkJCXRpdGxlLCBtc2cpOwotCQkJaWYgKHNlbGVjdGVkID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXJldHVybiBzZWxlY3RlZC50b0FycmF5KCk7Ci0JCX0KLQotCQkvLyBubyB1c2VyIGludGVyYWN0aW9uIGhhbmRsZXIgYXZhaWxhYmxlCi0JCS8vIHJldHVybiB0aGUgZW50aXJlIHJlZmVyZW5jZSBsaXN0Ci0JCS8vCi0JCXJldHVybiByZWYudG9BcnJheSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvVXNlckludGVyYWN0aW9uSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1VzZXJJbnRlcmFjdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTE0MDQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvVXNlckludGVyYWN0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuVXNlcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1lc3NlbmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkFic3RyYWN0U3RyaW5nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBEZWZpbmVzIHN0YXRpYyBtZXRob2RzIHRoYXQgaW50ZXJhY3Qgd2l0aCB1c2VyIHZpYSBkaWFsb2cgYm94ZXMgdG8gcmV0cmlldmUKLSAqIG1vcmUgaW5mb3JtYXRpb24gb3IgY29uZmlybWF0aW9uIGZyb20gdGhlIHVzZXJzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFVzZXJJbnRlcmFjdGlvbkhlbHBlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBjYW5JbnRlcmFjdCA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVVJSGVscGVyIHVpSGVscGVyID0gKElVSUhlbHBlcikgRXh0ZW5zaW9uTWFuYWdlci5nZXRFeHRlbnNpb24oCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgInVpSGVscGVyIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVXNlckludGVyYWN0aW9uSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5JbnRlcmFjdCgpIHsKLQkJcmV0dXJuIGNhbkludGVyYWN0OwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBhZ2FpbnN0IGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgZ2l2ZW4gcHJvY2VzcyB3aGV0aGVyIHRoZQotCSAqIGdpdmVuIChtZXRob2QpIG9iamVjdCBjYW4gYmUgdXNlZCBpbiB0aGUgcHJvY2Vzcy4gVGhpcyBtZXRob2Qgd2lsbCBwcm9tcHQKLQkgKiB1c2VyIHRvIGFkZCB0aGUgb2JqZWN0IGFuZCB0aG9zZSBlbGVtZW50cyB0aGF0IGl0IGlzIGFzc29jaWF0ZWQgd2l0aCB0bwotCSAqIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBoYXZlIHRoZW0KLQkgKiB5ZXQuCi0JICogCi0JICogQHBhcmFtIHByb2MKLQkgKiAgICAgICAgICAgIHRoZSBwcm9jZXNzCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICogICAgICAgICAgICA8bGk+MSBpZiB0aGUgcHJvY2VzcydlcyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gYWxyZWFkeSBoYXMgdGhlCi0JICogICAgICAgICAgICBvYmplY3QKLQkgKiAgICAgICAgICAgIDxsaT4yIGlmIHRoZSBvYmplY3QgaXMgbm90IGluIHRoZSBjb25maWd1cmF0aW9uLCBidXQgdXNlcgotCSAqICAgICAgICAgICAgd2FudHMgdG8gYWRkIGl0IG5vdwotCSAqICAgICAgICAgICAgPGxpPjAgaWYgdGhlIG9iamVjdCBpcyBub3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHVzZXIKLQkgKiAgICAgICAgICAgIGRvbid0IHdhbnQgdG8gYWRkIGl0Ci0JICogICAgICAgICAgICA8bGk+LTEgaWYgdXNlciBjYW5jZWwgdGhlIHByb21wdCB0byBhZGQgdGhlIG9iamVjdHMgYW5kCi0JICogICAgICAgICAgICBhc3NvY2lhdGVkIGRlcGVuZGVuY2llcyB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY2hlY2tBZ2FpbnN0RGVmYXVsdENvbmZpZ3VyYXRpb24oUHJvY2VzcyBwcm9jLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gY2hlY2tBZ2FpbnN0RGVmYXVsdENvbmZpZ3VyYXRpb24ocHJvYywgb2JqZWN0LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgYWdhaW5zdCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIGdpdmVuIHByb2Nlc3Mgd2hldGhlciB0aGUKLQkgKiBnaXZlbiAobWV0aG9kKSBvYmplY3QgY2FuIGJlIHVzZWQgaW4gdGhlIHByb2Nlc3MuIFRoaXMgbWV0aG9kIHdpbGwgcHJvbXB0Ci0JICogdXNlciB0byBhZGQgdGhlIG9iamVjdCBhbmQgdGhvc2UgZWxlbWVudHMgdGhhdCBpdCBpcyBhc3NvY2lhdGVkIHdpdGggdG8KLQkgKiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgaGF2ZSB0aGVtCi0JICogeWV0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9jCi0JICogICAgICAgICAgICB0aGUgcHJvY2VzcwotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2Qgb2JqZWN0Ci0JICogQHJldHVybgotCSAqICAgICAgICAgICAgPGxpPjEgaWYgdGhlIHByb2Nlc3MnZXMgZGVmYXVsdCBjb25maWd1cmF0aW9uIGFscmVhZHkgaGFzIHRoZQotCSAqICAgICAgICAgICAgb2JqZWN0Ci0JICogICAgICAgICAgICA8bGk+MiBpZiB0aGUgb2JqZWN0IGlzIG5vdCBpbiB0aGUgY29uZmlndXJhdGlvbiwgYnV0IHVzZXIKLQkgKiAgICAgICAgICAgIHdhbnRzIHRvIGFkZCBpdCBub3cKLQkgKiAgICAgICAgICAgIDxsaT4wIGlmIHRoZSBvYmplY3QgaXMgbm90IGluIHRoZSBjb25maWd1cmF0aW9uIGFuZCB1c2VyCi0JICogICAgICAgICAgICBkb24ndCB3YW50IHRvIGFkZCBpdAotCSAqICAgICAgICAgICAgPGxpPi0xIGlmIHVzZXIgY2FuY2VsIHRoZSBwcm9tcHQgdG8gYWRkIHRoZSBvYmplY3RzIGFuZAotCSAqICAgICAgICAgICAgYXNzb2NpYXRlZCBkZXBlbmRlbmNpZXMgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNoZWNrQWdhaW5zdERlZmF1bHRDb25maWd1cmF0aW9uKFByb2Nlc3MgcHJvYywKLQkJCU9iamVjdCBvYmplY3QsIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yKSB7Ci0JCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJaWYgKCEoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpKQotCQkJcmV0dXJuIDA7Ci0KLQkJaWYgKGNvbmZpZ3VyYXRvciA9PSBudWxsKQotCQkJY29uZmlndXJhdG9yID0gUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRvckZhY3RvcnkoKQotCQkJCQkuY3JlYXRlQ29uZmlndXJhdG9yKHByb2MuZ2V0RGVmYXVsdENvbnRleHQoKSk7Ci0JCWlmIChlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkvLyBjaGVjayBhbGwgdGhlIGJhc2UgZWxlbWVudHMgaWYgdGhlcmUgaXMgYW55Ci0JCQkvLwotCQkJYm9vbGVhbiBhbGxJbiA9IHRydWU7Ci0JCQlmb3IgKFZhcmlhYmlsaXR5RWxlbWVudCBjID0gKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCk7IGMgIT0gbnVsbDsgYyA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGMKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCWlmICghY29uZmlndXJhdG9yLmFjY2VwdChjKSkgewotCQkJCQlhbGxJbiA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYWxsSW4pIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCQlpZiAoY29uZmlndXJhdG9yLmFjY2VwdChlKSkKLQkJCXJldHVybiAxOwotCi0JCS8vIG9iamVjdCBpcyBub3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkJLy8gYXNrIHVzZXIgaWYgaGUvc2hlIHdhbnQgdG8gYWRkIGl0IHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkJLy8KLQkJU3RyaW5nIG1zZyA9IE5MUwotCQkJCS5iaW5kKAotCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMudWlfVXNlckludGVyYWN0aW9uSGVscGVyX2RlZmF1bHRjb25maWdjaGVjaywKLQkJCQkJCSgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0TmFtZSgpKTsJCQotCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCWlmKHVpSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlpbnQgcmV0ID0gdWlIYW5kbGVyLnNlbGVjdE9uZShuZXcgaW50W10gewotCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fWUVTLAotCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fTk8sCi0JCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUwKLQkJCQl9LCAiQWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiIsIG1zZywgbnVsbCk7Ci0JCQlpZiAoVG5nVXRpbC5ERUJVRykgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkucHJpbnRsbigiVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrQWdhaW5zdERlZmF1bHRDb25maWd1cmF0aW9uKCk6IGVsZW1lbnQ9IiAvLyROT04tTkxTLTEkCi0JCQkJCQkrIGUgKyAiLCBwYXRoPSIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzd2l0Y2ggKHJldCkgewotCQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fWUVTOgotCQkJCUlTdGF0dXMgc3RhdHVzID0gVG5nVXRpbC5jaGVja0VkaXQocHJvYy5nZXREZWZhdWx0Q29udGV4dCgpLCBudWxsKTsKLQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCXJldHVybiAyOwotCQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fTk86Ci0JCQkJcmV0dXJuIDA7Ci0JCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUw6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdCB0YXNrcyB3aGljaCBoYXMgZ2l2ZW4gd29ya3Byb2R1Y3QgYXMgb3V0cHV0LgotCSAqIAotCSAqIEBwYXJhbSB0YXNrTGlzdAotCSAqIEBwYXJhbSB3cAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Qgc2VsZWN0VGFza3MoTGlzdCB0YXNrTGlzdCwgV29ya1Byb2R1Y3Qgd3ApIHsKLQkJcmV0dXJuIHVpSGVscGVyLnNlbGVjdFRhc2tzKHRhc2tMaXN0LCB3cCk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0IHJlc3BvbnNpYmxlIHdvcmsgcHJvZHVjdHMgZm9yIHRoZSBnaXZlbiByb2xlCi0JICogCi0JICogQHBhcmFtIHdwTGlzdAotCSAqIEBwYXJhbSByb2xlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBzZWxlY3RXb3JrUHJvZHVjdHMoTGlzdCB3cExpc3QsIFJvbGUgcm9sZSkgewotCQlyZXR1cm4gdWlIZWxwZXIuc2VsZWN0V29ya1Byb2R1Y3RzKHdwTGlzdCwgcm9sZSk7Ci0JfQotCi0JLyoqCi0JICogUmVxdWVzdHMgbmFtZSBmcm9tIHVzZXIKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIG5hbWVGZWF0dXJlCi0JICogQHJldHVybiB0aGUgcmVxdWVzdGVkIG5hbWUgb2YgbnVsbCBpZiB1c2VyIGNhbmNlbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVxdWVzdE5hbWUoT2JqZWN0IGNoaWxkLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIG5hbWVGZWF0dXJlLCBTdHJpbmcgdGl0bGUsCi0JCQlmaW5hbCBJVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlJVmFsaWRhdG9yIGlucHV0VmFsaWRhdG9yID0gbmV3IEFic3RyYWN0U3RyaW5nVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJCQlpZiAodmFsaWRhdG9yICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGdldFNpbXBsZUVycm9yTWVzc2FnZSh2YWxpZGF0b3IuaXNWYWxpZChuZXdUZXh0KSk7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCX07Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBlID0gKEVPYmplY3QpIGNoaWxkOwotCQkJU3RyaW5nIHN0ciA9IChTdHJpbmcpIGUuZUdldChuYW1lRmVhdHVyZSk7Ci0JCQlpZiAoc3RyICE9IG51bGwpIHsKLQkJCQluYW1lID0gc3RyOwotCQkJfQotCQl9Ci0JCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJaWYodWlIYW5kbGVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVVzZXJJbnB1dCBpbnB1dCA9IG5ldyBVc2VySW5wdXQoIiIsIFVzZXJJbnB1dC5URVhULCBmYWxzZSwgbnVsbCwgbnVsbCwgaW5wdXRWYWxpZGF0b3IsIG51bGwpOwotCQlpbnB1dC5zZXRJbnB1dChuYW1lKTsKLQkJYm9vbGVhbiByZXQgPSB1aUhhbmRsZXIucmVxdWVzdElucHV0KHRpdGxlLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5Vc2VySW50ZXJhY3Rpb25IZWxwZXJfUHJvY2Vzc1BhY2thZ2VfTmFtZSwgCi0JCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGlucHV0KSk7Ci0JCWlmKHJldCkgewotCQkJcmV0dXJuIGlucHV0LmdldElucHV0KCkudG9TdHJpbmcoKS50cmltKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2ltcGxlRXJyb3JNZXNzYWdlKFN0cmluZyBtc2cpIHsKLQkJaWYgKG1zZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW50IHMgPSBtc2cuaW5kZXhPZignOicpOwotCi0JCVN0cmluZyBwcmVmaXggPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAocyA+PSAwKSB7Ci0JCQlwcmVmaXggPSBtc2cuc3Vic3RyaW5nKDAsIHMpOwotCi0JCQlTdHJpbmcgZW1wdHlFbGVtZW50TmFtZUVycm9yTXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZzsgCi0JCQlTdHJpbmcgZHVwQ29udGVudEZpbGVFcnJvck1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3JfbXNnOyAKLQkJCVN0cmluZyBkdXBFbGVtZW50TmFtZUVycm9yTXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c7IAotCi0JCQlpZiAoZW1wdHlFbGVtZW50TmFtZUVycm9yTXNnICE9IG51bGwKLQkJCQkJJiYgZW1wdHlFbGVtZW50TmFtZUVycm9yTXNnLnN0YXJ0c1dpdGgocHJlZml4KSkKLQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuZW1wdHlFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c7IAotCQkJZWxzZSBpZiAoZHVwQ29udGVudEZpbGVFcnJvck1zZyAhPSBudWxsCi0JCQkJCSYmIGR1cENvbnRlbnRGaWxlRXJyb3JNc2cuc3RhcnRzV2l0aChwcmVmaXgpKQotCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX3NpbXBsZV9tc2c7IAotCQkJZWxzZSBpZiAoZHVwRWxlbWVudE5hbWVFcnJvck1zZyAhPSBudWxsCi0JCQkJCSYmIGR1cEVsZW1lbnROYW1lRXJyb3JNc2cuc3RhcnRzV2l0aChwcmVmaXgpKQotCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c7IAotCQl9Ci0KLQkJaWYgKHMgPCAwKQotCQkJcyA9IDA7Ci0JCWVsc2UKLQkJCXMrKzsKLQkJaW50IHQgPSBtc2cuaW5kZXhPZignXG4nKTsKLQkJaWYgKHQgPCAwKQotCQkJdCA9IG1zZy5sZW5ndGgoKTsKLQotCQlyZXR1cm4gbXNnLnN1YnN0cmluZyhzLCB0KS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRlYW0gaW4gd2hpY2ggdXNlciB3b3VsZCBhdXRvbWF0aWNhbGx5IGFzc2lnbiBhIHJvbGUgaW50bwotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSByb2xlCi0JICogQHJldHVybgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVhbVByb2ZpbGUgZ2V0VGVhbShBY3Rpdml0eSBhY3Rpdml0eSwgUm9sZSByb2xlKSB7Ci0JCXJldHVybiBnZXRUZWFtKGFjdGl2aXR5LCByb2xlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlYW1Qcm9maWxlIGdldFRlYW0oQWN0aXZpdHkgYWN0aXZpdHksIFJvbGUgcm9sZSwKLQkJCU9iamVjdCBVSUNvbnRleHQpIHsKLQkJcmV0dXJuIHVpSGVscGVyLmdldFRlYW0oYWN0aXZpdHksIHJvbGUsIFVJQ29udGV4dCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHJ1bldpdGhQcm9ncmVzcyhmaW5hbCBSdW5uYWJsZSBydW5uYWJsZSwKLQkJCWZpbmFsIFN0cmluZyBtc2cpIHsKLQkJZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJcnVubmFibGUucnVuKCk7Ci0JCQl9Ci0KLQkJfTsKLQkJCi0JCXJldHVybiBydW5XaXRoUHJvZ3Jlc3Mob3BlcmF0aW9uLCBtc2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBydW5XaXRoUHJvZ3Jlc3MoCi0JCQlmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsIGZpbmFsIFN0cmluZyBtc2cpIHsKLQkJcmV0dXJuIHJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgZmFsc2UsIG1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHJ1bldpdGhQcm9ncmVzcygKLQkJCWZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwgZmluYWwgYm9vbGVhbiBjYW5DYW5jZWwsCi0JCQlmaW5hbCBTdHJpbmcgbXNnKSB7Ci0JCXJldHVybiB1aUhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIGNhbkNhbmNlbCwgbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElTdGF0dXMgcnVuQXNKb2IoSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLAotCQkJU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCU9iamVjdCBzaGVsbCA9IExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb250ZXh0KCk7Ci0JCWlmIChzaGVsbCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJ1bm5hYmxlLnJ1bihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkKLQkJCQkJCS5nZXRJZCgpLCAwLCBlLnRvU3RyaW5nKCksIGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuIHJ1bkFzSm9iKHJ1bm5hYmxlLCB0YXNrTmFtZSwgc2hlbGwpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJU3RhdHVzIHJ1bkFzSm9iKGZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwKLQkJCWZpbmFsIFN0cmluZyB0YXNrTmFtZSwgT2JqZWN0IHNoZWxsKSB7Ci0JCXJldHVybiB1aUhlbHBlci5ydW5Bc0pvYihydW5uYWJsZSwgdGFza05hbWUsIHNoZWxsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHJ1bkluVUkoZmluYWwgUnVubmFibGUgcnVubmFibGUsCi0JCQlmaW5hbCBTdHJpbmcgdGFza05hbWUpIHsKLQkJcmV0dXJuIHJ1bkluVUkocnVubmFibGUsIHRhc2tOYW1lLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcnVuSW5VSShmaW5hbCBSdW5uYWJsZSBydW5uYWJsZSwKLQkJCWZpbmFsIFN0cmluZyB0YXNrTmFtZSwgSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJT2JqZWN0IHNoZWxsID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvbnRleHQoKTsKLQkJaWYgKHNoZWxsID09IG51bGwpIHsKLQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmVyID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQl0cnkgewotCQkJCQkJbW9uaXRvci5iZWdpblRhc2sodGFza05hbWUsIDIpOwotCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCQlydW5uYWJsZS5ydW4oKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9OwotCQkJcmV0dXJuIHJ1bkluVUkocnVubmVyLCBydWxlLCBzaGVsbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcnVuSW5VSShJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsCi0JCQlPYmplY3Qgc2hlbGwpIHsKLQkJcmV0dXJuIHJ1bkluVUkocnVubmFibGUsIG51bGwsIHNoZWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcnVuSW5VSShJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsCi0JCQlJU2NoZWR1bGluZ1J1bGUgcnVsZSwgT2JqZWN0IHNoZWxsKSB7Ci0JCXJldHVybiB1aUhlbHBlci5ydW5JblVJKHJ1bm5hYmxlLCBydWxlLCBzaGVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIERlbGl2ZXJhYmxlIGluIHdoaWNoIHVzZXIgd291bGQgYXV0b21hdGljYWxseSBhc3NpZ24gYSB3cCBpbnRvCi0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIHdwCi0JICogQHJldHVybgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGdldERlbGl2ZXJhYmxlKEFjdGl2aXR5IGFjdGl2aXR5LAotCQkJV29ya1Byb2R1Y3Qgd3ApIHsKLQotCQkvLyBQTEVBRSBET04nVCBDTEVBTiBVUAotCQkvLyBjb21tZW50ZWQgb3V0IGZvciBub3cgc2luY2Ugd2Ugc2h1dC1vZmYgYXV0b21hdGljIGFzc2lnbm1lbnQKLQkJLy8gb2YgZGVsaXZlcmFibGUgZm9yIG5vdwotCQkvLyBMaXN0IGRlbGl2ZXJhYmxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkvLyAuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJLy8gLy8gZmluZCBvdXQgYWxsIGRlbGl2ZXJhYmxlcyBpbiB2aXNpYmxlIHNjb3BlCi0JCS8vIGdldERlbGl2ZXJhYmxlc0luU2NvcGUoYWRhcHRlckZhY3RvcnksIGFjdGl2aXR5LCB3cCwKLQkJLy8gZGVsaXZlcmFibGVMaXN0KTsKLQkJLy8gaWYgKGRlbGl2ZXJhYmxlTGlzdC5zaXplKCkgPT0gMSkgewotCQkvLyByZXR1cm4gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZGVsaXZlcmFibGVMaXN0LmdldCgwKTsKLQkJLy8gfQotCQkvLyBpZiAoZGVsaXZlcmFibGVMaXN0LnNpemUoKSA+IDEpIHsKLQkJLy8gcmV0dXJuIERlbGl2ZXJhYmxlU2VsZWN0aW9uLmdldFNlbGVjdGVkRGVsaXZlcmFibGUoZGVsaXZlcmFibGVMaXN0LAotCQkvLyB3cCk7Ci0JCS8vIH0KLQkJLy8gdGhlcmUgYXJlIG5vIGRlbGl2ZXJhYmxlIHRvIGFzc2lnbgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBQTEVBU0UgRE9OJ1QgQ0xFQU4gVVAuIFRoaXMgbWV0aG9kIGlzIGN1cnJlbnRseSBub3QgdXNlZCBzaW5jZSB3ZQotCSAqIHNodXQtb2ZmIGF1dG9tYXRpYyBhc3NpZ25tZW50IG9mIGRlbGl2ZXJhYmxlLiBHZXQgZGVsaXZlcmFibGUgaW4gc2NvcGUKLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkgKiBAcGFyYW0gZGVsaXZlcmFibGVMaXN0Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXREZWxpdmVyYWJsZXNJblNjb3BlKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQnJlYWtkb3duRWxlbWVudCBlLCBXb3JrUHJvZHVjdCB3cCwgTGlzdCBkZWxpdmVyYWJsZUxpc3QpIHsKLQkJLy8gZ2V0IGNoaWxkcmVuIGZvciBhY3Rpdml0eQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoZSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IGl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihlKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikKLQkJCQkJJiYgKFByb2Nlc3NVdGlsCi0JCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50KChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaikgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqOwotCi0JCQkJLy8gZ2V0IGRlbGl2ZXJhYmxlIHBhcnRzIGZyb20gZGVsaXZlcmFibGUKLQkJCQlMaXN0IHBhcnRzID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnRMaXN0KHdwRGVzYwotCQkJCQkJLmdldERlbGl2ZXJhYmxlUGFydHMoKSk7Ci0JCQkJaWYgKHBhcnRzLmNvbnRhaW5zKHdwKSkgewotCQkJCQlkZWxpdmVyYWJsZUxpc3QuYWRkKG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gZ2V0IHBhcmVudAotCQlPYmplY3QgY3VycmVudFBhcmVudCA9IGl0ZW1Qcm92aWRlci5nZXRQYXJlbnQoZSk7Ci0JCWlmIChjdXJyZW50UGFyZW50ICE9IG51bGwpIHsKLQkJCS8vIGdvIHVwCi0JCQlnZXREZWxpdmVyYWJsZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgY3VycmVudFBhcmVudCwgd3AsIGRlbGl2ZXJhYmxlTGlzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGVsZW1lbnQgY2FuIGJlIG1vZGlmaWVkLiBUaGlzIGluY2x1ZGVzIGxvY2sgY2hlY2sgYW5kCi0JICogZWRpdCBjaGVjay4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBzaGVsbAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tNb2RpZnkoRU9iamVjdCBlbGVtZW50LCBPYmplY3Qgc2hlbGwpIHsKLQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQoZWxlbWVudCkpIHsKLQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0Ci0JCQkJCS5mb3JtYXQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuVXNlckludGVyYWN0aW9uSGVscGVyX2xvY2tlZFBsdWdpbiwKLQkJCQkJCQluZXcgT2JqZWN0W10geyBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KQotCQkJCQkJCQkJLmdldE5hbWUoKSB9KTsgCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJZCgpLCAwLCBtc2csIG51bGwpOwotCQl9Ci0JCXJldHVybiBUbmdVdGlsLmNoZWNrRWRpdCgoRU9iamVjdCkgZWxlbWVudCwgc2hlbGwpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBmb3IgdW5tb2RpZmlhYmxlIHJlc291cmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kaWZpZWRSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIEEgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMuCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiAgICAgICAgICAgIFRoZSBjb250ZXh0IG9mIHRoaXMgY2FsbC4gRm9yIFJDUCwgdGhpcyBpcyB0aGUgc2hlbGwuCi0JICogQHJldHVybiBBbiA8Y29kZT5JU3RhdHVzPC9jb2RlPiBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMsIE9iamVjdCBjb250ZXh0KSB7Ci0JCUlBY2Nlc3NDb250cm9sbGVyIGFjID0gU2VydmljZXMuZ2V0QWNjZXNzQ29udHJvbGxlcigpOwotCQlpZiAoYWMgPT0gbnVsbCkgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBuZXcgUmVzb3VyY2VbbW9kaWZpZWRSZXNvdXJjZXMuc2l6ZSgpXTsKLQkJbW9kaWZpZWRSZXNvdXJjZXMudG9BcnJheShyZXNvdXJjZXMpOwotCQlyZXR1cm4gYWMuY2hlY2tNb2RpZnkocmVzb3VyY2VzLCBjb250ZXh0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElSZXNvdXJjZSBnZXRXb3Jrc3BhY2VSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAoIXJlc291cmNlLmdldFVSSSgpLmlzRmlsZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJcmV0dXJuIHdvcmtzcGFjZVJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja091dE9mU3luY2goQ29sbGVjdGlvbiByZXNvdXJjZXMpIHsKLQkJQXJyYXlMaXN0IG91dE9mU3luY2hSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCUlSZXNvdXJjZSB3c1Jlc291cmNlID0gZ2V0V29ya3NwYWNlUmVzb3VyY2UocmVzb3VyY2UpOwotCQkJaWYgKHdzUmVzb3VyY2UgIT0gbnVsbAotCQkJCQkmJiAhd3NSZXNvdXJjZS5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTykpIHsKLQkJCQlvdXRPZlN5bmNoUmVzb3VyY2VzLmFkZCh3c1Jlc291cmNlKTsKLQkJCX0KLQkJfQotCQlpZiAob3V0T2ZTeW5jaFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJTXVsdGlTdGF0dXMgbXVsdGlTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLk9LLAotCQkJCQkiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG91dE9mU3luY2hSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSVJlc291cmNlIHdzUmVzb3VyY2UgPSAoSVJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQlJU3RhdHVzLk9LLCB3c1Jlc291cmNlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpLCBudWxsKTsKLQkJCQltdWx0aVN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJCX0KLQkJCVN0cmluZyB0aXRsZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnVwZGF0ZV9vdXRvZnN5bmNoX3RpdGxlOwotCQkJU3RyaW5nIG1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnVwZGF0ZV9vdXRvZnN5bmNoX21zZzsKLQotCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlci5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQkJcmV0dXJuIHVpSGFuZGxlci5zZWxlY3RPbmUobmV3IGludFtdIHtJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fT0ssCi0JCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUx9LCB0aXRsZSwgbXNnLCBtdWx0aVN0YXR1cykgIT0gSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIGNoYW5nZSB0byB0aGUgZ2l2ZW4gZmVhdHVyZSBvZiB0aGUgZ2l2ZW4gZmVhdHVyZU93bmVyIHdpbGwKLQkgKiBtb2RpZnkgdGhlIGVsZW1lbnQgaW4gb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZQotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlT3duZXIKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja01vZGlmeU9wcG9zaXRlKE1ldGhvZEVsZW1lbnQgZmVhdHVyZU93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gT3Bwb3NpdGVGZWF0dXJlCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZShmZWF0dXJlKTsKLQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbXJFT2JqID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlbGVtZW50OwotCQlpZiAob3Bwb3NpdGVGZWF0dXJlICE9IG51bGwgJiYgIW9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJTmFtZWRFbGVtZW50IG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlID0gKE5hbWVkRWxlbWVudCkgbXJFT2JqCi0JCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5nZXQob3Bwb3NpdGVGZWF0dXJlKTsKLQkJCWlmIChvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSAhPSBudWxsCi0JCQkJCS8vIG1ha2Ugc3VyZSB0aGUgZWxlbWVudCBpcyBzdGlsbCBpbiB0aGUgbGlicmFyeSBhbmQgbm90Ci0JCQkJCS8vIGRlbGV0ZWQgeWV0LgotCQkJCQkvLwotCQkJCQkmJiAob2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5IHx8IG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlCi0JCQkJCQkJLmVDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQkmJiBvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJLy8gc2ltcGxlIHJlamVjdCBmb3IgNy4wLjAgcmVsZWFzZQotCQkJCS8vCi0JCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQKLQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLlVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHMsCi0JCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJZWxlbWVudC5nZXROYW1lKCksCi0JCQkJCQkJCQkJVG5nVXRpbAotCQkJCQkJCQkJCQkJLmdldExhYmVsV2l0aFBhdGgob2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUpLAotCQkJCQkJCQkJCWZlYXR1cmVPd25lci5nZXROYW1lKCkgfSk7Ci0JCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dXYXJuaW5nKAotCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsIG1zZyk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkJLy8gVE9ETzogdW5jb21tZW50IHRvIHVzZSB0aGlzIGNvZGUgZm9yIDcuMC4xIHJlbGVhc2UKLQkJCQkvLwotCQkJCS8vIFN0cmluZyB0aXRsZSA9ICJVcGRhdGUgUmVsYXRpb25zaGlwIjsKLQkJCQkvLyBTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoIkFkZGluZyAnJ3swfScnIHRvICcnezF9JycKLQkJCQkvLyB3aWxsIHJlbW92ZSAnJ3swfScnIGZyb20gJyd7Mn0nJy4gRG8geW91IHdhbnQgdG8gY29udGludWU/IgotCQkJCS8vICwgbmV3IE9iamVjdFtdIHsgZWxlbWVudC5nZXROYW1lKCksIGZlYXR1cmVPd25lci5nZXROYW1lKCksCi0JCQkJLy8gb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUuZ2V0TmFtZSgpIH0pOwotCQkJCS8vIGlmKCFMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5Q29uZmlybWF0aW9uKHRpdGxlLAotCQkJCS8vIG1zZykpIHsKLQkJCQkvLyByZXR1cm4gZmFsc2U7Ci0JCQkJLy8gfQotCQkJCS8vCQkJCQotCQkJCS8vIElTdGF0dXMgc3RhdHVzID0KLQkJCQkvLyBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkob2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUsCi0JCQkJLy8gbnVsbCk7Ci0JCQkJLy8gaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsCi0JCQkJLy8gIkNhbm5vdCB1cGRhdGUgcmVsYXRpb25zaGlwIiwgc3RhdHVzKTsKLQkJCQkvLyByZXR1cm4gZmFsc2U7Ci0JCQkJLy8gfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjaGVja0NvbmZpZ3VyYXRpb25zVG9VcGRhdGUoQWRkQ29tbWFuZCBhZGRDb21tYW5kLAotCQkJT2JqZWN0IHNoZWxsKSB7Ci0JCUVPYmplY3QgcGFyZW50ID0gYWRkQ29tbWFuZC5nZXRPd25lcigpOwotCQlpZiAoIShwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSkgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGRDb21tYW5kLmdldEZlYXR1cmUoKTsKLQkJaWYgKCEoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpCi0JCQkJfHwgISgoRVJlZmVyZW5jZSkgZmVhdHVyZSkuaXNDb250YWlubWVudCgpKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCi0JCS8vIGNoZWNrIGlmIHRoZSBjb25maWd1cmF0aW9ucyB0aGF0IHdpbGwgYmUgdXBkYXRlZCBhZnRlciB0aGlzIGNvbW1hbmQKLQkJLy8gY2FuIGJlIG1vZGlmaWVkCi0JCS8vCi0JCUFycmF5TGlzdCBjb25maWdzVG9VcGRhdGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU1ldGhvZFBhY2thZ2UgcGFyZW50UGtnID0gKE1ldGhvZFBhY2thZ2UpIHBhcmVudDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJVG5nVXRpbC5nZXRDb25maWd1cmF0aW9uc1RvVXBkYXRlKHBhcmVudFBrZywKLQkJCQkJCShNZXRob2RQYWNrYWdlKSBlbGVtZW50LCBjb25maWdzVG9VcGRhdGUpOwotCQkJfQotCQl9Ci0JCWlmICghY29uZmlnc1RvVXBkYXRlLmlzRW1wdHkoKSkgewotCQkJQ29sbGVjdGlvbiByZXNvdXJjZXNUb0NoZWNrID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbmZpZ3NUb1VwZGF0ZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGNvbmZpZyA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNvbmZpZy5lUmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQlyZXNvdXJjZXNUb0NoZWNrLmFkZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gY2hlY2sgYWZmZWN0ZWQgcmVzb3VyY2VzIGZvciB1bm1vZGlmaWFibGUKLQkJCXJldHVybiBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkocmVzb3VyY2VzVG9DaGVjaywgc2hlbGwpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb25maXJtRGVlcENvcHkoQ29sbGVjdGlvbiBhY3Rpdml0aWVzKSB7Ci0JCWlmIChVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2FuSW50ZXJhY3QoKSkgewotCQkJLy8gY2hlY2tzIGlmIHRoZSBwYXR0ZXJuIG9yIGFjdGl2aXR5IGNvbnRhaW5zIGFueSBleHRlbmRpbmcgZWxlbWVudHMKLQkJCS8vIGFuZCBwcm9tcHRzIHRoZSB1c2VyIGlmIGhlIHJlYWxseQotCQkJLy8gd2FudHMgdG8gZGVlcCBjb3B5IGR5bmFtaWNhbGx5IGxpbmtlZCBhY3Rpdml0aWVzIHdhcm5pbmcgdGhlCi0JCQkvLyBwcm9jZXNzIGF1dGhvciB0aGF0IGhlIHdpbGwgZ2V0IGEgY29weQotCQkJLy8gb2YgYWxsIGR5bmFtaWNhbGx5IGxpbmtlZCBlbGVtZW50cyB0aGF0IGhlIG5lZWRzIHRvIG1haW50YWluCi0JCQkvLyBzZXBhcmF0ZWx5IGZyb20gbm93IG9uCi0JCQlib29sZWFuIHByb21wdE5lZWRlZCA9IGZhbHNlOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aXZpdGllcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCSYmIFByb2Nlc3NVdGlsLmhhc0luaGVyaXRlZCgoQWN0aXZpdHkpIGUpKSB7Ci0JCQkJCXByb21wdE5lZWRlZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChwcm9tcHROZWVkZWQpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWVwQ29weV90aXRsZTsKLQkJCQlTdHJpbmcgbXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVlcENvcHlfcHJvbXB0TXNnOwotCQkJCWludCByZXQgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCkKLQkJCQkJLnNlbGVjdE9uZShuZXcgaW50W10gewotCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9ZRVMsCi0JCQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX05PCi0JCQkJCX0sIHRpdGxlLCBtc2csIG51bGwpOwotCQkJCWlmIChyZXQgPT0gSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX05PKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUHJvbXB0cyB1c2VyIHRvIGNob29zZSBjb25maWd1cmF0aW9uIGZvciBkZWVwIGNvcHkKLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0UHJvY2VzcwotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEByZXR1cm4KLQkgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdXNlciBjYW5jZWxsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZENvbmZpZ3VyYXRpb24gY2hvb3NlRGVlcENvcHlDb25maWd1cmF0aW9uKAotCQkJUHJvY2VzcyB0YXJnZXRQcm9jZXNzLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlJRmlsdGVyIGZpbHRlciA9IFByb2Nlc3NVdGlsLmdldEZpbHRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gZGVlcENvcHlDb25maWcgPSBudWxsOwotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcikgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gKChJQ29uZmlndXJhdG9yKSBmaWx0ZXIpCi0JCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoY3VycmVudENvbmZpZyAhPSBudWxsCi0JCQkJCSYmIGN1cnJlbnRDb25maWcgIT0gdGFyZ2V0UHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpKSB7Ci0JCQkJaWYgKFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jYW5JbnRlcmFjdCgpKSB7Ci0JCQkJCVN0cmluZyBtc2cgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5BY3Rpdml0eURyb3BDb21tYW5kX2RlZXBDb3B5X3Byb21wdENvbmZpZ3VyYXRpb25Nc2c7Ci0JCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJCQkJaWYodWlIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJCWludCByZXQgPSB1aUhhbmRsZXIuc2VsZWN0T25lKG5ldyBpbnRbXSB7Ci0JCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9ZRVMsCi0JCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9OTywKLQkJCQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTAotCQkJCQkJCX0sIExpYnJhcnlFZGl0UmVzb3VyY2VzLmRlZXBDb3B5X3RpdGxlLCBtc2csIG51bGwpOwkJCQkJCQotCQkJCQkJc3dpdGNoIChyZXQpIHsKLQkJCQkJCWNhc2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX1lFUzoKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX05POgotCQkJCQkJCWRlZXBDb3B5Q29uZmlnID0gY3VycmVudENvbmZpZzsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTDoKLQkJCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVlcENvcHlDb25maWc7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJVUlIZWxwZXIgZ2V0VUlIZWxwZXIoKSB7Ci0JCXJldHVybiB1aUhlbHBlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMzNzNkZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHN1cHBvcnRpbmcgZGlhbG9ncyBmb3Igc2VsZWN0aW5nIGFuZCBlZGl0aW5nIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9BY3Rpdml0eUhhbmRsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9BY3Rpdml0eUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3NzZiZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQWN0aXZpdHlIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQ29weUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbi5UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBVc2VkIHRvIGV4dGVuZC9jb3B5IGFjdGl2aXRpZXMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5SGFuZGxlciB7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBwcm9jUGFja2FnZXM7Ci0JCi0JLyoqCi0JICogTGlzdCBvZiBhY3Rpdml0aWVzIG9yIGFjdGl2aXR5IHdyYXBwZXJzIHRvIGRlZXAgY29weS4KLQkgKi8KLQlwcml2YXRlIEFycmF5TGlzdDxPYmplY3Q+IGFjdGl2aXRpZXNUb0RlZXBDb3B5OwkKLQkKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGVlcENvcHlDb25maWc7CQotCXByaXZhdGUgTGlzdCBkZWVwQ29waWVzOwotCXByaXZhdGUgTWFwIGRlZXBDb3B5VG9PcmlnaW5hbE1hcDsKLQlwcml2YXRlIEFycmF5TGlzdCBhY3Rpdml0aWVzOwotCi0JcHJpdmF0ZSBNYXAgY29weVRvT3JpZ2luYWw7Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKLQkKLQlwcml2YXRlIEhlbHBlciBjb3B5SGVscGVyOwotCQotCXByaXZhdGUgQ29weUhlbHBlciBkZWVwQ29weUhlbHBlcjsKLQotCXByaXZhdGUgUHJvY2VzcyB0YXJnZXRQcm9jZXNzOwotCQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCQotCXByaXZhdGUgSUNvbmZpZ3VyYXRvciBhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBBY3Rpdml0eUhhbmRsZXIKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlIYW5kbGVyKCkgewotCQlhY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlhY3Rpdml0aWVzVG9EZWVwQ29weSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlkZWVwQ29waWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlkZWVwQ29weVRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQljb3B5VG9PcmlnaW5hbCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXByb2NQYWNrYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsJCi0JCWNvcHlIZWxwZXIgPSBuZXcgSGVscGVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWFjdGl2aXRpZXMuY2xlYXIoKTsKLQkJYWN0aXZpdGllc1RvRGVlcENvcHkuY2xlYXIoKTsKLQkJY29weVRvT3JpZ2luYWwuY2xlYXIoKTsKLQkJcHJvY1BhY2thZ2VzLmNsZWFyKCk7Ci0JCWNvcHlIZWxwZXIuY2xlYXIoKTsJCQotCQlkZWVwQ29waWVzLmNsZWFyKCk7CQkKLQkJaWYoZGVlcENvcHlIZWxwZXIgIT0gbnVsbCkgewotCQkJZGVlcENvcHlIZWxwZXIuY2xlYXIoKTsKLQkJfQotCQlkZWVwQ29weVRvT3JpZ2luYWxNYXAuY2xlYXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY29weShBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlwcm9jUGFja2FnZXMuYWRkKGFjdGl2aXR5LmVDb250YWluZXIoKSk7Ci0JfQotCQotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldERlZXBDb3B5Q29uZmlnKCkgewotCQlyZXR1cm4gZGVlcENvcHlDb25maWc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVlcENvcHlDb25maWcoTWV0aG9kQ29uZmlndXJhdGlvbiBkZWVwQ29weUNvbmZpZykgewotCQl0aGlzLmRlZXBDb3B5Q29uZmlnID0gZGVlcENvcHlDb25maWc7Ci0JfQotCQotCXB1YmxpYyBQcm9jZXNzIGdldFRhcmdldFByb2Nlc3MoKSB7Ci0JCXJldHVybiB0YXJnZXRQcm9jZXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhcmdldFByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MpIHsKLQkJdGFyZ2V0UHJvY2VzcyA9IHByb2M7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RGVlcENvcGllcygpIHsKLQkJcmV0dXJuIGRlZXBDb3BpZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVlcENvcHkoT2JqZWN0IGFjdGl2aXR5T3JXcmFwcGVyKSB7Ci0JCU9iamVjdCB1bndyYXBwZWQgPSBUbmdVdGlsLnVud3JhcChhY3Rpdml0eU9yV3JhcHBlcik7Ci0JCWlmKHVud3JhcHBlZCBpbnN0YW5jZW9mIEFjdGl2aXR5ICYmICgoQWN0aXZpdHkpdW53cmFwcGVkKS5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJYWN0aXZpdGllc1RvRGVlcENvcHkuYWRkKGFjdGl2aXR5T3JXcmFwcGVyKTsKLQkJfQotCX0JCi0JCi0JcHVibGljIHZvaWQgZXh0ZW5kKEFjdGl2aXR5IGFjdCkgewotCQlBY3Rpdml0eSBleHRlbmRlZEFjdCA9IFByb2Nlc3NVdGlsLmdlbmVyYWxpemUoYWN0LAotCQkJCVZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKTsKLQkJYWN0aXZpdGllcy5hZGQoZXh0ZW5kZWRBY3QpOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRBY3Rpdml0aWVzKCkgewotCQlpZiAoIXByb2NQYWNrYWdlcy5pc0VtcHR5KCkgfHwgIWFjdGl2aXRpZXNUb0RlZXBDb3B5LmlzRW1wdHkoKSkgewotCQkJZWRpdGluZ0RvbWFpbiA9IG5ldyBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCW5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJCWlmKCFwcm9jUGFja2FnZXMuaXNFbXB0eSgpKSB7Ci0JCQkJYWN0aXZpdGllcy5hZGRBbGwoY29weShwcm9jUGFja2FnZXMpKTsKLQkJCX0KLQkJCWlmKCFhY3Rpdml0aWVzVG9EZWVwQ29weS5pc0VtcHR5KCkpIHsKLQkJCQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgewotCQkJCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCQl9Ci0JCQkJZm9yIChPYmplY3QgYWN0IDogYWN0aXZpdGllc1RvRGVlcENvcHkpIHsKLQkJCQkJQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQgY21kID0gbmV3IEFjdGl2aXR5RGVlcENvcHlDb21tYW5kKAotCQkJCQkJCWFjdCwgZ2V0RGVlcENvcHlIZWxwZXIoKSwgZGVlcENvcHlDb25maWcsIHRhcmdldFByb2Nlc3MsIG1vbml0b3IsYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcik7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlsb25nIHRpbWUgPSAwOwotCQkJCQkJaWYgKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQkJCQl0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCQl9Ci0JCQkJCQljbWQuZXhlY3V0ZSgpOwotCQkJCQkJaWYgKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQgZXhlY3V0ZWQ6ICIKLQkJCQkJCQkJCQkJKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKQotCQkJCQkJCQkJCQkrICIgbXMiKTsKLQkJCQkJCQl0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCQl9Ci0JCQkJCQlDb2xsZWN0aW9uPD8+IHJlc3VsdCA9IGNtZC5nZXRSZXN1bHQoKTsKLQkJCQkJCWlmICghcmVzdWx0LmlzRW1wdHkoKSkgewotCQkJCQkJCUFjdGl2aXR5IGRlZXBDb3B5ID0gKEFjdGl2aXR5KSByZXN1bHQuaXRlcmF0b3IoKQotCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQlQcm9jZXNzVXRpbAotCQkJCQkJCQkJLmZpeEJyZWFrZG9ud0VsZW1lbnRPcmRlclJlY3Vyc2l2ZWx5KGRlZXBDb3B5KTsKLQkJCQkJCQlpZiAoVG5nVXRpbC5ERUJVRykgewotCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJLnByaW50bG4oIlByb2Nlc3NVdGlsLmZpeEJyZWFrZG9ud0VsZW1lbnRPcmRlclJlY3Vyc2l2ZWx5KCk6ICIKLQkJCQkJCQkJCQkJCSsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkKLQkJCQkJCQkJCQkJCSsgIiBtcyIpOwotCQkJCQkJCQl0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWNtZC5jb3B5U3VwcHJlc3Npb25TdGF0ZXMoKTsKLQkJCQkJCQlpZiAoVG5nVXRpbC5ERUJVRykgewotCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJLnByaW50bG4oIkFjdGl2aXR5RGVlcENvcHlDb21tYW5kLmNvcHlTdXBwcmVzc2lvblN0YXRlcygpOiAiCi0JCQkJCQkJCQkJCQkrIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpCi0JCQkJCQkJCQkJCQkrICIgbXMiKTsKLQkJCQkJCQkJdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQkJCX0KLQkJCQkJCQlkZWVwQ29waWVzLmFkZChkZWVwQ29weSk7Ci0JCQkJCQkJZGVlcENvcHlUb09yaWdpbmFsTWFwLnB1dChkZWVwQ29weSwgYWN0KTsKLQkJCQkJCX0KLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWNtZC5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlhY3Rpdml0aWVzLmFkZEFsbChkZWVwQ29waWVzKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBhY3Rpdml0aWVzOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlUHJlZGVjZXNzb3JzKExpc3Qgd29ya0JyZWFrZG93bkVsZW1lbnRzKSB7Ci0JCS8vIGdldCB0aGUgcHJlZGVzc29yIGxpc3RzIG9mIG9yaWdpbmFsIHdvcmsgYnJlYWtkb3duIGVsZW1lbnRzCi0JCS8vCi0JCUxpc3QgcHJlZGVjZXNzb3JMaXN0cyA9IG5ldyBBcnJheUxpc3QoKTsJCQotCQlPYmplY3Qgb3JpZ2luYWwgPSBjb3B5VG9PcmlnaW5hbC5nZXQod29ya0JyZWFrZG93bkVsZW1lbnRzLmdldCgwKSk7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gZWRpdGluZ0RvbWFpbi5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvcmlnaW5hbCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaW50IGZpcnN0SUQgPSBic0l0ZW1Qcm92aWRlci5nZXRJZCgpOyAKLQkJcHJlZGVjZXNzb3JMaXN0cy5hZGQoYnNJdGVtUHJvdmlkZXIuZ2V0UHJlZGVjZXNzb3JzKCkpOwotCQkvLyBJdGVtIHByb3ZpZGVyIG9mIGxhc3Qgd29yayBicmVha2Rvd24gZWxlbWVudCBpbiB0aGUgc3VidHJlZSB3aG9zZSByb290IGlzIG9yaWdpbmFsIGFjdGl2aXR5Ci0JCUlCU0l0ZW1Qcm92aWRlciBsYXN0V0JJcCA9IG51bGw7Ci0JCWZvcihJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGFkYXB0ZXJGYWN0b3J5LCBvcmlnaW5hbCwgZmFsc2UpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAob2JqKTsKLQkJCWlmKGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCUlCU0l0ZW1Qcm92aWRlciBic0lwID0gbnVsbDsKLQkJCQlpZihvYmogaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkJYnNJcCA9ICgoSUJTSXRlbVByb3ZpZGVyKW9iaik7Ci0JCQkJCXByZWRlY2Vzc29yTGlzdHMuYWRkKGJzSXAuZ2V0UHJlZGVjZXNzb3JzKCkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJT2JqZWN0IGlwID0gYWRhcHRlckZhY3RvcnkuYWRhcHQob2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQlpZihpcCBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCQkJYnNJcCA9ICgoSUJTSXRlbVByb3ZpZGVyKWlwKTsKLQkJCQkJCXByZWRlY2Vzc29yTGlzdHMuYWRkKGJzSXAuZ2V0UHJlZGVjZXNzb3JzKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKGJzSXAgIT0gbnVsbCkgewotCQkJCQlsYXN0V0JJcCA9IGJzSXA7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWludCBsYXN0SUQgPSBsYXN0V0JJcCAhPSBudWxsID8gbGFzdFdCSXAuZ2V0SWQoKSA6IGZpcnN0SUQ7Ci0JCQotCQkvLyB1cGRhdGUgcHJlZGVjZXNzb3JzCi0JCS8vCi0JCWludCBzaXplID0gd29ya0JyZWFrZG93bkVsZW1lbnRzLnNpemUoKTsKLQkJQXNzZXJ0LmlzVHJ1ZShzaXplID09IHByZWRlY2Vzc29yTGlzdHMuc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHdvcmtCcmVha2Rvd25FbGVtZW50cy5nZXQoaSk7Ci0JCQllLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuY2xlYXIoKTsKLQkJCVByZWRlY2Vzc29yTGlzdCBwcmVkTGlzdCA9IChQcmVkZWNlc3Nvckxpc3QpIHByZWRlY2Vzc29yTGlzdHMuZ2V0KGkpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHByZWRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlic0l0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpbnQgaWQgPSBic0l0ZW1Qcm92aWRlci5nZXRJZCgpOwotCQkJCWlmKGlkID49IGZpcnN0SUQgJiYgaWQgPD0gbGFzdElEKSB7Ci0JCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHdvcmtCcmVha2Rvd25FbGVtZW50cy5nZXQoaWQgLSBmaXJzdElEKTsKLQkJCQkJZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLmFkZChVbWFVdGlsLmNyZWF0ZURlZmF1bHRXb3JrT3JkZXIoZSwgcHJlZCkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gcHJlZGVjZXNzb3IgaXMgb3V0c2lkZSBvZiB0aGUgc3VidHJlZSwgZG9uJ3Qgc2VsZWN0IGl0IGZvciBub3cKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGNvcHlQcm9jZXNzUGFja2FnZXMoQ29sbGVjdGlvbiBwcm9jUGFja2FnZXMpIHsKLQkJQ29tbWFuZCBjb21tYW5kID0gY3JlYXRlQ29weUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwgcHJvY1BhY2thZ2VzKTsKLQkJaWYoY29tbWFuZCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQkJCXJldHVybiBjb21tYW5kLmdldFJlc3VsdCgpOwotCQkJfSBmaW5hbGx5IHsJCQkKLQkJCQljb21tYW5kLmRpc3Bvc2UoKTsJCQkKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhIGNvbW1hbmQgdGhhdCBjb3BpZXMgdGhlIGdpdmVuIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cy4gSWYgdGhlIGNvbGxlY3Rpb24gY29udGFpbnMgbW9yZSB0aGFuIG9uZSBvYmplY3QsCi0JICogdGhlbiBhIGNvbXBvdW5kIGNvbW1hbmQgd2lsbCBiZSBjcmVhdGVkIGNvbnRhaW5pbmcgaW5kaXZpZHVhbCBjb3B5IGNvbW1hbmRzIGZvciBlYWNoIG9iamVjdC4KLQkgKi8KLQlwcml2YXRlIENvbW1hbmQgY3JlYXRlQ29weUNvbW1hbmQoZmluYWwgRWRpdGluZ0RvbWFpbiBkb21haW4sIGZpbmFsIENvbGxlY3Rpb24gY29sbGVjdGlvbikKLQl7Ci0JCWlmIChjb2xsZWN0aW9uID09IG51bGwgfHwgY29sbGVjdGlvbi5pc0VtcHR5KCkpIAotCQl7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCi0JCUNvbXBvdW5kQ29tbWFuZCBjb3B5Q29tbWFuZCA9IG5ldyBDb21wb3VuZENvbW1hbmQoQ29tcG91bmRDb21tYW5kLk1FUkdFX0NPTU1BTkRfQUxMKTsKLQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTsgKQotCQl7Ci0JCQljb3B5Q29tbWFuZC5hcHBlbmQoZG9tYWluLmNyZWF0ZUNvbW1hbmQoQ29weUNvbW1hbmQuY2xhc3MsIG5ldyBDb21tYW5kUGFyYW1ldGVyKG9iamVjdHMubmV4dCgpLCBudWxsLCBjb3B5SGVscGVyKSkpOwotCQl9Ci0KLQkJcmV0dXJuIGNvcHlDb21tYW5kLnVud3JhcCgpOwotCX0KLQotCQotCS8qKgotCSAqIENvcGllcyB0aGUgZ2l2ZW4gcHJvY2VzcyBwYWNrYWdlcwotCSAqIAotCSAqIEBwYXJhbSBlZGl0aW5nRG9tYWluCi0JICogQHBhcmFtIHByb2NQYWNrYWdlcwotCSAqIEByZXR1cm4gYWN0aXZpdGllcyBvZiB0aGUgY29waWVzCi0JICovCi0JcHJpdmF0ZSBMaXN0IGNvcHkoTGlzdCBwcm9jUGFja2FnZXMpIHsKLQkJQ29sbGVjdGlvbiBjb3B5UGFja2FnZXMgPSBjb3B5UHJvY2Vzc1BhY2thZ2VzKHByb2NQYWNrYWdlcyk7Ci0JCUFycmF5TGlzdCBhY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb3B5UGFja2FnZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBjb3B5ID0gKFByb2Nlc3NQYWNrYWdlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChjb3B5IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCUFjdGl2aXR5IGFjdENvcHkgPSAoKFByb2Nlc3NDb21wb25lbnQpIGNvcHkpCi0JCQkJLmdldFByb2Nlc3MoKTsKLQkJCQkvLyBjb3B5IGRhdGEgZnJvbSBQcm9jZXNzQ29tcG9uZW50IHRvIGEgbmV3Ci0JCQkJLy8gUHJvY2Vzc1BhY2thZ2UKLQkJCQlQcm9jZXNzUGFja2FnZSBwa2dDb3B5ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJCQlwa2dDb3B5LnNldE5hbWUoYWN0Q29weS5nZXROYW1lKCkpOwotCQkJCXBrZ0NvcHkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKGFjdENvcHkpOwotCQkJCXBrZ0NvcHkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKAotCQkJCQkJY29weS5nZXRQcm9jZXNzRWxlbWVudHMoKSk7Ci0JCQkJcGtnQ29weS5nZXREaWFncmFtcygpLmFkZEFsbChjb3B5LmdldERpYWdyYW1zKCkpOwotCQkJCXBrZ0NvcHkuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZEFsbCgKLQkJCQkJCWNvcHkuZ2V0Q2hpbGRQYWNrYWdlcygpKTsKLQkJCQkKLQkJCQlhY3Rpdml0aWVzLmFkZChhY3RDb3B5KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWN0aXZpdGllcy5hZGQoUHJvY2Vzc1V0aWwuZmluZEFjdGl2aXR5KGNvcHkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWN0aXZpdGllczsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldERlZXBDb3B5VG9PcmlnaW5hbE1hcCgpIHsKLQkJcmV0dXJuIGRlZXBDb3B5VG9PcmlnaW5hbE1hcDsKLQl9Ci0JCi0JcHVibGljIEhlbHBlciBnZXRDb3B5SGVscGVyKCl7Ci0JCXJldHVybiBjb3B5SGVscGVyOwotCX0KLQkKLQlwdWJsaWMgQ29weUhlbHBlciBnZXREZWVwQ29weUhlbHBlcigpIHsKLQkJaWYoZGVlcENvcHlIZWxwZXIgPT0gbnVsbCkgewotCQkJZGVlcENvcHlIZWxwZXIgPSBuZXcgQ29weUhlbHBlcigpOwotCQl9Ci0JCXJldHVybiBkZWVwQ29weUhlbHBlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKAotCQkJSUNvbmZpZ3VyYXRvciBhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKSB7Ci0JCXRoaXMuYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvciA9IGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3I7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0FjdGl2aXR5VHJlZUl0ZXJhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQWN0aXZpdHlUcmVlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNkOTFjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQWN0aXZpdHlUcmVlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLQotLyoqCi0gKiBJbnRlcmF0b3IgdXNlZCB0byBpdGVyYXRlIHRoZSBicmVha2Rvd24gZWxlbWVudCB0cmVlIG9mIGFuIGFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVRyZWVJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY0MDIwMTc3NjgyMDU2NDIwNjhMOwotCi0JcHVibGljIEFjdGl2aXR5VHJlZUl0ZXJhdG9yKEFjdGl2aXR5IGFjdCkgewotCQlzdXBlcihhY3QsIGZhbHNlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJcmV0dXJuICgoQWN0aXZpdHkpIG9iamVjdCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQWRhcHRlckZhY3RvcnlJdGVtTGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0FkYXB0ZXJGYWN0b3J5SXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJiOTIxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQWRhcHRlckZhY3RvcnlJdGVtTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQWRhcHRlckZhY3RvcnlJdGVtTGFiZWxQcm92aWRlciBleHRlbmRzIEl0ZW1MYWJlbFByb3ZpZGVyIHsKLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5SXRlbUxhYmVsUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkgICAgLy8gR2V0IHRoZSBhZGFwdGVyIGZyb20gdGhlIGZhY3RvcnkuCi0JCS8vCi0JCUlJdGVtTGFiZWxQcm92aWRlciBpdGVtTGFiZWxQcm92aWRlciA9IChJSXRlbUxhYmVsUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KG9iamVjdCwgSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQotCQlyZXR1cm4gaXRlbUxhYmVsUHJvdmlkZXIgIT0gbnVsbCA/IGl0ZW1MYWJlbFByb3ZpZGVyLmdldEltYWdlKG9iamVjdCkKLQkJCQk6IHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JICAgIC8vIEdldCB0aGUgYWRhcHRlciBmcm9tIHRoZSBmYWN0b3J5LgotCQkvLwotCQlJSXRlbUxhYmVsUHJvdmlkZXIgaXRlbUxhYmVsUHJvdmlkZXIgPSAoSUl0ZW1MYWJlbFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChvYmplY3QsIElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0KLQkJcmV0dXJuIGl0ZW1MYWJlbFByb3ZpZGVyICE9IG51bGwgPyBpdGVtTGFiZWxQcm92aWRlci5nZXRUZXh0KG9iamVjdCkKLQkJCQk6IHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ2F0ZWdvcnlTb3J0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ2F0ZWdvcnlTb3J0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYjU4MjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NhdGVnb3J5U29ydEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gaGFuZGxlIHNvcnRpbmcgb2YgQ2F0ZWdvcnkgZWxlbWVudHMKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIENhdGVnb3J5U29ydEhlbHBlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEUgPSAiQ2F0ZWdvcnlFbGVtZW50c1NvcnRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9BTFBIQSA9ICJBbHBoYWJldGljIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9SRVZFUlNFX0FMUEhBID0gIlJldmVyc2VBbHBoYWJldGljIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9NRVRIT0RfVFlQRSA9ICJNZXRob2RUeXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9NQU5VQUwgPSAiTWFudWFsIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBNZXRob2RFbGVtZW50UHJvcGVydHkgdG8gc3RvcmUgdGhlIENhdGVnb3J5IHNvcnQgdHlwZQotCSAqIEBwYXJhbSBzb3J0VHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBjcmVhdGVOZXdTb3J0UHJvcGVydHkoU3RyaW5nIHNvcnRUeXBlKSB7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0JCXByb3Auc2V0TmFtZShLRVlfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRSk7Ci0JCWlmIChzb3J0VHlwZSAhPSBudWxsKSB7Ci0JCQlwcm9wLnNldFZhbHVlKHNvcnRUeXBlKTsKLQkJfQotCQlyZXR1cm4gcHJvcDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGNhdGVnb3J5IHNvcnQgcHJvcGVydHkgZm9yIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICogCQkgcHJvcGVydHkgaWYgZm91bmQsIGVsc2UgbnVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudFByb3BlcnR5IGdldENhdGVnb3J5U29ydFByb3BlcnR5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlMaXN0IHByb3BzID0gZWxlbWVudC5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHByb3BzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgaXQubmV4dCgpOwotCQkJaWYgKEtFWV9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFLmVxdWFscyhwcm9wLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gcHJvcDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogcmV0dXJuIHRydWUgaWZmIHRoZSBjYXRlZ29yeSBzb3J0LXR5cGUgaXMgc2V0IHRvIG1hbnVhbAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqIAkJIHByb3BlcnR5IGlmIGZvdW5kLCBlbHNlIG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNYW51YWxDYXRlZ29yeVNvcnQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBzb3J0VHlwZSA9IGdldENhdGVnb3J5U29ydFZhbHVlKGVsZW1lbnQpOwotCQlpZiAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01BTlVBTC5lcXVhbHMoc29ydFR5cGUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzb3J0LXR5cGUgZm9yIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50LgotCSAqIElmIG5vbmUgaXMgc2V0LCB3aWxsIHJldHVybiBBbHBoYWJldGljIHNvcnQgKFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9BTFBIQSkgYXMgYSBkZWZhdWx0Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnlTb3J0VmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gZ2V0Q2F0ZWdvcnlTb3J0UHJvcGVydHkoZWxlbWVudCk7Ci0JCWlmIChwcm9wID09IG51bGwpCi0JCQlyZXR1cm4gVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01BTlVBTDsKLQkJcmV0dXJuIHByb3AuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRDYXRlZ29yeVNvcnRUeXBlcygpIHsKLQkJTGlzdDxTdHJpbmc+IHJldHVybkxpc3QgPSBBcnJheXMuPFN0cmluZz5hc0xpc3QoCi0JCQkJVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01BTlVBTCwKLQkJCQlWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfQUxQSEEsCi0JCQkJVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX1JFVkVSU0VfQUxQSEEsCi0JCQkJVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01FVEhPRF9UWVBFKTsKLQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U29ydFR5cGVEaXNwbGF5TmFtZShTdHJpbmcgc29ydFR5cGUpIHsKLQkJaWYgKFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9BTFBIQS5lcXVhbHMoc29ydFR5cGUpKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuU29ydFR5cGVfQWxwaGFiZXRpYzsKLQkJfQotCQlpZiAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX1JFVkVSU0VfQUxQSEEuZXF1YWxzKHNvcnRUeXBlKSkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLlNvcnRUeXBlX1JldmVyc2VBbHBoYWJldGljOwotCQl9Ci0JCWlmIChWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfTUVUSE9EX1RZUEUuZXF1YWxzKHNvcnRUeXBlKSkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLlNvcnRUeXBlX01ldGhvZFR5cGU7Ci0JCX0KLQkJaWYgKFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9NQU5VQUwuZXF1YWxzKHNvcnRUeXBlKSkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLlNvcnRUeXBlX01hbnVhbDsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHNvcnRlZCBjYXRlZ29yeSBlbGVtZW50IGxpc3QgYmFzZWQgb24gdGhlIGNhdGVnb3J5J3Mgc29ydCB0eXBlCi0JICogUmVzcGVjdHMgdGhlIE5hbWUvUHJlc05hbWUgdG9nZ2xlCi0JICogQHBhcmFtIGVsZW1lbnQgCi0JICogQHBhcmFtIGVsZW1lbnRzIGFycmF5IHRvIHNvcnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdD4gc29ydENhdGVnb3J5RWxlbWVudHMoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBPYmplY3RbXSBlbGVtZW50cykgewotCQlyZXR1cm4gc29ydENhdGVnb3J5RWxlbWVudHMoZWxlbWVudCwgZWxlbWVudHMsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc29ydGVkIGNhdGVnb3J5IGVsZW1lbnQgbGlzdCBiYXNlZCBvbiB0aGUgY2F0ZWdvcnkncyBzb3J0IHR5cGUKLQkgKiBAcGFyYW0gZWxlbWVudCAKLQkgKiBAcGFyYW0gZWxlbWVudHMgYXJyYXkgdG8gc29ydAotCSAqIEBwYXJhbSBmb3JjZVByZXNOYW1lU29ydCB0cnVlIHRvIGFsd2F5cyBzb3J0IGJ5IHByZXNOYW1lLiBmYWxzZSB3aWxsIHJlc3BlY3QgdGhlIHRvZ2dsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0PiBzb3J0Q2F0ZWdvcnlFbGVtZW50cyhNZXRob2RFbGVtZW50IGVsZW1lbnQsIE9iamVjdFtdIGVsZW1lbnRzLCBib29sZWFuIGZvcmNlUHJlc05hbWVTb3J0KSB7Ci0JCS8qCi0JCSAqIFRPRE86IGNhbid0IHVzZSBnZW5lcmljcyBoZXJlIGJlY2F1c2UgRU1GIGRvZXNuJ3QgdXNlIHRoZW0geWV0IC0gdGhlIGVsZW1lbnRzIHBhcmFtCi0JCSAqIHVzdWFsbHkgY29tZXMgZnJvbSBDb250ZW50RWxlbWVudHNPcmRlckxpc3QgY2xhc3Mgd2hpY2ggZXh0ZW5kcyBFTUYncyBCYXNpY0VMaXN0IGFuZCBzbwotCQkgKiB0aGUgdG9BcnJheSgpIG1ldGhvZCB3aWxsIG9ubHkgcmV0dXJuIE9iamVjdFtdCi0JCSAqLwotCQlMaXN0PE9iamVjdD4gcmV0dXJuTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PihBcnJheXMuPE9iamVjdD5hc0xpc3QoZWxlbWVudHMpKTsKLQkJU3RyaW5nIHNvcnRUeXBlID0gZ2V0Q2F0ZWdvcnlTb3J0VmFsdWUoZWxlbWVudCk7Ci0JCWlmIChWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfTUFOVUFMLmVxdWFscyhzb3J0VHlwZSkpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQkJcmV0dXJuIGZpbmRNYW51YWxTb3J0T3JkZXJJbkNvbnRyaWJ1dG9ycygoQ29udGVudENhdGVnb3J5KWVsZW1lbnQsIHJldHVybkxpc3QpOwotCQkJfQotCQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JCX0gZWxzZSBpZiAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX0FMUEhBLmVxdWFscyhzb3J0VHlwZSkpIHsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0Q29tcGFyYXRvcigpOwotCQkJaWYgKGZvcmNlUHJlc05hbWVTb3J0KQotCQkJCWNvbXBhcmF0b3IgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldFByZXNOYW1lQ29tcGFyYXRvcigpOwotCQkJQ29sbGVjdGlvbnMuPE9iamVjdD5zb3J0KHJldHVybkxpc3QsIGNvbXBhcmF0b3IpOwotCQl9IGVsc2UgaWYgKFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9SRVZFUlNFX0FMUEhBLmVxdWFscyhzb3J0VHlwZSkpIHsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0UmV2ZXJzZUNvbXBhcmF0b3IoKTsKLQkJCWlmIChmb3JjZVByZXNOYW1lU29ydCkKLQkJCQljb21wYXJhdG9yID0gUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRQcmVzTmFtZVJldmVyc2VDb21wYXJhdG9yKCk7Ci0JCQlDb2xsZWN0aW9ucy48T2JqZWN0PnNvcnQocmV0dXJuTGlzdCwgY29tcGFyYXRvcik7Ci0JCX0gZWxzZSBpZiAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01FVEhPRF9UWVBFLmVxdWFscyhzb3J0VHlwZSkpIHsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudFR5cGVDb21wYXJhdG9yKCk7Ci0JCQlpZiAoZm9yY2VQcmVzTmFtZVNvcnQpCi0JCQkJY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0UHJlc05hbWVNZXRob2RFbGVtZW50VHlwZUNvbXBhcmF0b3IoKTsKLQkJCUNvbGxlY3Rpb25zLjxPYmplY3Q+c29ydChyZXR1cm5MaXN0LCBjb21wYXJhdG9yKTsKLQkJfQotCQlyZXR1cm4gcmV0dXJuTGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxPYmplY3Q+IGZpbmRNYW51YWxTb3J0T3JkZXJJbkNvbnRyaWJ1dG9ycyhDb250ZW50Q2F0ZWdvcnkgY2MsIExpc3Q8T2JqZWN0PiBlbGVtZW50TGlzdCkgewotCQlPcmRlckluZm8gbGF0ZXN0SW5mbyA9IG51bGw7Ci0JCU1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+IGd1aWRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+KCk7Ci0KLQkJU3RyaW5nIHNvcnRUeXBlID0gZ2V0Q2F0ZWdvcnlTb3J0VmFsdWUoY2MpOwotCQlpZiAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01BTlVBTC5lcXVhbHMoc29ydFR5cGUpKSB7Ci0JCQkvLyBzZXQgdXAgR1VJRCBtYXAKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50TGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG8gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWd1aWRNYXAucHV0KCgoTWV0aG9kRWxlbWVudClvKS5nZXRHdWlkKCksCi0JCQkJCQkJKE1ldGhvZEVsZW1lbnQpbyk7Ci0JCQkJfQotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gVG5nVXRpbC5nZXRDb250cmlidXRvcnMoY2MpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQkJCUNvbnRlbnRDYXRlZ29yeSBjb250cmlidXRvciA9IChDb250ZW50Q2F0ZWdvcnkpb2JqOwotCQkJCQlPcmRlckluZm8gb3JkZXJJbmZvID0gVG5nVXRpbC5nZXRPcmRlckluZm8oY29udHJpYnV0b3IsIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0Lk9SREVSX0lORk9fTkFNRSk7Ci0JCQkJCWlmIChvcmRlckluZm8gPT0gbnVsbCkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJLy8gZmluZCBsYXRlc3QgT3JkZXJJbmZvIHRoYXQgY29udGFpbnMgYWxsIHRoZXNlIGVsZW1lbnRzCi0JCQkJCWlmIChsYXRlc3RJbmZvID09IG51bGwgfHwgb3JkZXJJbmZvLmdldFRpbWVzdGFtcCgpID4gbGF0ZXN0SW5mby5nZXRUaW1lc3RhbXAoKSkgewotCQkJCQkJbGF0ZXN0SW5mbyA9IG9yZGVySW5mbzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChsYXRlc3RJbmZvICE9IG51bGwpIHsKLQkJCQlMaXN0PE9iamVjdD4gcmV0dXJuTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCS8vIHNvcnQgbGlzdCBhY2NvcmRpbmcgdG8gb3JkZXJJbmZvCi0JCQkJaW50IHNpemUgPSBsYXRlc3RJbmZvLmdldEdVSURzKCkuc2l6ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCVN0cmluZyBndWlkID0gKFN0cmluZylsYXRlc3RJbmZvLmdldEdVSURzKCkuZ2V0KGkpOwotCQkJCQlPYmplY3QgZWxlbWVudCA9IGd1aWRNYXAuZ2V0KGd1aWQpOwotCQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm5MaXN0LmFkZChlbGVtZW50KTsKLQkJCQkJCWd1aWRNYXAucmVtb3ZlKGd1aWQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gdHJ5IHRvIGZpbmQgZWxlbWVudCBpbiB0aGUgZ3VpZE1hcCB0aGF0IGhhcyBhIGdlbmVyYWxpemVyIHdpdGggImd1aWQiCi0JCQkJCQlNZXRob2RFbGVtZW50IG1lID0gZmluZEVsZW1lbnRJbkdlbmVyYWxpemVyTGlzdChndWlkTWFwLCBndWlkKTsKLQkJCQkJCWlmIChtZSAhPSBudWxsKSB7Ci0JCQkJCQkJcmV0dXJuTGlzdC5hZGQobWUpOwotCQkJCQkJCWd1aWRNYXAucmVtb3ZlKGd1aWQpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBjb3VsZCBub3QgbG9jYXRlLCB3aWxsIHJldHVybiBvcmlnaW5hbCBsaXN0Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGVsZW1lbnRMaXN0LnNpemUoKSA9PSByZXR1cm5MaXN0LnNpemUoKSkKLQkJCQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRMaXN0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBNZXRob2RFbGVtZW50IGZpbmRFbGVtZW50SW5HZW5lcmFsaXplckxpc3QoTWFwPFN0cmluZywgTWV0aG9kRWxlbWVudD4gZ3VpZE1hcCwgU3RyaW5nIGd1aWQpIHsKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RFbGVtZW50PiBpdGVyID0gZ3VpZE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCB2YWx1ZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJZm9yIChJdGVyYXRvciBnZW5JdGVyID0gVG5nVXRpbC5nZXRHZW5lcmFsaXplcnMoKFZhcmlhYmlsaXR5RWxlbWVudCl2YWx1ZSk7Z2VuSXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBnZW5lcmFsaXplciA9IGdlbkl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZ2VuZXJhbGl6ZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQlpZiAoKChNZXRob2RFbGVtZW50KWdlbmVyYWxpemVyKS5nZXRHdWlkKCkuZXF1YWxzKGd1aWQpKSB7Ci0JCQkJCQkJcmV0dXJuIChNZXRob2RFbGVtZW50KWdlbmVyYWxpemVyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gY2MKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbmVlZFRvU29ydChNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWlmICghIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkgJiYgCi0JCQkJZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGlzY2lwbGluZSAmJiAKLQkJCQlmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfVGFza3MoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEb21haW4gJiYgCi0JCQkJZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW5fV29ya1Byb2R1Y3RzKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZVNldCAmJiAKLQkJCQlmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZXMoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUb29sICYmIAotCQkJCWZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbF9Ub29sTWVudG9ycygpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSAmJiAKLQkJCQlmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbXBhcmF0b3JzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29tcGFyYXRvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzMDQ0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29tcGFyYXRvcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5QbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci0KLQotLyoqCi0gKiBDb2xsZWN0aW9uIG9mIGNvbXBhcmF0b3JzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21wYXJhdG9ycyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8T2JqZWN0PiBERUZBVUxUX0NPTVBBUkFUT1IgPSBuZXcgQ29tcGFyYXRvcjxPYmplY3Q+KCkgewotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJaWYgKG8xID09IG8yKQotCQkJCXJldHVybiAwOwotCQkJQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCQkJaWYgKG8xIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBvMiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gY29sbGF0b3IuY29tcGFyZSgoKE1ldGhvZEVsZW1lbnQpIG8xKS5nZXROYW1lKCksICgoTWV0aG9kRWxlbWVudCkgbzIpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlPYmplY3QgbzF1bndyYXAgPSBUbmdVdGlsLnVud3JhcChvMSk7Ci0JCQlPYmplY3QgbzJ1bndyYXAgPSBUbmdVdGlsLnVud3JhcChvMik7Ci0JCQlpZiAobzF1bndyYXAgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCSYmIG8ydW53cmFwIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXJldHVybiBjb2xsYXRvci5jb21wYXJlKCgoTWV0aG9kRWxlbWVudCkgbzF1bndyYXApLmdldE5hbWUoKSwgKChNZXRob2RFbGVtZW50KSBvMnVud3JhcCkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0KLQl9OwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxPYmplY3Q+IFJFVkVSU0VfREVGQVVMVF9DT01QQVJBVE9SID0gbmV3IENvbXBhcmF0b3I8T2JqZWN0PigpIHsKLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCWlmIChvMSA9PSBvMikKLQkJCQlyZXR1cm4gMDsKLQkJCUNvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQkJCWlmIChvMSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgbzIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIG9wcG9zaXRlVmFsdWUoY29sbGF0b3IuY29tcGFyZSgoKE1ldGhvZEVsZW1lbnQpIG8xKS5nZXROYW1lKCksICgoTWV0aG9kRWxlbWVudCkgbzIpLmdldE5hbWUoKSkpOwotCQkJfQotCQkJT2JqZWN0IG8xdW53cmFwID0gVG5nVXRpbC51bndyYXAobzEpOwotCQkJT2JqZWN0IG8ydW53cmFwID0gVG5nVXRpbC51bndyYXAobzIpOwotCQkJaWYgKG8xdW53cmFwIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkmJiBvMnVud3JhcCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gb3Bwb3NpdGVWYWx1ZShjb2xsYXRvci5jb21wYXJlKCgoTWV0aG9kRWxlbWVudCkgbzF1bndyYXApLmdldE5hbWUoKSwgKChNZXRob2RFbGVtZW50KSBvMnVud3JhcCkuZ2V0TmFtZSgpKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBpbnQgb3Bwb3NpdGVWYWx1ZShpbnQgdmFsKSB7Ci0JCWlmICh2YWwgIT0gMCkgewotCQkJdmFsID0gMCAtIHZhbDsKLQkJfQotCQlyZXR1cm4gdmFsOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBUeXBlQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCQlwcm90ZWN0ZWQgQ29tcGFyYXRvcjxPYmplY3Q+IGdldERlZmF1bHRDb21wYXJhdG9yKCkgewotCQkJcmV0dXJuIERFRkFVTFRfQ09NUEFSQVRPUjsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIGFic3RyYWN0IGludCBnZXRPcmRlcklkKE9iamVjdCBvYmopOwotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJbzEgPSBUbmdVdGlsLnVud3JhcChvMSk7Ci0JCQlvMiA9IFRuZ1V0aWwudW53cmFwKG8yKTsKLQkJCWlmIChvMSA9PSBvMikKLQkJCQlyZXR1cm4gMDsKLQkJCWludCByZXQgPSAwOwotCQkJcmV0ID0gZ2V0T3JkZXJJZCgoRU9iamVjdCkgbzEpIC0gZ2V0T3JkZXJJZCgoRU9iamVjdCkgbzIpOwotCQkJaWYgKHJldCA9PSAwKSB7Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRDb21wYXJhdG9yKCkuY29tcGFyZShvMSwgbzIpOwotCQkJfQotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNvbXBhcmVQcmVzZW50YXRpb25OYW1lKERlc2NyaWJhYmxlRWxlbWVudCBlMSwgRGVzY3JpYmFibGVFbGVtZW50IGUyKSB7Ci0JCUNvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQkJU3RyaW5nIG5hbWUxID0gZTEgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50ID8gUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCllMSkKLQkJCQk6IGUxLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJaWYgKG5hbWUxLmxlbmd0aCgpIDwgMSkgbmFtZTEgPSBlMS5nZXROYW1lKCk7Ci0JCVN0cmluZyBuYW1lMiA9IGUyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCA/IFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoKEJyZWFrZG93bkVsZW1lbnQpZTIpCi0JCQkJOiBlMi5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCWlmIChuYW1lMi5sZW5ndGgoKSA8IDEpIG5hbWUyID0gZTIuZ2V0TmFtZSgpOwotCQlyZXR1cm4gY29sbGF0b3IuY29tcGFyZShuYW1lMSwgbmFtZTIpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBEZXNjcmliYWJsZUVsZW1lbnQgZ2V0RGVzY3JpYmFibGVFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJT2JqZWN0IG9iamVjdCA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KQotCQkJb2JqZWN0ID0gKChQcm9jZXNzQ29tcG9uZW50KSBvYmplY3QpLmdldFByb2Nlc3MoKTsKLQkJb2JqZWN0ID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKERlc2NyaWJhYmxlRWxlbWVudClvYmplY3Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIFBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJaWYgKG8xID09IG8yKQotCQkJCXJldHVybiAwOwotCQkJbzEgPSBnZXREZXNjcmliYWJsZUVsZW1lbnQobzEpOwotCQkJaWYgKG8xID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQotCQkJbzIgPSBnZXREZXNjcmliYWJsZUVsZW1lbnQobzIpOwotCQkJaWYgKG8yID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQotCQkJcmV0dXJuIGNvbXBhcmVQcmVzZW50YXRpb25OYW1lKChEZXNjcmliYWJsZUVsZW1lbnQpIG8xLCAoRGVzY3JpYmFibGVFbGVtZW50KSBvMik7Ci0JCX0KLQotCX07Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIFJFVkVSU0VfUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUiA9IG5ldyBDb21wYXJhdG9yKCkgewotCQkKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQlpZiAobzEgPT0gbzIpCi0JCQkJcmV0dXJuIDA7Ci0JCQlpZighKG8xIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSkgewotCQkJCW8xID0gVG5nVXRpbC51bndyYXAobzEpOwotCQkJCWlmKCEobzEgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCX0KLQkJCWlmKCEobzIgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpKSB7Ci0JCQkJbzIgPSBUbmdVdGlsLnVud3JhcChvMik7Ci0JCQkJaWYoIShvMiBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG9wcG9zaXRlVmFsdWUoY29tcGFyZVByZXNlbnRhdGlvbk5hbWUoKERlc2NyaWJhYmxlRWxlbWVudCkgbzEsIChEZXNjcmliYWJsZUVsZW1lbnQpIG8yKSk7Ci0JCX0KLQotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgTUVUSE9EX1RZUEVfQ09NUEFSQVRPUiA9IG5ldyBUeXBlQ29tcGFyYXRvcigpIHsKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9ycy5UeXBlQ29tcGFyYXRvciNnZXREZWZhdWx0Q29tcGFyYXRvcigpCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ29tcGFyYXRvciBnZXREZWZhdWx0Q29tcGFyYXRvcigpIHsKLQkJCXJldHVybiBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldENvbXBhcmF0b3IoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBpbnQgZ2V0T3JkZXJJZChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCWludCBpZCA9ICgoTWV0aG9kRWxlbWVudCkgb2JqKS5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKTsKLQkJCQlpZiAoaWQgPT0gVW1hUGFja2FnZS5URVJNX0RFRklOSVRJT04pIHsKLQkJCQkJaWQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGlkOwotCQkJfQotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfTsKLQkKLQkvKioKLQkgKiBBbHdheXMgc29ydCBieSBwcmVzZW50YXRpb24gbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvciBNRVRIT0RfVFlQRV9QUkVTX05BTUVfQ09NUEFSQVRPUiA9IG5ldyBUeXBlQ29tcGFyYXRvcigpIHsKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9ycy5UeXBlQ29tcGFyYXRvciNnZXREZWZhdWx0Q29tcGFyYXRvcigpCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ29tcGFyYXRvciBnZXREZWZhdWx0Q29tcGFyYXRvcigpIHsKLQkJCXJldHVybiBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldFByZXNOYW1lQ29tcGFyYXRvcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIGludCBnZXRPcmRlcklkKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJaW50IGlkID0gKChNZXRob2RFbGVtZW50KSBvYmopLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpOwotCQkJCWlmIChpZCA9PSBVbWFQYWNrYWdlLlRFUk1fREVGSU5JVElPTikgewotCQkJCQlpZCA9IEludGVnZXIuTUFYX1ZBTFVFOwotCQkJCX0KLQkJCQlyZXR1cm4gaWQ7Ci0JCQl9Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPE9iamVjdD4gUExVR0lOUEFDS0FHRV9DT01QQVJBVE9SID0gbmV3IENvbXBhcmF0b3I8T2JqZWN0PigpIHsKLQkKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQlpZiAobzEgPT0gbzIpCi0JCQkJcmV0dXJuIDA7Ci0JCQlvMSA9IFRuZ1V0aWwudW53cmFwKG8xKTsKLQkJCW8yID0gVG5nVXRpbC51bndyYXAobzIpOwotCQkJCi0JCQkKLQkJCWlmIChvMSBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIgJiYgbzIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlpZiAobzEgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gJiYgbzIgaW5zdGFuY2VvZiBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCi0JCQlib29sZWFuIHVzZVByZXNOYW1lID0gUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5pc1Nob3dQcmVzZW50YXRpb25OYW1lcygpOwotCQkJU3RyaW5nIHMxID0gbnVsbDsKLQkJCVN0cmluZyBzMiA9IG51bGw7Ci0JCQlpZiAodXNlUHJlc05hbWUgJiYgbzEgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQlzMSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBvMSkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJfSBlbHNlIGlmIChvMSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlzMSA9ICgoTWV0aG9kRWxlbWVudCkgbzEpLmdldE5hbWUoKTsKLQkJCX0gZWxzZSBpZiAobzEgaW5zdGFuY2VvZiBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkJczEgPSAoKFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpIG8xKS5nZXRGdWxsTmFtZSgpOwotCQkJfSBlbHNlIGlmIChvMSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCXMxID0gKFN0cmluZykgbzE7Ci0JCQl9IAotCQkJCi0JCQlpZiAodXNlUHJlc05hbWUgJiYgbzIgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQlzMiA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBvMikuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJfSBlbHNlIGlmIChvMiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlzMiA9ICgoTWV0aG9kRWxlbWVudCkgbzIpLmdldE5hbWUoKTsKLQkJCX0gZWxzZSBpZiAobzIgaW5zdGFuY2VvZiBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkJczIgPSAoKFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpIG8yKS5nZXRGdWxsTmFtZSgpOwotCQkJfSBlbHNlIGlmIChvMiBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCXMyID0gKFN0cmluZykgbzI7Ci0JCQl9Ci0JCQkKLQkJCWlmIChzMSA9PSBudWxsIHx8IHMyID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIHMxLmNvbXBhcmVUb0lnbm9yZUNhc2UoczIpOwotCQl9Ci0JfTsKLQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNGFlYmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci0KLQotLyoqCi0gKiBJbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGNhbiBiZSBjb25maWd1cmVkIHVzaW5nIHRoZSBzcGVjaWZpZWQgZmlsdGVyCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gSnVsIDI3LCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLy8gcHJpdmF0ZSBTZXQgZGlzcG9zYWJsZUFkYXB0ZXJzOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3JpZXMpOwotCX0KLQotCS8vIHByaXZhdGUgU2V0IGdldERpc3Bvc2FibGVBZGFwdGVycygpIHsKLQkvLyBpZihkaXNwb3NhYmxlQWRhcHRlcnMgPT0gbnVsbCkgewotCS8vIGRpc3Bvc2FibGVBZGFwdGVycyA9IG5ldyBIYXNoU2V0KCk7Ci0JLy8gfQotCS8vIHJldHVybiBkaXNwb3NhYmxlQWRhcHRlcnM7Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSNhZGFwdChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7Ci0JCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhYmxlKSB7Ci0JCQkoKElDb25maWd1cmFibGUpIGFkYXB0ZXIpLnNldEZpbHRlcihmaWx0ZXIpOwotCQl9Ci0JCS8vIGlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJRGlzcG9zYWJsZSkgewotCQkvLyBnZXREaXNwb3NhYmxlQWRhcHRlcnMoKS5hZGQoYWRhcHRlcik7Ci0JCS8vIH0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSNhZGFwdChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllciwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBzdXBlci5hZGFwdCh0YXJnZXQsIHR5cGUpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDb25maWd1cmFibGUpIHsKLQkJCSgoSUNvbmZpZ3VyYWJsZSkgYWRhcHRlcikuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCX0KLQkJLy8gaWYoYWRhcHRlciBpbnN0YW5jZW9mIElEaXNwb3NhYmxlKSB7Ci0JCS8vIGdldERpc3Bvc2FibGVBZGFwdGVycygpLmFkZChhZGFwdGVyKTsKLQkJLy8gfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpCi0JLy8gKi8KLQkvLyBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCS8vIGlmKGRpc3Bvc2FibGVBZGFwdGVycyAhPSBudWxsICYmICFkaXNwb3NhYmxlQWRhcHRlcnMuaXNFbXB0eSgpKSB7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gZGlzcG9zYWJsZUFkYXB0ZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIElEaXNwb3NhYmxlIGFkYXB0ZXIgPSAoSURpc3Bvc2FibGUpIGl0ZXIubmV4dCgpOwotCS8vIGFkYXB0ZXIuZGlzcG9zZSgpOwotCS8vIH0KLQkvLyB9Ci0JLy8gc3VwZXIuZGlzcG9zZSgpOwotCS8vIH0KLQotCXB1YmxpYyBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5I2ZpcmVOb3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlzdXBlci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChub3RpZmljYXRpb24gaW5zdGFuY2VvZiBWaWV3ZXJOb3RpZmljYXRpb24pIHsKLQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0KLQkJCQlTdHJpbmdXcml0ZXIgc3RyV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzdHJXcml0ZXIpKTsKLQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0UKLQkJCQkJCS5zaG93RXJyb3IoCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX2ZhdGFsZXJyLAotCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy51dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9yZWZlcnNoaW5ndmlld2VyLAotCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy51dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl91bmhhbmRsZWRfZXhjZXB0aW9uLAotCQkJCQkJCQlzdHJXcml0ZXIudG9TdHJpbmcoKSwgZSk7IAotCQkJCXJldHVybjsKLQkJCX0KLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbmZpZ3VyYXRpb25TZXR0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25maWd1cmF0aW9uU2V0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMDM0NDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbmZpZ3VyYXRpb25TZXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uU2V0dGVyIHsKLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCXByaXZhdGUgSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIG9sZENvbmZpZzsKLQotCXB1YmxpYyBDb25maWd1cmF0aW9uU2V0dGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUlGaWx0ZXIgZmlsdGVyID0gUHJvY2Vzc1V0aWwuZ2V0RmlsdGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJY29uZmlndXJhdG9yID0gZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvciA/IChJQ29uZmlndXJhdG9yKSBmaWx0ZXIgOiBudWxsOwotCQlpZihjb25maWd1cmF0b3IgIT0gbnVsbCkgewotCQkJb2xkQ29uZmlnID0gY29uZmlndXJhdG9yLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCWNvbmZpZ3VyYXRvci5zZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzdG9yZSgpIHsKLQkJaWYoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCWNvbmZpZ3VyYXRvci5zZXRNZXRob2RDb25maWd1cmF0aW9uKG9sZENvbmZpZyk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElDb25maWd1cmF0b3IgZ2V0Q29uZmlndXJhdG9yKCkgewotCQlyZXR1cm4gY29uZmlndXJhdG9yOwotCX0KLQkKLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRPbGRDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gb2xkQ29uZmlnOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25maWd1cmF0aW9uVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbmZpZ3VyYXRpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZmI4NmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbmZpZ3VyYXRpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGFkZC9yZW1vdmUgb2JqZWN0cyBmcm9tIGEgTWV0aG9kQ29uZmlndXJhdGlvbiB1c2luZyBhbiBJQWN0aW9uTWFuYWdlcgotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblV0aWwgewotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gYWN0aW9uT25Db2xsZWN0aW9uKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBDb2xsZWN0aW9uIHZhbHVlLCBpbnQgYWN0aW9uVHlwZSwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBMaXN0IGxpc3RGZWF0dXJlKSB7Ci0JCWlmIChjb25maWcgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsICYmICF2YWx1ZS5pc0VtcHR5KCkpIHsKLQkJCWlmIChhY3Rpb25NZ3IgIT0gbnVsbCkgewotCQkJCXJldHVybiBhY3Rpb25NZ3IuZG9BY3Rpb24oYWN0aW9uVHlwZSwgY29uZmlnLCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQkJCS0xKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGFjdGlvblR5cGUgPT0gSUFjdGlvbk1hbmFnZXIuQUREX01BTlkpIHsKLQkJCQkJcmV0dXJuIGxpc3RGZWF0dXJlLmFkZEFsbCh2YWx1ZSk7Ci0JCQkJfSBlbHNlIGlmIChhY3Rpb25UeXBlID09IElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZKSB7Ci0JCQkJCXJldHVybiBsaXN0RmVhdHVyZS5yZW1vdmVBbGwodmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhY3Rpb25Pbkl0ZW0oSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIE9iamVjdCB2YWx1ZSwgaW50IGFjdGlvblR5cGUsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgTGlzdCBsaXN0RmVhdHVyZSkgewotCQlpZiAoY29uZmlnICE9IG51bGwKLQkJCQkmJiB2YWx1ZSAhPSBudWxsCi0JCQkJJiYgKChhY3Rpb25UeXBlID09IElBY3Rpb25NYW5hZ2VyLkFERCAmJiAhbGlzdEZlYXR1cmUKLQkJCQkJCS5jb250YWlucyh2YWx1ZSkpIHx8IChhY3Rpb25UeXBlID09IElBY3Rpb25NYW5hZ2VyLlJFTU9WRSAmJiBsaXN0RmVhdHVyZQotCQkJCQkJLmNvbnRhaW5zKHZhbHVlKSkpKSB7Ci0JCQlpZiAoYWN0aW9uTWdyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gYWN0aW9uTWdyLmRvQWN0aW9uKGFjdGlvblR5cGUsIGNvbmZpZywgZmVhdHVyZSwgdmFsdWUsCi0JCQkJCQktMSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChhY3Rpb25UeXBlID09IElBY3Rpb25NYW5hZ2VyLkFERCkgewotCQkJCQlyZXR1cm4gbGlzdEZlYXR1cmUuYWRkKHZhbHVlKTsKLQkJCQl9IGVsc2UgaWYgKGFjdGlvblR5cGUgPT0gSUFjdGlvbk1hbmFnZXIuUkVNT1ZFKSB7Ci0JCQkJCXJldHVybiBsaXN0RmVhdHVyZS5yZW1vdmUodmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBjb2xsZWN0aW9uIHRvIHRoZSBNZXRob2RDb25maWd1cmF0aW9uJ3MgbGlzdCBvZiBzZWxlY3RlZCBNZXRob2RQbHVnaW5zCi0JICogQHBhcmFtIGFjdGlvbk1nciB1c2UgdGhpcyBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24sIGlmIG51bGwgd2lsbCBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgYWN0aW9uTWFuYWdlciBvciBsaXN0IG1hbmlwdWxhdGlvbiBmYWlscywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkQ29sbFRvTWV0aG9kUGx1Z2luTGlzdChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBDb2xsZWN0aW9uIHZhbHVlKSB7Ci0JCXJldHVybiBhY3Rpb25PbkNvbGxlY3Rpb24oYWN0aW9uTWdyLCBjb25maWcsIHZhbHVlLCBJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpLCBjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIE1ldGhvZFBsdWdpbiB0byB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgTWV0aG9kUGx1Z2lucwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IgdXNlIHRoaXMgSUFjdGlvbk1hbmFnZXIgdG8gY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uLCBpZiBudWxsIHdpbGwgY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uIGRpcmVjdGx5LgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGFjdGlvbk1hbmFnZXIgb3IgbGlzdCBtYW5pcHVsYXRpb24gZmFpbHMsIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZFRvTWV0aG9kUGx1Z2luTGlzdChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBNZXRob2RQbHVnaW4gdmFsdWUpIHsKLQkJcmV0dXJuIGFjdGlvbk9uSXRlbShhY3Rpb25NZ3IsIGNvbmZpZywgdmFsdWUsIElBY3Rpb25NYW5hZ2VyLkFERCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKSwgY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBjb2xsZWN0aW9uIGZyb20gdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24ncyBsaXN0IG9mIHNlbGVjdGVkIE1ldGhvZFBsdWdpbnMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyIHVzZSB0aGlzIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiwgaWYgbnVsbCB3aWxsIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiBkaXJlY3RseS4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBmYWxzZSBpZiBhY3Rpb25NYW5hZ2VyIG9yIGxpc3QgbWFuaXB1bGF0aW9uIGZhaWxzLCB0cnVlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVDb2xsRnJvbU1ldGhvZFBsdWdpbkxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQ29sbGVjdGlvbiB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25Db2xsZWN0aW9uKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCksIGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIE1ldGhvZFBsdWdpbiBmcm9tIHRoZSBNZXRob2RDb25maWd1cmF0aW9uJ3MgbGlzdCBvZiBzZWxlY3RlZCBNZXRob2RQbHVnaW5zCi0JICogQHBhcmFtIGFjdGlvbk1nciB1c2UgdGhpcyBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24sIGlmIG51bGwgd2lsbCBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgYWN0aW9uTWFuYWdlciBvciBsaXN0IG1hbmlwdWxhdGlvbiBmYWlscywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlRnJvbU1ldGhvZFBsdWdpbkxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgTWV0aG9kUGx1Z2luIHZhbHVlKSB7Ci0JCXJldHVybiBhY3Rpb25Pbkl0ZW0oYWN0aW9uTWdyLCBjb25maWcsIHZhbHVlLCBJQWN0aW9uTWFuYWdlci5SRU1PVkUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCksIGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gY29sbGVjdGlvbiB0byB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgTWV0aG9kUGFja2FnZXMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyIHVzZSB0aGlzIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiwgaWYgbnVsbCB3aWxsIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiBkaXJlY3RseS4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBmYWxzZSBpZiBhY3Rpb25NYW5hZ2VyIG9yIGxpc3QgbWFuaXB1bGF0aW9uIGZhaWxzLCB0cnVlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRDb2xsVG9NZXRob2RQYWNrYWdlTGlzdChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBDb2xsZWN0aW9uIHZhbHVlKSB7Ci0JCXJldHVybiBhY3Rpb25PbkNvbGxlY3Rpb24oYWN0aW9uTWdyLCBjb25maWcsIHZhbHVlLCBJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksIGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkpOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBNZXRob2RQYWNrYWdlIHRvIHRoZSBNZXRob2RDb25maWd1cmF0aW9uJ3MgbGlzdCBvZiBzZWxlY3RlZCBNZXRob2RQYWNrYWdlcwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IgdXNlIHRoaXMgSUFjdGlvbk1hbmFnZXIgdG8gY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uLCBpZiBudWxsIHdpbGwgY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uIGRpcmVjdGx5LgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGFjdGlvbk1hbmFnZXIgb3IgbGlzdCBtYW5pcHVsYXRpb24gZmFpbHMsIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZFRvTWV0aG9kUGFja2FnZUxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgTWV0aG9kUGFja2FnZSB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25JdGVtKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuQURELCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSwgY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSk7Ci0JfQotCi0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBmcm9tIHRoZSBNZXRob2RDb25maWd1cmF0aW9uJ3MgbGlzdCBvZiBzZWxlY3RlZCBNZXRob2RQYWNrYWdlcwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IgdXNlIHRoaXMgSUFjdGlvbk1hbmFnZXIgdG8gY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uLCBpZiBudWxsIHdpbGwgY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uIGRpcmVjdGx5LgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGFjdGlvbk1hbmFnZXIgb3IgbGlzdCBtYW5pcHVsYXRpb24gZmFpbHMsIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUNvbGxGcm9tTWV0aG9kUGFja2FnZUxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQ29sbGVjdGlvbiB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25Db2xsZWN0aW9uKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLCBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gTWV0aG9kUGFja2FnZSBmcm9tIHRoZSBNZXRob2RDb25maWd1cmF0aW9uJ3MgbGlzdCBvZiBzZWxlY3RlZCBNZXRob2RQYWNrYWdlcwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IgdXNlIHRoaXMgSUFjdGlvbk1hbmFnZXIgdG8gY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uLCBpZiBudWxsIHdpbGwgY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uIGRpcmVjdGx5LgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGFjdGlvbk1hbmFnZXIgb3IgbGlzdCBtYW5pcHVsYXRpb24gZmFpbHMsIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUZyb21NZXRob2RQYWNrYWdlTGlzdChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBNZXRob2RQYWNrYWdlIHZhbHVlKSB7Ci0JCXJldHVybiBhY3Rpb25Pbkl0ZW0oYWN0aW9uTWdyLCBjb25maWcsIHZhbHVlLCBJQWN0aW9uTWFuYWdlci5SRU1PVkUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLCBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpKTsKLQl9Ci0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGNvbGxlY3Rpb24gdG8gdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24ncyBsaXN0IG9mIHNlbGVjdGVkIGFkZGVkLWNhdGVnb3JpZXMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyIHVzZSB0aGlzIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiwgaWYgbnVsbCB3aWxsIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiBkaXJlY3RseS4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBmYWxzZSBpZiBhY3Rpb25NYW5hZ2VyIG9yIGxpc3QgbWFuaXB1bGF0aW9uIGZhaWxzLCB0cnVlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRDb2xsVG9BZGRlZENhdGVnb3J5TGlzdChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBDb2xsZWN0aW9uIHZhbHVlKSB7Ci0JCXJldHVybiBhY3Rpb25PbkNvbGxlY3Rpb24oYWN0aW9uTWdyLCBjb25maWcsIHZhbHVlLCBJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCksIGNvbmZpZy5nZXRBZGRlZENhdGVnb3J5KCkpOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBDb250ZW50Q2F0ZWdvcnkgdG8gdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24ncyBsaXN0IG9mIHNlbGVjdGVkIGFkZGVkLWNhdGVnb3JpZXMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyIHVzZSB0aGlzIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiwgaWYgbnVsbCB3aWxsIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiBkaXJlY3RseS4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBmYWxzZSBpZiBhY3Rpb25NYW5hZ2VyIG9yIGxpc3QgbWFuaXB1bGF0aW9uIGZhaWxzLCB0cnVlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRUb0FkZGVkQ2F0ZWdvcnlMaXN0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIENvbnRlbnRDYXRlZ29yeSB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25JdGVtKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuQURELCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKSwgY29uZmlnLmdldEFkZGVkQ2F0ZWdvcnkoKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBmcm9tIHRoZSBNZXRob2RDb25maWd1cmF0aW9uJ3MgbGlzdCBvZiBzZWxlY3RlZCBhZGRlZC1jYXRlZ29yaWVzCi0JICogQHBhcmFtIGFjdGlvbk1nciB1c2UgdGhpcyBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24sIGlmIG51bGwgd2lsbCBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgYWN0aW9uTWFuYWdlciBvciBsaXN0IG1hbmlwdWxhdGlvbiBmYWlscywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlQ29sbEZyb21BZGRlZENhdGVnb3J5TGlzdChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBDb2xsZWN0aW9uIHZhbHVlKSB7Ci0JCXJldHVybiBhY3Rpb25PbkNvbGxlY3Rpb24oYWN0aW9uTWdyLCBjb25maWcsIHZhbHVlLCBJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCksIGNvbmZpZy5nZXRBZGRlZENhdGVnb3J5KCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIENvbnRlbnRDYXRlZ29yeSBmcm9tIHRoZSBNZXRob2RDb25maWd1cmF0aW9uJ3MgbGlzdCBvZiBzZWxlY3RlZCBhZGRlZC1jYXRlZ29yaWVzCi0JICogQHBhcmFtIGFjdGlvbk1nciB1c2UgdGhpcyBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24sIGlmIG51bGwgd2lsbCBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgYWN0aW9uTWFuYWdlciBvciBsaXN0IG1hbmlwdWxhdGlvbiBmYWlscywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlRnJvbUFkZGVkQ2F0ZWdvcnlMaXN0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIENvbnRlbnRDYXRlZ29yeSB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25JdGVtKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKSwgY29uZmlnLmdldEFkZGVkQ2F0ZWdvcnkoKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gY29sbGVjdGlvbiB0byB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgc3VidHJhY3RlZC1jYXRlZ29yaWVzCi0JICogQHBhcmFtIGFjdGlvbk1nciB1c2UgdGhpcyBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24sIGlmIG51bGwgd2lsbCBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgYWN0aW9uTWFuYWdlciBvciBsaXN0IG1hbmlwdWxhdGlvbiBmYWlscywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkQ29sbFRvU3VidHJhY3RlZENhdGVnb3J5TGlzdChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBDb2xsZWN0aW9uIHZhbHVlKSB7Ci0JCXJldHVybiBhY3Rpb25PbkNvbGxlY3Rpb24oYWN0aW9uTWdyLCBjb25maWcsIHZhbHVlLCBJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9TdWJ0cmFjdGVkQ2F0ZWdvcnkoKSwgY29uZmlnLmdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gQ29udGVudENhdGVnb3J5IHRvIHRoZSBNZXRob2RDb25maWd1cmF0aW9uJ3MgbGlzdCBvZiBzZWxlY3RlZCBzdWJ0cmFjdGVkLWNhdGVnb3JpZXMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyIHVzZSB0aGlzIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiwgaWYgbnVsbCB3aWxsIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiBkaXJlY3RseS4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBmYWxzZSBpZiBhY3Rpb25NYW5hZ2VyIG9yIGxpc3QgbWFuaXB1bGF0aW9uIGZhaWxzLCB0cnVlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRUb1N1YnRyYWN0ZWRDYXRlZ29yeUxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQ29udGVudENhdGVnb3J5IHZhbHVlKSB7Ci0JCXJldHVybiBhY3Rpb25Pbkl0ZW0oYWN0aW9uTWdyLCBjb25maWcsIHZhbHVlLCBJQWN0aW9uTWFuYWdlci5BREQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCksIGNvbmZpZy5nZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBmcm9tIHRoZSBNZXRob2RDb25maWd1cmF0aW9uJ3MgbGlzdCBvZiBzZWxlY3RlZCBzdWJ0cmFjdGVkLWNhdGVnb3JpZXMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyIHVzZSB0aGlzIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiwgaWYgbnVsbCB3aWxsIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiBkaXJlY3RseS4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBmYWxzZSBpZiBhY3Rpb25NYW5hZ2VyIG9yIGxpc3QgbWFuaXB1bGF0aW9uIGZhaWxzLCB0cnVlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVDb2xsRnJvbVN1YnRyYWN0ZWRDYXRlZ29yeUxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQ29sbGVjdGlvbiB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25Db2xsZWN0aW9uKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCksIGNvbmZpZy5nZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIENvbnRlbnRDYXRlZ29yeSBmcm9tIHRoZSBNZXRob2RDb25maWd1cmF0aW9uJ3MgbGlzdCBvZiBzZWxlY3RlZCBzdWJ0cmFjdGVkLWNhdGVnb3JpZXMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyIHVzZSB0aGlzIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiwgaWYgbnVsbCB3aWxsIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiBkaXJlY3RseS4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBmYWxzZSBpZiBhY3Rpb25NYW5hZ2VyIG9yIGxpc3QgbWFuaXB1bGF0aW9uIGZhaWxzLCB0cnVlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVGcm9tU3VidHJhY3RlZENhdGVnb3J5TGlzdChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBDb250ZW50Q2F0ZWdvcnkgdmFsdWUpIHsKLQkJcmV0dXJuIGFjdGlvbk9uSXRlbShhY3Rpb25NZ3IsIGNvbmZpZywgdmFsdWUsIElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9TdWJ0cmFjdGVkQ2F0ZWdvcnkoKSwgY29uZmlnLmdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29uc3RyYWludE1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25zdHJhaW50TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmM2MjAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25zdHJhaW50TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdGhhdCBtYW5hZ2VzIHRoZSB1c2Ugb2YgQ29udHJhaW50IGluIGxpYnJhcnkgdG8gc3RvcmUKLSAqIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGRhdGEKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBEZWMgMSwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29uc3RyYWludE1hbmFnZXIgewotCS8qKiBDb25zdGFudHMgZm9yIGNvbnRyYWluIG5hbWUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0lUSVZZX0RJQUdSQU0gPSAiZGlhZ3JhbSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NfU1VQUFJFU1NJT04gPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdHJhaW50IGdldENvbnN0cmFpbnQoTWV0aG9kRWxlbWVudCBlLAotCQkJU3RyaW5nIGNvbnN0cmFpbnROYW1lLCBib29sZWFuIGNyZWF0ZSkgewotCQlpZiAoY29uc3RyYWludE5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQ29uc3RyYWludCBjb25zdHJhaW50ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZS5nZXRPd25lZFJ1bGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb25zdHJhaW50IGMgPSAoQ29uc3RyYWludCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoYy5nZXROYW1lKCkuZXF1YWxzKGNvbnN0cmFpbnROYW1lKSkgewotCQkJCWNvbnN0cmFpbnQgPSBjOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChjb25zdHJhaW50ID09IG51bGwgJiYgY3JlYXRlKSB7Ci0JCQljb25zdHJhaW50ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpOwotCQkJY29uc3RyYWludC5zZXROYW1lKGNvbnN0cmFpbnROYW1lKTsKLQkJCWUuZ2V0T3duZWRSdWxlcygpLmFkZChjb25zdHJhaW50KTsKLQkJfQotCQlyZXR1cm4gY29uc3RyYWludDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29udGVudEVsZW1lbnRJbmhlcml0YW5jZUhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnRlbnRFbGVtZW50SW5oZXJpdGFuY2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc0ZDM5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29udGVudEVsZW1lbnRJbmhlcml0YW5jZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGRlZmluZXMgc3RhdGljIGhlbHBlciBtZXRob2RzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50Ci0gKiBpbmhlcml0YW5jZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbnRlbnRFbGVtZW50SW5oZXJpdGFuY2VIZWxwZXIgewotCQotCXByaXZhdGUgc3RhdGljIExpc3QgZGVzY2VuZGluZ1NvcnRCeUNyZWF0aW9uVGltZShMaXN0IHRhc2tzKSB7Ci0JCXJldHVybiB0YXNrczsKLQl9Ci0KLQkvLyBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFN0ZXBzKExpc3Qgc3RlcHMsIFRhc2sgYmFzZSkgewotCS8vIE9iamVjdCBmaXJzdCA9IG51bGw7Ci0JLy8gaWYoIXN0ZXBzLmlzRW1wdHkoKSkgewotCS8vIGZpcnN0ID0gc3RlcHMuZ2V0KDApOwotCS8vIH0KLQkvLyBMaXN0IHRhc2tzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKGJhc2UpOwotCS8vIGludCBzaXplID0gdGFza3Muc2l6ZSgpOwotCS8vIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkvLyBUYXNrIHRhc2sgPSAoVGFzaykgdGFza3MuZ2V0KGkpOwotCS8vIExpc3Qgc2VjdGlvbnMgPSB0YXNrLmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCk7Ci0JLy8gaW50IG51bU9mU2VjdGlvbnMgPSBzZWN0aW9ucy5zaXplKCk7Ci0JLy8gU2VjdGlvbiBwcmV2ID0gbnVsbDsKLQkvLyBmb3IgKGludCBqID0gMDsgaiA8IG51bU9mU2VjdGlvbnM7IGorKykgewotCS8vIFNlY3Rpb24gc2VjdGlvbiA9IChTZWN0aW9uKSBzZWN0aW9ucy5nZXQoaik7Ci0JLy8gU2VjdGlvbiBwcmVkID0gc2VjdGlvbi5nZXRQcmVkZWNlc3NvcigpOwotCS8vIGlmKHByZWQgPT0gbnVsbCkgewotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQotCS8qKgotCSAqIEdldHMgYWxsIHN0ZXBzIGluIHRoZSB0YXNrIHRyZWUgdGhhdCB0aGUgZ2l2ZW4gdGFzayBiZWxvbmdzIHRvCi0JICogCi0JICogQHBhcmFtIHRhc2sKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbFRhc2tTdGVwcyhUYXNrIHRhc2spIHsKLQkJVGFzayBiYXNlID0gKFRhc2spIFRuZ1V0aWwuZ2V0QmFzZSh0YXNrKTsKLQkJTGlzdCBzdGVwcyA9IG5ldyBBcnJheUxpc3QoYmFzZS5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpKTsKLQkJSXRlcmF0b3IgdGFza3MgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoYmFzZSwgZmFsc2UpIHsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKAotCQkJCQkJKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0KS5pdGVyYXRvcigpOwotCQkJfQotCi0JCX07Ci0JCVRhc2sgY3VycmVudEJhc2UgPSBiYXNlOwotCQl3aGlsZSAodGFza3MuaGFzTmV4dCgpKSB7Ci0JCQlUYXNrIHQgPSAoVGFzaykgdGFza3MubmV4dCgpOwotCQkJaWYgKGN1cnJlbnRCYXNlICE9IHQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSB7Ci0JCQkJLy8gbmV3IGluaGVyaXRhbmNlIGxldmVsCi0JCQkJLy8KLQkJCQljdXJyZW50QmFzZSA9IChUYXNrKSB0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlTZWN0aW9uIHMgPSAoU2VjdGlvbikgaXRlci5uZXh0KCk7Ci0JCQkJU2VjdGlvbiBwcmVkID0gcy5nZXRQcmVkZWNlc3NvcigpOwotCQkJCWlmIChwcmVkICE9IG51bGwpIHsKLQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RlcHM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29udGVudEVsZW1lbnRMaXN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29udGVudEVsZW1lbnRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZjQwOGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnRlbnRFbGVtZW50TGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGVudEVsZW1lbnRMaXN0IHsKLQotCXByaXZhdGUgQ29udGVudFBhY2thZ2UgY29udGVudFBrZzsKLQotCXByb3RlY3RlZCBjbGFzcyBFbGVtZW50SXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVyYXRvciB7Ci0KLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjI5MTQzODk3MDEyMzk4NTkwNkw7Ci0KLQkJcHJvdGVjdGVkIEVsZW1lbnRJdGVyYXRvcigpIHsKLQkJCXN1cGVyKGNvbnRlbnRQa2csIGZhbHNlKTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW5MaXN0KE9iamVjdCBvYmplY3QpIHsKLQkJCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJQ29udGVudFBhY2thZ2UgcGtnID0gKENvbnRlbnRQYWNrYWdlKSBvYmplY3Q7Ci0JCQkJY2hpbGRyZW4uYWRkQWxsKHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkpOwotCQkJCUxpc3QgZWxlbWVudHMgPSBwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCQlPYmplY3Qgb2JqID0gZWxlbWVudHMuZ2V0KGkpOwotCQkJCQlpZiAoYWNjZXB0KG9iaikpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChvYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNoaWxkcmVuOwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBnZXRDaGlsZHJlbkxpc3Qob2JqZWN0KS5pdGVyYXRvcigpOwotCQl9Ci0JCQotCX07Ci0JCi0JcHVibGljIENvbnRlbnRFbGVtZW50TGlzdChDb250ZW50UGFja2FnZSBjb250ZW50UGtnKSB7Ci0JCXRoaXMuY29udGVudFBrZyA9IGNvbnRlbnRQa2c7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopOwotCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGVsZW1lbnRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbGVtZW50SXRlcmF0b3IoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGdldEFsbEVsZW1lbnRzKENvbnRlbnRQYWNrYWdlIHBrZywgTGlzdCBsaXN0KSB7Ci0vLwkJTGlzdCBlbGVtZW50cyA9IHBrZy5nZXRDb250ZW50RWxlbWVudHMoKTsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0vLwkJCU9iamVjdCBvYmogPSBlbGVtZW50cy5nZXQoaSk7Ci0vLwkJCWlmIChhY2NlcHQob2JqKSkgewotLy8JCQkJbGlzdC5hZGQob2JqKTsKLS8vCQkJfQotLy8JCX0KLS8vCQlMaXN0IHBhY2thZ2VzID0gcGtnLmdldENoaWxkUGFja2FnZXMoKTsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VzLnNpemUoKTsgaSsrKSB7Ci0vLwkJCU9iamVjdCBvYmogPSBwYWNrYWdlcy5nZXQoaSk7Ci0vLwkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotLy8JCQkJZ2V0QWxsRWxlbWVudHMoKENvbnRlbnRQYWNrYWdlKSBvYmosIGxpc3QpOwotLy8JCQl9Ci0vLwkJfQotCQkKLQkJZm9yKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50SXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYoIShlIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKSB7Ci0JCQkJbGlzdC5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRMaXN0KCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldEFsbEVsZW1lbnRzKGNvbnRlbnRQa2csIGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db250ZW50RWxlbWVudE9yZGVyTGlzdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnRlbnRFbGVtZW50T3JkZXJMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWQwYTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnRlbnRFbGVtZW50T3JkZXJMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLnV0aWwuU3RyaW5nUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIGVuY2Fwc3VsYXRlcyBhbGwgdGhlIGxvZ2ljcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBsaXN0IG9mIGFsbAotICogY29udHJpYnV0ZWQvaW5oZXJpdGVkIHNlY3Rpb25zIG9mIHRoZSBnaXZlbiBlbGVtZW50IGFzIHdlbGwgYXMgYWxsb3dzCi0gKiBtYW5pcHVsYXRlIHRoaXMgbGlzdC4KLSAqIAotICogQGF1dGhvciBMb2thbmF0aCBKYWdnYQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGV4dGVuZHMgQmFzaWNFTGlzdCB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU3NTcyNzk3NDg3MDY5MjMzTDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SREVSX0lORk9fTkFNRSA9ICJjb250ZW50IGVsZW1lbnRzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIERFRkFVTFRfU0FWRV9PUFRJT05TID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfRUxFTUVOVFNfX0ZPUl9FTEVNRU5UX09OTFkgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9FTEVNRU5UU19fRk9SX0VMRU1FTlRfQU5EX1BBUkVOVFMgPSAyOwotCi0Jc3RhdGljIHsKLQkJREVGQVVMVF9TQVZFX09QVElPTlMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgIkFTQ0lJIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIENvbnRlbnRFbGVtZW50IGVkaXRFbGVtZW50OwotCi0JcHJpdmF0ZSBib29sZWFuIG1peGVkID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NvbnRyaWJ1dG9yKFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JCXJldHVybiBUbmdVdGlsLmlzQ29udHJpYnV0b3IoZSk7Ci0JfQotCi0JcHVibGljIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KENvbnRlbnRFbGVtZW50IGUsIGludCBzY29wZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJZWRpdEVsZW1lbnQgPSBlOwotCQlpZiAoc2NvcGUgPT0gQ09OVEVOVF9FTEVNRU5UU19fRk9SX0VMRU1FTlRfT05MWSkgewotCQkJbWl4ZWQgPSBmYWxzZTsKLQkJfSBlbHNlIGlmIChzY29wZSA9PSBDT05URU5UX0VMRU1FTlRTX19GT1JfRUxFTUVOVF9BTkRfUEFSRU5UUykgewotCQkJY2FsY3VsYXRlUGFyZW50c09ubHkoZSk7Ci0JCX0gZWxzZSB7Ci0JCQltaXhlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVBhcmVudHNPbmx5KENvbnRlbnRFbGVtZW50IGUpIHsKLQkJSXRlcmF0b3IgaXRlciA9IG51bGw7Ci0JCWlmIChpc0NvbnRyaWJ1dG9yKGUpIHx8IGlzRXh0ZW5kZWQoZSkpIHsKLQkJCUxpc3Qgc3VwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJVW1hVXRpbC5nZXRBbGxTdXBlcnNCb3RoKHN1cGVycywgZSwKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTLAotCQkJCQlWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyk7Ci0JCQlzdXBlcnMuYWRkKGUpOwotCQkJaXRlciA9IHN1cGVycy5pdGVyYXRvcigpOwotCQl9IGVsc2UgewotCQkJbWl4ZWQgPSBmYWxzZTsKLQkJfQotCi0JCWlmIChtaXhlZCkgewotCQkJLy8gY3JlYXRlIGEgbWFwIG9mIEdVSUQgLyBjb250cmlidXRvciAKLQkJCQotCQkJT3JkZXJJbmZvIGxhdGVzdEluZm8gPSBudWxsOwotCQkJTWFwIGd1aWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJU2V0IGVsZW1lbnRzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCUNvbnRlbnRFbGVtZW50IGVsZW1lbnQgPSAoQ29udGVudEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQkJTGlzdCBjb250ZW50RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCU9iamVjdCBlR2V0ID0gKChDb250ZW50RWxlbWVudCkgZWxlbWVudCkuZUdldChmZWF0dXJlKTsKLQkJCQkJaWYgKGVHZXQgaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJCQljb250ZW50RWxlbWVudHMuYWRkQWxsKChMaXN0KSBlR2V0KTsKLQkJCQkJfQotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29udGVudEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCURlc2NyaWJhYmxlRWxlbWVudCBjYXRlZ29yaXplZEVsZW1lbnQgPSAoRGVzY3JpYmFibGVFbGVtZW50KSBpdGVyYXRvcgotCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJZ3VpZE1hcC5wdXQoY2F0ZWdvcml6ZWRFbGVtZW50LmdldEd1aWQoKSwKLQkJCQkJCQkJY2F0ZWdvcml6ZWRFbGVtZW50KTsKLQkJCQkJCWVsZW1lbnRzLmFkZChjYXRlZ29yaXplZEVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJT3JkZXJJbmZvIG9yZGVySW5mbyA9IFRuZ1V0aWwuZ2V0T3JkZXJJbmZvKGVsZW1lbnQsCi0JCQkJCQlPUkRFUl9JTkZPX05BTUUpOwotCQkJCWlmIChvcmRlckluZm8gIT0gbnVsbCkgewotCQkJCQlpZiAobGF0ZXN0SW5mbyA9PSBudWxsCi0JCQkJCQkJfHwgb3JkZXJJbmZvLmdldFRpbWVzdGFtcCgpID4gbGF0ZXN0SW5mbwotCQkJCQkJCQkJLmdldFRpbWVzdGFtcCgpKSB7Ci0JCQkJCQlsYXRlc3RJbmZvID0gb3JkZXJJbmZvOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAobGF0ZXN0SW5mbyAhPSBudWxsKSB7Ci0JCQkJLy8gcmVvcmRlciB0aGUgc2VjdGlvbnMgYmFzZWQgb24gdGhlIGxhdGVzdCBvcmRlciBpbmZvCi0JCQkJaW50IHNpemUgPSBsYXRlc3RJbmZvLmdldEdVSURzKCkuc2l6ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCU9iamVjdCBndWlkID0gbGF0ZXN0SW5mby5nZXRHVUlEcygpLmdldChpKTsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBndWlkTWFwLmdldChndWlkKTsKLQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJc3VwZXIuYWRkKGVsZW1lbnQpOwotCQkJCQkJZWxlbWVudHMucmVtb3ZlKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc3VwZXIuYWRkQWxsKGVsZW1lbnRzKTsKLQkJfQotCX0KLQotCS8vIGRlcHJlY2F0ZSB0aGUgZm9sbG93aW5nIGNvbnN0cnVjdG9yCi0JcHVibGljIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KENvbnRlbnRFbGVtZW50IGUpIHsKLQkJZWRpdEVsZW1lbnQgPSBlOwotCQlJdGVyYXRvciBpdGVyID0gbnVsbDsKLQkJaWYgKGlzQ29udHJpYnV0b3IoZSkgfHwgVG5nVXRpbC5oYXNDb250cmlidXRvcihlKSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBUbmdVdGlsLmdldEJhc2UoZSk7Ci0JCQlpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGJhc2UpIHsKLQotCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0KQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0ZXJhdG9yCi0JCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQlpZiAoZWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpIHsKLQkJCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQkJfQotCi0JCQl9OwotCQl9IGVsc2UgaWYgKGlzRXh0ZW5kZWQoZSkpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIiQkJCBmb3IgIiArIGUuZ2V0TmFtZSgpICsgIiA9IGV4dGVuZGVkIGlzIHRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlMaXN0IHN1cGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCVVtYVV0aWwuZ2V0QWxsU3VwZXJzKHN1cGVycywgZSwgVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpOwotCQkJc3VwZXJzLmFkZChlKTsKLQkJCWl0ZXIgPSBzdXBlcnMuaXRlcmF0b3IoKTsKLQkJfSBlbHNlIHsKLQkJCW1peGVkID0gZmFsc2U7Ci0JCX0KLQotCQlpZiAobWl4ZWQpIHsKLQkJCS8vIGNyZWF0ZSBhIG1hcCBvZiBHVUlEIC8gY29udHJpYnV0b3IKLQkJCU9yZGVySW5mbyBsYXRlc3RJbmZvID0gbnVsbDsKLQkJCU1hcCBndWlkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCUxpc3QgZWxlbWVudHMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJQ29udGVudEVsZW1lbnQgZWxlbWVudCA9IChDb250ZW50RWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJZ3VpZE1hcC5wdXQoZWxlbWVudC5nZXRHdWlkKCksIGVsZW1lbnQpOwotCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQotCQkJCU9yZGVySW5mbyBvcmRlckluZm8gPSBUbmdVdGlsLmdldE9yZGVySW5mbyhlbGVtZW50LAotCQkJCQkJT1JERVJfSU5GT19OQU1FKTsKLQkJCQlpZiAob3JkZXJJbmZvICE9IG51bGwpIHsKLQkJCQkJaWYgKGxhdGVzdEluZm8gPT0gbnVsbAotCQkJCQkJCXx8IG9yZGVySW5mby5nZXRUaW1lc3RhbXAoKSA+IGxhdGVzdEluZm8KLQkJCQkJCQkJCS5nZXRUaW1lc3RhbXAoKSkgewotCQkJCQkJbGF0ZXN0SW5mbyA9IG9yZGVySW5mbzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGxhdGVzdEluZm8gIT0gbnVsbCkgewotCQkJCS8vIHJlb3JkZXIgdGhlIHNlY3Rpb25zIGJhc2VkIG9uIHRoZSBsYXRlc3Qgb3JkZXIgaW5mbwotCQkJCS8vCi0JCQkJaW50IHNpemUgPSBsYXRlc3RJbmZvLmdldEdVSURzKCkuc2l6ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCU9iamVjdCBndWlkID0gbGF0ZXN0SW5mby5nZXRHVUlEcygpLmdldChpKTsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBndWlkTWFwLmdldChndWlkKTsKLQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJc3VwZXIuYWRkKGVsZW1lbnQpOwotCQkJCQkJZWxlbWVudHMucmVtb3ZlKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc3VwZXIuYWRkQWxsKGVsZW1lbnRzKTsKLQkJfQotCQkvLyBlbHNlIHsKLQkJLy8gLy8gYWRkQWxsKGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkpOwotCQkvLyBtaXhlZCA9IGZhbHNlOwotCQkvLyB9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0V4dGVuZGVkKENvbnRlbnRFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiBlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTOwotCX0KLQotCS8qKgotCSAqIEFwcGxpZXMgcmVjZW50IGNoYW5nZXMgaW4gdGhlIGxpc3QKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseSgpIHsKLQkJaWYgKCFtaXhlZCB8fCAhY2hhbmdlZCkKLQkJCXJldHVybjsKLQotCQkvLyBzYXZlIHRoZSBvcmRlciBpbmZvIHRvIHRoZSBvcmRlcmluZ0d1aWRlIG9mIHRoZSBlZGl0RWxlbWVudAotCQkvLwotCQlTdHJpbmcgc3RyID0gZWRpdEVsZW1lbnQuZ2V0T3JkZXJpbmdHdWlkZSgpOwotCQlPcmRlckluZm9Db2xsZWN0aW9uIG9yZGVySW5mb3MgPSBudWxsOwotCQlTdHJpbmdSZXNvdXJjZSByZXMgPSBudWxsOwotCQlpZiAoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApIHsKLQkJCW9yZGVySW5mb3MgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU9yZGVySW5mb0NvbGxlY3Rpb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJlcyA9IG5ldyBTdHJpbmdSZXNvdXJjZShzdHIpOwotCQkJdHJ5IHsKLQkJCQlyZXMubG9hZChudWxsKTsKLQkJCQlpZiAocmVzLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCW9yZGVySW5mb3MgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZU9yZGVySW5mb0NvbGxlY3Rpb24oKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvcmRlckluZm9zID0gKE9yZGVySW5mb0NvbGxlY3Rpb24pIHJlcy5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCS8vIGZpbmQgdGhlIG9yZGVyIGluZm9yIGZvciBzZWN0aW9ucwotCQkvLwotCQlPcmRlckluZm8gc2VjdE9yZGVySW5mbyA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9yZGVySW5mb3MuZ2V0T3JkZXJJbmZvcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT3JkZXJJbmZvIG9yZGVySW5mbyA9IChPcmRlckluZm8pIGl0ZXIubmV4dCgpOwotCQkJaWYgKE9SREVSX0lORk9fTkFNRS5lcXVhbHNJZ25vcmVDYXNlKG9yZGVySW5mby5nZXROYW1lKCkpKSB7Ci0JCQkJc2VjdE9yZGVySW5mbyA9IG9yZGVySW5mbzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChzZWN0T3JkZXJJbmZvID09IG51bGwpIHsKLQkJCXNlY3RPcmRlckluZm8gPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU9yZGVySW5mbygpOwotCQkJc2VjdE9yZGVySW5mby5zZXROYW1lKE9SREVSX0lORk9fTkFNRSk7Ci0JCQlvcmRlckluZm9zLmdldE9yZGVySW5mb3MoKS5hZGQoc2VjdE9yZGVySW5mbyk7Ci0JCX0gZWxzZSB7Ci0JCQlzZWN0T3JkZXJJbmZvLmdldEdVSURzKCkuY2xlYXIoKTsKLQkJfQotCi0JCWludCBzaXplID0gc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJRGVzY3JpYmFibGVFbGVtZW50IHNlY3QgPSAoRGVzY3JpYmFibGVFbGVtZW50KSBnZXQoaSk7Ci0JCQlzZWN0T3JkZXJJbmZvLmdldEdVSURzKCkuYWRkKHNlY3QuZ2V0R3VpZCgpKTsKLQkJfQotCQlzZWN0T3JkZXJJbmZvLnNldFRpbWVzdGFtcChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCWlmIChyZXMgPT0gbnVsbCkgewotCQkJcmVzID0gbmV3IFN0cmluZ1Jlc291cmNlKG51bGwpOwotCQkJcmVzLmdldENvbnRlbnRzKCkuYWRkKG9yZGVySW5mb3MpOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXMuc2F2ZShERUZBVUxUX1NBVkVfT1BUSU9OUyk7Ci0JCQlzdHIgPSByZXMuZ2V0U3RyaW5nKCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNlY3Rpb25MaXN0LmFwcGx5KCk6IG5ldyBvcmRlcmluZyBndWlkZSIpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0gb3JkZXJpbmdHdWlkZSBzdGFydCAtLS0tLS0iKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihzdHIpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0gb3JkZXJpbmdHdWlkZSBlbmQgLS0tLS0tIik7Ci0JCQllZGl0RWxlbWVudC5zZXRPcmRlcmluZ0d1aWRlKHN0cik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblJlbW92ZShDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCkgewotCQlpZiAoZUdldCgpLmNvbnRhaW5zKGNvbnRlbnRFbGVtZW50KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgcmVtb3ZlKGludCBpbmRleCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCWlmICghY2FuUmVtb3ZlKChDb250ZW50RWxlbWVudCkgZ2V0KGluZGV4KSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlPYmplY3QgcmVtb3ZlZCA9IHN1cGVyLnJlbW92ZShpbmRleCk7Ci0JCQllR2V0KCkucmVtb3ZlKHJlbW92ZWQpOwotCQkJcmV0dXJuIHJlbW92ZWQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZUdldCgpLnJlbW92ZShpbmRleCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQkJaWYgKCFjYW5SZW1vdmUoKENvbnRlbnRFbGVtZW50KSBvKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG1peGVkKSB7Ci0JCQlpZiAoc3VwZXIucmVtb3ZlKG8pKSB7Ci0JCQkJZUdldCgpLnJlbW92ZShvKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZUdldCgpLnJlbW92ZShvKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbiBjKSB7Ci0JCWlmIChtaXhlZCkgewotCQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQkJSXRlcmF0b3IgZSA9IGl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgbyA9IGUubmV4dCgpOwotCQkJCWlmIChjLmNvbnRhaW5zKG8pICYmIGNhblJlbW92ZSgoQ29udGVudEVsZW1lbnQpIG8pKSB7Ci0JCQkJCWUucmVtb3ZlKCk7Ci0JCQkJCWVHZXQoKS5yZW1vdmUobyk7Ci0JCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZUdldCgpLnJlbW92ZUFsbChjKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJc3VwZXIuYWRkKGluZGV4LCBlbGVtZW50KTsKLQkJCWVHZXQoKS5hZGQoZWxlbWVudCk7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCWVHZXQoKS5hZGQoaW5kZXgsIGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvKSB7Ci0JCWJvb2xlYW4gYiA9IGVHZXQoKS5hZGQobyk7Ci0JCWlmIChtaXhlZCkgewotCQkJYiA9IHN1cGVyLmFkZChvKTsKLQkJCWlmIChiKQotCQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBiOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGMpIHsKLQkJYm9vbGVhbiBiID0gZUdldCgpLmFkZEFsbChjKTsKLQkJOwotCQlpZiAobWl4ZWQpIHsKLQkJCWIgPSBzdXBlci5hZGRBbGwoYyk7Ci0JCQlpZiAoYikKLQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gYjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uIGMpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQllR2V0KCkuYWRkQWxsKGMpOwotCQkJOwotCQkJYm9vbGVhbiBiID0gc3VwZXIuYWRkQWxsKGluZGV4LCBjKTsKLQkJCWlmIChiKQotCQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBlR2V0KCkuYWRkQWxsKGMpOwotCX0KLQotCXB1YmxpYyBPYmplY3Qgc2V0KGludCBpbmRleCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKG1peGVkKQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCXJldHVybiBlR2V0KCkuc2V0KGluZGV4LCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaWYgKG1peGVkKQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCWVHZXQoKS5jbGVhcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmUoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJc3VwZXIubW92ZShpbmRleCwgb2JqZWN0KTsKLQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJKChFTGlzdCkgZUdldCgpKS5tb3ZlKGluZGV4LCBvYmplY3QpOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBtb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJT2JqZWN0IG1vdmVkID0gc3VwZXIubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQlyZXR1cm4gbW92ZWQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZUdldCgpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0KGludCBpbmRleCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXJldHVybiBzdXBlci5nZXQoaW5kZXgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVHZXQoKS5nZXQoaW5kZXgpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXJldHVybiBzdXBlci5zaXplKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZUdldCgpLnNpemUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuaXRlcmF0b3IoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBlR2V0KCkuaXRlcmF0b3IoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuY29udGFpbnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gZUdldCgpLmNvbnRhaW5zKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWlmIChtaXhlZCkKLQkJCXJldHVybiBzdXBlci5jb250YWluc0FsbChjb2xsZWN0aW9uKTsKLQkJcmV0dXJuIGVHZXQoKS5jb250YWluc0FsbChjb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIudG9BcnJheSgpOwotCQl9Ci0JCXJldHVybiBlR2V0KCkudG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KE9iamVjdFtdIGFycmF5KSB7Ci0JCWlmIChtaXhlZCkKLQkJCXJldHVybiBzdXBlci50b0FycmF5KGFycmF5KTsKLQkJcmV0dXJuIGVHZXQoKS50b0FycmF5KGFycmF5KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobWl4ZWQpCi0JCQlyZXR1cm4gc3VwZXIuaW5kZXhPZihvYmplY3QpOwotCQlyZXR1cm4gZUdldCgpLmluZGV4T2Yob2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG1peGVkKQotCQkJcmV0dXJuIHN1cGVyLmxhc3RJbmRleE9mKG9iamVjdCk7Ci0JCXJldHVybiBlR2V0KCkubGFzdEluZGV4T2Yob2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01peGVkKCkgewotCQlyZXR1cm4gbWl4ZWQ7Ci0JfQotCi0JcHJpdmF0ZSBFTGlzdCBlR2V0KCkgewotCQlFTGlzdCBsaXN0ID0gbnVsbDsKLQkJT2JqZWN0IG9iamVjdCA9ICgoQ29udGVudENhdGVnb3J5KSBlZGl0RWxlbWVudCkuZUdldChmZWF0dXJlKTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KSB7Ci0JCQlsaXN0ID0gKEVMaXN0KSBvYmplY3Q7Ci0JCX0KLQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJbGlzdCA9IG5ldyBCYXNpY0VMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0RlYnVnVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0RlYnVnVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTZiNWQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9EZWJ1Z1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGRlYnVnIHB1cnBvc2UKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZWJ1Z1V0aWwgewotCi0JcHJpdmF0ZSBzdGF0aWMgUHJpbnRTdHJlYW0gb3V0cHV0OwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBwcm9tcHQgPSAiTEQ+ICI7IAkJCQkJLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRPdXRwdXQoUHJpbnRTdHJlYW0gb3ApIHsKLQkJb3V0cHV0ID0gb3A7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9tcHQoU3RyaW5nIHB0KSB7Ci0JCXByb21wdCA9IHB0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBQcmludFN0cmVhbSBvdXQoKSB7Ci0JCWlmIChvdXRwdXQgIT0gbnVsbCkgewotCQkJcmV0dXJuIG91dHB1dDsKLQkJfQotCQlyZXR1cm4gU3lzdGVtLm91dDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50KFN0cmluZyBiZWdpblRpdGxlLCBTdHJpbmcgZW5kVGl0bGUsIENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRzLCBpbnQgaXgpIHsKLQkJaWYgKGJlZ2luVGl0bGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHN0ciA9ICIiOwkJCQkvLyROT04tTkxTLTEkCi0JCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkgewotCQkJCXN0ciA9ICJudWxsIjsJCQkJLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCQlzdHIgPSBlbGVtZW50cy50b1N0cmluZygpOwotCQkJfQotCQkJb3V0KCkucHJpbnRsbihwcm9tcHQgKyBiZWdpblRpdGxlICsgc3RyKTsKLQkJfQotCQkKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPD8gZXh0ZW5kcyBNZXRob2RFbGVtZW50PiBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IGl0Lm5leHQoKTsKLQkJCW91dCgpLnByaW50bG4ocHJvbXB0ICsgdG9TdHJpbmcoZWxlbWVudCwgaXgpKTsKLQkJfQotCQkKLQkJaWYgKGVuZFRpdGxlICE9IG51bGwpIHsKLQkJCW91dCgpLnByaW50bG4ocHJvbXB0ICsgZW5kVGl0bGUpOwotCQl9Ci0JCW91dCgpLnByaW50bG4oIiIpOwkJCS8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBpbnQgaXgpIHsKLQkJaWYgKGl4ID09IDEpIHsKLQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbWVudCk7Ci0JCX0gCi0JCWlmIChpeCA9PSAyKSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5lQ2xhc3MoKS5nZXROYW1lKCkgKyAiLCAiICsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJZWxlbWVudC5nZXRHdWlkKCkgKyAiLCAiICsgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGVsZW1lbnQpOy8vJE5PTi1OTFMtMSQgCi0JCX0KLQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQl9CQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9EZXB0aExldmVsQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9EZXB0aExldmVsQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk2NTE5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRGVwdGhMZXZlbEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGVwdGhMZXZlbEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yPEU+IGV4dGVuZHMKLQkJQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I8RT4gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjUyNzE3ODI3NzYyMDAwODIyTDsKLQotCXByaXZhdGUgaW50IGRlcHRoTGV2ZWw7Ci0KLQlwdWJsaWMgRGVwdGhMZXZlbEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJT2JqZWN0IG9iamVjdCwgYm9vbGVhbiBpbmNsdWRlUm9vdCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgb2JqZWN0LCBpbmNsdWRlUm9vdCk7Ci0JfQotCi0JcHVibGljIERlcHRoTGV2ZWxBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUUgb2JqZWN0KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWRlcHRoTGV2ZWwgPSBzaXplKCk7Ci0JCXJldHVybiBzdXBlci5uZXh0KCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0RGVwdGhMZXZlbCgpIHsKLQkJcmV0dXJuIGRlcHRoTGV2ZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0RpYWdyYW1PcHRpb25zLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRGlhZ3JhbU9wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYwZjE1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRGlhZ3JhbU9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1PcHRpb25zIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9QVUJMSVNIX0FEID0gInB1Ymxpc2hfYWQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUFVCTElTSF9BREQgPSAicHVibGlzaF9hZGQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUFVCTElTSF9XUEREID0gInB1Ymxpc2hfd3BkZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2V0UHVibGlzaEFEKEFjdGl2aXR5IGFjdGl2aXR5LCBib29sZWFuIGIpewotCQlNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuc2V0UHJvcGVydHkoYWN0aXZpdHksIFBST1BfUFVCTElTSF9BRCwgYik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1B1Ymxpc2hBRChBY3Rpdml0eSBhY3Rpdml0eSl7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5KGFjdGl2aXR5LCBQUk9QX1BVQkxJU0hfQUQpOwotCQlyZXR1cm4gcHJvcCAhPSBudWxsID8gQm9vbGVhbi5wYXJzZUJvb2xlYW4ocHJvcC5nZXRWYWx1ZSgpKSA6IHRydWU7IAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2V0UHVibGlzaEFERChBY3Rpdml0eSBhY3Rpdml0eSwgYm9vbGVhbiBiKXsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLnNldFByb3BlcnR5KGFjdGl2aXR5LCBQUk9QX1BVQkxJU0hfQURELCBiKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzUHVibGlzaEFERChBY3Rpdml0eSBhY3Rpdml0eSl7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5KGFjdGl2aXR5LCBQUk9QX1BVQkxJU0hfQUREKTsKLQkJcmV0dXJuIHByb3AgIT0gbnVsbCA/IEJvb2xlYW4ucGFyc2VCb29sZWFuKHByb3AuZ2V0VmFsdWUoKSkgOiB0cnVlOyAKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNldFB1Ymxpc2hXUEREKEFjdGl2aXR5IGFjdGl2aXR5LCBib29sZWFuIGIpewotCQlNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuc2V0UHJvcGVydHkoYWN0aXZpdHksIFBST1BfUFVCTElTSF9XUERELCBiKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzUHVibGlzaFdQREQoQWN0aXZpdHkgYWN0aXZpdHkpewotCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eShhY3Rpdml0eSwgUFJPUF9QVUJMSVNIX1dQREQpOwotCQlyZXR1cm4gcHJvcCAhPSBudWxsID8gQm9vbGVhbi5wYXJzZUJvb2xlYW4ocHJvcC5nZXRWYWx1ZSgpKSA6IHRydWU7IAotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9FZGl0aW5nRG9tYWluQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0VkaXRpbmdEb21haW5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMmE5ZTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0VkaXRpbmdEb21haW5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotCi0vKioKLSAqIEEgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSB0aGF0IGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5Qcm92aWRlcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWRpdGluZ0RvbWFpbkNvbXBvc2VkQWRhcHRlckZhY3RvcnkgZXh0ZW5kcwotCQlDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5Qcm92aWRlciB7Ci0KLQlwcml2YXRlIEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKLQotCXB1YmxpYyBFZGl0aW5nRG9tYWluQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXMpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3Rvcmllcyk7Ci0JfQotCi0JcHVibGljIEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLQkJcmV0dXJuIGVkaXRpbmdEb21haW47Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWRpdGluZ0RvbWFpbihFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4pIHsKLQkJdGhpcy5lZGl0aW5nRG9tYWluID0gZWRpdGluZ0RvbWFpbjsKLQkJaWYgKGVkaXRpbmdEb21haW4gaW5zdGFuY2VvZiBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCSgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBlZGl0aW5nRG9tYWluKQotCQkJCQkuc2V0QWRhcHRlckZhY3RvcnkodGhpcyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9FeHBvc2VkQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9FeHBvc2VkQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU2MzhmMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRXhwb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVJlZmVyZW5jZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklDb2x1bW5Bd2FyZTsKLQotCi0vKioKLSAqIEFuIEVkaXRpbmdEb21haW5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5IHRoYXQgZXhwb3NlcyBpbnRlcm5hbCBkYXRhCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvc2VkQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBFZGl0aW5nRG9tYWluQ29tcG9zZWRBZGFwdGVyRmFjdG9yeQotCQlpbXBsZW1lbnRzIElDb2x1bW5Bd2FyZSwgSVJlZmVyZW5jZXIgewotCi0JcHJpdmF0ZSBNYXAgY29sdW1uSW5kZXhUb05hbWVNYXA7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcmllcwotCSAqLwotCXB1YmxpYyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3JpZXMpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIGNoYW5nZU5vdGlmaWVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQ29sdW1uQXdhcmUjc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChNYXAgbWFwKSB7Ci0JCWNvbHVtbkluZGV4VG9OYW1lTWFwID0gbWFwOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkYXB0ZXJGYWN0b3JpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgYWRhcHRlckZhY3RvcnkgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElDb2x1bW5Bd2FyZSkgewotCQkJCSgoSUNvbHVtbkF3YXJlKSBhZGFwdGVyRmFjdG9yeSkuc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAobWFwKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQ29sdW1uQXdhcmUjZ2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoKQotCSAqLwotCXB1YmxpYyBNYXAgZ2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoKSB7Ci0JCXJldHVybiBjb2x1bW5JbmRleFRvTmFtZU1hcDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklSZWZlcmVuY2VyI2NsZWFuVXAoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFuVXAoKSB7Ci0JCWludCBzaXplID0gYWRhcHRlckZhY3Rvcmllcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3QgYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yaWVzLmdldChpKTsKLQkJCWlmKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSVJlZmVyZW5jZXIpIHsKLQkJCQkoKElSZWZlcmVuY2VyKWFkYXB0ZXJGYWN0b3J5KS5jbGVhblVwKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklSZWZlcmVuY2VyI3JlbW92ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgcmVmKSB7Ci0JCWJvb2xlYW4gcmVtb3ZlZCA9IGZhbHNlOwotCQlpbnQgc2l6ZSA9IGFkYXB0ZXJGYWN0b3JpZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJT2JqZWN0IGFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcmllcy5nZXQoaSk7Ci0JCQlpZihhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElSZWZlcmVuY2VyKSB7Ci0JCQkJKChJUmVmZXJlbmNlcilhZGFwdGVyRmFjdG9yeSkucmVtb3ZlKHJlZik7Ci0JCQkJcmVtb3ZlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlbW92ZWQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRXh0ZW5zaW9uTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0V4dGVuc2lvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFjMGYwYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRXh0ZW5zaW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSU5lc3RlZENvbW1hbmRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3Mgd2l0aCBtZXRob2RzIHRvIHJldHJpZXZlIGV4dGVuc2lvbnMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdW4gMjcsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFeHRlbnNpb25NYW5hZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBNYXAgSURUb0V4dGVuc2lvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxJTmVzdGVkQ29tbWFuZFByb3ZpZGVyPiBuZXN0ZWRDb21tYW5kUHJvdmlkZXJzOwotCXByaXZhdGUgc3RhdGljIExpc3Qgb3Bwb3NpdGVGZWF0dXJlTG9hZGVyczsKLQkKLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RXh0ZW5zaW9ucyhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnROYW1lLCBDbGFzcyB0eXBlKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChuYW1lc3BhY2UsIGV4dGVuc2lvblBvaW50TmFtZSk7Ci0JCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCQl0cnkgewotCQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJCU9iamVjdCBleHQgPSBidW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLQkJCQkJCQkJaWYodHlwZS5pc0luc3RhbmNlKGV4dCkpIHsKLQkJCQkJCQkJCWxpc3QuYWRkKGV4dCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCWlmKGxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlRXh0ZW5zaW9uKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBleHRlbnNpb25Qb2ludE5hbWUpIHsKLQkJLy8gUHJvY2VzcyB0aGUgY29udHJpYnV0b3JzLgotCQkvLwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChuYW1lc3BhY2UsIGV4dGVuc2lvblBvaW50TmFtZSk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCU9iamVjdCBleHQgPSBudWxsOwotCQkJZXh0X3dhbGs6Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQkJCQlleHQgPSBidW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLQkJCQkJCQlicmVhayBleHRfd2FsazsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBleHQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEV4dGVuc2lvbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnROYW1lKSB7Ci0JCVN0cmluZyBJRCA9IG5hbWVzcGFjZSArICcuJyArIGV4dGVuc2lvblBvaW50TmFtZTsKLQkJT2JqZWN0IGV4dCA9IElEVG9FeHRlbnNpb25NYXAuZ2V0KElEKTsKLQkJaWYoZXh0ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoSURUb0V4dGVuc2lvbk1hcCkgewotCQkJCWV4dCA9IElEVG9FeHRlbnNpb25NYXAuZ2V0KElEKTsKLQkJCQlpZihleHQgPT0gbnVsbCkgewotCQkJCQlleHQgPSBjcmVhdGVFeHRlbnNpb24obmFtZXNwYWNlLCBleHRlbnNpb25Qb2ludE5hbWUpOwotCQkJCQlpZihleHQgIT0gbnVsbCkgewotCQkJCQkJSURUb0V4dGVuc2lvbk1hcC5wdXQoSUQsIGV4dCk7Ci0JCQkJCX0KLQkJCQl9IAotCQkJfQotCi0JCX0KLQkJcmV0dXJuIGV4dDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElUZXh0UmVmZXJlbmNlUmVwbGFjZXIgZ2V0VGV4dFJlZmVyZW5jZVJlcGxhY2VyKCkgewotCQlyZXR1cm4gKElUZXh0UmVmZXJlbmNlUmVwbGFjZXIpIGdldEV4dGVuc2lvbihMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgInRleHRSZWZlcmVuY2VSZXBsYWNlciIpOyAvLyROT04tTkxTLTEkIAotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdDxJTmVzdGVkQ29tbWFuZFByb3ZpZGVyPiBnZXROZXN0ZWRDb21tYW5kUHJvdmlkZXJzKCkgewotCQlpZihuZXN0ZWRDb21tYW5kUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCW5lc3RlZENvbW1hbmRQcm92aWRlcnMgPSBnZXRFeHRlbnNpb25zKExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAKLQkJCQkJIm5lc3RlZENvbW1hbmRQcm92aWRlcnMiLCBJTmVzdGVkQ29tbWFuZFByb3ZpZGVyLmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBuZXN0ZWRDb21tYW5kUHJvdmlkZXJzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSURpYWdyYW1NYW5hZ2VyIGdldERpYWdyYW1NYW5hZ2VyKCkgewotCQlyZXR1cm4gKElEaWFncmFtTWFuYWdlcikgZ2V0RXh0ZW5zaW9uKExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAiZGlhZ3JhbU1hbmFnZXIiKTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE9wcG9zaXRlRmVhdHVyZUxvYWRlcnMoKSB7Ci0JCWlmKG9wcG9zaXRlRmVhdHVyZUxvYWRlcnMgPT0gbnVsbCkgewotCQkJb3Bwb3NpdGVGZWF0dXJlTG9hZGVycyA9IGdldEV4dGVuc2lvbnMoTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksIAotCQkJCQkib3Bwb3NpdGVGZWF0dXJlTG9hZGVycyIsIElOZXN0ZWRDb21tYW5kUHJvdmlkZXIuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG9wcG9zaXRlRmVhdHVyZUxvYWRlcnM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKSB7Ci0JCXJldHVybiAoSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIpIGdldEV4dGVuc2lvbihMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgInVzZXJJbnRlcmFjdGlvbkhhbmRsZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvR3JhcGhpY2FsRGF0YS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0dyYXBoaWNhbERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y4ZDMwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvR3JhcGhpY2FsRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOwotaW1wb3J0IGphdmEuYXd0LlBvaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoaWNhbERhdGEgewotCXByaXZhdGUgUG9pbnQgbG9jYXRpb24gPSBuZXcgUG9pbnQoMCwgMCk7Ci0KLQlwcml2YXRlIERpbWVuc2lvbiBzaXplID0gbmV3IERpbWVuc2lvbigtMSwgLTEpOwotCi0JcHJpdmF0ZSBHcmFwaE5vZGUgZ3JhcGhOb2RlOwotCi0JcHJpdmF0ZSBEaWFncmFtIGRpYWdyYW07Ci0KLQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaWFncmFtKERpYWdyYW0gZGlhZ3JhbSkgewotCQl0aGlzLmRpYWdyYW0gPSBkaWFncmFtOwotCX0KLQotCXB1YmxpYyBHcmFwaE5vZGUgZ2V0R3JhcGhOb2RlKCkgewotCQlyZXR1cm4gZ3JhcGhOb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdyYXBoTm9kZShHcmFwaE5vZGUgZ3JhcGhOb2RlKSB7Ci0JCXRoaXMuZ3JhcGhOb2RlID0gZ3JhcGhOb2RlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbG9jYXRpb24uCi0JICovCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogICAgICAgICAgICBUaGUgbG9jYXRpb24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFBvaW50IGxvY2F0aW9uKSB7Ci0JCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNpemUuCi0JICovCi0JcHVibGljIERpbWVuc2lvbiBnZXRTaXplKCkgewotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2l6ZQotCSAqICAgICAgICAgICAgVGhlIHNpemUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpemUoRGltZW5zaW9uIHNpemUpIHsKLQkJdGhpcy5zaXplID0gc2l6ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSUJyZWFrZG93blN0cnVjdHVyZUFkYXB0ZXJGYWN0b3JpZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JQnJlYWtkb3duU3RydWN0dXJlQWRhcHRlckZhY3Rvcmllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTY2MWI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JQnJlYWtkb3duU3RydWN0dXJlQWRhcHRlckZhY3Rvcmllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIHByb3ZpZGVzIGEgcmVsYXRlZCBzZXQgb2YgYWRhcHRlciBmYWN0b3JpZXMgZm9yIGJyZWFrZG93bgotICogc3RydWN0dXJlIHZpZXdzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIwLCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJyZWFrZG93blN0cnVjdHVyZUFkYXB0ZXJGYWN0b3JpZXMgewotCUFkYXB0ZXJGYWN0b3J5IGdldFdCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQlBZGFwdGVyRmFjdG9yeSBnZXRUQlNBZGFwdGVyRmFjdG9yeSgpOwotCi0JQWRhcHRlckZhY3RvcnkgZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQlBZGFwdGVyRmFjdG9yeSBnZXRDQlNBZGFwdGVyRmFjdG9yeSgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lEaWFncmFtTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lEaWFncmFtTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjg2OWM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JRGlhZ3JhbU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotCi0vKioKLSAqIE1hbmFnZXMgZGlhZ3JhbXMgb2YgYWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdW4gMjcsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURpYWdyYW1NYW5hZ2VyIHsKLQkvKiogRGlhZ3JhbSB0eXBlIGNvbnN0YW50cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElWSVRZX0RJQUdSQU0gPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTSA9IDI7Ci0KLQkvKioKLQkgKiBHZXRzIGRpYWdyYW0gb2YgZ2l2ZW4gdHlwZSBmb3IgdGhlIGdpdmVuIGFjdGl2aXR5Ci0JICogCi0JICogQHBhcmFtIGFjdAotCSAqIEBwYXJhbSB0eXBlIGNhbiBiZSBvbmUgb2YgdGhlIGNvbnN0YW50cyB7QGxpbmsgI0FDVElWSVRZX0RJQUdSQU19LCB7QGxpbmsgI0FDVElWSVRZX0RFVEFJTF9ESUFHUkFNfSwgb3Ige0BsaW5rICNXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNfQotCSAqIEByZXR1cm4KLQkgKi8KLQlEaWFncmFtIGdldERpYWdyYW0oQWN0aXZpdHkgYWN0LCBpbnQgdHlwZSk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSUxpYnJhcnlJbnNwZWN0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JTGlicmFyeUluc3BlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDVkOTI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JTGlicmFyeUluc3BlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgZGVidWcgcHVycG9zZQotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUgLSBBdWd1c3QgMTEsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxpYnJhcnlJbnNwZWN0b3IgewotCS8qKgotCSAqIFNob3cgYWxsIGNvbnRlbnRzIG9mIHRoZSBsaWJyYXJ5Ci0JICovCi0Jdm9pZCBzaG93QWxsQ29udGVudHMoKTsKLQkKLQkvKioKLQkgKiBTaG93IGFsbCBjb250ZW50cyBvZiB0aGUgbGlicmFyeQotCSAqLwotCXZvaWQgc2hvd0FsbENvbnRlbnRzKE1ldGhvZExpYnJhcnkgbGliKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSU9wcG9zaXRlRmVhdHVyZUxvYWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lPcHBvc2l0ZUZlYXR1cmVMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3ODllZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSU9wcG9zaXRlRmVhdHVyZUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKgotICogT3Bwb3NpdGUgZmVhdHVyZSBsb2FkZXIKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBTZXAgMTQsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU9wcG9zaXRlRmVhdHVyZUxvYWRlciB7Ci0JLyoqCi0JICogTG9hZHMgb3Bwb3NpdGUgZmVhdHVyZXMgZm9yIHRoZSBnaXZlbiBlbGVtZW50cwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqLwotCXZvaWQgbG9hZE9wcG9zaXRlRmVhdHVyZXMoQ29sbGVjdGlvbiBlbGVtZW50cyk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSVJ1bm5hYmxlV2l0aFByb2dyZXNzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSVJ1bm5hYmxlV2l0aFByb2dyZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZDJhY2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lSdW5uYWJsZVdpdGhQcm9ncmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0gICAgLyoqCi0gICAgICogUnVucyB0aGlzIG9wZXJhdGlvbi4gIFByb2dyZXNzIHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvci4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c3VhbGx5IGludm9rZWQgYnkgYW4gPGNvZGU+SVJ1bm5hYmxlQ29udGV4dDwvY29kZT4ncyA8Y29kZT5ydW48L2NvZGU+IG1ldGhvZCwKLSAgICAgKiB3aGljaCBzdXBwbGllcyB0aGUgcHJvZ3Jlc3MgbW9uaXRvci4KLSAgICAgKiBBIHJlcXVlc3QgdG8gY2FuY2VsIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIGhvbm9yZWQgYW5kIGFja25vd2xlZGdlZCAKLSAgICAgKiBieSB0aHJvd2luZyA8Y29kZT5JbnRlcnJ1cHRlZEV4Y2VwdGlvbjwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0byB1c2UgdG8gZGlzcGxheSBwcm9ncmVzcyBhbmQgcmVjZWl2ZQotICAgICAqICAgcmVxdWVzdHMgZm9yIGNhbmNlbGF0aW9uCi0gICAgICogQGV4Y2VwdGlvbiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGlmIHRoZSBydW4gbWV0aG9kIG11c3QgcHJvcGFnYXRlIGEgY2hlY2tlZCBleGNlcHRpb24sCi0gICAgICogCWl0IHNob3VsZCB3cmFwIGl0IGluc2lkZSBhbiA8Y29kZT5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uPC9jb2RlPjsgcnVudGltZSBleGNlcHRpb25zIGFyZSBhdXRvbWF0aWNhbGx5Ci0gICAgICogIHdyYXBwZWQgaW4gYW4gPGNvZGU+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT4gYnkgdGhlIGNhbGxpbmcgY29udGV4dAotICAgICAqIEBleGNlcHRpb24gSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIG9wZXJhdGlvbiBkZXRlY3RzIGEgcmVxdWVzdCB0byBjYW5jZWwsIAotICAgICAqICB1c2luZyA8Y29kZT5JUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTwvY29kZT4sIGl0IHNob3VsZCBleGl0IGJ5IHRocm93aW5nIAotICAgICAqICA8Y29kZT5JbnRlcnJ1cHRlZEV4Y2VwdGlvbjwvY29kZT4KLSAgICAgKgotICAgICAqIEBzZWUgSVJ1bm5hYmxlQ29udGV4dCNydW4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIEludGVycnVwdGVkRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lUZXh0UmVmZXJlbmNlUmVwbGFjZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JVGV4dFJlZmVyZW5jZVJlcGxhY2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZGY1MTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lUZXh0UmVmZXJlbmNlUmVwbGFjZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiBJbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGNhbiBzY2FuIHRleHQgYW5kIHJlcGxhY2VzIHRleHR1YWwgcmVmZXJlbmNlcyB0byB0aGUKLSAqIG9sZCBvYmplY3RzIHdpdGggcmVmZXJlbmNlcyB0byBuZXcgb2JqZWN0cwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1biAyMiwgMjAwNgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUZXh0UmVmZXJlbmNlUmVwbGFjZXIgewotCS8qKgotCSAqIFJlcGxhY2VzIHRleHR1YWwgcmVmZXJlbmNlcyB0byB0aGUgb2xkIG9iamVjdHMgd2l0aCByZWZlcmVuY2VzIHRvIG5ldwotCSAqIG9iamVjdHMgcHJvdmlkZWQgaW4gdGhlIDxjb2RlPm9sZFRvTmV3T2JqZWN0TWFwPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICB0aGUgb3duZXIgb2YgdGhlIHRleHQKLQkgKiBAcGFyYW0gb2xkVG9OZXdPYmplY3RNYXAKLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIHJlcGxhY2UoU3RyaW5nIHRleHQsIEVPYmplY3Qgb3duZXIsIE1hcCBvbGRUb05ld09iamVjdE1hcCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JdGVtTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2RiOGZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JdGVtTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgSXRlbUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJSXRlbUxhYmVsUHJvdmlkZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG9iamVjdCA9PSBudWxsID8gIiIgOiBvYmplY3QudG9TdHJpbmcoKTsvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTGlicmFyeUVkaXRDb25zdGFudHMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9MaWJyYXJ5RWRpdENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTJhMDYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9MaWJyYXJ5RWRpdENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci0KLS8qKgotICogQ29uc3RhbnRzIGZvciBsaWJyYXJ5IGVkaXQgcGx1Z2luCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIEp1biAzMCwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTGlicmFyeUVkaXRDb25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVU5DQVRFR09SSVpFRF9UQVNLU19QQVRIID0gewotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVW5jYXRlZ29yaXplZF9UYXNrc190ZXh0IikgLy8kTk9OLU5MUy0xJAotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFVOQ0FURUdPUklaRURfRE9NQUlOX1dPUktQUk9EVUNUU19QQVRIID0gewotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Eb21haW5zX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9VbmNhdGVnb3JpemVkX3RleHQiKSAvLyROT04tTkxTLTEkCQkJCQotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFVOQ0FURUdPUklaRURfV09SS1BST0RVQ1RUWVBFX1dPUktQUk9EVUNUU19QQVRIID0gewotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVW5jYXRlZ29yaXplZF90ZXh0IikgLy8kTk9OLU5MUy0xJAkJCQkKLQl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBVTkNBVEVHT1JJWkVEX1JPTEVTX1BBVEggPSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVW5jYXRlZ29yaXplZF9Sb2xlc190ZXh0IikgLy8kTk9OLU5MUy0xJAkJCi0JfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVU5DQVRFR09SSVpFRF9UT09MTUVOVE9SU19QQVRIID0gewotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Ub29sc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVW5jYXRlZ29yaXplZF90ZXh0IikgLy8kTk9OLU5MUy0xJAkJCQkKLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfUFJFRklYID0gIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9FTkFCTEVfUFJPQ0VTU19DT05UUklCVVRJT04gPSBQUkVGX1BSRUZJWAotCQkJKyAiZW5hYmxlX3Byb2Nlc3NfY29udHJpYnV0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9FTkFCTEVfSEVBTFRIX0NIRUNLID0gUFJFRl9QUkVGSVgKLQkJCSsgImVuYWJsZV9oZWFsdGhfY2hlY2siOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0lOSEVSSVRfU1VQUFJFU1NJT05fU1RBVEUgPSBQUkVGX1BSRUZJWAotCQkJKyAiaW5oZXJpdF9zdXBwcmVzc2lvbl9zdGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfV0JTX0NPTFVNTlMgPSBQUkVGX1BSRUZJWCArICJ3YnNfY29sdW1ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfVEJTX0NPTFVNTlMgPSBQUkVGX1BSRUZJWCArICJ0YnNfY29sdW1ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfV1BCU19DT0xVTU5TID0gUFJFRl9QUkVGSVggKyAid3Bic19jb2x1bW5zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0NVU1RPTV9DQVRFR09SWSA9ICJuZXdfY3VzdG9tX2NhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0RJU0NJUExJTkUgPSAibmV3X2Rpc2NpcGxpbmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRElTQ0lQTElORV9HUk9VUElORyA9ICJuZXdfZGlzY2lwbGluZV9ncm91cGluZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19ET01BSU4gPSAibmV3X2RvbWFpbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19ST0xFX1NFVCA9ICJuZXdfcm9sZV9zZXQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUk9MRV9TRVRfR1JPVVBJTkcgPSAibmV3X3JvbGVfc2V0X2dyb3VwaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1RPT0wgPSAibmV3X3Rvb2wiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfV09SS19QUk9EVUNUX1RZUEUgPSAibmV3X3dvcmtfcHJvZHVjdF9raW5kIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1JPTEUgPSAibmV3X3JvbGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfVEFTSyA9ICJuZXdfdGFzayI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19XT1JLUFJPRFVDVCA9ICJuZXdfd29ya3Byb2R1Y3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfQVJUSUZBQ1QgPSAibmV3X2FydGlmYWN0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0RFTElWRVJBQkxFID0gIm5ld19kZWxpdmVyYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19PVVRDT01FID0gIm5ld19vdXRjb21lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0NIRUNLTElTVCA9ICJuZXdfY2hlY2tsaXN0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1dISVRFUEFQRVIgPSAibmV3X3doaXRlcGFwZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfQ09OQ0VQVCA9ICJuZXdfY29uY2VwdCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19FU1RJTUFURSA9ICJuZXdfZXN0aW1hdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRVNUSU1BVElPTl9DT05TSURFUkFUSU9OID0gIm5ld19lc3RpbWF0aW9uX2NvbnNpZGVyYXRpb25zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0VTVElNQVRBVElOR19NRVRSSUMgPSAibmV3X2VzdGltYXRpbmdfbWV0cmljIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0VYQU1QTEUgPSAibmV3X2V4YW1wbGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUFJBQ1RJQ0UgPSAibmV3X3ByYWN0aWNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1JFUE9SVCA9ICJuZXdfcmVwb3J0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1JPQURNQVAgPSAibmV3X3JvYWRtYXAiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUkVVU0FCTEVfQVNTRVQgPSAibmV3X3JldXNhYmxlX2Fzc2V0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1NVUFBPUlRJTkdfTUFURVJJQUwgPSAibmV3X3N1cHBvcnRpbmdfbWF0ZXJpYWwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfVEVNUExBVEUgPSAibmV3X3RlbXBsYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1RFUk1fREVGSU5JVElPTiA9ICJuZXdfdGVybV9kZWZpbml0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1RPT0xfTUVOVE9SID0gIm5ld190b29sbWVudG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0dVSURFTElORSA9ICJuZXdfZ3VpZGVsaW5lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0dVSURBTkNFID0gIm5ld19ndWlkYW5jZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19DT05URU5UX1BBQ0tBR0UgPSAibmV3X2NvbnRlbnRfcGFja2FnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19DT05GSUdVUkFUSU9OID0gIm5ld19jb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1BST0NFU1NfRkFNSUxZID0gIm5ld19wcm9jZXNzX2ZhbWlseSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXNzZW5nZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXNzZW5nZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEwNWZlNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWVzc2VuZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyOwotCi0vKioKLSAqIERlZmF1bHQgbWVzc2VuZ2VyIHRoYXQgd2lsbCBkZWxpdmVyIG1lc3NhZ2VzIHVzaW5nIHRoZSBtZXNzZW5nZXIgb2YKLSAqIHtAbGluayBFeHRlbnNpb25NYW5hZ2VyI2dldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCkgZGVmYXVsdCB1c2VyCi0gKiBpbnRlcmFjdGlvbiBoYW5kbGVyfSBpZiBvbmUgZXhpc3RzLiBPdGhlcndpc2UsIGl0IHdpbGwgbG9nIHRoZSBtZXNzYWdlcyB1c2luZwotICogcGx1Z2luJ3MgbG9nZ2VyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAyNSwgMjAwNgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2VuZ2VyIGltcGxlbWVudHMgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXNzZW5nZXIgSU5TVEFOQ0UgPSBuZXcgTWVzc2VuZ2VyKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0xJTkUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoCi0JCQkibGluZS5zZXBhcmF0b3IiLCAiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIElNZXNzZW5nZXIgZGVsZWdhdGU7Ci0KLQlwcml2YXRlIExvZ2dlciBsb2dnZXIgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCk7Ci0KLQlwcml2YXRlIE1lc3NlbmdlcigpIHsKLQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlcgotCQkJCS5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQlpZiAodWlIYW5kbGVyICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlID0gdWlIYW5kbGVyLmdldE1lc3NlbmdlcigpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93RXJyb3IoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2hvd0Vycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZykgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJZGVsZWdhdGUuc2hvd0Vycm9yKHRpdGxlLCBtc2cpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIodGl0bGUpOwotCQkJaWYoIVN0clV0aWwuaXNCbGFuayhtc2cpKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZChORVdfTElORSkuYXBwZW5kKG1zZyk7Ci0JCQl9Ci0JCQlsb2dnZXIubG9nRXJyb3Ioc3RyQnVmLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93RXJyb3IoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKQotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5zaG93RXJyb3IodGl0bGUsIG1zZywgc3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0Vycm9yKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuRXhjZXB0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sCi0JCQlFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5zaG93RXJyb3IodGl0bGUsIG1zZywgcmVhc29uLCBleGNlcHRpb24pOwotCQl9IGVsc2UgewotCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIodGl0bGUpOwotCQkJaWYoIVN0clV0aWwuaXNCbGFuayhtc2cpKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZChORVdfTElORSkuYXBwZW5kKG1zZyk7Ci0JCQl9Ci0JCQlsb2dnZXIubG9nRXJyb3Ioc3RyQnVmLnRvU3RyaW5nKCksIGV4Y2VwdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dXYXJuaW5nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZykgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJZGVsZWdhdGUuc2hvd1dhcm5pbmcodGl0bGUsIG1zZyk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcih0aXRsZSk7Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKG1zZykpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKE5FV19MSU5FKS5hcHBlbmQobXNnKTsKLQkJCX0KLQkJCWxvZ2dlci5sb2dXYXJuaW5nKHN0ckJ1Zi50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd1dhcm5pbmcoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2hvd1dhcm5pbmcoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5zaG93V2FybmluZyh0aXRsZSwgbXNnLCByZWFzb24pOwotCQl9IGVsc2UgewotCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIodGl0bGUpOwotCQkJaWYoIVN0clV0aWwuaXNCbGFuayhtc2cpKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZChORVdfTElORSkuYXBwZW5kKG1zZyk7Ci0JCQl9Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKHJlYXNvbikpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKE5FV19MSU5FKS5hcHBlbmQocmVhc29uKTsKLQkJCX0KLQkJCWxvZ2dlci5sb2dXYXJuaW5nKHN0ckJ1Zi50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dJbmZvKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2hvd0luZm8oU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5zaG93SW5mbyh0aXRsZSwgbXNnKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKHRpdGxlKTsKLQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsobXNnKSkgewotCQkJCXN0ckJ1Zi5hcHBlbmQoTkVXX0xJTkUpLmFwcGVuZChtc2cpOwotCQkJfQotCQkJbG9nZ2VyLmxvZ0luZm8oc3RyQnVmLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0Vycm9yKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5FeGNlcHRpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2hvd0Vycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGRldGFpbHMsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlLnNob3dJbmZvKHRpdGxlLCBtc2cpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIodGl0bGUpOwotCQkJaWYoIVN0clV0aWwuaXNCbGFuayhtc2cpKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZChORVdfTElORSkuYXBwZW5kKG1zZyk7Ci0JCQl9Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKHJlYXNvbikpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKE5FV19MSU5FKS5hcHBlbmQocmVhc29uKTsKLQkJCX0KLQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsoZGV0YWlscykpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKE5FV19MSU5FKS5hcHBlbmQoZGV0YWlscyk7Ci0JCQl9Ci0JCQlsb2dnZXIubG9nRXJyb3Ioc3RyQnVmLnRvU3RyaW5nKCksIGV4Y2VwdGlvbik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdjMzM0Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfT1JERVJfX1BSRURFQ0VTU09SX1BST0NFU1NfUEFUSCA9ICJwcmVkX3Byb2Nlc3NfcGF0aCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kRWxlbWVudFByb3BlcnR5IGdldFByb3BlcnR5KE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSAoTWV0aG9kRWxlbWVudFByb3BlcnR5KSBpdGVyLm5leHQoKTsKLQkJCWlmKHByb3AuZ2V0TmFtZSgpLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJcmV0dXJuIHByb3A7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZXRQcm9wZXJ0eShNZXRob2RFbGVtZW50IGUsIFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSkgewotCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IGdldFByb3BlcnR5KGUsIHByb3BOYW1lKTsKLQkJaWYocHJvcCA9PSBudWxsKSB7Ci0JCQlwcm9wID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0JCQlwcm9wLnNldE5hbWUocHJvcE5hbWUpOwotCQkJZS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKS5hZGQocHJvcCk7Ci0JCX0KLQkJcHJvcC5zZXRWYWx1ZShwcm9wVmFsdWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZXRQcm9wZXJ0eShNZXRob2RFbGVtZW50IGUsIFN0cmluZyBwcm9wTmFtZSwgYm9vbGVhbiBiKSB7Ci0JCXNldFByb3BlcnR5KGUsIHByb3BOYW1lLCBTdHJpbmcudmFsdWVPZihiKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWV0aG9kRWxlbWVudFV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXRob2RFbGVtZW50VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2FhMWZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXRob2RFbGVtZW50VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBDbGFzcyB3aXRoIHN0YXRpYyB1dGlsaXR5IG1ldGhvZHMgZm9yIHF1ZXJ5aW5nIG1ldGhvZCBlbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudFV0aWwgewotCi0JLyoqCi0JICogUmV0dXJuIG1ldGhvZCBtb2RlbCBvZiB0aGUgb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBsdWdpbiBnZXRNZXRob2RNb2RlbChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoTWV0aG9kRWxlbWVudCkgb2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGxpc3Qgb2YgbW9kZWxzIGFzIHNwZWNpZmllZC4uIDEuIE1ldGhvZCBtb2RlbCBvZiB0aGUgb2JqZWN0IDIuCi0JICogUmVmZXJlbmNlZCBtb2RlbHMgb2YgdGhlIG1ldGhvZCBtb2RlbCBvZiB0aGUgb2JqZWN0IChlLmcuIHJlZmVyZW5jZQotCSAqIHJlbGF0aW9uc2hpcCkKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxNb2RlbHMoT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IGFsbE1vZGVscyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBnZXQgbWV0aG9kIG1vZGVsIG9mIHRoZSBvYmplY3QKLQkJTWV0aG9kUGx1Z2luIG1vZGVsID0gZ2V0TWV0aG9kTW9kZWwob2JqZWN0KTsKLQotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCi0JCQkvLyBnZXQgYWxsIGJhc2UgbW9kZWxzCi0JCQkvLwotCQkJTWlzYy5nZXRBbGxCYXNlKG1vZGVsLCBhbGxNb2RlbHMpOwotCi0JCQlhbGxNb2RlbHMuYWRkKG1vZGVsKTsKLQotCQl9Ci0KLQkJcmV0dXJuIGFsbE1vZGVsczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHJlZmVyZW5jZXMgZ3VpZGFuY2VzIGZvciB0aGUgZ2l2ZW4gb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoRU9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCBpdGVtTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlMaXN0IHJlZmVyZW5jZXMgPSAoKEVPYmplY3QpIG9iamVjdCkuZUNyb3NzUmVmZXJlbmNlcygpOwotCQlpZiAocmVmZXJlbmNlcyAhPSBudWxsICYmIHJlZmVyZW5jZXMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSAoT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJCWl0ZW1MaXN0LmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWl0ZW1MaXN0Ci0JCQkJLmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmFjdGljZXMoKENvbnRlbnRFbGVtZW50KSBvYmplY3QpKTsKLQotCQlyZXR1cm4gaXRlbUxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgYnVpbHQgZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudHMuIFRoZSBtYXAgaGFzIGd1aWRzIGFzIGtleXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+IGJ1aWxkTWFwKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRzKSB7Ci0JCU1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kRWxlbWVudD4oKTsKLQkJCi0JCWlmIChlbGVtZW50cyAhPSBudWxsICYmICFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3I8PyBleHRlbmRzIE1ldGhvZEVsZW1lbnQ+IGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IGl0Lm5leHQoKTsKLQkJCQltYXAucHV0KGVsZW1lbnQuZ2V0R3VpZCgpLCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG1hcDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWlzYy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01pc2MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNiODJiOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWlzYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIE1hbnkgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIGhhZCBiZWVuIG1vdmVkIHRvIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNaXNjIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRBbGxXb3JrUHJvZHVjdHMoQ29udGVudFBhY2thZ2UgcGtnLCBMaXN0IGxpc3QpIHsKLQkJTGlzdCBlbGVtZW50cyA9IHBrZy5nZXRDb250ZW50RWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCWxpc3QuYWRkKG9iaik7Ci0JCQl9Ci0JCX0KLQkJTGlzdCBwYWNrYWdlcyA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFja2FnZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBwYWNrYWdlcy5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlnZXRBbGxXb3JrUHJvZHVjdHMoKENvbnRlbnRQYWNrYWdlKSBvYmosIGxpc3QpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbFdvcmtQcm9kdWN0cyhDb250ZW50UGFja2FnZSBwa2cpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRBbGxXb3JrUHJvZHVjdHMocGtnLCBsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRBbGxUYXNrcyhDb250ZW50UGFja2FnZSBwa2csIExpc3QgbGlzdCkgewotCQlMaXN0IGVsZW1lbnRzID0gcGtnLmdldENvbnRlbnRFbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gZWxlbWVudHMuZ2V0KGkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCQlsaXN0LmFkZChvYmopOwotCQkJfQotCQl9Ci0JCUxpc3QgcGFja2FnZXMgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gcGFja2FnZXMuZ2V0KGkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJZ2V0QWxsVGFza3MoKENvbnRlbnRQYWNrYWdlKSBvYmosIGxpc3QpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbFRhc2tzKENvbnRlbnRQYWNrYWdlIHBrZykgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldEFsbFRhc2tzKHBrZywgbGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxVbmNhdGVnb3JpemVkVGFza3MoQ29udGVudFBhY2thZ2UgcGtnKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0QWxsVW5jYXRlZ29yaXplZFRhc2tzKHBrZywgbGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0QWxsVW5jYXRlZ29yaXplZFRhc2tzKENvbnRlbnRQYWNrYWdlIHBrZywgTGlzdCBsaXN0KSB7Ci0JCUxpc3QgZWxlbWVudHMgPSBwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBlbGVtZW50cy5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVGFzawotCQkJCQkmJiBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lcygoVGFzaykgb2JqKS5pc0VtcHR5KCkpIHsKLQkJCQlsaXN0LmFkZChvYmopOwotCQkJfQotCQl9Ci0JCUxpc3QgcGFja2FnZXMgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gcGFja2FnZXMuZ2V0KGkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJZ2V0QWxsVW5jYXRlZ29yaXplZFRhc2tzKChDb250ZW50UGFja2FnZSkgb2JqLCBsaXN0KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0UGF0aFJlbGF0aXZlVG9QbHVnaW4oTmFtZWRFbGVtZW50IGUpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGUpOwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJbGlzdC5hZGQoU3RyaW5nLnZhbHVlT2YoZS5nZXROYW1lKCkpKTsKLQkJZm9yIChlID0gKE5hbWVkRWxlbWVudCkgKChFT2JqZWN0KSBlKS5lQ29udGFpbmVyKCk7IGUgIT0gbnVsbAotCQkJCSYmIGUgIT0gcGx1Z2luOyBlID0gKE5hbWVkRWxlbWVudCkgKChFT2JqZWN0KSBlKS5lQ29udGFpbmVyKCkpIHsKLQkJCWxpc3QuYWRkKDAsIFN0cmluZy52YWx1ZU9mKGUuZ2V0TmFtZSgpKSk7Ci0JCX0KLQkJU3RyaW5nW10gcGF0aCA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocGF0aCk7Ci0JCXJldHVybiBwYXRoOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248TmFtZWRFbGVtZW50PiBnZXRPYmplY3RUcmVlUmVsYXRpdmVUb1BsdWdpbihOYW1lZEVsZW1lbnQgZSkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCUFycmF5TGlzdDxOYW1lZEVsZW1lbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVkRWxlbWVudD4oKTsKLQkJbGlzdC5hZGQoZSk7Ci0JCWZvciAoZSA9IChOYW1lZEVsZW1lbnQpZS5lQ29udGFpbmVyKCk7IGUgIT0gbnVsbAotCQkJCSYmIGUgIT0gcGx1Z2luOyBlID0gKE5hbWVkRWxlbWVudCllLmVDb250YWluZXIoKSkgewotCQkJbGlzdC5hZGQoMCwgZSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXRoUmVsYXRpdmVUb0xpYnJhcnkoTmFtZWRFbGVtZW50IGUpIHsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkKLQkJCXJldHVybiBlLmdldE5hbWUoKTsKLQkJU3RyaW5nQnVmZmVyIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKGUuZ2V0TmFtZSgpKTsKLQkJU3RyaW5nW10gYXJyID0gZ2V0UGF0aFJlbGF0aXZlVG9QbHVnaW4oZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYXRoLmFwcGVuZCgnLycpLmFwcGVuZChhcnJbaV0pOwotCQl9Ci0JCXJldHVybiBwYXRoLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgYmFzZSBwbHVnaW5zIG9mIHRoZSBnaXZlbiBwbHVnaW4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxCYXNlKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRBbGxCYXNlKHBsdWdpbiwgbGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRBbGxCYXNlKE1ldGhvZFBsdWdpbiBwbHVnaW4sIExpc3QgbGlzdCkgewotCQlMaXN0IGJhc2UgPSBwbHVnaW4uZ2V0QmFzZXMoKTsKLQotCQkvLyBDaGVjayBpZiB0aGUgYmFzZXMgaW4gdGhlIGxpc3QgYWxyZWFkeS4KLQkJaWYgKCFsaXN0LmNvbnRhaW5zQWxsKGJhc2UpKSB7Ci0JCQlsaXN0LmFkZEFsbChiYXNlKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGJhc2Uuc2l6ZSgpOyBpKyspIHsKLQkJCXBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGJhc2UuZ2V0KGkpOwotCQkJZ2V0QWxsQmFzZShwbHVnaW4sIGxpc3QpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQmFzZU9mKE1ldGhvZFBsdWdpbiBiYXNlLCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCX0KLQkJTGlzdCBiYXNlcyA9IHBsdWdpbi5nZXRCYXNlcygpOwotCQlpbnQgc2l6ZSA9IGJhc2VzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChiYXNlID09IGJhc2VzLmdldChpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGlzQmFzZU9mKGJhc2UsIChNZXRob2RQbHVnaW4pIGJhc2VzLmdldChpKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01vZGVsU3RydWN0dXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTW9kZWxTdHJ1Y3R1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNhMzU5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTW9kZWxTdHJ1Y3R1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotCi0KLS8qKgotICogRGVmaW5lcyBpbnRlcm5hbCBzdHJ1Y3R1cmUgb2YgYSBtZXRob2QgcGx1Z2luIHdpdGggcHJlZGVmaW5lZCBwYWNrYWdlcwotICogIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsU3RydWN0dXJlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTW9kZWxTdHJ1Y3R1cmUgREVGQVVMVCA9IG5ldyBNb2RlbFN0cnVjdHVyZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSElEREVOX1BBQ0tBR0VfTkFNRSA9ICJIaWRkZW4iOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9QQUNLQUdFX05BTUUgPSAiQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1JFX0NPTlRFTlRfUEFDQUtHRV9OQU1FID0gIkNvcmVDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SSUVTID0gIkNhdGVnb3JpZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9TRVRfUEFDS0FHRV9OQU1FID0gIlJvbGVTZXRzIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NJUExJTkVfUEFDS0FHRV9OQU1FID0gIkRpc2NpcGxpbmVzIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DQVRFR09SWV9QQUNLQUdFX05BTUUgPSAiQ3VzdG9tQ2F0ZWdvcmllcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfQ09SRV9DT05URU5UX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCBDT1JFX0NPTlRFTlRfUEFDQUtHRV9OQU1FIH07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1JPTEVfU0VUX1BBQ0tBR0VfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsICBST0xFX1NFVF9QQUNLQUdFX05BTUV9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX0RJU0NJUExJTkVfREVGX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCBDQVRFR09SSUVTLCBESVNDSVBMSU5FX1BBQ0tBR0VfTkFNRSB9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9UT09MX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCBDQVRFR09SSUVTLCAiVG9vbHMiIH07IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfU1RBTkRBUkRfQ0FURUdPUllfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsICJTdGFuZGFyZENhdGVnb3JpZXMiIH07IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfREVMSVZFUllfUFJPQ0VTU19QQVRIID0geyAiRGVsaXZlcnlQcm9jZXNzZXMiIH07IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfQ0FQQUJJTElUWV9QQVRURVJOX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCAiQ2FwYWJpbGl0eVBhdHRlcm5zIiB9OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfRE9NQUlOX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCBDQVRFR09SSUVTLCAiRG9tYWlucyIgfTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1dPUktfUFJPRFVDVF9UWVBFX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCBDQVRFR09SSUVTLCAiV1AgVHlwZXMiIH07IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9DVVNUT01fQ0FURUdPUllfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsICBDVVNUT01fQ0FURUdPUllfUEFDS0FHRV9OQU1FfTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfRVNUSU1BVElOR19NT0RFTFNfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsICJFc3RpbWF0aW5nTW9kZWxzIiB9OyAvLyROT04tTkxTLTEkCi0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfUFJPQ0VTU19DT05UUklCVVRJT05fUEFUSCA9IHsgIlByb2Nlc3NDb250cmlidXRpb25zIiB9OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1BST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfUEFUSCA9IHsgIlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlcyIgfTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEFMTF9QUkVERUZJTkVEX1BBVEhTID0gbmV3IEhhc2hTZXQoKTsKLQotCXB1YmxpYyBTdHJpbmdbXSBjb3JlQ29udGVudFBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gcm9sZVNldFBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gZGlzY2lwbGluZURlZmluaXRpb25QYXRoOwotCi0JcHVibGljIFN0cmluZ1tdIGRvbWFpblBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gdG9vbFBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gY2FwYWJpbGl0eVBhdHRlcm5QYXRoOwotCi0JcHVibGljIFN0cmluZ1tdIGRlbGl2ZXJ5UHJvY2Vzc1BhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gd29ya1Byb2R1Y3RUeXBlUGF0aDsKLQotCXB1YmxpYyBTdHJpbmdbXSBwcm9jZXNzQ29udHJpYnV0aW9uUGF0aDsKLQotCXB1YmxpYyBTdHJpbmdbXSBjdXN0b21DYXRlZ29yeVBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gZXN0aW1hdGluZ01vZGVsUGF0aDsKLQkKLQlwdWJsaWMgU3RyaW5nW10gc3RhbmRhcmRDYXRlZ29yeVBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVQYXRoOwotCi0JLyoqCi0JICogdGhpcyBpcyB0aGUgbWV0aG9kIHRvIHJldHVybiBhbGwgdGhlIHN5c3RlbSBkZWZpbmVkIHBhY2thZ2UgcGF0aCBQbGVhc2UKLQkgKiBhZGQgdGhpcyB0aGlzIGFycmF5IHdoZW4gZXZlciB5b3UgaGF2ZSBuZXcgc3lzdGVtIHBhY2thZ2VzIGRlZmluZWQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZ1tdW10gZ2V0QWxsU3lzdGVtUGF0aHMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW11bXSB7IGNvcmVDb250ZW50UGF0aCwgcm9sZVNldFBhdGgsCi0JCQkJZGlzY2lwbGluZURlZmluaXRpb25QYXRoLCBkb21haW5QYXRoLCB0b29sUGF0aCwKLQkJCQljYXBhYmlsaXR5UGF0dGVyblBhdGgsIGRlbGl2ZXJ5UHJvY2Vzc1BhdGgsCi0JCQkJd29ya1Byb2R1Y3RUeXBlUGF0aCwgcHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGgsCi0JCQkJY3VzdG9tQ2F0ZWdvcnlQYXRoLCBzdGFuZGFyZENhdGVnb3J5UGF0aCwKLQkJCQlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZVBhdGgsIH07Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdW10gZ2V0Q2F0ZWdvcnlQYXRocygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXVtdIHsgcm9sZVNldFBhdGgsIGRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCwKLQkJCQlkb21haW5QYXRoLCB0b29sUGF0aCwgd29ya1Byb2R1Y3RUeXBlUGF0aCwKLQkJCQlzdGFuZGFyZENhdGVnb3J5UGF0aCwgY3VzdG9tQ2F0ZWdvcnlQYXRoLCB9OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvTGluZXMoU3RyaW5nW10gcGF0aCkgewotCQlTdHJpbmdCdWZmZXIgbGluZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBtYXggPSBwYXRoLmxlbmd0aCAtIDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCWxpbmVzLmFwcGVuZChwYXRoW2ldKS5hcHBlbmQoJ1xuJyk7Ci0JCX0KLQkJbGluZXMuYXBwZW5kKHBhdGhbbWF4XSk7Ci0JCXJldHVybiBsaW5lcy50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvRmlsZVBhdGgoU3RyaW5nW10gcGF0aCkgewotCQlTdHJpbmdCdWZmZXIgbGluZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBtYXggPSBwYXRoLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJbGluZXMuYXBwZW5kKHBhdGhbaV0pLmFwcGVuZCgnLycpOwotCQl9Ci0JCXJldHVybiBsaW5lcy50b1N0cmluZygpOwotCX0KLQotCXN0YXRpYyB7Ci0JCURFRkFVTFQuY29yZUNvbnRlbnRQYXRoID0gREVGQVVMVF9DT1JFX0NPTlRFTlRfUEFUSDsKLQkJREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGggPSBERUZBVUxUX0RJU0NJUExJTkVfREVGX1BBVEg7Ci0JCURFRkFVTFQucm9sZVNldFBhdGggPSBERUZBVUxUX1JPTEVfU0VUX1BBQ0tBR0VfUEFUSDsKLQkJREVGQVVMVC5kb21haW5QYXRoID0gREVGQVVMVF9ET01BSU5fUEFUSDsKLQkJREVGQVVMVC50b29sUGF0aCA9IERFRkFVTFRfVE9PTF9QQVRIOwotCQlERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCA9IERFRkFVTFRfQ0FQQUJJTElUWV9QQVRURVJOX1BBVEg7Ci0JCURFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aCA9IERFRkFVTFRfREVMSVZFUllfUFJPQ0VTU19QQVRIOwotCQlERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGggPSBERUZBVUxUX1dPUktfUFJPRFVDVF9UWVBFX1BBVEg7Ci0JCURFRkFVTFQucHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGggPSBERUZBVUxUX1BST0NFU1NfQ09OVFJJQlVUSU9OX1BBVEg7Ci0JCURFRkFVTFQuc3RhbmRhcmRDYXRlZ29yeVBhdGggPSBERUZBVUxUX1NUQU5EQVJEX0NBVEVHT1JZX1BBVEg7Ci0JCURFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoID0gREVGQVVMVF9DVVNUT01fQ0FURUdPUllfUEFUSDsKLQkJREVGQVVMVC5lc3RpbWF0aW5nTW9kZWxQYXRoID0gREVGQVVMVF9FU1RJTUFUSU5HX01PREVMU19QQVRIOwotCQlERUZBVUxULnByb2Nlc3NQbGFubmluZ1RlbXBsYXRlUGF0aCA9IERFRkFVTFRfUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9QQVRIOwotCi0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQuY29yZUNvbnRlbnRQYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQucm9sZVNldFBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5kb21haW5QYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQudG9vbFBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCkpOwotCQlBTExfUFJFREVGSU5FRF9QQVRIUy5hZGQodG9GaWxlUGF0aChERUZBVUxULnByb2Nlc3NDb250cmlidXRpb25QYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQuc3RhbmRhcmRDYXRlZ29yeVBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5lc3RpbWF0aW5nTW9kZWxQYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTCi0JCQkJLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQucHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVQYXRoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzUGFja2FnZSBjcmVhdGVQcm9jZXNzQ29udHJpYnV0aW9uUGFja2FnZSgKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJLy8gYm9vbGVhbiBvbGQgPSBwbHVnaW4uZURlbGl2ZXIoKTsKLQkJdHJ5IHsKLQkJCS8vIGNyZWF0ZSBQcm9jZXNzQ29udHJpYnV0aW9ucyBwcm9jZXNzIHBhY2thZ2UKLQkJCS8vCi0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJcGtnLnNldE5hbWUoTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5wcm9jZXNzQ29udHJpYnV0aW9uUGF0aFswXSk7Ci0KLQkJCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uCi0JCQkvLwotCQkJcGx1Z2luLmVTZXREZWxpdmVyKGZhbHNlKTsKLQotCQkJcGx1Z2luLmdldE1ldGhvZFBhY2thZ2VzKCkuYWRkKHBrZyk7Ci0JCQlyZXR1cm4gcGtnOwotCQl9IGZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSBvcmlnaW5hbCBub3RpZmFjdGlvbiBzZXR0aW5nCi0JCQkvLwotCQkJcGx1Z2luLmVTZXREZWxpdmVyKHRydWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzUGFja2FnZSBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZVBhY2thZ2UoCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCS8vIGJvb2xlYW4gb2xkID0gcGx1Z2luLmVEZWxpdmVyKCk7Ci0JCXRyeSB7Ci0JCQkvLyBjcmVhdGUgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVzIHByb2Nlc3MgcGFja2FnZQotCQkJLy8KLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQlwa2cuc2V0TmFtZShNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnByb2Nlc3NQbGFubmluZ1RlbXBsYXRlUGF0aFswXSk7Ci0KLQkJCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uCi0JCQkvLwotCQkJcGx1Z2luLmVTZXREZWxpdmVyKGZhbHNlKTsKLQotCQkJcGx1Z2luLmdldE1ldGhvZFBhY2thZ2VzKCkuYWRkKHBrZyk7Ci0JCQlyZXR1cm4gcGtnOwotCQl9IGZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSBvcmlnaW5hbCBub3RpZmFjdGlvbiBzZXR0aW5nCi0JCQkvLwotCQkJcGx1Z2luLmVTZXREZWxpdmVyKHRydWUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvUGx1Z2luVUlQYWNrYWdlc01hcC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1BsdWdpblVJUGFja2FnZXNNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQzODZhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvUGx1Z2luVUlQYWNrYWdlc01hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0vKioKLSAqIEhvbGRzIGEgbWFwIG9mIFBsdWdpbiBQYWNrYWdlIG5hbWVzIHRvIHRoZSBsaXN0IG9mIHBsdWdpbnMgY29udGFpbmVkIGJ5IHRoZW0KLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpblVJUGFja2FnZXNNYXAgZXh0ZW5kcyBIYXNoTWFwPFN0cmluZywgU2V0PE1ldGhvZFBsdWdpbj4+IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04MzIxMzc5MDE1ODcwMDkwMjU2TDsKLQotCXB1YmxpYyBQbHVnaW5VSVBhY2thZ2VzTWFwKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIHBhY2thZ2VOYW1lLCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCVNldDxNZXRob2RQbHVnaW4+IHBsdWdpbnMgPSBnZXQocGFja2FnZU5hbWUpOwotCQlpZiAocGx1Z2lucyA9PSBudWxsKSB7Ci0JCQlwbHVnaW5zID0gbmV3IEhhc2hTZXQ8TWV0aG9kUGx1Z2luPigpOwotCQl9Ci0JCXBsdWdpbnMuYWRkKHBsdWdpbik7Ci0JCXB1dChwYWNrYWdlTmFtZSwgcGx1Z2lucyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1ByZWRlY2Vzc29yTGlzdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1ByZWRlY2Vzc29yTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWRiNzQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9QcmVkZWNlc3Nvckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgcHJlZGVjZXNzb3IgbGlzdCBvZiBhbiBpdGVtIHByb3ZpZGVyIGZvciBhIHdvcmsKLSAqIGJyZWFrZG93biBlbGVtZW50LiBJdCBjYWxjdWxhdGVzIHRoZSBwcmVkZWNlc3NvcnMgYmFzZWQgb24gdGhlIGN1cnJlbnRseQotICogc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBhbmQgYWNjb3JkaW5nIHRvIHZhcmlhYmlsaXR5IHJ1bGVzLiBJdCBjYW4gcmVmcmVzaAotICogaXRzZWxmIHVwb24gY2hhbmdlIGluIHByZWRlY2Vzc29yIGxpc3Qgb2Ygd29yayBicmVha2Rvd24gZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByZWRlY2Vzc29yTGlzdCBleHRlbmRzIEFycmF5TGlzdDxPYmplY3Q+IHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM2MTc4NTMwOTI1NzA0MTIwODJMOwkKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOSVNIX1RPX1NUQVJUID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuV29ya09yZGVyVHlwZUFiYnJldmlhdGlvbl9GSU5JU0hfVE9fU1RBUlQ7IAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5JU0hfVE9fRklOSVNIID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuV29ya09yZGVyVHlwZUFiYnJldmlhdGlvbl9GSU5JU0hfVE9fRklOSVNIOyAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVE9fU1RBUlQgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5Xb3JrT3JkZXJUeXBlQWJicmV2aWF0aW9uX1NUQVJUX1RPX1NUQVJUOyAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVE9fRklOSVNIID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuV29ya09yZGVyVHlwZUFiYnJldmlhdGlvbl9TVEFSVF9UT19GSU5JU0g7IAotCXByaXZhdGUgTWFwIG1hcDRMaW5rVHlwZSA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByZWRlY2Vzc29yTGlzdCBFTVBUWV9MSVNUID0gbmV3IFByZWRlY2Vzc29yTGlzdCgpIHsKLQotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM5MDQ2NzYwOTgyMTcwOTcwMTZMOwotCi0JCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIE9iamVjdCBlbGVtZW50KSB7Ci0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24gYykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBqYXZhLnV0aWwuQ29sbGVjdGlvbiBjKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQlwcml2YXRlIE9iamVjdCBvYmplY3Q7Ci0KLQlwcml2YXRlIEFkYXB0ZXIgbGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKEJyZWFrZG93bkVsZW1lbnQuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUjoKLQkJCQlyZWZyZXNoKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgT2JqZWN0IHRvcDsKLQotCXByaXZhdGUgUHJlZGVjZXNzb3JMaXN0KCkgewotCi0JfQotCi0JcHVibGljIFByZWRlY2Vzc29yTGlzdChBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgT2JqZWN0IG9iamVjdCkgewotCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJZS5lQWRhcHRlcnMoKS5hZGQoMCwgbGlzdGVuZXIpOwotCQlpZiAoIW1hcDRMaW5rVHlwZS5pc0VtcHR5KCkpCi0JCQltYXA0TGlua1R5cGUuY2xlYXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkoKEVPYmplY3QpIGUpLmVBZGFwdGVycygpLnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQkJY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByaWdodCB0b3AgaXRlbSBpbiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSB0cmVlIHRvIHNlYXJjaCBmb3IKLQkgKiBpdGVtIHByb3ZpZGVycyBvZiBwcmVkZWNlc3NvcnMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRUb3BJdGVtKCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqZWN0OwotCQkJaWYgKGl0ZW1Qcm92aWRlci5pc1JlYWRPbmx5KCkpIHsKLQkJCQkvLyB0aGlzIHJlcHJlc2VudHMgYW4gaW5oZXJpdGVkIGJyZWFrZG93biBlbGVtZW50Ci0JCQkJLy8KLQkJCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZSk7Ci0KLQkJCQlPYmplY3QgdG9wID0gaXRlbVByb3ZpZGVyOwotCQkJCWZvciAoT2JqZWN0IHBhcmVudCA9IGl0ZW1Qcm92aWRlci5nZXRQYXJlbnQob2JqZWN0KTsgcGFyZW50ICE9IG51bGw7KSB7Ci0JCQkJCXRvcCA9IHBhcmVudDsKLQkJCQkJQnJlYWtkb3duRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwKLQkJCQkJCQkudW53cmFwKHBhcmVudCk7Ci0JCQkJCVByb2Nlc3MgcGFyZW50UHJvYyA9IFRuZ1V0aWwKLQkJCQkJCQkuZ2V0T3duaW5nUHJvY2VzcyhwYXJlbnRFbGVtZW50KTsKLQkJCQkJaWYgKHBhcmVudFByb2MgIT0gcHJvYykgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCQkJcGFyZW50ID0gKChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHBhcmVudCkKLQkJCQkJCQkJLmdldFBhcmVudChwYXJlbnQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocGFyZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdG9wOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gaXRlbVByb3ZpZGVyLmdldFRvcEl0ZW0oKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJCW9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXJldHVybiBhZGFwdGVyLmdldFRvcEl0ZW0oKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIERlcHRoTGV2ZWxJdGVtUHJvdmlkZXIgewotCQlwcml2YXRlIGludCBkZXB0aExldmVsOwotCQlwcml2YXRlIE9iamVjdCBpdGVtUHJvdmlkZXI7Ci0JCXByaXZhdGUgT2JqZWN0IG9iamVjdDsKLQkJcHJpdmF0ZSBPYmplY3QgZWxlbWVudDsKLQkJCi0JCXByaXZhdGUgRGVwdGhMZXZlbEl0ZW1Qcm92aWRlcihPYmplY3Qgb2JqZWN0LCBpbnQgZGVwdGhMZXZlbCwgT2JqZWN0IGl0ZW1Qcm92aWRlciwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQkJCXRoaXMuZGVwdGhMZXZlbCA9IGRlcHRoTGV2ZWw7Ci0JCQl0aGlzLml0ZW1Qcm92aWRlciA9IGl0ZW1Qcm92aWRlcjsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCX0JCi0JCQotCQlwdWJsaWMgT2JqZWN0IGdldEl0ZW1Qcm92aWRlcigpIHsKLQkJCXJldHVybiBpdGVtUHJvdmlkZXI7Ci0JCX0KLQl9Ci0JCi0Jc3RhdGljIExpc3Q8RGVwdGhMZXZlbEl0ZW1Qcm92aWRlcj4gY3JlYXRlSXRlbVByb3ZpZGVyTGlzdChPYmplY3QgdG9wLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlMaXN0PERlcHRoTGV2ZWxJdGVtUHJvdmlkZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PERlcHRoTGV2ZWxJdGVtUHJvdmlkZXI+KCk7Ci0JCURlcHRoTGV2ZWxBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjxPYmplY3Q+IGl0ZXIgPSBuZXcgRGVwdGhMZXZlbEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yPE9iamVjdD4oCi0JCQkJYWRhcHRlckZhY3RvcnksIHRvcCkgewotCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJdGVyYXRvcjxPYmplY3Q+IGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0JCQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKG8pOyAKLQkJCQkJCWlmKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yIHx8IGUgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkuaXRlcmF0b3IoKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvKTsKLQkJCQkJfQkJCQotCQl9OwotCQlmb3IoOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCWludCBkZXB0aExldmVsID0gaXRlci5nZXREZXB0aExldmVsKCk7Ci0JCQkJT2JqZWN0IGl0ZW1Qcm92aWRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlsaXN0LmFkZChuZXcgRGVwdGhMZXZlbEl0ZW1Qcm92aWRlcihvYmplY3QsIGRlcHRoTGV2ZWwsIGl0ZW1Qcm92aWRlciwgZWxlbWVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZUVsZW1lbnRUb0l0ZW1Qcm92aWRlcnNNYXAoTWFwPE9iamVjdCwgQ29sbGVjdGlvbjxPYmplY3Q+PiBtYXAsIE9iamVjdCBlbGVtZW50LCBPYmplY3QgaXRlbVByb3ZpZGVyKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBpdGVtUHJvdmlkZXJzID0gbWFwLmdldChlbGVtZW50KTsKLQkJaWYoaXRlbVByb3ZpZGVycyA9PSBudWxsKSB7Ci0JCQlpdGVtUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQltYXAucHV0KGVsZW1lbnQsIGl0ZW1Qcm92aWRlcnMpOwotCQl9Ci0JCWl0ZW1Qcm92aWRlcnMuYWRkKGl0ZW1Qcm92aWRlcik7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50OwotCQkJaWYgKHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJaXRlbVByb3ZpZGVycyA9IG1hcC5nZXQodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJCQlpZihpdGVtUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCQkJaXRlbVByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCQltYXAucHV0KHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwgaXRlbVByb3ZpZGVycyk7Ci0JCQkJfQotCQkJCWl0ZW1Qcm92aWRlcnMuYWRkKGl0ZW1Qcm92aWRlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JTWFwPD8sIENvbGxlY3Rpb248T2JqZWN0Pj4gY3JlYXRlQnJlYWtkb3duRWxlbWVudFRvSXRlbVByb3ZpZGVyTWFwKExpc3Q8RGVwdGhMZXZlbEl0ZW1Qcm92aWRlcj4gbGlzdCkgewotCQlPYmplY3QgdG9wID0gZ2V0VG9wSXRlbSgpOwotCQkvLyBmaW5kIHRvcCdzIGl0ZW0gcHJvdmlkZXIKLQkJLy8KLQkJRGVwdGhMZXZlbEl0ZW1Qcm92aWRlciB0b3BJcCA9IG51bGw7Ci0JCWludCBzdGFydEluZGV4ID0gMDsKLQkJZm9yIChEZXB0aExldmVsSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA6IGxpc3QpIHsKLQkJCWlmKGl0ZW1Qcm92aWRlci5vYmplY3QgPT0gdG9wKSB7Ci0JCQkJdG9wSXAgPSBpdGVtUHJvdmlkZXI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdGFydEluZGV4Kys7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0IHRvcElwICE9IG51bGwgOiAiQ291bGQgbm90IGZpbmQgaXRlbSBwcm92aWRlciBvZiB0b3Agb2JqZWN0IGluIHRoZSBnaXZlbiBpdGVtIHByb3ZpZGVyIGxpc3QuIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBmaW5kIHRoZSBpbmRleCBvZiBsYXN0IGl0ZW0gcHJvdmlkZXIgaW4gdGhlIHN1YnRyZWUgb2YgdG9wCi0JCS8vCi0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWludCBsYXN0SW5kZXggPSBzdGFydEluZGV4ICsgMTsKLQkJZm9yICg7IGxhc3RJbmRleCA8IHNpemUgJiYgbGlzdC5nZXQobGFzdEluZGV4KS5kZXB0aExldmVsID4gdG9wSXAuZGVwdGhMZXZlbDsgbGFzdEluZGV4KyspOwkJCi0JCQkKLQkJLy8gY29weSB0aGUgdHJlZSB0byBhIG1hcCBvZiBicmVha2Rvd24gZWxlbWVudCAvIGl0ZW0gcHJvdmlkZXIgZm9yCi0JCS8vIHJldXNlCi0JCS8vCi0JCUhhc2hNYXA8T2JqZWN0LCBDb2xsZWN0aW9uPE9iamVjdD4+IG1hcCA9IG5ldyBIYXNoTWFwPE9iamVjdCwgQ29sbGVjdGlvbjxPYmplY3Q+PigpOwotCQlmb3IgKERlcHRoTGV2ZWxJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyIDogbGlzdC5zdWJMaXN0KHN0YXJ0SW5kZXgsIGxhc3RJbmRleCkpIHsKLQkJCXVwZGF0ZUVsZW1lbnRUb0l0ZW1Qcm92aWRlcnNNYXAobWFwLCBpdGVtUHJvdmlkZXIuZWxlbWVudCwgaXRlbVByb3ZpZGVyLml0ZW1Qcm92aWRlcik7Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0JCi0Jc3RhdGljIE1hcDxPYmplY3QsIENvbGxlY3Rpb248T2JqZWN0Pj4gY3JlYXRlQnJlYWtkb3duRWxlbWVudFRvSXRlbVByb3ZpZGVyTWFwKE9iamVjdCB0b3AsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yPE9iamVjdD4gaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjxPYmplY3Q+KAotCQkJCWFkYXB0ZXJGYWN0b3J5LCB0b3ApIHsKLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8T2JqZWN0PiBnZXRDaGlsZHJlbihPYmplY3QgbykgewotCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAobyk7IAotCQkJCWlmKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yIHx8IGUgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvKTsKLQkJCX0JCQkKLQkJfTsKLQkJCi0JCS8vIGNvcHkgdGhlIHRyZWUgdG8gYSBtYXAgb2YgYnJlYWtkb3duIGVsZW1lbnQgLyBpdGVtIHByb3ZpZGVyIGZvcgotCQkvLyByZXVzZQotCQkvLwotCQlIYXNoTWFwPE9iamVjdCwgQ29sbGVjdGlvbjxPYmplY3Q+PiBtYXAgPSBuZXcgSGFzaE1hcDxPYmplY3QsIENvbGxlY3Rpb248T2JqZWN0Pj4oKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgYmUgPSBUbmdVdGlsLnVud3JhcChvYmopOwotCQkJaWYoYmUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCUlCU0l0ZW1Qcm92aWRlciBpcCA9IChJQlNJdGVtUHJvdmlkZXIpIChvYmogaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIgPyBvYmogOgotCQkJCQlhZGFwdGVyRmFjdG9yeS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcykpOwotCQkJCXVwZGF0ZUVsZW1lbnRUb0l0ZW1Qcm92aWRlcnNNYXAobWFwLCBiZSwgaXApOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlPYmplY3QgdW53cmFwcGVkID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJaWYgKHVud3JhcHBlZCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSB1bndyYXBwZWQ7Ci0JCQlMaXN0IHdvcmtPcmRlcnMgPSBlLmdldExpbmtUb1ByZWRlY2Vzc29yKCk7Ci0JCQlpZiAod29ya09yZGVycy5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuOwotCQkJdG9wID0gZ2V0VG9wSXRlbSgpOwkKLQkJCWluaXRpYWxpemUoY3JlYXRlQnJlYWtkb3duRWxlbWVudFRvSXRlbVByb3ZpZGVyTWFwKHRvcCwgYWRhcHRlckZhY3RvcnkpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShNYXA8PywgQ29sbGVjdGlvbjxPYmplY3Q+PiBtYXApIHsKLQotCQlpZiAoVG5nVXRpbC51bndyYXAob2JqZWN0KSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsCi0JCQkJCS51bndyYXAob2JqZWN0KTsKLQkJCUxpc3Qgd29ya09yZGVycyA9IGUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKTsKLQkJCWlmICh3b3JrT3JkZXJzLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm47Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCB0b3BFbGVtZW50ID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcCh0b3ApOwotCQkJU3RyaW5nIHRvcEdVSUQgPSB0b3BFbGVtZW50LmdldEd1aWQoKTsKLQkJCQotCQkJaW50IG4gPSB3b3JrT3JkZXJzLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQkJV29ya09yZGVyIHdvcmtPcmRlciA9IChXb3JrT3JkZXIpIHdvcmtPcmRlcnMuZ2V0KGkpOwkJCQkJCi0KLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbih3b3JrT3JkZXIuZ2V0TGlua1R5cGUoKS5nZXRMaXRlcmFsKCkpOwotCi0JCQkJQnJlYWtkb3duRWxlbWVudCBwcmVkID0gd29ya09yZGVyLmdldFByZWQoKTsKLQkJCQlDb2xsZWN0aW9uPE9iamVjdD4gaXRlbVByb3ZpZGVycyA9IG1hcC5nZXQocHJlZCk7Ci0JCQkJaWYoaXRlbVByb3ZpZGVycyAhPSBudWxsICYmICFpdGVtUHJvdmlkZXJzLmlzRW1wdHkoKSkgewotCQkJCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSBudWxsOwotCQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eSh3b3JrT3JkZXIsIAotCQkJCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5XT1JLX09SREVSX19QUkVERUNFU1NPUl9QUk9DRVNTX1BBVEgpOwotCQkJCQlpZihwcm9wID09IG51bGwpIHsKLQkJCQkJCS8vIHByZWRlY2Vzc29yIGlzIGxvY2FsIG9yIFdvcmtPcmRlciBpcyBjcmVhdGVkIGJlZm9yZSBzdXBwb3J0IGZvciAnZ3JlZW4nIHByZWRlY2Vzc29yCi0JCQkJCQkvLyBieSBzYXZpbmcgaXRzIHByb2Nlc3MgcGF0aCBpbiBtZXRob2RFbGVtZW50UHJvcGVydHkgb2YgdGhlIHdvcmsgb3JkZXIKLQkJCQkJCS8vCi0JCQkJCQlic0l0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGl0ZW1Qcm92aWRlcnMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlTdHJpbmcgcHJvY1BhdGggPSBwcm9wLmdldFZhbHVlKCk7Ci0JCQkJCQkKLQkJCQkJCS8vIGNhbGN1bGF0ZSB0aGUgcGF0aCBpbiB0aGlzIHByb2Nlc3MKLQkJCQkJCS8vCQkJCQkJCi0JCQkJCQlpbnQgaW5kZXg7Ci0JCQkJCQlTdHJpbmcgZ3VpZCA9IHRvcEdVSUQ7Ci0JCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IHRvcEVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgPyAoKFZhcmlhYmlsaXR5RWxlbWVudCl0b3BFbGVtZW50KS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgOiBudWxsOwotCQkJCQkJZm9yKGluZGV4ID0gcHJvY1BhdGguaW5kZXhPZihndWlkKTsgaW5kZXggPT0gLTEgJiYgYmFzZSAhPSBudWxsOyBpbmRleCA9IHByb2NQYXRoLmluZGV4T2YoZ3VpZCkpIHsKLQkJCQkJCQlpZihiYXNlICE9IG51bGwpIHsKLQkJCQkJCQkJZ3VpZCA9IGJhc2UuZ2V0R3VpZCgpOyAKLQkJCQkJCQkJYmFzZSA9IGJhc2UuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmKGluZGV4ICE9IC0xKSB7Ci0JCQkJCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKHByb2NQYXRoLnN1YnN0cmluZyhpbmRleCArIGd1aWQubGVuZ3RoKCkpKTsKLQkJCQkJCQlPYmplY3QgdG9wT2JqZWN0ID0gdG9wOwotCQkJCQkJCWZvcihXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUgPSB0b3BFbGVtZW50OyB3YmUgIT0gbnVsbDspIHsKLQkJCQkJCQkJc3RyQnVmZi5pbnNlcnQoMCwgd2JlLmdldEd1aWQoKSk7Ci0JCQkJCQkJCXN0ckJ1ZmYuaW5zZXJ0KDAsICcvJyk7Ci0JCQkJCQkJCWlmKHRvcE9iamVjdCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQkJCQl0b3BPYmplY3QgPSB3YmUgPSAoKFdvcmtCcmVha2Rvd25FbGVtZW50KXRvcE9iamVjdCkuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQl0b3BPYmplY3QgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdCh0b3BPYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQkJCQl3YmUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKHRvcE9iamVjdCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJc3RyQnVmZi5pbnNlcnQoMCwgIjovIikuaW5zZXJ0KDAsIFN1cHByZXNzaW9uLldCUyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgcGF0aCA9IHN0ckJ1ZmYudG9TdHJpbmcoKTsKLQkJCQkJCQlmaW5kX3dyYXBwZXI6Ci0JCQkJCQkJZm9yIChPYmplY3QgaXRlbVByb3ZpZGVyIDogaXRlbVByb3ZpZGVycykgewotCQkJCQkJCQlpZihpdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJCQkJU3RyaW5nIHAgPSBTdXBwcmVzc2lvbi5nZXRQYXRoKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgaXRlbVByb3ZpZGVyKTsKLQkJCQkJCQkJCWlmKHBhdGguZXF1YWxzKHApKSB7Ci0JCQkJCQkJCQkJYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBpdGVtUHJvdmlkZXI7Ci0JCQkJCQkJCQkJYnJlYWsgZmluZF93cmFwcGVyOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChic0l0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJCQlhZGQoYnNJdGVtUHJvdmlkZXIpOwotCQkJCQkJbWFwNExpbmtUeXBlLnB1dChic0l0ZW1Qcm92aWRlci5nZXRJZCgpLCB3b3JrT3JkZXIuZ2V0TGlua1R5cGUoKS5nZXRWYWx1ZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJc3VwZXIuY2xlYXIoKTsKLQkJaWYgKCFtYXA0TGlua1R5cGUuaXNFbXB0eSgpKQotCQkJbWFwNExpbmtUeXBlLmNsZWFyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaCgpIHsKLQkJY2xlYXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQkKLQl2b2lkIHJlZnJlc2goTGlzdDxEZXB0aExldmVsSXRlbVByb3ZpZGVyPiBsaXN0KSB7Ci0JCWNsZWFyKCk7Ci0JCWluaXRpYWxpemUoY3JlYXRlQnJlYWtkb3duRWxlbWVudFRvSXRlbVByb3ZpZGVyTWFwKGxpc3QpKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uI3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdG9VblN1cHByZXNzZWRTdHJpbmcobnVsbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1VuU3VwcHJlc3NlZFN0cmluZyhTdXBwcmVzc2lvbiBzdXApIHsKLQkJLy8gcmVtb3ZlIHRoZSBpdGVtIHByb3ZpZGVycyBvZiB0aGUgZGVsZXRlZCBlbGVtZW50cwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJZSA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgZSkuZ2V0VGFyZ2V0KCk7Ci0JCQkJaWYgKGUgPT0gbnVsbCkgewotCQkJCQkvLyBvYmplY3QgZGVsZXRlZAotCQkJCQkvLwotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCUJyZWFrZG93bkVsZW1lbnQgYmUgPSAoQnJlYWtkb3duRWxlbWVudCkgZTsKLQkJCQlBY3Rpdml0eSBzdXBlckFjdCA9IGJlLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCWlmIChzdXBlckFjdCA9PSBudWxsICYmIFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhiZSkgIT0gYmUpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaXNFbXB0eSgpKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IG4gPSBzaXplKCkgLSAxOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0KGkpOwotCQkJaWYgKChzdXAgPT0gbnVsbCkgfHwgIXN1cC5pc1N1cHByZXNzZWQoYnNJdGVtUHJvdmlkZXIpKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZChic0l0ZW1Qcm92aWRlci5nZXRJZCgpKS5hcHBlbmQoJywnKTsJCQkJCi0JCQl9Ci0JCX0KLQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0KG4pOwotCQlpZiAoKHN1cCA9PSBudWxsKSB8fCAhc3VwLmlzU3VwcHJlc3NlZChic0l0ZW1Qcm92aWRlcikpIHsKLQkJCXN0ckJ1Zi5hcHBlbmQoYnNJdGVtUHJvdmlkZXIuZ2V0SWQoKSk7Ci0JCX0KLQotCQlyZXR1cm4gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9VblN1cHByZXNzZWRTdHJpbmcoU3VwcHJlc3Npb24gc3VwLCBib29sZWFuIGlzTGlua1R5cGVSZXF1aXJlZCkgewotCQkvLyByZW1vdmUgdGhlIGl0ZW0gcHJvdmlkZXJzIG9mIHRoZSBkZWxldGVkIGVsZW1lbnRzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQllID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBlKS5nZXRUYXJnZXQoKTsKLQkJCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQkJCS8vIG9iamVjdCBkZWxldGVkCi0JCQkJCS8vCi0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBiZSA9IChCcmVha2Rvd25FbGVtZW50KSBlOwotCQkJCUFjdGl2aXR5IHN1cGVyQWN0ID0gYmUuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQkJaWYgKHN1cGVyQWN0ID09IG51bGwgJiYgVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGJlKSAhPSBiZSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChpc0VtcHR5KCkpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbiA9IHNpemUoKSAtIDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXQoaSk7Ci0JCQlpZiAoKHN1cCA9PSBudWxsKSB8fCAhc3VwLmlzU3VwcHJlc3NlZChic0l0ZW1Qcm92aWRlcikpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKGJzSXRlbVByb3ZpZGVyLmdldElkKCkpOwotCQkJICAgIE9iamVjdCB2YWx1ZSA9IG1hcDRMaW5rVHlwZS5nZXQoYnNJdGVtUHJvdmlkZXIuZ2V0SWQoKSk7Ci0JCQkgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgaXNMaW5rVHlwZVJlcXVpcmVkKSB7Ci0JCQkgICAgCWludCB2ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZS50b1N0cmluZygpKTsKLQkJCSAgICAJU3RyaW5nIGFiYnJldiA9IHRvV29ya09yZGVyVHlwZUFiYnJldmlhdGlvbih2KTsKLQkJCSAgICAJaWYoYWJicmV2ICE9IG51bGwpIHsKLQkJCSAgICAJCXN0ckJ1Zi5hcHBlbmQoYWJicmV2KTsKLQkJCSAgICAJfQotCQkJICAgIH0KLQkJCQlzdHJCdWYuYXBwZW5kKCcsJyk7Ci0JCQl9Ci0JCX0KLQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0KG4pOwotCQlpZiAoKHN1cCA9PSBudWxsKSB8fCAhc3VwLmlzU3VwcHJlc3NlZChic0l0ZW1Qcm92aWRlcikpIHsKLQkJCXN0ckJ1Zi5hcHBlbmQoYnNJdGVtUHJvdmlkZXIuZ2V0SWQoKSk7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbihtYXA0TGlua1R5cGUuZ2V0KGJzSXRlbVByb3ZpZGVyLmdldElkKCkpKTsKLQkJCU9iamVjdCB2YWx1ZSA9IG1hcDRMaW5rVHlwZS5nZXQoYnNJdGVtUHJvdmlkZXIuZ2V0SWQoKSk7Ci0JCSAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiBpc0xpbmtUeXBlUmVxdWlyZWQpIHsKLQkJICAgIAlpbnQgdiA9IEludGVnZXIucGFyc2VJbnQodmFsdWUudG9TdHJpbmcoKSk7Ci0JCSAgICAJU3RyaW5nIGFiYnJldiA9IHRvV29ya09yZGVyVHlwZUFiYnJldmlhdGlvbih2KTsKLQkJICAgIAlpZihhYmJyZXYgIT0gbnVsbCkgewotCQkgICAgCQlzdHJCdWYuYXBwZW5kKGFiYnJldik7Ci0JCSAgICAJfQotCQkgICAgfQotCQl9Ci0KLQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJlcGFyZVVwZGF0ZVByZWRlY2Vzc29ycyhBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgV29ya0JyZWFrZG93bkVsZW1lbnQgd2JlLAotCQkJTGlzdDxPYmplY3Q+IHByZWRlY2Vzc29ycywgTGlzdDxXb3JrT3JkZXI+IGFkZExpc3QsIExpc3Q8V29ya09yZGVyPiBwcmVkVG9CZURlbGV0ZWQpIHsKLQkJV29ya09yZGVyIHdvID0gbnVsbDsKLQkJaW50IHNpemUgPSB3YmUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5zaXplKCk7Ci0JCQotCQkvLyByZW1vdmUgV29ya09yZGVycyBmb3IgcHJlZGVjZXNzb3JzIHRoYXQgYXJlIG5vdCBpbiBwcmVkZWNlc3NvciBsaXN0IGFuZCBhY2NlcHRlZCBieSB0aGUgZmlsdGVyCi0JCS8vCi0JCUlGaWx0ZXIgZmlsdGVyID0gUHJvY2Vzc1V0aWwuZ2V0RmlsdGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJYm9vbGVhbiBudWxsRmlsdGVyID0gZmlsdGVyID09IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHdiZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJd28gPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCWlmICgobnVsbEZpbHRlciB8fCBmaWx0ZXIuYWNjZXB0KHdvLmdldFByZWQoKSkpKSB7Ci0JCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCWZpbmRfcHJlZDoJCQkJCQkKLQkJCQlmb3IoT2JqZWN0IHByZWQgOiBwcmVkZWNlc3NvcnMpIHsKLQkJCQkJaWYocHJlZCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQlpZih3by5nZXRQcmVkKCkgPT0gcHJlZCkgewotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBmaW5kX3ByZWQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihwcmVkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCWlmKGlzUHJlZGVjZXNzb3IoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBwcmVkLCB3bykpIHsKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZmluZF9wcmVkOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKCFmb3VuZCkgewotCQkJCQlwcmVkVG9CZURlbGV0ZWQuYWRkKHdvKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlzaXplID0gcHJlZGVjZXNzb3JzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBwcmVkZWNlc3NvcnMuZ2V0KGkpOwotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAob2JqKTsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIChvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciA/IG9iaiA6IG51bGwpOwotCQkJU3RyaW5nIHByb2NQYXRoID0gbnVsbDsKLQkJCWZpbmRfcHJlZDogZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHdiZQotCQkJCQkuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCXdvID0gKFdvcmtPcmRlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmICh3by5nZXRQcmVkKCkgPT0gZWxlbWVudCkgewotCQkJCQlpZih3cmFwcGVyICE9IG51bGwpIHsKLQkJCQkJCWlmKGlzUHJlZGVjZXNzb3Iod3JhcHBlciwgd28pKSB7Ci0JCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGZpbmRfcHJlZDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIHRoZSBwcmVkZWNlc3NvciBpcyBsb2NhbCwgbm8gbmVlZCB0byBsb29rIGZvciB3cmFwcGVyCi0JCQkJCQkvLwotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJYnJlYWsgZmluZF9wcmVkOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFmb3VuZCkgewkJCQkJCi0JCQkJd28gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrT3JkZXIoKTsKLQkJCQl3by5zZXRQcmVkKGVsZW1lbnQpOwotCQkJCWlmKHdyYXBwZXIgIT0gbnVsbCkgewotCQkJCQlpZihwcm9jUGF0aCA9PSBudWxsKSB7Ci0JCQkJCQlwcm9jUGF0aCA9IFN1cHByZXNzaW9uLmdldFBhdGgod3JhcHBlcik7Ci0JCQkJCX0KLQkJCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLnNldFByb3BlcnR5KHdvLCBNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuV09SS19PUkRFUl9fUFJFREVDRVNTT1JfUFJPQ0VTU19QQVRILCBwcm9jUGF0aCk7Ci0JCQkJfQotCQkJCWFkZExpc3QuYWRkKHdvKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogUGFyc2VzIGEgY29tbWFuZC1zZXBhcmF0ZWQgbGlzdCBvZiBwcmVkZWNlc3NvciBpbmRleGVzIGludG8gbGlzdHMgb2YKLQkgKiBwcmVkZWNlc3NvcnNzIHRvIGJlIGFkZGVkIGFuZCBkZWxldGVkIGZvciB1cGRhdGUuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHdiZQotCSAqIEBwYXJhbSBpbmRleExpc3QKLQkgKiAgICAgICAgICAgIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcHJlZGVjZXNzb3IgaW5kZXhlcwotCSAqIEBwYXJhbSBhZGRMaXN0Ci0JICogQHBhcmFtIHByZWRUb0JlRGVsZXRlZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJlcGFyZVVwZGF0ZVByZWRlY2Vzc29ycygKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUsCi0JCQlTdHJpbmcgaW5kZXhMaXN0LCBMaXN0PFdvcmtPcmRlcj4gYWRkTGlzdCwgTGlzdDxXb3JrT3JkZXI+IHByZWRUb0JlRGVsZXRlZCkgewotCQlQcm9jZXNzIHByb2Nlc3MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Mod2JlKTsKLQkJTGlzdDxPYmplY3Q+IHByZWRlY2Vzc29ycyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlpZiAoUHJvY2Vzc1V0aWwuY2hlY2tQcmVkZWNlc3Nvckxpc3Qod2JlLCBpbmRleExpc3QsIGFkYXB0ZXJGYWN0b3J5LAotCQkJCXByb2Nlc3MsIHByZWRlY2Vzc29ycykgPT0gbnVsbCkgewotCQkJcmV0dXJuIHByZXBhcmVVcGRhdGVQcmVkZWNlc3NvcnMoYWRhcHRlckZhY3RvcnksIHdiZSwgcHJlZGVjZXNzb3JzLCBhZGRMaXN0LCBwcmVkVG9CZURlbGV0ZWQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1dvcmtPcmRlclR5cGVBYmJyZXZpYXRpb24oaW50IHdvcmtPcmRlclR5cGUpIHsKLQkJc3dpdGNoKHdvcmtPcmRlclR5cGUpIHsKLQkJY2FzZSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0hfVkFMVUU6Ci0JCQlyZXR1cm4gRklOSVNIX1RPX0ZJTklTSDsKLQkJY2FzZSBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX0ZJTklTSF9WQUxVRToKLQkJCXJldHVybiBTVEFSVF9UT19GSU5JU0g7Ci0JCWNhc2UgV29ya09yZGVyVHlwZS5TVEFSVF9UT19TVEFSVF9WQUxVRToKLQkJCXJldHVybiBTVEFSVF9UT19TVEFSVDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB3cmFwcGVyIGlzIGEgcHJlZGVjZXNzb3IgZGVmaW5lZCBieSB0aGUgZ2l2ZW4gV29ya09yZGVyLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHBhcmFtIHdvcmtPcmRlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcmVkZWNlc3NvcihCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyLCBXb3JrT3JkZXIgd29ya09yZGVyKSB7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5KHdvcmtPcmRlciwgCi0JCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLldPUktfT1JERVJfX1BSRURFQ0VTU09SX1BST0NFU1NfUEFUSCk7Ci0JCWlmKHByb3AgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIHByb2NQYXRoID0gcHJvcC5nZXRWYWx1ZSgpOwotCQkJU3RyaW5nIHAgPSBTdXBwcmVzc2lvbi5nZXRQYXRoKHdyYXBwZXIpOwotCQkJcmV0dXJuIHByb2NQYXRoLmVxdWFscyhwKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Qcm9jZXNzVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1Byb2Nlc3NVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MjE4MDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1Byb2Nlc3NVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdGlvbkFwcGxpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkNvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkRlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Db3B5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlByb2Nlc3NDb21tYW5kVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Qcm9jZXNzRGVlcENvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLldCU0Ryb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5QcmVkZWNlc3Nvckxpc3QuRGVwdGhMZXZlbEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uTmFtZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRoYXQgZGVmaW5lcyBzdGF0aWMgbWV0aG9kcyBmb3IgcHJvY2VzcyBhdXRob3JpbmcKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9jZXNzVXRpbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxFQ2xhc3M+IE9CU0VjbGFzc2VzID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248RUNsYXNzPiBXQlNFY2xhc3NlcyA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPEVDbGFzcz4gUEJTRWNsYXNzZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxWYXJpYWJpbGl0eVR5cGU+IGV4dGVuZEFuZExvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHlUeXBlcyA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPFZhcmlhYmlsaXR5VHlwZT4gZ2V0RXh0ZW5kQW5kTG9jYWxDb250cmlidXRpb25WYXJpYWJpbGl0eVR5cGVzKCkgewotCQlpZiAoZXh0ZW5kQW5kTG9jYWxDb250cmlidXRpb25WYXJpYWJpbGl0eVR5cGVzID09IG51bGwpIHsKLQkJCWV4dGVuZEFuZExvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHlUeXBlcyA9IG5ldyBBcnJheUxpc3Q8VmFyaWFiaWxpdHlUeXBlPigpOwotCQkJZXh0ZW5kQW5kTG9jYWxDb250cmlidXRpb25WYXJpYWJpbGl0eVR5cGVzCi0JCQkJCS5hZGQoVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpOwotCQkJZXh0ZW5kQW5kTG9jYWxDb250cmlidXRpb25WYXJpYWJpbGl0eVR5cGVzCi0JCQkJCS5hZGQoVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTik7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuZEFuZExvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHlUeXBlczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0JyZWFrZG93bkVsZW1lbnROYW1lKAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIEJyZWFrZG93bkVsZW1lbnQgZSwgU3RyaW5nIG5hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCXJldHVybiBOYW1lQ2hlY2tlci5jaGVja05hbWUoYWRhcHRlckZhY3RvcnksIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCksIG5hbWUsIHN1cHByZXNzaW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tCcmVha2Rvd25FbGVtZW50TmFtZSgKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBCcmVha2Rvd25FbGVtZW50IGUsIFN0cmluZyBuYW1lLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgYm9vbGVhbiBpZ25vcmVTdXBwcmVzc2VkKSB7Ci0JCXJldHVybiBOYW1lQ2hlY2tlci5jaGVja05hbWUoYWRhcHRlckZhY3RvcnksIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCksIG5hbWUsIHN1cHByZXNzaW9uLCBpZ25vcmVTdXBwcmVzc2VkKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIEJyZWFrZG93bkVsZW1lbnQgZSwgU3RyaW5nIG5hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCS8vIG1pZ2h0IGFsbG93IGVtcHR5IHByZXNlbnRhdGlvbiBuYW1lIGZvciBleHRlbmRlciBvciBjb250cmlidXRvci4gVGhlIGVsZW1lbnQgd2lsbCBpbmhlcml0Ci0JCS8vIHRoZSBwcmVzZW50YXRpb24gbmFtZSBmcm9tIHRoZSBiYXNlIGVsZW1lbnQuIENoZWNrIHdpbGwgYmUgcGVyZm9ybWVkIG9uIHRoZSBpbmhlcml0ZWQgbmFtZQotCQkvLwotCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJaWYgKGlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKGUpKSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBiYXNlID0gKEJyZWFrZG93bkVsZW1lbnQpICgoVmFyaWFiaWxpdHlFbGVtZW50KSBlKQotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQluYW1lID0gZ2V0UHJlc2VudGF0aW9uTmFtZShiYXNlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gTmFtZUNoZWNrZXIuY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwgbmFtZSwgc3VwcHJlc3Npb24pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIEJyZWFrZG93bkVsZW1lbnQgZSwgU3RyaW5nIG5hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uLCBib29sZWFuIGlnbm9yZVN1cHByZXNzZWQpIHsKLQotCQlyZXR1cm4gTmFtZUNoZWNrZXIuY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwgbmFtZSwgc3VwcHJlc3Npb24sIGlnbm9yZVN1cHByZXNzZWQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFJvb3RQcm9jZXNzKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyLCBPYmplY3Qgb2JqKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChvYmopOwotCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHBhcmVudCwKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBvYmo7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZ2V0Um9vdFByb2Nlc3MoYWRhcHRlckZhY3RvcnksIGFkYXB0ZXIsIHBhcmVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248RUNsYXNzPiBnZXRXQlNFY2xhc3NlcygpIHsKLQkJaWYgKFdCU0VjbGFzc2VzID09IG51bGwpIHsKLQkJCVdCU0VjbGFzc2VzID0gbmV3IEhhc2hTZXQ8RUNsYXNzPigpOwotCQkJV0JTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yKCkpOwotCQkJV0JTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCkpOwotCQkJV0JTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1pbGVzdG9uZSgpKTsKLQkJfQotCQlyZXR1cm4gV0JTRWNsYXNzZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPEVDbGFzcz4gZ2V0T0JTRWNsYXNzZXMoKSB7Ci0JCWlmIChPQlNFY2xhc3NlcyA9PSBudWxsKSB7Ci0JCQlPQlNFY2xhc3NlcyA9IG5ldyBIYXNoU2V0PEVDbGFzcz4oKTsKLQkJCU9CU0VjbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcigpKTsKLQkJCU9CU0VjbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpKTsKLQkJCU9CU0VjbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNaWxlc3RvbmUoKSk7Ci0JCQlPQlNFY2xhc3Nlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGUoKSk7Ci0JCQlPQlNFY2xhc3Nlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9zaXRlUm9sZSgpKTsKLQkJfQotCi0JCXJldHVybiBPQlNFY2xhc3NlczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248RUNsYXNzPiBnZXRQQlNFY2xhc3NlcygpIHsKLQkJaWYgKFBCU0VjbGFzc2VzID09IG51bGwpIHsKLQkJCVBCU0VjbGFzc2VzID0gbmV3IEhhc2hTZXQ8RUNsYXNzPigpOwotCQkJUEJTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKTsKLQkJCVBCU0VjbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpKTsKLQkJCVBCU0VjbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNaWxlc3RvbmUoKSk7Ci0JCX0KLQkJcmV0dXJuIFBCU0VjbGFzc2VzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZpcnN0RWxlbWVudChBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgaXRlbVByb3ZpZGVyLCBPYmplY3Qgb2JqKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KG9iaik7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkKLQkJCXJldHVybiB0cnVlOwotCQlMaW5rZWRMaXN0IHNpYmxpbmdzID0gZ2V0U2libGluZ3MoYWRhcHRlckZhY3RvcnksIGl0ZW1Qcm92aWRlciwgb2JqKTsKLQkJaWYgKHNpYmxpbmdzICE9IG51bGwgJiYgIXNpYmxpbmdzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHNpYmxpbmdzLmdldEZpcnN0KCkgPT0gb2JqOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlua2VkTGlzdCBnZXRTaWJsaW5ncyhBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgaXRlbVByb3ZpZGVyLCBPYmplY3Qgb2JqKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KG9iaik7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgcGFyZW50SXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAocGFyZW50SXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgTGlua2VkTGlzdChwYXJlbnRJdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGFzdEVsZW1lbnQoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGl0ZW1Qcm92aWRlciwgT2JqZWN0IG9iaikgewotCQlPYmplY3QgcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChvYmopOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJTGlua2VkTGlzdCBzaWJsaW5ncyA9IGdldFNpYmxpbmdzKGFkYXB0ZXJGYWN0b3J5LCBpdGVtUHJvdmlkZXIsIG9iaik7Ci0JCWlmIChzaWJsaW5ncyAhPSBudWxsICYmICFzaWJsaW5ncy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBzaWJsaW5ncy5nZXRMYXN0KCkgPT0gb2JqOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgZWxlbWVudHMgdGhhdCBoYXZlIGJlZW4gYWZmZWN0ZWQgYWZ0ZXIgdGhlIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZQotCSAqIGdpdmVuIG5vdGlmaWNhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCi0JICogQHBhcmFtIGZpbHRlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWZmZWN0ZWRFbGVtZW50cyhOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLAotCQkJSUZpbHRlciBmaWx0ZXIpIHsKLQkJTGlzdCBhZmZlY3RlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQlPYmplY3Qgb2JqID0gbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChvYmopKSB7Ci0JCQkJYWZmZWN0ZWRFbGVtZW50cy5hZGQob2JqKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KGVsZW1lbnQpKSB7Ci0JCQkJCWFmZmVjdGVkRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQlvYmogPSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKTsKLQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KG9iaikpIHsKLQkJCQlhZmZlY3RlZEVsZW1lbnRzLmFkZChvYmopOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQoZWxlbWVudCkpIHsKLQkJCQkJYWZmZWN0ZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBOb3RpZmljYXRpb24uTU9WRToKLQkJCW9iaiA9IG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG9iaikuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQoZWxlbWVudCkpIHsKLQkJCQkJCWFmZmVjdGVkRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChvYmopKSB7Ci0JCQkJCWFmZmVjdGVkRWxlbWVudHMuYWRkKG9iaik7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGFmZmVjdGVkRWxlbWVudHM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVmcmVzaFJlcXVpcmVkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sCi0JCQlJRmlsdGVyIGZpbHRlcikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQ6Ci0JCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCU9iamVjdCBvYmogPSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KG9iaikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQlvYmogPSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKTsKLQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KG9iaikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgTm90aWZpY2F0aW9uLk1PVkU6Ci0JCQlvYmogPSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBvYmopLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KGVsZW1lbnQpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQob2JqKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkVG9Db250YWluZXIoQnJlYWtkb3duRWxlbWVudCBlLAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBpdGVtUHJvdmlkZXIpIHsKLQkJYWRkVG9Db250YWluZXIoZSwgaXRlbVByb3ZpZGVyLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBCcmVha2Rvd25FbGVtZW50IHRvIGEgbmV3IGNvbnRhaW5lciBpZiBpdCBkb2VzIG5vdCBoYXZlCi0JICogb25lIG9yIG1vdmVzIGl0IHRvIHRoZSByaWdodCBjb250YWluZXIgaWYgcmVxdWVzdGVkLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUb0NvbnRhaW5lcihCcmVha2Rvd25FbGVtZW50IGUsCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGl0ZW1Qcm92aWRlciwgYm9vbGVhbiBtb3ZlKSB7Ci0JCVByb2Nlc3NQYWNrYWdlIHBrZyA9IG51bGw7Ci0JCU9iamVjdCBwYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KGUpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBjb250YWluZXIgPSAoKEVPYmplY3QpIHBhcmVudCkuZUNvbnRhaW5lcigpOwotCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBjb250YWluZXI7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocGtnID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZTsKLQkJCWlmIChhY3QuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkvLyBjcmVhdGUgbmV3IFByb2Nlc3NQYWNrYWdlIGZvciB0aGUgYWN0aXZpdHkKLQkJCQkvLwotCQkJCVByb2Nlc3NQYWNrYWdlIG5ld1BrZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJCQluZXdQa2cuc2V0TmFtZShhY3QuZ2V0TmFtZSgpKTsKLQkJCQlwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChuZXdQa2cpOwotCQkJCW5ld1BrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoZSk7Ci0JCQl9IGVsc2UgaWYgKG1vdmUpIHsKLQkJCQkvLyBDaGVjayBpZiB0aGUgYWN0aXZpdHkncyBQcm9jZXNzUGFja2FnZSBpcyBhdCB0aGUgcmlnaHQgcGxhY2UuCi0JCQkJLy8gSWYgbm90LCBtb3ZlIGl0IHRvIHRoZSByaWdodCBQcm9jZXNzQ29tcG9uZW50LgotCQkJCS8vCi0JCQkJUHJvY2Vzc1BhY2thZ2Ugb2xkUGtnID0gKFByb2Nlc3NQYWNrYWdlKSBhY3QuZUNvbnRhaW5lcigpOwotCQkJCWlmIChvbGRQa2cuZUNvbnRhaW5lcigpICE9IHBrZykgewotCQkJCQlwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChvbGRQa2cpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChlLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChlKTsKLQkJCX0gZWxzZSBpZiAobW92ZSAmJiBlLmVDb250YWluZXIoKSAhPSBwa2cpIHsKLQkJCQkvLyBtb3ZlIHRvIG5ldyBQcm9jZXNzUGFja2FnZQotCQkJCS8vCi0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IGNoaWxkLCBPYmplY3QgcGFyZW50LAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChjaGlsZCwKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJKChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudChwYXJlbnQpOwotCQl9IAotLy8JCWVsc2UgewotLy8JCQlTeXN0ZW0ub3V0Ci0vLwkJCQkJLnByaW50bG4oTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2V0cGFyZW50ICsgY2hpbGQpOyAvLyROT04tTkxTLTEkCi0vLwkJCVN5c3RlbS5vdXQKLS8vCQkJCQkucHJpbnRsbihMaWJyYXJ5RWRpdFJlc291cmNlcy51dGlsX1Byb2Nlc3NVdGlsX2NoaWxkYWRhcHRlciArIGFkYXB0ZXIpOyAvLyROT04tTkxTLTEkCi0vLwkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgUm9sZURlc2NyaXB0b3IgZnJvbSB0aGUgZ2l2ZW4gcm9sZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm9sZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJvbGVEZXNjcmlwdG9yIGNyZWF0ZVJvbGVEZXNjcmlwdG9yKFJvbGUgcm9sZSkgewotCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKCk7Ci0JCXJvbGVEZXNjLnNldFJvbGUocm9sZSk7Ci0JCVN0cmluZyBwcmVzZW50YXRpb25OYW1lID0gcm9sZS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCXJvbGVEZXNjLnNldE5hbWUocm9sZS5nZXROYW1lKCkpOwotCQlyb2xlRGVzYy5zZXRQcmVzZW50YXRpb25OYW1lKFN0clV0aWwuaXNCbGFuayhwcmVzZW50YXRpb25OYW1lKSA/IHJvbGUKLQkJCQkuZ2V0TmFtZSgpIDogcHJlc2VudGF0aW9uTmFtZSk7Ci0JCS8vIHJvbGVEZXNjLnNldEJyaWVmRGVzY3JpcHRpb24ocm9sZS5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCQlyZXR1cm4gcm9sZURlc2M7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3IgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKAotCQkJV29ya1Byb2R1Y3Qgd3ApIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpOwotCQl3cERlc2Muc2V0V29ya1Byb2R1Y3Qod3ApOwotCQl3cERlc2Muc2V0TmFtZSh3cC5nZXROYW1lKCkpOwotCQl3cERlc2MKLQkJCQkuc2V0UHJlc2VudGF0aW9uTmFtZShTdHJVdGlsLmlzQmxhbmsod3AuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKSA/IHdwCi0JCQkJCQkuZ2V0TmFtZSgpCi0JCQkJCQk6IHdwLmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCS8vIHdwRGVzYy5zZXRCcmllZkRlc2NyaXB0aW9uKHdwLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCXJldHVybiB3cERlc2M7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlZnJlc2hOZWVkZWQoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlcikgewotCQlyZXR1cm4gVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucmVmcmVzaE5lZWRlZChhZGFwdGVyRmFjdG9yeSwgaXRlbVByb3ZpZGVyKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hQcmVkZWNjZXNzb3JMaXN0cyhBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBQcm9jZXNzIHByb2MpIHsKLQkJTGlzdDxEZXB0aExldmVsSXRlbVByb3ZpZGVyPiBsaXN0ID0gUHJlZGVjZXNzb3JMaXN0LmNyZWF0ZUl0ZW1Qcm92aWRlckxpc3QocHJvYywgZmFjdG9yeSk7Ci0JCWZvciAoRGVwdGhMZXZlbEl0ZW1Qcm92aWRlciBpcCA6IGxpc3QpIHsKLQkJCU9iamVjdCBpdGVtUHJvdmlkZXIgPSBpcC5nZXRJdGVtUHJvdmlkZXIoKTsKLQkJCWlmKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCVByZWRlY2Vzc29yTGlzdCBwcmVkTGlzdCA9ICgoSUJTSXRlbVByb3ZpZGVyKWl0ZW1Qcm92aWRlcikuZ2V0UHJlZGVjZXNzb3JzKCk7Ci0JCQkJaWYocHJlZExpc3QgIT0gbnVsbCkgewotCQkJCQlwcmVkTGlzdC5yZWZyZXNoKGxpc3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGVzIElEcyBvZiB3b3JrIGJyZWFrZG93biBlbGVtZW50cyBvZiB0aGUgdmlldyBvZiB0aGUgZ2l2ZW4gcHJvY2VzcwotCSAqIAotCSAqIEBwYXJhbSBmYWN0b3J5Ci0JICogICAgICAgICAgICBhZGFwdGVyIGZhY3Rvcnkgb2YgdGhlIGN1cnJlbnQgcHJvY2VzcyB2aWV3IChXQlMsIFRCUywgV1BCUywKLQkgKiAgICAgICAgICAgIENCUykKLQkgKiBAcGFyYW0gcHJvYwotCSAqICAgICAgICAgICAgbXVzdCBiZSByZWZyZXNoZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUlEcyhBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBQcm9jZXNzIHByb2MpIHsKLQkJQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I8T2JqZWN0PiBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yPE9iamVjdD4oCi0JCQkJZmFjdG9yeSwgcHJvYykgewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxPYmplY3Q+IGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChvKTsgCi0JCQkJaWYoZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IgfHwgZSBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG8pOwotCQkJfQkJCQotCQl9OwotCi0JCU9iamVjdCBvYmo7Ci0JCWZvciAoaW50IGlkID0gMDsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlvYmogPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBhZGFwdGVyID0gZmFjdG9yeS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQkJCWlmIChpdGVtUHJvdmlkZXIgIT0gbnVsbAotCQkJCQkJJiYgVG5nVXRpbC51bndyYXAob2JqKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCWl0ZW1Qcm92aWRlci5zZXRJZChpZCsrKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFZpZXdlcihBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBQcm9jZXNzIHByb2MpIHsKLQkJVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucmVmcmVzaFZpZXdlcihmYWN0b3J5LCBwcm9jKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhlIGVsZW1lbnQgSURzIGluIHRob3NlIHZpZXdlcnMgdGhhdCByZXF1aXJlIHRoaXMuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hJRHNJblZpZXdlcnMoZmluYWwgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJlZnJlc2hJRHNJblZpZXdlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hBbGxWaWV3ZXJzKGZpbmFsIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5yZWZyZXNoQWxsVmlld2VycyhhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICB0aGUgYnJlYWtkb3duIGVsZW1lbnQgd2hvc2UgcHJlZGVjZXNzb3IgbGlzdCB0byBiZSBjaGVja2VkLgotCSAqIEBwYXJhbSBwcmVkSWRMaXN0Ci0JICogICAgICAgICAgICBhIGxpc3Qgb2YgcHJlZGVjZXNzb3IgSURzIChJbnRlZ2VyKSBhcyBzaG93biBpbiB0aGUgSUQgY29sdW1uCi0JICogICAgICAgICAgICBvZiB0aGUgZWRpdG9yCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiBAcGFyYW0gcHJlZGVjZXNzb3JzCi0JICogICAgICAgICAgICBvdXRwdXQsIHRoZSBwcmVkZWNlc3NvciBsaXN0Ci0JICogQHJldHVybiBudWxsIGlmIHByZWRMaXN0IGlzIHZhbGlkLCBhbiBlcnJvciBtZXNzYWdlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrUHJlZGVjZXNzb3JMaXN0KFdvcmtCcmVha2Rvd25FbGVtZW50IGUsCi0JCQlMaXN0PEludGVnZXI+IHByZWRJZExpc3QsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBPYmplY3QgcHJvY2VzcywKLQkJCUxpc3Q8T2JqZWN0PiBwcmVkZWNlc3NvcnMpIHsKLQkJLy8gZ2V0IEJyZWFrZG93bkVsZW1lbnQgbGlzdCBmcm9tIElEIGxpc3QKLQkJLy8KLQkJTGlzdDxPYmplY3Q+IGJlTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlMaXN0PE9iamVjdD4gYWxsRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I8T2JqZWN0PihhZGFwdGVyRmFjdG9yeSwKLQkJCQlwcm9jZXNzKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KG9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCUludGVnZXIgaWQgPSBuZXcgSW50ZWdlcihpdGVtUHJvdmlkZXIuZ2V0SWQoKSk7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0JCQlhbGxFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQlpZiAocHJlZElkTGlzdC5jb250YWlucyhpZCkpIHsKLQkJCQliZUxpc3QuYWRkKG9iaik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeQotCQkvLwotCQlpbnQgc2l6ZSA9IGJlTGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoYmVMaXN0LmdldChpKSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBvYmo7Ci0JCQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQ2lyY3VsYXIoZSwgcHJlZCwgYWxsRWxlbWVudHMpKSB7Ci0JCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy51dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX2JyZWFrZG93bl9lbGVtZW50OyAKLQkJCQl9Ci0JCQkJaWYgKFRuZ1V0aWwuaXNTdWJlbGVtZW50T2YocHJlZCwgZSwgYWRhcHRlckZhY3RvcnkpKSB7Ci0JCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy51dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX3N1Yl9lbGVtZW50OyAKLQkJCQl9Ci0JCQkJaWYgKFRuZ1V0aWwuaXNTdXBlckVsZW1lbnRPZihwcmVkLCBlLCBhZGFwdGVyRmFjdG9yeSkpIHsKLQkJCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfUHJvY2Vzc1V0aWxfZXJyX2NoaWxkX2VsZW1lbnQ7IAotCQkJCX0KLQkJCX0gZWxzZQotCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy51dGlsX1Byb2Nlc3NVdGlsX2Vycl93cm9uZ19lbGVtZW50OyAKLQkJfQotCi0JCWlmIChwcmVkZWNlc3NvcnMgIT0gbnVsbCkKLQkJCXByZWRlY2Vzc29ycy5hZGRBbGwoYmVMaXN0KTsKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeQotCSAqIAotCSAqIEBwYXJhbSBzdWNjZXNzb3IKLQkgKiBAcGFyYW0gcHJlZGVjZXNzb3IKLQkgKiBAcGFyYW0gbGlzdAotCSAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgYWxsIGJyZWFrZG93biBlbGVtZW50cyBpbiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZQotCSAqLwotCSBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tDaXJjdWxhcihXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjZXNzb3IsCi0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkZWNlc3NvciwgTGlzdCBsaXN0KSB7Ci0JCWlmIChzdWNjZXNzb3IgPT0gcHJlZGVjZXNzb3IpIHsKLQkJCWlmIChwcmVkZWNlc3Nvci5nZXRJc1JlcGVhdGFibGUoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IHByZWRlY2Vzc29yLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlXb3JrT3JkZXIgZWxlbWVudCA9IChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpOwotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IGVsZW1lbnQuZ2V0UHJlZCgpOwotCQkJaWYgKHByZWQgIT0gcHJlZGVjZXNzb3IgJiYgbGlzdC5jb250YWlucyhwcmVkKSkgewotCQkJCWlmIChjaGVja0NpcmN1bGFyKHN1Y2Nlc3NvciwgcHJlZCwgbGlzdCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JIAotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRBbGxQcmVkZWNlc3Nvckxpc3QoV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZGVjZXNzb3IsCi0JCQlMaXN0IGxpc3QsIExpc3QgcHJlZExpc3QpIHsKLQkJaWYgKCFwcmVkTGlzdC5jb250YWlucyhwcmVkZWNlc3NvcikpCi0JCQlwcmVkTGlzdC5hZGQocHJlZGVjZXNzb3IpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcmVkZWNlc3Nvci5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJV29ya09yZGVyIGVsZW1lbnQgPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQKLQkJCQkJLmdldFByZWQoKTsKLQkJCWlmIChwcmVkICE9IHByZWRlY2Vzc29yICYmIGxpc3QuY29udGFpbnMocHJlZCkpIHsKLQkJCQlpZiAoIXByZWRMaXN0LmNvbnRhaW5zKHByZWQpKSB7Ci0JCQkJCXByZWRMaXN0LmFkZChwcmVkKTsKLQkJCQkJZ2V0QWxsUHJlZGVjZXNzb3JMaXN0KHByZWQsIGxpc3QsIHByZWRMaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgdGhlIGJyZWFrZG93biBlbGVtZW50IHdob3NlIHByZWRlY2Vzc29yIGxpc3QgdG8gYmUgY2hlY2tlZC4KLQkgKiBAcGFyYW0gcHJlZExpc3QKLQkgKiAgICAgICAgICAgIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcHJlZGVjZXNzb3IgSURzCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHRvcEFjdAotCSAqIEBwYXJhbSBwcmVkZWNlc3NvcnMKLQkgKiAgICAgICAgICAgIG91dHB1dCwgdGhlIHByZWRlY2Vzc29yIGxpc3QKLQkgKiBAcGFyYW0gYWxsRWxlbWVudHMKLQkgKiAgICAgICAgICAgIG91dHB1dCwgdGhlIHdob2xlIGJyZWFrZG93biBlbGVtZW50IGxpc3QgaXMgY29waWVkIGludG8gdGhpcwotCSAqICAgICAgICAgICAgbGlzdC4KLQkgKiBAcmV0dXJuIG51bGwgaWYgcHJlZExpc3QgaXMgdmFsaWQuIFRoZSBwcmVkZWNlc3NvciBsaXN0IGlzIHNhdmVkIGluCi0JICogICAgICAgICBwcmVkZWNlc3NvcnMgYW5kIHRoZSB3aG9sZSBicmVha2Rvd24gZWxlbWVudCBsaXN0IGlzIHNhdmVkIGluCi0JICogICAgICAgICBhbGxFbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1ByZWRlY2Vzc29yTGlzdChXb3JrQnJlYWtkb3duRWxlbWVudCBlLAotCQkJU3RyaW5nIHByZWRMaXN0LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgT2JqZWN0IHRvcEFjdCwKLQkJCUxpc3Q8T2JqZWN0PiBwcmVkZWNlc3NvcnMpIHsKLQkJTGlzdDxJbnRlZ2VyPiBpZExpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0JCWZvciAoU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocHJlZExpc3QsICIsIik7IHRva2Vucy5oYXNNb3JlVG9rZW5zKCk7KSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQlJbnRlZ2VyIGlkOwotCQkJdHJ5IHsKLQkJCQlpZCA9IG5ldyBJbnRlZ2VyKHRva2VuKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkUHJlZGVjZXNzb3JFcnJvcl9tc2c7IAotCQkJfQotCQkJaWRMaXN0LmFkZChpZCk7Ci0JCX0KLQotCQlyZXR1cm4gY2hlY2tQcmVkZWNlc3Nvckxpc3QoZSwgaWRMaXN0LCBhZGFwdGVyRmFjdG9yeSwgdG9wQWN0LAotCQkJCXByZWRlY2Vzc29ycyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gb2JqZWN0J3MgbWV0aG9kIHBhY2thZ2UgYW5kIHBsdWdpbiB0byB0aGUgZGVmYXVsdAotCSAqIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGdpdmVuIHByb2Nlc3MgaWYgdGhleSBhcmUgbm90IGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogeWV0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9jCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBhZGRlZE9iamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihQcm9jZXNzIHByb2MsIEVPYmplY3QgZSwKLQkJCVNldCBhZGRlZE9iamVjdHMpIHsKLQkJLy8gYWRkIHRoZSBlbGVtZW50J3MgbWV0aG9kIHBhY2thZ2UgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCQkvLwotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHByb2MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQlhZGRUYXNrVG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jLCAoVGFzaykgZSwgYWRkZWRPYmplY3RzLCB0cnVlKTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBlOwotCQkJYWRkV1BUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIHdwLCBhZGRlZE9iamVjdHMpOwotCQkJTGlzdCB0YXNrcyA9IGdldFRhc2tzRm9yV29ya1Byb2R1Y3Qod3AsIGNvbmZpZyk7Ci0JCQlpZiAodGFza3MgIT0gbnVsbCkKLQkJCXsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXNrcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJYWRkVGFza1RvRGVmYXVsdENvbmZpZ3VyYXRpb24ocHJvYywgKFRhc2spIGl0ZXIubmV4dCgpLAotCQkJCQkJCWFkZGVkT2JqZWN0cywgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgUm9sZSkgewotCQkJUm9sZSByb2xlID0gKFJvbGUpIGU7Ci0JCQlhZGRSb2xlVG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jLCByb2xlLCBhZGRlZE9iamVjdHMpOwotCi0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlhZGRBY3Rpdml0eVRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocHJvYywgKEFjdGl2aXR5KSBlLCBhZGRlZE9iamVjdHMpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJVG5nVXRpbC5hZGRUb0NvbmZpZ3VyYXRpb24oY29uZmlnLCAoR3VpZGFuY2UpIGUsIGFkZGVkT2JqZWN0cyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRBY3Rpdml0eVRvRGVmYXVsdENvbmZpZ3VyYXRpb24oUHJvY2VzcyBwcm9jLCBBY3Rpdml0eSBhY3Rpdml0eSwgU2V0IGFkZGVkT2JqZWN0cykgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHByb2MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJVG5nVXRpbC5hZGRUbyhjb25maWcsIFVtYVV0aWwuZ2V0UHJvY2Vzc0NvbXBvbmVudChhY3Rpdml0eSksIGFkZGVkT2JqZWN0cyk7Ci0JCS8vIGFkZCBsaW5rZWQgZWxlbWVudCBvZiBkZXNjcmlwdG9ycwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBvID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIGUpOwotCQkJCWlmKG8gIT0gbnVsbCkgewotCQkJCQlhZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIG8sIGFkZGVkT2JqZWN0cyk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkvLyB0aGlzIGlzIG5lZWRlZCBmb3IgYWRkaW5nIHN1Yi1hY3Rpdml0aWVzIGRlc2NyaXB0b3JzIAotCQkJCWFkZEFjdGl2aXR5VG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jLCAoQWN0aXZpdHkpIGUsIGFkZGVkT2JqZWN0cyk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgYWxsIHRoZSBiYXNlIGVsZW1lbnRzIGlmIHRoZXJlIGlzIGFueQotCQlmb3IgKEFjdGl2aXR5IGJhc2UgPSAoQWN0aXZpdHkpIGFjdGl2aXR5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsgYmFzZSAhPSBudWxsOyBiYXNlID0gKEFjdGl2aXR5KSBiYXNlCi0JCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpIHsKLQkJCWFkZEFjdGl2aXR5VG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jLCBiYXNlLCBhZGRlZE9iamVjdHMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRUYXNrVG9EZWZhdWx0Q29uZmlndXJhdGlvbihQcm9jZXNzIHByb2MsIFRhc2sgdGFzaywKLQkJCVNldCBhZGRlZE9iamVjdHMsIGJvb2xlYW4gaW5jbHVkZVdvcmtQcm9kdWN0cykgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHByb2MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQotCQlUbmdVdGlsLmFkZFRvQ29uZmlndXJhdGlvbihjb25maWcsIHRhc2ssIGFkZGVkT2JqZWN0cyk7Ci0KLQkJLy8gYWRkIGFsbCBvdGhlciBkZXBlbmRlbmNpZXMKLQkJLy8KLQotCQkvLyBhZGQgcm9sZXMKLQkJQXJyYXlMaXN0IGRlcGVuZGVuY2llcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZGVwZW5kZW5jaWVzLmFkZEFsbCh0YXNrLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpOwotCQlkZXBlbmRlbmNpZXMuYWRkKHRhc2suZ2V0UGVyZm9ybWVkQnkoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRlcGVuZGVuY2llcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVRuZ1V0aWwuYWRkVG9Db25maWd1cmF0aW9uKGNvbmZpZywgKEVPYmplY3QpIGl0ZXIubmV4dCgpLAotCQkJCQlhZGRlZE9iamVjdHMpOwotCQl9Ci0KLQkJLy8gYWRkIHdvcmsgcHJvZHVjdHMKLQkJaWYgKGluY2x1ZGVXb3JrUHJvZHVjdHMpIHsKLQkJCWRlcGVuZGVuY2llcy5jbGVhcigpOwotCQkJZGVwZW5kZW5jaWVzLmFkZEFsbCh0YXNrLmdldE9wdGlvbmFsSW5wdXQoKSk7Ci0JCQlkZXBlbmRlbmNpZXMuYWRkQWxsKHRhc2suZ2V0T3V0cHV0KCkpOwotCQkJZGVwZW5kZW5jaWVzLmFkZEFsbCh0YXNrLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVwZW5kZW5jaWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWFkZFdQVG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jLCAoV29ya1Byb2R1Y3QpIGl0ZXIubmV4dCgpLAotCQkJCQkJYWRkZWRPYmplY3RzKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhc2suZ2V0U3RlcHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBzdGVwID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlFT2JqZWN0IGJhc2UgPSBzdGVwLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQlUbmdVdGlsLmFkZFRvQ29uZmlndXJhdGlvbihjb25maWcsIGJhc2UsIGFkZGVkT2JqZWN0cyk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkUm9sZVRvRGVmYXVsdENvbmZpZ3VyYXRpb24oUHJvY2VzcyBwcm9jLAotCQkJUm9sZSByb2xlLCBTZXQgYWRkZWRPYmplY3RzKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gcHJvYy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlUbmdVdGlsLmFkZFRvQ29uZmlndXJhdGlvbihjb25maWcsIHJvbGUsIGFkZGVkT2JqZWN0cyk7Ci0JCQotCQkvLyBhZGQgd29yayBwcm9kdWN0cwotCQlBcnJheUxpc3QgZGVwZW5kZW5jaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCQlkZXBlbmRlbmNpZXMuYWRkQWxsKHJvbGUuZ2V0TW9kaWZpZXMoKSk7Ci0JCWRlcGVuZGVuY2llcy5hZGRBbGwocm9sZS5nZXRSZXNwb25zaWJsZUZvcigpKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVwZW5kZW5jaWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJYWRkV1BUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIChXb3JrUHJvZHVjdCkgaXRlci5uZXh0KCksCi0JCQkJCWFkZGVkT2JqZWN0cyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRXUFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oUHJvY2VzcyBwcm9jLAotCQkJV29ya1Byb2R1Y3Qgd3AsIFNldCBhZGRlZE9iamVjdHMpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBwcm9jLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCVRuZ1V0aWwuYWRkVG9Db25maWd1cmF0aW9uKGNvbmZpZywgd3AsIGFkZGVkT2JqZWN0cyk7Ci0JCWlmICh3cCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKERlbGl2ZXJhYmxlKSB3cCkuZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVRuZ1V0aWwuYWRkVG9Db25maWd1cmF0aW9uKGNvbmZpZywgKEVPYmplY3QpIGl0ZXIubmV4dCgpLAotCQkJCQkJYWRkZWRPYmplY3RzKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVUYXNrRGVzY3JpcHRvclN0ZXBzKEFjdGl2aXR5IGFjdGl2aXR5LAotCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MpIHsKLQkJaWYgKHRhc2tEZXNjID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVRhc2sgdGFzayA9IHRhc2tEZXNjLmdldFRhc2soKTsKLQotCQlJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlnQXBwbGljYXRvciA9IFByb3ZpZGVycwotCQkJCS5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3Rpdml0eSkKLQkJCQkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJTGlzdDxTdGVwPiBzdGVwcyA9IChMaXN0PFN0ZXA+KSBjb25maWdBcHBsaWNhdG9yLmdldFJlZmVyZW5jZSh0YXNrLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfU3RlcHMoKSwgY29uZmlnKTsKLQotCQkvLyBhZGQgdGhvc2Ugc3RlcHMgdG8gVGFza0Rlc2NyaXB0b3IgaWYgdGhleSBhcmUgbm90IHRoZXJlIHlldC4KLQkJLy8KLQkJZm9yIChTdGVwIHN0ZXAgOiBzdGVwcykgewotCQkJaWYgKCF0YXNrRGVzYy5nZXRTZWxlY3RlZFN0ZXBzKCkuY29udGFpbnMoc3RlcCkpIHsKLQkJCQl0YXNrRGVzYy5nZXRTZWxlY3RlZFN0ZXBzKCkuYWRkKHN0ZXApOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgTWV0aG9kRWxlbWVudCB0aGF0IHRoZSBnaXZlbiBkZXNjcmlwdG9yIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0QXNzb2NpYXRlZEVsZW1lbnQoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCWlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCXJldHVybiAoKFJvbGVEZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5nZXRSb2xlKCk7Ci0JCX0gZWxzZSBpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gKChUYXNrRGVzY3JpcHRvcikgZGVzY3JpcHRvcikuZ2V0VGFzaygpOwotCQl9IGVsc2UgaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCXJldHVybiAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZGVzY3JpcHRvcikuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBFUmVmZXJlbmNlIGdldExpbmtSZWZlcmVuY2UoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCWlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCk7Ci0JCX0gZWxzZSBpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpOwotCQl9IGVsc2UgaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkaXNwb3NlV3JhcHBlcnMoQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCSgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBhbGwgdGFza3MgdGhhdCBoYXZlIHRoZSBnaXZlbiB3b3JrcHJvZHVjdCBpbiB0aGVpciBvdXRwdXQKLQkgKiBpbiB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFRhc2tzRm9yV29ya1Byb2R1Y3QoV29ya1Byb2R1Y3Qgd3AsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlnQXBwbGljYXRvciA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpOwotCi0JCUxpc3QgdGFza3MgPSAoTGlzdCkgY29uZmlnQXBwbGljYXRvci5nZXRSZWZlcmVuY2Uod3AsIEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X091dHB1dEZyb21fVGFza3MsIGNvbmZpZyk7Ci0KLQkJcmV0dXJuIHRhc2tzOwotCX0KLQotCS8qKgotCSAqIEdldCBhbGwgd29ya3Byb2R1Y3RzIHRoYXQgaGF2ZSB0aGUgcm9sZSBhcyByZXNwb25zaWJsZSByb2xlIGluIHRoZQotCSAqIGdpdmVuIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRXb3JrUHJvZHVjdHNGb3JSb2xlKFJvbGUgcm9sZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUlDb25maWd1cmF0aW9uQXBwbGljYXRvciBjb25maWdBcHBsaWNhdG9yID0gUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCk7Ci0JCUxpc3Qgd3BzID0gKExpc3QpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKHJvbGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwgY29uZmlnKTsKLQkJcmV0dXJuIHdwczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB3b3JrcHJvZHVjdHMgd2hpY2ggYXJlLCBleGNlcHQgdGhlIGNvbnRyaWJ1dG9yLCBpbiB0aGUgZ2l2ZW4KLQkgKiBwbHVnaW4uCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsV29ya1Byb2R1Y3RzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQotCQlDb250ZW50UGFja2FnZSBjb3JlQ29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoY29yZUNvbnRlbnRQa2csIGZhbHNlKSB7Ci0KLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzgzMzc1MjA2NjMyNDgzNzkzN0w7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKQotCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCUNvbnRlbnRQYWNrYWdlIHBrZyA9IChDb250ZW50UGFja2FnZSkgb2JqZWN0OwotCQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpCi0JCQkJCQkJJiYgIVRuZ1V0aWwKLQkJCQkJCQkJCS5pc0NvbnRyaWJ1dG9yKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQpKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQkJTGlzdCBtZXRob2RFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCW1ldGhvZEVsZW1lbnRzLmFkZChlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWV0aG9kRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGFzaywgZXhjZXB0IHRoZSBjb250cmlidXRvciwgaW4gdGhlIGdpdmVuIHBsdWdpbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxUYXNrcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCUNvbnRlbnRQYWNrYWdlIGNvcmVDb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihjb3JlQ29udGVudFBrZywgZmFsc2UpIHsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzODMzNzUyMDY2MzI0ODM3OTM3TDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkpCi0JCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJQ29udGVudFBhY2thZ2UgcGtnID0gKENvbnRlbnRQYWNrYWdlKSBvYmplY3Q7Ci0JCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGtnLmdldENvbnRlbnRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrCi0JCQkJCQkJJiYgIVRuZ1V0aWwKLQkJCQkJCQkJCS5pc0NvbnRyaWJ1dG9yKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQpKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQkJTGlzdCB0YXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQkJdGFza3MuYWRkKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0YXNrczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCXJldHVybiBUbmdVdGlsLmlzR2VuZXJhbGl6ZXIoZSwKLQkJCQlnZXRFeHRlbmRBbmRMb2NhbENvbnRyaWJ1dGlvblZhcmlhYmlsaXR5VHlwZXMoKSk7Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlc2VudGF0aW9uTmFtZShCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJaWYgKGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpID09IG51bGwKLQkJCQl8fCBlLmdldFByZXNlbnRhdGlvbk5hbWUoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpZiAoaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoZSkpIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGJhc2UgPSAoQnJlYWtkb3duRWxlbWVudCkgKChWYXJpYWJpbGl0eUVsZW1lbnQpIGUpCi0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCXJldHVybiBnZXRQcmVzZW50YXRpb25OYW1lKGJhc2UpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExhYmVsV2l0aFBhdGgoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCVN0cmluZ0J1ZmZlciBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcihlLmdldE5hbWUoKSk7Ci0JCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlKTsKLQkJaWYgKHByb2MgIT0gbnVsbCkgewotCQkJcGF0aC5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihwcm9jKTsKLQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCXBhdGguYXBwZW5kKHBsdWdpbi5nZXROYW1lKCkpOwotCQkJfQotCQkJaWYgKGUgIT0gcHJvYykgewotCQkJCXBhdGguYXBwZW5kKCcvJykuYXBwZW5kKHByb2MuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGF0aC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1vZGVsIGluZm8gb2YgdGhlIGdpdmVuIEJyZWFrZG93bkVsZW1lbnQgaW4gdGhlIGdpdmVuCi0JICogU3RyaW5nQnVmZmVyCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIEBwYXJhbSBtb2RlbEluZm8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0TW9kZWxJbmZvKEJyZWFrZG93bkVsZW1lbnQgZSwgT2JqZWN0IGFkYXB0ZXIsCi0JCQlTdHJpbmdCdWZmZXIgbW9kZWxJbmZvKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlOwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQlpZiAobW9kZWxJbmZvLmxlbmd0aCgpID4gMCkgewotCQkJCQltb2RlbEluZm8uYXBwZW5kKCI7ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCVN0cmluZyBwYXR0ZXJuID0gbnVsbDsKLQkJCQlpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpIHsKLQkJCQkJcGF0dGVybiA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfUHJvY2Vzc1V0aWxfY29udHJpYnV0ZXN0bzsgCi0JCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pIHsKLQkJCQkJcGF0dGVybiA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfUHJvY2Vzc1V0aWxfbG9jYWxDb250cmlidXRlc3RvOyAKLQkJCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpIHsKLQkJCQkJcGF0dGVybiA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnByb2Nlc3NfZXh0ZW5kczsgCi0JCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUykgewotCQkJCQlwYXR0ZXJuID0gTGlicmFyeUVkaXRSZXNvdXJjZXMucHJvY2Vzc19yZXBsYWNlczsgCi0JCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVCkgewotCQkJCQlwYXR0ZXJuID0gTGlicmFyeUVkaXRSZXNvdXJjZXMucHJvY2Vzc19sb2NhbFJlcGxhY2VzOyAKLQkJCQl9Ci0KLQkJCQkvLyBpZihhZGFwdGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCS8vIEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPQotCQkJCS8vICgoSXRlbVByb3ZpZGVyQWRhcHRlcilhZGFwdGVyKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCS8vIE9iamVjdCBpdGVtUHJvdmlkZXIgPSBmYWN0b3J5LmFkYXB0KGJhc2UsCi0JCQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkvLyBpZihpdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkvLyBJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKQotCQkJCS8vIGl0ZW1Qcm92aWRlcjsKLQkJCQkvLyBQcm9jZXNzIHByb2MgPSAoUHJvY2VzcykgYnNJdGVtUHJvdmlkZXIuZ2V0VG9wSXRlbSgpOwotCQkJCS8vIGlmKHByb2MgIT0gbnVsbCkgewotCQkJCS8vIHN0cmJ1Zi5hcHBlbmQoVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ocHJvYykuZ2V0TmFtZSgpKS5hcHBlbmQoJzonKQotCQkJCS8vIC5hcHBlbmQocHJvYy5nZXROYW1lKCkpLmFwcGVuZCgnOicpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gfQotCi0JCQkJLy8gUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KQotCQkJCS8vIGJhc2UpOwotCQkJCS8vIGlmKHByb2MgIT0gbnVsbCkgewotCQkJCS8vIE1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihwcm9jKTsKLQkJCQkvLyBpZihwbHVnaW4gIT0gbnVsbCkgewotCQkJCS8vIG1vZGVsSW5mby5hcHBlbmQoVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ocHJvYykuZ2V0TmFtZSgpKS5hcHBlbmQoJzonKTsKLQkJCQkvLyB9Ci0JCQkJLy8gbW9kZWxJbmZvLmFwcGVuZChwcm9jLmdldE5hbWUoKSk7Ci0JCQkJLy8gfQotCQkJCS8vCQkJCQotCQkJCS8vIGlmKGJhc2UgIT0gcHJvYykgewotCQkJCS8vIG1vZGVsSW5mby5hcHBlbmQoJzonKS5hcHBlbmQoYmFzZS5nZXROYW1lKCkpOwotCQkJCS8vIH0KLQkJCQkvLyBtb2RlbEluZm8uYXBwZW5kKCInIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGF0dGVybiAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gZ2V0TGFiZWxXaXRoUGF0aCgoQnJlYWtkb3duRWxlbWVudCkgYmFzZSk7Ci0JCQkJCW1vZGVsSW5mby5hcHBlbmQoTWVzc2FnZUZvcm1hdC5mb3JtYXQocGF0dGVybiwKLQkJCQkJCQluZXcgT2JqZWN0W10geyBwYXRoIH0pKTsKLQotCQkJCQlnZXRNb2RlbEluZm8oKEJyZWFrZG93bkVsZW1lbnQpIGJhc2UsIGFkYXB0ZXIsIG1vZGVsSW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJCXdyYXBwZXIuZ2V0T3duZXIoKTsKLQkJCWlmICh3cmFwcGVyLmdldEZlYXR1cmUoKSAhPSBudWxsKSB7Ci0JCQkJbW9kZWxJbmZvLmFwcGVuZChUbmdVdGlsLmdldEZlYXR1cmVUZXh0KHdyYXBwZXIuZ2V0RmVhdHVyZSgpKSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh3cmFwcGVyIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcikgewotLy8JCQkJCWdldE1vZGVsSW5mb0ZvcldvcmtQcm9kdWN0RGVzY3JpcHRvcihtb2RlbEluZm8sCi0vLwkJCQkJCQkoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKSk7Ci0JCQkJCWdldFdQRE1vZGVsSW5mbyhtb2RlbEluZm8sIHdyYXBwZXIsIHdyYXBwZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb2x1bW5OYW1lKFN0cmluZyBwcm9wZXJ0eSkgewotCQlpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9JRC5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRDsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRTsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUzsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTi5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU47Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkc7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEU7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVGSVguZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTy5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfVFlQRS5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVMuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVM7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURS5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURTsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX0VYSVRfU1RBVEUuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfRVhJVF9TVEFURTsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUwuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUw7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19QTEFOTkVELmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQ7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHksCi0JCQlPYmplY3QgYWRhcHRlcikgewotCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSUQpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQKLQkJCQkJJiYgYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZigoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcikuZ2V0SWQoKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FKSB7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElJdGVtTGFiZWxQcm92aWRlcikgewotCQkJCXJldHVybiAoKElJdGVtTGFiZWxQcm92aWRlcikgYWRhcHRlcikuZ2V0VGV4dChlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FKSB7Ci0JCQlyZXR1cm4gZ2V0UHJlc2VudGF0aW9uTmFtZShlKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUykgewotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gKChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLmdldFByZWRlY2Vzc29ycygpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4pIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoKChXb3JrQnJlYWtkb3duRWxlbWVudCkgZSkKLQkJCQkJCS5nZXRJc0V2ZW50RHJpdmVuKCkpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORykgewotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXJldHVybiBTdHJpbmcKLQkJCQkJCS52YWx1ZU9mKCgoV29ya0JyZWFrZG93bkVsZW1lbnQpIGUpLmdldElzT25nb2luZygpKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoKChXb3JrQnJlYWtkb3duRWxlbWVudCkgZSkKLQkJCQkJCS5nZXRJc1JlcGVhdGFibGUoKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVGSVgpIHsKLQkJCXJldHVybiBlLmdldFByZWZpeCgpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTykgewotCQkJU3RyaW5nQnVmZmVyIG1vZGVsSW5mbyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWdldE1vZGVsSW5mbyhlLCBhZGFwdGVyLCBtb2RlbEluZm8pOwotCQkJcmV0dXJuIG1vZGVsSW5mby50b1N0cmluZygpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfVFlQRSkgewotCQkJU3RyaW5nIHR5cGVOYW1lID0gbnVsbDsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZSkKLQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCWlmICh3cCAhPSBudWxsKSB7Ci0JCQkJCXR5cGVOYW1lID0gd3AuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIkRlc2NyaXB0b3IiOyAvLyROT04tTkxTLTEkICAKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodHlwZU5hbWUgPT0gbnVsbCAmJiBlIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCXR5cGVOYW1lID0gKChFT2JqZWN0KSBlKS5lQ2xhc3MoKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlpZiAodHlwZU5hbWUgIT0gbnVsbCkgewotCQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfIiArIHR5cGVOYW1lICsgIl90eXBlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVMpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKCgoVGVhbVByb2ZpbGUpIGUpCi0JCQkJCQkuZ2V0U3VwZXJUZWFtKCkpOwotCQkJfQotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yICYmIGFkYXB0ZXIgaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHsKLQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWFkYXB0ZXJGYWN0b3J5ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilhZGFwdGVyKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCX0KLQkJCQllbHNlIGlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJCWFkYXB0ZXJGYWN0b3J5ID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKWFkYXB0ZXIpLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJfQotCQkJCXJldHVybiBnZXRUZWFtTGlzdFN0cmluZyhnZXRUZWFtUHJvZmlsZXMob2JqZWN0LCAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKWFkYXB0ZXIsIGFkYXB0ZXJGYWN0b3J5KSk7Ci0gCQkJfQotCQl9Ci0JCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0VOVFJZX1NUQVRFKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlOwotCQkJCXJldHVybiBUbmdVdGlsLmNoZWNrTnVsbCh3cGQuZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfRVhJVF9TVEFURSkgewotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZTsKLQkJCQlyZXR1cm4gVG5nVXRpbC5jaGVja051bGwod3BkLmdldEFjdGl2aXR5RXhpdFN0YXRlKCkpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfREVMSVZFUkFCTEUpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJTGlzdCBkZWxpdmVyYWJsZXMgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRvcnMoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZSk7Ci0JCQkJaWYgKGRlbGl2ZXJhYmxlcy5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJaW50IG1heCA9IGRlbGl2ZXJhYmxlcy5zaXplKCkgLSAxOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCQkJc3RyQnVmLmFwcGVuZCgKLQkJCQkJCQlUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZGVsaXZlcmFibGVzLmdldChpKSkpCi0JCQkJCQkJLmFwcGVuZCgnLCcpOwotCQkJCX0KLQkJCQlzdHJCdWYuYXBwZW5kKFRuZ1V0aWwKLQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKGRlbGl2ZXJhYmxlcy5nZXQobWF4KSkpOwotCQkJCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09QVElPTkFMKSB7Ci0JCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZS5nZXRJc09wdGlvbmFsKCkpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUExBTk5FRCkgewotCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGUuZ2V0SXNQbGFubmVkKCkpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTKSB7Ci0JCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZS5nZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQgYWN0aXZpdHkgZm9yIHRlYW0gcHJvZmlsZSBicmVha2Rvd24gZWxlbWVudAotCSAqIFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkgZG9lc24ndCB3b3JrIGNvcnJlY3RseSBmb3Igc3ViLXRlYW1zCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgYnJlYWtkb3duIGVsZW1lbnRzIHVuZGVyIHRlYW1hbGxvY2F0aW9uCi0JICogQHBhcmFtIHRlYW0KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0UGFyZW50QWN0aXZpdHlPZlRlYW0oQnJlYWtkb3duRWxlbWVudCBickVsZW1lbnQpCi0JewotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChickVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCWJyRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQ7Ci0JCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGJyRWxlbWVudCwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gcGFyZW50OwkKLQl9Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHJvbGVkZXNjcmlwdG9ycyB1bmRlciBhY3Rpdml0eSB3aGljaCBjb3VsZCBwb3NzaWJsZSBtYXRjaCBmb3IKLQkgKiByb2xlcyB1bmRlciB0aGUgdGVhbXMuIEl0IHdpbGwgcmVjdXJzZSB0aHJ1IGFsbCBjaGlsZCBhY3Rpdml0aWVzIHRvIGZpbmQgCi0JICogcm9sZSBkZXNjcmlwdG9ycwotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gcm9sZURlc2NMaXN0Ci0JICogQHBhcmFtIHJvbGVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFJvbGVEZXNjcmlwdG9yKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQWN0aXZpdHkgcGFyZW50LCAgTGlzdCByb2xlRGVzY0xpc3QsIExpc3Qgcm9sZXMpIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQotCQlPYmplY3QgbyA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJaWYgKG8gaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIG87Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWdldFJvbGVEZXNjcmlwdG9yKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIG9iaiwKLQkJCQkJCQlyb2xlRGVzY0xpc3QsIHJvbGVzKTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKQotCQkJCXsKLQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIG9iajsKLQkJCQkJaWYgKChyb2xlRGVzYy5nZXRSb2xlKCkhPSBudWxsKSAmJiAKLQkJCQkJCQkocm9sZXMuY29udGFpbnMocm9sZURlc2MuZ2V0Um9sZSgpKSkpCi0JCQkJCQlyb2xlRGVzY0xpc3QuYWRkKG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUZWFtTGlzdFN0cmluZyhMaXN0IHRlYW1Qcm9maWxlcykgewotCQlpZiAodGVhbVByb2ZpbGVzLmlzRW1wdHkoKSkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbWF4ID0gdGVhbVByb2ZpbGVzLnNpemUoKSAtIDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCXN0ckJ1Zi5hcHBlbmQoVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKHRlYW1Qcm9maWxlcy5nZXQoaSkpKQotCQkJCQkuYXBwZW5kKCcsJyk7Ci0JCX0KLQkJc3RyQnVmLmFwcGVuZChUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUodGVhbVByb2ZpbGVzLmdldChtYXgpKSk7Ci0JCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QXR0cmlidXRlKFdvcmtCcmVha2Rvd25FbGVtZW50IGUsIFN0cmluZyBwcm9wLAotCQkJU3RyaW5nIHR4dCkgewotCQlpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUpIHsKLQkJCWUuc2V0TmFtZSh0eHQpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVGSVgpIHsKLQkJCWUuc2V0UHJlZml4KHR4dCk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTikgewotCQkJZS5zZXRJc0V2ZW50RHJpdmVuKEJvb2xlYW4udmFsdWVPZih0eHQpKTsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORykgewotCQkJZS5zZXRJc09uZ29pbmcoQm9vbGVhbi52YWx1ZU9mKHR4dCkpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFKSB7Ci0JCQllLnNldElzUmVwZWF0YWJsZShCb29sZWFuLnZhbHVlT2YodHh0KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QXR0cmlidXRlKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSwgU3RyaW5nIHByb3AsIFN0cmluZyB0eHQpIHsKLQkJaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgdHh0LCAtMSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlZml4KCksIHR4dCwgLTEpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4pIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCksIEJvb2xlYW4KLQkJCQkJLnZhbHVlT2YodHh0KSwgLTEpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCksIEJvb2xlYW4udmFsdWVPZih0eHQpLAotCQkJCQktMSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKSwgQm9vbGVhbgotCQkJCQkudmFsdWVPZih0eHQpLCAtMSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksIHR4dCwgLTEpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PUFRJT05BTCkgewotCQkJYWN0aW9uTWdyCi0JCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpLCBCb29sZWFuCi0JCQkJCQkJLnZhbHVlT2YodHh0KSwgLTEpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19QTEFOTkVEKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9Jc1BsYW5uZWQoKSwgQm9vbGVhbi52YWx1ZU9mKHR4dCksIC0xKTsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9IYXNNdWx0aXBsZU9jY3VycmVuY2VzKCksIEJvb2xlYW4KLQkJCQkJLnZhbHVlT2YodHh0KSwgLTEpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCWlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfRU5UUllfU1RBVEUpIHsKLQkJCQlhY3Rpb25NZ3IKLQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCksCi0JCQkJCQkJCXR4dCwgLTEpOwotCQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfRVhJVF9TVEFURSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCksIHR4dCwgLTEpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFjdGl2aXR5IGdlbmVyYWxpemUoQWN0aXZpdHkgYmFzZSwgVmFyaWFiaWxpdHlUeXBlIHR5cGUpIHsJCQotCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZShiYXNlLmVDbGFzcygpKTsKLQkJYWN0LnNldE5hbWUoYmFzZS5nZXROYW1lKCkpOwotCQlpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlQpIHsKLQkJCVN0cmluZyBwcmVzZW50YXRpb25OYW1lID0gZ2V0UHJlc2VudGF0aW9uTmFtZShiYXNlKTsKLQkJCWFjdC5zZXRQcmVzZW50YXRpb25OYW1lKFN0clV0aWwuaXNCbGFuayhwcmVzZW50YXRpb25OYW1lKSA/IGJhc2UKLQkJCQkJLmdldE5hbWUoKSA6IHByZXNlbnRhdGlvbk5hbWUpOwotCQl9Ci0JCWFjdC5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KGJhc2UpOwotCQlhY3Quc2V0VmFyaWFiaWxpdHlUeXBlKHR5cGUpOwotCi0JCWlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKSB7Ci0JCQkvLyBpbmhlcml0IGJvb2xlYW4gYXR0cmlidXRlcyBmcm9tIGJhc2UKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBiYXNlLmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUVBdHRyaWJ1dGUgYXR0cmlidXRlID0gKEVBdHRyaWJ1dGUpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChhdHRyaWJ1dGUuZ2V0RUF0dHJpYnV0ZVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkgPT0gQm9vbGVhbi5jbGFzcykgewotCQkJCQlhY3QuZVNldChhdHRyaWJ1dGUsIGJhc2UuZUdldChhdHRyaWJ1dGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBjb3B5IHByZWRlY2Vzc29ycyBsaXN0Ci0JCS8vIFRPRE86IG5lZWQgdG8gY2hlY2sgd2l0aCB2YXJpYWJpbGl0eSBydWxlcy4KLQkJLy8KLQkJQXJyYXlMaXN0IHdvcmtPcmRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3QoYmFzZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpKQotCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCXdvcmtPcmRlcnMuYWRkKFRuZ1V0aWwuY29weSgoV29ya09yZGVyKSBpdGVyLm5leHQoKSkpOwotCQl9Ci0KLQkJYWN0LmdldExpbmtUb1ByZWRlY2Vzc29yKCkuYWRkQWxsKHdvcmtPcmRlcnMpOwotCQlyZXR1cm4gYWN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgbGlzdCBvZiBlbGVtZW50cyBzcGVjaWZpZWQgaW4gY2xhc3MgInR5cGUiIGVnLihSb2xlRGVzY3JpcHRvciwKLQkgKiBXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHVudGlsIHRoZSByb290IGxldmVsLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gaXRlbXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEVsZW1lbnRzSW5TY29wZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCwgQ2xhc3MgdHlwZSwgTGlzdCBpdGVtcykgewotCQkvLyBnZXQgY2hpbGRyZW4gZm9yIGFjdGl2aXR5Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChlbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gKChBY3Rpdml0eSkgZWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQlpZiAodHlwZS5pc0luc3RhbmNlKG9iaikpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJPYmogLSIgKyBvYmopOwotCQkJCQlpZiAoIShpdGVtcy5jb250YWlucyhvYmopKSkgewotCQkJCQkJaXRlbXMuYWRkKG9iaik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBnZXQgcGFyZW50Ci0JCU9iamVjdCBjdXJyZW50UGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChlbGVtZW50KTsKLQkJaWYgKGN1cnJlbnRQYXJlbnQgIT0gbnVsbCkgewotCQkJLy8gZ28gdXAKLQkJCWdldEVsZW1lbnRzSW5TY29wZShhZGFwdGVyRmFjdG9yeSwKLQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIGN1cnJlbnRQYXJlbnQsIHR5cGUsIGl0ZW1zKTsKLQkJfQotCQlyZXR1cm4gaXRlbXM7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgcm9sZXMgZnJvbSByb2xlZGVzY3JpcHRvciBsaXN0Ci0JICogCi0JICogQHBhcmFtIHJvbGVEZXNjTGlzdAotCSAqIEByZXR1cm4KLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSb2xlcyhMaXN0IHJvbGVEZXNjTGlzdCkgewotCQlMaXN0IHJvbGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocm9sZURlc2NMaXN0ICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHJvbGVEZXNjTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCVJvbGUgcm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIG9iaikuZ2V0Um9sZSgpOwotCQkJCQlyb2xlTGlzdC5hZGQocm9sZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByb2xlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYXNzb2NpYXRlZCBtZXRob2QgZWxlbWVudCBsaXN0Ci0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0b3JMaXN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoTGlzdCBkZXNjcmlwdG9yTGlzdCkgewotCQlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGVzY3JpcHRvckxpc3QgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gZGVzY3JpcHRvckxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IGdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBvYmopOwotCQkJCQllbGVtZW50TGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50TGlzdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEJyZWFrZG93bkVsZW1lbnQgZ2V0VG9wQnJlYWtkb3duRWxlbWVudChQcm9jZXNzQ29tcG9uZW50IHBjKSB7Ci0JCUJyZWFrZG93bkVsZW1lbnQgYmUgPSBwYy5nZXRQcm9jZXNzKCk7Ci0JCWlmIChiZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU9iamVjdCBhZGFwdGVyID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdChiZSwKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpKQotCQkJcmV0dXJuIGJlOwotCQlJQlNJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJaWYgKGl0ZW1Qcm92aWRlci5nZXRUb3BJdGVtKCkgPT0gbnVsbCkgewotCQkJaXRlbVByb3ZpZGVyLnNldFRvcEl0ZW0oYmUpOwotCQkJaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoYmUsCi0JCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWl0ZW1Qcm92aWRlci5zZXRUb3BJdGVtKGJlKTsKLQkJCWl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGJlLAotCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpdGVtUHJvdmlkZXIuc2V0VG9wSXRlbShiZSk7Ci0JCQlpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdChiZSwKLQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaXRlbVByb3ZpZGVyLnNldFRvcEl0ZW0oYmUpOwotCQl9Ci0JCVByb2Nlc3NVdGlsLnVwZGF0ZUlEcyhiZSwgYmUpOwotCQlyZXR1cm4gYmU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVJRHMoRU9iamVjdCB0b3BBY3QsIE9iamVjdCBuZXdPYmopIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQodG9wQWN0LAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXIKLQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCWJvb2xlYW4gdXBkYXRlV2hvbGVQcm9jZXNzID0gdG9wQWN0ID09IG5ld09iagotCQkJCSYmIHRvcEFjdCBpbnN0YW5jZW9mIFByb2Nlc3M7Ci0JCWlmICh1cGRhdGVXaG9sZVByb2Nlc3MpIHsKLQkJCVByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSB0b3BBY3Q7Ci0JCQl1cGRhdGVJRHMoZmFjdG9yeSwgcHJvYyk7Ci0JCQlyZWZyZXNoVmlld2VyKGZhY3RvcnksIHByb2MpOwotCQl9IGVsc2UgewotCQkJQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcigKLQkJCQkJZmFjdG9yeSwgdG9wQWN0KTsKLQkJCXVwZGF0ZUlEcyhmYWN0b3J5LCBpdGVyLCBuZXdPYmopOwotCQl9Ci0KLQkJLy8gTm8gbW9yZSBJRCBjb2x1bW4gaW4gVEJTIGFuZCBXUEJTCi0JCS8vCi0JCS8vIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikKLQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdCh0b3BBY3QsCi0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCS8vIGZhY3RvcnkgPSBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkvLyBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGZhY3RvcnksIHRvcEFjdCk7Ci0JCS8vIFByb2Nlc3NVdGlsLnVwZGF0ZUlEcyhmYWN0b3J5LCBpdGVyLCBuZXdPYmopOwotCQkvLyBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpCi0JCS8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQodG9wQWN0LAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyBmYWN0b3J5ID0gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlci5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJLy8gaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihmYWN0b3J5LCB0b3BBY3QpOwotCQkvLyBQcm9jZXNzVXRpbC51cGRhdGVJRHMoZmFjdG9yeSwgaXRlciwgbmV3T2JqKTsKLQotCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQodG9wQWN0LAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJZmFjdG9yeSA9IFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXIuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCWlmICh1cGRhdGVXaG9sZVByb2Nlc3MpIHsKLQkJCVByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSB0b3BBY3Q7Ci0JCQl1cGRhdGVJRHMoZmFjdG9yeSwgcHJvYyk7Ci0JCQlyZWZyZXNoVmlld2VyKGZhY3RvcnksIHByb2MpOwotCQl9IGVsc2UgewotCQkJQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcigKLQkJCQkJZmFjdG9yeSwgdG9wQWN0KTsKLQkJCXVwZGF0ZUlEcyhmYWN0b3J5LCBpdGVyLCBuZXdPYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGl0ZXIKLQkgKiBAcGFyYW0gbmV3T2JqCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUlEcyhBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LAotCQkJQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IgaXRlciwgT2JqZWN0IG5ld09iaikgewotCQlpbnQgaWQgPSAwOwotCQlPYmplY3Qgb2JqOwotCQlNYXAgY2hhbmdlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlvYmogPSBpdGVyLm5leHQoKTsKLQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBmYWN0b3J5LmFkYXB0KG9iaiwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWl0ZW1Qcm92aWRlci5zZXRJZChpZCsrKTsKLQkJCWNoYW5nZU1hcC5wdXQob2JqLCBpdGVtUHJvdmlkZXIpOwotCQl9Ci0KLQkJLy8gcmVmcmVzaCB0aGUgbGFiZWwKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNoYW5nZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUlDaGFuZ2VOb3RpZmllciBhZGFwdGVyID0gKElDaGFuZ2VOb3RpZmllcikgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCW9iaiA9IGVudHJ5LmdldEtleSgpOwotCQkJYWRhcHRlci5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKAotCQkJCQluZXcgTm90aWZpY2F0aW9uSW1wbChOb3RpZmljYXRpb24uU0VULCBvYmosIG9iaiksIG9iaiwKLQkJCQkJZmFsc2UsIHRydWUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4KLQkgKiBAc2VlICNjaGVja0Rlc2NyaXB0b3JSZWZlcmVuY2VzKENvbGxlY3Rpb24sIERlc2NyaXB0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMoRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotCQkJRGVzY3JpcHRvciBvYmopIHsKLQkJQ29sbGVjdGlvbiBkZXNjcmlwdG9ycyA9IGRlc2NyaXB0b3IgIT0gbnVsbCA/IENvbGxlY3Rpb25zCi0JCQkJLnNpbmdsZXRvbihkZXNjcmlwdG9yKSA6IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJcmV0dXJuIGNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMoZGVzY3JpcHRvcnMsIG9iaik7Ci0JfQotCi0JCi0JLyoqCi0JICogQ2hlY2sgd2hldGhlciB0aGVyZSBhcmUgYW55IHJlZmVyZW5jZXMgb2YgdGhlIG9iamVjdCAib2JqIi4gSWYgcmVmZXJlbmNlcwotCSAqIGV4aXN0IGluIGFueSBkZXNjcmlwdG9yIGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwgaWdub3JlIGl0LgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9ycwotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMoQ29sbGVjdGlvbiBkZXNjcmlwdG9ycywKLQkJCURlc2NyaXB0b3Igb2JqKSB7Ci0JCWJvb2xlYW4gcmVmZXJlbmNlc0V4aXN0cyA9IGZhbHNlOwotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJUm9sZURlc2NyaXB0b3IgcmVmT2JqZWN0ID0gKFJvbGVEZXNjcmlwdG9yKSBvYmo7Ci0JCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlsaXN0LmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlci5nZXRBc3Npc3RlZFRhc2tEZXNjcmlwdG9ycyhyZWZPYmplY3QpKTsKLQkJCWxpc3QuYWRkQWxsKHJlZk9iamVjdC5nZXRSZXNwb25zaWJsZUZvcigpKTsKLQkJCWxpc3QuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyLmdldEFkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMocmVmT2JqZWN0KSk7Ci0JCQlsaXN0LmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHJlZk9iamVjdCkpOwotCQkJbGlzdC5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIuZ2V0VGVhbVByb2ZpbGVzKHJlZk9iamVjdCkpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIHJlZkl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IHJlZkl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCByZWZJdG9yT2JqZWN0ID0gKE9iamVjdCkgcmVmSXRvci5uZXh0KCk7Ci0JCQkJaWYgKCgocmVmSXRvck9iamVjdCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpICYmICFkZXNjcmlwdG9ycwotCQkJCQkJLmNvbnRhaW5zKHJlZkl0b3JPYmplY3QpKQotCQkJCQkJfHwgKHJlZkl0b3JPYmplY3QgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkpIHsKLQkJCQkJcmVmZXJlbmNlc0V4aXN0cyA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJfQotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewkJCi0JCQlyZXR1cm4gY2hlY2tXb3JrUHJvZHVjdERlc2NyaXB0b3JSZWZlcmVuY2VzKGRlc2NyaXB0b3JzLCAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmosIGZhbHNlLCAtMSk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCVRhc2tEZXNjcmlwdG9yIHJlZk9iamVjdCA9IChUYXNrRGVzY3JpcHRvcikgb2JqOwotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJbGlzdC5hZGRBbGwocmVmT2JqZWN0LmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpOwotCQkJbGlzdC5hZGRBbGwocmVmT2JqZWN0LmdldEFzc2lzdGVkQnkoKSk7Ci0JCQlsaXN0LmFkZEFsbChyZWZPYmplY3QuZ2V0RXh0ZXJuYWxJbnB1dCgpKTsKLQkJCWxpc3QuYWRkQWxsKHJlZk9iamVjdC5nZXRNYW5kYXRvcnlJbnB1dCgpKTsKLQkJCWxpc3QuYWRkQWxsKHJlZk9iamVjdC5nZXRPcHRpb25hbElucHV0KCkpOwotCQkJbGlzdC5hZGRBbGwocmVmT2JqZWN0LmdldE91dHB1dCgpKTsKLQkJCWxpc3QuYWRkKHJlZk9iamVjdC5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpKTsKLQotCQkJZm9yIChJdGVyYXRvciByZWZJdG9yID0gbGlzdC5pdGVyYXRvcigpOyByZWZJdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgcmVmSXRvck9iamVjdCA9IChPYmplY3QpIHJlZkl0b3IubmV4dCgpOwotCQkJCWlmICgocmVmSXRvck9iamVjdCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpCi0JCQkJCQkmJiAhZGVzY3JpcHRvcnMuY29udGFpbnMocmVmSXRvck9iamVjdCkpIHsKLQkJCQkJcmVmZXJlbmNlc0V4aXN0cyA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZWZlcmVuY2VzRXhpc3RzOwotCX0KLQkKLQkvKioKLQkgKiBDaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcmVmZXJlbmNlcyBvZiB0aGUgd29ya1Byb2R1Y3RkZXNjcmlwdG9yIG9iamVjdCAicmVmT2JqZWN0LiAKLQkgKiBJZiByZWZlcmVuY2VzIGV4aXN0IGluIGFueSBkZXNjcmlwdG9yIGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwgaWdub3JlIGl0LgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9ycwotCSAqIEBwYXJhbSByZWZPYmplY3QKLQkgKiBAcGFyYW0gcmVtb3ZlUmVsYXRpb24gLSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgd2UncmUgcmVtb3ZpbmcgcmVsYXRpb24KLQkgKiAgICAgQnkgZGVmYXVsdCB0aGlzIHNob3VsZCBiZSBmYWxzZS4gCi0JICogICAgIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIGlmIHlvdSBhcmUgY29taW5nIGZyb20gcHJvcGVydGllcyB2aWV3LiAKLQkgKiAgICAgZWcuIHJlbW92aW5nIHJlbGF0aW9uc2hpcCBvZiB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byB0YXNrIGRlc2NyaXB0b3IgCi0JICogQHBhcmFtIGZlYXR1cmVJRAotCSAqIAkJVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgaWYgInJlbW92ZVJlbGF0aW9uIiBpcyB0cnVlLiBZb3UgbmVlZCB0byBnaXZlIGZlYXR1cmVJRAotCSAqIAkJZm9yIHdoaWNoIHJlbGF0aW9uIHlvdSBhcmUgcmVtb3ZpbmcuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja1dvcmtQcm9kdWN0RGVzY3JpcHRvclJlZmVyZW5jZXMoCi0JCQlDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IgcmVmT2JqZWN0LCBib29sZWFuIHJlbW92ZVJlbGF0aW9uLCBpbnQgZmVhdHVyZUlEKSB7Ci0JCQotCQlMaXN0IGFsbE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWFsbE9iamVjdHMuYWRkKHJlZk9iamVjdCk7Ci0KLQkJQWN0aXZpdHkgcGFyZW50QWN0aXZpdHkgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KHJlZk9iamVjdCk7Ci0JCS8vIGNoZWNrIHdoZXRoZXIgcmVmZXJlbmNlIG9iamVjdCBpbnN0YW5jZSBvZiBhcnRpZmFjdAotCQlpZiAocmVmT2JqZWN0LmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJTGlzdCBjb250YWluZWRBcnRpZmFjdHMgPSAoKEFydGlmYWN0KSByZWZPYmplY3QuZ2V0V29ya1Byb2R1Y3QoKSkKLQkJCQkJLmdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCi0JCQlMaXN0IGNvbnRhaW5lZFdwRGVzY0xpc3QgPSBnZXRXcERlc2NGb3JBcnRpZmFjdHMoCi0JCQkJCWNvbnRhaW5lZEFydGlmYWN0cywgcGFyZW50QWN0aXZpdHkpOwotCi0JCQlMaXN0IGNvbnRhaW5lckFydGlmYWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUFydGlmYWN0IGFydGlmYWN0ID0gKChBcnRpZmFjdCkgcmVmT2JqZWN0LmdldFdvcmtQcm9kdWN0KCkpCi0JCQkJCS5nZXRDb250YWluZXJBcnRpZmFjdCgpOwotCQkJd2hpbGUgKGFydGlmYWN0ICE9IG51bGwpIHsKLQkJCQljb250YWluZXJBcnRpZmFjdHMuYWRkKGFydGlmYWN0KTsKLQkJCQlhcnRpZmFjdCA9ICgoQXJ0aWZhY3QpIGFydGlmYWN0KS5nZXRDb250YWluZXJBcnRpZmFjdCgpOwotCQkJfQotCQkJTGlzdCBjb250YWluZXJXcERlc2NMaXN0ID0gZ2V0V3BEZXNjRm9yQXJ0aWZhY3RzKAotCQkJCQljb250YWluZXJBcnRpZmFjdHMsIHBhcmVudEFjdGl2aXR5KTsKLQotCQkJYWxsT2JqZWN0cy5hZGRBbGwoY29udGFpbmVkV3BEZXNjTGlzdCk7Ci0JCQlhbGxPYmplY3RzLmFkZEFsbChjb250YWluZXJXcERlc2NMaXN0KTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsT2JqZWN0cy5zaXplKCk7IGkrKykgewotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwT2JqID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgYWxsT2JqZWN0cwotCQkJCQkuZ2V0KGkpOwotCi0JCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlsaXN0LmFkZEFsbCh3cE9iai5nZXRJbXBhY3RlZEJ5KCkpOwotCQkJbGlzdC5hZGRBbGwod3BPYmouZ2V0SW1wYWN0cygpKTsKLQkJCWxpc3QuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyLmdldFJlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzKHdwT2JqKSk7Ci0JCQlsaXN0LmFkZEFsbCh3cE9iai5nZXREZWxpdmVyYWJsZVBhcnRzKCkpOwotCi0JCQlMaXN0IGlucHV0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlucHV0TGlzdC5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIuZ2V0RXh0ZXJuYWxJbnB1dFRvKHdwT2JqKSk7Ci0JCQlpbnB1dExpc3QuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyLmdldE1hbmRhdG9yeUlucHV0VG8od3BPYmopKTsKLQkJCWlucHV0TGlzdC5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3B0aW9uYWxJbnB1dFRvKHdwT2JqKSk7Ci0KLQkJCUxpc3Qgb3V0cHV0TGlzdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldE91dHB1dEZyb20od3BPYmopOwotCQkJaWYgKHJlbW92ZVJlbGF0aW9uKQotCQkJewotCQkJCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJCQlpZiAob3V0cHV0TGlzdC5jb250YWluc0FsbChkZXNjcmlwdG9ycykpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUIDoJCQkJCi0JCQkJCWlmIChpbnB1dExpc3QuY29udGFpbnNBbGwoZGVzY3JpcHRvcnMpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlsaXN0LmFkZEFsbChpbnB1dExpc3QpOwotCQkJbGlzdC5hZGRBbGwob3V0cHV0TGlzdCk7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgcmVmSXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgcmVmSXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IHJlZkl0b3JPYmplY3QgPSAoT2JqZWN0KSByZWZJdG9yLm5leHQoKTsKLQkJCQlpZiAoKHJlZkl0b3JPYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKQotCQkJCQkJJiYgIWRlc2NyaXB0b3JzLmNvbnRhaW5zKHJlZkl0b3JPYmplY3QpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JCi0JLyoqCi0JICogUmV0dXJuIGxpc3Qgb2YgY29ycmVzcG9uZGluZyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgZm9yIGFydGlmYWN0cwotCSAqIEBwYXJhbSBhcnRpZmFjdHMKLQkgKiBAcGFyYW0gcGFyZW50QWN0aXZpdHkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFdwRGVzY0ZvckFydGlmYWN0cyhMaXN0IGFydGlmYWN0cywKLQkJCUFjdGl2aXR5IHBhcmVudEFjdGl2aXR5KSB7Ci0JCUxpc3Qgd3BEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnRpZmFjdHMuc2l6ZSgpOyBpKyspIHsKLQkJCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBhcnRpZmFjdHMuZ2V0KGkpOwotCQkJaWYgKHBhcmVudEFjdGl2aXR5ICE9IG51bGwpIHsKLQkJCQlMaXN0IGJyRWxlbWVudHMgPSBwYXJlbnRBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCi0JCQkJZm9yIChJdGVyYXRvciBpdG9yID0gYnJFbGVtZW50cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGJyT2JqID0gKE9iamVjdCkgaXRvci5uZXh0KCk7Ci0JCQkJCWlmIChick9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGJyT2JqOwotCQkJCQkJaWYgKHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJCQlpZiAod3BEZXNjLmdldFdvcmtQcm9kdWN0KCkuZXF1YWxzKGFydGlmYWN0KSkKLQkJCQkJCQkJd3BEZXNjTGlzdC5hZGQod3BEZXNjKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gd3BEZXNjTGlzdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZVJvbGUgY3JlYXRlQ29tcG9zaXRlUm9sZShDb21wb3NpdGVSb2xlIG9iaikgewotCQlDb21wb3NpdGVSb2xlIGNvbXBSb2xlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29tcG9zaXRlUm9sZSgpOwotCQljb21wUm9sZS5nZXRBZ2dyZWdhdGVkUm9sZXMoKS5hZGRBbGwob2JqLmdldEFnZ3JlZ2F0ZWRSb2xlcygpKTsKLQotCQlTdHJpbmcgcHJlc2VudGF0aW9uTmFtZSA9IG9iai5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCWNvbXBSb2xlLnNldE5hbWUob2JqLmdldE5hbWUoKSk7Ci0JCWNvbXBSb2xlLnNldFByZXNlbnRhdGlvbk5hbWUoU3RyVXRpbC5pc0JsYW5rKHByZXNlbnRhdGlvbk5hbWUpID8gb2JqCi0JCQkJLmdldE5hbWUoKSA6IHByZXNlbnRhdGlvbk5hbWUpOwotCQlyZXR1cm4gY29tcFJvbGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFRhc2tUb0FjdGl2aXR5KFRhc2sgdGFzaywgQWN0aXZpdHkgYWN0KSB7Ci0JCVdCU0Ryb3BDb21tYW5kIGNtZCA9IG5ldyBXQlNEcm9wQ29tbWFuZChhY3QsIENvbGxlY3Rpb25zCi0JCQkJLnNpbmdsZXRvbkxpc3QodGFzaykpOwotCQlCU0Ryb3BDb21tYW5kLklFeGVjdXRvciBleGVjdXRvciA9IGNtZC5nZXRFeGVjdXRvcigpOwotCQlpZiAoZXhlY3V0b3IucHJlRXhlY3V0ZSgpKSB7Ci0JCQlleGVjdXRvci5kb0V4Y2VjdXRlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUHJvY2Vzc05vdE9mVHlwZShQcm9jZXNzUGFja2FnZSBwa2csCi0JCQlFQ2xhc3MgcHJvY2Vzc1R5cGUpIHsKLQkJaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgcGtnKS5nZXRQcm9jZXNzKCk7Ci0JCQlpZiAocHJvYyAhPSBudWxsICYmICFwcm9jZXNzVHlwZS5pc0luc3RhbmNlKHByb2MpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkUGtnID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGNoaWxkUGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgY2hpbGRQa2cpLmdldFByb2Nlc3MoKTsKLQkJCQlpZiAocHJvYyAhPSBudWxsICYmICFwcm9jZXNzVHlwZS5pc0luc3RhbmNlKHByb2MpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoY2hpbGRQa2cgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCWlmIChoYXNQcm9jZXNzTm90T2ZUeXBlKChQcm9jZXNzUGFja2FnZSkgY2hpbGRQa2csIHByb2Nlc3NUeXBlKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEZpbmQgY29ycmVzcG9kaW5nIHJvbGVEZXNjcmlwdG9yIGluIHRlYW0gc2luY2Ugd2UgbWFpbnRhaW4gdHdvIHJvbGUKLQkgKiBkZXNjcmlwdG9yIGZvciB0aGUgc2FtZSByb2xlCi0JICogCi0JICogQHBhcmFtIHRlYW0KLQkgKiBAcGFyYW0gcm9sZURlc2MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZmluZFJvbGVEZXNjcmlwdG9yKFRlYW1Qcm9maWxlIHRlYW0sCi0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYykgewotCQlMaXN0IHRlYW1Sb2xlcyA9IHRlYW0uZ2V0VGVhbVJvbGVzKCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdG9yID0gdGVhbVJvbGVzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0b3JPYmplY3QgPSBpdG9yLm5leHQoKTsKLQkJCWlmIChyb2xlRGVzYyBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCQlpZiAoaXRvck9iamVjdCBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCQkJTGlzdCBmaXJzdE9iamVjdEFnZ1JvbGVzID0gKChDb21wb3NpdGVSb2xlKSByb2xlRGVzYykKLQkJCQkJCQkuZ2V0QWdncmVnYXRlZFJvbGVzKCk7Ci0JCQkJCUxpc3Qgc2Vjb25kT2JqZWN0QWdnUm9sZXMgPSAoKENvbXBvc2l0ZVJvbGUpIGl0b3JPYmplY3QpCi0JCQkJCQkJLmdldEFnZ3JlZ2F0ZWRSb2xlcygpOwotCQkJCQlpZiAoZmlyc3RPYmplY3RBZ2dSb2xlcy5lcXVhbHMoc2Vjb25kT2JqZWN0QWdnUm9sZXMpKSB7Ci0JCQkJCQlyZXR1cm4gaXRvck9iamVjdDsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAocm9sZURlc2MgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCWlmICgoaXRvck9iamVjdCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKQotCQkJCQkJJiYgKCEoaXRvck9iamVjdCBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpKSkgewotCQkJCQlPYmplY3Qgb2JqUm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIHJvbGVEZXNjKS5nZXRSb2xlKCk7Ci0JCQkJCU9iamVjdCBpdG9yT2JqUm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIGl0b3JPYmplY3QpCi0JCQkJCQkJLmdldFJvbGUoKTsKLQkJCQkJaWYgKG9ialJvbGUuZXF1YWxzKGl0b3JPYmpSb2xlKSkgewotCQkJCQkJcmV0dXJuIGl0b3JPYmplY3Q7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29sdW1uSW5kZXhUb05hbWVNYXAgZnJvbSB0aGUgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY29sdW1uCi0JICogbmFtZXMKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgdG9Db2x1bW5JbmRleFRvTmFtZU1hcChTdHJpbmcgY29sTmFtZXMpIHsKLQkJTWFwIGNvbHVtbkluZGV4VG9OYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY29sTmFtZXMsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGlkID0gMDsKLQkJd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKLQkJCWNvbHVtbkluZGV4VG9OYW1lTWFwLnB1dChuZXcgSW50ZWdlcihpZCksIGdldENvbHVtbklEKHRva2VuKSk7Ci0JCQlpZCsrOwotCQl9Ci0JCXJldHVybiBjb2x1bW5JbmRleFRvTmFtZU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENvbHVtbklEKFN0cmluZyBjb2xOYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgSUJTSXRlbVByb3ZpZGVyLkNPTFVNTlMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBjb2wgPSBJQlNJdGVtUHJvdmlkZXIuQ09MVU1OU1tpXTsKLQkJCWlmIChjb2wuZXF1YWxzKGNvbE5hbWUpKSB7Ci0JCQkJcmV0dXJuIGNvbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgYW4gbmV3IGRlc2NyaXB0b3IgY2FuIGJlIGNyZWF0ZWQgZm9yIGEgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQKLQkvLyB1bmRlciB0aGUgZ2l2ZW4gYWN0aXZpdHksIGNvbnNpZGVyaW5nIGFsbCBpbmhlcml0ZWQgZGVzY3JpcHRvcnMgb2YgdGhlIGFjdGl2aXR5LgotCS8vIEl0IGlzIE5PVCBFRkZJQ0lFTlQgdG8gY29sbGVjdCBhbGwgbGlua2VkIGVsZW1lbnRzIG9mIHRoZSBpbmhlcml0ZWQgZGVzY3JpcHRvcnMgaW50byBhIGxpc3QgYW5kIHRoZW4gY2hlY2sgaWYKLQkvLyB3aGV0aGVyIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCBpcyBpbiB0aGUgbGlzdC4KLQkvLwotCS8vIFVzZSBQcm9jZXNzQ29tbWFuZFV0aWwjZ2V0VmFsaWREZXNjcmlwdG9yKE9iamVjdCBvYmosIEFjdGl2aXR5IGFjdGl2aXR5KSBpbnN0ZWFkCi0JLy8KLS8vCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRWYXJpYWJpbGl0eUVsZW1lbnQoT2JqZWN0IG93bmVyKSB7Ci0vLwkJTGlzdCBiYXNlRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJaWYgKG93bmVyIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLS8vCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIG93bmVyOwotLy8JCQl3aGlsZSAoIWFjdGl2aXR5LmdldFZhcmlhYmlsaXR5VHlwZSgpLmVxdWFscygKLS8vCQkJCQlWYXJpYWJpbGl0eVR5cGUuTkEpKSB7Ci0vLwkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IGFjdGl2aXR5Ci0vLwkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0vLwotLy8JCQkJaWYgKChlbGVtZW50ICE9IG51bGwpICYmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0vLwkJCQkJQWN0aXZpdHkgYmFzZUFjdGl2aXR5ID0gKEFjdGl2aXR5KSBlbGVtZW50OwotLy8KLS8vCQkJCQlMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gYmFzZUFjdGl2aXR5Ci0vLwkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLS8vCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBicmVha2Rvd25FbGVtZW50cy5pdGVyYXRvcigpOyBpdG9yCi0vLwkJCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJCQlPYmplY3Qgb2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0vLwkJCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0vLwkJCQkJCQlPYmplY3QgYmFzZU9iaiA9IGdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBvYmplY3QpOwotLy8JCQkJCQkJaWYgKGJhc2VPYmogIT0gbnVsbCkgewotLy8JCQkJCQkJCWJhc2VFbGVtZW50cy5hZGQoYmFzZU9iaik7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwotLy8JCQkJCWFjdGl2aXR5ID0gYmFzZUFjdGl2aXR5OwotLy8JCQkJfQotLy8JCQkJZWxzZSB7Ci0vLwkJCQkJYnJlYWs7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCXJldHVybiBiYXNlRWxlbWVudHM7Ci0vLwl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgcHJlZGVjZXNzb3IgbGlzdCBvZiBhbGwgaXRlbSBwcm92aWRlcnMgb2YgdGhlIGdpdmVuIHByb2Nlc3MKLQkgKiAKLQkgKiBAcGFyYW0gZmFjdG9yeQotCSAqIEBwYXJhbSBwcm9jCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVByZWRlY2Vzc29ycyhBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBQcm9jZXNzIHByb2MsCi0JCQlMaXN0IHJlbW92ZWRFbGVtZW50cykgewotCQlIYXNoU2V0IGVsZW1lbnRzID0gbmV3IEhhc2hTZXQocmVtb3ZlZEVsZW1lbnRzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGZhY3RvcnksIHByb2MpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBmYWN0b3J5LmFkYXB0KG9iaiwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChpdGVtUHJvdmlkZXIgIT0gbnVsbAotCQkJCQkmJiBUbmdVdGlsLnVud3JhcChvYmopIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gaXRlbVByb3ZpZGVyLmdldFByZWRlY2Vzc29ycygpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQkJZSA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgZSkuZ2V0VGFyZ2V0KCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGVsZW1lbnRzLmNvbnRhaW5zKGUpKSB7Ci0JCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRUb0FjdGl2aXR5KEFjdGl2aXR5IGFjdCwgQnJlYWtkb3duRWxlbWVudCBiZSwgT2JqZWN0W10gcHJldkFuZE5leHQpIHsKLQkJT2JqZWN0IG5leHQgPSBwcmV2QW5kTmV4dFsxXTsKLQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwotCQlpZihuZXh0ICE9IG51bGwpIHsKLQkJCWludCBpZCA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmluZGV4T2YobmV4dCk7Ci0JCQlpZihpZCAhPSAtMSkgeyAKLQkJCQlhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoaWQsIGJlKTsKLQkJCQlhZGRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYoIWFkZGVkKSB7Ci0JCQlPYmplY3QgcHJldiA9IHByZXZBbmROZXh0WzBdOwotCQkJaWYocHJldiAhPSBudWxsKSB7CQkJCQotCQkJCWludCBpZCA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmluZGV4T2YocHJldik7Ci0JCQkJaWYoaWQgIT0gLTEpIHsKLQkJCQkJYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGlkICsgMSwgYmUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGJlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoYmUpOwotCQkJfQotCQl9Ci0KLQl9Ci0JCi0JLyoqCi0JICogTG9jYWxseSBjb250cmlidXRlcyB0byB0aGUgaW5oZXJpdGVkIGFjdGl2aXR5IHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBhZGFwdGVyCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiBAcGFyYW0gY3JlYXRlZEFjdGl2aXRpZXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eSBjb250cmlidXRlVG9BY3Rpdml0eSgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGFkYXB0ZXIsIExpc3QgY3JlYXRlZEFjdGl2aXRpZXMpIHsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KG51bGwpOwotCQlPYmplY3RbXSBwcmV2QW5kTmV4dCA9IFByb2Nlc3NVdGlsCi0JCQkJLmdldFByZXZpb3VzQW5kTmV4dChhZGFwdGVyKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlwYXJlbnQgPSBjb250cmlidXRlVG9BY3Rpdml0eSgKLQkJCQkJKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBwYXJlbnQsCi0JCQkJCWNyZWF0ZWRBY3Rpdml0aWVzKTsKLQkJfQotCQlBY3Rpdml0eSBhY3QgPSBQcm9jZXNzVXRpbC5nZW5lcmlhbGl6ZShhZGFwdGVyLAotCQkJCVZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04sIHByZXZBbmROZXh0KTsKLQkJQWN0aXZpdHkgcGFyZW50QWN0ID0gKChBY3Rpdml0eSkgcGFyZW50KTsKLQkJYWRkVG9BY3Rpdml0eShwYXJlbnRBY3QsIGFjdCwgcHJldkFuZE5leHQpOwotCQljcmVhdGVkQWN0aXZpdGllcy5hZGQoYWN0KTsKLQkJcmV0dXJuIGFjdDsKLQl9Ci0KLQkvKioKLQkgKiBMb2NhbGx5IHJlcGxhY2VzIHRoZSBpbmhlcml0ZWQgYWN0aXZpdHkgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIGFkYXB0ZXIKLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIEBwYXJhbSBjcmVhdGVkQWN0aXZpdGllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXBsYWNlQWN0aXZpdHlMb2NhbGx5KAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgYWRhcHRlciwgTGlzdCBjcmVhdGVkQWN0aXZpdGllcykgewotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQobnVsbCk7Ci0JCU9iamVjdFtdIHByZXZBbmROZXh0ID0gUHJvY2Vzc1V0aWwKLQkJCQkuZ2V0UHJldmlvdXNBbmROZXh0KGFkYXB0ZXIpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCXBhcmVudCA9IGNvbnRyaWJ1dGVUb0FjdGl2aXR5KAotCQkJCQkoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHBhcmVudCwKLQkJCQkJY3JlYXRlZEFjdGl2aXRpZXMpOwotCQl9Ci0JCUFjdGl2aXR5IGFjdCA9IFByb2Nlc3NVdGlsLmdlbmVyaWFsaXplKGFkYXB0ZXIsCi0JCQkJVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5ULCBwcmV2QW5kTmV4dCk7Ci0JCUFjdGl2aXR5IHBhcmVudEFjdCA9ICgoQWN0aXZpdHkpIHBhcmVudCk7Ci0JCWFkZFRvQWN0aXZpdHkocGFyZW50QWN0LCBhY3QsIHByZXZBbmROZXh0KTsKLQkJY3JlYXRlZEFjdGl2aXRpZXMuYWRkKGFjdCk7Ci0JfQotCi0Jc3RhdGljIE9iamVjdFtdIGdldFByZXZpb3VzQW5kTmV4dCgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGFkYXB0ZXIpIHsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KG51bGwpOwotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXIKLQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCUxpc3QgY2hpbGRyZW4gPSAoTGlzdCkgaXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKHBhcmVudCk7Ci0JCWludCBpZCA9IGNoaWxkcmVuLmluZGV4T2YoYWRhcHRlcikgKyAxOwotCQlPYmplY3QgbmV4dCA9IG51bGw7Ci0JCWlmIChpZCA8IGNoaWxkcmVuLnNpemUoKSkgewotCQkJbmV4dCA9IGNoaWxkcmVuLmdldChpZCk7Ci0JCX0KLQkJT2JqZWN0IHByZXYgPSBudWxsOwotCQlpZCAtPSAyOwotCQlpZiAoaWQgPiAtMSkgewotCQkJcHJldiA9IGNoaWxkcmVuLmdldChpZCk7Ci0JCX0KLQotCQlPYmplY3RbXSBwcmV2QW5kTmV4dCA9IHsgcHJldiwgbmV4dCB9OwotCQlyZXR1cm4gcHJldkFuZE5leHQ7Ci0JfQotCi0Jc3RhdGljIEFjdGl2aXR5IGdlbmVyaWFsaXplKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGFkYXB0ZXIsCi0JCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSwgT2JqZWN0W10gcHJldkFuZE5leHQpIHsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyCi0JCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCUFjdGl2aXR5IGFjdCA9IGdlbmVyYWxpemUoKEFjdGl2aXR5KSBUbmdVdGlsLnVud3JhcChhZGFwdGVyKSwgdHlwZSk7Ci0JCU9iamVjdCBuZXh0ID0gcHJldkFuZE5leHRbMV07Ci0JCWlmKG5leHQgIT0gbnVsbCkgewotCQkJYWN0LnNldFByZXNlbnRlZEFmdGVyKChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcChuZXh0KSk7Ci0JCQlpZihuZXh0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCSgoQnJlYWtkb3duRWxlbWVudCluZXh0KS5zZXRQcmVzZW50ZWRCZWZvcmUoYWN0KTsKLQkJCX0KLQkJfQotCQlPYmplY3QgcHJldiA9IHByZXZBbmROZXh0WzBdOwotCQlpZihwcmV2ICE9IG51bGwpIHsKLQkJCWFjdC5zZXRQcmVzZW50ZWRCZWZvcmUoKEJyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKHByZXYpKTsKLQkJCWlmIChwcmV2IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCSgoQnJlYWtkb3duRWxlbWVudClwcmV2KS5zZXRQcmVzZW50ZWRBZnRlcihhY3QpOwotCQkJfQotCQl9Ci0JCUlCU0l0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGFjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJYnNJdGVtUHJvdmlkZXIuc2V0RXhwYW5kZWQoYWRhcHRlci5pc0V4cGFuZGVkKCkpOwotCQlyZXR1cm4gYWN0OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGltbWVkaWF0ZSBiYXNlIHByb2Nlc3Mgb2YgdGhlIGdpdmVuCi0JICogQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgdGhhdCByZXByZXNlbnRzIGFuIGluaGVyaXRlZAotCSAqIGJyZWFrZG93biBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBpdGVtUHJvdmlkZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzIGdldEltbWVkaWF0ZUJhc2VQcm9jZXNzKAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyKSB7Ci0JCUFjdGl2aXR5IGluaGVyaXRvciA9IGdldEluaGVyaXRvcihpdGVtUHJvdmlkZXIpOwotCQlpZiAoaW5oZXJpdG9yICE9IG51bGwpIHsKLQkJCXJldHVybiBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIGluaGVyaXRvcgotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhY3Rpdml0eSBpbiB0aGUgcHJvY2VzcyBvZiB0aGUgZ2l2ZW4gaXRlbSBwcm92aWRlciB0aGF0IGluaGVyaXRzCi0JICogdGhlIGVsZW1lbnQgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIGl0ZW0gcHJvdmlkZXIKLQkgKiAKLQkgKiBAcGFyYW0gaXRlbVByb3ZpZGVyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHkgZ2V0SW5oZXJpdG9yKAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyKSB7Ci0JCWlmIChpdGVtUHJvdmlkZXIuaXNSZWFkT25seSgpKSB7Ci0JCQkvLyB0aGlzIHJlcHJlc2VudHMgYW4gaW5oZXJpdGVkIGJyZWFrZG93biBlbGVtZW50Ci0JCQkvLwotCQkJZm9yIChPYmplY3QgcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChpdGVtUHJvdmlkZXIpOyBwYXJlbnQgIT0gbnVsbDspIHsKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJcGFyZW50ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgcGFyZW50KQotCQkJCQkJCS5nZXRQYXJlbnQocGFyZW50KTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgcGFyZW50IGxpc3Qgb2YgPGNvZGU+d3JhcHBlcjwvY29kZT4gZnJvbSA8Y29kZT5mcm9tPC9jb2RlPiwKLQkgKiBleGNsdWRlZCA8Y29kZT5mcm9tPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBmcm9tCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgdW53cmFwcGVkIHBhcmVudCBvYmplY3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFBhcmVudExpc3QoT2JqZWN0IGZyb20sCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCXJldHVybiBnZXRQYXJlbnRMaXN0KHdyYXBwZXIsIGZyb20sIHdyYXBwZXIuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGxpc3Qgb2YgR1VJRHMgZnJvbSB0aGUgdG9wIGVsZW1lbnQgdG8gdGhlIHdyYXBwZXIgaW5jbHVzaXZlLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlua2VkTGlzdDxTdHJpbmc+IGdldEd1aWRMaXN0KEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJTGlua2VkTGlzdDxTdHJpbmc+IGd1aWRMaXN0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOwotCQlMaXN0IHBhcmVudExpc3QgPSBQcm9jZXNzVXRpbC5nZXRQYXJlbnRMaXN0KG51bGwsIHdyYXBwZXIpOwotCQlpZiAoIXBhcmVudExpc3QuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYXJlbnRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQkvLyBleGNsdWRlIFRhc2tEZXNjcmlwdG9yIGFuZCBSb2xlRGVzY3JpcHRvciBmcm9tIHRoZSBwYXJlbnQKLQkJCQkvLyBwYXRoIGIvYyB0aG9zZSBkZXNjcmlwdG9ycyBjYW4gYmUKLQkJCQkvLyBwYXJlbnQgb25seSBpbiBDQlMgdmlldwotCQkJCWlmICghKGUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvciB8fCBlIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpKSB7Ci0JCQkJCWd1aWRMaXN0LmFkZChlLmdldEd1aWQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJZ3VpZExpc3QuYWRkKGUuZ2V0R3VpZCgpKTsKLQkJcmV0dXJuIGd1aWRMaXN0OwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBsaXN0IG9mIEdVSURzIGZyb20gc3RhcnQgdG8gYWN0aXZpdHksIGV4Y2x1ZGVkIHN0YXJ0IGFjdGl2aXR5LgotCSAqIEBwYXJhbSBmcm9tCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlua2VkTGlzdDxTdHJpbmc+IGdldEd1aWRMaXN0KEFjdGl2aXR5IHN0YXJ0LCBBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlMaW5rZWRMaXN0PFN0cmluZz4gZ3VpZExpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7Ci0JCWZvcihBY3Rpdml0eSBwYXJlbnQgPSBhY3Rpdml0eTsgcGFyZW50ICE9IG51bGwgJiYgKHN0YXJ0ID09IG51bGwgfHwgcGFyZW50ICE9IHN0YXJ0KTsgcGFyZW50ID0gcGFyZW50LmdldFN1cGVyQWN0aXZpdGllcygpKSB7Ci0JCQlndWlkTGlzdC5hZGRGaXJzdChwYXJlbnQuZ2V0R3VpZCgpKTsKLQkJfQotCQlyZXR1cm4gZ3VpZExpc3Q7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldEd1aWRMaXN0KE9iamVjdCBhY3Rpdml0eU9yV3JhcHBlcikgewotCQlpZihhY3Rpdml0eU9yV3JhcHBlciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gZ2V0R3VpZExpc3QoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWFjdGl2aXR5T3JXcmFwcGVyKTsKLQkJfQotCQllbHNlIGlmKGFjdGl2aXR5T3JXcmFwcGVyIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXJldHVybiBnZXRHdWlkTGlzdChudWxsLCAoQWN0aXZpdHkpIGFjdGl2aXR5T3JXcmFwcGVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9HdWlkUGF0aChMaXN0PFN0cmluZz4gZ3VpZExpc3QpIHsKLQkJU3RyaW5nQnVmZmVyIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoU3RyaW5nIGd1aWQgOiBndWlkTGlzdCkgewotCQkJcGF0aC5hcHBlbmQoJy8nKS5hcHBlbmQoZ3VpZCk7Ci0JCX0KLQkJcmV0dXJuIHBhdGgudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBwYXJlbnQgbGlzdCBvZiA8Y29kZT5vYmplY3Q8L2NvZGU+IGZyb20gPGNvZGU+ZnJvbTwvY29kZT4sCi0JICogZXhjbHVkZWQgPGNvZGU+ZnJvbTwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIGZyb20KLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgdW53cmFwcGVkIHBhcmVudCBvYmplY3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFBhcmVudExpc3QoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGZyb20sIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUFycmF5TGlzdCBwYXJlbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQob2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlmb3IgKE9iamVjdCBwYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KG9iamVjdCk7IHBhcmVudCAhPSBmcm9tCi0JCQkJJiYgcGFyZW50ICE9IG51bGw7KSB7Ci0JCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAocGFyZW50KTsKLQkJCU1ldGhvZEVsZW1lbnQgZTsJCQkKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJZSA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXI7Ci0JCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgcGFyZW50OwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdCgKLQkJCQkJCQlwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJfQotCQkJCWlmKFByb2Nlc3NVdGlsLmlzVG9wUHJvY2VzcyhlKSkgewotCQkJCQlwYXJlbnQgPSBudWxsOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocGFyZW50KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIG11c3QgYmUgYSBJdGVtUHJvdmlkZXJBZGFwdGVyCi0JCQkJLy8KLQkJCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIG9iaik7Ci0JCQkJZSA9IChNZXRob2RFbGVtZW50KSBhZGFwdGVyLmdldFRhcmdldCgpOwotCQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHBhcmVudCk7Ci0JCQl9Ci0JCQlwYXJlbnRMaXN0LmFkZCgwLCBlKTsKLQkJfQotCQlyZXR1cm4gcGFyZW50TGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB3cmFwcGVycyBvZiBhbGwgYnJlYWtkb3duIHN0cnVjdHVyZSAoQlMpIHZpZXdzIGluIHRoZSBmb2xsb3dpbmcKLQkgKiBvcmRlcjogV0JTLCBUQlMsIFdQQlMKLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqICAgICAgICAgICAgdGhlIHdyYXBwZXIgb2YgYSBCUyB2aWV3Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRXcmFwcGVycyhCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyLCBBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXMpIHsKLQkJQXJyYXlMaXN0IHJvbGxlZFVwSXRlbVByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCUFkYXB0ZXJGYWN0b3J5IHJvb3RBZGFwdGVyRmFjdG9yeSA9IFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KHdyYXBwZXIuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCQlPYmplY3QgcHJvYyA9IHdyYXBwZXIuZ2V0VG9wSXRlbSgpOwkJCQkJCQotCQkJQXJyYXlMaXN0IG9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KFByb2Nlc3NVdGlsLmdldFBhcmVudExpc3QocHJvYywKLQkJCQkJd3JhcHBlcikpOwotCQkJQXJyYXlMaXN0IHdyYXBwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVyRmFjdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yaWVzW2ldOwotCQkJCWlmIChhZGFwdGVyRmFjdG9yeSA9PSByb290QWRhcHRlckZhY3RvcnkpIHsKLQkJCQkJd3JhcHBlcnMuYWRkKHdyYXBwZXIpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJCQlvYmplY3RzLmFkZChlKTsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gcHJvYzsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gb2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyMS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcjEubmV4dCgpOwotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChvYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQotCQkJCQkvLyBtYWtlIHN1cmUgdGhlIGFjdGl2aXR5IGlzIHJvbGxlZCBkb3duIGJlZm9yZSBsb29raW5nIGludG8gaXRzIGNoaWxkcmVuCi0JCQkJCS8vCi0JCQkJCU9iamVjdCBiZSA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7CQkJCQkJCQkKLQkJCQkJaWYoYmUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQkJCQkJCWlmKGl0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCkpIHsKLQkJCQkJCQkJaXRlbVByb3ZpZGVyLmJhc2ljU2V0Um9sbGVkVXAoZmFsc2UpOwotCQkJCQkJCQlyb2xsZWRVcEl0ZW1Qcm92aWRlcnMuYWRkKGl0ZW1Qcm92aWRlcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSBpZihhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXI7Ci0JCQkJCQkJaWYoaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKSkgewotCQkJCQkJCQlpdGVtUHJvdmlkZXIuc2V0Um9sbGVkVXAoZmFsc2UpOwotCQkJCQkJCQlyb2xsZWRVcEl0ZW1Qcm92aWRlcnMuYWRkKGl0ZW1Qcm92aWRlcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlmaW5kX2NoaWxkOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWRhcHRlcgotCQkJCQkJCS5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmIChlbGVtZW50ID09IFRuZ1V0aWwudW53cmFwKGNoaWxkKSkgewotCQkJCQkJCW9iamVjdCA9IGNoaWxkOwotCQkJCQkJCWJyZWFrIGZpbmRfY2hpbGQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCXdyYXBwZXJzLmFkZChvYmplY3QpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotCQkJCQkJCSJDb3VsZCBub3QgZmluZCB3cmFwcGVyIGZvciAiICsgZSArICIgdXNpbmcgYWRhcHRlciBmYWN0b3J5ICIgKyBhZGFwdGVyRmFjdG9yeSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB3cmFwcGVyczsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmKCFyb2xsZWRVcEl0ZW1Qcm92aWRlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJLy8gcmVzdG9yZSB0aGUgcm9sbGVkVXAgZmxhZwotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcm9sbGVkVXBJdGVtUHJvdmlkZXJzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGl0ZXIubmV4dCgpKS5iYXNpY1NldFJvbGxlZFVwKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXRzIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBzcGVjaWZpYyBtb2RlbCBpbmZvIAotCSAqIEBwYXJhbSBtb2RlbEluZm8KLQkgKiBAcGFyYW0gb2JqZWN0IFdvcmtQcm9kdWN0RGVzY3JpcHRvciBvciBpdHMgd3JhcHBlcgotCSAqIEBwYXJhbSBpdGVtUHJvdmlkZXIgaXRlbSBwcm92aWRlciBvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3Igb3IgaXRzIHdyYXBwZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0V1BETW9kZWxJbmZvKFN0cmluZ0J1ZmZlciBtb2RlbEluZm8sIE9iamVjdCBvYmplY3QsIE9iamVjdCBpdGVtUHJvdmlkZXIpIHsKLQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7CQotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpZWxlbWVudDsKLQkJCWlmKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCS8vIGNoZWNrIGlmIHRoaXMgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgaXMgc2hvd24gdW5kZXIgYSB0YXNrIGRlc2NyaXB0b3Igb3Igcm9sZSBkZXNjcmlwdG9yCi0JCQkJLy8KLQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQkJaWYoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQlhZGFwdGVyRmFjdG9yeSA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcilpdGVtUHJvdmlkZXIpLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJYWRhcHRlckZhY3RvcnkgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWl0ZW1Qcm92aWRlcikuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQl9Ci0JCQkJaWYoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQlPYmplY3QgcGFyZW50RGVzY3JpcHRvciA9IG51bGw7Ci0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcilpdGVtUHJvdmlkZXI7Ci0JCQkJCWZpbmRQYXJlbnREZXNjcmlwdG9yOgotCQkJCQkJZm9yKE9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChvYmplY3QpOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocGFyZW50KSkgewotCQkJCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAocGFyZW50KTsKLQkJCQkJCQlpZihlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCQkJcGFyZW50RGVzY3JpcHRvciA9IGU7Ci0JCQkJCQkJCWJyZWFrIGZpbmRQYXJlbnREZXNjcmlwdG9yOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCQlicmVhayBmaW5kUGFyZW50RGVzY3JpcHRvcjsKLQkJCQkJCQl9Ci0JCQkJCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCX0KLQkJCQkJaWYocGFyZW50RGVzY3JpcHRvciAhPSBudWxsKSB7CQotCQkJCQkJLy8gd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgaXMgc2hvd24gdW5kZXIgYSB0YXNrIGRlc2NyaXB0b3IKLQkJCQkJCS8vIHNob3cgb25seSBtb2RlbCBpbmZvIHJlbGF0ZWQgdG8gdGhpcyB0YXNrIGRlc2NyaXB0b3IKLQkJCQkJCS8vCi0JCQkJCQlBcnJheUxpc3QgZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlpZihBc3NvY2lhdGlvbkhlbHBlci5nZXRNYW5kYXRvcnlJbnB1dFRvKHdwZCkuY29udGFpbnMocGFyZW50RGVzY3JpcHRvcikpIHsKLQkJCQkJCQlmZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZihBc3NvY2lhdGlvbkhlbHBlci5nZXRPcHRpb25hbElucHV0VG8od3BkKS5jb250YWlucyhwYXJlbnREZXNjcmlwdG9yKSkgewotCQkJCQkJCWZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCkpOwkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJCWlmKEFzc29jaWF0aW9uSGVscGVyLmdldE91dHB1dEZyb20od3BkKS5jb250YWlucyhwYXJlbnREZXNjcmlwdG9yKSkgewotCQkJCQkJCWZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZighZmVhdHVyZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJaWYgKG1vZGVsSW5mby50b1N0cmluZygpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQltb2RlbEluZm8uYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCQkJCQkJbW9kZWxJbmZvLmFwcGVuZChUbmdVdGlsLmdldEZlYXR1cmVUZXh0KGZlYXR1cmUpKTsKLQkJCQkJCQkJaWYoaSA8IGZlYXR1cmVzLnNpemUoKSAtMSl7Ci0JCQkJCQkJCQltb2RlbEluZm8uYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCX0JCQkJCQkKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWdldE1vZGVsSW5mb0ZvcldvcmtQcm9kdWN0RGVzY3JpcHRvcihtb2RlbEluZm8sIHdwZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIE1vZGVsSW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gV29ya1Byb2R1Y3REZXNjcmlwdG9yLiBNb2RlbAotCSAqIEluZm9ybWF0aW9uIGlzIGZvciBQQlMgKFdvcmtQcm9kdWN0RGVzY3JpcHRvcnMsIGluY2x1ZGluZyBFeHRlbmRlZAotCSAqIEFjdGl2aXR5J3MgV29ya1Byb2R1Y3REZXNjcmlwdG9ycykuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRNb2RlbEluZm9Gb3JXb3JrUHJvZHVjdERlc2NyaXB0b3IoCi0JCQlTdHJpbmdCdWZmZXIgbW9kZWxJbmZvLCBXb3JrUHJvZHVjdERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCVN0cmluZyBjb21tYSA9ICIsIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIUFzc29jaWF0aW9uSGVscGVyLmdldE1hbmRhdG9yeUlucHV0VG8ob2JqZWN0KS5pc0VtcHR5KCkpIHsKLQkJCWlmIChtb2RlbEluZm8udG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQltb2RlbEluZm8uYXBwZW5kKGNvbW1hKTsKLQkJCX0KLQkJCW1vZGVsSW5mby5hcHBlbmQoVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3JfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICghQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3B0aW9uYWxJbnB1dFRvKG9iamVjdCkuaXNFbXB0eSgpKSB7Ci0JCQlpZiAobW9kZWxJbmZvLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJbW9kZWxJbmZvLmFwcGVuZChjb21tYSk7Ci0JCQl9Ci0JCQltb2RlbEluZm8uYXBwZW5kKFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX29wdGlvbmFsSW5wdXRfZmVhdHVyZSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICghQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3V0cHV0RnJvbShvYmplY3QpLmlzRW1wdHkoKSkgewotCQkJaWYgKG1vZGVsSW5mby50b1N0cmluZygpLmxlbmd0aCgpID4gMCkgewotCQkJCW1vZGVsSW5mby5hcHBlbmQoY29tbWEpOwotCQkJfQotCQkJbW9kZWxJbmZvLmFwcGVuZChVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl9vdXRwdXRfZmVhdHVyZSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldER1cGxpY2F0ZURlc2NyaXB0b3JzQWZ0ZXJSZXZlYWwoQ29sbGVjdGlvbiBlbGVtZW50c1RvUmV2ZWFsKSB7Ci0JCUNvbGxlY3Rpb24gZHVwbGljYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb1JldmVhbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCURlc2NyaXB0b3IgZGVzYyA9IChEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IFByb2Nlc3NVdGlsLmdldEFzc29jaWF0ZWRFbGVtZW50KGRlc2MpOwotCQkJCWlmKGUgIT0gbnVsbCkgewotCQkJCQlBY3Rpdml0eSBhY3QgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KGRlc2MpOwotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3QpLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQkJCWUgPSAoTWV0aG9kRWxlbWVudCkgUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCkucmVzb2x2ZShlLCBjb25maWcpOwotCQkJCQlPYmplY3QgZHVwbGljYXRlID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldERlc2NyaXB0b3IoZSwgYWN0LCBjb25maWcpOwotCQkJCQlpZihkdXBsaWNhdGUgIT0gbnVsbCAmJiAhZHVwbGljYXRlcy5jb250YWlucyhkdXBsaWNhdGUpKSB7CQkJCQkKLQkJCQkJCWR1cGxpY2F0ZXMuYWRkKGR1cGxpY2F0ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBkdXBsaWNhdGVzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248RGVzY3JpcHRvcj4gZ2V0RHVwbGljYXRlRGVzY3JpcHRvcnNBZnRlclN1cHByZXNzKENvbGxlY3Rpb24gZWxlbWVudHNUb1N1cHByZXNzKSB7Ci0JCUNvbGxlY3Rpb248RGVzY3JpcHRvcj4gZHVwbGljYXRlcyA9IG5ldyBBcnJheUxpc3Q8RGVzY3JpcHRvcj4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb1N1cHByZXNzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0ZW0gPSBpdGVyLm5leHQoKTsKLQkJCWlmKGl0ZW0gaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJRGVzY3JpcHRvciBkZXNjID0gKERlc2NyaXB0b3IpIGl0ZW07Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoZGVzYyk7Ci0JCQkJaWYoZSAhPSBudWxsKSB7Ci0JCQkJCUFjdGl2aXR5IGFjdCA9IFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkoZGVzYyk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYoZWxlbWVudCAhPSBkZXNjICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yICYmIGVsZW1lbnQuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkJTWV0aG9kRWxlbWVudCBsaW5rZWRFbGVtZW50ID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIGVsZW1lbnQpOwotCQkJCQkJCWlmKGxpbmtlZEVsZW1lbnQgPT0gZSkgewotCQkJCQkJCQlkdXBsaWNhdGVzLmFkZCgoRGVzY3JpcHRvcikgZWxlbWVudCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZHVwbGljYXRlczsKLQkJCi0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgcmVwcmVzZW50aW5nIGEgaW5oZXJpdGVkIGVsZW1lbnQgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlIHRyZWUgb2YgcHJvY2VzcyBlZGl0b3IKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0luaGVyaXRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyCi0JCSYmICgoRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilvYmplY3QpLmlzSW5oZXJpdGVkKCk7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gYWN0aXZpdHkgaGFzIGluaGVyaXRlZCBhbnkgYnJlYWtkb3duIGVsZW1lbnQgdmlhIGV4dGVuc2lvbiBvZiBsb2NhbCBjb250cmlidXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0luaGVyaXRlZChBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGFjdGl2aXR5KSB7Ci0KLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMEw7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJcmV0dXJuICgoQWN0aXZpdHkpb2JqZWN0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQlpZihvIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG87Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlpZih2ZSAhPSBudWxsKSB7Ci0JCQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gYWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCQlpZih0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTIHx8IHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTikgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250cmlidXRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcgotCQkmJiAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKW9iamVjdCkuaXNDb250cmlidXRlZCgpOwotCX0JCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldEFsbFN1YlRlYW1zKFRlYW1Qcm9maWxlIHRlYW0sIExpc3QgdGVhbXMpIHsKLQkJdGVhbXMuYWRkKHRlYW0pOwotCQlMaXN0IHN1YlRlYW1zID0gdGVhbS5nZXRTdWJUZWFtKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHN1YlRlYW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJVGVhbVByb2ZpbGUgc3ViVGVhbSA9IChUZWFtUHJvZmlsZSkgaXRvci5uZXh0KCk7Ci0KLQkJCWdldEFsbFN1YlRlYW1zKHN1YlRlYW0sIHRlYW1zKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBMaXN0IGdldFRlYW1Qcm9maWxlcyhPYmplY3Qgb2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCUxpc3QgdGVhbXMgPSBuZXcgQXJyYXlMaXN0KEFzc29jaWF0aW9uSGVscGVyLmdldFRlYW1Qcm9maWxlcyhyb2xlRGVzYykpOwotCQkKLQkJLy8gZ2V0IGFsbCB0aGUgdGVhbSBwcm9maWxlcyB0aGF0IGFyZSBpbiBzY29wZSBvZiB0aGUgd3JhcHBlcgotCQkvLwotCQlIYXNoU2V0IHZpc2libGVUZWFtcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KG9iamVjdCk7IHBhcmVudCAhPSBudWxsOykgewotCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsJCQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRhcHRlci5nZXRDaGlsZHJlbihwYXJlbnQpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQkJTGlzdCBhY3Rpdml0eVRlYW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlnZXRBbGxTdWJUZWFtcygoVGVhbVByb2ZpbGUpIGUsIGFjdGl2aXR5VGVhbXMpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBhY3Rpdml0eVRlYW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykJewotCQkJCQkJT2JqZWN0IG8gPSBpdG9yLm5leHQoKTsKLQkJCQkJCWlmKG8gaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSAmJiAoKFRlYW1Qcm9maWxlKW8pLmdldFRlYW1Sb2xlcygpLmNvbnRhaW5zKHJvbGVEZXNjKSkgewotCQkJCQkJCXZpc2libGVUZWFtcy5hZGQobyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlPYmplY3QgbmV3UGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocGFyZW50KTsKLQkJCWlmKG5ld1BhcmVudCA9PSBudWxsICYmIHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJbmV3UGFyZW50ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eSgoQWN0aXZpdHkpcGFyZW50KTsKLQkJCX0KLQkJCXBhcmVudCA9IG5ld1BhcmVudDsKLQkJfQotCQkKLQkJLy8gcmVtb3ZlIGFueSB0ZWFtIHByb2ZpbGUgdGhhdCBpcyBub3QgaW4gdGhlIHNjb3BlIG9mIHRoZSB3cmFwcGVyCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRlYW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHRlYW0gPSBpdGVyLm5leHQoKTsKLQkJCWlmKCF2aXNpYmxlVGVhbXMuY29udGFpbnModGVhbSkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdGVhbXM7Ci0KLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgbGlzdCBvZiB2aXNpYmxlIHRlYW0gcHJvZmlsZXMgZm9yIHRoZSByb2xlIGRlc2NyaXB0b3IgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIHdyYXBwZXIKLQkgKiAKLQkgKiBAcGFyYW0gcm9sZURlc2NXcmFwcGVyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRUZWFtUHJvZmlsZXMoUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIHJvbGVEZXNjV3JhcHBlcikgewotCQlyZXR1cm4gZ2V0VGVhbVByb2ZpbGVzKHJvbGVEZXNjV3JhcHBlciwgcm9sZURlc2NXcmFwcGVyLCByb2xlRGVzY1dyYXBwZXIuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRUZWFtUHJvZmlsZXMoUm9sZURlc2NyaXB0b3Igcm9sZURlc2MsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQocm9sZURlc2MsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXJldHVybiBnZXRUZWFtUHJvZmlsZXMocm9sZURlc2MsIGFkYXB0ZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGxpc3Qgb2YgcmVjdXJzaXZlIGNoaWxkIGVsZW1lbnRzIGZvciB0aGUgZ2l2ZW4gYWN0aXZpdHkgYW5kIGdpdmVuIHR5cGUKLQkgKiBAcGFyYW0gYWN0Ci0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gY29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRDaGlsZEVsZW1lbnRzKEFjdGl2aXR5IGFjdCwgQ2xhc3MgdHlwZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWZvciAoaW50IGkgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5nZXQoaSk7Ci0JCQlpZih0eXBlLmlzSW5zdGFuY2UoZWxlbWVudCkpIHsKLQkJCQljb2xsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWdldENoaWxkRWxlbWVudHMoKEFjdGl2aXR5KSBlbGVtZW50LCB0eXBlLCBjb2xsZWN0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElGaWx0ZXIgZ2V0RmlsdGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IHJvb3RBZGFwdGVyRmFjdG9yeSA9IFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYocm9vdEFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJcmV0dXJuICgoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSlyb290QWRhcHRlckZhY3RvcnkpLmdldEZpbHRlcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBjYWxjdWxhdGVkIGxpc3Qgb2YgYXJ0aWZhY3QgY29udGFpbmVkIGJ5IHRoZSBnaXZlbiBhcnRpZmFjdCBiYXNlZCBvbiB0aGUKLQkgKiBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYWRhcHRlciBmYWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBhcnRpZmFjdAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKEFydGlmYWN0IGFydGlmYWN0LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JCUlGaWx0ZXIgZmlsdGVyID0gUHJvY2Vzc1V0aWwuZ2V0RmlsdGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcikgewotCQkJY29uZmlnID0gKChJQ29uZmlndXJhdG9yKWZpbHRlcikuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQl9Ci0JCQotCQlpZihjb25maWcgPT0gbnVsbCkgewotCQkJcmV0dXJuIGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIChMaXN0KSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5nZXRSZWZlcmVuY2UoCi0JCQkJCWFydGlmYWN0LAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKSwKLQkJCQkJY29uZmlnKTsKLQkJfQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDb250YWluZWRBcnRpZmFjdHNEZXNjcmlwdG9ycyhXb3JrUHJvZHVjdERlc2NyaXB0b3IgYXJ0aWZhY3REZXNjLCBMaXN0IGFydGlmYWN0RGVzY3JpcHRvcnMpIHsKLQkJaWYoYXJ0aWZhY3REZXNjcmlwdG9ycy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBhcnRpZmFjdERlc2MuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCi0JCS8vIGNvbGxlY3Qgb3duIGFuZCBjb250cmlidXRpbmcgc3ViYXJ0aWZhY3QgZGVzY3JpcHRvcnMKLQkJLy8KLQkJQXJyYXlMaXN0IGNvbnRhaW5lZERlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IoaW50IGkgPSBhcnRpZmFjdERlc2NyaXB0b3JzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpYXJ0aWZhY3REZXNjcmlwdG9ycy5nZXQoaSkpOwotCQkJV29ya1Byb2R1Y3QgYSA9IHdwZC5nZXRXb3JrUHJvZHVjdCgpOwotCQkJaWYoYSAhPSBudWxsKSB7Ci0JCQkJRU9iamVjdCBjb250YWluZXIgPSBhLmVDb250YWluZXIoKTsKLQkJCQlpZihjb250YWluZXIgPT0gYXJ0aWZhY3QgfHwgCi0JCQkJCQkoY29udGFpbmVyIGluc3RhbmNlb2YgQXJ0aWZhY3QgJiYgVG5nVXRpbC5pc0NvbnRyaWJ1dG9yT2YoYXJ0aWZhY3QsIChBcnRpZmFjdCkgY29udGFpbmVyKSkpIHsKLQkJCQkJY29udGFpbmVkRGVzY3JpcHRvcnMuYWRkKHdwZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb250YWluZWREZXNjcmlwdG9yczsKLQl9Ci0JCi0vLwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250YWluZWRCeShBcnRpZmFjdCBwYXJlbnQsIEFydGlmYWN0IGNoaWxkLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotLy8JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLS8vCQlJRmlsdGVyIGZpbHRlciA9IFByb2Nlc3NVdGlsLmdldEZpbHRlcihhZGFwdGVyRmFjdG9yeSk7Ci0vLwkJaWYoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcikgewotLy8JCQljb25maWcgPSAoKElDb25maWd1cmF0b3IpZmlsdGVyKS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0vLwkJfQotLy8JCQotLy8JCWlmKGNvbmZpZyA9PSBudWxsKSB7Ci0vLwkJCXJldHVybiBVbWFVdGlsLmlzQ29udGFpbmVkQnkoY2hpbGQsIHBhcmVudCk7Ci0vLwkJfQotLy8JCQotLy8JCWZpbmFsIE1ldGhvZENvbmZpZ3VyYXRpb24gY2ZnID0gY29uZmlnOwkJCi0vLwkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihwYXJlbnQsIGZhbHNlKSB7Ci0vLwotLy8JCQkvKioKLS8vCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLS8vCQkJICovCi0vLwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotLy8KLS8vCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLS8vCQkJCXJldHVybiAoKENvbGxlY3Rpb24pIFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldFJlZmVyZW5jZSgKLS8vCQkJCQkJKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0LAotLy8JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKSwKLS8vCQkJCQkJY2ZnKSkuaXRlcmF0b3IoKTsKLS8vCQkJfQotLy8JCQkKLS8vCQl9OwotLy8JCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0vLwkJCWlmKGNoaWxkID09IGl0ZXIubmV4dCgpKSB7Ci0vLwkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJfQotLy8JCX0KLS8vCQkKLS8vCQlyZXR1cm4gZmFsc2U7Ci0vLwl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBXb3JrUHJvZHVjdERlc2NyaXB0b3IgPGNvZGU+cGFyZW50PC9jb2RlPiBjYW4gcmVwcmVzZW50IHRoZSBwYXJlbnQgb2YgdGhlIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgotCSAqIDxjb2RlPmNoaWxkPC9jb2RlPiBiYXNlZCBvbiB0aGUgcmVsYXRpb25zaGlwIG9mIHRoZWlyIGxpbmtlZCBhcnRpZmFjdCBhbmQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGFydGlmYWN0IGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udGFpbmVkQnkoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHBhcmVudCwgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGNoaWxkLCBmaW5hbCBMaXN0IGFydGlmYWN0RGVzY0xpc3QpIHsKLS8vCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKHBhcmVudCwgZmFsc2UpIHsKLS8vCQkJCi0vLwkJCS8qKgotLy8JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotLy8JCQkgKi8KLS8vCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0vLwkJCQotLy8JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotLy8JCQkJcmV0dXJuIGdldENvbnRhaW5lZEFydGlmYWN0c0Rlc2NyaXB0b3JzKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iamVjdCwgYXJ0aWZhY3REZXNjTGlzdCkuaXRlcmF0b3IoKTsKLS8vCQkJfQotLy8JCQkKLS8vCQl9OwotLy8JCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0vLwkJCWlmKGNoaWxkID09IGl0ZXIubmV4dCgpKSB7Ci0vLwkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJfQotLy8JCX0KLS8vCQkKLS8vCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlyZXR1cm4gVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KGNoaWxkLmdldFdvcmtQcm9kdWN0KCksIHBhcmVudC5nZXRXb3JrUHJvZHVjdCgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGZpbmFsIENvbGxlY3Rpb24gY2hpbGRyZW4sIGJvb2xlYW4gdW53cmFwKSB7Ci0JCUxpc3QgYXJ0aWZhY3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQotCQkvLyBnZXQgdGhlIGFydGlmYWN0IGxpc3QKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmKHVud3JhcCkgewotCQkJCWNoaWxkID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQkJfQotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgY2hpbGQpCi0JCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQlpZiAod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQlhcnRpZmFjdExpc3QuYWRkKHdwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkKLQkJLy8gcHJvY2VzcyB0aGUgYXJ0aWZhY3QgbGlzdCB0byBnZXQgdGhlIHRvcC1tb3N0IG9uZXMKLQkJLy8KLQkJU2V0IHRvcE1vc3RBcnRpZmFjdHMgPSBuZXcgSGFzaFNldCgpOwotCQlBcnRpZmFjdCBjYW5kaWRhdGUgPSBudWxsOwotCQotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCXdoaWxlICghYXJ0aWZhY3RMaXN0LmlzRW1wdHkoKSkgewotCQkJCi0JCQlpZiAoIWZvdW5kKQotCQkJewotCQkJCWNhbmRpZGF0ZSA9IChBcnRpZmFjdCkgYXJ0aWZhY3RMaXN0LmdldCgwKTsKLQkJCQlhcnRpZmFjdExpc3QucmVtb3ZlKDApOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXJ0aWZhY3RMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBpdGVyLm5leHQoKTsKLQkJCQlmb3VuZCA9IGZhbHNlOwotCQkJCS8vIGlmKGNhbmRpZGF0ZS5nZXRDb250YWluZWRBcnRpZmFjdHMoKS5jb250YWlucyhhcnRpZmFjdCkpIHsKLQkJCQlpZiAoVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KGFydGlmYWN0LCBjYW5kaWRhdGUpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKFVtYVV0aWwuaXNDb250YWluZWRCeShjYW5kaWRhdGUsIGFydGlmYWN0KSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQljYW5kaWRhdGUgPSBhcnRpZmFjdDsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kIHx8IGFydGlmYWN0TGlzdC5pc0VtcHR5KCkpCi0JCQkJdG9wTW9zdEFydGlmYWN0cy5hZGQoY2FuZGlkYXRlKTsKLQkJCWVsc2UgaWYgKGFydGlmYWN0TGlzdC5pc0VtcHR5KCkpCi0JCQkJCXRvcE1vc3RBcnRpZmFjdHMuYWRkKGNhbmRpZGF0ZSk7CQkKLQkJfQotCQotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBjaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGNpLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGNpLm5leHQoKTsKLQkJCU9iamVjdCBlID0gdW53cmFwID8gVG5nVXRpbC51bndyYXAoY2hpbGQpIDogY2hpbGQ7Ci0JCQlib29sZWFuIHNlbGVjdGVkID0gZmFsc2U7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZSk7Ci0JCQkJV29ya1Byb2R1Y3Qgd3AgPSB3cGQuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQlpZiAoISh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSkgewotCQkJCQlzZWxlY3RlZCA9IHRydWU7Ci0JCQkJfSBlbHNlIGlmICh0b3BNb3N0QXJ0aWZhY3RzLmNvbnRhaW5zKHdwKSkgewotCQkJCQlzZWxlY3RlZCA9IHRydWU7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3RlZCA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCQlyZXN1bHQuYWRkKGNoaWxkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGhlbHBzIGJ1aWxkIHRoZSBhcnRpZmFjdCBkZXNjcmlwdG9yIHRyZWUgY29ycmVjdGx5Ci0JICogCi0JICogQHBhcmFtIGNoaWxkcmVuCi0JICogQHBhcmFtIHVud3JhcAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGZpbmFsIENvbGxlY3Rpb24gY2hpbGRyZW4sIGJvb2xlYW4gdW53cmFwLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlMaXN0IGFydGlmYWN0RGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gZ2V0IHRoZSBhcnRpZmFjdCBsaXN0Ci0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZih1bndyYXApIHsKLQkJCQljaGlsZCA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJCX0KLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0IHdwID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGNoaWxkKQotCQkJCQkJLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJaWYgKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJYXJ0aWZhY3REZXNjTGlzdC5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmKGFydGlmYWN0RGVzY0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQlpZihjaGlsZHJlbiBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQlyZXR1cm4gKExpc3QpIGNoaWxkcmVuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoY2hpbGRyZW4pOwotCQkJfQotCQl9Ci0JCQotCQkvLyBwcm9jZXNzIHRoZSBhcnRpZmFjdCBsaXN0IHRvIGdldCB0aGUgdG9wLW1vc3Qgb25lcwotCQkvLwotCQlTZXQgdG9wTW9zdEFydGlmYWN0RGVzY0xpc3QgPSBuZXcgSGFzaFNldCgpOwotCQlMaXN0IGFydGlmYWN0RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KGFydGlmYWN0RGVzY0xpc3QpOwotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgY2FuZGlkYXRlID0gbnVsbDsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQl3aGlsZSAoIWFydGlmYWN0RGVzY0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQkKLQkJCWlmICghZm91bmQpCi0JCQl7Ci0JCQkJY2FuZGlkYXRlID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgYXJ0aWZhY3REZXNjTGlzdC5nZXQoMCk7Ci0JCQkJYXJ0aWZhY3REZXNjTGlzdC5yZW1vdmUoMCk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhcnRpZmFjdERlc2NMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBhcnRpZmFjdERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQlmb3VuZCA9IGZhbHNlOwotCQkJCWlmIChQcm9jZXNzVXRpbC5pc0NvbnRhaW5lZEJ5KGNhbmRpZGF0ZSwgYXJ0aWZhY3REZXNjLCBhcnRpZmFjdERlc2NyaXB0b3JzKSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCQllbHNlIGlmIChQcm9jZXNzVXRpbC5pc0NvbnRhaW5lZEJ5KGFydGlmYWN0RGVzYywgY2FuZGlkYXRlLCBhcnRpZmFjdERlc2NyaXB0b3JzKSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQljYW5kaWRhdGUgPSBhcnRpZmFjdERlc2M7Ci0KLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kIHx8IGFydGlmYWN0RGVzY0xpc3QuaXNFbXB0eSgpKQotCQkJCXRvcE1vc3RBcnRpZmFjdERlc2NMaXN0LmFkZChjYW5kaWRhdGUpOwotCQkJZWxzZSBpZiAoYXJ0aWZhY3REZXNjTGlzdC5pc0VtcHR5KCkpCi0JCQkJCXRvcE1vc3RBcnRpZmFjdERlc2NMaXN0LmFkZChjYW5kaWRhdGUpOwkJCi0JCX0KLQotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBjaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGNpLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGNpLm5leHQoKTsKLQkJCU9iamVjdCBlID0gdW53cmFwID8gVG5nVXRpbC51bndyYXAoY2hpbGQpIDogY2hpbGQ7Ci0JCQlib29sZWFuIHNlbGVjdGVkID0gZmFsc2U7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZSk7Ci0JCQkJV29ya1Byb2R1Y3Qgd3AgPSB3cGQuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQlpZiAoISh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSkgewotCQkJCQlzZWxlY3RlZCA9IHRydWU7Ci0JCQkJfSBlbHNlIGlmICh0b3BNb3N0QXJ0aWZhY3REZXNjTGlzdC5jb250YWlucyh3cGQpKSB7Ci0JCQkJCXNlbGVjdGVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdGVkID0gdHJ1ZTsKLQkJCX0KLQkJCWlmIChzZWxlY3RlZCkgewotCQkJCXJlc3VsdC5hZGQoY2hpbGQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eSBmaW5kQWN0aXZpdHkoUHJvY2Vzc1BhY2thZ2UgcHJvY1BhY2thZ2UpIHsKLQkJaWYocHJvY1BhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlyZXR1cm4gKChQcm9jZXNzQ29tcG9uZW50KXByb2NQYWNrYWdlKS5nZXRQcm9jZXNzKCk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHByb2NQYWNrYWdlCi0JCQkJLmdldFByb2Nlc3NFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXJldHVybiAoKEFjdGl2aXR5KSBlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBmaXhCcmVha2RvbndFbGVtZW50T3JkZXJSZWN1cnNpdmVseShBY3Rpdml0eSBhY3QpIHsKLQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihhY3QpIHsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMzY4MjYxNjg1NjYzMzU0NDc4TDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlBcnJheUxpc3QgYWN0aXZpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gKChBY3Rpdml0eSlvYmplY3QpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCWFjdGl2aXRpZXMuYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBhY3Rpdml0aWVzLml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWZpeEJyZWFrZG93bkVsZW1lbnRPcmRlcigoQWN0aXZpdHkpaXRlci5uZXh0KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZpeEJyZWFrZG93bkVsZW1lbnRPcmRlcihBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlFTGlzdCBsaXN0ID0gKEVMaXN0KSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KGxpc3QpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJQnJlYWtkb3duRWxlbWVudCBzdWNjID0gZS5nZXRQcmVzZW50ZWRBZnRlcigpOwotCQkJaWYoc3VjYyAhPSBudWxsICYmIHN1Y2MgIT0gZSkgewotCQkJCWludCBzdWNjSWQgPSBsaXN0LmluZGV4T2Yoc3VjYyk7Ci0JCQkJaWYoc3VjY0lkICE9IC0xKSB7Ci0JCQkJCWludCBpZCA9IGxpc3QuaW5kZXhPZihlKTsKLQkJCQkJaWYoaWQgIT0gc3VjY0lkIC0gMSkgewotCQkJCQkJaWYoaWQgPCBzdWNjSWQpIHsKLQkJCQkJCQlsaXN0Lm1vdmUoc3VjY0lkIC0gMSwgaWQpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJbGlzdC5tb3ZlKGlkLCBzdWNjSWQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWUuc2V0UHJlc2VudGVkQWZ0ZXIobnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgaXRlbSBwcm92aWRlciBwYXRoIG9mIHRoZSBnaXZlbiBhY3Rpdml0eSwgdGhlIHBhdGggZnJvbSB0b3AgcHJvY2VzcyB0byB0aGUgYWN0aXZpdHkKLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZUl0ZW1Qcm92aWRlclBhdGgoQWN0aXZpdHkgYWN0aXZpdHksIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpcCA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGFjdGl2aXR5LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlJQlNJdGVtUHJvdmlkZXIgYnNJcCA9IChJQlNJdGVtUHJvdmlkZXIpIGlwOwotCQlPYmplY3QgdG9wID0gYnNJcC5nZXRUb3BJdGVtKCk7Ci0JCWlmKCEodG9wIGluc3RhbmNlb2YgUHJvY2VzcykgfHwgISgoKEVPYmplY3QpdG9wKS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSkgewotCQkJLy8gaXRlbSBwcm92aWRlciB0cmVlIG9mIHRoZSBvd25lcidzIHByb2Nlc3MgaXMgbm90IGluaXRpYWxpemVkIHlldAotCQkJLy8gaW5pdGlhbGl6ZSBpdC4KLQotCQkJLy8gZ2V0IHRoZSBhY3Rpdml0eSBwYXRoCi0JCQkvLwotCQkJQXJyYXlMaXN0IGFjdFBhdGggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IoYWN0aXZpdHkgPSBhY3Rpdml0eS5nZXRTdXBlckFjdGl2aXRpZXMoKTsgYWN0aXZpdHkgIT0gbnVsbDsgYWN0aXZpdHkgPSBhY3Rpdml0eS5nZXRTdXBlckFjdGl2aXRpZXMoKSkgewotCQkJCWFjdFBhdGguYWRkKDAsIGFjdGl2aXR5KTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdFBhdGguaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGFjdCA9IGl0ZXIubmV4dCgpOwotCQkJCWlwID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoYWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlwLmdldENoaWxkcmVuKGFjdCk7Ci0JCQl9Ci0JCX0KLQl9CQkKLQotCS8qKgotCSAqIENoZWNrIGlmIHRoZSBnaXZlbiBhY3Rpdml0eSBvciBhbnkgb2YgaXRzIHN1YmFjdGl2aXRpZXMgaXMgYSBjb250cmlidXRvciBvciByZXBsYWNlcgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQ29udHJpYnV0b3JPclJlcGxhY2VyKEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoYWN0aXZpdHkpIHsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwTDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAoKEFjdGl2aXR5KW9iamVjdCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJCi0JCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJVmFyaWFiaWxpdHlUeXBlIHZUeXBlID0gdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQlpZihiYXNlICE9IG51bGwgJiYgKHZUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUyB8fCB2VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpKSB7Ci0vLwkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIGJhc2UpOwotLy8JCQkJaWYocHJvYyAhPSBwcm9jZXNzKSB7Ci0vLwkJCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9CQotCQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVG9wUHJvY2VzcyhPYmplY3QgdGFyZ2V0KSB7Ci0JCXJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBQcm9jZXNzICYmICgoUHJvY2Vzcyl0YXJnZXQpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHdwRGVzY0xpc3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3IgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKENvbGxlY3Rpb24gZWxlbWVudHMsIFdvcmtQcm9kdWN0IHdwKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpZSk7Ci0JCQkJaWYod3BkLmdldFdvcmtQcm9kdWN0KCkgPT0gd3ApIHsKLQkJCQkJcmV0dXJuIHdwZDsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFza0Rlc2NMaXN0Ci0JICogQHBhcmFtIHRhc2sKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBUYXNrRGVzY3JpcHRvciBnZXRUYXNrRGVzY3JpcHRvcihDb2xsZWN0aW9uIGVsZW1lbnRzLCBUYXNrIHRhc2spIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYoZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIGU7Ci0JCQkJaWYodGQuZ2V0VGFzaygpID09IHRhc2spIHsKLQkJCQkJcmV0dXJuIHRkOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvd25pbmcgd29yayBicmVha2Rvd24gZWxlbWVudCBvZiBhIHdvcmsgb3JkZXIuCi0JICogCi0JICogQHBhcmFtIHdvcmtPcmRlcgotCSAqICAgICAgICAgICAgYSB3b3JrIG9yZGVyCi0JICogQHJldHVybiBhIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgdGhhdCBvd25zIHRoZSB3b3JrIG9yZGVyIG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya0JyZWFrZG93bkVsZW1lbnQgZ2V0T3duZXIoV29ya09yZGVyIHdvcmtPcmRlcikgewotCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0U3VjY2Vzc29yKHdvcmtPcmRlcik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGdldENvbXBvc2VkV3JhcHBlcihPYmplY3Qgb2JqZWN0KSB7Ci0JCXdoaWxlKCEob2JqZWN0IGluc3RhbmNlb2YgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikKLQkJCQkmJiBvYmplY3QgaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJb2JqZWN0ID0gKChJV3JhcHBlckl0ZW1Qcm92aWRlcilvYmplY3QpLmdldFZhbHVlKCk7Ci0JCX0KLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuIChDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGRpc3BsYXkgbmFtZSBmb3IgdGhlIGdpdmVuIGJyZWFrZG93biBzdHJ1Y3R1cmUgY29sdW1uIElELiBUaGUKLQkgKiBicmVha2Rvd24gc3RydWN0dXJlIGNvbHVtbiBJRHMgYXJlIGRlZmluZWQgYXMgY29uc3RhbnRzIGluCi0JICoge0BsaW5rIElCU0l0ZW1Qcm92aWRlcn0gdGhhdCBzdGFydCB3aXRoIENPTF8KLQkgKiAKLQkgKiBAcGFyYW0gY29sdW1uTmFtZQotCSAqICAgICAgICAgICAgb25lIG9mIHRoZSBjb2x1bW5zIElEIGNvbnN0YW50cyAoQ09MX1hYWCkgZGVmaW5lZCBpbgotCSAqICAgICAgICAgICAge0BsaW5rIElCU0l0ZW1Qcm92aWRlcn0KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0Q29sdW1uRGlzcGxheU5hbWUoU3RyaW5nIGNvbHVtbklkKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJCU19Db2x1bW5fIiArIGNvbHVtbklkKTsgLy8kTk9OLU5MUy0xJCAKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gY29sdW1uSWQ7Ci0JfQotCQotCQotCS8qKgotCSAqIEdldCBsaXN0IG9mIHRhc2sgZGVzY3JpcHRvcnMgdW5kZXIgc2VsZWN0ZWQgYWN0aXZpdGllcwotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFRhc2tEZXNjcmlwdG9ycyhMaXN0IHNlbGVjdGlvbikgewotCQlMaXN0IHRhc2tEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gKEV4cG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0b3JPYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmIChpdG9yT2JqIGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJfHwgaXRvck9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCWdldFRhc2tEZXNjcmlwdG9ycyhhZGFwdGVyRmFjdG9yeSwgaXRvck9iaiwgdGFza0Rlc2NyaXB0b3JzKTsKLQkJCX0KLQkJCWlmIChpdG9yT2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IKLQkJCQkJfHwgaXRvck9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCWlmICghdGFza0Rlc2NyaXB0b3JzLmNvbnRhaW5zKGl0b3JPYmopKQotCQkJCQl0YXNrRGVzY3JpcHRvcnMuYWRkKGl0b3JPYmopOwotCQkJfQotCQl9Ci0JCXJldHVybiB0YXNrRGVzY3JpcHRvcnM7Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0VGFza0Rlc2NyaXB0b3JzKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBPYmplY3QgYWN0LAotCQkJTGlzdCB0YXNrRGVzY3JpcHRvcnMpIHsKLQkJT2JqZWN0IGxpc3QgPSBudWxsOwotCQlpZiAoYWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQoYWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJLy8gZ2V0IGNoaWxkcmVuCi0JCQlsaXN0ID0gYWRhcHRlci5nZXRDaGlsZHJlbihhY3QpOwotCQl9IGVsc2UgaWYgKGFjdCBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJbGlzdCA9ICgoV3JhcHBlckl0ZW1Qcm92aWRlcikgYWN0KS5nZXRDaGlsZHJlbihhY3QpOwotCQl9Ci0JCWlmIChsaXN0ICE9IG51bGwgJiYgbGlzdCBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCUxpc3QgY2hpbGRyZW4gPSAoTGlzdCkgbGlzdDsKLQkJCWZvciAoSXRlcmF0b3IgY2hpbGRJdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgY2hpbGRJdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gY2hpbGRJdGVyLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgb2JqIGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWdldFRhc2tEZXNjcmlwdG9ycyhhZGFwdGVyRmFjdG9yeSwgb2JqLCB0YXNrRGVzY3JpcHRvcnMpOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IKLQkJCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlpZiAoIXRhc2tEZXNjcmlwdG9ycy5jb250YWlucyhvYmopKQotCQkJCQkJdGFza0Rlc2NyaXB0b3JzLmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgZGVzY3JpcHRvciBvciBpdHMgd3JhcHBlciBvZiByb2xsZWQtdXAgYWN0aXZpdHkuCi0JICogCi0JICogQHBhcmFtIG8KLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUm9sbGVkVXBEZXNjcmlwdG9yKE9iamVjdCBvLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJaWYoVG5nVXRpbC51bndyYXAobykgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG8sIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQobyk7Ci0JCQlpZihUbmdVdGlsLnVud3JhcChwYXJlbnQpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlPYmplY3QgcGFyZW50QWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlyZXR1cm4gcGFyZW50QWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlciAKLQkJCQkmJiAoKElCU0l0ZW1Qcm92aWRlcilwYXJlbnRBZGFwdGVyKS5pc1JvbGxlZFVwKCk7Ci0JCQl9CQkJCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotLy8JLyoqCi0vLwkgKiBDcmVhdGVzIGEgZGVlcCBjb3B5IG9mIGEgcHJvY2VzcyB0byB0aGUgc3BlY2lmaWVkIHByb2Nlc3MgcGFja2FnZS4KLS8vCSAqIAotLy8JICogQHBhcmFtIG1vbml0b3IKLS8vCSAqIEBwYXJhbSBwcm9jZXNzCi0vLwkgKiBAcHJhcm0gbmV3UHJvY2Vzc05hbWUKLS8vCSAqIEBwYXJhbSBkZWVwQ29weUNvbmZpZwotLy8JICogQHBhcmFtIHRhcmdldFBhY2thZ2UKLS8vCSAqIEByZXR1cm4gUHJvY2VzcyB0aGUgbmV3bHkgY3JlYXRlZCBwcm9jZXNzCi0vLwkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIGRlZXBDb3B5KAotLy8JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIAotLy8JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvY2VzcywgCi0vLwkJCVN0cmluZyBuZXdQcm9jZXNzTmFtZSwKLS8vCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWVwQ29weUNvbmZpZywgCi0vLwkJCVByb2Nlc3NQYWNrYWdlIHRhcmdldFBhY2thZ2UpIHsKLS8vCQlDb3B5SGVscGVyIGhlbHBlciA9IG5ldyBDb3B5SGVscGVyKCk7CQotLy8JCXRyeSB7Ci0vLwkJCXJldHVybiBkZWVwQ29weShtb25pdG9yLCBwcm9jZXNzLCBuZXdQcm9jZXNzTmFtZSwgZGVlcENvcHlDb25maWcsIHRhcmdldFBhY2thZ2UsIGhlbHBlcik7Ci0vLwkJfQotLy8JCWZpbmFsbHkgewotLy8JCQloZWxwZXIuY2xlYXIoKTsKLS8vCQl9Ci0vLwl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgUHJvY2VzcyBkZWVwQ29weSgKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgCi0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvY2VzcywgCi0JCQlTdHJpbmcgbmV3UHJvY2Vzc05hbWUsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZXBDb3B5Q29uZmlnLCAKLQkJCVByb2Nlc3NQYWNrYWdlIHRhcmdldFBhY2thZ2UsCi0JCQlDb3B5SGVscGVyIGNvcHlIZWxwZXIsCi0JCQlJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcikgewkJCi0JCS8vIGlmIHRoZSB0YXJnZXRQYWNrYWdlIGlzIG51bGwsIHVzZSB0aGUgc2FtZSBwYWNrYWdlIG9mIHRoZSBzb3VyY2UgcHJvY2VzcwotCQlpZiAoIHRhcmdldFBhY2thZ2UgPT0gbnVsbCApIHsKLQkJCXRhcmdldFBhY2thZ2UgPSAoUHJvY2Vzc1BhY2thZ2UpcHJvY2Vzcy5lQ29udGFpbmVyKCkuZUNvbnRhaW5lcigpOwotCQl9Ci0JCQotCQkvLwkJbmV3IGRlZXAtY29waWVkIHByb2Nlc3MncyByZWZlcmVuY2UKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIG5ld1Byb2Nlc3MgPSBudWxsOwotCQotCQlpZihtb25pdG9yID09IG51bGwpIHsKLQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0KLQkJUHJvY2Vzc0RlZXBDb3B5Q29tbWFuZCBjbWQgPSBuZXcgUHJvY2Vzc0RlZXBDb3B5Q29tbWFuZChwcm9jZXNzLCBuZXdQcm9jZXNzTmFtZSwgCi0JCQkJY29weUhlbHBlciwgZGVlcENvcHlDb25maWcsIHRhcmdldFBhY2thZ2UsIG1vbml0b3IsY29uZmlndXJhdG9yKTsKLQkJdHJ5IHsKLQkJCWNtZC5leGVjdXRlKCk7Ci0JCQlDb2xsZWN0aW9uIHJlc3VsdCA9IGNtZC5nZXRSZXN1bHQoKTsKLQkJCWlmKCFyZXN1bHQuaXNFbXB0eSgpKSB7Ci0JCQkJbmV3UHJvY2VzcyA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIHJlc3VsdC50b0FycmF5KClbMF07Ci0JCQkJLy8gZml4IGJyZWFrZG93biBlbGVtZW50IG9yZGVyIG9mIGFsbCBhY3Rpdml0aWVzCi0JCQkJLy8KLQkJCQlmaXhCcmVha2RvbndFbGVtZW50T3JkZXJSZWN1cnNpdmVseShuZXdQcm9jZXNzKTsJCi0JCQkJY21kLmNvcHlTdXBwcmVzc2lvblN0YXRlcygpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJY21kLmRpc3Bvc2UoKTsKLQkJfQotCQkKLQkJcmV0dXJuIG5ld1Byb2Nlc3M7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhY2NlcHQoQWN0aXZpdHkgYWN0LCBJRmlsdGVyIHByb2Nlc3NGaWx0ZXIsIGJvb2xlYW4gY2hlY2tPd25pbmdQcm9jZXNzKSB7Ci0JCWlmKHByb2Nlc3NGaWx0ZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJQWN0aXZpdHkgYmFzZSA9IChBY3Rpdml0eSkgYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBhY3QuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCWlmIChiYXNlID09IG51bGwpCi0JCXsKLQkJCWlmKGNoZWNrT3duaW5nUHJvY2VzcykgewotCQkJCXJldHVybiBwcm9jZXNzRmlsdGVyLmFjY2VwdChUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMgfHwgdHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OIHx8IHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKQotCQl7Ci0JCQkvLyBjaGVjayBvd25pbmcgcHJvY2VzcyBvZiBiYXNlIGFjdGl2aXR5IG9ubHkgZm9yIGV4dGVuZHMgYW5kIGxvY2FsIGNvbnRyaWJ1dGlvbi9yZXBsYWNlbWVudAotCQkJLy8KLQkJCWJvb2xlYW4gcmV0OwotCQkJZG8gewotCQkJCXJldCA9IHByb2Nlc3NGaWx0ZXIuYWNjZXB0KFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhiYXNlKSk7Ci0JCQkJdHlwZSA9IGJhc2UuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQkJYmFzZSA9IChBY3Rpdml0eSkgYmFzZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQl9IHdoaWxlIChyZXQKLQkJCQkJJiYgYmFzZSAhPSBudWxsCi0JCQkJCSYmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTCi0JCQkJCQkJfHwgdHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OIHx8IHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKSk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgUHJvY2VzcyB0byB3aGljaCBhbiBhY3Rpdml0eSBiZWxvbmdzCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvY2VzcyBnZXRQcm9jZXNzKEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCVByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSBVbWFVdGlsLmdldFByb2Nlc3NDb21wb25lbnQoYWN0aXZpdHkpOwotCQlpZiAocHJvY0NvbXAgIT0gbnVsbCkgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSBwcm9jQ29tcC5nZXRQcm9jZXNzKCk7Ci0JCQlyZXR1cm4gcHJvYzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1NlY3Rpb25MaXN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvU2VjdGlvbkxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ3NTg3Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvU2VjdGlvbkxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLnV0aWwuU3RyaW5nUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIGVuY2Fwc3VsYXRlcyBhbGwgdGhlIGxvZ2ljcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBsaXN0IG9mIGFsbAotICogY29udHJpYnV0ZWQvaW5oZXJpdGVkIHNlY3Rpb25zIG9mIHRoZSBnaXZlbiBlbGVtZW50IGFzIHdlbGwgYXMgYWxsb3dzCi0gKiBtYW5pcHVsYXRlIHRoaXMgbGlzdC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlY3Rpb25MaXN0IGV4dGVuZHMgQmFzaWNFTGlzdDxTZWN0aW9uPiB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU3NTcyNzk3NDg3MDY5MjMzTDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUkRFUl9JTkZPX05BTUUgPSAic2VjdGlvbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgREVGQVVMVF9TQVZFX09QVElPTlMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RFUFNfRk9SX0VMRU1FTlRfT05MWSA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEVQU19GT1JfRUxFTUVOVF9BTkRfUEFSRU5UUyA9IDI7Ci0KLQlzdGF0aWMgewotCQlERUZBVUxUX1NBVkVfT1BUSU9OUy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCAiQVNDSUkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgQ29udGVudEVsZW1lbnQgZWRpdEVsZW1lbnQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbWl4ZWQgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDb250cmlidXRvcihWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlyZXR1cm4gVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKGUpOwotCX0KLQotCXB1YmxpYyBTZWN0aW9uTGlzdChDb250ZW50RWxlbWVudCBlLCBpbnQgc2NvcGUpIHsKLQkJZWRpdEVsZW1lbnQgPSBlOwotCQlpZiAoc2NvcGUgPT0gU1RFUFNfRk9SX0VMRU1FTlRfT05MWSkgewotCQkJbWl4ZWQgPSBmYWxzZTsKLQkJfSBlbHNlIGlmIChzY29wZSA9PSBTVEVQU19GT1JfRUxFTUVOVF9BTkRfUEFSRU5UUykgewotCQkJY2FsY3VsYXRlUGFyZW50c09ubHkoZSk7Ci0JCX0gZWxzZSB7Ci0JCQltaXhlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVBhcmVudHNPbmx5KENvbnRlbnRFbGVtZW50IGUpIHsKLQkJSXRlcmF0b3IgaXRlciA9IG51bGw7Ci0JCS8vIGlmKGlzQ29udHJpYnV0b3IoZSkpIHsKLQkJLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgZm9yICIgKyBlLmdldE5hbWUoKSArICIgPSBjb250cmlidXRpbmcgaXMKLQkJLy8gdHJ1ZSIpOwotCQkvLyBMaXN0IHN1cGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gVW1hVXRpbC5nZXRBbGxTdXBlcnMoc3VwZXJzLCBlLCBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpOwotCQkvLyBzdXBlcnMuYWRkKGUpOwotCQkvLyBpdGVyID0gc3VwZXJzLml0ZXJhdG9yKCk7Ci0JCS8vIH0gZWxzZSBpZihpc0V4dGVuZGVkKGUpKSB7Ci0JCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGZvciAiICsgZS5nZXROYW1lKCkgKyAiID0gZXh0ZW5kaW5nIGlzCi0JCS8vIHRydWUiKTsKLQkJLy8gTGlzdCBzdXBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIFVtYVV0aWwuZ2V0QWxsU3VwZXJzKHN1cGVycywgZSwgVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpOwotCQkvLyBzdXBlcnMuYWRkKGUpOwotCQkvLyBpdGVyID0gc3VwZXJzLml0ZXJhdG9yKCk7Ci0JCS8vIH0KLQkJaWYgKGlzQ29udHJpYnV0b3IoZSkgfHwgaXNFeHRlbmRlZChlKSkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgZm9yICIgKyBlLmdldE5hbWUoKSArICIgPSBjb250cmlidXRpbmcgaXMKLQkJCS8vIHRydWUiKTsKLQkJCUxpc3Qgc3VwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJVW1hVXRpbC5nZXRBbGxTdXBlcnNCb3RoKHN1cGVycywgZSwKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTLAotCQkJCQlWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyk7Ci0JCQlzdXBlcnMuYWRkKGUpOwotCQkJaXRlciA9IHN1cGVycy5pdGVyYXRvcigpOwotCQl9IGVsc2UgewotCQkJbWl4ZWQgPSBmYWxzZTsKLQkJfQotCi0JCWlmIChtaXhlZCkgewotCQkJLy8gY3JlYXRlIGEgbWFwIG9mIEdVSUQgLyBjb250cmlidXRvcgotCQkJLy8KLQkJCU9yZGVySW5mbyBsYXRlc3RJbmZvID0gbnVsbDsKLQkJCU1hcDxTdHJpbmcsIFNlY3Rpb24+IGd1aWRTZWN0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTZWN0aW9uPigpOwotCQkJU2V0IHNlY3RzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCUNvbnRlbnRFbGVtZW50IGVsZW1lbnQgPSAoQ29udGVudEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihlbGVtZW50KSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKQotCQkJCQkJCS5nZXRTZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCVNlY3Rpb24gc2VjdCA9IChTZWN0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlndWlkU2VjdGlvbk1hcC5wdXQoc2VjdC5nZXRHdWlkKCksIHNlY3QpOwotCQkJCQkJc2VjdHMuYWRkKHNlY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJCU9yZGVySW5mbyBvcmRlckluZm8gPSBUbmdVdGlsLmdldE9yZGVySW5mbyhlbGVtZW50LAotCQkJCQkJT1JERVJfSU5GT19OQU1FKTsKLQkJCQlpZiAob3JkZXJJbmZvICE9IG51bGwpIHsKLQkJCQkJaWYgKGxhdGVzdEluZm8gPT0gbnVsbAotCQkJCQkJCXx8IG9yZGVySW5mby5nZXRUaW1lc3RhbXAoKSA+IGxhdGVzdEluZm8KLQkJCQkJCQkJCS5nZXRUaW1lc3RhbXAoKSkgewotCQkJCQkJbGF0ZXN0SW5mbyA9IG9yZGVySW5mbzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGxhdGVzdEluZm8gIT0gbnVsbCkgewotCQkJCS8vIHJlb3JkZXIgdGhlIHNlY3Rpb25zIGJhc2VkIG9uIHRoZSBsYXRlc3Qgb3JkZXIgaW5mbwotCQkJCS8vCi0JCQkJaW50IHNpemUgPSBsYXRlc3RJbmZvLmdldEdVSURzKCkuc2l6ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCU9iamVjdCBndWlkID0gbGF0ZXN0SW5mby5nZXRHVUlEcygpLmdldChpKTsKLQkJCQkJU2VjdGlvbiBzZWN0ID0gZ3VpZFNlY3Rpb25NYXAuZ2V0KGd1aWQpOwotCQkJCQlpZiAoc2VjdCAhPSBudWxsKSB7Ci0JCQkJCQlzdXBlci5hZGQoc2VjdCk7Ci0JCQkJCQlzZWN0cy5yZW1vdmUoc2VjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlzdXBlci5hZGRBbGwoc2VjdHMpOwotCQl9Ci0JfQotCi0JLy8gZGVwcmVjYXRlIHRoZSBmb2xsb3dpbmcgY29uc3RydWN0b3IKLQlwdWJsaWMgU2VjdGlvbkxpc3QoQ29udGVudEVsZW1lbnQgZSkgewotCQllZGl0RWxlbWVudCA9IGU7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBudWxsOwotCQlpZiAoaXNDb250cmlidXRvcihlKSB8fCBUbmdVdGlsLmhhc0NvbnRyaWJ1dG9yKGUpKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IFRuZ1V0aWwuZ2V0QmFzZShlKTsKLQkJCWl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoYmFzZSkgewotCi0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldEltbWVkaWF0ZVZhcmlldGllcygoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50ID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXRlcmF0b3IKLQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCWlmIChlbGVtZW50LmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUykgewotCQkJCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCX0gZWxzZSBpZiAoaXNFeHRlbmRlZChlKSkgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiJCQkIGZvciAiICsgZS5nZXROYW1lKCkgKyAiID0gZXh0ZW5kZWQgaXMgdHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUxpc3Qgc3VwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJVW1hVXRpbC5nZXRBbGxTdXBlcnMoc3VwZXJzLCBlLCBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyk7Ci0JCQlzdXBlcnMuYWRkKGUpOwotCQkJaXRlciA9IHN1cGVycy5pdGVyYXRvcigpOwotCQl9IGVsc2UgewotCQkJbWl4ZWQgPSBmYWxzZTsKLQkJfQotCi0JCWlmIChtaXhlZCkgewotCQkJLy8gY3JlYXRlIGEgbWFwIG9mIEdVSUQgLyBjb250cmlidXRvcgotCQkJLy8KLQkJCU9yZGVySW5mbyBsYXRlc3RJbmZvID0gbnVsbDsKLQkJCU1hcDxTdHJpbmcsIFNlY3Rpb24+IGd1aWRTZWN0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTZWN0aW9uPigpOwotCQkJTGlzdCBzZWN0cyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlDb250ZW50RWxlbWVudCBlbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24oZWxlbWVudCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkKLQkJCQkJCQkuZ2V0U2VjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlTZWN0aW9uIHNlY3QgPSAoU2VjdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJZ3VpZFNlY3Rpb25NYXAucHV0KHNlY3QuZ2V0R3VpZCgpLCBzZWN0KTsKLQkJCQkJCXNlY3RzLmFkZChzZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlPcmRlckluZm8gb3JkZXJJbmZvID0gVG5nVXRpbC5nZXRPcmRlckluZm8oZWxlbWVudCwKLQkJCQkJCU9SREVSX0lORk9fTkFNRSk7Ci0JCQkJaWYgKG9yZGVySW5mbyAhPSBudWxsKSB7Ci0JCQkJCWlmIChsYXRlc3RJbmZvID09IG51bGwKLQkJCQkJCQl8fCBvcmRlckluZm8uZ2V0VGltZXN0YW1wKCkgPiBsYXRlc3RJbmZvCi0JCQkJCQkJCQkuZ2V0VGltZXN0YW1wKCkpIHsKLQkJCQkJCWxhdGVzdEluZm8gPSBvcmRlckluZm87Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChsYXRlc3RJbmZvICE9IG51bGwpIHsKLQkJCQkvLyByZW9yZGVyIHRoZSBzZWN0aW9ucyBiYXNlZCBvbiB0aGUgbGF0ZXN0IG9yZGVyIGluZm8KLQkJCQkvLwotCQkJCWludCBzaXplID0gbGF0ZXN0SW5mby5nZXRHVUlEcygpLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlPYmplY3QgZ3VpZCA9IGxhdGVzdEluZm8uZ2V0R1VJRHMoKS5nZXQoaSk7Ci0JCQkJCVNlY3Rpb24gc2VjdCA9IGd1aWRTZWN0aW9uTWFwLmdldChndWlkKTsKLQkJCQkJaWYgKHNlY3QgIT0gbnVsbCkgewotCQkJCQkJc3VwZXIuYWRkKHNlY3QpOwotCQkJCQkJc2VjdHMucmVtb3ZlKHNlY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc3VwZXIuYWRkQWxsKHNlY3RzKTsKLQkJfQotCQkvLyBlbHNlIHsKLQkJLy8gLy8gYWRkQWxsKGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkpOwotCQkvLyBtaXhlZCA9IGZhbHNlOwotCQkvLyB9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0V4dGVuZGVkKENvbnRlbnRFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiBlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTOwotCX0KLQotCS8qKgotCSAqIEFwcGxpZXMgcmVjZW50IGNoYW5nZXMgaW4gdGhlIGxpc3QKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseSgpIHsKLQkJaWYgKCFtaXhlZCB8fCAhY2hhbmdlZCkKLQkJCXJldHVybjsKLQotCQkvLyBzYXZlIHRoZSBvcmRlciBpbmZvIHRvIHRoZSBvcmRlcmluZ0d1aWRlIG9mIHRoZSBlZGl0RWxlbWVudAotCQkvLwotCQlTdHJpbmcgc3RyID0gZWRpdEVsZW1lbnQuZ2V0T3JkZXJpbmdHdWlkZSgpOwotCQlPcmRlckluZm9Db2xsZWN0aW9uIG9yZGVySW5mb3MgPSBudWxsOwotCQlTdHJpbmdSZXNvdXJjZSByZXMgPSBudWxsOwotCQlpZiAoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApIHsKLQkJCW9yZGVySW5mb3MgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU9yZGVySW5mb0NvbGxlY3Rpb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJlcyA9IG5ldyBTdHJpbmdSZXNvdXJjZShzdHIpOwotCQkJdHJ5IHsKLQkJCQlyZXMubG9hZChudWxsKTsKLQkJCQlpZiAocmVzLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCW9yZGVySW5mb3MgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZU9yZGVySW5mb0NvbGxlY3Rpb24oKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvcmRlckluZm9zID0gKE9yZGVySW5mb0NvbGxlY3Rpb24pIHJlcy5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCS8vIGZpbmQgdGhlIG9yZGVyIGluZm9yIGZvciBzZWN0aW9ucwotCQkvLwotCQlPcmRlckluZm8gc2VjdE9yZGVySW5mbyA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9yZGVySW5mb3MuZ2V0T3JkZXJJbmZvcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT3JkZXJJbmZvIG9yZGVySW5mbyA9IChPcmRlckluZm8pIGl0ZXIubmV4dCgpOwotCQkJaWYgKE9SREVSX0lORk9fTkFNRS5lcXVhbHNJZ25vcmVDYXNlKG9yZGVySW5mby5nZXROYW1lKCkpKSB7Ci0JCQkJc2VjdE9yZGVySW5mbyA9IG9yZGVySW5mbzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChzZWN0T3JkZXJJbmZvID09IG51bGwpIHsKLQkJCXNlY3RPcmRlckluZm8gPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU9yZGVySW5mbygpOwotCQkJc2VjdE9yZGVySW5mby5zZXROYW1lKE9SREVSX0lORk9fTkFNRSk7Ci0JCQlvcmRlckluZm9zLmdldE9yZGVySW5mb3MoKS5hZGQoc2VjdE9yZGVySW5mbyk7Ci0JCX0gZWxzZSB7Ci0JCQlzZWN0T3JkZXJJbmZvLmdldEdVSURzKCkuY2xlYXIoKTsKLQkJfQotCi0JCWludCBzaXplID0gc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJU2VjdGlvbiBzZWN0ID0gKFNlY3Rpb24pIGdldChpKTsKLQkJCXNlY3RPcmRlckluZm8uZ2V0R1VJRHMoKS5hZGQoc2VjdC5nZXRHdWlkKCkpOwotCQl9Ci0JCXNlY3RPcmRlckluZm8uc2V0VGltZXN0YW1wKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJaWYgKHJlcyA9PSBudWxsKSB7Ci0JCQlyZXMgPSBuZXcgU3RyaW5nUmVzb3VyY2UobnVsbCk7Ci0JCQlyZXMuZ2V0Q29udGVudHMoKS5hZGQob3JkZXJJbmZvcyk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJlcy5zYXZlKERFRkFVTFRfU0FWRV9PUFRJT05TKTsKLQkJCXN0ciA9IHJlcy5nZXRTdHJpbmcoKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2VjdGlvbkxpc3QuYXBwbHkoKTogbmV3IG9yZGVyaW5nIGd1aWRlIik7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLSBvcmRlcmluZ0d1aWRlIHN0YXJ0IC0tLS0tLSIpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKHN0cik7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLSBvcmRlcmluZ0d1aWRlIGVuZCAtLS0tLS0iKTsKLQkJCWVkaXRFbGVtZW50LnNldE9yZGVyaW5nR3VpZGUoc3RyKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuUmVtb3ZlKFNlY3Rpb24gc2VjdGlvbikgewotCQlpZiAoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24oZWRpdEVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkgPT0gc2VjdGlvbi5lQ29udGFpbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTZWN0aW9uIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlpZiAoIWNhblJlbW92ZSgoU2VjdGlvbikgZ2V0KGluZGV4KSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlTZWN0aW9uIHJlbW92ZWQgPSBzdXBlci5yZW1vdmUoaW5kZXgpOwotCQkJZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5yZW1vdmUocmVtb3ZlZCk7Ci0JCQlyZXR1cm4gcmVtb3ZlZDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLnJlbW92ZShpbmRleCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQkJaWYgKCFjYW5SZW1vdmUoKFNlY3Rpb24pIG8pKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobWl4ZWQpIHsKLQkJCWlmIChzdXBlci5yZW1vdmUobykpIHsKLQkJCQllZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLnJlbW92ZShvKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5yZW1vdmUobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gYykgewotCQlpZiAobWl4ZWQpIHsKLQkJCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJCUl0ZXJhdG9yIGUgPSBpdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG8gPSBlLm5leHQoKTsKLQkJCQlpZiAoYy5jb250YWlucyhvKSAmJiBjYW5SZW1vdmUoKFNlY3Rpb24pIG8pKSB7Ci0JCQkJCWUucmVtb3ZlKCk7Ci0JCQkJCWVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkucmVtb3ZlKG8pOwotCQkJCQltb2RpZmllZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG1vZGlmaWVkOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkucmVtb3ZlQWxsKGMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgU2VjdGlvbiBlbGVtZW50KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJc3VwZXIuYWRkKGluZGV4LCBlbGVtZW50KTsKLQkJCWVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuYWRkKGVsZW1lbnQpOwotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQllZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmFkZChpbmRleCwgZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGQoU2VjdGlvbiBvKSB7Ci0JCWJvb2xlYW4gYiA9IGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuYWRkKG8pOwotCQlpZiAobWl4ZWQpIHsKLQkJCWIgPSBzdXBlci5hZGQobyk7Ci0JCQlpZiAoYikKLQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gYjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIFNlY3Rpb24+IGMpIHsKLQkJYm9vbGVhbiBiID0gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5hZGRBbGwoYyk7Ci0JCWlmIChtaXhlZCkgewotCQkJYiA9IHN1cGVyLmFkZEFsbChjKTsKLQkJCWlmIChiKQotCQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBiOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIFNlY3Rpb24+IGMpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQllZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmFkZEFsbChjKTsKLQkJCWJvb2xlYW4gYiA9IHN1cGVyLmFkZEFsbChpbmRleCwgYyk7Ci0JCQlpZiAoYikKLQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5hZGRBbGwoaW5kZXgsIGMpOwotCX0KLQotCXB1YmxpYyBTZWN0aW9uIHNldChpbnQgaW5kZXgsIFNlY3Rpb24gZWxlbWVudCkgewotCQlpZiAobWl4ZWQpCi0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuc2V0KGluZGV4LCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaWYgKG1peGVkKQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCWVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlKGludCBpbmRleCwgU2VjdGlvbiBvYmplY3QpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlzdXBlci5tb3ZlKGluZGV4LCBvYmplY3QpOwotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQkoKEVMaXN0KSBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpKS5tb3ZlKGluZGV4LAotCQkJCQlvYmplY3QpOwotCQl9Ci0JfQotCi0JcHVibGljIFNlY3Rpb24gbW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCVNlY3Rpb24gbW92ZWQgPSBzdXBlci5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCXJldHVybiBtb3ZlZDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKEVMaXN0PFNlY3Rpb24+KSBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpKS5tb3ZlKAotCQkJCQl0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl9Ci0JfQotCi0JcHVibGljIFNlY3Rpb24gZ2V0KGludCBpbmRleCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXJldHVybiBzdXBlci5nZXQoaW5kZXgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuZ2V0KGluZGV4KTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuc2l6ZSgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuc2l6ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXJldHVybiBzdXBlci5pdGVyYXRvcigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuaXRlcmF0b3IoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuY29udGFpbnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5jb250YWlucyhvYmplY3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlpZiAobWl4ZWQpCi0JCQlyZXR1cm4gc3VwZXIuY29udGFpbnNBbGwoY29sbGVjdGlvbik7Ci0JCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmNvbnRhaW5zQWxsKAotCQkJCWNvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXJldHVybiBzdXBlci50b0FycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkudG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KE9iamVjdFtdIGFycmF5KSB7Ci0JCWlmIChtaXhlZCkKLQkJCXJldHVybiBzdXBlci50b0FycmF5KGFycmF5KTsKLQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkudG9BcnJheShhcnJheSk7Ci0JfQotCi0JcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG1peGVkKQotCQkJcmV0dXJuIHN1cGVyLmluZGV4T2Yob2JqZWN0KTsKLQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuaW5kZXhPZihvYmplY3QpOwotCX0KLQotCXB1YmxpYyBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobWl4ZWQpCi0JCQlyZXR1cm4gc3VwZXIubGFzdEluZGV4T2Yob2JqZWN0KTsKLQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkubGFzdEluZGV4T2Yob2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01peGVkKCkgewotCQlyZXR1cm4gbWl4ZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1N0ZXBMaXN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvU3RlcExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1MGVhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvU3RlcExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBSZW9yZGVyIHN0ZXBzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGVwTGlzdCB7Ci0KLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTc1NjczMjU4NDk4NTg4NzFMOwotCi0JcHJpdmF0ZSBzdGF0aWMgRGVzY3JpYmFibGVFbGVtZW50IGdldERlc2NyaWJhYmxlRWxlbWVudChTZWN0aW9uIHN0ZXApIHsKLQkJcmV0dXJuIChEZXNjcmliYWJsZUVsZW1lbnQpIHN0ZXAuZUNvbnRhaW5lcigpLmVDb250YWluZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFRhc2sgY3VycmVudFRhc2s7Ci0KLQlwcml2YXRlIExpbmtlZExpc3Qgc3RlcExpc3RzOwotCi0JcHVibGljIFN0ZXBMaXN0KFRhc2sgY3VycmVudFRhc2ssIExpc3Qgc3RlcExpc3RzKSB7Ci0JCXRoaXMuY3VycmVudFRhc2sgPSBjdXJyZW50VGFzazsKLQkJdGhpcy5zdGVwTGlzdHMgPSBuZXcgTGlua2VkTGlzdChzdGVwTGlzdHMpOwotCQlyZW9yZGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlb3JkZXIoKSB7Ci0JCU1hcCBvd25lclNlY3Rpb25zTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJaW50IHNpemUgPSBzdGVwTGlzdHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJRWNvcmVFTGlzdCBlTGlzdCA9IChFY29yZUVMaXN0KSBzdGVwTGlzdHMuZ2V0KGkpOwotCQkJb3duZXJTZWN0aW9uc01hcC5wdXQoZUxpc3QuZ2V0Tm90aWZpZXIoKSwgZUxpc3QpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3Qoc3RlcExpc3RzKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUxpc3Qgc3RlcExpc3QgPSAoTGlzdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoIXN0ZXBMaXN0LmlzRW1wdHkoKSkgewotCQkJCVNlY3Rpb24gc3RlcCA9IChTZWN0aW9uKSBzdGVwTGlzdC5nZXQoMCk7Ci0JCQkJU2VjdGlvbiBwcmVkID0gc3RlcC5nZXRQcmVkZWNlc3NvcigpOwotCQkJCWlmIChwcmVkID09IG51bGwpIHsKLQkJCQkJTGlzdCBvbGRGaXJzdExpc3QgPSAoTGlzdCkgc3RlcExpc3RzLmdldCgwKTsKLQotCQkJCQkvLyBwdXQgdGhpcyBzdGVwIGxpc3QgYXQgYmVnaW5uaW5nCi0JCQkJCS8vCi0JCQkJCXN0ZXBMaXN0cy5yZW1vdmUoc3RlcExpc3QpOwotCQkJCQlzdGVwTGlzdHMuYWRkKDAsIHN0ZXBMaXN0KTsKLQotCQkJCQkvLyBzZXQgdGhpcyBzdGVwIGxpc3QgdG8gYmUgdGhlIHByZWRlY2Vzc29yIG9mIHRoZSBwcmV2aW91cwotCQkJCQkvLyBmaXJzdCBsaXN0Ci0JCQkJCS8vCi0JCQkJCWlmICghb2xkRmlyc3RMaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJU2VjdGlvbiBvbGRGaXJzdFN0ZXAgPSAoU2VjdGlvbikgb2xkRmlyc3RMaXN0LmdldCgwKTsKLQkJCQkJCWlmIChUbmdVdGlsLmNhblJlZmVyZW5jZSgKLQkJCQkJCQkJZ2V0RGVzY3JpYmFibGVFbGVtZW50KG9sZEZpcnN0U3RlcCksCi0JCQkJCQkJCWdldERlc2NyaWJhYmxlRWxlbWVudChzdGVwKSkpIHsKLQkJCQkJCQlvbGRGaXJzdFN0ZXAuc2V0UHJlZGVjZXNzb3Ioc3RlcCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlMaXN0IHByZWRMaXN0ID0gKExpc3QpIG93bmVyU2VjdGlvbnNNYXAuZ2V0KHByZWQKLQkJCQkJCQkuZUNvbnRhaW5lcigpKTsKLQkJCQkJc3RlcExpc3RzLnJlbW92ZShwcmVkTGlzdCk7Ci0JCQkJCWludCBpZCA9IHN0ZXBMaXN0cy5pbmRleE9mKHN0ZXBMaXN0KTsKLQkJCQkJc3RlcExpc3RzLmFkZChpZCwgcHJlZExpc3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8vIHByaXZhdGUgdm9pZCByZWFzc2lnblByZWRlY2Vzc29ycygpIHsKLQkvLwotCS8vIH0KLQotCXB1YmxpYyBMaXN0IGdldFN0ZXBzKCkgewotCQlMaXN0IGFsbFN0ZXBzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbnQgc2l6ZSA9IHN0ZXBMaXN0cy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlMaXN0IHN0ZXBzID0gKExpc3QpIHN0ZXBMaXN0cy5nZXQoaSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdGVwcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlhbGxTdGVwcy5hZGQoaXRlci5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhbGxTdGVwczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtb3ZlVXAoU2VjdGlvbiBzdGVwKSB7Ci0JCUxpc3Qgc3RlcHMgPSBjdXJyZW50VGFzay5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpOwotCQlpbnQgaWQgPSBzdGVwcy5pbmRleE9mKHN0ZXApOwotCQlpZiAoaWQgPT0gLTEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChpZCA+IDApIHsKLQkJCWlmIChpZCA9PSAxKSB7Ci0KLQkJCX0KLQkJCS8vIG1vdmUgdGhlIHN0ZXAgd2l0aGluIGl0cyBsaXN0Ci0JCQkvLwotCQkJQ29sbGVjdGlvbnMuc3dhcChzdGVwcywgaWQgLSAxLCBpZCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBtb3ZlIHRoZSB3aG9sZSBzdGVwIGxpc3QgdXAKLQkJLy8KLQkJaWQgPSBzdGVwTGlzdHMuaW5kZXhPZihzdGVwcyk7Ci0JCWlmIChpZCA9PSAtMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJTGlzdCBwcmVkTGlzdCA9IG51bGw7Ci0JCWludCBwcmVkTGlzdElkID0gaWQgLSAxOwotCQkvLyBsb29rIGZvciBub24tZW1wdHkgcHJlZGVjZXNzb3IgbGlzdAotCQkvLwotCQlmaW5kX3ByZWRMaXN0OiBmb3IgKDsgcHJlZExpc3RJZCA+IC0xOyBwcmVkTGlzdElkLS0pIHsKLQkJCUxpc3QgbGlzdCA9IChMaXN0KSBzdGVwTGlzdHMuZ2V0KHByZWRMaXN0SWQpOwotCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCXByZWRMaXN0ID0gbGlzdDsKLQkJCQlicmVhayBmaW5kX3ByZWRMaXN0OwotCQkJfQotCQl9Ci0JCVNlY3Rpb24gb2xkUHJlZCA9ICgoU2VjdGlvbikgc3RlcHMuZ2V0KDApKS5nZXRQcmVkZWNlc3NvcigpOwotCQlMaXN0IG9sZFN1Y2Nlc3NvcnMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRTdWNjZXNzb3JzKChTZWN0aW9uKSBzdGVwcwotCQkJCS5nZXQoc3RlcHMuc2l6ZSgpIC0gMSkpOwotCQlpZiAocHJlZExpc3QgIT0gbnVsbCkgewotCQkJc3RlcExpc3RzLnJlbW92ZShzdGVwcyk7Ci0JCQlzdGVwTGlzdHMuYWRkKHByZWRMaXN0SWQsIHN0ZXBzKTsKLQkJCVNlY3Rpb24gbGFzdCA9IChTZWN0aW9uKSBwcmVkTGlzdC5nZXQocHJlZExpc3Quc2l6ZSgpIC0gMSk7Ci0JCQlMaXN0IG9sZFByZWRTdWNjZXNzb3JzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0U3VjY2Vzc29ycyhsYXN0KTsKLQkJCWlmIChUbmdVdGlsLmNhblJlZmVyZW5jZShjdXJyZW50VGFzaywgZ2V0RGVzY3JpYmFibGVFbGVtZW50KGxhc3QpKSkgewotCQkJCXN0ZXAuc2V0UHJlZGVjZXNzb3IobGFzdCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2xkUHJlZFN1Y2Nlc3NvcnMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJU2VjdGlvbiBzZWN0ID0gKFNlY3Rpb24pIGl0ZXIubmV4dCgpOwotCQkJCQlzZWN0LnNldFByZWRlY2Vzc29yKHN0ZXApOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN0ZXBMaXN0cy5hZGQoMCwgc3RlcHMpOwotCQl9Ci0JCURlc2NyaWJhYmxlRWxlbWVudCBvbGRQcmVkVGFzayA9IGdldERlc2NyaWJhYmxlRWxlbWVudChvbGRQcmVkKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2xkU3VjY2Vzc29ycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVNlY3Rpb24gc2VjdCA9IChTZWN0aW9uKSBpdGVyLm5leHQoKTsKLQkJCWlmIChUbmdVdGlsLmNhblJlZmVyZW5jZShnZXREZXNjcmliYWJsZUVsZW1lbnQoc2VjdCksIG9sZFByZWRUYXNrKSkgewotCQkJCXNlY3Quc2V0UHJlZGVjZXNzb3Iob2xkUHJlZCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtb3ZlRG93bihTZWN0aW9uIHN0ZXApIHsKLQkJTGlzdCBzdGVwcyA9IGN1cnJlbnRUYXNrLmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCk7Ci0JCWludCBpZCA9IHN0ZXBzLmluZGV4T2Yoc3RlcCk7Ci0JCWlmIChpZCA9PSAtMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlkIDwgc3RlcHMuc2l6ZSgpIC0gMSkgewotCQkJLy8gbW92ZSB0aGUgc3RlcCB3aXRoaW4gaXRzIGxpc3QKLQkJCS8vCi0JCQlDb2xsZWN0aW9ucy5zd2FwKHN0ZXBzLCBpZCArIDEsIGlkKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIG1vdmUgdGhlIHdob2xlIHN0ZXAgbGlzdCB1cAotCQkvLwotCQlpZCA9IHN0ZXBMaXN0cy5pbmRleE9mKHN0ZXBzKTsKLQkJaWYgKGlkID09IC0xKQotCQkJcmV0dXJuIGZhbHNlOwotCQlMaXN0IHN1Y2NMaXN0ID0gbnVsbDsKLQkJaW50IHN1Y2NMaXN0SWQgPSBpZCArIDE7Ci0JCWludCBzaXplID0gc3RlcExpc3RzLnNpemUoKTsKLQotCQkvLyBsb29rIGZvciBub24tZW1wdHkgc3VjY2Vzc29yIGxpc3QKLQkJLy8KLQkJZmluZF9MaXN0OiBmb3IgKDsgc3VjY0xpc3RJZCA8IHNpemU7IHN1Y2NMaXN0SWQrKykgewotCQkJTGlzdCBsaXN0ID0gKExpc3QpIHN0ZXBMaXN0cy5nZXQoc3VjY0xpc3RJZCk7Ci0JCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJc3VjY0xpc3QgPSBsaXN0OwotCQkJCWJyZWFrIGZpbmRfTGlzdDsKLQkJCX0KLQkJfQotCQlpZiAoc3VjY0xpc3QgIT0gbnVsbCkgewotCQkJc3RlcExpc3RzLnJlbW92ZShzdWNjTGlzdCk7Ci0JCQlzdGVwTGlzdHMuYWRkKGlkLCBzdWNjTGlzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdGVwTGlzdHMuYWRkKHN0ZXBzKTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvU3VwcHJlc3Npb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9TdXBwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWNmMjdmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9TdXBwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjYWxjdWxhdGVzIHRoZSBzdXBwcmVzc2lvbiBzdGF0ZSwgYm90aCBkaXJlY3QgYW5kIGluZGlyZWN0LCBvZiBhbnkKLSAqIGJyZWFrZG93biBlbGVtZW50IG9yIGl0cyB3cmFwcGVyIGluIHRoZSBzcGVjaWZpZWQgcHJvY2Vzcy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN1cHByZXNzaW9uIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdCUyA9ICJ3YnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQlMgPSAidGJzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1BCUyA9ICJ3cGJzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0JTID0gImNicyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBwcm9jVG9TdXBwcmVzc2lvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGF1dG9Jbmhlcml0SW50ZXJtZWRpYXRlU3VwcHJlc3Npb25TdGF0ZSA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgUHJvY2VzcyBwcm9jZXNzOwotCi0JcHJpdmF0ZSBTZXQgc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzOwotCi0JcHJpdmF0ZSBib29sZWFuIG1vZGlmaWVkOwotCi0JcHJpdmF0ZSBTZXQgaW50ZXJuYWxVbnN1cHByZXNzZWRFbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgY2xlYXJDYWNoZWRTdXBwcmVzc2lvbnMoKSB7Ci0JCXByb2NUb1N1cHByZXNzaW9uTWFwLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBzdXBwcmVzc2lvbnMgb2YgaW52YWxpZCBwcm9jZXNzZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgY2xlYW5VcCgpIHsKLQkJQXJyYXlMaXN0IGxpc3RUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChwcm9jVG9TdXBwcmVzc2lvbk1hcC5rZXlTZXQoKSkKLQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlQcm9jZXNzIHByb2MgPSAoUHJvY2VzcykgaXRlci5uZXh0KCk7Ci0JCQlpZiAocHJvYy5lSXNQcm94eSgpKSB7Ci0JCQkJbGlzdFRvUmVtb3ZlLmFkZChwcm9jKTsKLQkJCX0KLQkJfQotCQlpbnQgc2l6ZSA9IGxpc3RUb1JlbW92ZS5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlwcm9jVG9TdXBwcmVzc2lvbk1hcC5yZW1vdmUobGlzdFRvUmVtb3ZlLmdldChpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2V0QXV0b0luaGVyaXRTdXBwcmVzc2lvblN0YXRlcyhib29sZWFuIGIpIHsKLQkJYXV0b0luaGVyaXRJbnRlcm1lZGlhdGVTdXBwcmVzc2lvblN0YXRlID0gYjsKLQl9Ci0KLQlwdWJsaWMgU3VwcHJlc3Npb24oUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCXRoaXMucHJvY2VzcyA9IHByb2Nlc3M7Ci0JCXN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocyA9IGxvYWRTdXBwcmVzc2VkRWxlbWVudFBhdGhzKCk7Ci0JfQotCi0JcHVibGljIFByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi0JcHJpdmF0ZSBTZXQgbG9hZFN1cHByZXNzZWRFbGVtZW50UGF0aHMoKSB7Ci0JCUNvbnN0cmFpbnQgcnVsZSA9IENvbnN0cmFpbnRNYW5hZ2VyLmdldENvbnN0cmFpbnQocHJvY2VzcywKLQkJCQlDb25zdHJhaW50TWFuYWdlci5QUk9DRVNTX1NVUFBSRVNTSU9OLCBmYWxzZSk7IC8vIChDb25zdHJhaW50KQotCQkvLyBwcm9jZXNzLmdldE93bmVkUnVsZXMoKS5nZXQoMCk7Ci0JCWlmIChydWxlICE9IG51bGwgJiYgcnVsZS5nZXRCb2R5KCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTZXQgcGF0aHMgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihydWxlLmdldEJvZHkoKSk7IHRva2VucwotCQkJCQkuaGFzTW9yZVRva2VucygpOykgewotCQkJCXBhdGhzLmFkZCh0b2tlbnMubmV4dFRva2VuKCkpOwotCQkJfQotCQkJcmV0dXJuIHBhdGhzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgU2V0IGdldFN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocygpIHsKLQkJaWYgKHN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocyA9PSBudWxsKSB7Ci0JCQlzdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMgPSBsb2FkU3VwcHJlc3NlZEVsZW1lbnRQYXRocygpOwotCQkJaWYgKHN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocyA9PSBudWxsKSB7Ci0JCQkJc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzID0gbmV3IEhhc2hTZXQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNTdXBwcmVzc2VkKENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJaWYgKGlzU3VwcHJlc3NlZCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlpZiAoaXNTdXBwcmVzc2VkKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGhhcyBhbnkgZWxlbWVudCB0aGF0IGlzIG5vdCBzdXBwcmVzc2VkIHlldAotCSAqIGluIHRoaXMgc3VwcHJlc3Npb24ncyBwcm9jZXNzCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdXBwcmVzcyhDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gY2FuRG8oc2VsZWN0aW9uLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHNlbGVjdGlvbiBoYXMgYW55IGVsZW1lbnQgdGhhdCBpcyBzdXBwcmVzc2VkIGluIHRoaXMKLQkgKiBzdXBwcmVzc2lvbidzIHByb2Nlc3MKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJldmVhbChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gY2FuRG8oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogRXh0cmFjdHMgaXRlbXMgZnJvbSB0aGUgZ2l2ZW4gc2VsZWN0aW9uIHRoYXQgY2FuIGJlIHN1cHByZXNzZWQvcmV2ZWFsZWQKLQkgKiAoZGVwZW5kaW5nIG9uIHRoZSA8Y29kZT5zdXBwcmVzc2VkPC9jb2RlPiBwYXJhbWV0ZXIpCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEBwYXJhbSBzdXBwcmVzc2VkCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRBcHBsaWNhYmxlSXRlbXMoQ29sbGVjdGlvbiBzZWxlY3Rpb24sCi0JCQlib29sZWFuIHN1cHByZXNzZWQpIHsKLQkJQXJyYXlMaXN0IGFwcGxpY2FibGVJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50OwotCQkJCWlmICh3cmFwcGVyLmlzUmVhZE9ubHkoKSkgewotCQkJCQlpZiAoaXNJblN1cHByZXNzZWRMaXN0KHdyYXBwZXIpICE9IHN1cHByZXNzZWQpIHsKLQkJCQkJCWFwcGxpY2FibGVJdGVtcy5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJCQkmJiAoKE1ldGhvZEVsZW1lbnQpIGUpLmdldFN1cHByZXNzZWQoKQotCQkJCQkJCQkJLmJvb2xlYW5WYWx1ZSgpICE9IHN1cHByZXNzZWQpIHsKLQkJCQkJCWFwcGxpY2FibGVJdGVtcy5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpICE9IHN1cHByZXNzZWQpIHsKLQkJCQkJYXBwbGljYWJsZUl0ZW1zLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFwcGxpY2FibGVJdGVtczsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGVsZW1lbnQgaXMgdmFsaWQgdG8gc3VwcHJlc3MvcmV2ZWFsIHVwb24KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChPYmplY3QgZWxlbWVudCkgewotCQkvLyBkb24ndCBzaG93IHN1cHByZXNzL3JldmVhbCBmb3Igcm9sZWRlc2NyaXB0b3IgdW5kZXIgdGVhbSwgd29yawotCQkvLyBwcm9kdWN0IGRlc2NyaXB0b3IgdW5kZXIgZGVsaXZlcmFibGUgd29yayBwcm9kdWN0LAotCQkvLyBhbmQgcm9sbGVkLXVwIGl0ZW0KLQkJLy8KLQkJQnJlYWtkb3duRWxlbWVudCBvYmogPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50OwotCQkJaWYgKHdyYXBwZXIuaXNSb2xsdXBDaGlsZCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJb2JqID0gKEJyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KQotCQkJb2JqID0gKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQ7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcgotCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJaWYgKG9iai5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsCi0JCQkJCXx8IG9iai5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBzZWxlY3Rpb24gaGFzIGFueSBpdGVtIHRoYXQgY2FuIGJlCi0JICogc3VwcHJlc3NlZC9yZXZlYWxlZCAoZGVwZW5kaW5nIG9uIHRoZSA8Y29kZT5zdXBwcmVzc2VkPC9jb2RlPgotCSAqIHBhcmFtZXRlcikKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHBhcmFtIHN1cHByZXNzZWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNhbkRvKENvbGxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIHN1cHByZXNzZWQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChpc1ZhbGlkKGVsZW1lbnQpKSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50OwotCQkJCQlpZiAod3JhcHBlci5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJCWlmIChpc0luU3VwcHJlc3NlZExpc3Qod3JhcHBlcikgIT0gc3VwcHJlc3NlZCkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJCQkmJiAoKE1ldGhvZEVsZW1lbnQpIGUpLmdldFN1cHByZXNzZWQoKQotCQkJCQkJCQkJCS5ib29sZWFuVmFsdWUoKSAhPSBzdXBwcmVzc2VkKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWlmICgoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLmdldFN1cHByZXNzZWQoKQotCQkJCQkJCS5ib29sZWFuVmFsdWUoKSAhPSBzdXBwcmVzc2VkKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQSBicmVha2Rvd24gZWxlbWVudCBpcyBzdXBwcmVzc2VkIGlmIGl0c2VsZiBvciBhbnkgb2YgaXRzIHBhcmVudCBhY3Rpdml0eQotCSAqIGlzIHN1cHByZXNzZWQKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gX19pc1N1cHByZXNzZWQoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCXJldHVybiBnZXRTdXBwcmVzc2VkKGUsIHRydWUsIG51bGwpICE9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0RpcmVjdGx5U3VwcHJlc3NlZChNZXRob2RFbGVtZW50IGUpIHsKLQkJQm9vbGVhbiBiID0gZS5nZXRTdXBwcmVzc2VkKCk7Ci0JCWlmIChiICE9IG51bGwgJiYgYi5ib29sZWFuVmFsdWUoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGU7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQlpZiAodmFyaWFiaWxpdHlUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTCi0JCQkJCXx8IHZhcmlhYmlsaXR5VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpIHsKLQkJCQlpZiAodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGlzRGlyZWN0bHlTdXBwcmVzc2VkKHZlCi0JCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHN1cHByZXNzZWQgYnJlYWtkb3duIGVsZW1lbnQgdGhhdCBtYWRlIHRoZSBnaXZlbiBicmVha2Rvd24KLQkgKiBlbGVtZW50IGJlY29tZSBzdXBwcmVzc2VkLiBUaGlzIG1ldGhvZCB3aWxsIGNoZWNrIHRoZSBzdXBwcmVzc2lvbiBzdGF0ZQotCSAqIG9mIHRoZSBwYXJlbnQgdXB0byB0aGUgc3BlY2lmaWVkIDxjb2RlPnRvcDwvY29kZT4gb25seSBpZgotCSAqIDxjb2RlPmNoZWNrUGFyZW50PC9jb2RlPiBpcyA8Y29kZT50cnVlPC9jb2RlPi4gSXQgd2lsbCBub3QgY2hlY2sgdGhlCi0JICogc3VwcHJlc3Npb24gc3RhdGUgb2YgPGNvZGU+dG9wPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIEJyZWFrZG93bkVsZW1lbnQgZ2V0U3VwcHJlc3NlZChCcmVha2Rvd25FbGVtZW50IGUsCi0JCQlib29sZWFuIGNoZWNrUGFyZW50LCBPYmplY3QgdG9wKSB7Ci0JCWlmIChlLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJcmV0dXJuIGU7Ci0JCX0KLQotCQlpZiAoY2hlY2tQYXJlbnQpIHsKLQkJCWZvciAoQnJlYWtkb3duRWxlbWVudCBiZSA9IGU7IGJlICE9IHRvcAotCQkJCQkmJiBiZS5nZXRTdXBlckFjdGl2aXRpZXMoKSAhPSBudWxsOykgewotCQkJCWJlID0gYmUuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQkJaWYgKGJlLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlyZXR1cm4gYmU7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciBuZXN0ZWQgYXJ0aWZhY3QgZGVzY3JpcHRvcnMgYW5kIGRlbGl2ZXJhYmxlCi0JCQkvLyBwYXJ0cwotCQkJLy8KLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlKTsKLQkJCQlXb3JrUHJvZHVjdCB3cCA9IHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCWlmICh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCS8vIGxvb2sgZm9yIHBhcmVudCBhcnRpZmFjdCBkZXNjcmlwdG9yIGluIHRoZSBzYW1lIGFjdGl2aXR5Ci0JCQkJCS8vIGFuZCBjaGVjayB0aGVpciBzdXBwcmVzc2lvbiBzdGF0ZQotCQkJCQkvLwotCQkJCQlBY3Rpdml0eSBhY3QgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KGUpOwotCQkJCQlpZiAoYWN0ICE9IG51bGwpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmIChlbGVtZW50ICE9IGUKLQkJCQkJCQkJCSYmIGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KTsKLQkJCQkJCQkJV29ya1Byb2R1Y3Qgb3RoZXJXcCA9IHdwZC5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQkJCQlpZiAob3RoZXJXcCBpbnN0YW5jZW9mIEFydGlmYWN0Ci0JCQkJCQkJCQkJJiYgVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KHdwLCBvdGhlcldwKQotCQkJCQkJCQkJCSYmIHdwZC5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCQkJCXJldHVybiB3cGQ7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHdwRGVzYyAhPSB0b3AgJiYgd3BEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsKLQkJCQkJTGlzdCBsaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdG9ycyh3cERlc2MpOwotCQkJCQlpZiAobGlzdC5zaXplKCkgPT0gMSkgewotCQkJCQkJLy8gdGhpcyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBpcyBhIGRlbGl2ZXJhYmxlIHBhcnQgb2YKLQkJCQkJCS8vIGEgZGVsaXZlcmFibGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IKLQkJCQkJCS8vIGNoZWNrIHRoZSBzdXBwcmVzc2lvbiBzdGF0ZSBvZiB0aGUgZGVsaXZlcmFibGUgd29yawotCQkJCQkJLy8gcHJvZHVjdCBkZXNjcmlwdG9yCi0JCQkJCQkvLwotCQkJCQkJcmV0dXJuIGdldFN1cHByZXNzZWQoKEJyZWFrZG93bkVsZW1lbnQpIGxpc3QuZ2V0KDApLAotCQkJCQkJCQljaGVja1BhcmVudCwgdG9wKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHRlYW0gcHJvZmlsZSBvd24gcm9sZSBkZXNjcmlwdG9yCi0JCQkvLwotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKGUuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkgewotCQkJCQlMaXN0IGxpc3QgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXRUZWFtUHJvZmlsZXMoKFJvbGVEZXNjcmlwdG9yKSBlKTsKLQkJCQkJaWYgKGxpc3Quc2l6ZSgpID09IDEpIHsKLQkJCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIGxpc3QuZ2V0KDApOwotCQkJCQkJaWYgKHRlYW0gIT0gdG9wICYmIHRlYW0gIT0gbnVsbCkgewotCQkJCQkJCXJldHVybiBnZXRTdXBwcmVzc2VkKHRlYW0sIGNoZWNrUGFyZW50LCB0b3ApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3Igc3ViIHRlYW0gcHJvZmlsZQotCQkJLy8KLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCWlmIChlLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsKLQkJCQkJVGVhbVByb2ZpbGUgc3VwZXJUZWFtID0gKChUZWFtUHJvZmlsZSkgZSkuZ2V0U3VwZXJUZWFtKCk7Ci0JCQkJCWlmIChzdXBlclRlYW0gIT0gdG9wICYmIHN1cGVyVGVhbSAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gZ2V0U3VwcHJlc3NlZChzdXBlclRlYW0sIGNoZWNrUGFyZW50LCB0b3ApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJblN1cHByZXNzZWRMaXN0KAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQlpZiAoc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGNoZWNrIGlmIHdyYXBwZXIncyBwYXRoIGlzIGluIHN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocyBzZXQKLQkJLy8KLQkJU3RyaW5nIHBhdGggPSBnZXRQYXRoKHdyYXBwZXIpOwotCQlyZXR1cm4gc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzLmNvbnRhaW5zKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHN1cHByZXNzZWQgYnJlYWtkb3duIGVsZW1lbnQgdGhhdCBtYWRlIHRoZSBnaXZlbiB3cmFwcGVyIGJlY29tZQotCSAqIHN1cHByZXNzZWQKLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnQgZ2V0U3VwcHJlc3NlZCgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJcmV0dXJuIGdldFN1cHByZXNzZWQod3JhcHBlciwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc3VwcHJlc3NlZCBicmVha2Rvd24gZWxlbWVudCB0aGF0IG1hZGUgdGhlIGdpdmVuIHdyYXBwZXIgYmVjb21lCi0JICogc3VwcHJlc3NlZAotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudCBnZXRTdXBwcmVzc2VkKAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciwgYm9vbGVhbiBjaGVja0Jhc2UpIHsKLQkJcmV0dXJuIGdldFN1cHByZXNzZWQod3JhcHBlciwgY2hlY2tCYXNlLCB0cnVlLAotCQkJCWF1dG9Jbmhlcml0SW50ZXJtZWRpYXRlU3VwcHJlc3Npb25TdGF0ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc3VwcHJlc3NlZCBicmVha2Rvd24gZWxlbWVudCB0aGF0IG1hZGUgdGhlIGdpdmVuIHdyYXBwZXIgYmVjb21lCi0JICogc3VwcHJlc3NlZAotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudCBnZXRTdXBwcmVzc2VkKAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciwgYm9vbGVhbiBjaGVja0Jhc2UsCi0JCQlib29sZWFuIGNoZWNrTG9jYWwsIGJvb2xlYW4gaW5oZXJpdFN1cHByZXNzaW9uU3RhdGUpIHsKLQkJcmV0dXJuIGdldFN1cHByZXNzZWQod3JhcHBlciwgY2hlY2tCYXNlLCBjaGVja0xvY2FsLAotCQkJCWluaGVyaXRTdXBwcmVzc2lvblN0YXRlLCB0cnVlLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnQgZ2V0U3VwcHJlc3NlZCgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIsIGJvb2xlYW4gY2hlY2tCYXNlLAotCQkJYm9vbGVhbiBjaGVja0xvY2FsLCBib29sZWFuIGluaGVyaXRTdXBwcmVzc2lvblN0YXRlLAotCQkJYm9vbGVhbiBjaGVja1BhcmVudCwgT2JqZWN0IHRvcCkgewotCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCWlmICghd3JhcHBlci5pc1JlYWRPbmx5KCkpIHsKLQkJCS8vIHRoaXMgaXMgYSB3cmFwcGVyIG9mIGxvY2FsIGVsZW1lbnQKLQkJCS8vCi0JCQlyZXR1cm4gZ2V0U3VwcHJlc3NlZChlLCBjaGVja1BhcmVudCwgdG9wKTsKLQkJfQotCi0JCS8vIGNoZWNrIGlmIHRoZSBiYXNlIGJyZWFrZG93biBlbGVtZW50IGlzIHN1cHByZXNzZWQsIGRpcmVjdGx5IG9yCi0JCS8vIGluZGlyZWN0bHksIGluIGl0cyBvd24gcHJvY2VzcwotCQkvLwotCQlpZiAoY2hlY2tCYXNlKSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50IHN1cHByZXNzZWQgPSBnZXRTdXBwcmVzc2VkKGUsIGNoZWNrUGFyZW50LCB0b3ApOwotCQkJaWYgKHN1cHByZXNzZWQgIT0gbnVsbCkgewotCQkJCXJldHVybiBzdXBwcmVzc2VkOwotCQkJfQotCQl9Ci0KLQkJT2JqZWN0IHBhcmVudCA9IG51bGw7Ci0JCWlmIChjaGVja0xvY2FsKSB7Ci0JCQkvLyBjaGVjayBpZiB0aGUgd3JhcHBlciBpcyBzdXBwcmVzc2VkIGluIHRoaXMgcHJvY2VzcwotCQkJLy8KLQkJCWlmIChpc0luU3VwcHJlc3NlZExpc3Qod3JhcHBlcikpIHsKLQkJCQlyZXR1cm4gZTsKLQkJCX0KLQotCQkJLy8gY2hlY2sgaWYgdGhlIGFueSBsb2NhbCBwYXJlbnQgaXMgc3VwcHJlc3NlZAotCQkJLy8KLQkJCWlmIChjaGVja1BhcmVudCkgewotCQkJCXBhcmVudCA9IHdyYXBwZXIuZ2V0UGFyZW50KHdyYXBwZXIpOwotCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50ICYmIHBhcmVudCAhPSB0b3ApIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudCBzdXBwcmVzc2VkID0gZ2V0U3VwcHJlc3NlZCgKLQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50LCBjaGVja1BhcmVudCwgdG9wKTsKLQkJCQkJaWYgKHN1cHByZXNzZWQgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIHN1cHByZXNzZWQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBpZiB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgc3VwcHJlc3NlZCBpbiBvbmUgb2YgdGhlIGltbWVkaWF0ZQotCQkvLyBiYXNlIHByb2Nlc3MKLQkJLy8KLQkJaWYgKGluaGVyaXRTdXBwcmVzc2lvblN0YXRlKSB7Ci0JCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZSk7Ci0JCQlBY3Rpdml0eSBpbmhlcml0b3IgPSBQcm9jZXNzVXRpbC5nZXRJbmhlcml0b3Iod3JhcHBlcik7Ci0JCQlCcmVha2Rvd25FbGVtZW50IGJhc2UgPSAoQnJlYWtkb3duRWxlbWVudCkgaW5oZXJpdG9yCi0JCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJUHJvY2VzcyBpbW1lZGlhdGVCYXNlUHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhiYXNlKTsKLQkJCQlpZiAocHJvYyAhPSBpbW1lZGlhdGVCYXNlUHJvYykgewotCQkJCQkvLyBmaW5kIHRoZSBvYmplY3QgaW4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgb2YgdGhlCi0JCQkJCS8vIGltbWVkaWF0ZQotCQkJCQkvLyBiYXNlIHByb2Nlc3MgdGhhdCByZXByZXNlbnRzIHRoZSBzYW1lIGJyZWFrZG93biBlbGVtZW50Ci0JCQkJCS8vCi0JCQkJCU9iamVjdCBvYmplY3QgPSBpbmhlcml0b3IuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQlBcnJheUxpc3Qgb2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoUHJvY2Vzc1V0aWwKLQkJCQkJCQkuZ2V0UGFyZW50TGlzdChpbmhlcml0b3IsIHdyYXBwZXIpKTsKLQkJCQkJb2JqZWN0cy5hZGQoZSk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB3cmFwcGVyCi0JCQkJCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KG9iamVjdCwKLQkJCQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJZmluZF9jaGlsZDogZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFkYXB0ZXIKLQkJCQkJCQkJLmdldENoaWxkcmVuKG9iamVjdCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgY2hpbGQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGVsZW1lbnQgPT0gVG5nVXRpbC51bndyYXAoY2hpbGQpKSB7Ci0JCQkJCQkJCW9iamVjdCA9IGNoaWxkOwotCQkJCQkJCQlicmVhayBmaW5kX2NoaWxkOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gZ2V0U3VwcHJlc3Npb24oaW1tZWRpYXRlQmFzZVByb2MpOwotCQkJCQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gc3VwcHJlc3Npb24uZ2V0U3VwcHJlc3NlZCgKLQkJCQkJCQkJKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3QsCi0JCQkJCQkJCWZhbHNlLCB0cnVlLCBpbmhlcml0U3VwcHJlc3Npb25TdGF0ZSwKLQkJCQkJCQkJY2hlY2tQYXJlbnQsIFRuZ1V0aWwudW53cmFwKG9iamVjdCkpOwotCQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCXJldHVybiBlbGVtZW50OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgdGhlIGFueSBpbmhlcml0ZWQgcGFyZW50IGlzIHN1cHByZXNzZWQKLQkJLy8KLQkJaWYgKGNoZWNrUGFyZW50KSB7Ci0JCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCQlwYXJlbnQgPSB3cmFwcGVyLmdldFBhcmVudCh3cmFwcGVyKTsKLQkJCX0KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCQkmJiBUbmdVdGlsLnVud3JhcChwYXJlbnQpICE9IHRvcCkgewotCQkJCXJldHVybiBnZXRTdXBwcmVzc2VkKAotCQkJCQkJKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBwYXJlbnQsCi0JCQkJCQljaGVja0Jhc2UsIHRydWUsIGluaGVyaXRTdXBwcmVzc2lvblN0YXRlLCBjaGVja1BhcmVudCwKLQkJCQkJCXRvcCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjYWNoZWQgc3VwcHJlc3Npb24gZm9yIHRoZSBnaXZlbiBwcm9jZXNzIGlmIG9uZSBleGlzdHMgb3IKLQkgKiBjcmVhdGVzIG5ldyBvbmUKLQkgKiAKLQkgKiBAcGFyYW0gaW1tZWRpYXRlQmFzZVByb2MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbihQcm9jZXNzIHByb2MpIHsKLQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSAoU3VwcHJlc3Npb24pIHByb2NUb1N1cHByZXNzaW9uTWFwLmdldChwcm9jKTsKLQkJaWYgKHN1cHByZXNzaW9uID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAocHJvY1RvU3VwcHJlc3Npb25NYXApIHsKLQkJCQlzdXBwcmVzc2lvbiA9IChTdXBwcmVzc2lvbikgcHJvY1RvU3VwcHJlc3Npb25NYXAuZ2V0KHByb2MpOwotCQkJCWlmIChzdXBwcmVzc2lvbiA9PSBudWxsKSB7Ci0JCQkJCXN1cHByZXNzaW9uID0gbmV3IFN1cHByZXNzaW9uKHByb2MpOwotCQkJCQlwcm9jVG9TdXBwcmVzc2lvbk1hcC5wdXQocHJvYywgc3VwcHJlc3Npb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwcHJlc3Npb247Ci0JfQotCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTdXBwcmVzc2lvbihTdXBwcmVzc2lvbiBzdXApIHsKLQkJcHJvY1RvU3VwcHJlc3Npb25NYXAucHV0KHN1cC5nZXRQcm9jZXNzKCksIHN1cCk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBfX2lzU3VwcHJlc3NlZChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCXJldHVybiBnZXRTdXBwcmVzc2VkKHdyYXBwZXIpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZVRvTW9kZWwoKSB7Ci0JCWlmIChzdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIHBhdGhzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGlzVmFsaWQocGF0aCkpIHsKLQkJCQlwYXRocy5hcHBlbmQocGF0aCkuYXBwZW5kKCcgJyk7Ci0JCQl9Ci0JCX0KLQotCQlDb25zdHJhaW50IHJ1bGUgPSBDb25zdHJhaW50TWFuYWdlci5nZXRDb25zdHJhaW50KHByb2Nlc3MsCi0JCQkJQ29uc3RyYWludE1hbmFnZXIuUFJPQ0VTU19TVVBQUkVTU0lPTiwgdHJ1ZSk7Ci0JCS8vIGlmKHByb2Nlc3MuZ2V0T3duZWRSdWxlcygpLmlzRW1wdHkoKSkgewotCQkvLyBydWxlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpOwotCQkvLyBwcm9jZXNzLmdldE93bmVkUnVsZXMoKS5hZGQocnVsZSk7Ci0JCS8vIH0KLQkJLy8gZWxzZSB7Ci0JCS8vIHJ1bGUgPSAoQ29uc3RyYWludCkgcHJvY2Vzcy5nZXRPd25lZFJ1bGVzKCkuZ2V0KDApOwotCQkvLyB9Ci0JCS8vCQkKLQkJcnVsZS5zZXRCb2R5KHBhdGhzLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gcGF0aCBpcyB2YWxpZCBpbiBwcm9jZXNzCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHBhdGgpIHsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkocGF0aCk7Ci0JCVN0cmluZyB0eXBlID0gdXJpLnNjaGVtZSgpOwotCQlDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJaWYgKFdCUy5lcXVhbHModHlwZSkpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9IGVsc2UgaWYgKFRCUy5lcXVhbHModHlwZSkpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9IGVsc2UgaWYgKFdQQlMuZXF1YWxzKHR5cGUpKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfSBlbHNlIGlmIChDQlMuZXF1YWxzKHR5cGUpKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIHVzZSBwcm9jZXNzJ3MgZGVmYXVsdCBjb25maWd1cmF0aW9uIHRvIHZhbGlkYXRlCi0JCS8vCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IG51bGw7Ci0JCUlDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbnVsbDsKLQkJSUZpbHRlciBmaWx0ZXIgPSBhZGFwdGVyRmFjdG9yeS5nZXRGaWx0ZXIoKTsKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLQkJCWNvbmZpZ3VyYXRvciA9IChJQ29uZmlndXJhdG9yKSBhZGFwdGVyRmFjdG9yeS5nZXRGaWx0ZXIoKTsKLQkJCWN1cnJlbnRDb25maWcgPSBjb25maWd1cmF0b3IuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJY29uZmlndXJhdG9yLnNldE1ldGhvZENvbmZpZ3VyYXRpb24ocHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpKTsKLQkJfQotCQl0cnkgewotCQkJU3RyaW5nIGd1aWQgPSB1cmkuYXV0aG9yaXR5KCk7Ci0JCQlpZiAoIXByb2Nlc3MuZ2V0R3VpZCgpLmVxdWFscyhndWlkKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCU9iamVjdCBvYmplY3QgPSBwcm9jZXNzOwotCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQob2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmkuc2VnbWVudENvdW50KCk7IGkrKykgewotCQkJCWd1aWQgPSB1cmkuc2VnbWVudChpKTsKLQkJCQlJdGVyYXRvciBpdGVyID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7Ci0JCQkJYWRhcHRlciA9IG51bGw7Ci0JCQkJZmluZF9hZGFwdGVyOiB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJCW9iamVjdCA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCWlmIChndWlkLmVxdWFscygoKE1ldGhvZEVsZW1lbnQpIG9iamVjdCkuZ2V0R3VpZCgpKSkgewotCQkJCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgY2hpbGQ7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJCQkJLmFkYXB0KGNoaWxkLAotCQkJCQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWsgZmluZF9hZGFwdGVyOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gbXVzdCBiZSBhbiBJdGVtUHJvdmlkZXJBZGFwdGVyCi0JCQkJCQkvLwotCQkJCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBpdGVtUHJvdmlkZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgb2JqZWN0OwotCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0ZW1Qcm92aWRlcgotCQkJCQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCQkJCQlpZiAoZ3VpZC5lcXVhbHMoZS5nZXRHdWlkKCkpKSB7Ci0JCQkJCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGl0ZW1Qcm92aWRlcjsKLQkJCQkJCQlicmVhayBmaW5kX2FkYXB0ZXI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyByZXN0b3JlIGNvbmZpZ3VyYXRpb24KLQkJCS8vCi0JCQlpZiAoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCQljb25maWd1cmF0b3Iuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjdXJyZW50Q29uZmlnKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vIHByaXZhdGUgYm9vbGVhbiByZXZlYWwoTGlzdCBzZWxlY3Rpb24sIENvbGxlY3Rpb24gcmV2ZWFsZWREZXNjcmlwdG9ycykgewotCS8vIGJvb2xlYW4gcmVhZE9ubHlFbGVtZW50QWZmZWN0ZWQgPSBmYWxzZTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkvLyBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JLy8gQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9Ci0JLy8gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50OwotCS8vIE1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkvLyBpZiAoIXdyYXBwZXIuaXNSZWFkT25seSgpKSB7IC8vIHdyYXBwZXIgb2YgbG9jYWwgZWxlbWVudAotCS8vIGUuc2V0U3VwcHJlc3NlZChCb29sZWFuLkZBTFNFKTsKLQkvLyBpZihlIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCS8vIHJldmVhbGVkRGVzY3JpcHRvcnMuYWRkKGUpOwotCS8vIH0KLQkvLyB9IGVsc2UgeyAvLyB3YXMgc3VwcHJlc3NlZCBieSB0aGlzIHByb2Nlc3MKLQkvLwotCS8vIC8vIHJlbW92ZSB0aGUgcGF0aCBvZiBzdXBwcmVzc2VkIGVsZW1lbnQgZnJvbSB0aGUgbGlzdAotCS8vIC8vCi0JLy8gU3RyaW5nIHBhdGggPSBnZXRQYXRoKHdyYXBwZXIpOwotCS8vIGdldFN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocygpLnJlbW92ZShwYXRoKTsKLQkvLyByZWFkT25seUVsZW1lbnRBZmZlY3RlZCA9IHRydWU7Ci0JLy8gfQotCS8vIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkvLyAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLnNldFN1cHByZXNzZWQoQm9vbGVhbi5GQUxTRSk7Ci0JLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkvLyByZXZlYWxlZERlc2NyaXB0b3JzLmFkZChlbGVtZW50KTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyBtb2RpZmllZCA9IHRydWU7Ci0JLy8gcmV0dXJuIHJlYWRPbmx5RWxlbWVudEFmZmVjdGVkOwotCS8vIH0KLQotCS8vIC8qKgotCS8vICogQHBhcmFtIHNlbGVjdGlvbgotCS8vICogQHJldHVybiB0cnVlIGlmIHRoaXMgY2FsbCByZXZlYWxlZCBhbnkgcmVhZC1vbmx5IGVsZW1lbnQKLQkvLyAqLwotCS8vIHB1YmxpYyBib29sZWFuIHJldmVhbChMaXN0IHNlbGVjdGlvbikgewotCS8vIEFycmF5TGlzdCByZXZlYWxlZERlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIGJvb2xlYW4gcmV0ID0gcmV2ZWFsKHNlbGVjdGlvbiwgcmV2ZWFsZWREZXNjcmlwdG9ycyk7Ci0JLy8gTGlzdCBkZXNjcmlwdG9yc1RvUmV2ZWFsID0gZ2V0T3duUmVsYXRlZEVsZW1lbnRzKHJldmVhbGVkRGVzY3JpcHRvcnMsCi0JLy8gZmFsc2UpOwotCS8vIGlmKGRlc2NyaXB0b3JzVG9SZXZlYWwgIT0gbnVsbCkgewotCS8vIGJvb2xlYW4gcmV0MiA9IHJldmVhbChkZXNjcmlwdG9yc1RvUmV2ZWFsLCByZXZlYWxlZERlc2NyaXB0b3JzKTsKLQkvLyByZXR1cm4gcmV0IHx8IHJldDI7Ci0JLy8gfQotCS8vIHJldHVybiByZXQ7Ci0JLy8gfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgbmVlZCB0byB1c2Uge0BsaW5rIFN1cHByZXNzaW9uQ29tbWFuZH0gaW5zdGVhZAotCSAqLwotCXB1YmxpYyB2b2lkIHJldmVhbChMaXN0IHNlbGVjdGlvbikgewotCQlkb1NldFN1cHByZXNzZWQoc2VsZWN0aW9uLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFZpZXdUeXBlKAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQkvLyBubyBuZWVkIHRvIHN0b3JlIHNlcGFyYXRlIHBhdGggZm9yIENCUywgcmV1c2UgV0JTL1RCUy9XUEJTIHBhdGhzCi0JCS8vCQkKLQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJcmV0dXJuIFdCUzsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUgfHwgZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gVEJTOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBXUEJTOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwcm9jZXNzIEdVSUQgaW4gdGhlIGdpdmVuIEdVSUQgcGF0aAotCSAqIAotCSAqIEBwYXJhbSBndWlkUGF0aAotCSAqIEByZXR1cm4KLQkgKiBAc2VlICNnZXRQYXRoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb2Nlc3NHVUlEKFN0cmluZyBndWlkUGF0aCkgewotCQlpbnQgaWQgPSBndWlkUGF0aC5pbmRleE9mKCI6Ly8iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaWQgIT0gLTEpIHsKLQkJCWludCBiZWdpbkluZGV4ID0gaWQgKyAzOwotCQkJaWYgKGJlZ2luSW5kZXggPCBndWlkUGF0aC5sZW5ndGgoKSkgewotCQkJCWludCBlbmRJbmRleCA9IGd1aWRQYXRoLmluZGV4T2YoJy8nLCBiZWdpbkluZGV4KTsKLQkJCQlpZiAoZW5kSW5kZXggIT0gLTEpIHsKLQkJCQkJcmV0dXJuIGd1aWRQYXRoLnN1YnN0cmluZyhiZWdpbkluZGV4LCBlbmRJbmRleCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhdGgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQlTdHJpbmdCdWZmZXIgcGF0aCA9IGdldFBhdGhXaXRob3V0Vmlld1R5cGUod3JhcHBlcik7Ci0JCVN0cmluZyB2aWV3VHlwZSA9IGdldFZpZXdUeXBlKHdyYXBwZXIpOwotCQlwYXRoLmluc2VydCgwLCAiOi8iKS5pbnNlcnQoMCwgdmlld1R5cGUpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXRoLnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQnVmZmVyIGdldFBhdGhXaXRob3V0Vmlld1R5cGUoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQlTdHJpbmdCdWZmZXIgcGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsgCi0JCUxpc3QgcGFyZW50TGlzdCA9IFByb2Nlc3NVdGlsLmdldFBhcmVudExpc3QobnVsbCwgd3JhcHBlcik7Ci0JCWlmICghcGFyZW50TGlzdC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHBhcmVudExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCS8vIGV4Y2x1ZGUgVGFza0Rlc2NyaXB0b3IgYW5kIFJvbGVEZXNjcmlwdG9yIGZyb20gdGhlIHBhcmVudAotCQkJCS8vIHBhdGggYi9jIHRob3NlIGRlc2NyaXB0b3JzIGNhbiBiZQotCQkJCS8vIHBhcmVudCBvbmx5IGluIENCUyB2aWV3Ci0JCQkJaWYgKCEoZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yIHx8IGUgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikpIHsKLQkJCQkJcGF0aC5hcHBlbmQoJy8nKS5hcHBlbmQoZS5nZXRHdWlkKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCXBhdGguYXBwZW5kKCcvJykuYXBwZW5kKGUuZ2V0R3VpZCgpKTsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIExpc3QgZ2V0T3duUmVsYXRlZEVsZW1lbnRzKENvbGxlY3Rpb24gY2hhbmdlZERlc2NyaXB0b3JzLAotCQkJYm9vbGVhbiBzdXBwcmVzc2VkKSB7Ci0JCWlmICghY2hhbmdlZERlc2NyaXB0b3JzLmlzRW1wdHkoKSkgewotCQkJQXJyYXlMaXN0IGRlc2NyaXB0b3JzVG9DaGFuZ2UgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KGNoYW5nZWREZXNjcmlwdG9ycykuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCURlc2NyaXB0b3IgZGVzYyA9IChEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3RbXSByZWxhdGlvbnNoaXBzID0gbnVsbDsKLQkJCQlpZiAoZGVzYyBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCXJlbGF0aW9uc2hpcHMgPSBSZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuVEFTS19ERVNDUklQVE9SX19SRUxBVElPTlNISVBTOwotCQkJCX0gZWxzZSBpZiAoZGVzYyBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCXJlbGF0aW9uc2hpcHMgPSBSZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuUk9MRV9ERVNDUklQVE9SX19SRUxBVElPTlNISVBTOwotCQkJCX0gZWxzZSBpZiAoZGVzYyBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQlyZWxhdGlvbnNoaXBzID0gUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19SRUxBVElPTlNISVBTOwotCQkJCX0KLQkJCQlpZiAocmVsYXRpb25zaGlwcyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVsYXRpb25zaGlwcy5sZW5ndGg7IGkrKykgewotCQkJCQkJT2JqZWN0IGZlYXR1cmUgPSByZWxhdGlvbnNoaXBzW2ldOwotCQkJCQkJYm9vbGVhbiBpc01hbnk7Ci0JCQkJCQlPYmplY3QgdmFsdWU7Ci0JCQkJCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIE9wcG9zaXRlRmVhdHVyZSkgewotCQkJCQkJCU9wcG9zaXRlRmVhdHVyZSBmID0gKE9wcG9zaXRlRmVhdHVyZSkgZmVhdHVyZTsKLQkJCQkJCQlpc01hbnkgPSBmLmlzTWFueSgpOwotCQkJCQkJCXZhbHVlID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgZGVzYykKLQkJCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShmKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlOwotCQkJCQkJCWlzTWFueSA9IGYuaXNNYW55KCk7Ci0JCQkJCQkJdmFsdWUgPSBkZXNjLmVHZXQoZik7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoaXNNYW55KSB7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoQ29sbGVjdGlvbikgdmFsdWUpCi0JCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCQlEZXNjcmlwdG9yIHJlZiA9IChEZXNjcmlwdG9yKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmIChyZWYuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpICE9IHN1cHByZXNzZWQKLQkJCQkJCQkJCQkmJiAhUHJvY2Vzc1V0aWwKLQkJCQkJCQkJCQkJCS5jaGVja0Rlc2NyaXB0b3JSZWZlcmVuY2VzKAotCQkJCQkJCQkJCQkJCQljaGFuZ2VkRGVzY3JpcHRvcnMsIHJlZikpIHsKLQkJCQkJCQkJCWRlc2NyaXB0b3JzVG9DaGFuZ2UuYWRkKHJlZik7Ci0JCQkJCQkJCQljaGFuZ2VkRGVzY3JpcHRvcnMuYWRkKHJlZik7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCURlc2NyaXB0b3IgcmVmID0gKERlc2NyaXB0b3IpIHZhbHVlOwotCQkJCQkJCWlmIChyZWYgIT0gbnVsbCkgewotCQkJCQkJCQlpZiAocmVmLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSAhPSBzdXBwcmVzc2VkCi0JCQkJCQkJCQkJJiYgIVByb2Nlc3NVdGlsLmNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMoCi0JCQkJCQkJCQkJCQljaGFuZ2VkRGVzY3JpcHRvcnMsIHJlZikpIHsKLQkJCQkJCQkJCWRlc2NyaXB0b3JzVG9DaGFuZ2UuYWRkKHJlZik7Ci0JCQkJCQkJCQljaGFuZ2VkRGVzY3JpcHRvcnMuYWRkKHJlZik7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZGVzY3JpcHRvcnNUb0NoYW5nZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTdXBwcmVzc2VzIG9yIHJldmVhbHMgdGhlIGdpdmVuIHNlbGVjdGlvbgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gc3VwcHJlc3NlZAotCSAqIEByZXR1cm4ge0BsaW5rIFJlc3VsdH0gb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGlzIGNhbGwKLQkgKi8KLQlwcml2YXRlIFJlc3VsdCBzZXRTdXBwcmVzc2VkKExpc3Qgc2VsZWN0aW9uLCBib29sZWFuIHN1cHByZXNzZWQpIHsKLQkJUmVzdWx0IHJlc3VsdCA9IGRvU2V0U3VwcHJlc3NlZChzZWxlY3Rpb24sIHN1cHByZXNzZWQpOwotCi0JCS8vIGlmIGRlc2NyaXB0b3JzIGhhZCBiZWVuIHN1cHByZXNzZWQsIHJlbGF0ZWQgZWxlbWVudHMgdGhhdCBhcmUgbm90Ci0JCS8vIHVzZWQgYW55d2hlcmUgZWxzZSBhbHNvIG5lZWQgdG8gYmUgc3VwcHJlc3NlZCAoanVzdCBsaWtlIGRlbGV0ZSkKLQkJLy8JCi0JCWlmICghcmVzdWx0LmRlc2NyaXB0b3JzLmlzRW1wdHkoKSkgewotCQkJTGlzdCBkZXNjcmlwdG9yc1RvU3VwcHJlc3MgPSBnZXRPd25SZWxhdGVkRWxlbWVudHMoCi0JCQkJCXJlc3VsdC5kZXNjcmlwdG9ycywgc3VwcHJlc3NlZCk7Ci0JCQlpZiAoZGVzY3JpcHRvcnNUb1N1cHByZXNzICE9IG51bGwpIHsKLQkJCQlSZXN1bHQgcmVzdWx0MiA9IGRvU2V0U3VwcHJlc3NlZChkZXNjcmlwdG9yc1RvU3VwcHJlc3MsCi0JCQkJCQlzdXBwcmVzc2VkKTsKLQotCQkJCS8vIG1lcmdlIHJlc3VsdHMKLQkJCQkvLwotCQkJCXJlc3VsdC5lbGVtZW50cy5hZGRBbGwocmVzdWx0Mi5lbGVtZW50cyk7Ci0JCQkJcmVzdWx0LmRlc2NyaXB0b3JzLmFkZEFsbChyZXN1bHQyLmRlc2NyaXB0b3JzKTsKLQkJCQlyZXN1bHQucGF0aHMuYWRkQWxsKHJlc3VsdDIucGF0aHMpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBuZWVkIHRvIHVzZSB7QGxpbmsgU3VwcHJlc3Npb25Db21tYW5kfSBpbnN0ZWFkCi0JICovCi0JcHVibGljIHZvaWQgc3VwcHJlc3MoTGlzdCBzZWxlY3Rpb24pIHsKLQkJZG9TZXRTdXBwcmVzc2VkKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JfQotCi0JLy8gcHVibGljIGJvb2xlYW4gc3VwcHJlc3MoTGlzdCBzZWxlY3Rpb24pIHsKLQkvLyBBcnJheUxpc3Qgc3VwcHJlc3NlZERlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIGJvb2xlYW4gcmV0ID0gc3VwcHJlc3Moc2VsZWN0aW9uLCBzdXBwcmVzc2VkRGVzY3JpcHRvcnMpOwotCS8vCQkKLQkvLyAvLyBpZiBkZXNjcmlwdG9ycyBoYWQgYmVlbiBzdXBwcmVzc2VkLCByZWxhdGVkIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCB1c2VkCi0JLy8gYW55d2hlcmUgZWxzZSBhbHNvIG5lZWQgdG8gYmUgc3VwcHJlc3NlZCAoanVzdCBsaWtlIGRlbGV0ZSkKLQkvLyAvLwotCS8vIExpc3QgZGVzY3JpcHRvcnNUb1N1cHByZXNzID0gZ2V0T3duUmVsYXRlZEVsZW1lbnRzKHN1cHByZXNzZWREZXNjcmlwdG9ycywKLQkvLyB0cnVlKTsKLQkvLyBpZihkZXNjcmlwdG9yc1RvU3VwcHJlc3MgIT0gbnVsbCkgewotCS8vIEFycmF5TGlzdCBvdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gYm9vbGVhbiByZXQyID0gc3VwcHJlc3MoZGVzY3JpcHRvcnNUb1N1cHByZXNzLCBvdXQpOwotCS8vIGlmKG91dC5zaXplKCkgIT0gZGVzY3JpcHRvcnNUb1N1cHByZXNzLnNpemUoKSkgewotCS8vIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigiU3VwcHJlc3Npb24uc3VwcHJlc3MoTGlzdCkKLQkvLyBpcyBidWdneS4iKTsgLy8kTk9OLU5MUy0xJAotCS8vIH0KLQkvLyByZXR1cm4gcmV0IHx8IHJldDI7Ci0JLy8gfQotCS8vIHJldHVybiByZXQ7Ci0JLy8gfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVzdWx0IHsKLQkJLyoqIEVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIHN1cHByZXNzZWQgb3IgcmV2ZWFsZWQgKi8KLQkJQ29sbGVjdGlvbiBlbGVtZW50czsKLQotCQkvKiogRGVzY3JpcHRvcnMgdGhhdCBoYXZlIGJlZW4gc3VwcHJlc3NlZCBvciByZXZlYWxlZCAqLwotCQlDb2xsZWN0aW9uIGRlc2NyaXB0b3JzOwotCi0JCS8qKgotCQkgKiBQYXRocyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byBvciByZW1vdmVkIGZyb20KLQkJICogPGNvZGU+c3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzPC9jb2RlPgotCQkgKi8KLQkJQ29sbGVjdGlvbiBwYXRoczsKLQotCQlSZXN1bHQoKSB7Ci0JCQllbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJcGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQotCQlib29sZWFuIGlzRW1wdHkoKSB7Ci0JCQlyZXR1cm4gZWxlbWVudHMuaXNFbXB0eSgpICYmIHBhdGhzLmlzRW1wdHkoKTsKLQkJfQotCi0JCXZvaWQgY2xlYXIoKSB7Ci0JCQllbGVtZW50cy5jbGVhcigpOwotCQkJZGVzY3JpcHRvcnMuY2xlYXIoKTsKLQkJCXBhdGhzLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXBwcmVzc2VzIG9yIHJldmVhbHMgdGhlIGdpdmVuIHNlbGVjdGlvbiBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mCi0JICogPGNvZGU+c3VwcHJlc3NlZDwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHBhcmFtIHN1cHByZXNzZWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBSZXN1bHQgZG9TZXRTdXBwcmVzc2VkKExpc3Qgc2VsZWN0aW9uLCBib29sZWFuIHN1cHByZXNzZWQpIHsKLQkJUmVzdWx0IHJlc3VsdCA9IG5ldyBSZXN1bHQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50OwotCQkJCS8vIGlmICghaXNTdXBwcmVzc2VkKHdyYXBwZXIpKSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQkJCWlmICghd3JhcHBlci5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJLy8gd3JhcHBlciBvZiBsb2NhbCBlbGVtZW50Ci0JCQkJCS8vCi0JCQkJCWlmIChlLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSAhPSBzdXBwcmVzc2VkKSB7Ci0JCQkJCQllLnNldFN1cHByZXNzZWQoQm9vbGVhbi52YWx1ZU9mKHN1cHByZXNzZWQpKTsKLQkJCQkJCXJlc3VsdC5lbGVtZW50cy5hZGQoZSk7Ci0JCQkJCQlpZiAoZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQkJCQlyZXN1bHQuZGVzY3JpcHRvcnMuYWRkKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gYWRkIHRoZSBwYXRocyBvZiBzdXBwcmVzc2VkIGVsZW1lbnQgdG8gdGhlIG1hcAotCQkJCQkvLwotCQkJCQlTdHJpbmcgcGF0aCA9IGdldFBhdGgod3JhcHBlcik7Ci0JCQkJCWJvb2xlYW4gYjsKLQkJCQkJaWYgKHN1cHByZXNzZWQpIHsKLQkJCQkJCWIgPSBnZXRTdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMoKS5hZGQocGF0aCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQliID0gZ2V0U3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzKCkucmVtb3ZlKHBhdGgpOwotCQkJCQl9Ci0JCQkJCWlmIChiKSB7Ci0JCQkJCQlyZXN1bHQucGF0aHMuYWRkKHBhdGgpOwotCQkJCQl9Ci0JCQkJCS8vIH0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKChNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLQkJCQlpZiAoZS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkgIT0gc3VwcHJlc3NlZCkgewotCQkJCQllLnNldFN1cHByZXNzZWQoQm9vbGVhbi52YWx1ZU9mKHN1cHByZXNzZWQpKTsKLQkJCQkJcmVzdWx0LmVsZW1lbnRzLmFkZChlKTsKLQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJCQlyZXN1bHQuZGVzY3JpcHRvcnMuYWRkKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCW1vZGlmaWVkID0gIXJlc3VsdC5pc0VtcHR5KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gcHJpdmF0ZSBib29sZWFuIHN1cHByZXNzKExpc3Qgc2VsZWN0aW9uLCBDb2xsZWN0aW9uCi0JLy8gc3VwcHJlc3NlZERlc2NyaXB0b3JzKSB7Ci0JLy8gYm9vbGVhbiByZWFkT25seUVsZW1lbnRTdXBwcmVzc2VkID0gZmFsc2U7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIE9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JLy8gaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCS8vIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPQotCS8vIChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudDsKLQkvLyBpZiAoIWlzU3VwcHJlc3NlZCh3cmFwcGVyKSkgewotCS8vIEJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsCi0JLy8gLnVud3JhcCh3cmFwcGVyKTsKLQkvLyBpZiAoIXdyYXBwZXIuaXNSZWFkT25seSgpKSB7Ci0JLy8gLy8gd3JhcHBlciBvZiBsb2NhbCBlbGVtZW50Ci0JLy8gLy8KLQkvLyBlLnNldFN1cHByZXNzZWQoQm9vbGVhbi5UUlVFKTsKLQkvLyBpZihlIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCS8vIHN1cHByZXNzZWREZXNjcmlwdG9ycy5hZGQoZSk7Ci0JLy8gfQotCS8vIH0gZWxzZSB7Ci0JLy8gLy8gYWRkIHRoZSBwYXRocyBvZiBzdXBwcmVzc2VkIGVsZW1lbnQgdG8gdGhlIG1hcAotCS8vIC8vCi0JLy8gU3RyaW5nIHBhdGggPSBnZXRQYXRoKHdyYXBwZXIpOwotCS8vIGdldFN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocygpLmFkZChwYXRoKTsKLQkvLyByZWFkT25seUVsZW1lbnRTdXBwcmVzc2VkID0gdHJ1ZTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkvLyAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLnNldFN1cHByZXNzZWQoQm9vbGVhbi5UUlVFKTsKLQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCS8vIHN1cHByZXNzZWREZXNjcmlwdG9ycy5hZGQoZWxlbWVudCk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gbW9kaWZpZWQgPSB0cnVlOwotCS8vIHJldHVybiByZWFkT25seUVsZW1lbnRTdXBwcmVzc2VkOwotCS8vIH0KLQotCS8qKgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzVW5zdXBwcmVzc2VkKExpc3Qgc2VsZWN0aW9uKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJaWYgKCFpc1N1cHByZXNzZWQoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJaWYgKCFpc1N1cHByZXNzZWQoKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBtb2RpZmllZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVOZWVkZWQoKSB7Ci0JCXJldHVybiBtb2RpZmllZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlSXNEb25lKCkgewotCQltb2RpZmllZCA9IGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBfX2lzU3VwcHJlc3NlZChDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGNvbXBvc2VkV3JhcHBlcikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21wb3NlZFdyYXBwZXIuZ2V0VmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYoIWlzU3VwcHJlc3NlZChlbGVtZW50KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgZWxlbWVudCwgb3IgdGhlIGl0ZW0gcHJvdmlkZXIgb3IgYWRhcHRvciBhc3NvY2lhdGVkIHdpdGggdGhlCi0JICogZWxlbWVudCBpcyBzdXBwcmVzc2VkLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50IG9yIGFuIGFzc29jaWF0ZWQgd3JhcHBlciwgYWRhcHRvciwgb3IgaXRlbQotCSAqICAgICAgICAgICAgcHJvdmlkZXIsIGV0Yy4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHByZXNzZWQoT2JqZWN0IGUpIHsKLQkJLy8gbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCXRyeSB7Ci0KLQkJCWlmIChlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCQotCQkJQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBjb21wb3NlZFdyYXBwZXIgPSBQcm9jZXNzVXRpbC5nZXRDb21wb3NlZFdyYXBwZXIoZSk7Ci0JCQlpZihjb21wb3NlZFdyYXBwZXIgIT0gbnVsbCkgewotCQkJCXJldHVybiBfX2lzU3VwcHJlc3NlZChjb21wb3NlZFdyYXBwZXIpOwotCQkJfQotCi0JCQlpZiAoaW50ZXJuYWxVbnN1cHByZXNzZWRFbGVtZW50cy5jb250YWlucyhlKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJaWYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBfX2lzU3VwcHJlc3NlZCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGUpOwotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXJldHVybiBfX2lzU3VwcHJlc3NlZCgoQnJlYWtkb3duRWxlbWVudCkgZSk7Ci0JCQl9IGVsc2UgewotCQkJCU9iamVjdCB0YXJnZXRPYmogPSBudWxsOwotCQkJCWlmIChlIGluc3RhbmNlb2YgV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQl0YXJnZXRPYmogPSAoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIGUpLmdldFZhbHVlKCk7Ci0JCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQl0YXJnZXRPYmogPSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGUpLmdldFRhcmdldCgpOwotCQkJCX0KLQotCQkJCWlmICh0YXJnZXRPYmogIT0gbnVsbCAmJiB0YXJnZXRPYmogIT0gZSkgewotCQkJCQlyZXR1cm4gaXNTdXBwcmVzc2VkKHRhcmdldE9iaik7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCS8vIGxvbmcgdGltZSA9IChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KTsKLQkJCS8vIGlmKHRpbWUgPiAxMDAwKSB7Ci0JCQkvLyBCcmVha2Rvd25FbGVtZW50IGJlID0gKEJyZWFrZG93bkVsZW1lbnQpVG5nVXRpbC51bndyYXAoZSk7Ci0JCQkvLyBTdHJpbmcgbXNnID0gIlN1cHByZXNzaW9uLmlzU3VwcHJlc3NlZCgpOiB0aW1lIHRha2VuIChtcykgIiArCi0JCQkvLyB0aW1lICsKLQkJCS8vICJcbiBwcm9jZXNzOiAiICsgKGUgaW5zdGFuY2VvZgotCQkJLy8gQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgPwotCQkJLy8gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcillKS5nZXRUb3BJdGVtKCkgOgotCQkJLy8gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGJlKSkgKwotCQkJLy8gIlxuIGVsZW1lbnQ6ICIgKyBQcm9jZXNzVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGJlKTsKLQkJCS8vCQkJCQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nSW5mbyhtc2cpOwotCQkJLy8gfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgc3VwcHJlc3Npb24gc3RhdGUgb2YgdGhlIGdpdmVuIDxjb2RlPndyYXBwZXI8L2NvZGU+IGZyb20KLQkgKiBpdHMgYmFzZS4KLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjYWxsIG1vZGlmaWVkIHRoZSBzdXBwcmVzc2lvbiBzdGF0ZQotCSAqICAgICAgICAgb2YgdGhlIGdpdmVuIHdyYXBwZXIsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlKAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQlTdHJpbmcgcGF0aCA9IGdldFBhdGgod3JhcHBlcik7Ci0JCWJvb2xlYW4gcmV0OwotCQlCcmVha2Rvd25FbGVtZW50IGUgPSBnZXRTdXBwcmVzc2VkKHdyYXBwZXIsIHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZSwKLQkJCQludWxsKTsKLQkJaWYgKGUgIT0gbnVsbCkgewotCQkJcmV0ID0gZ2V0U3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzKCkuYWRkKHBhdGgpOwotCQl9IGVsc2UgewotCQkJcmV0ID0gZ2V0U3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzKCkucmVtb3ZlKHBhdGgpOwotCQl9Ci0JCWlmIChyZXQpIHsKLQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIEV4Y2x1ZGVzIHRoZSBkZXNjcmlwdG9ycyB3aXRoIHRoZSBzYW1lIGxpbmtlZCBlbGVtZW50IGZyb20gdGhlIGNoZWNrCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvblRvUmV2ZWFsCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgY2hlY2tEdXBsaWNhdGVOYW1lQWZ0ZXJSZXZlYWwoCi0JCQlDb2xsZWN0aW9uIHNlbGVjdGlvblRvUmV2ZWFsT3JTdXBwcmVzcywKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUNvbGxlY3Rpb24gZWxlbWVudHNUb1JldmVhbCA9IGdldEFwcGxpY2FibGVJdGVtcygKLQkJCQlzZWxlY3Rpb25Ub1JldmVhbE9yU3VwcHJlc3MsIGZhbHNlKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb1JldmVhbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGJlID0gKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQkJU3RyaW5nIG1zZyA9IFByb2Nlc3NVdGlsLmNoZWNrQnJlYWtkb3duRWxlbWVudE5hbWUoCi0JCQkJCQlhZGFwdGVyRmFjdG9yeSwgYmUsIGJlLmdldE5hbWUoKSwgdGhpcyk7Ci0JCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5TdXBwcmVzc2lvbl9uYW1lRHVwbGljYXRpb247IAotCQkJCX0KLQkJCQltc2cgPSBQcm9jZXNzVXRpbC5jaGVja0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKAotCQkJCQkJYWRhcHRlckZhY3RvcnksIGJlLCBiZS5nZXRQcmVzZW50YXRpb25OYW1lKCksIHRoaXMpOwotCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuU3VwcHJlc3Npb25fcHJlc2VudGF0aW9uTmFtZUR1cGxpY2F0aW9uOyAKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCU9iamVjdCB1bndyYXBwZWQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCQlpZiAodW53cmFwcGVkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkuYWRhcHQoZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJT2JqZWN0IHBhcmVudCA9IGl0ZW1Qcm92aWRlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQlpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJQ29sbGVjdGlvbiBzaWJsaW5ncyA9IGl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihwYXJlbnQpOwotCQkJCQkJT2JqZWN0IGxpbmtlZEVsZW1lbnQgPSBudWxsOwotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJbGlua2VkRWxlbWVudCA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCQkuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIGVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpbnRlcm5hbFVuc3VwcHJlc3NlZEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQkJCQluYW1lQ2hlY2tMb29wOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2libGluZ3MKLQkJCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCU9iamVjdCBzaWJsaW5nID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQlpZiAoc2libGluZyBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCQkJCUJyZWFrZG93bkVsZW1lbnQgYmUgPSAoQnJlYWtkb3duRWxlbWVudCkgc2libGluZzsKLQkJCQkJCQkJCS8vIHNraXAgY2hlY2tpbmcgb24gc3VwcHJlc3NlZCBlbGVtZW50Ci0JCQkJCQkJCQkvLwotCQkJCQkJCQkJaWYgKGJlLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJCQkJCWNvbnRpbnVlIG5hbWVDaGVja0xvb3A7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZiAobGlua2VkRWxlbWVudCAhPSBudWxsCi0JCQkJCQkJCQkJCSYmIHNpYmxpbmcgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJCQkJLy8gc2tpcCBjaGVja2luZyBvbiBkZXNjcmlwdG9ycyB3aXRoIHRoZQotCQkJCQkJCQkJCS8vIHNhbWUgbGlua2VkIGVsZW1lbnQKLQkJCQkJCQkJCQkvLwotCQkJCQkJCQkJCU9iamVjdCBvdGhlckxpbmtlZEVsZW1lbnQgPSBQcm9jZXNzVXRpbAotCQkJCQkJCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBlbGVtZW50KTsKLQkJCQkJCQkJCQlpZiAob3RoZXJMaW5rZWRFbGVtZW50ID09IGxpbmtlZEVsZW1lbnQpIHsKLQkJCQkJCQkJCQkJY29udGludWUgbmFtZUNoZWNrTG9vcDsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlTdHJpbmcgbXNnID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJCQkJLmNoZWNrQnJlYWtkb3duRWxlbWVudE5hbWUoCi0JCQkJCQkJCQkJCQkJYWRhcHRlckZhY3RvcnksIGJlLCBiZQotCQkJCQkJCQkJCQkJCQkJLmdldE5hbWUoKSwgdGhpcyk7Ci0JCQkJCQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJCQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuU3VwcHJlc3Npb25fbmFtZUR1cGxpY2F0aW9uOyAKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCW1zZyA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCQkJCS5jaGVja0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKAotCQkJCQkJCQkJCQkJCWFkYXB0ZXJGYWN0b3J5LCBiZSwKLQkJCQkJCQkJCQkJCQliZS5nZXRQcmVzZW50YXRpb25OYW1lKCksCi0JCQkJCQkJCQkJCQkJdGhpcyk7Ci0JCQkJCQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJCQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuU3VwcHJlc3Npb25fcHJlc2VudGF0aW9uTmFtZUR1cGxpY2F0aW9uOyAKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJaW50ZXJuYWxVbnN1cHByZXNzZWRFbGVtZW50cy5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3RCeVBhdGgoU3RyaW5nW10gZ3VpZFBhdGgsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlpZiAoZ3VpZFBhdGgubGVuZ3RoID09IDAgfHwgYWRhcHRlckZhY3RvcnkgPT0gbnVsbAotCQkJCXx8ICFndWlkUGF0aFswXS5lcXVhbHMocHJvY2Vzcy5nZXRHdWlkKCkpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU9iamVjdCBvYmplY3QgPSBwcm9jZXNzOwotCQlpbnQgbGVuID0gZ3VpZFBhdGgubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMTsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChvYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0KLQkJCS8vIGlmIGN1cnJlbnQgb2JqZWN0IGlzIGFuIGFjdGl2aXR5LCBtYWtlIHN1cmUgaXQgaXMgcm9sbGVkIGRvd24KLQkJCS8vIGJlZm9yZSBsb29raW5nIGludG8gaXRzIGNoaWxkcmVuCi0JCQkvLwotCQkJSUJTSXRlbVByb3ZpZGVyIHJvbGxlZFVwQWRhcHRlciA9IG51bGw7Ci0JCQlJdGVyYXRvciBpdGVyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaWYgKFRuZ1V0aWwudW53cmFwKG9iamVjdCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgYWN0aXZpdHlJdGVtUHJvdmlkZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJCQkJCWlmIChhY3Rpdml0eUl0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCkpIHsKLQkJCQkJCQlhY3Rpdml0eUl0ZW1Qcm92aWRlci5iYXNpY1NldFJvbGxlZFVwKGZhbHNlKTsKLQkJCQkJCQlyb2xsZWRVcEFkYXB0ZXIgPSBhY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlJQlNJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJCQkJCWlmIChpdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpKSB7Ci0JCQkJCQkJaXRlbVByb3ZpZGVyLnNldFJvbGxlZFVwKGZhbHNlKTsKLQkJCQkJCQlyb2xsZWRVcEFkYXB0ZXIgPSBpdGVtUHJvdmlkZXI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaXRlciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pdGVyYXRvcigpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAocm9sbGVkVXBBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJcm9sbGVkVXBBZGFwdGVyLnNldFJvbGxlZFVwKHRydWUpOwotCQkJCX0KLQkJCX0KLQotCQkJZmluZF9jaGlsZDogd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCQkmJiAoKE1ldGhvZEVsZW1lbnQpIGUpLmdldEd1aWQoKS5lcXVhbHMoZ3VpZFBhdGhbaV0pKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJb2JqZWN0ID0gY2hpbGQ7Ci0JCQkJCWJyZWFrIGZpbmRfY2hpbGQ7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIWZvdW5kKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGJyZWFrZG93biBlbGVtZW50IGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuCi0JICogPGNvZGU+Z3VpZFBhdGg8L2NvZGU+IGlzIHN1cHByZXNzZWQgaW4gdGhlIHByb2Nlc3Mgb2YgdGhpcyBTdXBwcmVzc2lvbgotCSAqIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBndWlkUGF0aAotCSAqIEByZXR1cm4KLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gcGF0aCBjb3VsZCBub3QgYmUgZm91bmQgdXNpbmcKLQkgKiAgICAgICAgICAgICAgICB0aGUgZ2l2ZW4gYWRhcHRlciBmYWN0b3J5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdXBwcmVzc2VkKFN0cmluZ1tdIGd1aWRQYXRoLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkKLQkJCXRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlPYmplY3Qgb2JqZWN0ID0gZ2V0T2JqZWN0QnlQYXRoKGd1aWRQYXRoLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIkNvdWxkIG5vdCBmaW5kIG9iamVjdCB3aXRoIHBhdGggJyIgKyBndWlkUGF0aCArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBpc1N1cHByZXNzZWQob2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzZXQgb2Ygc3VwcHJlc3NlZCBpdGVtIG9mIHRoZSBnaXZlbiBwcm9jZXNzZXMuCi0JICogCi0JICogQHBhcmFtIHByb2MKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcmllcwotCSAqICAgICAgICAgICAgdGhlIGFkYXB0ZXIgZmFjdG9yaWVzIGZvciBXQlMsIFRCUywgV1BCUywgYW5kIENCUyB2aWV3cwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNldCBnZXRTdXBwcmVzc2VkSXRlbXMoUHJvY2VzcyBwcm9jLAotCQkJQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzKSB7Ci0JCVNldCBzdXBwcmVzc2VkSXRlbXMgPSBuZXcgSGFzaFNldCgpOwotCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IG5ldyBTdXBwcmVzc2lvbihwcm9jKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVyRmFjdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoCi0JCQkJCWFkYXB0ZXJGYWN0b3JpZXNbaV0sIHByb2MpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgaXRlbSA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChzdXBwcmVzc2lvbi5pc1N1cHByZXNzZWQoaXRlbSkpIHsKLQkJCQkJc3VwcHJlc3NlZEl0ZW1zLmFkZChpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cHByZXNzZWRJdGVtczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFN1cHByZXNzaW9uQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCQlwcm90ZWN0ZWQgTGlzdCBjb2xsZWN0aW9uOwotCi0JCXByb3RlY3RlZCBSZXN1bHQgcmVzdWx0OwotCi0JCXByb3RlY3RlZCBib29sZWFuIHN1cHByZXNzZWQ7Ci0KLQkJcHJvdGVjdGVkIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uOwotCi0JCXB1YmxpYyBTdXBwcmVzc2lvbkNvbW1hbmQoU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIExpc3Qgc2VsZWN0aW9uLAotCQkJCWJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQkJdGhpcy5zdXBwcmVzc2lvbiA9IHN1cHByZXNzaW9uOwotCQkJY29sbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJCXRoaXMuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQ7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChzdXBwcmVzc2lvbgotCQkJCQkJLmdldFByb2Nlc3MoKS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXJlc3VsdCA9IHN1cHByZXNzaW9uLnNldFN1cHByZXNzZWQoY29sbGVjdGlvbiwgc3VwcHJlc3NlZCk7Ci0JCQlkaWRFeGVjdXRlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBkaWRFeGVjdXRlKCkgewotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVkbygpIHsKLQkJCWV4ZWN1dGUoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCN1bmRvKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgIXJlc3VsdC5pc0VtcHR5KCkpIHsKLQkJCQlpZiAoIXJlc3VsdC5lbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzdWx0LmVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkJZS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4udmFsdWVPZighc3VwcHJlc3NlZCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghcmVzdWx0LnBhdGhzLmlzRW1wdHkoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXN1bHQucGF0aHMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgcGF0aCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKHN1cHByZXNzZWQpIHsKLQkJCQkJCQlzdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMoKQotCQkJCQkJCQkJLnJlbW92ZShwYXRoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJc3VwcHJlc3Npb24uZ2V0U3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzKCkKLQkJCQkJCQkJCS5hZGQocGF0aCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZGlkVW5kbygpOwotCQkJCXJlc3VsdC5jbGVhcigpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgZGlkVW5kbygpIHsKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3ByZXBhcmUoKQotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldFJlc3VsdCgpCi0JCSAqLwotCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCQlpZiAoIXJlc3VsdC5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gY29sbGVjdGlvbjsKLQkJCX0KLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldEFmZmVjdGVkT2JqZWN0cygpCi0JCSAqLwotCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCQlyZXR1cm4gY29sbGVjdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHlFbGVtZW50QWZmZWN0ZWQoKSB7Ci0JCQlyZXR1cm4gIXJlc3VsdC5wYXRocy5pc0VtcHR5KCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0LmNsZWFyKCk7Ci0JCQl9Ci0KLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuIHBoeXNpY2FsIHN0YXRlIG9mIHRoZSBwcm9jZXNzRWxlbWVudAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXRzZWxmU3VwcHJlc3NlZChPYmplY3Qgb2JqKXsKLQkJaWYob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQpewotCQkJcmV0dXJuICgoUHJvY2Vzc0VsZW1lbnQpb2JqKS5nZXRTdXBwcmVzc2VkKCk7Ci0JCX0KLQkJCi0JCWlmKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyICYmIFByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKG9iaikpewotCQkJcmV0dXJuIGlzSW5TdXBwcmVzc2VkTGlzdCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpb2JqKTsKLQkJfQotCQkKLQkJaWYob2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgJiYgIVByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKG9iaikpewotCQkJT2JqZWN0IG9iamVjdCA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0JCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KW9iamVjdCkuZ2V0U3VwcHJlc3NlZCgpOwotCQl9Ci0JCQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNTdXBwcmVzc2VkKE9iamVjdCBvYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiBpc1N1cHByZXNzZWQob2JqKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9UbmdVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvVG5nVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTFlNDdlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9UbmdVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbC5Db3BpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5QYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlNldENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQXR0cmlidXRlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRmVhdHVyZU1hcEVudHJ5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5EaXNjaXBsaW5lSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuUm9sZVNldEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LlN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuQ29udGVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuTW92ZURvd25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLk1vdmVVcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwudXRpbC5TdHJpbmdSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLk5hbWVDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5VbmlxdWVOYW1lSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLk1lc3NhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHdpdGggc3RhdGljIG1ldGhvZHMgZm9yIG1ldGhvZCBhdXRob3JpbmcKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUbmdVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgdW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgPSBuZXcgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpCi0JCQkuaXNEZWJ1Z2dpbmcoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURBTkNFX0ZJTEVTVFJJTkdfU0VQQVJBVE9SID0gInwiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJREFOQ0VfRklMRVNUUklOR19TRVBBUkFUT1JfU1BMSVRURVIgPSAiXFx8IjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ0FURUdPUllfUFJPUEVSVFkgPSAiUFVCTElTSF9DQVRFR09SWSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZW1vdmVzIGFsbCBhZGFwdGVycyB0aGF0IGFyZSBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gY2xhc3MgZnJvbSB0aGUgZ2l2ZW4KLQkgKiBFT2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlT2JqCi0JICogQHBhcmFtIGNscwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBZGFwdGVycyhFT2JqZWN0IGVPYmosIENsYXNzIGNscykgewotCQlmb3IgKEl0ZXJhdG9yIGFkYXB0ZXJzID0gZU9iai5lQWRhcHRlcnMoKS5pdGVyYXRvcigpOyBhZGFwdGVycwotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcikgYWRhcHRlcnMubmV4dCgpOwotCQkJaWYgKGNscy5pc0luc3RhbmNlKGFkYXB0ZXIpKSB7Ci0JCQkJYWRhcHRlcnMucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBZGFwdGVyKEVPYmplY3QgZU9iaiwgQ2xhc3MgY2xzKSB7Ci0JCWZvciAoSXRlcmF0b3IgYWRhcHRlcnMgPSBlT2JqLmVBZGFwdGVycygpLml0ZXJhdG9yKCk7IGFkYXB0ZXJzCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBhZGFwdGVycy5uZXh0KCk7Ci0JCQlpZiAoY2xzLmlzSW5zdGFuY2UoYWRhcHRlcikpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFkYXB0ZXIgYWRhcHQoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwgTm90aWZpZXIgbm90aWZpZXIsCi0JCQlPYmplY3QgdHlwZSwgQ2xhc3Mgdmlld1R5cGUpIHsKLQkJZm9yIChJdGVyYXRvciBhZGFwdGVycyA9IG5vdGlmaWVyLmVBZGFwdGVycygpLml0ZXJhdG9yKCk7IGFkYXB0ZXJzCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBhZGFwdGVycy5uZXh0KCk7Ci0JCQlpZiAoYWRhcHRlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpICYmIHZpZXdUeXBlLmlzSW5zdGFuY2UoYWRhcHRlcikpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFjdG9yeS5hZGFwdE5ldyhub3RpZmllciwgdHlwZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRGaWxlTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAoU3RyVXRpbC5pc0JsYW5rKG5hbWUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobmFtZS5pbmRleE9mKCcvJykgIT0gLTEgfHwgbmFtZS5pbmRleE9mKCdcXCcpICE9IC0xCi0JCQkJfHwgbmFtZS5pbmRleE9mKCc6JykgIT0gLTEgfHwgbmFtZS5pbmRleE9mKCcqJykgIT0gLTEKLQkJCQl8fCBuYW1lLmluZGV4T2YoJz8nKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJyInKSAhPSAtMQotCQkJCXx8IG5hbWUuaW5kZXhPZignPCcpICE9IC0xIHx8IG5hbWUuaW5kZXhPZignPicpICE9IC0xCi0JCQkJfHwgbmFtZS5pbmRleE9mKCd8JykgIT0gLTEgfHwgbmFtZS5pbmRleE9mKCc7JykgIT0gLTEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiB2YWxpZGF0ZSB0aGUgc3RyaW5nIGZvciBhIHBsdWdpbiBuYW1lCi0JICogCi0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFBsdWdpbk5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGlzVmFsaWRGaWxlTmFtZShuYW1lKSA9PSBmYWxzZSApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJLy8gbmVlZCB0byByZW1vdmUgdGhlc2UgY2hhcmFjdGVycyBzaW5jZSB0aGV5IGNhdXNlZCBwcm9ibGVtIHdpdGggZWxlbWVudCB1cmwgZW5jb2RpbmcsIGJvb2ttYXJrIGlzc3VlLCAKLQkJLy8gYW5kIGphdmFzY3JpcHQgc3RyaW5nIGxpdGVybmFsIGVzY2FwaW5nIGlzc3VlCi0JCS8vIHNlZSAxNTY5NDYgLSBwbHVnaW4gbmFtZSBzaG91bGQgbm90IGFsbG93ICUsICMsIGFuZCAnCi0JCWlmIChuYW1lLmluZGV4T2YoJyUnKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJyMnKSAhPSAtMQotCQkJCXx8IG5hbWUuaW5kZXhPZignXCcnKSAhPSAtMSApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBmb3IgdGhlIGdpdmVuIEVPYmplY3QuCi0JICogCi0JICogQHBhcmFtIGVPYmoKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBlQ2xhc3NlcwotCSAqICAgICAgICAgICAgY29sbGVjdGlvbiBvZiBFQ2xhc3Mgb2JqZWN0cy4gVGhlIEVPYmplY3QgaW5zdGFuY2VzIG9mIHRoZXNlCi0JICogICAgICAgICAgICBFQ2xhc3Mgb2JqZWN0cyB3aWxsIGJlIHNhdmVkIGluIHRoZWlyIG93biBkaXJlY3RvcnkuCi0JICogQHJldHVybiBudWxsIGlmIHN1Y2Nlc3NmdWwsIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShOYW1lZEVsZW1lbnQgZSwgU3RyaW5nIG5hbWUsCi0JCQlDb2xsZWN0aW9uIGVDbGFzc2VzKSB7Ci0JCXJldHVybiBjaGVja05hbWUoKChFT2JqZWN0KSBlKS5lQ29udGFpbmVyKCksIGUsIG5hbWUsIFRuZ1V0aWwKLQkJCQkuZ2V0VHlwZVRleHQoZSksIGVDbGFzc2VzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja05hbWUoRU9iamVjdCBwYXJlbnQsIE5hbWVkRWxlbWVudCBlLCBTdHJpbmcgbmFtZSwKLQkJCVN0cmluZyBlbGVtZW50VHlwZVRleHQsIENvbGxlY3Rpb24gZUNsYXNzZXMpIHsKLQkJU3RyaW5nIG1zZyA9IGNoZWNrRWxlbWVudE5hbWUobmFtZSwgZWxlbWVudFR5cGVUZXh0KTsKLQkJaWYgKG1zZyAhPSBudWxsKQotCQkJcmV0dXJuIG1zZzsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZUNvbnRlbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCU5hbWVkRWxlbWVudCBjaGlsZCA9IChOYW1lZEVsZW1lbnQpIGNoaWxkcmVuLmdldChpKTsKLQkJCWlmIChjaGlsZCAhPSBlICYmIGlzRUNsYXNzSW5zdGFuY2VPZihlQ2xhc3NlcywgY2hpbGQpCi0JCQkJCSYmIG5hbWUuZXF1YWxzSWdub3JlQ2FzZShjaGlsZC5nZXROYW1lKCkpKSB7Ci0JCQkJLy8JCXJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZywgbmFtZSk7IAotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShFT2JqZWN0IHBhcmVudCwgTmFtZWRFbGVtZW50IGUsIFN0cmluZyBuYW1lLAotCQkJU3RyaW5nIGVsZW1lbnRUeXBlVGV4dCwgSUZpbHRlciBjaGlsZEZpbHRlcikgewotCQlTdHJpbmcgbXNnID0gY2hlY2tFbGVtZW50TmFtZShuYW1lLCBlbGVtZW50VHlwZVRleHQpOwotCQlpZiAobXNnICE9IG51bGwpCi0JCQlyZXR1cm4gbXNnOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5lQ29udGVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJTmFtZWRFbGVtZW50IGNoaWxkID0gKE5hbWVkRWxlbWVudCkgY2hpbGRyZW4uZ2V0KGkpOwotCQkJaWYgKGNoaWxkICE9IGUgJiYgY2hpbGRGaWx0ZXIuYWNjZXB0KGNoaWxkKQotCQkJCQkmJiBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoY2hpbGQuZ2V0TmFtZSgpKSkgewotCQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2csIG5hbWUpOyAKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG5hbWUgY2FuIGJlIHVzZWQgZm9yIHRoZSBnaXZlbiBlbGVtZW50LiBUaGUgbWV0aG9kCi0JICogYXNzdW1lIHRoYXQgdGhlIGdpdmVuIGVsZW1lbnQgd2lsbCBiZSBzYXZlZCB1bmRlciB0aGUgZ2l2ZW4gZGlyZWN0b3J5Ci0JICogdXNpbmcgdGhlIGdpdmVuIG5hbWUuCi0JICogCi0JICogQHBhcmFtIGRpcgotCSAqICAgICAgICAgICAgRGlyZWN0b3J5IHdoZXJlIHRoZSBnaXZlbiBlbGVtZW50IHdpbGwgYmUgc2F2ZWQgaW4gYSBmaWxlIG9yIGEKLQkgKiAgICAgICAgICAgIGRpcmVjdG9yeSBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGlzRGlyCi0JICogQHBhcmFtIHNpYmxpbmdzCi0JICogICAgICAgICAgICBleGlzaXRpbmcgc2libGluZ3Mgb2YgdGhlIGdpdmVuIGVsZW1lbnQgPGNvZGU+ZTwvY29kZT4KLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgaXRzIG5hbWUgdG8gYmUgY2hlY2tlZC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIHN1Z2dlc3RlZCBuZXcgbmFtZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgPGNvZGU+ZTwvY29kZT4KLQkgKiBAcGFyYW0gdHlwZUxhYmVsCi0JICogICAgICAgICAgICB0aGUgZWxlbWVudCB0eXBlIGxhYmVsLgotCSAqIEBwYXJhbSBpc0RpcgotCSAqICAgICAgICAgICAgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGdpdmVuIGVsZW1lbnQgd2lsbCBiZSBzYXZlZCBhCi0JICogICAgICAgICAgICBkaXJlY3RvcnkKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIGdpdmVuIG5hbWUgY2FuIGJlIHVzZWQsIGFuIGVycm9yIG1lc3NhZ2UgaWYgdGhlIG5hbWUKLQkgKiAgICAgICAgIGlzIGFscmVhZHkgdGFrZW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lKEZpbGUgZGlyLCBDb2xsZWN0aW9uIHNpYmxpbmdzLAotCQkJTmFtZWRFbGVtZW50IGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgZWxlbWVudFR5cGVUZXh0LCBib29sZWFuIGlzRGlyKSB7Ci0JCVN0cmluZyBtc2cgPSBjaGVja0VsZW1lbnROYW1lKG5hbWUsIGVsZW1lbnRUeXBlVGV4dCk7Ci0JCWlmIChtc2cgIT0gbnVsbCkKLQkJCXJldHVybiBtc2c7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IG5hbWU7Ci0JCWlmICghaXNEaXIpIHsKLQkJCWZpbGVOYW1lID0gZmlsZU5hbWUgKyAoKElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKVNlcnZpY2VzLmdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVyKCkpLmdldEZpbGVFeHRlbnNpb24oZSk7Ci0JCX0KLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyLCBmaWxlTmFtZSk7Ci0JCUZpbGUgY3VycmVudEZpbGUgPSBudWxsOwotCQlpZiAoZSAhPSBudWxsICYmIGUuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJY3VycmVudEZpbGUgPSBuZXcgRmlsZShlLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCWlmIChpc0RpcikgewotCQkJCWN1cnJlbnRGaWxlID0gY3VycmVudEZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQkJfQotCQl9Ci0JCWJvb2xlYW4gYiA9IGZpbGUuZXhpc3RzKCk7Ci0JCWlmIChiICYmICFmaWxlLmVxdWFscyhjdXJyZW50RmlsZSkpIHsKLQkJCW1zZyA9IE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLCBuYW1lKTsKLQkJCS8qIFRPRE86IGlzIHRoaXMgbmVlZGVkPyBBZnRlciBjYWxsaW5nIE5MUy5iaW5kLCB0aGVyZSB3aWxsCW5vdCBiZSBhbnkgcGxhY2Vob2xkZXJzIGxlZnQgZm9yIHBhcmFtcy4KLQkJCU9iamVjdFtdIHBhcmFtcyA9IG5ldyBPYmplY3RbMl07Ci0JCQlpZiAoZmlsZS5pc0ZpbGUoKSkgewotCQkJCXBhcmFtc1swXSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmZpbGVfdGV4dDsgCi0JCQl9IGVsc2UgewotCQkJCXBhcmFtc1swXSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmRpcmVjdG9yeV90ZXh0OyAKLQkJCX0KLQkJCXBhcmFtc1sxXSA9IGZpbGU7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobXNnLCBwYXJhbXMpLnRvU3RyaW5nKCk7Ci0JCQkqLwotCQkJcmV0dXJuIG1zZzsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzaWJsaW5ncy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5hbWVkRWxlbWVudCBjaGlsZCA9IChOYW1lZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkICE9IGUgJiYgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKGNoaWxkLmdldE5hbWUoKSkpIHsKLQkJCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLCBuYW1lKTsgCi0JCQl9Ci0JCX0KLQkJLy8gCi0JCXJldHVybiBudWxsOwotCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tFbGVtZW50TmFtZShTdHJpbmcgbmFtZSwgU3RyaW5nIGVsZW1lbnRUeXBlVGV4dCkgewotCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZywgU3RyVXRpbC50b0xvd2VyKGVsZW1lbnRUeXBlVGV4dCkpOyAKLQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiICIpKSAvLyROT04tTkxTLTEkCi0JCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZEVsZW1lbnROYW1lRXJyb3IxX21zZywgbmFtZSk7IAotCQlpZiAobmFtZS5lbmRzV2l0aCgiLiIpKSAvLyROT04tTkxTLTEkCi0JCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZEVsZW1lbnROYW1lRXJyb3IyX21zZywgbmFtZSk7IAkJCi0JCWlmICghaXNWYWxpZEZpbGVOYW1lKG5hbWUpKQotCQkJLy8JCXJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmludmFsaWRFbGVtZW50TmFtZUVycm9yM19tc2csIG5hbWUpOyAKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tQbHVnaW5OYW1lKFN0cmluZyBuYW1lKSB7Ci0JCi0JCVN0cmluZyBlcnJvciA9IGNoZWNrRWxlbWVudE5hbWUobmFtZSwgVG5nVXRpbC5nZXRUeXBlVGV4dCgiTWV0aG9kUGx1Z2luIikgKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIGVycm9yICE9IG51bGwgKSB7Ci0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLQkJCi0JCS8vIDE1Njk0NiAtIHBsdWdpbiBuYW1lIHNob3VsZCBub3QgYWxsb3cgJSwgIywgYW5kICcKLQkJaWYgKCFpc1ZhbGlkUGx1Z2luTmFtZShuYW1lKSApIHsKLQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkUGx1Z2luTmFtZUVycm9yX21zZywgbmFtZSk7IAotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrQWN0aXZpdHlOYW1lKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJT2JqZWN0IG9iamVjdCwgU3RyaW5nIG5hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkKLQkJCXJldHVybiBudWxsOwotCQkvLyBpZighaXNWYWxpZEZpbGVOYW1lKG5hbWUpKSByZXR1cm4gIkludmFsaWQgbmFtZTogJyIgKyBuYW1lICsgIicuIFRoZQotCQkvLyBuYW1lIGNhbm5vdCBjb250YWluIGZvbGxvd2luZyBjaGFyYWN0ZXJzOiBcXCAvIDogKiA/IFwiIDwgPiB8IjsKLQkJcmV0dXJuIE5hbWVDaGVja2VyLmNoZWNrTmFtZShhZGFwdGVyRmFjdG9yeSwgKEJyZWFrZG93bkVsZW1lbnQpIG9iamVjdCwgQWN0aXZpdHkuY2xhc3MsCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgbmFtZSwgc3VwcHJlc3Npb24pOwotCX0KLQotLy8JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tXQlNBY3Rpdml0eU5hbWUoT2JqZWN0IGFjdCwgU3RyaW5nIG5hbWUpIHsKLS8vCQlyZXR1cm4gY2hlY2tBY3Rpdml0eU5hbWUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLS8vCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBhY3QsIG5hbWUpOwotLy8JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tXQlNBY3Rpdml0eVByZXNlbnRhdGlvbk5hbWUoT2JqZWN0IGFjdCwKLQkJCVN0cmluZyBuYW1lLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQlpZiAoIShhY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIE5hbWVDaGVja2VyLmNoZWNrTmFtZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCAoQnJlYWtkb3duRWxlbWVudCkgYWN0LCBBY3Rpdml0eS5jbGFzcywKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwKLQkJCQluYW1lLCBzdXBwcmVzc2lvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tXb3JrQnJlYWtkb3duRWxlbWVudFByZXNlbnRhdGlvbk5hbWUoT2JqZWN0IGUsCi0JCQlTdHJpbmcgbmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJaWYgKCEoZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gTmFtZUNoZWNrZXIuY2hlY2tOYW1lKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIChCcmVha2Rvd25FbGVtZW50KSBlLAotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLCBuYW1lLCBzdXBwcmVzc2lvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tXb3JrUHJvZHVjdERlc2NyaXB0b3JQcmVzZW50YXRpb25OYW1lKE9iamVjdCBlLAotCQkJU3RyaW5nIG5hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCWlmICghKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBOYW1lQ2hlY2tlci5jaGVja05hbWUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgKEJyZWFrZG93bkVsZW1lbnQpIGUsCi0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLCBuYW1lLCBzdXBwcmVzc2lvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tSb2xlRGVzY3JpcHRvclByZXNlbnRhdGlvbk5hbWUoT2JqZWN0IGUsCi0JCQlTdHJpbmcgbmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJaWYgKCEoZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gTmFtZUNoZWNrZXIuY2hlY2tOYW1lKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIChCcmVha2Rvd25FbGVtZW50KSBlLCBSb2xlRGVzY3JpcHRvci5jbGFzcywKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwKLQkJCQluYW1lLCBzdXBwcmVzc2lvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUNsYXNzSW5zdGFuY2VPZihDb2xsZWN0aW9uIGVDbGFzc2VzLCBPYmplY3Qgb2JqKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVDbGFzc2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVDbGFzcy5pc0luc3RhbmNlKG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0luc3RhbmNlT2YoQ29sbGVjdGlvbiBjbGFzc2VzLCBPYmplY3Qgb2JqKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNsYXNzZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDbGFzcyBjbGF6eiA9IChDbGFzcykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2xhenouaXNJbnN0YW5jZShvYmopKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFkYXB0ZXJGYWN0b3J5IGdldEJlc3RBZGFwdGVyRmFjdG9yeSgKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIHsKLQkJCXJldHVybiAoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMYWJlbChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRMYWJlbChvYmplY3QsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvYmplY3QsIFN0cmluZyBhbHRlcm5hdGl2ZUxhYmVsKSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCXJldHVybiBnZXRMYWJlbCgoKENvbnRlbnREZXNjcmlwdGlvbikgb2JqZWN0KS5lQ29udGFpbmVyKCksIGFsdGVybmF0aXZlTGFiZWwpOwotCQl9Ci0JCQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIG9iamVjdDsKLQkJCWlmIChlT2JqLmVJc1Byb3h5KCkpIHsKLQkJCQlTdHJpbmcgcGF0aCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSB1cmkgPSBlT2JqLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCkKLQkJCQkJCQkubm9ybWFsaXplKCgoSW50ZXJuYWxFT2JqZWN0KSBlT2JqKS5lUHJveHlVUkkoKSk7Ci0JCQkJCXBhdGggPSB1cmkuaXNGaWxlKCkgPyB1cmkudG9GaWxlU3RyaW5nKCkgOiB1cmkudG9TdHJpbmcoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLwotCQkJCX0KLQkJCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJCXBhdGggPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQkiICcnezB9JyciLCBuZXcgT2JqZWN0W10geyBwYXRoIH0pOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIHsKLQkJCQkJcGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMudW5yZXNvbHZlZF90ZXh0LCBwYXRoKTsgCi0JCQl9Ci0JCX0KLQkJU3RyaW5nIGxhYmVsID0gbnVsbDsKLQkJYm9vbGVhbiBzaG93UHJlc2VudGF0aW9uTmFtZXMgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmlzU2hvd1ByZXNlbnRhdGlvbk5hbWVzKCk7Ci0JCWlmIChzaG93UHJlc2VudGF0aW9uTmFtZXMgJiYgb2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KQotCQkJbGFiZWwgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCWVsc2UgaWYgKHNob3dQcmVzZW50YXRpb25OYW1lcyAmJiBvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KQotCQkJbGFiZWwgPSAoKFByb2Nlc3NDb21wb25lbnQpIG9iamVjdCkuZ2V0UHJvY2VzcygpCi0JCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCWlmIChsYWJlbCA9PSBudWxsIHx8IGxhYmVsLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotCQkJbGFiZWwgPSAoKE5hbWVkRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLnRyaW0oKS5sZW5ndGgoKSA9PSAwID8gYWx0ZXJuYXRpdmVMYWJlbCA6IGxhYmVsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExhYmVsKFZhcmlhYmlsaXR5RWxlbWVudCBvYmplY3QsCi0JCQlTdHJpbmcgYWx0ZXJuYXRpdmVMYWJlbCwgYm9vbGVhbiBwcmVmZXJCYXNlKSB7Ci0JCVN0cmluZyBsYWJlbCA9IFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBhbHRlcm5hdGl2ZUxhYmVsKTsKLQkJaWYgKHByZWZlckJhc2UgJiYgb2JqZWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSA9IG9iamVjdC5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCVN0cmluZyB2YXJpYWJpbGl0eVR4dCA9IG51bGw7Ci0JCQlpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpIHsKLQkJCQl2YXJpYWJpbGl0eVR4dCA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmNvbnRyaWJ1dGVzVG9fdGV4dDsgCi0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTikgewotCQkJCQl2YXJpYWJpbGl0eVR4dCA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmxvY2FsQ29udHJpYnV0ZXNUb190ZXh0OyAKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUykgewotCQkJCXZhcmlhYmlsaXR5VHh0ID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZXh0ZW5kc190ZXh0OyAKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpIHsKLQkJCQl2YXJpYWJpbGl0eVR4dCA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnJlcGxhY2VzX3RleHQ7IAotCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVCkgewotCQkJCXZhcmlhYmlsaXR5VHh0ID0gTGlicmFyeUVkaXRSZXNvdXJjZXMubG9jYWxSZXBsYWNlc190ZXh0OyAKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19SRVBMQUNFUyl7Ci0JCQkJdmFyaWFiaWxpdHlUeHQgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5leHRlbmRzX3JlcGxhY2VzX3RleHQ7Ci0JCQl9Ci0JCQlpZiAodmFyaWFiaWxpdHlUeHQgIT0gbnVsbCkgewotCQkJCU1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ob2JqZWN0Ci0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJCQlpZiAoYmFzZVBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJCWxhYmVsID0gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHl3aXRocGx1Z2luX2luZm8sIChuZXcgU3RyaW5nW10gewotCQkJCQlsYWJlbCwKLQkJCQkJdmFyaWFiaWxpdHlUeHQsCi0JCQkJCVRuZ1V0aWwKLQkJCQkJCQkuZ2V0TGFiZWwoCi0JCQkJCQkJCQlvYmplY3QKLQkJCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwKLQkJCQkJCQkJCWFsdGVybmF0aXZlTGFiZWwpLAotCQkJCQliYXNlUGx1Z2luLmdldE5hbWUoKSB9KSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbGFiZWwgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5VdGlsX2xhYmVscGF0aF92YXJpYWJpbGl0eV9pbmZvLCAobmV3IFN0cmluZ1tdIHsKLQkJCQkJbGFiZWwsCi0JCQkJCXZhcmlhYmlsaXR5VHh0LAotCQkJCQlUbmdVdGlsLmdldExhYmVsKG9iamVjdAotCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksCi0JCQkJCQkJYWx0ZXJuYXRpdmVMYWJlbCkgfSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgUHJvY2Vzc0NvbXBvbmVudAotCSAqIAotCSAqIEBwYXJhbSBjb21wb25lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZVByb2Nlc3NDb21wb25lbnQoUHJvY2Vzc0NvbXBvbmVudCBjb21wb25lbnQsCi0JCQlFQ2xhc3MgdHlwZSkgewotCQkvLyBjcmVhdGUgbmV3IHByb2Nlc3MgZm9yIHRoZSBwcm9jZXNzIGNvbXBvbmVudAotCQkvLwotCQlQcm9jZXNzIHByb2MgPSBjb21wb25lbnQuZ2V0UHJvY2VzcygpOwotCQlpZiAocHJvYyA9PSBudWxsKSB7Ci0JCQlwcm9jID0gKFByb2Nlc3MpIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZSh0eXBlKTsKLQkJCWNvbXBvbmVudC5zZXRQcm9jZXNzKHByb2MpOwotCQl9Ci0KLQkJLy8gY3JlYXRlIHRvcCBhY3Rpdml0eQotCQkvLwotCQkvLyBpZihwcm9jLmdldFRvcExldmVsQnJlYWtkb3duRWxlbWVudCgpID09IG51bGwpIHsKLQkJLy8gQWN0aXZpdHkgYWN0ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKTsKLQkJLy8gcHJvYy5zZXRUb3BMZXZlbEJyZWFrZG93bkVsZW1lbnQoYWN0KTsKLQkJLy8gY29tcG9uZW50LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGFjdCk7Ci0JCS8vIH0KLQotCQkvLyBjcmVhdGUgV0JTLCBPQlMsIGFuZCBQQlMKLQkJLy8KLQkJLy8gaWYoY29tcG9uZW50LmdldFdCUygpID09IG51bGwpCi0JCS8vIGNvbXBvbmVudC5zZXRXQlMoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV0JTKCkpOwotCQkvLyBpZihjb21wb25lbnQuZ2V0VEJTKCkgPT0gbnVsbCkKLQkJLy8gY29tcG9uZW50LnNldFRCUyhVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUQlMoKSk7Ci0JCS8vIGlmKGNvbXBvbmVudC5nZXRXUEJTKCkgPT0gbnVsbCkKLQkJLy8gY29tcG9uZW50LnNldFdQQlMoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV1BCUygpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEJyZWFrZG93bkVsZW1lbnQgZ2V0UGFyZW50KEJyZWFrZG93bkVsZW1lbnQgYmUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tOdWxsKFN0cmluZyBzdHIpIHsKLQkJcmV0dXJuIChzdHIgPT0gbnVsbCA/ICIiIDogc3RyKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZXNjcmlwdG9yRXhpc3RzKFJvbGUgcm9sZSwgTGlzdCByb2xlRGVzY3JpcHRvckxpc3QpIHsKLQkJZm9yIChpbnQgaSA9IHJvbGVEZXNjcmlwdG9yTGlzdC5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIHJvbGVEZXNjcmlwdG9yTGlzdAotCQkJCQkuZ2V0KGkpOwotCQkJaWYgKHJvbGVEZXNjLmdldFJvbGUoKSA9PSByb2xlKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgY29weShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ29waWVyIGNvcGllciA9IG5ldyBDb3BpZXIoKSB7Ci0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTc4NDY1NzYwMzM5MDQ2OTFMOwotCi0JCQkvKioKLQkJCSAqIENhbGxlZCB0byBoYW5kbGUgdGhlIGNvcHlpbmcgb2YgYSBjcm9zcyByZWZlcmVuY2U7IHRoaXMgYWRkcwotCQkJICogdmFsdWVzIG9yIHNldHMgYSBzaW5nbGUgdmFsdWUgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBtdWx0aXBsaWNpdHkKLQkJCSAqIHdoaWxlIG9taXR0aW5nIGFueSBiaWRpcmVjdGlvbmFsIHJlZmVyZW5jZSBvciBzaW5nbGUgb3Bwb3NpdGUKLQkJCSAqIGZlYXR1cmUncyByZWZlcmVuY2UgdGhhdCBpc24ndCBpbiB0aGUgY29weSBtYXAuCi0JCQkgKiAKLQkJCSAqIEBwYXJhbSBlUmVmZXJlbmNlCi0JCQkgKiAgICAgICAgICAgIHRoZSByZWZlcmVuY2UgdG8gY29weS4KLQkJCSAqIEBwYXJhbSBlT2JqZWN0Ci0JCQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5LgotCQkJICogQHBhcmFtIGNvcHlFT2JqZWN0Ci0JCQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gY29weSB0by4KLQkJCSAqLwotCQkJcHJvdGVjdGVkIHZvaWQgY29weVJlZmVyZW5jZShFUmVmZXJlbmNlIGVSZWZlcmVuY2UsCi0JCQkJCUVPYmplY3QgZU9iamVjdCwgRU9iamVjdCBjb3B5RU9iamVjdCkgewotCQkJCWlmIChlT2JqZWN0LmVJc1NldChlUmVmZXJlbmNlKSkgewotCQkJCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gT3Bwb3NpdGVGZWF0dXJlLmdldE9wcG9zaXRlRmVhdHVyZShlUmVmZXJlbmNlKTsKLQkJCQkJCi0JCQkJCS8vICJtYW55IiBvcHBvc2l0ZSBmZWF0dXJlIGRvZXMgbm90IHJlcXVpcmUgY29waWVkIHRhcmdldCwgaXQgaXMKLQkJCQkJLy8gdHJlYXRlZCBhcyBhIHJlZ3VsYXIgbm9uLWNvbnRhaW5tZW50IHJlZmVyZW5jZQotCQkJCQkvLyBUT0RPOiBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IGNvcGllZCBpbgotCQkJCQkvLyBFTUYgaW1wbGVtZW50YXRpb24KLQkJCQkJLy8KLQkJCQkJYm9vbGVhbiBjb3BpZWRUYXJnZXRSZXF1aXJlZCA9IGVSZWZlcmVuY2UuZ2V0RU9wcG9zaXRlKCkgIT0gbnVsbAotCQkJCQkJCXx8IChvcHBvc2l0ZUZlYXR1cmUgIT0gbnVsbCAmJiAhb3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKTsKLQkJCQkJCQkJCQkKLQkJCQkJaWYgKGVSZWZlcmVuY2UuaXNNYW55KCkpIHsKLQkJCQkJCUxpc3Qgc291cmNlID0gKExpc3QpIGVPYmplY3QuZUdldChlUmVmZXJlbmNlKTsKLQkJCQkJCUludGVybmFsRUxpc3QgdGFyZ2V0ID0gKEludGVybmFsRUxpc3QpIGNvcHlFT2JqZWN0Ci0JCQkJCQkJCS5lR2V0KGdldFRhcmdldChlUmVmZXJlbmNlKSk7Ci0JCQkJCQlpZiAoc291cmNlLmlzRW1wdHkoKSkgewotCQkJCQkJCXRhcmdldC5jbGVhcigpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgayA9IHNvdXJjZS5pdGVyYXRvcigpOyBrLmhhc05leHQoKTspIHsKLQkJCQkJCQkJT2JqZWN0IHJlZmVyZW5jZWRFT2JqZWN0ID0gay5uZXh0KCk7Ci0JCQkJCQkJCU9iamVjdCBjb3B5UmVmZXJlbmNlZEVPYmplY3QgPSBnZXQocmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCQlpZiAoY29weVJlZmVyZW5jZWRFT2JqZWN0ID09IG51bGwpIHsKLQkJCQkJCQkJCWlmICghY29waWVkVGFyZ2V0UmVxdWlyZWQpIHsKLQkJCQkJCQkJCQl0YXJnZXQuYWRkVW5pcXVlKGluZGV4LAotCQkJCQkJCQkJCQkJcmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCQkJCSsraW5kZXg7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlpZiAoY29waWVkVGFyZ2V0UmVxdWlyZWQpIHsKLQkJCQkJCQkJCQlpbnQgcG9zaXRpb24gPSB0YXJnZXQKLQkJCQkJCQkJCQkJCS5pbmRleE9mKGNvcHlSZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCQkJaWYgKHBvc2l0aW9uID09IC0xKSB7Ci0JCQkJCQkJCQkJCXRhcmdldC5hZGRVbmlxdWUoaW5kZXgsCi0JCQkJCQkJCQkJCQkJY29weVJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQkJCQl9IGVsc2UgaWYgKGluZGV4ICE9IHBvc2l0aW9uKSB7Ci0JCQkJCQkJCQkJCXRhcmdldC5tb3ZlKGluZGV4LAotCQkJCQkJCQkJCQkJCWNvcHlSZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQl0YXJnZXQuYWRkVW5pcXVlKGluZGV4LAotCQkJCQkJCQkJCQkJY29weVJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCSsraW5kZXg7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlPYmplY3QgcmVmZXJlbmNlZEVPYmplY3QgPSBlT2JqZWN0LmVHZXQoZVJlZmVyZW5jZSk7Ci0JCQkJCQlpZiAocmVmZXJlbmNlZEVPYmplY3QgPT0gbnVsbCkgewotCQkJCQkJCWNvcHlFT2JqZWN0LmVTZXQoZ2V0VGFyZ2V0KGVSZWZlcmVuY2UpLCBudWxsKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJT2JqZWN0IGNvcHlSZWZlcmVuY2VkRU9iamVjdCA9IGdldChyZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJaWYgKGNvcHlSZWZlcmVuY2VkRU9iamVjdCA9PSBudWxsKSB7Ci0JCQkJCQkJCWlmICghY29waWVkVGFyZ2V0UmVxdWlyZWQpIHsKLQkJCQkJCQkJCWNvcHlFT2JqZWN0LmVTZXQoZ2V0VGFyZ2V0KGVSZWZlcmVuY2UpLAotCQkJCQkJCQkJCQlyZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQljb3B5RU9iamVjdC5lU2V0KGdldFRhcmdldChlUmVmZXJlbmNlKSwKLQkJCQkJCQkJCQljb3B5UmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJTWV0aG9kRWxlbWVudCBjb3B5ID0gKE1ldGhvZEVsZW1lbnQpIGNvcGllci5jb3B5KGVsZW1lbnQpOwotCQljb3BpZXIuY29weVJlZmVyZW5jZXMoKTsKLQotCQkvLyB1bnNldCB0aGUgR1VJRCBvZiB0aGUgY29weSBhbmQgaXRzIG9mZnN0cmluZwotCQkvLwotCQljb3B5LnNldEd1aWQobnVsbCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvcHkuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCSgoTWV0aG9kRWxlbWVudCkgZSkuc2V0R3VpZChudWxsKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFZhcmlhYmlsaXR5RWxlbWVudCBnZXRCYXNlKFZhcmlhYmlsaXR5RWxlbWVudCBjKSB7Ci0JCWZvciAoOyBjLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsOyBjID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgYwotCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpCi0JCQk7Ci0JCXJldHVybiBjOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29udGVudENhdGVnb3J5IGZpbmRJbmhlcml0ZWQoQ29sbGVjdGlvbiBpbmhlcml0ZWRMaXN0LAotCQkJQ29udGVudENhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGluaGVyaXRlZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgZWxlbWVudCA9IChDb250ZW50Q2F0ZWdvcnkpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwKLQkJCQkJJiYgKGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IGNhdGVnb3J5IHx8IGVsZW1lbnQKLQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IGNhdGVnb3J5Ci0JCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkpCi0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb250ZW50Q2F0ZWdvcnkgcmVtb3ZlSW5oZXJpdGVkKExpc3QgaW5oZXJpdGVkTGlzdCwKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbmhlcml0ZWRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ29udGVudENhdGVnb3J5IGVsZW1lbnQgPSAoQ29udGVudENhdGVnb3J5KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBjYXRlZ29yeSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29udGVudEl0ZW1Qcm92aWRlciBnZXRDb250ZW50SXRlbVByb3ZpZGVyKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIG1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciA9IChNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIpZ2V0QWRhcHRlcigKLQkJCQlwbHVnaW4sCU1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCW1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihwbHVnaW4pOwotCQlJR3JvdXBDb250YWluZXIgZ3JvdXBDb250YWluZXIgPSAoSUdyb3VwQ29udGFpbmVyKSBUbmdVdGlsLmdldEFkYXB0ZXIoCi0JCQkJKEVPYmplY3QpIHBsdWdpbiwgSUdyb3VwQ29udGFpbmVyLmNsYXNzKTsKLQkJaWYgKGdyb3VwQ29udGFpbmVyICE9IG51bGwpIHsKLQkJCXJldHVybiAoQ29udGVudEl0ZW1Qcm92aWRlcikgZ3JvdXBDb250YWluZXIKLQkJCQkJLmdldEdyb3VwSXRlbVByb3ZpZGVyKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgZ2V0U3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJQ29udGVudEl0ZW1Qcm92aWRlciBjb250ZW50SXRlbVByb3ZpZGVyID0gZ2V0Q29udGVudEl0ZW1Qcm92aWRlcihwbHVnaW4pOwotCQljb250ZW50SXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKGNvbnRlbnRJdGVtUHJvdmlkZXIpOwotCQlpZiAoY29udGVudEl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKFN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciljb250ZW50SXRlbVByb3ZpZGVyLmdldEdyb3VwSXRlbVByb3ZpZGVyKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXREaXNjaXBsaW5lQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihNZXRob2RQbHVnaW4gbW9kZWwpIHsKLQkJU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciA9IGdldFN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihtb2RlbCk7Ci0JCXN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpOwotCQlpZiAoc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIKLQkJCS5nZXRHcm91cEl0ZW1Qcm92aWRlcihMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXREb21haW5zSXRlbVByb3ZpZGVyKE1ldGhvZFBsdWdpbiBtb2RlbCkgewotCQlTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyID0gZ2V0U3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKG1vZGVsKTsKLQkJc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcik7Ci0JCWlmIChzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcgotCQkJLmdldEdyb3VwSXRlbVByb3ZpZGVyKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9Eb21haW5zX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0V29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlcihNZXRob2RQbHVnaW4gbW9kZWwpIHsKLQkJU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciA9IGdldFN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihtb2RlbCk7Ci0JCXN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpOwotCQlpZiAoc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIKLQkJCS5nZXRHcm91cEl0ZW1Qcm92aWRlcihMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFJvbGVTZXRzSXRlbVByb3ZpZGVyKE1ldGhvZFBsdWdpbiBtb2RlbCkgewotCQlTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyID0gZ2V0U3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKG1vZGVsKTsKLQkJc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcik7Ci0JCWlmIChzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcgotCQkJLmdldEdyb3VwSXRlbVByb3ZpZGVyKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRUb29sc0l0ZW1Qcm92aWRlcihNZXRob2RQbHVnaW4gbW9kZWwpIHsKLQkJU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciA9IGdldFN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihtb2RlbCk7Ci0JCXN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpOwotCQlpZiAoc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIKLQkJCS5nZXRHcm91cEl0ZW1Qcm92aWRlcihMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVG9vbHNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgbmV4dCBhdmFpbGFibGUgbmFtZSB0aGF0IGlzIG5vdCBhbHJlYWR5IHRha2VuIGJ5IGFueSBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGJhc2VOYW1lCi0JICogQHJldHVybiBiYXNlTmFtZSBvZiBiYXNlTmFtZV9YIHdoZXJlIGlzIGlzIHRoZSBudW1iZXIgc3RhcnRpbmcgZnJvbSAyCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmV4dEF2YWlsYWJsZU5hbWUoTGlzdDw/IGV4dGVuZHMgTWV0aG9kRWxlbWVudD4gZWxlbWVudHMsIFN0cmluZyBiYXNlTmFtZSkgewotCQlpZihpc05hbWVUYWtlbihlbGVtZW50cywgbnVsbCwgYmFzZU5hbWUpKSB7Ci0JCQlmb3IgKGludCBpID0gMjsgdHJ1ZTsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBiYXNlTmFtZSArICdfJyArIGk7Ci0JCQkJaWYgKCFpc05hbWVUYWtlbihlbGVtZW50cywgbnVsbCwgbmFtZSkpIHsKLQkJCQkJcmV0dXJuIG5hbWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBiYXNlTmFtZTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0TmFtZShMaXN0PD8gZXh0ZW5kcyBNZXRob2RFbGVtZW50PiBzaWJsaW5ncywgTWV0aG9kRWxlbWVudCBlLAotCQkJU3RyaW5nIGJhc2VOYW1lKSB7Ci0JCWlmIChlLmdldE5hbWUoKSAhPSBudWxsICYmIGUuZ2V0TmFtZSgpLnRyaW0oKS5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFpc05hbWVUYWtlbihzaWJsaW5ncywgZSwgYmFzZU5hbWUpKSB7Ci0JCQllLnNldE5hbWUoYmFzZU5hbWUpOwotCQkJc2V0UHJlc2VudGF0aW9uTmFtZShlLCBiYXNlTmFtZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDI7IHRydWU7IGkrKykgewotCQkJU3RyaW5nIG5hbWUgPSBiYXNlTmFtZSArICdfJyArIGk7Ci0JCQlpZiAoIWlzTmFtZVRha2VuKHNpYmxpbmdzLCBlLCBuYW1lKSkgewotCQkJCWUuc2V0TmFtZShuYW1lKTsKLQkJCQlzZXRQcmVzZW50YXRpb25OYW1lKGUsIG5hbWUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQkJCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHROYW1lKEN1c3RvbUNhdGVnb3J5IHBhcmVudCwgQ3VzdG9tQ2F0ZWdvcnkgY2MsIFN0cmluZyBiYXNlTmFtZSkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ocGFyZW50KTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gcGx1Z2luID09IG51bGwgPyBudWxsIDogVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoKTsKLQkJaWYgKHBrZyA9PSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKHBhcmVudC5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCksIGNjLCBiYXNlTmFtZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVVuaXF1ZU5hbWVIYW5kbGVyIGhhbmRsZXIgPSBuZXcgVW5pcXVlTmFtZUhhbmRsZXIoKTsKLQkJaGFuZGxlci5yZWdpc3Rlck5hbWVzKHBrZy5nZXRDb250ZW50RWxlbWVudHMoKSk7Ci0JCVN0cmluZyBuYW1lID0gaGFuZGxlci5nZXRVbmlxdWVOYW1lKGJhc2VOYW1lKTsKLQkJY2Muc2V0TmFtZShuYW1lKTsKLQkJY2Muc2V0UHJlc2VudGF0aW9uTmFtZShuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNldFByZXNlbnRhdGlvbk5hbWUoTWV0aG9kRWxlbWVudCBlLCBTdHJpbmcgYmFzZU5hbWUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBkZSA9IChEZXNjcmliYWJsZUVsZW1lbnQpIGU7Ci0KLQkJCVN0cmluZ0J1ZmZlciBwcmVzTmFtZUJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYmFzZU5hbWUsICJfIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgYVdvcmQgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQlwcmVzTmFtZUJ1Zi5hcHBlbmQoYVdvcmQuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkKLQkJCQkJCSsgYVdvcmQuc3Vic3RyaW5nKDEpICsgIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlkZS5zZXRQcmVzZW50YXRpb25OYW1lKHByZXNOYW1lQnVmLnRvU3RyaW5nKCkudHJpbSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOYW1lVGFrZW4oTGlzdDw/IGV4dGVuZHMgTWV0aG9kRWxlbWVudD4gc2libGluZ3MsIE1ldGhvZEVsZW1lbnQgZSwKLQkJCVN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSBzaWJsaW5ncy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJTWV0aG9kRWxlbWVudCBzaWJsaW5nID0gKE1ldGhvZEVsZW1lbnQpIHNpYmxpbmdzLmdldChpKTsKLQkJCWlmIChzaWJsaW5nICE9IGUgJiYgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKHNpYmxpbmcuZ2V0TmFtZSgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgZXh0cmFjdChDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIENsYXNzIGNscykgewotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2xzLmlzSW5zdGFuY2UoZWxlbWVudCkpIHsKLQkJCQlsaXN0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoSURlZmF1bHROYW1lU2V0dGVyIGRlZmF1bHROYW1lU2V0dGVyLAotCQkJTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAoZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgIT0gbnVsbCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoZGVmYXVsdE5hbWVTZXR0ZXIKLQkJCQkJLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpKTsKLQkJCWlmIChmZWF0dXJlSWQgPT0gZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpKSB7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCWRlZmF1bHROYW1lU2V0dGVyLnNldERlZmF1bHROYW1lKG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJZGVmYXVsdE5hbWVTZXR0ZXIuc2V0RGVmYXVsdE5hbWUoaXRlci5uZXh0KCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiYXNlQ2F0ZWdvcnkKLQkgKiBAcGFyYW0gbWV0aG9kQ29uZgotCSAqIEBwYXJhbSBjaGlsZHJlbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFeHRlbmRlZENoaWxkcmVuKENvbnRlbnRDYXRlZ29yeSBiYXNlQ2F0ZWdvcnksCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmYsIENvbGxlY3Rpb24gY2hpbGRyZW4sCi0JCQlTdHJpbmdbXSBjYXRlZ29yeVBrZ1BhdGgpIHsKLQkJTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihiYXNlQ2F0ZWdvcnkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZXRob2RDb25mLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJaWYgKE1pc2MuaXNCYXNlT2YoYmFzZVBsdWdpbiwgcGx1Z2luKSkgewotCQkJCUNvbnRlbnRQYWNrYWdlIGNhdGVnb3J5UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQkJY2F0ZWdvcnlQa2dQYXRoKTsKLQkJCQlpZiAoY2F0ZWdvcnlQa2cgIT0gbnVsbAotCQkJCQkJJiYgbWV0aG9kQ29uZi5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuY29udGFpbnMoCi0JCQkJCQkJCWNhdGVnb3J5UGtnKSkgewotCQkJCQlDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkgPSBmaW5kSW5oZXJpdGVkKGNhdGVnb3J5UGtnCi0JCQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCBiYXNlQ2F0ZWdvcnkpOwotCQkJCQlpZiAoY2F0ZWdvcnkgIT0gbnVsbCkgewotCQkJCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCQkJCQkJCQkuYWRhcHQoY2F0ZWdvcnksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlpZiAoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQkJCQkJU3lzdGVtLmVycgotCQkJCQkJCQkJLnByaW50bG4oIkRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5hZGRFeHRlbmRlZENoaWxkcmVuKCk6IGNvdWxkIG5vdCBmaW5kIGFkYXB0ZXIgZm9yICIgKyBjYXRlZ29yeSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhZGFwdGVyLmdldENoaWxkcmVuKGNhdGVnb3J5KQotCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBjaGlsZCA9IChPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlDb250ZW50RWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQkJCQllbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBjaGlsZDsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbAotCQkJCQkJCQkJJiYgZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gbnVsbCkgewotCQkJCQkJCQkvLyB0aGlzIGlzIGFuIG93biBjaGlsZCBvZiBhbiBleHRlbmRlZCBjYXRlZ29yeQotCQkJCQkJCQkvLyBpdCBtdXN0IGJlIGFkZGVkIHRvIHRoZSBjaGlsZCBsaXN0IG9mIHRoZQotCQkJCQkJCQkvLyBiYXNlIGNhdGVnb3J5IGluIHRoZSBjb25maWd1cmF0aW9uLgotCQkJCQkJCQkvLwotCQkJCQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJLy8gY29sbGVjdCB0aGUgb3duIGNoaWxkcmVuIG9mIHRoZSBleHRlbmRlZCBjYXRlZ29yaWVzCi0JCQkJCQkvLyBvZiB0aGlzIGNhdGVnb3J5IGRvd24gdGhlIGluaGVyaXRhbmNlIHRyZWUKLQkJCQkJCS8vCi0JCQkJCQlhZGRFeHRlbmRlZENoaWxkcmVuKGNhdGVnb3J5LCBtZXRob2RDb25mLCBjaGlsZHJlbiwKLQkJCQkJCQkJY2F0ZWdvcnlQa2dQYXRoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkQWxsVG8oTGlzdCBhbGxDaGlsZHJlbiwgTGlzdCBuZXdDaGlsZHJlbikgewotCQlpbnQgaWQ7Ci0JCUJyZWFrZG93bkVsZW1lbnQgY2hpbGQsIG5leHQsIGxhc3Q7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSghbmV3Q2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0JCQljaGlsZCA9IChCcmVha2Rvd25FbGVtZW50KSBuZXdDaGlsZHJlbi5yZW1vdmUoMCk7Ci0JCQlsaXN0LmNsZWFyKCk7Ci0JCQlsaXN0LmFkZChjaGlsZCk7Ci0JCQlsYXN0ID0gbnVsbDsKLQkJCQotCQkJLy8gZmluZCB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBjaGFpbiBpbiBuZXcgY2hpbGRyZW4gbGlzdAotCQkJLy8KLQkJCWZpbmRfbGFzdDoKLQkJCWZvcihuZXh0ID0gY2hpbGQuZ2V0UHJlc2VudGVkQWZ0ZXIoKTsgbmV4dCAhPSBudWxsOyBuZXh0ID0gbmV4dC5nZXRQcmVzZW50ZWRBZnRlcigpKSB7Ci0JCQkJbGFzdCA9IG5leHQ7Ci0JCQkJaWQgPSBpbmRleE9mTmV4dEVsZW1lbnQobmV3Q2hpbGRyZW4sIG5leHQpOwotCQkJCWlmKGlkID09IC0xKSB7Ci0JCQkJCWJyZWFrIGZpbmRfbGFzdDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWxpc3QuYWRkKG5ld0NoaWxkcmVuLnJlbW92ZShpZCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmKGxhc3QgIT0gbnVsbCkgewotCQkJCWlkID0gaW5kZXhPZk5leHRFbGVtZW50KGFsbENoaWxkcmVuLCBsYXN0KTsKLQkJCQlpZihpZCA9PSAtMSkgewotCQkJCQlhbGxDaGlsZHJlbi5hZGRBbGwobGlzdCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlhbGxDaGlsZHJlbi5hZGRBbGwoaWQsIGxpc3QpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWFsbENoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBjaGlsZCB0byB0aGUgYWxsQ2hpbGRyZW4gbGlzdCBiYXNlZCBvbiB0aGUgcHJlc2VudGVkQmVmb3JlCi0JICogb2YgY2hpbGQuCi0JICogCi0JICogQHBhcmFtIGFsbENoaWxkcmVuCi0JICogQHBhcmFtIGNoaWxkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFRvKExpc3QgYWxsQ2hpbGRyZW4sIEJyZWFrZG93bkVsZW1lbnQgY2hpbGQsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUJyZWFrZG93bkVsZW1lbnQgbmV4dCA9IGNoaWxkLmdldFByZXNlbnRlZEFmdGVyKCk7Ci0JCWludCBpZDsKLQkJaWYgKG5leHQgPT0gbnVsbCkgewotCQkJaWQgPSAtMTsKLQkJfSBlbHNlIHsKLQkJCWlkID0gaW5kZXhPZk5leHRFbGVtZW50KGFsbENoaWxkcmVuLCBuZXh0KTsKLQkJCS8vIGlmKGlkID09IC0xKSB7Ci0JCQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlRuZ1V0aWwuYWRkVG8oKTogaW52YWxpZCBwcmVzZW50ZWRCZWZvcmUKLQkJCS8vIG9mICIgKyBjaGlsZCk7Ci0JCQkvLyBCcmVha2Rvd25FbGVtZW50IHByZXYgPSBjaGlsZC5nZXRQcmVzZW50ZWRCZWZvcmUoKTsKLQkJCS8vIGlmKHByZXYgPT0gbnVsbCkgewotCQkJLy8gaWQgPSAwOwotCQkJLy8gfQotCQkJLy8gZWxzZSB7Ci0JCQkvLyBpZCA9IGluZGV4T2YoYWxsQ2hpbGRyZW4sIHByZXYpOwotCQkJLy8gaWYoaWQgPiAtMSkgewotCQkJLy8gaWYoaWQgPCBhbGxDaGlsZHJlbi5zaXplKCkgLSAxKSB7Ci0JCQkvLyBpZCsrOwotCQkJLy8gfQotCQkJLy8gZWxzZSB7Ci0JCQkvLyBpZCA9IC0xOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gfQotCQl9Ci0JCWlmIChpZCA9PSAtMSkgewotCQkJYWxsQ2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJfSBlbHNlIHsKLQkJCWFsbENoaWxkcmVuLmFkZChpZCwgY2hpbGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5kZXggb2YgbmV4dCBlbGVtZW50IG9mIHRoZSBicmVha2Rvd24gZWxlbWVudCB3aG9zZSBwcmVzZW50ZWQtYWZ0ZXIgZWxlbWVudCBpcyB0aGUgZ2l2ZW4gCi0JICogYnJlYWsgZG93biBlbGVtZW50Ci0JICogQHBhcmFtIG1peGVkTGlzdAotCSAqICAgICAgICAgICAgbWl4ZWQgbGlzdCBvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBhbmQKLQkgKiAgICAgICAgICAgIEJyZWFrZG93bkVsZW1lbnQgb2JqZWN0cwotCSAqIEBwYXJhbSBwcmVzZW50ZWRBZnRlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgaW5kZXhPZk5leHRFbGVtZW50KExpc3QgbWl4ZWRMaXN0LCBCcmVha2Rvd25FbGVtZW50IHByZXNlbnRlZEFmdGVyKSB7Ci0JCWludCBzaXplID0gbWl4ZWRMaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBvID0gdW53cmFwKG1peGVkTGlzdC5nZXQoaSkpOwotCQkJaWYgKG8gPT0gcHJlc2VudGVkQWZ0ZXIKLQkJCQkJfHwgKG8gaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgJiYgKChWYXJpYWJpbGl0eUVsZW1lbnQpbykuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IHByZXNlbnRlZEFmdGVyKSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEF2YWlsYWJsZUJhc2VQcm9jZXNzZXMoTWV0aG9kUGx1Z2luIHBsdWdpbiwKLQkJCUxpc3QgcHJvY2Vzc0NsYXNzZXMpIHsKLQkJTGlzdCBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgYWxsQmFzZVBsdWdpbnMgPSBNaXNjLmdldEFsbEJhc2UocGx1Z2luKTsKLQkJYWxsQmFzZVBsdWdpbnMuYWRkKDAsIHBsdWdpbik7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbEJhc2VQbHVnaW5zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCUNvbGxlY3Rpb24gcGFja2FnZXMgPSBnZXRSb290UHJvY2Vzc1BhY2thZ2VzKGJhc2VQbHVnaW4sCi0JCQkJCXByb2Nlc3NDbGFzc2VzKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwYWNrYWdlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMQotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGNoaWxkUGtnID0gKE9iamVjdCkgaXRlcmF0b3IxLm5leHQoKTsKLQkJCQkJaWYgKGNoaWxkUGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBjaGlsZFBrZykKLQkJCQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCQkJCWlmIChpc0luc3RhbmNlT2YocHJvY2Vzc0NsYXNzZXMsIHByb2MpKSB7Ci0JCQkJCQkJcHJvY2Vzc2VzLmFkZChwcm9jKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvY2Vzc2VzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldFJvb3RQcm9jZXNzUGFja2FnZVBhdGgoQ2xhc3MgcHJvY0NsYXNzKSB7Ci0JCWlmIChwcm9jQ2xhc3MgPT0gRGVsaXZlcnlQcm9jZXNzLmNsYXNzKSB7Ci0JCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoOwotCQl9IGVsc2UgaWYgKHByb2NDbGFzcyA9PSBDYXBhYmlsaXR5UGF0dGVybi5jbGFzcykgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoOwotCQl9IGVsc2UgaWYgKHByb2NDbGFzcyA9PSBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5jbGFzcykgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVQYXRoOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiBnZXRSb290UHJvY2Vzc1BhY2thZ2VzKE1ldGhvZFBsdWdpbiBwbHVnaW4sCi0JCQlDb2xsZWN0aW9uIHByb2NDbGFzc2VzKSB7Ci0JCUxpc3QgcGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHByb2NDbGFzc2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ2xhc3MgY2xhenogPSAoQ2xhc3MpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nW10gcGF0aCA9IGdldFJvb3RQcm9jZXNzUGFja2FnZVBhdGgoY2xhenopOwotCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sIHBhdGgpOwotCQkJCWlmIChwa2cgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQlwYWNrYWdlcy5hZGQocGtnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcGFja2FnZXM7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcmV0dXJuIHRydWUgaWZmIHRoZSBwbHVnaW4gaGFzIGFueSBDb250ZW50Q2F0ZWdvcnkgb2JqZWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNDYXRlZ29yaWVzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJTGlzdDxDb250ZW50UGFja2FnZT4gY29uUGFja3MgPSBnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlcyhwbHVnaW4pOwotCQlmb3IgKEl0ZXJhdG9yPENvbnRlbnRQYWNrYWdlPiBjb25QYWNrc0l0ZXIgPSBjb25QYWNrcy5pdGVyYXRvcigpO2NvblBhY2tzSXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50UGFja2FnZSBjb25QYWNrID0gY29uUGFja3NJdGVyLm5leHQoKTsKLQkJCWZvciAoSXRlcmF0b3IgY29uUGFja0l0ZXIgPSBjb25QYWNrLmdldENvbnRlbnRFbGVtZW50cygpLml0ZXJhdG9yKCk7Y29uUGFja0l0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvID0gY29uUGFja0l0ZXIubmV4dCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQkJCi0KLQlwdWJsaWMgc3RhdGljIExpc3Q8UHJvY2Vzcz4gZ2V0QWxsUHJvY2Vzc2VzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJTGlzdDxQcm9jZXNzPiBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3M+KCk7Ci0JCWZvciAoTWV0aG9kUGFja2FnZSBwa2cgOiBwbHVnaW4uZ2V0TWV0aG9kUGFja2FnZXMoKSkgewotCQkJX2l0ZXJhdGVQYWNrYWdlRm9yUHJvY2Vzc2VzKHBrZywgcHJvY2Vzc2VzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0PFByb2Nlc3M+IGdldEFsbFByb2Nlc3NlcyhNZXRob2RQYWNrYWdlIHBrZykgewotCQlMaXN0PFByb2Nlc3M+ICBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3M+ICgpOwotCQlfaXRlcmF0ZVBhY2thZ2VGb3JQcm9jZXNzZXMocGtnLCBwcm9jZXNzZXMpOwotCi0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgX2l0ZXJhdGVQYWNrYWdlRm9yUHJvY2Vzc2VzKE1ldGhvZFBhY2thZ2UgcGtnLAotCQkJTGlzdCBwcm9jZXNzZXMpIHsKLQkJaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCVByb2Nlc3MgcCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgcGtnKS5nZXRQcm9jZXNzKCk7Ci0JCQlpZiAocCAhPSBudWxsICYmICFwcm9jZXNzZXMuY29udGFpbnMocCkpIHsKLQkJCQlwcm9jZXNzZXMuYWRkKHApOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJX2l0ZXJhdGVQYWNrYWdlRm9yUHJvY2Vzc2VzKChNZXRob2RQYWNrYWdlKSBpdC5uZXh0KCksIHByb2Nlc3Nlcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgZSBpcyBhIHN1YmVsZW1lbnQgb2YgcGFyZW50Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N1YmVsZW1lbnRPZihPYmplY3QgcGFyZW50LCBPYmplY3QgZSwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWlmIChwYXJlbnQgPT0gZSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCA9PSBlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKGlzU3ViZWxlbWVudE9mKGVsZW1lbnQsIGUsIGFkYXB0ZXJGYWN0b3J5KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjaGlsZAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N1cGVyRWxlbWVudE9mKE9iamVjdCBjaGlsZCwgT2JqZWN0IGUsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlpZiAoY2hpbGQgPT0gZSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBhZGFwdGVyLmdldENoaWxkcmVuKGUpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50ID09IGNoaWxkKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKGlzU3VwZXJFbGVtZW50T2YoY2hpbGQsIGVsZW1lbnQsIGFkYXB0ZXJGYWN0b3J5KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IHVud3JhcChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJZG8gewotCQkJCW9iaiA9ICgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VmFsdWUoKTsKLQkJCX0gd2hpbGUgKG9iaiBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDb21tYW5kV3JhcHBlcikgewotCQkJZG8gewotCQkJCW9iaiA9ICgoQ29tbWFuZFdyYXBwZXIpIG9iaikuZ2V0Q29tbWFuZCgpOwotCQkJfSB3aGlsZSAob2JqIGluc3RhbmNlb2YgQ29tbWFuZFdyYXBwZXIpOwotCQl9Ci0KLQkJcmV0dXJuIG9iajsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBib29sZWFuIHZhbHVlIGJhc2VkIG9uIHdoZXRoZXIgb2JqZWN0IGlzIHdyYXBwZXIgb2JqZWN0IG9yIG5vdAotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzV3JhcHBlZChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlciB8fCBvYmogaW5zdGFuY2VvZiBDb21tYW5kV3JhcHBlcikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tbWFuZCB1bndyYXAoQ29tbWFuZCBjbWQpIHsKLQkJd2hpbGUgKGNtZCBpbnN0YW5jZW9mIENvbW1hbmRXcmFwcGVyKSB7Ci0JCQljbWQgPSAoKENvbW1hbmRXcmFwcGVyKSBjbWQpLmdldENvbW1hbmQoKTsKLQkJfQotCi0JCXJldHVybiBjbWQ7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiA8Y29kZT5iYXNlPC9jb2RlPiBpcyB0aGUgYmFzZSBlbGVtZW50IG9mIGFueQotCSAqIGVsZW1lbnQgaW4gdGhlIGdpdmVuIGVsZW1lbnRzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHBhcmFtIGJhc2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQmFzZShMaXN0IGVsZW1lbnRzLCBPYmplY3QgYmFzZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCWlmIChiYXNlID09ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50KQotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByZXNlbnRhdGlvbk5hbWUoT2JqZWN0IGUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCWUgPSAoKENvbnRlbnREZXNjcmlwdGlvbikgZSkuZUNvbnRhaW5lcigpOwotCQl9Ci0KLQkJaWYgKGUgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCWlmIChlIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQluYW1lID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIGUpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJfQotCi0JCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBTdHJVdGlsLmlzQmxhbmsobmFtZSkpIHsKLQkJCW5hbWUgPSAoKE1ldGhvZEVsZW1lbnQpIGUpLmdldE5hbWUoKTsKLQkJfQotCi0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJvY2VzcyBnZXRPd25pbmdQcm9jZXNzKEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlFT2JqZWN0IGNvbnRhaW5lcjsKLQkJZm9yIChjb250YWluZXIgPSBlLmVDb250YWluZXIoKTsgY29udGFpbmVyICE9IG51bGwKLQkJCQkmJiAhKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpOyBjb250YWluZXIgPSBjb250YWluZXIKLQkJCQkuZUNvbnRhaW5lcigpKQotCQkJOwotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCXJldHVybiAoKFByb2Nlc3NDb21wb25lbnQpIGNvbnRhaW5lcikuZ2V0UHJvY2VzcygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFByb2Nlc3MgZ2V0T3duaW5nUHJvY2VzcyhCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCU9iamVjdCB0b3AgPSB3cmFwcGVyLmdldFRvcEl0ZW0oKTsKLQkJaWYodG9wIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJUHJvY2VzcyBwcm9jID0gKFByb2Nlc3MpIHRvcDsKLQkJCWlmKHByb2MuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCXJldHVybiBwcm9jOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFByb2Nlc3MgZ2V0T3duaW5nUHJvY2VzcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KW9iamVjdCk7Ci0JCX0KLQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuIGdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKW9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhblJlZmVyZW5jZShNZXRob2RFbGVtZW50IHNvdXJjZSwKLQkJCU1ldGhvZEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCU1ldGhvZFBsdWdpbiB0YXJnZXRQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbih0YXJnZXQpOwotCQlNZXRob2RQbHVnaW4gc291cmNlUGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oc291cmNlKTsKLQkJaWYgKHNvdXJjZVBsdWdpbiA9PSB0YXJnZXRQbHVnaW4pCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIE1pc2MuaXNCYXNlT2YodGFyZ2V0UGx1Z2luLCBzb3VyY2VQbHVnaW4pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT3JkZXJJbmZvIGdldE9yZGVySW5mbyhNZXRob2RFbGVtZW50IGUsIFN0cmluZyBvcmRlckluZm9OYW1lKSB7Ci0JCVN0cmluZyBzdHIgPSBlLmdldE9yZGVyaW5nR3VpZGUoKTsKLQkJaWYgKHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCVJlc291cmNlIHJlcyA9IG5ldyBTdHJpbmdSZXNvdXJjZShzdHIpOwotCQl0cnkgewotCQkJcmVzLmxvYWQobnVsbCk7Ci0JCQlpZiAocmVzLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKQotCQkJCXJldHVybiBudWxsOwotCQkJT3JkZXJJbmZvQ29sbGVjdGlvbiBvcmRlckluZm9zID0gKE9yZGVySW5mb0NvbGxlY3Rpb24pIHJlcwotCQkJCQkuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvcmRlckluZm9zLmdldE9yZGVySW5mb3MoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT3JkZXJJbmZvIG9yZGVySW5mbyA9IChPcmRlckluZm8pIGl0ZXIubmV4dCgpOwotCQkJCWlmIChvcmRlckluZm9OYW1lLmVxdWFsc0lnbm9yZUNhc2Uob3JkZXJJbmZvLmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuIG9yZGVySW5mbzsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvdmlkZXIKLQkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hDb250cmlidXRvcnMoSUNoYW5nZU5vdGlmaWVyIG5vdGlmaWVyLAotCQkJTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwgYm9vbGVhbiBjb250ZW50UmVmcmVzaCwKLQkJCWJvb2xlYW4gbGFiZWxVcGRhdGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Q29udHJpYnV0b3JzKChWYXJpYWJpbGl0eUVsZW1lbnQpIG5vdGlmaWNhdGlvbgotCQkJCS5nZXROb3RpZmllcigpKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJbm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCWVsZW1lbnQsIGNvbnRlbnRSZWZyZXNoLCBsYWJlbFVwZGF0ZSkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFVzZWQgdG8gcmVmcmVzaCBwbHVnaW5zIHRoYXQgZXh0ZW5kIGFub3RoZXIKLQkgKiBAcGFyYW0gbm90aWZpZXIKLQkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCi0JICogQHBhcmFtIGNvbnRlbnRSZWZyZXNoCi0JICogQHBhcmFtIGxhYmVsVXBkYXRlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hQbHVnaW5FeHRlbmRlcnMoSUNoYW5nZU5vdGlmaWVyIG5vdGlmaWVyLAotCQkJTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwgYm9vbGVhbiBjb250ZW50UmVmcmVzaCwKLQkJCWJvb2xlYW4gbGFiZWxVcGRhdGUpIHsKLQkJT2JqZWN0IG9iaiA9IG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRQbHVnaW5EaXJlY3RFeHRlbnNpb25zKAotCQkJCQkoKE1ldGhvZFBsdWdpbikgb2JqKSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlub3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCWVsZW1lbnQsIGNvbnRlbnRSZWZyZXNoLCBsYWJlbFVwZGF0ZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0NvbnRyaWJ1dG9yKFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JCXJldHVybiBoYXNHZW5lcmFsaXplcihlLCBDb2xsZWN0aW9ucwotCQkJCS5zaW5nbGV0b24oVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0dlbmVyYWxpemVyKFZhcmlhYmlsaXR5RWxlbWVudCBlLAotCQkJQ29sbGVjdGlvbiB2YXJpYWJpbGl0eVR5cGVzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoZSkKLQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAodmFyaWFiaWxpdHlUeXBlcy5jb250YWlucyhlbGVtZW50LmdldFZhcmlhYmlsaXR5VHlwZSgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGdldEltbWVkaWF0ZVZhcmlldGllcyhWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbSwgVmFyaWFiaWxpdHlUeXBlIHR5cGUpIHsKLQkJTGlzdCBzZWxlY3RlZFZlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBhbGxWZXMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoZWxlbSk7Ci0JCWZvciAoaW50IGk9MDsgaTxhbGxWZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGFsbFZlcy5nZXQoaSk7Ci0JCQlpZiAodHlwZSA9PSB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSkgewotCQkJCXNlbGVjdGVkVmVzLmFkZCh2ZSk7Ci0JCQl9CQkJCi0JCX0KLQkJcmV0dXJuIHNlbGVjdGVkVmVzLml0ZXJhdG9yKCk7Ci0JfQotCQkKLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGdldEdlbmVyYWxpemVycyhWYXJpYWJpbGl0eUVsZW1lbnQgZSwKLQkJCWZpbmFsIFZhcmlhYmlsaXR5VHlwZSB0eXBlKSB7Ci0JCXJldHVybiBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZSwgZmFsc2UpIHsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzOTc4MTQ1NDM5NDQ5Mjk4NDgzTDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJLmdldEltbWVkaWF0ZVZhcmlldGllcygoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0ZXJhdG9yCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJaWYgKCh0eXBlID09IG51bGwpIHx8IGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gdHlwZSkgewotCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJfQotCi0JCX07Ci0JfQotCi0JLyoqCi0JICogZ2V0IGdlZW5yYWxpemVycyBvZiBhbGwgdHlwZXMsIHJlY3Vyc2l2ZWx5Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvciBnZXRHZW5lcmFsaXplcnMoVmFyaWFiaWxpdHlFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGdldEdlbmVyYWxpemVycyhlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGdldENvbnRyaWJ1dG9ycyhWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlyZXR1cm4gZ2V0R2VuZXJhbGl6ZXJzKGUsIFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJdGVtUHJvdmlkZXJBZGFwdGVyIGdldEFkYXB0ZXIoTWV0aG9kUGx1Z2luIHBsdWdpbiwKLQkJCVN0cmluZ1tdIHBhdGgpIHsKLQkJSUdyb3VwQ29udGFpbmVyIGdyb3VwcyA9IChJR3JvdXBDb250YWluZXIpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KHBsdWdpbiwKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgcGF0aC5sZW5ndGggLSAxOyBpKyspIHsKLQkJCWdyb3VwcyA9IChJR3JvdXBDb250YWluZXIpIGdyb3Vwcy5nZXRHcm91cEl0ZW1Qcm92aWRlcihwYXRoW2ldKTsKLQkJCWlmIChncm91cHMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGdyb3Vwcy5nZXRHcm91cEl0ZW1Qcm92aWRlcihwYXRoW2ldKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlZnJlc2hBZGFwdGVyKE1ldGhvZFBsdWdpbiBwbHVnaW4sIFN0cmluZ1tdIHBhdGgsCi0JCQlOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJYWRhcHRlci5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG1zZywgYWRhcHRlciwKLQkJCQkJdHJ1ZSwgZmFsc2UpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoQWRhcHRlcihTdHJpbmdbXSBwYXRoLCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCUVPYmplY3QgZU9iaiA9IG51bGw7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCWVPYmogPSAoRU9iamVjdCkgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQllT2JqID0gKEVPYmplY3QpIG5ldyBBcnJheUxpc3QoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0TmV3VmFsdWUoKSkuZ2V0KDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCWVPYmogPSAoRU9iamVjdCkgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQllT2JqID0gKEVPYmplY3QpIG5ldyBBcnJheUxpc3QoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0T2xkVmFsdWUoKSkuZ2V0KDApOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGVPYmogIT0gbnVsbCkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVPYmopOwotCQkJVG5nVXRpbC5yZWZyZXNoQWRhcHRlcihwbHVnaW4sIHBhdGgsIG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFVuY2F0ZWdvcml6ZWRUYXNrc0l0ZW1Qcm92aWRlcigKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4sIE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJLy8gcmVmcmVzaCB0aGUgdW5jYXRlZ29yaXplZCB0YXNrcyBncm91cAotCQkvLwotCi0JCXJlZnJlc2hBZGFwdGVyKHBsdWdpbiwgTGlicmFyeUVkaXRDb25zdGFudHMuVU5DQVRFR09SSVpFRF9UQVNLU19QQVRILAotCQkJCW1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hEb21haW5VbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVyKAotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiwgTm90aWZpY2F0aW9uIG1zZykgewotCQlyZWZyZXNoQWRhcHRlcihwbHVnaW4sCi0JCQkJTGlicmFyeUVkaXRDb25zdGFudHMuVU5DQVRFR09SSVpFRF9ET01BSU5fV09SS1BST0RVQ1RTX1BBVEgsCi0JCQkJbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFdvcmtQcm9kdWN0VHlwZVVuY2F0ZWdvcml6ZWQoTWV0aG9kUGx1Z2luIHBsdWdpbiwKLQkJCU5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJcmVmcmVzaEFkYXB0ZXIoCi0JCQkJcGx1Z2luLAotCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLlVOQ0FURUdPUklaRURfV09SS1BST0RVQ1RUWVBFX1dPUktQUk9EVUNUU19QQVRILAotCQkJCW1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVycygKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4sIE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJcmVmcmVzaERvbWFpblVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdHNJdGVtUHJvdmlkZXIocGx1Z2luLCBtc2cpOwotCQlyZWZyZXNoV29ya1Byb2R1Y3RUeXBlVW5jYXRlZ29yaXplZChwbHVnaW4sIG1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hVbmNhdGVnb3JpemVkUm9sZXNJdGVtUHJvdmlkZXIoCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luLCBOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXJlZnJlc2hBZGFwdGVyKHBsdWdpbiwgTGlicmFyeUVkaXRDb25zdGFudHMuVU5DQVRFR09SSVpFRF9ST0xFU19QQVRILAotCQkJCW1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hVbmNhdGVnb3JpemVkVG9vbE1lbnRvcnNJdGVtUHJvdmlkZXIoCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luLCBOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXJlZnJlc2hBZGFwdGVyKHBsdWdpbiwKLQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5VTkNBVEVHT1JJWkVEX1RPT0xNRU5UT1JTX1BBVEgsIG1zZyk7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVXcmFwcGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlpZiAoRmVhdHVyZU1hcFV0aWwuaXNGZWF0dXJlTWFwKGZlYXR1cmUpKSB7Ci0JCQl2YWx1ZSA9IG5ldyBGZWF0dXJlTWFwRW50cnlXcmFwcGVySXRlbVByb3ZpZGVyKAotCQkJCQkoRmVhdHVyZU1hcC5FbnRyeSkgdmFsdWUsIG9iamVjdCwgKEVBdHRyaWJ1dGUpIGZlYXR1cmUsCi0JCQkJCWluZGV4LCBhZGFwdGVyRmFjdG9yeSwgbnVsbCk7Ci0JCX0gZWxzZSBpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpIHsKLQkJCXZhbHVlID0gbmV3IEF0dHJpYnV0ZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcih2YWx1ZSwgb2JqZWN0LAotCQkJCQkoRUF0dHJpYnV0ZSkgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5LCBudWxsKTsKLQkJfSBlbHNlIGlmICghKChFUmVmZXJlbmNlKSBmZWF0dXJlKS5pc0NvbnRhaW5tZW50KCkpIHsKLQkJCXZhbHVlID0gbmV3IEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIoZmVhdHVyZSwgdmFsdWUsIG9iamVjdCwKLQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldE5hdmlnYXRvclBhcmVudEl0ZW1Qcm92aWRlcihHdWlkYW5jZSBndWlkYW5jZSkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9IGd1aWRhbmNlLmVDb250YWluZXIoKTsKLQkJaWYgKCEoY29udGFpbmVyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCS5nZXRBZGFwdGVyKGNvbnRhaW5lciwgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlyZXR1cm4gaXRlbVByb3ZpZGVyICE9IG51bGwgPyBpdGVtUHJvdmlkZXIuZ2V0R3VpZGFuY2VzKCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldE5hdmlnYXRvclBhcmVudEl0ZW1Qcm92aWRlcihXb3JrUHJvZHVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCBjb250ZW50UGtnID0gb2JqZWN0LmVDb250YWluZXIoKTsKLQkJaWYgKGNvbnRlbnRQa2cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkuZ2V0QWRhcHRlcihjb250ZW50UGtnLCBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXJldHVybiBpdGVtUHJvdmlkZXIgIT0gbnVsbCA/IGl0ZW1Qcm92aWRlci5nZXRXb3JrUHJvZHVjdHMoKSA6IG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJT2JqZWN0IGFkYXB0ZXIgPSBudWxsOwotCQl0cnkgewotCQkJYWRhcHRlciA9IHVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iamVjdCwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUl0ZW1MYWJlbFByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuICgoSUl0ZW1MYWJlbFByb3ZpZGVyKSBhZGFwdGVyKS5nZXRJbWFnZShvYmplY3QpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYoYWRhcHRlciAhPSBvYmplY3QgJiYgYWRhcHRlciBpbnN0YW5jZW9mIElEaXNwb3NhYmxlKSB7Ci0JCQkJKChJRGlzcG9zYWJsZSlhZGFwdGVyKS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGNvbE5hbWUpIHsKLQkJLy8gaWYoY29sTmFtZSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUpCi0JCS8vIGlmKGNvbE5hbWUgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FKQotCQlpZiAoY29sTmFtZSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FKSB7Ci0JCQlyZXR1cm4gZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGVsZW1lbnQgdXAgd2l0aGluZyB0aGUgcGFyZW50Ci0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGVsZW1lbnRPYmoKLQkgKiBAcGFyYW0gZUNsYXNzZXMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1vdmVVcChBY3Rpdml0eSBhY3Rpdml0eSwgT2JqZWN0IGVsZW1lbnRPYmosCi0JCQlDb2xsZWN0aW9uIGVDbGFzc2VzLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJTW92ZVVwQ29tbWFuZCBjbWQgPSBuZXcgTW92ZVVwQ29tbWFuZChhY3Rpdml0eSwgZWxlbWVudE9iaiwgZUNsYXNzZXMpOwotCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCX0KLQotCS8qKgotCSAqIE1vdmUgZWxlbWVudCBkb3duIHdpdGhpbiB0aGUgcGFyZW50Ci0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGVsZW1lbnRPYmoKLQkgKiBAcGFyYW0gZUNsYXNzZXMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1vdmVEb3duKEFjdGl2aXR5IGFjdGl2aXR5LCBPYmplY3QgZWxlbWVudE9iaiwKLQkJCUNvbGxlY3Rpb24gZUNsYXNzZXMsIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlNb3ZlRG93bkNvbW1hbmQgY21kID0gbmV3IE1vdmVEb3duQ29tbWFuZChhY3Rpdml0eSwgZWxlbWVudE9iaiwKLQkJCQllQ2xhc3Nlcyk7Ci0JCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDdXN0b21DYXRlZ29yeSBjcmVhdGVSb290Q3VzdG9tQ2F0ZWdvcnkoCi0JCQlDb250ZW50UGFja2FnZSBjdXN0b21DYXRlZ29yeVBrZykgewotCQkvLyBjcmVhdGUgcm9vdCBjdXN0b20gY2F0ZWdvcnkKLQkJLy8KLQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdEN1c3RvbUNhdGVnb3J5ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKTsKLQkJcm9vdEN1c3RvbUNhdGVnb3J5LnNldE5hbWUoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJQ29udGVudFBhY2thZ2UgaGlkZGVuUGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoY3VzdG9tQ2F0ZWdvcnlQa2cKLQkJCQkuZ2V0Q2hpbGRQYWNrYWdlcygpLCBNb2RlbFN0cnVjdHVyZS5ISURERU5fUEFDS0FHRV9OQU1FKTsKLQkJaWYgKGhpZGRlblBrZyA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgaGlkZGVuIHBhY2thZ2UgdG8gc3RvcmUgdGhlIHJvb3QgY3VzdG9tIGNhdGVnb3J5Ci0JCQkvLwotCQkJaGlkZGVuUGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudFBhY2thZ2UoKTsKLQkJCWhpZGRlblBrZy5zZXROYW1lKE1vZGVsU3RydWN0dXJlLkhJRERFTl9QQUNLQUdFX05BTUUpOwotCQkJY3VzdG9tQ2F0ZWdvcnlQa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChoaWRkZW5Qa2cpOwotCQl9Ci0JCWhpZGRlblBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQocm9vdEN1c3RvbUNhdGVnb3J5KTsKLQotCQlyZXR1cm4gcm9vdEN1c3RvbUNhdGVnb3J5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ3VzdG9tQ2F0ZWdvcnkgZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJQ29udGVudFBhY2thZ2UgY3VzdG9tQ2F0ZWdvcnlQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgpOwotCQlpZiAoY3VzdG9tQ2F0ZWdvcnlQa2cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDb250ZW50UGFja2FnZSBoaWRkZW5Qa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShjdXN0b21DYXRlZ29yeVBrZwotCQkJCS5nZXRDaGlsZFBhY2thZ2VzKCksIE1vZGVsU3RydWN0dXJlLkhJRERFTl9QQUNLQUdFX05BTUUpOwotCQlpZiAoaGlkZGVuUGtnICE9IG51bGwgJiYgIWhpZGRlblBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiAoQ3VzdG9tQ2F0ZWdvcnkpIGhpZGRlblBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5nZXQoMCk7Ci0JCX0KLQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdCA9IGNyZWF0ZVJvb3RDdXN0b21DYXRlZ29yeShjdXN0b21DYXRlZ29yeVBrZyk7Ci0JCS8vIGNvZGUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6IGFkZCBhbGwgdGhlIGN1c3RvbSBjYXRlZ29yaWVzIHVuZGVyCi0JCS8vIGN1c3RvbUNhdGVnb3J5UGtnCi0JCS8vIHRvIHRoZSBjb250ZW50IGVsZW1lbnQgcmVmZXJlbmNlIGxpc3Qgb2YgdGhlIHJvb3QgY3VzdG9tIGNhdGVnb3J5IHNvCi0JCS8vIHRoZXkgY2FuIGJlIHZpc2libGUKLQkJLy8gaW4gdGhlIG5ldyBVSQotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjdXN0b21DYXRlZ29yeVBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJcm9vdC5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuYWRkKChEZXNjcmliYWJsZUVsZW1lbnQpIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByb290OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Jvb3RDdXN0b21DYXRlZ29yeShDdXN0b21DYXRlZ29yeSBjYXRlZ29yeSkgewotCQlFT2JqZWN0IHBrZyA9IGNhdGVnb3J5LmVDb250YWluZXIoKTsKLQkJaWYgKHBrZyBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlCi0JCQkJJiYgTW9kZWxTdHJ1Y3R1cmUuSElEREVOX1BBQ0tBR0VfTkFNRQotCQkJCQkJLmVxdWFscygoKENvbnRlbnRQYWNrYWdlKSBwa2cpLmdldE5hbWUoKSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSb290Q3V0b21DYXRlZ29yeVBhY2thZ2UoTWV0aG9kUGFja2FnZSBwa2cpIHsKLQkJaWYgKCAhKHBrZyBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB8fAotCQkJCSFNb2RlbFN0cnVjdHVyZS5ISURERU5fUEFDS0FHRV9OQU1FCi0JCQkJCQkuZXF1YWxzKHBrZy5nZXROYW1lKCkpICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQkvLyBjaGVjayB0aGUgcGx1Z2luIGFuZCBtYWtlIHN1cmUgaXQncyB0aGUgb2JqZWN0LCBUT0RPCi0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogU2F2ZXMgcmVzb3VyY2Ugb2YgdGhlIGdpdmVuIGVsZW1lbnQncyBjb250YWluZXIgaWYgdGhpcyBoYXMgYmVlbiBtb2RpZmllZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVDb250YWluZXJSZXNvdXJjZShFT2JqZWN0IGVsZW1lbnQsCi0JCQlJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIpIHsKLQkJLy8gc2F2ZSBjb250YWluZXIncyByZXNvdXJjZQotCQlpZiAoZWxlbWVudC5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlbGVtZW50LmVDb250YWluZXIoKS5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmlzTW9kaWZpZWQoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyBDb250ZW50Q2F0ZWdvcnkgZmluZENvbnRyaWJ1dG9yKENvbnRlbnRQYWNrYWdlIGNhdGVnb3J5UGtnLAotCQkJQ29udGVudENhdGVnb3J5IGJhc2VDYXRlZ29yeSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjYXRlZ29yeVBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYXQgPSAoQ29udGVudENhdGVnb3J5KSBpdGVyLm5leHQoKTsKLQkJCWlmIChjYXQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IGJhc2VDYXRlZ29yeSkgewotCQkJCXJldHVybiBjYXQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW1wdHkoQ29udGVudENhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCWlmICghY2F0ZWdvcnkuZ2V0Q29uY2VwdHNBbmRQYXBlcnMoKS5pc0VtcHR5KCkKLQkJCQl8fCAhY2F0ZWdvcnkuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoY2F0ZWdvcnkgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQlyZXR1cm4gKChEaXNjaXBsaW5lKSBjYXRlZ29yeSkuZ2V0VGFza3MoKS5pc0VtcHR5KCk7Ci0JCX0gZWxzZSBpZiAoY2F0ZWdvcnkgaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCXJldHVybiAoKERvbWFpbikgY2F0ZWdvcnkpLmdldFdvcmtQcm9kdWN0cygpLmlzRW1wdHkoKTsKLQkJfSBlbHNlIGlmIChjYXRlZ29yeSBpbnN0YW5jZW9mIFJvbGVTZXQpIHsKLQkJCXJldHVybiAoKFJvbGVTZXQpIGNhdGVnb3J5KS5nZXRSb2xlcygpLmlzRW1wdHkoKTsKLQkJfSBlbHNlIGlmIChjYXRlZ29yeSBpbnN0YW5jZW9mIFRvb2wpIHsKLQkJCXJldHVybiAoKFRvb2wpIGNhdGVnb3J5KS5nZXRUb29sTWVudG9ycygpLmlzRW1wdHkoKTsKLQkJfSBlbHNlIGlmIChjYXRlZ29yeSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkgewotCQkJcmV0dXJuICgoV29ya1Byb2R1Y3RUeXBlKSBjYXRlZ29yeSkuZ2V0V29ya1Byb2R1Y3RzKCkuaXNFbXB0eSgpOwotCQl9IGVsc2UgaWYgKGNhdGVnb3J5IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCUN1c3RvbUNhdGVnb3J5IHVzZXJEZWZpbmVkQ2F0ZWdvcnkgPSAoKEN1c3RvbUNhdGVnb3J5KSBjYXRlZ29yeSk7Ci0JCQlyZXR1cm4gdXNlckRlZmluZWRDYXRlZ29yeS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuaXNFbXB0eSgpCi0JCQkvLyAmJiB1c2VyRGVmaW5lZENhdGVnb3J5LmdldFN1YkNhdGVnb3JpZXMoKS5pc0VtcHR5KCkKLQkJCTsKLQkJfQotCi0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gY2F0ZWdvcnk6ICIgKyBjYXRlZ29yeSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb3JkZXIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFRvUGFja2FnZShXb3JrT3JkZXIgb3JkZXIsIEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOwotCQlpZihjb250YWluZXIgIT0gbnVsbCkgewotCQkJKChQcm9jZXNzUGFja2FnZSkgY29udGFpbmVyKS5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQob3JkZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9yZGVyCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVGcm9tUGFja2FnZShXb3JrT3JkZXIgb3JkZXIsIEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOwotCQlpZihjb250YWluZXIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJKChQcm9jZXNzUGFja2FnZSkgY29udGFpbmVyKS5nZXRQcm9jZXNzRWxlbWVudHMoKS5yZW1vdmUob3JkZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhbmRsZVByZWRlY2Vzc29yTGlzdENoYW5nZSgKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciwgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19MSU5LX1RPX1BSRURFQ0VTU09SOgotCQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlhZGRUb1BhY2thZ2UoKFdvcmtPcmRlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCksCi0JCQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uCi0JCQkJCQkJLmdldE5ld1ZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJYWRkVG9QYWNrYWdlKChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpLAotCQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJcmVtb3ZlRnJvbVBhY2thZ2UoKFdvcmtPcmRlcikgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCksCi0JCQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uCi0JCQkJCQkJLmdldE9sZFZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJcmVtb3ZlRnJvbVBhY2thZ2UoKFdvcmtPcmRlcikgaXRlci5uZXh0KCksCi0JCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0KLQkJCQl9Ci0KLQkJCQlhZGFwdGVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHJldHVybiBhbGwgdGhlIGdsb2JhbCBwYWNrYWdlcyBmb3IgdGhlIG1ldGhvZCBwbHVnaW4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBNZXRob2RQbHVnaW4KLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIGdsb2JhbCBwYWNrYWdlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxDb250ZW50UGFja2FnZT4gZ2V0R2xvYmFsUGFja2FnZXMoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlBcnJheUxpc3Q8Q29udGVudFBhY2thZ2U+IHBhY2thZ2VzID0gbmV3IEFycmF5TGlzdDxDb250ZW50UGFja2FnZT4oKTsKLQkJU3RyaW5nW11bXSBjYXRlZ29yeVBhdGhzID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5nZXRDYXRlZ29yeVBhdGhzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcnlQYXRocy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gcGF0aCA9IGNhdGVnb3J5UGF0aHNbaV07Ci0JCQlDb250ZW50UGFja2FnZSBjYXRlZ29yeVBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJcGF0aCk7Ci0JCQlpZiAoY2F0ZWdvcnlQa2cgIT0gbnVsbCkgewotCQkJCXBhY2thZ2VzLmFkZChjYXRlZ29yeVBrZyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcGFja2FnZXM7Ci0JfQotCi0JCi0JLyoqCi0JICogcmV0dXJuIGFsbCB0aGUgY29udGVudCBjYXRlZ29yeSBwYWNrYWdlcyBmb3IgdGhlIG1ldGhvZCBwbHVnaW4uIAotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIE1ldGhvZFBsdWdpbgotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2YgZ2xvYmFsIHBhY2thZ2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PENvbnRlbnRQYWNrYWdlPiBnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCXJldHVybiBnZXRHbG9iYWxQYWNrYWdlcyhwbHVnaW4pOwotCX0KLQkKLQkKLQkvKioKLQkgKiByZXR1cm4gYWxsIHRoZSBzeXN0ZW0gZGVmaW5lZCBwYWNrYWdlcyBmb3IgdGhlIG1ldGhvZCBwbHVnaW4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBNZXRob2RQbHVnaW4KLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIGFsbCBzeXN0ZW0gcGFja2FnZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsU3lzdGVtUGFja2FnZXMoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlBcnJheUxpc3QgcGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZ1tdW10gcGF0aHMgPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmdldEFsbFN5c3RlbVBhdGhzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZ1tdIHBhdGggPSBwYXRoc1tpXTsKLQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sIHBhdGgpOwotCQkJaWYgKHBrZyAhPSBudWxsICYmICFwYWNrYWdlcy5jb250YWlucyhwa2cpKSB7Ci0JCQkJcGFja2FnZXMuYWRkKHBrZyk7Ci0JCQkJRU9iamVjdCBvID0gcGtnLmVDb250YWluZXIoKTsKLQkJCQl3aGlsZSAoKG8gaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSAmJiAhcGFja2FnZXMuY29udGFpbnMobykpIHsKLQkJCQkJcGFja2FnZXMuYWRkKG8pOwotCQkJCQlvID0gby5lQ29udGFpbmVyKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gYWxzbyBhZGQgdGhlIGhpZGRlbiBjb3N0b20gY2F0ZWdvcnkgcGFja2FnZQotCQlDb250ZW50UGFja2FnZSBjdXN0b21DYXRlZ29yeVBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JCWlmIChjdXN0b21DYXRlZ29yeVBrZyAhPSBudWxsKSB7Ci0JCQlDb250ZW50UGFja2FnZSBoaWRkZW5Qa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSgKLQkJCQkJY3VzdG9tQ2F0ZWdvcnlQa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ISURERU5fUEFDS0FHRV9OQU1FKTsKLQkJCWlmIChoaWRkZW5Qa2cgIT0gbnVsbCkgewotCQkJCXBhY2thZ2VzLmFkZChoaWRkZW5Qa2cpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHBhY2thZ2VzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ByZWRlZmluZWQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkKLQkJCQkmJiBpc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIGUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCVN0cmluZyBwYXRoID0gTW9kZWxTdHJ1Y3R1cmUKLQkJCQkudG9GaWxlUGF0aChNaXNjLmdldFBhdGhSZWxhdGl2ZVRvUGx1Z2luKGUpKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gTW9kZWxTdHJ1Y3R1cmUuQUxMX1BSRURFRklORURfUEFUSFMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgcHJlZGVmaW5lUGF0aCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJaWYgKHByZWRlZmluZVBhdGguc3RhcnRzV2l0aChwYXRoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGFja2FnZSBnZXRNZXRob2RQYWNrYWdlKEVPYmplY3QgZSkgewotCQlmb3IgKDsgIShlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgJiYgZSAhPSBudWxsOyBlID0gZS5lQ29udGFpbmVyKCkpCi0JCQk7Ci0JCXJldHVybiAoTWV0aG9kUGFja2FnZSkgZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBNZXRob2RQYWNrYWdlIGdldFBhcmVudE1ldGhvZFBhY2thZ2UoRU9iamVjdCBlKSB7Ci0JCUVPYmplY3QgZW9iaiA9IGU7Ci0JCXdoaWxlKGVvYmogIT0gbnVsbCkgewotCQkJZW9iaiA9IGVvYmouZUNvbnRhaW5lcigpOwotCQkJaWYgKGVvYmogPT0gbnVsbCApIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gZWxzZSBpZiAoZW9iaiBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQlyZXR1cm4gKE1ldGhvZFBhY2thZ2UpIGVvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICBudWxsOwotCX0KLQotCS8qKgotCSAqIHZhbGlkYXRlIHRoZSBjb25maWd1cmF0aW9uIGJ5IGZvcmNpbmcgdG8gc2VsZWN0IHRoZSBnbG9iYWwgcGFja2FnZXMgb2YKLQkgKiB0aGUgc2VsZWN0ZWQgbWV0aG9kIHBsdWdpbnMsIHRoaXMgaXMgbmVlZGVkIGZvciBjb25maWd1cmF0aW9uIGV4cG9ydGluZy4KLQkgKiBJZiBnbG9iYWwgcGFja2FnZXMgYXJlIG1pc3NpbmcsIHRoZSBleHBvcnRlZCBjb25maWd1cmF0aW9uIGlzIG5vdCB2YWxpZAotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb25NZ3IgaWYgbm90IG51bGwsIHdpbGwgdXNlIHRoZSBnaXZlbiBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24sIG90aGVyd2lzZSBjb25maWd1cmF0aW9uIHdpbGwgYmUgY2hhbmdlZCBkaXJlY3RseQotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTGlzdCBwbHVnaW5zID0gbmV3IEFycmF5TGlzdChjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkpOwotCQlMaXN0IHBrZ1NlbHMgPSBuZXcgQXJyYXlMaXN0KGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkpOwotCQlMaXN0PE1ldGhvZFBsdWdpbj4gcGx1Z2luc1RvQWRkID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0JCUxpc3Q8TWV0aG9kUGFja2FnZT4gcGFja2FnZXNUb0FkZCA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGFja2FnZT4oKTsKLQotCQkvLyBtYWtlIHN1cmUgYWxsIHJlcXVpcmVkIHBhY2thZ2VzIGFyZSBzZWxlY3RlZC4KLQkJLy8gaWYgYSBwYWNrYWdlIGlzIHNlbGVjdGVkLCBhbGwgdGhlIHBhcmVudCBwYWNrYWdlcyBtdXN0IGJlIHNlbGVjdGVkLgotCQlmb3IgKCBJdGVyYXRvciBpdCA9IG5ldyBBcnJheUxpc3QocGtnU2VscykuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gKE1ldGhvZFBhY2thZ2UpaXQubmV4dCgpOwotCQkJRU9iamVjdCBjID0gcGtnLmVDb250YWluZXIoKTsKLQkJCXdoaWxlICggKChjIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgfHwgKGMgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSAKLQkJCQkJJiYgIXBrZ1NlbHMuY29udGFpbnMoYykgJiYgIXBsdWdpbnMuY29udGFpbnMoYykgKSB7Ci0JCQkJaWYgKGMgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJcGx1Z2lucy5hZGQoYyk7Ci0JCQkJCXBsdWdpbnNUb0FkZC5hZGQoKE1ldGhvZFBsdWdpbiljKTsKLQkJCQl9IGVsc2UgewotCQkJCQlwa2dTZWxzLmFkZChjKTsKLQkJCQkJcGFja2FnZXNUb0FkZC5hZGQoKE1ldGhvZFBhY2thZ2UpYyk7Ci0JCQkJfQotCQkJCQotCQkJCWMgPSBjLmVDb250YWluZXIoKTsKLQkJCX0JCi0JCQkKLQkJCS8vIGlmIHRoZSBwYWNrYWdlIGlzIGEgUHJvY2Vzc0NvbXBvbmVudCwgc2VsZWN0IGFsbCB0aGUgY2hpbGQgcGFja2FnZXMKLQkJCWlmICggcGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCApIHsKLQkJCQlMaXN0IG9sZFBrZ1NlbHMgPSBuZXcgQXJyYXlMaXN0KHBrZ1NlbHMpOwotCQkJCWdldEFsbENoaWxkUGFja2FnZXMocGtnLCBwa2dTZWxzKTsKLQkJCQlwa2dTZWxzLnJlbW92ZUFsbChvbGRQa2dTZWxzKTsKLQkJCQlwYWNrYWdlc1RvQWRkLmFkZEFsbChwa2dTZWxzKTsKLQkJCX0KLQkJfQotCQlDb25maWd1cmF0aW9uVXRpbC5hZGRDb2xsVG9NZXRob2RQbHVnaW5MaXN0KGFjdGlvbk1nciwgY29uZmlnLCBwbHVnaW5zVG9BZGQpOwotCQlDb25maWd1cmF0aW9uVXRpbC5hZGRDb2xsVG9NZXRob2RQYWNrYWdlTGlzdChhY3Rpb25NZ3IsIGNvbmZpZywgcGFja2FnZXNUb0FkZCk7Ci0JCXBrZ1NlbHMgPSBuZXcgQXJyYXlMaXN0KGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkpOwotCi0JCS8vIG1ha2Ugc3VyZSBhbGwgc3lzdGVtIHBhY2thZ2VzIGFyZSBzZWxlY3RlZAotCQlMaXN0PE1ldGhvZFBhY2thZ2U+IHN5c1BhY2thZ2VzVG9BZGQgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBhY2thZ2U+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRwID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdHAuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0cC5uZXh0KCk7Ci0JCQlMaXN0IHBrZ3MgPSBUbmdVdGlsLmdldEFsbFN5c3RlbVBhY2thZ2VzKHBsdWdpbik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGtncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IHBrZyA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoIXBrZ1NlbHMuY29udGFpbnMocGtnKSAmJiBwa2cgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCXBrZ1NlbHMuYWRkKHBrZyk7Ci0JCQkJCXN5c1BhY2thZ2VzVG9BZGQuYWRkKChNZXRob2RQYWNrYWdlKXBrZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUNvbmZpZ3VyYXRpb25VdGlsLmFkZENvbGxUb01ldGhvZFBhY2thZ2VMaXN0KGFjdGlvbk1nciwgY29uZmlnLCBzeXNQYWNrYWdlc1RvQWRkKTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGFsbCBjaGlsZCBwYWNrYWdlcyBvZiB0aGUgZ2l2ZW4gTWV0aG9kUGFja2FnZSBhbmQgYWRkIHRvIHRoZSBsaXN0Ci0JICogQHBhcmFtIHBrZyBNZXRob2RQYWNrYWdlCi0JICogQHBhcmFtIHJlc3VsdCBMaXN0IHRoZSBwYWNrYWdlcyBmb3VuZAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0QWxsQ2hpbGRQYWNrYWdlcyhNZXRob2RQYWNrYWdlIHBrZywgTGlzdCByZXN1bHQpIHsKLQkJTGlzdCBwa2dzID0gcGtnLmdldENoaWxkUGFja2FnZXMoKTsKLQkJCi0JCS8vIG9ubHkgYWRkIHVuaXF1ZSBpdGVtcwotCQlmb3IgKCBJdGVyYXRvciBpdCA9IHBrZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU9iamVjdCBwID0gaXQubmV4dCgpOwotCQkJaWYgKCAhcmVzdWx0LmNvbnRhaW5zKHApICkgewotCQkJCXJlc3VsdC5hZGQocCk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGtncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlnZXRBbGxDaGlsZFBhY2thZ2VzKChNZXRob2RQYWNrYWdlKSBpdC5uZXh0KCksIHJlc3VsdCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gb2JqZWN0J3MgbWV0aG9kIHBhY2thZ2UgYW5kIHBsdWdpbiB0byB0aGUgZ2l2ZW4KLQkgKiBjb25maWd1cmF0aW9uIGlmIHRoZXkgYXJlIG5vdCBpbiB0aGUgY29uZmlndXJhdGlvbiB5ZXQuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkVG8oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIEVPYmplY3Qgb2JqZWN0LAotCQkJU2V0IGFkZGVkT2JqZWN0cykgewotCQlNZXRob2RQYWNrYWdlIHBrZyA9IGdldE1ldGhvZFBhY2thZ2Uob2JqZWN0KTsKLQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQlpZiAoIWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuY29udGFpbnMocGtnKSkgewotCQkJCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCQkJYWRkZWRPYmplY3RzLmFkZChwa2cpOwotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihwa2cpOwotCQkJCQotCQkJCS8vIDE1MDU1MiAtIFByb2Nlc3NlczogSWYgY29uZmlndXJhdGlvbiBpcyB1cGRhdGVkIGJ5IGl0c2VsZiBkdWUgdG8gYWN0aW9ucyBsaWtlIENQIGV4dGVuZGlpbmcgb3IgZGVlcCBjb3B5LCAKLQkJCQkvLyB0aGVyZSBpcyBhIHJlZnJlc2ggaXNzdWUuCi0JCQkJLy8gbWlzc2luZyB0aGUgIiEiIGhlcmUhCi0JCQkJaWYgKCFjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuY29udGFpbnMocGx1Z2luKSkgewotCQkJCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCQkJCWFkZGVkT2JqZWN0cy5hZGQocGx1Z2luKTsKLQkJCQkKLQkJCQkJLy8gbmVlZCB0byB2YWxpZGF0ZSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdG8gbWFrZSBzdXJlIGFsbCByZWxhdGVkIHN5c3RlbSBwYWNrYWdlcyBhcmUgc2VsZWN0ZWQuCi0JCQkJCS8vIG90aGVyd2lzZSB0aGUgY29uZmlndXJhdGlvbiBleHBsb3JlciB3aWxsIG5vdCB3b3JrCi0JCQkJCS8vIDE1MDU1MiAtIFByb2Nlc3NlczogSWYgY29uZmlndXJhdGlvbiBpcyB1cGRhdGVkIGJ5IGl0c2VsZiBkdWUgdG8gYWN0aW9ucyBsaWtlIENQIGV4dGVuZGlpbmcgb3IgZGVlcCBjb3B5LCB0aGVyZSBpcyBhIHJlZnJlc2ggaXNzdWUuCQkKLQkJCQkJdmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKG51bGwsIGNvbmZpZyk7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkVG9Db25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJRU9iamVjdCBvYmplY3QsIFNldCBhZGRlZE9iamVjdHMpIHsKLQkJaW50IHNpemUgPSBhZGRlZE9iamVjdHMuc2l6ZSgpOwotCQlhZGRUbyhjb25maWcsIG9iamVjdCwgYWRkZWRPYmplY3RzKTsKLQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkvLyBhZGQgYWxsIHRoZSBiYXNlIGVsZW1lbnRzIGlmIHRoZXJlIGlzIGFueQotCQkJZm9yIChWYXJpYWJpbGl0eUVsZW1lbnQgYyA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QpCi0JCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7IGMgIT0gbnVsbDsgYyA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGMKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCWFkZFRvKGNvbmZpZywgYywgYWRkZWRPYmplY3RzKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBhZGRlZE9iamVjdHMuc2l6ZSgpID4gc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZU9iagotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICB0aGUgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw8L2NvZGU+IHRoYXQgaXMgdG8gYmUKLQkgKiAgICAgICAgICAgIHVzZWQgdG8gcGFyZW50IGFueSBkaWFsb2dzIHdpdGggdGhlIHVzZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICAgICBpZiB0aGVyZSBpcyBubyBVSSBjb250ZXh0IChkZWNsYXJlZCBhcyBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+Ci0JICogICAgICAgICAgICB0byBhdm9pZCBhbnkgZGlyZWN0IHJlZmVyZW5jZXMgb24gdGhlIFNXVCBjb21wb25lbnQpCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjaGVja0VkaXQoRU9iamVjdCBlT2JqLCBPYmplY3QgY29udGV4dCkgewotCQlpZiAoKChJbnRlcm5hbEVPYmplY3QpIGVPYmopLmVQcm94eVVSSSgpICE9IG51bGwpIHsKLQkJCS8vIHRoaXMgaXMgYSB1bnJlc29sdmVkIHByb3h5LCBkaXNhbGxvdyBlZGl0aW5nIGl0Ci0JCQkvLwotCQkJRU9iamVjdCBwcm94eSA9IGVPYmo7Ci0JCQlTdHJpbmcgdXJpID0gKChJbnRlcm5hbEVPYmplY3QpIHByb3h5KS5lUHJveHlVUkkoKS50b1N0cmluZygpOwotCQkJb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSBjb250YWluZXJVUkkgPSBwcm94eS5lQ29udGFpbmVyKCkgIT0gbnVsbCA/IHByb3h5Ci0JCQkJCS5lQ29udGFpbmVyKCkuZVJlc291cmNlKCkuZ2V0VVJJKCkKLQkJCQkJOiBudWxsOwotCQkJU3RyaW5nIGxvY2F0aW9uOwotCQkJaWYgKGNvbnRhaW5lclVSSSAhPSBudWxsKSB7Ci0JCQkJbG9jYXRpb24gPSBjb250YWluZXJVUkkgIT0gbnVsbCAmJiBjb250YWluZXJVUkkuaXNGaWxlKCkgPyBjb250YWluZXJVUkkudG9GaWxlU3RyaW5nKCkKLQkJCQkJCTogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAobG9jYXRpb24ubGVuZ3RoKCkgIT0gMCkgewotCQkJCQlsb2NhdGlvbiA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCSIgaW4gJyd7MH0nJyIsIG5ldyBPYmplY3RbXSB7IGxvY2F0aW9uIH0pOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlsb2NhdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoTGlicmFyeUVkaXRSZXNvdXJjZXMudW5yZXNvbHZlZE9iamVjdEVycm9yX3JlYXNvbgotCQkJCQksIG5ldyBPYmplY3RbXSB7IHByb3h5LmVDbGFzcygpLmdldE5hbWUoKSwgdXJpLCBsb2NhdGlvbiB9KTsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgbXNnLCBudWxsKTsKLQkJfQkJCQkKLQkJCi0JCUlBY2Nlc3NDb250cm9sbGVyIGFjID0gU2VydmljZXMuZ2V0QWNjZXNzQ29udHJvbGxlcigpOwotCQlpZihhYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQlyZXR1cm4gYWMuY2hlY2tNb2RpZnkoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChlT2JqKSwgY29udGV4dCk7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrIHRoZSBnaXZlbiBlbGVtZW50IGZvciBtb2RpZmlhYmxlCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAdGhyb3dzIE1lc3NhZ2VFeGNlcHRpb24gaWYgdGhlIGVsZW1lbnQgY2Fubm90IGJlIG1vZGlmaWVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrTW9kaWZ5KEVPYmplY3QgZSkgewotCQlJQWNjZXNzQ29udHJvbGxlciBhYyA9IFNlcnZpY2VzLmdldEFjY2Vzc0NvbnRyb2xsZXIoKTsKLQkJaWYoYWMgIT0gbnVsbCkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBhYy5jaGVja01vZGlmeShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGUpLCBudWxsKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCVN0cmluZyBtc2cgPSBVbWFVdGlsLmdldE1lc3NhZ2Uoc3RhdHVzKTsKLQkJCQlpZiAobXNnID09IG51bGwpIHsKLQkJCQkJT2JqZWN0IG9iajsKLQkJCQkJaWYoZS5lUmVzb3VyY2UoKS5nZXRVUkkoKS5pc0ZpbGUoKSkgewotCQkJCQkJb2JqID0gZS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW9iaiA9IGU7IAotCQkJCQl9Ci0JCQkJCW1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFVtYVJlc291cmNlcy5lcnJfY2Fubm90TW9kaWZ5MCwKLQkJCQkJCQluZXcgT2JqZWN0W10geyBvYmogfSk7Ci0JCQkJfQotCQkJCXRocm93IG5ldyBNZXNzYWdlRXhjZXB0aW9uKG1zZyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKElTdGF0dXMgc3RhdHVzKSB7Ci0JCVN0cmluZyBtc2cgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQlpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkgewotCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIobXNnKTsKLQkJCUlTdGF0dXMgc3RhdHVzZXNbXSA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0dXNlcy5sZW5ndGg7IGkrKykgewotCQkJCXN0ckJ1Zi5hcHBlbmQoJ1xuJykuYXBwZW5kKHN0YXR1c2VzW2ldLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCQltc2cgPSBzdHJCdWYudG9TdHJpbmcoKTsKLQkJfQotCQlpZiAobXNnID09IG51bGwgfHwgbXNnLmxlbmd0aCgpID09IDApIHsKLQkJCW1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfdG5ndXRpbF9jYW5ub3RfZWRpdF9yZXNvdXJjZTsgCi0JCX0KLQkJcmV0dXJuIG1zZzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250cmlidXRvcihWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlyZXR1cm4gZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbAotCQkmJiAoZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZXBsYWNlcihWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlyZXR1cm4gZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbAotCQkmJiAoZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250cmlidXRvck9yUmVwbGFjZXIoVmFyaWFiaWxpdHlFbGVtZW50IGUpIHsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBlLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQlyZXR1cm4gYmFzZSAhPSBudWxsICYmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUyB8fCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzR2VuZXJhbGl6ZXIoT2JqZWN0IG9iaiwgQ29sbGVjdGlvbiB0eXBlcykgewotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmo7Ci0JCWlmICh2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHR5cGVzID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHR5cGVzLmNvbnRhaW5zKHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlVGV4dChTdHJpbmcgdHlwZUtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfIiArIHR5cGVLZXkgKyAiX3R5cGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVW5rbm93bl90eXBlIik7IC8vJE5PTi1OTFMtMSQJCQotCX0KLQotCS8qKgotCSAqIExvb2tzIHVwIHRoZSB1c2VyIGZyaWVuZGx5IHR5cGUgbmFtZSBmb3IgYSBNZXRob2QgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlVGV4dChFT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldFR5cGVUZXh0KGVsZW1lbnQuZUNsYXNzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBMb29rcyB1cCB0aGUgdXNlci1mcmllbmRseSB0eXBlIG5hbWUgZm9yIGEgZ2l2ZW4gdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlVGV4dChFQ2xhc3MgdHlwZSkgewotCQlyZXR1cm4gZ2V0VHlwZVRleHQodHlwZS5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbG9va3MgdXAgdGhlIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBmZWF0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZlYXR1cmVUZXh0KE9iamVjdCBmZWF0dXJlKSB7Ci0JCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCQlyZXR1cm4gZ2V0RmVhdHVyZVRleHQoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gIlVua25vd24iOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG9iamVjdCBpcyBsb2NrZWQuIEFuIG9iamVjdCBpcyBjb25zaWRlcmVkIGxvY2tlZCBpZgotCSAqIGl0cyBNZXRob2RQbHVnaW4gaGFzIHRoZSBhdHRyaWJ1dGUgdXNlckNoYW5nZWFibGUgc2V0IHRvIGZhbHNlLiBUaGUKLQkgKiAnbG9ja2VkJyBzdGF0dXMgb2YgYW4gb2JqZWN0IGlzIGluZGVwZW5kZW50IGZyb20gJ3JlYWQtb25seScgc3RhdHVzIG9mCi0JICogaXRzIHJlc291cmNlIGZpbGUuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb2NrZWQoRU9iamVjdCBvYmplY3QpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKG9iamVjdCk7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICFwbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tFeGlzdChDb2xsZWN0aW9uIHdyYXBwZXJzLCBPYmplY3QgZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gd3JhcHBlcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSB1bndyYXAoaXRlcmF0b3IubmV4dCgpKTsKLQkJCWlmIChlbGVtZW50ID09IGUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGluZGV4IG9mIGVsZW1lbnQgb3IgaXRzIHdyYXBwZXIgaW4gdGhlIGdpdmVuIGxpc3QKLQkgKiBAcGFyYW0gbGlzdCBhIG1peGVkIGxpc3Qgb2YgZWxlbWVudCBhbmQgd3JhcHBlcgotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiAtMSBpZiB0aGUgZWxlbWVudCBvciBpdHMgd3JhcHBlciBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhlIGxpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRJbmRleE9mKExpc3QgbGlzdCwgT2JqZWN0IGUpIHsKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gdW53cmFwKGxpc3QuZ2V0KGkpKTsKLQkJCWlmKGVsZW1lbnQgPT0gZSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDb250YWluaW5nRmVhdHVyZShPYmplY3Qgb2JqZWN0LAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChvYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCWlmICghKHBhcmVudCBpbnN0YW5jZW9mIEVPYmplY3QpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChwYXJlbnQsCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyKSB7Ci0JCQlFT2JqZWN0IHBhcmVudEVPYmogPSAoRU9iamVjdCkgcGFyZW50OwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyKSBhZGFwdGVyKQotCQkJCQkuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhwYXJlbnQpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGYuaXNNYW55KCkpIHsKLQkJCQkJaWYgKCgoQ29sbGVjdGlvbikgcGFyZW50RU9iai5lR2V0KGYpKS5jb250YWlucyhvYmplY3QpKSB7Ci0JCQkJCQlyZXR1cm4gZjsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChwYXJlbnRFT2JqLmVHZXQoZikgPT0gb2JqZWN0KSB7Ci0JCQkJCQlyZXR1cm4gZjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogTG9va3MgdXAgdGhlIHVzZXItZnJpZW5kbHkgbmFtZSBmb3IgYSBnaXZlbiBmZWF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZlYXR1cmVUZXh0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSkgewotCQkvLyBjYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotCQkvLyByZXR1cm4gIlByaW1hcnkgUGVyZm9ybWVyIjsKLQkJLy8gY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJLy8gcmV0dXJuICJTZWNvbmRhcnkgUGVyZm9ybWVyIjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuYXNzaXN0c190ZXh0OyAKLQkJfQotCi0JCVN0cmluZyBmZWF0dXJlS2V5OwotCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVTdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZTsKLQkJCWZlYXR1cmVLZXkgPSBlRmVhdHVyZS5nZXRFQ29udGFpbmluZ0NsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJCSsgIl8iICsgZUZlYXR1cmUuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlmZWF0dXJlS2V5ID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudW5rbm93bl90ZXh0OyAKLQkJfQotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCS5nZXRTdHJpbmcoIl9VSV8iICsgZmVhdHVyZUtleSArICJfZmVhdHVyZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGxpYnJhcnkgcm9vdCBwYXRoIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCwgYXNzdW1pbmcgdGhlIGVsZW1lbnQgYW5kCi0JICogaXQncyBwYXJlbnRzIGFyZSBsb2FkZWQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gRmlsZSB0aGUgcm9vdCBwYXRoIG9mIHRoZSBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldExpYnJhcnlSb290UGF0aChFT2JqZWN0IGVsZW1lbnQpIHsKLQkJRU9iamVjdCBwYXJlbnQgPSBlbGVtZW50OwotCQl3aGlsZSAoKHBhcmVudCAhPSBudWxsKSAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpKSB7Ci0JCQlwYXJlbnQgPSBwYXJlbnQuZUNvbnRhaW5lcigpOwotCQl9Ci0KLQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJIHVyaSA9IHBhcmVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKLQkJCVN0cmluZyBwYXRoID0gdXJpLnRvRmlsZVN0cmluZygpOwotCQkJRmlsZSBmID0gbmV3IEZpbGUocGF0aCk7Ci0JCQlyZXR1cm4gZi5nZXRQYXJlbnRGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBmdWxsIHBhdGggVVJJIGJ5IGFwcGVuZGluZyB0aGUgcmVsYXRpdmUgcGF0aCBVUkkgdG8gdGhlIG9iamVjdCdzCi0JICogbGlicmFyeSBwYXRoCi0JICogCi0JICogQHBhcmFtIG8KLQkgKiAgICAgICAgICAgIEVPYmplY3QgdGhlIG9iamVjdCB0byBmaW5kIHRoZSBNZXRob2RMaWJyYXJ5LCBjYW4gYmUgYW55Ci0JICogICAgICAgICAgICBvYmplY3QgaW4gdGhlIGxpYnJhcnkKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBUaGUgdXJpIHRvIGJlIGZpeGVkCi0JICogQHJldHVybiBVUkkgdGhlIGZ1bGwgcGF0aCB1cmkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSSSBnZXRGdWxsUGF0aFVSSShFT2JqZWN0IG8sIFVSSSB1cmkpIHsKLQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdXJpOwotCQl9Ci0KLQkJLy8gdHJ5IGlmIHRoaXMgaXMgYSB2YWxpZCBVUkwgb3Igbm90Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gdXJpLnRvVVJMKCk7Ci0JCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdXJpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCTsgLy8gbm90IGEgdmFsaWQgdXJsLCBtYXliZSBhIHJlbGF0aXZlIHBhdGgKLQkJfQotCi0JCS8vIG5lZWQgdG8gZ2V0IHRoZSBlbGVtZW50J3MgcmVzb3VyY2UgcGF0aAotCQlGaWxlIGYgPSBnZXRMaWJyYXJ5Um9vdFBhdGgobyk7Ci0JCWlmIChmICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgRmlsZShmLCBOZXRVdGlsLmRlY29kZWRGaWxlVXJsKHVyaS50b1N0cmluZygpKSkudG9VUkkoKTsKLQkJfQotCi0JCXJldHVybiB1cmk7Ci0JfQotCi0JCi0JLyoqCi0JICogVG8gZ2V0IHRoZSBub2RlIGljb24vc2hhcGUgaWNvbiBmdWxsIHBhdGggVVJJIGJ5IGFwcGVuZGluZyB0aGUgcmVsYXRpdmUgcGF0aCBVUkkgdG8gdGhlIG9iamVjdCdzCi0JICogbGlicmFyeSBwYXRoCi0JICogCi0JICogQHBhcmFtIG8KLQkgKiAgICAgICAgICAgIEVPYmplY3QgdGhlIG9iamVjdCB0byBmaW5kIHRoZSBNZXRob2RMaWJyYXJ5LCBjYW4gYmUgYW55Ci0JICogICAgICAgICAgICBvYmplY3QgaW4gdGhlIGxpYnJhcnkKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBUaGUgdXJpIHRvIGJlIGZpeGVkCi0JICogQHJldHVybiBVUkkgdGhlIGZ1bGwgcGF0aCB1cmkKLQkgKi8KLQkvL0ZJWE1FOiBtYWtlIHN0b3JhZ2UgaW5kZXBlbmRlbnQKLQlwdWJsaWMgc3RhdGljIFVSSSBnZXRGdWxsUGF0aG9mTm9kZW9yU2hhcGVJY29uVVJJKEVPYmplY3QgbywgVVJJIHVyaSkgewotCQlpZiAodXJpID09IG51bGwpIHsKLQkJCXJldHVybiB1cmk7Ci0JCX0KLQotCQkvLyB0cnkgaWYgdGhpcyBpcyBhIHZhbGlkIFVSTCBvciBub3QKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSB1cmkudG9VUkwoKTsKLQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCXJldHVybiB1cmk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJOyAvLyBub3QgYSB2YWxpZCB1cmwsIG1heWJlIGEgcmVsYXRpdmUgcGF0aAotCQl9Ci0KLQkJLy8gbmVlZCB0byBnZXQgdGhlIGVsZW1lbnQncyByZXNvdXJjZSBwYXRoCi0JCUZpbGUgZiA9IGdldExpYnJhcnlSb290UGF0aChvKTsKLQkJU3RyaW5nIHBhdGggPSB1cmkuZ2V0UGF0aCgpOwotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4obyk7Ci0JCWlmIChwbHVnaW4gIT0gbnVsbCAmJiBVbWFVdGlsLmhhc0RpcmVjdFJlc291cmNlKHBsdWdpbikpIHsKLQkJCUZpbGUgcGx1Z2luRGlyID0gbmV3IEZpbGUocGx1Z2luLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQlpZiAocGF0aC5pbmRleE9mKHBsdWdpbi5nZXROYW1lKCkpID4gLTEpIHsKLQkJCQlyZXR1cm4gbmV3IEZpbGUoZiwgTmV0VXRpbC5kZWNvZGVkRmlsZVVybCh1cmkudG9TdHJpbmcoKSkpCi0JCQkJCQkudG9VUkkoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG5ldyBGaWxlKHBsdWdpbkRpciwgTmV0VXRpbC5kZWNvZGVkRmlsZVVybCh1cmkudG9TdHJpbmcoKSkpLnRvVVJJKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RhY2tUcmFjZVN0cmluZyhUaHJvd2FibGUgZSkgewotCQlTdHJpbmdXcml0ZXIgc3RyV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQllLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIoc3RyV3JpdGVyKSk7Ci0JCXJldHVybiBzdHJXcml0ZXIudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGFiZWxXaXRoUGF0aChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0TGFiZWxXaXRoUGF0aCgoQnJlYWtkb3duRWxlbWVudCkgb2JqZWN0KTsKLQkJfQotCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCXJldHVybiBnZXRMYWJlbFdpdGhQYXRoKCgoQ29udGVudERlc2NyaXB0aW9uKSBvYmplY3QpLmVDb250YWluZXIoKSk7Ci0JCX0KLQotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlNZXRob2RFbGVtZW50IG1lID0gKE1ldGhvZEVsZW1lbnQpIG9iamVjdDsKLQkJCUNvbGxlY3Rpb248TmFtZWRFbGVtZW50PiBpdGVtUGF0aCA9IE1pc2MuZ2V0T2JqZWN0VHJlZVJlbGF0aXZlVG9QbHVnaW4obWUpOwotCQkJU3RyaW5nQnVmZmVyIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKGdldExhYmVsKG9iamVjdCwgbWUuZ2V0R3VpZCgpKSk7Ci0JCQlpZiAoTWV0aG9kRWxlbWVudFV0aWwuZ2V0TWV0aG9kTW9kZWwob2JqZWN0KSAhPSBudWxsKSB7Ci0JCQkJcGF0aAotCQkJCS5hcHBlbmQoIiwgIikuYXBwZW5kKE1ldGhvZEVsZW1lbnRVdGlsLmdldE1ldGhvZE1vZGVsKG9iamVjdCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoSXRlcmF0b3I8TmFtZWRFbGVtZW50PiBpdGVyID0gaXRlbVBhdGguaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJTmFtZWRFbGVtZW50IGUgPSBpdGVyLm5leHQoKTsKLQkJCQkJU3RyaW5nIHMgPSBTdHJpbmcudmFsdWVPZihlLmdldE5hbWUoKSk7Ci0KLQkJCQkJaWYgKE1vZGVsU3RydWN0dXJlLkNPUkVfQ09OVEVOVF9QQUNBS0dFX05BTUUuZXF1YWxzKHMpIHx8IE1vZGVsU3RydWN0dXJlLkNPTlRFTlRfUEFDS0FHRV9OQU1FLmVxdWFsc0lnbm9yZUNhc2UocykKLQkJCQkJCQl8fCAoKChOYW1lZEVsZW1lbnQpIG9iamVjdCkuZXF1YWxzKGUpKSkgewotCQkJCQl9IGVsc2UgewotCQkJCQkJcGF0aC5hcHBlbmQoJy8nKS5hcHBlbmQocyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcGF0aC50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgRU9iamVjdCBnZXRPd25lcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJY29tbWFuZCA9IFRuZ1V0aWwudW53cmFwKGNvbW1hbmQpOwotCQlFT2JqZWN0IG93bmVyID0gbnVsbDsKLQkJaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBBZGRDb21tYW5kKSB7Ci0JCQlvd25lciA9ICgoQWRkQ29tbWFuZCkgY29tbWFuZCkuZ2V0T3duZXIoKTsKLQkJfSBlbHNlIGlmIChjb21tYW5kIGluc3RhbmNlb2YgUmVtb3ZlQ29tbWFuZCkgewotCQkJb3duZXIgPSAoKFJlbW92ZUNvbW1hbmQpIGNvbW1hbmQpLmdldE93bmVyKCk7Ci0JCX0gZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFNldENvbW1hbmQpIHsKLQkJCW93bmVyID0gKChTZXRDb21tYW5kKSBjb21tYW5kKS5nZXRPd25lcigpOwotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBNb3ZlQ29tbWFuZCkgewotCQkJb3duZXIgPSAoKE1vdmVDb21tYW5kKSBjb21tYW5kKS5nZXRPd25lcigpOwotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKSB7Ci0JCQlPYmplY3QgbyA9ICgoUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCkgY29tbWFuZCkuZ2V0T3duZXIoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCW93bmVyID0gKEVPYmplY3QpIG87Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG93bmVyOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFNldDxSZXNvdXJjZT4gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoQ29tbWFuZCBjbWQpIHsKLQkJU2V0PFJlc291cmNlPiBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCQljb2xsZWN0TW9kaWZpZWRSZXNvdXJjZXMoY21kLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbGxlY3RNb2RpZmllZFJlc291cmNlcyhDb21tYW5kIGNvbW1hbmQsIFNldDxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbCgoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgY29tbWFuZCkKLQkJCQkJLmdldE1vZGlmaWVkUmVzb3VyY2VzKCkpOwotCQl9IAotCQllbHNlIGlmKGNvbW1hbmQgaW5zdGFuY2VvZiBDb21wb3VuZENvbW1hbmQpewotCQkJTGlzdCBjb21tYW5kTGlzdCA9ICgoQ29tcG91bmRDb21tYW5kKWNvbW1hbmQpLmdldENvbW1hbmRMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21tYW5kTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQljb2xsZWN0TW9kaWZpZWRSZXNvdXJjZXMoKENvbW1hbmQpIGl0ZXIubmV4dCgpLCBtb2RpZmllZFJlc291cmNlcyk7CQkJCQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJRU9iamVjdCBtb2RpZmllZCA9IFRuZ1V0aWwuZ2V0T3duZXIoY29tbWFuZCk7Ci0JCQlpZihtb2RpZmllZCAhPSBudWxsKSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBtb2RpZmllZC5lUmVzb3VyY2UoKTsKLQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGNvbnZlcnRHdWlkYW5jZUF0dGFjaG1lbnRzVG9MaXN0KFN0cmluZyBhdHRhY2htZW50U3RyaW5nKSB7Ci0JCUFycmF5TGlzdCBhdHRhY2htZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGF0dGFjaG1lbnRTdHJpbmcgPT0gbnVsbCkKLQkJCWF0dGFjaG1lbnRTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZmlsZXNbXSA9IGF0dGFjaG1lbnRTdHJpbmcKLQkJCQkuc3BsaXQoR1VJREFOQ0VfRklMRVNUUklOR19TRVBBUkFUT1JfU1BMSVRURVIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmlsZXNbaV0udHJpbSgpLmxlbmd0aCgpID4gMCkKLQkJCQlhdHRhY2htZW50cy5hZGQoZmlsZXNbaV0pOwotCQl9Ci0JCXJldHVybiBhdHRhY2htZW50czsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0R3VpZGFuY2VBdHRhY2htZW50c1RvU3RyaW5nKExpc3QgYXR0YWNobWVudExpc3QpIHsKLQkJU3RyaW5nIGF0dGFjaG1lbnRTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGF0dGFjaG1lbnRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGF0dGFjaG1lbnQgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCWlmIChpKysgPiAwKQotCQkJCWF0dGFjaG1lbnRTdHJpbmcgPSBhdHRhY2htZW50U3RyaW5nCi0JCQkJCQkuY29uY2F0KEdVSURBTkNFX0ZJTEVTVFJJTkdfU0VQQVJBVE9SKTsKLQkJCWF0dGFjaG1lbnRTdHJpbmcgPSBhdHRhY2htZW50U3RyaW5nLmNvbmNhdChhdHRhY2htZW50KTsKLQkJfQotCQlyZXR1cm4gYXR0YWNobWVudFN0cmluZzsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIHRydWUgaWZmIHRoZSBNZXRob2RFbGVtZW50IGlzIGFsbG93ZWQgYW4gYXR0YWNobWVudC4gIEN1cnJlbnRseSwgb25seQotCSAqIEV4YW1wbGUsIFJlc3VhYmxlQXNzZXQsIFRlbXBsYXRlLCAgV2hpdGVwYXBlciBhcmUgYWxsb3dlZCBhdHRhY2htZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FsbG93ZWRBdHRhY2htZW50cyhNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChlIGluc3RhbmNlb2YgRXhhbXBsZSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBUZW1wbGF0ZSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZSBpbnN0YW5jZW9mIFdoaXRlcGFwZXIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiA8Y29kZT5lbGVtZW50czwvY29kZT4gY29udGFpbnMgPGNvZGU+ZTwvY29kZT4gb3IgaGFzIGEgd3JhcHBlciBvZiA8Y29kZT5lPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhDb2xsZWN0aW9uIGVsZW1lbnRzLCBPYmplY3QgZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZihlbGVtZW50ID09IGUgfHwgZSA9PSB1bndyYXAoZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gQ3VzdG9tQ2F0ZWdvcnkgaXMgYW4gYW5jZXN0b3Igb2YgdGhlIGdpdmVuIERlc2NpYmFibGVFbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGNjCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICogQGRlcHJlY2F0ZWQgbW92ZWQgdG8ge0BsaW5rIERlcGVuZGVuY3lDaGVja2VyI2lzQW5jZXNzb3JPZihDdXN0b21DYXRlZ29yeSwgRGVzY3JpYmFibGVFbGVtZW50KX0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbmNlc3Nvck9mKEN1c3RvbUNhdGVnb3J5IGNjLCBEZXNjcmliYWJsZUVsZW1lbnQgZSkgewotCQlyZXR1cm4gRGVwZW5kZW5jeUNoZWNrZXIuaXNBbmNlc3Nvck9mKGNjLCBlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hQYXJlbnRJZk5hbWVDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sIEl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlcikgewotCQlpZihub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05BTUU6Ci0JCQkJaWYoUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5pc1Nob3dQcmVzZW50YXRpb25OYW1lcygpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkJaWYoIVByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuaXNTaG93UHJlc2VudGF0aW9uTmFtZXMoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoIG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTmFtZWRFbGVtZW50LmNsYXNzKSAhPSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUUgKXsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBuYW1lIGNoYW5nZSBtaWdodCBjaGFuZ2UgdGhlIGVsZW1lbnQncyBvcmRlciBpbiB0aGUgc29ydGVkIGxpc3QKLQkJLy8gcmVmcmVzaCB0aGUgcGFyZW50IGNvbnRlbnQgdG8gcmVzb3J0IHRoZSBlbGVtZW50IGxpc3QKLQkJLy8KLQkJYWRhcHRlci5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgYWRhcHRlci5nZXRQYXJlbnQobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpLCB0cnVlLCBmYWxzZSkpOwotCX0JCi0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBlbGVtZW50IDxjb2RlPmU8L2NvZGU+IGlzIGEgY29udHJpYnV0b3Igb2YgdGhlIGdpdmVuIDxjb2RlPmJhc2U8L2NvZGU+Ci0JICogQHBhcmFtIGJhc2UKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250cmlidXRvck9mKE9iamVjdCBiYXNlLCBWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlmb3IoVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZTsKLQkJdmUgIT0gbnVsbCAmJiB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMgJiYgdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGw7Ci0JCXZlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSB7Ci0JCQlpZih2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gYmFzZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLS8vCS8qKgotLy8JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBwYXJlbnQgY29udGFpbnMgdGhlIGdpdmVuIGNoaWxkLCBlaXRoZXIgdmlhIGNvbnRhaW5tZW50IG9yIGNvbnRyaWJ1dGlvbgotLy8JICogQHBhcmFtIHBhcmVudAotLy8JICogQHBhcmFtIGNoaWxkCi0vLwkgKiBAcmV0dXJuCi0vLwkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRhaW5lZEJ5KEFydGlmYWN0IHBhcmVudCwgQXJ0aWZhY3QgY2hpbGQpIHsKLS8vCQlFT2JqZWN0IGNvbnRhaW5lciA9IGNoaWxkLmVDb250YWluZXIoKTsKLS8vCQlpZihjb250YWluZXIgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotLy8JCQlBcnRpZmFjdCBjdXJyZW50UGFyZW50ID0gKEFydGlmYWN0KWNvbnRhaW5lcjsKLS8vCQkJaWYoY29udGFpbmVyID09IHBhcmVudCB8fCBpc0NvbnRyaWJ1dG9yT2YocGFyZW50LCBjdXJyZW50UGFyZW50KSkgewotLy8JCQkJcmV0dXJuIHRydWU7Ci0vLwkJCX0KLS8vCQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihwYXJlbnQsIGZhbHNlKSB7Ci0vLwkJCQkKLS8vCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotLy8JCQkJCi0vLwkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotLy8JCQkJCXJldHVybiAoKEFydGlmYWN0KW9iamVjdCkuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkuaXRlcmF0b3IoKTsKLS8vCQkJCX0KLS8vCQkJCQotLy8JCQl9OwotLy8JCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotLy8JCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLS8vCQkJCWlmKG8gPT0gY3VycmVudFBhcmVudCB8fCBpc0NvbnRyaWJ1dG9yT2YobywgY3VycmVudFBhcmVudCkpIHsKLS8vCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJfQotLy8JCWVsc2UgewotLy8JCQlyZXR1cm4gVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KGNoaWxkLCBwYXJlbnQpOwotLy8JCX0KLS8vCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0Q29uZmlndXJhdGlvbnNUb1VwZGF0ZShNZXRob2RQYWNrYWdlIHBhcmVudCwgTWV0aG9kUGFja2FnZSBwa2csIENvbGxlY3Rpb24gY29uZmlnc1RvVXBkYXRlKSB7Ci0JCU9iamVjdCBjb25maWdzID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgcGFyZW50KQotCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoQXNzb2NpYXRpb25IZWxwZXIuTWV0aG9kUGFja2FnZV9NZXRob2RDb25maWd1cmF0aW9ucyk7Ci0JCWlmIChjb25maWdzIGluc3RhbmNlb2YgTGlzdCkgewotCQkJZm9yIChJdGVyYXRvciBpdGNvbmZpZyA9ICgoTGlzdCkgY29uZmlncykuaXRlcmF0b3IoKTsgaXRjb25maWcKLQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRjb25maWcKLQkJCQkubmV4dCgpOwotCQkJCUxpc3QgcGtncyA9IGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCQkJaWYgKCFwa2dzLmNvbnRhaW5zKHBrZykpIHsKLQkJCQkJY29uZmlnc1RvVXBkYXRlLmFkZChjb25maWcpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG9iamVjdCBjYW4gYmUgZXN0aW1hdGVkCi0JICogCi0JICogQHBhcmFtIG8KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhbkVzdGltYXRlKE9iamVjdCBvKSB7Ci0JCXJldHVybiBvIGluc3RhbmNlb2YgVGFzayB8fCBvIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWJ1Z1Nob3dBbGwoKSB7Ci0JCUlMaWJyYXJ5SW5zcGVjdG9yIGluc3BlY3RvciA9IGdldExpYnJhcnlJbnNwZWN0b3IoKTsKLQkJaWYgKGluc3BlY3RvciAhPSBudWxsKSB7Ci0JCQlpbnNwZWN0b3Iuc2hvd0FsbENvbnRlbnRzKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlYnVnU2hvd0FsbChNZXRob2RMaWJyYXJ5IGxpYikgewotCQlJTGlicmFyeUluc3BlY3RvciBpbnNwZWN0b3IgPSBnZXRMaWJyYXJ5SW5zcGVjdG9yKCk7Ci0JCWlmIChpbnNwZWN0b3IgIT0gbnVsbCkgewotCQkJaW5zcGVjdG9yLnNob3dBbGxDb250ZW50cyhsaWIpOwotCQl9Ci0JfQotCQotCS8vVXNlZCBmb3IgZGVidWcgb25seQotCXB1YmxpYyBzdGF0aWMgSUxpYnJhcnlJbnNwZWN0b3IgZ2V0TGlicmFyeUluc3BlY3RvcigpIHsKLQkJcmV0dXJuIChJTGlicmFyeUluc3BlY3RvcikgRXh0ZW5zaW9uTWFuYWdlci5nZXRFeHRlbnNpb24oIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiLCAibGlicmFyeUluc3BlY3RvciIpOyAJCQkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5QbHVnaW5XaXRoTGVzc1RoYW5PbmVTdXBlckN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5IGNjLCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCWlmKFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNjKSAhPSBwbHVnaW4pIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlMaXN0IGxpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKGNjKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKSAmJiBjb3VudCA8IDI7KSB7Ci0JCQlDdXN0b21DYXRlZ29yeSBjYXQgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0ZXIubmV4dCgpOwotCQkJaWYoVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0KSA9PSBwbHVnaW4pIHsKLQkJCQljb3VudCsrOwotCQkJfQkJCQkJCQotCQl9Ci0JCXJldHVybiBjb3VudCA8IDI7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIGdpdmVuIHdyYXBwZXIgaXMgdW5kZXIgYSBjdXN0b20gY2F0ZWdvcnkgdHJlZQotCSAqIAotCSAqIEBwYXJhbSBpdGVtCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VuZGVyQ3VzdG9tQ2F0ZWdvcnlUcmVlKElXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJZG8gewotCQkJT2JqZWN0IG93bmVyID0gd3JhcHBlci5nZXRPd25lcigpOwotCQkJaWYodW53cmFwKG93bmVyKSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQl3cmFwcGVyID0gb3duZXIgaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlciA/IChJV3JhcHBlckl0ZW1Qcm92aWRlcikgb3duZXIgOiBudWxsOwotCQl9IHdoaWxlKHdyYXBwZXIgIT0gbnVsbCk7Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXRFeGNsdXNpdmVTdWJDdXN0b21DYXRlZ29yaWVzKEN1c3RvbUNhdGVnb3J5IGNjKSB7Ci0JCUFycmF5TGlzdCBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQljb2xsZWN0RXhjbHVzaXZlU3ViQ3VzdG9tQ2F0ZWdvcmllcyhjb2xsZWN0aW9uLCBjYywgVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2MpKTsKLQkJcmV0dXJuIGNvbGxlY3Rpb247Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29sbGVjdEV4Y2x1c2l2ZVN1YkN1c3RvbUNhdGVnb3JpZXMoQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBDdXN0b21DYXRlZ29yeSBjYywgTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjYy5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYoZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgc3ViID0gKEN1c3RvbUNhdGVnb3J5KSBlOwotCQkJCWlmKGlzSW5QbHVnaW5XaXRoTGVzc1RoYW5PbmVTdXBlckN1c3RvbUNhdGVnb3J5KHN1YiwgcGx1Z2luKSkgewotCQkJCQljb2xsZWN0aW9uLmFkZChlKTsKLQkJCQkJY29sbGVjdEV4Y2x1c2l2ZVN1YkN1c3RvbUNhdGVnb3JpZXMoY29sbGVjdGlvbiwgc3ViLCBwbHVnaW4pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBZGFwdGVyQnlUeXBlKE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub3RpZmllci5lQWRhcHRlcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBpdGVyLm5leHQoKTsKLQkJCWlmKGFkYXB0ZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIHJlZmVyZW5jZXMgdG8gYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gYSBtYXAgY29udGFpbmluZyB0aGUgcmVtb3ZlZCByZWZlcmVuY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgcmVtb3ZlUmVmZXJlbmNlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIFRuZ1V0aWwucmVtb3ZlUmVmZXJlbmNlcyhlbGVtZW50LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbGwgcmVmZXJlbmNlcyB0byBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBhIG1hcCBvZiBtZXRob2QgZWxlbWVudHMgd2hvc2UgcmVmZXJlbmNlcyB0byB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqICAgICAgICAgYXJlIGp1c3QgcmVtb3ZlZCwgYW5kIHRoZWlyIGZlYXR1cmVzIHRoYXQgaG9sZCB0aGUgcmVmZXJlbmNlcyB0bwotCSAqICAgICAgICAgdGhlIGdpdmVuIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCByZW1vdmVSZWZlcmVuY2VzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCWJvb2xlYW4gY2hlY2tNb2RpZnkpIHsKLQkJLy8gTGlzdCByZWZlcmVuY2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTWFwIG9iamVjdEZlYXR1cmVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgZU9iaiA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudDsKLQkKLQkJaWYgKGVPYmouYmFzaWNHZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKSA9PSBudWxsKQotCQkJcmV0dXJuIG9iamVjdEZlYXR1cmVzTWFwOwotCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlT2JqLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSAoKE9wcG9zaXRlRmVhdHVyZSkgZW50cnkuZ2V0S2V5KCkpOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQXJyYXlMaXN0KChDb2xsZWN0aW9uKSBlT2JqCi0JCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKG9wcG9zaXRlRmVhdHVyZSkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmIChjaGVja01vZGlmeSkgewotCQkJCQkJCWNoZWNrTW9kaWZ5KG9iaik7Ci0JCQkJCQl9Ci0JCQkJCQkoKExpc3QpIG9iai5lR2V0KGZlYXR1cmUpKS5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJCQlMaXN0IGZlYXR1cmVzID0gKExpc3QpIG9iamVjdEZlYXR1cmVzTWFwLmdldChvYmopOwotCQkJCQkJaWYgKGZlYXR1cmVzID09IG51bGwpIHsKLQkJCQkJCQlmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlvYmplY3RGZWF0dXJlc01hcC5wdXQob2JqLCBmZWF0dXJlcyk7Ci0JCQkJCQl9Ci0JCQkJCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBlT2JqCi0JCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKG9wcG9zaXRlRmVhdHVyZSk7Ci0JCQkJCWlmIChvYmogIT0gbnVsbCkgewotCQkJCQkJaWYgKGNoZWNrTW9kaWZ5KSB7Ci0JCQkJCQkJY2hlY2tNb2RpZnkob2JqKTsKLQkJCQkJCX0KLQkJCQkJCSgoTGlzdCkgb2JqLmVHZXQoZmVhdHVyZSkpLnJlbW92ZShlbGVtZW50KTsKLQkJCQkJCUxpc3QgZmVhdHVyZXMgPSAoTGlzdCkgb2JqZWN0RmVhdHVyZXNNYXAuZ2V0KG9iaik7Ci0JCQkJCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCkgewotCQkJCQkJCWZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCW9iamVjdEZlYXR1cmVzTWFwLnB1dChvYmosIGZlYXR1cmVzKTsKLQkJCQkJCX0KLQkJCQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3IEFycmF5TGlzdCgoQ29sbGVjdGlvbikgZU9iagotCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShvcHBvc2l0ZUZlYXR1cmUpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAoY2hlY2tNb2RpZnkpIHsKLQkJCQkJCQljaGVja01vZGlmeShvYmopOwotCQkJCQkJfQotCQkJCQkJb2JqLmVTZXQoZmVhdHVyZSwgbnVsbCk7Ci0JCQkJCQlMaXN0IGZlYXR1cmVzID0gKExpc3QpIG9iamVjdEZlYXR1cmVzTWFwLmdldChvYmopOwotCQkJCQkJaWYgKGZlYXR1cmVzID09IG51bGwpIHsKLQkJCQkJCQlmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlvYmplY3RGZWF0dXJlc01hcC5wdXQob2JqLCBmZWF0dXJlcyk7Ci0JCQkJCQl9Ci0JCQkJCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBlT2JqCi0JCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKG9wcG9zaXRlRmVhdHVyZSk7Ci0JCQkJCWlmIChvYmogIT0gbnVsbCkgewotCQkJCQkJaWYgKGNoZWNrTW9kaWZ5KSB7Ci0JCQkJCQkJY2hlY2tNb2RpZnkob2JqKTsKLQkJCQkJCX0KLQkJCQkJCW9iai5lU2V0KGZlYXR1cmUsIG51bGwpOwotCQkJCQkJTGlzdCBmZWF0dXJlcyA9IChMaXN0KSBvYmplY3RGZWF0dXJlc01hcC5nZXQob2JqKTsKLQkJCQkJCWlmIChmZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQkJCQkJZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJb2JqZWN0RmVhdHVyZXNNYXAucHV0KG9iaiwgZmVhdHVyZXMpOwotCQkJCQkJfQotCQkJCQkJZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdEZlYXR1cmVzTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkvLyByZWZlcmVuY2Vycy5hZGQobmV3IFJlZmVyZW5jZXIoKEVPYmplY3QpZW50cnkuZ2V0S2V5KCksCi0JCS8vIChMaXN0KWVudHJ5LmdldFZhbHVlKCkpKTsKLQkJLy8gfQotCQkvLyByZXR1cm4gcmVmZXJlbmNlcnM7Ci0JCXJldHVybiBvYmplY3RGZWF0dXJlc01hcDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHB1Ymxpc2hpbmcgY2F0ZWdvcnkgcHJvcGVydHkgZm9yIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICogCQkgcHJvcGVydHkgaWYgZm91bmQsIGVsc2UgbnVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudFByb3BlcnR5IGdldFB1Ymxpc2hDYXRlZ29yeVByb3BlcnR5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlMaXN0IHByb3BzID0gZWxlbWVudC5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJaWYgKHByb3BzID09IG51bGwgfHwgcHJvcHMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHByb3BzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgaXQubmV4dCgpOwotCQkJaWYgKFBVQkxJU0hfQ0FURUdPUllfUFJPUEVSVFkuZXF1YWxzKHByb3AuZ2V0TmFtZSgpKSkgewotCQkJCXJldHVybiBwcm9wOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlDdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXROb3RpZnlDaGFuZ2VkTGlzdGVuZXJzKCk7Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpIHsKLQkJCVJvbGVTZXRJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChSb2xlU2V0SXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXROb3RpZnlDaGFuZ2VkTGlzdGVuZXJzKCk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJRGlzY2lwbGluZUl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKERpc2NpcGxpbmVJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXJldHVybiBhZGFwdGVyLmdldE5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB3cmFwcGVyIGZvciB0aGUgZ2l2ZW4gdmFsdWUgaW4gdGhlIGdpdmVuIHdyYXBwZXJzLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVycwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIgZ2V0V3JhcHBlcihDb2xsZWN0aW9uIHdyYXBwZXJzLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHdyYXBwZXJzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3JhcHBlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbGlzdGVuZXIgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKGxpc3RlbmVyIGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCQkmJiB1bndyYXAobGlzdGVuZXIpID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIChGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSBsaXN0ZW5lcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1dyYXBwZXJNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvV3JhcHBlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIwMjViNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvV3JhcHBlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotCi0vKioKLSAqIE1hbmFnZXMgd3JhcHBlcnMgb2YgYW4gaXRlbSBwcm92aWRlcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEZlYiAxNSwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdyYXBwZXJNYW5hZ2VyIGltcGxlbWVudHMgSURpc3Bvc2FibGUgewotCi0JcHJpdmF0ZSBIYXNoTWFwIHZhbHVlVG9XcmFwcGVyTWFwOwotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgV3JhcHBlck1hbmFnZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldFdyYXBwZXIoT2JqZWN0IHZhbHVlKSB7Ci0JCWlmKHZhbHVlVG9XcmFwcGVyTWFwICE9IG51bGwpIHsKLQkJCXJldHVybiB2YWx1ZVRvV3JhcHBlck1hcC5nZXQodmFsdWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRXcmFwcGVycygpIHsKLQkJaWYodmFsdWVUb1dyYXBwZXJNYXAgIT0gbnVsbCkgewotCQkJcmV0dXJuIHZhbHVlVG9XcmFwcGVyTWFwLnZhbHVlcygpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIHdyYXBwZXIgZm9yIHRoZSBnaXZlbiB2YWx1ZSwgb3duZXIsIGFuZCBhZGFwdGVyIGZhY3RvcnkuCi0JICovCi0JcHJvdGVjdGVkIElXcmFwcGVySXRlbVByb3ZpZGVyIGNyZWF0ZVdyYXBwZXIoT2JqZWN0IHZhbHVlLCBPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIodmFsdWUsIG93bmVyLCBudWxsLCBDb21tYW5kUGFyYW1ldGVyLk5PX0lOREVYLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKENvbGxlY3Rpb24gZGVsZWdhdGVWYWx1ZXMpIHsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCVNldCBvbGREZWxlZ2F0ZVZhbHVlcyA9IGRlbGVnYXRlVmFsdWVzICE9IG51bGwgPyBuZXcgSGFzaFNldChkZWxlZ2F0ZVZhbHVlcykgOiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JCQotCQlpZiAodmFsdWVUb1dyYXBwZXJNYXAgPT0gbnVsbCAmJiAhZGVsZWdhdGVWYWx1ZXMuaXNFbXB0eSgpKQotCQl7Ci0JCQl2YWx1ZVRvV3JhcHBlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJCi0JCS8vIFdyYXAgYW55IG5ldyBjaGlsZHJlbiBhbmQgYWRkIHRoZW0gdG8gdGhlIG1hcC4gUmVtb3ZlIGVhY2ggY3VycmVudCBjaGlsZCBmcm9tIHRoZSBzZXQgb2Ygb2xkIGNoaWxkcmVuLgotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBkZWxlZ2F0ZVZhbHVlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCQl7Ci0JCQlPYmplY3QgY2hpbGQgPSBpLm5leHQoKTsKLQkJCQotCQkJaWYgKCF2YWx1ZVRvV3JhcHBlck1hcC5jb250YWluc0tleShjaGlsZCkpCi0JCQl7Ci0JCQkJSVdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IGNyZWF0ZVdyYXBwZXIoY2hpbGQsIHRoaXMsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQl2YWx1ZVRvV3JhcHBlck1hcC5wdXQoY2hpbGQsIHdyYXBwZXIpOwotCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJfQotCQkJb2xkRGVsZWdhdGVWYWx1ZXMucmVtb3ZlKGNoaWxkKTsKLQkJfQotCQkKLQkJLy8gUmVtb3ZlIGFuZCBkaXNwb3NlIGFueSB3cmFwcGVycyBmb3IgcmVtYWluaW5nIG9sZCBjaGlsZHJlbi4KLQkJLy8KLQkJaWYgKCFvbGREZWxlZ2F0ZVZhbHVlcy5pc0VtcHR5KCkpCi0JCXsKLQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCi0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBvbGREZWxlZ2F0ZVZhbHVlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCQkJewotCQkJCU9iamVjdCBjaGlsZCA9IGkubmV4dCgpOwotCQkJCQotCQkJCUlXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoSVdyYXBwZXJJdGVtUHJvdmlkZXIpdmFsdWVUb1dyYXBwZXJNYXAucmVtb3ZlKGNoaWxkKTsKLQkJCQlpZiAod3JhcHBlciAhPSBudWxsKQotCQkJCXsKLQkJCQkJd3JhcHBlci5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBJZiBhbnkgY2hpbGRyZW4gd2VyZSBhZGRlZCBvciByZW1vdmVkLCByZXNldCB0aGUgaW5kaWNlcy4KLQkJaWYgKGNoYW5nZWQpCi0JCXsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBkZWxlZ2F0ZVZhbHVlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgaW5kZXgrKykKLQkJCXsKLQkJCQkoKElXcmFwcGVySXRlbVByb3ZpZGVyKXZhbHVlVG9XcmFwcGVyTWFwLmdldChpLm5leHQoKSkpLnNldEluZGV4KGluZGV4KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JICAgIGlmICh2YWx1ZVRvV3JhcHBlck1hcCAhPSBudWxsKQotCSAgICB7Ci0JICAgICAgZm9yIChJdGVyYXRvciBpID0gdmFsdWVUb1dyYXBwZXJNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCSAgICAgIHsKLQkgICAgICAgICgoSURpc3Bvc2FibGUpaS5uZXh0KCkpLmRpc3Bvc2UoKTsKLQkgICAgICB9Ci0JICAgICAgdmFsdWVUb1dyYXBwZXJNYXAuY2xlYXIoKTsKLQkgICAgICB2YWx1ZVRvV3JhcHBlck1hcCA9IG51bGw7Ci0JICAgIH0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9Nb2RlbEZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9Nb2RlbEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ0ZmUyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvTW9kZWxGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuIEl0IHByb3ZpZGVzIGEKLSAqIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNb2RlbEZhY3RvcnkgZUlOU1RBTkNFID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5pbXBsLk1vZGVsRmFjdG9yeUltcGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3JkZXIgSW5mbzwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk9yZGVyIEluZm88L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9yZGVySW5mbyBjcmVhdGVPcmRlckluZm8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPcmRlckluZm9Db2xsZWN0aW9uIGNyZWF0ZU9yZGVySW5mb0NvbGxlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1vZGVsUGFja2FnZSBnZXRNb2RlbFBhY2thZ2UoKTsKLQotfSAvLyBNb2RlbEZhY3RvcnkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9Nb2RlbFBhY2thZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9Nb2RlbFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJkYTVlMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvTW9kZWxQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuIEl0IGNvbnRhaW5zCi0gKiBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxGYWN0b3J5Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAibW9kZWwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovLy9jb20vaWJtL3VtYS9lZGl0L3RuZy91dGlsL21vZGVsLmVjb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQudG5nLnV0aWwubW9kZWwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNb2RlbFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbAotCQkJLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuT3JkZXJJbmZvSW1wbCA8ZW0+T3JkZXIgSW5mbzwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldE9yZGVySW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBPUkRFUl9JTkZPID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9SREVSX0lORk9fX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdVSSBEczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9SREVSX0lORk9fX0dVSV9EUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZXN0YW1wPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9SREVSX0lORk9fX1RJTUVTVEFNUCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk9yZGVyIEluZm88L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9SREVSX0lORk9fRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5pbXBsLk9yZGVySW5mb0NvbGxlY3Rpb25JbXBsIDxlbT5PcmRlciBJbmZvIENvbGxlY3Rpb248L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuT3JkZXJJbmZvQ29sbGVjdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0T3JkZXJJbmZvQ29sbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBPUkRFUl9JTkZPX0NPTExFQ1RJT04gPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyIEluZm9zPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1JERVJfSU5GT19DT0xMRUNUSU9OX19PUkRFUl9JTkZPUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk9yZGVyIEluZm8gQ29sbGVjdGlvbjwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1JERVJfSU5GT19DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbyA8ZW0+T3JkZXIgSW5mbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3JkZXIgSW5mbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE9yZGVySW5mbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8jZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0T3JkZXJJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPcmRlckluZm9fTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8jZ2V0R1VJRHMgPGVtPkdVSSBEczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdVSSBEczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8jZ2V0R1VJRHMoKQotCSAqIEBzZWUgI2dldE9yZGVySW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3JkZXJJbmZvX0dVSURzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8jZ2V0VGltZXN0YW1wIDxlbT5UaW1lc3RhbXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGltZXN0YW1wPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbyNnZXRUaW1lc3RhbXAoKQotCSAqIEBzZWUgI2dldE9yZGVySW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3JkZXJJbmZvX1RpbWVzdGFtcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb24gPGVtPk9yZGVyIEluZm8gQ29sbGVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE9yZGVySW5mb0NvbGxlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbiNnZXRPcmRlckluZm9zIDxlbT5PcmRlciBJbmZvczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk9yZGVyIEluZm9zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb24jZ2V0T3JkZXJJbmZvcygpCi0JICogQHNlZSAjZ2V0T3JkZXJJbmZvQ29sbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0T3JkZXJJbmZvQ29sbGVjdGlvbl9PcmRlckluZm9zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTW9kZWxGYWN0b3J5IGdldE1vZGVsRmFjdG9yeSgpOwotCi19IC8vIE1vZGVsUGFja2FnZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL09yZGVySW5mby5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL09yZGVySW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTJlNGNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9PcmRlckluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBPcmRlckluZm8gZXh0ZW5kcyBFT2JqZWN0IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX01BTlVBTCA9ICJtYW51YWwiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogCi0JICogQHJldHVybgotCSAqIEBtb2RlbAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybgotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKi8KLQlFTGlzdCBnZXRHVUlEcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGltZXN0YW1wPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UaW1lc3RhbXA8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGltZXN0YW1wPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUaW1lc3RhbXAobG9uZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbFBhY2thZ2UjZ2V0T3JkZXJJbmZvX1RpbWVzdGFtcCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWxvbmcgZ2V0VGltZXN0YW1wKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvI2dldFRpbWVzdGFtcCA8ZW0+VGltZXN0YW1wPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRpbWVzdGFtcDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGltZXN0YW1wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUaW1lc3RhbXAobG9uZyB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9PcmRlckluZm9Db2xsZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvT3JkZXJJbmZvQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmU4ZGVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9PcmRlckluZm9Db2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogQ29sbGVjdGlvbiBvZiBvcmRlciBpbmZvcm1hdGlvbgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JkZXJJbmZvQ29sbGVjdGlvbiBleHRlbmRzIEVPYmplY3QgewotCi0JLyoqCi0JICogQHJldHVybgotCSAqIEBtb2RlbCB0eXBlPSJjb20uaWJtLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbyIKLQkgKiAgICAgICAgY29udGFpbmVtZW50PSJ0cnVlIgotCSAqLwotCUVMaXN0IGdldE9yZGVySW5mb3MoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2VkaXR1dGlsLmVjb3JlIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2VkaXR1dGlsLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTg3NjNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9lZGl0dXRpbC5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9Im1vZGVsIgotICAgIG5zVVJJPSJodHRwOi8vL2NvbS9pYm0vdW1hL2VkaXQvdG5nL3V0aWwvbW9kZWwuZWNvcmUiIG5zUHJlZml4PSJjb20uaWJtLnVtYS5lZGl0LnRuZy51dGlsLm1vZGVsIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPcmRlckluZm8iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Im1hbnVhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnVUlEcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGltZXN0YW1wIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FTG9uZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPcmRlckluZm9Db2xsZWN0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3JkZXJJbmZvcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9PcmRlckluZm8iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9lZGl0dXRpbC5nZW5tb2RlbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9lZGl0dXRpbC5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBjYTY0OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvZWRpdHV0aWwuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9jb20uaWJtLnVtYS5lZGl0LnRuZy9zcmMiCi0gICAgZWRpdERpcmVjdG9yeT0iL2NvbS5pYm0udW1hLnJlc291cmNlbWFuYWdlci5lZGl0L3NyYyIgZWRpdG9yRGlyZWN0b3J5PSIvY29tLmlibS51bWEucmVzb3VyY2VtYW5hZ2VyLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0iY29tLmlibS51bWEuZWRpdC50bmciIHJ1bnRpbWVKYXI9InRydWUiIG1vZGVsTmFtZT0iZWRpdHV0aWwiIGVkaXRQbHVnaW5DbGFzcz0iY29tLmlibS51bWEucmVzb3VyY2VtYW5hZ2VyLnByb3ZpZGVyLmVkaXR1dGlsRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0iY29tLmlibS51bWEucmVzb3VyY2VtYW5hZ2VyLnByZXNlbnRhdGlvbi5lZGl0dXRpbEVkaXRvclBsdWdpbiIKLSAgICBydW50aW1lQ29tcGF0aWJpbGl0eT0iZmFsc2UiPgotICA8Zm9yZWlnbk1vZGVsPkBtb2RlbDwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJNb2RlbCIgYmFzZVBhY2thZ2U9ImNvbS5pYm0udW1hLmVkaXQudG5nLnV0aWwiIGVjb3JlUGFja2FnZT0iZWRpdHV0aWwuZWNvcmUjLyI+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWRpdHV0aWwuZWNvcmUjLy9PcmRlckluZm8iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVkaXR1dGlsLmVjb3JlIy8vT3JkZXJJbmZvL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlZGl0dXRpbC5lY29yZSMvL09yZGVySW5mby9nVUlEcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlZGl0dXRpbC5lY29yZSMvL09yZGVySW5mb0NvbGxlY3Rpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVkaXR1dGlsLmVjb3JlIy8vT3JkZXJJbmZvQ29sbGVjdGlvbi9vcmRlckluZm9zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL01vZGVsRmFjdG9yeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL01vZGVsRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiZjE0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9Nb2RlbEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm9Db2xsZWN0aW9uOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBNb2RlbEZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgYW5kIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kZWxGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GTzoKLQkJCXJldHVybiBjcmVhdGVPcmRlckluZm8oKTsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19DT0xMRUNUSU9OOgotCQkJcmV0dXJuIGNyZWF0ZU9yZGVySW5mb0NvbGxlY3Rpb24oKTsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3JkZXJJbmZvIGNyZWF0ZU9yZGVySW5mbygpIHsKLQkJT3JkZXJJbmZvSW1wbCBvcmRlckluZm8gPSBuZXcgT3JkZXJJbmZvSW1wbCgpOwotCQlyZXR1cm4gb3JkZXJJbmZvOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3JkZXJJbmZvQ29sbGVjdGlvbiBjcmVhdGVPcmRlckluZm9Db2xsZWN0aW9uKCkgewotCQlPcmRlckluZm9Db2xsZWN0aW9uSW1wbCBvcmRlckluZm9Db2xsZWN0aW9uID0gbmV3IE9yZGVySW5mb0NvbGxlY3Rpb25JbXBsKCk7Ci0JCXJldHVybiBvcmRlckluZm9Db2xsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kZWxQYWNrYWdlIGdldE1vZGVsUGFja2FnZSgpIHsKLQkJcmV0dXJuIChNb2RlbFBhY2thZ2UpIGdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2RlbFBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vIE1vZGVsRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL01vZGVsUGFja2FnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL01vZGVsUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg4M2U0Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9Nb2RlbFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uIDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIE1vZGVsUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG9yZGVySW5mb0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgb3JkZXJJbmZvQ29sbGVjdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlCi0JICogcGFja2FnZSBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD4KLQkgKiBOb3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljIGZhY3RvcnkKLQkgKiBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gb2YgdGhlCi0JICogcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLCBpZiBvbmUgYWxyZWFkeSBleGlzdHMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbFBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1vZGVsUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsCi0JICogYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gU2ltcGxlIGRlcGVuZGVuY2llcyBhcmUKLQkgKiBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwgZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZwotCSAqIGFueXRoaW5nIGVsc2UuIFRoaXMgbWV0aG9kIGRyaXZlcyBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQKLQkgKiBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwgd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD4KLQkgKiBPZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoIGhhdmUgbm90Ci0JICogeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkIGFuZCByZWdpc3RlcmVkLgotCSAqIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6IG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IKLQkgKiBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkgYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUKLQkgKiBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0byB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPgotCSAqIEludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUgYWxyZWFkeQotCSAqIGJlZW4gaW5pdGlhbGl6ZWQuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1vZGVsUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpCi0JCQlyZXR1cm4gKE1vZGVsUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UKLQkJCQkJLmdldEVQYWNrYWdlKE1vZGVsUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCU1vZGVsUGFja2FnZUltcGwgdGhlTW9kZWxQYWNrYWdlID0gKE1vZGVsUGFja2FnZUltcGwpIChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRQotCQkJCS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIE1vZGVsUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRQotCQkJCS5nZXRFUGFja2FnZShlTlNfVVJJKQotCQkJCTogbmV3IE1vZGVsUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZU1vZGVsUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZU1vZGVsUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVNb2RlbFBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZU1vZGVsUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRPcmRlckluZm8oKSB7Ci0JCXJldHVybiBvcmRlckluZm9FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE9yZGVySW5mb19OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIG9yZGVySW5mb0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPcmRlckluZm9fR1VJRHMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgb3JkZXJJbmZvRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE9yZGVySW5mb19UaW1lc3RhbXAoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgb3JkZXJJbmZvRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0T3JkZXJJbmZvQ29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIG9yZGVySW5mb0NvbGxlY3Rpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE9yZGVySW5mb0NvbGxlY3Rpb25fT3JkZXJJbmZvcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBvcmRlckluZm9Db2xsZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbEZhY3RvcnkgZ2V0TW9kZWxGYWN0b3J5KCkgewotCQlyZXR1cm4gKE1vZGVsRmFjdG9yeSkgZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiBUaGlzIG1ldGhvZCBpcyBndWFyZGVkIHRvCi0JICogaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKQotCQkJcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlvcmRlckluZm9FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoT1JERVJfSU5GTyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUob3JkZXJJbmZvRUNsYXNzLCBPUkRFUl9JTkZPX19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShvcmRlckluZm9FQ2xhc3MsIE9SREVSX0lORk9fX0dVSV9EUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUob3JkZXJJbmZvRUNsYXNzLCBPUkRFUl9JTkZPX19USU1FU1RBTVApOwotCi0JCW9yZGVySW5mb0NvbGxlY3Rpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoT1JERVJfSU5GT19DT0xMRUNUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShvcmRlckluZm9Db2xsZWN0aW9uRUNsYXNzLAotCQkJCU9SREVSX0lORk9fQ09MTEVDVElPTl9fT1JERVJfSU5GT1MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKQotCQkJcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcygKLQkJCQlvcmRlckluZm9FQ2xhc3MsCi0JCQkJT3JkZXJJbmZvLmNsYXNzLAotCQkJCSJPcmRlckluZm8iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0T3JkZXJJbmZvX05hbWUoKSwKLQkJCQllY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLAotCQkJCSJuYW1lIiwgbnVsbCwgMCwgMSwgT3JkZXJJbmZvLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE9yZGVySW5mb19HVUlEcygpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksCi0JCQkJImdVSURzIiwgbnVsbCwgMCwgLTEsIE9yZGVySW5mby5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRPcmRlckluZm9fVGltZXN0YW1wKCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVMb25nKCksCi0JCQkJInRpbWVzdGFtcCIsIG51bGwsIDAsIDEsIE9yZGVySW5mby5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJb3JkZXJJbmZvQ29sbGVjdGlvbkVDbGFzcywKLQkJCQlPcmRlckluZm9Db2xsZWN0aW9uLmNsYXNzLAotCQkJCSJPcmRlckluZm9Db2xsZWN0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE9yZGVySW5mb0NvbGxlY3Rpb25fT3JkZXJJbmZvcygpLAotCQkJCXRoaXMuZ2V0T3JkZXJJbmZvKCksCi0JCQkJbnVsbCwKLQkJCQkib3JkZXJJbmZvcyIsIG51bGwsIDAsIC0xLCBPcmRlckluZm9Db2xsZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotfSAvLyBNb2RlbFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9PcmRlckluZm9Db2xsZWN0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvT3JkZXJJbmZvQ29sbGVjdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U4NTAxYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9PcmRlckluZm9Db2xsZWN0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuT3JkZXJJbmZvQ29sbGVjdGlvbkltcGwjZ2V0T3JkZXJJbmZvcyA8ZW0+T3JkZXIgSW5mb3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3JkZXJJbmZvQ29sbGVjdGlvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzCi0JCU9yZGVySW5mb0NvbGxlY3Rpb24gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yZGVySW5mb3MoKSA8ZW0+T3JkZXIgSW5mb3M8L2VtPn0nCi0JICogY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldE9yZGVySW5mb3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBvcmRlckluZm9zID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT3JkZXJJbmZvQ29sbGVjdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRPcmRlckluZm9Db2xsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRPcmRlckluZm9zKCkgewotCQlpZiAob3JkZXJJbmZvcyA9PSBudWxsKSB7Ci0JCQlvcmRlckluZm9zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE9yZGVySW5mby5jbGFzcywgdGhpcywKLQkJCQkJTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fQ09MTEVDVElPTl9fT1JERVJfSU5GT1MpOwotCQl9Ci0JCXJldHVybiBvcmRlckluZm9zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX0NPTExFQ1RJT05fX09SREVSX0lORk9TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldE9yZGVySW5mb3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCQltc2dzKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsCi0JCQkJCQltc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19DT0xMRUNUSU9OX19PUkRFUl9JTkZPUzoKLQkJCXJldHVybiBnZXRPcmRlckluZm9zKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19DT0xMRUNUSU9OX19PUkRFUl9JTkZPUzoKLQkJCWdldE9yZGVySW5mb3MoKS5jbGVhcigpOwotCQkJZ2V0T3JkZXJJbmZvcygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fQ09MTEVDVElPTl9fT1JERVJfSU5GT1M6Ci0JCQlnZXRPcmRlckluZm9zKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19DT0xMRUNUSU9OX19PUkRFUl9JTkZPUzoKLQkJCXJldHVybiBvcmRlckluZm9zICE9IG51bGwgJiYgIW9yZGVySW5mb3MuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy8gT3JkZXJJbmZvQ29sbGVjdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL09yZGVySW5mb0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL09yZGVySW5mb0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJjZjI1OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9PcmRlckluZm9JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbzsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PcmRlciBJbmZvPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuT3JkZXJJbmZvSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuT3JkZXJJbmZvSW1wbCNnZXRHVUlEcyA8ZW0+R1VJIERzPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuT3JkZXJJbmZvSW1wbCNnZXRUaW1lc3RhbXAgPGVtPlRpbWVzdGFtcDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPcmRlckluZm9JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBPcmRlckluZm8gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHVUlEcygpIDxlbT5HVUkgRHM8L2VtPn0nIGF0dHJpYnV0ZQotCSAqIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEdVSURzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZ1VJRHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVzdGFtcCgpIDxlbT5UaW1lc3RhbXA8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRUaW1lc3RhbXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgbG9uZyBUSU1FU1RBTVBfRURFRkFVTFQgPSAwTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVzdGFtcCgpIDxlbT5UaW1lc3RhbXA8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRUaW1lc3RhbXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBsb25nIHRpbWVzdGFtcCA9IFRJTUVTVEFNUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT3JkZXJJbmZvSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE9yZGVySW5mbygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCU1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRHVUlEcygpIHsKLQkJaWYgKGdVSURzID09IG51bGwpIHsKLQkJCWdVSURzID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywKLQkJCQkJTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX0dVSV9EUyk7Ci0JCX0KLQkJcmV0dXJuIGdVSURzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRUaW1lc3RhbXAoKSB7Ci0JCXJldHVybiB0aW1lc3RhbXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChsb25nIG5ld1RpbWVzdGFtcCkgewotCQlsb25nIG9sZFRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKLQkJdGltZXN0YW1wID0gbmV3VGltZXN0YW1wOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fVElNRVNUQU1QLCBvbGRUaW1lc3RhbXAsIHRpbWVzdGFtcCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX05BTUU6Ci0JCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19HVUlfRFM6Ci0JCQlyZXR1cm4gZ2V0R1VJRHMoKTsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fVElNRVNUQU1QOgotCQkJcmV0dXJuIG5ldyBMb25nKGdldFRpbWVzdGFtcCgpKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19OQU1FOgotCQkJc2V0TmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX0dVSV9EUzoKLQkJCWdldEdVSURzKCkuY2xlYXIoKTsKLQkJCWdldEdVSURzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX1RJTUVTVEFNUDoKLQkJCXNldFRpbWVzdGFtcCgoKExvbmcpIG5ld1ZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fTkFNRToKLQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX0dVSV9EUzoKLQkJCWdldEdVSURzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fVElNRVNUQU1QOgotCQkJc2V0VGltZXN0YW1wKFRJTUVTVEFNUF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX05BTUU6Ci0JCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhuYW1lKTsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fR1VJX0RTOgotCQkJcmV0dXJuIGdVSURzICE9IG51bGwgJiYgIWdVSURzLmlzRW1wdHkoKTsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fVElNRVNUQU1QOgotCQkJcmV0dXJuIHRpbWVzdGFtcCAhPSBUSU1FU1RBTVBfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ1VJRHM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZ1VJRHMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRpbWVzdGFtcDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh0aW1lc3RhbXApOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy8gT3JkZXJJbmZvSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDgyYWMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3Igb3JkZXJpbmcgY29udGVudCBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YyM2JiMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIG9yZGVyaW5nIGNvbnRlbnQgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3V0aWwvTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3V0aWwvTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWU5MTI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC91dGlsL01vZGVsQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm9Db2xsZWN0aW9uOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4gSXQKLSAqIHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlCi0gKiBtb2RlbC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBNb2RlbFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kZWxBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mCi0JICogdGhlIG1vZGVsLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTW9kZWxTd2l0Y2ggbW9kZWxTd2l0Y2ggPSBuZXcgTW9kZWxTd2l0Y2goKSB7Ci0JCXB1YmxpYyBPYmplY3QgY2FzZU9yZGVySW5mbyhPcmRlckluZm8gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlT3JkZXJJbmZvQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlT3JkZXJJbmZvQ29sbGVjdGlvbihPcmRlckluZm9Db2xsZWN0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU9yZGVySW5mb0NvbGxlY3Rpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlcikgbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpIHRhcmdldCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvIDxlbT5PcmRlciBJbmZvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKLQkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCi0JICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU9yZGVySW5mb0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb24gPGVtPk9yZGVyIEluZm8gQ29sbGVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0Ci0JICogd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7IGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZQotCSAqIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlT3JkZXJJbmZvQ29sbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcwotCSAqIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvLyBNb2RlbEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9Nb2RlbFN3aXRjaC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3V0aWwvTW9kZWxTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5MTZjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9Nb2RlbFN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZQotICogaGllcmFyY2h5LiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdCBhbmQgcHJvY2VlZGluZyB1cCB0aGUKLSAqIGluaGVyaXRhbmNlIGhpZXJhcmNoeSB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwgd2hpY2ggaXMgdGhlCi0gKiByZXN1bHQgb2YgdGhlIHN3aXRjaC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBNb2RlbFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kZWxTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUKLQkgKiByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4KLQkgKiAgICAgICAgIGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lCi0JICogcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+Ci0JICogICAgICAgICBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9IGVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuIGVTdXBlclR5cGVzLmlzRW1wdHkoKSA/IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDogZG9Td2l0Y2goCi0JCQkJCShFQ2xhc3MpIGVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lCi0JICogcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+Ci0JICogICAgICAgICBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPOiB7Ci0JCQlPcmRlckluZm8gb3JkZXJJbmZvID0gKE9yZGVySW5mbykgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlT3JkZXJJbmZvKG9yZGVySW5mbyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fQ09MTEVDVElPTjogewotCQkJT3JkZXJJbmZvQ29sbGVjdGlvbiBvcmRlckluZm9Db2xsZWN0aW9uID0gKE9yZGVySW5mb0NvbGxlY3Rpb24pIHRoZUVPYmplY3Q7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY2FzZU9yZGVySW5mb0NvbGxlY3Rpb24ob3JkZXJJbmZvQ29sbGVjdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3JkZXIgSW5mbzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsgcmV0dXJuaW5nIGEKLQkgKiBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PcmRlciBJbmZvPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VPcmRlckluZm8oT3JkZXJJbmZvIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQotCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk9yZGVyIEluZm8gQ29sbGVjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlT3JkZXJJbmZvQ29sbGVjdGlvbihPcmRlckluZm9Db2xsZWN0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsgcmV0dXJuaW5nIGEKLQkgKiBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZQotCSAqIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvLyBNb2RlbFN3aXRjaApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3V0aWwvU3RyaW5nUmVzb3VyY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC91dGlsL1N0cmluZ1Jlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNWRlNGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3V0aWwvU3RyaW5nUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nQnVmZmVySW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VJbXBsOwotCi0vKioKLSAqIFJlc291cmNlIHRvIHN0b3JlIHN0cmluZwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ1Jlc291cmNlIGV4dGVuZHMgWE1JUmVzb3VyY2VJbXBsIHsKLQlwcml2YXRlIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQ7Ci0KLQlwcml2YXRlIFN0cmluZyBzdHI7Ci0KLQlwdWJsaWMgU3RyaW5nUmVzb3VyY2UoU3RyaW5nIHN0cikgewotCQl0aGlzLnN0ciA9IHN0cjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCXRyeSB7Ci0JCQlzYXZlKG91dCwgb3B0aW9ucyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlvdXQuY2xvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotCQlpZiAob3V0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGVuY29kaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBvdXQudG9TdHJpbmcoKTsKLQkJfQotCQl0cnkgewotCQkJcmV0dXJuIG91dC50b1N0cmluZyhlbmNvZGluZyk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoIWlzTG9hZGVkKSB7Ci0JCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbShzdHIpOwotCQkJdHJ5IHsKLQkJCQlsb2FkKGlucHV0U3RyZWFtLCBvcHRpb25zKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3V0aWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3V0aWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzFhYWYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIG9yZGVyaW5nIGNvbnRlbnQgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3OGI3NDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGVkaXRpbmcgYW5kIHF1ZXJ5aW5nIHN1cHBvcnQgZm9yIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9BYnN0cmFjdFN0cmluZ1ZhbGlkYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0Fic3RyYWN0U3RyaW5nVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZjI2OGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0Fic3RyYWN0U3RyaW5nVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0cmluZ1ZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IgewotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBpc1ZhbGlkKE9iamVjdCB2YWx1ZSkgewotCQlpZih2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJU3RyaW5nIG1zZyA9IGlzVmFsaWQoKFN0cmluZyl2YWx1ZSk7Ci0JCQlpZihtc2cgPT0gbnVsbCkgewotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksCi0JCQkJCQkwLCBtc2csIG51bGwpOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2suamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9DaXJjdWxhckRlcGVuZGVuY3lDaGVjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjY5OTZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9DaXJjdWxhckRlcGVuZGVuY3lDaGVjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkb2VzIGNpcmN1bGFyIGRlcGVuZGVuY3kgY2hlY2sKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDaXJjdWxhckRlcGVuZGVuY3lDaGVjayB7Ci0JCQotCXByaXZhdGUgRGVwZW5kZW5jeUluZm9NZ3IgZGVwSW5mb01ncjsKLQlwcml2YXRlIElEZXBlbmRlbmN5SW5mbyB2ZUluZm87Ci0JcHJpdmF0ZSBib29sZWFuIG1vdmUgPSBmYWxzZTsKLQkKLQlwdWJsaWMgQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2soRGVwZW5kZW5jeUluZm9NZ3IgbWdyLCBWYXJpYWJpbGl0eUVsZW1lbnQgdmUsCi0JCQkJCQkJCWJvb2xlYW4gZmlsdGVyLCBib29sZWFuIG1vdmUpIHsKLQkJZGVwSW5mb01nciA9IG1ncjsKLQkJdmVJbmZvID0gZGVwSW5mb01nci5yZWdpc3RlclZhcmlhYmlsaXR5RWxlbWVudCh2ZSwgZmlsdGVyLCBmYWxzZSk7Ci0JCXRoaXMubW92ZSA9IG1vdmU7Ci0JfQotCQotCXByb3RlY3RlZCBEZXBlbmRlbmN5SW5mb01nciBnZXREZXBJbmZvTWdyKCkgewotCQlyZXR1cm4gZGVwSW5mb01ncjsKLQl9Ci0JCi0JcHJvdGVjdGVkIElEZXBlbmRlbmN5SW5mbyBnZXRWZUluZm8oKSB7Ci0JCXJldHVybiB2ZUluZm87Ci0JfQotCQkKLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCi0JCWlmIChyZWFjaGFibGUob2JqLCB0cnVlLCB0cnVlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAobW92ZSkgewotCQkJaWYoIShvYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpKSByZXR1cm4gdHJ1ZTsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBvYmpWZUJhc2UgPSAoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAob2JqVmVCYXNlICE9IG51bGwpIHsKLQkJCQlJRGVwZW5kZW5jeUluZm8gaW5mbyA9IGRlcEluZm9NZ3IucmVnaXN0ZXJWYXJpYWJpbGl0eUVsZW1lbnQob2JqVmVCYXNlLCBmYWxzZSwgZmFsc2UpOwkKLQkJCQlpZiAoaW5mby5yZWFjaGFibGVCeSh2ZUluZm8pKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiByZWFjaGFibGUoT2JqZWN0IG9iaiwgYm9vbGVhbiBjaGVja1JlYWNoYWJsZUJ5T2JqLCBib29sZWFuIGNoZWNrUmVhY2hhYmxlVG9PYmopIHsKLQkJaWYgKCEgKG9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgdmVJbmZvLmdldEVsZW1lbnQoKTsKLQkJaWYgKHZlID09IG9iaikgewotCQkJcmV0dXJuIHRydWU7CQkJCi0JCX0KLQotCQlJRGVwZW5kZW5jeUluZm8gb2JqVmVJbmZvID0gZGVwSW5mb01nci5yZWdpc3RlclZhcmlhYmlsaXR5RWxlbWVudCggKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqLCBmYWxzZSwgbW92ZSk7CQkKLQkJCi0JCWlmIChjaGVja1JlYWNoYWJsZUJ5T2JqICYmIHZlSW5mby5yZWFjaGFibGVCeShvYmpWZUluZm8pKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKGNoZWNrUmVhY2hhYmxlVG9PYmogJiYgb2JqVmVJbmZvLnJlYWNoYWJsZUJ5KHZlSW5mbykpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9CQkKLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9CQotCQotCXB1YmxpYyBib29sZWFuIHJlYWNoYWJsZUJ5KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHJlYWNoYWJsZShvYmosIHRydWUsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcmVhY2hhYmxlVG8oT2JqZWN0IG9iaikgewotCQlyZXR1cm4gcmVhY2hhYmxlKG9iaiwgZmFsc2UsIHRydWUpOwotCX0JCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2tGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9DaXJjdWxhckRlcGVuZGVuY3lDaGVja0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjc1M2FkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9DaXJjdWxhckRlcGVuZGVuY3lDaGVja0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBmaWx0ZXIgZm9yIGNpcmN1bGFyIGRlcGVuZGVuY3kgY2hlY2sKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDaXJjdWxhckRlcGVuZGVuY3lDaGVja0ZpbHRlciBleHRlbmRzIENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrIGltcGxlbWVudHMgSUZpbHRlciB7CQotCQotCXByaXZhdGUgTWFwIGFuY2VzdG9yTWFwOwotCQotCQotCXB1YmxpYyBDaXJjdWxhckRlcGVuZGVuY3lDaGVja0ZpbHRlcihEZXBlbmRlbmN5SW5mb01nciBtZ3IsIFZhcmlhYmlsaXR5RWxlbWVudCB2ZSkgewotCQlzdXBlcihtZ3IsIHZlLCB0cnVlLCBmYWxzZSk7Ci0JCQotCQkKLQkJCi0JfQkJCQotCQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBzdXBlci5hY2NlcHQob2JqKTsKLQl9Ci0JCi0vKglwdWJsaWMgc3RhdGljIGJvb2xlYW4gVmVUb0NoZWNrKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIAlvYmogaW5zdGFuY2VvZiBEb21haW4gfHwgCQkJCS8vZ2V0U3ViZG9tYWlucwotCQkJCW9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5IHx8IAkJLy9nZXRTdWJDYXRlZ29yaWVzCi0JCQkJb2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QgfHwgCQkJCS8vZ2V0Q29udGFpbmVkQXJ0aWZhY3RzCi0JCQkJb2JqIGluc3RhbmNlb2YgUHJhY3RpY2UgfHwgCQkJCS8vZ2V0U3ViUHJhY3RpY2VzCi0JCQkJb2JqIGluc3RhbmNlb2YgRGVsaXZlcmFibGUgfHwJCQkvL2dldERlbGl2ZXJlZFdvcmtQcm9kdWN0cwotCQkJCW9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5OwkJCQkvL2dldEJyZWFrZG93bkVsZW1lbnRzCi0JfSovCi0JCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vRGVwZW5kZW5jeUNoZWNrZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9EZXBlbmRlbmN5Q2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjdlMGJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9EZXBlbmRlbmN5Q2hlY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhhcyBzdGF0aWMgbWV0aG9kcyB0aGF0IGNoZWNrIGZvciBjeWNsZXMgaW4gdGhlIGVsZW1lbnQgZGVwZW5kZW5jeQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGVwZW5kZW5jeUNoZWNrZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIElTdGF0dXMgRVJST1JfU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBuZXdDaGVjayAJCT0gdHJ1ZTsJCQkvL3RlbXAgZmxhZywgd2lsbCBiZSByZW1vdmVkIQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBuZXdDaGVja0FjdCAJPSB0cnVlOwkJCS8vdGVtcCBmbGFnLCB3aWxsIGJlIHJlbW92ZWQhCi0KLQkvKioKLQkgKiBDaGVja3MgZm9yIHRoZSBjeWNsZXMgaW4gdGhlIGRlcGVuZGVuY3kgZ3JhcGggb2YgdGhlIGdpdmVuIGZlYXR1cmUgaWYgdGhlCi0JICogZ2l2ZW4gdmFsdWUgaXMgYWRkZWQvYXNzaWduZWQgdG8gaXQuCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICB0aGUgb3duZXIgb2YgdGhlIGZlYXR1cmUKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgdGhlIGZlYXR1cmUgdG8gY2hlY2sgZm9yIGNpcmN1bGFyIGRlcGVuZGVuY3kKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBiZSBhZGRlZC9hc3NpZ25lZCB0byB0aGUgZmVhdHVyZQotCSAqIEByZXR1cm4gY2hlY2sgc3RhdHVzLCBPSyBpZiBubyBjeWNsZSwgRVJST1IgaWYgdGhlcmUgd2lsbCBiZSBjaXJjdWxhcgotCSAqICAgICAgICAgZGVwZW5kZW5jeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjaGVja0NpcmN1bGFyRGVwZW5kZW5jeShFT2JqZWN0IG93bmVyLAotCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFMpIHsKLQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIG93bmVyOwotCQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQkJcmV0dXJuIGNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdGl2aXR5LCAoQWN0aXZpdHkpIHZhbHVlLCB0eXBlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCkgewotCQkJaWYgKGlzQ2lyY3VsYXJEZXBlbmRlbmN5KChWYXJpYWJpbGl0eUVsZW1lbnQpIG93bmVyLAotCQkJCQkoVmFyaWFiaWxpdHlFbGVtZW50KSB2YWx1ZSkpIHsKLQkJCQlyZXR1cm4gRVJST1JfU1RBVFVTOwotCQkJfQotCQl9IGVsc2UgaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFMpIHsKLQkJCWlmICghY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcygoRGVsaXZlcmFibGUpdmFsdWUsIChEZWxpdmVyYWJsZSlvd25lcikpIHsKLQkJCQlyZXR1cm4gRVJST1JfU1RBVFVTOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKHZhbHVlKSB7Ci0KLQkJCQkJLyoqCi0JCQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkJCSAqLwotCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwTDsKLQotCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJaWYgKGZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKS5pc0luc3RhbmNlKG9iamVjdCkpIHsKLQkJCQkJCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQkJCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQkJCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQkJaWYgKGZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKS5pc0luc3RhbmNlKAotCQkJCQkJCQkJCQllbGVtZW50KSkgewotCQkJCQkJCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlyZXR1cm4gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCQl9Ci0KLQkJCQl9OwotCi0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCWlmIChpdGVyLm5leHQoKSA9PSBvd25lcikgewotCQkJCQkJcmV0dXJuIEVSUk9SX1NUQVRVUzsKLQkJCQkJfQotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpLmlzSW5zdGFuY2UodmFsdWUpKSB7Ci0JCQkJCUVPYmplY3QgdiA9IChFT2JqZWN0KSB2YWx1ZTsKLQkJCQkJZG8gewotCQkJCQkJaWYgKHYgPT0gb3duZXIpIHsKLQkJCQkJCQlyZXR1cm4gRVJST1JfU1RBVFVTOwotCQkJCQkJfQotCQkJCQkJT2JqZWN0IG8gPSB2LmVHZXQoZmVhdHVyZSk7Ci0JCQkJCQlpZiAoZmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpLmlzSW5zdGFuY2UobykpIHsKLQkJCQkJCQl2ID0gKEVPYmplY3QpIG87Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXYgPSBudWxsOwotCQkJCQkJfQotCQkJCQl9IHdoaWxlICh2ICE9IG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeSBpZiB0aGUgZ2l2ZW4gYWN0aXZpdHkgaXMgYXBwbGllZCB0byB0aGUKLQkgKiBnaXZlbiB0YXJnZXQgYWN0aXZpdHkgdmlhIGV4dGVuZCBvciBjb3B5LgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eSBhY3Rpdml0eSB0byBhcHBseQotCSAqIEBwYXJhbSB0YXJnZXQgdGFyZ2V0IGFjdGl2aXR5IHRvIGFkZCBleHRlbnNpb24gb3IgY29weSBvZiB0aGUgZ2l2ZW4gYWN0aXZpdHkKLQkgKiBAcmV0dXJuIHN0YXR1cyBvZiB0aGlzIGNoZWNrCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KEFjdGl2aXR5IGFjdGl2aXR5LCBBY3Rpdml0eSB0YXJnZXQpIHsKLQkJaWYgKGlzUGFyZW50KGFjdGl2aXR5LCB0YXJnZXQpKSB7Ci0JCQlPYmplY3RbXSBhcmdzID0geyB0YXJnZXQuZ2V0TmFtZSgpIH07Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUwotCQkJCQkuYmluZCgKLQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cxLAotCQkJCQkJCWFyZ3MpOwotCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9Ci0JCVByb2Nlc3MgcHJvY2VzcyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyh0YXJnZXQpOwotCQlpZighbmV3Q2hlY2tBY3QgJiYgaGFzQ3ljbGljRGVwZW5kZW5jeShhY3Rpdml0eSwgcHJvY2VzcykgfHwKLQkJCQluZXdDaGVja0FjdCAmJiBzb3VyY2VSZWFjaGFibGVCeVRhcmdldChhY3Rpdml0eSwgdGFyZ2V0KSkgewotCQkJT2JqZWN0W10gYXJncyA9IHsgYWN0aXZpdHkuZ2V0TmFtZSgpLCBwcm9jZXNzLmdldE5hbWUoKSB9OwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZCgKLQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5hcHBseV9wYXR0ZXJuX2Vycm9yX21zZywKLQkJCQkJCQlhcmdzKTsKLQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRJZCgpLCAwLCBtZXNzYWdlLCBudWxsKTsKLQkJfQotCQllbHNlIGlmKFByb2Nlc3NVdGlsLmhhc0NvbnRyaWJ1dG9yT3JSZXBsYWNlcihhY3Rpdml0eSkpIHsKLQkJCU9iamVjdFtdIGFyZ3MgPSB7IGFjdGl2aXR5LmdldE5hbWUoKSwgcHJvY2Vzcy5nZXROYW1lKCkgfTsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnMSwKLQkJCQkJCQlhcmdzKTsKLQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRJZCgpLCAwLCBtZXNzYWdlLCBudWxsKTsKLQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc0N5Y2xpY0RlcGVuZGVuY3koQWN0aXZpdHkgYWN0aXZpdHksIFByb2Nlc3MgcHJvY2VzcykgewotCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGFjdGl2aXR5KSB7Ci0KLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMEw7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoQWN0aXZpdHkpIG9iamVjdCkKLQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJCX0KLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJfQotCi0JCX07Ci0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJVmFyaWFiaWxpdHlUeXBlIHZUeXBlID0gdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQlpZiAoYmFzZSAhPSBudWxsICYmICh2VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUykpIHsKLQkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsCi0JCQkJCQkuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgYmFzZSk7Ci0JCQkJaWYgKHByb2MgPT0gcHJvY2VzcykgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBwYXJlbnQgaXMgYSBzdXBlciBhY3Rpdml0eSBvZiBjaGlsZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGNoaWxkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BhcmVudChBY3Rpdml0eSBwYXJlbnQsIEJyZWFrZG93bkVsZW1lbnQgY2hpbGQpIHsKLQkJZm9yIChBY3Rpdml0eSBhY3QgPSBjaGlsZC5nZXRTdXBlckFjdGl2aXRpZXMoKTsgYWN0ICE9IG51bGw7IGFjdCA9IGFjdAotCQkJCS5nZXRTdXBlckFjdGl2aXRpZXMoKSkgewotCQkJaWYgKGFjdCA9PSBwYXJlbnQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGZvciBjeWNsZXMgaW4gZGVwZW5kZW5jeSBwYXRoIG9mIHRoZSBnaXZlbiBhY3Rpdml0eQotCSAqIDxjb2RlPmFjdDwvY29kZT4gaWYgPGNvZGU+YmFzZTwvY29kZT4gaXMgdGhlIGJhc2UgYWN0aXZpdHkgb2YKLQkgKiA8Y29kZT5hY3Q8L2NvZGU+IGZvciBnaXZlbiB2YXJpYWJpbGl0eSB0eXBlCi0JICogCi0JICogQHBhcmFtIGFjdAotCSAqIEBwYXJhbSBiYXNlCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KEFjdGl2aXR5IGFjdCwgQWN0aXZpdHkgYmFzZSwKLQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlKSB7Ci0JCXJldHVybiBjaGVja0NpcmN1bGFyRGVwZW5kZW5jeShhY3QsIGJhc2UsIHR5cGUsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5QWZ0ZXJGaWx0ZXJTZWxlY3Rpb24oQWN0aXZpdHkgYWN0LCBBY3Rpdml0eSBiYXNlLAotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUpIHsKLQkJcmV0dXJuIGNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdCwgYmFzZSwgdHlwZSwgdHJ1ZSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koQWN0aXZpdHkgYWN0LCBBY3Rpdml0eSBiYXNlLAotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUsIGJvb2xlYW4gZmlsdGVyaW5nKSB7Ci0JCWlmKChiYXNlIGluc3RhbmNlb2YgUHJvY2VzcykKLQkJCQkmJiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpICYmICEoYWN0IGluc3RhbmNlb2YgUHJvY2VzcykpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMzsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0SWQoKSwgMCwgbWVzc2FnZSwgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAoaXNQYXJlbnQoYmFzZSwgYWN0KSkgewotCQkJT2JqZWN0W10gYXJncyA9IHsgYWN0LmdldE5hbWUoKSB9OwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMKLQkJCQkJLmJpbmQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMSwKLQkJCQkJCQlhcmdzKTsKLQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRJZCgpLCAwLCBtZXNzYWdlLCBudWxsKTsKLQkJfSAKLQkJZWxzZSBpZiAobmV3Q2hlY2tBY3QgJiYgZmlsdGVyaW5nKSB7Ci0JCQlJRmlsdGVyIGZpbHRlciA9IGdldENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyKGFjdCk7Ci0JCQlpZiAoISBmaWx0ZXIuYWNjZXB0KGJhc2UpKSB7Ci0JCQkJT2JqZWN0W10gYXJncyA9IHsgYWN0LmdldE5hbWUoKSwgYmFzZS5nZXROYW1lKCkgfTsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IE5MUwotCQkJCQkJLmJpbmQoCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzIsCi0JCQkJCQkJCWFyZ3MpOwotCi0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0SWQoKSwgMCwgbWVzc2FnZSwgbnVsbCk7Ci0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQllbHNlIGlmIChpc0NpcmN1bGFyRGVwZW5kZW5jeShhY3QsIGJhc2UpKSB7Ci0JCQlPYmplY3RbXSBhcmdzID0geyBhY3QuZ2V0TmFtZSgpLCBiYXNlLmdldE5hbWUoKSB9OwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMKLQkJCQkJLmJpbmQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMiwKLQkJCQkJCQlhcmdzKTsKLQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRJZCgpLCAwLCBtZXNzYWdlLCBudWxsKTsKLQkJfQotCQkvLyBibG9jayBmb3IgY2hpbGRyZW4KLQkJZWxzZSBpZiAoUHJvY2Vzc1V0aWwuaGFzQ29udHJpYnV0b3JPclJlcGxhY2VyKGJhc2UpCi0JCQkJJiYgdHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUykgewotCQkJT2JqZWN0W10gYXJncyA9IHsgYWN0LmdldE5hbWUoKSwgYmFzZS5nZXROYW1lKCkgfTsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZywKLQkJCQkJCQlhcmdzKTsKLQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRJZCgpLCAwLCBtZXNzYWdlLCBudWxsKTsKLQkJfQotCQlQcm9jZXNzIHByb2Nlc3MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KTsKLQkJaWYocHJvY2VzcyAhPSBudWxsICYmIGhhc0N5Y2xpY0RlcGVuZGVuY3koYmFzZSwgcHJvY2VzcykpIHsKLQkJCU9iamVjdFtdIGFyZ3MgPSB7IGFjdC5nZXROYW1lKCksIGJhc2UuZ2V0TmFtZSgpIH07Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUwotCQkJCQkuYmluZCgKLQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cyLAotCQkJCQkJCWFyZ3MpOwotCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQotCS8qKgotCSAqIENoZWNrIGZvciBjaXJjdWxhciBkZXBlbmRlbmN5IGlmIDxjb2RlPmJhc2U8L2NvZGU+IGlzIHRoZSBiYXNlIGVsZW1lbnQKLQkgKiBvZiB0aGUgZ2l2ZW4gPGNvZGU+ZWxlbWVudDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGJhc2UKLQkgKiAgICAgICAgICAgIGJhc2UgZWxlbWVudAotCSAqIEByZXR1cm4gc3RhdHVzIHdoaWNoIGluZGljYXRlcyBjaXJjdWxhciBkZXBlbmVkZW5jeSBpcyBkZXRlY3RlZCBvciBub3QKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ2lyY3VsYXJEZXBlbmRlbmN5KFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50LAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UpIHsKLQkJLy8gc3RhbmRhcmQgY2hlY2sKLQkJLy8KLQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBiYXNlLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQl3aGlsZSAodHlwZSAhPSBWYXJpYWJpbGl0eVR5cGUuTkEpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGJhc2UuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKHZlICE9IG51bGwgJiYgdmUgPT0gZWxlbWVudCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWJhc2UgPSB2ZTsKLQkJCXR5cGUgPSB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgZ2l2ZW4gZGVsaXZlcmFibGVzIGxlYWRzIHRvIGNpcmN1bGFyIGRlcGVuZGVuY3kKLQkgKiAKLQkgKiBAcGFyYW0gdG9CZVBhcnQKLQkgKiBAcGFyYW0gZGVsaXZlcmFibGUKLQkgKiBAcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBpbmRpY2F0ZSB3aGV0aGVyIGNpcmN1bGFyIGRlcGVuZGVuY3kgaXMKLQkgKiAgICAgICAgIGRldGVjdGVkLCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBjaXJjdWxhciBkZXBlbmRlbmN5Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJEZWxpdmVyYWJsZXMoRGVsaXZlcmFibGUgdG9CZVBhcnQsCi0JCQlEZWxpdmVyYWJsZSBkZWxpdmVyYWJsZSkgewotCQlpZiAobmV3Q2hlY2spIHsKLQkJCXJldHVybiAhIHNvdXJjZVJlYWNoYWJsZUJ5VGFyZ2V0KHRvQmVQYXJ0LCBkZWxpdmVyYWJsZSk7Ci0JCX0KLQkJCi0JCWlmICh0b0JlUGFydCA9PSBkZWxpdmVyYWJsZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWphdmEudXRpbC5MaXN0IGRlbGl2ZXJhYmxlcyA9IHRvQmVQYXJ0LmdldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpOwotCQlpZiAoZGVsaXZlcmFibGVzICE9IG51bGwgJiYgZGVsaXZlcmFibGVzLnNpemUoKSA+IDApIHsKLQkJCWlmIChkZWxpdmVyYWJsZXMuY29udGFpbnMoZGVsaXZlcmFibGUpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBkZWxpdmVyYWJsZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCQlyZXR1cm4gY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcygoRGVsaXZlcmFibGUpIG9iaiwKLQkJCQkJCQlkZWxpdmVyYWJsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gQ3VzdG9tQ2F0ZWdvcnkgaXMgYW4gYW5jZXN0b3Igb2YgdGhlIGdpdmVuCi0JICogRGVzY2liYWJsZUVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gY2MKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbmNlc3Nvck9mKEN1c3RvbUNhdGVnb3J5IGNjLCBEZXNjcmliYWJsZUVsZW1lbnQgZSkgewotCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGNjLCBmYWxzZSkgewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJCXJldHVybiAoKEN1c3RvbUNhdGVnb3J5KSBvYmplY3QpLmdldENhdGVnb3JpemVkRWxlbWVudHMoKQotCQkJCQkJCS5pdGVyYXRvcigpOwotCQkJCX0KLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJfQotCi0JCX07Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJaWYgKGl0ZXIubmV4dCgpID09IGUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBjaXJjdWxhciBkZXBlbmRlbmN5IHdoZW4gbW92aW5nIGEgY29sbGVjdGlvbiBvZiBhcnRpZmFjdCBvYmplY3RzCi0JICogaW4gInNvdXJjZUVsZW1lbnRzIiB1bmRlciAiZGVzdGluYXRpb24iCi0JICogCi0JICogQHBhcmFtIGRlc3RpbmF0aW9uCi0JICogQHBhcmFtIHNvdXJjZUVsZW1lbnRzCi0JICogQHJldHVybiB0cnVlIGlmIG5vIGNpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQsIG90aGVyd2lzZSBmYWxzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0NpcmN1bGFyRm9yQXJ0aWZhY3RzKEFydGlmYWN0IGRlc3RpbmF0aW9uLAotCQkJQ29sbGVjdGlvbiBzb3VyY2VFbGVtZW50cykgewotCQlIYXNoU2V0IHZhcmlhbnRTZXQgPSBuZXcgSGFzaFNldCgpOwotCQljb2xsZWN0VmFyaWFudFNldChkZXN0aW5hdGlvbiwgdmFyaWFudFNldCwgVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKTsKLQkJY29sbGVjdFZhcmlhbnRTZXQoZGVzdGluYXRpb24sIHZhcmlhbnRTZXQsIFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKTsKLQkJaWYgKCEgY2hlY2tDaXJjdWxhckZvckFydGlmYWN0czEoZGVzdGluYXRpb24sIHNvdXJjZUVsZW1lbnRzLCB2YXJpYW50U2V0KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBjaGVja0NpcmN1bGFyRm9yQXJ0aWZhY3RzMihkZXN0aW5hdGlvbiwgc291cmNlRWxlbWVudHMpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJGb3JBcnRpZmFjdHMxKEFydGlmYWN0IGRlc3RpbmF0aW9uLAotCQkJQ29sbGVjdGlvbiBzb3VyY2VFbGVtZW50cywgSGFzaFNldCB2YXJpYW50U2V0KSB7Ci0JCWlmIChzb3VyY2VFbGVtZW50cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIEFydGlmYWN0KXsKLQkJCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgb2JqOwotCQkJCWlmICh2YXJpYW50U2V0LmNvbnRhaW5zKGFydGlmYWN0KSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmICghIGNoZWNrQ2lyY3VsYXJGb3JBcnRpZmFjdHMxKGRlc3RpbmF0aW9uLCBhcnRpZmFjdC5nZXRDb250YWluZWRBcnRpZmFjdHMoKSwgdmFyaWFudFNldCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0JCQkKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjaGVja0NpcmN1bGFyRm9yQXJ0aWZhY3RzMihBcnRpZmFjdCBkZXN0aW5hdGlvbiwKLQkJCUNvbGxlY3Rpb24gc291cmNlRWxlbWVudHMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc291cmNlRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QgJiYgc291cmNlSXNPckFib3ZlTWUoKEFydGlmYWN0KSBvYmosIGRlc3RpbmF0aW9uKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0JCQkKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzb3VyY2VJc09yQWJvdmVNZShBcnRpZmFjdCBzb3VyY2UsIEFydGlmYWN0IG1lKSB7Ci0JCWlmIChzb3VyY2UgPT0gbWUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCU9iamVjdCBvYmogPSBtZS5nZXRDb250YWluZXJBcnRpZmFjdCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QgJiYgc291cmNlSXNPckFib3ZlTWUoc291cmNlLCAoQXJ0aWZhY3QpIG9iaikpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCW9iaiA9IG1lLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFydGlmYWN0ICYmIHNvdXJjZUlzT3JBYm92ZU1lKHNvdXJjZSwgKEFydGlmYWN0KSBvYmopKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvL0NvbGxlY3QgYWxsIHZhcmlhbnRzIG9mICJhIiBhbmQgImEicyBhbmNlc3Ryb3IgQXJ0aWZhY3Qgb2JqZWN0cwotCXByaXZhdGUgc3RhdGljIHZvaWQgY29sbGVjdFZhcmlhbnRTZXQoQXJ0aWZhY3QgYSwgSGFzaFNldCB2YXJpYW50U2V0LCBWYXJpYWJpbGl0eVR5cGUgdHlwZSkgewotCQl3aGlsZSAoYSAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBUbmdVdGlsLmdldEdlbmVyYWxpemVycyhhLCB0eXBlKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJdmFyaWFudFNldC5hZGQoaXRlci5uZXh0KCkpOwotCQkJfQotCQkJYSA9IGEuZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKTsKLQkJfQotCX0JCQkKLQkKLQlwcml2YXRlIHN0YXRpYyBDaXJjdWxhckRlcGVuZGVuY3lDaGVjayBnZXRDaXJjdWxhckRlcGVuZGVuY3lDaGVjayhWYXJpYWJpbGl0eUVsZW1lbnQgdmUsIAotCQkJCQlib29sZWFuIGZpbHRlciwgYm9vbGVhbiBtb3ZlLCBib29sZWFuIGRuZCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeSh2ZSk7CQkJCQkJCi0JCURlcGVuZGVuY3lJbmZvTWdyIGRlcEluZm9NZ3IgPSBuZXcgRGVwZW5kZW5jeUluZm9NZ3IobGliKTsKLQkJZGVwSW5mb01nci5zZXREbmRCaXQoZG5kKTsKLQkJcmV0dXJuIG5ldyBDaXJjdWxhckRlcGVuZGVuY3lDaGVjayhkZXBJbmZvTWdyLCB2ZSwgZmlsdGVyLCBtb3ZlIHx8IGRuZCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc291cmNlUmVhY2hhYmxlQnlUYXJnZXQoVmFyaWFiaWxpdHlFbGVtZW50IHNvdXJjZSwgVmFyaWFiaWxpdHlFbGVtZW50IHRhcmdldCkgewotCQlyZXR1cm4gZ2V0Q2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2soc291cmNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKS5yZWFjaGFibGVCeSh0YXJnZXQpOwotCX0KLQkKLQkvKioKLQkgKiByZXR1cm4gYSBjaXJjdWxhciBkZXBlbmRlbmN5IGNoZWNrIGZpbHRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZpbHRlciBnZXRDaXJjdWxhckRlcGVuZGVuY3lDaGVja0ZpbHRlcihWYXJpYWJpbGl0eUVsZW1lbnQgdmUpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkodmUpOwkJCQkJCQotCQlEZXBlbmRlbmN5SW5mb01nciBkZXBJbmZvTWdyID0gbmV3IERlcGVuZGVuY3lJbmZvTWdyKGxpYik7Ci0JCXJldHVybiBuZXcgQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2tGaWx0ZXIoZGVwSW5mb01nciwgdmUpOwotCX0JCi0JCi0JLy9SZXR1cm4gdHJ1ZSBpZiBubyBjaXJjdWxhciBkZXRlY3RlZAotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0NpcmN1bGFyRm9yTW92aW5nVmFyaWFiaWxpdHlFbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCBkZXN0aW5hdGlvbiwKLQkJCUNvbGxlY3Rpb24gc291cmNlRWxlbWVudHMpIHsKLQkJcmV0dXJuIGNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQoZGVzdGluYXRpb24sIHNvdXJjZUVsZW1lbnRzLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0NpcmN1bGFyRm9yTW92aW5nVmFyaWFiaWxpdHlFbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCBkZXN0aW5hdGlvbiwKLQkJCUNvbGxlY3Rpb24gc291cmNlRWxlbWVudHMsIGJvb2xlYW4gZG5kKSB7Ci0JCWlmICghIERlcGVuZGVuY3lJbmZvTWdyLlZlVG9DaGVjayhkZXN0aW5hdGlvbikpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlDaXJjdWxhckRlcGVuZGVuY3lDaGVjayBjaGVjayA9IGdldENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrKGRlc3RpbmF0aW9uLCBmYWxzZSwgdHJ1ZSwgZG5kKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHNvdXJjZUVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWlmICghIGNoZWNrLmFjY2VwdChpdC5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrQ2lyY3VsYXJGb3JBcHBseWluZ1ZhcmlhYmlsaXR5RWxlbWVudChWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSwKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSwgYm9vbGVhbiBkbmQpIHsKLQkJYm9vbGVhbiBvayA9IGNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQoYmFzZSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh2ZSksIHRydWUpOwotCQlpZiAoIW9rKSB7Ci0JCQlPYmplY3RbXSBhcmdzID0geyB2ZS5nZXROYW1lKCksIGJhc2UuZ2V0TmFtZSgpIH07Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUwotCQkJCQkuYmluZCgKLQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy52YXJpYWJpbGl0eV9lcnJvcl9tc2csCi0JCQkJCQkJYXJncyk7CQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRJZCgpLCAwLCBtZXNzYWdlLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5QWZ0ZXJGaWx0ZXJTZWxlY3Rpb24oVmFyaWFiaWxpdHlFbGVtZW50IHZlLCBWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSkgewotCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRDaXJjdWxhckRlcGVuZGVuY3lDaGVja0ZpbHRlcih2ZSk7Ci0JCQlpZiAoISBmaWx0ZXIuYWNjZXB0KGJhc2UpKSB7Ci0JCQkJT2JqZWN0W10gYXJncyA9IHsgdmUuZ2V0TmFtZSgpLCBiYXNlLmdldE5hbWUoKSB9OwotCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTCi0JCQkJCQkuYmluZCgKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMudmFyaWFiaWxpdHlfZXJyb3JfbXNnLAotCQkJCQkJCQlhcmdzKTsJCS8vTm90IHJpZ2h0IG1lc3NhZ2UsIG5lZWQgdG8gYWRkIGEgbmV3IHJlc291Y2Ugc3RyaW5nIGxhdGVyIQotCQotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9EZXBlbmRlbmN5SW5mb01nci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0RlcGVuZGVuY3lJbmZvTWdyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwM2Q2OTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0RlcGVuZGVuY3lJbmZvTWdyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5Qcm9maWxpbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIG1hbmFnZXMgY2lyY3VsYXIgZGVwZW5kZW5jeSBpbmZvLgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERlcGVuZGVuY3lJbmZvTWdyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHByb2ZpbGluZyA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgbGliOwotCXByaXZhdGUgTWFwIHJlYWNoYWJsZUluZm9NYXA7CS8ve2d1aWQsIHVwd2FyZFJlYWNoYWJsZUluZm99Ci0JcHJpdmF0ZSBNYXAgcmVwbGFjZXJNYXA7Ci0JcHJpdmF0ZSBNYXAgcHJvY2Vzc2VkOwotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBmaWx0ZXJFbGVtZW50OwotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBtb3ZlRWxlbWVudDsKLQlwcml2YXRlIExpc3QgY2lyY3VsYXJMaXN0OwotCXByaXZhdGUgYm9vbGVhbiBkbmRCaXQgPSBmYWxzZTsKLQkKLQlwdWJsaWMgRGVwZW5kZW5jeUluZm9NZ3IoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJdGhpcy5saWIgPSBsaWI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGxvZ0NpcmN1bGFyRGVwZW5kZW5jeShTdGFjayB0cmFjZSkgewotCQlpZiAoY2lyY3VsYXJMaXN0ID09IG51bGwpIHsKLQkJCWNpcmN1bGFyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQljaXJjdWxhckxpc3QuYWRkQWxsKHRyYWNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGdldEFuZENsZWFyQ2lyY3VsYXJMaXN0KCkgewotCQlMaXN0IHJldCA9IGNpcmN1bGFyTGlzdDsKLQkJY2lyY3VsYXJMaXN0ID0gbnVsbDsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNGaWx0ZXJFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbSkgewotCQlyZXR1cm4gZmlsdGVyRWxlbWVudCA9PSBlbGVtOwotCX0JCi0JCi0JcHVibGljIGJvb2xlYW4gaXNNb3ZlRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW0pIHsKLQkJcmV0dXJuIG1vdmVFbGVtZW50ID09IGVsZW07Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2coU3RyaW5nIG1zZykgewotCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2cobXNnKTsKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZG5lY3koVmFyaWFiaWxpdHlFbGVtZW50IHZlKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gdmU6ICIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgodmUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQlJRGVwZW5kZW5jeUluZm8gaW5mbyA9IHJlZ2lzdGVyVmFyaWFiaWxpdHlFbGVtZW50KHZlLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQlMaXN0IGNpckxpc3QgPSBnZXRBbmRDbGVhckNpcmN1bGFyTGlzdCgpOwotCQlib29sZWFuIGxvb3AgPSBjaXJMaXN0ICE9IG51bGwgJiYgIWNpckxpc3QuaXNFbXB0eSgpOwotCQlib29sZWFuIHJlcGxhY2luZ0FuY2VzdG9yID0gaW5mby5pbmhlcml0QW5jZXN0b3IoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKTsKLQkJYm9vbGVhbiBhY3RJbmhlcmVudGluZ0FuY2VzdG9yID0gZ2V0QWN0SW5lcmVudGluZ0FuY2VzdG9yKHZlKTsKLQkJCi0JCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKExpYnJhcnlFZGl0UGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCWlmIChsb29wKSB7Ci0JCQlsb2coIkVycm9yPiBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkOiAiKTsJCS8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGk9MDsgaTxjaXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJSURlcGVuZGVuY3lJbmZvIGxvb3BJbmZvID0gKElEZXBlbmRlbmN5SW5mbykgY2lyTGlzdC5nZXQoaSk7Ci0JCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gbG9vcEluZm8uZ2V0RWxlbWVudCgpOwkJCQkJCQkKLQkJCQlsb2coIkVycm9yPiAiICsgaSArICI6ICIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbSkpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJCi0JCQltdWx0aVN0YXR1cy5hZGQobmV3IFZhbGlkYXRpb25TdGF0dXMoSVN0YXR1cy5FUlJPUiwgMCwgZ2VuRXJyb3JNc2coY2lyTGlzdCksIHZlLCBudWxsKSk7CQkJCi0JCX0KLQkJaWYgKHJlcGxhY2luZ0FuY2VzdG9yKSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW0gPSBpbmZvLmdldEVsZW1lbnQoKTsKLQkJCWxvZygiRXJyb3I+ICIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbSkgKyAiIGlzIHJlcGxhY2luZyBhbiBhbmNlc3Rvci4iKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQotCQkJbXVsdGlTdGF0dXMuYWRkKG5ldyBWYWxpZGF0aW9uU3RhdHVzKElTdGF0dXMuRVJST1IsIDAsIExpYnJhcnlFZGl0UmVzb3VyY2VzLnJlcGxhY2luZ19hbmNlc3Rvcl9lcnJvcl9tc2csIHZlLCBudWxsKSk7CQkJCQkJCQotCQl9Ci0JCWlmIChhY3RJbmhlcmVudGluZ0FuY2VzdG9yKSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW0gPSBpbmZvLmdldEVsZW1lbnQoKTsKLQkJCW11bHRpU3RhdHVzLmFkZChuZXcgVmFsaWRhdGlvblN0YXR1cyhJU3RhdHVzLkVSUk9SLCAwLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5jaXJjdWxhcl9kZXBlbmRlbmN5X2Vycm9yX21zZywgdmUsIG51bGwpKTsJCQkJCQkJCi0JCX0KLQotCQkKLQkJCi0JCXJldHVybiBtdWx0aVN0YXR1czsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZ2V0QWN0SW5lcmVudGluZ0FuY2VzdG9yKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSkgewotCQlpZiAodmUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJQWN0aXZpdHkgYmFzZSA9IChBY3Rpdml0eSkgdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCWZvciAoQWN0aXZpdHkgYWN0ID0gKChBY3Rpdml0eSkgdmUpLmdldFN1cGVyQWN0aXZpdGllcygpOyAKLQkJCQkJCQkJCWFjdCAhPSBudWxsOyBhY3QgPSBhY3QuZ2V0U3VwZXJBY3Rpdml0aWVzKCkpIHsKLQkJCQkJaWYgKGFjdCA9PSBiYXNlKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsJCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZW5FcnJvck1zZyhMaXN0IGNpckxpc3QpIHsKLQkJU3RyaW5nIG1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnZhcmlhYmlsaXR5X2VsZW1lbnRfY2lyY3VsYXJfbG9vcF9lcnJvcl9tc2c7Ci0JCWZvciAoaW50IGk9MDsgaTxjaXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlJRGVwZW5kZW5jeUluZm8gbG9vcEluZm8gPSAoSURlcGVuZGVuY3lJbmZvKSBjaXJMaXN0LmdldChpKTsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IGxvb3BJbmZvLmdldEVsZW1lbnQoKTsJCi0JCQlpZiAoaSA+IDApIHsKLQkJCQltc2cgKz0gIjogIjsgLy8kTk9OLU5MUy0xJCAKLQkJCX0KLQkJCW1zZyArPSBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbSk7CQotCQl9Ci0JCXJldHVybiBtc2c7Ci0JfQotCQkJCi0JcHVibGljIElEZXBlbmRlbmN5SW5mbyByZWdpc3RlclZhcmlhYmlsaXR5RWxlbWVudChWYXJpYWJpbGl0eUVsZW1lbnQgdmUsIAotCQkJYm9vbGVhbglpc0ZpbHRlckVsZW1lbnQsIGJvb2xlYW4gaXNNb3ZlRWxlbWVudCkgewotCQlyZXR1cm4gcmVnaXN0ZXJWYXJpYWJpbGl0eUVsZW1lbnQodmUsIGlzRmlsdGVyRWxlbWVudCwgaXNNb3ZlRWxlbWVudCwgZmFsc2UpOwotCX0KLQkKLQlwcml2YXRlIElEZXBlbmRlbmN5SW5mbyByZWdpc3RlclZhcmlhYmlsaXR5RWxlbWVudChWYXJpYWJpbGl0eUVsZW1lbnQgdmUsIAotCQkJYm9vbGVhbglpc0ZpbHRlckVsZW1lbnQsIGJvb2xlYW4gaXNNb3ZlRWxlbWVudCwgYm9vbGVhbiBjaGVja0NpcmN1bGFyKSB7Ci0JCWlmIChpc0ZpbHRlckVsZW1lbnQpIHsKLQkJCWZpbHRlckVsZW1lbnQgPSB2ZTsKLQkJfQotCQlpZiAoaXNNb3ZlRWxlbWVudCkgewotCQkJbW92ZUVsZW1lbnQgPSB2ZTsKLQkJfQkJCi0JCUlEZXBlbmRlbmN5SW5mbyBpbmZvID0gIGdldFByb2Nlc3NlZEluZm8odmUpOwotCQlpZiAoaW5mbyA9PSBudWxsKSB7CQkKLQkJCWluZm8gPSBuZXdEZXBlbmRlbmN5SW5mbyh0aGlzLCB2ZSk7Ci0JCX0KLQkJaWYgKCEgaW5mby5pc0NvbXBsZXRlKCkpIHsKLQkJCWluZm8uYnVpbGQoY2hlY2tDaXJjdWxhcik7Ci0JCX0KLQkJcmV0dXJuIGluZm87Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NlZChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHByb2Nlc3NlZCAhPSBudWxsICYmIHByb2Nlc3NlZC5jb250YWluc0tleShlbGVtZW50LmdldEd1aWQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBJRGVwZW5kZW5jeUluZm8gZ2V0UHJvY2Vzc2VkSW5mbyhNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHByb2Nlc3NlZCA9PSBudWxsID8gbnVsbCA6IChJRGVwZW5kZW5jeUluZm8pIHByb2Nlc3NlZC5nZXQoZWxlbWVudC5nZXRHdWlkKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1Byb2Nlc3NlZChJRGVwZW5kZW5jeUluZm8gaW5mbykgewotCQlpZiAocHJvY2Vzc2VkID09IG51bGwpIHsKLQkJCXByb2Nlc3NlZCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJcHJvY2Vzc2VkLnB1dChpbmZvLmdldEVsZW1lbnQoKS5nZXRHdWlkKCksIGluZm8pOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1JlcGxhY2VyTWFwKElEZXBlbmRlbmN5SW5mbyByZXBsYWNlckluZm8pIHsKLQkJaWYgKHJlcGxhY2VyTWFwID09IG51bGwpIHsKLQkJCXJlcGxhY2VyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlyZXBsYWNlck1hcC5wdXQocmVwbGFjZXJJbmZvLmdldEVsZW1lbnQoKS5nZXRHdWlkKCksIHJlcGxhY2VySW5mbyk7Ci0JfQkKLQkJCi0JcHJpdmF0ZSBJRGVwZW5kZW5jeUluZm8gYWRkVG9SZWFjaGFibGVJbmZvTWFwKE1ldGhvZEVsZW1lbnQgZWxlbSkgewotCQlpZiAocmVhY2hhYmxlSW5mb01hcCA9PSBudWxsKSB7Ci0JCQlyZWFjaGFibGVJbmZvTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlJRGVwZW5kZW5jeUluZm8gaW5mbyA9IChJRGVwZW5kZW5jeUluZm8pIHJlYWNoYWJsZUluZm9NYXAuZ2V0KGVsZW0uZ2V0R3VpZCgpKTsKLQkJaWYgKGluZm8gPT0gbnVsbCkgewkJCi0JCQlpbmZvID0gbmV3RGVwZW5kZW5jeUluZm8odGhpcywgZWxlbSk7Ci0JCQlyZWFjaGFibGVJbmZvTWFwLnB1dChlbGVtLmdldEd1aWQoKSwgaW5mbyk7Ci0JCX0JCQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQkvKgotCSAqIERldGVjdCBjaXJjdWxhciBkZXBlbmRlbmN5IGZvciB0aGUgd2hvbGUgbGlicmFyeQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NpcmN1bGFyRGVwZW5kZW5jeSgpICB7Ci0JCWJ1aWxkUmVhY2hhYmxlSW5mb01hcCgpOwotCQkKLQkJYm9vbGVhbiByZXBsYWNpbmdBY2VzdG9yID0gZmFsc2U7Ci0JCWlmIChyZXBsYWNlck1hcCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVwbGFjZXJNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVVwd2FyZFJlYWNoYWJsZUluZm8gaW5mbyA9IChVcHdhcmRSZWFjaGFibGVJbmZvKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGluZm8uaW5oZXJpdEFuY2VzdG9yKFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUykpIHsKLQkJCQkJcmVwbGFjaW5nQWNlc3RvciA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChkZWJ1ZyAmJiBjaXJjdWxhckxpc3QgIT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gQ2lyY3VsYXIgbG9vcHMgZGV0ZWN0ZWQ6ICIpOwkvLyROT04tTkxTLTEkCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2lyY3VsYXJMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlTdGFjayBzdGFjayA9IChTdGFjaykgaXQubmV4dCgpOwotCQkJCWZvciAoaW50IGk9MDsgaTxzdGFjay5zaXplKCk7IGkrKykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiAiICsgKGkpICsgIjogIiArIHN0YWNrLmdldChpKSk7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHJlcGxhY2luZ0FjZXN0b3IgfHwgbnVtQ2lyY3VsYXJEZXBlbmRlbmN5KCkgPiAwOwotCX0KLQkKLQlwcml2YXRlIGludCBudW1DaXJjdWxhckRlcGVuZGVuY3koKSB7Ci0JCXJldHVybiBjaXJjdWxhckxpc3QgPT0gbnVsbCA/IDAgOiBjaXJjdWxhckxpc3Quc2l6ZSgpOwotCX0KLQkKLQkvL3RvIGJlIHNwZWNpYWxpemVkIGJ5IHN1YiBjbGFzc2VzCi0JcHJvdGVjdGVkIElEZXBlbmRlbmN5SW5mbyBuZXdEZXBlbmRlbmN5SW5mbyhEZXBlbmRlbmN5SW5mb01nciBtZ3IsIE1ldGhvZEVsZW1lbnQgZWxlbSkgewotCQlyZXR1cm4gIG5ldyBVcHdhcmRSZWFjaGFibGVJbmZvKHRoaXMsIGVsZW0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRSZWFjaGFibGVJbmZvTWFwKCkgewotCQlsb25nIHVzZWRNZW0wID0gMDsKLQkJUnVudGltZSBydCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpOyAKLQkJaWYgKHByb2ZpbGluZykgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWl0Lm5leHQoKTsKLQkJCX0KLQkJCVByb2ZpbGluZ1V0aWwuZnVsbEdDKCk7Ci0JCQl1c2VkTWVtMCA9IHJ0LnRvdGFsTWVtb3J5KCkgLSBydC5mcmVlTWVtb3J5KCk7Ci0JCX0KLQkJCi0JCWJ1aWxkUmVhY2hhYmxlSW5mb01hcF8oKTsKLQkJaWYgKHByb2ZpbGluZykgewotCQkJUHJvZmlsaW5nVXRpbC5mdWxsR0MoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHVzZWRNZW0wOiAiICsgdXNlZE1lbTAvMTAwMCArICIgayBieXRlcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWxvbmcgdXNlZE1lbTEgPSBydC50b3RhbE1lbW9yeSgpIC0gcnQuZnJlZU1lbW9yeSgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gdXNlZE1lbTE6ICIgKyB1c2VkTWVtMS8xMDAwICsgIiBrIGJ5dGVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZGlmZk1lbTogIiArICh1c2VkTWVtMSAtIHVzZWRNZW0wKS8xMDAwICsgIiBrIGJ5dGVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUmVhY2hhYmxlSW5mb01hcF8oKSB7Ci0JCXJlYWNoYWJsZUluZm9NYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlMaXN0IHBsdWdpbnMgPSBsaWIuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBwbHVnaW5zLmdldChpKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW4uZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJCWlmIChWZVRvQ2hlY2sob2JqKSkgewotCQkJCQlhZGRUb1JlYWNoYWJsZUluZm9NYXAoKE1ldGhvZEVsZW1lbnQpIG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVhY2hhYmxlSW5mb01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlJRGVwZW5kZW5jeUluZm8gaW5mbyA9IChJRGVwZW5kZW5jeUluZm8pIGl0Lm5leHQoKTsKLQkJCWlmICghIHByb2Nlc3NlZChpbmZvLmdldEVsZW1lbnQoKSkpIHsKLQkJCQlpbmZvLmJ1aWxkKHRydWUpOwotCQkJfQotCQl9CQotCi0JfQkKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBWZVRvQ2hlY2soT2JqZWN0IG9iaikgewotCQlyZXR1cm4gCW9iaiBpbnN0YW5jZW9mIERvbWFpbiB8fCAKLQkJCQlvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSB8fCAKLQkJCQlvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCB8fCAKLQkJCQlvYmogaW5zdGFuY2VvZiBQcmFjdGljZSB8fCAKLQkJCQlvYmogaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSB8fAotCQkJCW9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5OwotCX0KLQkKLQkvKgotCSAqIENoZWNrIGNpcmN1bGFyIGRlcGVuZGVuY3kgZm9yIHRoZSBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyBDaGVja1Jlc3VsdCBjaGVja0NpcmN1bGFyRGVwZW5kbmVjeShUcmFjZXIgdHJhY2VyKSB7Ci0JCWxvbmcgdXNlZE1lbTAgPSAwOwotCQlSdW50aW1lIHJ0ID0gUnVudGltZS5nZXRSdW50aW1lKCk7IAotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGliLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJaXQubmV4dCgpOwotCQkJfQotCQkJUHJvZmlsaW5nVXRpbC5mdWxsR0MoKTsKLQkJCXVzZWRNZW0wID0gcnQudG90YWxNZW1vcnkoKSAtIHJ0LmZyZWVNZW1vcnkoKTsKLQkJfQotCi0JCUNoZWNrUmVzdWx0IHJlc3VsdCA9IGNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5Xyh0cmFjZXIpOwotCQkKLQkJaWYgKHByb2ZpbGluZykgewotCQkJUHJvZmlsaW5nVXRpbC5mdWxsR0MoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHVzZWRNZW0wOiAiICsgdXNlZE1lbTAvMTAwMCArICIgayBieXRlcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWxvbmcgdXNlZE1lbTEgPSBydC50b3RhbE1lbW9yeSgpIC0gcnQuZnJlZU1lbW9yeSgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gdXNlZE1lbTE6ICIgKyB1c2VkTWVtMS8xMDAwICsgIiBrIGJ5dGVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZGlmZk1lbTogIiArICh1c2VkTWVtMSAtIHVzZWRNZW0wKS8xMDAwICsgIiBrIGJ5dGVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgQ2hlY2tSZXN1bHQgY2hlY2tDaXJjdWxhckRlcGVuZG5lY3lfKFRyYWNlciB0cmFjZXIpIHsKLQkJQ2hlY2tSZXN1bHQgcmVzdWx0ID0gbmV3IENoZWNrUmVzdWx0KCk7Ci0JCQotCQlIYXNoU2V0IHNlZW4gPSBuZXcgSGFzaFNldCgpOwotCQlMaXN0IHBsdWdpbnMgPSBsaWIuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJZm9yIChJdGVyYXRvciBpaXQgPSBwbHVnaW4uZUFsbENvbnRlbnRzKCk7IGlpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGlpdC5uZXh0KCk7Ci0JCQkJaWYgKHNlZW4uY29udGFpbnMob2JqKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJc2Vlbi5hZGQob2JqKTsJCQkJCi0JCQkJaWYgKFZlVG9DaGVjayhvYmopKSB7Ci0JCQkJCUlEZXBlbmRlbmN5SW5mbyBpbmZvID0gcmVnaXN0ZXJWYXJpYWJpbGl0eUVsZW1lbnQoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQkJCQlMaXN0IGNpckxpc3QgPSBnZXRBbmRDbGVhckNpcmN1bGFyTGlzdCgpOwotCQkJCQkKLQkJCQkJYm9vbGVhbiBsb29wID0gY2lyTGlzdCAhPSBudWxsICYmICFjaXJMaXN0LmlzRW1wdHkoKTsKLQkJCQkJYm9vbGVhbiByZXBsYWNpbmdBbmNlc3RvciA9IGluZm8uaW5oZXJpdEFuY2VzdG9yKFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUyk7Ci0JCQkJCQotCQkJCQlpZiAobG9vcCkgewotCQkJCQkJdHJhY2VyLnRyYWNlKCJFcnJvcj4gQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZDogIik7CQkvLyROT04tTkxTLTEkCi0JCQkJCQlmb3IgKGludCBpPTA7IGk8Y2lyTGlzdC5zaXplKCk7IGkrKykgewotCQkJCQkJCUlEZXBlbmRlbmN5SW5mbyBsb29wSW5mbyA9IChJRGVwZW5kZW5jeUluZm8pIGNpckxpc3QuZ2V0KGkpOwotCQkJCQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IGxvb3BJbmZvLmdldEVsZW1lbnQoKTsJCQkJCQkJCi0JCQkJCQkJdHJhY2VyLnRyYWNlKCJFcnJvcj4gIiArIGkgKyAiOiAiICsgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGVsZW0pKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCX0KLQkJCQkJCXJlc3VsdC5jaXJjdWxhckxpc3QuYWRkKGNpckxpc3QpOwotCQkJCQl9Ci0JCQkJCWlmIChyZXBsYWNpbmdBbmNlc3RvcikgewotCQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gaW5mby5nZXRFbGVtZW50KCk7Ci0JCQkJCQl0cmFjZXIudHJhY2UoIkVycm9yPiAiICsgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGVsZW0pICsgIiBpcyByZXBsYWNpbmcgYW4gYW5jZXN0b3IuIik7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlyZXN1bHQucmVwbGFjaW5nQW5jZXN0b3JMaXN0LmFkZChpbmZvKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQkJCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDaGVja1Jlc3VsdCB7Ci0JCXB1YmxpYyBMaXN0IGNpcmN1bGFyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcHVibGljIExpc3QgcmVwbGFjaW5nQW5jZXN0b3JMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJcHVibGljIGludCBnZXRFcnJvckNvdW50KCkgewotCQkJcmV0dXJuIGNpcmN1bGFyTGlzdC5zaXplKCkgKyByZXBsYWNpbmdBbmNlc3Rvckxpc3Quc2l6ZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGdldENpcmN1bGFyRWxlbWVudENvdW50KCkgewotCQkJaW50IGNvdW50ID0gcmVwbGFjaW5nQW5jZXN0b3JMaXN0LnNpemUoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxjaXJjdWxhckxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgY2lyY3VsYXJMaXN0LmdldChpKTsKLQkJCQlpbnQgc3ogPSBsaXN0ID09IG51bGwgPyAwIDogbGlzdC5zaXplKCk7Ci0JCQkJY291bnQgKz0gc3o7Ci0JCQl9Ci0JCQlyZXR1cm4gY291bnQ7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEbmRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbSkgewotCQlyZXR1cm4gZG5kQml0ICYmIG1vdmVFbGVtZW50ID09IGVsZW07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERuZEJpdChib29sZWFuIGIpIHsKLQkJZG5kQml0ID0gYjsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vRGVwZW5kZW5jeVZhbGlkYXRpb25NZ3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9EZXBlbmRlbmN5VmFsaWRhdGlvbk1nci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjQyY2I5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9EZXBlbmRlbmN5VmFsaWRhdGlvbk1nci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyBhbGwgZGVwZW5kZW5jeSBjaGVja3MgZm9yIHZhbGlkYXRpb24KLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXBlbmRlbmN5VmFsaWRhdGlvbk1nciB7Ci0JCi0JcHJpdmF0ZSBEZXBlbmRlbmN5SW5mb01nciB2ZURlcEluZm9NZ3I7Ci0JcHJpdmF0ZSBQbHVnaW5EZXBlbmRlbmN5SW5mb01nciBwbHVnaW5EZXBJbmZvTWdyOwotCQotCXB1YmxpYyBEZXBlbmRlbmN5VmFsaWRhdGlvbk1ncihNZXRob2RMaWJyYXJ5IGxpYikgewotCQl2ZURlcEluZm9NZ3IgPSBuZXcgRGVwZW5kZW5jeUluZm9NZ3IobGliKTsKLQkJcGx1Z2luRGVwSW5mb01nciA9IG5ldyBQbHVnaW5EZXBlbmRlbmN5SW5mb01ncihsaWIpOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyBjaGVja0NpcmN1bGFyRGVwZW5kbmVjeShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJcmV0dXJuIHZlRGVwSW5mb01nci5jaGVja0NpcmN1bGFyRGVwZW5kbmVjeSgoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50KTsKLQkJfQotCQkKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCXJldHVybiBwbHVnaW5EZXBJbmZvTWdyLmNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5KChNZXRob2RQbHVnaW4pIGVsZW1lbnQpOwotCQl9CQkKLQkJCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5mby5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTA5MmZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JRGVwZW5kZW5jeUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgZGVwZW5kZW5jeSBpbmZvIHVzZWQgaW4gY2lyY3VsYXIgZGVwZW5kZW5jeSBjaGVja2luZwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGVwZW5kZW5jeUluZm8gewotCQotCXZvaWQgYnVpbGQoYm9vbGVhbiBjaGVja0NpcmN1bGFyKTsKLQkKLQlib29sZWFuIGlzQ29tcGxldGUoKTsKLQkKLQlib29sZWFuIHJlYWNoYWJsZUJ5KElEZXBlbmRlbmN5SW5mbyBpbmZvKTsKLQkKLQlib29sZWFuIGluaGVyaXRBbmNlc3RvcihWYXJpYWJpbGl0eVR5cGUgdHlwZSk7Ci0JCi0JTWV0aG9kRWxlbWVudCBnZXRFbGVtZW50KCk7Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vSU5hbWVQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0lOYW1lUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA0NjI4OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vSU5hbWVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi0vKioKLSAqIEludGVyZmFjZSB0byBwcm92aWRlIG5hbWUgZm9yIGEgc3BlY2lmaWVkIG9iamVjdAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEphbiAzMSwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTmFtZVByb3ZpZGVyIHsKLQlTdHJpbmcgZ2V0TmFtZShPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JVmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vSVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzI1MzkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIHZhbGlkYXRvci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgMSwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0b3IgewotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgZ2l2ZW4gc3RyaW5nLiBSZXR1cm5zIGFuIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSBpZiB0aGUKLQkgKiBuZXcgdGV4dCBpcyBpbnZhbGlkLiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGVycm9yLgotCSAqIE5vdGUgdGhhdCB0aGUgZW1wdHkgc3RyaW5nIGlzIG5vdCB0cmVhdGVkIHRoZSBzYW1lIGFzIDxjb2RlPm51bGw8L2NvZGU+OwotCSAqIGl0IGluZGljYXRlcyBhbiBlcnJvciBzdGF0ZSBidXQgd2l0aCBubyBtZXNzYWdlIHRvIGRpc3BsYXkuCi0JICogCi0JICogQHBhcmFtIG5ld1RleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHRvIGNoZWNrIGZvciB2YWxpZGl0eQotCSAqIAotCSAqIEByZXR1cm4gYW4gZXJyb3IgbWVzc2FnZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBlcnJvcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCk7Ci0JCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBnaXZlbiBvYmplY3QgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byB2YWxpZGF0ZQotCSAqIEByZXR1cm4gYSBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBpc1ZhbGlkKE9iamVjdCB2YWx1ZSk7Ci0JCi0JcHVibGljIGludCBNYXhGaWxlUGF0aE5hbWVMZW5ndGggPSAyNTU7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vSVZhbGlkYXRvckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JVmFsaWRhdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmFmMGJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JVmFsaWRhdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci0KLS8qKgotICogRmFjdG9yeSBpbnRlcmZhY2UgdG8gY3JlYXRlIHZhcmlvdXMgdmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBzdHJpbmcgdmFsdWUgb2YKLSAqIHNwZWNpZmllZCBvYmplY3QgZmVhdHVyZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmFsaWRhdG9yRmFjdG9yeSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJVmFsaWRhdG9yRmFjdG9yeSBJTlNUQU5DRSA9IFZhbGlkYXRvckZhY3RvcnkKLQkJCS5jcmVhdGVWYWxpZGF0b3JGYWN0b3J5KCk7Ci0KLQlJVmFsaWRhdG9yIGNyZWF0ZU5hbWVWYWxpZGF0b3IoTmFtZWRFbGVtZW50IGUsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgbmFtZSB2YWxpZGF0b3IgZm9yIGEgY29udGVudCBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JSVZhbGlkYXRvciBjcmVhdGVOYW1lVmFsaWRhdG9yKE9iamVjdCBwYXJlbnQsIENvbnRlbnRFbGVtZW50IGUpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBuYW1lIHZhbGlkYXRvciBmb3IgYSBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JSVZhbGlkYXRvciBjcmVhdGVOYW1lVmFsaWRhdG9yKE9iamVjdCBwYXJlbnQsIE5hbWVkRWxlbWVudCBlKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgbmFtZSB2YWxpZGF0b3IgZm9yIGFuIGVsZW1lbnQgb2YgbmV3VHlwZSB3aXRoIG5hbWUgb2YgZS5nZXROYW1lKCkKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlJVmFsaWRhdG9yIGNyZWF0ZU5hbWVWYWxpZGF0b3IoT2JqZWN0IHBhcmVudCwgTmFtZWRFbGVtZW50IGUsIEVDbGFzcyBuZXdUeXBlKTsKLQotCUlWYWxpZGF0b3IgY3JlYXRlUHJlc2VudGF0aW9uTmFtZVZhbGlkYXRvcihPYmplY3QgcGFyZW50LAotCQkJRGVzY3JpYmFibGVFbGVtZW50IGUpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHZhbGlkYXRvciBmb3IgdGhlIGdpdmVuIGZlYXR1cmUgb2YgdGhlIGdpdmVuIG9iamVjdC4gVGhlIG9iamVjdAotCSAqIGlzIHJlZmVyZW5jZWQgYnkgdGhlIGdpdmVuIHBhcmVudCB2aWEgdGhlIHNwZWNpZmllZCByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSByZWZlcmVuY2UgCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICB0aGUgZmVhdHVyZSB0byB2YWxpZGF0ZSBpdHMgdmFsdWUKLQkgKiBAcGFyYW0gZUNsYXNzCi0JICogICAgICAgICAgICB0aGUgRUNsYXNzIG9mIHRoZSBvYmplY3QgdG8gdmFsaWRhdGUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgICAgICAgICAgIG5vdCBhcHBsaWNhYmxlCi0JICogQHJldHVybgotCSAqLwotCUlWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKEVPYmplY3QgcGFyZW50LCBFUmVmZXJlbmNlIHJlZmVyZW5jZSwKLQkJCUVDbGFzcyBlQ2xhc3MsIEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSk7Ci0JCi0JSVZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoRU9iamVjdCBwYXJlbnQsIEVSZWZlcmVuY2UgcmVmZXJlbmNlLAotCQkJSUZpbHRlciBjaGlsZEZpbHRlciwgRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKTsJCi0JCi0JSVZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoT2JqZWN0IHBhcmVudCwgRUNsYXNzIGVDbGFzcywgRU9iamVjdCBvYmplY3QsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL05hbWVDaGVja2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vTmFtZUNoZWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY0OTJkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vTmFtZUNoZWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZGVmaW5lcyB2YXJpb3VzIHN0YXRpYyBtZXRob2RzIHRvIHZhbGlkYXRlIG5hbWUgb2Ygc3BlY2lmaWVkCi0gKiBvYmplY3QKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5hbWVDaGVja2VyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RFWFQgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5lbGVtZW50X3RleHQ7IAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElOYW1lUHJvdmlkZXIgcHJlc2VudGF0aW9uTmFtZVByb3ZpZGVyID0gbmV3IElOYW1lUHJvdmlkZXIoKSB7Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKE9iamVjdCBvYmplY3QpIHsKLQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgb2JqZWN0KTsKLQkJCX0KLQkJCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoRGVzY3JpYmFibGVFbGVtZW50KW9iamVjdCkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJT2JqZWN0IHBhcmVudCwgT2JqZWN0IGUsIGZpbmFsIENsYXNzIHR5cGUsCi0JCQlJTmFtZVByb3ZpZGVyIG5hbWVQcm92aWRlciwgU3RyaW5nIG5ld05hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNpb24sCi0JCQlib29sZWFuIGlnbm9yZVN1cHByZXNzZWQpIHsKLQkJSUZpbHRlciBjaGlsZEZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiB0eXBlLmlzSW5zdGFuY2Uob2JqKTsKLQkJCX0KLQotCQl9OwotCi0JCXJldHVybiBjaGVja05hbWUoYWRhcHRlckZhY3RvcnksIHBhcmVudCwgZSwgY2hpbGRGaWx0ZXIsIG5hbWVQcm92aWRlciwKLQkJCQluZXdOYW1lLCBzdXBwcmVzaW9uLCBpZ25vcmVTdXBwcmVzc2VkKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJT2JqZWN0IHBhcmVudCwgT2JqZWN0IGUsIElGaWx0ZXIgY2hpbGRGaWx0ZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgbmFtZUZlYXR1cmUsIFN0cmluZyBuZXdOYW1lLAotCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIGJvb2xlYW4gaWdub3JlU3VwcHJlc3NlZCkgewotCQlyZXR1cm4gY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIGUsIGNoaWxkRmlsdGVyLAotCQkJCWNyZWF0ZU5hbWVQcm92aWRlcihuYW1lRmVhdHVyZSksIG5ld05hbWUsIHN1cHByZXNzaW9uLAotCQkJCWlnbm9yZVN1cHByZXNzZWQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjaGVja05hbWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlPYmplY3QgcGFyZW50LCBPYmplY3QgZSwgSUZpbHRlciBjaGlsZEZpbHRlciwKLQkJCUlOYW1lUHJvdmlkZXIgbmFtZVByb3ZpZGVyLCBTdHJpbmcgbmV3TmFtZSwKLQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uLCBib29sZWFuIGlnbm9yZVN1cHByZXNzZWQpIAotCXsKLQkJaWYgKGlnbm9yZVN1cHByZXNzZWQpCi0JCQlpZiAoc3VwcHJlc3Npb24gIT0gbnVsbCAmJiBzdXBwcmVzc2lvbi5pc1N1cHByZXNzZWQoZSkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbjsKLQotCQkvLyBnZXQgY2hpbGRyZW4gb2YgdGhlIHJvbGxlZC1kb3duIGRhcHRlcgotCQkvLwotCQlib29sZWFuIHdhc1JvbGxlZFVwID0gZmFsc2U7Ci0JCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSBudWxsOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCWJzSXRlbVByb3ZpZGVyID0gKChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKTsKLQkJCXdhc1JvbGxlZFVwID0gYnNJdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlpZiAod2FzUm9sbGVkVXApIHsKLQkJCQlic0l0ZW1Qcm92aWRlci5zZXRSb2xsZWRVcChmYWxzZSk7Ci0JCQl9Ci0JCQljaGlsZHJlbiA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IGV4OwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHdhc1JvbGxlZFVwKSB7Ci0JCQkJYnNJdGVtUHJvdmlkZXIuYmFzaWNTZXRSb2xsZWRVcCh3YXNSb2xsZWRVcCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBpdGVtID0gaXRlci5uZXh0KCk7Ci0KLQkJCS8vIHNraXAgY2hlY2tpbmcgb24gc3VwcHJlc3NlZCBlbGVtZW50Ci0JCQkvLwotLyoxNzAwNTgJaWYgKHN1cHByZXNzaW9uICE9IG51bGwgJiYgc3VwcHJlc3Npb24uaXNTdXBwcmVzc2VkKGl0ZW0pKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ki8KLQotCQkJT2JqZWN0IGNoaWxkID0gVG5nVXRpbC51bndyYXAoaXRlbSk7Ci0JCQlpZiAoY2hpbGQgIT0gZSAmJiBjaGlsZEZpbHRlci5hY2NlcHQoY2hpbGQpKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBuYW1lUHJvdmlkZXIuZ2V0TmFtZShjaGlsZCk7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShuZXdOYW1lKSkgewotCQkJCQkvLyByZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLAotCQkJCQkJCW5hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJTmFtZVByb3ZpZGVyIGNyZWF0ZU5hbWVQcm92aWRlcigKLQkJCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBuYW1lRmVhdHVyZSkgewotCQlpZihuYW1lRmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpIHsKLQkJCXJldHVybiBwcmVzZW50YXRpb25OYW1lUHJvdmlkZXI7IAotCQl9Ci0JCQotCQlyZXR1cm4gbmV3IElOYW1lUHJvdmlkZXIoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJcmV0dXJuIChTdHJpbmcpICgoRU9iamVjdCkgb2JqZWN0KS5lR2V0KG5hbWVGZWF0dXJlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja05hbWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlmaW5hbCBCcmVha2Rvd25FbGVtZW50IGUsIENsYXNzIHR5cGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBuYW1lRmVhdHVyZSwKLQkJCVN0cmluZyBuZXdOYW1lLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgCi0JewotCQlyZXR1cm4gY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCBudWxsLCBlLCB0eXBlLCBuYW1lRmVhdHVyZSwgbmV3TmFtZSwKLQkJCQlzdXBwcmVzc2lvbiwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja05hbWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIE9iamVjdCBwYXJlbnQsCi0JCQlmaW5hbCBCcmVha2Rvd25FbGVtZW50IGUsIENsYXNzIHR5cGUsIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBuYW1lRmVhdHVyZSwKLQkJCVN0cmluZyBuZXdOYW1lLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgYm9vbGVhbiBpZ25vcmVTdXBwcmVzc2VkKSAKLQl7Ci0JCVN0cmluZyBtc2cgPSBjaGVja0VtcHR5KGUsIG5ld05hbWUpOwotCQlpZihtc2cgIT0gbnVsbCkgewotCQkJcmV0dXJuIG1zZzsKLQkJfQotCi0JCWlmKHR5cGUgPT0gbnVsbCkgewotCQkJdHlwZSA9IGNob29zZVR5cGUoZSk7Ci0JCX0KLQkJCi0JCWlmKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KGUsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlwYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KGUpOwotCQkJaWYocGFyZW50ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8vIGJhc2ljIGNoZWNrCi0JCS8vCi0JCW1zZyA9IGNoZWNrTmFtZShhZGFwdGVyRmFjdG9yeSwgcGFyZW50LCBlLCB0eXBlLAotCQkJCWNyZWF0ZU5hbWVQcm92aWRlcihuYW1lRmVhdHVyZSksIG5ld05hbWUsIHN1cHByZXNzaW9uLAotCQkJCWlnbm9yZVN1cHByZXNzZWQpOwotCi0JCWlmIChtc2cgIT0gbnVsbCkKLQkJCXJldHVybiBtc2c7Ci0JCUlGaWx0ZXIgY2hpbGRGaWx0ZXIgPSBudWxsOwotCQlpZiAoZSBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkvLyBkb24ndCBhbGxvdyB0ZWFtIHdpdGggdGhlIHNhbWUgbmFtZSB3aXRoaW4gdGhlIHNhbWUgc2NvcGUKLQkJCS8vCi0JCQljaGlsZEZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJCXJldHVybiBlIGluc3RhbmNlb2YgVGVhbVByb2ZpbGU7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8vIFBMRUFTRSBET04nVCBDTEVBTiBVUC4KLQkJLy8gQ29tbWVudGVkIG91dCBmb3Igbm93LCBzaW5jZSB3ZSBjaGFuZ2Ugc2NvcGUgb2YgRGVsaXZlcmFibGUuCi0JCS8vIGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkJLy8gJiYgKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGUpLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZgotCQkvLyBEZWxpdmVyYWJsZSkgewotCQkvLyBjaGlsZEZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCQkvLwkKLQkJLy8gcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJLy8gcmV0dXJuIGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkJLy8gJiYgKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGUpLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZgotCQkvLyBEZWxpdmVyYWJsZTsKLQkJLy8gfQotCQkvLyB9OwotCQkvLyB9Ci0KLQkJaWYgKGNoaWxkRmlsdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBjaGVja05hbWVJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIGUsIG5hbWVGZWF0dXJlLCBuZXdOYW1lLAotCQkJCQljaGlsZEZpbHRlciwgc3VwcHJlc3Npb24sIGlnbm9yZVN1cHByZXNzZWQpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjaGVja0VtcHR5KE9iamVjdCBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQkvLyBza2lwIGNoZWNraW5nIG9uIGFjdGl2aXR5IHRoYXQgaXMgYSBleHRlbmRlciBvciBsb2NhbCBjb250cmlidXRvcgotCQkvLwotCQlpZihlIGluc3RhbmNlb2YgQWN0aXZpdHkgJiYgUHJvY2Vzc1V0aWwuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoKEJyZWFrZG93bkVsZW1lbnQpIGUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJU3RyaW5nIGVsZW1lbnRUeXBlOwotCQlpZiAoZSBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotCQkJZWxlbWVudFR5cGUgPSBUbmdVdGlsLmdldFR5cGVUZXh0KChOYW1lZEVsZW1lbnQpIGUpOwotCQl9IGVsc2UgewotCQkJZWxlbWVudFR5cGUgPSBFTEVNRU5UX1RFWFQ7Ci0JCX0KLQkJaWYgKG5ld05hbWUgPT0gbnVsbCB8fCBuZXdOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7CQkJCi0JCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZywKLQkJCQkJU3RyVXRpbC50b0xvd2VyKGVsZW1lbnRUeXBlKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVXNlZCBieQotCSAqIHtAbGluayAjY2hlY2tOYW1lKEFkYXB0ZXJGYWN0b3J5LCBCcmVha2Rvd25FbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUsIFN0cmluZywgU3VwcHJlc3Npb24sIGJvb2xlYW4pIGNoZWNrTmFtZSgpfQotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIENsYXNzIGNob29zZVR5cGUoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXJldHVybiBBY3Rpdml0eS5jbGFzczsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBUYXNrRGVzY3JpcHRvci5jbGFzczsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBSb2xlRGVzY3JpcHRvci5jbGFzczsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGUuZ2V0Q2xhc3MoKTsKLQkJfQotCQkvLyByZXR1cm4gQnJlYWtkb3duRWxlbWVudC5jbGFzczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lSW5TY29wZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU9iamVjdCBjdXJyZW50UGFyZW50LCBCcmVha2Rvd25FbGVtZW50IGUsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgU3RyaW5nIG5hbWUsIElGaWx0ZXIgY2hpbGRGaWx0ZXIsCi0JCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgYm9vbGVhbiBpZ25vcmVTdXBwcmVzc2VkKSB7Ci0JCS8vIGNoZWNrIHVwCi0JCWZvciAoT2JqZWN0IHBhcmVudCA9IGN1cnJlbnRQYXJlbnQ7IHBhcmVudCAhPSBudWxsOykgewotCQkJU3RyaW5nIG1zZyA9IGNoZWNrTmFtZShhZGFwdGVyRmFjdG9yeSwgcGFyZW50LCBlLCBjaGlsZEZpbHRlciwKLQkJCQkJZmVhdHVyZSwgbmFtZSwgc3VwcHJlc3Npb24sIGlnbm9yZVN1cHByZXNzZWQpOwotCQkJaWYgKG1zZyAhPSBudWxsKQotCQkJCXJldHVybiBtc2c7Ci0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGl0ZW1Qcm92aWRlci5nZXRQYXJlbnQocGFyZW50KTsKLQkJfQotCi0JCS8vIGNoZWNrIGRvd24KLQkJaWYgKGN1cnJlbnRQYXJlbnQgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkJY3VycmVudFBhcmVudCwgZmFsc2UpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJCWlmIChjaGlsZCAhPSBlICYmIGNoaWxkRmlsdGVyLmFjY2VwdChjaGlsZCkpIHsKLQkJCQkJU3RyaW5nIGNoaWxkTmFtZSA9IChTdHJpbmcpICgoRU9iamVjdCkgY2hpbGQpLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoY2hpbGROYW1lKSkgewotCQkJCQkJLy8gcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwKLQkJCQkJCS8vIGRhdGEpOwotCQkJCQkJcmV0dXJuIE5MUwotCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZywKLQkJCQkJCQkJCQluYW1lKTsKLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJZmluYWwgQnJlYWtkb3duRWxlbWVudCBlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgU3RyaW5nIG5hbWUsCi0JCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQlyZXR1cm4gY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCBlLCBmZWF0dXJlLCBuYW1lLCBzdXBwcmVzc2lvbiwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB0aGUgbmFtZSBvciBwcmVzZW50YXRpb24gbmFtZSBvZiBhIGJyZWFrZG93biBlbGVtZW50IHRoYXQgaXMKLQkgKiBhbHJlYWR5IHBhcnQgb2YgYSBwcm9jZXNzLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBzdXBwcmVzc2lvbgotCSAqIEBwYXJhbSBpZ25vcmVTdXBwcmVzc2VkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCWZpbmFsIEJyZWFrZG93bkVsZW1lbnQgZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFN0cmluZyBuYW1lLAotCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIGJvb2xlYW4gaWdub3JlU3VwcHJlc3NlZCkgCi0JewotCQlyZXR1cm4gY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCAoT2JqZWN0KW51bGwsIGUsIChDbGFzcyludWxsLCBmZWF0dXJlLCBuYW1lLCBzdXBwcmVzc2lvbiwgaWdub3JlU3VwcHJlc3NlZCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5IYXZlRW1wdHlQcmVzZW50YXRpb25OYW1lKERlc2NyaWJhYmxlRWxlbWVudCBlKSB7Ci0JCWlmKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCVZhcmlhYmlsaXR5VHlwZSB2VHlwZSA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KWUpLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJcmV0dXJuIHZUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTCi0JCQkJfHwgdlR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTCi0JCQkJfHwgdlR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTjsJCQkKLQkJfQotCQlyZXR1cm4gZmFsc2U7CQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tGaWxlUGF0aExlbmd0aCgKLQkJCU1ldGhvZEVsZW1lbnQgcGFyZW50RWxlbWVudFdpdGhSZXNvdXJjZSwKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCVN0cmluZyBuYW1lLAotCQkJaW50IG1heExlbmd0aCwKLQkJCVN0cmluZ1tdIGZpbGVQYXRoTmFtZSkgewotCQlSZXNvdXJjZSByZXMgPSBwYXJlbnRFbGVtZW50V2l0aFJlc291cmNlLmVSZXNvdXJjZSgpOwotCQlVUkkgdXJpID0gcmVzLmdldFVSSSgpOwotCQlpZiAoZmlsZVBhdGhOYW1lICE9IG51bGwgJiYgZmlsZVBhdGhOYW1lLmxlbmd0aCA+PSAxKSB7Ci0JCQkvL1RvIGRvOiBjYWxjdWxhdGUgcGF0aAotCQkJLy9maWxlUGF0aE5hbWVbMF0gPSA/PwotCQl9CQkKLQkJCi0JCWludCBwYXJlbnRSZXNMZW4gPSB1cmkudG9GaWxlU3RyaW5nKCkubGVuZ3RoKCk7CQkKLQkJaW50IGxvY2FsR3JvdXBMZW4gPSAyMDsKLQkJaWYgKHBhcmVudEVsZW1lbnRXaXRoUmVzb3VyY2UgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQlsb2NhbEdyb3VwTGVuID0gMDsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZSkgewotCQkJbG9jYWxHcm91cExlbiA9IDU7CQkvLyJyb2xlcyIKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCWxvY2FsR3JvdXBMZW4gPSAxODsJCS8vImNhcGFiaWxpdHlwYXR0ZXJucyIKLQkJfQotCQkvL01vcmUgZWxzZSBpZiBoZXJlCi0JCQotCQlpbnQgdG90YWxMZW4gPSBwYXJlbnRSZXNMZW4gKyBsb2NhbEdyb3VwTGVuICsgbmFtZS5sZW5ndGgoKTsJCQotCQlyZXR1cm4gdG90YWxMZW4gPD0gbWF4TGVuZ3RoOwkKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vUGx1Z2luRGVwSW5mby5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1BsdWdpbkRlcEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZhYjVkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vUGx1Z2luRGVwSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhhbmRsZXMgcGx1Z2luIGRlcGVuZGVuY3kgaW5mbyBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeSBjaGVjawotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkRlcEluZm8gewotCi0JcHJpdmF0ZSBQbHVnaW5EZXBlbmRlbmN5SW5mb01nciBtZ3I7Ci0JcHJpdmF0ZSBNZXRob2RQbHVnaW4gcGx1Z2luOwotCXByaXZhdGUgSGFzaE1hcCBwYXJlbnRNYXA7Ci0JcHJpdmF0ZSBib29sZWFuIGNvbXBsZXRlID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIFBsdWdpbkRlcEluZm8oUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IgbWdyLCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCXRoaXMubWdyID0gbWdyOwotCQl0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGNvbXBsZXRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBidWlsZChib29sZWFuIGNoZWNrQ2lyY3VsYXIpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBidWlsZDogIiArIHRoaXMpOwkvLyROT04tTkxTLTEkCi0JCX0KLQkJYnVpbGRJbm5lcihjaGVja0NpcmN1bGFyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkSW5uZXIoYm9vbGVhbiBjaGVja0NpcmN1bGFyKSB7Ci0JCU9iamVjdCBpbmZvID0gbWdyLmdldFByb2Nlc3NlZEluZm8oZ2V0UGx1Z2luKCkpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoaW5mbyA9PSB0aGlzICYmIGNvbXBsZXRlKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIGVycm9yIGluIGJ1aWxkSW5uZXI6ICIgKyBpbmZvKTsJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQltZ3IuYWRkVG9Qcm9jZXNzZWQodGhpcyk7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gYnVpbGRJbm5lcjogIiArIHRoaXMpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJYnVpbGRJbm5lcl8oY2hlY2tDaXJjdWxhcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZElubmVyXyhib29sZWFuIGNoZWNrQ2lyY3VsYXIpIHsKLQkJTGlzdCBwYXJlbnRzID0gZ2V0UGx1Z2luKCkuZ2V0QmFzZXMoKTsKLQkJaW50IHN6ID0gcGFyZW50cyA9PSBudWxsID8gMCA6IHBhcmVudHMuc2l6ZSgpOwotCQlpZiAoc3ogPT0gMCkgewotCQkJY29tcGxldGUgPSB0cnVlOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlwYXJlbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlMaXN0IHByb2Nlc3NlZFBhcmVudHMgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaTwgc3o7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIHBhcmVudEVsZW0gPSAoTWV0aG9kUGx1Z2luKSBwYXJlbnRzLmdldChpKTsKLQkJCVBsdWdpbkRlcEluZm8gcGluZm8gPSAoUGx1Z2luRGVwSW5mbykgbWdyLmdldFByb2Nlc3NlZEluZm8ocGFyZW50RWxlbSk7Ci0JCQlpZiAocGluZm8gPT0gbnVsbCl7Ci0JCQkJcGluZm8gPSBuZXcgUGx1Z2luRGVwSW5mbyhtZ3IsIHBhcmVudEVsZW0pOwotCQkJCXBhcmVudE1hcC5wdXQocGFyZW50RWxlbS5nZXRHdWlkKCksIHBpbmZvKTsKLQkJCQlwaW5mby5idWlsZElubmVyKGNoZWNrQ2lyY3VsYXIpOwotCQkJfSBlbHNlIHsKLQkJCQlwYXJlbnRNYXAucHV0KHBhcmVudEVsZW0uZ2V0R3VpZCgpLCBwaW5mbyk7Ci0JCQkJaWYgKGNoZWNrQ2lyY3VsYXIpIHsKLQkJCQkJaWYgKHByb2Nlc3NlZFBhcmVudHMgPT0gbnVsbCkgewotCQkJCQkJcHJvY2Vzc2VkUGFyZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJfQotCQkJCQlwcm9jZXNzZWRQYXJlbnRzLmFkZChwaW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNvbXBsZXRlID0gdHJ1ZTsKLQkJCQotCQlpZiAoY2hlY2tDaXJjdWxhciAmJiBwcm9jZXNzZWRQYXJlbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9MDsgaTxwcm9jZXNzZWRQYXJlbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVhY2hhYmxlQnkoKFBsdWdpbkRlcEluZm8pIHByb2Nlc3NlZFBhcmVudHMuZ2V0KGkpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiByZWFjaGFibGVCeShQbHVnaW5EZXBJbmZvIGluZm8pICB7Ci0JCWlmICghIChpbmZvIGluc3RhbmNlb2YgUGx1Z2luRGVwSW5mbykpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gRW50cnkgcmVhY2hhYmxlQnk6IHRoaXMgLT4gIiArIHRoaXMpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBFbnRyeSByZWFjaGFibGVCeTogaW5mbyAtPiAiICsgaW5mbyk7CS8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7CQkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlYWNoYWJsZUJ5KChQbHVnaW5EZXBJbmZvKSBpbmZvLCBuZXcgU3RhY2soKSwgbmV3IEhhc2hNYXAoKSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiByZWFjaGFibGVCeShQbHVnaW5EZXBJbmZvIGluZm8sIFN0YWNrIHN0YWNrLCBNYXAgc2VlbikgIHsKLQkJc3RhY2sucHVzaChpbmZvKTsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiByZWFjaGFibGVCeTogdGhpcyAtPiAiICsgdGhpcyk7CQkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiByZWFjaGFibGVCeTogaW5mbyAtPiAiICsgaW5mbyk7CQkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiByZXQgPSAgcmVhY2hhYmxlQnlfKGluZm8sIHN0YWNrLCBzZWVuKTsKLQkJc3RhY2sucG9wKCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiByZWFjaGFibGVCeV8oUGx1Z2luRGVwSW5mbyBpbmZvLCBTdGFjayBzdGFjaywgTWFwIHNlZW4pICB7Ci0JCU1hcCB0ZXN0TWFwID0gaW5mby5wYXJlbnRNYXA7CQkKLQkJaWYgKHRlc3RNYXAgPT0gbnVsbCB8fCB0ZXN0TWFwLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAodGVzdE1hcC5jb250YWluc0tleShnZXRQbHVnaW4oKS5nZXRHdWlkKCkpKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBDb250YWluZWQgaW4gcGFyZW50TWFwIG9mOiAiICsgaW5mbyk7CQkvLyROT04tTkxTLTEkCQkJCQkJCQkJCi0JCQl9Ci0JCQlzdGFjay5wdXNoKHRoaXMpOwotCQkJbWdyLmxvZ0NpcmN1bGFyRGVwZW5kZW5jeSgoU3RhY2spIHN0YWNrLmNsb25lKCkpOwotCQkJc3RhY2sucG9wKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKHNlZW4uY29udGFpbnNLZXkoaW5mby5nZXRQbHVnaW4oKS5nZXRHdWlkKCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCQotCQlzZWVuLnB1dChpbmZvLmdldFBsdWdpbigpLmdldEd1aWQoKSwgaW5mbyk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdGVzdE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQbHVnaW5EZXBJbmZvIHBhcmVudEluZm8gPSAoUGx1Z2luRGVwSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKHBhcmVudEluZm8uY29udGFpbmVkSW4oc3RhY2spKSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGNvbnRhaW5lZEluIHN0YWNrOiAiICsgaW5mbyk7CQkvLyROT04tTkxTLTEkCQkJCQkJCQkJCi0JCQkJfQotCQkJCXN0YWNrLnB1c2gocGFyZW50SW5mbyk7Ci0JCQkJbWdyLmxvZ0NpcmN1bGFyRGVwZW5kZW5jeSgoU3RhY2spIHN0YWNrLmNsb25lKCkpOwotCQkJCXN0YWNrLnBvcCgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgIChyZWFjaGFibGVCeShwYXJlbnRJbmZvLCBzdGFjaywgc2VlbikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQkKLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIE1ldGhvZFBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCQkJCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgocGx1Z2luKTsKLQl9Ci0JCi0JLy9UaGlzIHdvdWxkIHNjYWxlIHVwIGZvciBwZXJmb3JtYW5jZSB3aGVuIGluZm9MaXN0IGdldHMgbGFyZ2UKLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbmVkSW4oTGlzdCBpbmZvTGlzdCkgewotCQlpbnQgc3ogPSBpbmZvTGlzdCA9PSBudWxsID8gMCA6IGluZm9MaXN0LnNpemUoKTsKLQkJaWYgKHN6ID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgZ3VpZCA9IGdldFBsdWdpbigpLmdldEd1aWQoKTsKLQkJaWYgKHN6ID09IDEpIHsKLQkJCXJldHVybiBndWlkLmVxdWFscygoKFBsdWdpbkRlcEluZm8pIGluZm9MaXN0LmdldCgwKSkuZ2V0UGx1Z2luKCkuZ2V0R3VpZCgpKTsKLQkJfQotCQlNYXAgbGlzdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxzejsgaSsrKSB7Ci0JCQlQbHVnaW5EZXBJbmZvIGluZm8gPSAoUGx1Z2luRGVwSW5mbykgaW5mb0xpc3QuZ2V0KGkpOwotCQkJbGlzdE1hcC5wdXQoaW5mby5nZXRQbHVnaW4oKS5nZXRHdWlkKCksIGluZm8pOwotCQl9Ci0JCQotCQlyZXR1cm4gbGlzdE1hcC5jb250YWluc0tleShndWlkKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9QbHVnaW5EZXBlbmRlbmN5SW5mb01nci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGViYTg2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9QbHVnaW5EZXBlbmRlbmN5SW5mb01nci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlByb2ZpbGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIGNpcmN1bGFyIGRlcGVuZGVuY3kgaW5mbyBmb3IgcGx1Z2lucy4KLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5EZXBlbmRlbmN5SW5mb01nciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwcm9maWxpbmcgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGxpYjsKLQlwcml2YXRlIE1hcCBwcm9jZXNzZWQ7Ci0JcHJpdmF0ZSBMaXN0IGNpcmN1bGFyTGlzdDsKLQkKLQlwdWJsaWMgUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJdGhpcy5saWIgPSBsaWI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGxvZ0NpcmN1bGFyRGVwZW5kZW5jeShTdGFjayB0cmFjZSkgewotCQlpZiAoY2lyY3VsYXJMaXN0ID09IG51bGwpIHsKLQkJCWNpcmN1bGFyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQljaXJjdWxhckxpc3QuYWRkQWxsKHRyYWNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGdldEFuZENsZWFyQ2lyY3VsYXJMaXN0KCkgewotCQlMaXN0IHJldCA9IGNpcmN1bGFyTGlzdDsKLQkJY2lyY3VsYXJMaXN0ID0gbnVsbDsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0JCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhtc2cpOwotCX0KLQkKLQlwcml2YXRlIFBsdWdpbkRlcEluZm8gcmVnaXN0ZXJQbHVnaW4oTWV0aG9kUGx1Z2luIHBsdWdpbiwgYm9vbGVhbiBjaGVja0NpcmN1bGFyKSB7CQkKLQkJUGx1Z2luRGVwSW5mbyBpbmZvID0gIGdldFByb2Nlc3NlZEluZm8ocGx1Z2luKTsKLQkJaWYgKGluZm8gPT0gbnVsbCkgewkJCi0JCQlpbmZvID0gbmV3IFBsdWdpbkRlcEluZm8odGhpcywgcGx1Z2luKTsKLQkJfQotCQlpZiAoISBpbmZvLmlzQ29tcGxldGUoKSkgewotCQkJaW5mby5idWlsZChjaGVja0NpcmN1bGFyKTsKLQkJfQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZG5lY3koTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHBsdWdpbjogIiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChwbHVnaW4pKTsJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQlQbHVnaW5EZXBJbmZvIGluZm8gPSByZWdpc3RlclBsdWdpbihwbHVnaW4sIHRydWUpOwotCQlMaXN0IGNpckxpc3QgPSBnZXRBbmRDbGVhckNpcmN1bGFyTGlzdCgpOwotCQlib29sZWFuIGxvb3AgPSBjaXJMaXN0ICE9IG51bGwgJiYgIWNpckxpc3QuaXNFbXB0eSgpOwotCQlpZiAobG9vcCkgewotCQkJbG9nKCJFcnJvcj4gQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZDogIik7CQkvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpPTA7IGk8Y2lyTGlzdC5zaXplKCk7IGkrKykgewotCQkJCVBsdWdpbkRlcEluZm8gbG9vcEluZm8gPSAoUGx1Z2luRGVwSW5mbykgY2lyTGlzdC5nZXQoaSk7Ci0JCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gbG9vcEluZm8uZ2V0UGx1Z2luKCk7CQkJCQkJCQotCQkJCWxvZygiRXJyb3I+ICIgKyBpICsgIjogIiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtKSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQkJbG9nKCIiKTsJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgVmFsaWRhdGlvblN0YXR1cyhJU3RhdHVzLkVSUk9SLCAwLCBnZW5FcnJvck1zZyhjaXJMaXN0KSwgcGx1Z2luLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2VuRXJyb3JNc2coTGlzdCBjaXJMaXN0KSB7Ci0JCVN0cmluZyBtc2cgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy52YXJpYWJpbGl0eV9lbGVtZW50X2NpcmN1bGFyX2xvb3BfZXJyb3JfbXNnOwotCQlmb3IgKGludCBpPTA7IGk8Y2lyTGlzdC5zaXplKCk7IGkrKykgewotCQkJUGx1Z2luRGVwSW5mbyBsb29wSW5mbyA9IChQbHVnaW5EZXBJbmZvKSBjaXJMaXN0LmdldChpKTsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IGxvb3BJbmZvLmdldFBsdWdpbigpOwkKLQkJCWlmIChpID4gMCkgewotCQkJCW1zZyArPSAiOiAiOyAvLyROT04tTkxTLTEkIAotCQkJfQotCQkJbXNnICs9IFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtKTsJCi0JCX0KLQkJcmV0dXJuIG1zZzsKLQl9Ci0JCQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzZWQoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlyZXR1cm4gcHJvY2Vzc2VkICE9IG51bGwgJiYgcHJvY2Vzc2VkLmNvbnRhaW5zS2V5KHBsdWdpbi5nZXRHdWlkKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGx1Z2luRGVwSW5mbyBnZXRQcm9jZXNzZWRJbmZvKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJcmV0dXJuIHByb2Nlc3NlZCA9PSBudWxsID8gbnVsbCA6IChQbHVnaW5EZXBJbmZvKSBwcm9jZXNzZWQuZ2V0KHBsdWdpbi5nZXRHdWlkKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1Byb2Nlc3NlZChQbHVnaW5EZXBJbmZvIGluZm8pIHsKLQkJaWYgKHByb2Nlc3NlZCA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzZWQgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXByb2Nlc3NlZC5wdXQoaW5mby5nZXRQbHVnaW4oKS5nZXRHdWlkKCksIGluZm8pOwotCX0KLQkKLQkvKgotCSAqIENoZWNrIGNpcmN1bGFyIGRlcGVuZGVuY3kgYW1vbmcgdGhlIHBsdWdpbnMgb2YgdGhlIGxpYnJhcnkuCi0JICovCi0JcHVibGljIENoZWNrUmVzdWx0IGNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5KFRyYWNlciB0cmFjZXIsIGJvb2xlYW4gYWNjdW1FcnJvcnMpIHsKLQkJaWYgKHRyYWNlciA9PSBudWxsKSB7Ci0JCQl0cmFjZXIgPSBuZXcgVHJhY2VyKCkgewotCQkJCXB1YmxpYyB2b2lkIHRyYWNlKFN0cmluZyBsaW5lKSB7fQotCQkJfTsKLQkJfQotCQlsb25nIHVzZWRNZW0wID0gMDsKLQkJUnVudGltZSBydCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpOyAKLQkJaWYgKHByb2ZpbGluZykgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWl0Lm5leHQoKTsKLQkJCX0KLQkJCVByb2ZpbGluZ1V0aWwuZnVsbEdDKCk7Ci0JCQl1c2VkTWVtMCA9IHJ0LnRvdGFsTWVtb3J5KCkgLSBydC5mcmVlTWVtb3J5KCk7Ci0JCX0KLQotCQlDaGVja1Jlc3VsdCByZXN1bHQgPSBjaGVja0NpcmN1bGFyRGVwZW5kbmVjeV8odHJhY2VyLCBhY2N1bUVycm9ycyk7Ci0JCQotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlQcm9maWxpbmdVdGlsLmZ1bGxHQygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gdXNlZE1lbTA6ICIgKyB1c2VkTWVtMC8xMDAwICsgIiBrIGJ5dGVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbG9uZyB1c2VkTWVtMSA9IHJ0LnRvdGFsTWVtb3J5KCkgLSBydC5mcmVlTWVtb3J5KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB1c2VkTWVtMTogIiArIHVzZWRNZW0xLzEwMDAgKyAiIGsgYnl0ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBkaWZmTWVtOiAiICsgKHVzZWRNZW0xIC0gdXNlZE1lbTApLzEwMDAgKyAiIGsgYnl0ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBDaGVja1Jlc3VsdCBjaGVja0NpcmN1bGFyRGVwZW5kbmVjeV8oVHJhY2VyIHRyYWNlciwgYm9vbGVhbiBhY2N1bUVycm9ycykgewotCQlDaGVja1Jlc3VsdCByZXN1bHQgPSBuZXcgQ2hlY2tSZXN1bHQoKTsKLQkJCi0JCUxpc3QgcGx1Z2lucyA9IGxpYi5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQkKLQkJCVBsdWdpbkRlcEluZm8gaW5mbyA9IHJlZ2lzdGVyUGx1Z2luKHBsdWdpbiwgdHJ1ZSk7Ci0JCQlMaXN0IGNpckxpc3QgPSBnZXRBbmRDbGVhckNpcmN1bGFyTGlzdCgpOwkJCQotCQkJYm9vbGVhbiBsb29wID0gY2lyTGlzdCAhPSBudWxsICYmICFjaXJMaXN0LmlzRW1wdHkoKTsKLQkJCWlmIChsb29wKSB7Ci0JCQkJdHJhY2VyLnRyYWNlKCJFcnJvcj4gQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZDogIik7CQkvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaT0wOyBpPGNpckxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJUGx1Z2luRGVwSW5mbyBsb29wSW5mbyA9IChQbHVnaW5EZXBJbmZvKSBjaXJMaXN0LmdldChpKTsKLQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gbG9vcEluZm8uZ2V0UGx1Z2luKCk7CQkJCQkJCQotCQkJCQl0cmFjZXIudHJhY2UoIkVycm9yPiAiICsgaSArICI6ICIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbSkpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlyZXN1bHQuY2lyY3VsYXJMaXN0LmFkZChjaXJMaXN0KTsKLQkJCQlpZiAoISBhY2N1bUVycm9ycykgewotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX0KLQkJfQkJCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDaGVja1Jlc3VsdCB7Ci0JCXB1YmxpYyBMaXN0IGNpcmN1bGFyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCXB1YmxpYyBpbnQgZ2V0RXJyb3JDb3VudCgpIHsKLQkJCXJldHVybiBjaXJjdWxhckxpc3Quc2l6ZSgpOwotCQl9CQkKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVHJhY2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVHJhY2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YTQxM2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1RyYWNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBUcmFjZXIgewotCXZvaWQgdHJhY2UoU3RyaW5nIGxpbmUpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1VuaXF1ZU5hbWVIYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVW5pcXVlTmFtZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgyNDA5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVW5pcXVlTmFtZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIGhlbHBlciBjbGFzcyBmb3IgbWV0aG9kIGVsZW1lbnQgdW5pcXVlIG5hbWUgaGFuZGxpbmcKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmlxdWVOYW1lSGFuZGxlciB7Ci0JcHJpdmF0ZSBTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkKLQkvKioKLQkgKiBFbXB0eSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBVbmlxdWVOYW1lSGFuZGxlcigpIHsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJOYW1lcyhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RFbGVtZW50PiBlbGVtZW50cykgewotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8PyBleHRlbmRzIE1ldGhvZEVsZW1lbnQ+IGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gaXQubmV4dCgpOwotCQkJcmVnaXN0ZXIoZWxlbWVudC5nZXROYW1lKCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyUHJlc2VudGF0aW9uTmFtZXMoQ29sbGVjdGlvbjxEZXNjcmliYWJsZUVsZW1lbnQ+IGVsZW1lbnRzKSB7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChJdGVyYXRvcjxEZXNjcmliYWJsZUVsZW1lbnQ+IGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRGVzY3JpYmFibGVFbGVtZW50IGVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQlyZWdpc3RlcihlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlcihTdHJpbmcgbmFtZSkgewotCQluYW1lcy5hZGQobmFtZS50b1VwcGVyQ2FzZSgpKTsJCQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlTmFtZShTdHJpbmcgb2xkTmFtZSkgewkJCi0JCVN0cmluZyBuYW1lID0gb2xkTmFtZTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZShuYW1lcy5jb250YWlucyhuYW1lLnRvVXBwZXJDYXNlKCkpKSB7Ci0JCQlpKys7Ci0JCQluYW1lID0gb2xkTmFtZSArICJfIiArIGk7CQkvLyROT04tTkxTLTEkIAotCQl9CQkJCi0JCXJldHVybiBuYW1lOwotCX0KLQkKLQkKLQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9VbmlxdWVOYW1lUE5hbWVIYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVW5pcXVlTmFtZVBOYW1lSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjQyNWQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9VbmlxdWVOYW1lUE5hbWVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBoZWxwZXIgY2xhc3MgZm9yIHVuaXF1ZSBuYW1lIGFuZCBwcmVzZW50YXRpb24gbmFtZSBoYW5kbGluZwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFVuaXF1ZU5hbWVQTmFtZUhhbmRsZXIgewotCXByaXZhdGUgVW5pcXVlTmFtZUhhbmRsZXIgbmFtZUhhbmRsZXIgPSBuZXcgVW5pcXVlTmFtZUhhbmRsZXIoKTsKLQlwcml2YXRlIFVuaXF1ZU5hbWVIYW5kbGVyIHBuYW1lSGFuZGxlciA9IG5ldyBVbmlxdWVOYW1lSGFuZGxlcigpOwotCQotCS8qKgotCSAqIEVtcHR5IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFVuaXF1ZU5hbWVQTmFtZUhhbmRsZXIoQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiBuYW1lRWxlbWVudHMsIENvbGxlY3Rpb248RGVzY3JpYmFibGVFbGVtZW50PiBwbmFtZUVsZW1lbnRzKSB7Ci0JCW5hbWVIYW5kbGVyLnJlZ2lzdGVyTmFtZXMobmFtZUVsZW1lbnRzKTsKLQkJcG5hbWVIYW5kbGVyLnJlZ2lzdGVyUHJlc2VudGF0aW9uTmFtZXMocG5hbWVFbGVtZW50cyk7CQkKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbnN1cmVVbmlxdWUoRGVzY3JpYmFibGVFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIG5hbWUgPSBuYW1lSGFuZGxlci5nZXRVbmlxdWVOYW1lKGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkJaWYgKCEgbmFtZS5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQllbGVtZW50LnNldE5hbWUobmFtZSk7CQkKLQkJfQotCQluYW1lSGFuZGxlci5yZWdpc3RlcihuYW1lKTsKLQkJCi0JCVN0cmluZyBwbmFtZSA9IHBuYW1lSGFuZGxlci5nZXRVbmlxdWVOYW1lKGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJaWYgKCEgcG5hbWUuZXF1YWxzKGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKSkgewotCQkJZWxlbWVudC5zZXRQcmVzZW50YXRpb25OYW1lKHBuYW1lKTsJCQotCQl9Ci0JCXBuYW1lSGFuZGxlci5yZWdpc3RlcihwbmFtZSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1Vwd2FyZFJlYWNoYWJsZUluZm8uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9VcHdhcmRSZWFjaGFibGVJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMTVhZmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1Vwd2FyZFJlYWNoYWJsZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBoYW5kbGVzIHVwd2FyZCByZWFjaGFibGUgaW5mbyBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeSBjaGVja2luZwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFVwd2FyZFJlYWNoYWJsZUluZm8gaW1wbGVtZW50cyBJRGVwZW5kZW5jeUluZm8gewotCi0JcHJpdmF0ZSBEZXBlbmRlbmN5SW5mb01nciBtZ3I7Ci0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBIYXNoTWFwIHBhcmVudE1hcDsKLQlwcml2YXRlIGJvb2xlYW4gY29tcGxldGUgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgVXB3YXJkUmVhY2hhYmxlSW5mbyhEZXBlbmRlbmN5SW5mb01nciBtZ3IsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLm1nciA9IG1ncjsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGNvbXBsZXRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBidWlsZChib29sZWFuIGNoZWNrQ2lyY3VsYXIpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBidWlsZDogIiArIHRoaXMpOwkvLyROT04tTkxTLTEkCi0JCX0KLQkJYnVpbGRJbm5lcihjaGVja0NpcmN1bGFyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkSW5uZXIoYm9vbGVhbiBjaGVja0NpcmN1bGFyKSB7Ci0JCU9iamVjdCBpbmZvID0gbWdyLmdldFByb2Nlc3NlZEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWlmIChpbmZvID09IHRoaXMgJiYgY29tcGxldGUpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IgaW4gYnVpbGRJbm5lcjogIiArIGluZm8pOwkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCW1nci5hZGRUb1Byb2Nlc3NlZCh0aGlzKTsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBidWlsZElubmVyOiAiICsgdGhpcyk7CS8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7CQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQlidWlsZElubmVyXyhjaGVja0NpcmN1bGFyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkSW5uZXJfKGJvb2xlYW4gY2hlY2tDaXJjdWxhcikgewotCQlMaXN0IHBhcmVudHMgPSBnZXRNaXhlZFBhcmVudExpc3QoKTsKLQkJaW50IHN6ID0gcGFyZW50cyA9PSBudWxsID8gMCA6IHBhcmVudHMuc2l6ZSgpOwotCQlpZiAoc3ogPT0gMCkgewotCQkJY29tcGxldGUgPSB0cnVlOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlwYXJlbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlMaXN0IHByb2Nlc3NlZFBhcmVudHMgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaTwgc3o7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBwYXJlbnRFbGVtID0gKE1ldGhvZEVsZW1lbnQpIHBhcmVudHMuZ2V0KGkpOwotCQkJVXB3YXJkUmVhY2hhYmxlSW5mbyBwaW5mbyA9IChVcHdhcmRSZWFjaGFibGVJbmZvKSBtZ3IuZ2V0UHJvY2Vzc2VkSW5mbyhwYXJlbnRFbGVtKTsKLQkJCWlmIChwaW5mbyA9PSBudWxsKXsKLQkJCQlwaW5mbyA9IG5ldyBVcHdhcmRSZWFjaGFibGVJbmZvKG1nciwgcGFyZW50RWxlbSk7Ci0JCQkJcGFyZW50TWFwLnB1dChwYXJlbnRFbGVtLmdldEd1aWQoKSwgcGluZm8pOwotCQkJCXBpbmZvLmJ1aWxkSW5uZXIoY2hlY2tDaXJjdWxhcik7Ci0JCQl9IGVsc2UgewotCQkJCXBhcmVudE1hcC5wdXQocGFyZW50RWxlbS5nZXRHdWlkKCksIHBpbmZvKTsKLQkJCQlpZiAoY2hlY2tDaXJjdWxhcikgewotCQkJCQlpZiAocHJvY2Vzc2VkUGFyZW50cyA9PSBudWxsKSB7Ci0JCQkJCQlwcm9jZXNzZWRQYXJlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQl9Ci0JCQkJCXByb2Nlc3NlZFBhcmVudHMuYWRkKHBpbmZvKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY29tcGxldGUgPSB0cnVlOwotCQkJCi0JCWlmIChjaGVja0NpcmN1bGFyICYmIHByb2Nlc3NlZFBhcmVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaT0wOyBpPHByb2Nlc3NlZFBhcmVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZWFjaGFibGVCeSgoSURlcGVuZGVuY3lJbmZvKSBwcm9jZXNzZWRQYXJlbnRzLmdldChpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcmVhY2hhYmxlQnkoSURlcGVuZGVuY3lJbmZvIGluZm8pICB7Ci0JCWlmICghIChpbmZvIGluc3RhbmNlb2YgVXB3YXJkUmVhY2hhYmxlSW5mbykpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gRW50cnkgcmVhY2hhYmxlQnk6IHRoaXMgLT4gIiArIHRoaXMpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBFbnRyeSByZWFjaGFibGVCeTogaW5mbyAtPiAiICsgaW5mbyk7CS8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7CQkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlYWNoYWJsZUJ5KChVcHdhcmRSZWFjaGFibGVJbmZvKSBpbmZvLCBuZXcgU3RhY2soKSwgbmV3IEhhc2hNYXAoKSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiByZWFjaGFibGVCeShVcHdhcmRSZWFjaGFibGVJbmZvIGluZm8sIFN0YWNrIHN0YWNrLCBNYXAgc2VlbikgIHsKLQkJc3RhY2sucHVzaChpbmZvKTsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiByZWFjaGFibGVCeTogdGhpcyAtPiAiICsgdGhpcyk7CQkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiByZWFjaGFibGVCeTogaW5mbyAtPiAiICsgaW5mbyk7CQkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiByZXQgPSAgcmVhY2hhYmxlQnlfKGluZm8sIHN0YWNrLCBzZWVuKTsKLQkJc3RhY2sucG9wKCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiByZWFjaGFibGVCeV8oVXB3YXJkUmVhY2hhYmxlSW5mbyBpbmZvLCBTdGFjayBzdGFjaywgTWFwIHNlZW4pICB7Ci0JCU1hcCB0ZXN0TWFwID0gaW5mby5wYXJlbnRNYXA7CQkKLQkJaWYgKHRlc3RNYXAgPT0gbnVsbCB8fCB0ZXN0TWFwLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAodGVzdE1hcC5jb250YWluc0tleShlbGVtZW50LmdldEd1aWQoKSkpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IENvbnRhaW5lZCBpbiBwYXJlbnRNYXAgb2Y6ICIgKyBpbmZvKTsJCS8vJE5PTi1OTFMtMSQJCQkJCQkJCQkKLQkJCX0KLQkJCXN0YWNrLnB1c2godGhpcyk7Ci0JCQltZ3IubG9nQ2lyY3VsYXJEZXBlbmRlbmN5KChTdGFjaykgc3RhY2suY2xvbmUoKSk7Ci0JCQlzdGFjay5wb3AoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlpZiAoc2Vlbi5jb250YWluc0tleShpbmZvLmdldEVsZW1lbnQoKS5nZXRHdWlkKCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCQotCQlzZWVuLnB1dChpbmZvLmdldEVsZW1lbnQoKS5nZXRHdWlkKCksIGluZm8pOwotCQkKLQkJZm9yIChJdGVyYXRvciBpdCA9IHRlc3RNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJVXB3YXJkUmVhY2hhYmxlSW5mbyBwYXJlbnRJbmZvID0gKFVwd2FyZFJlYWNoYWJsZUluZm8pIGl0Lm5leHQoKTsKLQkJCWlmIChwYXJlbnRJbmZvLmNvbnRhaW5lZEluKHN0YWNrKSkgewotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBjb250YWluZWRJbiBzdGFjazogIiArIGluZm8pOwkJLy8kTk9OLU5MUy0xJAkJCQkJCQkJCQotCQkJCX0KLQkJCQlzdGFjay5wdXNoKHBhcmVudEluZm8pOwotCQkJCW1nci5sb2dDaXJjdWxhckRlcGVuZGVuY3koKFN0YWNrKSBzdGFjay5jbG9uZSgpKTsKLQkJCQlzdGFjay5wb3AoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmICAocmVhY2hhYmxlQnkocGFyZW50SW5mbywgc3RhY2ssIHNlZW4pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0JCi0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQkKLQlwcml2YXRlIExpc3QgZ2V0TWl4ZWRQYXJlbnRMaXN0KCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWNvbGxlY3RQYXJlbnRMaXN0KGVsZW1lbnQsIGxpc3QpOwotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50OwotCQljb2xsZWN0UGFyZW50TGlzdEJ5VmFyaWFudFBhdGhzKHZlLCBsaXN0KTsKLQkJaWYgKHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUyApIHsKLQkJCW1nci5hZGRUb1JlcGxhY2VyTWFwKHRoaXMpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY29sbGVjdFBhcmVudExpc3QoTWV0aG9kRWxlbWVudCBlbGVtLCBMaXN0IGxpc3QpIHsKLQkJTGlzdCBwYXJlbnRMaXN0ID0gZ2V0UGFyZW50TGlzdChlbGVtKTsKLQkJCi0JCWludCBzeiA9IHBhcmVudExpc3QgPT0gbnVsbCA/IDAgOiBwYXJlbnRMaXN0LnNpemUoKTsKLQkJaWYgKG1nci5pc01vdmVFbGVtZW50KGVsZW0pKSB7Ci0JCQlpZiAoc3ogPiAxICYmICEoZWxlbSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwkKLQkJCX0KLQkJfSBlbHNlIGlmIChzeiA+IDApIHsKLQkJCWxpc3QuYWRkQWxsKHBhcmVudExpc3QpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0UGFyZW50TGlzdChNZXRob2RFbGVtZW50IGVsZW0pIHsKLQkJTGlzdCBwYXJlbnRMaXN0ID0gbnVsbDsKLQkJCi0JCWlmIChlbGVtIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCXBhcmVudExpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKChDdXN0b21DYXRlZ29yeSkgZWxlbSk7Ci0JCX0gZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQlwYXJlbnRMaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGVsaXZlcmFibGVzKChEZWxpdmVyYWJsZSkgZWxlbSk7CQkJCi0JCX0gZWxzZSB7CQotCQkJT2JqZWN0IHBhcmVudCA9IGdldFNhbWVUeXBlUGFyZW50KGVsZW0pOwotCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlwYXJlbnRMaXN0LmFkZChwYXJlbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXJlbnRMaXN0OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY29sbGVjdFBhcmVudExpc3RCeVZhcmlhbnRQYXRocyhWYXJpYWJpbGl0eUVsZW1lbnQgdmUsIExpc3QgbGlzdCkgewotCQlpZiAoISBtZ3IuaXNGaWx0ZXJFbGVtZW50KHZlKSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHBhcmVudFZlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBwYXJlbnRWZSA9PSBudWxsID8gbnVsbCA6IHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTIHx8IHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKSB7Ci0JCQkJbGlzdC5hZGQocGFyZW50VmUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG1nci5pc0RuZEVsZW1lbnQodmUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCQkKLQkJZm9yIChJdGVyYXRvciBpdCA9IFRuZ1V0aWwuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKHZlLCBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUykgOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgZXh0ZW5kZXIgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQlpZiAoISBtZ3IuaXNGaWx0ZXJFbGVtZW50KGV4dGVuZGVyKSkgewotCQkJCWxpc3QuYWRkKGV4dGVuZGVyKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRTYW1lVHlwZVBhcmVudChNZXRob2RFbGVtZW50IGVsZW0pIHsKLQkJaWYgKGVsZW0gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJcmV0dXJuICgoQWN0aXZpdHkpIGVsZW0pLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQl9Ci0JCQkKLQkJTWV0aG9kRWxlbWVudCBwYXJlbnQgPSAoTWV0aG9kRWxlbWVudCkgZWxlbS5lQ29udGFpbmVyKCk7Ci0JCXJldHVybiBwYXJlbnQuZ2V0VHlwZSgpID09IGVsZW0uZ2V0VHlwZSgpID8gcGFyZW50IDogbnVsbDsKLQl9CQkKLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpbmhlcml0QW5jZXN0b3IoVmFyaWFiaWxpdHlUeXBlIHR5cGUpIHsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IHBhcmVudFZlID0gKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQpLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJaWYgKHBhcmVudFZlID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQpLmdldFZhcmlhYmlsaXR5VHlwZSgpICE9IHR5cGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlBcnJheUxpc3QgbWl4UGFyZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsJCi0JCWNvbGxlY3RQYXJlbnRMaXN0KGVsZW1lbnQsIG1peFBhcmVudExpc3QpOwotCQlpZiAobWl4UGFyZW50TGlzdCAhPSBudWxsICYmIG1peFBhcmVudExpc3QuY29udGFpbnMocGFyZW50VmUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCVVwd2FyZFJlYWNoYWJsZUluZm8gcGFyZW50VmVJbmZvID0gKFVwd2FyZFJlYWNoYWJsZUluZm8pIHBhcmVudE1hcC5nZXQocGFyZW50VmUuZ2V0R3VpZCgpKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBhcmVudE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlVcHdhcmRSZWFjaGFibGVJbmZvIHBhcmVudEluZm8gPSAoVXB3YXJkUmVhY2hhYmxlSW5mbykgaXQubmV4dCgpOwotCQkJaWYgIChwYXJlbnRWZUluZm8gPT0gcGFyZW50SW5mbykgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHBhcmVudFZlSW5mby5yZWFjaGFibGVCeShwYXJlbnRJbmZvKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLy9UaGlzIHdvdWxkIHNjYWxlIHVwIGZvciBwZXJmb3JtYW5jZSB3aGVuIGluZm9MaXN0IGdldHMgbGFyZ2UKLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbmVkSW4oTGlzdCBpbmZvTGlzdCkgewotCQlpbnQgc3ogPSBpbmZvTGlzdCA9PSBudWxsID8gMCA6IGluZm9MaXN0LnNpemUoKTsKLQkJaWYgKHN6ID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgZ3VpZCA9IGdldEVsZW1lbnQoKS5nZXRHdWlkKCk7Ci0JCWlmIChzeiA9PSAxKSB7Ci0JCQlyZXR1cm4gZ3VpZC5lcXVhbHMoKChJRGVwZW5kZW5jeUluZm8pIGluZm9MaXN0LmdldCgwKSkuZ2V0RWxlbWVudCgpLmdldEd1aWQoKSk7Ci0JCX0KLQkJTWFwIGxpc3RNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpPTA7IGk8c3o7IGkrKykgewotCQkJSURlcGVuZGVuY3lJbmZvIGluZm8gPSAoSURlcGVuZGVuY3lJbmZvKSBpbmZvTGlzdC5nZXQoaSk7Ci0JCQlsaXN0TWFwLnB1dChpbmZvLmdldEVsZW1lbnQoKS5nZXRHdWlkKCksIGluZm8pOwotCQl9Ci0JCQotCQlyZXR1cm4gbGlzdE1hcC5jb250YWluc0tleShndWlkKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXR1cy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5NjJkYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25TdGF0dXMgZXh0ZW5kcyBTdGF0dXMgewotCi0JcHJpdmF0ZSBPYmplY3QgY2hlY2tlZE9iamVjdDsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JLyoqCi0JICogQHBhcmFtIHNldmVyaXR5Ci0JICogQHBhcmFtIGNvZGUKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEBwYXJhbSBjaGVja2VkT2JqZWN0Ci0JICovCi0JcHVibGljIFZhbGlkYXRpb25TdGF0dXMoaW50IHNldmVyaXR5LCBpbnQgY29kZSwgU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBjaGVja2VkT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlzdXBlcihzZXZlcml0eSwgTGlicmFyeUVkaXRQbHVnaW4uUExVR0lOX0lELCBjb2RlLCBtZXNzYWdlLCBudWxsKTsKLQkJdGhpcy5jaGVja2VkT2JqZWN0ID0gY2hlY2tlZE9iamVjdDsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0JCi0JcHVibGljIFZhbGlkYXRpb25TdGF0dXMoU3RyaW5nIHBsdWdpbklkLCBpbnQgc2V2ZXJpdHksIGludCBjb2RlLCBTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGNoZWNrZWRPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXN1cGVyKHNldmVyaXR5LCBwbHVnaW5JZCwgY29kZSwgbWVzc2FnZSwgbnVsbCk7Ci0JCXRoaXMuY2hlY2tlZE9iamVjdCA9IGNoZWNrZWRPYmplY3Q7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRDaGVja2VkT2JqZWN0KCkgewotCQlyZXR1cm4gY2hlY2tlZE9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI3N2ZkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5OYW1lQ2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0KLS8qKgotICogTmFtZSB2YWxpZGF0b3IgZm9yIENvbnRlbnRFbGVtZW50LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IgZXh0ZW5kcyBVbmlxdWVuZXNzVmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvcihFT2JqZWN0IGNvbnRhaW5lciwgQ29udGVudEVsZW1lbnQgZSwKLQkJCUlGaWx0ZXIgY2hpbGRGaWx0ZXIpIHsKLQkJc3VwZXIoY29udGFpbmVyLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgY2hpbGRGaWx0ZXIsIGUsCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yKEVPYmplY3QgcGFyZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGNvbnRhaW5pbmdGZWF0dXJlLCBDb250ZW50RWxlbWVudCBlLAotCQkJSUZpbHRlciBjaGlsZEZpbHRlcikgewotCQlzdXBlcihwYXJlbnQsIGNvbnRhaW5pbmdGZWF0dXJlLCBjaGlsZEZpbHRlciwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWwuVW5pcXVlbmVzc1ZhbGlkYXRvciNpc1ZhbGlkKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJQ29udGVudEVsZW1lbnQgZSA9IChDb250ZW50RWxlbWVudCkgb2JqZWN0OwotCi0JCS8vIDE1Njk0NSAtIEVsZW1lbnQgbmFtZSBuZWVkIHRvIGFsbG93IG1vcmUgc3BlY2lhbCBjaGFyYWN0ZXJzIHN1Y2ggYXMgPyAKLQkJLy8gaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZ2VuZXJhdGUgYSByZXNvdXJjZSBmaWxlCi0JCWlmICggZSBpbnN0YW5jZW9mIFNlY3Rpb24gKSB7Ci0JCQlyZXR1cm4gbmV3VGV4dDsKLQkJfQotCQkKLQkJU3RyaW5nIG1zZyA9IFRuZ1V0aWwuY2hlY2tFbGVtZW50TmFtZShuZXdUZXh0LCBUbmdVdGlsLmdldFR5cGVUZXh0KGUpKTsKLQkJaWYgKG1zZyAhPSBudWxsKQotCQkJcmV0dXJuIG1zZzsKLQkJCi0JCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNvbnRhaW5lcik7Ci0JCQotCQkJSW50ZWdlciBtYXggPSBuZXcgSW50ZWdlcihNYXhGaWxlUGF0aE5hbWVMZW5ndGgpOwotCQkJaWYgKCEgTmFtZUNoZWNrZXIuY2hlY2tGaWxlUGF0aExlbmd0aChwbHVnaW4sIGUsIG5ld1RleHQsIG1heC5pbnRWYWx1ZSgpLCBudWxsKSkgewotCQkJCW1zZyA9IE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmZpbGVQYXRoTmFtZVRvb0xvbmdfbXNnLCAKLQkJCQkJCW5ldyBPYmplY3RbXSB7IG1heCB9ICk7Ci0JCQkJcmV0dXJuIG1zZzsKLQkJCX0KLQkJfQotCi0JCS8vIENoZWNrIHdoZXRoZXIgYSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsICYmIENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuaGFzUHJlc2VudGF0aW9uKGUpKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY29udGFpbmVyKTsKLQkJCWlmKHBsdWdpbiA9PSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKSkgewotCQkJCVVSSSB1cmkgPSBwbHVnaW4uZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQkJaWYodXJpLmlzRmlsZSgpKSB7Ci0JCQkJCUZpbGUgcGx1Z2luRGlyID0gbmV3IEZpbGUodXJpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCUlGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9ICgoSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpU2VydmljZXMuZ2V0TGlicmFyeVBlcnNpc3RlcihTZXJ2aWNlcy5YTUlfUEVSU0lTVEVOQ0VfVFlQRSkpOwkJCQotCQkJCQlTdHJpbmcgZm9sZGVyUGF0aCA9IHBlcnNpc3Rlci5nZXRGb2xkZXJSZWxhdGl2ZVBhdGgoZSk7Ci0JCQkJCVN0cmluZyBkaXIgPSBuZXcgU3RyaW5nQnVmZmVyKHBsdWdpbkRpci5nZXRBYnNvbHV0ZVBhdGgoKSkuYXBwZW5kKAotCQkJCQkJCUZpbGUuc2VwYXJhdG9yKS5hcHBlbmQoZm9sZGVyUGF0aCkudG9TdHJpbmcoKTsKLQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gbmV3VGV4dCArIHBlcnNpc3Rlci5nZXRGaWxlRXh0ZW5zaW9uKGUpOwotCQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsIGZpbGVOYW1lKTsKLQkJCQkJRmlsZSBjdXJyZW50RmlsZSA9IG51bGw7Ci0JCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gZS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCQkJaWYgKGNvbnRlbnQuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCQkJY3VycmVudEZpbGUgPSBuZXcgRmlsZShjb250ZW50LmVSZXNvdXJjZSgpLmdldFVSSSgpCi0JCQkJCQkJCS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljdXJyZW50RmlsZSA9IGZpbGU7Ci0JCQkJCX0KLQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkgJiYgIW5ld1RleHQuZXF1YWxzKGUuZ2V0TmFtZSgpKSAmJiAhZmlsZS5lcXVhbHMoY3VycmVudEZpbGUpKSB7Ci0JCQkJCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlQ29udGVudEZpbGVFcnJvcl9tc2csIGZpbGUpOyAKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci5pc1ZhbGlkKG5ld1RleHQpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9DdXN0b21DYXRlZ29yeU5hbWVWYWxpZGF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9DdXN0b21DYXRlZ29yeU5hbWVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAxMGZkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ3VzdG9tQ2F0ZWdvcnlOYW1lVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBOYW1lIHZhbGlkYXRvciBmb3IgQ3VzdG9tQ2F0ZWdvcnkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yeU5hbWVWYWxpZGF0b3IgZXh0ZW5kcyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IgewotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRhaW5lcgotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGNoaWxkRmlsdGVyCi0JICovCi0JcHVibGljIEN1c3RvbUNhdGVnb3J5TmFtZVZhbGlkYXRvcihDdXN0b21DYXRlZ29yeSBwYXJlbnQsIEN1c3RvbUNhdGVnb3J5IGUsCi0JCQlJRmlsdGVyIGNoaWxkRmlsdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgVW1hUGFja2FnZS5MaXRlcmFscy5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlRTLCBlLCBjaGlsZEZpbHRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvRG9Ob3RoaW5nVmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvRG9Ob3RoaW5nVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NTJiYjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL0RvTm90aGluZ1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBWYWxpZGF0b3IgdGhhdCB2YWxpZGF0ZXMgbm90aGluZy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgNCwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRG9Ob3RoaW5nVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEb05vdGhpbmdWYWxpZGF0b3IgSU5TVEFOQ0UgPSBuZXcgRG9Ob3RoaW5nVmFsaWRhdG9yKCk7Ci0KLQlwcml2YXRlIERvTm90aGluZ1ZhbGlkYXRvcigpIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTdGF0dXMgaXNWYWxpZChPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL01ldGhvZENvbmZpZ3VyYXRpb25OYW1lVmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvTWV0aG9kQ29uZmlndXJhdGlvbk5hbWVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZhODUxMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvTWV0aG9kQ29uZmlndXJhdGlvbk5hbWVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkFic3RyYWN0U3RyaW5nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5OYW1lQ2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCi0vKioKLSAqIE5hbWUgdmFsaWRhdG9yIGZvciBNZXRob2RDb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1heSAxMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzc5NzMKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3IgewotCi0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGxpYnJhcnk7Ci0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uTmFtZVZhbGlkYXRvcihNZXRob2RMaWJyYXJ5IGxpYiwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJbGlicmFyeSA9IGxpYjsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJbmV3VGV4dCA9IG5ld1RleHQudHJpbSgpOyAvL2ZpeCBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc3OTczCi0JCUludGVnZXIgbWF4ID0gbmV3IEludGVnZXIoTWF4RmlsZVBhdGhOYW1lTGVuZ3RoKTsKLQkJaWYgKCEgTmFtZUNoZWNrZXIuY2hlY2tGaWxlUGF0aExlbmd0aChsaWJyYXJ5LCBjb25maWcsIG5ld1RleHQsIG1heC5pbnRWYWx1ZSgpLCBudWxsKSkgewotCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmZpbGVQYXRoTmFtZVRvb0xvbmdfbXNnLCAKLQkJCQkJbmV3IE9iamVjdFtdIHsgbWF4IH0gKTsKLQkJCXJldHVybiBtc2c7Ci0JCX0KLQkJU3RyaW5nIGNvbmZpZ0ZvbGRlciA9ICgoSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpU2VydmljZXMuZ2V0TGlicmFyeVBlcnNpc3RlcihTZXJ2aWNlcy5YTUlfUEVSU0lTVEVOQ0VfVFlQRSkpIAotCQkJLmdldEZvbGRlclJlbGF0aXZlUGF0aChjb25maWcpOwotCQlGaWxlIGRpciA9IG5ldyBGaWxlKG5ldyBGaWxlKGxpYnJhcnkuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpCi0JCQkJCQkuZ2V0UGFyZW50KCksIGNvbmZpZ0ZvbGRlcik7Ci0JCXJldHVybiBUbmdVdGlsLmNoZWNrTmFtZShkaXIsIGxpYnJhcnkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCksIGNvbmZpZywKLQkJCQluZXdUZXh0LCBUbmdVdGlsLmdldFR5cGVUZXh0KGNvbmZpZyksIGZhbHNlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL01ldGhvZFBsdWdpbk5hbWVWYWxpZGF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9NZXRob2RQbHVnaW5OYW1lVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZGU2NzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL01ldGhvZFBsdWdpbk5hbWVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkFic3RyYWN0U3RyaW5nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5OYW1lQ2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjEKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFBsdWdpbk5hbWVWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdFN0cmluZ1ZhbGlkYXRvciB7Ci0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGxpYjsKLQlwcml2YXRlIE1ldGhvZFBsdWdpbiBwbHVnaW47CQotCi0JLyoqCi0JICogQHBhcmFtIGxpYgotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW5OYW1lVmFsaWRhdG9yKE1ldGhvZExpYnJhcnkgbGliLCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGliID0gbGliOwotCQl0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCVN0cmluZyBtc2cgPSBUbmdVdGlsLmNoZWNrUGx1Z2luTmFtZShuZXdUZXh0KTsKLQkJaWYobXNnICE9IG51bGwpIHsKLQkJCXJldHVybiBtc2c7Ci0JCX0KLQkJCi0JCUludGVnZXIgbWF4ID0gbmV3IEludGVnZXIoTWF4RmlsZVBhdGhOYW1lTGVuZ3RoKTsKLQkJaWYgKCEgTmFtZUNoZWNrZXIuY2hlY2tGaWxlUGF0aExlbmd0aChsaWIsIHBsdWdpbiwgbmV3VGV4dCwgbWF4LmludFZhbHVlKCksIG51bGwpKSB7Ci0JCQltc2cgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5maWxlUGF0aE5hbWVUb29Mb25nX21zZywgCi0JCQkJCW5ldyBPYmplY3RbXSB7IG1heCB9ICk7Ci0JCQlyZXR1cm4gbXNnOwotCQl9Ci0JCQotCQlGaWxlIGRpciA9IG5ldyBGaWxlKGxpYi5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkKLQkJCQkuZ2V0UGFyZW50RmlsZSgpOwotCQlTdHJpbmcgZWxlbWVudFR5cGVUZXh0ID0gKHBsdWdpbiAhPSBudWxsKSA/IFRuZ1V0aWwuZ2V0VHlwZVRleHQocGx1Z2luKQotCQkJCTogVG5nVXRpbC5nZXRUeXBlVGV4dCgiTWV0aG9kUGx1Z2luIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tOYW1lKGRpciwgbGliLmdldE1ldGhvZFBsdWdpbnMoKSwgcGx1Z2luLCBuZXdUZXh0LAotCQkJCWVsZW1lbnRUeXBlVGV4dCwgdHJ1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUHJvY2Vzc0NvbXBvbmVudE5hbWVWYWxpZGF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9Qcm9jZXNzQ29tcG9uZW50TmFtZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjVhNjBiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9Qcm9jZXNzQ29tcG9uZW50TmFtZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkFic3RyYWN0U3RyaW5nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5OYW1lQ2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLQotLyoqCi0gKiBWYWxpZGF0ZXMgdGhlIG5hbWUgb2YgYSBwcm9jZXNzIGNvbXBvbmVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudE5hbWVWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdFN0cmluZ1ZhbGlkYXRvciB7Ci0KLQlwcml2YXRlIFByb2Nlc3NQYWNrYWdlIHBhcmVudDsKLQotCXByaXZhdGUgUHJvY2Vzc0NvbXBvbmVudCBwcm9jQ29tcDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnROYW1lVmFsaWRhdG9yKFByb2Nlc3NQYWNrYWdlIHBhcmVudCwKLQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXApIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMucHJvY0NvbXAgPSBwcm9jQ29tcDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJU3RyaW5nIHJlbGF0aXZlUGF0aCA9ICgoSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpU2VydmljZXMuZ2V0TGlicmFyeVBlcnNpc3RlcihTZXJ2aWNlcy5YTUlfUEVSU0lTVEVOQ0VfVFlQRSkpCi0JCQkuZ2V0Rm9sZGVyUmVsYXRpdmVQYXRoKHByb2NDb21wKTsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHBhcmVudCk7Ci0JCQotCQlJbnRlZ2VyIG1heCA9IG5ldyBJbnRlZ2VyKE1heEZpbGVQYXRoTmFtZUxlbmd0aCk7Ci0JCWlmICghIE5hbWVDaGVja2VyLmNoZWNrRmlsZVBhdGhMZW5ndGgocGx1Z2luLCBwcm9jQ29tcCwgbmV3VGV4dCwgbWF4LmludFZhbHVlKCksIG51bGwpKSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZmlsZVBhdGhOYW1lVG9vTG9uZ19tc2csIAotCQkJCQluZXcgT2JqZWN0W10geyBtYXggfSApOwotCQkJcmV0dXJuIG1zZzsKLQkJfQotCQkKLQkJRmlsZSBkaXIgPSBuZXcgRmlsZSgKLQkJCQluZXcgRmlsZShwbHVnaW4uZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpCi0JCQkJCQkuZ2V0UGFyZW50KCkKLQkJCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyByZWxhdGl2ZVBhdGgpOwotCQlpZiAoISBuZXdUZXh0LmVxdWFscyhTdHJVdGlsLm1ha2VWYWxpZEZpbGVOYW1lKG5ld1RleHQpKSkgewotCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmludmFsaWRFbGVtZW50TmFtZUVycm9yM19tc2csIG5ld1RleHQpOyAKLQkJfQotCQlyZXR1cm4gVG5nVXRpbC5jaGVja05hbWUoZGlyLCBwYXJlbnQuZ2V0Q2hpbGRQYWNrYWdlcygpLCBwcm9jQ29tcCwKLQkJCQluZXdUZXh0LCBUbmdVdGlsLmdldFR5cGVUZXh0KHByb2NDb21wKSwgdHJ1ZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL1VuaXF1ZW5lc3NWYWxpZGF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9VbmlxdWVuZXNzVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMTE2NTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL1VuaXF1ZW5lc3NWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBWYWxpZGF0ZXMgdGhlIHVuaXF1ZW5lc3Mgb2YgYW4gb2JqZWN0IHdpdGhpbiBhIGdpdmVuIGZlYXR1cmUgdGhhdCBjb250YWlucyBpdC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVuaXF1ZW5lc3NWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yIHsKLQlwcm90ZWN0ZWQgRU9iamVjdCBvYmplY3Q7Ci0KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JcHJpdmF0ZSBTdHJpbmcgZmVhdHVyZU5hbWU7Ci0KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjb250YWluaW5nRmVhdHVyZTsKLQotCXByaXZhdGUgSUZpbHRlciBjaGlsZEZpbHRlcjsKLQotCXByb3RlY3RlZCBFT2JqZWN0IGNvbnRhaW5lcjsKLQotCXB1YmxpYyBVbmlxdWVuZXNzVmFsaWRhdG9yKEVPYmplY3QgY29udGFpbmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGNvbnRhaW5pbmdGZWF0dXJlLCBJRmlsdGVyIGNoaWxkRmlsdGVyLAotCQkJRU9iamVjdCBvYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXRoaXMoY29udGFpbmVyLCBjb250YWluaW5nRmVhdHVyZSwgY2hpbGRGaWx0ZXIsIG9iaiwgZmVhdHVyZSwgU3RyVXRpbAotCQkJCS50b0xvd2VyKFRuZ1V0aWwuZ2V0RmVhdHVyZVRleHQoZmVhdHVyZSkpKTsKLQl9Ci0KLQlwdWJsaWMgVW5pcXVlbmVzc1ZhbGlkYXRvcihFT2JqZWN0IGNvbnRhaW5lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBjb250YWluaW5nRmVhdHVyZSwgSUZpbHRlciBjaGlsZEZpbHRlciwKLQkJCUVPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCXRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOwotCQlvYmplY3QgPSBvYmo7Ci0JCXRoaXMuY29udGFpbmluZ0ZlYXR1cmUgPSBjb250YWluaW5nRmVhdHVyZTsKLQkJdGhpcy5jaGlsZEZpbHRlciA9IGNoaWxkRmlsdGVyOwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLmZlYXR1cmVOYW1lID0gZmVhdHVyZU5hbWU7Ci0JfQotCQotCXZvaWQgc2V0Q2hpbGRGaWx0ZXIoSUZpbHRlciBjaGlsZEZpbHRlcikgewotCQl0aGlzLmNoaWxkRmlsdGVyID0gY2hpbGRGaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQluZXdUZXh0ID0gbmV3VGV4dC50cmltKCk7Ci0JCWlmIChTdHJVdGlsLmlzQmxhbmsobmV3VGV4dCkpIHsKLQkJCS8vIHJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2csCi0JCQkJCWZlYXR1cmVOYW1lKTsKLQkJfQotCQlDb2xsZWN0aW9uIGNoaWxkcmVuOwotCQlpZiAoY29udGFpbmluZ0ZlYXR1cmUgPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBjb250YWluZXIuZUNvbnRlbnRzKCk7Ci0JCX0gZWxzZSB7Ci0JCQljaGlsZHJlbiA9IChDb2xsZWN0aW9uKSBjb250YWluZXIuZUdldChjb250YWluaW5nRmVhdHVyZSk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCAhPSBvYmplY3QgJiYgY2hpbGRGaWx0ZXIuYWNjZXB0KGNoaWxkKSkgewotCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgKChFT2JqZWN0KSBjaGlsZCkuZUdldChmZWF0dXJlKTsKLQkJCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKG5ld1RleHQpKSB7Ci0JCQkJCS8vIHJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2csCi0JCQkJCQkJbmV3VGV4dCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTdGF0dXMgaXNWYWxpZChPYmplY3QgdmFsdWUpIHsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW47Ci0JCWlmIChjb250YWluaW5nRmVhdHVyZSA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IGNvbnRhaW5lci5lQ29udGVudHMoKTsKLQkJfSBlbHNlIHsKLQkJCWNoaWxkcmVuID0gKENvbGxlY3Rpb24pIGNvbnRhaW5lci5lR2V0KGNvbnRhaW5pbmdGZWF0dXJlKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkICE9IG9iamVjdCAmJiBjaGlsZEZpbHRlci5hY2NlcHQoY2hpbGQpKSB7Ci0JCQkJU3RyaW5nIG8gPSAoU3RyaW5nKSAoKEVPYmplY3QpIGNoaWxkKS5lR2V0KGZlYXR1cmUpOwotCQkJCWlmIChvLmVxdWFscyh2YWx1ZSkpIHsKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwKLQkJCQkJCQkwLAotCQkJCQkJCU5MUwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUZlYXR1cmVWYWx1ZSwKLQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQlUbmdVdGlsLmdldExhYmVsKGNvbnRhaW5lciksCi0JCQkJCQkJCQkJCQkJZmVhdHVyZU5hbWUKLQkJCQkJCQkJCQkJfSksIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRFT2JqZWN0KCkgewotCQlyZXR1cm4gb2JqZWN0OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzQ2OTczLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkFic3RyYWN0U3RyaW5nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uTmFtZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBJVmFsaWRhdG9yRmFjdG9yeS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvckZhY3RvcnkgaW1wbGVtZW50cyBJVmFsaWRhdG9yRmFjdG9yeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBjb250cmlidXRlZFZhbGlkYXRvckZhY3RvcmllczsKLQotCXByaXZhdGUgc3RhdGljIElWYWxpZGF0b3JGYWN0b3J5IGluc3RhbmNlOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3RvcnkjY3JlYXRlTmFtZVZhbGlkYXRvcihvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50KQotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZU5hbWVWYWxpZGF0b3IoT2JqZWN0IHBhcmVudCwgQ29udGVudEVsZW1lbnQgZSkgewotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkgJiYgZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlyZXR1cm4gbmV3IENvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvcigoRU9iamVjdCkgcGFyZW50LAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCksIGUsCi0JCQkJCW5ldyBUeXBlRmlsdGVyKGUpKTsKLQkJfQotCQlFT2JqZWN0IGNvbnRhaW5lciA9IG51bGw7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQljb250YWluZXIgPSAoRU9iamVjdCkgcGFyZW50OwotCQl9Ci0JCXJldHVybiBuZXcgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yKGNvbnRhaW5lciwgZSwgbmV3IFR5cGVGaWx0ZXIoZSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5I2NyZWF0ZVByZXNlbnRhdGlvbk5hbWVWYWxpZGF0b3Iob3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCkKLQkgKiAgICAgIENoYW5nZWQgZnJvbSBDb250ZW50RWxlbWVudCB0byBEZXNjcmliYWJsZUVsZW1lbnQsIGJlY2F1c2UKLQkgKiAgICAgIFByZXNlbnRhdGlvbk5hbWUgYXR0cmlidXRlIGlzIGF2YWlsYWJsZSBpbiBEZXNjcmliYWJsZUVsZW1lbnQuCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgY3JlYXRlUHJlc2VudGF0aW9uTmFtZVZhbGlkYXRvcihPYmplY3QgcGFyZW50LAotCQkJRGVzY3JpYmFibGVFbGVtZW50IGUpIHsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCU9iamVjdFtdIGFyciA9IGdldENoaWxkUmVmZXJlbmNlQW5kRmlsdGVyKHBhcmVudCwgZSk7Ci0JCQlFUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChFUmVmZXJlbmNlKSBhcnJbMF07Ci0JCQlJRmlsdGVyIGNoaWxkRmlsdGVyID0gKElGaWx0ZXIpIGFyclsxXTsKLQkJCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkgewotCQkJCWlmIChjaGlsZEZpbHRlciA9PSBudWxsKSB7Ci0JCQkJCWNoaWxkRmlsdGVyID0gbmV3IFR5cGVGaWx0ZXIoZSk7Ci0JCQkJfQotCQkJCXJldHVybiBuZXcgVW5pcXVlbmVzc1ZhbGlkYXRvcigoRU9iamVjdCkgcGFyZW50LCByZWZlcmVuY2UsCi0JCQkJCQljaGlsZEZpbHRlciwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkJICogCi0JCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsLlVuaXF1ZW5lc3NWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuU3RyaW5nKQotCQkJCQkgKi8KLQkJCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJCQlpZiAoU3RyVXRpbC5pc0JsYW5rKG5ld1RleHQpCi0JCQkJCQkJCSYmIE5hbWVDaGVja2VyCi0JCQkJCQkJCQkJLmNhbkhhdmVFbXB0eVByZXNlbnRhdGlvbk5hbWUoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KSkgewotCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIHN1cGVyLmlzVmFsaWQobmV3VGV4dCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIERvTm90aGluZ1ZhbGlkYXRvci5JTlNUQU5DRTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFR5cGVGaWx0ZXIgaW1wbGVtZW50cyBJRmlsdGVyIHsKLQkJcHJpdmF0ZSBpbnQgY2xhc3NJRDsKLQotCQlwcml2YXRlIEVDbGFzcyBlQ2xhc3M7Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHVibGljIFR5cGVGaWx0ZXIoRU9iamVjdCBvYmopIHsKLQkJCWNsYXNzSUQgPSBvYmouZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCk7Ci0JCX0KLQotCQlwdWJsaWMgVHlwZUZpbHRlcihFQ2xhc3MgZUNsYXNzKSB7Ci0JCQl0aGlzLmVDbGFzcyA9IGVDbGFzczsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAoZUNsYXNzICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZUNsYXNzLmlzSW5zdGFuY2Uob2JqKTsKLQkJCX0KLQotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEVPYmplY3QKLQkJCQkJJiYgY2xhc3NJRCA9PSAoKEVPYmplY3QpIG9iaikuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUZpbHRlciBub25GaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBPYmplY3RbXSBnZXRDaGlsZFJlZmVyZW5jZUFuZEZpbHRlcihPYmplY3QgcGFyZW50LAotCQkJT2JqZWN0IGNoaWxkKSB7Ci0JCUVSZWZlcmVuY2UgcmVmZXJlbmNlID0gbnVsbDsKLQkJSUZpbHRlciBjaGlsZEZpbHRlciA9IG51bGw7Ci0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkKLQkJCQkJJiYgY2hpbGQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCXJlZmVyZW5jZSA9IFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUzsKLQkJCQljaGlsZEZpbHRlciA9IG5ldyBUeXBlRmlsdGVyKAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DVVNUT01fQ0FURUdPUlkpOwotCQkJfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCXJlZmVyZW5jZSA9IFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTOwotCQkJfQotCQl9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZQotCQkJCSYmIHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCXJlZmVyZW5jZSA9IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOwotCQl9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJlZmVyZW5jZSA9IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TOwotCQkJCWNoaWxkRmlsdGVyID0gbm9uRmlsdGVyOwotCQkJfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQlyZWZlcmVuY2UgPSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TOwotCQkJCWNoaWxkRmlsdGVyID0gbm9uRmlsdGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0W10geyByZWZlcmVuY2UsIGNoaWxkRmlsdGVyIH07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3RvcnkjY3JlYXRlTmFtZVZhbGlkYXRvcihvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgSVZhbGlkYXRvciBjcmVhdGVOYW1lVmFsaWRhdG9yKE9iamVjdCBwYXJlbnQsIGZpbmFsIE5hbWVkRWxlbWVudCBlKSB7Ci0JCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FOwotCQlPYmplY3RbXSBhcnIgPSBnZXRDaGlsZFJlZmVyZW5jZUFuZEZpbHRlcihwYXJlbnQsIGUpOwotCQlFUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChFUmVmZXJlbmNlKSBhcnJbMF07Ci0JCUlGaWx0ZXIgY2hpbGRGaWx0ZXIgPSAoSUZpbHRlcikgYXJyWzFdOwotCQlpZiAocmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCXJldHVybiBjcmVhdGVWYWxpZGF0b3IoKEVPYmplY3QpIHBhcmVudCwgcmVmZXJlbmNlLCBjaGlsZEZpbHRlciwgZSwKLQkJCQkJZmVhdHVyZSk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkJCSYmIHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCXJldHVybiBuZXcgTWV0aG9kQ29uZmlndXJhdGlvbk5hbWVWYWxpZGF0b3IoCi0JCQkJKE1ldGhvZExpYnJhcnkpIHBhcmVudCwgKE1ldGhvZENvbmZpZ3VyYXRpb24pIGUpOwotCQl9Ci0JCXJldHVybiBEb05vdGhpbmdWYWxpZGF0b3IuSU5TVEFOQ0U7Ci0JfQotCi0JcHVibGljIElWYWxpZGF0b3IgY3JlYXRlTmFtZVZhbGlkYXRvcihPYmplY3QgcGFyZW50LCBmaW5hbCBOYW1lZEVsZW1lbnQgZSwgRUNsYXNzIG5ld1R5cGUpIHsKLQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX0VMRU1FTlRfX05BTUU7Ci0JCU9iamVjdFtdIGFyciA9IGdldENoaWxkUmVmZXJlbmNlQW5kRmlsdGVyKHBhcmVudCwgZSk7Ci0JCUVSZWZlcmVuY2UgcmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIGFyclswXTsKLQkJSUZpbHRlciBjaGlsZEZpbHRlciA9IG5ldyBUeXBlRmlsdGVyKG5ld1R5cGUpOwotCQlpZiAocmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCXJldHVybiBjcmVhdGVWYWxpZGF0b3IoKEVPYmplY3QpIHBhcmVudCwgcmVmZXJlbmNlLCBjaGlsZEZpbHRlciwgZSwKLQkJCQkJZmVhdHVyZSk7Ci0JCX0KLQkJcmV0dXJuIERvTm90aGluZ1ZhbGlkYXRvci5JTlNUQU5DRTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeSNjcmVhdGVOYW1lVmFsaWRhdG9yKG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkpCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgY3JlYXRlTmFtZVZhbGlkYXRvcihOYW1lZEVsZW1lbnQgZSwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBjb250YWluaW5nRmVhdHVyZSA9IFRuZ1V0aWwuZ2V0Q29udGFpbmluZ0ZlYXR1cmUoZSwKLQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmIChjb250YWluaW5nRmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlFT2JqZWN0IHBhcmVudCA9IChFT2JqZWN0KSAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KGUsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcykpLmdldFBhcmVudChlKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gbmV3IENvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvcihwYXJlbnQsCi0JCQkJCQljb250YWluaW5nRmVhdHVyZSwgKENvbnRlbnRFbGVtZW50KSBlLAotCQkJCQkJbmV3IFR5cGVGaWx0ZXIoZSkpOwotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudAotCQkJCQkmJiBwYXJlbnQgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCXJldHVybiBuZXcgUHJvY2Vzc0NvbXBvbmVudE5hbWVWYWxpZGF0b3IoCi0JCQkJCQkoUHJvY2Vzc1BhY2thZ2UpIHBhcmVudCwgKFByb2Nlc3NDb21wb25lbnQpIGUpOwotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luCi0JCQkJCSYmIHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQlyZXR1cm4gbmV3IE1ldGhvZFBsdWdpbk5hbWVWYWxpZGF0b3IoCi0JCQkJCQkoTWV0aG9kTGlicmFyeSkgcGFyZW50LCAoTWV0aG9kUGx1Z2luKSBlKTsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkJCQkJJiYgcGFyZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCXJldHVybiBuZXcgTWV0aG9kQ29uZmlndXJhdGlvbk5hbWVWYWxpZGF0b3IoCi0JCQkJCQkoTWV0aG9kTGlicmFyeSkgcGFyZW50LCAoTWV0aG9kQ29uZmlndXJhdGlvbikgZSk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBuZXcgVW5pcXVlbmVzc1ZhbGlkYXRvcihwYXJlbnQsIGNvbnRhaW5pbmdGZWF0dXJlLAotCQkJCQkJbmV3IFR5cGVGaWx0ZXIoZSksIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY3JlYXRlTmFtZVZhbGlkYXRvcihlLmVDb250YWluZXIoKSwgZSk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5I2NyZWF0ZVZhbGlkYXRvcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3MsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKQotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcihFT2JqZWN0IHBhcmVudCwgRVJlZmVyZW5jZSByZWZlcmVuY2UsCi0JCQlFQ2xhc3MgZUNsYXNzLCBmaW5hbCBFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJSUZpbHRlciBjaGlsZEZpbHRlciA9IGVDbGFzcyAhPSBudWxsID8gbmV3IFR5cGVGaWx0ZXIoZUNsYXNzKSA6IG51bGw7Ci0JCXJldHVybiBjcmVhdGVWYWxpZGF0b3IocGFyZW50LCByZWZlcmVuY2UsIGNoaWxkRmlsdGVyLCBvYmplY3QsIGZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVZhbGlkYXRvckZhY3RvcnkgY3JlYXRlVmFsaWRhdG9yRmFjdG9yeSgpIHsKLQkJaWYgKGNvbnRyaWJ1dGVkVmFsaWRhdG9yRmFjdG9yaWVzICE9IG51bGwpIHsKLQkJCWNvbnRyaWJ1dGVkVmFsaWRhdG9yRmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0KLQkJCQkJLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeQotCQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksCi0JCQkJCQkJInZhbGlkYXRpb25TdXBwb3J0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJCQkJCQlPYmplY3QgZXh0ID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpCi0JCQkJCQkJCQkJLm5ld0luc3RhbmNlKCk7Ci0JCQkJCQkJCWJvb2xlYW4gcmVwbGFjZSA9IG5ldyBCb29sZWFuKGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJyZXBsYWNlIikpLmJvb2xlYW5WYWx1ZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCWlmIChyZXBsYWNlKSB7Ci0JCQkJCQkJCQljb250cmlidXRlZFZhbGlkYXRvckZhY3Rvcmllcy5jbGVhcigpOwotCQkJCQkJCQkJaW5zdGFuY2UgPSAoSVZhbGlkYXRvckZhY3RvcnkpIGV4dDsKLQkJCQkJCQkJfSBlbHNlIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCQkJCQljb250cmlidXRlZFZhbGlkYXRvckZhY3Rvcmllcy5hZGQoZXh0KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IFZhbGlkYXRvckZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3RvcnkjY3JlYXRlVmFsaWRhdG9yKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3MsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgSVZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoZmluYWwgT2JqZWN0IHBhcmVudCwgRUNsYXNzIGVDbGFzcywKLQkJCWZpbmFsIEVPYmplY3Qgb2JqZWN0LCBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCWZpbmFsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX0VMRU1FTlRfX05BTUUKLQkJCQkJfHwgZmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSkgewotCQkJCWZpbmFsIEJyZWFrZG93bkVsZW1lbnQgYmUgPSAoQnJlYWtkb3duRWxlbWVudCkgb2JqZWN0OwotCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhwYXJlbnQpOwotCQkJCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCQkJZmluYWwgU3VwcHJlc3Npb24gc3VwcCA9IFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKHByb2MpOwotCQkJCQlyZXR1cm4gbmV3IEFic3RyYWN0U3RyaW5nVmFsaWRhdG9yKCkgewotCi0JCQkJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJCQkJCQlyZXR1cm4gTmFtZUNoZWNrZXIuY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQkJCQkJcGFyZW50LCBiZSwgbnVsbCwgZmVhdHVyZSwgbmV3VGV4dCwgc3VwcCwKLQkJCQkJCQkJCXRydWUpOwotCQkJCQkJfQotCi0JCQkJCX07Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIERvTm90aGluZ1ZhbGlkYXRvci5JTlNUQU5DRTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJRmlsdGVyIGdldEZpbHRlcihJRmlsdGVyIGZpbHRlciwgRU9iamVjdCBlT2JqZWN0KSB7Ci0JCXJldHVybiBmaWx0ZXIgIT0gbnVsbCA/IGZpbHRlciA6IChlT2JqZWN0ICE9IG51bGwgPyBuZXcgVHlwZUZpbHRlcigKLQkJCQllT2JqZWN0KSA6IG5vbkZpbHRlcik7Ci0JfQotCi0JcHVibGljIElWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKEVPYmplY3QgcGFyZW50LCBFUmVmZXJlbmNlIHJlZmVyZW5jZSwKLQkJCUlGaWx0ZXIgY2hpbGRGaWx0ZXIsIGZpbmFsIEVPYmplY3Qgb2JqZWN0LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FKSB7Ci0JCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IG51bGw7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQlpZiAocmVmZXJlbmNlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkKLQkJCQkJCXx8IChyZWZlcmVuY2UgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlRTICYmIG9iamVjdCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSkgewotCQkJCQl2YWxpZGF0b3IgPSBuZXcgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yKHBhcmVudCwKLQkJCQkJCQlyZWZlcmVuY2UsIChDb250ZW50RWxlbWVudCkgb2JqZWN0LCBnZXRGaWx0ZXIoCi0JCQkJCQkJCQljaGlsZEZpbHRlciwgb2JqZWN0KSk7Ci0KLQkJCQl9IGVsc2UgaWYgKChyZWZlcmVuY2UgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUykKLQkJCQkJCXx8IChyZWZlcmVuY2UgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTKSkgewotCQkJCQkvLyBEaXNjaXBsaW5lIGFuZCBEaXNjaXBsaW5lR3JvdXBpbmcsIFJvbGVTZXQgYW5kCi0JCQkJCS8vIFJvbGVTZXRHcm91cGluZwotCQkJCQkvLyBoYW5kbGluZwotCQkJCQkvLyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gbWFpbnRhaW4gdW5pcXVlbmVzcyBhY3Jvc3MgcGx1Z2luLgotCQkJCQl2YWxpZGF0b3IgPSBuZXcgVW5pcXVlbmVzc1ZhbGlkYXRvcihwYXJlbnQuZUNvbnRhaW5lcigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksCi0JCQkJCQkJZ2V0RmlsdGVyKGNoaWxkRmlsdGVyLCBvYmplY3QpLCBvYmplY3QsIGZlYXR1cmUpOwotCQkJCX0gZWxzZSBpZiAoKHJlZmVyZW5jZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTKQotCQkJCQkJfHwgKHJlZmVyZW5jZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfX1NVQkRJU0NJUExJTkUpCi0JCQkJCQl8fCAocmVmZXJlbmNlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVMpCi0JCQkJCQl8fCAocmVmZXJlbmNlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9NQUlOX19TVUJET01BSU5TKQotCQkJCQkJKSB7Ci0JCQkJCXZhbGlkYXRvciA9IG5ldyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IocGFyZW50LAotCQkJCQkJCXJlZmVyZW5jZSwgKENvbnRlbnRFbGVtZW50KSBvYmplY3QsIGdldEZpbHRlcigKLQkJCQkJCQkJCWNoaWxkRmlsdGVyLCBvYmplY3QpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQKLQkJCQkJJiYgcGFyZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UKLQkJCQkJJiYgcmVmZXJlbmNlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpKSB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBwYXJlbnQ7Ci0JCQkJaWYgKHBrZy5lUmVzb3VyY2UoKS5nZXRVUkkoKS5pc0ZpbGUoKSkgewotCQkJCQlyZXR1cm4gbmV3IFByb2Nlc3NDb21wb25lbnROYW1lVmFsaWRhdG9yKAotCQkJCQkJCShQcm9jZXNzUGFja2FnZSkgcGFyZW50LCAoUHJvY2Vzc0NvbXBvbmVudCkgb2JqZWN0KTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gbmV3IFVuaXF1ZW5lc3NWYWxpZGF0b3IoKEVPYmplY3QpIHBhcmVudCwgcmVmZXJlbmNlLAotCQkJCQkJCWdldEZpbHRlcihjaGlsZEZpbHRlciwgb2JqZWN0KSwgb2JqZWN0LCBmZWF0dXJlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQlNZXRob2RMaWJyYXJ5IGxpYiA9IChNZXRob2RMaWJyYXJ5KSBwYXJlbnQ7Ci0JCQkJaWYgKHJlZmVyZW5jZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUykgewotCQkJCQlpZiAobGliLmVSZXNvdXJjZSgpLmdldFVSSSgpLmlzRmlsZSgpKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IE1ldGhvZFBsdWdpbk5hbWVWYWxpZGF0b3IobGliLAotCQkJCQkJCQkoTWV0aG9kUGx1Z2luKSBvYmplY3QpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIG5ldyBVbmlxdWVuZXNzVmFsaWRhdG9yKAotCQkJCQkJCQlsaWIsCi0JCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TLAotCQkJCQkJCQlub25GaWx0ZXIsIG9iamVjdCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHJlZmVyZW5jZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TKSB7Ci0JCQkJCWlmIChsaWIuZVJlc291cmNlKCkuZ2V0VVJJKCkuaXNGaWxlKCkpIHsKLQkJCQkJCXJldHVybiBuZXcgTWV0aG9kQ29uZmlndXJhdGlvbk5hbWVWYWxpZGF0b3IobGliLAotCQkJCQkJCQkoTWV0aG9kQ29uZmlndXJhdGlvbikgb2JqZWN0KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiBuZXcgVW5pcXVlbmVzc1ZhbGlkYXRvcigKLQkJCQkJCQkJbGliLAotCQkJCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TLAotCQkJCQkJCQlub25GaWx0ZXIsIG9iamVjdCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXZhbGlkYXRvciA9IG5ldyBVbmlxdWVuZXNzVmFsaWRhdG9yKHBhcmVudCwgcmVmZXJlbmNlLAotCQkJCQkJZ2V0RmlsdGVyKGNoaWxkRmlsdGVyLCBvYmplY3QpLCBvYmplY3QsIGZlYXR1cmUpOwotCQkJfQotCi0JCQlyZXR1cm4gdmFsaWRhdG9yOwotCQl9IGVsc2UgaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUpIHsKLQkJCXJldHVybiBjcmVhdGVQcmVzZW50YXRpb25OYW1lVmFsaWRhdG9yKHBhcmVudCwKLQkJCQkJKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KTsKLQkJfQotCi0JCXJldHVybiBEb05vdGhpbmdWYWxpZGF0b3IuSU5TVEFOQ0U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZTE4MjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdmFsaWRhdGluZyBtZXRob2QgbGlicmFyeSBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZjM2QwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHZhbGlkYXRpbmcgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNGYyMGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyI+Ci0JCTxhdHRyaWJ1dGVzPgotCQk8L2F0dHJpYnV0ZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIj4KLQkJPGF0dHJpYnV0ZXM+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDNiOGVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSBDb21tb24gcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNjMThjYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NmNmNDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2U7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYudW1hO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJlY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJ4bWw7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycywKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LAotIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlczt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLmludGVybmFsLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLnN5bmNoLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLnV0aWwsCi0gb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLAotIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24sCi0gb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2gsCi0gb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwsCi0gb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlciwKLSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwsCi0gb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci51dGlsCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Y2NhN2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIG1pZ3JhdGlvbi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL21pZ3JhdGlvbi9taWdyYXRvcnMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL21pZ3JhdGlvbi9taWdyYXRvcnMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3OWU2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9taWdyYXRpb24vbWlncmF0b3JzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWh0dHBcOi8vL2NvbS9pYm0vdW1hLmVjb3JlPW9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uaW50ZXJuYWwuTWlncmF0b3IKLW9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uaW50ZXJuYWwuTWlncmF0b3I9aHR0cFw6Ly93d3cuaWJtLmNvbS91bWEvMS4wLjIvdW1hLmVjb3JlCi1odHRwXDovL3d3dy5pYm0uY29tL3VtYS8xLjAuMi91bWEuZWNvcmU9b3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbC5NaWdyYXRvcjEwMgotb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbC5NaWdyYXRvcjEwMj1odHRwXDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zL3VtYS5lY29yZQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9taWdyYXRpb24vdW1hMS4wLjJfMS4wLjMuZWNvcmUyZWNvcmUgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9taWdyYXRpb24vdW1hMS4wLjJfMS4wLjMuZWNvcmUyZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMmU3NGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvbWlncmF0aW9uL3VtYTEuMC4yXzEuMC4zLmVjb3JlMmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlMmVjb3JlOkVjb3JlMkVjb3JlTWFwcGluZ1Jvb3QgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZTJlY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwNC9FY29yZTJFY29yZSIgdG9wVG9Cb3R0b209InRydWUiPgotICA8aW5wdXRzIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjIvdW1hLmVjb3JlIy8iLz4KLSAgPG91dHB1dHMgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMy91bWEuZWNvcmUjLyIvPgotPC9lY29yZTJlY29yZTpFY29yZTJFY29yZU1hcHBpbmdSb290PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjOTRkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgTGlicmFyeSBQZXJzaXN0ZW5jZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmQ1Yjc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im1pZ3JhdG9ycyIgbmFtZT0iTWlncmF0b3JzIiBzY2hlbWE9InNjaGVtYS9taWdyYXRvcnMuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icmVzb3VyY2VTZXRGYWN0b3JpZXMiIG5hbWU9IkxpYnJhcnkgUmVzb3VyY2UgU2V0IEZhY3RvcmllcyIgc2NoZW1hPSJzY2hlbWEvcmVzb3VyY2VTZXRGYWN0b3JpZXMuZXhzZCIvPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgPHBhY2thZ2UgCi0gICAgICAgdXJpID0gImh0dHA6Ly8vY29tL2libS91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiAKLSAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2UiIC8+Ci0gICAgPHBhY2thZ2UKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlIgotICAgICAgICAgIHVyaT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIvPgotICA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubWlncmF0b3JzIj4KLSAgICAgPG1pZ3JhdG9yCi0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLmludGVybmFsLk1pZ3JhdG9yIgotICAgICAgICAgICBsaWJOc1VSST0iaHR0cDovLy9jb20vaWJtL3VtYS5lY29yZSIvPgotICA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLnNlcnZpY2VQcm92aWRlcnMiPgotICAgICA8YWNjZXNzQ29udHJvbGxlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuaW50ZXJuYWwuQWNjZXNzQ29udHJvbGxlciIvPgotICAgICA8bGlicmFyeVBlcnNpc3RlcgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLlhNSUxpYnJhcnlQZXJzaXN0ZXIiCi0gICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIgotICAgICAgICAgICB0eXBlPSJ4bWkiLz4KLSAgICAgPGZpbGVNYW5hZ2VyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRGVsZWdhdGVGaWxlTWFuYWdlciIvPgotICA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UucmVzb3VyY2VTZXRGYWN0b3JpZXMiPgotICAgICA8cmVzb3VyY2VTZXRGYWN0b3J5Ci0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuWE1JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSIKLSAgICAgICAgICAgdHlwZT0ieG1pIi8+Ci0gIDwvZXh0ZW5zaW9uPgotICA8ZXh0ZW5zaW9uCi0gICAgICAgIGlkPSJ1bnJlc29sdmVkUHJveHlNYXJrZXIiCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAgPHBlcnNpc3RlbnQKLSAgICAgICAgICAgdmFsdWU9ImZhbHNlIj4KLSAgICAgPC9wZXJzaXN0ZW50PgotICAgICA8c3VwZXIKLSAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvYmxlbW1hcmtlciI+Ci0gICAgIDwvc3VwZXI+Ci0gICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgbmFtZT0icHJveHlVUkkiPgotICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICBuYW1lPSJvd25lckdVSUQiPgotICAgICA8L2F0dHJpYnV0ZT4KLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc2NoZW1hL21pZ3JhdG9ycy5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc2NoZW1hL21pZ3JhdG9ycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjBhMGVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NjaGVtYS9taWdyYXRvcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UiIGlkPSJtaWdyYXRvcnMiIG5hbWU9Ik1pZ3JhdG9ycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBNaWdyYXRvciBtaWdyYXRlcyBtZXRob2QgbGlicmFyeSBmcm9tIG9uZSB2ZXJzaW9uIHRvIGFub3RoZXIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibWlncmF0b3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibWlncmF0b3IiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSBtaWdyYXRvci4gVGhpcyBjbGFzcyBtdXN0IGJlIGEgcHVibGljIGltcGxlbWVudGF0aW9uIG9mICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5JTWlncmF0b3ImbHQ7L2NvZGUmZ3Q7IHdpdGggYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsaWJOc1VSSSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgbmFtZSBzcGFjZSBVUkkgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgdGhpcyBtaWdyYXRvciBjYW4gbWlncmF0ZXMKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgJmx0O2V4dGVuc2lvbgotICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5taWdyYXRvcnMmcXVvdDsmZ3Q7Ci0gICAgICZsdDttaWdyYXRvcgotICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLmludGVybmFsLk1pZ3JhdG9yJnF1b3Q7Ci0gICAgICAgICAgIGxpYk5zVVJJPSZxdW90O2h0dHA6Ly8vY29tL2libS91bWEuZWNvcmUmcXVvdDsvJmd0OwotICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5JTWlncmF0b3IKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbC5NaWdyYXRvcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zY2hlbWEvcmVzb3VyY2VTZXRGYWN0b3JpZXMuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NjaGVtYS9yZXNvdXJjZVNldEZhY3Rvcmllcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzJkN2I2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NjaGVtYS9yZXNvdXJjZVNldEZhY3Rvcmllcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZSIgaWQ9InJlc291cmNlU2V0RmFjdG9yaWVzIiBuYW1lPSJMaWJyYXJ5IFJlc291cmNlIFNldCBGYWN0b3JpZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRXh0ZW5zaW9uIHBvaW50IHRvIGNvbnRyaWJ1dGUgZmFjdG9yaWVzIGZvciBjcmVhdGlvbiBvZiBsaWJyYXJ5IHJlc291cmNlIHNldC4gVGhlIGZhY3RvcmllcyBtdXN0IGltcGxlbWVudCBpbnRlcmZhY2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkgYW5kIG11c3QgaGF2ZSBhIHB1YmxpYyBub24tYXJndW1lbnQgY29uc3RydWN0b3IuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJlc291cmNlU2V0RmFjdG9yeSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJyZXNvdXJjZVNldEZhY3RvcnkiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9InR5cGUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4xCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvSUxpYnJhcnlSZXNvdXJjZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lMaWJyYXJ5UmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVkY2E1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvSUxpYnJhcnlSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeVJlc291cmNlIGV4dGVuZHMgUmVzb3VyY2UgewotCS8qKgotCSAqIEdldHMgbG9hZCBzdGFtcC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JbG9uZyBnZXRMb2FkU3RhbXAoKTsKLQkKLQkvKioKLQkgKiBHZXRzIHByb3h5IFVSSSBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlVUkkgZ2V0UHJveHlVUkkoRU9iamVjdCBvYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lMaWJyYXJ5UmVzb3VyY2VTZXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JTGlicmFyeVJlc291cmNlU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5OWRiNWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lMaWJyYXJ5UmVzb3VyY2VTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JVW1hUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLQotLyoqCi0gKiBBIHJlc291cmNlIHNldCB0aGF0IG1hbmFnZXMgYSBjb2xsZWN0aW9uIG9mIHtAbGluayBSZXNvdXJjZX0KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeVJlc291cmNlU2V0IGV4dGVuZHMgSVVtYVJlc291cmNlU2V0IHsKLQkvKioKLQkgKiBHZXRzIHRoZSBwZXJzaXN0ZW5jZSB0eXBlIHRoaXMgcmVzb3VyY2Ugc2V0IHN1cHBvcnRzCi0JICogCi0JICogQHJldHVybiB0aGUgcGVyc2lzdGVuY2UgdHlwZQotCSAqIEBzZWUgU2VydmljZXMjZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZW5jZVR5cGUoKQotCSAqIEBzZWUgU2VydmljZXMjWE1JX1BFUlNJU1RFTkNFX1RZUEUKLQkgKi8KLQlTdHJpbmcgZ2V0UGVyc2lzdGVuY2VUeXBlKCk7Ci0KLQkvKioKLQkgKiBMb2FkcyBtZXRob2QgbGlicmFyaWVzIGludG8gdGhpcyByZXNvdXJjZSBzZXQgZnJvbSB0aGUgZ2l2ZW4gVVJJLgotCSAqIAotCSAqIEBwYXJhbSBwYXJhbWV0ZXJzCi0JICogQHJldHVybgotCSAqLwotCXZvaWQgbG9hZE1ldGhvZExpYnJhcmllcyhVUkkgdXJpLCBNYXA8PywgPz4gcGFyYW1ldGVycykKLQkJCXRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaXN0IG9mIG1ldGhvZCBsaWJyYXJpZXMgdGhhdCBoYXZlIGJlZW4gbG9hZGVkIGludG8gdGhpcwotCSAqIHJlc291cmNlIHNldC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JTGlzdDxNZXRob2RMaWJyYXJ5PiBnZXRNZXRob2RMaWJyYXJpZXMoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGZpcnN0IGxvYWRlZCBtZXRob2QgbGlicmFyeSBvZiB0aGlzIHJlc291cmNlIHNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRob2QgbGlicmFyeSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBpcyBub3QgbG9hZGVkCi0JICogICAgICAgICB5ZXQuCi0JICogQHNlZSAjbG9hZExpYnJhcnkoVVJJLCBNYXApCi0JICovCi0JTWV0aG9kTGlicmFyeSBnZXRGaXJzdE1ldGhvZExpYnJhcnkoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgR1VJRCAoR2xvYmFsbHkgVW5pcXVlIElkZW50aWZpZXIpCi0JICogCi0JICogQHBhcmFtIGd1aWQKLQkgKiBAcmV0dXJuCi0JICovCi0JRU9iamVjdCBnZXRFT2JqZWN0KFN0cmluZyBndWlkKTsKLQotCU1hcDw/LCA/PiBnZXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsKLQotCS8qKgotCSAqIExvYWRzIHRoZSBnaXZlbiBvcHBvc2l0ZSBmZWF0dXJlcyBvZiBhbGwgbG9hZGVkIG9iamVjdHMgaW4gdGhpcyByZXNvdXJjZQotCSAqIHNldC4KLQkgKiAKLQkgKiBAcGFyYW0gb3Bwb3NpdGVGZWF0dXJlcwotCSAqLwotCXZvaWQgbG9hZE9wcG9zaXRlRmVhdHVyZXMoTGlzdDxPcHBvc2l0ZUZlYXR1cmU+IG9wcG9zaXRlRmVhdHVyZXMpOwotCi0JLyoqCi0JICogTG9hZHMgdGhlIGdpdmVuIG9wcG9zaXRlIGZlYXR1cmVzIG9mIHRob3NlIG9iamVjdHMgaW4gdGhpcyByZXNvdXJjZSBzZXQKLQkgKiB3aG9zZSBHVUlEcyBhcmUgc3BlY2lmaWVkIGluIDxjb2RlPkdVSURzPC9jb2RlPiBzZXQuCi0JICogCi0JICogQHBhcmFtIG9wcG9zaXRlRmVhdHVyZXMKLQkgKiBAcGFyYW0gR1VJRHMKLQkgKi8KLQl2b2lkIGxvYWRPcHBvc2l0ZUZlYXR1cmVzKExpc3Q8T3Bwb3NpdGVGZWF0dXJlPiBvcHBvc2l0ZUZlYXR1cmVzLCBTZXQ8U3RyaW5nPiBHVUlEcyk7Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGlzIHJlc291cmNlIHNldCB3aXRoIHRoZSBnaXZlbiBzYXZlIG9wdGlvbnMuCi0JICogCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiAgICAgICAgICAgIHNhdmUgb3B0aW9ucwotCSAqIEB0aHJvd3MgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uCi0JICovCi0Jdm9pZCBzYXZlKE1hcDw/LCA/PiBvcHRpb25zKSB0aHJvd3MgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVW5sb2FkcyB0aGUgZ2l2ZW4gb2JqZWN0IGluIHRoaXMgcmVzb3VyY2Ugc2V0Ci0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gb2JqZWN0IHdhcyB1bmxvYWRlZAotCSAqICAgICAgICAgc3VjY2Vzc2Z1bGx5Ci0JICovCi0JYm9vbGVhbiB1bmxvYWQoRU9iamVjdCBvYmplY3QpOwotCi0JLyoqCi0JICogVW5sb2FkcyB0aGUgc3BlY2lmaWVkIHJlc291cmNlIG9mIHRoaXMgcmVzb3VyY2Ugc2V0LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEBwYXJhbSBvcHRpb25zCi0JICogQHJldHVybiBUT0RPCi0JICovCi0JYm9vbGVhbiB1bmxvYWQoUmVzb3VyY2UgcmVzb3VyY2UsIE1hcDw/LCA/PiBvcHRpb25zKTsKLQotCS8qKgotCSAqIFJlbG9hZHMgdGhlIGdpdmVuIHJlc291cmNlcwotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMKLQkgKiBAcmV0dXJuIHJlc291cmNlcyB0aGF0IGhhZCBiZWVuIHJlbG9hZGVkCi0JICovCi0JQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVsb2FkUmVzb3VyY2VzKENvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlcyk7Ci0KLQkvKioKLQkgKiBSZWxvYWRzIHRoZSBnaXZlbiBwZXJzaXN0ZWQgb2JqZWN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0cwotCSAqIEByZXR1cm4gb2JqZWN0cyB0aGF0IGhhdmUgYmVlbiByZWxvYWRlZAotCSAqLwotCUNvbGxlY3Rpb248RU9iamVjdD4gcmVsb2FkT2JqZWN0cyhDb2xsZWN0aW9uPEVPYmplY3Q+IG9iamVjdHMpOwotCi0JLyoqCi0JICogVW5sb2FkcyB0aGlzIHJlc291cmNlIHNldC4gVGhpcyB3aWxsIHVubG9hZCBldmVyeSByZXNvdXJjZSBpbiB0aGlzCi0JICogcmVzb3VyY2Ugc2V0IGFuZCByZXNldCB0aGUgcmVzb3VyY2Ugc2V0IHRvIHRoZSBzdGF0ZSBiZWZvcmUgbG9hZGluZyB0aGUKLQkgKiBsaWJyYXJ5LgotCSAqIAotCSAqLwotCXZvaWQgdW5sb2FkKCk7Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlcmUgaXMgYW55IHVucmVzb2x2ZWQgcHJveHkgZGV0ZWN0ZWQgaW4gdGhlIGxpYnJhcnkKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBoYXNVbnJlc29sdmVkUHJveHkoKTsKLQotCS8qKgotCSAqIFN1YnNjcmliZXMgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciB0byBsaXN0ZW4gdG8gcmVmcmVzaCBldmVudHMgYnJvYWRjYXN0ZWQKLQkgKiB3aGVuZXZlciByZXNvdXJjZXMgb3Igb2JqZWN0cyBvZiB0aGlzIHJlc291cmNlIHNldCBpcyByZWZyZXNoZWQvcmVsb2FkZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogQHNlZSAjcmVsb2FkUmVzb3VyY2VzKENvbGxlY3Rpb24pCi0JICovCi0Jdm9pZCBhZGRSZWZyZXNoTGlzdGVuZXIoSVJlZnJlc2hMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi0JLyoqCi0JICogVW5zdWJzY3JpYmVzIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgZnJvbSBsaXN0ZW5pbmcgdG8gcmVmcmVzaCBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0Jdm9pZCByZW1vdmVSZWZyZXNoTGlzdGVudGVyKElSZWZyZXNoTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JSUxpYnJhcnlQZXJzaXN0ZXIgZ2V0UGVyc2lzdGVyKCk7Ci0KLQl2b2lkIGNoZWNrTW9kaWZ5KFJlc291cmNlW10gcmVzb3VyY2VzLCBPYmplY3QgY29udGV4dCkKLQkJCXRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb247Ci0KLQlJU3RhdHVzIGNoZWNrTW9kaWZ5KENvbGxlY3Rpb248RU9iamVjdD4gZU9iamVjdHMsIE9iamVjdCBjb250ZXh0KTsKLQkKLQlDb2xsZWN0aW9uPFJlc291cmNlPiBsb2FkTmV3UmVzb3VyY2VzKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjk3M2I1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2U7Ci0KLS8qKgotICogRmFjdG9yeSB0byBjcmVhdGUge0BsaW5rIElMaWJyYXJ5UmVzb3VyY2VTZXR9IGluc3RhbmNlIG9mIHRoZSBwYXJ0aWN1bGFyCi0gKiBwZXJzaXN0ZW5jZSB0eXBlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDI2LCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkgewotCi0JLyoqCi0JICogR2V0cyB0aGUgcGVyc2lzdGVuY2UgdHlwZSBvZiB0aGUgcmVzb3VyY2Ugc2V0IGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5Ci0JICogCi0JICogQHJldHVybiB0aGUgcGVyc2lzdGVuY2UgdHlwZQotCSAqLwotCVN0cmluZyBnZXRQZXJzaXN0ZW5jZVR5cGUoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGlicmFyeSByZXNvdXJjZSBzZXQKLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IGxpYnJhcnkgcmVzb3VyY2Ugc2V0Ci0JICovCi0JSUxpYnJhcnlSZXNvdXJjZVNldCBjcmVhdGVMaWJyYXJ5UmVzb3VyY2VTZXQoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JUmVmcmVzaEluZm8uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JUmVmcmVzaEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVhN2IwYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvSVJlZnJlc2hJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDMsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZnJlc2hJbmZvIHsKLQkvKioKLQkgKiBHZXRzIGV4aXN0aW5nIHJlc291cmNlcyB0aGF0IHJlYXBwZWFycyBpbiB3b3Jrc3BhY2UKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhZGRlZFJlc291cmNlcwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFkZGVkUmVzb3VyY2VzKCk7Ci0JCi0JLyoqCi0JICogR2V0cyBuZXdseSBhZGRlZCB3b3Jrc3BhY2UgcmVzb3VyY2VzCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFkZGVkV29ya3NwYWNlUmVzb3VyY2VzKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjaGFuZ2VkUmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoYW5nZWRSZXNvdXJjZXMoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBsb2FkZWRCZWZvcmVSZWZyZXNoUmVzb3VyY2VzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVsb2FkZWRCZWZvcmVSZWZyZXNoUmVzb3VyY2VzKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSByZW1vdmVkUmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlbW92ZWRSZXNvdXJjZXMoKTsKLQkKLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIG1hbmFnZXIgdGhhdCB0aGUgZ2l2ZW4gcmVzb3VyY2UganVzdCBoYXMgYmVlbiBzYXZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvdXJjZVNhdmVkKFJlc291cmNlIHJlc291cmNlKTsJCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvTGlicmFyeVJlc291cmNlRXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvTGlicmFyeVJlc291cmNlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MGIwMTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0xpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2U7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDgyNzI1ODczNDQ2Nzg2NzY4MjhMOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqLwotCXB1YmxpYyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIobWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcGFyYW0gY2F1c2UKLQkgKi8KLQlwdWJsaWMgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLQkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjYXVzZQotCSAqLwotCXB1YmxpYyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0JCXN1cGVyKGNhdXNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY2MGRlOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlU2VydmljZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IFBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGVyc2lzdGVuY2VTZXJ2aWNlIElOU1RBTkNFID0gbmV3IFBlcnNpc3RlbmNlU2VydmljZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEZhY3RvcnlEZWY+IHR5cGVUb0ZhY3RvcnlEZWZNYXA7Ci0KLQlwcml2YXRlIFBlcnNpc3RlbmNlU2VydmljZSgpIHsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgUmVzb3VyY2VTZXQgZm9yIHRoZSBnaXZlbiBwZXJzaXN0ZW5jZSB0eXBlCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElMaWJyYXJ5UmVzb3VyY2VTZXQgY3JlYXRlUmVzb3VyY2VTZXQoU3RyaW5nIHR5cGUpIHsKLQkJSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkodHlwZSk7Ci0JCWlmKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlTGlicmFyeVJlc291cmNlU2V0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHR5cGU6ICIgKyB0eXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmFjdG9yeURlZiB7Ci0JCUJ1bmRsZSBidW5kbGU7Ci0KLQkJU3RyaW5nIHR5cGU7Ci0KLQkJU3RyaW5nIGNsYXNzTmFtZTsKLQkJCi0JCWludCB2ZXJzaW9uOwotCQkKLQkJSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkgaW5zdGFuY2U7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBidW5kbGUKLQkJICogQHBhcmFtIHR5cGUKLQkJICogQHBhcmFtIGNsYXNzTmFtZQotCQkgKiBAcGFyYW0gaW5zdGFuY2UKLQkJICovCi0JCXByaXZhdGUgRmFjdG9yeURlZihCdW5kbGUgYnVuZGxlLCBTdHJpbmcgdHlwZSwgU3RyaW5nIGNsYXNzTmFtZSwgaW50IHZlcnNpb24pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JCX0KLQkJCQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSBnZXRGYWN0b3J5KFN0cmluZyBwZXJzaXN0ZW5jZVR5cGUpIHsKLQkJaWYgKHR5cGVUb0ZhY3RvcnlEZWZNYXAgPT0gbnVsbCkgewotCQkJdHlwZVRvRmFjdG9yeURlZk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgRmFjdG9yeURlZj4oKTsKLQkJCS8vIFByb2Nlc3MgdGhlICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5taWdyYXRvcnMiCi0JCQkvLyBleHRlbnNpb24gcG9pbnQKLQkJCS8vIGNvbnRyaWJ1dG9ycy4KLQkJCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtCi0JCQkJCS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkKLQkJCQkJLmdldEV4dGVuc2lvblBvaW50KAotCQkJCQkJCSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZSIsICJyZXNvdXJjZVNldEZhY3RvcmllcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyB0eXBlID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgidHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsCi0JCQkJCQkJCQkmJiBjbGFzc05hbWUudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkJJiYgdHlwZSAhPSBudWxsCi0JCQkJCQkJCQkmJiB0eXBlLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJaW50IHZlcnNpb24gPSBTZXJ2aWNlcy5wYXJzZVZlcnNpb24oY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoInZlcnNpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJRmFjdG9yeURlZiBmYWN0b3J5RGVmID0gdHlwZVRvRmFjdG9yeURlZk1hcC5nZXQodHlwZSk7CQkJCQkJCQkKLQkJCQkJCQkJaWYoZmFjdG9yeURlZiA9PSBudWxsIHx8IGZhY3RvcnlEZWYudmVyc2lvbiA8IHZlcnNpb24pIHsKLQkJCQkJCQkJCXR5cGVUb0ZhY3RvcnlEZWZNYXAucHV0KHR5cGUsIG5ldyBGYWN0b3J5RGVmKGJ1bmRsZSwKLQkJCQkJCQkJCQkJdHlwZSwgY2xhc3NOYW1lLCB2ZXJzaW9uKSk7CQkJCQkJCQkJCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJRmFjdG9yeURlZiBmYWN0b3J5ID0gKEZhY3RvcnlEZWYpIHR5cGVUb0ZhY3RvcnlEZWZNYXAuZ2V0KHBlcnNpc3RlbmNlVHlwZSk7Ci0JCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCWlmIChmYWN0b3J5Lmluc3RhbmNlID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlJTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSByZXNvdXJjZVNldEZhY3RvcnkgPSAoSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkpIGZhY3RvcnkuYnVuZGxlLmxvYWRDbGFzcygKLQkJCQkJCQlmYWN0b3J5LmNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLQkJCQkJaWYocGVyc2lzdGVuY2VUeXBlLmVxdWFscyhyZXNvdXJjZVNldEZhY3RvcnkuZ2V0UGVyc2lzdGVuY2VUeXBlKCkpKSB7Ci0JCQkJCQlmYWN0b3J5Lmluc3RhbmNlID0gcmVzb3VyY2VTZXRGYWN0b3J5OwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGZhY3RvcnkuY2xhc3NOYW1lICsKLQkJCQkJCQkJIiBpcyByZWdpc3RlcmVkIHdpdGggdGhlIHdyb25nIHBlcnNpc3RlbmNlIHR5cGUgJyIgKyBwZXJzaXN0ZW5jZVR5cGUgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSInLiBUaGUgY29ycmVjdCB0eXBlIG11c3QgYmUgJyIgKyByZXNvdXJjZVNldEZhY3RvcnkuZ2V0UGVyc2lzdGVuY2VUeXBlKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFjdG9yeS5pbnN0YW5jZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9pbnRlcm5hbC9BY2Nlc3NDb250cm9sbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvaW50ZXJuYWwvQWNjZXNzQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGIyMzhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9pbnRlcm5hbC9BY2Nlc3NDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUFjY2Vzc0NvbnRyb2xsZXI7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgOSwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjY2Vzc0NvbnRyb2xsZXIgaW1wbGVtZW50cyBJQWNjZXNzQ29udHJvbGxlciB7Ci0KLQlwdWJsaWMgQWNjZXNzQ29udHJvbGxlcigpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUFjY2Vzc0NvbnRyb2xsZXIjY2hlY2tNb2RpZnkoamF2YS51dGlsLkNvbGxlY3Rpb24sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTdGF0dXMgY2hlY2tNb2RpZnkoQ29sbGVjdGlvbiBlT2JqZWN0cywgT2JqZWN0IGNvbnRleHQpIHsKLQkJaWYoZU9iamVjdHMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQlJTGlicmFyeVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZU9iamVjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IG8uZVJlc291cmNlKCk7Ci0JCQlpZihyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlU2V0KSB7Ci0JCQkJcmVzb3VyY2VTZXQgPSAoSUxpYnJhcnlSZXNvdXJjZVNldCkgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQlpZihyZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZihyZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2VTZXQuY2hlY2tNb2RpZnkoZU9iamVjdHMsIGNvbnRleHQpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JQWNjZXNzQ29udHJvbGxlciNjaGVja01vZGlmeShvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VbXSwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjaGVja01vZGlmeShSZXNvdXJjZVtdIHJlc291cmNlcywgT2JqZWN0IGNvbnRleHQpIHsKLQkJaWYocmVzb3VyY2VzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQlBcnJheUxpc3Q8U3RyaW5nPiBwYXRocyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZXNbaV07Ci0JCQlTdHJpbmcgcGF0aCA9IEZpbGVNYW5hZ2VyLnRvRmlsZVN0cmluZyhyZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCQlpZihwYXRoICE9IG51bGwpIHsKLQkJCQlwYXRocy5hZGQocGF0aCk7Ci0JCQl9Ci0JCX0KLQkJaWYoIXBhdGhzLmlzRW1wdHkoKSkgewotCQkJU3RyaW5nW10gYXJyID0gbmV3IFN0cmluZ1twYXRocy5zaXplKCldOwotCQkJcGF0aHMudG9BcnJheShhcnIpOwotCQkJcmV0dXJuIEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuY2hlY2tNb2RpZnkoYXJyLCBjb250ZXh0KTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsJCi0JCQotLy8JCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLAotLy8JCQkJSVN0YXR1cy5PSywgUGVyc2lzdGVuY2VSZXNvdXJjZXMubW9kaWZ5RmlsZXNFcnJvcl9tc2csCi0vLwkJCQludWxsKTsKLS8vCi0vLwkJSGFzaE1hcDxJTGlicmFyeVJlc291cmNlU2V0LCBTZXQ8UmVzb3VyY2U+PiByZXNvdXJjZVNldFRvUmVzb3VyY2VzTWFwID0gbmV3IEhhc2hNYXA8SUxpYnJhcnlSZXNvdXJjZVNldCwgU2V0PFJlc291cmNlPj4oKTsKLS8vCQlTZXQ8UmVzb3VyY2U+IHJlc291cmNlc1dpdGhvdXRMaWJyYXJ5UmVzb3VyY2VTZXQgPSBudWxsOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOwotLy8JCQlpZihyZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpIGluc3RhbmNlb2YgSUxpYnJhcnlSZXNvdXJjZVNldCkgewotLy8JCQkJU2V0IHNldCA9IHJlc291cmNlU2V0VG9SZXNvdXJjZXNNYXAuZ2V0KHJlc291cmNlLmdldFJlc291cmNlU2V0KCkpOwotLy8JCQkJaWYoc2V0ID09IG51bGwpIHsKLS8vCQkJCQlzZXQgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLS8vCQkJCQlyZXNvdXJjZVNldFRvUmVzb3VyY2VzTWFwLnB1dCgoSUxpYnJhcnlSZXNvdXJjZVNldCkgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSwgc2V0KTsKLS8vCQkJCX0KLS8vCQkJCXNldC5hZGQocmVzb3VyY2UpOwkJCQkKLS8vCQkJfQotLy8JCQllbHNlIHsKLS8vCQkJCWlmKHJlc291cmNlc1dpdGhvdXRMaWJyYXJ5UmVzb3VyY2VTZXQgPT0gbnVsbCkgewotLy8JCQkJCXJlc291cmNlc1dpdGhvdXRMaWJyYXJ5UmVzb3VyY2VTZXQgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLS8vCQkJCX0KLS8vCQkJCXJlc291cmNlc1dpdGhvdXRMaWJyYXJ5UmVzb3VyY2VTZXQuYWRkKHJlc291cmNlKTsKLS8vCQkJfQotLy8JCX0KLS8vCQlpZighcmVzb3VyY2VTZXRUb1Jlc291cmNlc01hcC5pc0VtcHR5KCkpIHsKLS8vCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VTZXRUb1Jlc291cmNlc01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJTWFwLkVudHJ5PElMaWJyYXJ5UmVzb3VyY2VTZXQsIFNldDxSZXNvdXJjZT4+IGVudHJ5ID0gKEVudHJ5PElMaWJyYXJ5UmVzb3VyY2VTZXQsIFNldDxSZXNvdXJjZT4+KSBpdGVyLm5leHQoKTsKLS8vCQkJCVJlc291cmNlW10gYXJyID0gbmV3IFJlc291cmNlW2VudHJ5LmdldFZhbHVlKCkuc2l6ZSgpXTsKLS8vCQkJCWVudHJ5LmdldFZhbHVlKCkudG9BcnJheShhcnIpOwotLy8JCQkJZW50cnkuZ2V0S2V5KCkuY2hlY2tNb2RpZnkoYXJyLCBjb250ZXh0KTsKLS8vCQkJfQotLy8JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9pbnRlcm5hbC9JRmFpbFNhZmVTYXZhYmxlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvaW50ZXJuYWwvSUZhaWxTYWZlU2F2YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTcxY2EwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9pbnRlcm5hbC9JRmFpbFNhZmVTYXZhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5pbnRlcm5hbDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgYSByZXNvdXJjZSBtdXN0IGltcGxlbWVudCB0byBzdXBwb3J0IGZhaWwtc2FmZSBwZXJzaXN0ZW5jZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJRmFpbFNhZmVTYXZhYmxlIHsKLQl2b2lkIGNvbW1pdCgpOwotCQotCWJvb2xlYW4gcmVzdG9yZSgpOwotCQotCXZvaWQgc2V0VHhJRChTdHJpbmcgdHhJRCk7Ci0JCi0JYm9vbGVhbiBoYXNUZW1wVVJJKCk7Ci0JCi0Jdm9pZCB0eEZpbmlzaGVkKGJvb2xlYW4gc3VjY2Vzc2Z1bCk7Ci0JCi0Jdm9pZCBkZWxldGVCYWNrdXAoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9zeW5jaC9JU3luY2hyb25pemF0aW9uSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2Uvc3luY2gvSVN5bmNocm9uaXphdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDZhZjEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9zeW5jaC9JU3luY2hyb25pemF0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5zeW5jaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5zeW5jaC5pbnRlcm5hbC5TeW5jaHJvbml6YXRpb25IZWxwZXI7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5lIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTeW5jaHJvbml6YXRpb25IZWxwZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVN5bmNocm9uaXphdGlvbkhlbHBlciBJTlNUQU5DRSA9IG5ldyBTeW5jaHJvbml6YXRpb25IZWxwZXIoKTsKLQkKLQlsb25nIGdldE1vZGlmaWNhdGlvblN0YW1wKFJlc291cmNlIHJlc291cmNlKTsKLQkKLQlib29sZWFuIGlzU3luY2hyb25pemVkKFJlc291cmNlIHJlc291cmNlKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9zeW5jaC9pbnRlcm5hbC9TeW5jaHJvbml6YXRpb25IZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9zeW5jaC9pbnRlcm5hbC9TeW5jaHJvbml6YXRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdjNjA1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2Uvc3luY2gvaW50ZXJuYWwvU3luY2hyb25pemF0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5zeW5jaC5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS51dGlsLldvcmtzcGFjZVN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5zeW5jaC5JU3luY2hyb25pemF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuSUZpbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVYTUlSZXNvdXJjZUltcGw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5lIDEuMgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemF0aW9uSGVscGVyIGltcGxlbWVudHMgSVN5bmNocm9uaXphdGlvbkhlbHBlciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5zeW5jaC5JU3luY2hyb25pemF0aW9uSGVscGVyI2dldE1vZGlmaWNhdGlvblN0YW1wKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcChSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJSUZpbGVJbmZvIGluZm8gPSBGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEZpbGVJbmZvKHJlc291cmNlKTsKLQkJCXJldHVybiBpbmZvICE9IG51bGwgPyBpbmZvLmdldE1vZGlmaWNhdGlvblN0YW1wKCkgOiBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQkJfQotCQlyZXR1cm4gSVJlc291cmNlLk5VTExfU1RBTVA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uuc3luY2guSVN5bmNocm9uaXphdGlvbkhlbHBlciNpc1N5bmNocm9uaXplZChvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCXJldHVybiAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbClyZXNvdXJjZSkuaXNTeW5jaHJvbml6ZWQoKTsKLQkJfQotCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUocmVzb3VyY2UpOwotCQlpZihmaWxlICE9IG51bGwpIHsKLQkJCXJldHVybiBmaWxlLmlzU3luY2hyb25pemVkKElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS91dGlsL0V4dGVuZGVkUmVzb3VyY2VTZXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS91dGlsL0V4dGVuZGVkUmVzb3VyY2VTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMxOTRiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvdXRpbC9FeHRlbmRlZFJlc291cmNlU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuVW5ub3JtYWxpemVkVVJJRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgZXh0ZW5kZWQgcmVzb3VyY2Ugc2V0IHdob3NlIG9iamVjdHMgY2FuIHJlZmVyZW5jZXMgb2JqZWN0cyBvZiBvdGhlciByZXNvdXJjZSBzZXQKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgOSwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuZGVkUmVzb3VyY2VTZXQgZXh0ZW5kcyBSZXNvdXJjZVNldEltcGwgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVSSV9UWVBFX1VOS05PV04gPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVSSV9UWVBFX0xPQ0FMID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUklfVFlQRV9FWFRFUk5BTCA9IDI7Ci0JCi0JcHJvdGVjdGVkIExpc3Q8UmVzb3VyY2VTZXQ+IHJlZmVyZW5jZWRSZXNvdXJjZVNldHMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlU2V0PigpOwotCi0JCi0JLyoqCi0JICogR2V0cyB0aGUgdHlwZSBvZiB0aGUgZ2l2ZW4gVVJJLgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuIG9uZSBvZiBVUkkgdHlwZSBjb25zdGFudHM6IHtAbGluayAjVVJJX1RZUEVfRVhURVJOQUx9LCB7QGxpbmsgI1VSSV9UWVBFX0xPQ0FMfSwge0BsaW5rICNVUklfVFlQRV9VTktOT1dOfQotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0VVJJVHlwZShVUkkgdXJpKSB7Ci0JCXJldHVybiBVUklfVFlQRV9VTktOT1dOOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBhZGQoUmVzb3VyY2VTZXQgcmVmZXJlbmNlZFJlc291cmNlU2V0KSB7Ci0JCWlmKCFyZWZlcmVuY2VkUmVzb3VyY2VTZXRzLmNvbnRhaW5zKHJlZmVyZW5jZWRSZXNvdXJjZVNldCkpIHsKLQkJCXJldHVybiByZWZlcmVuY2VkUmVzb3VyY2VTZXRzLmFkZChyZWZlcmVuY2VkUmVzb3VyY2VTZXQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdChVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlFT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0JCVVubm9ybWFsaXplZFVSSUV4Y2VwdGlvbiBleCA9IG51bGw7Ci0JCWludCB1cmlUeXBlID0gZ2V0VVJJVHlwZSh1cmkpOwotCQlpZih1cmlUeXBlID09IFVSSV9UWVBFX1VOS05PV04gfHwgdXJpVHlwZSA9PSBVUklfVFlQRV9MT0NBTCkgewotCQkJdHJ5IHsKLQkJCQlvYmplY3QgPSBzdXBlci5nZXRFT2JqZWN0KHVyaSwgbG9hZE9uRGVtYW5kKTsKLQkJCX0gY2F0Y2ggKFVubm9ybWFsaXplZFVSSUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZXggPSBlOwotCQkJfQotCQkJaWYob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gb2JqZWN0OwotCQkJfQotCQl9Ci0JCWlmKHVyaVR5cGUgPT0gVVJJX1RZUEVfVU5LTk9XTiB8fCB1cmlUeXBlID09IFVSSV9UWVBFX0VYVEVSTkFMKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VkUmVzb3VyY2VTZXRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gKFJlc291cmNlU2V0KSBpdGVyLm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQlvYmplY3QgPSByZXNvdXJjZVNldC5nZXRFT2JqZWN0KHVyaSwgbG9hZE9uRGVtYW5kKTsKLQkJCQkJaWYob2JqZWN0ICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBvYmplY3Q7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24gZSkgewotCQkJCQlleCA9IGU7Ci0JCQkJfQotCQkJfQotCQl9IAotCQkKLQkJaWYoZXggIT0gbnVsbCkgewotCQkJdGhyb3cgZXg7Ci0JCX0KLQkJcmV0dXJuIG9iamVjdDsKLQl9CQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJdHJ5ewotCQkJCXJlc291cmNlLnVubG9hZCgpOwkJCQotCQkJfQotCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCXJlZmVyZW5jZWRSZXNvdXJjZVNldHMuY2xlYXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0RlbGVnYXRlRmlsZU1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRGVsZWdhdGVGaWxlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2FiYmQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRGVsZWdhdGVGaWxlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAxMCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGVnYXRlRmlsZU1hbmFnZXIgaW1wbGVtZW50cyBJRmlsZU1hbmFnZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlTWFuYWdlciNjaGVja01vZGlmeShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KFN0cmluZyBwYXRoLCBPYmplY3QgY29udGV4dCkgewotCQlyZXR1cm4gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jaGVja01vZGlmeShwYXRoLCBjb250ZXh0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVNYW5hZ2VyI2NoZWNrTW9kaWZ5KGphdmEubGFuZy5TdHJpbmdbXSwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjaGVja01vZGlmeShTdHJpbmdbXSBwYXRocywgT2JqZWN0IGNvbnRleHQpIHsKLQkJcmV0dXJuIEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuY2hlY2tNb2RpZnkocGF0aHMsIGNvbnRleHQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZU1hbmFnZXIjZGVsZXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGVsZXRlKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmRlbGV0ZShwYXRoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVNYW5hZ2VyI21vdmUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtb3ZlKFN0cmluZyBvbGRQYXRoLCBTdHJpbmcgbmV3UGF0aCkgewotCQlyZXR1cm4gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5tb3ZlKG9sZFBhdGgsIG5ld1BhdGgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZU1hbmFnZXIjcmVuYW1lKGphdmEuaW8uRmlsZSwgamF2YS5pby5GaWxlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbmFtZShGaWxlIG9sZEZpbGUsIEZpbGUgbmV3RmlsZSkgewotCQlyZXR1cm4gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW5hbWUob2xkRmlsZSwgbmV3RmlsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0V4dGVuZGVkUmVzb3VyY2VTZXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRXh0ZW5kZWRSZXNvdXJjZVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTc2MWM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRXh0ZW5kZWRSZXNvdXJjZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiBBIGV4dGVuZGVkIHJlc291cmNlIHNldCB3aG9zZSBvYmplY3RzIGNhbiByZWZlcmVuY2VzIG9iamVjdHMgb2Ygb3RoZXIgcmVzb3VyY2Ugc2V0Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gQXVnIDksIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZFJlc291cmNlU2V0IGV4dGVuZHMgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUklfVFlQRV9VTktOT1dOID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUklfVFlQRV9MT0NBTCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVJJX1RZUEVfRVhURVJOQUwgPSAyOwotCQotCXByb3RlY3RlZCBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVmZXJlbmNlZFJlc291cmNlU2V0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiB7QGxpbmsgRXh0ZW5kZWRSZXNvdXJjZVNldH0gdGhhdCBjYW4gaGF2ZSByZWZlcmVuY2UgdG8gb2JqZWN0cyBpbiB0aGUgZ2l2ZW4gcmVzb3VyY2Ugc2V0IAotCSAqLwotCXB1YmxpYyBFeHRlbmRlZFJlc291cmNlU2V0KE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZWZlcmVuY2VkUmVzb3VyY2VTZXQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZWZlcmVuY2VkUmVzb3VyY2VTZXQgPSByZWZlcmVuY2VkUmVzb3VyY2VTZXQ7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIGdpdmVuIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiBvbmUgb2YgVVJJIHR5cGUgY29uc3RhbnRzOiB7QGxpbmsgI1VSSV9UWVBFX0VYVEVSTkFMfSwge0BsaW5rICNVUklfVFlQRV9MT0NBTH0sIHtAbGluayAjVVJJX1RZUEVfVU5LTk9XTn0KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFVSSVR5cGUoVVJJIHVyaSkgewotCQlyZXR1cm4gVVJJX1RZUEVfVU5LTk9XTjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbCNnZXRFT2JqZWN0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoRU9iamVjdCByZXNvbHZlciwgVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJRU9iamVjdCBvYmplY3QgPSBudWxsOwotCQlVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24gZXggPSBudWxsOwotCQlpbnQgdXJpVHlwZSA9IGdldFVSSVR5cGUodXJpKTsKLQkJaWYodXJpVHlwZSA9PSBVUklfVFlQRV9VTktOT1dOIHx8IHVyaVR5cGUgPT0gVVJJX1RZUEVfTE9DQUwpIHsKLQkJCXRyeSB7Ci0JCQkJb2JqZWN0ID0gc3VwZXIuZ2V0RU9iamVjdChyZXNvbHZlciwgdXJpLCBsb2FkT25EZW1hbmQpOwotCQkJfSBjYXRjaCAoVW5ub3JtYWxpemVkVVJJRXhjZXB0aW9uIGUpIHsKLQkJCQlleCA9IGU7Ci0JCQl9Ci0JCQlpZihvYmplY3QgIT0gbnVsbCkgewotCQkJCXJldHVybiBvYmplY3Q7Ci0JCQl9Ci0JCX0KLQkJaWYodXJpVHlwZSA9PSBVUklfVFlQRV9VTktOT1dOIHx8IHVyaVR5cGUgPT0gVVJJX1RZUEVfRVhURVJOQUwpIHsKLQkJCXRyeSB7Ci0JCQkJb2JqZWN0ID0gcmVmZXJlbmNlZFJlc291cmNlU2V0LmdldEVPYmplY3QocmVzb2x2ZXIsIHVyaSwKLQkJCQkJCWxvYWRPbkRlbWFuZCk7Ci0JCQl9IGNhdGNoIChVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24gZSkgewotCQkJCWV4ID0gZTsKLQkJCX0KLQkJfSAKLQkJCi0JCWlmKGV4ICE9IG51bGwpIHsKLQkJCXRocm93IGV4OwotCQl9Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9GYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIxNzYxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIgewotCXByaXZhdGUgVVJJIGZpbmFsVVJJOwotCXByaXZhdGUgVVJJIG9sZFVSSTsKLQlwcml2YXRlIFN0cmluZyBjdXJyZW50VHhJRDsKLQlwcml2YXRlIFJlc291cmNlIHJlc291cmNlOwotCXByaXZhdGUgVVJJIHRlbXBVUkk7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgYmFja3VwRmlsZTsKLQlwcml2YXRlIFVSSUNvbnZlcnRlciBjb252ZXJ0ZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGNvbW1pdEVtcHR5UmVzb3VyY2U7Ci0JCi0JcHVibGljIEZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIoUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBpZCkgewotCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7IAotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMuY29udmVydGVyID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSAhPSBudWxsID8gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKSA6IG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENvbW1pdEVtcHR5UmVzb3VyY2UoYm9vbGVhbiBjb21taXRFbXB0eVJlc291cmNlKSB7Ci0JCXRoaXMuY29tbWl0RW1wdHlSZXNvdXJjZSA9IGNvbW1pdEVtcHR5UmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGVtcG9yYXJ5IFVSSSB0byBzYXZlIHRoaXMgcmVzb3VyY2UgdG8gYW5kIGl0IHdpbGwgYmUgcmVuYW1lZCB0bwotCSAqIHRoZSBvcmlnaW5hbCBVUkkgd2hlbiBzYXZpbmcgaXMgZG9uZQotCSAqLwotCXB1YmxpYyBVUkkgc2V0VGVtcFVSSShTdHJpbmcgdHhJRCkgewotCQlpZiAoZmluYWxVUkkgPT0gbnVsbCkgewotCQkJZmluYWxVUkkgPSBvbGRVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCWN1cnJlbnRUeElEID0gdHhJRDsKLQotCQkJdGVtcFVSSSA9IGNyZWF0ZVRlbXBVUkkoKTsKLQkJCXJlc291cmNlLnNldFVSSSh0ZW1wVVJJKTsKLQkJfQotCQlyZXR1cm4gdGVtcFVSSTsKLQl9Ci0JCi0JcHJpdmF0ZSBVUkkgY3JlYXRlVGVtcFVSSSgpIHsKLQkJcmV0dXJuIFVSSS5jcmVhdGVGaWxlVVJJKG5ldyBTdHJpbmdCdWZmZXIoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsLmdldFRlbXBEaXIoKSkuYXBwZW5kKAotCQkJCUZpbGUuc2VwYXJhdG9yKS5hcHBlbmQoY3VycmVudFR4SUQpCi0JCQkJLmFwcGVuZCgibmV3IikuYXBwZW5kKGlkKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEJhY2t1cEZpbGVQYXRoKCkgewotCQlTdHJpbmcgYmFja3VwRmlsZSA9IG5ldyBTdHJpbmdCdWZmZXIoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsLmdldFRlbXBEaXIoKSkKLQkJCQkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKQotCQkJCS5hcHBlbmQoY3VycmVudFR4SUQpCi0JCQkJLmFwcGVuZCgib2xkIikuYXBwZW5kKGlkKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBiYWNrdXBGaWxlOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyB0b0ZpbGVTdHJpbmcoVVJJIHVyaSkgewotCQlyZXR1cm4gRmlsZU1hbmFnZXIudG9GaWxlU3RyaW5nKHVyaSwgY29udmVydGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY29tbWl0KCkgewotCQlpZiAoZmluYWxVUkkgIT0gbnVsbCAmJiAoY29tbWl0RW1wdHlSZXNvdXJjZSB8fCAhcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpKSB7Ci0JCQlGaWxlIGZpbmFsRmlsZSA9IG5ldyBGaWxlKHRvRmlsZVN0cmluZyhmaW5hbFVSSSkpOwotCQkJYm9vbGVhbiB3YXNNb3ZlID0gIW9sZFVSSS5lcXVhbHMoZmluYWxVUkkpOwotCQkJaWYgKHdhc01vdmUpIHsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gYmFjayB1cCB0aGUgZmlsZQotCQkJCS8vCi0JCQkJU3RyaW5nIGJhY2t1cCA9IGdldEJhY2t1cEZpbGVQYXRoKCk7Ci0JCQkJRmlsZSBiYWtGaWxlID0gbmV3IEZpbGUoYmFja3VwKTsKLQotCQkJCS8vIHRyeWluZyB0byBkZWxldGUgdGhlIG9sZCBiYWNrdXAgZmlsZSBpZiBpdCBleGlzdHMKLQkJCQkvLwotCQkJCWlmIChiYWtGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWJha0ZpbGUuZGVsZXRlKCk7Ci0JCQkJfQotCi0JCQkJaWYgKGZpbmFsRmlsZS5leGlzdHMoKSkgewotCQkJCQkvLyBzb21lIENNIHByb3ZpZGVyIGxpa2UgQ2xlYXJDYXNlIHJlbmFtZWQgdGhlIHZlcnNpb25lZAotCQkJCQkvLyBmaWxlIGl0IGl0cyByZXBvc2l0b3J5IGFzIHNvb24gYXMgdXNlciByZW5hbWVkIHRoZSBmaWxlCi0JCQkJCS8vIGluIHRoZSB3b3Jrc3BhY2UuIFRvIGF2b2lkIHRoaXMsIHVzZSBvbmx5IHJlZ3VsYXIgcmVuYW1lCi0JCQkJCS8vIHJvdXRpbmUgb2YgamF2YS5pby5GaWxlIGluc3RlYWQgb2YgSVJlc291cmNlIHJvdXRpbmUKLQkJCQkJLy8KLQkJCQkJaWYgKEZpbGVVdGlsLm1vdmVGaWxlKGZpbmFsRmlsZSwgYmFrRmlsZSkpIHsKLQkJCQkJCWJhY2t1cEZpbGUgPSBiYWNrdXA7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLnJlbmFtZUVycm9yX21zZywKLQkJCQkJCQkJZmluYWxGaWxlLCBiYWNrdXApOwotCQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKG1zZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHJlbmFtZSB0aGUgcmVzb3VyY2UgZmlsZSB0byB0aGUgb3JpZ2luYWwgbmFtZQotCQkJLy8KLQkJCUZpbGUgY3VycmVudEZpbGUgPSBuZXcgRmlsZSh3YXNNb3ZlID8gdG9GaWxlU3RyaW5nKG9sZFVSSSkKLQkJCQkJOiB0b0ZpbGVTdHJpbmcocmVzb3VyY2UuZ2V0VVJJKCkpKTsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCQkJaWYgKHdhc01vdmUpIHsKLQkJCQlzdWNjZXNzID0gTXVsdGlGaWxlU2F2ZVV0aWwubW92ZShyZXNvdXJjZSwgY3VycmVudEZpbGUsIGZpbmFsRmlsZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHNvbWUgQ00gcHJvdmlkZXIgbGlrZSBDbGVhckNhc2UgcmVuYW1lZCB0aGUgdmVyc2lvbmVkIGZpbGUgaXQKLQkJCQkvLyBpdHMgcmVwb3NpdG9yeSBhcyBzb29uIGFzIHVzZXIgcmVuYW1lZCB0aGUgZmlsZQotCQkJCS8vIGluIHRoZSB3b3Jrc3BhY2UuIFRvIGF2b2lkIHRoaXMsIHVzZSBvbmx5IHJlZ3VsYXIgcmVuYW1lCi0JCQkJLy8gcm91dGluZSBvZiBqYXZhLmlvLkZpbGUgaW5zdGVhZCBvZiBJUmVzb3VyY2Ugcm91dGluZQotCQkJCS8vCi0JCQkJc3VjY2VzcyA9IEZpbGVVdGlsLm1vdmVGaWxlKGN1cnJlbnRGaWxlLCBmaW5hbEZpbGUpOwotCQkJfQotCQkJaWYgKCFzdWNjZXNzKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLnJlbmFtZUVycm9yX21zZywKLQkJCQkJCWN1cnJlbnRGaWxlLCBmaW5hbEZpbGUpOwotCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihtc2cpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAod2FzTW92ZSkgewotCQkJCQlkaWRNb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3MgdG8gb3ZlcnJpZGUgdG8gaGFuZGxlIHBvc3QgbW92ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpZE1vdmUoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlQmFja3VwKCkgewotCQlpZiAoYmFja3VwRmlsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCS8vIEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZGVsZXRlKGJhY2t1cEZpbGUpOwotCQkJCW5ldyBGaWxlKGJhY2t1cEZpbGUpLmRlbGV0ZSgpOwotCQkJCWJhY2t1cEZpbGUgPSBudWxsOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNUZW1wVVJJKCkgewotCQlpZiAoY3VycmVudFR4SUQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNyZWF0ZVRlbXBVUkkoKS5lcXVhbHMocmVzb3VyY2UuZ2V0VVJJKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgVVJJIGdldEZpbmFsVVJJKCkgewotCQlpZiAoZmluYWxVUkkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZpbmFsVVJJOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZS5nZXRVUkkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXN0b3JlKCkgewotCQlGaWxlIHNyYyA9IG51bGwsIGRlc3QgPSBudWxsOwotCQlib29sZWFuIG1vdmVkID0gZmFsc2U7Ci0JCWlmIChiYWNrdXBGaWxlICE9IG51bGwpIHsKLQkJCXNyYyA9IG5ldyBGaWxlKGJhY2t1cEZpbGUpOwotCQkJZGVzdCA9IG5ldyBGaWxlKHRvRmlsZVN0cmluZyhnZXRGaW5hbFVSSSgpKSk7Ci0JCX0gZWxzZSB7Ci0JCQltb3ZlZCA9IG9sZFVSSSAhPSBudWxsICYmICFvbGRVUkkuZXF1YWxzKGZpbmFsVVJJKTsKLQkJCWlmIChtb3ZlZCkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRvRmlsZVN0cmluZyhnZXRGaW5hbFVSSSgpKSk7Ci0JCQkJZGVzdCA9IG5ldyBGaWxlKHRvRmlsZVN0cmluZyhvbGRVUkkpKTsKLQkJCQltb3ZlZCA9IGZpbGUuZXhpc3RzKCkgJiYgIWRlc3QuZXhpc3RzKCk7Ci0JCQkJaWYgKG1vdmVkKSB7Ci0JCQkJCXNyYyA9IGZpbGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzcmMgIT0gbnVsbCkgewotCQkJaWYgKGRlc3QuZXhpc3RzKCkpIHsKLQkJCQlGaWxlVXRpbC5tb3ZlRmlsZShkZXN0LG5ldyBGaWxlKHRvRmlsZVN0cmluZyhyZXNvdXJjZS5nZXRVUkkoKSkpKTsKLQkJCX0KLQkJCWJvb2xlYW4gc3VjY2VzczsKLQkJCWlmIChtb3ZlZCkgewotCQkJCXN1Y2Nlc3MgPSBNdWx0aUZpbGVTYXZlVXRpbC5tb3ZlKHJlc291cmNlLCBzcmMsIGRlc3QpOwotCQkJCS8vIGlmKHN1Y2Nlc3MpIHsKLQkJCQkvLyBNdWx0aUZpbGVTYXZlVXRpbC51cGRhdGVVUklNYXBwaW5ncyh0aGlzLCBudWxsKTsKLQkJCQkvLyB9Ci0JCQl9IGVsc2UgewotCQkJCXN1Y2Nlc3MgPSBGaWxlVXRpbC5tb3ZlRmlsZShzcmMsZGVzdCk7Ci0JCQl9Ci0JCQlpZiAoIXN1Y2Nlc3MpIHsKLQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oTkxTLmJpbmQoCi0JCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5yZXN0b3JlUmVzb3VyY2VFcnJvcl9tc2csIHRoaXMpKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0eEZpbmlzaGVkKGJvb2xlYW4gc3VjY2Vzc2Z1bCkgewotLy8JCWJvb2xlYW4gd2FzTW92ZSA9ICFvbGRVUkkuZXF1YWxzKGZpbmFsVVJJKTsKLQkJaWYgKHN1Y2Nlc3NmdWwpIHsKLQkJCXJlc291cmNlLnNldFVSSShmaW5hbFVSSSk7Ci0JCQlyZXNvdXJjZS5zZXRNb2RpZmllZChmYWxzZSk7Ci0vLwkJCXVwZGF0ZVRpbWVTdGFtcHMoKTsKLS8vCQkJRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWZyZXNoKHRoaXMpOwotLy8JCQlpZighd2FzTW92ZSkgewotLy8JCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZ2V0UmVzb3VyY2VTZXQoKTsKLS8vCQkJCWlmKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLS8vCQkJCQlyZXNvdXJjZVNldC5nZXRVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyKCkudmFsaWRhdGVNYXJrZXJzKHRoaXMpOwotLy8JCQkJfQotLy8JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXN0b3JlVVJJKCk7Ci0vLwkJCWlmICh3YXNNb3ZlKSB7Ci0vLwkJCQkvLyByZXN0b3JlIHVyaSBvZiBSZXNvdXJjZURlc2NyaXB0b3Igb2YgdGhpcyByZXNvdXJjZQotLy8JCQkJLy8KLS8vCQkJCU11bHRpRmlsZVNhdmVVdGlsLnVwZGF0ZVVSSU1hcHBpbmdzKHRoaXMsIG9sZFVSSSwgbnVsbCwgdHJ1ZSk7Ci0vLwkJCX0KLQkJfQotLy8JCWlmIChvbGRVUkkgIT0gbnVsbCkgewotLy8JCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBnZXRSZXNvdXJjZVNldCgpOwotLy8JCQlpZiAocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotLy8JCQkJcmVzb3VyY2VTZXQuZ2V0VVJJVG9UZW1wVVJJTWFwKCkucmVtb3ZlKG9sZFVSSSk7Ci0vLwkJCX0KLS8vCQkJb2xkVVJJID0gbnVsbDsKLS8vCQl9Ci0JCWN1cnJlbnRUeElEID0gbnVsbDsKLQkJZmluYWxVUkkgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlc3RvcmVzIHRoZSByZXNvdXJjZSBVUkkgdG8gdGhlIG9yaWdpbmFsIG9uZS4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsCi0JICogYWZ0ZXIgc2F2aW5nIHJlZ2FybGVzcyBvZiBpdHMgc3VjY2Vzcy4KLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzdG9yZVVSSSgpIHsKLQkJaWYgKG9sZFVSSSAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZS5zZXRVUkkob2xkVVJJKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9GaWxlTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9GaWxlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODY1MWM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRmlsZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwudXRpbHMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgc3VuLnNlY3VyaXR5LmFjdGlvbi5HZXRQcm9wZXJ0eUFjdGlvbjsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgSUZpbGVNYW5hZ2VyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmlsZU1hbmFnZXIgaW1wbGVtZW50cyBJRmlsZU1hbmFnZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gRmlsZU1hbmFnZXIuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZU1hbmFnZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRtcGRpcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRlbXBEaXIoKSB7Ci0JCWlmICh0bXBkaXIgPT0gbnVsbCkgewotCQkJR2V0UHJvcGVydHlBY3Rpb24gYSA9IG5ldyBHZXRQcm9wZXJ0eUFjdGlvbigiamF2YS5pby50bXBkaXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJdG1wZGlyID0gKChTdHJpbmcpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKGEpKTsKLQkJfQotCQlyZXR1cm4gdG1wZGlyOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZUVkaXRJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoRmlsZU1hbmFnZXIuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBGaWxlTWFuYWdlcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsZU1hbmFnZXIoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUobG9jYXRpb24pOwotCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgobG9jYXRpb24pOwotCQlJUmVzb3VyY2UgcmVzb3VyY2U7Ci0JCWlmIChmaWxlLmlzRmlsZSgpKSB7Ci0JCQlyZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCQlJUmVzb3VyY2UgcGFyZW50UmVzb3VyY2UgPSBnZXRSZXNvdXJjZUZvckxvY2F0aW9uKGZpbGUKLQkJCQkJCS5nZXRQYXJlbnQoKSk7Ci0JCQkJaWYgKHBhcmVudFJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBhcmVudFJlc291cmNlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCX0KLQkJCQkJcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZ2V0Q29udGFpbmVyRm9yTG9jYXRpb24ocGF0aCk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZWZyZXNoKElSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoIXJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQlBcnJheUxpc3QgZm9sZGVyc1RvUmVmcmVzaCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlDb250YWluZXIgY29udGFpbmVyOwotCQkJZm9yIChjb250YWluZXIgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsgIWNvbnRhaW5lci5leGlzdHMoKTsgY29udGFpbmVyID0gY29udGFpbmVyCi0JCQkJCS5nZXRQYXJlbnQoKSkgewotCQkJCWZvbGRlcnNUb1JlZnJlc2guYWRkKDAsIGNvbnRhaW5lcik7Ci0JCQl9Ci0JCQlpZiAoY29udGFpbmVyLmV4aXN0cygpKSB7Ci0JCQkJY29udGFpbmVyLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKLQkJCX0KLQkJCWlmICghZm9sZGVyc1RvUmVmcmVzaC5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmb2xkZXJzVG9SZWZyZXNoLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlGb2xkZXIgZm9sZGVyID0gKElGb2xkZXIpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJCQlmb2xkZXIucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG51bGwpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJlc291cmNlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaGVzIGZpbGUgb3IgZGlyZWN0b3J5IHdpdGggZ2l2ZW4gbG9jYWwgZmlsZSBzeXN0ZW0KLQkgKiA8Y29kZT5wYXRoPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBsb2NhbCBmaWxlIHN5c3RlbSBwYXRoCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcmVmcmVzaChTdHJpbmcgcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZUZvckxvY2F0aW9uKHBhdGgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlZnJlc2gocmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWZyZXNoKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVmcmVzaChyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotLy8JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbW92ZShTdHJpbmcgb2xkUGF0aCwgU3RyaW5nIG5ld1BhdGgpIHsKLQkJcmV0dXJuIG1vdmUob2xkUGF0aCwgbmV3UGF0aCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1vdmUoU3RyaW5nIG9sZFBhdGgsIFN0cmluZyBuZXdQYXRoLAotCQkJYm9vbGVhbiBmb3JjZVJlbW92ZVNvdXJjZSkgewotCQl0cnkgewotCQkJcmVmcmVzaChvbGRQYXRoKTsKLQotCQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkKLQkJCQkJLmdldFJvb3QoKTsKLQotCQkJLy8gY3JlYXRlIHRoZSBmb2xkZXJzIG9mIHRoZSBkZXN0aW5hdGlvbiBpZiB0aGV5IGRpZCBub3QgZXhpc3QKLQkJCUlQYXRoIGRlc3RQYXRoID0gbmV3IFBhdGgobmV3UGF0aCk7Ci0JCQlpZiAobmV3IEZpbGUob2xkUGF0aCkuaXNGaWxlKCkpIHsKLQkJCQlyZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKGRlc3RQYXRoKTsKLQkJCQlpZihyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRDb250YWluZXJGb3JMb2NhdGlvbihkZXN0UGF0aCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsJCQkJCi0JCQkJcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldENvbnRhaW5lckZvckxvY2F0aW9uKGRlc3RQYXRoKTsKLQkJCQlpZihyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlRm9yTG9jYXRpb24oZGVzdFBhdGgpOwotCQkJCX0KLQkJCX0JCi0JCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQkJCXJlc291cmNlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbnVsbCk7Ci0JCQkJCWlmKHJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oTkxTLmJpbmQoCi0JCQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLm1vdmVFcnJvcl9tc2csIG9sZFBhdGgsIG5ld1BhdGgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlBcnJheUxpc3QgZm9sZGVyc1RvQ3JlYXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUlDb250YWluZXIgY29udGFpbmVyOwotCQkJCWZvciAoY29udGFpbmVyID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7ICFjb250YWluZXIuZXhpc3RzKCk7IGNvbnRhaW5lciA9IGNvbnRhaW5lcgotCQkJCS5nZXRQYXJlbnQoKSkgewotCQkJCQlmb2xkZXJzVG9DcmVhdGUuYWRkKDAsIGNvbnRhaW5lcik7Ci0JCQkJfQotCQkJCWlmICghZm9sZGVyc1RvQ3JlYXRlLmlzRW1wdHkoKSkgewotCQkJCQljb250YWluZXIucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG51bGwpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmb2xkZXJzVG9DcmVhdGUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZm9sZGVyLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlkZXN0UGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0JCQl9Ci0JCQllbHNlIGlmKFBsYXRmb3JtLmdldExvY2F0aW9uKCkuaXNQcmVmaXhPZihkZXN0UGF0aCkpIHsKLQkJCQlkZXN0UGF0aCA9IG5ldyBQYXRoKGRlc3RQYXRoLnRvT1NTdHJpbmcoKS5zdWJzdHJpbmcoUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkubGVuZ3RoKCkpKTsJCQkJCQkKLQkJCX0KLQkJCQotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKG9sZFBhdGgpOwotCQkJSUZpbGUgZmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7Ci0JCQkJcmVzb3VyY2UgPSBmaWxlOwotCQkJfSBlbHNlIHsKLQkJCQlyZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZ2V0Q29udGFpbmVyRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQl9Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXJlc291cmNlLm1vdmUoZGVzdFBhdGgsIHRydWUsIG51bGwpOwotCQkJCX0gY2F0Y2ggKFJlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJCQkJCi0JCQkJCWlmIChmb3JjZVJlbW92ZVNvdXJjZSkgewotCQkJCQkJdGhyb3cgZTsKLQkJCQkJfQotCi0JCQkJCWJvb2xlYW4gZmFpbGVkID0gZmFsc2U7Ci0KLQkJCQkJLy8gaGFuZGxlIHNpdHVhdGlvbiB3aGVuIEVjbGlwc2UgbW92ZXMgZmlsZS9kaXJlY3RvcnkgYnkKLQkJCQkJLy8gY29weWluZyBpdCB0byBkZXN0aW5hdGlvbiB0aGVuIGRlbGV0aW5nIHRoZSBzb3VyY2UKLQkJCQkJLy8gYnV0IGRlbGV0aW9uIGZhaWxlZAotCQkJCQlJU3RhdHVzW10gc3RhdHVzZXMgPSBlLmdldFN0YXR1cygpLmdldENoaWxkcmVuKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHVzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gc3RhdHVzZXNbaV07Ci0JCQkJCQlpZiAoc3RhdHVzLmdldENvZGUoKSA9PSBJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX0RFTEVURV9MT0NBTAotCQkJCQkJCQkmJiBzdGF0dXMuZ2V0TWVzc2FnZSgpID09IE1lc3NhZ2VzLmxvY2Fsc3RvcmVfZGVsZXRlUHJvYmxlbSkgewotCQkJCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJCQkiV2FybmluZyB3aGlsZSBtb3ZpbmcgJyd7MH0nJyB0byAnJ3sxfScnOiB7Mn0iLCBuZXcgT2JqZWN0W10geyBvbGRQYXRoLCBuZXdQYXRoLCBzdGF0dXMuZ2V0TWVzc2FnZSgpIH0pOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ1dhcm5pbmcobXNnKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZmFpbGVkID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoZmFpbGVkIHx8ICFuZXcgRmlsZShuZXdQYXRoKS5leGlzdHMoKSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbmFtZShGaWxlIG9sZEZpbGUsIEZpbGUgbmV3RmlsZSkgewotCQlyZXR1cm4gbW92ZShvbGRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBuZXdGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGVSZXNvdXJjZShTdHJpbmcgcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBubyBuZWVkIHRvIHJlZnJlc2ggdGhlIHdob2xlIHRyZWUgZnJvbSBzcGVjaWZpZWQgcGF0aAotCQkvLyBnZXRSZXNvdXJjZUZvckxvY2F0aW9uKCkgcmVmcmVzaGVzIHJlc291cmNlIGluIGEgbW9yZSBlZmZpY2llbnQgd2F5Ci0JCS8vCi0JCS8vIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPQotCQkvLyBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkvLyB0cnkgewotCQkvLyB3b3Jrc3BhY2VSb290LnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG1vbml0b3IpOwotCQkvLyB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCS8vIGUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkvLyB9Ci0KLQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihwYXRoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJlc291cmNlLmRlbGV0ZSh0cnVlLCBtb25pdG9yKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGRlbGV0ZShTdHJpbmcgcGF0aCkgewotCQl0cnkgewotCQkJZGVsZXRlUmVzb3VyY2UocGF0aCwgbnVsbCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBmcm9tQ0MoSVN0YXR1cyBzdGF0dXMpIHsKLQkJU3RyaW5nIHBsdWdpbklkID0gc3RhdHVzLmdldFBsdWdpbigpOwotCQlyZXR1cm4gcGx1Z2luSWQgIT0gbnVsbAotCQkJCSYmIHBsdWdpbklkLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiY2xlYXJjYXNlIikgIT0gLTE7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBjaGVja01vZGlmeShTdHJpbmdbXSBwYXRocywgT2JqZWN0IGNvbnRleHQpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSUZpbGVbXSBmaWxlcyA9IG5ldyBJRmlsZVtwYXRocy5sZW5ndGhdOwotCQlBcnJheUxpc3Q8U3RyaW5nPiBub3RGb3VuZEZpbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBwYXRoID0gcGF0aHNbaV07Ci0JCQl0cnkgewotCQkJCXJlZnJlc2gocGF0aCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQlJRmlsZSBmaWxlID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgocGF0aCkpOwotCQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJCW5vdEZvdW5kRmlsZXMuYWRkKHBhdGgpOwotCQkJfSBlbHNlIHsKLQkJCQlmaWxlc1tpXSA9IGZpbGU7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFub3RGb3VuZEZpbGVzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQTFVHSU5fSUQsIElTdGF0dXMuV0FSTklORywgTkxTCi0JCQkJCS5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLmZpbGVOb3RGb3VuZEVycm9yX21zZywKLQkJCQkJCQlub3RGb3VuZEZpbGVzKSwgbnVsbCk7Ci0JCX0KLQotCQlpZiAoIXZhbGlkYXRlRWRpdEluaXRpYWxpemVkKSB7Ci0JCQlzdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVFZGl0KGZpbGVzLCBjb250ZXh0KTsKLQkJCXZhbGlkYXRlRWRpdEluaXRpYWxpemVkID0gdHJ1ZTsKLQkJCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQkJLy8gZG91YmxlLWNoZWNrIGFmdGVyIGluaXRpYWxpemF0aW9uCi0JCQkJLy8KLQkJCQlzdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVFZGl0KGZpbGVzLCBjb250ZXh0KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN0YXR1cyA9IHdvcmtzcGFjZS52YWxpZGF0ZUVkaXQoZmlsZXMsIGNvbnRleHQpOwotCQl9Ci0KLQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFBMVUdJTl9JRCwKLQkJCQkJSVN0YXR1cy5PSywgUGVyc2lzdGVuY2VSZXNvdXJjZXMubW9kaWZ5RmlsZXNFcnJvcl9tc2csCi0JCQkJCW51bGwpOwotCi0JCQkvLyBzb21lIHZlcnNpb24gY29udHJvbCBwcm92aWRlciBzdGlsbCByZXR1cm5zIE9LIHN0YXR1cyBldmVuIHRob3VnaAotCQkJLy8gdXNlciBjYW5jZWxsZWQgdGhlIGNoZWNrIG91dAotCQkJLy8gZG91YmxlLWNoZWNrIGhlcmUgYWdhaW4gdG8gbWFrZSBzdXJlIHRoZSBmaWxlIGlzIG5vdCByZWFkLW9ubHkKLQkJCS8vCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IGZpbGVzW2ldOwotCQkJCXRyeSB7Ci0JCQkJCWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBudWxsKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQl9Ci0JCQkJaWYgKGZpbGUuaXNSZWFkT25seSgpKSB7Ci0JCQkJCVN0cmluZyBsb2NhbFBhdGggPSBmaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMuRmlsZU1hbmFnZXJfZmlsZVJlYWRPbmx5LAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IGxvY2FsUGF0aCB9KTsKLQkJCQkJbXVsdGlTdGF0dXMuYWRkKG5ldyBSZXNvdXJjZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCAwLCBmaWxlCi0JCQkJCQkJLmdldEZ1bGxQYXRoKCksIG1zZywgbnVsbCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmKCFtdWx0aVN0YXR1cy5pc09LKCkpIHsKLQkJCQlyZXR1cm4gbXVsdGlTdGF0dXM7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBoYWNrIGZvciBjbGVhcmNhc2UKLQkJCWlmIChmcm9tQ0Moc3RhdHVzKSkgewotCQkJCVN0cmluZyBtc2cgPSBQZXJzaXN0ZW5jZVJlc291cmNlcy5tb2RpZnlGaWxlc0Vycm9yX21zZzsKLQkJCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhQTFVHSU5fSUQsIHN0YXR1cwotCQkJCQkJLmdldENvZGUoKSwgbXNnLCBudWxsKTsKLQkJCQltdWx0aVN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJCQlyZXR1cm4gbXVsdGlTdGF0dXM7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjb252ZXJ0IHdvcmtzcGFjZSBwYXRoIHRvIGxvY2FsIGZpbGUgc3lzdGVtIHBhdGgKLQkJaWYgKHN0YXR1cyBpbnN0YW5jZW9mIE11bHRpU3RhdHVzKSB7Ci0JCQlNdWx0aVN0YXR1cyBtcyA9IChNdWx0aVN0YXR1cykgc3RhdHVzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtcy5nZXRDaGlsZHJlbigpLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVN0YXR1cyBjaGlsZFN0YXR1cyA9IG1zLmdldENoaWxkcmVuKClbaV07Ci0JCQkJbXMuZ2V0Q2hpbGRyZW4oKVtpXSA9IHRvU3RhdHVzV2l0aExvY2FsUGF0aChjaGlsZFN0YXR1cyk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdGF0dXMgPSB0b1N0YXR1c1dpdGhMb2NhbFBhdGgoc3RhdHVzKTsKLQkJfQotCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElTdGF0dXMgdG9TdGF0dXNXaXRoTG9jYWxQYXRoKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChzdGF0dXMgaW5zdGFuY2VvZiBJUmVzb3VyY2VTdGF0dXMKLQkJCQkmJiBzdGF0dXMuZ2V0Q29kZSgpID09IElSZXNvdXJjZVN0YXR1cy5SRUFEX09OTFlfTE9DQUwpIHsKLQkJCUlSZXNvdXJjZVN0YXR1cyByZXNvdXJjZVN0YXR1cyA9ICgoSVJlc291cmNlU3RhdHVzKSBzdGF0dXMpOwotCQkJSVBhdGggcGF0aCA9IHJlc291cmNlU3RhdHVzLmdldFBhdGgoKTsKLQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpCi0JCQkJCS5nZXRGaWxlKHBhdGgpOwotCQkJU3RyaW5nIGxvY2FsUGF0aCA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLkZpbGVNYW5hZ2VyX2ZpbGVSZWFkT25seSwKLQkJCQkJbmV3IE9iamVjdFtdIHsgbG9jYWxQYXRoIH0pOyAKLQkJCXJldHVybiBuZXcgUmVzb3VyY2VTdGF0dXMoc3RhdHVzCi0JCQkJCS5nZXRTZXZlcml0eSgpLCBzdGF0dXMuZ2V0Q29kZSgpLAotCQkJCQlyZXNvdXJjZVN0YXR1cy5nZXRQYXRoKCksIG1zZywgc3RhdHVzCi0JCQkJCQkJLmdldEV4Y2VwdGlvbigpKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlciNjaGVja01vZGlmeShqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjaGVja01vZGlmeShTdHJpbmcgcGF0aCwgT2JqZWN0IGNvbnRleHQpIHsKLQkJcmV0dXJuIGNoZWNrTW9kaWZ5KG5ldyBTdHJpbmdbXSB7IHBhdGggfSwgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBwYXRoIGlzIHRlYW0tcHJpdmF0ZSBmaWxlIG9yIGZvbGRlcgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVGVhbVByaXZhdGUoU3RyaW5nIHBhdGgpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihwYXRoKTsKLQkJcmV0dXJuIHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNUZWFtUHJpdmF0ZU1lbWJlcigpOwotCX0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBVUkksIHVzaW5nIGEgVVJJIGNvbnZlcnRlcgotICAgICAqIGlmIG5lY2Vzc2FyeSAoYW5kIHByb3ZpZGVkKSB0byBub3JtYWxpemUgaXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaSBhIFVSSQotICAgICAqIEBwYXJhbSBjb252ZXJ0ZXIgYW4gb3B0aW9uYWwgVVJJIGNvbnZlcnRlciAobWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+KQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZpbGUsIGlmIGF2YWlsYWJsZSBpbiB0aGUgd29ya3NwYWNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlKFVSSSB1cmksIFVSSUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLSAgICAgICAgSUZpbGUgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmICgicGxhdGZvcm0iLmVxdWFscyh1cmkuc2NoZW1lKCkpICYmICh1cmkuc2VnbWVudENvdW50KCkgPiAyKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAoInJlc291cmNlIi5lcXVhbHModXJpLnNlZ21lbnQoMCkpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoVVJJLmRlY29kZSh1cmkucGF0aCgpKSkucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodXJpLmlzRmlsZSgpICYmICF1cmkuaXNSZWxhdGl2ZSgpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbigKLSAgICAgICAgICAgICAgICBuZXcgUGF0aCh1cmkudG9GaWxlU3RyaW5nKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSwgdG8gc2VlIHdoZXRoZXIgbWF5IHdlIGNhbiByZXNvbHZlIGl0IHRoaXMgdGltZQotICAgICAgICAgICAgaWYgKGNvbnZlcnRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgVVJJIG5vcm1hbGl6ZWQgPSBjb252ZXJ0ZXIubm9ybWFsaXplKHVyaSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKCF1cmkuZXF1YWxzKG5vcm1hbGl6ZWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2Ugb24gdGhlIG5ldyBVUkkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0RmlsZShub3JtYWxpemVkLCBjb252ZXJ0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0ZpbGVTdHJpbmcoVVJJIHVyaSwgVVJJQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlpZih1cmkuaXNGaWxlKCkpIHsKLQkJCXJldHVybiB1cmkudG9GaWxlU3RyaW5nKCk7Ci0JCX0KLQkJSUZpbGUgZmlsZSA9IGdldEZpbGUodXJpLCBjb252ZXJ0ZXIpOwotCQlyZXR1cm4gZmlsZSAhPSBudWxsID8gZmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSA6IG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvRmlsZVN0cmluZyhVUkkgdXJpKSB7Ci0JCXJldHVybiB0b0ZpbGVTdHJpbmcodXJpLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBGaWxlSW5mbyBpbXBsZW1lbnRzIElGaWxlSW5mbyB7Ci0JCQotCQlwcml2YXRlIElGaWxlIGZpbGU7Ci0KLQkJcHJpdmF0ZSBGaWxlSW5mbyhJRmlsZSBmaWxlKSB7Ci0JCQl0aGlzLmZpbGUgPSBmaWxlOwotCQl9Ci0KLQkJcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSB7Ci0JCQlyZXR1cm4gZmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoKSB7Ci0JCQlyZXR1cm4gZmlsZS5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCX0KLQotCQlwdWJsaWMgRmlsZSBnZXRGaWxlKCkgewotCQkJSVBhdGggbG9jID0gZmlsZS5nZXRMb2NhdGlvbigpOwotCQkJcmV0dXJuIGxvYyAhPSBudWxsID8gZmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpIDogbnVsbDsKLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIElGaWxlSW5mbyBnZXRGaWxlSW5mbyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUocmVzb3VyY2UpOwotCQlyZXR1cm4gZmlsZSAhPSBudWxsID8gbmV3IEZpbGVJbmZvKGZpbGUpIDogbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZpbGVQYXRoUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRmlsZVBhdGhQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTRlZmRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRmlsZVBhdGhQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogRmlsZS1iYXNlZCBVUkkgcHJvdmlkZXIKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgOCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZpbGVQYXRoUHJvdmlkZXIgaW1wbGVtZW50cyBJVVJJUHJvdmlkZXIgewotCXByb3RlY3RlZCBGaWxlUGF0aFByb3ZpZGVyKCkgewotCQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuSVVSSVByb3ZpZGVyI2dldFVSSShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgVVJJIGdldFVSSShFT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuY3JlYXRlRmlsZVVSSSgoTWV0aG9kRWxlbWVudCkgb2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvSUZpbGVJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0lGaWxlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDkwNjEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvSUZpbGVJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5lIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWxlSW5mbyB7Ci0JRmlsZSBnZXRGaWxlKCk7Ci0JCi0JbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQotCWJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvSVVSSVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0lVUklQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmVjZjVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvSVVSSVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIEludGVyZmFjZSB0byBwcm92aWRlIFVSSSBmb3IgYW4gRU9iamVjdC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgOCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVVJJUHJvdmlkZXIgewotCQotCS8qKgotCSAqIEdldHMgdGhlIFVSSSBmb3IgdGhlIGdpdmVuIG9iamVjdCBpZiB0aGlzIG9iamVjdCBoYXMgb3Igc2hvdWxkIGhhdmUgYSBkaXJlY3QgcmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybiB0aGUgVVJJIG9yIG51bGwgaWYgdGhlIGdpdmVuIG9iamVjdCBkb2VzL3dpbGwgbm90IGhhdmUgYSBkaXJlY3QgcmVzb3VyY2UKLQkgKi8KLQlVUkkgZ2V0VVJJKEVPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZTg4ZTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5JRmFpbFNhZmVTYXZhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEZpbGUtYmFzZWQgaW1wbGVtZW50YXRpb24gZm9yIElNZXRob2RMaWJyYXJ5UGVyc2lzdGVyCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGltcGxlbWVudHMgSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRm9sZGVySW5mbyB7Ci0KLQkJRUNsYXNzIGVDbGF6ejsKLQotCQlib29sZWFuIHNoYXJlZDsKLQotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JCS8qKgotCQkgKiBAcGFyYW0gY2xhenoKLQkJICogQHBhcmFtIHNoYXJlZAotCQkgKi8KLQkJcHVibGljIEZvbGRlckluZm8oRUNsYXNzIGNsYXp6LCBib29sZWFuIHNoYXJlZCkgewotCQkJc3VwZXIoKTsKLQkJCWVDbGF6eiA9IGNsYXp6OwotCQkJdGhpcy5zaGFyZWQgPSBzaGFyZWQ7Ci0JCQl0aGlzLm5hbWUgPSBsb3dlckFuZFBsdXJhbGl6ZShjbGF6ei5nZXROYW1lKCkpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgSU5TVEFOQ0UgPSBuZXcgTWV0aG9kTGlicmFyeVBlcnNpc3RlcigpOwotCi0JLy8gbmVlZCB0byBleHBvc2UgdGhpcywganhpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfRk9MREVSID0gInJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgZm9sZGVySW5mb3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlzdGF0aWMgewotCQlmb2xkZXJJbmZvcy5hZGQobmV3IEZvbGRlckluZm8oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2UoKSwKLQkJCQlmYWxzZSkpOwotCQlmb2xkZXJJbmZvcy5hZGQobmV3IEZvbGRlckluZm8oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3QoKSwKLQkJCQl0cnVlKSk7Ci0JCWZvbGRlckluZm9zCi0JCQkJLmFkZChuZXcgRm9sZGVySW5mbyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpLCB0cnVlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3Qgd2FybmluZ3M7Ci0KLQlwdWJsaWMgTWV0aG9kTGlicmFyeVBlcnNpc3RlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb3JyZWN0IHBhdGggKHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4pIG9mIHRoZSBmaWxlIG9mIHRoZQotCSAqIGdpdmVuIGNvbnRlbnQgZGVzY3JpcHRpb24gb3IgbnVsbCBpZiB0aGUgZ2l2ZW4gY29udGVudCBkb2VzIG5vdCBiZSBsb25nCi0JICogdG8gYW55IHBsdWdpbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb3JyZWN0UGF0aChDb250ZW50RGVzY3JpcHRpb24gY29udGVudCkgewotCQlyZXR1cm4gZ2V0Q29ycmVjdFBhdGgoKERlc2NyaWJhYmxlRWxlbWVudCkgY29udGVudC5lQ29udGFpbmVyKCksCi0JCQkJY29udGVudCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENvcnJlY3RQYXRoKERlc2NyaWJhYmxlRWxlbWVudCBlLAotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQpIHsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBwbHVnaW4uZVJlc291cmNlKCk7Ci0JCVVSSSB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShyZXNvdXJjZSk7Ci0JCUZpbGUgcGx1Z2luRGlyID0gbmV3IEZpbGUodXJpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCVN0cmluZyBmb2xkZXJQYXRoID0gc3RhdGljR2V0Rm9sZGVyUGF0aChlLmVDbGFzcygpKTsKLQkJU3RyaW5nIGRpciA9IG5ldyBTdHJpbmdCdWZmZXIocGx1Z2luRGlyLmdldEFic29sdXRlUGF0aCgpKS5hcHBlbmQoCi0JCQkJRmlsZS5zZXBhcmF0b3IpLmFwcGVuZChmb2xkZXJQYXRoKS5hcHBlbmQoRmlsZS5zZXBhcmF0b3IpCi0JCQkJLnRvU3RyaW5nKCk7Ci0KLQkJcmV0dXJuIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShkaXIsIGUsIGNvbnRlbnQpOwotCX0KLQotCS8qKgotCSAqIEdldHMgbmV4dCBhdmFpbGFibGUgZmlsZSBuYW1lIGZvciB0aGUgZ2l2ZW4ge0BsaW5rIE11bHRpUmVzb3VyY2VFT2JqZWN0fSBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5IDxjb2RlPmRpcjwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyIHRoZSBkaXJlY3RvcnkgcGF0aCB0aGF0IG11c3QgaGF2ZSBhIGZpbGUgc2VwYXJhdG9yIGF0IHRoZSBlbmQKLQkgKiBAcGFyYW0gcmVxdWVzdGVkTmFtZQotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShTdHJpbmcgZGlyLCBTdHJpbmcgcmVxdWVzdGVkTmFtZSwKLQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IGUpIHsKLQkJU3RyaW5nIGN1cnJlbnRGaWxlbmFtZSA9IG51bGw7Ci0JCUZpbGUgY3VycmVudEZpbGUgPSBudWxsOwotCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBlCi0JCQkJLmVEaXJlY3RSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJLy8ga2VlcCBleGlzdGluZyBmaWxlIG5hbWUgZHVyaW5nIG1vdmUgaWYgaXQgaXMgbm90IHRha2VuIHlldC4gRG9uJ3QKLQkJCS8vIHRyeSB0byBtYXRjaCB0aGUgZWxlbWVudCdzIG5hbWUKLQkJCS8vCi0JCQlTdHJpbmcgcGF0aCA9ICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBlLmVSZXNvdXJjZSgpKQotCQkJCQkuZ2V0RmluYWxVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCWN1cnJlbnRGaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCQljdXJyZW50RmlsZW5hbWUgPSBjdXJyZW50RmlsZS5nZXROYW1lKCk7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsIGN1cnJlbnRGaWxlbmFtZSk7Ci0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCQkvLyB0aGUgZWxlbWVudCBpcyBiZWluZyBtb3ZlZAotCQkJCS8vCi0JCQkJcmV0dXJuIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBlbGVtZW50IHdpdGhvdXQgYSByZXNvdXJjZSBvciBwYXRoIGlzIGFscmVhZHkgdGFrZW4KLQkJLy8KLQkJU3RyaW5nIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKGRpcikuYXBwZW5kKHJlcXVlc3RlZE5hbWUpLmFwcGVuZCgKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0ZJTEVfRVhURU5TSU9OKS50b1N0cmluZygpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJaWYoZmlsZS5lcXVhbHMoY3VycmVudEZpbGUpKSB7Ci0JCQlyZXR1cm4gcGF0aDsKLQkJfQotCQlpZiAoKGN1cnJlbnRGaWxlbmFtZSAhPSBudWxsICYmIGN1cnJlbnRGaWxlbmFtZS5lcXVhbHMocmVxdWVzdGVkTmFtZSkpCi0JCQkJfHwgZmlsZS5leGlzdHMoKSkgewotCQkJZm9yIChpbnQgaSA9IDI7IHRydWU7IGkrKykgewotCQkJCXBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKGRpcikuYXBwZW5kKHJlcXVlc3RlZE5hbWUpLmFwcGVuZCgnICcpCi0JCQkJCQkuYXBwZW5kKGkpLmFwcGVuZCgKLQkJCQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTikKLQkJCQkJCS50b1N0cmluZygpOwotCQkJCWlmICghbmV3IEZpbGUocGF0aCkuZXhpc3RzKCkpIHsKLQkJCQkJcmV0dXJuIHBhdGg7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuIHBhdGg7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgU3RyaW5nIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShTdHJpbmcgZGlyLAotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQpIHsKLQkJcmV0dXJuIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShkaXIsIChEZXNjcmliYWJsZUVsZW1lbnQpIGNvbnRlbnQKLQkJCQkuZUNvbnRhaW5lcigpLCBjb250ZW50KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TmV4dEF2YWlsYWJsZUZpbGVOYW1lKFN0cmluZyBkaXIsCi0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZSwgQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQpIHsKLQkJcmV0dXJuIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShkaXIsIGUuZ2V0TmFtZSgpLAotCQkJCShNdWx0aVJlc291cmNlRU9iamVjdCkgY29udGVudCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0YXRpY0dldEZvbGRlclBhdGgoRUNsYXNzIGVDbGF6eikgewotCQlpbnQgc2l6ZSA9IGZvbGRlckluZm9zLnNpemUoKTsKLQkJRm9sZGVySW5mbyBpbmZvID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUZvbGRlckluZm8gZm9sZGVySW5mbyA9IChGb2xkZXJJbmZvKSBmb2xkZXJJbmZvcy5nZXQoaSk7Ci0JCQlpZiAoZm9sZGVySW5mby5lQ2xhenouaXNTdXBlclR5cGVPZihlQ2xhenopKSB7Ci0JCQkJaW5mbyA9IGZvbGRlckluZm87Ci0JCQl9Ci0JCX0KLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaWYgKGluZm8uZUNsYXp6ID09IGVDbGF6eiB8fCBpbmZvLnNoYXJlZCkgewotCQkJCXJldHVybiBpbmZvLm5hbWU7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyKGluZm8ubmFtZSkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yQ2hhcikKLQkJCQkJCS5hcHBlbmQobG93ZXJBbmRQbHVyYWxpemUoZUNsYXp6LmdldE5hbWUoKSkpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbG93ZXJBbmRQbHVyYWxpemUoZUNsYXp6LmdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb3dlckFuZFBsdXJhbGl6ZShTdHJpbmcgbmFtZSkgewotCQluYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQlpZiAobmFtZS5lbmRzV2l0aCgiY2hpbGRyZW4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZTsKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJjaGlsZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuYW1lICsgInJlbiI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJkYXRhIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5hbWU7Ci0JCX0gZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgiZGF0dW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDIpICsgImEiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgiYnkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZSArICJzIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKG5hbWUuZW5kc1dpdGgoInkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDEpICsgImllcyI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJleCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gMikgKyAiaWNlcyI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJ4IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5hbWUgKyAiZXMiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgidXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDIpICsgImkiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgic3MiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZSArICJlcyI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5hbWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbmFtZSArICJzIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdmlydHVhbCBwYXRoIHRvIHRoZSByZXNvdXJjZSBmb2xkZXIgb2YgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqIEBzZWUgI2dldEVsZW1lbnRWaXJ0dWFsUGF0aChNZXRob2RFbGVtZW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VSZXNvdXJjZVZpcnR1YWxQYXRoKE1ldGhvZEVsZW1lbnQgZSkgewotCQlTdHJpbmcgZm9sZGVyUGF0aCA9IGdldEVsZW1lbnRWaXJ0dWFsUGF0aChlKTsKLQkJaWYgKGZvbGRlclBhdGggPT0gbnVsbCB8fCBmb2xkZXJQYXRoLmxlbmd0aCgpID09IDApCi0JCXsKLQkJCXJldHVybiBSRVNPVVJDRV9GT0xERVI7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihmb2xkZXJQYXRoKTsKLQkJCWlmICggIWZvbGRlclBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpICkgewotCQkJCWJ1ZmZlci5hcHBlbmQoRmlsZS5zZXBhcmF0b3IpOwotCQkJfSAKLQkJCQotCQkJYnVmZmVyLmFwcGVuZChSRVNPVVJDRV9GT0xERVIpOwkJCQkKLQkJCQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdmlydHVhbCBwYXRoIHRvIHRoZSBmb2xkZXIgb2YgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgb2JqZWN0LiBUaGlzIHBhdGggd2lsbCBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgotCSAqIDxwbHVnaW5fbmFtZT5cZm9sZGVyX3JlbGF0aXZlX3BhdGhcCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFZpcnR1YWxQYXRoKE1ldGhvZEVsZW1lbnQgZSkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJaWYgKCEoZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24gfHwgZSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpKSB7Ci0JCQkJLy8gZXJyb3I6IHBsdWdpbiBlbGVtZW50IHdpdGhvdXQgYSB2YWxpZCBwbHVnaW4gc2V0LiBUaGlzCi0JCQkJLy8gcHJvYmxlbSBuZWVkcyB0byBiZSBmaXhlZC4KLQkJCQkvLyBzdGlsbCBzZWUgaXQgZnJvbSB0aW1lIHRvIHRpbWUsCi0JCQkJLy8gZm9yIGV4YW1wbGUsIHdoZW4gbGljayBvbiBhIGNhcGFiaWxpdHkgcGF0dGVybiBpbgotCQkJCS8vIENvbmZpZ3VyYXRpb24gRXhwbG9yZXIKLQkJCQlTeXN0ZW0uZXJyCi0JCQkJCQkucHJpbnRsbigiZXJyb3IgaW4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXRFbGVtZW50UGF0aCgpOiBwbHVnaW4gZWxlbWVudCB3aXRob3V0IGEgdmFsaWQgcGx1Z2luLiBUaGlzIHByb2JsZW0gbmVlZHMgdG8gYmUgZml4ZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlTdHJpbmcgZm9sZGVyUGF0aCA9IGdldEZvbGRlclJlbGF0aXZlUGF0aChlKTsKLQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBwbHVnaW4uZ2V0TmFtZSgpOwotCQlyZXR1cm4gKGZvbGRlclBhdGgubGVuZ3RoKCkgPT0gMCA/IHBsdWdpbk5hbWUgKyBGaWxlLnNlcGFyYXRvciA6IG5ldyBTdHJpbmdCdWZmZXIoCi0JCQkJcGx1Z2luTmFtZSkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yQ2hhcikuYXBwZW5kKGZvbGRlclBhdGgpCi0JCQkJLmFwcGVuZChGaWxlLnNlcGFyYXRvckNoYXIpLnRvU3RyaW5nKCkpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5IHJvb3QgZGlyZWN0b3J5IHRvIHRoZQotCSAqIGZvbGRlciBvZiB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCQotCXByaXZhdGUgU3RyaW5nIGdldFJlbGF0aXZlRWxlbWVudFBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCVN0cmluZyBmb2xkZXJQYXRoID0gZ2V0Rm9sZGVyUmVsYXRpdmVQYXRoKGUpOwotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJaWYgKChlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbiB8fCBlIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkpIHsKLQkJCQlyZXR1cm4gZm9sZGVyUGF0aDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGVycm9yOiBwbHVnaW4gZWxlbWVudCB3aXRob3V0IGEgdmFsaWQgcGx1Z2luIHNldC4gVGhpcwotCQkJCS8vIHByb2JsZW0gbmVlZHMgdG8gYmUgZml4ZWQuCi0JCQkJLy8gc3RpbGwgc2VlIGl0IGZyb20gdGltZSB0byB0aW1lLAotCQkJCS8vIGZvciBleGFtcGxlLCB3aGVuIGxpY2sgb24gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaW4KLQkJCQkvLyBDb25maWd1cmF0aW9uIEV4cGxvcmVyCi0JCQkJU3lzdGVtLmVycgotCQkJCQkJLnByaW50bG4oImVycm9yIGluIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuZ2V0RWxlbWVudFBhdGgoKTogcGx1Z2luIGVsZW1lbnQgd2l0aG91dCBhIHZhbGlkIHBsdWdpbi4gVGhpcyBwcm9ibGVtIG5lZWRzIHRvIGJlIGZpeGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpZiAocGx1Z2luLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkvLyBlcnJvcjogcGx1Z2luIHdpdGhvdXQgbGlicmFyeSBzZXQuIFRoaXMgcHJvYmxlbSBuZWVkcyB0byBiZQotCQkJLy8gZml4ZWQuCi0JCQkvLyBzdGlsbCBzZWUgaXQgZnJvbSB0aW1lIHRvIHRpbWUKLQkJCVN5c3RlbS5lcnIKLQkJCQkJLnByaW50bG4oImVycm9yIGluIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuZ2V0RWxlbWVudFBhdGgoKTogcGx1Z2luIHdpdGhvdXQgbGlicmFyeSBzZXQuIFRoaXMgcHJvYmxlbSBuZWVkcyB0byBiZSBmaXhlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTdHJpbmcgcmVsUGx1Z2luUGF0aDsKLQkJaWYgKHBsdWdpbi5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSBsaWJSZXMgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkocGx1Z2luKS5lUmVzb3VyY2UoKTsKLQkJCWlmIChsaWJSZXMgPT0gcGx1Z2luLmVSZXNvdXJjZSgpKSB7Ci0JCQkJLy8gdGhlIHBsdWdpbiBpcyBub3Qgc2F2ZWQgeWV0Ci0JCQkJcmVsUGx1Z2luUGF0aCA9IHBsdWdpbi5nZXROYW1lKCk7Ci0JCQl9IGVsc2UgewotCQkJCVVSSSB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShwbHVnaW4uZVJlc291cmNlKCkpOwotCQkJCVVSSSBsaWJVcmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShsaWJSZXMpOwotCQkJCVVSSSByZWxVcmkgPSB1cmkuZGVyZXNvbHZlKGxpYlVyaSk7Ci0JCQkJcmVsUGx1Z2luUGF0aCA9IHJlbFVyaS50cmltU2VnbWVudHMoMSkudG9GaWxlU3RyaW5nKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyB0aGUgbGlicmFyeSBpcyBub3Qgc2F2ZWQgeWV0Ci0JCQlyZWxQbHVnaW5QYXRoID0gcGx1Z2luLmdldE5hbWUoKTsKLQkJfQotCi0JCXJldHVybiAoZm9sZGVyUGF0aC5sZW5ndGgoKSA9PSAwID8gcmVsUGx1Z2luUGF0aCArIEZpbGUuc2VwYXJhdG9yOiBuZXcgU3RyaW5nQnVmZmVyKAotCQkJCXJlbFBsdWdpblBhdGgpLmFwcGVuZChGaWxlLnNlcGFyYXRvckNoYXIpLmFwcGVuZChmb2xkZXJQYXRoKQotCQkJCS5hcHBlbmQoRmlsZS5zZXBhcmF0b3JDaGFyKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCUVDbGFzcyBlQ2xzID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVtcGxhdGUoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKGVDbHMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGp1c3RzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIHNhdmUgYWxsIHRoZSByZXNvdXJjZXMKLQkgKiB0aGF0IGhhdmUgYmVlbiBjaGFuZ2VkIGFzIHRoZSByZXN1bHQgb2YgdGhpcyBhZGp1c3RtZW50Ci0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgYWRqdXN0TG9jYXRpb24oUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJTXVsdGlGaWxlU2F2ZVV0aWwuYWRqdXN0TG9jYXRpb24ocmVzb3VyY2UsIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQotCQkvLyBzYXZlIHRoZSBtb2RpZmllZCByZXNvdXJjZXMKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2UKLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQl0cnkgewotCQkJCXJlc291cmNlU2V0LnNhdmUoKFJlc291cmNlKSBpdGVyLm5leHQoKSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2UKLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJcmVzb3VyY2VTZXQuc2F2ZShyZXNvdXJjZSwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlRmlsZXMoTWV0aG9kRWxlbWVudCBlLCBTdHJpbmcgcGF0aCwKLQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7Ci0JCWlmIChuZXcgRmlsZShwYXRoKS5pc0RpcmVjdG9yeSgpICYmICFlLmVJc1Byb3h5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlU2V0LmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXMpOwotCQkJCWlmIChtZSAhPSBudWxsICYmIFVtYVV0aWwuaXNDb250YWluZWRCeShtZSwgZSkpIHsKLQkJCQkJcmVzLnVubG9hZCgpOwotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXRyeSB7Ci0JCQlGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmRlbGV0ZVJlc291cmNlKHBhdGgsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGV4KTsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlKE1ldGhvZEVsZW1lbnQgZSwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCWlmICghVW1hVXRpbC5oYXNEaXJlY3RSZXNvdXJjZShlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZQotCQkJCS5lUmVzb3VyY2UoKTsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2UKLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQotCQkvLyBEb24ndCBkZWxldGUgdGhpcyByZXNvdXJjZSdzIGZpbGUgaWYgaXQgc3RpbGwgY29udGFpbnMgb3RoZXIKLQkJLy8gTWV0aG9kRWxlbWVudAotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBlbGVtZW50ICE9IGUpIHsKLQkJCQlyZXNvdXJjZVNldC5yZW1vdmVVUklNYXBwaW5ncyhlLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5yZW1vdmUoZSk7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgcGF0aDsKLQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLmhhc093bkZvbGRlcihlKSkgewotCQkJLy8gcGF0aCBpcyB0aGUgZGlyZWN0b3J5IG9mIHRoZSBNZXRob2RQbHVnaW4vUHJvY2Vzc0NvbXBvbmVudAotCQkJLy8KLQkJCXBhdGggPSBuZXcgRmlsZShyZXNvdXJjZS5nZXRGaW5hbFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKTsKLQotCQkJLy8gdW5sb2FkL3JlbW92ZSBhbGwgcmVzb3VyY2VzIHVuZGVyIHRoZSBmb2xkZXIKLQkJCS8vCi0JCQlDb2xsZWN0aW9uIHVubG9hZGVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZG8gewotCQkJCXVubG9hZGVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCQkJLy8gY29sbGVjdCBhbGwgcmVzb3VyY2VzIHdob3NlIHJvb3QgZWxlbWVudCBpcyBjb250YWluZWQgYnkgdGhlCi0JCQkJLy8gZ2l2ZW4gZWxlbWVudAotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKSkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKHJlcy5pc0xvYWRlZCgpKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IG1lID0gUGVyc2lzdGVuY2VVdGlsCi0JCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KHJlcyk7Ci0JCQkJCQlpZiAobWUgIT0gbnVsbCAmJiBVbWFVdGlsLmlzQ29udGFpbmVkQnkobWUsIGUpKSB7Ci0JCQkJCQkJdW5sb2FkZWRSZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdW5sb2FkZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJcmVzLnVubG9hZCgpOwotCQkJCX0KLQkJCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5yZW1vdmVBbGwodW5sb2FkZWRSZXNvdXJjZXMpOwotCQkJfSB3aGlsZSAoIXVubG9hZGVkUmVzb3VyY2VzLmlzRW1wdHkoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwYXRoID0gcmVzb3VyY2UuZ2V0RmluYWxVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlyZXNvdXJjZVNldC5jbGVhblVwKHJlc291cmNlLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlMSk7Ci0JCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCWRlbGV0ZUZpbGVzKGUsIHBhdGgsIHJlc291cmNlU2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBvYmplY3RzV2l0aERpcmVjdFJlc291cmNlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0T2JqZWN0c1dpdGhEaXJlY3RSZXNvdXJjZXMoRU9iamVjdCBlLAotCQkJQ29sbGVjdGlvbiBvYmplY3RzV2l0aERpcmVjdFJlc291cmNlcykgewotCQlpZiAoVW1hVXRpbC5oYXNEaXJlY3RSZXNvdXJjZShlKSkgewotCQkJb2JqZWN0c1dpdGhEaXJlY3RSZXNvdXJjZXMuYWRkKGUpOwotCQl9IGVsc2UgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZS5lQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlnZXRPYmplY3RzV2l0aERpcmVjdFJlc291cmNlcygoRU9iamVjdCkgaXRlci5uZXh0KCksCi0JCQkJCQlvYmplY3RzV2l0aERpcmVjdFJlc291cmNlcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNkZWxldGUob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZShNZXRob2RFbGVtZW50IGUpIHsKLQkJLy8gY29sbGVjdCBhbGwgZWxlbWVudHMgd2l0aCBkaXJlY3QgcmVzb3VyY2VzIHRoYXQgYXJlIHRoZSBnaXZlbiBlbGVtZW50Ci0JCS8vIG9yIGl0cyBvZmZzdHJpbmcKLQkJQXJyYXlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRPYmplY3RzV2l0aERpcmVjdFJlc291cmNlcyhlLCBlbGVtZW50cyk7Ci0JCWRlbGV0ZUFuZFNhdmUoZWxlbWVudHMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZWxldGVBbmRTYXZlKEFycmF5TGlzdCBlbGVtZW50cykgewotCQlpZiAoIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWRlbGV0ZSgoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCksIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCX0KLQotCQkJLy8gc2F2ZSBtb2RpZmllZCByZXNvdXJjZXMKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2RpZmllZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJc2F2ZShyZXNvdXJjZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBmb2xkZXIgdGhhdCBjYW4gc3RvcmUgdGhlIGNvbnRlbnQgb2YgdGhlCi0JICogZ2l2ZW4gTWV0aG9kRWxlbWVudC4gVGhlIHBhdGggaXMgcmVsYXRpdmUgdG8gaXRzIHBsdWdpbiBmb2xkZXIgb3IgbGlicmFyeQotCSAqIGZvbGRlciBpZiB0aGUgZWxlbWVudCBjYW5ub3QgYmUgc3RvcmVkIGluIGEgcGx1Z2luLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzdGF0aWNHZXRGb2xkZXJSZWxhdGl2ZVBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCXJldHVybiBzdGF0aWNHZXRGb2xkZXJQYXRoKGUuZUNsYXNzKCkpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuTUVUSE9EX0NPTkZJR1VSQVRJT05fRk9MREVSX05BTUU7Ci0JCX0KLQotCQlNZXRob2RVbml0IHVuaXQgPSBVbWFVdGlsLmdldE1ldGhvZFVuaXQoZSk7Ci0KLQkJaWYgKHVuaXQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIHVuaXQpLmdldFByb2Nlc3MoKTsKLQkJCWlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuQ0FQQUJJTElUWV9QQVRURVJOX1BBVEg7Ci0JCQl9IGVsc2UgaWYgKHByb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuREVMSVZFUllfUFJPQ0VTU19QQVRIOwotCQkJfQotCQl9IGVsc2UgaWYgKHVuaXQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCXJldHVybiBzdGF0aWNHZXRGb2xkZXJSZWxhdGl2ZVBhdGgoKE1ldGhvZEVsZW1lbnQpIHVuaXQKLQkJCQkJLmVDb250YWluZXIoKSk7Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZvbGRlclJlbGF0aXZlUGF0aChNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIHN0YXRpY0dldEZvbGRlclJlbGF0aXZlUGF0aChlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNnZXRXYXJuaW5ncygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0V2FybmluZ3MoKSB7Ci0JCWlmICh3YXJuaW5ncyA9PSBudWxsKSB7Ci0JCQl3YXJuaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gd2FybmluZ3M7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIEZhaWxTYWZlUGVyc2lzdGVyIGV4dGVuZHMgTWV0aG9kTGlicmFyeVBlcnNpc3RlciBpbXBsZW1lbnRzCi0JCQlGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgewotCi0JCXByaXZhdGUgTWFwIHNhdmVPcHRpb25zOwotCi0JCXByaXZhdGUgVHhSZWNvcmQgdHhSZWNvcmQgPSBuZXcgVHhSZWNvcmQoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5UeFJlY29yZCNjbGVhcigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkJCWlmICh3YXJuaW5ncyAhPSBudWxsICYmICF3YXJuaW5ncy5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gY29weSB0aGUgd2FybmluZyB0byBwZXJzaXN0ZXIKLQkJCQkJLy8KLQkJCQkJRmFpbFNhZmVQZXJzaXN0ZXIudGhpcy53YXJuaW5ncyA9IENvbGxlY3Rpb25zCi0JCQkJCQkJLnVubW9kaWZpYWJsZUxpc3Qod2FybmluZ3MpOwotCQkJCX0KLQkJCQlzdXBlci5jbGVhcigpOwotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgTWFwIGVsZW1lbnRUb0luZm9NYXBUb0RlbGV0ZUZpbGVzOwotCi0JCXB1YmxpYyBGYWlsU2FmZVBlcnNpc3RlcigpIHsKLQkJCXNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXAoCi0JCQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5ERUZBVUxUX1NBVkVfT1BUSU9OUyk7Ci0JCQl0eFJlY29yZCA9IG5ldyBUeFJlY29yZCgpOwotCQkJc2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlRYX1JFQ09SRCwgdHhSZWNvcmQpOwotCQkJZWxlbWVudFRvSW5mb01hcFRvRGVsZXRlRmlsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlciNnZXRXYXJuaW5ncygpCi0JCSAqLwotCQlwdWJsaWMgTGlzdCBnZXRXYXJuaW5ncygpIHsKLQkJCWlmICh0eFJlY29yZC5nZXRUeElEKCkgPT0gbnVsbCkgewotCQkJCXJldHVybiBzdXBlci5nZXRXYXJuaW5ncygpOwotCQkJfQotCQkJcmV0dXJuIHR4UmVjb3JkLmdldFdhcm5pbmdzKCk7Ci0JCX0KLQotCQlwdWJsaWMgTWFwIGdldFNhdmVPcHRpb25zKCkgewotCQkJcmV0dXJuIHNhdmVPcHRpb25zOwotCQl9Ci0KLQkJdm9pZCBjaGVja01vdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCS8vIGRpc2FsbG93IG5ldyBvcGVyYXRpb24gb24gcmVzb3VyY2Ugd2hpY2ggaGFzIHN0YXJ0ZWQgb3BlcmF0aW9uCi0JCQkvLyB0aGF0IGlzIG5vdCBjb21taXR0ZWQKLQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCBtZlJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2U7Ci0JCQlpZiAobWZSZXNvdXJjZS50eFN0YXJ0ZWQoKSkgewotCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihOTFMuYmluZCgKLQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLm1vdmVSZXNvdXJjZUVycm9yX21zZywgcmVzb3VyY2UpKTsKLQkJCX0JCQkKLQkJfQkJCQkKLQkJCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlciNzYXZlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNhdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb24gewotCQkJaWYocmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCAmJgotCQkJCQlyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHJlc291cmNlCi0JCQkJLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJaWYgKHJlc291cmNlU2V0ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIHVwZGF0ZSB2ZXJzaW9uIGluZm8gaW4gbGlicmFyeSByZXNvdXJjZSBpZiBuZWVkZWQKLQkJCQkvLwotCQkJCVJlc291cmNlIGxpYlJlc291cmNlVG9TYXZlID0gbnVsbDsKLQkJCQlNZXRob2RFbGVtZW50IG1lID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJCWlmKG1lICE9IG51bGwpIHsKLQkJCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkobWUpOwotCQkJCQlpZihsaWIgIT0gbnVsbCkgewotCQkJCQkJUmVzb3VyY2UgbGliUmVzb3VyY2UgPSBsaWIuZVJlc291cmNlKCk7Ci0JCQkJCQlpZihsaWJSZXNvdXJjZSAhPSBudWxsIAotCQkJCQkJCQkmJiBsaWJSZXNvdXJjZSAhPSByZXNvdXJjZQotCQkJCQkJCQkmJiBQZXJzaXN0ZW5jZVV0aWwuY2hlY2tUb29sVmVyc2lvbihsaWJSZXNvdXJjZSkgIT0gMCkgewotCQkJCQkJCWxpYlJlc291cmNlVG9TYXZlID0gbGliUmVzb3VyY2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoTXVsdGlGaWxlWE1JU2F2ZUltcGwuY2hlY2tNb2RpZnlSZXF1aXJlZChzYXZlT3B0aW9ucykpIHsKLQkJCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzOwotCQkJCQlpZihsaWJSZXNvdXJjZVRvU2F2ZSAhPSBudWxsKSB7Ci0JCQkJCQlyZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCQkJCQkJcmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQlyZXNvdXJjZXMuYWRkKGxpYlJlc291cmNlVG9TYXZlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlc291cmNlcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLmNoZWNrTW9kaWZ5KHJlc291cmNlcyk7Ci0JCQkJCQotCQkJCQkvLyBjaGVjayBvdXQtb2Ytc3luYwotCQkJCQkvLwotCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja091dE9mU3luY2gocmVzb3VyY2VzLCBzYXZlT3B0aW9ucyk7Ci0JCQkJCQotCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja0ZpbGVQYXRoTGVuZ3RoKHJlc291cmNlcyk7Ci0JCQkJfQotCi0JCQkJcmVzb3VyY2VTZXQuc2F2ZShyZXNvdXJjZSwgc2F2ZU9wdGlvbnMpOwotCQkJCWlmKGxpYlJlc291cmNlVG9TYXZlICE9IG51bGwpIHsKLQkJCQkJcmVzb3VyY2VTZXQuc2F2ZShsaWJSZXNvdXJjZVRvU2F2ZSwgc2F2ZU9wdGlvbnMpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmFpbFNhZmVTYXZhYmxlKSB7Ci0JCQkJSUZhaWxTYWZlU2F2YWJsZSBmYWlsU2FmZVNhdmFibGUgPSAoSUZhaWxTYWZlU2F2YWJsZSkgcmVzb3VyY2U7Ci0JCQkJZmFpbFNhZmVTYXZhYmxlLnNldFR4SUQodHhSZWNvcmQuZ2V0VHhJRCgpKTsKLQkJCQlyZXNvdXJjZS5zYXZlKHNhdmVPcHRpb25zKTsKLQkJCQl0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbigiUmVzb3VyY2UgbXVzdCBpbXBsZW1lbnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuaW50ZXJuYWwuSUZhaWxTYWZlU2F2YWJsZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnBlcnNpc3RlbmNlLk1ldGhvZExpYnJhcnlQZXJzaXN0ZXIjYWRqdXN0TG9jYXRpb24ob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRqdXN0TG9jYXRpb24oUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCWNoZWNrTW92ZShyZXNvdXJjZSk7Ci0JCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLnByZXBhcmVBZGp1c3RMb2NhdGlvbigKLQkJCQkJKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UsIG1vZGlmaWVkUmVzb3VyY2VzKSkgewotCQkJCXR4UmVjb3JkLmdldFJlc291cmNlc1RvQ29tbWl0KCkuYWRkKHJlc291cmNlKTsKLQkJCQkKLQkJCQlIYXNoU2V0IHJlc291cmNlc1RvQ2hlY2sgPSBuZXcgSGFzaFNldChtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJcmVzb3VyY2VzVG9DaGVjay5hZGRBbGwocmVzb3VyY2VzVG9DaGVjayk7Ci0JCQkJTXVsdGlGaWxlU2F2ZVV0aWwuY2hlY2tNb2RpZnkocmVzb3VyY2VzVG9DaGVjayk7Ci0JCQkJCi0JCQkJaWYgKCFtb2RpZmllZFJlc291cmNlcy5pc0VtcHR5KCkpIHsJCQotCQkJCQkKLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuY2hlY2tPdXRPZlN5bmNoKG1vZGlmaWVkUmVzb3VyY2VzLCBzYXZlT3B0aW9ucyk7Ci0KLQkJCQkJLy8gc2F2ZSB0aGUgbW9kaWZpZWQgcmVzb3VyY2VzCi0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzYXZlKChSZXNvdXJjZSkgaXRlci5uZXh0KCkpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljb21taXQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkanVzdExvY2F0aW9uKENvbGxlY3Rpb24gcmVzb3VyY2VzKSB7Ci0JCQlpZiAocmVzb3VyY2VzID09IG51bGwgfHwgcmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWNoZWNrTW92ZSgoUmVzb3VyY2UpIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQotCQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJCUhhc2hTZXQgcmVzb3VyY2VzVG9DaGVjayA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgaXRlcgotCQkJCQkJLm5leHQoKTsKLQkJCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwucHJlcGFyZUFkanVzdExvY2F0aW9uKAotCQkJCQkJKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UsIG1vZGlmaWVkUmVzb3VyY2VzKSkgewotCQkJCQl0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpLmFkZChyZXNvdXJjZSk7Ci0JCQkJCXJlc291cmNlc1RvQ2hlY2suYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJlc291cmNlc1RvQ2hlY2suYWRkQWxsKG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCWlmKCFyZXNvdXJjZXNUb0NoZWNrLmlzRW1wdHkoKSkgewotCQkJCU11bHRpRmlsZVNhdmVVdGlsLmNoZWNrTW9kaWZ5KHJlc291cmNlc1RvQ2hlY2spOwotCQkJfQkJCQotCQkJaWYgKCFtb2RpZmllZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja091dE9mU3luY2gobW9kaWZpZWRSZXNvdXJjZXMsIHNhdmVPcHRpb25zKTsKLQotCQkJCS8vIHNhdmUgdGhlIG1vZGlmaWVkIHJlc291cmNlcwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzYXZlKChSZXNvdXJjZSkgaXRlci5uZXh0KCkpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY29tbWl0KCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnBlcnNpc3RlbmNlLk1ldGhvZExpYnJhcnlQZXJzaXN0ZXIjZGVsZXRlRmlsZXMob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50LAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCkKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUZpbGVzKE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIHBhdGgsCi0JCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJCS8vIGtlZXAgdGhlIGluZm8gdG8gcmVhbGx5IGRlbGV0ZSB0aGUgZmlsZXMgaW4gY29tbWl0KCkKLQkJCWVsZW1lbnRUb0luZm9NYXBUb0RlbGV0ZUZpbGVzLnB1dChlLCBuZXcgT2JqZWN0W10geyBwYXRoLAotCQkJCQlyZXNvdXJjZVNldCB9KTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBzdXBlckRlbGV0ZUZpbGVzKE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIHBhdGgsCi0JCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJCXN1cGVyLmRlbGV0ZUZpbGVzKGUsIHBhdGgsIHJlc291cmNlU2V0KTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIjY29tbWl0KCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGNvbW1pdCgpIHsKLQkJCS8vIHNhdmUgaXMgZG9uZQotCQkJLy8gY2FsbCBzYXZlSXNEb25lKCkgb24gZXZlcnkgc2F2ZWQgZmlsZSB0byByZW5hbWUgaXQgdG8gdGhlIGNvcnJlY3QKLQkJCS8vIG5hbWUKLQkJCWludCBzaXplID0gdHhSZWNvcmQuZ2V0UmVzb3VyY2VzVG9Db21taXQoKS5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCSgoSUZhaWxTYWZlU2F2YWJsZSkgdHhSZWNvcmQuZ2V0UmVzb3VyY2VzVG9Db21taXQoKQotCQkJCQkJLmdldChpKSkuY29tbWl0KCk7Ci0JCQl9Ci0KLQkJCS8vIG5vdGlmeSBhbGwgY29tbWl0ZWQgcmVzb3VyY2VzIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGlzIGRvbmUKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJKChJRmFpbFNhZmVTYXZhYmxlKSB0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpCi0JCQkJCQkuZ2V0KGkpKS50eEZpbmlzaGVkKHRydWUpOwotCQkJfQotCi0JCQkvLyBkZWxldGUgYmFja3VwCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCSgoSUZhaWxTYWZlU2F2YWJsZSkgdHhSZWNvcmQuZ2V0UmVzb3VyY2VzVG9Db21taXQoKQotCQkJCQkJLmdldChpKSkuZGVsZXRlQmFja3VwKCk7Ci0JCQl9Ci0KLQkJCXR4UmVjb3JkLmNsZWFyKCk7Ci0KLQkJCS8vIGRlbGV0ZSBmaWxlcyBvZiBkZWxldGVkIGVsZW1lbnRzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudFRvSW5mb01hcFRvRGVsZXRlRmlsZXMuZW50cnlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0W10gaW5mbyA9IChPYmplY3RbXSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGluZm9bMF07Ci0JCQkJdHJ5IHsKLQkJCQkJc3VwZXJEZWxldGVGaWxlcygoTWV0aG9kRWxlbWVudCkgZW50cnkuZ2V0S2V5KCksIHBhdGgsCi0JCQkJCQkJKFJlc291cmNlU2V0KSBpbmZvWzFdKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIFdyYXBwZWRFeGNlcHRpb24pIHsKLQkJCQkJCWUgPSAoKFdyYXBwZWRFeGNlcHRpb24pIGUpLmV4Y2VwdGlvbigpOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBtc2cgPSBQZXJzaXN0ZW5jZVJlc291cmNlcy5FcnJNc2dfQ291bGROb3REZWxldGU7Ci0JCQkJCVN0cmluZyBvdGhlck1zZyA9IG51bGw7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSAoKENvcmVFeGNlcHRpb24pIGUpLmdldFN0YXR1cygpOwotCQkJCQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQkJCQkJb3RoZXJNc2cgPSBVbWFVdGlsLmdldE1lc3NhZ2Uoc3RhdHVzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAob3RoZXJNc2cgPT0gbnVsbCkgewotCQkJCQkJb3RoZXJNc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCW1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1zZywgbmV3IE9iamVjdFtdIHsgcGF0aCwKLQkJCQkJCQlvdGhlck1zZyB9KTsKLQkJCQkJZSA9IG5ldyBFeGNlcHRpb24obXNnLCBlKTsKLQkJCQkJZ2V0V2FybmluZ3MoKS5hZGQoZSk7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsZW1lbnRUb0luZm9NYXBUb0RlbGV0ZUZpbGVzLmNsZWFyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyI3JvbGxiYWNrKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJvbGxiYWNrKCkgewotCQkJaWYgKCF0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpLmlzRW1wdHkoKSkgewotCQkJCXRyeSB7Ci0JCQkJCWludCBtYXggPSB0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpLnNpemUoKSAtIDE7Ci0JCQkJCUFycmF5TGlzdCByZXN0b3JlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJCQkvLyBTb21ldGhpbmcgd2VudCB3cm9uZywgcmVzdG9yZSBmcm9tIGJhY2t1cAotCQkJCQlmb3IgKGludCBpID0gbWF4OyBpID4gLTE7IGktLSkgewotCQkJCQkJSUZhaWxTYWZlU2F2YWJsZSByZXNvdXJjZSA9IChJRmFpbFNhZmVTYXZhYmxlKSB0eFJlY29yZAotCQkJCQkJCQkuZ2V0UmVzb3VyY2VzVG9Db21taXQoKS5nZXQoaSk7Ci0JCQkJCQlpZiAocmVzb3VyY2UucmVzdG9yZSgpKSB7Ci0JCQkJCQkJcmVzdG9yZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc3RvcmVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIKLQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCXJlc291cmNlLnNldE1vZGlmaWVkKHRydWUpOwotCQkJCQl9Ci0KLQkJCQkJLy8gZGVsZXRlIHRlbXAgZmlsZXMKLQkJCQkJZm9yIChpbnQgaSA9IG1heDsgaSA+IC0xOyBpLS0pIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSB0eFJlY29yZAotCQkJCQkJCQkuZ2V0UmVzb3VyY2VzVG9Db21taXQoKS5nZXQoaSk7Ci0JCQkJCQlpZiAoKChJRmFpbFNhZmVTYXZhYmxlKXJlc291cmNlKS5oYXNUZW1wVVJJKCkpIHsKLQkJCQkJCQkvLyB1cmkga2VlcHMgdGhlIHBhdGggdG8gdGVtcCBmaWxlCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbmV3IEZpbGUocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpCi0JCQkJCQkJCQkJLmRlbGV0ZSgpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIG5vdGlmeSBhbGwgY29tbWl0ZWQgcmVzb3VyY2VzIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGlzCi0JCQkJCS8vIGRvbmUKLQkJCQkJZm9yIChpbnQgaSA9IG1heDsgaSA+IC0xOyBpLS0pIHsKLQkJCQkJCSgoSUZhaWxTYWZlU2F2YWJsZSkgdHhSZWNvcmQKLQkJCQkJCQkJLmdldFJlc291cmNlc1RvQ29tbWl0KCkuZ2V0KGkpKQotCQkJCQkJCQkudHhGaW5pc2hlZChmYWxzZSk7Ci0JCQkJCX0KLQotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0JCQl9Ci0JCQl0eFJlY29yZC5jbGVhcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyI2dldEZhaWxTYWZlUGVyc2lzdGVyKCkKLQkJICovCi0JCXB1YmxpYyBGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIjZ2V0Q3VycmVudFR4SUQoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDdXJyZW50VHhJRCgpIHsKLQkJCXJldHVybiB0eFJlY29yZC5nZXRUeElEKCk7Ci0JCX0KLQotCX0KLQotCUZhaWxTYWZlUGVyc2lzdGVyIGdldEZhaWxTYWZlUGVyc2lzdGVyKE1hcCBvcHRpb25zKSB7Ci0JCUZhaWxTYWZlUGVyc2lzdGVyIHBlcnNpc3RlciA9IG5ldyBGYWlsU2FmZVBlcnNpc3RlcigpOwotCQlwZXJzaXN0ZXIuc2F2ZU9wdGlvbnMucHV0QWxsKG9wdGlvbnMpOwotCi0JCS8vIG1ha2Ugc3VyZSB0aGF0IFRYX1JFQ09SRCBzdGlsbCBrZWVwcyB0aGUgY29ycmVjdCB2YWx1ZQotCQlwZXJzaXN0ZXIuc2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlRYX1JFQ09SRCwKLQkJCQlwZXJzaXN0ZXIudHhSZWNvcmQpOwotCi0JCXJldHVybiBwZXJzaXN0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjaGFzT3duRm9sZGVyKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duRm9sZGVyKE9iamVjdCBlKSB7Ci0JCXJldHVybiBNdWx0aUZpbGVTYXZlVXRpbC5oYXNPd25Gb2xkZXIoZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjaGFzT3duUmVzb3VyY2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNPd25SZXNvdXJjZShPYmplY3QgZSkgewotCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuaGFzT3duUmVzb3VyY2UoZSwKLQkJCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuREVGQVVMVF9TQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VUKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNnZXRGYWlsU2FmZVBlcnNpc3RlcigpCi0JICovCi0JcHVibGljIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBnZXRGYWlsU2FmZVBlcnNpc3RlcigpIHsKLQkJcmV0dXJuIG5ldyBGYWlsU2FmZVBlcnNpc3RlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTm9uRmFpbFNhZmVQZXJzaXN0ZXIgZXh0ZW5kcyBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyCi0JCQlpbXBsZW1lbnRzIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciB7Ci0JCXByaXZhdGUgTWFwIHNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyI2NvbW1pdCgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjb21taXQoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyI3JvbGxiYWNrKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJvbGxiYWNrKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciNnZXRDdXJyZW50VHhJRCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRUeElEKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyI2FkanVzdExvY2F0aW9uKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRqdXN0TG9jYXRpb24oQ29sbGVjdGlvbiByZXNvdXJjZXMpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlhZGp1c3RMb2NhdGlvbigoUmVzb3VyY2UpIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBNYXAgZ2V0U2F2ZU9wdGlvbnMoKSB7Ci0JCQlyZXR1cm4gc2F2ZU9wdGlvbnM7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBub25GYWlsU2FmZVBlcnNpc3RlciA9IG5ldyBOb25GYWlsU2FmZVBlcnNpc3RlcigpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjZ2V0RmlsZUV4dGVuc2lvbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbihPYmplY3QgZSkgewotCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjc2F2ZShvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlpZighaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoZWxlbWVudCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZWxlbWVudCkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJTWFwIG9wdGlvbnMgPSByZXNvdXJjZVNldC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsgCi0JCVJlc291cmNlIHJlcyA9ICgoSW50ZXJuYWxFT2JqZWN0KWVsZW1lbnQpLmVEaXJlY3RSZXNvdXJjZSgpOwotCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2U7Ci0JCWlmKHJlcyBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXM7Ci0JCQlyZXNvdXJjZVNldC5zYXZlKHJlc291cmNlLCBvcHRpb25zKTsKLQkJfQotCQllbHNlIHsKLQkJCVVSSSB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5jcmVhdGVVUkkoZWxlbWVudCwgcmVzb3VyY2VTZXQpOwotCQkJcmVzb3VyY2UgPSBNdWx0aUZpbGVTYXZlVXRpbC5zYXZlKHJlc291cmNlU2V0LCBlbGVtZW50LCB1cmksIG9wdGlvbnMsIGZhbHNlKTsKLQkJfQotCQlyZXNvdXJjZS51cGRhdGVUaW1lU3RhbXBzKCk7Ci0JCQotCQlTdHJpbmcgc3RyID0gKFN0cmluZykgb3B0aW9ucy5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuUkVGUkVTSF9ORVdfUkVTT1VSQ0UpOwotCQlpZiAoc3RyICE9IG51bGwgJiYgQm9vbGVhbi52YWx1ZU9mKHN0cikuYm9vbGVhblZhbHVlKCkpIHsKLQkJCS8vIG5vdGlmeSBSZWZyZXNoSm9iIHRoZSB0aGlzIHJlc291cmNlIGlzIHNhdmVkIHNvIGl0IHdpbGwgbm90IGJlCi0JCQkvLyByZWxvYWRlZCBhZnRlciByZWZyZXNoaW5nIGl0Ci0JCQkvLwotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc291cmNlU2F2ZWQocmVzb3VyY2UpOwotCi0JCQkvLyByZWZyZXNoIHRoZSBuZXdseSBjcmVhdGVkIHJlc291cmNlIHNvIGl0IGlzIGluIHN5bmNoIHdpdGggdGhlCi0JCQkvLyB3b3Jrc3BhY2UKLQkJCS8vCi0JCQlGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlZnJlc2gocmVzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyI2hhc093blJlc291cmNlV2l0aG91dFJlZmVycmVyKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoT2JqZWN0IGUpIHsKLQkJcmV0dXJuIGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uOwotCX0KLQotCXB1YmxpYyBGaWxlIGNyZWF0ZU1ldGhvZFBsdWdpbkZvbGRlcihTdHJpbmcgcGx1Z2luTmFtZSwgTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCUZpbGUgbGliRGlyID0gbmV3IEZpbGUobGlicmFyeS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50RmlsZSgpOwotCQlGaWxlIHBsdWdpbkRpciA9IG5ldyBGaWxlKGxpYkRpciwgcGx1Z2luTmFtZSk7Ci0JCWlmKCFwbHVnaW5EaXIuZXhpc3RzKCkpIHsKLQkJCWlmKCFwbHVnaW5EaXIubWtkaXJzKCkpIHsKLQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oTkxTLmJpbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMuY2Fubm90X2NyZWF0ZV9kaXJfbXNnLCBwbHVnaW5EaXIpKTsJCQkJCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBsdWdpbkRpcjsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJRmlsZSBsaWJEaXIgPSBuZXcgRmlsZShsaWJyYXJ5LmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCUZpbGUgY29uZmlnRGlyID0gbmV3IEZpbGUobGliRGlyLCBNdWx0aUZpbGVTYXZlVXRpbC5NRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSk7Ci0JCWlmKCFjb25maWdEaXIuZXhpc3RzKCkpIHsKLQkJCWlmKCFjb25maWdEaXIubWtkaXJzKCkpIHsKLQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oTkxTLmJpbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMuY2Fubm90X2NyZWF0ZV9kaXJfbXNnLCBjb25maWdEaXIpKTsJCQkJCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbmZpZ0RpcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihNZXRob2RMaWJyYXJ5IGxpYnJhcnksIEZpbGUgZmlsZSkgewotCQkvLyBub3QgYWxsb3dlZAotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29udGFpbmVkQnkoUmVzb3VyY2UgcmVzb3VyY2UsIFJlc291cmNlIGNvbnRhaW5lclJlc291cmNlKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KGNvbnRhaW5lclJlc291cmNlKTsKLQkJaWYoaGFzT3duRm9sZGVyKGUpKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IEZpbGVNYW5hZ2VyLnRvRmlsZVN0cmluZyhyZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCQlTdHJpbmcgY29udGFpbmVyUGF0aCA9IEZpbGVNYW5hZ2VyLnRvRmlsZVN0cmluZyhjb250YWluZXJSZXNvdXJjZS5nZXRVUkkoKSk7CQkKLQkJCWlmKHBhdGggPT0gbnVsbCB8fCBjb250YWluZXJQYXRoID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IFBhdGgoY29udGFpbmVyUGF0aCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmlzUHJlZml4T2YobmV3IFBhdGgocGF0aCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlRm9sZGVyUGF0aChNZXRob2RFbGVtZW50IGUpIHsKLQkJU3RyaW5nIGZvbGRlclBhdGggPSBnZXRGb2xkZXJBYnNvbHV0ZVBhdGgoZSk7Ci0JCXJldHVybiBmb2xkZXJQYXRoICE9IG51bGwgPyBuZXcgRmlsZShmb2xkZXJQYXRoLCBSRVNPVVJDRV9GT0xERVIpLmdldEFic29sdXRlUGF0aCgpIDogUkVTT1VSQ0VfRk9MREVSOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9sZGVyQWJzb2x1dGVQYXRoKE1ldGhvZEVsZW1lbnQgZSkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZSk7Ci0JCUZpbGUgbGliRGlyID0gbmV3IEZpbGUoTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0RmluYWxVUkkobGlicmFyeS5lUmVzb3VyY2UoKSkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudEZpbGUoKTsKLQkJcmV0dXJuIG5ldyBGaWxlKGxpYkRpciwgZ2V0UmVsYXRpdmVFbGVtZW50UGF0aChlKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlciNkZWxldGUoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlKENvbGxlY3Rpb248TWV0aG9kRWxlbWVudD4gZWxlbXMpIHsKLQkJQXJyYXlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZEVsZW1lbnQ+IGl0ID0gZWxlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJZ2V0T2JqZWN0c1dpdGhEaXJlY3RSZXNvdXJjZXMoaXQubmV4dCgpLCBlbGVtZW50cyk7Ci0JCX0KLQkJZGVsZXRlQW5kU2F2ZShlbGVtZW50cyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVJT0V4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVJT0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2MyNzk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlSU9FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotLyoqCi0gKiBCYXNlIGV4Y2VwdGlvbiBmb3IgZmlsZS1iYXNlZCBwZXJzaXN0ZW5jZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlGaWxlSU9FeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTc4NTMxOTg3MjIzNDczMjFMOwotCi0JcHJpdmF0ZSBPYmplY3QgdHJvdWJsZU9iamVjdDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE11bHRpRmlsZUlPRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE11bHRpRmlsZUlPRXhjZXB0aW9uKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXB1YmxpYyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihTdHJpbmcgbXNnLCBPYmplY3QgdHJvdWJsZU9iaikgewotCQlzdXBlcihtc2cpOwotCQl0cm91YmxlT2JqZWN0ID0gdHJvdWJsZU9iajsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRyb3VibGVPYmplY3QuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRUcm91YmxlT2JqZWN0KCkgewotCQlyZXR1cm4gdHJvdWJsZU9iamVjdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVJlc291cmNlU2V0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWMxZjY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTEluZm9JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxNYXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLkxpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5pbnRlcm5hbC5SZWZyZXNoRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JUHJveHlSZXNvbHV0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JVW1hUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5SZXNvbHZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuRXZlbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5EYXRlRm9ybWF0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgZXh0ZW5kcyBSZXNvdXJjZVNldEltcGwgaW1wbGVtZW50cwotCQlJUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIsIElVbWFSZXNvdXJjZVNldCwgSUxpYnJhcnlSZXNvdXJjZVNldCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX0RFTElWRVJZX1BST0NFU1NfUEFUSCA9IHsgIkRlbGl2ZXJ5UHJvY2Vzc2VzIiB9OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX0NBUEFCSUxJVFlfUEFUVEVSTl9QQVRIID0gewotCQkJIkNvbnRlbnQiLCAiQ2FwYWJpbGl0eVBhdHRlcm5zIiB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfUFJPQ0VTU19DT05UUklCVVRJT05fUEFUSCA9IHsgIlByb2Nlc3NDb250cmlidXRpb25zIiB9OyAvLyROT04tTkxTLTEkCQkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW11bXSBQUk9DRVNTX1BBQ0tBR0VfUEFUSFMgPSB7Ci0JCQlERUZBVUxUX0RFTElWRVJZX1BST0NFU1NfUEFUSCwgREVGQVVMVF9DQVBBQklMSVRZX1BBVFRFUk5fUEFUSCwKLQkJCURFRkFVTFRfUFJPQ0VTU19DT05UUklCVVRJT05fUEFUSCB9OwotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIFJFUE9SVF9FUlJPUiA9IHRydWU7Ci0KLQlzdGF0aWMgZmluYWwgTWFwIERFRkFVTFRfU0FWRV9PUFRJT05TID0gbmV3IEhhc2hNYXAoKTsKLQotCXN0YXRpYyBmaW5hbCBTZXQgREVGQVVMVF9TQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VUID0gbmV3IEhhc2hTZXQoKTsKLQotCXN0YXRpYyB7Ci0JCURFRkFVTFRfU0FWRV9TRVBBUkFURUxZX0NMQVNTX1NFVC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGx1Z2luKCkpOwotCQlERUZBVUxUX1NBVkVfU0VQQVJBVEVMWV9DTEFTU19TRVQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NDb21wb25lbnQoKSk7Ci0JCURFRkFVTFRfU0FWRV9TRVBBUkFURUxZX0NMQVNTX1NFVC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQkvLyBlQ2xhc3Nlcy5hZGQoUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VNYW5hZ2VyKCkpOwotCQlERUZBVUxUX1NBVkVfU0VQQVJBVEVMWV9DTEFTU19TRVQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0KLQkJWE1MUmVzb3VyY2UuWE1MTWFwIHhtbE1hcCA9IGNyZWF0ZVNhdmVYTUxNYXAoKTsKLQotCQlIYXNoU2V0IHNhdmVUb2dldGhlciA9IG5ldyBIYXNoU2V0KCk7Ci0JCXNhdmVUb2dldGhlci5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpOwotCi0JCURFRkFVTFRfU0FWRV9PUFRJT05TLnB1dCgKLQkJCQlNdWx0aUZpbGVYTUlTYXZlSW1wbC5TQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VULAotCQkJCURFRkFVTFRfU0FWRV9TRVBBUkFURUxZX0NMQVNTX1NFVCk7Ci0JCURFRkFVTFRfU0FWRV9PUFRJT05TLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5TQVZFX0FMTCwgImZhbHNlIik7IC8vJE5PTi1OTFMtMSQKLQkJREVGQVVMVF9TQVZFX09QVElPTlMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlNBVkVfVE9HRVRIRVJfQ0xBU1NfU0VULAotCQkJCXNhdmVUb2dldGhlcik7Ci0JCURFRkFVTFRfU0FWRV9PUFRJT05TLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5SRUZSRVNIX05FV19SRVNPVVJDRSwKLQkJCQkidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCURFRkFVTFRfU0FWRV9PUFRJT05TLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5DSEVDS19NT0RJRlksICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJREVGQVVMVF9TQVZFX09QVElPTlMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJREVGQVVMVF9TQVZFX09QVElPTlMucHV0KFhNTFJlc291cmNlLk9QVElPTl9QUk9DRVNTX0RBTkdMSU5HX0hSRUYsCi0JCQkJWE1MUmVzb3VyY2UuT1BUSU9OX1BST0NFU1NfREFOR0xJTkdfSFJFRl9ESVNDQVJEKTsKLQkJREVGQVVMVF9TQVZFX09QVElPTlMucHV0KFhNTFJlc291cmNlLk9QVElPTl9YTUxfTUFQLCB4bWxNYXApOwotCQlERUZBVUxUX1NBVkVfT1BUSU9OUy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0NPTkZJR1VSQVRJT05fQ0FDSEUsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJQXNzb2NpYXRpb25IZWxwZXIuaW5pdCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU01HUl9YTUkgPSAicmVzbWdyLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSGFzaE1hcCBkZWZhdWx0U2F2ZU9wdGlvbnM7Ci0KLQlwcml2YXRlIEhhc2hNYXAgZ3VpZFRvTWV0aG9kRWxlbWVudE1hcDsKLQotCXByaXZhdGUgYm9vbGVhbiBsb2FkaW5nOwotCi0JcHJpdmF0ZSBib29sZWFuIGxvYWRpbmdSZXNvdXJjZU1hbmFnZXJUcmVlOwotCi0JcHJpdmF0ZSBNYXAgVVJJVG9UZW1wVVJJTWFwOwotCi0JcHJpdmF0ZSBVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyIG1hcmtlck1hbmFuZ2VyOwotCi0JcHJpdmF0ZSBVbmlxdWVFTGlzdDxJUmVmcmVzaExpc3RlbmVyPiByZWZyZXNoTGlzdGVuZXJzOwotCi0JcHJvdGVjdGVkIElVUklQcm92aWRlciB1cmlQcm92aWRlcjsKLQotCXByaXZhdGUgUGF0aCBjb25maWdGb2xkZXJQYXRoOwotCi0JcHJpdmF0ZSBQYXRoIGxpYkZvbGRlclBhdGg7Ci0KLQlwcml2YXRlIHN0YXRpYyBYTUxSZXNvdXJjZS5YTUxNYXAgY3JlYXRlTG9hZFhNTE1hcCgpIHsKLQkJWE1MUmVzb3VyY2UuWE1MTWFwIHhtbE1hcCA9IG5ldyBYTUxNYXBJbXBsKCk7Ci0JCVNldCBleGNsdWRlZEF0dHJpYnV0ZXMgPSBuZXcgSGFzaFNldCgpOwotCQlleGNsdWRlZEF0dHJpYnV0ZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfR3VpZCgpKTsKLQkJZXhjbHVkZWRBdHRyaWJ1dGVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFQ2xhc3NpZmllcnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUVDbGFzc2lmaWVyIGVDbGFzc2lmaWVyID0gKEVDbGFzc2lmaWVyKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlQ2xhc3NpZmllciBpbnN0YW5jZW9mIEVDbGFzcykgewotCQkJCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKSBlQ2xhc3NpZmllcjsKLQotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoIWV4Y2x1ZGVkQXR0cmlidXRlcy5jb250YWlucyhhdHRyaWIpKSB7Ci0JCQkJCQlYTUxSZXNvdXJjZS5YTUxJbmZvIHhtbEluZm8gPSBuZXcgWE1MSW5mb0ltcGwoKTsKLQkJCQkJCXhtbEluZm8uc2V0TmFtZShhdHRyaWIuZ2V0TmFtZSgpKTsKLQkJCQkJCXhtbEluZm8KLQkJCQkJCQkJLnNldFhNTFJlcHJlc2VudGF0aW9uKFhNTFJlc291cmNlLlhNTEluZm8uRUxFTUVOVCk7Ci0JCQkJCQl4bWxNYXAuYWRkKGF0dHJpYiwgeG1sSW5mbyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4geG1sTWFwOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2F2ZUF0dHJpYnV0ZUFzRWxlbWVudChFQ2xhc3MgZUNsYXNzLAotCQkJQ29sbGVjdGlvbiBzZWxlY3RlZEVDbGFzc2VzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGVkRUNsYXNzZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFQ2xhc3MgYmFzZSA9IChFQ2xhc3MpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGJhc2UuaXNTdXBlclR5cGVPZihlQ2xhc3MpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFhNTFJlc291cmNlLlhNTE1hcCBjcmVhdGVTYXZlWE1MTWFwKCkgewotCQlYTUxSZXNvdXJjZS5YTUxNYXAgeG1sTWFwID0gbmV3IFhNTE1hcEltcGwoKTsKLQkJU2V0IGV4Y2x1ZGVkQXR0cmlidXRlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWV4Y2x1ZGVkQXR0cmlidXRlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCkpOwotCQlleGNsdWRlZEF0dHJpYnV0ZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCi0JCS8vIHNlbGVjdCBvbmx5IENvbnRlbnREZXNjcmlwdGlvbiBhbmQgU2VjdGlvbgotCQlTZXQgc2VsZWN0ZWRFQ2xhc3NlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXNlbGVjdGVkRUNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJc2VsZWN0ZWRFQ2xhc3Nlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdGlvbigpKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFQ2xhc3NpZmllcnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUVDbGFzc2lmaWVyIGVDbGFzc2lmaWVyID0gKEVDbGFzc2lmaWVyKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlQ2xhc3NpZmllciBpbnN0YW5jZW9mIEVDbGFzcykgewotCQkJCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKSBlQ2xhc3NpZmllcjsKLQotCQkJCWlmIChzYXZlQXR0cmlidXRlQXNFbGVtZW50KGVDbGFzcywgc2VsZWN0ZWRFQ2xhc3NlcykpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVDbGFzcy5nZXRFQXR0cmlidXRlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCUVBdHRyaWJ1dGUgYXR0cmliID0gKEVBdHRyaWJ1dGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmICghZXhjbHVkZWRBdHRyaWJ1dGVzLmNvbnRhaW5zKGF0dHJpYikpIHsKLQkJCQkJCQlYTUxSZXNvdXJjZS5YTUxJbmZvIHhtbEluZm8gPSBuZXcgWE1MSW5mb0ltcGwoKTsKLQkJCQkJCQl4bWxJbmZvLnNldE5hbWUoYXR0cmliLmdldE5hbWUoKSk7Ci0JCQkJCQkJeG1sSW5mbwotCQkJCQkJCQkJLnNldFhNTFJlcHJlc2VudGF0aW9uKFhNTFJlc291cmNlLlhNTEluZm8uRUxFTUVOVCk7Ci0JCQkJCQkJeG1sTWFwLmFkZChhdHRyaWIsIHhtbEluZm8pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHhtbE1hcDsKLQl9Ci0KLQlwdWJsaWMgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKCkgewotCQlzdXBlcigpOwotCQltYXJrZXJNYW5hbmdlciA9IG5ldyBVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoYm9vbGVhbiByZXBvcnRFcnJvcikgewotCQl0aGlzKCk7Ci0JCW1hcmtlck1hbmFuZ2VyLnNldEVuYWJsZWQocmVwb3J0RXJyb3IpOwotCX0KLQotCXB1YmxpYyBVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyIGdldFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIoKSB7Ci0JCXJldHVybiBtYXJrZXJNYW5hbmdlcjsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgSVVSSVByb3ZpZGVyIGdldFVSSVByb3ZpZGVyKCkgewotCQlpZih1cmlQcm92aWRlciA9PSBudWxsKSB7Ci0JCQl1cmlQcm92aWRlciA9IG5ldyBGaWxlUGF0aFByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHVyaVByb3ZpZGVyOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlUmVzb3VyY2VDaGFuZ2UoSVJlc291cmNlIHdzUmVzKSB7Ci0JCVN5c3RlbS5vdXQKLQkJCQkucHJpbnRsbigiTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLmhhbmRsZVJlc291cmNlQ2hhbmdlKCk6ICIgKyB3c1Jlcy50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCi0JCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGdldFJlc291cmNlKAotCQkJCVVSSS5jcmVhdGVGaWxlVVJJKHdzUmVzLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSksIGZhbHNlKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJQXJyYXlMaXN0IHByb3hpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJcmVzb3VyY2UucmVsb2FkKHByb3hpZXMpOwotCi0JCQkJLy8gbm90aWZ5IE1BS0VfUFJPWFkgZXZlbnQgZm9yIGFsbCBwcm94aWVzCi0JCQkJLy8KLQkJCQlOb3RpZmljYXRpb24gbXNnID0gbmV3IE5vdGlmaWNhdGlvbkltcGwoRXZlbnRUeXBlcy5NQUtFX1BST1hZLAotCQkJCQkJZmFsc2UsIHRydWUpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHByb3hpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJby5lTm90aWZ5KG1zZyk7Ci0JCQkJfQotCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIE1hcCBnZXRMb2FkT3B0aW9ucygpIHsKLQkJTWFwIG9wdGlvbnMgPSBzdXBlci5nZXRMb2FkT3B0aW9ucygpOwotCQlvcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRU5DT0RJTkcsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCW9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9YTUxfTUFQLCBjcmVhdGVMb2FkWE1MTWFwKCkpOwotCQlyZXR1cm4gb3B0aW9uczsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldERlZmF1bHRTYXZlT3B0aW9ucygpIHsKLQkJaWYgKGRlZmF1bHRTYXZlT3B0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0U2F2ZU9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJZGVmYXVsdFNhdmVPcHRpb25zLnB1dEFsbChERUZBVUxUX1NBVkVfT1BUSU9OUyk7Ci0JCX0KLQotCQlyZXR1cm4gZGVmYXVsdFNhdmVPcHRpb25zOwotCX0KLQotCXByaXZhdGUgUmVzb3VyY2UgZ2V0TWV0aG9kTGlicmFyeVJlc291cmNlKCkgewotCQlpZiAoZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoUmVzb3VyY2UpIGdldFJlc291cmNlcygpLmdldCgwKTsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRNZXRob2RMaWJyYXJ5KCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldE1ldGhvZExpYnJhcnlSZXNvdXJjZSgpOwotCQlyZXR1cm4gcmVzb3VyY2UgPT0gbnVsbCA/IG51bGwgOiAoTWV0aG9kTGlicmFyeSkgUGVyc2lzdGVuY2VVdGlsCi0JCQkJLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZU1hbmFnZXIgZ2V0Um9vdFJlc291cmNlTWFuYWdlcigpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRNZXRob2RMaWJyYXJ5UmVzb3VyY2UoKTsKLQkJcmV0dXJuIHJlc291cmNlID09IG51bGwgPyBudWxsIDogTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkuZ2V0UmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbCNnZXRVUklDb252ZXJ0ZXIoKQotCSAqLwotCXB1YmxpYyBVUklDb252ZXJ0ZXIgZ2V0VVJJQ29udmVydGVyKCkgewotCQlpZiAodXJpQ29udmVydGVyID09IG51bGwpIHsKLQkJCXVyaUNvbnZlcnRlciA9IG5ldyBNdWx0aUZpbGVVUklDb252ZXJ0ZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHVyaUNvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiBudWxsIGlmIHRoZSByZXNvdXJjZSB3aXRoIHRoZSBnaXZlbiBVUkkgY291bGQgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmkpIHsKLQkJaWYgKGdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlcyA9IHN1cGVyLmdldFJlc291cmNlKHVyaSwgZmFsc2UpOwotCQkJaWYgKHJlcyA9PSBudWxsKSB7Ci0JCQkJTWFwIG1hcCA9IGdldFVSSVJlc291cmNlTWFwKCk7Ci0JCQkJcmVzID0gY3JlYXRlUmVzb3VyY2UodXJpKTsKLQotCQkJCXRyeSB7Ci0JCQkJCWRlbWFuZExvYWRIZWxwZXIocmVzKTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gcmVtb3ZlIHRoZSByZXNvdXJjZSBmcm9tIHJlc291cmNlIHNldCBpZiBpdCBjb3VsZCBub3QgYmUKLQkJCQkJLy8gbG9hZGVkCi0JCQkJCS8vCi0JCQkJCWdldFJlc291cmNlcygpLnJlbW92ZShyZXMpOwotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQotCQkJCWlmIChtYXAgIT0gbnVsbCkgewotCQkJCQltYXAucHV0KHVyaSwgcmVzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZSkgewotCQkJaWYgKGUuZXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBGaWxlTm90Rm91bmRFeGNlcHRpb24pIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXRocm93IGU7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsI2RlbWFuZExvYWQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlbWFuZExvYWQoUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyLmRlbWFuZExvYWQocmVzb3VyY2UpOwotCi0JCS8vIHJlZnJlc2ggd29ya3NwYWNlIHJlc291cmNlIG9mIHRoaXMgcmVzb3VyY2UgdG8gbWFrZSB0aGVtIHN5bmNocm9uaXplZAotCQkvLwotCQlib29sZWFuIHJldCA9IEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVmcmVzaChyZXNvdXJjZSk7Ci0JCWlmKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQlpZighcmV0KSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuZGVtYW5kTG9hZCgpOiBjb3VsZCBub3QgcmVmcmVzaCByZXNvdXJjZSAiICsgcmVzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmVzb2x2ZXMgY29udGFpbmVyIG9mIHRoZSBNZXRob2RFbGVtZW50IGluIHRoZSBnaXZlbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzCi0JICovCi0JcHVibGljIHZvaWQgcmVzb2x2ZUNvbnRhaW5lcihSZXNvdXJjZSByZXMpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmKGxvYWRpbmcgJiYgbGliID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVzLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBlbGVtZW50OwotCQkJCWlmKGUgIT0gbGliICYmIGUuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJLy8gdGhlIG1ldGhvZCBlbGVtZW50IG1pZ2h0IGhhdmUgYmVlbiBsb2FkZWQgYmVmb3JlIGl0cyBjb250YWluZXIgYWNjZXNzZWQgaXQKLQkJCQkJLy8KLQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRSZXNvdXJjZURlc2NyaXB0b3IocmVzKTsKLQkJCQkJaWYocmVzRGVzYyAhPSBudWxsKSB7Ci0JCQkJCQlSZXNvdXJjZSBjb250YWluZXJSZXNvdXJjZSA9IHJlc0Rlc2MuZVJlc291cmNlKCk7Ci0JCQkJCQlpZihjb250YWluZXJSZXNvdXJjZSBpbnN0YW5jZW9mIFhNTFJlc291cmNlSW1wbCkgewotCQkJCQkJCU9iamVjdCBwcm94eSA9ICgoWE1MUmVzb3VyY2VJbXBsKWNvbnRhaW5lclJlc291cmNlKS5nZXRJRFRvRU9iamVjdE1hcCgpLmdldChlLmdldEd1aWQoKSk7Ci0JCQkJCQkJaWYocHJveHkgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQkJCUVPYmplY3QgcHJveHlFT2JqZWN0ID0gKChFT2JqZWN0KXByb3h5KTsgCi0JCQkJCQkJCUVSZWZlcmVuY2UgcmVmID0gcHJveHlFT2JqZWN0LmVDb250YWlubWVudEZlYXR1cmUoKTsKLQkJCQkJCQkJRU9iamVjdCBjb250YWluZXIgPSBwcm94eUVPYmplY3QuZUNvbnRhaW5lcigpOwotCQkJCQkJCQlpZihjb250YWluZXIgIT0gbnVsbCkgewotCQkJCQkJCQkJaWYgKHJlZi5pc01hbnkoKSkgewotCQkJCQkJCQkJCUxpc3QgdmFsdWVzID0gKExpc3QpIGNvbnRhaW5lci5lR2V0KHJlZik7Ci0JCQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdmFsdWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyBpdGVyCi0JCQkJCQkJCQkJLm5leHQoKSkKLQkJCQkJCQkJCQkJOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQljb250YWluZXIuZUdldChyZWYpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJcmVzb2x2ZUNvbnRhaW5lcihjb250YWluZXJSZXNvdXJjZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CQkJCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbCNnZXRSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLAotCSAqICAgICAgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJaWYgKGdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlcyA9IHN1cGVyLmdldFJlc291cmNlKHVyaSwgbG9hZE9uRGVtYW5kKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbXNnID0gbnVsbDsKLQkJCWlmIChlLmdldE1lc3NhZ2UoKSAhPSBudWxsKQotCQkJCW1zZyA9IE5MUy5iaW5kKAotCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZFJlc291cmNlRXJyb3JXaXRoUmVhc29uX21zZywKLQkJCQkJCShuZXcgT2JqZWN0W10geyB1cmksIGUuZ2V0TWVzc2FnZSgpIH0pKTsKLQkJCWVsc2UKLQkJCQltc2cgPSBOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkUmVzb3VyY2VFcnJvcl9tc2csIHVyaSk7Ci0JCQloYW5kbGVFeGNlcHRpb24obXNnKTsKLQkJCXRocm93IGU7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZWZyZXNoTGlzdGVuZXIoSVJlZnJlc2hMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmVmcmVzaExpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQlyZWZyZXNoTGlzdGVuZXJzID0gbmV3IFVuaXF1ZUVMaXN0PElSZWZyZXNoTGlzdGVuZXI+KCk7Ci0JCX0KLQkJcmVmcmVzaExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVJlZnJlc2hMaXN0ZW50ZXIoSVJlZnJlc2hMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmVmcmVzaExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlyZWZyZXNoTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgbm90aWZ5UmVmcmVzaExpc3RlbmVycyhJUmVmcmVzaEV2ZW50IGV2ZW50KSB7Ci0JCWlmKHJlZnJlc2hMaXN0ZW5lcnMgIT0gbnVsbCAmJiAhcmVmcmVzaExpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSVJlZnJlc2hMaXN0ZW5lciBsaXN0ZW5lciA6IHJlZnJlc2hMaXN0ZW5lcnMpIHsKLQkJCQl0cnkgewotCQkJCQlsaXN0ZW5lci5ub3RpZnlSZWZyZXNoZWQoZXZlbnQpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWxvYWRzIHRoZSBnaXZlbiByZXNvdXJjZXMKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzCi0JICogQHJldHVybiByZXNvdXJjZXMgdGhhdCBoYWQgYmVlbiByZWxvYWRlZAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgQ29sbGVjdGlvbiByZWxvYWRSZXNvdXJjZXMoQ29sbGVjdGlvbiByZXNvdXJjZXMpIHsJCQotCQkvLyBzYXZlIHRoZSBSZXNvdXJjZURlc2NyaXB0b3IgZm9yIHRoZSByZXNvdXJjZXMgdG8gY3JlYXRlIFVSSSBmb3IgdGhlaXIKLQkJLy8gcHJveGllcyBhZnRlciB1bmxvYWQKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgaXRlcgotCQkJCQkubmV4dCgpOwotCQkJCi0JCQlpZihNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwucmVsb2FkUmVzb3VyY2VzKCk6IHJlc291cmNlPSIgKyByZXNvdXJjZSArICIsIGVsZW1lbnQ9IiArIFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJCi0JCQlSZXNvdXJjZURlc2NyaXB0b3IgcmVzRGVzYyA9IE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJCS5nZXRSZXNvdXJjZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQkJaWYgKHJlc0Rlc2MgIT0gbnVsbCkgewotCQkJCXJlc291cmNlLnNldFJlc291cmNlRGVzY3JpcHRvcihyZXNEZXNjKTsKLQkJCX0KLQkJfQotCi0JCUFycmF5TGlzdCByZWxvYWRlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSGFzaFNldCBwcm94aWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJQXJyYXlMaXN0IHJlc291cmNlTGlzdCA9IG5ldyBBcnJheUxpc3QocmVzb3VyY2VzKTsKLQotCQlSZXNvdXJjZSBsaWJSZXNvdXJjZSA9IGdldE1ldGhvZExpYnJhcnlSZXNvdXJjZSgpOwotCQlib29sZWFuIHJlbG9hZEFsbENvbmZpZ3MgPSBmYWxzZTsKLQkJaWYgKHJlc291cmNlTGlzdC5yZW1vdmUobGliUmVzb3VyY2UpKSB7Ci0JCQkvLyBNZXRob2RMaWJyYXJ5IHJlc291cmNlIGlzIHRvIHJlbG9hZCwgaXQgbXVzdCBiZSByZWxvYWRlZCBmaXJzdAotCQkJLy8JCQkKLQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGxpYlJlc291cmNlOwotCi0JCQkvLyBjbGVhciBtYXJrZXJzIGZvciB0aGlzIHJlc291cmNlCi0JCQkvLwotCQkJbWFya2VyTWFuYW5nZXIuY2xlYXJNYXJrZXJzKHJlc291cmNlKTsKLQotCQkJdHJ5IHsKLQkJCQlpZiAocmVzb3VyY2UucmVsb2FkKHByb3hpZXMpKSB7Ci0JCQkJCXJlbG9hZGVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0KLQkJCQkJLy8gcmVzZXQgdGhlIHJlc291cmNlIG1hbmFnZXIgcmVmZXJlbmNlIGluIFVSSUNvbnZlcnRlciBvZgotCQkJCQkvLyB0aGlzIHJlc291cmNlIHNldAotCQkJCQkvLyBzaW5jZSB0aGUgcmVzb3VyY2UgbWFuYWdlciBpcyByZWxvYWRlZAotCQkJCQkvLwotCQkJCQlNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyID0gKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgZ2V0VVJJQ29udmVydGVyKCk7Ci0JCQkJCXVyaUNvbnZlcnRlci5yZXNNZ3IgPSBudWxsOwotCQkJCQkKLQkJCQkJcmVsb2FkQWxsQ29uZmlncyA9IHRydWU7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQl9Ci0KLQkJfQotCQkvLyByZWxvYWQgdGhlIHJlc291cmNlcwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZUxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBpdGVyCi0JCQkJCS5uZXh0KCk7Ci0KLQkJCS8vIGNsZWFyIG1hcmtlcnMgZm9yIHRoaXMgcmVzb3VyY2UKLQkJCS8vCi0JCQltYXJrZXJNYW5hbmdlci5jbGVhck1hcmtlcnMocmVzb3VyY2UpOwotCi0JCQl0cnkgewotCQkJCWlmIChyZXNvdXJjZS5yZWxvYWQocHJveGllcykpIHsKLQkJCQkJcmVsb2FkZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCX0KLQkJfQotCi0JCWlmICghcmVsb2FkZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQkvLyByZWluaXRpYWxpemUgdGhlIHJlc291cmNlIHNldAotCQkJLy8KLQkJCWluaXRpYWxpemUocmVsb2FkQWxsQ29uZmlncyk7Ci0KLQkJCS8vIG5vdGlmeSB0aGUgbGlzdGVuZXJzCi0JCQkvLwotCQkJaWYgKHJlZnJlc2hMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCUlSZWZyZXNoRXZlbnQgZXZlbnQgPSBuZXcgUmVmcmVzaEV2ZW50KHJlbG9hZGVkUmVzb3VyY2VzLAotCQkJCQkJcHJveGllcyk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChyZWZyZXNoTGlzdGVuZXJzKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlJUmVmcmVzaExpc3RlbmVyIGxpc3RlbmVyID0gKElSZWZyZXNoTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJCQlsaXN0ZW5lci5ub3RpZnlSZWZyZXNoZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZWxvYWRlZFJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKGJvb2xlYW4gbG9hZENvbmZpZ3VyYXRpb25zKSB7Ci0JCS8vIGxvYWQgdGhlIFJlc291cmNlTWFuYWdlciB0cmVlIGFuZCBvcHBvc2l0ZSBmZWF0dXJlcwotCQkvLwotCQlsb2FkUmVzb3VyY2VNYW5hZ2VyVHJlZSgpOwotCi0JCXNldENvbnRhaW5lcnNPZkxvYWRlZEVsZW1lbnRzKCk7Ci0JCQotCQlpZihsb2FkQ29uZmlndXJhdGlvbnMpIHsKLQkJCWxvYWRDb25maWd1cmF0aW9ucygpOwotCQl9Ci0KLQkJbG9hZE9wcG9zaXRlRmVhdHVyZXMoKTsKLQotCQkvLyByZXNldCB0aGUgcmVzb3VyY2UgbWFuYWdlciByZWZlcmVuY2UgaW4gVVJJQ29udmVydGVyIG9mIHRoaXMgcmVzb3VyY2UKLQkJLy8gc2V0Ci0JCS8vCi0JCU11bHRpRmlsZVVSSUNvbnZlcnRlciB1cmlDb252ZXJ0ZXIgPSAoTXVsdGlGaWxlVVJJQ29udmVydGVyKSBnZXRVUklDb252ZXJ0ZXIoKTsKLQkJdXJpQ29udmVydGVyLnJlc01nciA9IG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRDb250YWluZXJzT2ZMb2FkZWRFbGVtZW50cygpIHsKLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJvb3RSZXNvdXJjZU1hbmFnZXIoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IocmVzTWdyLCBmYWxzZSkgewotCi0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIxNzI2OTEwMTc5ODc3MDI1MDZMOwotCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSAoUmVzb3VyY2VNYW5hZ2VyKSBvYmplY3Q7Ci0JCQkJQ29sbGVjdGlvbiBHVUlEcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJTGlzdCBzdWJNZ3JzID0gbmV3IEFycmF5TGlzdChyZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3ViTWdycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUludGVybmFsRU9iamVjdCBzdWJNZ3IgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyCi0JCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQlpZiAoc3ViTWdyICE9IG51bGwgJiYgIXN1Yk1nci5lSXNQcm94eSgpKSB7Ci0JCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsCi0JCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChzdWJNZ3IuZVJlc291cmNlKCkpOwotCQkJCQkJCUdVSURzLmFkZChlLmdldEd1aWQoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc01nci5lUmVzb3VyY2UoKTsKLQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgcGFyZW50ID0gUGVyc2lzdGVuY2VVdGlsCi0JCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCi0JCQkJCS8vIHJlc29sdmUgdGhlIHByb3h5IG9mIHRoaXMgZWxlbWVudCBpbiB0aGUgcGFyZW50Ci0JCQkJCS8vCi0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLnJlc29sdmVQcm94aWVzKEdVSURzLCBwYXJlbnQpOwotCQkJCX0KLQotCQkJCXJldHVybiByZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKS5pdGVyYXRvcigpOwotCQkJfQotCi0JCX07Ci0JCWZvciAoOyBpdGVyYXRvci5oYXNOZXh0KCk7IGl0ZXJhdG9yLm5leHQoKSkKLQkJCTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHdvcmtzcGFjZSByZXNvdXJjZSByZXByZXNlbnRzIGEgbGlicmFyeSByZXNvdXJjZQotCSAqIAotCSAqIEBwYXJhbSB3c1Jlc291cmNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGlicmFyeVJlc291cmNlKElSZXNvdXJjZSB3c1Jlc291cmNlKSB7Ci0JCXJldHVybiBsaWJGb2xkZXJQYXRoICE9IG51bGwgJiYgbGliRm9sZGVyUGF0aC5pc1ByZWZpeE9mKHdzUmVzb3VyY2UuZ2V0TG9jYXRpb24oKSk7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gd29ya3NwYWNlIHJlc291cmNlIGlzIGEgbmV3IHJlc291cmNlIHRoYXQgY2FuIGJlIGxvYWRlZCAKLQkgKiB1c2luZyB7QGxpbmsgI2xvYWROZXdSZXNvdXJjZXMoQ29sbGVjdGlvbil9Ci0JICogIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05ld1Jlc291cmNlVG9Mb2FkKElSZXNvdXJjZSB3c1Jlc291cmNlKSB7Ci0JCUlQYXRoIGxvYyA9IHdzUmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJcmV0dXJuIChsb2MgIT0gbnVsbCAmJiBjb25maWdGb2xkZXJQYXRoICE9IG51bGwgCi0JCQkJJiYgTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTi5lcXVhbHNJZ25vcmVDYXNlKCIuIiArIGxvYy5nZXRGaWxlRXh0ZW5zaW9uKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkmJiBjb25maWdGb2xkZXJQYXRoLmlzUHJlZml4T2YobG9jKQotCQkJCSYmICFGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmlzVGVhbVByaXZhdGUobG9jLnRvU3RyaW5nKCkpKTsKLQotCX0KLQkKLQkvKioKLQkgKiBMb2FkcyBuZXcgcmVzb3VyY2VzIHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBvZiB7QGxpbmsgSVJlc291cmNlIHdvcmsgc3BhY2UgcmVzb3VyY2VzfQotCSAqIGludG8gdGhpcyByZXNvdXJjZSBzZXQKLQkgKiBUT0RPOiBtZXJnZSB0aGlzIGNvZGUgdG8ge0BsaW5rICNnZXRSZXNvdXJjZShVUkksIGJvb2xlYW4pfQotCSAqIEBwYXJhbSB3c1Jlc291cmNlcyBjb2xsZWN0aW9uIG9mIHtAbGluayBJUmVzb3VyY2V9IG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkTmV3UmVzb3VyY2VzKENvbGxlY3Rpb248SVJlc291cmNlPiB3c1Jlc291cmNlcykgewotCQlBcnJheUxpc3QgbmV3Q29uZmlnRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHdzUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHdzUmVzb3VyY2UgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKHdzUmVzb3VyY2UgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQlJUmVzb3VyY2Ugd3NSZXMgPSAoSVJlc291cmNlKSB3c1Jlc291cmNlOwotCQkJCUlQYXRoIGxvYyA9IHdzUmVzLmdldExvY2F0aW9uKCk7Ci0JCQkJU3RyaW5nIGNvbmZpZ0ZpbGU7Ci0JCQkJaWYobG9jICE9IG51bGwgJiYgY29uZmlnRm9sZGVyUGF0aCAhPSBudWxsIAotCQkJCQkJJiYgTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTi5lcXVhbHNJZ25vcmVDYXNlKCIuIiArIGxvYy5nZXRGaWxlRXh0ZW5zaW9uKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSYmIGNvbmZpZ0ZvbGRlclBhdGguaXNQcmVmaXhPZihsb2MpCi0JCQkJCQkmJiAhRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pc1RlYW1Qcml2YXRlKGNvbmZpZ0ZpbGUgPSBsb2MudG9TdHJpbmcoKSkpIHsKLQkJCQkJbmV3Q29uZmlnRmlsZXMuYWRkKGNvbmZpZ0ZpbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gbG9hZCBuZXcgY29uZmlndXJhdGlvbnMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3Q29uZmlnRmlsZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgY29uZmlnRmlsZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJbG9hZENvbmZpZ3VyYXRpb24obmV3IEZpbGUoY29uZmlnRmlsZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3BlY2lhbCBoYW5kbGluZyBmb3IgTWV0aG9kQ29uZmlndXJhdGlvbiBzaW5jZSBNZXRob2RMaWJyYXJ5IHdpbGwgbm8KLQkgKiBsb25nZXIga2VlcHMgdGhlIHJlZmVyZW5jZXMgdG8gTWV0aG9kQ29uZmlndXJhdGlvbnMgYW5kIHRoZWlyIGZpbGVzLiBBbnkKLQkgKiBYTUkgZmlsZSB1bmRlciBmb2xkZXIgLi9jb25maWd1cmF0aW9ucyBhbmQgaXRzIHN1YmZvbGRlcnMgd2lsbCBiZSB0cmVhdGVkCi0JICogYXMgYSBjb25maWd1cmF0aW9uIGZpbGUuIFRoZXkgd2lsbCBiZSBsb2FkZWQgYW5kIGFkZGVkIHRvIE1ldGhvZExpYnJhcnkKLQkgKiBhcyBpdHMgY29uZmlndXJhdGlvbnMuCi0JICogQHJldHVybiBUT0RPCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGxvYWRDb25maWd1cmF0aW9ucygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCUZpbGUgY29uZmlnRGlyID0gbmV3IEZpbGUobmV3IEZpbGUobGliLmVSZXNvdXJjZSgpLmdldFVSSSgpCi0JCQkJLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKSwKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5NRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSk7Ci0JCXJldHVybiBsb2FkQ29uZmlndXJhdGlvbnMoY29uZmlnRGlyKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZHMgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIGZyb20gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0RpcgotCSAqIEByZXR1cm4gVE9ETwotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBsb2FkQ29uZmlndXJhdGlvbnMoRmlsZSBjb25maWdEaXIpIHsKLQkJQXJyYXlMaXN0PFJlc291cmNlPiByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCQlJdGVyYXRvciBkaXJJdGVyID0gTXVsdGlGaWxlU2F2ZVV0aWwubGlzdENvbmZpZ0ZpbGVzKGNvbmZpZ0Rpcik7Ci0JCUhhc2hTZXQ8RmlsZT4gY29uZmlnRmlsZXMgPSBuZXcgSGFzaFNldDxGaWxlPigpOwotCQl3aGlsZSAoZGlySXRlci5oYXNOZXh0KCkpIHsKLQkJCUZpbGUgY29uZmlnRmlsZSA9IChGaWxlKSBkaXJJdGVyLm5leHQoKTsKLQkJCWlmKGNvbmZpZ0ZpbGUuaXNGaWxlKCkpIHsKLQkJCQljb25maWdGaWxlcy5hZGQoY29uZmlnRmlsZSk7Ci0JCQl9Ci0JCX0KLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0ZXIubmV4dCgpOwotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoY29uZmlnLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCWlmIChjb25maWdGaWxlcy5jb250YWlucyhmaWxlKSkgewotCQkJCWNvbmZpZ0ZpbGVzLnJlbW92ZShmaWxlKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbmZpZ0ZpbGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRmlsZSBmaWxlID0gKEZpbGUpIGl0ZXIubmV4dCgpOwotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBsb2FkQ29uZmlndXJhdGlvbihmaWxlKTsKLQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZSBsb2FkQ29uZmlndXJhdGlvbihGaWxlIGNvbmZpZ0ZpbGUpIHsKLQkJdHJ5IHsKLQkJCU1ldGhvZExpYnJhcnkgbGliID0gZ2V0TWV0aG9kTGlicmFyeSgpOwotCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKGNvbmZpZ0ZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQkJCVJlc291cmNlIHJlc291cmNlID0gc3VwZXIuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsCi0JCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJCWlmKFBlcnNpc3RlbmNlVXRpbC5oYXNEdXBsaWNhdGVHVUlEKGUsIGxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSkpIHsKLQkJCQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJCQkJTkxTLmJpbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZENvbmZpZ3VyYXRpb25fY291bGROb3RMb2FkX2xvZ01zZywgY29uZmlnRmlsZSkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLmFkZCgoTWV0aG9kQ29uZmlndXJhdGlvbikgZSk7Ci0JCQkJCQlyZXR1cm4gcmVzb3VyY2U7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQkJTkxTLmJpbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZENvbmZpZ3VyYXRpb25fbm90Q29uZmlnRmlsZV9sb2dNc2csIGNvbmZpZ0ZpbGUpCi0JCQkJCQkJKTsKLQkJCQl9Ci0JCQkJcmVzb3VyY2UudW5sb2FkKCk7Ci0JCQkJZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHJlc291cmNlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXhjZXB0aW9uKE9iamVjdCBlcnIpIHsKLQkJaWYgKGVyciBpbnN0YW5jZW9mIFRocm93YWJsZSkgewotCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKChFeGNlcHRpb24pZXJyKTsKLQkJfSBlbHNlIHsKLQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlcnIudG9TdHJpbmcoKSk7Ci0JCX0KLQkJaWYoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCWlmIChlcnIgaW5zdGFuY2VvZiBUaHJvd2FibGUpIHsKLQkJCQkoKEV4Y2VwdGlvbikgZXJyKS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKGVyci50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlpZiAodXJpQ29udmVydGVyIGluc3RhbmNlb2YgTXVsdGlGaWxlVVJJQ29udmVydGVyKSB7Ci0JCQkoKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgdXJpQ29udmVydGVyKS5kaXNwb3NlKCk7Ci0JCX0KLQkJdXJpQ29udmVydGVyID0gbnVsbDsKLQkJYm9vbGVhbiBub3RpZnkgPSBlRGVsaXZlcigpOwotCQlib29sZWFuIHJlcG9ydEVycm9yID0gUkVQT1JUX0VSUk9SOwotCQlib29sZWFuIHJlZnJlc2ggPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuaXNFbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlpZihSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSA9PSB0aGlzKSB7Ci0JCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNldCgpOwotCQkJfQotCQkJZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJUkVQT1JUX0VSUk9SID0gZmFsc2U7Ci0JCQltYXJrZXJNYW5hbmdlci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCW1hcmtlck1hbmFuZ2VyLmNsZWFyQWxsKCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3QoZ2V0UmVzb3VyY2VzKCkpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzb3VyY2UudW5sb2FkKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciB1bmxvYWRpbmcgcmVzb3VyY2U6ICIgKwotCQkJCQkvLyByZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCQkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCi0JCQljbGVhckVycm9ycygpOwotCQl9IGZpbmFsbHkgewotCQkJZVNldERlbGl2ZXIobm90aWZ5KTsKLQkJCVJFUE9SVF9FUlJPUiA9IHJlcG9ydEVycm9yOwotCQkJbWFya2VyTWFuYW5nZXIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWlmKFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRSZXNvdXJjZVNldCgpID09IHRoaXMpIHsKLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZChyZWZyZXNoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChndWlkVG9NZXRob2RFbGVtZW50TWFwICE9IG51bGwpIHsKLQkJCWd1aWRUb01ldGhvZEVsZW1lbnRNYXAuY2xlYXIoKTsKLQkJfQotCi0JCWdldFJlc291cmNlcygpLmNsZWFyKCk7Ci0KLQkJaWYgKFVSSVRvVGVtcFVSSU1hcCAhPSBudWxsKSB7Ci0JCQlVUklUb1RlbXBVUklNYXAuY2xlYXIoKTsKLQkJfQotCi0JCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbC5jbGVhckRldGFjaGVkRU9iamVjdFRvSURNYXAoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJFcnJvcnMoKSB7Ci0JCS8vIGNsZWFyIGFsbCBtYXJrZXJzCi0JCW1hcmtlck1hbmFuZ2VyLmNsZWFyQWxsKCk7Ci0JfQotCi0JcHVibGljIE1ldGhvZExpYnJhcnkgbG9hZExpYnJhcnkoU3RyaW5nIHBhdGgpIHRocm93cyBFeGNlcHRpb24gewotCQlsb25nIGJlZ2luID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJcmVzZXQoKTsKLQotCQlsb25nIGFmdGVyUmVzZXQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCi0JCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNldCB0aW1lOiAiICsgKGFmdGVyUmVzZXQgLSBiZWdpbikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IGxvYWRMaWJyYXJ5V2l0aG91dFJlc2V0KHBhdGgpOwotCi0JCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiTG9hZCB0aW1lOiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gYmVnaW4pKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkvLyBjaGVjayBpZiBhbnkgcmVzb3VyY2UgaXMgbWFya2VkIGFzIG1vZGlmaWVkIGFmdGVyIGxvYWRpbmcKLQkJCS8vCi0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIk1vZGlmaWVkIHJlc291cmNlcyBhZnRlciBsb2FkaW5nOiIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHJlc291cmNlLmlzTW9kaWZpZWQoKSkgewotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIiAgIiArIHJlc291cmNlLmdldFVSSSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBsaWI7Ci0JfQotCQotCXByb3RlY3RlZCBSZXNvdXJjZSBsb2FkTGlicmFyeVJlc291cmNlKFN0cmluZyBwYXRoKSB7Ci0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlRmlsZVVSSShwYXRoKTsKLQkJUmVzb3VyY2UgcmVzID0gc3VwZXIuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJaWYgKCFyZXMuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpKSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJc3RyQnVmLmFwcGVuZChQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkTGlicmFyeUVycm9yX21zZyk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXMuZ2V0RXJyb3JzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UuRGlhZ25vc3RpYyBlcnJvciA9IChSZXNvdXJjZS5EaWFnbm9zdGljKSBpdGVyCi0JCQkJCQkubmV4dCgpOwotCQkJCXN0ckJ1Zi5hcHBlbmQoTkxTLmJpbmQoCi0JCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkTGlicmFyeUVycm9yX2RldGFpbHMsCi0JCQkJCQkobmV3IE9iamVjdFtdIHsgU3RyaW5nLnZhbHVlT2YoZXJyb3IuZ2V0TGluZSgpKSwKLQkJCQkJCQkJU3RyaW5nLnZhbHVlT2YoZXJyb3IuZ2V0Q29sdW1uKCkpLAotCQkJCQkJCQllcnJvci5nZXRNZXNzYWdlKCkgfSkpKTsKLQkJCX0KLQkJCVN0cmluZyBtc2cgPSBzdHJCdWYudG9TdHJpbmcoKTsKLQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2cobXNnKTsKLQkJCWlmKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKG1zZyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBsb2FkTGlicmFyeVdpdGhvdXRSZXNldChTdHJpbmcgcGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWxvYWRpbmcgPSB0cnVlOwotCi0JCS8vIG5vIHJlZnJlc2ggZHVyaW5nIGxvYWQKLQkJLy8KLQkJYm9vbGVhbiBiID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmlzRW5hYmxlZCgpOwotCQlpZihSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSA9PSB0aGlzKSB7Ci0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzZXQoKTsKLQkJfQotCQkKLQkJLy8gZGVmZXIgYWRkaW5nIG1hcmtlcnMgZHVyaW5nIGxvYWQKLQkJLy8KLQkJYm9vbGVhbiBhdXRvU2NoZWR1bGVkID0gbWFya2VyTWFuYW5nZXIuaXNBdXRvU2NoZWR1bGVkKCk7Ci0JCW1hcmtlck1hbmFuZ2VyLnNldEF1dG9TY2hlZHVsZWQoZmFsc2UpOwotCQl0cnkgewkJCi0JCQlGaWxlIGxpYkZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJCWNvbmZpZ0ZvbGRlclBhdGggPSBuZXcgUGF0aChuZXcgRmlsZShsaWJGaWxlLmdldFBhcmVudEZpbGUoKSwKLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuTUVUSE9EX0NPTkZJR1VSQVRJT05fRk9MREVSX05BTUUpLmdldENhbm9uaWNhbFBhdGgoKSk7Ci0JCQlsaWJGb2xkZXJQYXRoID0gbmV3IFBhdGgobGliRmlsZS5nZXRQYXJlbnRGaWxlKCkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQkJCVJlc291cmNlIHJlcyA9IGxvYWRMaWJyYXJ5UmVzb3VyY2UobGliRmlsZS5nZXRDYW5vbmljYWxQYXRoKCkpOyAKLQkJCXRyeSB7Ci0JCQkJaW5pdGlhbGl6ZSh0cnVlKTsKLQkJCQkKLQkJCQkvLyBTZXQgbW9kaWZpZWQgZmxhZyBvZiBsaWJyYXJ5IHJlc291cmNlIHRvIGZhbHNlIGluIGNhc2UgaXQgaGFkIGJlZW4gbW9kaWZpZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uCi0JCQkJLy8KLQkJCQlpZihyZXMgIT0gbnVsbCkgewotCQkJCQlyZXMuc2V0TW9kaWZpZWQoZmFsc2UpOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kTGlicmFyeSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihOTFMuYmluZCgKLQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLmludmFsaWRMaWJyYXJ5RmlsZUVycm9yX21zZywgcGF0aCkpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYoUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlU2V0KCkgPT0gdGhpcykgewotCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKGIpOwotCQkJfQotCQkJCQkKLQkJCW1hcmtlck1hbmFuZ2VyLnNldEF1dG9TY2hlZHVsZWQoYXV0b1NjaGVkdWxlZCk7Ci0JCQltYXJrZXJNYW5hbmdlci5zdGFydCgpOwotCQkJCi0JCQlsb2FkaW5nID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyBvcHBvc2l0ZSBmZWF0dXJlcyBmb3IgYWxsIGxvYWRlZCBvYmplY3RzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRPcHBvc2l0ZUZlYXR1cmVzKCkgewotCQlBcnJheUxpc3Qgb3Bwb3NpdGVGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UHJlZGVmaW5lZE9wcG9zaXRlRmVhdHVyZXMoKQotCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSAoT3Bwb3NpdGVGZWF0dXJlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUucmVzb2x2ZU93bmVyKCkpIHsKLQkJCQlvcHBvc2l0ZUZlYXR1cmVzLmFkZChvcHBvc2l0ZUZlYXR1cmUpOwotCQkJfQotCQl9Ci0JCWxvYWRPcHBvc2l0ZUZlYXR1cmVzKG9wcG9zaXRlRmVhdHVyZXMpOwotCX0KLQotCS8qKgotCSAqIExvYWRzIFJlc291cmNlTWFuYWdlciB0cmVlIG9mIHRoZSBvcGVuIGxpYnJhcnkgYW5kIGNvbm5lY3QgYW55IGxvYWRlZAotCSAqIE1ldGhvZFVuaXQgdG8gdGhlIGxpYnJhcnkgdHJlZSBhcyB3ZWxsLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkUmVzb3VyY2VNYW5hZ2VyVHJlZSgpIHsKLQkJbG9uZyBiZWdpbiA9IDA7Ci0JCQotCQlpZihNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJYmVnaW4gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCi0JCS8vIGRpc2FibGUgbG9nZ2luZyB1bnJlc29sdmVkIHByb3hpZXMgZHVyaW5nIGxvYWRpbmcgcmVzb3VyY2UgbWFuYWdlcgotCQkvLyB0cmVlCi0JCS8vCi0JCW1hcmtlck1hbmFuZ2VyLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCU11bHRpRmlsZVVSSUNvbnZlcnRlciB1cmlDb252ZXJ0ZXIgPSAoTXVsdGlGaWxlVVJJQ29udmVydGVyKSBnZXRVUklDb252ZXJ0ZXIoKTsKLQkJdHJ5IHsKLQkJCS8vIHRoaXMgcHJldmVudHMgdXJpQ29udmVydGVyIGZyb20gbG9hZGluZyByZXNvdXJjZXMgd2hpbGUKLQkJCS8vIG5vcm1hbGl6aW5nIFVSSQotCQkJLy8KLQkJCXVyaUNvbnZlcnRlci5zZXRSZXNvbHZlUHJveHkoZmFsc2UpOwotCi0JCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0Um9vdFJlc291cmNlTWFuYWdlcigpOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IocmVzTWdyLCBmYWxzZSkgewotCi0JCQkJLyoqCi0JCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkgKi8KLQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMTcyNjkxMDE3OTg3NzAyNTA2TDsKLQotCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSAoUmVzb3VyY2VNYW5hZ2VyKSBvYmplY3Q7Ci0JCQkJCXJldHVybiByZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKS5pdGVyYXRvcigpOwotCQkJCX0KLQotCQkJfTsKLQkJCWxvYWRpbmdSZXNvdXJjZU1hbmFnZXJUcmVlID0gdHJ1ZTsKLQkJCWZvciAoOyBpdGVyYXRvci5oYXNOZXh0KCk7IGl0ZXJhdG9yLm5leHQoKSkKLQkJCQk7Ci0JCX0gZmluYWxseSB7Ci0JCQltYXJrZXJNYW5hbmdlci5zZXRFbmFibGVkKHRydWUpOwotCQkJdXJpQ29udmVydGVyLnNldFJlc29sdmVQcm94eSh0cnVlKTsKLQkJCWxvYWRpbmdSZXNvdXJjZU1hbmFnZXJUcmVlID0gZmFsc2U7Ci0KLQkJCS8vIFJlcG9ydGluZyBvZiB1bm5vcm1hbGl6ZWQgVVJJcyB3YXMgZGlzYWJsZWQgd2hpbGUgbG9hZGluZwotCQkJLy8gcmVzb3VyY2UgbWFuYWdlciB0cmVlLiBOb3cgd2UgbmVlZAotCQkJLy8gdG8gZ28gdGhydSBhbGwgdGhlIGxvYWRlZCBvYmplY3RzIHRvIGZpbmQgcHJveGllcyB3aXRoCi0JCQkvLyB1bm5vcm1hbGl6ZWQgVVJJcyBhbmQgcmVwb3J0IHRoZW0KLQkJCS8vCi0JCQl0cnkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3QoZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpLnZhbHVlcygpKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlJbnRlcm5hbEVPYmplY3QgbyA9IChJbnRlcm5hbEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoby5lSXNQcm94eSgpICYmIG8uZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCQkJCVVSSSB1cmkgPSBvLmVQcm94eVVSSSgpOwotCQkJCQkJVVJJIG5vcm1hbGl6ZWRVUkkgPSBnZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUodXJpKTsKLQkJCQkJCWlmIChub3JtYWxpemVkVVJJID09IG51bGwpIHsKLQkJCQkJCQkvLyB0aGlzIGNhbGwgd2lsbCBsb2cgZXJyb3IgYWJvdXQgdW5yZXNvbHZlZCBwcm94eQotCQkJCQkJCS8vCi0JCQkJCQkJKChJbnRlcm5hbEVPYmplY3QpIG8uZUNvbnRhaW5lcigpKS5lUmVzb2x2ZVByb3h5KG8pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQkKLQkJCWlmKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIk11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5sb2FkUmVzb3VyY2VNYW5hZ2VyVHJlZSgpOiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gYmVnaW4pKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlTWFuYWdlciBnZXRSZXNvdXJjZU1hbmFnZXIoKSB7Ci0JCXJldHVybiAoKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgZ2V0VVJJQ29udmVydGVyKCkpLmdldFJlc291cmNlTWFuYWdlcigpOwotCX0KLQotCXByb3RlY3RlZCBFT2JqZWN0IGZpbmRFT2JqZWN0SW5VbmxvYWRlZFJlc291cmNlcyhTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGZpbmRFT2JqZWN0SW5VbmxvYWRlZFJlc291cmNlcyhnZXRSZXNvdXJjZU1hbmFnZXIoKSwgaWQpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBmaW5kRU9iamVjdEluVW5sb2FkZWRSZXNvdXJjZXMoUmVzb3VyY2VNYW5hZ2VyIHJlc01nciwKLQkJCVN0cmluZyBpZCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCVJlc291cmNlIHJlc291cmNlID0gc3VwZXIuZ2V0UmVzb3VyY2UoZGVzYy5nZXRSZXNvbHZlZFVSSSgpLCBmYWxzZSk7Ci0JCQlpZiAocmVzb3VyY2UgPT0gbnVsbCB8fCAhcmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXJlc291cmNlID0gc3VwZXIuZ2V0UmVzb3VyY2UoZGVzYy5nZXRSZXNvbHZlZFVSSSgpLCB0cnVlKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLwotCQkJCX0KLQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQlFT2JqZWN0IGVPYmplY3QgPSByZXNvdXJjZS5nZXRFT2JqZWN0KGlkKTsKLQkJCQkJaWYgKGVPYmplY3QgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGVPYmplY3Q7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSBmaW5kRU9iamVjdEluVW5sb2FkZWRSZXNvdXJjZXMoCi0JCQkJCShSZXNvdXJjZU1hbmFnZXIpIGl0ZXIubmV4dCgpLCBpZCk7Ci0JCQlpZiAoZU9iamVjdCAhPSBudWxsKQotCQkJCXJldHVybiBlT2JqZWN0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGlkCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdChTdHJpbmcgaWQpIHsKLQkJLy8gZmlyc3QsIHRyeSB0byBnZXQgdGhlIG9iamVjdCBmcm9tIHRoZSBjYWNoZSBndWlkVG9NZXRob2RFbGVtZW50Ci0JCS8vCi0JCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkuZ2V0KGlkKTsKLQkJaWYgKGVPYmplY3QgIT0gbnVsbCkKLQkJCXJldHVybiBlT2JqZWN0OwotCi0JCVVSSSB1cmkgPSBNdWx0aUZpbGVVUklDb252ZXJ0ZXIuY3JlYXRlVVJJKGlkKS5hcHBlbmRGcmFnbWVudChpZCk7Ci0JCVVSSSBub3JtYWxpemVkID0gZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSk7Ci0JCWlmIChub3JtYWxpemVkID09IG51bGwpIHsKLQkJCS8vIHRoZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gaWQgbWlnaHQgbm90IGhhdmUgZGlyZWN0IHJlc291cmNlLAotCQkJLy8gaGVuY2UsIGl0IGRvZXMgbm90IGhhdmUKLQkJCS8vIGl0cyBvd24gUmVzb3VyY2VEZXNjcmlwdG9yIGluIFJlc291cmNlTWFuYWdlciB0cmVlLgotCQkJLy8gZ28gdGhydSBhbGwgdW5sb2FkZWQgcmVzb3VyY2VzLCBsb2FkIHRoZW0sIGFuZCB0cnkgdG8gZmluZCB0aGUKLQkJCS8vIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkJCS8vCi0JCQllT2JqZWN0ID0gZmluZEVPYmplY3RJblVubG9hZGVkUmVzb3VyY2VzKGlkKTsKLQkJCWlmIChlT2JqZWN0ID09IG51bGwgJiYgUkVQT1JUX0VSUk9SKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uKE5MUy5iaW5kKAotCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMub2JqTm90Rm91bmRFcnJvcl9tc2csIGlkKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZU9iamVjdDsKLQkJfQotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RU9iamVjdCh1cmksIHRydWUpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQjZ2V0RU9iamVjdChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLAotCSAqICAgICAgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRFT2JqZWN0KFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7Ci0JCXJldHVybiBnZXRFT2JqZWN0KG51bGwsIHVyaSwgbG9hZE9uRGVtYW5kKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCNjcmVhdGVSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVJlc291cmNlIHJlc3VsdCA9IGRvQ3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJcmVzdWx0LnNldFRyYWNraW5nTW9kaWZpY2F0aW9uKHRydWUpOwotCQlnZXRSZXNvdXJjZXMoKS5hZGQocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFJlc291cmNlIGRvQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlyZXR1cm4gbmV3IE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCh1cmkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gYmFja3VwUmVxdWlyZWQoTWFwIG9wdGlvbnMpIHsKLQkJQm9vbGVhbiBiYWNrdXAgPSAoQm9vbGVhbikgb3B0aW9ucwotCQkJCS5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuQkFDS19VUF9CRUZPUkVfU0FWRSk7Ci0JCXJldHVybiBiYWNrdXAgIT0gbnVsbCAmJiBiYWNrdXAuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJhY2t1cChSZXNvdXJjZSByZXMpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXMuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuOwotCQkJT2JqZWN0IG9iamVjdCA9IHJlcy5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkKLQkJCQkJfHwgb2JqZWN0IGluc3RhbmNlb2YgUmVzb3VyY2VNYW5hZ2VyIHx8IG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpCi0JCQkJcmV0dXJuOwotCi0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlTdHJpbmcgYmFja3VwRGlyID0gbmV3IEZpbGUobGlicmFyeS5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpCi0JCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyAiLmJhayI7IC8vJE5PTi1OTFMtMSQKLQkJCVNpbXBsZURhdGVGb3JtYXQgZGF0ZUZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KAotCQkJCQkieXlNTWRkSEhtbXNzLlMiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHJlcyA9PSBsaWJyYXJ5LmVSZXNvdXJjZSgpKSB7Ci0JCQkJRGF0ZUZvcm1hdC5nZXRJbnN0YW5jZSgpLmZvcm1hdCgKLQkJCQkJCUNhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZSgpKTsKLQkJCQlGaWxlIGJhY2t1cEZpbGUgPSBuZXcgRmlsZShiYWNrdXBEaXIsCi0JCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0xJQlJBUllfTU9ERUxfRklMRU5BTUUKLQkJCQkJCQkJKyAnXycKLQkJCQkJCQkJKyBkYXRlRm9ybWF0dGVyLmZvcm1hdChDYWxlbmRhci5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJLmdldFRpbWUoKSkpOwotCQkJCWlmICghYmFja3VwRmlsZS5nZXRQYXJlbnRGaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQkJYmFja3VwRmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQkJfQotCQkJCUZpbGVVdGlsLm1vdmVGaWxlKG5ldyBGaWxlKHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSksIGJhY2t1cEZpbGUpOwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgcmVsYXRpdmVQYXRoID0gcmVzLmdldFVSSSgpLmRlcmVzb2x2ZSgKLQkJCQkJCWxpYnJhcnkuZVJlc291cmNlKCkuZ2V0VVJJKCkpLnRvRmlsZVN0cmluZygpOwotCQkJCUZpbGUgYmFja3VwRmlsZSA9IG5ldyBGaWxlKGJhY2t1cERpciwgcmVsYXRpdmVQYXRoCi0JCQkJCQkrICdfJwotCQkJCQkJKyBkYXRlRm9ybWF0dGVyCi0JCQkJCQkJCS5mb3JtYXQoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lKCkpKTsKLQkJCQlpZiAoIWJhY2t1cEZpbGUuZ2V0UGFyZW50RmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJCWJhY2t1cEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCQkJCX0KLQkJCQlGaWxlVXRpbC5tb3ZlRmlsZShuZXcgRmlsZShyZXMuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpLCBiYWNrdXBGaWxlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCWhhbmRsZUV4Y2VwdGlvbihOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5iYWNrdXBFcnJvcl9tc2csIHJlcykpOwotCQl9Ci0JfQotCi0Jdm9pZCByZW1vdmVVUklNYXBwaW5ncyhFT2JqZWN0IGVPYmosIFNldCBtb2RpZmllZFJlc291cmNlcykgewotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UmVzb3VyY2VNYW5hZ2VyKGVPYmoKLQkJCQkuZVJlc291cmNlKCkpOwotCQlpZiAocmVzTWdyICE9IG51bGwgJiYgcmVzTWdyLmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQlFY29yZVV0aWwucmVtb3ZlKHJlc01ncik7Ci0JCX0KLQkJcmVzTWdyID0gZ2V0Um9vdFJlc291cmNlTWFuYWdlcigpOwotCQlpZihyZXNNZ3IgIT0gbnVsbCkgewotCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSBNdWx0aUZpbGVTYXZlVXRpbC5maW5kUmVzb3VyY2VEZXNjcmlwdG9yKAotCQkJCQlyZXNNZ3IsIE11bHRpRmlsZVNhdmVVdGlsLmdldEd1aWQoZU9iaiksCi0JCQkJCW51bGwsIHRydWUpOwotCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsICYmIGRlc2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoZGVzYy5lUmVzb3VyY2UoKSk7Ci0JCQkJfQotCQkJCUVjb3JlVXRpbC5yZW1vdmUoZGVzYyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhblVwKFJlc291cmNlIHJlbW92ZWRSZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJY2xlYW5VcChyZW1vdmVkUmVzb3VyY2UsIG51bGwpOwotCX0KLQotCS8vIHByb3RlY3RlZCB2b2lkIGNsZWFuVXAoRU9iamVjdCBvYmosIFNldCBtb2RpZmllZFJlc291cmNlcykgewotCS8vIHRyeSB7Ci0JLy8gLy8gcmVtb3ZlIGFsbCB0aGUgVVJJIG1hcHBpbmdzCi0JLy8gLy8KLQkvLyByZW1vdmVVUklNYXBwaW5ncyhvYmosIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkvLyB9Ci0JLy8gZmluYWxseSB7Ci0JLy8gUmVzb3VyY2UgcmVzb3VyY2UgPSBvYmouZVJlc291cmNlKCk7Ci0JLy8gaWYocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRDb250ZW50cygpLmNvbnRhaW5zKG9iaikpIHsKLQkvLyByZXNvdXJjZS51bmxvYWQoKTsKLQkvLyBnZXRSZXNvdXJjZXMoKS5yZW1vdmUocmVzb3VyY2UpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCi0Jdm9pZCBjbGVhblVwKFJlc291cmNlIHJlbW92ZWRSZXNvdXJjZSwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCS8vCi0JCQlpZiAocmVtb3ZlZFJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJcmVtb3ZlZFJlc291cmNlLnVubG9hZCgpOwotCQkJCXRyeSB7Ci0JCQkJCXJlbW92ZWRSZXNvdXJjZS5sb2FkKG51bGwpOwotCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHRoZSBmaWxlIG1pZ2h0IGFscmVhZHkgYmUgZGVsZXRlZCwgbW92ZWQgb3IgbmV2ZXIKLQkJCQkJLy8gY3JlYXJlZC4KLQkJCQkJLy8KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQotCQkJRU9iamVjdCBvYmogPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZW1vdmVkUmVzb3VyY2UpOwotCi0JCQkvLyBpZihvYmogPT0gbnVsbCkgcmV0dXJuOwotCQkJLy8gYm9vbGVhbiBjbGVhbkZvbGRlcjsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJLy8gY2xlYW5Gb2xkZXIgPSB0cnVlOwotCQkJLy8gfQotCQkJLy8gZWxzZSB7Ci0JCQkvLyBjbGVhbkZvbGRlciA9IGZhbHNlOwotCQkJLy8gfQotCi0JCQkvLyBNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdW1hVXJpQ29udmVydGVyID0KLQkJCS8vICgoTXVsdGlGaWxlVVJJQ29udmVydGVyKWdldFVSSUNvbnZlcnRlcigpKTsKLQkJCS8vIHVtYVVyaUNvbnZlcnRlci5nZXRSZXNvdXJjZU1hbmFnZXIoKS5yZW1vdmVSZXNvdXJjZURlc2NyaXB0b3IocmVtb3ZlZFJlc291cmNlLmdldFVSSSgpLAotCQkJLy8gY2xlYW5Gb2xkZXIpOwotCi0JCQkvLyByZW1vdmUgYWxsIHRoZSBVUkkgbWFwcGluZ3MKLQkJCS8vCi0JCQlyZW1vdmVVUklNYXBwaW5ncyhvYmosIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCS8vIGNsZWFuVXBSZXNvdXJjZURlc2NyaXB0b3JzKChQcm9jZXNzUGFja2FnZSlvYmopOwotCQkJLy8gfQotCi0JCQlyZW1vdmVkUmVzb3VyY2UudW5sb2FkKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlnZXRSZXNvdXJjZXMoKS5yZW1vdmUocmVtb3ZlZFJlc291cmNlKTsKLQkJCVVSSSBvbGRVUkkgPSAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVtb3ZlZFJlc291cmNlKQotCQkJCQkuZ2V0T2xkVVJJKCk7Ci0JCQlpZiAob2xkVVJJICE9IG51bGwpIHsKLQkJCQlnZXRVUklUb1RlbXBVUklNYXAoKS5yZW1vdmUob2xkVVJJKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhblVwKFByb2Nlc3NQYWNrYWdlIHByb2NQa2cpIHsKLQkJLy8gcmVtb3ZlIENvbnRlbnREZXNjcmlwdGlvbiBvZiBhbGwgUHJvY2Vzc0VsZW1lbnRzIGluIHRoaXMKLQkJLy8gUHJvY2Vzc1BhY2thZ2UKLQkJLy8KLQkJcmVtb3ZlQ29udGVudERlc2NyaXB0aW9ucyhwcm9jUGtnKTsKLQotCQlFY29yZVV0aWwucmVtb3ZlKHByb2NQa2cpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9jUGtnCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUNvbnRlbnREZXNjcmlwdGlvbnMoUHJvY2Vzc1BhY2thZ2UgcHJvY1BrZykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9jUGtnLmdldFByb2Nlc3NFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJUHJvY2Vzc0VsZW1lbnQgZWxlbWVudCA9IChQcm9jZXNzRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24oZWxlbWVudCkKLQkJCQkJJiYgZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlUHJlc2VudGF0aW9uKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJvY1BrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgcGtnID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocGtnIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlyZW1vdmVDb250ZW50RGVzY3JpcHRpb25zKChQcm9jZXNzUGFja2FnZSkgcGtnKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVByZXNlbnRhdGlvbihQcm9jZXNzRWxlbWVudCBlbGVtZW50KSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKTsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5yZW1vdmUoZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNhdmUoQ29sbGVjdGlvbiByZXNvdXJjZXMsIE1hcCBvcHRpb25zLCBib29sZWFuIHByZXBhcmVTYXZlKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChvcHRpb25zID09IG51bGwpIHsKLQkJCW9wdGlvbnMgPSBnZXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsKLQkJfQotCi0JCVNldCBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCW9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLk1PRElGSUVEX1JFU09VUkNFX1NFVCwKLQkJCQltb2RpZmllZFJlc291cmNlcyk7Ci0JCXRyeSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQlzYXZlKHJlcywgb3B0aW9ucywgcHJlcGFyZVNhdmUpOwotCQkJfQotCQkJc2F2ZU1vZGlmaWVkUmVzb3VyY2VzKG9wdGlvbnMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZmluYWxseSB7Ci0JCQlvcHRpb25zLnJlbW92ZShNdWx0aUZpbGVYTUlTYXZlSW1wbC5NT0RJRklFRF9SRVNPVVJDRV9TRVQpOwotCQl9Ci0JfQotCi0JYm9vbGVhbiBzYXZlKFJlc291cmNlIHJlcywgTWFwIG9wdGlvbnMsIGJvb2xlYW4gcHJlcGFyZVNhdmUpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gKFNldCkgb3B0aW9ucwotCQkJCS5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VUKTsKLQkJVHhSZWNvcmQgdHhSZWNvcmQgPSAoVHhSZWNvcmQpIG9wdGlvbnMKLQkJCQkuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlRYX1JFQ09SRCk7Ci0JCUxpc3QgcmVzb3VyY2VzVG9Db21taXQgPSB0eFJlY29yZCAhPSBudWxsID8gdHhSZWNvcmQKLQkJCQkuZ2V0UmVzb3VyY2VzVG9Db21taXQoKSA6IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCU1ldGhvZEVsZW1lbnQgZU9iaiA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlcyk7Ci0JCQlpZiAoZU9iaiAhPSBudWxsKSB7Ci0JCQkJaWYgKHByZXBhcmVTYXZlKSB7Ci0JCQkJCWlmIChlT2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jQ29tcCA9IChQcm9jZXNzQ29tcG9uZW50KSBlT2JqOwotCQkJCQkJUmVzb3VyY2UgY29udGVudCA9IHByb2NDb21wLmdldFByb2Nlc3MoKSAhPSBudWxsCi0JCQkJCQkJCSYmIENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkJCQkJCQkuaGFzUHJlc2VudGF0aW9uKHByb2NDb21wLmdldFByb2Nlc3MoKSkgPyBwcm9jQ29tcAotCQkJCQkJCQkuZ2V0UHJvY2VzcygpLmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpCi0JCQkJCQkJCTogbnVsbDsKLQkJCQkJCWJvb2xlYW4gYWxyZWFkeU1vZGlmaWVkID0gY29udGVudCAhPSBudWxsCi0JCQkJCQkJCSYmIGNvbnRlbnQuaXNNb2RpZmllZCgpOwotCQkJCQkJcHJlcGFyZVNhdmUocHJvY0NvbXApOwotCQkJCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCAmJiBjb250ZW50LmlzTW9kaWZpZWQoKQotCQkJCQkJCQkmJiAhYWxyZWFkeU1vZGlmaWVkKSB7Ci0JCQkJCQkJLy8gY29udGVudCBpcyBtb2RpZmllZCBhcyByZXN1bHQgb2YgcHJlcGFyZVNhdmUoKSwKLQkJCQkJCQkvLyBpdCBuZWVkcyB0byBiZSBzYXZlZCBhZnRlciBtb2RlbCBpcyBzYXZlZAotCQkJCQkJCS8vCi0JCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNvbnRlbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGVPYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJCU11bHRpRmlsZVNhdmVVdGlsLmFkZFJlc291cmNlTWFuYWdlcihyZXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChyZXMuaXNNb2RpZmllZCgpKSB7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLT4gU3RhcnQgc2F2aW5nICIgKyByZXMpOwotCQkJCQlib29sZWFuIGJhY2t1cFJlcXVpcmVkID0gYmFja3VwUmVxdWlyZWQob3B0aW9ucyk7Ci0JCQkJCWlmIChiYWNrdXBSZXF1aXJlZCkgewotCQkJCQkJLy8gYmFjayB1cCByZXNvdXJjZSBiZWZvcmUgc2F2aW5nCi0JCQkJCQkvLwotCQkJCQkJYmFja3VwKHJlcyk7Ci0JCQkJCX0KLQotCQkJCQlpZiAocmVzb3VyY2VzVG9Db21taXQgIT0gbnVsbCkgewotCQkJCQkJKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlcykuc2V0VGVtcFVSSSh0eFJlY29yZAotCQkJCQkJCQkuZ2V0VHhJRCgpKTsKLQkJCQkJCXJlc291cmNlc1RvQ29tbWl0LmFkZChyZXMpOwotCQkJCQl9Ci0KLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuc2F2ZShyZXMsIG9wdGlvbnMpOwotCi0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiPC0tLS0gU2F2ZWQgcmVzb3VyY2U6ICIgKyByZXMpOwotCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJaGFuZGxlRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQl0aHJvdyBleGNlcHRpb247Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSBhIHJlc291cmNlIG9mIHRoaXMgcmVzb3VyY2Ugc2V0IHdpdGggdGhlIGdpdmVuIHNhdmUgb3B0aW9ucwotCSAqIAotCSAqIEBwYXJhbSByZXMKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgaXMgYXQgbGVhc3QgYSByZXNvdXJjZSBoYXMgYmVlbiBzYXZlZCBpbiB0aGlzIGNhbGwKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhdmUoUmVzb3VyY2UgcmVzLCBNYXAgb3B0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJLy8gY2xlYXIgYWxsIGVycm9yIG1hcmtlcnMgZm9yIHRoaXMgcmVzb3VyY2UKLS8vCQkvLwotLy8JCW1hcmtlck1hbmFuZ2VyLmNsZWFyTWFya2VycyhyZXMpOwotCi0JCWlmIChyZXMgPT0gbnVsbCB8fCByZXMuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCkgewotCQkJb3B0aW9ucyA9IGdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQl9Ci0KLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJb3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VULAotCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJYm9vbGVhbiBub3RGYWlsU2FmZSA9IG9wdGlvbnMuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlRYX1JFQ09SRCkgPT0gbnVsbDsKLQkJdHJ5IHsKLQkJCUNvbGxlY3Rpb24gc2F2ZWRSZXNvdXJjZXMgPSBudWxsOwotCQkJaWYobm90RmFpbFNhZmUpIHsKLQkJCQlzYXZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCX0KLQkJCWJvb2xlYW4gcmV0ID0gc2F2ZShyZXMsIG9wdGlvbnMsIHRydWUpOwotCQkJaWYocmV0ICYmIG5vdEZhaWxTYWZlKSB7Ci0JCQkJc2F2ZWRSZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQl9Ci0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBzYXZlTW9kaWZpZWRSZXNvdXJjZXMob3B0aW9ucyk7Ci0JCQlpZighY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQlyZXQgPSB0cnVlOwotCQkJCWlmKG5vdEZhaWxTYWZlKSB7Ci0JCQkJCXNhdmVkUmVzb3VyY2VzLmFkZEFsbChjb2xsZWN0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKG5vdEZhaWxTYWZlICYmIHJldCkgewotCQkJCS8vIHVwZGF0ZSByZXNvdXJjZSBjYWNoZWQgdGltZXN0YW1wcwotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2F2ZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCByZXNvdXJjZSA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJCQkJKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzb3VyY2UpLnVwZGF0ZVRpbWVTdGFtcHMoKTsKLQkJCQkJfQotCQkJCX0JCQkJCQkJCQotCQkJfQotCQkJCi0JCQlyZXR1cm4gcmV0OwotCQl9IGZpbmFsbHkgewotCQkJb3B0aW9ucy5yZW1vdmUoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VUKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIG9ubHkgdGhlIG1vZGlmaWVkIHJlc291cmNlcyBpbiB0aGlzIHJlc291cmNlIHNldC4KLQkgKiAKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24gewotCQl0cnkgewotCQkJc2F2ZShvcHRpb25zLCBmYWxzZSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZihlIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotCQkJCXRocm93IChSdW50aW1lRXhjZXB0aW9uKWU7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiBAcmV0dXJuIHJlc291cmNlcyB0aGF0IGhhZCBiZWVuIHNhdmVkIGJ5IHRoaXMgY2FsbAotCSAqIEB0aHJvd3MgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uIAotCSAqLwotCUNvbGxlY3Rpb24gc2F2ZU1vZGlmaWVkUmVzb3VyY2VzKE1hcCBvcHRpb25zKSB0aHJvd3MgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uIHsKLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gKFNldCkgb3B0aW9ucwotCQkJCS5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VUKTsKLQkJVHhSZWNvcmQgdHhSZWNvcmQgPSAoVHhSZWNvcmQpIG9wdGlvbnMKLQkJCQkuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlRYX1JFQ09SRCk7Ci0JCUxpc3QgcmVzb3VyY2VzVG9Db21taXQgPSB0eFJlY29yZCAhPSBudWxsID8gdHhSZWNvcmQKLQkJCQkuZ2V0UmVzb3VyY2VzVG9Db21taXQoKSA6IG51bGw7Ci0JCWlmIChtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWJvb2xlYW4gYmFja3VwUmVxdWlyZWQgPSBiYWNrdXBSZXF1aXJlZChvcHRpb25zKTsKLQkJYm9vbGVhbiBjaGVja01vZGlmeSA9IE11bHRpRmlsZVhNSVNhdmVJbXBsLmNoZWNrTW9kaWZ5UmVxdWlyZWQob3B0aW9ucyk7Ci0JCUNvbGxlY3Rpb24gc2F2ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlICghbW9kaWZpZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0PFJlc291cmNlPiByZXNvdXJjZXNUb1NhdmUgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPihtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCQlpZiAoY2hlY2tNb2RpZnkpIHsKLQkJCQljaGVja01vZGlmeShyZXNvdXJjZXNUb1NhdmUpOwotCQkJCWlmKHJlc291cmNlc1RvQ29tbWl0ICE9IG51bGwpIHsKLQkJCQkJLy8gY2hlY2sgZm9yIG91dC1vZi1zeW5jaCBvbmx5IGluIGZhaWwtc2FmZSBzYXZpbmcgZm9yIG5vdwotCQkJCQkvLwotCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja091dE9mU3luY2gocmVzb3VyY2VzVG9TYXZlLCBvcHRpb25zKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlc1RvU2F2ZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJLy8gaWYocmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQkJaWYgKGJhY2t1cFJlcXVpcmVkKSB7Ci0JCQkJCS8vIGJhY2sgdXAgcmVzb3VyY2UgYmVmb3JlIHNhdmluZwotCQkJCQkvLwotCQkJCQliYWNrdXAocmVzb3VyY2UpOwotCQkJCX0KLQotCQkJCWlmIChyZXNvdXJjZXNUb0NvbW1pdCAhPSBudWxsKSB7Ci0JCQkJCSgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZSkuc2V0VGVtcFVSSSh0eFJlY29yZAotCQkJCQkJCS5nZXRUeElEKCkpOwotCQkJCQlyZXNvdXJjZXNUb0NvbW1pdC5hZGQocmVzb3VyY2UpOwotCQkJCX0KLQotCQkJCWlmKE11bHRpRmlsZVNhdmVVdGlsLnNhdmUocmVzb3VyY2UsIG9wdGlvbnMpKSB7Ci0JCQkJCXNhdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJCS8vIH0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2F2ZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiBAcGFyYW0gc2F2ZUFsbAotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgZm9yY2Ugc2F2aW5nIGFsbCB0aGUgcmVzb3VyY2VzIGV2ZW4gaWYgdGhleSBhcmUgbm90Ci0JICogICAgICAgICAgICBtb2RpZmllZC4KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMsIGJvb2xlYW4gc2F2ZUFsbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNhdmUob3B0aW9ucywgc2F2ZUFsbCwgZmFsc2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzYXZlKE1hcCBvcHRpb25zLCBib29sZWFuIHNhdmVBbGwsIGJvb2xlYW4gZmFpbFNhZmUpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCkgewotCQkJb3B0aW9ucyA9IG5ldyBIYXNoTWFwKGdldERlZmF1bHRTYXZlT3B0aW9ucygpKTsKLQkJfQotCi0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IGdldE1ldGhvZExpYnJhcnkoKTsKLQkJTXVsdGlGaWxlU2F2ZVV0aWwuc2V0R3VpZChsaWJyYXJ5KTsKLQotCQlwcmVwYXJlU2F2ZShsaWJyYXJ5KTsKLQotCQkvLyBkbyBjbGVhbi11cCB0aGlzIHJlc291cmNlIHNldCBiZWZvcmUgc2F2aW5nCi0JCS8vCi0JCWNsZWFuVXAoKTsKLQotCQlNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdW1hVXJpQ29udmVydGVyID0gKChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpIGdldFVSSUNvbnZlcnRlcigpKTsKLQkJdW1hVXJpQ29udmVydGVyLnNldExpYnJhcnlVUklzKGxpYnJhcnkpOwotCi0JCVNldCBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCW9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLk1PRElGSUVEX1JFU09VUkNFX1NFVCwKLQkJCQltb2RpZmllZFJlc291cmNlcyk7Ci0JCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVQZXJzaXN0ZXIgcGVyc2lzdGVyID0gbnVsbDsKLQkJaWYgKGZhaWxTYWZlKSB7Ci0JCQlwZXJzaXN0ZXIgPSBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFCi0JCQkJCS5nZXRGYWlsU2FmZVBlcnNpc3RlcihvcHRpb25zKTsKLQkJCW9wdGlvbnMgPSBwZXJzaXN0ZXIuZ2V0U2F2ZU9wdGlvbnMoKTsKLQkJfQotCQl0cnkgewotCQkJTGlzdCBsaXN0ID0gZ2V0UmVzb3VyY2VzKCk7Ci0JCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdGFydCBzYXZpbmcgIiArIHNpemUgKyAiIGxvYWRlZCByZXNvdXJjZXM6ICIKLQkJCS8vICsgbGlzdCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCWJvb2xlYW4gYmFja3VwUmVxdWlyZWQgPSBiYWNrdXBSZXF1aXJlZChvcHRpb25zKTsKLQkJCUxpc3Qgc2F2ZVJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUxpc3QgbW92ZVJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBsaXN0LmdldChpKTsKLQotCQkJCSBpZiAocmVzLmlzTW9kaWZpZWQoKSAmJiAKLQkJCQkJCSBNdWx0aUZpbGVTYXZlVXRpbC5hZGp1c3RMb2NhdGlvblJlcXVpcmVkKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlcykpIHsKLQkJCQkJIG1vdmVSZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQkJIH0KLQotCQkJCU1ldGhvZEVsZW1lbnQgZU9iaiA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlcyk7Ci0JCQkJaWYgKGVPYmogIT0gbnVsbCAmJiBlT2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlpZiAoc2F2ZUFsbCB8fCByZXMuaXNNb2RpZmllZCgpKSB7Ci0vLwkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLT4gU3RhcnQgc2F2aW5nICIgKyByZXMpOwotLy8JCQkJCQlpZiAoZmFpbFNhZmUpIHsKLS8vCQkJCQkJCXNhdmVSZXNvdXJjZXMuYWRkKHJlcyk7Ci0vLwkJCQkJCX0gZWxzZSB7Ci0vLwkJCQkJCQlpZiAoYmFja3VwUmVxdWlyZWQpIHsKLS8vCQkJCQkJCQkvLyBiYWNrIHVwIHJlc291cmNlIGJlZm9yZSBzYXZpbmcKLS8vCQkJCQkJCQkvLwotLy8JCQkJCQkJCWJhY2t1cChyZXMpOwotLy8JCQkJCQkJfQotLy8KLS8vCQkJCQkJCWlmKE11bHRpRmlsZVNhdmVVdGlsLnNhdmUocmVzLCBvcHRpb25zKSkgewotLy8JCQkJCQkJCXNhdmVkUmVzb3VyY2VzLmFkZChyZXMpOwotLy8JCQkJCQkJCWlmKHJlcyBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotLy8JCQkJCQkJCQkoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbClyZXMpLnVwZGF0ZVRpbWVTdGFtcHMoKTsKLS8vCQkJCQkJCQl9Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCI8LS0tLSBTYXZlZCByZXNvdXJjZTogIiArIHJlcyk7Ci0JCQkJCQkKLQkJCQkJCXNhdmVSZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmKCFzYXZlUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCVJlc291cmNlIGxpYlJlc291cmNlID0gZ2V0TWV0aG9kTGlicmFyeVJlc291cmNlKCk7Ci0JCQkJaWYoIXNhdmVSZXNvdXJjZXMuY29udGFpbnMobGliUmVzb3VyY2UpICYmIFBlcnNpc3RlbmNlVXRpbC5jaGVja1Rvb2xWZXJzaW9uKGxpYlJlc291cmNlKSAhPSAwKSB7Ci0JCQkJCXNhdmVSZXNvdXJjZXMuYWRkKGxpYlJlc291cmNlKTsKLQkJCQl9Ci0JCQkJaWYoTXVsdGlGaWxlWE1JU2F2ZUltcGwuY2hlY2tNb2RpZnlSZXF1aXJlZChvcHRpb25zKSkgewotCQkJCQljaGVja01vZGlmeShzYXZlUmVzb3VyY2VzKTsKLQkJCQl9Ci0JCQkJaWYgKGZhaWxTYWZlKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzYXZlKHNhdmVSZXNvdXJjZXMsIG9wdGlvbnMsIGZhbHNlKTsKLQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJCXBlcnNpc3Rlci5hZGp1c3RMb2NhdGlvbihtb3ZlUmVzb3VyY2VzKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQkJdGhyb3cgZTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNhdmVSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZihNdWx0aUZpbGVTYXZlVXRpbC5zYXZlKHJlc291cmNlLCBvcHRpb25zKSkgewotCQkJCQkJCWlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQkJCQkJCSgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKXJlc291cmNlKS51cGRhdGVUaW1lU3RhbXBzKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vdmVSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5hZGp1c3RMb2NhdGlvbihyZXNvdXJjZSwKLQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMpOwotCQkJCQl9Ci0JCQkJCUNvbGxlY3Rpb24gc2F2ZWQgPSBzYXZlTW9kaWZpZWRSZXNvdXJjZXMob3B0aW9ucyk7Ci0JCQkJCWlmIChzYXZlZCAhPSBudWxsKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzYXZlZC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCQkJCQkJKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzb3VyY2UpLnVwZGF0ZVRpbWVTdGFtcHMoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJdGhyb3cgZXhjZXB0aW9uOwotCQl9IGZpbmFsbHkgewotCQkJb3B0aW9ucy5yZW1vdmUoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VUKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBvcGVuIGxpYnJhcnkgdW5kZXIgYSBuZXcgbG9jYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gbmV3TG9jYXRpb24KLQkgKiAgICAgICAgICAgIGRpcmVjdG9yeSB0byBzYXZlIHRoZSBvcGVuIGxpYnJhcnkgdG8KLQkgKiBAcGFyYW0gaWYKLQkgKiAgICAgICAgICAgIHRydWUsIHJlZ2VuZXJhdGVHVUlEIHJlZ2VuZXJhdGUgR1VJRCBmb3IgYWxsIE1ldGhvZEVsZW1lbnRzIGluCi0JICogICAgICAgICAgICB0aGUgb3BlbiBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZUFzKFN0cmluZyBuZXdMb2NhdGlvbiwgYm9vbGVhbiByZWdlbmVyYXRlR1VJRCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gZ2V0TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGliID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gbG9hZCBhbGwgdGhlIHJlc291cmNlcyBpbiBtZW1vcnkKLQkJLy8KLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCW1vbml0b3Iuc2V0VGFza05hbWUoUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZFJlc291cmNlc1Rhc2tfbmFtZSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnZW5lcmF0ZUdVSUQgJiYgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLnNldEd1aWQoVW1hVXRpbC5nZW5lcmF0ZUdVSUQoKSk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudC5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGFuZ2UgVVJJIG9mIGFsbCBsb2FkZWQgcmVzb3VyY2VzIGZvciBuZXcgbG9jYXRpb24KLQkJLy8KLQkJVVJJIG9sZERpciA9IFVSSS5jcmVhdGVGaWxlVVJJKG5ldyBGaWxlKGxpYi5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCkKLQkJCQkrIEZpbGUuc2VwYXJhdG9yKTsKLQkJVVJJIG5ld0RpciA9IFVSSS5jcmVhdGVGaWxlVVJJKG5ld0xvY2F0aW9uICsgRmlsZS5zZXBhcmF0b3IpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCXJlc291cmNlLnNldFVSSShyZXNvdXJjZS5nZXRVUkkoKS5yZXBsYWNlUHJlZml4KG9sZERpciwgbmV3RGlyKSk7Ci0JCX0KLQotCQkvLyBjbGVhciB0aGUgUmVzb3VyY2VNYW5hZ2VyCi0JCS8vCi0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSAoKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgZ2V0VVJJQ29udmVydGVyKCkpCi0JCQkJLmdldFJlc291cmNlTWFuYWdlcigpOwotCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCXJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuY2xlYXIoKTsKLQkJfQotCi0JCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQltb25pdG9yLnNldFRhc2tOYW1lKFBlcnNpc3RlbmNlUmVzb3VyY2VzLnNhdmVMaWJyYXJ5VGFza19uYW1lKTsKLQkJc2F2ZShudWxsLCB0cnVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gdW5sb2FkV2l0aG91dFJlbW92ZShNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UpIHsKLQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQlyZXNvdXJjZS51bmxvYWRXaXRob3V0UmVtb3ZlKCk7Ci0JCWlmKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IGdldE1ldGhvZExpYnJhcnkoKTsKLQkJCWlmKGxpYiAhPSBudWxsKSB7Ci0JCQkJbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLnJlbW92ZShlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFuVXAoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCUxpc3QgcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlMaXN0IGxpc3QgPSBnZXRSZXNvdXJjZXMoKTsKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgbGlzdC5nZXQoaSk7Ci0JCQlib29sZWFuIHJlbW92ZSA9IGZhbHNlOwotCQkJaWYgKHJlcy5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuY2xlYW5VcCgpOiBlbXB0eSByZXNvdXJjZTogIiArIHJlcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZW1vdmUgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlNZXRob2RFbGVtZW50IGVPYmogPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXMpOwotCQkJCWlmIChlT2JqID09IG51bGwKLQkJCQkJCXx8IChlT2JqICE9IGxpYnJhcnkgJiYgZU9iai5lQ29udGFpbmVyKCkgPT0gbnVsbCkpIHsKLQkJCQkJaWYgKGVPYmogPT0gbnVsbCkgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLmNsZWFuVXAoKTogcmVzb3VyY2Ugd2l0aG91dCBhbnkgTWV0aG9kRWxlbWVudDogIiArIHJlcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJlbW92ZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJLy8gc29tZSByZXNvdXJjZXMgbWlnaHQgYmUgbG9hZGVkIGRpcmVjdGx5LCBub3QgdGhydSBpdHMKLQkJCQkJLy8gY29udGFpbmVyLiBUaGVyZWZvcmUsIHdlIGNhbm5vdCBhc3N1bWUKLQkJCQkJLy8gdGhhdCBhIG9iamVjdCB3aXRob3V0IGEgY29udGFpbmVyIGluIGEgbG9hZGVkIHJlc291cmNlIGlzCi0JCQkJCS8vIGEgcmVtb3ZlZCBvYmplY3QuCi0JCQkJCS8vCi0JCQkJCWVsc2UgaWYgKGVPYmogIT0gbGlicmFyeSAmJiBlT2JqLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuY2xlYW5VcCgpOiByZXNvdXJjZSB3aXRob3V0IGEgY29udGFpbmVyOiAiICsgcmVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlbW92ZSkgewotCQkJCS8vIFRoaXMgaXMgYSByZW1vdmVkIG9iamVjdC4gQWRkIGl0cyBwYXRoIHRvIHRoZSBsaXN0IGZvcgotCQkJCS8vIHJlbW92aW5nIGl0cyBmaWxlcyBsYXRlci4KLQkJCQkvLwotCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBkbyBjbGVhbi11cAotCQkvLwotCQlTeXN0ZW0ub3V0Ci0JCQkJLnByaW50bG4oIk11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5jbGVhblVwKCk6IHJlbW92ZWQgcmVzb3VyY2VzOiAiICsgcmVtb3ZlZFJlc291cmNlcyk7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZW1vdmVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQotCQkJdHJ5IHsKLQkJCQkvLyByZW1vdmUgUmVzb3VyY2VEZXNjcmlwdG9yIG9mIHRoZSByZW1vdmVkIHJlc291cmNlCi0JCQkJLy8KLQkJCQljbGVhblVwKHJlcyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCi0JCS8vIGdldFJlc291cmNlcygpLnJlbW92ZUFsbChyZW1vdmVkUmVzb3VyY2VzKTsKLQl9Ci0JCi0JLyoqCi0JICogUHJlcGFyZXMgdGhlIGxpYnJhcnkgZm9yIHNhdmluZwotCSAqLwotCXByaXZhdGUgdm9pZCBwcmVwYXJlU2F2ZShNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJLy8gY2hlY2sgaWYgdGhlIGxpYnJhcnkgYWxyZWFkeSBoYXMgYSBSZXNvdXJjZU1hbmFnZXIKLQkJLy8gaWYgbm90LCBjcmVhdGUgUmVzb3VyY2VNYW5hZ2VyIGZvciBpdAotCQkvLwotCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBsaWJyYXJ5Ci0JCQkJLmVSZXNvdXJjZSgpOwotCQlSZXNvdXJjZU1hbmFnZXIgbGliUmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwuYWRkUmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlKTsKLQkJaWYobGliUmVzTWdyICE9IG51bGwpIHsKLQkJCU11bHRpRmlsZVNhdmVVdGlsLnJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcihsaWJSZXNNZ3IsIGxpYnJhcnksCi0JCQkJCXJlc291cmNlLmdldEZpbmFsVVJJKCkpOwotCQl9Ci0KLQkJTGlzdCBtb2RlbHMgPSBsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJaW50IHNpemUgPSBtb2RlbHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcHJlcGFyZVNhdmUoKE1ldGhvZFBsdWdpbikgbW9kZWxzLmdldChpKSk7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJY2xlYW5VcCgoTWV0aG9kUGx1Z2luKSBtb2RlbHMuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2xlYW5VcChNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgUFJPQ0VTU19QQUNLQUdFX1BBVEhTLmxlbmd0aDsgaSsrKSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UoCi0JCQkJCXBsdWdpbiwgUFJPQ0VTU19QQUNLQUdFX1BBVEhTW2ldKTsKLQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCWNsZWFuVXBQcm9jZXNzZXMocGtnKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmVwYXJlU2F2ZShNZXRob2RQbHVnaW4gbW9kZWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBQUk9DRVNTX1BBQ0tBR0VfUEFUSFMubGVuZ3RoOyBpKyspIHsKLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZSgKLQkJCQkJbW9kZWwsIFBST0NFU1NfUEFDS0FHRV9QQVRIU1tpXSk7Ci0JCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCQlwcmVwYXJlU2F2ZShwa2cpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBwcm9jZXNzIHBhY2thZ2VzIG9mIHVudXNlZCBhY3Rpdml0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBwa2cKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNsZWFuVXBQcm9jZXNzZXMoUHJvY2Vzc1BhY2thZ2UgcGtnKSB7Ci0JCUxpc3QgbGlzdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gbGlzdC5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSAoUHJvY2Vzc0NvbXBvbmVudCkgb2JqOwotCQkJCUxpc3QgcGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJvY0NvbXAuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJCWdldFJlbW92ZWRQYWNrYWdlcygoUHJvY2Vzc1BhY2thZ2UpIGVsZW1lbnQsIHBhY2thZ2VzKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGFja2FnZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUoKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRSZW1vdmVkUGFja2FnZXMoUHJvY2Vzc1BhY2thZ2UgcGtnLAotCQkJTGlzdCByZW1vdmVkUGFja2FnZXMpIHsKLQkJLy8gZmluZCBhY3Rpdml0eQotCQkvLwotCQlBY3Rpdml0eSBhY3QgPSBnZXRBY3Rpdml0eShwa2cpOwotCi0JCWlmIChhY3QgPT0gbnVsbCB8fCBnZXRQYXJlbnQoYWN0KSA9PSBudWxsKSB7Ci0JCQkvLyBJbnZhbGlkIHByb2Nlc3MgcGFja2FnZS4gSXQgZG9lcyBub3QgY29udGFpbiBhbnkgYWN0aXZpdHkuCi0JCQkvLyBBZGQgaXQgdG8gdGhlIGxpc3Qgb2YgcGFja2FnZXMgdG8gYmUgcmVtb3ZlZC4KLQkJCS8vCi0JCQlyZW1vdmVkUGFja2FnZXMuYWRkKHBrZyk7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJZ2V0UmVtb3ZlZFBhY2thZ2VzKChQcm9jZXNzUGFja2FnZSkgZWxlbWVudCwKLQkJCQkJCQlyZW1vdmVkUGFja2FnZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5IGdldEFjdGl2aXR5KFByb2Nlc3NQYWNrYWdlIHBrZykgewotCQkvLyBmaW5kIGFjdGl2aXR5Ci0JCS8vCi0JCUFjdGl2aXR5IGFjdCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJYWN0ID0gKEFjdGl2aXR5KSBlbGVtZW50OwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBhY3Q7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldFBhcmVudChCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJLy8gSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpCi0JCS8vIFRuZ1V0aWwuZ2V0QWRhcHRlcihlLCBJQlNJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQkvLyByZXR1cm4gYWRhcHRlciA9PSBudWxsID8gbnVsbCA6IGFkYXB0ZXIuZ2V0UGFyZW50KGUpOwotCi0JCXJldHVybiBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgcHJvY2VzcyBwYWNrYWdlIGZvciB0aG9zZSBhY3Rpdml0aWVzIHRoYXQgc3RpbGwgZG9uJ3QgYmVsb25nIHRvCi0JICogYW55IHByb2Nlc3MgcGFja2FnZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJlcGFyZVNhdmUoUHJvY2Vzc1BhY2thZ2UgcGtnKSB7Ci0JCUxpc3QgbGlzdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gbGlzdC5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCXByZXBhcmVTYXZlKChQcm9jZXNzQ29tcG9uZW50KSBvYmopOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByZXBhcmVTYXZlKFByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXApIHsKLQkJUHJvY2VzcyBwcm9jID0gcHJvY0NvbXAuZ2V0UHJvY2VzcygpOwotCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQkvLyBhc3NvY2lhdGVBbGxBZGFwdGVycyhwcm9jKTsKLQkJCXByZXBhcmVTYXZlKHByb2MpOwotCi0JCQljbGVhblVwRGFuZ2xpbmdEZXNjcmlwdG9ycyhwcm9jQ29tcCk7Ci0KLQkJCUxpc3QgZGFuZ2xpbmdQa2dzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChwcm9jQ29tcC5nZXRDaGlsZFBhY2thZ2VzKCkpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBlbGVtZW50OwotCQkJCQlyZW9yZ2FuaXplKHBrZywgZGFuZ2xpbmdQa2dzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGNsZWFuIHVwIGRhbmdsaW5nIFByb2Nlc3NQYWNrYWdlcwotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRhbmdsaW5nUGtncy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQljbGVhblVwKChQcm9jZXNzUGFja2FnZSkgaXRlci5uZXh0KCkpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQkvLyAvKioKLQkvLyAqIEBwYXJhbSBhY3Rpdml0eQotCS8vICovCi0JLy8gcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NvY2lhdGVBbGxBZGFwdGVycyhBY3Rpdml0eSBhY3Rpdml0eSkgewotCS8vIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0KLQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCS8vIEl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKQotCS8vIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGFjdGl2aXR5LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oYWN0aXZpdHkpLml0ZXJhdG9yKCk7Ci0JLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkvLyBhc3NvY2lhdGVBbGxBZGFwdGVycygoQWN0aXZpdHkpIGVsZW1lbnQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmVwYXJlU2F2ZShBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlQcm9jZXNzUGFja2FnZSBwYXJlbnRQa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJTGlzdCBlbGVtZW50cyA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0KLQkJLy8gYWRkIG5ldyBkZXNjcmlwdG9ycyBhbmQgb3RoZXIgbm9uLWFjdGl2aXR5IGJyZWFrZG93biBlbGVtZW50cyBvZiB0aGUKLQkJLy8gYWN0aXZpdHkgdG8gaXRzIHByb2Nlc3MgcGFja2FnZQotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgJiYgZWxlbWVudC5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCXBhcmVudFBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoKFByb2Nlc3NFbGVtZW50KSBlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCBuZXcgV29ya09yZGVyIG9iamVjdHMgb3IgcmVtb3ZlIHVudXNlZCBXb3JrT3JkZXIgb2JqZWN0cyBvZiB0aGlzCi0JCS8vIGFjdGl2aXR5Ci0JCS8vCi0JCWZvciAoV29ya09yZGVyIHdvcmtPcmRlciA6IGFjdGl2aXR5LmdldExpbmtUb1ByZWRlY2Vzc29yKCkpIHsKLQkJCWlmICh3b3JrT3JkZXIuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQlpZiAod29ya09yZGVyLmdldFByZWQoKSAhPSBudWxsCi0JCQkJCQkmJiBnZXRQYXJlbnQod29ya09yZGVyLmdldFByZWQoKSkgIT0gbnVsbCkgewotCQkJCQlwYXJlbnRQa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKHdvcmtPcmRlcik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAod29ya09yZGVyLmdldFByZWQoKSA9PSBudWxsCi0JCQkJCQl8fCBnZXRQYXJlbnQod29ya09yZGVyLmdldFByZWQoKSkgPT0gbnVsbCkgewotCQkJCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiSW52YWxpZCBXb3JrT3JkZXI6ICIgKyB3b3JrT3JkZXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcGFyZW50UGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZSh3b3JrT3JkZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHJlbW92ZWQgdW51c2VkIGRpYWdyYW1zCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBhcmVudFBrZy5nZXREaWFncmFtcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGl0ZXIubmV4dCgpOwotCQkJU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSBkaWFncmFtLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCWlmIChicmlkZ2UgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBicmlkZ2UpCi0JCQkJCQkuZ2V0RWxlbWVudCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCSYmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSAmJiBnZXRQYXJlbnQoKEFjdGl2aXR5KSBlbGVtZW50KSA9PSBudWxsKSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWludCBzaXplID0gZWxlbWVudHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJT2JqZWN0IGUgPSBlbGVtZW50cy5nZXQoaSk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBlOwotCQkJCWlmIChhY3QuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJCQkJcGtnLnNldE5hbWUoYWN0LmdldE5hbWUoKSk7Ci0JCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoYWN0KTsKLQkJCQkJTGlzdCBkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5zaXplKCk7IGorKykgewotCQkJCQkJT2JqZWN0IG9iaiA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmdldChqKTsKLQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJZGVzY3JpcHRvcnMuYWRkKG9iaik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbChkZXNjcmlwdG9ycyk7Ci0KLQkJCQkJcGFyZW50UGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQocGtnKTsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzIHBhY2thZ2UgY3JlYXRlZCBmb3IgYWN0aXZpdHk6Ci0JCQkJCS8vICciICsgYWN0LmdldE5hbWUoKSArICInIik7Ci0JCQkJfQotCQkJCXByZXBhcmVTYXZlKGFjdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNsZWFuVXBEYW5nbGluZ0Rlc2NyaXB0b3JzKFByb2Nlc3NQYWNrYWdlIHBrZykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50Ci0JCQkJCSYmICgoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudCkuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkgewotCQkJCWJvb2xlYW4gcmVtb3ZlID0gZmFsc2U7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQlpZiAoQXNzb2NpYXRpb25IZWxwZXIuZ2V0VGVhbVByb2ZpbGVzKAotCQkJCQkJCShSb2xlRGVzY3JpcHRvcikgZWxlbWVudCkuaXNFbXB0eSgpKSB7Ci0JCQkJCQlyZW1vdmUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCWlmIChBc3NvY2lhdGlvbkhlbHBlci5nZXREZWxpdmVyYWJsZURlc2NyaXB0b3JzKAotCQkJCQkJCShXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpLmlzRW1wdHkoKSkgewotCQkJCQkJcmVtb3ZlID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJCWlmICgoKFRlYW1Qcm9maWxlKSBlbGVtZW50KS5nZXRTdXBlclRlYW0oKSA9PSBudWxsKSB7Ci0JCQkJCQlyZW1vdmUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVtb3ZlID0gdHJ1ZTsKLQkJCQl9Ci0KLQkJCQlpZiAocmVtb3ZlKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTW92ZXMgdGhlIHByb2Nlc3MgcGFja2FnZXMgdG8gdGhlIHJpZ2h0IGxvY2F0aW9uIGluIHRoZSB0cmVlIGlmIG5lZWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGtnCi0JICogQHBhcmFtIGRhbmdsaW5nUGtncwotCSAqLwotCXByaXZhdGUgdm9pZCByZW9yZ2FuaXplKFByb2Nlc3NQYWNrYWdlIHBrZywgTGlzdCBkYW5nbGluZ1BrZ3MpIHsKLQkJQWN0aXZpdHkgYWN0ID0gZ2V0QWN0aXZpdHkocGtnKTsKLQkJaWYgKGFjdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIG1ha2Ugc3VyZSB0aGUgcGFja2FnZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgYWN0aXZpdHkncyBuYW1lCi0JCS8vCi0JCWlmICghcGtnLmdldE5hbWUoKS5lcXVhbHMoYWN0LmdldE5hbWUoKSkpIHsKLQkJCXBrZy5zZXROYW1lKGFjdC5nZXROYW1lKCkpOwotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgdGhlIGNvbnRhaW5lciBvZiBwa2cgaXMgYWN0dWFsbHkgaG9sZGluZyB0aGUgcGFyZW50IGFjdGl2aXR5Ci0JCS8vIG9mIGFjdAotCQkvLwotCQlFT2JqZWN0IHBhcmVudEFjdCA9IChFT2JqZWN0KSBnZXRQYXJlbnQoYWN0KTsKLQotCQlpZiAocGFyZW50QWN0ID09IG51bGwpIHsKLQkJCS8vIGNsZWFuVXBSZXNvdXJjZURlc2NyaXB0b3JzKHBrZyk7Ci0JCQkvLyBjbGVhblVwKHBrZyk7Ci0JCQkvLyByZXR1cm47Ci0JCQlkYW5nbGluZ1BrZ3MuYWRkKHBrZyk7Ci0JCX0gZWxzZSBpZiAocGFyZW50QWN0ICE9IGdldEFjdGl2aXR5KChQcm9jZXNzUGFja2FnZSkgcGtnLmVDb250YWluZXIoKSkpIHsKLQkJCS8vIG1vdmUgdGhlIHBhY2thZ2UgdG8gdGhlIHJpZ2h0IGxvY2F0aW9uLCB1bmRlciB0aGUgcHJvY2VzcyBwYWNrYWdlCi0JCQkvLyBvZiBwYXJlbnRBY3QKLQkJCS8vCi0JCQlQcm9jZXNzUGFja2FnZSBwYXJlbnRQa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIHBhcmVudEFjdC5lQ29udGFpbmVyKCk7Ci0JCQlwYXJlbnRQa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChwa2cpOwotCQl9Ci0KLQkJaWYgKHBhcmVudEFjdCAhPSBudWxsKSB7Ci0JCQljbGVhblVwRGFuZ2xpbmdEZXNjcmlwdG9ycyhwa2cpOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJcmVvcmdhbml6ZSgoUHJvY2Vzc1BhY2thZ2UpIGVsZW1lbnQsIGRhbmdsaW5nUGtncyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgTWFwIGdldEd1aWRUb01ldGhvZEVsZW1lbnRNYXAoKSB7Ci0JCWlmIChndWlkVG9NZXRob2RFbGVtZW50TWFwID09IG51bGwpIHsKLQkJCWd1aWRUb01ldGhvZEVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXJldHVybiBndWlkVG9NZXRob2RFbGVtZW50TWFwOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5CYXNpY05vdGlmaWVySW1wbCNlTm90aWZ5KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlTm90aWZ5KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdHJ5IHsKLQkJCXN1cGVyLmVOb3RpZnkobm90aWZpY2F0aW9uKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmxvZygiRVJST1Igbm90aWZ5aW5nIGNoYW5nZXM6IHJlc291cmNlU2V0PSIgKyB0aGlzICsgIiwgbm90aWZpY2F0aW9uPSIgKyBub3RpZmljYXRpb24pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTWFya2VyKEV4Y2VwdGlvbiBlKSB7Ci0JCXRyeSB7Ci0JCQkvLyBpbnNlcnQgcHJvYmxlbSBtYXJrZXIKLQkJCS8vCi0JCQltYXJrZXJNYW5hbmdlci5ub3RpZnlFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZXgpOwotCQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2FkaW5nKGJvb2xlYW4gYikgewotCQlsb2FkaW5nID0gYjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSUV4Y2VwdGlvbkNvbGxlY3RvciNjb2xsZWN0KGphdmEubGFuZy5FeGNlcHRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5RXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCWlmIChsb2FkaW5nUmVzb3VyY2VNYW5hZ2VyVHJlZSkgewotCQkJaWYgKGUgaW5zdGFuY2VvZiBSZXNvbHZlRXhjZXB0aW9uKSB7Ci0JCQkJaWYgKCgoUmVzb2x2ZUV4Y2VwdGlvbikgZSkuZXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBNdWx0aUZpbGVJT0V4Y2VwdGlvbikgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRyeSB7Ci0JCQlhZGRNYXJrZXIoZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJLy8KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIjcHJveHlSZXNvbHZlZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKE9iamVjdCBwcm94eSwgT2JqZWN0IHJlc29sdmVkKSB7Ci0JCWlmKHJlc29sdmVkIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJU3RyaW5nIGd1aWQgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRHdWlkKHJlc29sdmVkKTsKLQkJCWlmIChndWlkICE9IG51bGwpIHsKLQkJCQlnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkucHV0KGd1aWQsIHJlc29sdmVkKTsKLQkJCX0KLQkJfQotCQltYXJrZXJNYW5hbmdlci5wcm94eVJlc29sdmVkKHByb3h5LCByZXNvbHZlZCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGdldEVPYmplY3RCeUdVSUQoU3RyaW5nIGd1aWQpIHsKLQkJcmV0dXJuIChFT2JqZWN0KSBnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkuZ2V0KGd1aWQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JVW1hUmVzb3VyY2VTZXQjZ2V0RU9iamVjdChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksIGJvb2xlYW4pCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdChFT2JqZWN0IHJlc29sdmVyLCBVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQkvLyBsb25nIHN0YXJ0OwotCQkvLyBpZihNdWx0aUZpbGVTYXZlVXRpbC5QUk9GSUxFKSB7Ci0JCS8vIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCS8vIH0KLQotCQlVUkkgbm9ybWFsaXplZCA9ICgoTXVsdGlGaWxlVVJJQ29udmVydGVyKSBnZXRVUklDb252ZXJ0ZXIoKSkubm9ybWFsaXplKAotCQkJCXVyaSwgcmVzb2x2ZXIpOwotCQlpZiAobm9ybWFsaXplZCA9PSBudWxsKSB7Ci0JCQkvLyB3b3JrLWFyb3VuZCB0byBsb29rIHVwIGZvciBvYmplY3QgYnkgaXRzIEdVSUQgaW4gY2FzZSBpdCBoYWQgYmVlbgotCQkJLy8gbW92ZWQgdG8gb3RoZXIgcmVzb3VyY2UKLQkJCS8vCi0JCQlTdHJpbmcgZ3VpZCA9IHVyaS5mcmFnbWVudCgpOwotCQkJRU9iamVjdCBlT2JqZWN0ID0gZ2V0RU9iamVjdEJ5R1VJRChndWlkKTsKLQkJCWlmIChlT2JqZWN0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZU9iamVjdDsKLQkJCX0KLQotCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLm5vcm1hbGl6ZVVSSUVycm9yX21zZywKLQkJCQkJdXJpKTsKLQkJCXRocm93IG5ldyBVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24obXNnKTsKLQkJfQotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKG5vcm1hbGl6ZWQudHJpbUZyYWdtZW50KCksIGxvYWRPbkRlbWFuZCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZnJhZ21lbnQgPSBub3JtYWxpemVkLmZyYWdtZW50KCk7Ci0JCQlpZiAoZnJhZ21lbnQgPT0gbnVsbCB8fCBmcmFnbWVudC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJCX0KLQkJCUVPYmplY3QgZU9iamVjdCA9IHJlc291cmNlLmdldEVPYmplY3QoZnJhZ21lbnQpOwotCQkJaWYgKGVPYmplY3QgPT0gbnVsbCAmJiAhZnJhZ21lbnQuZXF1YWxzKHVyaS5hdXRob3JpdHkoKSkpIHsKLQkJCQkvLyB3b3JrLWFyb3VuZCB0byBsb29rIHVwIGZvciBvYmplY3QgYnkgaXRzIEdVSUQgaW4gY2FzZSBpdCBoYWQKLQkJCQkvLyBiZWVuIG1vdmVkCi0JCQkJLy8KLQkJCQlyZXR1cm4gZ2V0RU9iamVjdEJ5R1VJRChmcmFnbWVudCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZU9iamVjdDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gaWYoTXVsdGlGaWxlU2F2ZVV0aWwuUFJPRklMRSkgewotCQkvLwkJCQotCQkvLyB9Ci0JfQotCi0JLy8gLyoqCi0JLy8gKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4Y2VwdGlvbnMuCi0JLy8gKi8KLQkvLyBwdWJsaWMgTGlzdCBnZXRFeGNlcHRpb25zKCkgewotCS8vIHJldHVybiBleGNlcHRpb25zOwotCS8vIH0KLQotCXB1YmxpYyB2b2lkIGxvYWRPcHBvc2l0ZUZlYXR1cmVzKExpc3Qgb3Bwb3NpdGVGZWF0dXJlcykgewotCQlpbnQgbWF4ID0gb3Bwb3NpdGVGZWF0dXJlcy5zaXplKCkgLSAxOwotCQlpZiAobWF4IDwgMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUFycmF5TGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpLnZhbHVlcygpKTsKLQkJSGFzaFNldCBsb2FkZWRFbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXdoaWxlICghZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQkJCQkJZm9yIChpbnQgaSA9IG1heDsgaSA+IC0xOyBpLS0pIHsKLQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSA9ICgoT3Bwb3NpdGVGZWF0dXJlKSBvcHBvc2l0ZUZlYXR1cmVzCi0JCQkJCQkJCS5nZXQoaSkpLmdldFRhcmdldEZlYXR1cmUoKTsKLQkJCQkJCWlmIChlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpLmlzSW5zdGFuY2UoZWxlbWVudCkpIHsKLQkJCQkJCQlpZiAoZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkJSW50ZXJuYWxFTGlzdCBsaXN0ID0gKEludGVybmFsRUxpc3QpIGVsZW1lbnQKLQkJCQkJCQkJCQkuZUdldChlRmVhdHVyZSk7Ci0JCQkJCQkJCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJZWxlbWVudC5lR2V0KGVGZWF0dXJlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGdldHMgdGhlIG5ld2x5IGxvYWRlZCBlbGVtZW50cyB0byBsb2FkIHRoZWlyIG9wcG9zaXRlIGZlYXR1cmVzCi0JCQkvLwotCQkJbG9hZGVkRWxlbWVudHMuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCWVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkudmFsdWVzKCkpOwotCQkJZWxlbWVudHMucmVtb3ZlQWxsKGxvYWRlZEVsZW1lbnRzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWRPcHBvc2l0ZUZlYXR1cmVzKExpc3Qgb3Bwb3NpdGVGZWF0dXJlcywgU2V0IGRlbGV0ZWRHVUlEcykgewotCQlpbnQgbWF4ID0gb3Bwb3NpdGVGZWF0dXJlcy5zaXplKCkgLSAxOwotCQlpZiAobWF4IDwgMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUFycmF5TGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpLnZhbHVlcygpKTsKLQkJSGFzaFNldCBsb2FkZWRFbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXdoaWxlICghZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQkJCQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbXJFT2JqZWN0ID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudCk7Ci0JCQkJCWZvciAoaW50IGkgPSBtYXg7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gKChPcHBvc2l0ZUZlYXR1cmUpIG9wcG9zaXRlRmVhdHVyZXMKLQkJCQkJCQkJLmdldChpKSk7Ci0JCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUgPSBvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCQkJCQkJaWYgKGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkuaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCQkJCWlmIChlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCQlJbnRlcm5hbEVMaXN0IGxpc3QgPSAoSW50ZXJuYWxFTGlzdCkgZWxlbWVudAotCQkJCQkJCQkJCS5lR2V0KGVGZWF0dXJlKTsKLQkJCQkJCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJCQkJYm9vbGVhbiByZXNvbHZlID0gZmFsc2U7Ci0JCQkJCQkJCQljaGVja19yZXNvbHZlOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdAotCQkJCQkJCQkJCQkuYmFzaWNJdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCUludGVybmFsRU9iamVjdCBlID0gKEludGVybmFsRU9iamVjdCkgaXRlcmF0b3IKLQkJCQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCQkJaWYgKGUuZUlzUHJveHkoKSkgewotCQkJCQkJCQkJCQlTdHJpbmcgZ3VpZCA9IGUuZVByb3h5VVJJKCkKLQkJCQkJCQkJCQkJCQkuZnJhZ21lbnQoKTsKLQkJCQkJCQkJCQkJaWYgKGRlbGV0ZWRHVUlEcy5jb250YWlucyhndWlkKSkgewotCQkJCQkJCQkJCQkJcmVzb2x2ZSA9IHRydWU7Ci0JCQkJCQkJCQkJCQlicmVhayBjaGVja19yZXNvbHZlOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKHJlc29sdmUpIHsKLQkJCQkJCQkJCQlDb2xsZWN0aW9uPE9iamVjdD4gZGVsZXRlZEVsZW1lbnRzID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Ci0JCQkJCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCQlPYmplY3QgbyA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJCQkJaWYobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgZGVsZXRlZEdVSURzLmNvbnRhaW5zKCgoTWV0aG9kRWxlbWVudCkgbykuZ2V0R3VpZCgpKSkgewotCQkJCQkJCQkJCQkJZGVsZXRlZEVsZW1lbnRzLmFkZChvKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlmb3IgKE9iamVjdCBlIDogZGVsZXRlZEVsZW1lbnRzKSB7Ci0JCQkJCQkJCQkJCWlmKG9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCQkJCQkJbXJFT2JqZWN0Lm9wcG9zaXRlQWRkKG9wcG9zaXRlRmVhdHVyZSwgZSk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkJCQltckVPYmplY3QuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KG9wcG9zaXRlRmVhdHVyZSwgZSk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9CQkJCQkJCQkJCQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KGVGZWF0dXJlLCBmYWxzZSk7Ci0JCQkJCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkgewotCQkJCQkJCQkJSW50ZXJuYWxFT2JqZWN0IGUgPSAoSW50ZXJuYWxFT2JqZWN0KSB2YWx1ZTsKLQkJCQkJCQkJCWlmIChlLmVJc1Byb3h5KCkpIHsKLQkJCQkJCQkJCQlTdHJpbmcgZ3VpZCA9IGUuZVByb3h5VVJJKCkuZnJhZ21lbnQoKTsKLQkJCQkJCQkJCQlpZiAoZGVsZXRlZEdVSURzLmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJCQkJCQkJCU9iamVjdCBvID0gZWxlbWVudC5lR2V0KGVGZWF0dXJlKTsKLQkJCQkJCQkJCQkJaWYob3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJCQkJCQltckVPYmplY3Qub3Bwb3NpdGVBZGQob3Bwb3NpdGVGZWF0dXJlLCBvKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQkJCW1yRU9iamVjdC5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5wdXQob3Bwb3NpdGVGZWF0dXJlLCBvKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIGdldHMgdGhlIG5ld2x5IGxvYWRlZCBlbGVtZW50cyB0byBsb2FkIHRoZWlyIG9wcG9zaXRlIGZlYXR1cmVzCi0JCQkvLwotCQkJbG9hZGVkRWxlbWVudHMuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCWVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkudmFsdWVzKCkpOwotCQkJZWxlbWVudHMucmVtb3ZlQWxsKGxvYWRlZEVsZW1lbnRzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1VucmVzb2x2ZWRQcm94eSgpIHsKLQkJcmV0dXJuIG1hcmtlck1hbmFuZ2VyLmhhc1VucmVzb2x2ZWRQcm94eSgpOwotCX0KLQotCXByb3RlY3RlZCBNYXAgZ2V0VVJJVG9UZW1wVVJJTWFwKCkgewotCQlpZiAoVVJJVG9UZW1wVVJJTWFwID09IG51bGwpIHsKLQkJCVVSSVRvVGVtcFVSSU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQotCQlyZXR1cm4gVVJJVG9UZW1wVVJJTWFwOwotCX0KLQotCXB1YmxpYyBVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyIGdldE1hcmtlck1hbmFuZ2VyKCkgewotCQlyZXR1cm4gbWFya2VyTWFuYW5nZXI7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjaGVja01vZGlmeShDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXMpIHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24gewotCQlpZighcmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJUmVzb3VyY2VbXSByZXNvdXJjZUFycmF5ID0gbmV3IFJlc291cmNlW3Jlc291cmNlcy5zaXplKCldOwotCQkJcmVzb3VyY2VzLnRvQXJyYXkocmVzb3VyY2VBcnJheSk7Ci0JCQljaGVja01vZGlmeShyZXNvdXJjZUFycmF5LCBQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29udGV4dCgpLypNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkqLyk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0I2NoZWNrTW9kaWZ5KG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VbXSwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja01vZGlmeShSZXNvdXJjZVtdIHJlc291cmNlcywgT2JqZWN0IGNvbnRleHQpIHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24gewkJCi0JCU11bHRpRmlsZVNhdmVVdGlsLmRvQ2hlY2tNb2RpZnkoQXJyYXlzLmFzTGlzdChyZXNvdXJjZXMpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0I2NoZWNrTW9kaWZ5KGphdmEudXRpbC5Db2xsZWN0aW9uPEVPYmplY3Q+LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KENvbGxlY3Rpb248RU9iamVjdD4gZU9iamVjdHMsIE9iamVjdCBjb250ZXh0KSB7Ci0JCUhhc2hTZXQgcGF0aFNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVPYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBvLmVSZXNvdXJjZSgpOwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpID09IHRoaXMpIHsKLQkJCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgbWZSZXNvdXJjZSA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlc291cmNlOwotCQkJCWlmKCFtZlJlc291cmNlLmhhc1RlbXBVUkkoKSkgewotCQkJCQlTdHJpbmcgcGF0aCA9IG1mUmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0JCQkJCXBhdGhTZXQuYWRkKHBhdGgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZihwYXRoU2V0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJU3RyaW5nW10gcGF0aHMgPSBuZXcgU3RyaW5nW3BhdGhTZXQuc2l6ZSgpXTsKLQkJcGF0aFNldC50b0FycmF5KHBhdGhzKTsKLQkJcmV0dXJuIEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuY2hlY2tNb2RpZnkocGF0aHMsIGNvbnRleHQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjZ2V0UGVyc2lzdGVyKCkKLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlQZXJzaXN0ZXIgZ2V0UGVyc2lzdGVyKCkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0I3VubG9hZChvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UsIGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIGJvb2xlYW4gdW5sb2FkKFJlc291cmNlIHJlc291cmNlLCBNYXAgb3B0aW9ucykgewotCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJcmV0dXJuIHVubG9hZFdpdGhvdXRSZW1vdmUoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0I3VubG9hZCgpCi0JICovCi0JcHVibGljIHZvaWQgdW5sb2FkKCkgewotCQlyZXNldCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjZ2V0Rmlyc3RNZXRob2RMaWJyYXJ5KCkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRGaXJzdE1ldGhvZExpYnJhcnkoKSB7Ci0JCXJldHVybiBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldCNnZXRNZXRob2RMaWJyYXJpZXMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1ldGhvZExpYnJhcmllcygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmKGxpYiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChsaWIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjbG9hZE1ldGhvZExpYnJhcmllcyhvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRNZXRob2RMaWJyYXJpZXMoVVJJIHVyaSwgTWFwPD8sID8+IHBhcmFtZXRlcnMpIHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24gewotCQl0cnkgewotCQkJbG9hZExpYnJhcnkodXJpLnRvRmlsZVN0cmluZygpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmKGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0JCQkJdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pZTsKLQkJCX0KLQkJCXRocm93IG5ldyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24oZSk7Ci0JCX0KLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjZ2V0UGVyc2lzdGVuY2VUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBlcnNpc3RlbmNlVHlwZSgpIHsKLQkJcmV0dXJuIFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjdW5sb2FkKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVubG9hZChFT2JqZWN0IG9iamVjdCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG9iamVjdC5lUmVzb3VyY2UoKTsKLQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCSgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKXJlc291cmNlKS51bmxvYWRlZCgoSW50ZXJuYWxFT2JqZWN0KSBvYmplY3QpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldCNyZWxvYWRPYmplY3RzKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIHJlbG9hZE9iamVjdHMoQ29sbGVjdGlvbiBvYmplY3RzKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKElSZXNvdXJjZSB3c1JlcykgewotCQlJUGF0aCBwYXRoID0gd3NSZXMuZ2V0TG9jYXRpb24oKTsKLQkJcmV0dXJuIHBhdGggIT0gbnVsbCA/IFBlcnNpc3RlbmNlVXRpbC5nZXRSZXNvdXJjZShwYXRoLCB0aGlzKSA6IG51bGw7Ci0JfQotCi0vLwlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0Q29udGFpbmVkUmVzb3VyY2VzKElSZXNvdXJjZSB3c1JlcykgewotLy8JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwkJCi0vLwl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGxvYWROZXdSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBsb2FkQ29uZmlndXJhdGlvbnMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaGFuZGxlTGlicmFyeU1vdmVkKFN0cmluZyBuZXdGb2xkZXIpIHsKLQkJUGVyc2lzdGVuY2VVdGlsLnJlcGxhY2VVUklQcmVmaXgobmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oZ2V0UmVzb3VyY2VzKCkpLCBsaWJGb2xkZXJQYXRoLnRvT1NTdHJpbmcoKSwgbmV3Rm9sZGVyKTsKLQkJCi0JCS8vIGNsZWFyIGNhY2hlZCByZXNvbHZlZCBVUkkgaW4gYWxsIFJlc291cmNlRGVzY3JpcHRvcnMKLQkJLy8KLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJvb3RSZXNvdXJjZU1hbmFnZXIoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IocmVzTWdyLCBmYWxzZSkgewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IChSZXNvdXJjZU1hbmFnZXIpIG9iamVjdDsKLQkJCQlyZXR1cm4gcmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkuaXRlcmF0b3IoKTsKLQkJCX0KLQotCQl9OwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlSZXNvdXJjZU1hbmFnZXIgbWdyID0gKFJlc291cmNlTWFuYWdlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJZm9yKFJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjIDogbWdyLmdldFJlc291cmNlRGVzY3JpcHRvcnMoKSkgewotCQkJCXJlc0Rlc2MuY2xlYXJSZXNvbHZlZFVSSSgpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlU2F2ZVV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlU2F2ZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM4NjMyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVNhdmVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuTGlicmFyeVJlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuQ2FsZW5kYXI7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aXRoIHN0YXRpYyByb3V0aW5lcyBmb3IgWE1JIHBlcnNpc3RlbmNlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTXVsdGlGaWxlU2F2ZVV0aWwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9NT0RFTF9GSUxFTkFNRSA9ICJtb2RlbC54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTlRFTlRfRklMRU5BTUUgPSAiY29udGVudC54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0xJQlJBUllfTU9ERUxfRklMRU5BTUUgPSAibGlicmFyeS54bWkiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QTFVHSU5fRVhQT1JUX0ZJTEVOQU1FID0gImV4cG9ydC54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BMVUdJTl9NT0RFTF9GSUxFTkFNRSA9ICJwbHVnaW4ueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9GSUxFX0VYVEVOU0lPTiA9ICIueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCUkFSWV9GSUxFX0VYVEVOU0lPTiA9ICJ1bWEiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBBQklMSVRZX1BBVFRFUk5fUEFUSCA9ICJjYXBhYmlsaXR5cGF0dGVybnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxJVkVSWV9QUk9DRVNTX1BBVEggPSAiZGVsaXZlcnlwcm9jZXNzZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTX0NPTlRSSUJVVElPTl9QQVRIID0gInByb2Nlc3Njb250cmlidXRpb25zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0NPTkZJR1VSQVRJT05fRk9MREVSX05BTUUgPSAiY29uZmlndXJhdGlvbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gUFJPRklMRSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBkYXRlRm9ybWF0dGVyID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoCi0JCQkieXlNTWRkSEhtbXNzLlMiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRGaWxlTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobmFtZS5pbmRleE9mKCcvJykgIT0gLTEgfHwgbmFtZS5pbmRleE9mKCdcXCcpICE9IC0xCi0JCQkJfHwgbmFtZS5pbmRleE9mKCc6JykgIT0gLTEgfHwgbmFtZS5pbmRleE9mKCcqJykgIT0gLTEKLQkJCQl8fCBuYW1lLmluZGV4T2YoJz8nKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJyInKSAhPSAtMQotCQkJCXx8IG5hbWUuaW5kZXhPZignPCcpICE9IC0xIHx8IG5hbWUuaW5kZXhPZignPicpICE9IC0xCi0JCQkJfHwgbmFtZS5pbmRleE9mKCd8JykgIT0gLTEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHJCdWZmID0gbmV3IFN0cmluZ0J1ZmZlcihTdHJpbmcudmFsdWVPZihlLmdldE5hbWUoKSkpOwotCQlmb3IgKGUgPSAoTWV0aG9kRWxlbWVudCkgKChFT2JqZWN0KSBlKS5lQ29udGFpbmVyKCk7IGUgIT0gbnVsbDsgZSA9IChNZXRob2RFbGVtZW50KSAoKEVPYmplY3QpIGUpCi0JCQkJLmVDb250YWluZXIoKSkgewotCQkJc3RyQnVmZi5pbnNlcnQoMCwgU3RyaW5nLnZhbHVlT2YoZS5nZXROYW1lKCkpICsgIiA+ICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHN0ckJ1ZmYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVEaXJOYW1lKE1ldGhvZEVsZW1lbnQgb2JqKSB7Ci0JCVN0cmluZyBuYW1lID0gKChNZXRob2RFbGVtZW50KSBvYmopLmdldE5hbWUoKTsKLQkJaWYgKGlzVmFsaWRGaWxlTmFtZShuYW1lKSkKLQkJCXJldHVybiBuYW1lOwotCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oTkxTLmJpbmQoCi0JCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMuaW52YWxpZE5hbWVFcnJvcl9tc2csIG5hbWUpLCBvYmopOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRU9iamVjdCByZXNvbHZlKEVPYmplY3QgcHJveHkpIHsKLQkJaWYgKCEocHJveHkgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpKQotCQkJcmV0dXJuIHByb3h5OwotCQlJbnRlcm5hbEVPYmplY3Qgb2JqID0gKEludGVybmFsRU9iamVjdCkgcHJveHk7Ci0JCWlmIChvYmouZVByb3h5VVJJKCkgPT0gbnVsbCkKLQkJCXJldHVybiBwcm94eTsKLQkJWE1JUmVzb3VyY2VJbXBsIHJlcyA9IG5ldyBYTUlSZXNvdXJjZUltcGwob2JqLmVQcm94eVVSSSgpKTsKLQkJdHJ5IHsKLQkJCXJlcy5sb2FkKG51bGwpOwotCQkJcmV0dXJuIFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlcyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHByb3h5OwotCX0KLQotCXN0YXRpYyBSZXNvdXJjZSBzYXZlKEVPYmplY3QgbywgVVJJIHVyaSwgTWFwIG9wdGlvbnMpIHsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBvLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSA9IHNhdmUocmVzb3VyY2VTZXQsIG8sIHVyaSwgb3B0aW9ucyk7Ci0KLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCkgewotCQkJb3B0aW9ucyA9ICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSByZXNvdXJjZVNldCkKLQkJCQkJLmdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQl9Ci0JCVN0cmluZyBzdHIgPSAoU3RyaW5nKSBvcHRpb25zCi0JCQkJLmdldChNdWx0aUZpbGVYTUlTYXZlSW1wbC5SRUZSRVNIX05FV19SRVNPVVJDRSk7Ci0JCWlmIChzdHIgIT0gbnVsbCAmJiBCb29sZWFuLnZhbHVlT2Yoc3RyKS5ib29sZWFuVmFsdWUoKSkgewotCQkJLy8gbm90aWZ5IFJlZnJlc2hKb2IgdGhlIHRoaXMgcmVzb3VyY2UgaXMgc2F2ZWQgc28gaXQgd2lsbCBub3QgYmUKLQkJCS8vIHJlbG9hZGVkIGFmdGVyIHJlZnJlc2hpbmcgaXQKLQkJCS8vCi0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzb3VyY2VTYXZlZChyZXNvdXJjZSk7Ci0KLQkJCS8vIHJlZnJlc2ggdGhlIG5ld2x5IGNyZWF0ZWQgcmVzb3VyY2Ugc28gaXQgaXMgaW4gc3luY2ggd2l0aCB0aGUKLQkJCS8vIHdvcmtzcGFjZQotCQkJLy8KLQkJCUZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVmcmVzaChyZXNvdXJjZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhblNhdmVUb2dldGhlcihNYXAgb3B0aW9ucywgT2JqZWN0IG9iaikgewotCQlTZXQgc2F2ZVRvZ2V0aGVyQ2xhc3NlcyA9IChTZXQpIG9wdGlvbnMKLQkJCQkuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlNBVkVfVE9HRVRIRVJfQ0xBU1NfU0VUKTsKLQkJaWYgKHNhdmVUb2dldGhlckNsYXNzZXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2F2ZVRvZ2V0aGVyQ2xhc3Nlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVDbGFzcyBlQ2xzID0gKEVDbGFzcykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZUNscy5pc0luc3RhbmNlKG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIG9iamVjdCB0byB0aGUgZ2l2ZW4gcmVzb3VyY2Ugd2hpbGUgc3RpbGwgcHJlc2VydmluZwotCSAqIG9iamVjdCdzIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIG8KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFRvKFJlc291cmNlIHJlc291cmNlLCBNdWx0aVJlc291cmNlRU9iamVjdCBvKSB7Ci0JCUJhc2ljRUxpc3QgY29udGVudHMgPSAoKEJhc2ljRUxpc3QpIHJlc291cmNlLmdldENvbnRlbnRzKCkpOwotCQlpZiAoY29udGVudHMuaXNFbXB0eSgpKSB7Ci0JCQkvLyB0aGlzIHdpbGwgZmxhZyByZXNvdXJjZSBhcyBsb2FkZWQKLQkJCS8vCi0JCQljb250ZW50cy5jbGVhcigpOwotCi0JCQljb250ZW50cy5zZXREYXRhKDEsIG5ldyBPYmplY3RbXSB7IG8gfSk7Ci0JCX0gZWxzZSB7Ci0JCQlPYmplY3RbXSBkYXRhID0gY29udGVudHMudG9BcnJheSgpOwotCQkJT2JqZWN0W10gbmV3RGF0YSA9IG5ldyBPYmplY3RbZGF0YS5sZW5ndGggKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMCwgbmV3RGF0YSwgMCwgZGF0YS5sZW5ndGgpOwotCQkJbmV3RGF0YVtkYXRhLmxlbmd0aF0gPSBvOwotCQkJY29udGVudHMuc2V0RGF0YShuZXdEYXRhLmxlbmd0aCwgbmV3RGF0YSk7Ci0JCX0KLQkJby5lU2V0UmVzb3VyY2UoKFJlc291cmNlLkludGVybmFsKSByZXNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgYSBuZXcgY29udGFpbmVkIEVPYmplY3QgaW4gaXRzIG93biBuZXcgcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIG8KLQkgKiBAcGFyYW0gdXJpCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgc2F2ZShSZXNvdXJjZVNldCByZXNvdXJjZVNldCwKLQkJCUVPYmplY3QgbywgVVJJIHVyaSwgTWFwIG9wdGlvbnMpIHsKLQkJcmV0dXJuIHNhdmUocmVzb3VyY2VTZXQsIG8sIHVyaSwgb3B0aW9ucywgdHJ1ZSk7Ci0JfQotCQotCXN0YXRpYyBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgc2F2ZShSZXNvdXJjZVNldCByZXNvdXJjZVNldCwKLQkJCUVPYmplY3QgbywgVVJJIHVyaSwgTWFwIG9wdGlvbnMsIGJvb2xlYW4gcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCS8vIERldGFjaCB0aGUgb2JqZWN0IGZyb20gY29udGFpbmVyIHJlc291cmNlCi0JCS8vCi0JCU11bHRpUmVzb3VyY2VFT2JqZWN0IG1yRU9iaiA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgbzsKLQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIGN1cnJlbnRSZXNvdXJjZSA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIG8KLQkJCQkuZVJlc291cmNlKCk7Ci0KLQkJaWYgKGN1cnJlbnRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQljdXJyZW50UmVzb3VyY2UuZGV0YWNoZWQobyk7Ci0JCX0KLQotCQlMaXN0IG5ld1Jlc291cmNlRGVzY3JpcHRvcnMgPSBudWxsOwotCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSAoU2V0KSBvcHRpb25zCi0JCQkJLmdldChNdWx0aUZpbGVYTUlTYXZlSW1wbC5NT0RJRklFRF9SRVNPVVJDRV9TRVQpOwotCi0JCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXMgPSBudWxsOwotCQlpZiAoY2FuU2F2ZVRvZ2V0aGVyKG9wdGlvbnMsIG8pKSB7Ci0JCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgbWZSZXNvdXJjZVNldCA9ICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSByZXNvdXJjZVNldCk7Ci0KLQkJCS8vIGlmIHRoZSB1cmkgaGFzIGEgdGVtcG9yYXJ5IFVSSSwgdXNlIGl0IGluc3RlYWQgdG8gbG9jYXRlIHRoZQotCQkJLy8gcmVzb3VyY2UgdGhhdCBpcyBpbiBwcm9jZXNzIG9mIHNhdmluZwotCQkJLy8KLQkJCVVSSSB0ZW1wVVJJID0gKFVSSSkgbWZSZXNvdXJjZVNldC5nZXRVUklUb1RlbXBVUklNYXAoKS5nZXQodXJpKTsKLQkJCWlmICh0ZW1wVVJJICE9IG51bGwpIHsKLQkJCQl1cmkgPSB0ZW1wVVJJOwotCQkJfQotCi0JCQlyZXMgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBtZlJlc291cmNlU2V0LmdldFJlc291cmNlKHVyaSk7Ci0JCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQlpZiAoIXJlcy5nZXRDb250ZW50cygpLmNvbnRhaW5zKG8pKSB7Ci0JCQkJCWlmIChyZXMuZ2V0RmluYWxVUkkoKSA9PSByZXMuZ2V0VVJJKCkpIHsKLQkJCQkJCWlmIChNdWx0aUZpbGVYTUlTYXZlSW1wbC5jaGVja01vZGlmeVJlcXVpcmVkKG9wdGlvbnMpKSB7Ci0JCQkJCQkJLy8gbm90IGEgdGVtcCBmaWxlIG9mIGZhaWwtc2FmZSBwZXJzaXN0ZW5jZQotCQkJCQkJCS8vIHRyYW5zYWN0aW9uCi0JCQkJCQkJLy8gY2hlY2sgZm9yIHdyaXRlYWJsZQotCQkJCQkJCS8vCi0JCQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuY2hlY2tNb2RpZnkocmVzKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWFkZFRvKHJlcywgbXJFT2JqKTsKLQotCQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZihyZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIpIHsKLQkJCQkJCQkvLyByZWdpc3RlciB0aGlzIG5ldyBvYmplY3Qgd2l0aCBSZXNvdXJjZU1hbmFnZXIKLQkJCQkJCQkvLwotCQkJCQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXJGb3IobywKLQkJCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCQkJCQlkZXNjID0gcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKHJlc01nciwgbywgcmVzCi0JCQkJCQkJCQkuZ2V0RmluYWxVUkkoKSk7Ci0JCQkJCQkJaWYgKGRlc2MgIT0gbnVsbCAmJiBtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyZXNNZ3IuZVJlc291cmNlKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJcmVzLnNldE1vZGlmaWVkKHRydWUpOwotCQkJCQkJbWZSZXNvdXJjZVNldC5zYXZlKHJlcywgb3B0aW9ucywgZmFsc2UpOwotCi0JCQkJCQlyZXMuYXR0YWNoZWRBbGwobyk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyByb2xsYmFjawotCQkJCQkJLy8KLQotCQkJCQkJLy8gcmVtb3ZlIHRoaXMgb2JqZWN0IGZyb20gdGhlIHJlc291cmNlCi0JCQkJCQlyZXMuZ2V0Q29udGVudHMoKS5yZW1vdmUobXJFT2JqKTsKLQkJCQkJCW1yRU9iai5lU2V0UmVzb3VyY2UoKFJlc291cmNlLkludGVybmFsKSBudWxsKTsKLQotCQkJCQkJLy8gcmVtb3ZlIHRoZSBjcmVhdGVkIFJlc291cmNlRGVzY3JpcHRvcgotCQkJCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoZGVzYyk7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIHJlLWF0dGFjaCB0byBjb250YWluZXIgcmVzb3VyY2UKLQkJCQkJCWlmIChjdXJyZW50UmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCWN1cnJlbnRSZXNvdXJjZS5hdHRhY2hlZChvKTsKLQkJCQkJCX0KLQotCQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gcmVzOwotCQkJfQotCQl9Ci0KLQkJcmVzID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJYWRkVG8ocmVzLCBtckVPYmopOwotCQlpZihtckVPYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCWFkZFJlc291cmNlTWFuYWdlcihyZXMpOwotCQl9Ci0KLQkJTWFwIG9ialRvQ29udGFpbmVyTWFwID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmKHJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcikgewotCQkJCW5ld1Jlc291cmNlRGVzY3JpcHRvcnMgPSByZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIocmVzLAotCQkJCQltb2RpZmllZFJlc291cmNlcyk7Ci0JCQl9Ci0KLQkJCS8vIGJhY2sgdXAgdGhlIGNvbnRhaW5lciByZWZlcmVuY2VzIGFuZCBzZXQgY29udGVudCBvYmplY3QncwotCQkJLy8gY29udGFpbmVyIHRvIG51bGwKLQkJCS8vCi0JCQlvYmpUb0NvbnRhaW5lck1hcCA9IHJlbW92ZUNvbnRhaW5lcnMocmVzKTsKLQotCQkJcmVzLnNhdmUob3B0aW9ucyk7Ci0KLQkJCXJlcy5hdHRhY2hlZEFsbChvKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0KLQkJCS8vIHJvbGxiYWNrCi0JCQkvLwotCi0JCQkvLyByZW1vdmUgdGhlIGZhaWxlZCByZW91c3JjZSBmcm9tIHRoZSByZXNvdXJjZSBzZXQKLQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLnJlbW92ZShyZXMpOwotCQkJbXJFT2JqLmVTZXRSZXNvdXJjZSgoUmVzb3VyY2UuSW50ZXJuYWwpIG51bGwpOwotCi0JCQkvLyByZW1vdmUgdGhlIGNyZWF0ZWQgUmVzb3VyY2VEZXNjcmlwdG9ycwotCQkJaWYobmV3UmVzb3VyY2VEZXNjcmlwdG9ycyAhPSBudWxsICYmICFuZXdSZXNvdXJjZURlc2NyaXB0b3JzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ld1Jlc291cmNlRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUoKEVPYmplY3QpIGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHJlLWF0dGFjaCB0byBjb250YWluZXIgcmVzb3VyY2UKLQkJCWlmIChjdXJyZW50UmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCWN1cnJlbnRSZXNvdXJjZS5hdHRhY2hlZChvKTsKLQkJCX0KLQotCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIHJlc3RvcmUgdGhlIGNvbnRhaW5lciByZWZlcmVuY2VzIGZvciB0aGUgY29udGVudCBvYmplY3RzCi0JCQkvLwotCQkJcmVzdG9yZUNvbnRhaW5lcnMocmVzLCBvYmpUb0NvbnRhaW5lck1hcCk7Ci0JCX0KLQotCQlpZihyZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIpIHsKLQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBhZGROZXdSZXNvdXJjZU1hbmFnZXIocmVzKTsKLQkJCWlmIChyZXNNZ3IgPT0gbnVsbCkgewotCQkJCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCS8vIGNyZWF0ZSBuZXcgUmVzb3VyY2VNYW5hZ2VyIGZvciBuZXcgTWV0aG9kUGx1Z2luCi0JCQkJCS8vCi0JCQkJCXJlc01nciA9IGdldFJlc291cmNlTWFuYWdlckZvcihvLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc01nci5lQ29udGFpbmVyKCkuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0KLQkJcmVzLnVwZGF0ZVRpbWVTdGFtcHMoKTsKLQotCQlyZXR1cm4gcmVzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE1hcCByZW1vdmVDb250YWluZXJzKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWludCBzaXplID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5zaXplKCk7Ci0JCU1hcCBvYmpUb0NvbnRhaW5lck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlNdWx0aVJlc291cmNlRU9iamVjdCBtdWx0aVJlc0VPYmogPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc291cmNlCi0JCQkJCS5nZXRDb250ZW50cygpLmdldChpKTsKLQkJCUludGVybmFsRU9iamVjdCBjb250YWluZXIgPSAoSW50ZXJuYWxFT2JqZWN0KSBtdWx0aVJlc0VPYmoKLQkJCQkJLmVDb250YWluZXIoKTsKLQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCW9ialRvQ29udGFpbmVyTWFwLnB1dChtdWx0aVJlc0VPYmosIGNvbnRhaW5lcik7Ci0JCQkJbXVsdGlSZXNFT2JqLmVCYXNpY1NldENvbnRhaW5lcihudWxsLCBtdWx0aVJlc0VPYmoKLQkJCQkJCS5lQ29udGFpbmVyRmVhdHVyZUlEKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBvYmpUb0NvbnRhaW5lck1hcDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb250YWluZXJzIG9mIG9iamVjdHMgaW4gcmVzb3VyY2UncyBjb250ZW50cwotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gbWFwIG9mIG9iamVjdCB0byBjb250YWluZXIgZW50cmllcwotCSAqLwotCXN0YXRpYyBNYXAgZ2V0Q29udGFpbmVycyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpbnQgc2l6ZSA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuc2l6ZSgpOwotCQlNYXAgb2JqVG9Db250YWluZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbXVsdGlSZXNFT2JqID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvdXJjZQotCQkJCQkuZ2V0Q29udGVudHMoKS5nZXQoaSk7Ci0JCQlJbnRlcm5hbEVPYmplY3QgY29udGFpbmVyID0gKEludGVybmFsRU9iamVjdCkgbXVsdGlSZXNFT2JqCi0JCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQlvYmpUb0NvbnRhaW5lck1hcC5wdXQobXVsdGlSZXNFT2JqLCBjb250YWluZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBvYmpUb0NvbnRhaW5lck1hcDsKLQotCX0KLQotCS8qKgotCSAqIFJlc3RvcmVzIHRoZSBjb250YWluZXJzIG9mIHRoZSBvYmplY3RzIGluIHJlc291cmNlJ3MgY29udGVudHMgdGhhdAotCSAqIHByZXZpb3VzbHkgc2F2ZWQgaW4gYSBtYXAgcmV0dXJuZWQgZnJvbSBnZXRDb250YWluZXJzKFJlc291cmNlIHJlc291cmNlKQotCSAqIG9yIHJlbW92ZUNvbnRhaW5lcnMoUmVzb3VyY2UgcmVzb3VyY2UpCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIG9ialRvQ29udGFpbmVyTWFwCi0JICogQHNlZSAjZ2V0Q29udGFpbmVycyhSZXNvdXJjZSkKLQkgKiBAc2VlICNyZW1vdmVDb250YWluZXJzKFJlc291cmNlKQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVzdG9yZUNvbnRhaW5lcnMoUmVzb3VyY2UgcmVzb3VyY2UsCi0JCQlNYXAgb2JqVG9Db250YWluZXJNYXApIHsKLQkJaW50IHNpemUgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IG11bHRpUmVzRU9iaiA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb3VyY2UKLQkJCQkJLmdldENvbnRlbnRzKCkuZ2V0KGkpOwotCQkJSW50ZXJuYWxFT2JqZWN0IGNvbnRhaW5lciA9IChJbnRlcm5hbEVPYmplY3QpIG9ialRvQ29udGFpbmVyTWFwCi0JCQkJCS5nZXQobXVsdGlSZXNFT2JqKTsKLQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCW11bHRpUmVzRU9iai5lQmFzaWNTZXRDb250YWluZXIoY29udGFpbmVyLCBtdWx0aVJlc0VPYmoKLQkJCQkJCS5lQ29udGFpbmVyRmVhdHVyZUlEKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrTW9kaWZ5KFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWNoZWNrTW9kaWZ5KENvbGxlY3Rpb25zLnNpbmdsZXRvbihyZXNvdXJjZSkpOwotCX0KLQotCXN0YXRpYyB2b2lkIGRvQ2hlY2tNb2RpZnkoQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IHBhdGhMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCS8vIHNraXAgY2hlY2tpbmcgb24gcmVzb3VyY2UgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgc2F2ZWQgdG8gYSB0ZW1wb3JhcnkKLQkJCS8vIGZpbGUKLQkJCS8vCi0JCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCAmJiAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbClyZXNvdXJjZSkuaGFzVGVtcFVSSSgpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlwYXRoTGlzdC5hZGQoRmlsZU1hbmFnZXIudG9GaWxlU3RyaW5nKHJlc291cmNlLmdldFVSSSgpKSk7Ci0JCX0KLQkJaWYoIXBhdGhMaXN0LmlzRW1wdHkoKSkgewotCQkJU3RyaW5nW10gcGF0aHMgPSBuZXcgU3RyaW5nW3BhdGhMaXN0LnNpemUoKV07Ci0JCQlwYXRoTGlzdC50b0FycmF5KHBhdGhzKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jaGVja01vZGlmeShwYXRocywKLQkJCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvbnRleHQoKS8qTXNnQm94LmdldERlZmF1bHRTaGVsbCgpKi8pOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IFVtYVV0aWwuZ2V0TWVzc2FnZShzdGF0dXMpOwotCQkJCWlmIChtc2cgPT0gbnVsbCkgewotCQkJCQltc2cgPSBOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5tb2RpZnlGaWxlRXJyb3JfbXNnLCBBcnJheXMKLQkJCQkJCQkuYXNMaXN0KHBhdGhzKSk7Ci0JCQkJfQotCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihtc2cpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja01vZGlmeShDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXMpIHsKLQkJTWFwPElMaWJyYXJ5UmVzb3VyY2VTZXQsIENvbGxlY3Rpb248UmVzb3VyY2U+PiBsaWJSZXNvdXJjZVNldFRvUmVzb3VyY2VzTWFwID0gbmV3IEhhc2hNYXA8SUxpYnJhcnlSZXNvdXJjZVNldCwgQ29sbGVjdGlvbjxSZXNvdXJjZT4+KCk7Ci0JCUNvbGxlY3Rpb248UmVzb3VyY2U+IG90aGVyUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJaWYocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlU2V0KSB7Ci0JCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gY29sbGVjdGlvbiA9IGxpYlJlc291cmNlU2V0VG9SZXNvdXJjZXNNYXAuZ2V0KHJlc291cmNlU2V0KTsKLQkJCQlpZihjb2xsZWN0aW9uID09IG51bGwpIHsKLQkJCQkJY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCQkJCWxpYlJlc291cmNlU2V0VG9SZXNvdXJjZXNNYXAucHV0KChJTGlicmFyeVJlc291cmNlU2V0KSByZXNvdXJjZVNldCwgY29sbGVjdGlvbik7CQkJCQkKLQkJCQl9Ci0JCQkJY29sbGVjdGlvbi5hZGQocmVzb3VyY2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJb3RoZXJSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCQlpZighbGliUmVzb3VyY2VTZXRUb1Jlc291cmNlc01hcC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PElMaWJyYXJ5UmVzb3VyY2VTZXQsIENvbGxlY3Rpb248UmVzb3VyY2U+Pj4gaXRlciA9IGxpYlJlc291cmNlU2V0VG9SZXNvdXJjZXNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnk8SUxpYnJhcnlSZXNvdXJjZVNldCwgQ29sbGVjdGlvbjxSZXNvdXJjZT4+IGVudHJ5ID0gaXRlci5uZXh0KCk7Ci0JCQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGVudHJ5LmdldEtleSgpOwkJCQotCQkJCVJlc291cmNlW10gcmVzb3VyY2VBcnJheSA9IG5ldyBSZXNvdXJjZVtlbnRyeS5nZXRWYWx1ZSgpLnNpemUoKV07Ci0JCQkJZW50cnkuZ2V0VmFsdWUoKS50b0FycmF5KHJlc291cmNlQXJyYXkpOwotCQkJCXRyeSB7Ci0JCQkJCXJlc291cmNlU2V0LmNoZWNrTW9kaWZ5KHJlc291cmNlQXJyYXksIFBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb250ZXh0KCkvKk1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSovKTsKLQkJCQl9IGNhdGNoIChMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZighb3RoZXJSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlkb0NoZWNrTW9kaWZ5KG90aGVyUmVzb3VyY2VzKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tPdXRPZlN5bmNoKENvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlcywgTWFwIHNhdmVPcHRpb25zKSB7Ci0JCUNvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlc1RvQ2hlY2tPdXRPZlN5bmNoOwotCQlDb2xsZWN0aW9uPFJlc291cmNlPiBvdmVyd3JpdGFibGVSZXNvdXJjZXMgPSAoQ29sbGVjdGlvbjxSZXNvdXJjZT4pIHNhdmVPcHRpb25zLmdldCgKLQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuT1BUSU9OU19PVkVSV1JJVEFCTEVfUkVTT1VSQ0VTKTsJCQkJCi0JCWlmKG92ZXJ3cml0YWJsZVJlc291cmNlcyAhPSBudWxsICYmICFvdmVyd3JpdGFibGVSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlyZXNvdXJjZXNUb0NoZWNrT3V0T2ZTeW5jaCA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KHJlc291cmNlcyk7Ci0JCQlyZXNvdXJjZXNUb0NoZWNrT3V0T2ZTeW5jaC5yZW1vdmVBbGwob3ZlcndyaXRhYmxlUmVzb3VyY2VzKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc291cmNlc1RvQ2hlY2tPdXRPZlN5bmNoID0gcmVzb3VyY2VzOwotCQl9Ci0JCWlmKCFyZXNvdXJjZXNUb0NoZWNrT3V0T2ZTeW5jaC5pc0VtcHR5KCkpIHsKLQkJCWNoZWNrT3V0T2ZTeW5jaChyZXNvdXJjZXNUb0NoZWNrT3V0T2ZTeW5jaCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrT3V0T2ZTeW5jaChDb2xsZWN0aW9uIHJlc291cmNlcykgewotCQkvLyBjaGVjayBmb3Igb3V0LW9mLXN5bmNoCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXMgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBpdGVyCi0JCQkJCS5uZXh0KCk7Ci0JCQlpZihyZXMuaXNMb2FkZWQoKSAmJiAhcmVzLmhhc1RlbXBVUkkoKSkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJaWYoZmlsZS5leGlzdHMoKSkgewotLy8JCQkJCWxvbmcgbGFzdE1vZGlmaWVkID0gZmlsZS5sYXN0TW9kaWZpZWQoKTsKLS8vCQkJCQlpZiAocmVzLmdldEZpbGVMYXN0TW9kaWZpZWQoKSAhPSBsYXN0TW9kaWZpZWQgJiYgIXNhbWUobGFzdE1vZGlmaWVkLCByZXMuZ2V0RmlsZUxhc3RNb2RpZmllZCgpKSkgewotLy8JCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0vLwkJCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMucmVzb3VyY2VPdXRPZlN5bmNoX21zZywgcmVzCi0vLwkJCQkJCQkJLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLS8vCQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKG1zZyk7Ci0vLwkJCQkJfQotCQkJCQkKLQkJCQkJaWYoIXJlcy5pc1N5bmNocm9uaXplZCgpKSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLnJlc291cmNlT3V0T2ZTeW5jaF9tc2csCi0JCQkJCQkJCXJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24obXNnKTsJCQkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBleGlzdGluZyBvd24gcmVzb3VyY2Ugb2YgYSBjb250YWluZWQgRU9iamVjdC4gQWRkcyByZXNvdXJjZXMKLQkgKiB0aGF0IGhhdmUgYmVlbiBtb2RpZmVkIGFmdGVyIHRoaXMgY2FsbCB0byB0aGUgTU9ESUZJRURfUkVTT1VSQ0VfU0VUIG9mCi0JICogdGhlIHNhdmUgb3B0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gcmVzb3VyY2UgaGFzIGJlZW4gc2F2ZWQgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2F2ZShSZXNvdXJjZSByZXNvdXJjZSwgTWFwIG9wdGlvbnMpIHsKLQkJaWYgKHJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVNldCBtb2RpZmllZFJlc291cmNlcyA9IChTZXQpIG9wdGlvbnMKLQkJCQkuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLk1PRElGSUVEX1JFU09VUkNFX1NFVCk7Ci0KLQkJLy8gc2hvdWxkIG5vdCBjaGFuZ2UgcmVzb3VyY2UgbG9jYXRpb24gYXV0b21hdGljYWxseSB3aXRob3V0IGxldHRpbmcKLQkJLy8gdXNlciBrbm93IGFib3V0IGl0Ci0JCS8vCi0JCS8vIGFkanVzdExvY2F0aW9uKHJlc291cmNlLCBtb2RpZmllZFJlc291cmNlcyk7Ci0KLQkJLy8gYmFjayB1cCB0aGUgY29udGFpbmVyIHJlZmVyZW5jZXMgYW5kIHNldCBjb250ZW50IG9iamVjdCdzIGNvbnRhaW5lcgotCQkvLyB0byBudWxsCi0JCS8vCi0JCU1hcCBvYmpUb0NvbnRhaW5lck1hcCA9IHJlbW92ZUNvbnRhaW5lcnMocmVzb3VyY2UpOwotCQl0cnkgewotCQkJcmVzb3VyY2Uuc2F2ZShvcHRpb25zKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyByZXN0b3JlIHRoZSBjb250YWluZXIgcmVmZXJlbmNlcyBmb3IgdGhlIGNvbnRlbnQgb2JqZWN0cwotCQkJLy8KLQkJCXJlc3RvcmVDb250YWluZXJzKHJlc291cmNlLCBvYmpUb0NvbnRhaW5lck1hcCk7Ci0JCX0KLQotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gYWRkTmV3UmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlKTsKLQkJaWYgKHJlc01nciAhPSBudWxsICYmIG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyZXNNZ3IuZUNvbnRhaW5lcigpLmVSZXNvdXJjZSgpKTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiBSZXNvdXJjZU1hbmFnZXIgdGhhdCBpcyBqdXN0IGFkZGVkIHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyIHRyZWUKLQkgKiAgICAgICAgIG9yIG51bGwuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VNYW5hZ2VyIGFkZE5ld1Jlc291cmNlTWFuYWdlcihSZXNvdXJjZSByZXNvdXJjZSkgewotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlKTsKLQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQlFT2JqZWN0IGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOwotCQlpZiAocmVzTWdyICE9IG51bGwgJiYgY29udGFpbmVyICE9IG51bGwgJiYgcmVzTWdyLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkvLyBuZXcgUmVzb3VyY2VNYW5hZ2VyIGlzIGFkZGVkIHRvIHRoZSByZXNvdXJjZQotCQkJLy8KLQkJCVJlc291cmNlTWFuYWdlciBwYXJlbnRSZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIoY29udGFpbmVyCi0JCQkJCS5lUmVzb3VyY2UoKSk7Ci0KLQkJCS8vIGNoZWNrIGlmIHJlc01nciBpcyBhbHJlYWR5IGEgc3ViIG1hbmFnZXIgb2YgcGFyZW50UmVzTWdyIGJlZm9yZQotCQkJLy8gYWRkaW5nIGl0Ci0JCQkvLwotCQkJaWYgKCFwYXJlbnRSZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKS5jb250YWlucyhyZXNNZ3IpKSB7Ci0JCQkJcGFyZW50UmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkuYWRkKHJlc01ncik7CQkJCQotCQkJCXJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcihwYXJlbnRSZXNNZ3IsIGUsIE11bHRpRmlsZVNhdmVVdGlsLmdldEZpbmFsVVJJKHJlc291cmNlKSk7Ci0JCQkJcmV0dXJuIHJlc01ncjsKLQkJCX0KLQotCQkJLy8gcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKHBhcmVudFJlc01nciwgcmVzTWdyLAotCQkJLy8gcmVzTWdyLmVSZXNvdXJjZSgpLmdldFVSSSgpLmFwcGVuZEZyYWdtZW50KHJlc01nci5nZXRHdWlkKCkpKTsKLQkJCS8vIHJldHVybiByZXNNZ3I7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvRmlsZVN0cmluZyhFT2JqZWN0IGVPYmopIHsKLQkJcmV0dXJuIGVPYmouZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUoCi0JCQkJZU9iai5lUmVzb3VyY2UoKS5nZXRVUkkoKSkudG9GaWxlU3RyaW5nKCk7Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gaGFzT3duRm9sZGVyKE9iamVjdCBlKSB7Ci0JCXJldHVybiBlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50OwotCX0KLQotCXN0YXRpYyBib29sZWFuIGhhc093blJlc291cmNlKE9iamVjdCBvYmosIENvbGxlY3Rpb24gc2F2ZVNlcGFyYXRlbHlDbGFzc1NldCkgewotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kVW5pdCkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoc2F2ZVNlcGFyYXRlbHlDbGFzc1NldCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzYXZlU2VwYXJhdGVseUNsYXNzU2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRUNsYXNzIGVDbHMgPSAoRUNsYXNzKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlQ2xzLmlzSW5zdGFuY2Uob2JqKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0Jc3RhdGljIFVSSSBjcmVhdGVGaWxlVVJJKE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoZS5lQ29udGFpbmVyKCkgPT0gbnVsbCkKLQkJCXJldHVybiAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZS5lUmVzb3VyY2UoKSkuZ2V0RmluYWxVUkkoKTsKLQotCQkvLyBIYW5kbGUgUHJvY2Vzc0NvbXBvbmVudCBzcGVjaWFsbHkuIFByb2Nlc3NDb21wb25lbnQgb2JqZWN0cyBhcmUKLQkJLy8gc3RvcmVkIGFzIGZvbGxvd2luZyBpbiB0aGUgbWV0aG9kIGxpYnJhcnk6Ci0JCS8vIDxNZXRob2QgTGlicmFyeT4KLQkJLy8gfF8gPE1ldGhvZCBQbHVnaW4+Ci0JCS8vIHxfcHJvY2Vzc2VzCi0JCS8vIHxfY2FwYWJpbGl0eV9wYXR0ZXJucwotCQkvLyB8X2RlbGl2ZXJ5X3Byb2Nlc3NlcwotCQkvLyB8X3Byb2Nlc3NfY29udHJpYnV0aW9ucwotCQkvLwotCQlpZiAoZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJCWlmKHBsdWdpbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IHBsdWdpbi5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQl9Ci0JCQlTdHJpbmcgcGx1Z2luRGlyID0gbnVsbDsKLQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlwbHVnaW5EaXIgPSBuZXcgRmlsZShnZXRGaW5hbFVSSShyZXNvdXJjZSkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJTWV0aG9kTGlicmFyeSBsaWIgPSAoTWV0aG9kTGlicmFyeSkgcGx1Z2luLmVDb250YWluZXIoKTsKLQkJCQlpZiAobGliICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGxpYkRpciA9IG5ldyBGaWxlKCgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBsaWIKLQkJCQkJCQkuZVJlc291cmNlKCkpLmdldEZpbmFsVVJJKCkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpOwotCQkJCQlwbHVnaW5EaXIgPSBsaWJEaXIgKyBGaWxlLnNlcGFyYXRvciArIHBsdWdpbi5nZXROYW1lKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYocGx1Z2luRGlyID09IG51bGwpIHsKLQkJCQkvLyBwbHVnaW4gaXMgYWxyZWFkeSBkZWxldGVkCi0JCQkJLy8KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJU3RyaW5nIHJlbGF0aXZlRGlyOwotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIGUpCi0JCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJcmVsYXRpdmVEaXIgPSBDQVBBQklMSVRZX1BBVFRFUk5fUEFUSDsKLQkJCX0gZWxzZSBpZiAocHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCXJlbGF0aXZlRGlyID0gREVMSVZFUllfUFJPQ0VTU19QQVRIOwotCQkJfSBlbHNlIHsKLQkJCQlyZWxhdGl2ZURpciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCVN0cmluZyBwYXRoID0gcGx1Z2luRGlyICsgRmlsZS5zZXBhcmF0b3IgKyByZWxhdGl2ZURpcgotCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgZS5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkrIERFRkFVTFRfTU9ERUxfRklMRU5BTUU7Ci0JCQlyZXR1cm4gVVJJLmNyZWF0ZUZpbGVVUkkocGF0aCk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbikgewotCQkJU3RyaW5nIGRpciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWRpciA9IG5ldyBGaWxlKCgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBVbWFVdGlsCi0JCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudChlKS5lUmVzb3VyY2UoKSkuZ2V0RmluYWxVUkkoKQotCQkJCQkJLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJCXJldHVybiBVUkkuY3JlYXRlRmlsZVVSSShkaXIgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkrIERFRkFVTFRfQ09OVEVOVF9GSUxFTkFNRSk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJVVJJIHVyaTsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgZTsKLQkJCVN0cmluZyBwYXRoID0gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXRDb3JyZWN0UGF0aChjb250ZW50KTsKLQkJCWlmIChwYXRoID09IG51bGwpIHsKLQkJCQlTdHJpbmcgZGlyID0gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGUuZVJlc291cmNlKCkpCi0JCQkJCQkuZ2V0RmluYWxVUkkoKS50cmltU2VnbWVudHMoMSkudG9GaWxlU3RyaW5nKCkKLQkJCQkJCSsgRmlsZS5zZXBhcmF0b3I7Ci0JCQkJcGF0aCA9IE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuZ2V0TmV4dEF2YWlsYWJsZUZpbGVOYW1lKGRpciwKLQkJCQkJCWNvbnRlbnQpOwotCQkJfQotCQkJdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkocGF0aCk7Ci0JCQlyZXR1cm4gdXJpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7CQkJCi0JCQlTdHJpbmcgZGlyID0gbmV3IFN0cmluZ0J1ZmZlcigoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZQotCQkJCQkuZUNvbnRhaW5lcigpLmVSZXNvdXJjZSgpKS5nZXRGaW5hbFVSSSgpLnRyaW1TZWdtZW50cygxKQotCQkJCQkudG9GaWxlU3RyaW5nKCkpLmFwcGVuZChGaWxlLnNlcGFyYXRvcikuYXBwZW5kKAotCQkJCQlNRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKQotCQkJCQkudG9TdHJpbmcoKTsKLQkJCVN0cmluZyBwYXRoID0gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXROZXh0QXZhaWxhYmxlRmlsZU5hbWUoZGlyLAotCQkJCQlTdHJVdGlsLm1ha2VWYWxpZEZpbGVOYW1lKGUuZ2V0TmFtZSgpKSwKLQkJCQkJKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlKTsKLQkJCXJldHVybiBVUkkuY3JlYXRlRmlsZVVSSShwYXRoKTsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlFT2JqZWN0IGxhc3RDb250YWluZXIgPSBudWxsOwotCQlmb3IgKE1ldGhvZEVsZW1lbnQgb2JqID0gKE1ldGhvZEVsZW1lbnQpIGUuZUNvbnRhaW5lcigpOyBvYmogIT0gbnVsbDsgb2JqID0gKE1ldGhvZEVsZW1lbnQpIG9iagotCQkJCS5lQ29udGFpbmVyKCkpIHsKLQkJCWxhc3RDb250YWluZXIgPSBvYmo7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCXBhdGguaW5zZXJ0KDAsIG5ldyBGaWxlKCgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBvYmoKLQkJCQkJCS5lUmVzb3VyY2UoKSkuZ2V0RmluYWxVUkkoKS50b0ZpbGVTdHJpbmcoKSkKLQkJCQkJCS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQlwYXRoLmluc2VydCgwLCBvYmouZ2V0TmFtZSgpKS5pbnNlcnQoMCwgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJCX0KLQkJfQotCQlpZiAobGFzdENvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZS5lUmVzb3VyY2UoKSAhPSBudWxsID8gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGUKLQkJCQkJLmVSZXNvdXJjZSgpKS5nZXRGaW5hbFVSSSgpIDogbnVsbDsKLQkJfQotCQlpZiAoIShsYXN0Q29udGFpbmVyIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkpIHsKLQkJCXBhdGguaW5zZXJ0KDAsIG5ldyBGaWxlKHRvRmlsZVN0cmluZyhsYXN0Q29udGFpbmVyKSkKLQkJCQkJLmdldFBhcmVudEZpbGUoKS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl9Ci0KLQkJU3RyaW5nIG1vZGVsRmlsZU5hbWU7Ci0JCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQltb2RlbEZpbGVOYW1lID0gREVGQVVMVF9QTFVHSU5fTU9ERUxfRklMRU5BTUU7Ci0JCX0gZWxzZSB7Ci0JCQltb2RlbEZpbGVOYW1lID0gTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9NT0RFTF9GSUxFTkFNRTsKLQkJfQotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkocGF0aC50b1N0cmluZygpICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkrIE11bHRpRmlsZVNhdmVVdGlsLmNyZWF0ZURpck5hbWUoZSkgKyBGaWxlLnNlcGFyYXRvcgotCQkJCSsgbW9kZWxGaWxlTmFtZSk7Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZShGaWxlIGZpbGUpIHsKLQkJRmlsZVtdIGZpbGVzID0gZmlsZS5saXN0RmlsZXMoKTsKLQkJaWYgKGZpbGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlkZWxldGUoZmlsZXNbaV0pOwotCQkJfQotCQl9Ci0JCWZpbGUuZGVsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gdXJpCi0JICogQHBhcmFtIG1vZGlmaWVkUmVzb3VyY2VzCi0JICogICAgICAgICAgICBvdXRwdXQgb2YgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgYWZ0ZXIgdGhpcyBjYWxsLgotCSAqLwotCXN0YXRpYyB2b2lkIHNldFVSSU1hcHBpbmcoRU9iamVjdCBlLCBVUkkgdXJpLCBTZXQgbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJTXVsdGlGaWxlVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9IChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpIGUKLQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJdXJpQ29udmVydGVyLnNldFVSSU1hcHBpbmcoZSwgdXJpLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIG1vZGlmaWVkUmVzb3VyY2VzCi0JICogICAgICAgICAgICBvdXRwdXQgb2YgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgYWZ0ZXIgdGhpcyBjYWxsCi0JICovCi0Jc3RhdGljIHZvaWQgdXBkYXRlVVJJTWFwcGluZ3MoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlLAotCQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCXVwZGF0ZVVSSU1hcHBpbmdzKHJlc291cmNlLCBtb2RpZmllZFJlc291cmNlcywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiByZXNvdXJjZVNldCBoYXMgdGhlIGxvYWRlZCByZXNvdXJjZSB3aXRoIHRoZSBnaXZlbgotCSAqIHVyaQotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZVNldAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gaGFzTG9hZGVkUmVzb3VyY2UoUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQsIFVSSSB1cmkpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSAmJiByZXNvdXJjZS5nZXRVUkkoKS5lcXVhbHModXJpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIFVSSU1hcHBpbmdzIHdpdGggdGhlIGZpbmFsIFVSSSBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlzdGF0aWMgdm9pZCB1cGRhdGVVUklNYXBwaW5ncyhNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UsCi0JCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMsIGJvb2xlYW4gYWZ0ZXJNb3ZlKSB7Ci0JCXVwZGF0ZVVSSU1hcHBpbmdzKHJlc291cmNlLCByZXNvdXJjZS5nZXRGaW5hbFVSSSgpLCBtb2RpZmllZFJlc291cmNlcywKLQkJCQlhZnRlck1vdmUpOwotCX0KLQotCXN0YXRpYyB2b2lkIHVwZGF0ZVVSSU1hcHBpbmdzKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSwgVVJJIHVyaSwKLQkJCVNldCBtb2RpZmllZFJlc291cmNlcywgYm9vbGVhbiBhZnRlck1vdmUpIHsKLQkJLy8gdGhlIHJlc291cmNlIFVSSSBoYXMgYmVlbiBjaGFuZ2VkLCByZXNldCBhbGwgdGhlIGNhY2hlZCByZXNvbHZlZCBVUkkKLQkJLy8gaW4gYWxsIG9mZnN0cmluZyByZXNvdXJjZSBkZXNjcmlwdG9ycwotCQkvLyBvZiBpdHMgbWFuYWdlciwgaWYgaXQgaGFzIG9uZS4KLQkJLy8KLQkJSGFzaE1hcCBvbGRVUklUb1Jlc291cmNlRGVzY3JpcHRvck1hcCA9IG51bGw7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIocmVzb3VyY2UpOwotCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCW9sZFVSSVRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc01nci5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSZXNvdXJjZURlc2NyaXB0b3IpIHsKLQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSAoKFJlc291cmNlRGVzY3JpcHRvcikgb2JqKTsKLQkJCQkJb2xkVVJJVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAucHV0KGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKSwKLQkJCQkJCQlkZXNjKTsKLQkJCQkJaWYgKGFmdGVyTW92ZSkgewotCQkJCQkJZGVzYy5jbGVhclJlc29sdmVkVVJJKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIXJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCQkvLyBzZXRVUklNYXBwaW5nKGVsZW1lbnQsIHJlc291cmNlLmdldEZpbmFsVVJJKCksCi0JCQkvLyBtb2RpZmllZFJlc291cmNlcyk7Ci0JCQlNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyID0gKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgcmVzb3VyY2UKLQkJCQkJLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCk7Ci0JCQl1cmlDb252ZXJ0ZXIuc2V0VVJJTWFwcGluZyhlbGVtZW50LCB1cmksIG1vZGlmaWVkUmVzb3VyY2VzLAotCQkJCQlhZnRlck1vdmUpOwotCQl9Ci0KLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotCQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkvLyBzZXRVUklNYXBwaW5nKGVsZW1lbnQsIHJlc291cmNlLmdldFVSSSgpLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCS8vIH0KLQotCQlpZiAob2xkVVJJVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAgIT0gbnVsbCkgewotCQkJLy8gZ28gdGhydSB0aGUgbGlzdCBvZiBsb2FkZWQgcmVzb3VyY2VzIGluIHJlc291cmNlIHNldCB0byB1cGRhdGUKLQkJCS8vIHRoZSBVUkkKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gKFJlc291cmNlRGVzY3JpcHRvcikgb2xkVVJJVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAKLQkJCQkJCS5nZXQocmVzLmdldFVSSSgpKTsKLQkJCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCWlmIChhZnRlck1vdmUpIHsKLQkJCQkJCXJlcy5zZXRVUkkoZGVzYy5nZXRSZXNvbHZlZFVSSSgpKTsKLQkJCQkJfSBlbHNlIGlmIChyZXMuaXNMb2FkZWQoKSkgewotCQkJCQkJZGVzYy5jbGVhclJlc29sdmVkVVJJKCk7Ci0JCQkJCQlyZXMuc2V0VVJJKGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzTWdyCi0JICogQHBhcmFtIG8KLQkgKiBAcGFyYW0gdXJpCi0JICovCi0JLy8gcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRVcmkoUmVzb3VyY2VNYW5hZ2VyIHJlc01nciwgTWV0aG9kRWxlbWVudCBlLCBVUkkKLQkvLyB1cmkpIHsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7Ci0JLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkvLyBpZihyZXNEZXNjLmdldElkKCkuZXF1YWxzKGUuZ2V0R3VpZCgpKSkgewotCS8vIC8vIGNoYW5nZSBvdGhlciBVUklzIHRoYXQgYXJlIGNoYW5nZWQgYXMgcmVzdWx0IG9mIHRoaXMgVVJJIGNoYW5nZQotCS8vIC8vCi0JLy8gaWYodXJpLmZyYWdtZW50KCkgPT0gbnVsbCkgewotCS8vIFVSSSBvbGREaXIgPSBVUkkuY3JlYXRlRmlsZVVSSShuZXcKLQkvLyBGaWxlKHJlc0Rlc2MuZ2V0UmVzb2x2ZWRVUkkoKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCkgKwotCS8vIEZpbGUuc2VwYXJhdG9yKTsKLQkvLyBVUkkgbmV3RGlyID0gVVJJLmNyZWF0ZUZpbGVVUkkobmV3IEZpbGUodXJpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKSArCi0JLy8gRmlsZS5zZXBhcmF0b3IpOwotCS8vIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7Ci0JLy8gaXRlcmF0b3IKLQkvLyAuaGFzTmV4dCgpOykgewotCS8vIFJlc291cmNlRGVzY3JpcHRvciBlbGVtZW50ID0gKFJlc291cmNlRGVzY3JpcHRvcikgaXRlcmF0b3IubmV4dCgpOwotCS8vIFVSSSBjdXJyZW50VXJpID0gZWxlbWVudC5nZXRSZXNvbHZlZFVSSSgpOwotCS8vIFVSSSBuZXdVcmkgPSBjdXJyZW50VXJpLnJlcGxhY2VQcmVmaXgob2xkRGlyLCBuZXdEaXIpOwotCS8vIGlmKG5ld1VyaSAhPSBudWxsKSB7Ci0JLy8gZWxlbWVudC5zZXRSZXNvbHZlZFVSSShuZXdVcmkpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIHJlc0Rlc2Muc2V0UmVzb2x2ZWRVUkkodXJpKTsKLQkvLyByZXR1cm47Ci0JLy8gfQotCS8vIH0KLQkvLyBSZXNvdXJjZURlc2NyaXB0b3IgcmVzRGVzYyA9Ci0JLy8gUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKCk7Ci0JLy8gcmVzRGVzYy5zZXRJZChlLmdldEd1aWQoKSk7Ci0JLy8gcmVzRGVzYy5zZXRSZXNvbHZlZFVSSSh1cmkpOwotCS8vIHJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuYWRkKHJlc0Rlc2MpOwotCS8vIH0KLQkvKioKLQkgKiBHZXRzIHRoZSByaWdodCBSZXNvdXJjZU1hbmFnZXIgZm9yIHRoZSBnaXZlbiBFT2JqZWN0LCBjcmVhdGVzIG5ldwotCSAqIFJlc291cmNlTWFuYWdlciBpZiBpdCBkb2VzIG5vdCBleGlzdCB5ZXQuCi0JICogCi0JICogQHBhcmFtIG1vZGlmaWVkUmVzb3VyY2VzCi0JICogICAgICAgICAgICBvdXRwdXQgb2YgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgYWZ0ZXIgdGhpcyBjYWxsLgotCSAqLwotCXN0YXRpYyBSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyRm9yKEVPYmplY3QgZU9iaiwKLQkJCVNldCBtb2RpZmllZFJlc291cmNlcykgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVPYmouZUNvbnRhaW5lcigpICE9IG51bGwgPyBlT2JqLmVDb250YWluZXIoKQotCQkJCS5lUmVzb3VyY2UoKSA6IGVPYmouZVJlc291cmNlKCk7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIocmVzb3VyY2UpOwotCQlpZiAocmVzTWdyID09IG51bGwpIHsKLQkJCXJlc01nciA9IFJlc291cmNlbWFuYWdlckZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlc291cmNlTWFuYWdlcigpOwotCi0JCQkvLyBhZGQgdG8gYmVnaW5uaW5nIG9mIHRoZSByZXNvdXJjZSdzIGNvbnRlbnRzCi0JCQkvLwotCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoMCwgcmVzTWdyKTsKLQotCQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCQkJRU9iamVjdCBjb250YWluZXIgPSBnZXRDb250YWluZXJXaXRoRGlyZWN0UmVzb3VyY2UoKEludGVybmFsRU9iamVjdCkgZU9iaik7Ci0JCQlpZiAoY29udGFpbmVyICE9IG51bGwgJiYgY29udGFpbmVyLmVSZXNvdXJjZSgpICE9IHJlc291cmNlKSB7Ci0JCQkJUmVzb3VyY2VNYW5hZ2VyIHBhcmVudFJlc01nciA9IGdldFJlc291cmNlTWFuYWdlckZvcihjb250YWluZXIsCi0JCQkJCQltb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJaWYgKHBhcmVudFJlc01nciAhPSBudWxsKSB7Ci0JCQkJCXBhcmVudFJlc01nci5nZXRTdWJNYW5hZ2VycygpLmFkZChyZXNNZ3IpOwotCQkJCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHBhcmVudFJlc01nci5lUmVzb3VyY2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzTWdyOwotCi0JfQotCi0Jc3RhdGljIExpc3QgcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSwKLQkJCVNldCBtb2RpZmllZFJlc291cmNlcykgewotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyRm9yKAotCQkJCVBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKSwgbW9kaWZpZWRSZXNvdXJjZXMpOwotCi0JCUxpc3QgcmVzb3VyY2VEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKHJlc01nciwKLQkJCQkJCWVsZW1lbnQsIHJlc291cmNlLmdldEZpbmFsVVJJKCkpOwotCQkJCWlmIChyZXNEZXNjICE9IG51bGwpIHsKLQkJCQkJcmVzb3VyY2VEZXNjcmlwdG9ycy5hZGQocmVzRGVzYyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghcmVzb3VyY2VEZXNjcmlwdG9ycy5pc0VtcHR5KCkgJiYgbW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc01nci5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlRGVzY3JpcHRvcnM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZURlc2NyaXB0b3IgcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKAotCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciwgT2JqZWN0IGVsZW1lbnQsIFVSSSB1cmkpIHsKLQkJU3RyaW5nIGd1aWQgPSBnZXRHdWlkKGVsZW1lbnQpOwotCQlpZiAocmVzTWdyLmdldFJlc291cmNlRGVzY3JpcHRvcihndWlkKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKHJlc01nciwgZ3VpZCwgdXJpKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLy8gLyoqCi0JLy8gKiBDcmVhdGVzIGEgbmV3IFJlc291cmNlRGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgYW5kIGFkZCBpdAotCS8vIHRvIHRoZSBnaXZlbiBSZXNvdXJjZU1hbmFnZXIKLQkvLyAqCi0JLy8gKiBAcGFyYW0gZQotCS8vICogQHJldHVybiBuZXdseSBhZGRlZCBSZXNvdXJjZURlc2NyaXB0b3IKLQkvLyAqLwotCS8vIHByaXZhdGUgc3RhdGljIFJlc291cmNlRGVzY3JpcHRvcgotCS8vIGNyZWF0ZVJlc291cmNlRGVzY3JpcHRvcihSZXNvdXJjZU1hbmFnZXIgcmVzTWdyLCBNZXRob2RFbGVtZW50IGUpIHsKLQkvLyByZXR1cm4gY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKHJlc01nciwgZS5nZXRHdWlkKCksIGNyZWF0ZUZpbGVVUkkoZSkpOwotCS8vIH0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgUmVzb3VyY2VEZXNjcmlwdG9yIHdpdGggdGhlIGdpdmVuIGlkIGFuZCByZXNvbHZlZFVSSSwgdGhlbgotCSAqIGFkZHMgaXQgdG8gdGhlIGdpdmVuIHJlc01ncgotCSAqIAotCSAqIEBwYXJhbSByZXNNZ3IKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gcmVzb2x2ZWRVUkkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VEZXNjcmlwdG9yIGNyZWF0ZVJlc291cmNlRGVzY3JpcHRvcigKLQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IsIFN0cmluZyBpZCwgVVJJIHJlc29sdmVkVVJJKSB7Ci0JCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKCk7Ci0JCXJlc0Rlc2Muc2V0SWQoaWQpOwotCQlyZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLmFkZChyZXNEZXNjKTsKLQkJcmVzRGVzYy5zZXRSZXNvbHZlZFVSSShyZXNvbHZlZFVSSSk7Ci0JCXJldHVybiByZXNEZXNjOwotCX0KLQotCS8vIHN0YXRpYyB2b2lkIHNldFVyaShNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyLCBNZXRob2RFbGVtZW50IGUsCi0JLy8gVVJJIHVyaSkgewotCS8vIHNldFVyaSh1cmlDb252ZXJ0ZXIsIGUsIHVyaSwgZmFsc2UpOwotCS8vIH0KLQotCS8vIHN0YXRpYyB2b2lkIHNldFVyaShNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyLCBNZXRob2RFbGVtZW50IGUsCi0JLy8gVVJJIHVyaSwgYm9vbGVhbiBzYXZlTm93KSB7Ci0JLy8gUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IHVyaUNvbnZlcnRlci5nZXRSZXNvdXJjZU1hbmFnZXIoKTsKLQkvLyBpZihyZXNNZ3IgPT0gbnVsbCkgewotCS8vIHJlc01nciA9IFJlc291cmNlbWFuYWdlckZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlc291cmNlTWFuYWdlcigpOwotCS8vIHVyaUNvbnZlcnRlci5zZXRSZXNvdXJjZU1hbmFnZXIocmVzTWdyKTsKLQkvLyB9Ci0JLy8gc2V0VXJpKHJlc01nciwgZSwgdXJpKTsKLQkvLyByZXNNZ3IuZVJlc291cmNlKCk7Ci0JLy8gfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0R3VpZChNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUuZ2V0R3VpZCgpID09IG51bGwgfHwgZS5nZXRHdWlkKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWUuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgaW4gaXRzIG93biBmaWxlIHdoaWxlIHN0aWxsIHByZXNlcnZpbmcgdGhlCi0JICogZXhpc3RpbmcgY29udGFpbm1lbnQgYXNzb2NpYXRpb24gaWYgdGhlcmUgaXMgYW55Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAdGhyb3dzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZShNZXRob2RFbGVtZW50IGUsIE1hcCBvcHRpb25zKSB0aHJvd3MgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uIHsKLQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZQotCQkJCS5lUmVzb3VyY2UoKTsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2UKLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCkgewotCQkJb3B0aW9ucyA9IHJlc291cmNlU2V0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQl9Ci0JCUVPYmplY3QgY29udGFpbmVyID0gZS5lQ29udGFpbmVyKCk7Ci0KLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJb3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VULAotCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJdHJ5IHsKLQkJCVVSSSB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5jcmVhdGVVUkkoZSwgcmVzb3VyY2VTZXQpOwotCQkJYm9vbGVhbiBjcmVhdGVSZXNvdXJjZSA9IHJlc291cmNlID09IG51bGwKLQkJCQkJfHwgKGNvbnRhaW5lciAhPSBudWxsICYmIHJlc291cmNlID09IGNvbnRhaW5lci5lUmVzb3VyY2UoKSk7Ci0JCQlpZiAoY3JlYXRlUmVzb3VyY2UpIHsKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5zYXZlKGUsIHVyaSwgb3B0aW9ucyk7Ci0JCQl9IGVsc2UgewotCQkJCVVSSSBvbGRVcmkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCQlpZiAoIW9sZFVyaS5lcXVhbHModXJpKSkgewotCi0JCQkJCS8vIHJlc291cmNlJ3MgbG9jYXRpb24gaXMgY2hhbmdlZC4KLQkJCQkJLy8gbW92ZSB0aGUgcmVzb3VyY2UsIHRoZW4gY2hhbmdlIGl0cyBVUkkgaWYgdGhlIHJlc291cmNlCi0JCQkJCS8vIG1vdmUgaXMgc3VjY2Vzc2Z1bC4KLQkJCQkJLy8gICAKLQkJCQkJaWYgKEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkubW92ZShvbGRVcmkudG9GaWxlU3RyaW5nKCksCi0JCQkJCQkJdXJpLnRvRmlsZVN0cmluZygpKSkgewotCQkJCQkJLy8gTXVsdGlGaWxlVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9Ci0JCQkJCQkvLyAoTXVsdGlGaWxlVVJJQ29udmVydGVyKQotCQkJCQkJLy8gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQkJCS8vIE11bHRpRmlsZVNhdmVVdGlsLnNldFVyaSh1cmlDb252ZXJ0ZXIsIGUsIHVyaSk7Ci0JCQkJCQlyZXNvdXJjZS5zZXRVUkkodXJpKTsKLQkJCQkJCXVwZGF0ZVVSSU1hcHBpbmdzKHJlc291cmNlLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAocmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLnNhdmUocmVzb3VyY2UsIG9wdGlvbnMpOwotCQkJCX0KLQkJCX0KLQotCQkJcmVzb3VyY2VTZXQuc2F2ZU1vZGlmaWVkUmVzb3VyY2VzKG9wdGlvbnMpOwotCQl9IGZpbmFsbHkgewotCi0JCX0KLQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVVUkkoTWV0aG9kRWxlbWVudCBlLCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQlVUkkgdXJpID0gbnVsbDsKLQkJaWYocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHsKLQkJCUlVUklQcm92aWRlciB1cmlQcm92aWRlciA9ICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5nZXRVUklQcm92aWRlcigpOwotCQkJaWYodXJpUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCXVyaSA9IHVyaVByb3ZpZGVyLmdldFVSSShlKTsKLQkJCX0KLQkJfQotCQlpZih1cmkgPT0gbnVsbCkgewotCQkJdXJpID0gY3JlYXRlRmlsZVVSSShlKTsKLQkJfQotCQlyZXR1cm4gdXJpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlKFJlc291cmNlU2V0IHJlc291cmNlU2V0LCBNZXRob2RFbGVtZW50IGUsCi0JCQlNYXAgb3B0aW9ucykgewotCQlVUkkgdXJpID0gY3JlYXRlVVJJKGUsIHJlc291cmNlU2V0KTsKLQkJc2F2ZShyZXNvdXJjZVNldCwgZSwgdXJpLCBvcHRpb25zKTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBhZGp1c3RMb2NhdGlvbihSZXNvdXJjZSByZXNvdXJjZSwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJVVJJIG5ld0ZpbGUgPSBjcmVhdGVVUkkoZSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCWlmIChuZXdGaWxlICE9IG51bGwgJiYgYWRqdXN0TG9jYXRpb24ocmVzb3VyY2UsIG5ld0ZpbGUpKSB7Ci0JCQlyZXNvdXJjZS5zZXRVUkkobmV3RmlsZSk7Ci0JCQl1cGRhdGVVUklNYXBwaW5ncygoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZSwKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMpOwotCQl9Ci0JfQotCi0Jc3RhdGljIFVSSSBnZXROZXdVUkkoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJaWYgKGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJVVJJIG5ld0ZpbGUgPSBjcmVhdGVVUkkoZSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCWlmIChuZXdGaWxlICE9IG51bGwgJiYgYWRqdXN0TG9jYXRpb25SZXF1aXJlZChyZXNvdXJjZSwgbmV3RmlsZSkpIHsKLQkJCXJldHVybiBuZXdGaWxlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXN0YXRpYyBib29sZWFuIHByZXBhcmVBZGp1c3RMb2NhdGlvbihNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UsCi0JCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJVVJJIG5ld0ZpbGUgPSBnZXROZXdVUkkocmVzb3VyY2UpOwotCQlpZiAobmV3RmlsZSAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZS5iYWNrVXBVUkkoKTsKLQkJCXJlc291cmNlLnNldEZpbmFsVVJJKG5ld0ZpbGUpOwotCQkJdXBkYXRlVVJJTWFwcGluZ3MoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UsCi0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzLCBmYWxzZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R3VpZChPYmplY3QgZSkgewotCQlpZihlIGluc3RhbmNlb2YgSW50ZXJuYWxFT2JqZWN0KSB7Ci0JCQlJbnRlcm5hbEVPYmplY3QgbyA9IChJbnRlcm5hbEVPYmplY3QpIGU7Ci0JCQlpZihvLmVJc1Byb3h5KCkpIHsKLQkJCQlVUkkgdXJpID0gby5lUHJveHlVUkkoKTsKLQkJCQlpZih1cmkgIT0gbnVsbCAmJiBNdWx0aUZpbGVVUklDb252ZXJ0ZXIuU0NIRU1FLmVxdWFscyh1cmkuc2NoZW1lKCkpKSB7Ci0JCQkJCVN0cmluZyBndWlkID0gdXJpLmZyYWdtZW50KCk7Ci0JCQkJCWlmKGd1aWQgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGd1aWQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KSBlKS5nZXRHdWlkKCk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFJlc291cmNlTWFuYWdlcikgewotCQkJcmV0dXJuICgoUmVzb3VyY2VNYW5hZ2VyKSBlKS5nZXRHdWlkKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gYWRqdXN0TG9jYXRpb25SZXF1aXJlZChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UsCi0JCQlVUkkgbmV3VVJJKSB7Ci0JCUZpbGUgb2xkRmlsZSA9IG5ldyBGaWxlKHJlc291cmNlLmdldEZpbmFsVVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQlGaWxlIG5ld0ZpbGUgPSBuZXcgRmlsZShuZXdVUkkudG9GaWxlU3RyaW5nKCkpOwotCQlyZXR1cm4gIW9sZEZpbGUuZXF1YWxzKG5ld0ZpbGUpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgcmVzb3VyY2UncyBVUkkgaGFzIGJlZW4gY2hhbmdlZCBhbmQgYWRqdXN0IHRoZSByZXNvdXJjZSdzCi0JICogbG9jYXRpb24uCi0JICogCi0JICogQHBhcmFtIG9sZFVyaQotCSAqIEBwYXJhbSBuZXdVcmkKLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBhZGp1c3RMb2NhdGlvbihSZXNvdXJjZSByZXNvdXJjZSwgVVJJIG5ld1VyaSkgewotCQlGaWxlIG9sZEZpbGUgPSBuZXcgRmlsZShyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCUZpbGUgbmV3RmlsZSA9IG5ldyBGaWxlKG5ld1VyaS50b0ZpbGVTdHJpbmcoKSk7Ci0JCWlmIChvbGRGaWxlLmVxdWFscyhuZXdGaWxlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBtb3ZlKHJlc291cmNlLCBvbGRGaWxlLCBuZXdGaWxlKTsKLQl9Ci0KLQlzdGF0aWMgYm9vbGVhbiBtb3ZlKFJlc291cmNlIHJlc291cmNlLCBGaWxlIG9sZEZpbGUsIEZpbGUgbmV3RmlsZSkgewotCQlib29sZWFuIHJldCA9IHRydWU7Ci0JCWlmIChvbGRGaWxlLmVxdWFscyhuZXdGaWxlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCU9iamVjdCBvYmogPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCWlmIChoYXNPd25Gb2xkZXIob2JqKSkgewotCQkJU3RyaW5nIG9sZERpciA9IG9sZEZpbGUuZ2V0UGFyZW50RmlsZSgpLnRvU3RyaW5nKCk7Ci0JCQlpZiAoIW9sZEZpbGUuZ2V0UGFyZW50RmlsZSgpLmVxdWFscyhuZXdGaWxlLmdldFBhcmVudEZpbGUoKSkpIHsKLQkJCQlpZiAoRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW5hbWUob2xkRmlsZS5nZXRQYXJlbnRGaWxlKCksCi0JCQkJCQluZXdGaWxlLmdldFBhcmVudEZpbGUoKSkpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJEaXJlY3RvcnkgJyIgKyBvbGREaXIgKyAiJyBpcyBzdWNjZXNzZnVsbHkgbW92ZWQgdG8gJyIgKyBuZXdGaWxlLmdldFBhcmVudEZpbGUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZXQgPSBmYWxzZTsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJDb3VsZCBub3QgbW92ZSBkaXJlY3RvcnkgJyIgKyBvbGREaXIgKyAiJyB0byAnIiArIG5ld0ZpbGUuZ2V0UGFyZW50RmlsZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICghb2xkRmlsZS5nZXROYW1lKCkuZXF1YWxzKG5ld0ZpbGUuZ2V0TmFtZSgpKSkgewotCQkJCW9sZEZpbGUgPSBuZXcgRmlsZShuZXdGaWxlLmdldFBhcmVudEZpbGUoKSwgb2xkRmlsZS5nZXROYW1lKCkpOwotCQkJCWlmIChGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbmFtZShvbGRGaWxlLCBuZXdGaWxlKSkgewotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIkZpbGUgJyIgKyBvbGRGaWxlICsgIicgaXMgc3VjY2Vzc2Z1bGx5IG1vdmVkIHRvICciICsgbmV3RmlsZSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZXQgPSBmYWxzZTsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJDb3VsZCBub3QgbW92ZSBmaWxlICciICsgb2xkRmlsZSArICInIHRvICciICsgbmV3RmlsZSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmV0OwotCQl9IGVsc2UgaWYgKG9sZEZpbGUuZXhpc3RzKCkpIC8qIGlmKG9sZEZpbGUuZ2V0UGFyZW50RmlsZSgpLmVxdWFscyhuZXdGaWxlLmdldFBhcmVudEZpbGUoKSkpICovewotCQkJU3RyaW5nIG9sZEZpbGVTdHIgPSBvbGRGaWxlLnRvU3RyaW5nKCk7Ci0JCQlpZiAoRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW5hbWUob2xkRmlsZSwgbmV3RmlsZSkpIHsKLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJGaWxlICciICsgb2xkRmlsZVN0ciArICInIGlzIHN1Y2Nlc3NmdWxseSBtb3ZlZCB0byAnIiArIG5ld0ZpbGUgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiQ291bGQgbm90IG1vdmUgZmlsZSAnIiArIG9sZEZpbGVTdHIgKyAiJyB0byAnIiArIG5ld0ZpbGUgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlc01ncgotCSAqIEBwYXJhbSBndWlkCi0JICogQHBhcmFtIGV4Y2x1ZGVkUmVzTWFuYWdlcnMKLQkgKiAgICAgICAgICAgIFJlc291cmNlTWFuYWdlciB0aGF0IGFyZSBleGNsdWRlZCBmcm9tIHRoaXMgc2VhcmNoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VEZXNjcmlwdG9yIGZpbmRSZXNvdXJjZURlc2NyaXB0b3IoCi0JCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyLCBTdHJpbmcgZ3VpZCwKLQkJCUNvbGxlY3Rpb24gZXhjbHVkZWRSZXNNYW5hZ2VycywgYm9vbGVhbiByZXNvbHZlUHJveHkpIHsKLQkJdHJ5IHsKLQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gcmVzTWdyLmdldFJlc291cmNlRGVzY3JpcHRvcihndWlkKTsKLQkJCWlmIChkZXNjICE9IG51bGwpCi0JCQkJcmV0dXJuIGRlc2M7Ci0JCQkvLyBUT0RPOiAoUGhvbmcpIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IG5lZWRlZCB0byBhdm9pZCBsb2FkaW5nCi0JCQkvLyByZXNvdXJjZXMgZXhjZXNzaXZlbHkKLQkJCS8vCi0JCQlJdGVyYXRvciBpdGVyOwotCQkJaWYgKHJlc29sdmVQcm94eSkgewotCQkJCWl0ZXIgPSBuZXcgQXJyYXlMaXN0KHJlc01nci5nZXRTdWJNYW5hZ2VycygpKS5pdGVyYXRvcigpOwotCQkJfSBlbHNlIHsKLQkJCQlpdGVyID0gKChJbnRlcm5hbEVMaXN0KSByZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKSkKLQkJCQkJCS5iYXNpY0l0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlSZXNvdXJjZU1hbmFnZXIgbWdyID0gKFJlc291cmNlTWFuYWdlcikgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG1nciAhPSBudWxsCi0JCQkJCQkmJiAhbWdyLmVJc1Byb3h5KCkKLQkJCQkJCSYmIChleGNsdWRlZFJlc01hbmFnZXJzID09IG51bGwgfHwgIWV4Y2x1ZGVkUmVzTWFuYWdlcnMKLQkJCQkJCQkJLmNvbnRhaW5zKG1ncikpKSB7Ci0JCQkJCWRlc2MgPSBmaW5kUmVzb3VyY2VEZXNjcmlwdG9yKG1nciwgZ3VpZCwKLQkJCQkJCQlleGNsdWRlZFJlc01hbmFnZXJzLCByZXNvbHZlUHJveHkpOwotCQkJCQlpZiAoZGVzYyAhPSBudWxsKQotCQkJCQkJcmV0dXJuIGRlc2M7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZXNNZ3IKLQkgKiBAcmV0dXJuIGhvdyBtYW55IFJlc291cmNlRGVzY3JpcHRvcnMgYXJlIGluIHRoZSByZXNNZ3IgYW5kIGl0cwotCSAqICAgICAgICAgU3ViTWFuYWdlcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRDb3VudFJlc291cmNlRGVzY3JpcHRvcnMoUmVzb3VyY2VNYW5hZ2VyIHJlc01ncikgewotCQlpbnQgY291bnQgPSByZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLnNpemUoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZU1hbmFnZXIgbWdyID0gKFJlc291cmNlTWFuYWdlcikgaXRlci5uZXh0KCk7Ci0JCQljb3VudCArPSBnZXRDb3VudFJlc291cmNlRGVzY3JpcHRvcnMobWdyKTsKLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVzb3VyY2UgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHJlc291cmNlCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VEZXNjcmlwdG9yIGdldFJlc291cmNlRGVzY3JpcHRvcihSZXNvdXJjZSByZXNvdXJjZSkgewotCQlSZXNvdXJjZU1hbmFnZXIgY29udGFpbmVyUmVzTWdyID0gbnVsbDsKLQkJTWV0aG9kRWxlbWVudCBtZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJlc291cmNlTWFuYWdlcihyZXNvdXJjZSk7Ci0JCQkJaWYgKHJlc01nciAhPSBudWxsKSB7Ci0JCQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gcmVzTWdyCi0JCQkJCQkJLmdldFJlc291cmNlRGVzY3JpcHRvcigoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpCi0JCQkJCQkJCQkuZ2V0R3VpZCgpKTsKLQkJCQkJLy8gaGFjayB0byBhZGQgbWlzc2luZyBSZXNvdXJjZURlc2NyaXB0b3IgZm9yIGxpYnJhcnkncwotCQkJCQkvLyByZXNvdXJjZQotCQkJCQkvLwotCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQlkZXNjID0gcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKHJlc01nciwgZWxlbWVudCwKLQkJCQkJCQkJKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlc291cmNlKQotCQkJCQkJCQkJCS5nZXRGaW5hbFVSSSgpKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gZGVzYzsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobWUgPT0gbnVsbCAmJiBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCW1lID0gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQl9Ci0JCQlpZiAoY29udGFpbmVyUmVzTWdyID09IG51bGwgJiYgZWxlbWVudCBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkgewotCQkJCUVPYmplY3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyV2l0aERpcmVjdFJlc291cmNlKChJbnRlcm5hbEVPYmplY3QpIGVsZW1lbnQpOwotCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCQljb250YWluZXJSZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIoY29udGFpbmVyLmVSZXNvdXJjZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobWUgIT0gbnVsbCAmJiBjb250YWluZXJSZXNNZ3IgIT0gbnVsbCkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYobWUgIT0gbnVsbCkgewotCQkJaWYgKGNvbnRhaW5lclJlc01nciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGNvbnRhaW5lclJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3IoKChNZXRob2RFbGVtZW50KSBtZSkKLQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJfQotCQkJZWxzZSBpZihtZS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCS8vIHRoaXMgZWxlbWVudCBoYXMgYmVlbiBsb2FkZWQgYmVmb3JlIGl0cyBjb250YWluZXIgYWNjZXNzZWQgaXQKLQkJCQkvLyB0cnkgdG8gZmluZCBpdHMgcmVzb3VyY2UgZGVzY3JpcHRvciB1c2luZyByb290IHJlc291cmNlIG1hbmFnZXIKLQkJCQkvLwotCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQlpZihyZXNvdXJjZVNldCBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgewotCQkJCQlSZXNvdXJjZU1hbmFnZXIgcm9vdFJlc01nciA9ICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5nZXRSb290UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3Iocm9vdFJlc01ncikgewotCi0JCQkJCQkvKioKLQkJCQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkJCQkgKi8KLQkJCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIFJlc291cmNlTWFuYWdlcikgewotCQkJCQkJCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSAoUmVzb3VyY2VNYW5hZ2VyKW9iamVjdDsgCi0JCQkJCQkJCWNoaWxkcmVuLmFkZEFsbChyZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpKTsKLQkJCQkJCQkJY2hpbGRyZW4uYWRkQWxsKHJlc01nci5nZXRTdWJNYW5hZ2VycygpKTsKLQkJCQkJCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJfTsKLQkJCQkJVVJJIHVyaSA9IGdldEZpbmFsVVJJKHJlc291cmNlKTsKLQkJCQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZihvIGluc3RhbmNlb2YgUmVzb3VyY2VEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBvOwotCQkJCQkJCWlmKHVyaS5lcXVhbHMocmVzRGVzYy5nZXRSZXNvbHZlZFVSSSgpKSkgewotCQkJCQkJCQlyZXR1cm4gcmVzRGVzYzsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gcHVibGljIHN0YXRpYyBSZXNvdXJjZURlc2NyaXB0b3IgZmluZFJlc291cmNlRGVzY3JpcHRvcihNZXRob2RFbGVtZW50IGUpCi0JLy8gewotCS8vIFJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBudWxsOwotCS8vIGlmKGUuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCS8vIHJlc01nciA9IGdldFJlc291cmNlTWFuYWdlcihlLmVSZXNvdXJjZSgpKTsKLQkvLyB9Ci0JLy8gUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSBudWxsOwotCS8vIENvbGxlY3Rpb24gZXhjbHVkZWRSZXNNZ3JzID0gbnVsbDsKLQkvLyBpZihyZXNNZ3IgIT0gbnVsbCkgewotCS8vIGRlc2MgPSBmaW5kUmVzb3VyY2VEZXNjcmlwdG9yKHJlc01nciwgZS5nZXRHdWlkKCkpOwotCS8vIGlmKGRlc2MgIT0gbnVsbCkgcmV0dXJuIGRlc2M7Ci0JLy8gZXhjbHVkZWRSZXNNZ3JzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChyZXNNZ3IpOwotCS8vIH0KLQkvLwkJCi0JLy8gTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZSk7Ci0JLy8gcmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyKGxpYi5lUmVzb3VyY2UoKSk7Ci0JLy8JCQotCS8vIHJldHVybiBmaW5kUmVzb3VyY2VEZXNjcmlwdG9yKHJlc01nciwgZS5nZXRHdWlkKCksIGV4Y2x1ZGVkUmVzTWdycyk7Ci0JLy8gfQotCi0JLyoqCi0JICogR2V0cyB0aGUgUmVzb3VyY2VNYW5hZ2VyIGluIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCQkJcmVzTWdyID0gKFJlc291cmNlTWFuYWdlcikgZWxlbWVudDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXNNZ3I7Ci0JfQotCi0Jc3RhdGljIEludGVybmFsRU9iamVjdCBnZXRDb250YWluZXJXaXRoRGlyZWN0UmVzb3VyY2UoSW50ZXJuYWxFT2JqZWN0IG9iaikgewotCQlpZiAob2JqLmVDb250YWluZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUludGVybmFsRU9iamVjdCBjb250YWluZXIgPSAoSW50ZXJuYWxFT2JqZWN0KSAoKEludGVybmFsRU9iamVjdCkgb2JqCi0JCQkJLmVDb250YWluZXIoKSk7Ci0JCWlmIChjb250YWluZXIuZURpcmVjdFJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJfQotCQlyZXR1cm4gZ2V0Q29udGFpbmVyV2l0aERpcmVjdFJlc291cmNlKGNvbnRhaW5lcik7Ci0JfQotCi0Jc3RhdGljIFN0cmluZyBnZXRIUkVGKFJlc291cmNlIHJlc291cmNlLCBPYmplY3Qgb2JqKSB7Ci0JCU1ldGhvZEVsZW1lbnQgb3duZXIgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCXJldHVybiBNdWx0aUZpbGVVUklDb252ZXJ0ZXIuY3JlYXRlVVJJKG93bmVyLmdldEd1aWQoKSkuYXBwZW5kRnJhZ21lbnQoCi0JCQkJZ2V0R3VpZChvYmopKS50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJhY2t1cEZpbGVTdWZmaXgoKSB7Ci0JCXJldHVybiAiXyIgKyBkYXRlRm9ybWF0dGVyLmZvcm1hdChDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlIHRoZSBwcm94eSBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiA8Y29kZT5ndWlkPC9jb2RlPiB3aXRob3V0Ci0JICogbG9hZGluZyBhbGwgb3RoZXIgcHJveGllcyBpbiA8Y29kZT5wYXJlbnQ8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIGd1aWQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXNvbHZlUHJveGllcyhDb2xsZWN0aW9uIEdVSURzLCBFT2JqZWN0IHBhcmVudCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGFyZW50LmVDbGFzcygpLmdldEVBbGxDb250YWlubWVudHMoKQotCQkJCS5pdGVyYXRvcigpOyAhR1VJRHMuaXNFbXB0eSgpICYmIGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlJbnRlcm5hbEVMaXN0IGxpc3QgPSAoSW50ZXJuYWxFTGlzdCkgcGFyZW50LmVHZXQoZmVhdHVyZSk7Ci0JCQkJaW50IGluZGV4ID0gMDsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gbGlzdC5iYXNpY0l0ZXJhdG9yKCk7ICFHVUlEcy5pc0VtcHR5KCkKLQkJCQkJCSYmIGl0ZXIxLmhhc05leHQoKTsgaW5kZXgrKykgewotCQkJCQlJbnRlcm5hbEVPYmplY3QgY2hpbGQgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyMS5uZXh0KCk7Ci0JCQkJCWlmIChjaGlsZC5lSXNQcm94eSgpKSB7Ci0JCQkJCQlTdHJpbmcgZ3VpZCA9IGNoaWxkLmVQcm94eVVSSSgpLmZyYWdtZW50KCk7Ci0JCQkJCQlpZiAoR1VJRHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQkJCQkvLyB0aGlzIHdpbGwgcmVzb2x2ZSB0aGUgb2JqZWN0IHdpdGggZ3VpZAotCQkJCQkJCS8vCi0JCQkJCQkJbGlzdC5nZXQoaW5kZXgpOwotCQkJCQkJCUdVSURzLnJlbW92ZShndWlkKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJlc29sdmVQcm94aWVzKEdVSURzLCBjaGlsZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUludGVybmFsRU9iamVjdCBjaGlsZCA9IChJbnRlcm5hbEVPYmplY3QpIHBhcmVudC5lR2V0KGZlYXR1cmUsCi0JCQkJCQlmYWxzZSk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJaWYgKGNoaWxkLmVJc1Byb3h5KCkpIHsKLQkJCQkJCVN0cmluZyBndWlkID0gY2hpbGQuZVByb3h5VVJJKCkuZnJhZ21lbnQoKTsKLQkJCQkJCWlmIChHVUlEcy5jb250YWlucyhndWlkKSkgewotCQkJCQkJCS8vIHRoaXMgd2lsbCByZXNvbHZlIHRoZSBvYmplY3Qgd2l0aCBndWlkCi0JCQkJCQkJLy8KLQkJCQkJCQlwYXJlbnQuZUdldChmZWF0dXJlKTsKLQkJCQkJCQlHVUlEcy5yZW1vdmUoZ3VpZCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXNvbHZlUHJveGllcyhHVUlEcywgY2hpbGQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBVUkkgZ2V0RmluYWxVUkkoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsID8gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlc291cmNlKQotCQkJCS5nZXRGaW5hbFVSSSgpCi0JCQkJOiByZXNvdXJjZS5nZXRVUkkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaW1wbAotCSAqIEByZXR1cm4KLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBhZGp1c3RMb2NhdGlvblJlcXVpcmVkKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSkgewotCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7CQkKLQkJaWYoZSAhPSBudWxsICYmIGhhc093bkZvbGRlcihlKSkgewotCQkJVVJJIG5ld1VSSSA9IGNyZWF0ZVVSSShlLCByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCWlmKGFkanVzdExvY2F0aW9uUmVxdWlyZWQocmVzb3VyY2UsIG5ld1VSSSkgJiYgIW5ldyBGaWxlKG5ld1VSSS50b0ZpbGVTdHJpbmcoKSkuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgaXMgY3VycmVudGx5IHN5bmNocm9uaXplZCB3aXRoIGl0cyBkYXRhIHN0b3JlCi0JICogCi0JICogQHJldHVybiA8bGk+IC0xIGRvbid0IGtub3cKLQkgKiAgICAgICAgIDxsaT4gMCBubwotCSAqICAgICAgICAgPGxpPiAxIHllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNoZWNrU3luY2hyb25pemVkKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQlyZXR1cm4gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzb3VyY2UpLmNoZWNrU3luY2hyb25pemVkKCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFNvbWUgdGVhbSBwcm92aWRlcnMgY2hhbmdlZCB0aGUgdGltZXN0YW1wIG9mIGxhc3QgZmlsZSBtb2RpZmljYXRpb24gYnkgcmVtb3Zpbmcgc2Vjb25kIGZyYWN0aW9uCi0JICogZXZlbiB0aGUgZmlsZSB3YXMgbm90IGNoYW5nZWQuIFRoaXMgbWV0aG9kIGNoZWNrIHRoZSBjdXJyZW50IGFuZCBvbGQgdGltZSBzdGFtcHMgZm9yIHRoaXMuCi0JICogCi0JICogQHBhcmFtIGN1cnJlbnRUaW1lU3RhbXAKLQkgKiBAcGFyYW0gbGFzdFRpbWVTdGFtcAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2FtZShsb25nIGN1cnJlbnRUaW1lU3RhbXAsIGxvbmcgbGFzdFRpbWVTdGFtcCkgewotCQlyZXR1cm4gY3VycmVudFRpbWVTdGFtcCA8IGxhc3RUaW1lU3RhbXAgJiYgKGN1cnJlbnRUaW1lU3RhbXAgJiA3KSA9PSAwICYmIChsYXN0VGltZVN0YW1wIC0gY3VycmVudFRpbWVTdGFtcCkgPCAxMDAwOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYW4gZW1wdHkgcmVzb3VyY2UgbWFuYWdlciBmb3IgdGhlIGdpdmVuIHJlc291cmNlIGlmIGl0IGRvZXMgbm90IGhhdmUgb25lLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBhIG5ldyByZXNvdXJjZSBtYW5hZ2VyIGlzIGFkZGVkLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlzdGF0aWMgUmVzb3VyY2VNYW5hZ2VyIGFkZFJlc291cmNlTWFuYWdlcihSZXNvdXJjZSByZXNvdXJjZSkgewotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlKTsKLQkJaWYgKHJlc01nciA9PSBudWxsKSB7Ci0JCQlyZXNNZ3IgPSBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZXNvdXJjZU1hbmFnZXIoKTsKLQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKDAsIHJlc01ncik7Ci0JCQlyZXR1cm4gcmVzTWdyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlzdGF0aWMgdm9pZCBjaGVja0ZpbGVQYXRoTGVuZ3RoKENvbGxlY3Rpb24gcmVzb3VyY2VzKSB7Ci0JCUxpc3Q8U3RyaW5nPiBwYXRoTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCAmJiAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbClyZXNvdXJjZSkuaGFzVGVtcFVSSSgpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlwYXRoTGlzdC5hZGQocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQl9Ci0JCQotCQlpZighcGF0aExpc3QuaXNFbXB0eSgpKSB7Ci0JCQlTdHJpbmdbXSBwYXRocyA9IG5ldyBTdHJpbmdbcGF0aExpc3Quc2l6ZSgpXTsKLQkJCXBhdGhMaXN0LnRvQXJyYXkocGF0aHMpOwotCi0JCQlmb3IgKGludCBpPTA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBwYXRoID0gcGF0aHNbaV07Ci0JCQkJaWYgKHBhdGhzW2ldLmxlbmd0aCgpID4gMjU1KSB7Ci0JCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5maWxlUGF0aE5hbWVUb29Mb25nX21zZywgQXJyYXlzCi0JCQkJCQkJCS5hc0xpc3QocGF0aHMpKTsKLQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKG1zZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTGlzdHMgYWxsIHBvc3NpYmxlIGNvbmZpZ3VyYXRpb24gZmlsZXMgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgPGNvZGU+Y29uZmlnRGlyPC9jb2RlPiBhbmQgaXRzIHN1YiBkaXJlY3Rvcmllcy4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnRGlyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3IgbGlzdENvbmZpZ0ZpbGVzKEZpbGUgY29uZmlnRGlyKSB7Ci0JCXJldHVybiBsaXN0TGlicmFyeUZpbGVzKGNvbmZpZ0Rpcik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gbGlzdExpYnJhcnlGaWxlcyhGaWxlIGRpcikgewotCQlyZXR1cm4gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yPEZpbGU+KGRpciwgZmFsc2UpIHsKLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjc1ODQzNjE5MzAwMDY0MDkwN0w7Ci0KLQkJCUZpbGVGaWx0ZXIgZmlsdGVyID0gbmV3IEZpbGVGaWx0ZXIoKSB7Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkgewotCQkJCQlyZXR1cm4gIUZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuaXNUZWFtUHJpdmF0ZShwYXRobmFtZS5nZXRBYnNvbHV0ZVBhdGgoKSkgJiYKLQkJCQkJCQkocGF0aG5hbWUuaXNEaXJlY3RvcnkoKQotCQkJCQkJCXx8IHBhdGhuYW1lLmdldE5hbWUoKS5lbmRzV2l0aCgKLQkJCQkJCQkJCU11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfRklMRV9FWFRFTlNJT04pKTsKLQkJCQl9Ci0KLQkJCX07Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxGaWxlPiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJRmlsZVtdIGZpbGVzID0gKChGaWxlKSBvYmplY3QpLmxpc3RGaWxlcyhmaWx0ZXIpOwotCQkJCWlmIChmaWxlcyAhPSBudWxsICYmIGZpbGVzLmxlbmd0aCA+IDApIHsKLQkJCQkJcmV0dXJuIEFycmF5cy5hc0xpc3QoZmlsZXMpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVVUklDb252ZXJ0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlVVJJQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZjQyOTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVVUklDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogVVJJIGNvbnZlcnRlciB0aGF0IGNvbnZlcnRzIGEgZmlsZS1iYXNlZCBVUkkgdG8gYSBVTUEtYmFzZWQgVVJJIGFuZCB2aWNlCi0gKiB2ZXJzYSB1c2luZyB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gUmVzb3VyY2VEZXNjcmlwdG9ycyBvZgotICogUmVzb3VyY2VNYW5hZ2VyLiBBIFVNQS1iYXNlZCBVUkkgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgotICogdW1hOi8vR1VJRDEjR1VJRDIgd2hlcmUgR1VJRDEgaXMgdGhlIEdVSUQgb2YgdGhlIGZpbGUgYW5kIEdVSUQyIGlzIHRoZQotICogb2JqZWN0J3MgR1VJRC4gCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUZpbGVVUklDb252ZXJ0ZXIgZXh0ZW5kcyBVUklDb252ZXJ0ZXJJbXBsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRSA9ICJ1bWEiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoU2V0IGxvY2tlZEdVSURzID0gbmV3IEhhc2hTZXQoKTsKLQotCXByb3RlY3RlZCBSZXNvdXJjZU1hbmFnZXIgcmVzTWdyOwotCi0JcHJpdmF0ZSBVUkkgbGlicmFyeVVSSTsKLQotCXByaXZhdGUgVVJJIGxpYnJhcnlVbWFVUkk7Ci0KLQlwcml2YXRlIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldDsKLQotCXByaXZhdGUgYm9vbGVhbiByZXNvbHZlUHJveHk7Ci0KLQlwdWJsaWMgTXVsdGlGaWxlVVJJQ29udmVydGVyKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCkgewotCQl0aGlzLnJlc291cmNlU2V0ID0gcmVzb3VyY2VTZXQ7Ci0JfQotCi0Jdm9pZCBzZXRSZXNvbHZlUHJveHkoYm9vbGVhbiByZXNvbHZlUHJveHkpIHsKLQkJdGhpcy5yZXNvbHZlUHJveHkgPSByZXNvbHZlUHJveHk7Ci0JfQotCi0Jdm9pZCBzZXRMaWJyYXJ5VVJJcyhNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJbGlicmFyeVVSSSA9IGxpYnJhcnkuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCWxpYnJhcnlVbWFVUkkgPSBVUkkuY3JlYXRlVVJJKG5ldyBTdHJpbmdCdWZmZXIoU0NIRU1FKQotCQkJCS5hcHBlbmQoIjovLyIpLmFwcGVuZChsaWJyYXJ5LmdldEd1aWQoKSkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGxvY2tHVUlEKFN0cmluZyBndWlkKSB7Ci0JCXN5bmNocm9uaXplZCAobG9ja2VkR1VJRHMpIHsKLQkJCWxvY2tlZEdVSURzLmFkZChndWlkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMb2NrZWRHVUlEKFN0cmluZyBndWlkKSB7Ci0JCXN5bmNocm9uaXplZCAobG9ja2VkR1VJRHMpIHsKLQkJCXJldHVybiBsb2NrZWRHVUlEcy5jb250YWlucyhndWlkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdW5sb2NrR1VJRChTdHJpbmcgZ3VpZCkgewotCQlzeW5jaHJvbml6ZWQgKGxvY2tlZEdVSURzKSB7Ci0JCQlyZXR1cm4gbG9ja2VkR1VJRHMucmVtb3ZlKGd1aWQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsI25vcm1hbGl6ZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXB1YmxpYyBVUkkgbm9ybWFsaXplKFVSSSB1cmkpIHsKLQkJcmV0dXJuIG5vcm1hbGl6ZSh1cmksIG51bGwpOwotCX0KLQotCXB1YmxpYyBVUkkgbm9ybWFsaXplKFVSSSB1cmksIEVPYmplY3QgcmVzb2x2ZXIpIHsKLQkJaWYgKFNDSEVNRS5lcXVhbHNJZ25vcmVDYXNlKHVyaS5zY2hlbWUoKSkpIHsKLQkJCVN0cmluZyBndWlkID0gdXJpLmF1dGhvcml0eSgpOwotCQkJaWYgKGlzTG9ja2VkR1VJRChndWlkKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlsb2NrR1VJRChndWlkKTsKLQotCQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gbnVsbDsKLQkJCQlIYXNoU2V0IGV4Y2x1ZGVkUmVzTWFuYWdlcnMgPSBudWxsOwotCQkJCWlmIChyZXNvbHZlciAhPSBudWxsICYmIHJlc29sdmVyLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJCQkJLmdldFJlc291cmNlTWFuYWdlcihyZXNvbHZlci5lUmVzb3VyY2UoKSk7Ci0JCQkJCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJCQkJZGVzYyA9IE11bHRpRmlsZVNhdmVVdGlsLmZpbmRSZXNvdXJjZURlc2NyaXB0b3IocmVzTWdyLAotCQkJCQkJCQlndWlkLCBudWxsLCByZXNvbHZlUHJveHkpOwotCQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJCS8vIGFkZCB0aGlzIFJlc291cmNlTWFuYWdlciBhbmQgaXRzIHN1Ym1hbmFnZXJzIHRvCi0JCQkJCQkJLy8gZXhjbHVkZWRSZXNNYW5hZ2VycwotCQkJCQkJCS8vIHNvIHRoZSBuZXh0IHNlYXJjaCBmb3IgUmVzb3VyY2VEZXNjcmlwdG9yIHdpbGwKLQkJCQkJCQkvLyBpZ25vcmUgdGhlbQotCQkJCQkJCS8vCi0JCQkJCQkJZXhjbHVkZWRSZXNNYW5hZ2VycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJCQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihyZXNNZ3IpIHsKLQotCQkJCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJCQkJcmV0dXJuICgoUmVzb3VyY2VNYW5hZ2VyKSBvYmplY3QpCi0JCQkJCQkJCQkJCS5nZXRTdWJNYW5hZ2VycygpLml0ZXJhdG9yKCk7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCX07Ci0JCQkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJCWV4Y2x1ZGVkUmVzTWFuYWdlcnMuYWRkKGl0ZXIubmV4dCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGRlc2MgPT0gbnVsbCAmJiBnZXRSZXNvdXJjZU1hbmFnZXIoKSAhPSBudWxsKSB7Ci0JCQkJCWRlc2MgPSBNdWx0aUZpbGVTYXZlVXRpbC5maW5kUmVzb3VyY2VEZXNjcmlwdG9yKAotCQkJCQkJCWdldFJlc291cmNlTWFuYWdlcigpLCBndWlkLCBleGNsdWRlZFJlc01hbmFnZXJzLAotCQkJCQkJCXJlc29sdmVQcm94eSk7Ci0JCQkJfQotCQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQkJVVJJIG5vcm1hbGl6ZWQgPSBkZXNjLmdldFJlc29sdmVkVVJJKCk7Ci0KLQkJCQkJLy8gY2hlY2sgaWYgdGhlIHJlc291cmNlIHdpdGggdGhpcyBub3JtYWxpemVkIFVSSSBoYXMKLQkJCQkJLy8gdGVtcG9yYXJ5IFVSSQotCQkJCQkvLwotCQkJCQlVUkkgdGVtcFVSSSA9IChVUkkpIHJlc291cmNlU2V0LmdldFVSSVRvVGVtcFVSSU1hcCgpLmdldCgKLQkJCQkJCQlub3JtYWxpemVkKTsKLQkJCQkJaWYgKHRlbXBVUkkgIT0gbnVsbCkgewotCQkJCQkJbm9ybWFsaXplZCA9IHRlbXBVUkk7Ci0JCQkJCX0KLQotCQkJCQlpZiAodXJpLmhhc0ZyYWdtZW50KCkpIHsKLQkJCQkJCW5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLmFwcGVuZEZyYWdtZW50KHVyaS5mcmFnbWVudCgpKTsKLQkJCQkJfQotCi0JCQkJCXJldHVybiBub3JtYWxpemVkOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdW5sb2NrR1VJRChndWlkKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci5ub3JtYWxpemUodXJpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSUNvbnZlcnRlckltcGwjY3JlYXRlSW5wdXRTdHJlYW0ob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gY3JlYXRlSW5wdXRTdHJlYW0oVVJJIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHVyaSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVJbnB1dFN0cmVhbSh1cmkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZVVSSShTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSShuZXcgU3RyaW5nQnVmZmVyKFNDSEVNRSkKLQkJCQkuYXBwZW5kKCI6Ly8iKS5hcHBlbmQoZ3VpZCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVVUkkoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlVVJJKGNyZWF0ZVVyaVN0cmluZyhlKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlVXJpU3RyaW5nKE9iamVjdCBlKSB7Ci0JCUludGVybmFsRU9iamVjdCBvID0gKEludGVybmFsRU9iamVjdCkgZTsKLQotCQlVUkkgb2JqZWN0VVJJID0gby5lUHJveHlVUkkoKTsKLQkJaWYgKG9iamVjdFVSSSAhPSBudWxsICYmIFNDSEVNRS5lcXVhbHMob2JqZWN0VVJJLnNjaGVtZSgpKSkgewotCQkJcmV0dXJuIG9iamVjdFVSSS50b1N0cmluZygpOwotCQl9Ci0KLQkJU3RyaW5nIGd1aWQgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRHdWlkKGUpOwotCQlpZiAoZ3VpZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcihTQ0hFTUUpLmFwcGVuZCgiOi8vIikuYXBwZW5kKGd1aWQpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyBwdWJsaWMgVVJJIHRvVW1hVXJpKFVSSSB1cmkpIHsKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpRmlsZVVSSUNvbnZlcnRlci50b1VtYVVyaSgpOiB1cmk9Iit1cmkpOwotCS8vIGlmKHVyaS5zY2hlbWUoKS5lcXVhbHMoInVtYSIpIHx8IHVyaURlc2NNYXAgPT0gbnVsbCkgcmV0dXJuIHVyaTsKLQkvLyBpZihsaWJyYXJ5VVJJLmVxdWFscyh1cmkpKSByZXR1cm4gbGlicmFyeVVtYVVSSTsKLQkvLyBSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3IpCi0JLy8gdXJpRGVzY01hcC5nZXQodXJpLnRyaW1GcmFnbWVudCgpLnRvU3RyaW5nKCkpOwotCS8vIHJldHVybiBkZXNjID09IG51bGwgPyB1cmkgOiBVUkkuY3JlYXRlVVJJKCJ1bWE6Ly8iICsKLQkvLyBkZXNjLmdldElkKCkpLmFwcGVuZEZyYWdtZW50KHVyaS5mcmFnbWVudCgpKTsKLQkvLyB9Ci0KLQkvLyBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZU1hbmFnZXIoUmVzb3VyY2VNYW5hZ2VyIHJlc01ncikgewotCS8vIHRoaXMucmVzTWdyID0gcmVzTWdyOwotCS8vIH0KLQotCXB1YmxpYyBSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyKCkgewotCQlpZiAocmVzTWdyID09IG51bGwpIHsKLQkJCXJlc01nciA9IHJlc291cmNlU2V0LmdldFJvb3RSZXNvdXJjZU1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gcmVzTWdyOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIFJlc291cmNlRGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIEdVSUQgZnJvbSByb290IFJlc291cmNlTWFuYWdlcgotCSAqIAotCSAqIEBwYXJhbSBndWlkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZURlc2NyaXB0b3IgZmluZFJlc291cmNlRGVzY3JpcHRvcihTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuZmluZFJlc291cmNlRGVzY3JpcHRvcihnZXRSZXNvdXJjZU1hbmFnZXIoKSwKLQkJCQlndWlkLCBudWxsLCByZXNvbHZlUHJveHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJcmVzTWdyLmRpc3Bvc2UoKTsKLQkJCXJlc01nciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcGFyYW0gbW9kaWZpZWRSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIG91dHB1dCBvZiByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBhZnRlciB0aGlzIGNhbGwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VVJJTWFwcGluZyhFT2JqZWN0IGUsIFVSSSB1cmksIFNldCBtb2RpZmllZFJlc291cmNlcykgewotCQlzZXRVUklNYXBwaW5nKGUsIHVyaSwgbW9kaWZpZWRSZXNvdXJjZXMsIHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVSSU1hcHBpbmcoRU9iamVjdCBlLCBVUkkgdXJpLCBTZXQgbW9kaWZpZWRSZXNvdXJjZXMsCi0JCQlib29sZWFuIGFmdGVyTW92ZSkgewotCQlTdHJpbmcgZ3VpZCA9IE11bHRpRmlsZVNhdmVVdGlsLmdldEd1aWQoZSk7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRSZXNvdXJjZU1hbmFnZXJGb3IoZSwKLQkJCQltb2RpZmllZFJlc291cmNlcyk7Ci0JCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gcmVzTWdyLmdldFJlc291cmNlRGVzY3JpcHRvcihndWlkKTsKLQkJaWYgKHJlc0Rlc2MgIT0gbnVsbCkgewotCQkJaWYgKGFmdGVyTW92ZSkgewotCQkJCXJlc0Rlc2Muc2V0UmVzb2x2ZWRVUkkodXJpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gcHJlc2VydmUgdGhlIGN1cnJlbnQgcmVzb2x2ZWQgVVJJCi0JCQkJcmVzRGVzYy5nZXRSZXNvbHZlZFVSSSgpOwotCQkJCS8vIHNldCBuZXcgVVJJIHN0cmluZyBmb3IgdGhlIHVwY29taW5nIG1vdmUKLQkJCQlyZXNEZXNjLnNldFVyaSh1cmkuZGVyZXNvbHZlKAotCQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0RmluYWxVUkkocmVzRGVzYy5lUmVzb3VyY2UoKSkpCi0JCQkJCQkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzRGVzYy5lUmVzb3VyY2UoKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBmaW5kIHRoZSBSZXNvdXJjZURlc2NyaXB0b3IgaW4gb3RoZXIgUmVzb3VyY2VNYW5hZ2VycwotCQkJLy8KLQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGUKLQkJCQkJLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQlSZXNvdXJjZU1hbmFnZXIgbGliUmVzTWdyID0gcmVzb3VyY2VTZXQuZ2V0Um9vdFJlc291cmNlTWFuYWdlcigpOwotCQkJcmVzRGVzYyA9IE11bHRpRmlsZVNhdmVVdGlsLmZpbmRSZXNvdXJjZURlc2NyaXB0b3IobGliUmVzTWdyLCBndWlkLAotCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHJlc01nciksIHJlc29sdmVQcm94eSk7Ci0JCQlpZiAocmVzRGVzYyAhPSBudWxsKSB7Ci0JCQkJLy8gUmVzb3VyY2VEZXNjcmlwdG9yIGFscmVhZHkgZXhpc3RzCi0JCQkJLy8gY2hhbmdlIGl0cyB1cmksIG1vdmUgaXQgYW5kIGl0cyBzdWIgbWFuYWdlciwgaWYgdGhlcmUgaXMgYW55LAotCQkJCS8vIHRvIG5ldyBSZXNvdXJjZU1hbmFnZXIKLQkJCQkvLwotCi0JCQkJLy8gZmluZCBzdWIgbWFuYWdlcgotCQkJCVJlc291cmNlTWFuYWdlciBjdXJyZW50UmVzTWdyID0gKFJlc291cmNlTWFuYWdlcikgcmVzRGVzYwotCQkJCQkJLmVDb250YWluZXIoKTsKLQkJCQlSZXNvdXJjZU1hbmFnZXIgc3ViTWdyID0gbnVsbDsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjdXJyZW50UmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2VNYW5hZ2VyIG1nciA9IChSZXNvdXJjZU1hbmFnZXIpIGl0ZXIubmV4dCgpOwotCQkJCQlVUkkgbWdyVVJJID0gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIG1nci5lUmVzb3VyY2UoKSkKLQkJCQkJCQkuZ2V0RmluYWxVUkkoKTsKLQkJCQkJaWYgKG1nclVSSS5lcXVhbHModXJpKSkgewotCQkJCQkJc3ViTWdyID0gbWdyOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBtb3ZlIFJlc291cmNlRGVzY3JpcHRvcgotCQkJCXJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuYWRkKHJlc0Rlc2MpOwotCQkJCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChjdXJyZW50UmVzTWdyLmVSZXNvdXJjZSgpKTsKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc01nci5lUmVzb3VyY2UoKSk7Ci0JCQkJfQotCi0JCQkJLy8gbW92ZSBzdWIgUmVzb3VyY2VNYW5hZ2VyCi0JCQkJaWYgKHN1Yk1nciAhPSBudWxsKSB7Ci0JCQkJCXJlc01nci5nZXRTdWJNYW5hZ2VycygpLmFkZChzdWJNZ3IpOwotCQkJCX0KLQotCQkJCS8vIHNldCBuZXcgVVJJCi0JCQkJaWYgKGFmdGVyTW92ZSkgewotCQkJCQlyZXNEZXNjLnNldFJlc29sdmVkVVJJKHVyaSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gcHJlc2VydmUgdGhlIGN1cnJlbnQgcmVzb2x2ZWQgVVJJCi0JCQkJCXJlc0Rlc2MuZ2V0UmVzb2x2ZWRVUkkoKTsKLQkJCQkJLy8gc2V0IG5ldyBVUkkgc3RyaW5nIGZvciB0aGUgdXBjb21pbmcgbW92ZQotCQkJCQlyZXNEZXNjLnNldFVyaSh1cmkuZGVyZXNvbHZlKHJlc0Rlc2MuZVJlc291cmNlKCkuZ2V0VVJJKCkpCi0JCQkJCQkJLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc0Rlc2MuZVJlc291cmNlKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5yZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIocmVzTWdyLCBlLCB1cmkpOwotCQkJCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKQotCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzTWdyLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVVJJIHVyaSA9IFVSSQotCQkJCS5jcmVhdGVVUkkoInVtYTovL19MUHpkQUdaN0VkbUFtX3hTWDJFZFVBIy8vQGJyZWFrZG93bkVsZW1lbnRzLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4odXJpKTsKLQkJU3lzdGVtLm91dAotCQkJCS5wcmludGxuKCJkZXJlc29sdmVkIFVSSTogIiArIHVyaS5kZXJlc29sdmUoVVJJLmNyZWF0ZVVSSSgidW1hOi8vX0xQemRBR1o3RWRtQW1feFNYMkVkVUEiKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSUhlbHBlckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JSGVscGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDhhMDhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JSGVscGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JSGVscGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotCi0vKioKLSAqIFhNTEhlbHBlciBpbXBsZW1lbnRhdGlvbiBmb3IgbGlicmFyeSBYTUkgcGVyc2lzdGVuY2UKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE11bHRpRmlsZVhNSUhlbHBlckltcGwgZXh0ZW5kcyBYTUlIZWxwZXJJbXBsIHsKLQotCS8qKgotCSAqIFBsYXRmb3JtLXNwZWNpZmljIGxpbmUgc2VwYXJhdG9yLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NFUCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbG9nRXJyb3IgPSB0cnVlOwotCi0JcHJvdGVjdGVkIExpc3Qgc2FtZURvY1JlZmVyZW5jZXM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGlzY2FyZFVucmVzb2x2ZWRSZWY7Ci0JCi0JLyoqCi0JICogQSB0ZW1wb3JhcnkgZmxhZyB0byBoYXZlIGEgcXVpY2sgZml4IGZvciBnZXRWYWx1ZSBtZXRob2QgY2FsbCB3aXRob3V0IG1vZGlmeWluZyB0aGUgcGFzc2VkCi0JICogb2JqZWN0LiBTaG91bGQgYmUgcmVtb3ZlZCB3aXRoIGZ1dHVyZSByZWZhY3RvcmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdW5tb2RpZmllZEdldFZhbHVlID0gZmFsc2U7CQkKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE11bHRpRmlsZVhNSUhlbHBlckltcGwoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHhtaVJlcykgewotCQlzdXBlcih4bWlSZXMpOwotCQlzYW1lRG9jUmVmZXJlbmNlcyA9IG5ldyBVbmlxdWVFTGlzdCgpOwotCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHhtaVJlcwotCQkJCS5nZXRSZXNvdXJjZVNldCgpKS5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5nZXQoCi0JCQkJTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMpOwotCQlkaXNjYXJkVW5yZXNvbHZlZFJlZiA9IGIgIT0gbnVsbCA/IGIuYm9vbGVhblZhbHVlKCkgOiBmYWxzZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTEhlbHBlckltcGwjc2V0UmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZShYTUxSZXNvdXJjZSByZXNvdXJjZSkgewotCQlzdXBlci5zZXRSZXNvdXJjZShyZXNvdXJjZSk7Ci0JCWlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQlyZXNvdXJjZVVSSSA9ICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKXJlc291cmNlKS5nZXRGaW5hbFVSSSgpOwotCQkJZGVyZXNvbHZlID0gcmVzb3VyY2VVUkkgIT0gbnVsbCAmJiAhcmVzb3VyY2VVUkkuaXNSZWxhdGl2ZSgpICYmIHJlc291cmNlVVJJLmlzSGllcmFyY2hpY2FsKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxIZWxwZXJJbXBsI2dldEhSRUYob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIUkVGKEVPYmplY3Qgb2JqKSB7Ci0JCWlmIChkaXNjYXJkVW5yZXNvbHZlZFJlZikgewotCQkJLy8gcmVtb3ZlIHVucmVzb2x2ZWQgcmVmZXJlbmNlcwotCQkJLy8KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNdWx0aVJlc291cmNlRU9iamVjdAotCQkJCQkmJiAhKChNdWx0aVJlc291cmNlRU9iamVjdCkgb2JqKS5pc1ZhbGlkKCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNdWx0aVJlc291cmNlRU9iamVjdCkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG8gPSAoSW50ZXJuYWxFT2JqZWN0KSBvYmo7Ci0KLQkJCVVSSSBvYmplY3RVUkkgPSBvLmVQcm94eVVSSSgpOwotCQkJaWYgKG9iamVjdFVSSSA9PSBudWxsKSB7Ci0JCQkJUmVzb3VyY2Ugb3RoZXJSZXNvdXJjZSA9IG9iai5lUmVzb3VyY2UoKTsKLQkJCQlpZiAob3RoZXJSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCW9iamVjdFVSSSA9IGhhbmRsZURhbmdsaW5nSFJFRihvYmopOwotCQkJCQlpZiAob2JqZWN0VVJJID09IG51bGwpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChyZXNvdXJjZSA9PSBvdGhlclJlc291cmNlKSB7Ci0JCQkJCXJldHVybiAiIyIgKyByZXNvdXJjZS5nZXRVUklGcmFnbWVudChvYmopOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQkJCS8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIE1ldGhvZENvbmZpZ3VyYXRpb24uCi0JCQkJCQkvLyBTZWUKLQkJCQkJCS8vIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGwubG9hZENvbmZpZ3VyYXRpb25zKCkKLQkJCQkJCS8vCi0JCQkJCQlFT2JqZWN0IGxpYiA9IG9iai5lQ29udGFpbmVyKCk7Ci0JCQkJCQlpZiAobGliICE9IG51bGwpIHsKLQkJCQkJCQlvdGhlclJlc291cmNlID0gbGliLmVSZXNvdXJjZSgpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAob3RoZXJSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG90aGVyUmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQkJCWlmKHJlc291cmNlU2V0IGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIAotCQkJCQkJCQkmJiAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbClyZXNvdXJjZVNldCkuZ2V0UmVzb3VyY2VNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJCQkJCW9iamVjdFVSSSA9IE11bHRpRmlsZVNhdmVVdGlsLmdldEZpbmFsVVJJKG90aGVyUmVzb3VyY2UpLmFwcGVuZEZyYWdtZW50KGdldFVSSUZyYWdtZW50KG90aGVyUmVzb3VyY2UsIG9iaikpOwotCQkJCQkJCXJldHVybiBkZXJlc29sdmUob2JqZWN0VVJJKS50b1N0cmluZygpOwotCQkJCQkJfQotCQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSBNdWx0aUZpbGVTYXZlVXRpbAotCQkJCQkJCQkuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKG90aGVyUmVzb3VyY2UpOwotCQkJCQkJaWYgKHJlc0Rlc2MgIT0gbnVsbCkgewotCQkJCQkJCW9iamVjdFVSSSA9IE11bHRpRmlsZVVSSUNvbnZlcnRlci5jcmVhdGVVUkkoCi0JCQkJCQkJCQlyZXNEZXNjLmdldElkKCkpLmFwcGVuZEZyYWdtZW50KAotCQkJCQkJCQkJZ2V0VVJJRnJhZ21lbnQob3RoZXJSZXNvdXJjZSwgb2JqKSk7Ci0JCQkJCQkJcmV0dXJuIG9iamVjdFVSSS50b1N0cmluZygpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFvYmplY3RVUkkuc2NoZW1lKCkuZXF1YWxzKE11bHRpRmlsZVVSSUNvbnZlcnRlci5TQ0hFTUUpKSB7Ci0JCQkJCVN0cmluZyBmcmFnbWVudCA9IG9iamVjdFVSSS5mcmFnbWVudCgpOwotCQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwKLQkJCQkJCQkmJiAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UpCi0JCQkJCQkJCQkuZ2V0RU9iamVjdEJ5SUQoZnJhZ21lbnQpICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiAiIyIgKyBmcmFnbWVudDsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgewotCQkJCQkJb2JqZWN0VVJJID0gZGVyZXNvbHZlKG9iamVjdFVSSSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIG9iamVjdFVSSS50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldEhSRUYob2JqKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFByb3h5UmVmZXJlbmNlIHsKLQkJcHJpdmF0ZSBJbnRlcm5hbEVPYmplY3Qgb3duZXI7Ci0KLQkJcHJpdmF0ZSBFUmVmZXJlbmNlIHJlZmVyZW5jZTsKLQotCQlwcml2YXRlIEludGVybmFsRU9iamVjdCBwcm94eTsKLQotCQkvKioKLQkJICogQHBhcmFtIG93bmVyCi0JCSAqIEBwYXJhbSByZWZlcmVuY2UKLQkJICogQHBhcmFtIHByb3h5Ci0JCSAqLwotCQlwdWJsaWMgUHJveHlSZWZlcmVuY2UoSW50ZXJuYWxFT2JqZWN0IG93bmVyLCBFUmVmZXJlbmNlIHJlZmVyZW5jZSwKLQkJCQlJbnRlcm5hbEVPYmplY3QgcHJveHkpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCQl0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTsKLQkJCXRoaXMucHJveHkgPSBwcm94eTsKLQkJfQotCi0JCXB1YmxpYyBJbnRlcm5hbEVPYmplY3QgZ2V0T3duZXIoKSB7Ci0JCQlyZXR1cm4gb3duZXI7Ci0JCX0KLQotCQlwdWJsaWMgSW50ZXJuYWxFT2JqZWN0IGdldFByb3h5KCkgewotCQkJcmV0dXJuIHByb3h5OwotCQl9Ci0KLQkJcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlKCkgewotCQkJcmV0dXJuIHJlZmVyZW5jZTsKLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgcG9zaXRpb24pIHsKLQotCQlpbnQga2luZCA9IGdldEZlYXR1cmVLaW5kKGZlYXR1cmUpOwotCi0JCXRyeSB7Ci0JCQkvLyBUT0RPOiB0ZW1wb3JhcnkgZml4IHRvIGF2b2lkIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwKLQkJCS8vIG5lZWRzIHJldmlzaXQKLQkJCS8vCi0JCQlpZiAoa2luZCA9PSBJU19NQU5ZX01PVkUpIHsKLQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgb2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKHBvc2l0aW9uID4gLTEgJiYgbGlzdC5pbmRleE9mKHZhbHVlKSA9PSAtMSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQlzdXBlci5zZXRWYWx1ZShvYmplY3QsIGZlYXR1cmUsIHZhbHVlLCBwb3NpdGlvbik7Ci0KLQkJCXN3aXRjaCAoa2luZCkgewotCQkJY2FzZSBJU19NQU5ZX0FERDoKLQkJCWNhc2UgSVNfTUFOWV9NT1ZFOgotCQkJCUludGVybmFsRUxpc3QgbGlzdCA9IChJbnRlcm5hbEVMaXN0KSBvYmplY3QuZUdldChmZWF0dXJlKTsKLQotCQkJCS8vIHNhdmUgc2FtZSBkb2N1bWVudCBmb3J3YXJkICh1bmlkaXJlY3Rpb25hbCkgcmVmZXJlbmNlcyB0bwotCQkJCS8vIHJlc29sdmUgYXQgdGhlIGVuZCBvZiBkb2N1bWVudCBwYXJzaW5nCi0JCQkJLy8JCQkJCi0JCQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKSB7Ci0JCQkJCUVSZWZlcmVuY2UgcmVmID0gKEVSZWZlcmVuY2UpIGZlYXR1cmU7Ci0JCQkJCWlmIChyZWYuZ2V0RU9wcG9zaXRlKCkgIT0gbnVsbCkgewotCQkJCQkJSW50ZXJuYWxFT2JqZWN0IG93bmVyID0gKEludGVybmFsRU9iamVjdCkgb2JqZWN0OwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5iYXNpY0l0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlJbnRlcm5hbEVPYmplY3QgZWxlbWVudCA9IChJbnRlcm5hbEVPYmplY3QpIGl0ZXIKLQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJaWYgKGVsZW1lbnQuZUlzUHJveHkoKQotCQkJCQkJCQkJJiYgZWxlbWVudC5lUHJveHlVUkkoKS50cmltRnJhZ21lbnQoKQotCQkJCQkJCQkJCQkuZXF1YWxzKHJlc291cmNlVVJJKSkgewotCQkJCQkJCQlzYW1lRG9jUmVmZXJlbmNlcy5hZGQobmV3IFByb3h5UmVmZXJlbmNlKG93bmVyLAotCQkJCQkJCQkJCXJlZiwgZWxlbWVudCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWJyZWFrOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChsb2dFcnJvcikgewotCQkJCWlmKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJU3RyaW5nIGVyck1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoCi0JCQkJCQkiTXVsdGlGaWxlWE1JSGVscGVySW1wbC5zZXRWYWx1ZSgpOiBFUlJPUiIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoIlxuICBvYmplY3Q6ICIpLmFwcGVuZChvYmplY3QpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoIlxuICBmZWF0dXJlOiAiKS5hcHBlbmQoZmVhdHVyZSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLmFwcGVuZCgiXG4gIHZhbHVlOiAiKS5hcHBlbmQodmFsdWUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoIlxuICBwb3NpdGlvbjogIikuYXBwZW5kKHBvc2l0aW9uKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuYXBwZW5kKCJcbiAga2luZDogIikuYXBwZW5kKGtpbmQpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS50b1N0cmluZygpOwotCQkJCWlmKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbihlcnJNc2cpOwotCQkJCX0KLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGVyck1zZyk7Ci0JCQl9Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTEhlbHBlckltcGwjZ2V0VmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZShFT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGYpIHsKLQkJT2JqZWN0IHZhbHVlID0gc3VwZXIuZ2V0VmFsdWUob2JqLCBmKTsKLQkJCi0JCWlmICh1bm1vZGlmaWVkR2V0VmFsdWUpIHsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCQkKLQkJLy8gcmVtb3ZlIGFueSB2YWx1ZSB0aGF0IGRvZXMgbm90IGJlbG9uZyB0byBhbnkgcmVzb3VyY2UKLQkJLy8KLQkJaWYoZiBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpIHsKLQkJCWlmKGYuaXNNYW55KCkpIHsKLQkJCQlpZihmLmlzQ2hhbmdlYWJsZSgpICYmIHZhbHVlIGluc3RhbmNlb2YgSW50ZXJuYWxFTGlzdCkgewotCQkJCQlJbnRlcm5hbEVMaXN0IGxpc3QgPSAoSW50ZXJuYWxFTGlzdCkgdmFsdWU7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZighby5lSXNQcm94eSgpICYmIG8uZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgdmFsdWU7Ci0JCQkJaWYoIW8uZUlzUHJveHkoKSAmJiBvLmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQkJCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSUxvYWRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSUxvYWRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkODFiNjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVYTUlMb2FkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlNBWFhNSUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSUxvYWRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuRVBGVmVyc2lvbnM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiBYTUxMb2FkIGltcGxlbWVudGF0aW9uIGZvciBsaWJyYXJ5IFhNSSBwZXJzaXN0ZW5jZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlGaWxlWE1JTG9hZEltcGwgZXh0ZW5kcyBYTUlMb2FkSW1wbCB7Ci0KLQlwdWJsaWMgTXVsdGlGaWxlWE1JTG9hZEltcGwoWE1MSGVscGVyIGhlbHBlcikgewotCQlzdXBlcihoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBEZWZhdWx0SGFuZGxlciBtYWtlRGVmYXVsdEhhbmRsZXIoKSB7Ci0JCXJldHVybiBuZXcgU0FYWE1JSGFuZGxlcihyZXNvdXJjZSwgaGVscGVyLCBvcHRpb25zKSB7Ci0JCQkgIAotCQkJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKEVPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0VsZW1lbnQpIHsKLQkJCQlpZiAoRVBGVmVyc2lvbnMuVE9PTF9JRC5lcXVhbHMocHJlZml4KSkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEZlYXR1cmUob2JqZWN0LCBwcmVmaXgsIG5hbWUsIGlzRWxlbWVudCk7Ci0JCQl9Ci0JCQkKLQkJCXByb3RlY3RlZCB2b2lkIGhhbmRsZVVua25vd25GZWF0dXJlKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzRWxlbWVudCwgRU9iamVjdCBwZWVrT2JqZWN0LCBTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAoRVBGVmVyc2lvbnMuVE9PTF9JRC5lcXVhbHMocHJlZml4KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXN1cGVyLmhhbmRsZVVua25vd25GZWF0dXJlKHByZWZpeCwgbmFtZSwgaXNFbGVtZW50LCBwZWVrT2JqZWN0LCB2YWx1ZSk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgewotCQkJCXN1cGVyLmVuZERvY3VtZW50KCk7Ci0KLQkJCQlpZiAoaGVscGVyIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JSGVscGVySW1wbCkgewotCQkJCQlMaXN0IHNhbWVEb2NSZWZlcmVuY2VzID0gKChNdWx0aUZpbGVYTUlIZWxwZXJJbXBsKSBoZWxwZXIpLnNhbWVEb2NSZWZlcmVuY2VzOwotCQkJCQlpZiAoIXNhbWVEb2NSZWZlcmVuY2VzLmlzRW1wdHkoKSkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2FtZURvY1JlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU11bHRpRmlsZVhNSUhlbHBlckltcGwuUHJveHlSZWZlcmVuY2UgcHJveHlSZWYgPSAoTXVsdGlGaWxlWE1JSGVscGVySW1wbC5Qcm94eVJlZmVyZW5jZSkgaXRlcgotCQkJCQkJCQkJLm5leHQoKTsKLQotCQkJCQkJCS8vIHRoaXMgd2lsbCBtZXJnZSB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBtYXBzIGFzIHdlbGwKLQkJCQkJCQlFT2JqZWN0IHJlc29sdmVkID0gcHJveHlSZWYuZ2V0T3duZXIoKQotCQkJCQkJCQkJLmVSZXNvbHZlUHJveHkocHJveHlSZWYuZ2V0UHJveHkoKSk7Ci0KLQkJCQkJCQlJbnRlcm5hbEVMaXN0IHZhbHVlcyA9IChJbnRlcm5hbEVMaXN0KSBwcm94eVJlZgotCQkJCQkJCQkJLmdldE93bmVyKCkuZUdldChwcm94eVJlZi5nZXRSZWZlcmVuY2UoKSk7Ci0JCQkJCQkJaW50IGluZGV4ID0gdmFsdWVzLmJhc2ljTGlzdCgpLmluZGV4T2YoCi0JCQkJCQkJCQlwcm94eVJlZi5nZXRQcm94eSgpKTsKLQkJCQkJCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQkJCQkJdmFsdWVzLnNldFVuaXF1ZShpbmRleCwgcmVzb2x2ZWQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxMb2FkSW1wbCNsb2FkKG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2UsCi0JICogICAgICBqYXZhLmlvLklucHV0U3RyZWFtLCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWQoWE1MUmVzb3VyY2UgcmVzb3VyY2UsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBNYXAgb3B0aW9ucykKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQkvLyBzdHJpcCBvZmYgdGhlIFVURi04IEJPTSBieXRlcyBpZiB0aGV5IGFyZSBzdGlsbCB0aGVyZQotCQkJLy8KLQkJCVB1c2hiYWNrSW5wdXRTdHJlYW0gcGJpcyA9IG5ldyBQdXNoYmFja0lucHV0U3RyZWFtKGlucHV0U3RyZWFtLCAzKTsKLQkJCWJ5dGUgYm9tW10gPSBuZXcgYnl0ZVszXTsKLQkJCWlmIChwYmlzLnJlYWQoYm9tKSA9PSAzKSB7Ci0JCQkJaWYgKGJvbVswXSAhPSAoYnl0ZSkgMHhFRiB8fCBib21bMV0gIT0gKGJ5dGUpIDB4QkIKLQkJCQkJCXx8IGJvbVsyXSAhPSAoYnl0ZSkgMHhCRikgewotCQkJCQlwYmlzLnVucmVhZChib20pOwotCQkJCX0KLQkJCX0KLQotCQkJc3VwZXIubG9hZChyZXNvdXJjZSwgcGJpcywgb3B0aW9ucyk7Ci0JCX0gY2F0Y2ggKFJlc291cmNlLklPV3JhcHBlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoIXJlc291cmNlLmdldEVycm9ycygpLmlzRW1wdHkoKSAmJiBoZWxwZXIgPT0gbnVsbCkgewotCQkJCS8vIHVua25vd24gZmVhdHVyZXMgZGV0ZWN0ZWQsIGxvZyB0aGUgd2FybmluZyBhbmQgaWdub3JlIHRoZW0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRFcnJvcnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFeGNlcHRpb24gZXggPSAoRXhjZXB0aW9uKSBpdGVyLm5leHQoKTsKLQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhleC5nZXRNZXNzYWdlKCkpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSVJlc291cmNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlYzVkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSVJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudHNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxMb2FkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MU2F2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5JRmFpbFNhZmVTYXZhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuRGVmYXVsdFZhbHVlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogUmVzb3VyY2UgaW1wbGVtZW50YXRpb24gZm9yIGxpYnJhcnkgWE1JIHBlcnNpc3RlbmNlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgZXh0ZW5kcyBYTUlSZXNvdXJjZUltcGwgCi1pbXBsZW1lbnRzIElMaWJyYXJ5UmVzb3VyY2UsIElGYWlsU2FmZVNhdmFibGUKLXsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0ZW1wRGlyOwotCi0JcHJpdmF0ZSBVUkkgZmluYWxVUkk7Ci0KLQlwcml2YXRlIFVSSSBvbGRVUkk7Ci0KLQlwcml2YXRlIFN0cmluZyBiYWNrdXBGaWxlOwotCi0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudFR4SUQ7Ci0KLQlwcml2YXRlIGxvbmcgbGFzdExvYWRUaW1lU3RhbXA7Ci0KLQlwcml2YXRlIFJlc291cmNlRGVzY3JpcHRvciByZXNvdXJjZURlc2NyaXB0b3I7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNVbmxvYWRpbmc7Ci0KLQkvKiogQ2FjaGVkIG1vZGlmaWNhdGlvbiBzdGFtcCBvZiB0aGUgcmVzb3VyY2UgZmlsZSAqLwotCXByaXZhdGUgbG9uZyBtb2RpZmljYXRpb25TdGFtcDsKLQotCXByaXZhdGUgSUZpbGVJbmZvIGZpbGVJbmZvOwotCi0JcHVibGljIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbChVUkkgdXJpKSB7Ci0JCXN1cGVyKHVyaSk7Ci0JCXNldEludHJpbnNpY0lEVG9FT2JqZWN0TWFwKG5ldyBIYXNoTWFwKCkpOwkJCi0JfQotCi0JcHJvdGVjdGVkIFhNTExvYWQgY3JlYXRlWE1MTG9hZCgpIHsKLQkJcmV0dXJuIG5ldyBNdWx0aUZpbGVYTUlMb2FkSW1wbChjcmVhdGVYTUxIZWxwZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI2NyZWF0ZVhNTFNhdmUoKQotCSAqLwotCXByb3RlY3RlZCBYTUxTYXZlIGNyZWF0ZVhNTFNhdmUoKSB7Ci0JCXJldHVybiBuZXcgTXVsdGlGaWxlWE1JU2F2ZUltcGwoY3JlYXRlWE1MSGVscGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbCNjcmVhdGVYTUxIZWxwZXIoKQotCSAqLwotCXByb3RlY3RlZCBYTUxIZWxwZXIgY3JlYXRlWE1MSGVscGVyKCkgewotCQlyZXR1cm4gbmV3IE11bHRpRmlsZVhNSUhlbHBlckltcGwodGhpcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlI2dldElEKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCVN0cmluZyBpZCA9IE11bHRpRmlsZVNhdmVVdGlsLmdldEd1aWQoZU9iamVjdCk7Ci0JCWlmIChpZCAhPSBudWxsKQotCQkJcmV0dXJuIGlkOwotCQlyZXR1cm4gc3VwZXIuZ2V0SUQoZU9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI3NldElEKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJRChFT2JqZWN0IGVPYmplY3QsIFN0cmluZyBpZCkgewotCQlPYmplY3Qgb2xkSUQgPSBpZCAhPSBudWxsID8gZ2V0RU9iamVjdFRvSURNYXAoKS5wdXQoZU9iamVjdCwgaWQpCi0JCQkJOiBnZXRFT2JqZWN0VG9JRE1hcCgpLnJlbW92ZShlT2JqZWN0KTsKLQotCQlpZihnZXRSZXNvdXJjZVNldCgpID09IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQl9Ci0JCU1hcCBndWlkVG9NZXRob2RFbGVtZW50TWFwID0gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGdldFJlc291cmNlU2V0KCkpCi0JCQkJLmdldEd1aWRUb01ldGhvZEVsZW1lbnRNYXAoKTsKLQotCQlpZiAob2xkSUQgIT0gbnVsbCkgewotCQkJZ2V0SURUb0VPYmplY3RNYXAoKS5yZW1vdmUob2xkSUQpOwotCQkJCi0JCQlpZiAoZU9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkvLyByZW1vdmUgb2JqZWN0IGZyb20gZ3VpZFRvTWV0aG9kRWxlbWVudE1hcCBvbmx5IGlmIGl0IGlzIGEgcHJveHkKLQkJCQkvLwotCQkJCWlmKGVPYmplY3QuZUlzUHJveHkoKSkgewotCQkJCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBndWlkVG9NZXRob2RFbGVtZW50TWFwLmdldChpZCk7Ci0JCQkJCWlmKG9iaiAhPSBudWxsICYmIG9iai5lSXNQcm94eSgpKSB7Ci0JCQkJCQlndWlkVG9NZXRob2RFbGVtZW50TWFwLnJlbW92ZShpZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWd1aWRUb01ldGhvZEVsZW1lbnRNYXAucmVtb3ZlKGlkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJZ2V0SURUb0VPYmplY3RNYXAoKS5wdXQoaWQsIGVPYmplY3QpOwotCQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJZ3VpZFRvTWV0aG9kRWxlbWVudE1hcC5wdXQoaWQsIGVPYmplY3QpOwotCi0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGVPYmplY3Q7Ci0JCQkJaWYgKCFlLmdldEd1aWQoKS5lcXVhbHMoaWQpKSB7Ci0JCQkJCWUuc2V0R3VpZChpZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI3VzZVVVSURzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VVVUlEcygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UjZ2V0VVJJRnJhZ21lbnQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUklGcmFnbWVudChFT2JqZWN0IGVPYmplY3QpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBpZCA9IGdldElEKGVPYmplY3QpOwotCi0JCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJCXJldHVybiBpZDsKLQkJCX0gZWxzZSB7Ci0JCQkJTGlzdCB1cmlGcmFnbWVudFBhdGggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChFT2JqZWN0IGNvbnRhaW5lciA9IGVPYmplY3QuZUNvbnRhaW5lcigpOyBjb250YWluZXIgIT0gbnVsbAotCQkJCQkJJiYgY29udGFpbmVyLmVSZXNvdXJjZSgpID09IHRoaXM7IGNvbnRhaW5lciA9IGVPYmplY3QKLQkJCQkJCS5lQ29udGFpbmVyKCkpIHsKLQkJCQkJdXJpRnJhZ21lbnRQYXRoLmFkZCgoKEludGVybmFsRU9iamVjdCkgY29udGFpbmVyKQotCQkJCQkJCS5lVVJJRnJhZ21lbnRTZWdtZW50KGVPYmplY3QuZUNvbnRhaW5pbmdGZWF0dXJlKCksCi0JCQkJCQkJCQllT2JqZWN0KSk7Ci0JCQkJCWVPYmplY3QgPSBjb250YWluZXI7Ci0JCQkJfQotCi0JCQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQoZ2V0VVJJRnJhZ21lbnRSb290U2VnbWVudChlT2JqZWN0KSk7Ci0KLQkJCQlmb3IgKExpc3RJdGVyYXRvciBpID0gdXJpRnJhZ21lbnRQYXRoCi0JCQkJCQkubGlzdEl0ZXJhdG9yKHVyaUZyYWdtZW50UGF0aC5zaXplKCkpOyBpLmhhc1ByZXZpb3VzKCk7KSB7Ci0JCQkJCXJlc3VsdC5hcHBlbmQoJy8nKTsKLQkJCQkJcmVzdWx0LmFwcGVuZCgoU3RyaW5nKSBpLnByZXZpb3VzKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciBnZXR0aW5nIFVSSSBmcmFnbWVudCBmb3IgIiArIGVPYmplY3QpOyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI2F0dGFjaGVkSGVscGVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGF0dGFjaGVkSGVscGVyKEVPYmplY3QgZU9iamVjdCkgewotCQlzdXBlci5hdHRhY2hlZEhlbHBlcihlT2JqZWN0KTsKLQotCQlpZiAodXNlSURzKCkpIHsKLQkJCVN0cmluZyBpZCA9IGdldElEKGVPYmplY3QpOwotCQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCQkvLyB1cGRhdGUgdGhlIGVPYmplY3RUb0lETWFwCi0JCQkJLy8KLQkJCQlnZXRFT2JqZWN0VG9JRE1hcCgpLnB1dChlT2JqZWN0LCBpZCk7Ci0JCQkJCi0JCQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCSgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBnZXRSZXNvdXJjZVNldCgpKQotCQkJCQkJCS5nZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkucHV0KGlkLCBlT2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaXNUcmFja2luZ01vZGlmaWNhdGlvbigpICYmIGVPYmplY3QuZVJlc291cmNlKCkgIT0gdGhpcykgewotCQkJLy8gcmVtb3ZlIHRoZSBtb2RpZmljYXRpb24gdHJhY2tpbmcgYWRhcHRlciBmcm9tIHRoZSBlT2JqZWN0Ci0JCQkvLwotCQkJZU9iamVjdC5lQWRhcHRlcnMoKS5yZW1vdmUobW9kaWZpY2F0aW9uVHJhY2tpbmdBZGFwdGVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhdHRhY2hlZEFsbFdpdGhJRHMoRU9iamVjdCBlT2JqKSB7Ci0JCS8vIGF0dGFjaGVkSGVscGVyKGVPYmopOwotCQkvLyBMaXN0IGxpc3QgPSBlT2JqLmVDb250ZW50cygpOwotCQkvLyBpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkvLyBFT2JqZWN0IG8gPSAoRU9iamVjdCkgbGlzdC5nZXQoaSk7Ci0JCS8vIGlmIChvLmVSZXNvdXJjZSgpID09IHRoaXMpIHsKLQkJLy8gYXR0YWNoZWRBbGxXaXRoSURzKG8pOwotCQkvLyB9Ci0JCS8vIH0KLQotCQlJdGVyYXRvciBhbGxDb250ZW50cyA9IG5ldyBDb250ZW50VHJlZUl0ZXJhdG9yKGVPYmopOwotCi0JCXdoaWxlIChhbGxDb250ZW50cy5oYXNOZXh0KCkpIHsKLQkJCWF0dGFjaGVkSGVscGVyKChFT2JqZWN0KSBhbGxDb250ZW50cy5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJhc2ljQXR0YWNoZWRBbGwoRU9iamVjdCBlT2JqKSB7Ci0JCWVPYmouZUFkYXB0ZXJzKCkuYWRkKG1vZGlmaWNhdGlvblRyYWNraW5nQWRhcHRlcik7Ci0JCUxpc3QgbGlzdCA9IGVPYmouZUNvbnRlbnRzKCk7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgbGlzdC5nZXQoaSk7Ci0JCQlpZiAoby5lUmVzb3VyY2UoKSA9PSB0aGlzKSB7Ci0JCQkJYmFzaWNBdHRhY2hlZEFsbChvKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIG9uIGFuIG9iamVjdCBhbmQgYWxsIG9mIGl0cyBvZmZzdHJpbmcgb2JqZWN0cyB0aGF0IGFyZSBpbiB0aGUgc2FtZQotCSAqIHJlc291cmNlIGFzIHRoZSBvYmplY3Qgd2hlbiB0aGUgb2JqZWN0IGlzIGF0dGFjaGVkIHRvIHRoaXMgcmVzb3VyY2UuIFRoaXMKLQkgKiBtZXRob2QgaXMgZXhwZW5zaXZlLCBzbyB1c2UgaXQgd2l0aCBjYXV0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlT2JqCi0JICovCi0JcHVibGljIHZvaWQgYXR0YWNoZWRBbGwoRU9iamVjdCBlT2JqKSB7Ci0JCWlmICh1c2VJRHMoKSkgewotCQkJYXR0YWNoZWRBbGxXaXRoSURzKGVPYmopOwotCQl9IGVsc2UgewotCQkJYmFzaWNBdHRhY2hlZEFsbChlT2JqKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlLkludGVybmFsI2F0dGFjaGVkKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGF0dGFjaGVkKEVPYmplY3QgZU9iamVjdCkgewotCQlhdHRhY2hlZEFsbChlT2JqZWN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGV0YWNoZWRBbGxXaXRoSURzKEVPYmplY3QgZU9iaikgewotCQlJdGVyYXRvciBhbGxDb250ZW50cyA9IG5ldyBDb250ZW50VHJlZUl0ZXJhdG9yKGVPYmopOwotCi0JCXdoaWxlIChhbGxDb250ZW50cy5oYXNOZXh0KCkpIHsKLQkJCWRldGFjaGVkSGVscGVyKChFT2JqZWN0KSBhbGxDb250ZW50cy5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJhc2ljRGV0YWNoZWRBbGwoRU9iamVjdCBlT2JqKSB7Ci0JCWVPYmouZUFkYXB0ZXJzKCkucmVtb3ZlKG1vZGlmaWNhdGlvblRyYWNraW5nQWRhcHRlcik7Ci0JCUxpc3QgbGlzdCA9IGVPYmouZUNvbnRlbnRzKCk7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgbGlzdC5nZXQoaSk7Ci0JCQlpZiAoby5lUmVzb3VyY2UoKSA9PSB0aGlzKSB7Ci0JCQkJYmFzaWNEZXRhY2hlZEFsbChvKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNnZXRFT2JqZWN0QnlJRChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVPYmplY3RCeUlEKFN0cmluZyBpZCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIGd1aWQgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRHdWlkKGVsZW1lbnQpOwotCQkJaWYgKGd1aWQgIT0gbnVsbCAmJiBndWlkLmVxdWFscyhpZCkpCi0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQotCQkvLyByZXR1cm4gc3VwZXIuZ2V0RU9iamVjdEJ5SUQoaWQpOwotCi0JCWlmIChpZFRvRU9iamVjdE1hcCAhPSBudWxsKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3QgZU9iamVjdCA9IChJbnRlcm5hbEVPYmplY3QpIGlkVG9FT2JqZWN0TWFwLmdldChpZCk7Ci0JCQlpZiAoZU9iamVjdCAhPSBudWxsICYmICFlT2JqZWN0LmVJc1Byb3h5KCkpIHsKLQkJCQlyZXR1cm4gZU9iamVjdDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIElGaWxlSW5mbyBnZXRGaWxlSW5mbygpIHsKLQkJaWYoZmlsZUluZm8gPT0gbnVsbCB8fCAhbmV3IEZpbGUoZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpLmVxdWFscyhmaWxlSW5mby5nZXRGaWxlKCkpKSB7Ci0JCQlmaWxlSW5mbyA9IEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0RmlsZUluZm8odGhpcyk7IAotCQl9Ci0JCXJldHVybiBmaWxlSW5mbzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbCNsb2FkKGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIHZvaWQgbG9hZChNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzVW5sb2FkaW5nKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWJvb2xlYW4gb2xkID0gRGVmYXVsdFZhbHVlTWFuYWdlci5JTlNUQU5DRS5pc1VzZVN0YXRpYygpOwotCQl0cnkgewotCQkJRGVmYXVsdFZhbHVlTWFuYWdlci5JTlNUQU5DRS5zZXRVc2VTdGF0aWModHJ1ZSk7Ci0JCQlzdXBlci5sb2FkKG9wdGlvbnMpOwkJCi0JCQl1cGRhdGVUaW1lU3RhbXBzKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlEZWZhdWx0VmFsdWVNYW5hZ2VyLklOU1RBTkNFLnNldFVzZVN0YXRpYyhvbGQpOwotCQl9Ci0JCQotCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCWlmIChnZXRVUkkoKS50b1N0cmluZygpLmVxdWFscyh0ZXN0UmVzb3VyY2VVUklTdHIpKSB7Ci0JCQkJdGVzdFJlc291cmNlTG9hZGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdGVzdFJlc291cmNlTG9hZGVkOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRlc3RSZXNvdXJjZVVSSVN0ciA9ICJmaWxlOi9DOi90ZW1wL25ld2xpYi9saWJyYXJ5LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBsb25nIGdldE1vZGlmaWNhdGlvblN0YW1wKCkgewotCQlyZXR1cm4gbW9kaWZpY2F0aW9uU3RhbXA7Ci0JfQotCQotCS8qKgotCSAqIFJlbG9hZHMgdGhpcyByZXNvdXJjZS4gT2xkIG9iamVjdHMgd2lsbCBiZWNvbWUgcHJveGllcyBhbmQgdGhleSB3aWxsIGJlCi0JICogYWRkZWQgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIDxjb2RlPnByb3hpZXM8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHByb3hpZXMKLQkgKi8KLQlzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWxvYWQoQ29sbGVjdGlvbiBwcm94aWVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXNMb2FkZWQpIHsKLQkJCU5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBzZXRMb2FkZWQoZmFsc2UpOwotCQkJZG9VbmxvYWQocHJveGllcywgZmFsc2UpOwotCQkJLy8gZG9VbmxvYWQoKSBtaWdodCBoYXZlIHNldCB0aGlzIHJlc291cmNlIGxvYWRlZCBhZ2FpbgotCQkJLy8gc2V0IGlzTG9hZGVkIHRvIGZhbHNlIGFuZCBjb250ZW50cyB0byBudWxsIHRvIG1ha2Ugc3VyZQotCQkJLy8KLQkJCWlzTG9hZGVkID0gZmFsc2U7Ci0JCQljb250ZW50cyA9IG51bGw7Ci0JCQlpZiAobm90aWZpY2F0aW9uICE9IG51bGwpIHsKLQkJCQllTm90aWZ5KG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCQlsb2FkKGdldFJlc291cmNlU2V0KCkuZ2V0TG9hZE9wdGlvbnMoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGludGVyZmFjZS4KLQkgKi8KLQlmaW5hbCB2b2lkIHVubG9hZFdpdGhvdXRSZW1vdmUoKSB7Ci0JCWlmIChpc0xvYWRlZCkgewotCQkJLy8gc2F2ZSB0aGUgUmVzb3VyY2VEZXNjcmlwdG9yIHBmIHRoaXMgcmVzb3VyY2UgZm9yIGxhdGVyIHVzZSB0bwotCQkJLy8gY3JlYXRlIFVSSSBmb3IgdGhlIHByb3hpZXMgYWZ0ZXIgdW5sb2FkCi0JCQkvLwotCQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSBNdWx0aUZpbGVTYXZlVXRpbAotCQkJCQkuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKHRoaXMpOwotCQkJaWYgKHJlc0Rlc2MgIT0gbnVsbCkgewotCQkJCXNldFJlc291cmNlRGVzY3JpcHRvcihyZXNEZXNjKTsKLQkJCX0KLQotCQkJTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9IHNldExvYWRlZChmYWxzZSk7Ci0JCQlkb1VubG9hZChudWxsLCBmYWxzZSk7Ci0JCQlpZiAobm90aWZpY2F0aW9uICE9IG51bGwpIHsKLQkJCQllTm90aWZ5KG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEb2VzIGFsbCB0aGUgd29yayBvZiB1bmxvYWRpbmcgdGhlIHJlc291cmNlLiBJdCBjYWxscwotCSAqIHtAbGluayAjdW5sb2FkZWQgdW5sb2FkZWR9IGZvciBlYWNoIG9iamVjdCBpdCB0aGUgY29udGVudAotCSAqIHtAbGluayAjZ2V0QWxsQ29udGVudHMgdHJlZX0sIGFuZCBjbGVhcnMgdGhlCi0JICoge0BsaW5rICNnZXRDb250ZW50cyBjb250ZW50c30sIHtAbGluayAjZ2V0RXJyb3JzIGVycm9yc30sIGFuZAotCSAqIHtAbGluayAjZ2V0V2FybmluZ3Mgd2FybmluZ3N9LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVW5sb2FkKCkgewotCQlkb1VubG9hZChudWxsLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1bCAxNywgMjAwNgotCSAqIEBzaW5jZSAxLjAKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGNsYXNzIENvbnRlbnRUcmVlSXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVyYXRvciB7Ci0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBvYmplY3QKLQkJICovCi0JCXByaXZhdGUgQ29udGVudFRyZWVJdGVyYXRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlzdXBlcihvYmplY3QpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUVDb250ZW50c0VMaXN0IGNvbnRlbnRzID0gbmV3IEVDb250ZW50c0VMaXN0KChFT2JqZWN0KSBvYmplY3QpIHsKLQkJCQkJLyoKLQkJCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCQkgKiAKLQkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudHNFTGlzdCNyZXNvbHZlKCkKLQkJCQkJICovCi0JCQkJCXByb3RlY3RlZCBib29sZWFuIHJlc29sdmUoKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRlbnRzLmJhc2ljSXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKG8uZVJlc291cmNlKCkgPT0gTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsLnRoaXMKLQkJCQkJCQl8fCBvLmVJc1Byb3h5KCkpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChvKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCX0KLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVbmxvYWRzIHRoaXMgcmVzb3VyY2UuIE9sZCBvYmplY3RzIHdpbGwgYmUgY29tZSBwcm94aWVzIGFuZCB3aWxsIGJlIGFkZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIDxjb2RlPnByb3hpZXM8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHByb3hpZXMKLQkgKiBAcGFyYW0gcmVtb3ZlCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiB3aWxsIHJlbW92ZSBhbGwgdGhlIHVubG9hZGVkIG9iamVjdHMgaW4KLQkgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZSBmcm9tIHRoZWlyIGNvbnRhaW5lcnMgYW5kIGFsbCBvcHBvc2l0ZSBmZWF0dXJlCi0JICogICAgICAgICAgICBkYXRhIG9mIHRoZSB1bmxvYWRlZCBvYmplY3RzIHdpbGwgYmUgY2xlYXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VubG9hZChDb2xsZWN0aW9uIHByb3hpZXMsIGJvb2xlYW4gcmVtb3ZlKSB7Ci0JCWlzVW5sb2FkaW5nID0gdHJ1ZTsKLQotCQl0cnkgewotCQkJLy8gZnJvbSBSZXNvdXJjZUltcGwKLQkJCS8vCi0KLQkJCUl0ZXJhdG9yIGFsbENvbnRlbnRzID0gZ2V0QWxsUHJvcGVyQ29udGVudHMobmV3IEFycmF5TGlzdCgKLQkJCQkJZ2V0Q29udGVudHMoKSkpOwotCi0JCQkvLyBUaGlzIGd1YXJkIGlzIG5lZWRlZCB0byBlbnN1cmUgdGhhdCBjbGVhciBkb2Vzbid0IG1ha2UgdGhlCi0JCQkvLyByZXNvdXJjZQotCQkJLy8gYmVjb21lIGxvYWRlZC4KLQkJCS8vCi0JCQlpZiAoIWdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJaWYgKHJlbW92ZSkgewotCQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gZG9uJ3QgY2FsbCBnZXRDb250ZW50cygpLmNsZWFyKCkgdG8ga2VlcCB0aGUgcmVmZXJlbmNlcwotCQkJCQkvLyB0byBlbGVtZW50cwotCQkJCQkvLyB0aGF0IGp1c3QgYmVjYW1lIHByb3hpZXMgYWZ0ZXIgdW5sb2FkCi0JCQkJCS8vCi0JCQkJCWNvbnRlbnRzID0gbnVsbDsKLQkJCQl9Ci0KLQkJCX0KLQkJCWdldEVycm9ycygpLmNsZWFyKCk7Ci0JCQlnZXRXYXJuaW5ncygpLmNsZWFyKCk7Ci0KLQkJCUFycmF5TGlzdDxFT2JqZWN0PiB1bmxvYWRlZE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0PEVPYmplY3Q+KCk7Ci0JCQkKLQkJCUFycmF5TGlzdCBhbGxDb250ZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXdoaWxlIChhbGxDb250ZW50cy5oYXNOZXh0KCkpIHsKLQkJCQlhbGxDb250ZW50TGlzdC5hZGQoYWxsQ29udGVudHMubmV4dCgpKTsKLQkJCX0KLQkJCUl0ZXJhdG9yIGl0ID0gYWxsQ29udGVudExpc3QuaXRlcmF0b3IoKTsKLQkJCQotCQkJdHJ5IHsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJbnRlcm5hbEVPYmplY3QgbyA9IChJbnRlcm5hbEVPYmplY3QpIGl0Ci0JCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQl1bmxvYWRlZChvLCByZW1vdmUpOwotCQkJCQkJdW5sb2FkZWRPYmplY3RzLmFkZChvKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQl9Ci0JCQlpZiAocHJveGllcyAhPSBudWxsICYmICF1bmxvYWRlZE9iamVjdHMuaXNFbXB0eSgpKSB7Ci0JCQkJcHJveGllcy5hZGRBbGwodW5sb2FkZWRPYmplY3RzKTsKLQkJCX0KLQkJCWlmIChyZW1vdmUpIHsKLQkJCQkvLyByZW1vdmUgdGhlIHVubG9hZGVkIG9iamVjdHMgZnJvbSBpdHMgY29udGFpbmVyIHRvIHByZXZlbnQgdGhlCi0JCQkJLy8gd2hvbGUgbGlicmFyeSBmcm9tIHN0YXlpbmcKLQkJCQkvLyBpbiBtZW1vcnkgaWYgb25seSBvbmUgb2YgaXRzIGVsZW1lbnQgaXMgbGVha2VkCi0JCQkJLy8gCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdW5sb2FkZWRPYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IG9iamVjdCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJRWNvcmVVdGlsLnJlbW92ZShvYmplY3QpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gZnJvbSBYTUxSZXNvdXJjZUltbAotCQkJLy8JCQotCi0JCQlpZiAoaWRUb0VPYmplY3RNYXAgIT0gbnVsbCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGlkVG9FT2JqZWN0TWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCSgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBnZXRSZXNvdXJjZVNldCgpKQotCQkJCQkJCS5nZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkucmVtb3ZlKGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQkJaWRUb0VPYmplY3RNYXAuY2xlYXIoKTsKLQkJCX0KLQotCQkJaWYgKGVPYmplY3RUb0lETWFwICE9IG51bGwpIHsKLQkJCQllT2JqZWN0VG9JRE1hcC5jbGVhcigpOwotCQkJfQotCi0JCQlpZiAoZU9iamVjdFRvRXh0ZW5zaW9uTWFwICE9IG51bGwpIHsKLQkJCQllT2JqZWN0VG9FeHRlbnNpb25NYXAuY2xlYXIoKTsKLQkJCX0KLQotCQkJaWYgKGludHJpbnNpY0lEVG9FT2JqZWN0TWFwICE9IG51bGwpIHsKLQkJCQlpbnRyaW5zaWNJRFRvRU9iamVjdE1hcC5jbGVhcigpOwotCQkJfQotCQkJCi0JCQltb2RpZmljYXRpb25TdGFtcCA9IElSZXNvdXJjZS5OVUxMX1NUQU1QOwotCQkJCi0JCX0gZmluYWxseSB7Ci0JCQlpc1VubG9hZGluZyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdW5sb2FkZWQoSW50ZXJuYWxFT2JqZWN0IGludGVybmFsRU9iamVjdCkgewotCQl1bmxvYWRlZChpbnRlcm5hbEVPYmplY3QsIHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gaW50ZXJuYWxFT2JqZWN0Ci0JICogQHBhcmFtIGNsZWFyCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiBhbGwgb3Bwb3NpdGUgZmVhdHVyZSBkYXRhIG9mIHRoZQotCSAqICAgICAgICAgICAgdW5sb2FkZWQgb2JqZWN0cyB3aWxsIGJlIGNsZWFyZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVubG9hZGVkKEludGVybmFsRU9iamVjdCBpbnRlcm5hbEVPYmplY3QsIGJvb2xlYW4gY2xlYXIpIHsKLQkJU3RyaW5nIGd1aWQgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRHdWlkKGludGVybmFsRU9iamVjdCk7Ci0JCWlmIChndWlkICE9IG51bGwpIHsKLQkJCVVSSSB1cmkgPSByZXNvdXJjZURlc2NyaXB0b3IgIT0gbnVsbCA/IE11bHRpRmlsZVVSSUNvbnZlcnRlcgotCQkJCQkuY3JlYXRlVVJJKHJlc291cmNlRGVzY3JpcHRvci5nZXRJZCgpKSA6IGdldFVSSSgpOwotCQkJaW50ZXJuYWxFT2JqZWN0LmVTZXRQcm94eVVSSSh1cmkuYXBwZW5kRnJhZ21lbnQoZ3VpZCkpOwotCQl9Ci0JCWludGVybmFsRU9iamVjdC5lQWRhcHRlcnMoKS5jbGVhcigpOwotCi0JCWlmIChpbnRlcm5hbEVPYmplY3QgaW5zdGFuY2VvZiBNdWx0aVJlc291cmNlRU9iamVjdCAmJiBjbGVhcikgewotCQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbXVsdGlSZXNvdXJjZUVPYmplY3QgPSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBpbnRlcm5hbEVPYmplY3QpOwotCi0JCQkvLyBjbGVhciBvd24gb3Bwb3NpdGUgZmVhdHVyZSBtYXAKLQkJCS8vCQkJCi0JCQlNYXAgb3Bwb3NpdGVGZWF0dXJlTWFwID0gbXVsdGlSZXNvdXJjZUVPYmplY3QKLQkJCQkJLmJhc2ljR2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCk7Ci0JCQlpZiAob3Bwb3NpdGVGZWF0dXJlTWFwICE9IG51bGwpIHsKLQkJCQlvcHBvc2l0ZUZlYXR1cmVNYXAuY2xlYXIoKTsKLQkJCX0KLQotCQkJLy8gcmVtb3ZlIGl0c2VsZiBmcm9tIGFsbCBvcHBvc2l0ZSBmZWF0dXJlcwotCQkJLy8gCi0JCQltdWx0aVJlc291cmNlRU9iamVjdC5yZW1vdmVGcm9tQWxsT3Bwb3NpdGVGZWF0dXJlcygpOwotCQl9Ci0JCQotCQlpZihpbnRlcm5hbEVPYmplY3QgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gfHwgaW50ZXJuYWxFT2JqZWN0IGluc3RhbmNlb2YgU2VjdGlvbikgewotCQkJLy8gc2V0IGFsbCBzdHJpbmcgYXR0cmlidXRlcyB0byBOVUxMIHRvIHJlbGVhc2UgbWVtb3J5Ci0JCQkvLwotCQkJZm9yIChFQXR0cmlidXRlIGF0dHIgOiBpbnRlcm5hbEVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKSkgewotCQkJCWlmKGF0dHIgIT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCkgJiYgCi0JCQkJCQlhdHRyLmdldEVBdHRyaWJ1dGVUeXBlKCkuZ2V0SW5zdGFuY2VDbGFzcygpLmlzQXNzaWduYWJsZUZyb20oU3RyaW5nLmNsYXNzKSkgewotCQkJCQlpbnRlcm5hbEVPYmplY3QuZVNldChhdHRyLCBhdHRyLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKGludGVybmFsRU9iamVjdC5lRGlyZWN0UmVzb3VyY2UoKSAhPSBudWxsICYmIGludGVybmFsRU9iamVjdCBpbnN0YW5jZW9mIE11bHRpUmVzb3VyY2VFT2JqZWN0KSB7Ci0JCQkJKChNdWx0aVJlc291cmNlRU9iamVjdClpbnRlcm5hbEVPYmplY3QpLmVTZXRSZXNvdXJjZShudWxsKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRldGFjaGVkQWxsKEVPYmplY3QgZU9iaikgewotCQlpZiAodXNlSURzKCkpIHsKLQkJCWRldGFjaGVkQWxsV2l0aElEcyhlT2JqKTsKLQkJfSBlbHNlIHsKLQkJCWJhc2ljRGV0YWNoZWRBbGwoZU9iaik7Ci0JCX0KLQl9CQkKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlLkludGVybmFsI2RldGFjaGVkKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGRldGFjaGVkKEVPYmplY3QgZU9iamVjdCkgewotCQlkZXRhY2hlZEFsbChlT2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbCNjcmVhdGVNb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBBZGFwdGVyIGNyZWF0ZU1vZGlmaWNhdGlvblRyYWNraW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBNb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbC5Nb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCS8vIGRvbid0IGhhbmRsZSBPcHBvc2l0ZUZlYXR1cmVOb3RpZmljYXRpb24gYi9jIGl0IGRvZXMgbm90Ci0JCQkJLy8gcmVhbGx5IG1vZGlmeSB0aGlzIHJlc291cmNlCi0JCQkJLy8KLQkJCQlpZiAobm90aWZpY2F0aW9uIGluc3RhbmNlb2YgT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VJbXBsI3NldE1vZGlmaWVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kaWZpZWQoYm9vbGVhbiBpc01vZGlmaWVkKSB7Ci0JCS8vIGJvb2xlYW4gd2FzTW9kaWZpZWQgPSBpc01vZGlmaWVkKCk7Ci0JCXN1cGVyLnNldE1vZGlmaWVkKGlzTW9kaWZpZWQpOwotCQkvLyBpZihNdWx0aUZpbGVTYXZlVXRpbC5nZXRNZXRob2RFbGVtZW50KHRoaXMpIGluc3RhbmNlb2YKLQkJLy8gUHJvY2Vzc0NvbXBvbmVudCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpRmlsZVhNSVJlc291cmNlSW1wbC5zZXRNb2RpZmllZCgpOiAiICsKLQkJLy8gdGhpcyk7Ci0JCS8vIH0KLQkJLy8gdGhpcyBjb2RlIGlzIG5lZWRlZCB0byBzZXQgZGlydHkgZmxhZyB0byB0aGUgaXRlbSBwcm92aWRlcidzIGxhYmVsCi0JCS8vCi0JCS8vIGlmKHdhc01vZGlmaWVkICE9IGlzTW9kaWZpZWQgJiYgIWdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCS8vIC8vIHJlZnJlc2ggdGhlIGxhYmVsIG9mIHRoZSByZXNvdXJjZSdzIG9iamVjdAotCQkvLyAvLwotCQkvLyBFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBnZXRDb250ZW50cygpLmdldCgwKTsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gb2JqLmVBZGFwdGVycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBPYmplY3QgYWRhcHRlciA9IGl0ZXIubmV4dCgpOwotCQkvLyBpZihhZGFwdGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkvLyAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpYWRhcHRlcikuZmlyZU5vdGlmeUNoYW5nZWQobmV3Ci0JCS8vIFZpZXdlck5vdGlmaWNhdGlvbihuZXcgTm90aWZpY2F0aW9uSW1wbChOb3RpZmljYXRpb24uU0VULCBvYmosIG9iaiksCi0JCS8vIG9iaiwgZmFsc2UsIHRydWUpKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQotCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCWlmICh0ZXN0UmVzb3VyY2VMb2FkZWQKLQkJCQkJJiYgZ2V0VVJJKCkudG9TdHJpbmcoKS5lcXVhbHModGVzdFJlc291cmNlVVJJU3RyKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaXNNb2RpZmllZD0iICsgaXNNb2RpZmllZCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmllckltcGwjZURlbGl2ZXIoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVEZWxpdmVyKCkgewotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGdldFJlc291cmNlU2V0KCk7Ci0JCWlmIChyZXNvdXJjZVNldCAhPSBudWxsICYmICFyZXNvdXJjZVNldC5lRGVsaXZlcigpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBzdXBlci5lRGVsaXZlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gb2xkID0gRGVmYXVsdFZhbHVlTWFuYWdlci5JTlNUQU5DRS5pc1VzZVN0YXRpYygpOwotCQl0cnkgewotCQkJRGVmYXVsdFZhbHVlTWFuYWdlci5JTlNUQU5DRS5zZXRVc2VTdGF0aWModHJ1ZSk7Ci0JCQkKLQkJCWlmIChvcHRpb25zID09IG51bGwpIHsKLQkJCQlvcHRpb25zID0gTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLkRFRkFVTFRfU0FWRV9PUFRJT05TOwotCQkJfQotCi0JCQlzdXBlci5zYXZlKG9wdGlvbnMpOwotCi0JCQkvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBzYXZpbmcgTWV0aG9kTGlicmFyeSB0byByZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8KLQkJCS8vIE1ldGhvZENvbmZpZ3VyYXRpb25zIGZyb20gbGlicmFyeSBmaWxlLgotCQkJLy8KLQkJCU1ldGhvZEVsZW1lbnQgZSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHRoaXMpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJTWV0aG9kTGlicmFyeSBsaWIgPSAoTWV0aG9kTGlicmFyeSkgZTsKLQkJCQkvLyByZW1vdmUgUmVzb3VyY2VEZXNjcmlwdG9ycyBvZiBjb25maWd1cmF0aW9uIGZpbGVzCi0JCQkJLy8KLQkJCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UmVzb3VyY2VNYW5hZ2VyKHRoaXMpOwotCQkJCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdGVyCi0JCQkJCQkubmV4dCgpOwotCQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSByZXNNZ3IKLQkJCQkJCS5nZXRSZXNvdXJjZURlc2NyaXB0b3IoY29uZmlnLmdldEd1aWQoKSk7Ci0JCQkJCQlpZiAocmVzRGVzYyAhPSBudWxsKSB7Ci0JCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShyZXNEZXNjKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlMaXN0IGNvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0KGxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSk7Ci0JCQkJYm9vbGVhbiBvbGREZWxpdmVyID0gbGliLmVEZWxpdmVyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJbGliLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQkJbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLmNsZWFyKCk7Ci0KLQkJCQkJLy8gU2F2ZSBsaWJyYXJ5IGZpbGUgYWdhaW4gdG8gcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIGNvbmZpZ3VyYXRpb25zLgotCQkJCQkvLyBUaGUgcHJldmlvdXMgc2F2ZSBpcyBzdGlsbCBuZWVkZWQgdG8gc2F2ZSBuZXcgY29uZmlndXJhdGlvbiBpbiBpdHMgb3duIGZpbGUKLQkJCQkJLy8KLQkJCQkJc3VwZXIuc2F2ZShvcHRpb25zKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkuYWRkQWxsKGNvbmZpZ3MpOwotCQkJCQlsaWIuZVNldERlbGl2ZXIob2xkRGVsaXZlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJRGVmYXVsdFZhbHVlTWFuYWdlci5JTlNUQU5DRS5zZXRVc2VTdGF0aWMob2xkKTsKLQkJfQotCX0KLQotCXB1YmxpYyBVUkkgZ2V0RmluYWxVUkkoKSB7Ci0JCWlmIChmaW5hbFVSSSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmluYWxVUkk7Ci0JCX0KLQkJcmV0dXJuIGdldFVSSSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbmFsVVJJKFVSSSB1cmkpIHsKLQkJZmluYWxVUkkgPSB1cmk7Ci0JfQotCi0JcHVibGljIHZvaWQgYmFja1VwVVJJKCkgewotCQlvbGRVUkkgPSBnZXRVUkkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNUZW1wVVJJKCkgewotCQlpZiAoY3VycmVudFR4SUQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNyZWF0ZVRlbXBVUkkoKS5lcXVhbHMoZ2V0VVJJKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIFVSSSBjcmVhdGVUZW1wVVJJKCkgewotCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudCh0aGlzKTsKLQkJcmV0dXJuIFVSSS5jcmVhdGVGaWxlVVJJKG5ldyBTdHJpbmdCdWZmZXIoZ2V0VGVtcERpcigpKS5hcHBlbmQoCi0JCQkJRmlsZS5zZXBhcmF0b3IpLmFwcGVuZChjdXJyZW50VHhJRCkKLQkJCQkuYXBwZW5kKCJuZXciKS5hcHBlbmQoZS5nZXRHdWlkKCkpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIFN0cmluZyBnZXRUZW1wRGlyKCkgewotCQlpZiAodGVtcERpciA9PSBudWxsKSB7Ci0JCQl0ZW1wRGlyID0gbmV3IEZpbGUoRmlsZU1hbmFnZXIuZ2V0VGVtcERpcigpLCAiRVBGIikuZ2V0QWJzb2x1dGVQYXRoKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdGVtcERpcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0ZW1wb3JhcnkgVVJJIHRvIHNhdmUgdGhpcyByZXNvdXJjZSB0byBhbmQgaXQgd2lsbCBiZSByZW5hbWVkIHRvCi0JICogdGhlIG9yaWdpbmFsIFVSSSB3aGVuIHNhdmluZyBpcyBkb25lCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGVtcFVSSShTdHJpbmcgdHhJRCkgewotCQlpZiAoZmluYWxVUkkgPT0gbnVsbCkgewotCQkJZmluYWxVUkkgPSBvbGRVUkkgPSBnZXRVUkkoKTsKLQkJCWN1cnJlbnRUeElEID0gdHhJRDsKLQotCQkJVVJJIHRlbXBVUkkgPSBjcmVhdGVUZW1wVVJJKCk7Ci0JCQlzZXRVUkkodGVtcFVSSSk7Ci0KLQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGdldFJlc291cmNlU2V0KCk7Ci0JCQlyZXNvdXJjZVNldC5nZXRVUklUb1RlbXBVUklNYXAoKS5wdXQob2xkVVJJLCB0ZW1wVVJJKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlc3RvcmVzIHRoZSByZXNvdXJjZSBVUkkgdG8gdGhlIG9yaWdpbmFsIG9uZS4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsCi0JICogYWZ0ZXIgc2F2aW5nIHJlZ2FybGVzcyBvZiBpdHMgc3VjY2Vzcy4KLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzdG9yZVVSSSgpIHsKLQkJaWYgKG9sZFVSSSAhPSBudWxsKSB7Ci0JCQlzZXRVUkkob2xkVVJJKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHR4U3RhcnRlZCgpIHsKLQkJcmV0dXJuIG1vdmVTdGFydGVkKCkgfHwgc2F2ZVN0YXJ0ZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUaW1lU3RhbXBzKCkgewotCQlGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlZnJlc2godGhpcyk7Ci0JCWxhc3RMb2FkVGltZVN0YW1wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCUlGaWxlSW5mbyBpbmZvID0gZ2V0RmlsZUluZm8oKTsKLQkJaWYoaW5mbyAhPSBudWxsKSB7Ci0JCQltb2RpZmljYXRpb25TdGFtcCA9IGluZm8uZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhpcyByZXNvdXJjZSBpcyBjdXJyZW50bHkgc3luY2hyb25pemVkIHdpdGggaXRzIGRhdGEgc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIDxsaT4gLTEgZG9uJ3Qga25vdwotCSAqICAgICAgICAgPGxpPiAwIG5vCi0JICogICAgICAgICA8bGk+IDEgeWVzCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjaXNTeW5jaHJvbml6ZWQoKX0gaW5zdGVhZAotCSAqLwotCXB1YmxpYyBpbnQgY2hlY2tTeW5jaHJvbml6ZWQoKSB7Ci0vLwkJbG9uZyBjdXJyZW50VGltZSA9IG5ldyBGaWxlKGdldFVSSSgpLnRvRmlsZVN0cmluZygpKS5sYXN0TW9kaWZpZWQoKTsKLS8vCQlpZihNdWx0aUZpbGVTYXZlVXRpbC5zYW1lKGN1cnJlbnRUaW1lLCBmaWxlTGFzdE1vZGlmaWVkKSkgewotLy8JCQkvLyBzb21lIHRlYW0gcHJvdmlkZXJzIGNoYW5nZWQgdGhlIHRpbWVzdGFtcCBvZiBsYXN0IGZpbGUgbW9kaWZpY2F0aW9uIGJ5IHJlbW92aW5nIHNlY29uZCBmcmFjdGlvbgotLy8JCQkvLyBldmVuIHRoZSBmaWxlIHdhcyBub3QgY2hhbmdlZAotLy8JCQkvLwotLy8JCQlyZXR1cm4gMTsKLS8vCQl9Ci0vLwkJcmV0dXJuIC0xOwotCQlyZXR1cm4gaXNTeW5jaHJvbml6ZWQoKSA/IDEgOiAwOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1N5bmNocm9uaXplZCgpIHsKLQkJSUZpbGVJbmZvIGZpbGVJbmZvID0gZ2V0RmlsZUluZm8oKTsKLQkJaWYgKGZpbGVJbmZvICE9IG51bGwpIHsKLQkJCXJldHVybiBtb2RpZmljYXRpb25TdGFtcCA9PSBmaWxlSW5mby5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0eEZpbmlzaGVkKGJvb2xlYW4gc3VjY2Vzc2Z1bCkgewotCQlib29sZWFuIHdhc01vdmUgPSAhb2xkVVJJLmVxdWFscyhmaW5hbFVSSSk7Ci0JCWlmIChzdWNjZXNzZnVsKSB7Ci0JCQlzZXRVUkkoZmluYWxVUkkpOwotCQkJaWYoIXdhc01vdmUpIHsKLQkJCQlzZXRNb2RpZmllZChmYWxzZSk7Ci0JCQl9Ci0JCQlGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlZnJlc2godGhpcyk7Ci0JCQl1cGRhdGVUaW1lU3RhbXBzKCk7Ci0JCQlpZighd2FzTW92ZSkgewotCQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGdldFJlc291cmNlU2V0KCk7Ci0JCQkJaWYocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCQlyZXNvdXJjZVNldC5nZXRVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyKCkudmFsaWRhdGVNYXJrZXJzKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlc3RvcmVVUkkoKTsKLQkJCWlmICh3YXNNb3ZlKSB7Ci0JCQkJLy8gZmluYWxVUkkgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZXN0b3JpbmcgVVJJIG9mIGl0cyBjaGlsZAotCQkJCS8vIHJlc291cmNlcyBzbyB0aGUgVVJJIG9mIGl0cyBjaGlsZCByZXNvdXJjZXMgY2FuIGJlIHJlc29sdmVkCi0JCQkJLy8gY29ycmVjdGx5LiBTZWUgUmVzb3VyY2VEZXNjcmlwdG9ySW1wbC5nZXRSZXNvbHZlZFVSSSgpCi0JCQkJLy8KLQkJCQlmaW5hbFVSSSA9IG51bGw7Ci0JCQkJCi0JCQkJLy8gcmVzdG9yZSB1cmkgb2YgUmVzb3VyY2VEZXNjcmlwdG9yIG9mIHRoaXMgcmVzb3VyY2UKLQkJCQkvLwotCQkJCU11bHRpRmlsZVNhdmVVdGlsLnVwZGF0ZVVSSU1hcHBpbmdzKHRoaXMsIG9sZFVSSSwgbnVsbCwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG9sZFVSSSAhPSBudWxsKSB7Ci0JCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBnZXRSZXNvdXJjZVNldCgpOwotCQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZVNldC5nZXRVUklUb1RlbXBVUklNYXAoKS5yZW1vdmUob2xkVVJJKTsKLQkJCX0KLQkJCW9sZFVSSSA9IG51bGw7Ci0JCX0KLQkJY3VycmVudFR4SUQgPSBudWxsOwotCQlmaW5hbFVSSSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlQmFja3VwKCkgewotCQlpZiAoYmFja3VwRmlsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCS8vIEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZGVsZXRlKGJhY2t1cEZpbGUpOwotCQkJCW5ldyBGaWxlKGJhY2t1cEZpbGUpLmRlbGV0ZSgpOwotCQkJCWJhY2t1cEZpbGUgPSBudWxsOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlc3RvcmUoKSB7Ci0JCUZpbGUgc3JjID0gbnVsbCwgZGVzdCA9IG51bGw7Ci0JCWJvb2xlYW4gbW92ZWQgPSBmYWxzZTsKLQkJaWYgKGJhY2t1cEZpbGUgIT0gbnVsbCkgewotCQkJc3JjID0gbmV3IEZpbGUoYmFja3VwRmlsZSk7Ci0JCQlkZXN0ID0gbmV3IEZpbGUoZ2V0RmluYWxVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCX0gZWxzZSB7Ci0JCQltb3ZlZCA9IG9sZFVSSSAhPSBudWxsICYmICFvbGRVUkkuZXF1YWxzKGZpbmFsVVJJKTsKLQkJCWlmIChtb3ZlZCkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGdldEZpbmFsVVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJCWRlc3QgPSBuZXcgRmlsZShvbGRVUkkudG9GaWxlU3RyaW5nKCkpOwotCQkJCW1vdmVkID0gZmlsZS5leGlzdHMoKSAmJiAhZGVzdC5leGlzdHMoKTsKLQkJCQlpZiAobW92ZWQpIHsKLQkJCQkJc3JjID0gZmlsZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHNyYyAhPSBudWxsKSB7Ci0JCQlpZiAoZGVzdC5leGlzdHMoKSkgewotCQkJCUZpbGVVdGlsLm1vdmVGaWxlKGRlc3QsbmV3IEZpbGUoZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpKTsKLQkJCX0KLQkJCWJvb2xlYW4gc3VjY2VzczsKLQkJCWlmIChtb3ZlZCkgewotCQkJCXN1Y2Nlc3MgPSBNdWx0aUZpbGVTYXZlVXRpbC5tb3ZlKHRoaXMsIHNyYywgZGVzdCk7Ci0JCQkJLy8gaWYoc3VjY2VzcykgewotCQkJCS8vIE11bHRpRmlsZVNhdmVVdGlsLnVwZGF0ZVVSSU1hcHBpbmdzKHRoaXMsIG51bGwpOwotCQkJCS8vIH0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gZG9uJ3QgcmVzdG9yZSBmaWxlIGlmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSB0aGUgc2FtZQotCQkJCS8vCi0JCQkJc3VjY2VzcyA9IHNyYy5sYXN0TW9kaWZpZWQoKSA9PSBkZXN0Lmxhc3RNb2RpZmllZCgpICYmIEZpbGVVdGlsLmdldFNpemUoc3JjKSA9PSBGaWxlVXRpbC5nZXRTaXplKGRlc3QpOwotCQkJCWlmKCFzdWNjZXNzKSB7Ci0JCQkJCXN1Y2Nlc3MgPSBGaWxlVXRpbC5tb3ZlRmlsZShzcmMsIGRlc3QpOwotCQkJCX0KLQkJCX0KLQkJCWlmICghc3VjY2VzcykgewotCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5yZXN0b3JlUmVzb3VyY2VFcnJvcl9tc2csIAotCQkJCQkJRmlsZU1hbmFnZXIudG9GaWxlU3RyaW5nKGdldEZpbmFsVVJJKCkpKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JVVJJIGdldE9sZFVSSSgpIHsKLQkJcmV0dXJuIG9sZFVSSTsKLQl9Ci0KLQlib29sZWFuIG1vdmVTdGFydGVkKCkgewotCQlyZXR1cm4gb2xkVVJJICE9IG51bGwgJiYgIW9sZFVSSS5lcXVhbHMoZ2V0RmluYWxVUkkoKSk7Ci0JfQotCi0JYm9vbGVhbiBzYXZlU3RhcnRlZCgpIHsKLQkJcmV0dXJuIGN1cnJlbnRUeElEICE9IG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZWZyZXNoVVJJT2ZDaGlsZFJlc291cmNlcygpIHsKLQkJLy8gcmVmcmVzaCByZXNvbHZlIFVSSXMgaW4gUmVzb3VyY2VEZXNjcmlwdG9ycyBvZiB0aGUgY2hpbGQKLQkJLy8gcmVzb3VyY2VzIG9mIHRoaXMgcmVzb3VyY2UKLQkJLy8KLQkJSGFzaE1hcDxVUkksIFJlc291cmNlRGVzY3JpcHRvcj4gb2xkVVJJVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAgPSBudWxsOwotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkuZ2V0UmVzb3VyY2VNYW5hZ2VyKHRoaXMpOwotCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCW9sZFVSSVRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXA8VVJJLCBSZXNvdXJjZURlc2NyaXB0b3I+KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSByZXNNZ3IuZUFsbENvbnRlbnRzKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJlc291cmNlRGVzY3JpcHRvcikgewotCQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9ICgoUmVzb3VyY2VEZXNjcmlwdG9yKSBvYmopOwotCQkJCQlvbGRVUklUb1Jlc291cmNlRGVzY3JpcHRvck1hcC5wdXQoZGVzYwotCQkJCQkJCS5nZXRSZXNvbHZlZFVSSSgpLCBkZXNjKTsKLQkJCQkJZGVzYy5jbGVhclJlc29sdmVkVVJJKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gcmVmcmVzaCBVUkkgb2YgbG9hZGVkIGNoaWxkIHJlc291cmNlcyBvZiB0aGlzIHJlc291cmNlCi0JCS8vCi0JCWlmIChvbGRVUklUb1Jlc291cmNlRGVzY3JpcHRvck1hcCAhPSBudWxsKSB7Ci0JCQkvLyBnbyB0aHJ1IHRoZSBsaXN0IG9mIGxvYWRlZCByZXNvdXJjZXMgaW4gcmVzb3VyY2Ugc2V0Ci0JCQkvLyB0byB1cGRhdGUgdGhlIFVSSQotCQkJLy8KLQkJCWZvciAoUmVzb3VyY2UgcmVzIDogZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSkgewotCQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gKFJlc291cmNlRGVzY3JpcHRvcikgb2xkVVJJVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAKLQkJCQkJCS5nZXQocmVzLmdldFVSSSgpKTsKLQkJCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCXJlcy5zZXRVUkkoZGVzYy5nZXRSZXNvbHZlZFVSSSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb21taXQoKSB7Ci0JCWlmIChmaW5hbFVSSSAhPSBudWxsICYmICFnZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJRmlsZSBmaW5hbEZpbGUgPSBuZXcgRmlsZShmaW5hbFVSSS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlib29sZWFuIHdhc01vdmUgPSAhb2xkVVJJLmVxdWFscyhmaW5hbFVSSSk7Ci0JCQlpZiAod2FzTW92ZSkgewotCQkJCU9iamVjdCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQodGhpcyk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCQkJaWYgKGZpbmFsRmlsZS5leGlzdHMoKSkgewotCQkJCQkJLy8gbmFtZSBmb3IgZmluYWxGaWxlIGlzIGFscmVhZHkgdGFrZW4KLQkJCQkJCS8vIHRyeSB0byBnZXQgdGhlIG5leHQgYXZhaWxhYmxlIG5hbWUKLQkJCQkJCS8vCi0JCQkJCQlmaW5hbFVSSSA9IFVSSS5jcmVhdGVGaWxlVVJJKE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIKLQkJCQkJCQkJLmdldE5leHRBdmFpbGFibGVGaWxlTmFtZShmaW5hbEZpbGUuZ2V0UGFyZW50KCkKLQkJCQkJCQkJCQkrIEZpbGUuc2VwYXJhdG9yLAotCQkJCQkJCQkJCShDb250ZW50RGVzY3JpcHRpb24pIGUpKTsKLQkJCQkJCWZpbmFsRmlsZSA9IG5ldyBGaWxlKGZpbmFsVVJJLnRvRmlsZVN0cmluZygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gYmFjayB1cCB0aGUgZmlsZQotCQkJCS8vCi0JCQkJU3RyaW5nIGJhY2t1cCA9IGdldEJhY2t1cEZpbGVQYXRoKCk7Ci0JCQkJRmlsZSBiYWtGaWxlID0gbmV3IEZpbGUoYmFja3VwKTsKLQotCQkJCS8vIHRyeWluZyB0byBkZWxldGUgdGhlIG9sZCBiYWNrdXAgZmlsZSBpZiBpdCBleGlzdHMKLQkJCQkvLwotCQkJCWlmIChiYWtGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWJha0ZpbGUuZGVsZXRlKCk7Ci0JCQkJfQotCi0JCQkJaWYgKGZpbmFsRmlsZS5leGlzdHMoKSkgewotCQkJCQkvLyBzb21lIENNIHByb3ZpZGVyIGxpa2UgQ2xlYXJDYXNlIHJlbmFtZWQgdGhlIHZlcnNpb25lZAotCQkJCQkvLyBmaWxlIGl0IGl0cyByZXBvc2l0b3J5IGFzIHNvb24gYXMgdXNlciByZW5hbWVkIHRoZSBmaWxlCi0JCQkJCS8vIGluIHRoZSB3b3Jrc3BhY2UuIFRvIGF2b2lkIHRoaXMsIHVzZSBvbmx5IHJlZ3VsYXIgcmVuYW1lCi0JCQkJCS8vIHJvdXRpbmUgb2YgamF2YS5pby5GaWxlIGluc3RlYWQgb2YgSVJlc291cmNlIHJvdXRpbmUKLQkJCQkJLy8KLQkJCQkJaWYgKEZpbGVVdGlsLm1vdmVGaWxlKGZpbmFsRmlsZSwgYmFrRmlsZSkpIHsKLQkJCQkJCWJhY2t1cEZpbGUgPSBiYWNrdXA7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLnJlbmFtZUVycm9yX21zZywKLQkJCQkJCQkJZmluYWxGaWxlLCBiYWNrdXApOwotCQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKG1zZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHJlbmFtZSB0aGUgcmVzb3VyY2UgZmlsZSB0byB0aGUgb3JpZ2luYWwgbmFtZQotCQkJLy8KLQkJCUZpbGUgY3VycmVudEZpbGUgPSBuZXcgRmlsZSh3YXNNb3ZlID8gb2xkVVJJLnRvRmlsZVN0cmluZygpCi0JCQkJCTogZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCQlFeGNlcHRpb24gZXggPSBudWxsOwotCQkJaWYgKHdhc01vdmUpIHsKLQkJCQlzdWNjZXNzID0gTXVsdGlGaWxlU2F2ZVV0aWwubW92ZSh0aGlzLCBjdXJyZW50RmlsZSwgZmluYWxGaWxlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gc29tZSBDTSBwcm92aWRlciBsaWtlIENsZWFyQ2FzZSByZW5hbWVkIHRoZSB2ZXJzaW9uZWQgZmlsZSBpbgotCQkJCS8vIGl0cyByZXBvc2l0b3J5IGFzIHNvb24gYXMgdXNlciByZW5hbWVkIHRoZSBmaWxlCi0JCQkJLy8gaW4gdGhlIHdvcmtzcGFjZS4gVG8gYXZvaWQgdGhpcywgdXNlIG9ubHkgcmVndWxhciByZW5hbWUKLQkJCQkvLyByb3V0aW5lIG9mIGphdmEuaW8uRmlsZSBpbnN0ZWFkIG9mIElSZXNvdXJjZSByb3V0aW5lCi0JCQkJLy8KLQkJCQl0cnkgewotCQkJCQlGaWxlVXRpbC5kb01vdmVGaWxlKGN1cnJlbnRGaWxlLCBmaW5hbEZpbGUpOwotCQkJCQlzdWNjZXNzID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJZXggPSBlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghc3VjY2VzcykgewotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5yZW5hbWVFcnJvcl9tc2csCi0JCQkJCQljdXJyZW50RmlsZSwgZmluYWxGaWxlKTsKLQkJCQlpZihleCAhPSBudWxsKSB7Ci0JCQkJCW1zZyA9IG1zZyArICI6ICIgICsgKGV4LmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZXguZ2V0TWVzc2FnZSgpIDogZXgudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKG1zZyk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh3YXNNb3ZlKSB7Ci0JCQkJCS8vIHJlZnJlc2ggcmVzb2x2ZSBVUkkgb2YgUmVzb3VyY2VEZXNjcmlwdG9yIG9mIHRoaXMKLQkJCQkJLy8gcmVzb3VyY2UKLQkJCQkJLy8KLQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSBNdWx0aUZpbGVTYXZlVXRpbAotCQkJCQkJCS5nZXRSZXNvdXJjZURlc2NyaXB0b3IodGhpcyk7Ci0JCQkJCWlmIChyZXNEZXNjICE9IG51bGwpIHsKLQkJCQkJCXJlc0Rlc2MuY2xlYXJSZXNvbHZlZFVSSSgpOwotCQkJCQkJcmVzRGVzYy5nZXRSZXNvbHZlZFVSSSgpOwotCQkJCQl9IAotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IFBlcnNpc3RlbmNlVXRpbAotCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQodGhpcyk7Ci0JCQkJCQkJaWYgKGUgIT0gbnVsbAotCQkJCQkJCQkJJiYgIWdldExpYnJhcnlQZXJzaXN0ZXIoKQotCQkJCQkJCQkJCQkuaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoZSkpIHsKLQkJCQkJCQkJU3RyaW5nIG1zZyA9ICJGQVRBTCBFUlJPUjogbm8gUmVzb3VyY2VEZXNjcmlwdG9yIGZvdW5kIGluIHBhcmVudCByZXNvdXJjZSBmb3IgIiArIHRoaXM7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhtc2cpOwotCQkJCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlyZWZyZXNoVVJJT2ZDaGlsZFJlc291cmNlcygpOwotCQkJCX0KLQotCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNvdXJjZVNhdmVkKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCYWNrdXBGaWxlUGF0aCgpIHsKLQkJU3RyaW5nIGJhY2t1cEZpbGUgPSBuZXcgU3RyaW5nQnVmZmVyKGdldFRlbXBEaXIoKSkKLQkJCQkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKQotCQkJCS5hcHBlbmQoY3VycmVudFR4SUQpCi0JCQkJLmFwcGVuZCgib2xkIikuYXBwZW5kKFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHRoaXMpLmdldEd1aWQoKSkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYmFja3VwRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBsYXN0TG9hZFRpbWVTdGFtcAotCSAqLwotCXB1YmxpYyBsb25nIGdldExhc3RMb2FkVGltZVN0YW1wKCkgewotCQlyZXR1cm4gbGFzdExvYWRUaW1lU3RhbXA7Ci0JfQotCi0Jc3RhdGljIHZvaWQgY2xlYXJEZXRhY2hlZEVPYmplY3RUb0lETWFwKCkgewotCQlERVRBQ0hFRF9FT0JKRUNUX1RPX0lEX01BUC5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXNEZXNjCi0JICovCi0Jdm9pZCBzZXRSZXNvdXJjZURlc2NyaXB0b3IoUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MpIHsKLQkJcmVzb3VyY2VEZXNjcmlwdG9yID0gcmVzRGVzYzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlI2dldExvYWRTdGFtcCgpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TG9hZFN0YW1wKCkgewotCQlyZXR1cm4gZ2V0TGFzdExvYWRUaW1lU3RhbXAoKTsKLQl9Ci0KLQlwdWJsaWMgVVJJIGdldFByb3h5VVJJKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBndWlkID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0R3VpZChvYmplY3QpOwotCQlpZiAoZ3VpZCAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZURlc2NyaXB0b3IgcmVzb3VyY2VEZXNjcmlwdG9yID0gdGhpcy5yZXNvdXJjZURlc2NyaXB0b3IgIT0gbnVsbCA/IHRoaXMucmVzb3VyY2VEZXNjcmlwdG9yIDoKLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKHRoaXMpOwotCQkJVVJJIHVyaSA9IHJlc291cmNlRGVzY3JpcHRvciAhPSBudWxsID8gTXVsdGlGaWxlVVJJQ29udmVydGVyCi0JCQkJCS5jcmVhdGVVUkkocmVzb3VyY2VEZXNjcmlwdG9yLmdldElkKCkpIDogZ2V0VVJJKCk7Ci0JCQlyZXR1cm4gdXJpLmFwcGVuZEZyYWdtZW50KGd1aWQpOwotCQl9Ci0JCXJldHVybiBnZXRVUkkoKS5hcHBlbmRGcmFnbWVudChnZXRJRChvYmplY3QpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeElEKFN0cmluZyB0eElEKSB7Ci0JCXNldFRlbXBVUkkodHhJRCk7Ci0JfQotCQotCXByaXZhdGUgSUxpYnJhcnlQZXJzaXN0ZXIgZ2V0TGlicmFyeVBlcnNpc3RlcigpIHsKLQkJcmV0dXJuICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5nZXRQZXJzaXN0ZXIoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVYTUlTYXZlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVYTUlTYXZlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzkyMmYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JU2F2ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkV4dGVuZGVkTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JU2F2ZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5FUEZWZXJzaW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LlZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBYTUxTYXZlIGltcGxlbWVudGF0aW9uIGZvciBsaWJyYXJ5IFhNSSBwZXJzaXN0ZW5jZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlGaWxlWE1JU2F2ZUltcGwgZXh0ZW5kcyBYTUlTYXZlSW1wbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VUID0gIlNBVkVfU0VQQVJBVEVMWV9DTEFTU19TRVQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTYXZlIG9wdGlvbnMgdG8gZm9yY2Ugc2F2aW5nIGFsbCByZXNvdXJjZXMgaW4gdGhlIHJlc291cmNlIHNldCwgd2hldGhlcgotCSAqIHRoZXkgaGF2ZSBiZWVuIG1vZGlmaWVkIG9yIHVuY2hhbmdlZC4gSXRzIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgInRydWUiCi0JICogb3IgImZhbHNlIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfQUxMID0gIlNBVkVfQUxMIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2F2ZSBvcHRpb24gdG8gc2F2ZSBvYmplY3RzIG9mIHRoZSBzYXZlIHR5cGUgdG9nZXRoZXIgaW4gdGhlIHNhbWUgZmlsZSBpZgotCSAqIE11bHRpRmlsZVV0aWwuY3JlYXRlRmlsZVVSSSgpIHJldHVybnMgdGhlIHNhbWUgVVJJIGZvciB0aGVtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfVE9HRVRIRVJfQ0xBU1NfU0VUID0gIlNBVkVfVE9HRVRIRVJfQ0xBU1NfU0VUIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS19VUF9CRUZPUkVfU0FWRSA9ICJCQUNLX1VQX0JFRk9SRV9TQVZFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMgPSAiRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIE1PRElGSUVEX1JFU09VUkNFX1NFVCA9ICJNT0RJRklFRF9SRVNPVVJDRV9TRVQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTYXZlIG9wdGlvbiB0byBzcGVjaWZ5IGEgVHhSZWNvcmQgdG8gbG9nIHRoZSB0cmFuc2FjdGlvbmFsIGRhdGEgZm9yCi0JICogZmFpbC1zYWZlIHBlcnNpc3RlbmNlCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyCi0JICogQHNlZSBUeFJlY29yZAotCSAqLwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFhfUkVDT1JEID0gIlRYX1JFQ09SRCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VTFRJX0ZJTEUgPSAiTVVMVElfRklMRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNhdmUgb3B0aW9uIHRvIHJlZnJlc2ggdGhlIHdvcmtzcGFjZSB3aGVuIG5ldyByZXNvdXJjZSBpcyBjcmVhdGVkIGFuZAotCSAqIHNhdmVkLiBJdHMgdmFsdWUgbXVzdCBiZSBhIHN0cmluZyAidHJ1ZSIgb3IgImZhbHNlIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRlJFU0hfTkVXX1JFU09VUkNFID0gIlJFRlJFU0hfTkVXX1JFU09VUkNFIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2F2ZSBvcHRpb24gdG8gY2hlY2sgdGhlIHJlc291cmNlIGZvciBtb2RpZmlhYmxlIGJlZm9yZSBzYXZpbmcgaXQuIEl0cwotCSAqIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgInRydWUiIG9yICJmYWxzZSIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19NT0RJRlkgPSAiQ0hFQ0tfTU9ESUZZIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gcHJpdmF0ZSBSZXNvdXJjZSByZXNvdXJjZTsKLQlwcml2YXRlIFNldCBzYXZlU2VwYXJhdGVseUNsYXNzU2V0OwotCi0JcHJpdmF0ZSBNYXAgb3B0aW9uczsKLQotCS8qKgotCSAqIEBwYXJhbSBoZWxwZXIKLQkgKi8KLQlwdWJsaWMgTXVsdGlGaWxlWE1JU2F2ZUltcGwoWE1MSGVscGVyIGhlbHBlcikgewotCQlzdXBlcihoZWxwZXIpOwotCX0KLQotCVhNTEhlbHBlciBnZXRYTUxIZWxwZXIoKSB7Ci0JCXJldHVybiBoZWxwZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MU2F2ZUltcGwjaW5pdChvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlLAotCSAqICAgICAgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KFhNTFJlc291cmNlIHJlc291cmNlLCBNYXAgb3B0cykgewotCQlzdXBlci5pbml0KHJlc291cmNlLCBvcHRzKTsKLQotLy8JCWlmIChlc2NhcGUgIT0gbnVsbCkgewotLy8JCQkvLyB1c2UgTXlFc2NhcGUgdG8gbm90IGVzY2FwZSB3aGl0ZXNwYWNlcwotLy8JCQkvLwotLy8JCQllc2NhcGUgPSBuZXcgTXlFc2NhcGUoKTsKLS8vCQl9Ci0KLQkJc2F2ZVNlcGFyYXRlbHlDbGFzc1NldCA9IChTZXQpIG9wdHMuZ2V0KFNBVkVfU0VQQVJBVEVMWV9DTEFTU19TRVQpOwotCQlvcHRpb25zID0gb3B0czsKLQotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCWlmIChyZXNvdXJjZVNldCA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZVNldCA9IG5ldyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoKTsKLQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmFkZChyZXNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQlib29sZWFuIGNhblNhdmVTZXBhcmF0ZWx5KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIE11bHRpRmlsZVNhdmVVdGlsLmhhc093blJlc291cmNlKG9iaiwgc2F2ZVNlcGFyYXRlbHlDbGFzc1NldCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VW1hSFJFRihSZXNvdXJjZSByZXNvdXJjZSwgSW50ZXJuYWxFT2JqZWN0IG8pIHsKLQkJaWYgKG8uZUlzUHJveHkoKQotCQkJCSYmIG8uZVByb3h5VVJJKCkuc2NoZW1lKCkuZXF1YWxzKE11bHRpRmlsZVVSSUNvbnZlcnRlci5TQ0hFTUUpKSB7Ci0JCQlyZXR1cm4gby5lUHJveHlVUkkoKS50b1N0cmluZygpOwotCQl9Ci0JCVN0cmluZyBocmVmID0gbnVsbDsKLQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlocmVmID0gaGVscGVyLmdldEhSRUYobyk7Ci0JCX0KLQkJaWYgKGhyZWYgPT0gbnVsbCkgewotCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJDb3VsZCBub3QgZmluZCByZXNvdXJjZSBkZXNjcmlwdG9yIGZvciByZXNvdXJjZSAiICsgcmVzb3VyY2UgKyAiXG4gIG9iamVjdDogIiArIG8pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBNdWx0aUZpbGVTYXZlVXRpbC5nZXRIUkVGKHJlc291cmNlLCBvKTsKLQkJfQotCQlyZXR1cm4gaHJlZjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxTYXZlSW1wbCNzYXZlSHJlZihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZUhyZWYoRU9iamVjdCByZW1vdGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmKSB7Ci0JCWlmIChmIGluc3RhbmNlb2YgRVJlZmVyZW5jZSAmJiAoKEVSZWZlcmVuY2UpIGYpLmlzQ29udGFpbm1lbnQoKQotCQkJCSYmICF0b0RPTSkgewotCQkJLy8gaWYgdGhpcyBIUkVGIGlzIGEgY29udGFpbmVkIGVsZW1lbnQsIHNhdmUgaXRzIElEIGF0dHJpYnV0ZSBzbyB0aGUKLQkJCS8vIHByb3h5IGNhbiBiZSBjYWNoZWQgaW4gdGhlCi0JCQkvLyBHVUlEVG9FbGVtZW50TWFwIGZvciB0ZW1wb3JhcnkgdXNlIGJlZm9yZSBpdCBjYW4gYmUgcmVzb2x2ZWQuCi0JCQkvLyBUaGlzIGhlbHBzIGltcHJvdmUgbG9hZGluZyB0aW1lLgotCQkJLy8KLQkJCVN0cmluZyBocmVmID0gaGVscGVyLmdldEhSRUYocmVtb3RlKTsKLQkJCWlmIChocmVmICE9IG51bGwpIHsKLQkJCQlpZiAoZXNjYXBlVVJJICE9IG51bGwpIHsKLQkJCQkJaHJlZiA9IGVzY2FwZVVSSS5jb252ZXJ0KGhyZWYpOwotCQkJCX0KLQkJCQlTdHJpbmcgbmFtZSA9IGhlbHBlci5nZXRRTmFtZShmKTsKLQkJCQlkb2Muc3RhcnRFbGVtZW50KG5hbWUpOwotCQkJCUVDbGFzcyBlQ2xhc3MgPSByZW1vdGUuZUNsYXNzKCk7Ci0JCQkJRUNsYXNzIGV4cGVjdGVkVHlwZSA9IChFQ2xhc3MpIGYuZ2V0RVR5cGUoKTsKLQkJCQlpZiAoc2F2ZVR5cGVJbmZvID8geG1sVHlwZUluZm8uc2hvdWxkU2F2ZVR5cGUoZUNsYXNzLAotCQkJCQkJZXhwZWN0ZWRUeXBlLCBmKSA6IGVDbGFzcyAhPSBleHBlY3RlZFR5cGUKLQkJCQkJCSYmIGV4cGVjdGVkVHlwZS5pc0Fic3RyYWN0KCkpIHsKLQkJCQkJc2F2ZVR5cGVBdHRyaWJ1dGUoZUNsYXNzKTsKLQkJCQl9Ci0JCQkJU3RyaW5nIGlkID0gaGVscGVyLmdldElEKHJlbW90ZSk7Ci0JCQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCQkJZG9jLmFkZEF0dHJpYnV0ZShpZEF0dHJpYnV0ZU5hbWUsIGlkKTsKLQkJCQl9Ci0JCQkJZG9jLmFkZEF0dHJpYnV0ZShYTUxSZXNvdXJjZS5IUkVGLCBocmVmKTsKLQkJCQlpZiAoZU9iamVjdFRvRXh0ZW5zaW9uTWFwICE9IG51bGwpIHsKLQkJCQkJcHJvY2Vzc0F0dHJpYnV0ZUV4dGVuc2lvbnMocmVtb3RlKTsKLQkJCQkJaWYgKHByb2Nlc3NFbGVtZW50RXh0ZW5zaW9ucyhyZW1vdGUpKSB7Ci0JCQkJCQlkb2MuZW5kRWxlbWVudCgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZG9jLmVuZEVtcHR5RWxlbWVudCgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZG9jLmVuZEVtcHR5RWxlbWVudCgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLnNhdmVIcmVmKHJlbW90ZSwgZik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MU2F2ZUltcGwjc2F2ZUZlYXR1cmVzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNhdmVGZWF0dXJlcyhFT2JqZWN0IG8pIHsKLQkJdHJ5IHsKLQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIG8KLQkJCQkJLmVSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9IG8uZUNvbnRhaW5lcigpOwotCQkJCUludGVybmFsRU9iamVjdCBpbnRlcm5hbEVPYmplY3QgPSAoKEludGVybmFsRU9iamVjdCkgbyk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIGNhblNhdmVTZXBhcmF0ZWx5KG8pCi0JCQkJCQkmJiBjb250YWluZXIgIT0gbnVsbCkgewotCQkJCQlib29sZWFuIGNvbnRhaW5zTmV3RmVhdHVyZSA9IChyZXNvdXJjZSA9PSBjb250YWluZXIKLQkJCQkJCQkuZVJlc291cmNlKCkpOwotCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgbzsKLQkJCQkJVVJJIHVyaSA9IE11bHRpRmlsZVNhdmVVdGlsLmNyZWF0ZVVSSShlLCByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCQkJaWYgKGNvbnRhaW5zTmV3RmVhdHVyZSkgewotCQkJCQkJaWYgKCFpbnRlcm5hbEVPYmplY3QuZUlzUHJveHkoKSkgewotCQkJCQkJCXJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJCQkJCS5zYXZlKG8sIHVyaSwgb3B0aW9ucyk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBjaGVjayBpZiB0aGVyZSBpcyBhIFJlc291cmNlRGVzY3JpcHRvciBmb3IgdGhpcwotCQkJCQkJLy8gZWxlbWVudAotCQkJCQkJLy8gY3JlYXRlIGEgbmV3IG9uZSBpZiBuZWVkZWQKLQkJCQkJCS8vCi0JCQkJCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJCQkJLmdldFJlc291cmNlTWFuYWdlcihjb250YWluZXIuZVJlc291cmNlKCkpOwotCQkJCQkJaWYgKHJlc01nciAhPSBudWxsCi0JCQkJCQkJCSYmIHJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3IoZS5nZXRHdWlkKCkpID09IG51bGwpIHsKLQkJCQkJCQkvLyBtYWtlIHN1cmUgdGhhdCBubyBvdGhlciBSZXNvdXJjZU1hbmFnZXIgaGFzIGEKLQkJCQkJCQkvLyBSZXNvdXJjZURlc2NyaXB0b3IgZm9yIHRoaXMgZWxlbWVudAotCQkJCQkJCS8vCi0JCQkJCQkJTXVsdGlGaWxlVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9IChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpIHJlc291cmNlCi0JCQkJCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQkJCQlpZiAodXJpQ29udmVydGVyCi0JCQkJCQkJCQkuZmluZFJlc291cmNlRGVzY3JpcHRvcihlLmdldEd1aWQoKSkgPT0gbnVsbCkgewotCQkJCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5yZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIoCi0JCQkJCQkJCQkJcmVzTWdyLCBlLCByZXNvdXJjZS5nZXRGaW5hbFVSSSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlTdHJpbmcgaHJlZiA9IGdldFVtYUhSRUYocmVzb3VyY2UsIGludGVybmFsRU9iamVjdCk7Ci0JCQkJCWRvYy5hZGRBdHRyaWJ1dGUoWE1MUmVzb3VyY2UuSFJFRiwgaHJlZik7Ci0JCQkJCWVuZFNhdmVGZWF0dXJlcyhvLCAwLCBudWxsKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWlmIChvIGluc3RhbmNlb2YgUmVzb3VyY2VNYW5hZ2VyCi0JCQkJCQkmJiBoZWxwZXIuZ2V0UmVzb3VyY2UoKSAhPSByZXNvdXJjZSkgewotCQkJCQlTdHJpbmcgaHJlZiA9IGdldFVtYUhSRUYocmVzb3VyY2UsIGludGVybmFsRU9iamVjdCk7Ci0JCQkJCWRvYy5hZGRBdHRyaWJ1dGUoWE1MUmVzb3VyY2UuSFJFRiwgaHJlZik7Ci0JCQkJCWVuZFNhdmVGZWF0dXJlcyhvLCAwLCBudWxsKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHN1cGVyLnNhdmVGZWF0dXJlcyhvKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkVSUk9SIHNhdmluZyBmZWF0dXJlOiAiICsgbyk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIiAgRmVhdHVyZSByZXNvdXJjZTogIiArIG8uZVJlc291cmNlKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlTYXZlSW1wbCNhZGROYW1lc3BhY2VEZWNsYXJhdGlvbnMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE5hbWVzcGFjZURlY2xhcmF0aW9ucygpIHsKLQkJc3VwZXIuYWRkTmFtZXNwYWNlRGVjbGFyYXRpb25zKCk7Ci0JCQotCQlpZiAoIXRvRE9NKSB7Ci0JCQkvLyBzYXZlIHRvb2wgdmVyc2lvbiBpbmZvCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gVmVyc2lvblV0aWwuZ2V0QWxsVG9vbElEcygpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIHRvb2xJRCA9IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0JCQkJRVBGVmVyc2lvbnMgZXBmVmVyc2lvbnMgPSBWZXJzaW9uVXRpbC5nZXRWZXJzaW9ucyh0b29sSUQpOwotCQkJCVN0cmluZyBuc1VyaSA9IGVwZlZlcnNpb25zLmdldE5zVVJJKCk7Ci0JCQkJZG9jLmFkZEF0dHJpYnV0ZShFeHRlbmRlZE1ldGFEYXRhLlhNTE5TX1BSRUZJWCArICI6IiArIHRvb2xJRCwgbnNVcmkpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHRvb2xWZXJzaW9uID0gZXBmVmVyc2lvbnMuZ2V0TWluVG9vbFZlcnNpb25Gb3JDdXJyZW50TGlicmFyeVZlcnNpb24oKS5nZXRUb29sVmVyc2lvbigpLnRvU3RyaW5nKCk7Ci0JCQkJZG9jLmFkZEF0dHJpYnV0ZSh0b29sSUQgKyAiOnZlcnNpb24iLCB0b29sVmVyc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIE15RXNjYXBlIGV4dGVuZHMgRXNjYXBlIHsKLQkJLy8gRU1GIDIuMiBpbXByb3ZlZCBFc2NhcGUgYSBsb3Qgc28gdGhlIG92ZXJyaWRlIHRoaXMgY2xhc3MgdG8gYWRkIG91ciBjb2RlIGlzIG5vIGxvbmdlciBuZWVkZWQKLQkJLy8gZXhjZXB0IHRvIG1ha2UgaXQgcHVibGljCi0JCQotCQlwdWJsaWMgTXlFc2NhcGUoKSB7Ci0JCQlzZXRNYXBwaW5nTGltaXQoMHgxMEZGRkYpOwotCQl9Ci0JfQotCi0JLy8gVE9ETzogbmVlZHMgdG8gcmV2aXNpdCB0aGlzIGNsYXNzIHBlcmlvZGljYWxseSBzaW5jZSBpdHMgYmFzZSBjbGFzcyBtaWdodCBiZSB1cGRhdGVkIGEKLQkvLyBsb3QgaW4gRU1GLgotLy8JcHVibGljIHN0YXRpYyBjbGFzcyBNeUVzY2FwZSBleHRlbmRzIEVzY2FwZSB7Ci0vLwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9VVEZfTUFQUEFCTEVfQ09ERVBPSU5UID0gMHgxMEZGRkY7Ci0vLwotLy8JCXByb3RlY3RlZCBmaW5hbCBjaGFyW10gQkxBTksgPSB7fTsKLS8vCQkKLS8vCQlwcml2YXRlIGJvb2xlYW4gYWxsb3dDb250cm9sQ2hhcmFjdGVyczsKLS8vCi0vLwkJcHVibGljIE15RXNjYXBlKCkgewotLy8JCQlzdXBlcigpOwotLy8JCX0KLS8vCQkKLS8vCQlAT3ZlcnJpZGUKLS8vCQlwdWJsaWMgdm9pZCBzZXRBbGxvd0NvbnRyb2xDaGFyYWN0ZXJzKGJvb2xlYW4gYWxsb3dDb250cm9sQ2hhcmFjdGVycykgewotLy8JCQl0aGlzLmFsbG93Q29udHJvbENoYXJhY3RlcnMgPSBhbGxvd0NvbnRyb2xDaGFyYWN0ZXJzOwotLy8JCX0KLS8vCQkKLS8vCSAgICAvKgotLy8JICAgICAqICBDb252ZXJ0IGF0dHJpYnV0ZSB2YWx1ZXM6Ci0vLwkgICAgICogICYgdG8gJmFtcDsKLS8vCSAgICAgKiAgPCB0byAmbHQ7Ci0vLwkgICAgICogICIgdG8gJnF1b3Q7Ci0vLwkgICAgICogIFx0IHRvICYjeDk7Ci0vLwkgICAgICogIFxuIHRvICYjeEE7Ci0vLwkgICAgICogIFxyIHRvICYjeEQ7Ci0vLwkgICAgICogIAotLy8JICAgICAqICA+IHRvICZndDsgKHRoaXMgaXMgdXNlZCBmb3IgWExJRkYncykKLS8vCSAgICAgKi8KLS8vCSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnQoU3RyaW5nIGlucHV0KQotLy8JICAgIHsKLS8vCSAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotLy8JICAgICAgaW50IGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoKCk7Ci0vLwkgICAgICBncm93KGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgIGludCBvdXRwdXRQb3MgPSAwOwotLy8JICAgICAgaW50IGlucHV0UG9zID0gMDsKLS8vCSAgICAgIGNoYXIgY2ggPSAwOwotLy8JICAgICAgd2hpbGUgKGlucHV0TGVuZ3RoLS0gPiAwKQotLy8JICAgICAgewotLy8JICAgICAgICBjaCA9IGlucHV0LmNoYXJBdChpbnB1dFBvcysrKTsgLy8gdmFsdWVbb3V0cHV0UG9zXTsKLS8vCSAgICAgICAgc3dpdGNoIChjaCkKLS8vCSAgICAgICAgewotLy8JICAgICAgICAgIGNhc2UgMHgxOgotLy8JICAgICAgICAgIGNhc2UgMHgyOgotLy8JICAgICAgICAgIGNhc2UgMHgzOgotLy8JICAgICAgICAgIGNhc2UgMHg0OgotLy8JICAgICAgICAgIGNhc2UgMHg1OgotLy8JICAgICAgICAgIGNhc2UgMHg2OgotLy8JICAgICAgICAgIGNhc2UgMHg3OgotLy8JICAgICAgICAgIGNhc2UgMHg4OgotLy8JICAgICAgICAgIGNhc2UgMHhCOgotLy8JICAgICAgICAgIGNhc2UgMHhDOgotLy8JICAgICAgICAgIGNhc2UgMHhFOgotLy8JICAgICAgICAgIGNhc2UgMHhGOgotLy8JICAgICAgICAgIGNhc2UgMHgxMDoKLS8vCSAgICAgICAgICBjYXNlIDB4MTE6Ci0vLwkgICAgICAgICAgY2FzZSAweDEyOgotLy8JICAgICAgICAgIGNhc2UgMHgxMzoKLS8vCSAgICAgICAgICBjYXNlIDB4MTQ6Ci0vLwkgICAgICAgICAgY2FzZSAweDE1OgotLy8JICAgICAgICAgIGNhc2UgMHgxNjoKLS8vCSAgICAgICAgICBjYXNlIDB4MTc6Ci0vLwkgICAgICAgICAgY2FzZSAweDE4OgotLy8JICAgICAgICAgIGNhc2UgMHgxOToKLS8vCSAgICAgICAgICBjYXNlIDB4MUE6Ci0vLwkgICAgICAgICAgY2FzZSAweDFCOgotLy8JICAgICAgICAgIGNhc2UgMHgxQzoKLS8vCSAgICAgICAgICBjYXNlIDB4MUQ6Ci0vLwkgICAgICAgICAgY2FzZSAweDFFOgotLy8JICAgICAgICAgIGNhc2UgMHgxRjoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBpZiAoYWxsb3dDb250cm9sQ2hhcmFjdGVycykKLS8vCSAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgIG91dHB1dFBvcyA9IHJlcGxhY2VDaGFycyhvdXRwdXRQb3MsIENPTlRST0xfQ0hBUkFDVEVSU1tjaF0sIGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgfQotLy8JICAgICAgICAgICAgZWxzZQotLy8JICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQW4gaW52YWxpZCBYTUwgY2hhcmFjdGVyIChVbmljb2RlOiAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKSArICIpIHdhcyBmb3VuZCBpbiB0aGUgZWxlbWVudCBjb250ZW50OiIgKyBpbnB1dCk7Ci0vLwkgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgICAgY2FzZSAnJic6Ci0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgQU1QLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCSAgICAgICAgICAgIGJyZWFrOwotLy8JICAgICAgICAgIH0KLS8vCSAgICAgICAgICBjYXNlICc8JzoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBMRVNTLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCSAgICAgICAgICAgIGJyZWFrOwotLy8JICAgICAgICAgIH0KLS8vCSAgICAgICAgICAvLyBiZWdpbiBuZXcgY29kZQotLy8JICAgICAgICAgIGNhc2UgJz4nOgotLy8JICAgICAgICAgIHsKLS8vCQkgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBHUkVBVEVSLCBpbnB1dExlbmd0aCk7Ci0vLwkJICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkJICAgICAgICAgICAgYnJlYWs7ICAKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgICAgLy8gZW5kIG5ldyBjb2RlCSAgICAgICAgICAKLS8vCSAgICAgICAgICBjYXNlICciJzoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBRVU9URSwgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgICAgY2FzZSAnXG4nOgotLy8JICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgIG91dHB1dFBvcyA9IHJlcGxhY2VDaGFycyhvdXRwdXRQb3MsIExGLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCSAgICAgICAgICAgIGJyZWFrOwotLy8JICAgICAgICAgIH0KLS8vCSAgICAgICAgICBjYXNlICdccic6Ci0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgQ1IsIGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgfQotLy8JICAgICAgICAgIGNhc2UgJ1x0JzoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBUQUIsIGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgfQotLy8JICAgICAgICAgIGRlZmF1bHQ6Ci0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgaWYgKCFYTUxDaGFyLmlzVmFsaWQoY2gpKQotLy8JICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICBpZiAoWE1MQ2hhci5pc0hpZ2hTdXJyb2dhdGUoY2gpKQotLy8JICAgICAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICAgICAgY2hhciBoaWdoID0gY2g7Ci0vLwkgICAgICAgICAgICAgICAgaWYgKGlucHV0TGVuZ3RoLS0gPiAwKQotLy8JICAgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICAgIGNoID0gaW5wdXQuY2hhckF0KGlucHV0UG9zKyspOyAKLS8vCSAgICAgICAgICAgICAgICAgIGlmIChYTUxDaGFyLmlzTG93U3Vycm9nYXRlKGNoKSkKLS8vCSAgICAgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBhYmxlTGltaXQgPT0gTUFYX1VURl9NQVBQQUJMRV9DT0RFUE9JTlQpCi0vLwkgICAgICAgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICAgICAgICAvLyBFdmVyeSBjb2RlcG9pbnQgaXMgc3VwcG9ydGVkISAKLS8vCSAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVtvdXRwdXRQb3MrK10gPSBoaWdoOwotLy8JICAgICAgICAgICAgICAgICAgICAgIHZhbHVlW291dHB1dFBvcysrXSA9IGNoOwotLy8JICAgICAgICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2R1Y2UgdGhlIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIgYXMgYW4gZW50aXR5Ci0vLwkgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgKCImI3giICsgSW50ZWdlci50b0hleFN0cmluZyhYTUxDaGFyLnN1cHBsZW1lbnRhbChoaWdoLCBjaCkpICsgIjsiKS50b0NoYXJBcnJheSgpLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkgICAgICAgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQW4gaW52YWxpZCBsb3cgc3Vycm9nYXRlIGNoYXJhY3RlciAoVW5pY29kZTogMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkgKyAiKSB3YXMgZm91bmQgaW4gdGhlIGVsZW1lbnQgY29udGVudDoiICsgaW5wdXQpOwotLy8JICAgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgICBlbHNlCi0vLwkgICAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkFuIHVucGFpcmVkIGhpZ2ggc3Vycm9nYXRlIGNoYXJhY3RlciAoVW5pY29kZTogMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkgKyAiKSB3YXMgZm91bmQgaW4gdGhlIGVsZW1lbnQgY29udGVudDoiICsgaW5wdXQpOwotLy8JICAgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgfQotLy8JICAgICAgICAgICAgICBlbHNlCi0vLwkgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQW4gaW52YWxpZCBYTUwgY2hhcmFjdGVyIChVbmljb2RlOiAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKSArICIpIHdhcyBmb3VuZCBpbiB0aGUgZWxlbWVudCBjb250ZW50OiIgKyBpbnB1dCk7Ci0vLwkgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgLy8gTm9ybWFsIChCTVApIHVuaWNvZGUgY29kZXBvaW50LiBTZWUgaWYgd2Uga25vdyBmb3IgYSBmYWN0IHRoYXQgdGhlIGVuY29kaW5nIHN1cHBvcnRzIGl0OgotLy8JICAgICAgICAgICAgICBpZiAoY2ggPD0gbWFwcGFibGVMaW1pdCkKLS8vCSAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgIHZhbHVlW291dHB1dFBvcysrXSA9IGNoOwotLy8JICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgIC8vIFdlIG5vdCBzdXJlIHRoZSBlbmNvZGluZyBzdXBwb3J0cyB0aGlzIGNvZGVwb2ludCwgc28gd2Ugd3JpdGUgaXQgYXMgYSBjaGFyYWN0ZXIgZW50aXR5IHJlZmVyZW5jZS4KLS8vCSAgICAgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCAoIiYjeCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKSArICI7IikudG9DaGFyQXJyYXkoKSwgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgIH0KLS8vCSAgICAgIH0KLS8vCSAgICAgIHJldHVybiBjaGFuZ2VkID8gbmV3IFN0cmluZyh2YWx1ZSwgMCwgb3V0cHV0UG9zKSA6IGlucHV0OwotLy8JICAgIH0KLS8vCi0vLwkgICAgLyoKLS8vCSAgICAgKiAgQ29udmVydCBlbGVtZW50IHZhbHVlczoKLS8vCSAgICAgKiAgJiB0byAmYW1wOwotLy8JICAgICAqICA8IHRvICZsdDsKLS8vCSAgICAgKiAgIiB0byAmcXVvdDsKLS8vCSAgICAgKiAgXG4gdG8gbGluZSBzZXBhcmF0b3IKLS8vCSAgICAgKiAgCi0vLwkgICAgICogIFxyIHRvIGJsYW5rOwotLy8JICAgICAqICA+IHRvICZndDsgKHRoaXMgaXMgdXNlZCBmb3IgWExJRkYncykKLS8vCSAgICAgKi8KLS8vCSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUZXh0KFN0cmluZyBpbnB1dCkKLS8vCSAgICB7Ci0vLwkgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLS8vCSAgICAgIGludCBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aCgpOwotLy8JICAgICAgZ3JvdyhpbnB1dExlbmd0aCk7Ci0vLwkgICAgICBpbnQgb3V0cHV0UG9zID0gMDsKLS8vCSAgICAgIGludCBpbnB1dFBvcyA9IDA7Ci0vLwkgICAgICBjaGFyIGNoOwotLy8JICAgICAgd2hpbGUgKGlucHV0TGVuZ3RoLS0gPiAwKQotLy8JICAgICAgewotLy8JICAgICAgICBjaCA9IGlucHV0LmNoYXJBdChpbnB1dFBvcysrKTsgLy8gdmFsdWVbb3V0cHV0UG9zXTsKLS8vCSAgICAgICAgc3dpdGNoIChjaCkKLS8vCSAgICAgICAgewotLy8JICAgICAgICAgIGNhc2UgMHgxOgotLy8JICAgICAgICAgIGNhc2UgMHgyOgotLy8JICAgICAgICAgIGNhc2UgMHgzOgotLy8JICAgICAgICAgIGNhc2UgMHg0OgotLy8JICAgICAgICAgIGNhc2UgMHg1OgotLy8JICAgICAgICAgIGNhc2UgMHg2OgotLy8JICAgICAgICAgIGNhc2UgMHg3OgotLy8JICAgICAgICAgIGNhc2UgMHg4OgotLy8JICAgICAgICAgIGNhc2UgMHhCOgotLy8JICAgICAgICAgIGNhc2UgMHhDOgotLy8JICAgICAgICAgIGNhc2UgMHhFOgotLy8JICAgICAgICAgIGNhc2UgMHhGOgotLy8JICAgICAgICAgIGNhc2UgMHgxMDoKLS8vCSAgICAgICAgICBjYXNlIDB4MTE6Ci0vLwkgICAgICAgICAgY2FzZSAweDEyOgotLy8JICAgICAgICAgIGNhc2UgMHgxMzoKLS8vCSAgICAgICAgICBjYXNlIDB4MTQ6Ci0vLwkgICAgICAgICAgY2FzZSAweDE1OgotLy8JICAgICAgICAgIGNhc2UgMHgxNjoKLS8vCSAgICAgICAgICBjYXNlIDB4MTc6Ci0vLwkgICAgICAgICAgY2FzZSAweDE4OgotLy8JICAgICAgICAgIGNhc2UgMHgxOToKLS8vCSAgICAgICAgICBjYXNlIDB4MUE6Ci0vLwkgICAgICAgICAgY2FzZSAweDFCOgotLy8JICAgICAgICAgIGNhc2UgMHgxQzoKLS8vCSAgICAgICAgICBjYXNlIDB4MUQ6Ci0vLwkgICAgICAgICAgY2FzZSAweDFFOgotLy8JICAgICAgICAgIGNhc2UgMHgxRjoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBpZiAoYWxsb3dDb250cm9sQ2hhcmFjdGVycykKLS8vCSAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgQ09OVFJPTF9DSEFSQUNURVJTW2NoXSwgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCSAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkFuIGludmFsaWQgWE1MIGNoYXJhY3RlciAoVW5pY29kZTogMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkgKyAiKSB3YXMgZm91bmQgaW4gdGhlIGVsZW1lbnQgY29udGVudDoiICsgaW5wdXQpOwotLy8JICAgICAgICAgICAgfQotLy8JICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgfQotLy8JICAgICAgICAgIGNhc2UgJyYnOgotLy8JICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgIG91dHB1dFBvcyA9IHJlcGxhY2VDaGFycyhvdXRwdXRQb3MsIEFNUCwgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgICAgY2FzZSAnPCc6Ci0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgTEVTUywgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgICAgY2FzZSAnIic6Ci0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgUVVPVEUsIGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgfQotLy8JICAgICAgICAgIGNhc2UgJ1xuJzoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBMSU5FX0ZFRUQsIGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgfQotLy8JICAgICAgICAgIC8vIGJlZ2luIG1vZGlmaWVkCi0vLwkgICAgICAgICAgY2FzZSAnXHInOgotLy8JICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgIG91dHB1dFBvcyA9IHJlcGxhY2VDaGFycyhvdXRwdXRQb3MsIEJMQU5LLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCSAgICAgICAgICAgIGJyZWFrOwotLy8JICAgICAgICAgIH0KLS8vCSAgICAgICAgICBjYXNlICc+JzoKLS8vCSAgICAgICAgICB7Ci0vLy8vCSAgICAgICAgICAgIGlmIChpbnB1dFBvcyA+PSAzICYmIGlucHV0LmNoYXJBdChpbnB1dFBvcyAtIDIpID09ICddJyAmJiBpbnB1dC5jaGFyQXQoaW5wdXRQb3MgLSAzKSA9PSAnXScpCi0vLy8vCSAgICAgICAgICAgIHsKLS8vLy8JICAgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBHUkVBVEVSLCBpbnB1dExlbmd0aCk7Ci0vLy8vCSAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLy8vCSAgICAgICAgICAgICAgYnJlYWs7Ci0vLy8vCSAgICAgICAgICAgIH0KLS8vLy8JICAgICAgICAgICAgLy8gY29udGludWUgd2l0aCBkZWZhdWx0IHByb2Nlc3NpbmcKLS8vCSAgICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgR1JFQVRFUiwgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCSAgICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgfQotLy8JCSAgICAgIC8vIGVuZCBtb2RpZmllZAotLy8JICAgICAgICAgIGRlZmF1bHQ6Ci0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgaWYgKCFYTUxDaGFyLmlzVmFsaWQoY2gpKQotLy8JICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICBpZiAoWE1MQ2hhci5pc0hpZ2hTdXJyb2dhdGUoY2gpKQotLy8JICAgICAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICAgICAgY2hhciBoaWdoID0gY2g7Ci0vLwkgICAgICAgICAgICAgICAgaWYgKGlucHV0TGVuZ3RoLS0gPiAwKQotLy8JICAgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICAgIGNoID0gaW5wdXQuY2hhckF0KGlucHV0UG9zKyspOyAKLS8vCSAgICAgICAgICAgICAgICAgIGlmIChYTUxDaGFyLmlzTG93U3Vycm9nYXRlKGNoKSkKLS8vCSAgICAgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBhYmxlTGltaXQgPT0gTUFYX1VURl9NQVBQQUJMRV9DT0RFUE9JTlQpCi0vLwkgICAgICAgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICAgICAgICAvLyBFdmVyeSBjb2RlcG9pbnQgaXMgc3VwcG9ydGVkISAKLS8vCSAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVtvdXRwdXRQb3MrK10gPSBoaWdoOwotLy8JICAgICAgICAgICAgICAgICAgICAgIHZhbHVlW291dHB1dFBvcysrXSA9IGNoOwotLy8JICAgICAgICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2R1Y2UgdGhlIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIgYXMgYW4gZW50aXR5Ci0vLwkgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgKCImI3giICsgSW50ZWdlci50b0hleFN0cmluZyhYTUxDaGFyLnN1cHBsZW1lbnRhbChoaWdoLCBjaCkpICsgIjsiKS50b0NoYXJBcnJheSgpLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkgICAgICAgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQW4gaW52YWxpZCBsb3cgc3Vycm9nYXRlIGNoYXJhY3RlciAoVW5pY29kZTogMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkgKyAiKSB3YXMgZm91bmQgaW4gdGhlIGVsZW1lbnQgY29udGVudDoiICsgaW5wdXQpOwotLy8JICAgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgICBlbHNlCi0vLwkgICAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkFuIHVucGFpcmVkIGhpZ2ggc3Vycm9nYXRlIGNoYXJhY3RlciAoVW5pY29kZTogMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkgKyAiKSB3YXMgZm91bmQgaW4gdGhlIGVsZW1lbnQgY29udGVudDoiICsgaW5wdXQpOwotLy8JICAgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgfQotLy8JICAgICAgICAgICAgICBlbHNlCi0vLwkgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQW4gaW52YWxpZCBYTUwgY2hhcmFjdGVyIChVbmljb2RlOiAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKSArICIpIHdhcyBmb3VuZCBpbiB0aGUgZWxlbWVudCBjb250ZW50OiIgKyBpbnB1dCk7Ci0vLwkgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgLy8gTm9ybWFsIChCTVApIHVuaWNvZGUgY29kZXBvaW50LiBTZWUgaWYgd2Uga25vdyBmb3IgYSBmYWN0IHRoYXQgdGhlIGVuY29kaW5nIHN1cHBvcnRzIGl0OgotLy8JICAgICAgICAgICAgICBpZiAoY2ggPD0gbWFwcGFibGVMaW1pdCkKLS8vCSAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgIHZhbHVlW291dHB1dFBvcysrXSA9IGNoOwotLy8JICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgIC8vIFdlIG5vdCBzdXJlIHRoZSBlbmNvZGluZyBzdXBwb3J0cyB0aGlzIGNvZGVwb2ludCwgc28gd2Ugd3JpdGUgaXQgYXMgYSBjaGFyYWN0ZXIgZW50aXR5IHJlZmVyZW5jZS4KLS8vCSAgICAgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCAoIiYjeCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKSArICI7IikudG9DaGFyQXJyYXkoKSwgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgIH0KLS8vCSAgICAgIH0KLS8vCSAgICAgIHJldHVybiBjaGFuZ2VkID8gbmV3IFN0cmluZyh2YWx1ZSwgMCwgb3V0cHV0UG9zKSA6IGlucHV0OwotLy8JICAgIH0KLS8vCi0vLwl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tNb2RpZnlSZXF1aXJlZChNYXAgb3B0aW9ucykgewotCQlPYmplY3Qgb3B0ID0gb3B0aW9ucy5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuQ0hFQ0tfTU9ESUZZKTsKLQkJcmV0dXJuIG9wdCAhPSBudWxsID8gQm9vbGVhbi52YWx1ZU9mKG9wdC50b1N0cmluZygpKS5ib29sZWFuVmFsdWUoKQotCQkJCTogZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk4ZjY2Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkFic3RyYWN0QWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgZm9yIHRoZSBMaWJyYXJ5IFBlcnNpc3RlbmNlIHBsdWctaW4uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdEFjdGl2YXRvciB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUGVyc2lzdGVuY2VQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RvcChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9UeFJlY29yZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9UeFJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWMwZWFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvVHhSZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBrZWVwIHRoZSB0cmFuc2FjdGlvbiBkYXRhIHRvIHN1cHBvcnQgZmFpbC1zYWZlIHBlcnNpc3RlbmNlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLWNsYXNzIFR4UmVjb3JkIHsKLQotCXByaXZhdGUgU3RyaW5nIHR4SUQ7Ci0KLQlwcml2YXRlIExpc3QgcmVzb3VyY2VzVG9Db21taXQ7Ci0KLQlwcm90ZWN0ZWQgTGlzdCB3YXJuaW5nczsKLQotCS8qKgotCSAqIEBwYXJhbSB0eGlkCi0JICogQHBhcmFtIGNvbW1pdAotCSAqLwotCXB1YmxpYyBUeFJlY29yZCgpIHsKLQkJc3VwZXIoKTsKLQkJcmVzb3VyY2VzVG9Db21taXQgPSBuZXcgVW5pcXVlRUxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR4SUQoKSB7Ci0JCWlmICh0eElEID09IG51bGwpIHsKLQkJCXR4SUQgPSBVbWFVdGlsLmdlbmVyYXRlR1VJRCgpOwotCQl9Ci0JCXJldHVybiB0eElEOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlc1RvQ29tbWl0KCkgewotCQlyZXR1cm4gcmVzb3VyY2VzVG9Db21taXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgd2FybmluZ3MKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXYXJuaW5ncygpIHsKLQkJaWYgKHdhcm5pbmdzID09IG51bGwpIHsKLQkJCXdhcm5pbmdzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiB3YXJuaW5nczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJdHhJRCA9IG51bGw7Ci0JCXJlc291cmNlc1RvQ29tbWl0LmNsZWFyKCk7Ci0JCWlmICh3YXJuaW5ncyAhPSBudWxsKSB7Ci0JCQl3YXJuaW5ncy5jbGVhcigpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1Vubm9ybWFsaXplZFVSSUV4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9Vbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg4ZTIyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1Vubm9ybWFsaXplZFVSSUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi0vKioKLSAqIEV4Y2VwdGlvbiBmb3IgVVJJIHRoYXQgY2Fubm90IGJlIG5vcm1hbGl6ZWQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24gZXh0ZW5kcyBNdWx0aUZpbGVJT0V4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbXNnCi0JICovCi0JcHVibGljIFVubm9ybWFsaXplZFVSSUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7Ci0JCXN1cGVyKG1zZyk7Ci0JfQotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4MTI5MzE2MjEwNzU1MzM3ODE2TDsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9YTUlMaWJyYXJ5UGVyc2lzdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1hNSUxpYnJhcnlQZXJzaXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkNjEzMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1hNSUxpYnJhcnlQZXJzaXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMTAsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUlMaWJyYXJ5UGVyc2lzdGVyIGltcGxlbWVudHMgSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgewotCQotCS8qKgotCSAqIENvbnRydWN0cyBhIG5ldyBYTUlMaWJyYXJ5UGVyc2lzdGVyIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBYTUlMaWJyYXJ5UGVyc2lzdGVyKCkgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNnZXRGaWxlRXh0ZW5zaW9uKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKE9iamVjdCBlKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldEZpbGVFeHRlbnNpb24oZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyI2dldEZvbGRlclJlbGF0aXZlUGF0aChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb2xkZXJSZWxhdGl2ZVBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldEZvbGRlclJlbGF0aXZlUGF0aChlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjaGFzT3duRm9sZGVyKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duRm9sZGVyKE9iamVjdCBlKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmhhc093bkZvbGRlcihlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUxpYnJhcnlQZXJzaXN0ZXIjYWRqdXN0TG9jYXRpb24ob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkanVzdExvY2F0aW9uKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuYWRqdXN0TG9jYXRpb24ocmVzb3VyY2UpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JTGlicmFyeVBlcnNpc3RlciNkZWxldGUob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZShNZXRob2RFbGVtZW50IGUpIHsKLQkJTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5kZWxldGUoZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklMaWJyYXJ5UGVyc2lzdGVyI2dldEZhaWxTYWZlUGVyc2lzdGVyKCkKLQkgKi8KLQlwdWJsaWMgRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGdldEZhaWxTYWZlUGVyc2lzdGVyKCkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JTGlicmFyeVBlcnNpc3RlciNnZXRXYXJuaW5ncygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0V2FybmluZ3MoKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldFdhcm5pbmdzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklMaWJyYXJ5UGVyc2lzdGVyI2hhc093blJlc291cmNlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duUmVzb3VyY2UoT2JqZWN0IGUpIHsKLQkJcmV0dXJuIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuaGFzT3duUmVzb3VyY2UoZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklMaWJyYXJ5UGVyc2lzdGVyI2hhc093blJlc291cmNlV2l0aG91dFJlZmVycmVyKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoT2JqZWN0IGUpIHsKLQkJcmV0dXJuIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklMaWJyYXJ5UGVyc2lzdGVyI3NhdmUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLnNhdmUocmVzb3VyY2UpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JTGlicmFyeVBlcnNpc3RlciNzYXZlKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0Uuc2F2ZShlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBjcmVhdGVNZXRob2RQbHVnaW5Gb2xkZXIoU3RyaW5nIHBsdWdpbk5hbWUsIE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5jcmVhdGVNZXRob2RQbHVnaW5Gb2xkZXIocGx1Z2luTmFtZSwgbGlicmFyeSk7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0RGVmYXVsdE1ldGhvZENvbmZpZ3VyYXRpb25Gb2xkZXIoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldERlZmF1bHRNZXRob2RDb25maWd1cmF0aW9uRm9sZGVyKGxpYnJhcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRNZXRob2RDb25maWd1cmF0aW9uRm9sZGVyKE1ldGhvZExpYnJhcnkgbGlicmFyeSwgRmlsZSBmaWxlKSB7Ci0JCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0Uuc2V0RGVmYXVsdE1ldGhvZENvbmZpZ3VyYXRpb25Gb2xkZXIobGlicmFyeSwgZmlsZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZWRCeShSZXNvdXJjZSByZXNvdXJjZSwgUmVzb3VyY2UgY29udGFpbmVyUmVzb3VyY2UpIHsKLQkJcmV0dXJuIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuaXNDb250YWluZWRCeShyZXNvdXJjZSwgY29udGFpbmVyUmVzb3VyY2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VGb2xkZXJQYXRoKE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5nZXRSZXNvdXJjZUZvbGRlclBhdGgoZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGb2xkZXJBYnNvbHV0ZVBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldEZvbGRlckFic29sdXRlUGF0aChlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXIjZGVsZXRlKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZShDb2xsZWN0aW9uPE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRzKSB7Ci0JCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuZGVsZXRlKGVsZW1lbnRzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1hNSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvWE1JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzJhZjk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvWE1JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMjcsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUlMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5IGltcGxlbWVudHMgSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkjY3JlYXRlTGlicmFyeVJlc291cmNlU2V0KCkKLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlSZXNvdXJjZVNldCBjcmVhdGVMaWJyYXJ5UmVzb3VyY2VTZXQoKSB7Ci0JCXJldHVybiBuZXcgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkjZ2V0UGVyc2lzdGVuY2VUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBlcnNpc3RlbmNlVHlwZSgpIHsKLQkJcmV0dXJuIFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vSU1pZ3JhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9JTWlncmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkODAyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9JTWlncmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogTWlncmF0ZXMgb25lIHZlcnNpb24gb2YgVU1BIGxpYnJhcnkgdG8gYW5vdGhlcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNaWdyYXRvciB7Ci0KLQl2b2lkIG1pZ3JhdGUoU3RyaW5nIGxpYlBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbjsKLQl2b2lkIG1pZ3JhdGUoU3RyaW5nIGxpYlBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVXBncmFkZUNhbGxlckluZm8gaW5mbykgdGhyb3dzIEV4Y2VwdGlvbjsKLQl2b2lkIG1pZ3JhdGVYbWxJbXBvcnRlZExpYihNZXRob2RMaWJyYXJ5IGxpYiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9NYXBwaW5nVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vTWFwcGluZ1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q4YjM3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9NYXBwaW5nVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5FUEZWZXJzaW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LlZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3Mgd2l0aCBzdGF0aWMgY29udmVuaWVuY2UgbWV0aG9kcyB0byBwZXJmb3JtIGxpYnJhcnkgdXBncmFkZSBmcm9tCi0gKiBvbGRlciB2ZXJzaW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWFwcGluZ1V0aWwgewotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWlncmF0b3IgewotCQlCdW5kbGUgYnVuZGxlOwotCi0JCVN0cmluZyBjbGFzc05hbWU7Ci0KLQkJU3RyaW5nIGxpYk5zVVJJOwotCi0JCUlNaWdyYXRvciBpbnN0YW5jZTsKLQotCQkvKioKLQkJICogQHBhcmFtIGJ1bmRsZQotCQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JCSAqIEBwYXJhbSBsaWJOc1VSSQotCQkgKi8KLQkJcHVibGljIE1pZ3JhdG9yKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBsaWJOc1VSSSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCQl0aGlzLmxpYk5zVVJJID0gbGliTnNVUkk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGxvY2FsRGVidWcgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBNYXAgbWlncmF0b3JzOwotCXByaXZhdGUgc3RhdGljIFNldCBvbGROc1VyaXMgPSBuZXcgSGFzaFNldCgpOwotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRqdXN0ZWRMaWJOc1VSSU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElNaWdyYXRvciBnZXRNaWdyYXRvcihTdHJpbmcgbGliTnNVUkkpIHsKLQkJaWYgKG1pZ3JhdG9ycyA9PSBudWxsKSB7Ci0JCQltaWdyYXRvcnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJLy8gUHJvY2VzcyB0aGUgIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm1pZ3JhdG9ycyIKLQkJCS8vIGV4dGVuc2lvbiBwb2ludAotCQkJLy8gY29udHJpYnV0b3JzLgotCQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0KLQkJCQkJLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeQotCQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJCQkJIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlIiwgIm1pZ3JhdG9ycyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBuc1VSSSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoImxpYk5zVVJJIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwKLQkJCQkJCQkJCSYmIGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCQkmJiBuc1VSSSAhPSBudWxsCi0JCQkJCQkJCQkmJiBuc1VSSS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCW1pZ3JhdG9ycy5wdXQobnNVUkksIG5ldyBNaWdyYXRvcihidW5kbGUsCi0JCQkJCQkJCQkJY2xhc3NOYW1lLCBuc1VSSSkpOwotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlNaWdyYXRvciBtaWdyYXRvciA9IChNaWdyYXRvcikgbWlncmF0b3JzLmdldChsaWJOc1VSSSk7Ci0JCWlmIChtaWdyYXRvciAhPSBudWxsKSB7Ci0JCQlpZiAobWlncmF0b3IuaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCW1pZ3JhdG9yLmluc3RhbmNlID0gKElNaWdyYXRvcikgbWlncmF0b3IuYnVuZGxlLmxvYWRDbGFzcygKLQkJCQkJCQltaWdyYXRvci5jbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbWlncmF0b3IuaW5zdGFuY2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBjb252ZXJzaW9uUmVxdWlyZWQoU3RyaW5nIGxpYlBhdGgsCi0JCQlWZXJzaW9uVXRpbC5WZXJzaW9uQ2hlY2tJbmZvIGluZm8pIHsKLQkJU3RyaW5nIGN1cnJlbnROc1VSSSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRVTUFOc1VSSSgpOwotCQlTdHJpbmcgbGliTnNVUkkgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0VU1BTnNVUkkobGliUGF0aCk7Ci0JCWxpYk5zVVJJID0gZ2V0QWRqdXN0ZWRMaWJOc1VSSShsaWJOc1VSSSwgaW5mbyk7Ci0KLQkJaWYgKG9sZE5zVXJpcy5jb250YWlucyhsaWJOc1VSSSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChjdXJyZW50TnNVUkkuZXF1YWxzKGxpYk5zVVJJKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWJvb2xlYW4gcmV0ID0gZ2V0TWlncmF0b3IobGliTnNVUkkpICE9IG51bGw7Ci0JCWlmIChyZXQpIHsKLQkJCW9sZE5zVXJpcy5hZGQobGliTnNVUkkpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCS8vVGhpcyBpcyBhbiB1Z2x5IHBpZWNlLCBidXQgd2UgbmVlZCBpdCBmb3IgbWlncmF0aW5nIEVQRiAxLjEuMAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBZGp1c3RlZExpYk5zVVJJKFN0cmluZyBsaWJOc1VSSSwgVmVyc2lvblV0aWwuVmVyc2lvbkNoZWNrSW5mbyBpbmZvKSB7Ci0JCVN0cmluZyByZXQgPSBnZXRBZGp1c3RlZExpYk5zVVJJXyhsaWJOc1VSSSwgaW5mbyk7Ci0JCWlmIChyZXQgIT0gbGliTnNVUkkpIHsKLQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gbGliTnNVUkk6ICIgKyBsaWJOc1VSSSk7CS8vJE5PTi1OTFMtMSQgCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gYWRqdXN0ZWRMaWJOc1VSSTogIiArIHJldCk7CS8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWFkanVzdGVkTGliTnNVUklNYXAucHV0KGxpYk5zVVJJLCByZXQpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBZGp1c3RlZExpYk5zVVJJXyhTdHJpbmcgbGliTnNVUkksIFZlcnNpb25VdGlsLlZlcnNpb25DaGVja0luZm8gaW5mbykgewotCQlTdHJpbmcgY3VycmVudE5zVVJJID0gUGVyc2lzdGVuY2VVdGlsLmdldFVNQU5zVVJJKCk7Ci0JCWlmICghIGN1cnJlbnROc1VSSS5lcXVhbHMobGliTnNVUkkpKSB7Ci0JCQlyZXR1cm4gbGliTnNVUkk7Ci0JCX0gZWxzZSBpZiAoISBsaWJOc1VSSS5lcXVhbHMoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiKSkgeyAvLyROT04tTkxTLTEkIAotCQkJcmV0dXJuIGxpYk5zVVJJOwotCQl9Ci0JCWlmIChpbmZvLnRvb2xWZXJzaW9uLmVxdWFscyhpbmZvLmN1cnJlbnRNaW5Ub29sVmVyc2lvbikpIHsKLQkJCXJldHVybiBsaWJOc1VSSTsKLQkJfQotCQlyZXR1cm4gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMy91bWEuZWNvcmUiOwkvLyROT04tTkxTLTEkIAotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtaWdyYXRlKFN0cmluZyBsaWJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFVwZ3JhZGVDYWxsZXJJbmZvIGluZm8pCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSU1pZ3JhdG9yIG1pZ3JhdG9yID0gZ2V0TWlncmF0b3JCeUxpYlBhdGgobGliUGF0aCk7Ci0JCWlmIChtaWdyYXRvciAhPSBudWxsKSB7Ci0JCQltaWdyYXRvci5taWdyYXRlKGxpYlBhdGgsIG1vbml0b3IsIGluZm8pOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSU1pZ3JhdG9yIGdldE1pZ3JhdG9yQnlMaWJQYXRoKFN0cmluZyBsaWJQYXRoKSB7Ci0JCVN0cmluZyBuc1VSSSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRVTUFOc1VSSShsaWJQYXRoKTsKLQkJU3RyaW5nIGFkanVzdGVkTGliTnNVUkkgPSBhZGp1c3RlZExpYk5zVVJJTWFwLmdldChuc1VSSSk7Ci0JCWlmIChhZGp1c3RlZExpYk5zVVJJICE9IG51bGwpIHsKLQkJCW5zVVJJID0gYWRqdXN0ZWRMaWJOc1VSSTsKLQkJfQotCQlyZXR1cm4gZ2V0TWlncmF0b3IobnNVUkkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3RyaW5nIGxpYlBhdGggPSBhcmdzWzBdOwotCQlTeXN0ZW0ub3V0Ci0JCQkJLnByaW50bG4oIlN0YXJ0IG1pZ3JhdGluZyBtZXRob2QgbGlicmFyeSBhdCAnIiArIGxpYlBhdGggKyAiJy4uLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdHJ5IHsKLQkJCW1pZ3JhdGUobGliUGF0aCwgbnVsbCwgbnVsbCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTWlncmF0aW9uIHN1Y2Nlc3NmdWxsLiIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJU3lzdGVtLmVyci5wcmludGxuKCk7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIk1pZ3JhdGlvbiBmYWlsZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vTWlncmF0aW9uUmVzb3VyY2VIYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9NaWdyYXRpb25SZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJjMzhmMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9NaWdyYXRpb25SZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5CYXNpY1Jlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQW55VHlwZTsKLQotLyoqCi0gKiBSZXNvdXJjZSBoYW5kbGVyIGZvciBtaWdyYXRpbmcgVU1BIGxpYnJhcnkgZnJvbSBvbmUgdmVyc2lvbiB0byBhbm90aGVyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWlncmF0aW9uUmVzb3VyY2VIYW5kbGVyIGV4dGVuZHMgQmFzaWNSZXNvdXJjZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7Ci0KLQlwdWJsaWMgTWlncmF0aW9uUmVzb3VyY2VIYW5kbGVyKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLkJhc2ljUmVzb3VyY2VIYW5kbGVyI3Bvc3RMb2FkKG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2UsCi0JICogICAgICBqYXZhLmlvLklucHV0U3RyZWFtLCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIHBvc3RMb2FkKFhNTFJlc291cmNlIHJlc291cmNlLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwKLQkJCU1hcCBvcHRpb25zKSB7Ci0JCWlmICghcmVzb3VyY2UuZ2V0RU9iamVjdFRvRXh0ZW5zaW9uTWFwKCkuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiTWlncmF0aW9uUmVzb3VyY2VIYW5kbGVyLnBvc3RMb2FkKCk6ICIgKyByZXNvdXJjZS5nZXRVUkkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gU3RhcnQgdW5rbm93biBmZWF0dXJlcyAtLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlLmdldEVPYmplY3RUb0V4dGVuc2lvbk1hcCgpLmVudHJ5U2V0KCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbnRyeS5nZXRLZXkoKSBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJLy8gaGFuZGxlIG1vdmVkIGRhdGEKLQkJCQkJLy8KLQkJCQkJaGFuZGxlVW5rbm93bkRhdGEoKEVPYmplY3QpIGVudHJ5LmdldEtleSgpLCAoQW55VHlwZSllbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tIEVuZCB1bmtub3duIGZlYXR1cmVzIC0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGV4dChBbnlUeXBlIHZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCUZlYXR1cmVNYXAuRW50cnkgZW50cnkgPSAoRmVhdHVyZU1hcC5FbnRyeSkgdmFsdWUuZ2V0TWl4ZWQoKS5nZXQoMCk7Ci0JCQlyZXR1cm4gKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBFQXR0cmlidXRlIGdldEVBdHRyaWJ1dGUoRUNsYXNzIGVDbGFzcywgU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVDbGFzcy5nZXRFQWxsQXR0cmlidXRlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUVBdHRyaWJ1dGUgYXR0cmliID0gKEVBdHRyaWJ1dGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChhdHRyaWIuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiBhdHRyaWI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFZhbHVlKEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUpIHsKLQkJaWYgKCFmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQllT2JqZWN0LmVTZXQoZmVhdHVyZSwgdmFsdWUpOwotCQl9IGVsc2UgewotCQkJQ29sbGVjdGlvbiB2YWx1ZXMgPSAoQ29sbGVjdGlvbikgZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotCQkJCXZhbHVlcy5hZGRBbGwoKENvbGxlY3Rpb24pIHZhbHVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmFsdWVzLmFkZCh2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBoYW5kbGVVbmtub3duRmVhdHVyZShFT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKTsKLQotCXByaXZhdGUgdm9pZCBoYW5kbGVVbmtub3duRmVhdHVyZXMoRU9iamVjdCBvd25lciwgRmVhdHVyZU1hcCBmZWF0dXJlTWFwKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZlYXR1cmVNYXAuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlGZWF0dXJlTWFwLkVudHJ5IGVudHJ5ID0gKEZlYXR1cmVNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSBlbnRyeS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJCWlmKGhhbmRsZVVua25vd25GZWF0dXJlKG93bmVyLCBmLCBlbnRyeS5nZXRWYWx1ZSgpKSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlVW5rbm93bkRhdGEoRU9iamVjdCBlLCBBbnlUeXBlIHVua25vd25EYXRhKSB7Ci0JCWhhbmRsZVVua25vd25GZWF0dXJlcyhlLCB1bmtub3duRGF0YS5nZXRNaXhlZCgpKTsKLQkJaGFuZGxlVW5rbm93bkZlYXR1cmVzKGUsIHVua25vd25EYXRhLmdldEFueUF0dHJpYnV0ZSgpKTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFNpbmdsZVZhbHVlKEZlYXR1cmVNYXAgZmVhdHVyZU1hcCwKLQkJCVN0cmluZyBmZWF0dXJlTmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmZWF0dXJlTWFwLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRmVhdHVyZU1hcC5FbnRyeSBlbnRyeSA9IChFbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZW50cnkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscyhmZWF0dXJlTmFtZSkpIHsKLQkJCQlyZXR1cm4gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIENvbGxlY3Rpb24gZ2V0VmFsdWUoRmVhdHVyZU1hcCBmZWF0dXJlTWFwLAotCQkJU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCUNvbGxlY3Rpb24gbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZU1hcC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUZlYXR1cmVNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVudHJ5LmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLmdldE5hbWUoKS5lcXVhbHMoZmVhdHVyZU5hbWUpKSB7Ci0JCQkJbGlzdC5hZGQoZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9NaWdyYXRvckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL01pZ3JhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTQ5ZDI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL01pZ3JhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIERlZmF1bHQgaW1wbGVtZW50YXRvbiBmb3IgSU1pZ3JhdG9yCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRvckltcGwgaW1wbGVtZW50cyBJTWlncmF0b3IgewotCQotCXB1YmxpYyB2b2lkIG1pZ3JhdGUoU3RyaW5nIGxpYlBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBVcGdyYWRlQ2FsbGVySW5mbyBpbmZvKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBtaWdyYXRlWG1sSW1wb3J0ZWRMaWIoTWV0aG9kTGlicmFyeSBsaWIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL1VNQTJVTUFSZXNvdXJjZUhhbmRsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL1VNQTJVTUFSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyNWQxYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9VTUEyVU1BUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQW55VHlwZTsKLQotLyoqCi0gKiBSZXNvdXJjZSBoYW5kbGVyIGZvciBtaWdyYXRpbmcgVU1BIGxpYnJhcnkgZnJvbSBvbmUgdmVyc2lvbiB0byBhbm90aGVyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVU1BMlVNQVJlc291cmNlSGFuZGxlciBleHRlbmRzIE1pZ3JhdGlvblJlc291cmNlSGFuZGxlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsKLQotCXByaXZhdGUgTGlzdCBtb3ZlSW5mb3M7Ci0KLQlwdWJsaWMgVU1BMlVNQVJlc291cmNlSGFuZGxlcigpIHsKLQkJbW92ZUluZm9zID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgRUF0dHJpYnV0ZSBnZXRFQXR0cmlidXRlKEVDbGFzcyBlQ2xhc3MsIFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlQ2xhc3MuZ2V0RUFsbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlFQXR0cmlidXRlIGF0dHJpYiA9IChFQXR0cmlidXRlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoYXR0cmliLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gYXR0cmliOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgcnVsZXMgdG8gbW92ZSBkYXRhCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGZlYXR1cmVOYW1lCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0TmV3RmVhdHVyZShFT2JqZWN0IG93bmVyLCBTdHJpbmcgZmVhdHVyZU5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3MgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSBydWxlcyB0byBtb3ZlIGRhdGEKLQkgKiAKLQkgKiBAcGFyYW0gb2xkT3duZXIKLQkgKiBAcGFyYW0gZmVhdHVyZU5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0TmV3T3duZXIoRU9iamVjdCBvbGRPd25lciwgU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0TmV3VmFsdWUoRU9iamVjdCBvbGRPd25lciwgU3RyaW5nIGZlYXR1cmVOYW1lLAotCQkJQW55VHlwZSB2YWx1ZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlRGF0YSgpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW92ZUluZm9zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTW92ZUluZm8gaW5mbyA9IChNb3ZlSW5mbykgaXRlci5uZXh0KCk7Ci0JCQlFT2JqZWN0IG5ld093bmVyID0gZ2V0TmV3T3duZXIoaW5mby5vbGRPd25lciwgaW5mby5vbGRGZWF0dXJlTmFtZSk7Ci0JCQlpZiAobmV3T3duZXIgIT0gbnVsbCkgewotCQkJCXNldFZhbHVlKG5ld093bmVyLCBpbmZvLm5ld0ZlYXR1cmUsIGluZm8udmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFZhbHVlKEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUpIHsKLQkJaWYgKCFmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQllT2JqZWN0LmVTZXQoZmVhdHVyZSwgdmFsdWUpOwotCQl9IGVsc2UgewotCQkJQ29sbGVjdGlvbiB2YWx1ZXMgPSAoQ29sbGVjdGlvbikgZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotCQkJCXZhbHVlcy5hZGRBbGwoKENvbGxlY3Rpb24pIHZhbHVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmFsdWVzLmFkZCh2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1vdmVJbmZvIHsKLQkJRU9iamVjdCBvbGRPd25lcjsKLQotCQlTdHJpbmcgb2xkRmVhdHVyZU5hbWU7Ci0KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIG5ld0ZlYXR1cmU7Ci0KLQkJT2JqZWN0IHZhbHVlOwotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoKQotCQkJCQkuYXBwZW5kKGdldENsYXNzKCkuZ2V0TmFtZSgpKQotCQkJCQkuYXBwZW5kKCIoXG4iKSAvLyROT04tTkxTLTEkCi0JCQkJCS5hcHBlbmQoIiAgb2xkRmVhdHVyZU5hbWU6ICIpLmFwcGVuZChvbGRGZWF0dXJlTmFtZSkuYXBwZW5kKCdcbicpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLmFwcGVuZCgiICBuZXdGZWF0dXJlOiAiKS5hcHBlbmQobmV3RmVhdHVyZSkuYXBwZW5kKCdcbicpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLmFwcGVuZCgiICB2YWx1ZTogIikuYXBwZW5kKHZhbHVlKS5hcHBlbmQoJ1xuJykgLy8kTk9OLU5MUy0xJAotCQkJCQkuYXBwZW5kKCIpIikudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0U2luZ2xlVmFsdWUoRmVhdHVyZU1hcCBmZWF0dXJlTWFwLAotCQkJU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZlYXR1cmVNYXAuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlGZWF0dXJlTWFwLkVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbnRyeS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKS5nZXROYW1lKCkuZXF1YWxzKGZlYXR1cmVOYW1lKSkgewotCQkJCXJldHVybiBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgQ29sbGVjdGlvbiBnZXRWYWx1ZShGZWF0dXJlTWFwIGZlYXR1cmVNYXAsCi0JCQlTdHJpbmcgZmVhdHVyZU5hbWUpIHsKLQkJQ29sbGVjdGlvbiBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmZWF0dXJlTWFwLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRmVhdHVyZU1hcC5FbnRyeSBlbnRyeSA9IChFbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZW50cnkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscyhmZWF0dXJlTmFtZSkpIHsKLQkJCQlsaXN0LmFkZChlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhck1vdmVJbmZvcygpIHsKLQkJbW92ZUluZm9zLmNsZWFyKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uTWlncmF0aW9uUmVzb3VyY2VIYW5kbGVyI2hhbmRsZVVua25vd25GZWF0dXJlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZVVua25vd25GZWF0dXJlKEVPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJU3RyaW5nIGZlYXR1cmVOYW1lID0gZmVhdHVyZS5nZXROYW1lKCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBuZXdGZWF0dXJlID0gZ2V0TmV3RmVhdHVyZShvd25lciwgZmVhdHVyZU5hbWUpOwotCQlpZiAobmV3RmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlNb3ZlSW5mbyBtb3ZlSW5mbyA9IG5ldyBNb3ZlSW5mbygpOwotCQkJbW92ZUluZm8ub2xkT3duZXIgPSBvd25lcjsKLQkJCW1vdmVJbmZvLm9sZEZlYXR1cmVOYW1lID0gZmVhdHVyZU5hbWU7Ci0JCQltb3ZlSW5mby5uZXdGZWF0dXJlID0gbmV3RmVhdHVyZTsKLQkJCW1vdmVJbmZvLnZhbHVlID0gdmFsdWUgaW5zdGFuY2VvZiBBbnlUeXBlID8gZ2V0TmV3VmFsdWUoCi0JCQkJCW93bmVyLCBmZWF0dXJlTmFtZSwgKEFueVR5cGUpIHZhbHVlKQotCQkJCQk6IHZhbHVlOwotCQkJbW92ZUluZm9zLmFkZChtb3ZlSW5mbyk7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obW92ZUluZm8pOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vVXBncmFkZUNhbGxlckluZm8uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL1VwZ3JhZGVDYWxsZXJJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzY2U2NzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vVXBncmFkZUNhbGxlckluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBDbGFzcyByZXByZXNlbnRpbmcgY2FsbGVyIGluZm8gZm9yIGNhbGxpbmcgbGlicmFyeSB1cGdyYWRlIGNvZGUuCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGdyYWRlQ2FsbGVySW5mbyB7Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgdXBncmFkZUxpYnJhcnkgPSAwOwotCXB1YmxpYyBzdGF0aWMgaW50IHVwZ3JhZGVJbXBvcnRQbHVnaW4gPSAxOwotCXB1YmxpYyBzdGF0aWMgaW50IHVwZ3JhZGVJbXBvcnRDb25maWcgPSAyOwotCQotCXByaXZhdGUgaW50IGNhbGxlclR5cGUgPSB1cGdyYWRlTGlicmFyeTsKLQlwcml2YXRlIFN0cmluZyBlcnJvck1zZzsKLQlGaWxlIGxpYkZpbGU7Ci0JRmlsZSBjb3BpZWRMaWJGaWxlOwotCQotCXB1YmxpYyBVcGdyYWRlQ2FsbGVySW5mbyhpbnQgY2FsbGVyVHlwZSwgRmlsZSBsaWJGaWxlKSB7Ci0JCXRoaXMuY2FsbGVyVHlwZSA9IGNhbGxlclR5cGU7Ci0JCXRoaXMubGliRmlsZSA9IGxpYkZpbGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VwZ3JhZGVMaWJyYXJ5KFVwZ3JhZGVDYWxsZXJJbmZvIGluZm8pIHsKLQkJcmV0dXJuIGluZm8gPT0gbnVsbCB8fCBpbmZvLmlzVXBncmFkZUxpYnJhcnkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNVcGdyYWRlTGlicmFyeSgpIHsKLQkJcmV0dXJuIGNhbGxlclR5cGUgPT0gdXBncmFkZUxpYnJhcnk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldElzRXhwb3J0ZWRQbHVnaW5MaWIoKSB7Ci0JCXJldHVybiBjYWxsZXJUeXBlID09IHVwZ3JhZGVJbXBvcnRQbHVnaW47Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEVycm9yTXNnKFN0cmluZyBtc2cpIHsKLQkJZXJyb3JNc2cgPSBtc2c7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNc2coKSB7Ci0JCXJldHVybiBlcnJvck1zZzsKLQl9CQkJCi0JCi0JcHVibGljIHZvaWQgc2V0Q29waWVkTGliRmlsZShGaWxlIGZpbGUpIHsKLQkJY29waWVkTGliRmlsZSA9IGZpbGU7Ci0JfQotCQotCXB1YmxpYyBGaWxlIGdldENvcGllZExpYkZpbGUoKSB7Ci0JCXJldHVybiBjb3BpZWRMaWJGaWxlOwotCX0KLQkKLQlwcm90ZWN0ZWQgRmlsZSBnZXRMaWJGaWxlKCkgewotCQlyZXR1cm4gbGliRmlsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb3B5TGlicmFyeSgpIHsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29waWVkTGlicmFyeSgpIHsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9pbnRlcm5hbC9NaWdyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vaW50ZXJuYWwvTWlncmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM4NWFhMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9pbnRlcm5hbC9NaWdyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZVJlZ2lzdHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkV4dGVuZGVkTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5JbGxlZ2FsVmFsdWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5BbnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLmVjb3JlMnhtbC5FY29yZTJYTUxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLmVjb3JlMnhtbC5FY29yZTJYTUxSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJ4bWwuaW1wbC5FY29yZTJYTUxSZWdpc3RyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyeG1sLnV0aWwuRWNvcmUyWE1MRXh0ZW5kZWRNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVVUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVhNSUhlbHBlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVNQTJVTUFSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBNaWdyYXRlcyBvbmUgdmVyc2lvbiBvZiBVTUEgbGlicmFyeSB0byBhbm90aGVyIHVzaW5nIHRoZSBwcm92aWRlZCBFY29yZTJYTUwKLSAqIG1hcHBpbmcgZmlsZXMgYW5kIFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIuIFRoZSBFY29yZTJYTUwgbWFwcGluZyBmaWxlcwotICogc3BlY2lmaWVzIHRoZSBuYW1lIGNoYW5nZXMgb2YgY2xhc3Nlcy9hdHRyaWJ1dGVzIHdoaWxlIFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIKLSAqIGhhbmRsZXMgdGhlIGRhdGEgbW92aW5nLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWlncmF0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE5TX1VSSXMgPSB7IE1pZ3JhdG9yLk9MRF9VTUFfTlNfVVJJLAotCQkJTWlncmF0b3IuT0xEX1VNQV9OU19VUkksIE1pZ3JhdG9yLlVNQV9OU19VUkkgfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFVSSVtdIEVDT1JFMlhNTF9VUklzID0gewotCQkJVVJJCi0JCQkJCS5jcmVhdGVVUkkoInBsYXRmb3JtOi9wbHVnaW4vY29tLmlibS5ycG0ubGlicmFyeS5wZXJzaXN0ZW5jZS9taWdyYXRpb24vdW1hLmVjb3JlMnhtbCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCVVSSQotCQkJCQkuY3JlYXRlVVJJKCJwbGF0Zm9ybTovcGx1Z2luL2NvbS5pYm0ucnBtLmxpYnJhcnkucGVyc2lzdGVuY2UvbWlncmF0aW9uL3VtYTIuZWNvcmUyeG1sIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJVVJJCi0JCQkJCS5jcmVhdGVVUkkoInBsYXRmb3JtOi9wbHVnaW4vY29tLmlibS5ycG0ubGlicmFyeS5wZXJzaXN0ZW5jZS9taWdyYXRpb24vdW1hMy5lY29yZTJ4bWwiKSAvLyROT04tTkxTLTEkCi0JfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9MRF9VTUFfTlNfVVJJID0gImh0dHA6Ly8vY29tL2libS91bWEuZWNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTUFfTlNfVVJJID0gImh0dHA6Ly93d3cuaWJtLmNvbS91bWEvMS4wLjIvdW1hLmVjb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBFeHRlbmRlZE1ldGFEYXRhW10gZXh0ZW5kZWRNZXRhRGF0YXM7Ci0KLQlwcml2YXRlIFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIwIHJlc291cmNlSGFuZGxlcjsKLQotCXB1YmxpYyBIYXNoTWFwIG9sZFBhdGhUb05ld1VSSU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBhbnlUeXBlRmVhdHVyZVZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEV4dGVuZGVkTWV0YURhdGEgZ2V0RXh0ZW5kZWRNZXRhRGF0YShTdHJpbmcgb2xkTnNVUkksCi0JCQlVUkkgZWNvcmUyWE1MVVJJKSB7Ci0JCUVQYWNrYWdlLlJlZ2lzdHJ5IGVQYWNrYWdlUmVnaXN0cnkgPSBuZXcgRVBhY2thZ2VSZWdpc3RyeUltcGwoCi0JCQkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UpOwotCQllUGFja2FnZVJlZ2lzdHJ5LnB1dChvbGROc1VSSSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCUVjb3JlMlhNTFJlZ2lzdHJ5IGVjb3JlMnhtbFJlZ2lzdHJ5ID0gbmV3IEVjb3JlMlhNTFJlZ2lzdHJ5SW1wbCgKLQkJCQlFY29yZTJYTUxSZWdpc3RyeS5JTlNUQU5DRSk7Ci0KLQkJZWNvcmUyeG1sUmVnaXN0cnkKLQkJCQkucHV0KG9sZE5zVVJJLCBFY29yZVV0aWwuZ2V0T2JqZWN0QnlUeXBlKG5ldyBSZXNvdXJjZVNldEltcGwoKQotCQkJCQkJLmdldFJlc291cmNlKGVjb3JlMlhNTFVSSSwgdHJ1ZSkuZ2V0Q29udGVudHMoKSwKLQkJCQkJCUVjb3JlMlhNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFhNTE1hcCgpKSk7Ci0KLQkJcmV0dXJuIG5ldyBFY29yZTJYTUxFeHRlbmRlZE1ldGFEYXRhKGVQYWNrYWdlUmVnaXN0cnksCi0JCQkJZWNvcmUyeG1sUmVnaXN0cnkpIHsKLQkJCXB1YmxpYyBFQ2xhc3NpZmllciBnZXRUeXBlKEVQYWNrYWdlIGVQYWNrYWdlLCBTdHJpbmcgbmFtZSkgewotCQkJCUVDbGFzc2lmaWVyIHR5cGUgPSBzdXBlci5nZXRUeXBlKGVQYWNrYWdlLCBuYW1lKTsKLQotCQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQkJLy8gdHJ5IHRvIGdldCB0eXBlIGZyb20gdGhlIHBhY2thZ2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZQotCQkJCQkvLwotCQkJCQlMaXN0IGVDbGFzc2lmaWVycyA9IGVQYWNrYWdlLmdldEVDbGFzc2lmaWVycygpOwotCQkJCQlmb3IgKGludCBpID0gMCwgc2l6ZSA9IGVDbGFzc2lmaWVycy5zaXplKCk7IGkgPCBzaXplOyArK2kpIHsKLQkJCQkJCUVDbGFzc2lmaWVyIGVDbGFzc2lmaWVyID0gKEVDbGFzc2lmaWVyKSBlQ2xhc3NpZmllcnMKLQkJCQkJCQkJLmdldChpKTsKLQkJCQkJCWlmIChuYW1lLmVxdWFscyhlQ2xhc3NpZmllci5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJcmV0dXJuIGVDbGFzc2lmaWVyOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9Ci0KLQkJCQlyZXR1cm4gdHlwZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgTWlncmF0b3IoKSB7Ci0JCXRoaXMoTlNfVVJJcywgRUNPUkUyWE1MX1VSSXMpOwotCX0KLQotCXB1YmxpYyBNaWdyYXRvcihTdHJpbmdbXSBuc1VSSXMsIFVSSVtdIGVjb3JlMlhNTFVSSXMpIHsKLQkJaW50IHNpemUgPSBlY29yZTJYTUxVUklzLmxlbmd0aDsKLQkJZXh0ZW5kZWRNZXRhRGF0YXMgPSBuZXcgRXh0ZW5kZWRNZXRhRGF0YVtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlY29yZTJYTUxVUklzLmxlbmd0aDsgaSsrKSB7Ci0JCQlleHRlbmRlZE1ldGFEYXRhc1tpXSA9IGdldEV4dGVuZGVkTWV0YURhdGEobnNVUklzW2ldLAotCQkJCQllY29yZTJYTUxVUklzW2ldKTsKLQkJfQotCQl0aGlzLnJlc291cmNlSGFuZGxlciA9IG5ldyBVTUEyVU1BUmVzb3VyY2VIYW5kbGVyMCgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlU3RhdHVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgU3RyaW5nIG1zZykgewotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQltb25pdG9yLnNldFRhc2tOYW1lKG1zZyk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEFueVR5cGVGZWF0dXJlVmFsdWUgewotCQlTdHJpbmcgb3duZXJJZDsKLQotCQlFT2JqZWN0IG93bmVyOwotCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JCVN0cmluZyB2YWx1ZUlkOwotCi0JCUFueVR5cGUgdmFsdWU7Ci0KLQkJaW50IGluZGV4OwotCX0KLQotCWNsYXNzIE1pZ3JhdG9yVVJJQ29udmVydGVyIGV4dGVuZHMgTXVsdGlGaWxlVVJJQ29udmVydGVyIHsKLQkJcHJpdmF0ZSBSZXNvdXJjZU1hbmFnZXIgb2xkUmVzTWdyOwotCi0JCS8qKgotCQkgKiBAcGFyYW0gcmVzb3VyY2VTZXQKLQkJICovCi0JCXB1YmxpYyBNaWdyYXRvclVSSUNvbnZlcnRlcihNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQpIHsKLQkJCXN1cGVyKHJlc291cmNlU2V0KTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS51bWEucGVyc2lzdGVuY2UuTXVsdGlGaWxlVVJJQ29udmVydGVyI25vcm1hbGl6ZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCQkgKi8KLQkJcHVibGljIFVSSSBub3JtYWxpemUoVVJJIHVyaSkgewotCQkJVVJJIG5vcm1hbGl6ZWQgPSBzdXBlci5ub3JtYWxpemUodXJpKTsKLQkJCWlmIChub3JtYWxpemVkID09IG51bGwgJiYgU0NIRU1FLmVxdWFsc0lnbm9yZUNhc2UodXJpLnNjaGVtZSgpKSkgewotCQkJCWlmIChvbGRSZXNNZ3IgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgaWQgPSB1cmkuYXV0aG9yaXR5KCk7Ci0JCQkJCW5vcm1hbGl6ZWQgPSBnZXRVUklGcm9tT2xkUmVzb3VyY2VNYW5hZ2VyKGlkKTsKLQkJCQkJaWYgKG5vcm1hbGl6ZWQgIT0gbnVsbCkgewotCQkJCQkJaWYgKHVyaS5oYXNGcmFnbWVudCgpKSB7Ci0JCQkJCQkJbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQuYXBwZW5kRnJhZ21lbnQodXJpCi0JCQkJCQkJCQkuZnJhZ21lbnQoKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCW5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLmFwcGVuZEZyYWdtZW50KGlkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQkJcmV0dXJuIG5vcm1hbGl6ZWQ7Ci0JCX0KLQotCQlwdWJsaWMgVVJJIGdldFVSSUZyb21PbGRSZXNvdXJjZU1hbmFnZXIoU3RyaW5nIGlkKSB7Ci0JCQlpZiAob2xkUmVzTWdyID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IG9sZFJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3IoaWQpOwotCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCVVSSSBub3JtYWxpemVkID0gZGVzYy5nZXRSZXNvbHZlZFVSSSgpOwotCQkJCVVSSSBuZXdVUkkgPSAoVVJJKSBvbGRQYXRoVG9OZXdVUklNYXAuZ2V0KG5vcm1hbGl6ZWQKLQkJCQkJCS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJaWYgKG5ld1VSSSAhPSBudWxsKSB7Ci0JCQkJCW5vcm1hbGl6ZWQgPSBuZXdVUkk7Ci0JCQkJfQotCQkJCXJldHVybiBub3JtYWxpemVkOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0udW1hLnBlcnNpc3RlbmNlLk11bHRpRmlsZVVSSUNvbnZlcnRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpZiAob2xkUmVzTWdyICE9IG51bGwpIHsKLQkJCQlvbGRSZXNNZ3IuZGlzcG9zZSgpOwotCQkJCW9sZFJlc01nciA9IG51bGw7Ci0JCQl9Ci0KLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gcmVzTWdyMgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0T2xkUmVzb3VyY2VNYW5hZ2VyKFJlc291cmNlTWFuYWdlciByZXNNZ3IpIHsKLQkJCW9sZFJlc01nciA9IHJlc01ncjsKLQkJfQotCi0JCXB1YmxpYyBSZXNvdXJjZU1hbmFnZXIgZ2V0T2xkUmVzb3VyY2VNYW5hZ2VyKCkgewotCQkJcmV0dXJuIG9sZFJlc01ncjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS51bWEucGVyc2lzdGVuY2UuTXVsdGlGaWxlVVJJQ29udmVydGVyI3NldFVSSU1hcHBpbmcob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSwgamF2YS51dGlsLlNldCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFVSSU1hcHBpbmcoRU9iamVjdCBlLCBVUkkgdXJpLCBTZXQgbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJCS8vIGNvZGUgdG8gc3VwcG9ydCBtaWdyYXRpb24gZnJvbSBvbGRlciB2ZXJzaW9uCi0JCQkvLwotCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJTWlncmF0b3JVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyID0gKE1pZ3JhdG9yVVJJQ29udmVydGVyKSAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZQotCQkJCQkJLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpLmdldFVSSUNvbnZlcnRlcigpOwotCQkJCVJlc291cmNlTWFuYWdlciBvbGRSZXNNZ3IgPSB1cmlDb252ZXJ0ZXIKLQkJCQkJCS5nZXRPbGRSZXNvdXJjZU1hbmFnZXIoKTsKLQkJCQlpZiAob2xkUmVzTWdyICE9IG51bGwpIHsKLQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSBvbGRSZXNNZ3IKLQkJCQkJCQkuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKCgoTWV0aG9kRWxlbWVudCkgZSkKLQkJCQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCQlvbGRQYXRoVG9OZXdVUklNYXAucHV0KGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKQotCQkJCQkJCQkudG9GaWxlU3RyaW5nKCksIHVyaSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXN1cGVyLnNldFVSSU1hcHBpbmcoZSwgdXJpLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBNaWdyYXRvclJlc291cmNlU2V0IGV4dGVuZHMgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLnVtYS5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGwjZ2V0VVJJQ29udmVydGVyKCkKLQkJICovCi0JCXB1YmxpYyBVUklDb252ZXJ0ZXIgZ2V0VVJJQ29udmVydGVyKCkgewotCQkJaWYgKHVyaUNvbnZlcnRlciA9PSBudWxsKSB7Ci0JCQkJdXJpQ29udmVydGVyID0gbmV3IE1pZ3JhdG9yVVJJQ29udmVydGVyKHRoaXMpOwotCQkJfQotCQkJcmV0dXJuIHVyaUNvbnZlcnRlcjsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBsb2FkT2xkUmVzb3VyY2VNYW5hZ2VyKFN0cmluZyBsaWJQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJLy8gdHJ5aW5nIHRvIGxvYWQgdGhlIHJlc291cmNlIGRlc2NyaXB0b3JzIGZpbGUKLQkJCS8vCi0JCQlTdHJpbmcgbGliRGlyID0gbmV3IEZpbGUobGliUGF0aCkuZ2V0UGFyZW50KCkgKyBGaWxlLnNlcGFyYXRvcjsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGxpYkRpciwgUkVTTUdSX1hNSSk7Ci0JCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gbnVsbDsKLQkJCU11bHRpRmlsZVVSSUNvbnZlcnRlciBtdWx0aUZpbGVVUklDb252ZXJ0ZXIgPSAoTXVsdGlGaWxlVVJJQ29udmVydGVyKSBnZXRVUklDb252ZXJ0ZXIoKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJUmVzb3VyY2UgcmVzTWdyUmVzID0gbmV3IFhNSVJlc291cmNlSW1wbChVUkkuY3JlYXRlRmlsZVVSSShmaWxlCi0JCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpKTsgLy8gc3VwZXIuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZUZpbGVVUkkoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksCi0JCQkJLy8gdHJ1ZSk7Ci0JCQkJcmVzTWdyUmVzLmxvYWQobnVsbCk7Ci0JCQkJaWYgKCFyZXNNZ3JSZXMuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCQkJT2JqZWN0IG9iaiA9IHJlc01nclJlcy5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJlc291cmNlTWFuYWdlcikgewotCQkJCQkJcmVzTWdyID0gKFJlc291cmNlTWFuYWdlcikgb2JqOwotCQkJCQkJLy8gcmVzTWdyLnJlc29sdmUoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN5c3RlbS5lcnIKLQkJCQkJCQkJLnByaW50bG4oIkludmFsaWQgUmVzb3VyY2VNYW5hZ2VyIGZpbGU6ICIgKyBmaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJKChNaWdyYXRvclVSSUNvbnZlcnRlcikgbXVsdGlGaWxlVVJJQ29udmVydGVyKQotCQkJCQkuc2V0T2xkUmVzb3VyY2VNYW5hZ2VyKHJlc01ncik7Ci0JCX0KLQotCQlwdWJsaWMgTWV0aG9kTGlicmFyeSBsb2FkTGlicmFyeShTdHJpbmcgcGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQlsb2FkT2xkUmVzb3VyY2VNYW5hZ2VyKHBhdGgpOwotCi0JCQlyZXR1cm4gbG9hZExpYnJhcnlXaXRob3V0UmVzZXQocGF0aCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0udW1hLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbCNmaW5kRU9iamVjdEluVW5sb2FkZWRSZXNvdXJjZXMoamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGZpbmRFT2JqZWN0SW5VbmxvYWRlZFJlc291cmNlcyhTdHJpbmcgaWQpIHsKLQkJCU9iamVjdCBvYmplY3QgPSBudWxsOwotCQkJaWYgKGdldFJlc291cmNlTWFuYWdlcigpICE9IG51bGwpIHsKLQkJCQlvYmplY3QgPSBzdXBlci5maW5kRU9iamVjdEluVW5sb2FkZWRSZXNvdXJjZXMoaWQpOwotCQkJfQotCQkJaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0JCQkJVVJJIHVyaSA9ICgoTWlncmF0b3JVUklDb252ZXJ0ZXIpIGdldFVSSUNvbnZlcnRlcigpKQotCQkJCQkJLmdldFVSSUZyb21PbGRSZXNvdXJjZU1hbmFnZXIoaWQpOwotCQkJCVJlc291cmNlIHJlc291cmNlID0gc3VwZXIuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJCQlyZXR1cm4gcmVzb3VyY2UuZ2V0RU9iamVjdChpZCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS51bWEucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsI2dldEVPYmplY3Qob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSwKLQkJICogICAgICBib29sZWFuKQotCQkgKi8KLQkJcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdChVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQkJLy8gRU9iamVjdCBlT2JqID0gc3VwZXJHZXRFT2JqZWN0KHVyaSwgbG9hZE9uRGVtYW5kKTsKLQkJCUVPYmplY3QgZU9iaiA9IHN1cGVyLmdldEVPYmplY3QodXJpLCBsb2FkT25EZW1hbmQpOwotCQkJaWYgKGVPYmogPT0gbnVsbAotCQkJCQkmJiBNaWdyYXRvclVSSUNvbnZlcnRlci5TQ0hFTUUuZXF1YWxzSWdub3JlQ2FzZSh1cmkKLQkJCQkJCQkuc2NoZW1lKCkpICYmICF1cmkuaGFzRnJhZ21lbnQoKSkgewotCQkJCWVPYmogPSBzdXBlci5nZXRFT2JqZWN0KHVyaS5hdXRob3JpdHkoKSk7Ci0JCQl9Ci0JCQkvLyBpZih1cmkuYXV0aG9yaXR5KCkuZXF1YWxzKCJ7MTFCNjBBNEItQTBDNy00RDVDLTg5MUEtMzQ2RTg2NTJBNEVCfSIpKQotCQkJLy8gewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJNaWdyYXRvclJlc291cmNlU2V0LmdldEVPYmplY3QoKTogZU9iaiA9ICIgKwotCQkJLy8gZU9iaik7Ci0JCQkvLyB9Ci0JCQlpZiAoZU9iaiA9PSBudWxsIHx8IGVPYmouZUlzUHJveHkoKSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotCQkJCQkJIkNvdWxkIG5vdCBsb2FkIG9iamVjdCB3aXRoIFVSSSAnIiArIHVyaSArICInIChub3JtYWxpemVkIFVSSTogJyIgKyBnZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUodXJpKSArICInKS5cblBsZWFzZSBzZWUgbG9nIGZpbGUgZm9yIG1vcmUgZGV0YWlscy4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCXJldHVybiBlT2JqOwotCQl9Ci0KLQkJcHVibGljIEVPYmplY3Qgc3VwZXJHZXRFT2JqZWN0KFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7Ci0JCQl0cnkgewotCQkJCVVSSSBub3JtYWxpemVkID0gZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSk7Ci0JCQkJaWYgKG5vcm1hbGl6ZWQgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQkJCXJlc291cmNlID0gZ2V0UmVzb3VyY2Uobm9ybWFsaXplZC50cmltRnJhZ21lbnQoKSwgbG9hZE9uRGVtYW5kKTsKLQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZnJhZ21lbnQgPSBub3JtYWxpemVkLmZyYWdtZW50KCk7Ci0JCQkJCWlmIChmcmFnbWVudCA9PSBudWxsIHx8IGZyYWdtZW50Lmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXJldHVybiBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQkJdHJ5IHsKLQkJCQkJCXJldHVybiByZXNvdXJjZS5nZXRFT2JqZWN0KGZyYWdtZW50KTsKLQkJCQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgZTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCS8vCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS51bWEucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsI2NyZWF0ZVJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JCSAqLwotCQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQkJUmVzb3VyY2UgcmVzdWx0ID0gbmV3IE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCh1cmkpIHsKLQkJCQlwcm90ZWN0ZWQgWE1MSGVscGVyIGNyZWF0ZVhNTEhlbHBlcigpIHsKLQkJCQkJcmV0dXJuIG5ldyBNdWx0aUZpbGVYTUlIZWxwZXJJbXBsKHRoaXMpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHNldFZhbHVlKEVPYmplY3Qgb2JqZWN0LAotCQkJCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLAotCQkJCQkJCQlpbnQgcG9zaXRpb24pIHsKLQkJCQkJCQlib29sZWFuIG9sZCA9IGxvZ0Vycm9yOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWxvZ0Vycm9yID0gZmFsc2U7Ci0JCQkJCQkJCXN1cGVyCi0JCQkJCQkJCQkJLnNldFZhbHVlKG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsCi0JCQkJCQkJCQkJCQlwb3NpdGlvbik7Ci0JCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEFueVR5cGUKLQkJCQkJCQkJCQkmJiBvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCQkJCS8vICYmIG9iamVjdCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Ci0JCQkJCQkJCS8vICYmIGZlYXR1cmUgPT0KLQkJCQkJCQkJLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKQotCQkJCQkJCQkpIHsKLQkJCQkJCQkJCUFueVR5cGVGZWF0dXJlVmFsdWUgZnZhbHVlID0gbmV3IEFueVR5cGVGZWF0dXJlVmFsdWUoKTsKLQkJCQkJCQkJCS8vIGZ2YWx1ZS5vd25lciA9IG9iamVjdDsKLQkJCQkJCQkJCWZ2YWx1ZS5vd25lcklkID0gKChNZXRob2RFbGVtZW50KSBvYmplY3QpCi0JCQkJCQkJCQkJCS5nZXRHdWlkKCk7Ci0JCQkJCQkJCQlmdmFsdWUuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCQkJCQkJCQkvLyBmdmFsdWUudmFsdWUgPSAoQW55VHlwZSkgdmFsdWU7Ci0JCQkJCQkJCQlmdmFsdWUudmFsdWVJZCA9IChTdHJpbmcpIFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIKLQkJCQkJCQkJCQkJLmdldFNpbmdsZVZhbHVlKCgoQW55VHlwZSkgdmFsdWUpCi0JCQkJCQkJCQkJCQkJLmdldEFueUF0dHJpYnV0ZSgpLCAiZ3VpZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQlmdmFsdWUuaW5kZXggPSBwb3NpdGlvbjsKLQkJCQkJCQkJCWFueVR5cGVGZWF0dXJlVmFsdWVzLmFkZChmdmFsdWUpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJdGhyb3cgZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCWxvZ0Vycm9yID0gb2xkOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIExpc3Qgc2V0TWFueVJlZmVyZW5jZSgKLQkJCQkJCQkJb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXIuTWFueVJlZmVyZW5jZSByZWZlcmVuY2UsCi0JCQkJCQkJCVN0cmluZyBsb2NhdGlvbikgewotCQkJCQkJCUxpc3QgZXhjZXB0aW9ucyA9IHN1cGVyLnNldE1hbnlSZWZlcmVuY2UocmVmZXJlbmNlLAotCQkJCQkJCQkJbG9jYXRpb24pOwotCQkJCQkJCWlmIChleGNlcHRpb25zID09IG51bGwpCi0JCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGV4Y2VwdGlvbnMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJT2JqZWN0IGV4ID0gaXRlci5uZXh0KCk7Ci0JCQkJCQkJCWlmIChleCBpbnN0YW5jZW9mIElsbGVnYWxWYWx1ZUV4Y2VwdGlvbikgewotCQkJCQkJCQkJSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGl2ZSA9IChJbGxlZ2FsVmFsdWVFeGNlcHRpb24pIGV4OwotCQkJCQkJCQkJaWYgKGl2ZS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQW55VHlwZQotCQkJCQkJCQkJCQkmJiBpdmUuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQkJCQkJQW55VHlwZUZlYXR1cmVWYWx1ZSBmdmFsdWUgPSBuZXcgQW55VHlwZUZlYXR1cmVWYWx1ZSgpOwotCQkJCQkJCQkJCWZ2YWx1ZS5vd25lcklkID0gKChNZXRob2RFbGVtZW50KSBpdmUKLQkJCQkJCQkJCQkJCS5nZXRPYmplY3QoKSkuZ2V0R3VpZCgpOwotCQkJCQkJCQkJCWZ2YWx1ZS5mZWF0dXJlID0gaXZlLmdldEZlYXR1cmUoKTsKLQkJCQkJCQkJCQlmdmFsdWUudmFsdWVJZCA9IChTdHJpbmcpIFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIKLQkJCQkJCQkJCQkJCS5nZXRTaW5nbGVWYWx1ZSgoKEFueVR5cGUpIGl2ZQotCQkJCQkJCQkJCQkJCQkuZ2V0VmFsdWUoKSkKLQkJCQkJCQkJCQkJCQkJLmdldEFueUF0dHJpYnV0ZSgpLAotCQkJCQkJCQkJCQkJCQkiZ3VpZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJZnZhbHVlLmluZGV4ID0gLTE7Ci0JCQkJCQkJCQkJYW55VHlwZUZlYXR1cmVWYWx1ZXMuYWRkKGZ2YWx1ZSk7Ci0JCQkJCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoZXhjZXB0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBleGNlcHRpb25zOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCX0KLQkJCX07Ci0JCQlyZXN1bHQuc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7Ci0JCQlnZXRSZXNvdXJjZXMoKS5hZGQocmVzdWx0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtaWdyYXRlKFN0cmluZyBsaWJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2V0IGNsYXNzTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotCQljbGFzc05hbWVzLmFkZCgiVGVjaG5pcXVlIik7IC8vJE5PTi1OTFMtMSQKLQotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSBuZXcgTWlncmF0b3JSZXNvdXJjZVNldCgpOwotCQkvLyBSZXNvdXJjZU1hbmFnZXIgb2xkUmVzTWdyID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbmRlZE1ldGFEYXRhcy5sZW5ndGg7IGkrKykgewotCQkJcmVzb3VyY2VTZXQuZ2V0TG9hZE9wdGlvbnMoKS5wdXQoCi0JCQkJCVhNTFJlc291cmNlLk9QVElPTl9SRUNPUkRfVU5LTk9XTl9GRUFUVVJFLCBCb29sZWFuLlRSVUUpOwotCQkJaWYgKGkgPCAyKSB7Ci0JCQkJcmVzb3VyY2VTZXQuZ2V0TG9hZE9wdGlvbnMoKS5wdXQoCi0JCQkJCQlYTUxSZXNvdXJjZS5PUFRJT05fUkVTT1VSQ0VfSEFORExFUiwgcmVzb3VyY2VIYW5kbGVyKTsKLQkJCX0KLQkJCXJlc291cmNlU2V0LmdldExvYWRPcHRpb25zKCkKLQkJCQkJLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLAotCQkJCQkJCWV4dGVuZGVkTWV0YURhdGFzW2ldKTsKLQotCQkJaWYgKGkgPT0gMCkgewotCQkJCXJlc291cmNlSGFuZGxlci5zYXZlUHJlc2VudGF0aW9uVVJJRm9yKGNsYXNzTmFtZXMpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXNvdXJjZUhhbmRsZXIuc2F2ZVByZXNlbnRhdGlvblVSSUZvcihudWxsKTsKLQkJCX0KLQotCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLmxvYWRMaWJyYXJ5VGFza19uYW1lKTsKLQotCQkJLy8gaWYob2xkUmVzTWdyICE9IG51bGwpIHsKLQkJCS8vICgoTWlncmF0b3JVUklDb252ZXJ0ZXIpcmVzb3VyY2VTZXQuZ2V0VVJJQ29udmVydGVyKCkpLnNldE9sZFJlc291cmNlTWFuYWdlcihvbGRSZXNNZ3IpOwotCQkJLy8gcmVzb3VyY2VTZXQubG9hZExpYnJhcnlXaXRob3V0UmVzZXQobGliUGF0aCk7Ci0JCQkvLyB9Ci0JCQkvLyBlbHNlIHsKLQkJCXJlc291cmNlU2V0LmxvYWRMaWJyYXJ5KGxpYlBhdGgpOwotCQkJLy8gfQotCi0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IHJlc291cmNlU2V0LmdldE1ldGhvZExpYnJhcnkoKTsKLQkJCWlmIChsaWIgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCS8vIGxvYWQgYWxsIHRoZSByZXNvdXJjZXMgaW4gbWVtb3J5Ci0JCQkvLwotCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLmxvYWRSZXNvdXJjZXNUYXNrX25hbWUpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEd1aWRlbGluZSAmJiBpID4gMCkgewotCQkJCQkvLyBoYWNrIHRvIHJlc3RvcmUgdGhlIHJpZ2h0IHByZXNlbnRhdGlvbiBmb3Igb2xkIFRlY2huaXF1ZQotCQkJCQkvLwotCQkJCQlHdWlkZWxpbmUgZ3VpZGVsaW5lID0gKEd1aWRlbGluZSkgZWxlbWVudDsKLQkJCQkJVVJJIHVyaSA9IHJlc291cmNlSGFuZGxlci5nZXRQcmVzZW50YXRpb25VUkkoZ3VpZGVsaW5lCi0JCQkJCQkJLmdldEd1aWQoKSk7Ci0JCQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCQkJQ29udGVudERlc2NyaXB0aW9uIHByZXNlbnRhdGlvbiA9IChDb250ZW50RGVzY3JpcHRpb24pIHJlc291cmNlU2V0Ci0JCQkJCQkJCS5nZXRFT2JqZWN0KHVyaSwgdHJ1ZSk7Ci0JCQkJCQlndWlkZWxpbmUuc2V0UHJlc2VudGF0aW9uKHByZXNlbnRhdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudC5lQ3Jvc3NSZWZlcmVuY2VzKCkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJU3lzdGVtLmVycgotCQkJCQkJCQkucHJpbnRsbigiRXJyb3IgaXRlcmF0ZSB0aHJ1IGNyb3NzIHJlZmVyZW5jZXMgb2YgZWxlbWVudDogIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChpID09IDApIHsKLQkJCQkvLyBvbGRSZXNNZ3IgPQotCQkJCS8vICgoTWlncmF0b3JVUklDb252ZXJ0ZXIpcmVzb3VyY2VTZXQuZ2V0VVJJQ29udmVydGVyKCkpLmdldE9sZFJlc291cmNlTWFuYWdlcigpOwotCi0JCQkJbWlncmF0ZVByb2Nlc3NDb250ZW50RGVzY3JpcHRpb25zKG1vbml0b3IsIGxpYik7Ci0KLQkJCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMubW92ZURhdGFUYXNrX25hbWUpOwotCi0JCQl9Ci0KLQkJCWlmIChpIDwgMikgewotCQkJCXJlc291cmNlSGFuZGxlci5tb3ZlRGF0YSgpOwotCQkJCXJlc291cmNlSGFuZGxlci5jbGVhck1vdmVJbmZvcygpOwotCQkJfQotCi0JCQlpZiAoaSA9PSBleHRlbmRlZE1ldGFEYXRhcy5sZW5ndGggLSAxKSB7Ci0JCQkJbWlncmF0ZVByb2Nlc3Nlcyhtb25pdG9yLCBsaWIpOwotCi0JCQkJcmVzdG9yZVJlZmVyZW5jZXMocmVzb3VyY2VTZXQpOwotCi0JCQl9Ci0KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5zYXZlTGlicmFyeVRhc2tfbmFtZSk7Ci0KLQkJCXJlc291cmNlU2V0LnNhdmUobnVsbCwgdHJ1ZSk7Ci0JCQlyZXNvdXJjZVNldC5yZXNldCgpOwotCi0JCX0KLQotCQkvLyBkZWxldGUgb2xkIHJlc21nci54bWkKLQkJLy8KLQkJdHJ5IHsKLQkJCUZpbGUgcmVzTWdyRmlsZSA9IG5ldyBGaWxlKG5ldyBGaWxlKGxpYlBhdGgpLmdldFBhcmVudEZpbGUoKSwKLQkJCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLlJFU01HUl9YTUkpOwotCQkJaWYgKHJlc01nckZpbGUuZXhpc3RzKCkpIHsKLQkJCQlyZXNNZ3JGaWxlLmRlbGV0ZSgpOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc3RvcmVSZWZlcmVuY2VzKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbnlUeXBlRmVhdHVyZVZhbHVlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFueVR5cGVGZWF0dXJlVmFsdWUgZWxlbWVudCA9IChBbnlUeXBlRmVhdHVyZVZhbHVlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50Lm93bmVySWQgIT0gbnVsbCAmJiBlbGVtZW50LnZhbHVlSWQgIT0gbnVsbCkgewotCQkJCUVPYmplY3Qgb3duZXIgPSByZXNvdXJjZVNldC5nZXRFT2JqZWN0KGVsZW1lbnQub3duZXJJZCk7Ci0JCQkJT2JqZWN0IHZhbHVlID0gcmVzb3VyY2VTZXQuZ2V0RU9iamVjdChlbGVtZW50LnZhbHVlSWQpOwotCQkJCVVNQTJVTUFSZXNvdXJjZUhhbmRsZXIuc2V0VmFsdWUob3duZXIsIGVsZW1lbnQuZmVhdHVyZSwgdmFsdWUpOwotCQkJfQotCQl9Ci0JCWFueVR5cGVGZWF0dXJlVmFsdWVzLmNsZWFyKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBtaWdyYXRlUHJvY2Vzc2VzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCU1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5maXhQcmVzZW50YXRpb25OYW1lVGFza19uYW1lKTsKLQotCQlTdHJpbmdbXVtdIHByb2NQa2dQYXRocyA9IE11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5QUk9DRVNTX1BBQ0tBR0VfUEFUSFM7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5nZXRNZXRob2RQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlBcnJheUxpc3QgcHJvY1BrZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHByb2NQa2dQYXRocy5sZW5ndGg7IGorKykgewotCQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJCQlwcm9jUGtnUGF0aHNbal0pOwotCQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCQlwcm9jUGtncy5hZGQocGtnKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJvY1BrZ3MuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IxID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcjEKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3QgY2hpbGRQa2cgPSAoRU9iamVjdCkgaXRlcmF0b3IxLm5leHQoKTsKLQkJCQkJaWYgKGNoaWxkUGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIGNoaWxkUGtnKQotCQkJCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJCQkJaWYgKHByb2MgIT0gbnVsbCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWZpeFByZXNlbnRhdGlvbk5hbWUocHJvYyk7Ci0JCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCXRocm93IGU7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlTdHJpbmcgbXNnID0gTWlncmF0b3IuY2xhc3MuZ2V0TmFtZSgpCi0JCQkJCQkJCQkrICI6IGludmFsaWQgUHJvY2Vzc0NvbXBvbmVudCAod2l0aCBubyBQcm9jZXNzKTogIiArIGNoaWxkUGtnIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSsgIlxuICBQcm9jZXNzQ29tcG9uZW50J3MgcmVzb3VyY2UgVVJJOiAiICsgKGNoaWxkUGtnLmVSZXNvdXJjZSgpICE9IG51bGwgPyBjaGlsZFBrZy5lUmVzb3VyY2UoKS5nZXRVUkkoKSA6IG51bGwpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSsgIlxuICBQYXJlbnQgcGFja2FnZTogIiArIHBrZyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkrICJcbiAgUGFyZW50IHBhY2thZ2UncyByZXNvdXJjZSBVUkk6ICIgKyAocGtnLmVSZXNvdXJjZSgpICE9IG51bGwgPyBwa2cuZVJlc291cmNlKCkuZ2V0VVJJKCkgOiBudWxsKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJOwotCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2cobXNnKTsKLQkJCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgbWlncmF0ZVByb2Nlc3NDb250ZW50RGVzY3JpcHRpb25zKAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBNZXRob2RMaWJyYXJ5IGxpYikgewotCQl1cGRhdGVTdGF0dXMobW9uaXRvciwKLQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5taWdyYXRlQ29udGVudERlc2NyaXB0aW9uc1Rhc2tfbmFtZSk7Ci0KLQkJU3RyaW5nW11bXSBwcm9jUGtnUGF0aHMgPSBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuUFJPQ0VTU19QQUNLQUdFX1BBVEhTOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZ2V0TWV0aG9kUGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJQXJyYXlMaXN0IHByb2NQa2dzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcm9jUGtnUGF0aHMubGVuZ3RoOyBqKyspIHsKLQkJCQlNZXRob2RQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCQkJcHJvY1BrZ1BhdGhzW2pdKTsKLQkJCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCQkJcHJvY1BrZ3MuYWRkKHBrZyk7Ci0JCQkJfQotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHByb2NQa2dzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMSA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IxCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgY2hpbGRQa2cgPSAoT2JqZWN0KSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCQlpZiAoY2hpbGRQa2cgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgY2hpbGRQa2cpCi0JCQkJCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkJCQltaWdyYXRlQ29udGVudERlc2NyaXB0aW9uKHByb2MpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBtaWdyYXRlQ29udGVudERlc2NyaXB0aW9uKEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlpZiAoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24oZSkpIHsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gZS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCUVDbGFzcyBlQ2xzID0gQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uRUNsYXNzKGUpOwotCQkJaWYgKGVDbHMgIT0gY29udGVudCkgewotCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBuZXdDb250ZW50ID0gQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotCQkJCQkJLmNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbihlKTsKLQkJCQluZXdDb250ZW50LnNldE1haW5EZXNjcmlwdGlvbihjb250ZW50LmdldE1haW5EZXNjcmlwdGlvbigpKTsKLQkJCQluZXdDb250ZW50LnNldEtleUNvbnNpZGVyYXRpb25zKGNvbnRlbnQuZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKSk7Ci0JCQkJbmV3Q29udGVudC5nZXRTZWN0aW9ucygpLmFkZEFsbChjb250ZW50LmdldFNlY3Rpb25zKCkpOwotCQkJCWUuc2V0UHJlc2VudGF0aW9uKG5ld0NvbnRlbnQpOwotCQkJfQotCQl9Ci0JCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQWN0aXZpdHkpIGUpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCW1pZ3JhdGVDb250ZW50RGVzY3JpcHRpb24oKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZml4UHJlc2VudGF0aW9uTmFtZShCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJaWYgKGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpID09IG51bGwKLQkJCQl8fCBlLmdldFByZXNlbnRhdGlvbk5hbWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZS5zZXRQcmVzZW50YXRpb25OYW1lKGUuZ2V0TmFtZSgpKTsKLQkJfQotCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKEFjdGl2aXR5KSBlKS5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlmaXhQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL2ludGVybmFsL1VNQTJVTUFSZXNvdXJjZUhhbmRsZXIwLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9pbnRlcm5hbC9VTUEyVU1BUmVzb3VyY2VIYW5kbGVyMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTIzMTViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL2ludGVybmFsL1VNQTJVTUFSZXNvdXJjZUhhbmRsZXIwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5BbnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VTUEyVU1BUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVU1BMlVNQVJlc291cmNlSGFuZGxlcjAgZXh0ZW5kcyBVTUEyVU1BUmVzb3VyY2VIYW5kbGVyIHsKLQotCXByaXZhdGUgU2V0IHByb2NNb3ZlZEZlYXR1cmVOYW1lczsKLQotCXByaXZhdGUgTWFwIGd1aWRUb1ByZXNlbnRhdGlvbk1hcDsKLQotCXByaXZhdGUgU2V0IGNsYXNzTmFtZXNUb1NhdmVQcmVzZW50YXRpb25VUkk7Ci0KLQlwdWJsaWMgVU1BMlVNQVJlc291cmNlSGFuZGxlcjAoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJZ3VpZFRvUHJlc2VudGF0aW9uTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlwcm9jTW92ZWRGZWF0dXJlTmFtZXMgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7Ci0JCQkJInB1cnBvc2UiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJrZXlDb25zaWRlcmF0aW9ucyIgLy8kTk9OLU5MUy0xJAotCQkJCSwgImFsdGVybmF0aXZlcyIgLy8kTk9OLU5MUy0xJAotCQkJCSwgImhvd3RvU3RhZmYiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJ1c2FnZUd1aWRhbmNlIiAvLyROT04tTkxTLTEkCi0JCQkJLCAiZXh0ZXJuYWxJZCIgLy8kTk9OLU5MUy0xJAotCQkJCSwgInNjb3BlIiAvLyROT04tTkxTLTEkCi0JCQkJLCAidXNhZ2VOb3RlcyIgLy8kTk9OLU5MUy0xJAotCQkJCSwgInNjYWxlIiAvLyROT04tTkxTLTEkCi0JCQkJLCAicHJvamVjdENoYXJhY3RlcmlzdGljcyIgLy8kTk9OLU5MUy0xJAotCQkJCSwgInJpc2tMZXZlbCIgLy8kTk9OLU5MUy0xJAotCQkJCSwgImVzdGltYXRpbmdUZWNobmlxdWUiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIiAvLyROT04tTkxTLTEkCi0JCQkJLCAidHlwZU9mQ29udHJhY3QiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJ0ZWNobmlxdWVzIiAvLyROT04tTkxTLTEkCi0JCQkJLCAibWFpbkRlc2NyaXB0aW9uIiAvLyROT04tTkxTLTEkCi0JCX0pKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uVU1BMlVNQVJlc291cmNlSGFuZGxlciNnZXROZXdGZWF0dXJlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE5ld0ZlYXR1cmUoRU9iamVjdCBvd25lciwgU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCWlmICgicHJlc2VudGF0aW9uTmFtZSIuZXF1YWxzKGZlYXR1cmVOYW1lKSAmJiBvd25lciBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpOwotCQl9Ci0JCWlmIChwcm9jTW92ZWRGZWF0dXJlTmFtZXMuY29udGFpbnMoZmVhdHVyZU5hbWUpKSB7Ci0JCQlpZiAob3duZXIgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCkgewotCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKChQcm9jZXNzRWxlbWVudCkgb3duZXIpCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQkJRUF0dHJpYnV0ZSBhdHRyaWIgPSBnZXRFQXR0cmlidXRlKGNvbnRlbnQuZUNsYXNzKCksIGZlYXR1cmVOYW1lKTsKLQkJCQlpZiAoYXR0cmliICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGF0dHJpYjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCJXb3JrT3JkZXIiLmVxdWFscyhmZWF0dXJlTmFtZSkgJiYgb3duZXIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnRzKCk7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0TmV3RmVhdHVyZShvd25lciwgZmVhdHVyZU5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VTUEyVU1BUmVzb3VyY2VIYW5kbGVyI2dldE5ld093bmVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXROZXdPd25lcihFT2JqZWN0IG9sZE93bmVyLCBTdHJpbmcgZmVhdHVyZU5hbWUpIHsKLQkJaWYgKCJwcmVzZW50YXRpb25OYW1lIi5lcXVhbHMoZmVhdHVyZU5hbWUpICYmIG9sZE93bmVyIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7IC8vJE5PTi1OTFMtMSQKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBkZSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBvbGRPd25lci5lQ29udGFpbmVyKCkpOwotCQkJaWYgKGRlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBkZTsKLQkJfQotCQlpZiAocHJvY01vdmVkRmVhdHVyZU5hbWVzLmNvbnRhaW5zKGZlYXR1cmVOYW1lKQotCQkJCSYmIG9sZE93bmVyIGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQpIHsKLQkJCXJldHVybiAoKFByb2Nlc3NFbGVtZW50KSBvbGRPd25lcikuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCX0KLQkJaWYgKCJXb3JrT3JkZXIiLmVxdWFscyhmZWF0dXJlTmFtZSkgJiYgb2xkT3duZXIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gb2xkT3duZXI7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0TmV3T3duZXIob2xkT3duZXIsIGZlYXR1cmVOYW1lKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VTUEyVU1BUmVzb3VyY2VIYW5kbGVyI2dldE5ld1ZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQW55VHlwZSkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE5ld1ZhbHVlKEVPYmplY3Qgb2xkT3duZXIsIFN0cmluZyBmZWF0dXJlTmFtZSwgQW55VHlwZSB2YWx1ZSkgewotCQlpZiAoIldvcmtPcmRlciIuZXF1YWxzKGZlYXR1cmVOYW1lKSAmJiBvbGRPd25lciBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVdvcmtPcmRlciB3b3JrT3JkZXIgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrT3JkZXIoKTsKLQkJCXdvcmtPcmRlci5zZXRHdWlkKChTdHJpbmcpIGdldFNpbmdsZVZhbHVlKHZhbHVlLmdldEFueUF0dHJpYnV0ZSgpLAotCQkJCQkiZ3VpZCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHByZWRHdWlkID0gKFN0cmluZykgZ2V0U2luZ2xlVmFsdWUodmFsdWUuZ2V0QW55QXR0cmlidXRlKCksCi0JCQkJCSJwcmVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChwcmVkR3VpZCA9PSBudWxsKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG9iaiA9IChJbnRlcm5hbEVPYmplY3QpIGdldFNpbmdsZVZhbHVlKHZhbHVlCi0JCQkJCQkuZ2V0TWl4ZWQoKSwgInByZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXByZWRHdWlkID0gb2JqLmVQcm94eVVSSSgpLmF1dGhvcml0eSgpOwotCQkJfQotCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgb2xkT3duZXIKLQkJCQkJLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSByZXNvdXJjZVNldAotCQkJCQkuZ2V0RU9iamVjdChwcmVkR3VpZCk7Ci0JCQl3b3JrT3JkZXIuc2V0UHJlZChwcmVkKTsKLQkJCXdvcmtPcmRlci5zZXRMaW5rVHlwZShXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0gpOwotCQkJcmV0dXJuIHdvcmtPcmRlcjsKLQkJfQotCQlyZXR1cm4gZ2V0VGV4dCh2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZVByZXNlbnRhdGlvblVSSUZvcihTZXQgY2xhc3NOYW1lcykgewotCQljbGFzc05hbWVzVG9TYXZlUHJlc2VudGF0aW9uVVJJID0gY2xhc3NOYW1lczsKLQl9Ci0KLQlwdWJsaWMgVVJJIGdldFByZXNlbnRhdGlvblVSSShTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gKFVSSSkgZ3VpZFRvUHJlc2VudGF0aW9uTWFwLmdldChndWlkKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5NaWdyYXRpb25SZXNvdXJjZUhhbmRsZXIjaGFuZGxlVW5rbm93bkRhdGEob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlVW5rbm93bkRhdGEoRU9iamVjdCBlLCBBbnlUeXBlIHVua25vd25EYXRhKSB7Ci0JCXN1cGVyLmhhbmRsZVVua25vd25EYXRhKGUsIHVua25vd25EYXRhKTsKLQkJCi0JCWlmIChjbGFzc05hbWVzVG9TYXZlUHJlc2VudGF0aW9uVVJJICE9IG51bGwKLQkJCQkmJiBlIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFZhbHVlKHVua25vd25EYXRhLmdldE1peGVkKCksICJjb250ZW50RWxlbWVudHMiKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsgLy8kTk9OLU5MUy0xJAotCQkJCUFueVR5cGUgdmFsdWUgPSAoQW55VHlwZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwKLQkJCQkJCSYmIGNsYXNzTmFtZXNUb1NhdmVQcmVzZW50YXRpb25VUkkuY29udGFpbnModmFsdWUKLQkJCQkJCQkJLmVDbGFzcygpLmdldE5hbWUoKSkpIHsKLQkJCQkJT2JqZWN0IHByZXNlbnRhdGlvbiA9IGdldFNpbmdsZVZhbHVlKHZhbHVlLmdldE1peGVkKCksCi0JCQkJCQkJInByZXNlbnRhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChwcmVzZW50YXRpb24gIT0gbnVsbCkgewotCQkJCQkJT2JqZWN0IGd1aWQgPSBnZXRTaW5nbGVWYWx1ZSh2YWx1ZS5nZXRBbnlBdHRyaWJ1dGUoKSwKLQkJCQkJCQkJImd1aWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJVVJJIHVyaSA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcmVzZW50YXRpb24pLmVQcm94eVVSSSgpOwotCQkJCQkJZ3VpZFRvUHJlc2VudGF0aW9uTWFwLnB1dChndWlkLCB1cmkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9CQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL2ludGVybmFsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL2ludGVybmFsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYzZTAxYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtbnRhdGlvbiBmb3IgdXBncmFkaW5nIGEgbWV0aG9kIGxpYnJhcnkgdG8gYSBuZXdlciBVTUEgdmVyc2lvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZjA2ZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHVwZ3JhZGluZyBhIG1ldGhvZCBsaWJyYXJ5IHRvIGEgbmV3ZXIgVU1BIHZlcnNpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZiMDdkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGFuZCBpbXBsZW1lbnRhdGlvbiBmb3IgcGVyc2lzdGluZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9JUmVmcmVzaEV2ZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvSVJlZnJlc2hFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTU2YzhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9JUmVmcmVzaEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi0vKioKLSAqIEluc3RhbmNlIG9mIHRoaXMgY2xhc3MgcHJvdmlkZXMgZGF0YSBhYm91dCBhIHJlZnJlc2ggZXZlbnQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZnJlc2hFdmVudCB7Ci0KLQkvKioKLQkgKiBHZXRzIHJlc291cmNlcyB0aGF0IGhhZCBiZWVuIHJlZnJlc2hlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHJlZnJlc2hlZCByZXNvdXJjZXMKLQkgKi8KLQlDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRSZWZyZXNoZWRSZXNvdXJjZXMoKTsKLQkKLQlDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRVbmxvYWRlZFJlc291cmNlcygpOwotCi0JLyoqCi0JICogR2V0cyBvYmplY3RzIHRoYXQgaGFkIGJlZW4gdW5sb2FkZWQgYW5kIGJlY29tZSBwcm94aWVzIGFmdGVyIHJlZnJlc2gKLQkgKiAKLQkgKiBAcmV0dXJuIHVubG9hZGVkIG9iamVjdHMKLQkgKi8KLQlDb2xsZWN0aW9uPEVPYmplY3Q+IGdldFVubG9hZGVkT2JqZWN0cygpOwotCi0JLyoqCi0JICogR2V0cyBvYmplY3RzIHRoYXQgaGFkIGJlZW4gcmVmcmVzaGVkLgotCSAqIAotCSAqIEByZXR1cm4gcmVmcmVzaGVkIG9iamVjdHMKLQkgKi8KLQlDb2xsZWN0aW9uPEVPYmplY3Q+IGdldFJlZnJlc2hlZE9iamVjdHMoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9JUmVmcmVzaEhhbmRsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9JUmVmcmVzaEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ5YmJiOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvSVJlZnJlc2hIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIEluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2lsbCBiZSBub3RpZnkgYWJvdXQgY2hhbmdlcyBpbiByZXNvdXJjZXMgc28gaXQgY2FuCi0gKiByZWFjdCBhY2NvcmRpbmdseQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZWZyZXNoSGFuZGxlciB7Ci0KLQl2b2lkIHJlZnJlc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL0lSZWZyZXNoTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9JUmVmcmVzaExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MTM0MTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL0lSZWZyZXNoTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoOwotCi0vKioKLSAqIEluc3RhbmNlIG9mIHRoaXMgY2xhc3MsIGlmIGxpc3RlbmluZyB0byByZWZyZXNoIGV2ZW50LCB3aWxsIGdldCBub3RpZmllZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVmcmVzaExpc3RlbmVyIHsKLQotCXZvaWQgbm90aWZ5UmVmcmVzaGVkKElSZWZyZXNoRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvUmVmcmVzaEpvYi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL1JlZnJlc2hKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVhNmUwNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvUmVmcmVzaEpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Xb3Jrc3BhY2VKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuTGlicmFyeVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIEJhY2tncm91bmQgam9iIHRoYXQga2VlcHMgbm90aWZ5aW5nIHJlZnJlc2ggaGFuZGxlcnMgYWJvdXQgY2hhbmdlcyBpbgotICogcmVzb3VyY2VzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZyZXNoSm9iIGV4dGVuZHMgV29ya3NwYWNlSm9iIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBVUERBVEVfREVMQVkgPSAyMDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfUFJFRklYID0gIkVQRiBBdXRvLXJlZnJlc2g6IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBSZXNvdXJjZVNldCByZXNvdXJjZVNldDsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gYWRkZWRSZXNvdXJjZXMgPSBuZXcgVW5pcXVlRUxpc3Q8UmVzb3VyY2U+KCk7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgVW5pcXVlRUxpc3Q8UmVzb3VyY2U+KCk7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgVW5pcXVlRUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiBtb3ZlZFJlc291cmNlcyA9IG5ldyBVbmlxdWVFTGlzdDxSZXNvdXJjZT4oKTsKLQotCXByaXZhdGUgVW5pcXVlRUxpc3Q8UmVzb3VyY2U+IHNhdmVkUmVzb3VyY2VzID0gbmV3IFVuaXF1ZUVMaXN0PFJlc291cmNlPigpOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiBsb2FkZWRCZWZvcmVSZWZyZXNoUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQotCXByaXZhdGUgSVJlZnJlc2hIYW5kbGVyIHJlZnJlc2hIYW5kbGVyOwotCi0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZWQgPSB0cnVlOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPElSZXNvdXJjZT4gYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMgPSBuZXcgVW5pcXVlRUxpc3Q8SVJlc291cmNlPigpOwotCi0JcHJpdmF0ZSBSZWZyZXNoSm9iKCkgewotCQlzdXBlcihQZXJzaXN0ZW5jZVJlc291cmNlcy5yZXNvdXJjZUF1dG9SZWZyZXNoSm9iX25hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBiKSB7Ci0JCWVuYWJsZWQgPSBiOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGVuYWJsZWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc291cmNlU2V0Ci0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2VTZXQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlU2V0KFJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7Ci0JCXRoaXMucmVzb3VyY2VTZXQgPSByZXNvdXJjZVNldDsKLQl9Ci0JCi0JcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgewotCQlyZXR1cm4gcmVzb3VyY2VTZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVmcmVzaEhhbmRsZXIoSVJlZnJlc2hIYW5kbGVyIGhhbmRsZXIpIHsKLQkJcmVmcmVzaEhhbmRsZXIgPSBoYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIEdldHMgZXhpc3RpbmcgcmVzb3VyY2VzIHRoYXQgcmVhcHBlYXIgaW4gd29ya3NwYWNlcwotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkZGVkUmVzb3VyY2VzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldEFkZGVkUmVzb3VyY2VzKCkgewotCQlyZW1vdmVSZXNvdXJjZXMoYWRkZWRSZXNvdXJjZXMsIHNhdmVkUmVzb3VyY2VzKTsKLQkJcmV0dXJuIGFkZGVkUmVzb3VyY2VzOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uPElSZXNvdXJjZT4gZ2V0QWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBhZGRlZFdvcmtzcGFjZVJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNoYW5nZWRSZXNvdXJjZXMuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldENoYW5nZWRSZXNvdXJjZXMoKSB7Ci0JCXJlbW92ZVJlc291cmNlcyhjaGFuZ2VkUmVzb3VyY2VzLCBzYXZlZFJlc291cmNlcyk7Ci0JCXJlbW92ZVJlc291cmNlcyhjaGFuZ2VkUmVzb3VyY2VzLCBsb2FkZWRCZWZvcmVSZWZyZXNoUmVzb3VyY2VzKTsKLQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyA8Y29kZT5yZXNvdXJjZXNUb1JlbW92ZTwvY29kZT4gZnJvbSA8Y29kZT5yZXNvdXJjZXM8L2NvZGU+IGlmCi0JICogdGhlIHJlc291cmNlcyBhcmUgc3luY2hyb25pemVkIHdpdGggdGhlaXIgc3RvcmFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzVG9SZW1vdmUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZVJlc291cmNlcyhDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXMsCi0JCQlDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXNUb1JlbW92ZSkgewotCQlzeW5jaHJvbml6ZWQgKHJlc291cmNlc1RvUmVtb3ZlKSB7Ci0JCQlpZiAoIXJlc291cmNlc1RvUmVtb3ZlLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3I8UmVzb3VyY2U+IGl0ZXIgPSByZXNvdXJjZXNUb1JlbW92ZS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgcmVzb3VyY2UgPSBpdGVyLm5leHQoKTsKLQkJCQkJYm9vbGVhbiBjYW5SZW1vdmUgPSB0cnVlOwotCQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCBtZlJlc291cmNlID0gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlc291cmNlKTsKLQkJCQkJCWNhblJlbW92ZSA9IG1mUmVzb3VyY2UuaXNTeW5jaHJvbml6ZWQoKTsKLQkJCQkJfQotCQkJCQlpZiAoY2FuUmVtb3ZlKSB7Ci0JCQkJCQlpZiAocmVzb3VyY2VzLnJlbW92ZShyZXNvdXJjZSkpIHsKLQkJCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSByZW1vdmVkUmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRSZW1vdmVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gcmVtb3ZlZFJlc291cmNlczsKLQl9Ci0JCi0JLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBtb3ZlZFJlc291cmNlcy4gCi0JICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldE1vdmVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gbW92ZWRSZXNvdXJjZXM7ICAgICAgICAgICAgIAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0JcHVibGljIHZvaWQgcmVzb3VyY2VTYXZlZChSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZihyZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpID09IHJlc291cmNlU2V0KSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHNhdmVkUmVzb3VyY2VzKSB7Ci0JCQkJc2F2ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVsb2FkZWRCZWZvcmVSZWZyZXNoUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOwotCQlyZW1vdmVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCW1vdmVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCXNhdmVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCWxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMuY2xlYXIoKTsKLQkJYWRkZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMuY2xlYXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGdldE1ldGhvZExpYnJhcnkoKSB7Ci0JCWlmKHJlc291cmNlU2V0IGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSB7Ci0JCQlyZXR1cm4gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpcmVzb3VyY2VTZXQpLmdldE1ldGhvZExpYnJhcnkoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2NoZWR1bGVSZWZyZXNoKCkgewkJCi0JCWlmIChnZXRTdGF0ZSgpID09IEpvYi5OT05FKSB7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IGdldE1ldGhvZExpYnJhcnkoKTsKLQkJCWlmKGxpYiAhPSBudWxsKSB7Ci0JCQkJc2V0UnVsZShuZXcgTGlicmFyeVNjaGVkdWxpbmdSdWxlKGxpYikpOwotCQkJCXNjaGVkdWxlKFVQREFURV9ERUxBWSk7Ci0JCQl9Ci0JCX0KLQl9CQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBXb3Jrc3BhY2VKb2IjcnVuSW5Xb3Jrc3BhY2UKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBydW5JbldvcmtzcGFjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHJlZnJlc2hIYW5kbGVyID09IG51bGwpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCVRocm93YWJsZSBlcnJvciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKERFQlVHX1BSRUZJWCArICIgc3RhcnRpbmcgcmVmcmVzaCBqb2IiKTsgLy8kTk9OLU5MUy0xJAotCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCXRyeSB7Ci0JCQkJcmVmcmVzaEhhbmRsZXIucmVmcmVzaChtb25pdG9yKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJZXJyb3IgPSBlOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oREVCVUdfUFJFRklYCi0JCQkJCQkJCSsgIiBmaW5pc2hlZCByZWZyZXNoIGpvYiBpbjogIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoZXJyb3IgIT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEZpbGVNYW5hZ2VyLlBMVUdJTl9JRCwgMCwKLQkJCQkJIlJlZnJlc2ggZXJyb3IiLCBlcnJvcik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2Ijc2hvdWxkUnVuKCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2hvdWxkUnVuKCkgewotCQlyZXR1cm4gc2hvdWxkUmVmcmVzaCgpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRSZWZyZXNoKCkgewotCQlyZXR1cm4gIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpIHx8ICFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKQotCQkJCXx8ICFhZGRlZFJlc291cmNlcy5pc0VtcHR5KCkgfHwgIW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKQotCQkJCXx8ICFsb2FkZWRCZWZvcmVSZWZyZXNoUmVzb3VyY2VzLmlzRW1wdHkoKQotCQkJCXx8ICFhZGRlZFdvcmtzcGFjZVJlc291cmNlcy5pc0VtcHR5KCk7Ci0JfQotCi0JLyoqCi0JICogU3RhcnRzIHRoZSByZWZyZXNoIGpvYgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVmcmVzaEpvYi5zdGFydCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wcyB0aGUgcmVmcmVzaCBqb2IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVmcmVzaEpvYi5zdG9wKCkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQljYW5jZWwoKTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSVJlc291cmNlIHdzUmVzKSB7Ci0JCWlmKHJlc291cmNlU2V0IGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSB7Ci0JCQlyZXR1cm4gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpcmVzb3VyY2VTZXQpLmdldFJlc291cmNlKHdzUmVzKTsKLQkJfQotCQlJUGF0aCBwYXRoID0gd3NSZXMuZ2V0TG9jYXRpb24oKTsKLQkJcmV0dXJuIHBhdGggIT0gbnVsbCA/IFBlcnNpc3RlbmNlVXRpbC5nZXRSZXNvdXJjZShwYXRoLCByZXNvdXJjZVNldCkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gcmVzb3VyY2UgY2FuIGJlIGFjY2VwdGVkIGFzIGEgbmV3IHJlc291cmNlIG9mCi0JICogcmVzb3VyY2Ugc2V0IG9mIHRoaXMgcmVmcmVzaCBqb2IgdGhhdCBuZWVkcyB0byBiZSBsb2FkZWQuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBhY2NlcHQoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZVNldCBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgewotCQkJcmV0dXJuICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSByZXNvdXJjZVNldCkKLQkJCQkJLmlzTmV3UmVzb3VyY2VUb0xvYWQocmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCFpc0VuYWJsZWQoKSB8fCByZXNvdXJjZVNldCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCWlmIChkZWx0YSA9PSBudWxsKQotCQkJcmV0dXJuOwkJCi0JCXRyeSB7Ci0JCQljbGFzcyBSZXNvdXJjZURlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JCQkJcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQotCQkJCXByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCQkJCi0JCQkJcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiBtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0KLQkJCQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IGFkZGVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQotCQkJCXByaXZhdGUgQXJyYXlMaXN0PElSZXNvdXJjZT4gYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PElSZXNvdXJjZT4oKTsKLQkJCQkKLQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlSZXNvdXJjZSByZXNvdXJjZTsKLQkJCQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTUFSS0VSUykgIT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUwotCQkJCQkJCSYmIGRlbHRhLmdldFJlc291cmNlKCkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRDoKLQkJCQkJCQkvLyBoYW5kbGUgYWRkZWQgcmVzb3VyY2UKLQkJCQkJCQkvLwotCQkJCQkJCXJlc291cmNlID0gZ2V0UmVzb3VyY2UoZGVsdGEuZ2V0UmVzb3VyY2UoKSk7Ci0JCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQkJaWYgKCFyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCQkJCQkvLyB0aGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQgYnV0IG5vdAotCQkJCQkJCQkJLy8gbG9hZGVkIGIvYyB0aGUgd29ya3NwYWNlIHJlc291cmNlCi0JCQkJCQkJCQkvLyB3YXMgbm90IGFkZGVkIHRvIHRoZSB3b3Jrc3BhY2UgYXQgdGhlCi0JCQkJCQkJCQkvLyB0aW1lIG9mIGxvYWRpbmcKLQkJCQkJCQkJCS8vCi0JCQkJCQkJCQlNZXRob2RFbGVtZW50IG1lID0gUGVyc2lzdGVuY2VVdGlsCi0JCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCQkJCQkJCQlpZiAoIShtZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikpIHsKLQkJCQkJCQkJCQkvLyBubyBhdXRvLXJlbG9hZCBmb3IgY29udGVudAotCQkJCQkJCQkJCS8vIGRlc2NyaXB0aW9uCi0JCQkJCQkJCQkJLy8gTWV0aG9kRWxlbWVudEVkaXRvciB3aWxsIGRldGVjdAotCQkJCQkJCQkJCS8vIHRoZSBjaGFuZ2UgYW5kIGxvYWQgaXQKLQkJCQkJCQkJCQkvLyB3aGVuIGFjdGl2YXRlZC4KLQkJCQkJCQkJCQkvLwotCQkJCQkJCQkJCWFkZGVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgaWYgKGFjY2VwdChkZWx0YS5nZXRSZXNvdXJjZSgpKSkgewotCQkJCQkJCQlhZGRlZFdvcmtzcGFjZVJlc291cmNlcy5hZGQoZGVsdGEKLQkJCQkJCQkJCQkuZ2V0UmVzb3VyY2UoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCS8vIGhhbmRsZSBmaWxlIG1vdmUKLQkJCQkJCQkvLwotCQkJCQkJCWlmICgoSVJlc291cmNlRGVsdGEuTU9WRURfVE8gJiBkZWx0YS5nZXRGbGFncygpKSAhPSAwKSB7Ci0vLwkJCQkJCQkJcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShkZWx0YS5nZXRSZXNvdXJjZSgpKTsgICAgICAgICAgCi0vLwkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS8vCQkJCQkJCQkJbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsgICAgICAgICAgICAgICAgIAotLy8JCQkJCQkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCQkJCS8vCi0JCQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCQkJSVBhdGggbW92ZWRGcm9tUGF0aCA9IGRlbHRhLmdldFJlc291cmNlKCkKLQkJCQkJCQkJCQkJLmdldExvY2F0aW9uKCk7Ci0JCQkJCQkJCQlJUGF0aCBtb3ZlZFRvUGF0aCA9IGRlbHRhLmdldE1vdmVkVG9QYXRoKCk7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJCS5wcmludGxuKCJSZXNvdXJjZSBtb3ZlZCBmcm9tICciICsgbW92ZWRGcm9tUGF0aCArICInIHRvICciICsgbW92ZWRUb1BhdGggKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJCQl9Ci0KLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQ6Ci0JCQkJCQkJcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCQlyZW1vdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEOgotCQkJCQkJCWJvb2xlYW4gZW5jb2RpbmdDaGFuZ2VkID0gKChJUmVzb3VyY2VEZWx0YS5FTkNPRElORyAmIGRlbHRhCi0JCQkJCQkJCQkuZ2V0RmxhZ3MoKSkgIT0gMCk7Ci0JCQkJCQkJYm9vbGVhbiBjb250ZW50Q2hhbmdlZCA9ICgoSVJlc291cmNlRGVsdGEuQ09OVEVOVCAmIGRlbHRhCi0JCQkJCQkJCQkuZ2V0RmxhZ3MoKSkgIT0gMCk7Ci0JCQkJCQkJaWYgKGVuY29kaW5nQ2hhbmdlZCB8fCBjb250ZW50Q2hhbmdlZCkgewotCQkJCQkJCQlyZXNvdXJjZSA9IGdldFJlc291cmNlKGRlbHRhLmdldFJlc291cmNlKCkpOwotCQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbAotCQkJCQkJCQkJCSYmIE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJCQkJCQkJLmNoZWNrU3luY2hyb25pemVkKHJlc291cmNlKSAhPSAxKSB7Ci0JCQkJCQkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQotCQkJfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotCQkJUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpOwotCQkJZGVsdGEuYWNjZXB0KHZpc2l0b3IpOwotCi0JCQlyZW1vdmVkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLnJlbW92ZWRSZXNvdXJjZXMpOwotCQkJbW92ZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IubW92ZWRSZXNvdXJjZXMpOwotCQkJY2hhbmdlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5jaGFuZ2VkUmVzb3VyY2VzKTsKLQkJCWFkZGVkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmFkZGVkUmVzb3VyY2VzKTsKLQkJCWFkZGVkV29ya3NwYWNlUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmFkZGVkV29ya3NwYWNlUmVzb3VyY2VzKTsKLQotCQkJaWYgKHNob3VsZFJlZnJlc2goKSkgewotCQkJCXNjaGVkdWxlUmVmcmVzaCgpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlcyB0aGUgcHJveHkgYW5kIGl0cyBjb250YWluZXJzCi0JICogCi0JICogQHBhcmFtIHByb3h5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IHJlc29sdmUoRU9iamVjdCBwcm94eSkgewotCQlyZXR1cm4gUGVyc2lzdGVuY2VVdGlsLnJlc29sdmUocHJveHksIHJlc291cmNlU2V0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJlZnJlc2hKb2IgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBSZWZyZXNoSm9iIGluc3RhbmNlID0gbmV3IFJlZnJlc2hKb2IoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9pbnRlcm5hbC9SZWZyZXNoRXZlbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9pbnRlcm5hbC9SZWZyZXNoRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJkZjYxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvaW50ZXJuYWwvUmVmcmVzaEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaEV2ZW50OwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIGNsYXNzIG9mIElSZWZyZXNoRXZlbnQKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZnJlc2hFdmVudCBpbXBsZW1lbnRzIElSZWZyZXNoRXZlbnQgewotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiByZWZyZXNoZWRSZXNvdXJjZXMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IHVubG9hZGVkUmVzb3VyY2VzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248RU9iamVjdD4gdW5sb2FkZWRPYmplY3RzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPEVPYmplY3Q+IHJlZnJlc2hlZE9iamVjdHMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkKLQlwdWJsaWMgUmVmcmVzaEV2ZW50KENvbGxlY3Rpb248UmVzb3VyY2U+IHVubG9hZGVkUmVzb3VyY2VzKSB7Ci0JCXRoaXMudW5sb2FkZWRSZXNvdXJjZXMgPSB1bmxvYWRlZFJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgUmVmcmVzaEV2ZW50KENvbGxlY3Rpb248UmVzb3VyY2U+IHJlZnJlc2hlZFJlc291cmNlcywKLQkJCUNvbGxlY3Rpb248RU9iamVjdD4gdW5sb2FkZWRPYmplY3RzKSB7Ci0JCXRoaXMocmVmcmVzaGVkUmVzb3VyY2VzLCB1bmxvYWRlZE9iamVjdHMsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwotCX0JCi0KLQkvKioKLQkgKiBAcGFyYW0gcmVmcmVzaGVkUmVzb3VyY2VzCi0JICogQHBhcmFtIHVubG9hZGVkT2JqZWN0cwotCSAqIEBwYXJhbSByZWZyZXNoZWRPYmplY3RzCi0JICovCi0JcHVibGljIFJlZnJlc2hFdmVudChDb2xsZWN0aW9uPFJlc291cmNlPiByZWZyZXNoZWRSZXNvdXJjZXMsIENvbGxlY3Rpb248RU9iamVjdD4gdW5sb2FkZWRPYmplY3RzLCBDb2xsZWN0aW9uPEVPYmplY3Q+IHJlZnJlc2hlZE9iamVjdHMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZWZyZXNoZWRSZXNvdXJjZXMgPSByZWZyZXNoZWRSZXNvdXJjZXM7Ci0JCXRoaXMudW5sb2FkZWRPYmplY3RzID0gdW5sb2FkZWRPYmplY3RzOwotCQl0aGlzLnJlZnJlc2hlZE9iamVjdHMgPSByZWZyZXNoZWRPYmplY3RzOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaEV2ZW50I2dldFJlZnJlc2hlZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldFJlZnJlc2hlZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIHJlZnJlc2hlZFJlc291cmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoRXZlbnQjZ2V0VW5sb2FkZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxFT2JqZWN0PiBnZXRVbmxvYWRlZE9iamVjdHMoKSB7Ci0JCXJldHVybiB1bmxvYWRlZE9iamVjdHM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hFdmVudCNnZXRSZWZyZXNoZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxFT2JqZWN0PiBnZXRSZWZyZXNoZWRPYmplY3RzKCkgewotCQlyZXR1cm4gcmVmcmVzaGVkT2JqZWN0czsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0VW5sb2FkZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiB1bmxvYWRlZFJlc291cmNlczsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvaW50ZXJuYWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL2ludGVybmFsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNkN2I0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvaW50ZXJuYWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciBtYW5hZ2luZyBtZXRob2QgbGlicmFyeSByZWZyZXNoZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYjdjNTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciBtYW5hZ2luZyBtZXRob2QgbGlicmFyeSByZWZyZXNoZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL0xpYnJhcnlTY2hlZHVsaW5nUnVsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL0xpYnJhcnlTY2hlZHVsaW5nUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWJhZDcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9MaWJyYXJ5U2NoZWR1bGluZ1J1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5NdWx0aVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIFNjaGVkdWxpbmcgcnVsZSB1c2VkIHRvIGxvY2sgYSBsaWJyYXJ5IGR1cmluZyBhIG9wZXJhdGlvbiBhbmQgZGVmZXIgdGhlCi0gKiBicm9hZGNhc3Rpbmcgb2YgcmVzb3VyY2UgY2hhbmdlIGV2ZW50IHVudGlsIHRoZSBvcGVyYXRpb24gaXMgZmluaXNoZWQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gQXVnIDE1LCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5U2NoZWR1bGluZ1J1bGUgaW1wbGVtZW50cyBJU2NoZWR1bGluZ1J1bGUgewotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsaWJyYXJ5OwotCi0JLyoqCi0JICogQHBhcmFtIGxpYgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5U2NoZWR1bGluZ1J1bGUoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJdGhpcy5saWJyYXJ5ID0gbGliOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlI2NvbnRhaW5zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQlpZiAodGhpcyA9PSBydWxlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAocnVsZSBpbnN0YW5jZW9mIExpYnJhcnlTY2hlZHVsaW5nUnVsZSkgewotCQkJcmV0dXJuICgoTGlicmFyeVNjaGVkdWxpbmdSdWxlKSBydWxlKS5saWJyYXJ5ID09IGxpYnJhcnk7Ci0JCX0KLQkJaWYgKHJ1bGUgaW5zdGFuY2VvZiBNdWx0aVJ1bGUpIHsKLQkJCU11bHRpUnVsZSBtcnVsZSA9IChNdWx0aVJ1bGUpIHJ1bGU7Ci0JCQlJU2NoZWR1bGluZ1J1bGVbXSBjaGlsZFJ1bGVzID0gbXJ1bGUuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGk9MDsgaTxjaGlsZFJ1bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCEgKGNoaWxkUnVsZXNbaV0gaW5zdGFuY2VvZiBJUmVzb3VyY2UpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8vIGFsbG93IGFueSBJUmVzb3VyY2UgcnVsZSB0byBuZXN0IHdpdGhpbiB0aGUgc2FtZSB0aHJlYWQKLQkJLy8KLQkJcmV0dXJuIHJ1bGUgaW5zdGFuY2VvZiBJUmVzb3VyY2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGUjaXNDb25mbGljdGluZyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25mbGljdGluZyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQlyZXR1cm4gZXF1YWxzKHJ1bGUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gdGhpcyA9PSBvYmoKLQkJCQl8fCAob2JqIGluc3RhbmNlb2YgTGlicmFyeVNjaGVkdWxpbmdSdWxlICYmICgoTGlicmFyeVNjaGVkdWxpbmdSdWxlKSBvYmopLmxpYnJhcnkgPT0gbGlicmFyeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGxpYnJhcnkuaGFzaENvZGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGF0dGVybkNvbnN0cnVjdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGF0dGVybkNvbnN0cnVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNDZlNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1BhdHRlcm5Db25zdHJ1Y3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm5TeW50YXhFeGNlcHRpb247Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aXRoIHN0YXRpYyBtZXRob2RzIHRvIGNyZWF0ZSBzZWFyY2ggcGF0dGVybgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGF0dGVybkNvbnN0cnVjdG9yIHsKLQotCXByaXZhdGUgUGF0dGVybkNvbnN0cnVjdG9yKCkgewotCQkvLyBkb24ndCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgUGF0dGVybiBjcmVhdGVQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuLAotCQkJYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIGJvb2xlYW4gaXNSZWdleCkKLQkJCXRocm93cyBQYXR0ZXJuU3ludGF4RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVBhdHRlcm4ocGF0dGVybiwgaXNSZWdleCwgdHJ1ZSwgaXNDYXNlU2Vuc2l0aXZlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHBhdHRlcm4gZWxlbWVudCBmcm9tIHRoZSBwYXR0ZXJuIHN0cmluZyB3aGljaCBpcyBlaXRoZXIgYQotCSAqIHJlZy1leCBleHByZXNzaW9uIG9yIGluIG91ciBvbGQgJ1N0cmluZ01hdGNoZXInIGZvcm1hdC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0dGVybgotCSAqICAgICAgICAgICAgVGhlIHNlYXJjaCBwYXR0ZXJuCi0JICogQHBhcmFtIGlzUmVnZXgKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwYXNzZWQgc3RyaW5nIGFscmVhZHkgaXMgYSByZWctZXgKLQkgKiAgICAgICAgICAgIHBhdHRlcm4KLQkgKiBAcGFyYW0gaXNTdHJpbmdNYXRjaGVyCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGFzc2VkIHN0cmluZyBpcyBpbiB0aGUKLQkgKiAgICAgICAgICAgIFN0cmluZ01hdGNoZXIgZm9ybWF0LgotCSAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUKLQkgKiAgICAgICAgICAgIFNldCB0byA8Y29kZT50cnVlPC9jb2RlPiB0byBjcmVhdGUgYSBjYXNlIGluc2Vuc2l0aXZlCi0JICogICAgICAgICAgICBwYXR0ZXJuCi0JICogQHBhcmFtIGlzV2hvbGVXb3JkCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiB0byBjcmVhdGUgYSBwYXR0ZXJuIHRoYXQgcmVxdWlyZXMgYSB3b3JkCi0JICogICAgICAgICAgICBib3VuZGFyeSBhdCB0aGUgYmVnaW5uaW5nIGFuZCB0aGUgZW5kLgotCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgcGF0dGVybgotCSAqIEB0aHJvd3MgUGF0dGVyblN5bnRheEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGF0dGVybiBjcmVhdGVQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuLCBib29sZWFuIGlzUmVnZXgsCi0JCQlib29sZWFuIGlzU3RyaW5nTWF0Y2hlciwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsCi0JCQlib29sZWFuIGlzV2hvbGVXb3JkKSB0aHJvd3MgUGF0dGVyblN5bnRheEV4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlZ2V4KSB7Ci0JCQlpZiAoaXNXaG9sZVdvcmQpIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihwYXR0ZXJuLmxlbmd0aCgpICsgMTApOwotCQkJCWJ1ZmZlci5hcHBlbmQoIlxcYig/OiIpLmFwcGVuZChwYXR0ZXJuKS5hcHBlbmQoIilcXGIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcGF0dGVybiA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaW50IGxlbiA9IHBhdHRlcm4ubGVuZ3RoKCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4gKyAxMCk7Ci0JCQkvLyBkb24ndCBhZGQgYSB3b3JkIGJvdW5kYXJ5IGlmIHRoZSBzZWFyY2ggdGV4dCBkb2VzIG5vdCBzdGFydCB3aXRoCi0JCQkvLyBhIHdvcmQgY2hhci4gKHRoaXMgd29ya3MgYXJvdW5kIGEgdXNlciBpbnB1dCBlcnJvcikuCi0JCQlpZiAoaXNXaG9sZVdvcmQgJiYgbGVuID4gMCAmJiBpc1dvcmRDaGFyKHBhdHRlcm4uY2hhckF0KDApKSkgewotCQkJCWJ1ZmZlci5hcHBlbmQoIlxcYiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlhcHBlbmRBc1JlZ0V4KGlzU3RyaW5nTWF0Y2hlciwgcGF0dGVybiwgYnVmZmVyKTsKLQkJCWlmIChpc1dob2xlV29yZCAmJiBsZW4gPiAwICYmIGlzV29yZENoYXIocGF0dGVybi5jaGFyQXQobGVuIC0gMSkpKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiXFxiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXBhdHRlcm4gPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi0JCWludCByZWdleE9wdGlvbnMgPSBQYXR0ZXJuLk1VTFRJTElORTsKLQkJaWYgKCFpc0Nhc2VTZW5zaXRpdmUpIHsKLQkJCXJlZ2V4T3B0aW9ucyB8PSBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLlVOSUNPREVfQ0FTRTsKLQkJfQotCQlyZXR1cm4gUGF0dGVybi5jb21waWxlKHBhdHRlcm4sIHJlZ2V4T3B0aW9ucyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1dvcmRDaGFyKGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcGF0dGVybiBlbGVtZW50IGZyb20gYW4gYXJyYXkgb2YgcGF0dGVybnMgaW4gdGhlIG9sZAotCSAqICdTdHJpbmdNYXRjaGVyJyBmb3JtYXQuCi0JICogCi0JICogQHBhcmFtIHBhdHRlcm5zCi0JICogICAgICAgICAgICBUaGUgc2VhcmNoIHBhdHRlcm5zCi0JICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZQotCSAqICAgICAgICAgICAgU2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IHRvIGNyZWF0ZSBhIGNhc2UgaW5zZW5zaXRpdmUKLQkgKiAgICAgICAgICAgIHBhdHRlcm4KLQkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHBhdHRlcm4KLQkgKiBAdGhyb3dzIFBhdHRlcm5TeW50YXhFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBhdHRlcm4gY3JlYXRlUGF0dGVybihTdHJpbmdbXSBwYXR0ZXJucywKLQkJCWJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB0aHJvd3MgUGF0dGVyblN5bnRheEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1ZmZlciBwYXR0ZXJuID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSA+IDApIHsKLQkJCQkvLyBub3RlIHRoYXQgdGhpcyB3b3JrcyBvbmx5IGFzIHdlIGtub3cgdGhhdCB0aGUgb3BlcmFuZHMgb2YgdGhlCi0JCQkJLy8gb3IgZXhwcmVzc2lvbiB3aWxsIGJlIHNpbXBsZSBhbmQgbmVlZCBubyBicmFja2V0cy4KLQkJCQlwYXR0ZXJuLmFwcGVuZCgnfCcpOwotCQkJfQotCQkJYXBwZW5kQXNSZWdFeCh0cnVlLCBwYXR0ZXJuc1tpXSwgcGF0dGVybik7Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZVBhdHRlcm4ocGF0dGVybi50b1N0cmluZygpLCB0cnVlLCB0cnVlLCBpc0Nhc2VTZW5zaXRpdmUsCi0JCQkJZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQnVmZmVyIGFwcGVuZEFzUmVnRXgoYm9vbGVhbiBpc1N0cmluZ01hdGNoZXIsCi0JCQlTdHJpbmcgcGF0dGVybiwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlib29sZWFuIGlzRXNjYXBlZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdHRlcm4ubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjID0gcGF0dGVybi5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCS8vIHRoZSBiYWNrc2xhc2gKLQkJCWNhc2UgJ1xcJzoKLQkJCQkvLyB0aGUgYmFja3NsYXNoIGlzIGVzY2FwZSBjaGFyIGluIHN0cmluZyBtYXRjaGVyCi0JCQkJaWYgKGlzU3RyaW5nTWF0Y2hlciAmJiAhaXNFc2NhcGVkKSB7Ci0JCQkJCWlzRXNjYXBlZCA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFxcXCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlzRXNjYXBlZCA9IGZhbHNlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCS8vIGNoYXJhY3RlcnMgdGhhdCBuZWVkIHRvIGJlIGVzY2FwZWQgaW4gdGhlIHJlZ2V4LgotCQkJY2FzZSAnKCc6Ci0JCQljYXNlICcpJzoKLQkJCWNhc2UgJ3snOgotCQkJY2FzZSAnfSc6Ci0JCQljYXNlICcuJzoKLQkJCWNhc2UgJ1snOgotCQkJY2FzZSAnXSc6Ci0JCQljYXNlICckJzoKLQkJCWNhc2UgJ14nOgotCQkJY2FzZSAnKyc6Ci0JCQljYXNlICd8JzoKLQkJCQlpZiAoaXNFc2NhcGVkKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxcXFwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpc0VzY2FwZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZCgnXFwnKTsKLQkJCQlidWZmZXIuYXBwZW5kKGMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnPyc6Ci0JCQkJaWYgKGlzU3RyaW5nTWF0Y2hlciAmJiAhaXNFc2NhcGVkKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoJy4nKTsKLQkJCQl9IGVsc2UgewotCQkJCQlidWZmZXIuYXBwZW5kKCdcXCcpOwotCQkJCQlidWZmZXIuYXBwZW5kKGMpOwotCQkJCQlpc0VzY2FwZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICcqJzoKLQkJCQlpZiAoaXNTdHJpbmdNYXRjaGVyICYmICFpc0VzY2FwZWQpIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCgiLioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoJ1xcJyk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoYyk7Ci0JCQkJCWlzRXNjYXBlZCA9IGZhbHNlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKGlzRXNjYXBlZCkgewotCQkJCQlidWZmZXIuYXBwZW5kKCJcXFxcIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaXNFc2NhcGVkID0gZmFsc2U7Ci0JCQkJfQotCQkJCWJ1ZmZlci5hcHBlbmQoYyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGlzRXNjYXBlZCkgewotCQkJYnVmZmVyLmFwcGVuZCgiXFxcXCIpOyAvLyROT04tTkxTLTEkCi0JCQlpc0VzY2FwZWQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1BlcnNpc3RlbmNlUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGVyc2lzdGVuY2VSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM4MGFiNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGVyc2lzdGVuY2VSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIE1lc3NhZ2UgYnVuZGxlIGNsYXNzIGZvciBsaWJyYXJ5IHBlcnNpc3RlbmNlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQZXJzaXN0ZW5jZVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBQZXJzaXN0ZW5jZVJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFBlcnNpc3RlbmNlUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5ub3RfY3JlYXRlX2Rpcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkTmFtZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9iak5vdEZvdW5kRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZExpYnJhcnlFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkTGlicmFyeUVycm9yX2RldGFpbHM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZyZXNoTGlicmFyeUZpbGVzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb3VyY2VBdXRvUmVmcmVzaEpvYl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzdG9yZVJlc291cmNlRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZU1hbmFnZXJfZmlsZVJlYWRPbmx5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyTXNnX0NvdWxkTm90RGVsZXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVuYW1lRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFja3VwRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFya2VyX2Vycl9jYW5ub3RSZXNvbHZlUHJveHk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb2RpZnlGaWxlRXJyb3JfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVQYXRoTmFtZVRvb0xvbmdfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZFJlc291cmNlRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZFJlc291cmNlRXJyb3JXaXRoUmVhc29uX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRMaWJyYXJ5RmlsZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVOb3RGb3VuZEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZVVSSUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb2RpZnlSZWFkT25seUZpbGVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb3ZlUmVzb3VyY2VFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb2RpZnlGaWxlc0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc291cmNlT3V0T2ZTeW5jaF9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkTGlicmFyeVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmVEYXRhVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZUxpYnJhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkUmVzb3VyY2VzVGFza19uYW1lOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pZ3JhdGluZ0RpYWdyYW1fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pZ3JhdGVDb250ZW50RGVzY3JpcHRpb25zVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZml4UHJlc2VudGF0aW9uTmFtZVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVucmVzb2x2ZWRQcm94eUxvZ2dlckpvYl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcl9jb3VsZE5vdFJlc29sdmVQcm94eTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRDb25maWd1cmF0aW9uX2NvdWxkTm90TG9hZF9sb2dNc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkQ29uZmlndXJhdGlvbl9ub3RDb25maWdGaWxlX2xvZ01zZzsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGVyc2lzdGVuY2VVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGVyc2lzdGVuY2VVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZTA4YTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1BlcnNpc3RlbmNlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuRVBGVmVyc2lvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5WZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLmludGVybmFsLk1pZ3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLmludGVybmFsLlJlZnJlc2hFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aXRoIHN0YXRpYyBoZWxwZXIgbWV0aG9kcyBmb3IgbGlicmFyeSBwZXJzaXN0ZW5jZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVdGlsIHsKLQotCS8qKgotCSAqIEdldHMgdGhlIGN1cnJlbnQgbmFtZXNwYWNlIFVSSSBvZiBVTUEuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0VU1BTnNVUkkoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLmVOU19VUkk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0VU1BTnNVUkkoU3RyaW5nIGxpYlBhdGgpIHsKLQkJdHJ5IHsKLQkJCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpCi0JCQkJCS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJCURvY3VtZW50IGRvYyA9IGJ1aWxkZXIucGFyc2UobmV3IEZpbGUobGliUGF0aCkpOwotCQkJRWxlbWVudCByb290ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJU3RyaW5nIG5zVVJJID0gcm9vdC5nZXRBdHRyaWJ1dGUoInhtbG5zOmNvbS5pYm0udW1hIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChuc1VSSSA9PSBudWxsIHx8IG5zVVJJLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW5zVVJJID0gcm9vdC5nZXRBdHRyaWJ1dGUoInhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG5zVVJJID09IG51bGwgfHwgbnNVUkkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJbnNVUkkgPSByb290LmdldEF0dHJpYnV0ZSgieG1sbnM6dW1hIikgKyAiL3VtYS5lY29yZSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJcmV0dXJuIG5zVVJJOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gY29udmVyc2lvblJlcXVpcmVkKFN0cmluZyBsaWJQYXRoKSB7Ci0JCVN0cmluZyBjdXJyZW50TnNVUkkgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0VU1BTnNVUkkoKTsKLQkJU3RyaW5nIGxpYk5zVVJJID0gUGVyc2lzdGVuY2VVdGlsLmdldFVNQU5zVVJJKGxpYlBhdGgpOwotCQlpZiAoY3VycmVudE5zVVJJLmVxdWFscyhsaWJOc1VSSSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChNaWdyYXRvci5PTERfVU1BX05TX1VSSS5lcXVhbHMobGliTnNVUkkpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElSZXNvdXJjZSBnZXRXb3Jrc3BhY2VSZXNvdXJjZShPYmplY3Qgb2JqKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJRGVzY3JpYmFibGVFbGVtZW50IGUgPSAoRGVzY3JpYmFibGVFbGVtZW50KSBvYmo7Ci0JCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IGUuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQlyZXNvdXJjZSA9IGNvbnRlbnQuZVJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCXJlc291cmNlID0gZS5lUmVzb3VyY2UoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXNvdXJjZSA9ICgoRU9iamVjdCkgb2JqKS5lUmVzb3VyY2UoKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSZXNvdXJjZSkgewotCQkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIG9iajsKLQkJfQotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRVUkkoKS5pc0ZpbGUoKSkgewotCQkJcmV0dXJuIEZpbGVNYW5hZ2VyLmdldFJlc291cmNlRm9yTG9jYXRpb24ocmVzb3VyY2UuZ2V0VVJJKCkKLQkJCQkJLnRvRmlsZVN0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb248RU9iamVjdD4gZ2V0UHJveGllcyhFT2JqZWN0IG9iaikgewotCQlDb2xsZWN0aW9uPEVPYmplY3Q+IHByb3hpZXMgPSBuZXcgQXJyYXlMaXN0PEVPYmplY3Q+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iai5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoby5lSXNQcm94eSgpKSB7Ci0JCQkJcHJveGllcy5hZGQobyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb3hpZXM7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHRoZSBwcmltYXJ5IHRvb2wgdmVyc2lvbiBzdG9yZWQgaW4gdGhlIGdpdmVuIHJlc291cmNlCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiA8bGk+IDwgMCBpZiB0aGUgdmVyc2lvbiBvZiB0aGUgcHJpbWFyeSB0b29sIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gcmVzb3VyY2UgaXMgbWlzc2luZyBvciBvbGRlciB0aGFuIGN1cnJlbnQKLQkgKiAgICAgICAgIDxsaT4gMCBpZiB0aGUgcHJpbWFyeSB0b29sIHZlcnNpb24gaW4gdGhlIGdpdmVuIHJlc291cmNlIG1hdGNoZXMgdGhlIGN1cnJlbnQgdmVyc2lvbgotCSAqICAgICAgICAgPGxpPiA+IDAgaWYgIHRoZSBwcmltYXJ5IHRvb2wgdmVyc2lvbiBpbiB0aGUgZ2l2ZW4gcmVzb3VyY2UgaXMgbmV3ZXIgdGhhbiB0aGUgY3VycmVudCB2ZXJzaW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2hlY2tUb29sVmVyc2lvbihSZXNvdXJjZSByZXNvdXJjZSkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCU1hcCBmaWxlVmVyc2lvbk1hcCA9IFZlcnNpb25VdGlsLnJlYWRWZXJzaW9uc0Zyb21GaWxlKGZpbGUpOwotCQlpZihmaWxlVmVyc2lvbk1hcCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdmVyc2lvbiA9IChTdHJpbmcpIGZpbGVWZXJzaW9uTWFwLmdldChWZXJzaW9uVXRpbC5nZXRQcmltYXJ5VG9vbElEKCkpOwotCQkJaWYodmVyc2lvbiAhPSBudWxsKSB7Ci0JCQkJRVBGVmVyc2lvbnMgdmVyc2lvbnMgPSBWZXJzaW9uVXRpbC5nZXRWZXJzaW9ucyhWZXJzaW9uVXRpbC5nZXRQcmltYXJ5VG9vbElEKCkpOwotCQkJCXJldHVybiB2ZXJzaW9ucy5nZXRDdXJyZW50VmVyc2lvbigpLmNvbXBhcmVUb29sVmVyc2lvblRvKG5ldyBWZXJzaW9uKHZlcnNpb24pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZmlyc3QgbWV0aG9kIGVsZW1lbnQgaW4gY29udGVudHMgb2YgdGhlIGdpdmVuIHJlc291cmNlLgotCSAqICAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJlc29sdmVzIHRoZSBwcm94eSBhbmQgaXRzIGNvbnRhaW5lcnMKLQkgKiAKLQkgKiBAcGFyYW0gcHJveHkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBFT2JqZWN0IHJlc29sdmUoRU9iamVjdCBwcm94eSwgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJRU9iamVjdCByZXNvbHZlZDsKLQkJdHJ5IHsKLQkJCXJlc29sdmVkID0gRWNvcmVVdGlsLnJlc29sdmUocHJveHksIHJlc291cmNlU2V0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJlc29sdmVkID0gcHJveHk7Ci0JCX0KLQkJRU9iamVjdCBjb250YWluZXIgPSBwcm94eS5lQ29udGFpbmVyKCk7Ci0JCWlmIChyZXNvbHZlZC5lQ29udGFpbmVyKCkgPT0gbnVsbCAmJiBjb250YWluZXIgIT0gbnVsbCkgewotCQkJaWYgKGNvbnRhaW5lci5lSXNQcm94eSgpKSB7Ci0JCQkJY29udGFpbmVyID0gcmVzb2x2ZShjb250YWluZXIsIHJlc291cmNlU2V0KTsKLQkJCX0KLQkJCUVSZWZlcmVuY2UgcmVmID0gcHJveHkuZUNvbnRhaW5tZW50RmVhdHVyZSgpOwotCQkJaWYgKHJlZi5pc01hbnkoKSkgewotCQkJCUxpc3QgdmFsdWVzID0gKExpc3QpIGNvbnRhaW5lci5lR2V0KHJlZik7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdmFsdWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyBpdGVyCi0JCQkJCQkubmV4dCgpKQotCQkJCQk7Ci0JCQl9IGVsc2UgewotCQkJCWNvbnRhaW5lci5lR2V0KHJlZik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmVkOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGdldFJlc291cmNlKElQYXRoIHBhdGgsIFJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZShwYXRoLnRvT1NTdHJpbmcoKSwgcmVzb3VyY2VTZXQpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGdldFJlc291cmNlKFN0cmluZyBwYXRoLCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkocGF0aCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KHJlc291cmNlU2V0LmdldFJlc291cmNlcygpKQotCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCWlmICh1cmkuZXF1YWxzKE11bHRpRmlsZVNhdmVVdGlsLmdldEZpbmFsVVJJKHJlc291cmNlKSkpIHsKLQkJCQlyZXR1cm4gcmVzb3VyY2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0JCi0JLyoqCi0JICogUmVzb2x2ZXMgY29udGFpbmVyIG9mIHRoZSBNZXRob2RFbGVtZW50IGluIHRoZSBnaXZlbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVzb2x2ZUNvbnRhaW5lcihSZXNvdXJjZSByZXNvdXJjZSkgewotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCWlmKHJlc291cmNlU2V0IGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSB7Ci0JCQkoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbClyZXNvdXJjZVNldCkucmVzb2x2ZUNvbnRhaW5lcihyZXNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudChJUmVzb3VyY2UgaVJlc291cmNlLCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkoaVJlc291cmNlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZSh1cmksIHRydWUpOwkJCi0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7IAotCQkJaWYocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHsKLQkJCQkoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbClyZXNvdXJjZVNldCkucmVzb2x2ZUNvbnRhaW5lcihyZXNvdXJjZSk7Ci0JCQl9Ci0JCQllbGVtZW50ID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ29udGVudERlc2NyaXB0aW9uKWVsZW1lbnQpLmVDb250YWluZXIoKTsKLQkJCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQllbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpY29udGFpbmVyOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvYWRBbGxMaWJyYXJ5UmVzb3VyY2VzKE1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQl0cnkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudC5lQ3Jvc3NSZWZlcmVuY2VzKCkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VG9wQXR0cmlidXRlKEZpbGUgZmlsZSwgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJLy8gQ3JlYXRlIHRoZSBTQVggcGFyc2VyIGZhY3RvcnkuCi0JCVNBWFBhcnNlckZhY3Rvcnkgc3BmID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0JCS8vIENyZWF0ZSB0aGUgU0FYIHBhcnNlci4KLQkJdHJ5IHsKLQkJCVNBWFBhcnNlciBzYXhQYXJzZXIgPSBzcGYubmV3U0FYUGFyc2VyKCk7Ci0JCQlmaW5hbCBTdHJpbmdbXSB2YWx1ZUhvbGRlciA9IG5ldyBTdHJpbmdbMV07Ci0JCQl0cnkgewotCQkJc2F4UGFyc2VyLnBhcnNlKGZpbGUsIG5ldyBEZWZhdWx0SGFuZGxlcigpIHsJCi0JCQkJcHJpdmF0ZSBib29sZWFuIHN0YXJ0ZWQ7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCQkJaWYoc3RhcnRlZCkgewotCQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQkJCX0KLS8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInVyaTogIiArIHVyaSk7Ci0vLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJsb2NhbE5hbWU6ICIgKyBsb2NhbE5hbWUpOwotLy8JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicU5hbWU6ICIgKyBxTmFtZSk7Ci0JCQkJCXZhbHVlSG9sZGVyWzBdID0gYXR0cmlidXRlcy5nZXRWYWx1ZShhdHRyaWJ1dGVOYW1lKTsKLQkJCQkJc3RhcnRlZCA9IHRydWU7Ci0JCQkJfQotCQkJfSk7Ci0JCQl9Ci0JCQljYXRjaChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8KLQkJCX0KLQkJCXJldHVybiB2YWx1ZUhvbGRlclswXTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmxvYWQoQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcykgewotCQlNYXA8TXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLCBDb2xsZWN0aW9uPFJlc291cmNlPj4gcmVzb3VyY2VTZXRUb1VubG9hZGVkUmVzb3VyY2VzTWFwID0gbmV3IEhhc2hNYXA8TXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLCBDb2xsZWN0aW9uPFJlc291cmNlPj4oKTsKLQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IHJlbW92ZWRSZXNvdXJjZXMpIHsKLQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCWJvb2xlYW4gdW5sb2FkZWQgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJaWYocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlU2V0KSB7Ci0JCQkJCWlmKCgoSUxpYnJhcnlSZXNvdXJjZVNldClyZXNvdXJjZVNldCkudW5sb2FkKHJlc291cmNlLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVApKSB7Ci0JCQkJCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5yZW1vdmUocmVzb3VyY2UpOwotCQkJCQkJdW5sb2FkZWQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZihyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCQlyZXNvdXJjZS51bmxvYWQoKTsKLQkJCQkJCXVubG9hZGVkID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQlpZihyZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0JCQkJCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5yZW1vdmUocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9CQotCQkJaWYodW5sb2FkZWQgJiYgcmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHsKLQkJCQlDb2xsZWN0aW9uPFJlc291cmNlPiB1bmxvYWRlZFJlc291cmNlcyA9IHJlc291cmNlU2V0VG9VbmxvYWRlZFJlc291cmNlc01hcC5nZXQocmVzb3VyY2VTZXQpOwotCQkJCWlmKHVubG9hZGVkUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCQkJdW5sb2FkZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCQkJCQlyZXNvdXJjZVNldFRvVW5sb2FkZWRSZXNvdXJjZXNNYXAucHV0KChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHJlc291cmNlU2V0LCB1bmxvYWRlZFJlc291cmNlcyk7Ci0JCQkJfQotCQkJCXVubG9hZGVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJZm9yIChNYXAuRW50cnk8TXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLCBDb2xsZWN0aW9uPFJlc291cmNlPj4gZW50cnkgOiByZXNvdXJjZVNldFRvVW5sb2FkZWRSZXNvdXJjZXNNYXAuZW50cnlTZXQoKSkgewotCQkJZW50cnkuZ2V0S2V5KCkubm90aWZ5UmVmcmVzaExpc3RlbmVycyhuZXcgUmVmcmVzaEV2ZW50KGVudHJ5LmdldFZhbHVlKCkpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50IGhhcyBhIEdVSUQgdGhhdCBpcyB0aGUgc2FtZSBhcyBHVUlEIG9mCi0JICogb25lIGVsZW1lbnQgaW4gdGhlIGdpdmVuIGVsZW1lbnRzIGxpc3QuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50IGhhcyBkdXBsaWNhdGUgR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNEdXBsaWNhdGVHVUlEKE1ldGhvZEVsZW1lbnQgZSwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRWxlbWVudD4gZWxlbWVudHMpIHsKLQkJZm9yIChNZXRob2RFbGVtZW50IGVsZW1lbnQgOiBlbGVtZW50cykgewotCQkJaWYoZS5nZXRHdWlkKCkuZXF1YWxzKGVsZW1lbnQuZ2V0R3VpZCgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvUHJlZml4KFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBwYXRoLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSA/IHBhdGggOiBwYXRoICsgRmlsZS5zZXBhcmF0b3I7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXBsYWNlVVJJUHJlZml4KENvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlcywgU3RyaW5nIG9sZFByZWZpeCwgU3RyaW5nIG5ld1ByZWZpeCkgewotCQlVUkkgb2xkUHJlZml4VVJJID0gVVJJLmNyZWF0ZUZpbGVVUkkodG9QcmVmaXgob2xkUHJlZml4KSk7Ci0JCVVSSSBuZXdQcmVmaXhVUkkgPSBVUkkuY3JlYXRlRmlsZVVSSSh0b1ByZWZpeChuZXdQcmVmaXgpKTsKLQkJZm9yKFJlc291cmNlIHJlc291cmNlIDogcmVzb3VyY2VzKSB7Ci0JCQlVUkkgdXJpID0gcmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCQlVUkkgbmV3VVJJID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJbmV3VVJJID0gdXJpLnJlcGxhY2VQcmVmaXgob2xkUHJlZml4VVJJLCBuZXdQcmVmaXhVUkkpOwotCQkJfQotCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkKLQkJCX0KLQkJCWlmKG5ld1VSSSAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2Uuc2V0VVJJKG5ld1VSSSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBVUkkgZ2V0UHJveHlVUkkoRU9iamVjdCBvYmplY3QpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBvYmplY3QuZVJlc291cmNlKCk7Ci0JCVVSSSB1cmkgPSBudWxsOwotCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2UpIHsKLQkJCUlMaWJyYXJ5UmVzb3VyY2UgbGliUmVzb3VyY2UgPSAoSUxpYnJhcnlSZXNvdXJjZSkgcmVzb3VyY2U7Ci0JCQl1cmkgPSBsaWJSZXNvdXJjZS5nZXRQcm94eVVSSShvYmplY3QpOwkJCQotCQl9Ci0JCWVsc2UgewotCQkJdXJpID0gcmVzb3VyY2UuZ2V0VVJJKCkuYXBwZW5kRnJhZ21lbnQocmVzb3VyY2UuZ2V0VVJJRnJhZ21lbnQob2JqZWN0KSk7Ci0JCX0KLQkJcmV0dXJuIHVyaTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlTdHJpbmcgYXR0cmliID0gZ2V0VG9wQXR0cmlidXRlKG5ldyBGaWxlKGFyZ3NbMF0pLCBhcmdzWzFdKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKGF0dHJpYik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkwM2UwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIEVycm9yIE1lc3NhZ2VzCi1pbnZhbGlkTmFtZUVycm9yX21zZz1UaGUgbmFtZSAnJ3swfScnIGlzIGludmFsaWQuIEEgbWV0aG9kIGVsZW1lbnQgbmFtZSBjYW5ub3QgY29udGFpbiB0aGVzZSBjaGFyYWN0ZXJzOiBcXCAvIDogKiA/ICIgPCA+IHwKLW9iak5vdEZvdW5kRXJyb3JfbXNnPUNvdWxkIG5vdCBmaW5kIG9iamVjdCB3aXRoIGlkICcnezB9JycKLWxvYWRMaWJyYXJ5RXJyb3JfbXNnPUVycm9ycyBlbmNvdW50ZXJlZCB3aGlsZSBsb2FkaW5nIG1ldGhvZCBsaWJyYXJ5OgotbG9hZExpYnJhcnlFcnJvcl9kZXRhaWxzPVwgXCBsaW5lOiB7MH0sIGNvbHVtbjogezF9LCBtc2c6IHsyfQotcmVzdG9yZVJlc291cmNlRXJyb3JfbXNnPUNvdWxkIG5vdCByZXN0b3JlIHJlc291cmNlICcnezB9JycKLUZpbGVNYW5hZ2VyX2ZpbGVSZWFkT25seT1GaWxlICcnezB9JycgaXMgcmVhZC1vbmx5Ci1FcnJNc2dfQ291bGROb3REZWxldGU9Q291bGQgbm90IGRlbGV0ZSB7MH0uIHsxfQotcmVuYW1lRXJyb3JfbXNnPUNvdWxkIG5vdCByZW5hbWUgJyd7MH0nJyB0byAnJ3sxfScnCi1iYWNrdXBFcnJvcl9tc2c9Q291bGQgbm90IGJhY2t1cCB1cCByZXNvdXJjZSAnJ3swfScnCi1tYXJrZXJfZXJyX2Nhbm5vdFJlc29sdmVQcm94eT1Db3VsZCBub3QgcmVzb2x2ZSBwcm94eSB7MH0KLW1vZGlmeUZpbGVFcnJvcl9tc2c9Q2Fubm90IG1vZGlmeSBmaWxlICcnezB9JycKLWZpbGVQYXRoTmFtZVRvb0xvbmdfbXNnPUNhbm5vdCBzYXZlIHJlc291cmNlLiBGaWxlIHBhdGggbmFtZSB0b28gbG9uZyAoZXhjZWVkaW5nIDI1NSkgJyd7MH0nJwotbG9hZFJlc291cmNlRXJyb3JfbXNnPUNvdWxkIG5vdCBsb2FkIHJlc291cmNlICcnezB9JycKLWxvYWRSZXNvdXJjZUVycm9yV2l0aFJlYXNvbl9tc2c9Q291bGQgbm90IGxvYWQgcmVzb3VyY2UgJyd7MH0nJy4gUmVhc29uOiB7MX0KLWludmFsaWRMaWJyYXJ5RmlsZUVycm9yX21zZz1JbnZhbGlkIG1ldGhvZCBsaWJyYXJ5IGZpbGU6Ci1maWxlTm90Rm91bmRFcnJvcl9tc2c9Q291bGQgbm90IGxvY2F0ZSBhbnkgbWV0aG9kIGxpYnJhcnkgZmlsZSBpbiB3b3Jrc3BhY2UgJyd7MH0nJwotbm9ybWFsaXplVVJJRXJyb3JfbXNnPUNvdWxkIG5vdCBmaW5kIHRoZSBub3JtYWxpemVkIFVSSSBmb3IgJyd7MH0nJwotbW92ZUVycm9yX21zZz1Db3VsZCBub3QgbW92ZSAnJ3swfScnIHRvICcnezF9JycuIFRoZSBkZXN0aW5hdGlvbiBhbHJlYWR5IGV4aXN0cy4KLW1vZGlmeVJlYWRPbmx5RmlsZUVycm9yX21zZz1DYW5ub3QgbW9kaWZ5IHJlYWQtb25seSBmaWxlKHMpOiB7MH0KLW1vdmVSZXNvdXJjZUVycm9yX21zZz1SZXNvdXJjZSAnJ3swfScnIGlzIGludm9sdmVkIGluIGEgcGVyc2lzdGVuY2Ugb3BlcmF0aW9uIHRoYXQgaGFzIG5vdCBiZWVuIGNvbW1pdHRlZC4KLW1vZGlmeUZpbGVzRXJyb3JfbXNnPUNvdWxkIG5vdCBtb2RpZnkgb25lIG9yIG1vcmUgZmlsZXMKLXJlc291cmNlT3V0T2ZTeW5jaF9tc2c9UmVzb3VyY2UgaXMgb3V0IG9mIHN5bmNoIGFuZCBuZWVkcyB0byBiZSByZWxvYWRlZDogezB9Ci1yZXNvdXJjZUF1dG9SZWZyZXNoSm9iX25hbWU9UmVzb3VyY2UgQXV0by1SZWZyZXNoCi1sb2FkQ29uZmlndXJhdGlvbl9jb3VsZE5vdExvYWRfbG9nTXNnPUNvdWxkIG5vdCBsb2FkIGZpbGU6IHswfS4gVGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIHRoaXMgZmlsZSBoYXMgZHVwbGljYXRlIEdVSUQuCi1sb2FkQ29uZmlndXJhdGlvbl9ub3RDb25maWdGaWxlX2xvZ01zZz1Ob3QgYSBtZXRob2QgY29uZmlndXJhdGlvbiBmaWxlOiB7MH0KLQotIyBQcm9ncmVzcyBNZXNzYWdlcwotbG9hZExpYnJhcnlUYXNrX25hbWU9TG9hZGluZyBtZXRob2QgbGlicmFyeS4uLgotbW92ZURhdGFUYXNrX25hbWU9TW92aW5nIHRoZSBkYXRhLi4uCi1zYXZlTGlicmFyeVRhc2tfbmFtZT1TYXZpbmcgbWV0aG9kIGxpYnJhcnkuLi4KLWxvYWRSZXNvdXJjZXNUYXNrX25hbWU9TG9hZGluZyBhbGwgcmVzb3VyY2VzIGludG8gbWVtb3J5Li4uCi1taWdyYXRpbmdEaWFncmFtX25hbWU9TWlncmF0aW5nIGRpYWdyYW1zLi4uCi1taWdyYXRlQ29udGVudERlc2NyaXB0aW9uc1Rhc2tfbmFtZT1NaWdyYXRpbmcgcHJvY2VzcyBjb250ZW50IGRlc2NyaXB0aW9ucy4uLgotZml4UHJlc2VudGF0aW9uTmFtZVRhc2tfbmFtZT1GaXhpbmcgZW1wdHkgcHJlc2VudGF0aW9uIG5hbWVzLi4uCi1VbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyX2NvdWxkTm90UmVzb2x2ZVByb3h5PUNvdWxkIG5vdCByZXNvbHZlIHByb3h5ICcnezB9JycKLXJlZnJlc2hMaWJyYXJ5RmlsZXNUYXNrX25hbWU9UmVmcmVzaGluZyBsaWJyYXJ5IGZpbGVzIGluIHdvcmtzcGFjZQotY2Fubm90X2NyZWF0ZV9kaXJfbXNnPUNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICcnezB9JycuCi11bnJlc29sdmVkUHJveHlMb2dnZXJKb2JfbmFtZT1VbnJlc29sdmVkIFByb3h5IExvZ2dlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1VucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9VbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZWYxYjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1VucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuTG9jYXRpb25LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JUHJveHlSZXNvbHV0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5SZXNvbHZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCi0vKioKLSAqIEJhY2tncm91bmQgam9iIHRoYXQgbWFuYWdlIG1hcmtlcnMgZm9yIHVucmVzb2x2ZWQgcHJveGllcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlciBleHRlbmRzIFdvcmtzcGFjZUpvYiBpbXBsZW1lbnRzIElQcm94eVJlc29sdXRpb25MaXN0ZW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFTEFZID0gMDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLRVJfSUQgPSBQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSArICIudW5yZXNvbHZlZFByb3h5TWFya2VyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX1VSSSA9ICJwcm94eVVSSSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPV05FUl9HVUlEID0gIm93bmVyR1VJRCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBWYWxpZE9iamVjdCB7Ci0JCWJvb2xlYW4gdmFsaWQ7Ci0JCU9iamVjdCBvYmplY3Q7Ci0JCQotCQkvKioKLQkJICogQHBhcmFtIHZhbGlkCi0JCSAqIEBwYXJhbSBvYmplY3QKLQkJICovCi0JCXB1YmxpYyBWYWxpZE9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JCQl2YWxpZCA9IHRydWU7CQkJCi0JCX0KLQkJCQkKLQl9Ci0JCi0JcHJpdmF0ZSBNYXAgdXJpVG9FeGNlcHRpb25zTWFwOwotCXByaXZhdGUgTGlzdCBleGNlcHRpb25zOwotCXByaXZhdGUgTWFwIHJlc291cmNlR1VJVG9NYXJrZXJzTWFwOwotCXByaXZhdGUgTWFwIGVsZW1lbnRHVUlUb01hcmtlcnNNYXA7Ci0JcHJpdmF0ZSBSZXNvdXJjZVNldCByZXNvdXJjZVNldDsKLQlwcml2YXRlIGJvb2xlYW4gZW5hYmxlZDsKLQlwcml2YXRlIExpc3QgcmVzb3VyY2VzVG9WYWxpZGF0ZU1hcmtlcnM7Ci0JcHJpdmF0ZSBib29sZWFuIGF1dG9TY2hlZHVsZWQgPSB0cnVlOwotCi0JcHVibGljIFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIoUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJc3VwZXIoUGVyc2lzdGVuY2VSZXNvdXJjZXMudW5yZXNvbHZlZFByb3h5TG9nZ2VySm9iX25hbWUpOwkJCi0JCXRoaXMucmVzb3VyY2VTZXQgPSByZXNvdXJjZVNldDsKLS8vCQl1bnJlc29sdmVkUmVzb3VyY2VHVUlEVG9NYXJrZXJzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJdXJpVG9FeGNlcHRpb25zTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZXhjZXB0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsgCi0JCXJlc291cmNlR1VJVG9NYXJrZXJzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZWxlbWVudEdVSVRvTWFya2Vyc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzID0gbmV3IFVuaXF1ZUVMaXN0KCk7Ci0JfQotCi0JcHVibGljIElNYXJrZXIgZmluZE1hcmtlcihJRmlsZSBmaWxlLCBTdHJpbmcgcHJveHlVUkksIGludCBzdGFydCwgaW50IGVuZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTWFya2VyW10gbWFya2VycyA9IGZpbGUuZmluZE1hcmtlcnMoTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQlyZXR1cm4gZmluZE1hcmtlcihtYXJrZXJzLCBwcm94eVVSSSwgc3RhcnQsIGVuZCk7Ci0JfQotCQotCXByaXZhdGUgSU1hcmtlciBmaW5kTWFya2VyKElNYXJrZXJbXSBtYXJrZXJzLCBTdHJpbmcgcHJveHlVUkksIGludCBzdGFydCwgaW50IGVuZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCWlmKHByb3h5VVJJLmVxdWFscyhtYXJrZXIuZ2V0QXR0cmlidXRlKFBST1hZX1VSSSkpCi0JCQkJCSYmIG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJULCAtMSkgPT0gc3RhcnQKLQkJCQkJJiYgbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5ELCAtMSkgPT0gZW5kKSAKLQkJCXsKLQkJCQlyZXR1cm4gbWFya2VyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIElNYXJrZXIgZmluZE1hcmtlcihDb2xsZWN0aW9uPElNYXJrZXI+IG1hcmtlcnMsIGludCBzdGFydCwgaW50IGVuZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmb3IgKElNYXJrZXIgbWFya2VyIDogbWFya2VycykgewotCQkJaWYobWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQsIC0xKSA9PSBzdGFydAotCQkJCQkmJiBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQsIC0xKSA9PSBlbmQpIAotCQkJewotCQkJCXJldHVybiBtYXJrZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQlwcml2YXRlIGJvb2xlYW4gYWRkRXhjZXB0aW9uKFJlc29sdmVFeGNlcHRpb24gcmUpIHsKLQkJc3luY2hyb25pemVkKGV4Y2VwdGlvbnMpIHsKLQkJCVVSSSB1cmkgPSAoKEludGVybmFsRU9iamVjdClyZS5nZXRQcm94eSgpKS5lUHJveHlVUkkoKTsKLQkJCVNldCBleGNlcHRpb25zID0gKFNldCkgdXJpVG9FeGNlcHRpb25zTWFwLmdldCh1cmkpOwkJCi0JCQlpZihleGNlcHRpb25zID09IG51bGwpIHsKLQkJCQlleGNlcHRpb25zID0gbmV3IEhhc2hTZXQoKTsKLQkJCQl1cmlUb0V4Y2VwdGlvbnNNYXAucHV0KHVyaSwgZXhjZXB0aW9ucyk7Ci0JCQl9Ci0JCQlpZihleGNlcHRpb25zLmFkZChyZSkpIHsKLQkJCQl0aGlzLmV4Y2VwdGlvbnMuYWRkKHJlKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBEb2N1bWVudCBiYXNlZCBjaGFyYWN0ZXIgc2VxdWVuY2UuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRG9jdW1lbnRDaGFyU2VxdWVuY2UgaW1wbGVtZW50cyBDaGFyU2VxdWVuY2UgewotCi0JCS8qKiBEb2N1bWVudCAqLwotCQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0KLQkJLyoqCi0JCSAqIEluaXRpYWxpemUgd2l0aCB0aGUgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4KLQkJICogZG9jdW1lbnQuCi0JCSAqCi0JCSAqIEBwYXJhbSBkb2N1bWVudCB0aGUgZG9jdW1lbnQKLQkJICovCi0JCXB1YmxpYyBEb2N1bWVudENoYXJTZXF1ZW5jZShJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJCWZEb2N1bWVudD0gZG9jdW1lbnQ7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UjbGVuZ3RoKCkKLQkJICovCi0JCXB1YmxpYyBpbnQgbGVuZ3RoKCkgewotCQkJcmV0dXJuIGZEb2N1bWVudC5nZXRMZW5ndGgoKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNjaGFyQXQoaW50KQotCQkgKi8KLQkJcHVibGljIGNoYXIgY2hhckF0KGludCBpbmRleCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZkRvY3VtZW50LmdldENoYXIoaW5kZXgpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKHguZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNzdWJTZXF1ZW5jZShpbnQsIGludCkKLQkJICovCi0JCXB1YmxpYyBDaGFyU2VxdWVuY2Ugc3ViU2VxdWVuY2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmRG9jdW1lbnQuZ2V0KHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oeC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1hcmtlcnNBbmRMb2NhdGlvbnMgewotCQlDb2xsZWN0aW9uPElNYXJrZXI+IG1hcmtlcnM7Ci0JCUNvbGxlY3Rpb248aW50W10+IGxvY2F0aW9uczsJCQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVNYXJrZXIoSU1hcmtlcltdIG1hcmtlcnMsIFJlc291cmNlIHJlc291cmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJVVJJIGNvbnRhaW5lclVSSSA9IHJlc291cmNlLmdldFVSSSgpOwotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGNvbnRhaW5lclVSSS50b0ZpbGVTdHJpbmcoKSk7Ci0JCUlGaWxlIGZpbGUgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGxvY2F0aW9uID0gY29udGFpbmVyVVJJICE9IG51bGwgPyBjb250YWluZXJVUkkKLQkJCQkJLnRvRmlsZVN0cmluZygpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJdHJ5IHsKLQkJCQlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbnVsbCk7Ci0JCQkJCi0JCQkJTWFwPFN0cmluZywgTWFya2Vyc0FuZExvY2F0aW9ucz4gcHJveHlVUklUb01hcmtlcnNBbmRMb2NhdGlvbnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcmtlcnNBbmRMb2NhdGlvbnM+KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJT2JqZWN0IHByb3h5VVJJID0gbWFya2VyLmdldEF0dHJpYnV0ZShQUk9YWV9VUkkpOwotCQkJCQlpZihwcm94eVVSSSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgcHJveHlVUklTdHIgPSBwcm94eVVSSS50b1N0cmluZygpOwotCQkJCQkJTWFya2Vyc0FuZExvY2F0aW9ucyBtYXJrZXJzQW5kTG9jYXRpb25zID0gcHJveHlVUklUb01hcmtlcnNBbmRMb2NhdGlvbnNNYXAuZ2V0KHByb3h5VVJJU3RyKTsKLQkJCQkJCWlmKG1hcmtlcnNBbmRMb2NhdGlvbnMgPT0gbnVsbCkgewotCQkJCQkJCW1hcmtlcnNBbmRMb2NhdGlvbnMgPSBuZXcgTWFya2Vyc0FuZExvY2F0aW9ucygpOwotCQkJCQkJCW1hcmtlcnNBbmRMb2NhdGlvbnMubWFya2VycyA9IG5ldyBIYXNoU2V0PElNYXJrZXI+KCk7Ci0JCQkJCQkJbWFya2Vyc0FuZExvY2F0aW9ucy5sb2NhdGlvbnMgPSBuZXcgSGFzaFNldDxpbnRbXT4oKTsKLQkJCQkJCQlwcm94eVVSSVRvTWFya2Vyc0FuZExvY2F0aW9uc01hcC5wdXQocHJveHlVUklTdHIsIG1hcmtlcnNBbmRMb2NhdGlvbnMpOwotCQkJCQkJfQotCQkJCQkJbWFya2Vyc0FuZExvY2F0aW9ucy5tYXJrZXJzLmFkZChtYXJrZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCS8vIGxvY2F0ZSB0aGUgdGV4dCBvZiB1bnJlc29sdmVkIFVSSSBpbiBmaWxlCi0JCQkJLy8KLQkJCQlJVGV4dEZpbGVCdWZmZXJNYW5hZ2VyIG1hbmFnZXI9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpOwotCQkJCXRyeSB7Ci0JCQkJCW1hbmFnZXIuY29ubmVjdChwYXRoLCBMb2NhdGlvbktpbmQuTE9DQVRJT04sIG1vbml0b3IpOwotCQkJCQlJVGV4dEZpbGVCdWZmZXIgZmlsZUJ1ZmZlcj0gbWFuYWdlci5nZXRUZXh0RmlsZUJ1ZmZlcihwYXRoLCBMb2NhdGlvbktpbmQuTE9DQVRJT04pOwotCQkJCQlmaWxlQnVmZmVyLnJlcXVlc3RTeW5jaHJvbml6YXRpb25Db250ZXh0KCk7Ci0JCQkJCWZpbGVCdWZmZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJSURvY3VtZW50IGRvYyA9IGZpbGVCdWZmZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJaWYoZG9jICE9IG51bGwpIHsKLQkJCQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgTWFya2Vyc0FuZExvY2F0aW9ucz4gZW50cnkgOiBwcm94eVVSSVRvTWFya2Vyc0FuZExvY2F0aW9uc01hcC5lbnRyeVNldCgpKSB7Ci0JCQkJCQkJU3RyaW5nIHByb3h5VVJJID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJCQkJUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybkNvbnN0cnVjdG9yLmNyZWF0ZVBhdHRlcm4ocHJveHlVUkksIHRydWUsIGZhbHNlKTsKLQkJCQkJCQlNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIobmV3IERvY3VtZW50Q2hhclNlcXVlbmNlKGRvYykpOwotCQkJCQkJCXdoaWxlKG1hdGNoZXIuZmluZCgpKSB7Ci0JCQkJCQkJCWludCBzdGFydCA9IG1hdGNoZXIuc3RhcnQoKTsKLQkJCQkJCQkJaW50IGVuZCA9IG1hdGNoZXIuZW5kKCk7Ci0JCQkJCQkJCWlmKHN0YXJ0ICE9IGVuZCkgewotCQkJCQkJCQkJZW50cnkuZ2V0VmFsdWUoKS5sb2NhdGlvbnMuYWRkKG5ldyBpbnRbXSB7IHN0YXJ0LCBlbmQgfSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZmlsZUJ1ZmZlci5yZWxlYXNlU3luY2hyb25pemF0aW9uQ29udGV4dCgpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbWFuYWdlci5kaXNjb25uZWN0KHBhdGgsIExvY2F0aW9uS2luZC5MT0NBVElPTiwgbW9uaXRvcik7Ci0JCQkJfQotCQkJCQotCQkJCS8vIG1ha2Ugc3VyZSB0aGF0IHJlc29sdmVyIGlzIHN0aWxsIGluIHRoZSBvcGVuIGxpYnJhcnkgYnkgY2hlY2tpbmcgd2hldGhlciBpdHMgcmVzb3VyY2UKLQkJCQkvLyBzdGlsbCBiZWxvbmdzIHRvIGEgcmVzb3VyY2Ugc2V0Ci0JCQkJLy8KLQkJCQlpZihyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewotCQkJCQlmb3IgKE1hcmtlcnNBbmRMb2NhdGlvbnMgbWFya2Vyc0FuZExvY2F0aW9ucyA6IHByb3h5VVJJVG9NYXJrZXJzQW5kTG9jYXRpb25zTWFwLnZhbHVlcygpKSB7Ci0JCQkJCQlwcm9jZXNzX2VudHJ5OgotCQkJCQkJZm9yIChJdGVyYXRvcjxpbnRbXT4gaXRlcmF0b3IgPSBtYXJrZXJzQW5kTG9jYXRpb25zLmxvY2F0aW9ucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJaWYobWFya2Vyc0FuZExvY2F0aW9ucy5tYXJrZXJzLmlzRW1wdHkoKSkgewotCQkJCQkJCQlicmVhayBwcm9jZXNzX2VudHJ5OwotCQkJCQkJCX0KLQkJCQkJCQlpbnRbXSBsb2MgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJaW50IHN0YXJ0ID0gbG9jWzBdOwotCQkJCQkJCWludCBlbmQgPSBsb2NbMV07Ci0JCQkJCQkJSU1hcmtlciBtYXJrZXIgPSBmaW5kTWFya2VyKG1hcmtlcnNBbmRMb2NhdGlvbnMubWFya2Vycywgc3RhcnQsIGVuZCk7Ci0JCQkJCQkJaWYobWFya2VyID09IG51bGwpIHsKLQkJCQkJCQkJSXRlcmF0b3I8SU1hcmtlcj4gaXRlciA9IG1hcmtlcnNBbmRMb2NhdGlvbnMubWFya2Vycy5pdGVyYXRvcigpOwotCQkJCQkJCQltYXJrZXIgPSBpdGVyLm5leHQoKTsKLQkJCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQsIHN0YXJ0KTsJCi0JCQkJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCwgZW5kKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCW1hcmtlcnNBbmRMb2NhdGlvbnMubWFya2Vycy5yZW1vdmUobWFya2VyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZighbWFya2Vyc0FuZExvY2F0aW9ucy5tYXJrZXJzLmlzRW1wdHkoKSkgewotCQkJCQkJCS8vIGludmFsaWQgbWFya2VycywgbXVzdCBiZSBkZWxldGVkCi0JCQkJCQkJLy8KLQkJCQkJCQlmb3IgKElNYXJrZXIgbWFya2VyIDogbWFya2Vyc0FuZExvY2F0aW9ucy5tYXJrZXJzKSB7Ci0JCQkJCQkJCWlmKG1hcmtlci5leGlzdHMoKSkgewotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQltYXJrZXIuZGVsZXRlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQljYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZE1hcmtlcihSZXNvdXJjZSByZXNvdXJjZSwgVVJJIHByb3h5VVJJLCBTdHJpbmcgZXJyTXNnLCBTdHJpbmcgb3duZXJHVUlELCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJVVJJIGNvbnRhaW5lclVSSSA9IHJlc291cmNlLmdldFVSSSgpOwotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGNvbnRhaW5lclVSSS50b0ZpbGVTdHJpbmcoKSk7Ci0JCUlGaWxlIGZpbGUgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGxvY2F0aW9uID0gY29udGFpbmVyVVJJICE9IG51bGwgPyBjb250YWluZXJVUkkKLQkJCQkJLnRvRmlsZVN0cmluZygpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJdHJ5IHsKLQkJCQlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbnVsbCk7Ci0JCQkJCi0JCQkJLy8gbG9jYXRlIHRoZSB0ZXh0IG9mIHVucmVzb2x2ZWQgVVJJIGluIGZpbGUKLQkJCQkvLwotCQkJCUlUZXh0RmlsZUJ1ZmZlck1hbmFnZXIgbWFuYWdlcj0gRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJbWFuYWdlci5jb25uZWN0KHBhdGgsIExvY2F0aW9uS2luZC5MT0NBVElPTiwgbW9uaXRvcik7Ci0JCQkJCUlUZXh0RmlsZUJ1ZmZlciBmaWxlQnVmZmVyPSBtYW5hZ2VyLmdldFRleHRGaWxlQnVmZmVyKHBhdGgsIExvY2F0aW9uS2luZC5MT0NBVElPTik7Ci0JCQkJCWZpbGVCdWZmZXIucmVxdWVzdFN5bmNocm9uaXphdGlvbkNvbnRleHQoKTsKLQkJCQkJZmlsZUJ1ZmZlci5nZXREb2N1bWVudCgpOwotCQkJCQlJRG9jdW1lbnQgZG9jID0gZmlsZUJ1ZmZlci5nZXREb2N1bWVudCgpOwotCQkJCQlpZihkb2MgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIHByb3h5VVJJU3RyID0gcHJveHlVUkkudG9TdHJpbmcoKTsKLQkJCQkJCVBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm5Db25zdHJ1Y3Rvci5jcmVhdGVQYXR0ZXJuKHByb3h5VVJJU3RyLCB0cnVlLCBmYWxzZSk7Ci0JCQkJCQlNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIobmV3IERvY3VtZW50Q2hhclNlcXVlbmNlKGRvYykpOwotCQkJCQkJd2hpbGUobWF0Y2hlci5maW5kKCkpIHsKLQkJCQkJCQlpbnQgc3RhcnQgPSBtYXRjaGVyLnN0YXJ0KCk7Ci0JCQkJCQkJaW50IGVuZCA9IG1hdGNoZXIuZW5kKCk7Ci0JCQkJCQkJaWYoc3RhcnQgIT0gZW5kKSB7Ci0JCQkJCQkJCS8vIG1ha2Ugc3VyZSB0aGF0IHJlc29sdmVyIGlzIHN0aWxsIGluIHRoZSBvcGVuIGxpYnJhcnkgYnkgY2hlY2tpbmcgd2hldGhlciBpdHMgcmVzb3VyY2UKLQkJCQkJCQkJLy8gc3RpbGwgYmVsb25ncyB0byBhIHJlc291cmNlIHNldAotCQkJCQkJCQkvLwotCQkJCQkJCQlpZihyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewotCQkJCQkJCQkJLy8gY3JlYXRlIHByb2JsZW0gbWFya2VyIGZvciBmaWxlCi0JCQkJCQkJCQlJTWFya2VyIG1hcmtlciA9IGZpbmRNYXJrZXIoZmlsZSwgcHJveHlVUklTdHIsIHN0YXJ0LCBlbmQpOwotCQkJCQkJCQkJaWYobWFya2VyID09IG51bGwpIHsKLQkJCQkJCQkJCQltYXJrZXIgPSBmaWxlLmNyZWF0ZU1hcmtlcihNQVJLRVJfSUQpOwotCQkJCQkJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwKLQkJCQkJCQkJCQkJCUlNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCQkJCQkJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCBlcnJNc2cpOwotCQkJCQkJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MT0NBVElPTiwgbG9jYXRpb24pOwotCQkJCQkJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5UUkFOU0lFTlQsIHRydWUpOwotCQkJCQkJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJULCBzdGFydCk7CQotCQkJCQkJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCwgZW5kKTsKLQkJCQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKFBST1hZX1VSSSwgcHJveHlVUklTdHIpOwotCQkJCQkJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoT1dORVJfR1VJRCwgb3duZXJHVUlEKTsKLQotCQkJCQkJCQkJCS8vIGNhY2hlIG1hcmtlciB0byBpdCBjYW4gYmUgZm91bmQgZWFzaWx5IGFuZCBkZWxldGVkCi0JCQkJCQkJCQkJLy8KLQkJCQkJCQkJCQljYWNoZU1hcmtlcihtYXJrZXIsIHByb3h5VVJJKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCS8vIHVwZGF0ZSBvd25lciBHVUlECi0JCQkJCQkJCQkJLy8KLQkJCQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKE9XTkVSX0dVSUQsIG93bmVyR1VJRCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZmlsZUJ1ZmZlci5yZWxlYXNlU3luY2hyb25pemF0aW9uQ29udGV4dCgpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbWFuYWdlci5kaXNjb25uZWN0KHBhdGgsIExvY2F0aW9uS2luZC5MT0NBVElPTiwgbW9uaXRvcik7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZXgpOwotCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZE1hcmtlcihSZXNvbHZlRXhjZXB0aW9uIHJlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSW50ZXJuYWxFT2JqZWN0IHByb3h5ID0gKEludGVybmFsRU9iamVjdCkgcmUuZ2V0UHJveHkoKTsKLQkJVVJJIGNvbnRhaW5lclVSSSA9IG51bGw7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJaWYocmUuZ2V0UmVzb2x2ZXIoKSAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZSA9IHJlLmdldFJlc29sdmVyKCkuZVJlc291cmNlKCk7Ci0JCQkKLQkJCS8vIG1ha2Ugc3VyZSB0aGF0IHJlc29sdmVyIGlzIHN0aWxsIGluIHRoZSBvcGVuIGxpYnJhcnkgYnkgY2hlY2tpbmcgd2hldGhlciBpdHMgcmVzb3VyY2UKLQkJCS8vIHN0aWxsIGJlbG9uZ3MgdG8gYSByZXNvdXJjZSBzZXQKLQkJCS8vCi0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlci5hZGRNYXJrZXIoKTogcmVzb3VyY2VTZXQ9IiArIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkuaGFzaENvZGUoKSk7Ci0JCQlpZihyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewkJCQkKLQkJCQljb250YWluZXJVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCX0KLQkJfQkJCQkKLQkJaWYgKGNvbnRhaW5lclVSSSAhPSBudWxsKSB7Ci0JCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChjb250YWluZXJVUkkudG9GaWxlU3RyaW5nKCkpOwotCQkJSUZpbGUgZmlsZSA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBlcnJNc2c7Ci0JCQkJaWYgKHJlLmV4Y2VwdGlvbigpICE9IG51bGwgJiYgcmUuZXhjZXB0aW9uKCkuZ2V0TG9jYWxpemVkTWVzc2FnZSgpICE9IG51bGwgJiYgCi0JCQkJCQlyZS5leGNlcHRpb24oKS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQllcnJNc2cgPSByZS5leGNlcHRpb24oKS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQllcnJNc2cgPSByZS5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/IE5MUy5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLlVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXJfY291bGROb3RSZXNvbHZlUHJveHksIHByb3h5LmVQcm94eVVSSSgpKSA6IHJlCi0JCQkJCQkJCS5nZXRNZXNzYWdlKCk7Ci0JCQkJfQotCQkJCWFkZE1hcmtlcihyZXNvdXJjZSwgcHJveHkuZVByb3h5VVJJKCksIGVyck1zZywgTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0R3VpZChyZS5nZXRSZXNvbHZlcigpKSwgbW9uaXRvcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWFya2VyCi0JICogQHBhcmFtIHVyaSBwcm94eSB1cmkgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNhY2hlTWFya2VyKElNYXJrZXIgbWFya2VyLCBVUkkgdXJpKSB7Ci0JCXN5bmNocm9uaXplZChlbGVtZW50R1VJVG9NYXJrZXJzTWFwKSB7Ci0JCQlTdHJpbmcgcmVzb3VyY2VHVUlEID0gdXJpLmF1dGhvcml0eSgpOwotCQkJaWYocmVzb3VyY2VHVUlEICE9IG51bGwpIHsKLQkJCQlWYWxpZE9iamVjdCB2byA9IChWYWxpZE9iamVjdCkgcmVzb3VyY2VHVUlUb01hcmtlcnNNYXAuZ2V0KHJlc291cmNlR1VJRCk7Ci0JCQkJaWYodm8gPT0gbnVsbCkgewotCQkJCQl2byA9IG5ldyBWYWxpZE9iamVjdChuZXcgSGFzaFNldCgpKTsKLQkJCQkJcmVzb3VyY2VHVUlUb01hcmtlcnNNYXAucHV0KHJlc291cmNlR1VJRCwgdm8pOwotCQkJCX0KLQkJCQlDb2xsZWN0aW9uIG1hcmtlcnMgPSAoQ29sbGVjdGlvbikgdm8ub2JqZWN0OwotCQkJCW1hcmtlcnMuYWRkKG1hcmtlcik7Ci0JCQl9Ci0JCQlTdHJpbmcgZWxlbWVudEdVSUQgPSB1cmkuZnJhZ21lbnQoKTsKLQkJCUNvbGxlY3Rpb24gbWFya2VycyA9IChDb2xsZWN0aW9uKSBlbGVtZW50R1VJVG9NYXJrZXJzTWFwLmdldChlbGVtZW50R1VJRCk7Ci0JCQlpZihtYXJrZXJzID09IG51bGwpIHsKLQkJCQltYXJrZXJzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQllbGVtZW50R1VJVG9NYXJrZXJzTWFwLnB1dChlbGVtZW50R1VJRCwgbWFya2Vycyk7Ci0JCQl9Ci0JCQltYXJrZXJzLmFkZChuZXcgVmFsaWRPYmplY3QobWFya2VyKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhckFsbCgpIHsKLQkJYm9vbGVhbiBvbGRFbmFibGVkID0gZW5hYmxlZDsKLQkJdHJ5IHsKLQkJCWVuYWJsZWQgPSBmYWxzZTsKLQkJCWNhbmNlbCgpOwotCi0JCQlzeW5jaHJvbml6ZWQgKGV4Y2VwdGlvbnMpIHsKLQkJCQl1cmlUb0V4Y2VwdGlvbnNNYXAuY2xlYXIoKTsKLQkJCQlleGNlcHRpb25zLmNsZWFyKCk7Ci0JCQl9Ci0JCQlzeW5jaHJvbml6ZWQoZWxlbWVudEdVSVRvTWFya2Vyc01hcCkgewotCQkJCWlmKCFlbGVtZW50R1VJVG9NYXJrZXJzTWFwLmlzRW1wdHkoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50R1VJVG9NYXJrZXJzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJQ29sbGVjdGlvbiBtYXJrZXJzID0gKENvbGxlY3Rpb24pIGl0ZXIubmV4dCgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IG1hcmtlcnMuaXRlcmF0b3IoKTsgaXRlcjEuaGFzTmV4dCgpOykgewotCQkJCQkJCVZhbGlkT2JqZWN0IHZvID0gKFZhbGlkT2JqZWN0KSBpdGVyMS5uZXh0KCk7Ci0JCQkJCQkJSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgdm8ub2JqZWN0OwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWlmKG1hcmtlci5leGlzdHMoKSkgewotCQkJCQkJCQkJbWFya2VyLmRlbGV0ZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJbWFya2Vycy5jbGVhcigpOwotCQkJCQl9Ci0JCQkJCWVsZW1lbnRHVUlUb01hcmtlcnNNYXAuY2xlYXIoKTsKLQkJCQkJcmVzb3VyY2VHVUlUb01hcmtlcnNNYXAuY2xlYXIoKTsKLQkJCQl9CQotCQkJfQotCQkJc3luY2hyb25pemVkKHJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzKSB7Ci0JCQkJcmVzb3VyY2VzVG9WYWxpZGF0ZU1hcmtlcnMuY2xlYXIoKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWVuYWJsZWQgPSBvbGRFbmFibGVkOwotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIuY2xlYXJBbGwoKTogZW5kIik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNVbnJlc29sdmVkUHJveHkoKSB7Ci0JCXJldHVybiAhZWxlbWVudEdVSVRvTWFya2Vyc01hcC5pc0VtcHR5KCk7Ci0JfQotCQotCXByaXZhdGUgUmVzb2x2ZUV4Y2VwdGlvbiBuZXh0RXhjZXB0aW9uKCkgewotCQlzeW5jaHJvbml6ZWQoZXhjZXB0aW9ucykgewkJCQotCQkJLy8gc3luY2hyb25pemVkOiBpbiBvcmRlciB0byBhdG9taWNhbGx5IG9idGFpbiBhbmQgY2xlYXIgcmVxdWVzdHMKLQkJCWlmKGV4Y2VwdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlSZXNvbHZlRXhjZXB0aW9uIGUgPSAoUmVzb2x2ZUV4Y2VwdGlvbikgdGhpcy5leGNlcHRpb25zLnJlbW92ZSgwKTsKLQkJCQlVUkkgdXJpID0gKChJbnRlcm5hbEVPYmplY3QpZS5nZXRQcm94eSgpKS5lUHJveHlVUkkoKTsKLQkJCQlDb2xsZWN0aW9uIGV4Y2VwdGlvbnMgPSAoQ29sbGVjdGlvbikgdXJpVG9FeGNlcHRpb25zTWFwLmdldCh1cmkpOwotCQkJCWlmKGV4Y2VwdGlvbnMgIT0gbnVsbCkgewotCQkJCQlleGNlcHRpb25zLnJlbW92ZShlKTsKLQkJCQkJaWYoZXhjZXB0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQkJCXVyaVRvRXhjZXB0aW9uc01hcC5yZW1vdmUodXJpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIFJlc291cmNlIG5leHRSZXNvdXJjZVRvVmFsaWRhdGVNYXJrZXJzKCkgewotCQlzeW5jaHJvbml6ZWQocmVzb3VyY2VzVG9WYWxpZGF0ZU1hcmtlcnMpIHsKLQkJCWlmKHJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIChSZXNvdXJjZSkgcmVzb3VyY2VzVG9WYWxpZGF0ZU1hcmtlcnMucmVtb3ZlKDApOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCB5aWVsZCgpIHsKLQkJdHJ5IHsKLQkJCVRocmVhZC5zbGVlcCgxMCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vCi0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuV29ya3NwYWNlSm9iI3J1bkluV29ya3NwYWNlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlci5ydW5JbldvcmtzcGFjZSgpOiBiZWdpbiIpOwotCQl0cnkgewotCQlpZighZW5hYmxlZCkgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0KLQkJdHJ5IHsKLQkJCS8vIGFkZCBtYXJrZXJzCi0JCQkvLwotCQkJUmVzb2x2ZUV4Y2VwdGlvbiByZTsKLQkJCXdoaWxlKCFtb25pdG9yLmlzQ2FuY2VsZWQoKSAmJiAocmUgPSBuZXh0RXhjZXB0aW9uKCkpICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlhZGRNYXJrZXIocmUsIG1vbml0b3IpOwotCQkJCX0KLQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQkKLQkJCQl5aWVsZCgpOwotCQkJfQotCQkJCi0JCQlpZihtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJfQotCQkJCi0JCQkvLyByZW1vdmUgaW52YWxpZCBtYXJrZXJzCi0JCQkvLwotCQkJcmVtb3ZlTWFya2Vycyhtb25pdG9yKTsKLQkJCXlpZWxkKCk7Ci0JCQkKLQkJCS8vIHZhbGlkYXRlIHJlc291cmNlIG1hcmtlcnMKLQkJCS8vCi0JCQlSZXNvdXJjZSByZXNvdXJjZTsKLQkJCXdoaWxlKCFtb25pdG9yLmlzQ2FuY2VsZWQoKSAmJiAocmVzb3VyY2UgPSBuZXh0UmVzb3VyY2VUb1ZhbGlkYXRlTWFya2VycygpKSAhPSBudWxsKSB7Ci0JCQkJZG9WYWxpZGF0ZU1hcmtlcnMocmVzb3VyY2UpOwotCQkJCXlpZWxkKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCWlmKGUgaW5zdGFuY2VvZiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbikgewotCQkJCXRocm93IChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbikgZTsKLQkJCX0KLQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQkKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJZmluYWxseSB7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlci5ydW5JbldvcmtzcGFjZSgpOiBlbmQiKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gcmVtb3ZlRnJvbVJlc291cmNlR1VJRFRvTWFya2Vyc01hcChTdHJpbmcgcHJveHlVUkksIElNYXJrZXIgbWFya2VyKSB7Ci0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHByb3h5VVJJKTsKLQkJU3RyaW5nIHJlc291cmNlR1VJRCA9IHVyaS5hdXRob3JpdHkoKTsKLQkJaWYocmVzb3VyY2VHVUlEICE9IG51bGwpIHsKLQkJCVZhbGlkT2JqZWN0IHZvID0gKFZhbGlkT2JqZWN0KSByZXNvdXJjZUdVSVRvTWFya2Vyc01hcC5nZXQocmVzb3VyY2VHVUlEKTsKLQkJCWlmKHZvICE9IG51bGwpIHsKLQkJCQlDb2xsZWN0aW9uIG1hcmtlcnMgPSAoKENvbGxlY3Rpb24pdm8ub2JqZWN0KTsKLQkJCQlib29sZWFuIHJldCA9IG1hcmtlcnMucmVtb3ZlKG1hcmtlcik7Ci0JCQkJaWYobWFya2Vycy5pc0VtcHR5KCkpIHsKLQkJCQkJcmVzb3VyY2VHVUlUb01hcmtlcnNNYXAucmVtb3ZlKHJlc291cmNlR1VJRCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlRnJvbUVsZW1lbnRHVUlEVG9NYXJrZXJzTWFwKFN0cmluZyBwcm94eVVSSSwgSU1hcmtlciBtYXJrZXIpIHsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkocHJveHlVUkkpOwotCQlTdHJpbmcgZWxlbWVudEdVSUQgPSB1cmkuZnJhZ21lbnQoKTsKLQkJaWYoZWxlbWVudEdVSUQgIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiB2YWxpZE9iamVjdHMgPSAoQ29sbGVjdGlvbikgZWxlbWVudEdVSVRvTWFya2Vyc01hcC5nZXQoZWxlbWVudEdVSUQpOwotCQkJaWYodmFsaWRPYmplY3RzICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMSA9IHZhbGlkT2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyYXRvcjEKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlWYWxpZE9iamVjdCB2bzEgPSAoVmFsaWRPYmplY3QpIGl0ZXJhdG9yMS5uZXh0KCk7Ci0JCQkJCWlmKHZvMS5vYmplY3QgPT0gbWFya2VyKSB7Ci0JCQkJCQlpdGVyYXRvcjEucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYodmFsaWRPYmplY3RzLmlzRW1wdHkoKSkgewotCQkJCQllbGVtZW50R1VJVG9NYXJrZXJzTWFwLnJlbW92ZShlbGVtZW50R1VJRCk7Ci0JCQkJfQkKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlTWFya2VycyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJc3luY2hyb25pemVkKGVsZW1lbnRHVUlUb01hcmtlcnNNYXApIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudEdVSVRvTWFya2Vyc01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUNvbGxlY3Rpb24gbWFya2VycyA9IChDb2xsZWN0aW9uKSBpdGVyLm5leHQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtYXJrZXJzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlWYWxpZE9iamVjdCB2byA9IChWYWxpZE9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmKCF2by52YWxpZCkgewotCQkJCQl0cnkgewotCQkJCQkJSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgdm8ub2JqZWN0OwotCQkJCQkJaWYobWFya2VyLmV4aXN0cygpKSB7Ci0JCQkJCQkJU3RyaW5nIHByb3h5VVJJID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShQUk9YWV9VUkkpOwotCi0JCQkJCQkJbWFya2VyLmRlbGV0ZSgpOwotCi0JCQkJCQkJLy8gcmVtb3ZlIHRoaXMgbWFya2VyIGZyb20gcmVzb3VyY2VHVUlUb01hcmtlcnNNYXAKLQkJCQkJCQkvLwotCQkJCQkJCXJlbW92ZUZyb21SZXNvdXJjZUdVSURUb01hcmtlcnNNYXAocHJveHlVUkksIG1hcmtlcik7Ci0JCQkJCQl9Ci0JCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZUdVSVRvTWFya2Vyc01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVZhbGlkT2JqZWN0IHZvID0gKFZhbGlkT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKCF2by52YWxpZCkgewotCQkJCXZvLnZhbGlkID0gdHJ1ZTsKLQkJCQlDb2xsZWN0aW9uIG1hcmtlcnMgPSAoQ29sbGVjdGlvbikgdm8ub2JqZWN0OwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtYXJrZXJzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJSU1hcmtlciBtYXJrZXI7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltYXJrZXIgPSAoSU1hcmtlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYobWFya2VyLmV4aXN0cygpKSB7Ci0JCQkJCQkJU3RyaW5nIHByb3h5VVJJU3RyID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShQUk9YWV9VUkkpOwotCQkJCQkJCVVSSSBwcm94eVVSSSA9IFVSSS5jcmVhdGVVUkkocHJveHlVUklTdHIpOwotCi0JCQkJCQkJLy8gcHJveHkgaXMgaW4gdGhlIHNhbWUgcmVzb3VyY2UgdGhhdCBpcyBqdXN0IGxvYWRlZCAKLQkJCQkJCQkvLyB0cnkgdG8gZ2V0IHRoZSBvYmplY3Qgd2l0aCB0aGlzIHByb3h5IFVSSSB3aXRob3V0IGxvYWRpbmcgbmV3IHJlc291cmNlCi0JCQkJCQkJLy8KLS8vCQkJCQkJCUVPYmplY3QgbyA9IHJlc291cmNlU2V0LmdldEVPYmplY3QocHJveHlVUkksIGZhbHNlKTsKLQkJCQkJCQlTdHJpbmcgZWxlbWVudEdVSUQgPSBwcm94eVVSSS5mcmFnbWVudCgpOwkJCQkJCQkKLQkJCQkJCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpcmVzb3VyY2VTZXQpLmdldEd1aWRUb01ldGhvZEVsZW1lbnRNYXAoKS5nZXQoZWxlbWVudEdVSUQpOwotCQkJCQkJCWlmKG8gIT0gbnVsbCAmJiAhby5lSXNQcm94eSgpKSB7Ci0JCQkJCQkJCW1hcmtlci5kZWxldGUoKTsKLQkJCQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7CQotCi0JCQkJCQkJCS8vIHJlbW92ZSB0aGlzIG1hcmtlciBmcm9tIGVsZW1lbnRHVUlUb01hcmtlcnNNYXAKLQkJCQkJCQkJLy8KLQkJCQkJCQkJcmVtb3ZlRnJvbUVsZW1lbnRHVUlEVG9NYXJrZXJzTWFwKHByb3h5VVJJU3RyLCBtYXJrZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKG1hcmtlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklQcm94eVJlc29sdXRpb25MaXN0ZW5lciNub3RpZnlFeGNlcHRpb24oamF2YS5sYW5nLkV4Y2VwdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQkJaWYoIWVuYWJsZWQpIHJldHVybjsKLQkJCi0JCWlmKGUgaW5zdGFuY2VvZiBSZXNvbHZlRXhjZXB0aW9uKSB7Ci0JCQlSZXNvbHZlRXhjZXB0aW9uIHJlID0gKFJlc29sdmVFeGNlcHRpb24pIGU7Ci0JCQkKLS8vCQkJVVJJIHVyaSA9ICgoSW50ZXJuYWxFT2JqZWN0KXJlLmdldFByb3h5KCkpLmVQcm94eVVSSSgpOwotLy8JCQlpZigiXzJKNFlvUFRERWRta3BZQVJOTjQ2OEEiLmVxdWFscyh1cmkuZnJhZ21lbnQoKSkpIHsKLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotLy8JCQl9Ci0JCQkKLQkJCWlmKGFkZEV4Y2VwdGlvbihyZSkgJiYgYXV0b1NjaGVkdWxlZCkgewkJCQotCQkJCXNjaGVkdWxlKERFTEFZKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBdXRvU2NoZWR1bGVkKGJvb2xlYW4gYikgewotCQlhdXRvU2NoZWR1bGVkID0gYjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNBdXRvU2NoZWR1bGVkKCkgewotCQlyZXR1cm4gYXV0b1NjaGVkdWxlZDsKLQl9Ci0JCi0JLyoqCi0JICogU2NoZWR1bGVzIHRoaXMgam9iIGlmIGV4Y2VwdGlvbnMgYXJlIGF2YWlsYWJsZSB0byBsb2cKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdGFydCgpIHsKLQkJaWYoIWVuYWJsZWQpIHJldHVybiBmYWxzZTsKLQkJCi0JCXN5bmNocm9uaXplZCAoZXhjZXB0aW9ucykgewotCQkJaWYoIWV4Y2VwdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJc2NoZWR1bGUoREVMQVkpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKE9iamVjdCBwcm94eSwgT2JqZWN0IHJlc29sdmVkKSB7Ci0JCWlmKCFlbmFibGVkKSByZXR1cm47Ci0JCQotCQlpZihwcm94eSBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkgewotCQkJVVJJIHVyaSA9ICgoSW50ZXJuYWxFT2JqZWN0KXByb3h5KS5lUHJveHlVUkkoKTsKLQkJCQotLy8JCQlpZigiXzJKNFlvUFRERWRta3BZQVJOTjQ2OEEiLmVxdWFscyh1cmkuZnJhZ21lbnQoKSkpIHsKLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotLy8JCQl9Ci0JCQkKLQkJCS8vIHJlbW92ZSBhbGwgZXhjZXB0aW9ucyBmb3IgdGhpcyBVUkkKLQkJCS8vCi0JCQlyZW1vdmVFeGNlcHRpb25zKHVyaSk7Ci0JCQkKLQkJCS8vIGludmFsaWRhdGUgYWxsIG1hcmtlcnMgZm9yIHRoaXMgVVJJCi0JCQkvLwotCQkJaWYoaW52YWxpZGF0ZU1hcmtlcnModXJpKSkgewotCQkJCXNjaGVkdWxlKERFTEFZKTsKLQkJCX0JCQkJCQkKLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIEBwYXJhbSB1cmkKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaW52YWxpZGF0ZU1hcmtlcnMoVVJJIHVyaSkgewotCQlzeW5jaHJvbml6ZWQoZWxlbWVudEdVSVRvTWFya2Vyc01hcCkgewotCQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJCVN0cmluZyByZXNvdXJjZUdVSUQgPSB1cmkuYXV0aG9yaXR5KCk7Ci0JCQlpZihyZXNvdXJjZUdVSUQgIT0gbnVsbCkgewotCQkJCVZhbGlkT2JqZWN0IHZvID0gKFZhbGlkT2JqZWN0KSByZXNvdXJjZUdVSVRvTWFya2Vyc01hcC5nZXQocmVzb3VyY2VHVUlEKTsKLQkJCQlpZih2byAhPSBudWxsKSB7Ci0JCQkJCXZvLnZhbGlkID0gZmFsc2U7Ci0JCQkJCXJldCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nIGVsZW1lbnRHVUlEID0gdXJpLmZyYWdtZW50KCk7Ci0JCQlpZihlbGVtZW50R1VJRCAhPSBudWxsKSB7Ci0JCQkJQ29sbGVjdGlvbiBtYXJrZXJzID0gKENvbGxlY3Rpb24pIGVsZW1lbnRHVUlUb01hcmtlcnNNYXAuZ2V0KGVsZW1lbnRHVUlEKTsKLQkJCQlpZihtYXJrZXJzICE9IG51bGwgJiYgIW1hcmtlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCXJldCA9IHRydWU7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1hcmtlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlWYWxpZE9iamVjdCB2byA9IChWYWxpZE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCQl2by52YWxpZCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB1cmkKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlRXhjZXB0aW9ucyhVUkkgdXJpKSB7Ci0JCXN5bmNocm9uaXplZCAoZXhjZXB0aW9ucykgewotCQkJQ29sbGVjdGlvbiBleGNlcHRpb25zID0gKENvbGxlY3Rpb24pIHVyaVRvRXhjZXB0aW9uc01hcC5nZXQodXJpKTsKLQkJCWlmKGV4Y2VwdGlvbnMgPT0gbnVsbCB8fCBleGNlcHRpb25zLmlzRW1wdHkoKSkgcmV0dXJuOwotCQkJdGhpcy5leGNlcHRpb25zLnJlbW92ZUFsbChleGNlcHRpb25zKTsKLQkJCXVyaVRvRXhjZXB0aW9uc01hcC5yZW1vdmUodXJpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENsZWFycyBtYXJrZXJzIGZvciB1bnJlc29sdmVkIHByb3hpZXMgb2YgdGhlIGdpdmVuIHJlc291cmNlCi0JICogIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyTWFya2VycyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQl0cnkgewotCQkJSVJlc291cmNlIGZpbGUgPSBGaWxlTWFuYWdlci5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCWlmKGZpbGUgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gZmlsZS5maW5kTWFya2VycyhNQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJcmVtb3ZlTWFya2VyKG1hcmtlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0JCVN0cmluZyBwcm94eVVSSSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZihtYXJrZXIuZXhpc3RzKCkpIHsKLQkJCQlwcm94eVVSSSA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoUFJPWFlfVVJJKTsKLQkJCQltYXJrZXIuZGVsZXRlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJaWYocHJveHlVUkkgIT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkKGVsZW1lbnRHVUlUb01hcmtlcnNNYXApIHsKLQkJCQlyZW1vdmVGcm9tRWxlbWVudEdVSURUb01hcmtlcnNNYXAocHJveHlVUkksIG1hcmtlcik7Ci0JCQkJcmVtb3ZlRnJvbVJlc291cmNlR1VJRFRvTWFya2Vyc01hcChwcm94eVVSSSwgbWFya2VyKTsKLQkJCX0KLQkJfQkJCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWFya2VySW5mbyB7Ci0JCVN0cmluZyBwcm94eVVSSTsKLQkJU3RyaW5nIG93bmVyR1VJRDsKLQkJU3RyaW5nIG1lc3NhZ2U7Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBNYXJrZXJJbmZvKSB7Ci0JCQkJTWFya2VySW5mbyBpbmZvID0gKE1hcmtlckluZm8pIG9iajsKLQkJCQlpZihwcm94eVVSSSAhPSBudWxsICYmIG93bmVyR1VJRCAhPSBudWxsICYmIHByb3h5VVJJLmVxdWFscyhpbmZvLnByb3h5VVJJKSAmJiBvd25lckdVSUQuZXF1YWxzKGluZm8ub3duZXJHVUlEKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJaW50IHJlc3VsdCA9IHByb3h5VVJJLmhhc2hDb2RlKCk7Ci0JCQlyZXN1bHQgXj0gb3duZXJHVUlELmhhc2hDb2RlKCk7Ci0JCQlyZXN1bHQgXj0gbWVzc2FnZS5oYXNoQ29kZSgpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBWYWxpZGF0ZXMgbWFya2VycyBmb3IgdW5yZXNvbHZlZCBwcm94aWVzIG9mIHRoZSBnaXZlbiByZXNvdXJjZQotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlTWFya2VycyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQlib29sZWFuIG5ld2x5QWRkZWQgPSBmYWxzZTsKLQkJc3luY2hyb25pemVkKHJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzKSB7Ci0JCQluZXdseUFkZGVkID0gcmVzb3VyY2VzVG9WYWxpZGF0ZU1hcmtlcnMuYWRkKHJlc291cmNlKTsKLQkJfQotCQlpZihuZXdseUFkZGVkKSB7Ci0JCQlzY2hlZHVsZShERUxBWSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZUFsbE1hcmtlcnMoKSB7Ci0JCWJvb2xlYW4gbmV3bHlBZGRlZCA9IGZhbHNlOwotCQlzeW5jaHJvbml6ZWQocmVzb3VyY2VzVG9WYWxpZGF0ZU1hcmtlcnMpIHsKLQkJCWlmKCFlbGVtZW50R1VJVG9NYXJrZXJzTWFwLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRHVUlUb01hcmtlcnNNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUNvbGxlY3Rpb24gbWFya2VycyA9IChDb2xsZWN0aW9uKSBpdGVyLm5leHQoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IG1hcmtlcnMuaXRlcmF0b3IoKTsgaXRlcjEuaGFzTmV4dCgpOykgewotCQkJCQkJVmFsaWRPYmplY3Qgdm8gPSAoVmFsaWRPYmplY3QpIGl0ZXIxLm5leHQoKTsKLQkJCQkJCUlNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpIHZvLm9iamVjdDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJU3RyaW5nIGxvY2F0aW9uID0gKFN0cmluZyltYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTE9DQVRJT04pOwotCQkJCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlRmlsZVVSSShsb2NhdGlvbik7Ci0JCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZSh1cmksIHRydWUpOwotCQkJCQkJCW5ld2x5QWRkZWQgPSByZXNvdXJjZXNUb1ZhbGlkYXRlTWFya2Vycy5hZGQocmVzb3VyY2UpIHwgbmV3bHlBZGRlZDsKLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZihuZXdseUFkZGVkKSB7Ci0JCQlzY2hlZHVsZShERUxBWSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9WYWxpZGF0ZU1hcmtlcnMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJdHJ5IHsKLQkJCUlSZXNvdXJjZSBmaWxlID0gRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlpZihmaWxlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQlJTWFya2VyW10gbWFya2VycyA9IGZpbGUuZmluZE1hcmtlcnMoTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCUhhc2hTZXQ8SU1hcmtlcj4gbWFya2Vyc1RvVXBkYXRlID0gbmV3IEhhc2hTZXQ8SU1hcmtlcj4oKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJCQlTdHJpbmcgcHJveHlVUkkgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKFBST1hZX1VSSSk7Ci0JCQkJCWlmKHByb3h5VVJJICE9IG51bGwpIHsKLQkJCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHByb3h5VVJJKTsKLQkJCQkJCS8vIHRyeSB0byBnZXQgdGhlIG9iamVjdCB3aXRoIHRoaXMgcHJveHkgVVJJIHdpdGhvdXQgbG9hZGluZyBuZXcgcmVzb3VyY2UKLQkJCQkJCS8vCi0JCQkJCQlTdHJpbmcgZWxlbWVudEdVSUQgPSB1cmkuZnJhZ21lbnQoKTsJCQkJCQkJCi0JCQkJCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpcmVzb3VyY2VTZXQpLmdldEd1aWRUb01ldGhvZEVsZW1lbnRNYXAoKS5nZXQoZWxlbWVudEdVSUQpOwotCQkJCQkJaWYobyA9PSBudWxsIHx8IG8uZUlzUHJveHkoKSkgewotCQkJCQkJCS8vIG1hcmtlciBzdGlsbCBjYW4gZXhpc3QsIG5lZWQgdG8gdXBkYXRlIGl0Ci0JCQkJCQkJLy8KLQkJCQkJCQltYXJrZXJzVG9VcGRhdGUuYWRkKG1hcmtlcik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBvYmplY3QgaXMgcmVzb2x2ZWQsIG11c3QgZGVsZXRlIG1hcmtlcgotCQkJCQkJCS8vCi0JCQkJCQkJaWYobWFya2VyLmV4aXN0cygpKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQltYXJrZXIuZGVsZXRlKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsJCQkJCQkJCQkKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlzeW5jaHJvbml6ZWQoZWxlbWVudEdVSVRvTWFya2Vyc01hcCkgewotCQkJCQkJCQlyZW1vdmVGcm9tRWxlbWVudEdVSURUb01hcmtlcnNNYXAocHJveHlVUkksIG1hcmtlcik7Ci0JCQkJCQkJCXJlbW92ZUZyb21SZXNvdXJjZUdVSURUb01hcmtlcnNNYXAocHJveHlVUkksIG1hcmtlcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKCFtYXJrZXJzVG9VcGRhdGUuaXNFbXB0eSgpKSB7Ci0JCQkJCUlNYXJrZXJbXSBtYXJrZXJBcnJheSA9IG5ldyBJTWFya2VyW21hcmtlcnNUb1VwZGF0ZS5zaXplKCldOwotCQkJCQltYXJrZXJzVG9VcGRhdGUudG9BcnJheShtYXJrZXJBcnJheSk7Ci0JCQkJCXVwZGF0ZU1hcmtlcihtYXJrZXJBcnJheSwgcmVzb3VyY2UsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwkJCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjNmYTA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBwZXJzaXN0aW5nIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VEZXNjcmlwdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9SZXNvdXJjZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk0YzIzOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9SZXNvdXJjZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc291cmNlIERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciNnZXRVcmkgPGVtPlVyaTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlI2dldFJlc291cmNlRGVzY3JpcHRvcigpCi0gKiBAbW9kZWwKLSAqIEBleHRlbmRzIEVEYXRhT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VEZXNjcmlwdG9yIGV4dGVuZHMgRURhdGFPYmplY3QgewotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlI2dldFJlc291cmNlRGVzY3JpcHRvcl9JZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICB2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVyaTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vcmk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVyaShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2UjZ2V0UmVzb3VyY2VEZXNjcmlwdG9yX1VyaSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFN0cmluZyBnZXRVcmkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yI2dldFVyaSA8ZW0+VXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vcmk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVyaSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHZvaWQgc2V0VXJpKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICBVUkkgZ2V0UmVzb2x2ZWRVUkkoKTsKLSAgICAKLSAgICB2b2lkIHNldFJlc29sdmVkVVJJKFVSSSB1cmkpOwotCQotCS8qKgotCSAqIENsZWFycyB0aGUgcmVzb2x2ZWQgVVJJIHRoYXQgaGFzIGJlZW4gY2FjaGVkIGluIHByZXZpb3VzIGNhbGxlZCBvZiBnZXRSZXNvbHZlZFVSSSgpCi0JICogc28gdGhlIG5leHQgY2FsbCB0byBnZXRSZXNvbHZlZFVSSSgpIHdpbGwgdXBkYXRlIHRoZSByZXNvbHZlZFVSSS4KLQkgKgotCSAqLwotCXZvaWQgY2xlYXJSZXNvbHZlZFVSSSgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGRmNTM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5FRGF0YU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzb3VyY2UgTWFuYWdlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNnZXRHdWlkIDxlbT5HdWlkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNnZXRVcmlCYXNlIDxlbT5VcmkgQmFzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0U3ViTWFuYWdlcnMgPGVtPlN1YiBNYW5hZ2VyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycyA8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSNnZXRSZXNvdXJjZU1hbmFnZXIoKQotICogQG1vZGVsCi0gKiBAZXh0ZW5kcyBFRGF0YU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlTWFuYWdlciBleHRlbmRzIEVEYXRhT2JqZWN0IHsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HdWlkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkd1aWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEd1aWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlI2dldFJlc291cmNlTWFuYWdlcl9HdWlkKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEd1aWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldEd1aWQgPGVtPkd1aWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkd1aWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEd1aWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEd1aWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVyaSBCYXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VcmkgQmFzZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VcmkgQmFzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VXJpQmFzZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2UjZ2V0UmVzb3VyY2VNYW5hZ2VyX1VyaUJhc2UoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VXJpQmFzZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0VXJpQmFzZSA8ZW0+VXJpIEJhc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVyaSBCYXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVcmlCYXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVcmlCYXNlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWIgTWFuYWdlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWIgTWFuYWdlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWIgTWFuYWdlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2UjZ2V0UmVzb3VyY2VNYW5hZ2VyX1N1Yk1hbmFnZXJzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxSZXNvdXJjZU1hbmFnZXI+IGdldFN1Yk1hbmFnZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZSBEZXNjcmlwdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc291cmNlIERlc2NyaXB0b3JzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2UjZ2V0UmVzb3VyY2VNYW5hZ2VyX1Jlc291cmNlRGVzY3JpcHRvcnMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBMaXN0PFJlc291cmNlRGVzY3JpcHRvcj4gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBHZXRzIGRpcmVjdCBSZXNvdXJjZURlc2NyaXB0b3Igd2hvc2UgaWQgaXMgdGhlIGdpdmVuIGd1aWQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlc291cmNlRGVzY3JpcHRvciBnZXRSZXNvdXJjZURlc2NyaXB0b3IoU3RyaW5nIGd1aWQpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgUmVzb3VyY2VEZXNjcmlwdG9yIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHVyaS4gSWYgY2xlYXJGb2xkZXIgaXMgdHJ1ZSwgdGhpcyBjYWxsIHdpbGwgcmVtb3ZlCi0gICAgICogYWxsIG90aGVyIFJlc291cmNlRGVzY3JpcHRvcnMgd2hvc2UgVVJJIHNoYXJlcyB0aGUgc2FtZSBmb2xkZXIgb2YgdGhlIGdpdmVuIHVyaS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICogQHBhcmFtIGNsZWFyRm9sZGVyCi0gICAgICogQHJldHVybiBsaXN0IG9mIFJlc291cmNlRGVzY3JpcHRvcnMgdGhhdCBoYWQgYmVlbiByZW1vdmVkCi0gICAgICovCi0gICAgTGlzdDxSZXNvdXJjZURlc2NyaXB0b3I+IHJlbW92ZVJlc291cmNlRGVzY3JpcHRvcihVUkkgdXJpLCBib29sZWFuIGNsZWFyRm9sZGVyKTsKLQotCXZvaWQgZGlzcG9zZSgpOwotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODg2Y2FjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlbWFuYWdlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFJlc291cmNlbWFuYWdlckZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlbWFuYWdlckZhY3RvcnlJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgUmVzb3VyY2VEZXNjcmlwdG9yIGNyZWF0ZVJlc291cmNlRGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZSBNYW5hZ2VyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZSBNYW5hZ2VyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBSZXNvdXJjZU1hbmFnZXIgY3JlYXRlUmVzb3VyY2VNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFJlc291cmNlbWFuYWdlclBhY2thZ2UgZ2V0UmVzb3VyY2VtYW5hZ2VyUGFja2FnZSgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9SZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9SZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZTE5YWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlckZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBTdHJpbmcgZU5BTUUgPSAicmVzb3VyY2VtYW5hZ2VyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFJlc291cmNlbWFuYWdlclBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlbWFuYWdlclBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlRGVzY3JpcHRvckltcGwgPGVtPlJlc291cmNlIERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VEZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlbWFuYWdlclBhY2thZ2VJbXBsI2dldFJlc291cmNlRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIGludCBSRVNPVVJDRV9ERVNDUklQVE9SID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IFJFU09VUkNFX0RFU0NSSVBUT1JfX0lEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBSRVNPVVJDRV9ERVNDUklQVE9SX19VUkkgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJlc291cmNlIERlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgUkVTT1VSQ0VfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlTWFuYWdlckltcGwgPGVtPlJlc291cmNlIE1hbmFnZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VNYW5hZ2VySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlbWFuYWdlclBhY2thZ2VJbXBsI2dldFJlc291cmNlTWFuYWdlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIGludCBSRVNPVVJDRV9NQU5BR0VSID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfTUFOQUdFUl9fR1VJRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXJpIEJhc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9NQU5BR0VSX19VUklfQkFTRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIE1hbmFnZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9NQU5BR0VSX19TVUJfTUFOQUdFUlMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIERlc2NyaXB0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBSRVNPVVJDRV9NQU5BR0VSX19SRVNPVVJDRV9ERVNDUklQVE9SUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVzb3VyY2UgTWFuYWdlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBSRVNPVVJDRV9NQU5BR0VSX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciA8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUNsYXNzIGdldFJlc291cmNlRGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yI2dldElkKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQXR0cmlidXRlIGdldFJlc291cmNlRGVzY3JpcHRvcl9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciNnZXRVcmkgPGVtPlVyaTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVyaTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yI2dldFVyaSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZURlc2NyaXB0b3JfVXJpKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciA8ZW0+UmVzb3VyY2UgTWFuYWdlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZXNvdXJjZSBNYW5hZ2VyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUNsYXNzIGdldFJlc291cmNlTWFuYWdlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNnZXRHdWlkIDxlbT5HdWlkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R3VpZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldEd1aWQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlTWFuYWdlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VNYW5hZ2VyX0d1aWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0VXJpQmFzZSA8ZW0+VXJpIEJhc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VcmkgQmFzZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFVyaUJhc2UoKQotCSAqIEBzZWUgI2dldFJlc291cmNlTWFuYWdlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VNYW5hZ2VyX1VyaUJhc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNnZXRTdWJNYW5hZ2VycyA8ZW0+U3ViIE1hbmFnZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWIgTWFuYWdlcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNnZXRTdWJNYW5hZ2VycygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VNYW5hZ2VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZU1hbmFnZXJfU3ViTWFuYWdlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNnZXRSZXNvdXJjZURlc2NyaXB0b3JzIDxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZU1hbmFnZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFUmVmZXJlbmNlIGdldFJlc291cmNlTWFuYWdlcl9SZXNvdXJjZURlc2NyaXB0b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5IGdldFJlc291cmNlbWFuYWdlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCWludGVyZmFjZSBMaXRlcmFscyAgewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZURlc2NyaXB0b3JJbXBsIDxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlRGVzY3JpcHRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwjZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJFU09VUkNFX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX0RFU0NSSVBUT1JfX0lEID0gZUlOU1RBTkNFLmdldFJlc291cmNlRGVzY3JpcHRvcl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfREVTQ1JJUFRPUl9fVVJJID0gZUlOU1RBTkNFLmdldFJlc291cmNlRGVzY3JpcHRvcl9VcmkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZU1hbmFnZXJJbXBsIDxlbT5SZXNvdXJjZSBNYW5hZ2VyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlTWFuYWdlckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwjZ2V0UmVzb3VyY2VNYW5hZ2VyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJFU09VUkNFX01BTkFHRVIgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VNYW5hZ2VyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfTUFOQUdFUl9fR1VJRCA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZU1hbmFnZXJfR3VpZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXJpIEJhc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9NQU5BR0VSX19VUklfQkFTRSA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZU1hbmFnZXJfVXJpQmFzZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViIE1hbmFnZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBSRVNPVVJDRV9NQU5BR0VSX19TVUJfTUFOQUdFUlMgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VNYW5hZ2VyX1N1Yk1hbmFnZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBEZXNjcmlwdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVTT1VSQ0VfTUFOQUdFUl9fUkVTT1VSQ0VfREVTQ1JJUFRPUlMgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VNYW5hZ2VyX1Jlc291cmNlRGVzY3JpcHRvcnMoKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZURlc2NyaXB0b3JJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL1Jlc291cmNlRGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU3Yjg4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL1Jlc291cmNlRGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzb3VyY2UgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlRGVzY3JpcHRvckltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VEZXNjcmlwdG9ySW1wbCNnZXRVcmkgPGVtPlVyaTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlRGVzY3JpcHRvckltcGwgZXh0ZW5kcyBNdWx0aVJlc291cmNlRU9iamVjdCBpbXBsZW1lbnRzIFJlc291cmNlRGVzY3JpcHRvciB7Ci0JCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU2NzI1MDgyNjYyMzg1NDYyTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVyaSgpIDxlbT5Vcmk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVyaSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVyaSgpIDxlbT5Vcmk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVyaSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyB1cmkgPSBVUklfRURFRkFVTFQ7Ci0KLQlwcm90ZWN0ZWQgVVJJIHJlc29sdmVkVVJJOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIFJlc291cmNlRGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0gIAotIC8vVU1BLS0+Ci0gCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLSAvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5MaXRlcmFscy5SRVNPVVJDRV9ERVNDUklQVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfREVTQ1JJUFRPUl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0gICAgcHVibGljIFN0cmluZyBnZXRVcmkoKSB7Ci0JCWlmKHJlc29sdmVkVVJJICE9IG51bGwgJiYgKHVyaSA9PSBudWxsIHx8IHVyaS5zdGFydHNXaXRoKCIuLi8iKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJdXJpID0gcmVzb2x2ZWRVUkkuZGVyZXNvbHZlKE11bHRpRmlsZVNhdmVVdGlsLmdldEZpbmFsVVJJKGVSZXNvdXJjZSgpKSkudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gdXJpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVyaShTdHJpbmcgbmV3VXJpKSB7Ci0JCVN0cmluZyBvbGRVcmkgPSB1cmk7Ci0JCXVyaSA9IG5ld1VyaTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SX19VUkksIG9sZFVyaSwgdXJpKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1JfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1JfX1VSSToKLQkJCQlyZXR1cm4gZ2V0VXJpKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfREVTQ1JJUFRPUl9fVVJJOgotCQkJCXNldFVyaSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1JfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfREVTQ1JJUFRPUl9fVVJJOgotCQkJCXNldFVyaShVUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZihmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0vL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfREVTQ1JJUFRPUl9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfREVTQ1JJUFRPUl9fVVJJOgotCQkJCXJldHVybiBVUklfRURFRkFVTFQgPT0gbnVsbCA/IHVyaSAhPSBudWxsIDogIVVSSV9FREVGQVVMVC5lcXVhbHModXJpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB1cmk6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodXJpKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yI2dldFVSSSgpCi0JICovCi0JcHVibGljIFVSSSBnZXRSZXNvbHZlZFVSSSgpIHsKLQkJaWYocmVzb2x2ZWRVUkkgPT0gbnVsbCkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlUmVzb3VyY2UoKTsKLQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlVUkkgYmFzZSA9IE11bHRpRmlsZVNhdmVVdGlsLmdldEZpbmFsVVJJKGVSZXNvdXJjZSgpKTsKLQkJCQlyZXNvbHZlZFVSSSA9IFVSSS5jcmVhdGVVUkkoZ2V0VXJpKCkpLnJlc29sdmUoYmFzZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXNvbHZlZFVSSSA9IFVSSS5jcmVhdGVVUkkoZ2V0VXJpKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvbHZlZFVSSTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3Ijc2V0VVJJKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb2x2ZWRVUkkoVVJJIHVyaSkgewkJCi0JCXJlc29sdmVkVVJJID0gdXJpOwotCQlTdHJpbmcgbmV3VXJpID0gbnVsbDsKLQkJaWYocmVzb2x2ZWRVUkkgIT0gbnVsbCkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlUmVzb3VyY2UoKTsJCi0JCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJVVJJIGJhc2VVUkkgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShyZXNvdXJjZSk7Ci0JCQkJbmV3VXJpID0gcmVzb2x2ZWRVUkkuZGVyZXNvbHZlKGJhc2VVUkkpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJc2V0VXJpKG5ld1VyaSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yI2NsZWFyUmVzb2x2ZWRVUkkoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyUmVzb2x2ZWRVUkkoKSB7Ci0JCXJlc29sdmVkVVJJID0gbnVsbDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL1Jlc291cmNlTWFuYWdlckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VNYW5hZ2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjA2MmZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VNYW5hZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc291cmNlIE1hbmFnZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZU1hbmFnZXJJbXBsI2dldEd1aWQgPGVtPkd1aWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZU1hbmFnZXJJbXBsI2dldFVyaUJhc2UgPGVtPlVyaSBCYXNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VNYW5hZ2VySW1wbCNnZXRTdWJNYW5hZ2VycyA8ZW0+U3ViIE1hbmFnZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VNYW5hZ2VySW1wbCNnZXRSZXNvdXJjZURlc2NyaXB0b3JzIDxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlTWFuYWdlckltcGwgZXh0ZW5kcyBNdWx0aVJlc291cmNlRU9iamVjdCBpbXBsZW1lbnRzIFJlc291cmNlTWFuYWdlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTUxNjQ0NzE0NzU1MDkxNjkyMDRMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEd1aWQoKSA8ZW0+R3VpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3VpZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHdWlkKCkgPGVtPkd1aWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEd1aWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ3VpZCA9IEdVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXJpQmFzZSgpIDxlbT5VcmkgQmFzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXJpQmFzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX0JBU0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXJpQmFzZSgpIDxlbT5VcmkgQmFzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXJpQmFzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1cmlCYXNlID0gVVJJX0JBU0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJNYW5hZ2VycygpIDxlbT5TdWIgTWFuYWdlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViTWFuYWdlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzdWJNYW5hZ2VycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkgPGVtPlJlc291cmNlIERlc2NyaXB0b3JzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlRGVzY3JpcHRvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIHByb3RlY3RlZCBFTGlzdCByZXNvdXJjZURlc2NyaXB0b3JzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0gICAgcHJvdGVjdGVkIFJlc291cmNlTWFuYWdlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCQotCQlndWlkID0gVW1hVXRpbC5nZW5lcmF0ZUdVSUQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFJlc291cmNlbWFuYWdlclBhY2thZ2UuTGl0ZXJhbHMuUkVTT1VSQ0VfTUFOQUdFUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEd1aWQoKSB7Ci0JCXJldHVybiBndWlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEd1aWQoU3RyaW5nIG5ld0d1aWQpIHsKLQkJU3RyaW5nIG9sZEd1aWQgPSBndWlkOwotCQlndWlkID0gbmV3R3VpZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19HVUlELCBvbGRHdWlkLCBndWlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVcmlCYXNlKCkgewotCQlyZXR1cm4gdXJpQmFzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcmlCYXNlKFN0cmluZyBuZXdVcmlCYXNlKSB7Ci0JCVN0cmluZyBvbGRVcmlCYXNlID0gdXJpQmFzZTsKLQkJdXJpQmFzZSA9IG5ld1VyaUJhc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fVVJJX0JBU0UsIG9sZFVyaUJhc2UsIHVyaUJhc2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTdWJNYW5hZ2VycygpIHsKLQkJaWYgKHN1Yk1hbmFnZXJzID09IG51bGwpIHsKLQkJCXN1Yk1hbmFnZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZyhSZXNvdXJjZU1hbmFnZXIuY2xhc3MsIHRoaXMsIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fU1VCX01BTkFHRVJTKTsKLQkJfQotCQlyZXR1cm4gc3ViTWFuYWdlcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIExpc3QgZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpIHsKLQkJaWYgKHJlc291cmNlRGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VEZXNjcmlwdG9ycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmcoUmVzb3VyY2VEZXNjcmlwdG9yLmNsYXNzLCB0aGlzLCBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1JFU09VUkNFX0RFU0NSSVBUT1JTKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3VpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChndWlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB1cmlCYXNlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHVyaUJhc2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLwotCS8vIFN0YXJ0IGN1c3RvbSBjb2RlCi0JLy8KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0udW1hZi5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0I2VSZXNvbHZlUHJveHkob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBlUmVzb2x2ZVByb3h5KEludGVybmFsRU9iamVjdCBwcm94eSkgewotCQlyZXR1cm4gc3VwZXIuZVJlc29sdmVQcm94eShwcm94eSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNyZXNvbHZlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvbHZlKCkgewotCQlVUkkgYmFzZSA9IE11bHRpRmlsZVNhdmVVdGlsLmdldEZpbmFsVVJJKGVSZXNvdXJjZSgpKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgUmVzb3VyY2VEZXNjcmlwdG9ySW1wbCBkZXNjID0gKFJlc291cmNlRGVzY3JpcHRvckltcGwpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgZGVzYy5yZXNvbHZlZFVSSSA9IFVSSS5jcmVhdGVVUkkoZGVzYy5nZXRVcmkoKSkucmVzb2x2ZShiYXNlKTsKLSAgICAgICAgfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNkZXJlc29sdmUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlcmVzb2x2ZSgpIHsKLQkJVVJJIGJhc2UgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShlUmVzb3VyY2UoKSk7Ci0gICAgICAgIC8vIGNvbnZlcnQgcGF0aCBpbiBhbGwgZGVzY3JpcHRvcnMgdG8gcmVsYXRpdmUKLSAgICAgICAgLy8KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGRlc2Muc2V0VXJpKGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKS5kZXJlc29sdmUoYmFzZSkudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI3JlbW92ZVJlc291cmNlRGVzY3JpcHRvcihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBMaXN0IHJlbW92ZVJlc291cmNlRGVzY3JpcHRvcihVUkkgdXJpLCBib29sZWFuIGNsZWFyRm9sZGVyKSB7Ci0JCUFycmF5TGlzdCByZW1vdmVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQlSZXNvdXJjZURlc2NyaXB0b3IgcmVtb3ZlZERlc2NyaXB0b3IgPSBudWxsOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYodXJpLmVxdWFscyhkZXNjLmdldFJlc29sdmVkVVJJKCkudHJpbUZyYWdtZW50KCkpKSB7Ci0gICAgICAgICAgICAgICAgaXRlci5yZW1vdmUoKTsKLS8vICAgICAgICAgICAgICAgIHJlbW92ZWREZXNjcmlwdG9yID0gZGVzYzsKLSAgICAgICAgICAgICAgICByZW1vdmVkTGlzdC5hZGQoZGVzYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLS8vICAgICAgICBpZihyZW1vdmVkRGVzY3JpcHRvciAhPSBudWxsKSB7ICAgICAgICAJCi0gICAgICAgIAlpZihjbGVhckZvbGRlcikgewotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhbGwgY2hpbGQgZGVzY3JpcHRvcnMgb2YgdGhlIHJlbW92ZWQgZGVzY3JpcHRvcgotICAgICAgICAJCS8vCi0gICAgICAgIAkJU3RyaW5nIG9sZERpciA9IG5ldyBGaWxlKHVyaS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCkgKyBGaWxlLnNlcGFyYXRvcjsKLSAgICAgICAgCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgIAkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gKFJlc291cmNlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0gICAgICAgIAkJCWlmKGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKS50b0ZpbGVTdHJpbmcoKS5zdGFydHNXaXRoKG9sZERpcikpIHsKLSAgICAgICAgCQkJCWl0ZXIucmVtb3ZlKCk7Ci0gICAgICAgIAkJCQlyZW1vdmVkTGlzdC5hZGQoZGVzYyk7Ci0gICAgICAgIAkJCX0KLSAgICAgICAgCQl9Ci0gICAgICAgIAl9Ci0vLyAgICAgICAgCWVsc2UgewotLy8gICAgICAgIAkJLy8gcmVtb3ZlIGFsbCB0aGUgZGVzY3JpcHRvcnMgb2YgdGhlIHNhbWUgcmVzb3VyY2UKLS8vICAgICAgICAJCS8vCi0vLyAgICAgICAgCQlVUkkgcmVzVXJpID0gcmVtb3ZlZERlc2NyaXB0b3IuZ2V0UmVzb2x2ZWRVUkkoKS50cmltRnJhZ21lbnQoKTsKLS8vICAgICAgICAJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vICAgICAgICAJCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotLy8gICAgICAgIAkJCWlmKGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKS50cmltRnJhZ21lbnQoKS5lcXVhbHMocmVzVXJpKSkgewotLy8gICAgICAgIAkJCQlpdGVyLnJlbW92ZSgpOwotLy8gICAgICAgIAkJCQlyZW1vdmVkTGlzdC5hZGQoZGVzYyk7Ci0vLyAgICAgICAgCQkJfQotLy8gICAgICAgIAkJfSAgICAgICAgCQkKLS8vICAgICAgICAJfQotLy8gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlbW92ZWRMaXN0OwotCX0JCi0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZURlc2NyaXB0b3IgZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKFN0cmluZyBndWlkKSB7Ci0JCWlmKGlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAgPT0gbnVsbCkgewotCQkJaWRUb1Jlc291cmNlRGVzY3JpcHRvck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkKLQkJCWVBZGFwdGVycygpLmFkZChuZXcgQWRhcHRlckltcGwoKSB7Ci0JCSAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCSAgICAgICAgICAgIFJlc291cmNlRGVzY3JpcHRvciBkZXNjOwotCQkgICAgICAgICAgICBzd2l0Y2gobXNnLmdldEZlYXR1cmVJRChSZXNvdXJjZU1hbmFnZXIuY2xhc3MpKSB7Ci0JCSAgICAgICAgICAgICAgICBjYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fUkVTT1VSQ0VfREVTQ1JJUFRPUlM6Ci0JCSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjID0gKFJlc291cmNlRGVzY3JpcHRvciltc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCQkJCWlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAucHV0KGRlc2MuZ2V0SWQoKSwgZGVzYyk7Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKW1zZy5nZXROZXdWYWx1ZSgpKS5pdGVyYXRvcigpOyBpdGVyCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJZGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCQkJCQkJCWlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAucHV0KGRlc2MuZ2V0SWQoKSwgZGVzYyk7Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAucmVtb3ZlKCgoUmVzb3VyY2VEZXNjcmlwdG9yKW1zZy5nZXRPbGRWYWx1ZSgpKS5nZXRJZCgpKTsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pbXNnLmdldE9sZFZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwLnJlbW92ZSgoKFJlc291cmNlRGVzY3JpcHRvcikgaXRlci5uZXh0KCkpLmdldElkKCkpOwotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotCQkgICAgICAgICAgICAgICAgICAgIH0KLQkJICAgICAgICAgICAgfQotCQkgICAgICAgIH0KLQotCQkJfSk7Ci0JCQkKLQkJCS8vIHBvcHVsYXRlIHRoZSBtYXAKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGVsZW1lbnQgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQlpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwLnB1dChlbGVtZW50LmdldElkKCksIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gKFJlc291cmNlRGVzY3JpcHRvcikgaWRUb1Jlc291cmNlRGVzY3JpcHRvck1hcC5nZXQoZ3VpZCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1NVQl9NQU5BR0VSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFN1Yk1hbmFnZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19SRVNPVVJDRV9ERVNDUklQVE9SUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlc291cmNlRGVzY3JpcHRvcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fR1VJRDoKLQkJCQlyZXR1cm4gZ2V0R3VpZCgpOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1VSSV9CQVNFOgotCQkJCXJldHVybiBnZXRVcmlCYXNlKCk7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fU1VCX01BTkFHRVJTOgotCQkJCXJldHVybiBnZXRTdWJNYW5hZ2VycygpOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1JFU09VUkNFX0RFU0NSSVBUT1JTOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19HVUlEOgotCQkJCXNldEd1aWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1VSSV9CQVNFOgotCQkJCXNldFVyaUJhc2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1NVQl9NQU5BR0VSUzoKLQkJCQlnZXRTdWJNYW5hZ2VycygpLmNsZWFyKCk7Ci0JCQkJZ2V0U3ViTWFuYWdlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19SRVNPVVJDRV9ERVNDUklQVE9SUzoKLQkJCQlnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX0dVSUQ6Ci0JCQkJc2V0R3VpZChHVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fVVJJX0JBU0U6Ci0JCQkJc2V0VXJpQmFzZShVUklfQkFTRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1NVQl9NQU5BR0VSUzoKLQkJCQlnZXRTdWJNYW5hZ2VycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1JFU09VUkNFX0RFU0NSSVBUT1JTOgotCQkJCWdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZihmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0vL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fR1VJRDoKLQkJCQlyZXR1cm4gR1VJRF9FREVGQVVMVCA9PSBudWxsID8gZ3VpZCAhPSBudWxsIDogIUdVSURfRURFRkFVTFQuZXF1YWxzKGd1aWQpOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1VSSV9CQVNFOgotCQkJCXJldHVybiBVUklfQkFTRV9FREVGQVVMVCA9PSBudWxsID8gdXJpQmFzZSAhPSBudWxsIDogIVVSSV9CQVNFX0VERUZBVUxULmVxdWFscyh1cmlCYXNlKTsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19TVUJfTUFOQUdFUlM6Ci0JCQkJcmV0dXJuIHN1Yk1hbmFnZXJzICE9IG51bGwgJiYgIXN1Yk1hbmFnZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19SRVNPVVJDRV9ERVNDUklQVE9SUzoKLQkJCQlyZXR1cm4gcmVzb3VyY2VEZXNjcmlwdG9ycyAhPSBudWxsICYmICFyZXNvdXJjZURlc2NyaXB0b3JzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKGlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAgIT0gbnVsbCkgewotCQkJaWRUb1Jlc291cmNlRGVzY3JpcHRvck1hcC5jbGVhcigpOwotCQkJaWRUb1Jlc291cmNlRGVzY3JpcHRvck1hcCA9IG51bGw7Ci0JCX0KLQkJCi0JCWVBZGFwdGVycygpLmNsZWFyKCk7CQkKLQkJCi0JCS8vIGRpc3Bvc2UgdGhlIHN1YiBtYW5hZ2VycwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKEludGVybmFsRUxpc3QpZ2V0U3ViTWFuYWdlcnMoKSkuYmFzaWNJdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlTWFuYWdlciBzdWJNZ3IgPSAoUmVzb3VyY2VNYW5hZ2VyKSBpdGVyLm5leHQoKTsKLQkJCWlmKCEoKEludGVybmFsRU9iamVjdClzdWJNZ3IpLmVJc1Byb3h5KCkpIHsKLQkJCQlzdWJNZ3IuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBNYXAgaWRUb1Jlc291cmNlRGVzY3JpcHRvck1hcDsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZW1hbmFnZXJGYWN0b3J5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZW1hbmFnZXJGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2Y1ZGFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlbWFuYWdlckZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSB7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSBpbml0KCkgewotCQl0cnkgewotCQkJUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSB0aGVSZXNvdXJjZW1hbmFnZXJGYWN0b3J5ID0gKFJlc291cmNlbWFuYWdlckZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCWlmICh0aGVSZXNvdXJjZW1hbmFnZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdGhlUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5SW1wbCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFJlc291cmNlbWFuYWdlckZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfREVTQ1JJUFRPUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJlc291cmNlRGVzY3JpcHRvcigpOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVI6IHJldHVybiAoRU9iamVjdCljcmVhdGVSZXNvdXJjZU1hbmFnZXIoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VEZXNjcmlwdG9yIGNyZWF0ZVJlc291cmNlRGVzY3JpcHRvcigpIHsKLQkJUmVzb3VyY2VEZXNjcmlwdG9ySW1wbCByZXNvdXJjZURlc2NyaXB0b3IgPSBuZXcgUmVzb3VyY2VEZXNjcmlwdG9ySW1wbCgpOwotCQlyZXR1cm4gcmVzb3VyY2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBSZXNvdXJjZU1hbmFnZXIgY3JlYXRlUmVzb3VyY2VNYW5hZ2VyKCkgewotCQlSZXNvdXJjZU1hbmFnZXJJbXBsIHJlc291cmNlTWFuYWdlciA9IG5ldyBSZXNvdXJjZU1hbmFnZXJJbXBsKCk7Ci0JCXJldHVybiByZXNvdXJjZU1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFJlc291cmNlbWFuYWdlclBhY2thZ2UgZ2V0UmVzb3VyY2VtYW5hZ2VyUGFja2FnZSgpIHsKLQkJcmV0dXJuIChSZXNvdXJjZW1hbmFnZXJQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlbWFuYWdlclBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlbWFuYWdlclBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDViNzI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFJlc291cmNlbWFuYWdlclBhY2thZ2UgewotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByaXZhdGUgRUNsYXNzIHJlc291cmNlRGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcml2YXRlIEVDbGFzcyByZXNvdXJjZU1hbmFnZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJpdmF0ZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChSZXNvdXJjZW1hbmFnZXJQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFJlc291cmNlbWFuYWdlclBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlSZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbCB0aGVSZXNvdXJjZW1hbmFnZXJQYWNrYWdlID0gKFJlc291cmNlbWFuYWdlclBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIFJlc291cmNlbWFuYWdlclBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZVJlc291cmNlbWFuYWdlclBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZVJlc291cmNlbWFuYWdlclBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZVJlc291cmNlbWFuYWdlclBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRSZXNvdXJjZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiByZXNvdXJjZURlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VEZXNjcmlwdG9yX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VEZXNjcmlwdG9yX1VyaSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0UmVzb3VyY2VNYW5hZ2VyKCkgewotCQlyZXR1cm4gcmVzb3VyY2VNYW5hZ2VyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlTWFuYWdlcl9HdWlkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VNYW5hZ2VyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VNYW5hZ2VyX1VyaUJhc2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZU1hbmFnZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZU1hbmFnZXJfU3ViTWFuYWdlcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyZXNvdXJjZU1hbmFnZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZU1hbmFnZXJfUmVzb3VyY2VEZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJlc291cmNlTWFuYWdlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5IGdldFJlc291cmNlbWFuYWdlckZhY3RvcnkoKSB7Ci0JCXJldHVybiAoUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlyZXNvdXJjZURlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVTT1VSQ0VfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVzb3VyY2VEZXNjcmlwdG9yRUNsYXNzLCBSRVNPVVJDRV9ERVNDUklQVE9SX19JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVzb3VyY2VEZXNjcmlwdG9yRUNsYXNzLCBSRVNPVVJDRV9ERVNDUklQVE9SX19VUkkpOwotCi0JCXJlc291cmNlTWFuYWdlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRVNPVVJDRV9NQU5BR0VSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZU1hbmFnZXJFQ2xhc3MsIFJFU09VUkNFX01BTkFHRVJfX0dVSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlTWFuYWdlckVDbGFzcywgUkVTT1VSQ0VfTUFOQUdFUl9fVVJJX0JBU0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlc291cmNlTWFuYWdlckVDbGFzcywgUkVTT1VSQ0VfTUFOQUdFUl9fU1VCX01BTkFHRVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZXNvdXJjZU1hbmFnZXJFQ2xhc3MsIFJFU09VUkNFX01BTkFHRVJfX1JFU09VUkNFX0RFU0NSSVBUT1JTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKHJlc291cmNlRGVzY3JpcHRvckVDbGFzcywgUmVzb3VyY2VEZXNjcmlwdG9yLmNsYXNzLCAiUmVzb3VyY2VEZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlRGVzY3JpcHRvcl9JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBSZXNvdXJjZURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VEZXNjcmlwdG9yX1VyaSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidXJpIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhyZXNvdXJjZU1hbmFnZXJFQ2xhc3MsIFJlc291cmNlTWFuYWdlci5jbGFzcywgIlJlc291cmNlTWFuYWdlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZU1hbmFnZXJfR3VpZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZ3VpZCIsIG51bGwsIDAsIDEsIFJlc291cmNlTWFuYWdlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZU1hbmFnZXJfVXJpQmFzZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidXJpQmFzZSIsIG51bGwsIDAsIDEsIFJlc291cmNlTWFuYWdlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZU1hbmFnZXJfU3ViTWFuYWdlcnMoKSwgdGhpcy5nZXRSZXNvdXJjZU1hbmFnZXIoKSwgbnVsbCwgInN1Yk1hbmFnZXJzIiwgbnVsbCwgMCwgLTEsIFJlc291cmNlTWFuYWdlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlTWFuYWdlcl9SZXNvdXJjZURlc2NyaXB0b3JzKCksIHRoaXMuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKCksIG51bGwsICJyZXNvdXJjZURlc2NyaXB0b3JzIiwgbnVsbCwgMCwgLTEsIFJlc291cmNlTWFuYWdlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJRU9wZXJhdGlvbiBvcCA9IGFkZEVPcGVyYXRpb24ocmVzb3VyY2VNYW5hZ2VyRUNsYXNzLCB0aGlzLmdldFJlc291cmNlRGVzY3JpcHRvcigpLCAiZ2V0UmVzb3VyY2VEZXNjcmlwdG9yIiwgMCwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImd1aWQiLCAwLCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YjBkMzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIG1hbmFnaW5nIFhNSSByZXNvdXJjZXMgaW4gYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YWZjNTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIG1hbmFnaW5nIFhNSSByZXNvdXJjZXMgaW4gYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9yZXNvdXJjZW1hbmFnZXIuZWNvcmUgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9yZXNvdXJjZW1hbmFnZXIuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MWM4YjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0icmVzb3VyY2VtYW5hZ2VyIgotICAgIG5zVVJJPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXIiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlc291cmNlRGVzY3JpcHRvciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVyaSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXNvdXJjZU1hbmFnZXIiPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRSZXNvdXJjZURlc2NyaXB0b3IiIGVUeXBlPSIjLy9SZXNvdXJjZURlc2NyaXB0b3IiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHZXRzIGRpcmVjdCBSZXNvdXJjZURlc2NyaXB0b3Igd2hvc2UgaWQgaXMgdGhlIGdpdmVuIGd1aWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Imd1aWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJndWlkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVyaUJhc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViTWFuYWdlcnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUmVzb3VyY2VNYW5hZ2VyIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNvdXJjZURlc2NyaXB0b3JzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1Jlc291cmNlRGVzY3JpcHRvciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcmVzb3VyY2VtYW5hZ2VyLmdlbm1vZGVsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcmVzb3VyY2VtYW5hZ2VyLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2I3OWM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3Jlc291cmNlbWFuYWdlci5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5lZGl0L3NyYyIgZWRpdG9yRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5lZGl0b3Ivc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIiIHRlbXBsYXRlRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMiCi0gICAgcnVudGltZUphcj0idHJ1ZSIgZHluYW1pY1RlbXBsYXRlcz0idHJ1ZSIgbW9kZWxOYW1lPSJSZXNvdXJjZW1hbmFnZXIiIGVkaXRQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5wcm92aWRlci5SZXNvdXJjZW1hbmFnZXJFZGl0UGx1Z2luIgotICAgIGVkaXRvclBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLnByZXNlbnRhdGlvbi5SZXNvdXJjZW1hbmFnZXJFZGl0b3JQbHVnaW4iCi0gICAgbm9uTkxTTWFya2Vycz0idHJ1ZSIgcm9vdEV4dGVuZHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3QiCi0gICAgcm9vdEV4dGVuZHNDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0IiByb290SW1wbGVtZW50c0ludGVyZmFjZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5JbnRlcm5hbEVEYXRhT2JqZWN0IgotICAgIHN1cHByZXNzRU1GVHlwZXM9InRydWUiIGZlYXR1cmVNYXBXcmFwcGVySW50ZXJmYWNlPSJjb21tb25qLnNkby5TZXF1ZW5jZSIgZmVhdHVyZU1hcFdyYXBwZXJJbnRlcm5hbEludGVyZmFjZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby51dGlsLkVTZXF1ZW5jZSIKLSAgICBmZWF0dXJlTWFwV3JhcHBlckNsYXNzPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnV0aWwuQmFzaWNFU2VxdWVuY2UiIGNvbnRhaW5tZW50UHJveGllcz0idHJ1ZSI+Ci0gIDxmb3JlaWduTW9kZWw+QzpcQ0NfVmlld3NccGxlX1ROR19BdXRob3JpbmdcdG5nX2F1dGhvcmluZ1xUTkcgVU1MIE1vZGVsc1xyZXNvdXJjZW1hbmFnZXIubWRsPC9mb3JlaWduTW9kZWw+Ci0gIDxzdGF0aWNQYWNrYWdlcz5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1NETzwvc3RhdGljUGFja2FnZXM+Ci0gIDxtb2RlbFBsdWdpblZhcmlhYmxlcz5FTUZfQ09NTU9OSl9TRE89b3JnLmVjbGlwc2UuZW1mLmNvbW1vbmouc2RvPC9tb2RlbFBsdWdpblZhcmlhYmxlcz4KLSAgPG1vZGVsUGx1Z2luVmFyaWFibGVzPkVNRl9FQ09SRV9TRE89b3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkbzwvbW9kZWxQbHVnaW5WYXJpYWJsZXM+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IlJlc291cmNlbWFuYWdlciIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmVwZiIgZWNvcmVQYWNrYWdlPSJyZXNvdXJjZW1hbmFnZXIuZWNvcmUjLyI+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0icmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8vUmVzb3VyY2VEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSByZXNvdXJjZW1hbmFnZXIuZWNvcmUjLy9SZXNvdXJjZURlc2NyaXB0b3IvaWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSByZXNvdXJjZW1hbmFnZXIuZWNvcmUjLy9SZXNvdXJjZURlc2NyaXB0b3IvdXJpIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InJlc291cmNlbWFuYWdlci5lY29yZSMvL1Jlc291cmNlTWFuYWdlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8vUmVzb3VyY2VNYW5hZ2VyL2d1aWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSByZXNvdXJjZW1hbmFnZXIuZWNvcmUjLy9SZXNvdXJjZU1hbmFnZXIvdXJpQmFzZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSByZXNvdXJjZW1hbmFnZXIuZWNvcmUjLy9SZXNvdXJjZU1hbmFnZXIvc3ViTWFuYWdlcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8vUmVzb3VyY2VNYW5hZ2VyL3Jlc291cmNlRGVzY3JpcHRvcnMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJyZXNvdXJjZW1hbmFnZXIuZWNvcmUjLy9SZXNvdXJjZU1hbmFnZXIvZ2V0UmVzb3VyY2VEZXNjcmlwdG9yIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9InJlc291cmNlbWFuYWdlci5lY29yZSMvL1Jlc291cmNlTWFuYWdlci9nZXRSZXNvdXJjZURlc2NyaXB0b3IvZ3VpZCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci91dGlsL1Jlc291cmNlbWFuYWdlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci91dGlsL1Jlc291cmNlbWFuYWdlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMzBkNWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9SZXNvdXJjZW1hbmFnZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZW1hbmFnZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JCi0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFJlc291cmNlbWFuYWdlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFJlc291cmNlbWFuYWdlclBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIFJlc291cmNlbWFuYWdlclN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBSZXNvdXJjZW1hbmFnZXJTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZURlc2NyaXB0b3IoUmVzb3VyY2VEZXNjcmlwdG9yIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZURlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZU1hbmFnZXIoUmVzb3VyY2VNYW5hZ2VyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZU1hbmFnZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IgPGVtPlJlc291cmNlIERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciA8ZW0+UmVzb3VyY2UgTWFuYWdlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXNvdXJjZU1hbmFnZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci91dGlsL1Jlc291cmNlbWFuYWdlclN3aXRjaC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9SZXNvdXJjZW1hbmFnZXJTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBhNDdjMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci91dGlsL1Jlc291cmNlbWFuYWdlclN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZW1hbmFnZXJTd2l0Y2ggewotCQotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFJlc291cmNlbWFuYWdlclN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1I6IHsKLQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgcmVzb3VyY2VEZXNjcmlwdG9yID0gKFJlc291cmNlRGVzY3JpcHRvcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmVzb3VyY2VEZXNjcmlwdG9yKHJlc291cmNlRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVI6IHsKLQkJCQlSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyID0gKFJlc291cmNlTWFuYWdlcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlTWFuYWdlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlc291cmNlIERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2VEZXNjcmlwdG9yKFJlc291cmNlRGVzY3JpcHRvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlc291cmNlIE1hbmFnZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2UgTWFuYWdlcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2VNYW5hZ2VyKFJlc291cmNlTWFuYWdlciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci91dGlsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3V0aWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTg3ZDZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgbWFuYWdpbmcgWE1JIHJlc291cmNlcyBpbiBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjY2IzZGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE1YWFmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLlhNSUxpYnJhcnlVSVBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24sCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWksCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLAotIG9yZy5lY2xpcHNlLmVwZi51aSwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmJhZmQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTI2Y2E5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgWE1JIExpYnJhcnkgVUkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotbmV3WE1JTGlicmFyeVdpemFyZFBhZ2VUaXRsZT1DcmVhdGUgYSBuZXcgWE1JIG1ldGhvZCBsaWJyYXJ5LgotbmV3WE1JTGlicmFyeVdpemFyZFBhZ2VEZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSBsb2NhdGlvbiBmb3IgdGhlIG1ldGhvZCBsaWJyYXJ5LiBUaGUgbWV0aG9kIGxpYnJhcnkgY29udGVudCB3aWxsIGJlIHN0b3JlZCBpbiBhIGZvbGRlciwgbmFtZWQgYWZ0ZXIgdGhlIGxpYnJhcnksIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uCi1vcGVuWE1JTGlicmFyeVdpemFyZFBhZ2VUaXRsZT1PcGVuIGEgWE1JIG1ldGhvZCBsaWJyYXJ5Lgotb3BlblhNSUxpYnJhcnlXaXphcmRQYWdlRGVzY3JpcHRpb249U3BlY2lmeSB0aGUgbG9jYXRpb24gZm9yIHRoZSBtZXRob2QgbGlicmFyeS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2JlZTkzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5uZXdMaWJyYXJ5V2l6YXJkUGFnZXMiPgotICAgICAgPG5ld0xpYnJhcnlXaXphcmRQYWdlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLk5ld1hNSUxpYnJhcnlXaXphcmRQYWdlIgotICAgICAgICAgICAgdHlwZT0ieG1pIgotICAgICAgICAgICAgdGl0bGU9IiVuZXdYTUlMaWJyYXJ5V2l6YXJkUGFnZVRpdGxlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVuZXdYTUlMaWJyYXJ5V2l6YXJkUGFnZURlc2NyaXB0aW9uIj4KLSAgICAgIDwvbmV3TGlicmFyeVdpemFyZFBhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm9wZW5MaWJyYXJ5V2l6YXJkUGFnZXMiPgotICAgICAgPG9wZW5MaWJyYXJ5V2l6YXJkUGFnZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS5PcGVuWE1JTGlicmFyeVdpemFyZFBhZ2UiCi0gICAgICAgICAgICB0eXBlPSJ4bWkiCi0gICAgICAgICAgICB0aXRsZT0iJW9wZW5YTUlMaWJyYXJ5V2l6YXJkUGFnZVRpdGxlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVvcGVuWE1JTGlicmFyeVdpemFyZFBhZ2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8L29wZW5MaWJyYXJ5V2l6YXJkUGFnZT4KLSAgIDwvZXh0ZW5zaW9uPiAgIAotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubWlncmF0b3JzIj4KLSAgICAgIDxtaWdyYXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS5pbnRlcm5hbC5taWdyYXRpb24uTWlncmF0b3IxMDJfMTAzIgotICAgICAgICAgICAgbGliTnNVUkk9Imh0dHA6Ly93d3cuaWJtLmNvbS91bWEvMS4wLjIvdW1hLmVjb3JlIi8+Ci0gICAgICA8bWlncmF0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkuaW50ZXJuYWwubWlncmF0aW9uLk1pZ3JhdG9yMTAzIgotICAgICAgICAgICAgbGliTnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMy91bWEuZWNvcmUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9OZXdYTUlMaWJyYXJ5V2l6YXJkUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvTmV3WE1JTGlicmFyeVdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y2MDA4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9OZXdYTUlMaWJyYXJ5V2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5OZXdMaWJyYXJ5V2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLnByZWZlcmVuY2VzLlhNSUxpYnJhcnlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIHBhdGggZm9yIGEgWE1JIG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5ld1hNSUxpYnJhcnlXaXphcmRQYWdlIGV4dGVuZHMgTmV3TGlicmFyeVdpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBUZXh0IG5hbWVUZXh0OwotCi0JcHJpdmF0ZSBDb21ibyBsb2NhdGlvbkNvbWJvOwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3WE1JTGlicmFyeVdpemFyZFBhZ2UoU3RyaW5nIHBhZ2VJZCkgewotCQlzdXBlcihwYWdlSWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQotCQlMYWJlbCBuYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9STUFMKTsKLQkJbmFtZUxhYmVsLnNldFRleHQoWE1JTGlicmFyeVVJUmVzb3VyY2VzLm5hbWVMYWJlbF90ZXh0KTsKLQotCQluYW1lVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCW5hbWVUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQluYW1lVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PUk1BTCk7Ci0KLQkJTGFiZWwgbG9jYXRpb25MYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbG9jYXRpb25MYWJlbC5zZXRUZXh0KFhNSUxpYnJhcnlVSVJlc291cmNlcy5sb2NhdGlvbkxhYmVsX3RleHQpOwotCi0JCWxvY2F0aW9uQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJbG9jYXRpb25Db21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbG9jYXRpb25Db21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCWxvY2F0aW9uQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZpbmFsIFNoZWxsIHNoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0KLQkJZmluYWwgQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KFhNSUxpYnJhcnlVSVJlc291cmNlcy5icm93c2VCdXR0b25fdGV4dCk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coc2hlbGwsCi0JCQkJCQkJU1dULk5PTkUpOwotCQkJCQlTdHJpbmcgc2VsZWN0ZWREaXIgPSBkaWFsb2cub3BlbigpOwotCQkJCQlpZiAoc2VsZWN0ZWREaXIgIT0gbnVsbCkgewotCQkJCQkJbG9jYXRpb25Db21iby5hZGQoc2VsZWN0ZWREaXIsIDApOwotCQkJCQkJbG9jYXRpb25Db21iby5zZXRUZXh0KHNlbGVjdGVkRGlyKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLQkJZmluYWwgQnV0dG9uIGRlZmF1bHRQYXRoQ2hlY2tib3ggPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZGVmYXVsdFBhdGhDaGVja2JveAotCQkJCS5zZXRUZXh0KFhNSUxpYnJhcnlVSVJlc291cmNlcy5kZWZhdWx0UGF0aENoZWNrYm94TGFiZWxfdGV4dCk7Ci0JCWRlZmF1bHRQYXRoQ2hlY2tib3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmIChkZWZhdWx0UGF0aENoZWNrYm94LmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCWxvY2F0aW9uQ29tYm8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQkJCQlsb2NhdGlvbkNvbWJvLnNldFRleHQoWE1JTGlicmFyeVByZWZlcmVuY2VzCi0JCQkJCQkJLmdldERlZmF1bHRMaWJyYXJ5UGF0aCgpKTsKLQkJCQkJbG9jYXRpb25Db21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCWxvY2F0aW9uQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCWJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlsb2NhdGlvbkNvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCWJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNvbkVudGVyUGFnZShPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgb25FbnRlclBhZ2UoT2JqZWN0IG9iaikgewotCQlpZiAob2JqICE9IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlTdHJpbmcgbGlicmFyeU5hbWUgPSAoU3RyaW5nKSBvYmo7Ci0JCQluYW1lVGV4dC5zZXRUZXh0KGxpYnJhcnlOYW1lKTsKLQkJfQotCi0JCWlmIChnZXRMaWJyYXJ5UGF0aCgpLmxlbmd0aCgpID09IDApIHsKLQkJCWxvY2F0aW9uQ29tYm8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQkJbG9jYXRpb25Db21ibwotCQkJCQkuc2V0VGV4dChYTUlMaWJyYXJ5UHJlZmVyZW5jZXMuZ2V0RGVmYXVsdExpYnJhcnlQYXRoKCkpOwotCQkJbG9jYXRpb25Db21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGdldExpYnJhcnlQYXRoKCkubGVuZ3RoKCkgPiAwICYmIGdldExpYnJhcnlOYW1lKCkubGVuZ3RoKCkgPiAwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlicmFyeSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeU5hbWUoKSB7Ci0JCXJldHVybiBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpYnJhcnkgcGF0aC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlQYXRoKCkgewotCQlyZXR1cm4gbG9jYXRpb25Db21iby5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpYnJhcnkgc3BlY2lmaWMgdXNlciBzZWxlY3Rpb25zLgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0U2VsZWN0aW9ucygpIHsKLQkJTWFwIG9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQlGaWxlIGxpYnJhcnlQYXRoID0gbmV3IEZpbGUoZ2V0TGlicmFyeVBhdGgoKSwgZ2V0TGlicmFyeU5hbWUoKSk7Ci0JCW9wdGlvbnMucHV0KFhNSUxpYnJhcnlNYW5hZ2VyLkFSR19MSUJSQVJZX1BBVEgsIGxpYnJhcnlQYXRoCi0JCQkJLmdldEFic29sdXRlUGF0aCgpKTsKLQkJcmV0dXJuIG9wdGlvbnM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9PcGVuWE1JTGlicmFyeVdpemFyZFBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL09wZW5YTUlMaWJyYXJ5V2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTU2ZWM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL09wZW5YTUlMaWJyYXJ5V2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5PcGVuTGlicmFyeVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5wcmVmZXJlbmNlcy5YTUlMaWJyYXJ5UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIHBhdGggZm9yIGEgWE1JIG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5YTUlMaWJyYXJ5V2l6YXJkUGFnZSBleHRlbmRzIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIENvbWJvIGxvY2F0aW9uQ29tYm87Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBPcGVuWE1JTGlicmFyeVdpemFyZFBhZ2UoU3RyaW5nIHBhZ2VJZCkgewotCQlzdXBlcihwYWdlSWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIFhNSUxpYnJhcnlVSVJlc291cmNlcy5sb2NhdGlvbkxhYmVsX3RleHQpOwotCi0JCWxvY2F0aW9uQ29tYm8gPSBjcmVhdGVDb21ib2JveChjb21wb3NpdGUpOwotCQlsb2NhdGlvbkNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJbG9jYXRpb25Db21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKLQotCQlmaW5hbCBCdXR0b24gYnJvd3NlQnV0dG9uID0gY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwKLQkJCQlYTUlMaWJyYXJ5VUlSZXNvdXJjZXMuYnJvd3NlQnV0dG9uX3RleHQpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXRyeSB7Ci0JCQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHNoZWxsLAotCQkJCQkJCVNXVC5OT05FKTsKLQkJCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoZ2V0TGlicmFyeVBhdGgoKSk7Ci0JCQkJCVN0cmluZyBzZWxlY3RlZERpciA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJCWlmIChzZWxlY3RlZERpciAhPSBudWxsKSB7Ci0JCQkJCQlsb2NhdGlvbkNvbWJvLmFkZChzZWxlY3RlZERpciwgMCk7Ci0JCQkJCQlsb2NhdGlvbkNvbWJvLnNldFRleHQoc2VsZWN0ZWREaXIpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2Ujb25FbnRlclBhZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG9uRW50ZXJQYWdlKE9iamVjdCBvYmopIHsKLQkJaWYgKGdldExpYnJhcnlQYXRoKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJbG9jYXRpb25Db21iby5yZW1vdmVNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCQlsb2NhdGlvbkNvbWJvCi0JCQkJCS5zZXRUZXh0KFhNSUxpYnJhcnlQcmVmZXJlbmNlcy5nZXREZWZhdWx0TGlicmFyeVBhdGgoKSk7Ci0JCQlsb2NhdGlvbkNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlyZXR1cm4gZ2V0TGlicmFyeVBhdGgoKS5sZW5ndGgoKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaWJyYXJ5IHBhdGguCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5UGF0aCgpIHsKLQkJcmV0dXJuIGxvY2F0aW9uQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaWJyYXJ5IHNwZWNpZmljIHVzZXIgc2VsZWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldFNlbGVjdGlvbnMoKSB7Ci0JCU1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJRmlsZSBsaWJyYXJ5UGF0aCA9IG5ldyBGaWxlKGdldExpYnJhcnlQYXRoKCkpOwotCQlvcHRpb25zLnB1dChYTUlMaWJyYXJ5TWFuYWdlci5BUkdfTElCUkFSWV9QQVRILCBsaWJyYXJ5UGF0aAotCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCXJldHVybiBvcHRpb25zOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3MzVhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgTWV0aG9kIEVsZW1lbnQgTmFtZXMgKFNpbmd1bGFyKQotbmFtZUxhYmVsX3RleHQ9TmFtZToKLWxvY2F0aW9uTGFiZWxfdGV4dD1Mb2NhdGlvbjoKLWJyb3dzZUJ1dHRvbl90ZXh0PUJyb3dzZS4uLgotZGVmYXVsdFBhdGhDaGVja2JveExhYmVsX3RleHQ9VXNlIHRoZSBkZWZhdWx0IGRpcmVjdG9yeS4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL1hNSUxpYnJhcnlVSVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvWE1JTGlicmFyeVVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYWUzNWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvWE1JTGlicmFyeVVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgZm9yIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWk8L2NvZGU+Ci0gKiBwbHVnLWluLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNSUxpYnJhcnlVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8qKgotCSAqIFRoZSBwbHVnLWluIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IFhNSUxpYnJhcnlVSVBsdWdpbi5jbGFzcwotCQkJLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgWE1JTGlicmFyeVVJUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBYTUlMaWJyYXJ5VUlQbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0b3AoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICogCi0JICogQHJldHVybiBUaGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBYTUlMaWJyYXJ5VUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL1hNSUxpYnJhcnlVSVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvWE1JTGlicmFyeVVJUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYmYwZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvWE1JTGlicmFyeVVJUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgWE1JTGlicmFyeVVJUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IFhNSUxpYnJhcnlVSVJlc291cmNlcy5jbGFzcwotCQkJLmdldFBhY2thZ2UoKS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuYW1lTGFiZWxfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhdGlvbkxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBicm93c2VCdXR0b25fdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0UGF0aENoZWNrYm94TGFiZWxfdGV4dDsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFhNSUxpYnJhcnlVSVJlc291cmNlcy5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBrZXkgYW5kIGZvcm1hdHRlZAotCSAqIHdpdGggYSBnaXZlbiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBrZXkuCi0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIEFuIG9iamVjdC4KLQkgKiBAcmV0dXJuIEEgZm9ybWF0dGVkIGxvY2FsaXplZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcga2V5LCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gTkxTLmJpbmQoa2V5LCBuZXcgT2JqZWN0W10geyBkYXRhIH0pOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRpb25VdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0aW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDg1MzM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLmludGVybmFsLm1pZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uaHRtbC5IVE1MRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5UZXh0UmVmZXJlbmNlUmVwbGFjZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGhlbHAgbWlncmF0ZSBhbmQgZm9ybWF0IHRoZSBodG1sIGNvbnRlbnQuCi0gKiAKLSAqIEBhdXRob3IgSkluaHVhIFhpCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1pZ3JhdGlvblV0aWwgewotCQotCXB1YmxpYyBzdGF0aWMgU2V0PFN0cmluZz4gY2RhdGFGZWF0dXJlTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBsb2NhbERlYnVnID0gZmFsc2U7Ci0Jc3RhdGljIHsKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJhbHRlcm5hdGl2ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoIm1haW5EZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiaG93VG9TdGFmZiIpOyAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgia2V5Q29uc2lkZXJhdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInB1cnBvc2UiKTsgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInNjb3BlIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgidXNhZ2VOb3RlcyIpOyAgLy8kTk9OLU5MUy0xJAotCQkKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJza2lsbHMiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJhc3NpZ25tZW50QXBwcm9hY2hlcyIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInN5bm9ueW1zIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgic2VjdGlvbkRlc2NyaXB0aW9uIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiaW1wYWN0T2ZOb3RIYXZpbmciKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJyZWFzb25zRm9yTm90TmVlZGluZyIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImJyaWVmT3V0bGluZSIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInJlcHJlc2VudGF0aW9uT3B0aW9ucyIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInVzYWdlR3VpZGFuY2UiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJyZWZpbmVkRGVzY3JpcHRpb24iKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJhY3Rpdml0eUVudHJ5U3RhdGUiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJhY3Rpdml0eUV4aXRTdGF0ZSIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImV4dGVybmFsRGVzY3JpcHRpb24iKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJwYWNrYWdpbmdHdWlkYW5jZSIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImFkZGl0aW9uYWxJbmZvIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgicHJvYmxlbSIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImJhY2tncm91bmQiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJnb2FscyIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImFwcGxpY2F0aW9uIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgibGV2ZWxzT2ZBZG9wdGlvbiIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInNjYWxlIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgicHJvamVjdENoYXJhY3RlcmlzdGljcyIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInJpc2tMZXZlbCIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImVzdGltYXRpbmdUZWNobmlxdWUiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgidHlwZU9mQ29udHJhY3QiKTsgIC8vJE5PTi1OTFMtMSQKLQkKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSHRtbEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGYpIHsKLQkJcmV0dXJuIGNkYXRhRmVhdHVyZU5hbWVzLmNvbnRhaW5zKGYuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZm9ybWF0VmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdCBwcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgewotCQkJLy8gZ2V0IGFsbCBzdHJpbmcgdHlwZSBhdHRyaWJ1dGVzCi0KLQkJCUhUTUxGb3JtYXR0ZXIgZm9ybWF0ZXIgPSBuZXcgSFRNTEZvcm1hdHRlcigpOwotCQkJCi0JCQlpZiAoUmVzb3VyY2VIZWxwZXIuZ2V0RGVmYXVsdFJlc291cmNlTWdyKCkgPT0gbnVsbCkgewotCQkJCVJlc291cmNlSGVscGVyLnNldERlZmF1bHRSZXNvdXJjZU1ncihuZXcgWE1JTGlicmFyeVJlc291cmNlTWFuYWdlcigpKTsKLQkJCX0KLQkJCQotCQkJYm9vbGVhbiBzZWVuID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFUHJvcGVydHkgcHJvcGVydHkgPSAoRVByb3BlcnR5KSBwcm9wZXJ0aWVzLmdldChpKTsKLQkJCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IHByb3BlcnR5Ci0JCQkJCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQkJCQotLy8JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcHJvcGVydGllcwotLy8JCQkJCQkJLmdldChpKTsKLS8vCQotCQkJCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHZhbHVlOwotCQkJCQlpZiAoaXNIdG1sRmVhdHVyZShmZWF0dXJlKSAmJiB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQkJaWYgKCEgc2VlbiAmJiBsb2NhbERlYnVnKSB7CQkJCQkJCQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGVsZW1lbnQ6ICIgKyBlbGVtZW50LmVDbGFzcygpLmdldE5hbWUoKSk7Ly8kTk9OLU5MUy0xJAotCQkJCQkJCXNlZW4gPSB0cnVlOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQl0cnkgewotCQkJCQkJCQotCQkJCQkJCVN0cmluZyBzdHIwID0gdmFsaWRhdGVHdWlkQXR0cmlidXRlKChTdHJpbmcpIHZhbHVlKTsJCQkJCQkJCi0JCQkJCQkJU3RyaW5nIHN0cjEgPSBSZXNvdXJjZUhlbHBlci52YWxpZGF0ZUNvbnRlbnQoZWxlbWVudCwgc3RyMCk7Ci0JCQkJCQkJCi0JCQkJCQkJbmV3VmFsdWUgPSBmb3JtYXRlci5mb3JtYXRIVE1MKChTdHJpbmcpIHN0cjEpOwotCi0JCQkJCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZmVhdHVyZTogIiArIGZlYXR1cmUuZ2V0TmFtZSgpKTsvLyROT04tTkxTLTEkCi0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHN0cjA6ICIgKyB2YWx1ZSk7CQkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJaWYgKCEgc3RyMS5lcXVhbHMoc3RyMCkpIHsKLQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHN0cjE6ICIgKyBzdHIxKTsJCQkvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKCEgbmV3VmFsdWUuZXF1YWxzKHN0cjEpKSB7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBuZXdWYWx1ZTogIiArIG5ld1ZhbHVlKTsJCQkvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJCi0vLwkJCQkJCQluZXdWYWx1ZSA9IHN0cjI7Ci0JCQkJCQkJCi0JCQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBOb3QgY2hhbmdlIHZhbHVlIGlmIGl0IGNhbm5vdCBiZSBmb3JtYXR0ZWQKLQkJCQkJCQkvLyBTaG91bGQgYWxzbyB3cml0ZSB0byBsb2cgZm9yIHVzZXIgYXR0ZW50aW9uCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQllbGVtZW50LmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHZhbGlkYXRlR3VpZEF0dHJpYnV0ZShTdHJpbmcgc291cmNlKSB7Ci0JCVN0cmluZyBzdHIgPSB2YWxpZGF0ZUd1aWRBdHRyaWJ1dGUoc291cmNlLCAgUmVzb3VyY2VIZWxwZXIucF9saW5rX3JlZik7Ci0JCXN0ciA9IHZhbGlkYXRlR3VpZEF0dHJpYnV0ZShzdHIsIFJlc291cmNlSGVscGVyLnBfYXJlYV9yZWYpOwotCQlyZXR1cm4gc3RyOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdmFsaWRhdGVHdWlkQXR0cmlidXRlKFN0cmluZyBzb3VyY2UsIFBhdHRlcm4gcGF0dGVybikgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCU1hdGNoZXIgbSA9IHBhdHRlcm4ubWF0Y2hlcihzb3VyY2UpOwotCi0JCXdoaWxlIChtLmZpbmQoKSkgewotCQkJU3RyaW5nIHRleHQgPSBtLmdyb3VwKCk7Ci0JCQlTdHJpbmcgcmVwbGFjZW1lbnQgPSB0ZXh0OwkJCQotCQkJCi0JCQlNYXAgYXR0cmlidXRlTWFwID0gUmVzb3VyY2VIZWxwZXIuZ2V0QXR0cmlidXRlc0Zyb21MaW5rKHBhdHRlcm4sIHRleHQpOwotCQkJCi0JCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHRleHQ6ICAgICAgIiArIHRleHQpOwkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGF0dHJpYnV0ZU1hcDogIiArIGF0dHJpYnV0ZU1hcCk7CQkvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCVN0cmluZyBndWlkID0gYXR0cmlidXRlTWFwID09IG51bGwgPyBudWxsIDogKFN0cmluZykgYXR0cmlidXRlTWFwLmdldChSZXNvdXJjZUhlbHBlci5UQUdfQVRUUl9HVUlEKTsKLQkJCVN0cmluZyBocmVmID0gYXR0cmlidXRlTWFwID09IG51bGwgPyBudWxsIDogKFN0cmluZykgYXR0cmlidXRlTWFwLmdldChSZXNvdXJjZUhlbHBlci5UQUdfQVRUUl9IUkVGKTsKLQotCQkJaW50IGl4MCA9IC0xOwotCQkJaW50IGl4MSA9IC0xOwotCQkJaWYgKGd1aWQgPT0gbnVsbCAmJiBocmVmICE9IG51bGwpIHsKLQkJCQlpeDAgPSBocmVmLmxhc3RJbmRleE9mKCIsIik7CQkJLy8kTk9OLU5MUy0xJAotCQkJCWl4MSA9IGhyZWYubGFzdEluZGV4T2YoIi5odG1sIik7CS8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJaWYgKGl4MCA+PSAwICYmIGl4MSA+IGl4MCkgewotCQkJCQotCQkJCWd1aWQgPSBocmVmLnN1YnN0cmluZyhpeDAgKyAxLCBpeDEpOwotCQkJCS8vVG8gZG86IHZhbGlkYXRlIGlmIGd1aWQgaXMgdmFsaWQgaGVyZSwgb3RoZXJ3aXNlLCBubyByZXBsYWNlbWVudAotCQkJCQotCQkJCVN0cmluZyByZXBsYWNlZCA9IGhyZWYgKyAiXCIiOyAgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyByZXBsYWNpbmcgPSBocmVmICsgIlwiIGd1aWQ9XCIiK2d1aWQgKyAiXCIiOwkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkvL3JlcGxhY2VtZW50ID0gVGV4dFJlZmVyZW5jZVJlcGxhY2VySW1wbC5yZXBsYWNlQWxsKHRleHQsIHJlcGxhY2VkLCByZXBsYWNpbmcpOwotCQkJCXJlcGxhY2VtZW50ID0gdGV4dC5yZXBsYWNlKHJlcGxhY2VkLCByZXBsYWNpbmcpOwotCi0JCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gIHJlcGxhY2VkOiAiICsgcmVwbGFjZWQpOwkvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHJlcGxhY2luZzogIiArIHJlcGxhY2luZyk7CS8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9CQkJCi0JCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCBNYXRjaGVyLnF1b3RlUmVwbGFjZW1lbnQocmVwbGFjZW1lbnQpKTsJCQkJCi0JCX0KLQkJbS5hcHBlbmRUYWlsKHNiKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yMTAyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0b3IxMDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY3NjNkMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0b3IxMDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkuaW50ZXJuYWwubWlncmF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudHNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxpbmtJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NZXRob2RMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVYTUlTYXZlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLk1pZ3JhdGlvblJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLk1pZ3JhdG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVwZ3JhZGVDYWxsZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1biAxMiwgMjAwNgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWlncmF0b3IxMDIgZXh0ZW5kcyBNaWdyYXRvckltcGwgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBYTUlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmlzRGVidWdnaW5nKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZVN0YXR1cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyBtc2cpIHsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJbW9uaXRvci5zdWJUYXNrKG1zZyk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDEwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkvLwotCQkJfQotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gcHJveGllc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBNYXAgcHJveHlUb0ZpbGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHByb3h5VG9GaWxlV2l0aExvYWRFcnJvck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBub3RGb3VuZFByb3hpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBwcm94aWVzV2l0aFVubm9ybWFsaXplZFVSSSA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsaWI7Ci0KLQlwcml2YXRlIE1pZ3JhdGlvblJlc291cmNlSGFuZGxlciByZXNvdXJjZUhhbmRsZXIgPSBuZXcgTWlncmF0aW9uUmVzb3VyY2VIYW5kbGVyKCkgewotCi0JCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZVVua25vd25GZWF0dXJlKEVPYmplY3Qgb3duZXIsCi0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQkJLy8gT3JkZXIgZ3JhcGggbm9kZXMgb2YgdGFzayBkZXNjcmlwdG9ycyBpbiBBREQgYmFzZWQgb24gdGhlaXIgb3JkZXIKLQkJCS8vIGluIHRoZSB0YXNrIGRlc2NyaXB0b3IgbGlzdCBvZiB0aGUgcm9sZSBkZXNjcmlwdG9yCi0JCQkvLyBvbGQgZmVhdHVyZTogUm9sZURlc2NyaXB0b3IucGVyZm9ybXNBc093bmVyCi0JCQkvLwotCQkJaWYob3duZXIgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcgotCQkJCQkmJiAicGVyZm9ybXNBc093bmVyIi5lcXVhbHMoZmVhdHVyZS5nZXROYW1lKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJJiYgdmFsdWUgIT0gbnVsbCkKLQkJCXsKLQkJCQlBcnJheUxpc3QgR1VJRHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoKFN0cmluZykgdmFsdWUpOwotCQkJCXdoaWxlKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJR1VJRHMuYWRkKHRva2Vucy5uZXh0VG9rZW4oKSk7Ci0JCQkJfQotCQkJCWlmKEdVSURzLnNpemUoKSA+IDEpIHsKLQkJCQkJQWN0aXZpdHkgYWN0ID0gKChSb2xlRGVzY3JpcHRvcilvd25lcikuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQkJCURpYWdyYW0gYWRkID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRVTUFEaWFncmFtKGFjdCwgR3JhcGhpY2FsRGF0YUhlbHBlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSwgZmFsc2UpOwotCQkJCQlpZihhZGQgIT0gbnVsbCkgewotCQkJCQkJTWFwIHRkR3VpZFRvR3JhcGhOb2RlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkJCWludCBzaXplID0gYWRkLmdldENvbnRhaW5lZCgpLnNpemUoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBhZGQuZ2V0Q29udGFpbmVkKCkuZ2V0KGkpOwotCQkJCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBHcmFwaE5vZGUpIHsKLQkJCQkJCQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9ICgoR3JhcGhOb2RlKWVsZW1lbnQpOwotCQkJCQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlIGJyaWRnZSA9IGdyYXBoTm9kZS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJCQkJCWlmIChicmlkZ2UgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSB7Ci0JCQkJCQkJCQlNZXRob2RFbGVtZW50IG1lID0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBicmlkZ2UpLmdldEVsZW1lbnQoKTsJCQkJCQkJCQotCQkJCQkJCQkJaWYobWUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQkJCQkJCUxpc3QgbGlzdCA9IGdyYXBoTm9kZS5nZXRMaXN0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFkpOwotCQkJCQkJCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRQcm9wZXJ0eUJ5S2V5KGxpc3QsCi0JCQkJCQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfV09SS19QUk9EVUNUX0NPTVBPU0lURV9UWVBFKTsKLQkJCQkJCQkJCQlpZiAocHJvcGVydHkgPT0gbnVsbCkgewotCQkJCQkJCQkJCQkvLyB0aGlzIGlzIG5vdCBhIEdyYXBoTm9kZSBmb3IgV29ya1Byb2R1Y3RDb21wb3NpdGUKLQkJCQkJCQkJCQkJLy8gaXQgbXVzdCBiZSBhIEdyYXBoTm9kZSBmb3IgYSBUYXNrRGVzY3JpcHRvcgotCQkJCQkJCQkJCQkvLwotCQkJCQkJCQkJCQl0ZEd1aWRUb0dyYXBoTm9kZU1hcC5wdXQobWUuZ2V0R3VpZCgpLCBncmFwaE5vZGUpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJLy8gcmVvcmRlciB0aGUgZ3JhcGggbm9kZXMgdG8gbWF0Y2ggb3JkZXIgb2YgdGhlaXIgbGlua2VkIHRhc2sgZGVzY3JpcHRvcnMKLQkJCQkJCS8vCi0JCQkJCQlBcnJheUxpc3QgZ3JhcGhOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBHVUlEcy5zaXplKCk7IGkrKykgewotCQkJCQkJCU9iamVjdCBncmFwaE5vZGUgPSB0ZEd1aWRUb0dyYXBoTm9kZU1hcC5nZXQoR1VJRHMuZ2V0KGkpKTsKLQkJCQkJCQlpZihncmFwaE5vZGUgIT0gbnVsbCkgewotCQkJCQkJCQlncmFwaE5vZGVzLmFkZChncmFwaE5vZGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWFkZC5nZXRDb250YWluZWQoKS5yZW1vdmVBbGwoZ3JhcGhOb2Rlcyk7Ci0JCQkJCQlhZGQuZ2V0Q29udGFpbmVkKCkuYWRkQWxsKGdyYXBoTm9kZXMpOwotCQkJCQl9CQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BBVEggPSBYTUlMaWJyYXJ5UmVzb3VyY2VzLmZpbGVQYXRoOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLklNaWdyYXRvciNtaWdyYXRlKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtaWdyYXRlKFN0cmluZyBsaWJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBFeGNlcHRpb24gewotCQltaWdyYXRlKGxpYlBhdGgsIG1vbml0b3IsIG51bGwpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLklNaWdyYXRvciNtaWdyYXRlKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVwZ3JhZGVDYWxsZXJJbmZvKQotCSAqLwotCXB1YmxpYyB2b2lkIG1pZ3JhdGUoU3RyaW5nIGxpYlBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVXBncmFkZUNhbGxlckluZm8gaW5mbykKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlpbml0TWlncmF0ZSgpOwotCQkKLQkJRmlsZSBsaWJGaWxlID0gbmV3IEZpbGUobGliUGF0aCk7Ci0KLQkJYm9vbGVhbiB0b1ZlcmlmeSA9IHRydWU7Ci0JCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby5nZXRJc0V4cG9ydGVkUGx1Z2luTGliKCkpIHsKLQkJCXRvVmVyaWZ5ID0gZmFsc2U7Ci0JCX0KLQkJCi0JCVJlc291cmNlVXRpbC5vcGVuKGxpYkZpbGUuZ2V0UGFyZW50KCksIG1vbml0b3IpOwotCi0JCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXQgMS4wLjIgZGVmYXVsdCB2YWx1ZXMgc28gZGF0YSBjYW4gYmUgY29ycmVjdGx5IGxvYWRlZAotCQkJLy8KLQkJCXNldE9sZERlZmF1bHRWYWx1ZXMoKTsKLQotCQkJLy8gbG9hZCB0aGUgbGlicmFyeQotCQkJLy8KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkTGlicmFyeVRhc2tfbmFtZSk7Ci0KLQkJCWlmICh0b1ZlcmlmeSkgewotCQkJCXJlc291cmNlU2V0ID0gbmV3IE11bHRpRmlsZVJlc291cmNlU2V0SW1wbChmYWxzZSk7Ci0JCQl9IGVsc2UgewotCQkJCXJlc291cmNlU2V0ID0gZ2V0SW1wb3J0UGx1Z2luUmVzb3VyY2VTZXQoKTsKLQkJCX0KLQkJCQkJCQotCQkJcmVzb3VyY2VTZXQuZ2V0TG9hZE9wdGlvbnMoKS5wdXQoCi0JCQkJCVhNTFJlc291cmNlLk9QVElPTl9SRUNPUkRfVU5LTk9XTl9GRUFUVVJFLCBCb29sZWFuLlRSVUUpOwotCQkJcmVzb3VyY2VTZXQuZ2V0TG9hZE9wdGlvbnMoKS5wdXQoCi0JCQkJCVhNTFJlc291cmNlLk9QVElPTl9SRVNPVVJDRV9IQU5ETEVSLCByZXNvdXJjZUhhbmRsZXIpOwotCQkJbGliID0gcmVzb3VyY2VTZXQubG9hZExpYnJhcnkobGliUGF0aCk7Ci0JCQkKLQkJCXJlbW92ZVByb2Nlc3NDb250cmlidXRpb25zKG1vbml0b3IpOwotCi0JCQkvLyB2ZXJpZnkgdGhlIGxpYnJhcnkKLQkJCS8vCi0JCQkvLyBUT0RPOiB1bmNvbW1lbnQgYWZ0ZXIgZXh0ZXJuYWxpemUgdGhlIHRleHQKLQkJCS8vIHVwZGF0ZVN0YXR1cyhtb25pdG9yLCAiVmVyaWZ5aW5nLi4uIik7Ci0KLQkJCWlmICh0b1ZlcmlmeSkgewotCQkJCURpc3BsYXkgZGlzID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQkJaWYgKGRpcyA9PSBudWxsIHx8IGRpcy5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7Ci0JCQkJCXZlcmlmeSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRpcy5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJdmVyaWZ5KCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCQlyZW1vdmVVbnJlc29sdmVkUmVmZXJlbmNlcyhtb25pdG9yKTsKLQkJCX0KLQkJCQkJCQotCQkJaWYgKHRoaXMgaW5zdGFuY2VvZiBNaWdyYXRvcjEwMl8xMDMpIHsKLQkJCQlMaW5rSW5mby5zZXRMaWJyYXJ5KGxpYik7Ci0JCQl9Ci0JCQkvLyBsb2FkIGFsbCBlbGVtZW50cyBpbiBtZW1vcnkKLQkJCS8vCi0JCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZFJlc291cmNlc1Rhc2tfbmFtZSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmVDcm9zc1JlZmVyZW5jZXMoKQotCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCQlTeXN0ZW0uZXJyCi0JCQkJCQkJCQkucHJpbnRsbigiRXJyb3IgaXRlcmF0ZSB0aHJ1IGNyb3NzIHJlZmVyZW5jZXMgb2YgZWxlbWVudDogIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJdXBkYXRlKChNZXRob2RFbGVtZW50KSBlbGVtZW50LCBtb25pdG9yKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCQotCQkJCi0JCQlyZW1vdmVPbGREZWZhdWx0VmFsdWVzKCk7Ci0KLQkJCS8vIGNoZWNrIG1vZGlmaWVkIHJlc291cmNlcyBmb3Igd3JpdGFibGUgYmVmb3JlIHNhdmluZyB0aGVtCi0JCQkvLwotCQkJRGlzcGxheSBkaXMgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCWlmIChkaXMgPT0gbnVsbCB8fCBkaXMuZ2V0VGhyZWFkKCkgPT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSkgewotCQkJCWNoZWNrTW9kaWZpZWRSZXNvdXJjZXMoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGlzLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJY2hlY2tNb2RpZmllZFJlc291cmNlcygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCS8vIHNhdmUgYWxsIGZpbGVzCi0JCQkvLwotCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLnNhdmVMaWJyYXJ5VGFza19uYW1lKTsKLQkJCU1hcCBzYXZlT3B0aW9ucyA9IHJlc291cmNlU2V0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQkJaWYgKHRvVmVyaWZ5KSB7Ci0JCQkJc2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLkRJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTLAotCQkJCQlCb29sZWFuLlRSVUUpOwotCQkJfQotCQkJcmVzb3VyY2VTZXQuc2F2ZShzYXZlT3B0aW9ucywgdHJ1ZSk7Ci0KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLAotCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5yZWZyZXNoTGlicmFyeUZpbGVzVGFza19uYW1lKTsKLQkJCVJlc291cmNlVXRpbC5yZWZyZXNoUmVzb3VyY2VzKGxpYiwgbW9uaXRvcik7Ci0JCQltaWdyYXRlRGlhZ3JhbShtb25pdG9yKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh0aGlzIGluc3RhbmNlb2YgTWlncmF0b3IxMDJfMTAzKSB7Ci0JCQkJTGlua0luZm8uc2V0TGlicmFyeShudWxsKTsKLQkJCX0KLQkJCWlmIChyZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2VTZXQucmVzZXQoKTsKLQkJCQlyZXNvdXJjZVNldCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCBnZXRJbXBvcnRQbHVnaW5SZXNvdXJjZVNldCgpIHsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0OwotCQlyZXNvdXJjZVNldCA9IG5ldyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoZmFsc2UpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGRlbWFuZExvYWQoUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQkJaWYgKCEgc2tpcERlbWFuZExvYWQocmVzb3VyY2UpKSB7Ci0JCQkJCXN1cGVyLmRlbWFuZExvYWQocmVzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJCXByaXZhdGUgYm9vbGVhbiBza2lwRGVtYW5kTG9hZChSZXNvdXJjZSByZXMpIHsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZXMuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJCWlmICghIGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5nZXROYW1lKCkuZXF1YWxzKE11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfUExVR0lOX01PREVMX0ZJTEVOQU1FKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCQlyZXR1cm4gcmVzb3VyY2VTZXQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBwcm9jZXNzIGNvbnRyaWJ1dGlvbnMgZnJvbSBhbGwgcGx1Z2lucwotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVQcm9jZXNzQ29udHJpYnV0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmdldE1ldGhvZFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGgpOwotCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBBcnJheUxpc3QocGtnLmdldENoaWxkUGFja2FnZXMoKSkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1ldGhvZFBhY2thZ2UgY2hpbGRQa2cgPSAoTWV0aG9kUGFja2FnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9ICgoSW50ZXJuYWxFT2JqZWN0KSBjaGlsZFBrZykKLQkJCQkJCQkuZURpcmVjdFJlc291cmNlKCk7Ci0JCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuZGVsZXRlKHBrZyk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChyZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0JCQkJCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmNsZWFyKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tNb2RpZmllZFJlc291cmNlcygpIHsKLQkJZG8gewotCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBsaWIuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCUFycmF5TGlzdCByZWFkT25seVJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCVN0cmluZyBwbHVnaW5JZCA9IFhNSUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCk7Ci0JCQlNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMocGx1Z2luSWQsIDAsCi0JCQkJCVhNSUxpYnJhcnlSZXNvdXJjZXMuY2Fubm90V3JpdGVUb0ZpbGVzLCBudWxsKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlU2V0LmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJCWlmIChmaWxlLmV4aXN0cygpICYmICFmaWxlLmNhbldyaXRlKCkpIHsKLQkJCQkJcmVhZE9ubHlSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIHBsdWdpbklkLCAwLCBmaWxlCi0JCQkJCQkJLnRvU3RyaW5nKCksIG51bGwpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBYTUlMaWJyYXJ5UmVzb3VyY2VzLnJlYWRPbmx5RmlsZXNfdGl0bGU7Ci0JCQkJU3RyaW5nIG1zZyA9IFhNSUxpYnJhcnlSZXNvdXJjZXMucmVhZE9ubHlGaWxlc19tc2c7Ci0JCQkJRXJyb3JEaWFsb2cgZXJyRGxnID0gbmV3IEVycm9yRGlhbG9nKE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSwKLQkJCQkJCXRpdGxlLCBtc2csIHN0YXR1cywgSVN0YXR1cy5PSyB8IElTdGF0dXMuSU5GTwotCQkJCQkJCQl8IElTdGF0dXMuV0FSTklORyB8IElTdGF0dXMuRVJST1IpIHsKLQkJCQkJLyoKLQkJCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCQkgKiAKLQkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nI2NyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCQkJCQkgKi8KLQkJCQkJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQkJCQkvLyBjcmVhdGUgUmV0cnksIENhbmNlbCBhbmQgRGV0YWlscyBidXR0b25zCi0JCQkJCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELAotCQkJCQkJCQlJRGlhbG9nQ29uc3RhbnRzLlJFVFJZX0xBQkVMLCB0cnVlKTsKLQotCQkJCQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0KLQkJCQkJCWNyZWF0ZURldGFpbHNCdXR0b24ocGFyZW50KTsKLQkJCQkJfQotCi0JCQkJCS8qCi0JCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkJICogCi0JCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZyNvcGVuKCkKLQkJCQkJICovCi0JCQkJCXB1YmxpYyBpbnQgb3BlbigpIHsKLQkJCQkJCXNob3dEZXRhaWxzQXJlYSgpOwotCQkJCQkJcmV0dXJuIHN1cGVyLm9wZW4oKTsKLQkJCQkJfQotCi0JCQkJfTsKLQkJCQlpZiAoZXJyRGxnLm9wZW4oKSA9PSBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCkgewotCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfSB3aGlsZSAodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlVW5yZXNvbHZlZFJlZmVyZW5jZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChwcm94aWVzVG9SZW1vdmUuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQkvLyBUT0RPOiB1bmNvbW1lbnQgYWZ0ZXIgZXh0ZXJuYWxpemUgdGhlIHRleHQKLQkJLy8gdXBkYXRlU3RhdHVzKG1vbml0b3IsICJSZW1vdmluZyB1bnJlc29sdmVkIHJlZmVyZW5jZXMiKTsKLQkJSGFzaFNldCBHVUlEcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHByb3hpZXNUb1JlbW92ZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUludGVybmFsRU9iamVjdCBwcm94eSA9IChJbnRlcm5hbEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJR1VJRHMuYWRkKHByb3h5LmVQcm94eVVSSSgpLmZyYWdtZW50KCkpOwotCQkJRWNvcmVVdGlsLnJlbW92ZShwcm94eSk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWZvciAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yIGl0ZXJhdG9yID0gKEZlYXR1cmVJdGVyYXRvcikgZWxlbWVudAotCQkJCQkuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlJbnRlcm5hbEVPYmplY3Qgb2JqID0gKEludGVybmFsRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChvYmouZUlzUHJveHkoKQotCQkJCQkJJiYgR1VJRHMuY29udGFpbnMob2JqLmVQcm94eVVSSSgpLmZyYWdtZW50KCkpKSB7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gaXRlcmF0b3IuZmVhdHVyZSgpOwotCQkJCQlpZiAoZmVhdHVyZS5pc0NoYW5nZWFibGUoKSAmJiAhZmVhdHVyZS5pc0Rlcml2ZWQoKSkgewotCQkJCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkoKExpc3QpIGVsZW1lbnQuZUdldChmZWF0dXJlKSkucmVtb3ZlKG9iaik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWVsZW1lbnQuZVNldChmZWF0dXJlLCBudWxsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaWIKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmVyaWZ5KCkgewotCQlub3RGb3VuZFByb3hpZXMuY2xlYXIoKTsKLQkJcHJveGllc1RvUmVtb3ZlLmNsZWFyKCk7Ci0JCXByb3h5VG9GaWxlTWFwLmNsZWFyKCk7Ci0JCXByb3h5VG9GaWxlV2l0aExvYWRFcnJvck1hcC5jbGVhcigpOwotCQlwcm94aWVzV2l0aFVubm9ybWFsaXplZFVSSS5jbGVhcigpOwotCi0JCUNvbGxlY3Rpb248RU9iamVjdD4gcHJveGllcyA9IFBlcnNpc3RlbmNlVXRpbC5nZXRQcm94aWVzKGxpYik7Ci0JCWlmICghcHJveGllcy5pc0VtcHR5KCkpIHsKLQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbGliLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQlVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyID0gcmVzb3VyY2VTZXQuZ2V0VVJJQ29udmVydGVyKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm94aWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUludGVybmFsRU9iamVjdCBwcm94eSA9IChJbnRlcm5hbEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCVVSSSB1cmkgPSBwcm94eS5lUHJveHlVUkkoKTsKLQkJCQlVUkkgbm9ybWFsaXplZFVSSSA9IHVyaUNvbnZlcnRlci5ub3JtYWxpemUodXJpKTsKLQkJCQlpZiAobm9ybWFsaXplZFVSSSA9PSBudWxsKSB7Ci0JCQkJCXByb3hpZXNXaXRoVW5ub3JtYWxpemVkVVJJLmFkZChwcm94eSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUobm9ybWFsaXplZFVSSS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJCQkJcHJveHlUb0ZpbGVNYXAucHV0KHByb3h5LCBmaWxlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZSgKLQkJCQkJCQkJCW5vcm1hbGl6ZWRVUkkudHJpbUZyYWdtZW50KCksIHRydWUpOwotCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRFT2JqZWN0KG5vcm1hbGl6ZWRVUkkuZnJhZ21lbnQoKSkgPT0gbnVsbCkgewotCQkJCQkJCQlub3RGb3VuZFByb3hpZXMuYWRkKHByb3h5KTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCVN0cmluZyBlcnJNc2cgPSBlLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZQotCQkJCQkJCQkJLmdldE1lc3NhZ2UoKSA6IGUudG9TdHJpbmcoKTsKLQkJCQkJCQlwcm94eVRvRmlsZVdpdGhMb2FkRXJyb3JNYXAucHV0KHByb3h5LAotCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgZmlsZSwgZXJyTXNnIH0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFwcm94eVRvRmlsZU1hcC5pc0VtcHR5KCkpIHsKLQkJCS8vIHByb21wIHVzZXIgdG8gcmVzb2x2ZSBtaXNzaW5nIGZpbGVzCi0JCQkvLwotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChwcm94eVRvRmlsZU1hcC5rZXlTZXQoKSk7Ci0JCQlmaW5hbCBTdHJpbmcgRUxFTUVOVF9QQVRIID0gWE1JTGlicmFyeVJlc291cmNlcy5lbGVtZW50UGF0aDsKLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCi0JCQkJLyoKLQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJICogCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCQkJCSAqLwotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCUZpbGUgZmlsZSA9IChGaWxlKSBwcm94eVRvRmlsZU1hcC5nZXQob2JqZWN0KTsKLQkJCQkJcmV0dXJuIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKLQkJCQkJCQkrICIgKCIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgob2JqZWN0KSArICcpJzsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkJCQkgKiAgICAgIGludCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCQkJY2FzZSAwOgotCQkJCQkJcmV0dXJuIHByb3h5VG9GaWxlTWFwLmdldChvYmplY3QpLnRvU3RyaW5nKCk7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgob2JqZWN0KTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCX07Ci0KLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIG1zZyA9IFhNSUxpYnJhcnlSZXNvdXJjZXMucHJvbXB0UmVtb3ZlUmVmZXJlbmNlc1RvTWlzc2luZ0ZpbGVzX21zZzsKLQkJCQlTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IFNlbGVjdGlvbkRpYWxvZyhNc2dCb3gKLQkJCQkJCS5nZXREZWZhdWx0U2hlbGwoKSwgbGlzdCwgbGFiZWxQcm92aWRlciwgbXNnKTsKLQotCQkJCWRsZy5zZXRUaXRsZShYTUlMaWJyYXJ5UmVzb3VyY2VzLm1pc3NpbmdGaWxlc190aXRsZSk7Ci0JCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWRsZy5zZXRJbml0aWFsRWxlbWVudFNlbGVjdGlvbnMobGlzdCk7Ci0JCQkJZGxnCi0JCQkJCQkuc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nW10geyBGSUxFX1BBVEgsCi0JCQkJCQkJCUVMRU1FTlRfUEFUSCB9KTsKLQkJCQlpZiAoZGxnLm9wZW4oKSA9PSBEaWFsb2cuQ0FOQ0VMKSB7Ci0JCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlPYmplY3Qgb2Jqc1tdID0gZGxnLmdldFJlc3VsdCgpOwotCQkJCWlmIChvYmpzID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCXByb3hpZXNUb1JlbW92ZS5hZGQoaXRlci5uZXh0KCkpOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0KLQkJLy8gcHJvbXB0IHVzZXIgdG8gcmVzb2x2ZSBmaWxlcyB0aGF0IGNhbiBub3QgYmUgbG9hZGVkCi0JCS8vCi0JCWlmICghcHJveHlUb0ZpbGVXaXRoTG9hZEVycm9yTWFwLmlzRW1wdHkoKSkgewotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChwcm94eVRvRmlsZVdpdGhMb2FkRXJyb3JNYXAua2V5U2V0KCkpOwotCQkJZmluYWwgU3RyaW5nIExPQURfRVJST1IgPSBYTUlMaWJyYXJ5UmVzb3VyY2VzLmxvYWRFcnJvcjsKLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCi0JCQkJLyoKLQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJICogCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCQkJCSAqICAgICAgaW50KQotCQkJCSAqLwotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQkJT2JqZWN0W10gYXJyID0gKE9iamVjdFtdKSBwcm94eVRvRmlsZU1hcC5nZXQob2JqZWN0KTsKLQkJCQkJaWYgKGNvbHVtbkluZGV4IDwgMikgewotCQkJCQkJcmV0dXJuIGFycltjb2x1bW5JbmRleF0udG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCX07Ci0KLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIG1zZyA9IFhNSUxpYnJhcnlSZXNvdXJjZXMucHJvbXB0UmVtb3ZlUmVmZXJlbmNlc1RvRmlsZXNXaXRoTG9hZEVycm9yc19tc2c7Ci0JCQkJU2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBTZWxlY3Rpb25EaWFsb2coTXNnQm94Ci0JCQkJCQkuZ2V0RGVmYXVsdFNoZWxsKCksIGxpc3QsIGxhYmVsUHJvdmlkZXIsIG1zZyk7Ci0KLQkJCQlkbGcuc2V0VGl0bGUoWE1JTGlicmFyeVJlc291cmNlcy5maWxlc1dpdGhMb2FkRXJyb3JzX3RpdGxlKTsKLQkJCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZGxnLnNldEluaXRpYWxFbGVtZW50U2VsZWN0aW9ucyhsaXN0KTsKLQkJCQlkbGcuc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nW10geyBGSUxFX1BBVEgsIExPQURfRVJST1IgfSk7Ci0JCQkJaWYgKGRsZy5vcGVuKCkgPT0gRGlhbG9nLkNBTkNFTCkgewotCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJT2JqZWN0IG9ianNbXSA9IGRsZy5nZXRSZXN1bHQoKTsKLQkJCQlpZiAob2JqcyA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlwcm94aWVzVG9SZW1vdmUuYWRkKGl0ZXIubmV4dCgpKTsKLQotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCi0JCUFycmF5TGlzdCBwcm94aWVzVG9SZXRhaW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXByb3hpZXMuYWRkQWxsKHByb3h5VG9GaWxlTWFwLmtleVNldCgpKTsKLQkJcHJveGllcy5hZGRBbGwocHJveHlUb0ZpbGVXaXRoTG9hZEVycm9yTWFwLmtleVNldCgpKTsKLQkJcHJveGllcy5yZW1vdmVBbGwocHJveGllc1RvUmVtb3ZlKTsKLQotCQlpZiAocHJveGllc1RvUmV0YWluLmlzRW1wdHkoKSkgewotCQkJcHJveGllc1RvUmVtb3ZlLmFkZEFsbChub3RGb3VuZFByb3hpZXMpOwotCQkJcHJveGllc1RvUmVtb3ZlLmFkZEFsbChwcm94aWVzV2l0aFVubm9ybWFsaXplZFVSSSk7Ci0JCX0KLQotCQlTdHJpbmcgbXNnID0gIlN1bW1hcnkgb2YgdW5yZXNvbHZlZCBwcm94aWVzOiI7IC8vJE5PTi1OTFMtMSQKLQkJbXNnICs9ICJcbiAgTm90IGZvdW5kIHByb3hpZXM6ICIgKyBub3RGb3VuZFByb3hpZXM7IC8vJE5PTi1OTFMtMSQKLQkJbXNnICs9ICJcbiAgUHJveGllcyB3aXRoIHVubm9ybWFsaXplZCBVUkk6ICIgKyBwcm94aWVzV2l0aFVubm9ybWFsaXplZFVSSTsgLy8kTk9OLU5MUy0xJAotCQlYTUlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dJbmZvKG1zZyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU9sZERlZmF1bHRWYWx1ZXMoKSB7Ci0JCU11bHRpUmVzb3VyY2VFT2JqZWN0LnJlbW92ZURlZmF1bHRWYWx1ZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRqdXN0VG9OZXdEZWZhdWx0VmFsdWVzKE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJKChNdWx0aVJlc291cmNlRU9iamVjdCkgZSkKLQkJCQkJLnJlbW92ZUZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRPbGREZWZhdWx0VmFsdWVzKCkgewotCQlNdWx0aVJlc291cmNlRU9iamVjdC5zZXREZWZhdWx0VmFsdWUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCksIEJvb2xlYW4uRkFMU0UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShNZXRob2RFbGVtZW50IGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlhZGp1c3RUb05ld0RlZmF1bHRWYWx1ZXMoZSk7Ci0KLQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBlOwotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBhY3QuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpIHsKLQkJCQlhY3QKLQkJCQkJCS5zZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTik7Ci0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKSB7Ci0JCQkJYWN0Ci0JCQkJCQkuc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCEgKHRoaXMgaW5zdGFuY2VvZiBNaWdyYXRvcjEwMl8xMDMpKSB7Ci0JCQlNaWdyYXRpb25VdGlsLmZvcm1hdFZhbHVlKGUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRNaWdyYXRlKCkgewkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIG1pZ3JhdGVEaWFncmFtKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7CQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yMTAyXzEwMy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yMTAyXzEwMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGY3OTZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvcjEwMl8xMDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS5pbnRlcm5hbC5taWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLQotLyoqCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUgLSBNYXIgMjAsIDIwMDcKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIE1pZ3JhdG9yMTAyXzEwMyBleHRlbmRzIE1pZ3JhdG9yMTAyIHsKLQotCXByaXZhdGUgTWFwPFN0cmluZywgUHJvY2Vzcz4gZGlhZ3JhbUVsZW1NYXA7IAotCQotCXByb3RlY3RlZCB2b2lkIGluaXRNaWdyYXRlKCkgewotCQlkaWFncmFtRWxlbU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgUHJvY2Vzcz4oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKE1ldGhvZEVsZW1lbnQgZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudXBkYXRlKGUsIG1vbml0b3IpOwotCQlNaWdyYXRvcjEwMy51cGRhdGVFbGVtZW50KGUsIGRpYWdyYW1FbGVtTWFwLCBtb25pdG9yKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtaWdyYXRlRGlhZ3JhbShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQlNaWdyYXRvcjEwMy5kaWFncmFtTWlncmF0ZShkaWFncmFtRWxlbU1hcCwgbW9uaXRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yMTAzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0b3IxMDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJmMDU1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0b3IxMDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkuaW50ZXJuYWwubWlncmF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MaW5rSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5JRGlhZ3JhbU1pZ3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uVXBncmFkZUNhbGxlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgV2VpcGluZyBMdSAtIEZlYiAxMiwgMjAwNwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgTWlncmF0b3IxMDMgZXh0ZW5kcyBNaWdyYXRvckJhc2UgewotCQotCXByaXZhdGUgTWFwPFN0cmluZywgUHJvY2Vzcz4gZGlhZ3JhbUVsZW1NYXA7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB4bWxNaWdyYXRlID0gZmFsc2U7Ci0JCi0JcHVibGljIHZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbWlncmF0ZShsaWJQYXRoLCBtb25pdG9yLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBVcGdyYWRlQ2FsbGVySW5mbyBpbmZvKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsZSBsaWJGaWxlID0gbmV3IEZpbGUobGliUGF0aCk7Ci0JCQotCQlib29sZWFuIHRvVmVyaWZ5ID0gdHJ1ZTsKLQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLmdldElzRXhwb3J0ZWRQbHVnaW5MaWIoKSkgewotCQkJdG9WZXJpZnkgPSBmYWxzZTsKLQkJfQotCQl4bWxNaWdyYXRlID0gZmFsc2U7Ci0JCVJlc291cmNlVXRpbC5vcGVuKGxpYkZpbGUuZ2V0UGFyZW50KCksIG1vbml0b3IpOwotCi0JCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IG51bGw7Ci0JCQotCQlkaWFncmFtRWxlbU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgUHJvY2Vzcz4oKTsKLQkJdHJ5IHsKLQkJCS8vIGxvYWQgdGhlIGxpYnJhcnkKLQkJCS8vCi0JCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZExpYnJhcnlUYXNrX25hbWUpOwotCi0JCQlpZiAodG9WZXJpZnkpIHsKLQkJCQlyZXNvdXJjZVNldCA9IG5ldyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoZmFsc2UpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXNvdXJjZVNldCA9IE1pZ3JhdG9yMTAyLmdldEltcG9ydFBsdWdpblJlc291cmNlU2V0KCk7Ci0JCQl9Ci0JCQkJCQkKLQkJCXJlc291cmNlU2V0LmdldExvYWRPcHRpb25zKCkucHV0KAotCQkJCQlYTUxSZXNvdXJjZS5PUFRJT05fUkVDT1JEX1VOS05PV05fRkVBVFVSRSwgQm9vbGVhbi5UUlVFKTsKLQotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSByZXNvdXJjZVNldC5sb2FkTGlicmFyeShsaWJQYXRoKTsKLQkJCQkJCQotCQkJTGlua0luZm8uc2V0TGlicmFyeShsaWIpOwotCQkJLy8gbG9hZCBhbGwgZWxlbWVudHMgaW4gbWVtb3J5Ci0JCQkvLwotCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLmxvYWRSZXNvdXJjZXNUYXNrX25hbWUpOwotCQkJCi0JCQl1cGRhdGVBbGxDb250ZW50cyhtb25pdG9yLCBsaWIpOwkJCQkJCi0JCQkKLQkJCS8vIHNhdmUgYWxsIGZpbGVzCi0JCQkvLwotCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLnNhdmVMaWJyYXJ5VGFza19uYW1lKTsKLQkJCU1hcCBzYXZlT3B0aW9ucyA9IHJlc291cmNlU2V0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQkJcmVzb3VyY2VTZXQuc2F2ZShzYXZlT3B0aW9ucywgdHJ1ZSk7Ci0KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLAotCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5yZWZyZXNoTGlicmFyeUZpbGVzVGFza19uYW1lKTsKLQkJCQotCQkJCi0JCQlSZXNvdXJjZVV0aWwucmVmcmVzaFJlc291cmNlcyhsaWIsIG1vbml0b3IpOwotCQkJCi0JCQlkaWFncmFtTWlncmF0ZShkaWFncmFtRWxlbU1hcCwgbW9uaXRvcik7CQotCQkJCi0JCQlSZXNvdXJjZVV0aWwucmVmcmVzaFJlc291cmNlcyhsaWIsIG1vbml0b3IpOwotCQkJCi0JCX0gZmluYWxseSB7Ci0JCQlMaW5rSW5mby5zZXRMaWJyYXJ5KG51bGwpOwotCQkJCi0JCQlpZiAocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCXJlc291cmNlU2V0LnJlc2V0KCk7Ci0JCQkJcmVzb3VyY2VTZXQgPSBudWxsOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZGlhZ3JhbU1pZ3JhdGUoTWFwPFN0cmluZywgUHJvY2Vzcz4gZGlhZ3JhbUVsZW1NYXAsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBDb252ZXJ0IGRpYWdyYW1zIAotCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMubWlncmF0aW5nRGlhZ3JhbV9uYW1lKTsKLQkJCi0JCUlEaWFncmFtTWlncmF0aW9uIGlkbSA9IChJRGlhZ3JhbU1pZ3JhdGlvbikgRXh0ZW5zaW9uTWFuYWdlci5nZXRFeHRlbnNpb24oIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaSIsICJkaWFncmFtTWlncmF0aW9uIik7IAkJCS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpZiAoaWRtICE9IG51bGwgJiYgIWRpYWdyYW1FbGVtTWFwLmlzRW1wdHkoKSkgewotCQkJdHJ5IHsKLQkJCQlpZG0ubWlncmF0ZShkaWFncmFtRWxlbU1hcC52YWx1ZXMoKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdXBkYXRlRWxlbWVudChlbGVtZW50LCBkaWFncmFtRWxlbU1hcCwgbW9uaXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHVwZGF0ZUVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBNYXA8U3RyaW5nLCBQcm9jZXNzPiBkaWFncmFtRWxlbU1hcCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGRpYWdyYW1FbGVtTWFwICE9IG51bGwpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4gfHwKLQkJCQllbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJUHJvY2VzcyBwcm9jZXNzID0gKFByb2Nlc3MpIGVsZW1lbnQ7Ci0JCQkJaWYgKHByb2Nlc3MuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlTdHJpbmcgZ3VpZCA9IGVsZW1lbnQuZ2V0R3VpZCgpOwotCQkJCQlQcm9jZXNzIHByb2MgPSBkaWFncmFtRWxlbU1hcC5nZXQoZ3VpZCk7Ci0JCQkJCWlmIChwcm9jID09IG51bGwpIHsKLQkJCQkJCWRpYWdyYW1FbGVtTWFwLnB1dChlbGVtZW50LmdldEd1aWQoKSwgKFByb2Nlc3MpIGVsZW1lbnQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYXNzZXJ0KHByb2MgPT0gZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTWlncmF0aW9uVXRpbC5mb3JtYXRWYWx1ZShlbGVtZW50KTsKLQkJaGFuZGxlVHlwZUNvbnZlcnQoZWxlbWVudCk7Ci0JCWlmICghIHhtbE1pZ3JhdGUpIHsKLQkJCWhhbmRsZVNoYXBlQW5kTm9kZUljb25zKGVsZW1lbnQpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlVHlwZUNvbnZlcnQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKAllbGVtZW50IGluc3RhbmNlb2YgRXhhbXBsZSAJCQl8fAotCQkJCWVsZW1lbnQgaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0IAl8fAotCQkJCWVsZW1lbnQgaW5zdGFuY2VvZiBXaGl0ZXBhcGVyKSB7CQkJCi0JCQlHdWlkYW5jZSBndWlkYW5jZSA9IChHdWlkYW5jZSkgZWxlbWVudDsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBwcmVzID0gY29udmVydChndWlkYW5jZS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQlpZiAocHJlcyAhPSBudWxsKSB7Ci0JCQkJZ3VpZGFuY2Uuc2V0UHJlc2VudGF0aW9uKHByZXMpOwotCQkJfQkJCQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEd1aWRhbmNlRGVzY3JpcHRpb24gY29udmVydChDb250ZW50RGVzY3JpcHRpb24gb2xkT2JqKSB7Ci0JCWlmIChvbGRPYmogPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJR3VpZGFuY2VEZXNjcmlwdGlvbiBuZXdPYmogPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uKCk7CQkKLQkJUmVzb3VyY2UgcmVzID0gb2xkT2JqLmVSZXNvdXJjZSgpOwotCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCXJlcy5nZXRDb250ZW50cygpLnJlbW92ZShvbGRPYmopOwotCQkJcmVzLmdldENvbnRlbnRzKCkuYWRkKG5ld09iaik7Ci0JCX0KLQkJTGlzdCBmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhvbGRPYmopOwotLy8JCUxpc3QgcHJvcGVydGllcyA9IG9sZE9iai5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsJCQotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJCU9iamVjdCB2YWx1ZSA9IG9sZE9iai5lR2V0KGZlYXR1cmUpOwotCQkJCW5ld09iai5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJCX0KLQkJfQotCQkJCQotCQlyZXR1cm4gbmV3T2JqOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGhhbmRsZVNoYXBlQW5kTm9kZUljb25zKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7CQkJCi0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZGVzY3JpYmFibGVFbGVtZW50ID0gKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudDsKLQkJCVVSSSBmaXhlZFVSSSA9IGZpeEljb25VUkkoZGVzY3JpYmFibGVFbGVtZW50LCBkZXNjcmliYWJsZUVsZW1lbnQuZ2V0U2hhcGVpY29uKCkpOwotCQkJaWYgKGZpeGVkVVJJICE9IG51bGwpIHsKLQkJCQlkZXNjcmliYWJsZUVsZW1lbnQuc2V0U2hhcGVpY29uKGZpeGVkVVJJKTsKLQkJCX0KLQkJCWZpeGVkVVJJID0gZml4SWNvblVSSShkZXNjcmliYWJsZUVsZW1lbnQsIGRlc2NyaWJhYmxlRWxlbWVudC5nZXROb2RlaWNvbigpKTsKLQkJCWlmIChmaXhlZFVSSSAhPSBudWxsKSB7Ci0JCQkJZGVzY3JpYmFibGVFbGVtZW50LnNldE5vZGVpY29uKGZpeGVkVVJJKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIFVSSSBmaXhJY29uVVJJKERlc2NyaWJhYmxlRWxlbWVudCBlLCBVUkkgdXJpKSB7Ci0JCWlmICh1cmkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCQotCQlGaWxlIHBhdGggPSBuZXcgRmlsZShOZXRVdGlsLmRlY29kZWRGaWxlVXJsKHVyaS50b1N0cmluZygpKSk7Ci0JCVN0YWNrPFN0cmluZz4gc3RhY2sgPSBuZXcgU3RhY2s8U3RyaW5nPigpOwotCQlGaWxlIHRlbXAgPSBwYXRoOwotCQlTdHJpbmcgcmVzdWx0UGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlICh0ZW1wICE9IG51bGwpIHsKLQkJCXN0YWNrLnB1c2godGVtcC5nZXROYW1lKCkpOwotCQkJdGVtcCA9IHRlbXAuZ2V0UGFyZW50RmlsZSgpOwotCQl9Ci0JCWlmICghc3RhY2suaXNFbXB0eSgpKSB7Ci0JCQkvLyBub3cgc2tpcCBmaXJzdCBzdGFjayBlbnRyeSBhbmQgcmVjb25zdHJ1Y3QgcGF0aAotCQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBzdGFjay5wb3AoKTsKLQkJCXdoaWxlICghc3RhY2suaXNFbXB0eSgpKSB7Ci0JCQkJaWYgKHJlc3VsdFBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXJlc3VsdFBhdGggKz0gJy8nOwotCQkJCX0KLQkJCQlyZXN1bHRQYXRoID0gcmVzdWx0UGF0aCArIChTdHJpbmcpc3RhY2sucG9wKCk7Ci0JCQl9Ci0KLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJCXRyeSB7Ci0JCQkJVVJJIHJlc3VsdFVSSSA9IG5ldyBVUkkocmVzdWx0UGF0aCk7Ci0JCQkJaWYgKCFwbHVnaW5OYW1lLmVxdWFscyhwbHVnaW4uZ2V0TmFtZSgpKSkgewotCQkJCQkvLyB1cmkgd2FzIHJlZmVyaW5nIGEgZmlsZSBpbiBhbm90aGVyIHBsdWdpbgotCQkJCQlGaWxlIGxpYlJvb3QgPSBUbmdVdGlsLmdldExpYnJhcnlSb290UGF0aChlKTsKLQkJCQkJRmlsZSBvbGRGaWxlID0gbmV3IEZpbGUobGliUm9vdCwgTmV0VXRpbC5kZWNvZGVkRmlsZVVybCh1cmkudG9TdHJpbmcoKSkpOwotCQkJCQlGaWxlIG5ld0ZpbGUgPSBuZXcgRmlsZShsaWJSb290LCBwbHVnaW4uZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3IgKyBOZXRVdGlsLmRlY29kZWRGaWxlVXJsKHJlc3VsdFVSSS50b1N0cmluZygpKSk7Ci0JCQkJCWlmICghbmV3RmlsZS5leGlzdHMoKSkgewotCSAgICAgIAkJCQkJRmlsZVV0aWwuY29weUZpbGUob2xkRmlsZSwgbmV3RmlsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdFVSSTsKLQkJCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBleCkgewotCQkJCVhNSUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgbWlncmF0ZVhtbEltcG9ydGVkTGliKE1ldGhvZExpYnJhcnkgbGliLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQl4bWxNaWdyYXRlID0gdHJ1ZTsKLQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFhNSUxpYnJhcnlSZXNvdXJjZXMubWlncmF0ZVhNTExpYnJhcnlfdGFza05hbWUpOwotCQl1cGRhdGVBbGxDb250ZW50cyhtb25pdG9yLCBsaWIpOwotCQlMaWJyYXJ5VXRpbC5zYXZlTGlicmFyeShsaWIsIGZhbHNlLCBmYWxzZSk7Ci0JCXhtbE1pZ3JhdGUgPSBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvckJhc2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvckJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJhMTZjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0b3JCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkuaW50ZXJuYWwubWlncmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5NaWdyYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIEJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gZm9yIG1pZ3JhdG9ycwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUgLSBGZWIgMTIsIDIwMDcKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1pZ3JhdG9yQmFzZSBleHRlbmRzIE1pZ3JhdG9ySW1wbCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gWE1JTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCB1cGRhdGVTdGF0dXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgbXNnKSB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3Iuc3ViVGFzayhtc2cpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgxMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUFsbENvbnRlbnRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgTWV0aG9kTGlicmFyeSBsaWIpIHRocm93cyBFeGNlcHRpb24gewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLmVycgotCQkJCQkJCQkucHJpbnRsbigiRXJyb3IgaXRlcmF0ZSB0aHJ1IGNyb3NzIHJlZmVyZW5jZXMgb2YgZWxlbWVudDogIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJdXBkYXRlRWxlbWVudCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCwgbW9uaXRvcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdXBkYXRlRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW1lbnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbjsJCi0JCi0JcHVibGljIGFic3RyYWN0IHZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uOwotCQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIG1pZ3JhdGUoU3RyaW5nIGxpYlBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVXBncmFkZUNhbGxlckluZm8gaW5mbykgdGhyb3dzIEV4Y2VwdGlvbjsKLQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL1NlbGVjdGlvbkRpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL1NlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGI3OGJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9TZWxlY3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS5pbnRlcm5hbC5taWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiBEaXNwbGF5cyBhIGRpYWxvZyB0aGF0IGxpc3RzIG1pc3NpbmcgZmlsZXMgaW4gYSBtZXRob2QgbGlicmFyeSB0byBiZSB1cGdyYWRlZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIExpc3RTZWxlY3Rpb25EaWFsb2cgewotCi0JcHJpdmF0ZSBTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBPYmplY3QgaW5wdXQsCi0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLCBTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgaW5wdXQsIGNvbnRlbnRQcm92aWRlciwgbGFiZWxQcm92aWRlciwgbWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBMaXN0IGlucHV0LAotCQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGlucHV0LCBuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKExpc3QpIG9iamVjdCkudG9BcnJheSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LAotCQkJCQlPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQkJfSwgbGFiZWxQcm92aWRlciwgbWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uUHJvcGVydGllcyhTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzKSB7Ci0JCXRoaXMuY29sdW1uUHJvcGVydGllcyA9IGNvbHVtblByb3BlcnRpZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3RTZWxlY3Rpb25EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgY3RybCA9IHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQkvLyBjcmVhdGUgdGFibGUgY29sdW1ucwotCQkvLwotCQlUYWJsZSB0YWJsZSA9IGdldFZpZXdlcigpLmdldFRhYmxlKCk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uUHJvcGVydGllcy5sZW5ndGg7IGkrKykgewotCQkJVGFibGVDb2x1bW4gY29sID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JCQljb2wuc2V0VGV4dChjb2x1bW5Qcm9wZXJ0aWVzW2ldKTsKLQkJCWNvbC5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCQljb2wuc2V0V2lkdGgoMjAwKTsKLQkJfQotCQlnZXRWaWV3ZXIoKS5zZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotCQlnZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0KLQkJcmV0dXJuIGN0cmw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg3YzNkZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgbWlncmF0aW9uIHN1cHBvcnQgZm9yIHVwZ3JhZGluZyBhIFhNSS1iYXNlZCBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/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+Ci0JICogVGhlc2UgaW1hZ2VzIGFyZSBjYWNoZWQgYW5kIHNob3VsZCBub3QgYmUgZGlzcG9zZWQgYnkgdGhlIHVzZXIhCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQUNUSVZJVFkgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvQWN0aXZpdHkiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQVJUSUZBQ1QgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvQXJ0aWZhY3QiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQ0FQQUJJTElUWV9QQVRURVJOID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJuIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0NIRUNLTElTVCA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9DaGVja2xpc3QiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQ09NUE9TSVRFX1JPTEUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvQ29tcG9zaXRlUm9sZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19DT05DRVBUID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0NvbmNlcHQiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQ09OVEVOVF9QQUNLQUdFID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0NvbnRlbnRQYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0NVU1RPTV9DQVRFR09SWSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yeSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ERUxJVkVSQUJMRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9EZWxpdmVyYWJsZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ERUxJVkVSWV9QUk9DRVNTID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2VzcyIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ESVNDSVBMSU5FID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0Rpc2NpcGxpbmUiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfRElTQ0lQTElORV9HUk9VUElORyA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9EaXNjaXBsaW5lR3JvdXBpbmciKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfRE9NQUlOID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0RvbWFpbiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19FU1RJTUFURSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Fc3RpbWF0ZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19FU1RJTUFUSU5HX01FVFJJQyA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Fc3RpbWF0aW5nTWV0cmljIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0VYQU1QTEUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvRXhhbXBsZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19HVUlERUxJTkUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvR3VpZGVsaW5lIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0lURVJBVElPTiA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9JdGVyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX01FVEhPRF9DT05GSUdVUkFUT04gPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19NRVRIT0RfTElCQVJBUlkgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kTGlicmFyeSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19NRVRIT0RfUEFDS0FHRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX01FVEhPRF9QTFVHSU4gPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGx1Z2luIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX01JTEVTVE9ORSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9NaWxlc3RvbmUiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfT1VUQ09NRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9PdXRjb21lIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1BIQVNFID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1BoYXNlIik7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19QUkFDVElDRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9QcmFjdGljZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19QUk9DRVNTID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1BST0NFU1NfQ09OVFJJQlVUSU9OID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3NDb250cmlidXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUFJPQ0VTU19GQU1JTFkgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlseSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19QUk9DRVNTX1BBQ0tBR0UgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvUHJvY2Vzc1BhY2thZ2UiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUkVQT1JUID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1JlcG9ydCIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ST0FETUFQID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1JvYWRtYXAiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUk9MRV9ERVNDUklQVE9SID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1JvbGVEZXNjcmlwdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1JPTEUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvUm9sZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ST0xFX1NFVCA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Sb2xlU2V0Iik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1JPTEVfU0VUX0dST1VQSU5HID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1JvbGVTZXRHcm91cGluZyIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19TVVBQT1JUSU5HX01BVEVSSUFMID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1N1cHBvcnRpbmdNYXRlcmlhbCIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19UQVNLID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Rhc2siKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfVEFTS19ERVNDUklQVE9SID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1RFQU1fUFJPRklMRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9UZWFtUHJvZmlsZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19URU1QTEFURSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9UZW1wbGF0ZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19URVJNX0RFRklOSVRJT04gPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvVGVybURlZmluaXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfVE9PTCA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Ub29sIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1RPT0xfTUVOVE9SID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Rvb2xNZW50b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfV0hJVEVQQVBFUiA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9XaGl0ZXBhcGVyIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1dPUktfUFJPRFVDVCA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdCIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19XT1JLX1BST0RVQ1RfVFlQRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZ2l2ZW4gdGhlIHJlbGF0aXZlIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgcGF0aCByZWxhdGl2ZSB0byAiaWNvbnMiIGZvbGRlciBpbiB0aGUgdGhlIFVNQSBFZGl0IHBsdWctaW4KLQkgKiBAcmV0dXJuIGFuIDxjb2RlPkltYWdlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGdldEVsZW1lbnRJbWFnZShTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoCi0JCQkJVW1hRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZShwYXRoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4NWZmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuSTE4blV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGF5b3V0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZmVyZW5jZXMuTGlicmFyeVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLlByZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9ncy5Db3B5TGlicmFyeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLkxpYnJhcnlCYWNrdXBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uTWFwcGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5NZXNzYWdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Ub29sQmFyQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGF0YWxvY2F0aW9uLkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IExpYnJhcnkgVUkgTWFuYWdlciBpbXBsZW1lbnRhdGlvbi4KLSAqIDxwPgotICogQSBMaWJyYXJ5IE1hbmFnZXIgcHJvdmlkZXMgdGhlIHVzZXIgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBhbmQgb3BlbmluZyBhCi0gKiBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVVJTWFuYWdlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTEJBUl9DT05GSUdfQ09OVFJJQlVUSU9OX0lEID0gInRvb2xiYXIuY29uZmlnLmNvbnRyaWJ1dGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfVklFV19JRCA9ICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NfRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgTGlicmFyeVVJTWFuYWdlciBpbnN0YW5jZSA9IG51bGw7Ci0JCi0JLy8gVGhlIFVSSSBvZiB0aGUgbWV0aG9kIGxpYnJhcnkgdGhhdCB3aWxsIGJlIG9wZW5lZCByZWdhcmRsZXNzIG9mIHRoZQotCS8vIHNhdmVkIGxpYnJhcnkgcHJlZmVyZW5jZXMuCi0JcHJvdGVjdGVkIHN0YXRpYyBVUkkgbGlicmFyeVVSSTsKLQotCS8vIFRoZSBVUkkgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2lsbCBiZSBvcGVuZWQgb25seSBpZiB0aGVyZSBhcmUKLQkvLyBubyBzYXZlZCBsaWJyYXJ5IHByZWZlcmVuY2VzLgotCXByb3RlY3RlZCBzdGF0aWMgVVJJIGRlZmF1bHRMaWJyYXJ5VVJJOwotCXByb3RlY3RlZCBzdGF0aWMgVVJJIGRlZmF1bHRMaWJyYXJ5VVJJX05MOwotCXByaXZhdGUgYm9vbGVhbiBsaWJyYXJ5SW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpYnJhcnlVSU1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKExpYnJhcnlVSU1hbmFnZXIuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBMaWJyYXJ5VUlNYW5hZ2VyKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBQcml2YXRlIGRlZmF1bHQgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcKLQkgKiBpbnN0YW50aWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBMaWJyYXJ5VUlNYW5hZ2VyKCkgewotCQkvLyBNb25pdG9yIHBlcnNwZWN0aXZlIGNoYW5nZXMgdG8gZGlzcGxheS9oaWRlIHRoZSBjb25maWd1cmF0aW9uIGNvbWJvLgotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJd2luZG93LmFkZFBlcnNwZWN0aXZlTGlzdGVuZXIobmV3IElQZXJzcGVjdGl2ZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHBlcnNwZWN0aXZlQWN0aXZhdGVkKElXb3JrYmVuY2hQYWdlIHBhZ2UsCi0JCQkJCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGRlc2MpIHsKLQkJCQkJY2hlY2tDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcGVyc3BlY3RpdmVDaGFuZ2VkKElXb3JrYmVuY2hQYWdlIHBhZ2UsCi0JCQkJCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGRlc2MsIFN0cmluZyBpZCkgewotCQkJCQljaGVja0NvbmZpZ3VyYXRpb25Db250cmlidXRpb24oKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIG9wZW5zIGEgbmV3IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGxpYnJhcnkgcGF0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBsaWJyYXJ5IGlzIGNyZWF0ZWQgYW5kIG9wZW5lZAotCSAqICAgICAgICAgc3VjY2Vzc2Z1bGx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gY3JlYXRlTGlicmFyeShTdHJpbmcgcGF0aCkgewotCQl0cnkgewotCQkJRmlsZSBsaWJyYXJ5UGF0aCA9IG5ldyBGaWxlKHBhdGgpOwotCQkJaWYgKCFsaWJyYXJ5UGF0aC5leGlzdHMoKSkgewotCQkJCWxpYnJhcnlQYXRoLm1rZGlycygpOwotCQkJfQotCQkJWE1JTGlicmFyeVV0aWwuY3JlYXRlTWV0aG9kTGlicmFyeShsaWJyYXJ5UGF0aC5nZXROYW1lKCksIHBhdGgpOwotCQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2V0U2F2ZWRMaWJyYXJ5UGF0aChwYXRoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIE9wZW5zIHRoZSBkZWZhdWx0IG1ldGhvZCBsaWJyYXJ5IGdpdmVuIHRoZSBkZWZhdWx0IGxpYnJhcnkgcGF0aCBVUkkuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFVSSSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgbGlicmFyeSBpcyBvcGVuZWQgc3VjY2Vzc2Z1bGx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gb3BlbkRlZmF1bHRMaWJyYXJ5KGZpbmFsIFVSSSB1cmkpIHsKLQkJdHJ5IHsKLQkJCUZpbGUgZGVmYXVsdExpYnJhcnlQYXRoRmlsZSA9IG5ldyBGaWxlKHVyaSk7Ci0JCQlGaWxlIGxpYnJhcnlYTUlGaWxlID0gbmV3IEZpbGUoZGVmYXVsdExpYnJhcnlQYXRoRmlsZSwgWE1JTGlicmFyeU1hbmFnZXIuTElCUkFSWV9YTUkpOwotCQkJaWYgKCFsaWJyYXJ5WE1JRmlsZS5leGlzdHMoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0JCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCVVSSSBsaWJVcmkgPSB1cmk7Ci0JCQkJCQlTdHJpbmcgbmV3UGF0aCA9IGhhbmRsZUxpYnJhcnlPblJlYWRPbmx5SW5zdGFsbFBhdGgobGliVXJpKTsKLQkJCQkJCWlmIChuZXdQYXRoICE9IG51bGwpIHsKLQkJCQkJCQlsaWJVcmkgPSBTdHJVdGlsLnRvVVJJKG5ld1BhdGgpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlTdHJpbmcgdGFza05hbWUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbmluZ0xpYnJhcnlUYXNrX25hbWU7Ci0JCQkJCQltb25pdG9yLmJlZ2luVGFzayh0YXNrTmFtZSwgMik7Ci0JCQkJCQltb25pdG9yLnNldFRhc2tOYW1lKHRhc2tOYW1lKTsKLQkJCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jbG9zZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLm9wZW5NZXRob2RMaWJyYXJ5KCJ4bWkiLCBsaWJVcmkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQkJUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpIHsKLQkJCQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQkJCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0JCQkJCXNoZWxsLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlKTsKLQkJCQl9Ci0JCQl9OwotCQkJZGlhbG9nLnJ1bih0cnVlLCBmYWxzZSwgb3BlcmF0aW9uKTsKLQkJCXJldHVybiBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgIT0gbnVsbDsKLQkJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gZG9uJ3QgZG8gYW55dGhpbmcKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgdGhlIGxhc3Qgb3BlbmVkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBVUkkgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGxpYnJhcnkgaXMgb3BlbmVkIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBib29sZWFuIG9wZW5MYXN0T3BlbmVkTGlicmFyeSgpIHsKLQkJdHJ5IHsKLQkJCQotCQkJLy8gZmlyc3QgY2hlY2sgZm9yIHNhdmVkIGxpYiBpbiBwcmVmZXJlbmNlCi0JCQkvLyBzbyB0aGF0IHdlIGRvbid0IHNob3cgcHJvZ3Jlc3MgbW9uaXRvciBpZiB0aGVyZSdzIG5vIGxpYgotCQkJU3RyaW5nIHNhdmVkTWV0aG9kTGlicmFyeVVSSSA9IExpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5nZXRTYXZlZE1ldGhvZExpYnJhcnlVUkkoKTsKLQkJCVVSSSB1cmkgPSBuZXcgVVJJKHNhdmVkTWV0aG9kTGlicmFyeVVSSSk7Ci0JCQlpZiAodXJpLmdldFBhdGgoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLQkJCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIHRhc2tOYW1lID0gTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5pbmdMaWJyYXJ5VGFza19uYW1lOwotCQkJCQkJbW9uaXRvci5iZWdpblRhc2sodGFza05hbWUsIDIpOwotCQkJCQkJbW9uaXRvci5zZXRUYXNrTmFtZSh0YXNrTmFtZSk7Ci0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuY2xvc2VDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5vcGVuTGFzdE9wZW5lZE1ldGhvZExpYnJhcnkoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCkgewotCQkJCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCQkJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJCQkJc2hlbGwuc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUpOwotCQkJCX0KLQkJCX07Ci0JCQlkaWFsb2cucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOwotCQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSAhPSBudWxsOwotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkb24ndCBkbyBhbnl0aGluZwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhIG1ldGhvZCBsaWJyYXJ5IGdpdmVuIHRoZSBsaWJyYXJ5IHBhdGggVVJJLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBVUkkgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGxpYnJhcnkgaXMgb3BlbmVkIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBib29sZWFuIG9wZW5MaWJyYXJ5KGZpbmFsIFVSSSB1cmkpIHsKLQkJTWFwPFN0cmluZywgT2JqZWN0PiBhcmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCWFyZ3MucHV0KFhNSUxpYnJhcnlNYW5hZ2VyLkFSR19MSUJSQVJZX1BBVEgsIG5ldyBGaWxlKHVyaSkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlyZXR1cm4gb3BlbkxpYnJhcnkoWE1JTGlicmFyeU1hbmFnZXIuTElCUkFSWV9UWVBFLCBhcmdzKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhIG1ldGhvZCBsaWJyYXJ5IGdpdmVuIHRoZSBsaWJyYXJ5IHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBsaWJyYXJ5IGlzIG9wZW5lZCBzdWNjZXNzZnVsbHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBvcGVuTGlicmFyeShmaW5hbCBTdHJpbmcgcGF0aCkgewotCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGFyZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQkJYXJncy5wdXQoWE1JTGlicmFyeU1hbmFnZXIuQVJHX0xJQlJBUllfUEFUSCwgcGF0aCk7Ci0JCXJldHVybiBvcGVuTGlicmFyeShYTUlMaWJyYXJ5TWFuYWdlci5MSUJSQVJZX1RZUEUsIGFyZ3MpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkgc3BlY2lmaWMgYXJndW1lbnRzCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGxpYnJhcnkgaXMgb3BlbmVkIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBib29sZWFuIG9wZW5MaWJyYXJ5KGZpbmFsIFN0cmluZyB0eXBlLCBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGFyZ3MpIHsKLQkJZmluYWwgU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBhcmdzCi0JCQkJLmdldChYTUlMaWJyYXJ5TWFuYWdlci5BUkdfTElCUkFSWV9QQVRIKTsKLQotCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0KLQkJZmluYWwgTGlzdDxFeGNlcHRpb24+IGVycm9ycyA9IG5ldyBBcnJheUxpc3Q8RXhjZXB0aW9uPigpOwotCi0JCS8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24gYmVjYXVzZSB0aGlzIGlzIGEgbG9uZyBydW5uaW5nCi0JCS8vIGFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgdGhlIHdvcmtzcGFjZS4KLQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCVN0cmluZyB0YXNrTmFtZSA9IExpYnJhcnlVSVJlc291cmNlcy5vcGVuaW5nTGlicmFyeVRhc2tfbmFtZTsKLQkJCQltb25pdG9yLmJlZ2luVGFzayh0YXNrTmFtZSwgMik7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5zZXRUYXNrTmFtZSh0YXNrTmFtZSk7Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmNsb3NlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5vcGVuTWV0aG9kTGlicmFyeSh0eXBlLCBhcmdzKTsKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zZXRDdXJyZW50TWV0aG9kTGlicmFyeSgKLQkJCQkJCQlsaWJyYXJ5KTsKLQkJCQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2V0U2F2ZWRMaWJyYXJ5UGF0aChwYXRoKTsKLQotCQkJCQkvLyBTaG93IFByb2JsZW1zIFZpZXcgaWYgbmVjZXNzYXJ5LgotCQkJCQlJTGlicmFyeVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gKChJTGlicmFyeVJlc291cmNlU2V0KSBMaWJyYXJ5U2VydmljZQotCQkJCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpCi0JCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCQkJaWYgKHJlc291cmNlU2V0Lmhhc1VucmVzb2x2ZWRQcm94eSgpKSB7Ci0JCQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCVBsYXRmb3JtVUkKLQkJCQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlUGFnZSgpCi0JCQkJCQkJCQkJCS5zaG93VmlldygKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UudWkudmlld3MuUHJvYmxlbVZpZXciLCBudWxsLCBJV29ya2JlbmNoUGFnZS5WSUVXX1ZJU0lCTEUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKCEoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uICYmIGUuZ2V0TWVzc2FnZSgpCi0JCQkJCQkJLnN0YXJ0c1dpdGgoIiMjIyIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJCWVycm9ycy5hZGQoZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCkgewotCQkJCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCQkJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJCQkJc2hlbGwuc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUpOwotCQkJCX0KLQkJCX07Ci0JCQlkaWFsb2cucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOwotCQkJaWYgKGVycm9ycy5pc0VtcHR5KCkpIHsKLQkJCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQlpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCQkJCWFjdGl2ZVBhZ2UuY2xvc2VBbGxFZGl0b3JzKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJSXRlcmF0b3I8RXhjZXB0aW9uPiBpdGVyID0gZXJyb3JzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCUV4Y2VwdGlvbiBlID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQkJCQlpZiAobWVzc2FnZS5zdGFydHNXaXRoKCIjIyMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIHByb2plY3RGaWxlTmFtZSA9IG1lc3NhZ2Uuc3Vic3RyaW5nKDMpOwotCi0JCQkJCQkJU3RyaW5nIHByb21wdCA9IExpYnJhcnlVSVJlc291cmNlcwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5yZWFkT25seVByb2plY3RGaWxlX3RleHQsCi0JCQkJCQkJCQkJCXByb2plY3RGaWxlTmFtZSk7Ci0JCQkJCQkJU3RyaW5nW10gYnV0dG9uTGFiZWxzID0gewotCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnJldHJ5QnV0dG9uX3RleHQsCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuY2FuY2VsQnV0dG9uX3RleHQgfTsKLQkJCQkJCQlNZXNzYWdlRGlhbG9nIG1zZ0JveCA9IG5ldyBNZXNzYWdlRGlhbG9nKERpc3BsYXkKLQkJCQkJCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCQkJCW51bGwsIHByb21wdCwgTWVzc2FnZURpYWxvZy5XQVJOSU5HLAotCQkJCQkJCQkJYnV0dG9uTGFiZWxzLCAwKTsKLQkJCQkJCQlpZiAobXNnQm94Lm9wZW4oKSA9PSAwKSB7Ci0JCQkJCQkJCXJldHVybiBvcGVuTGlicmFyeShwYXRoKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlUaHJvd2FibGUgZXggPSBlOwotCQkJCQkJZm9yIChleCA9IGU7IGV4ICE9IG51bGwKLQkJCQkJCQkJJiYgIShleCBpbnN0YW5jZW9mIE1lc3NhZ2VFeGNlcHRpb24pOyBleCA9IGV4Ci0JCQkJCQkJCS5nZXRDYXVzZSgpKQotCQkJCQkJCTsKLQkJCQkJCVN0cmluZyBtc2cgPSBleCAhPSBudWxsICYmIGV4LmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZXgKLQkJCQkJCQkJLmdldE1lc3NhZ2UoKSA6IGUuZ2V0TWVzc2FnZSgpICE9IG51bGwgPyBlCi0JCQkJCQkJCS5nZXRNZXNzYWdlKCkgOiBlLnRvU3RyaW5nKCk7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQkJCQkJbXNnLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVXBncmFkZXMgYSBtZXRob2QgbGlicmFyeSB0byBhIG5ldyBtZXRhLW1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBsaWJQYXRoCi0JICogICAgICAgICAgICBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkgZm9sZGVyCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gbWV0aG9kIGxpYnJhcnkgaXMgc3VjZXNzZnVsbHkKLQkgKiAgICAgICAgIHVwZ3JhZGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHVwZ3JhZGVMaWJyYXJ5KGZpbmFsIFN0cmluZyBsaWJQYXRoLAotCQkJZmluYWwgVXBncmFkZUNhbGxlckluZm8gY2FsbGVySW5mbykgewotCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCWlmIChVcGdyYWRlQ2FsbGVySW5mby5pc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pKSB7Ci0JCQlMaWJyYXJ5QmFja3VwVXRpbC5wcm9tcHRCYWNrdXBMaWJyYXJ5KHNoZWxsLCBuZXcgRmlsZShsaWJQYXRoKSk7Ci0JCX0KLQotCQlTdHJpbmcgbGliWG1pID0gTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9MSUJSQVJZX01PREVMX0ZJTEVOQU1FOwotCQlpZiAoY2FsbGVySW5mbyAhPSBudWxsICYmIGNhbGxlckluZm8uZ2V0SXNFeHBvcnRlZFBsdWdpbkxpYigpKSB7Ci0JCQlsaWJYbWkgPSBYTUlMaWJyYXJ5TWFuYWdlci5leHBvcnRGaWxlOwotCQl9Ci0JCXJldHVybiB1cGdyYWRlTGlicmFyeShuZXcgRmlsZShsaWJQYXRoLCBsaWJYbWkpLCBjYWxsZXJJbmZvKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXBncmFkZUxpYnJhcnkoZmluYWwgRmlsZSBsaWJGaWxlLAotCQkJZmluYWwgVXBncmFkZUNhbGxlckluZm8gY2FsbGVySW5mbykgewotCQlmaW5hbCBTdHJpbmdCdWZmZXIgZXJyTXNnID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmaW5hbCBib29sZWFuW10gY2FuY2VsRmxhZ0hvbGRlciA9IHsgZmFsc2UgfTsKLQotCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZwotCQkvLyBhY3Rpdml0eSB0aGF0IG1vZGlmaWVzIHRoZSB3b3JrYmVuY2guCi0JCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQltb25pdG9yLmJlZ2luVGFzayhMaWJyYXJ5VUlSZXNvdXJjZXMudXBncmFkaW5nTGlicmFyeVRhc2tfbmFtZSwKLQkJCQkJCTEwKTsKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl0cnkgewotCQkJCQlNYXBwaW5nVXRpbC5taWdyYXRlKGxpYkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIG1vbml0b3IsCi0JCQkJCQkJY2FsbGVySW5mbyk7Ci0JCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCQljYW5jZWxGbGFnSG9sZGVyWzBdID0gdHJ1ZTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCQlpZiAobXNnID09IG51bGwpIHsKLQkJCQkJCW1zZyA9IExpYnJhcnlVSVJlc291cmNlcy51cGdyYWRlTGlicmFyeUVycm9yX21zZzsKLQkJCQkJfQotCQkJCQllcnJNc2cuYXBwZW5kKG1zZyk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQkvLyBSdW4gdGhlIG9wZXJhdGlvbiBhbmQgZGlzcGxheSB0aGUgcHJvZ3Jlc3MuCi0JCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgcG1EaWFsb2cgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKERpc3BsYXkKLQkJCQkJLmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpKSB7Ci0JCQkJcHJvdGVjdGVkIFBvaW50IGdldEluaXRpYWxTaXplKCkgewotCQkJCQlQb2ludCBjYWxjdWxhdGVkU2l6ZSA9IHN1cGVyLmdldEluaXRpYWxTaXplKCk7Ci0JCQkJCWlmIChjYWxjdWxhdGVkU2l6ZS54IDwgNjc1KSB7Ci0JCQkJCQljYWxjdWxhdGVkU2l6ZS54ID0gNjc1OwotCQkJCQl9Ci0JCQkJCXJldHVybiBjYWxjdWxhdGVkU2l6ZTsKLQkJCQl9Ci0JCQl9OwotCQkJcG1EaWFsb2cucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOwotCQkJaWYgKGNhbmNlbEZsYWdIb2xkZXJbMF0pIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgaWYgKGVyck1zZy5sZW5ndGgoKSA+IDApIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQlwdWJsaWMgSVN0YXR1c1tdIGdldENoaWxkcmVuKCkgewotCQkJCQkJSVN0YXR1c1tdIHJldCA9IG5ldyBTdGF0dXNbMV07Ci0JCQkJCQlJU3RhdHVzIGNzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQlMaWJyYXJ5VUlQbHVnaW4uUExVR0lOX0lELCAwLAotCQkJCQkJCQllcnJNc2cudG9TdHJpbmcoKSwgbnVsbCk7Ci0JCQkJCQlyZXRbMF0gPSBjczsKLQkJCQkJCXJldHVybiByZXQ7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiBpc011bHRpU3RhdHVzKCkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9OwotCi0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMudXBncmFkZUxpYnJhcnlEaWFsb2dfdGl0bGUsCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMudXBncmFkZUxpYnJhcnlFcnJvcl9tc2csIHN0YXR1cyk7Ci0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUxpYnJhcnlVSVJlc291cmNlcy51cGdyYWRlTGlicmFyeURpYWxvZ190aXRsZSwKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHBhdGggb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2lsbCBiZSBvcGVuZWQgb25seSBpZiB0aGVyZSBhcmUKLQkgKiBubyBzYXZlZCBsaWJyYXJ5IHByZWZlcmVuY2VzLgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5UGF0aAotCSAqICAgICAgICAgICAgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENvbW1hbmRMaW5lRGVmYXVsdExpYnJhcnkoU3RyaW5nIGxpYnJhcnlQYXRoKSB7Ci0JCWlmIChsaWJyYXJ5UGF0aCAhPSBudWxsICYmIGxpYnJhcnlQYXRoLmxlbmd0aCgpID4gMCkgewotCQkJSVBhdGggcGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKGxpYnJhcnlQYXRoKTsKLQkJCXRyeSB7Ci0JCQkJZGVmYXVsdExpYnJhcnlVUkkgPSBwYXRoLnRvRmlsZSgpLnRvVVJJKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWRlZmF1bHRMaWJyYXJ5VVJJID0gbnVsbDsKLQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBhdGggb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2lsbCBiZSBvcGVuZWQgcmVnYXJkbGVzcyBvZiB0aGUKLQkgKiBzYXZlZCBsaWJyYXJ5IHByZWZlcmVuY2VzLgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5UGF0aAotCSAqICAgICAgICAgICAgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENvbW1hbmRMaW5lTGlicmFyeShTdHJpbmcgbGlicmFyeVBhdGgpIHsKLQkJaWYgKGxpYnJhcnlQYXRoICE9IG51bGwgJiYgbGlicmFyeVBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQlJUGF0aCBwYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcobGlicmFyeVBhdGgpOwotCQkJdHJ5IHsKLQkJCQlsaWJyYXJ5VVJJID0gcGF0aC50b0ZpbGUoKS50b1VSSSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlsaWJyYXJ5VVJJID0gbnVsbDsKLQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29tYm9ib3ggc2hvdWxkIGJlIGFkZGVkIHRvIHRoZQotCSAqIHN5c3RlbSB0b29sYmFyLgotCSAqIDxwPgotCSAqIFRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBjb21ib2JveCBsaXN0cyBhbGwgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9ucyBpbgotCSAqIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja0NvbmZpZ3VyYXRpb25Db250cmlidXRpb24oKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKTsKLQkJaWYgKHdvcmtiZW5jaCAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IChJV29ya2JlbmNoV2luZG93KSB3b3JrYmVuY2gKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJaWYgKHdpbmRvdyAhPSBudWxsICYmIHdpbmRvdyBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uV2luZG93KSB7Ci0JCQkJSUNvb2xCYXJNYW5hZ2VyIGNvb2xCYXJNZ3IgPSAoKEFwcGxpY2F0aW9uV2luZG93KSB3aW5kb3cpCi0JCQkJCQkuZ2V0Q29vbEJhck1hbmFnZXIoKTsKLQkJCQl0cnkgewotCQkJCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJaWYgKGZvdW5kQ29uZmlnVmlldyhhY3RpdmVQYWdlKQotCQkJCQkJCXx8IGZvdW5kUHJvY2Vzc0VkaXRvcihhY3RpdmVQYWdlKSkgewotCQkJCQkJc2hvd0NvbmZpZ3VyYXRpb25Db250cmlidXRpb24oY29vbEJhck1ncik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQloaWRlQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbihjb29sQmFyTWdyKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBmb3IgdGhlIHByZXNlbmNlIG9mIHRoZSBDb25maWd1cmF0aW9uIHZpZXcgaW4gdGhlIGFjdGl2ZSB3b3JrYmVuY2gKLQkgKiBwYWdlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmb3VuZENvbmZpZ1ZpZXcoSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSkgewotCQlpZiAoYWN0aXZlUGFnZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBhY3RpdmVQYWdlLmZpbmRWaWV3KENPTkZJR19WSUVXX0lEKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBmb3IgdGhlIHByZXNlbmNlIG9mIGEgUHJvY2VzcyBlZGl0b3IgaW4gdGhlIGFjdGl2ZSB3b3JrYmVuY2guCi0JICogcGFnZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZm91bmRQcm9jZXNzRWRpdG9yKElXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UpIHsKLQkJaWYgKGFjdGl2ZVBhZ2UgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmcyA9IGFjdGl2ZVBhZ2UuZmluZEVkaXRvcnMobnVsbCwKLQkJCQlQUk9DRVNTX0VESVRPUl9JRCwgSVdvcmtiZW5jaFBhZ2UuTUFUQ0hfSUQpOwotCQlyZXR1cm4gZWRpdG9yUmVmcyAhPSBudWxsICYmIGVkaXRvclJlZnMubGVuZ3RoID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29tYm9ib3ggaW4gdGhlIHN5c3RlbSB0b29sYmFyLgotCSAqLwotCXByaXZhdGUgdm9pZCBzaG93Q29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbihJQ29vbEJhck1hbmFnZXIgY29vbEJhck1ncikKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkvLyBDaGVjayBmb3IgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGNvbWJvYm94IHRvb2xiYXIuCi0JCUlDb250cmlidXRpb25JdGVtIGNvbmZpZ1Rvb2xCYXIgPSBjb29sQmFyTWdyCi0JCQkJLmZpbmQoVE9PTEJBUl9DT05GSUdfQ09OVFJJQlVUSU9OX0lEKTsKLQotCQlpZiAoY29uZmlnVG9vbEJhciAhPSBudWxsKSB7Ci0JCQkvLyBNYWtlIHN1cmUgdGhlIHRvb2xiYXIgaGFzIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBjb21ib2JveAotCQkJLy8gY29udHJpYnV0aW9uLgotCQkJaWYgKGNvbmZpZ1Rvb2xCYXIgaW5zdGFuY2VvZiBUb29sQmFyQ29udHJpYnV0aW9uSXRlbSkgewotCQkJCUlUb29sQmFyTWFuYWdlciB0b29sQmFyTWdyID0gKChUb29sQmFyQ29udHJpYnV0aW9uSXRlbSkgY29uZmlnVG9vbEJhcikKLQkJCQkJCS5nZXRUb29sQmFyTWFuYWdlcigpOwotCQkJCWlmICh0b29sQmFyTWdyICE9IG51bGwpIHsKLQkJCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSB0b29sQmFySXRlbXMgPSB0b29sQmFyTWdyLmdldEl0ZW1zKCk7Ci0JCQkJCWlmICh0b29sQmFySXRlbXMgIT0gbnVsbCAmJiB0b29sQmFySXRlbXMubGVuZ3RoID4gMCkgewotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b29sQmFySXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQl0b29sQmFySXRlbXNbaV0uc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJCWNvbmZpZ1Rvb2xCYXIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJCXVwZGF0ZVN5c3RlbVRvb2xCYXIoY29vbEJhck1ncik7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBUaGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29tYm9ib3ggdG9vbGJhciBoYXMgYmVlbiByZXN0b3JlZAotCQkJCS8vIHZpYSBhIHNhdmVkIHBlcnNwZWN0aXZlLCBhZGQgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JCQkJLy8gY29tYm9ib3ggY29udHJpYnV0aW9uLgotCQkJCUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtIGNvbmZpZ0NvbWJvID0gbmV3IENvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtKAotCQkJCQkJbnVsbCk7Ci0JCQkJdG9vbEJhck1nci5hZGQoY29uZmlnQ29tYm8pOwotCQkJCWNvbmZpZ1Rvb2xCYXIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQl1cGRhdGVTeXN0ZW1Ub29sQmFyKGNvb2xCYXJNZ3IpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCUlUb29sQmFyTWFuYWdlciB0b29sQmFyTWdyID0gbmV3IFRvb2xCYXJNYW5hZ2VyKFNXVC5GTEFUIHwgU1dULkxFRlQpOwotCQlDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSXRlbSBjb25maWdDb21ibyA9IG5ldyBDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSXRlbSgKLQkJCQludWxsKTsKLQkJdG9vbEJhck1nci5hZGQoY29uZmlnQ29tYm8pOwotCQlUb29sQmFyQ29udHJpYnV0aW9uSXRlbSBjb25maWdDb21ib1Rvb2xCYXIgPSBuZXcgVG9vbEJhckNvbnRyaWJ1dGlvbkl0ZW0oCi0JCQkJdG9vbEJhck1nciwgVE9PTEJBUl9DT05GSUdfQ09OVFJJQlVUSU9OX0lEKTsKLQkJY29vbEJhck1nci5hZGQoY29uZmlnQ29tYm9Ub29sQmFyKTsKLQl9Ci0KLQkvKioKLQkgKiBIaWRlcyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29tYm9ib3ggZnJvbSB0aGUgc3lzdGVtIHRvb2xiYXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhpZGVDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uKElDb29sQmFyTWFuYWdlciBjb29sQmFyTWdyKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIENoZWNrIGZvciB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29tYm9ib3ggdG9vbGJhci4KLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY29uZmlnVG9vbEJhciA9IGNvb2xCYXJNZ3IKLQkJCQkuZmluZChUT09MQkFSX0NPTkZJR19DT05UUklCVVRJT05fSUQpOwotCi0JCWlmIChjb25maWdUb29sQmFyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEhpZGUgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGNvbWJvYm94IGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSB0b29sYmFyLgotCQlpZiAoY29uZmlnVG9vbEJhciBpbnN0YW5jZW9mIFRvb2xCYXJDb250cmlidXRpb25JdGVtKSB7Ci0JCQlJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1nciA9ICgoVG9vbEJhckNvbnRyaWJ1dGlvbkl0ZW0pIGNvbmZpZ1Rvb2xCYXIpCi0JCQkJCS5nZXRUb29sQmFyTWFuYWdlcigpOwotCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSB0b29sQmFySXRlbXMgPSB0b29sQmFyTWdyLmdldEl0ZW1zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRvb2xCYXJJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCXRvb2xCYXJJdGVtc1tpXS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCS8vIEhpZGUgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGNvbWJvYm94IHRvb2xiYXIgY29udHJpYnV0aW9uLgotCQljb25maWdUb29sQmFyLnNldFZpc2libGUoZmFsc2UpOwotCi0JCS8vIFVwZGF0ZSB0aGUgdGhlIHN5c3RlbSB0b29sIGJhci4KLQkJdXBkYXRlU3lzdGVtVG9vbEJhcihjb29sQmFyTWdyKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBzeXN0ZW0gdG9vbCBiYXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVN5c3RlbVRvb2xCYXIoSUNvb2xCYXJNYW5hZ2VyIGNvb2xCYXJNZ3IpIHsKLQkJaWYgKGNvb2xCYXJNZ3IgaW5zdGFuY2VvZiBDb29sQmFyTWFuYWdlcikgewotCQkJKChDb29sQmFyTWFuYWdlcikgY29vbEJhck1ncikudXBkYXRlKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHBhcnQgbGlzdGVuZXIgc28gdGhlIGxpYnJhcnkgd2lsbCBvcGVuIHVwb24gInN0YXJ0dXAiCi0JICogInN0YXJ0dXAiIG1lYW5zIHdoZW4gdGhlIHZpZXcgd2l0aCB0aGUgc3BlY2lmaWVkIGlkIGlzIGZpcnN0Ci0JICogdmlzaWJsZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1ldGhvZFZpZXdQYXJ0TGlzdGVuZXIoZmluYWwgU3RyaW5nIGlkKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKTsKLQkJaWYgKHdvcmtiZW5jaCAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IChJV29ya2JlbmNoV2luZG93KSB3b3JrYmVuY2gKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJaWYgKHdpbmRvdyAhPSBudWxsICYmIHdpbmRvdyBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uV2luZG93KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZmluYWwgSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCWFjdGl2ZVBhZ2UuYWRkUGFydExpc3RlbmVyKG5ldyBJUGFydExpc3RlbmVyMigpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZCgKLQkJCQkJCQkJSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKAotCQkJCQkJCQlJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoCi0JCQkJCQkJCUlXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIHZvaWQgcGFydEhpZGRlbihJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHBhcnRJbnB1dENoYW5nZWQoCi0JCQkJCQkJCUlXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHBhcnRWaXNpYmxlKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCQkJCQlpZiAocGFydFJlZi5nZXRJZCgpLmVxdWFscyhpZCkpIHsKLQkJCQkJCQkJYWN0aXZlUGFnZS5yZW1vdmVQYXJ0TGlzdGVuZXIodGhpcyk7Ci0JCQkJCQkJCXN0YXJ0dXBPcGVuTGlicmFyeSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQkKLQkKLQkvKioKLQkgKiBPcGVucyB0aGUgbGlicmFyeSB1cG9uIHN0YXJ0dXAKLQkgKiAxLiAgRmlyc3QgdHJpZXMgdG8gb3BlbiB0aGUgbGlicmFyeSBzcGVjaWZpZWQgYnkgLWxpYnJhcnkKLQkgKiAyLiAgVGhlbiB0cmllcyB0byBvcGVuIHRoZSBsYXN0IG9wZW5lZCBsaWJyYXJ5Ci0JICogMy4gIEZpbmFsbHksIHRyaWVzIHRvIG9wZW4gdGhlIGxpYnJhcnkgc3BlY2lmaWVkIGJ5IC1kZWZhdWx0bGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0dXBPcGVuTGlicmFyeSgpIHsKLQkJaWYgKGxpYnJhcnlJbml0aWFsaXplZCA9PSB0cnVlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbGlicmFyeUluaXRpYWxpemVkID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzYXZlZE1ldGhvZExpYnJhcnlVUkkgPSBMaWJyYXJ5UHJlZmVyZW5jZXMKLQkJCS5nZXRTYXZlZE1ldGhvZExpYnJhcnlVUkkoKTsKLQkJCWJvb2xlYW4gaGFzU2F2ZWRVcmkgPSBzYXZlZE1ldGhvZExpYnJhcnlVUkkgIT0gbnVsbCAmJiBzYXZlZE1ldGhvZExpYnJhcnlVUkkubGVuZ3RoKCkgPiAwOwotCQkJCi0JCQlTdHJpbmcgbGFzdFNhdmVkQ29uZmlnTmFtZSA9IFByZWZlcmVuY2VVdGlsLmdldFNhdmVkTGFzdENvbmZpZygpOwotCQkJaWYgKGxpYnJhcnlVUkkgIT0gbnVsbCAmJiBvcGVuTGlicmFyeShsaWJyYXJ5VVJJKSkgewotCQkJfSBlbHNlIGlmIChvcGVuTGFzdE9wZW5lZExpYnJhcnkoKSkgewotCQkJfSBlbHNlIGlmIChkZWZhdWx0TGlicmFyeVVSSSAhPSBudWxsICYmICFoYXNTYXZlZFVyaSkgewotCQkJCS8vIFRyeSBsb2FkaW5nIHRoZSBOTCBsaWJyYXJ5IGZpcnN0LgotCQkJCUxvY2FsZSBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotCQkJCVN0cmluZyBkZWZhdWx0TGlicmFyeVN0ciA9IG5ldyBGaWxlKGRlZmF1bHRMaWJyYXJ5VVJJKQotCQkJCQkJLmdldEFic29sdXRlUGF0aCgpOwotCQkJCVN0cmluZyBsb2NhbGl6ZWRMaWJQYXRoID0gSTE4blV0aWwuZ2V0TG9jYWxpemVkRmlsZSgKLQkJCQkJCUZpbGVVdGlsLnJlbW92ZUFsbFNlcGFyYXRvcihkZWZhdWx0TGlicmFyeVN0ciksCi0JCQkJCQlsb2NhbGUpOwotCQkJCWlmIChsb2NhbGl6ZWRMaWJQYXRoICE9IG51bGwpIHsKLQkJCQkJZGVmYXVsdExpYnJhcnlVUklfTkwgPSBTdHJVdGlsLnRvVVJJKGxvY2FsaXplZExpYlBhdGgpOwotCQkJCX0KLQkJCQlpZiAoZGVmYXVsdExpYnJhcnlVUklfTkwgIT0gbnVsbCAmJiBvcGVuRGVmYXVsdExpYnJhcnkoZGVmYXVsdExpYnJhcnlVUklfTkwpKSB7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb3BlbkRlZmF1bHRMaWJyYXJ5KGRlZmF1bHRMaWJyYXJ5VVJJKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpICE9IG51bGwpIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIHNhdmVkQ29uZmlnID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwgbGFzdFNhdmVkQ29uZmlnTmFtZSk7Ci0JCQkJaWYgKHNhdmVkQ29uZmlnICE9IG51bGwpIHsKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbihzYXZlZENvbmZpZyk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEByZXR1cm4gbnVsbCBpZiBwYXRoIGlzIG5vdCBvbiBpbnN0YWxsIHBhdGggb3Igbm90IHJlYWQtb25seSBvciBpZiB1c2VyIAotCSAqIGRlY2xpbmVzIHRvIGNvcHkgdGhlIGxpYnJhcnkgdG8gYSB3cml0YWJsZSBsb2NhdGlvbi4gUmV0dXJucwotCSAqIGEgbmV3IHBhdGggaWYgdGhlIHVzZXIgd2lzaGVzIHRvIG9wZW4gdGhlIGxpYnJhcnkgaW4gYSBkaWZmZXJlbnQgbG9jYXRpb24KLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBoYW5kbGVMaWJyYXJ5T25SZWFkT25seUluc3RhbGxQYXRoKFVSSSBsaWJVUkkpIHsKLQkJdHJ5IHsKLQkJCS8vIGRldGVybWluZSBpZiBwYXRoIGlzIGluIEluc3RhbGxhdGlvbiBkaXJlY3RvcnkKLQkJCUZpbGUgbGliUGF0aEZpbGUgPSBuZXcgRmlsZShsaWJVUkkpOwotCQkJaWYgKCFsaWJQYXRoRmlsZS5leGlzdHMoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJTG9jYXRpb24gaW5zdGFsbExvY2F0aW9uID0gUGxhdGZvcm0uZ2V0SW5zdGFsbExvY2F0aW9uKCk7Ci0JCQlVUkwgaW5zdGFsbExvY2F0aW9uVVJMID0gaW5zdGFsbExvY2F0aW9uLmdldFVSTCgpOwotCQkJVVJJIGluc3RhbGxMb2NhdGlvblVSSSA9IG5ldyBVUkkoTmV0VXRpbC5lbmNvZGVGaWxlVVJMKGluc3RhbGxMb2NhdGlvblVSTC50b0V4dGVybmFsRm9ybSgpKSk7Ci0JCQlGaWxlIGluc3RhbGxMb2NGaWxlID0gbmV3IEZpbGUoaW5zdGFsbExvY2F0aW9uVVJJKTsKLQkJCVN0cmluZyBjYW5vbmljYWxMaWJQYXRoID0gbGliUGF0aEZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJU3RyaW5nIGNhbm9uaWNhbEluc3RhbGxQYXRoID0gaW5zdGFsbExvY0ZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJaWYgKCFjYW5vbmljYWxMaWJQYXRoLnN0YXJ0c1dpdGgoY2Fub25pY2FsSW5zdGFsbFBhdGgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCS8vIGRldGVybWluZSBpZiBPUyBpcyBub3QgdmlzdGEgb3IgbGludXgKLQkJCVN0cmluZyBvc05hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHBsYXRmb3JtT1MgPSBQbGF0Zm9ybS5nZXRPUygpOwotCQkJaWYgKChvc05hbWUuaW5kZXhPZigiVmlzdGEiKSA9PSAtMSkgLy8kTk9OLU5MUy0xJAotCQkJCQkmJiAhcGxhdGZvcm1PUy5lcXVhbHMoUGxhdGZvcm0uT1NfTElOVVgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCS8vIHNob3cgZGlhbG9nLCBhbGxvdyBjb3B5IHRvIG5ldyBwYXRoCi0KLQkJCWZpbmFsIFN0cmluZyBkZWZhdWx0Q29weVBhdGggPSBuZXcgRmlsZShuZXcgRmlsZShMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXREZWZhdWx0TGlicmFyeVBhdGgoKSkuZ2V0UGFyZW50KCksIGxpYlBhdGhGaWxlLmdldE5hbWUoKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLQkJCWZpbmFsIFN0cmluZ0J1ZmZlciBuZXdQYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCi0JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5ydW5TYWZlbHkobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeVVJUmVzb3VyY2VzLmNvcHlMaWJyYXJ5RGlhbG9nX3RpdGxlOwotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IExpYnJhcnlVSVJlc291cmNlcy5jb3B5TGlicmFyeURpYWxvZ190ZXh0X3JlYWRPbmx5TGliOwotCQkJCQlDb3B5TGlicmFyeURpYWxvZyBkbGcgPSBuZXcgQ29weUxpYnJhcnlEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgdGl0bGUsCi0JCQkJCQkJbWVzc2FnZSwgZGVmYXVsdENvcHlQYXRoKTsKLQotCQkJCQlpZiAoZGxnLm9wZW4oKSA9PSBEaWFsb2cuT0spIHsKLQkJCQkJCW5ld1BhdGguYXBwZW5kKGRsZy5nZXRQYXRoKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSwgZmFsc2UpOwotCQkJaWYgKG5ld1BhdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJY29weUxpYnJhcnkobGliUGF0aEZpbGUsIG5ldyBGaWxlKG5ld1BhdGgudG9TdHJpbmcoKSkpOwotCQkJCXJldHVybiBuZXdQYXRoLnRvU3RyaW5nKCk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiB1cmlFeCkgewotCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcih1cmlFeCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9FeCkgewotCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihpb0V4KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEJhY2sgdXAgbGlicmFyeSAKLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHBhcmFtIGRlc3QKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvcHlMaWJyYXJ5KGZpbmFsIEZpbGUgc291cmNlLCBmaW5hbCBGaWxlIGRlc3QpIHsKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gZXhjdWRlIHRoZSBub24tbGlicmFyeSBmaWxlcyB0aGF0IG1pZ2h0IGJlIGxvY2tlZCBieSBybWMuCi0JCQkJCS8vIHRoZXNlIGZpbGVzIG1heSBjYXVzZSBiYWNrdXAgdG8gZmFpbCBkdWUgdG8gZmlsZSBsb2NrLgotCQkJCQlTdHJpbmcgZXhjbHVkZXMgPSAiLmxvY2siOyAvLyROT04tTkxTLTEkCi0JCQkJCUxheW91dFJlc291cmNlcy5jb3B5RGlyKHNvdXJjZSwgZGVzdCwgIioqIiwgZXhjbHVkZXMpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsCi0JCQkJTGlicmFyeVVJUmVzb3VyY2VzLmNvcHlMaWJyYXJ5VGFza19uYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWNmZGI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuQnJvd3NpbmdMYXlvdXRTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmZXJlbmNlcy5MaWJyYXJ5UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIExpYnJhcnkgVUkgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IExpYnJhcnlVSVBsdWdpbi5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgTGlicmFyeVVJUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExpYnJhcnlVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogdXBkYXRlIHRoZSBwdWJsaXNoaW5nL2Jyb3dzaW5nIGxheW91dCBzZXR0aW5ncy4KLQkgKiBDYWxsIHRoaXMgbWV0aG9kIHdoZW4gZXZlciBwdWJsaXNoaW5nL2Jyb3dzaW5nIHJlbGF0ZWQgcHJlZmVyZW5jZXMgYXJlIGNoYW5nZWQuCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVMYXlvdXRTZXR0aW5ncygpIAotCXsKLQkJLy8gZ2V0IHRoZSBza2luIHNldHRpbmcgZnJvbSBwcmVmZXJlbmNlCi0JCWJvb2xlYW4gcHVibGlzaFVub3BlbkFjdGl2aXR5ZGQgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCgpOwkKLQkJYm9vbGVhbiBwdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbiA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKCk7Ci0JCWJvb2xlYW4gdXNlTmV3RXh0ZW5kcyA9IExpYnJhcnlQcmVmZXJlbmNlcy5nZXRVc2VOZXdFeHRlbmRzU2VtYW50aWNzKCk7Ci0JCQotCQlCcm93c2luZ0xheW91dFNldHRpbmdzLklOU1RBTkNFLnNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKHB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKTsKLQkJQnJvd3NpbmdMYXlvdXRTZXR0aW5ncy5JTlNUQU5DRS5zZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZChwdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCk7Ci0JCUJyb3dzaW5nTGF5b3V0U2V0dGluZ3MuSU5TVEFOQ0Uuc2V0VXNlTmV3RXh0ZW5kU2VtYW50aWNzKHVzZU5ld0V4dGVuZHMpOwotCQkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDMyMmE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIExpYnJhcnkgVUkgcmVzb3VyY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzc1MDAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlVSVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aXZpdHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXBhYmlsaXR5UGF0dGVybl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tsaXN0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0l0ZW1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBvc2l0ZVJvbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNlcHRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRlbnRQYWNrYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21DYXRlZ29yeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJ5UHJvY2Vzc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZUdyb3VwaW5nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW5nTWV0cmljX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4YW1wbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1aWRhbmNlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkZWxpbmVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGl0ZXJhdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kQ29udGVudF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kTGlicmFyeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kUGFja2FnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kUGx1Z2luX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtaWxlc3RvbmVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dGNvbWVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG92ZXJyaWRlQ3VycmVudExpYnJhcnlFcnJvcl9tc2cwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGhhc2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzQ29udHJpYnV0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzRmFtaWx5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzUGFja2FnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb3J0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXVzYWJsZUFzc2V0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2FkbWFwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGVzY3JpcHRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldEdyb3VwaW5nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGFuZGFyZENhdGVnb3J5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGVwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tEZXNjcmlwdG9yX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZWFtUHJvZmlsZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVtcGxhdGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlcm1EZWZpbml0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sTWVudG9yX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aGl0ZXBhcGVyX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdEVsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0VHlwZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aXZpdHlfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhcGFiaWxpdHlQYXR0ZXJuX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tsaXN0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tJdGVtX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcG9zaXRlUm9sZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNlcHRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250ZW50UGFja2FnZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbUNhdGVnb3J5X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpdmVyeVByb2Nlc3NfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXNjcmlwdG9yX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVHcm91cGluZ190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXN0aW1hdGluZ01ldHJpY190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4YW1wbGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkYW5jZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1aWRlbGluZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGl0ZXJhdGlvbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZENvbmZpZ3VyYXRpb25fdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RDb250ZW50X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kTGlicmFyeV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZFBhY2thZ2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RQbHVnaW5fdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtaWxlc3RvbmVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdXRjb21lX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGhhc2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzQ29udHJpYnV0aW9uX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0ZhbWlseV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NQYWNrYWdlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb3J0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV1c2FibGVBc3NldF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvYWRtYXBfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGVzY3JpcHRvcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldEdyb3VwaW5nX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhbmRhcmRDYXRlZ29yeV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0ZXBfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0Rlc2NyaXB0b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZWFtUHJvZmlsZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlbXBsYXRlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVybURlZmluaXRpb25fdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbE1lbnRvcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdoaXRlcGFwZXJfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0RWxlbWVudF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0VHlwZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGxpY2F0aW9uX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlXaXphcmRfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuTGlicmFyeU1haW5XaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlNYWluV2l6YXJkUGFnZV90aXRsZV8yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlNYWluV2l6YXJkUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGF0aExhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuYW1lTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVyaUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuVW5saXN0ZWRMaWJyYXJ5Q2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlUeXBlTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9tcHRGb3JMaWJyYXJ5Q2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdExpYnJhcnlGb2xkZXJEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuaW5nTGlicmFyeVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlJbnRlcm5sRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlFcnJvcl9yZWFzb24xOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlFcnJvcl9yZWFzb24yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlFcnJvcl9yZWFzb24zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlFcnJvcl9yZWFzb240OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlFcnJvcl9hZHZpY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkTGlicmFyeVBhdGhfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZExpYnJhcnlQYXRoX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRPbmx5UHJvamVjdEZpbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldHJ5QnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5jZWxCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBncmFkZUxpYnJhcnlEaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cGdyYWRlTGlicmFyeUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN3aXRjaENvbmZpZ0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN3aXRjaENvbmZpZ0RpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VycmVudENvbmZpZ0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb25maWdMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlRmlsZXNDb25maXJtYXRpb25fbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlRmlsZXNFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVQYXRoRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFBhdGhfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFja3VwTGlicmFyeURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhY2t1cExpYnJhcnlEaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhY2tpbmdVcExpYnJhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXRoU2VsZWN0aW9uRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb2tCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNraXBCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFsd2F5c0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV2ZXJCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb21wdEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlua1RvVVJMX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaW5rVG9GaWxlX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50TGlua19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudExpbmtXaXRoVHlwZV9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudExpbmtXaXRoVXNlclRleHRfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRBY3Rpdml0eURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRBY3Rpdml0eURpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dF91bmtub3duOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc2VzTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyaWVmRGVzY3JpcHRpb25MYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uX2RlbGV0ZWNvbmZpcm1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpcm1EZWxldGVEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maXJtRGVsZXRlRGlhbG9nX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpcm1EZWxldGVEaWFsb2dfbXNnV2l0aFJlZmVyZW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZUxpYnJhcnlEaWFsb2dfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlTGlicmFyeUVycm9yX21zZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcl9yZWFzb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weUxpYnJhcnlEaWFsb2dfdGl0bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weUxpYnJhcnlEaWFsb2dfdGV4dF9yZWFkT25seUxpYjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5TGlicmFyeVRhc2tfbmFtZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5TGlicmFyeURpYWxvZ19jb3B5QnV0dG9uX3RleHQ7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBMaWJyYXJ5VUlSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2Uga2V5IGFuZCBmb3JtYXR0ZWQKLQkgKiB3aXRoIGEgZ2l2ZW4gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIEEgcmVzb3VyY2Uga2V5LgotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBBbiBvYmplY3QuCi0JICogQHJldHVybiBBIGZvcm1hdHRlZCBsb2NhbGl6ZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGtleSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKGtleSwgbmV3IE9iamVjdFtdIHsgZGF0YSB9KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJVGV4dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY1ZDg1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXJ0aWZhY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNoZWNrbGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db25jZXB0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRvbWFpbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkV4YW1wbGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkZWxpbmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JdGVyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NaWxlc3RvbmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5PdXRjb21lSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGhhc2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NGYW1pbHlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlcG9ydEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJldXNhYmxlQXNzZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2FkbWFwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0ZXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlbXBsYXRlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVybURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Ub29sSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbE1lbnRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldoaXRlcGFwZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGw7Ci0KLS8qKgotICogUHJvdmlkZXMgYWNjZXNzIHRvIGNhY2hlZCBjb3B5IG9mIGNvbW1vbmx5IHJlZmVyZW5jZWQgdGV4dCBpbiB0aGUgbGlicmFyeSBVSS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VUlUZXh0IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQUNUSVZJVFkgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuYWN0aXZpdHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQVJUSUZBQ1QgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuYXJ0aWZhY3RfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ0FQQUJJTElUWV9QQVRURVJOID0gTGlicmFyeVVJUmVzb3VyY2VzLmNhcGFiaWxpdHlQYXR0ZXJuX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NIRUNLTElTVCA9IExpYnJhcnlVSVJlc291cmNlcy5jaGVja2xpc3RfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ0hFQ0tfSVRFTSA9IExpYnJhcnlVSVJlc291cmNlcy5jaGVja0l0ZW1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ09NUE9TSVRFX1JPTEUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY29tcG9zaXRlUm9sZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DT05DRVBUID0gTGlicmFyeVVJUmVzb3VyY2VzLmNvbmNlcHRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ09OVEVOVF9QQUNLQUdFID0gTGlicmFyeVVJUmVzb3VyY2VzLmNvbnRlbnRQYWNrYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NVU1RPTV9DQVRFR09SWSA9IExpYnJhcnlVSVJlc291cmNlcy5jdXN0b21DYXRlZ29yeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ERUxJVkVSQUJMRSA9IExpYnJhcnlVSVJlc291cmNlcy5kZWxpdmVyYWJsZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ERUxJVkVSWV9QUk9DRVNTID0gTGlicmFyeVVJUmVzb3VyY2VzLmRlbGl2ZXJ5UHJvY2Vzc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ERVNDUklQVE9SID0gTGlicmFyeVVJUmVzb3VyY2VzLmRlc2NyaXB0b3JfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRElTQ0lQTElORSA9IExpYnJhcnlVSVJlc291cmNlcy5kaXNjaXBsaW5lX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0RJU0NJUExJTkVfR1JPVVBJTkcgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZGlzY2lwbGluZUdyb3VwaW5nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0RPTUFJTiA9IExpYnJhcnlVSVJlc291cmNlcy5kb21haW5fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRVNUSU1BVEUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZXhhbXBsZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FU1RJTUFUSU5HX01FVFJJQyA9IExpYnJhcnlVSVJlc291cmNlcy5lc3RpbWF0aW5nTWV0cmljX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0VYQU1QTEUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZXhhbXBsZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9HVUlEQU5DRSA9IExpYnJhcnlVSVJlc291cmNlcy5ndWlkYW5jZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9HVUlERUxJTkUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZ3VpZGVsaW5lX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0lURVJBVElPTiA9IExpYnJhcnlVSVJlc291cmNlcy5pdGVyYXRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX0NPTkZJR1VSQVRPTiA9IExpYnJhcnlVSVJlc291cmNlcy5tZXRob2RDb25maWd1cmF0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FVEhPRF9DT05URU5UID0gTGlicmFyeVVJUmVzb3VyY2VzLm1ldGhvZENvbnRlbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX0xJQkFSQVJZID0gTGlicmFyeVVJUmVzb3VyY2VzLm1ldGhvZExpYnJhcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX1BBQ0tBR0UgPSBMaWJyYXJ5VUlSZXNvdXJjZXMubWV0aG9kUGFja2FnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9NRVRIT0RfUExVR0lOID0gTGlicmFyeVVJUmVzb3VyY2VzLm1ldGhvZFBsdWdpbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9NSUxFU1RPTkUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMubWlsZXN0b25lX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX09VVENPTUUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMub3V0Y29tZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QSEFTRSA9IExpYnJhcnlVSVJlc291cmNlcy5waGFzZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QUkFDVElDRSA9IExpYnJhcnlVSVJlc291cmNlcy5wcmFjdGljZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QUk9DRVNTID0gTGlicmFyeVVJUmVzb3VyY2VzLnByb2Nlc3NfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJPQ0VTU19DT05UUklCVVRJT04gPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QUk9DRVNTX0ZBTUlMWSA9IExpYnJhcnlVSVJlc291cmNlcy5wcm9jZXNzRmFtaWx5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1BST0NFU1NfUEFDS0FHRSA9IExpYnJhcnlVSVJlc291cmNlcy5wcm9jZXNzUGFja2FnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9SRVBPUlQgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucmVwb3J0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JFVVNBQkxFX0FTU0VUID0gTGlicmFyeVVJUmVzb3VyY2VzLnJldXNhYmxlQXNzZXRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9BRE1BUCA9IExpYnJhcnlVSVJlc291cmNlcy5yb2FkbWFwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JPTEUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9sZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ST0xFX0RFU0NSSVBUT1IgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9sZURlc2NyaXB0b3JfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9TRVQgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9sZVNldF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ST0xFX1NFVF9HUk9VUElORyA9IExpYnJhcnlVSVJlc291cmNlcy5yb2xlU2V0R3JvdXBpbmdfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfU1RBTkRBUkRfQ0FURUdPUlkgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuc3RhbmRhcmRDYXRlZ29yeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9TVEVQID0gTGlicmFyeVVJUmVzb3VyY2VzLnN0ZXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfU1VQUE9SVElOR19NQVRFUklBTCA9IExpYnJhcnlVSVJlc291cmNlcy5zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVEFTSyA9IExpYnJhcnlVSVJlc291cmNlcy50YXNrX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RBU0tfREVTQ1JJUFRPUiA9IExpYnJhcnlVSVJlc291cmNlcy50YXNrRGVzY3JpcHRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9URUFNX1BST0ZJTEUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudGVhbVByb2ZpbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVEVNUExBVEUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudGVtcGxhdGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVEVSTV9ERUZJTklUSU9OID0gTGlicmFyeVVJUmVzb3VyY2VzLnRlcm1EZWZpbml0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RPT0wgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudG9vbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9UT09MX01FTlRPUiA9IExpYnJhcnlVSVJlc291cmNlcy50b29sTWVudG9yX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dISVRFUEFQRVIgPSBMaWJyYXJ5VUlSZXNvdXJjZXMud2hpdGVwYXBlcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9XT1JLX1BST0RVQ1QgPSBMaWJyYXJ5VUlSZXNvdXJjZXMud29ya1Byb2R1Y3RfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfV09SS19QUk9EVUNUX0RFU0NSSVBUT1IgPSBMaWJyYXJ5VUlSZXNvdXJjZXMud29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dPUktfUFJPRFVDVF9FTEVNRU5UID0gTGlicmFyeVVJUmVzb3VyY2VzLndvcmtQcm9kdWN0RWxlbWVudF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9XT1JLX1BST0RVQ1RfVFlQRSA9IExpYnJhcnlVSVJlc291cmNlcy53b3JrUHJvZHVjdFR5cGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQUNUSVZJVFlfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmFjdGl2aXR5X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9BUlRJRkFDVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuYXJ0aWZhY3RfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NBUEFCSUxJVFlfUEFUVEVSTl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY2FwYWJpbGl0eVBhdHRlcm5fdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NIRUNLTElTVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY2hlY2tsaXN0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DSEVDS19JVEVNX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5jaGVja0l0ZW1fdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NPTVBPU0lURV9ST0xFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5jb21wb3NpdGVSb2xlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DT05DRVBUX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5jb25jZXB0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DT05URU5UX1BBQ0tBR0VfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmNvbnRlbnRQYWNrYWdlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DVVNUT01fQ0FURUdPUllfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmN1c3RvbUNhdGVnb3J5X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ERUxJVkVSQUJMRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZGVsaXZlcmFibGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0RFTElWRVJZX1BST0NFU1NfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmRlbGl2ZXJ5UHJvY2Vzc190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfREVTQ1JJUFRPUl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZGVzY3JpcHRvcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRElTQ0lQTElORV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZGlzY2lwbGluZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRElTQ0lQTElORV9HUk9VUElOR19QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZGlzY2lwbGluZUdyb3VwaW5nX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ET01BSU5fUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmRvbWFpbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRVNUSU1BVEVfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmV4YW1wbGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0VTVElNQVRJTkdfTUVUUklDX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5lc3RpbWF0aW5nTWV0cmljX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0VYQU1QTEVfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmV4YW1wbGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0dVSURBTkNFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5ndWlkYW5jZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfR1VJREVMSU5FX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5ndWlkZWxpbmVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0lURVJBVElPTl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuaXRlcmF0aW9uX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9NRVRIT0RfQ09ORklHVVJBVE9OX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5tZXRob2RDb25maWd1cmF0aW9uX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9NRVRIT0RfQ09OVEVOVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMubWV0aG9kQ29udGVudF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX0xJQkFSQVJZX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5tZXRob2RMaWJyYXJ5X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9NRVRIT0RfUEFDS0FHRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMubWV0aG9kUGFja2FnZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX1BMVUdJTl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMubWV0aG9kUGx1Z2luX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9NSUxFU1RPTkVfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLm1pbGVzdG9uZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfT1VUQ09NRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMub3V0Y29tZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUEhBU0VfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnBoYXNlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QUkFDVElDRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJhY3RpY2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1BST0NFU1NfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnByb2Nlc3NfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1BST0NFU1NfQ09OVFJJQlVUSU9OX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5wcm9jZXNzQ29udHJpYnV0aW9uX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QUk9DRVNTX0ZBTUlMWV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJvY2Vzc0ZhbWlseV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJPQ0VTU19QQUNLQUdFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5wcm9jZXNzUGFja2FnZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUkVQT1JUX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5yZXBvcnRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JFVVNBQkxFX0FTU0VUX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5yZXVzYWJsZUFzc2V0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ST0FETUFQX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5yb2FkbWFwX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ST0xFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5yb2xlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ST0xFX0RFU0NSSVBUT1JfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnJvbGVEZXNjcmlwdG9yX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ST0xFX1NFVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9sZVNldF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9TRVRfR1JPVVBJTkdfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnJvbGVTZXRHcm91cGluZ190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfU1RBTkRBUkRfQ0FURUdPUllfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnN0YW5kYXJkQ2F0ZWdvcnlfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NURVBfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnN0ZXBfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NVUFBPUlRJTkdfTUFURVJJQUxfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVEFTS19QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudGFza190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVEFTS19ERVNDUklQVE9SX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy50YXNrRGVzY3JpcHRvcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVEVBTV9QUk9GSUxFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy50ZWFtUHJvZmlsZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVEVNUExBVEVfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnRlbXBsYXRlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9URVJNX0RFRklOSVRJT05fUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnRlcm1EZWZpbml0aW9uX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9UT09MX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy50b29sX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9UT09MX01FTlRPUl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudG9vbE1lbnRvcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfV0hJVEVQQVBFUl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMud2hpdGVwYXBlcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfV09SS19QUk9EVUNUX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy53b3JrUHJvZHVjdF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLndvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfV09SS19QUk9EVUNUX0VMRU1FTlRfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLndvcmtQcm9kdWN0RWxlbWVudF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfV09SS19QUk9EVUNUX1RZUEVfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLndvcmtQcm9kdWN0VHlwZV90ZXh0X3BsdXJhbDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDbGFzcywgU3RyaW5nPiBFTEVNRU5UX1RFWFQgPSBuZXcgSGFzaE1hcDxDbGFzcywgU3RyaW5nPigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzLCBTdHJpbmc+IEVMRU1FTlRfVEVYVF9QTFVSQUwgPSBuZXcgSGFzaE1hcDxDbGFzcywgU3RyaW5nPigpOwotCi0Jc3RhdGljIHsKLQkJRUxFTUVOVF9URVhULnB1dChBY3Rpdml0eUltcGwuY2xhc3MsIFRFWFRfQUNUSVZJVFkpOwotCQlFTEVNRU5UX1RFWFQucHV0KEFydGlmYWN0SW1wbC5jbGFzcywgVEVYVF9BUlRJRkFDVCk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoQ2FwYWJpbGl0eVBhdHRlcm5JbXBsLmNsYXNzLCBURVhUX0NBUEFCSUxJVFlfUEFUVEVSTik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoQ2hlY2tsaXN0SW1wbC5jbGFzcywgVEVYVF9DSEVDS0xJU1QpOwotCQlFTEVNRU5UX1RFWFQucHV0KENvbXBvc2l0ZVJvbGVJbXBsLmNsYXNzLCBURVhUX0NPTVBPU0lURV9ST0xFKTsKLQkJRUxFTUVOVF9URVhULnB1dChDb25jZXB0SW1wbC5jbGFzcywgVEVYVF9DT05DRVBUKTsKLQkJRUxFTUVOVF9URVhULnB1dChDb250ZW50UGFja2FnZUltcGwuY2xhc3MsIFRFWFRfQ09OVEVOVF9QQUNLQUdFKTsKLQkJRUxFTUVOVF9URVhULnB1dChDdXN0b21DYXRlZ29yeUltcGwuY2xhc3MsIFRFWFRfQ1VTVE9NX0NBVEVHT1JZKTsKLQkJRUxFTUVOVF9URVhULnB1dChEZWxpdmVyYWJsZUltcGwuY2xhc3MsIFRFWFRfREVMSVZFUkFCTEUpOwotCQlFTEVNRU5UX1RFWFQucHV0KERlbGl2ZXJ5UHJvY2Vzc0ltcGwuY2xhc3MsIFRFWFRfREVMSVZFUllfUFJPQ0VTUyk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoRGlzY2lwbGluZUltcGwuY2xhc3MsIFRFWFRfRElTQ0lQTElORSk7Ci0JCUVMRU1FTlRfVEVYVAotCQkJCS5wdXQoRGlzY2lwbGluZUdyb3VwaW5nSW1wbC5jbGFzcywgVEVYVF9ESVNDSVBMSU5FX0dST1VQSU5HKTsKLQkJRUxFTUVOVF9URVhULnB1dChEb21haW5JbXBsLmNsYXNzLCBURVhUX0RPTUFJTik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbC5jbGFzcywKLQkJCQlURVhUX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMpOwotCQlFTEVNRU5UX1RFWFQucHV0KEV4YW1wbGVJbXBsLmNsYXNzLCBURVhUX0VYQU1QTEUpOwotCQlFTEVNRU5UX1RFWFQucHV0KEd1aWRlbGluZUltcGwuY2xhc3MsIFRFWFRfR1VJREVMSU5FKTsKLQkJRUxFTUVOVF9URVhULnB1dChJdGVyYXRpb25JbXBsLmNsYXNzLCBURVhUX0lURVJBVElPTik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoTWV0aG9kQ29uZmlndXJhdGlvbkltcGwuY2xhc3MsCi0JCQkJVEVYVF9NRVRIT0RfQ09ORklHVVJBVE9OKTsKLQkJRUxFTUVOVF9URVhULnB1dChNZXRob2RMaWJyYXJ5SW1wbC5jbGFzcywgVEVYVF9NRVRIT0RfTElCQVJBUlkpOwotCQlFTEVNRU5UX1RFWFQucHV0KE1ldGhvZFBhY2thZ2VJbXBsLmNsYXNzLCBURVhUX01FVEhPRF9QQUNLQUdFKTsKLQkJRUxFTUVOVF9URVhULnB1dChNZXRob2RQbHVnaW5JbXBsLmNsYXNzLCBURVhUX01FVEhPRF9QTFVHSU4pOwotCQlFTEVNRU5UX1RFWFQucHV0KE1pbGVzdG9uZUltcGwuY2xhc3MsIFRFWFRfTUlMRVNUT05FKTsKLQkJRUxFTUVOVF9URVhULnB1dChPdXRjb21lSW1wbC5jbGFzcywgVEVYVF9PVVRDT01FKTsKLQkJRUxFTUVOVF9URVhULnB1dChQaGFzZUltcGwuY2xhc3MsIFRFWFRfUEhBU0UpOwotCQlFTEVNRU5UX1RFWFQucHV0KFByYWN0aWNlSW1wbC5jbGFzcywgVEVYVF9QUkFDVElDRSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoUHJvY2Vzc0ZhbWlseUltcGwuY2xhc3MsIFRFWFRfUFJPQ0VTU19GQU1JTFkpOwotCQlFTEVNRU5UX1RFWFQucHV0KFByb2Nlc3NQYWNrYWdlSW1wbC5jbGFzcywgVEVYVF9QUk9DRVNTX1BBQ0tBR0UpOwotCQlFTEVNRU5UX1RFWFQucHV0KFJlcG9ydEltcGwuY2xhc3MsIFRFWFRfUkVQT1JUKTsKLQkJRUxFTUVOVF9URVhULnB1dChSZXVzYWJsZUFzc2V0SW1wbC5jbGFzcywgVEVYVF9SRVVTQUJMRV9BU1NFVCk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoUm9hZG1hcEltcGwuY2xhc3MsIFRFWFRfUk9BRE1BUCk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoUm9sZUltcGwuY2xhc3MsIFRFWFRfUk9MRSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoUm9sZURlc2NyaXB0b3JJbXBsLmNsYXNzLCBURVhUX1JPTEVfREVTQ1JJUFRPUik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoUm9sZVNldEltcGwuY2xhc3MsIFRFWFRfUk9MRV9TRVQpOwotCQlFTEVNRU5UX1RFWFQucHV0KFJvbGVTZXRHcm91cGluZ0ltcGwuY2xhc3MsIFRFWFRfUk9MRV9TRVRfR1JPVVBJTkcpOwotCQlFTEVNRU5UX1RFWFQucHV0KFN0ZXBJbXBsLmNsYXNzLCBURVhUX1NURVApOwotCQlFTEVNRU5UX1RFWFQKLQkJCQkucHV0KFN1cHBvcnRpbmdNYXRlcmlhbEltcGwuY2xhc3MsIFRFWFRfU1VQUE9SVElOR19NQVRFUklBTCk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoVGFza0ltcGwuY2xhc3MsIFRFWFRfVEFTSyk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoVGFza0Rlc2NyaXB0b3JJbXBsLmNsYXNzLCBURVhUX1RBU0tfREVTQ1JJUFRPUik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoVGVhbVByb2ZpbGVJbXBsLmNsYXNzLCBURVhUX1RFQU1fUFJPRklMRSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoVGVtcGxhdGVJbXBsLmNsYXNzLCBURVhUX1RFTVBMQVRFKTsKLQkJRUxFTUVOVF9URVhULnB1dChUZXJtRGVmaW5pdGlvbkltcGwuY2xhc3MsIFRFWFRfVEVSTV9ERUZJTklUSU9OKTsKLQkJRUxFTUVOVF9URVhULnB1dChUZW1wbGF0ZUltcGwuY2xhc3MsIFRFWFRfVEVNUExBVEUpOwotCQlFTEVNRU5UX1RFWFQucHV0KFRvb2xJbXBsLmNsYXNzLCBURVhUX1RPT0wpOwotCQlFTEVNRU5UX1RFWFQucHV0KFRvb2xNZW50b3JJbXBsLmNsYXNzLCBURVhUX1RPT0xfTUVOVE9SKTsKLQkJRUxFTUVOVF9URVhULnB1dChXaGl0ZXBhcGVySW1wbC5jbGFzcywgVEVYVF9XSElURVBBUEVSKTsKLQkJRUxFTUVOVF9URVhULnB1dChXb3JrUHJvZHVjdEltcGwuY2xhc3MsIFRFWFRfV09SS19QUk9EVUNUKTsKLQkJRUxFTUVOVF9URVhULnB1dChXb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsLmNsYXNzLAotCQkJCVRFWFRfV09SS19QUk9EVUNUX0RFU0NSSVBUT1IpOwotCQlFTEVNRU5UX1RFWFQucHV0KFdvcmtQcm9kdWN0VHlwZUltcGwuY2xhc3MsIFRFWFRfV09SS19QUk9EVUNUX1RZUEUpOwotCi0JCS8vIHBsdXJhbAotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChBY3Rpdml0eUltcGwuY2xhc3MsIFRFWFRfQUNUSVZJVFlfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoQXJ0aWZhY3RJbXBsLmNsYXNzLCBURVhUX0FSVElGQUNUX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KENhcGFiaWxpdHlQYXR0ZXJuSW1wbC5jbGFzcywKLQkJCQlURVhUX0NBUEFCSUxJVFlfUEFUVEVSTl9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChDaGVja2xpc3RJbXBsLmNsYXNzLCBURVhUX0NIRUNLTElTVF9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChDb21wb3NpdGVSb2xlSW1wbC5jbGFzcywKLQkJCQlURVhUX0NPTVBPU0lURV9ST0xFX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KENvbmNlcHRJbXBsLmNsYXNzLCBURVhUX0NPTkNFUFRfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoQ29udGVudFBhY2thZ2VJbXBsLmNsYXNzLAotCQkJCVRFWFRfQ09OVEVOVF9QQUNLQUdFX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KEN1c3RvbUNhdGVnb3J5SW1wbC5jbGFzcywKLQkJCQlURVhUX0NVU1RPTV9DQVRFR09SWV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChEZWxpdmVyYWJsZUltcGwuY2xhc3MsIFRFWFRfREVMSVZFUkFCTEVfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRGVsaXZlcnlQcm9jZXNzSW1wbC5jbGFzcywKLQkJCQlURVhUX0RFTElWRVJZX1BST0NFU1NfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRGlzY2lwbGluZUltcGwuY2xhc3MsIFRFWFRfRElTQ0lQTElORV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChEaXNjaXBsaW5lR3JvdXBpbmdJbXBsLmNsYXNzLAotCQkJCVRFWFRfRElTQ0lQTElORV9HUk9VUElOR19QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChEb21haW5JbXBsLmNsYXNzLCBURVhUX0RPTUFJTl9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsLmNsYXNzLAotCQkJCVRFWFRfRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChFeGFtcGxlSW1wbC5jbGFzcywgVEVYVF9FWEFNUExFX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KEd1aWRlbGluZUltcGwuY2xhc3MsIFRFWFRfR1VJREVMSU5FX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KEl0ZXJhdGlvbkltcGwuY2xhc3MsIFRFWFRfSVRFUkFUSU9OX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KE1ldGhvZENvbmZpZ3VyYXRpb25JbXBsLmNsYXNzLAotCQkJCVRFWFRfTUVUSE9EX0NPTkZJR1VSQVRPTl9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChNZXRob2RMaWJyYXJ5SW1wbC5jbGFzcywKLQkJCQlURVhUX01FVEhPRF9MSUJBUkFSWV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChNZXRob2RQYWNrYWdlSW1wbC5jbGFzcywKLQkJCQlURVhUX01FVEhPRF9QQUNLQUdFX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KE1ldGhvZFBsdWdpbkltcGwuY2xhc3MsCi0JCQkJVEVYVF9NRVRIT0RfUExVR0lOX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KE1pbGVzdG9uZUltcGwuY2xhc3MsIFRFWFRfTUlMRVNUT05FX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KE91dGNvbWVJbXBsLmNsYXNzLCBURVhUX09VVENPTUVfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUGhhc2VJbXBsLmNsYXNzLCBURVhUX1BIQVNFX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFByYWN0aWNlSW1wbC5jbGFzcywgVEVYVF9QUkFDVElDRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChQcm9jZXNzRmFtaWx5SW1wbC5jbGFzcywKLQkJCQlURVhUX1BST0NFU1NfRkFNSUxZX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFByb2Nlc3NQYWNrYWdlSW1wbC5jbGFzcywKLQkJCQlURVhUX1BST0NFU1NfUEFDS0FHRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChSZXBvcnRJbXBsLmNsYXNzLCBURVhUX1JFUE9SVF9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChSZXVzYWJsZUFzc2V0SW1wbC5jbGFzcywKLQkJCQlURVhUX1JFVVNBQkxFX0FTU0VUX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFJvYWRtYXBJbXBsLmNsYXNzLCBURVhUX1JPQURNQVBfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUm9sZUltcGwuY2xhc3MsIFRFWFRfUk9MRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChSb2xlRGVzY3JpcHRvckltcGwuY2xhc3MsCi0JCQkJVEVYVF9ST0xFX0RFU0NSSVBUT1JfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUm9sZVNldEltcGwuY2xhc3MsIFRFWFRfUk9MRV9TRVRfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUm9sZVNldEdyb3VwaW5nSW1wbC5jbGFzcywKLQkJCQlURVhUX1JPTEVfU0VUX0dST1VQSU5HX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFN0ZXBJbXBsLmNsYXNzLCBURVhUX1NURVBfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoU3VwcG9ydGluZ01hdGVyaWFsSW1wbC5jbGFzcywKLQkJCQlURVhUX1NVUFBPUlRJTkdfTUFURVJJQUxfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoVGFza0ltcGwuY2xhc3MsIFRFWFRfVEFTS19QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChUYXNrRGVzY3JpcHRvckltcGwuY2xhc3MsCi0JCQkJVEVYVF9UQVNLX0RFU0NSSVBUT1JfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTAotCQkJCS5wdXQoVGVhbVByb2ZpbGVJbXBsLmNsYXNzLCBURVhUX1RFQU1fUFJPRklMRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChUZW1wbGF0ZUltcGwuY2xhc3MsIFRFWFRfVEVNUExBVEVfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoVGVybURlZmluaXRpb25JbXBsLmNsYXNzLAotCQkJCVRFWFRfVEVSTV9ERUZJTklUSU9OX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFRlbXBsYXRlSW1wbC5jbGFzcywgVEVYVF9URU1QTEFURV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChUb29sSW1wbC5jbGFzcywgVEVYVF9UT09MX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFRvb2xNZW50b3JJbXBsLmNsYXNzLCBURVhUX1RPT0xfTUVOVE9SX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFdoaXRlcGFwZXJJbXBsLmNsYXNzLCBURVhUX1dISVRFUEFQRVJfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTAotCQkJCS5wdXQoV29ya1Byb2R1Y3RJbXBsLmNsYXNzLCBURVhUX1dPUktfUFJPRFVDVF9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChXb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsLmNsYXNzLAotCQkJCVRFWFRfV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoV29ya1Byb2R1Y3RUeXBlSW1wbC5jbGFzcywKLQkJCQlURVhUX1dPUktfUFJPRFVDVF9UWVBFX1BMVVJBTCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGlzcGxheSBuYW1lIGZvciBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIHBsdXJhbAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHJldHVybiB0aGUgcGx1cmFsIGZvcm0gb2YgdGhlIGRpc3BsYXkKLQkgKiAgICAgICAgICAgIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVSVRleHQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBib29sZWFuIHBsdXJhbCkgewotCQlpZiAocGx1cmFsKSB7Ci0JCQlTdHJpbmcgbGFiZWwgPSAoU3RyaW5nKSBFTEVNRU5UX1RFWFRfUExVUkFMLmdldChlbGVtZW50LmdldENsYXNzKCkpOwotCQkJcmV0dXJuIChsYWJlbCA9PSBudWxsKSA/IGVsZW1lbnQuZ2V0TmFtZSgpIDogbGFiZWw7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgbGFiZWwgPSAoU3RyaW5nKSBFTEVNRU5UX1RFWFQuZ2V0KGVsZW1lbnQuZ2V0Q2xhc3MoKSk7Ci0JCQlyZXR1cm4gKGxhYmVsID09IG51bGwpID8gZWxlbWVudC5nZXROYW1lKCkgOiBsYWJlbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc3BsYXkgbmFtZSBmb3IgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVJVGV4dChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldFVJVGV4dChlbGVtZW50LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGlzcGxheSBuYW1lIGZvciBhIG1ldGhvZCBlbGVtZW50IGluIGxvd2VyIGNhc2UuCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgZG9lcyBub3QgYXBwbGllcyB0byB0aGUgR2VybWFuIGxhbmd1YWdlIHNpbmNlIGl0IGhhcyBubwotCSAqIGRpc3RpbmN0aW9uIGJldHdlZW4gYSB1cHBlciBjYXNlIGFuZCBsb3dlciBjYXNlIG5vdW4uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcGFyYW0gcGx1cmFsCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcmV0dXJuIHRoZSBwbHVyYWwgZm9ybSBvZiB0aGUgZGlzcGxheQotCSAqICAgICAgICAgICAgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVJVGV4dExvd2VyKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiBwbHVyYWwpIHsKLQkJU3RyaW5nIGxhYmVsOwotCQlpZiAocGx1cmFsKSB7Ci0JCQlsYWJlbCA9IChTdHJpbmcpIEVMRU1FTlRfVEVYVF9QTFVSQUwuZ2V0KGVsZW1lbnQuZ2V0Q2xhc3MoKSk7Ci0JCQlsYWJlbCA9IChsYWJlbCA9PSBudWxsKSA/IGVsZW1lbnQuZ2V0TmFtZSgpIDogbGFiZWw7Ci0JCX0gZWxzZSB7Ci0JCQlsYWJlbCA9IChTdHJpbmcpIEVMRU1FTlRfVEVYVC5nZXQoZWxlbWVudC5nZXRDbGFzcygpKTsKLQkJCWxhYmVsID0gKGxhYmVsID09IG51bGwpID8gZWxlbWVudC5nZXROYW1lKCkgOiBsYWJlbDsKLQkJfQotCi0JCXJldHVybiBTdHJVdGlsLnRvTG93ZXIobGFiZWwpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc3BsYXkgbmFtZSBmb3IgYSBtZXRob2QgZWxlbWVudCBpbiBsb3dlciBjYXNlLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGRvZXMgbm90IGFwcGxpZXMgdG8gdGhlIEdlcm1hbiBsYW5ndWFnZSBzaW5jZSBpdCBoYXMgbm8KLQkgKiBkaXN0aW5jdGlvbiBiZXR3ZWVuIGEgdXBwZXIgY2FzZSBhbmQgbG93ZXIgY2FzZSBub3VuLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VUlUZXh0TG93ZXIoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBnZXRVSVRleHRMb3dlcihlbGVtZW50LCBmYWxzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFlNGQ0NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkuRVBGVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLmRpYWxvZ3MuUmVuYW1lRmlsZUNvbmZsaWN0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBIZWxwZXIgdXRpbGl0aWVzIGZvciBpbXBsZW1lbnRpbmcgbWV0aG9kIGxpYnJhcnkgVUkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVVJVXRpbCB7Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBhcHBsaWNhdGlvbiBzaGVsbCB0aXRsZSB0byBkaXNwbGF5IHRoZSBhcHBsaWNhdGlvbiBuYW1lIGFuZAotCSAqIHRoZSBkZWZhdWx0IG1ldGhvZCBsaWJyYXJ5IHBhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZVNoZWxsVGl0bGUoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlTaGVsbCBzaGVsbCA9IHdpbmRvdy5nZXRTaGVsbCgpOwotCQkJaWYgKHNoZWxsICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbGliUGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSAhPSBudWxsKSB7Ci0JCQkJCWxpYlBhdGggPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCk7Ci0JCQkJCWlmIChsaWJQYXRoID09IG51bGwpIHsKLQkJCQkJCWxpYlBhdGggPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLmdldE5hbWUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlTdHJpbmcgYXBwTmFtZSA9IFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCk7Ci0JCQkJU3RyaW5nIGFwcFRpdGxlID0gTkxTLmJpbmQoCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuYXBwbGljYXRpb25fdGl0bGUsIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCWFwcE5hbWUsIGxpYlBhdGggfSk7Ci0JCQkJc2hlbGwuc2V0VGV4dChhcHBUaXRsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyBhIGRpYWxvZyB0byBwcm9tcHRzIHRoZSB1c2VyIHRvIHNhdmUgdGhlIG9wZW4gbGlicmFyeSBpZiBpdCBoYXMKLQkgKiBiZWVuIG1vZGlmaWVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+U1dULllFUzwvY29kZT4sIDxjb2RlPlNXVC5OTzwvY29kZT4gb3IKLQkgKiAgICAgICAgIDxjb2RlPlNXVC5DQU5DRUw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZGlzcGxheVNhdmVEaXJ0eUVkaXRvcnNEaWFsb2coKSB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCAmJiBtYW5hZ2VyLmlzTWV0aG9kTGlicmFyeU1vZGlmaWVkKCkpIHsKLQkJCWludCByZXQgPSBNc2dCb3gucHJvbXB0KExpYnJhcnlVSVJlc291cmNlcy5zYXZlTGlicmFyeURpYWxvZ190aXRsZSwKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RGlhbG9nX3RleHQsIFNXVC5ZRVMgfCBTV1QuTk8KLQkJCQkJCQl8IFNXVC5DQU5DRUwpOwotCQkJc3dpdGNoIChyZXQpIHsKLQkJCWNhc2UgU1dULllFUzoKLQkJCQl0cnkgewotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNhdmVDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpOwotCQkJCQlkaWFsb2cuZGlzcGxheUVycm9yKAotCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5zYXZlTGlicmFyeURpYWxvZ190aXRsZSwKLQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuc2F2ZUxpYnJhcnlFcnJvcl9tc2csCi0JCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLmVycm9yX3JlYXNvbiwgZSk7Ci0JCQkJfQotCQkJCXJldHVybiBTV1QuWUVTOwotCQkJY2FzZSBTV1QuTk86Ci0JCQkJLy8gRGlzY2FyZCBhbGwgY2hhbmdlcyBieSByZXNldHRpbmcgYWxsIHJlc291cmNlcyBhcyB1bmNoYW5nZWQuCi0JCQkJbWFuYWdlci5kaXNjYXJkTWV0aG9kTGlicmFyeUNoYW5nZXMoKTsKLQkJCQlyZXR1cm4gU1dULk5POwotCQkJY2FzZSBTV1QuQ0FOQ0VMOgotCQkJCXJldHVybiBTV1QuQ0FOQ0VMOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIFNXVC5DQU5DRUw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBmaWxlIFVSTCBmb3IgYW4gYXR0YWNobWVudAotCSAqIAotCSAqIEBwYXJhbSBhdHRhY2htZW50Ci0JICogICAgICAgICAgICB0aGUgZmlsZSB0byBhdHRhY2gKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIE1ldGhvZEVsZW1lbnQgcmVmZXJlbmNpbmcgdGhlIGZpbGUKLQkgKiBAcGFyYW0gY29weUZpbGUKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIHdpbGwgY29weSB0aGUgZmlsZSAoaWYgaXQgaXNuJ3QgYWxyZWFkeSBpbiB0aGUgcGx1Z2luCi0JICogICAgICAgICAgICBwYXRoKQotCSAqIEByZXR1cm4gVVJMIG9mIHRoZSBmb3JtIC4vLi4vJmx0O3JvbGVzJmd0Oy9yZXNvdXJjZXMvJmx0O2ZpbGVuYW1lIG9mCi0JICogICAgICAgICBhdHRhY2htZW50Jmd0OwotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVUkxGb3JBdHRhY2htZW50KFNoZWxsIHNoZWxsLCBGaWxlIGF0dGFjaG1lbnQsCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gY29weUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBwbHVnaW5EaXIgPSBGaWxlVXRpbC5hcHBlbmRTZXBhcmF0b3IobmV3IEZpbGUoVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCkKLQkJCQkuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpKTsKLQkJRmlsZSBmb3JtYXRGaWxlID0gbnVsbDsKLQkJU3RyaW5nIHJlc291cmNlTG9jID0gUmVzb3VyY2VIZWxwZXIuZ2V0QWJzb2x1dGVFbGVtZW50UmVzb3VyY2VQYXRoKGVsZW1lbnQpOwotCQkvLyBGaWxlIHJlc291cmNlRGlyID0gbmV3IEZpbGUocmVzb3VyY2VMb2MpOwotCQlmb3JtYXRGaWxlID0gbmV3IEZpbGUocmVzb3VyY2VMb2MgKyBGaWxlLnNlcGFyYXRvcgotCQkJCSsgYXR0YWNobWVudC5nZXROYW1lKCkpOwotCQlpZiAoY29weUZpbGUpIHsKLQkJCUZpbGUgbmV3RmlsZSA9IGNvcHlSZXNvdXJjZVRvTGliKHNoZWxsLCBhdHRhY2htZW50LCBlbGVtZW50KTsKLQkJCWlmIChuZXdGaWxlICE9IG51bGwpIHsKLQkJCQlmb3JtYXRGaWxlID0gbmV3IEZpbGUocmVzb3VyY2VMb2MgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJKyBuZXdGaWxlLmdldE5hbWUoKSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHVzZXIgaGl0IGNhbmNlbAotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJSVJlc291cmNlIHdzUmVzb3VyY2UgPSBGaWxlTWFuYWdlci5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKGZvcm1hdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJaWYod3NSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRmlsZU1hbmFnZXIucmVmcmVzaCh3c1Jlc291cmNlKTsKLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLmdldFJlbGF0aXZlUGF0aFRvRmlsZUZyb21FbGVtZW50KGVsZW1lbnQsCi0JCQkJZm9ybWF0RmlsZSk7Ci0KLQl9Ci0JCi0JLyoqCi0JICogQ29waWVzIHRoZSBnaXZlbiBmaWxlIGludG8gdGhlIG1ldGhvZEVsZW1lbnQncyByZXNvdXJjZSBmb2xkZXIuCi0JICogUmVzb2x2ZXMgZmlsZW5hbWUgY29uZmxpY3QgYnkgcHJvbXB0aW5nIHVzZXIgdG8gb3ZlcndyaXRlIG9yIHJlbmFtZQotCSAqIEBwYXJhbSBzaGVsbCBpZiBudWxsLCB3aWxsIG92ZXJ3cml0ZSBmaWxlIHdpdGhvdXQgcHJvbXB0aW5nCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIG1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBGaWxlIHJlcHJlc2VudGluZyB0aGUgdXNlcidzIGZpbmFsIGNob2ljZSBvZiBsaWJyYXJ5IHJlc291cmNlIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29weVJlc291cmNlVG9MaWIoU2hlbGwgc2hlbGwsIEZpbGUgcmVzb3VyY2UsIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCkgewotCQlTdHJpbmcgcmVzb3VyY2VMb2MgPSBSZXNvdXJjZUhlbHBlci5nZXRBYnNvbHV0ZUVsZW1lbnRSZXNvdXJjZVBhdGgobWV0aG9kRWxlbWVudCk7Ci0KLQkJRmlsZSBsaWJGaWxlID0gbmV3IEZpbGUocmVzb3VyY2VMb2MsIHJlc291cmNlLmdldE5hbWUoKSk7Ci0JCi0JCWlmIChyZXNvdXJjZS5lcXVhbHMobGliRmlsZSkpIHsKLQkJCS8vIHNvdXJjZSBmaWxlIGlzIGFscmVhZHkgaW4gcmVzb3VyY2VzIGRpcgotCQkJcmV0dXJuIGxpYkZpbGU7Ci0JCX0KLQkJCi0JCS8vIGlmIG5vIHNoZWxsLCB3aWxsIGp1c3Qgb3ZlcndyaXRlCi0JCWlmIChsaWJGaWxlLmV4aXN0cygpICYmIHNoZWxsICE9IG51bGwpIHsKLQkJCVJlbmFtZUZpbGVDb25mbGljdERpYWxvZyBkaWFsb2cgPSBuZXcgUmVuYW1lRmlsZUNvbmZsaWN0RGlhbG9nKHNoZWxsKTsKLQkJCWRpYWxvZy5zZXRNZXNzYWdlU3RyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCQkJRVBGVUlSZXNvdXJjZXMuRGlhbG9nX2ZpbGVOYW1lQ29uZmxpY3RfbXNnLCAKLQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IHJlc291cmNlLmdldE5hbWUoKSwgcmVzb3VyY2VMb2MgfSkpOwotCQkJZGlhbG9nLnNldERlc3RpbmF0aW9uKHJlc291cmNlTG9jKTsKLQkJCWRpYWxvZy5zZXRGaWxlUGF0aChyZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQotCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gZWxzZSB7Ci0JCQkJbGliRmlsZSA9IG5ldyBGaWxlKHJlc291cmNlTG9jLCBkaWFsb2cuZ2V0RmlsZVBhdGgoKSk7Ci0JCQl9Ci0JCX0KLQotCQlGaWxlVXRpbC5jb3B5RmlsZShyZXNvdXJjZSwgbGliRmlsZSk7Ci0JCQotCQlJUmVzb3VyY2Ugd3NSZXNvdXJjZSA9IEZpbGVNYW5hZ2VyLmdldFJlc291cmNlRm9yTG9jYXRpb24obGliRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWlmKHdzUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlGaWxlTWFuYWdlci5yZWZyZXNoKHdzUmVzb3VyY2UpOwotCQkJfQotCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCi0KLQkJcmV0dXJuIGxpYkZpbGU7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmI0MzI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIE1ldGhvZCBFbGVtZW50IE5hbWVzIChTaW5ndWxhcikKLWFjdGl2aXR5X3RleHQ9QWN0aXZpdHkKLWFydGlmYWN0X3RleHQ9QXJ0aWZhY3QKLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHQ9Q2FwYWJpbGl0eSBQYXR0ZXJuCi1jaGVja2xpc3RfdGV4dD1DaGVja2xpc3QKLWNoZWNrSXRlbV90ZXh0PUNoZWNrIEl0ZW0KLWNvbXBvc2l0ZVJvbGVfdGV4dD1Db21wb3NpdGUgUm9sZQotY29uY2VwdF90ZXh0PUNvbmNlcHQKLWNvbnRlbnRQYWNrYWdlX3RleHQ9Q29udGVudCBQYWNrYWdlCi1jdXN0b21DYXRlZ29yeV90ZXh0PUN1c3RvbSBDYXRlZ29yeQotZGVsaXZlcmFibGVfdGV4dD1EZWxpdmVyYWJsZQotZGVsaXZlcnlQcm9jZXNzX3RleHQ9RGVsaXZlcnkgUHJvY2VzcwotZGVzY3JpcHRvcl90ZXh0PURlc2NyaXB0b3IKLWRpc2NpcGxpbmVfdGV4dD1EaXNjaXBsaW5lCi1kaXNjaXBsaW5lR3JvdXBpbmdfdGV4dD1EaXNjaXBsaW5lIEdyb3VwaW5nCi1kb21haW5fdGV4dD1Eb21haW4KLWVzdGltYXRlX3RleHQ9RXN0aW1hdGUKLWVzdGltYXRpbmdNZXRyaWNfdGV4dD1Fc3RpbWF0aW5nIE1ldHJpYwotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ9RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucwotZXhhbXBsZV90ZXh0PUV4YW1wbGUKLWd1aWRhbmNlX3RleHQ9R3VpZGFuY2UKLWd1aWRlbGluZV90ZXh0PUd1aWRlbGluZQotaXRlcmF0aW9uX3RleHQ9SXRlcmF0aW9uCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHQ9TWV0aG9kIENvbmZpZ3VyYXRpb24KLW1ldGhvZENvbnRlbnRfdGV4dD1NZXRob2QgQ29udGVudAotbWV0aG9kTGlicmFyeV90ZXh0PU1ldGhvZCBMaWJyYXJ5Ci1tZXRob2RQYWNrYWdlX3RleHQ9TWV0aG9kIFBhY2thZ2UKLW1ldGhvZFBsdWdpbl90ZXh0PU1ldGhvZCBQbHVnLWluCi1taWxlc3RvbmVfdGV4dD1NaWxlc3RvbmUKLW91dGNvbWVfdGV4dD1PdXRjb21lCi1waGFzZV90ZXh0PVBoYXNlCi1wcmFjdGljZV90ZXh0PVByYWN0aWNlCi1wcm9jZXNzX3RleHQ9UHJvY2VzcwotcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0PURpZmZlcmVudGlhbCBQcm9jZXNzCi1wcm9jZXNzRmFtaWx5X3RleHQ9UHJvY2VzcyBGYW1pbHkKLXByb2Nlc3NQYWNrYWdlX3RleHQ9UHJvY2VzcyBQYWNrYWdlCi1yZXBvcnRfdGV4dD1SZXBvcnQKLXJldXNhYmxlQXNzZXRfdGV4dD1SZXVzYWJsZSBBc3NldAotcm9hZG1hcF90ZXh0PVJvYWRtYXAKLXJvbGVEZXNjcmlwdG9yX3RleHQ9Um9sZSBEZXNjcmlwdG9yCi1yb2xlX3RleHQ9Um9sZQotcm9sZVNldF90ZXh0PVJvbGUgU2V0Ci1yb2xlU2V0R3JvdXBpbmdfdGV4dD1Sb2xlIFNldCBHcm91cGluZwotc3RhbmRhcmRDYXRlZ29yeV90ZXh0PVN0YW5kYXJkIENhdGVnb3J5Ci1zdGVwX3RleHQ9U3RlcAotc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ9U3VwcG9ydGluZyBNYXRlcmlhbAotdGFza190ZXh0PVRhc2sKLXRhc2tEZXNjcmlwdG9yX3RleHQ9VGFzayBEZXNjcmlwdG9yCi10ZWFtUHJvZmlsZV90ZXh0PVRlYW0gUHJvZmlsZQotdGVtcGxhdGVfdGV4dD1UZW1wbGF0ZQotdGVybURlZmluaXRpb25fdGV4dD1UZXJtIERlZmluaXRpb24KLXRvb2xfdGV4dD1Ub29sCi10b29sTWVudG9yX3RleHQ9VG9vbCBNZW50b3IKLXdoaXRlcGFwZXJfdGV4dD1XaGl0ZXBhcGVyCi13b3JrUHJvZHVjdF90ZXh0PVdvcmsgUHJvZHVjdAotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9V29yayBQcm9kdWN0IERlc2NyaXB0b3IKLXdvcmtQcm9kdWN0RWxlbWVudF90ZXh0PVdvcmsgUHJvZHVjdCBFbGVtZW50Ci13b3JrUHJvZHVjdFR5cGVfdGV4dD1Xb3JrIFByb2R1Y3QgS2luZAotCi0jIE1ldGhvZCBFbGVtZW50IE5hbWVzIChQbHVyYWwpCi1hY3Rpdml0eV90ZXh0X3BsdXJhbD1BY3Rpdml0aWVzCi1hcnRpZmFjdF90ZXh0X3BsdXJhbD1BcnRpZmFjdHMKLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHRfcGx1cmFsPUNhcGFiaWxpdHkgUGF0dGVybnMKLWNoZWNrbGlzdF90ZXh0X3BsdXJhbD1DaGVja2xpc3RzCi1jaGVja0l0ZW1fdGV4dF9wbHVyYWw9Q2hlY2sgSXRlbXMKLWNvbXBvc2l0ZVJvbGVfdGV4dF9wbHVyYWw9Q29tcG9zaXRlIFJvbGVzCi1jb25jZXB0X3RleHRfcGx1cmFsPUNvbmNlcHRzCi1jb250ZW50UGFja2FnZV90ZXh0X3BsdXJhbD1Db250ZW50IFBhY2thZ2VzCi1jdXN0b21DYXRlZ29yeV90ZXh0X3BsdXJhbD1DdXN0b20gQ2F0ZWdvcmllcwotZGVsaXZlcmFibGVfdGV4dF9wbHVyYWw9RGVsaXZlcmFibGVzCi1kZWxpdmVyeVByb2Nlc3NfdGV4dF9wbHVyYWw9RGVsaXZlcnkgUHJvY2Vzc2VzCi1kZXNjcmlwdG9yX3RleHRfcGx1cmFsPURlc2NyaXB0b3JzCi1kaXNjaXBsaW5lX3RleHRfcGx1cmFsPURpc2NpcGxpbmVzCi1kaXNjaXBsaW5lR3JvdXBpbmdfdGV4dF9wbHVyYWw9RGlzY2lwbGluZSBHcm91cGluZ3MKLWRvbWFpbl90ZXh0X3BsdXJhbD1Eb21haW5zCi1lc3RpbWF0ZV90ZXh0X3BsdXJhbD1Fc3RpbWF0ZXMKLWVzdGltYXRpbmdNZXRyaWNfdGV4dF9wbHVyYWw9RXN0aW1hdGluZyBNZXRyaWNzCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dF9wbHVyYWw9RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucwotZXhhbXBsZV90ZXh0X3BsdXJhbD1FeGFtcGxlcwotZ3VpZGFuY2VfdGV4dF9wbHVyYWw9R3VpZGFuY2VzCi1ndWlkZWxpbmVfdGV4dF9wbHVyYWw9R3VpZGVsaW5lcwotaXRlcmF0aW9uX3RleHRfcGx1cmFsPUl0ZXJhdGlvbnMKLW1ldGhvZENvbmZpZ3VyYXRpb25fdGV4dF9wbHVyYWw9TWV0aG9kIENvbmZpZ3VyYXRpb25zCi1tZXRob2RDb250ZW50X3RleHRfcGx1cmFsPU1ldGhvZCBDb250ZW50cwotbWV0aG9kTGlicmFyeV90ZXh0X3BsdXJhbD1NZXRob2QgTGlicmFyaWVzCi1tZXRob2RQYWNrYWdlX3RleHRfcGx1cmFsPU1ldGhvZCBQYWNrYWdlcwotbWV0aG9kUGx1Z2luX3RleHRfcGx1cmFsPU1ldGhvZCBQbHVnLWlucwotbWlsZXN0b25lX3RleHRfcGx1cmFsPU1pbGVzdG9uZXMKLW91dGNvbWVfdGV4dF9wbHVyYWw9T3V0Y29tZXMKLXBoYXNlX3RleHRfcGx1cmFsPVBoYXNlcwotcHJhY3RpY2VfdGV4dF9wbHVyYWw9UHJhY3RpY2VzCi1wcm9jZXNzX3RleHRfcGx1cmFsPVByb2Nlc3NlcwotcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0X3BsdXJhbD1EaWZmZXJlbnRpYWwgUHJvY2Vzc2VzCi1wcm9jZXNzRmFtaWx5X3RleHRfcGx1cmFsPVByb2Nlc3MgRmFtaWxpZXMKLXByb2Nlc3NQYWNrYWdlX3RleHRfcGx1cmFsPVByb2Nlc3MgUGFja2FnZXMKLXJlcG9ydF90ZXh0X3BsdXJhbD1SZXBvcnRzCi1yZXVzYWJsZUFzc2V0X3RleHRfcGx1cmFsPVJldXNhYmxlIEFzc2V0cwotcm9hZG1hcF90ZXh0X3BsdXJhbD1Sb2FkbWFwcwotcm9sZURlc2NyaXB0b3JfdGV4dF9wbHVyYWw9Um9sZSBEZXNjcmlwdG9ycwotcm9sZV90ZXh0X3BsdXJhbD1Sb2xlcwotcm9sZVNldF90ZXh0X3BsdXJhbD1Sb2xlIFNldHMKLXJvbGVTZXRHcm91cGluZ190ZXh0X3BsdXJhbD1Sb2xlIFNldCBHcm91cGluZ3MKLXN0YW5kYXJkQ2F0ZWdvcnlfdGV4dF9wbHVyYWw9U3RhbmRhcmQgQ2F0ZWdvcmllcwotc3RlcF90ZXh0X3BsdXJhbD1TdGVwcwotc3VwcG9ydGluZ01hdGVyaWFsX3RleHRfcGx1cmFsPVN1cHBvcnRpbmcgTWF0ZXJpYWxzCi10YXNrX3RleHRfcGx1cmFsPVRhc2tzCi10YXNrRGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1UYXNrIERlc2NyaXB0b3JzCi10ZWFtUHJvZmlsZV90ZXh0X3BsdXJhbD1UZWFtIFByb2ZpbGVzCi10ZW1wbGF0ZV90ZXh0X3BsdXJhbD1UZW1wbGF0ZXMKLXRlcm1EZWZpbml0aW9uX3RleHRfcGx1cmFsPVRlcm0gRGVmaW5pdGlvbnMKLXRvb2xfdGV4dF9wbHVyYWw9VG9vbHMKLXRvb2xNZW50b3JfdGV4dF9wbHVyYWw9VG9vbCBNZW50b3JzCi13aGl0ZXBhcGVyX3RleHRfcGx1cmFsPVdoaXRlcGFwZXJzCi13b3JrUHJvZHVjdF90ZXh0X3BsdXJhbD1Xb3JrIFByb2R1Y3RzCi13b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dF9wbHVyYWw9V29yayBQcm9kdWN0IERlc2NyaXB0b3JzCi13b3JrUHJvZHVjdEVsZW1lbnRfdGV4dF9wbHVyYWw9V29yayBQcm9kdWN0IEVsZW1lbnRzCi13b3JrUHJvZHVjdFR5cGVfdGV4dF9wbHVyYWw9V29yayBQcm9kdWN0IEtpbmRzCi0KLSMgQXBwbGljYXRpb24gdGl0bGUuCi1hcHBsaWNhdGlvbl90aXRsZT17MH0gLSB7MX0KLQotIyBPcGVuIE1ldGhvZCBMaWJyYXJ5IFdpemFyZAotb3BlbkxpYnJhcnlXaXphcmRfdGl0bGU9T3BlbiBNZXRob2QgTGlicmFyeQotb3BlbkxpYnJhcnlNYWluV2l6YXJkUGFnZV90aXRsZT1TcGVjaWZ5IGEgcGF0aCBjb250YWluaW5nIGEgbWV0aG9kIGxpYnJhcnkKLW9wZW5MaWJyYXJ5TWFpbldpemFyZFBhZ2VfdGl0bGVfMj1TZWxlY3QgYSBtZXRob2QgbGlicmFyeQotb3BlbkxpYnJhcnlNYWluV2l6YXJkUGFnZV90ZXh0PXswfSBzdG9yZXMgbWV0aG9kcyBhbmQgcHJvY2Vzc2VzIGluIGEgZm9sZGVyIGNhbGxlZCBcbmEgbWV0aG9kIGxpYnJhcnkuIFNlbGVjdCBhIG1ldGhvZCBsaWJyYXJ5IGZvbGRlciB0byB1c2UgZm9yIHRoaXMgc2Vzc2lvbi4KLXBhdGhMYWJlbF90ZXh0PVBhdGg6Ci1uYW1lTGFiZWxfdGV4dD1OYW1lOgotdXJpTGFiZWxfdGV4dD1VUkk6Ci1vcGVuVW5saXN0ZWRMaWJyYXJ5Q2hlY2tib3hfdGV4dD1PcGVuIGEgbWV0aG9kIGxpYnJhcnkgdGhhdCBpcyBub3QgbGlzdGVkIGFib3ZlCi1saWJyYXJ5VHlwZUxhYmVsX3RleHQ9VHlwZToKLWxpYnJhcnlMYWJlbF90ZXh0PUxpYnJhcnk6Ci1icm93c2VCdXR0b25fdGV4dD1Ccm93c2UuLi4KLXByb21wdEZvckxpYnJhcnlDaGVja2JveF90ZXh0PVVzZSB0aGlzIGFzIHRoZSBkZWZhdWx0IGFuZCBkbyBub3QgYXNrIGFnYWluLgotb3BlbkxpYnJhcnlEaWFsb2dfbmV3TGlicmFyeV90ZXh0PU5vIG1ldGhvZCBsaWJyYXJ5IGV4aXN0cyBhdCAnJ3swfScnLlxuQSBuZXcgbWV0aG9kIGxpYnJhcnkgd2lsbCBiZSBjcmVhdGVkIGFuZCBvcGVuZWQgZm9yIHlvdSBhdCB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS5cblxuQ2xpY2sgT0sgdG8gcHJvY2VlZCBvciBDYW5jZWwgdG8gc3BlY2lmeSBhbm90aGVyIG1ldGhvZCBsaWJyYXJ5IHBhdGguCi0KLSMgU2VsZWN0IE1ldGhvZCBMaWJyYXJ5IEZvbGRlciBEaWFsb2cKLXNlbGVjdExpYnJhcnlGb2xkZXJEaWFsb2dfdGl0bGU9U2VsZWN0IE1ldGhvZCBMaWJyYXJ5Ci1zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RleHQ9U2VsZWN0IGEgbWV0aG9kIGxpYnJhcnkgZm9sZGVyLgotCi0jIE9wZW4gTGlicmFyeSBQcm9ncmVzcyBNZXNzYWdlCi1vcGVuaW5nTGlicmFyeVRhc2tfbmFtZT1PcGVuaW5nIG1ldGhvZCBsaWJyYXJ5Li4uCi0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBFcnJvciBEaWFsb2cKLW9wZW5MaWJyYXJ5RXJyb3JfbXNnPUlVUEwwMzAxRTogVW5hYmxlIHRvIGNyZWF0ZSB0aGUgbWV0aG9kIGxpYnJhcnkuCi1vcGVuTGlicmFyeUludGVybmxFcnJvcl9yZWFzb249QW4gaW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkLgotb3BlbkxpYnJhcnlFcnJvcl9yZWFzb24xPVRoZSBzcGVjaWZpZWQgbWV0aG9kIGxpYnJhcnkgcGF0aCAnJ3swfScnIGlzIGludmFsaWQuCi1vcGVuTGlicmFyeUVycm9yX3JlYXNvbjI9QSBtZXRob2QgbGlicmFyeSBhbHJlYWR5IGV4aXN0cyBpbiAnJ3swfScnLgotb3BlbkxpYnJhcnlFcnJvcl9yZWFzb24zPVRoZSBzcGVjaWZpZWQgbWV0aG9kIGxpYnJhcnkgZm9sZGVyICcnezB9JycgY2Fubm90IGJlIGNyZWF0ZWQuCi1vcGVuTGlicmFyeUVycm9yX3JlYXNvbjQ9VGhlIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeSBmb2xkZXIgaXMgYSBwbHVnLWluIG9yIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbiBleHBvcnQgZm9sZGVyLgotb3BlbkxpYnJhcnlFcnJvcl9hZHZpY2U9U2VsZWN0IE9LIHRvIHNwZWNpZnkgYW5vdGhlciBtZXRob2QgbGlicmFyeSBwYXRoLgotCi0jIE9wZW4gTWV0aG9kIExpYnJhcnkgRXJyb3IgTWVzc2FnZXMKLWludmFsaWRMaWJyYXJ5UGF0aF9tc2c9SVVQTDAzMDJFOiBVbmFibGUgdG8gb3BlbiB0aGUgc3BlY2lmaWVkIG1ldGhvZCBsaWJyYXJ5LgotaW52YWxpZExpYnJhcnlQYXRoX3JlYXNvbj1UaGUgc2VsZWN0ZWQgbWV0aG9kIGxpYnJhcnkgZm9sZGVyIGlzIGludmFsaWQsIGRvZXMgbm90IGV4aXN0LCBvciB5b3UgZG8gbm90IGhhdmUgdGhlIHByb3BlciBwZXJtaXNzaW9uIHRvIGFjY2VzcyBpdC5cblxuQ2xpY2sgT0sgdG8gc2VsZWN0IGFub3RoZXIgbGlicmFyeSBmb2xkZXIuCi0KLSMgUmVhZC1vbmx5IFByb2plY3QgRmlsZSBFcnJvciBEaWFsb2cKLXJlYWRPbmx5UHJvamVjdEZpbGVfdGV4dD1JVVBMMDMwNEU6ICcnezB9JycgaXMgcmVhZC1vbmx5LiBNYWtlIGl0IHdyaXRhYmxlIGJlZm9yZSBjb250aW51aW5nLgotcmV0cnlCdXR0b25fdGV4dD1SZXRyeQotY2FuY2VsQnV0dG9uX3RleHQ9Q2FuY2VsCi0KLSMgVmVyc2lvbiBNaXNtYXRjaCBEaWFsb2cKLXZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0PUlVUEwzMDVFOiBUaGUgc2VsZWN0ZWQgbGlicmFyeSBjYW5ub3QgYmUgb3BlbmVkLiBZb3UgbXVzdCB1cGdyYWRlIHswfSB0byB2ZXJzaW9uIHsxfSBvciBoaWdoZXIgaW4gb3JkZXIgdG8gb3BlbiB0aGlzIGxpYnJhcnkuCi12ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dF91bmtub3duPUlVUEwzMDZFOiBUaGUgc2VsZWN0ZWQgbGlicmFyeSBjYW5ub3QgYmUgb3BlbmVkLiBZb3UgbXVzdCB1cGdyYWRlIHswfSB0byBhIGhpZ2hlciB2ZXJzaW9uIGluIG9yZGVyIHRvIG9wZW4gdGhpcyBsaWJyYXJ5LgotCi0jIFVwZ3JhZGUgTWV0aG9kIExpYnJhcnkgRGlhbG9nCi11cGdyYWRlTGlicmFyeURpYWxvZ190aXRsZT1VcGdyYWRlIE1ldGhvZCBMaWJyYXJ5Ci11cGdyYWRlTGlicmFyeURpYWxvZ190ZXh0PVRoZSBsaWJyYXJ5IHlvdSBoYXZlIHNlbGVjdGVkIG5lZWRzIHRvIGJlIHVwZ3JhZGVkIHRvIHRoZSBuZXcgbGlicmFyeSBzdHJ1Y3R1cmUuXG5cbkRvIHlvdSB3YW50IHRvIHByb2NlZWQgd2l0aCB0aGUgdXBncmFkZT8KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9VXBncmFkaW5nIG1ldGhvZCBsaWJyYXJ5Li4uCi0KLSMgVXBncmFkZSBMaWJyYXJ5IEVycm9yIERpYWxvZwotdXBncmFkZUxpYnJhcnlFcnJvcl9tc2c9SVVQTDAzMDZFOiBGYWlsZWQgdG8gdXBncmFkZSB0aGUgbWV0aG9kIGxpYnJhcnkuIFBsZWFzZSBzZWUgdGhlIGxvZyBmaWxlIGZvciBtb3JlIGRldGFpbHMuCi0KLSMgU3dpdGNoIENvbmZpZ3VyYXRpb24gRGlhbG9nCi1zd2l0Y2hDb25maWdEaWFsb2dfdGl0bGU9U3dpdGNoIENvbmZpZ3VyYXRpb24KLXN3aXRjaENvbmZpZ0RpYWxvZ190ZXh0PURvIHlvdSB3YW50IHRvIHN3aXRjaCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sICcnezB9JycsIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VsZWN0ZWQgcHJvY2Vzcz8KLQkKLSMgQ29uZmlndXJhdGlvbiBDb21ibwotY3VycmVudENvbmZpZ0xhYmVsX3RleHQ9Q3VycmVudCBjb25maWd1cmF0aW9uOgotc2VsZWN0Q29uZmlnTGFiZWxfdGV4dD1TZWxlY3QgYSBjb25maWd1cmF0aW9uCi0KLSMgRGVsZXRlIEZpbGVzIENvbmZpcm1hdGlvbiBNZXNzYWdlCi1kZWxldGVGaWxlc0NvbmZpcm1hdGlvbl9tc2c9VGhlIHNwZWNpZmllZCBwYXRoICcnezB9JycgYWxyZWFkeSBleGlzdHMuIEFsbCBmaWxlcyBpbiB0aGUgZm9sZGVyIHdpbGwgYmUgZGVsZXRlZC4gRG8geW91IHdhbnQgdG8gcHJvY2VlZD8KLQotIyBQYXRocy9GaWxlcyBFcnJvciBNZXNzYWdlcwotZGVsZXRlRmlsZXNFcnJvcl9yZWFzb249VGhlIHBhdGggJyd7MH0nJyBjb250YWlucyBvbmUgb3IgbW9yZSBmaWxlcyB0aGF0IGNhbm5vdCBiZSBkZWxldGVkLlxuXG5TZWxlY3QgYW5vdGhlciBwYXRoIGFuZCB0cnkgYWdhaW4uCi1jcmVhdGVQYXRoRXJyb3JfcmVhc29uPVVuYWJsZSB0byBjcmVhdGUgcGF0aCAnJ3swfScnLlxuXG5TZWxlY3QgYW5vdGhlciBwYXRoIGFuZCB0cnkgYWdhaW4uCi1pbnZhbGlkUGF0aF9tc2c9VGhlIHNwZWNpZmllZCBwYXRoIGlzIG5vdCB2YWxpZC4KLW92ZXJyaWRlQ3VycmVudExpYnJhcnlFcnJvcl9tc2cwPVlvdSBjYW5ub3QgZXhwb3J0IHRvIGEgcGF0aCBjb250YWluaW5nIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnksIHBsZWFzZSBzZWxlY3QgYW5vdGhlciBwYXRoIGFuZCB0cnkgYWdhaW4uCi0KLSMgQmFja3VwIExpYnJhcnkgRGlhbG9nCi1iYWNrdXBMaWJyYXJ5RGlhbG9nX3RpdGxlPUJhY2t1cCBMaWJyYXJ5Ci1iYWNrdXBMaWJyYXJ5RGlhbG9nX3RleHQ9SXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYmFjayB1cCB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeSBiZWZvcmUgcHJvY2VlZGluZy5cblxuQ2xpY2sgT0sgdG8gY3JlYXRlIGEgYmFja3VwIGNvcHkgb2YgdGhlIGxpYnJhcnkgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuIENsaWNrIFNraXAgdG8gY29udGludWUgd2l0aG91dCBjcmVhdGluZyB0aGUgYmFja3VwLgotYmFja2luZ1VwTGlicmFyeVRhc2tfbmFtZT1CYWNraW5nIHVwIGxpYnJhcnkgZmlsZXMgLi4uCi0KLSMgQ29weSBMaWJyYXJ5IERpYWxvZwotY29weUxpYnJhcnlEaWFsb2dfdGl0bGU9Q29weSBMaWJyYXJ5Ci1jb3B5TGlicmFyeURpYWxvZ190ZXh0X3JlYWRPbmx5TGliPVRoZSBsaWJyYXJ5IGlzIG5vdCB3cml0YWJsZS4gQ2xpY2sgQ29weSB0byBjcmVhdGUgYSB3cml0YWJsZSBjb3B5IG9mIHRoZSBsaWJyYXJ5IGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LiBDbGljayBTa2lwIHRvIGNvbnRpbnVlIHdpdGhvdXQgY3JlYXRpbmcgdGhlIGNvcHkuCi1jb3B5TGlicmFyeVRhc2tfbmFtZT1NYWtpbmcgYSBjb3B5IG9mIHRoZSBsaWJyYXJ5IGZpbGVzIC4uLgotY29weUxpYnJhcnlEaWFsb2dfY29weUJ1dHRvbl90ZXh0PUNvcHkKLQotIyBQYXRoIFNlbGVjdGlvbiBEaWFsb2cKLXBhdGhTZWxlY3Rpb25FcnJvcl9tc2c9VW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcnkKLW9rQnV0dG9uX3RleHQ9T0sKLXNraXBCdXR0b25fdGV4dD1Ta2lwCi0KLSMgUHJvY2VzcyBFZGl0b3IgcHJlZmVyZW5jZXMKLWFsd2F5c0J1dHRvbl90ZXh0PUFsd2F5cwotbmV2ZXJCdXR0b25fdGV4dD1OZXZlcgotcHJvbXB0QnV0dG9uX3RleHQ9UHJvbXB0Ci0KLSMgQWRkIExpbmsgRGlhbG9nCi1saW5rVG9VUkxfbmFtZT1VUkwKLWxpbmtUb0ZpbGVfbmFtZT1GaWxlCi1lbGVtZW50TGlua19uYW1lPU1ldGhvZCBlbGVtZW50Ci1lbGVtZW50TGlua1dpdGhUeXBlX25hbWU9TWV0aG9kIGVsZW1lbnQgd2l0aCB0eXBlIHByZWZpeAotZWxlbWVudExpbmtXaXRoVXNlclRleHRfbmFtZT1NZXRob2QgZWxlbWVudCB3aXRoIGN1c3RvbSB0ZXh0Ci0KLSMgQ29udmVydCBBY3Rpdml0eSBUeXBlIERpYWxvZwotY29udmVydEFjdGl2aXR5RGlhbG9nX3RpdGxlPUNvbnZlcnQgQWN0aXZpdHkgVHlwZQotY29udmVydEFjdGl2aXR5RGlhbG9nX3RleHQ9U2VsZWN0IHRoZSB0YXJnZXQgYWN0aXZpdHkgdHlwZS4KLXVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX21zZz1JVVBMMDMwN0U6IFRoaXMgYWN0aXZpdHkgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhbm90aGVyIHR5cGUuCi11bnN1cHBvcnRlZEFjdGl2aXR5VHlwZV9yZWFzb249VGhlcmUgaXMgbm8gY29tcGF0aWJsZSBhY3Rpdml0eSB0eXBlIGZvciB7MH0uCi0KLSMgU2VsZWN0IFByb2Nlc3MgV2l6YXJkIFBhZ2UKLXNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RpdGxlPVNlbGVjdCBwcm9jZXNzCi1zZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90ZXh0PVNlbGVjdCBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzIHRvIGV4cG9ydC4KLXByb2Nlc3Nlc0xhYmVsX3RleHQ9UHJvY2Vzc2VzOgotYnJpZWZEZXNjcmlwdGlvbkxhYmVsX3RleHQ9QnJpZWYgZGVzY3JpcHRpb246Ci0KLSMgRXhwb3J0IFByb2Nlc3MgV2l6YXJkIEVycm9yIE1lc3NhZ2UuCi1ub09wZW5MaWJyYXJ5V2FybmluZ19tc2c9SVVQTDAzMDhFOiBObyBtZXRob2QgbGlicmFyeSBpcyBjdXJyZW50bHkgb3BlbmVkLiBDbGljayBDYW5jZWwsIG9wZW4gYSBtZXRob2QgbGlicmFyeSBvciBjcmVhdGUgYSBuZXcgb25lLCBhbmQgcnVuIHRoaXMgd2l6YXJkIGFnYWluLiAKLQotIyBNb3ZlZCBmcm9tIEF1dGhvcmluZyBVSSBwbHVnLWluIHRvIGF2b2lkIEF1dGhvcmluZyBVSSBkZXBlbmRlbmN5Ci1lcnJvckRpYWxvZ190aXRsZT1FcnJvcgotTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbl9kZWxldGVjb25maXJtX3RleHQ9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAnJ3swfScnPwotY29uZmlybURlbGV0ZURpYWxvZ190aXRsZT1Db25maXJtIERlbGV0aW9uCi1jb25maXJtRGVsZXRlRGlhbG9nX21zZz1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICcnezB9Jyc/Ci1jb25maXJtRGVsZXRlRGlhbG9nX21zZ1dpdGhSZWZlcmVuY2U9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAnJ3swfScnP1xuXG5UaGUgZm9sbG93aW5nIGVsZW1lbnQocykgY29udGFpbiByZWZlcmVuY2VzIHRvIHRoZSBpdGVtKHMpIHRvIGJlIGRlbGV0ZWQ6IHsxfQotUHJvY2Vzc0RlbGV0ZUFjdGlvbl9kZWxldGVjb2Zpcm1fdGV4dD1UaGlzIHdpbGwgc2F2ZSB0aGUgY3VycmVudCBlZGl0b3IgYW5kIHRoZSBjaGFuZ2Ugd2lsbCBiZSBwZXJtYW5lbnQuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgJyd7MH0nJz8KLQotIyBTYXZlIE1ldGhvZCBMaWJyYXJ5IERpYWxvZwotc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGU9U2F2ZSBNZXRob2QgTGlicmFyeQotc2F2ZUxpYnJhcnlEaWFsb2dfdGV4dD1UaGUgY3VycmVudCBtZXRob2QgbGlicmFyeSBoYXMgYmVlbiBtb2RpZmllZC4gRG8geW91IHdhbnQgdG8gc2F2ZSB0aGUgY2hhbmdlcz8KLQotIyBTYXZlIE1ldGhvZCBMaWJyYXJ5IEVycm9yIE1lc3NhZ2VzCi1zYXZlTGlicmFyeUVycm9yX21zZz1JVVBMMDMwOEU6IFRoZSBtZXRob2QgbGlicmFyeSBjYW5ub3QgYmUgc2F2ZWQuCi1lcnJvcl9yZWFzb249QW4gZXJyb3IgaGFzIG9jY3VycmVkLlxuXG5DbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0NvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9Db25maWd1cmF0aW9uQ29udHJpYnV0aW9uSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDBkNjdhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0NvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLlByZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci0KLS8qKgotICogQ29udHJpYnV0ZXMgYSBtZXRob2QgY29uZmlndXJhdGlvbiBjb21ib3hib3ggdG8gdGhlIHN5c3RlbSB0b29sYmFyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtIGV4dGVuZHMgQ29udHJpYnV0aW9uSXRlbSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb21ibyBjb25maWdDb21ibzsKLQotCXByaXZhdGUgc3RhdGljIENvbWJvVmlld2VyIGNvbmZpZ0NvbWJvVmlld2VyOwotCi0JcHJvdGVjdGVkIFRvb2xJdGVtIGl0ZW07Ci0KLQlwcm90ZWN0ZWQgQ29vbEl0ZW0gY29vbEl0ZW07Ci0KLQlwcm90ZWN0ZWQgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgbGliU3ZjTGlzdGVuZXI7Ci0KLQkvLyBUaGUgY29udGVudCBwcm92aWRlci4KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCi0JLy8gVGhlIGxhYmVsIHByb3ZpZGVyLgotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCQotCXByb3RlY3RlZCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCXBlcmZvcm1TZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oSUFjdGlvbiBhY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGwoVG9vbEJhciBwYXJlbnQsIGludCBpbmRleCkgewotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHBhcmVudCwgU1dULlNFUEFSQVRPUik7Ci0JCUNvbnRyb2wgYm94ID0gY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQlpdGVtLnNldENvbnRyb2woYm94KTsKLQkJaXRlbS5zZXRXaWR0aCgyNDApOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbSNmaWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xCYXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbChDb29sQmFyIGNvb2xCYXIsIGludCBpbmRleCkgewotCQlDb250cm9sIGJveCA9IGNyZWF0ZUNvbnRyb2woY29vbEJhcik7Ci0KLQkJaWYgKGluZGV4ID49IDApIHsKLQkJCWNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIFNXVC5EUk9QX0RPV04sIGluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCWNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIFNXVC5EUk9QX0RPV04pOwotCQl9Ci0KLQkJLy8gU2V0IHRoZSBiYWNrIHJlZmVyZW5jZS4KLQkJY29vbEl0ZW0uc2V0RGF0YSh0aGlzKTsKLQotCQkvLyBBZGQgdGhlIHRvb2xiYXIgdG8gdGhlIENvb2xJdGVtIHdpZGdldC4KLQkJY29vbEl0ZW0uc2V0Q29udHJvbChib3gpOwotCi0JCS8vIElmIHRoZSB0b29sYmFyIGl0ZW0gZXhpc3RzIHRoZW4gYWRqdXN0IHRoZSBzaXplIG9mIHRoZSBjb29sIGl0ZW0uCi0JCVBvaW50IHRvb2xCYXJTaXplID0gYm94LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJLy8gU2V0IHRoZSBwcmVmZXJyZWQgc2l6ZSB0byB0aGUgc2l6ZSBvZiB0aGUgdG9vbGJhciBwbHVzIHRyaW0uCi0JCWNvb2xJdGVtLnNldE1pbmltdW1TaXplKHRvb2xCYXJTaXplKTsKLQkJY29vbEl0ZW0uc2V0UHJlZmVycmVkU2l6ZSh0b29sQmFyU2l6ZSk7Ci0JCWNvb2xJdGVtLnNldFNpemUodG9vbEJhclNpemUpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbSNmaWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbnRyb2wuCi0JICovCi0JcHJpdmF0ZSBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQljb25maWdDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJY29uZmlnQ29tYm8uc2V0VmlzaWJsZUl0ZW1Db3VudCgxMCk7Ci0JCWNvbmZpZ0NvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWNvbmZpZ0NvbWJvVmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbmZpZ0NvbWJvKTsKLQotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlMaXN0PE9iamVjdD4gY29uZmlnc0xpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCQljb25maWdzTGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9ucyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKSkpOwotCQkJCUNvbGxlY3Rpb25zLnNvcnQoY29uZmlnc0xpc3QsIENvbXBhcmF0b3JzLkRFRkFVTFRfQ09NUEFSQVRPUik7Ci0JCQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpID09IG51bGwpIHsKLQkJCQkJY29uZmlnc0xpc3QuYWRkKDAsCi0JCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnNlbGVjdENvbmZpZ0xhYmVsX3RleHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gY29uZmlnc0xpc3QudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlyZXR1cm4gKFN0cmluZykgb2JqZWN0OwotCQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQlyZXR1cm4gKChNZXRob2RDb25maWd1cmF0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UKLQkJCQkJcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwotCQkJfQotCQl9OwotCi0JCWNvbmZpZ0NvbWJvVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQljb25maWdDb21ib1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljb25maWdDb21ib1ZpZXdlci5zZXRJbnB1dChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCi0JCVN0cmluZyBzYXZlZENvbmZpZ05hbWUgPSBQcmVmZXJlbmNlVXRpbC5nZXRTYXZlZExhc3RDb25maWcoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBzYXZlZENvbmZpZyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBzYXZlZENvbmZpZ05hbWUpOwotCQkKLQkJaWYgKHNhdmVkQ29uZmlnICE9IG51bGwpIHsKLQkJCWNvbmZpZ0NvbWJvVmlld2VyCi0JCQkJCS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2F2ZWRDb25maWcpKTsKLQkJfSBlbHNlIHsKLQkJCWNvbmZpZ0NvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnNlbGVjdENvbmZpZ0xhYmVsX3RleHQpKTsKLQkJfQotCi0JCWNvbmZpZ0NvbWJvVmlld2VyCi0JCQkuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihwb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKLQotCQljb25maWdDb21ib1ZpZXdlci5nZXRDb250cm9sKCkuYWRkRGlzcG9zZUxpc3RlbmVyKAotCQkJCW5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCQkJZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQotCQlsaWJTdmNMaXN0ZW5lciA9IG5ldyBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkJCXNlbGVjdENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQljb25maWdDb21ib1ZpZXdlci5zZXRJbnB1dChudWxsKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeUNyZWF0ZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJY29uZmlnQ29tYm9WaWV3ZXIuc2V0SW5wdXQobGlicmFyeSk7Ci0JCQkJc2VsZWN0Q29uZmlndXJhdGlvbihudWxsKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQljb25maWdDb21ib1ZpZXdlci5zZXRJbnB1dChsaWJyYXJ5KTsKLQkJCQljb25maWdDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuc2VsZWN0Q29uZmlnTGFiZWxfdGV4dCksIHRydWUpOwotCQkJCXJlZnJlc2goKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCWlmIChsaWJyYXJ5ICE9IGNvbmZpZ0NvbWJvVmlld2VyLmdldElucHV0KCkpIHsKLQkJCQkJY29uZmlnQ29tYm9WaWV3ZXIuc2V0SW5wdXQobGlicmFyeSk7Ci0JCQkJCXJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJaWYgKGxpYnJhcnkgIT0gY29uZmlnQ29tYm9WaWV3ZXIuZ2V0SW5wdXQoKSkgewotCQkJCQljb25maWdDb21ib1ZpZXdlci5zZXRJbnB1dChsaWJyYXJ5KTsKLQkJCQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJCQkJc2VsZWN0Q29uZmlndXJhdGlvbihudWxsKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9OwotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmFkZExpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQotCQlyZXR1cm4gY29uZmlnQ29tYm87Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtI3ZvaWQgc2V0VmlzaWJpbGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmlsZShib29sZWFuIHZpc2libGUpIHsKLQkJaWYgKHZpc2libGUpIHsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCQl9IGVsc2UgewotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW1vdmVMaXN0ZW5lcihsaWJTdmNMaXN0ZW5lcik7Ci0JCX0KLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldFNlbGVjdGVkQ29uZmlnKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbmZpZ0NvbWJvVmlld2VyCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlPYmplY3Qgb2JqZWN0ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJcmV0dXJuIChNZXRob2RDb25maWd1cmF0aW9uKSBvYmplY3Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGN1cnJlbnRseSBzZWxlY3RlZCBtZXRob2QgY29uZmlndXJhdGlvbiBuYW1lCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEN1cnJlbnRTZWxlY3RlZENvbmZpZ05hbWUoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29uZmlnQ29tYm9WaWV3ZXIKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBvYmplY3QgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChvYmplY3QgIT0gbnVsbCAmJiBvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlyZXR1cm4gKChNZXRob2RDb25maWd1cmF0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKQotCQkJcmV0dXJuIChTdHJpbmcpIG9iamVjdDsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwZXJmb3JtU2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSAhPSBudWxsKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldFNlbGVjdGVkQ29uZmlnKCk7Ci0JCQlpZiAoY29uZmlnICE9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkpIHsKLQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQl9Ci0JCQlQcmVmZXJlbmNlVXRpbC5zYXZlU2VsZWN0ZWRDb25maWdJbnRvUGVyc2lzdGVuY2UoZ2V0Q3VycmVudFNlbGVjdGVkQ29uZmlnTmFtZSgpKTsKLQkJCXJlZnJlc2goKTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAobGliU3ZjTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW1vdmVMaXN0ZW5lcihsaWJTdmNMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCWlmIChjb25maWdDb21ib1ZpZXdlciAhPSBudWxsKSB7Ci0JCQljb25maWdDb21ib1ZpZXdlcgotCQkJLnJlbW92ZVBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIocG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhlIGNvbmZpZ3VyYXRpb24gY29tYm8uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWZyZXNoKCkgewotCQljb25maWdDb21ib1ZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0IGEgY29uZmlndXJhdGlvbiBpbiBjb25maWd1cmF0aW9uIGNvbWJvIGJveC4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZWxlY3RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCS8vTmFtZUNhY2hlLmdldEluc3RhbmNlKCkuY2xlYXIoKTsKLQkJaWYgKGNvbmZpZyAhPSBudWxsICYmIGNvbmZpZyA9PSBnZXRTZWxlY3RlZENvbmZpZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQljb25maWdDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29uZmlnKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBQZXJmb3JtIGEgcmVmcmVzaCB0byBhZGQgdGhlICJTZWxlY3QgYSBjb25maWd1cmF0aW9uIgotCQkJLy8gc3RyaW5nIHRvIHRoZSBjb21iby4KLQkJCXJlZnJlc2goKTsKLQkJCWNvbmZpZ0NvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnNlbGVjdENvbmZpZ0xhYmVsX3RleHQpLCB0cnVlKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0lMaWJyYXJ5QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9JTGlicmFyeUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDAzN2FkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0lMaWJyYXJ5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBMaWJyYXJ5IGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeUFjdGlvbiBleHRlbmRzIElBY3Rpb24gewotLy8Jdm9pZCBub3RpZnlQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsCi0vLwkJCU9iamVjdCBuZXdWYWx1ZSk7Ci0JCi0Jdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0xpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNWY4ZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5MaWJyYXJ5U2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLQotLyoqCi0gKiBSdW5zIG9wZXJhdGlvbiB0aGF0IGxvY2tzIHRoZSBsaWJyYXJ5IGZvciB0aGUgZHVyYXRpb24gb2YgaXRzIGV4ZWN1dGlvbgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIGltcGxlbWVudHMgSVJ1bm5hYmxlQ29udGV4dCB7Ci0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yOwotCQotCXB1YmxpYyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpIHsKLQl9CQotCQotCXByaXZhdGUgdm9pZCBkb1J1bihmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsIGZpbmFsIGJvb2xlYW4gd29ya1Vua25vd24pIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uW10gaXRlSG9sZGVyID0gbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb25bMV07Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJV29ya3NwYWNlUnVubmFibGUgd29ya3NwYWNlUnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZih3b3JrVW5rbm93bikgewotICAgICAgICAJCQkJCXBtLmJlZ2luVGFzaygiIiwgMik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCQkJCQlwbS53b3JrZWQoMSk7Ci0gICAgICAgIAkJCQkJdHJ5IHsKLSAgICAgICAgCQkJCQkJcnVubmFibGUucnVuKHBtKTsKLSAgICAgICAgCQkJCQkJcG0ud29ya2VkKDIpOwotICAgICAgICAJCQkJCX0KLSAgICAgICAgCQkJCQlmaW5hbGx5IHsKLSAgICAgICAgCQkJCQkJcG0uZG9uZSgpOwotICAgICAgICAJCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgCXJ1bm5hYmxlLnJ1bihwbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyBpdCBvdXRzaWRlIHRoZSB3b3Jrc3BhY2UgcnVubmFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZUhvbGRlclswXSA9IGU7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlLXRocm93IGFzIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uLCB3aGljaCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXVnaHQgYW5kIHJlLXRocm93biBhcyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBiZWxvdy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gQ29yZUV4Y2VwdGlvbiBhbmQgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gYXJlIHByb3BhZ2F0ZWQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bih3b3Jrc3BhY2VSdW5uYWJsZSwKLSAgICAgICAgICAgIAkJbmV3IExpYnJhcnlTY2hlZHVsaW5nUnVsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpLAotICAgICAgICAgICAgCQlJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFJlLXRocm93IHRoZSBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBpZiBhbnkgb2NjdXJyZWQKLSAgICAgICAgaWYgKGl0ZUhvbGRlclswXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBpdGVIb2xkZXJbMF07Ci0gICAgICAgIH0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dCNydW4oYm9vbGVhbiwgYm9vbGVhbiwgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzcykKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oYm9vbGVhbiBmb3JrLCBib29sZWFuIGNhbmNlbGFibGUsCi0JCQlmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlkb1J1bihydW5uYWJsZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUpIHsKLQkJdHJ5IHsKLQkJCWRvUnVuKHJ1bm5hYmxlLCB0cnVlKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgY2F1c2UgPSBlLmdldENhdXNlKCk7Ci0JCQlpZihjYXVzZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLQkJCQl0aHJvdyAoUnVudGltZUV4Y2VwdGlvbiljYXVzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmKGNhdXNlID09IG51bGwpIHsKLQkJCQkJY2F1c2UgPSBlOwotCQkJCX0KLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGNhdXNlKTsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgbXNnID0gY2F1c2UuZ2V0TWVzc2FnZSgpICE9IG51bGwgPyBjYXVzZS5nZXRNZXNzYWdlKCkgOiBjYXVzZS50b1N0cmluZygpOyAKLQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoTGlicmFyeVVJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCBtc2csIGNhdXNlKTsKLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQotCQkJCX0JCQkJCi0JCQl9Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlpZihwcm9ncmVzc01vbml0b3IgPT0gbnVsbCkgewotCQkJcHJvZ3Jlc3NNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQlyZXR1cm4gcHJvZ3Jlc3NNb25pdG9yOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgdGhlIHByb2dyZXNzTW9uaXRvciB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJdGhpcy5wcm9ncmVzc01vbml0b3IgPSBwcm9ncmVzc01vbml0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTg3ZjJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL01ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci0KLQotLyoqCi0gKiBBY3Rpb24gdG8gZGVsZXRlIG1ldGhvZCBlbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uIGV4dGVuZHMgRGVsZXRlQWN0aW9uIGltcGxlbWVudHMgSUxpYnJhcnlBY3Rpb24gewotCXByb3RlY3RlZCBDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbiA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25maXJtID0gdHJ1ZTsKLQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3I7Ci0KLQkvKioKLQkgKiBEZWxldGVzIG1ldGhvZCBlbGVtZW50Ci0JICoKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBkb21haW4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbihFZGl0aW5nRG9tYWluIGRvbWFpbikgewotCQlzdXBlcihkb21haW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBjb25maXJtCi0JICogICAgICAgICAgICBmbGFnIGluZGljYXRlcyB3aGV0aGVyIHVzZXIgY29uZmlybWF0aW9uIGlzIHJlcXVpcmVkLiBJZgotCSAqICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBleGVjdXRpbmcgdGhpcyBjb21tYW5kIHdpbGwgbm90Ci0JICogICAgICAgICAgICBpbnRlcmFjdCB3aXRoIHVzZXIgYW5kIHRoZSBkZWZhdWx0IGJlaGF2aW9yIHdpbGwgYXBwbHkuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24oRWRpdGluZ0RvbWFpbiBkb21haW4sIGJvb2xlYW4gY29uZmlybSkgewotCQl0aGlzKGRvbWFpbik7Ci0JCXRoaXMuY29uZmlybSA9IGNvbmZpcm07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRGVsZXRlQWN0aW9uI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQotCQlEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCBjbWQgPSBjcmVhdGVNZXRob2RFbGVtZW50RGVsZXRlQ29tbWFuZCgpOwotCQljbWQKLQkJCQkuYWRkQ29tbWFuZExpc3RlbmVyKG5ldyBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5Db21tYW5kTGlzdGVuZXIoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgbm90aWZ5RXhlY3V0ZWQoRXZlbnRPYmplY3QgZXZlbnRPYmplY3QpIHsKLQkJCQkJCURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGNtZCA9IChEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCkgZXZlbnRPYmplY3QKLQkJCQkJCQkJLmdldFNvdXJjZSgpOwotCQkJCQkJZGlkRGVsZXRlKGNtZC5nZXRSZXN1bHQoKSk7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgdm9pZCBub3RpZnlGYWlsdXJlKEV2ZW50T2JqZWN0IGV2ZW50T2JqZWN0KSB7Ci0JCQkJCQlkZWxldGVGYWlsZWQoKTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlRmFpbGVkKCkgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGNvbW1hbmQgdG8gZGVsZXRlIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBjb21tYW5kCi0JICovCi0JcHVibGljIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGNyZWF0ZU1ldGhvZEVsZW1lbnREZWxldGVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKHN1cGVyLmNyZWF0ZUNvbW1hbmQoc2VsZWN0aW9uKSwKLQkJCQlzZWxlY3Rpb24sIGNvbmZpcm0pIHsKLQkJCXByb3RlY3RlZCB2b2lkIGxvYWRPcHBvc2l0ZUZlYXR1cmVzKExpc3Qgb3Bwb3NpdGVGZWF0dXJlcywKLQkJCQkJU2V0IGRlbGV0ZWRHVUlEcykgewotCQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoSUxpYnJhcnlSZXNvdXJjZVNldCkgTGlicmFyeVNlcnZpY2UKLQkJCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkuZVJlc291cmNlKCkKLQkJCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCXJlc291cmNlU2V0Ci0JCQkJCQkubG9hZE9wcG9zaXRlRmVhdHVyZXMob3Bwb3NpdGVGZWF0dXJlcywgZGVsZXRlZEdVSURzKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaWREZWxldGUoQ29sbGVjdGlvbjw/PiBkZWxldGVkRWxlbWVudHMpIHsKLQotCX0KLQotCS8qKgotCSAqIEdldCBjb25maXJtYXRpb24gbWVzc2FnZSB0byBkZWxldGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWxldGVDb25maXJtYXRpb25NZXNzYWdlKCkgewotCQlyZXR1cm4gTGlicmFyeVVJUmVzb3VyY2VzLk1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb25fZGVsZXRlY29uZmlybV90ZXh0OyAKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25maXJtRGVsZXRlKCkgewotCQlpZiAoIWNvbmZpcm0pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaW50IGkgPSAwOwotCQlTdHJpbmdCdWZmZXIgZWxlbWVudFN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChpdC5uZXh0KCkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJZWxlbWVudFN0ci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxlbWVudFN0ci5hcHBlbmQoZ2V0RGlzcGxheVN0cmluZygoTWV0aG9kRWxlbWVudClvYmopKTsKLQotCQkJCWkrKzsKLQkJCX0KLQkJfQotCi0JCU9iamVjdFtdIGFyZ3MgPSB7IGVsZW1lbnRTdHIudG9TdHJpbmcoKSB9OwotCQlTdHJpbmcgbXNnID0gTGlicmFyeVVJUmVzb3VyY2VzLmJpbmQoTGlicmFyeVVJUmVzb3VyY2VzLmNvbmZpcm1EZWxldGVEaWFsb2dfbXNnLCBhcmdzKTsgLy8gTk9OLU5MUy0xJAotCi0JCVN0cmluZyB0aXRsZSA9IExpYnJhcnlVSVJlc291cmNlcy5jb25maXJtRGVsZXRlRGlhbG9nX3RpdGxlOyAKLQkJYm9vbGVhbiBkZWxldGVPayA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbih0aXRsZSwgbXNnKTsKLQkJcmV0dXJuIGRlbGV0ZU9rOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlzcGxheVN0cmluZyhNZXRob2RFbGVtZW50IGVsZW1lbnQpewotCQlyZXR1cm4gZWxlbWVudC5nZXROYW1lKCk7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLklMaWJyYXJ5QWN0aW9uI3NldFByb2dyZXNzTW9uaXRvcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXByb2dyZXNzTW9uaXRvciA9IG1vbml0b3I7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgcHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlpZihwcm9ncmVzc01vbml0b3IgPT0gbnVsbCkgewotCQkJcHJvZ3Jlc3NNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQlyZXR1cm4gcHJvZ3Jlc3NNb25pdG9yOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCXJ1bm5lci5zZXRQcm9ncmVzc01vbml0b3IoZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJcGVyZm9ybURlbGV0ZSgpOwotCQkJfQotCQkJCi0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBQZXJmb3JtcyBkZWxldGUKLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWxldGUoKSB7Ci0JCXN1cGVyLnJ1bigpOwkJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL09wZW5MaWJyYXJ5QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9PcGVuTGlicmFyeUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjE3NTU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL09wZW5MaWJyYXJ5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLk9wZW5MaWJyYXJ5V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogSW1wbGVtZW50cyB0aGUgT3BlbiBMaWJyYXJ5IGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTGlicmFyeUFjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjaW5pdAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjcnVuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWludCBkaXJ0eUNvdW50ID0gMDsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGxpc3QgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGxpc3RbaV0uaXNEaXJ0eSgpKSB7Ci0JCQkJZGlydHlDb3VudCsrOwotCQkJfQotCQl9Ci0KLQkJaWYgKGRpcnR5Q291bnQgPT0gMSkgewotCQkJYm9vbGVhbiByYyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5jbG9zZUFsbEVkaXRvcnModHJ1ZSk7Ci0JCQlpZiAoIXJjKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGVsc2UgaWYgKGRpcnR5Q291bnQgPiAxKSB7Ci0JCQlzd2l0Y2ggKExpYnJhcnlVSVV0aWwuZGlzcGxheVNhdmVEaXJ0eUVkaXRvcnNEaWFsb2coKSkgewotCQkJY2FzZSBTV1QuWUVTOgotCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCS5nZXRBY3RpdmVQYWdlKCkuY2xvc2VBbGxFZGl0b3JzKHRydWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1QuTk86Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5jbG9zZUFsbEVkaXRvcnMoZmFsc2UpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1QuQ0FOQ0VMOgotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCU9wZW5MaWJyYXJ5V2l6YXJkIHdpemFyZCA9IG5ldyBPcGVuTGlicmFyeVdpemFyZCgpOwotCQl3aXphcmQuaW5pdCh3aW5kb3cuZ2V0V29ya2JlbmNoKCksIG51bGwpOwotCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvUHJvY2Vzc0RlbGV0ZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvUHJvY2Vzc0RlbGV0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTcxODExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL1Byb2Nlc3NEZWxldGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5EZWxldGVSb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5EZWxldGVUYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5EZWxldGVUZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5EZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuRGVsZXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlByb2Nlc3NFbGVtZW50RGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5SZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLS8qKgotICogSW1wbGVtZW50cyB0aGUgZGVsZXRlIGFjdGlvbiBmb3IgdGhlIHByb2Nlc3MgZWxlbWVudHMuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0RlbGV0ZUFjdGlvbiBleHRlbmRzIE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24gewotCi0JcHJpdmF0ZSBib29sZWFuIGRlbGV0aW9uQ29uZmlybWVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIEhhc2hTZXQ8RGVzY3JpcHRvcj4gcmVtb3ZlZERlc2NyaXB0b3JzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBQcm9jZXNzRGVsZXRlQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UKLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogICAgICAgICAgICB0aGUgZWRpdGluZyBkb21haW4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0RlbGV0ZUFjdGlvbihFZGl0aW5nRG9tYWluIGRvbWFpbikgewotCQlzdXBlcihkb21haW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UKLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogICAgICAgICAgICB0aGUgZWRpdGluZyBkb21haW4KLQkgKiBAcGFyYW0gY29uZmlybQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGRpc3BsYXlzIGEgcHJvbXB0IHRvIGFzayBmb3IgdXNlcgotCSAqICAgICAgICAgICAgY29uZmlybWF0aW9uCi0JICovCi0JcHVibGljIFByb2Nlc3NEZWxldGVBY3Rpb24oRWRpdGluZ0RvbWFpbiBkb21haW4sIGJvb2xlYW4gY29uZmlybSkgewotCQlzdXBlcihkb21haW4sIGNvbmZpcm0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbiNjcmVhdGVNZXRob2RFbGVtZW50RGVsZXRlQ29tbWFuZCgpCi0JICovCi0JcHVibGljIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGNyZWF0ZU1ldGhvZEVsZW1lbnREZWxldGVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IFByb2Nlc3NFbGVtZW50RGVsZXRlQ29tbWFuZChSZW1vdmVDb21tYW5kLmNyZWF0ZShkb21haW4sCi0JCQkJc2VsZWN0aW9uKSwgc2VsZWN0aW9uLCBjb25maXJtKTsKLQl9Ci0KLQkvKioKLQkgKiBSdW5zIHRoZSBkZWxldGUgYWN0aW9uIGdpdmVuIHRoZSBhY3Rpb24gbWFuYWdlcgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb25NZ3IKLQkgKiAgICAgICAgICAgIHRoZSBhY3Rpb24gbWFuYWdlcgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJaWYgKGNvbmZpcm1EZWxldGUoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCS8vIHJlbW92ZSByZWZlcmVuY2VzCi0JCQkJcmVtb3ZlUmVmZXJlbmNlcyhhY3Rpb25NZ3IsIGl0b3IubmV4dCgpKTsKLQkJCX0KLQotCQkJLy8gZGVsZXRlIGVsZW1lbnQKLQkJCWRvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZUN1cnJlbnRFZGl0b3IoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uI2dldERlbGV0ZUNvbmZpcm1hdGlvbk1lc3NhZ2UoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVsZXRlQ29uZmlybWF0aW9uTWVzc2FnZSgpIHsKLQkJcmV0dXJuIExpYnJhcnlVSVJlc291cmNlcy5Qcm9jZXNzRGVsZXRlQWN0aW9uX2RlbGV0ZWNvZmlybV90ZXh0OyAKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQoQ29sbGVjdGlvbjxEZXNjcmlwdG9yPiBkZXNjcmlwdG9ycywgQ29sbGVjdGlvbjw/PiBkZWxldGVkRWxlbWVudHMpIHsKLQkJcmV0dXJuIG5ldyBEZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQoCi0JCQkJZGVzY3JpcHRvcnMsIGZhbHNlLCBkZWxldGVkRWxlbWVudHMpIHsKLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZGVsZXRlKExpc3QgZWxlbWVudHMpIHsKLQkJCQlyZXR1cm4gUHJvY2Vzc0RlbGV0ZUFjdGlvbi5kZWxldGUoZWxlbWVudHMpOwotCQkJfQotCi0JCQkvLyBwcm90ZWN0ZWQgdm9pZCBzZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlKExpc3QKLQkJCS8vIGRlc2NyaXB0b3JzVG9EZWxldGUpIHsKLQkJCS8vIFN0cmluZyBtc2cgPQotCQkJLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0RlbGV0ZUFjdGlvbl9zZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlOwotCQkJLy8gT2JqZWN0W10gZGVzY3JpcHRvcnMgPQotCQkJLy8gUmVmZXJlbmNlU2VsZWN0aW9uLmdldFJlZmVyZW5jZXMoZGVzY3JpcHRvcnNUb0RlbGV0ZSwKLQkJCS8vIG1zZyk7Ci0JCQkvLyBkZXNjcmlwdG9yc1RvRGVsZXRlLnJldGFpbkFsbChBcnJheXMuYXNMaXN0KGRlc2NyaXB0b3JzKSk7Ci0JCQkvLyB9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGNvbmZpcm1EZWxldGUoKSkgewotCQkJLy8gY29sbGVjdGlvbiB0aGUgcmVsYXRlZCBkZXNjcmlwdG9ycyBiZWZvcmUgdGhlIGVsZW1lbnRzIGdvdAotCQkJLy8gZGVsZXRlZAotCQkJLy8KLQkJCUNvbGxlY3Rpb248RGVzY3JpcHRvcj4gZGVzY3JpcHRvcnMgPSBuZXcgSGFzaFNldDxEZXNjcmlwdG9yPigpOwotCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJYWRkUmVsYXRlZERlc2NyaXB0b3JzKGRlc2NyaXB0b3JzLCBlbGVtZW50KTsKLQkJCX0KLQotCQkJQ29tbWFuZCBjbWQgPSBjb21tYW5kOwotCi0JCQkvLyBkZWxldGUgZWxlbWVudHMKLQkJCS8vCi0JCQljbWQuZXhlY3V0ZSgpOwotCi0JCQkvLyBDaGVjayByZWZlcmVuY2UgY29uZmlybWF0aW9uIGFuZCBpZiBjb25maXJtZWQgc2V0Ci0JCQkvLyBkZWxldGlvbmNvbmZpcm1lZCB0byB0cnVlCi0JCQkvLyBJZiBhbnkgZGVsZXRpb24gaGFwcGVucyBpbiBzZXF1ZW5jZSwgd2lsbCBjaGVjayBmb3IKLQkJCS8vIGRlbGV0aW9uY29uZmlybWVkIHZhcmlhYmxlCi0JCQkvLyBhbmQgcHJvY2VlZHMgcmVtYWluaW5nIGRlbGV0aW9uIHNlcXVlbmNlLiAoZWc6Ci0JCQkvLyBBYnN0cmFjdERpYWdyYW1FZGl0b3IgLSBEZWxldGVBY3Rpb24oKSkuCi0JCQlpZiAoKChEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCkgY21kKS5leGVjdXRlZCkgewotCQkJCWRlbGV0aW9uQ29uZmlybWVkID0gdHJ1ZTsKLQotCQkJCUNvbGxlY3Rpb248Pz4gZGVsZXRlZEVsZW1lbnRzID0gY21kLmdldFJlc3VsdCgpOwotCQkJCUNvbW1hbmQgZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kID0gY3JlYXRlRGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kKGRlc2NyaXB0b3JzLCBkZWxldGVkRWxlbWVudHMpOwotCQkJCXRyeSB7Ci0JCQkJCWRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5leGVjdXRlKCk7Ci0JCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCQkvLwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBzYXZlIHRoZSBjdXJyZW50IGVkaXRvcgotCQkJLy8KLQkJCXNhdmVDdXJyZW50RWRpdG9yKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFJlbGF0ZWREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248RGVzY3JpcHRvcj4gZGVzY3JpcHRvcnMsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJZGVzY3JpcHRvcnMuYWRkQWxsKHRhc2tEZXNjLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpOwotCQkJZGVzY3JpcHRvcnMuYWRkQWxsKHRhc2tEZXNjLmdldEFzc2lzdGVkQnkoKSk7Ci0JCQlkZXNjcmlwdG9ycy5hZGRBbGwodGFza0Rlc2MuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSk7Ci0JCQlkZXNjcmlwdG9ycy5hZGRBbGwodGFza0Rlc2MuZ2V0TWFuZGF0b3J5SW5wdXQoKSk7Ci0JCQlkZXNjcmlwdG9ycy5hZGRBbGwodGFza0Rlc2MuZ2V0RXh0ZXJuYWxJbnB1dCgpKTsKLQkJCWRlc2NyaXB0b3JzLmFkZEFsbCh0YXNrRGVzYy5nZXRPcHRpb25hbElucHV0KCkpOwotCQkJZGVzY3JpcHRvcnMuYWRkQWxsKHRhc2tEZXNjLmdldE91dHB1dCgpKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJZGVzY3JpcHRvcnMuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCS5nZXRBc3Npc3RlZFRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYykpOwotCQkJZGVzY3JpcHRvcnMuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCS5nZXRBZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKSk7Ci0JCQlkZXNjcmlwdG9ycy5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpKTsKLQkJCWRlc2NyaXB0b3JzLmFkZEFsbChyb2xlRGVzYy5nZXRSZXNwb25zaWJsZUZvcigpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVSZWZlcmVuY2VzKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgT2JqZWN0IG9iaikgewotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY21kID0gbnVsbDsKLQkJYm9vbGVhbiBmb3JjZSA9ICFjb25maXJtOwotCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCWNtZCA9IG5ldyBEZWxldGVUYXNrRGVzY3JpcHRvcigoVGFza0Rlc2NyaXB0b3IpIG9iaiwgZm9yY2UpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQljbWQgPSBuZXcgRGVsZXRlUm9sZURlc2NyaXB0b3IoKFJvbGVEZXNjcmlwdG9yKSBvYmosIGZvcmNlKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCWNtZCA9IG5ldyBEZWxldGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqLAotCQkJCQlmb3JjZSk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCWNtZCA9IG5ldyBEZWxldGVUZWFtUHJvZmlsZSgoVGVhbVByb2ZpbGUpIG9iaik7Ci0JCX0KLQkJaWYgKGNtZCAhPSBudWxsKSB7Ci0JCQlpZiAoYWN0aW9uTWdyICE9IG51bGwpIHsKLQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCi0JCQl9IGVsc2UgewotCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQl9Ci0JCQlpZiAoY21kIGluc3RhbmNlb2YgUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kKSB7Ci0JCQkJcmVtb3ZlZERlc2NyaXB0b3JzCi0JCQkJCQkuYWRkQWxsKCgoUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kKSBjbWQpCi0JCQkJCQkJCS5nZXRSZW1vdmVkRGVzY3JpcHRvcnMoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciN1cGRhdGVTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWJvb2xlYW4gcmV0ID0gc3VwZXIudXBkYXRlU2VsZWN0aW9uKGZpbHRlclNlbGVjdGlvbihzZWxlY3Rpb24pKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBGaWx0ZXJzIHNlbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHJldHVybiBOZXcgU2VsZWN0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBmaWx0ZXJTZWxlY3Rpb24oCi0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQXJyYXlMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCQkmJiAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50KQotCQkJCQkJCS5pc1JlYWRPbmx5KCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJbGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obGlzdCk7Ci0JfQotCi0JLyoqCi0JICogSWYgZGVsZXRpb24gY29uZmlybWVkLCBzZXQgY29uZmlybWF0aW9uIGFuZCBjaGlsZCBwcm9jZXNzIGNhbiB1c2UgdGhlCi0JICogY29uZmlybWF0aW9uIHRvIHByb2NlZWQgZm9yIHRoZSBkZWxldGlvbiBvZiByZW1haW5pbmcuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWxldGlvbkNvbmZpcm1lZCgpIHsKLQkJcmV0dXJuIGRlbGV0aW9uQ29uZmlybWVkOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBjb21tYW5kCi0JICogCi0JICogQHJldHVybiBjbWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb21tYW5kKCkgewotCQlyZXR1cm4gY29tbWFuZDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZGVsZXRlIHByb2Nlc3MgZWxlbWVudHMgd2l0aG91dCBVSSBhY3Rpb24KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiBAcmV0dXJuIHRoZSBleGVjdXRlZCBkZWxldGUgY29tbWFuZCBpZiBzb21lIG9mIHRoZSBnaXZlbiBlbGVtZW50cyBoYXZlCi0JICogICAgICAgICBiZWVuIHN1Y2Nlc3NmdWxseSBkZWxldGVkLCA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdXNlciBjYW5jZWxlZCB0aGlzIGRlbGV0aW9uIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tbWFuZCBkZWxldGUoQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQlQcm9jZXNzRGVsZXRlQWN0aW9uIGRlbGV0ZUFjdGlvbiA9IG5ldyBQcm9jZXNzRGVsZXRlQWN0aW9uKG51bGwsIGZhbHNlKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JCQkgKi8KLQkJCXB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQlkb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQluZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0KLQkJCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ29tbWFuZChzZWxlY3Rpb24pOwotCQkJfQotCi0JCX07Ci0JCWlmIChkZWxldGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBBcnJheUxpc3QoCi0JCQkJZWxlbWVudHMpKSkpIHsKLQkJCWRlbGV0ZUFjdGlvbi5ydW4oKTsKLQkJCWlmICghZGVsZXRlQWN0aW9uLmlzRGVsZXRpb25Db25maXJtZWQoKSkgewotCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJfQotCQkJcmV0dXJuIGRlbGV0ZUFjdGlvbi5nZXRDb21tYW5kKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTU0YzlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGFjdGlvbnMgZm9yIG1hbmFnaW5nIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvQmFzZURpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvQmFzZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmRjZDc4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0Jhc2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5UaXRsZUFyZWFEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgTGlicmFyeSBVSSBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJhc2VEaWFsb2cgZXh0ZW5kcyBUaXRsZUFyZWFEaWFsb2cgewotCi0JLyoqCi0JICogVGhlIE9LIGJ1dHRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCi0JLyoqCi0JICogVGhlIENhbmNlbCBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjYW5jZWxCdXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBwYXJlbnQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRyb2wuCi0JICovCi0JcHVibGljIEJhc2VEaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGlhbG9nIGJ1dHRvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgT0sgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCi0JCS8vIENyZWF0ZSB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgT0sgYnV0dG9uLgotCQlva0J1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY2FuY2VsQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0NvbnZlcnRBY3Rpdml0eURpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvQ29udmVydEFjdGl2aXR5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMzRmMDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvQ29udmVydEFjdGl2aXR5RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS51dGlsLlR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Db252ZXJ0QWN0aXZpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0RGlhbG9nOwotCi0vKioKLSAqIERpYWxvZyB0byBjb252ZXJ0IGFjdGl2aXR5IHR5cGUgCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udmVydEFjdGl2aXR5RGlhbG9nIHsKLQotCS8qKgotCSAqIFF1ZXJ5IHVzZXIgYW5kIGNvbnZlcnQgdGhlIG9sZCBhY3Rpdml0eSBpbnRvIG5ldyBvbmUKLQkgKiAKLQkgKiBAcGFyYW0gb2xkQWN0aXZpdHkKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqIAotCSAqIEByZXR1cm4gTmV3bHkgY29udmVydGVkIGFjdGl2aXR5Ci0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eSBxdWVyeVVzZXJBbmRDb252ZXJ0KEFjdGl2aXR5IG9sZEFjdGl2aXR5LCBTaGVsbCBzaGVsbCwKLQkJCURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJCi0JCWlmIChzaGVsbCA9PSBudWxsKQotCQkJc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQlMaXN0RGlhbG9nIGRsZyA9IG5ldyBMaXN0RGlhbG9nKHNoZWxsKTsKLQkJZGxnLnNldEhlaWdodEluQ2hhcnMoNSk7Ci0JCWRsZy5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQlkbGcuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCXN3aXRjaCAoKChJbnRlZ2VyKSBlbGVtZW50KS5pbnRWYWx1ZSgpKSB7Ci0JCQkJLy8gVE9ETzogcmVmYWN0b3IgdGhlc2Ugc3RyaW5ncyAoYW5kIHRoaXMgd2hvbGUgZGlhbG9nKSBpbnRvCi0JCQkJLy8gbGlicmFyeS51aQotCQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWToKLQkJCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9BQ1RJVklUWTsKLQkJCQljYXNlIFVtYVBhY2thZ2UuSVRFUkFUSU9OOgotCQkJCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX0lURVJBVElPTjsKLQkJCQljYXNlIFVtYVBhY2thZ2UuUEhBU0U6Ci0JCQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfUEhBU0U7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMudW5rbm93bkd1aWRhbmNlX3RleHQ7IAotCQkJCX0KLQotCQkJfQotCQl9KTsKLQkJTGlzdCBuZXdBY3Rpdml0eVR5cGVMaXN0ID0gZ2V0VmFsaWROZXdBY3Rpdml0eVR5cGVzKG9sZEFjdGl2aXR5KTsKLQkJaWYgKG5ld0FjdGl2aXR5VHlwZUxpc3QgPT0gbnVsbCkgewotCQkJTGlicmFyeVVJUGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJTGlicmFyeVJlc291cmNlcy5jb252ZXJ0QWN0aXZpdHlFcnJvcl90aXRsZSwgCi0JCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX21zZywKLQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuYmluZChMaWJyYXJ5VUlSZXNvdXJjZXMudW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfcmVhc29uLCBTdHJVdGlsLnRvTG93ZXIoVG5nVXRpbC5nZXRUeXBlVGV4dChvbGRBY3Rpdml0eSkpKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlkbGcuc2V0SW5wdXQobmV3QWN0aXZpdHlUeXBlTGlzdCk7Ci0JCWRsZy5zZXRUaXRsZShMaWJyYXJ5VUlSZXNvdXJjZXMuY29udmVydEFjdGl2aXR5RGlhbG9nX3RpdGxlKTsKLQkJZGxnLnNldE1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLmNvbnZlcnRBY3Rpdml0eURpYWxvZ190ZXh0KTsKLQkJaWYgKGRsZy5vcGVuKCkgPT0gRGlhbG9nLkNBTkNFTCkKLQkJCXJldHVybiBudWxsOwotCi0JCU9iamVjdFtdIHNlbGVjdGlvblJlc3VsdCA9IGRsZy5nZXRSZXN1bHQoKTsKLQkJaWYgKHNlbGVjdGlvblJlc3VsdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBjaG9zZW5BY3Rpdml0eSA9ICgoSW50ZWdlcikgc2VsZWN0aW9uUmVzdWx0WzBdKS5pbnRWYWx1ZSgpOwotCQkKLS8vCQlyZXR1cm4gQ29udmVydEFjdGl2aXR5VHlwZS5jb252ZXJ0QWN0aXZpdHkob2xkQWN0aXZpdHksIGNob3NlbkFjdGl2aXR5LCBjb21tYW5kKTsKLQkJCi0JCXJldHVybiBUeXBlQ29udmVydGVyLmNvbnZlcnRBY3Rpdml0eShvbGRBY3Rpdml0eSwgVHlwZUNvbnZlcnRlci5nZXRBY3Rpdml0eVR5cGUoY2hvc2VuQWN0aXZpdHkpKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBsaXN0IG9mIHZhbGlkIG5ldyBhY3Rpdml0eSB0eXBlcyBiYXNlZCBvbiBvbGQgYWN0aXZpdHkgdHlwZQotCSAqIAotCSAqIEBwYXJhbSBvbGRBY3Rpdml0eQotCSAqIAotCSAqIEByZXR1cm4gbGlzdCBvZiB2YWxpZCBhY3Rpdml0eSB0eXBlcwotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRWYWxpZE5ld0FjdGl2aXR5VHlwZXMoQWN0aXZpdHkgb2xkQWN0aXZpdHkpIHsKLQkJaWYgKG9sZEFjdGl2aXR5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSW50ZWdlciBvbGRBY3Rpdml0eUNsYXNzSUQgPSBuZXcgSW50ZWdlcihvbGRBY3Rpdml0eS5lQ2xhc3MoKQotCQkJCS5nZXRDbGFzc2lmaWVySUQoKSk7Ci0JCWlmICghQ29udmVydEFjdGl2aXR5VHlwZS5jb21wYXRpYmxlQWN0aXZpdGllc0xpc3QuY29udGFpbnMob2xkQWN0aXZpdHlDbGFzc0lEKSkKLQkJCXJldHVybiBudWxsOwotCQlMaXN0IGFjdGl2aXR5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gQ29udmVydEFjdGl2aXR5VHlwZS5jb21wYXRpYmxlQWN0aXZpdGllc0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJbnRlZ2VyIGNvbXBhdGlibGVBY3Rpdml0eVR5cGVDbGFzc0lEID0gKEludGVnZXIpaXRlci5uZXh0KCk7Ci0JCQlpZiAoIW9sZEFjdGl2aXR5Q2xhc3NJRC5lcXVhbHMoY29tcGF0aWJsZUFjdGl2aXR5VHlwZUNsYXNzSUQpICYmCi0JCQkJCWNvbXBhdGlibGVBY3Rpdml0eVR5cGVDbGFzc0lELmludFZhbHVlKCkgIT0gVW1hUGFja2FnZS5DQVBBQklMSVRZX1BBVFRFUk4gJiYKLQkJCQkJY29tcGF0aWJsZUFjdGl2aXR5VHlwZUNsYXNzSUQuaW50VmFsdWUoKSAhPSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1MpCi0JCQkJYWN0aXZpdHlMaXN0LmFkZChjb21wYXRpYmxlQWN0aXZpdHlUeXBlQ2xhc3NJRCk7Ci0JCX0KLQkJcmV0dXJuIGFjdGl2aXR5TGlzdDsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0NvcHlMaWJyYXJ5RGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9Db3B5TGlicmFyeURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjk0MThlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0NvcHlMaWJyYXJ5RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIERpYWxvZyB0byBwcm9tcHQgdGhlIHVzZXIgdG8gY29weSBhIGxpYnJhcnkgdG8gYW5vdGhlciBsb2NhdGlvbgotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29weUxpYnJhcnlEaWFsb2cgZXh0ZW5kcyBQYXRoU2VsZWN0aW9uRGlhbG9nIHsKLQkKLQlwdWJsaWMgQ29weUxpYnJhcnlEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwKLQkJCVN0cmluZyBkaWFsb2dNZXNzYWdlLCBTdHJpbmcgZGVmYXVsdFBhdGgpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBkaWFsb2dNZXNzYWdlLCBkZWZhdWx0UGF0aCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlQnV0dG9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBpZCwgU3RyaW5nIGxhYmVsLAotCQkJYm9vbGVhbiBkZWZhdWx0QnV0dG9uKSB7Ci0JCUJ1dHRvbiBiID0gc3VwZXIuY3JlYXRlQnV0dG9uKHBhcmVudCwgaWQsIGxhYmVsLCBkZWZhdWx0QnV0dG9uKTsKLQkJaWYgKGlkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCWIuc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMuY29weUxpYnJhcnlEaWFsb2dfY29weUJ1dHRvbl90ZXh0KTsKLQotCQl9IGVsc2UgaWYgKGlkID09IElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKSB7Ci0JCQliLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLnNraXBCdXR0b25fdGV4dCk7Ci0JCX0KLQotCQlyZXR1cm4gYjsKLQl9Ci0JCi0JCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0xpYnJhcnlCYWNrdXBEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0xpYnJhcnlCYWNrdXBEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWViNWJiZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9MaWJyYXJ5QmFja3VwRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gYmFjayB1cCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeUJhY2t1cERpYWxvZyBleHRlbmRzIFBhdGhTZWxlY3Rpb25EaWFsb2cgewotCi0JcHVibGljIExpYnJhcnlCYWNrdXBEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwKLQkJCVN0cmluZyBkaWFsb2dNZXNzYWdlLCBTdHJpbmcgZGVmYXVsdFBhdGgpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBkaWFsb2dNZXNzYWdlLCBkZWZhdWx0UGF0aCk7Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVCdXR0b24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBpbnQsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgaW50IGlkLCBTdHJpbmcgbGFiZWwsCi0JCQlib29sZWFuIGRlZmF1bHRCdXR0b24pIHsKLQkJQnV0dG9uIGIgPSBzdXBlci5jcmVhdGVCdXR0b24ocGFyZW50LCBpZCwgbGFiZWwsIGRlZmF1bHRCdXR0b24pOwotCQlpZiAoaWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJYi5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5va0J1dHRvbl90ZXh0KTsKLQotCQl9IGVsc2UgaWYgKGlkID09IElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKSB7Ci0JCQliLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLnNraXBCdXR0b25fdGV4dCk7Ci0JCX0KLQotCQlyZXR1cm4gYjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9QYXRoU2VsZWN0aW9uRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9QYXRoU2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxY2FlMmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvUGF0aFNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5EaXJlY3RvcnlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogCi0gKiBVdGlsaXR5IGNsYXNzIHRvIHNlbGVjdCBhIHBhdGgKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUGF0aFNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjdHJsX3BhdGg7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfYnJvd3NlX2J1dHRvbjsKLQotCXByb3RlY3RlZCBTdHJpbmcgdGl0bGU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2U7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlOwotCi0JcHVibGljIFBhdGhTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwKLQkJCVN0cmluZyBkaWFsb2dNZXNzYWdlLCBTdHJpbmcgZGVmYXVsdFBhdGgpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCi0JCXRpdGxlID0gZGlhbG9nVGl0bGU7Ci0JCW1lc3NhZ2UgPSBkaWFsb2dNZXNzYWdlOwotCQl2YWx1ZSA9IGRlZmF1bHRQYXRoOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjYnV0dG9uUHJlc3NlZChpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCXZhbHVlID0gY3RybF9wYXRoLmdldFRleHQoKTsKLQotCQkJLy8gbWFrZSBzdXJlIHRoZSBwYXRoIGlzIHZhbGlkCi0JCQlTdHJpbmcgbXNnID0gTGlicmFyeVVJUmVzb3VyY2VzLnBhdGhTZWxlY3Rpb25FcnJvcl9tc2c7Ci0JCQlpZiAoRGlyZWN0b3J5VmFsaWRhdG9yLmNoZWNrQW5kQ3JlYXRlRGlyKHZhbHVlLCB0aXRsZSwgbXNnKSA9PSBmYWxzZSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXZhbHVlID0gbnVsbDsKLQkJfQotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlpZiAodGl0bGUgIT0gbnVsbCkKLQkJCXNoZWxsLnNldFRleHQodGl0bGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBPSyBhbmQgQ2FuY2VsIGJ1dHRvbnMgYnkgZGVmYXVsdAotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0KLQkJLy8gZG8gdGhpcyBoZXJlIGJlY2F1c2Ugc2V0dGluZyB0aGUgdGV4dCB3aWxsIHNldCBlbmFibGVtZW50IG9uIHRoZSBvawotCQkvLyBidXR0b24KLQkJY3RybF9wYXRoLnNldEZvY3VzKCk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQljdHJsX3BhdGguc2V0VGV4dCh2YWx1ZSk7Ci0JCQljdHJsX3BhdGguc2VsZWN0QWxsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgY29tcG9zaXRlCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCS8vIGNyZWF0ZSBtZXNzYWdlCi0JCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQkJbGFiZWwuc2V0VGV4dChtZXNzYWdlKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotCQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuTUlOSU1VTV9NRVNTQUdFX0FSRUFfV0lEVEgpOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWxhYmVsLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCX0KLQkJY3RybF9wYXRoID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWN0cmxfcGF0aC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCWN0cmxfYnJvd3NlX2J1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWN0cmxfYnJvd3NlX2J1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgKLQkJCQlHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCkpOwotCQljdHJsX2Jyb3dzZV9idXR0b24uc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMuYnJvd3NlQnV0dG9uX3RleHQpOwotCQljdHJsX2Jyb3dzZV9idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3BlbkRpcmVjdG9yeURpYWxvZygpOwotCQkJfQotCQl9KTsKLQotCQlhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGRpcmVjdG9yeSBkaWFsb2cKLQkgKgotCSAqLwotCXByaXZhdGUgdm9pZCBvcGVuRGlyZWN0b3J5RGlhbG9nKCkgewotCQl0cnkgewotCQkJLy8gVGV4dCBjdHJsX3BhdGggPSBzdXBlci5nZXRUZXh0KCk7Ci0JCQlEaXJlY3RvcnlEaWFsb2cgZGQgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHRoaXMuZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQkJZGQuc2V0RmlsdGVyUGF0aChjdHJsX3BhdGguZ2V0VGV4dCgpKTsKLQotCQkJU3RyaW5nIGRlc3RpbmF0aW9uID0gZGQub3BlbigpOwotCQkJaWYgKGRlc3RpbmF0aW9uICE9IG51bGwpIHsKLQkJCQljdHJsX3BhdGguc2V0VGV4dChkZXN0aW5hdGlvbik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRoCi0JICogQHJldHVybiBwYXRoCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvU2VsZWN0TGlicmFyeURpcmVjdG9yeURpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvU2VsZWN0TGlicmFyeURpcmVjdG9yeURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGNhN2ZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1NlbGVjdExpYnJhcnlEaXJlY3RvcnlEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogUHJvbXBzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIG1ldGhvZCBsaWJyYXJ5IGZvbGRlci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RMaWJyYXJ5RGlyZWN0b3J5RGlhbG9nIHsKLQotCXByaXZhdGUgRGlyZWN0b3J5RGlhbG9nIGRpYWxvZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBzaGVsbC4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0TGlicmFyeURpcmVjdG9yeURpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJdGhpcyhwYXJlbnQsIFNXVC5OT05FKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgc2hlbGwuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgZGlhbG9nIHN0eWxlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RMaWJyYXJ5RGlyZWN0b3J5RGlhbG9nKFNoZWxsIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCWRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2cocGFyZW50LCBzdHlsZSk7Ci0JCWRpYWxvZy5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RpdGxlKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLnNlbGVjdExpYnJhcnlGb2xkZXJEaWFsb2dfdGV4dCk7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKExpYnJhcnlVSVByZWZlcmVuY2VzLmdldERlZmF1bHRMaWJyYXJ5UGF0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaWx0ZXIgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgVGhlIGZpbHRlciBwYXRoLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlclBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJZGlhbG9nLnNldEZpbHRlclBhdGgocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogTWFrZXMgdGhlIGRpYWxvZyB2aXNpYmxlIGFuZCBicmluZ3MgaXQgdG8gdGhlIGZyb250IG9mIHRoZSBkaXNwbGF5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgb3BlbigpIHsKLQkJcmV0dXJuIGRpYWxvZy5vcGVuKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9VbmNhbmNlbGFibGVMaXN0U2VsZWN0aW9uRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9VbmNhbmNlbGFibGVMaXN0U2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZjNhYzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvVW5jYW5jZWxhYmxlTGlzdFNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiBUaGlzIGRpYWxvZyBleHRlbmRzIGpmYWNlIExpc3RTZWxlY3Rpb25EaWFsb2cgYW5kIHJlbW92ZXMgY2FuY2VsIGJ1dHRvbgotICAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmNhbmNlbGFibGVMaXN0U2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgTGlzdFNlbGVjdGlvbkRpYWxvZyB7Ci0KLQlwdWJsaWMgVW5jYW5jZWxhYmxlTGlzdFNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgT2JqZWN0IGlucHV0LAotICAgICAgICAgICAgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyLAotICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwgU3RyaW5nIG1lc3NhZ2UpCi0JewotCQlzdXBlcihwYXJlbnRTaGVsbCwgaW5wdXQsIGNvbnRlbnRQcm92aWRlciwgbGFiZWxQcm92aWRlciwgbWVzc2FnZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1VzZXJJbnB1dHNEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1VzZXJJbnB1dHNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIwZjY1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9Vc2VySW5wdXRzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Vc2VySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJvdmlkZXJzLkRlbGVnYXRlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBUaGlzIGRpYWxvZyBhY3RzIGFzIGEgaW5wdXQgZGlhbG9nIGR1cmluZyBjb21tYW5kIGV4ZWN1dGlvbiBiYXNlZCBvbiB1c2VyCi0gKiBpbnB1dCBhbmQgaW5wdXRUeXBlIGRpYWxvZyBiZWhhdmlvdXIgY2hhbmdlcy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VySW5wdXRzRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLQotCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0KLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotCXByaXZhdGUgU3RyaW5nIGdsb2JhbEVycm9yVHh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotCi0JcHJpdmF0ZSBMaXN0IHVzZXJJbnB1dHM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQlMYWJlbCBtZXNzYWdlQXJlYTsKLQotCUxhYmVsIGVycm9yQXJlYTsKLQotCUhhc2hNYXA8T2JqZWN0LE9iamVjdD4gb2xkSW5mb0ZvckNhbmNlbDsKLQkKLQlwcml2YXRlIENvbG9yIHJlZENvbG9yOwotCQotCXB1YmxpYyBVc2VySW5wdXRzRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBMaXN0IHVzZXJJbnB1dHMsIFN0cmluZyB0aXRsZSwKLQkJCVN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotCQl0aGlzLnVzZXJJbnB1dHMgPSB1c2VySW5wdXRzOwotCQlvbGRJbmZvRm9yQ2FuY2VsID0gbmV3IEhhc2hNYXA8T2JqZWN0LE9iamVjdD4oKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgVHJlZSBWaWV3ZXIuCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBVc2VySW5wdXQgdXNlcklucHV0KSB7Ci0JCVRyZWVWaWV3ZXIgdmlld2VyOwotCQlpZiAoIXVzZXJJbnB1dC5pc011bHRpcGxlKCkpIHsKLQkJCXZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTAotCQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl9IGVsc2UgewotCQkJdmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwKLQkJCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJfQotCi0JCUdyaWREYXRhIHNwZWMgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJewotCQkJc3BlYy53aWR0aEhpbnQgPSAyMDA7Ci0JCQlzcGVjLmhlaWdodEhpbnQgPSAyMDA7Ci0JCQlzcGVjLmhvcml6b250YWxTcGFuID0gMzsKLQkJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShzcGVjKTsKLQkJfQotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQotCQkJfQotCi0JCX0pOwotCi0JCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCQl9IGVsc2UgewotCQkJCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQkJfQotCQkJdmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0KLQkJCXZpZXdlci5zZXRJbnB1dCh1c2VySW5wdXQuZ2V0Q2hvaWNlcygpKTsKLQkJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJCS8vIFRPRE86IHRyZWVWaWV3ZXIgU29ydGVyIGFuZCBFeHBhbmQvQ29sbGFwc2UKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBUYWJsZVZpZXdlcgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIFVzZXJJbnB1dCB1c2VySW5wdXQpIHsKLQkJVGFibGVWaWV3ZXIgdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCk7Ci0JCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBUZXh0IGNvbnRyb2wKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHVzZXJJbnB1dAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgVXNlcklucHV0IHVzZXJJbnB1dCkgewotCQlmaW5hbCBVc2VySW5wdXQgbG9jYWxpbnB1dCA9IHVzZXJJbnB1dDsKLQkJZmluYWwgSVZhbGlkYXRvciB2YWxpZGF0b3IgPSB1c2VySW5wdXQuZ2V0VmFsaWRhdG9yKCk7Ci0JCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlpZiAodXNlcklucHV0LmdldElucHV0KCkgIT0gbnVsbCkgewotCQkJdGV4dC5zZXRUZXh0KChTdHJpbmcpIHVzZXJJbnB1dC5nZXRJbnB1dCgpKTsKLQkJfQotCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQllcnJvckFyZWEuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgZXJyb3JUeHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotCQkJCQllcnJvclR4dCA9IHZhbGlkYXRvci5pc1ZhbGlkKHRleHQuZ2V0VGV4dCgpKTsKLQkJCQkJaWYgKGVycm9yVHh0ICE9IG51bGwgJiYgZXJyb3JUeHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQllcnJvckFyZWEuc2V0VGV4dChlcnJvclR4dCk7Ci0JCQkJCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoZmFsc2UpOwkJCQkJCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllcnJvckFyZWEuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlnbG9iYWxFcnJvclR4dCA9IGVycm9yVHh0OwotCQkJCX0KLQkJCQlpZiAoZXJyb3JUeHQgPT0gbnVsbCB8fCBlcnJvclR4dC5sZW5ndGgoKSA8PSAwKSB7Ci0JCQkJCWxvY2FsaW5wdXQuc2V0SW5wdXQodGV4dC5nZXRUZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJdGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIGVycm9yVHh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAodmFsaWRhdG9yICE9IG51bGwpIHsKLQkJCQkJZXJyb3JUeHQgPSB2YWxpZGF0b3IuaXNWYWxpZCh0ZXh0LmdldFRleHQoKSk7Ci0JCQkJCWlmIChlcnJvclR4dCAhPSBudWxsICYmIGVycm9yVHh0Lmxlbmd0aCgpID4gMCkgewotCQkJCQkJZXJyb3JBcmVhLnNldFRleHQoZXJyb3JUeHQpOwotCQkJCQkJZ2V0QnV0dG9uKE9LKS5zZXRFbmFibGVkKGZhbHNlKTsJCQkJCQotCQkJCQl9IGVsc2UgewotCQkJCQkJZXJyb3JBcmVhLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZ2xvYmFsRXJyb3JUeHQgPSBlcnJvclR4dDsKLQkJCQl9Ci0JCQkJaWYgKGVycm9yVHh0ID09IG51bGwgfHwgZXJyb3JUeHQubGVuZ3RoKCkgPD0gMCkgewotCQkJCQlsb2NhbGlucHV0LnNldElucHV0KHRleHQuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0byBzZXRJbnB1dCwgc3ViY2xhc3MgY2FuIG92ZXJyaWRlIGl0LgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldElucHV0KFVzZXJJbnB1dCBpbnB1dCwgT2JqZWN0IG9iaikgewotCQlpbnB1dC5zZXRJbnB1dChvYmopOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBDb21ib3ZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogQHBhcmFtIHVzZXJJbnB1dAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbWJvVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUsIFVzZXJJbnB1dCB1c2VySW5wdXQpIHsKLQkJZmluYWwgVXNlcklucHV0IGxvY2FsSW5wdXQgPSB1c2VySW5wdXQ7Ci0JCWZpbmFsIElWYWxpZGF0b3IgdmFsaWRhdG9yID0gdXNlcklucHV0LmdldFZhbGlkYXRvcigpOwotCQlmaW5hbCBDb21ib1ZpZXdlciB2aWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIoY29tcG9zaXRlKTsKLQkJdmlld2VyLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YSgKLQkJCQluZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQlpZiAodXNlcklucHV0LmdldExhYmVsUHJvdmlkZXIoKSAhPSBudWxsKSB7Ci0JCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgRGVsZWdhdGVMYWJlbFByb3ZpZGVyKHVzZXJJbnB1dC5nZXRMYWJlbFByb3ZpZGVyKCkpKTsKLQkJfQotCQlMaXN0IGNob2ljZXMgPSB1c2VySW5wdXQuZ2V0Q2hvaWNlcygpOwotCQl2aWV3ZXIuc2V0SW5wdXQoY2hvaWNlcyk7Ci0JCWlmIChjaG9pY2VzICE9IG51bGwgJiYgY2hvaWNlcy5zaXplKCkgPiAwKSB7Ci0JCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNob2ljZXMuZ2V0KDApKSk7Ci0JCQlsb2NhbElucHV0LnNldElucHV0KGNob2ljZXMuZ2V0KDApKTsKLQkJfQotCQl2aWV3ZXIuZ2V0Q29tYm8oKS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIGVycm9yVHh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3RlZCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHZhbGlkYXRvciA9PSBudWxsIHx8IHNlbGVjdGVkID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci5pc1ZhbGlkKHNlbGVjdGVkLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCQllcnJvclR4dCA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCQkJfQotCQkJCWlmIChlcnJvclR4dCAhPSBudWxsICYmIGVycm9yVHh0Lmxlbmd0aCgpID4gMCkgewotCQkJCQllcnJvckFyZWEuc2V0VGV4dChlcnJvclR4dCk7Ci0JCQkJCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfSBpZiAoZ2xvYmFsRXJyb3JUeHQgIT0gbnVsbCAmJiBnbG9iYWxFcnJvclR4dC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJZXJyb3JBcmVhLnNldFRleHQoZ2xvYmFsRXJyb3JUeHQpOwotCQkJCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCWVycm9yQXJlYS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9KTsKLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZXJyb3JBcmVhLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJT2JqZWN0IG9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgZXJyb3JUeHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci5pc1ZhbGlkKG9iaik7Ci0JCQkJCWlmIChzdGF0dXMuZ2V0Q29kZSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCQkJCWVycm9yVHh0ID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJCQkJfQotCQkJCQlpZiAoZXJyb3JUeHQgIT0gbnVsbCAmJiBlcnJvclR4dC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCWVycm9yQXJlYS5zZXRUZXh0KGVycm9yVHh0KTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChnbG9iYWxFcnJvclR4dCAhPSBudWxsICYmIGdsb2JhbEVycm9yVHh0Lmxlbmd0aCgpID4gMCkgewotCQkJCQkJZXJyb3JBcmVhLnNldFRleHQoZ2xvYmFsRXJyb3JUeHQpOwotCQkJCQkJZ2V0QnV0dG9uKE9LKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQllcnJvckFyZWEuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKGVycm9yVHh0ID09IG51bGwgfHwgZXJyb3JUeHQubGVuZ3RoKCkgPD0gMCkgewotCQkJCQlsb2NhbElucHV0LnNldElucHV0KG9iaik7Ci0JCQkJfQotCQkJfQotCQl9KTsJCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgTGFiZWwgYW5kIFRleHQgZm9yIG1lc3NhZ2UgYXJlYS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVNZXNzYWdlQXJlYShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUNvbXBvc2l0ZSBtZXNzYWdlQXJlYUNvbXAgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotCQltZXNzYWdlQXJlYUNvbXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQltZXNzYWdlQXJlYUNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQltZXNzYWdlQXJlYSA9IG5ldyBMYWJlbChtZXNzYWdlQXJlYUNvbXAsIFNXVC5XUkFQKTsKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJbWVzc2FnZUFyZWEuc2V0VGV4dChtZXNzYWdlKTsKLQkJfQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5taW5pbXVtV2lkdGggPSA0MDA7Ci0JCW1lc3NhZ2VBcmVhLnNldExheW91dERhdGEoZ2QpOwotCQlhcHBseURpYWxvZ0ZvbnQobWVzc2FnZUFyZWEpOwotCQlMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwobWVzc2FnZUFyZWFDb21wLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TRVBBUkFUT1IpOwotCQlHcmlkRGF0YSBnZDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QxLmhvcml6b250YWxTcGFuID0gMjsKLQkJc2VwYXJhdG9yLnNldExheW91dERhdGEoZ2QxKTsKLQkJcmV0dXJuIG1lc3NhZ2VBcmVhOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLQkKLQkJLy8gY3JlYXRlIG1lc3NhZ2UgYXJlYQotCQljcmVhdGVNZXNzYWdlQXJlYShjb21wb3NpdGUpOwotCi0JCS8vIGNyZWF0ZSBkaWFsb2cgYXJlYQotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgZGlhbG9nTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlkaWFsb2dMYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCWRpYWxvZ0FyZWEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRpYWxvZ0FyZWEuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQkvLyBDcmVhdGUgY29udHJvbHMgYmFzZWQgb24gVXNlcklucHV0cwotCQlpZiAodXNlcklucHV0cyAhPSBudWxsICYmIHVzZXJJbnB1dHMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHVzZXJJbnB1dHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFVzZXJJbnB1dCkgewotCQkJCQlVc2VySW5wdXQgdXNlcklucHV0ID0gKFVzZXJJbnB1dCkgb2JqZWN0OwotCi0JCQkJCS8vIFN0b3JlIHRoZSB1c2VySW5wdXQgaW4gdGhlIGhhc2htYXAgZm9yIGNhbmNlbCBhY3Rpb24uCi0JCQkJCW9sZEluZm9Gb3JDYW5jZWwucHV0KHVzZXJJbnB1dCwgdXNlcklucHV0LmdldElucHV0KCkpOwotCi0JCQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJCQkJbGFiZWwuc2V0VGV4dCh1c2VySW5wdXQuZ2V0TGFiZWwoKSk7Ci0JCQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQkJCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCQkJCWlmICh1c2VySW5wdXQuZ2V0VHlwZSgpID09IFVzZXJJbnB1dC5URVhUKSB7Ci0JCQkJCQljcmVhdGVUZXh0KGRpYWxvZ0FyZWEsIHVzZXJJbnB1dCk7Ci0JCQkJCX0gZWxzZSBpZiAodXNlcklucHV0LmdldFR5cGUoKSA9PSBVc2VySW5wdXQuU0VMRUNUSU9OKSB7Ci0JCQkJCQljcmVhdGVDb21ib1ZpZXdlcihkaWFsb2dBcmVhLCB1c2VySW5wdXQpOwotCQkJCQl9Ci0JCQkJCS8vIGNyZWF0ZUVtcHR5TGFiZWwoZGlhbG9nQXJlYSwgMik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNyZWF0ZUVycm9yQXJlYShjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBFcnJvciBBcmVhLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRXJyb3JBcmVhKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsJCi0JCUNvbXBvc2l0ZSBlcnJvckFyZWFDb21wID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCWVycm9yQXJlYUNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWVycm9yQXJlYUNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQkvLyBjcmVhdGUgYmxhbmsgbGFiZWwKLS8vCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0KLQkJZXJyb3JBcmVhID0gbmV3IExhYmVsKGVycm9yQXJlYUNvbXAsIFNXVC5XUkFQKTsKLQkJcmVkQ29sb3IgPSBuZXcgQ29sb3IobnVsbCwgbmV3IFJHQigyNTUsIDAsIDApKTsKLQkJaWYocmVkQ29sb3IgIT0gbnVsbCl7Ci0JCQllcnJvckFyZWEuc2V0Rm9yZWdyb3VuZChyZWRDb2xvcik7Ci0JCX0KLQkJCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotCQlnZC5oZWlnaHRIaW50ID0gODA7Ci0JCWVycm9yQXJlYS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYXBwbHlEaWFsb2dGb250KGVycm9yQXJlYSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJaWYgKHRoaXMudGl0bGUgIT0gbnVsbCkgewotCQkJbmV3U2hlbGwuc2V0VGV4dCh0aGlzLnRpdGxlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjb2tQcmVzc2VkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCXJlc3VsdCA9IHRydWU7CQkKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjYW5jZWxQcmVzc2VkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkgewotCQlpZiAodXNlcklucHV0cyAhPSBudWxsICYmIHVzZXJJbnB1dHMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHVzZXJJbnB1dHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFVzZXJJbnB1dCkgewotCQkJCQlVc2VySW5wdXQgdXNlcklucHV0ID0gKFVzZXJJbnB1dCkgb2JqZWN0OwotCQkJCQl1c2VySW5wdXQuc2V0SW5wdXQob2xkSW5mb0ZvckNhbmNlbC5nZXQodXNlcklucHV0KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHRzLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCWlmKHJlZENvbG9yICE9IG51bGwpewotCQkJcmVkQ29sb3IuZGlzcG9zZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQkvKioKLQkgKiBDcmVhdGUgYSBlbXB0eSBsYWJlbC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogQHBhcmFtIHNwYW4KLQkgKi8KLQkvLyBwcml2YXRlIHZvaWQgY3JlYXRlRW1wdHlMYWJlbChDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgc3Bhbil7Ci0JLy8gTGFiZWwgZW1wdHlMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkvLyBlbXB0eUxhYmVsLnNldEJhY2tncm91bmQoQ29sb3JzLklOSEVSSVRFRF9FTEVNRU5UX0xBQkVMKTsKLQkvLyBHcmlkRGF0YSBlbXB0eURhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkvLyBlbXB0eUxhYmVsLnNldFRleHQoIiIpOwotCS8vIGVtcHR5RGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCS8vIGVtcHR5RGF0YS5ob3Jpem9udGFsU3BhbiA9c3BhbjsKLQkvLyBlbXB0eURhdGEuaGVpZ2h0SGludCA9IDM7Ci0JLy8gZW1wdHlMYWJlbC5zZXRMYXlvdXREYXRhKGVtcHR5RGF0YSk7Ci0JLy8gfQotCS8qKgotCSAqIHZhbGlkYXRlcyB0aGUgaW5wdXQgd2l0aCBnaXZlbiBWYWxpZGF0b3IgaW4gVXNlcklucHV0LgotCSAqLwotCS8vIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZSgpIHsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB1c2VySW5wdXRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIFVzZXJJbnB1dCBlbGVtZW50ID0gKFVzZXJJbnB1dCkgaXRlci5uZXh0KCk7Ci0JLy8gSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBlbGVtZW50LmdldFZhbGlkYXRvcigpOwotCS8vIGlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotCS8vIGlmIChlbGVtZW50LmdldFR5cGUoKSA9PSBVc2VySW5wdXQuVEVYVCkgewotCS8vIGVycm9yVHh0ICs9IHZhbGlkYXRvcgotCS8vIC5pc1ZhbGlkKGVsZW1lbnQuZ2V0SW5wdXQoKS50b1N0cmluZygpKTsKLQkvLyB9IGVsc2UgewotCS8vIGVycm9yVHh0ICs9IHZhbGlkYXRvci5pc1ZhbGlkKGVsZW1lbnQuZ2V0SW5wdXQoKSk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gZXJyb3JUeHQgPSAiU3lzdGVtIG91dCB0ZXN0aW5nIjsKLQkvLyBpZiAoZXJyb3JUeHQgIT0gbnVsbCAmJiBlcnJvclR4dC5sZW5ndGgoKSA+IDApIHsKLQkvLyBlcnJvckFyZWEuc2V0VGV4dChlcnJvclR4dCk7Ci0JLy8gZXJyb3JBcmVhLnNldEZvcmVncm91bmQoQ29sb3JDb25zdGFudHMucmVkKTsKLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCS8vIHJldHVybiB0cnVlOwotCS8vIH0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQwMDc2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBkaWFsb2dzIGZvciBtYW5hZ2luZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL05ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDEzNmE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL05ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBNb2RlbHMgdGhlIDxuZXdMaWJyYXJ5V2l6YXJkUGFnZT4gZWxlbWVudCBpbiB0aGUKLSAqICJvcmcuZWNsaXBzZS5lcGYubGlicnJheS51aS5uZXdMaWJyYXJ5V2l6YXJkUGFnZXMiIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdMaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiB0aGF0IGNvbnRyaWJ1dGVkIHRoaXMgcHJvdmlkZXIuCi0JcHJpdmF0ZSBCdW5kbGUgYnVuZGxlOwotCi0JLy8gVGhlIHdpemFyZCBwYWdlIGNsYXNzIG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCi0JLy8gVGhlIGxpYnJhcnkgdHlwZSBpZGVudGlmaWVyLgotCXByaXZhdGUgU3RyaW5nIHR5cGVJZDsKLQotCS8vIFRoZSB3aXphcmQgcGFnZSB0aXRsZS4KLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotCS8vIFRoZSB3aXphcmQgcGFnZSBkZXNjcmlwdGlvbi4KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBjbGFzc05hbWUsCi0JCQlTdHJpbmcgdHlwZUlkLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKLQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCXRoaXMudHlwZUlkID0gdHlwZUlkOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnLWluIHRoYXQgY29udHJpYnV0ZWQgdGhpcyBwcm92aWRlci4KLQkgKi8KLQlwdWJsaWMgQnVuZGxlIGdldEJ1bmRsZSgpIHsKLQkJcmV0dXJuIGJ1bmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgcGFnZSBjbGFzcyBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBsaWJyYXJ5IHR5cGUgaWRlbnRpZmllci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVJZCgpIHsKLQkJcmV0dXJuIHR5cGVJZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgcGFnZSB0aXRsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2l6YXJkIHBhZ2UgZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvT3BlbkxpYnJhcnlNYWluUGFnZTIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL09wZW5MaWJyYXJ5TWFpblBhZ2UyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZTlmYmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvT3BlbkxpYnJhcnlNYWluUGFnZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLlJlY2VudGx5T3BlbmVkTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLk9wZW5MaWJyYXJ5V2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBlbnRlciB0aGUgbmFtZSwgYnJpZWYgZGVzY3JpcHRpb24gYW5kCi0gKiB0eXBlIGZvciBhIG5ldyBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3BlbkxpYnJhcnlNYWluUGFnZTIgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIHBhZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBPcGVuTGlicmFyeU1haW5QYWdlMi5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0lEID0gInR5cGVJZCI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcm90ZWN0ZWQgQ29tYm8gbmFtZUNvbWJvOwotCi0JcHJvdGVjdGVkIFRleHQgdXJpVGV4dDsKLQotCXByb3RlY3RlZCBCdXR0b24gb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gb3BlblVubGlzdGVkTGlicmFyeSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIEJ1dHRvbltdIHJhZGlvQnV0dG9uczsKLQotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBSZWNlbnRseU9wZW5lZExpYnJhcnk+IHJlY2VudGx5T3BlbmVkTGlicmFyaWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBSZWNlbnRseU9wZW5lZExpYnJhcnk+KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBPcGVuTGlicmFyeU1haW5QYWdlMigpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5TWFpbldpemFyZFBhZ2VfdGl0bGVfMik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vT3Blbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJTGFiZWwgbmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PUk1BTCk7Ci0JCW5hbWVMYWJlbC5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5uYW1lTGFiZWxfdGV4dCk7Ci0KLQkJbmFtZUNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQluYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gU2V0IHRoZSBjb25maWd1cmF0aW9uIGxpc3QuCi0JCUxpc3QgbGlicmFyeUxpc3QgPSBnZXRSZWNlbnRseU9wZW5lZExpYnJhcmllcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlicmFyeUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJUmVjZW50bHlPcGVuZWRMaWJyYXJ5IGxpYnJhcnkgPSAoUmVjZW50bHlPcGVuZWRMaWJyYXJ5KSBpdC5uZXh0KCk7Ci0JCQlyZWNlbnRseU9wZW5lZExpYnJhcmllcy5wdXQobGlicmFyeS5nZXROYW1lKCksIGxpYnJhcnkpOwotCQl9Ci0JCVN0cmluZ1tdIGxpYnJhcnlOYW1lcyA9IG5ldyBTdHJpbmdbcmVjZW50bHlPcGVuZWRMaWJyYXJpZXMuc2l6ZSgpXTsKLQkJcmVjZW50bHlPcGVuZWRMaWJyYXJpZXMua2V5U2V0KCkudG9BcnJheShsaWJyYXJ5TmFtZXMpOwotCQluYW1lQ29tYm8uc2V0SXRlbXMobGlicmFyeU5hbWVzKTsKLQotCQlMYWJlbCB1cmlMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT1JNQUwpOwotCQl1cmlMYWJlbC5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy51cmlMYWJlbF90ZXh0KTsKLQotCQl1cmlUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJdXJpVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdXJpVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQkJb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCW9wZW5Vbmxpc3RlZExpYnJhcnlDaGVja2JveAotCQkJCS5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5vcGVuVW5saXN0ZWRMaWJyYXJ5Q2hlY2tib3hfdGV4dCk7Ci0JCW9wZW5Vbmxpc3RlZExpYnJhcnlDaGVja2JveC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJKChHcmlkRGF0YSkgb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCi0JCUxhYmVsIGxpYnJhcnlUeXBlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9STUFMKTsKLQkJbGlicmFyeVR5cGVMYWJlbC5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5saWJyYXJ5VHlwZUxhYmVsX3RleHQpOwotCi0JCUNvbXBvc2l0ZSB0eXBlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT1JNQUwpOwotCQl0eXBlQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQl0eXBlQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCU1hcCB0eXBlcyA9IExpYnJhcnlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldExpYnJhcnlUeXBlcygpOwotCQlyYWRpb0J1dHRvbnMgPSBuZXcgQnV0dG9uW3R5cGVzLnNpemUoKV07Ci0JCWludCByYWRpb0J1dHRvbkluZGV4ID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHR5cGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVN0cmluZyB0eXBlSWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgdHlwZU5hbWUgPSAoU3RyaW5nKSB0eXBlcy5nZXQodHlwZUlkKTsKLQkJCUJ1dHRvbiByYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24odHlwZUNvbXBvc2l0ZSwgU1dULlJBRElPKTsKLQkJCXJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJCX0KLQkJCX0pOwotCQkJcmFkaW9CdXR0b24uc2V0VGV4dCh0eXBlTmFtZSk7Ci0JCQlyYWRpb0J1dHRvbi5zZXREYXRhKFRZUEVfSUQsIHR5cGVJZCk7Ci0JCQlyYWRpb0J1dHRvbnNbcmFkaW9CdXR0b25JbmRleCsrXSA9IHJhZGlvQnV0dG9uOwotCQl9Ci0KLQkJaWYgKHJhZGlvQnV0dG9ucy5sZW5ndGggPiAwKSB7Ci0JCQlyYWRpb0J1dHRvbnNbMF0uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCU9wZW5MaWJyYXJ5V2l6YXJkUGFnZSB3aXphcmRQYWdlID0gT3BlbkxpYnJhcnlXaXphcmRQYWdlRmFjdG9yeQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldFdpemFyZFBhZ2UoZ2V0TGlicmFyeVR5cGUoKSk7Ci0JCWlmICh3aXphcmRQYWdlICE9IG51bGwpIHsKLQkJCXdpemFyZFBhZ2Uub25FbnRlclBhZ2UoZ2V0TGlicmFyeU5hbWUoKSk7Ci0JCX0KLQkJaWYgKCFvcGVuVW5saXN0ZWRMaWJyYXJ5KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gd2l6YXJkUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGdldExpYnJhcnlOYW1lKCkubGVuZ3RoKCkgPiAwIHx8IG9wZW5Vbmxpc3RlZExpYnJhcnk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBsaXN0ZW5lcnMgdG8gdGhlIHdpemFyZCBjb250cm9scy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQluYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJfQotCQl9KTsKLQotCQlvcGVuVW5saXN0ZWRMaWJyYXJ5Q2hlY2tib3gKLQkJCQkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlvcGVuVW5saXN0ZWRMaWJyYXJ5ID0gb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94Ci0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc2VsZWN0ZWQgbWV0aG9kIGxpYnJhcnkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlOYW1lKCkgewotCQlyZXR1cm4gbmFtZUNvbWJvLmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgVVJJIG9mIHRoZSB1c2VyIHNlbGVjdGVkIG1ldGhvZCBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeVVSSSgpIHsKLQkJUmVjZW50bHlPcGVuZWRMaWJyYXJ5IGxpYnJhcnkgPSAoUmVjZW50bHlPcGVuZWRMaWJyYXJ5KSByZWNlbnRseU9wZW5lZExpYnJhcmllcwotCQkJCS5nZXQoZ2V0TGlicmFyeU5hbWUoKSk7Ci0JCXJldHVybiBsaWJyYXJ5LmdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGF0aCBvZiB0aGUgdXNlciBzZWxlY3RlZCBtZXRob2QgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlQYXRoKCkgewotCQlSZWNlbnRseU9wZW5lZExpYnJhcnkgbGlicmFyeSA9IChSZWNlbnRseU9wZW5lZExpYnJhcnkpIHJlY2VudGx5T3BlbmVkTGlicmFyaWVzCi0JCQkJLmdldChnZXRMaWJyYXJ5TmFtZSgpKTsKLQkJcmV0dXJuIGxpYnJhcnkuZ2V0UGF0aCgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wZW4gdW5saXN0ZWQgbWV0aG9kIGxpYnJyYXkgb3B0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3BlblVubGlzdGVkTGlicmFyeSgpIHsKLQkJcmV0dXJuIG9wZW5Vbmxpc3RlZExpYnJhcnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXNlciBzZWxlY3RlZCBtZXRob2QgbGlicmFyeSB0eXBlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeVR5cGUoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmFkaW9CdXR0b25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlCdXR0b24gcmFkaW9CdXR0b24gPSByYWRpb0J1dHRvbnNbaV07Ci0JCQlpZiAocmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlyZXR1cm4gKFN0cmluZykgcmFkaW9CdXR0b24uZ2V0RGF0YShUWVBFX0lEKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKFN0cmluZykgcmFkaW9CdXR0b25zWzBdLmdldERhdGEoVFlQRV9JRCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIGxpc3Qgb2YgcmVjZW50bHkgb3BlbmVkIG1ldGhvZCBsaWJyYXJpZXMuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+UmVjZW50bHlPcGVuZWRMaWJyYXJ5PC9jb2RlPiBvYmplY3RzCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGdldFJlY2VudGx5T3BlbmVkTGlicmFyaWVzKCkgewotCQlMaXN0IGxpYnJhcnlVUklzID0gTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0T3BlbkxpYnJhcnlVUklzTGlzdCgpOwotCQlMaXN0PFJlY2VudGx5T3BlbmVkTGlicmFyeT4gbGlicmFyaWVzID0gbmV3IEFycmF5TGlzdDxSZWNlbnRseU9wZW5lZExpYnJhcnk+KCk7Ci0JCWlmIChsaWJyYXJ5VVJJcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlicmFyeVVSSXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBsaWJyYXJ5VVJJID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCWxpYnJhcmllcy5hZGQobmV3IFJlY2VudGx5T3BlbmVkTGlicmFyeShsaWJyYXJ5VVJJKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpYnJhcmllczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkMi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmQyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MTQ2ZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5TWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuT3BlbkxpYnJhcnlXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogQSB3aXphcmQgdGhhdCBndWlkZXMgdGhlIHVzZXIgdG8gb3BlbiBhIG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTGlicmFyeVdpemFyZDIgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0lEID0gT3BlbkxpYnJhcnlXaXphcmQyLmNsYXNzLmdldE5hbWUoKTsKLQotCS8vIFRoZSBtYWluIHdpemFyZCBwYWdlLgotCXByaXZhdGUgT3BlbkxpYnJhcnlNYWluUGFnZTIgbWFpblBhZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBPcGVuTGlicmFyeVdpemFyZDIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRXaW5kb3dUaXRsZShMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCW1haW5QYWdlID0gbmV3IE9wZW5MaWJyYXJ5TWFpblBhZ2UyKCk7Ci0JCWFkZFBhZ2UobWFpblBhZ2UpOwotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRMaWJyYXJ5VHlwZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgcGVyc2lzdGVuY2VJZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBwYWdlSWQgPSBwZXJzaXN0ZW5jZUlkICsgIlBhZ2UiOyAvLyROT04tTkxTLTEkCi0JCQlPcGVuTGlicmFyeVdpemFyZFBhZ2UgcGFnZSA9IE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkKLQkJCQkJLmdldEluc3RhbmNlKCkuY3JlYXRlV2l6YXJkUGFnZShwYWdlSWQsIHBlcnNpc3RlbmNlSWQpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCXBhZ2Uuc2V0SW1hZ2VEZXNjcmlwdG9yKExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvd2l6YmFuL09wZW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCQkJCQkKLQkJCQlhZGRQYWdlKHBhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCQkiZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJaWYgKG1haW5QYWdlLmlzUGFnZUNvbXBsZXRlKCkgJiYgIW1haW5QYWdlLmlzT3BlblVubGlzdGVkTGlicmFyeSgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlJV2l6YXJkUGFnZVtdIHBhZ2VzID0gZ2V0UGFnZXMoKTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFwYWdlc1tpXS5pc1BhZ2VDb21wbGV0ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpICE9IG1haW5QYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlTdHJpbmcgdHlwZSA9IG1haW5QYWdlLmdldExpYnJhcnlUeXBlKCk7Ci0JCU9wZW5MaWJyYXJ5V2l6YXJkUGFnZSBwYWdlID0gT3BlbkxpYnJhcnlXaXphcmRQYWdlRmFjdG9yeS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFdpemFyZFBhZ2UodHlwZSk7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcGF0aCA9IG51bGw7Ci0JCQlpZiAobWFpblBhZ2UuaXNPcGVuVW5saXN0ZWRMaWJyYXJ5KCkpIHsKLQkJCQlNYXAgb3B0aW9ucyA9IHBhZ2UuZ2V0U2VsZWN0aW9ucygpOwotCQkJCXBhdGggPSAoU3RyaW5nKSBvcHRpb25zLmdldChYTUlMaWJyYXJ5TWFuYWdlci5BUkdfTElCUkFSWV9QQVRIKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcGF0aCA9IG1haW5QYWdlLmdldExpYnJhcnlQYXRoKCk7Ci0JCQl9Ci0JCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJaWYgKFhNSUxpYnJhcnlVdGlsLmlzVmFsaWRMaWJyYXJ5KHBhdGgsIHRydWUpID09IFN0YXR1cy5PS19TVEFUVVMpIHsKLQkJCQkJaWYgKCFoYW5kbGVUb29sVmVyc2lvbihwYXRoLCBudWxsKSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCWlmIChMaWJyYXJ5VUlNYW5hZ2VyLmdldEluc3RhbmNlKCkub3BlbkxpYnJhcnkocGF0aCkpIHsKLQkJCQkJCWFkZFJlY2VudGx5T3BlbmVkTGlicmFyeSgpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKFhNSUxpYnJhcnlVdGlsCi0JCQkJCQkuY29udGFpbnNQbHVnaW5PckNvbmZpZ1NwZWNFeHBvcnRGaWxlKHBhdGgpKSB7Ci0JCQkJCXRocm93IG5ldyBFeGNlcHRpb24oCi0JCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uNCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTXNnRGlhbG9nIG1zZ0RpYWxvZyA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQkJCWJvb2xlYW4gcmMgPSBtc2dEaWFsb2cKLQkJCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCQkJCU5MUwotCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlEaWFsb2dfbmV3TGlicmFyeV90ZXh0LAotCQkJCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IHBhdGggfSkpOwotCQkJCQlpZiAoIXJjKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlpZiAoTGlicmFyeVVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUxpYnJhcnkocGF0aCkpIHsKLQkJCQkJCWFkZFJlY2VudGx5T3BlbmVkTGlicmFyeSgpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyByZWFzb24gPSBlLmdldE1lc3NhZ2UoKTsKLQkJCWlmIChyZWFzb24gPT0gbnVsbCkgewotCQkJCXJlYXNvbiA9IExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUludGVybmxFcnJvcl9yZWFzb247Ci0JCQl9Ci0JCQlyZWFzb24gKz0gIlxuXG4iICsgTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RXJyb3JfYWR2aWNlOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RXJyb3JfbXNnLCByZWFzb24pOwotCQkJfSBlbHNlIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX21zZywgcmVhc29uLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbmV3bHkgb3BlbmVkIG9yIGNyZWF0ZWQgbWV0aG9kIGxpYnJhcnkgdG8gdGhlIHJlY2VudGx5IG9wZW5lZAotCSAqIG1ldGhvZCBsaWJyYXJpZXMgcHJlZmVyZW5jZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWNlbnRseU9wZW5lZExpYnJhcnkoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJU3RyaW5nIGxpYnJhcnlVUkkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldExpYnJhcnlNYW5hZ2VyKAotCQkJCQlsaWJyYXJ5KS5nZXRNZXRob2RMaWJyYXJ5VVJJKCkudG9TdHJpbmcoKTsKLQkJCUxpYnJhcnlVSVByZWZlcmVuY2VzLmFkZE9wZW5MaWJyYXJ5VVJJKGxpYnJhcnlVUkkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgYW5kIGhhbmRsZSB0b29sIHZlcnNpb24gZGlmZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFuZGxlVG9vbFZlcnNpb24oU3RyaW5nIHBhdGgsCi0JCQlVcGdyYWRlQ2FsbGVySW5mbyBjYWxsZXJJbmZvKSB7Ci0JCVN0cmluZyBsaWJYbWkgPSBYTUlMaWJyYXJ5TWFuYWdlci5MSUJSQVJZX1hNSTsKLQkJaWYgKGNhbGxlckluZm8gIT0gbnVsbCAmJiBjYWxsZXJJbmZvLmdldElzRXhwb3J0ZWRQbHVnaW5MaWIoKSkgewotCQkJbGliWG1pID0gWE1JTGlicmFyeU1hbmFnZXIuZXhwb3J0RmlsZTsKLQkJfQotCQlWZXJzaW9uVXRpbC5WZXJzaW9uQ2hlY2tJbmZvIGluZm8gPSBWZXJzaW9uVXRpbAotCQkJCS5jaGVja0xpYnJhcnlWZXJzaW9uKG5ldyBGaWxlKHBhdGgsIGxpYlhtaSkpOwotCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8ucmVzdWx0ID4gMCkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGluZm8udG9vbElELmVxdWFscyhWZXJzaW9uVXRpbC5nZXRQcmltYXJ5VG9vbElEKCkpKSB7Ci0JCQkJbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0LAotCQkJCQkJbmV3IE9iamVjdFtdIHsgUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKSwKLQkJCQkJCQkJaW5mby50b29sVmVyc2lvbiB9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0X3Vua25vd24sCi0JCQkJCQluZXcgT2JqZWN0W10geyBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpIH0pOwotCQkJfQotCQkJaWYgKCFpc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pKSB7Ci0JCQkJY2FsbGVySW5mby5zZXRFcnJvck1zZyhtZXNzYWdlKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLCBtZXNzYWdlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoWE1JTGlicmFyeVV0aWwuaXNNZXRob2RMaWJyYXJ5VXBncmFkZVJlcXVpcmVkKHBhdGgsIGxpYlhtaSwgaW5mbykpIHsKLQkJCWlmIChpc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pCi0JCQkJCSYmICFMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMudXBncmFkZUxpYnJhcnlEaWFsb2dfdGV4dCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoIWlzVXBncmFkZUxpYnJhcnkoY2FsbGVySW5mbykpIHsKLQkJCQljYWxsZXJJbmZvLmNvcHlMaWJyYXJ5KCk7Ci0JCQkJaWYgKGNhbGxlckluZm8uZ2V0Q29waWVkTGliRmlsZSgpICE9IG51bGwpIHsKLQkJCQkJcGF0aCA9IGNhbGxlckluZm8uZ2V0Q29waWVkTGliRmlsZSgpLmdldFBhcmVudEZpbGUoKQotCQkJCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIUxpYnJhcnlVSU1hbmFnZXIudXBncmFkZUxpYnJhcnkocGF0aCwgY2FsbGVySW5mbykpIHsKLQkJCQlpZiAoY2FsbGVySW5mbyAhPSBudWxsKSB7Ci0JCQkJCS8vIGNhbGxlckluZm8uc2V0RXJyb3JNc2coInVwZ3JhZGVMaWJyYXJ5IEZhaWxlZCEiKTsgLy9uZWVkCi0JCQkJCS8vIG5ldyByZXNvdXJjZSBzdHJpbmcKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1VwZ3JhZGVMaWJyYXJ5KFVwZ3JhZGVDYWxsZXJJbmZvIGNhbGxlckluZm8pIHsKLQkJcmV0dXJuIFVwZ3JhZGVDYWxsZXJJbmZvLmlzVXBncmFkZUxpYnJhcnkoY2FsbGVySW5mbyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvaW50ZXJuYWwvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzlmYmM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogTW9kZWxzIHRoZSA8b3BlbkxpYnJhcnlXaXphcmRQYWdlPiBlbGVtZW50IGluIHRoZQotICogIm9yZy5lY2xpcHNlLmVwZi5saWJycmF5LnVpLm9wZW5MaWJyYXJ5V2l6YXJkUGFnZXMiIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uIHsKLQotCS8vIFRoZSBwbHVnLWluIHRoYXQgY29udHJpYnV0ZWQgdGhpcyBwcm92aWRlci4KLQlwcml2YXRlIEJ1bmRsZSBidW5kbGU7Ci0KLQkvLyBUaGUgd2l6YXJkIHBhZ2UgY2xhc3MgbmFtZS4KLQlwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7Ci0KLQkvLyBUaGUgbGlicmFyeSB0eXBlIGlkZW50aWZpZXIuCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZUlkOwotCi0JLy8gVGhlIHdpemFyZCBwYWdlIHRpdGxlLgotCXByaXZhdGUgU3RyaW5nIHRpdGxlOwotCi0JLy8gVGhlIHdpemFyZCBwYWdlIGRlc2NyaXB0aW9uLgotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBjbGFzc05hbWUsCi0JCQlTdHJpbmcgdHlwZUlkLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKLQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCXRoaXMudHlwZUlkID0gdHlwZUlkOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnLWluIHRoYXQgY29udHJpYnV0ZWQgdGhpcyBwcm92aWRlci4KLQkgKi8KLQlwdWJsaWMgQnVuZGxlIGdldEJ1bmRsZSgpIHsKLQkJcmV0dXJuIGJ1bmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgcGFnZSBjbGFzcyBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBsaWJyYXJ5IHR5cGUgaWRlbnRpZmllci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVJZCgpIHsKLQkJcmV0dXJuIHR5cGVJZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgcGFnZSB0aXRsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2l6YXJkIHBhZ2UgZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmRQYWdlRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmRQYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjQ0NTQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5PcGVuTGlicmFyeVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBPcGVuIExpYnJhcnkgd2l6YXJkIHBhZ2VzIGRlZmluZWQgdmlhIHRoZQotICogIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm9wZW5MaWJyYXJ5V2l6YXJkUGFnZXMiIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3BlbkxpYnJhcnlXaXphcmRQYWdlRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFID0gIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FID0gIm9wZW5MaWJyYXJ5V2l6YXJkUGFnZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkgaW5zdGFuY2UgPSBuZXcgT3BlbkxpYnJhcnlXaXphcmRQYWdlRmFjdG9yeSgpOwotCi0JLy8gQSBtYXAgb2Ygd2l6YXJkIHBhZ2UgcHJvdmlkZXJzLgotCXByaXZhdGUgTWFwPFN0cmluZywgT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uPiB3aXphcmRQYWdlUHJvdmlkZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPcGVuTGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24+KCk7Ci0KLQkvLyBBIGxpc3Qgb2Ygd2l6YXJkIHBhZ2UgaW5zdGFuY2VzLgotCXByaXZhdGUgTWFwPFN0cmluZywgT3BlbkxpYnJhcnlXaXphcmRQYWdlPiB3aXphcmRQYWdlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT3BlbkxpYnJhcnlXaXphcmRQYWdlPigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3BlbkxpYnJhcnlXaXphcmRQYWdlRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcGVuTGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5KCkgewotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQlFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFLCBFWFRFTlNJT05fUE9JTlRfTkFNRSk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgdHlwZUlkID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3RyaW5nIHRpdGxlID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoInRpdGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAkJCQkJCQotCQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsICYmIGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIHR5cGVJZCAhPSBudWxsICYmIHR5cGVJZC50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIHRpdGxlICE9IG51bGwgJiYgdGl0bGUudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiBkZXNjcmlwdGlvbiAhPSBudWxsCi0JCQkJCQkJCSYmIGRlc2NyaXB0aW9uLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlpZiAoIXdpemFyZFBhZ2VQcm92aWRlcnMuY29udGFpbnNLZXkodHlwZUlkKSkgewotCQkJCQkJCQlPcGVuTGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24gcHJvdmlkZXIgPSBuZXcgT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uKAotCQkJCQkJCQkJCWJ1bmRsZSwgY2xhc3NOYW1lLCB0eXBlSWQsIHRpdGxlLAotCQkJCQkJCQkJCWRlc2NyaXB0aW9uKTsKLQkJCQkJCQkJd2l6YXJkUGFnZVByb3ZpZGVycy5wdXQodHlwZUlkLCBwcm92aWRlcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+T3BlbkxpYnJhcnlXaXphcmRQYWdlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBPcGVuTGlicmFyeVdpemFyZFBhZ2UgY3JlYXRlV2l6YXJkUGFnZShTdHJpbmcgcGFnZUlkLCBTdHJpbmcgdHlwZUlkKSB7Ci0JCU9wZW5MaWJyYXJ5V2l6YXJkUGFnZSB3aXphcmRQYWdlID0gKE9wZW5MaWJyYXJ5V2l6YXJkUGFnZSkgd2l6YXJkUGFnZXMKLQkJCQkuZ2V0KHR5cGVJZCk7Ci0JCWlmICh3aXphcmRQYWdlICE9IG51bGwpIHsKLQkJCXJldHVybiB3aXphcmRQYWdlOwotCQl9Ci0KLQkJT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uIHByb3ZpZGVyID0gKE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbikgd2l6YXJkUGFnZVByb3ZpZGVycwotCQkJCS5nZXQodHlwZUlkKTsKLQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCUJ1bmRsZSBidW5kbGUgPSBwcm92aWRlci5nZXRCdW5kbGUoKTsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSBwcm92aWRlci5nZXRDbGFzc05hbWUoKTsKLQkJCUNsYXNzIHdpemFyZFBhZ2VDbGFzczsKLQkJCUNsYXNzW10gYXJnQ2xhc3MgPSBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcyB9OwotCQkJT2JqZWN0W10gYXJnVmFsdWUgPSBuZXcgT2JqZWN0W10geyBwYWdlSWQgfTsKLQkJCUNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yOwotCQkJdHJ5IHsKLQkJCQl3aXphcmRQYWdlQ2xhc3MgPSBidW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JCQkJY29uc3RydWN0b3IgPSB3aXphcmRQYWdlQ2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJnQ2xhc3MpOwotCQkJCXdpemFyZFBhZ2UgPSAoT3BlbkxpYnJhcnlXaXphcmRQYWdlKSBjb25zdHJ1Y3RvcgotCQkJCQkJLm5ld0luc3RhbmNlKGFyZ1ZhbHVlKTsKLQkJCQl3aXphcmRQYWdlLnNldFRpdGxlKHByb3ZpZGVyLmdldFRpdGxlKCkpOwotCQkJCXdpemFyZFBhZ2Uuc2V0RGVzY3JpcHRpb24ocHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQkJd2l6YXJkUGFnZXMucHV0KHR5cGVJZCwgd2l6YXJkUGFnZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdpemFyZFBhZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvciBjYWNoZWQgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPk5ld0xpYnJhcnlXaXphcmRQYWdlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgT3BlbkxpYnJhcnlXaXphcmRQYWdlIGdldFdpemFyZFBhZ2UoU3RyaW5nIHR5cGVJZCkgewotCQlyZXR1cm4gKE9wZW5MaWJyYXJ5V2l6YXJkUGFnZSkgd2l6YXJkUGFnZXMuZ2V0KHR5cGVJZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzMmRlMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIFVJIHN1cHBwb3J0IGZvciBtYW5hZ2luZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5VUlQcmVmZXJlbmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ByZWZlcmVuY2VzL0xpYnJhcnlVSVByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMjA2YzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ByZWZlcmVuY2VzL0xpYnJhcnlVSVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuUHJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuRGVmYXVsdFZhbHVlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBMaWJyYXJ5IFVJIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlVSVByZWZlcmVuY2VzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0xJQlJBUllfUEFUSCA9ICJkZWZhdWx0TGlicmFyeVBhdGgiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfTElCUkFSWV9QQVRIID0gInNhdmVkTGlicmFyeVBhdGgiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9VTk9QRU5fQUNUSVZJVFlfREQgPSAicHVibGlzaFVub3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1NXSVRDSF9DT05GSUcgPSAic3dpdGNoQ29uZmlndXJhdGlvbk9uUHJvY2Vzc0FjdGl2YXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTiA9ICJwdWJsaXNoQWN0aXZpdHlEaWFncmFtZm9yQWN0aXZpdHlFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fU0hPUlRfTkFNRSA9ICJhcHBuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19MSUJSQVJZX1BBVEhTID0gIm5ld0xpYnJhcnlQYXRocyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX0xJQlJBUllfUEFUSFMgPSAib3BlbkxpYnJhcnlQYXRocyI7IC8vJE5PTi1OTFMtMSQJCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fTElCUkFSWV9VUklTID0gIm9wZW5MaWJyYXJ5VVJJcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX0JSRUFLRE9XTkVMRU1FTlRfT1BUSU9OQUwgPSAid29ya19icmVha2Rvd25lbGVtZW50X29wdGlvbmFsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfQlJFQUtET1dORUxFTUVOVF9NVUxUSVBMRV9PQ0NVUlJBTkNFUyA9ICJ3b3JrX2JyZWFrZG93bmVsZW1lbnRfbXVsdGlwbGVfb2NjdXJyYW5jZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19CUkVBS0RPV05FTEVNRU5UX1BMQU5ORUQgPSAid29ya19icmVha2Rvd25lbGVtZW50X3BsYW5uZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19CUkVBS0RPV05FTEVNRU5UX0VWRU5UX0RSSVZFTiA9ICJ3b3JrX2JyZWFrZG93bmVsZW1lbnRfZXZlbnRfZHJpdmVuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfQlJFQUtET1dORUxFTUVOVF9PTkdPSU5HID0gIndvcmtfYnJlYWtkb3duZWxlbWVudF9tdWx0aXBsZV9vbmdvaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfQlJFQUtET1dORUxFTUVOVF9SRVBFQVRBQkxFID0gIndvcmtfYnJlYWtkb3duZWxlbWVudF9yZXBlYXRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUT1JfT1BUSU9OQUwgPSAiZGVzY3JpcHRvcl9vcHRpb25hbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVE9SX01VTFRJUExFX09DQ1VSUkFOQ0VTID0gImRlc2NyaXB0b3JfbXVsdGlwbGVfb2NjdXJyYW5jZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRPUl9QTEFOTkVEID0gImRlc2NyaXB0b3JfcGxhbm5lZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVE9SX0VWRU5UX0RSSVZFTiA9ICJkZXNjcmlwdG9yX2V2ZW50X2RyaXZlbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVE9SX09OR09JTkcgPSAiZGVzY3JpcHRvcl9tdWx0aXBsZV9vbmdvaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUT1JfUkVQRUFUQUJMRSA9ICJkZXNjcmlwdG9yX3JlcGVhdGFibGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MSUJSQVJZX0ZPTERFUl9OQU1FID0gIk1ldGhvZCBMaWJyYXJpZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdExpYnJhcnlQYXRoID0gbnVsbDsKLQotCS8vIFRoZSBwbHVnLWluIHNwZWNpZmljIHByZWZlcmVuY2Ugc3RvcmUuCi0JcHJpdmF0ZSBzdGF0aWMgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQlzdGF0aWMgewotCQkvLyBJbml0aWFsaXplIHRoZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzLgotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChERUZBVUxUX0xJQlJBUllfUEFUSCwKLQkJCQlnZXRJbml0aWFsRGVmYXVsdExpYnJhcnlQYXRoKCkpOwotCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFNBVkVEX0xJQlJBUllfUEFUSCwgIiIpOyAvLyROT04tTkxTLTEkCQotCQlwcmVmU3RvcmUKLQkJCQkuc2V0RGVmYXVsdChQUkVGX1NXSVRDSF9DT05GSUcsIE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLlBST01QVCk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KE5FV19MSUJSQVJZX1BBVEhTLCAiIik7IC8vJE5PTi1OTFMtMSQJCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KE9QRU5fTElCUkFSWV9QQVRIUywgIiIpOyAvLyROT04tTkxTLTEkCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KE9QRU5fTElCUkFSWV9VUklTLCAiIik7IC8vJE5PTi1OTFMtMSQJCi0KLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoV09SS19CUkVBS0RPV05FTEVNRU5UX09QVElPTkFMLCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFdPUktfQlJFQUtET1dORUxFTUVOVF9NVUxUSVBMRV9PQ0NVUlJBTkNFUywgZmFsc2UpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChXT1JLX0JSRUFLRE9XTkVMRU1FTlRfUExBTk5FRCwgdHJ1ZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFdPUktfQlJFQUtET1dORUxFTUVOVF9FVkVOVF9EUklWRU4sIGZhbHNlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoV09SS19CUkVBS0RPV05FTEVNRU5UX09OR09JTkcsIGZhbHNlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoV09SS19CUkVBS0RPV05FTEVNRU5UX1JFUEVBVEFCTEUsIGZhbHNlKTsKLQotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChERVNDUklQVE9SX09QVElPTkFMLCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KERFU0NSSVBUT1JfTVVMVElQTEVfT0NDVVJSQU5DRVMsIGZhbHNlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoREVTQ1JJUFRPUl9QTEFOTkVELCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KERFU0NSSVBUT1JfRVZFTlRfRFJJVkVOLCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KERFU0NSSVBUT1JfT05HT0lORywgZmFsc2UpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChERVNDUklQVE9SX1JFUEVBVEFCTEUsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbml0aWFsIGRlZmF1bHQgbWV0aG9kIGxpYnJhcnkgcGF0aCBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEluaXRpYWxEZWZhdWx0TGlicmFyeVBhdGgoKSB7Ci0JCWlmIChkZWZhdWx0TGlicmFyeVBhdGggPT0gbnVsbCkgewotCQkJZGVmYXVsdExpYnJhcnlQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGFwcE5hbWUgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpOwotCQkJaWYgKGFwcE5hbWUgIT0gbnVsbCAmJiBhcHBOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCWRlZmF1bHRMaWJyYXJ5UGF0aCA9IGRlZmF1bHRMaWJyYXJ5UGF0aCArIEZpbGVVdGlsLkZJTEVfU0VQCi0JCQkJCQkrIGFwcE5hbWUgKyBGaWxlVXRpbC5GSUxFX1NFUAotCQkJCQkJKyBERUZBVUxUX0xJQlJBUllfRk9MREVSX05BTUU7Ci0JCQl9IGVsc2UgewotCQkJCWRlZmF1bHRMaWJyYXJ5UGF0aCA9IGRlZmF1bHRMaWJyYXJ5UGF0aCArIEZpbGVVdGlsLkZJTEVfU0VQCi0JCQkJCQkrIERFRkFVTFRfTElCUkFSWV9GT0xERVJfTkFNRTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdExpYnJhcnlQYXRoOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgbWV0aG9kIGxpYnJhcnkgcGF0aCBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRMaWJyYXJ5UGF0aCgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoREVGQVVMVF9MSUJSQVJZX1BBVEgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRlZmF1bHQgbWV0aG9kIGxpYnJhcnkgcGF0aCBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0TGlicmFyeVBhdGgoU3RyaW5nIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShERUZBVUxUX0xJQlJBUllfUEFUSCwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZChib29sZWFuIGVuYWJsZWQpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFBVQkxJU0hfVU5PUEVOX0FDVElWSVRZX0RELCBlbmFibGVkKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0UHVibGlzaFVub3BlbkFjdGl2aXR5ZGQoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihQVUJMSVNIX1VOT1BFTl9BQ1RJVklUWV9ERCk7Ci0JfQotCi0JLyoqCi0JICogU2V0dGVyIG1ldGhvZCBmb3IgUHVibGlzaCBBY3Rpdml0eSBEaWFncmFtIGZvciBBY3Rpdml0eSBFeHRlbnNpb24sCi0JICogCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShQVUJMSVNIX0FEX0ZPUl9BQ1RJVklUWV9FWFRFTlNJT04sIGVuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIGdldHRlciBtZXRob2QgZm9yIFB1Ymxpc2ggQWN0aXZpdHkgRGlhZ3JhbSBmb3IgQWN0aXZpdHkgRXh0ZW5zaW9uIGZsYWcKLQkgKiBmcm9tIHByZWZlcmVuY2Ugc3RvcmUsCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oUFVCTElTSF9BRF9GT1JfQUNUSVZJVFlfRVhURU5TSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHN3aXRjaCBjb25maWd1cmF0aW9uIHZhbHVlIHN0b3JlIGluIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIC0gY291bGQgYmUgQUxXQVlTLCBORVZFUiwgUFJPTVBUCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3dpdGNoQ29uZmlnKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhQUkVGX1NXSVRDSF9DT05GSUcpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHN3aXRjaCBjb25maWd1cmF0aW9uIHZhbHVlIGluIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFZhbHVlIGNvdWxkIGJlIEFMV0FZUywgTkVWRVIsIFBST01QVAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTd2l0Y2hDb25maWcoU3RyaW5nIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShQUkVGX1NXSVRDSF9DT05GSUcsIHZhbHVlKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHN3aXRjaCBjb25maWd1cmF0aW9uIHByZWZlcmVuY2Uga2V5Ci0JICogQHJldHVybiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTd2l0Y2hDb25maWdQcmVmZXJlbmNlS2V5KCkJewotCQlyZXR1cm4gUFJFRl9TV0lUQ0hfQ09ORklHOwkJCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIE1ldGhvZCBMaWJyYXJ5IHBhdGggdGhhdCB3YXMgc2F2ZWQgaW4gYSBwcmV2aW91cyBzZXNzaW9uLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHNhdmVkIGxpYnJhcnkgcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTYXZlZExpYnJhcnlQYXRoKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhTQVZFRF9MSUJSQVJZX1BBVEgpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIGEgTWV0aG9kIExpYnJhcnkgcGF0aCB0byB0aGUgTGlicmFyeSBVSSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqIAotCSAqIEBwYXJhbSBsaWJQYXRoCi0JICogICAgICAgICAgICBQYXRoIHRvIGEgTWV0aG9kIExpYnJhcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNhdmVkTGlicmFyeVBhdGgoU3RyaW5nIGxpYlBhdGgpIHsKLQkJU3RyaW5nIHBhdGggPSBsaWJQYXRoOwotCQlpZiAocGF0aC5lbmRzV2l0aChNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0xJQlJBUllfTU9ERUxfRklMRU5BTUUpKSB7Ci0JCQlwYXRoID0gRmlsZVV0aWwuZ2V0UGFyZW50RGlyZWN0b3J5KHBhdGgpOwotCQl9Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShTQVZFRF9MSUJSQVJZX1BBVEgsIHBhdGgpOwotCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFwcGxpY2F0aW9uIHNob3J0IG5hbWUgcGFzc2VkIGluIHRoZSBtYWluIGZlYXR1cmUncwotCSAqIHBsdWdpbl9jdXN0b21pemF0aW9uLmluaS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBwYXNzZWQtaW4gYXBwbGljYXRpb24gc2hvcnQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoQVBQTElDQVRJT05fU0hPUlRfTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmV3IGxpYnJhcnkgcGF0aHMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1ldGhvZCBsaWJyYXJ5IHBhdGhzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXROZXdMaWJyYXJ5UGF0aHMoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRTdHJpbmdWYWx1ZXMocHJlZlN0b3JlLCBORVdfTElCUkFSWV9QQVRIUyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmV3IGxpYnJhcnkgcGF0aHMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBtZXRob2QgbGlicmFyeSBwYXRocwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldE5ld0xpYnJhcnlQYXRoc0xpc3QoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRMaXN0KHByZWZTdG9yZSwgTkVXX0xJQlJBUllfUEFUSFMpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBtZXRob2QgbGlicmFyeSBwYXRoIHRvIHRoZSBuZXcgbGlicmFyeSBwYXRocyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5IHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTmV3TGlicmFyeVBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJUHJlZmVyZW5jZVV0aWwuYWRkVG9MaXN0KHByZWZTdG9yZSwgTkVXX0xJQlJBUllfUEFUSFMsIHBhdGgsCi0JCQkJZ2V0RGVmYXVsdExpYnJhcnlQYXRoKCkpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wZW4gbGlicmFyeSBwYXRocyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbWV0aG9kIGxpYnJhcnkgcGF0aHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldE9wZW5MaWJyYXJ5UGF0aHMoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRTdHJpbmdWYWx1ZXMocHJlZlN0b3JlLCBPUEVOX0xJQlJBUllfUEFUSFMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wZW4gbGlicmFyeSBwYXRocyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIG1ldGhvZCBsaWJyYXJ5IHBhdGhzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0T3BlbkxpYnJhcnlQYXRoc0xpc3QoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRMaXN0KHByZWZTdG9yZSwgT1BFTl9MSUJSQVJZX1BBVEhTKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbWV0aG9kIGxpYnJhcnkgcGF0aCB0byB0aGUgb3BlbiBsaWJyYXJ5IHBhdGhzIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRPcGVuTGlicmFyeVBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJUHJlZmVyZW5jZVV0aWwuYWRkVG9MaXN0KHByZWZTdG9yZSwgT1BFTl9MSUJSQVJZX1BBVEhTLCBwYXRoLAotCQkJCWdldERlZmF1bHRMaWJyYXJ5UGF0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcGVuIGxpYnJhcnkgVVJJcyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIG1ldGhvZCBsaWJyYXJ5IFVSSXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldE9wZW5MaWJyYXJ5VVJJcygpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldFN0cmluZ1ZhbHVlcyhwcmVmU3RvcmUsIE9QRU5fTElCUkFSWV9VUklTKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcGVuIGxpYnJhcnkgVVJJcyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIG1ldGhvZCBsaWJyYXJ5IFVSSXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0T3BlbkxpYnJhcnlVUklzTGlzdCgpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldExpc3QocHJlZlN0b3JlLCBPUEVOX0xJQlJBUllfVVJJUyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG1ldGhvZCBsaWJyYXJ5IFVSSSB0byB0aGUgb3BlbiBsaWJyYXJ5IFVSSXMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5IFVSSQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRPcGVuTGlicmFyeVVSSShTdHJpbmcgdXJpKSB7Ci0JCVByZWZlcmVuY2VVdGlsLmFkZFRvTGlzdChwcmVmU3RvcmUsIE9QRU5fTElCUkFSWV9VUklTLCB1cmkpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgYWxsIHByZWZlcmVuY2VzCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVBbGxQcmVmZXJlbmNlcygpIHsKLQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG9wdGlvbmFsIGZlYXR1cmUgdmFsdWUgb2Ygd29yayBicmVha2Rvd24gZWxlbWVudCBpbiBwcmVmZXJlbmNlCi0JICogc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIC0gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRXb3JrQnJlYWtEb3duRWxlbWVudE9wdGlvbmFsKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oV09SS19CUkVBS0RPV05FTEVNRU5UX09QVElPTkFMKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgT3B0aW9uYWwgZmVhdHVyZSBvZiB3b3JrIGJyZWFrZG93biBlbGVtZW50IGluIHByZWZlcmVuY2UKLQkgKiBzdG9yZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSAtCi0JICogICAgICAgICAgICBib29sZWFuIHRydWUvZmFsc2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V29ya0JyZWFrZG93bkVsZW1lbnRPcHRpb25hbChib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShXT1JLX0JSRUFLRE9XTkVMRU1FTlRfT1BUSU9OQUwsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG11bHRpcGxlIG9jY3VycmFuY2VzIGZlYXR1cmUgdmFsdWUgb2Ygd29yayBicmVha2Rvd24gZWxlbWVudCBpbgotCSAqIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIC0gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRXb3JrQnJlYWtEb3duRWxlbWVudE11bHRpcGxlT2NjdXJyYW5jZXMoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihXT1JLX0JSRUFLRE9XTkVMRU1FTlRfTVVMVElQTEVfT0NDVVJSQU5DRVMpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHZhbHVlIGZvciBNdWx0aXBsZSBPY2N1cnJhbmNlcyBmZWF0dXJlIG9mIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgaW4KLQkgKiBwcmVmZXJlbmNlIHN0b3JlCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0KLQkgKiAgICAgICAgICAgIGJvb2xlYW4gdHJ1ZS9mYWxzZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXb3JrQnJlYWtkb3duRWxlbWVudE11bHRpcGxlT2NjdXJyYW5jZXMoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoV09SS19CUkVBS0RPV05FTEVNRU5UX01VTFRJUExFX09DQ1VSUkFOQ0VTLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBwbGFubmVkIGZlYXR1cmUgdmFsdWUgb2Ygd29yayBicmVha2Rvd24gZWxlbWVudCBpbiBwcmVmZXJlbmNlCi0JICogc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIC0gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRXb3JrQnJlYWtEb3duRWxlbWVudFBsYW5uZWQoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihXT1JLX0JSRUFLRE9XTkVMRU1FTlRfUExBTk5FRCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdmFsdWUgZm9yIFBsYW5uZWQgZmVhdHVyZSBvZiB3b3JrIGJyZWFrZG93biBlbGVtZW50IGluIHByZWZlcmVuY2UKLQkgKiBzdG9yZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSAtCi0JICogICAgICAgICAgICBib29sZWFuIHRydWUvZmFsc2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V29ya0JyZWFrZG93bkVsZW1lbnRQbGFubmVkKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFdPUktfQlJFQUtET1dORUxFTUVOVF9QTEFOTkVELCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBFdmVudERyaXZlbiBmZWF0dXJlIHZhbHVlIG9mIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgaW4gcHJlZmVyZW5jZQotCSAqIHN0b3JlCi0JICogCi0JICogQHJldHVybiB2YWx1ZSAtIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0V29ya0JyZWFrRG93bkVsZW1lbnRFdmVudERyaXZlbigpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFdPUktfQlJFQUtET1dORUxFTUVOVF9FVkVOVF9EUklWRU4pOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHZhbHVlIGZvciBFdmVudERyaXZlbiBmZWF0dXJlIG9mIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgaW4KLQkgKiBwcmVmZXJlbmNlIHN0b3JlCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0KLQkgKiAgICAgICAgICAgIGJvb2xlYW4gdHJ1ZS9mYWxzZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXb3JrQnJlYWtkb3duRWxlbWVudEV2ZW50RHJpdmVuKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFdPUktfQlJFQUtET1dORUxFTUVOVF9FVkVOVF9EUklWRU4sIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIE9uZ29pbmcgZmVhdHVyZSB2YWx1ZSBvZiB3b3JrIGJyZWFrZG93biBlbGVtZW50IGluIHByZWZlcmVuY2UKLQkgKiBzdG9yZQotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgLSBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFdvcmtCcmVha0Rvd25FbGVtZW50T25nb2luZygpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFdPUktfQlJFQUtET1dORUxFTUVOVF9PTkdPSU5HKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgT25nb2luZyBmZWF0dXJlIG9mIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgaW4gcHJlZmVyZW5jZQotCSAqIHN0b3JlCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0KLQkgKiAgICAgICAgICAgIGJvb2xlYW4gdHJ1ZS9mYWxzZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXb3JrQnJlYWtkb3duRWxlbWVudE9uZ29pbmcoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoV09SS19CUkVBS0RPV05FTEVNRU5UX09OR09JTkcsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIFJlcGVhdGFibGUgZmVhdHVyZSB2YWx1ZSBvZiB3b3JrIGJyZWFrZG93biBlbGVtZW50IGluIHByZWZlcmVuY2UKLQkgKiBzdG9yZQotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgLSBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFdvcmtCcmVha0Rvd25FbGVtZW50UmVwZWF0YWJsZSgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFdPUktfQlJFQUtET1dORUxFTUVOVF9SRVBFQVRBQkxFKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgUmVwZWF0YWJsZSBmZWF0dXJlIG9mIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgaW4KLQkgKiBwcmVmZXJlbmNlIHN0b3JlCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0KLQkgKiAgICAgICAgICAgIGJvb2xlYW4gdHJ1ZS9mYWxzZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXb3JrQnJlYWtkb3duRWxlbWVudFJlcGVhdGFibGUoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoV09SS19CUkVBS0RPV05FTEVNRU5UX1JFUEVBVEFCTEUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG9wdGlvbmFsIGZlYXR1cmUgdmFsdWUgb2Ygd29yayBicmVha2Rvd24gZWxlbWVudCBpbiBwcmVmZXJlbmNlCi0JICogc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIC0gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZXNjcmlwdG9yT3B0aW9uYWwoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihERVNDUklQVE9SX09QVElPTkFMKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgT3B0aW9uYWwgZmVhdHVyZSBvZiBkZXNjcmlwdG9yIGluIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgLQotCSAqICAgICAgICAgICAgYm9vbGVhbiB0cnVlL2ZhbHNlCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0b3JPcHRpb25hbChib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShERVNDUklQVE9SX09QVElPTkFMLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBtdWx0aXBsZSBvY2N1cnJhbmNlcyBmZWF0dXJlIHZhbHVlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZQotCSAqIHN0b3JlCi0JICogCi0JICogQHJldHVybiB2YWx1ZSAtIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RGVzY3JpcHRvck11bHRpcGxlT2NjdXJyYW5jZXMoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihERVNDUklQVE9SX01VTFRJUExFX09DQ1VSUkFOQ0VTKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgTXVsdGlwbGUgT2NjdXJyYW5jZXMgZmVhdHVyZSBvZiBkZXNjcmlwdG9yIGluIHByZWZlcmVuY2UKLQkgKiBzdG9yZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSAtCi0JICogICAgICAgICAgICBib29sZWFuIHRydWUvZmFsc2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRvck11bHRpcGxlT2NjdXJyYW5jZXMoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoREVTQ1JJUFRPUl9NVUxUSVBMRV9PQ0NVUlJBTkNFUywgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgcGxhbm5lZCBmZWF0dXJlIHZhbHVlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZSBzdG9yZQotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgLSBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldERlc2NyaXB0b3JQbGFubmVkKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oREVTQ1JJUFRPUl9QTEFOTkVEKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgUGxhbm5lZCBmZWF0dXJlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZSBzdG9yZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSAtCi0JICogICAgICAgICAgICBib29sZWFuIHRydWUvZmFsc2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRvclBsYW5uZWQoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoREVTQ1JJUFRPUl9QTEFOTkVELCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBFdmVudERyaXZlbiBmZWF0dXJlIHZhbHVlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZSBzdG9yZQotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgLSBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldERlc2NyaXB0b3JFdmVudERyaXZlbigpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKERFU0NSSVBUT1JfRVZFTlRfRFJJVkVOKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgRXZlbnREcml2ZW4gZmVhdHVyZSBvZiBkZXNjcmlwdG9yIGluIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgLQotCSAqICAgICAgICAgICAgYm9vbGVhbiB0cnVlL2ZhbHNlCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0b3JFdmVudERyaXZlbihib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShERVNDUklQVE9SX0VWRU5UX0RSSVZFTiwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgT25nb2luZyBmZWF0dXJlIHZhbHVlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZSBzdG9yZQotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgLSBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldERlc2NyaXB0b3JPbmdvaW5nKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oREVTQ1JJUFRPUl9PTkdPSU5HKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgT25nb2luZyBmZWF0dXJlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZSBzdG9yZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSAtCi0JICogICAgICAgICAgICBib29sZWFuIHRydWUvZmFsc2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRvck9uZ29pbmcoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoREVTQ1JJUFRPUl9PTkdPSU5HLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBSZXBlYXRhYmxlIGZlYXR1cmUgdmFsdWUgb2YgZGVzY3JpcHRvciBpbiBwcmVmZXJlbmNlIHN0b3JlCi0JICogCi0JICogQHJldHVybiB2YWx1ZSAtIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RGVzY3JpcHRvclJlcGVhdGFibGUoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihERVNDUklQVE9SX1JFUEVBVEFCTEUpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHZhbHVlIGZvciBSZXBlYXRhYmxlIGZlYXR1cmUgb2YgZGVzY3JpcHRvciBpbiBwcmVmZXJlbmNlIHN0b3JlCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0KLQkgKiAgICAgICAgICAgIGJvb2xlYW4gdHJ1ZS9mYWxzZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZXNjcmlwdG9yUmVwZWF0YWJsZShib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShERVNDUklQVE9SX1JFUEVBVEFCTEUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXBwbHlEZWZhdWx0VmFsdWVzRm9yQnJlYWtkb3duRWxlbWVudEF0dHJpYnV0ZXMoKSB7Ci0JCU9iamVjdFtdIG5vbkRlc2NyaXB0b3JEZWZhdWx0VmFsdWVEZWZzID0gewotCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpLAotCQkJCQkJQm9vbGVhbi52YWx1ZU9mKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtEb3duRWxlbWVudEV2ZW50RHJpdmVuKCkpIH0sCi0JCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCQkJCQkuZ2V0V29ya0JyZWFrRG93bkVsZW1lbnRNdWx0aXBsZU9jY3VycmFuY2VzKCkpIH0sCi0JCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCQkJCQkuZ2V0V29ya0JyZWFrRG93bkVsZW1lbnRPbmdvaW5nKCkpIH0sCi0JCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpLAotCQkJCQkJQm9vbGVhbi52YWx1ZU9mKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtEb3duRWxlbWVudE9wdGlvbmFsKCkpIH0sCi0JCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2YoTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJCQkJLmdldFdvcmtCcmVha0Rvd25FbGVtZW50UGxhbm5lZCgpKSB9LAotCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2YoTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJCQkJLmdldFdvcmtCcmVha0Rvd25FbGVtZW50UmVwZWF0YWJsZSgpKSB9IH07Ci0JCUVDbGFzc1tdIG5vbkRlc2NyaXB0b3JUeXBlcyA9IHsgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGhhc2UoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRJdGVyYXRpb24oKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1pbGVzdG9uZSgpIH07Ci0KLQkJT2JqZWN0W10gZGVzY3JpcHRvckRlZmF1bHRWYWx1ZURlZnMgPSB7Ci0JCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2YoTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJCQkJLmdldERlc2NyaXB0b3JFdmVudERyaXZlbigpKSB9LAotCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9IYXNNdWx0aXBsZU9jY3VycmVuY2VzKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2YoTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJCQkJLmdldERlc2NyaXB0b3JNdWx0aXBsZU9jY3VycmFuY2VzKCkpIH0sCi0JCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCQkJCQkuZ2V0RGVzY3JpcHRvck9uZ29pbmcoKSkgfSwKLQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2YoTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJCQkJLmdldERlc2NyaXB0b3JPcHRpb25hbCgpKSB9LAotCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpLAotCQkJCQkJQm9vbGVhbi52YWx1ZU9mKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCQkJCS5nZXREZXNjcmlwdG9yUGxhbm5lZCgpKSB9LAotCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2YoTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJCQkJLmdldERlc2NyaXB0b3JSZXBlYXRhYmxlKCkpIH0gfTsKLQkJRUNsYXNzW10gZGVzY3JpcHRvclR5cGVzID0geyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcigpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkgfTsKLQotCQlPYmplY3RbXSBkZWZhdWx0VmFsdWVEZWZzID0gewotCQkJCW5ldyBPYmplY3RbXSB7IG5vbkRlc2NyaXB0b3JUeXBlcywKLQkJCQkJCW5vbkRlc2NyaXB0b3JEZWZhdWx0VmFsdWVEZWZzIH0sCi0JCQkJbmV3IE9iamVjdFtdIHsgZGVzY3JpcHRvclR5cGVzLCBkZXNjcmlwdG9yRGVmYXVsdFZhbHVlRGVmcyB9IH07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZhdWx0VmFsdWVEZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3RbXSBkZWZhdWx0VmFsdWVEZWYgPSAoT2JqZWN0W10pIGRlZmF1bHRWYWx1ZURlZnNbaV07Ci0JCQlFQ2xhc3NbXSB0eXBlcyA9IChFQ2xhc3NbXSkgZGVmYXVsdFZhbHVlRGVmWzBdOwotCQkJT2JqZWN0W10gZmVhdHVyZURlZmF1bHRWYWx1ZURlZnMgPSAoT2JqZWN0W10pIGRlZmF1bHRWYWx1ZURlZlsxXTsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgZmVhdHVyZURlZmF1bHRWYWx1ZURlZnMubGVuZ3RoOyBrKyspIHsKLQkJCQlPYmplY3RbXSBmZWF0dXJlRGVmYXVsdFZhbHVlID0gKE9iamVjdFtdKSBmZWF0dXJlRGVmYXVsdFZhbHVlRGVmc1trXTsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVEZWZhdWx0VmFsdWVbMF07Ci0JCQkJT2JqZWN0IGRlZmF1bHRWYWx1ZSA9IGZlYXR1cmVEZWZhdWx0VmFsdWVbMV07Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCB0eXBlcy5sZW5ndGg7IGorKykgewotCQkJCQlFQ2xhc3MgdHlwZSA9IHR5cGVzW2pdOwotCQkJCQlEZWZhdWx0VmFsdWVNYW5hZ2VyLklOU1RBTkNFLnNldERlZmF1bHRWYWx1ZSh0eXBlLCBmZWF0dXJlLAotCQkJCQkJCWRlZmF1bHRWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ByZWZlcmVuY2VzL1JlY2VudGx5T3BlbmVkTGlicmFyeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ByZWZlcmVuY2VzL1JlY2VudGx5T3BlbmVkTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWVhMzE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcmVmZXJlbmNlcy9SZWNlbnRseU9wZW5lZExpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci0KLS8qKgotICogTW9kZWxzIGEgcmVjZW50bHkgb3BlbmVkIG1ldGhvZCBsaWJyYXJ5IHByZWZlcmVuY2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICovCi1wdWJsaWMgY2xhc3MgUmVjZW50bHlPcGVuZWRMaWJyYXJ5IHsKLQotCXByaXZhdGUgVVJJIHVyaTsKLQkKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQotCXByaXZhdGUgU3RyaW5nIHBhdGg7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSZWNlbnRseU9wZW5lZExpYnJhcnkoU3RyaW5nIHVyaSkgewotCQl0cnkgewotCQkJdGhpcy51cmkgPSBuZXcgVVJJKHVyaSk7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh0aGlzLnVyaSk7Ci0JCQl0aGlzLm5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLQkJCXRoaXMucGF0aCA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaWJyYXJ5IG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpYnJhcnkgVVJJLgotCSAqLwotCXB1YmxpYyBVUkkgZ2V0VVJJKCkgewotCQlyZXR1cm4gdXJpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBsaWJyYXJ5IHBhdGguCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotCQlyZXR1cm4gcGF0aDsKLQl9CQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk4NThhMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgcHJlZmVyZW5jZSBzdXBwb3J0IGZvciBtYW5hZ2luZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcm92aWRlcnMvRGVsZWdhdGVMYWJlbFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJvdmlkZXJzL0RlbGVnYXRlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDBmYjE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcm92aWRlcnMvRGVsZWdhdGVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQlwcml2YXRlIElJdGVtTGFiZWxQcm92aWRlciBpdGVtTGFiZWxQcm92aWRlcjsKLQotCXB1YmxpYyBEZWxlZ2F0ZUxhYmVsUHJvdmlkZXIoSUl0ZW1MYWJlbFByb3ZpZGVyIGl0ZW1MYWJlbFByb3ZpZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlbUxhYmVsUHJvdmlkZXIgPSBpdGVtTGFiZWxQcm92aWRlcjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBpdGVtTGFiZWxQcm92aWRlci5nZXRUZXh0KGVsZW1lbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIEV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKGl0ZW1MYWJlbFByb3ZpZGVyLmdldEltYWdlKGVsZW1lbnQpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdXRpbC9Db252ZXJ0R3VpZGFuY2VUeXBlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdXRpbC9Db252ZXJ0R3VpZGFuY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NmU2NjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3V0aWwvQ29udmVydEd1aWRhbmNlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbC5Db250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JSW5wdXRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JbnB1dERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3REaWFsb2c7Ci0KLS8qKgotICogY2xhc3MgdG8gY29udmVydCBndWlkYW5jZSB0eXBlcwotICogCi0gKiBAYXV0aG9yID8/PwotICogQHNpY25lIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIENvbnZlcnRHdWlkYW5jZVR5cGUgewotCi0Jc3RhdGljIElWYWxpZGF0b3IgdmFsaWRhdG9yOwotCXByaXZhdGUgc3RhdGljIGludFtdIGNvbXBhdGlibGVHdWlkYW5jZXMgPSB7IFVtYVBhY2thZ2UuQ09OQ0VQVCwKLQkvLyBVbWFQYWNrYWdlLkNIRUNLTElTVCwKLQkJCS8vIFVtYVBhY2thZ2UuRVhBTVBMRSwKLQkJCVVtYVBhY2thZ2UuR1VJREVMSU5FLAotCQkJLy8gVW1hUGFja2FnZS5FU1RJTUFURSwKLQkJCS8vIFVtYVBhY2thZ2UuRVNUSU1BVElOR19NRVRSSUMsCi0JCQkvLyBVbWFQYWNrYWdlLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlMsCi0JCQkvLyBVbWFQYWNrYWdlLlJFUE9SVCwKLQkJCS8vIFVtYVBhY2thZ2UuVEVNUExBVEUsCi0JCQlVbWFQYWNrYWdlLlNVUFBPUlRJTkdfTUFURVJJQUwsCi0JLy8gVW1hUGFja2FnZS5UT09MX01FTlRPUiwKLQkvLyBVbWFQYWNrYWdlLldISVRFUEFQRVIsCi0JLy8gVW1hUGFja2FnZS5URVJNX0RFRklOSVRJT04sCi0JLy8gVW1hUGFja2FnZS5QUkFDVElDRSwKLQkvLyBVbWFQYWNrYWdlLlJFVVNBQkxFX0FTU0VUCi0JfTsKLQotCXByaXZhdGUgc3RhdGljIExpc3QgY29tcGF0aWJsZUd1aWRhbmNlc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0Jc3RhdGljIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wYXRpYmxlR3VpZGFuY2VzLmxlbmd0aDsgaSsrKQotCQkJY29tcGF0aWJsZUd1aWRhbmNlc0xpc3QuYWRkKG5ldyBJbnRlZ2VyKGNvbXBhdGlibGVHdWlkYW5jZXNbaV0pKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEd1aWRhbmNlIGNvbnZlcnRHdWlkYW5jZShHdWlkYW5jZSBvbGRHdWlkYW5jZSwgU2hlbGwgc2hlbGwsCi0JCQlEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBjb252ZXJ0R3VpZGFuY2Uob2xkR3VpZGFuY2UsIHNoZWxsLCBjb21tYW5kLCBudWxsKTsKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgR3VpZGFuY2UgY29udmVydEd1aWRhbmNlKEd1aWRhbmNlIG9sZEd1aWRhbmNlLCBTaGVsbCBzaGVsbCwKLQkJCQlEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCBjb21tYW5kLCBFQ2xhc3MgbmV3VHlwZSkgewotCQlpZiAobmV3VHlwZSA9PSBudWxsKSB7Ci0JCWlmIChzaGVsbCA9PSBudWxsKQotCQkJc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQlMaXN0RGlhbG9nIGRsZyA9IG5ldyBMaXN0RGlhbG9nKHNoZWxsKTsKLQkJZGxnLnNldEhlaWdodEluQ2hhcnMoNSk7Ci0JCWRsZy5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQlkbGcuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCXN3aXRjaCAoKChJbnRlZ2VyKSBlbGVtZW50KS5pbnRWYWx1ZSgpKSB7Ci0JCQkJLy8gVE9ETzogcmVmYWN0b3IgdGhlc2Ugc3RyaW5ncyAoYW5kIHRoaXMgd2hvbGUgZGlhbG9nKSBpbnRvCi0JCQkJLy8gbGlicmFyeS51aQotCQkJCWNhc2UgVW1hUGFja2FnZS5DT05DRVBUOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy5jb25jZXB0X3RleHQ7IAotCQkJCWNhc2UgVW1hUGFja2FnZS5DSEVDS0xJU1Q6Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLmNoZWNrbGlzdF90ZXh0OyAKLQkJCQljYXNlIFVtYVBhY2thZ2UuRVhBTVBMRToKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMuZXhhbXBsZV90ZXh0OyAKLQkJCQljYXNlIFVtYVBhY2thZ2UuR1VJREVMSU5FOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy5ndWlkZWxpbmVfdGV4dDsgCi0JCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLmVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0OwotCQkJCWNhc2UgVW1hUGFja2FnZS5SRVBPUlQ6Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLnJlcG9ydF90ZXh0OyAKLQkJCQljYXNlIFVtYVBhY2thZ2UuVEVNUExBVEU6Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLnRlbXBsYXRlX3RleHQ7IAotCQkJCWNhc2UgVW1hUGFja2FnZS5TVVBQT1JUSU5HX01BVEVSSUFMOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy5zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dDsKLQkJCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9NRU5UT1I6Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLnRvb2xNZW50b3JfdGV4dDsKLQkJCQljYXNlIFVtYVBhY2thZ2UuV0hJVEVQQVBFUjoKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMud2hpdGVwYXBlcl90ZXh0OwotCQkJCWNhc2UgVW1hUGFja2FnZS5URVJNX0RFRklOSVRJT046Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLnRlcm1EZWZpbml0aW9uX3RleHQ7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy5wcmFjdGljZV90ZXh0OyAKLQkJCQljYXNlIFVtYVBhY2thZ2UuUkVVU0FCTEVfQVNTRVQ6Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLnJldXNhYmxlQXNzZXRfdGV4dDsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy51bmtub3duR3VpZGFuY2VfdGV4dDsKLQkJCQl9Ci0KLQkJCX0KLQkJfSk7Ci0JCUxpc3QgbmV3R3VpZGFuY2VUeXBlTGlzdCA9IGdldFZhbGlkTmV3R3VpZGFuY2VUeXBlcyhvbGRHdWlkYW5jZSk7Ci0JCWlmIChuZXdHdWlkYW5jZVR5cGVMaXN0ID09IG51bGwpIHsKLQkJCUxpYnJhcnlVSVBsdWdpbgotCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuY29udmVydEd1aWRhbmNlRXJyb3JfdGl0bGUsCi0JCQkJCQkJTGlicmFyeVJlc291cmNlcy51bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX21zZywKLQkJCQkJCQlOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLnVuc3VwcG9ydGVkR3VpZGFuY2VUeXBlRXJyb3JfcmVhc29uLCBTdHJVdGlsLnRvTG93ZXIoVG5nVXRpbC5nZXRUeXBlVGV4dChvbGRHdWlkYW5jZSkpKSk7IAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZGxnLnNldElucHV0KG5ld0d1aWRhbmNlVHlwZUxpc3QpOwotCQlkbGcuc2V0VGl0bGUoTGlicmFyeVJlc291cmNlcy5jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGl0bGUpOwotCQlkbGcuc2V0TWVzc2FnZShMaWJyYXJ5UmVzb3VyY2VzLmNvbnZlcnRHdWlkYW5jZURpYWxvZ190ZXh0KTsKLQkJaWYgKGRsZy5vcGVuKCkgPT0gRGlhbG9nLkNBTkNFTCkKLQkJCXJldHVybiBudWxsOwotCi0JCU9iamVjdFtdIHNlbGVjdGlvblJlc3VsdCA9IGRsZy5nZXRSZXN1bHQoKTsKLQkJaWYgKHNlbGVjdGlvblJlc3VsdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBjaG9zZW5HdWlkYW5jZSA9ICgoSW50ZWdlcikgc2VsZWN0aW9uUmVzdWx0WzBdKS5pbnRWYWx1ZSgpOwotCQkKLS8vCQlHdWlkYW5jZSBuZXdHdWlkYW5jZSA9IGRvQ29udmVydChvbGRHdWlkYW5jZSwgY2hvc2VuR3VpZGFuY2UsIGNvbW1hbmQpOwotCQkKLQkJbmV3VHlwZSA9IGdldEd1aWRhbmNlVHlwZShjaG9zZW5HdWlkYW5jZSk7Ci0JCX0KLQkJCi0JCWlmKG5ld1R5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJVHlwZUNvbnZlcnRlci5UeXBlQ29udmVyc2lvbkNvbW1hbmQgY21kID0gVHlwZUNvbnZlcnRlci5jcmVhdGVUeXBlQ29udmVyc2lvbkNvbW1hbmQob2xkR3VpZGFuY2UsIG5ld1R5cGUsIG51bGwsIG51bGwsIHRydWUsIHRydWUpOwotCQl0cnkgewotCQkJaWYoIWNtZC5nZXRJbGxlZ2FsUmVmZXJlbmNlcnMoKS5pc0VtcHR5KCkpIHsKLQkJCQkvLyB0eXBlIGNvbnZlcnNpb24gd2lsbCByZW1vdmUgc29tZSBpbGxlZ2FsIHJlZmVyZW5jZXMKLQkJCQkvLyBjb25maXJtIHdpdGggdXNlciBiZWZvcmUgY29udGludWUKLQkJCQkvLwotCQkJCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNtZC5nZXRJbGxlZ2FsUmVmZXJlbmNlcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkvLyBkb24ndCBzaG93IHByZWRlZmluZWQgZWxlbWVudAotCQkJCQkvLwotCQkJCQlpZighVG5nVXRpbC5pc1ByZWRlZmluZWQoZSkpIHsKLQkJCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5lbGVtZW50VHlwZV90ZXh0LCBlLmVDbGFzcygpLmdldE5hbWUoKSwgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGUpKTsgCi0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLAotCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgbXNnLAotCQkJCQkJCQludWxsKTsKLQkJCQkJCW11bHRpU3RhdHVzLmFkZChzdGF0dXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChtdWx0aVN0YXR1cy5nZXRDaGlsZHJlbigpLmxlbmd0aCA+IDAgJiYKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQkJTGlicmFyeVJlc291cmNlcy5jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmNvbmZpcm1fcmVtb3ZlX3JlZmVyZW5jZXNfdGV4dCwKLQkJCQkJCQkJbXVsdGlTdGF0dXMpID09IERpYWxvZy5DQU5DRUwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCi0JCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShjbWQuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSwgc2hlbGwpOwotCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXkoTGlicmFyeVJlc291cmNlcy5jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGl0bGUsIHN0YXR1cyk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQljbWQuZXhlY3V0ZSgpOwotCQkJR3VpZGFuY2UgbmV3R3VpZGFuY2UgPSAoR3VpZGFuY2UpIGNtZC5nZXRSZXN1bHQoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkJLy8gc2F2ZSBtb2RpZmllZCByZXNvdXJjZXMKLQkJCS8vCi0JCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldEN1cnJlbnRQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJdHJ5IHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjbWQuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJfQotCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkKLQkJCQlpZihDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihuZXdHdWlkYW5jZSkpIHsKLQkJCQkJcGVyc2lzdGVyLmFkanVzdExvY2F0aW9uKG5ld0d1aWRhbmNlLmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpKTsKLQkJCQl9CQkJCQotCi0JCQkJY21kLmNvcHlSZXNvdXJjZXMoKTsKLQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuY29udmVydEd1aWRhbmNlRXJyb3JfdGl0bGUsCi0JCQkJCQlOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLnNhdmVDb252ZXJ0ZWRHdWlkYW5jZUVycm9yX21zZywKLQkJCQkJCQkJbmV3R3VpZGFuY2UuZ2V0TmFtZSgpKSwKLQkJCQkJCQkJTGlicmFyeVJlc291cmNlcy5lcnJvcl9yZWFzb24sIGUpOwotCQkJfQotCi0JCQlyZXR1cm4gbmV3R3VpZGFuY2U7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZihjbWQgIT0gbnVsbCkgewotCQkJCXRyeSB7IGNtZC5kaXNwb3NlKCk7IH0gY2F0Y2goRXhjZXB0aW9uIGUpIHt9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2xkR3VpZGFuY2UKLQkgKiBAcGFyYW0gbmV3R3VpZGFuY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShHdWlkYW5jZSBvbGRHdWlkYW5jZSwgR3VpZGFuY2UgbmV3R3VpZGFuY2UpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQkJCi0JCXZhbGlkYXRvciA9IG5ldyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3Iob2xkR3VpZGFuY2UuZUNvbnRhaW5lcigpCi0JCQkJLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwKLQkJCQkoQ29udGVudEVsZW1lbnQpIG5ld0d1aWRhbmNlLCBuZXcgVmFsaWRhdG9yRmFjdG9yeS5UeXBlRmlsdGVyKG5ld0d1aWRhbmNlKSk7Ci0JCQotCQlTdHJpbmcgbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQobmV3R3VpZGFuY2UuZ2V0TmFtZSgpKTsKLQkJCi0JCWlmIChtc2cgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZlYXR1cmVUeHQgPSBUbmdVdGlsLmdldEZlYXR1cmVUZXh0KFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJCVN0cmluZyB0aXRsZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGl0bGU7IAotCQkJU3RyaW5nIGRsZ01zZyA9IE5MUy5iaW5kKAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RleHQsCi0JCQkJCVN0clV0aWwudG9Mb3dlcihmZWF0dXJlVHh0KSwgbmV3R3VpZGFuY2UuZ2V0TmFtZSgpKTsKLQkJCVN0cmluZyBjdXJyZW50VmFsdWUgPSAoU3RyaW5nKSBuZXdHdWlkYW5jZS5lR2V0KFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQotCQkJSUlucHV0VmFsaWRhdG9yIGlucHV0VmFsaWRhdG9yID0gbmV3IElJbnB1dFZhbGlkYXRvcigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJCQkJcmV0dXJuIHZhbGlkYXRvci5pc1ZhbGlkKG5ld1RleHQpOwotCQkJCX0KLQkJCX07Ci0KLQkJCUlucHV0RGlhbG9nIGlucHV0RGxnID0gbmV3IElucHV0RGlhbG9nKAotCQkJCQlNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCksIHRpdGxlLCBkbGdNc2csIGN1cnJlbnRWYWx1ZSwKLQkJCQkJaW5wdXRWYWxpZGF0b3IpOwotCQkJaWYgKGlucHV0RGxnLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gaW5wdXREbGcuZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRUNsYXNzIGdldEd1aWRhbmNlVHlwZShpbnQgbmV3R3VpZGFuY2VUeXBlKSB7Ci0JCXN3aXRjaCAobmV3R3VpZGFuY2VUeXBlKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05DRVBUOgotCQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OQ0VQVDsKLQkJY2FzZSBVbWFQYWNrYWdlLkNIRUNLTElTVDoKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNIRUNLTElTVDsKLQkJY2FzZSBVbWFQYWNrYWdlLkVYQU1QTEU6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FWEFNUExFOwotCQljYXNlIFVtYVBhY2thZ2UuR1VJREVMSU5FOgotCQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1VJREVMSU5FOwotCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlM7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRVBPUlQ6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5SRVBPUlQ7Ci0JCWNhc2UgVW1hUGFja2FnZS5URU1QTEFURToKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRFTVBMQVRFOwotCQljYXNlIFVtYVBhY2thZ2UuU1VQUE9SVElOR19NQVRFUklBTDoKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlNVUFBPUlRJTkdfTUFURVJJQUw7Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MX01FTlRPUjoKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRPT0xfTUVOVE9SOwotCQljYXNlIFVtYVBhY2thZ2UuV0hJVEVQQVBFUjoKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldISVRFUEFQRVI7Ci0JCWNhc2UgVW1hUGFja2FnZS5URVJNX0RFRklOSVRJT046Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5URVJNX0RFRklOSVRJT047Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRToKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFOwotCQljYXNlIFVtYVBhY2thZ2UuUkVVU0FCTEVfQVNTRVQ6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5SRVVTQUJMRV9BU1NFVDsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgR3VpZGFuY2UgY3JlYXRlTmV3R3VpZGFuY2UoaW50IG5ld0d1aWRhbmNlVHlwZSkgewotCQlzd2l0Y2ggKG5ld0d1aWRhbmNlVHlwZSkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OQ0VQVDoKLQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25jZXB0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DSEVDS0xJU1Q6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2hlY2tsaXN0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FWEFNUExFOgotCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUV4YW1wbGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdVSURFTElORToKLQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkZWxpbmUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRVBPUlQ6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVwb3J0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5URU1QTEFURToKLQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZW1wbGF0ZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuU1VQUE9SVElOR19NQVRFUklBTDoKLQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfTUVOVE9SOgotCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRvb2xNZW50b3IoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldISVRFUEFQRVI6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2hpdGVwYXBlcigpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OOgotCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRlcm1EZWZpbml0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRToKLQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmFjdGljZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUkVVU0FCTEVfQVNTRVQ6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmV1c2FibGVBc3NldCgpOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0VmFsaWROZXdHdWlkYW5jZVR5cGVzKEd1aWRhbmNlIG9sZEd1aWRhbmNlKSB7Ci0JCWlmIChvbGRHdWlkYW5jZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUludGVnZXIgb2xkR3VpZGFuY2VDbGFzc0lEID0gbmV3IEludGVnZXIob2xkR3VpZGFuY2UuZUNsYXNzKCkKLQkJCQkuZ2V0Q2xhc3NpZmllcklEKCkpOwotCQlpZiAoIWNvbXBhdGlibGVHdWlkYW5jZXNMaXN0LmNvbnRhaW5zKG9sZEd1aWRhbmNlQ2xhc3NJRCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTGlzdCBndWlkYW5jZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcGF0aWJsZUd1aWRhbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSW50ZWdlciBjb21wYXRpYmxlR3VpZGFuY2VUeXBlQ2xhc3NJRCA9IG5ldyBJbnRlZ2VyKAotCQkJCQljb21wYXRpYmxlR3VpZGFuY2VzW2ldKTsKLQkJCWlmICghb2xkR3VpZGFuY2VDbGFzc0lELmVxdWFscyhjb21wYXRpYmxlR3VpZGFuY2VUeXBlQ2xhc3NJRCkpCi0JCQkJZ3VpZGFuY2VMaXN0LmFkZChjb21wYXRpYmxlR3VpZGFuY2VUeXBlQ2xhc3NJRCk7Ci0JCX0KLQkJcmV0dXJuIGd1aWRhbmNlTGlzdDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdXRpbC9UeXBlQ29udmVydGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdXRpbC9UeXBlQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTRhYmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3V0aWwvVHlwZUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlNldENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5OZXN0ZWRDb21tYW5kRXhjZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXNzZW5nZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkNvbnRlbnRSZXNvdXJjZVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklJbnB1dFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklucHV0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFR5cGVDb252ZXJ0ZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgYWN0aXZpdHlGZWF0dXJlQ29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkgewotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKLQkJCWlmKGFyZzAgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUykgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0JCQotCX07Ci0JCi0JLyoqCi0JICogQ29udmVydHMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gYSBvYmplY3Qgb2YgbmV3IHR5cGUgc3BlY2lmaWVkIGJ5IDxjb2RlPm5ld1R5cGU8L2NvZGU+IHdoaWxlIHN0aWxsCi0JICogcHJlc2VydmluZyBhcyBtYW55IGF0dHJpYnV0ZXMgYW5kIHJlbGF0aW9uc2hpcHMgYXMgcG9zc2libGUKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIG5ld1R5cGUKLQkgKiBAcGFyYW0gb2xkRmVhdHVyZVRvTmV3RmVhdHVyZU1hcCBtYXAgb2YgZmVhdHVyZSBvZiA8Y29kZT5vYmplY3Q8L2NvZGU+IHRvIGZlYXR1cmUgb2YgPGNvZGU+bmV3VHlwZTwvY29kZT4KLQkgKiBAcmV0dXJuIG5ldyBvYmplY3Qgb2YgdHlwZSA8Y29kZT5uZXdUeXBlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRU9iamVjdCBjb252ZXJ0KEVPYmplY3Qgb2JqZWN0LCBFQ2xhc3MgbmV3VHlwZSwKLQkJCU1hcCBvbGRGZWF0dXJlVG9OZXdGZWF0dXJlTWFwLCBDb21wYXJhdG9yIGZlYXR1cmVDb21wYXJhdG9yLCBTZXQgbW9kaWZpZWRSZXNvdXJjZXMpIAotCXsKLQkJVHlwZUNvbnZlcnNpb25Db21tYW5kIGNtZCA9IGNyZWF0ZVR5cGVDb252ZXJzaW9uQ29tbWFuZChvYmplY3QsIG5ld1R5cGUsIG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAsIGZlYXR1cmVDb21wYXJhdG9yKTsKLQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzID0gY21kLmdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCWlmKCFyZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlSZXNvdXJjZVtdIHJlc291cmNlQXJyYXkgPSBuZXcgUmVzb3VyY2VbcmVzb3VyY2VzLnNpemUoKV07Ci0JCQlyZXNvdXJjZXMudG9BcnJheShyZXNvdXJjZUFycmF5KTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gU2VydmljZXMuZ2V0QWNjZXNzQ29udHJvbGxlcigpLmNoZWNrTW9kaWZ5KHJlc291cmNlQXJyYXksIEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKS5nZXRVSUNvbnRleHQoKSk7Ci0JCQlpZighc3RhdHVzLmlzT0soKSkgewotCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoTGlicmFyeVJlc291cmNlcy5jb252ZXJ0QWN0aXZpdHlFcnJvcl90aXRsZSwgbnVsbCwgc3RhdHVzKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJY21kLmV4ZWN1dGUoKTsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbChjbWQuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSk7Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNtZC5nZXRSZXN1bHQoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWNtZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVzb3VyY2VDb3B5VGFzayB7Ci0JCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lcjsKLQkJTWV0aG9kRWxlbWVudCBvd25lcjsKLQkJU3RyaW5nIGNvbnRlbnQ7Ci0JCVN0cmluZyBjb250ZW50UGF0aDsKLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gc2Nhbm5lcgotCQkgKiBAcGFyYW0gb3duZXIKLQkJICogQHBhcmFtIGNvbnRlbnQKLQkJICogQHBhcmFtIGNvbnRlbnRQYXRoCi0JCSAqLwotCQlwdWJsaWMgUmVzb3VyY2VDb3B5VGFzayhDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXIsIE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBjb250ZW50LCBTdHJpbmcgY29udGVudFBhdGgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNjYW5uZXIgPSBzY2FubmVyOwotCQkJdGhpcy5vd25lciA9IG93bmVyOwotCQkJdGhpcy5jb250ZW50ID0gY29udGVudDsKLQkJCXRoaXMuY29udGVudFBhdGggPSBjb250ZW50UGF0aDsKLQkJfQkKLQkJCQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUeXBlQ29udmVyc2lvbkNvbW1hbmQgZXh0ZW5kcyBDb21wb3VuZENvbW1hbmQgaW1wbGVtZW50cyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JCXByaXZhdGUgQ29sbGVjdGlvbjw/PiByZXN1bHQ7Ci0JCXByaXZhdGUgRU9iamVjdCBvYmplY3Q7Ci0JCXByaXZhdGUgSGFzaFNldDxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JCXByaXZhdGUgYm9vbGVhbiBnb3RNb2RpZmllZFJlc291cmNlczsKLQkJcHJpdmF0ZSBMaXN0PFJlc291cmNlQ29weVRhc2s+IHJlc291cmNlQ29weVRhc2tzOwotCQlwcml2YXRlIFJlc291cmNlIHJlc291cmNlOwotCQlwcml2YXRlIENvbGxlY3Rpb24gaWxsZWdhbFJlZmVyZW5jZXJzOwotCQlwcml2YXRlIE5lc3RlZENvbW1hbmRFeGNlY3V0b3IgbmVzdGVkQ29tbWFuZEV4Y2VjdXRvcjsKLQotCQkvKioKLQkJICogQHBhcmFtIG9iamVjdAotCQkgKi8KLQkJcHVibGljIFR5cGVDb252ZXJzaW9uQ29tbWFuZChFT2JqZWN0IG9iamVjdCkgewotCQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCQkJcmVzb3VyY2UgPSBvYmplY3QuZVJlc291cmNlKCk7Ci0JCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJCXJlc291cmNlQ29weVRhc2tzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZUNvcHlUYXNrPigpOwotCQkJbmVzdGVkQ29tbWFuZEV4Y2VjdXRvciA9IG5ldyBOZXN0ZWRDb21tYW5kRXhjZWN1dG9yKHRoaXMpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpZihpbGxlZ2FsUmVmZXJlbmNlcnMgIT0gbnVsbCkgewotCQkJCWlsbGVnYWxSZWZlcmVuY2Vycy5jbGVhcigpOwotCQkJfQotCQkJaWYobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCQl9Ci0JCQlpZihyZXNvdXJjZUNvcHlUYXNrcyAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2VDb3B5VGFza3MuY2xlYXIoKTsKLQkJCX0KLQkJCWlmKG5lc3RlZENvbW1hbmRFeGNlY3V0b3IgIT0gbnVsbCkgewotCQkJCW5lc3RlZENvbW1hbmRFeGNlY3V0b3IuZGlzcG9zZSgpOwotCQkJfQotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQl9Ci0JCQkJCi0JCS8qKgotCQkgKiBHZXRzIHJlZmVyZW5jZXJzIHRoYXQgYmVjb21lIGlsbGVnYWwgYWZ0ZXIgdGhlIHR5cGUgY29udmVyc2lvbgotCQkgKiAKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb24gZ2V0SWxsZWdhbFJlZmVyZW5jZXJzKCkgewotCQkJaWYoaWxsZWdhbFJlZmVyZW5jZXJzID09IG51bGwpIHsKLQkJCQlnZXRNb2RpZmllZFJlc291cmNlcygpOwotCQkJfQotCQkJcmV0dXJuIGlsbGVnYWxSZWZlcmVuY2VyczsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgY29weVJlc291cmNlcygpIHsKLQkJCWlmKCFyZXNvdXJjZUNvcHlUYXNrcy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKFJlc291cmNlQ29weVRhc2sgdCA6IHJlc291cmNlQ29weVRhc2tzKSB7Ci0JCQkJCUZpbGUgbmV3UmVzb3VyY2VQYXRoID0gbmV3IEZpbGUoUmVzb3VyY2VIZWxwZXIuZ2V0QWJzb2x1dGVFbGVtZW50UmVzb3VyY2VQYXRoKHQub3duZXIpKTsKLQkJCQkJdC5zY2FubmVyLnNldFRhcmdldFJvb3RQYXRoKG5ld1Jlc291cmNlUGF0aCk7Ci0JCQkJCWlmKHQuY29udGVudCAhPSBudWxsKSB7Ci0JCQkJCQl0LnNjYW5uZXIucmVzb2x2ZVJlc291cmNlcyh0Lm93bmVyLCB0LmNvbnRlbnQsIHQuY29udGVudFBhdGgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZm9yIChFQXR0cmlidXRlIGF0dHJpYnV0ZSA6IHQub3duZXIuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKSkgewotCQkJCQkJCU9iamVjdCB2YWx1ZSA9IHQub3duZXIuZUdldChhdHRyaWJ1dGUpOwotCQkJCQkJCWlmKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCQkJCXQuc2Nhbm5lci5yZXNvbHZlUmVzb3VyY2VzKHQub3duZXIsIChTdHJpbmcpIHZhbHVlLCB0LmNvbnRlbnRQYXRoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJCWlmKCFnb3RNb2RpZmllZFJlc291cmNlcykgewotCQkJCWlsbGVnYWxSZWZlcmVuY2VycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29tbWFuZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUNvbW1hbmQgY21kID0gKENvbW1hbmQpIGl0ZXIubmV4dCgpOwotCQkJCQlpZihjbWQgaW5zdGFuY2VvZiBSZW1vdmVDb21tYW5kKSB7Ci0JCQkJCQlSZW1vdmVDb21tYW5kIHJlbW92ZUNvbW1hbmQgPSAoUmVtb3ZlQ29tbWFuZCkgY21kOwotCQkJCQkJRU9iamVjdCBvd25lciA9IHJlbW92ZUNvbW1hbmQuZ2V0T3duZXIoKTsKLQkJCQkJCVJlc291cmNlIG93bmVyUmVzb3VyY2UgPSBvd25lci5lUmVzb3VyY2UoKTsKLQkJCQkJCWlmKG93bmVyUmVzb3VyY2UgIT0gbnVsbCAmJiBvd25lclJlc291cmNlICE9IHJlc291cmNlKSB7Ci0JCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKG93bmVyUmVzb3VyY2UpOwotCQkJCQkJfQotCQkJCQkJaWYob3duZXJSZXNvdXJjZSAhPSBudWxsICYmIG93bmVyICE9IG9iamVjdCAmJiAhVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KG93bmVyLCBvYmplY3QpKSB7Ci0JCQkJCQkJaWxsZWdhbFJlZmVyZW5jZXJzLmFkZChvd25lcik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihjbWQgaW5zdGFuY2VvZiBTZXRDb21tYW5kKSB7Ci0JCQkJCQlTZXRDb21tYW5kIHNldENvbW1hbmQgPSAoU2V0Q29tbWFuZCkgY21kOwotCQkJCQkJRU9iamVjdCBvd25lciA9IHNldENvbW1hbmQuZ2V0T3duZXIoKTsKLQkJCQkJCVJlc291cmNlIG93bmVyUmVzb3VyY2UgPSBvd25lci5lUmVzb3VyY2UoKTsKLQkJCQkJCWlmKG93bmVyUmVzb3VyY2UgIT0gbnVsbCAmJiBvd25lclJlc291cmNlICE9IHJlc291cmNlICYmIHNldENvbW1hbmQuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCQlFT2JqZWN0IHZhbHVlID0gKEVPYmplY3QpIHNldENvbW1hbmQuZ2V0VmFsdWUoKTsKLQkJCQkJCQlpZih2YWx1ZSAhPSBvYmplY3QgfHwgIVVtYVV0aWwuaXNDb250YWluZWRCeSh2YWx1ZSwgb2JqZWN0KSkgewotCQkJCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQob3duZXJSZXNvdXJjZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYob3duZXJSZXNvdXJjZSAhPSBudWxsICYmIG93bmVyICE9IG9iamVjdCAmJiAhVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KG93bmVyLCBvYmplY3QpCi0JCQkJCQkJCSYmIHNldENvbW1hbmQuZ2V0VmFsdWUoKSA9PSBzZXRDb21tYW5kLmdldEZlYXR1cmUoKS5nZXREZWZhdWx0VmFsdWUoKSkgewotCQkJCQkJCWlsbGVnYWxSZWZlcmVuY2Vycy5hZGQob3duZXIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWdvdE1vZGlmaWVkUmVzb3VyY2VzID0gdHJ1ZTsKLQkJCX0KLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbChuZXN0ZWRDb21tYW5kRXhjZWN1dG9yLmdldE1vZGlmaWVkUmVzb3VyY2VzKCkpOwkJCi0JCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBzZXRSZXN1bHQoQ29sbGVjdGlvbjw/PiByZXN1bHQpIHsKLQkJCXRoaXMucmVzdWx0ID0gcmVzdWx0OwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCNnZXRSZXN1bHQoKQotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb248Pz4gZ2V0UmVzdWx0KCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQlzdXBlci5leGVjdXRlKCk7CQkJCi0JCQluZXN0ZWRDb21tYW5kRXhjZWN1dG9yLmV4ZWN1dGVOZXN0ZWRDb21tYW5kcygpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdW5kbygpIHsKLQkJCW5lc3RlZENvbW1hbmRFeGNlY3V0b3IudW5kb05lc3RlZENvbW1hbmRzKCk7Ci0JCQlzdXBlci51bmRvKCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgTGlzdDxDb21tYW5kPiBjb21tYW5kTGlzdCgpIHsKLQkJCXJldHVybiBjb21tYW5kTGlzdDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0IEVPYmplY3QKLQkgKiBAcGFyYW0gbmV3VHlwZSBFQ2xhc3MKLQkgKiBAcGFyYW0gb2xkRmVhdHVyZVRvTmV3RmVhdHVyZU1hcCBNYXAKLQkgKiBAcGFyYW0gZmVhdHVyZUNvbXBhcmF0b3IgQ29tcGFyYXRvcgotCSAqIEByZXR1cm4gVHlwZUNvbnZlcnNpb25Db21tYW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlQ29udmVyc2lvbkNvbW1hbmQgY3JlYXRlVHlwZUNvbnZlcnNpb25Db21tYW5kKEVPYmplY3Qgb2JqZWN0LCBFQ2xhc3MgbmV3VHlwZSwgCi0JCQlNYXAgb2xkRmVhdHVyZVRvTmV3RmVhdHVyZU1hcCwgQ29tcGFyYXRvciBmZWF0dXJlQ29tcGFyYXRvcikgewotCQlyZXR1cm4gY3JlYXRlVHlwZUNvbnZlcnNpb25Db21tYW5kKG9iamVjdCwgbmV3VHlwZSwgb2xkRmVhdHVyZVRvTmV3RmVhdHVyZU1hcCwgZmVhdHVyZUNvbXBhcmF0b3IsIGZhbHNlLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QgRU9iamVjdAotCSAqIEBwYXJhbSBuZXdUeXBlIEVDbGFzcwotCSAqIEBwYXJhbSBvbGRGZWF0dXJlVG9OZXdGZWF0dXJlTWFwIE1hcAotCSAqIEBwYXJhbSBmZWF0dXJlQ29tcGFyYXRvciBDb21wYXJhdG9yCi0JICogQHBhcmFtIHJlbW92ZUluY29taW5nUmVmZXJlbmNlcyBib29sZWFuCi0JICogQHBhcmFtIHJlbW92ZVZhcmlhYmlsaXR5IGJvb2xlYW4KLQkgKiBAcmV0dXJuIFR5cGVDb252ZXJzaW9uQ29tbWFuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZUNvbnZlcnNpb25Db21tYW5kIGNyZWF0ZVR5cGVDb252ZXJzaW9uQ29tbWFuZChFT2JqZWN0IG9iamVjdCwgRUNsYXNzIG5ld1R5cGUsIAotCQkJTWFwIG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAsIENvbXBhcmF0b3IgZmVhdHVyZUNvbXBhcmF0b3IsIAotCQkJYm9vbGVhbiByZW1vdmVJbmNvbWluZ1JlZmVyZW5jZXMsIGJvb2xlYW4gcmVtb3ZlVmFyaWFiaWxpdHkpIHsKLQkJVHlwZUNvbnZlcnNpb25Db21tYW5kIGNtZCA9IG5ldyBUeXBlQ29udmVyc2lvbkNvbW1hbmQob2JqZWN0KTsKLQkJRU9iamVjdCBuZXdPYmplY3QgPSBwcmVwYXJlQ29udmVydChvYmplY3QsIG5ld1R5cGUsIG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAsIGZlYXR1cmVDb21wYXJhdG9yLCByZW1vdmVJbmNvbWluZ1JlZmVyZW5jZXMsIHJlbW92ZVZhcmlhYmlsaXR5LCBjbWQpOwotCQkKLQkJLy8gcmVwbGFjZSBvYmplY3Qgd2l0aCBuZXdPYmplY3QgaW4gdGhlIG9iamVjdCdzIGNvbnRhaW5lcgotCQkvLwotCQlFT2JqZWN0IGNvbnRhaW5lciA9IG9iamVjdC5lQ29udGFpbmVyKCk7Ci0JCWlmKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQlFUmVmZXJlbmNlIHJlZiA9IG9iamVjdC5lQ29udGFpbm1lbnRGZWF0dXJlKCk7Ci0JCQlpZihyZWYuaXNNYW55KCkpIHsKLQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgY29udGFpbmVyLmVHZXQocmVmKTsKLQkJCQlpbnQgaW5kZXggPSBsaXN0LmluZGV4T2Yob2JqZWN0KTsKLQkJCQljbWQuY29tbWFuZExpc3QoKS5hZGQoMCwgbmV3IFNldENvbW1hbmQobnVsbCwgY29udGFpbmVyLCByZWYsIG5ld09iamVjdCwgaW5kZXgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNtZC5jb21tYW5kTGlzdCgpLmFkZCgwLCBuZXcgU2V0Q29tbWFuZChudWxsLCBjb250YWluZXIsIHJlZiwgbmV3T2JqZWN0KSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWNtZC5zZXRSZXN1bHQoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChuZXdPYmplY3QpKTsKLQkJCi0JCXJldHVybiBjbWQ7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIENvbnRlbnRSZXNvdXJjZVNjYW5uZXIgY3JlYXRlU2Nhbm5lcihFT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gJiYgIShvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pKSB7CQkJCi0JCQlGaWxlIG9sZFJlc291cmNlUGF0aCA9IG5ldyBGaWxlKFJlc291cmNlSGVscGVyLmdldEZvbGRlckFic29sdXRlUGF0aCgoTWV0aG9kRWxlbWVudCkgb2JqZWN0KSk7Ci0JCQlTdHJpbmcgcm9vdENvbnRlbnRwYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoKE1ldGhvZEVsZW1lbnQpb2JqZWN0KTsKLQkJCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBDb250ZW50UmVzb3VyY2VTY2FubmVyKG9sZFJlc291cmNlUGF0aCwgbnVsbCwgcm9vdENvbnRlbnRwYXRoLCBudWxsKTsKLQkJCXJldHVybiBzY2FubmVyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0JCi0JCi0JLyoqCi0JICogUHJlcGFyZXMgYSBjb21wb3VuZCBjb21tYW5kIHRvIGRvIGEgdHlwZSBjb252ZXJzaW9uCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBuZXdUeXBlCi0JICogQHBhcmFtIG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAKLQkgKiBAcGFyYW0gZmVhdHVyZUNvbXBhcmF0b3IgdXNlZCB0byBzb3J0IHRoZSBmZWF0dXJlIGxpc3Qgb2Ygb2JqZWN0IHRvIGNvbnZlcnQgYmVmb3JlIGNvcHlpbmcvbW92aW5nCi0JICogICAgICAgIGZlYXR1cmUgdmFsdWVzIHRvIG5ldyBvYmplY3QuCi0JICogQHBhcmFtIHJlbW92ZUluY29taW5nUmVmZXJlbmNlcyBpZiB0cnVlIHdpbGwgcmVtb3ZlIGFsbCBpbmNvbWluZyByZWZlcmVuY2VzIAotCSAqIEBwYXJhbSBjb21wb3VuZENvbW1hbmQKLQkgKiBAcmV0dXJuIEVPYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVPYmplY3QgcHJlcGFyZUNvbnZlcnQoRU9iamVjdCBvYmplY3QsIEVDbGFzcyBuZXdUeXBlLCBNYXAgb2xkRmVhdHVyZVRvTmV3RmVhdHVyZU1hcCwKLQkJCUNvbXBhcmF0b3IgZmVhdHVyZUNvbXBhcmF0b3IsIGJvb2xlYW4gcmVtb3ZlSW5jb21pbmdSZWZlcmVuY2VzLCBib29sZWFuIHJlbW92ZVZhcmlhYmlsaXR5LAotCQkJVHlwZUNvbnZlcnNpb25Db21tYW5kIGNvbXBvdW5kQ29tbWFuZCkgewotCQlFT2JqZWN0IG5ld09iamVjdCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZShuZXdUeXBlKTsKLQkJCi0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCS8vIEhhbmRsZSBpbmNvbWluZyByZWZlcmVuY2VzLgotCQkJLy8gSWYgcmVtb3ZlSW5jb21taW5nUmVmZXJlbmNlcyBpcyBmYWxzZSwgcmVkaXJlY3QgYWxsIGluY29taW5nIHJlZmVyZW5jZXMgb2Ygb2JqZWN0IHRvIG5ld09iamVjdAotCQkJLy8gSWYgcmVtb3ZlSW5jb21taW5nUmVmZXJlbmNlcyBpcyB0cnVlLCByZW1vdmUgYWxsIG9mIHRoZW0uCi0JCQkvLwkJCQotCi0JCQlNZXRob2RFbGVtZW50IG1lID0gKE1ldGhvZEVsZW1lbnQpIG9iamVjdDsKLQkJCUNvbGxlY3Rpb24gb3Bwb3NpdGVGZWF0dXJlcyA9IG1lLmdldE9wcG9zaXRlRmVhdHVyZXMoKTsKLQkJCWlmKCFvcHBvc2l0ZUZlYXR1cmVzLmlzRW1wdHkoKSkgewkJCQkKLQkJCQkKLQkJCQkvLyBsb2FkIG9wcG9zaXRlIGZlYXR1cmVzCi0JCQkJLy8KLQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG9iamVjdCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gRXh0ZW5zaW9uTWFuYWdlci5nZXRPcHBvc2l0ZUZlYXR1cmVMb2FkZXJzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJSU9wcG9zaXRlRmVhdHVyZUxvYWRlciBsb2FkZXIgPSAoSU9wcG9zaXRlRmVhdHVyZUxvYWRlcikgaXRlci5uZXh0KCk7Ci0JCQkJCWxvYWRlci5sb2FkT3Bwb3NpdGVGZWF0dXJlcyhjb2xsZWN0aW9uKTsKLQkJCQl9Ci0JCQkJCi0JCQkJTWFwIHJlZmVyZW5jZXJUb0ZlYXR1cmVMaXN0TWFwID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVmZXJlbmNlTWFwKG1lKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VyVG9GZWF0dXJlTGlzdE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCQlFT2JqZWN0IHJlZmVyZW5jZXIgPSAoRU9iamVjdCkgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAoKENvbGxlY3Rpb24pZW50cnkuZ2V0VmFsdWUoKSkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJRVJlZmVyZW5jZSBmZWF0dXJlID0gKEVSZWZlcmVuY2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmKCFyZW1vdmVJbmNvbWluZ1JlZmVyZW5jZXMgJiYgZmVhdHVyZS5nZXRFVHlwZSgpLmlzSW5zdGFuY2UobmV3T2JqZWN0KSkgewotCQkJCQkJCS8vIG5ldyB0eXBlIGlzIGNvbXBhdGlibGUsIHJlZmVyZW5jZSBjYW4gYmUgcHJlc2VydmVkCi0JCQkJCQkJLy8KLQkJCQkJCQlpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJCUxpc3QgbGlzdCA9IChMaXN0KSByZWZlcmVuY2VyLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCQkJCWludCBpbmRleCA9IGxpc3QuaW5kZXhPZihvYmplY3QpOwotCQkJCQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKG5ldyBTZXRDb21tYW5kKG51bGwsIHJlZmVyZW5jZXIsIGZlYXR1cmUsIG5ld09iamVjdCwgaW5kZXgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWNvbXBvdW5kQ29tbWFuZC5hcHBlbmQobmV3IFNldENvbW1hbmQobnVsbCwgcmVmZXJlbmNlciwgZmVhdHVyZSwgbmV3T2JqZWN0KSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gbmV3IHR5cGUgaXMgbm90IGNvbXBhdGlibGUsIHJlZmVyZW5jZSBtdXN0IGJlIHJlbW92ZWQKLQkJCQkJCQkvLwotCQkJCQkJCWlmKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkJY29tcG91bmRDb21tYW5kLmFwcGVuZChuZXcgUmVtb3ZlQ29tbWFuZChudWxsLCByZWZlcmVuY2VyLCBmZWF0dXJlLCBvYmplY3QpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWNvbXBvdW5kQ29tbWFuZC5hcHBlbmQobmV3IFNldENvbW1hbmQobnVsbCwgcmVmZXJlbmNlciwgZmVhdHVyZSwgZmVhdHVyZS5nZXREZWZhdWx0VmFsdWUoKSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gY29weSBhbGwgdGhlIGZlYXR1cmVzCi0JCS8vCi0JCUxpc3QgbmV3T2JqZWN0RmVhdHVyZXMgPSBuZXdUeXBlLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJTGlzdCBvYmplY3RGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3Qob2JqZWN0LmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKSk7Ci0JCWlmKHJlbW92ZVZhcmlhYmlsaXR5KSB7Ci0JCQlvYmplY3RGZWF0dXJlcy5yZW1vdmUoVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UKTsKLQkJCW9iamVjdEZlYXR1cmVzLnJlbW92ZShVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUpOwotCQl9Ci0JCWlmKGZlYXR1cmVDb21wYXJhdG9yICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb25zLnNvcnQob2JqZWN0RmVhdHVyZXMsIGZlYXR1cmVDb21wYXJhdG9yKTsKLQkJfQotCQlDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXIgPSBjcmVhdGVTY2FubmVyKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdEZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyLm5leHQoKTsKLQkJCWlmKCFuZXdPYmplY3RGZWF0dXJlcy5jb250YWlucyhmZWF0dXJlKSkgewotCQkJCWlmKG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAgIT0gbnVsbCkgewotCQkJCQlPYmplY3QgZiA9IG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAuZ2V0KGZlYXR1cmUpOwotCQkJCQlpZihmICE9IG51bGwgJiYgbmV3T2JqZWN0RmVhdHVyZXMuY29udGFpbnMoZikpIHsKLQkJCQkJCWZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZmVhdHVyZSA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZlYXR1cmUgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWlmKGZlYXR1cmUgIT0gbnVsbCAmJiBmZWF0dXJlLmlzQ2hhbmdlYWJsZSgpKSB7CQkJCQotCQkJCWJvb2xlYW4gZmVhdHVyZUhhbmRsZWQgPSBmYWxzZTsKLQkJCQlpZihmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgewotCQkJCQlFUmVmZXJlbmNlIHJlZiA9IChFUmVmZXJlbmNlKSBmZWF0dXJlOwotCQkJCQlpZihyZWYgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04pIHsKLQkJCQkJCWlmKENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuaGFzUHJlc2VudGF0aW9uKChNZXRob2RFbGVtZW50KSBvYmplY3QpKSB7Ci0JCQkJCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQ29udGVudERlc2NyaXB0aW9uKSBvYmplY3QuZUdldChyZWYpOwotCQkJCQkJCUVDbGFzcyBjb250ZW50RGVzY1R5cGUgPSBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5LmdldENvbnRlbnREZXNjcmlwdGlvblR5cGUobmV3VHlwZSk7Ci0JCQkJCQkJaWYoY29udGVudERlc2NUeXBlICE9IG51bGwgJiYgY29udGVudERlc2NUeXBlICE9IGNvbnRlbnQuZUNsYXNzKCkpIHsKLQkJCQkJCQkJRU9iamVjdCBuZXdDb250ZW50ID0gcHJlcGFyZUNvbnZlcnQoY29udGVudCwgY29udGVudERlc2NUeXBlLCBudWxsLCBudWxsLCByZW1vdmVJbmNvbWluZ1JlZmVyZW5jZXMsIHJlbW92ZVZhcmlhYmlsaXR5LCBjb21wb3VuZENvbW1hbmQpOwotCQkJCQkJCQkKLQkJCQkJCQkJLy8gcmVtb3ZlIG9sZCBjb250ZW50Ci0JCQkJCQkJCS8vCi0JCQkJCQkJCUVPYmplY3QgY29udGFpbmVyID0gY29udGVudC5lQ29udGFpbmVyKCk7Ci0JCQkJCQkJCWlmKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKG5ldyBTZXRDb21tYW5kKG51bGwsIG9iamVjdCwgcmVmLCBudWxsKSk7Ci0JCQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNvbnRlbnQuZVJlc291cmNlKCk7Ci0JCQkJCQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJY29tcG91bmRDb21tYW5kLm1vZGlmaWVkUmVzb3VyY2VzLmFkZChjb250ZW50LmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQkKLQkJCQkJCQkJY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIG5ld0NvbnRlbnQ7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQljb21wb3VuZENvbW1hbmQucmVzb3VyY2VDb3B5VGFza3MuYWRkKG5ldyBSZXNvdXJjZUNvcHlUYXNrKGNyZWF0ZVNjYW5uZXIoY29udGVudCksIGNvbnRlbnQsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJY29tcG91bmRDb21tYW5kLmFwcGVuZChuZXcgU2V0Q29tbWFuZChudWxsLCBuZXdPYmplY3QsIHJlZiwgY29udGVudCkpOwotCQkJCQkJfQotCQkJCQkJZmVhdHVyZUhhbmRsZWQgPSB0cnVlOwotCQkJCQl9CQkJCQkKLQkJCQkJZWxzZSBpZighcmVmLmlzQ29udGFpbm1lbnQoKSAmJiByZWYuZ2V0RU9wcG9zaXRlKCkgIT0gbnVsbCkgewotCQkJCQkJLy8gUmVmZXJlbmNlIGlzIGJpLWRpcmVjdGlvbmFsLiBJZiBvcHBvc2l0ZSByZWZlcmVuY2UgaXMgYSBsaXN0LCByZXBsYWNlIG9iamVjdAotCQkJCQkJLy8gd2l0aCBuZXcgb2JqZWN0IGF0IHRoZSBzYW1lIHBvc2l0aW9uIGluIHRoZSBsaXN0LgotCQkJCQkJLy8KLQkJCQkJCUVSZWZlcmVuY2Ugb3Bwb3NpdGVSZWYgPSByZWYuZ2V0RU9wcG9zaXRlKCk7CQkJCQkJCi0JCQkJCQlpZihvcHBvc2l0ZVJlZi5pc01hbnkoKSkgewotCQkJCQkJCU9iamVjdCB2YWx1ZSA9IG9iamVjdC5lR2V0KHJlZik7Ci0JCQkJCQkJaWYodmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCQlpZihyZWYuaXNNYW55KCkpIHsKLQkJCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAoKENvbGxlY3Rpb24pdmFsdWUpCi0JCQkJCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJRU9iamVjdCBvdGhlckVuZCA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCQkJTGlzdCBsaXN0ID0gKExpc3QpIG90aGVyRW5kLmVHZXQob3Bwb3NpdGVSZWYpOwotCQkJCQkJCQkJCWludCBpbmRleCA9IGxpc3QuaW5kZXhPZihvYmplY3QpOwotCQkJCQkJCQkJCWNvbXBvdW5kQ29tbWFuZC5hcHBlbmQobmV3IFNldENvbW1hbmQobnVsbCwgb3RoZXJFbmQsIG9wcG9zaXRlUmVmLCBuZXdPYmplY3QsIGluZGV4KSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQlFT2JqZWN0IG90aGVyRW5kID0gKEVPYmplY3QpIHZhbHVlOwotCQkJCQkJCQkJTGlzdCBsaXN0ID0gKExpc3QpIG90aGVyRW5kLmVHZXQob3Bwb3NpdGVSZWYpOwotCQkJCQkJCQkJaW50IGluZGV4ID0gbGlzdC5pbmRleE9mKG9iamVjdCk7Ci0JCQkJCQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKG5ldyBTZXRDb21tYW5kKG51bGwsIG90aGVyRW5kLCBvcHBvc2l0ZVJlZiwgbmV3T2JqZWN0LCBpbmRleCkpOwkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlmZWF0dXJlSGFuZGxlZCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYoIWZlYXR1cmVIYW5kbGVkKSB7Ci0JCQkJCU9iamVjdCB2YWx1ZSA9IG9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX0VMRU1FTlRfX05BTUUpIHsKLQkJCQkJCS8vIHZhbGlkYXRlIG5hbWUKLQkJCQkJCVN0cmluZyBuZXdOYW1lID0gY2hlY2tOYW1lKG9iamVjdCwgbmV3VHlwZSk7Ci0JCQkJCQlpZiAobmV3TmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXdOYW1lOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmKHNjYW5uZXIgIT0gbnVsbCAmJiB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyAmJiBvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQlTdHJpbmcgc3RyID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCQlpZighU3RyVXRpbC5pc0JsYW5rKHN0cikpIHsKLQkJCQkJCQljb21wb3VuZENvbW1hbmQucmVzb3VyY2VDb3B5VGFza3MuYWRkKG5ldyBSZXNvdXJjZUNvcHlUYXNrKHNjYW5uZXIsIChNZXRob2RFbGVtZW50KW9iamVjdCwgc3RyLCAiIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY29tcG91bmRDb21tYW5kLmFwcGVuZChuZXcgU2V0Q29tbWFuZChudWxsLCBuZXdPYmplY3QsIGZlYXR1cmUsIHZhbHVlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQkJCQkKLQkJcmV0dXJuIG5ld09iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhbiBhY3Rpdml0eSB0byBuZXcgdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkQWN0aXZpdHkgQWN0aXZpdHkKLQkgKiBAcGFyYW0gbmV3VHlwZSBFQ2xhc3MKLQkgKiBAcmV0dXJuIEFjdGl2aXR5Ci0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eSBjb252ZXJ0QWN0aXZpdHkoQWN0aXZpdHkgb2xkQWN0aXZpdHksIEVDbGFzcyBuZXdUeXBlKSB7Ci0JCS8vIGFjdGl2aXR5IGlzIGFscmVhZHkgdGhpcyB0eXBlCi0JCS8vCi0JCWlmIChuZXdUeXBlID09IG9sZEFjdGl2aXR5LmVDbGFzcygpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJSGFzaFNldDxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJQWN0aXZpdHkgbmV3QWN0aXZpdHkgPSAoQWN0aXZpdHkpIFR5cGVDb252ZXJ0ZXIuY29udmVydChvbGRBY3Rpdml0eSwgbmV3VHlwZSwgbnVsbCwgYWN0aXZpdHlGZWF0dXJlQ29tcGFyYXRvciwgbW9kaWZpZWRSZXNvdXJjZXMpOwotCi0JCS8vIG1ha2Ugb2xkQWN0aXZpdHkgYSBwcm94eSBzbyByZWZlcmVuY2UgdG8gaXQgY2FuIGJlIHJlc29sdmVkIHRvIG5ld0FjdGl2aXR5Ci0JCS8vCi0JCVVSSSB1cmkgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0UHJveHlVUkkobmV3QWN0aXZpdHkpOwotCQkoKEludGVybmFsRU9iamVjdClvbGRBY3Rpdml0eSkuZVNldFByb3h5VVJJKHVyaSk7Ci0JCQkJCi0JCS8vIHNhdmUgbW9kaWZpZWQgcmVzb3VyY2VzCi0JCS8vCi0JCWlmICghbW9kaWZpZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldEN1cnJlbnRQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJdHJ5IHsKLQkJCQlmb3IgKFJlc291cmNlIHJlcyA6IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCQkJCXBlcnNpc3Rlci5zYXZlKHJlcyk7Ci0JCQkJfQotCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJTGlicmFyeVJlc291cmNlcy5jb252ZXJ0QWN0aXZpdHlFcnJvcl90aXRsZSwKLQkJCQkJCQkJTkxTCi0JCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLnNhdmVDb252ZXJ0ZWRBY3Rpdml0eUVycm9yX21zZywKLQkJCQkJCQkJCQkJCW5ld0FjdGl2aXR5LmdldE5hbWUoKSksCi0JCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuZXJyb3JfcmVhc29uLCBlKTsKLQotCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbmV3QWN0aXZpdHk7Ci0JfQkJCi0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHR5cGVJRCBpbnQKLQkgKiBAcmV0dXJuIEVDbGFzcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgRUNsYXNzIGdldEFjdGl2aXR5VHlwZShpbnQgdHlwZUlEKSB7Ci0JCXN3aXRjaCAodHlwZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWToKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZOwotCQljYXNlIFVtYVBhY2thZ2UuSVRFUkFUSU9OOgotCQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuSVRFUkFUSU9OOwotCQljYXNlIFVtYVBhY2thZ2UuUEhBU0U6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QSEFTRTsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogQHBhcmFtIG9sZEd1aWRhbmNlCi0JICogQHBhcmFtIG5ld0d1aWRhbmNlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjaGVja05hbWUoRU9iamVjdCBvYmplY3QsIEVDbGFzcyBuZXdUeXBlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotCQkJTmFtZWRFbGVtZW50IGUgPSAoTmFtZWRFbGVtZW50KW9iamVjdDsKLQkJCWZpbmFsIElWYWxpZGF0b3IgdmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlTmFtZVZhbGlkYXRvcihlLmVDb250YWluZXIoKSwgZSwgbmV3VHlwZSk7Ci0JCQlTdHJpbmcgbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQoZS5nZXROYW1lKCkpOwotCQkJaWYobXNnICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZmVhdHVyZVR4dCA9IFRuZ1V0aWwuZ2V0RmVhdHVyZVRleHQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RpdGxlOyAKLQkJCQlTdHJpbmcgZGxnTXNnID0gTkxTLmJpbmQoCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RleHQsCi0JCQkJCQlTdHJVdGlsLnRvTG93ZXIoZmVhdHVyZVR4dCksIGUuZ2V0TmFtZSgpKTsKLQkJCQlTdHJpbmcgY3VycmVudFZhbHVlID0gKFN0cmluZykgZS5lR2V0KFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCi0JCQkJSUlucHV0VmFsaWRhdG9yIGlucHV0VmFsaWRhdG9yID0gbmV3IElJbnB1dFZhbGlkYXRvcigpIHsKLQkJCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJCQlyZXR1cm4gdmFsaWRhdG9yLmlzVmFsaWQobmV3VGV4dCk7Ci0JCQkJCX0KLQkJCQl9OwotCQotCQkJCUlucHV0RGlhbG9nIGlucHV0RGxnID0gbmV3IElucHV0RGlhbG9nKAotCQkJCQkJTXNnQm94LmdldERlZmF1bHRTaGVsbCgpLCB0aXRsZSwgZGxnTXNnLCBjdXJyZW50VmFsdWUsCi0JCQkJCQlpbnB1dFZhbGlkYXRvcik7Ci0JCQkJaWYgKGlucHV0RGxnLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlyZXR1cm4gaW5wdXREbGcuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVDb250ZW50UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWE3MmUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogVGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIGEgcHJvY2VzcyB0cmVlLgotICogPHA+Ci0gKiBEaXNwbGF5cyB0aGUgdHJlZSBpbiB0aGUgZm9sbG93aW5nIGhpZXJhcmNoeToKLSAqIDx1bD4KLSAqIDxsaT5tZXRob2RfcGx1Z2luXzE8L2xpPgotICogPHVsPgotICogPGxpPiJDYXBhYmlsaXR5IFBhdHRlcm5zIiBVSSBmb2xkZXI8L2xpPgotICogPHVsPgotICogPGxpPmNhcGFiaWxpdHlfcGF0dGVybl8xPC9saT4KLSAqIDxsaT5jYXBhYmlsaXR5X3BhdHRlcm5fMjwvbGk+Ci0gKiA8L3VsPgotICogPC9saT4KLSAqIDxsaT4iRGVsaXZlcnkgUHJvY2Vzc2VzIiBVSSBmb2xkZXI8L2xpPgotICogPHVsPgotICogPGxpPmRlbGl2ZXJ5X3Byb2Nlc3NfMTwvbGk+Ci0gKiA8bGk+ZGVsaXZlcnlfcHJvY2Vzc18yPC9saT4KLSAqIDwvdWw+Ci0gKiA8L2xpPgotICogPC91bD4KLSAqIDwvbGk+Ci0gKiA8bGk+bWV0aG9kX3BsdWdpbl8yPC9saT4KLSAqIDx1bD4KLSAqIDxsaT4iQ2FwYWJpbGl0eSBQYXR0ZXJucyIgVUkgZm9sZGVyPC9saT4KLSAqIDwvbGk+Ci0gKiA8bGk+IkRlbGl2ZXJ5IFByb2Nlc3NlcyIgVUkgZm9sZGVyPC9saT4KLSAqIDwvbGk+Ci0gKiA8L3VsPgotICogPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1RyZWVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBBQklMSVRZX1BBVFRFUk5TID0gTGlicmFyeVVJUmVzb3VyY2VzLmNhcGFiaWxpdHlQYXR0ZXJuX3RleHRfcGx1cmFsOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSVZFUllfUFJPQ0VTU0VTID0gTGlicmFyeVVJUmVzb3VyY2VzLmRlbGl2ZXJ5UHJvY2Vzc190ZXh0X3BsdXJhbDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfTElTVCA9IG5ldyBPYmplY3RbMF07Ci0KLQlwcm90ZWN0ZWQgTWFwPE1ldGhvZFBsdWdpbiwgUHJvY2Vzc1RyZWVVSUZvbGRlcj4gY2FwYWJpbGl0eVBhdHRlcm5VSUZvbGRlcnMgPSBuZXcgSGFzaE1hcDxNZXRob2RQbHVnaW4sIFByb2Nlc3NUcmVlVUlGb2xkZXI+KCk7Ci0KLQlwcm90ZWN0ZWQgTWFwPE1ldGhvZFBsdWdpbiwgUHJvY2Vzc1RyZWVVSUZvbGRlcj4gZGVsaXZlcnlQcm9jZXNzVUlGb2xkZXJzID0gbmV3IEhhc2hNYXA8TWV0aG9kUGx1Z2luLCBQcm9jZXNzVHJlZVVJRm9sZGVyPigpOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQlMaXN0PE9iamVjdD4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCUxpc3Q8TWV0aG9kUGx1Z2luPiBwbHVnaW5zID0gKChNZXRob2RMaWJyYXJ5KSBwYXJlbnRFbGVtZW50KQotCQkJCQkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQkJZm9yIChJdGVyYXRvcjxNZXRob2RQbHVnaW4+IGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IGl0Lm5leHQoKTsKLQkJCQlMaXN0PFByb2Nlc3M+IHByb2Nlc3NlcyA9IFRuZ1V0aWwuZ2V0QWxsUHJvY2Vzc2VzKHBsdWdpbik7Ci0JCQkJaWYgKHByb2Nlc3Nlcy5zaXplKCkgPiAwKSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChwbHVnaW4pOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JCX0gZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHBhcmVudEVsZW1lbnQ7Ci0KLQkJCVByb2Nlc3NUcmVlVUlGb2xkZXIgY2FwYWJpbGl0eVBhdHRlcm5VSUZvbGRlciA9IGNhcGFiaWxpdHlQYXR0ZXJuVUlGb2xkZXJzCi0JCQkJCS5nZXQocGx1Z2luKTsKLQkJCWlmIChjYXBhYmlsaXR5UGF0dGVyblVJRm9sZGVyID09IG51bGwpIHsKLQkJCQljYXBhYmlsaXR5UGF0dGVyblVJRm9sZGVyID0gbmV3IFByb2Nlc3NUcmVlVUlGb2xkZXIoCi0JCQkJCQlDQVBBQklMSVRZX1BBVFRFUk5TLAotCQkJCQkJRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJucyIpKSwgcGFyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCQljYXBhYmlsaXR5UGF0dGVyblVJRm9sZGVycy5wdXQocGx1Z2luLAotCQkJCQkJY2FwYWJpbGl0eVBhdHRlcm5VSUZvbGRlcik7Ci0JCQl9Ci0KLQkJCVByb2Nlc3NUcmVlVUlGb2xkZXIgZGVsaXZlcnlQcm9jZXNzVUlGb2xkZXIgPSBkZWxpdmVyeVByb2Nlc3NVSUZvbGRlcnMKLQkJCQkJLmdldChwbHVnaW4pOwotCQkJaWYgKGRlbGl2ZXJ5UHJvY2Vzc1VJRm9sZGVyID09IG51bGwpIHsKLQkJCQlkZWxpdmVyeVByb2Nlc3NVSUZvbGRlciA9IG5ldyBQcm9jZXNzVHJlZVVJRm9sZGVyKAotCQkJCQkJREVMSVZFUllfUFJPQ0VTU0VTLAotCQkJCQkJRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzc2VzIikpLCBwYXJlbnRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJCWRlbGl2ZXJ5UHJvY2Vzc1VJRm9sZGVycy5wdXQocGx1Z2luLCBkZWxpdmVyeVByb2Nlc3NVSUZvbGRlcik7Ci0JCQl9Ci0KLQkJCXJldHVybiBuZXcgT2JqZWN0W10geyBjYXBhYmlsaXR5UGF0dGVyblVJRm9sZGVyLAotCQkJCQlkZWxpdmVyeVByb2Nlc3NVSUZvbGRlciB9OwotCQl9IGVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzVHJlZVVJRm9sZGVyKSB7Ci0JCQlQcm9jZXNzVHJlZVVJRm9sZGVyIHVpRm9sZGVyID0gKFByb2Nlc3NUcmVlVUlGb2xkZXIpIHBhcmVudEVsZW1lbnQ7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgdWlGb2xkZXIuZ2V0UGFyZW50KCk7Ci0JCQlpZiAodWlGb2xkZXIuZ2V0TmFtZSgpID09IENBUEFCSUxJVFlfUEFUVEVSTlMpIHsKLQkJCQlyZXR1cm4gTGlicmFyeVNlcnZpY2VVdGlsLmdldENhcGFiaWxpdHlQYXR0ZXJucyhwbHVnaW4pCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gTGlicmFyeVNlcnZpY2VVdGlsLmdldERlbGl2ZXJ5UHJvY2Vzc2VzKHBsdWdpbikKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIEVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzVHJlZVVJRm9sZGVyKSB7Ci0JCQlyZXR1cm4gKChQcm9jZXNzVHJlZVVJRm9sZGVyKSBlbGVtZW50KS5nZXRQYXJlbnQoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsCi0JCQkJCS5nZXRNZXRob2RQbHVnaW4oKENhcGFiaWxpdHlQYXR0ZXJuKSBlbGVtZW50KTsKLQkJCXJldHVybiBjYXBhYmlsaXR5UGF0dGVyblVJRm9sZGVycy5nZXQocGx1Z2luKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbAotCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChEZWxpdmVyeVByb2Nlc3MpIGVsZW1lbnQpOwotCQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc1VJRm9sZGVycy5nZXQocGx1Z2luKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWNhcGFiaWxpdHlQYXR0ZXJuVUlGb2xkZXJzLmNsZWFyKCk7Ci0JCWRlbGl2ZXJ5UHJvY2Vzc1VJRm9sZGVycy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlTGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWExNjVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBUaGUgbGFiZWwgcHJvdmlkZXIgZm9yIHRoZSBwcm9jZXNzIHRyZWUgdmlld2VyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NUcmVlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQluZXcgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzVHJlZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBMYWJlbFByb3ZpZGVyI2dldFRleHQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzVHJlZVVJRm9sZGVyKSB7Ci0JCQlyZXR1cm4gKChQcm9jZXNzVHJlZVVJRm9sZGVyKSBvYmopLmdldE5hbWUoKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbGFiZWxQcm92aWRlci5nZXRUZXh0KG9iaik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBMYWJlbFByb3ZpZGVyI2dldEltYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1RyZWVVSUZvbGRlcikgewotCQkJcmV0dXJuICgoUHJvY2Vzc1RyZWVVSUZvbGRlcikgb2JqKS5nZXRJbWFnZSgpOwotCQl9Ci0JCXJldHVybiBsYWJlbFByb3ZpZGVyLmdldEltYWdlKG9iaik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVVSUZvbGRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlVUlGb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5MmU0Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVVSUZvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIE1vZGVscyBhIFVJIGZvbGRlciBpbiB0aGUgcHJvY2VzcyB0cmVlIHZpZXdlci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzVHJlZVVJRm9sZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlIERFRkFVTFRfSU1BR0UgPSBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSggCi0JCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0ZvbGRlciIpKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgSW1hZ2UgaW1hZ2U7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1RyZWVVSUZvbGRlcihTdHJpbmcgbmFtZSkgewotCQl0aGlzKG5hbWUsIERFRkFVTFRfSU1BR0UsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIGZvbGRlcgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgb2JqZWN0Ci0JICovCi0JcHVibGljIFByb2Nlc3NUcmVlVUlGb2xkZXIoU3RyaW5nIG5hbWUsIE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcyhuYW1lLCBERUZBVUxUX0lNQUdFLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIGZvbGRlcgotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgYW4gaW1hZ2UgZm9yIHRoZSBmb2xkZXIKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IG9iamVjdAotCSAqLwotCXB1YmxpYyBQcm9jZXNzVHJlZVVJRm9sZGVyKFN0cmluZyBuYW1lLCBJbWFnZSBpbWFnZSwgT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgZm9sZGVyIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGZvciBhIFVJIGZvbGRlcgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudCBvYmplY3QuCi0JICogCi0JICogQHJldHVybiB0aGUgcGFyZW50IG9iamVjdCBmb3IgdGhlIGZvbGRlcgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBhcmVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBvYmplY3QKLQkgKiBAcmV0dXJuIHRoZSBnaXZlbiBwYXJlbnQgb2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZvbGRlciBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVWaWV3ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmEwMjM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogRGlzcGxheXMgYSB0cmVlIHZpZXcgdGhhdCBhbGxvd3MgYSB1c2VyIHRvIHNlbGVjdCBhIGNhcGFiaWxpdHkgcGF0dGVybiBvcgotICogZGVsaXZlcnkgcHJvY2Vzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzVHJlZVZpZXdlciBleHRlbmRzIFRyZWVWaWV3ZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyBQcm9jZXNzVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCXNldENvbnRlbnRQcm92aWRlcihuZXcgUHJvY2Vzc1RyZWVDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXNldExhYmVsUHJvdmlkZXIobmV3IFByb2Nlc3NUcmVlTGFiZWxQcm92aWRlcigpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVmlldy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NTQ2MmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudmlld3M7Ci0KLXB1YmxpYyBjbGFzcyBQcm9jZXNzVmlldyB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL0RpcmVjdG9yeVZhbGlkYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvRGlyZWN0b3J5VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNmNjYWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvRGlyZWN0b3J5VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciB2YWxpZGF0aW5nIGFuZCBjcmVhdGluZyBhIGRpcmVjdG9yeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MjE1MwotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NzUwMAotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MjA1NgotICovCi1wdWJsaWMgY2xhc3MgRGlyZWN0b3J5VmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyBhbmQgY3JlYXRlcyBhIGdpdmVuIGRpcmVjdG9yeS4KLQkgKiA8cD4KLQkgKiBEaXNwbGF5cyBhbiBlcnJvciBkaWFsb2cgaWYgdGhlIGRpcmVjdG9yeSBwYXRoIGlzIG5vdCB2YWxpZC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICBUaGUgcGF0aCB0byBiZSB2YWxpZGF0ZWQgYW5kIGNyZWF0ZWQuCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgZGlhbG9nIHRpdGxlLgotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBwYXRoIGlzIHZhbGlkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0FuZENyZWF0ZURpcihTdHJpbmcgZGlyLCBTdHJpbmcgdGl0bGUsCi0JCQlTdHJpbmcgZXJyb3JNc2cpIHsJCQotCQlib29sZWFuIGFuc3dlciA9IGZhbHNlOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIpOwotCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJRmlsZVtdIGZpbGVzID0gZmlsZS5saXN0RmlsZXMoKTsKLQkJCWlmIChmaWxlcyAhPSBudWxsICYmIGZpbGVzLmxlbmd0aCA+IDApIHsKLQkJCQlhbnN3ZXIgPSBMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCXRpdGxlLAotCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5kZWxldGVGaWxlc0NvbmZpcm1hdGlvbl9tc2csCi0JCQkJCQkJCQkJCQlkaXIpKTsKLQkJCQlpZiAoYW5zd2VyID09IHRydWUpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWFuc3dlciA9IEZpbGVVdGlsCi0JCQkJCQkJCS5kZWxldGVBbGxGaWxlcyhmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCWlmIChhbnN3ZXIgPT0gZmFsc2UpIHsKLQkJCQkJCQlMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJdGl0bGUsCi0JCQkJCQkJCQkJCWVycm9yTXNnLAotCQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5kZWxldGVGaWxlc0Vycm9yX3JlYXNvbiwKLQkJCQkJCQkJCQkJCQkJCWRpcikpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeVVJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJdGl0bGUsCi0JCQkJCQkJCQkJZXJyb3JNc2csCi0JCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLmRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJCQkJCQlkaXIpLCBlKTsKLQkJCQkJCWFuc3dlciA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlhbnN3ZXIgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotLy8JCQlpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKSB7Ci0vLwkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwKLS8vCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLmludmFsaWRQYXRoX21zZyk7Ci0vLwkJCQlhbnN3ZXIgPSBmYWxzZTsKLS8vCQkJfSBlbHNlIHsKLQotCQkJCXRyeSB7Ci0JCQkJCWlmIChmaWxlLm1rZGlycygpID09IGZhbHNlKSB7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQl0aXRsZSwKLQkJCQkJCQkJCQllcnJvck1zZywKLQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuY3JlYXRlUGF0aEVycm9yX3JlYXNvbiwKLQkJCQkJCQkJCQkJCQkJZGlyKSk7Ci0JCQkJCQlhbnN3ZXIgPSBmYWxzZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWFuc3dlciA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQl0aXRsZSwKLQkJCQkJCQllcnJvck1zZywKLQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5jcmVhdGVQYXRoRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJZGlyKSwgZSk7Ci0JCQkJCWFuc3dlciA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLS8vCQl9Ci0KLQkJcmV0dXJuIGFuc3dlcjsKLQl9Ci0JCi0JLyoqCi0JICogVmFsaWRhdGVzIGFuZCBjcmVhdGVzIGEgZ2l2ZW4gZGlyZWN0b3J5LgotCSAqIDxwPgotCSAqIERpc3BsYXlzIGFuIGVycm9yIGRpYWxvZyBpZiB0aGUgZGlyZWN0b3J5IHBhdGggaXMgbm90IHZhbGlkLgotCSAqIAotCSAqIEBwYXJhbSBkaXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIHRvIGJlIHZhbGlkYXRlZCBhbmQgY3JlYXRlZC4KLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSBkaWFsb2cgdGl0bGUuCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gYWxsb3dDdXJyZW50TGliUGF0aAotCSAqIAkJCSAgQWxsb3cgcGF0aHMgY29udGFpbmluZyBjdXJyZW50IGxpYnJhcnkgb3Igbm90Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBwYXRoIGlzIHZhbGlkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0FuZENyZWF0ZURpcihTdHJpbmcgZGlyLCBTdHJpbmcgdGl0bGUsCi0JCQlTdHJpbmcgZXJyb3JNc2csIGJvb2xlYW4gYWxsb3dDdXJyZW50TGliUGF0aCkgewotCQlpZighYWxsb3dDdXJyZW50TGliUGF0aCl7Ci0JCQlTdHJpbmcgY3VycmVudExpYlBhdGggPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKTsKLQkJCWlmIChjdXJyZW50TGliUGF0aCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHRhcmdldFBhdGhGaWxlU3RyID0gbmV3IEZpbGUoZGlyKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQlTdHJpbmcgbGliUGF0aEZpbGVTdHIgPSBuZXcgRmlsZShjdXJyZW50TGliUGF0aCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJaWYgKGxpYlBhdGhGaWxlU3RyLmVxdWFscyh0YXJnZXRQYXRoRmlsZVN0cikpIHsKLS8vCQkJCWlmKGRpci5zdGFydHNXaXRoKGN1cnJlbnRMaWJQYXRoKSB8fCBjdXJyZW50TGliUGF0aC5zdGFydHNXaXRoKGRpcikpewotCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLgotCQkJCQlkaXNwbGF5RXJyb3IodGl0bGUsIExpYnJhcnlVSVJlc291cmNlcy5vdmVycmlkZUN1cnJlbnRMaWJyYXJ5RXJyb3JfbXNnMCk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoZWNrQW5kQ3JlYXRlRGlyKGRpciwgdGl0bGUsIGVycm9yTXNnKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9MaWJyYXJ5QmFja3VwVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvTGlicmFyeUJhY2t1cFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI3ZThhMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9MaWJyYXJ5QmFja3VwVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGF5b3V0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzLkxpYnJhcnlCYWNrdXBEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBiYWNrIHVwIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5QmFja3VwVXRpbCB7Ci0KLQlwcml2YXRlIFN0cmluZyBwYXRoID0gbnVsbDsKLQotCS8qKgotCSAqIFByb21wdHMgdG8gYmFja3VwIHRoZSBjdXJyZW50IGxpYnJhcnkKLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJvbXB0QmFja3VwQ3VycmVudExpYnJhcnkoU2hlbGwgc2hlbGwsIElMaWJyYXJ5U2VydmljZSBzZXJ2aWNlKSB7Ci0JCVN0cmluZyBsaWJQYXRoU3RyID0gc2VydmljZS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCk7Ci0JCUZpbGUgbGliUGF0aCA9IG5ldyBGaWxlKGxpYlBhdGhTdHIpOwotCQluZXcgTGlicmFyeUJhY2t1cFV0aWwoKS5kb0JhY2t1cChzaGVsbCwgbGliUGF0aCwgc2VydmljZSk7Ci0JfQotCQotCS8qKgotCSAqIFByb21wdHMgdG8gYmFja3VwIGxpYnJhcnkKLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiBAcGFyYW0gbGliUGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcm9tcHRCYWNrdXBMaWJyYXJ5KFNoZWxsIHNoZWxsLCBGaWxlIGxpYlBhdGgpIHsKLQkJbmV3IExpYnJhcnlCYWNrdXBVdGlsKCkuZG9CYWNrdXAoc2hlbGwsIGxpYlBhdGgsIG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkb0JhY2t1cChmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgRmlsZSBsaWJQYXRoLCBJTGlicmFyeVNlcnZpY2Ugc2VydmljZSkgewotCQlwYXRoID0gbnVsbDsKLQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU2hlbGwgcyA9IHNoZWxsOwotCQkJCWlmIChzID09IG51bGwpIHsKLQkJCQkJcyA9IE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKTsKLQkJCQl9Ci0KLQkJCQlpZiAocyA9PSBudWxsKSB7Ci0JCQkJCXMgPSBuZXcgU2hlbGwoTXNnQm94LmdldERpc3BsYXkoKSk7Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeVVJUmVzb3VyY2VzLmJhY2t1cExpYnJhcnlEaWFsb2dfdGl0bGU7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuYmFja3VwTGlicmFyeURpYWxvZ190ZXh0OwotCQkJCVN0cmluZyBiYWNrdXBQYXRoID0gbGliUGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSArICIuYmFja3VwIjsgLy8kTk9OLU5MUy0xJAkKLQotCQkJCUxpYnJhcnlCYWNrdXBEaWFsb2cgZGxnID0gbmV3IExpYnJhcnlCYWNrdXBEaWFsb2cocywgdGl0bGUsCi0JCQkJCQltZXNzYWdlLCBiYWNrdXBQYXRoKTsKLQotCQkJCWlmIChkbGcub3BlbigpID09IERpYWxvZy5PSykgewotCQkJCQlwYXRoID0gZGxnLmdldFBhdGgoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCWlmIChzZXJ2aWNlID09IG51bGwpIHsKLQkJCQliYWNrdXAobGliUGF0aCwgbmV3IEZpbGUocGF0aCkpOwotCQkJfSBlbHNlIHsKLQkJCQlzZXJ2aWNlLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmJhY2t1cE1ldGhvZExpYnJhcnkocGF0aCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEJhY2sgdXAgbGlicmFyeSAKLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHBhcmFtIGRlc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYmFja3VwKGZpbmFsIEZpbGUgc291cmNlLCBmaW5hbCBGaWxlIGRlc3QpIHsKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gZXhjdWRlIHRoZSBub24tbGlicmFyeSBmaWxlcyB0aGF0IG1pZ2h0IGJlIGxvY2tlZCBieSBybWMuCi0JCQkJCS8vIHRoZXNlIGZpbGVzIG1heSBjYXVzZSBiYWNrdXAgdG8gZmFpbCBkdWUgdG8gZmlsZSBsb2NrLgotCQkJCQlTdHJpbmcgZXhjbHVkZXMgPSAiLmxvY2siOyAvLyROT04tTkxTLTEkCi0JCQkJCUxheW91dFJlc291cmNlcy5jb3B5RGlyKHNvdXJjZSwgZGVzdCwgIioqIiwgZXhjbHVkZXMpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsCi0JCQkJTGlicmFyeVVJUmVzb3VyY2VzLmJhY2tpbmdVcExpYnJhcnlUYXNrX25hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZFBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL05ld0xpYnJhcnlXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYTA2MDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGNsYXNzIGZvciBhIE5ldyBNZXRob2QgTGlicmFyeSB3aXphcmQgcGFnZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOZXdMaWJyYXJ5V2l6YXJkUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0xpYnJhcnlXaXphcmRQYWdlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpYnJhcnkgc3BlY2lmaWMgdXNlciBzZWxlY3Rpb25zLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBNYXAgZ2V0U2VsZWN0aW9ucygpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL05ld0xpYnJhcnlXaXphcmRQYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzkwOTkxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL05ld0xpYnJhcnlXaXphcmRQYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuRGVidWdUcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdMaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIE5ldyBMaWJyYXJ5IHdpemFyZCBwYWdlcyBkZWZpbmVkIHZpYSB0aGUKLSAqICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5uZXdMaWJyYXJ5V2l6YXJkUGFnZXMiIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRSA9ICJuZXdMaWJyYXJ5V2l6YXJkUGFnZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBJZiB0cnVlLCBkZWJ1ZyB0cmFjaW5nIGlzIGVuYWJsZWQuCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQotCS8vIEEgbWFwIG9mIHdpemFyZCBwYWdlIHByb3ZpZGVycy4KLQlwcml2YXRlIE1hcDxTdHJpbmcsIE5ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uPiB3aXphcmRQYWdlUHJvdmlkZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBOZXdMaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbj4oKTsKLQotCS8vIEEgbGlzdCBvZiB3aXphcmQgcGFnZSBpbnN0YW5jZXMuCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBOZXdMaWJyYXJ5V2l6YXJkUGFnZT4gd2l6YXJkUGFnZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE5ld0xpYnJhcnlXaXphcmRQYWdlPigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChOZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBOZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBOZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkoKSB7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiaW5pdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSwgRVhURU5TSU9OX1BPSU5UX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3RyaW5nIHR5cGVJZCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyB0aXRsZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoImRlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImluaXQiLCAvLyROT04tTkxTLTEkIAotCQkJCQkJCQkJImNvbmZpZ0VsZW1lbnQsIGNsYXNzPSIgKyBjbGFzc05hbWUgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSIsIHR5cGU9IiArIHR5cGVJZCArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJIiwgdGl0bGU9IiArIHRpdGxlICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkiLCBkZXNjcmlwdGlvbj0iICsgZGVzY3JpcHRpb24pOyAvLyROT04tTkxTLTEkCQkJCQkJCQotCQkJCQkJfQotCQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsICYmIGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIHR5cGVJZCAhPSBudWxsICYmIHR5cGVJZC50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIHRpdGxlICE9IG51bGwgJiYgdGl0bGUudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiBkZXNjcmlwdGlvbiAhPSBudWxsCi0JCQkJCQkJCSYmIGRlc2NyaXB0aW9uLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlpZiAoIXdpemFyZFBhZ2VQcm92aWRlcnMuY29udGFpbnNLZXkodHlwZUlkKSkgewotCQkJCQkJCQlOZXdMaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbiBwcm92aWRlciA9IG5ldyBOZXdMaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbigKLQkJCQkJCQkJCQlidW5kbGUsIGNsYXNzTmFtZSwgdHlwZUlkLCB0aXRsZSwKLQkJCQkJCQkJCQlkZXNjcmlwdGlvbik7Ci0JCQkJCQkJCXdpemFyZFBhZ2VQcm92aWRlcnMucHV0KHR5cGVJZCwgcHJvdmlkZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPk5ld0xpYnJhcnlXaXphcmRQYWdlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBOZXdMaWJyYXJ5V2l6YXJkUGFnZSBjcmVhdGVXaXphcmRQYWdlKFN0cmluZyBwYWdlSWQsIFN0cmluZyB0eXBlSWQpIHsKLQkJTmV3TGlicmFyeVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IChOZXdMaWJyYXJ5V2l6YXJkUGFnZSkgd2l6YXJkUGFnZXMKLQkJCQkuZ2V0KHR5cGVJZCk7Ci0JCWlmICh3aXphcmRQYWdlICE9IG51bGwpIHsKLQkJCXJldHVybiB3aXphcmRQYWdlOwotCQl9Ci0KLQkJTmV3TGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24gcHJvdmlkZXIgPSAoTmV3TGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24pIHdpemFyZFBhZ2VQcm92aWRlcnMKLQkJCQkuZ2V0KHR5cGVJZCk7Ci0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQlCdW5kbGUgYnVuZGxlID0gcHJvdmlkZXIuZ2V0QnVuZGxlKCk7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gcHJvdmlkZXIuZ2V0Q2xhc3NOYW1lKCk7Ci0JCQlDbGFzcyB3aXphcmRQYWdlQ2xhc3M7Ci0JCQlDbGFzc1tdIGFyZ0NsYXNzID0gbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MgfTsKLQkJCU9iamVjdFtdIGFyZ1ZhbHVlID0gbmV3IE9iamVjdFtdIHsgcGFnZUlkIH07Ci0JCQlDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcjsKLQkJCXRyeSB7Ci0JCQkJd2l6YXJkUGFnZUNsYXNzID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJCWNvbnN0cnVjdG9yID0gd2l6YXJkUGFnZUNsYXNzLmdldENvbnN0cnVjdG9yKGFyZ0NsYXNzKTsKLQkJCQl3aXphcmRQYWdlID0gKE5ld0xpYnJhcnlXaXphcmRQYWdlKSBjb25zdHJ1Y3RvcgotCQkJCQkJLm5ld0luc3RhbmNlKGFyZ1ZhbHVlKTsKLQkJCQl3aXphcmRQYWdlLnNldFRpdGxlKHByb3ZpZGVyLmdldFRpdGxlKCkpOwotCQkJCXdpemFyZFBhZ2Uuc2V0RGVzY3JpcHRpb24ocHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQkJd2l6YXJkUGFnZXMucHV0KHR5cGVJZCwgd2l6YXJkUGFnZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdpemFyZFBhZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvciBjYWNoZWQgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPk5ld0xpYnJhcnlXaXphcmRQYWdlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgTmV3TGlicmFyeVdpemFyZFBhZ2UgZ2V0V2l6YXJkUGFnZShTdHJpbmcgdHlwZUlkKSB7Ci0JCXJldHVybiAoTmV3TGlicmFyeVdpemFyZFBhZ2UpIHdpemFyZFBhZ2VzLmdldCh0eXBlSWQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlNYWluUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlNYWluUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjViMzI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5TWFpblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIHBhdGggdG8gb3BlbiBhIG1ldGhvZAotICogbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTGlicmFyeU1haW5QYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBwYWdlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gT3BlbkxpYnJhcnlNYWluUGFnZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0lEID0gInR5cGVJZCI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcm90ZWN0ZWQgU2hlbGwgc2hlbGw7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBMYWJlbCBwYXRoTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgQ29tYm8gbGlicmFyeVBhdGhDb21ibzsKLQotCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0JcHJvdGVjdGVkIFN0cmluZyBsaWJyYXJ5VHlwZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICogICAgICAgICAgICB0aGUgd2l6YXJkIHBhZ2UgbmFtZQotCSAqLwotCXB1YmxpYyBPcGVuTGlicmFyeU1haW5QYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeU1haW5XaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9PcGVuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE9wZW5MaWJyYXJ5TWFpblBhZ2UoKSB7Ci0JCXRoaXMoUEFHRV9OQU1FKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXNoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0KLQkJY29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIDMpOwotCi0JCXBhdGhMYWJlbCA9IGNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgTGlicmFyeVVJUmVzb3VyY2VzLnBhdGhMYWJlbF90ZXh0KTsKLQotCQlsaWJyYXJ5UGF0aENvbWJvID0gY3JlYXRlQ29tYm9ib3goY29tcG9zaXRlKTsKLQotCQlicm93c2VCdXR0b24gPSBjcmVhdGVCdXR0b24oY29tcG9zaXRlLAotCQkJCUxpYnJhcnlVSVJlc291cmNlcy5icm93c2VCdXR0b25fdGV4dCk7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlMaXN0PFN0cmluZz4gb3BlbkxpYnJhcnlQYXRoc0xpc3QgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXRPcGVuTGlicmFyeVBhdGhzTGlzdCgpOwkJCi0JCWlmIChvcGVuTGlicmFyeVBhdGhzTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlTdHJpbmdbXSBvcGVuTGlicmFyeVBhdGhzID0gTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJLmdldE9wZW5MaWJyYXJ5UGF0aHMoKTsKLQkJCWxpYnJhcnlQYXRoQ29tYm8uc2V0SXRlbXMob3BlbkxpYnJhcnlQYXRocyk7Ci0JCQlpZiAob3BlbkxpYnJhcnlQYXRocy5sZW5ndGggPiAwKSB7Ci0JCQkJbGlicmFyeVBhdGhDb21iby5zZXRUZXh0KG9wZW5MaWJyYXJ5UGF0aHNbMF0pOwotCQkJfQkJCQotCQl9IGVsc2UgewotCQkJU3RyaW5nIGxpYnJhcnlQYXRoID0gTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJLmdldERlZmF1bHRMaWJyYXJ5UGF0aCgpICsgRmlsZVV0aWwuRklMRV9TRVAgKyAiTGlicmFyeTEiOyAvLyROT04tTkxTLTEkCi0JCQlvcGVuTGlicmFyeVBhdGhzTGlzdC5hZGQoMCwgbGlicmFyeVBhdGgpOwotCQkJU3RyaW5nW10gb3BlbkxpYnJhcnlQYXRocyA9IG5ldyBTdHJpbmdbb3BlbkxpYnJhcnlQYXRoc0xpc3Quc2l6ZSgpXTsKLQkJCW9wZW5MaWJyYXJ5UGF0aHNMaXN0LnRvQXJyYXkob3BlbkxpYnJhcnlQYXRocyk7Ci0JCQlsaWJyYXJ5UGF0aENvbWJvLnNldEl0ZW1zKG9wZW5MaWJyYXJ5UGF0aHMpOwotCQkJbGlicmFyeVBhdGhDb21iby5zZXRUZXh0KG9wZW5MaWJyYXJ5UGF0aHNbMF0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJbGlicmFyeVBhdGhDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQotCQlsaWJyYXJ5UGF0aENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoZ2V0TGlicmFyeVBhdGgoKSk7Ci0JCQkJU3RyaW5nIHNlbGVjdGVkRGlyID0gZGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAoc2VsZWN0ZWREaXIgIT0gbnVsbCkgewotCQkJCQlsaWJyYXJ5UGF0aENvbWJvLmFkZChzZWxlY3RlZERpciwgMCk7Ci0JCQkJCWxpYnJhcnlQYXRoQ29tYm8uc2V0VGV4dChzZWxlY3RlZERpcik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGdldExpYnJhcnlOYW1lKCkubGVuZ3RoKCkgPiAwOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpYnJhcnkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlOYW1lKCkgewotCQlTdHJpbmcgbGliUGF0aCA9IGdldExpYnJhcnlQYXRoKCk7Ci0JCVN0cmluZyBsaWJOYW1lID0gbmV3IEZpbGUobGliUGF0aCkuZ2V0TmFtZSgpOwotCQlpZiAoIWxpYlBhdGguZXF1YWxzKGxpYk5hbWUpKSB7Ci0JCQlyZXR1cm4gbGliTmFtZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgbGlicmFyeSBwYXRoLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeVBhdGgoKSB7Ci0JCXJldHVybiBsaWJyYXJ5UGF0aENvbWJvLmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgbWV0aG9kIGxpYnJhcnkgdHlwZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlUeXBlKCkgewotCQlyZXR1cm4gbGlicmFyeVR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFmMDVkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5WZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuTmV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGF5b3V0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzLkNvcHlMaWJyYXJ5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kYXRhbG9jYXRpb24uTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEEgd2l6YXJkIHRoYXQgZ3VpZGVzIHRoZSB1c2VyIHRvIG9wZW4gYSBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3BlbkxpYnJhcnlXaXphcmQgZXh0ZW5kcyBCYXNlV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9JRCA9IE9wZW5MaWJyYXJ5V2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQotCS8qKgotCSAqIFRoZSBPcGVuIExpYnJhcnkgd2l6YXJkIGV4dGVuc2lvbiBwb2ludCBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfRVhURU5TSU9OX1BPSU5UX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm9wZW5MaWJyYXJ5V2l6YXJkIjsgLy8kTk9OLU5MUy0xJAkKLQotCS8vIFRoZSBtYWluIHdpemFyZCBwYWdlLgotCXByb3RlY3RlZCBPcGVuTGlicmFyeU1haW5QYWdlIG1haW5QYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgT3BlbkxpYnJhcnlXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlci5pbml0KHdvcmtiZW5jaCwgc2VsZWN0aW9uKTsKLQkJc2V0V2luZG93VGl0bGUoTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmQjZ2V0V2l6YXJkRXh0ZW5kZXJFeHRlbnNpb25Qb2ludElkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpemFyZEV4dGVuZGVyRXh0ZW5zaW9uUG9pbnRJZCgpIHsKLQkJcmV0dXJuIFdJWkFSRF9FWFRFTlNJT05fUE9JTlRfSUQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJaWYgKHdpemFyZEV4dGVuZGVyID09IG51bGwpIHsKLQkJCW1haW5QYWdlID0gY3JlYXRlTWFpblBhZ2UoKTsKLQkJCXN1cGVyLmFkZFBhZ2UobWFpblBhZ2UpOwotCQl9IGVsc2UgewotCQkJTGlzdDxJV2l6YXJkUGFnZT4gd2l6YXJkUGFnZXMgPSBuZXcgQXJyYXlMaXN0PElXaXphcmRQYWdlPigpOwotCi0JCQlJV2l6YXJkUGFnZSBwYWdlID0gd2l6YXJkRXh0ZW5kZXIKLQkJCQkJLmdldFJlcGxhY2VXaXphcmRQYWdlKE9wZW5MaWJyYXJ5TWFpblBhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCW1haW5QYWdlID0gY3JlYXRlTWFpblBhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQobWFpblBhZ2UpOwotCQkJfQotCi0JCQlzdXBlci5nZXROZXdXaXphcmRQYWdlcyh3aXphcmRQYWdlcyk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB3aXphcmRQYWdlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJSVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IChJV2l6YXJkUGFnZSkgaXQubmV4dCgpOwotCQkJCXN1cGVyLmFkZFBhZ2Uod2l6YXJkUGFnZSk7Ci0JCQl9Ci0KLQkJCXdpemFyZEV4dGVuZGVyLmluaXRXaXphcmRQYWdlcyh3aXphcmRQYWdlcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtYWluIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1haW4gd2l6YXJkIHBhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgT3BlbkxpYnJhcnlNYWluUGFnZSBjcmVhdGVNYWluUGFnZSgpIHsKLQkJcmV0dXJuIG5ldyBPcGVuTGlicmFyeU1haW5QYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCQkiZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlpZiAod2l6YXJkRXh0ZW5kZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHdpemFyZEV4dGVuZGVyLmRvRmluaXNoKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gb3Blbk1ldGhvZExpYnJhcnkobWFpblBhZ2UuZ2V0TGlicmFyeVBhdGgoKSwgInhtaSIpOyAvLyROT04tTkxTLTEkCQotCQl9Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgdGhlIG1ldGhvZCBsaWJyYXJ5IGF0IHRoZSB1c2VyIHNwZWNpZmllZCBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGxpYnJhcnkgcGF0aAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGxpYnJhcnkgdHlwZQotCSAqLwotCXB1YmxpYyBib29sZWFuIG9wZW5NZXRob2RMaWJyYXJ5KFN0cmluZyBwYXRoLCBTdHJpbmcgdHlwZSkgewotCQl0cnkgewotCQkJTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCQlGaWxlIGxpYnJhcnlQYXRoID0gbmV3IEZpbGUocGF0aCk7Ci0JCQlvcHRpb25zLnB1dChYTUlMaWJyYXJ5TWFuYWdlci5BUkdfTElCUkFSWV9QQVRILCBsaWJyYXJ5UGF0aAotCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0JCQlpZiAoWE1JTGlicmFyeVV0aWwuaXNWYWxpZExpYnJhcnkocGF0aCwgdHJ1ZSkgPT0gU3RhdHVzLk9LX1NUQVRVUykgewotCQkJCWlmICghaGFuZGxlVG9vbFZlcnNpb24ocGF0aCwgbnVsbCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoTGlicmFyeVVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLm9wZW5MaWJyYXJ5KHBhdGgpKSB7Ci0JCQkJCUxpYnJhcnlVSVByZWZlcmVuY2VzLmFkZE9wZW5MaWJyYXJ5UGF0aChsaWJyYXJ5UGF0aAotCQkJCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoWE1JTGlicmFyeVV0aWwKLQkJCQkJLmNvbnRhaW5zUGx1Z2luT3JDb25maWdTcGVjRXhwb3J0RmlsZShwYXRoKSkgewotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uNCk7Ci0JCQl9IGVsc2UgewotCQkJCU1zZ0RpYWxvZyBtc2dEaWFsb2cgPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQkJYm9vbGVhbiByYyA9IG1zZ0RpYWxvZwotCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCQkJTkxTCi0JCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlEaWFsb2dfbmV3TGlicmFyeV90ZXh0LAotCQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgcGF0aCB9KSk7Ci0JCQkJaWYgKCFyYykKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmIChMaWJyYXJ5VUlNYW5hZ2VyLmdldEluc3RhbmNlKCkuY3JlYXRlTGlicmFyeShwYXRoKSkgewotCQkJCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5hZGRPcGVuTGlicmFyeVBhdGgobGlicmFyeVBhdGgKLQkJCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIHJlYXNvbiA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJaWYgKHJlYXNvbiA9PSBudWxsKSB7Ci0JCQkJcmVhc29uID0gTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5SW50ZXJubEVycm9yX3JlYXNvbjsKLQkJCX0KLQkJCXJlYXNvbiArPSAiXG5cbiIgKyBMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlFcnJvcl9hZHZpY2U7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChlLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlFcnJvcl9tc2csIHJlYXNvbik7Ci0JCQl9IGVsc2UgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RXJyb3JfbXNnLCByZWFzb24sIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBhbmQgaGFuZGxlIHRvb2wgdmVyc2lvbiBkaWZmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYW5kbGVUb29sVmVyc2lvbihTdHJpbmcgcGF0aCwKLQkJCVVwZ3JhZGVDYWxsZXJJbmZvIGNhbGxlckluZm8pIHsKLQkJU3RyaW5nIGxpYlhtaSA9IFhNSUxpYnJhcnlNYW5hZ2VyLkxJQlJBUllfWE1JOwotCQlpZiAoY2FsbGVySW5mbyAhPSBudWxsICYmIGNhbGxlckluZm8uZ2V0SXNFeHBvcnRlZFBsdWdpbkxpYigpKSB7Ci0JCQlsaWJYbWkgPSBYTUlMaWJyYXJ5TWFuYWdlci5leHBvcnRGaWxlOwotCQl9Ci0JCVZlcnNpb25VdGlsLlZlcnNpb25DaGVja0luZm8gaW5mbyA9IFZlcnNpb25VdGlsCi0JCQkJLmNoZWNrTGlicmFyeVZlcnNpb24obmV3IEZpbGUocGF0aCwgbGliWG1pKSk7Ci0JCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby5yZXN1bHQgPiAwKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW5mby50b29sSUQuZXF1YWxzKFZlcnNpb25VdGlsLmdldFByaW1hcnlUb29sSUQoKSkpIHsKLQkJCQltZXNzYWdlID0gTkxTLmJpbmQoCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHQsCi0JCQkJCQluZXcgT2JqZWN0W10geyBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpLAotCQkJCQkJCQlpbmZvLnRvb2xWZXJzaW9uIH0pOwotCQkJfSBlbHNlIHsKLQkJCQltZXNzYWdlID0gTkxTLmJpbmQoCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHRfdW5rbm93biwKLQkJCQkJCW5ldyBPYmplY3RbXSB7IFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCkgfSk7Ci0JCQl9Ci0JCQlpZiAoIWlzVXBncmFkZUxpYnJhcnkoY2FsbGVySW5mbykpIHsKLQkJCQljYWxsZXJJbmZvLnNldEVycm9yTXNnKG1lc3NhZ2UpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsIG1lc3NhZ2UpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChYTUlMaWJyYXJ5VXRpbC5pc01ldGhvZExpYnJhcnlVcGdyYWRlUmVxdWlyZWQocGF0aCwgbGliWG1pLCBpbmZvKSkgewotCQkJaWYgKGlzVXBncmFkZUxpYnJhcnkoY2FsbGVySW5mbykKLQkJCQkJJiYgIUxpYnJhcnlVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy51cGdyYWRlTGlicmFyeURpYWxvZ190ZXh0KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmICghaXNVcGdyYWRlTGlicmFyeShjYWxsZXJJbmZvKSkgewotCQkJCWNhbGxlckluZm8uY29weUxpYnJhcnkoKTsKLQkJCQlpZiAoY2FsbGVySW5mby5nZXRDb3BpZWRMaWJGaWxlKCkgIT0gbnVsbCkgewotCQkJCQlwYXRoID0gY2FsbGVySW5mby5nZXRDb3BpZWRMaWJGaWxlKCkuZ2V0UGFyZW50RmlsZSgpCi0JCQkJCQkJLmdldEFic29sdXRlUGF0aCgpOwotCQkJCX0KLQkJCX0KLQkJCWlmICghTGlicmFyeVVJTWFuYWdlci51cGdyYWRlTGlicmFyeShwYXRoLCBjYWxsZXJJbmZvKSkgewotCQkJCWlmIChjYWxsZXJJbmZvICE9IG51bGwpIHsKLQkJCQkJLy8gY2FsbGVySW5mby5zZXRFcnJvck1zZygidXBncmFkZUxpYnJhcnkgRmFpbGVkISIpOyAvL25lZWQKLQkJCQkJLy8gbmV3IHJlc291cmNlIHN0cmluZwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVXBncmFkZUxpYnJhcnkoVXBncmFkZUNhbGxlckluZm8gY2FsbGVySW5mbykgewotCQlyZXR1cm4gVXBncmFkZUNhbGxlckluZm8uaXNVcGdyYWRlTGlicmFyeShjYWxsZXJJbmZvKTsKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYTI5MDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBjbGFzcyBmb3IgYSBPcGVuIE1ldGhvZCBMaWJyYXJ5IHdpemFyZCBwYWdlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaWJyYXJ5IHNwZWNpZmljIHVzZXIgc2VsZWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgTWFwIGdldFNlbGVjdGlvbnMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvU2VsZWN0UHJvY2Vzc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL1NlbGVjdFByb2Nlc3NQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNmFlYjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvU2VsZWN0UHJvY2Vzc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS52aWV3cy5Qcm9jZXNzVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIHByb2Nlc3MgdG8gZXhwb3J0LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSA3LjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdFByb2Nlc3NQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0UHJvY2Vzc1BhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBQcm9jZXNzVHJlZVZpZXdlciBwcm9jZXNzVHJlZVZpZXdlcjsKLQotCXByaXZhdGUgVGV4dCBicmllZkRlc2NUZXh0OwotCi0JcHJpdmF0ZSBQcm9jZXNzIHByb2Nlc3M7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RQcm9jZXNzUGFnZSgpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoTGlicmFyeVVJUmVzb3VyY2VzLnNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oTGlicmFyeVVJUmVzb3VyY2VzLnNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL0V4cG9ydFByb2Nlc3MuZ2lmIikpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBMaWJyYXJ5VUlSZXNvdXJjZXMucHJvY2Vzc2VzTGFiZWxfdGV4dCk7Ci0KLQkJcHJvY2Vzc1RyZWVWaWV3ZXIgPSBuZXcgUHJvY2Vzc1RyZWVWaWV3ZXIoY29tcG9zaXRlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RICi0JCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMjUwOwotCQlwcm9jZXNzVHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBMaWJyYXJ5VUlSZXNvdXJjZXMuYnJpZWZEZXNjcmlwdGlvbkxhYmVsX3RleHQpOwotCi0JCWJyaWVmRGVzY1RleHQgPSBjcmVhdGVNdWx0aUxpbmVUZXh0KGNvbXBvc2l0ZSwgIiIsIDEwMCwgNzAsIDEpOyAvLyROT04tTkxTLTEkCQotCi0JCWluaXRDb250cm9scygpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMgd2l0aCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250cm9scygpIHsKLQkJcHJvY2Vzc1RyZWVWaWV3ZXIuc2V0SW5wdXQoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJcHJvY2Vzc1RyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBldmVudCBoYW5kbGVycyB0byB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlwcm9jZXNzVHJlZVZpZXdlcgotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlPYmplY3Qgc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgVHJlZVNlbGVjdGlvbikgewotCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gKChUcmVlU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkJCQkJCXByb2Nlc3MgPSAoUHJvY2VzcykgZWxlbWVudDsKLQkJCQkJCQkJYnJpZWZEZXNjVGV4dC5zZXRUZXh0KHByb2Nlc3MKLQkJCQkJCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlwcm9jZXNzID0gbnVsbDsKLQkJCQkJCQkJYnJpZWZEZXNjVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShMaWJyYXJ5VUlSZXNvdXJjZXMubm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0UHJvY2VzcygpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNnZXROZXh0UGFnZURhdGEoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TmV4dFBhZ2VEYXRhKCkgewotCQlyZXR1cm4gZ2V0UHJvY2VzcygpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc2VsZWN0ZWQgcHJvY2Vzcy4KLQkgKi8KLQlwdWJsaWMgUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlyZXR1cm4gcHJvY2VzczsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNjYwMGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgd2l6YXJkcyBmb3IgbWFuYWdpbmcgYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWI3NzhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgWE1JIExpYnJhcnkgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YzMjUzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZjAzOTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBTZXAgMTEgMTI6MzE6NTcgUERUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy8vc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXMucHJvcGVydGllcz04ODU5XzEKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ2ZjVjNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5UGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnksCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5wcmVmZXJlbmNlcwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGIyZmM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjJlYzdmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgWE1JIExpYnJhcnkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlNjk4OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZGlhZ3JhbU1pZ3JhdGlvbiIgbmFtZT0iRGlhZ3JhbSBNaWdyYXRpb24iIHNjaGVtYT0ic2NoZW1hL0lEaWFncmFtTWlncmF0aW9uLmV4c2QiLz4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxpYnJhcnlNYW5hZ2VycyI+Ci0gICAgICA8bGlicmFyeU1hbmFnZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeU1hbmFnZXIiICAgICAgIAkJCi0gICAgICAgICAgICB0eXBlPSJ4bWkiCi0gICAgICAgICAgICB0eXBlTmFtZT0iWE1JIj4KLSAgICAgIDwvbGlicmFyeU1hbmFnZXI+ICAgICAKLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQub3Bwb3NpdGVGZWF0dXJlTG9hZGVycyI+Ci0gICAgICA8b3Bwb3NpdGVGZWF0dXJlTG9hZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuaW50ZXJuYWwuWE1JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc2NoZW1hL0lEaWFncmFtTWlncmF0aW9uLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc2NoZW1hL0lEaWFncmFtTWlncmF0aW9uLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNWJlNWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NjaGVtYS9JRGlhZ3JhbU1pZ3JhdGlvbi5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pIiBpZD0iSURpYWdyYW1NaWdyYXRpb24iIG5hbWU9IkRpYWdyYW0gTWlncmF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFByb3ZpZGUgZGlhZ3JhbSBtaWdyYXRpb24gQVBJLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGlhZ3JhbU1pZ3JhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRpYWdyYW1NaWdyYXRpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4yCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuSURpYWdyYW1NaWdyYXRpb24KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvSURpYWdyYW1NaWdyYXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL0lEaWFncmFtTWlncmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZmM3MDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvSURpYWdyYW1NaWdyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgZGlncmFtIG1pZ3JhdGlvbiAKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1IC0gTWFyY2ggMTksIDIwMDcKLSAqIEBzaW5jZSAgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURpYWdyYW1NaWdyYXRpb24gewotCi0Jdm9pZCBtaWdyYXRlKENvbGxlY3Rpb248UHJvY2Vzcz4gcHJvY2Vzc2VzKSB0aHJvd3MgRXhjZXB0aW9uOwotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MGNmNmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1maWxlUGF0aD1GaWxlIHBhdGgKLWNhbm5vdFdyaXRlVG9GaWxlcz1DYW5ub3Qgd3JpdGUgdG8gZmlsZShzKQotcmVhZE9ubHlGaWxlc190aXRsZT1SZWFkLW9ubHkgZmlsZShzKQotcmVhZE9ubHlGaWxlc19tc2c9VGhlIGZpbGVzIGxpc3RlZCBpbiBEZXRhaWxzIGFyZSByZWFkLW9ubHkuIE1ha2UgdGhlbSB3cml0YWJsZSBhbmQgY2xpY2sgb24gUmV0cnkgdG8gY29udGludWUuCi1lbGVtZW50UGF0aD1FbGVtZW50IHBhdGgKLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb01pc3NpbmdGaWxlc19tc2c9VGhlIGZvbGxvd2luZyBmaWxlcyBhcmUgbWlzc2luZy4gQ2xpY2sgT0sgaWYgeW91IHdhbnQgdG8gcmVtb3ZlIGV2ZXJ5IHJlZmVyZW5jZSB0byB0aGUgc2VsZWN0ZWQgZmlsZXMgaW4gdGhlIGxpYnJhcnkKLW1pc3NpbmdGaWxlc190aXRsZT1NaXNzaW5nIGZpbGUocykKLWxvYWRFcnJvcj1Mb2FkIGVycm9yCi1wcm9tcHRSZW1vdmVSZWZlcmVuY2VzVG9GaWxlc1dpdGhMb2FkRXJyb3JzX21zZz1UaGUgZm9sbG93aW5nIGZpbGUocykgY291bGQgbm90IGJlIGxvYWRlZC4gQ2xpY2sgT0sgaWYgeW91IHdhbnQgdG8gcmVtb3ZlIGV2ZXJ5IHJlZmVyZW5jZSB0byB0aGUgc2VsZWN0ZWQgZmlsZXMgaW4gdGhlIGxpYnJhcnkKLWZpbGVzV2l0aExvYWRFcnJvcnNfdGl0bGU9RmlsZShzKSB3aXRoIGxvYWQgZXJyb3IKLW1pZ3JhdGVYTUxMaWJyYXJ5X3Rhc2tOYW1lPU1pZ3JhdGluZyBYTUwgaW1wb3J0ZWQgbGlicmFyeQotCi0jIEVycm9yIE1lc3NhZ2VzCi1saWJyYXJ5QWxyZWFkeUV4aXN0c0Vycm9yX21zZz1BIG1ldGhvZCBsaWJyYXJ5IGFscmVhZHkgZXhpc3RzIGluICcnezB9JycuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeU1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZWVmMWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkRlYnVnVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5WZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5BYnN0cmFjdExpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlBbHJlYWR5RXhpc3RzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLk1vZGVsU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLk1hcHBpbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IFhNSSBMaWJyYXJ5IE1hbmFnZXIgaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNSUxpYnJhcnlNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RMaWJyYXJ5TWFuYWdlciB7Ci0JLyoqCi0JICogVGhlIHN1cHBvcnRlZCBsaWJyYXJ5IHR5cGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCUkFSWV9UWVBFID0gU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbGlicmFyeSBYTUkgZmlsZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQlJBUllfWE1JID0gTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9MSUJSQVJZX01PREVMX0ZJTEVOQU1FOwotCi0JLyoqCi0JICogVGhlIHBsdWdpbiBhbmQgY29uZmlnIHNwZWMgZXhwb3J0IGZpbGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBleHBvcnRGaWxlID0gTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9QTFVHSU5fRVhQT1JUX0ZJTEVOQU1FOwotCi0JLyoqCi0JICogVGhlIGxpYnJhcnkgcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdfTElCUkFSWV9QQVRIID0gImxpYnJhcnkucGF0aCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgbWFuYWdlZCBsaWJyYXJ5LgotCXByb3RlY3RlZCBTdHJpbmcgcGF0aDsKLQkKLQlwcml2YXRlIElMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWdyOwotCi0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCQotCXByaXZhdGUgU3RyaW5nIHJlZ2lzdGVyVHlwZSA9ICJEZWZhdWx0IjsJCS8vJE5PTi1OTFMtMSQgCi0JCi0JcHVibGljIFhNSUxpYnJhcnlNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCQlyZXNvdXJjZU1nciA9IG5ldyBYTUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgbmV3IG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIG1ldGhvZCBsaWJyYXJ5IHNwZWNpZmljIGFyZ3VtZW50cwotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGNyZWF0ZU1ldGhvZExpYnJhcnkoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gYXJncykKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIE1ldGhvZExpYnJhcnlbXSByZXN1bHRIb2xkZXIgPSBuZXcgTWV0aG9kTGlicmFyeVsxXTsKLQkJZmluYWwgTGlicmFyeVNlcnZpY2VFeGNlcHRpb25bXSBleGNlcHRpb25Ib2xkZXIgPSBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb25bMV07Ci0JCUlXb3Jrc3BhY2VSdW5uYWJsZSBhY3Rpb24gPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzdWx0SG9sZGVyWzBdID0gZG9DcmVhdGVNZXRob2RMaWJyYXJ5KG5hbWUsIGFyZ3MpOwotCQkJCX0KLQkJCQljYXRjaChMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWV4Y2VwdGlvbkhvbGRlclswXSA9IGU7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX07Ci0JCXRyeSB7Ci0JCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCXdvcmtzcGFjZS5ydW4oYWN0aW9uLCB3b3Jrc3BhY2UuZ2V0UnVsZUZhY3RvcnkoKS5jcmVhdGVSdWxlKHdvcmtzcGFjZS5nZXRSb290KCkpLCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJWE1JTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oZSk7Ci0JCX0KLQkJCi0JCWlmKGV4Y2VwdGlvbkhvbGRlclswXSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBleGNlcHRpb25Ib2xkZXJbMF07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdEhvbGRlclswXTsKLQl9Ci0JCQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBkb0NyZWF0ZU1ldGhvZExpYnJhcnkoU3RyaW5nIG5hbWUsIE1hcDxTdHJpbmcsIE9iamVjdD4gYXJncykKLQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImNyZWF0ZU1ldGhvZExpYnJhcnkiLCAibmFtZT0iICsgbmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDAgfHwgYXJncyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGFyZ3MuZ2V0KEFSR19MSUJSQVJZX1BBVEgpOwotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJRmlsZSBsaWJyYXJ5UGF0aCA9IG5ldyBGaWxlKHBhdGgpOwotCQlGaWxlIGxpYnJhcnlYTUlGaWxlID0gbmV3IEZpbGUobGlicmFyeVBhdGgsIExJQlJBUllfWE1JKTsKLQkJaWYgKGxpYnJhcnlYTUlGaWxlLmV4aXN0cygpKSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCVhNSUxpYnJhcnlSZXNvdXJjZXMubGlicmFyeUFscmVhZHlFeGlzdHNFcnJvcl9tc2csCi0JCQkJCWxpYnJhcnlQYXRoLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCXRocm93IG5ldyBMaWJyYXJ5QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbihtc2cpOwotCQl9Ci0KLQkJaWYgKCFsaWJyYXJ5UGF0aC5leGlzdHMoKSkgewotCQkJbGlicmFyeVBhdGgubWtkaXJzKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJc2tpcEV2ZW50UHJvY2Vzc2luZyA9IHRydWU7Ci0JCQlTdHJpbmcgcmVnVHlwZSA9IChTdHJpbmcpIGFyZ3MuZ2V0KEFSR19MSUJSQVJZX1JFR0lTVEVSX1RZUEUpOwotCQkJaWYgKHJlZ1R5cGUgIT0gbnVsbCAmJiByZWdUeXBlLmVxdWFscygiQ29uZmlnRXhwb3J0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyB0aW1lID0gTG9uZy50b0hleFN0cmluZyhDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpKTsKLQkJCQlNZXRob2RMaWJyYXJ5UHJvamVjdC5vcGVuUHJvamVjdChsaWJyYXJ5UGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSwgIkV4cG9ydExpYiIgKyB0aW1lLCAvLyROT04tTkxTLTEkCi0JCQkJCQludWxsKTsJCQotCQkJfSBlbHNlIHsgCQkJCQotCQkJCS8vIE9wZW4gdGhlIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgZmlsZS4KLQkJCQlwcm9qZWN0ID0gTWV0aG9kTGlicmFyeVByb2plY3Qub3BlblByb2plY3QobGlicmFyeVBhdGguZ2V0QWJzb2x1dGVQYXRoKCksCi0JCQkJCQludWxsKTsKLQkJCX0KLQkJCS8vIENyZWF0ZSB0aGUgcmVzb3VyY2Ugc2V0LgotCQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IChJTGlicmFyeVJlc291cmNlU2V0KSBlZGl0aW5nRG9tYWluCi0JCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCi0JCQkvLyBDcmVhdGUgYSBuZXcgbWV0aG9kIGxpYnJhcnkuCi0JCQlNb2RlbFN0b3JhZ2UubmV3TGlicmFyeShyZXNvdXJjZVNldCwgbmFtZSwgbGlicmFyeVBhdGgKLQkJCQkJLmdldEFic29sdXRlUGF0aCgpLCB0cnVlKTsKLQkJCWxpYnJhcnkgPSByZXNvdXJjZVNldC5nZXRGaXJzdE1ldGhvZExpYnJhcnkoKTsKLQotCQkJLy8gQWRkIGEgbGlzdGVuZXIgdG8gbW9uaXRvciBsaWJyYXJ5IHJlc291cmNlIGNoYW5nZXMuCi0JCQlhZGRSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcnMoKTsKLQotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLAotCQkJCQkJImNyZWF0ZU1ldGhvZExpYnJhcnkiLCAibGlicmFyeT0iICsgbGlicmFyeSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQlyZXR1cm4gbGlicmFyeTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNraXBFdmVudFByb2Nlc3NpbmcgPSBmYWxzZTsKLQotCQkJLy8gLy8gZXZlbnQgcHJvY2Vzc2VkIGluIExpYnJhcnlTZXJ2aWNlCi0JCQkvLyBub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ1JFQVRFRCwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkgVVJJCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgb3Blbk1ldGhvZExpYnJhcnkoamF2YS5uZXQuVVJJIHVyaSkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAib3Blbk1ldGhvZExpYnJhcnkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodXJpKTsKLQkJCWxpYnJhcnkgPSBvcGVuTWV0aG9kTGlicmFyeShmaWxlKTsKLQkJfSAKLQkJY2F0Y2goTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWxpYnJhcnkgPSBudWxsOwotCQl9Ci0KLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJvcGVuTWV0aG9kTGlicmFyeSIsICJsaWJyYXJ5PSIgKyBsaWJyYXJ5KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlyZXR1cm4gbGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIDxjb2RlPkZpbGU8L2NvZGU+IG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBwYXRoIHRvIHRoZQotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkuCi0JICogQHJldHVybiBhIDxjb2RlPk1ldGhvZExpYnJhcnk8L2NvZGU+LgotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5IG9wZW5NZXRob2RMaWJyYXJ5KEZpbGUgcGF0aCkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCUZpbGUgbGlicmFyeVhNSUZpbGUgPSBuZXcgRmlsZShwYXRoLCBMSUJSQVJZX1hNSSk7Ci0JCWlmICghbGlicmFyeVhNSUZpbGUuZXhpc3RzKCkpIHsKLQkJCXRocm93IG5ldyBMaWJyYXJ5Tm90Rm91bmRFeGNlcHRpb24oKTsKLQkJfQotCi0JCVZlcnNpb25VdGlsLlZlcnNpb25DaGVja0luZm8gaW5mbyA9IFZlcnNpb25VdGlsLmNoZWNrTGlicmFyeVZlcnNpb24obGlicmFyeVhNSUZpbGUpOwotCQlJU3RhdHVzIHN0YXR1cyA9IFhNSUxpYnJhcnlVdGlsLmNoZWNrVmVyc2lvbihsaWJyYXJ5WE1JRmlsZSwgaW5mbyk7Ci0JCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJZWxzZSBpZihNYXBwaW5nVXRpbC5jb252ZXJzaW9uUmVxdWlyZWQobGlicmFyeVhNSUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGluZm8pKSB7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oTGlicmFyeVJlc291cmNlcy5saWJVcGdyYWRlUmVxdWlyZWRfZXJyX21zZyk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlza2lwRXZlbnRQcm9jZXNzaW5nID0gdHJ1ZTsKLQotCQkJLy8gT3BlbiB0aGUgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBmaWxlLgotCQkJcHJvamVjdCA9IE1ldGhvZExpYnJhcnlQcm9qZWN0Lm9wZW5Qcm9qZWN0KHBhdGguZ2V0QWJzb2x1dGVQYXRoKCksIG51bGwpOwotCi0JCQkvLyBDcmVhdGUgdGhlIHJlc291cmNlIHNldC4KLQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoKElMaWJyYXJ5UmVzb3VyY2VTZXQpIGVkaXRpbmdEb21haW4KLQkJCQkJLmdldFJlc291cmNlU2V0KCkpOwotCi0JCQkvLyBMb2FkIHRoZSBtZXRob2QgbGlicmFyeS4KLQkJCXJlc291cmNlU2V0LmxvYWRNZXRob2RMaWJyYXJpZXMoVVJJLmNyZWF0ZUZpbGVVUkkobGlicmFyeVhNSUZpbGUKLQkJCQkJLmdldEFic29sdXRlUGF0aCgpKSwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCWxpYnJhcnkgPSByZXNvdXJjZVNldC5nZXRGaXJzdE1ldGhvZExpYnJhcnkoKTsKLQotCQkJLy8gQWRkIGEgbGlzdGVuZXIgdG8gbW9uaXRvciBsaWJyYXJ5IHJlc291cmNlIGNoYW5nZXMuCi0JCQlhZGRSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcnMoKTsKLQotCQkJU3lzdGVtLmdjKCk7Ci0JCQkKLQkJCXJldHVybiBsaWJyYXJ5OwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludChlKTsKLQkJCX0KLQkJCXRocm93IG5ldyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShsaWJyYXJ5LCBQUk9QX0RJUlRZKTsKLQkJCXNraXBFdmVudFByb2Nlc3NpbmcgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE9wZW5zIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIG1ldGhvZCBsaWJyYXJ5IHNwZWNpZmljIGFyZ3VtZW50cwotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IG9wZW5NZXRob2RMaWJyYXJ5KE1hcCBhcmdzKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJvcGVuTWV0aG9kTGlicmFyeSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoYXJncyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGFyZ3MuZ2V0KEFSR19MSUJSQVJZX1BBVEgpOwotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJbGlicmFyeSA9IG9wZW5NZXRob2RMaWJyYXJ5KG5ldyBGaWxlKHBhdGgpKTsKLQotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgIm9wZW5NZXRob2RMaWJyYXJ5IiwgImxpYnJhcnk9IiArIGxpYnJhcnkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXJldHVybiBsaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIFJlb3BlbnMgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgcmVvcGVuTWV0aG9kTGlicmFyeSgpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAicmVvcGVuTWV0aG9kTGlicmFyeSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlsaWJyYXJ5ID0gb3Blbk1ldGhvZExpYnJhcnkobmV3IEZpbGUoZ2V0TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkpKTsKLQotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgInJlb3Blbk1ldGhvZExpYnJhcnkiLCAibGlicmFyeT0iICsgbGlicmFyeSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcmV0dXJuIGxpYnJhcnk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5BYnN0cmFjdExpYnJhcnlNYW5hZ2VyI2dldExpYnJhcnlQZXJzaXN0ZXJUeXBlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExpYnJhcnlQZXJzaXN0ZXJUeXBlKCkgewotCQlyZXR1cm4gU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5BYnN0cmFjdExpYnJhcnlNYW5hZ2VyI2NyZWF0ZVJlc291cmNlU2V0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUxpYnJhcnlSZXNvdXJjZVNldCBjcmVhdGVSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlU2VydmljZS5JTlNUQU5DRQotCQkJCS5jcmVhdGVSZXNvdXJjZVNldChTZXJ2aWNlcy5YTUlfUEVSU0lTVEVOQ0VfVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiBGb3IgZGlzdHJpYnV0ZWQgbGlicmFyeSwgdGhpcyBpcyB0aGUgbGlicmFyeSdzIHdvcmtzcGFjZSBwYXRoLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZExpYnJhcnlMb2NhdGlvbigpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJnZXRNZXRob2RMaWJyYXJ5UGF0aCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlqYXZhLm5ldC5VUkkgbGlicmFyeVVSSSA9IGdldE1ldGhvZExpYnJhcnlVUkkoKTsKLQkJaWYgKGxpYnJhcnlVUkkgIT0gbnVsbCkgewotCQkJRmlsZSBsaWJyYXJ5WE1JRmlsZSA9IG5ldyBGaWxlKGxpYnJhcnlVUkkpOwotCQkJaWYgKGxpYnJhcnlYTUlGaWxlLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKExJQlJBUllfWE1JKSkgewotCQkJCWxpYnJhcnlYTUlGaWxlID0gbGlicmFyeVhNSUZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQkJfQotCQkJcmV0dXJuIGxpYnJhcnlYTUlGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBwcm9qZWN0IG9mIHRoZSBtZXRob2QgbGlicmFyeSBtYW5hZ2VkIGJ5IHRoaXMgbWFuYWdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRob2QgbGlicmFyeSBwcm9qZWN0Ci0JICovCi0JcHVibGljIElQcm9qZWN0IGdldE1ldGhvZExpYnJhcnlQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaGFuZGxlTGlicmFyeU1vdmVkKCkgewotCQlpZihsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgbG9jYXRpb24gPSBnZXRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKTsKLQkJaWYoIXByb2plY3QuaXNPcGVuKCkgfHwgcHJvamVjdC5nZXRMb2NhdGlvbigpLmVxdWFscyhuZXcgUGF0aChsb2NhdGlvbikpKSB7Ci0JCQkvLyBub3QgbW92ZWQKLQkJCS8vCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIHVwZGF0ZSBVUkkgb2YgYWxsIGxpYnJhcnkgcmVzb3VyY2VzCi0JCS8vCi0JCVJlc291cmNlIGxpYlJlc291cmNlID0gbGlicmFyeS5lUmVzb3VyY2UoKTsKLQkJaWYobGliUmVzb3VyY2UgPT0gbnVsbCB8fCBsaWJSZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgbmV3TG9jYXRpb24gPSBwcm9qZWN0LmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQlpZihsaWJSZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpIGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSB7Ci0JCQkoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbClsaWJSZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKS5oYW5kbGVMaWJyYXJ5TW92ZWQobmV3TG9jYXRpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJUGVyc2lzdGVuY2VVdGlsLnJlcGxhY2VVUklQcmVmaXgobmV3IEFycmF5TGlzdDxSZXNvdXJjZT4obGliUmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSksIAotCQkJCQlsb2NhdGlvbiwgbmV3TG9jYXRpb24pOwotCQl9Ci0JfQotCQotCi0JLyoqCi0JICogZ2V0IHRoZSByZXNvdXJjZSBtYW5hZ2VyIGZvciB0aGUgbGlicmFyeQotCSAqIEByZXR1cm4gSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyKCkgewotCQlyZXR1cm4gcmVzb3VyY2VNZ3I7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlciNiYWNrdXBNZXRob2RMaWJyYXJ5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgYmFja3VwTWV0aG9kTGlicmFyeShTdHJpbmcgcGF0aCkgewotCQlTdHJpbmcgbGliUGF0aFN0ciA9IGdldE1ldGhvZExpYnJhcnlMb2NhdGlvbigpOwotCQlGaWxlIGxpYlBhdGggPSBuZXcgRmlsZShsaWJQYXRoU3RyKTsKLQkJLy8gZXhjdWRlIHRoZSBub24tbGlicmFyeSBmaWxlcyB0aGF0IG1pZ2h0IGJlIGxvY2tlZCBieSBybWMuCi0JCS8vIHRoZXNlIGZpbGVzIG1heSBjYXVzZSBiYWNrdXAgdG8gZmFpbCBkdWUgdG8gZmlsZSBsb2NrLgotCQlTdHJpbmcgZXhjbHVkZXMgPSAiLmxvY2siOyAvLyROT04tTkxTLTEkCi0JCUxheW91dFJlc291cmNlcy5jb3B5RGlyKGxpYlBhdGgsIG5ldyBGaWxlKHBhdGgpLCAiKioiLCBleGNsdWRlcyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRSZWdpc3RlclR5cGUoKSB7Ci0JCXJldHVybiByZWdpc3RlclR5cGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFJlZ2lzdGVyVHlwZShTdHJpbmcgcmVnaXN0ZXJUeXBlKSB7Ci0JCXRoaXMucmVnaXN0ZXJUeXBlID0gcmVnaXN0ZXJUeXBlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXIjcmVnaXN0ZXJNZXRob2RMaWJyYXJ5KG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSwgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3Rlck1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWIsIAotCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbXMpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyByZWdUeXBlID0gKFN0cmluZykgcGFyYW1zLmdldChBUkdfTElCUkFSWV9SRUdJU1RFUl9UWVBFKTsKLQkJaWYgKHJlZ1R5cGUgIT0gbnVsbCkgewotCQkJc2V0UmVnaXN0ZXJUeXBlKHJlZ1R5cGUpOwotCQl9Ci0JCXJlZ1R5cGUgPSBnZXRSZWdpc3RlclR5cGUoKTsKLQkJaWYgKHJlZ1R5cGUuZXF1YWxzKCJDb25maWdFeHBvcnQiKSkgey8vJE5PTi1OTFMtMSQgCi0JCQkvL0ZvciBub3csIHN0aWxsIHNpbXBseSB3cmFwaW5nIHVwIG9sZCBpbXBsZW1lbnRhdGlvbiAoY29waWVkIGZyb20gQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UpIGZvciBzbW9vdGhlciBjaGFuZ2U7IHdpbGwgZGVmaW5ldGx5IGNoYW5nZSBsYXRlcgotCQkJLy9zbyB0aGF0IGNyZWF0aW5nIGEgbmV3IGxpYiB3b3VsZCBub3QgYmUgbmVlZGVkCQkKLQkJCVN0cmluZyBuYW1lID0gImxpYnJhcnkueG1pIjsJLy8kTk9OLU5MUy0xJDsJCi0JCQljcmVhdGVNZXRob2RMaWJyYXJ5KG5hbWUsIHBhcmFtcyk7Ci0JCQlzZXRNZXRob2RMaWJyYXJ5KGxpYik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vTWluaW11bSBpbXBsZW1lbnRhdGlvbiBmb3IgZGVmYXVsIHJlZ2lzdGVyIHR5cGUsIHRvIG1pbmltaXplIGNhbGxlciBjb2RlIGNoYW5nZQotCQl0aGlzLmxpYnJhcnkgPSBsaWI7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlciN1blJlZ2lzdGVyTWV0aG9kTGlicmFyeSgpCi0JICovCi0JcHVibGljIHZvaWQgdW5SZWdpc3Rlck1ldGhvZExpYnJhcnkoKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAoZ2V0UmVnaXN0ZXJUeXBlKCkuZXF1YWxzKCJDb25maWdFeHBvcnQiKSkgey8vJE5PTi1OTFMtMSQgCi0JCQljbG9zZU1ldGhvZExpYnJhcnkoKTsKLQkJCXJldHVybjsKLQkJfQotCQkvL01pbmltdW0gaW1wbGVtZW50YXRpb24gZm9yIGRlZmF1bCByZWdpc3RlciB0eXBlLCB0byBtaW5pbWl6ZSBjYWxsZXIgY29kZSBjaGFuZ2UKLQkJdGhpcy5saWJyYXJ5ID0gbnVsbDsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjE2YjljLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5BYnN0cmFjdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgWE1JIExpYnJhcnkgcGx1Zy1pbiBhY3RpdmF0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1JTGlicmFyeVBsdWdpbiBleHRlbmRzIEFic3RyYWN0QWN0aXZhdG9yIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBYTUlMaWJyYXJ5UGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFhNSUxpYnJhcnlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmNvcmUucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuY29yZS5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhNSUxpYnJhcnlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2NGUyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9YTUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBYTUkgbGlicmFyeSByZXNvdXJjZSBtYW1hZ2VyCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgWE1JTGlicmFyeVJlc291cmNlTWFuYWdlciBpbXBsZW1lbnRzIElMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIHsKLQotCXB1YmxpYyBYTUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyKCkgewotCX0KLQotCQotCS8qKgotCSAqIGdldCB0aGUgbG9naWNhbCBwYXRoIG9mIHRoZSBlbGVtZW50IGluIHRoZSBsaWJyYXJ5LAotCSAqIHRoZSBwYXRoIHNob3VsZCBzdGFydCB3aXRoIHRoZSBwbHVnaW4gbmFtZS4gCi0JICogaS5lLiA8cGx1Z2luIG5hbWU+L3BhdGgvdG8vZWxlbWVudAotCSAqIAotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBzaG91bGQgZW5jYXBzdWxhdGUgdGhlIHBoeXNpY2FsIHN0b3JhZ2UgCi0JICogb2YgdGhlIHJlc291cmNlIGFuZCByZXR1cm4gdGhlIHBhdGggb2YgdGhlIGVsZW1lbnQgc3RhcnQgd2l0aCBpdCdzIHBsdWdpbiBuYW1lCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2dpY2FsUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBwYXRoID0gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5nZXRFbGVtZW50VmlydHVhbFBhdGgoZWxlbWVudCk7Ci0JCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGguZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJXYXJuaW5nISBObyBQYXRoIGZvciBFbGVtZW50IFsiICsgZWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjogIiArIGVsZW1lbnQuZ2V0TmFtZSgpICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBmaXhQYXRoKHBhdGgpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50J3MgYmFjayBwYXRoIG9mIHRoZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBsb2dpY2FsIHBhdGgsIGZvciBleGFtcGxlLAotCSAqICJPcGVuVVBcZ3VpZGFuY2VcY29uY2VwdFxjMS54bWwiLCB0aGUgYmFjayBwYXRoIGlzICIuLy4uLy4uLy4uLyIKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQkvLyBMaW51eDogQnJvd3NpbmcgYW5kIHByZXZpZXcgc2hvd3Mgb25seSBwbGFpbiB0ZXh0LgotCQkvLyBUaGVyZSBhcmUgbm8gaW1hZ2VzL3NlY3Rpb25zCi0JCS8vIGVsZW1lbnQgcGF0aCBzaG91bGQgY2hlY2sgRmlsZS5zZXBhcmF0b3JDaGFyIGluc3RlYWQgb2YgIlwiCi0JCVN0cmluZyBiYWNrUGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBwYXRoID0gZ2V0TG9naWNhbFBhdGgoZWxlbWVudCk7Ci0JCWlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5sZW5ndGgoKSA+IDApIHsKLQkJCWJhY2tQYXRoID0gcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKS5yZXBsYWNlQWxsKAotCQkJCQkiLio/LyIsICJcXC5cXC4vIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiAiLi8iICsgYmFja1BhdGg7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogZml4IHRoZSBwYXRoIGJ5IGFwcGVuZGluZyBhIEZpbGUuc2VwZXJhdG9yIHRvIHRoZSBlbmQgb2YgaXQKLQkgKiBAcGFyYW0gcGF0aCBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZpeFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoIXBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0JCQlyZXR1cm4gcGF0aCArIEZpbGUuc2VwYXJhdG9yOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHBhdGg7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGxvZ2ljYWwgcmVzb3VyY2UgcGF0aCBvZiB0aGUgZWxlbWVudCBpbiB0aGUKLQkgKiBsaWJyYXJ5LiB0aGUgcGF0aCBzaG91bGQgc3RhcnQgd2l0aCB0aGUgcGx1Z2luIG5hbWUuIAotCSAqIGkuZS4gPHBsdWdpbiBuYW1lPi9wYXRoL3RvL2VsZW1lbnQvcmVzb3VyY2VzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2dpY2FsUmVzb3VyY2VQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgcGF0aCA9IE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuZ2VSZXNvdXJjZVZpcnR1YWxQYXRoKGVsZW1lbnQpOwotCQlyZXR1cm4gZml4UGF0aChwYXRoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgcGh5c2ljYWwgcGF0aCBvZiBhIG1ldGhvZCBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBwaHlzaWNhbCBwYXRoIG9mIHRoZSBlbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQaHlzaWNhbFBhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmICggZWxlbWVudCA9PSBudWxsICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUlGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IGdldEZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIoZWxlbWVudCk7Ci0JCXJldHVybiBwZXJzaXN0ZXIgIT0gbnVsbCA/IGZpeFBhdGgocGVyc2lzdGVyLmdldEZvbGRlckFic29sdXRlUGF0aChlbGVtZW50KSkgOiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXNvdXJjZSBmb2xkZXIgb2YgdGhlIGVsZW1lbnQgaW4gdGhlIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIHRoZSBwaHlzaWNhbCByZXNvdXJjZSBwYXRoIG9mIHRoZSBlbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQaHlzaWNhbFJlc291cmNlUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gZ2V0RmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcihlbGVtZW50KTsKLQkJcmV0dXJuIHBlcnNpc3RlciAhPSBudWxsID8gZml4UGF0aChwZXJzaXN0ZXIuZ2V0UmVzb3VyY2VGb2xkZXJQYXRoKGVsZW1lbnQpKSA6IG51bGw7Ci0JfQotCQotCXByaXZhdGUgSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgZ2V0RmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcihNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlbGVtZW50LmVSZXNvdXJjZSgpOwotCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlJTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0UGVyc2lzdGVyRm9yKHJlc291cmNlKTsKLQkJCWlmKHBlcnNpc3RlciBpbnN0YW5jZW9mIElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKSB7Ci0JCQkJcmV0dXJuICgoSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpcGVyc2lzdGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBsb2dpY2FsIHBhdGggb2YgdGhlIHBsdWdpbiAKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2dpY2FsUGx1Z2luUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCXJldHVybiBwbHVnaW4uZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3I7Ci0JCX0gCi0JCQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBwaHlzaWNhbCBwYXRoIG9mIHRoZSBwbHVnaW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGh5c2ljYWxQbHVnaW5QYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFBoeXNpY2FsUGF0aChwbHVnaW4pOwotCQl9IAotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JCi0JLyoqCi0JICogZ2V0IHRoZSBwaHlzaWNhbCBwYXRoIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbG9naWNhbCBwYXRoCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudCBhbiBlbGVtZW50IGluIHRoZSBsaWJyYXJ5IHRvIGFjY2VzcyB0aGUgbGlicmFyeSByZXNvdXJjZQotCSAqIHVzdWFsbHkgdGhpcyBpcyB0aGUgb3duZXIgZWxlbWVudCB0aGF0IHJlZmVyZW5jZXMgdGhlIGxvZ2ljYWxQYXRoCi0JICogQHBhcmFtIGxvZ2ljYWxQYXRoIFN0cmluZwotCSAqIEByZXR1cm4gU3RyaW5nIHRoZSBwaHlzaWNhbCBwYXRoIHJlc29sdmVkIGZyb20gdGhlIGxvZ2ljYWwgcGF0aAotCSAqCi0JICogZm9yIGV4YW1wbGUsIGVsZW1lbnQgdGFzazEsIGxvZ2ljYWwgcGF0aCBpcyAicGx1Z2luIDEvdGFza3MvdGFzazEuaHRtbCIKLQkgKiB0aGUgcmV0dXJuZWQgcGh5c2ljYWwgcGF0aCBpcyA8cGx1Z2luIGxvY2F0aW9uPi9wYXRoL3RvL2VsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCAKLQkgKiBAcGFyYW0gbG9naWNhbFBhdGggdGhlIGxvZ2ljYWwgcGF0aCBvZiB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGxvZ2ljYWxQYXRoKSB7Ci0KLQkJLy8gdXNlIHRoZSBwbHVnaW4gbmFtZSBpbiB0aGUgbG9naWNhbCBwYXRoCi0JCS8vIGZpbmQgdGhlIE1ldGhvZFBsdWdpbiBvYmplY3QKLQkJLy8gZmluZCB0aGUgcGx1Z2luUGF0aAotCQkJCQotCQkvLyBzdHJpcCBvZmYgdGhlIGZpcnN0IGZvbGRlciBpbiB0aGUgcmVscGF0aCBzaW5jZSB0aGlzIGlzIHRoZSBwbHVnaW4gbmFtZQotCQlsb2dpY2FsUGF0aCA9IGxvZ2ljYWxQYXRoLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCQlpbnQgaSA9IGxvZ2ljYWxQYXRoLmluZGV4T2YoRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJaWYgKCBpID4gMCApIHsKLQkJCVN0cmluZyBwbHVnaW5OYW1lID0gbG9naWNhbFBhdGguc3Vic3RyaW5nKDAsIGkpOwotCQkJU3RyaW5nIHBsdWdpblBhdGggPSBudWxsOyAKLQotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZWxlbWVudCk7Ci0JCQlMaXN0IHBsdWdpbnMgPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW5zKGxpYik7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4paXQubmV4dCgpOwotCQkJCWlmICggcGx1Z2luLmdldE5hbWUoKS5lcXVhbHMocGx1Z2luTmFtZSkgKSB7Ci0JCQkJCXBsdWdpblBhdGggPSBnZXRQaHlzaWNhbFBsdWdpblBhdGgocGx1Z2luKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoIHBsdWdpblBhdGggIT0gbnVsbCApIHsKLQkJCQlyZXR1cm4gcGx1Z2luUGF0aCArIGxvZ2ljYWxQYXRoLnN1YnN0cmluZyhpKzEpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQkJCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTFkYjFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIFhNSSBMaWJyYXJ5IHJlc291cmNlIGJ1bmRsZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1JTGlicmFyeVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBYTUlMaWJyYXJ5UmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbm5vdFdyaXRlVG9GaWxlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRQYXRoOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZVBhdGg7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlc1dpdGhMb2FkRXJyb3JzX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZEVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWlzc2luZ0ZpbGVzX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvbXB0UmVtb3ZlUmVmZXJlbmNlc1RvRmlsZXNXaXRoTG9hZEVycm9yc19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9tcHRSZW1vdmVSZWZlcmVuY2VzVG9NaXNzaW5nRmlsZXNfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZE9ubHlGaWxlc19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkT25seUZpbGVzX3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlBbHJlYWR5RXhpc3RzRXJyb3JfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pZ3JhdGVYTUxMaWJyYXJ5X3Rhc2tOYW1lOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgWE1JTGlicmFyeVJlc291cmNlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBYTUlMaWJyYXJ5UmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9YTUlMaWJyYXJ5VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmQ2ODgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5WZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEhlbHBlciB1dGlsaXRpZXMgZm9yIGFjY2Vzc2luZyBhIFhNSSBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1JTGlicmFyeVV0aWwgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX01FVEhPRF9MSUJSQVJZX1BBVEhfTVNHID0gTGlicmFyeVJlc291cmNlcy5lbXB0eUxpYnJhcnlQYXRoRXJyb3JfcmVhc29uOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfTElCUkFSWV9GSUxFX01TRyA9IExpYnJhcnlSZXNvdXJjZXMubWlzc2luZ0xpYnJhcnlGaWxlRXJyb3JfcmVhc29uOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPVUxEX05PVF9MT0NLX0xJQlJBUllfTVNHID0gTGlicmFyeVJlc291cmNlcy5jb3VsZE5vdExvY2tMaWJyYXJ5X3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVN0YXR1cyBFTVBUWV9NRVRIT0RfTElCUkFSWV9QQVRIX1NUQVRVUyA9IG5ldyBTdGF0dXMoCi0JCQlTdGF0dXMuRVJST1IsIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksIDEsCi0JCQlFTVBUWV9NRVRIT0RfTElCUkFSWV9QQVRIX01TRywgbnVsbCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElTdGF0dXMgTUlTU0lOR19MSUJSQVJZX0ZJTEVfU1RBVFVTID0gbmV3IFN0YXR1cygKLQkJCVN0YXR1cy5FUlJPUiwgTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgMSwKLQkJCU1JU1NJTkdfTElCUkFSWV9GSUxFX01TRywgbnVsbCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElTdGF0dXMgQ09VTERfTk9UX0xPQ0tfTElCUkFSWV9TVEFUVVMgPSBuZXcgU3RhdHVzKAotCQkJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAxLAotCQkJQ09VTERfTk9UX0xPQ0tfTElCUkFSWV9NU0csIG51bGwpOwotCi0Jc3RhdGljIHsKLQkJdHJ5IHsKLQkJCS8vIFRPRE86IFRoaXMgY2FsbCBpcyBuZWVkZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcGVyc2lzdGVuY2UgbGF5ZXIKLQkJCS8vIHRvIGF2b2lkIGEgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbiBpbgotCQkJLy8gUGVyc2lzdGVuY2VVdGlsLmNvbnZlcnNpb25SZXF1aXJlZCgpLiBBIGJldHRlciBzb2x1dGlvbiBpcwotCQkJLy8gbmVlZGVkLgotCQkJbmV3IE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbWV0aG9kIGxpYnJhcnkgZXhpc3RzIG9uIGEgZ2l2ZW4gcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcGF0aCBjb250YWlucyBhIHZhbGlkIG1ldGhvZAotCSAqICAgICAgICAgbGlicmFyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNNZXRob2RMaWJyYXJ5KFN0cmluZyBwYXRoKSB7Ci0JCWlmIChwYXRoID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCUZpbGUgbGlicmFyeURpciA9IG5ldyBGaWxlKHBhdGgpOwotCQlpZiAoIWxpYnJhcnlEaXIuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUZpbGUgbGlicmFyeUZpbGUgPSBuZXcgRmlsZShsaWJyYXJ5RGlyLCBYTUlMaWJyYXJ5TWFuYWdlci5MSUJSQVJZX1hNSSk7Ci0JCWlmICghbGlicmFyeUZpbGUuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeSBtb2RlbCAobGlicmFyeS54bWkpIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm50IGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeSBtb2RlbCBmaWxlIChpZiBvbmUgZXhpc3RzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExpYnJhcnlNb2RlbEZpbGUoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKCFTdHJVdGlsLmlzQmxhbmsocGF0aCkpIHsKLQkJCVN0cmluZyBsaWJQYXRoID0gbmV3IEZpbGUocGF0aCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQlTdHJpbmcgc3VmZml4ID0gRmlsZS5zZXBhcmF0b3IKLQkJCQkJKyBNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0xJQlJBUllfTU9ERUxfRklMRU5BTUU7Ci0JCQlpZiAobGliUGF0aC5lbmRzV2l0aChzdWZmaXgpKSB7Ci0JCQkJcmV0dXJuIGxpYlBhdGg7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBsaWJQYXRoICsgc3VmZml4OwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyBhIG1ldGhvZCBsaWJyYXJ5IHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeQotCSAqIEBwYXJhbSB2YWxpZGF0ZU1vZGVsRmlsZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHZhbGlkYXRlIHRoYXQgdGhlIGxpYnJhcnkueG1pIGZpbGUKLQkgKiAgICAgICAgICAgIGFsc28gZXhpc3RzLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHBhdGggaXMgYSB2YWxpZCBtZXRob2QgbGlicmFyeQotCSAqICAgICAgICAgZm9sZGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGlzVmFsaWRMaWJyYXJ5KFN0cmluZyBwYXRoLCBib29sZWFuIHZhbGlkYXRlTW9kZWxGaWxlKSB7Ci0JCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIEVNUFRZX01FVEhPRF9MSUJSQVJZX1BBVEhfU1RBVFVTOwotCQl9Ci0KLQkJaWYgKHZhbGlkYXRlTW9kZWxGaWxlKSB7Ci0JCQlGaWxlIGxpYkZpbGUgPSBuZXcgRmlsZShnZXRMaWJyYXJ5TW9kZWxGaWxlKHBhdGgpKTsKLQkJCWlmICghbGliRmlsZS5leGlzdHMoKSkgewotCQkJCXJldHVybiBNSVNTSU5HX0xJQlJBUllfRklMRV9TVEFUVVM7Ci0JCQl9Ci0JCX0KLQotCQlGaWxlIGxpYlBhdGggPSBuZXcgRmlsZShwYXRoKTsKLQkJaWYgKHBhdGguZW5kc1dpdGgoTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9MSUJSQVJZX01PREVMX0ZJTEVOQU1FKSkgewotCQkJbGliUGF0aCA9IGxpYlBhdGguZ2V0UGFyZW50RmlsZSgpOwotCQl9Ci0KLQkJU3RyaW5nIGxpYkZ1bGxQYXRoID0gbGliUGF0aC5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotCQlpZiAobGliRnVsbFBhdGguc3RhcnRzV2l0aCgiXFwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyB0aGUgZmlyc3QgcGFydCBtdXN0IGJlIGEgbWFjaGluZSBuYW1lLCBhbmQgeW91IG11c3Qgc3BlY2lmeSBhCi0JCQkvLyBmb2xkZXIKLQotCQkJYm9vbGVhbiBpc1ZhbGlkID0gdHJ1ZTsKLQkJCVN0cmluZyB1bmNQYXRoOwotCQkJaW50IGluZGV4ID0gbGliRnVsbFBhdGguaW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIsIDIpOwotCQkJaWYgKGluZGV4IDwgMCkgewotCQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdW5jUGF0aCA9IGxpYkZ1bGxQYXRoLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJCWlmICh1bmNQYXRoLmxlbmd0aCgpID09IDApIHsKLQkJCQkJLy8gbXVzdCBzcGVjaWZ5IGEgdmFsaWQgcGF0aAotCQkJCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gdGhlIHRvcCBsZXZlbCBwYXRoIG11c3QgYmUgdmFsaWQKLQkJCQkJaW5kZXggPSBsaWJGdWxsUGF0aC5pbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhciwgaW5kZXggKyAxKTsKLQkJCQkJaWYgKGluZGV4IDwgMCkgewotCQkJCQkJdW5jUGF0aCA9IGxpYkZ1bGxQYXRoOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdW5jUGF0aCA9IGxpYkZ1bGxQYXRoLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJCX0KLQotCQkJCQlGaWxlIGYgPSBuZXcgRmlsZSh1bmNQYXRoKTsKLQkJCQkJaWYgKCFmLmV4aXN0cygpKSB7Ci0JCQkJCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghaXNWYWxpZCkgewotCQkJCS8vIG5vIG5ldyByZXNvdXJjZSBzdHJpbmcsIHdhaXQgbGF0ZXIKLQkJCQkvLyByZXR1cm4gbmV3IFN0YXR1cyhTdGF0dXMuRVJST1IsCi0JCQkJLy8gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgMSwgIkludmFsaWQgcGF0aCIsIG51bGwpOwotCQkJCXJldHVybiBFTVBUWV9NRVRIT0RfTElCUkFSWV9QQVRIX1NUQVRVUzsKLQkJCX0KLQkJfQotCi0JCS8vIENoZWNrIGZvciBwcmVzZW5jZSBvZiBhIC5wcm9qZWN0IGZpbGUuCi0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBudWxsOwotCQl0cnkgewotCQkJZGVzY3JpcHRpb24gPSBSZXNvdXJjZXNQbHVnaW4KLQkJCQkJLmdldFdvcmtzcGFjZSgpCi0JCQkJCS5sb2FkUHJvamVjdERlc2NyaXB0aW9uKAotCQkJCQkJCW5ldyBQYXRoKGxpYkZ1bGxQYXRoICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCQkJCSsgSVByb2plY3REZXNjcmlwdGlvbi5ERVNDUklQVElPTl9GSUxFX05BTUUpKTsKLQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJLy8gSWYgYSAucHJvamVjdCBmaWxlIGRvZXMgbm90IGV4aXN0cywgdXNlIGl0IHRvIHZhbGlkYXRlIHRoZSBwYXRoLgotCQkvLyBvbmx5IGNhbGwgdmFsaWRhdGVQcm9qZWN0TG9jYXRpb24gaWYgcGF0aCBpcyBub3Qgb24gd29ya3NwYWNlCi0JCS8vIGZvciBzb21lIHJlYXNvbiwgdmFsaWRhdGVQcm9qZWN0TG9jYXRpb24gb25seSB3b3JrcyBvbiBwYXRocyBub3Qgb24KLQkJLy8gdGhlIHdvcmtzcGFjZQotCQlpZiAoUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS5pc1ByZWZpeE9mKG5ldyBQYXRoKGxpYkZ1bGxQYXRoKSkpIHsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZVV0aWwuZmluZFByb2plY3QobGliRnVsbFBhdGgpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQlwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KAotCQkJCQlsaWJQYXRoLmdldE5hbWUoKSk7Ci0JCX0KLQotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlUHJvamVjdExvY2F0aW9uKHByb2plY3QsCi0JCQkJbmV3IFBhdGgobGliRnVsbFBhdGgpKTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgYSBtZXRob2QgbGlicmFyeSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBwYXRoIGlzIGEgdmFsaWQgbWV0aG9kIGxpYnJhcnkKLQkgKiAgICAgICAgIGZvbGRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBpc1ZhbGlkTGlicmFyeShTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gaXNWYWxpZExpYnJhcnkocGF0aCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbWV0aG9kIGxpYnJhcnkgbmVlZHMgdG8gYmUgdXBncmFkZWQgdG8gYSBuZXcgZm9ybWF0LgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBBbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgbGlicmFyeSBuZWVkcyB0byBiZSB1cGdyYWRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01ldGhvZExpYnJhcnlVcGdyYWRlUmVxdWlyZWQoU3RyaW5nIHBhdGgsCi0JCQlWZXJzaW9uVXRpbC5WZXJzaW9uQ2hlY2tJbmZvIGluZm8pIHsKLQkJcmV0dXJuIGlzTWV0aG9kTGlicmFyeVVwZ3JhZGVSZXF1aXJlZChwYXRoLAotCQkJCVhNSUxpYnJhcnlNYW5hZ2VyLkxJQlJBUllfWE1JLCBpbmZvKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNZXRob2RMaWJyYXJ5VXBncmFkZVJlcXVpcmVkKFN0cmluZyBwYXRoLAotCQkJU3RyaW5nIGxpYlhtaSwgVmVyc2lvblV0aWwuVmVyc2lvbkNoZWNrSW5mbyBpbmZvKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLk1hcHBpbmdVdGlsCi0JCQkJLmNvbnZlcnNpb25SZXF1aXJlZChwYXRoICsgRmlsZS5zZXBhcmF0b3IgKyBsaWJYbWksIGluZm8pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgWE1JIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBuZXcgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RMaWJyYXJ5IGNyZWF0ZU1ldGhvZExpYnJhcnkoU3RyaW5nIG5hbWUsIFN0cmluZyBwYXRoKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJTWFwPFN0cmluZywgT2JqZWN0PiBhcmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCWFyZ3MucHV0KFhNSUxpYnJhcnlNYW5hZ2VyLkFSR19MSUJSQVJZX1BBVEgsIHBhdGgpOwotCQlyZXR1cm4gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jcmVhdGVNZXRob2RMaWJyYXJ5KG5hbWUsCi0JCQkJWE1JTGlicmFyeU1hbmFnZXIuTElCUkFSWV9UWVBFLCBhcmdzKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhbiBleGlzdGluZyBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RMaWJyYXJ5IG9wZW5NZXRob2RMaWJyYXJ5KFN0cmluZyBwYXRoKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJTWFwPFN0cmluZywgT2JqZWN0PiBhcmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCWFyZ3MucHV0KFhNSUxpYnJhcnlNYW5hZ2VyLkFSR19MSUJSQVJZX1BBVEgsIHBhdGgpOwotCQlyZXR1cm4gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5vcGVuTWV0aG9kTGlicmFyeSgKLQkJCQlYTUlMaWJyYXJ5TWFuYWdlci5MSUJSQVJZX1RZUEUsIGFyZ3MpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoZSBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuTWV0aG9kTGlicmFyeVByb2plY3QoTWV0aG9kTGlicmFyeSBsaWJyYXJ5LAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChsaWJyYXJ5ICE9IG51bGwgJiYgbGlicmFyeS5lUmVzb3VyY2UoKSAhPSBudWxsCi0JCQkJJiYgbGlicmFyeS5lUmVzb3VyY2UoKS5nZXRVUkkoKS5pc0ZpbGUoKSkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlVXRpbC5maW5kUHJvamVjdChsaWJyYXJ5KTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgIXByb2plY3QuaXNPcGVuKCkpIHsKLQkJCQl0cnkgewotCQkJCQlwcm9qZWN0Lm9wZW4oSVJlc291cmNlLkJBQ0tHUk9VTkRfUkVGUkVTSCwgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVhNSUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIHRoZSBkaXJlY3RvcnkgZ2l2ZW4gYnkgc3BlY2lmaWVkIHBhdGggY29udGFpbnMgYSBwbHVnaW4gb3IKLQkgKiBjb25maWcgc3BlYyBleHBvcnQgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zUGx1Z2luT3JDb25maWdTcGVjRXhwb3J0RmlsZShTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlwYXRoID0gbmV3IEZpbGUocGF0aCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCXBhdGggKz0gRmlsZS5zZXBhcmF0b3IgKyBYTUlMaWJyYXJ5TWFuYWdlci5leHBvcnRGaWxlOwotCQlGaWxlIGV4cG9ydEZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJcmV0dXJuIGV4cG9ydEZpbGUuZXhpc3RzKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrVmVyc2lvbihGaWxlIGZpbGUsCi0JCQlWZXJzaW9uVXRpbC5WZXJzaW9uQ2hlY2tJbmZvIGluZm8pIHsKLQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLnJlc3VsdCA+IDApIHsKLQkJCVN0cmluZyBtZXNzYWdlOwotCQkJaWYgKGluZm8udG9vbElELmVxdWFscyhWZXJzaW9uVXRpbC5nZXRQcmltYXJ5VG9vbElEKCkpKSB7Ci0JCQkJbWVzc2FnZSA9IE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMub2xkVG9vbFZlcnNpb25fZXJyX21zZywKLQkJCQkJCW5ldyBPYmplY3RbXSB7IFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCksCi0JCQkJCQkJCWluZm8udG9vbFZlcnNpb24sIGZpbGUgfSk7Ci0JCQl9IGVsc2UgewotCQkJCW1lc3NhZ2UgPSBOTFMuYmluZCgKLQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMudG9vbFZlcnNpb25NaXNtYXRjaF9lcnJfbXNnLAotCQkJCQkJbmV3IE9iamVjdFtdIHsgUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKSB9KTsKLQkJCX0KLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFhNSUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRJZCgpLCAwLCBtZXNzYWdlLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9MaWJyYXJ5UHJvY2Vzc29yLnR4dCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL0xpYnJhcnlQcm9jZXNzb3IudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWI0MWE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL0xpYnJhcnlQcm9jZXNzb3IudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTI0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUxvY2s7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlZlcnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTW9kZWxTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVYTUlTYXZlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklNZXRob2RMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQcm9wZXJ0eUxpc3RlbmVyOwotCi0vKioKLSAqIE1hbmFnZXMgYSBNZXRob2QgTGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlQcm9jZXNzb3IgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUF9ESVJUWSA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIExpYnJhcnlQcm9jZXNzb3IgaW5zdGFuY2UgPSBudWxsOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOwotCi0JLy8gbWFpbnRhaW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBjb25maWd1cmF0aW9uCi0JLy8gdXNlciBzaG91bGQgY2FsbCBzZXQvZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSBtZXRob2RzCi0JLy8gcHJvdGVjdGVkIFN0cmluZyBjdXJyZW50Q29uZmlnTmFtZSA9IG51bGw7Ci0KLQlwcml2YXRlIE1hcCBzYXZlT3B0aW9uczsKLQotCS8vIHByaXZhdGUgTWFwIHNhdmVBc09wdGlvbnM7Ci0JLy8gcHJpdmF0ZSBTZXQgZUNsYXNzZXM7Ci0KLQlwcml2YXRlIExpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8ga2VlcCB0aGUgbGlzdGVuZXJzIHRvIGJlIGRlbGV0ZWQsIGRvIHRoZSBkZWxldGUgYmVmb3JlIGVhY2ggbm90aWZpY2F0aW9uCi0JLy8gYW5kIGVtcHR5IHRoaXMgbGlzdC4KLQkvLyBkb24ndCBkZWxldGUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgbm90aWZpY2F0aW9uIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8KLQkvLyBjaGFuZ2UgdGhlIGxpc3RlbmVyIGxpc3QgYXQgdGhpcyB0aW1lCi0JcHJpdmF0ZSBMaXN0IHRtcF9saXN0ZW5lcnNfdG9iZV9kZWxldGVkID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gcHJpdmF0ZSBib29sZWFuIGlzTXVsdGlwbGVGaWxlcyA9IGZhbHNlOwotCi0JLy8gcHJpdmF0ZSBib29sZWFuIGRpcnR5ID0gZmFsc2U7Ci0KLQlib29sZWFuIGxvYWRlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIGluT3BlcmF0aW9uID0gZmFsc2U7Ci0KLQlwcml2YXRlIFZlcnNpb25NYW5hZ2VyIHZlcnNpb25NZ3IgPSBudWxsOwotCi0JcHJpdmF0ZSBFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNZ3IgPSBudWxsOzsKLQotCS8vIFJBVExDMDAzODQ1OTggLSBFeHBvcnQ6IEluZmluaXRlIGxvb3AgTnVsbHBvaW50ZXJFeGNlcHRpb24gYWZ0ZXIKLQkvLyBleHBvcnRpbmcgYW5kIHVuY2hlY2tpbmcgcnVwIHBsdWdpbiBpbiBjb25maWd1cmF0aW9uCi0JLy8gYWRkIHRoaXMgZmxhZyB0byB0cmVhdCB0aGUgaW5zdGFuY2UgYXMgc2luZ2xldG9uIGluc3RhY25lIG9yIG5vdAotCS8vIG9ubHkgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBjYW4gZGlzcG9zZSBzaGFyZWQgb2JqZWN0cy4KLQlwcml2YXRlIGJvb2xlYW4gaXNTaW5nbGV0b25JbnN0YW5jZSA9IGZhbHNlOwotCi0JLy8gdGhlIGxvY2sgb24gdGhlIGxpYnJhcnkncyAucHJvamVjdCBmaWxlCi0JcHJpdmF0ZSBGaWxlTG9jayBsb2NrOwotCi0JLy9UT0RPOiBmaW5kIGEgYmV0dGVyIHdheSB0byBub3RpZnkgdGhlIGNoYW5nZSBpbiBsaWJyYXJ5IGluc3RlYWQgb2YgcmVseWluZyBvbiB0aGUgY29tbWFuZCBzdGFjayBsaXN0ZW5lcgotCXByaXZhdGUgQ29tbWFuZFN0YWNrTGlzdGVuZXIgY29tbWFuZFN0YWNrTGlzdGVuZXIgPSBuZXcgQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoZmluYWwgRXZlbnRPYmplY3QgZXZlbnQpIHsKLQkJCWlmICghaW5PcGVyYXRpb24pIHsKLQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkvLyBUcnkgdG8gc2VsZWN0IHRoZSBhZmZlY3RlZCBvYmplY3RzLgotCQkJCQkJLy8KLQkJCQkJCUNvbW1hbmQgbW9zdFJlY2VudENvbW1hbmQgPSBMaWJyYXJ5VXRpbAotCQkJCQkJCQkudW53cmFwKCgoQ29tbWFuZFN0YWNrKSBldmVudC5nZXRTb3VyY2UoKSkKLQkJCQkJCQkJCQkuZ2V0TW9zdFJlY2VudENvbW1hbmQoKSk7Ci0KLQkJCQkJCWlmIChtb3N0UmVjZW50Q29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKG1vc3RSZWNlbnRDb21tYW5kIGluc3RhbmNlb2YgQWRkQ29tbWFuZCkgewotCQkJCQkJCQlBZGRDb21tYW5kIGNtZCA9IChBZGRDb21tYW5kKSBtb3N0UmVjZW50Q29tbWFuZDsKLQkJCQkJCQkJRU9iamVjdCBvd25lciA9IGNtZC5nZXRPd25lcigpOwotCQkJCQkJCQlpZiAob3duZXIgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJCQkJCQlDb2xsZWN0aW9uIG9ianMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCQlvYmpzLmFkZChvd25lcik7Ci0JCQkJCQkJCQlub3RpZnlMaXN0ZW5lcnMoCi0JCQkJCQkJCQkJCUlMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQsCi0JCQkJCQkJCQkJCW9ianMpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJQ29sbGVjdGlvbiBvYmpzID0gbW9zdFJlY2VudENvbW1hbmQuZ2V0UmVzdWx0KCk7Ci0JCQkJCQkJCQlub3RpZnlMaXN0ZW5lcnMoCi0JCQkJCQkJCQkJCUlMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX05FV0NISUxELAotCQkJCQkJCQkJCQlvYmpzKTsKLQkJCQkJCQkJCQotCQkJCQkJCQkJLy8gdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGlvbiBpZiB0aGUKLQkJCQkJCQkJCS8vIG9iamVjdCBpcyBhIG5ld2x5IGFkZGVkIG1ldGhvZCBwYWNrYWdlCi0JCQkJCQkJCQkvLwotCQkJCQkJCQkJaWYgKG93bmVyIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCQkJCQkJCW9ianMgPSBMaWJyYXJ5VXRpbC5nZXRDb250YWluZWRFbGVtZW50cyhvd25lciwgb2Jqcyk7Ci0JCQkJCQkJCQkJaWYoIW9ianMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCQkJCWFkZE5ld1BhY2thZ2VzVG9Db25maWd1cmF0aW9uKG9ianMpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCi0JCQkJCQkJfSAKLQkJCQkJCQllbHNlIGlmKG1vc3RSZWNlbnRDb21tYW5kIGluc3RhbmNlb2YgUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCkgewotCQkJCQkJCQlDb2xsZWN0aW9uIG9ianMgPSBtb3N0UmVjZW50Q29tbWFuZC5nZXRSZXN1bHQoKTsKLQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX05FV0NISUxELCBvYmpzKTsJCi0JCQkJCQkJCVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQgY21kID0gKChQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKW1vc3RSZWNlbnRDb21tYW5kKTsKLQkJCQkJCQkJCi0JCQkJCQkJCS8vIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3Rpb24gaWYgdGhlCi0JCQkJCQkJCS8vIG9iamVjdCBpcyBhIG5ld2x5IGFkZGVkIG1ldGhvZCBwYWNrYWdlCi0JCQkJCQkJCS8vCi0JCQkJCQkJCWlmIChjbWQuZ2V0T3duZXIoKSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJCQkJCW9ianMgPSBMaWJyYXJ5VXRpbC5nZXRDb250YWluZWRFbGVtZW50cyhjbWQuZ2V0T3duZXIoKSwgb2Jqcyk7Ci0JCQkJCQkJCQlpZighb2Jqcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJCQlhZGROZXdQYWNrYWdlc1RvQ29uZmlndXJhdGlvbihvYmpzKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmIChtb3N0UmVjZW50Q29tbWFuZCBpbnN0YW5jZW9mIENyZWF0ZUNoaWxkQ29tbWFuZCkgewotCQkJCQkJCQlub3RpZnlMaXN0ZW5lcnMoCi0JCQkJCQkJCQkJSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTkVXQ0hJTEQsCi0JCQkJCQkJCQkJbW9zdFJlY2VudENvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOwotCQkJCQkJCX0gZWxzZSBpZiAobW9zdFJlY2VudENvbW1hbmQgIT0gbnVsbCkgewotCQkJCQkJCQlub3RpZnlMaXN0ZW5lcnMoCi0JCQkJCQkJCQkJSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRCwKLQkJCQkJCQkJCQltb3N0UmVjZW50Q29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogYWRkIHRoZSBuZXcgcGFja2FnZXMgaW50byB0aGUgY29uZmlndXJhdGlvbnMgaWYgdGhlIHBhcmVudCBpcyBpbiB0aGUKLQkgKiBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIG5ld29ianMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTmV3UGFja2FnZXNUb0NvbmZpZ3VyYXRpb24oQ29sbGVjdGlvbiBuZXdvYmpzKSB7Ci0JCWlmIChuZXdvYmpzID09IG51bGwgfHwgbmV3b2Jqcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlciBoZWxwZXIgPSBuZXcgTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlcigpOwotCi0JCXRyeSB7Ci0JCQlFT2JqZWN0IGUsIHBhcmVudDsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBuZXdvYmpzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQllID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCQlpZiAoKGUgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKQotCQkJCQkJJiYgKChwYXJlbnQgPSBlLmVDb250YWluZXIoKSkgIT0gbnVsbCkKLQkJCQkJCSYmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSkgewotCQkJCQlPYmplY3QgY29uZmlncyA9ICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHBhcmVudCkKLQkJCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoQXNzb2NpYXRpb25IZWxwZXIuTWV0aG9kUGFja2FnZV9NZXRob2RDb25maWd1cmF0aW9ucyk7Ci0JCQkJCWlmIChjb25maWdzIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGNvbmZpZyA9ICgoTGlzdCkgY29uZmlncykuaXRlcmF0b3IoKTsgaXRjb25maWcKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdGNvbmZpZwotCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQlMaXN0IHBrZ3MgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQkJCQkJCWlmICghcGtncy5jb250YWlucyhlKSkgewotCQkJCQkJCQkvLyBwa2dzLmFkZChlKTsKLQkJCQkJCQkJaGVscGVyCi0JCQkJCQkJCQkJLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCQkJCWNvbmZpZywKLQkJCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSwKLQkJCQkJCQkJCQkJCWUsIC0xKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWhlbHBlci5zYXZlKCk7Ci0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWhlbHBlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyID0gbmV3IElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJaWYgKCFpbk9wZXJhdGlvbikgewotCQkJCWludCBldmVudFR5cGUgPSBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCk7Ci0JCQkJc3dpdGNoIChldmVudFR5cGUpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6IHsKLQkJCQkJLy8gb25seSBmb3IgYWRkIE1ldGhvZFBsdWdpbiwgb3IgbWF5YmUgc29tZSBvdGhlciBtaXNzaW5nCi0JCQkJCS8vIHN0dWZmIChpZiBhbnkpIHRoYXQgYXJlIG5vdCBjcmVhdGVkIGJ5IGEgY29tbWFuZC4KLQkJCQkJLy8gYW55dGhpbmcgY3JlYXRlZCBieSBhIGNvbW1hbmQgYXJlIGhhbmRsZWQgYnkgdGhlCi0JCQkJCS8vIGNvbW1hbmRTdGFja0xpc3RlbmVyCi0JCQkJCU9iamVjdCBub3RpZmllciA9IG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJCQlPYmplY3QgdiA9IG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJCQlpZiAoKG5vdGlmaWVyIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkKLQkJCQkJCQkmJiAodiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJCQkJCUNvbGxlY3Rpb24gYWZmZWN0ZWRPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJYWZmZWN0ZWRPYmplY3RzLmFkZCh2KTsKLQkJCQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ORVdDSElMRCwKLQkJCQkJCQkJYWZmZWN0ZWRPYmplY3RzKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQ6IHsKLQkJCQkJT2JqZWN0IG5vdGlmaWVyID0gbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQkJCWlmIChub3RpZmllciAhPSBudWxsKSB7Ci0JCQkJCQlDb2xsZWN0aW9uIGFmZmVjdGVkT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWFmZmVjdGVkT2JqZWN0cy5hZGQobm90aWZpZXIpOwotCQkJCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQsCi0JCQkJCQkJCWFmZmVjdGVkT2JqZWN0cyk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJLy8gbm90ZTogdGhpcyBpcyB0aGUgcmVtb3ZlIG9mIGVsZW1lbnRzIGZyb20gdGhlIHBhcmVudCwKLQkJCQkvLyBpdCBtaWdodCBiZSBhIGRlbGV0ZSBhY3Rpb24sIG9yIG1pZ2h0IGJlIGp1c3QgYSByZW1vdmUgb2YKLQkJCQkvLyByZWZlcmVuY2VzCi0JCQkJLy8gZm9yIGRlbGV0ZSBhY3Rpb24sIHRoZSBkZWxldGVkIGVsZW1lbnQgaGFzIG5vIGNvbnRhaW5lcgotCQkJCS8vIGZvciByZW1vdmVkIHJlZmVyZW5jZSwgdGhlIHJlbW92ZWQgZWxlbWVudCBzdGlsbCBoYXZlIGl0J3MKLQkJCQkvLyBwYXJlbnQKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6IHsKLQkJCQkJT2JqZWN0IG5vdGlmaWVyID0gbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQkJCU9iamVjdCBvbGRWYWx1ZSA9IG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpOwotCQkJCQlDb2xsZWN0aW9uIGFmZmVjdGVkT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaWYgKG9sZFZhbHVlIGluc3RhbmNlb2YgRU9iamVjdAotCQkJCQkJCSYmICgoRU9iamVjdCkgb2xkVmFsdWUpLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQkvLyB0aGUgZWxlbWVudCBpcyBkZWxldGVkLCBzZW50IGEgZGVsZXRlIGV2ZW50Ci0JCQkJCQlhZmZlY3RlZE9iamVjdHMuYWRkKG9sZFZhbHVlKTsKLQkJCQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ERUxFVEVELAotCQkJCQkJCQlhZmZlY3RlZE9iamVjdHMpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gb3RoZXJ3aXNlLCBpdCdzIGp1c3QgYSByZW1vdmUgb2YgcmVmZXJlbmNlcywgdGhlCi0JCQkJCQkvLyBub3RpZmllciBpcyB0aGUgY2hhbmdlZCBlbGVtZW50Ci0JCQkJCQlhZmZlY3RlZE9iamVjdHMuYWRkKG5vdGlmaWVyKTsKLQkJCQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VELAotCQkJCQkJCQlhZmZlY3RlZE9iamVjdHMpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWTogewotCQkJCQlMaXN0IG9sZFZhbHVlID0gbmV3IEFycmF5TGlzdCgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uCi0JCQkJCQkJLmdldE9sZFZhbHVlKCkpOwotCQkJCQlBcnJheUxpc3QgZGVsZXRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlBcnJheUxpc3QgcmVtb3ZlZFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWlmICghb2xkVmFsdWUuaXNFbXB0eSgpKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvbGRWYWx1ZS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCQkJaWYgKCgoRU9iamVjdCkgZWxlbWVudCkuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJCQkJCWRlbGV0ZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlyZW1vdmVkUmVmZXJlbmNlcy5hZGQoZWxlbWVudCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFkZWxldGVkRWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkvLyB0aGUgZWxlbWVudCBpcyBkZWxldGVkLCBzZW50IGEgZGVsZXRlIGV2ZW50Ci0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fREVMRVRFRCwKLQkJCQkJCQkJZGVsZXRlZEVsZW1lbnRzKTsKLQkJCQkJfQotCQkJCQlpZiAoIXJlbW92ZWRSZWZlcmVuY2VzLmlzRW1wdHkoKSkgewotCQkJCQkJLy8gb3RoZXJ3aXNlLCBpdCdzIGp1c3QgYSByZW1vdmUgb2YgcmVmZXJlbmNlcywgdGhlCi0JCQkJCQkvLyBub3RpZmllciBpcyB0aGUgY2hhbmdlZCBlbGVtZW50Ci0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRCwKLQkJCQkJCQkJcmVtb3ZlZFJlZmVyZW5jZXMpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBib29sZWFuIGxpc3RlbmVyQWRkZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgQWRhcHRlciBsaWJDaGFuZ2VkTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE1ldGhvZExpYnJhcnkuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TOgotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW47Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCXBsdWdpbiA9IChNZXRob2RQbHVnaW4pIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlwbHVnaW4uZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkuYWRkKHJlc291cmNlQ2hhbmdlZExpc3RlbmVyKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQkJCQlwbHVnaW4uZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkuYWRkKAotCQkJCQkJCQlyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQlwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJcGx1Z2luLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLnJlbW92ZSgKLQkJCQkJCQlyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCXBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJCQkJcGx1Z2luLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLnJlbW92ZSgKLQkJCQkJCQkJcmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIEFkYXB0ZXIgcmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIG1zZykgewotCQkJaWYgKG1zZy5nZXRGZWF0dXJlSUQobnVsbCkgPT0gUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX01PRElGSUVECi0JCQkJCSYmIG1zZy5nZXRFdmVudFR5cGUoKSA9PSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24uU0VUKSB7Ci0JCQkJLy8gZGlydHkgPSB0cnVlOwotCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShtc2cuZ2V0Tm90aWZpZXIoKSwgUFJPUF9ESVJUWSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgcHJvcENoYW5nZUxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQotCXByaXZhdGUgSVJlZnJlc2hMaXN0ZW5lciByZWZyZXNoTGlzdGVuZXIgPSBuZXcgSVJlZnJlc2hMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBub3RpZnlSZWZyZXNoZWQoSVJlZnJlc2hFdmVudCBldmVudCkgewotCQkJaGFuZGxlUmVmcmVzaEV2ZW50KGV2ZW50KTsKLQkJfQotCQkKLQl9OwotCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5UHJvY2Vzc29yIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChMaWJyYXJ5UHJvY2Vzc29yLmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgTGlicmFyeVByb2Nlc3NvcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWZyZXNoRXZlbnQoSVJlZnJlc2hFdmVudCBldmVudCkgewotCQlpZihMb2cuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTGlicmFyeVByb2Nlc3Nvci5oYW5kbGVSZWZyZXNoRXZlbnQoKSIpOyAvLyROT04tTkxTLU4kCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgcmVmcmVzaGVkIHJlc291cmNlczogIiArIGV2ZW50LmdldFJlZnJlc2hlZFJlc291cmNlcygpKTsKLQkJfQotCQlpZighZXZlbnQuZ2V0VW5sb2FkZWRPYmplY3RzKCkuaXNFbXB0eSgpKSB7Ci0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5jbGVhblVwKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpYnJhcnlQcm9jZXNzb3IoKSB7Ci0JCWluaXQoKTsKLQotCQkvLyB0aGlzIGlzIHRoZSBtYWluIGluc3RhbmNlLCB3aWxsIGJlIHRyZWF0ZWQgYXMgc2luZ2xldG9uCi0JCWlzU2luZ2xldG9uSW5zdGFuY2UgPSB0cnVlOwotCX0KLQotCXB1YmxpYyBMaWJyYXJ5UHJvY2Vzc29yKFJlc291cmNlIHJlcykgewotCQl0aGlzKCk7Ci0JCWlmIChyZXMgIT0gbnVsbCkgewotCQkJc2V0UmVzb3VyY2UocmVzKTsKLQkJfQotCi0JCWlzU2luZ2xldG9uSW5zdGFuY2UgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIGNvbnN0cnVjdCBzaG91bGQgYmUgY2FsbGVkIG9ubHkgaWYgeW91IHdhbnQgdG8gbWFpbnRhaW4geW91ciBvd24KLQkgKiBMaWJyYXJ5UHJvY2Vzc29yLCBzdWNoIGFzIHdoZW4gZm9yIGxpYnJhcnkgaW1wb3J0aW5nIG9yIGV4cG9ydGluZy4KLQkgKiBPdGhlcndpc2UsIGNhbGwgdGhlIHN0YXRpYyBnZXRJbnN0YW5jZSgpIG1ldGhvZCB0byByZXRyaWV2ZSB0aGUgc2luZ2xldG9uCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnlQYXRoCi0JICovCi0JcHVibGljIExpYnJhcnlQcm9jZXNzb3IoU3RyaW5nIGxpYnJhcnlQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcygpOwotCQlvcGVuTGlicmFyeShsaWJyYXJ5UGF0aCk7Ci0KLQkJaXNTaW5nbGV0b25JbnN0YW5jZSA9IGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUxpc3RlbmVyKElQcm9wZXJ0eUxpc3RlbmVyIGwpIHsKLQkJcHJvcENoYW5nZUxpc3RlbmVycy5hZGQobCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlMaXN0ZW5lcihJUHJvcGVydHlMaXN0ZW5lciBsKSB7Ci0JCXByb3BDaGFuZ2VMaXN0ZW5lcnMucmVtb3ZlKGwpOwotCX0KLQotCS8qKgotCSAqIEZpcmVzIGEgcHJvcGVydHkgY2hhbmdlZCBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlJZAotCSAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoZmluYWwgT2JqZWN0IHNvdXJjZSwgZmluYWwgaW50IHByb3BlcnR5SWQpIHsKLQkJT2JqZWN0W10gYXJyYXkgPSBwcm9wQ2hhbmdlTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCQlmb3IgKGludCBuWCA9IDA7IG5YIDwgYXJyYXkubGVuZ3RoOyBuWCsrKSB7Ci0JCQlmaW5hbCBJUHJvcGVydHlMaXN0ZW5lciBsID0gKElQcm9wZXJ0eUxpc3RlbmVyKSBhcnJheVtuWF07Ci0KLQkJCS8vIHNpbmNlIHRoaXMgd2lsbCBjYXVzZSBVSSB1cGRhdGUsIHdoaWNoIG11c3QgYmUgZXhlY3V0ZWQgaW4gdGhlIFVJCi0JCQkvLyB0aHJlYWQKLQkJCS8vIG90aGVyd2lzZSwgd2lsbCBjYXVzZSBJbnZhbGlkIFRocmVhZCBBY2Nlc3MgZXhjZXB0aW9uCi0JCQlTYWZlVXBkYXRlQ29udHJvbGxlci5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJbC5wcm9wZXJ0eUNoYW5nZWQoc291cmNlLCBwcm9wZXJ0eUlkKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaWJyYXJ5TGlzdGVuZXJzKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBnZXRMaWJyYXJ5KCk7Ci0KLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCB8fCBsaWJyYXJ5LmVSZXNvdXJjZSgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vIGlmKCFsaWJyYXJ5LmVBZGFwdGVycygpLmNvbnRhaW5zKGxpYkNoYW5nZWRMaXN0ZW5lcikpIHsKLQkJLy8gbGlicmFyeS5lQWRhcHRlcnMoKS5hZGQobGliQ2hhbmdlZExpc3RlbmVyKTsKLQkJLy8gfQotCQlpZiAoIWxpYnJhcnkuZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkuY29udGFpbnMocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpKSB7Ci0JCQlsaWJyYXJ5LmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmFkZChyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlpZiAoIXBsdWdpbi5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5jb250YWlucygKLQkJCQkJcmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpKSB7Ci0JCQkJcGx1Z2luLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmFkZChyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTGlicmFyeUxpc3RlbmVycygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gZ2V0TGlicmFyeSgpOwotCi0JCWlmIChsaWJyYXJ5ID09IG51bGwgfHwgbGlicmFyeS5lUmVzb3VyY2UoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvLyBsaWJyYXJ5LmVBZGFwdGVycygpLnJlbW92ZShsaWJDaGFuZ2VkTGlzdGVuZXIpOwotCQlsaWJyYXJ5LmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLnJlbW92ZShyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJcGx1Z2luLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLnJlbW92ZShyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7Ci0JCQlpZiAoIWxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkICh0bXBfbGlzdGVuZXJzX3RvYmVfZGVsZXRlZCkgewotCQkJLy8gZGVsYXkgdGhlIHJlbW92ZSB0aWxsIGEgbm90aWZpY2F0aW9uIGlzIHJlcXVlc3RlZAotCQkJaWYgKCF0bXBfbGlzdGVuZXJzX3RvYmVfZGVsZXRlZC5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCQl0bXBfbGlzdGVuZXJzX3RvYmVfZGVsZXRlZC5hZGQobGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoZmluYWwgaW50IG9wdGlvbiwKLQkJCWZpbmFsIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlsb2FkZWQgPSB0cnVlOwotCi0JCXRyeSB7Ci0JCQkvLyByZW1vdmUgdGhlIGxpc3RlbmVycyB0byBiZSBkZWxldGVkCi0JCQlpZiAodG1wX2xpc3RlbmVyc190b2JlX2RlbGV0ZWQuc2l6ZSgpID4gMCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSB0bXBfbGlzdGVuZXJzX3RvYmVfZGVsZXRlZC5pdGVyYXRvcigpOyBpdAotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGwgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChsaXN0ZW5lcnMuY29udGFpbnMobCkpIHsKLQkJCQkJCWxpc3RlbmVycy5yZW1vdmUobCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdG1wX2xpc3RlbmVyc190b2JlX2RlbGV0ZWQuY2xlYXIoKTsKLQkJCX0KLQotCQkJLy8gbm90aWZ5IGxpc3RlbmVycywKLQkJCS8vIG5vdGUsIHRoZSBzaXplIG1heSBjaGFuZ2Ugc2luY2Ugbm90aWZ5IGEgbGlzdGVuZXIgbWF5IGNhdXNlZCBuZXcKLQkJCS8vIGxpc3RlbmVycyBiZWluZyBhZGRlZAotCQkJLy8gdGhvc2UgbmV3IGxpc3RlbmVycyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgc28gd2UKLQkJCS8vIGFyZSBvawotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCBsaXN0ZW5lcnMuc2l6ZSgpKSB7Ci0JCQkJZmluYWwgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IChJTGlicmFyeUNoYW5nZUxpc3RlbmVyKSBsaXN0ZW5lcnMKLQkJCQkJCS5nZXQoaSk7Ci0JCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJLy8gc2luY2UgdGhpcyB3aWxsIGNhdXNlIFVJIHVwZGF0ZSwgd2hpY2ggbXVzdCBiZSBleGVjdXRlZAotCQkJCQkvLyBpbiB0aGUgVUkgdGhyZWFkCi0JCQkJCS8vIG90aGVyd2lzZSwgd2lsbCBjYXVzZSBJbnZhbGlkIFRocmVhZCBBY2Nlc3MgZXhjZXB0aW9uCi0KLQkJCQkJLy8gZXhlY3V0ZSBpdCBpbiBzeW5jIG1vZGUsIG90aGVyd2lzZSBtYXkgY2F1c2UgcHJvYmxlbQotCQkJCQkvLyBzaW5jZSB0aGUgbm90aWZpY2F0aW9uIG1pZ2h0IGJlIGV4ZWN1dGVkIHRvbyBsYXRlLgotCQkJCQkvLyBmb3IgZXhhbXBsZSwgYWZ0ZXIgdGhlIGxpc3RlbmVyIG9iamVjdCBpcyBkaXNwb3NlZAotCQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJbGlzdGVuZXIubGlicmFyeUNoYW5nZWQob3B0aW9uLCBjb2xsZWN0aW9uKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCi0JCQkJaSsrOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJlZ2luT3BlcmF0aW9uKCkgewotCQlpbk9wZXJhdGlvbiA9IHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuZE9wZXJhdGlvbigpIHsKLQkJaW5PcGVyYXRpb24gPSBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgdmFsaWQgaW4gdGhlIGN1cnJlbnQgcmVzb3VyY2Ugc2V0Ci0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKG9iamVjdCAhPSBudWxsICYmIG9iamVjdC5lSXNQcm94eSgpKSB7Ci0JCQlFT2JqZWN0IGUgPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzb2x2ZShvYmplY3QpOwotCQkJcmV0dXJuIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkmJiAhZS5lSXNQcm94eSgpCi0JCQkJCSYmIFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeShlKSA9PSBnZXRMaWJyYXJ5KCkpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCi0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgbGlicmFyeSdzIHByb2plY3QgaXMgc3RpbGwgb3Blbi4gSWYgbm90LCBvcGVuIGl0Ci0JICovCi0JLyoKLQlwdWJsaWMgYm9vbGVhbiBlbnN1cmVMaWJyYXJ5UHJvamVjdE9wZW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gZ2V0TGlicmFyeSgpOwotCQlpZihsaWIgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJqID0gUmVzb3VyY2VVdGlsLmZpbmRQcm9qZWN0KGxpYik7Ci0JCQlpZihwcmogIT0gbnVsbCAmJiAhcHJqLmlzT3BlbigpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJqLm9wZW4oSVJlc291cmNlLkJBQ0tHUk9VTkRfUkVGUkVTSCwgbW9uaXRvcik7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkqLwotCQotCXB1YmxpYyB2b2lkIG9wZW5MaWJyYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBvcGVuTGlicmFyeSA9IGdldExpYnJhcnlSb290UGF0aCgpLmdldEFic29sdXRlUGF0aCgpCi0JCQkJKyBGaWxlLnNlcGFyYXRvciArICJsaWJyYXJ5LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG9wZW5MaWJyYXJ5ICE9IG51bGwgJiYgIW9wZW5MaWJyYXJ5LmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJb3BlbkxpYnJhcnkob3BlbkxpYnJhcnkpOwotCQl9Ci0JfQotCi0JcHVibGljIElTdGF0dXMgb3BlbkxpYnJhcnkoU3RyaW5nIGxpYnJhcnlQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWJlZ2luT3BlcmF0aW9uKCk7Ci0JCQkKLQkJCS8vIG9wZW4gdGhlIG1ldGhvZCBsaWJyYXJ5IGFzIGEgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlIHNvIGl0IHdpbGwKLQkJCS8vIHNob3cgdXAgaW4gdGhlIFJlc291cmNlIHZpZXcuCi0JCQkvLwotCQkJRmlsZSBsaWJEaXIgPSBuZXcgRmlsZShsaWJyYXJ5UGF0aCkuZ2V0UGFyZW50RmlsZSgpOwotCQkJCi0JCQkvLyBvbmx5IGNsb3NlIHByZXZpb3VzIGxpYnJhcnkgaWYgdGhlIG5ldyBsaWJyYXJ5J3MgcHJvamVjdCB3YXMKLQkJCS8vIG9wZW5lZCBzdWNjZXNzZnVsbHkKLQkJCS8vIGNsb3NlIHByZXZpb3VzIGxpYnJhcnkncyBwcm9qZWN0IG9ubHkgaWYgaXQgaXMgZGlmZmVyZW50IHRoYW4gdGhlCi0JCQkvLyBuZXcgb25lCi0JCQljbG9zZU9wZW5lZExpYnJhcnkoKTsKLQotCQkJLy8gbG9jayB0aGUgbGlicmFyeQotCQkJLy8KLQkJCWxvY2tMaWJyYXJ5KGxpYkRpcik7Ci0KLQkJCVJlc291cmNlVXRpbC5vcGVuKGxpYkRpci5nZXRBYnNvbHV0ZVBhdGgoKSwgbnVsbCk7Ci0KLQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9ICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBlZGl0aW5nRG9tYWluCi0JCQkJCS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCWFzc2lnbkxpYnJhcnkocmVzb3VyY2VTZXQubG9hZExpYnJhcnkobGlicmFyeVBhdGgpKTsKLQotCQkJSVN0YXR1cyBzdGF0dXM7Ci0JCQlpZiAoIXJlc291cmNlU2V0Lmhhc1VucmVzb2x2ZWRQcm94eSgpKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IExpYnJhcnlSZXNvdXJjZXMKLQkJCQkJCS5nZXRTdHJpbmcoIkxpYnJhcnkudW5yZXNvbHZlZFByb3h5RXJyb3IucmVhc29uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRJZCgpLCAwLCBtc2csIG51bGwpOwotCQkJfSBlbHNlIHsKLQkJCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCi0JCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTE9BREVELCBudWxsKTsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0gZmluYWxseSB7Ci0JCQllbmRPcGVyYXRpb24oKTsKLQotCQkJLy8gZGlydHkgPSBmYWxzZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShnZXRMaWJyYXJ5KCksIFBST1BfRElSVFkpOwotCi0JCQkvLyBzZXRDdXJyZW50Q29uZmlndXJhdGlvbihudWxsKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQXNzaWducyBsaWJyYXJ5IHRvIGEgbmV3IHZhbHVlIGFuZCBhdHRhY2ggdGhlIGNoYW5nZSBsaXN0ZW5lcnMgdG8gaXQuCi0JICogCi0JICogQHBhcmFtIGxpYgotCSAqLwotCXByaXZhdGUgdm9pZCBhc3NpZ25MaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCXJlbW92ZUxpYnJhcnlMaXN0ZW5lcnMoKTsKLQkJYWRkTGlicmFyeUxpc3RlbmVycygpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5ld0xpYnJhcnkoU3RyaW5nIGxpYnJhcnlOYW1lLCBTdHJpbmcgbGlicmFyeVBhdGgpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2xvc2VPcGVuZWRMaWJyYXJ5KCk7Ci0KLQkJCS8vIGlzTXVsdGlwbGVGaWxlcyA9IGJNdWx0aXBsZTsKLQkJCWJlZ2luT3BlcmF0aW9uKCk7Ci0KLQkJCUZpbGUgbGliX3BhdGggPSBuZXcgRmlsZShsaWJyYXJ5UGF0aCk7Ci0JCQlsaWJyYXJ5UGF0aCA9IGxpYl9wYXRoLmdldEFic29sdXRlUGF0aCgpOwotCi0JCQkvLyBvcGVuIHRoZSBtZXRob2QgbGlicmFyeSBhcyBhIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZSBzbyBpdCB3aWxsCi0JCQkvLyBzaG93IHVwIGluIHRoZSBSZXNvdXJjZSB2aWV3LgotCQkJUmVzb3VyY2VVdGlsLm9wZW4obGlicmFyeVBhdGgsIG51bGwpOwotCi0JCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBlZGl0aW5nRG9tYWluCi0JCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCQkJTW9kZWxTdG9yYWdlLm5ld0xpYnJhcnkocmVzb3VyY2VTZXQsIGxpYnJhcnlOYW1lLCBsaWJyYXJ5UGF0aCwgdHJ1ZSk7Ci0JCQlhc3NpZ25MaWJyYXJ5KHJlc291cmNlU2V0LmdldE1ldGhvZExpYnJhcnkoKSk7Ci0KLQkJCS8vIGxvY2sgdGhlIGxpYnJhcnkKLQkJCWxvY2tMaWJyYXJ5KGxpYl9wYXRoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWVuZE9wZXJhdGlvbigpOwotCQkJLy8gc2V0RGlydHkodHJ1ZSk7Ci0JCQkvLyBzZXRDdXJyZW50Q29uZmlndXJhdGlvbihudWxsKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DUkVBVEVELCBudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBnaXZlbiByZXNvdXJjZSBpZiBpdCBiZWxvbmcgdG8gdGhlIGN1cnJlbnRseSBvcGVuIGxpYnJhcnkKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb24gewotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZWRpdGluZ0RvbWFpbgotCQkJCS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJaWYgKHJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmNvbnRhaW5zKHJlc291cmNlKSkgewotCQkJcmVzb3VyY2VTZXQuc2F2ZShyZXNvdXJjZSwgc2F2ZU9wdGlvbnMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZUxpYnJhcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gZ2V0TGlicmFyeSgpOwotCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQlkb1NhdmUoc2F2ZU9wdGlvbnMpOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlKGxpYnJhcnksIFBST1BfRElSVFkpOwotCi0JCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fU0FWRUQsIG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIG9wZW4gbGlicmFyeSB1bmRlciBhIG5ldyBsb2NhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBuZXdEaXIKLQkgKiAgICAgICAgICAgIGRpcmVjdG9yeSB0byBzYXZlIHRoZSBvcGVuIGxpYnJhcnkgdG8KLQkgKiBAcGFyYW0gcmVnZW5lcmF0ZUdVSUQKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIHJlZ2VuZXJhdGUgR1VJRCBmb3IgYWxsIE1ldGhvZEVsZW1lbnRzIGluIHRoZSBvcGVuCi0JICogICAgICAgICAgICBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZUxpYnJhcnlBcyhTdHJpbmcgbmV3RGlyLCBib29sZWFuIHJlZ2VuZXJhdGVHVUlELAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG9sZExpYkRpciA9IGdldExpYnJhcnlSb290UGF0aCgpCi0JCQkJLmdldEFic29sdXRlUGF0aCgpOwotCi0JCS8vIGNyZWF0ZSBuZXcgSVByb2plY3QKLQkJUmVzb3VyY2VVdGlsLm9wZW4obmV3RGlyLCBtb25pdG9yKTsKLQotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBnZXRMaWJyYXJ5KCkKLQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJcmVzb3VyY2VTZXQuc2F2ZUFzKG5ld0RpciwgcmVnZW5lcmF0ZUdVSUQsIG1vbml0b3IpOwotCi0JCS8vIGhhbmRsZSBhdHRhY2htZW50cyBoZXJlCi0JCUNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24uY29weUF0dGFjaG1lbnRzTGlicmFyeShvbGRMaWJEaXIsIG5ld0RpciwKLQkJCQludWxsLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeVBhdGgKLQkgKiBAcGFyYW0gYk11bHRpcGxlCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVMaWJyYXJ5QXMoU3RyaW5nIGxpYnJhcnlQYXRoLCBib29sZWFuIGJNdWx0aXBsZSkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkvLyBSZXNvdXJjZSByZXMgPQotCQkvLyAoKFJlc291cmNlKWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpOwotCQkvLyByZXMuc2V0VVJJKFVSSS5jcmVhdGVGaWxlVVJJKGxpYnJhcnlQYXRoKSk7Ci0JCS8vIHJlcy5zZXRNb2RpZmllZCh0cnVlKTsKLQkJLy8KLQkJLy8gc2V0U2F2ZUFzTXVsdGlwbGVGb2xkZXIoYk11bHRpcGxlKTsKLQkJLy8gICAgICAgIAkKLQkJLy8gZG9TYXZlKHNhdmVBc09wdGlvbnMpOwotCQkvLyBzZXREaXJ0eShmYWxzZSk7Ci0JCS8vIGlzTXVsdGlwbGVGaWxlcyA9IGJNdWx0aXBsZTsKLQkJLy8gICAgICAgIAotCQkvLyBub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fU0FWRUQsIG51bGwpOwotCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRSZXNvdXJjZShSZXNvdXJjZSByZXMpIHsKLQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBlZGl0aW5nRG9tYWluCi0JCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCQkJcmVzb3VyY2VTZXQucmVzZXQoKTsKLQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmFkZChyZXMpOwotCQkJYXNzaWduTGlicmFyeShyZXNvdXJjZVNldC5nZXRNZXRob2RMaWJyYXJ5KCkpOwotCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQsIG51bGwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSZXNvdXJjZSBnZXRMaWJyYXJ5UmVzb3VyY2UoKSB7Ci0JCUxpc3QgcmVzID0gZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0JCWlmIChyZXMuc2l6ZSgpID4gMCkgewotCQkJcmV0dXJuIChSZXNvdXJjZSkgcmVzLmdldCgwKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldExpYnJhcnkoKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZ2V0TGlicmFyeVJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldENvbnRlbnRzKCkuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCQlyZXR1cm4gKE1ldGhvZExpYnJhcnkpIG87Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFVSSSBnZXRMaWJyYXJ5VVJJKCkgewotCQlSZXNvdXJjZSBzYXZlZFJlc291cmNlID0gZ2V0TGlicmFyeVJlc291cmNlKCk7Ci0JCWlmIChzYXZlZFJlc291cmNlICE9IG51bGwpIHsKLQkJCXJldHVybiBzYXZlZFJlc291cmNlLmdldFVSSSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFVSSSBnZXRSZWxhdGl2ZVVSSShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJVVJJIGxpYlVSSSA9IGdldExpYnJhcnlVUkkoKTsKLQkJVVJJIGVsZW1ldG5VUkkgPSBlbGVtZW50LmVSZXNvdXJjZSgpLmdldFVSSSgpOwotCQlVUkkgcmVsVXJpID0gZWxlbWV0blVSSS5kZXJlc29sdmUobGliVVJJKTsKLQotCQlyZXR1cm4gcmVsVXJpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgRWxlbWVudExheW91dE1hbmFnZXIgZ2V0TGF5b3V0TWFuYWdlcigpIHsKLQkJLy8gbm8gRWxlbWVudExheW91dE1hbmFnZXIgaWQgbGlicmFyeSBpcyBub3QgbG9hZGVkCi0JCWlmIChsYXlvdXRNZ3IgPT0gbnVsbCkgewotCQkJaWYgKGdldExpYnJhcnkoKSAhPSBudWxsKSB7Ci0JCQkJbGF5b3V0TWdyID0gbmV3IEVsZW1lbnRMYXlvdXRNYW5hZ2VyKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGF5b3V0TWdyOwotCX0KLQotCS8qCi0JcHVibGljIFZlcnNpb25NYW5hZ2VyIGdldFZlcnNpb25NYW5hZ2VyKCkgewotCQlpZiAodmVyc2lvbk1nciA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAodmVyc2lvbk1nciA9PSBudWxsKSB7Ci0JCQkJCXZlcnNpb25NZ3IgPSBuZXcgVmVyc2lvbk1hbmFnZXIodGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHZlcnNpb25NZ3I7Ci0JfQotCSovCi0KLQlwdWJsaWMgdm9pZCBzZXRMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbmV3TGliKSB7Ci0JCWFzc2lnbkxpYnJhcnkobmV3TGliKTsKLQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKQotCQkJCS5nZXRSZXNvdXJjZXMoKS5nZXQoMCk7Ci0JCXJlcy5nZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCXJlcy5nZXRDb250ZW50cygpLmFkZChuZXdMaWIpOwotCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTE9BREVELCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoCi0JCQkJCQkJCVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9CQUNLX1VQX0JFRk9SRV9TQVZFKSkgewotCQkJCQkJCXNhdmVPcHRpb25zLnB1dCgKLQkJCQkJCQkJCU11bHRpRmlsZVhNSVNhdmVJbXBsLkJBQ0tfVVBfQkVGT1JFX1NBVkUsCi0JCQkJCQkJCQlldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoZXZlbnQKLQkJCQkJCQkJLmdldFByb3BlcnR5KCkKLQkJCQkJCQkJLmVxdWFscygKLQkJCQkJCQkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMpKSB7Ci0JCQkJCQkJc2F2ZU9wdGlvbnMKLQkJCQkJCQkJCS5wdXQoCi0JCQkJCQkJCQkJCU11bHRpRmlsZVhNSVNhdmVJbXBsLkRJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTLAotCQkJCQkJCQkJCQlldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfSk7Ci0KLQkJLy8gY3JlYXRlIHRoZSBkZWZhdWx0IGVkaXRpbmcgZG9tYWluIGZvciBsaWJyYXJ5IG9wZXJhdGlvbgotCQlMaXN0IGZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQlmYWN0b3JpZXMpOwotCi0JCS8vIENyZWF0ZSB0aGUgY29tbWFuZCBzdGFjayB0aGF0IHdpbGwgbm90aWZ5IHRoaXMgZWRpdG9yIGFzIGNvbW1hbmRzIGFyZQotCQkvLyBleGVjdXRlZC4KLQkJQmFzaWNDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrID0gbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBlZGl0aW5nIGRvbWFpbiB3aXRoIGEgc3BlY2lhbCBjb21tYW5kIHN0YWNrLgotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSBuZXcgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCQotCQlyZXNvdXJjZVNldC5hZGRSZWZyZXNoTGlzdGVuZXIocmVmcmVzaExpc3RlbmVyKTsKLQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldFJlc291cmNlU2V0KHJlc291cmNlU2V0KTsKLQotCQlzYXZlT3B0aW9ucyA9IHJlc291cmNlU2V0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQlib29sZWFuIGIgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKAotCQkJCVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9CQUNLX1VQX0JFRk9SRV9TQVZFKTsKLQkJc2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLkJBQ0tfVVBfQkVGT1JFX1NBVkUsIEJvb2xlYW4KLQkJCQkudmFsdWVPZihiKSk7Ci0JCWIgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKAotCQkJCVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUyk7Ci0JCXNhdmVPcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5ESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUywKLQkJCQlCb29sZWFuLnZhbHVlT2YoYikpOwotCi0JCWVkaXRpbmdEb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKGFkYXB0ZXJGYWN0b3J5LAotCQkJCWNvbW1hbmRTdGFjaywgcmVzb3VyY2VTZXQpOwotCi0JCS8vIENyZWF0ZSBuZXcgSUNvbnRlbnREZXNjcmlwdGlvblBlcnNpc3RlciBhbmQgc2V0IGl0IHRvIHRoZQotCQkvLyBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5IGZvciB1c2UuCi0JCS8vCi0JCUlNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGNvbnRlbnREZXNjUGVyc2lzdGVyID0gbmV3IE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIoKTsKLQkJQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotCQkJCS5zZXRNZXRob2RMaWJyYXJ5UGVyc2lzdGVyKGNvbnRlbnREZXNjUGVyc2lzdGVyKTsKLQotCQlDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5LnNldEZpbGVNYW5hZ2VyKEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkpOwotCi0JCXJlZ2lzdGVyRWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1NhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoTG9nLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNhdmUgb3B0aW9uczogIiArIG9wdGlvbnMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBMaXN0IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gRmlsZSBsaWJEaXIgPSBuZXcKLQkJLy8gRmlsZSgoKFJlc291cmNlKWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnRGaWxlKCk7Ci0KLQkJdHJ5IHsKLQkJCWJlZ2luT3BlcmF0aW9uKCk7Ci0JCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZWRpdGluZ0RvbWFpbgotCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQkvLyBTYXZlIHRoZSByZXNvdXJjZShzKQotCQkJLy8KLQkJCXJlc291cmNlU2V0LnNhdmUob3B0aW9ucyk7Ci0KLQkJCSgoQmFzaWNDb21tYW5kU3RhY2spIGVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpLnNhdmVJc0RvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXhjZXB0aW9uOwotCQl9IGZpbmFsbHkgewotCQkJZW5kT3BlcmF0aW9uKCk7Ci0KLQkJfQotCX0KLQotCS8qCi0JcHVibGljIHZvaWQgZGlzY2FyZENoYW5nZXMoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKQotCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCXJlc291cmNlLnNldE1vZGlmaWVkKGZhbHNlKTsKLQkJfQotCX0KLQkqLwotCi0JcHVibGljIGJvb2xlYW4gaXNMaWJyYXJ5TG9hZGVkKCkgewotCQlyZXR1cm4gbG9hZGVkOwotCX0KLQotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gKENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGdldEVkaXRpbmdEb21haW4oKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRNZXRob2RNb2RlbHMoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IGdldExpYnJhcnkoKTsKLQkJcmV0dXJuIChsaWJyYXJ5ID09IG51bGwpID8gbmV3IEFycmF5TGlzdCgpIDogbGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JfQotCi0JcHVibGljIE1ldGhvZFBsdWdpbiBnZXRNZXRob2RQbHVnaW4oU3RyaW5nIGd1aWQpIHsKLQkJaWYgKGd1aWQgIT0gbnVsbCkgewkKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBnZXRNZXRob2RNb2RlbHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHAgPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGd1aWQuZXF1YWxzKHAuZ2V0R3VpZCgpKSkgewotCQkJCQlyZXR1cm4gcDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgcHJvY2VzcyBmYW1pbHkgYnkgbmFtZQotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBQcm9jZXNzRmFtaWx5Ci0JICovCi0JcHVibGljIFByb2Nlc3NGYW1pbHkgZ2V0UHJvY2Vzc0ZhbWlseShTdHJpbmcgbmFtZSkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gZ2V0TGlicmFyeSgpOwotCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQlMaXN0IGNvbmZpZ3MgPSBsaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNvbmZpZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKChjb25maWcgaW5zdGFuY2VvZiBQcm9jZXNzRmFtaWx5KQotCQkJCQkJJiYgY29uZmlnLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJcmV0dXJuIChQcm9jZXNzRmFtaWx5KSBjb25maWc7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogcmVnaXN0ZXIgZWR0aW5nIGRvbWFpbiB3aXRoIHRoaXMgbGlicmFyeQotCSAqIAotCSAqIEBwYXJhbSBkb21haW4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlckVkaXRpbmdEb21haW4oQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGRvbWFpbikgewotCQkvKioKLQkJICogdGhpcyBub3RpZnlzIGFsbCBjaGFuZ2VzLCBub3QganVzdCB0aGUgY29udGVudCBjaGFuZ2UsIG9ubHkgcGljayB0aGUKLQkJICogb25lcyBmb3IgZWxlbWVudCB1cGRhdGVzLiBUaGUgb3RoZXIgb3BlcmF0aW9ucyBhcmUgY29sdmVyZWQgYnkgdGhlCi0JCSAqIENvbW1hbmQgZXZlbnRzCi0JCSAqLwotCQkoKENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGRvbWFpbi5nZXRBZGFwdGVyRmFjdG9yeSgpKQotCQkJCS5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCi0JCS8vIEFkZCBhIGxpc3RlbmVyIHRvIHNldCB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCdzIGFmZmVjdGVkIG9iamVjdHMgdG8KLQkJLy8gYmUgdGhlIHNlbGVjdGlvbiBvZiB0aGUgdmlld2VyIHdpdGggZm9jdXMuCi0JCWRvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcihjb21tYW5kU3RhY2tMaXN0ZW5lcik7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0ZW5UbyhDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWFkYXB0ZXJGYWN0b3J5LmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcExpc3RlbmluZ1RvKENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJYWRhcHRlckZhY3RvcnkucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0ZW5UbyhDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKSB7Ci0JCWNvbW1hbmRTdGFjay5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcihjb21tYW5kU3RhY2tMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcExpc3RlbmluZ1RvKENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2spIHsKLQkJY29tbWFuZFN0YWNrLnJlbW92ZUNvbW1hbmRTdGFja0xpc3RlbmVyKGNvbW1hbmRTdGFja0xpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhdmVPcHRpb25zLgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0U2F2ZU9wdGlvbnMoKSB7Ci0JCXJldHVybiBzYXZlT3B0aW9uczsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRMaWJyYXJ5Um9vdFBhdGgoKSB7Ci0JCVVSSSB1cmkgPSB0aGlzLmdldExpYnJhcnlVUkkoKTsKLQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IHVyaS50b0ZpbGVTdHJpbmcoKTsKLQkJCUZpbGUgZiA9IG5ldyBGaWxlKHBhdGgpOwotCQkJcmV0dXJuIGYuZ2V0UGFyZW50RmlsZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTWV0aG9kUGx1Z2luKGZpbmFsIE1ldGhvZFBsdWdpbiBtb2RlbCkgewotCi0JCS8vIHNpbmNlIHRoaXMgd2lsbCBjYXVzZSBVSSB1cGRhdGUsIHdoaWNoIG11c3QgYmUgZXhlY3V0ZWQgaW4gdGhlIFVJCi0JCS8vIHRocmVhZAotCQkvLyBvdGhlcndpc2UsIHdpbGwgY2F1c2UgSW52YWxpZCBUaHJlYWQgQWNjZXNzIGV4Y2VwdGlvbgotCQlmaW5hbCBFeGNlcHRpb25bXSBleGNlcHRpb25zID0gbmV3IEV4Y2VwdGlvblsxXTsKLQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZ2V0TGlicmFyeSgpLmdldE1ldGhvZFBsdWdpbnMoKS5hZGQobW9kZWwpOwotCi0JCQkJSU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkJCS5nZXRNZXRob2RMaWJyYXJ5UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIuc2F2ZShnZXRMaWJyYXJ5KCkuZVJlc291cmNlKCkpOwotCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCWV4Y2VwdGlvbnNbMF0gPSBlOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJbW9kZWwuZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkuYWRkKHJlc291cmNlQ2hhbmdlZExpc3RlbmVyKTsKLQkJCX0KLQkJfSk7Ci0KLQkJaWYgKGV4Y2VwdGlvbnNbMF0gIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZXhjZXB0aW9uc1swXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFbmFibGVzL2Rpc2FibGVzIG5vdGlmaWNhdGlvbiBlbnRpcmVseS4KLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGlmaWNhdGlvbkVuYWJsZWQoYm9vbGVhbiBiKSB7Ci0JCWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5lU2V0RGVsaXZlcihiKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKSB7Ci0JCXJldHVybiBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZURlbGl2ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gdGhlIGN1cnJlbnQgbGlicmFyeSBpcyB0byBiZSBjbG9zZWQuIGZvciBleGFtcGxlLAotCSAqIHdoZW4geW91IHRyeSB0byBvcGVuIGEgbm90aGVyIGxpYnJhcnkgZm9yIGNyZWF0ZSBhIG5ldyBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgY2xvc2VPcGVuZWRMaWJyYXJ5KCkgewotCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTElCUkFSWV9DTE9TRUQsIG51bGwpOwotCi0JCWlmIChMb2cuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIlVzZWQgbWVtb3J5IGJlZm9yZSBjbG9zaW5nIGxpYnJhcnk6ICIgKyAoUnVudGltZS5nZXRSdW50aW1lKCkudG90YWxNZW1vcnkoKSAtIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gUkFUTEMwMDM4NDU5OCAtIEV4cG9ydDogSW5maW5pdGUgbG9vcCBOdWxscG9pbnRlckV4Y2VwdGlvbiBhZnRlcgotCQkvLyBleHBvcnRpbmcgYW5kIHVuY2hlY2tpbmcgcnVwIHBsdWdpbiBpbiBjb25maWd1cmF0aW9uCi0JCS8vIHNvIGRvbid0IGRpc3Bvc2UgaXQgaWYgbm90IHRoZSBtYWluIHNpbmdsZXRvbiBpbnN0YW5jZQotCQlpZiAoaXNTaW5nbGV0b25JbnN0YW5jZSkgewotCQkJLy8gZGlzcG9zZSBhbGwgaXRlbSBwcm92aWRlcnMKLQkJCS8vCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5yZXNldCgpOwotCi0JCQkvLyBjbGVhciBmaWx0ZXIgY29uc3RhbnRzIGhhc2hNYXAKLQkJCWlmIChGaWx0ZXJDb25zdGFudHMuaGFzaE1hcCAhPSBudWxsKSB7Ci0JCQkJRmlsdGVyQ29uc3RhbnRzLmhhc2hNYXAuY2xlYXIoKTsKLQkJCX0KLQkJfQotCi0JCWlmICh0aGlzLmxheW91dE1nciAhPSBudWxsKSB7Ci0JCQl0aGlzLmxheW91dE1nci5jbGVhcigpOwotCQl9Ci0KLQotCQkvLyBjbGVhciB0aGUgdGVtcCBsYXlvdXQgCi0JCUxheW91dFJlc291cmNlcy5jbGVhcigpOwotCi0JCS8qCi0JCSAqIGlmICggdGhpcy5kZXBNZ3IgIT0gbnVsbCApIHsgdGhpcy5kZXBNZ3IuY2xlYXIoKTsgfSB0aGlzLmRlcE1nciA9Ci0JCSAqIG51bGw7Ci0JCSAqLwotCi0JCXRoaXMubGF5b3V0TWdyID0gbnVsbDsKLQotCQkvLyB0aGlzLmludmFsaWRHdWlkcy5jbGVhcigpOwotCi0JCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGVkaXRpbmdEb21haW4KLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQotCQlyZXNvdXJjZVNldC5jbGVhckVycm9ycygpOwotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBnZXRMaWJyYXJ5KCk7Ci0KLQkJdW5sb2NrTGlicmFyeSgpOwotCi0JCXJlc291cmNlU2V0LnJlc2V0KCk7Ci0JCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNldCgpOwotCi0JCVJ1bnRpbWUuZ2V0UnVudGltZSgpLmdjKCk7Ci0JCWlmIChMb2cuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIlVzZWQgbWVtb3J5IGFmdGVyIGNsb3NpbmcgbGlicmFyeTogIiArIChSdW50aW1lLmdldFJ1bnRpbWUoKS50b3RhbE1lbW9yeSgpIC0gUnVudGltZS5nZXRSdW50aW1lKCkuZnJlZU1lbW9yeSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHVubG9ja0xpYnJhcnkoKSB7Ci0JCS8vIHJlbGVhc2UgbG9jayBvbiBvbGQgbGliJ3MgcHJvamVjdAotCQl0cnkgewotCQkJaWYgKGxvY2sgIT0gbnVsbCkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJCWxvY2suY2hhbm5lbCgpLmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExvY2tzIHRoZSAubG9jayBmaWxlIGluIHRoZSBnaXZlbiBwYXRoLiBDcmVhdGVzIGEgLmxvY2sgZmlsZSBpZiBvbmUgZG9lcwotCSAqIG5vdCBleGlzdAotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBwYXRoIHRvIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2NrTGlicmFyeShGaWxlIGxpYkRpckZpbGUpIHsKLQkJRmlsZSBsb2NrRmlsZSA9IG5ldyBGaWxlKGxpYkRpckZpbGUsIFJlc291cmNlVXRpbC5MT0NLX0ZJTEVOQU1FKTsKLQkJbG9jayA9IEZpbGVVdGlsLmxvY2tGaWxlKGxvY2tGaWxlKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9YTUlPcHBvc2l0ZUZlYXR1cmVMb2FkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL1hNSU9wcG9zaXRlRmVhdHVyZUxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2I3YjUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL1hNSU9wcG9zaXRlRmVhdHVyZUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGxvYWRpbmcgb2Ygb3Bwb3NpdGUgZmVhdHVyZXMgZm9yIGEgWE1JLWJhc2VkIG1ldGhvZCBsaWJyYXJ5LgotICogIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUlPcHBvc2l0ZUZlYXR1cmVMb2FkZXIgaW1wbGVtZW50cyBJT3Bwb3NpdGVGZWF0dXJlTG9hZGVyIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyI2xvYWRPcHBvc2l0ZUZlYXR1cmVzKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRPcHBvc2l0ZUZlYXR1cmVzKENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJSGFzaFNldCBvcHBvc2l0ZUZlYXR1cmVzID0gbmV3IEhhc2hTZXQoKTsKLQkJSGFzaFNldCBkZWxldGVkR1VJRHMgPSBuZXcgSGFzaFNldCgpOwotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZihvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBvOwotCQkJCWlmKHJlc291cmNlU2V0ID09IG51bGwpIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlLmVSZXNvdXJjZSgpOwotCQkJCQlSZXNvdXJjZVNldCByc2V0OwotCQkJCQlpZihyZXNvdXJjZSA9PSBudWxsIHx8ICEoKHJzZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKSBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCXJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcnNldDsKLQkJCQl9Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGUuZUFsbENvbnRlbnRzKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJQ29sbGVjdGlvbiBmZWF0dXJlcyA9ICgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkKLQkJCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZXMoKTsKLQkJCQkJCWlmIChmZWF0dXJlcyAhPSBudWxsCi0JCQkJCQkJCSYmICFmZWF0dXJlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQlvcHBvc2l0ZUZlYXR1cmVzCi0JCQkJCQkJCQkuYWRkQWxsKGZlYXR1cmVzKTsKLQkJCQkJCQlkZWxldGVkR1VJRHMuYWRkKCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkKLQkJCQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCUNvbGxlY3Rpb24gZmVhdHVyZXMgPSBlLmdldE9wcG9zaXRlRmVhdHVyZXMoKTsKLQkJCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCAmJiAhZmVhdHVyZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCW9wcG9zaXRlRmVhdHVyZXMuYWRkQWxsKGZlYXR1cmVzKTsKLQkJCQkJZGVsZXRlZEdVSURzLmFkZChlLmdldEd1aWQoKSk7Ci0JCQkJfQkJCQkKLQkJCX0KLQkJfQotCQkKLQkJcmVzb3VyY2VTZXQubG9hZE9wcG9zaXRlRmVhdHVyZXMobmV3IEFycmF5TGlzdChvcHBvc2l0ZUZlYXR1cmVzKSwgZGVsZXRlZEdVSURzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU3NzY4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBtYW5hZ2luZyBhIFhNSS1iYXNlZCBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNWRlMmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciBtYW5hZ2luZyBhIFhNSS1iYXNlZCBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9wcmVmZXJlbmNlcy9YTUlMaWJyYXJ5UHJlZmVyZW5jZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL3ByZWZlcmVuY2VzL1hNSUxpYnJhcnlQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzMxZTVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL3ByZWZlcmVuY2VzL1hNSUxpYnJhcnlQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBUaGUgWE1MIE1ldGhvZCBMaWJyYXJ5IHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNSUxpYnJhcnlQcmVmZXJlbmNlcyB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBsaWJyYXJ5IHBhdGggcHJlZmVyZW5jZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MSUJSQVJZX1BBVEggPSAiZGVmYXVsdExpYnJhcnlQYXRoIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIHsKLQkJLy8gSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KLQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgc3RvcmUgPSBYTUlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJU3RyaW5nIGRlZmF1bHRMaWJyYXJ5UGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIikgLy8kTk9OLU5MUy0xJAotCQkJCS8vIEZJWE1FISBBdm9pZCB1c2luZyBoYXJkIGNvZGVkIGNvbnN0YW50Ci0JCQkJKyBGaWxlVXRpbC5GSUxFX1NFUCArICJFUEYiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIEZpbGVVdGlsLkZJTEVfU0VQICsgIk1ldGhvZCBMaWJyYXJpZXMiOyAvLyROT04tTkxTLTEkCi0JCXN0b3JlLnNldERlZmF1bHQoREVGQVVMVF9MSUJSQVJZX1BBVEgsIGRlZmF1bHRMaWJyYXJ5UGF0aCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBsaWJyYXJ5IHBhdGggcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0TGlicmFyeVBhdGgoKSB7Ci0JCXJldHVybiBYTUlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJREVGQVVMVF9MSUJSQVJZX1BBVEgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Ly5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNjlkM2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIExpYnJhcnkgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUwMDM4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MzNmMzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogbGlicmFyeS5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cywKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmZXJlbmNlcywKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcywKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0LAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5hcGFjaGUuYW50LAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2ZlNDI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1zb3VyY2UubGlicmFyeS5qYXIgPSBzcmMvCi1vdXRwdXQubGlicmFyeS5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBsaWJyYXJ5LmphcixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIGxheW91dC8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9pY29ucy9Sb2xlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2ljb25zL1JvbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmU4ODk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2ljb25zL1JvbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2Nzcy9kZWZhdWx0LmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9jc3MvZGVmYXVsdC5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NjhjMDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2Nzcy9kZWZhdWx0LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDUyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWltYWdlOiBub25lOwotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci19Ci0KLXAgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotfQotCi1oMSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IGxhcmdlOwotfQotCi1oMiB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDE1MCU7Ci19Ci0KLWgzIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotfQotCi1oNCwgaDUsIGg2IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTAwJTsKLX0KLQotYTpsaW5rIHsKLQljb2xvcjogIzAwMzM5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWE6YWN0aXZlIHsKLQljb2xvcjogIzAwMzM5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYTp2aXNpdGVkIHsKLQljb2xvcjogIzAwMzM5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWFbaHJlZl06aG92ZXIgewotCWNvbG9yOiAjZmYwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1vbCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JbGlzdC1zdHlsZS10eXBlOiBkZWNpbWFsOwotCW1hcmdpbi1sZWZ0OiAzMHB4OwotfQotCi1vbCBsaSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotdWwgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCWxpc3Qtc3R5bGUtdHlwZTogZGlzYzsKLQltYXJnaW4tbGVmdDogMzBweDsKLQltYXJnaW4tdG9wOiAwcHg7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci19Ci0KLXVsIGxpIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi10YWJsZSB7Ci0JYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKLQliYWNrZ3JvdW5kOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwkKLX0KLQotdGJvZHkgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCXZhbGlnbjogYmFzZWxpbmU7Ci19Ci0KLXRoIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi10ZCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci19Ci0KLXRkIHVsIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQltYXJnaW4tYm90dG9tOiAwcHg7Ci0JbWFyZ2luLWxlZnQ6IDMwcHg7Ci19Ci0KLS5wYWdlVGl0bGUgewotCWJhY2tncm91bmQ6ICM5OTk5Y2M7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1zaXplOiAxMnB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXBhZGRpbmctYm90dG9tOiA1cHg7Ci0JcGFkZGluZy1sZWZ0OiAxMHB4OwotCXBhZGRpbmctcmlnaHQ6IDEwcHg7Ci0JcGFkZGluZy10b3A6IDVweDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi0ucGFnZVRpdGxlU2VwYXJhdG9yIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotCXBhZGRpbmc6IDBweDsKLX0KLQotLnRhYiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzVjODFhNzsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7IAotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmFjdGl2ZVRhYiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2M4ZDdlMzsKLQljb2xvcjogIzI5M2Q2YjsJCi0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOyAKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWEudGFiOmxpbmssIGEudGFiOmFjdGl2ZSwgYS50YWI6dmlzaXRlZCB7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOyAKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWEudGFiOmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsJCi19Ci0KLS5vdmVydmlldyB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQlwYWRkaW5nLWJvdHRvbTogMTBweDsKLQlwYWRkaW5nLWxlZnQ6IDIwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAxMHB4OwotfQotCi0ub3ZlcnZpZXdUYWJsZSB7Ci0JYmFja2dyb3VuZDogI2ZmZmZmZjsKLQl3aWR0aDogMTAwJTsJCi19Ci0KLS5vdmVydmlld1RhYmxlIHRkIHsKLQlwYWRkaW5nOiA1cHggNXB4IDVweCA1cHg7Ci19Ci0KLS5vdmVydmlld1NlcGFyYXRvciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLQlwYWRkaW5nOiAwcHg7Ci19Ci0KLS5leHBhbmRDb2xsYXBzZVRleHQgewotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLQlwYWRkaW5nLWxlZnQ6IDVweDsKLQlwYWRkaW5nLXJpZ2h0OiA1cHg7Ci19Ci0KLS5leHBhbmRDb2xsYXBzZUxpbmsgewotCWNvbG9yOiAjMzMzMzMzOwotCXBhZGRpbmctYm90dG9tOiA1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uZXhwYW5kQ29sbGFwc2VMaW5rOmhvdmVyIHsKLQljb2xvcjogIzAwMDBmZjsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmV4cGFuZENvbGxhcHNlTGluazp2aXNpdGVkIHsKLQljb2xvcjogIzMzMzMzMzsKLX0KLQotLnNlY3Rpb25IZWFkaW5nIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOThiMWM0OwotCWNvbG9yOiAjZmZmZmZmOwotCWN1cnNvcjogaGFuZDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlmb250LXdlaWdodDogYm9sZDsKLQlwYWRkaW5nLWJvdHRvbTogMnB4OwotCXBhZGRpbmctbGVmdDogMnB4OwotCXBhZGRpbmctdG9wOiAycHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uc2VjdGlvbkNvbnRlbnQgewotCXBhZGRpbmctYm90dG9tOiAwcHg7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAwcHg7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotLnNlY3Rpb25UYWJsZSB7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXRvcC1jb2xvcjogI2NjYzsKLQkKLQkvKmRvbid0IGRlZmluZSBwYWRkaW5nIGluIHRhYmxlLCB0aGUgYmVoYXZpb3IgaXMgZGlmZmVyZW50IGluIElFIGFuZCBmaXJlZm94LiAKLQkgSW4gSUUsIHRoZSBwYWRkaW5nIGlzIGFwcGxpZWQgYmVmb3JlIHRoZSBjZWxsJ3MgYmFja2dyb3VuZCBjb2xvciBpcyBlbmZvcmNlZC4KLQkgaW4gZmlyZWZveCwgdGhlIHBhZGRpbmcgaXMgYXBwbGllZCBmaXJzdCwgc28gbGVhdmUgdGhlIHRhYmxlJ3MgYmFja2dyb3VuZCBpbnRoZSBwYWRkaW5nIGFyZWEuCi0JIERlZmluZSB0aGUgcGFkZGluZyBpbiB0aGUgdGFibGUgY2VsbCBpbnN0ZWFkLCB0aGlzIHdvcmtzIGluIGJvdGggSUUgYW5kIG1vemlsbGEKLQkgKi8KLQlwYWRkaW5nOiAwcHggMHB4IDBweCAwcHg7CQotCXdpZHRoOiAxMDAlOwotfQotCi0uc2VjdGlvblRhYmxlSGVhZGluZyB7Ci0JYmFja2dyb3VuZDogI2VlZTsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDBweDsKLQljb2xvcjogIzMzMzMzMzsKLQloZWlnaHQ6IDIwOwotCXRleHQtYWxpZ246IGxlZnQ7Ci0Jd2lkdGg6IDIwJTsKLQlwYWRkaW5nOiAxMHB4IDEwcHggMTBweCAxMHB4OwkKLQotfQotCi0uc2VjdGlvblRhYmxlQ2VsbEhlYWRpbmcgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQlmb250LWNvbG9yOiAjNjY2NjY2OwotCXBhZGRpbmc6IDEwcHggMTBweCAxMHB4IDEwcHg7Ci0KLX0KLQotLnNlY3Rpb25UYWJsZUNlbGwgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCXBhZGRpbmc6IDEwcHggMTBweCAxMHB4IDEwcHg7Ci0KLX0KLQotLnNlY3Rpb25UYWJsZVNpbmdsZUNlbGwgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCXBhZGRpbmc6IDEwcHggMTBweCAxMHB4IDEwcHg7Ci19Ci0KLS5icmVha2Rvd25UYWJsZSB7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAxcHg7Ci0JcGFkZGluZzogMHB4IDBweCAwcHggMHB4OwotCXdpZHRoOiAxMDAlOwotfQotCi0uYnJlYWtkb3duVGFibGUgdGggewotCWJhY2tncm91bmQ6ICNlZWU7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JaGVpZ2h0OiAyMDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi0uYnJlYWtkb3duVGFibGUgdGQgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotfQotCi0uZGVmYXVsdFRhYmxlIHsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDBweDsKLQlwYWRkaW5nOiAwcHggMHB4IDBweCAwcHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5kZWZhdWx0VGFibGUgdGQgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLS5zdWJTZWN0aW9uSGVhZGluZyB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uc3ViU2VjdGlvbkNvbnRlbnQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS5zdGVwSGVhZGluZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLQljb2xvcjogIzI5M2Q2YjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlmb250LXdlaWdodDogYm9sZDsKLQlwYWRkaW5nLWJvdHRvbTogMnB4OwotCXBhZGRpbmctbGVmdDogMnB4OwotCXBhZGRpbmctdG9wOiAycHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uc3RlcENvbnRlbnQgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCXBhZGRpbmctYm90dG9tOiA1cHg7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAwcHg7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotLnN0ZXBUYWJsZSB7Ci0JYm9yZGVyLWJvdHRvbTogIzk5OTk5OSBzb2xpZCAxcHg7Ci0JYm9yZGVyLWxlZnQ6ICM5OTk5OTkgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogIzk5OTk5OSBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogIzk5OTk5OSBzb2xpZCAwcHg7Ci0JcGFkZGluZy1ib3R0b206IDIwcHg7Ci0JcGFkZGluZy1sZWZ0OiAxMHB4OwotCXBhZGRpbmctcmlnaHQ6IDEwcHg7Ci0JcGFkZGluZy10b3A6IDEwcHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5zdGVwVGFibGUgdGQgewotCWJvcmRlcjogI2NjYyBzb2xpZCAwcHg7Ci19Ci0KLS5zdGVwU2VwYXJhdG9yIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCXBhZGRpbmc6IDBweDsKLX0KLQotLmJhY2tUb1RvcExpbmsgewotCWNvbG9yOiAjZmZmZmY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7CQotCW1hcmdpbjogMHB4OwotCXBhZGRpbmctYm90dG9tOiAxMHB4OwotCXRleHQtYWxpZ246IG1pZGRsZTsJCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uYmFja1RvVG9wTGluazpob3ZlciB7Ci0JY29sb3I6ICM5Njk7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5iYWNrVG9Ub3BMaW5rOnZpc2l0ZWQgewotCWNvbG9yOiAjNWM4MWE3OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS5jb3B5cmlnaHQgewotCWNvbG9yOiAjNzA4MGIwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCXBhZGRpbmctbGVmdDogMHB4OwotCXBhZGRpbmctcmlnaHQ6IDEwcHg7Ci0JcGFkZGluZy10b3A6IDI1cHg7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLnZlcnNpb25JbmZvIHsKLQljb2xvcjogIzcwODBiMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQlwYWRkaW5nLWxlZnQ6IDEwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAyNXB4OwotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLS5xdW90ZSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uY29kZVNhbXBsZSB7Ci0JZm9udC1mYW1pbHk6IGNvdXJpZXI7Ci0JZm9udC1zaXplOiAxMHB0OwkJCi19Ci0KLS5lbGVtZW50TGluayB7Ci0JY29sb3I6ICMwMDAwZmY7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci19Ci0KLS5lbGVtZW50TGlua1dpdGhUeXBlIHsKLQljb2xvcjogIzAwMDBmZjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLX0KLQotLmVsZW1lbnRMaW5rV2l0aFVzZXJUZXh0IHsKLQljb2xvcjogIzAwMDBmZjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLX0KLQotI3Jlc3VsdHMgewotIAlib3JkZXItdG9wOiB0aGluIHNvbGlkIGJsYWNrOwotCW1hcmdpbjogMTBweCBhdXRvIDEwcHggYXV0bzsKLQltYXgtd2lkdGg6IDU5MHB4OwotCXBhZGRpbmc6IDEwcHg7Ci0gIAlwb3NpdGlvbjogcmVsYXRpdmU7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLQl3aWR0aDogZXhwcmVzc2lvbigoZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aC0zMCkrJ3B4Jyk7Ci19Ci0KLS8qCi0uY29udGVudFRvb2xiYXJJY29uIHsKLQljb2xvcjogI2ZmZmZmZjsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JbWFyZ2luOiAwcHg7Ci0JcGFkZGluZzogMHB4OwkKLX0KLQotLmNvbnRlbnRUb29sYmFySWNvbiBpbWcgewotCWN1cnNvcjogcG9pbnRlcjsKLQltYXJnaW46IDBweDsKLQlwYWRkaW5nOiAwcHg7Ci0JYm9yZGVyOiAwcHg7Ci19Ci0KLQotLmNvbnRlbnRUb29sYmFySWNvbiBhOmxpbmsgewotCWNvbG9yOiAjZmZmZmZmOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotCi0uY29udGVudFRvb2xiYXJJY29uIGE6YWN0aXZlIHsKLQljb2xvcjogI2ZmZmZmZjsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLQotLmNvbnRlbnRUb29sYmFySWNvbiBhOnZpc2l0ZWQgewotCWNvbG9yOiAjZmZmZmZmOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotCi0uY29udGVudFRvb2xiYXJJY29uIGE6aG92ZXIgewotCWNvbG9yOiAjZmZmZmZmOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmNvbnRlbnRUb29sYmFySWNvbiBhW2hyZWZdOmhvdmVyIHsKLQljb2xvcjogI2ZmZmZmZjsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0qLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL0FydGlmYWN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9BcnRpZmFjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMWU0ZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL0FydGlmYWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9BcnRpZmFjdC5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvQXJ0aWZhY3QuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzM5MTI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9BcnRpZmFjdC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvRGVsaXZlcmFibGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL0RlbGl2ZXJhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RmZTYyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvRGVsaXZlcmFibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL091dGNvbWUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL091dGNvbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjczODgyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9PdXRjb21lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9Sb2xlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9Sb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmYTRjNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvUm9sZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvUm9sZS5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvUm9sZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMTgzYTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL1JvbGUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL1Rhc2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL1Rhc2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmM0NjEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9UYXNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9UYXNrLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9UYXNrLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhYzJjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvVGFzay5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvcHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvcHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmOWEwODUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL3Byb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hY3Rpdml0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczOTNlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FjdGl2aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYWN0aXZpdHlfbWVkaXVtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYWN0aXZpdHlfbWVkaXVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczOTNlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FjdGl2aXR5X21lZGl1bS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2FjbHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9hY2xzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwYjU5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2FjbHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9hbmFtZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2FuYW1kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY2NjZlNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2FuYW1kLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfY2xhc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9jbGFzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmODM1MmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9jbGFzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2Rlc21kLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZGVzbWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDBjYzkyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZGVzbWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9kb2MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9kb2MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmI5ZDVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZG9jLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZHBrZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2Rwa2cuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI2YWE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZHBrZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2RwbG1vZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2RwbG1vZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZjU4ZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9kcGxtb2QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9kc3N1Yi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2Rzc3ViLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc3YTZiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2Rzc3ViLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZXZlbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9ldmVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOWY2NWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9ldmVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2ltcG1kLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfaW1wbWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmQwNmFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfaW1wbWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9pbnRmYy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2ludGZjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzMWJhMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2ludGZjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfcG9jLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfcG9jLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgwN2ZkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX3BvYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX3NpZ25hLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfc2lnbmEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGIwMzFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfc2lnbmEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcnRpZmFjdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FydGlmYWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExZTRmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FydGlmYWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJ0aWZhY3RfbWVkaXVtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJ0aWZhY3RfbWVkaXVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExZTRmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FydGlmYWN0X21lZGl1bS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2JhY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9iYWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNjZGZhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2JhY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9iYWNrX3RvX3RvcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2JhY2tfdG9fdG9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU2ZDk1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2JhY2tfdG9fdG9wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYm9va21hcmsuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ib29rbWFyay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZDUzNWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ib29rbWFyay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NoZWNrbGlzdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NoZWNrbGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzM2FhM2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jaGVja2xpc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jaXJjbGVfY2xvc2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jaXJjbGVfY2xvc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGRkOTcyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY2lyY2xlX2Nsb3NlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY2lyY2xlX29wZW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jaXJjbGVfb3Blbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMThlMjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jaXJjbGVfb3Blbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbGxhcHNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29sbGFwc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjY1NDFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29sbGFwc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb2xsYXBzZV9hbGwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb2xsYXBzZV9hbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGY3MDE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29tcG9zaXRlcm9sZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbXBvc2l0ZXJvbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmZhNGM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29tcG9zaXRlcm9sZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbmNlcHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb25jZXB0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBlOTVjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbmNlcHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb250ZW50X3BhY2thZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb250ZW50X3BhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmMwODFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29udGVudF9wYWNrYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29udGVudF9wYWNrYWdlX21lZGl1bS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbnRlbnRfcGFja2FnZV9tZWRpdW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmMwODFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29udGVudF9wYWNrYWdlX21lZGl1bS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kaXNwbGF5X3ZpZXdzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYyNDAyMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kaXNwbGF5X3ZpZXdzX2EuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kaXNwbGF5X3ZpZXdzX2EuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjI0MDIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZGlzcGxheV92aWV3c19hLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZGl2aWRlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RpdmlkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTllN2RkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZGl2aWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fY2xvc2UuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmQyMDI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fY2xvc2UuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9jbG9zZV9zbWFsbC5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlX3NtYWxsLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY2YjgxNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlX3NtYWxsLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fY2xvc2Vfc21hbGxfcmlnaHQuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9jbG9zZV9zbWFsbF9yaWdodC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MDZjOTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9jbG9zZV9zbWFsbF9yaWdodC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX29wZW4uanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9vcGVuLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY5MDRlZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX29wZW4uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9vcGVuX3NtYWxsLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fb3Blbl9zbWFsbC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNjM1YjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9vcGVuX3NtYWxsLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fb3Blbl9zbWFsbF9yaWdodC5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX29wZW5fc21hbGxfcmlnaHQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWI3ZDRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fb3Blbl9zbWFsbF9yaWdodC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Rvd25fYXJyb3cuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb3duX2Fycm93LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY4YzQyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Rvd25fYXJyb3cuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9lc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9lc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWQ0YzNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZXhhbXBsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2V4YW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTMxMGIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZXhhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2V4cGFuZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2V4cGFuZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMGZlOGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9leHBhbmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9leHBhbmRfYWxsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZXhwYW5kX2FsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMThhMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9leHBhbmRfYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZmFsc2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9mYWxzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNjY1ZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9mYWxzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2ZvcndhcmQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9mb3J3YXJkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ1YTFhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2ZvcndhcmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ndWlkYW5jZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2d1aWRhbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU5MWU1Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2d1aWRhbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZ3VpZGFuY2VfbWVkaXVtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZ3VpZGFuY2VfbWVkaXVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU5MWU1Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2d1aWRhbmNlX21lZGl1bS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2d1aWRsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZ3VpZGxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTkxZTViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZ3VpZGxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9pbmRlbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9pbmRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDAwM2E1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvaW5kZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbGVmdG5hdl9tb2NrdXAuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9sZWZ0bmF2X21vY2t1cC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMTY1NGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9sZWZ0bmF2X21vY2t1cC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL21ldGhvZF9wbHVnaW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9tZXRob2RfcGx1Z2luLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2YzI3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL21ldGhvZF9wbHVnaW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9tZXRob2RfcGx1Z2luX21lZGl1bS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL21ldGhvZF9wbHVnaW5fbWVkaXVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2YzI3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL21ldGhvZF9wbHVnaW5fbWVkaXVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbWlsZXN0b25lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbWlsZXN0b25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2ZmY5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL21pbGVzdG9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL25lZWRfaWNvbi5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL25lZWRfaWNvbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZDExYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9uZWVkX2ljb24uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ub19ydXAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ub19ydXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjZjNDA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbm9fcnVwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcHJhY3RpY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9wcmFjdGljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YzQzNmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9wcmFjdGljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3ByaW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcHJpbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2QyMDhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcHJpbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9wcm9jZXNzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmOWEwODUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9wcm9jZXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcHJvY2Vzc19tZWRpdW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9wcm9jZXNzX21lZGl1bS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmOWEwODUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9wcm9jZXNzX21lZGl1bS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JlcG9ydC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JlcG9ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYTIzMTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yZXBvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yZXVzYWJsZWFzc2V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcmV1c2FibGVhc3NldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiOTc4OGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yZXVzYWJsZWFzc2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcm9hZG1hcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JvYWRtYXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmM1MTNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcm9hZG1hcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JvbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmYTRjNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JvbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2xlX21lZGl1bS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JvbGVfbWVkaXVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmYTRjNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JvbGVfbWVkaXVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcm9sZWRlc19sZ19kZ20zMi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JvbGVkZXNfbGdfZGdtMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWYyMmUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcm9sZWRlc19sZ19kZ20zMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3J1cDEuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ydXAxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYyNDAyMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3J1cDEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ydXAxX2EuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ydXAxX2EuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjI0MDIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcnVwMV9hLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc2FtcGxlX3NlY3Rpb25oZWFkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc2FtcGxlX3NlY3Rpb25oZWFkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyZTgyMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3NhbXBsZV9zZWN0aW9uaGVhZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3NoaW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9zaGltLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFiYTc5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3NoaW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9zdGVwX3NhbXBsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3N0ZXBfc2FtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNmNDA5OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3N0ZXBfc2FtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc3VwcG9ydGluZ21hdGVyaWFsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc3VwcG9ydGluZ21hdGVyaWFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExZTRmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3N1cHBvcnRpbmdtYXRlcmlhbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9lbmQtYS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9lbmQtYS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4Y2M1ZTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfZW5kLWEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfZW5kLWkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfZW5kLWkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzU0NDdmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX2VuZC1pLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX21pZGRsZS1hX2kuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfbWlkZGxlLWFfaS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNzk1NTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfbWlkZGxlLWFfaS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9taWRkbGUtaV9hLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX21pZGRsZS1pX2EuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDk4NjdmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX21pZGRsZS1pX2EuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfbWlkZGxlLWlfaS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9taWRkbGUtaV9pLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4N2IwZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9taWRkbGUtaV9pLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX3NwYWNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX3NwYWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRhOThkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9zcGFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9zcGFjZV9taWRkbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfc3BhY2VfbWlkZGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhOWJhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9zcGFjZV9taWRkbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YXNrLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYzQ2MTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YXNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFza19tZWRpdW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YXNrX21lZGl1bS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYzQ2MTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YXNrX21lZGl1bS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rhc2tkZXNfbGdfZGdtMzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YXNrZGVzX2xnX2RnbTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZlZDQ3Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rhc2tkZXNfbGdfZGdtMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90ZWFtcHJvZmlsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RlYW1wcm9maWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZiZDdkNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RlYW1wcm9maWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVjaG5pcXVlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVjaG5pcXVlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU5MWU1Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RlY2huaXF1ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RlbXBsYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTdhN2UwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90ZXJtZGVmaW5pdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rlcm1kZWZpbml0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRjOWYyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rlcm1kZWZpbml0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGl0bGViYWNrX2xlZnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90aXRsZWJhY2tfbGVmdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZWNhMGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90aXRsZWJhY2tfbGVmdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RpdGxlYmFja19yaWdodC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RpdGxlYmFja19yaWdodC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4Yjg5YzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90aXRsZWJhY2tfcmlnaHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b29sbWVudG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdG9vbG1lbnRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNTVhMmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b29sbWVudG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdG9wLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdG9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE1YWNmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RvcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RvcF9zbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RvcF9zbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlN2ZiYTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b3Bfc20uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b3BiYXJfbW9ja3VwLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdG9wYmFyX21vY2t1cC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NjY2NDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b3BiYXJfbW9ja3VwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdHJ1ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RydWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTRkYTA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdHJ1ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3VfYm9sZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3VfYm9sZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmY2Q1YTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy91X2JvbGQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy91cF9hcnJvdy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3VwX2Fycm93LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFlNWNjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3VwX2Fycm93LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvd2hpdGVwYXBlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3doaXRlcGFwZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmU0OGVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvd2hpdGVwYXBlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3dvcmtkZXNfbGdfZGdtMzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy93b3JrZGVzX2xnX2RnbTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ0ZTVkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3dvcmtkZXNfbGdfZGdtMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvQWN0aXZpdHlUcmVlVGFibGUuanMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU5MDhjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDg2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZnVuY3Rpb24gQWN0aXZpdHlUcmVlVGFibGUoLypQcm9jZXNzRWxlbWVudFBhZ2UqL3BhcmVudCkgewotdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci10aGlzLnRyZWVfbm9kZV9jbGFzcyAgPSAidHJlZU5vZGUiOwkvLyAhISEgZG9uJ3QgdHJhbnNsYXRlIHRoaXMgISEhCi10aGlzLmV4cGFuZEltYWdlID0gbnVsbDsKLXRoaXMuY29sbGFwc2VJbWFnZSA9IG51bGw7Ci10aGlzLnNoaW1JbWFnZSA9IG51bGw7Ci10aGlzLndic0l0ZW1IdG1sID0gbnVsbDsKLXRoaXMuaW1hZ2VQYXRoID0gbnVsbDsKLXRoaXMuTk9ERV9DT0xMQVBTRUQgPSAwOwotdGhpcy5OT0RFX0VYUEFOREVEID0gMTsKLXRoaXMuREVGQVVMVF9FWFBBTkRfTEVWRUwgPSAwOyAvLyAwIC0gY29sbGFwc2UgYWxsLCAxIC0gZXhwYW5kIHRoZSBmaXJzdCBsZXZlbCwgLi4uLCA5OTk5IC0gaWYgeW91IGhhdmUgdGhpcyBtYW55Ci0KLX07Ci0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHRyZWUgdGFibGUKLS8vIHRoZSBleHBlY3RlZCBmb3JtYXQgb2YgdGhlIGh0bWwgc291cmNlIGFyZSBhcyBmb2xsb3dzOgotLy8gZWFjaCA8VFIgdGFnIGhhcyBhIHVpbnF1ZSBpZCBhbmQgYSBwYXJlbnRJZC4KLS8qCi08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLTxsaW5rIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2Nzcy9kZWZhdWx0LmNzcyIgcmVsPSJTdHlsZVNoZWV0Ij4KLTxzY3JpcHQgc3JjPSIuL3RyZWV0YWJsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBvbmxvYWQ9ImNyZWF0ZVRyZWUoJ3RkJywgJ3RyZWVOb2RlJywgJy4vaW1hZ2VzLycpOyIgPgotPHRhYmxlIGJvcmRlcj0iMSI+Ci08dHIgaWQ9IjEiIHBhcmVudElkPSIwIj4KLTx0ZCBjbGFzcz0idHJlZU5vZGUiPmNvbCAxLTE8L3RkPjx0ZD5jb2wgMS0yPC90ZD4KLTwvdHI+Ci0KLTx0ciBpZD0iMiIgcGFyZW50SWQ9IjEiPgotPHRkIGNsYXNzPSJ0cmVlTm9kZSI+Y29sIDEtMTwvdGQ+PHRkPmNvbCAyLTI8L3RkPgotPC90cj4KLQotPHRyIGlkPSIzIiBwYXJlbnRJZD0iMSI+Ci08dGQgY2xhc3M9InRyZWVOb2RlIj5jb2wgMS0xPC90ZD48dGQ+Y29sIDItMjwvdGQ+Ci08L3RyPgotCi08dHIgaWQ9IjQiIHBhcmVudElkPSIwIj4KLTx0ZCBjbGFzcz0idHJlZU5vZGUiPmNvbCAyLTE8L3RkPjx0ZD5jb2wgMi0yPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9ib2R5PgotKi8KLUFUVFJfUk9XX0RBVEFfSU5ERVggPSAiZGF0YUluZGV4IjsKLUFUVFJfQ0hJTERfTE9BREVEID0gImNoaWxkTG9hZGVkIjsKLUFUVFJfSU5ERU5UX1NJWkUgPSAiaW5kZW50U2l6ZSI7Ci1BVFRSX0VYUEFOREVEID0gImV4cGFuZGVkIjsKLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbihpbWdQYXRoKQotewotCXRoaXMuaW1hZ2VQYXRoID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoKTsKLQl0aGlzLmV4cGFuZEltYWdlID0gdGhpcy5pbWFnZVBhdGggKyAnZXhwYW5kLmdpZic7CQotCXRoaXMuY29sbGFwc2VJbWFnZSA9IHRoaXMuaW1hZ2VQYXRoICsgJ2NvbGxhcHNlLmdpZic7Ci0JLy9leHBhbmRBbGxJbWFnZSA9IHRoaXMuaW1hZ2VQYXRoICsgJ2V4cGFuZF9hbGwuZ2lmJzsJCi0JLy9jb2xsYXBzZUFsbEltYWdlID0gdGhpcy5pbWFnZVBhdGggKyAnY29sbGFwc2VfYWxsLmdpZic7Ci0JLy9iYWNrVG9Ub3BJbWFnZSA9IHRoaXMuaW1hZ2VQYXRoICsgJ2JhY2tfdG9fdG9wLmdpZic7Ci0JdGhpcy5zaGltSW1hZ2UgPSB0aGlzLmltYWdlUGF0aCArICdpbmRlbnQuZ2lmJzsKLQl0aGlzLndic0l0ZW1IdG1sID0gbmV3IFdCU0l0ZW1IdG1sKHRoaXMsIHRoaXMuaW1hZ2VQYXRoKTsKLX07Ci0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5jcmVhdGVUcmVlID0gZnVuY3Rpb24odGFnTmFtZSwgY2xhc3NTZWxlY3RvcikgewotCi0JLy8gY3JlYXRlIHRoZSB0cmVlIHRhYmxlIGZpcnN0Ci0JdGhpcy5jcmVhdGVUYWJsZSgpOwotfTsKLQotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuY3JlYXRlVGFibGUgPSBmdW5jdGlvbigpIHsKLQotCXZhciBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidHJlZUNvbnRlbnQiKTsKLQlpZiAoIGRpdiA9PSBudWxsICkgcmV0dXJuOwotCQotCS8vIGNyZWF0ZSB0YWJsZQotCXZhciB0YWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlRBQkxFIik7Ci0JdGFibGUuaWQgPSAiQWN0aXZpdHlUcmVlVGFibGUiOwotCXRhYmxlLnRpdGxlID0gdGhpcy5kYXRhLnRpdGxlOwotCXRhYmxlLnN1bW1hcnkgPSB0aGlzLmRhdGEuc3VtbWFyeTsKLQl0YWJsZS5jZWxsc3BhY2luZyA9ICIwcHgiOwotCXRhYmxlLmNlbGxwYWRkaW5nID0gIjBweCI7Ci0JdGFibGUuYm9yZGVyPSIwcHgiOwotCXRhYmxlLndpZHRoPSIxMDAlIjsKLQl0YWJsZS5ib3JkZXJjb2xvciA9ICIjOTk5OTk5IjsKLQl0YWJsZS5jbGFzc05hbWUgPSAiYnJlYWtkb3duVGFibGUiOwotCQotCS8vIGNyZWF0ZSB0YWJsZSBoZWFkCi0JLy92YXIgdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJUUiIpOwotCXZhciB0ciA9IHRhYmxlLmluc2VydFJvdyh0YWJsZS5yb3dzLmxlbmd0aCk7Ci0JCi0JdHIuc2V0QXR0cmlidXRlKCJ2YWxpZ24iLCAidG9wIik7Ci0JCi0JdmFyIGxlbiA9IHRoaXMuZGF0YS5jb2x1bW5zLmxlbmd0aDsKLQlmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkgewotCQl2YXIgY29sID0gdGhpcy5kYXRhLmNvbHVtbnNbaV07Ci0JCXZhciBpZCA9IEJTX0lEX1BSRUZJWCArIGNvbFswXTsKLQkJdmFyIGFiYnIgPSBjb2xbMV07Ci0JCQotCQl2YXIgdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJUSCIpOwkJCi0JCXRoLmlkID0gaWQ7Ci0JCXRoLmFiYnIgPSBhYmJyOwotCQl0aC5pbm5lckhUTUwgPSAiPHNwYW4gc3R5bGU9J3doaXRlLXNwYWNlOm5vd3JhcDsnPiIgKyBjb2xbMV0gKyAiPC9zcGFuPiI7Ci0JCXRyLmFwcGVuZENoaWxkKHRoKTsKLQl9CQkJCi0JCi0JCi0JLy90YWJsZS5hcHBlbmRDaGlsZCh0cik7Ci0JZGl2LmFwcGVuZENoaWxkKHRhYmxlKTsKLQkKLQkvLyBjcmVhdGUgdGhlIHRvcCByb3dzCi0JdGhpcy5jcmVhdGVUb3BsZXZlbFJvd3MoKTsKLQkJCi0JLy8gZm9yIElFIG5lZWQgdG8gcmVzZXQgdG8gZnJlc2ggdGhlIGxheW91dAotCS8vZGl2LmlubmVySFRNTCA9ICIiICsgZGl2LmlubmVySFRNTCArICIiOwotfTsKLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLnByb2Nlc3NUUiA9IGZ1bmN0aW9uKHRyRWxlbWVudCkgewotCi0JdmFyIGluZGVudFNpemUgPSAwOwotCXZhciBwYXJlbnRJZCA9IHRyRWxlbWVudC5nZXRBdHRyaWJ1dGUoInBhcmVudElkIik7Ci0JdmFyIHBhcmVudFRSICA9IG51bGw7Ci0JaWYgKCBwYXJlbnRJZCAhPSAiIikKLQl7Ci0KLQkJLy8gY2FjaGUgaXQgdG8gYmUgZmFzdGVyCi0JCXBhcmVudFRSID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyZW50SWQpOwotCQkvL3BhcmVudFRSID0gY3JlYXRlZE5vZGVzW3BhcmVudElkXTsKLQkJaWYgKCBwYXJlbnRUUiAhPSBudWxsICYmIHBhcmVudFRSICE9IHVuZGVmaW5lZCApCi0JCXsKLQkJCWluZGVudFNpemUgPSBwYXJzZUludChwYXJlbnRUUi5nZXRBdHRyaWJ1dGUoQVRUUl9JTkRFTlRfU0laRSkpICsgMTsKLQkJfQotCX0KLQotCXZhciBleHBhbmRlZCA9IHRoaXMuZ2V0RGVmYXVsdEV4cGFuZFN0YXRlKGluZGVudFNpemUpOwotCi0JdHJFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSX0lOREVOVF9TSVpFLCBpbmRlbnRTaXplKTsKLQl0ckVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJfRVhQQU5ERUQsIGV4cGFuZGVkKTsKLQotCS8vYWxlcnQoImNyZWF0ZVRyZWVOb2RlIGZvciBpZCwgcGFyZW50SWQsIGluZGVudCA9IiArIHRyRWxlbWVudC5pZCArICIsICIgKyBwYXJlbnRJZCArICIsICBpbmRlbnRTaXplPSIgKyBpbmRlbnRTaXplKTsKLQkvL2NyZWF0ZVRyZWVOb2RlKGVsZW1lbnQsIGluZGVudFNpemUpOwotCi0JLy9zYXZlIHRoZSBjcmVhdGVkIG9uZXMgc28gd2UgY2FuIHJlZmVyZWNuZSBpdAotCS8vY3JlYXRlZE5vZGVzW3RyRWxlbWVudC5pZF0gPSB0ckVsZW1lbnQ7Ci0KLQotCWlmICggKHBhcmVudFRSICE9IG51bGwpICYmIHRoaXMuaXNOb2RlU3VwcHJlc3NlZChwYXJlbnRUUikgKQotCXsKLQkJdGhpcy5zZXROb2RlU3VwcHJlc3NlZCh0ckVsZW1lbnQsIHRydWUpOwotCQkvL2FsZXJ0KCJwYXJlbnQgc3VwcHJlc3NlZCIpOwotCX0KLQotCWlmICggdGhpcy5pc05vZGVTdXBwcmVzc2VkKHRyRWxlbWVudCkgPT0gdHJ1ZSB8fCAocGFyZW50VFIgIT0gbnVsbCAmJiBwYXJlbnRUUi5nZXRBdHRyaWJ1dGUoQVRUUl9FWFBBTkRFRCkgPT0gdGhpcy5OT0RFX0NPTExBUFNFRCkgKQotCXsKLQkJdHJFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0JCS8vYWxlcnQoInN1cHByZXNzZWQiKTsKLQl9Ci0JCQkJCi19OwotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuZ2V0VHJlZVRhYmxlID0gZnVuY3Rpb24oKSB7Ci0JcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJBY3Rpdml0eVRyZWVUYWJsZSIpOwotfTsKLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmNyZWF0ZVRvcGxldmVsUm93cyA9IGZ1bmN0aW9uKCkgewotCi0JdmFyIHRhYmxlID0gdGhpcy5nZXRUcmVlVGFibGUoKTsKLQlpZiAoIHRhYmxlID09IG51bGwgKSByZXR1cm47Ci0KLQl2YXIgcm93cyA9IHRoaXMuZGF0YS5yb3dzOwotCXZhciBsZW4gPSByb3dzLmxlbmd0aDsKLQl2YXIgc3VwcHJlc3NlZFJvd3MgPSBuZXcgQXJyYXkoKTsKLQkvL3ZhciBwYXJlbnRJZCA9ICIiOwotCQotCWZvciAoIHZhciBpID0gMDsgaSA8IGxlbjsgaSsrICkgewotCQotCQl2YXIgcm93ID0gcm93c1tpXTsKLQkJaWYgKCByb3cgPT0gbnVsbCApIGNvbnRpbnVlOwotCQkKLQkJLy9wYXJlbnRJZCA9ICIiOwotCQkKLQkJLy8gZG9uJ3QgY3JlYXRlIHRoZSByb3cgaWYgdGhlIHJvdyBpcyBzdXBwcmVzc2VkIG9yIGlmIHRoZSBwYXJlbnQgaXMgc3VwcHJlc3NlZAotCQlpZiAoIHRoaXMuaXNSb3dTdXBwcmVzc2VkKHJvdykgKSB7Ci0JCQkvL3N1cHByZXNzZWRSb3dzLnB1c2gocm93LmlkKTsKLQkJCS8vcGFyZW50SWQgPSByb3cuaWQ7Ci0JCQkKLQkJCS8vIGNsZWFyIHRoZSBzdXBwcmVzc2VkIHJvd3MKLQkJCXJvd3NbaV0gPSBudWxsOwotCQkJCi0JCQkvL2FsZXJ0KCJzdXBwcmVzc2VkICIgKyBpKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCQotCQkvKgkJCi0JCXdoaWxlICggKHJvdy5wYXJlbnRJZCAhPSBwYXJlbnRJZCkgJiYgKHN1cHByZXNzZWRSb3dzLmxlbmd0aCA+IDApICkgewotCQkJcGFyZW50SWQgPSBzdXBwcmVzc2VkUm93cy5wb3AoKTsKLQkJfQotCQkKLQkJaWYgKCAocm93LnBhcmVudElkICE9ICIiKSAmJiAocm93LnBhcmVudElkID09IHBhcmVudElkKSApIHsKLQkJCXN1cHByZXNzZWRSb3dzLnB1c2gocm93LmlkKTsKLQkJCQotCQkJLy8gY2xlYXIgdGhlIHN1cHByZXNzZWQgcm93cwotCQkJcm93c1tpXSA9IG51bGw7Ci0KLQkJCS8vYWxlcnQoInN1cHByZXNzZWQgIiArIGkpOwotCQkJY29udGludWU7Ci0JCX0KLQkJKi8KLQkJCi0JCQotCQlpZiAoIHJvdy5wYXJlbnRJZCA9PSBudWxsIHx8IHJvdy5wYXJlbnRJZCA9PSAiIikgewotCQkJdGhpcy53YnNJdGVtSHRtbC5wYXJzZVJvdyhyb3cpOwotCQkJCi0JCQl2YXIgdHIgPSB0YWJsZS5pbnNlcnRSb3codGFibGUucm93cy5sZW5ndGgpOwotCQkJdHIuc2V0QXR0cmlidXRlKEFUVFJfUk9XX0RBVEFfSU5ERVgsIGkpOwotCQkJdGhpcy53YnNJdGVtSHRtbC5sb2FkUm93KHRyKTsKLQkJCQotCQkJLy90YWJsZS5hcHBlbmRDaGlsZCh0cik7Ci0JCQkKLQkJCXRoaXMucHJvY2Vzc1RSKHRyKTsKLQkJfQotCX0KLX07Ci0KLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmNyZWF0ZUNoaWxkUm93cyA9IGZ1bmN0aW9uKHRyRWxlbWVudCkgewotCi0JdmFyIGxvYWRlZCA9IHRyRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9DSElMRF9MT0FERUQpOwotCWlmICggbG9hZGVkID09ICJ0cnVlIiApIHsKLQkJcmV0dXJuOwotCX0KLQotCi0JdmFyIHRhYmxlID0gdGhpcy5nZXRUcmVlVGFibGUoKTsKLQkvL3ZhciBpbnNlcnRCZWZvcmUgPSB0ckVsZW1lbnQuZ2V0TmV4dFNpYmxpbmc7Ci0JdmFyIHJvd0luZGV4ID0gIHBhcnNlSW50KHRyRWxlbWVudC5yb3dJbmRleCk7Ci0JCi0JLy8gbWFrZSBzdXJlIHRoZSB2YWx1ZSBpcyBhIG51bWJlciBvdGhlcndpc2UgRmlyZSBmb3ggd2lsbCB0cmVhdCBpdCBhcyBhIHN0cmluZwotCXZhciBkYXRhSW5kZXggPSAgcGFyc2VJbnQodHJFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX1JPV19EQVRBX0lOREVYKSk7Ci0JCi0JZm9yICggdmFyIGkgPSBkYXRhSW5kZXgrMTsgaSA8IHRoaXMuZGF0YS5yb3dzLmxlbmd0aDsgaSsrICkgewotCQl2YXIgcm93ID0gdGhpcy5kYXRhLnJvd3NbaV07Ci0JCWlmICggcm93ID09IG51bGwgKSBjb250aW51ZTsKLQkJaWYgKCByb3cucGFyZW50SWQgIT0gdHJFbGVtZW50LmlkICkgewotCQkJY29udGludWU7Ci0JCX0KLQkJCi0JCXRoaXMud2JzSXRlbUh0bWwucGFyc2VSb3cocm93KTsKLQotCQlyb3dJbmRleCsrOwotCQl2YXIgdHIgPSB0YWJsZS5pbnNlcnRSb3cocm93SW5kZXgpOwotCQl0ci5zZXRBdHRyaWJ1dGUoQVRUUl9ST1dfREFUQV9JTkRFWCwgaSk7Ci0JCXRoaXMud2JzSXRlbUh0bWwubG9hZFJvdyh0cik7Ci0KLQkJdGhpcy5wcm9jZXNzVFIodHIpOwotCQkKLQl9CQotCQotCXRyRWxlbWVudC5zZXRBdHRyaWJ1dGUoQVRUUl9DSElMRF9MT0FERUQsICJ0cnVlIik7Ci0JCi19OwotCi0KLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmdldERlZmF1bHRFeHBhbmRTdGF0ZSA9IGZ1bmN0aW9uKGxldmVsKQotewotCi0JaWYgKGxldmVsID49IHRoaXMuREVGQVVMVF9FWFBBTkRfTEVWRUwgKSB7Ci0JCXJldHVybiB0aGlzLk5PREVfQ09MTEFQU0VEOwotCX0gZWxzZSB7Ci0JCXJldHVybiB0aGlzLk5PREVfRVhQQU5ERUQ7Ci0JfQotCi19OwotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuZ2V0VHJlZU5vZGVTcmMgPSBmdW5jdGlvbihsZXZlbCkKLXsKLQlpZiAoIHRoaXMuZ2V0RGVmYXVsdEV4cGFuZFN0YXRlKGxldmVsKSA9PSB0aGlzLk5PREVfQ09MTEFQU0VEICkgewotCQlyZXR1cm4gdGhpcy5leHBhbmRJbWFnZTsKLQl9Ci0JZWxzZSB7Ci0JCXJldHVybiB0aGlzLmNvbGxhcHNlSW1hZ2U7Ci0JfQotfTsKLQotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuZ2V0VFIgPSBmdW5jdGlvbihlbGVtZW50KQotewotCS8vIHRoZSBoZW1sIHN0cnVjdHVyZSBpcwotCS8vIDx0ciBpZD0iMiIgcGFyZW50SWQ9IjEiPgotCS8vIDx0ZCBjbGFzcz0idHJlZU5vZGUiPmNvbCAxLTE8L3RkPjx0ZD5jb2wgMi0yPC90ZD4KLQkvLyA8L3RyPgotCXZhciBlID0gZWxlbWVudDsKLQl3aGlsZSAoIGUgIT0gbnVsbCAmJiBlLnRhZ05hbWUgIT0gIlRSIiB8fCBlLmNsYXNzTmFtZSAhPSB0aGlzLnRyZWVfbm9kZV9jbGFzcykKLQl7CQotCQllID0gZS5wYXJlbnROb2RlOwotCQkvL2FsZXJ0KGUudGFnTmFtZSk7Ci0JfQotCQotCXJldHVybiBlOwotfTsKLQotCi0vLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHNlY3Rpb24gYmFzZWQgb24gdGhlIHJlY2VpdmVkIGV2ZW50LgotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmV4cGFuZENvbGxhcHNlVHJlZU5vZGUgPSBmdW5jdGlvbihldnRFbGVtZW50KSB7Ci0KLQkvL2FsZXJ0KGV2dEVsZW1lbnQudGFnTmFtZSk7Ci0KLQl2YXIgdHJFbGVtZW50ID0gdGhpcy5nZXRUUihldnRFbGVtZW50KTsKLQkKLQkvLyBtYWtlIHN1cmUgdGhlIGNoaWxkIHJvd3MgYXJlIGNyZWF0ZWQKLQl0aGlzLmNyZWF0ZUNoaWxkUm93cyh0ckVsZW1lbnQpOwotCQotCS8vIGlmIHRoZXJlIGlzIG5vIGNoaWxkLCByZW1vdmUgdGhlIHRyZWUgbm9kZSBpbWFnZQotCWlmICggIXRoaXMuX2hhc0NoaWxkcmVuKHRyRWxlbWVudCkgKQotCXsKLQkJZXZ0RWxlbWVudC5zcmMgPSB0aGlzLnNoaW1JbWFnZTsKLQkJZXZ0RWxlbWVudC5vbmNsaWNrID0gbnVsbDsKLQkJZXZ0RWxlbWVudC5zdHlsZS5jdXJzb3IgPSAiZGVmYXVsdCI7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JdmFyIGV4cGFuZGVkID0gdHJFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0VYUEFOREVEKTsKLQotCWlmIChleHBhbmRlZCA9PSB0aGlzLk5PREVfRVhQQU5ERUQpIHsKLQkJdGhpcy5oaWRlQ2hpbGRyZW4odHJFbGVtZW50KTsKLQkJZXZ0RWxlbWVudC5zcmMgPSB0aGlzLmV4cGFuZEltYWdlOwotCQlleHBhbmRlZCA9IHRoaXMuTk9ERV9DT0xMQVBTRUQ7Ci0JCWV2dEVsZW1lbnQuYWx0ID0gY29udGVudFBhZ2UucmVzLmV4cGFuZFRleHQ7Ci0JCWV2dEVsZW1lbnQudGl0bGUgPSBjb250ZW50UGFnZS5yZXMuZXhwYW5kVGV4dDsKLQl9Ci0JZWxzZSB7Ci0JCXRoaXMuc2hvd0hpZGVDaGlsZHJlbih0ckVsZW1lbnQsIHRydWUpOwotCQlldnRFbGVtZW50LnNyYyA9IHRoaXMuY29sbGFwc2VJbWFnZTsKLQkJZXhwYW5kZWQgPSB0aGlzLk5PREVfRVhQQU5ERUQ7Ci0JCWV2dEVsZW1lbnQuYWx0ID0gY29udGVudFBhZ2UucmVzLmNvbGxhcHNlVGV4dDsKLQkJZXZ0RWxlbWVudC50aXRsZSA9IGNvbnRlbnRQYWdlLnJlcy5jb2xsYXBzZVRleHQ7CQkKLQl9Ci0JCi0JdHJFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSX0VYUEFOREVELCBleHBhbmRlZCk7Ci0JCi0JLyoKLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgewotCQlldnQucHJldmVudERlZmF1bHQoKTsKLQl9Ci0JKi8KLQkKLQlyZXR1cm4gZmFsc2U7Ci19OwotCi0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5oaWRlQ2hpbGRyZW4gPSBmdW5jdGlvbihwYXJlbnQpCi17CQotCS8vIG1ha2Ugc3VyZSBpdCdzIHRoZSBUUiBlbGVtZW50Ci0JcGFyZW50ID0gdGhpcy5nZXRUUihwYXJlbnQpOwotCS8vdmFyIHBhcmVudElkID0gcGFyZW50LmlkOwotCXZhciBpbmRlbnRTaXplID0gcGFyc2VJbnQocGFyZW50LmdldEF0dHJpYnV0ZShBVFRSX0lOREVOVF9TSVpFKSk7Ci0JCi0JdmFyIG5leHRUUiA9IHBhcmVudDsKLQl3aGlsZSAoIChuZXh0VFI9dGhpcy5nZXROZXh0U2libGluZyhuZXh0VFIpKSAhPSBudWxsICYmIG5leHRUUi5nZXRBdHRyaWJ1dGUoQVRUUl9JTkRFTlRfU0laRSkgPiBpbmRlbnRTaXplICkKLQl7CQkKLQkJbmV4dFRSLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CQkKLQl9Ci0JCQotfTsKLQotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuc2hvd0hpZGVDaGlsZHJlbiA9IGZ1bmN0aW9uKHBhcmVudCwgc2hvdykKLXsJCQotCS8vIG1ha2Ugc3VyZSBpdCdzIHRoZSBUUiBlbGVtZW50Ci0JcGFyZW50ID0gdGhpcy5nZXRUUihwYXJlbnQpOwotCQotCS8vdmFyIGluZGVudFNpemUgPSBwYXJlbnQuaW5kZW50U2l6ZTsKLQl2YXIgbmV4dFRSID0gdGhpcy5nZXROZXh0U2libGluZyhwYXJlbnQpOwotCXdoaWxlICggbmV4dFRSICE9IG51bGwgJiYgbmV4dFRSLmdldEF0dHJpYnV0ZSgicGFyZW50SWQiKSA9PSBwYXJlbnQuaWQgKQotCXsKLQkJaWYgKCBzaG93ICYmICh0aGlzLmlzTm9kZVN1cHByZXNzZWQobmV4dFRSKSA9PSBmYWxzZSkgKQotCQl7Ci0JCQluZXh0VFIuc3R5bGUuZGlzcGxheSA9ICcnOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJCi0JCQluZXh0VFIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKLQkJfQotCQkKLQkJbmV4dFRSID0gdGhpcy5zaG93SGlkZUNoaWxkcmVuKG5leHRUUiwgKHNob3c9PXRydWUpJiYobmV4dFRSLmdldEF0dHJpYnV0ZShBVFRSX0VYUEFOREVEKT09dGhpcy5OT0RFX0VYUEFOREVEKSApOwotCX0KLQkKLQlyZXR1cm4gbmV4dFRSOwotCQotfTsKLQotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuX2hhc0NoaWxkcmVuID0gZnVuY3Rpb24ocGFyZW50KQotewotCi0JLy8gbWFrZSBzdXJlIGl0J3MgdGhlIFRSIGVsZW1lbnQKLQlwYXJlbnQgPSB0aGlzLmdldFRSKHBhcmVudCk7Ci0KLQl2YXIgbmV4dFRSID0gdGhpcy5nZXROZXh0U2libGluZyhwYXJlbnQpOwotCQotLy9hbGVydCgicGFyZW50LmlkPSIgKyBwYXJlbnQuaWQgKyAiLCBuZXh0VFIucGFyZW50SWQ9IiArIG5leHRUUi5nZXRBdHRyaWJ1dGUoInBhcmVudElkIikgKyAiLCBpc1N1cHByZXNzZWQ9IiArIGlzTm9kZVN1cHByZXNzZWQobmV4dFRSKSk7Ci0KLQlpZiAoIG5leHRUUiAhPSBudWxsICYmIG5leHRUUi5nZXRBdHRyaWJ1dGUoInBhcmVudElkIikgPT0gcGFyZW50LmlkKSAKLQl7Ci0JCWlmICh0aGlzLmlzTm9kZVN1cHByZXNzZWQobmV4dFRSKSA9PSBmYWxzZSkKLQkJewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQluZXh0VFIubmV4dFNpYmxpbmc7Ci0JCQl3aGlsZSAobmV4dFRSICE9IG51bGwpCi0JCQl7Ci0JCQkJaWYgKHRoaXMuaXNOb2RlU3VwcHJlc3NlZChuZXh0VFIpID09IGZhbHNlKQotCQkJCXsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCW5leHRUUiA9IG5leHRUUi5uZXh0U2libGluZzsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlyZXR1cm4gZmFsc2U7Ci19OwotCi0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5nZXROZXh0U2libGluZyA9IGZ1bmN0aW9uKGVsZW1lbnQpCi17Ci0KLQl2YXIgbmV4dEVsZW1lbnQgPSBlbGVtZW50Lm5leHRTaWJsaW5nOwotCXdoaWxlIChuZXh0RWxlbWVudCAhPSBudWxsICYmIG5leHRFbGVtZW50LnRhZ05hbWUgIT0gZWxlbWVudC50YWdOYW1lICkKLQl7Ci0JCW5leHRFbGVtZW50ID0gbmV4dEVsZW1lbnQubmV4dFNpYmxpbmc7Ci0JfQotCQotCXJldHVybiBuZXh0RWxlbWVudDsKLX07Ci0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5nZXRGaXJzdENoaWxkID0gZnVuY3Rpb24odHJFbGVtZW50LCB0YWdOYW1lLCBjbGFzc05hbWUpCi17Ci0JdmFyIGUgPSB0ckVsZW1lbnQuZmlyc3RDaGlsZDsKLQl3aGlsZSAoZSAhPSBudWxsKQotCXsKLQkJLy9hbGVydChlLnRhZ05hbWUpOwotCQlpZiAoICh0YWdOYW1lID09IG51bGwgfHwgZS50YWdOYW1lID09IHRhZ05hbWUpICYmIChjbGFzc05hbWUgPT0gbnVsbCB8fCBlLmNsYXNzTmFtZSA9PSBjbGFzc05hbWUpICkKLQkJewotCQkJcmV0dXJuIGU7Ci0JCX0KLQkJCi0JCWUgPSBlLm5leHRTaWJsaW5nOwotCX0KLQkKLQlyZXR1cm4gbnVsbDsKLQkJCi19OwotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuaXNOb2RlU3VwcHJlc3NlZCA9IGZ1bmN0aW9uKHRyRWxlbWVudCkKLXsKLQkvLyBpZiBpc1N1cHJlc3NlZCBhdHRyaWJ1dGUgaXMgZGVmaW5lZCwgYWx3YXlzIHVzZSBpdAotCS8vIG9ubHkgYnJvd3NpZ24gbW9kZWwgc2V0IHRoaXMgYXR0cmlidXRlCi0JLy8gaWYgbm90IGRlZmluZWQsIGl0J3MgaW4gcHVibGlzaGVkIHNpdGUsIGxvb2sgdXAgdGhlIGZsYWcgZnJvbSB0aGUgZ2VuZXJhdGVkIG1hcAotCXZhciBhdHRyX3N1cHByZXNzZWQgPSB0ckVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpc1N1cHJlc3NlZCIpOwotCXZhciByZWxQYXRoID0gdHJFbGVtZW50LmdldEF0dHJpYnV0ZSgicmVsUHJvY2Vzc1BhdGgiKTsKLQkKLQl2YXIgZmxhZyA9IHRoaXMuaXNTdXBwcmVzc2VkKGF0dHJfc3VwcHJlc3NlZCwgcmVsUGF0aCk7Ci0JCi0JaWYgKCBhdHRyX3N1cHByZXNzZWQgPT0gbnVsbCB8fCBhdHRyX3N1cHByZXNzZWQgPT0gIiIgfHwgYXR0cl9zdXBwcmVzc2VkID09IHVuZGVmaW5lZCApCi0JewkJCi0JCXRoaXMuc2V0Tm9kZVN1cHByZXNzZWQodHJFbGVtZW50LCBmbGFnKTsKLQl9Ci0JCi0JcmV0dXJuIGZsYWc7Ci19OwotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuaXNSb3dTdXBwcmVzc2VkID0gZnVuY3Rpb24ocm93KQotewotCWlmICggcm93ID09IG51bGwgKSByZXR1cm4gdHJ1ZTsKLQkKLQlyZXR1cm4gdGhpcy5pc1N1cHByZXNzZWQocm93LmlzU3VwcHJlc3NlZCwgcm93LnJlbFBhdGgpOwotCQotfTsKLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmlzU3VwcHJlc3NlZCA9IGZ1bmN0aW9uKGF0dHJfc3VwcHJlc3NlZCwgcmVsUGF0aCkKLXsJCi0JLy8gaWYgaXNTdXByZXNzZWQgYXR0cmlidXRlIGlzIGRlZmluZWQsIGFsd2F5cyB1c2UgaXQKLQkvLyBvbmx5IGJyb3dzaWduIG1vZGVsIHNldCB0aGlzIGF0dHJpYnV0ZQotCS8vIGlmIG5vdCBkZWZpbmVkLCBpdCdzIGluIHB1Ymxpc2hlZCBzaXRlLCBsb29rIHVwIHRoZSBmbGFnIGZyb20gdGhlIGdlbmVyYXRlZCBtYXAKLQkKLQkvL2FsZXJ0KGF0dHJfc3VwcHJlc3NlZCArICI9IiArIHJlbFBhdGgpOwotCXZhciBmbGFnID0gZmFsc2U7Ci0JCi0JaWYgKCBhdHRyX3N1cHByZXNzZWQgPT0gbnVsbCB8fCBhdHRyX3N1cHByZXNzZWQgPT0gIiIgfHwgYXR0cl9zdXBwcmVzc2VkID09ICJ1bmRlZmluZWQiICkKLQl7Ci0JCS8vIHRoaXMgbWV0aG9kIGlzIGRlZmluZWQgaW4gYWN0aXZpdHlsYXlvdXQuanMKLQkJaWYgKCByZWxQYXRoICE9IG51bGwgJiYgcmVsUGF0aCAhPSAiIiAmJiByZWxQYXRoICE9ICJ1bmRlZmluZWQiICkKLQkJewotCQkJZmxhZyA9IHRoaXMucGFyZW50LmlzU3VwcHJlc3NlZChjb250ZW50UGFnZS5wcm9jZXNzUGFnZS5wYXJfcHJvYywgY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UucGFyX3BhdGggKyByZWxQYXRoKTsKLQkJfQotCQkvL2FsZXJ0KCJ4MSwgZmxhZz0iICsgZmxhZyk7Ci0JfQotCWVsc2UKLQl7Ci0JCWZsYWcgPSAoYXR0cl9zdXBwcmVzc2VkID09ICJ0cnVlIik7Ci0JfQotCQotCS8vYWxlcnQoZmxhZyArICIgPSAiICsgYXR0cl9zdXBwcmVzc2VkICsgcmVsUGF0aCk7Ci0JcmV0dXJuIGZsYWc7Ci0KLX07Ci0KLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLnNldE5vZGVTdXBwcmVzc2VkID0gZnVuY3Rpb24odHJFbGVtZW50LCBmbGFnKQotewotCXRyRWxlbWVudC5zZXRBdHRyaWJ1dGUoImlzU3VwcmVzc2VkIiwgZmxhZyA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCQkKLX07Ci0KLQotCi0KLS8vIGRlZmluZSB0aGUgYnJlYWsgZG93biBzdHJ1Y3R1cmUgY29sdW1ucyBpZHMgaGVyZQotQlNfQ09MX0lOREVYID0gImlkIjsKLUJTX0NPTF9OQU1FID0gIm5hbWUiOwotQlNfQ09MX1BSRUZJWCA9ICJwcmVmaXgiOwotQlNfQ09MX1BSRURFQ0VTU09SUyA9ICJwcmVkZWNlc3NvcnMiOwotQlNfQ09MX0lTX1JFUEVBVEFCTEUgPSAiaXNfcmVwZWF0YWJsZSI7Ci1CU19DT0xfSVNfT05HT0lORyA9ICJpc19vbmdvaW5nIjsKLUJTX0NPTF9JU19FVkVOVF9EUklWRU4gPSAiaXNfZXZlbnRfZHJpdmVuIjsKLUJTX0NPTF9FTlRSWV9TVEFURSA9ICJlbnRyeV9zdGF0ZSI7Ci1CU19DT0xfRVhJVF9TVEFURSA9ICJleGl0X3N0YXRlIjsKLUJTX0NPTF9URUFNUyA9ICJ0ZWFtcyI7Ci1CU19DT0xfVFlQRSA9ICJ0eXBlIjsKLUJTX0NPTF9NT0RFTF9JTkZPID0gIm1vZGVsX2luZm8iOwotQlNfQ09MX1BSRVNFTlRBVElPTl9OQU1FID0gInByZXNlbnRhdGlvbl9uYW1lIjsgCi1CU19DT0xfU1RFUFMgPSAic3RlcHMiOwotQlNfQ09MX0RFTElWRVJBQkxFID0gImRlbGl2ZXJhYmxlIjsgCi1CU19DT0xfSVNfT1BUSU9OQUwgPSAiaXNfb3B0aW9uYWwiOyAKLUJTX0NPTF9JU19QTEFOTkVEID0gImlzX3BsYW5uZWQiOwotQlNfQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9ICJoYXNfbXVsdGlwbGVfb2NjdXJyZW5jZXMiOwotCi0vLyBpZCBwcmVmaXgKLUJTX0lEX1BSRUZJWCA9ICJCU19DT0xfIjsKLVNURVBfR1JPVVBfU0laRSA9IDU7Ci0KLWZ1bmN0aW9uIFdCU0l0ZW1IdG1sKC8qQWN0aXZpdHlUcmVlVGFibGUqL3BhcmVudCkKLXsKLXRoaXMucGFyZW50ID0gcGFyZW50OwotLy90aGlzLmltYWdlUGF0aCA9IGltZ1BhdGg7Ci0KLXRoaXMuZXh0ZW5kVmFyaWFiaWxpdHkgPSAiZXh0ZW5kIjsgLy8gISEhIGRvbid0IHRyYW5zbGF0ZSB0aGlzICEhIQotdGhpcy5sb2NhbENvbnRyaWJ1dGlvblZhcmlhYmlsaXR5ID0gImxvY2FsQ29udHJpYnV0aW9uIjsJLy8gISEhIGRvbid0IHRyYW5zbGF0ZSB0aGlzICEhIQotdGhpcy5sb2NhbFJlcGxhY2VtZW50VmFyaWFiaWxpdHkgPSAibG9jYWxSZXBsYWNlbWVudCI7CS8vICEhISBkb24ndCB0cmFuc2xhdGUgdGhpcyAhISEKLQotLy90aGlzLnNvdXJjZV9odG1sID0gbmV3IEFycmF5KCk7Ci0vL3RoaXMuY29sdW1ucyA9IFtdOwotdGhpcy5maWVsZHMgPSBbXTsKLXRoaXMuaW5kZW50U2l6ZSA9IDA7Ci10aGlzLmhhc0NoaWxkcmVuID0gZmFsc2U7Ci10aGlzLmlkID0gIiI7Ci10aGlzLnBhcmVudElkID0gIiI7Ci10aGlzLnJlbFBhdGggPSBudWxsOwotdGhpcy5pc1N1cHJlc3NlZCA9IGZhbHNlOwotdGhpcy51cmwgPSAiIjsKLQotCi19OwotCi0KLQotV0JTSXRlbUh0bWwucHJvdG90eXBlLmdldFRyZWVOb2RlVGFibGVIdG1sID0gZnVuY3Rpb24oaW5kZW50U2l6ZSwgaGFzQ2hpbGRyZW4sIHRpdGxlLCB1cmwsIHJlbFBhdGgpCi17Ci0KLS8vIHRlc3QKLS8vIHRoZSB1cmwgaXMgcGFzc2VkIGluIHRvIGEgc3RyaW5nIHRvIGNvbnN0cnVjdCBhIHN0cmluZyBsaXRlcmFsCi0vLyBuZWVkIHRvIGVzY2FwZSB0aGUgcXVvdGVzCi11cmwgPSB1cmwucmVwbGFjZSgvKFwnfFwiKS9nLCAiXFwkMSIpOwotCi11cmwgPSBjb250ZW50UGFnZS5wcm9jZXNzUGFnZS5nZXRBY3Rpdml0eUl0ZW1VcmwodXJsLCBjb250ZW50UGFnZS5wcm9jZXNzUGFnZS5wYXJfcHJvYywgY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UucGFyX3BhdGgsIHJlbFBhdGgpOwotCi12YXIgc3JjID0gWwotIjx0YWJsZSBiZ2NvbG9yPVwiIzAwMDAwMFwiIGNlbGxwYWRkaW5nPVwiMFwiIGNlbGxzcGFjaW5nPVwiMFwiIGJvcmRlcj1cIjBcIiBjbGFzcz1cImRlZmF1bHRUYWJsZVwiPjx0cj48dGQgbm93cmFwPVwibm93cmFwXCI+IiBdOwotc3JjID0gc3JjLmNvbmNhdCh0aGlzLmdldFRyZWVOb2RlSHRtbChpbmRlbnRTaXplLCBoYXNDaGlsZHJlbikpOyAKLXNyYyA9IHNyYy5jb25jYXQoWwotIjwvdGQ+PHRkIHdpZHRoPVwiMTAwJVwiIG5vd3JhcD1cIm5vd3JhcFwiPiIgLCAKLSI8YSBocmVmPVwiIiAsIHVybCAsICJcIj4iICwgdGl0bGUgLCAiPC9hPiIgLCAKLSI8L3RkPjwvdHI+PC90YWJsZT4iXSk7Ci0KLQlyZXR1cm4gc3JjOwotfTsKLQotCi1XQlNJdGVtSHRtbC5wcm90b3R5cGUuZ2V0VHJlZU5vZGVIdG1sID0gZnVuY3Rpb24oaW5kZW50U2l6ZSwgaGFzQ2hpbGRyZW4pCi17Ci0JdmFyIHdpZHRoID0gMTcqaW5kZW50U2l6ZTsKLQotCXZhciBzdHIgPSBbIjxkaXYgY2xhc3M9XCJ0cmVlTm9kZVwiPjxzcGFuPiJdOwotCXZhciBzbGVuID0gMTsKLQlpZiAoIGluZGVudFNpemUgPiAwICkKLQl7Ci0JCXN0cltzbGVuXSA9ICI8aW1nIGFsdD1cIlwiIHdpZHRoPVwiIiA7Ci0JCXN0cltzbGVuICsgMV0gPSB3aWR0aCA7Ci0JCXN0cltzbGVuICsgMl0gPSAiXCIgaGVpZ2h0PVwiMTVcIiBib3JkZXI9XCIwXCIgc3JjPVwiIiA7Ci0JCXN0cltzbGVuICsgM10gPSB0aGlzLnBhcmVudC5zaGltSW1hZ2UgOwotCQlzdHJbc2xlbiArIDRdID0gIlwiLz4iOwotCQlzbGVuICs9IDU7Ci0JfQotCi0KLQl2YXIgaW1nU3JjOwotCQotCWlmICggIWhhc0NoaWxkcmVuICkKLQl7Ci0JCXN0cltzbGVuXT0gIjxpbWcgYWx0PVwiXCIgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE1XCIgYm9yZGVyPVwiMFwiIGFsaWduPVwiYWJzbWlkZGxlXCIgc3JjPVwiIiA7Ci0JCXN0cltzbGVuICsgMV0gPSB0aGlzLnBhcmVudC5zaGltSW1hZ2UgOwotCQlzdHJbc2xlbiArIDJdID0gIlwiPiI7Ci0JCXNsZW4gKz0gMzsKLQotCX0KLQllbHNlIAotCXsKLQkJdmFyIGltYWdlU3JjID0gdGhpcy5wYXJlbnQuZ2V0VHJlZU5vZGVTcmMoaW5kZW50U2l6ZSk7Ci0JCXN0cltzbGVuXSA9ICI8aW1nIGFsdD1cIiIgOwotCQlzdHJbc2xlbiArIDFdID0gIGNvbnRlbnRQYWdlLnJlcy5leHBhbmRUZXh0IDsKLQkJc3RyW3NsZW4gKyAyXSA9ICAiXCIgdGl0bGU9XCIiIDsKLQkJc3RyW3NsZW4gKyAzXSA9ICBjb250ZW50UGFnZS5yZXMuZXhwYW5kVGV4dCA7Ci0JCXN0cltzbGVuICsgNF0gPSAgIlwiIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxNVwiIGJvcmRlcj1cIjBcIiBhbGlnbj1cImFic21pZGRsZVwiIHNyYz1cIiIgOwotCQlzdHJbc2xlbiArIDVdID0gIGltYWdlU3JjIDsKLQkJc3RyW3NsZW4gKyA2XSA9ICAiXCIiIDsKLQkJc3RyW3NsZW4gKyA3XSA9ICAiIHN0eWxlPVwiY3Vyc29yOmhhbmRcIiBvbmNsaWNrPVwiY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UudHJlZVRhYmxlLmV4cGFuZENvbGxhcHNlVHJlZU5vZGUodGhpcyk7cmV0dXJuIGZhbHNlO1wiIC8+IjsKLQkJc2xlbiArPSA4OwotCX0KLQkKLQkKLQlzdHJbc2xlbl0gPSAiPC9zcGFuPiYjMTYwOyYjMTYwOzwvZGl2PiI7Ci0KLQlyZXR1cm4gc3RyOwkKLX07Ci0KLQotV0JTSXRlbUh0bWwucHJvdG90eXBlLnBhcnNlUm93ID0gZnVuY3Rpb24ocm93KSB7Ci0JLyoKLQl2YXIgX2lkID0gcm93LmlkOwotCXZhciBfcGFyZW50SWQgPSByb3cucGFyZW50SWQ7Ci0JdmFyIF9yZWxQYXRoID0gcm93LnJlbFBhdGg7Ci0JdmFyIF9pc1N1cHJlc3NlZCA9IHJvdy5pc1N1cHByZXNzZWQ7Ci0JdmFyIF9pbmRlbnRTaXplID0gcm93LmluZGVudFNpemU7Ci0JdmFyIF9oYXNDaGlsZHJlbiA9IHJvdy5oYXNDaGlsZHJlbjsgCi0JdmFyIF9pbmRleCA9IHJvdy5pbmRleDsKLQl2YXIgX3ByZWZpeD0gcm93LnByZWZpeDsKLQluYW1lLCB0aXRsZSwgdXJsLCBzdGVwcywgcHJlZGVjZXNzb3JzLCBpbmZvLCB0eXBlLCAKLQlyZXBlYXRhYmxlLCBtdWx0aU9jY3VyZW5jZXMsIG9wdGlvbmFsLCBwbGFubmVkLCBvbmdvaW5nLCBldmVudERyaXZlbiwgCi0JdGVhbSwgZW50cnlTdGF0ZSwgZXhpdFN0YXRlLCBkZWxpdmVyYWJsZSwgdmFyaWFiaWxpdHlUeXBlOwotCSovCi0JCi0JdGhpcy5pbml0Um93KHJvdy5pZCwgcm93LnBhcmVudElkLCByb3cucmVsUGF0aCwgcm93LmlzU3VwcmVzc2VkLCByb3cuaW5kZW50U2l6ZSwgcm93Lmhhc0NoaWxkcmVuLCAKLQkJcm93LmluZGV4LCByb3cucHJlZml4LCByb3cubmFtZSwgcm93LnRpdGxlLCByb3cudXJsLCAiIiwgcm93LnByZWRlY2Vzc29ycywgcm93LmluZm8sIHJvdy50eXBlLCAKLQkJcm93LnJlcGVhdGFibGUsIHJvdy5tdWx0aU9jY3VyZW5jZXMsIHJvdy5vcHRpb25hbCwgcm93LnBsYW5uZWQsIHJvdy5vbmdvaW5nLCByb3cuZXZlbnREcml2ZW4sIAotCQlyb3cudGVhbSwgcm93LmVudHJ5U3RhdGUsIHJvdy5leGl0U3RhdGUsIHJvdy5kZWxpdmVyYWJsZSwgcm93LnZhcmlhYmlsaXR5VHlwZSk7Ci0JCi0JaWYgKCByb3cuc3RlcHMgIT0gbnVsbCApIHsKLQkJdmFyIGxlbiA9IHJvdy5zdGVwcy5sZW5ndGg7Ci0JCXZhciBicmsgPSBmYWxzZTsKLQkJZm9yICggdmFyIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7Ci0JCQlicmsgPSAoKGkrMSklU1RFUF9HUk9VUF9TSVpFID09IDAgKTsKLQkJCXRoaXMuYWRkU3RlcChyb3cuc3RlcHNbaV0sIGJyayk7Ci0JCX0KLQl9Ci19OwotCi1XQlNJdGVtSHRtbC5wcm90b3R5cGUubG9hZFJvdyA9IGZ1bmN0aW9uKC8qRE9NKi90cikKLXsKLQkvL3ZhciB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlRSIik7Ci0JdHIuaWQgPSB0aGlzLmlkOwotCXRyLmNsYXNzTmFtZSA9ICJ0cmVlTm9kZSI7Ci0JdHIuc2V0QXR0cmlidXRlKCJwYXJlbnRJZCIsIHRoaXMucGFyZW50SWQpOwotCXRyLnNldEF0dHJpYnV0ZSgicmVsUHJvY2Vzc1BhdGgiLCB0aGlzLnJlbFBhdGgpOwotCi0JLy8gaXMgc3VwcHJlc3NlZCBmbGFnIGlzIHNldCBvbmx5IHdoZW4gaW4gYnJvd3NpbmcgbW9kZWwsIGl0J3Mgbm90IHNldCBpbiBwdWJsaXNoaW5nIG1vZGVsCi0JaWYgKCB0aGlzLmlzU3VwcmVzc2VkICE9IG51bGwgJiYgdGhpcy5pc1N1cHJlc3NlZCAhPSAiIiAmJiB0aGlzLmlzU3VwcmVzc2VkICE9IHVuZGVmaW5lZCkgewotCQl0ci5zZXRBdHRyaWJ1dGUoImlzU3VwcmVzc2VkIiwgdGhpcy5pc1N1cHJlc3NlZCk7Ci0JfQotCQotCS8vIGdldCB0aGUgY2VsbCBzb3VyY2UKLQl2YXIgc3JjID0gW107Ci0JdmFyIGxlbiA9IHRoaXMucGFyZW50LmRhdGEuY29sdW1ucy5sZW5ndGg7Ci0JZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKLQkJdmFyIHRkID0gdHIuaW5zZXJ0Q2VsbCh0ci5jZWxscy5sZW5ndGgpOwotCQl0aGlzLmxvYWRDZWxsKHRkLCBpKTsKLQkJLy90ci5hcHBlbmRDaGlsZCh0ZCk7Ci0JCQotCX0KLQkKLQlyZXR1cm4gdHI7CQkJCQotfTsKLQotCi0KLVdCU0l0ZW1IdG1sLnByb3RvdHlwZS5pbml0Um93ID0gZnVuY3Rpb24oaWQsIHBhcmVudElkLCByZWxQYXRoLCBpc1N1cHJlc3NlZCwgaW5kZW50U2l6ZSwgaGFzQ2hpbGRyZW4sIAotCWluZGV4LCBwcmVmaXgsIG5hbWUsIHRpdGxlLCB1cmwsIHN0ZXBzLCBwcmVkZWNlc3NvcnMsIGluZm8sIHR5cGUsIAotCXJlcGVhdGFibGUsIG11bHRpT2NjdXJlbmNlcywgb3B0aW9uYWwsIHBsYW5uZWQsIG9uZ29pbmcsIGV2ZW50RHJpdmVuLCAKLQl0ZWFtLCBlbnRyeVN0YXRlLCBleGl0U3RhdGUsIGRlbGl2ZXJhYmxlLCB2YXJpYWJpbGl0eVR5cGUpCi17Ci0JdGhpcy5pbmRlbnRTaXplID0gaW5kZW50U2l6ZTsKLQl0aGlzLmhhc0NoaWxkcmVuID0gaGFzQ2hpbGRyZW47Ci0JdGhpcy5pZCA9IGlkOwotCXRoaXMucGFyZW50SWQgPSBwYXJlbnRJZDsKLQl0aGlzLnJlbFBhdGggPSByZWxQYXRoOwotCXRoaXMuaXNTdXByZXNzZWQgPSBpc1N1cHJlc3NlZDsKLQkKLQl0aGlzLmZpZWxkc1tCU19DT0xfSU5ERVhdID0gaW5kZXg7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX1BSRUZJWF0gPSBwcmVmaXg7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX05BTUVdID0gbmFtZTsKLQl0aGlzLmZpZWxkc1tCU19DT0xfUFJFU0VOVEFUSU9OX05BTUVdID0gdGl0bGU7Ci0JdGhpcy51cmwgPSB1cmw7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX1NURVBTXSA9IHN0ZXBzOwotCXRoaXMuZmllbGRzW0JTX0NPTF9QUkVERUNFU1NPUlNdID0gcHJlZGVjZXNzb3JzOwotCWlmICh2YXJpYWJpbGl0eVR5cGUuaW5kZXhPZih0aGlzLmV4dGVuZFZhcmlhYmlsaXR5KSAhPSAtMSB8fCAKLQkJdmFyaWFiaWxpdHlUeXBlLmluZGV4T2YodGhpcy5sb2NhbENvbnRyaWJ1dGlvblZhcmlhYmlsaXR5KSAhPSAtMSB8fCAKLQkJdmFyaWFiaWxpdHlUeXBlLmluZGV4T2YodGhpcy5sb2NhbFJlcGxhY2VtZW50VmFyaWFiaWxpdHkpICE9IC0xICkKLQl7Ci0JCXRoaXMuZmllbGRzW0JTX0NPTF9NT0RFTF9JTkZPXSA9ICIiOwotCX0KLQllbHNlCi0JewotCQl0aGlzLmZpZWxkc1tCU19DT0xfTU9ERUxfSU5GT10gPSBpbmZvOwotCX0JCi0JdGhpcy5maWVsZHNbQlNfQ09MX1RZUEVdID0gdHlwZTsKLQotCXRoaXMuZmllbGRzW0JTX0NPTF9URUFNU10gPSB0ZWFtOwotCi0JdGhpcy5maWVsZHNbQlNfQ09MX0VOVFJZX1NUQVRFXSA9IGVudHJ5U3RhdGU7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX0VYSVRfU1RBVEVdID0gZXhpdFN0YXRlOwotCXRoaXMuZmllbGRzW0JTX0NPTF9ERUxJVkVSQUJMRV0gPSBkZWxpdmVyYWJsZTsKLQkKLQl0aGlzLnNldFN0YXRlcyhyZXBlYXRhYmxlLCBtdWx0aU9jY3VyZW5jZXMsIG9wdGlvbmFsLCBwbGFubmVkLCBvbmdvaW5nLCBldmVudERyaXZlbik7Ci0JCi0JCi19OwotCi1XQlNJdGVtSHRtbC5wcm90b3R5cGUuYWRkU3RlcCA9IGZ1bmN0aW9uKHNlbGVjdGVkLCBsaW5lQnJlYWspCi17Ci0JdmFyIGltZ19zcmM7Ci0JaWYgKCBzZWxlY3RlZCApIHsKLQkJaW1nX3NyYyA9IHRoaXMucGFyZW50LmltYWdlUGF0aCArICJjaXJjbGVfY2xvc2UuZ2lmIjsKLQl9IGVsc2UgewotCQlpbWdfc3JjID0gdGhpcy5wYXJlbnQuaW1hZ2VQYXRoICsgImNpcmNsZV9vcGVuLmdpZiI7CQotCX0KLQkKLQl2YXIgc3RlcHMgPSB0aGlzLmZpZWxkc1tCU19DT0xfU1RFUFNdOwotCXN0ZXBzICs9ICI8aW1nIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCI5XCIgYWx0PVwiXCIgc3JjPVwiIiArIGltZ19zcmMgKyAiXCIgLz4iOwotCWlmIChsaW5lQnJlYWspCi0JewotCQlzdGVwcyArPSAiPGJyLz4iOwotCX0KLQkKLQl0aGlzLmZpZWxkc1tCU19DT0xfU1RFUFNdID0gc3RlcHM7Ci19OwotCi0KLVdCU0l0ZW1IdG1sLnByb3RvdHlwZS5zZXRTdGF0ZXMgPSBmdW5jdGlvbihyZXBlYXRhYmxlLCBtdWx0aU9jY3VyZW5jZXMsIG9wdGlvbmFsLCBwbGFubmVkLCBvbmdvaW5nLCBldmVudERyaXZlbikKLXsKLQlpZiAoIHJlcGVhdGFibGUgPT0gInRydWUiKSB7Ci0JCXJlcGVhdGFibGUgPSAiPGltZyBhbHQ9XCIiICsgY29udGVudFBhZ2UucmVzLmNoZWNrZWRBbHRUZXh0ICsgIlwiIGhlaWdodD1cIjE1XCIgd2lkdGg9XCIyMFwiIHNyYz1cIiIgKyB0aGlzLnBhcmVudC5pbWFnZVBhdGggKyAidHJ1ZS5naWZcIj4iOwotCX0gZWxzZSB7Ci0JCXJlcGVhdGFibGUgPSAiJm5ic3A7IjsKLQl9Ci0JCi0JaWYgKCBtdWx0aU9jY3VyZW5jZXMgPT0gInRydWUiKSB7Ci0JCW11bHRpT2NjdXJlbmNlcyA9ICI8aW1nIGFsdD1cIiIgKyBjb250ZW50UGFnZS5yZXMuY2hlY2tlZEFsdFRleHQgKyAiXCIgdGl0bGU9XCIiICsgY29udGVudFBhZ2UucmVzLmNoZWNrZWRBbHRUZXh0ICsgIlwiIGhlaWdodD1cIjE1XCIgd2lkdGg9XCIyMFwiIHNyYz1cIiIgKyB0aGlzLnBhcmVudC5pbWFnZVBhdGggKyAidHJ1ZS5naWZcIj4iOwotCX0gZWxzZSB7Ci0JCW11bHRpT2NjdXJlbmNlcyA9ICImbmJzcDsiOwotCX0KLQkKLQlpZiAoIG9wdGlvbmFsID09ICJ0cnVlIikgewotCQlvcHRpb25hbCA9ICI8aW1nIGFsdD1cIiIgKyBjb250ZW50UGFnZS5yZXMuY2hlY2tlZEFsdFRleHQgKyAiXCIgdGl0bGU9XCIiICsgY29udGVudFBhZ2UucmVzLmNoZWNrZWRBbHRUZXh0ICsgIlwiIGhlaWdodD1cIjE1XCIgd2lkdGg9XCIyMFwiIHNyYz1cIiIgKyB0aGlzLnBhcmVudC5pbWFnZVBhdGggKyAidHJ1ZS5naWZcIj4iOwotCX0gZWxzZSB7Ci0JCW9wdGlvbmFsID0gIiZuYnNwOyI7Ci0JfQotCi0JaWYgKCBwbGFubmVkID09InRydWUiKSB7Ci0JCXBsYW5uZWQgPSAiPGltZyBhbHQ9XCIiICsgY29udGVudFBhZ2UucmVzLmNoZWNrZWRBbHRUZXh0ICsgIlwiIHRpdGxlPVwiIiArIGNvbnRlbnRQYWdlLnJlcy5jaGVja2VkQWx0VGV4dCArICJcIiBoZWlnaHQ9XCIxNVwiIHdpZHRoPVwiMjBcIiBzcmM9XCIiICsgdGhpcy5wYXJlbnQuaW1hZ2VQYXRoICsgInRydWUuZ2lmXCI+IjsKLQl9IGVsc2UgewotCQlwbGFubmVkID0gIiZuYnNwOyI7Ci0JfQotCi0JaWYgKCBvbmdvaW5nID09InRydWUiKSB7Ci0JCW9uZ29pbmcgPSAiPGltZyBhbHQ9XCIiICsgY29udGVudFBhZ2UucmVzLmNoZWNrZWRBbHRUZXh0ICsgIlwiIHRpdGxlPVwiIiArIGNvbnRlbnRQYWdlLnJlcy5jaGVja2VkQWx0VGV4dCArICJcIiBoZWlnaHQ9XCIxNVwiIHdpZHRoPVwiMjBcIiBzcmM9XCIiICsgdGhpcy5wYXJlbnQuaW1hZ2VQYXRoICsgInRydWUuZ2lmXCI+IjsKLQl9IGVsc2UgewotCQlvbmdvaW5nID0gIiZuYnNwOyI7Ci0JfQotCQotCWlmICggZXZlbnREcml2ZW4gPT0idHJ1ZSIpIHsKLQkJZXZlbnREcml2ZW4gPSAiPGltZyBhbHQ9XCIiICsgY29udGVudFBhZ2UucmVzLmNoZWNrZWRBbHRUZXh0ICsgIlwiIHRpdGxlPVwiIiArIGNvbnRlbnRQYWdlLnJlcy5jaGVja2VkQWx0VGV4dCArICJcIiBoZWlnaHQ9XCIxNVwiIHdpZHRoPVwiMjBcIiBzcmM9XCIiICsgdGhpcy5wYXJlbnQuaW1hZ2VQYXRoICsgInRydWUuZ2lmXCI+IjsKLQl9IGVsc2UgewotCQlldmVudERyaXZlbiA9ICImbmJzcDsiOwotCX0KLQkKLQkKLQl0aGlzLmZpZWxkc1tCU19DT0xfSVNfUkVQRUFUQUJMRV0gPSByZXBlYXRhYmxlOwotCXRoaXMuZmllbGRzW0JTX0NPTF9IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVNdID0gbXVsdGlPY2N1cmVuY2VzOwotCXRoaXMuZmllbGRzW0JTX0NPTF9JU19PUFRJT05BTF0gPSBvcHRpb25hbDsKLQl0aGlzLmZpZWxkc1tCU19DT0xfSVNfUExBTk5FRF0gPSBwbGFubmVkOwotCXRoaXMuZmllbGRzW0JTX0NPTF9JU19PTkdPSU5HXSA9IG9uZ29pbmc7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX0lTX0VWRU5UX0RSSVZFTl0gPSBldmVudERyaXZlbjsKLQotfTsKLQotCi0KLVdCU0l0ZW1IdG1sLnByb3RvdHlwZS5sb2FkQ2VsbCA9IGZ1bmN0aW9uKC8qRE9NKi90ZEVsLCBjb2x1bW5Db3VudCkgewotCi0JdmFyIGNvbCA9IHRoaXMucGFyZW50LmRhdGEuY29sdW1uc1tjb2x1bW5Db3VudF07Ci0JdmFyIGNvbF9pZCA9IGNvbFswXTsKLQl2YXIgdGV4dCA9IHRoaXMuZmllbGRzW2NvbF9pZF07Ci0JaWYgKCB0ZXh0ID09ICIiICkgewotCQl0ZXh0ID0gIiZuYnNwOyI7Ci0JfQotCQotCXZhciBpZCA9IEJTX0lEX1BSRUZJWCArIGNvbF9pZDsKLQkKLQkvL3ZhciB0ZEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEQiKTsJCi0JdGRFbC5pZCA9IGlkOwotCXRkRWwuaGVhZGVycyA9ICIiOwotCQotCXZhciBzdHIgPSAiIjsKLQl2YXIgc2xlbiA9IDM7Ci0JaWYgKCBjb2x1bW5Db3VudCAlIDIgIT0gMCApIHsKLQkJdGRFbC5zdHlsZS5iYWNrZ3JvdW5kID0gIiNjY2NjY2MiOwotCX0KLQkKLQlpZiAoIGNvbF9pZC5pbmRleE9mKCJpc18iKSA+PTAgfHwgY29sX2lkLmluZGV4T2YoImhhc18iKSA+PTAgKSB7CQotCQl0ZEVsLmFsaWduID0gImNlbnRlciI7Ci0JfQotCQotCWlmICggY29sX2lkID09IEJTX0NPTF9UWVBFIHx8IGNvbF9pZCA9PSBCU19DT0xfU1RFUFMgKSB7Ci0JCS8vdGRFbC5ub3dyYXAgPSB0cnVlOwotCQl0ZXh0ID0gIjxzcGFuIHN0eWxlPSd3aGl0ZS1zcGFjZTpub3dyYXA7Jz4iICsgdGV4dCArICI8L3NwYW4+IjsKLQl9Ci0JCi0JaWYgKCBjb2xfaWQgPT0gQlNfQ09MX1BSRVNFTlRBVElPTl9OQU1FICkgewotCQl0ZEVsLndpZHRoPSIxMDAlIjsKLQkJdGV4dCA9IHRoaXMuZ2V0VHJlZU5vZGVUYWJsZUh0bWwoCi0JCQl0aGlzLmluZGVudFNpemUsIHRoaXMuaGFzQ2hpbGRyZW4sIAotCQkJdGV4dCwgdGhpcy51cmwsIHRoaXMucmVsUGF0aCkuam9pbigiIik7Ci0JCQotCX0gCi0JCi0KLQl0ZEVsLmlubmVySFRNTCA9IHRleHQ7Ci0JcmV0dXJuIHRkRWw7Ci0KLX07Ci0KLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFkMGFlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qIHJlc291cmNlIGZpbGVzIGZvciBjb250ZW50IHBhZ2UgamF2YXNjcmlwdCAKLSAqIHRoaXMgZmlsZSBzaG91bGQgYmUgbG9jYWxpemVkCi0qLwotQ29udGVudFBhZ2VSZXNvdXJjZSA9IGZ1bmN0aW9uKCkgewotCi0KLXRoaXMuZXhwYW5kQWxsVGV4dCA9ICJFeHBhbmQgQWxsIFNlY3Rpb25zIjsKLXRoaXMuY29sbGFwc2VBbGxUZXh0ID0gIkNvbGxhcHNlIEFsbCBTZWN0aW9ucyI7Ci10aGlzLmJhY2tUb1RvcFRleHQgPSAiQmFjayB0byB0b3AiOwotCi10aGlzLmV4cGFuZEFsbFN1YlNlY3Rpb25zVGV4dCA9ICJFeHBhbmQgQWxsIFN0ZXBzIjsKLXRoaXMuY29sbGFwc2VBbGxTdWJTZWN0aW9uc1RleHQgPSAiQ29sbGFwc2UgQWxsIFN0ZXBzIjsKLQotdGhpcy50b29sYmFyX2Jvb2ttYXJrID0gIkJvb2ttYXJrIHRoaXMgcGFnZSI7Ci10aGlzLnRvb2xiYXJfYmFjayA9ICJCYWNrIjsKLXRoaXMudG9vbGJhcl9mb3J3YXJkID0gIkZvcndhcmQiOwotdGhpcy50b29sYmFyX2V4cGFuZF9hbGwgPSAiRXhwYW5kIGFsbCI7Ci10aGlzLnRvb2xiYXJfY29sbGFwc2VfYWxsID0gIkNvbGxhcHNlIGFsbCI7Ci10aGlzLnRvb2xiYXJfcHJpbnQgPSAiUHJpbnQiOwotCi10aGlzLmV4cGFuZFRleHQgPSAiRXhwYW5kIgotdGhpcy5jb2xsYXBzZVRleHQgPSAiQ29sbGFwc2UiCi10aGlzLmNoZWNrZWRBbHRUZXh0ID0gIlllcyIJCi0KLX07CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NTU5MTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db250ZW50UGFnZVNlY3Rpb24gPSBmdW5jdGlvbigpewotCi10aGlzLmNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQgPSBmYWxzZTsKLXRoaXMuZmlyc3RTZWN0aW9uID0gbnVsbDsKLXRoaXMuZXhwYW5kSW1hZ2UgPSBudWxsOwotdGhpcy5jb2xsYXBzZUltYWdlID0gbnVsbDsKLXRoaXMuZXhwYW5kQWxsSW1hZ2UgPSBudWxsOwotdGhpcy5jb2xsYXBzZUFsbEltYWdlID0gbnVsbDsKLXRoaXMuYmFja1RvVG9wSW1hZ2UgPSBudWxsOwotdGhpcy5zaGltSW1hZ2UgPSBudWxsOwotdGhpcy5zZWN0aW9uQ29sbGFwc2VEaXZzID0gbnVsbDsKLXRoaXMuc2VjdGlvbkNvbGxhcHNlTGlua3MgPSBudWxsOwotCi0vLyB0ZXN0IG1lc3NhZ2UsIAotdGhpcy5iYWNrVG9Ub3BUZXh0ID0gbnVsbDsKLXRoaXMuZXhwYW5kQWxsVGV4dCA9IG51bGw7Ci10aGlzLmNvbGxhcHNlQWxsVGV4dCA9IG51bGw7Ci19OwotCi1Db250ZW50UGFnZVNlY3Rpb24ucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihpbWdQYXRoKSB7Ci0KLQl0aGlzLmJhY2tUb1RvcFRleHQgPSBjb250ZW50UGFnZS5yZXMuYmFja1RvVG9wVGV4dDsKLQl0aGlzLmV4cGFuZEFsbFRleHQgPSBjb250ZW50UGFnZS5yZXMuZXhwYW5kQWxsVGV4dDsKLQl0aGlzLmNvbGxhcHNlQWxsVGV4dCA9IGNvbnRlbnRQYWdlLnJlcy5jb2xsYXBzZUFsbFRleHQ7Ci0KLQl0aGlzLmV4cGFuZEltYWdlID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoICsgJ2V4cGFuZC5naWYnKTsJCQotCXRoaXMuY29sbGFwc2VJbWFnZSA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nUGF0aCArICdjb2xsYXBzZS5naWYnKTsKLQl0aGlzLmV4cGFuZEFsbEltYWdlID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoICsgJ2V4cGFuZF9hbGwuZ2lmJyk7CQotCXRoaXMuY29sbGFwc2VBbGxJbWFnZSA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nUGF0aCArICdjb2xsYXBzZV9hbGwuZ2lmJyk7Ci0JdGhpcy5iYWNrVG9Ub3BJbWFnZSA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nUGF0aCArICdiYWNrX3RvX3RvcC5naWYnKTsKLQl0aGlzLnNoaW1JbWFnZSA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nUGF0aCArICdzaGltLmdpZicpOwotfTsKLQotLy8gQ3JlYXRlcyB0aGUgY29sbGFwc2libGUgc2VjdGlvbiBsaW5rcy4KLUNvbnRlbnRQYWdlU2VjdGlvbi5wcm90b3R5cGUuY3JlYXRlU2VjdGlvbkxpbmtzID0gZnVuY3Rpb24odGFnTmFtZSwgY2xhc3NTZWxlY3RvcikgewotCi0JaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7Ci0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOwotCQl2YXIgc2VjdGlvbkVsZW1lbnRzID0gbmV3IEFycmF5KGVsZW1lbnRzLmxlbmd0aCk7Ci0JCXZhciB0b3RhbExpbmtzID0gMDsKLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCQotCQkJLy8gc2F2ZSB0aGUgZWxlbWVudCBmb3IgYXV0byB3cmFwCi0JCQlpZiAoIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJhdXRvV3JhcCIpID09ICJ0cnVlIiApIHsKLQkJCQljb250ZW50UGFnZS5hZGRBdXRvV3JhcEVsZW1lbnQoZWxlbWVudCk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7Ci0JCQkJc2VjdGlvbkVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50OwkJCQkKLQkJCX0KLQkJfQotCQlzZWN0aW9uRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsKLQkJdGhpcy5zZWN0aW9uQ29sbGFwc2VEaXZzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOwotCQl0aGlzLnNlY3Rpb25Db2xsYXBzZUxpbmtzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOwotCQl0aGlzLmZpcnN0U2VjdGlvbiA9IHNlY3Rpb25FbGVtZW50c1swXTsKLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXZhciBlbGVtZW50ID0gc2VjdGlvbkVsZW1lbnRzW2ldOwotCQkJdmFyIHNpYmxpbmdDb250YWluZXI7Ci0JCQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoc2libGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSAmJiBzaWJsaW5nQ29udGFpbmVyLnN0eWxlKSB7CQotCQkJCXZhciBuZXh0U2libGluZyA9IGVsZW1lbnQubmV4dFNpYmxpbmc7Ci0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7Ci0JCQkJdmFyIG5leHRFbGVtZW50ID0gc2VjdGlvbkVsZW1lbnRzW2kgKyAxXTsKLQkJCQl3aGlsZSAobmV4dFNpYmxpbmcgIT0gbmV4dEVsZW1lbnQgJiYgbmV4dFNpYmxpbmcgIT0gbnVsbCAmJiBuZXh0U2libGluZy5jbGFzc05hbWUgIT0gJ2NvcHlyaWdodCcpIHsKLQkJCQkJdmFyIHRvTW92ZSA9IG5leHRTaWJsaW5nOwotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOwotCQkJCQlzaWJsaW5nQ29udGFpbmVyLmFwcGVuZENoaWxkKHRvTW92ZSk7Ci0JCQkJfQotCQkJCWlmICh0aGlzLmNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQpIHsKLSAgICAJCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwotICAgIAkJCX0KLSAgICAJCQl0aGlzLnNlY3Rpb25Db2xsYXBzZURpdnNbaV0gPSBzaWJsaW5nQ29udGFpbmVyOwotICAgIAkJCXRoaXMuY3JlYXRlQ29sbGFwc2libGVTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQl0aGlzLmNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU2VjdGlvbnNMaW5rcyhzZWN0aW9uRWxlbWVudHNbMF0pOwotCX0KLX07Ci0KLS8vIENyZWF0ZXMgYSBjb2xsYXBzaWJsZSBzZWN0aW9uLgotQ29udGVudFBhZ2VTZWN0aW9uLnByb3RvdHlwZS5jcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24gPSBmdW5jdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpbmRleCkgewotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7Ci0JCS8vIEFkZCBhIHNwYWNpbmcgYmV0d2VlbiB0aGUgc2VjdGlvbnMuCi0JCXZhciBzZWN0aW9uU2VwYXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7Ci0JCXNlY3Rpb25TZXBhcmF0b3Iuc3JjID0gdGhpcy5zaGltSW1hZ2U7Ci0JCXNlY3Rpb25TZXBhcmF0b3IuYWx0ID0gJyc7Ci0JCXNlY3Rpb25TZXBhcmF0b3IudGl0bGUgPSAnJzsKLQkJc2VjdGlvblNlcGFyYXRvci5oZWlnaHQgPSAnMyc7Ci0JCXNlY3Rpb25TZXBhcmF0b3IuYm9yZGVyID0gJzAnOwotCQlzZWN0aW9uU2VwYXJhdG9yLmFsaWduID0gJ2Fic21pZGRsZSc7Ci0JCWVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2VjdGlvblNlcGFyYXRvciwgZWxlbWVudCk7Ci0JCQotCQkvLyBBZGQgYSBleHBhbmQvY29sbGFwc2UgbGluayB0byB0aGUgc2VjdGlvbiBoZWFkaW5nLgotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7Ci0JCWxpbmsuY29sbGFwc2VEaXYgPSBzaWJsaW5nQ29udGFpbmVyOwotCQlsaW5rLmhyZWYgPSAnJzsKLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7Ci0JCWlmICh0aGlzLmNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQpIHsKLQkJCWltYWdlLnNyYyA9IHRoaXMuZXhwYW5kSW1hZ2U7Ci0JCQlpbWFnZS5hbHQgPSBjb250ZW50UGFnZS5yZXMuZXhwYW5kVGV4dDsKLQkJCWltYWdlLnRpdGxlID0gY29udGVudFBhZ2UucmVzLmV4cGFuZFRleHQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbWFnZS5zcmMgPSB0aGlzLmNvbGxhcHNlSW1hZ2U7Ci0JCQlpbWFnZS5hbHQgPSBjb250ZW50UGFnZS5yZXMuY29sbGFwc2VUZXh0OwotCQkJaW1hZ2UudGl0bGUgPSBjb250ZW50UGFnZS5yZXMuY29sbGFwc2VUZXh0OwkJCQotCQl9Ci0JCQkJCi0JCWltYWdlLndpZHRoID0gJzE3JzsKLQkJaW1hZ2UuaGVpZ2h0ID0gJzE1JzsKLQkJaW1hZ2UuYm9yZGVyID0gJzAnOwotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOwotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsKLQkJdmFyIHNlbGYgPSB0aGlzOwotCQlsaW5rLm9uY2xpY2sgPSBmdW5jdGlvbihldnQpIHsKLQkJCS8vIGhlcmUgInRoaXMiIGlzIHRoZSB0YXJoZXQgZWxlbWVudCwgaS5lLiB0aGUgSU1HCi0JCQkvLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHNlY3Rpb24gYmFzZWQgb24gdGhlIHJlY2VpdmVkIGV2ZW50LgotCQkJaWYgKHRoaXMuY29sbGFwc2VEaXYuc3R5bGUuZGlzcGxheSA9PSAnJykgewotCQkJCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0JCQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IHNlbGYuZXhwYW5kSW1hZ2U7Ci0JCQkJdGhpcy5maXJzdENoaWxkLmFsdCA9IGNvbnRlbnRQYWdlLnJlcy5leHBhbmRUZXh0OwotCQkJCXRoaXMuZmlyc3RDaGlsZC50aXRsZSA9IGNvbnRlbnRQYWdlLnJlcy5leHBhbmRUZXh0OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICcnOwotCQkJCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBzZWxmLmNvbGxhcHNlSW1hZ2U7Ci0JCQkJdGhpcy5maXJzdENoaWxkLmFsdCA9IGNvbnRlbnRQYWdlLnJlcy5jb2xsYXBzZVRleHQ7Ci0JCQkJdGhpcy5maXJzdENoaWxkLnRpdGxlID0gY29udGVudFBhZ2UucmVzLmNvbGxhcHNlVGV4dDsJCQkJCi0JCQl9Ci0JCQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgewotCQkJCWV2dC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9OwotCi0JCXRoaXMuc2VjdGlvbkNvbGxhcHNlTGlua3NbaW5kZXhdID0gbGluazsKLQkJc3Bhbi5hcHBlbmRDaGlsZChsaW5rKTsKLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsKLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsKLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsKLSAgICAJCi0JCS8vIEFkZCBhIEJhY2sgVG8gVG9wIGxpbmsgaW4gdGhlIHNlY3Rpb24gaGVhZGluZy4KLQkJdGhpcy5jcmVhdGVCYWNrVG9Ub3BMaW5rKHNpYmxpbmdDb250YWluZXIpOwotCX0KLX07Ci0KLS8vIENyZWF0ZXMgYSBCYWNrIHRvIHRvcCBsaW5rLgotQ29udGVudFBhZ2VTZWN0aW9uLnByb3RvdHlwZS5jcmVhdGVCYWNrVG9Ub3BMaW5rID0gZnVuY3Rpb24oZWxlbWVudCkgewotCXZhciBkaXY7Ci0JCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgewotCQlkaXYuY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOwotCQlkaXYuYWxpZ24gPSAncmlnaHQnOwotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKLQkJaW1hZ2UuYWx0ID0gdGhpcy5iYWNrVG9Ub3BUZXh0OwotCQlpbWFnZS50aXRsZSA9IHRoaXMuYmFja1RvVG9wVGV4dDsKLQkJaW1hZ2Uuc3JjID0gdGhpcy5iYWNrVG9Ub3BJbWFnZTsKLQkJaW1hZ2Uud2lkdGggPSAnMTYnOwotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOwotCQlpbWFnZS5ib3JkZXIgPSAnMCc7Ci0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7CQkKLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7Ci0JCWxpbmsuY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOwotCQlsaW5rLmhyZWYgPSAnIyc7Ci0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOwotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKLQkJc3Bhbi5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7Ci0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5iYWNrVG9Ub3BUZXh0KSk7CQkKLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsKLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOwotCQllbGVtZW50LmFwcGVuZENoaWxkKGRpdik7Ci0JfQotfTsKLQotCi0vLyBDcmVhdGVzIHRoZSBFeHBhbmQgQWxsIGFuZCBDb2xsYXBzZSBBbGwgU2VjdGlvbnMgbGlua3MuCi1Db250ZW50UGFnZVNlY3Rpb24ucHJvdG90eXBlLmNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU2VjdGlvbnNMaW5rcyA9IGZ1bmN0aW9uKGZpcnN0RWxlbWVudCkgewotCi0JdmFyIGRpdjsKLQl2YXIgc2VsZiA9IHRoaXM7Ci0JCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgewotCQlkaXYuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7Ci0JCWRpdi5hbGlnbiA9ICdyaWdodCc7Ci0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwotCQlpbWFnZS5zcmMgPSB0aGlzLmV4cGFuZEFsbEltYWdlOwotCQlpbWFnZS5hbHQgPSB0aGlzLmV4cGFuZEFsbFRleHQ7Ci0JCWltYWdlLnRpdGxlID0gdGhpcy5leHBhbmRBbGxUZXh0OwotCQlpbWFnZS53aWR0aCA9ICcxNic7Ci0JCWltYWdlLmhlaWdodCA9ICcxNic7Ci0JCWltYWdlLmJvcmRlciA9ICcwJzsKLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQotCQl2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsKLQkJbGluay5ocmVmID0gJyc7Ci0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOwotCQlsaW5rLm9uY2xpY2sgPSAvKnRoaXMuZXhwYW5kQWxsOyovIGZ1bmN0aW9uKGV2dCkgewotCQkJLyoKLQkJCSBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuc2VjdGlvbkNvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgewotCQkJIAlzZWxmLnNlY3Rpb25Db2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICcnOwotCQkJIAlzZWxmLnNlY3Rpb25Db2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gc2VsZi5jb2xsYXBzZUltYWdlOwotCQkJIH0KLQkJCSAqLwotCQkJIHNlbGYuZXhwYW5kQWxsKCk7Ci0JCQkgaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsKLQkJCSAJZXZ0LnByZXZlbnREZWZhdWx0KCk7Ci0JCQkgfQotCQkJIHJldHVybiBmYWxzZTsKLQkJfTsKLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7Ci0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7Ci0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5leHBhbmRBbGxUZXh0KSk7Ci0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7Ci0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsKLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOwotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7Ci0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsKLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOwkJCQkJCQotCQkKLQkJaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKLQkJaW1hZ2Uuc3JjID0gdGhpcy5jb2xsYXBzZUFsbEltYWdlOwotCQlpbWFnZS5hbHQgPSB0aGlzLmNvbGxhcHNlQWxsVGV4dDsKLQkJaW1hZ2UudGl0bGUgPSB0aGlzLmNvbGxhcHNlQWxsVGV4dDsKLQkJaW1hZ2Uud2lkdGggPSAnMTYnOwotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOwotCQlpbWFnZS5ib3JkZXIgPSAnMCc7Ci0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7Ci0JCWxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7Ci0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7Ci0JCWxpbmsuaHJlZiA9ICcjJzsKLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7Ci0JCWxpbmsub25jbGljayA9IC8qdGhpcy5jb2xsYXBzZUFsbDsqL2Z1bmN0aW9uKGV2dCkgewotCQkJLyoKLQkJCWZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5zZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc2VsZi5zZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0JCQkJc2VsZi5zZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IHNlbGYuZXhwYW5kSW1hZ2U7Ci0JCQl9Ci0JCQkqLwotCQkJc2VsZi5jb2xsYXBzZUFsbCgpOwotCQkJCi0JCQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgewotCQkJCWV2dC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9OwotCQlzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOwotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMuY29sbGFwc2VBbGxUZXh0KSk7CQkJCQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOwotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7Ci0JCQotCQkvKgotCQl2YXIgb3ZlcnZpZXdTZXBhcmF0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3ZlcnZpZXdTZXBhcmF0b3IiKTsKLQkJb3ZlcnZpZXdTZXBhcmF0b3IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBvdmVydmlld1NlcGFyYXRvcik7Ci0JCSovCi0JCWlmICh0aGlzLmZpcnN0U2VjdGlvbiAhPSBudWxsKSB7Ci0JCQl0aGlzLmZpcnN0U2VjdGlvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIHRoaXMuZmlyc3RTZWN0aW9uKTsKLQkJfQotCQkKLQkJaWYgKCBjb250ZW50UGFnZS5nZXRBcHAoKSAhPSBudWxsICkgewotCQkJZGl2LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0JCX0KLQl9OwotCQotCUNvbnRlbnRQYWdlU2VjdGlvbi5wcm90b3R5cGUuZXhwYW5kQWxsID0gZnVuY3Rpb24oKSB7Ci0JCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2VjdGlvbkNvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgewotCQkJIAl0aGlzLnNlY3Rpb25Db2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICcnOwotCQkJIAl0aGlzLnNlY3Rpb25Db2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gdGhpcy5jb2xsYXBzZUltYWdlOwotCQkJIH0KLQl9OwotCQotCUNvbnRlbnRQYWdlU2VjdGlvbi5wcm90b3R5cGUuY29sbGFwc2VBbGwgPSBmdW5jdGlvbigpIHsKLQkJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdGhpcy5zZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0JCQkJdGhpcy5zZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IHRoaXMuZXhwYW5kSW1hZ2U7Ci0JCQl9Ci0JfTsKLX07Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQyMDFkNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIGRlZmluZSB0aGUgY2xhc3MgaGVyZSBzbyB3ZSBkb24ndCBuZWVkIHRvIGxvYWQgdGhlIGRldGFpbCBpbXBsZW1lbnRhdGlvbnMgCi1Db250ZW50UGFnZVN1YlNlY3Rpb24gPSBmdW5jdGlvbigpIHsKLQotCXRoaXMucGFyZW50ID0gY29udGVudFBhZ2U7Ci0JLy8gYnkgZGVmYXVsdCwgd2UgcmV1c2UgdGhlIGltYWdlcyBmcm9tIHNlY3Rpb24KLQl0aGlzLmV4cGFuZEltYWdlID0gdGhpcy5wYXJlbnQuc2VjdGlvbi5leHBhbmRJbWFnZTsJCQotCXRoaXMuY29sbGFwc2VJbWFnZSA9IHRoaXMucGFyZW50LnNlY3Rpb24uY29sbGFwc2VJbWFnZTsKLQl0aGlzLmV4cGFuZEFsbEltYWdlID0gdGhpcy5wYXJlbnQuc2VjdGlvbi5leHBhbmRBbGxJbWFnZTsJCi0JdGhpcy5jb2xsYXBzZUFsbEltYWdlID0gdGhpcy5wYXJlbnQuc2VjdGlvbi5jb2xsYXBzZUFsbEltYWdlOwotCi0JLy8gYW5kIHVzZSB0aGUgZGVmYXVsdCB0ZXN0LCBvcmVycmlkZSB0aGlzIGFzIG5lZWRlZAotCXRoaXMuZXhwYW5kQWxsVGV4dCA9IGNvbnRlbnRQYWdlLnJlcy5leHBhbmRBbGxTdWJTZWN0aW9uc1RleHQ7Ci0JdGhpcy5jb2xsYXBzZUFsbFRleHQgPSBjb250ZW50UGFnZS5yZXMuY29sbGFwc2VBbGxTdWJTZWN0aW9uc1RleHQ7CQotCi0JdGhpcy5jb2xsYXBzZVN0ZXBzQnlEZWZhdWx0ID0gdHJ1ZTsKLQl0aGlzLmZpcnN0U3RlcFNlY3Rpb24gPSBudWxsOwotCi0JdGhpcy5zdGVwQ29sbGFwc2VEaXZzID0gbnVsbDsKLQl0aGlzLnN0ZXBDb2xsYXBzZUxpbmtzID0gbnVsbDsKLQkJCi19OwotCi0vLyBDcmVhdGVzIHRoZSBjb2xsYXBzaWJsZSBzdGVwIHNlY3Rpb24gbGlua3MuCi1Db250ZW50UGFnZVN1YlNlY3Rpb24ucHJvdG90eXBlLmNyZWF0ZVN0ZXBMaW5rcyA9IGZ1bmN0aW9uKHRhZ05hbWUsIGNsYXNzU2VsZWN0b3IpIHsKLQkKLQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsKLQkJdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7Ci0JCWlmIChlbGVtZW50cy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQl2YXIgc3RlcEVsZW1lbnRzID0gbmV3IEFycmF5KGVsZW1lbnRzLmxlbmd0aCk7Ci0JCXZhciB0b3RhbExpbmtzID0gMDsKLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7Ci0JCQkJc3RlcEVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50OwotCQkJfQotCQl9Ci0JCWlmICh0b3RhbExpbmtzID09IDApIHJldHVybjsKLQkJc3RlcEVsZW1lbnRzLmxlbmd0aCA9IHRvdGFsTGlua3M7Ci0JCXRoaXMuc3RlcENvbGxhcHNlRGl2cyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsKLQkJdGhpcy5zdGVwQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsKLQkJdGhpcy5maXJzdFN0ZXBTZWN0aW9uID0gc3RlcEVsZW1lbnRzWzBdOwotCQlmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJdmFyIGVsZW1lbnQgPSBzdGVwRWxlbWVudHNbaV07Ci0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsKLQkJCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChzaWJsaW5nQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpICYmIHNpYmxpbmdDb250YWluZXIuc3R5bGUpIHsKLQkJCQl2YXIgbmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHRTaWJsaW5nOwotCQkJCWVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2libGluZ0NvbnRhaW5lciwgbmV4dFNpYmxpbmcpOwotCQkJCXZhciBuZXh0RWxlbWVudCA9IHN0ZXBFbGVtZW50c1tpICsgMV07Ci0JCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG5leHRFbGVtZW50ICYmIG5leHRTaWJsaW5nICE9IG51bGwpIHsKLQkJCQkJdmFyIHRvTW92ZSA9IG5leHRTaWJsaW5nOwotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOwotCQkJCQlzaWJsaW5nQ29udGFpbmVyLmFwcGVuZENoaWxkKHRvTW92ZSk7Ci0JCQkJfQotCQkJCWlmICh0aGlzLmNvbGxhcHNlU3RlcHNCeURlZmF1bHQpIHsKLSAgICAJCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwotICAgIAkJCX0KLSAgICAJCQl0aGlzLnN0ZXBDb2xsYXBzZURpdnNbaV0gPSBzaWJsaW5nQ29udGFpbmVyOwotICAgIAkJCXRoaXMuY3JlYXRlQ29sbGFwc2libGVTdGVwU2VjdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQl0aGlzLmNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU3RlcHNMaW5rcyhzdGVwRWxlbWVudHNbMF0pOwotCX0KLX07Ci0KLS8vIENyZWF0ZXMgYSBjb2xsYXBzaWJsZSBzdGVwIHNlY3Rpb24uCi1Db250ZW50UGFnZVN1YlNlY3Rpb24ucHJvdG90eXBlLmNyZWF0ZUNvbGxhcHNpYmxlU3RlcFNlY3Rpb24gPSBmdW5jdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpbmRleCkgewotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7Ci0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwotCQl2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKLQkJbGluay5jb2xsYXBzZURpdiA9IHNpYmxpbmdDb250YWluZXI7Ci0JCWxpbmsuaHJlZiA9ICcnOwotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKLQkJaWYgKHRoaXMuY29sbGFwc2VTdGVwc0J5RGVmYXVsdCkgewotCQkJaW1hZ2Uuc3JjID0gdGhpcy5leHBhbmRJbWFnZTsKLQkJCWltYWdlLmFsdCA9IGNvbnRlbnRQYWdlLnJlcy5leHBhbmRUZXh0OwotCQkJaW1hZ2UudGl0bGUgPSBjb250ZW50UGFnZS5yZXMuZXhwYW5kVGV4dDsJCi0JCX0KLQkJZWxzZSB7Ci0JCQlpbWFnZS5zcmMgPSB0aGlzLmNvbGxhcHNlSW1hZ2U7Ci0JCQlpbWFnZS5hbHQgPSBjb250ZW50UGFnZS5yZXMuY29sbGFwc2VUZXh0OwotCQkJaW1hZ2UudGl0bGUgPSBjb250ZW50UGFnZS5yZXMuY29sbGFwc2VUZXh0OwkKLQkJfQotCQlpbWFnZS53aWR0aCA9ICcxNyc7Ci0JCWltYWdlLmhlaWdodCA9ICcxNSc7Ci0JCWltYWdlLmJvcmRlciA9ICcwJzsKLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsKLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7Ci0JCQotCQl2YXIgc2VsZiA9IHRoaXM7Ci0JCWxpbmsub25jbGljayA9IC8qdGhpcy5leHBhbmRDb2xsYXBzZVN0ZXBTZWN0aW9uOyovZnVuY3Rpb24oZXZ0KSB7Ci0JCQlpZiAodGhpcy5jb2xsYXBzZURpdi5zdHlsZS5kaXNwbGF5ID09ICcnKSB7Ci0JCQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKLQkJCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gc2VsZi5leHBhbmRJbWFnZTsKLQkJCQl0aGlzLmZpcnN0Q2hpbGQuYWx0ID0gY29udGVudFBhZ2UucmVzLmV4cGFuZFRleHQ7Ci0JCQkJdGhpcy5maXJzdENoaWxkLnRpdGxlID0gY29udGVudFBhZ2UucmVzLmV4cGFuZFRleHQ7CQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICcnOwotCQkJCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBzZWxmLmNvbGxhcHNlSW1hZ2U7Ci0JCQkJdGhpcy5maXJzdENoaWxkLmFsdCA9IGNvbnRlbnRQYWdlLnJlcy5jb2xsYXBzZVRleHQ7Ci0JCQkJdGhpcy5maXJzdENoaWxkLnRpdGxlID0gY29udGVudFBhZ2UucmVzLmNvbGxhcHNlVGV4dDsJCQkJCQotCQkJfQotCQkJaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsKLQkJCQlldnQucHJldmVudERlZmF1bHQoKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfTsKLQkJdGhpcy5zdGVwQ29sbGFwc2VMaW5rc1tpbmRleF0gPSBsaW5rOwotCQlzcGFuLmFwcGVuZENoaWxkKGxpbmspOwotCQllbGVtZW50Lmluc2VydEJlZm9yZShzcGFuLCBlbGVtZW50LmZpcnN0Q2hpbGQpOwotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOwotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOwotCX0KLX07Ci0KLQkJCQkJCi0vLyBDcmVhdGVzIHRoZSBFeHBhbmQgQWxsIGFuZCBDb2xsYXBzZSBBbGwgU3RlcHMgbGlua3MuCi1Db250ZW50UGFnZVN1YlNlY3Rpb24ucHJvdG90eXBlLmNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU3RlcHNMaW5rcyA9IGZ1bmN0aW9uKGZpcnN0RWxlbWVudCkgewotCXZhciBkaXY7Ci0JdmFyIHNlbGYgPSB0aGlzOwotCQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpIHsKLQkJZGl2LmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOwotCQlkaXYuYWxpZ24gPSAncmlnaHQnOwkJCi0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwotCQlpbWFnZS5zcmMgPSB0aGlzLmV4cGFuZEFsbEltYWdlOwotCQlpbWFnZS5hbHQgPSB0aGlzLmV4cGFuZEFsbFRleHQKLQkJaW1hZ2UudGl0bGUgPSB0aGlzLmV4cGFuZEFsbFRleHQKLQkJaW1hZ2Uud2lkdGggPSAnMTYnOwotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOwotCQlpbWFnZS5ib3JkZXIgPSAnMCc7Ci0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7Ci0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOwotCQlsaW5rLmhyZWYgPSAnJzsKLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7Ci0JCWxpbmsub25jbGljayA9IC8qdGhpcy5leHBhbmRBbGxTdGVwczsqL2Z1bmN0aW9uKGV2dCkgewotCQkJIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5zdGVwQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkgCXNlbGYuc3RlcENvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7Ci0JCQkgCXNlbGYuc3RlcENvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBzZWxmLmNvbGxhcHNlSW1hZ2U7Ci0JCQkgfQotCQkJIGlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7Ci0JCQkgCWV2dC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJIH0KLQkJCSByZXR1cm4gZmFsc2U7Ci0JCX07Ci0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOwotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMuZXhwYW5kQWxsVGV4dCkpOwotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOwotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7Ci0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsKLQkJCi0JCWltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7Ci0JCWltYWdlLnNyYyA9IHRoaXMuY29sbGFwc2VBbGxJbWFnZTsKLQkJaW1hZ2UuYWx0ID0gdGhpcy5jb2xsYXBzZUFsbFRleHQKLQkJaW1hZ2UudGl0bGUgPSB0aGlzLmNvbGxhcHNlQWxsVGV4dAotCQlpbWFnZS53aWR0aCA9ICcxNic7Ci0JCWltYWdlLmhlaWdodCA9ICcxNic7Ci0JCWltYWdlLmJvcmRlciA9ICcwJzsKLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsKLQkJbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsKLQkJbGluay5ocmVmID0gJyc7Ci0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOwotCQlsaW5rLm9uY2xpY2sgPSAvKnRoaXMuY29sbGFwc2VBbGxTdGVwczsqL2Z1bmN0aW9uKGV2dCkgewotCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnN0ZXBDb2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsKLQkJCQlzZWxmLnN0ZXBDb2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKLQkJCQlzZWxmLnN0ZXBDb2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gc2VsZi5leHBhbmRJbWFnZTsKLQkJCX0KLQkJCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7Ci0JCQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX07Ci0JCXNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7Ci0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7Ci0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5jb2xsYXBzZUFsbFRleHQpKTsKLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsKLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOwotCQkKLQkJaWYgKHRoaXMuZmlyc3RTdGVwU2VjdGlvbikgewotCQkJdGhpcy5maXJzdFN0ZXBTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgdGhpcy5maXJzdFN0ZXBTZWN0aW9uKTsKLQkJfQotCX0KLX07Ci0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTE0N2U3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcworKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi1Db250ZW50UGFnZVRvb2xiYXIgPSBmdW5jdGlvbigpewotCi10aGlzLmV4cGFuZEFsbEltYWdlID0gbnVsbDsKLXRoaXMuY29sbGFwc2VBbGxJbWFnZSA9IG51bGw7Ci10aGlzLmJvb2ttYXJrSW1hZ2UgPSBudWxsOwotdGhpcy5wcmludEltYWdlID0gbnVsbDsKLXRoaXMuYmFja0ltYWdlID0gbnVsbDsKLXRoaXMuZm9yd2FyZEltYWdlID0gbnVsbDsKLXRoaXMuZGl2aWRlckltYWdlID0gbnVsbDsKLQotLy8gaG9sZCB0aGUgdG9vbGJhciBpdGVtIGlkcwotdGhpcy50b29sYmFySXRlbXMgPSBbXTsKLQotdGhpcy5iYXJJdGVtSWRQcmVmaXggPSAiY29udGVudGJhcl8iOwotCi19Ci0KLUNvbnRlbnRQYWdlVG9vbGJhci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKGltZ1BhdGgpIHsKLQotCXRoaXMuZXhwYW5kQWxsSW1hZ2UgPSBjb250ZW50UGFnZS5yZXNvbHZlVXJsKGltZ1BhdGggKyAnZXhwYW5kX2FsbC5naWYnKTsJCi0JdGhpcy5jb2xsYXBzZUFsbEltYWdlID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoICsgJ2NvbGxhcHNlX2FsbC5naWYnKTsKLQl0aGlzLmJvb2ttYXJrSW1hZ2UgPSBjb250ZW50UGFnZS5yZXNvbHZlVXJsKGltZ1BhdGggKyAnYm9va21hcmsuZ2lmJyk7Ci0JdGhpcy5wcmludEltYWdlID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoICsgJ3ByaW50LmdpZicpOwotCXRoaXMuYmFja0ltYWdlID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoICsgJ2JhY2suZ2lmJyk7Ci0JdGhpcy5mb3J3YXJkSW1hZ2UgPSBjb250ZW50UGFnZS5yZXNvbHZlVXJsKGltZ1BhdGggKyAnZm9yd2FyZC5naWYnKTsKLQl0aGlzLmRpdmlkZXJJbWFnZSA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nUGF0aCArICdkaXZpZGVyLmdpZicpOwotCS8vdGhpcy5zaGltSW1hZ2UgPSBjb250ZW50UGFnZS5yZXNvbHZlVXJsKGltZ1BhdGggKyAnc2hpbS5naWYnKTsKLQkKLQl0aGlzLl9jcmVhdGVUb29sYmFyKCk7Ci19OwotCi1Db250ZW50UGFnZVRvb2xiYXIucHJvdG90eXBlLl9jcmVhdGVUb29sYmFyID0gZnVuY3Rpb24oKSB7Ci0JdmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb250ZW50UGFnZVRvb2xiYXIiKTsKLQkJCi0JaWYgKCBjb250YWluZXIgPT0gbnVsbCApIHsKLQkJcmV0dXJuOwotCX0KLQkKLQl2YXIgaHRtbCA9IFsiPHRhYmxlIGJvcmRlcj0nMCcgY2VsbHNwYWNpbmc9JzAnIGNlbGxwYWRkaW5nPScwJyA+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+CQkJCi0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfZGVzYy54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5X2Rlc2MueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTdiNTBhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfZGVzYy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0ODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJhY3Rpdml0eV9oZWxwZXIueHNsIi8+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+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlZk5hbWUiLz4KLQkJCQkJPC90aD4KLQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCTx1bD4KLQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHJlZkVsZW1lbnQiPgotCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCTwvbGk+Ci0JCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQk8L3VsPgotCQkJCQk8L3RkPgotCQkJCTwvdHI+Ci0JCQk8L3hzbDppZj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5X2hlbHBlci54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5X2hlbHBlci54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NTY5MDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hY3Rpdml0eV9oZWxwZXIueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi0JPHhzbDppbmNsdWRlIGhyZWY9InJlc291cmNlcy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iY29tbW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYXBwaW5nLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJvdmVydmlldy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iZ3VpZGFuY2VfaGVscGVyLnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0YWJVcmxBdHRyaWJ1dGUiPgotCQk8eHNsOnBhcmFtIG5hbWU9InVybCIvPgotCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheURpYWdyYW0iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRpYWdyYW0iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaW5nbGUtcXVvdGUiPic8L3hzbDp2YXJpYWJsZT4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzcGVjaWFsLXF1b3RlIj5gPC94c2w6dmFyaWFibGU+Ci0JCTxwLz4KLQkJPGltZyBib3JkZXI9IjAiIGRpYWdyYW1UeXBlPSJ7JGRpYWdyYW0vQG5hbWV9Ij4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImlkIj5kaWFncmFtXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGlhZ3JhbS9AbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InNyYyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkaWFncmFtL21hcC9Ac3JjIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iYWx0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0idHJhbnNsYXRlKCRkaWFncmFtL0BhbHQsJHNpbmdsZS1xdW90ZSwkc3BlY2lhbC1xdW90ZSkiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0aXRsZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyYW5zbGF0ZSgkZGlhZ3JhbS9AYWx0LCRzaW5nbGUtcXVvdGUsJHNwZWNpYWwtcXVvdGUpIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0idXNlbWFwIj4jPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkaWFncmFtL21hcC9AbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJPC9pbWc+Ci0JCTxtYXAgbmFtZT0ieyRkaWFncmFtL21hcC9AbmFtZX0iPgotCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRkaWFncmFtL21hcC9hcmVhIj4KLQkJCQk8YXJlYT4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBocmVmIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJyZWxQYXRoIj4sPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBndWlkIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJhbHQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYWx0Ii8+PC94c2w6YXR0cmlidXRlPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0aXRsZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhbHQiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvb3JkcyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb29yZHMiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InNoYXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNoYXBlIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTwvYXJlYT4KLQkJCTwveHNsOmZvci1lYWNoPgotCQk8L21hcD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfdGJzLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfdGJzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI4YzUzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5X3Ricy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJhY3Rpdml0eV9oZWxwZXIueHNsIi8+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+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVhbVN0cnVjdHVyZVRleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJPHAgYWxpZ249ImxlZnQiPgotCQkJPGRpdiBpZD0idGVhbVRyZWUiID48L2Rpdj4KLQkJCTwvcD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQl2YXIgdGVhbVRyZWUgPSBbCi0JCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImJyZWFrZG93bltAbmFtZT0nVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlJ10vRWxlbWVudFtAVHlwZT0nVGVhbVByb2ZpbGUnIGFuZCBAaGFzU3VwZXJUZWFtID0gJ2ZhbHNlJyBdIj4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0ZWFtU3RydWN0dXJlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQldOwotCWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLmJ1aWxkVGVhbVRyZWUodGVhbVRyZWUpOwotCQkJCQk8L3NjcmlwdD4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idGVhbVN0cnVjdHVyZSI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudCIvPgotCVsiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICRlbGVtZW50L0BVcmwpIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ARGlzcGxheU5hbWUiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0ByZWxQcm9jZXNzUGF0aCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQGlzU3VwcmVzc2VkIi8+IiwgCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGVsZW1lbnQvRWxlbWVudFtAVHlwZT0nVGVhbVByb2ZpbGUnXSkgPiAwIj4KLQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZWxlbWVudC9FbGVtZW50W0BUeXBlPSdUZWFtUHJvZmlsZSddIj4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVhbVN0cnVjdHVyZSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCTwveHNsOmlmPgotCQldLAotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0YnNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbFNpemUiIHNlbGVjdD0iY291bnQoYnJlYWtkb3duW0BuYW1lPSdUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUnXS9jb2x1bW5zL2NvbHVtbikiLz4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZWFtUHJvZmlsZUJyZWFrZG93blRleHQiLz4KLQkJPC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJPGRpdiBpZD0idHJlZUNvbnRlbnQiPjwvZGl2PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci1jb250ZW50UGFnZS5wcm9jZXNzUGFnZS50cmVlVGFibGUuZGF0YSA9IHsKLXRpdGxlOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZWFtUHJvZmlsZUJyZWFrZG93blRleHQiLz4iLCBzdW1tYXJ5OiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZWFtUHJvZmlsZUJyZWFrZG93blRleHQiLz4iLCAKLWNvbHVtbnM6IFs8eHNsOmZvci1lYWNoIHNlbGVjdD0iYnJlYWtkb3duW0BuYW1lPSdUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUnXS9jb2x1bW5zL2NvbHVtbiI+Ci1bIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWQiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYWJlbCIvPiJdPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpICE9ICRjb2xTaXplIj4sPC94c2w6aWY+Ci0JCQkJCTwveHNsOmZvci1lYWNoPl0sCi1yb3dzOiBbPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImJyZWFrZG93bltAbmFtZT0nVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlJ10vRWxlbWVudCI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id2JzSXRlbSI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpbmRlbnQiIHNlbGVjdD0iMCIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXJlbnROb2RlSWQiIHNlbGVjdD0iICcnICIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci1dfTsKLQkJCQk8L3NjcmlwdD4KLQkJPC9kaXY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Indic0l0ZW0iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnQiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJwYXJlbnROb2RlSWQiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJpbmRlbnQiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudC9AVHlwZSIvPgkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Imhhc0NoaWxkcmVuIj4KLQkJCTx4c2w6Y2hvb3NlPgotCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb3VudCgkZWxlbWVudC9FbGVtZW50KSA+IDAiPnRydWU8L3hzbDp3aGVuPgotCQkJCTx4c2w6b3RoZXJ3aXNlPmZhbHNlPC94c2w6b3RoZXJ3aXNlPgotCQkJPC94c2w6Y2hvb3NlPgotCQk8L3hzbDp2YXJpYWJsZT4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0eXBlTmFtZSI+Ci0JCQk8eHNsOmNob29zZT4KLQkJCQk8eHNsOndoZW4gdGVzdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCA9ICd0cnVlJyI+Ci0JCQkJCTx4c2w6Y2hvb3NlPgkJCQkJCQkJCQkKLQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVGFza0Rlc2NyaXB0b3InIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhc2tUZXh0Ii8+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdSb2xlRGVzY3JpcHRvciciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZVRleHQiLz4KLQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1dvcmtQcm9kdWN0RGVzY3JpcHRvciciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29ya1Byb2R1Y3RUZXh0Ii8+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BUeXBlTmFtZSIvPgotCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQk8L3hzbDpjaG9vc2U+CQkJCQkJCQkJCi0JCQkJPC94c2w6d2hlbj4KLQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BUeXBlTmFtZSIvPgotCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCTwveHNsOmNob29zZT4KLQkJPC94c2w6dmFyaWFibGU+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlc2NhcGVkRGlzcGxheU5hbWUiPgotICAgICAgICAJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImVzY2FwZSI+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InN0cmluZyIgc2VsZWN0PSIkZWxlbWVudC9ARGlzcGxheU5hbWUiLz4KLQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2VhcmNoIiBzZWxlY3Q9IicmcXVvdDsnIi8+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlcGxhY2UiIHNlbGVjdD0iJyZhbXA7cXVvdDsnIi8+Ci0JCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIAk8L3hzbDp2YXJpYWJsZT4KLQote2lkOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0Bub2RlSWQiLz4iLCBwYXJlbnRJZDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFyZW50Tm9kZUlkIi8+IiwgcmVsUGF0aDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AcmVsUHJvY2Vzc1BhdGgiLz4iLCBpc1N1cHByZXNzZWQ6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQGlzU3VwcmVzc2VkIi8+IiwgaW5kZW50U2l6ZTogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbmRlbnQiLz4sIGhhc0NoaWxkcmVuOjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGFzQ2hpbGRyZW4iLz4sIAotCWluZGV4OiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BJbmRleCIvPiIsIHByZWZpeDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3ByZWZpeCddIi8+IiwgbmFtZTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ATmFtZSIvPiIsIHRpdGxlOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BEaXNwbGF5TmFtZSIvPiIsIHVybDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAkZWxlbWVudC9AVXJsKSIvPiIsIAotCXByZWRlY2Vzc29yczogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AUHJlZGVjZXNzb3JzIi8+IiwgaW5mbzogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ATW9kZWxJbmZvIi8+IiwgdHlwZTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdHlwZU5hbWUiLz4iLCAKLQlyZXBlYXRhYmxlOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNSZXBlYXRhYmxlJ10iLz4iLCBtdWx0aU9jY3VyZW5jZXM6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJ10iLz4iLCBvcHRpb25hbDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPiIsIHBsYW5uZWQ6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPiIsICBvbmdvaW5nOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNPbmdvaW5nJ10iLz4iLCBldmVudERyaXZlbjogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzRXZlbnREcml2ZW4nXSIvPiIsIAotCXRlYW06ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQFRlYW0iLz4iLCBlbnRyeVN0YXRlOiAiIiwgZXhpdFN0YXRlOiAiIiwgZGVsaXZlcmFibGU6ICIiLCB2YXJpYWJpbGl0eVR5cGU6ICIifSwKLQkKLTwhLS0KLWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLnRyZWVUYWJsZS53YnNJdGVtSHRtbC5pbml0Um93KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQG5vZGVJZCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhcmVudE5vZGVJZCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQHJlbFByb2Nlc3NQYXRoIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AaXNTdXByZXNzZWQiLz4iLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGluZGVudCIvPiwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoYXNDaGlsZHJlbiIvPiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ASW5kZXgiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0ncHJlZml4J10iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BOYW1lIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXNjYXBlZERpc3BsYXlOYW1lIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAkZWxlbWVudC9AVXJsKSIvPiIsICIiLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BQcmVkZWNlc3NvcnMiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BNb2RlbEluZm8iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0eXBlTmFtZSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc1JlcGVhdGFibGUnXSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJ10iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIi8+IiwgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc09uZ29pbmcnXSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc0V2ZW50RHJpdmVuJ10iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BUZWFtIi8+IiwgIiIsICIiLCAiIiwgIiIsICIiKTsKLWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLnRyZWVUYWJsZS53YnNJdGVtSHRtbC53cml0ZVJvdygpOwkKLS0tPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRlbGVtZW50L0VsZW1lbnQpID4gMCI+Ci0JCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGVsZW1lbnQvRWxlbWVudCI+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Indic0l0ZW0iPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpbmRlbnQiIHNlbGVjdD0iJGluZGVudCsxIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFyZW50Tm9kZUlkIiBzZWxlY3Q9IiRlbGVtZW50L0Bub2RlSWQiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hY3Rpdml0eV93YnMueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hY3Rpdml0eV93YnMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjI3NTg5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfd2JzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/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+LDwveHNsOmlmPgotCQkJCQk8L3hzbDpmb3ItZWFjaD5dLAotcm93czogWzx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJicmVha2Rvd25bQG5hbWU9J1dvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSddL0VsZW1lbnQiPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Indic0l0ZW0iPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iaW5kZW50IiBzZWxlY3Q9IjAiLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFyZW50Tm9kZUlkIiBzZWxlY3Q9IiAnJyAiLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50IiBzZWxlY3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotXX07Ci0JCQkJPC9zY3JpcHQ+Ci0JCi0JCTwvZGl2PgotCTwveHNsOnRlbXBsYXRlPgotCi0JPCEtLSB3cml0ZSB0aGUgd2JzIHRyIGh0bWwgLS0+Ci0JPCEtLSBpbml0KGlkLCBwYXJlbnRJZCwgcmVsUGF0aCwgaXNTdXByZXNzZWQsIGluZGVudFNpemUsIGhhc0NoaWxkcmVuLCBpbmRleCwgcHJlZml4LCB0aXRsZSwgdXJsLCBzdGVwcywgcHJlZGVjZXNzb3JzLCBpbmZvLCByZXBlYXRhYmxlLCBtdWx0aU9jY3VyZW5jZXMsIG9wdGlvbmFsLCBwbGFubmVkLCB0eXBlKSAtLT4KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Indic0l0ZW0iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnQiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJwYXJlbnROb2RlSWQiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJpbmRlbnQiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50L0BUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJoYXNDaGlsZHJlbiI+Ci0JCQk8eHNsOmNob29zZT4KLQkJCQk8eHNsOndoZW4gdGVzdD0iY291bnQoJGVsZW1lbnQvRWxlbWVudCkgPiAwIj50cnVlPC94c2w6d2hlbj4KLQkJCQk8eHNsOm90aGVyd2lzZT5mYWxzZTwveHNsOm90aGVyd2lzZT4KLQkJCTwveHNsOmNob29zZT4KLQkJPC94c2w6dmFyaWFibGU+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idHlwZU5hbWUiPgotCQkJPHhzbDpjaG9vc2U+Ci0JCQkJPHhzbDp3aGVuIHRlc3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQgPSAndHJ1ZSciPgotCQkJCQk8eHNsOmNob29zZT4JCQkJCQkJCQkJCi0JCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rhc2tEZXNjcmlwdG9yJyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YXNrVGV4dCIvPgotCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnUm9sZURlc2NyaXB0b3InIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJvbGVUZXh0Ii8+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdXb3JrUHJvZHVjdERlc2NyaXB0b3InIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtQcm9kdWN0VGV4dCIvPgotCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AVHlwZU5hbWUiLz4KLQkJCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQkJPC94c2w6Y2hvb3NlPgkJCQkJCQkJCQotCQkJCTwveHNsOndoZW4+Ci0JCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AVHlwZU5hbWUiLz4KLQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQk8L3hzbDpjaG9vc2U+Ci0JCTwveHNsOnZhcmlhYmxlPgote2lkOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0Bub2RlSWQiLz4iLCBwYXJlbnRJZDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFyZW50Tm9kZUlkIi8+IiwgcmVsUGF0aDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AcmVsUHJvY2Vzc1BhdGgiLz4iLCBpc1N1cHByZXNzZWQ6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQGlzU3VwcmVzc2VkIi8+IiwgaW5kZW50U2l6ZTogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbmRlbnQiLz4sIGhhc0NoaWxkcmVuOjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGFzQ2hpbGRyZW4iLz4sIAotCWluZGV4OiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BJbmRleCIvPiIsIHByZWZpeDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3ByZWZpeCddIi8+IiwgbmFtZTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ATmFtZSIvPiIsIHRpdGxlOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BEaXNwbGF5TmFtZSIvPiIsIHVybDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAkZWxlbWVudC9AVXJsKSIvPiIsIAotCXByZWRlY2Vzc29yczogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AUHJlZGVjZXNzb3JzIi8+IiwgaW5mbzogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ATW9kZWxJbmZvIi8+IiwgdHlwZTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdHlwZU5hbWUiLz4iLCAKLQlyZXBlYXRhYmxlOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNSZXBlYXRhYmxlJ10iLz4iLCBtdWx0aU9jY3VyZW5jZXM6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJ10iLz4iLCBvcHRpb25hbDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPiIsIHBsYW5uZWQ6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPiIsICBvbmdvaW5nOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNPbmdvaW5nJ10iLz4iLCBldmVudERyaXZlbjogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzRXZlbnREcml2ZW4nXSIvPiIsIAotCXRlYW06ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQFRlYW0iLz4iLCBlbnRyeVN0YXRlOiAiIiwgZXhpdFN0YXRlOiAiIiwgZGVsaXZlcmFibGU6ICIiLCB2YXJpYWJpbGl0eVR5cGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSd2YXJpYWJpbGl0eVR5cGUnXSIvPiIsCi0Jc3RlcHM6IFs8eHNsOnZhcmlhYmxlIG5hbWU9InN0ZXBTaXplIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQoJGVsZW1lbnQvU3RlcHMvU3RlcCkiLz48L3hzbDp2YXJpYWJsZT4KLQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGVsZW1lbnQvU3RlcHMvU3RlcCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzZWxlY3RlZCIvPgotCTx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSAhPSAkc3RlcFNpemUiPiw8L3hzbDppZj48L3hzbDpmb3ItZWFjaD5dfSwKLTx4c2w6aWYgdGVzdD0iY291bnQoJGVsZW1lbnQvRWxlbWVudCkgPiAwIj4KLQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZWxlbWVudC9FbGVtZW50Ij4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id2JzSXRlbSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImluZGVudCIgc2VsZWN0PSIkaW5kZW50KzEiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhcmVudE5vZGVJZCIgc2VsZWN0PSIkZWxlbWVudC9Abm9kZUlkIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCIvPgkJCQkJCi0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCTwveHNsOmZvci1lYWNoPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfd3Bicy54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5X3dwYnMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWY1MTNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfd3Bicy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJhY3Rpdml0eV9oZWxwZXIueHNsIi8+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Jlc3BvbnNpYmxlUm9sZSddL0VsZW1lbnRbQFR5cGU9J1JvbGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InF1ZXJ5U3RyaW5nIiBzZWxlY3Q9IkBxdWVyeVN0cmluZyIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlbFByb2Nlc3NQYXRoIiBzZWxlY3Q9IkByZWxQcm9jZXNzUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIgc2VsZWN0PSJAU2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFwcGluZyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxtZXRhIG5hbWU9InJvbGUiPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlUm9sZS9ARGlzcGxheU5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQWN0aXZpdHlUcmVlVGFibGUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvUHJvY2Vzc0VsZW1lbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBkZWZhdWx0UXVlcnlTdHIgPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRxdWVyeVN0cmluZyIvPic7Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sIGRlZmF1bHRRdWVyeVN0ciwgZmFsc2UsIHRydWUsIHRydWUpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQk8ZGl2IGF1dG9XcmFwPSJ0cnVlIj4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC9kaXY+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFjdGl2aXR5VGFicyIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3b3JrZmxvd1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id3Bic1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50IiBzZWxlY3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFjdGl2aXR5VGFicyI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQk8dHIgdmFsaWduPSJtaWRkbGUiPgotCQkJCTx0ZCB3aWR0aD0iMTAiIGNsYXNzPSJ0YWIiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNyIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InRhYiI+Ci0JCQkJCTxhIGNsYXNzPSJ0YWIiIGlkPSJUQUJfRGVzY3JpcHRpb24iPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhYlVybEF0dHJpYnV0ZSI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InVybCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCB0YWJzL3RhYltAbmFtZT0nRGVzY3JpcHRpb24nXS9AdXJsKSIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVzY3JpcHRpb25UZXh0Ii8+Ci0JCQkJCTwvYT4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iMjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX21pZGRsZS1pX2kuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsaWduPSJhYnNtaWRkbGUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJ0YWIiPgotCQkJCQk8YSBjbGFzcz0idGFiIiBpZD0iVEFCX1dCUyI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdXQlMnXS9AdXJsKSIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXA7Ij4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdic1RleHQiLz4KLQkJCQkJCTwvc3Bhbj4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIxIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9taWRkbGUtaV9pLmdpZiIgd2lkdGg9IjIxIiBoZWlnaHQ9IjE3IiBhbGlnbj0iYWJzbWlkZGxlIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0idGFiIj4KLQkJCQkJPGEgY2xhc3M9InRhYiIgaWQ9IlRBQl9UQlMiPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhYlVybEF0dHJpYnV0ZSI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InVybCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCB0YWJzL3RhYltAbmFtZT0nVEJTJ10vQHVybCkiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwOyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YnNUZXh0Ii8+Ci0JCQkJCQk8L3NwYW4+Ci0JCQkJCTwvYT4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iMjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX21pZGRsZS1pX2EuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsaWduPSJhYnNtaWRkbGUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJhY3RpdmVUYWIiPgotCQkJCQk8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwOyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdwYnNUZXh0Ii8+Ci0JCQkJCTwvc3Bhbj4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iMjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX2VuZC1hLmdpZiIgd2lkdGg9IjIxIiBoZWlnaHQ9IjE3IiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSI1MCUiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNyIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJCTx0cj4KLQkJCQk8dGQgY29sc3Bhbj0iNiI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgaGVpZ2h0PSIyIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX3NwYWNlX21pZGRsZS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIyIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIGNsYXNzPSJhY3RpdmVUYWIiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIHdpZHRoPSIxMCIgaGVpZ2h0PSIyIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX3NwYWNlLmdpZiIgd2lkdGg9IjIxIiBoZWlnaHQ9IjIiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgY29sc3Bhbj0iMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgaGVpZ2h0PSIyIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQkJPHRyPgotCQkJCTx0ZCBjb2xzcGFuPSIxMCIgY2xhc3M9ImFjdGl2ZVRhYiI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgaGVpZ2h0PSI1IiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3RhYmxlPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ3b3JrZmxvd1NlY3Rpb24iPgotCQk8eHNsOmlmIHRlc3Q9ImRpYWdyYW1zL2RpYWdyYW1bQG5hbWU9J1dQRGVwZW5kZW5jeSddIG9yIGRpYWdyYW1zL3VzZXJkaWFncmFtW0BuYW1lPSdXUERlcGVuZGVuY3knXSAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29ya1Byb2R1Y3REZXBlbmRlbmNpZXNUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8IS0tCi0JCQk8cCBhbGlnbj0iY2VudGVyIj4KLQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iZGlhZ3JhbXMvZGlhZ3JhbVtAbmFtZT0nV1BEZXBlbmRlbmN5J10iLz4KLQkJCTwvcD4KLQotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5RGlhZ3JhbSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkaWFncmFtIiBzZWxlY3Q9ImRpYWdyYW1zL2RpYWdyYW1bQG5hbWU9J1dQRGVwZW5kZW5jeSddIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQktLT4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgkJCQotCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJkaWFncmFtcy91c2VyZGlhZ3JhbVtAbmFtZT0nV1BEZXBlbmRlbmN5J10iPgotCQkJCQkJCTx0cj4KLQkJCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVTaW5nbGVDZWxsIiBjb2xzcGFuPSIyIiBhbGlnbj0ibGVmdCI+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iZGlhZ3JhbXMvdXNlcmRpYWdyYW1bQG5hbWU9J1dQRGVwZW5kZW5jeSddIi8+Ci0JCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPC90cj4KLQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImRpYWdyYW1zL2RpYWdyYW1bQG5hbWU9J1dQRGVwZW5kZW5jeSddIj4KLQkJCQkJCQkJPHRyPgotCQkJCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVTaW5nbGVDZWxsIiBjb2xzcGFuPSIyIiBhbGlnbj0ibGVmdCI+Ci0JCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXlEaWFncmFtIj4KLQkJCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRpYWdyYW0iIHNlbGVjdD0iZGlhZ3JhbXMvZGlhZ3JhbVtAbmFtZT0nV1BEZXBlbmRlbmN5J10iLz4KLQkJCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCQkJPC90ZD4KLQkJCQkJCQkJPC90cj4KLQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCTwvdGFibGU+CQotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ3cGJzU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb2xTaXplIiBzZWxlY3Q9ImNvdW50KGJyZWFrZG93bltAbmFtZT0nV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUnXS9jb2x1bW5zL2NvbHVtbikiLz4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrUHJvZHVjdEJyZWFrZG93blRleHQiLz4KLQkJPC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJPGRpdiBpZD0idHJlZUNvbnRlbnQiPjwvZGl2PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci1jb250ZW50UGFnZS5wcm9jZXNzUGFnZS50cmVlVGFibGUuZGF0YSA9IHsKLXRpdGxlOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrUHJvZHVjdEJyZWFrZG93blRleHQiLz4iLCBzdW1tYXJ5OiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrUHJvZHVjdEJyZWFrZG93blRleHQiLz4iLCAKLWNvbHVtbnM6IFs8eHNsOmZvci1lYWNoIHNlbGVjdD0iYnJlYWtkb3duW0BuYW1lPSdXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSddL2NvbHVtbnMvY29sdW1uIj4KLVsiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhYmVsIi8+Il08eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgIT0gJGNvbFNpemUiPiw8L3hzbDppZj4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+XSwKLXJvd3M6IFs8eHNsOmZvci1lYWNoIHNlbGVjdD0iYnJlYWtkb3duW0BuYW1lPSdXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSddL0VsZW1lbnQiPgotCQkJCQkJPHhzbDpzb3J0IGRhdGEtdHlwZT0idGV4dCIgc2VsZWN0PSJARGlzcGxheU5hbWUiIG9yZGVyPSJhc2NlbmRpbmciLz4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3YnNJdGVtIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImluZGVudCIgc2VsZWN0PSIwIi8+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIgc2VsZWN0PSIkc2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhcmVudE5vZGVJZCIgc2VsZWN0PSIgJycgIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLV19OwotCQkJCTwvc2NyaXB0PgotCQk8L2Rpdj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0id2JzSXRlbSI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudCIvPgotCQk8eHNsOnBhcmFtIG5hbWU9InBhcmVudE5vZGVJZCIvPgotCQk8eHNsOnBhcmFtIG5hbWU9ImluZGVudCIvPgotCQk8eHNsOnBhcmFtIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50L0BUeXBlIi8+CQkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJoYXNDaGlsZHJlbiI+Ci0JCQk8eHNsOmNob29zZT4KLQkJCQk8eHNsOndoZW4gdGVzdD0iY291bnQoJGVsZW1lbnQvRWxlbWVudCkgPiAwIj50cnVlPC94c2w6d2hlbj4KLQkJCQk8eHNsOm90aGVyd2lzZT5mYWxzZTwveHNsOm90aGVyd2lzZT4KLQkJCTwveHNsOmNob29zZT4KLQkJPC94c2w6dmFyaWFibGU+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idHlwZU5hbWUiPgotCQkJPHhzbDpjaG9vc2U+Ci0JCQkJPHhzbDp3aGVuIHRlc3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQgPSAndHJ1ZSciPgotCQkJCQk8eHNsOmNob29zZT4JCQkJCQkJCQkJCi0JCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rhc2tEZXNjcmlwdG9yJyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YXNrVGV4dCIvPgotCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnUm9sZURlc2NyaXB0b3InIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJvbGVUZXh0Ii8+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdXb3JrUHJvZHVjdERlc2NyaXB0b3InIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtQcm9kdWN0VGV4dCIvPgotCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AVHlwZU5hbWUiLz4KLQkJCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQkJPC94c2w6Y2hvb3NlPgkJCQkJCQkJCQotCQkJCTwveHNsOndoZW4+Ci0JCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AVHlwZU5hbWUiLz4KLQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQk8L3hzbDpjaG9vc2U+Ci0JCTwveHNsOnZhcmlhYmxlPgkJCi17aWQ6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQG5vZGVJZCIvPiIsIHBhcmVudElkOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYXJlbnROb2RlSWQiLz4iLCByZWxQYXRoOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0ByZWxQcm9jZXNzUGF0aCIvPiIsIGlzU3VwcHJlc3NlZDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AaXNTdXByZXNzZWQiLz4iLCBpbmRlbnRTaXplOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGluZGVudCIvPiwgaGFzQ2hpbGRyZW46PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoYXNDaGlsZHJlbiIvPiwgCi0JaW5kZXg6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQEluZGV4Ii8+IiwgcHJlZml4OiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0ncHJlZml4J10iLz4iLCBuYW1lOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BOYW1lIi8+IiwgdGl0bGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQERpc3BsYXlOYW1lIi8+IiwgdXJsOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICRlbGVtZW50L0BVcmwpIi8+IiwgCi0JcHJlZGVjZXNzb3JzOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BQcmVkZWNlc3NvcnMiLz4iLCBpbmZvOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BNb2RlbEluZm8iLz4iLCB0eXBlOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0eXBlTmFtZSIvPiIsIAotCXJlcGVhdGFibGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc1JlcGVhdGFibGUnXSIvPiIsIG11bHRpT2NjdXJlbmNlczogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2hhc011bHRpcGxlT2NjdXJyZW5jZXMnXSIvPiIsIG9wdGlvbmFsOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIi8+IiwgcGxhbm5lZDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIi8+IiwgIG9uZ29pbmc6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc09uZ29pbmcnXSIvPiIsIGV2ZW50RHJpdmVuOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNFdmVudERyaXZlbiddIi8+IiwgCi0JdGVhbTogIiIsIGVudHJ5U3RhdGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQEVudHJ5U3RhdGUiLz4iLCBleGl0U3RhdGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQEV4aXRTdGF0ZSIvPiIsIGRlbGl2ZXJhYmxlOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BEZWxpdmVyYWJsZSIvPiIsIHZhcmlhYmlsaXR5VHlwZTogIiJ9LAotPCEtLQotY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UudHJlZVRhYmxlLndic0l0ZW1IdG1sLmluaXRSb3coIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9Abm9kZUlkIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFyZW50Tm9kZUlkIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AcmVsUHJvY2Vzc1BhdGgiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0Bpc1N1cHJlc3NlZCIvPiIsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5kZW50Ii8+LCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhhc0NoaWxkcmVuIi8+LCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BJbmRleCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdwcmVmaXgnXSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQE5hbWUiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BEaXNwbGF5TmFtZSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJGVsZW1lbnQvQFVybCkiLz4iLCAiIiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AUHJlZGVjZXNzb3JzIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ATW9kZWxJbmZvIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdHlwZU5hbWUiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNSZXBlYXRhYmxlJ10iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naGFzTXVsdGlwbGVPY2N1cnJlbmNlcyddIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPiIsICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNPbmdvaW5nJ10iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNFdmVudERyaXZlbiddIi8+IiwgIiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQEVudHJ5U3RhdGUiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BFeGl0U3RhdGUiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BEZWxpdmVyYWJsZSIvPiIsICIiLCAiIik7Ci1jb250ZW50UGFnZS5wcm9jZXNzUGFnZS50cmVlVGFibGUud2JzSXRlbUh0bWwud3JpdGVSb3coKTsJCi0tLT4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZWxlbWVudC9FbGVtZW50KSA+IDAiPgotCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRlbGVtZW50L0VsZW1lbnQiPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3YnNJdGVtIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iaW5kZW50IiBzZWxlY3Q9IiRpbmRlbnQrMSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50IiBzZWxlY3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhcmVudE5vZGVJZCIgc2VsZWN0PSIkZWxlbWVudC9Abm9kZUlkIi8+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+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FydGlmYWN0X2Rlc2NyaXB0b3IueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hcnRpZmFjdF9kZXNjcmlwdG9yLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAzMzkyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FydGlmYWN0X2Rlc2NyaXB0b3IueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0iZGVzY3JpcHRvci54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0icHVycG9zZS54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0idGFpbG9yaW5nLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJ3b3JrcHJvZHVjdF9oZWxwZXIueHNsIi8+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4JCQkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nV29ya1Byb2R1Y3REZXNjcmlwdG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3b3JrUHJvZHVjdERlc2NyaXB0b3IiIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdXb3JrUHJvZHVjdERlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRlc2NyaXB0b3JEZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J0Rlc2NyaXB0b3JEZXNjcmlwdGlvbiddIi8+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+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHVycG9zZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRlc2NyaXB0b3JSZWxhdGlvbnNoaXBzU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkZWxpdmVyYWJsZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0KLQkJCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdicmllZk91dGxpbmUnXSAhPScnICI+Ci0JCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCi0JCQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlZmluZWREZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkKLQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQkJCTwveHNsOmNob29zZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3b3JrUHJvZHVjdElsbHVzdHJhdGlvbnNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFpbG9yaW5nU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLQkJCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQkJCWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLmZpeERlc2NyaXB0b3JMaW5rcygpOwotCQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+CQotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkZXNjcmlwdGlvblNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYnJpZWZPdXRsaW5lIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2JyaWVmT3V0bGluZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3JlZmluZWREZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJGJyaWVmT3V0bGluZSAhPSAnJyBvciAkbWFpbkRlc2NyaXB0aW9uICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRlc2NyaXB0aW9uVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgkJCQotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGJyaWVmT3V0bGluZSAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRicmllZk91dGxpbmVUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGJyaWVmT3V0bGluZSIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkbWFpbkRlc2NyaXB0aW9uICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1haW5EZXNjcmlwdGlvblRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkbWFpbkRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgkJCQkJCi0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4JCi0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InByb3BlcnRpZXNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydGllc1RleHQiLz48L2Rpdj4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCSAgICA8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0nYWN0aXZpdHlFbnRyeVN0YXRlJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJGFjdGl2aXR5RW50cnlTdGF0ZVRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdhY3Rpdml0eUVudHJ5U3RhdGUnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdhY3Rpdml0eUV4aXRTdGF0ZSddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRhY3Rpdml0eUV4aXRTdGF0ZVRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdhY3Rpdml0eUV4aXRTdGF0ZSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+CQkJCi0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkb3B0aW9uYWxUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+CQkJCQotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5lZFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgkJCi0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J1BsYW5uaW5nRGF0YSddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRwbGFubmluZ0RhdGFUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nUGxhbm5pbmdEYXRhJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCTwvdGFibGU+Ci0JCTwvZGl2PgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InVzYWdlR3VpZGFuY2UiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3VzYWdlR3VpZGFuY2UnXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiR1c2FnZUd1aWRhbmNlICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHVzYWdlR3VpZGFuY2VUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiR1c2FnZUd1aWRhbmNlIi8+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImRlc2NyaXB0b3JSZWxhdGlvbnNoaXBzU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id29ya1Byb2R1Y3QiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdXb3JrUHJvZHVjdCddL0VsZW1lbnRbQFR5cGU9J0FydGlmYWN0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkZWxpdmVyYWJsZVBhcnRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2RlbGl2ZXJhYmxlUGFydHMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1wYWN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdpbXBhY3RzJ10vRWxlbWVudFtAVHlwZT0nV29ya1Byb2R1Y3REZXNjcmlwdG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbXBhY3RlZEJ5IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2ltcGFjdGVkQnknXS9FbGVtZW50W0BUeXBlPSdXb3JrUHJvZHVjdERlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im1hbmRhdG9yeUlucHV0VG8iIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nV29ya1Byb2R1Y3REZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0VG9fVGFza0Rlc2NyaXB0b3JzJ10vRWxlbWVudFtAVHlwZT0nVGFza0Rlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im9wdGlvbmFsSW5wdXRUbyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyddL0VsZW1lbnRbQFR5cGU9J1Rhc2tEZXNjcmlwdG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJleHRlcm5hbElucHV0VG8iIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nV29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMnXS9FbGVtZW50W0BUeXBlPSdUYXNrRGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0RnJvbSIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbV9UYXNrRGVzY3JpcHRvcnMnXS9FbGVtZW50W0BUeXBlPSdUYXNrRGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3VwZXJBY3Rpdml0aWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3N1cGVyQWN0aXZpdGllcyddL0VsZW1lbnRbQFR5cGU9J0FjdGl2aXR5J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nV29ya1Byb2R1Y3REZXNjcmlwdG9yX1Jlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzJ10vRWxlbWVudFtAVHlwZT0nUm9sZURlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndvcmtlZE9uQnkiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nd29ya2VkT25CeSddL0VsZW1lbnQiLz4KLQotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRyZXNwb25zaWJsZVJvbGUpICsgY291bnQoJHdvcmtlZE9uQnkpICsgY291bnQoJG1hbmRhdG9yeUlucHV0VG8pICsgY291bnQoJG9wdGlvbmFsSW5wdXRUbykgKyBjb3VudCgkZXh0ZXJuYWxJbnB1dFRvKSArIGNvdW50KCRvdXRwdXRGcm9tKSArIGNvdW50KCRpbXBhY3RzKSArIGNvdW50KCRpbXBhY3RlZEJ5KT4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGltcGFjdHMpID4gMCI+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+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dFRvKSArIGNvdW50KCRvcHRpb25hbElucHV0VG8pICsgY291bnQoJGV4dGVybmFsSW5wdXRUbykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0VG9UZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHdpZHRoPSIzMCUiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYW5kYXRvcnlUZXh0Ii8+OgotCQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dFRvKSA+IDAiPgotCQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG1hbmRhdG9yeUlucHV0VG8iPgkJCi0JCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+CQkJCQkJCQkKLQkJCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+CQkJCQkJCQotCQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDp3aGVuPgkJCQkKLQkJCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub25lVGV4dCIvPgotCQkJCQkJCQkJCTwvbGk+CQkJCQkJCQkJCi0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHdpZHRoPSIzMCUiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcHRpb25hbFRleHQiLz46Ci0JCQkJCQkJCTwvc3Bhbj4KLQkJCQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iY291bnQoJG9wdGlvbmFsSW5wdXRUbykgPiAwIj4KLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG9wdGlvbmFsSW5wdXRUbyI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgkJCQkJCQkKLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDp3aGVuPgkJCQkKLQkJCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub25lVGV4dCIvPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3VsPgkJCQkJCQkJCQotCQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgkJCQkJCQkJCQotCQkJCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleHRlcm5hbFRleHQiLz46Ci0JCQkJCQkJCTwvc3Bhbj4KLQkJCQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iY291bnQoJGV4dGVybmFsSW5wdXRUbykgPiAwIj4KLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGV4dGVybmFsSW5wdXRUbyI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgkJCQkJCQkKLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDp3aGVuPgkJCQkKLQkJCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub25lVGV4dCIvPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3VsPgkJCQkJCQkJCQotCQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgkJCQkJCQkJCQotCQkJCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCQkJPC90ZD4JCQkJCQotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkJCQkKLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkb3V0cHV0RnJvbSkgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dEZyb21UZXh0Ii8+PC90aD4JCQkJCQkJCi0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIzIj4KLQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRvdXRwdXRGcm9tKSA+IDAiPgkJCQkJCQkJCQotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG91dHB1dEZyb20iPgotCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJPC90ZD4JCQkJCQkJCi0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkZWxpdmVyYWJsZVNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZXh0ZXJuYWxEZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdleHRlcm5hbERlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkZWxpdmVyZWRXb3JrUHJvZHVjdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZGVsaXZlcmFibGVQYXJ0cyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZSIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdwYWNrYWdpbmdHdWlkYW5jZSddIi8+Ci0JCQotCQk8eHNsOmlmIHRlc3Q9IiRleHRlcm5hbERlc2NyaXB0aW9uICE9ICcnIG9yIGNvdW50KCRkZWxpdmVyZWRXb3JrUHJvZHVjdHMpID4gMCBvciAkcGFja2FnaW5nR3VpZGFuY2UgIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVsaXZlcmFibGVQcm9wZXJ0aWVzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGV4dGVybmFsRGVzY3JpcHRpb24gIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZXJuYWxEZXNjcmlwdGlvblRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkZXh0ZXJuYWxEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZGVsaXZlcmVkV29ya1Byb2R1Y3RzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVsaXZlcmVkUGFydHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRkZWxpdmVyZWRXb3JrUHJvZHVjdHMiPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkcGFja2FnaW5nR3VpZGFuY2UgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFja2FnaW5nSW5zdHJ1Y3Rpb25zVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRwYWNrYWdpbmdHdWlkYW5jZSIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvY2hlY2tsaXN0LnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvY2hlY2tsaXN0LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMxZjU4Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2NoZWNrbGlzdC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJndWlkYW5jZS54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+CQkKLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdyZXNwb25zaWJsZVJvbGUnXS9FbGVtZW50W0BUeXBlPSdSb2xlJ10iLz4KLQotICAgIAk8aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSI+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVSb2xlL0BEaXNwbGF5TmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICAnJywgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQkJCi0JCQkJCS8vb3ZlcnJpZGUgdGhlIHN1YnNlY3Rpb24gdGV4dAotCQkJCQljb250ZW50UGFnZS5zdWJTZWN0aW9uLmV4cGFuZEFsbFRleHQgPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleHBhbmRBbGxUZXh0Ii8+JzsKLQkJCQkJY29udGVudFBhZ2Uuc3ViU2VjdGlvbi5jb2xsYXBzZUFsbFRleHQgPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xsYXBzZUFsbFRleHQiLz4nOwkJCQkJCi0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8YSBuYW1lPSJUb3AiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1haW5EZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNoZWNrSXRlbXNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iY2hlY2tJdGVtc1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2VjdGlvbnMiIHNlbGVjdD0iJGRlc2NyaXB0aW9uL3JlZmVyZW5jZUxpc3RbQG5hbWU9J3NlY3Rpb25zJ10vRWxlbWVudFtAVHlwZT0nU2VjdGlvbiddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHNlY3Rpb25zKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2hlY2tJdGVtc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkc2VjdGlvbnMiPgotCQkJCQkJCQk8ZGl2IGNsYXNzPSJzdGVwSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nbmFtZSddIi8+PC9kaXY+Ci0JCQkJCQkJCTxkaXYgY2xhc3M9InN0ZXBDb250ZW50Ij4KLQkJCQkJCQkJCTx0YWJsZSBjbGFzcz0ic3RlcFRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQkJCQkJPHRkPgotCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nc2VjdGlvbkRlc2NyaXB0aW9uJ10iLz4KLQkJCQkJCQkJCQkJPC90ZD4KLQkJCQkJCQkJCQk8L3RyPgotCQkJCQkJCQkJPC90YWJsZT4KLQkJCQkJCQkJPC9kaXY+CQkJCQkJCi0JCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2NvbW1vbi54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2NvbW1vbi54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MzY2ZTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jb21tb24ueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQk8bWV0YSBuYW1lPSJ1bWEudHlwZSIgY29udGVudD0ieyRlbGVtZW50VHlwZX0iLz4KLQkJPG1ldGEgbmFtZT0idW1hLm5hbWUiIGNvbnRlbnQ9InskZWxlbWVudE5hbWV9Ii8+Ci0JCTxtZXRhIG5hbWU9InVtYS5wcmVzZW50YXRpb25OYW1lIiBjb250ZW50PSJ7JGVsZW1lbnRQcmVzZW50YXRpb25OYW1lfSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdSb2xlJyI+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icm9sZU1ldGFJbmZvIi8+Ci0JCTwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUYXNrJyI+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFza01ldGFJbmZvIi8+Ci0JCTwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdBcnRpZmFjdCcgb3IgJGVsZW1lbnRUeXBlID0gJ0RlbGl2ZXJhYmxlJyBvciAkZWxlbWVudFR5cGUgPSAnT3V0Y29tZSciPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IndvcmtQcm9kdWN0TWV0YUluZm8iLz4KLQkJPC94c2w6aWY+Ci0JCTx4c2w6aWYgdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rvb2xNZW50b3InIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0b29sTWVudG9yTWV0YUluZm8iLz4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9IndvcmtQcm9kdWN0TWV0YUluZm8iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRvbWFpbnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZG9tYWlucyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3b3JrUHJvZHVjdFR5cGVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3dvcmtQcm9kdWN0VHlwZXMnXS9FbGVtZW50W0BUeXBlPSdXb3JrUHJvZHVjdFR5cGUnXSIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRkb21haW5zKSA+IDAiPgotCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRkb21haW5zIj4KLQkJCQk8bWV0YSBuYW1lPSJ1bWEuY2F0ZWdvcnkiIGNvbnRlbnQ9IkBUeXBlOkBOYW1lOkBEaXNwbGF5TmFtZSIvPgotCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCTwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR3b3JrUHJvZHVjdFR5cGVzKSA+IDAiPgotCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR3b3JrUHJvZHVjdFR5cGVzIj4KLQkJCQk8bWV0YSBuYW1lPSJ1bWEuY2F0ZWdvcnkiIGNvbnRlbnQ9Inskd29ya1Byb2R1Y3RUeXBlcy9AVHlwZX06eyR3b3JrUHJvZHVjdFR5cGVzL0BOYW1lfTp7JHdvcmtQcm9kdWN0VHlwZXMvQERpc3BsYXlOYW1lfSIvPgotCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0YXNrTWV0YUluZm8iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRpc2NpcGxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2Rpc2NpcGxpbmVzJ10vRWxlbWVudFtAVHlwZT0nRGlzY2lwbGluZSddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGRpc2NpcGxpbmVzKSA+IDAiPgotCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRkaXNjaXBsaW5lcyI+Ci0JCQkJPG1ldGEgbmFtZT0idW1hLmNhdGVnb3J5IiBjb250ZW50PSJ7JGRpc2NpcGxpbmVzL0BUeXBlfTp7JGRpc2NpcGxpbmVzL0BOYW1lfTp7JGRpc2NpcGxpbmVzL0BEaXNwbGF5TmFtZX0iLz4KLQkJCTwveHNsOmZvci1lYWNoPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icm9sZU1ldGFJbmZvIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyb2xlU2V0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdyb2xlU2V0cyddL0VsZW1lbnRbQFR5cGU9J1JvbGVTZXQnXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRyb2xlU2V0cy9ATmFtZSAhPSAnJyI+Ci0JCQk8bWV0YSBuYW1lPSJ1bWEuY2F0ZWdvcnkiIGNvbnRlbnQ9Inskcm9sZVNldHMvQFR5cGV9Onskcm9sZVNldHMvQE5hbWV9Onskcm9sZVNldHMvQERpc3BsYXlOYW1lfSIvPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idG9vbE1lbnRvck1ldGFJbmZvIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0b29sIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ndG9vbCddL0VsZW1lbnQiLz4KLQkJPHhzbDppZiB0ZXN0PSIkdG9vbC9ATmFtZSAhPSAnJyI+Ci0JCQk8bWV0YSBuYW1lPSJ1bWEuY2F0ZWdvcnkiIGNvbnRlbnQ9InskdG9vbC9AVHlwZX06eyR0b29sL0BOYW1lfTp7JHRvb2wvQERpc3BsYXlOYW1lfSIvPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0icmVmTmFtZSIvPgotCQk8eHNsOnBhcmFtIG5hbWU9InJlZkVsZW1lbnQiLz4KLQkJPHhzbDppZiB0ZXN0PSIkcmVmRWxlbWVudCI+Ci0JCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRyZWZFbGVtZW50KT4wIj4KLQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWZOYW1lIi8+Ci0JCQkJCTwvdGg+Ci0JCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQk8dWw+Ci0JCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRyZWZFbGVtZW50Ij4KLQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQkJPC9saT4KLQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCTwvdWw+Ci0JCQkJCTwvdGQ+Ci0JCQkJPC90cj4KLQkJCTwveHNsOmlmPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50Ii8+Ci0JCTx4c2w6Y2hvb3NlPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50L0BVcmwgIT0gJycgIj4KLQkJCQk8YT4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGVsZW1lbnQvQERpc3BsYXlOYW1lIi8+Ci0JCQkJPC9hPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkZWxlbWVudC9ARGlzcGxheU5hbWUiLz4KLQkJCTwveHNsOm90aGVyd2lzZT4KLQkJPC94c2w6Y2hvb3NlPgotCTwveHNsOnRlbXBsYXRlPgkKLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb3B5cmlnaHQiLz4KLQkJPHRhYmxlIGNsYXNzPSJjb3B5cmlnaHQiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCTx0cj4KLQkJCQk8dGQgY2xhc3M9ImNvcHlyaWdodCI+Ci0JCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwvdGFibGU+Ci0JPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jb21wb3NpdGVyb2xlLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvY29tcG9zaXRlcm9sZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYTBhN2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jb21wb3NpdGVyb2xlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9InJlc291cmNlcy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iY29tbW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJvdmVydmlldy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ibWFpbl9kZXNjcmlwdGlvbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ia2V5X2NvbnNpZGVyYXRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9InByb3BlcnR5LnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J0Rlc2NyaXB0b3JEZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGVzY3JpcHRvckRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nRGVzY3JpcHRvckRlc2NyaXB0aW9uJ10iLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCi0JCTxodG1sPgkKLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Qcm9jZXNzRWxlbWVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL3Byb2Nlc3NFbGVtZW50RGF0YS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgJycsIGZhbHNlLCB0cnVlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4JCi0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+CQkJCQkJCi0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0aWVzU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnRpZXNUZXh0Ii8+PC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG11bHRpcGxlT2NjdXJyZW5jZXNUZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJ10iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG9wdGlvbmFsVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5lZFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJPC90YWJsZT4KLQkJPC9kaXY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhZ2dyZWdhdGVkUm9sZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nYWdncmVnYXRlZFJvbGVzJ10vRWxlbWVudCIvPgkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVGb3IiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ncmVzcG9uc2libGVGb3InXS9FbGVtZW50Ii8+CQkJCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGFnZ3JlZ2F0ZWRSb2xlcykgKyBjb3VudCgkcmVzcG9uc2libGVGb3IpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGFnZ3JlZ2F0ZWRSb2xlcykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFnZ3JlZ2F0ZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjMiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRhZ2dyZWdhdGVkUm9sZXMiPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcmVzcG9uc2libGVGb3IpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNwb25zaWJsZUZvclRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgY29sc3Bhbj0iMyI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHJlc3BvbnNpYmxlRm9yIj4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPHhzbDppZiB0ZXN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndXNhZ2VHdWlkYW5jZSddICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHVzYWdlVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSInVXNhZ2UgR3VpZGFuY2UnIi8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jb250ZW50Y2F0ZWdvcnkueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jb250ZW50Y2F0ZWdvcnkueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjFhNDljLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvY29udGVudGNhdGVnb3J5LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDUwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/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+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHN1YmRpc2NpcGxpbmVzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3ViZGlzY2lwbGluZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHN1YmRpc2NpcGxpbmVzIj4KLQkJCQkJCQkJCQk8eHNsOnNvcnQgZGF0YS10eXBlPSJ0ZXh0IiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIgb3JkZXI9ImFzY2VuZGluZyIgLz4KLQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQkJCQkJCQkJCi0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0ic2hvd0Rpc2NpcGxlR3JvdXBpbmciPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRpc2NpcGxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2Rpc2NpcGxpbmVzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZGlzY2lwbGluZXMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0iJGNhdGVnb3JpZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkaXNjaXBsaW5lc1RleHQiLz48L3RoPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZGlzY2lwbGluZXMiPgotCQkJCQkJCQk8eHNsOnNvcnQgZGF0YS10eXBlPSJ0ZXh0IiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIgb3JkZXI9ImFzY2VuZGluZyIgLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0ic2hvd0RvbWFpbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3ViZG9tYWlucyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdzdWJkb21haW5zJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndvcmtQcm9kdWN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSd3b3JrUHJvZHVjdHMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgkJCQkJCQotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRzdWJkb21haW5zKSArIGNvdW50KCR3b3JrUHJvZHVjdHMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0iJGNhdGVnb3JpZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkc3ViZG9tYWlucykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN1YmRvbWFpbnNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHN1YmRvbWFpbnMiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBkYXRhLXR5cGU9InRleHQiIHNlbGVjdD0iQERpc3BsYXlOYW1lIiBvcmRlcj0iYXNjZW5kaW5nIiAvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR3b3JrUHJvZHVjdHMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrUHJvZHVjdHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHdvcmtQcm9kdWN0cyI+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkJCQkJCQkJCQkJCQkKLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotICAgIDwveHNsOnRlbXBsYXRlPgotCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzaG93V29ya1Byb2R1Y3RUeXBlIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3b3JrUHJvZHVjdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nd29ya1Byb2R1Y3RzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkd29ya1Byb2R1Y3RzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNhdGVnb3JpZXNUZXh0Ii8+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0iJGNhdGVnb3JpZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrUHJvZHVjdHNUZXh0Ii8+PC90aD4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHdvcmtQcm9kdWN0cyI+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InNob3dSb2xlU2V0R3JvdXBpbmciPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJvbGVTZXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3JvbGVTZXRzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcm9sZVNldHMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY2F0ZWdvcmllc1RleHQiLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkY2F0ZWdvcmllcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJvbGVTZXRzVGV4dCIvPjwvdGg+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRyb2xlU2V0cyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBkYXRhLXR5cGU9InRleHQiIHNlbGVjdD0iQERpc3BsYXlOYW1lIiBvcmRlcj0iYXNjZW5kaW5nIiAvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotICAgIDwveHNsOnRlbXBsYXRlPgotCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzaG93Um9sZVNldCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icm9sZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ncm9sZXMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRyb2xlcykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZXNUZXh0Ii8+PC90aD4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHJvbGVzIj4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0ic2hvd1Rvb2wiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRvb2xNZW50b3JzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3Rvb2xNZW50b3JzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkdG9vbE1lbnRvcnMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY2F0ZWdvcmllc1RleHQiLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkY2F0ZWdvcmllcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRvb2xNZW50b3JzVGV4dCIvPjwvdGg+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR0b29sTWVudG9ycyI+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InNob3dDdXN0b21DYXRlZ29yeSI+Ci0gIAkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjYXRlZ29yaXplZEVsZW1lbnRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2NhdGVnb3JpemVkRWxlbWVudHMnXS9FbGVtZW50Ii8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KCRjYXRlZ29yaXplZEVsZW1lbnRzKSA+IDAiPgotICAgICAgICAJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLSAgICAgICAgICAgIAk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY2F0ZWdvcmllc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgICAgICAgICAJCTx0ciB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICAgICAgICAgCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29udGVudHNUZXh0Ii8+PC90aD4KLSAgICAgICAgICAgICAgICAgICAJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0gICAgICAgICAgICAgICAgICAgICAgIAkJPHVsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGNhdGVnb3JpemVkRWxlbWVudHMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJPGxpPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCTxhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTwvYT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPC9saT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAJPC91bD4KLSAgICAgICAgICAgICAgICAgICAgIAk8L3RkPgotICAgICAgICAgICAgICAgICAgIAk8L3RyPgotICAgICAgICAgICAgCTwvdGFibGU+Ci0gICAgICAgICAJPC9kaXY+Ci0gICAgCTwveHNsOmlmPgotICAgIDwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9kZWxpdmVyYWJsZS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2RlbGl2ZXJhYmxlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUwM2ZhNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2RlbGl2ZXJhYmxlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9Indvcmtwcm9kdWN0LnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYXBwaW5nLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYWluX2Rlc2NyaXB0aW9uLnhzbCIvPgkKLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkZWxpdmVyYWJsZURlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nRGVsaXZlcmFibGVEZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncmVzcG9uc2libGVSb2xlJ10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0KLQkJPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIj4gCi0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYXBwaW5nIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPCEtLSA8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+IC0tPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxtZXRhIG5hbWU9InJvbGUiPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlUm9sZS9ARGlzcGxheU5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCAnJywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8YSBuYW1lPSJUb3AiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InB1cnBvc2VTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZWxpdmVyYWJsZURlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVsaXZlcmFibGVEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IndvcmtQcm9kdWN0SWxsdXN0cmF0aW9uc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGVsaXZlcmFibGVTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZWxpdmVyYWJsZURlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZWxpdmVyYWJsZURlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFpbG9yaW5nU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVsaXZlcmFibGVEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImRlbGl2ZXJhYmxlU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJleHRlcm5hbERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2V4dGVybmFsRGVzY3JpcHRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRlbGl2ZXJlZFdvcmtQcm9kdWN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdkZWxpdmVyZWRXb3JrUHJvZHVjdHMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnaW5nR3VpZGFuY2UiIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncGFja2FnaW5nR3VpZGFuY2UnXSIvPgotCQkKLQkJPHhzbDppZiB0ZXN0PSIkZXh0ZXJuYWxEZXNjcmlwdGlvbiAhPSAnJyBvciBjb3VudCgkZGVsaXZlcmVkV29ya1Byb2R1Y3RzKSA+IDAgb3IgJHBhY2thZ2luZ0d1aWRhbmNlICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRlbGl2ZXJhYmxlUHJvcGVydGllc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRleHRlcm5hbERlc2NyaXB0aW9uICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4dGVybmFsRGVzY3JpcHRpb25UZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGV4dGVybmFsRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGRlbGl2ZXJlZFdvcmtQcm9kdWN0cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRlbGl2ZXJlZFBhcnRzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZGVsaXZlcmVkV29ya1Byb2R1Y3RzIj4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHBhY2thZ2luZ0d1aWRhbmNlICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2luZ0luc3RydWN0aW9uc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkcGFja2FnaW5nR3VpZGFuY2UiLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvZGVzY3JpcHRvci54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2Rlc2NyaXB0b3IueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWNkN2QwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvZGVzY3JpcHRvci54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLQk8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2VzLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJjb21tb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im92ZXJ2aWV3LnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYWluX2Rlc2NyaXB0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJpbGx1c3RyYXRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImtleV9jb25zaWRlcmF0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJwcm9wZXJ0eS54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icmVmaW5lZERlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZWZpbmVkRGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncmVmaW5lZERlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkcmVmaW5lZERlc2NyaXB0aW9uICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1haW5EZXNjcmlwdGlvblRleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZVNpbmdsZUNlbGwiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkcmVmaW5lZERlc2NyaXB0aW9uIi8+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+CQotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9kZXNjcmlwdG9yX2hlbHBlci54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2Rlc2NyaXB0b3JfaGVscGVyLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBjYjlhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2Rlc2NyaXB0b3JfaGVscGVyLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkRGVzY3JpcHRvcnMiPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0b3JzIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29sc3BhbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIgc2VsZWN0PSJAU2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+CQkKLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZGVzY3JpcHRvcnMpID4gMCI+Ci0JCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvY2Vzc1VzYWdlVGV4dCIvPgkJCQotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29sc3BhbiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xzcGFuIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGRlc2NyaXB0b3JzIj4KLQkJCQkJCQk8bGk+Ci0JCQkJCQkJCTwhLS0gYWRkIHRoZSBwYXJlbnQgbGluayAtLT4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IkVsZW1lbnQiPgotCQkJCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJCQkmIzE2MDsmZ3Q7JiMxNjA7Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+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+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9ndWlkYW5jZV9oZWxwZXIueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9ndWlkYW5jZV9oZWxwZXIueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTU5ZWVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvZ3VpZGFuY2VfaGVscGVyLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFkZENoZWNrbGlzdHMiPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNoZWNrbGlzdHMiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2hlY2tsaXN0cykgPiAwIj4KLQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjaGVja2xpc3RzVGV4dCIvPgotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHVsPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRjaGVja2xpc3RzIj4KLQkJCQkJCQk8bGk+Ci0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTwvbGk+Ci0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC91bD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFkZENvbmNlcHRzIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb25jZXB0cyIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRjb25jZXB0cykgPiAwIj4KLQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb25jZXB0c1RleHQiLz4KLQkJCQk8L3RoPgotCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCTx1bD4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkY29uY2VwdHMiPgotCQkJCQkJCTxsaT4KLQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC9saT4KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3VsPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVzdGltYXRpb25Db25zaWRlcmF0aW9uc1RleHQiLz4KLQkJCQk8L3RoPgotCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCTx1bD4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIj4KLQkJCQkJCQk8bGk+Ci0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTwvbGk+Ci0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC91bD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFkZEV4YW1wbGVzIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJleGFtcGxlcyIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRleGFtcGxlcykgPiAwIj4KLQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleGFtcGxlc1RleHQiLz4KLQkJCQk8L3RoPgotCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCTx1bD4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZXhhbXBsZXMiPgotCQkJCQkJCTxsaT4KLQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC9saT4KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3VsPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkR3VpZGVsaW5lcyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZ3VpZGVsaW5lcyIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRndWlkZWxpbmVzKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGd1aWRlbGluZXNUZXh0Ii8+Ci0JCQkJPC90aD4KLQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGd1aWRlbGluZXMiPgotCQkJCQkJCTxsaT4KLQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC9saT4KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3VsPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkUmVwb3J0cyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0icmVwb3J0cyIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRyZXBvcnRzKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlcG9ydHNUZXh0Ii8+Ci0JCQkJPC90aD4KLQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHJlcG9ydHMiPgotCQkJCQkJCTxsaT4KLQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC9saT4KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3VsPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkUmV1c2FibGVBc3NldHMiPgotCQk8eHNsOnBhcmFtIG5hbWU9InJldXNhYmxlQXNzZXRzIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHJldXNhYmxlQXNzZXRzKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJldXNhYmxlQXNzZXRzVGV4dCIvPgotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHVsPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRyZXVzYWJsZUFzc2V0cyI+Ci0JCQkJCQkJPGxpPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHN1cHBvcnRpbmdNYXRlcmlhbHMpID4gMCI+Ci0JCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3VwcG9ydGluZ01hdGVyaWFsc1RleHQiLz4KLQkJCQk8L3RoPgotCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCTx1bD4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkc3VwcG9ydGluZ01hdGVyaWFscyI+Ci0JCQkJCQkJPGxpPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhZGRUZWNobmlxdWVzIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJ0ZWNobmlxdWVzIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHRlY2huaXF1ZXMpID4gMCI+Ci0JCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVjaG5pcXVlc1RleHQiLz4KLQkJCQk8L3RoPgotCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCTx1bD4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkdGVjaG5pcXVlcyI+Ci0JCQkJCQkJPGxpPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhZGRUZW1wbGF0ZXMiPgotCQk8eHNsOnBhcmFtIG5hbWU9InRlbXBsYXRlcyIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR0ZW1wbGF0ZXMpID4gMCI+Ci0JCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVtcGxhdGVzVGV4dCIvPgotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHVsPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR0ZW1wbGF0ZXMiPgotCQkJCQkJCTxsaT4KLQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC9saT4KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3VsPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkV2hpdGVQYXBlcnMiPgotCQk8eHNsOnBhcmFtIG5hbWU9IndoaXRlUGFwZXJzIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHdoaXRlUGFwZXJzKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdoaXRlcGFwZXJzVGV4dCIvPgotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHVsPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR3aGl0ZVBhcGVycyI+Ci0JCQkJCQkJPGxpPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhZGRUb29sTWVudG9ycyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0idG9vbE1lbnRvcnMiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkdG9vbE1lbnRvcnMpID4gMCI+Ci0JCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdG9vbE1lbnRvcnNUZXh0Ii8+Ci0JCQkJPC90aD4KLQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHRvb2xNZW50b3JzIj4KLQkJCQkJCQk8bGk+Ci0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTwvbGk+Ci0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC91bD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2d1aWRhbmNlX3dpdGhfYXR0YWNobWVudC54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2d1aWRhbmNlX3dpdGhfYXR0YWNobWVudC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZGEwMmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9ndWlkYW5jZV93aXRoX2F0dGFjaG1lbnQueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2VzLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJjb21tb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im1hcHBpbmcueHNsIi8+CQotCTx4c2w6aW5jbHVkZSBocmVmPSJvdmVydmlldy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iZ3VpZGFuY2VfaGVscGVyLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJlc2NhcGUueHNsIi8+CQotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdyZXNwb25zaWJsZVJvbGUnXS9FbGVtZW50W0BUeXBlPSdSb2xlJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0b29sIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ndG9vbCddL0VsZW1lbnRbQFR5cGU9J1Rvb2wnXSIvPgotCi0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFwcGluZyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC9tZXRhPgotCQkJCTx4c2w6aWYgdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rvb2xNZW50b3InIj4KLQkJCQkJPG1ldGEgbmFtZT0idG9vbCIgY29udGVudD0ieyR0b29sL0BEaXNwbGF5TmFtZX0iLz4KLQkJCQk8L3hzbDppZj4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bWV0YSBuYW1lPSJyb2xlIj4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNwb25zaWJsZVJvbGUvQERpc3BsYXlOYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgICcnLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTxhIG5hbWU9IlRvcCIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmZXJlbmNlTGlzdCIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudEVsZW1lbnRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2NvbnRlbnRFbGVtZW50cyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjYXRlZ29yaWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0NvbnRlbnRFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGNvbnRlbnRFbGVtZW50cykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY2F0ZWdvcmllc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRlZEVsZW1lbnRzVGV4dCIvPgotCQkJCQkJPC90aD4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGNvbnRlbnRFbGVtZW50cyI+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJtYWluRGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nbWFpbkRlc2NyaXB0aW9uJ10iLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImF0dGFjaG1lbnRzIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2F0dGFjaG1lbnRzJ10iLz4JCQkJCi0KLQkJPHhzbDppZiB0ZXN0PSIkbWFpbkRlc2NyaXB0aW9uICE9ICcnIG9yICRhdHRhY2htZW50cyAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZXNjcmlwdGlvblRleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4JCQkKLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRtYWluRGVzY3JpcHRpb24gIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWFpbkRlc2NyaXB0aW9uVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRtYWluRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkJCQotCQkJCQk8eHNsOmlmIHRlc3Q9IiRhdHRhY2htZW50cyAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhdHRhY2hlZEZpbGVzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQk8VUw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2F0dGFjaGVkRmlsZSddIj4KLQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJPGEgaHJlZj0ie0B1cmx9IiB0YXJnZXQ9Il9ibGFuayI+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+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL21pbGVzdG9uZS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL21pbGVzdG9uZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYzNhOTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9taWxlc3RvbmUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2VzLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJjb21tb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im92ZXJ2aWV3LnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYWluX2Rlc2NyaXB0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJrZXlfY29uc2lkZXJhdGlvbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0icHJvcGVydHkueHNsIi8+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nTWlsZXN0b25lJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJtaWxlc3RvbmVEZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J01pbGVzdG9uZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGVzY3JpcHRvckRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uJ10iLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCi0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPjwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSIgY29udGVudD0ieyRlbGVtZW50VHlwZX0iLz4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4JCQkJCi0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Qcm9jZXNzRWxlbWVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL3Byb2Nlc3NFbGVtZW50RGF0YS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgICcnLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0aWVzU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVzYWdlU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+CQkJCQkJCQotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJrZXlDb25zaWRlcmF0aW9uc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+CQkJCQkJCQotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4JCQkJCQkKLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0JCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InByb3BlcnRpZXNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydGllc1RleHQiLz48L2Rpdj4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCSAgICA8eHNsOmlmIHRlc3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2xpbmtUb1ByZWRlY2Vzc29yJ10vRWxlbWVudCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRwcmVkZWNlc3NvclRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2xpbmtUb1ByZWRlY2Vzc29yJ10vRWxlbWVudCIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdQbGFubmluZ0RhdGEnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5pbmdEYXRhVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J1BsYW5uaW5nRGF0YSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG11bHRpcGxlT2NjdXJyZW5jZXNUZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJ10iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRldmVudERyaXZlblRleHQiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzRXZlbnREcml2ZW4nXSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT25nb2luZyddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRvbmdvaW5nVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT25nb2luZyddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkb3B0aW9uYWxUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRwbGFubmVkVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+CQkJCQotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc1JlcGVhdGFibGUnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcmVwZWF0YWJsZVRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc1JlcGVhdGFibGUnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgkJCQkKLQkJCTwvdGFibGU+Ci0JCTwvZGl2PgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8eHNsOmlmIHRlc3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10gIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdXNhZ2VUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiR1c2FnZUd1aWRhbmNlVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndXNhZ2VHdWlkYW5jZSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+CQkJCQkKLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9vdXRjb21lLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvb3V0Y29tZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkM2EzMGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9vdXRjb21lLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9Indvcmtwcm9kdWN0LnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYXBwaW5nLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYWluX2Rlc2NyaXB0aW9uLnhzbCIvPgkKLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRjb21lRGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdXb3JrUHJvZHVjdERlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQotCQk8aHRtbD4JCi0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIj4gCi0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYXBwaW5nIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICAnJywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8YSBuYW1lPSJUb3AiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InB1cnBvc2VTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRvdXRjb21lRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRvdXRjb21lRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3b3JrUHJvZHVjdElsbHVzdHJhdGlvbnNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkb3V0Y29tZURlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFpbG9yaW5nU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkb3V0Y29tZURlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvb3ZlcnZpZXcueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9vdmVydmlldy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5Y2I3MmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9vdmVydmlldy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw2MDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iYmFja1BhdGgiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVmaXgiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdwcmVmaXgnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdicmllZkRlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzeW5vbnltcyIgc2VsZWN0PSJyZWZlcmVuY2UvRWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3N5bm9ueW1zJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJleHRlcm5hbElkIiBzZWxlY3Q9InJlZmVyZW5jZS9FbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0nZXh0ZXJuYWxJZCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iQFNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQk8ZGl2IGlkPSJwYWdlLWd1aWQiPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2d1aWQnXSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJPC9kaXY+Ci0JCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJPHRyPgotCQkJCTx0ZCBjbGFzcz0icGFnZVRpdGxlIiBub3dyYXA9InRydWUiPgotCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnQ3VzdG9tQ2F0ZWdvcnknIG9yICRlbGVtZW50VHlwZSA9ICdTdXBwb3J0aW5nTWF0ZXJpYWwnIG9yICRlbGVtZW50VHlwZSA9ICdTdW1tYXJ5JyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgkJCQkJCQkKLQkJCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQgPSAndHJ1ZSciPgotCQkJCQkJCQkJPHhzbDpjaG9vc2U+CQkJCQkJCQkJCQotCQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVGFza0Rlc2NyaXB0b3InIj4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YXNrVGV4dCIvPgotCQkJCQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdSb2xlRGVzY3JpcHRvciciPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJvbGVUZXh0Ii8+Ci0JCQkJCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1dvcmtQcm9kdWN0RGVzY3JpcHRvciciPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtQcm9kdWN0VGV4dCIvPgotCQkJCQkJCQkJCTwveHNsOndoZW4+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+Ci0JCQkJCQkJCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJCQkJCQk8L3RkPgotCQkJCQkJCQkJCQkJPC90cj4KLQkJCQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCQkJCQk8L3RhYmxlPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3RhYmxlPgotCQkJCTwvZGl2PgotCQkJPC94c2w6b3RoZXJ3aXNlPgotCQk8L3hzbDpjaG9vc2U+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImVsZW1lbnRUeXBlVGV4dCI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiLz4KLQkJPHhzbDpjaG9vc2U+CQkJCQkJCQkJCQotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdBY3Rpdml0eSciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFjdGl2aXR5VGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnQXJ0aWZhY3QnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhcnRpZmFjdFRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0NhcGFiaWxpdHlQYXR0ZXJuJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2FwYWJpbGl0eVBhdHRlcm5UZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdDaGVja2xpc3QnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjaGVja2xpc3RUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdDb21wb3NpdGVSb2xlJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29tcG9zaXRlUm9sZVRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0NvbmNlcHQnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb25jZXB0VGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnQ3VzdG9tQ2F0ZWdvcnknIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjdXN0b21DYXRlZ29yeVRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0RlbGl2ZXJhYmxlJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVsaXZlcmFibGVUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdEZWxpdmVyeVByb2Nlc3MnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZWxpdmVyeVByb2Nlc3NUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdEaXNjaXBsaW5lJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGlzY2lwbGluZVRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0Rpc2NpcGxpbmVHcm91cGluZyciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRpc2NpcGxpbmVHcm91cGluZ1RleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0RvbWFpbiciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRvbWFpblRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQkKLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnRXhhbXBsZSciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4YW1wbGVUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdHdWlkZWxpbmUnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRndWlkZWxpbmVUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdJdGVyYXRpb24nIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpdGVyYXRpb25UZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdNaWxlc3RvbmUnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtaWxlc3RvbmVUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdPdXRjb21lJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0Y29tZVRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1BoYXNlJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGhhc2VUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdQcmFjdGljZSciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByYWN0aWNlVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnUmVwb3J0JyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVwb3J0VGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnUmV1c2FibGVBc3NldCciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJldXNhYmxlQXNzZXRUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdSb2FkbWFwJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9hZG1hcFRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1JvbGUnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnUm9sZURlc2NyaXB0b3InIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlRGVzY3JpcHRvclRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1JvbGVTZXQnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlU2V0VGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnUm9sZVNldEdyb3VwaW5nJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZVNldEdyb3VwaW5nVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnU3VwcG9ydGluZ01hdGVyaWFsJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3VwcG9ydGluZ01hdGVyaWFsVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVGFzayciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhc2tUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUYXNrRGVzY3JpcHRvciciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhc2tEZXNjcmlwdG9yVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVGVhbVByb2ZpbGUnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZWFtUHJvZmlsZVRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1RlbXBsYXRlJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVtcGxhdGVUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUZXJtRGVmaW5pdGlvbiciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRlcm1EZWZpbml0aW9uVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVG9vbCciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRvb2xUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUb29sTWVudG9yJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdG9vbE1lbnRvclRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1doaXRlcGFwZXInIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3aGl0ZXBhcGVyVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnV29ya1Byb2R1Y3REZXNjcmlwdG9yJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29ya1Byb2R1Y3REZXNjcmlwdG9yVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnV29ya1Byb2R1Y3RUeXBlJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29ya1Byb2R1Y3RUeXBlVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJPC94c2w6b3RoZXJ3aXNlPgotCQk8L3hzbDpjaG9vc2U+CQotCTwveHNsOnRlbXBsYXRlPgotCQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icm9sZUtleUluZm8iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN5bm9ueW1zIiBzZWxlY3Q9InJlZmVyZW5jZS9FbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0nc3lub255bXMnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhc2VSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ndmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCddL0VsZW1lbnRbQFR5cGU9J1JvbGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJvbGVTZXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3JvbGVTZXRzJ10vRWxlbWVudFtAVHlwZT0nUm9sZVNldCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0ndmFyaWFiaWxpdHlUeXBlJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkc3lub255bXMgIT0gJyciPgotCQkJPHRyPgotCQkJCTx0ZD4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzeW5vbnltc1RleHQiLz4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkc3lub255bXMiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGJhc2VSb2xlKSA+IDAiPgotCQkJPHRyPgotCQkJCTx0ZD4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ3JlcGxhY2VzJyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlcGxhY2VzVGV4dCIvPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnY29udHJpYnV0ZXMnIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29udHJpYnV0ZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdleHRlbmRzUmVwbGFjZXMnIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZW5kc1JlcGxhY2VzVGV4dCIvPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+CQkJCQkJCi0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnZXh0ZW5kcyciPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleHRlbmRzVGV4dCIvPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGJhc2VSb2xlIj4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcm9sZVNldHMpID4gMCI+Ci0JCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNpemUiIHNlbGVjdD0iY291bnQoJHJvbGVTZXRzKSIvPgotCQkJPHRyPgotCQkJCTx0ZD4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlU2V0c1RleHQiLz4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkcm9sZVNldHMiPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSAhPSAkc2l6ZSI+LCYjMTYwOzwveHNsOmlmPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJvbGVEZXNjcmlwdG9yS2V5SW5mbyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic291cmNlUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J1JvbGUnXS9FbGVtZW50W0BUeXBlPSdSb2xlJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkc2hvd0Z1bGxNZXRob2RDb250ZW50ID0gJ2ZhbHNlJyBhbmQgY291bnQoJHNvdXJjZVJvbGUpID4gMCI+Ci0JCQk8dHI+Ci0JCQkJPHRkPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhc2VkT25NZXRob2RSb2xlVGV4dCIvPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRzb3VyY2VSb2xlIj4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idGFza0tleUluZm8iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRpc2NpcGxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2Rpc2NpcGxpbmVzJ10vRWxlbWVudFtAVHlwZT0nRGlzY2lwbGluZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFzZVRhc2siIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSd2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J3ZhcmlhYmlsaXR5VHlwZSddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGRpc2NpcGxpbmVzKSA+IDAiPgotCQkJPHRyPgotCQkJCTx0ZD4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkaXNjaXBsaW5lc1RleHQiLz4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZGlzY2lwbGluZXMiPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGRpc2NpcGxpbmVzKSA+IHBvc2l0aW9uKCkiPiwmIzE2MDs8L3hzbDppZj4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGJhc2VUYXNrKSA+IDAiPgotCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZGlzY2lwbGluZXMpID4gMCI+Ci0JCQkJCQkJPGJyLz4KLQkJCQkJCTwveHNsOmlmPgotCQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ3JlcGxhY2VzJyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXBsYWNlc1RleHQiLz4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJCTwveHNsOmlmPgotCQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2NvbnRyaWJ1dGVzJyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb250cmlidXRlc1RleHQiLz4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJCTwveHNsOmlmPgotCQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2V4dGVuZHNSZXBsYWNlcyciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZW5kc1JlcGxhY2VzVGV4dCIvPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnZXh0ZW5kcyciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZW5kc1RleHQiLz4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJCTwveHNsOmlmPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRiYXNlVGFzayI+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwveHNsOmlmPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idGFza0Rlc2NyaXB0b3JLZXlJbmZvIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzb3VyY2VUYXNrIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0nVGFzayddL0VsZW1lbnRbQFR5cGU9J1Rhc2snXSIvPgkJCi0JCTx4c2w6aWYgdGVzdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCA9ICdmYWxzZScgYW5kIGNvdW50KCRzb3VyY2VUYXNrKSA+IDAiPgotCQkJPHRyPgotCQkJCTx0ZD4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYXNlZE9uTWV0aG9kVGFza1RleHQiLz4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkc291cmNlVGFzayI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9IndvcmtQcm9kdWN0RGVzY3JpcHRvcktleUluZm8iPgotCQk8eHNsOnBhcmFtIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNvdXJjZVdvcmtQcm9kdWN0IiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0nV29ya1Byb2R1Y3QnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6aWYgdGVzdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCA9ICdmYWxzZScgYW5kIGNvdW50KCRzb3VyY2VXb3JrUHJvZHVjdCkgPiAwIj4KLQkJCTx0cj4KLQkJCQk8dGQ+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFzZWRPbk1ldGhvZFdvcmtQcm9kdWN0VGV4dCIvPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRzb3VyY2VXb3JrUHJvZHVjdCI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9IndvcmtQcm9kdWN0S2V5SW5mbyI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZG9tYWlucyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdkb21haW5zJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhc2VXb3JrUHJvZHVjdCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id29ya1Byb2R1Y3RUeXBlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSd3b3JrUHJvZHVjdFR5cGVzJ10vRWxlbWVudFtAVHlwZT0nV29ya1Byb2R1Y3RUeXBlJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSd2YXJpYWJpbGl0eVR5cGUnXSIvPgotCQk8dHI+Ci0JCQk8dGQ+Ci0JCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZG9tYWlucykgPiAwIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkb21haW5zVGV4dCIvPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRkb21haW5zIj4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRkb21haW5zKSA+IHBvc2l0aW9uKCkiPiwmIzE2MDs8L3hzbDppZj4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkd29ya1Byb2R1Y3RUeXBlcykgPiAwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZG9tYWlucykgPiAwIj4KLQkJCQkJCTxici8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtQcm9kdWN0VHlwZXNUZXh0Ii8+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHdvcmtQcm9kdWN0VHlwZXMiPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHdvcmtQcm9kdWN0VHlwZXMpID4gcG9zaXRpb24oKSI+LCYjMTYwOzwveHNsOmlmPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRiYXNlV29ya1Byb2R1Y3QpID4gMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGRvbWFpbnMpICsgY291bnQoJHdvcmtQcm9kdWN0VHlwZXMpID4gMCI+Ci0JCQkJCQk8YnIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ3JlcGxhY2VzJyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlcGxhY2VzVGV4dCIvPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnY29udHJpYnV0ZXMnIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29udHJpYnV0ZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdleHRlbmRzUmVwbGFjZXMnIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZW5kc1JlcGxhY2VzVGV4dCIvPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnZXh0ZW5kcyciPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleHRlbmRzVGV4dCIvPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGJhc2VXb3JrUHJvZHVjdCI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQk8L3hzbDppZj4KLQkJCTwvdGQ+Ci0JCTwvdHI+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InRvb2xNZW50b3JLZXlJbmZvIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0b29sIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ndG9vbCddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYXNlRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0ndmFyaWFiaWxpdHlUeXBlJ10iLz4KLQkJPHRyPgotCQkJPHRkPgotCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHRvb2wpID4gMCI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdG9vbFRleHQiLz4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkdG9vbCI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRiYXNlRWxlbWVudCkgPiAwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkdG9vbCkgID4gMCI+Ci0JCQkJCQk8YnIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ3JlcGxhY2VzJyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlcGxhY2VzVGV4dCIvPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnY29udHJpYnV0ZXMnIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29udHJpYnV0ZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdleHRlbmRzUmVwbGFjZXMnIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZW5kc1JlcGxhY2VzVGV4dCIvPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnZXh0ZW5kcyciPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleHRlbmRzVGV4dCIvPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGJhc2VFbGVtZW50Ij4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCTwveHNsOmlmPgotCQkJPC90ZD4KLQkJPC90cj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXdTZXBhcmF0b3IiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx0YWJsZSBpZD0ib3ZlcnZpZXdTZXBhcmF0b3IiIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNsYXNzPSJvdmVydmlld1NlcGFyYXRvciI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgYWx0PSIiIHRpdGxlPSIiIGhlaWdodD0iMSIvPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQkJPHRyPgotCQkJCTx0ZD4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBhbHQ9IiIgdGl0bGU9IiIgaGVpZ2h0PSI1Ii8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwvdGFibGU+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3BhZ2Vfbm90X2luc3RhbGxlZC54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3BhZ2Vfbm90X2luc3RhbGxlZC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYTkzOWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9wYWdlX25vdF9pbnN0YWxsZWQueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJyZXNvdXJjZXMueHNsIi8+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+CQkKLQkJPGh0bWw+CQotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhZ2VOb3RJbnN0YWxsZWRUZXh0Ii8+PC90aXRsZT4KLQkJCTwvaGVhZD4JCQotCQkJPGJvZHk+Ci0JCQk8eHNsOmNob29zZT4KLQkJCQk8eHNsOndoZW4gdGVzdD0iQGludmFsaWRMaW5rIj4KLQkJCQkJPGI+PGgzPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudERvZXNOb3RFeGlzdFRleHQiLz48L2gzPjwvYj4KLQkJCQkJPHAvPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlzTm90VmFsaWRUZXh0Ii8+Ci0JCQkJCTxici8+CQotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRNaWdodEJlRGVsZXRlZFRleHQiLz4KLQkJCQkJPHAvPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBsZWFzZUZpeExpbmtUZXh0Ii8+CQkJCQkJCQkJCQotCQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOm90aGVyd2lzZT4KLQkJCQk8Yj48aDM+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtaXNzaW5nRWxlbWVudFRleHQiLz48L2gzPjwvYj4KLQkJCQk8cC8+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub3RBdmFpbGFibGVUZXh0Ii8+CQkJCQkJCQkKLQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCTwveHNsOmNob29zZT4KLQkJCTwvYm9keT4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9wcmFjdGljZS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3ByYWN0aWNlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhhNjI5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3ByYWN0aWNlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9Imd1aWRhbmNlLnhzbCIvPgkKLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+CQkKLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdyZXNwb25zaWJsZVJvbGUnXS9FbGVtZW50W0BUeXBlPSdSb2xlJ10iLz4KLQotICAgIAk8aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSI+Ci0JCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNwb25zaWJsZVJvbGUvQERpc3BsYXlOYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgICcnLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTxhIG5hbWU9IlRvcCIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24yIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+CQkJCQkJCi0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbjIiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN1YlByYWN0aWNlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdzdWJQcmFjdGljZXMnXS9FbGVtZW50Ii8+CQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnRSZWZlcmVuY2VzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2NvbnRlbnRSZWZlcmVuY2VzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFjdGl2aXR5UmVmZXJlbmNlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdhY3Rpdml0eVJlZmVyZW5jZXMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRjb250ZW50UmVmZXJlbmNlcykgKyBjb3VudCgkc3ViUHJhY3RpY2VzKSArIGNvdW50KCRhY3Rpdml0eVJlZmVyZW5jZXMpICsgY291bnQoJGNhdGVnb3JpZXMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0iJGNhdGVnb3JpZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJHN1YlByYWN0aWNlc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRzdWJQcmFjdGljZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNvbnRlbnRSZWZlcmVuY2VzVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0iJGNvbnRlbnRSZWZlcmVuY2VzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRhY3Rpdml0eVJlZmVyZW5jZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkYWN0aXZpdHlSZWZlcmVuY2VzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+CQkJCQkKLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotICAgIDwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkZXNjcmlwdGlvblNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J21haW5EZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJvYmxlbSIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdwcm9ibGVtJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrZ3JvdW5kIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2JhY2tncm91bmQnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImdvYWxzIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2dvYWxzJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhcHBsaWNhdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdhcHBsaWNhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibGV2ZWxzT2ZBZG9wdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdsZXZlbHNPZkFkb3B0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhZGRpdGlvbmFsSW5mbyIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdhZGRpdGlvbmFsSW5mbyddIi8+Ci0JCQotCQk8eHNsOmlmIHRlc3Q9IiRtYWluRGVzY3JpcHRpb24gIT0gJycgb3IgJHByb2JsZW0gIT0gJycgb3IgJGJhY2tncm91bmQgIT0gJycgb3IgJGdvYWxzICE9ICcnIG9yICRhcHBsaWNhdGlvbiAhPSAnJyBvciAkbGV2ZWxzT2ZBZG9wdGlvbiAhPSAnJyBvciAkYWRkaXRpb25hbEluZm8gIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVzY3JpcHRpb25UZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+CQkJCi0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkbWFpbkRlc2NyaXB0aW9uICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1haW5EZXNjcmlwdGlvblRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkbWFpbkRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRwcm9ibGVtICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb2JsZW1UZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHByb2JsZW0iLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGJhY2tncm91bmQgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja2dyb3VuZFRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkYmFja2dyb3VuZCIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkZ29hbHMgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZ29hbHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGdvYWxzIi8+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+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9yZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMDQzZDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9yZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyBUaGUgVUkgdGV4dCBpbiB0aGUgWFNMIHN0eWxlc2hlZXRzLgotCi0jCi0jIGJlZ2luIGVsZW1lbnQgdHlwZSB0ZXh0IHNlY3Rpb24KLSMgdXNlciBjYW4gY3VzdG9taXplIHRoZSB0eXBlIHRleHQgYmVmb3JlIHB1Ymxpc2hpbmcKLSMKLWFjdGl2aXR5VGV4dD1BY3Rpdml0eQotYXJ0aWZhY3RUZXh0PUFydGlmYWN0Ci1jYXBhYmlsaXR5UGF0dGVyblRleHQ9Q2FwYWJpbGl0eSBQYXR0ZXJuCi1jaGVja2xpc3RUZXh0PUNoZWNrbGlzdAotY29tcG9zaXRlUm9sZVRleHQ9Q29tcG9zaXRlIFJvbGUKLWNvbmNlcHRUZXh0PUNvbmNlcHQKLWN1c3RvbUNhdGVnb3J5VGV4dD1DdXN0b20gQ2F0ZWdvcnkKLWRlbGl2ZXJhYmxlVGV4dD1EZWxpdmVyYWJsZQotZGVsaXZlcnlQcm9jZXNzVGV4dD1EZWxpdmVyeSBQcm9jZXNzCi1kaXNjaXBsaW5lVGV4dD1EaXNjaXBsaW5lCi1kaXNjaXBsaW5lR3JvdXBpbmdUZXh0PURpc2NpcGxpbmUgR3JvdXBpbmcKLWRvbWFpblRleHQ9RG9tYWluCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNUZXh0PUVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMKLWV4YW1wbGVUZXh0PUV4YW1wbGUKLWd1aWRlbGluZVRleHQ9R3VpZGVsaW5lCi1pdGVyYXRpb25UZXh0PUl0ZXJhdGlvbgotbWlsZXN0b25lVGV4dD1NaWxlc3RvbmUKLW91dGNvbWVUZXh0PU91dGNvbWUKLXBoYXNlVGV4dD1QaGFzZQotcHJhY3RpY2VUZXh0PVByYWN0aWNlCi1yZXBvcnRUZXh0PVJlcG9ydAotcmV1c2FibGVBc3NldFRleHQ9UmV1c2FibGUgQXNzZXQKLXJvYWRtYXBUZXh0PVJvYWRtYXAKLXJvbGVUZXh0PVJvbGUKLXJvbGVEZXNjcmlwdG9yVGV4dD1Sb2xlIERlc2NyaXB0b3IKLXJvbGVTZXRUZXh0PVJvbGUgU2V0Ci1yb2xlU2V0R3JvdXBpbmdUZXh0PVJvbGUgU2V0IEdyb3VwaW5nCi1zdXBwb3J0aW5nTWF0ZXJpYWxUZXh0PVN1cHBvcnRpbmcgTWF0ZXJpYWwKLXRhc2tUZXh0PVRhc2sKLXRhc2tEZXNjcmlwdG9yVGV4dD1UYXNrIERlc2NyaXB0b3IKLXRlYW1Qcm9maWxlVGV4dD1UZWFtIFByb2ZpbGUKLXRlbXBsYXRlVGV4dD1UZW1wbGF0ZQotdGVybURlZmluaXRpb25UZXh0PVRlcm0gRGVmaW5pdGlvbgotdG9vbFRleHQ9VG9vbAotdG9vbE1lbnRvclRleHQ9VG9vbCBNZW50b3IKLXdoaXRlcGFwZXJUZXh0PVdoaXRlcGFwZXIKLXdvcmtQcm9kdWN0RGVzY3JpcHRvclRleHQ9V29yayBQcm9kdWN0IERlc2NyaXB0b3IKLXdvcmtQcm9kdWN0VHlwZVRleHQ9V29yayBQcm9kdWN0IEtpbmQKLQotIwotIyBlbmQgZWxlbWVudCB0eXBlIHRleHQgc2VjdGlvbgotIwotCi0jCi0jIG90aGVyIGxheW91dCB0ZXh0IGJlbG93Ci0jCi1hZGRpdGlvbmFsSW5mb1RleHQ9QWRkaXRpb25hbCBJbmZvcm1hdGlvbgotYWRkaXRpb25hbFBlcmZvcm1lclRleHQ9QWRkaXRpb25hbCBQZXJmb3JtZXJzCi1hZ2dyZWdhdGVzVGV4dD1BZ2dyZWdhdGVzCi1hbHRlcm5hdGl2ZXNUZXh0PUFsdGVybmF0aXZlcwotYXBwbGljYXRpb25UZXh0PUFwcGxpY2F0aW9uCi0KLWFzc2V0c1RleHQ9QXNzZXRzCi1hc3NpZ25tZW50QXBwcm9hY2hlc1RleHQ9QXNzaWdubWVudCBBcHByb2FjaGVzCi1hc3Npc3RpbmdUZXh0PUFzc2lzdGluZwotYXR0YWNoZWRGaWxlc1RleHQ9QXR0YWNoZWQgRmlsZXMKLWJhY2tncm91bmRUZXh0PUJhY2tncm91bmQKLWJyaWVmT3V0bGluZVRleHQ9QnJpZWYgT3V0bGluZQotY2F0ZWdvcmllc1RleHQ9Q2F0ZWdvcmllcwotY2hlY2tJdGVtc1RleHQ9Q2hlY2sgSXRlbXMKLWNoZWNrbGlzdHNUZXh0PUNoZWNrbGlzdHMKLWNvbGxhcHNlQWxsVGV4dD1Db2xsYXBzZSBBbGwgQ2hlY2sgSXRlbXMKLQotY29uY2VwdHNUZXh0PUNvbmNlcHRzCi1jb250YWluZWRBcnRpZmFjdHNUZXh0PUNvbnRhaW5lZCBBcnRpZmFjdHMKLWNvbnRhaW5lckFydGlmYWN0VGV4dD1Db250YWluZXIgQXJ0aWZhY3QKLWNvbnRlbnRFbGVtZW50c1RleHQ9Q2F0ZWdvcml6ZWQgRWxlbWVudHMKLWNvbnRlbnRSZWZlcmVuY2VzVGV4dD1Db250ZW50IFJlZmVyZW5jZXMKLQotZGVsaXZlcmFibGVQcm9wZXJ0aWVzVGV4dD1EZWxpdmVyYWJsZSBQcm9wZXJ0aWVzCi1kZWxpdmVyZWRQYXJ0c1RleHQ9RGVsaXZlcmFibGUgUGFydHMKLWRlbGl2ZXJlZFdvcmtQcm9kdWN0c1RleHQ9RGVsaXZlcmVkIFdvcmsgUHJvZHVjdHMKLWRlcGVuZGVudFRleHQ9RGVwZW5kZW50IFdvcmsgUHJvZHVjdHMKLWRlc2NyaXB0aW9uVGV4dD1EZXNjcmlwdGlvbgotZGVzY3JpcHRvcnNUZXh0PURlc2NyaXB0b3JzCi0KLWRpc2NpcGxpbmVzVGV4dD1EaXNjaXBsaW5lcwotc3ViZGlzY2lwbGluZXNUZXh0PVN1YmRpc2NpcGxpbmVzCi0KLWRvbWFpbnNUZXh0PURvbWFpbnMKLWV4YW1wbGVzVGV4dD1FeGFtcGxlcwotZXhwYW5kQWxsVGV4dD1FeHBhbmQgQWxsIENoZWNrIEl0ZW1zCi1leHRlbmRzVGV4dD1FeHRlbmRzCi1leHRlcm5hbFRleHQ9RXh0ZXJuYWwKLWV4dGVybmFsRGVzY3JpcHRpb25UZXh0PUV4dGVybmFsIERlc2NyaXB0aW9uCi1nb2Fsc1RleHQ9R29hbHMKLWd1aWRlbGluZXNUZXh0PUd1aWRlbGluZXMKLWlsbHVzdHJhdGlvbnNUZXh0PUlsbHVzdHJhdGlvbnMJCi1pbXBhY3RPZk5vdEhhdmluZ1RleHQ9SW1wYWN0IG9mIG5vdCBoYXZpbmcKLWltcGFjdGluZ1RleHQ9SW1wYWN0aW5nIFdvcmsgUHJvZHVjdHMKLWlucHV0c1RleHQ9SW5wdXRzCi1pbnB1dFRvVGV4dD1JbnB1dCBUbwotaXRlbXNUZXh0PUl0ZW1zCi1rZXlDb25zaWRlcmF0aW9uc1RleHQ9S2V5IENvbnNpZGVyYXRpb25zCi1sZXZlbHNPZkFkb3B0aW9uVGV4dD1MZXZlbHMgb2YgQWRvcHRpb24KLW1hbmRhdG9yeVRleHQ9TWFuZGF0b3J5Ci1tYWluVGV4dD1NYWluCi1tYWluRGVzY3JpcHRpb25UZXh0PU1haW4gRGVzY3JpcHRpb24KLW1haW5SZXNwb25zaWJsZVRleHQ9TWFpbiBSZXNwb25zaWJsZQotbWV0aG9kVGV4dD1NZXRob2QgV29yayBQcm9kdWN0Ci1tb2RpZmllZEJ5VGV4dD1Nb2RpZmllZCBCeQotbW9yZUluZm9UZXh0PU1vcmUgSW5mb3JtYXRpb24KLW5vdGF0aW9uVGV4dD1Ob3RhdGlvbgotb3B0aW9uYWxUZXh0PU9wdGlvbmFsCi0KLW91dHB1dEZyb21UZXh0PU91dHB1dCBGcm9tCi1vdXRwdXRzVGV4dD1PdXRwdXRzCi1wYWNrYWdpbmdJbnN0cnVjdGlvbnNUZXh0PVBhY2thZ2luZyBJbnN0cnVjdGlvbnMKLXBhY2thZ2luZ0d1aWRhbmNlVGV4dD1QYWNrYWdpbmcgR3VpZGFuY2UKLXBlcmZvcm1pbmdSb2xlc1RleHQ9UGVyZm9ybWluZyBSb2xlcwotcHJpbWFyeVBlcmZvcm1lclRleHQ9UHJpbWFyeSBQZXJmb3JtZXIKLXByb2JsZW1UZXh0PVByb2JsZW0KLXByb3BlcnRpZXNUZXh0PVByb3BlcnRpZXMKLXB1cnBvc2VUZXh0PVB1cnBvc2UKLXJlYXNvbnNGb3JOb3ROZWVkaW5nVGV4dD1SZWFzb25zIGZvciBub3QgbmVlZGluZwotcmVmZXJlbmNlV29ya2Zsb3dzVGV4dD1SZWZlcmVuY2UgV29ya2Zsb3dzCi1yZWxhdGVkRWxlbWVudHNUZXh0PVJlbGF0ZWQgRWxlbWVudHMKLXJlbGF0aW9uc2hpcHNUZXh0PVJlbGF0aW9uc2hpcHMKLXJlcG9ydHNUZXh0PVJlcG9ydHMKLXJlcHJlc2VudGF0aW9uT3B0aW9uc1RleHQ9UmVwcmVzZW50YXRpb24gT3B0aW9ucwotcmVzcG9uc2libGVUZXh0PVJlc3BvbnNpYmxlCi1yZXNwb25zaWJsZUZvclRleHQ9UmVzcG9uc2libGUgZm9yCi1yZXVzYWJsZUFzc2V0c1RleHQ9UmV1c2FibGUgQXNzZXRzCi0KLXJvbGVzVGV4dD1Sb2xlcwotcm9sZVNldHNUZXh0PVJvbGUgU2V0cwotc2tpbGxzVGV4dD1Ta2lsbHMKLXN0YWZmaW5nVGV4dD1TdGFmZmluZwotc3RlcHNUZXh0PVN0ZXBzCi1zdWJjYXRlZ29yaWVzVGV4dD1TdWItQ2F0ZWdvcmllcwkKLXN1YmRvbWFpbnNUZXh0PVN1YmRvbWFpbnMKLXN1YlByYWN0aWNlc1RleHQ9U3ViLVByYWN0aWNlcwotc3VwZXJUZWFtVGV4dD1TdXBlci1UZWFtIFByb2ZpbGUKLXN1cHBvcnRpbmdNYXRlcmlhbHNUZXh0PVN1cHBvcnRpbmcgTWF0ZXJpYWxzCi1zdWJ0ZWFtc1RleHQ9U3ViLVRlYW1zIFByb2ZpbGVzCi1zeW5vbnltc1RleHQ9U3lub255bXMKLXRhaWxvcmluZ1RleHQ9VGFpbG9yaW5nCi0KLXRhc2tzVGV4dD1UYXNrcwotdGJzVGV4dD1UZWFtIEFsbG9jYXRpb24KLQotdGVhbVJvbGVzVGV4dD1UZWFtIFByb2ZpbGUgUm9sZXMKLXRlY2huaXF1ZXNUZXh0PUd1aWRlbGluZXMKLXRlbXBsYXRlc1RleHQ9VGVtcGxhdGVzCi10b29sTWVudG9yc1RleHQ9VG9vbCBNZW50b3JzCi0KLXVzYWdlVGV4dD1Vc2FnZQotd2JzVGV4dD1Xb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUKLXdoaXRlcGFwZXJzVGV4dD1XaGl0ZXBhcGVycwotd29ya1Byb2R1Y3RzVGV4dD1Xb3JrIFByb2R1Y3RzCi13b3JrUHJvZHVjdFR5cGVzVGV4dD1Xb3JrIFByb2R1Y3QgS2luZHMKLXdwYnNUZXh0PVdvcmsgUHJvZHVjdCBVc2FnZQotd29ya0JyZWFrZG93blRleHQ9V29yayBCcmVha2Rvd24KLXdvcmtmbG93VGV4dD1Xb3JrZmxvdwotd29ya1Byb2R1Y3RCcmVha2Rvd25UZXh0PVdvcmsgUHJvZHVjdCBCcmVha2Rvd24KLXdvcmtQcm9kdWN0RGVwZW5kZW5jaWVzVGV4dD1Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jaWVzCi10ZWFtUHJvZmlsZUJyZWFrZG93blRleHQ9VGVhbSBCcmVha2Rvd24KLXRlYW1TdHJ1Y3R1cmVUZXh0PVRlYW0gU3RydWN0dXJlCi1wYWdlTm90SW5zdGFsbGVkVGV4dD1QYWdlIE5vdCBJbnN0YWxsZWQKLWVsZW1lbnREb2VzTm90RXhpc3RUZXh0PUVsZW1lbnQgRG9lcyBOb3QgRXhpc3QKLWlzTm90VmFsaWRUZXh0PVRoZSByZWZlcmVuY2VkIGVsZW1lbnQgaXMgbm90IGEgdmFsaWQgZWxlbWVudCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5LgotZWxlbWVudE1pZ2h0QmVEZWxldGVkVGV4dD1UaGUgZWxlbWVudCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgZnJvbSB0aGUgbGlicmFyeS4KLXBsZWFzZUZpeExpbmtUZXh0PVBsZWFzZSBjaGVjayB5b3VyIGNvbnRlbnQgbGlicmFyeSBhbmQgZml4IHRoZSBsaW5rLgotaW5mb0Fib3V0TWlzc2luZ0VsZW1lbnRUZXh0PUluZm9ybWF0aW9uIGFib3V0IHRoZSBtaXNzaW5nIGVsZW1lbnQ6Ci1lbGVtZW50TmFtZVRleHQ9RWxlbWVudCBOYW1lOgotZ3VpZFRleHQ9R1VJRDoKLW1pc3NpbmdFbGVtZW50VGV4dD1SZWZlcmVuY2VkIHBhZ2UgaXMgbm90IGluIHRoaXMgY29uZmlndXJhdGlvbgotbm90QXZhaWxhYmxlVGV4dD1UaGUgcmVmZXJlbmNlZCBwYWdlIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4gVGhpcyBwYWdlIG1heSBiZSBhdmFpbGFibGUgaW4gYW5vdGhlciBwcm9jZXNzIGNvbmZpZ3VyYXRpb24uCi1lbGVtZW50VHlwZVRleHQ9RWxlbWVudCBUeXBlOgotcGx1Z2luTmFtZVRleHQ9UGx1Zy1pbiBOYW1lOgotcHJlZGVjZXNzb3JUZXh0PVByZWRlY2Vzc29yCi1wbGFubmluZ0RhdGFUZXh0PVBsYW5uaW5nIERhdGEKLW11bHRpcGxlT2NjdXJyZW5jZXNUZXh0PU11bHRpcGxlIE9jY3VycmVuY2VzCi1ldmVudERyaXZlblRleHQ9RXZlbnQgRHJpdmVuCi1vbmdvaW5nVGV4dD1PbmdvaW5nCi1wbGFubmVkVGV4dD1QbGFubmVkCi1yZXBlYXRhYmxlVGV4dD1SZXBlYXRhYmxlCi11c2FnZUd1aWRhbmNlVGV4dD1Vc2FnZSBHdWlkYW5jZQotaW5wdXRzVGV4dD1JbnB1dHMKLW91dHB1dHNUZXh0PU91dHB1dHMKLWFjdGl2aXR5RW50cnlTdGF0ZVRleHQ9QWN0aXZpdHkgRW50cnkgU3RhdGUKLWFjdGl2aXR5RXhpdFN0YXRlVGV4dD1BY3Rpdml0eSBFeGl0IFN0YXRlCi1wcmVmaXhUZXh0PVByZWZpeAotZXh0ZXJuYWxJZFRleHQ9RXh0ZXJuYWwgSWQKLXNjb3BlVGV4dD1TY29wZQotCi10eXBlb2ZDb250cmFjdFRleHQ9VHlwZSBvZiBDb250cmFjdAotcHJvamVjdENoYXJhY3RlcmlzdGljc1RleHQ9UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3MKLXByb2plY3RNZW1iZXJFeHBlcnRpc2VUZXh0PVByb2plY3QgTWVtYmVyIEV4cGVydGlzZQotcmlza0xldmVsVGV4dD1SaXNrIExldmVsCi1zY2FsZVRleHQ9U2NhbGUKLXVzYWdlTm90ZXNUZXh0PVVzYWdlIE5vdGVzCi1jb250ZXh0VGV4dD1Db250ZXh0Ci1wYXJlbnRBY3Rpdml0aWVzVGV4dD1QYXJlbnQgQWN0aXZpdGllcwotaW5jbHVkZWRQYXR0ZXJuc1RleHQ9SW5jbHVkZWQgUGF0dGVybnMKLQotY29tbXVuaWNhdGlvbnNNYXRlcmlhbHNUZXh0PUNvbW11bmljYXRpb25zIE1hdGVyaWFscwotZWR1Y2F0aW9uTWF0ZXJpYWxzVGV4dD1FZHVjYXRpb24gTWF0ZXJpYWxzCi1lc3RpbWF0aW5nVGVjaG5pcXVlVGV4dD1Fc3RpbWF0aW5nIFRlY2huaXF1ZQotYWRkaXRpb25hbFRleHQ9QWRkaXRpb25hbAotbW9kaWZpZXNUZXh0PU1vZGlmaWVzCi1hZGRpdGlvbmFsbHlQZXJmb3Jtc1RleHQ9QWRkaXRpb25hbGx5IFBlcmZvcm1zCi1pbmRleFRleHQ9SW5kZXgKLXByZWZpeFRleHQ9UHJlZml4Ci1icmVha2Rvd25FbGVtZW50VGV4dD1CcmVha2Rvd24gRWxlbWVudAotc3RlcHNUZXh0PVN0ZXBzCi1wcmVkZWNlc3NvcnNUZXh0PVByZWRlY2Vzc29ycwotcmVwZWF0YWJsZVRleHQ9UmVwZWF0YWJsZQotdHlwZVRleHQ9VHlwZQotb25nb2luZ1RleHQ9T25nb2luZwotZXZlbnREcml2ZW5UZXh0PUV2ZW50LURyaXZlbgotbW9kZWxJbmZvVGV4dD1Nb2RlbCBJbmZvCi1lbnRyeVN0YXRlVGV4dD1FbnRyeSBTdGF0ZQotZXhpdFN0YXRlVGV4dD1FeGl0IFN0YXRlCi10ZWFtVGV4dD1UZWFtCi1wYXJlbnRQYWNrYWdlVGV4dD1QYXJlbnQgUGFja2FnZQotY29udGFpbmVkUGFja2FnZXNUZXh0PUNvbnRhaW5lZCBQYWNrYWdlcwotY29udGVudHNUZXh0PUNvbnRlbnRzCi1iYXNlZE9uTWV0aG9kUm9sZVRleHQ9QmFzZWQgb24gTWV0aG9kIFJvbGUKLWJhc2VkT25NZXRob2RUYXNrVGV4dD1CYXNlZCBvbiBNZXRob2QgVGFzawotYmFzZWRPbk1ldGhvZFdvcmtQcm9kdWN0VGV4dD1CYXNlZCBvbiBNZXRob2QgV29yayBQcm9kdWN0Ci1zdW1tYXJ5VGV4dD1TdW1tYXJ5Ci1wZXJmb3Jtc1RleHQ9UGVyZm9ybXMKLXJlcGxhY2VzVGV4dD1SZXBsYWNlcwotY29udHJpYnV0ZXNUZXh0PUNvbnRyaWJ1dGVzCi1ub25lVGV4dD1Ob25lCi0KLWFjdGl2aXR5UmVmZXJlbmNlc1RleHQ9QWN0aXZpdHkgUmVmZXJlbmNlcwotbmFtZVRleHQ9TmFtZQotcHJlc2VudGF0aW9uTmFtZVRleHQ9UHJlc2VudGF0aW9uIE5hbWUKLXJlcHJlc2VudGF0aW9uVGV4dD1TZWxlY3RlZCBSZXByZXNlbnRhdGlvbgotcHJvamVjdFNwZWNpZmljc1RleHQ9UHJvamVjdCBTcGVjaWZpY3MKLWV4dGVuZHNSZXBsYWNlc1RleHQ9RXh0ZW5kcyBhbmQgUmVwbGFjZXMKLXdvcmtQcm9kdWN0VGV4dD1Xb3JrIFByb2R1Y3QKLXByb2Nlc3NVc2FnZVRleHQ9UHJvY2VzcyBVc2FnZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcmVzb3VyY2VzLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcmVzb3VyY2VzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY3NGFiOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3Jlc291cmNlcy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCQotCQotPCEtLSB0aGUgZWxlbWVudCB0eXBlIHRleHQgLS0+Ci08eHNsOnBhcmFtIG5hbWU9ImFjdGl2aXR5VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJhcnRpZmFjdFRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iY2FwYWJpbGl0eVBhdHRlcm5UZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImNoZWNrbGlzdFRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iY29tcG9zaXRlUm9sZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iY29uY2VwdFRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iY3VzdG9tQ2F0ZWdvcnlUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImRlbGl2ZXJhYmxlVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJkZWxpdmVyeVByb2Nlc3NUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImRpc2NpcGxpbmVUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImRpc2NpcGxpbmVHcm91cGluZ1RleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iZG9tYWluVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImV4YW1wbGVUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9Imd1aWRlbGluZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iaXRlcmF0aW9uVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJtaWxlc3RvbmVUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9Im91dGNvbWVUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InBoYXNlVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJwcmFjdGljZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0icmVwb3J0VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJyZXVzYWJsZUFzc2V0VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJyb2FkbWFwVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJyb2xlVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJyb2xlRGVzY3JpcHRvclRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0icm9sZVNldFRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0icm9sZVNldEdyb3VwaW5nVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InRhc2tUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InRhc2tEZXNjcmlwdG9yVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJ0ZWFtUHJvZmlsZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0idGVtcGxhdGVUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InRlcm1EZWZpbml0aW9uVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJ0b29sVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJ0b29sTWVudG9yVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJ3aGl0ZXBhcGVyVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJ3b3JrUHJvZHVjdERlc2NyaXB0b3JUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9IndvcmtQcm9kdWN0VHlwZVRleHQiLz4KLQotPCEtLSBvdGhlciB0ZXh0IHZhcmlhYmxlcyAtLT4KLQk8eHNsOnBhcmFtIG5hbWU9ImFjdGl2aXR5RW50cnlTdGF0ZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYWRkaXRpb25hbEluZm9UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3Jtc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImFkZGl0aW9uYWxQZXJmb3JtZXJUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhZGRpdGlvbmFsVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYWdncmVnYXRlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImFsdGVybmF0aXZlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImFwcGxpY2F0aW9uVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYXNzZXRzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYXNzaWdubWVudEFwcHJvYWNoZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhc3Npc3RpbmdUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhdHRhY2hlZEZpbGVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYmFja2dyb3VuZFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImJhc2VkT25NZXRob2RSb2xlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYmFzZWRPbk1ldGhvZFRhc2tUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJiYXNlZE9uTWV0aG9kV29ya1Byb2R1Y3RUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJicmVha2Rvd25FbGVtZW50VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYnJpZWZPdXRsaW5lVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iY2F0ZWdvcmllc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNoZWNrSXRlbXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJjaGVja2xpc3RzVGV4dCIvPgotCi0JPHhzbDpwYXJhbSBuYW1lPSJjb2xsYXBzZUFsbFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNvbW11bmljYXRpb25zTWF0ZXJpYWxzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iY29uY2VwdHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJjb250YWluZWRBcnRpZmFjdHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJjb250YWluZXJBcnRpZmFjdFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnRFbGVtZW50c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnRSZWZlcmVuY2VzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJjb250ZXh0VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iY29udHJpYnV0ZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJkZWxpdmVyYWJsZVByb3BlcnRpZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJkZWxpdmVyZWRQYXJ0c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImRlcGVuZGVudFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRvcnNUZXh0Ii8+CQotCTx4c2w6cGFyYW0gbmFtZT0iZGlzY2lwbGluZXNUZXh0Ii8+Ci0KLQk8eHNsOnBhcmFtIG5hbWU9ImRvbWFpbnNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJlZHVjYXRpb25NYXRlcmlhbHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50RG9lc05vdEV4aXN0VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudE1pZ2h0QmVEZWxldGVkVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudE5hbWVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50VHlwZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImVudHJ5U3RhdGVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJlc3RpbWF0aW5nVGVjaG5pcXVlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZXZlbnREcml2ZW5UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJleGFtcGxlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImV4aXRTdGF0ZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImV4cGFuZEFsbFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImV4dGVuZHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJleHRlcm5hbERlc2NyaXB0aW9uVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZXh0ZXJuYWxJZFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImV4dGVybmFsVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZ29hbHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJndWlkZWxpbmVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZ3VpZFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImlsbHVzdHJhdGlvbnNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJpbXBhY3RpbmdUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJpbXBhY3RPZk5vdEhhdmluZ1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImluY2x1ZGVkUGF0dGVybnNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJpbmRleFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImluZm9BYm91dE1pc3NpbmdFbGVtZW50VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iaW5wdXRzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iaW5wdXRUb1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImlzTm90VmFsaWRUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJrZXlDb25zaWRlcmF0aW9uc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImxldmVsc09mQWRvcHRpb25UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJtYWluRGVzY3JpcHRpb25UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJtYWluUmVzcG9uc2libGVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJtYWluVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibWFuZGF0b3J5VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibWlzc2luZ0VsZW1lbnRUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJtb2RlbEluZm9UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJtb2RpZmllZEJ5VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibW9kaWZpZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJtb3JlSW5mb1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im11bHRpcGxlT2NjdXJyZW5jZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJub25lVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibm90YXRpb25UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJub3RBdmFpbGFibGVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJvbmdvaW5nVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ib3B0aW9uYWxUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJvdXRwdXRGcm9tVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ib3V0cHV0c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InBhY2thZ2luZ0d1aWRhbmNlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icGFja2FnaW5nSW5zdHJ1Y3Rpb25zVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icGFnZU5vdEluc3RhbGxlZFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InBhcmVudEFjdGl2aXRpZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwZXJmb3JtaW5nUm9sZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwZXJmb3Jtc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InBsYW5uZWRUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwbGFubmluZ0RhdGFUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwbGVhc2VGaXhMaW5rVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icGx1Z2luTmFtZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InByZWRlY2Vzc29yc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InByZWRlY2Vzc29yVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icHJlZml4VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icHJpbWFyeVBlcmZvcm1lclRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InByb2JsZW1UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icHJvamVjdE1lbWJlckV4cGVydGlzZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InByb2plY3RTcGVjaWZpY3NUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwcm9wZXJ0aWVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icHVycG9zZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InJlYXNvbnNGb3JOb3ROZWVkaW5nVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icmVmZXJlbmNlV29ya2Zsb3dzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icmVsYXRlZEVsZW1lbnRzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icmVsYXRpb25zaGlwc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InJlcGVhdGFibGVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyZXBsYWNlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InJlcG9ydHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyZXByZXNlbnRhdGlvbk9wdGlvbnNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyZXNwb25zaWJsZUZvclRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InJlc3BvbnNpYmxlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icmV1c2FibGVBc3NldHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyaXNrTGV2ZWxUZXh0Ii8+Ci0KLQk8eHNsOnBhcmFtIG5hbWU9InJvbGVTZXRzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icm9sZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJzY2FsZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InNjb3BlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ic2tpbGxzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ic3RhZmZpbmdUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJzdGVwc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InN1YmNhdGVnb3JpZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJzdWJkb21haW5zVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ic3ViUHJhY3RpY2VzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ic3ViVGVhbXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJzdW1tYXJ5VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFsc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InN5bm9ueW1zVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idGFpbG9yaW5nVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idGFza3NUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ0YnNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ0ZWFtUHJvZmlsZUJyZWFrZG93blRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InRlYW1Sb2xlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InRlYW1TdHJ1Y3R1cmVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ0ZWFtVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idGVjaG5pcXVlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InRlbXBsYXRlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InRvb2xNZW50b3JzVGV4dCIvPgotCi0JPHhzbDpwYXJhbSBuYW1lPSJ0eXBlb2ZDb250cmFjdFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InR5cGVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ1c2FnZUd1aWRhbmNlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idXNhZ2VOb3Rlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InVzYWdlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0id2JzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0id2hpdGVwYXBlcnNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ3b3JrQnJlYWtkb3duVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0id29ya2Zsb3dUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ3b3JrUHJvZHVjdEJyZWFrZG93blRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9IndvcmtQcm9kdWN0RGVwZW5kZW5jaWVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0id29ya1Byb2R1Y3RzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0id29ya1Byb2R1Y3RUeXBlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9IndwYnNUZXh0Ii8+Ci0KLQk8eHNsOnBhcmFtIG5hbWU9ImFjdGl2aXR5UmVmZXJlbmNlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNvbG9uX3dpdGhfc3BhY2UiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InN1YmRpc2NpcGxpbmVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icmVwcmVzZW50YXRpb25UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJleHRlbmRzUmVwbGFjZXNUZXh0Ii8+Ci0KLQk8eHNsOnBhcmFtIG5hbWU9IndvcmtQcm9kdWN0VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icHJvY2Vzc1VzYWdlVGV4dCIvPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9yb2xlLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcm9sZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4OTg3ZjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9yb2xlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9InJlc291cmNlcy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iY29tbW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJvdmVydmlldy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ibWFpbl9kZXNjcmlwdGlvbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iaWxsdXN0cmF0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJrZXlfY29uc2lkZXJhdGlvbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iZ3VpZGFuY2VfaGVscGVyLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJkZXNjcmlwdG9yX2hlbHBlci54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyb2xlRGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdSb2xlRGVzY3JpcHRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJvbGVTZXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3JvbGVTZXRzJ10vRWxlbWVudFtAVHlwZT0nUm9sZVNldCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0KLQkJPGh0bWw+CQotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPjwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSIgY29udGVudD0ieyRlbGVtZW50VHlwZX0iLz4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bWV0YSBuYW1lPSJyb2xlIiBjb250ZW50PSJ7JGVsZW1lbnRQcmVzZW50YXRpb25OYW1lfSIvPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCAgJycsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+CQotCQkJCQkJCTxhIG5hbWU9IlRvcCIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkcm9sZURlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaWxsdXN0cmF0aW9uc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3RhZmZpbmdTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkcm9sZURlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1zIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2FkZGl0aW9uYWxseVBlcmZvcm1zJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im1vZGlmaWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J21vZGlmaWVzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQk8dHI+Ci0JCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlU2luZ2xlQ2VsbCIgY29sc3Bhbj0iMiIgYWxpZ249ImNlbnRlciI+CQotCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9ImRpYWdyYW0iLz4KLQkJCQkJPC90ZD4KLQkJCQk8L3RyPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNhdGVnb3JpZXNUZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRhZGRpdGlvbmFsbHlQZXJmb3Jtc1RleHQiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0iJGFkZGl0aW9uYWxseVBlcmZvcm1zIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRtb2RpZmllc1RleHQiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0iJG1vZGlmaWVzIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCi0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZERlc2NyaXB0b3JzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0b3JzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2Rlc2NyaXB0b3JzJ10vRWxlbWVudCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29sc3BhbiIgc2VsZWN0PSInMSciLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJPC90YWJsZT4KLQkJPC9kaXY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NoZWNrbGlzdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDb25jZXB0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nR3VpZGVsaW5lJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nU3VwcG9ydGluZ01hdGVyaWFsJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1doaXRlcGFwZXInXSIvPgotCQkKLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2hlY2tsaXN0cykgKyBjb3VudCgkY29uY2VwdHMpICsgY291bnQoJGd1aWRlbGluZXMpICsgY291bnQoJHN1cHBvcnRpbmdNYXRlcmlhbHMpICsgY291bnQoJHdoaXRlUGFwZXJzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9yZUluZm9UZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENoZWNrbGlzdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0iJGNoZWNrbGlzdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENvbmNlcHRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSIkY29uY2VwdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEd1aWRlbGluZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0iJGd1aWRlbGluZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFN1cHBvcnRpbmdNYXRlcmlhbHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0iJHN1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFdoaXRlUGFwZXJzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSIkd2hpdGVQYXBlcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdGFmZmluZ1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNraWxscyIgc2VsZWN0PSJyZWZlcmVuY2UvRWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3NraWxscyddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYXNzaWdubWVudEFwcHJvYWNoZXMiIHNlbGVjdD0icmVmZXJlbmNlL0VsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdhc3NpZ25tZW50QXBwcm9hY2hlcyddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3lub255bXMiIHNlbGVjdD0icmVmZXJlbmNlL0VsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdzeW5vbnltcyddIi8+Ci0JCQotCQk8eHNsOmlmIHRlc3Q9IiRza2lsbHMgIT0gJycgb3IgJGFzc2lnbm1lbnRBcHByb2FjaGVzICE9ICcnIG9yICRzeW5vbnltcyAhPSAnJyAiID4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0YWZmaW5nVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHNraWxscyAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRza2lsbHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHNraWxscyIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkYXNzaWdubWVudEFwcHJvYWNoZXMgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXNzaWdubWVudEFwcHJvYWNoZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGFzc2lnbm1lbnRBcHByb2FjaGVzIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgkJCQotCQkJCQk8eHNsOmlmIHRlc3Q9IiRzeW5vbnltcyAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzeW5vbnltc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkc3lub255bXMiLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkKLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9yb2xlX2Rlc2NyaXB0b3IueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9yb2xlX2Rlc2NyaXB0b3IueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWY4OGIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcm9sZV9kZXNjcmlwdG9yLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9ImRlc2NyaXB0b3IueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Imd1aWRhbmNlX2hlbHBlci54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdSb2xlRGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icm9sZURlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nUm9sZURlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkZXNjcmlwdG9yRGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdEZXNjcmlwdG9yRGVzY3JpcHRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InF1ZXJ5U3RyaW5nIiBzZWxlY3Q9IkBxdWVyeVN0cmluZyIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlbFByb2Nlc3NQYXRoIiBzZWxlY3Q9IkByZWxQcm9jZXNzUGF0aCIvPgotCQk8aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJ7JGVsZW1lbnRUeXBlfSIvPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQWN0aXZpdHlUcmVlVGFibGUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvUHJvY2Vzc0VsZW1lbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBkZWZhdWx0UXVlcnlTdHIgPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRxdWVyeVN0cmluZyIvPic7Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sIGRlZmF1bHRRdWVyeVN0ciwgZmFsc2UsIHRydWUsIGZhbHNlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTxhIG5hbWU9IlRvcCIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVmaW5lZERlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbGx1c3RyYXRpb25zU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzdGFmZmluZ1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQkJY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UuZml4RGVzY3JpcHRvckxpbmtzKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0aWVzU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydGllc1RleHQiLz4KLQkJPC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG11bHRpcGxlT2NjdXJyZW5jZXNUZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJ10iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG9wdGlvbmFsVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5lZFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdQbGFubmluZ0RhdGEnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5pbmdEYXRhVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J1BsYW5uaW5nRGF0YSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdsaW5rVG9QcmVkZWNlc3NvciddL0VsZW1lbnQiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkcHJlZGVjZXNzb3JUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdsaW5rVG9QcmVkZWNlc3NvciddL0VsZW1lbnQiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCTwvdGFibGU+Ci0JCTwvZGl2PgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InVzYWdlR3VpZGFuY2UiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3VzYWdlR3VpZGFuY2UnXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiR1c2FnZUd1aWRhbmNlICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHVzYWdlR3VpZGFuY2VUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHVzYWdlR3VpZGFuY2UiLz4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InBlcmZvcm1zIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J1JvbGVEZXNjcmlwdG9yX1ByaW1hcnlUYXNrRGVzY3JpcHRvcnMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVGb3IiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ncmVzcG9uc2libGVGb3InXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nUm9sZURlc2NyaXB0b3JfQWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJtb2RpZmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdtb2RpZmllcyddL0VsZW1lbnQiLz4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPgotCQk8L2Rpdj4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQk8dHI+Ci0JCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPGI+PHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBlcmZvcm1zVGV4dCIvPjo8L3NwYW4+PC9iPgotCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcGVyZm9ybXMpID4gMCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHBlcmZvcm1zIj4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3hzbDppZj4KLQkJCQkJPC90ZD4KLQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiB2YWxpZ249InRvcCI+Ci0JCQkJCQk8Yj48c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVGb3JUZXh0Ii8+Ojwvc3Bhbj48L2I+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRyZXNwb25zaWJsZUZvcikgPiAwIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkcmVzcG9uc2libGVGb3IiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCTwveHNsOmlmPgotCQkJCQk8L3RkPgotCQkJCTwvdHI+Ci0JCQkJPHRyPgotCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHZhbGlnbj0idG9wIj4KLQkJCQkJCTxiPjxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhZGRpdGlvbmFsbHlQZXJmb3Jtc1RleHQiLz46PC9zcGFuPjwvYj4KLQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGFkZGl0aW9uYWxseVBlcmZvcm1zKSA+IDAiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRhZGRpdGlvbmFsbHlQZXJmb3JtcyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJPC94c2w6aWY+Ci0JCQkJCTwvdGQ+Ci0JCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPGI+PHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vZGlmaWVzVGV4dCIvPjo8L3NwYW4+PC9iPgotCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkbW9kaWZpZXMpID4gMCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG1vZGlmaWVzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3hzbDppZj4KLQkJCQkJPC90ZD4KLQkJCQk8L3RyPgotCQkJPC90YWJsZT4KLQkJPC9kaXY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NoZWNrbGlzdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDb25jZXB0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nR3VpZGVsaW5lJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nU3VwcG9ydGluZ01hdGVyaWFsJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1doaXRlcGFwZXInXSIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRjaGVja2xpc3RzKSArIGNvdW50KCRjb25jZXB0cykgKyBjb3VudCgkZ3VpZGVsaW5lcykgKyBjb3VudCgkc3VwcG9ydGluZ01hdGVyaWFscykgKyBjb3VudCgkd2hpdGVQYXBlcnMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb3JlSW5mb1RleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDaGVja2xpc3RzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9IiRjaGVja2xpc3RzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDb25jZXB0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0iJGNvbmNlcHRzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRHdWlkZWxpbmVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9IiRndWlkZWxpbmVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9IiRzdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRXaGl0ZVBhcGVycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0iJHdoaXRlUGFwZXJzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ic3RhZmZpbmdTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJza2lsbHMiIHNlbGVjdD0icmVmZXJlbmNlL0VsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdza2lsbHMnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFzc2lnbm1lbnRBcHByb2FjaGVzIiBzZWxlY3Q9InJlZmVyZW5jZS9FbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0nYXNzaWdubWVudEFwcHJvYWNoZXMnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN5bm9ueW1zIiBzZWxlY3Q9InJlZmVyZW5jZS9FbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0nc3lub255bXMnXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRza2lsbHMgIT0gJycgb3IgJGFzc2lnbm1lbnRBcHByb2FjaGVzICE9ICcnIG9yICRzeW5vbnltcyAhPSAnJyAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3RhZmZpbmdUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRza2lsbHMgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNraWxsc1RleHQiLz4KLQkJCQkJCQk8L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkc2tpbGxzIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRhc3NpZ25tZW50QXBwcm9hY2hlcyAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXNzaWdubWVudEFwcHJvYWNoZXNUZXh0Ii8+Ci0JCQkJCQkJPC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGFzc2lnbm1lbnRBcHByb2FjaGVzIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRzeW5vbnltcyAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3lub255bXNUZXh0Ii8+Ci0JCQkJCQkJPC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHN5bm9ueW1zIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3N1bW1hcnkueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9zdW1tYXJ5LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk5MzBkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3N1bW1hcnkueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2VzLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJjb21tb24ueHNsIi8+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz48eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+CQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQkKLQkJPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+CQkJCQotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCAgJycsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8YSBuYW1lPSJUb3AiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3VtbWFyeU92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCQkKLQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0icmVmZXJlbmNlTGlzdCI+Ci0JCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoRWxlbWVudCkgPiAwIj4KLQkJCQkJCQkJCTxoMiBjbGFzcz0iYmFubmVyIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2gyPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJFbGVtZW50Ij4KLQkJCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFR5cGVOYW1lIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8cC8+Ci0JCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCTwveHNsOmZvci1lYWNoPgkJCQkJCQkJCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+CQkJCQkJCi0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdW1tYXJ5T3ZlcnZpZXciPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdicmllZkRlc2NyaXB0aW9uJ10iLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN5bm9ueW1zIiBzZWxlY3Q9InJlZmVyZW5jZS9FbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0nc3lub255bXMnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImV4dGVybmFsSWQiIHNlbGVjdD0icmVmZXJlbmNlL0VsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdleHRlcm5hbElkJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQkKLQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCTx0cj4KLQkJCQk8dGQgY2xhc3M9InBhZ2VUaXRsZSI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3VtbWFyeVRleHQiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGV4dGVybmFsSWQgIT0gJyciPgotCQkJCQkJKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZXJuYWxJZCIvPikKLQkJCQkJPC94c2w6aWY+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwvdGFibGU+Ci0JCTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgotCQkJPHRyPgotCQkJCTx0ZCBjbGFzcz0icGFnZVRpdGxlU2VwYXJhdG9yIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBhbHQ9IiIgdGl0bGU9IiIgaGVpZ2h0PSIxIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwvdGFibGU+CQkKLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3RhaWxvcmluZy54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3RhaWxvcmluZy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NzFjZjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC90YWlsb3JpbmcueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0YWlsb3JpbmdTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltcGFjdE9mTm90SGF2aW5nIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2ltcGFjdE9mTm90SGF2aW5nJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZWFzb25zRm9yTm90TmVlZGluZyIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdyZWFzb25zRm9yTm90TmVlZGluZyddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVwcmVzZW50YXRpb25PcHRpb25zIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3JlcHJlc2VudGF0aW9uT3B0aW9ucyddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJGltcGFjdE9mTm90SGF2aW5nICE9ICcnIG9yICRyZWFzb25zRm9yTm90TmVlZGluZyAhPSAnJyBvciAkcmVwcmVzZW50YXRpb25PcHRpb25zICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhaWxvcmluZ1RleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGltcGFjdE9mTm90SGF2aW5nICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbXBhY3RPZk5vdEhhdmluZ1RleHQiLz4KLQkJCQkJCQk8L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkaW1wYWN0T2ZOb3RIYXZpbmciLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHJlYXNvbnNGb3JOb3ROZWVkaW5nICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWFzb25zRm9yTm90TmVlZGluZ1RleHQiLz4KLQkJCQkJCQk8L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkcmVhc29uc0Zvck5vdE5lZWRpbmciLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHJlcHJlc2VudGF0aW9uT3B0aW9ucyAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVwcmVzZW50YXRpb25PcHRpb25zVGV4dCIvPgotCQkJCQkJCTwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRyZXByZXNlbnRhdGlvbk9wdGlvbnMiLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvdGFzay54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3Rhc2sueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTZlNmFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvdGFzay54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQkKLQkJCQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2VzLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJjb21tb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im1hcHBpbmcueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im92ZXJ2aWV3LnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJwdXJwb3NlLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYWluX2Rlc2NyaXB0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJpbGx1c3RyYXRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImtleV9jb25zaWRlcmF0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJndWlkYW5jZV9oZWxwZXIueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImRlc2NyaXB0b3JfaGVscGVyLnhzbCIvPgotCQotCQkKLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idGFza0Rlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nVGFza0Rlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwZXJmb3JtaW5nUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3BlcmZvcm1lZEJ5J10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0JCQkKLQkJPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIj4gCi0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYXBwaW5nIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSI+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGVyZm9ybWluZ1JvbGUvQERpc3BsYXlOYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgJycsIHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InB1cnBvc2VTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiR0YXNrRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiR0YXNrRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzdGVwc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJHRhc2tEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+CQotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbGx1c3RyYXRpb25zU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJrZXlDb25zaWRlcmF0aW9uc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJHRhc2tEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFsdGVybmF0aXZlc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJHRhc2tEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4JCQkJCQkKLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCTwvc2NyaXB0PgotCi0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InBlcmZvcm1pbmdSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncGVyZm9ybWVkQnknXS9FbGVtZW50W0BUeXBlPSdSb2xlJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwZXJmb3JtaW5nUm9sZU5hbWUiIHNlbGVjdD0iJHBlcmZvcm1pbmdSb2xlL0BEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im1hbmRhdG9yeUlucHV0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdtYW5kYXRvcnlJbnB1dCddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJvcHRpb25hbElucHV0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdvcHRpb25hbElucHV0J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nb3V0cHV0J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCi0JCTx4c2w6aWYgdGVzdD0iJHBlcmZvcm1pbmdSb2xlTmFtZSAhPSAnJyBvciBjb3VudCgkY2F0ZWdvcmllcykgKyBjb3VudCgkYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkpICsgY291bnQoJG1hbmRhdG9yeUlucHV0cykgKyBjb3VudCgkb3B0aW9uYWxJbnB1dHMpICsgY291bnQoJG91dHB1dHMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGNhdGVnb3JpZXMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIyIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkY2F0ZWdvcmllcyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQkJCi0JCQkJCQotCQkJCQk8eHNsOmlmIHRlc3Q9IiRwZXJmb3JtaW5nUm9sZU5hbWUgIT0gJycgb3IgY291bnQoJGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHdpZHRoPSI0MiUiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcmltYXJ5UGVyZm9ybWVyVGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9IiRwZXJmb3JtaW5nUm9sZU5hbWUiPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGVyZm9ybWluZ1JvbGUvQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBlcmZvcm1pbmdSb2xlTmFtZSIvPjwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhZGRpdGlvbmFsUGVyZm9ybWVyVGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSkgPiAwIj4JCQkJCQkJCQkKLQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSI+Ci0JCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dHMpICsgY291bnQoJG9wdGlvbmFsSW5wdXRzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiB3aWR0aD0iNDIlIj4KLQkJCQkJCQkJPHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWFuZGF0b3J5VGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb3VudCgkbWFuZGF0b3J5SW5wdXRzKSA+IDAiPgotCQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG1hbmRhdG9yeUlucHV0cyI+CQkKLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4JCQkJCQkJCQotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4JCQkJCQkJCi0JCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJCTwveHNsOndoZW4+CQkJCQotCQkJCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5vbmVUZXh0Ii8+Ci0JCQkJCQkJCQkJPC9saT4JCQkJCQkJCQkKLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCTwveHNsOmNob29zZT4KLQkJCQkJCQk8L3RkPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG9wdGlvbmFsVGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb3VudCgkb3B0aW9uYWxJbnB1dHMpID4gMCI+Ci0JCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkb3B0aW9uYWxJbnB1dHMiPgkJCQkKLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4JCQkJCQkKLQkJCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+CQkJCQkJCQotCQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDp3aGVuPgkJCQkKLQkJCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub25lVGV4dCIvPgotCQkJCQkJCQkJCTwvbGk+CQkJCQkJCQkJCi0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCQkJPC90ZD4JCQkJCQotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG91dHB1dHMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIyIj4KLQkJCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG91dHB1dHMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPgotCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJCi0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGREZXNjcmlwdG9ycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRvcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZGVzY3JpcHRvcnMnXS9FbGVtZW50Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29sc3BhbiIgc2VsZWN0PSInMiciLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCi0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nQ2hlY2tsaXN0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NvbmNlcHQnXSIvPgkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nR3VpZGVsaW5lJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nU3VwcG9ydGluZ01hdGVyaWFsJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0b29sTWVudG9ycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1Rvb2xNZW50b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nV2hpdGVwYXBlciddIi8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyddIi8+Ci0KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2hlY2tsaXN0cykgKyBjb3VudCgkY29uY2VwdHMpICsgY291bnQoJGd1aWRlbGluZXMpICsgY291bnQoJHN1cHBvcnRpbmdNYXRlcmlhbHMpICsgY291bnQoJHRvb2xNZW50b3JzKSArIGNvdW50KCR3aGl0ZVBhcGVycykgKyBjb3VudCgkZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9yZUluZm9UZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENoZWNrbGlzdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0iJGNoZWNrbGlzdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENvbmNlcHRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSIkY29uY2VwdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEd1aWRlbGluZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0iJGd1aWRlbGluZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFN1cHBvcnRpbmdNYXRlcmlhbHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0iJHN1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFRvb2xNZW50b3JzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0b29sTWVudG9ycyIgc2VsZWN0PSIkdG9vbE1lbnRvcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFdoaXRlUGFwZXJzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSIkd2hpdGVQYXBlcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiBzZWxlY3Q9IiRlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdGVwc1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2VjdGlvbnMiIHNlbGVjdD0iJGRlc2NyaXB0aW9uL3JlZmVyZW5jZUxpc3RbQG5hbWU9J3NlY3Rpb25zJ10vRWxlbWVudFtAVHlwZT0nU2VjdGlvbiddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHNlY3Rpb25zKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3RlcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVTaW5nbGVDZWxsIj4KLQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHNlY3Rpb25zIj4KLQkJCQkJCQkJPGRpdiBjbGFzcz0ic3RlcEhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J25hbWUnXSIvPjwvZGl2PgotCQkJCQkJCQk8ZGl2IGNsYXNzPSJzdGVwQ29udGVudCI+Ci0JCQkJCQkJCQk8dGFibGUgY2xhc3M9InN0ZXBUYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJCQkJCTx0ZD4KLQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J3NlY3Rpb25EZXNjcmlwdGlvbiddIi8+Ci0JCQkJCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJCQkJPC90cj4KLQkJCQkJCQkJCTwvdGFibGU+Ci0JCQkJCQkJCTwvZGl2PgkJCQkJCQotCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGl2ZXNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFsdGVybmF0aXZlcyIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdhbHRlcm5hdGl2ZXMnXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRhbHRlcm5hdGl2ZXMgIT0gJycgIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFsdGVybmF0aXZlc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVTaW5nbGVDZWxsIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGFsdGVybmF0aXZlcyIvPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC90YXNrX2Rlc2NyaXB0b3IueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC90YXNrX2Rlc2NyaXB0b3IueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTNmYjFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvdGFza19kZXNjcmlwdG9yLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9ImRlc2NyaXB0b3IueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9InB1cnBvc2UueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Imd1aWRhbmNlX2hlbHBlci54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50SWQiIHNlbGVjdD0iQElkIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGVzY3JpcHRvckRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nRGVzY3JpcHRvckRlc2NyaXB0aW9uJ10iLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InBlcmZvcm1pbmdSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncGVyZm9ybWVkUHJpbWFyaWx5QnknXS9FbGVtZW50W0BUeXBlPSdSb2xlRGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icXVlcnlTdHJpbmciIHNlbGVjdD0iQHF1ZXJ5U3RyaW5nIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVsUHJvY2Vzc1BhdGgiIHNlbGVjdD0iQHJlbFByb2Nlc3NQYXRoIi8+CQkKLQkJPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0idW1hLmd1aWQiIGNvbnRlbnQ9InskZWxlbWVudElkfSIvPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSIgY29udGVudD0ieyRlbGVtZW50VHlwZX0iLz4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bWV0YSBuYW1lPSJyb2xlIj4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwZXJmb3JtaW5nUm9sZS9ARGlzcGxheU5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQWN0aXZpdHlUcmVlVGFibGUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvUHJvY2Vzc0VsZW1lbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBkZWZhdWx0UXVlcnlTdHIgPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRxdWVyeVN0cmluZyIvPic7Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sIGRlZmF1bHRRdWVyeVN0ciwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4JCQkJCQkJCQotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+CQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHVycG9zZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlZmluZWREZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN0ZXBzU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0aWVzU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImlsbHVzdHJhdGlvbnNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWx0ZXJuYXRpdmVzU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLQkJCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQkJCWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLmZpeERlc2NyaXB0b3JMaW5rcygpOwotCQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InByb3BlcnRpZXNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydGllc1RleHQiLz48L2Rpdj4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCSAgICA8eHNsOmlmIHRlc3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2xpbmtUb1ByZWRlY2Vzc29yJ10vRWxlbWVudCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRwcmVkZWNlc3NvclRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2xpbmtUb1ByZWRlY2Vzc29yJ10vRWxlbWVudCIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdQbGFubmluZ0RhdGEnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5pbmdEYXRhVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J1BsYW5uaW5nRGF0YSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG11bHRpcGxlT2NjdXJyZW5jZXNUZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJ10iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRldmVudERyaXZlblRleHQiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzRXZlbnREcml2ZW4nXSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT25nb2luZyddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRvbmdvaW5nVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT25nb2luZyddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkb3B0aW9uYWxUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRwbGFubmVkVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+CQkJCQotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc1JlcGVhdGFibGUnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcmVwZWF0YWJsZVRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc1JlcGVhdGFibGUnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgkJCQkKLQkJCTwvdGFibGU+Ci0JCTwvZGl2PgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idXNhZ2VHdWlkYW5jZSIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkdXNhZ2VHdWlkYW5jZSAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR1c2FnZUd1aWRhbmNlVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZVNpbmdsZUNlbGwiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkdXNhZ2VHdWlkYW5jZSIvPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgkKLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InBlcmZvcm1pbmdSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncGVyZm9ybWVkUHJpbWFyaWx5QnknXS9FbGVtZW50W0BUeXBlPSdSb2xlRGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nYWRkaXRpb25hbGx5UGVyZm9ybWVkQnknXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYXNzaXN0ZWRCeSIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdhc3Npc3RlZEJ5J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im1hbmRhdG9yeUlucHV0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdtYW5kYXRvcnlJbnB1dCddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJvcHRpb25hbElucHV0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdvcHRpb25hbElucHV0J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImV4dGVybmFsSW5wdXQiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZXh0ZXJuYWxJbnB1dCddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J291dHB1dCddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHBlcmZvcm1pbmdSb2xlKSArIGNvdW50KCRhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSkgKyBjb3VudCgkbWFuZGF0b3J5SW5wdXRzKSArIGNvdW50KCRvcHRpb25hbElucHV0cykgKyBjb3VudCgkb3V0cHV0cykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4JCQkJCQotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJvbGVzVGV4dCIvPjwvdGg+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHdpZHRoPSIzMCUiPgotCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWFpblRleHQiLz46Ci0JCQkJCQkJPC9zcGFuPgotCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHBlcmZvcm1pbmdSb2xlKSA+IDAiPgotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGVyZm9ybWluZ1JvbGUvQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBlcmZvcm1pbmdSb2xlL0BEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQk8L3RkPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiB3aWR0aD0iMzAlIj4JCi0JCQkJCQkJPHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4JCQkJCQkJCi0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYWRkaXRpb25hbFRleHQiLz46Ci0JCQkJCQkJPC9zcGFuPgotCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KSA+IDAiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCTwvdGQ+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXNzaXN0aW5nVGV4dCIvPjoKLQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkYXNzaXN0ZWRCeSkgPiAwIj4JCQkJCQkJCQkKLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkYXNzaXN0ZWRCeSI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+CQkJCQkKLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkbWFuZGF0b3J5SW5wdXRzKSArIGNvdW50KCRvcHRpb25hbElucHV0cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+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+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC90ZWFtcHJvZmlsZS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3RlYW1wcm9maWxlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBmMDYxMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3RlYW1wcm9maWxlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9InJlc291cmNlcy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iY29tbW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJvdmVydmlldy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ibWFpbl9kZXNjcmlwdGlvbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ia2V5X2NvbnNpZGVyYXRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9InByb3BlcnR5LnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkZXNjcmlwdG9yRGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdEZXNjcmlwdG9yRGVzY3JpcHRpb24nXSIvPgkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icXVlcnlTdHJpbmciIHNlbGVjdD0iQHF1ZXJ5U3RyaW5nIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVsUHJvY2Vzc1BhdGgiIHNlbGVjdD0iQHJlbFByb2Nlc3NQYXRoIi8+Ci0KLQkJPGh0bWw+CQotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPjwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSIgY29udGVudD0ieyRlbGVtZW50VHlwZX0iLz4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0FjdGl2aXR5VHJlZVRhYmxlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL1Byb2Nlc3NFbGVtZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvcHJvY2Vzc0VsZW1lbnREYXRhLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgZGVmYXVsdFF1ZXJ5U3RyID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcXVlcnlTdHJpbmciLz4nOwotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCBkZWZhdWx0UXVlcnlTdHIsIGZhbHNlLCB0cnVlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4JCi0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+CQkJCQkJCi0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0aWVzU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnRpZXNUZXh0Ii8+PC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG11bHRpcGxlT2NjdXJyZW5jZXNUZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJ10iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG9wdGlvbmFsVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5lZFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJPC90YWJsZT4KLQkJPC9kaXY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzdWJUZWFtcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdzdWJUZWFtJ10vRWxlbWVudCIvPgkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0idGVhbVJvbGVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3RlYW1Sb2xlcyddL0VsZW1lbnQiLz4KLQkJCQotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRzdWJUZWFtcykgKyBjb3VudCgkdGVhbVJvbGVzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRzdWJUZWFtcykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN1YlRlYW1zVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIzIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkc3ViVGVhbXMiPgotCQkJCQkJCQkJPHhzbDpzb3J0IGRhdGEtdHlwZT0idGV4dCIgc2VsZWN0PSJARGlzcGxheU5hbWUiIG9yZGVyPSJhc2NlbmRpbmciIC8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR0ZWFtUm9sZXMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZWFtUm9sZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjMiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR0ZWFtUm9sZXMiPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8eHNsOmlmIHRlc3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10gIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdXNhZ2VUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IidVc2FnZSBHdWlkYW5jZSciLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3VzYWdlR3VpZGFuY2UnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3dvcmtwcm9kdWN0LnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvd29ya3Byb2R1Y3QueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGEwNTJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvd29ya3Byb2R1Y3QueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi0JPHhzbDppbmNsdWRlIGhyZWY9InJlc291cmNlcy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iY29tbW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJvdmVydmlldy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0icHVycG9zZS54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ia2V5X2NvbnNpZGVyYXRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9InRhaWxvcmluZy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0id29ya3Byb2R1Y3RfaGVscGVyLnhzbCIvPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC93b3JrcHJvZHVjdF9oZWxwZXIueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC93b3JrcHJvZHVjdF9oZWxwZXIueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzJiNDkxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvd29ya3Byb2R1Y3RfaGVscGVyLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLQk8eHNsOmluY2x1ZGUgaHJlZj0iZ3VpZGFuY2VfaGVscGVyLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJkZXNjcmlwdG9yX2hlbHBlci54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0id29ya1Byb2R1Y3RJbGx1c3RyYXRpb25zU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idGVtcGxhdGVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nVGVtcGxhdGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlcG9ydHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdSZXBvcnQnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImV4YW1wbGVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nRXhhbXBsZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmV1c2FibGVBc3NldHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdSZXVzYWJsZUFzc2V0J10iLz4JCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHRlbXBsYXRlcykgKyBjb3VudCgkcmVwb3J0cykgKyBjb3VudCgkZXhhbXBsZXMpICsgY291bnQoJHJldXNhYmxlQXNzZXRzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaWxsdXN0cmF0aW9uc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkVGVtcGxhdGVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0ZW1wbGF0ZXMiIHNlbGVjdD0iJHRlbXBsYXRlcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVwb3J0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVwb3J0cyIgc2VsZWN0PSIkcmVwb3J0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRXhhbXBsZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImV4YW1wbGVzIiBzZWxlY3Q9IiRleGFtcGxlcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmV1c2FibGVBc3NldHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJldXNhYmxlQXNzZXRzIiBzZWxlY3Q9IiRyZXVzYWJsZUFzc2V0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250YWluZXJBcnRpZmFjdCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J2NvbnRhaW5lckFydGlmYWN0J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRhaW5lZEFydGlmYWN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdjb250YWluZWRBcnRpZmFjdHMnXS9FbGVtZW50W0BUeXBlPSdBcnRpZmFjdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVSb2xlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdyZXNwb25zaWJsZVJvbGVzJ10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibW9kaWZ5Um9sZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbW9kaWZ5Um9sZXMnXS9FbGVtZW50Ii8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJtYW5kYXRvcnlJbnB1dFRvVGFza3MiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbWFuZGF0b3J5SW5wdXRUb1Rhc2tzJ10vRWxlbWVudFtAVHlwZT0nVGFzayddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ib3B0aW9uYWxJbnB1dFRvVGFza3MiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nb3B0aW9uYWxJbnB1dFRvVGFza3MnXS9FbGVtZW50W0BUeXBlPSdUYXNrJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRGcm9tVGFza3MiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nb3V0cHV0RnJvbVRhc2tzJ10vRWxlbWVudFtAVHlwZT0nVGFzayddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCQkKLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2F0ZWdvcmllcykgKyBjb3VudCgkcmVzcG9uc2libGVSb2xlcykgKyBjb3VudCgkY29udGFpbmVyQXJ0aWZhY3QpICsgY291bnQoJGNvbnRhaW5lZEFydGlmYWN0cykgKyBjb3VudCgkbWFuZGF0b3J5SW5wdXRUb1Rhc2tzKSArIGNvdW50KCRvcHRpb25hbElucHV0VG9UYXNrcykgKyBjb3VudCgkb3V0cHV0RnJvbVRhc2tzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCi0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGNhdGVnb3JpZXMpID4gMCI+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+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza3MpICsgY291bnQoJG9wdGlvbmFsSW5wdXRUb1Rhc2tzKSArIGNvdW50KCRvdXRwdXRGcm9tVGFza3MpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YXNrc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgd2lkdGg9IjQyJSI+Ci0JCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0VG9UZXh0Ii8+OgotCQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG1hbmRhdG9yeUlucHV0VG9UYXNrcykgKyBjb3VudCgkb3B0aW9uYWxJbnB1dFRvVGFza3MpID4gMCI+Ci0JCQkJCQkJCSAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza3MpID4gMCI+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRtYW5kYXRvcnlJbnB1dFRvVGFza3MiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG9wdGlvbmFsSW5wdXRUb1Rhc2tzKSA+IDAiPgotCQkJCQkJCQkJICA8eHNsOmlmIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza3MpID4gMCI+PGJyLz48L3hzbDppZj4KLQkJCQkJCQkJCTx1bD4JCQotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkb3B0aW9uYWxJbnB1dFRvVGFza3MiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4JCQkJCQkJCQkJCi0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0RnJvbVRleHQiLz46Ci0JCQkJCQkJCTwvc3Bhbj4KLQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkb3V0cHV0RnJvbVRhc2tzKSA+IDAiPgkJCQkJCQkJCQotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkb3V0cHV0RnJvbVRhc2tzIj4KLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQk8L3RkPgkJCQkJCQkKLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQkKLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZERlc2NyaXB0b3JzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdG9ycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdkZXNjcmlwdG9ycyddL0VsZW1lbnQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb2xzcGFuIiBzZWxlY3Q9IicyJyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCi0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nQ2hlY2tsaXN0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NvbmNlcHQnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdHdWlkZWxpbmUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdTdXBwb3J0aW5nTWF0ZXJpYWwnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRvb2xNZW50b3JzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nVG9vbE1lbnRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdXaGl0ZXBhcGVyJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMnXSIvPgotCQkKLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2hlY2tsaXN0cykgKyBjb3VudCgkY29uY2VwdHMpICsgY291bnQoJGd1aWRlbGluZXMpICsgY291bnQoJHN1cHBvcnRpbmdNYXRlcmlhbHMpICsgY291bnQoJHRvb2xNZW50b3JzKSArIGNvdW50KCR3aGl0ZVBhcGVycykgKyBjb3VudCgkZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9yZUluZm9UZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENoZWNrbGlzdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0iJGNoZWNrbGlzdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENvbmNlcHRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSIkY29uY2VwdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEd1aWRlbGluZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0iJGd1aWRlbGluZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFN1cHBvcnRpbmdNYXRlcmlhbHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0iJHN1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFRvb2xNZW50b3JzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0b29sTWVudG9ycyIgc2VsZWN0PSIkdG9vbE1lbnRvcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFdoaXRlUGFwZXJzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSIkd2hpdGVQYXBlcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiBzZWxlY3Q9IiRlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiYjA1My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgTGlicmFyeQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgdG8gYW5hYmxlIHRoZSBleHRlZC1yZXBsYWNlIGZlYXR1cmUKLSNFbmFibGVFeHRlbmRSZXBsYWNlPXRydWUKLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBhMGM4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5uYXR1cmVzIgotICAgICAgICAgaWQ9InByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUiCi0gICAgICAgICBuYW1lPSJNZXRob2QgTGlicmFyeSBQcm9qZWN0IE5hdHVyZSI+Ci0gICAgICA8cnVudGltZT4KLSAgICAgICAgIDxydW4gY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUiPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L3J1bnRpbWU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgICAgaWQ9ImxpYnJhcnlNYW5hZ2VycyIKLSAgICAgICAgIG5hbWU9Ik1ldGhvZCBMaWJyYXJ5IE1hbmFnZXJzIgotICAgICAgICAgc2NoZW1hPSJzY2hlbWEvTGlicmFyeU1hbmFnZXJzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVsZW1lbnRMYXlvdXRFeHRlbnNpb25zIiBuYW1lPSJFbGVtZW50IGxheW91dCBFeHRlbnNpb25zIiBzY2hlbWE9InNjaGVtYS9lbGVtZW50TGF5b3V0RXh0ZW5zaW9ucy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJlbGVtZW50UmVhbGl6ZXJGYWN0b3J5IiBuYW1lPSJFbGVtZW50UmVhbGl6ZXIgRmFjdG9yeSIgc2NoZW1hPSJzY2hlbWEvZWxlbWVudFJlYWxpemVyRmFjdG9yeS5leHNkIi8+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+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NjaGVtYS9lbGVtZW50TGF5b3V0RXh0ZW5zaW9ucy5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc2NoZW1hL2VsZW1lbnRMYXlvdXRFeHRlbnNpb25zLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MWY4NWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc2NoZW1hL2VsZW1lbnRMYXlvdXRFeHRlbnNpb25zLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+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+amF2YS5uZXQuVVJJPC9jb2RlPgotCSAqLwotCXB1YmxpYyBqYXZhLm5ldC5VUkkgZ2V0TWV0aG9kTGlicmFyeVVSSSgpIHsKLQkJUmVzb3VyY2Ugc2F2ZWRSZXNvdXJjZSA9IGdldE1ldGhvZExpYnJhcnlSZXNvdXJjZSgpOwotCQlpZiAoc2F2ZWRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlVUkkgcmVzb3VyY2VVUkkgPSBzYXZlZFJlc291cmNlLmdldFVSSSgpOwotCQkJdHJ5IHsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZXNvdXJjZVVSSS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJcmV0dXJuIGZpbGUuZ2V0UGFyZW50RmlsZSgpLnRvVVJJKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIG5ldyBwYWNrYWdlcyBpbnRvIHRoZSBjb25maWd1cmF0aW9ucyBpZiB0aGUgcGFyZW50IGlzIGluIHRoZQotCSAqIGNvbmZpZ3VyYXRpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE5ld1BhY2thZ2VzVG9Db25maWd1cmF0aW9uKENvbGxlY3Rpb24gbmV3b2JqcykgewotCQlpZiAobmV3b2JqcyA9PSBudWxsIHx8IG5ld29ianMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpYnJhcnlNb2RpZmljYXRpb25IZWxwZXIgaGVscGVyID0gbmV3IExpYnJhcnlNb2RpZmljYXRpb25IZWxwZXIoKTsKLQotCQl0cnkgewotCQkJRU9iamVjdCBlLCBwYXJlbnQ7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbmV3b2Jqcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJZSA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKChlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkKLQkJCQkJCSYmICgocGFyZW50ID0gZS5lQ29udGFpbmVyKCkpICE9IG51bGwpCi0JCQkJCQkmJiAocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkpIHsKLQkJCQkJT2JqZWN0IGNvbmZpZ3MgPSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBwYXJlbnQpCi0JCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKEFzc29jaWF0aW9uSGVscGVyLk1ldGhvZFBhY2thZ2VfTWV0aG9kQ29uZmlndXJhdGlvbnMpOwotCQkJCQlpZiAoY29uZmlncyBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRjb25maWcgPSAoKExpc3QpIGNvbmZpZ3MpLml0ZXJhdG9yKCk7IGl0Y29uZmlnCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRjb25maWcKLQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJTGlzdCBwa2dzID0gY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJCQkJCQlpZiAoIXBrZ3MuY29udGFpbnMoZSkpIHsKLQkJCQkJCQkJLy8gcGtncy5hZGQoZSk7Ci0JCQkJCQkJCWhlbHBlcgotCQkJCQkJCQkJCS5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQkJCQljb25maWcsCi0JCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksCi0JCQkJCQkJCQkJCQllLCAtMSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQloZWxwZXIuc2F2ZSgpOwotCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQloZWxwZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdHlwZSBvZiBsaWJyYXJ5IHBlcnNpc3RlciB0byBiZSB1c2VkIGluIHRoaXMgbGlicmFyeSBtYW5hZ2VyCi0JICogCi0JICogQHJldHVybiB0aGUgbGlicmFyeSBwZXJzaXN0ZXIgdHlwZQotCSAqIEBzZWUgU2VydmljZXMjWE1JX1BFUlNJU1RFTkNFX1RZUEUKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldExpYnJhcnlQZXJzaXN0ZXJUeXBlKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUxpYnJhcnlSZXNvdXJjZVNldCBjcmVhdGVSZXNvdXJjZVNldCgpOwkKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9Db25maWd1cmF0aW9uQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0NvbmZpZ3VyYXRpb25BbHJlYWR5RXhpc3RzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZGJkNDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0NvbmZpZ3VyYXRpb25BbHJlYWR5RXhpc3RzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYSBNZXRob2QgQ29uZmlndXJhdGlvbiBhbHJlYWR5IGV4aXN0cy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbiBleHRlbmRzCi0JCUxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkFscmVhZHlFeGlzdHNFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkFscmVhZHlFeGlzdHNFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihyb290Q2F1c2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UgYW5kIHRoZSByb290IGNhdXNlIG9mIHRoZQotCSAqIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2csCi0JCQlUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKGVycm9yTXNnLCByb290Q2F1c2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0NvbmZpZ3VyYXRpb25NYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQ29uZmlndXJhdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZhOWI3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQ29uZmlndXJhdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuQ29uZmlndXJhdGlvbkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlLkRlcGVuZGVuY3lNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIE1hbmFnZXMgYSBtZXRob2QgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uTWFuYWdlciBpbXBsZW1lbnRzIElDb25maWd1cmF0aW9uTWFuYWdlciB7Ci0KLQkvLyBJZiB0cnVlLCBnZW5lcmF0ZSBkZWJ1ZyB0cmFjZXMuCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCS8vIFRoZSBtYW5hZ2VkIG1ldGhvZCBjb25maWd1cmFpdG9uLgotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkKLQkvLyBUaGUgbWFuYWdlZCBjb25maWd1cmFpdG9uIGRhdGEuCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uRGF0YSBjb25maWdEYXRhOwotCi0JLy8gVGhlIGNvbnRhaW5pbmcgbWV0aG9kIGxpYnJhcnkgZm9yIHRoZSBtYW5hZ2VkIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5IGxpYnJhcnk7Ci0KLQkvLyBUaGUgbGlicmFyeSBtYW5hZ2VyIGZvciB0aGUgY29udGFpbmluZyBtZXRob2QgbGlicmFyeS4KLQlwcm90ZWN0ZWQgSUxpYnJhcnlNYW5hZ2VyIGxpYnJhcnlNYW5hZ2VyOwotCi0JLy8gVGhlIGRlcGVuZGVuY3kgbWFuYWdlci4KLQlwcm90ZWN0ZWQgRGVwZW5kZW5jeU1hbmFnZXIgZGVwZW5kZW5jeU1hbmFnZXI7Ci0KLQkvLyBUaGUgbGF5b3V0IG1hbmFnZXIuCi0JcHJvdGVjdGVkIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXI7Ci0KLQkvLyBUaGUgY29uZmlndXJhdGlvbiBjbG9zdXJlLgotCXByb3RlY3RlZCBDb25maWd1cmF0aW9uQ2xvc3VyZSBjbG9zdXJlOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGFmY3A7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbk1hbmFnZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCWNvbmZpZ0RhdGEgPSBuZXcgQ29uZmlndXJhdGlvbkRhdGEoY29uZmlnKTsKLQotCQlsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldE1ldGhvZExpYnJhcnkoY29uZmlnKTsKLQotCQlsaWJyYXJ5TWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0TGlicmFyeU1hbmFnZXIobGlicmFyeSk7Ci0JCWFmY3AgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIobGlicmFyeU1hbmFnZXIKLQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0KLQkJZGVwZW5kZW5jeU1hbmFnZXIgPSBuZXcgRGVwZW5kZW5jeU1hbmFnZXIobGlicmFyeSk7Ci0KLQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQlsYXlvdXRNYW5hZ2VyID0gbmV3IEVsZW1lbnRMYXlvdXRNYW5hZ2VyKCk7Ci0JCX0gZWxzZSB7Ci0JCQlsYXlvdXRNYW5hZ2VyID0gbmV3IEVsZW1lbnRMYXlvdXRNYW5hZ2VyKGNvbmZpZyk7Ci0JCQkvLyBjbG9zdXJlID0gbmV3IENvbmZpZ3VyYXRpb25DbG9zdXJlKHRoaXMsIGNvbmZpZyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBtYW5hZ2VkIGJ5IHRoaXMgY29uZmlndXJhdGlvbiBtYW5hZ2VyLgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUNvbmZpZ3VyYXRpb25NYW5hZ2VyI2dldENvbmZpZ3VyYXRpb25EYXRhKCkKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkRhdGEgZ2V0Q29uZmlndXJhdGlvbkRhdGEoKSB7Ci0JCXJldHVybiBjb25maWdEYXRhOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBjb250YWluaW5nIG1ldGhvZCBsaWJyYXJ5IGZvciB0aGUgbWFuYWdlZCBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRNZXRob2RMaWJyYXJ5KCkgewotCQlyZXR1cm4gbGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBsaWJyYXJ5TWFuYWdlci5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0ZXIgZmFjdG9yeSBjb250ZW50IHByb3ZpZGVyLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGNvbnRlbnQgcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gYWZjcDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZXBlbmRlbmN5IG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiBhIGRlcGVuZGVuY3kgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBEZXBlbmRlbmN5TWFuYWdlciBnZXREZXBlbmRlbmN5TWFuYWdlcigpIHsKLQkJcmV0dXJuIGRlcGVuZGVuY3lNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVsZW1lbnQgbGF5b3V0IG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiBhbiBlbGVtZW50IGxheW91dCBtYW5hZ2VyCi0JICovCi0JcHVibGljIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGdldEVsZW1lbnRMYXlvdXRNYW5hZ2VyKCkgewotCQlyZXR1cm4gbGF5b3V0TWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb25maWd1cmF0aW9uIGNsb3N1cmUuCi0JICogCi0JICogQHJldHVybiBhIGNvbmZpZ3VyYXRpb24gY2xvc3VyZQotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uQ2xvc3VyZSBnZXRDb25maWd1cmF0aW9uQ2xvc3VyZSgpIHsKLQkJcmV0dXJuIGNsb3N1cmU7Ci0JfQotCi0JLyoqCi0JICogTWFrZXMgYSBjb25maWd1cmF0aW9uIGNsb3N1cmUuCi0JICovCi0JcHVibGljIHZvaWQgbWFrZUNvbmZpZ3VyYXRpb25DbG9zdXJlKCkgewotCQlpZiAoY2xvc3VyZSAhPSBudWxsKSB7Ci0JCQljbG9zdXJlLmZpeEVycm9ycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgbWV0aG9kIHBsdWctaW5zIGluIHRoZSBjb250YWluaW5nIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIG1ldGhvZCBwbHVnLWlucwotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1ldGhvZFBsdWdpbnMoKSB7Ci0JCXJldHVybiBsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQljb25maWdEYXRhLmRpc3Bvc2UoKTsKLQkJY29uZmlnRGF0YSA9IG51bGw7Ci0JCWNvbmZpZyA9IG51bGw7Ci0JCWxpYnJhcnkgPSBudWxsOwotCQlsaWJyYXJ5TWFuYWdlciA9IG51bGw7Ci0JCWRlcGVuZGVuY3lNYW5hZ2VyID0gbnVsbDsKLQkJbGF5b3V0TWFuYWdlciA9IG51bGw7Ci0JCWNsb3N1cmUgPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0NyZWF0ZUxpYnJhcnlNYW5hZ2VyRXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhMGQxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIExpYnJhcnkgTWFuYWdlciBpbnN0YW5jZSBjYW5ub3QgYmUgY3JlYXRlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVMaWJyYXJ5TWFuYWdlckV4Y2VwdGlvbiBleHRlbmRzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihyb290Q2F1c2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBDcmVhdGVMaWJyYXJ5TWFuYWdlckV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UgYW5kIHRoZSByb290IGNhdXNlIG9mIHRoZQotCSAqIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBDcmVhdGVMaWJyYXJ5TWFuYWdlckV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2csIFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIoZXJyb3JNc2csIHJvb3RDYXVzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUNvbmZpZ3VyYXRpb25DbG9zdXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUNvbmZpZ3VyYXRpb25DbG9zdXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNzMxZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lDb25maWd1cmF0aW9uQ2xvc3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuRWxlbWVudERlcGVuZGVuY3lFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24gQ2xvc3VyZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRpb25DbG9zdXJlIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiBhIGNvbmZpZ3VyYXRpb24gbWFuYWdlcgotCSAqLwotCXB1YmxpYyBJQ29uZmlndXJhdGlvbk1hbmFnZXIgZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRhaW5pbmluZyBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtZXRob2QgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzIHNlbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIG1ldGhvZCBwbHVnLWlucyBhbmQgcGFja2FnZXMKLQkgKi8KLQkvL3B1YmxpYyB2b2lkIHNldFNlbGVjdGlvbnMoT2JqZWN0W10gZWxlbWVudHMpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBtZXRob2QgcGx1Zy1pbiBvciBwYWNrYWdlIGlzIHNlbGVjdGVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGVsZW1lbnQgaXMgc2VsZWN0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKE9iamVjdCBpbnB1dCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBlbGVtZW50IGRlcGVuZGVuY3kgZXJyb3IgZm9yIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQGVsZW1lbnQgQSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIDxjb2RlPkVsZW1lbnREZXBlbmRlbmN5RXJyb3I8L2NvZGU+Ci0JICovCi0JcHVibGljIEVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZ2V0RXJyb3IoT2JqZWN0IGVsZW1lbnQpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNsb3N1cmUgaGFzIGFueSBlcnJvci4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjbG9zdXJlIGhhcyBvbmUgb3IgbW9yZSBlcnJvcnMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcigpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNsb3N1cmUgaGFzIGFueSBwcm9ibGVtLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNsb3N1cmUgaGFzIG9uZSBvciBtb3JlIHByb2JsZW1zLlwKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcm9ibGVtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgZXJyb3JzLgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIDxjb2RlPkVycm9ySW5mbzwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBbGxFcnJvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBkZXBlbmRlbmN5IGVycm9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIDxjb2RlPkVsZW1lbnREZXBlbmRlbmN5RXJyb3I8L2NvZGU+Ci0JICovCi0JcHVibGljIE9iamVjdFtdIGdldERlcGVuZGVuY3lFcnJvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBpbnZhbGlkIGVsZW1lbnRzLgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGludmFsaWQgZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbnZhbGlkRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBjaGFuZ2VkIGVsZW1lbnRzLiBUaGVzZSBhcmUgZWxlbWVudHMgd2hvc2UgY2hlY2sgc3RhdGVzCi0JICogaGF2ZSBjaGFuZ2VkIG9yIHdob3NlIGltYWdlIGhhdmUgY2hhbmdlZCBkdWUgdG8gZXJyb3IuCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgY2hhbmdlZCBtZXRob2QgZWxlbWVudHMKLQkgKi8KLQkvL3B1YmxpYyBMaXN0IGdldENoYW5nZWRFbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0aG9kIHBsdWctaW5zIGFuZCBwYWNrYWdlcyBzZWxlY3Rpb24uCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBtZXRob2QgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldFNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogZml4IHRoZSBlcnJvcnMgaW4gdGhlIGNvbmZpZ3VyYXRpb25zCi0JICovCi0JcHVibGljIHZvaWQgZml4RXJyb3JzKCk7Ci0KLQkvKioKLQkgKiBGaXhlcyBhbGwgZXJyb3JzIGFuZCB3YXJuaW5ncyBpbiB0aGUgY2xvc3VyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXhQcm9ibGVtcygpOwotCi0JLyoqCi0JICogU2F2ZXMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqLwotCS8vcHVibGljIHZvaWQgc2F2ZU1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFBhY2thZ2VzIHRoZSBsaWJyYXJ5IGJhc2VkIG9uIHRoZSBzZWxlY3Rpb24uCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyB3aWxsIGNoYW5nZSB0aGUgY3VycmVudCBsaWJyYXJ5LiBCZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZCwgYQotCSAqIGNvcHkgb2YgdGhlIGN1cnJlbnQgbGlicmFyeSBzaG91bGQgYmUgY3JlYXRlZCB3aXRoIHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci0JICogMS4gQ3JlYXRlIGEgbmV3IDxjb2RlPkNvbmZpZ3VyYXRpb25NYW5hZ2VyPC9jb2RlPiB3aXRoIGEgY29weSBvZiB0aGUKLQkgKiBvcmlnaW5hbCBsaWJyYXJ5LCAyLiBSZWJ1aWxkIHRoZSBkZXBlbmRlbmN5LCAzLiBDcmVhdGUgYQotCSAqIDxjb2RlPkNvbmZpZ3VyYXRpb25DbG9zdXJlPC9jb2RlPiB3aXRoIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHJlbW92ZUJyb2tlblJlZmVyZW5jZXMKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCByZW1vdmUgYWxsIGJyb2tlbiByZWZlcmVuY2VzCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgcGFja2FnZUxpYnJhcnkoYm9vbGVhbiByZW1vdmVCcm9rZW5SZWZlcmVuY2VzKTsKLQotCS8qKgotCSAqIERpc3Bvc2VzIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBjbG9zdXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lDb25maWd1cmF0aW9uTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lDb25maWd1cmF0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODZhZmNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JQ29uZmlndXJhdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuQ29uZmlndXJhdGlvbkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlLkRlcGVuZGVuY3lNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24gTWFuYWdlci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIHsKLQotCS8qKgotCSAqIEdldHMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIG1hbmFnZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uIG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQotCS8qKgotCSAqIEdldHMgQ29uZmlndXJhdGlvbkRhdGEgb2JqZWN0IG1hbmFnZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uIG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiBhIENvbmZpZ3VyYXRpb25EYXRhIG9iamVjdAotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uRGF0YSBnZXRDb25maWd1cmF0aW9uRGF0YSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGFpbmluZyBtZXRob2QgbGlicmFyeSBmb3IgdGhlIG1hbmFnZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0TWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhZGFwdGVyIGZhY3RvcnkgY29udGVudCBwcm92aWRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBjb250ZW50IHByb3ZpZGVyCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVwZW5kZW5jeSBtYW5hZ2VyLgotCSAqIAotCSAqIEByZXR1cm4gYSBkZXBlbmRlbmN5IG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgRGVwZW5kZW5jeU1hbmFnZXIgZ2V0RGVwZW5kZW5jeU1hbmFnZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVsZW1lbnQgbGF5b3V0IG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiBhbiBlbGVtZW50IGxheW91dCBtYW5hZ2VyCi0JICovCi0JcHVibGljIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGdldEVsZW1lbnRMYXlvdXRNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb25maWd1cmF0aW9uIGNsb3N1cmUuCi0JICogCi0JICogQHJldHVybiBhIGNvbmZpZ3VyYXRpb24gY2xvc3VyZQotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uQ2xvc3VyZSBnZXRDb25maWd1cmF0aW9uQ2xvc3VyZSgpOwotCi0JLyoqCi0JICogTWFrZXMgYSBjb25maWd1cmF0aW9uIGNsb3N1cmUuCi0JICovCi0JcHVibGljIHZvaWQgbWFrZUNvbmZpZ3VyYXRpb25DbG9zdXJlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBtZXRob2QgcGx1Zy1pbnMgaW4gdGhlIGNvbnRhaW5pbmcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgbWV0aG9kIHBsdWctaW5zCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWV0aG9kUGx1Z2lucygpOwotCQotCS8qKgotCSAqIERpc3Bvc2VzIGFsbCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbiBtYW5hZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lMaWJyYXJ5TWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lMaWJyYXJ5TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODBkZGQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JTGlicmFyeU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIExpYnJhcnkgTWFuYWdlci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxpYnJhcnlNYW5hZ2VyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIG5ldyBtZXRob2QgbGlicmFyeQotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBtZXRob2QgbGlicmFyeSBzcGVjaWZpYyBhcmd1bWVudHMKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBjcmVhdGVNZXRob2RMaWJyYXJ5KFN0cmluZyBuYW1lLAotCQkJTWFwPFN0cmluZywgT2JqZWN0PiBhcmdzKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBPcGVucyBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkgVVJJCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgb3Blbk1ldGhvZExpYnJhcnkoamF2YS5uZXQuVVJJIHVyaSkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE9wZW5zIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIG1ldGhvZCBsaWJyYXJ5IHNwZWNpZmljIGFyZ3VtZW50cwotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IG9wZW5NZXRob2RMaWJyYXJ5KE1hcDxTdHJpbmcsIE9iamVjdD4gYXJncykKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJlb3BlbnMgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgcmVvcGVuTWV0aG9kTGlicmFyeSgpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNhdmVzIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVNZXRob2RMaWJyYXJ5KCkgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRGlzY2FyZHMgYWxsIGNoYW5nZXMgbWFkZSB0byB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNjYXJkTWV0aG9kTGlicmFyeUNoYW5nZXMoKTsKLQotCS8qKgotCSAqIENsb3NlcyB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZU1ldGhvZExpYnJhcnkoKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldE1ldGhvZExpYnJhcnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGlicmFyeSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBVUkkgb2YgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk8L2NvZGU+Ci0JICovCi0JcHVibGljIGphdmEubmV0LlVSSSBnZXRNZXRob2RMaWJyYXJ5VVJJKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LiBGb3IgZGlzdHJpYnV0ZWQKLQkgKiBsaWJyYXJ5LCB0aGlzIGlzIHRoZSBsaWJyYXJ5J3Mgd29ya3NwYWNlIHBhdGguCi0JICogCi0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTGlicmFyeUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5Ci0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGVkaXRpbmcgZG9tYWluIGZvciB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGVkaXRpbmcgZG9tYWluCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCk7Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgYW4gZWRpdGluZyBkb21haW4gd2l0aCB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogICAgICAgICAgICBhbiBlZGl0aW5nIGRvbWFpbgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRWRpdGluZ0RvbWFpbihBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZG9tYWluKTsKLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byBtb25pdG9yIGNoYW5nZXMgdG8gdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGxpYnJhcnkgY2hhbmdlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgdGhhdCB3YXMgYWRkZWQgdG8gbW9uaXRvciBjaGFuZ2VzIHRvIHRoZSBtYW5hZ2VkCi0JICogbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGxpYnJhcnkgY2hhbmdlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gbW9uaXRvciByZXNvdXJjZSBjaGFuZ2VzIGluIHRoZSBtYW5hZ2VkIG1ldGhvZAotCSAqIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5TGlzdGVuZXIoSVByb3BlcnR5TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIG1vbml0b3IgcmVzb3VyY2UgY2hhbmdlcyBpbiB0aGUgbWFuYWdlZCBtZXRob2QKLQkgKiBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlMaXN0ZW5lcihJUHJvcGVydHlMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBTdGFydHMgbGlzdGVuaW5nIHRvIGNvbW1hbmQgcHJvY2Vzc2luZyBvbiBhIGNvbW1hbmQgc3RhY2suCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmRTdGFjawotCSAqICAgICAgICAgICAgYSBjb21tYW5kIHN0YWNrCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRMaXN0ZW5pbmdUbyhDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKTsKLQotCS8qKgotCSAqIFN0b3BzIGxpc3RlbmluZyB0byBjb21tYW5kIHByb2Nlc3Npbmcgb24gYSBjb21tYW5kIHN0YWNrLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kU3RhY2sKLQkgKiAgICAgICAgICAgIGEgY29tbWFuZCBzdGFjawotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BMaXN0ZW5pbmdUbyhDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKTsKLQotCS8qKgotCSAqIFN0YXJ0cyBsaXN0ZW5pbmcgdG8gY2hhbmdlIG5vdGlmaWNhdGlvbnMgc2VudCBmcm9tIGFuIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFuIGFkYXB0ZXIgZmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0TGlzdGVuaW5nVG8oQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSk7Ci0KLQkvKioKLQkgKiBTdG9wcyBsaXN0ZW5pbmcgdG8gY2hhbmdlIG5vdGlmaWNhdGlvbnMgc2VudCBmcm9tIGFuIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFuIGFkYXB0ZXIgZmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BMaXN0ZW5pbmdUbyhDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KTsKLQotCS8qKgotCSAqIEdldHMgYSBtZXRob2QgZWxlbWVudCBmcm9tIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBndWlkCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGVsZW1lbnQncyBHVUlELgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgZWxlbWVudCBvZiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoU3RyaW5nIGd1aWQpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkgaXMgcmVhZCBvbmx5LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBsaWJyYXJ5IGlzIHJlYWQgb25seQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kTGlicmFyeVJlYWRPbmx5KCk7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeSBjb250ZW50IGhhcyBiZWVuIG1vZGlmaWVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkgY29udGVudCBoYXMKLQkgKiAgICAgICAgIGJlZW4gbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZExpYnJhcnlNb2RpZmllZCgpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkgaGFzIGFueSB1bnJlc29sdmVkIHByb3h5LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkgaGFzIGFuCi0JICogICAgICAgICB1bnJlc29sdmVkIHByb3h5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1VucmVzb2x2ZWRQcm94eSgpOwotCi0JLyoqCi0JICogUmVsb2FkcyB0aGUgZ2l2ZW4gcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIGEgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMgdGhhdCBoYXZlIHJlbG9hZGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbG9hZFJlc291cmNlcyhDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXMpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgb3B0aW9ucyB1c2VkIGZvciBzYXZpbmcgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1hcCBvZiBtZXRob2QgbGlicmFyeSBzcGVjaWZpYyBzYXZlIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRTYXZlT3B0aW9ucygpOwotCi0JLyoqCi0JICogQWRkcyBhIG5ldyBtZXRob2QgcGx1Zy1pbiB0byB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBhIG1ldGhvZCBwbHVnLWluCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWV0aG9kUGx1Z2luKE1ldGhvZFBsdWdpbiBwbHVnaW4pCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGxpYnJhcnkgbWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGZvciB0aGUgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiB0aGUgcmVzb3VyY2UgbWFuYWdlciBmb3IgdGhlIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIElMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIGdldFJlc291cmNlTWFuYWdlcigpOwotCQotCS8qKgotCSAqIEJhY2t1cCBtZXRob2QgbGlicmFyeQotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogCQliYWNrdXAgZm9sZXIgZmlsZSBwYXRoCQotCSAqLwotCXB1YmxpYyB2b2lkIGJhY2t1cE1ldGhvZExpYnJhcnkoU3RyaW5nIHBhdGgpOwotCQotCS8qKgotCSAqIFJlZ2lzdGVyIGEgbG9hZGVkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgZ2l2ZW4gbG9hZGVkIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkgc3BlY2lmaWMgYXJndW1lbnRzCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGliLCAKLQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1zKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogVW5yZWdpc3RlciBhIHJlZ2lzdGVyZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdW5SZWdpc3Rlck1ldGhvZExpYnJhcnkoKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQxMjI3OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIGludGVyZmFjZSB0byBtYW5hZ2UgbGlicmFyeSByZXNvdXJjZXMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgewotCi0JLyoqCi0JICogZ2V0IHRoZSBsb2dpY2FsIHBhdGggb2YgdGhlIGVsZW1lbnQgaW4gdGhlIGxpYnJhcnksCi0JICogdGhlIHBhdGggc2hvdWxkIHN0YXJ0IHdpdGggdGhlIHBsdWdpbiBuYW1lLiAKLQkgKiBpLmUuIDxwbHVnaW4gbmFtZT4vcGF0aC90by9lbGVtZW50Ci0JICogCi0JICogVGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIHNob3VsZCBlbmNhcHN1bGF0ZSB0aGUgcGh5c2ljYWwgc3RvcmFnZSAKLQkgKiBvZiB0aGUgcmVzb3VyY2UgYW5kIHJldHVybiB0aGUgcGF0aCBvZiB0aGUgZWxlbWVudCBzdGFydCB3aXRoIGl0J3MgcGx1Z2luIG5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvZ2ljYWxQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQncyBiYWNrIHBhdGggb2YgdGhlIGVsZW1lbnQgYmFzZWQgb24gdGhlIGxvZ2ljYWwgcGF0aCwgZm9yIGV4YW1wbGUsCi0JICogIk9wZW5VUFxndWlkYW5jZVxjb25jZXB0XGMxLnhtbCIsIHRoZSBiYWNrIHBhdGggaXMgIi4vLi4vLi4vLi4vIgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja1BhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KTsKLQkKLQkvKioKLQkgKiBnZXQgdGhlIGxvZ2ljYWwgcmVzb3VyY2UgcGF0aCBvZiB0aGUgZWxlbWVudCBpbiB0aGUKLQkgKiBsaWJyYXJ5LiB0aGUgcGF0aCBzaG91bGQgc3RhcnQgd2l0aCB0aGUgcGx1Z2luIG5hbWUuIAotCSAqIGkuZS4gPHBsdWdpbiBuYW1lPi9wYXRoL3RvL2VsZW1lbnQvcmVzb3VyY2VzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2dpY2FsUmVzb3VyY2VQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCk7Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgcGh5c2ljYWwgcGF0aCBvZiBhIG1ldGhvZCBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBwaHlzaWNhbCBwYXRoIG9mIHRoZSBlbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQaHlzaWNhbFBhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHJlc291cmNlIGZvbGRlciBvZiB0aGUgZWxlbWVudCBpbiB0aGUgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gdGhlIHBoeXNpY2FsIHJlc291cmNlIHBhdGggb2YgdGhlIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBoeXNpY2FsUmVzb3VyY2VQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHBoeXNpY2FsIHBhdGggb2YgdGhlIHBsdWdpbiBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQaHlzaWNhbFBsdWdpblBhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIGdldCB0aGUgbG9naWNhbCBwYXRoIG9mIHRoZSBwbHVnaW4gCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9naWNhbFBsdWdpblBhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KTsKLQotCQotCS8qKgotCSAqIGdldCB0aGUgcGh5c2ljYWwgcGF0aCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGxvZ2ljYWwgcGF0aAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQgYW4gZWxlbWVudCBpbiB0aGUgbGlicmFyeSB0byBhY2Nlc3MgdGhlIGxpYnJhcnkgcmVzb3VyY2UKLQkgKiB1c3VhbGx5IHRoaXMgaXMgdGhlIG93bmVyIGVsZW1lbnQgdGhhdCByZWZlcmVuY2VzIHRoZSBsb2dpY2FsUGF0aAotCSAqIEBwYXJhbSBsb2dpY2FsUGF0aCBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgcGh5c2ljYWwgcGF0aCByZXNvbHZlZCBmcm9tIHRoZSBsb2dpY2FsIHBhdGgKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbG9naWNhbFBhdGgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUxpYnJhcnlTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUxpYnJhcnlTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OTI5NWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lMaWJyYXJ5U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIFRoZSBMaWJyYXJ5IFNlcnZpY2UgQVBJLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxpYnJhcnlTZXJ2aWNlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIG5ldyBtZXRob2QgbGlicmFyeQotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGxpYnJhcnkgdHlwZQotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBtZXRob2QgbGlicmFyeSBzcGVjaWZpYyBhcmd1bWVudHMKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBjcmVhdGVNZXRob2RMaWJyYXJ5KFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSwKLQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1zKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBPcGVucyBhbiBleGlzdGluZyBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IHR5cGUKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGxpYnJhcnkgVVJJCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgb3Blbk1ldGhvZExpYnJhcnkoU3RyaW5nIHR5cGUsCi0JCQlVUkkgdXJpKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBPcGVucyBhbiBleGlzdGluZyBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IHR5cGUKLQkgKiBAcGFyYW0gcGFyYW1zCi0JICogICAgICAgICAgICBtZXRob2QgbGlicmFyeSBzcGVjaWZpYyBhcmd1bWVudHMKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBvcGVuTWV0aG9kTGlicmFyeShTdHJpbmcgdHlwZSwKLQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1zKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBPcGVucyB0aGUgbGFzdCBvcGVuZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgb3Blbkxhc3RPcGVuZWRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBSZW9wZW5zIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSByZW9wZW5NZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGlicmFyeSkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJlb3BlbnMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgcmVvcGVuQ3VycmVudE1ldGhvZExpYnJhcnkoKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2F2ZXMgYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGlicmFyeSkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNhdmVzIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVDdXJyZW50TWV0aG9kTGlicmFyeSgpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENsb3NlcyBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIDxwPgotCSAqIFRoaXMgYXV0b21hdGljYWxseSBkaXNwb3NlcyBpdHMgbGlicmFyeSBtYW5hZ2VyIGFuZCB0aGUgY29uZmlndXJhdGlvbgotCSAqIG1hbmFnZXJzIHRoYXQgbWFuYWdlIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbnMgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2VNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGlicmFyeSkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENsb3NlcyB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmVwbGFjZXMgYSB0aGUgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIG9sZExpYnJhcnkKLQkgKiAgICAgICAgICAgIHRoZSBvbGQgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gbmV3TGlicmFyeQotCSAqICAgICAgICAgICAgdGhlIG5ldyBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2VNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgb2xkTGlicmFyeSwKLQkJCU1ldGhvZExpYnJhcnkgbmV3TGlicmFyeSk7Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gbW9uaXRvciBMaWJyYXJ5IFNlcnZpY2UgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgYSBsaWJyYXJ5IHNlcnZpY2UgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGlicmFyeVNlcnZpY2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgdGhhdCB3YXMgYWRkZWQgdG8gbW9uaXRvciBMaWJyYXJ5IFNlcnZpY2UgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgYSBsaWJyYXJ5IHNlcnZpY2UgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGlicmFyeVNlcnZpY2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudE1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgbG9jYXRpb24gcGF0aC4KLQkgKiA8cD4KLQkgKiBOb3RlOiBBIGZpbGUtYmFzZWQgbWV0aG9kIGxpYnJhcnkgbWF5IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGxpYnJhcnkgbWFuYWdlciBmb3IgYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gYSBsaWJyYXJ5IG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlNYW5hZ2VyIGdldExpYnJhcnlNYW5hZ2VyKE1ldGhvZExpYnJhcnkgbGlicmFyeSk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaWJyYXJ5TWFuYWdlcihJTGlicmFyeU1hbmFnZXIgbGliTWdyKTsKLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpYnJhcnlNYW5hZ2VyKElMaWJyYXJ5TWFuYWdlciBsaWJNZ3IpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlicmFyeSBtYW5hZ2VyIGZvciB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlicmFyeSBtYW5hZ2VyCi0JICovCi0JcHVibGljIElMaWJyYXJ5TWFuYWdlciBnZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICB0aGUgY29udGFpbmluZyBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oU3RyaW5nIG5hbWUsCi0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEdldHMgdGhlIGN1cnJlbnQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnJlbnQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbmZpZ3VyYXRpb24gbWFuYWdlciBmb3IgYSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBhIGNvbmZpZ3VyYXRpb24gbWFuYWdlcgotCSAqLwotCXB1YmxpYyBJQ29uZmlndXJhdGlvbk1hbmFnZXIgZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb25maWd1cmF0aW9uTWFuYWdlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb25maWd1cmF0aW9uTWFuYWdlcnMoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbmZpZ3VyYXRpb24gbWFuYWdlciBmb3IgdGhlIGN1cnJlbnQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHJldHVybiBhIGNvbmZpZ3VyYXRpb24gbWFuYWdlcgotCSAqLwotCXB1YmxpYyBJQ29uZmlndXJhdGlvbk1hbmFnZXIgZ2V0Q3VycmVudENvbmZpZ3VyYXRpb25NYW5hZ2VyKCk7Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXIgYSBsb2FkZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBnaXZlbiBsb2FkZWQgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IHR5cGUKLQkgKiBAcGFyYW0gcGFyYW1zCi0JICogICAgICAgICAgICBtZXRob2QgbGlicmFyeSBzcGVjaWZpYyBhcmd1bWVudHMKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCAgcmVnaXN0ZXJNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGliLCBTdHJpbmcgdHlwZSwKLQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1zKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogVW5yZWdpc3RlciBhIHJlZ2lzdGVyZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBnaXZlbiByZWdpc3RlcmVkIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdW5SZWdpc3Rlck1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWIpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lMaWJyYXJ5U2VydmljZUxpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFiZmVjOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgTGlicmFyeSBTZXJ2aWNlIGxpc3RlbmVyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCi0JLyoqCi0JICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIHdoZW4gYSBtZXRob2QgbGlicmFyeSBoYXMgYmVlbiBjcmVhdGVkLgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeUNyZWF0ZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KTsKLQotCS8qKgotCSAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiB3aGVuIGEgbWV0aG9kIGxpYnJhcnkgaGFzIGJlZW4gb3BlbmVkLgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpOwotCi0JLyoqCi0JICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIHdoZW4gYSBtZXRob2QgbGlicmFyeSBoYXMgYmVlbiByZW9wZW5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpOwotCi0JLyoqCi0JICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIHdoZW4gYSBtZXRob2QgbGlicmFyeSBoYXMgYmVlbiBjbG9zZWQuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSk7Ci0KLQkvKioKLQkgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gd2hlbiBhIG1ldGhvZCBsaWJyYXJ5IGhhcyBiZWVuIHNldCBhcyB0aGUgY3VycmVudAotCSAqIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeVNldChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpOwotCi0JLyoqCi0JICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIHdoZW4gYSBtZXRob2QgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBzZXQgYXMgdGhlCi0JICogY3VycmVudCBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JbnZhbGlkTWV0aG9kRWxlbWVudE5hbWVFeGNlcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JbnZhbGlkTWV0aG9kRWxlbWVudE5hbWVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczZjZhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSW52YWxpZE1ldGhvZEVsZW1lbnROYW1lRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYSBtZXRob2QgZWxlbWVudCBuYW1lIGlzIGludmFsaWQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW52YWxpZE1ldGhvZEVsZW1lbnROYW1lRXhjZXB0aW9uIGV4dGVuZHMgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBJbnZhbGlkTWV0aG9kRWxlbWVudE5hbWVFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSW52YWxpZE1ldGhvZEVsZW1lbnROYW1lRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIocm9vdENhdXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgSW52YWxpZE1ldGhvZEVsZW1lbnROYW1lRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZykgewotCQlzdXBlcihlcnJvck1zZyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZSBhbmQgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlCi0JICogZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIEludmFsaWRNZXRob2RFbGVtZW50TmFtZUV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2csCi0JCQlUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKGVycm9yTXNnLCByb290Q2F1c2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlBbHJlYWR5RXhpc3RzRXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeUFscmVhZHlFeGlzdHNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3MTE1Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeUFscmVhZHlFeGlzdHNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIE1ldGhvZCBMaWJyYXJ5IGFscmVhZHkgZXhpc3RzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlBbHJlYWR5RXhpc3RzRXhjZXB0aW9uIGV4dGVuZHMgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKHJvb3RDYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIExpYnJhcnlBbHJlYWR5RXhpc3RzRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZykgewotCQlzdXBlcihlcnJvck1zZyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZSBhbmQgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlCi0JICogZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIExpYnJhcnlBbHJlYWR5RXhpc3RzRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZywgVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihlcnJvck1zZywgcm9vdENhdXNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5TWFuYWdlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5TWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJkZTA3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeU1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5pbnRlcm5hbC5MaWJyYXJ5TWFuYWdlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgY3JlYXRpb24gb2YgTGlicmFyeSBNYW5hZ2VyIGluc3RhbmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5TWFuYWdlckZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRSA9ICJsaWJyYXJ5TWFuYWdlcnMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgImNsYXNzIiBhdHRyaWJ1dGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19BVFRSSUJfTkFNRSA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAidHlwZSIgYXR0cmlidXRlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9BVFRSSUJfTkFNRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICJ0eXBlTmFtZSIgYXR0cmlidXRlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9OQU1FX0FUVFJJQl9OQU1FID0gInR5cGVOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fQVRUUklCX05BTUUgPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgTGlicmFyeU1hbmFnZXJGYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQotCS8vIEEgbWFwIG9mIGxpYnJhcnkgbWFuYWdlciBjb25maWd1cmF0aW9uIGVsZW1lbnRzLgotCXByaXZhdGUgTWFwPFN0cmluZywgTGlicmFyeU1hbmFnZXJFbGVtZW50PiBsaWJyYXJ5TWFuYWdlckVsZW1lbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaWJyYXJ5TWFuYWdlckVsZW1lbnQ+KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5TWFuYWdlckZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKExpYnJhcnlNYW5hZ2VyRmFjdG9yeS5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IExpYnJhcnlNYW5hZ2VyRmFjdG9yeSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIExpYnJhcnlNYW5hZ2VyRmFjdG9yeSgpIHsKLQkJaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJLy8gUHJvY2VzcyB0aGUgIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxpYnJhcnlNYW5hZ2VycyIgZXh0ZW5zaW9uIHBvaW50Ci0JCS8vIGNvbnRyaWJ1dG9ycy4KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSwgRVhURU5TSU9OX1BPSU5UX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoQ0xBU1NfQVRUUklCX05BTUUpOwotCQkJCQkJU3RyaW5nIHR5cGVJZCA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZShUWVBFX0FUVFJJQl9OQU1FKTsKLQkJCQkJCVN0cmluZyB0eXBlTmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZShUWVBFX05BTUVfQVRUUklCX05BTUUpOwotCQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsICYmIGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIHR5cGVJZCAhPSBudWxsICYmIHR5cGVJZC50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIHR5cGVOYW1lICE9IG51bGwKLQkJCQkJCQkJJiYgdHlwZU5hbWUudHJpbSgpLmxlbmd0aCgpID4gMCkgewkJCQkJCQkKLQkJCQkJCQlpbnQgdmVyc2lvbiA9IFNlcnZpY2VzLnBhcnNlVmVyc2lvbihjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShWRVJTSU9OX0FUVFJJQl9OQU1FKSk7Ci0JCQkJCQkJTGlicmFyeU1hbmFnZXJFbGVtZW50IHByb3ZpZGVyID0gbGlicmFyeU1hbmFnZXJFbGVtZW50cy5nZXQodHlwZUlkKTsKLQkJCQkJCQlpZihwcm92aWRlciA9PSBudWxsIHx8IHByb3ZpZGVyLmdldFZlcnNpb24oKSA8IHZlcnNpb24pIHsKLQkJCQkJCQkJcHJvdmlkZXIgPSBuZXcgTGlicmFyeU1hbmFnZXJFbGVtZW50KAotCQkJCQkJCQkJCWJ1bmRsZSwgY2xhc3NOYW1lLCB0eXBlSWQsIHR5cGVOYW1lLCB2ZXJzaW9uKTsKLQkJCQkJCQkJbGlicmFyeU1hbmFnZXJFbGVtZW50cy5wdXQodHlwZUlkLCBwcm92aWRlcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGxpYnJhcnkgbWFuYWdlciBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IHR5cGUKLQkgKiBAcmV0dXJuIGEgbGlicmFyeSBtYW5hZ2VyCi0JICogQHRocm93IDxjb2RlPkNyZWF0ZUxpYnJhcnlNYW5hZ2VyRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMKLQkgKiAgICAgICAgd2hpbGUgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIElMaWJyYXJ5TWFuYWdlciBjcmVhdGVMaWJyYXJ5TWFuYWdlcihTdHJpbmcgdHlwZSkKLQkJCXRocm93cyBDcmVhdGVMaWJyYXJ5TWFuYWdlckV4Y2VwdGlvbiB7Ci0JCUxpYnJhcnlNYW5hZ2VyRWxlbWVudCBwcm92aWRlciA9IChMaWJyYXJ5TWFuYWdlckVsZW1lbnQpIGxpYnJhcnlNYW5hZ2VyRWxlbWVudHMKLQkJCQkuZ2V0KHR5cGUpOwotCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IENyZWF0ZUxpYnJhcnlNYW5hZ2VyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCUNsYXNzIGNsYXp6ID0gcHJvdmlkZXIuZ2V0QnVuZGxlKCkubG9hZENsYXNzKAotCQkJCQlwcm92aWRlci5nZXRDbGFzc05hbWUoKSk7Ci0JCQlyZXR1cm4gKElMaWJyYXJ5TWFuYWdlcikgY2xhenoubmV3SW5zdGFuY2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJdGhyb3cgbmV3IENyZWF0ZUxpYnJhcnlNYW5hZ2VyRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIGxpYnJhcnkgdHlwZXMgcmVnaXN0ZXJlZCB2aWEgdGhlCi0JICogIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxpYnJhcnlNYW5hZ2VycyIgZXh0ZW5zaW9uIHBvaW50LgotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgb2YgbGlicmFyeSB0eXBlcwotCSAqLwotCXB1YmxpYyBNYXAgZ2V0TGlicmFyeVR5cGVzKCkgewotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHR5cGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBsaWJyYXJ5TWFuYWdlckVsZW1lbnRzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyB0eXBlSWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgdHlwZU5hbWUgPSAoKExpYnJhcnlNYW5hZ2VyRWxlbWVudCkgbGlicmFyeU1hbmFnZXJFbGVtZW50cwotCQkJCQkuZ2V0KHR5cGVJZCkpLmdldFR5cGVOYW1lKCk7Ci0JCQl0eXBlcy5wdXQodHlwZUlkLCB0eXBlTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTg5ZjIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5Tm90Rm91bmRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIE1ldGhvZCBMaWJyYXJ5IGNhbm5vdCBiZSBsb2NhdGVkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlOb3RGb3VuZEV4Y2VwdGlvbiBleHRlbmRzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeU5vdEZvdW5kRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIExpYnJhcnlOb3RGb3VuZEV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKHJvb3RDYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIExpYnJhcnlOb3RGb3VuZEV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UgYW5kIHRoZSByb290IGNhdXNlIG9mIHRoZQotCSAqIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5Tm90Rm91bmRFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnLCBUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKGVycm9yTXNnLCByb290Q2F1c2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYWNkMGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5BYnN0cmFjdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGF5b3V0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBMaWJyYXJ5IHBsdWctaW4gY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVBsdWdpbiBleHRlbmRzIEFic3RyYWN0QWN0aXZhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfUEFUSCA9ICJsYXlvdXQvIjsgLy8kTk9OLU5MUy0xJDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9YU0xfUEFUSCA9ICJsYXlvdXQveHNsLyI7IC8vJE5PTi1OTFMtMSQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9DU1NfUEFUSCA9ICJsYXlvdXQvY3NzLyI7IC8vJE5PTi1OTFMtMSQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfU0NSSVBUU19GT0xERVIgPSAic2NyaXB0cyI7IC8vJE5PTi1OTFMtMSQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfU0NSSVBUU19QQVRIID0gImxheW91dC9zY3JpcHRzLyI7IC8vJE5PTi1OTFMtMSQ7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgTGlicmFyeVBsdWdpbiBwbHVnaW47Ci0KLQlwcml2YXRlIFN0cmluZyBsYXlvdXRQYXRoLCBsYXlvdXRYc2xQYXRoLCBsYXlvdXRDc3NQYXRoOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKHN1cGVyLmdldEluc3RhbGxVUkwoKSwgTEFZT1VUX1BBVEgpOwotCQkJbGF5b3V0UGF0aCA9IEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKS5nZXRQYXRoKCk7Ci0KLQkJCXVybCA9IG5ldyBVUkwoc3VwZXIuZ2V0SW5zdGFsbFVSTCgpLCBMQVlPVVRfWFNMX1BBVEgpOwotCQkJbGF5b3V0WHNsUGF0aCA9IEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKS5nZXRQYXRoKCk7Ci0KLQkJCXVybCA9IG5ldyBVUkwoc3VwZXIuZ2V0SW5zdGFsbFVSTCgpLCBMQVlPVVRfQ1NTX1BBVEgpOwotCQkJbGF5b3V0Q3NzUGF0aCA9IEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKS5nZXRQYXRoKCk7Ci0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQotCQlMYXlvdXRSZXNvdXJjZXMuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpYnJhcnlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExheW91dFBhdGgoKSB7Ci0JCXJldHVybiBsYXlvdXRQYXRoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGF5b3V0WHNsUGF0aCgpIHsKLQkJcmV0dXJuIGxheW91dFhzbFBhdGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYXlvdXRDc3NQYXRoKCkgewotCQlyZXR1cm4gbGF5b3V0Q3NzUGF0aDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5UmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYzY0ZTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgTGlicmFyeVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIExpYnJhcnlSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYlVwZ3JhZGVSZXF1aXJlZF9lcnJfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9sZFRvb2xWZXJzaW9uX2Vycl9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbFZlcnNpb25NaXNtYXRjaF9lcnJfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVua25vd25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbXB0eUxpYnJhcnlQYXRoRXJyb3JfcmVhc29uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pc3NpbmdMaWJyYXJ5RmlsZUVycm9yX3JlYXNvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bnJlc29sdmVkUHJveHlFcnJvcl9yZWFzb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdDbG9zdXJlV2FybmluZ19tc2cyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZFJlc291cmNlc0Vycm9yX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0R3VpZGFuY2VFcnJvcl9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZUNvbnZlcnRlZEd1aWRhbmNlRXJyb3JfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRBY3Rpdml0eUVycm9yX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRBY3Rpdml0eUVycm9yX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlQ29udmVydGVkQWN0aXZpdHlFcnJvcl9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JfcmVhc29uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuc3VwcG9ydGVkR3VpZGFuY2VUeXBlRXJyb3JfcmVhc29uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3VsZE5vdExvY2tMaWJyYXJ5X3JlYXNvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5aW5nQXR0YWNobWVudHNUYXNrX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEd1aWRhbmNlRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRHdWlkYW5jZURpYWxvZ190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrbGlzdF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNlcHRfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGFtcGxlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGVsaW5lX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXN0aW1hdGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW5nTWV0cmljX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb3J0X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVtcGxhdGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sTWVudG9yX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2hpdGVwYXBlcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlcm1EZWZpbml0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXVzYWJsZUFzc2V0X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlMYXlvdXRfcHJpbWFyeVRhc2tzX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlMYXlvdXRfYWRkaXRpb25hbFRhc2tzX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEd1aWRhbmNlRXJyb3JfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZFJlc291cmNlc0Vycm9yX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRSZXNvdXJjZXNFcnJvcl9yZWFzb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURpYWdyYW1QZXJmb3Jtc190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtUmVzcG9uc2libGVGb3JfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0c3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzExOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE1OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydEV4cG9ydFV0aWxfTVNHODsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRFeHBvcnRVdGlsX01TRzk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5rbm93bkd1aWRhbmNlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbl9sb2dfbm9Db250ZW50UGF0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyX2Nhbm5vdFVwZGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3YXJuaW5nRGxnX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGxnX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGxnX3NhdmVFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfbmFtZV9qYTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl9qYTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfbmFtZV9rbzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl9rbzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfbmFtZV96aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl96aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfbmFtZV96aF9UVzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl96aF9UVzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfc2l6ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfc2l6ZV93aW4zMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbV94TWFyZ2luOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtX3hTcGFjaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtX3lTcGFjaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGl2aXR5RGlhZ3JhbU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aXZpdHlEZXRhaWxEaWFncmFtTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3cERlcGVuZGVuY3lEaWFncmFtTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2xvbl93aXRoX3NwYWNlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRFcnJvcl9taXNzaW5nX2VsZW1lbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudEVycm9yX2NvbnRyaWJ1dG9yX21pc3NpbmdfYmFzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50RXJyb3JfZXh0ZW5kZXJfbWlzc2luZ19iYXNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRFcnJvcl9yZXBsYWNlcl9taXNzaW5nX2Jhc2U7CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRFcnJvcl9taXNzaW5nX3ByaW1hcnlfcGVyZm9ybWVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRFcnJvcl9taXNzaW5nX21hbmRhdG9yeV9pbnB1dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50RXJyb3JfbWlzc2luZ19vdXRwdXQ7Ci0JCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTGlicmFyeVJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5U2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiODg1NzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkNvbW1hbmRMaW5lUnVuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuSTE4blV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZlcmVuY2VzLkxpYnJhcnlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBMaWJyYXJ5IFNlcnZpY2UgaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlTZXJ2aWNlIGltcGxlbWVudHMgSUxpYnJhcnlTZXJ2aWNlIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0NSRUFURV9MSUJSQVJZID0gMTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVWRU5UX09QRU5fTElCUkFSWSA9IDI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFVkVOVF9SRU9QRU5fTElCUkFSWSA9IDM7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFVkVOVF9DTE9TRV9MSUJSQVJZID0gNDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NFVF9DVVJSRU5UX0xJQlJBUlkgPSA1OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU0VUX0NVUlJFTlRfQ09ORklHVVJBVElPTiA9IDY7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByb3RlY3RlZCBzdGF0aWMgSUxpYnJhcnlTZXJ2aWNlIGluc3RhbmNlOwotCi0JLy8gQSBtYXAgb2YgbWV0aG9kIGxpYnJhcmllcyB0byBsaWJyYXJ5IG1hbmFnZXJzLgotCXByb3RlY3RlZCBNYXA8TWV0aG9kTGlicmFyeSwgSUxpYnJhcnlNYW5hZ2VyPiBsaWJyYXJ5TWFuYWdlcnMgPSBuZXcgSGFzaE1hcDxNZXRob2RMaWJyYXJ5LCBJTGlicmFyeU1hbmFnZXI+KCk7Ci0KLQkvLyBBIG1hcCBvZiBtZXRob2QgY29uZmlndXJhdGlvbnMgdG8gY29uZmlndXJhdGlvbiBtYW5hZ2Vycy4KLQlwcm90ZWN0ZWQgTWFwPE1ldGhvZENvbmZpZ3VyYXRpb24sIElDb25maWd1cmF0aW9uTWFuYWdlcj4gY29uZmlnTWFuYWdlcnMgPSBuZXcgSGFzaE1hcDxNZXRob2RDb25maWd1cmF0aW9uLCBJQ29uZmlndXJhdGlvbk1hbmFnZXI+KCk7Ci0KLQkvLyBUaGUgbGlicmFyeSBzZXJ2aWNlIGxpc3RlbmVycy4KLQlwcm90ZWN0ZWQgTGlzdDxJTGlicmFyeVNlcnZpY2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJTGlicmFyeVNlcnZpY2VMaXN0ZW5lcj4oKTsKLQotCS8vIFRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5IGN1cnJlbnRMaWJyYXJ5OwotCi0JLy8gVGhlIGN1cnJlbnQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZzsKLQotCS8vIElmIHRydWUsIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IGlzIGJlaW5nIGNsb3NlZC4KLQlwcml2YXRlIGJvb2xlYW4gY2xvc2luZ0N1cnJlbnRMaWJyYXJ5OwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUxpYnJhcnlTZXJ2aWNlIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChMaWJyYXJ5U2VydmljZS5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IExpYnJhcnlTZXJ2aWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTGlicmFyeVNlcnZpY2UoKSB7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCS8vIEluaXRpYWxpemUgdGhlIGxpYnJhcnkgbWFuYWdlciBmYWN0b3J5IHRvIHByZS1wcm9jZXNzIHRoZQotCQkvLyAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGlicmFyeU1hbmFnZXJzIiBleHRlbnNpb24gcG9pbnQuCi0JCUxpYnJhcnlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCi0JCWlmIChDb21tYW5kTGluZVJ1blV0aWwuZ2V0SW5zdGFuY2UoKS5pc05lZWRUb1J1bigpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBuZXcgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IHR5cGUKLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkgc3BlY2lmaWMgYXJndW1lbnRzCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgY3JlYXRlTWV0aG9kTGlicmFyeShTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsCi0JCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtcykgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCB0eXBlID09IG51bGwgfHwgcGFyYW1zID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCWJvb2xlYW4gcmVvcGVuTGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSAhPSBudWxsOwotCi0JCXRyeSB7Ci0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmNsb3NlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKQotCQkJCQkuY3JlYXRlTGlicmFyeU1hbmFnZXIodHlwZSk7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBtYW5hZ2VyLmNyZWF0ZU1ldGhvZExpYnJhcnkobmFtZSwgcGFyYW1zKTsKLQkJCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCQkvLyBvcGVuIG5ld2x5IGNyZWF0ZWQgbWV0aG9kIGxpYnJhcnkgd2l0aG91dCBzZW5kaW5nIG91dCBub3RpZmljYXRpb24KLQkJCQkvLwotCQkJCWxpYnJhcnkgPSBtYW5hZ2VyLm9wZW5NZXRob2RMaWJyYXJ5KG1hbmFnZXIuZ2V0TWV0aG9kTGlicmFyeVVSSSgpKTsKLQotCQkJCXNldExpYnJhcnlNYW5hZ2VyKG1hbmFnZXIpOwotCi0JCQkJLy8gU2V0IHRoZSBjdXJyZW50IGxpYnJhcnksIGRvIHRoaXMgYmVmb3JlIG5vdGlmeWluZyB0aGUgbGlicmFyeQotCQkJCS8vIGxpc3RlbmVycy4KLQkJCQlzZXRDdXJyZW50TWV0aG9kTGlicmFyeShsaWJyYXJ5KTsKLQotCQkJCS8vIFNhdmUgdGhlIGxpYnJhcnkgVVJJIGFuZCB0eXBlIHRvIHByZWZlcmVuY2Ugc3RvcmUuCi0JCQkJc2F2ZU1ldGhvZExpYnJhcnlQcmVmZXJlbmNlcyhtYW5hZ2VyLmdldE1ldGhvZExpYnJhcnlVUkkoKSwKLQkJCQkJCXR5cGUpOwotCi0JCQkJbm90aWZ5TGlzdGVuZXJzKGxpYnJhcnksIEVWRU5UX0NSRUFURV9MSUJSQVJZKTsJCQkJCQkJCQotCQkJfQotCi0JCQlyZW9wZW5MaWJyYXJ5ID0gZmFsc2U7Ci0KLQkJCXJldHVybiBsaWJyYXJ5OwotCQl9IGNhdGNoIChMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHJlb3BlbkxpYnJhcnkpIHsKLQkJCQlvcGVuTGFzdE9wZW5lZE1ldGhvZExpYnJhcnkoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE9wZW5zIGFuIGV4aXN0aW5nIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGxpYnJhcnkgdHlwZQotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbGlicmFyeSBVUkkKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBvcGVuTWV0aG9kTGlicmFyeShTdHJpbmcgdHlwZSwgVVJJIHVyaSkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmICh1cmkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKCkKLQkJCQkJLmNyZWF0ZUxpYnJhcnlNYW5hZ2VyKHR5cGUpOwotCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gbWFuYWdlci5vcGVuTWV0aG9kTGlicmFyeSh1cmkpOwotCQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJCXNldExpYnJhcnlNYW5hZ2VyKG1hbmFnZXIpOwotCi0JCQkJLy8gU2V0IHRoZSBjdXJyZW50IGxpYnJhcnksIGRvIHRoaXMgYmVmb3JlIG5vdGlmeWluZyB0aGUgbGlicmFyeQotCQkJCS8vIGxpc3RlbmVycy4KLQkJCQlzZXRDdXJyZW50TWV0aG9kTGlicmFyeShsaWJyYXJ5KTsKLQotCQkJCS8vIFNhdmUgdGhlIGxpYnJhcnkgVVJJIGFuZCB0eXBlIHRvIHByZWZlcmVuY2Ugc3RvcmUuCi0JCQkJc2F2ZU1ldGhvZExpYnJhcnlQcmVmZXJlbmNlcyhtYW5hZ2VyLmdldE1ldGhvZExpYnJhcnlVUkkoKSwKLQkJCQkJCXR5cGUpOwotCi0JCQkJbm90aWZ5TGlzdGVuZXJzKGxpYnJhcnksIEVWRU5UX09QRU5fTElCUkFSWSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbGlicmFyeTsKLQkJfSBjYXRjaCAoQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE9wZW5zIGFuIGV4aXN0aW5nIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGxpYnJhcnkgdHlwZQotCSAqIEBwYXJhbSBwYXJhbXMKLQkgKiAgICAgICAgICAgIG1ldGhvZCBsaWJyYXJ5IHNwZWNpZmljIGFyZ3VtZW50cwotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IG9wZW5NZXRob2RMaWJyYXJ5KFN0cmluZyB0eXBlLAotCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbXMpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChwYXJhbXMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKCkKLQkJCQkJLmNyZWF0ZUxpYnJhcnlNYW5hZ2VyKHR5cGUpOwotCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gbWFuYWdlci5vcGVuTWV0aG9kTGlicmFyeShwYXJhbXMpOwotCQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJCXNldExpYnJhcnlNYW5hZ2VyKG1hbmFnZXIpOwotCi0JCQkJLy8gU2V0IHRoZSBjdXJyZW50IGxpYnJhcnksIGRvIHRoaXMgYmVmb3JlIG5vdGlmeWluZyB0aGUgbGlicmFyeQotCQkJCS8vIGxpc3RlbmVycy4KLQkJCQlzZXRDdXJyZW50TWV0aG9kTGlicmFyeShsaWJyYXJ5KTsKLQotCQkJCS8vIFNhdmUgdGhlIGxpYnJhcnkgVVJJIGFuZCB0eXBlIHRvIHByZWZlcmVuY2Ugc3RvcmUuCi0JCQkJc2F2ZU1ldGhvZExpYnJhcnlQcmVmZXJlbmNlcyhtYW5hZ2VyLmdldE1ldGhvZExpYnJhcnlVUkkoKSwKLQkJCQkJCXR5cGUpOwotCi0JCQkJbm90aWZ5TGlzdGVuZXJzKGxpYnJhcnksIEVWRU5UX09QRU5fTElCUkFSWSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbGlicmFyeTsKLQkJfSBjYXRjaCAoQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoZSBsYXN0IG9wZW5lZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBvcGVuTGFzdE9wZW5lZE1ldGhvZExpYnJhcnkoKSB7Ci0JCVN0cmluZyBzYXZlZE1ldGhvZExpYnJhcnlVUkkgPSBMaWJyYXJ5UHJlZmVyZW5jZXMKLQkJCQkuZ2V0U2F2ZWRNZXRob2RMaWJyYXJ5VVJJKCk7Ci0JCXRyeSB7Ci0JCQlVUkkgdXJpID0gbmV3IFVSSShzYXZlZE1ldGhvZExpYnJhcnlVUkkpOwotCQkJaWYgKHVyaS5nZXRQYXRoKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlTdHJpbmcgdHlwZSA9IExpYnJhcnlQcmVmZXJlbmNlcy5nZXRTYXZlZE1ldGhvZExpYnJhcnlUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBudWxsIHx8IHR5cGUubGVuZ3RoKCkgPT0gMCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlyZXR1cm4gb3Blbk1ldGhvZExpYnJhcnkodHlwZSwgdXJpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ1dhcm5pbmcoCi0JCQkJCSJVbmFibGUgdG8gb3BlbiB0aGUgbGFzdCBvcGVuZWQgbWV0aG9kIGxpYnJhcnkgJyIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgc2F2ZWRNZXRob2RMaWJyYXJ5VVJJICsgIicuIik7IC8vJE5PTi1OTFMtMSQKLQkJCUxpYnJhcnlQcmVmZXJlbmNlcy5zZXRTYXZlZE1ldGhvZExpYnJhcnlVUkkoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmVvcGVucyBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgcmVvcGVuTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYnJhcnkpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IGdldExpYnJhcnlNYW5hZ2VyKGxpYnJhcnkpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJlbW92ZUxpYnJhcnlNYW5hZ2VyKG1hbmFnZXIpOwotCQkJCWxpYnJhcnkgPSBtYW5hZ2VyLnJlb3Blbk1ldGhvZExpYnJhcnkoKTsKLQotCQkJCS8vIFJlLXJlZ2lzdGVyIHRoZSBsaWJyYXJ5IG1hbmFnZXIgc2luY2UgdGhlIGxpYnJhcnkgaW5zdGFuY2UKLQkJCQkvLyB3aWxsIGJlIGNoYW5nZWQuCi0JCQkJc2V0TGlicmFyeU1hbmFnZXIobWFuYWdlcik7Ci0KLQkJCQkvLyBTZXQgdGhlIGN1cnJlbnQgbGlicmFyeSwgZG8gdGhpcyBiZWZvcmUgbm90aWZ5aW5nIHRoZSBsaWJyYXJ5Ci0JCQkJLy8gbGlzdGVuZXJzLgotCQkJCXNldEN1cnJlbnRNZXRob2RMaWJyYXJ5KGxpYnJhcnkpOwotCi0JCQkJbm90aWZ5TGlzdGVuZXJzKGxpYnJhcnksIEVWRU5UX1JFT1BFTl9MSUJSQVJZKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlb3BlbnMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgcmVvcGVuQ3VycmVudE1ldGhvZExpYnJhcnkoKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHJlb3Blbk1ldGhvZExpYnJhcnkoY3VycmVudExpYnJhcnkpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYnJhcnkpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IGdldExpYnJhcnlNYW5hZ2VyKGxpYnJhcnkpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQltYW5hZ2VyLnNhdmVNZXRob2RMaWJyYXJ5KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlQ3VycmVudE1ldGhvZExpYnJhcnkoKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlzYXZlTWV0aG9kTGlicmFyeShjdXJyZW50TGlicmFyeSk7Ci0JfQotCi0JLyoqCi0JICogQ2xvc2VzIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogPHA+Ci0JICogVGhpcyBhdXRvbWF0aWNhbGx5IGRpc3Bvc2VzIGl0cyBsaWJyYXJ5IG1hbmFnZXIgYW5kIHRoZSBjb25maWd1cmF0aW9uCi0JICogbWFuYWdlcnMgdGhhdCBtYW5hZ2UgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9ucyBpbiB0aGUgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZU1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBnZXRMaWJyYXJ5TWFuYWdlcihsaWJyYXJ5KTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbm90aWZ5TGlzdGVuZXJzKGxpYnJhcnksIEVWRU5UX0NMT1NFX0xJQlJBUlkpOwotCQkJbWFuYWdlci5jbG9zZU1ldGhvZExpYnJhcnkoKTsKLQkJCWlmIChjdXJyZW50TGlicmFyeSA9PSBsaWJyYXJ5KSB7Ci0JCQkJc2V0Q3VycmVudE1ldGhvZExpYnJhcnkobnVsbCk7Ci0JCQkJc2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24obnVsbCk7Ci0JCQl9Ci0JCQlyZW1vdmVMaWJyYXJ5TWFuYWdlcihtYW5hZ2VyKTsKLQkJCW1hbmFnZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2xvc2VzIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChjbG9zaW5nQ3VycmVudExpYnJhcnkpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQljbG9zaW5nQ3VycmVudExpYnJhcnkgPSB0cnVlOwotCQkJaWYgKGN1cnJlbnRMaWJyYXJ5ICE9IG51bGwpIHsKLQkJCQljbG9zZU1ldGhvZExpYnJhcnkoY3VycmVudExpYnJhcnkpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJY2xvc2luZ0N1cnJlbnRMaWJyYXJ5ID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyBhIHRoZSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkTGlicmFyeQotCSAqICAgICAgICAgICAgdGhlIG9sZCBtZXRob2QgbGlicmFyeQotCSAqIEBwYXJhbSBuZXdMaWJyYXJ5Ci0JICogICAgICAgICAgICB0aGUgbmV3IG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZU1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBvbGRMaWJyYXJ5LAotCQkJTWV0aG9kTGlicmFyeSBuZXdMaWJyYXJ5KSB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gZ2V0TGlicmFyeU1hbmFnZXIob2xkTGlicmFyeSk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCXJlbW92ZUxpYnJhcnlNYW5hZ2VyKG1hbmFnZXIpOwotCi0JCQkvLyBTZXQgdGhlIG5ldyBsaWJyYXJ5IGluc3RhbmNlIHRvIHByZXZlbnQgdGhlIGxpYnJhcnkgbWFuYWdlciBmcm9tCi0JCQkvLyByZWZlcmVuY2luZyB0aGUgb2xkIGxpYnJhcnkgaW5zdGFuY2UuCi0JCQltYW5hZ2VyLnNldE1ldGhvZExpYnJhcnkobmV3TGlicmFyeSk7Ci0KLQkJCXNldExpYnJhcnlNYW5hZ2VyKG1hbmFnZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIG1vbml0b3IgTGlicmFyeSBTZXJ2aWNlIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGEgbGlicmFyeSBzZXJ2aWNlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIHRoYXQgd2FzIGFkZGVkIHRvIG1vbml0b3IgTGlicmFyeSBTZXJ2aWNlIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGEgbGlicmFyeSBzZXJ2aWNlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpIHsKLQkJcmV0dXJuIGN1cnJlbnRMaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50TWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJY3VycmVudExpYnJhcnkgPSBsaWJyYXJ5OwotCQlub3RpZnlMaXN0ZW5lcnMobGlicmFyeSwgRVZFTlRfU0VUX0NVUlJFTlRfTElCUkFSWSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeSBsb2NhdGlvbiBwYXRoLgotCSAqIDxwPgotCSAqIE5vdGU6IEEgZmlsZS1iYXNlZCBtZXRob2QgbGlicmFyeSBtYXkgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpIHsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBnZXRMaWJyYXJ5TWFuYWdlcihjdXJyZW50TGlicmFyeSk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCXJldHVybiBtYW5hZ2VyLmdldE1ldGhvZExpYnJhcnlMb2NhdGlvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaWJyYXJ5IG1hbmFnZXIgZm9yIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIGEgbGlicmFyeSBtYW5hZ2VyCi0JICovCi0JcHVibGljIElMaWJyYXJ5TWFuYWdlciBnZXRMaWJyYXJ5TWFuYWdlcihNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJcmV0dXJuIChJTGlicmFyeU1hbmFnZXIpIGxpYnJhcnlNYW5hZ2Vycy5nZXQobGlicmFyeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlicmFyeU1hbmFnZXIoSUxpYnJhcnlNYW5hZ2VyIGxpYk1ncikgewotCQlpZiAobGliTWdyICE9IG51bGwpIHsKLQkJCU1ldGhvZExpYnJhcnkgbGliID0gbGliTWdyLmdldE1ldGhvZExpYnJhcnkoKTsKLQkJCWlmIChsaWIgIT0gbnVsbCkgewotCQkJCXJlbW92ZUNvbmZpZ3VyYXRpb25NYW5hZ2VycyhsaWIpOwotCQkJCWxpYnJhcnlNYW5hZ2Vycy5yZW1vdmUobGliKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldExpYnJhcnlNYW5hZ2VyKElMaWJyYXJ5TWFuYWdlciBsaWJNZ3IpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBsaWJNZ3IuZ2V0TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGliICE9IG51bGwpIHsKLQkJCWxpYnJhcnlNYW5hZ2Vycy5wdXQobGliLCBsaWJNZ3IpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaWJyYXJ5IG1hbmFnZXIgZm9yIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBsaWJyYXJ5IG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlNYW5hZ2VyIGdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpIHsKLQkJcmV0dXJuIGdldExpYnJhcnlNYW5hZ2VyKGN1cnJlbnRMaWJyYXJ5KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBuZXcgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgdGhlIGNvbnRhaW5pbmcgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKFN0cmluZyBuYW1lLAotCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAobmFtZSA9PSBudWxsIHx8IGxpYnJhcnkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JCUxpc3QgY29uZmlncyA9IGxpYnJhcnkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBjb25maWdzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQlpZiAobmFtZS5lcXVhbHMoY29uZmlnLmdldE5hbWUoKSkpIHsKLQkJCQl0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkFscmVhZHlFeGlzdHNFeGNlcHRpb24oKTsKLQkJCX0KLQkJfQotCi0JCWNvbmZpZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJY29uZmlnLnNldE5hbWUobmFtZSk7Ci0JCWNvbmZpZ3MuYWRkKGNvbmZpZyk7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY3VycmVudCBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGN1cnJlbnRDb25maWc7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY3VycmVudCBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJY3VycmVudENvbmZpZyA9IGNvbmZpZzsKLQkJbm90aWZ5TGlzdGVuZXJzKGNvbmZpZywgRVZFTlRfU0VUX0NVUlJFTlRfQ09ORklHVVJBVElPTik7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29uZmlndXJhdGlvbiBtYW5hZ2VyIGZvciBhIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgY29uZmlndXJhdGlvbiBtYW5hZ2VyCi0JICovCi0JcHVibGljIElDb25maWd1cmF0aW9uTWFuYWdlciBnZXRDb25maWd1cmF0aW9uTWFuYWdlcigKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUlDb25maWd1cmF0aW9uTWFuYWdlciBtYW5hZ2VyID0gKElDb25maWd1cmF0aW9uTWFuYWdlcikgY29uZmlnTWFuYWdlcnMKLQkJCQkuZ2V0KGNvbmZpZyk7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCW1hbmFnZXIgPSBuZXcgQ29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlnKTsKLQkJCWNvbmZpZ01hbmFnZXJzLnB1dChjb25maWcsIG1hbmFnZXIpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbmZpZ3VyYXRpb25NYW5hZ2VyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIG1nciA9IChJQ29uZmlndXJhdGlvbk1hbmFnZXIpIGNvbmZpZ01hbmFnZXJzCi0JCQkJLnJlbW92ZShjb25maWcpOwotCQlpZiAobWdyICE9IG51bGwpIHsKLQkJCW1nci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb25maWd1cmF0aW9uTWFuYWdlcnMoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25zKGxpYnJhcnkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLQkJCXJlbW92ZUNvbmZpZ3VyYXRpb25NYW5hZ2VyKGNvbmZpZ3NbaV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29uZmlndXJhdGlvbiBtYW5hZ2VyIGZvciB0aGUgY3VycmVudCBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29uZmlndXJhdGlvbiBtYW5hZ2VyCi0JICovCi0JcHVibGljIElDb25maWd1cmF0aW9uTWFuYWdlciBnZXRDdXJyZW50Q29uZmlndXJhdGlvbk1hbmFnZXIoKSB7Ci0JCWlmIChjdXJyZW50Q29uZmlnICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRDb25maWd1cmF0aW9uTWFuYWdlcihjdXJyZW50Q29uZmlnKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZW5kcyBhIG1ldGhvZCBsaWJyYXJ5IHJlbGF0ZWQgZXZlbnQgdG8gYWxsIGxpYnJhcnkgc2VydmljZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGZpbmFsIE1ldGhvZExpYnJhcnkgbGlicmFyeSwgaW50IGV2ZW50SWQpIHsKLQkJZm9yIChJdGVyYXRvcjxJTGlicmFyeVNlcnZpY2VMaXN0ZW5lcj4gaXQgPSBuZXcgQXJyYXlMaXN0PElMaWJyYXJ5U2VydmljZUxpc3RlbmVyPigKLQkJCQlsaXN0ZW5lcnMpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWZpbmFsIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpc3RlbmVyID0gaXQubmV4dCgpOwotCQkJc3dpdGNoIChldmVudElkKSB7Ci0JCQljYXNlIEVWRU5UX0NSRUFURV9MSUJSQVJZOgotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbGlzdGVuZXIubGlicmFyeUNyZWF0ZWQobGlicmFyeSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVZFTlRfT1BFTl9MSUJSQVJZOgotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbGlzdGVuZXIubGlicmFyeU9wZW5lZChsaWJyYXJ5KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFVkVOVF9SRU9QRU5fTElCUkFSWToKLQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWxpc3RlbmVyLmxpYnJhcnlSZW9wZW5lZChsaWJyYXJ5KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFVkVOVF9DTE9TRV9MSUJSQVJZOgotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbGlzdGVuZXIubGlicmFyeUNsb3NlZChsaWJyYXJ5KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFVkVOVF9TRVRfQ1VSUkVOVF9MSUJSQVJZOgotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbGlzdGVuZXIubGlicmFyeVNldChsaWJyYXJ5KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VuZHMgYSBtZXRob2QgY29uZmlndXJhdGlvbiByZWxhdGVkIGV2ZW50IHRvIGFsbCBsaWJyYXJ5IHNlcnZpY2UKLQkgKiBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGZpbmFsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBpbnQgZXZlbnRJZCkgewotCQlmb3IgKEl0ZXJhdG9yPElMaWJyYXJ5U2VydmljZUxpc3RlbmVyPiBpdCA9IG5ldyBBcnJheUxpc3Q8SUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI+KAotCQkJCWxpc3RlbmVycykuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJZmluYWwgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgbGlzdGVuZXIgPSBpdC5uZXh0KCk7Ci0JCQlzd2l0Y2ggKGV2ZW50SWQpIHsKLQkJCWNhc2UgRVZFTlRfU0VUX0NVUlJFTlRfQ09ORklHVVJBVElPTjoKLQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWxpc3RlbmVyLmNvbmZpZ3VyYXRpb25TZXQoY29uZmlnKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIG1ldGhvZCBsaWJyYXJ5IFVSSSBhbmQgdHlwZSB0byBwcmVmZXJlbmNlIHN0b3JlLgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbGlicmFyeSBVUkkKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIG1lbnRob2QgbGlicmFyeSB0eXBlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZU1ldGhvZExpYnJhcnlQcmVmZXJlbmNlcyhVUkkgdXJpLCBTdHJpbmcgdHlwZSkgewotCQlMaWJyYXJ5UHJlZmVyZW5jZXMuc2V0U2F2ZWRNZXRob2RMaWJyYXJ5VVJJKHVyaS50b1N0cmluZygpKTsKLQkJTGlicmFyeVByZWZlcmVuY2VzLnNldFNhdmVkTWV0aG9kTGlicmFyeVR5cGUodHlwZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZSNyZWdpc3Rlck1ldGhvZExpYnJhcnkob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkICByZWdpc3Rlck1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWIsIFN0cmluZyB0eXBlLAotCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbXMpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCS8vRm9yIG5vdywgc3RpbGwgc2ltcGx5IHdyYXBpbmcgdXAgb2xkIGltcGxlbWVudGF0aW9uIChjb3BpZWQgZnJvbSBDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZSkgZm9yIHNtb290aGVyIGNoYW5nZTsgd2lsbCBkZWZpbmV0bHkgY2hhbmdlIGxhdGVyCi0JCS8vc28gdGhhdCBjcmVhdGluZyBhIG5ldyBsaWIgd291bGQgbm90IGJlIG5lZWRlZAkJCi0JCUlMaWJyYXJ5TWFuYWdlciBsaWJNZ3IgPSBMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKQotCQkJLmNyZWF0ZUxpYnJhcnlNYW5hZ2VyKHR5cGUpOwotCQlsaWJNZ3IucmVnaXN0ZXJNZXRob2RMaWJyYXJ5KGxpYiwgcGFyYW1zKTsKLQkJLy9saWJNZ3IuY3JlYXRlTWV0aG9kTGlicmFyeShuYW1lLCBwYXJhbXMpOwotCQkvL2xpYk1nci5zZXRNZXRob2RMaWJyYXJ5KGxpYik7Ci0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2V0TGlicmFyeU1hbmFnZXIobGliTWdyKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlI3VuUmVnaXN0ZXJNZXRob2RMaWJyYXJ5KG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1blJlZ2lzdGVyTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYikgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJLy9Gb3Igbm93LCBzdGlsbCBzaW1wbHkgd3JhcGluZyB1cCBvbGQgaW1wbGVtZW50YXRpb24gKGNvcGllZCBmcm9tIENvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlKSBmb3Igc21vb3RoZXIgY2hhbmdlCi0JCUlMaWJyYXJ5TWFuYWdlciBsaWJNZ3IgPSBnZXRMaWJyYXJ5TWFuYWdlcihsaWIpOwotCQlpZiAobGliTWdyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlyZW1vdmVMaWJyYXJ5TWFuYWdlcihsaWJNZ3IpOwotCQkvL2xpYk1nci5jbG9zZU1ldGhvZExpYnJhcnkoKTsKLQkJbGliTWdyLnVuUmVnaXN0ZXJNZXRob2RMaWJyYXJ5KCk7Ci0JCWxpYk1nci5kaXNwb3NlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVNlcnZpY2VFeGNlcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTkzMjMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IGEgTGlicmFyeSBTZXJ2aWNlIG9wZXJhdGlvbiBoYXMgZmFpbGVkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihyb290Q2F1c2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UgYW5kIHRoZSByb290IGNhdXNlIG9mIHRoZQotCSAqIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2csIFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIoZXJyb3JNc2csIHJvb3RDYXVzZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlTZXJ2aWNlTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5U2VydmljZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZDIyYmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlTZXJ2aWNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBBIGRlZmF1bHQgbGlicmFyeSBzZXJ2aWNlIGxpc3RlbmVyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGltcGxlbWVudHMgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNjb25maWd1cmF0aW9uU2V0KG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5Q2xvc2VkKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeUNyZWF0ZWQob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeU9wZW5lZChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlSZW9wZW5lZChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeVNldChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeVNldChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5U2VydmljZVV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5U2VydmljZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M0Y2M2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVNlcnZpY2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLk1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTW9kZWxTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBIZWxwZXIgdXRpbGl0aWVzIGZvciBhY2Nlc3NpbmcgYW5kIG1hbmFnaW5nIGEgbWV0aG9kIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVNlcnZpY2VVdGlsIHsKLQotCS8vIEEgY2hlY2tsaXN0IGZpbHRlci4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIENIRUNLTElTVF9GSUxURVIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBDaGVja2xpc3Q7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogR2V0cyB0aGUgYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGhvZExpYnJhcnlQYXRoKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlpZiAobGlicmFyeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGxpYnJhcnkuZVJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlVUkkgcmVzb3VyY2VVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCWlmIChyZXNvdXJjZVVSSSAhPSBudWxsICYmIHJlc291cmNlVVJJLmlzRmlsZSgpKSB7Ci0JCQkJU3RyaW5nIHBhdGggPSByZXNvdXJjZVVSSS50b0ZpbGVTdHJpbmcoKTsKLQkJCQlyZXR1cm4gbmV3IEZpbGUocGF0aCkuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkgewotCQlyZXR1cm4gZ2V0TWV0aG9kTGlicmFyeVBhdGgoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgbWV0aG9kIGxpYnJhcnkgb2YgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kTGlicmFyeSBnZXRNZXRob2RMaWJyYXJ5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlmb3IgKEVPYmplY3Qgb2JqID0gZWxlbWVudDsgb2JqICE9IG51bGw7IG9iaiA9IG9iai5lQ29udGFpbmVyKCkpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJcmV0dXJuIChNZXRob2RMaWJyYXJ5KSBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIHNwZWNpZmljIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigKLQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JCQlMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGNvbmZpZ3MgPSBsaWJyYXJ5Ci0JCQkJCS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJCWZvciAoSXRlcmF0b3I8TWV0aG9kQ29uZmlndXJhdGlvbj4gaXQgPSBjb25maWdzLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJY29uZmlnID0gaXQubmV4dCgpOwotCQkJCWlmICghKGNvbmZpZyBpbnN0YW5jZW9mIFByb2Nlc3NGYW1pbHkpCi0JCQkJCQkmJiBjb25maWcuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCQlyZXR1cm4gY29uZmlnOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIGluIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1ldGhvZCBjb25maWd1cmF0aW9ucwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kQ29uZmlndXJhdGlvbltdIGdldE1ldGhvZENvbmZpZ3VyYXRpb25zKAotCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gY29uZmlnczsKLQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JCQljb25maWdzID0gbmV3IEFycmF5TGlzdDxNZXRob2RDb25maWd1cmF0aW9uPihsaWJyYXJ5Ci0JCQkJCS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZENvbmZpZ3VyYXRpb24+IGkgPSBjb25maWdzLml0ZXJhdG9yKCk7IGkKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQljb25maWcgPSBpLm5leHQoKTsKLQkJCQlpZiAoY29uZmlnID09IG51bGwgfHwgY29uZmlnIGluc3RhbmNlb2YgUHJvY2Vzc0ZhbWlseSkgewotCQkJCQlpLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWNvbmZpZ3MgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb25bXSByZXN1bHQgPSBuZXcgTWV0aG9kQ29uZmlndXJhdGlvbltjb25maWdzLnNpemUoKV07Ci0JCWNvbmZpZ3MudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG5hbWVzIG9mIGFsbCBtZXRob2QgY29uZmlndXJhdGlvbnMgaW4gYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lcyhNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJTGlzdDxTdHJpbmc+IGNvbmZpZ05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCQkJTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBjb25maWdzID0gbGlicmFyeQotCQkJCQkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZENvbmZpZ3VyYXRpb24+IGkgPSBjb25maWdzLml0ZXJhdG9yKCk7IGkKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQljb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaS5uZXh0KCk7Ci0JCQkJaWYgKCEoY29uZmlnIGluc3RhbmNlb2YgUHJvY2Vzc0ZhbWlseSkpIHsKLQkJCQkJY29uZmlnTmFtZXMuYWRkKGNvbmZpZy5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2NvbmZpZ05hbWVzLnNpemUoKV07Ci0JCWNvbmZpZ05hbWVzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0aGUgcHJvY2Vzc2VzIGluIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1biBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q2FwYWJpbGl0eVBhdHRlcm48L2NvZGU+IGFuZAotCSAqICAgICAgICA8Y29kZT5EZWxpdmVyeVByb2Nlc3M8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBQcm9jZXNzPiBnZXRQcm9jZXNzZXMoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXA8U3RyaW5nLCBQcm9jZXNzPiByZXN1bHQgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIFByb2Nlc3M+KCk7Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBtZXRob2RQbHVnaW5zID0gTGlicmFyeVV0aWwKLQkJCQkuZ2V0TWV0aG9kUGx1Z2lucyhsaWJyYXJ5KTsKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RQbHVnaW4+IGkgPSBtZXRob2RQbHVnaW5zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIG1ldGhvZFBsdWdpbiA9IGkubmV4dCgpOwotCQkJU3RyaW5nIGNhcGFiaWxpdHlQYXR0ZXJuUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoOwotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZSgKLQkJCQkJbWV0aG9kUGx1Z2luLCBjYXBhYmlsaXR5UGF0dGVyblBhdGhzKTsKLQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJCWdldENhcGFiaWxpdHlQYXR0ZXJucygoUHJvY2Vzc1BhY2thZ2UpIG1ldGhvZFBhY2thZ2UsCi0JCQkJCQkJcmVzdWx0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlTdHJpbmcgZGVsaXZlcnlQcm9jZXNzUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aDsKLQkJCW1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwKLQkJCQkJZGVsaXZlcnlQcm9jZXNzUGF0aHMpOwotCQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKFByb2Nlc3NQYWNrYWdlKSBtZXRob2RQYWNrYWdlLCByZXN1bHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm5zIGluIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1biBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q2FwYWJpbGl0eVBhdHRlcm48L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBQcm9jZXNzPiBnZXRDYXBhYmlsaXR5UGF0dGVybnMoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXA8U3RyaW5nLCBQcm9jZXNzPiByZXN1bHQgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIFByb2Nlc3M+KCk7Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBtZXRob2RQbHVnaW5zID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2lucyhsaWJyYXJ5KTsKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RQbHVnaW4+IGkgPSBtZXRob2RQbHVnaW5zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIG1ldGhvZFBsdWdpbiA9IGkubmV4dCgpOwotCQkJU3RyaW5nIGNhcGFiaWxpdHlQYXR0ZXJuUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoOwotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZSgKLQkJCQkJbWV0aG9kUGx1Z2luLCBjYXBhYmlsaXR5UGF0dGVyblBhdGhzKTsKLQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXRDYXBhYmlsaXR5UGF0dGVybnMoKFByb2Nlc3NQYWNrYWdlKSBtZXRob2RQYWNrYWdlLCByZXN1bHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIGNhcGFiaWxpdHkgcGF0dGVybnMgaW4gYSBtZXRob2QgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBhIG1ldGhvZCBwbHVnLWluCi0JICogQHJldHVuIGEgY29sbGVjdGlvbiBvZiA8Y29kZT5DYXBhYmlsaXR5UGF0dGVybjwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8Q2FwYWJpbGl0eVBhdHRlcm4+IGdldENhcGFiaWxpdHlQYXR0ZXJucygKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJTGlzdDxDYXBhYmlsaXR5UGF0dGVybj4gY2FwYWJpbGl0eVBhdHRlcm5zID0gbmV3IEFycmF5TGlzdDxDYXBhYmlsaXR5UGF0dGVybj4oKTsKLQkJTGlzdDxQcm9jZXNzPiBpdGVtcyA9IFRuZ1V0aWwuZ2V0QWxsUHJvY2Vzc2VzKHBsdWdpbik7Ci0JCWZvciAoSXRlcmF0b3I8UHJvY2Vzcz4gaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQcm9jZXNzIHByb2Nlc3MgPSBpdC5uZXh0KCk7Ci0JCQlpZiAocHJvY2VzcyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJY2FwYWJpbGl0eVBhdHRlcm5zLmFkZCgoQ2FwYWJpbGl0eVBhdHRlcm4pIHByb2Nlc3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjYXBhYmlsaXR5UGF0dGVybnM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIGRlbGl2ZXJ5IHByb2Nlc3NlcyBpbiB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dW4gYSBjb2xsZWN0aW9uIG9mIDxjb2RlPkRlbGl2ZXJ5UHJvY2VzczwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFByb2Nlc3M+IGdldERlbGl2ZXJ5UHJvY2Vzc2VzKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWFwPFN0cmluZywgUHJvY2Vzcz4gcmVzdWx0ID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBQcm9jZXNzPigpOwotCQlMaXN0PE1ldGhvZFBsdWdpbj4gbWV0aG9kUGx1Z2lucyA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbnMobGlicmFyeSk7Ci0JCWZvciAoSXRlcmF0b3I8TWV0aG9kUGx1Z2luPiBpID0gbWV0aG9kUGx1Z2lucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBtZXRob2RQbHVnaW4gPSBpLm5leHQoKTsKLQkJCVN0cmluZyBkZWxpdmVyeVByb2Nlc3NQYXRoc1tdID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoOwotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZSgKLQkJCQkJbWV0aG9kUGx1Z2luLCBkZWxpdmVyeVByb2Nlc3NQYXRocyk7Ci0JCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKFByb2Nlc3NQYWNrYWdlKSBtZXRob2RQYWNrYWdlLCByZXN1bHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIGRlbGl2ZXJ5IHByb2Nlc3NlcyBpbiBhIG1ldGhvZCBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBsdWctaW4KLQkgKiBAcmV0dW4gYSBjb2xsZWN0aW9uIG9mIDxjb2RlPkRlbGl2ZXJ5UHJvY2VzczwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8RGVsaXZlcnlQcm9jZXNzPiBnZXREZWxpdmVyeVByb2Nlc3NlcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCUxpc3Q8RGVsaXZlcnlQcm9jZXNzPiBkZWxpdmVyeVByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3Q8RGVsaXZlcnlQcm9jZXNzPigpOwotCQlMaXN0PFByb2Nlc3M+IGl0ZW1zID0gVG5nVXRpbC5nZXRBbGxQcm9jZXNzZXMocGx1Z2luKTsKLQkJZm9yIChJdGVyYXRvcjxQcm9jZXNzPiBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVByb2Nlc3MgcHJvY2VzcyA9IGl0Lm5leHQoKTsKLQkJCWlmIChwcm9jZXNzIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJZGVsaXZlcnlQcm9jZXNzZXMuYWRkKChEZWxpdmVyeVByb2Nlc3MpIHByb2Nlc3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJucyBpbiBhIHByb2Nlc3MgcGFja2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2Vzc1BhY2thZ2UKLQkgKiAgICAgICAgICAgIGEgcHJvY2VzcyBwYWNrYWdlCi0JICogQHBhcmFtIHJlc3VsdAotCSAqICAgICAgICAgICAgYSBtYXAKLQkgKiBAcmV0dXJuIGFuIHVwZGF0ZWQgbWFwIGNvbnRhaW5pbmcgYSBjb2xsZWN0aW9uIG9mCi0JICogICAgICAgICA8Y29kZT5DYXBhYmlsaXR5UGF0dGVybjwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKFByb2Nlc3NQYWNrYWdlIHByb2Nlc3NQYWNrYWdlLAotCQkJTWFwPFN0cmluZywgUHJvY2Vzcz4gcmVzdWx0KSB7Ci0JCUxpc3Q8TWV0aG9kUGFja2FnZT4gY2hpbGRQYWNrYWdlcyA9IHByb2Nlc3NQYWNrYWdlLmdldENoaWxkUGFja2FnZXMoKTsKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RQYWNrYWdlPiBpID0gY2hpbGRQYWNrYWdlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gaS5uZXh0KCk7Ci0JCQlpZiAocGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KSBwa2c7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2Nlc3MgPSBwcm9jZXNzQ29tcG9uZW50Ci0JCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJCWlmIChwcm9jZXNzIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBwcm9jZXNzLmdldE5hbWUoKTsKLQkJCQkJcmVzdWx0LnB1dChuYW1lLCBwcm9jZXNzKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKChQcm9jZXNzUGFja2FnZSkgcGtnLCByZXN1bHQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIGRlbGl2ZXJ5IHByb2Nlc3NlcyBpbiBhIHByb2Nlc3MgcGFja2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2Vzc1BhY2thZ2UKLQkgKiAgICAgICAgICAgIGEgcHJvY2VzcyBwYWNrYWdlCi0JICogQHBhcmFtIHJlc3VsdAotCSAqICAgICAgICAgICAgYSBtYXAKLQkgKiBAcmV0dXJuIGFuIHVwZGF0ZWQgbWFwIGNvbnRhaW5pbmcgYSBjb2xsZWN0aW9uIG9mCi0JICogICAgICAgICA8Y29kZT5EZWxpdmVyeVByb2Nlc3M8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGdldERlbGl2ZXJ5UHJvY2Vzc2VzKFByb2Nlc3NQYWNrYWdlIHByb2Nlc3NQYWNrYWdlLAotCQkJTWFwPFN0cmluZywgUHJvY2Vzcz4gcmVzdWx0KSB7Ci0JCUxpc3Q8TWV0aG9kUGFja2FnZT4gY2hpbGRQYWNrYWdlcyA9IHByb2Nlc3NQYWNrYWdlLmdldENoaWxkUGFja2FnZXMoKTsKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RQYWNrYWdlPiBpID0gY2hpbGRQYWNrYWdlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gaS5uZXh0KCk7Ci0JCQlpZiAocGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KSBwa2c7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2Nlc3MgPSBwcm9jZXNzQ29tcG9uZW50Ci0JCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJCWlmIChwcm9jZXNzIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gcHJvY2Vzcy5nZXROYW1lKCk7Ci0JCQkJCXJlc3VsdC5wdXQobmFtZSwgcHJvY2Vzcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChwa2cgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc2VzKChQcm9jZXNzUGFja2FnZSkgcGtnLCByZXN1bHQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmFtZXMgb2YgYWxsIHByb2Nlc3MgZmFtaWxpZXMgaW4gYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcHJvY2VzcyBmYW1pbHkgbmFtZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFByb2Nlc3NGYW1pbHlOYW1lcyhNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJTGlzdDxTdHJpbmc+IHByb2Nlc3NGYW1pbHlOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkJCUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gY29uZmlncyA9IGxpYnJhcnkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZENvbmZpZ3VyYXRpb24+IGkgPSBjb25maWdzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCWNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpLm5leHQoKTsKLQkJCQlpZiAoY29uZmlnIGluc3RhbmNlb2YgUHJvY2Vzc0ZhbWlseSkgewotCQkJCQlwcm9jZXNzRmFtaWx5TmFtZXMuYWRkKGNvbmZpZy5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbcHJvY2Vzc0ZhbWlseU5hbWVzLnNpemUoKV07Ci0JCXByb2Nlc3NGYW1pbHlOYW1lcy50b0FycmF5KHJlc3VsdCk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuYW1lcyBvZiBhbGwgY29udGV4dHMgKG1ldGhvZCBjb25maWd1cmF0aW9ucykgYXNzaWduZWQgdG8gYQotCSAqIHByb2Nlc3MuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiAgICAgICAgICAgIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNvbnRleHQgKG1ldGhvZCBjb25maWd1cmF0aW9uKSBuYW1lcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q29udGV4dHMoUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjb250ZXh0TmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkgewotCQkJTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBjb250ZXh0cyA9IHByb2Nlc3MuZ2V0VmFsaWRDb250ZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZENvbmZpZ3VyYXRpb24+IGl0ID0gY29udGV4dHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29udGV4dCA9IGl0Lm5leHQoKTsKLQkJCQljb250ZXh0TmFtZXMuYWRkKGNvbnRleHQuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2NvbnRleHROYW1lcy5zaXplKCldOwotCQljb250ZXh0TmFtZXMudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbnMgYXNzaWduZWQgdG8gYSBwcm9jZXNzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICogICAgICAgICAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+TWV0aG9kQ29uZmlndXJhdGlvbjwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIE1ldGhvZENvbmZpZ3VyYXRpb24+IGdldE1ldGhvZENvbmZpZ3VyYXRpb25zKFByb2Nlc3MgcHJvY2VzcykgewotCQlpZiAocHJvY2VzcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU1hcDxTdHJpbmcsIE1ldGhvZENvbmZpZ3VyYXRpb24+IHJlc3VsdCA9IG5ldyBUcmVlTWFwPFN0cmluZywgTWV0aG9kQ29uZmlndXJhdGlvbj4oKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29udGV4dCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJaWYgKGRlZmF1bHRDb250ZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdC5wdXQoZGVmYXVsdENvbnRleHQuZ2V0TmFtZSgpLCBkZWZhdWx0Q29udGV4dCk7Ci0JCX0KLQotCQlMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGNvbnRleHRzID0gcHJvY2Vzcy5nZXRWYWxpZENvbnRleHQoKTsKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RDb25maWd1cmF0aW9uPiBpID0gY29udGV4dHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbnRleHQgPSBpLm5leHQoKTsKLQkJCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQucHV0KGNvbnRleHQuZ2V0TmFtZSgpLCBjb250ZXh0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIGNoZWNrbGlzdHMgaW4gYSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q2hlY2tsaXN0PC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgQ2hlY2tsaXN0PiBnZXRDaGVja2xpc3RzKAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU1hcDxTdHJpbmcsIENoZWNrbGlzdD4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDaGVja2xpc3Q+KCk7Ci0KLQkJQXJyYXlMaXN0PElGaWx0ZXI+IGZpbHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PElGaWx0ZXI+KCk7Ci0JCWZpbHRlckxpc3QuYWRkKENIRUNLTElTVF9GSUxURVIpOwotCQlNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QgZWxlbWVudExpc3QgPSBuZXcgTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0KAotCQkJCWNvbmZpZywgZmlsdGVyTGlzdCk7Ci0JCUxpc3QgZWxlbWVudHMgPSBlbGVtZW50TGlzdC5nZXRMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCUNoZWNrbGlzdCBjaGVja2xpc3QgPSAoQ2hlY2tsaXN0KSBvYmo7Ci0JCQkJcmVzdWx0LnB1dChjaGVja2xpc3QuZ2V0TmFtZSgpLCBjaGVja2xpc3QpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBHVUlEIGZvciBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0R1VJRChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGd1aWQgPSBlbGVtZW50LmdldEd1aWQoKTsKLQkJaWYgKGd1aWQgPT0gbnVsbCB8fCBndWlkLmxlbmd0aCgpID09IDApIHsKLQkJCWd1aWQgPSBFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCk7Ci0JCQlib29sZWFuIG9sZE5vdGlmeSA9IGVsZW1lbnQuZURlbGl2ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJZWxlbWVudC5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkJZWxlbWVudC5zZXRHdWlkKGd1aWQpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQllbGVtZW50LmVTZXREZWxpdmVyKG9sZE5vdGlmeSk7Ci0JCQl9Ci0JCX0KLQotCQlMaXN0IGNoaWxkcmVuID0gZWxlbWVudC5lQ29udGVudHMoKTsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4uc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY2hpbGQgPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlzZXRHVUlEKChNZXRob2RFbGVtZW50KSBjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVidWcgc3RyaW5nIGZvciBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBtZXRob2QgZWxlbWVudCBjbGFzcyBuYW1lLCBuYW1lIGFuZCBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVidWdTdHJpbmcoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZWxlbWVudC5nZXRDbGFzcygpLmdldE5hbWUoKSArICJbbmFtZTogIiArIGVsZW1lbnQuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkrICIsIGd1aWQ9IiArIGVsZW1lbnQuZ2V0R3VpZCgpICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IHBlcnNpc3Rlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IHBlcnNpc3RlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUxpYnJhcnlQZXJzaXN0ZXIgZ2V0Q3VycmVudFBlcnNpc3RlcigpIHsKLQkJdHJ5IHsKLQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCQkJaWYgKHJlc291cmNlU2V0IGluc3RhbmNlb2YgSUxpYnJhcnlSZXNvdXJjZVNldCkgewotCQkJCXJldHVybiAoKElMaWJyYXJ5UmVzb3VyY2VTZXQpIHJlc291cmNlU2V0KS5nZXRQZXJzaXN0ZXIoKTsKLQkJCX0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1ldGhvZCBsaWJyYXJ5IHBlcnNpc3RlciBmb3IgYSBnaXZlbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkgcGVyc2lzdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBJTGlicmFyeVBlcnNpc3RlciBnZXRQZXJzaXN0ZXJGb3IoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlU2V0KSB7Ci0JCQlyZXR1cm4gKChJTGlicmFyeVJlc291cmNlU2V0KSByZXNvdXJjZVNldCkuZ2V0UGVyc2lzdGVyKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtZXRob2QgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgbmV3IHBsdWctaW4KLQkgKiBAcGFyYW0gYnJpZWZEZXNjCi0JICogICAgICAgICAgICBhIGJyaWVmIGRlc2NyaXB0aW9uIGZvciB0aGUgbmV3IHBsdWctaW4KLQkgKiBAcGFyYW0gYXV0aG9ycwotCSAqICAgICAgICAgICAgdGhlIGF1dGhvcnMgb2YgdGhlIG5ldyBwbHVnLWluCi0JICogQHBhcmFtIHJlZmVyZW5jZWRQbHVnaW5zCi0JICogICAgICAgICAgICB0aGUgcGx1Zy1pbnMgcmVmZXJlbmNlZCBieSB0aGUgbmV3IHBsdWctaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBsdWdpbiBjcmVhdGVNZXRob2RQbHVnaW4oU3RyaW5nIG5hbWUsCi0JCQlTdHJpbmcgYnJpZWZEZXNjLCBTdHJpbmcgYXV0aG9ycywgT2JqZWN0W10gcmVmZXJlbmNlZFBsdWdpbnMpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RQbHVnaW4oKTsKLQotCQlwbHVnaW4uc2V0TmFtZShTdHJVdGlsLm1ha2VWYWxpZEZpbGVOYW1lKG5hbWUpKTsKLQkJaWYgKGJyaWVmRGVzYyAhPSBudWxsKSB7Ci0JCQlwbHVnaW4uc2V0QnJpZWZEZXNjcmlwdGlvbihicmllZkRlc2MpOwotCQl9Ci0JCWlmIChhdXRob3JzICE9IG51bGwpIHsKLQkJCXBsdWdpbi5zZXRBdXRob3JzKGF1dGhvcnMpOwotCQl9Ci0JCWlmIChyZWZlcmVuY2VkUGx1Z2lucyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZWRQbHVnaW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHJlZmVyZW5jZWRQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSByZWZlcmVuY2VkUGx1Z2luc1tpXTsKLQkJCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCQkJcGx1Z2luLmdldEJhc2VzKCkuYWRkKHJlZmVyZW5jZWRQbHVnaW4pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCU1vZGVsU3RvcmFnZS5pbml0aWFsaXplKHBsdWdpbik7Ci0KLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQzYTNkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQkVHSU4gTk8gVFJBTlNMQVRJT04KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgUm9sZSBkaWFncmFtIGZvbnRzIGFuZCBsYXlvdXQKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLXJvbGVEaWFncmFtRm9udF9uYW1lPUFyaWFsCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV9qYT1cdTMwYzBcdTMwYTRcdTMwYTJcdTMwZWRcdTMwYjAKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLXJvbGVEaWFncmFtRm9udF9uYW1lX2tvPVx1YjMwMFx1ZDY1NCBcdWMwYzFcdWM3OTAKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLXJvbGVEaWFncmFtRm9udF9uYW1lX3poPVx1NWJmOVx1OGJkZFx1Njg0NgotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotcm9sZURpYWdyYW1Gb250X25hbWVfemhfVFc9RGlhbG9nCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMj1BcmlhbAotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotcm9sZURpYWdyYW1Gb250X25hbWVfd2luMzJfamE9TVMgR290aGljCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl9rbz1cdWFkNzRcdWI5YmNcdWNjYjQKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLXJvbGVEaWFncmFtRm9udF9uYW1lX3dpbjMyX3poPVx1OWVkMVx1NGY1MwotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotcm9sZURpYWdyYW1Gb250X25hbWVfd2luMzJfemhfVFc9XHU3ZDMwXHU2NjBlXHU5YWQ0Ci0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1yb2xlRGlhZ3JhbUZvbnRfc2l6ZT0xMAotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotcm9sZURpYWdyYW1Gb250X3NpemVfd2luMzI9MTAKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLXJvbGVEaWFncmFtX3hNYXJnaW49MjAwCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1yb2xlRGlhZ3JhbV94U3BhY2luZz03MAotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotcm9sZURpYWdyYW1feVNwYWNpbmc9MzAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRU5EIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi11bmtub3duX3RleHQ9VW5rbm93bgotCi0jIEVycm9yIFJlYXNvbnMKLWVtcHR5TGlicmFyeVBhdGhFcnJvcl9yZWFzb249VGhlIG1ldGhvZCBsaWJyYXJ5IHBhdGggaXMgZW1wdHkuCi1taXNzaW5nTGlicmFyeUZpbGVFcnJvcl9yZWFzb249VGhlIG1ldGhvZCBsaWJyYXJ5IG1vZGVsIGZpbGUgaXMgbWlzc2luZy4KLXVucmVzb2x2ZWRQcm94eUVycm9yX3JlYXNvbj1UaGUgc2VsZWN0ZWQgbWV0aG9kIGxpYnJhcnkgY29udGFpbnMgdW5yZXNvbHZlZCBlbGVtZW50IHJlZmVyZW5jZXMuIFRoaXMgaXMgdXN1YWxseSBjYXVzZWQgYnkgbWlzc2luZyBvciBkaXNwbGFjZWQgWE1JIGZpbGVzIGluIHRoZSBsaWJyYXJ5IGZvbGRlci5cblxuQ2xvc2UgdGhpcyBkaWFsb2cgYW5kIGJyaW5nIHVwIHRoZSBQcm9ibGVtcyB2aWV3IHRvIGhlbHAgaWRlbnRpZnkgdGhlIHVucmVzb2x2ZWQgcmVmZXJlbmNlcy4gVG8gYXZvaWQgY29ycnVwdGluZyB0aGUgbGlicmFyeSwgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IHJlc29sdmUgdGhlc2UgcmVmZXJlbmNlcyBmaXJzdCBiZWZvcmUgYWRkaW5nIG1vcmUgY2hhbmdlcyB0byB0aGUgbGlicmFyeS4KLQotIyBXYXJuaW5nIE1lc3NhZ2VzCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cxPUlVUEwwMDA3VzogT25lIG9yIG1vcmUgY2hpbGQgZWxlbWVudHMgY29udGFpbiBtaXNzaW5nIHJlZmVyZW5jZXMKLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzI9SVVQTDAwMDhXOiBUaGlzIGVsZW1lbnQgc2hvdWxkIGJlIHNlbGVjdGVkIHRvIHJlc29sdmUgb25lIG9yIG1vcmUgbWlzc2luZyByZWZlcmVuY2VzCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2czPUlVUEwwMDA5VzogVGhpcyBlbGVtZW50IHJlZmVyZW5jZXMgb25lIG9yIG1vcmUgZWxlbWVudHMgaW4gYW4gdW5zZWxlY3RlZCBwYWNrYWdlCi0KLUVsZW1lbnRFcnJvcl9taXNzaW5nX2VsZW1lbnQ9Jyd7MH0nJyByZWZlcmVuY2VzIHVuc2VsZWN0ZWQgZWxlbWVudCAnJ3sxfScnCi1FbGVtZW50RXJyb3JfY29udHJpYnV0b3JfbWlzc2luZ19iYXNlPScnezB9JycgY29udHJpYnV0ZXMgdG8gdW5zZWxlY3RlZCBlbGVtZW50ICcnezF9JycKLUVsZW1lbnRFcnJvcl9leHRlbmRlcl9taXNzaW5nX2Jhc2U9Jyd7MH0nJyBleHRlbmRzIHVuc2VsZWN0ZWQgZWxlbWVudCAnJ3sxfScnCi1FbGVtZW50RXJyb3JfcmVwbGFjZXJfbWlzc2luZ19iYXNlPScnezB9JycgcmVwbGFjZXMgdW5zZWxlY3RlZCBlbGVtZW50ICcnezF9JycKLUVsZW1lbnRFcnJvcl9taXNzaW5nX3ByaW1hcnlfcGVyZm9ybWVyPScnezB9JycgbWlzc2luZyBwcmltYXJ5IHBlcmZvcm1lciAnJ3sxfScnCi1FbGVtZW50RXJyb3JfbWlzc2luZ19tYW5kYXRvcnlfaW5wdXQ9Jyd7MH0nJyBtaXNzaW5nIG1hbmRhdG9yeSBpbnB1dCAnJ3sxfScnCi1FbGVtZW50RXJyb3JfbWlzc2luZ19vdXRwdXQ9Jyd7MH0nJyBtaXNzaW5nIG91dHB1dCAnJ3sxfScnCi0KLSMgRXJyb3IgTWVzc2FnZXMKLWxvYWRSZXNvdXJjZXNFcnJvcl9tc2c9SVVQTDAwMDBFOiBUaGUgbWV0aG9kIGxpYnJhcnkgaGFzIGJlZW4gbG9hZGVkIGJ1dCBzb21lIGVycm9ycyBoYXZlIGJlZW4gZGV0ZWN0ZWQuCi11bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX21zZz1JVVBMMDAwMUU6IFRoaXMgZ3VpZGFuY2UgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhbm90aGVyIHR5cGUuCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDJFOiBUaGlzIGd1aWRhbmNlIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHRhcmdldCB0eXBlLgotc2F2ZUNvbnZlcnRlZEd1aWRhbmNlRXJyb3JfbXNnPUlVUEwwMDAzRTogVGhlIGNvbnZlcnRlZCBndWlkYW5jZSAnJ3swfScnIGNhbm5vdCBiZSBzYXZlZC4KLQotIyBDb252ZXJ0IGFjdGl2aXR5Ci1jb252ZXJ0QWN0aXZpdHlFcnJvcl90aXRsZT1Db252ZXJ0IEFjdGl2aXR5IFR5cGUgRXJyb3IKLWNvbnZlcnRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwNkU6IFRoaXMgYWN0aXZpdHkgY2Fubm90IGJlIGNvbnZlcnRlZCB0byB0aGUgdGFyZ2V0IHR5cGUuCi1zYXZlQ29udmVydGVkQWN0aXZpdHlFcnJvcl9tc2c9SVVQTDAwMDdFOiBUaGUgY29udmVydGVkIGFjdGl2aXR5ICcnezB9JycgY2Fubm90IGJlIHNhdmVkLgotCi0jIEVycm9yIFJlYXNvbnMKLWVycm9yX3JlYXNvbj1JVVBMMDAwNEU6IEFuIGVycm9yIGhhcyBvY2N1cnJlZC4gQ2xpY2sgT0sgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi11bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX3JlYXNvbj1UaGVyZSBpcyBubyBjb21wYXRpYmxlIGd1aWRhbmNlIHR5cGUgZm9yIHswfS4KLWludmFsaWRMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbj1JbnZhbGlkIGxpYnJhcnkgcGF0aC4gVGhlIC5wcm9qZWN0IGZpbGUgY291bGQgbm90IGJlIGNyZWF0ZWQuCi1jb3VsZE5vdExvY2tMaWJyYXJ5X3JlYXNvbj1Db3VsZCBub3QgbG9jayBsaWJyYXJ5LgotCi0jIFByb2dyZXNzIE1lc3NhZ2VzCi1jb3B5aW5nQXR0YWNobWVudHNUYXNrX25hbWU9Q29weWluZyBhdHRhY2htZW50cy4uLgotCi0jIENvbnZlcnQgR3VpZGFuY2UgRGlhbG9nCi1jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGl0bGU9Q29udmVydCBHdWlkYW5jZSBUeXBlCi1jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGV4dD1TZWxlY3QgdGhlIHRhcmdldCBndWlkYW5jZSB0eXBlLgotCi0jIEd1aWRhbmNlIHR5cGUgbmFtZXMgZm9yIENvbnZlcnQgR3VpZGFuY2UgRGlhbG9nCi1jaGVja2xpc3RfdGV4dD1DaGVja2xpc3QKLWNvbmNlcHRfdGV4dD1Db25jZXB0Ci1leGFtcGxlX3RleHQ9RXhhbXBsZQotZ3VpZGVsaW5lX3RleHQ9R3VpZGVsaW5lCi1lc3RpbWF0ZV90ZXh0PUVzdGltYXRlCi1lc3RpbWF0aW5nTWV0cmljX3RleHQ9RXN0aW1hdGluZyBNZXRyaWMKLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0PUVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMKLXJlcG9ydF90ZXh0PVJlcG9ydAotdGVtcGxhdGVfdGV4dD1UZW1wbGF0ZQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ9U3VwcG9ydGluZyBNYXRlcmlhbAotdG9vbE1lbnRvcl90ZXh0PVRvb2wgTWVudG9yCi13aGl0ZXBhcGVyX3RleHQ9V2hpdGVwYXBlcgotdGVybURlZmluaXRpb25fdGV4dD1UZXJtIERlZmluaXRpb24KLXByYWN0aWNlX3RleHQ9UHJhY3RpY2UKLXJldXNhYmxlQXNzZXRfdGV4dD1SZXVzYWJsZSBBc3NldAotCi0jYWN0aXZpdHkgYnJlYWtkb3duIGluZm8gc3RyaW5ncwotQWN0aXZpdHlMYXlvdXRfcHJpbWFyeVRhc2tzX3RleHQ9UGVyZm9ybXMgYXMgT3duZXIKLUFjdGl2aXR5TGF5b3V0X2FkZGl0aW9uYWxUYXNrc190ZXh0PVBlcmZvcm1zIGFzIEFkZGl0aW9uYWwKLQotIyBDb252ZXJ0IEd1aWRhbmNlIEVycm9yIE1lc3NhZ2VzCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl90aXRsZT1Db252ZXJ0IEd1aWRhbmNlIFR5cGUgRXJyb3IKLQotIyBMb2FkIFJlc291cmNlcyBFcnJvciBEaWFsb2cKLWxvYWRSZXNvdXJjZXNFcnJvcl90aXRsZT1PcGVuIE1ldGhvZCBMaWJyYXJ5IEVycm9yCi1sb2FkUmVzb3VyY2VzRXJyb3JfcmVhc29uPVNvbWUgbGlicmFyeSByZXNvdXJjZXMgY291bGQgbm90IGJlIGxvYWRlZC5cblxuQ2xpY2sgRGV0YWlscyB0byByZXZpZXcgdGhlIGVycm9ycyBhbmQgcmVzb2x2ZSB0aGVtIGJlZm9yZSBhZGRpbmcgbW9yZSBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5LgotCi0jIFJvbGUgRGlhZ3JhbXMKLXJvbGVEaWFncmFtUGVyZm9ybXNfdGV4dD1wZXJmb3Jtcwotcm9sZURpYWdyYW1SZXNwb25zaWJsZUZvcl90ZXh0PXJlc3BvbnNpYmxlIGZvcgotCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cwPVJlZmVyZW5jZWQgZWxlbWVudDogezB9Ci1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxPUluZm86IHswfQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHND1XYXJuaW5nOiB7MH0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzc9RXJyb3I6IHswfQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTA9TWlzc2luZyByZWZlcmVuY2VkIGVsZW1lbnQgezB9Ci1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMT1VbmFibGUgdG8gZmluZCBlbGVtZW50IGZvciBndWlkIHswfQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTI9RmlsZSAnJ3swfScnIHJlZmVyZW5jZXMgbWlzc2luZyByZXNvdXJjZSAnJ3sxfScnCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNT1taXNzaW5nIHJlc291cmNlIGZpbGUgJyd7MH0nJwotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTc9VW5hYmxlIHRvIGNvbm5lY3QgdG8gVVJMICcnezB9JycKLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE5PVVuYWJsZSB0byBjb25uZWN0IHRvIFVSTCAnJ3swfScnOiB7MX0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOD1Db3VsZCBub3QgZmluZCBmaWxlICcnezB9JycuCi1JbXBvcnRFeHBvcnRVdGlsX01TRzk9Q291bGQgbm90IGNyZWF0ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5ICcnezB9JycuCi11bmtub3duR3VpZGFuY2VfdGV4dD1Vbmtub3duCi0KLUNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb25fbG9nX25vQ29udGVudFBhdGg9Q29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbi5IYW5kbGVBdHRhY2htZW50c1BsdWdpbjogbm8gY29udGVudFBhdGggZm9yIHswfQotTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlcl9jYW5ub3RVcGRhdGU9SVVQTDAwMDZXOiBDYW5ub3QgdXBkYXRlIHswfSB7MX0KLXdhcm5pbmdEbGdfdGl0bGU9V2FybmluZwotZXJyb3JEbGdfdGl0bGU9RXJyb3IKLWVycm9yRGxnX3NhdmVFcnJvcj1JVVBMMDAwNUU6IEVycm9yIHNhdmluZyBjaGFuZ2VzIHRvIGZpbGUgJyd7MH0nJwotCi0jIGFjdGl2aXR5IGRpYWdyYW0gbmFtZXMKLWFjdGl2aXR5RGlhZ3JhbU5hbWU9QWN0aXZpdHkgZGlhZ3JhbTogezB9Ci1hY3Rpdml0eURldGFpbERpYWdyYW1OYW1lPUFjdGl2aXR5IGRldGFpbCBkaWFncmFtOiB7MH0KLXdwRGVwZW5kZW5jeURpYWdyYW1OYW1lPVdvcmsgcHJvZHVjdCBkZXBlbmRlbmN5IGRpYWdyYW06IHswfQotCi0jIGxvY2FsaXplIHRoZSB2YWx1ZSBiYXNlZCBvbiBsb2NhbGUuICBmb3IgZXhhbXBsZSwgCi0jIGZvciBFbmdsaXNoLCB0aGUgdmFsdWUgaXMgIi4gIgotI2NvbG9uX3dpdGhfc3BhY2U9OiAKLSMgZm9yIEZyZW5jaCwgdGhlIHZhbHVlIGlzICIgLiAiLCB5b3UgbmVlZCB0byB1c2UgYSBcIHRvIHByZXNlcnZlIHRoZSBsZWFkaW5nIHNwYWNlCi0jY29sb25fd2l0aF9zcGFjZT1cIDogCi0jIGZvciBDaGluZXNlLCB0aGUgY29sb24gc2hvdWxkIGJlIGRvdWJsZSBieXRlcwotIyBEb24ndCB0cmltIHRoZSBzcGFjZXMgYWZ0ZXIgdGhlIGNvbG9uLgotY29sb25fd2l0aF9zcGFjZT06IAotCi1vbGRUb29sVmVyc2lvbl9lcnJfbXNnPVRoaXMgdmVyc2lvbiBvZiB7MH0gaXMgbm90IGNvbXBhdGlibGUgd2l0aCB5b3VyIGxpYnJhcnkgZmlsZSAnJ3syfScnLiBZb3UgbXVzdCB1cGdyYWRlIHswfSB0byB2ZXJzaW9uIHsxfSBvciBoaWdoZXIgaW4gb3JkZXIgdG8gb3BlbiBpdC4KLXRvb2xWZXJzaW9uTWlzbWF0Y2hfZXJyX21zZz1UaGlzIHZlcnNpb24gb2YgezB9IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggeW91ciBsaWJyYXJ5IGZpbGUgJyd7Mn0nJy4gWW91IG11c3QgdXBncmFkZSB7MH0gdG8gYSBoaWdoZXIgdmVyc2lvbiBpbiBvcmRlciB0byBvcGVuIGl0LgotbGliVXBncmFkZVJlcXVpcmVkX2Vycl9tc2c9VGhlIHNwZWNpZmllZCBsaWJyYXJ5IG5lZWRzIHRvIGJlIHVwZ3JhZGVkIHRvIHRoZSBuZXcgbGlicmFyeSBzdHJ1Y3R1cmUuIE9wZW4gdGhlIGxpYnJhcnkgdG8gdXBncmFkZSBpdCBhbmQgdHJ5IGFnYWluLgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWZkMGEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0FjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVmFyaWFiaWxpdHlJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogQSBjb25maWd1cmF0b3IgdXNlZCBieSBhY3Rpdml0eSBkZWVwIGNvcHkgY29tbWFuZCB0byByZXNvdmxlIGFuZCBkZWVwIGNvcHkgY29udHJpYnV0b3JzIGFuZAotICogcmVwbGFjZXJzIG9mIGFjdGl2aXR5IGluIGEgbWV0b2hkIGNvbmZpZ3VyYXRpb24uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvciBleHRlbmRzIENvbmZpZ3VyYXRpb25GaWx0ZXJ7Ci0KLQkKLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBtZXRob2RDb25maWcgYSA8Y29kZT5NZXRob2RDb25maWd1cmF0aW9uPC9jb2RlPgotCSAqIEBwYXJhbSB2aWV3ZXIgYSA8Y29kZT5WaWV3ZXI8L2NvZGU+Ci0JICovCi0JcHVibGljIEFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcpIHsKLQkJc3VwZXIobWV0aG9kQ29uZmlnKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQ29uc3RydWN0cyB3aXRoIG51bGwgbWV0aG9kQ29uZmlnIHdoaWNoIGNvdWxkIGJlIHNldCBsYXRlci4KLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcigpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0JCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVmFyaWFiaWxpdHlJbmZvIGdldFZhcmlhYmlsaXR5SW5mbyhWYXJpYWJpbGl0eUVsZW1lbnQgdmUpIHsKLQotCQkvLyBjYWxjdWxhdGUgdGhlIGVsZW1lbnQgZmlyc3QKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gbmV3IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIobWV0aG9kQ29uZmlnLCBmYWxzZSwgdHJ1ZSl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGNhblNob3coTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9CQkJCi0JCX07Ci0JCXJldHVybiBnZXRWYXJpYWJpbGl0eUluZm8odmUsIHJlYWxpemVyKTsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGVzIHRoZSBzdXBlciBtZXRob2QgZm9yIG5vdCByZXNvbHZpbmcgdGhlIGJhc2UgdG8gaW5jbHVkZSBhZGRpdGlvbmFsIGNvbnRyaWJ1dG9ycy4gCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZUVsZW1lbnRWYXJpYWJpbGl0eUxpc3QoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQsCi0JCQlWYXJpYWJpbGl0eUluZm8gaW5mbywgYm9vbGVhbiBpbmNsdWRlQmFzZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0KLQkJaWYgKG1ldGhvZENvbmZpZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0JCQotCQkvL3Jlc29sdmUgdG8gaW5jbHVkZSBjb250cmlidXRvcnMKLQkJcmVzb2x2ZUVsZW1lbnRDb250cmlidXRvcnMoZWxlbWVudCxpbmZvLHJlYWxpemVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9BdHRyaWJ1dGVGZWF0dXJlVmFsdWUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTBlZGFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogZm9yIGEgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBmZWF0dXJlLCAKLSAqIHJlYWxpemVkIHRoZSBmZWF0dXJlIHZhbHVlIGJhc2VkIG9uIHRoZSBnaXZlbiByZWFsaXplci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVGZWF0dXJlVmFsdWUgZXh0ZW5kcyBGZWF0dXJlVmFsdWUgewotCi0JLy8gbWFwIG9mIGVsZW1lbnQgYW5kIHRoZSB2YWx1ZQotCUxpbmtlZEhhc2hNYXAgdmFsdWVNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCi0JLyoqCi0JICogY29uc3RyY3RvcgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQgdGhlIGVsZW1lbnQgd2hvc2UgZmVhdHVyZSB2YWx1ZSBpcyB0byBiZSByZWFsaXplZAotCSAqIEBwYXJhbSBvd25lckVsZW1lbnQgTWV0aG9kRWxlbWVudCB0aGUgb3duZXIgZWxlbWVudCBvZiB0aGlzIGVsZW1lbnQsIHRoaXMgaXMgbmVlZGVkIGZvciBoYW5kbGUgdGhlIHNwYWNpYWwgY2FzZXMgCi0JICogd2hlcmUgdGhlIGVsZW1lbnQncyBlQ29udGFpbmVyIGlzIG5vdCBwcm9wZXJseSBzZXQgeWV0LiBGb3IgZXhhbXBsZSwgd2hlbiBhIG5ldyBDb250ZW50RGVzY3JpdGlvbiBvYmplY3QgaXMgY3JlYXRlZCwgCi0JICogaXQncyBvd25lciBpcyBub3Qgc2V0IHVudGlsIHRoZSBjb250ZW50IGlzIHNhdmVkLgotCSAqIEBwYXJhbSBmZWF0dXJlIE9iamVjdCBUaGUgZmVhdHVlIG9yIG9wcG9zaXRlIGZlYXR1cmUgd2hvc2UgdmFsdWUgaXMgdG8gYmUgcmVhbGl6ZWQKLQkgKiBAcGFyYW0gcmVhbGl6ZXIgRWxlbWVudFJlYWxpemVyIHRoZSByZWFsaXplciB1c2VkIHRvIHJlYWxpemUgdGhlIGZlYXR1cmUgdmFsdWUuCi0JICovCi0JcHVibGljIEF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LCBPYmplY3QgZmVhdHVyZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCXN1cGVyKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCX0KLQkKLQkvKioKLQkgKiBtZXRob2QgdG8gYWRkIGEgZmVhdHVyZSB2YWx1ZSB0byB0aGUgdmFsdWUgbGlzdC4gVGhpcyB2YWx1ZSBjb3VsZCBiZSB0aGUgZWxlbWVudCdzIG93biBmZWF0dXJlIHZhbHVlLCAKLQkgKiBvciB0aGUgZmVhdHVyZSB2YWx1ZSBvZiBhbm90aGVyIHZhcmlhYmlsaXR5IGVsZW1lbnQsIHN1Y2ggYXMgYSBjb250cmlidXRvci4gCi0JICogU28gdGhlIG93bmVyIGlzIHBhc3NlZCBpbiB0byBpbmRpY2F0ZSB0aGUgb3JpZ2luYXRpb24gb2YgdGhlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBvd25lciBWYXJpYWJpbGl0eUVsZW1lbnQgdGhlIGVsZW1lbnQgdGhhdCBwcm92aWRlIHRoZSB2YWx1ZSBkdWUgdG8gdmFyaWFiaWxpdHkgcmVhbGl6YXRpb24KLQkgKiBAcGFyYW0gdmFsdWUgT2JqZWN0IHRoZSBmZWF0dXJlIHZhbHVlIGZyb20gdGhlIG93bmVyIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoVmFyaWFiaWxpdHlFbGVtZW50IG93bmVyLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKCAodmFsdWUgPT0gbnVsbCkgfHwgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotCQkJCSYmIHZhbHVlLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gbm90ZTogb3duZXIgY2FuIGJlIG51bGwsIHRoaXMgaXMgZmluZQotCQl2YWx1ZU1hcC5wdXQob3duZXIsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGZlYXR1cmUgdmFsdWUgbGlzdC4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHZhbHVlTWFwLnNpemUoKTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSByZWFsaXplZCBmZWF0dXJlIHZhbHVlLgotCSAqIEByZXR1cm4gT2JqZWN0IHRoZSByZWFsaXplZCBmZWF0dXJlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB2YWx1ZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWVudHJ5LmdldEtleSgpOwotCQkJT2JqZWN0IHYgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCi0JCQlpZiAodiA9PSBudWxsIHx8IHYudG9TdHJpbmcoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmICggaXNFeHRlbmRSZXBsYWNlRW5hYmxlZCgpICkgewotCQkJCVN0cmluZyBzdHIgPSBTdHJVdGlsLmdldFBsYWluVGV4dCh2LnRvU3RyaW5nKCkpLnRyaW0oKTsKLQkJCQlpZiAoIGlzQmxhbmtJbmRpY2F0b3Ioc3RyKSApIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpIHsKLQkJCQlpZiAoc2l6ZSgpID4gMSkgewotCQkJCQkvLyBzb21ldGhpbmcgd3JvbmcgaGVyZSwgd2lsbCBub3QgaGFwcGVuIGJ1dCBwdXQgdGVzdAotCQkJCQkvLyBtZXNzYWdlIGhlcmUganVzdCBpbiBjYXNlCi0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiQXR0cmlidXRlRmVhdHVyZVZhbHVlOiBQcmVzZW50YXRpb24gTmFtZSBnZXQgbW9yZSB0aGVuIG9uZSBlbnRyeTogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB2OwotCQkJfQotCi0JCQlpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoQ29uZmlndXJhdGlvbkhlbHBlci5BVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SKTsgCi0JCQl9Ci0KLQkJCWlmICgoZSA9PSBlbGVtZW50KSAmJiAhKGUgaW5zdGFuY2VvZiBTZWN0aW9uKSB8fCBlID09IG51bGwgKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCh2KTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIGNvbnRlbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIKLQkJCQkJCS5nZXRFbGVtZW50UGF0aCgoZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgCi0JCQkJCQkJCT8gKE1ldGhvZEVsZW1lbnQpIGUuZUNvbnRhaW5lcigpCi0JCQkJCQkJCTogZSk7Ci0KLQkJCQlTdHJpbmcgYmFja1BhdGggPSBSZXNvdXJjZUhlbHBlcgotCQkJCQkJLmdldEJhY2tQYXRoKChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSAKLQkJCQkJCQkJPyAoKG93bmVyRWxlbWVudCAhPSBudWxsKSA/IG93bmVyRWxlbWVudAotCQkJCQkJCQk6IChNZXRob2RFbGVtZW50KSBlbGVtZW50LmVDb250YWluZXIoKSkKLQkJCQkJCQkJOiBlbGVtZW50KTsKLQotCQkJCWJ1ZmZlci5hcHBlbmQoUmVzb3VyY2VIZWxwZXIuZml4Q29udGVudFVybFBhdGgodi50b1N0cmluZygpLAotCQkJCQkJY29udGVudFBhdGgsIGJhY2tQYXRoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25BcHBsaWNhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uQXBwbGljYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzBiYTliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25BcHBsaWNhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdGlvbkFwcGxpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uQXBwbGljYXRvciBpbXBsZW1lbnRzIElDb25maWd1cmF0aW9uQXBwbGljYXRvciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgSU5TVEFOQ0UgPSBuZXcgQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKTsKLQotCXB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFZhcmlhYmlsaXR5RWxlbWVudCBlLCBFQXR0cmlidXRlIGF0dHJpYnV0ZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHByZXNlbnRhdGlvbiBuYW1lIG9mIGJyZWFrZG93biBlbGVtZW50Ci0JCS8vCi0JCWlmKGF0dHJpYnV0ZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJaWYoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRQcmVzZW50YXRpb25OYW1lKGUsIGNvbmZpZyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZShlLCBhdHRyaWJ1dGUsCi0JCQkJY29uZmlnKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmVyZW5jZShWYXJpYWJpbGl0eUVsZW1lbnQgZSwgRVJlZmVyZW5jZSByZWYsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlpZiAoQ29uZmlndXJhdGlvbkhlbHBlci5pczBuRmVhdHVyZShyZWYpKSB7Ci0JCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoZSwgcmVmLAotCQkJCQlEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpKTsKLQkJfSBlbHNlIGlmIChDb25maWd1cmF0aW9uSGVscGVyLmlzMDFGZWF0dXJlKHJlZikpIHsKLQkJCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZShlLCByZWYsCi0JCQkJCURlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZykpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UmVmZXJlbmNlKENvbnRlbnREZXNjcmlwdGlvbiBkZXNjLAotCQkJRGVzY3JpYmFibGVFbGVtZW50IG93bmVyLCBFUmVmZXJlbmNlIHJlZiwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQotCQlMaXN0IHZhbHVlcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGRlc2MsIG93bmVyLCByZWYsCi0JCQkJRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKSk7Ci0JCWlmIChyZWYuaXNNYW55KCkpIHsKLQkJCXJldHVybiB2YWx1ZXM7Ci0JCX0KLQkJaWYgKHZhbHVlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHZhbHVlczsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmVyZW5jZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIE9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTGlzdCB2YWx1ZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBmZWF0dXJlLAotCQkJCURlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZykpOwotCi0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JcHVibGljIE9iamVjdCByZXNvbHZlKE9iamVjdCBvYmplY3QsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlPYmplY3QgcmVzb2x2ZWQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqZWN0LCBjb25maWcpOwotCQkJaWYgKHJlc29sdmVkID09IG51bGwpIHsKLQkJCQlyZXR1cm4gb2JqZWN0OwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gcmVzb2x2ZWQ7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gb2JqZWN0OwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoQ29udGVudERlc2NyaXB0aW9uIGRlc2MsCi0JCQlEZXNjcmliYWJsZUVsZW1lbnQgb3duZXIsIEVBdHRyaWJ1dGUgYXR0ciwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoZGVzYywgb3duZXIsIGF0dHIsCi0JCQkJY29uZmlnKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25EYXRhLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2UwN2MyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25EYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRGVidWdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogIENsYXNzIG1hbmFnaW5nIGNvbmZpZ3VyYXRpb24gZGF0YSBjYWxjdWxhdGlvbiBhbmQgY2FjaGUKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1IC0gTWFyIDIwLCAyMDA3Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkRhdGEgewotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBsb2NhbERlYnVnID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwcm9maWxpbmcgPSBmYWxzZTsKLQkKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCQotCS8vIG1ha2Ugc3VyZSB0aGUgbWFwIGlzIGNyZWF0ZWQuCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBNZXRob2RFbGVtZW50PiBzdWJzdHJhY3RlZEVsZW1NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+KCk7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBNZXRob2RFbGVtZW50PiBhZGRlZEVsZW1NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbmVlZFVwZGF0ZUNoYW5nZXMgPSB0cnVlOwotCXByaXZhdGUgTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PiBvcmlnaW5hbFN1YnN0cmFjdGVkOwotCXByaXZhdGUgTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PiBvcmlnbmFsQWRkZWQ7Ci0JcHJpdmF0ZSBJTGlicmFyeU1hbmFnZXIgbGlicmFyeU1hbmFnZXI7IAotCXByaXZhdGUgQWRhcHRlciBjb25maWdMaXN0ZW5lcjsKLQlwcml2YXRlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGliTGlzdGVuZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZVVwZGF0ZSA9IHRydWU7Ci0JCi0JcHVibGljIENvbmZpZ3VyYXRpb25EYXRhKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQkKLQkJY29uZmlnTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCQlpZiAoaXNOZWVkVXBkYXRlQ2hhbmdlcygpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCQkJaWYgKAkJdHlwZSA9PSBOb3RpZmljYXRpb24uQURECi0JCQkJCQl8fCAJdHlwZSA9PSBOb3RpZmljYXRpb24uQUREX01BTlkKLQkJCQkJCXx8IAl0eXBlID09IE5vdGlmaWNhdGlvbi5SRU1PVkUKLQkJCQkJCXx8ICB0eXBlID09IE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSkgewkJCQkJCi0JCQkJCXNldE5lZWRVcGRhdGVDaGFuZ2VzKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJY29uZmlnLmVBZGFwdGVycygpLmFkZChjb25maWdMaXN0ZW5lcik7Ci0JCQkJCi0JCWxpYkxpc3RlbmVyID0gbmV3IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2hhbmdlZChpbnQgb3B0aW9uLCBDb2xsZWN0aW9uIGNoYW5nZWRJdGVtcykgewotCQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJMRD4gbGlicmFyeUNoYW5nZWQsIG9wdGlvbjogIiArIG9wdGlvbiArICIsICIgKyBjaGFuZ2VkSXRlbXMpOy8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCQotCQkJCWlmIChpc05lZWRVcGRhdGVDaGFuZ2VzKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hhbmdlZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGl0ZW0gPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQkJCQlzZXROZWVkVXBkYXRlQ2hhbmdlcyh0cnVlKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJCi0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRNZXRob2RMaWJyYXJ5KGNvbmZpZyk7Ci0JCWxpYnJhcnlNYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRMaWJyYXJ5TWFuYWdlcihsaWJyYXJ5KTsKLQkJaWYobGlicmFyeU1hbmFnZXIgIT0gbnVsbCkgewotCQkJbGlicmFyeU1hbmFnZXIuYWRkTGlzdGVuZXIobGliTGlzdGVuZXIpOwotCQl9Ci0JfSAKLQkKLQlwcml2YXRlIGJvb2xlYW4gZ2V0VXBkYXRpbmdDaGFuZ2VzKCkgewotCQlyZXR1cm4gb3JpZ2luYWxTdWJzdHJhY3RlZCAhPSBudWxsICYmIG9yaWduYWxBZGRlZCAhPSBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2hhbmdlcygpIHsKLQkJaWYgKCEgaXNFbmFibGVVcGRhdGUoKSkgewotCQkJcmV0dXJuOwotCQl9CQkKLQkJaWYgKCEgaXNOZWVkVXBkYXRlQ2hhbmdlcygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGdldFVwZGF0aW5nQ2hhbmdlcygpKSB7Ci0JCQlyZXR1cm47CQkJCi0JCX0KLQkJCi0JCWxvbmcgdCA9IDA7Ci0JCWlmIChwcm9maWxpbmcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHVwZGF0ZUNoYW5nZXNfKCkgLT4gIik7CS8vJE5PTi1OTFMtMSQKLQkJCXQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQl1cGRhdGVDaGFuZ2VzXygpOwotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQl0ID0gIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdDsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHVwZGF0ZUNoYW5nZXNfKCkgPC0gdGltZTogIiArIHQpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVDaGFuZ2VzXygpIHsKLQkJc3Vic3RyYWN0ZWRFbGVtTWFwLmNsZWFyKCk7Ci0JCWFkZGVkRWxlbU1hcC5jbGVhcigpOwotCQkKLQkJTGlzdCBzdWJMaXN0ID0gY29uZmlnLmdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpOwotCQlMaXN0IGFkZExpc3QgPSBjb25maWcuZ2V0QWRkZWRDYXRlZ29yeSgpOwotCQlpZiAoc3ViTGlzdC5pc0VtcHR5KCkgJiYgYWRkTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gc3ViTGlzdC9hZGRMaXN0IGFyZSBlbXB0eS4iKTsJLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlvcmlnaW5hbFN1YnN0cmFjdGVkID0gY29udmVydFRvTWFwKHN1Ykxpc3QpOwotCQlvcmlnbmFsQWRkZWQgPSBjb252ZXJ0VG9NYXAoYWRkTGlzdCk7Ci0JCQotCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJRGVidWdVdGlsLnByaW50KCJvcmlnaW5hbFN1YnN0cmFjdGVkOiAiLCBudWxsLCBvcmlnaW5hbFN1YnN0cmFjdGVkLnZhbHVlcygpLCAyKTsJLy8kTk9OLU5MUy0xJAotCQkJRGVidWdVdGlsLnByaW50KCJvcmlnbmFsQWRkZWQ6ICIsIG51bGwsIG9yaWduYWxBZGRlZC52YWx1ZXMoKSwgMik7CQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCWJvb2xlYW4gY2hhbmdlZCA9IHJlbW92ZShvcmlnaW5hbFN1YnN0cmFjdGVkLCBvcmlnbmFsQWRkZWQpOwotCQlpZiAoY2hhbmdlZCAmJiBsb2NhbERlYnVnKSB7Ci0JCQlEZWJ1Z1V0aWwucHJpbnQoIm9yaWduYWxBZGRlZCBhZnRlciByZW1vdmU6ICIsIG51bGwsIG9yaWduYWxBZGRlZC52YWx1ZXMoKSwgMik7CQkvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCU1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4gY2FsU3Vic3RyYWN0ZWQgPSAoTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PikgCi0JCQkJCQkJKChIYXNoTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PilvcmlnaW5hbFN1YnN0cmFjdGVkKS5jbG9uZSgpOwotCQlNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+IGNhbEFkZGVkID0gKE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4pIAotCQkJCQkJCSgoSGFzaE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4pb3JpZ25hbEFkZGVkKS5jbG9uZSgpOwotCQkJCQkKLQkJY2hhbmdlZCA9IGhhbmRsZUNvbnRyaWJ1dG9ycyhjYWxTdWJzdHJhY3RlZCwgdHJ1ZSk7Ci0JCWlmIChjaGFuZ2VkICYmIGxvY2FsRGVidWcpIHsKLQkJCURlYnVnVXRpbC5wcmludCgiY2FsU3Vic3RyYWN0ZWQgYWZ0ZXIgaGFuZGxlQ29udHJpYnV0b3JzOiAiLCBudWxsLCBjYWxTdWJzdHJhY3RlZC52YWx1ZXMoKSwgMik7Ly8kTk9OLU5MUy0xJAotCQl9CQkKLQkJCi0JCWNhbFN1YnN0cmFjdGVkID0gaGFuZGxlUmVwbGFjZXJzKGNhbFN1YnN0cmFjdGVkLCB0cnVlKTsKLQkJY2FsQWRkZWQgPSBoYW5kbGVSZXBsYWNlcnMoY2FsQWRkZWQsIGZhbHNlKTsKLQkJCi0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlEZWJ1Z1V0aWwucHJpbnQoImNhbFN1YnN0cmFjdGVkOiAiLCBudWxsLCBjYWxTdWJzdHJhY3RlZC52YWx1ZXMoKSwgMik7Ly8kTk9OLU5MUy0xJAotCQkJRGVidWdVdGlsLnByaW50KCJjYWxBZGRlZDogIiwgbnVsbCwgY2FsQWRkZWQudmFsdWVzKCksIDIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJY2hhbmdlZCA9IHJlbW92ZShjYWxTdWJzdHJhY3RlZCwgY2FsQWRkZWQpOwotCQlpZiAoY2hhbmdlZCAmJiBsb2NhbERlYnVnKSB7Ci0JCQlEZWJ1Z1V0aWwucHJpbnQoImNhbEFkZGVkIGFmdGVyIHJlbW92ZTogIiwgbnVsbCwgb3JpZ25hbEFkZGVkLnZhbHVlcygpLCAyKTsvLyROT04tTkxTLTEkCi0JCX0JCQkJCi0JCQotCQlpZiAoY2FsU3Vic3RyYWN0ZWQgIT0gbnVsbCkgewotCQkJdXBkYXRlRWxlbWVudE1hcChjYWxTdWJzdHJhY3RlZC52YWx1ZXMoKSwgc3Vic3RyYWN0ZWRFbGVtTWFwKTsKLQkJfQotCQlpZiAoY2FsQWRkZWQgIT0gbnVsbCkgewotCQkJdXBkYXRlRWxlbWVudE1hcChjYWxBZGRlZC52YWx1ZXMoKSwgYWRkZWRFbGVtTWFwKTsKLQkJfQotCQkKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCURlYnVnVXRpbC5wcmludCgic3Vic3RyYWN0ZWRFbGVtTWFwOiAiLCBudWxsLCBzdWJzdHJhY3RlZEVsZW1NYXAudmFsdWVzKCksIDIpOwkvLyROT04tTkxTLTEkCi0JCQlEZWJ1Z1V0aWwucHJpbnQoImFkZGVkRWxlbU1hcDogIiwgbnVsbCwgYWRkZWRFbGVtTWFwLnZhbHVlcygpLCAyKTsJCQkJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJc2V0TmVlZFVwZGF0ZUNoYW5nZXMoZmFsc2UpOwkJCi0JCQotCQlvcmlnaW5hbFN1YnN0cmFjdGVkID0gbnVsbDsJCS8vbm90IG5lZWRlZCBhZnRlciB1cGRhdGUKLQkJb3JpZ25hbEFkZGVkID0gbnVsbDsJCQkvL25vdCBuZWVkZWQgYWZ0ZXIgdXBkYXRlCi0JfQotCQotCS8vcmV0dXJuIHRydWUgaWYgc29tZXRoaW5nIGdldHMgcmVtb3ZlZCwgb3RoZXJ3aXNlIGZhbHNlCi0JcHJpdmF0ZSBib29sZWFuIHJlbW92ZShNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+IHNvdXJjZU1hcCwgTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PiB0YXJnZXRNYXApIHsKLQkJaWYgKHNvdXJjZU1hcCA9PSBudWxsIHx8IHNvdXJjZU1hcC5pc0VtcHR5KCkgfHwKLQkJCXRhcmdldE1hcCA9PSBudWxsIHx8IHRhcmdldE1hcC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsJCQkJCi0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdCA9IHNvdXJjZU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgY2MgPSB0YXJnZXRNYXAucmVtb3ZlKGl0Lm5leHQoKSk7Ci0JCQlpZiAoY2MgIT0gbnVsbCkgewotCQkJCXJldCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCQotCS8vcmV0dXJuIHRydWUgaWYgYW55IGNoYW5nZQotCXByaXZhdGUgYm9vbGVhbiBoYW5kbGVDb250cmlidXRvcnMoTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PiBtYXAsICBib29sZWFuIHN1YnN0cmFjdGVkKSB7Ci0JCWlmIChtYXAgPT0gbnVsbCB8fCAhIHN1YnN0cmFjdGVkKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJTGlzdDxDb250ZW50Q2F0ZWdvcnk+IGFkZGVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29udGVudENhdGVnb3J5PigpOwotCQkJCQotCQlmb3IgKEl0ZXJhdG9yPENvbnRlbnRDYXRlZ29yeT4gaXQgPSBtYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJQ29udGVudENhdGVnb3J5IGNjID0gaXQubmV4dCgpOwotCQkJTGlzdDxDb250ZW50Q2F0ZWdvcnk+IGNvbnRyaWJ1dGVycyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29udHJpYnV0b3JzKGNjLCBjb25maWcpOwotCQkJYWRkZWRMaXN0LmFkZEFsbChjb250cmlidXRlcnMpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8Q29udGVudENhdGVnb3J5PiBpdCA9IGFkZGVkTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgY2MgPSBpdC5uZXh0KCk7Ci0JCQltYXAucHV0KGNjLmdldEd1aWQoKSwgY2MpOwotCQl9Ci0JCQotCQlyZXR1cm4gISBhZGRlZExpc3QuaXNFbXB0eSgpOwotCX0KLQkKLQlwcml2YXRlIE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4gaGFuZGxlUmVwbGFjZXJzKE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4gb3JpZ2luYWxzLCBib29sZWFuIHN1YnN0cmFjdGVkKSB7Ci0JCWlmIChvcmlnaW5hbHMgPT0gbnVsbCB8fCBvcmlnaW5hbHMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gb3JpZ2luYWxzOwotCQl9Ci0JCQotCQlNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+IHJldCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PigpOwotCQkKLQkJZm9yIChJdGVyYXRvcjxDb250ZW50Q2F0ZWdvcnk+IGl0ID0gb3JpZ2luYWxzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYyA9IGl0Lm5leHQoKTsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCByZXBsYWNlciA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UmVwbGFjZXIoY2MsIGNvbmZpZyk7Ci0JCQlib29sZWFuIHRvS2VlcCA9IHRydWU7Ci0JCQlpZiAocmVwbGFjZXIgIT0gbnVsbCkgewotCQkJCXRvS2VlcCA9IGZhbHNlOwotCQkJCQotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBuZXN0ZWRSZXBsYWNlciA9IHJlcGxhY2VyOwotCQkJCXdoaWxlIChuZXN0ZWRSZXBsYWNlciAhPSBudWxsKSB7Ci0JCQkJCXJlcGxhY2VyID0gbmVzdGVkUmVwbGFjZXI7Ci0JCQkJCW5lc3RlZFJlcGxhY2VyID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRSZXBsYWNlcihuZXN0ZWRSZXBsYWNlciwgY29uZmlnKTsKLQkJCQl9Ci0JCQkJaWYgKHN1YnN0cmFjdGVkKSB7Ci0JCQkJCWlmIChvcmlnaW5hbFN1YnN0cmFjdGVkLmNvbnRhaW5zS2V5KHJlcGxhY2VyLmdldEd1aWQoKSkpIHsKLQkJCQkJCXRvS2VlcCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodG9LZWVwKSB7Ci0JCQkJcmV0LnB1dChjYy5nZXRHdWlkKCksIGNjKTsKLQkJCX0JCQkKLQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQkJCQotCQotCXByaXZhdGUgTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PiBjb252ZXJ0VG9NYXAoQ29sbGVjdGlvbjxDb250ZW50Q2F0ZWdvcnk+IGNvbGxlY3Rpb24pIHsKLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCB8fCBjb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG5ldyBIYXNoTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PigpOwotCQl9Ci0JCU1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4gbWFwID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+KCk7CQkKLQkJZmlsbE1hcChjb2xsZWN0aW9uLCBtYXApOwotCQlyZXR1cm4gbWFwOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZmlsbE1hcChDb2xsZWN0aW9uPENvbnRlbnRDYXRlZ29yeT4gY29sbGVjdGlvbiwgTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PiBtYXApIHsKLQkJZm9yIChJdGVyYXRvcjxDb250ZW50Q2F0ZWdvcnk+IGl0ID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgY2MgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoISBtYXAuY29udGFpbnNLZXkoY2MuZ2V0R3VpZCgpKSkgewotCQkJCW1hcC5wdXQoY2MuZ2V0R3VpZCgpLCBjYyk7Ci0JCQl9Ci0JCX0KLQl9CQotCQotCXByaXZhdGUgQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29udGVudENhdGVnb3J5PiBnZXRDaGlsZENDKENvbnRlbnRDYXRlZ29yeSBjYykgewotCQlpZiAoY2MgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJcmV0dXJuICgoQ3VzdG9tQ2F0ZWdvcnkpIGNjKS5nZXRTdWJDYXRlZ29yaWVzKCk7Ci0JCX0KLQkJaWYgKGNjIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJcmV0dXJuICgoRGlzY2lwbGluZSkgY2MpLmdldFN1YmRpc2NpcGxpbmUoKTsKLQkJfQotCQlpZiAoY2MgaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpIHsKLQkJCXJldHVybiAoKERpc2NpcGxpbmVHcm91cGluZykgY2MpLmdldERpc2NpcGxpbmVzKCk7Ci0JCX0KLQkJaWYgKGNjIGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQlyZXR1cm4gKChEb21haW4pIGNjKS5nZXRTdWJkb21haW5zKCk7Ci0JCX0KLQkJaWYgKGNjIGluc3RhbmNlb2YgUm9sZVNldCkgewotCQl9Ci0JCWlmIChjYyBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykgewotCQkJcmV0dXJuICgoUm9sZVNldEdyb3VwaW5nKSBjYykuZ2V0Um9sZVNldHMoKTsKLQkJfQotCQlpZiAoY2MgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVFbGVtZW50TWFwKAlDb2xsZWN0aW9uPENvbnRlbnRDYXRlZ29yeT4gY2NMaXN0LAotCQkJCQkJCQkJTWFwPFN0cmluZywgTWV0aG9kRWxlbWVudD4gZWxlbWVudE1hcCkgewotCQlpZiAoY2NMaXN0ID09IG51bGwgfHwgY2NMaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlTZXQ8U3RyaW5nPiBzZWVucyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJZm9yIChJdGVyYXRvcjxDb250ZW50Q2F0ZWdvcnk+IGl0ID0gY2NMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYyA9IGl0Lm5leHQoKTsKLQkJCWlmICghIHNlZW5zLmNvbnRhaW5zKGNjLmdldEd1aWQoKSkpIHsKLQkJCQlhZGRUb0VsZW1lbnRNYXAoY2MsIGVsZW1lbnRNYXApOwotCQkJCS8vZWxlbWVudE1hcC5wdXQoY2MuZ2V0R3VpZCgpLCBjYyk7Ci0JCQl9Ci0JCQlzZWVucy5hZGQoY2MuZ2V0R3VpZCgpKTsKLQkJfQotCX0JCQkKLQotCS8vTm8gZHVwbGljYXRlcyBpbiB0aGUgcmV0dXJuZWQgZWxlbWVudHMKLQlwcml2YXRlIENvbGxlY3Rpb248TWV0aG9kRWxlbWVudD4gZ2V0RWxlbWVudHMoQ29udGVudENhdGVnb3J5IGNjKSB7Ci0JCUNvbGxlY3Rpb248TWV0aG9kRWxlbWVudD4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZEVsZW1lbnQ+KCk7Ci0JCWVsZW1lbnRzLmFkZEFsbChjYy5nZXRBc3NldHMoKSk7Ci0JCWVsZW1lbnRzLmFkZEFsbChjYy5nZXRDaGVja2xpc3RzKCkpOwotCQllbGVtZW50cy5hZGRBbGwoY2MuZ2V0Q29uY2VwdHNBbmRQYXBlcnMoKSk7Ci0JCWVsZW1lbnRzLmFkZEFsbChjYy5nZXRFeGFtcGxlcygpKTsKLQkJZWxlbWVudHMuYWRkQWxsKGNjLmdldEd1aWRlbGluZXMoKSk7Ci0JCWVsZW1lbnRzLmFkZEFsbChjYy5nZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkpOwkJCi0JCQotCQlpZiAoY2MgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJZWxlbWVudHMuYWRkQWxsKCgoQ3VzdG9tQ2F0ZWdvcnkpIGNjKS5nZXRTdWJDYXRlZ29yaWVzKCkpOwotCQkJZWxlbWVudHMuYWRkQWxsKCgoQ3VzdG9tQ2F0ZWdvcnkpIGNjKS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkpOwotCQl9Ci0JCWVsc2UgaWYgKGNjIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJZWxlbWVudHMuYWRkQWxsKCgoRGlzY2lwbGluZSkgY2MpLmdldFJlZmVyZW5jZVdvcmtmbG93cygpKTsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKERpc2NpcGxpbmUpIGNjKS5nZXRTdWJkaXNjaXBsaW5lKCkpOwotCQkJZWxlbWVudHMuYWRkQWxsKCgoRGlzY2lwbGluZSkgY2MpLmdldFRhc2tzKCkpOwotCQl9Ci0JCWVsc2UgaWYgKGNjIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSB7Ci0JCQllbGVtZW50cy5hZGRBbGwoKChEaXNjaXBsaW5lR3JvdXBpbmcpIGNjKS5nZXREaXNjaXBsaW5lcygpKTsKLQkJfQotCQllbHNlIGlmIChjYyBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJZWxlbWVudHMuYWRkQWxsKCgoRG9tYWluKSBjYykuZ2V0U3ViZG9tYWlucygpKTsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKERvbWFpbikgY2MpLmdldFdvcmtQcm9kdWN0cygpKTsKLQkJfQotCQllbHNlIGlmIChjYyBpbnN0YW5jZW9mIFJvbGVTZXQpIHsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKFJvbGVTZXQpIGNjKS5nZXRSb2xlcygpKTsKLQkJfQotCQllbHNlIGlmIChjYyBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykgewotCQkJZWxlbWVudHMuYWRkQWxsKCgoUm9sZVNldEdyb3VwaW5nKSBjYykuZ2V0Um9sZVNldHMoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoY2MgaW5zdGFuY2VvZiBUb29sKSB7Ci0JCQllbGVtZW50cy5hZGRBbGwoKChUb29sKSBjYykuZ2V0VG9vbE1lbnRvcnMoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoY2MgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpIHsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKFdvcmtQcm9kdWN0VHlwZSkgY2MpLmdldFdvcmtQcm9kdWN0cygpKTsKLQkJfQotCi0JCXJldHVybiBnZXRVbmlxdWVDb2xsZWN0aW9uKGVsZW1lbnRzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPE1ldGhvZEVsZW1lbnQ+IGdldFVuaXF1ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiBlbGVtZW50cykgewotCQlDb2xsZWN0aW9uPE1ldGhvZEVsZW1lbnQ+IHJldCA9IG5ldyBMaW5rZWRIYXNoU2V0PE1ldGhvZEVsZW1lbnQ+KCk7Ci0JCWZvciAoSXRlcmF0b3I8TWV0aG9kRWxlbWVudD4gaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoISByZXQuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQlyZXQuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc093bmVyU2VsZWN0ZWQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBib29sZWFuIGNoZWNrU3VidHJhY3RlZCkgewotCQlib29sZWFuIHJldCA9IGlzT3duZXJTZWxlY3RlZF8oZWxlbWVudCwgY2hlY2tTdWJ0cmFjdGVkKTsKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGlzT3duZXJTZWxlY3RlZDogIiArIHJldCArICIsICIgKyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCURlYnVnVXRpbC50b1N0cmluZyhlbGVtZW50LCAyKSk7CQotCQl9CQkJCQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNPd25lclNlbGVjdGVkXyhNZXRob2RFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gY2hlY2tTdWJ0cmFjdGVkKSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmlzRGVzY3JpcHRpb25FbGVtZW50KGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKGdldFVwZGF0aW5nQ2hhbmdlcygpKSB7Ci0JCQlpZiAob3JpZ2luYWxTdWJzdHJhY3RlZC5jb250YWluc0tleShlbGVtZW50LmdldEd1aWQoKSkgfHwgCi0JCQkJb3JpZ25hbEFkZGVkLmNvbnRhaW5zS2V5KGVsZW1lbnQuZ2V0R3VpZCgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQkJCQotCQl9IGVsc2UgewotCQkJdXBkYXRlQ2hhbmdlcygpOwotCQkJCQkJCi0JCQkvLzE4MjgzMQotLyoJCQlpZiAoYWN0aXZlICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JCQkJaWYgKGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5jb250YWlucyhwbHVnaW4pKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0qLwotCQkJCi0JCQkvLyBzaW5jZSBVTUEgMS4wLjQsIGNvbmZpZ3VyYXRpb24gY2FuIGhhdmUgYWRkZWQgY2F0ZWdvcmllcyAKLQkJCS8vIGFuZCBzdWJ0cmFjdGVkIGNhdGVnb3JpZXMuIFRoZSBvcmRlciBvZiBmaWx0ZXJpbmcgaXM6Ci0JCQkvLyAxLiBhbnkgZWxlbWVudCBpbiB0aGUgc3VidHJhY3RlZCBjYXRlZ29yaWVzIHNob3VsZCBiZSBleGNsdWRlZAotCQkJLy8gMi4gYW55IGVsZW1lbnQgaW4gdGhlIGFkZGVkIGNhdGVnb3JpZXMgc2hvdWxkIGJlIGluY2x1ZGVkCi0JCQkvLyAzLiBhbnkgZWxlbWVudCBub3QgaW4gdGhlIHNlbGVjdGVkIHBhY2thZ2Ugb3IgcGx1Z2luIHNob3VsZCBiZSBleGNsdWRlZC4JCQotCQkJaWYgKCBjaGVja1N1YnRyYWN0ZWQpIHsKLQkJCQlpZiAoc3Vic3RyYWN0ZWRFbGVtTWFwLmNvbnRhaW5zS2V5KGVsZW1lbnQuZ2V0R3VpZCgpKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KXsKLQkJCQkJaWYgKGNvbnRyaWJ1dGVkQmFzZUluU3Vic3RyYWN0ZWQoKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudCkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKGFkZGVkRWxlbU1hcC5jb250YWluc0tleShlbGVtZW50LmdldEd1aWQoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQl9IAotCQkKLQkJLy8gZWxlbWVudHMgYmV5b25kIGNvbmZpZ3VyYXRpb24gc2NvcGUgc2hvdWxkIGJlIGFsd2F5cyB2aXNpYmxlCi0JCWlmICgoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpCi0JCQkJfHwgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJTGlzdCBwbHVnaW5zID0gY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCQkJcmV0dXJuIChwbHVnaW5zICE9IG51bGwpICYmIHBsdWdpbnMuY29udGFpbnMoZWxlbWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBpZiB0aGUgb3duZXJwcm9jZXNzIGNhbid0IHNob3csIGNhbid0IGFjY2VwdAotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFjdGl2aXR5IGJhc2UgPSAoQWN0aXZpdHkpICgoQWN0aXZpdHkpIGVsZW1lbnQpCi0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmIChiYXNlICE9IG51bGwgJiYgYmFzZSAhPSBlbGVtZW50KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgb3duaW5nUHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhiYXNlKTsKLQkJCQkJaWYgKCBvd25pbmdQcm9jICE9IG51bGwgJiYgb3duaW5nUHJvYyAhPSBlbGVtZW50IAotCQkJCQkJCSYmICFDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnKG93bmluZ1Byb2MsIGNvbmZpZywgY2hlY2tTdWJ0cmFjdGVkKSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlFT2JqZWN0IHBrZyA9IExpYnJhcnlVdGlsLmdldFNlbGVjdGFibGUoZWxlbWVudCk7Ci0KLQkJCS8vIGFjY2VwdCBnbG9iYWwgcGFja2FnZSBpZiB0aGUgcGx1Z2luIGlzIGluIHRoZSBjb25maWd1cmF0aW9uCi0JCQlpZiAocGtnIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZQotCQkJCQkmJiBDb25maWd1cmF0aW9uSGVscGVyLmlzR2xvYmFsUGFja2FnZSgoTWV0aG9kUGFja2FnZSkgcGtnKSkgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4ocGtnKTsKLQkJCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5pbkNvbmZpZyhwbHVnaW4sIGNvbmZpZywgY2hlY2tTdWJ0cmFjdGVkKTsKLQkJCX0KLQotCQkJTGlzdCBwa2dzID0gY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJCWlmIChwa2dzID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCS8vIHBlciBQaG9uZydzIHJlcXVlc3QsIGZvciBQcm9jZXNzUGFja2FnZSwgY2hlY2sgdGhlCi0JCQkvLyBQcm9jZXNzQ29tcG9uZW50IHBhcmVudCBpbnN0ZWFkCi0JCQlpZiAocGtnIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlFT2JqZWN0IHBrZ19vbGQgPSBwa2c7Ci0JCQkJd2hpbGUgKChwa2cgIT0gbnVsbCkgJiYgIShwa2cgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KQotCQkJCQkJJiYgIXBrZ3MuY29udGFpbnMocGtnKSkgewotCQkJCQlwa2cgPSBwa2cuZUNvbnRhaW5lcigpOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBpZiBubyBQcm9jZXNzQ29tcG9uZW50LCB0aGlzIGlzIGEgcmVhbCBwYWNrYWdlLCB1c2UgaXQKLQkJCQlpZiAoIHBrZyA9PSBudWxsICkgewotCQkJCQlwa2cgPSBwa2dfb2xkOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gaWYgcGFja2FnZSBub3Qgc2VsZWN0ZWQsIHJldHVybiBmYWxzZQotCQkJaWYgKChwa2cgPT0gbnVsbCkgfHwgIXBrZ3MuY29udGFpbnMocGtnKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29udHJpYnV0ZWRCYXNlSW5TdWJzdHJhY3RlZChWYXJpYWJpbGl0eUVsZW1lbnQgdmUpIHsKLQkJaWYgKHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpICE9IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUykgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJaWYgKGJhc2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoc3Vic3RyYWN0ZWRFbGVtTWFwLmNvbnRhaW5zS2V5KGJhc2UuZ2V0R3VpZCgpKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnKGJhc2UsIGNvbmZpZywgdHJ1ZSkpIHsKLQkJCXJldHVybiBjb250cmlidXRlZEJhc2VJblN1YnN0cmFjdGVkKGJhc2UpOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGFkZFRvRWxlbWVudE1hcChDb250ZW50Q2F0ZWdvcnkgY2MsIE1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRNYXApIHsKLQkJQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiBlbGVtZW50TGlzdCA9IGdldEVsZW1lbnRzKGNjKTsJCQotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZEVsZW1lbnQ+IGl0ID0gZWxlbWVudExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gaXQubmV4dCgpOwotCQkJZWxlbWVudE1hcC5wdXQoZWxlbWVudC5nZXRHdWlkKCksIGVsZW1lbnQpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWNvbmZpZy5lQWRhcHRlcnMoKS5yZW1vdmUoY29uZmlnTGlzdGVuZXIpOwotCQlsaWJyYXJ5TWFuYWdlci5yZW1vdmVMaXN0ZW5lcihsaWJMaXN0ZW5lcik7CQkKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNOZWVkVXBkYXRlQ2hhbmdlcygpIHsKLQkJcmV0dXJuIG5lZWRVcGRhdGVDaGFuZ2VzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5lZWRVcGRhdGVDaGFuZ2VzKGJvb2xlYW4gbmVlZFVwZGF0ZUNoYW5nZXMpIHsKLQkJdGhpcy5uZWVkVXBkYXRlQ2hhbmdlcyA9IG5lZWRVcGRhdGVDaGFuZ2VzOwotCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gc2V0TmVlZFVwZGF0ZUNoYW5nZXM6ICIgKyBuZWVkVXBkYXRlQ2hhbmdlcyk7CS8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0VuYWJsZVVwZGF0ZSgpIHsKLQkJcmV0dXJuIGVuYWJsZVVwZGF0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVVcGRhdGUoYm9vbGVhbiBlbmFibGVVcGRhdGUpIHsKLQkJdGhpcy5lbmFibGVVcGRhdGUgPSBlbmFibGVVcGRhdGU7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBzZXRFbmFibGVVcGRhdGU6ICIgKyBlbmFibGVVcGRhdGUpOwkvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb248TWV0aG9kRWxlbWVudD4gZ2V0QWRkZWRFbGVtZW50cygpIHsKLQkJcmV0dXJuIGFkZGVkRWxlbU1hcC52YWx1ZXMoKTsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb248TWV0aG9kRWxlbWVudD4gZ2V0U3VidHJhY3RlZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gc3Vic3RyYWN0ZWRFbGVtTWFwLnZhbHVlcygpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnRJblN1YnRyYWN0ZWRDYXRlZ29yeShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHN1YnN0cmFjdGVkRWxlbU1hcC5jb250YWluc0tleShlbGVtZW50LmdldEd1aWQoKSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRWxlbWVudEluQWRkZWRDYXRlZ29yeShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGFkZGVkRWxlbU1hcC5jb250YWluc0tleShlbGVtZW50LmdldEd1aWQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkZhY3RvcnkudHh0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkZhY3RvcnkudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjdiOGVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25GYWN0b3J5LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5EZXBlbmRlbmN5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5MaWJyYXJ5UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLQotLyoqCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRmFjdG9yeSB7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgYWZjcCA9IG51bGw7Ci0KLQkvLyBtYXAgb2YgTWV0aG9kQ29uZmlndXJhdGlvbiBuYW1lIHRvIENvbmlndXJhdGlvbiBvYmplY3QKLQlwcml2YXRlIE1hcCBjb25maWdNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBMaWJyYXJ5UHJvY2Vzc29yIGxpYnJhcnlQcm9jID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRDb25maWdOYW1lID0gbnVsbDsKLQotCS8vIG1hcCBvZiBjb25maWcgbmFtZSB0byBsYXlvdXQgbWFuYWdlcgotCS8vIGVhY2ggY29uZmlnIGhhcyBpdCdzIG93biBsYXlvdXQgbWFuYWdlcgotCXByaXZhdGUgTWFwIGxheW91dE1nck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIERlcGVuZGVuY3lNYW5hZ2VyIGRlcE1nciA9IG51bGw7Ci0KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkZhY3RvcnkoTGlicmFyeVByb2Nlc3NvciBsaWJyYXJ5UHJvYykgewotCi0JCXRoaXMubGlicmFyeVByb2MgPSBsaWJyYXJ5UHJvYzsKLQotCQlhZmNwID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGxpYnJhcnlQcm9jCi0JCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCWxpYnJhcnlQcm9jLmFkZExpc3RlbmVyKG5ldyBJTGlicmFyeUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQkJaWYgKG9wdGlvbiA9PSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DUkVBVEVECi0JCQkJCQl8fCBvcHRpb24gPT0gSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTE9BREVEKSB7Ci0JCQkJCWNsZWFyKCk7Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCi0JCWNsZWFyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWN1cnJlbnRDb25maWdOYW1lID0gbnVsbDsKLQkJaWYgKGNvbmZpZ01hcC5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29uZmlnTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkoKENvbmZpZ3VyYXRpb25DbG9zdXJlKSBpdC5uZXh0KCkpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQljb25maWdNYXAuY2xlYXIoKTsKLQotCQlpZiAobGF5b3V0TWdyTWFwLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBsYXlvdXRNZ3JNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCSgoRWxlbWVudExheW91dE1hbmFnZXIpIGl0Lm5leHQoKSkuY2xlYXIoKTsKLQkJCX0KLQkJfQotCi0JCWxheW91dE1nck1hcC5jbGVhcigpOwotCi0JCWlmIChkZXBNZ3IgIT0gbnVsbCkgewotCQkJZGVwTWdyLmNsZWFyKCk7Ci0JCQlkZXBNZ3IgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0TGlicmFyeSgpIHsKLQkJcmV0dXJuIGxpYnJhcnlQcm9jLmdldExpYnJhcnkoKTsKLQl9Ci0KLQlwdWJsaWMgVVJJIGdldExpYnJhcnlVcmkoKSB7Ci0JCXJldHVybiBsaWJyYXJ5UHJvYy5nZXRMaWJyYXJ5VVJJKCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbGlicmFyeVByb2MuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gYWZjcDsKLQl9Ci0KLQlwdWJsaWMgRGVwZW5kZW5jeU1hbmFnZXIgZ2V0RGVwZW5kZW5jeU1hbmFnZXIoKSB7Ci0JCS8vIHJldHVybiBsaWJyYXJ5UHJvYy5nZXREZXBlbmRlbmN5TWFuYWdlcigpOwotCQlpZiAodGhpcy5kZXBNZ3IgPT0gbnVsbCkgewotCQkJZGVwTWdyID0gbmV3IERlcGVuZGVuY3lNYW5hZ2VyKGxpYnJhcnlQcm9jKTsKLQkJfQotCi0JCXJldHVybiBkZXBNZ3I7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TWV0aG9kUGx1Z2lucygpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRUxpc3QgZWxlbWVudHMgPSBsaWJyYXJ5UHJvYy5nZXRMaWJyYXJ5KCkuZUNvbnRlbnRzKCk7Ci0JCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJaXRlbXMuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50Q29uZmlndXJhdGlvbihTdHJpbmcgY29uZmlnTmFtZSkgewotCQl0aGlzLmN1cnJlbnRDb25maWdOYW1lID0gY29uZmlnTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gY3VycmVudENvbmZpZ05hbWU7Ci0JfQotCi0JcHVibGljIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGdldExheW91dE1hbmFnZXIoKSB7Ci0JCXJldHVybiBnZXRMYXlvdXRNYW5hZ2VyKHRoaXMuY3VycmVudENvbmZpZ05hbWUpOwotCX0KLQotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlciBnZXRMYXlvdXRNYW5hZ2VyKFN0cmluZyBjb25maWdOYW1lKSB7Ci0JCUVsZW1lbnRMYXlvdXRNYW5hZ2VyIG1nciA9IG51bGw7Ci0JCWlmIChjb25maWdOYW1lID09IG51bGwpIHsKLQkJCW1nciA9IGxpYnJhcnlQcm9jLmdldExheW91dE1hbmFnZXIoKTsKLQkJfSBlbHNlIHsKLQkJCW1nciA9IChFbGVtZW50TGF5b3V0TWFuYWdlcikgbGF5b3V0TWdyTWFwLmdldChjb25maWdOYW1lKTsKLQkJCWlmIChtZ3IgPT0gbnVsbCkgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbGlicmFyeVByb2MKLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uKGNvbmZpZ05hbWUpOwotCQkJCW1nciA9IG5ldyBFbGVtZW50TGF5b3V0TWFuYWdlcihjb25maWcpOwotCQkJCWxheW91dE1nck1hcC5wdXQoY29uZmlnTmFtZSwgbWdyKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBtZ3I7Ci0JfQotCi0JcHVibGljIENvbmZpZ3VyYXRpb25DbG9zdXJlIGdldENsb3N1cmUoKSB7Ci0JCXJldHVybiBnZXRDbG9zdXJlKGN1cnJlbnRDb25maWdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkNsb3N1cmUgZ2V0Q2xvc3VyZShTdHJpbmcgY29uZmlnTmFtZSkgewotCQlDb25maWd1cmF0aW9uQ2xvc3VyZSBjb25maWcgPSBudWxsOwotCQlpZiAoY29uZmlnTmFtZSAhPSBudWxsKSB7Ci0JCQljb25maWcgPSAoQ29uZmlndXJhdGlvbkNsb3N1cmUpIGNvbmZpZ01hcC5nZXQoY29uZmlnTmFtZSk7Ci0JCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIG1vZGVsQ29uZmlnID0gbGlicmFyeVByb2MKLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uKGNvbmZpZ05hbWUpOwotCQkJCWNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uQ2xvc3VyZSh0aGlzLCBtb2RlbENvbmZpZyk7Ci0JCQkJY29uZmlnTWFwLnB1dChjb25maWdOYW1lLCBjb25maWcpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYWtlQ2xvc3VyZSgpIHsKLQkJQ29uZmlndXJhdGlvbkNsb3N1cmUgYyA9IGdldENsb3N1cmUoY3VycmVudENvbmZpZ05hbWUpOwotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQljLm1ha2VDbG9zdXJlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25GaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3ZDMxMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVmFyaWFiaWxpdHlJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiBBIG1ldGhvZCBjb25maWd1cmF0aW9uIGZpbHRlciB0byBhbGxvdyBmaWx0ZXJpbmcgZWxlbWVudCAKLSAqIGFuZCByZWFsaXplIHRoZSBlbGVtZW50IGZlYXR1cmUgdmFsdWVzIHdpdGhpbiBhIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkZpbHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSUNvbmZpZ3VyYXRvciB7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWc7CQotCS8vcHJpdmF0ZSBWaWV3ZXIgdmlld2VyOwotCQotCS8vIHNldCB0aGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgY29uZmlndXJhdGlvbiB2aWV3IHRvIHRydWUsIGkuZS4gY29udHJpYnV0b3JzIGFyZSBkaXNjYXJkZWQuCi0JcHJpdmF0ZSBib29sZWFuIGRpc2NhcmRDb250cmlidXRvcnMgPSB0cnVlOwotCQotCi0JLyoqCi0JICogY29uc3RydWN0b3IKLQkgKiBAcGFyYW0gbWV0aG9kQ29uZmlnIGEgPGNvZGU+TWV0aG9kQ29uZmlndXJhdGlvbjwvY29kZT4KLQkgKiBAcGFyYW0gdmlld2VyIGEgPGNvZGU+Vmlld2VyPC9jb2RlPgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uRmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnKSB7Ci0JCXRoaXMubWV0aG9kQ29uZmlnID0gbWV0aG9kQ29uZmlnOwotCQkvL3RoaXMudmlld2VyID0gdmlld2VyOwotCX0KLQotCXB1YmxpYyBDb25maWd1cmF0aW9uRmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBib29sZWFuIGRpc2NhcmRDb250cmlidXRvcnMpIHsKLQkJdGhpcyhtZXRob2RDb25maWcpOwotCQl0aGlzLmRpc2NhcmRDb250cmlidXRvcnMgPSBkaXNjYXJkQ29udHJpYnV0b3JzOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlciNhY2NlcHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAobWV0aG9kQ29uZmlnID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlvYmogPSBMaWJyYXJ5VXRpbC51bndyYXAob2JqKTsKLQotCQlpZiAoIChFbGVtZW50UmVhbGl6ZXIuaXNFeHRlbmRSZXBsYWNlRW5hYmxlZCgpIHx8ICAKLQkJCQkob2JqIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSAmJiBDb25maWd1cmF0aW9uSGVscGVyLmlzRXh0ZW5kUmVwbGFjZXIoKFZhcmlhYmlsaXR5RWxlbWVudClvYmopICkKLQkJCQkmJiBGZWF0dXJlVmFsdWUuaXNCbGFua0luZGljYXRvcihvYmopICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJcmV0dXJuIG1ldGhvZENvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuY29udGFpbnMob2JqKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5jYW5TaG93KChNZXRob2RFbGVtZW50KSBvYmosCi0JCQkJCW1ldGhvZENvbmZpZyk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoTG9nLkRFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIk9iamVjdCBmaWx0ZXJlZDogIiArIChvYmogPT0gbnVsbCA/IG51bGwgOiBvYmoudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQotCS8qKgotCSAqIGdldCB0aGUgcmVhbGl6ZWQgY2hpbGRyZW4gZm9yIHRoZSBnaXZlbiBvYmplY3QgYW5kIGZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gb2JqIE9iamVjdAotCSAqIEBwYXJhbSBjaGlsZEZlYXR1cmUgRVN0cnVjdHVyYWxGZWF0dXJlCi0JICogCi0JICogQHJldHVybiBDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSkgewotCQlpZiAobWV0aG9kQ29uZmlnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihtZXRob2RDb25maWcpOwotCQkvLyBkaXNjYXJkIHRoZSBjb250cmlidXRvcnMKLQkJcmVhbGl6ZXIuc2V0RGlzY2FyZENvbnRyaWJ1dG9yKHRoaXMuZGlzY2FyZENvbnRyaWJ1dG9ycyk7Ci0KLQkJaWYgKGNoaWxkRmVhdHVyZSAhPSBudWxsICYmIGNoaWxkRmVhdHVyZS5pc01hbnkoKSkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlMaXN0IHZhbHVlID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLCBjaGlsZEZlYXR1cmUsIHJlYWxpemVyKTsKLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0vLwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpIHsKLS8vCQlpZiAodmlld2VyID09IG51bGwpIHsKLS8vCQkJcmV0dXJuOwotLy8JCX0KLS8vCi0vLwkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotLy8JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0vLwkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotLy8JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotLy8JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0vLwkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0vLwkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLS8vCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfSk7Ci0vLwotLy8JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3IjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIG1ldGhvZENvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvciNzZXRNZXRob2RDb25maWd1cmF0aW9uKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCW1ldGhvZENvbmZpZyA9IGNvbmZpZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNvbHZlRWxlbWVudFZhcmlhYmlsaXR5TGlzdChWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCwKLQkJCVZhcmlhYmlsaXR5SW5mbyBpbmZvLCBib29sZWFuIGluY2x1ZGVCYXNlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQotCQlpZiAobWV0aG9kQ29uZmlnID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy9yZXNvbHZlIHRvIGluY2x1ZGUgY29udHJpYnV0b3JzCi0JCXJlc29sdmVFbGVtZW50Q29udHJpYnV0b3JzKGVsZW1lbnQsaW5mbyxyZWFsaXplcik7Ci0KLQkJLy8gaWYgdGhlIGVsZW1lbnQgaXMgYW4gZXh0ZW5kZWQgZWxlbWVudCwgZ2V0IHRoZSBiYXNlIGVsZW1lbnQncwotCQkvLyBjb250cmlidXRvcnMKLQkJLy8gTk9URTogdGhlIGJhc2UgZWxlbWVudCBpdHNlbGYgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBzaW5jZSBpdCdzCi0JCS8vIGFscmVhZHkgaGFuZGxlZAotCQkvLyBpbiB0aGUgYWN0aXZpdHkgcmVhbGl6dGlvbiBpbiBJdGVtUHJvdmlkZXJzLgotCQlpZiAoQ29uZmlndXJhdGlvbkhlbHBlci5pc0V4dGVuZGVyKGVsZW1lbnQpKSB7Ci0JCQlNZXRob2RFbGVtZW50IGJhc2UgPSBlbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoYmFzZSwgcmVhbGl6ZXIpOwotCi0JCQkvLyBpZiBpbmNsdWRlYmFzZSBpcyB0cnVlLCBhZGQgdGhlIGVsZW1lbnQgdG8gdGhlIGluaGVyaXRhbmNlIGxpc3QKLQkJCWlmIChpbmNsdWRlQmFzZSkgewotCQkJCUxpc3QgdmFsdWVzID0gaW5mby5nZXRJbmhlcml0YW5jZUxpc3QoKTsKLQkJCQlpZiAoIXZhbHVlcy5jb250YWlucyhlKSkgewotCQkJCQl2YWx1ZXMuYWRkKGUpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gcmVzb2x2ZSB0aGUgYmFzZSB0byBpbmNsdWRlIGFkZGl0aW9uYWwgY29udHJpYnV0b3JzIGFuZC9vciBiYXNlCi0JCQlyZXNvbHZlRWxlbWVudFZhcmlhYmlsaXR5TGlzdChlLCBpbmZvLCBpbmNsdWRlQmFzZSwgcmVhbGl6ZXIpOwotCi0JCX0KLQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZXNvbHZlRWxlbWVudENvbnRyaWJ1dG9ycyhWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCwKLQkJCVZhcmlhYmlsaXR5SW5mbyBpbmZvLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpewotCQkvLyBpZiB0aGUgZWxlbWVudCBoYXMgY29udHJpYnV0b3JzIGluIHRoZSBjb25maWd1cmF0aW9uLCBnZXQgdGhlCi0JCS8vIHJlZmVyZW5jZSBwcm9wZXJ0aWVzCi0JCS8vIGlmIGEgY29udHJpYnV0b3IgaGFzIHJlcGxhY2VyLCBpdCdzIHJlcGxhY2VyIGlzIHVzZWQKLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29udHJpYnV0b3JzKGVsZW1lbnQsIG1ldGhvZENvbmZpZyk7Ci0JCWlmIChpdGVtcyAhPSBudWxsICYmIGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQkJTGlzdCB2YWx1ZXMgPSBpbmZvLmdldENvbnRyaWJ1dG9ycygpOwotCQkJCWlmICghdmFsdWVzLmNvbnRhaW5zKGUpKSB7Ci0JCQkJCXZhbHVlcy5hZGQoZSk7Ci0JCQkJfQotCQkJCXJlc29sdmVFbGVtZW50VmFyaWFiaWxpdHlMaXN0KGUsIGluZm8sIGZhbHNlLCByZWFsaXplcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIHJlc29sdmUgdGhlIHZhcmlhYmlsaXR5IG9mIHRoZSBlbGVtZW50IGFuZCBnZXQgYSBsaXN0IG9mIGNvbnRyaWJ1dG9ycy4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciByZWFsaXppbmcgYWN0aXRpdnkgYnJlYWtkb3duIGVsZW1lbnRzIGluIHRoZQotCSAqIGl0ZW1Qcm92aWRlcnMuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3IjZ2V0VmFyaWFiaWxpdHlJbmZvKG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50KQotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eUluZm8gZ2V0VmFyaWFiaWxpdHlJbmZvKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSkgewotCi0JCS8vIGNhbGN1bGF0ZSB0aGUgZWxlbWVudCBmaXJzdAotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihtZXRob2RDb25maWcsIHRydWUsIHRydWUpOwotCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlJbmZvKHZlLCByZWFsaXplcik7Ci0JfQotCi0JcHJvdGVjdGVkIFZhcmlhYmlsaXR5SW5mbyBnZXRWYXJpYWJpbGl0eUluZm8oVmFyaWFiaWxpdHlFbGVtZW50IHZlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQotCQkvLyBjYWxjdWxhdGUgdGhlIGVsZW1lbnQgZmlyc3QKLQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJLmdldENhbGN1bGF0ZWRFbGVtZW50KHZlLCByZWFsaXplcik7Ci0KLQkJaWYgKGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlWYXJpYWJpbGl0eUluZm8gaW5mbyA9IG5ldyBWYXJpYWJpbGl0eUluZm8odmUpOwotCQlpbmZvLmdldEluaGVyaXRhbmNlTGlzdCgpLmFkZChlKTsKLQotCQlyZXNvbHZlRWxlbWVudFZhcmlhYmlsaXR5TGlzdChlLCBpbmZvLCB0cnVlLCByZWFsaXplcik7Ci0KLQkJcmV0dXJuIGluZm87Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgcmVzb2x2ZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIobWV0aG9kQ29uZmlnLCB0cnVlLCB0cnVlKTsKLQkJCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KAotCQkJCQkoTWV0aG9kRWxlbWVudCkgZWxlbWVudCwgcmVhbGl6ZXIpOwotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQkKLQkKLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciB1bmNhdGVnb3JpemVkIHRhc2tzCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0VW5jYXRlZ29yaXplZFRhc2tGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgSUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJLy8gMTU4OTI0IC0gd3JvbmcgY2F0ZWdvcmllcyBpbiBjb25maWd1cmF0aW9uIHZpZXcKLQkJCQkvLyBzaG91bGQgdXNlIHRoZSBkZWZhdWx0IHJlYWxpemVyCi0JCQkJLy8gd2Ugc2hvdWxkIG5vdCBkaXNjYXJkIHRoZSBkaXNjaXBsaW5lIGNvbnRyaWJ1dG9ycyAKLQkJCQkvLyBpbnN0ZWFkIHNob3VsZCByZWFsaXplIHRvIHRoZSBiYXNlIGRpc2NpcGxpbmUKLQkJCQlyZXR1cm4gKCBvYmogaW5zdGFuY2VvZiBUYXNrICkgJiYgCi0JCQkJCUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCQkJCShUYXNrKW9iaiwgCi0JCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuVGFza19EaXNjaXBsaW5lcywgCi0JCQkJCQkJRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIobWV0aG9kQ29uZmlnKSkuaXNFbXB0eSgpOwkJCQkJCi0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIGdldCBmaWx0ZXIgZm9yIHdvcmtwcm9kdWN0cyB3aXRob3V0IGEgZG9tYWluCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0RG9tYWluVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0RmlsdGVyKCl7Ci0JCXJldHVybiBuZXcgSUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJLy8gMTU4OTI0IC0gd3JvbmcgY2F0ZWdvcmllcyBpbiBjb25maWd1cmF0aW9uIHZpZXcKLQkJCQkvLyBzaG91bGQgdXNlIHRoZSBkZWZhdWx0IHJlYWxpemVyCi0JCQkJLy8gd2Ugc2hvdWxkIG5vdCBkaXNjYXJkIHRoZSBkb21haW4gY29udHJpYnV0b3JzIAotCQkJCS8vIGluc3RlYWQgc2hvdWxkIHJlYWxpemUgdG8gdGhlIGJhc2UgZG9tYWluCi0JCQkJcmV0dXJuICggb2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QgKSAmJiAKLQkJCQkJQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJCQkJKFdvcmtQcm9kdWN0KW9iaiwgCi0JCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfRG9tYWlucywgCi0JCQkJCQkJRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIobWV0aG9kQ29uZmlnKSkuaXNFbXB0eSgpOwkJCQkJCi0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIGdldCBmaWx0ZXIgZm9yIHdvcmtwcm9kdWN0cyB3aXRob3V0IGEgV1AgVHlwZQotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFdwVHlwZVVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlcigpewotCQlyZXR1cm4gbmV3IElGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCS8vIDE1ODkyNCAtIHdyb25nIGNhdGVnb3JpZXMgaW4gY29uZmlndXJhdGlvbiB2aWV3Ci0JCQkJLy8gc2hvdWxkIHVzZSB0aGUgZGVmYXVsdCByZWFsaXplcgotCQkJCS8vIHdlIHNob3VsZCBub3QgZGlzY2FyZCB0aGUgV1BUeXBlIGNvbnRyaWJ1dG9ycyAKLQkJCQkvLyBpbnN0ZWFkIHNob3VsZCByZWFsaXplIHRvIHRoZSBiYXNlIAotCQkJCXJldHVybiAoIG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0ICkgJiYgCi0JCQkJCUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCQkJCShXb3JrUHJvZHVjdClvYmosIAotCQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1dvcmtQcm9kdWN0VHlwZXMsIAotCQkJCQkJCURlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKG1ldGhvZENvbmZpZykpLmlzRW1wdHkoKTsJCQkJCQotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciB1bmNhdGVnb3JpemVkIHJvbGVzCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0VW5jYXRlZ29yaXplZFJvbGVGaWx0ZXIoKXsKLQkJcmV0dXJuIG5ldyBJRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkvLyAxNTg5MjQgLSB3cm9uZyBjYXRlZ29yaWVzIGluIGNvbmZpZ3VyYXRpb24gdmlldwotCQkJCS8vIHNob3VsZCB1c2UgdGhlIGRlZmF1bHQgcmVhbGl6ZXIKLQkJCQkvLyB3ZSBzaG91bGQgbm90IGRpc2NhcmQgdGhlIHJvbGVzZXQgY29udHJpYnV0b3JzIAotCQkJCS8vIGluc3RlYWQgc2hvdWxkIHJlYWxpemUgdG8gdGhlIGJhc2UgCi0JCQkJcmV0dXJuICggb2JqIGluc3RhbmNlb2YgUm9sZSApICYmIAotCQkJCQlDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJCQkoUm9sZSlvYmosIAotCQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLlJvbGVfUm9sZVNldHMsIAotCQkJCQkJCURlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKG1ldGhvZENvbmZpZykpLmlzRW1wdHkoKTsJCQkJCQotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIGdldCBmaWx0ZXIgZm9yIHVuY2F0ZWdvcml6ZWQgdG9vbCBtZW50b3JzCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0VW5jYXRlZ29yaXplZFRvb2xNZW50b3JGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgSUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJLy8gMTU4OTI0IC0gd3JvbmcgY2F0ZWdvcmllcyBpbiBjb25maWd1cmF0aW9uIHZpZXcKLQkJCQkvLyBzaG91bGQgdXNlIHRoZSBkZWZhdWx0IHJlYWxpemVyCi0JCQkJLy8gd2Ugc2hvdWxkIG5vdCBkaXNjYXJkIHRoZSB0b29sIGNvbnRyaWJ1dG9ycyAKLQkJCQkvLyBpbnN0ZWFkIHNob3VsZCByZWFsaXplIHRvIHRoZSBiYXNlIAotCQkJCXJldHVybiAoIG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IgKSAmJiAKLQkJCQkJQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJCQkJKFRvb2xNZW50b3Ipb2JqLCAKLQkJCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Ub29sTWVudG9yX1Rvb2xzLCAKLQkJCQkJCQlEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihtZXRob2RDb25maWcpKS5pc0VtcHR5KCk7CQkJCQkKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3IgZGlzY2lwbGluZXMgYW5kIGRpc3BsaW5lIGdyb3VwaW5ncwotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldERpc2NpcGxpbmVzRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IElGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCS8vIFtCdWcgMTYyNjAzXSBOZXc6IFJlcGxhY2luZyBkaXNjaXBsaW5lcyBkbyBhcHBlYXIgaW5zaWRlIHRoZWlyIHJlcGxhY2VkIGVsZW1lbnRzIGRpc2NpcGxpbmUgZ3JvdXBpbmdzIAotCQkJCS8vIGFzIHdlbGwgYXMgb3V0c2lkZSBvZiB0aGUgZGlzY2lwbGluZSBncm91cGluZwotCQkJCWlmICggb2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nICkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuICggb2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSApICYmIAotCQkJCUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCQkJKE1ldGhvZEVsZW1lbnQpb2JqLCAKLQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLkRpc2NpcGxpbmVfRGlzY2lwbGluZUdyb3VwaW5ncywgCi0JCQkJCQlEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihtZXRob2RDb25maWcpKS5pc0VtcHR5KCk7CQkJCQkKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3Igcm9sZXNldHMgYW5kIHJvbGVzZXQgZ3JvdXBpbmdzCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0Um9sZVNldHNGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgSUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJLy8gW0J1ZyAxNjI2MDNdIE5ldzogUmVwbGFjaW5nIGRpc2NpcGxpbmVzIGRvIGFwcGVhciBpbnNpZGUgdGhlaXIgcmVwbGFjZWQgZWxlbWVudHMgZGlzY2lwbGluZSBncm91cGluZ3MgCi0JCQkJLy8gYXMgd2VsbCBhcyBvdXRzaWRlIG9mIHRoZSBkaXNjaXBsaW5lIGdyb3VwaW5nCi0JCQkJLy8gc2FtZSBmb3Igcm9sZXNldCBncm91cGluZwotCQkJCWlmICggb2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nICkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuICggb2JqIGluc3RhbmNlb2YgUm9sZVNldCApICYmIAotCQkJCQlDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJCQkoTWV0aG9kRWxlbWVudClvYmosIAotCQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLlJvbGVTZXRfUm9sZVNldEdyb3VwcGluZ3MsIAotCQkJCQkJCURlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKG1ldGhvZENvbmZpZykpLmlzRW1wdHkoKTsJCQkJCQotCQkJfQotCQl9OwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NmE0ZjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ2F0ZWdvcnlTb3J0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uSGVscGVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SID0gIjxwLz4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGEgQ29udGVudERlc2NyaXB0aW9uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQge0BsaW5rIE1ldGhvZEVsZW1lbnR9Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVzY3JpcHRpb25FbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoIGVsZW1lbnQgPT0gbnVsbCApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uIHx8IGVsZW1lbnQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKTsKLQotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBtZXRob2QgcGFjaj1rYWdlIGlzIGEgZ2xvYmFsIHBhY2thZ2UKLQkgKiAKLQkgKiBAcGFyYW0gcGtnIHtAbGluayBNZXRob2RQYWNrYWdlfQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0dsb2JhbFBhY2thZ2UoTWV0aG9kUGFja2FnZSBwa2cpIHsKLQkJaWYgKHBrZyA9PSBudWxsKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiQ29uZmlndXJhdGlvbkhlbHBlci5pc0dsb2JhbFBhY2thZ2U6IG1ldGhvZCBwYWNrYWdlIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJTWV0aG9kUGx1Z2luIHAgPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4ocGtnKTsKLQkJaWYgKHAgPT0gbnVsbCkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIkNvbmZpZ3VyYXRpb25IZWxwZXIuaXNHbG9iYWxQYWNrYWdlOiBVbmFibGUgdG8gZmluZCBtZXRob2QgcGx1Zy1pbiBmb3IgIiArIHBrZy5nZXROYW1lKCkgKyAiOiAiICsgcGtnLmdldEd1aWQoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMocCkuY29udGFpbnMocGtnKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBpbiB0aGUgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW5Db25maWcoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJcmV0dXJuIGluQ29uZmlnKGVsZW1lbnQsIGNvbmZpZywgdHJ1ZSk7Ci0JfQotCQotCQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpbkNvbmZpZyhNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiBjaGVja1N1YnRyYWN0ZWQpIHsKLQkJcmV0dXJuIGluQ29uZmlnKGVsZW1lbnQsIGNvbmZpZywgY2hlY2tTdWJ0cmFjdGVkLCB0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGluQ29uZmlnKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBib29sZWFuIGNoZWNrU3VidHJhY3RlZCwgYm9vbGVhbiBjaGVja0Jhc2UpIHsKLQkJaWYgKCFpc093bmVyU2VsZWN0ZWQoZWxlbWVudCwgY29uZmlnLCBjaGVja1N1YnRyYWN0ZWQpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvL0J1ZyAyMDc0MjkgLSBDb25maWdyYXRpb246IFdhcnJpbmcgaW5mbyBzaG91bGQgc2hvd24gd2hlbiBkZXNlbGVjdCB0aGUgcmVwbGFjZWQgZWxlbWVudAotCQkvLyBmb3IgY29uZmlndXJhdGlvbiBjbG9zdXJlIGNoZWNraW5nLCB0aGUgbWlzc2luZyBiYXNlIHNob3VsZCBiZSByZXBvcnRlZCAKLQkJLy8gc28gdGhlIGVsZW1lbnQgYmVlbiBjaGVja2VkIHN0aWxsIHRyZWF0ZWQgYXMgaW4gY29uZmlnCi0JCS8vIGFkZGVkIHRoZSBjaGVja0Jhc2UgZmxhZyB0byBpZ25vcmUgdGhlIGJhc2UgY2hlY2tpbmcKLQkJLy8gZm9yIGNvbmZpZ3VyYXRpb24gcmVhbGl6YXRpb24sIHRoaXMgZmxhZyBzaG91bGQgYmUgc2V0IHRvIHRydWUKLQkJLy8gc28gdGhlIHJlcGxhY2VyIG1pc3NpbmcgYmFzZSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGNvbmZpZy4KLQkJCi0JCS8vIGlmIHRoZSBlbGVtZW50IGlzIGEgcmVwYWxjZXIsIGFuZCBpdCdzIGJhc2UgZWxlbWVudCBoYXMgbW9yZSB0aGFuIG9uZQotCQkvLyByZXBsYWNlcgotCQkvLyBub25lIG9mIHRoZSByZXBsYWNlcnMgc2hvdWxkIGJlIGluY2x1ZGVkIGludG8gdGhlIGNvbmZpZ3VyYXRpb24KLQkJaWYgKGNoZWNrQmFzZSAmJiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50OwotCQkJaWYgKGlzUmVwbGFjZXIodmUpKSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJaWYgKGluQ29uZmlnKGJhc2UsIGNvbmZpZykpIHsKLQkJCQkJCi0vLwkJCQkJLy8gSW52YWxpZCBob3RzcG90IGNyZWF0ZWQgZm9yIGxvY2FsbHkgcmVwbGFjZWQgYWN0aXZpdHkgaW4gYWN0aXZpdHkgZGlhZ3JhbQotLy8JCQkJCS8vIHRoaXMgaXMgYmVjYXVzZSB0aGUgYWN0aXZpdHkgaGFzIG1vcmUgdGhhbiBvbmUgbG9jYWwgcmVwbGFjZXJzCi0vLwkJCQkJLy8gaW4gdmVyc2lvbiA3LjAsIGxvY2FsIHJlcGxhY2VtZW50IGlzIG1vZGVsZWQgdGhlIHNhbWUgd2F5IGFzIG5vbWFsIHJlcGxhY2VtZW50Ci0vLwkJCQkJLy8gd2UgbmVlZCB0byBpZ25vcmUgdGhpcyBjaGVja2luZyBmb3IgYWN0aXZpdHkKLS8vCQkJCQlpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSApIHsKLS8vCQkJCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQkJfQotCQkJCQkKLQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldEltbWVkaWF0ZVZhcmlldGllcygKLQkJCQkJCQliYXNlKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQkJCWlmICgoZSAhPSBlbGVtZW50KQotCQkJCQkJCQkmJiAoZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpCi0JCQkJCQkJCSYmIGlzT3duZXJTZWxlY3RlZChlLCBjb25maWcsIGNoZWNrU3VidHJhY3RlZCkpIHsKLQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJCS5wcmludGxuKCJDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnOiBJZ25vcmluZyByZXBsYWNpbmcgZWxlbWVudCAnIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICsgIicgc2luY2UgaXRzIGJhc2UgZWxlbWVudCBoYXMgbW9yZSB0aGFuIG9uZSByZXBsYWNlciBpbiB0aGUgY29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGZhbHNlOyAgLy8gYmFzZSBtdXN0IGJlIGluIHRoZSBjb25maWd1cmF0aW9uCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc093bmVyU2VsZWN0ZWQoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIGJvb2xlYW4gY2hlY2tTdWJ0cmFjdGVkKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRNZXRob2RMaWJyYXJ5KGNvbmZpZyk7Ci0JCUlMaWJyYXJ5TWFuYWdlciBsaWJyYXJ5TWFuYWdlciA9IGxpYnJhcnkgPT0gbnVsbD8gbnVsbCA6IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0TGlicmFyeU1hbmFnZXIobGlicmFyeSk7Ci0JCWlmIChsaWJyYXJ5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKGNvbmZpZykKLQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkRhdGEoKQotCQkJCQkJCQkuaXNPd25lclNlbGVjdGVkKGVsZW1lbnQsIGNoZWNrU3VidHJhY3RlZCk7Ci0JCX0KLQkJCQkKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGNvbmZpZyA9PSBudWxsIHx8IGlzRGVzY3JpcHRpb25FbGVtZW50KGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8vIHNpbmNlIFVNQSAxLjAuNCwgY29uZmlndXJhdGlvbiBjYW4gaGF2ZSBhZGRlZCBjYXRlZ29yaWVzIAotCQkvLyBhbmQgc3VidHJhY3RlZCBjYXRlZ29yaWVzLiBUaGUgb3JkZXIgb2YgZmlsdGVyaW5nIGlzOgotCQkvLyAxLiBhbnkgZWxlbWVudCBpbiB0aGUgc3VidHJhY3RlZCBjYXRlZ29yaWVzIHNob3VsZCBiZSBleGNsdWRlZAotCQkvLyAyLiBhbnkgZWxlbWVudCBpbiB0aGUgYWRkZWQgY2F0ZWdvcmllcyBzaG91bGQgYmUgaW5jbHVkZWQKLQkJLy8gMy4gYW55IGVsZW1lbnQgbm90IGluIHRoZSBzZWxlY3RlZCBwYWNrYWdlIG9yIHBsdWdpbiBzaG91bGQgYmUgZXhjbHVkZWQuCi0JCQotCQlpZiAoIGNoZWNrU3VidHJhY3RlZCApIHsKLQkJCS8vIGZpcnN0IGNoZWNrIHN1YnRyYWN0ZWQgZWxlbWVudHMKLQkJCUxpc3Qgc3VidHJhY3RlZENhdGVnb3JpZXMgPSBjb25maWcuZ2V0U3VidHJhY3RlZENhdGVnb3J5KCk7Ci0JCQlpZiAoIHN1YnRyYWN0ZWRDYXRlZ29yaWVzLnNpemUoKSA+IDAgKSB7Ci0JCQkJZm9yICggSXRlcmF0b3IgaXQgPSBzdWJ0cmFjdGVkQ2F0ZWdvcmllcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCQlDb250ZW50Q2F0ZWdvcnkgY2MgPSAoQ29udGVudENhdGVnb3J5KWl0Lm5leHQoKTsKLQkJCQkJaWYgKCBjYyA9PSBlbGVtZW50ICkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQkvLyBuZWVkIHRvIGNoZWNrIGFsbCBjb250ZW50IGNhdGVnb3J5IHR5cGVzIGFuZCBzdWItY2F0ZWdvcmllcwotCQkJCQkvLyB3ZSBuZWVkIHRvIGhhdmUgYW4gZWZmaWNpZW50IGFsZ29yaXRobSBmb3IgdGhpcyBjaGVja2luZy4KLQkJCQkJLy8gZm9yIG5vdywgb25seSBjaGVjayB0aGUgY3VzdG9tIGNhdGVnb3J5J3MgY2F0ZWdvcmlzZWQgZWxlbWVudHMKLQkJCQkJLy8gVE9ETy4gSmluaHVhIFhpLCAxMS8yNy8yMDA2Ci0JCQkJCWlmICggY2MgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSApIHsKLQkJCQkJCWlmICggKChDdXN0b21DYXRlZ29yeSljYykuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLmNvbnRhaW5zKGVsZW1lbnQpICkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIFRPRE8sIG5vdCBpbXBsZW1lbnRlZCB5ZXQKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVE9ETywgaXNPd25lclNlbGVjdGVkOiBub3QgaW1wbGVtZW50ZWQgeWV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gdGhlbiBjaGVjayBhZGRlZCBjYXRlZ29yaWVzCi0JCS8vIFRPRE8KLQkJCi0JCS8vIGVsZW1lbnRzIGJleW9uZCBjb25maWd1cmF0aW9uIHNjb3BlIHNob3VsZCBiZSBhbHdheXMgdmlzaWJsZQotCQlpZiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KQotCQkJCXx8IChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCUxpc3QgcGx1Z2lucyA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJCXJldHVybiAocGx1Z2lucyAhPSBudWxsKSAmJiBwbHVnaW5zLmNvbnRhaW5zKGVsZW1lbnQpOwotCQl9IGVsc2UgewotCQkJLy8gaWYgdGhlIG93bmVycHJvY2VzcyBjYW4ndCBzaG93LCBjYW4ndCBhY2NlcHQKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KSAoKEFjdGl2aXR5KSBlbGVtZW50KQotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlpZiAoYmFzZSAhPSBudWxsICYmIGJhc2UgIT0gZWxlbWVudCkgewotCQkJCQlNZXRob2RFbGVtZW50IG93bmluZ1Byb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYmFzZSk7Ci0JCQkJCWlmICggb3duaW5nUHJvYyAhPSBudWxsICYmIG93bmluZ1Byb2MgIT0gZWxlbWVudCAKLQkJCQkJCQkmJiAhaW5Db25maWcob3duaW5nUHJvYywgY29uZmlnLCBjaGVja1N1YnRyYWN0ZWQpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCUVPYmplY3QgcGtnID0gTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlbGVtZW50KTsKLQotCQkJLy8gYWNjZXB0IGdsb2JhbCBwYWNrYWdlIGlmIHRoZSBwbHVnaW4gaXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkJCWlmIChwa2cgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlCi0JCQkJCSYmIGlzR2xvYmFsUGFja2FnZSgoTWV0aG9kUGFja2FnZSkgcGtnKSkgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4ocGtnKTsKLQkJCQlyZXR1cm4gaW5Db25maWcocGx1Z2luLCBjb25maWcsIGNoZWNrU3VidHJhY3RlZCk7Ci0JCQl9Ci0KLQkJCUxpc3QgcGtncyA9IGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCQlpZiAocGtncyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQkvLyBwZXIgUGhvbmcncyByZXF1ZXN0LCBmb3IgUHJvY2Vzc1BhY2thZ2UsIGNoZWNrIHRoZQotCQkJLy8gUHJvY2Vzc0NvbXBvbmVudCBwYXJlbnQgaW5zdGVhZAotCQkJaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJd2hpbGUgKChwa2cgIT0gbnVsbCkgJiYgIShwa2cgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KQotCQkJCQkJJiYgIXBrZ3MuY29udGFpbnMocGtnKSkgewotCQkJCQlwa2cgPSBwa2cuZUNvbnRhaW5lcigpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gaWYgcGFja2FnZSBub3Qgc2VsZWN0ZWQsIHJldHVybiBmYWxzZQotCQkJaWYgKChwa2cgPT0gbnVsbCkgfHwgIXBrZ3MuY29udGFpbnMocGtnKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBpcyB0aGUgZWxlbWVudCBhIGNvbnRyaWJ1dG9yPwotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udHJpYnV0b3IoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCBlbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBlbGVtZW50LmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUzsKLQl9Ci0KLQkvKioKLQkgKiBpcyB0aGUgZWxlbWVudCBhIHJlcGxhY2VyPwotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVwbGFjZXIoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCBlbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBlbGVtZW50LmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUzsKLQl9Ci0KLQkvKioKLQkgKiBpcyB0aGUgZWxlbWVudCBhIGV4dGVuZC1yZXBsYWNlcj8KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0V4dGVuZFJlcGxhY2VyKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gZWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19SRVBMQUNFUzsKLQl9Ci0JCi0JLyoqCi0JICogaXMgdGhlIGVsZW1lbnQgYW4gZXh0ZW5kZXI/Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHRlbmRlcihWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFM7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSByZXBsYWNlciBvZiB0aGUgZWxlbWVudCBpbiB0aGUgY29uZmlndXJhdGlvbi4gT25seSBvbmUgcmVwbGFjZXIKLQkgKiBpcyBhbGxvd2VkLiBJZiBtb3JlIHRoYW4gb25lIHJlcGxhY2VyIGlzIGZvdW5kLCB0aGVuIG5vbmUgb2YgdGhlbSB3aWxsIGJlCi0JICogcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIFZhcmlhYmlsaXR5RWxlbWVudCB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIFZhcmlhYmlsaXR5RWxlbWVudCB0aGUgcmVwbGFjZXIgaWYgdGhlcmUgaXMgb25lIGFuZCBPTkxZIG9uZSwKLQkgKiAgICAgICAgIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eUVsZW1lbnQgZ2V0UmVwbGFjZXIoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBudWxsOwotCi0JCS8vIHRoaXMgd2lsbCBnZXQgYWxsIHJlcGxhY2VycyByZWN1cnNpdmVseS4gd2Ugb25seSBuZWVkIHRoZSBpbW1lZGlhdGUKLQkJLy8gb25lcwotCQkvLyBmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBUbmdVdGlsLmdldEdlbmVyYWxpemVycyhlbGVtZW50LAotCQkvLyBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVNfTElURVJBTCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoZWxlbWVudCkKLQkJCQkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQlpZiAoIGUgPT0gbnVsbCB8fCAhaW5Db25maWcoZSwgY29uZmlnKSApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBlLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJaWYgKCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUyAKLQkJCQkJfHwgdHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19SRVBMQUNFUykgewotCQkJCWlmICh2ZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiQ29uZmlndXJhdGlvbkhlbHBlci5nZXRSZXBsYWNlcjogUmVwbGFjZXIgaWdub3JlZCBmb3IgZWxlbWVudCAnIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICsgIicgc2luY2UgaXQgaGFzIG1vcmUgdGhhbiBvbmUgcmVwbGFjZXJpbiB0aGUgY29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsgLy8gaWYgbW9yZSB0aGFuIG9uZSByZXBsYWNlciwgcmV0dXJuIG51bGwKLQkJCQl9Ci0KLQkJCQl2ZSA9IGU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdmU7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBpbW1lZGlhdGUgY29udHJpYnV0b3JzIG9mIHRoZSBlbGVtZW50IHdpdGhpbiB0aGUgY29uZmlndXJhdGlvbi4KLQkgKiBJZiBhIGNvbnRyaWJ1dG9yIGhhcyBpbW1lZGlhdGUgcmVwbGFjZXIsIGl0IGlzIHJlcGFsY2VkIHdpdGggdGhlIHJlcGxhY2VyCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDb250cmlidXRvcnMoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmICggZWxlbWVudCA9PSBudWxsICkgewotCQkJcmV0dXJuIGl0ZW1zOwotCQl9Ci0JCQotCQkvLyBUaGlzIG1ldGhvZCBnZXQgYWxsIGNvbnRyaWJ1dG9ycyByZWN1cnNpdmVseSwKLQkJLy8gd2Ugb25seSBuZWVkIHRoZSBmaXJzdCBsZXZlbAotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ID0gVG5nVXRpbC5nZXRDb250cmlidXRvcnMoZWxlbWVudCk7IGl0Lmhhc05leHQoKTsgKQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKGVsZW1lbnQpCi0JCQkJLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotCQkJaWYgKChlICE9IG51bGwpCi0JCQkJCSYmIChlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUykKLQkJCQkJJiYgaW5Db25maWcoZSwgY29uZmlnKSkgewotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCByZXBsYWNlciA9IGdldFJlcGxhY2VyKGUsIGNvbmZpZyk7Ci0JCQkJaWYgKHJlcGxhY2VyICE9IG51bGwpIHsKLQkJCQkJaXRlbXMuYWRkKHJlcGxhY2VyKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpdGVtcy5hZGQoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRFeHRlbmRlcnMoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmICggZWxlbWVudCA9PSBudWxsICkgewotCQkJcmV0dXJuIGl0ZW1zOwotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKGVsZW1lbnQpCi0JCQkJLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotCQkJaWYgKChlICE9IG51bGwpCi0JCQkJCSYmIChlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKQotCQkJCQkmJiBpbkNvbmZpZyhlLCBjb25maWcpKSB7Ci0JCQkJCWl0ZW1zLmFkZChlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpdGVtczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhblNob3coTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJcmV0dXJuIGNhblNob3coZWxlbWVudCxjb25maWcsIHRydWUpOwotCX0KLQkKLQotCS8qKgotCSAqIGVsZW1lbnQgY2FuJ3Qgc2hvdyBpbiB0aGUgY29uZmlndXJhdGlvbiB0cmVlIGlmIDEuIHRoZSBlbGVtZW50IGlzIG5vdCBpbgotCSAqIHRoZSBjb25maWd1cmF0aW9uIDIuIHRoZSBlbGVtZW50IGlzIGEgY29udHJpYnV0aW9uIHRvIGFub3RoZXIgZWxlbWVudCAzLgotCSAqIGlmIHRoZSBlbGVtZW50IGlzIGEgcmVwbGFjZXIgdG8gYSAzLiB0aGUgZWxlbWVudCBoYXMgYSByZXBsYWNlbWVudAotCSAqIGVsZW1lbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuU2hvdyhNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiBjaGVja1N1YnRyYWN0ZWQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCFpbkNvbmZpZyhlbGVtZW50LCBjb25maWcsIGNoZWNrU3VidHJhY3RlZCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0vLwkJLy8gaWYgaXQ7cyBhbiBhY3Rpdml0eSwgcmV0dXJuIHNpbmNlIGNvbnRyaWJ1dG9ycyBhcmUgbG9jYWwgY29udHJpYnV0aW9uIGFuZCBuZWVkcyB0byBiZSBzaG93bgotLy8JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLS8vCQkJcmV0dXJuIHRydWU7Ci0vLwkJfQotCi0vLwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8JCS8vIHRoaXMgaXMgbm90IG5lZWRlZCBhbnkgbW9yZSBzaW5jZSB0aGUgc3VwcHJlc3Npb24gc3RhdGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWN0aXZpdHkgYWRhcHRvciBmYWN0b3J5Ci0vLwkJLy8ganVzdCBsZWF2ZSBpdCBoZXJlIGZvciBub3cgc2luY2UgaXQgZG9lcyBub3QgaHVydC4gdGFrZSBpdCBhd2F5IGluIG5leHQgcmVsZWFzZQotCQkvLyAKLQkJLy8gTk8sIHdlIHN0aWxsIG5lZWQgdG8ga2VlcCB0aGlzIHRvIGNoZWNrIHRoZSBzdXBwcmVzc2lvbiBvZiBkZXNjcmlwdG9ycyByZWZlcmVuY2VkIGJ5IGFub3RoZXIgZGVzY3JpcHRvci4gCi0JCS8vIGZvciBleGFtcGxlLCB3aGVuIGRpc3BsYXlpbmcgYSBURCBwYWdlLCB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgc3VwcHJlc3Npb24gb2YgdGhlIHJlZmVyZW5jZWQgV1BEcyBhbmQgUkRzLiAKLQkJLy8gMDAzOTUyNzggLSBCcm93c2luZyBURCB3aXRoIHN1cHByZXNzZWQgUkQvV1BEIHVuZGVyIGl0ICAtLSBzdXBwcmVzc2VkIG9uZXMgc3RpbGwgc2hvd2luZwotCQkvLyBOb3RlOiB0aGlzIGRvZXMgbm90IGhhbmRsZSB0aGUgY2FzZSB3aGVuIHRoZSBkZXNjcmlwdG9yIGlzIHdpdGggYW4gaW5oZXJpdGVkIGFjdGl2aXR5LiAKLQkJLy8gaW4gdGhhdCBjYXNlLCB0aGUgc3VwcHJlc3Npb24gbmVlZCB0byBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBhY3Rpdml0eSBwYXRoLiBUT0RPCi0JCUJvb2xlYW4gc3VwcmVzc2VkID0gZWxlbWVudC5nZXRTdXBwcmVzc2VkKCk7Ci0JCWlmIChzdXByZXNzZWQgIT0gbnVsbCAmJiBzdXByZXNzZWQuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0vLwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkKLQkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQlpZiAoICFjYW5TaG93QnlDaGVja2luZ1ZFKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQsY29uZmlnKSApIHsKLQkJCQlyZXR1cm4gIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuU2hvd0J5Q2hlY2tpbmdWRShWYXJpYWJpbGl0eUVsZW1lbnQgZSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpewkJCi0KLQkJLy8gaWYgdGhpcyBpcyBhbiBleHRlbmRlciwgYWx3YXlzIHNob3csIGV2ZW4gdGhvdWdoIGl0IGV4dGVuZHMgYQotCQkvLyBjb250cmlidXRvcgotCQlpZiAoaXNFeHRlbmRlcihlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlpZiAoaXNDb250cmlidXRvcihlKSB8fCBnZXRSZXBsYWNlcihlLCBjb25maWcpICE9IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGZvciBhY3Rpdml0eSwgZG9uJ3Qgc2hvdyB0aGUgb25lcyB0aGF0IGNvbnRhaW5zIGNvbnRyaWJ1dG9ycyAKLQkJLy8gdGhlIHJlc2FvbiBmb3IgdGhpcyBpcyB0byBzaW1wbGlmeSB0aGUgbG9naWMuCi0JCS8vIGFzc3VtaW5nIHRoYXQgdXNlciB1c2VzIHRoaXMgYWN0aXZpdHkgdG8gY29udHJpYnV0ZSB0byBvdGhlciBhY3Rpdml0aWVzCi0JCS8vIHNvIHRoYXQgcGFydCBzaG91bGQgbm90IGJlIGludm9sdmVkIGluIHRoZSBuYXZpZ2F0aW9uCi0JCS8vIAotCQkvLyBKaW5odWEgWGksIDA3LzE0LzA2LCAKLQkJaWYgKCAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSAmJiBoYXNDb250cmlidXRvcigoQWN0aXZpdHkpZSkgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl3aGlsZSAoKGUgIT0gbnVsbCkgJiYgaXNSZXBsYWNlcihlKSkgewotCQkJZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGlzQ29udHJpYnV0b3IoZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCBpbiB0aGUgY29uZmlndXJhdGlvbi4gMS4gaWYgaXQncyBhCi0JICogY29udHJpYnV0b3IsIHNob3cgdGhlIG5hbWUgb2YgdGhlIGJhc2UgZWxlbWVudCAyLiBpZiBpdCBoYXMgYQotCSAqIHJlcGxhY2VtZW5ldCwgc2hvdyB0aGUgbmFtZSBvZiB0aGUgcmVwbGFjZW1lbnQgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50OwotCQkJaWYgKGlzQ29udHJpYnV0b3IoZSkpIHsKLQkJCQlyZXR1cm4gZ2V0TmFtZShlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwgY29uZmlnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHJlcCA9IGdldFJlcGxhY2VyKGUsIGNvbmZpZyk7Ci0JCQkJaWYgKHJlcCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBnZXROYW1lKHJlcCwgY29uZmlnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudC5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBwcmVzZW50YXRpb24gbmFtZSBmb3IgYW4gZWxlbWVudCBpbiB0aGUgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlc2VudGF0aW9uTmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkKLQkJLy8gW0J1ZyAxOTYzOTldIFAtbmFtZSBpcyBub3QgaW5oZXJpdGVkIGZyb20gaXRzIGJhc2UgZWxlbWVudCBpbiBhbiBleHRlbmRpbmcgZWxlbWVudAotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0KLQkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50ICkgewotCQkJbmFtZSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KWVsZW1lbnQpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCWlmICggU3RyVXRpbC5pc0JsYW5rKG5hbWUpICYmIChlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSApIHsKLQkJCQkKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJRWxlbWVudFJlYWxpemVyIHIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwkKLQkJCQlNZXRob2RFbGVtZW50IG1lID0gZWxlbWVudDsKLQotCQkJCWRvIHsKLQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IG9sZE1lID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgbWU7Ci0JCQkJCW1lID0gKERlc2NyaWJhYmxlRWxlbWVudClDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZShtZSwgZiwgcik7Ci0JCQkJCWlmICggbWUgPT0gbnVsbCApIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9IGVsc2UgaWYgKG9sZE1lID09IG1lKSB7Ci0JCQkJCQltZSA9IG9sZE1lLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsJCQkJCQkKLQkJCQkJfQkJCQkJCi0JCQkJCQotCQkJCQluYW1lID0gKChEZXNjcmliYWJsZUVsZW1lbnQpbWUpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQkJCi0JCQkJfSB3aGlsZSAoIFN0clV0aWwuaXNCbGFuayhuYW1lKSApOwotCQkJfQotCQl9IAotCQkKLQkJaWYgKCBTdHJVdGlsLmlzQmxhbmsobmFtZSkgKSB7Ci0JCQluYW1lID0gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB2YXJpYWJpbGl0eSBlbGVtZW50IG93bmVyLiBJZiB0aGUgZWxlbWVudCBpcyBhCi0JICogVmFyaWFiaWxpdHlFbGVtZW50LCByZXR1cm4gaXRzZWxmIG90aGVyd2lzZSwgZmluZCBpdCdzIG93bmVyLiBGb3IKLQkgKiBleGFtcGxlLCBhIENvbnRlbnREZXNjcmlvdGlvbiBvYmplY3QgaXMgb3duZXJlZCBieSBhIFZhcmlhYmlsaXR5RWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBWYXJpYWJpbGl0eUVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhcmlhYmlsaXR5RWxlbWVudCBnZXRWYXJpYWJsZU93bmVyKE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJcmV0dXJuIChWYXJpYWJpbGl0eUVsZW1lbnQpIGU7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJLy8gcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldE93bmVyKCAoQ29udGVudERlc2NyaXB0aW9uKWUgKTsKLQkJCUVPYmplY3QgZU9iaiA9IGUuZUNvbnRhaW5lcigpOwotCQkJaWYgKGVPYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKFZhcmlhYmlsaXR5RWxlbWVudCkgZU9iajsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBmZWF0dXJlIHZhbHVlIGlzIG1lcmdhYmxlIG9yIG5vdAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWVyZ2FibGVBdHRyaWJ1dGUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJaWYgKCFmZWF0dXJlLmdldEVUeXBlKCkuZ2V0SW5zdGFuY2VDbGFzc05hbWUoKS5lcXVhbHMoCi0JCQkJImphdmEubGFuZy5TdHJpbmciKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBmZWF0dXJlIGlkIGlzIG5vdCBnbG9iYWxseSB1bmlxdWUsIGNhbid0IGRvIGEgc3dpdGNoIGhlcmUKLQkJLy8gY29tcGFyZSB0aGUgYWN0dXJlIGZlYXRydWUgaW5zdGVhZAotCQkvKgotCQkgKiBzd2l0Y2ggKCBmZWF0dXJlLmdldEZlYXR1cmVJRCgpICkgeyBjYXNlCi0JCSAqIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0dVSUQ6IGNhc2UKLQkJICogVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTkFNRToKLQkJICogQ29udHJpYnV0aW5nIGEgVW5pcXVlIElEIGZvciB3b3JrIHByb2R1Y3QgcmVuZGVycwotCQkgKiBiYWQgaHRtbCAvLyBkb24ndCBtZXJnZSBVbmlxdWUgSUQ6IGNhc2UKLQkJICogVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOiByZXR1cm4gZmFsc2U7IH0KLQkJICovCi0KLQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCkKLQkJCQl8fCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkKLQkJCQl8fCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKSAKLQkJCQl8fCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBpcyBhdHRyaWJ1dGUgZmVhdHVyZSB2YWx1ZT8KLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F0dHJpYnV0ZUZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIChmZWF0dXJlLmdldEVUeXBlKCkgaW5zdGFuY2VvZiBFQXR0cmlidXRlKTsKLQl9Ci0JCi0JLyoqCi0JICogaXMgdGhpcyBhIHRvLW9uZSBmZWF0dXJlPwotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzMDFGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiAoZmVhdHVyZS5nZXRFVHlwZSgpIGluc3RhbmNlb2YgRUNsYXNzKSAmJiAhZmVhdHVyZS5pc01hbnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBpcyB0aGlzIGEgdG8tbWFueSBmZWF0dXJlPwotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzMG5GZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiAoZmVhdHVyZS5nZXRFVHlwZSgpIGluc3RhbmNlb2YgRUNsYXNzKSAmJiBmZWF0dXJlLmlzTWFueSgpOwotCX0KLQotCQotCS8qKgotCSAqIGNhbGN1bGF0ZSB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50IGFuZCBmZWF0dXJlCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICogICAgICAgICAgICBUaGUgTGlzdCBvZiB2YWx1ZXMgb2YgdGhlIGZlYXR1cmUuIGlmIHRoZSBmZWF0dXJlIGlzIGEgMC4uMQotCSAqICAgICAgICAgICAgYXNzb2NpYXRpb24sIHRoZSBMaXN0IGhvbGRzIGEgc2luZ2xlIHZhbHVlIGlmIGFueSBmb3IKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUsIGl0J3MgYSBsaXN0IG9mIHJlZmVyZW5jZXMgZm9yCi0JICogICAgICAgICAgICBhdHRyaWJ1dGUgZmVhdHVyZSwgaXQncyBhIGxpc3Qgb2YgYXR0cmlidXRlIHZhbHVlcyB0byBiZQotCSAqICAgICAgICAgICAgbWVyZ2VyZWQgZm9yIDAuLjEgYXNzb2NpYXRpb24sIHRoZSBsaXN0IG1heSBjb250YWluIDEgdmFsdWUuCi0JICovCi0vLwlwcml2YXRlIHN0YXRpYyB2b2lkIGNhbGN1bGF0ZUZlYXR1cmUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotLy8JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0vLwkJCUxpc3QgdmFsdWVzLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLS8vCQljYWxjdWxhdGVGZWF0dXJlKGVsZW1lbnQsIG51bGwsIGZlYXR1cmUsIGNvbmZpZywgdmFsdWVzLCByZWFsaXplcik7Ci0vLwl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNhbGN1bGF0ZUZlYXR1cmUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kRWxlbWVudCBPd25lckVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIEZlYXR1cmVWYWx1ZSB2YWx1ZXMsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQkKLQkJLy8gbWFrZSBzdXJlIHRoaXMgaXMgYSB2YWxpZCBmZWF0dXJlIAotCQkvLyBmb3IgZXhhbXBsZSwgaWYgYW4gYWN0aXZpdHkgY29udHJpYnV0ZXMgdG8gYSBDYXBhYmlsaXR5IFBhdHRlcm4sCi0JCS8vIHNvbWUgQ2FwYWJpbGl0eVBhdHRlcm4gc3BlY2lmaWMgZmVhdHVyZSBtYXkgbm90IGJlIGEgdmFsaWQgZmVhdHVyZSBmb3IgdGhlIEFjdGl2aXR5Ci0vLwkJTGlzdCBmZWF0dXJlcyA9IGVsZW1lbnQuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoZWxlbWVudCk7Ci0JCWlmICggIWZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBFQ2xhc3NpZmllciB0eXBlID0gZmVhdHVyZS5nZXRFVHlwZSgpOwotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBnZXRWYXJpYWJsZU93bmVyKChPd25lckVsZW1lbnQgPT0gbnVsbCkgPyBlbGVtZW50Ci0JCQkJOiBPd25lckVsZW1lbnQpOwotCi0JCU9iamVjdCB2YWx1ZSA9IHJlYWxpemVyID09IG51bGwgPyBlbGVtZW50LmVHZXQoZmVhdHVyZSkgOgotCQkJCQkJCXJlYWxpemVyLmVHZXQoZWxlbWVudCwgZmVhdHVyZSk7Ci0KLQkJdmFsdWVzLmFkZCh2ZSwgdmFsdWUpOwotCi0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gcmVhbGl6ZSB0aGUgdmFyaWFiaWxpdHkgcmVsYXRpb25zaGlwCi0JCWlmICh2ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIGFjY29yZGluZyB0byBQZXRlciwgdGhlIHJlYWxpemF0aW9uIHNob3VsZCBiZSBhbHdheXMgdG9wIGRvd24uCi0JCS8vIGkuZSByZWFsaXplIHRoZSBiYXNlIGZpcnN0LCB0aGVuIGluY2x1ZGUgdGhlIGNvbnRyaWJ1dGlvbnMKLQkJX19tZXJnZUJhc2UoZWxlbWVudCwgdmUsIGZlYXR1cmUsIGNvbmZpZywgdmFsdWVzLCByZWFsaXplcik7CQotCQkKLQkJaWYgKCFpczAxRmVhdHVyZShmZWF0dXJlKSB8fCAodmFsdWVzLnNpemUoKSA9PSAwKSApIHsKLQkJCV9fbWVyZ2VDb250cmlidXRvcnMoZWxlbWVudCwgdmUsIGZlYXR1cmUsIGNvbmZpZywgdmFsdWVzLCByZWFsaXplcik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBfX21lcmdlQmFzZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIEZlYXR1cmVWYWx1ZSB2YWx1ZXMsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQotCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBhbiBleHRlbmRlZCBlbGVtZW50LCBnZXQgdGhlIGJhc2UgZWxlbWVudCdzCi0JCS8vIHByb3BlcnRpZXMgaWYgbmVlZGVkCi0JCWJvb2xlYW4gZXh0ZW5kUmVwbGFjZSA9IGlzRXh0ZW5kUmVwbGFjZXIodmUpIHx8IAotCQkJCUVsZW1lbnRSZWFsaXplci5pc0V4dGVuZFJlcGxhY2VFbmFibGVkKCkgJiYgaXNSZXBsYWNlcih2ZSk7Ci0JCWJvb2xlYW4gaXNFeHRlbmRlciA9IGlzRXh0ZW5kZXIodmUpOwotCQkKLQkJaWYgKGlzRXh0ZW5kZXIgfHwgZXh0ZW5kUmVwbGFjZSkgewotCQkJYm9vbGVhbiBtZXJnZWJhc2UgPSBmYWxzZTsKLQkJCWlmIChpczBuRmVhdHVyZShmZWF0dXJlKSkgewotCQkJCW1lcmdlYmFzZSA9IHRydWU7Ci0JCQkJaWYgKCBleHRlbmRSZXBsYWNlIAotCQkJCQkJfHwgaXNFeHRlbmRlciAmJiBFbGVtZW50UmVhbGl6ZXIuaWdub3JlQmFzZVRvTWFueUFzc29jaWF0aW9ucygpKSB7Ci0JCQkJCW1lcmdlYmFzZSA9ICh2YWx1ZXMuc2l6ZSgpID09IDApOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoaXMwMUZlYXR1cmUoZmVhdHVyZSkpIHsKLQkJCQltZXJnZWJhc2UgPSAodmFsdWVzLnNpemUoKSA9PSAwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWVyZ2ViYXNlID0gKGlzTWVyZ2FibGVBdHRyaWJ1dGUoZmVhdHVyZSkgJiYgKHZhbHVlcy5zaXplKCkgPT0gMCkpOwotCQkJfQotCi0JCQlpZiAobWVyZ2ViYXNlKSB7Ci0JCQkJLy8gQXV0aG9yaW5nOiBFeHRlbmRpbmcgYSBiYXNlIHRoYXQgaGFzIGJlZW4KLQkJCQkvLyByZXBsYWNlZCwgZG9lcyBub3QgZXh0ZW5kIHRoZSByZXBsYWNlbWVudAotCQkJCS8vIG5lZWQgdG8gZ2V0IHRoZSByZWFsaXplZCBlbGVtZW50LAotCQkJCS8vIHRoZSBiYXNlIGVsZW1lbnQgbWlnaHQgYmUgcmVwbGFjZWQgYnkgYW5vdGhlciBvbmUsCi0JCQkJLy8gb3IgbWlnaHQgYmUgYSBjb250cmlidXRvciB0byBhbm90aGVyIGJhc2UKLQkJCQlNZXRob2RFbGVtZW50IGUgPSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJaWYgKCAhZXh0ZW5kUmVwbGFjZSApIHsKLQkJCQkJZT0gZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoZSwgY29uZmlnKTsKLQkJCQl9CQkJCQkKLQkJCQlNZXRob2RFbGVtZW50IG8gPSBlOwotCi0JCQkJLy8gaWYgaXQncyBhIGNvbnRhaW5tZW50IGZlYXR1cmUsIHN1Y2ggYXMgc3ViLWFydGlmYWN0cwotCQkJCS8vIHRoZSBiYXNlIHNob3VsZCBub3QgYmUgdGhlIGNvbnRhaW5lcgotCQkJCS8vIDE2MjE1NCAtIENoZWNrIGNpcmN1bGFyIHJlZmVyZW5jZXMgd2l0aCBwYXJlbnQtL3N1Yi1hcnRpZmFjdHMgYW5kIHByYWN0aWNlcy9zdWItcHJhY3RpY2VzCQkJCQotCQkJCWlmICggaXNDb250YWlubWVudEZlYXR1cmUoZmVhdHVyZSkgKSB7Ci0JCQkJCUxpc3QgY29udGFpbmVycyA9IGdldENvbnRhaW5lcnModmUsIGNvbmZpZyk7Ci0JCQkJCWlmIChjb250YWluZXJzLmNvbnRhaW5zKGUpICkgewotCQkJCQkJbWVyZ2ViYXNlID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAobWVyZ2ViYXNlICYmICh2ZSAhPSBlKSAmJiBpbkNvbmZpZyhlLCBjb25maWcpKSB7Ci0JCQkJCS8vIGlmIHRoZSBjdXJyZW50IGVsZW1lbnQgaXMgYSBkZXNjcmlwdGlvbiwKLQkJCQkJLy8gZ2V0IHRoZSB0aGUgZGVzY3JpcHRpb24gb2JqZWN0IG9mIHRoZSBiYXNlCi0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgZSkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLQkJCQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWNhbGN1bGF0ZUZlYXR1cmUoZSwgbywgZmVhdHVyZSwgY29uZmlnLCB2YWx1ZXMsIHJlYWxpemVyKTsKLQotCQkJCQkvLyBmb3IgZXh0ZW5kZXIsIHdlIG5lZWQgdG8gcmUtc29ydCB0aGUgc3RlcHMgYmFzZWQgb24gdGhlCi0JCQkJCS8vIGV4dGVuZGVyIGRlZmluZWQgb3JkZXIKLQkJCQkJaWYgKCh2ZSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KQotCQkJCQkJCSYmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCkpKSB7Ci0JCQkJCQlvcmRlclNlY3Rpb25zKChDb250ZW50RWxlbWVudCkgdmUsIChMaXN0KXZhbHVlcy5nZXRWYWx1ZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgX19tZXJnZUNvbnRyaWJ1dG9ycyhNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIEZlYXR1cmVWYWx1ZSB2YWx1ZXMsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlib29sZWFuIG1lcmdlYWJsZSA9IHRydWU7Ci0JCWlmICggaXNBdHRyaWJ1dGVGZWF0dXJlKGZlYXR1cmUpICYmICFpc01lcmdhYmxlQXR0cmlidXRlKGZlYXR1cmUpICkgewotCQkJbWVyZ2VhYmxlID0gZmFsc2U7Ci0JCX0gCi0JCQotCQlpZiAoIG1lcmdlYWJsZSApIHsKLQkJCS8vIGlmIHRoZSBlbGVtZW50IGhhcyBjb250cmlidXRvcnMgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIGdldCB0aGUKLQkJCS8vIHJlZmVyZW5jZSBwcm9wZXJ0aWVzCi0JCQkvLyBpZiBhIGNvbnRyaWJ1dG9yIGhhcyByZXBsYWNlciwgaXQncyByZXBsYWNlciBpcyB1c2VkCi0JCQlMaXN0IGl0ZW1zID0gZ2V0Q29udHJpYnV0b3JzKHZlLCBjb25maWcpOwotCQkJaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgbyA9IGU7ICAvLyB0aGUgb3duZXIKLQotCQkJCQkvLyBpZiB0aGUgY3VycmVudCBlbGVtZW50IGlzIGEgZGVzY3JpcHRpb24sCi0JCQkJCS8vIGdldCB0aGUgdGhlIGRlc2NyaXB0aW9uIG9iamVjdCBvZiB0aGUgY29udHJpYnV0b3IKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCQkJCWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgZSkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQkJCX0KLQkJCQkJY2FsY3VsYXRlRmVhdHVyZShlLCBvLCBmZWF0dXJlLCBjb25maWcsIHZhbHVlcywgcmVhbGl6ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JLyoqCi0JICogY2FsY3VsYXRlIHRoZSByZWZsaXN0IGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYW5kIE9wcG9zaXRlRmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIE9wcG9zaXRlRmVhdHVyZQotCSAqIEBwYXJhbSByZWFsaXplciBFbGVtZW50UmVhbGl6ZXIKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICogICAgICAgICAgICBUaGUgTGlzdCBvZiB2YWx1ZXMgb2YgdGhlIGZlYXR1cmUuIGZvciByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLAotCSAqICAgICAgICAgICAgaXQncyBhIGxpc3Qgb2YgcmVmZXJlbmNlcyBmb3IgYXR0cmlidXRlIGZlYXR1cmUsIGl0J3MgYSBsaXN0Ci0JICogICAgICAgICAgICBvZiBhdHRyaWJ1dGUgdmFsdWVzIHRvIGJlIG1lcmdlcmVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYWxjdWxhdGVPcHBvc2l0ZUZlYXR1cmUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplciwgRmVhdHVyZVZhbHVlIHZhbHVlcykgewotCQljYWxjdWxhdGVPcHBvc2l0ZUZlYXR1cmUoZWxlbWVudCwgZmVhdHVyZSwgdHJ1ZSwgZmFsc2UsIHJlYWxpemVyLCB2YWx1ZXMpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIHJlZmxpc3QgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBhbmQgT3Bwb3NpdGVGZWF0dXJlCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgT3Bwb3NpdGVGZWF0dXJlCi0JICogQHBhcmFtIHJlYWxpemVyIEVsZW1lbnRSZWFsaXplcgotCSAqIEBwYXJhbSB2YWx1ZXMKLQkgKiAgICAgICAgICAgIFRoZSBMaXN0IG9mIHZhbHVlcyBvZiB0aGUgZmVhdHVyZS4gZm9yIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUsCi0JICogICAgICAgICAgICBpdCdzIGEgbGlzdCBvZiByZWZlcmVuY2VzIGZvciBhdHRyaWJ1dGUgZmVhdHVyZSwgaXQncyBhIGxpc3QKLQkgKiAgICAgICAgICAgIG9mIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gYmUgbWVyZ2VyZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNhbGN1bGF0ZU9wcG9zaXRlRmVhdHVyZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgYm9vbGVhbiBtZXJnZVJlcGxhY2VyQmFzZSwgYm9vbGVhbiBtZXJnZUV4dGVuZGVyQmFzZSwgCi0JCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIsIEZlYXR1cmVWYWx1ZSB2YWx1ZXMpIHsKLQkJLy8gbXVzdCBiZSBhIE11bHRpUmVzb3VyY2VFT2JqZWN0Ci0JCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBNdWx0aVJlc291cmNlRU9iamVjdCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gcmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpOwotCi0JCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGdldFZhcmlhYmxlT3duZXIoZWxlbWVudCk7Ci0KLQkJT2JqZWN0IHZhbHVlID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoZmVhdHVyZSk7Ci0JCXZhbHVlcy5hZGQodmUsIHZhbHVlKTsKLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCAmJiBjb25maWcgIT0gbnVsbCkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGNlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudDsKLQotCQkJLy8gaWYgdGhlIGVsZW1lbnQgaGFzIGNvbnRyaWJ1dG9ycyBpbiB0aGUgY29uZmlndXJhdGlvbiwgZ2V0IHRoZQotCQkJLy8gcmVmZXJlbmNlIHByb3BlcnRpZXMKLQkJCUxpc3QgaXRlbXMgPSBnZXRDb250cmlidXRvcnMoY2UsIGNvbmZpZyk7Ci0JCQlpZiAoaXRlbXMgIT0gbnVsbCAmJiBpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQkJY2FsY3VsYXRlT3Bwb3NpdGVGZWF0dXJlKGUsIGZlYXR1cmUsIG1lcmdlUmVwbGFjZXJCYXNlLCBtZXJnZUV4dGVuZGVyQmFzZSwgcmVhbGl6ZXIsIHZhbHVlcyk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBhIHJlcGxhY2VyIG9mIGEgYmFzZSBlbGVtZW50LCAKLQkJCS8vIGdldCB0aGUgYmFzZSBlbGVtZW50J3MgcHJvcGVydGllcwotCQkJLy8gb25seSBjb3ZlciAwMSBvciAwbSByZWZlcmVuY2VzCi0JCQkvLyBhdHRyaWJ1dGVzIGNhbid0IGJlIG9wcG9zaXRlIGZlYXR1cmUKLQotCQkJLy8gcmVwbGFjZWQgZWxlbWVudCBkb2VzIG5vdCBzaG93IGluY29taW5nCi0JCQkvLyByZWxhdGlvbnNoaXBzCi0JCQkvLyBpbWNvbWluZyByZWxhdGlvbnNoaXBzIGFyZSByZXByZXNlbnRlZCBieSBvcHBvc2l0ZSBmZWF0dXJlCi0JCQkvLyBzbyBrZWVwIHRoZSByZWZlcmVuY2VzIHRvIHRoZSBiYXNlIGVsZW1lbnQKLQkJCQotCQkJLy8gSW5jb25zaXN0ZW5jeSBiZXR3ZWVuIFB1Ymxpc2hlZCBXb3JrIFByb2R1Y3Q6IFdvcmtsb2FkIEFuYWx5c2lzIFBhZ2UgYW5kIFJlZmVyZW5jZWQgUGFnZXMKLQkJCS8vIHRoaXMgaXMgZnJvbSB0aGUgYmFzZSBvZiB0aGUgZXh0ZW5kZXIuIAotCQkJLy8gaW5jb21pbmcgYXNzb2NpYXRpb25zIGZyb20gdGhlIGJhc2Ugc2hvdWxkIGJlIGRpc2NhcmRlZCBmb3IgZXh0ZW5kZXJzCi0JCQlib29sZWFuIG1lcmdlYmFzZSA9IGZhbHNlOwotCQkJYm9vbGVhbiBpc0V4dGVuZGVyID0gaXNFeHRlbmRlcihjZSk7Ci0JCQlib29sZWFuIGlzUmVwbGFjZXIgPSBpc1JlcGxhY2VyKGNlKTsKLQkJCWJvb2xlYW4gaXNFeHRlbmRSZXBsYWNlciA9IGlzRXh0ZW5kUmVwbGFjZXIoY2UpIHx8IAotCQkJCUVsZW1lbnRSZWFsaXplci5pc0V4dGVuZFJlcGxhY2VFbmFibGVkKCkgJiYgaXNSZXBsYWNlcjsKLQkJCQotLy8JCQkvL1RoaXMgaXMgYSBjb25zZXJ2YXRpdmUgZml4IGZvciAiRXh0ZW5kcy1yZXBsYWNlIGRpc3BsaW5lIHJlbmRlcmVkIHdyb25nIGluIGNvbmYgdHJlZSB2aWV3IgotLy8JCQlpZiAoaXNFeHRlbmRSZXBsYWNlcihjZSkgJiYgIHJlYWxpemVyLmdldENsYXNzKCkgPT0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5jbGFzcykgewotLy8JCQkJaWYgKGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuRGlzY2lwbGluZV9EaXNjaXBsaW5lR3JvdXBpbmdzKSB7Ci0vLwkJCQkJaXNSZXBsYWNlciA9IHRydWU7Ci0vLwkJCQl9Ci0vLwkJCQlpZiAoZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlU2V0X1JvbGVTZXRHcm91cHBpbmdzKSB7Ci0vLwkJCQkJaXNSZXBsYWNlciA9IHRydWU7Ci0vLwkJCQl9CQkJCQotLy8JCQl9Ci0JCQkKLQkJCS8vIGV4dGVuZGVyUmVwbGFjZXIgYmVoYXZlcyBsaWtlIHJlcGxhY2VyIHdoZW4gcmVhbGl6aW5nIGluY29taW5nIGFzc29jaWF0aW9ucwotCQkJLy8gQnVnIDE5OTY5NCAtIEV4dGVuZHMtUmVwbGFjZSBpZ25vcmVzIGluY29taW5nIHJlbGF0aW9uc2hpcHMgb2YgY29udHJpYnV0ZXIKLQkJCWlmICggaXNFeHRlbmRSZXBsYWNlciApIHsKLQkJCQlpc1JlcGxhY2VyID0gdHJ1ZTsKLQkJCX0KLQkJCQotCQkJaWYgKGlzUmVwbGFjZXIpIHsKLQkJCQltZXJnZWJhc2UgPSBtZXJnZVJlcGxhY2VyQmFzZSAmJiAoKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgfHwgKHZhbHVlcy5zaXplKCkgPT0gMCkpOwotCQkJfSBlbHNlIGlmIChpc0V4dGVuZGVyKSB7Ci0JCQkJbWVyZ2ViYXNlID0gbWVyZ2VFeHRlbmRlckJhc2U7Ci0JCQl9Ci0KLQkJCWlmIChtZXJnZWJhc2UpIHsKLQkJCQkvLyByZXNvbHZlIHRoZSBiYXNlIGNvbnRyaWJ1dG9yIHRvIHRoZSBiYXNlIGlmIGkgYW0gbm90IGEKLQkJCQkvLyByZXBsYWNlcgotCQkJCS8vIGRvbid0IHJlc29sdmUgdGhlIGNvbnRyaWJ1dG9ycyB0byB0aGUgYmFzZSBpZiBpIGFtIGEKLQkJCQkvLyByZXBsYWNlciwKLQkJCQkvLyB0aGUgY2FsbCBpcyBjb21pbmcgZnJvbSB0aGUgYmFzZS4gU28gaWYgcmVzb2x2ZSB0byBiYXNlIGFnYWluCi0JCQkJLy8gd2lsbCBjYXVzZSBkZWFkbG9jay4KLQkJCQkvLyBkb24ndCByZXNvbHZlIHRvIHRoZSByZXBsYWNlciBzaW5jZSB3ZSBuZWVkIHRvIGNhcnJ5IGRvd24gYWxsCi0JCQkJLy8gdGhlIGluY29taW5nIDBuIGFzc29jaWF0aW9ucyBmcm9tIGJhc2UKLQkJCQkvLyBhY3R1YWxseSBzaG91bGQgcmVzb2x2ZSB0byByZXBsYWNlciBpZiBpIGFtIG5vdCBhIHJlcGxhY2VyCi0JCQkJLy8gKGkuZS4gaSBhbSBhbiBlbnRlbmRlcikKLQkJCQkvLyB0aGlzIGhhbmRsZXMgdGhlIHNlbmFyaW86IEcyIHJlcGxhY2VzIEcxIGFuZCBHMyBleHRlbmRzIEcxCi0JCQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyMiA9IAotCQkJCQlEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcsICghaXNSZXBsYWNlciksICghaXNSZXBsYWNlcikpOwotCi0JCQkJTWV0aG9kRWxlbWVudCBlID0gZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoY2UKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksIHJlYWxpemVyMik7Ci0JCQkJCi0JCQkJLy8gaWYgdGhlIGJhc2UgZWxlbWVudCByZXNvbHZlZCB0byBudWxsLCAKLQkJCQkvLyB0aGlzIGlzIGJlY2F1c2UgY2FuU2hvdygpIGRvbid0IGFsbG93IHJlcGxhY2VkIGVsZW1lbnQgdG8gc2hvdy4KLQkJCQkvLyB3ZSBkb24ndCB3YW50IHRvIHRha2UgdGhlIHJpc2sgdG8gZml4IEVsZW1lbnRSZWFsaXplcgotCQkJCS8vIHNvIGZpeCBoZXJlIHNpbmNlIDcuMC4xX2lmaXgxLCAKLQkJCQkvLyBKaW5odWEgWGksIDQvMTcvMDYKLQkJCQlpZiAoIGUgPT0gbnVsbCApIHsKLQkJCQkJZSA9IGNlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKChlICE9IGNlKSAmJiBpbkNvbmZpZyhlLCBjb25maWcpKSB7Ci0JCQkJCWNhbGN1bGF0ZU9wcG9zaXRlRmVhdHVyZShlLCBmZWF0dXJlLCBtZXJnZVJlcGxhY2VyQmFzZSwgbWVyZ2VFeHRlbmRlckJhc2UsIHJlYWxpemVyLCB2YWx1ZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGNhbGN1bGF0ZSB0aGUgZWxlbWVudHMgaW4gdGhlIGxpc3QsIGFuZCByZXR1cm5zIGEgbmV3IGxpc3Qgb2YgdW5pcXVlCi0JICogZWxlbWVudHMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldENhbGN1bGF0ZWRFbGVtZW50cyhMaXN0IGVsZW1lbnRzLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJcmV0dXJuIGdldENhbGN1bGF0ZWRFbGVtZW50cyhlbGVtZW50cywgRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKSApOwotCX0KLQkKLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIGVsZW1lbnRzIGluIHRoZSBsaXN0LCBhbmQgcmV0dXJucyBhIG5ldyBsaXN0IG9mIHVuaXF1ZQotCSAqIGVsZW1lbnRzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHBhcmFtIHJlYWxpemVyIEVsZW1lbnRSZWFsaXplcgotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDYWxjdWxhdGVkRWxlbWVudHMoTGlzdCBlbGVtZW50cywgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyICkgewotCQkvLyBjYWxjdWxhdGUgZWFjaCBlbGVtZW50IGluIHRoZSBsaXN0IGFuZCByZXR1cm4gYSBuZXcgbGlzdCBvZiBlbGVtZW50cwotCQlMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQllID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChlLCByZWFsaXplcik7Ci0JCQlpZiAoKGUgIT0gbnVsbCkgJiYgKCF2YWx1ZXMuY29udGFpbnMoZSkpKSB7Ci0JCQkJdmFsdWVzLmFkZChlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogY2FsY3VsYXRlIHRoZSBlbGVtZW50IGJhc2VkIG9uIHRsZSBjb25maWd1cmF0aW9uLiBJZiBub3RoaW5nIGNhbiBiZQotCSAqIHNob3duLCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldENhbGN1bGF0ZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZywgdHJ1ZSwgdHJ1ZSk7Ci0KLQkJcmV0dXJuIGdldENhbGN1bGF0ZWRFbGVtZW50KGVsZW1lbnQsIHJlYWxpemVyKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldENhbGN1bGF0ZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCUVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCi0JCU1ldGhvZEVsZW1lbnQgZSA9IGVsZW1lbnQ7Ci0JCU1ldGhvZEVsZW1lbnQgZTI7Ci0JCXdoaWxlICgoZTIgPSByZWFsaXplci5yZWFsaXplKGUpKSAhPSBlKSB7Ci0JCQllID0gZTI7Ci0JCX0KLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBjYWxjdWxhdGVkIDAuLjEgZmVhdHVyZSB2YWx1ZSBvZiB0aGUgc3BlY2lwaWVkIGVsZW1lbnQgYW5kCi0JICogZmVhdHVyZQotCSAqIAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBjYWxjMDFGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlyZXR1cm4gY2FsYzAxRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG51bGwsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBjYWxjdWxhdGVkIDAuLjEgZmVhdHVyZSB2YWx1ZSBvZiB0aGUgc3BlY2lwaWVkIGVsZW1lbnQgYW5kCi0JICogZmVhdHVyZQotCSAqIAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBjYWxjMDFGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBNZXRob2RFbGVtZW50IG93bmVyRWxlbWVudCwgCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCS8vIHByZXNlbnRhdGlvbiBvYmplY3QgZmVhdHVyZSBzaG91bGQgbmV2ZXIgYmUgcmVhbGl6ZWQuIGFsd2F5cyBrZWVwCi0JCS8vIGl0J3Mgb3duIHZhbHVlCi0JCU9iamVjdCB2ID0gZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQlpZiAodiBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJcmV0dXJuIChNZXRob2RFbGVtZW50KSB2OwotCQl9Ci0KLQkJVG9PbmVGZWF0dXJlVmFsdWUgdmFsdWVzID0gbmV3IFRvT25lRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQljYWxjdWxhdGVGZWF0dXJlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwgcmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpLCB2YWx1ZXMsIHJlYWxpemVyKTsKLS8vCQlpZiAodmFsdWVzLnNpemUoKSA+IDApIHsKLS8vCQkJdiA9IChNZXRob2RFbGVtZW50KSB2YWx1ZXMuZ2V0KDApOwotLy8JCQlpZiAodiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLS8vCQkJCXJldHVybiBnZXRDYWxjdWxhdGVkRWxlbWVudCgoTWV0aG9kRWxlbWVudCkgdiwgcmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLS8vCQkJfQotLy8JCX0KLQotCQlyZXR1cm4gKE1ldGhvZEVsZW1lbnQpdmFsdWVzLmdldFZhbHVlKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBpcyB0aGlzIGZlYXR1cmUgZm9yIGNvbnRhaW5kIGNoaWxkcmVuPyBzdWNoIGFzIGFydGlmYWN0J3MgY29udGFpbmVkIGFydGlmYWN0LgotCSAqIEBwYXJhbSBmZWF0dXJlIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRhaW5tZW50RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKQotCQkJCXx8IGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGVsZW1lbnQgYWxsb3cgY29udGFpbmVkIGVsZW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRhaW5tZW50RWxlbWVudChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZWxlbWVudCBpbnN0YW5jZW9mIEFydGlmYWN0IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBQcmFjdGljZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0IGdldENvbnRhaW5lcnMoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlFT2JqZWN0IG8gPSBlbGVtZW50OwotCQl3aGlsZSAoKG8gIT0gbnVsbCkgJiYgKChvID0gby5lQ29udGFpbmVyKCkpICE9IG51bGwpCi0JCQkJJiYgby5nZXRDbGFzcygpLmlzSW5zdGFuY2UoZWxlbWVudCkpIHsKLQkJCWlmIChvIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJbyA9IGdldENhbGN1bGF0ZWRFbGVtZW50KChWYXJpYWJpbGl0eUVsZW1lbnQpIG8sIGNvbmZpZyk7Ci0JCQl9Ci0KLQkJCWlmICgobyAhPSBudWxsKSAmJiAhaXRlbXMuY29udGFpbnMobykpIHsKLQkJCQlpdGVtcy5hZGQobyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSAwMSBvcHBvc2l0ZSBmZWF0dXJlIChpZiBhbnkpIGZvciB0aGUgZ2l2ZW4gZmVhdHVyZS4gcmV0dXJucyBudWxsCi0JICogaWYgbm8gc3VjaCBmZWF0dXJlCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIEByZXR1cm4gT3Bwb3NpdGVGZWF0dXJlIHRoZSAwMSBvcHBvc2l0ZSBmZWF0dXJlIG9mIHRoZSBnaXZlbiBmZWF0dXJlLAotCSAqICAgICAgICAgbnVsbCBpZiBubyBzdWNoIHRoaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBPcHBvc2l0ZUZlYXR1cmUgZ2V0MDFPcHBvc2l0ZUZlYXR1cmUoCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQkKLQkJLy8gc2luY2UgMS4wbTQsIHRoZXNlIGFyZSBub3QgMDEgZmVhdHVyZSBhbnkgbW9yZQotLy8JCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfVGFza3MoKSkgewotLy8JCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuVGFza19EaXNjaXBsaW5lOwotLy8JCX0gZWxzZSBpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkpIHsKLS8vCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZTsKLS8vCQl9Ci0JCQotLy8JCWlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW5fV29ya1Byb2R1Y3RzKCkgKSB7Ci0vLwkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9Eb21haW5zOwotLy8JCX0gCi0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIGdldCB0aGUgdGFyZ2V0IGZlYXR1cmUgZm9yIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIGlmIHRoZSB0YXJnZXQgZmVhdHVyZSBpcyBhIHRvLU9uZSBmZWF0dXJlLCAKLQkgKiBvdGhlcndpc2UsIHJldHVybiBudWxsLgotCSAqIEBwYXJhbSBvRmVhdHVyZQotCSAqIEByZXR1cm4gRVN0cnVjdHVyYWxGZWF0dXJlCi0JICovCi0JcHVibGljIHN0YXRpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0MDFGZWF0dXJlKE9wcG9zaXRlRmVhdHVyZSBvRmVhdHVyZSkgewkJCi0vKgkJaWYgKCBvRmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1ByaW1hcnlfVGFza3MgCi0JCQkJfHwgb0ZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfUHJpbWFyeVRhc2tEZXNjcmlwdG9ycyApIHsKLQkJCXJldHVybiBvRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCk7Ci0JCX0qLwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgY2FsY3VsYXRlZCAwLi5uIGZlYXR1cmUgdmFsdWUgb2YgdGhlIHNwZWNpcGllZCBlbGVtZW50LCBpdCdzCi0JICogb3duZXIgZWxlbWVudCBhbmQgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IHtAbGluayBNZXRob2RFbGVtZW50fQotCSAqIEBwYXJhbSBmZWF0dXJlIHtAbGluayBFU3RydWN0dXJhbEZlYXR1cmV9Ci0JICogQHBhcmFtIHJlYWxpemVyIHtAbGluayBFbGVtZW50UmVhbGl6ZXJ9Ci0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiB7QGxpbmsgTWV0aG9kRWxlbWVudH0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY2FsYzBuRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIAotCXsKLQkJcmV0dXJuIGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBudWxsLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgY2FsY3VsYXRlZCAwLi5uIGZlYXR1cmUgdmFsdWUgb2YgdGhlIHNwZWNpcGllZCBlbGVtZW50IGFuZAotCSAqIGZlYXR1cmUuIGlmIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIG9uIHRoZSBvdGhlciBlbmQgaXMgYSB0by1vbmUgZmVhdHVyZSwKLQkgKiB0aGUgZmVhdHVyZSB2YWx1ZSBpdGVtIGNhbid0IGJlIGluIHRoZSB2YWx1ZSBsaXN0IHVubGVzcyBpdCdzIG9wcG9zaXRlCi0JICogZmVhdHVyZSB2YWx1ZSBpcyB0aGUgY3VycmVudCBlbGVtZW50LiBGb3IgZXhhbXBsZSwgZm9yIGRpc2NpcGxpbmVfdGFza3MsCi0JICogdGhlIHRhc2tzIGNhbiBiZSBzZWxlY3RlZCBpZiBhbmQgT05MWSBpZiB0aGUgdGFzaydzIHRhc2tfZGlzY2lwbGluZQotCSAqIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUgaXMgdGhlIGN1cnJlbnQgZGlzY2lwbGluZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50IHtAbGluayBNZXRob2RFbGVtZW50fQotCSAqIEBwYXJhbSBmZWF0dXJlIHtAbGluayBFU3RydWN0dXJhbEZlYXR1cmV9Ci0JICogQHBhcmFtIHJlYWxpemVyIHtAbGluayBFbGVtZW50UmVhbGl6ZXJ9Ci0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiB7QGxpbmsgTWV0aG9kRWxlbWVudH0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY2FsYzBuRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQsIAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQkJCQotCQlMaXN0IHYgPSBudWxsOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHJlYWxpemVyLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCi0JCS8vIFdyb25nICJtb2RpZmllcyIgaW5mb3JtYXRpb24gcHVibGlzaGVkIGluIHRlYW0gYWxsb2NhdGlvbiB2aWV3IGZvciBzbWFsbCBjb25maWd1cmF0aW9uCi0JCS8vIG5lZWQgdG8gbWFudWFsbHkgY2FsY3VsYXRlIHRoZSBtb2RpZnkgZmVhdHVyZXMKLQkJLy8gY2FuJ3QgcmVseSBvbiB0aGUgdW1hIG1vZGVsIHNpbmNlIHRoYXQgaXMgbm90IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMuCi0JCS8vIHJvbGUgbW9kaWZpZXMgcHJvZHVjdCBtZWFuczoKLQkJLy8gcm9sZSBwZXJmb3JtcyBvbiB0YXNrcywgYW5kIHRhc2tzIHByb2R1Y2Ugd29ya3Byb2R1Y3RzIGFzIG91dHB1dAotCQkvLyBzbyBoYW5kbGUgdGhlc2Ugc2NlbmFyaW9zIGFzIHNwZWNpYWwgY2FzZXMKLQkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgUm9sZSAmJiBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfTW9kaWZpZXMoKSApIHsKLS8vCQkJTGlzdCB2MiA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJY2FsY3VsYXRlT3Bwb3NpdGVGZWF0dXJlKGVsZW1lbnQsIEFzc29jaWF0aW9uSGVscGVyLlJvbGVfUHJpbWFyeV9UYXNrcywgcmVhbGl6ZXIsIHYyKTsKLS8vCQkJaWYgKCB2Mi5zaXplKCkgPiAwICkgewotLy8JCQkJZm9yIChJdGVyYXRvciBpdCA9IHYyLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0vLwkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotLy8JCQkJCWNhbGN1bGF0ZUZlYXR1cmUoZSwgb3duZXJFbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpLCBjb25maWcsIHYsIHJlYWxpemVyKTsJCQkJCQotLy8JCQkJfQotLy8JCQl9CQotCQkJdiA9IGNhbGNNb2RpZmllZFdvcmtQcm9kdWN0cygoUm9sZSllbGVtZW50LCBvd25lckVsZW1lbnQsIHJlYWxpemVyKTsKLQkJfWVsc2UgaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IgJiYgZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9Nb2RpZmllcygpICkgewotLy8JCQlMaXN0IHYyID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQljYWxjdWxhdGVPcHBvc2l0ZUZlYXR1cmUoZWxlbWVudCwgQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfUHJpbWFyeVRhc2tEZXNjcmlwdG9ycywgcmVhbGl6ZXIsIHYyKTsKLS8vCQkJaWYgKCB2Mi5zaXplKCkgPiAwICkgewotLy8JCQkJZm9yIChJdGVyYXRvciBpdCA9IHYyLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0vLwkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotLy8JCQkJCWNhbGN1bGF0ZUZlYXR1cmUoZSwgb3duZXJFbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSwgY29uZmlnLCB2LCByZWFsaXplcik7CQkJCQkKLS8vCQkJCX0KLS8vCQkJfQotCQkJdiA9IGNhbGNNb2RpZmllZFdvcmtQcm9kdWN0RGVzY3JpcHRvcnMoKFJvbGVEZXNjcmlwdG9yKWVsZW1lbnQsIG93bmVyRWxlbWVudCwgcmVhbGl6ZXIpOwotCQl9IGVsc2UgewotCQkJVG9NYW55RmVhdHVyZVZhbHVlIGZ2ID0gbmV3IFRvTWFueUZlYXR1cmVWYWx1ZShlbGVtZW50LCBvd25lckVsZW1lbnQsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJCWNhbGN1bGF0ZUZlYXR1cmUoZWxlbWVudCwgb3duZXJFbGVtZW50LCBmZWF0dXJlLCBjb25maWcsIGZ2LCByZWFsaXplcik7Ci0JCQl2ID0gKExpc3QpZnYuZ2V0VmFsdWUoKTsKLQkJfQotCQkKLQkJTGlzdCB2YWx1ZXMgPSBnZXRDYWxjdWxhdGVkRWxlbWVudHModiwgcmVhbGl6ZXIpOwotCQlpZiAodmFsdWVzLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQl2YWx1ZXMucmVtb3ZlKGVsZW1lbnQpOwotCQl9Ci0KLQkJLy8gKiBpZiB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBvbiB0aGUgb3RoZXIgZW5kIGlzIGEgdG8tb25lIGZlYXR1cmUsCi0JCS8vICogdGhlIGZlYXR1cmUgdmFsdWUgaXRlbSBjYW4ndCBiZSBpbiB0aGUgdmFsdWUgbGlzdCB1bmxlc3MgaXQncwotCQkvLyBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlIGlzIHRoZSBjdXJyZW50IGVsZW1lbnQuCi0JCS8vICogRm9yIGV4YW1wbGUsIGZvciBkaXNjaXBsaW5lX3Rhc2tzLCB0aGUgdGFza3MgY2FuIGJlIHNlbGVjdGVkCi0JCS8vICogaWYgYW5kIE9OTFkgaWYgdGhlIHRhc2sncyB0YXNrX2Rpc2NpcGxpbmUgb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZSBpcwotCQkvLyB0aGUgY3VycmVudCBkaXNjaXBsaW5lCi0JCU9wcG9zaXRlRmVhdHVyZSBvZiA9IGdldDAxT3Bwb3NpdGVGZWF0dXJlKGZlYXR1cmUpOwotCQlpZiAob2YgIT0gbnVsbCkgewotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCB2YWx1ZXMuc2l6ZSgpKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBvID0gKE1ldGhvZEVsZW1lbnQpIHZhbHVlcy5nZXQoaSk7Ci0KLQkJCQkvLyBjYWxjdWxhdGUgaXQncyBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlLCB0aGUgdmFsdWUgbXVzdCBiZSB0aGUKLQkJCQkvLyBnaXZlbiBlbGVtZW50Ci0JCQkJLy8gb3RoZXJ3aXNlLCByZW1vdmUgaXQKLQkJCQkvLyBub3RlOiBkb24ndCB1c2UgdGhlIGN1cnJlbnQgcmVhbGl6ZXIKLQkJCQkvLyB1c2UgdGhlIGRlZmF1bHQgcmVhbGl6ZXIgc2luY2Ugd2UgbmVlZCB0byByZWFsaXplIHRoZSBlbGVtZW50IGluIHRoZSBkZWZhdWx0IHdheQotCQkJCS8vIDE1ODkyNCAtIHdyb25nIGNhdGVnb3JpZXMgaW4gY29uZmlndXJhdGlvbiB2aWV3Ci0KLQkJCQkKLQkJCQkvLyB3b3JrYXJvdW5kIHRvIGFsbG93IHNob3cvaGlkZSBzdWJ0cmFjdGVkIGVsZW1lbnRzCi0JCQkJRWxlbWVudFJlYWxpemVyIHIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkJCXIuc2V0U2hvd1N1YnRyYWN0ZWQocmVhbGl6ZXIuc2hvd1N1YnRyYWN0ZWQoKSk7Ci0JCQkJCi0JCQkJTWV0aG9kRWxlbWVudCBvbyA9IGNhbGMwMUZlYXR1cmVWYWx1ZShvLCBvZiwgcik7Ci0JCQkJaWYgKG9vICE9IGVsZW1lbnQpIHsKLQkJCQkJdmFsdWVzLnJlbW92ZShpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gY29udGFpbm1lbnQgZmVhdHVyZSB2YWx1ZSBzaG91bGQgbm90IGNvbnRhaW4gdGhlIG93bmVyIGVsZW1lbnQgb3IgaXRzCi0JCS8vIHBhcmVudHMKLQkJLy8gZm9yIGV4YW1wbGUsIGFydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0cyBzaG91bGQgbm90IGJlIHRoZSBhcnRpZmFjdAotCQkvLyBpdHNlbGYgb3IgaXRzIHBhcmVudHMKLQkJaWYgKGlzQ29udGFpbm1lbnRGZWF0dXJlKGZlYXR1cmUpKSB7Ci0JCQlMaXN0IGNvbnRhaW5lcnMgPSBnZXRDb250YWluZXJzKGVsZW1lbnQsIGNvbmZpZyk7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IHZhbHVlcy5zaXplKCkpIHsKLQkJCQlPYmplY3QgbyA9IChPYmplY3QpIHZhbHVlcy5nZXQoaSk7Ci0JCQkJaWYgKG8gPT0gZWxlbWVudCB8fCBjb250YWluZXJzLmNvbnRhaW5zKG8pKSB7Ci0JCQkJCXZhbHVlcy5yZW1vdmUoaSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJTGlzdCByZXR1cm5MaXN0ID0gcmVhbGl6ZXIucmVhbGl6ZShlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZXMpOwotCQlpZiAoQ2F0ZWdvcnlTb3J0SGVscGVyLm5lZWRUb1NvcnQoZWxlbWVudCwgZmVhdHVyZSkpIHsKLQkJCXJldHVybkxpc3QgPSBDYXRlZ29yeVNvcnRIZWxwZXIuc29ydENhdGVnb3J5RWxlbWVudHMoZWxlbWVudCwgcmV0dXJuTGlzdC50b0FycmF5KCksIHRydWUpOwotCQl9Ci0KLQkJLy8gdGhlIGZvbGxvd2luZyBwYXJ0IG1pZ2h0IG5vdCBiZSBnZW5lcmFsIHRvIGFsbCBjYXNlcwotCQkvLyBzbyBwdXQgaXQgaW50byB0aGUgcmVhbGl6ZXIKLQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JCQotLy8JCS8vIGlmIHRoZSBmZWF0dXJlIHZhbHVlIGlzIGNvbnRhaW5tZW50IGVsZW1lbnQgc3VjaCBhcyBhcnRpZmFjdAotLy8JCS8vIHRoZSBjaGlsZCBlbGVtZW50IGNhbid0IHNob3cgaWYgYW55IG9mIHRoZSBwYXJlbnQocykgYXJlIGluIHRoZSBsaXN0Ci0vLwkJLy8gUHVibGlzaGVkIHNpdGU6IERpc3BsYXkgb2YgV1BzIHVuZGVyIHJlc3BvbnNpYmxlIHJvbGUKLS8vCQlpZiAoZmVhdHVyZS5pc01hbnkoKSAmJiB2YWx1ZXMuc2l6ZSgpID4gMAotLy8JCQkJJiYgaXNDb250YWlubWVudEVsZW1lbnQodmFsdWVzLmdldCgwKSkpIHsKLS8vCQkJaW50IGkgPSAwOwotLy8JCQl3aGlsZSAoaSA8IHZhbHVlcy5zaXplKCkpIHsKLS8vCQkJCU1ldGhvZEVsZW1lbnQgbyA9IChNZXRob2RFbGVtZW50KSB2YWx1ZXMuZ2V0KGkpOwotLy8KLS8vCQkJCS8vIGlmIHRoZSBjb250YWluZXIgb2YgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIGxpc3QsIHJlbW92ZSB0aGlzCi0vLwkJCQkvLyBlbGVtZW50IGZyb20gdGhlIGxpc3QKLS8vCQkJCWlmIChpc0NvbnRhaW5lckluTGlzdChvLCB2YWx1ZXMsIGNvbmZpZykpIHsKLS8vCQkJCQl2YWx1ZXMucmVtb3ZlKGkpOwotLy8JCQkJfSBlbHNlIHsKLS8vCQkJCQlpKys7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCS8vIG5lZWQgdG8gc29ydCB0aGUgY29uY2VwdCBhbmQgcGFwZXJzIGJ5IHR5cGUKLS8vCQlpZiAoKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLS8vCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpKQotLy8JCQkJJiYgKHZhbHVlcy5zaXplKCkgPiAwKSkgewotLy8JCQlMaXN0IHBhcGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJaW50IGkgPSAwOwotLy8JCQl3aGlsZSAoaSA8IHZhbHVlcy5zaXplKCkpIHsKLS8vCQkJCU9iamVjdCBvID0gdmFsdWVzLmdldChpKTsKLS8vCQkJCWlmIChvIGluc3RhbmNlb2YgV2hpdGVwYXBlcikgewotLy8JCQkJCXBhcGVycy5hZGQobyk7Ci0vLwkJCQkJdmFsdWVzLnJlbW92ZShpKTsKLS8vCQkJCX0gZWxzZSB7Ci0vLwkJCQkJaSsrOwotLy8JCQkJfQotLy8JCQl9Ci0vLwotLy8JCQlpZiAocGFwZXJzLnNpemUoKSA+IDApIHsKLS8vCQkJCXZhbHVlcy5hZGRBbGwocGFwZXJzKTsKLS8vCQkJfQotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIHZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgY29udGFpbmVyIG9mIHRoZSBlbGVtZW50IGlzIGluIHRoZSBsaXN0IG9yIG5vdAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGl0ZW1zCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250YWluZXJJbkxpc3QoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBMaXN0IGl0ZW1zLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJRU9iamVjdCBvID0gZWxlbWVudDsKLQkJd2hpbGUgKChvICE9IG51bGwpICYmICgobyA9IG8uZUNvbnRhaW5lcigpKSAhPSBudWxsKQotCQkJCSYmIG8uZ2V0Q2xhc3MoKS5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQlpZiAoaXRlbXMuY29udGFpbnMobykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKG8gaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlvID0gZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoKFZhcmlhYmlsaXR5RWxlbWVudCkgbywgY29uZmlnKTsKLQkJCX0KLQotCQkJaWYgKChvICE9IG51bGwpICYmIGl0ZW1zLmNvbnRhaW5zKG8pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBjYWxjdWxhdGVkIGF0dHJpYnV0ZSBmZWF0dXJlIHZhbHVlIG9mIHRoZSBzcGVjaXBpZWQgZWxlbWVudCBhbmQKLQkgKiBmZWF0dXJlCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQge0BsaW5rIE1ldGhvZEVsZW1lbnR9Ci0JICogQHBhcmFtIGZlYXR1cmUge0BsaW5rIEVTdHJ1Y3R1cmFsRmVhdHVyZX0KLQkgKiBAcGFyYW0gY29uZmlnIHtAbGluayBNZXRob2RDb25maWd1cmF0aW9ufQotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJcmV0dXJuIGNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoZWxlbWVudCwgbnVsbCwgZmVhdHVyZSwgY29uZmlnKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGNhbGN1bGF0ZWQgYXR0cmlidXRlIGZlYXR1cmUgdmFsdWUgb2YgdGhlIHNwZWNpcGllZCBlbGVtZW50IGFuZAotCSAqIGZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIG93bmVyRWxlbWVudCB7QGxpbmsgTWV0aG9kRWxlbWVudH0KLQkgKiBAcGFyYW0gZmVhdHVyZSB7QGxpbmsgRVN0cnVjdHVyYWxGZWF0dXJlfQotCSAqIEBwYXJhbSBjb25maWcge0BsaW5rIE1ldGhvZENvbmZpZ3VyYXRpb259Ci0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBjYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmIChpc01lcmdhYmxlQXR0cmlidXRlKGZlYXR1cmUpKSB7Ci0JCQkvLyBtZXJnZSB0aGUgYXR0cmlidXRlIHZhbHVlcwotCQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCUF0dHJpYnV0ZUZlYXR1cmVWYWx1ZSB2YWx1ZXMgPSBuZXcgQXR0cmlidXRlRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkJY2FsY3VsYXRlRmVhdHVyZShlbGVtZW50LCBvd25lckVsZW1lbnQsIGZlYXR1cmUsIGNvbmZpZywgdmFsdWVzLAotCQkJCQkJcmVhbGl6ZXIpOwotCi0vLwkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXQgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotLy8JCQkJRmVhdHVyZVZhbHVlIGF2ID0gKEZlYXR1cmVWYWx1ZSkgaXQubmV4dCgpOwotLy8JCQkJaWYgKGF2LnRleHQgPT0gbnVsbCB8fCBhdi50ZXh0LnRvU3RyaW5nKCkubGVuZ3RoKCkgPT0gMCkgewotLy8JCQkJCWNvbnRpbnVlOwotLy8JCQkJfQotLy8KLS8vCQkJCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0vLwkJCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSkgewotLy8JCQkJCWlmICh2YWx1ZXMuc2l6ZSgpID4gMSkgewotLy8JCQkJCQkvLyBzb21ldGhpbmcgd3JvbmcgaGVyZSwgd2lsbCBub3QgaGFwcGVuIGJ1dCBwdXQgdGVzdAotLy8JCQkJCQkvLyBtZXNzYWdlIGhlcmUganVzdCBpbiBjYXNlCi0vLwkJCQkJCWlmIChkZWJ1ZykgewotLy8JCQkJCQkJU3lzdGVtLm91dAotLy8JCQkJCQkJCQkucHJpbnRsbigiQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlOiBQcmVzZW50YXRpb24gTmFtZSBnZXQgbW9yZSB0aGVuIG9uZSBlbnRyeTogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJCXJldHVybiBhdi50ZXh0OwotLy8JCQkJfQotLy8KLS8vCQkJCWlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0vLwkJCQkJYnVmZmVyLmFwcGVuZChBVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SKTsgCi0vLwkJCQl9Ci0vLwotLy8JCQkJaWYgKGF2LmVsZW1lbnQgPT0gZWxlbWVudCkgewotLy8JCQkJCWJ1ZmZlci5hcHBlbmQoYXYudGV4dCk7Ci0vLwkJCQl9IGVsc2UgewotLy8JCQkJCVN0cmluZyBjb250ZW50UGF0aCA9IFJlc291cmNlSGVscGVyCi0vLwkJCQkJCQkuZ2V0RWxlbWVudFBhdGgoKGF2LmVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pID8gKE1ldGhvZEVsZW1lbnQpIGF2LmVsZW1lbnQKLS8vCQkJCQkJCQkJLmVDb250YWluZXIoKQotLy8JCQkJCQkJCQk6IGF2LmVsZW1lbnQpOwotLy8KLS8vCQkJCQlTdHJpbmcgYmFja1BhdGggPSBSZXNvdXJjZUhlbHBlcgotLy8JCQkJCQkJLmdldEJhY2tQYXRoKChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSA/ICgob3duZXJFbGVtZW50ICE9IG51bGwpID8gb3duZXJFbGVtZW50Ci0vLwkJCQkJCQkJCTogKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQuZUNvbnRhaW5lcigpKQotLy8JCQkJCQkJCQk6IGVsZW1lbnQpOwotLy8KLS8vCQkJCQlidWZmZXIuYXBwZW5kKFJlc291cmNlSGVscGVyLmZpeENvbnRlbnRVcmxQYXRoKGF2LnRleHQsCi0vLwkJCQkJCQljb250ZW50UGF0aCwgYmFja1BhdGgpKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8KLS8vCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQkJCi0JCQlyZXR1cm4gdmFsdWVzLmdldFZhbHVlKCk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgY2FsY3VsYXRlZCAwLi5uIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUgb2YgdGhlIHNwZWNpcGllZCBlbGVtZW50Ci0JICogYW5kIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUge0BsaW5rIEVTdHJ1Y3R1cmFsRmVhdHVyZX0KLQkgKiBAcGFyYW0gcmVhbGl6ZXIge0BsaW5rIEVsZW1lbnRSZWFsaXplcn0KLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIHtAbGluayBNZXRob2RFbGVtZW50fQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBjYWxjMG5GZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlyZXR1cm4gY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIGZlYXR1cmUsIHRydWUsIGZhbHNlLCByZWFsaXplcik7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBjYWxjdWxhdGVkIDAuLm4gb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZSBvZiB0aGUgc3BlY2lwaWVkIGVsZW1lbnQKLQkgKiBhbmQgb3Bwb3NpdGUgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50IHtAbGluayBNZXRob2RFbGVtZW50fQotCSAqIEBwYXJhbSBmZWF0dXJlIHtAbGluayBPcHBvc2l0ZUZlYXR1cmV9Ci0JICogQHBhcmFtIG1lcmdlUmVwbGFjZXJCYXNlIGJvb2xlYW4KLQkgKiBAcGFyYW0gbWVyZ2VFeHRlbmRlckJhc2UgYm9vbGVhbgotCSAqIEBwYXJhbSByZWFsaXplciB7QGxpbmsgRWxlbWVudFJlYWxpemVyfQotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2Yge0BsaW5rIE1ldGhvZEVsZW1lbnR9Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGNhbGMwbkZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgYm9vbGVhbiBtZXJnZVJlcGxhY2VyQmFzZSwgYm9vbGVhbiBtZXJnZUV4dGVuZGVyQmFzZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCVRvTWFueU9wcG9zaXRlRmVhdHVyZVZhbHVlIHZhbHVlcyA9IG5ldyBUb01hbnlPcHBvc2l0ZUZlYXR1cmVWYWx1ZShlbGVtZW50LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWNhbGN1bGF0ZU9wcG9zaXRlRmVhdHVyZShlbGVtZW50LCBmZWF0dXJlLCBtZXJnZVJlcGxhY2VyQmFzZSwgbWVyZ2VFeHRlbmRlckJhc2UsIHJlYWxpemVyLCB2YWx1ZXMpOwotCQlyZXR1cm4gKExpc3QpdmFsdWVzLmdldFZhbHVlKCk7Ci0JfQotCQotCQotCQotCS8qKgotCSAqIGdldCB0aGUgY2FsY3VsYXRlZCAwLi4xIGZlYXR1cmUgdmFsdWUgb2YgdGhlIHNwZWNpcGllZCBlbGVtZW50IGFuZAotCSAqIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiBAcGFyYW0gZWxlbWVudCB7QGxpbmsgTWV0aG9kRWxlbWVudH0KLQkgKiBAcGFyYW0gZmVhdHVyZSB7QGxpbmsgT3Bwb3NpdGVGZWF0dXJlfQotCSAqIEBwYXJhbSByZWFsaXplciB7QGxpbmsgRWxlbWVudFJlYWxpemVyfQotCSAqIAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBjYWxjMDFGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlUb09uZU9wcG9zaXRlRmVhdHVyZVZhbHVlIHZhbHVlcyA9IG5ldyBUb09uZU9wcG9zaXRlRmVhdHVyZVZhbHVlKGVsZW1lbnQsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJY2FsY3VsYXRlT3Bwb3NpdGVGZWF0dXJlKGVsZW1lbnQsIGZlYXR1cmUsIHJlYWxpemVyLCB2YWx1ZXMpOwotLy8JCWlmICh2YWx1ZXMuc2l6ZSgpID4gMCkgewotLy8JCQlyZXR1cm4gZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpIHZhbHVlcy5nZXQoMCksIHJlYWxpemVyKTsKLS8vCQl9Ci0vLwotLy8JCXJldHVybiBudWxsOwotCQkKLQkJcmV0dXJuIChNZXRob2RFbGVtZW50KXZhbHVlcy5nZXRWYWx1ZSgpOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBvcmRlciB0aGUgc2VjdGlvbnMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCB7QGxpbmsgQ29udGVudEVsZW1lbnR9Ci0JICogQHBhcmFtIHZhbHVlcyB7QGxpbmsgTGlzdH0gCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9yZGVyU2VjdGlvbnMoQ29udGVudEVsZW1lbnQgZWxlbWVudCwgTGlzdCB2YWx1ZXMpIHsKLQkJU3RyaW5nIG9yZGVyaW5nR3VpZGUgPSBlbGVtZW50LmdldE9yZGVyaW5nR3VpZGUoKTsKLQkJaWYgKG9yZGVyaW5nR3VpZGUgPT0gbnVsbCB8fCBvcmRlcmluZ0d1aWRlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU2VjdGlvbkxpc3Qgc2xpc3QgPSBuZXcgU2VjdGlvbkxpc3QoZWxlbWVudCwKLQkJCQlTZWN0aW9uTGlzdC5TVEVQU19GT1JfRUxFTUVOVF9BTkRfUEFSRU5UUyk7Ci0KLQkJaWYgKGlzU2FtZUxpc3QodmFsdWVzLCBzbGlzdCkpIHsKLQkJCXZhbHVlcy5jbGVhcigpOwotCQkJdmFsdWVzLmFkZEFsbChzbGlzdCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBvdGhlcndpc2UsIG5lZWQgdG8gcmVvcmRlciB0aGUgbGlzdAotCQlPcmRlcmVkTGlzdENvbXBhcmF0b3IgY29tcCA9IG5ldyBPcmRlcmVkTGlzdENvbXBhcmF0b3IobmV3IEFycmF5TGlzdCgKLQkJCQl2YWx1ZXMpLCBzbGlzdCk7Ci0JCVRyZWVTZXQgcyA9IG5ldyBUcmVlU2V0KGNvbXApOwotCQlzLmFkZEFsbCh2YWx1ZXMpOwotCi0JCXZhbHVlcy5jbGVhcigpOwotCQl2YWx1ZXMuYWRkQWxsKHMpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTYW1lTGlzdChMaXN0IGwxLCBMaXN0IGwyKSB7Ci0JCWlmIChsMS5zaXplKCkgIT0gbDIuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbDEuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoIWwyLmNvbnRhaW5zKG8pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogY2FsY3VsYXRlIHRoZSBjb3B5cmlnaHQgb2YgdGhlIGVsZW1lbnQgaW50IGhlIGNvbmZpZ3VyYXRpb24uIFJ1bGU6IDEuCi0JICogY29udHJpYnV0b3JzJyBjb3B5cmlnaHQgc3RhdG1lbnQgc2hvdWxkIGJlIG1lcmdlZCB0byB0aGUgYmFzZSAyLiBleHRlbmRlZAotCSAqIGVsZW1lbnQgaW5oZXJpdGVzIHRoZSBjb3B5cmlnaHRzIGZyb20gdGhlIGJhc2UgMy4gcmVwbGFjZXIgZG9uJ3QgaW5oZXJpdGUKLQkgKiB0aGUgY29weXJpZ2h0cyBmcm9tIHRoZSBiYXNlIDQuIGNvcHlyaWdodCBlbGVtZW50cyBzaG91bGQgYmUgdW5pcXVlLCBubwotCSAqIGR1cGxpY2F0ZSBlbnRyeQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNhbGN1bGF0ZUNvcHlyaWdodChNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgTGlzdCB2YWx1ZXMpIHsKLQkJU3VwcG9ydGluZ01hdGVyaWFsIGNvcHlyaWdodCA9IChTdXBwb3J0aW5nTWF0ZXJpYWwpIGdldENhbGN1bGF0ZWRFbGVtZW50KAotCQkJCUxpYnJhcnlVdGlsLmdldENvcHlyaWdodChlbGVtZW50KSwgY29uZmlnKTsKLQkJaWYgKGNvcHlyaWdodCAhPSBudWxsICYmICF2YWx1ZXMuY29udGFpbnMoY29weXJpZ2h0KSkgewotCQkJdmFsdWVzLmFkZChjb3B5cmlnaHQpOwotCQl9Ci0KLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gZ2V0VmFyaWFibGVPd25lcihlbGVtZW50KTsKLQkJaWYgKHZlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gbWVyZ2UgY29weXJpZ2h0cyBvZiBjb250cmlidXRvcnMKLQkJTGlzdCBpdGVtcyA9IGdldENvbnRyaWJ1dG9ycyh2ZSwgY29uZmlnKTsKLQkJaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpOwotCQkJCWNhbGN1bGF0ZUNvcHlyaWdodChlLCBjb25maWcsIHZhbHVlcyk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBhbiBleHRlbmRlZCBlbGVtZW50LCBnZXQgdGhlIGJhc2UgZWxlbWVudCdzCi0JCS8vIGNvcHlyaWdodAotCQkvLyB0aGUgYmFzZSBlbGVtZW50J3MgY29weXJpZ2h0IHNob3VsZCBhcHBlYXIgZmlyc3QKLQkJaWYgKGlzRXh0ZW5kZXIodmUpKSB7Ci0JCQkvLyByZWFsaXplIHRoZSBiYXNlIGVsZW1lbnQgZmlyc3QuCi0JCQlNZXRob2RFbGVtZW50IGUgPSBnZXRDYWxjdWxhdGVkRWxlbWVudCh2ZQotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCBjb25maWcpOwotCQkJaWYgKCh2ZSAhPSBlKSAmJiBpbkNvbmZpZyhlLCBjb25maWcpKSB7Ci0JCQkJTGlzdCBiYXNlSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJY2FsY3VsYXRlQ29weXJpZ2h0KGUsIGNvbmZpZywgYmFzZUl0ZW1zKTsKLQotCQkJCS8vIGFkZCB0aGUgYmFzZSBpdGVtcyB0byB0aGUgYmVnaW5pbmcKLQkJCQlpZiAoYmFzZUl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQkJLy8gQXV0aG9yaW5nOiBEdXBsaWNhdGUgY29weXJpZ2h0cyB3aGVuIDIKLQkJCQkJLy8gZWxlbWVudHMgd2l0aCB0aGUgc2FtZSBjb3lyaWdodCBhcmUgZXh0ZW5kaW5nIGVhY2ggb3RoZXIKLQkJCQkJLy8gcmVtb3ZlIHRoZSBkdXBsaWNhdGUgb25lcwotCQkJCQlpbnQgaSA9IDA7Ci0JCQkJCXdoaWxlIChpIDwgdmFsdWVzLnNpemUoKSkgewotCQkJCQkJaWYgKGJhc2VJdGVtcy5jb250YWlucyh2YWx1ZXMuZ2V0KGkpKSkgewotCQkJCQkJCXZhbHVlcy5yZW1vdmUoaSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWkrKzsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXZhbHVlcy5hZGRBbGwoMCwgYmFzZUl0ZW1zKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgY29weXJpZ2h0IHRleHQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCB7QGxpbmsgTWV0aG9kRWxlbWVudH0KLQkgKiBAcGFyYW0gY29uZmlnIHtAbGluayBNZXRob2RDb25maWd1cmF0aW9ufQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29weXJpZ2h0VGV4dChNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlTdHJpbmdCdWZmZXIgY29weXJpZ2h0cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjdWxhdGVDb3B5cmlnaHQoZWxlbWVudCwgY29uZmlnLCBpdGVtcyk7Ci0JCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwgY29weXJpZ2h0OwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQljb3B5cmlnaHQgPSAoU3VwcG9ydGluZ01hdGVyaWFsKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBDb250cmlidXRpbmcgc3VwcG9ydCBtYXRlcmlhbCBkb2VzIG5vdCBzaG93Ci0JCQkJLy8gdXAgaW4gY29weSByaWdodAotCQkJCS8vIG5lZWQgdG8gcmVzb2x2ZSB0aGUgZmVhdHVyZSB2YWx1ZS4gY2FuJ3QganVzdCBnZXQgdGhlIHZhbHVlLAotCQkJCS8vIGl0IG1heSBoYXZlIGNvbnRyaWJ1dG9ycwotCQkJCS8vIFN0cmluZyBzdGF0ZW1lbnQgPQotCQkJCS8vIGNvcHlyaWdodC5nZXRQcmVzZW50YXRpb24oKS5nZXRNYWluRGVzY3JpcHRpb24oKTsKLQkJCQkvLwkJCQkJCQkJCQkJCi0JCQkJU3RyaW5nIHN0YXRlbWVudCA9IChTdHJpbmcpIGNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoY29weXJpZ2h0Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIGNvcHlyaWdodCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCksIGNvbmZpZyk7Ci0JCQkJaWYgKHN0YXRlbWVudCAhPSBudWxsICYmIHN0YXRlbWVudC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJLy8gbmVlZCB0byBmaXggdGhlIGNvbnRlbnQgZm9yIHJlbGF0aXZlIGxpbmtzLgotCQkJCQkvLyBzaW5jZSB0aGUgbGluayBpcyBhIHJlbGF0aXZlIHBhdGggdG8gdGhlCi0JCQkJCS8vIFN1cHBvcnRpbmdNYXRlcmlhbCBsb2NhdGlvbiwKLQkJCQkJLy8gbmVlZCB0byBjb252ZXJ0IHRvIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQKLQkJCQkJLy8gc28gcmUtY2FsY3VhdGUgdGhlIGJhY2sgcGF0aAotCQkJCQkvLyBqeGksIDA2LzI4LzA1Ci0JCQkJCVN0cmluZyBjb250ZW50UGF0aCA9IFJlc291cmNlSGVscGVyCi0JCQkJCQkJLmdldEVsZW1lbnRQYXRoKGNvcHlyaWdodCk7Ci0JCQkJCVN0cmluZyBiYWNrUGF0aCA9IFJlc291cmNlSGVscGVyLmdldEJhY2tQYXRoKGVsZW1lbnQpOwotCQkJCQlzdGF0ZW1lbnQgPSBSZXNvdXJjZUhlbHBlci5maXhDb250ZW50VXJsUGF0aChzdGF0ZW1lbnQsCi0JCQkJCQkJY29udGVudFBhdGgsIGJhY2tQYXRoKTsKLQotCQkJCQlpZiAoY29weXJpZ2h0cy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCWNvcHlyaWdodHMuYXBwZW5kKCI8cC8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQljb3B5cmlnaHRzLmFwcGVuZChzdGF0ZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjb3B5cmlnaHRzLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBTdHJpbmcgYXR0cmlidXRlIHZhbHVlcyBvZiBhbiBhY3Rpdml0eQotCSAqIAotCSAqIEBwYXJhbSBlIEFjdGl2aXR5IG9yIGl0J3MgQ29udGVudERlc2NyaXB0aW9uCi0JICogQHBhcmFtIGF0dHJpYgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGl2aXR5U3RyaW5nQXR0cmlidXRlKE1ldGhvZEVsZW1lbnQgZSwgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQsIAotCQkJRUF0dHJpYnV0ZSBhdHRyaWIsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmKCFTdHJpbmcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhdHRyaWIuZ2V0RUF0dHJpYnV0ZVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBpcyBub3Qgb2YgdHlwZSBTdHJpbmc6ICIgKyBhdHRyaWIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCU9iamVjdCBzdHIgPSBudWxsOwotCQlib29sZWFuIGlzRGVzYzsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlOwotCQlpZiAoIGUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gKQotCQl7Ci0JCQl2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGUuZUNvbnRhaW5lcigpOwotCQkJaWYgKCB2ZSA9PSBudWxsICkgewotCQkJCXZlID0gKFZhcmlhYmlsaXR5RWxlbWVudClvd25lckVsZW1lbnQ7Ci0JCQl9Ci0JCQlpc0Rlc2MgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKCBlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KQotCQl7Ci0JCQl2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpZTsKLQkJCWlzRGVzYyA9IGZhbHNlOwotCQl9IGVsc2UgewotCQkJc3RyID0gZS5lR2V0KGF0dHJpYik7Ci0JCQlyZXR1cm4gKHN0cj09bnVsbCkgPyAiIiA6IHN0ci50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCQotCQlpZihhdHRyaWIgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCkgfHwgYXR0cmliID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpIHsKLQkJCXJldHVybiAoU3RyaW5nKWUuZUdldChhdHRyaWIpOwotCQl9CQkKLQkJCQkJCi0JCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCWlmKCBiYXNlICE9IG51bGwgJiYgdmFyaWFiaWxpdHlUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pIHsKLQkJCS8vIGZvciBsb2NhbCBjb250cmlidXRpb24sIGFwcGVuZCB0aGUgdGV4dCB0byB0aGUgYmFzZQotCQkJT2JqZWN0IHN0ckJhc2U7Ci0JCQlpZiAoIGlzRGVzYyApIHsKLQkJCQlzdHIgPSAoKERlc2NyaWJhYmxlRWxlbWVudCl2ZSkuZ2V0UHJlc2VudGF0aW9uKCkuZUdldChhdHRyaWIpOwotCQkJCXN0ckJhc2UgPSBjYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKCAoKERlc2NyaWJhYmxlRWxlbWVudCliYXNlKS5nZXRQcmVzZW50YXRpb24oKSwgYmFzZSwgYXR0cmliLCBjb25maWcpOwotCQkJfSBlbHNlIHsKLQkJCQlzdHIgPSB2ZS5lR2V0KGF0dHJpYik7Ci0JCQkJc3RyQmFzZSA9IGNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoYmFzZSwgbnVsbCwgYXR0cmliLCBjb25maWcpOwkJCQkKLQkJCX0KLQkJCQotCQkJaWYgKCBzdHJCYXNlICE9IG51bGwgJiYgc3RyQmFzZS50b1N0cmluZygpLmxlbmd0aCgpID4gMCApIHsKLQkJCQlpZiAoIHN0ciAhPSBudWxsICYmIHN0ci50b1N0cmluZygpLmxlbmd0aCgpID4gMCApIHsKLQkJCQkJc3RyID0gc3RyQmFzZSArIEFUVFJJQlVURV9WQUxVRV9TRVBFUkFUT1IgKyBzdHI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3RyID0gc3RyQmFzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdHIgPSBjYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKGUsIHZlLCBhdHRyaWIsIGNvbmZpZyk7Ci0JCX0KLQotCQlyZXR1cm4gKHN0cj09bnVsbCkgPyAiIiA6IHN0ci50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCQotLy8JCUxpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlOwotLy8JCVZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGU7CQotLy8JCWJvb2xlYW4gY29uY2F0ID0gYXR0cmliICE9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpOwotLy8JCXdoaWxlKHRydWUpIHsKLS8vCQkJYmFzZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLS8vCQkJaWYoYmFzZSA9PSBudWxsKSB7Ci0vLwkJCQlPYmplY3Qgc3RyOwotLy8JCQkJaWYgKCBpc0Rlc2MgKSB7Ci0vLwkJCQkJc3RyID0gKChEZXNjcmliYWJsZUVsZW1lbnQpdmUpLmdldFByZXNlbnRhdGlvbigpLmVHZXQoYXR0cmliKTsgCi0vLwkJCQl9IGVsc2UgewotLy8JCQkJCXN0ciA9ICB2ZS5lR2V0KGF0dHJpYik7IAotLy8JCQkJfQotLy8JCQkJaWYoc3RyID09IG51bGwgfHwgc3RyLnRvU3RyaW5nKCkubGVuZ3RoKCkgPT0gMCkgewotLy8JCQkJCWlmKHZhbHVlcy5pc0VtcHR5KCkpIHsKLS8vCQkJCQkJdmFsdWVzLmFkZChzdHIpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJCWVsc2UgewotLy8JCQkJCXZhbHVlcy5hZGQoMCwgc3RyKTsKLS8vCQkJCX0KLS8vCQkJCWJyZWFrOwotLy8JCQl9Ci0vLwkJCWVsc2UgaWYoYmFzZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0vLwkJCQlPYmplY3Qgc3RyOwotLy8JCQkJaWYgKCBpc0Rlc2MgKSB7Ci0vLwkJCQkJc3RyID0gKChEZXNjcmliYWJsZUVsZW1lbnQpdmUpLmdldFByZXNlbnRhdGlvbigpLmVHZXQoYXR0cmliKTsgCi0vLwkJCQl9IGVsc2UgewotLy8JCQkJCXN0ciA9IHZlLmVHZXQoYXR0cmliKTsgCi0vLwkJCQl9Ci0vLwotLy8JCQkJdmFyaWFiaWxpdHlUeXBlID0gdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0vLwkJCQlpZih2YXJpYWJpbGl0eVR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCkgewotLy8JCQkJCWlmKHN0ciA9PSBudWxsIHx8IHN0ci50b1N0cmluZygpLmxlbmd0aCgpID09IDApIHsKLS8vCQkJCQkJLy8gdXNlIHRoZSB2YWx1ZSBvZiB0aGUgYmFzZQotLy8JCQkJCQkvLwotLy8JCQkJCQl2ZSA9IGJhc2U7Ci0vLwkJCQkJfQotLy8JCQkJCWVsc2UgewotLy8JCQkJCQl2YWx1ZXMuYWRkKDAsIHN0cik7Ci0vLwkJCQkJCWJyZWFrOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJCWVsc2UgaWYodmFyaWFiaWxpdHlUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT05fTElURVJBTCkgewkJCQkJCi0vLwkJCQkJaWYoc3RyICE9IG51bGwgJiYgc3RyLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSB7Ci0vLwkJCQkJCS8vIGFkZCB0byB0aGUgbGlzdAotLy8JCQkJCQkvLwotLy8JCQkJCQl2YWx1ZXMuYWRkKDAsIHN0cik7Ci0vLwkJCQkJCWlmKCFjb25jYXQpIHsKLS8vCQkJCQkJCWJyZWFrOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJCS8vIGdvIHRvIHRoZSBiYXNlCi0vLwkJCQkJdmUgPSBiYXNlOwotLy8JCQkJfQotLy8JCQkJZWxzZSBpZih2YXJpYWJpbGl0eVR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UX0xJVEVSQUwpIHsKLS8vCQkJCQl2YWx1ZXMuYWRkKDAsIHN0cik7Ci0vLwkJCQkJYnJlYWs7Ci0vLwkJCQl9Ci0vLwkJCQkvL1RPRE86IGhhbmRsZSBDT05UUklCVVRFUyBBTkQgUkVQTEFDRVMKLS8vCQkJfQotLy8JCX0KLS8vCQkKLS8vCQlpZiAoIHZhbHVlcy5zaXplKCkgPT0gMCApIHsKLS8vCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0vLwkJfQotLy8JCWVsc2UgaWYgKCB2YWx1ZXMuc2l6ZSgpID09MSApIHsKLS8vCQkJcmV0dXJuIChTdHJpbmcpdmFsdWVzLmdldCgwKTsKLS8vCQl9Ci0vLwkJZWxzZSB7Ci0vLwkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXQgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLS8vCQkJCWlmICggYnVmZmVyLmxlbmd0aCgpID4gMCApIHsKLS8vCQkJCQlidWZmZXIuYXBwZW5kKEFUVFJJQlVURV9WQUxVRV9TRVBFUkFUT1IpOwotLy8JCQkJfQotLy8JCQkJYnVmZmVyLmFwcGVuZChpdC5uZXh0KCkpOwotLy8JCQl9Ci0vLwkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsJCQkKLS8vCQl9Ci0JfQotCQotCS8qKgotCSAqIGdldCBhbGwgcHJvY2Vzc2VzIGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxQcm9jZXNzZXMoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTGlzdCBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgcGx1Z2lucyA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCUxpc3QgaXRlbXMgPSBUbmdVdGlsLmdldEFsbFByb2Nlc3NlcygoTWV0aG9kUGx1Z2luKWl0Lm5leHQoKSk7Ci0JCQlmb3IgKCBJdGVyYXRvciBpdHAgPSBpdGVtcy5pdGVyYXRvcigpOyBpdHAuaGFzTmV4dCgpOyApIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcCA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpaXRwLm5leHQoKTsKLQkJCQlpZiAoIGNhblNob3cocCwgY29uZmlnKSAmJiAhcHJvY2Vzc2VzLmNvbnRhaW5zKHApICkgewotCQkJCQlwcm9jZXNzZXMuYWRkKHApOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHByb2Nlc3NlczsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGFsbCBwcm9jZXNzZXMgaW4gdGhlIHBsdWdpbiBhbmQgdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxQcm9jZXNzZXMoTWV0aG9kUGx1Z2luIHBsdWdpbiwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTGlzdCBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgaXRlbXMgPSBUbmdVdGlsLmdldEFsbFByb2Nlc3NlcyhwbHVnaW4pOwotCQlmb3IgKCBJdGVyYXRvciBpdHAgPSBpdGVtcy5pdGVyYXRvcigpOyBpdHAuaGFzTmV4dCgpOyApIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcylpdHAubmV4dCgpOwotCQkJaWYgKCBjYW5TaG93KHAsIGNvbmZpZykgJiYgIXByb2Nlc3Nlcy5jb250YWlucyhwKSApIHsKLQkJCQlwcm9jZXNzZXMuYWRkKHApOwotCQkJfQotCQl9Ci0JCi0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCQotCS8qKgotCSAqIGdldCBhbGwgZGVsaXZlcnkgcHJvY2Vzc2VzIGluIHRoZSBwbHVnaW4gYW5kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxEZWxpdmVyeVByb2Nlc3NlcyhNZXRob2RQbHVnaW4gcGx1Z2luLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0IHByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBpdGVtcyA9IFRuZ1V0aWwuZ2V0QWxsUHJvY2Vzc2VzKHBsdWdpbik7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0cCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0cC5oYXNOZXh0KCk7ICkgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHAgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKWl0cC5uZXh0KCk7Ci0JCQlpZiAoIHAgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MgKSB7Ci0JCQkJaWYgKCBjYW5TaG93KHAsIGNvbmZpZykgJiYgIXByb2Nlc3Nlcy5jb250YWlucyhwKSApIHsKLQkJCQkJcHJvY2Vzc2VzLmFkZChwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkKLQkJcmV0dXJuIHByb2Nlc3NlczsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGFsbCBDYXBhYmlsaXR5UGF0dGVybnMgaW4gdGhlIHBsdWdpbiBhbmQgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbENhcGFiaWxpdHlQYXR0ZXJucyhNZXRob2RQbHVnaW4gcGx1Z2luLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0IHByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBpdGVtcyA9IFRuZ1V0aWwuZ2V0QWxsUHJvY2Vzc2VzKHBsdWdpbik7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0cCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0cC5oYXNOZXh0KCk7ICkgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHAgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKWl0cC5uZXh0KCk7Ci0JCQlpZiAoIHAgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybiApIHsKLQkJCQlpZiAoIGNhblNob3cocCwgY29uZmlnKSAmJiAhcHJvY2Vzc2VzLmNvbnRhaW5zKHApICkgewotCQkJCQlwcm9jZXNzZXMuYWRkKHApOwotCQkJCX0KLQkJCX0KLQkJfQotCQotCQlyZXR1cm4gcHJvY2Vzc2VzOwotCX0KLQkKLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIHdvcmsgcHJvZHVjdHMgbW9kaWZpZWQgYnkgdGhlIHNwZWNpZmllZCByb2xlLCBpbiB0aGUgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IFJvbGUKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50IE1ldGhvZEVsZW1lbnQgdGhlIG93bmVyIHRvIGFjY2VwdCB0aGUgY2FsY3VsYXRlZCB2YWx1ZQotCSAqIEBwYXJhbSByZWFsaXplcgotCSAqIEByZXR1cm4gTGlzdCBsaXN0IG9mIHdvcmsgcHJvZHVjdHMgYmVpbmcgbW9kaWZpZWQgYnkgdGhlIHJvbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY2FsY01vZGlmaWVkV29ya1Byb2R1Y3RzKFJvbGUgZWxlbWVudCwgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlMaXN0IHYgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLlJvbGVfUHJpbWFyeV9UYXNrczsKLQkJVG9NYW55T3Bwb3NpdGVGZWF0dXJlVmFsdWUgZnYyID0gbmV3IFRvTWFueU9wcG9zaXRlRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWNhbGN1bGF0ZU9wcG9zaXRlRmVhdHVyZShlbGVtZW50LCBvZmVhdHVyZSwgcmVhbGl6ZXIsIGZ2Mik7Ci0JCWlmICggZnYyLnNpemUoKSA+IDAgKSB7Ci0JCQlMaXN0IHYyID0gKExpc3QpZnYyLmdldFZhbHVlKCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdjIuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0JCQkJVG9NYW55RmVhdHVyZVZhbHVlIGZ2ID0gbmV3IFRvTWFueUZlYXR1cmVWYWx1ZShlbGVtZW50LCBvd25lckVsZW1lbnQsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJCQkoKExpc3QpZnYuZ2V0VmFsdWUoKSkuYWRkQWxsKHYpOwotCQkJCQotCQkJCWNhbGN1bGF0ZUZlYXR1cmUoZSwgb3duZXJFbGVtZW50LCAKLQkJCQkJCWZlYXR1cmUsIAotCQkJCQkJcmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpLCBmdiwgcmVhbGl6ZXIpOwkKLQkJCQl2ID0gKExpc3QpZnYuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJfQkKLQkJCi0JCXJldHVybiB2OwotCX0KLQkJCi0JLyoqCi0JICogY2FsY3VsYXRlIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgbW9kaWZpZWQgYnkgdGhlIHNwZWNpZmllZCByb2xlIGRlc2NyaXB0b3IsIGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgUm9sZURlc2NyaXB0b3IKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50IE1ldGhvZEVsZW1lbnQgdGhlIG93bmVyIHRvIGFjY2VwdCB0aGUgY2FsY3VsYXRlZCB2YWx1ZQotCSAqIEBwYXJhbSByZWFsaXplcgotCSAqIEByZXR1cm4gTGlzdCBsaXN0IG9mIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyBiZWluZyBtb2RpZmllZCBieSB0aGUgcm9sZSBkZXNjcmlwdG9yCi0JICogQGRlcHJlY2F0ZWQgdXNlIHRoZSBSb2xlRGVzY3JpcHRvckxheW91dCB0byBjYWxjdWxhdGUgdGhlIGZlYXR1cmUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY2FsY01vZGlmaWVkV29ya1Byb2R1Y3REZXNjcmlwdG9ycyhSb2xlRGVzY3JpcHRvciBlbGVtZW50LCBNZXRob2RFbGVtZW50IG93bmVyRWxlbWVudCwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCUxpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJT3Bwb3NpdGVGZWF0dXJlIG9mZWF0dXJlID0gQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfUHJpbWFyeVRhc2tEZXNjcmlwdG9yczsKLQkJVG9NYW55T3Bwb3NpdGVGZWF0dXJlVmFsdWUgZnYyID0gbmV3IFRvTWFueU9wcG9zaXRlRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWNhbGN1bGF0ZU9wcG9zaXRlRmVhdHVyZShlbGVtZW50LCBvZmVhdHVyZSwgcmVhbGl6ZXIsIGZ2Mik7Ci0JCWlmICggZnYyLnNpemUoKSA+IDAgKSB7Ci0JCQlMaXN0IHYyID0gKExpc3QpZnYyLmdldFZhbHVlKCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHYyLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotCQkJCQotCQkJCVRvTWFueUZlYXR1cmVWYWx1ZSBmdiA9IG5ldyBUb01hbnlGZWF0dXJlVmFsdWUoZWxlbWVudCwgb3duZXJFbGVtZW50LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCQkJKChMaXN0KWZ2LmdldFZhbHVlKCkpLmFkZEFsbCh2KTsKLQkJCQkKLQkJCQljYWxjdWxhdGVGZWF0dXJlKGUsIG93bmVyRWxlbWVudCwgCi0JCQkJCQlmZWF0dXJlLCAKLQkJCQkJCXJlYWxpemVyLmdldENvbmZpZ3VyYXRpb24oKSwgZnYsIHJlYWxpemVyKTsJCi0JCQkJdiA9IChMaXN0KWZ2LmdldFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB2OwotCX0KLQkKLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIHJvbGVzIHRoYXQgbW9kaWZpZXMgdGhlIHNwZWNpZmllZCB3b3JrIHByb2R1Y3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gZWxlbWVudCBXb3JrUHJvZHVjdAotCSAqIEBwYXJhbSByZWFsaXplcgotCSAqIEByZXR1cm4gTGlzdCB0aGUgcm9sZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY2FsY01vZGlmeVJvbGVzKFdvcmtQcm9kdWN0IGVsZW1lbnQsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlMaXN0IHRhc2tzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJZWxlbWVudCwgCi0JCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfT3V0cHV0RnJvbV9UYXNrcywgCi0JCQkJcmVhbGl6ZXIpOwotCQlMaXN0IG1vZGlmeVJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdGFza3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVRhc2sgdCA9IChUYXNrKWl0Lm5leHQoKTsKLQkJCVJvbGUgciA9IChSb2xlKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKAotCQkJCQl0LCAKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpLCAKLQkJCQkJcmVhbGl6ZXIpOwotCQkJaWYgKCAociAhPSBudWxsKSAmJiAhbW9kaWZ5Um9sZXMuY29udGFpbnMocikgKSB7Ci0JCQkJbW9kaWZ5Um9sZXMuYWRkKHIpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbW9kaWZ5Um9sZXM7Ci0JfQotCQotCS8qKgotCSAqIGNhbGN1bGF0ZSB0aGUgcm9sZSBkZXNjcmlwdG9ycyB0aGF0IG1vZGlmaWVzIHRoZSBzcGVjaWZpZWQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gZWxlbWVudCBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkgKiBAcGFyYW0gcmVhbGl6ZXIKLQkgKiBAcmV0dXJuIExpc3QgdGhlIHJvbGUgZGVzY3JpcHRvcnMKLQkgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIFdvcmtQcm9kdWN0RGVzY3JpcHRvcmxheW91dCB0byBjYWxjdWxhdGUgdGhlIGZlYXR1cmUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY2FsY01vZGlmeVJvbGVEZXNjcmlwdG9ycyhXb3JrUHJvZHVjdERlc2NyaXB0b3IgZWxlbWVudCwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCUxpc3QgdGFza0Rlc2NyaXB0b3JzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJZWxlbWVudCwgCi0JCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb21fVGFza0Rlc2NyaXB0b3JzLCAKLQkJCQlyZWFsaXplcik7Ci0JCUxpc3QgbW9kaWZ5Um9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB0YXNrRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVRhc2tEZXNjcmlwdG9yIHQgPSAoVGFza0Rlc2NyaXB0b3IpaXQubmV4dCgpOwotCQkJUm9sZURlc2NyaXB0b3IgciA9IChSb2xlRGVzY3JpcHRvcilDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSgKLQkJCQkJdCwgCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksIAotCQkJCQlyZWFsaXplcik7Ci0JCQlpZiAoIChyICE9IG51bGwpICYmICFtb2RpZnlSb2xlcy5jb250YWlucyhyKSApIHsKLQkJCQltb2RpZnlSb2xlcy5hZGQocik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBtb2RpZnlSb2xlczsKLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGFjdGl2aXR5IGlzIGEgY29udHJpYnV0b3IgCi0JICogb3IgY29udGFpbnMgYW55IHN1Yi1hY3Rpdml0aWVzIHRoYXQgYXJlIGNvbnRyaWJ1dG9ycwotCSAqIEBwYXJhbSBlbGVtZW50IEFjdGl2aXR5Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0NvbnRyaWJ1dG9yKEFjdGl2aXR5IGVsZW1lbnQpIHsKLQkJaWYgKCBpc0NvbnRyaWJ1dG9yKGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gZWxlbWVudC5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCWlmICggIShvIGluc3RhbmNlb2YgQWN0aXZpdHkpICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpZiAoIGhhc0NvbnRyaWJ1dG9yKCAoQWN0aXZpdHkpbyApICkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgYmFzZSBwcm9jZXNzZXMgZm9yIGFuIHtAbGluayBBY3Rpdml0eX0gaW4gdGhlIENvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QmFzZVByb2Nlc3NlcyhBY3Rpdml0eSBlbGVtZW50LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0IHZhbHVlID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRCYXNlUHJvY2Vzc2VzKGVsZW1lbnQsIGNvbmZpZywgdmFsdWUpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCQotCS8qKgotCSAqIGdldCBhbGwgYmFzZSBwcm9jZXNzZXMgZm9yIGFuIGFjdGl2aXR5IGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlIExpc3QgdGhlIGJhc2VzIHByb2Nlc3NlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRCYXNlUHJvY2Vzc2VzKEFjdGl2aXR5IGVsZW1lbnQsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBMaXN0IHZhbHVlKSB7Ci0JCQotCQkvLyBnZXQgaXQncyBvd24gYmFzZQotCQlpZiAoIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNFeHRlbmRlcihlbGVtZW50KSApIHsKLQkJCUFjdGl2aXR5IGJhc2UgPSAoQWN0aXZpdHkpZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoIGJhc2UgIT0gbnVsbCAKLQkJCQkJJiYgIXZhbHVlLmNvbnRhaW5zKGJhc2UpIAotCQkJCQkmJiAoYmFzZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgKSB7Ci0JCQkJaWYgKCBjYW5TaG93KGJhc2UsIGNvbmZpZykgKSB7Ci0JCQkJCXZhbHVlLmFkZChiYXNlKTsKLQkJCQl9Ci0JCQkJZ2V0QmFzZVByb2Nlc3NlcyhiYXNlLCBjb25maWcsIHZhbHVlKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gaWYgdGhlIHN1Yi1hY3Rpdml0aWVzIGhhdmUgYmFzZSwgcHJvY2VzcyBpdAotCQlmb3IgKCBJdGVyYXRvciBpdCA9IGVsZW1lbnQuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoIG8gaW5zdGFuY2VvZiBBY3Rpdml0eSApIHsKLQkJCQlnZXRCYXNlUHJvY2Vzc2VzKChBY3Rpdml0eSlvLCBjb25maWcsIHZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9EZWZhdWx0RWxlbWVudFJlYWxpemVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9EZWZhdWx0RWxlbWVudFJlYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZTkyYjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vRGVmYXVsdEVsZW1lbnRSZWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLQotLyoqCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSByZWFsaXplci4KLSAqIFJlYWxpemVzIHRoZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uIGFuZCByZWFsaXplIG9wdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RWxlbWVudFJlYWxpemVyIGV4dGVuZHMgRWxlbWVudFJlYWxpemVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEZWZhdWx0RWxlbWVudFJlYWxpemVyX1R5cGUgPSAiRGVmYXVsdEVsZW1lbnRSZWFsaXplciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyX1R5cGUgPSAiUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQcm9jZXNzUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplcl9UeXBlID0gIlByb2Nlc3NQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyIjsgLy8kTk9OLU5MUy0xJAotCQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVsZW1lbnRSZWFsaXplciBjcmVhdGVFbGVtZW50UmVhbGl6ZXJFeHRlbnNpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyB0eXBlKSB7Ci0JCU9iamVjdCBleHQgPSBFeHRlbnNpb25NYW5hZ2VyLmNyZWF0ZUV4dGVuc2lvbihMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAiZWxlbWVudFJlYWxpemVyRmFjdG9yeSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBleHQgaW5zdGFuY2VvZiBJRWxlbWVudFJlYWxpemVyRmFjdG9yeSA/Ci0JCQkoKElFbGVtZW50UmVhbGl6ZXJGYWN0b3J5KSBleHQpLmNyZWF0ZVJlYWxpemVyKGNvbmZpZywgdHlwZSkgOiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVsZW1lbnRSZWFsaXplciBuZXdFbGVtZW50UmVhbGl6ZXIoCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiByZXNvbHZlQ29udHJpYnV0b3IsCi0JCQlib29sZWFuIHJlc29sdmVSZXBsYWNlcikgewotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBjcmVhdGVFbGVtZW50UmVhbGl6ZXJFeHRlbnNpb24oY29uZmlnLCBEZWZhdWx0RWxlbWVudFJlYWxpemVyX1R5cGUpOwotCQlpZiAocmVhbGl6ZXIgPT0gbnVsbCkgewotCQkJcmVhbGl6ZXIgPSBuZXcgRGVmYXVsdEVsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQl9Ci0JCXJlYWxpemVyLnNldFJlc29sdmVDb250cmlidXRvcihyZXNvbHZlQ29udHJpYnV0b3IpOwotCQlyZWFsaXplci5zZXRSZXNvbHZlUmVwbGFjZXIocmVzb2x2ZVJlcGxhY2VyKTsKLQkJcmV0dXJuIHJlYWxpemVyOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVsZW1lbnRSZWFsaXplciBuZXdFbGVtZW50UmVhbGl6ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJcmV0dXJuIG5ld0VsZW1lbnRSZWFsaXplcihjb25maWcsIHRydWUsIHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZSBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGNvbmZpZyBNZXRob2RDb25maWd1cmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIERlZmF1bHRFbGVtZW50UmVhbGl6ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJc3VwZXIoY29uZmlnKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBhbmQgYWRkaXRpb25hbCByZWFsaXphdGlvbiBvcHRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcgTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSByZXNvbHZlQ29udHJpYnV0b3IgYm9vbGVhbiBpZiB0cnVlLCBjb250cnVidXRvcnMgZnJvbSBmZWF0dXJlIHZhbHVlIGxpc3Qgd2lsbCBiZSByZXNvbHZlZC4gZGVmYXVsdCB0byBmYWxzZS4KLQkgKiBAcGFyYW0gcmVzb2x2ZVJlcGxhY2VyIGJvb2xlYW4gaWYgdHVyZSwgZWxlbWVudCB3aXRoIGEgcmVwbGFjZXIgd2lsbCBiZSByZXNvbHZlZCB0byB0aGUgcmVwbGFjZXIuIGRlZmF1bHQgdG8gdHJ1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgRGVmYXVsdEVsZW1lbnRSZWFsaXplcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCWJvb2xlYW4gcmVzb2x2ZUNvbnRyaWJ1dG9yLCBib29sZWFuIHJlc29sdmVSZXBsYWNlcikgewotCQlzdXBlcihjb25maWcsIHJlc29sdmVDb250cmlidXRvciwgcmVzb2x2ZVJlcGxhY2VyKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBFbGVtZW50UmVhbGl6ZXIucmVhbGl6ZQotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IHJlYWxpemUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBzdXBlci5yZWFsaXplKGVsZW1lbnQpOwotCX0KLQkKLQkvKioKLQkgKiByZWFsaXplIHRoZSBsaXN0IG9mIGZlYXR1cmUgdmFsdWVzIGFuZCByZXR1cm5zIGEgbmV3IGxpc3Qgb2YgdmFsdWVzCi0JICogVGhlIG5ldyBtaWdodCBiZSBhIHJlLXNvcnRpbmcgb2YgdGhlIG9yaWdpbmFsIGxpc3QgCi0JICogb3Igc29tZSBvZiB0aGUgdmFsdWVzIGNhbiBiZSBmaWx0ZXJlZCBvdXQsIGRlcGVuZGluZyBvbiB0aGUgZGV0YWlsIGltcGxlbWVudGF0aW9uCi0JICogTm90ZTogdGhlIGxpc3QgdmFsdWUgcGFzc2VkIGluIG1pZ2h0IGJlIHVwZGF0ZWQgYXMgd2VsbC4KLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUgRVN0cnVjdHVyYWxGZWF0dXJlCi0JICogQHBhcmFtIHZhbHVlcyBMaXN0Ci0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgcmVhbGl6ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIExpc3QgdmFsdWVzKQotCXsKLQkJaWYgKCB2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMuc2l6ZSgpID09IDAgKSB7Ci0JCQlyZXR1cm4gdmFsdWVzOwotCQl9Ci0JCQotCQkvLyBXcm9uZyAibW9kaWZpZXMiIGluZm9ybWF0aW9uIHB1Ymxpc2hlZCBpbiB0ZWFtIGFsbG9jYXRpb24gdmlldyBmb3Igc21hbGwgY29uZmlndXJhdGlvbgotCQkvLyBhZGRlZCBmaWx0ZXIgdG8gY2xlYW4gdXAgdW4td2FudGVkIGl0ZW1zCi0JCWlmICggc3VwZXIuZmlsdGVyICE9IG51bGwgKSB7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IHZhbHVlcy5zaXplKCkpIHsKLQkJCQlNZXRob2RFbGVtZW50IG8gPSAoTWV0aG9kRWxlbWVudCkgdmFsdWVzLmdldChpKTsKLQotCQkJCWlmICggIWZpbHRlci5hY2NlcHQobykgKSB7Ci0JCQkJCXZhbHVlcy5yZW1vdmUoaSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkJCQotCQkvLyBpZiB0aGUgZmVhdHVyZSB2YWx1ZSBpcyBjb250YWlubWVudCBlbGVtZW50IHN1Y2ggYXMgYXJ0aWZhY3QKLQkJLy8gdGhlIGNoaWxkIGVsZW1lbnQgY2FuJ3Qgc2hvdyBpZiBhbnkgb2YgdGhlIHBhcmVudChzKSBhcmUgaW4gdGhlIGxpc3QKLQkJLy8gMDAzODQ2MTkgLSBQdWJsaXNoZWQgc2l0ZTogRGlzcGxheSBvZiBXUHMgdW5kZXIgcmVzcG9uc2libGUgcm9sZQotCQkKLQkJLy8gdGhpcyBpcyBub3QgYSBnZW5lcmFsIHJ1bGUuIG9ubHkgYXBwbHkgdG8gdGhlIHB1Ymxpc2hlZCBuYXZpZ2F0aW9uIHRyZWUuCi0JCS8vIHNvIG1vdmUgdGhpcyBsb2dpYyB0byB0aGUgdHJlZSBnZW5lcmF0aW9uIGNvZGUgaW4gcHVibGlzaGluZwotCQkvLyBnZWVucmFsbHksIHNob3cgYWxsIGVsZW1lbnRzLCBzZWUgYnVnCi0JCS8vIDAwMzg2NzY1IC0gUm9sZSByZXNwb25zaWJpbGl0aWVzIG5lZWQgdG8gc2hvdyAoY29udHJpYnV0ZWQpIHN1Yi1hcnRpZmFjdHMJCi0vLwkJaWYgKGZlYXR1cmUuaXNNYW55KCkgJiYgdmFsdWVzLnNpemUoKSA+IDAKLS8vCQkJCSYmIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNDb250YWlubWVudEVsZW1lbnQodmFsdWVzLmdldCgwKSkpIHsKLS8vCQkJaW50IGkgPSAwOwotLy8JCQl3aGlsZSAoaSA8IHZhbHVlcy5zaXplKCkpIHsKLS8vCQkJCU1ldGhvZEVsZW1lbnQgbyA9IChNZXRob2RFbGVtZW50KSB2YWx1ZXMuZ2V0KGkpOwotLy8KLS8vCQkJCS8vIGlmIHRoZSBjb250YWluZXIgb2YgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIGxpc3QsIHJlbW92ZSB0aGlzCi0vLwkJCQkvLyBlbGVtZW50IGZyb20gdGhlIGxpc3QKLS8vCQkJCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmlzQ29udGFpbmVySW5MaXN0KG8sIHZhbHVlcywgY29uZmlnKSkgewotLy8JCQkJCXZhbHVlcy5yZW1vdmUoaSk7Ci0vLwkJCQl9IGVsc2UgewotLy8JCQkJCWkrKzsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLQotCQkvLyBuZWVkIHRvIHNvcnQgdGhlIGNvbmNlcHQgYW5kIHBhcGVycyBieSB0eXBlCi0JCWlmICgoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpKQotCQkJCSYmICh2YWx1ZXMuc2l6ZSgpID4gMCkpIHsKLQkJCUxpc3QgcGFwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCB2YWx1ZXMuc2l6ZSgpKSB7Ci0JCQkJT2JqZWN0IG8gPSB2YWx1ZXMuZ2V0KGkpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgV2hpdGVwYXBlcikgewotCQkJCQlwYXBlcnMuYWRkKG8pOwotCQkJCQl2YWx1ZXMucmVtb3ZlKGkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChwYXBlcnMuc2l6ZSgpID4gMCkgewotCQkJCXZhbHVlcy5hZGRBbGwocGFwZXJzKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHZhbHVlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9FbGVtZW50UmVhbGl6ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0VsZW1lbnRSZWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDBjOTM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0VsZW1lbnRSZWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkJyb3dzaW5nTGF5b3V0U2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBSZWFsaXplcyB0aGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiBhbmQgcmVhbGl6ZSBvcHRpb25zLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbGVtZW50UmVhbGl6ZXIgewotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JLy8gbm90ZTogZGlzY2FyZCBjb250cmlidXRvciB0YWtlcyBoaWdoZXIgcHJpb3JpdHksIGlmIHNldCB0byB0cnVlLAotCS8vIHJlc29sdmVDb250cmlidXRvciB3aWxsIGJlIGlnbm9yZWQKLQlwcml2YXRlIGJvb2xlYW4gZGlzY2FyZENvbnRyaWJ1dG9yID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVzb2x2ZUNvbnRyaWJ1dG9yID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiByZXNvbHZlUmVwbGFjZXIgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIHNob3dTdWJ0cmFjdGVkID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIElGaWx0ZXIgZmlsdGVyID0gbnVsbDsKLQkKLQkvLyB0aGlzIGlzIHRoZSBkZWZhdWx0IHNldHRpbmcgYmFzZWQgb24gdGhlIHByZWZlcmVuY2Ugc2V0dGluZwotCS8vIHN1YmNsYXNzIHNob3VsZCBpbXBsZW1lbnQgdGhlaXIgb3duIG1ldGhvZCB0aGUgZ2V0IHRoZSB2YWx1ZQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVmYXVsdEVuYWJsZUV4dGVuZFJlcGxhY2UgPSBmYWxzZTsKLQkKLQkKLQkvL3ByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVmYXVsdElnbm9yZUJhc2VUb01hbnlBc3NvY2lhdGlvbnMgPSBmYWxzZTsKLQotCXN0YXRpYyB7Ci0JCVN0cmluZyBzdHIgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmcoIkVuYWJsZUV4dGVuZFJlcGxhY2UiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIHN0ciAhPSBudWxsICYmIHN0ci50cmltKCkuZXF1YWxzKCJ0cnVlIikgKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWRlZmF1bHRFbmFibGVFeHRlbmRSZXBsYWNlID0gdHJ1ZTsKLQkJfQotCQkKLQkJLy8gMTcxODgyIC0gRXh0ZW5kcy1SZXBsYWNlIFZhcmlhYmlsaXR5Ci0JCS8vZGVmYXVsdElnbm9yZUJhc2VUb01hbnlBc3NvY2lhdGlvbnMgPSBMaWJyYXJ5UHJlZmVyZW5jZXMuZ2V0VXNlTmV3RXh0ZW5kc1NlbWFudGljcygpOwkJCi0JfQotCQotCS8qKgotCSAqIGNvbnN0cnVjdCBhbiBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gY29uZmlnIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgRWxlbWVudFJlYWxpemVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMoY29uZmlnLCB0cnVlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBhbmQgYWRkaXRpb25hbCByZWFsaXphdGlvbiBvcHRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcgTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSByZXNvbHZlQ29udHJpYnV0b3IgYm9vbGVhbiBpZiB0cnVlLCBjb250cnVidXRvcnMgZnJvbSBmZWF0dXJlIHZhbHVlIGxpc3Qgd2lsbCBiZSByZXNvbHZlZC4gZGVmYXVsdCB0byBmYWxzZS4KLQkgKiBAcGFyYW0gcmVzb2x2ZVJlcGxhY2VyIGJvb2xlYW4gaWYgdHVyZSwgZWxlbWVudCB3aXRoIGEgcmVwbGFjZXIgd2lsbCBiZSByZXNvbHZlZCB0byB0aGUgcmVwbGFjZXIuIGRlZmF1bHQgdG8gdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudFJlYWxpemVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJYm9vbGVhbiByZXNvbHZlQ29udHJpYnV0b3IsIGJvb2xlYW4gcmVzb2x2ZVJlcGxhY2VyKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl0aGlzLnJlc29sdmVDb250cmlidXRvciA9IHJlc29sdmVDb250cmlidXRvcjsKLQkJdGhpcy5yZXNvbHZlUmVwbGFjZXIgPSByZXNvbHZlUmVwbGFjZXI7Ci0JCQotCX0KLQotCS8qKgotCSAqIGlzIGV4dGVuZC1yZXBsYWNlIGVuYWJsZWQgZm9yIHJlcGxhY2VtZW50Ci0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXh0ZW5kUmVwbGFjZUVuYWJsZWQoKSB7Ci0JCXJldHVybiBkZWZhdWx0RW5hYmxlRXh0ZW5kUmVwbGFjZTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBnbG9iYWwgc2V0dGluZyBmb3IgdGhlIGV4dGVuZCBzZW1hbnRpY3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlnbm9yZUJhc2VUb01hbnlBc3NvY2lhdGlvbnMoKSB7Ci0JCXJldHVybiBCcm93c2luZ0xheW91dFNldHRpbmdzLklOU1RBTkNFLmlzVXNlTmV3RXh0ZW5kU2VtYW50aWNzKCk7Ci0JfQotCQotCQotCS8qKgotCSAqIHNldCB0aGUgZmxhZy4gaWYgdHJ1ZSwgdGhlIGNvbnRyaWJ1dG9ycyBmcm9tIGEgcmVhbGl6ZWQgZmVhdHVyZSBsaXN0IHdpbGwgYmUgZGlzY2FyZGVkCi0JICogCi0JICogQHBhcmFtIGRpc2NhcmRDb250cmlidXRvciBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzY2FyZENvbnRyaWJ1dG9yKGJvb2xlYW4gZGlzY2FyZENvbnRyaWJ1dG9yKSB7Ci0JCXRoaXMuZGlzY2FyZENvbnRyaWJ1dG9yID0gZGlzY2FyZENvbnRyaWJ1dG9yOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgZmxhZy4gaWYgdHJ1ZSB0aGUgY29udHJpYnV0b3JzIHdpbGwgYmUgcmVzb2x2ZWQuCi0JICogQHBhcmFtIHJlc29sdmVDb250cmlidXRvciBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb2x2ZUNvbnRyaWJ1dG9yKGJvb2xlYW4gcmVzb2x2ZUNvbnRyaWJ1dG9yKSB7Ci0JCXRoaXMucmVzb2x2ZUNvbnRyaWJ1dG9yID0gcmVzb2x2ZUNvbnRyaWJ1dG9yOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgZmxhZy4gaWYgdHJ1ZSB0aGUgZWxlbWVudCB3aXRoIGEgcmVwbGFjZXIgd2lsbCBiZSByZXNvbHZlZCB0byB0aGUgcmVwbGFjZXIuCi0JICogCi0JICogQHBhcmFtIHJlc29sdmVSZXBsYWNlciBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb2x2ZVJlcGxhY2VyKGJvb2xlYW4gcmVzb2x2ZVJlcGxhY2VyKSB7Ci0JCXRoaXMucmVzb2x2ZVJlcGxhY2VyID0gcmVzb2x2ZVJlcGxhY2VyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3dTdWJ0cmFjdGVkKCkgewotCQlyZXR1cm4gc2hvd1N1YnRyYWN0ZWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNob3dTdWJ0cmFjdGVkKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLnNob3dTdWJ0cmFjdGVkID0gZmxhZzsKLQl9Ci0JCi0KLQkvKioKLQkgKiBzZXQgYSBmaWx0ZXIgZm9yIHRoaXMgcmVhbGl6ZXIKLQkgKiBAcGFyYW0gZmlsdGVyIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0eWhlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0JCi0JLyoqCi0JICogcmVhbGl6ZSB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCByZWFsaXplKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQkKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCAhaW5Db25maWcoZWxlbWVudCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gV29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIHRoYXQgcG9pbnQgdG8gd29yayBwcm9kdWN0cwotCQkvLyBvdXRzaWRlIHRoZSBjb25maWd1cmF0aW9uIGFyZSBzdGlsbCBwdWJsaXNoZWQKLQkJLy8gbGlua2VkIGVsZW1lbnQgbXVzdCBiZSBpbiBjb25maWcgYXMgd2VsbAotCQlNZXRob2RFbGVtZW50IGxpbmtlZEVsZW1lbnQgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlsaW5rZWRFbGVtZW50ID0gKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0VGFzaygpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCWxpbmtlZEVsZW1lbnQgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCWxpbmtlZEVsZW1lbnQgPSAoKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRSb2xlKCk7Ci0JCX0KLQotCQlpZiAoKGxpbmtlZEVsZW1lbnQgIT0gbnVsbCkKLQkJCQkmJiAhaW5Db25maWcobGlua2VkRWxlbWVudCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gaWYgbm8gY29uZmlndXJhdGlvbiBpcyBzcGVjaWZpZWQsIGRvbid0IGNhbGN1bGF0ZQotCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgZTsKLQotCQkJLy8gaWYgZGlzY2FyZENvbnRyaWJ1dG9yIHNldCB0byB0cnVlLCBkaXNjYXJkIHRoZSBjb250cmlidXRvciBhbmQKLQkJCS8vIHJldHVybiBudWxsCi0JCQlpZiAoZGlzY2FyZENvbnRyaWJ1dG9yICYmIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNDb250cmlidXRvcih2ZSkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJaWYgKHJlc29sdmVDb250cmlidXRvcikgewotCQkJCS8vIGlmIHRoZSBlbGVtZW50IGlzIGEgY29udHJpYnV0b3IsIHJlc292bGUgdG8gaXQncyBiYXNlCi0JCQkJd2hpbGUgKENvbmZpZ3VyYXRpb25IZWxwZXIuaXNDb250cmlidXRvcih2ZSkpIHsKLQkJCQkJZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJaWYgKGluQ29uZmlnKGUpKSB7Ci0JCQkJCQl2ZSA9IGU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBpZiB0aGUgYmFzZSBpcyBub3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIGl0J3MgYW4KLQkJCQkJCS8vIGVycm9yCi0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJDb25maWd1cmF0aW9uIGNsb3N1cmUgZXJyb3I6IEJhc2UgZWxlbWVudCAnIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKHZlKSArICInIG5vdCBpbiBjb25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChyZXNvbHZlUmVwbGFjZXIpIHsKLQkJCQllID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRSZXBsYWNlcih2ZSwgY29uZmlnKTsKLQkJCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBlOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoIWluQ29uZmlnKHZlKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBhIHJlcGxhY2VyLCBhbmQgdGhlIGJhc2UgaXMgYSBjb250cmlidXRvciwgCi0JCQkvLyBuZWVkIHRvIHJlc29sdmUgdGhlIGVsZW1lbnQgdG8gdGhlIGJhc2UgaWYgcmVzb2x2ZUNvbnRyaWJ1dG9yIGlzIHRydWUKLQkJCS8vIDE1MjIzMCAtIEJyb3dzaW5nOiBSb2xlPC0tPldQIHJlbGF0aW9uc2hpcCBzaG93cyBpbmNvbnNpc3RhbmN5Ci0JCQllID0gdmU7Ci0JCQl3aGlsZSAoKGUgIT0gbnVsbCkgJiYgQ29uZmlndXJhdGlvbkhlbHBlci5pc1JlcGxhY2VyKGUpKSB7Ci0JCQkJZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmlzQ29udHJpYnV0b3IoZSkpIHsKLQkJCQkJcmV0dXJuIHJlYWxpemUoZSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBjYW4ndCByZXR1cm4gaGVyZSwgbmVlZCB0byBjaGVjayBjYW5TaG93Ci0JCQkvLyByZXR1cm4gdmU7Ci0JCQlpZiAoY2FuU2hvdyh2ZSkpIHsKLQkJCQlyZXR1cm4gdmU7Ci0JCQl9Ci0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKGNhblNob3coZWxlbWVudCkpIHsKLQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogcmVhbGl6ZSB0aGUgbGlzdCBvZiBmZWF0dXJlIHZhbHVlcyBhbmQgcmV0dXJucyBhIG5ldyBsaXN0IG9mIHZhbHVlcwotCSAqIFRoZSBuZXcgbWlnaHQgYmUgYSByZS1zb3J0aW5nIG9mIHRoZSBvcmlnaW5hbCBsaXN0IAotCSAqIG9yIHNvbWUgb2YgdGhlIHZhbHVlcyBjYW4gYmUgZmlsdGVyZWQgb3V0LCBkZXBlbmRpbmcgb24gdGhlIGRldGFpbCBpbXBsZW1lbnRhdGlvbgotCSAqIE5vdGU6IHRoZSBsaXN0IHZhbHVlIHBhc3NlZCBpbiBtaWdodCBiZSB1cGRhdGVkIGFzIHdlbGwuCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlIEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIEBwYXJhbSB2YWx1ZXMgTGlzdAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBMaXN0IHJlYWxpemUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIExpc3QgdmFsdWVzKTsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGluQ29uZmlnKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5pbkNvbmZpZyhlbGVtZW50LCBjb25maWcsICFzaG93U3VidHJhY3RlZCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5TaG93KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5jYW5TaG93KGVsZW1lbnQsIGNvbmZpZywgIXNob3dTdWJ0cmFjdGVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmZpbHRlciA9IG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgZUdldChNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiBlbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9GZWF0dXJlVmFsdWUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0ZlYXR1cmVWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmRkYzZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0ZlYXR1cmVWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGlkZW50aWZ5IHRoZSBmZWF0dXJlIHZhbHVlIGFuZCB0aGUgb3duaW5nIGVsZW1lbnQuIAotICogdGhpcyBoZWxwcyB0byBpZGVudGlmeSB3aGVyZSB0aGUgdmFsdWUgaXMgY29taW5nIGZyb20uIAotICogRm9yIGV4YW1wbGUsIHRoZSByZWFsaXplZCB2YWx1ZSBjYW4gYmUgZnJvbSB0aGUgYmFzZSBlbGVtZW50IGFzIHdlbGwgYXMgY29udHJpYnV0b3JzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1hYnN0cmFjdCBjbGFzcyBGZWF0dXJlVmFsdWUgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfTlVMTF8gPSAiX05VTExfIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgZWxlbWVudDsgIC8vIHRoZSBlbGVtZW50Ci0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50OyAgLy8gdGhlIGNvbnRhaW5lciBvZiB0aGUgZWxlbWVudAotCXByb3RlY3RlZCBPYmplY3QgZmVhdHVyZTsgLy8gRVN0cnVjdHJ1YWxGZWF0dXJlIG9yIE9wcG9zaXRlZmVhdHVyZQotCXByb3RlY3RlZCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBudWxsOwotCQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhlIG9iamVjdAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQgdGhlIGVsZW1lbnQgdGhhdCB0aGUgdmFsdWUgaXMgY2FsY3VhdGVkIGZvci4gCi0JICogQHBhcmFtIG93bmVyRWxlbWVudCBNZXRob2RFbGVtZW50IHRoZSBlbGVtZW50IHRoYXQgb3ducyB0aGUgdmFsdWUKLQkgKiBAcGFyYW0gZmVhdHVyZSBPYmplY3QgZWl0aGVyIEVTdHJ1Y3R1cmFsRmVhdHVyZSBvciBPcHBvc2l0ZUZlYXR1cmUuCi0JICogQHBhcmFtIHJlYWxpemVyIEVsZW1lbnRSZWFsaXplcgotCSAqLwotCXB1YmxpYyBGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBNZXRob2RFbGVtZW50IG93bmVyRWxlbWVudCwgT2JqZWN0IGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJdGhpcy5yZWFsaXplciA9IHJlYWxpemVyOwotCX0KLQotCWFic3RyYWN0IHB1YmxpYyB2b2lkIGFkZChWYXJpYWJpbGl0eUVsZW1lbnQgb3duZXIsIE9iamVjdCB2YWx1ZSk7Ci0JYWJzdHJhY3QgcHVibGljIGludCBzaXplKCk7Ci0JYWJzdHJhY3QgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpOwotCQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIG93bmVyIGVsZW1lbnQKLQkgKiBAcmV0dXJuIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRPd25lckVsZW1lbnQoKSB7Ci0JCXJldHVybiBvd25lckVsZW1lbnQ7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgRVN0cnVjdHVyYWxGZWF0dXJlLiByZXR1cm4gbnVsbCBpZiBpdCdzIG5vdCBhIEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsKLQkJaWYgKCBmZWF0dXJlIGluc3RhbmNlb2YgRVN0cnVjdHVyYWxGZWF0dXJlICkgewotCQkJcmV0dXJuIChFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgT3Bwb3NpdGVGZWF0dXJlLCByZXR1cm4gbnVsbCBpZiB0aGlzIGlzIG5vdCBhbiBPcHBvc2l0ZUZlYXR1cmUKLQkgKiBAcmV0dXJuIE9wcG9zaXRlRmVhdHVyZQotCSAqLwotCXB1YmxpYyBPcHBvc2l0ZUZlYXR1cmUgZ2V0T3Bwb3NpdGVGZWF0dXJlKCkgewotCQlpZiAoIGZlYXR1cmUgaW5zdGFuY2VvZiBPcHBvc2l0ZUZlYXR1cmUgKSB7Ci0JCQlyZXR1cm4gKE9wcG9zaXRlRmVhdHVyZSlmZWF0dXJlOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSByZWFsaXplcgotCSAqIEByZXR1cm4gRWxlbWVudFJlYWxpemVyCi0JICovCi0JcHVibGljIEVsZW1lbnRSZWFsaXplciBnZXRSZWFsaXplcigpIHsKLQkJcmV0dXJuIHJlYWxpemVyOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVuZFJlcGxhY2VFbmFibGVkKCkgewotCQlpZiAoIEVsZW1lbnRSZWFsaXplci5pc0V4dGVuZFJlcGxhY2VFbmFibGVkKCkgKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCU1ldGhvZEVsZW1lbnQgZSA9IGVsZW1lbnQ7Ci0JCWlmICggZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJZSA9IChNZXRob2RFbGVtZW50KSgoQ29udGVudERlc2NyaXB0aW9uKWVsZW1lbnQpLmVDb250YWluZXIoKTsKLQkJCWlmICggZSA9PSBudWxsICkgewotCQkJCWUgPSBvd25lckVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIChlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSAmJiBDb25maWd1cmF0aW9uSGVscGVyLmlzRXh0ZW5kUmVwbGFjZXIoKFZhcmlhYmlsaXR5RWxlbWVudCllKSApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCbGFua0luZGljYXRvcihPYmplY3QgdmFsdWUpIHsKLQkJaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJcmV0dXJuIF9OVUxMXy5lcXVhbHModmFsdWUudG9TdHJpbmcoKSk7Ci0JCX0gZWxzZSBpZiAoIHZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuIF9OVUxMXy5lcXVhbHMoKChNZXRob2RFbGVtZW50KXZhbHVlKS5nZXROYW1lKCkpOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vSUVsZW1lbnRSZWFsaXplckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0lFbGVtZW50UmVhbGl6ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5OGUwZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vSUVsZW1lbnRSZWFsaXplckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJRWxlbWVudFJlYWxpemVyRmFjdG9yeSB7Ci0JRWxlbWVudFJlYWxpemVyIGNyZWF0ZVJlYWxpemVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgdHlwZSk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9PcmRlcmVkTGlzdENvbXBhcmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL09yZGVyZWRMaXN0Q29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmM5ZDc5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL09yZGVyZWRMaXN0Q29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIGEgY29tcGFyYXRvciB0byBzb3J0IGFuIGVsZW1lbnQgbGlzdC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPcmRlcmVkTGlzdENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQotCS8vIHNvcnQgdGhlIGJhc2VsaXN0IGFjY29yZGluZyB0byB0aGUgc29ydGVkIGxpc3QKLQkvLyBhbnkgaXRlbSBpbiBzb3J0ZWQgbGlzdCBidXQgbm90IGluIGJhc2UgbGlzdCBhcmUgaWdub3JlZAotCS8vIGFueSBpdGVtIGluIGJhc2UgbGlzdCBidXQgbm90IGluIHNvcnRlZCBsaXN0IGtlZXBzIHRoZSBvcmlnaW5hbCBvcmRlcgotCUxpc3QgYmFzZUxpc3Q7Ci0KLQlMaXN0IHNvcnRlZExpc3Q7Ci0KLQlPcmRlcmVkTGlzdENvbXBhcmF0b3IoTGlzdCBiYXNlTGlzdCwgTGlzdCBzb3J0ZWRMaXN0KSB7Ci0JCXRoaXMuYmFzZUxpc3QgPSBiYXNlTGlzdDsKLQkJdGhpcy5zb3J0ZWRMaXN0ID0gc29ydGVkTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBjb21wYXJlIHRvIG9iamVjdHMuCi0JICovCi0JcHVibGljIGludCBjb21wYXJlKE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCWludCBpMSwgaTI7Ci0JCWlmIChzb3J0ZWRMaXN0ICE9IG51bGwpIHsKLQkJCWkxID0gc29ydGVkTGlzdC5sYXN0SW5kZXhPZihlMSk7Ci0JCQlpMiA9IHNvcnRlZExpc3QubGFzdEluZGV4T2YoZTIpOwotCQkJaWYgKGkxID49IDAgfHwgaTIgPj0gMCkgewotCQkJCS8vIGlmIG5vdCBpbiB0aGUgc29ydGVkIGxpc3QsIGZpbmQgdGhlIGltbWVkaWF0ZSBwcmVkaWNlc3NvcgotCQkJCS8vIHRoYXQgaXMgaW4gdGhlIGxpc3QgYW5kIGNvbXBhcmUgdG8gaXQuCi0JCQkJLy8gaWYgbm8gc3VjaCBlbGVtZW50LCBjb21wYXJlIHRvIHRoZSBvcmlnaW5hbCBsaXN0Ci0JCQkJaWYgKGkxIDwgMCkgewotCQkJCQlpMSA9IGZpbmRDb21wYXJhYmxlSW5kZXgoZTEpOwotCQkJCX0KLQotCQkJCWlmIChpMiA8IDApIHsKLQkJCQkJaTIgPSBmaW5kQ29tcGFyYWJsZUluZGV4KGUyKTsKLQkJCQl9Ci0KLQkJCQlpZiAoaTEgPj0gMCAmJiBpMiA+PSAwICYmIGkxICE9IGkyKSB7Ci0JCQkJCXJldHVybiBpMSAtIGkyOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBvcmlnaW5hbE9yZGVyKGUxLCBlMik7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZmluZENvbXBhcmFibGVJbmRleChPYmplY3QgZSkgewotCQlpbnQgaTIgPSAtMTsKLQkJZm9yIChpbnQgaSA9IGJhc2VMaXN0Lmxhc3RJbmRleE9mKGUpOyBpID49IDA7IGktLSkgewotCQkJT2JqZWN0IG8gPSBiYXNlTGlzdC5nZXQoaSk7Ci0JCQlpMiA9IHNvcnRlZExpc3QubGFzdEluZGV4T2Yobyk7Ci0JCQlpZiAoaTIgPj0gMCkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGkyOwotCX0KLQotCXByaXZhdGUgaW50IG9yaWdpbmFsT3JkZXIoT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJaW50IGkxLCBpMjsKLQkJaWYgKGJhc2VMaXN0ICE9IG51bGwpIHsKLQkJCWkxID0gYmFzZUxpc3QubGFzdEluZGV4T2YoZTEpOwotCQkJaTIgPSBiYXNlTGlzdC5sYXN0SW5kZXhPZihlMik7Ci0KLQkJCXJldHVybiBpMSAtIGkyOwotCQl9Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Qcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Qcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YTg4N2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVmFyaWFiaWxpdHlJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZpbHRlciB0aGF0IHN0aWxsIHNob3dzIGNlcnRhaW4gZWxlbWVudHMgZHVyaW5nIHByb2Nlc3MgYXV0aG9yaW5nIHRoYXQKLSAqIFByb2Nlc3NDb25maWd1cmF0b3IgZG9lcyBub3Qgc2hvdy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKYW4gMTEsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yIGV4dGVuZHMgUHJvY2Vzc0NvbmZpZ3VyYXRvciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yIElOU1RBTkNFID0gbmV3IFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IoKTsKLQotCXByaXZhdGUgUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcigpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobmV3IElMaWJyYXJ5U2VydmljZUxpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCQkJc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJfQotCQkJCi0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gbWV0aG9kQ29uZmlnCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yKE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnKSB7Ci0JCXN1cGVyKG1ldGhvZENvbmZpZyk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRmlsdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICogb3ZlcnJpZGUgdGhpcywgIGZvciBwcm9jZXNzIGF1dGhvcmluZyBlZGl0LCBzaG91bGQgZ2V0IGRpcmVjdCBjaGlsZHJlbiBubyByZWFsaXphdGlvbi4KLQkgKiAgCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSkgewotCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgb2JqOwotCQlyZXR1cm4gKExpc3QpZU9iamVjdC5lR2V0KGNoaWxkRmVhdHVyZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkZpbHRlciNyZXNvbHZlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCByZXNvbHZlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG9iamVjdDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRmlsdGVyI2dldFZhcmlhYmlsaXR5SW5mbyhvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlJbmZvIGdldFZhcmlhYmlsaXR5SW5mbyhWYXJpYWJpbGl0eUVsZW1lbnQgdmUpIHsKLQkJcmV0dXJuIG5ldyBWYXJpYWJpbGl0eUluZm8odmUpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5WYXJpYWJpbGl0eUluZm8jZ2V0SW5oZXJpcmFuY2VMaXN0KCkKLQkJCSAqLwotCQkJcHVibGljIExpc3QgZ2V0SW5oZXJpdGFuY2VMaXN0KCkgewotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGdldE93bmVyKCkpOwotCQkJfQotCQkJCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVmFyaWFiaWxpdHlJbmZvI2dldENvbnRyaWJ1dG9ycygpCi0JCQkgKi8KLQkJCXB1YmxpYyBMaXN0IGdldENvbnRyaWJ1dG9ycygpIHsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc0NvbmZpZ3VyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc0NvbmZpZ3VyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmU0YzE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1Byb2Nlc3NDb25maWd1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotCi0KLS8qKgotICogCi0gKiBAYXV0aG9yIFBob25nIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb25maWd1cmF0b3IgZXh0ZW5kcyBDb25maWd1cmF0aW9uRmlsdGVyIHsKLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja093bmluZ1Byb2Nlc3M7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWV0aG9kQ29uZmlnCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29uZmlndXJhdG9yKE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnKSB7Ci0JCXN1cGVyKG1ldGhvZENvbmZpZyk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBtZXRob2RDb25maWcKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogQHBhcmFtIGNoZWNrT3duaW5nUHJvY2VzcyBpZiB0cnVlIHdpbGwgY2hlY2sgb24gb3duaW5nIHByb2Nlc3Mgb2YgYWN0aXZpdGllcyB3aGV0aGVyIGl0IGlzIGluIHRoZSBjb25maWd1cmF0aW9uLgotCSAqICAgICAgICAgIFRoaXMgY2hlY2sgaXMgbm90IHJlcXVpcmVkIGluIHByb2Nlc3MgZWRpdG9yIGFuZCBza2lwcGluZyBpdCBoZWxwcyB0aGUgcGVyZm9ybWFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NDb25maWd1cmF0b3IoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIGJvb2xlYW4gY2hlY2tPd25pbmdQcm9jZXNzKSB7Ci0JCXRoaXMobWV0aG9kQ29uZmlnKTsKLQkJdGhpcy5jaGVja093bmluZ1Byb2Nlc3MgPSBjaGVja093bmluZ1Byb2Nlc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewotCQltZXRob2RDb25maWcgPSBuZXdDb25maWc7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG1ldGhvZENvbmZpZyA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKHN1cGVyLm1ldGhvZENvbmZpZyk7Ci0JCQlyZXR1cm4gYWNjZXB0KChCcmVha2Rvd25FbGVtZW50KW9iaiwgcmVhbGl6ZXIpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuYWNjZXB0KG9iaik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQ29uZmlndXJhdG9yI2FjY2VwdChvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEJyZWFrZG93bkVsZW1lbnQgZSwgZmluYWwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgTWlsZXN0b25lIHx8IGUgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJLy8gYWNjZXB0IGFsbCBwcm9jZXNzIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IGNvbnRlbnQKLQkJCS8vIGVsZW1lbnQKLQkJCS8vCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXJldHVybiBQcm9jZXNzVXRpbC5hY2NlcHQoKEFjdGl2aXR5KSBlLCBuZXcgSUZpbHRlcigpIHsKLQotCQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ID8gcmVhbGl6ZXIuaW5Db25maWcoKE1ldGhvZEVsZW1lbnQpIG9iaikgOiB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCX0sIGNoZWNrT3duaW5nUHJvY2Vzcyk7Ci0JCX0KLQkJZWxzZSBpZihlIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJLy8gVE9ETzogbmVlZCB0byBjb25zaWRlciBjaGVja2luZyBvbiBvd25pbmcgcHJvY2VzcyBvZiB0aGUgZGVzY3JpcHRvciB3aGV0aGVyIGl0IGlzIGluIHRoZSBjb25maWd1cmF0aW9uLgotCQkJLy8gQ3VycmVudGx5LCB0aGlzIGNoZWNrIGlzIG5vdCByZXF1aXJlZCBhbmQgc2tpcHBpbmcgaXQgaGVscHMgdGhlIHBlcmZvcm1hbmNlLgotCQkJLy8gQnV0IHRoaXMgY2hlY2sgbWlnaHQgYWZmZWN0IHRoZSBjdXJyZW50IGNvZGUsIGUuZy46IHByb2Nlc3MgcHJvcGVydGllcyB2aWV3LgotCQkJLy8KLQkJCU1ldGhvZEVsZW1lbnQgbGlua2VkX29iaiA9IFByb2Nlc3NVdGlsLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBlKTsKLQkJCWlmIChsaW5rZWRfb2JqID09IG51bGwgfHwgbGlua2VkX29iai5lSXNQcm94eSgpKSB7Ci0JCQkJLy8gdGhpcyBpcyB0aGUgcHJvY2Vzc2VzIG93biBkZXNjcmlwdG9yIChpbmRlcGVuZGVudCBmcm9tIHRoZSBjb250ZW50KQotCQkJCS8vIGFsd2F5cyBhY2NlcHQgaXQKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gbWFrZSBzdXJlIHRoYXQgZWxlbWVudCB3aXRoIHJlcGxhY2VyIG1pZ2h0IHN0aWxsIGJlIGFjY2VwdGVkCi0JCQkJLy8KLQkJCQlsaW5rZWRfb2JqID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChsaW5rZWRfb2JqLCByZWFsaXplcik7Ci0KLQkJCQkvLyBpZiB0aGUgbGlua2VkIGVsZW1lbnQgaXMgbm90IGluIGNvbmZpZywgZG9uJ3QgYWNjZXB0IGl0Ci0JCQkJcmV0dXJuIHJlYWxpemVyLmluQ29uZmlnKGxpbmtlZF9vYmopOwotCQkJfQkJCi0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5hY2NlcHQoZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1Byb2Nlc3NWYXJpYWJpbGl0eUNvbmZpZ3VyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc1ZhcmlhYmlsaXR5Q29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlOTM5NWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc1ZhcmlhYmlsaXR5Q29uZmlndXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1ZhcmlhYmlsaXR5Q29uZmlndXJhdG9yIGV4dGVuZHMgUHJvY2Vzc0NvbmZpZ3VyYXRvciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWV0aG9kQ29uZmlnCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyBQcm9jZXNzVmFyaWFiaWxpdHlDb25maWd1cmF0b3IoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcpIHsKLQkJc3VwZXIobWV0aG9kQ29uZmlnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7Ci0JCW1ldGhvZENvbmZpZyA9IG5ld0NvbmZpZzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0NvbmZpZ3VyYXRvciNhY2NlcHQob3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJQWN0aXZpdHkgYmFzZSA9IChBY3Rpdml0eSkgKChBY3Rpdml0eSkgZSkKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChiYXNlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5pbkNvbmZpZygKLQkJCQkJCVRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlKSwgbWV0aG9kQ29uZmlnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuaW5Db25maWcoVG5nVXRpbAotCQkJCQkJLmdldE93bmluZ1Byb2Nlc3MoYmFzZSksIG1ldGhvZENvbmZpZyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuYWNjZXB0KGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1RvTWFueUZlYXR1cmVWYWx1ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vVG9NYW55RmVhdHVyZVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiM2JjZTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vVG9NYW55RmVhdHVyZVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIHJlYWxpemVkIGZlYXR1cmUgdmFsdWUgZm9yIGEgdG9NYW55IGZlYXR1cmUKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUb01hbnlGZWF0dXJlVmFsdWUgZXh0ZW5kcyBGZWF0dXJlVmFsdWUgewotCi0JTGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkZlYXR1cmVWYWx1ZSNGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCwgTWV0aG9kRWxlbWVudCwgT2JqZWN0LCBFbGVtZW50UmVhbGl6ZXIpCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gcmVhbGl6ZXIKLQkgKi8KLQlwdWJsaWMgVG9NYW55RmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQsIE9iamVjdCBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJc3VwZXIoZWxlbWVudCwgb3duZXJFbGVtZW50LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgZmVhdHVyZSB2YWx1ZSB0byB0aGUgdmFsdWUgbGlzdAotCSAqIEBwYXJhbSBvd25lciBWYXJpYWJpbGl0eUVsZW1lbnQKLQkgKiBAcGFyYW0gdmFsdWUgT2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgYWRkKFZhcmlhYmlsaXR5RWxlbWVudCBvd25lciwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICggISh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpICkgewkKLQkJCXJldHVybjsKLQkJfQotCQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSAoKExpc3QpIHZhbHVlKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKCBvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQkJLy9NZXRob2RFbGVtZW50IGNlID0gcmVhbGl6ZXIucmVhbGl6ZShlKTsKLQkJCQlNZXRob2RFbGVtZW50IGNlID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChlLCByZWFsaXplcik7Ci0JCQkJCi0JCQkJLy8gY2FsY3VsYXRlZCBlbGVtZW50IGNhbiBiZSBudWxsIGlmIGl0IGNhbid0IHNob3cKLQkJCQlpZiAoY2UgIT0gbnVsbCAmJiAhdmFsdWVzLmNvbnRhaW5zKGNlKSkgewotCQkJCQl2YWx1ZXMuYWRkKGNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmICggKG93bmVyIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpCi0JCQkJJiYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKSkpIHsKLQkJCUNvbmZpZ3VyYXRpb25IZWxwZXIub3JkZXJTZWN0aW9ucygoQ29udGVudEVsZW1lbnQpIG93bmVyLCB2YWx1ZXMpOwotCQl9Ci0JCQkJCQkKLQl9Ci0JCi0KLQkvKioKLQkgKiBnZXQgdGhlIHJlYWxpemVkIHZhbHVlCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewkJCi0JCWlmICggaXNFeHRlbmRSZXBsYWNlRW5hYmxlZCgpICkgewotCQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQotCQkJLy8gcmVtb3ZlIHRoZSBfTlVMTF8gaXRlbS4gdGhhdCBpcyB1c2VkIGFzIGFuIGluZGljYXRvciB0byBibGFuayBvdXQgdGhlIGJhc2UgCi0JCQkvLyBmb3IgdGhlIGV4dGVuZC1yZXBsYWNlCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmFsdWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJT2JqZWN0IG8gPSAoT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCBpc0JsYW5rSW5kaWNhdG9yKG8pICkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaXRlbXMuYWRkKG8pOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gaXRlbXM7Ci0JCX0KLQkJCi0JCXJldHVybiB2YWx1ZXM7Ci0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHNpemUgb2YgdGhlIHZhbHVlIGxpc3QuCi0JICovCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdmFsdWVzLnNpemUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Ub01hbnlPcHBvc2l0ZUZlYXR1cmVWYWx1ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vVG9NYW55T3Bwb3NpdGVGZWF0dXJlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1ZDlhNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Ub01hbnlPcHBvc2l0ZUZlYXR1cmVWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci0KLS8qKgotICogcmVhbGl6ZWQgZmVhdHVyZSB2YWx1ZSBmb3IgYSB0b01hbnkgb3Bwb3NpdGUgZmVhdHVyZQotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFRvTWFueU9wcG9zaXRlRmVhdHVyZVZhbHVlIGV4dGVuZHMgVG9NYW55RmVhdHVyZVZhbHVlIHsKLQkKLQkvKioKLQkgKiBAc2VlIGNvbnN0cnVjdCBhIGZlYXR1cmUgdmFsdWUgb2JqZWN0IGZvciB0by1tYW55IG9wcG9zaXRlIGZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIHJlYWxpemVyCi0JICovCi0JcHVibGljIFRvTWFueU9wcG9zaXRlRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlzdXBlcihlbGVtZW50LCBudWxsLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JfQotCi0JCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uVG9NYW55RmVhdHVyZVZhbHVlI2FkZChWYXJpYWJpbGl0eUVsZW1lbnQsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoVmFyaWFiaWxpdHlFbGVtZW50IG93bmVyLCBPYmplY3QgdmFsdWUpIHsKLQkJCi0JCS8vIHdvcmsgYXJvdW5kIGZvciBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlIHRoYXQgc3RpbGwgcmV0dXJuIGEgc2luZ2xlIHZhbHVlIGluc3RlYWQgb2YgYSBsaXN0Ci0JCWlmICggdmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICkgewotCQkJQXJyYXlMaXN0IHYgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl2LmFkZCh2YWx1ZSk7Ci0JCQl2YWx1ZSA9IHY7Ci0JCX0KLQkJCi0JCWlmICggISh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpICkgewkKLQkJCXJldHVybjsKLQkJfQotCQkJCi0JCU9wcG9zaXRlRmVhdHVyZSBvZiA9IChPcHBvc2l0ZUZlYXR1cmUpZmVhdHVyZTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSBvZi5nZXRUYXJnZXRGZWF0dXJlKCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9ICgoTGlzdCkgdmFsdWUpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCk7Ci0KLQkJCS8vIFJlcGxhY2UgZG9lcyBub3QgY29tcGxldGVseSByZW1vdmUKLQkJCS8vIG91dGdvaW5nIGFzc29jaWF0aW9ucwotCQkJLy8gaWYgdGhlIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUgaGFzIHJlcGxhY2VyIGluIHRoZQotCQkJLy8gY29uZmlndXJhdGlvbgotCQkJLy8gaXQncyBvdXRnb2luZyBhc3NvY2lhdGlvbnMgKGkuZS4sIHRoaXMgZWxlbWVudCkgd2lsbCBiZQotCQkJLy8gcmVwbGFjZWQgYnkgdGhlIHJlcGxhY2luZyBlbGVtZW50Ci0JCQkvLyBhcyBhIHJlc3VsdCwgdGhlIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUgc2hvdWxkIGRyb3AgdGhlCi0JCQkvLyByZXBsYWNlZCBlbGVtZW50Ci0JCQkvLwotCQkJLy8gZm9yIGV4YW1wbGUsIFIxIC0+IHJlc3BvbnNpYmxlIGZvciBBMSwgUjIgcmVzcG9uc2libGUgZm9yCi0JCQkvLyBBMgotCQkJLy8gaWYgUjIgcmVwbGFjZXMgUjEsIHRoZW4gUjIgc3RpbGwgcmVzcG9uc2libGUgZm9yIEEyCi0JCQkvLyBidXQgQTEgZG9lcyBub3QgaGF2ZSBhIHJlc3BvbnNpYmxlIHJvbGUgKG5vdCBSMikKLQkJCS8vIHNvIGZvciBBMSdzIHJlc3BvbnNpYmxlIHJvbGUgb3Bwb3NpdGUgZmVhdHVyZSwKLQkJCS8vIHRoZSB2YWx1ZSBSMSBzaG91bGQgYmUgZHJvcHBlZCBpbnN0ZWFkIG9mIHJlYWxpemUgdG8gUjIKLQkJCS8vIEppbmh1YSBYaSwgMTAvMjcvMjAwNQotCQkJCi0JCQkvLyBjaGVjayB0aGUgcmVwbGFjZXIgaXMgbm90IGVub3VnaC4gSWYgdGhlIGJhc2UgZWxlbWVudCBpcyByZXBsYWNlZCwgCi0JCQkvLyBhbGwgdGhlIGNvbnRyaWJ1dG9ycyB0byB0aGUgYmFzZSBzaG91bGQgYWxzbyBiZSBjb25zaWRlcmVkIGFzIHJlcGxhY2VkLgotCQkJLy8gc28gcmVhbGl6ZSB0aGUgZWxlbWVudCwgc2VlIGlmIGl0IGlzIGEgcmVwbGFjZXIKLQkJCS8vIEJ1ZyAxOTk2ODYgLSBSZXBsYWNpbmcgcm9sZXMgZG9lcyBub3QgdXBkYXRlIHJlc3BvbnNpYmxlIHdvcmsgcHJvZHVjdCdzIHBhZ2VzCi0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgcmVwbGFjZXIgPSBudWxsOwotCQkJaWYgKCBlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50ICkgewotCQkJCS8vcmVwbGFjZXIgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldFJlcGxhY2VyKChWYXJpYWJpbGl0eUVsZW1lbnQpIGUsIHJlYWxpemVyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJcmVwbGFjZXIgPSAoVmFyaWFiaWxpdHlFbGVtZW50KUNvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoZSwgcmVhbGl6ZXIpOwotCQkJCWlmICggKHJlcGxhY2VyID09IGUpIHx8ICFDb25maWd1cmF0aW9uSGVscGVyLmlzUmVwbGFjZXIocmVwbGFjZXIpICkgewotCQkJCQlyZXBsYWNlciA9IG51bGw7Ci0JCQkJfQotCQkJCQotCQkJfQotCQkJYm9vbGVhbiBpc1ZhbHVlUmVwbGFjZWQgPSAocmVwbGFjZXIgIT0gbnVsbCk7Ci0KLQkJCWJvb2xlYW4ga2VlcCA9ICFpc1ZhbHVlUmVwbGFjZWQ7Ci0JCQlpZiAoIGlzVmFsdWVSZXBsYWNlZCAmJiAKLQkJCQkJKENvbmZpZ3VyYXRpb25IZWxwZXIuaXNFeHRlbmRSZXBsYWNlcihyZXBsYWNlcikgCi0JCQkJCXx8IEVsZW1lbnRSZWFsaXplci5pc0V4dGVuZFJlcGxhY2VFbmFibGVkKCkpICkgewotCQkJCS8vIGlmIHRoZSB2YWx1ZSBpcyByZXBsYWNlZCwgYnV0IHRoZSBvdXQgZ29pbmcgZmVhdHVyZSBpcyBpbmhlcml0ZWQgYnkgdGhlIHJlcGxhY2VyCi0JCQkJLy8gdGhlbiB3ZSBzaG91bGQga2VlcCB0aGlzIHZhbHVlLCBzbyB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgZmVhdHVyZSB2YWx1ZSAKLQkJCQkvLyBvZiB0aGUgcmVwbGFjZXIKLQkJCQlpZiAoIGYuaXNNYW55KCkgKSB7Ci0JCQkJCUxpc3QgaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyZXBsYWNlciwgZiwgcmVhbGl6ZXIpOwotCQkJCQlrZWVwID0gaXRlbXMuY29udGFpbnMob3duZXIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgaXRlbSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKHJlcGxhY2VyLCBmLCByZWFsaXplcik7Ci0JCQkJCWtlZXAgPSAoaXRlbSA9PSBvd25lcik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBpZiB0aGUgdmFsdWUncyBmZWF0dXJlIHRvIHRoaXMgZWxlbWVudCBpcyB0by1vbmUsIAotCQkJLy8gdGhlbiB0aGlzIHZhbHVlJ3MgZmVhdHVyZSB2YWx1ZSBzaG91bGQgYmUgdGhlIGVsZW1lbnQsCi0JCQkvLyBvdGhlcndpc2UgZHJvcCB0aGUgdmFsdWUKLQkJCS8vIGZvciBleGFtcGxlLCAKLQkJCS8vIFQxIC0+IFIxIChwcmltYXJ5IHBlcmZvcm1hZXIpCi0JCQkvLyBUMiAtPiBSMgotCQkJLy8gVDIgY29udHJpYnV0ZXMgdG8gVDEKLQkJCS8vIHNpbmNlIFQxIGFscmVhZHkgaGFzIFIxLCBzbyBSMiBpcyBkcm9wZWQKLQkJCS8vIHNvIHdoZW4gY2FsY3VsYXRpbmcgUjIncyBwZXJmb3JtaW5nIHRhc2tzLCBUMSBzaG91bGQgbm90IGJlIGluY2x1ZGVkCi0JCQlpZiAoIGtlZXAgKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCB2ZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoZSwgcmVhbGl6ZXIpOwotCQkJCWlmICggdmUgIT0gbnVsbCApIHsKLQkJCQkJCi0JCQkJCS8vIGNoZWNrIGlmIHRoaXMgaXMgYSB0by1vbmUgZmVhdHVyZSwgY3VycmVudGx5IG9ubHkgVGFzay0+UHJpbWFyeSBSb2xlIGFuZCBURCAtPiBQcmltYXJ5IFJECi0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmMSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0MDFGZWF0dXJlKG9mKTsKLQkJCQkJaWYgKCBmMSAhPSBudWxsICkgewotCQkJCQkJTWV0aG9kRWxlbWVudCBpdGVtID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodmUsIGYxLCByZWFsaXplcik7Ci0JCQkJCQkKLQkJCQkJCS8vIGlmIHRoZSB2YWx1ZSBlbGVtZW50J3MgdG8tb25lIGZlYXR1cmUgdmFsdWUgaXRlbSBpcyBub3QgdGhlIGN1cnJlbnQgZWxlbWVudCwgCi0JCQkJCQkvLyB0aGVuIHRoZSBlbGVtZW50J3Mgb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZSBzaG91bGQgbm90IGNvbnRhaW4gdGhpcyB2YWx1ZS4KLQkJCQkJCS8vIHNheSwgdGhlIHZhbHVlIGVsZW1lbnQgaXMgYSB0YXNrIGFuZCB0aGUgY3VycmVudCBlbGVtZW50IGlzIGEgcm9sZSwKLQkJCQkJCS8vIHRoZW4gaWYgdGhlIHRhc2sncyBwcmltYXJ5IHBlcmZvcm1lciAoaXRlbSBhYm92ZSkgaXMgbm90IHRoaXMgcm9sZSAodGhlIGN1cnJlbnQgZWxlbWVudCksIAotCQkJCQkJLy8gdGhlbiB0aGUgcm9sZSdzIHBlcmZvcm1pbmcgdGFza3MgKHRoZSBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlKSAKLQkJCQkJCS8vIHNob3VsZCBub3QgY29udGFpbiB0aGlzIHRhc2sgKHRoZSB2YWx1ZSwgdmUgYWJvdmUpCi0JCQkJCQlpZiAoIGl0ZW0gIT0gZWxlbWVudCkgewotCQkJCQkJCWtlZXAgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJCi0JCQlpZiAoIGtlZXAgKSB7Ci0JCQkJCQotCQkJCU1ldGhvZEVsZW1lbnQgY2UgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KGUsIHJlYWxpemVyKTsKLQotCQkJCS8vIGNhbGN1bGF0ZWQgZWxlbWVudCBjYW4gYmUgbnVsbCBpZiBpdCBjYW4ndCBzaG93Ci0JCQkJaWYgKGNlICE9IG51bGwgJiYgIXZhbHVlcy5jb250YWlucyhjZSkpIHsKLQkJCQkJdmFsdWVzLmFkZChjZSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkKLQkJCS8vIGlmIHRoZSBlbGVtZW50IGUgaGFzIGV4dGVuZGVycyBhbmQgdGhlIGV4dGVuZGVyJ3MgZmVhdHVyZSBpcyB0aGUgb3duZXIgZWxlbWVudCwgCi0JCQkvLyB0aGVuIHdlIGFsc28gbmVlZCB0byBpbmNsdWRlIHRoZSBleHRlbmRlcgotCQkJcHJvY2Vzc0V4dGVuZGVycyhlLCBmKTsKLQkJfQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NFeHRlbmRlcnMoTWV0aG9kRWxlbWVudCBlLCBFU3RydWN0dXJhbEZlYXR1cmUgZikgewotCQlpZiAoICEoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpZTsKLQkJCi0JCUxpc3QgaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldEV4dGVuZGVycyggdmUsIHJlYWxpemVyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCWlmICggaXRlbXMuc2l6ZSgpID4gMCApIHsJCQotCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RFbGVtZW50IG1lID0gKE1ldGhvZEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQlib29sZWFuIGtlZXAgPSBmYWxzZTsKLQkJCQlpZiAoIGYuaXNNYW55KCkgKSB7Ci0JCQkJCUxpc3QgdnggPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShtZSwgZiwgcmVhbGl6ZXIpOwotCQkJCQkvLyBpZiB0aGUgdmFsdWUgY29udGFpbnMgdGhlIG93bmVyIGVsZW1lbnQsIHRoZW4gaW5jbHVkZSBpdAotCQkJCQlrZWVwID0gKHZ4ICE9IG51bGwpICYmIHZ4LmNvbnRhaW5zKHN1cGVyLmVsZW1lbnQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgdiA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKG1lLCBmLCByZWFsaXplcik7Ci0JCQkJCQotCQkJCQkvLyBpZiB0aGUgZmVhdHVyZSB2YWx1ZSBpcyB0aGUgb3duZXIgZWxlbWVudCwgdGhlbiB0aGlzIHZhbHVlIHNob3VsZCBiZSBpbmNsdWRlZAotCQkJCQlrZWVwID0gKHYgPT0gc3VwZXIuZWxlbWVudCk7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChrZWVwICYmICFzdXBlci52YWx1ZXMuY29udGFpbnMobWUpICkgewotCQkJCQlzdXBlci52YWx1ZXMuYWRkKG1lKTsKLQkJCQkJcHJvY2Vzc0V4dGVuZGVycyhtZSwgZik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBhIGNvbnRyaWJ1dG9yIG9yIHJlcGxhY2VyLCBhbHNvIG5lZWQgdG8gY2hlY2sgdGhlIGV4dGVuZGVycyBvZiB0aGUgYmFzZSBlbGVtZW50Ci0JCWlmICggQ29uZmlndXJhdGlvbkhlbHBlci5pc0NvbnRyaWJ1dG9yKHZlKSB8fCBDb25maWd1cmF0aW9uSGVscGVyLmlzUmVwbGFjZXIodmUpICkgewotCQkJcHJvY2Vzc0V4dGVuZGVycyh2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksIGYpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vVG9PbmVGZWF0dXJlVmFsdWUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1RvT25lRmVhdHVyZVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYWNmMDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vVG9PbmVGZWF0dXJlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiByZWFsaXplZCBmZWF0dXJlIHZhbHVlIGZvciBhIHRvLW9uZSBmZWF0dXJlCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVG9PbmVGZWF0dXJlVmFsdWUgZXh0ZW5kcyBGZWF0dXJlVmFsdWUgewotCi0JLy8gbWFwIG9mIGVsZW1lbnQgYW5kIHRoZSB2YWx1ZQotCUxpbmtlZEhhc2hNYXAgdmFsdWVNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCi0JLyoqCi0JICogY29uc3RydWN0IHRoZSBvYmplY3QgZm9yIGEgdG8tb25lIGZlYXR1cmUgdmFsdWUKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBvd25lckVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSByZWFsaXplcgotCSAqLwotCXB1YmxpYyBUb09uZUZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LCBPYmplY3QgZmVhdHVyZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCXN1cGVyKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRmVhdHVyZVZhbHVlI2FkZChWYXJpYWJpbGl0eUVsZW1lbnQsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoVmFyaWFiaWxpdHlFbGVtZW50IG93bmVyLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKCAodmFsdWUgPT0gbnVsbCkgfHwgISh2YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpICkgewkKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gc2luY2UgdGhpcyBpcyBhIHRvIG9uZSBhc3NvY2lhdGlvbiwgaWYgdGhlIGJhc2Ugb2YgdGhlIG93bmVyIGFscmVhZHkgaGFzIG9uZSwgCi0JCS8vIG5vIGNvbnRyaWJ1dGluZyB2YWx1ZSBzaG91bGQgYmUgYWRkZWQKLQkJLy8gMTcyNjAyIC0gVmFyaWFiaWxpdHk6IFByaW1hcnkgcm9sZSBtaXNzaW5nIGluIHRoZSB0cmFuc2l0aXZlIGNhc2Ugb2YgY29udHJpYnV0aW5nIHRhc2tzCi0JCWlmICggQ29uZmlndXJhdGlvbkhlbHBlci5pc0NvbnRyaWJ1dG9yKG93bmVyKSApIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gb3duZXIuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKCBiYXNlICE9IG51bGwgJiYgdmFsdWVNYXAuY29udGFpbnNLZXkoYmFzZSkgKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQkvL01ldGhvZEVsZW1lbnQgZSA9IHN1cGVyLnJlYWxpemVyLnJlYWxpemUoKE1ldGhvZEVsZW1lbnQpdmFsdWUpOwotCQlNZXRob2RFbGVtZW50IGUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KChNZXRob2RFbGVtZW50KXZhbHVlLCBzdXBlci5yZWFsaXplcik7Ci0JCQotCQlpZiAoIGUgIT0gbnVsbCApIHsKLQkJCU9iamVjdCBrZXkgPSAob3duZXI9PW51bGwpID8gZWxlbWVudCA6IG93bmVyOwotCQkJaWYgKCAhdmFsdWVNYXAuY29udGFpbnNLZXkoa2V5KSApIHsKLQkJCQl2YWx1ZU1hcC5wdXQoa2V5LCBlKTsKLQkJCX0KLQkJfQkJCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5GZWF0dXJlVmFsdWUjZ2V0VmFsdWUoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCQotCQlPYmplY3QgdiA9IG51bGw7Ci0JCWlmICggc2l6ZSgpID09IDAgKSB7Ci0JCQlyZXR1cm4gdjsKLQkJfQotCQkKLQkJT2JqZWN0W10gZW50cmllcyA9IHZhbHVlTWFwLmVudHJ5U2V0KCkudG9BcnJheSgpOwotCQlpZiAoIHNpemUoKSA9PSAxICkgewotCQkJLy8gaWYganVzdCBvbmUgZW50cnksIHJldHVybiBpdAotCQkJdiA9ICgoTWFwLkVudHJ5KWVudHJpZXNbMF0pLmdldFZhbHVlKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBpZiBtb3JlIHRoYW4gb25lIGVudHJ5LCBpZiB0aGUgZmlyc3QgZW50cnkgaXMgZnJvbSB0aGUgZWxlbWVudCBpdHNlbGYsIHRoZW4gcmV0dXJuIHRoZSB2YWx1ZQotCQkJLy8gb3RoZXJ3aXNlLCByZXR1cm4gbnVsbAotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSllbnRyaWVzWzBdOwotCQkJaWYgKCBlbnRyeS5nZXRLZXkoKSA9PSBzdXBlci5lbGVtZW50ICkgewotCQkJCXYgPSAgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKCBpc0V4dGVuZFJlcGxhY2VFbmFibGVkKCkgKSB7Ci0JCQlpZiAoIGlzQmxhbmtJbmRpY2F0b3IodikgKSB7Ci0JCQkJLy8gcmVtb3ZlIHRoZSBfTlVMTF8gaXRlbS4gdGhhdCBpcyB1c2VkIGFzIGFuIGluZGljYXRvciB0byBibGFuayBvdXQgdGhlIGJhc2UgCi0JCQkJLy8gZm9yIHRoZSBleHRlbmQtcmVwbGFjZQotCQkJCXYgPSBudWxsOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdjsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB2YWx1ZU1hcC5zaXplKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Ub09uZU9wcG9zaXRlRmVhdHVyZVZhbHVlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Ub09uZU9wcG9zaXRlRmVhdHVyZVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOTY1MzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vVG9PbmVPcHBvc2l0ZUZlYXR1cmVWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci0KLS8qKgotICogcmVhbGl6ZWQgZmVhdHVyZSB2YWx1ZSBmb3IgYSB0by1vbmUgb3Bwb3NpdGUgZmVhdHVyZQotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFRvT25lT3Bwb3NpdGVGZWF0dXJlVmFsdWUgZXh0ZW5kcyBUb09uZUZlYXR1cmVWYWx1ZSB7Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gcmVhbGl6ZXIKLQkgKi8KLQlwdWJsaWMgVG9PbmVPcHBvc2l0ZUZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIE9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJc3VwZXIoZWxlbWVudCwgbnVsbCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uVG9PbmVGZWF0dXJlVmFsdWUjYWRkKFZhcmlhYmlsaXR5RWxlbWVudCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChWYXJpYWJpbGl0eUVsZW1lbnQgb3duZXIsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoICh2YWx1ZSA9PSBudWxsKSB8fCAhKHZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgKSB7CQotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBSZXBsYWNlIGRvZXMgbm90IGNvbXBsZXRlbHkgcmVtb3ZlIG91dGdvaW5nCi0JCS8vIGFzc29jaWF0aW9ucwotCQkvLyBpZiB0aGUgb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZSBoYXMgcmVwbGFjZXIgaW4gdGhlCi0JCS8vIGNvbmZpZ3VyYXRpb24KLQkJLy8gaXQncyBvdXRnb2luZyBhc3NvY2lhdGlvbnMgKGkuZS4sIHRoaXMgZWxlbWVudCkgd2lsbCBiZQotCQkvLyByZXBsYWNlZCBieSB0aGUgcmVwbGFjaW5nIGVsZW1lbnQKLQkJLy8gYXMgYSByZXN1bHQsIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlIHNob3VsZCBkcm9wIHRoZQotCQkvLyByZXBsYWNlZCBlbGVtZW50Ci0JCS8vCi0JCS8vIGZvciBleGFtcGxlLCBSMSAtPiByZXNwb25zaWJsZSBmb3IgQTEsIFIyIHJlc3BvbnNpYmxlIGZvciBBMgotCQkvLyBpZiBSMiByZXBsYWNlcyBSMSwgdGhlbiBSMiBzdGlsbCByZXNwb25zaWJsZSBmb3IgQTIKLQkJLy8gYnV0IEExIGRvZXMgbm90IGhhdmUgYSByZXNwb25zaWJsZSByb2xlIChub3QgUjIpCi0JCS8vIHNvIGZvciBBMSdzIHJlc3BvbnNpYmxlIHJvbGUgb3Bwb3NpdGUgZmVhdHVyZSwKLQkJLy8gdGhlIHZhbHVlIFIxIHNob3VsZCBiZSBkcm9wcGVkIGluc3RlYWQgb2YgcmVhbGl6ZSB0byBSMgotCQkvLyBKaW5odWEgWGksIDEwLzI3LzIwMDUKLQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIHZhbHVlOwotCQlib29sZWFuIGlzVmFsdWVSZXBsYWNlZCA9IChlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KQotCQkJCSYmIChDb25maWd1cmF0aW9uSGVscGVyLmdldFJlcGxhY2VyKChWYXJpYWJpbGl0eUVsZW1lbnQpIGUsIHJlYWxpemVyLmdldENvbmZpZ3VyYXRpb24oKSkgIT0gbnVsbCk7Ci0JCWlmICghaXNWYWx1ZVJlcGxhY2VkKSB7Ci0JCQkvLyBjb250cmlidXRvciBjYW4ndCBjb250cmlidXRlIDAuLjEgcmVmZXJlbmNlIGlmIGJhc2UKLQkJCS8vIGFscmVhZHkgaGFzIG9uZSwKLQkJCS8vIG9yIGlmIG1vcmUgdGhhbiBvbmUgY29udHJpYnV0b3IgaGFzIHRoZSB2YWx1ZS4KLQkJCS8vIGZvciBleGFtcGxlLCBpZiB0aGUgYmFzZSB0YXNrIGhhcyBubyBkaXNjaXBsaW5lLCBhbmQgb25seQotCQkJLy8gb25lIG9mIGl0J3MgY29udHJpYnV0b3JzIGhhcyBkaXNjaXBsaW5lLAotCQkJLy8gdGhlbiB0aGF0IGNvbnRyaWJ1dG9yJ3MgZGlzY2lwbGluZSB3aWxsIGJlIHVzZWQsCi0JCQkvLyBvdGhlcndpc2UsIG5vIGRpc2NpcGxpbmUKLQotCQkJLy8gcmlnaHQgbm93LCB3ZSBjYW4ndCBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgbW9yZSB0aGVuIG9uZQotCQkJLy8gY29udHJpYnV0b3JzIGhhcyB0aGUgdmFsdWUKLQkJCS8vIHNvIHdlIGlnbm9yZSBjb250cmlidXRvcidzIDAxIGltY29taW5nIHZhbHVlCi0JCQkKLQkJCS8vIChTdWJtaXQpOiBJbmFiaWxpdHkgdG8gYWRkIHJlc3BvbnNpYmxlIGZvciByZWxhdGlvbnNoaXAgdG8gYSB3b3JrIHByb2R1Y3QKLQkJCS8vIG5lZWQgdG8gZml4IHRoaXMgaXNzdWUuIGFsd2F5cyB0YWtlIHRoZSBmaXJzdCBvbmUuCi0JCQllID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChlLCByZWFsaXplcik7Ci0JCQlpZiAoIGUgIT0gbnVsbCApIHsKLQkJCQlPYmplY3Qga2V5ID0gKG93bmVyPT1udWxsKSA/IGVsZW1lbnQgOiBvd25lcjsKLQkJCQlpZiAoICF2YWx1ZU1hcC5jb250YWluc0tleShrZXkpICkgewotCQkJCQl2YWx1ZU1hcC5wdXQoa2V5LCBlKTsKLQkJCQl9Ci0JCQl9CQkKLQkJfQotCQkKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRmVhdHVyZVZhbHVlI2dldFZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQkKLQkJT2JqZWN0IHYgPSBudWxsOwotCQkKLQkJaWYgKCBzaXplKCkgPT0gMCApIHsKLQkJCXJldHVybiB2OwotCQl9Ci0JCQotCQlPYmplY3RbXSBlbnRyaWVzID0gdmFsdWVNYXAuZW50cnlTZXQoKS50b0FycmF5KCk7Ci0JCWlmICggc2l6ZSgpID09IDEgKSB7Ci0JCQkvLyBpZiBqdXN0IG9uZSBlbnRyeSwgcmV0dXJuIGl0Ci0JCQl2ID0gKChNYXAuRW50cnkpZW50cmllc1swXSkuZ2V0VmFsdWUoKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGlmIG1vcmUgdGhhbiBvbmUgZW50cnksIGlmIHRoZSBmaXJzdCBlbnRyeSBpcyBmcm9tIHRoZSBlbGVtZW50IGl0c2VsZiwgdGhlbiByZXR1cm4gdGhlIHZhbHVlCi0JCQkvLyBvdGhlcndpc2UsIHJldHVybiBudWxsCi0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWVudHJpZXNbMF07Ci0JCQlpZiAoIGVudHJ5LmdldEtleSgpID09IHN1cGVyLmVsZW1lbnQgKSB7Ci0JCQkJdiA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmICggaXNFeHRlbmRSZXBsYWNlRW5hYmxlZCgpICkgewotCQkJaWYgKCBpc0JsYW5rSW5kaWNhdG9yKHYpICkgewotCQkJCS8vIHJlbW92ZSB0aGUgX05VTExfIGl0ZW0uIHRoYXQgaXMgdXNlZCBhcyBhbiBpbmRpY2F0b3IgdG8gYmxhbmsgb3V0IHRoZSBiYXNlIAotCQkJCS8vIGZvciB0aGUgZXh0ZW5kLXJlcGxhY2UKLQkJCQl2ID0gbnVsbDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHY7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9DbG9zdXJlTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvQ2xvc3VyZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxODZhZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9DbG9zdXJlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZTsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotCi0vKioKLSAqICBCYXNlIGNsYXNzIGZvciBsaXN0ZW5lcnMgdGhhdCBsaXN0ZW4gdG8gYSBDb25maWd1cmF0aW9uQ2xvc3VyZSBmb3IgZXJyb3JzCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbG9zdXJlTGlzdGVuZXIgaW1wbGVtZW50cyBFdmVudExpc3RlbmVyIHsKLQotCS8vIGVycm9yIHJlbW92ZWQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9SRU1PVkVEID0gMDsKLQkKLQkvLyBlcnJvciBhZGRlZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0FEREVEID0gMTsKLQotCS8vIGVycm9yIGNoYW5nZWQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9VUERBVEVEID0gMjsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVycm9yUmVtb3ZlZChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgSUNvbmZpZ3VyYXRpb25FcnJvciBlcnJvcik7Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBlcnJvckFkZGVkKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBJQ29uZmlndXJhdGlvbkVycm9yIGVycm9yKTsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVycm9yVXBkYXRlZChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgSUNvbmZpZ3VyYXRpb25FcnJvciBlcnJvcik7Ci0JCi0JcHVibGljIHZvaWQgZmlyZUV2ZW50KGludCB0eXBlLCBmaW5hbCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgZmluYWwgSUNvbmZpZ3VyYXRpb25FcnJvciBlcnJvcikgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgRVJST1JfUkVNT1ZFRDoKLQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWVycm9yUmVtb3ZlZChjb25maWcsIGVycm9yKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9BRERFRDoKLQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWVycm9yQWRkZWQoY29uZmlnLCBlcnJvcik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfVVBEQVRFRDoKLQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWVycm9yVXBkYXRlZChjb25maWcsIGVycm9yKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9Db25maWd1cmF0aW9uQ2xvc3VyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9Db25maWd1cmF0aW9uQ2xvc3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2IzZjQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvQ29uZmlndXJhdGlvbkNsb3N1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUNvbmZpZ3VyYXRpb25DbG9zdXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklDb25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci0KLS8qKgotICogQSBtZXRob2QgY29uZmlndXJhdGlvbiBjbG9zdXJlLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uQ2xvc3VyZSBpbXBsZW1lbnRzIElDb25maWd1cmF0aW9uQ2xvc3VyZSB7Ci0KLQkvLyBJZiB0cnVlLCBnZW5lcmF0ZSBkZWJ1ZyB0cmFjZXMuCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gbnVsbDsKLQotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlnTWFuYWdlciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgRGVwZW5kZW5jeU1hbmFnZXIgZGVwZW5kZW5jeU1hbmFnZXIgPSBudWxsOwotCQotCXByb3RlY3RlZCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvLyBOb2RlIGNoYW5nZSBpbmZvcm1hdGlvbi4gVGhlIG9iamVjdCBhcmUgdGhlIG1vZGVsIG9iamVjdHMKLQkvLyBjaGVjayB0aGUgbGlua2VkIG9iamVjdHMgaW4gbmVlZGVkCi0JcHJvdGVjdGVkIExpc3Qgc2VsZWN0ZWROb3RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlwcml2YXRlIExpc3Q8RWxlbWVudEVycm9yPiBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnRFcnJvcj4oKTsKLQkKLQkvLyBBIG1hcCBvZiBpbnZhbGlkIG5vZGVzIHRvIEVsZW1lbnREZXBlbmRlbmN5RXJyb3Igb2JqZWN0cy4KLQlwcm90ZWN0ZWQgTWFwPE9iamVjdCwgRWxlbWVudERlcGVuZGVuY3lFcnJvcj4gaW52YWxpZE5vZGVzTWFwID0KLQkJbmV3IEhhc2hNYXA8T2JqZWN0LCBFbGVtZW50RGVwZW5kZW5jeUVycm9yPigpOwotCi0JLy9wcm90ZWN0ZWQgTGlzdCBjaGFuZ2VkTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHJpdmF0ZSBMaXN0PENsb3N1cmVMaXN0ZW5lcj4gbGlzdGVuZXJzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uTWdyCi0JICogCQkJICBUaGUgSUFjdGlvbk1hbmFnZXIgdG8gdXNlIHRvIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbi4gIElmIG51bGwsIGNvbmZpZyB3aWxsIGJlIGNoYW5nZWQgZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgQSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkNsb3N1cmUoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJdGhpcy5hY3Rpb25NZ3IgPSBhY3Rpb25NZ3I7Ci0KLQkJY29uZmlnTWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoCi0JCQkJY29uZmlnKTsKLQkJaWYgKGNvbmZpZ01hbmFnZXIgIT0gbnVsbCkgewotCQkJbGlicmFyeSA9IGNvbmZpZ01hbmFnZXIuZ2V0TWV0aG9kTGlicmFyeSgpOwotCQkJZGVwZW5kZW5jeU1hbmFnZXIgPSBjb25maWdNYW5hZ2VyLmdldERlcGVuZGVuY3lNYW5hZ2VyKCk7Ci0JCX0KLQotCQkvLyBjb25maWd1cmF0aW9uIGNoYW5nZWQsIHJlLWJ1aWxkIHRoZSBhbmFseXplIHRoZSBjb25maWd1cmF0aW9uIGZvciBlcnJvcnMKLQkJY2hlY2tFcnJvcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiBBIDxjb2RlPkNvbmZpZ3VyYXRpb25NYW5hZ2VyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkgewotCQlyZXR1cm4gY29uZmlnTWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgPGNvZGU+TWV0aG9kQ29uZmlndXJhdGlvbjwvY29kZT4uCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250YWluaW5pbmcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBBIDxjb2RlPk1ldGhvZENvbmZpZ3VyYXRpb248L2NvZGU+LgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldExpYnJhcnkoKSB7Ci0JCXJldHVybiBsaWJyYXJ5OwotCX0KLQotLy8JLyoqCi0vLwkgKiBTZXRzIHRoZSBtZXRob2QgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzIHNlbGVjdGlvbi4KLS8vCSAqIAotLy8JICogQHBhcmFtIGVsZW1lbnRzCi0vLwkgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIG1ldGhvZCBwbHVnLWlucyBhbmQgcGFja2FnZXMKLS8vCSAqLwotLy8JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9ucyhPYmplY3RbXSBlbGVtZW50cykgewotLy8JCQotLy8JCWlmICggZWxlbWVudHMgPT0gbnVsbCApIHsKLS8vCQkJcmV0dXJuOwotLy8JCX0KLS8vCQkKLS8vCQkvLyBjbGVhciB0aGUgb2xkIHNlbGVjdGlvbnMKLS8vCQlzZWxlY3RlZE5vdGVzLmNsZWFyKCk7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKyApIHsKLS8vCQkJc2VsZWN0ZWROb3Rlcy5hZGQoZWxlbWVudHNbaV0pOwotLy8JCX0KLS8vCX0KLQotCQotCS8qKgotCSAqIEJ1aWxkcyB0aGUgc2VsZWN0aW9uIGxpc3QgYmFzZWQgb24gdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrRXJyb3IoKSB7Ci0JCQotCQkvLyBCdWcgMjA2NzI0IC0gU0NNOiBBbHdheXMgcHJvbXB0IGNoZWNrIG91dCBlbGVtZW50cyBmb3IgYSBvcGVuZWQgY29uZmlndXJhdGlvbiB3aGVuIHJlZnJlc2ggc291cmNlIGNvbnRyb2wgc3RhdHVzCi0JCS8vIGRvbid0IG5lZWQgdG8gdmFsaWRhdGUgdGhlIGNvbmZpZ3VyYXRpb24sIHJlbHkgb24gdGhlIGNhbGxlciB0byB2YWxpZGF0ZSBpdCBiZWZvcmUgY2FsbCB0aGlzIG1ldGhvZC4KLQkJLy8gVmFsaWRhdGUgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIHdpdGggdGhlIGFjdGlvbiBtYW5hZ2VyLgotCQkvL0xpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihhY3Rpb25NZ3IsIGNvbmZpZyk7Ci0KLQkJLy8gaW5pdGlhbCBmaWxsIHRoZSBzZWxlY3Rpb25zCi0JCXNlbGVjdGVkTm90ZXMuY2xlYXIoKTsKLQkJc2VsZWN0ZWROb3Rlcy5hZGRBbGwoY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpKTsKLQkJc2VsZWN0ZWROb3Rlcy5hZGRBbGwoY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSk7Ci0KLQkJLy8gUmUtYnVpbGQgdGhlIHNlbGVjdGlvbnMgdG8gYXV0byBhZGQgdGhlIHByb2Nlc3MgcGFja2FnZXMuCi0JCWNsZWFyRXJyb3JNYXJrcygpOwotCQkKLQkJLy8gQ2xlYW51cCB0aGUgb2xkIHN0YXR1cyBhbmQgcmVidWlsZCB0aGUgbGlzdC4KLQkJaW52YWxpZE5vZGVzTWFwLmNsZWFyKCk7Ci0KLQkJcHJvY2Vzc0NoYW5nZWROb2RlcyhnZXRTZWxlY3Rpb24oKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJFcnJvck1hcmtzKCkgewotCQkvLyBSZS1idWlsZCB0aGUgc2VsZWN0aW9ucyB0byBhdXRvIGFkZCB0aGUgcHJvY2VzcyBwYWNrYWdlcy4KLQotCQlmb3IgKEl0ZXJhdG9yPEVsZW1lbnRFcnJvcj4gaXQgPSBlcnJvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCUVsZW1lbnRFcnJvciBlcnJvciA9IGl0Lm5leHQoKTsKLQkJCW5vdGlmeUVycm9yKGVycm9yLCBDbG9zdXJlTGlzdGVuZXIuRVJST1JfUkVNT1ZFRCk7Ci0JCX0JCi0JfQotCQotLy8JcHJpdmF0ZSB2b2lkIHNlbGVjdFByb2Nlc3NQYWNrYWdlcyhBY3Rpdml0eSBhKSB7Ci0vLwkJaWYgKGEgPT0gbnVsbCkgewotLy8JCQlyZXR1cm47Ci0vLwkJfQotLy8KLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLS8vCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0Lm5leHQoKTsKLS8vCQkJT2JqZWN0IHBrZyA9IGUuZUNvbnRhaW5lcigpOwotLy8JCQlpZiAoIXNlbGVjdGVkTm90ZXMuY29udGFpbnMocGtnKSkgewotLy8JCQkJc2VsZWN0ZWROb3Rlcy5hZGQocGtnKTsKLS8vCQkJCWNoYW5nZWROb2Rlcy5hZGQocGtnKTsKLS8vCQkJfQotLy8KLS8vCQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotLy8JCQkJc2VsZWN0UHJvY2Vzc1BhY2thZ2VzKChBY3Rpdml0eSkgZSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwl9Ci0KLS8vCS8qKgotLy8JICogQWRkcyBhIG1ldGhvZCBwbHVnLWluIG9yIHBhY2thZ2UgdG8gdGhlIGNsb3N1cmUuCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSBlbGVtZW50Ci0vLwkgKiAgICAgICAgICAgIEEgbWV0aG9kIGVsZW1lbnQuCi0vLwkgKiBAcGFyYW0gYWRkQ2hpbGRyZW4KLS8vCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGFkZCBhbGwgY2hpbGQgbWV0aG9kIGVsZW1lbnRzLgotLy8JICovCi0vLwlwcml2YXRlIHZvaWQgYWRkKEVPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBhZGRDaGlsZHJlbikgewotLy8JCWlmICghTGlicmFyeVV0aWwuc2VsZWN0YWJsZShlbGVtZW50KSkgewotLy8JCQlyZXR1cm47Ci0vLwkJfQotLy8KLS8vCQlpZiAoIXNlbGVjdGVkTm90ZXMuY29udGFpbnMoZWxlbWVudCkpIHsKLS8vCQkJc2VsZWN0ZWROb3Rlcy5hZGQoZWxlbWVudCk7Ci0vLwotLy8JCQkvLyBTYXZlIHRoZSBjaGFuZ2VkIG5vZGVzIHNvIHRoYXQgd2UgY2FuIHVwZGF0ZSB0aGUgc3RhdHVzIGxhdGVyLgotLy8JCQlhZGRDaGFuZ2VkKGVsZW1lbnQpOwotLy8KLS8vCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLS8vCQkJCXNlbGVjdFN5c3RlbVBhY2thZ2VzKChNZXRob2RQbHVnaW4pIGVsZW1lbnQpOwotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCQkvLyBBZGQgdGhlIHBhcmVudCBtZXRob2QgZWxlbWVudCBhcyB3ZWxsLgotLy8JCUVPYmplY3QgcGFyZW50ID0gZWxlbWVudC5lQ29udGFpbmVyKCk7Ci0vLwkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgIXNlbGVjdGVkTm90ZXMuY29udGFpbnMocGFyZW50KSkgewotLy8JCQlhZGQocGFyZW50LCBmYWxzZSk7Ci0vLwkJfQotLy8KLS8vCQkvLyBBZGQgY2hpbGRyZW4gYXMgbmVlZGVkLgotLy8JCWlmIChhZGRDaGlsZHJlbikgewotLy8JCQlFTGlzdCBlbGVtZW50cyA9IGVsZW1lbnQuZUNvbnRlbnRzKCk7Ci0vLwkJCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0vLwkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotLy8JCQkJCUVPYmplY3QgY2hpbGQgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotLy8JCQkJCWFkZChjaGlsZCwgdHJ1ZSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwl9Ci0vLwotLy8JcHJpdmF0ZSB2b2lkIGFkZENoYW5nZWQoT2JqZWN0IGVsZW1lbnQpIHsKLS8vCQlpZiAoIWNoYW5nZWROb2Rlcy5jb250YWlucyhlbGVtZW50KSkgewotLy8JCQljaGFuZ2VkTm9kZXMuYWRkKGVsZW1lbnQpOwotLy8JCX0KLS8vCX0KLQotLy8JcHJpdmF0ZSB2b2lkIHNlbGVjdFN5c3RlbVBhY2thZ2VzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLS8vCQlMaXN0IHBrZ3MgPSBUbmdVdGlsLmdldEFsbFN5c3RlbVBhY2thZ2VzKHBsdWdpbik7Ci0vLwkJZm9yIChJdGVyYXRvciBpdCA9IHBrZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotLy8JCQlFT2JqZWN0IHBrZyA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0vLwkJCWFkZChwa2csIGZhbHNlKTsKLS8vCQl9Ci0vLwl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIG1ldGhvZCBwbHVnLWluIG9yIHBhY2thZ2UgaXMgc2VsZWN0ZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBzZWxlY3RlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKE9iamVjdCBpbnB1dCkgewotCQlpZiAoKGlucHV0IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgfHwgaW5wdXQgPT0gY29uZmlnCi0JCQkJfHwgc2VsZWN0ZWROb3Rlcy5jb250YWlucyhpbnB1dCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBlbGVtZW50IGRlcGVuZGVuY3kgZXJyb3IgZm9yIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQGVsZW1lbnQgQSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIEFuIDxjb2RlPkVsZW1lbnREZXBlbmRlbmN5RXJyb3I8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBFbGVtZW50RGVwZW5kZW5jeUVycm9yIGdldEVycm9yKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBnZXRFcnJvcihlbGVtZW50LCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBFbGVtZW50RGVwZW5kZW5jeUVycm9yIGdldEVycm9yKE9iamVjdCBlbGVtZW50LCBib29sZWFuIGNyZWF0ZSkgewotCQlFbGVtZW50RGVwZW5kZW5jeUVycm9yIGVycm9yID0gKEVsZW1lbnREZXBlbmRlbmN5RXJyb3IpIGludmFsaWROb2Rlc01hcAotCQkJCS5nZXQoZWxlbWVudCk7Ci0JCWlmIChlcnJvciA9PSBudWxsICYmIGNyZWF0ZSkgewotCQkJZXJyb3IgPSBuZXcgRWxlbWVudERlcGVuZGVuY3lFcnJvcihlbGVtZW50KTsKLQkJCWludmFsaWROb2Rlc01hcC5wdXQoZWxlbWVudCwgZXJyb3IpOwotCQl9Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGVyZSBpcyBlcnJvciBpbiB0aGlzIGNvbmZpZ3VyYXRpb24gY2xvc3VyZQotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0Vycm9yKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW52YWxpZE5vZGVzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZXJyb3IgPSAoRWxlbWVudERlcGVuZGVuY3lFcnJvcikgaXQubmV4dCgpOwotCQkJaWYgKGVycm9yLmlzRXJyb3IoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGVyZSBpcyBhbnkgcHJvYmxlbSAoZXJyb3Ivd2FybmluZykgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24gY2xvc3VyZS4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcm9ibGVtKCkgewotCQlyZXR1cm4gaW52YWxpZE5vZGVzTWFwLnNpemUoKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIGVycm9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgYSBsaXN0IG9mIDxjb2RlPlBhY2thZ2VFcnJvcjwvY29kZT4uCi0JICovCi0JcHVibGljIExpc3Q8UGFja2FnZUVycm9yPiBnZXRBbGxFcnJvcnMoKSB7Ci0JCUxpc3Q8UGFja2FnZUVycm9yPiBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0PFBhY2thZ2VFcnJvcj4oKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGludmFsaWROb2Rlc01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFbGVtZW50RGVwZW5kZW5jeUVycm9yIGVycm9yID0gKEVsZW1lbnREZXBlbmRlbmN5RXJyb3IpIGl0Lm5leHQoKTsKLQkJCWVycm9ycy5hZGRBbGwoZXJyb3IuZ2V0QWxsKCkpOwotCQl9Ci0JCXJldHVybiBlcnJvcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIGRlcGVuZGVuY3kgZXJyb3JzLgotCSAqIAotCSAqIEByZXR1cm4gQW4gYXJyYXkgb2YgPGNvZGU+RWxlbWVudERlcGVuZGVuY3lFcnJvcjwvY29kZT4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RGVwZW5kZW5jeUVycm9ycygpIHsKLQkJcmV0dXJuIGludmFsaWROb2Rlc01hcC52YWx1ZXMoKS50b0FycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIGludmFsaWQgZWxlbWVudHMuCi0JICogCi0JICogQHJldHVybiBBIGxpc3Qgb2YgaW52YWxpZCBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbnZhbGlkRWxlbWVudHMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0KGludmFsaWROb2Rlc01hcC5rZXlTZXQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUVycm9yKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChpbnZhbGlkTm9kZXNNYXAuY29udGFpbnNLZXkoZWxlbWVudCkpIHsKLQkJCWludmFsaWROb2Rlc01hcC5yZW1vdmUoZWxlbWVudCk7Ci0KLS8vCQkJLy8gRXJyb3Igc3RhdHVzIGNoYW5nZWQsIGFkZCBpdCB0byB0aGUgY2hhbmdlZCBsaXN0LgotLy8JCQlpZiAoIWNoYW5nZWROb2Rlcy5jb250YWlucyhlbGVtZW50KSkgewotLy8JCQkJY2hhbmdlZE5vZGVzLmFkZChlbGVtZW50KTsKLS8vCQkJfQotCQl9Ci0JfQotCi0vLwkvKioKLS8vCSAqIFJldHVybnMgYWxsIHRoZSBjaGFuZ2VkIGVsZW1lbnRzLiBUaGVzZSBhcmUgZWxlbWVudHMgd2hvc2UgY2hlY2sgc3RhdGVzCi0vLwkgKiBoYXZlIGNoYW5nZWQgb3Igd2hvc2UgaW1hZ2UgaGF2ZSBjaGFuZ2VkIGR1ZSB0byBlcnJvci4KLS8vCSAqIAotLy8JICogQHJldHVybiBBIGxpc3Qgb2YgY2hhbmdlZCBtZXRob2QgZWxlbWVudHMuCi0vLwkgKi8KLS8vCXB1YmxpYyBMaXN0IGdldENoYW5nZWRFbGVtZW50cygpIHsKLS8vCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdChjaGFuZ2VkTm9kZXMpOwotLy8JCWZvciAoSXRlcmF0b3IgaXQgPSBpbnZhbGlkTm9kZXNNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotLy8JCQlPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLS8vCQkJaWYgKCFpdGVtcy5jb250YWlucyhpdGVtKSkgewotLy8JCQkJaXRlbXMuYWRkKGl0ZW0pOwotLy8JCQl9Ci0vLwkJfQotLy8JCXJldHVybiBpdGVtczsKLS8vCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBwbHVnLWlucyBhbmQgcGFja2FnZXMgc2VsZWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gQW4gYXJyYXkgb2YgbWV0aG9kIHBsdWctaW5zIGFuZCBwYWNrYWdlcy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gc2VsZWN0ZWROb3Rlcy50b0FycmF5KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NDaGFuZ2VkTm9kZXMoT2JqZWN0W10gY2hhbmdlZE5vZGVzKSB7Ci0JCQotCQkvLyBmb3IgYWxsIHRoZSBjaGFuZ2VkIG5vdGVzLAotCQkvLyBhbGwgYWxsIGNvbnRhaW5lZCBlbGVtZW50cyBhbmQgY2hlY2sgaWYgdGhlIGVsZW1lbnRzIGFyZSBpbiBjb25maWcgb3Igbm90Ci0JCS8vIGlmIHRoZSBlbGVtZW50cyBhcmUgaW4gY29uZmlnLCB0aGUgcmVmZXJlbmNlZCBlbGVtZW50cyBzaG91bGQgYWxzbyBiZSBpbiBjb25maWcKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDxjaGFuZ2VkTm9kZXMubGVuZ3RoOyBpKyspIHsKLQkJCQotCQkJLy8gdGhlIGVsZW1lbnRzIGFyZSBlaXRoZXIgcGx1Z2luIG9yIHBhY2thZ2UKLQkJCU9iamVjdCBjaGFuZ2VkRWxlbWVudCA9IGNoYW5nZWROb2Rlc1tpXTsKLQkJCVBhY2thZ2VEZXBlbmRlbmN5IGRlcGVuZGVuY3kgPSBkZXBlbmRlbmN5TWFuYWdlcgotCQkJCQkuZ2V0RGVwZW5kZW5jeSgoTWV0aG9kRWxlbWVudCkgY2hhbmdlZEVsZW1lbnQpOwotCQkJaWYgKGRlcGVuZGVuY3kgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlMaXN0IHJlZnMgPSBkZXBlbmRlbmN5LmdldEFsbEVsZW1lbnRSZWZlcmVuY2VzKCk7Ci0JCQlpZiAoIHJlZnMgPT0gbnVsbCB8fCByZWZzLnNpemUoKSA9PSAwICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHJlZnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTsgKSB7Ci0JCQkJRWxlbWVudFJlZmVyZW5jZSByZWYgPSAoRWxlbWVudFJlZmVyZW5jZSlpdHIubmV4dCgpOwotCQkJCWNoZWNrUmVmZXJlbmNlKHJlZik7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGZvciBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBhZGRlZCBjYXRlZ29yeSwgY2hlY2sgdGhlaXIgcmVmZXJlbmNlcyBhcyB3ZWxsCi0JCWZvciAoIEl0ZXJhdG9yPE1ldGhvZEVsZW1lbnQ+IGl0ID0gY29uZmlnTWFuYWdlci5nZXRDb25maWd1cmF0aW9uRGF0YSgpCi0JCQkJLmdldEFkZGVkRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kRWxlbWVudCBlID0gaXQubmV4dCgpOwotCQkJCi0JCQlQYWNrYWdlRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gCi0JCQkJZGVwZW5kZW5jeU1hbmFnZXIuZ2V0RGVwZW5kZW5jeSgoTWV0aG9kRWxlbWVudCllLmVDb250YWluZXIoKSk7Ci0JCQlpZiAoZGVwZW5kZW5jeSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQotCQkJTGlzdCByZWZzID0gZGVwZW5kZW5jeS5nZXRBbGxFbGVtZW50UmVmZXJlbmNlcygpOwotCQkJaWYgKCByZWZzID09IG51bGwgfHwgcmVmcy5zaXplKCkgPT0gMCApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJZm9yIChJdGVyYXRvciBpdHIgPSByZWZzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7ICkgewotCQkJCUVsZW1lbnRSZWZlcmVuY2UgcmVmID0gKEVsZW1lbnRSZWZlcmVuY2UpaXRyLm5leHQoKTsKLQkJCQlpZiAoIHJlZi5nZXRFbGVtZW50KCkgPT0gZSApIHsKLQkJCQkJY2hlY2tSZWZlcmVuY2UocmVmKTsKLQkJCQl9Ci0JCQl9Ci0JCi0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjaGVja1JlZmVyZW5jZShFbGVtZW50UmVmZXJlbmNlIHJlZikgewotCQlNZXRob2RFbGVtZW50IGUgPSByZWYuZ2V0RWxlbWVudCgpOwotCQlNZXRob2RFbGVtZW50IGVfcmVmID0gcmVmLmdldFJlZkVsZW1lbnQoKTsKLQkJCi0JCWlmICggZSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UgfHwgZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24gKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIEJ1ZyAyMDc2MDkgLSBSZXBsYWNlZCBlbGVtZW50cyBhcmUgbm90IGNvbnNpZGVyZWQgZm9yIGNvbmZpZ3VyYXRpb24gZXJyb3IgIm1pc3NpbmcgbWFuZGF0b3J5IGlucHV0IgotCQkvLyBpZiB0aGUgZWxlbWVudCBpcyByZXBsYWNlZCwgaWdub3JlIHRoZSByZWZlcmVuY2UKLQkJaWYgKCBlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50ICkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHJlcGxhY2VyID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRSZXBsYWNlcigoVmFyaWFiaWxpdHlFbGVtZW50KWUsIGNvbmZpZyk7Ci0JCQlpZiAoIHJlcGxhY2VyICE9IG51bGwgKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQkvLyB0aGUgZWxlbWVudCBtaWdodCBiZSBzdWJ0cmFjdGVkLCBzbyBpZ25vcmUgaXQKLQkJaWYgKCAhQ29uZmlndXJhdGlvbkhlbHBlci5pbkNvbmZpZyhlLCBjb25maWcsIHRydWUsIGZhbHNlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQkJCi0JCS8vIGlmIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQgaXMgbm90IGluICBjb25maWcsIGxvZyBlcnJvcgotCQlpZiAoICFDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnKGVfcmVmLCBjb25maWcpKSB7Ci0JCQkKLQkJCS8qCi0JCQlTdHJpbmcgbWVzc2FnZSA9IExpYnJhcnlSZXNvdXJjZXMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkVsZW1lbnRFcnJvcl9taXNzaW5nX2VsZW1lbnQsIAotCQkJCQkobmV3IFN0cmluZ1tdIHtMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlKSwgCi0JCQkJCQkJTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZV9yZWYpIH0pKTsKLQkJCQotCQkJRWxlbWVudEVycm9yIGVycm9yID0gbmV3IEVsZW1lbnRFcnJvcigKLQkJCQkJdGhpcywgRXJyb3JJbmZvLldBUk5JTkcsCi0JCQkJCW1lc3NhZ2UsIGUsIGVfcmVmLCBFcnJvckluZm8uUkVGRVJFTkNFX1RPKTsgLy8kTk9OLU5MUy0xJAotCQkJKi8KLQkJCUVsZW1lbnRFcnJvciBlcnJvciA9IENvbmZpZ3VyYXRpb25FcnJvck1hdHJpeC5nZXRFcnJvcihjb25maWcsIHJlZik7Ci0JCQlpZiAoIGVycm9yID09IG51bGwgKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQllcnJvcnMuYWRkKGVycm9yKTsKLQkJCW5vdGlmeUVycm9yKGVycm9yLCBDbG9zdXJlTGlzdGVuZXIuRVJST1JfQURERUQpOwotCQkJCi0JCQkvLyBwcm9jZXNzIHBhY2thZ2UgZXJyb3IKLQkJCXByb2Nlc3NQYWNrYWdlRXJyb3IoTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlKSwgTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlX3JlZiksIGVycm9yLmdldEVycm9yTGV2ZWwoKSApOwotCQl9CQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1BhY2thZ2VFcnJvcihPYmplY3QgcGtnLCBPYmplY3QgcGtnX3JlZiwgaW50IGVycm9yTGV2ZWwgKSB7Ci0JCWlmICggZXJyb3JMZXZlbCA+IDAgKSB7Ci0JCQlFbGVtZW50RGVwZW5kZW5jeUVycm9yIGVycm9yID0gZ2V0RXJyb3IocGtnLCB0cnVlKTsKLQkJCQotCQkJUGFja2FnZUVycm9yIHBrZ2Vycm9yID0gZXJyb3IuZ2V0RXJyb3IocGtnX3JlZik7Ci0JCQlpZiAoIHBrZ2Vycm9yID09IG51bGwgKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBMaWJyYXJ5UmVzb3VyY2VzLmNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzE7Ci0JCi0JCQkJcGtnZXJyb3IgPSAgbmV3IFBhY2thZ2VFcnJvcihlcnJvckxldmVsLCBtZXNzYWdlLCAKLQkJCQkJCXBrZywgcGtnX3JlZiwgRXJyb3JJbmZvLlJFRkVSRU5DRV9UTyk7CQkJCQotCQkJCWVycm9yLmFkZEVycm9yKHBrZ2Vycm9yKTsKLQkJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJcGtnZXJyb3Iuc2V0RXJyb3JMZXZlbChlcnJvckxldmVsKTsKLQkJCQkKLQkJCQkvLyBuZWVkIHRvIHJlY2FsYyB0aGUgZXJyb3IgYml0cwotCQkJCWVycm9yLmNhbGN1bGF0ZUVycm9yQml0cygpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gcmVtb3ZlIHRoZSBlcnJvcgotCQkJcmVtb3ZlRXJyb3IocGtnKTsKLQkJfQotCQkKLQkJdXBkYXRlUGFyZW50c0ZvckVycm9ycygoRU9iamVjdClwa2cpOwotCi0JfQotCQotCXByaXZhdGUgdm9pZCBub3RpZnlFcnJvcihFbGVtZW50RXJyb3IgZXJyb3IsIGludCB0eXBlICkgewotCQkKLQkJaWYgKCBlcnJvciA9PSBudWxsIHx8IGxpc3RlbmVycyA9PSBudWxsIHx8IGxpc3RlbmVycy5zaXplKCkgPT0gMCApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCQkJCQkKLQkJCWZvciAoSXRlcmF0b3I8Q2xvc3VyZUxpc3RlbmVyPiBpdGVyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQ2xvc3VyZUxpc3RlbmVyIGxpc3RlbmVyID0gaXRlci5uZXh0KCk7Ci0JCQkJCi0JCQkJbGlzdGVuZXIuZmlyZUV2ZW50KHR5cGUsIGNvbmZpZywgZXJyb3IpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCQotLy8JLyoqCi0vLwkgKiBWYWxpZGF0ZXMgdGhlIGVsZW1lbnQgZGVwZW5kZW5jeSB3aGVuIHRoZSBlbGVtZW50IGlzIHNlbGVjdGVkLiBXaGVuIHRoZQotLy8JICogZWxlbWVudCBpcyBzZWxlY3RlZCwgd2UgbmVlZCB0byBkbyB0aGUgZm9sbG93aW5nOiAxLiBDaGVjayBlcnJvciBmb3IKLS8vCSAqIHJlZmVyZW5jZXMgMi4gUmVtb3ZlIGVycm9yIGZvciBkZXBlbmRlbnRzIGFzc29jaWF0ZWQgd2l0aCBlbGVtZW50IDMuCi0vLwkgKiBVcGRhdGUgcGFyZW50czogaWYgdGhlIHNlbGVjdGlvbiBpcyB2YWxpZCwgcmVtb3ZlIGFsbCBlcnJvcnMgZnJvbSBwYXJlbnRzCi0vLwkgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbGVtZW50IGlmIHRoZSBzZWxlY3Rpb24gaXMgaW52YWxpZCwgc2V0IGVycm9yIHRvCi0vLwkgKiBhbGwgcGFyZW50cy4KLS8vCSAqIAotLy8JICogQHBhcmFtIGRlcGVuZGVuY3kKLS8vCSAqICAgICAgICAgICAgRWxlbWVudERlcGVuZGVuY3kKLS8vCSAqLwotLy8JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlU2VsZWN0ZWQoUGFja2FnZURlcGVuZGVuY3kgZGVwZW5kZW5jeSkgewotLy8JCU9iamVjdCBjaGFuZ2VkRWxlbWVudCA9IGRlcGVuZGVuY3kuZ2V0RWxlbWVudCgpOwotLy8KLS8vCQkvLyBTaW5jZSB0aGlzIGVsZW1lbnQgaXMgc2VsZWN0ZWQsIHJlbW92ZSBhbGwgcHJldmlvdXMgZXJyb3JzLgotLy8JCXJlbW92ZUVycm9yKGNoYW5nZWRFbGVtZW50KTsKLS8vCi0vLwkJaWYgKGNoYW5nZWRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotLy8JCQlyZXR1cm47Ci0vLwkJfQotLy8KLS8vCQkvLyBTaW5jZSB0aGlzIGVsZW1lbnQgaXMgc2VsZWN0ZWQsIGNoZWNrIGFsbCBkZXBlbmRlbmN5IGVycm9ycyBpbiB0aGUKLS8vCQkvLyBkZXBlbmRlbnQgZWxlbWVudHMuCi0vLwkJTGlzdCBkZXBlbmRlbnRzID0gZGVwZW5kZW5jeS5nZXREZXBlbmRlbnRzKCk7Ci0vLwkJaWYgKGRlcGVuZGVudHMgIT0gbnVsbCAmJiBkZXBlbmRlbnRzLnNpemUoKSA+IDApIHsKLS8vCQkJT2JqZWN0IGVsZW1lbnQ7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRyID0gZGVwZW5kZW50cy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotLy8JCQkJZWxlbWVudCA9IGl0ci5uZXh0KCk7Ci0vLwotLy8JCQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IGdldEVycm9yKGVsZW1lbnQsIGZhbHNlKTsKLS8vCQkJCWlmIChlcnJvciAhPSBudWxsKSB7Ci0vLwkJCQkJUGFja2FnZUVycm9yIHBrZ2Vycm9yID0gZXJyb3IucmVtb3ZlRXJyb3IoY2hhbmdlZEVsZW1lbnQpOwotLy8JCQkJCWlmIChlcnJvci5zaXplKCkgPT0gMCkgewotLy8JCQkJCQlyZW1vdmVFcnJvcihlbGVtZW50KTsKLS8vCi0vLwkJCQkJCS8vIENsZWFyIHRoZSBwYXJlbnQgZXJyb3IgaW50cm9kdWNlZCBieSB0aGlzIGVsZW1lbnQuCi0vLwkJCQkJCXVwZGF0ZVBhcmVudHNGb3JFcnJvcnMoKEVPYmplY3QpIGVsZW1lbnQpOwotLy8JCQkJCX0KLS8vCQkJCQkKLS8vCQkJCQkvLyBub3RpZnkgdGhlIGVycm9yIGxpc3RlbmVyIGFib3V0IHRoZSBlcnJvciByZW1vdmVkCi0vLwkJCQkJbm90aWZ5RXJyb3JSZW1vdmVkKHBrZ2Vycm9yKTsKLS8vCi0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCS8vIElmIGFuIGVsZW1lbnQgaXMgY2hlY2tlZCwgY2hlY2sgdGhlIGVsZW1lbnQgaXQgZGVwZW5kcyBvbiwKLS8vCQkvLyB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBhcyB3ZWxsLgotLy8JCUxpc3QgcmVmcyA9IGRlcGVuZGVuY3kuZ2V0UmVmZXJlbmNlcygpOwotLy8JCWlmIChyZWZzICE9IG51bGwgJiYgcmVmcy5zaXplKCkgPiAwKSB7Ci0vLwkJCVBhY2thZ2VSZWZlcmVuY2UgcmVmOwotLy8JCQlPYmplY3QgZWxlbWVudDsKLS8vCQkJZm9yIChJdGVyYXRvciBpdHIgPSByZWZzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlyZWYgPSAoUGFja2FnZVJlZmVyZW5jZSkgaXRyLm5leHQoKTsKLS8vCQkJCWVsZW1lbnQgPSByZWYuZ2V0UmVmRWxlbWVudCgpOwotLy8KLS8vCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotLy8JCQkJCWNvbnRpbnVlOwotLy8JCQkJfQotLy8KLS8vCQkJCS8vIERvbid0IHdhcm4gb24gb3B0aW9uYWwgaW5wdXRzIG5vdCBiZWluZwotLy8JCQkJLy8gcHJlc2VudCwgc28gYWRkZWQgdGhlIGNhbklnbm9yZSgpIG1ldGhvZAotLy8JCQkJaWYgKCFpc1NlbGVjdGVkKGVsZW1lbnQpICYmICFjYW5JZ25vcmUocmVmKSkgewotLy8JCQkJCVN0cmluZyBtZXNzYWdlOwotLy8JCQkJCWludCBlcnJvclR5cGUgPSAwOwotLy8JCQkJCWlmIChyZWYuaGFzQmFzZVJlZmVyZW5jZSgpKSB7Ci0vLwkJCQkJCWVycm9yVHlwZSA9IEVycm9ySW5mby5FUlJPUjsKLS8vCQkJCQkJbWVzc2FnZSA9IExpYnJhcnlSZXNvdXJjZXMuY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMjsKLS8vCQkJCQl9IGVsc2UgewotLy8JCQkJCQllcnJvclR5cGUgPSBFcnJvckluZm8uV0FSTklORzsKLS8vCQkJCQkJbWVzc2FnZSA9IExpYnJhcnlSZXNvdXJjZXMuY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMzsKLS8vCQkJCQl9Ci0vLwotLy8JCQkJCUVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZXJyb3IgPSBnZXRFcnJvcihjaGFuZ2VkRWxlbWVudCwKLS8vCQkJCQkJCXRydWUpOwotLy8JCQkJCQotLy8JCQkJCVBhY2thZ2VFcnJvciBwa2dlcnJvciA9ICBuZXcgUGFja2FnZUVycm9yKHRoaXMsIGVycm9yVHlwZSwgbWVzc2FnZSwKLS8vCQkJCQkJCWNoYW5nZWRFbGVtZW50LCBlbGVtZW50LCBFcnJvckluZm8uUkVGRVJFTkNFX1RPKTsJCQkJCi0vLwkJCQkJZXJyb3IuYWRkRXJyb3IocGtnZXJyb3IpOwotLy8KLS8vCQkJCQkvLyBub3RpZnkgdGhlIGVycm9yIGxpc3RlbmVyIGFib3V0IHRoZSBlcnJvciBhZGRlZAotLy8JCQkJCW5vdGlmeUVycm9yQWRkZWQocGtnZXJyb3IpOwotLy8KLS8vCQkJCX0gZWxzZSB7Ci0vLwkJCQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IGdldEVycm9yKGNoYW5nZWRFbGVtZW50LAotLy8JCQkJCQkJZmFsc2UpOwotLy8JCQkJCWlmIChlcnJvciAhPSBudWxsKSB7Ci0vLwkJCQkJCVBhY2thZ2VFcnJvciBwa2dlcnJvciA9IGVycm9yLnJlbW92ZUVycm9yKGVsZW1lbnQpOwotLy8JCQkJCQkKLS8vCQkJCQkJLy8gbm90aWZ5IHRoZSBlcnJvciBsaXN0ZW5lciBhYm91dCB0aGUgZXJyb3IgcmVtb3ZlZAotLy8JCQkJCQlub3RpZnlFcnJvclJlbW92ZWQocGtnZXJyb3IpOwotLy8KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCS8vIEZpbmFsbHksIHVwZGF0ZSB0aGUgcGFyZW50cy4KLS8vCQl1cGRhdGVQYXJlbnRzRm9yRXJyb3JzKChFT2JqZWN0KSBjaGFuZ2VkRWxlbWVudCk7Ci0vLwl9Ci0vLwotLy8JLyoqCi0vLwkgKiBWYWxpZGF0ZXMgdGhlIEVsZW1lbnREZXBlbmRlbmN5IHdoZW4gdGhlIGVsZW1lbnQgaXMgdW5zZWxlY3RlZC4gV2hlbiB0aGUKLS8vCSAqIGVsZW1lbnQgaXMgdW5zZWxlY3RlZCwgd2UgbmVlZCB0byBkbyB0aGUgZm9sbG93aW5nOiAxLiBjaGVjayBlcnJvciBmb3IKLS8vCSAqIGRlcGVuZGVuY3RzIDIuIHJlbW92ZSBlcnJvciBmb3IgcmVmZXJlbmNlcyBhc3NvY2lhdGVkIHdpdGggZWxlbWVudCwgaW4KLS8vCSAqIGNhc2Ugb2YgYW55IGFkZGVkIHdoZW4gdGhlIGVsZW1lbnQgd2FzIGNoZWNrIDMuIHVwZGF0ZSBwYXJlbnRzOiBpZiB0aGUKLS8vCSAqIHNlbGVjdGlvbiBpcyB2YWxpZCwgcmVtb3ZlIGFsbCBlcnJvcnMgZnJvbSBwYXJlbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0vLwkgKiBlbGVtZW50IGlmIHRoZSBzZWxlY3Rpb24gaXMgaW52YWxpZCwgc2V0IGVycm9yIHRvIGFsbCBwYXJlbnRzLgotLy8JICogCi0vLwkgKiBAcGFyYW0gZGVwZW5kZW5jeQotLy8JICogICAgICAgICAgICBBIDxjb2RlPkVsZW1lbnREZXBlbmRlbmN5PC9jb2RlPiBvYmplY3QuCi0vLwkgKi8KLS8vCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVVuU2VsZWN0ZWQoUGFja2FnZURlcGVuZGVuY3kgZGVwZW5kZW5jeSkgewotLy8JCU9iamVjdCBjaGFuZ2VkRWxlbWVudCA9IGRlcGVuZGVuY3kuZ2V0RWxlbWVudCgpOwotLy8KLS8vCQkvLyBTaW5jZSB0aGlzIGVsZW1lbnQgaXMgdW4tc2VsZWN0ZWQsIHJlbW92ZSBhbGwgcHJldmlvdXMgZXJyb3JzLgotLy8JCXJlbW92ZUVycm9yKGNoYW5nZWRFbGVtZW50KTsKLS8vCi0vLwkJaWYgKGNoYW5nZWRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotLy8JCQlyZXR1cm47Ci0vLwkJfQotLy8KLS8vCQkvLyBTaW5jZSB0aGlzIGVsZW1lbnQgaXMgdW4tc2VsZWN0ZWQsIHJlbW92ZSBhbGwgZXJyb3JzIGluIHRoZQotLy8JCS8vIHJlZmVyZW5jZWQgZWxlbWVudHMuCi0vLwkJTGlzdCByZWZzID0gZGVwZW5kZW5jeS5nZXRSZWZlcmVuY2VzKCk7Ci0vLwkJaWYgKHJlZnMgIT0gbnVsbCAmJiByZWZzLnNpemUoKSA+IDApIHsKLS8vCQkJRWxlbWVudFJlZmVyZW5jZSByZWY7Ci0vLwkJCU9iamVjdCBlbGVtZW50OwotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHJlZnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLS8vCQkJCXJlZiA9IChFbGVtZW50UmVmZXJlbmNlKSBpdHIubmV4dCgpOwotLy8JCQkJZWxlbWVudCA9IHJlZi5nZXRSZWZFbGVtZW50KCk7Ci0vLwotLy8JCQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IGdldEVycm9yKGVsZW1lbnQsIGZhbHNlKTsKLS8vCQkJCWlmIChlcnJvciAhPSBudWxsKSB7Ci0vLwkJCQkJUGFja2FnZUVycm9yIHBrZ2Vycm9yID0gZXJyb3IucmVtb3ZlRXJyb3IoY2hhbmdlZEVsZW1lbnQpOwotLy8JCQkJCWlmIChlcnJvci5zaXplKCkgPT0gMCkgewotLy8JCQkJCQlyZW1vdmVFcnJvcihlbGVtZW50KTsKLS8vCi0vLwkJCQkJCS8vIENsZWFyIHRoZSBwYXJlbnQgZXJyb3IgaW50cm9kdWNlZCBieSB0aGlzIGVsZW1lbnQuCi0vLwkJCQkJCXVwZGF0ZVBhcmVudHNGb3JFcnJvcnMoKEVPYmplY3QpIGVsZW1lbnQpOwotLy8KLS8vCQkJCQl9Ci0vLwkJCQkJCi0vLwkJCQkJLy8gbm90aWZ5IHRoZSBlcnJvciBsaXN0ZW5lciBhYm91dCB0aGUgZXJyb3IgcmVtb3ZlZAotLy8JCQkJCW5vdGlmeUVycm9yUmVtb3ZlZChwa2dlcnJvcik7Ci0vLwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCQkvLyBJZiBhbiBlbGVtZW50IGlzIHVuY2hlY2tlZCwgY2hlY2sgdGhlIGRlcGVuZGVudCBlbGVtZW50cy4KLS8vCQkvLyBJZiB0aGVyZSBhcmUgY2hlY2sgZWxlbWVudHMgZGVwZW5kaW5nIG9uIGl0LCB0aGUgZWxlbWVudCBjYW4ndCBiZQotLy8JCS8vIHVuY2hlY2tlZC4KLS8vCQlMaXN0IGRlcGVuZGVudHMgPSBkZXBlbmRlbmN5LmdldERlcGVuZGVudHMoKTsKLS8vCQlpZiAoZGVwZW5kZW50cyAhPSBudWxsICYmIGRlcGVuZGVudHMuc2l6ZSgpID4gMCkgewotLy8JCQlPYmplY3QgZWxlbWVudDsKLS8vCQkJZm9yIChJdGVyYXRvciBpdHIgPSBkZXBlbmRlbnRzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQllbGVtZW50ID0gaXRyLm5leHQoKTsKLS8vCi0vLwkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLS8vCQkJCQljb250aW51ZTsKLS8vCQkJCX0KLS8vCi0vLwkJCQlpZiAoaXNTZWxlY3RlZChlbGVtZW50KSkgewotLy8JCQkJCS8vIERldGVybWluZSB0aGUgdHlwZSBvZiBkZXBlbmRlbmN5LgotLy8JCQkJCVBhY2thZ2VEZXBlbmRlbmN5IGNoaWxkRGVwID0gZGVwZW5kZW5jeU1hbmFnZXIKLS8vCQkJCQkJCS5nZXREZXBlbmRlbmN5KChNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLS8vCi0vLwkJCQkJdmFsaWRhdGVTZWxlY3RlZChjaGlsZERlcCk7Ci0vLwkJCQl9IGVsc2UgewotLy8JCQkJCXJlbW92ZUVycm9yKGNoYW5nZWRFbGVtZW50KTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCi0vLwkJLy8gZmluYWxseSwgdXBkYXRlIHRoZSBwYXJlbnRzCi0vLwkJdXBkYXRlUGFyZW50c0ZvckVycm9ycygoRU9iamVjdCkgY2hhbmdlZEVsZW1lbnQpOwotLy8JfQotLy8KLQlwcml2YXRlIHZvaWQgdXBkYXRlUGFyZW50RXJyb3IoRU9iamVjdCBwYXJlbnQsIEVPYmplY3QgZWxlbWVudCwKLQkJCWludCBlcnJvclR5cGUpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsIHx8IChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLS8vCQlpZiAoKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpCi0vLwkJCQkmJiBDb25maWd1cmF0aW9uSGVscGVyLmlzR2xvYmFsUGFja2FnZSgoTWV0aG9kUGFja2FnZSkgcGFyZW50KSkgewotLy8JCQl1cGRhdGVQYXJlbnRFcnJvcihwYXJlbnQuZUNvbnRhaW5lcigpLCBlbGVtZW50LCBlcnJvclR5cGUpOwotLy8JCQlyZXR1cm47Ci0vLwkJfQotCi0JCS8vIFJlbW92ZSB0aGUgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWxlbWVudCBmcm9tIGFsbCBwYXJlbnRzLgotCQlFbGVtZW50RGVwZW5kZW5jeUVycm9yIGVycm9yID0gZ2V0RXJyb3IocGFyZW50LCBmYWxzZSk7Ci0JCWlmIChlcnJvciAhPSBudWxsICYmIGVycm9yLnNpemUoKSA+IDApIHsKLQkJCWVycm9yLnJlbW92ZUVycm9yKGVsZW1lbnQpOwotCQl9Ci0KLQkJaWYgKGVycm9yVHlwZSAhPSBFcnJvckluZm8uTk9ORSkgewotCQkJLy8gUHJvcGVnYXRlIHRoZSBlcnJvciB0byBhbGwgcGFyZW50cy4KLQkJCWVycm9yID0gZ2V0RXJyb3IocGFyZW50LCB0cnVlKTsKLQkJCVN0cmluZyBtZXNzYWdlID0gTGlicmFyeVJlc291cmNlcy5jb25maWdDbG9zdXJlV2FybmluZ19tc2cxOwotCQkJUGFja2FnZUVycm9yIHBrZ2VyciA9IG5ldyBQYWNrYWdlRXJyb3IoZXJyb3JUeXBlLCBtZXNzYWdlLCBwYXJlbnQsIGVsZW1lbnQsCi0JCQkJCUVycm9ySW5mby5OT05FKTsKLQkJCWVycm9yLmFkZEVycm9yKHBrZ2Vycik7Ci0JCX0gZWxzZSBpZiAoKGVycm9yICE9IG51bGwpICYmIChlcnJvci5zaXplKCkgPT0gMCkpIHsKLQkJCXJlbW92ZUVycm9yKHBhcmVudCk7Ci0JCX0KLQotCQl1cGRhdGVQYXJlbnRFcnJvcihwYXJlbnQuZUNvbnRhaW5lcigpLCBlbGVtZW50LCBlcnJvclR5cGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVQYXJlbnRzRm9yRXJyb3JzKEVPYmplY3QgZWxlbWVudCkgewotCQlpbnQgZXJyb3JUeXBlID0gRXJyb3JJbmZvLk5PTkU7Ci0KLQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IGdldEVycm9yKGVsZW1lbnQpOwotCQlpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5zaXplKCkgPiAwKSB7Ci0JCQlpZiAoZXJyb3IuaXNFcnJvcigpIHx8IGVycm9yLmlzQ2hpbGRFcnJvcigpKSB7Ci0JCQkJZXJyb3JUeXBlID0gUGFja2FnZUVycm9yLkNISUxEX0VSUk9SOwotCQkJfSBlbHNlIGlmIChlcnJvci5pc1dhcm5pbmcoKSB8fCBlcnJvci5pc0NoaWxkV2FybmluZygpKSB7Ci0JCQkJZXJyb3JUeXBlID0gUGFja2FnZUVycm9yLkNISUxEX1dBUk5JTkc7Ci0JCQl9Ci0JCX0KLQotCQl1cGRhdGVQYXJlbnRFcnJvcihlbGVtZW50LmVDb250YWluZXIoKSwgZWxlbWVudCwgZXJyb3JUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBhY2NlcHQgdGhlIGN1dHJyZW50IHNlbGVjdGlvbiwgZml4IHRoZSBlcnJvcnMgYW5kIGlnbm9yZSBhbnkgd2FybmluZyBtZXNzYWdlLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpeEVycm9ycygpIHsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gdHJ1ZTsKLQkJYm9vbGVhbiBmb3JjZUNoZWNrID0gdHJ1ZTsKLQkJd2hpbGUgKGNoYW5nZWQpIHsKLQkJCWNoYW5nZWQgPSBmaXhQcm9ibGVtcyh0cnVlLCBmb3JjZUNoZWNrKTsKLQkJCWZvcmNlQ2hlY2sgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGZpeCBhbGwgZXJyb3IocykgYW5kIHdhcm5pZ24ocykKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXhQcm9ibGVtcygpIHsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gdHJ1ZTsKLQkJYm9vbGVhbiBmb3JjZUNoZWNrID0gdHJ1ZTsKLQkJd2hpbGUgKGNoYW5nZWQpIHsKLQkJCWNoYW5nZWQgPSBmaXhQcm9ibGVtcyhmYWxzZSwgZm9yY2VDaGVjayk7Ci0JCQlmb3JjZUNoZWNrID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZml4UHJvYmxlbXMoYm9vbGVhbiBlcnJvck9ubHksIGJvb2xlYW4gZm9yY2VDaGVjaykgewotCQkvLyBOb3RlOiBtYWtlIGNsb3N1cmUgd2lsbCBzZWxlY3QgZWxlbWVudHMgYXMgbmVlZGVkLgotCQkvLyBzbyB3ZSBuZWVkIHRvIG1ha2UgYSBjb3B5IG9mIHRoZSBjdXJyZW50IHNlbGN0ZWQgb25lcwotCQkvLyBpbiBvcmRlciB0byB0cmFjZSB0aGUgc3RhdHVzCi0JCS8vTGlzdCBjdXJyZW50U2VsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0KHNlbGVjdGVkTm90ZXMpOwotCi0JCS8vIGlmIGZvcmNlIGNoZWNrIGlzIHNldCwgcnVuIGNoZWNrIGFueXdheQotCQlib29sZWFuIGNoYW5nZWQgPSBmb3JjZUNoZWNrOwotCi0JCS8vIGxpc3Qgb2YgZXJyb3JJbmZvIG9iamVjdHMKLQkJTGlzdCBlcnJvcnMgPSBnZXRBbGxFcnJvcnMoKTsKLQkJaWYgKGVycm9ycy5zaXplKCkgPiAwKSB7CQkJCi0JCQlpbnZhbGlkTm9kZXNNYXAuY2xlYXIoKTsKLQkJCVBhY2thZ2VFcnJvciBlcnJvcjsKLQkJCUVPYmplY3QgY2F1c2VFbGVtZW50OwotCQkJLy9ib29sZWFuIG93bmVyU2VsZWN0ZWQsIGNhdXNlU2VsZWN0ZWQ7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZXJyb3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQllcnJvciA9IChQYWNrYWdlRXJyb3IpIGl0Lm5leHQoKTsKLQotCQkJCS8vb3duZXJFbGVtZW50ID0gKEVPYmplY3QpIGVycm9yLmdldE93bmVyRWxlbWVudCgpOwotCQkJCWNhdXNlRWxlbWVudCA9IChFT2JqZWN0KSBlcnJvci5nZXRDYXVzZUVsZW1lbnQoKTsKLQkJCQkvL2FkZENoYW5nZWQob3duZXJFbGVtZW50KTsKLQkJCQkvL2FkZENoYW5nZWQoY2F1c2VFbGVtZW50KTsKLS8vCQkJCWlmIChlcnJvci5pc0NoaWxkRXJyb3IoKSB8fCBlcnJvci5pc0NoaWxkV2FybmluZygpKSB7Ci0vLwkJCQkJY29udGludWU7Ci0vLwkJCQl9Ci0KLQkJCQlib29sZWFuIGlzRXJyb3IgPSBlcnJvci5pc0Vycm9yKCk7Ci0JCQkJYm9vbGVhbiBpc1dhcm5pbmcgPSBlcnJvci5pc1dhcm5pbmcoKTsKLQkJCQlpZiAoIWlzRXJyb3IgJiYgIWlzV2FybmluZyB8fCAhaXNFcnJvciAmJiBlcnJvck9ubHkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCi0JCQkJaWYgKCAhaXNTZWxlY3RlZChjYXVzZUVsZW1lbnQpICYmIHNlbGVjdEVycm9yRWxlbWVudChjYXVzZUVsZW1lbnQpICkgewotCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIGNoYW5nZWQgKSB7Ci0JCQljaGVja0Vycm9yKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBjaGFuZ2VkOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzZWxlY3RFcnJvckVsZW1lbnQoRU9iamVjdCBlbGVtZW50KSB7Ci0KLQkJYm9vbGVhbiBzZWxlY3RlZCA9IHRydWU7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIAotCQkJCSYmICFjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQoKE1ldGhvZFBsdWdpbikgZWxlbWVudCk7Ci0JCX0gZWxzZSBpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlIAotCQkJCSYmICFjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKGVsZW1lbnQpKXsKLQkJCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKChNZXRob2RQYWNrYWdlKSBlbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCXNlbGVjdGVkID0gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiBzZWxlY3RlZDsKLQl9Ci0KLS8vCS8qKgotLy8JICogdXBkYXRlIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiB0aGUgbGlicmFyeSB3aXRoIHRoZSBjdXJyZW50IHNlbGVjdGlvbnMKLS8vCSAqLwotLy8JcHVibGljIHZvaWQgc2F2ZU1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0vLwkJTGlzdCBwbHVnaW5zID0gY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotLy8JCUxpc3QgcGFja2FnZXMgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotLy8KLS8vCQlwbHVnaW5zLmNsZWFyKCk7Ci0vLwkJcGFja2FnZXMuY2xlYXIoKTsKLS8vCi0vLwkJRU9iamVjdCBlbGVtZW50OwotLy8JCWZvciAoSXRlcmF0b3IgaXQgPSBzZWxlY3RlZE5vdGVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLS8vCQkJZWxlbWVudCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0vLwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0vLwkJCQlpZiAoIXBsdWdpbnMuY29udGFpbnMoZWxlbWVudCkpIHsKLS8vCQkJCQlwbHVnaW5zLmFkZChlbGVtZW50KTsKLS8vCQkJCX0KLS8vCQkJfSBlbHNlIGlmICgoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpCi0vLwkJCQkJJiYgIUNvbmZpZ3VyYXRpb25IZWxwZXIKLS8vCQkJCQkJCS5pc0dsb2JhbFBhY2thZ2UoKE1ldGhvZFBhY2thZ2UpIGVsZW1lbnQpKSB7Ci0vLwkJCQlpZiAoIXBhY2thZ2VzLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0vLwkJCQkJcGFja2FnZXMuYWRkKGVsZW1lbnQpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8JfQotCi0JLyoqCi0JICogUGFja2FnZXMgdGhlIGxpYnJhcnkgYmFzZWQgb24gdGhlIHNlbGVjdGlvbi4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIHdpbGwgY2hhbmdlIHRoZSBjdXJyZW50IGxpYnJhcnkuIEJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLCBhCi0JICogY29weSBvZiB0aGUgY3VycmVudCBsaWJyYXJ5IHNob3VsZCBiZSBjcmVhdGVkIHdpdGggdGhlIGZvbGxvd2luZyBzdGVwczoKLQkgKiAxLiBDcmVhdGUgYSBuZXcgPGNvZGU+Q29uZmlndXJhdGlvbk1hbmFnZXI8L2NvZGU+IHdpdGggYSBjb3B5IG9mIHRoZQotCSAqIG9yaWdpbmFsIGxpYnJhcnksIDIuIFJlYnVpbGQgdGhlIGRlcGVuZGVuY3ksIDMuIENyZWF0ZSBhCi0JICogPGNvZGU+Q29uZmlndXJhdGlvbkNsb3N1cmU8L2NvZGU+IHdpdGggdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgPGNvZGU+TWV0aG9kTGlicmFyeTwvY29kZT4uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgcGFja2FnZUxpYnJhcnkoYm9vbGVhbiByZW1vdmVCcm9rZW5SZWZlcmVuY2VzKSB7Ci0JCXByb2Nlc3NTZWxlY3Rpb24obGlicmFyeSwgcmVtb3ZlQnJva2VuUmVmZXJlbmNlcyk7Ci0KLQkJLy8gUmVtb3ZlIHRoZSBjb25maWd1cmF0aW9ucyBleGNlcHQgZm9yIHRoZSBjdXJyZW50IG9uZS4KLQkJTGlzdCBjb25maWdzID0gbGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJY29uZmlncy5jbGVhcigpOwotCQljb25maWdzLmFkZChjb25maWcpOwotCi0JCXJldHVybiBsaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIHByb2Nlc3MgdGhlIHNlbGVjdGVkIHBhY2thZ2UgYnkgcmVtb3ZlaW5nIGFsbCB1bnNlbGVjdGVkIGVsZW1lbnRzIGFuZCBhbnkKLQkgKiBtaXNzaW5nIHJlZmVyZW5jZXMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzU2VsZWN0aW9uKEVPYmplY3QgZWxlbWVudCwKLQkJCWJvb2xlYW4gcmVtb3ZlQnJva2VuUmVmZXJlbmNlcykgewotCQlpZiAocmVtb3ZlQnJva2VuUmVmZXJlbmNlcykgewotCQkJLy8gSXRlcmF0b3IgdGhlIHJlZmVyZW5jZXMgYW5kIHJlbW92ZSBicm9rZW4gcmVmZXJlbmNlcy4KLQkJCUVMaXN0IHJlZmVyZW5jZXMgPSBlbGVtZW50LmVDcm9zc1JlZmVyZW5jZXMoKTsKLQkJCWlmIChyZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbmV3IEFycmF5TGlzdChyZWZlcmVuY2VzKS5pdGVyYXRvcigpOyBpdAotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCByZWYgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJCQlFT2JqZWN0IHBrZ1JlZiA9IExpYnJhcnlVdGlsLmdldFNlbGVjdGFibGUocmVmKTsKLQkJCQkJaWYgKHBrZ1JlZiAhPSBudWxsICYmICFpc1NlbGVjdGVkKHBrZ1JlZikpIHsKLQkJCQkJCXJlbW92ZVJlZmVyZW5jZShlbGVtZW50LCByZWYpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJRUxpc3QgZWxlbWVudHMgPSBlbGVtZW50LmVDb250ZW50cygpOwotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IG5ldyBBcnJheUxpc3QoZWxlbWVudHMpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGNoaWxkID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQotCQkJCS8vIElmIHRoZSBjaGlsZCBlbGVtZW50IGlzIHNlbGVjdGFibGUgYnV0IGl0IGlzIG5vdCBpbiB0aGUKLQkJCQkvLyBjb25maWd1cmF0aW9uLCByZW1vdmUgaXQuCi0JCQkJaWYgKExpYnJhcnlVdGlsLnNlbGVjdGFibGUoY2hpbGQpICYmICFpc1NlbGVjdGVkKGNoaWxkKSkgewotCQkJCQlFY29yZVV0aWwucmVtb3ZlKGNoaWxkKTsKLQkJCQl9IGVsc2UgewotCQkJCQlwcm9jZXNzU2VsZWN0aW9uKGNoaWxkLCByZW1vdmVCcm9rZW5SZWZlcmVuY2VzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUmVmZXJlbmNlKEVPYmplY3Qgb3duZXJFbGVtZW50LCBFT2JqZWN0IHJlZkVsZW1lbnQpIHsKLQkJQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBjb25maWdNYW5hZ2VyCi0JCQkJLmdldENvbnRlbnRQcm92aWRlcigpOwotCQlJUHJvcGVydHlTb3VyY2UgcHMgPSBwcm92aWRlci5nZXRQcm9wZXJ0eVNvdXJjZShvd25lckVsZW1lbnQpOwotCQlJUHJvcGVydHlEZXNjcmlwdG9yW10gcGRzID0gcHMuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotCQlpZiAocGRzICE9IG51bGwgJiYgcGRzLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKElQcm9wZXJ0eURlc2NyaXB0b3IpIHBkc1tpXTsKLQkJCQlPYmplY3QgaWQgPSBkZXNjcmlwdG9yLmdldElkKCk7Ci0JCQkJT2JqZWN0IHZhbHVlID0gcHMuZ2V0UHJvcGVydHlWYWx1ZShpZCk7Ci0KLQkJCQkvLyBDaGVjayB3aGV0aGVyIHRoZSB2YWx1ZSBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gYW4gZWRpdGFibGUKLQkJCQkvLyB2YWx1ZS4KLQkJCQlJUHJvcGVydHlTb3VyY2Ugc291cmNlID0gcHJvdmlkZXIuZ2V0UHJvcGVydHlTb3VyY2UodmFsdWUpOwotCQkJCWlmIChzb3VyY2UgIT0gbnVsbCkgewotCQkJCQl2YWx1ZSA9IHNvdXJjZS5nZXRFZGl0YWJsZVZhbHVlKCk7Ci0JCQkJfQotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEVMaXN0KSB7Ci0JCQkJCUVMaXN0IHJlZkxpc3QgPSAoRUxpc3QpIHZhbHVlOwotCQkJCQlpZiAocmVmTGlzdC5jb250YWlucyhyZWZFbGVtZW50KSkgewotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIlJlZmVyZW5jZSBbIiArIExpYnJhcnlVdGlsLmdldE5hbWUocmVmRWxlbWVudCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkrICJdIHJlbW92ZWQgZnJvbSBbIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgTGlicmFyeVV0aWwuZ2V0TmFtZShvd25lckVsZW1lbnQpCi0JCQkJCQkJCQkJCSsgIl0ncyByZWZlcmVuY2UgbGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlyZWZMaXN0LnJlbW92ZShyZWZFbGVtZW50KTsKLQkJCQkJCXBzLnNldFByb3BlcnR5VmFsdWUoaWQsIHJlZkxpc3QpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJSZWZlcmVuY2UgWyIgKyBMaWJyYXJ5VXRpbC5nZXROYW1lKHJlZkVsZW1lbnQpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkrICJdIHJlbW92ZWQgZnJvbSBbIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJKyBMaWJyYXJ5VXRpbC5nZXROYW1lKG93bmVyRWxlbWVudCkKLQkJCQkJCQkJCQkrICJdIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlwcy5zZXRQcm9wZXJ0eVZhbHVlKGlkLCBudWxsKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBjbG9zdXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQotCQljbGVhckVycm9yTWFya3MoKTsKLQkJCi0JCWNvbmZpZ01hbmFnZXIgPSBudWxsOwotCQljb25maWcgPSBudWxsOwotCQlsaWJyYXJ5ID0gbnVsbDsKLQkJZGVwZW5kZW5jeU1hbmFnZXIgPSBudWxsOwotCQlhY3Rpb25NZ3IgPSBudWxsOwotCQkvL3NlbGVjdGVkTm90ZXMuY2xlYXIoKTsKLQkJLy9jaGFuZ2VkTm9kZXMuY2xlYXIoKTsKLQkJaWYgKGludmFsaWROb2Rlc01hcCAhPSBudWxsKSB7Ci0JCQlpbnZhbGlkTm9kZXNNYXAuY2xlYXIoKTsKLQkJfQotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWxpc3RlbmVycy5jbGVhcigpOwotCQl9Ci0JfQotCi0vLwlwcml2YXRlIGJvb2xlYW4gY2FuSWdub3JlKFBhY2thZ2VSZWZlcmVuY2UgcGtnUmVmKSB7Ci0vLwkJcmV0dXJuIHBrZ1JlZi5jYW5JZ25vcmUoKTsKLS8vCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKENsb3N1cmVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8Q2xvc3VyZUxpc3RlbmVyPigpOwotCQl9Ci0JCWlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCW5vdGlmeUxpc3RlbmVyKGxpc3RlbmVyLCB0aGlzLmVycm9ycyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKENsb3N1cmVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWlmIChsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0vLwlwcml2YXRlIHZvaWQgbm90aWZ5RXJyb3JBZGRlZChQYWNrYWdlRXJyb3IgcGtnZXJyb3IpIHsKLS8vCQkJLy9ub3RpZnlMaXN0ZW5lcnMoQ2xvc3VyZUxpc3RlbmVyLkVSUk9SX0FEREVELCBwa2dlcnJvcik7Ci0vLwl9Ci0vLwkKLS8vCXByaXZhdGUgdm9pZCBub3RpZnlFcnJvclJlbW92ZWQoUGFja2FnZUVycm9yIHBrZ2Vycm9yKSB7Ci0vLwkJLy9ub3RpZnlMaXN0ZW5lcnMoQ2xvc3VyZUxpc3RlbmVyLkVSUk9SX1JFTU9WRUQsIHBrZ2Vycm9yKTsJCi0vLwl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeUxpc3RlbmVyKENsb3N1cmVMaXN0ZW5lciBsaXN0ZW5lciwgTGlzdCBlcnJvcnMpIHsKLQkJCQkJCQkJCQotCQlmb3IgKCBJdGVyYXRvciBpdCA9IGVycm9ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJRWxlbWVudEVycm9yIGVycm9yID0gKEVsZW1lbnRFcnJvcilpdC5uZXh0KCk7Ci0JCQlsaXN0ZW5lci5maXJlRXZlbnQoQ2xvc3VyZUxpc3RlbmVyLkVSUk9SX0FEREVELCBjb25maWcsIGVycm9yKTsKLQkJfQotCX0KLQkKLS8vCS8qKgotLy8JICogYWRkIHRoaXMgZWxlbWVudCBpbnRvIHRoZSBjb25maWd1cmF0aW9uCi0vLwkgKiB0aGlzIGlzIGZvciBxdWljayBmaXggYWN0aW9uCi0vLwkgKiBvdXIgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyB0byBzZWxlY3QgdGhlIG93bmluZyBwYWNrYWdlCi0vLwkgKiBAcGFyYW0gZWxlbWVudAotLy8JICogQHJldHVybiBJU3RhdHVzCi0vLwkgKi8KLS8vCXB1YmxpYyBJU3RhdHVzIHNlbGVjdEVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0vLwkJCi0vLwkJLy9pZiB0aGUgZWxlbWVudCBpcyBzdWJ0cmFjdGVkLCB3ZSBjYW4ndCBzZWxlY3QgdGhlIGVsZW1lbnQKLS8vCQkvLyByZXR1cm4gYW4gZXJyb3IKLS8vCQlpZiAoIGNvbmZpZ01hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbkRhdGEoKS5pc0VsZW1lbnRJblN1YnRyYWN0ZWRDYXRlZ29yeShlbGVtZW50KSkgewotLy8JCQlTdHJpbmcgbWVzc2FnZSA9IExpYnJhcnlSZXNvdXJjZXMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLlF1aWNrZml4RXJyb3JfcmVhc29uMSwgCi0vLwkJCQkJKG5ldyBTdHJpbmdbXSB7TGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCl9KSk7Ci0vLwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0vLwkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgSVN0YXR1cy5PSywgbWVzc2FnZSwgbnVsbCk7Ci0vLwkJfQotLy8JCQotLy8JCS8vIGZvciBxdWljayBmaXgsIHdlIGp1c3Qgc2VsZWN0IHRoZSBwYWNrYWdlIG9mIHRoZSBlbGVtZW50IAotLy8JCS8vIGFuZCB0aGUgY2hpbGQgcGFja2FnZXMKLS8vCQlPYmplY3Qgb3duZXIgPSBMaWJyYXJ5VXRpbC5nZXRTZWxlY3RhYmxlKGVsZW1lbnQpOwotLy8JCWlmICggb3duZXIgIT0gbnVsbCAmJiBvd25lciBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLS8vCQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQob3duZXIpOwotLy8JCX0JCi0vLwkJCi0vLwkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0vLwl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0NvbmZpZ3VyYXRpb25FcnJvck1hdHJpeC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9Db25maWd1cmF0aW9uRXJyb3JNYXRyaXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYyZjQ2ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0NvbmZpZ3VyYXRpb25FcnJvck1hdHJpeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLS8qKgotICogZGVmaW5lIHRoZSBjb25maWd1cmF0aW9uIGVycm9yIGxldmVsIG1ldHJpeAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMgotICoKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25FcnJvck1hdHJpeCB7Ci0JCi0vLwlwcml2YXRlIHN0YXRpYyBMaXN0IGxldmVsMUZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JcHJpdmF0ZSBzdGF0aWMgTGlzdCBsZXZlbDJGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCXByaXZhdGUgc3RhdGljIExpc3QgbGV2ZWwzRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwlzdGF0aWMgewotLy8JCWxldmVsMkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCkpOwotLy8JfQotCQotLy8JTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0vLwlwdWJsaWMgQ29uZmlndXJhdGlvbkVycm9yTWF0cml4KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0vLwkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0vLwl9Ci0JCi0JcHVibGljIHN0YXRpYyBFbGVtZW50RXJyb3IgZ2V0RXJyb3IoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIEVsZW1lbnRSZWZlcmVuY2UgcmVmKSB7Ci0JCQotCQlpZiAoIHJlZi5oYXNGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpICkgewotCQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5RXJyb3IoY29uZmlnLCByZWYpOwotCQl9IAotCQkKLQkJaW50IGVycm9yTGV2ZWwgPSBFcnJvckluZm8uSU5GTzsKLQkJU3RyaW5nIG1lc3NhZ2VJZCA9IExpYnJhcnlSZXNvdXJjZXMuRWxlbWVudEVycm9yX21pc3NpbmdfZWxlbWVudDsKLQkJCi0JCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KXJlZi5nZXRFbGVtZW50KCk7Ci0JCU1ldGhvZEVsZW1lbnQgZV9yZWYgPSAoTWV0aG9kRWxlbWVudClyZWYuZ2V0UmVmRWxlbWVudCgpOwotCi0JCWlmICggcmVmLmhhc0ZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpKSApIHsKLQkJCWVycm9yTGV2ZWwgPSBFcnJvckluZm8uRVJST1I7Ci0JCQltZXNzYWdlSWQgPSBMaWJyYXJ5UmVzb3VyY2VzLkVsZW1lbnRFcnJvcl9taXNzaW5nX21hbmRhdG9yeV9pbnB1dDsKLQkJfSBlbHNlIGlmICggcmVmLmhhc0ZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKSkgKSB7Ci0JCQllcnJvckxldmVsID0gRXJyb3JJbmZvLkVSUk9SOwotCQkJbWVzc2FnZUlkID0gTGlicmFyeVJlc291cmNlcy5FbGVtZW50RXJyb3JfbWlzc2luZ19vdXRwdXQ7Ci0JCX0gZWxzZSBpZiAoIHJlZi5oYXNGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSkgKSB7Ci0JCQllcnJvckxldmVsID0gRXJyb3JJbmZvLldBUk5JTkc7Ci0JCQltZXNzYWdlSWQgPSBMaWJyYXJ5UmVzb3VyY2VzLkVsZW1lbnRFcnJvcl9taXNzaW5nX3ByaW1hcnlfcGVyZm9ybWVyOwotCQl9IGVsc2UgaWYgKCByZWYuaGFzRmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpIAotCQkJCXx8IHJlZi5oYXNGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpKQotCQkJCXx8IHJlZi5oYXNGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSkgCi0JCQkJfHwgcmVmLmhhc0ZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9Nb2RpZmllcygpKQotCQkJCSApIHsKLQkJCS8vIGRlZmF1bHQKLQkJfSBlbHNlIGlmICggaXNCcmVha2Rvd25SZWZlcmVuY2UoZSwgZV9yZWYpICkgewotCQkJZXJyb3JMZXZlbCA9IEVycm9ySW5mby5JTkZPOwotCQl9IGVsc2UgaWYoIGlzR3VpZGFuY2VSZWZlcmVuY2UoZSwgZV9yZWYpICkgewotCQkJLy8gZGVmYXVsdAotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgbWVzc2FnZSA9IExpYnJhcnlSZXNvdXJjZXMuYmluZChtZXNzYWdlSWQsIAotCQkJCShuZXcgU3RyaW5nW10ge0xpYnJhcnlVdGlsLmdldFR5cGVQYXRoKGUpLCAKLQkJCQkJCUxpYnJhcnlVdGlsLmdldFR5cGVQYXRoKGVfcmVmKSB9KSk7Ci0KLQkJcmV0dXJuIG5ldyBFbGVtZW50RXJyb3IoY29uZmlnLCBlcnJvckxldmVsLCBtZXNzYWdlLCBlLCBlX3JlZiwgRXJyb3JJbmZvLlJFRkVSRU5DRV9UTyk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNCcmVha2Rvd25SZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBlLCBNZXRob2RFbGVtZW50IGVfcmVmKSB7Ci0JCXJldHVybiAoZV9yZWYgaW5zdGFuY2VvZiBUYXNrIHx8IGVfcmVmIGluc3RhbmNlb2YgUm9sZSB8fCBlX3JlZiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSAKLQkJCSYmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNHdWlkYW5jZVJlZmVyZW5jZShNZXRob2RFbGVtZW50IGUsIE1ldGhvZEVsZW1lbnQgZV9yZWYpIHsKLQkJcmV0dXJuIChlIGluc3RhbmNlb2YgVGFzayB8fCBlIGluc3RhbmNlb2YgUm9sZSB8fCBlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIAotCQkJJiYgKGVfcmVmIGluc3RhbmNlb2YgR3VpZGFuY2UpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBFbGVtZW50RXJyb3IgZ2V0VmFyaWFiaWxpdHlFcnJvcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgRWxlbWVudFJlZmVyZW5jZSByZWYpIHsKLQkKLQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KXJlZi5nZXRFbGVtZW50KCk7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCBlX3JlZiA9IChWYXJpYWJpbGl0eUVsZW1lbnQpcmVmLmdldFJlZkVsZW1lbnQoKTsKLQkJCi0JCWlmICggZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gZV9yZWYgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBlLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkKLQkJaW50IGVycm9yTGV2ZWwgPSBFcnJvckluZm8uV0FSTklORzsKLQkJU3RyaW5nIG1lc3NhZ2VJZCA9IExpYnJhcnlSZXNvdXJjZXMuRWxlbWVudEVycm9yX21pc3NpbmdfZWxlbWVudDsKLQotCQlpZiAoIHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTICkgewotCQkJaWYgKCBlIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5IHx8IGUgaW5zdGFuY2VvZiBHdWlkYW5jZSApIHsKLQkJCQllcnJvckxldmVsID0gRXJyb3JJbmZvLklORk87Ci0JCQl9Ci0JCQkKLQkJCW1lc3NhZ2VJZCA9IExpYnJhcnlSZXNvdXJjZXMuRWxlbWVudEVycm9yX2NvbnRyaWJ1dG9yX21pc3NpbmdfYmFzZTsKLQkJfSBlbHNlIGlmICggdHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyApIHsKLQkJCW1lc3NhZ2VJZCA9IExpYnJhcnlSZXNvdXJjZXMuRWxlbWVudEVycm9yX2V4dGVuZGVyX21pc3NpbmdfYmFzZTsKLQkJCQotCQl9IGVsc2UgaWYgKCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUyAKLQkJCQl8fCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX1JFUExBQ0VTKSB7Ci0JCQltZXNzYWdlSWQgPSBMaWJyYXJ5UmVzb3VyY2VzLkVsZW1lbnRFcnJvcl9yZXBsYWNlcl9taXNzaW5nX2Jhc2U7Ci0JCX0KLQkJCi0JCVN0cmluZyBtZXNzYWdlID0gTGlicmFyeVJlc291cmNlcy5iaW5kKG1lc3NhZ2VJZCwgCi0JCQkJKG5ldyBTdHJpbmdbXSB7TGlicmFyeVV0aWwuZ2V0VHlwZVBhdGgoZSksIAotCQkJCQkJTGlicmFyeVV0aWwuZ2V0VHlwZVBhdGgoZV9yZWYpIH0pKTsKLQotCQlyZXR1cm4gbmV3IEVsZW1lbnRFcnJvcihjb25maWcsIGVycm9yTGV2ZWwsIG1lc3NhZ2UsIGUsIGVfcmVmLCBFcnJvckluZm8uUkVGRVJFTkNFX1RPKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0RlcGVuZGVuY3lNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0RlcGVuZGVuY3lNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNmM2MTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9EZXBlbmRlbmN5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBtZXRob2QgZWxlbWVudCBkZXBlbmRlbmNpZXMgaW4gYSBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW5jeU1hbmFnZXIgewotCi0JLy8gSWYgdHJ1ZSwgZ2VuZXJhdGUgZGVidWcgdHJhY2VzLgotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkvLyBUaGUgbWV0aG9kIGxpYnJhcnkuCi0JcHJvdGVjdGVkIE1ldGhvZExpYnJhcnkgbGlicmFyeTsKLQotCS8vIFRoZSBsaWJyYXJ5IG1hbmFnZXIuCi0JcHJvdGVjdGVkIElMaWJyYXJ5TWFuYWdlciBsaWJyYXJ5TWFuYWdlcjsKLQotCS8vIEEgbWFwIG9mIHBhY2thZ2UgZWxlbWVudHMgdG8gUGFja2FnZURlcGVuZGVuY3kgb2JqZWN0cy4KLQlwcm90ZWN0ZWQgTWFwIGRlcGVuZGVuY3lNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gQSBsaWJyYXJ5IGNoYW5nZSBsaXN0ZW5lci4KLQlwcml2YXRlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGliTGlzdGVuZXIgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGVwZW5kZW5jeU1hbmFnZXIoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXRoaXMubGlicmFyeSA9IGxpYnJhcnk7Ci0JCXRoaXMubGlicmFyeU1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldExpYnJhcnlNYW5hZ2VyKAotCQkJCWxpYnJhcnkpOwotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkKLQkJbGliTGlzdGVuZXIgPSBuZXcgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlDaGFuZ2VkKGludCBvcHRpb24sIENvbGxlY3Rpb24gY2hhbmdlZEl0ZW1zKSB7Ci0vLwkJCQlpZiAob3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0xPQURFRAotLy8JCQkJCQl8fCBvcHRpb24gPT0gSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ1JFQVRFRCkgewotLy8JCQkJCS8vIFRPRE86IElzIHRoaXMgbmVjZXNzYXJ5PwotLy8JCQkJCS8vIHJlZnJlc2goKTsKLS8vCQkJCX0gZWxzZSAKLQkJCQlpZiAob3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0RFTEVURUQpIHsKLQkJCQkJaGFuZGxlRGVsZXRlZEVsZW1lbnQoY2hhbmdlZEl0ZW1zKTsKLQkJCQl9IGVsc2UgaWYgKG9wdGlvbiA9PSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VECi0JCQkJCQl8fCBvcHRpb24gPT0gSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTkVXQ0hJTEQpIHsKLQkJCQkJaWYgKGNoYW5nZWRJdGVtcyAhPSBudWxsICYmIGNoYW5nZWRJdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hhbmdlZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJT2JqZWN0IGUgPSBpdC5uZXh0KCk7Ci0JCQkJCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJCQkJYnVpbGREZXBlbmRlbmN5Rm9yKChNZXRob2RFbGVtZW50KSBlKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlCi0JCQkJCQkJCQkJCQkrICIgaXMgbm90IGEgbWV0aG9kIGVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCWxpYnJhcnlNYW5hZ2VyLmFkZExpc3RlbmVyKGxpYkxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIGRlcGVuZGVuY3kgZm9yIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIEEgbWV0aG9kIGVsZW1lbnQuCi0JICogQHJldHVybiBBIDxjb2RlPlBhY2thZ2VEZXBlbmRlbmN5PC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgUGFja2FnZURlcGVuZGVuY3kgZ2V0RGVwZW5kZW5jeShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKCFMaWJyYXJ5VXRpbC5zZWxlY3RhYmxlKGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIEFsd2F5cyByZWJ1aWxkIHRoZSBkZXBlbmRlbmN5IGZvciB0aGUgZWxlbWVudCBzaW5jZSB0aGUKLQkJLy8gZGVwZW5kZW50cyBtYXkgbm90IGJlIGZ1bGx5IGVzdGFibGlzaGVkLgotCQlQYWNrYWdlRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gZ2V0RGVwZW5kZW5jeShlbGVtZW50LCBmYWxzZSk7Ci0JCWlmIChkZXBlbmRlbmN5ID09IG51bGwgfHwgIWRlcGVuZGVuY3kuaXNMb2FkZWQoKSkgewotCQkJYnVpbGREZXBlbmRlbmN5KGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIGdldERlcGVuZGVuY3koZWxlbWVudCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFByaW50cyB0aGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludERlcGVuZGVuY3koKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkZXBlbmRlbmN5TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCSgoUGFja2FnZURlcGVuZGVuY3kpIGl0Lm5leHQoKSkucHJpbnQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJ1aWxkcyB0aGUgZGVwZW5kZW5jeSBmb3IgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgQSBtZXRob2QgZWxlbWVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYnVpbGREZXBlbmRlbmN5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl0cnkgewotCQkJUGFja2FnZURlcGVuZGVuY3kgZGVwZW5kZW5jeSA9IGJ1aWxkRGVwZW5kZW5jeUZvcihlbGVtZW50KTsKLQotCQkJRUxpc3QgZWxlbWVudHMgPSBlbGVtZW50LmVDb250ZW50cygpOwotCQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpOwotCQkJCQlpZiAobWV0aG9kRWxlbWVudCAhPSBudWxsCi0JCQkJCQkJJiYgIUxpYnJhcnlVdGlsLnNlbGVjdGFibGUobWV0aG9kRWxlbWVudCkpIHsKLQkJCQkJCWJ1aWxkRGVwZW5kZW5jeUZvcihtZXRob2RFbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJZGVwZW5kZW5jeS5zZXRMb2FkZWQodHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQnVpbGRzIHRoZSBkZXBlbmRlbmN5IGZvciBhIG1ldGhvZCBlbGVtZW50LgotCSAqIDxwPgotCSAqIFRoaXMgY3JlYXRlcyBhbiA8Y29kZT5FbGVtZW50UmVmZXJlbmNlPC9jb2RlPiBmb3IgdGhlIGdpdmVuIGVsZW1lbnQKLQkgKiB0aGF0IHBvaW50cyB0byBhbGwgdGhlIHJlZmVyZW5jZWQgZWxlbWVudHMsIGFuZCBhZGRzIHRoZSBnaXZlbiBlbGVtZW50IGFzCi0JICogYSBkZXBlbmRlbnQgZWxlbWVudCB0byBhbGwgdGhlIHJlZmVyZW5jZWQgZWxlbWVudHMuIFRoaXMgc2hvdWxkIG9ubHkgYmUKLQkgKiBjYWxsZWQgb25jZSBmb3IgZWFjaCBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgQSBtZXRob2QgZWxlbWVudC4KLQkgKiBAcmV0dXJuIEEgPGNvZGU+UGFja2FnZURlcGVuZGVuY3k8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgUGFja2FnZURlcGVuZGVuY3kgYnVpbGREZXBlbmRlbmN5Rm9yKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIEJ1aWxkIHRoZSBkZXBlbmRlbmN5IG9uIHRoZSBzZWxlY3RhYmxlIGVsZW1lbnQvcGFyZW50IG9ubHkKLQkJTWV0aG9kRWxlbWVudCBzZWxlY3RhYmxlRWxlbWVudCA9IChNZXRob2RFbGVtZW50KUxpYnJhcnlVdGlsLmdldFNlbGVjdGFibGUoZWxlbWVudCk7Ci0JCWlmIChzZWxlY3RhYmxlRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVBhY2thZ2VEZXBlbmRlbmN5IGRlcGVuZGVuY3kgPSBnZXREZXBlbmRlbmN5KHNlbGVjdGFibGVFbGVtZW50LCB0cnVlKTsKLQotCQkvLyBSZW1vdmUgYW55IGV4aXN0aW5nIGVsZW1lbnQgcmVmZXJlbmNlIGZvciB0aGlzIGVsZW1lbnQuCi0JCWRlcGVuZGVuY3kucmVtb3ZlUmVmZXJlbmNlKGVsZW1lbnQpOwotLyoKLQkJLy8gR2V0IHRoZSBWYXJpYWJpbGl0eUVsZW1lbnQuCi0JCUNvbnRlbnRFbGVtZW50IGJhc2VFbGVtZW50ID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJYmFzZUVsZW1lbnQgPSAoQ29udGVudEVsZW1lbnQpICgoQ29udGVudEVsZW1lbnQpIGVsZW1lbnQpCi0JCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoYmFzZUVsZW1lbnQgIT0gbnVsbCkgewotCQkJCS8vIEVzdGFibGlzaCB0aGUgcGFja2FnZSByZWZlcmVuY2UuCi0JCQkJRU9iamVjdCBzZWxlY3RhYmxlQmFzZSA9IExpYnJhcnlVdGlsLmdldFNlbGVjdGFibGUoYmFzZUVsZW1lbnQpOwotCQkJCWlmIChzZWxlY3RhYmxlQmFzZSAhPSBudWxsKSB7Ci0JCQkJCVBhY2thZ2VSZWZlcmVuY2UgcGtnUmVmID0gZGVwZW5kZW5jeS5nZXRSZWZlcmVuY2UoCi0JCQkJCQkJc2VsZWN0YWJsZUJhc2UsIHRydWUpOwotCi0JCQkJCWlmICghcGtnUmVmLmhhc1JlZmVyZW5jZShlbGVtZW50LCBiYXNlRWxlbWVudCkpIHsKLQkJCQkJCS8vIEFkZCB0aGUgZGV0YWlsIGVsZW1lbnQgcmVmZXJlbmNlIHRvIHRoZSBwYWNrYWdlCi0JCQkJCQkvLyByZWZlcmVuY2UuCi0JCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnRSZWZlcmVuY2UgcmVmID0gbmV3IFZhcmlhYmlsaXR5RWxlbWVudFJlZmVyZW5jZSgKLQkJCQkJCQkJZWxlbWVudCwgYmFzZUVsZW1lbnQpOwotCQkJCQkJcGtnUmVmLmFkZFJlZmVyZW5jZShyZWYpOwotCQkJCQl9Ci0KLQkJCQkJLy8gU2V0IHRoZSBkZXBlbmRlbnQgb2YgdGhlIHJlZmVyZW5jZWQgcGFja2FnZS4KLQkJCQkJZ2V0RGVwZW5kZW5jeShzZWxlY3RhYmxlQmFzZSwgdHJ1ZSkuYWRkRGVwZW5kZW50KAotCQkJCQkJCXNlbGVjdGFibGVFbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlMaXN0IHJlZmVyZW5jZXMgPSBlbGVtZW50LmVDcm9zc1JlZmVyZW5jZXMoKTsKLQotCQkvLyBVcGRhdGUgdGhlIGRlcGVuZGVudHMgb2YgdGhvc2UgZWxlbWVudHMgaW4gdGhlIGxpc3QuCi0JCWlmIChyZWZlcmVuY2VzICE9IG51bGwgJiYgcmVmZXJlbmNlcy5zaXplKCkgPiAwKSB7Ci0JCQkvLyBHZXQgdGhlIHNlbGVjdGFibGUgcmVmZXJlbmNlcwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgcmVmRWxlbWVudCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJRU9iamVjdCBzZWxlY3RhYmxlUmVmID0gTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShyZWZFbGVtZW50KTsKLQkJCQlpZiAoc2VsZWN0YWJsZVJlZiAhPSBudWxsKSB7Ci0JCQkJCVBhY2thZ2VSZWZlcmVuY2UgcGtnUmVmID0gZGVwZW5kZW5jeS5nZXRSZWZlcmVuY2UoCi0JCQkJCQkJc2VsZWN0YWJsZVJlZiwgdHJ1ZSk7Ci0KLQkJCQkJaWYgKGVsZW1lbnQgPT0gc2VsZWN0YWJsZUVsZW1lbnQKLQkJCQkJCQkmJiByZWZFbGVtZW50ID09IHNlbGVjdGFibGVSZWYpIHsKLQkJCQkJCS8vIE5vIG5lZWQgdG8gYWRkIHRoaXMuCi0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCWlmICghcGtnUmVmLmhhc1JlZmVyZW5jZShlbGVtZW50LCByZWZFbGVtZW50KSkgewotCQkJCQkJR2VuZXJhbFJlZmVyZW5jZSByZWYgPSBuZXcgR2VuZXJhbFJlZmVyZW5jZShlbGVtZW50LAotCQkJCQkJCQlyZWZFbGVtZW50KTsKLQkJCQkJCXBrZ1JlZi5hZGRSZWZlcmVuY2UocmVmKTsKLQkJCQkJfQotCi0JCQkJCWdldERlcGVuZGVuY3koc2VsZWN0YWJsZVJlZiwgdHJ1ZSkuYWRkRGVwZW5kZW50KAotCQkJCQkJCXNlbGVjdGFibGVFbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLSovCi0JCUxpc3QgcHJvcGVydGllcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhlbGVtZW50KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIHByb3BlcnRpZXMuZ2V0KGkpOwotCQkJaWYgKCEoZiBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlFUmVmZXJlbmNlIGZlYXR1cmUgPSAoRVJlZmVyZW5jZSlmOwotCQkJaWYgKCBmZWF0dXJlLmlzQ29udGFpbmVyKCkgfHwgZmVhdHVyZS5pc0NvbnRhaW5tZW50KCkgKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkJCQkKLQkJCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJCWlmICggdmFsdWUgPT0gbnVsbCApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJTWV0aG9kRWxlbWVudCByZWZFbGVtZW50ID0gbnVsbDsKLQkJCUxpc3QgdmFsdWVzID0gbnVsbDsKLQkJCWludCBjb3VudCA9IDA7Ci0JCQkKLQkJCWlmICggZmVhdHVyZS5pc01hbnkoKSApIHsKLQkJCQl2YWx1ZXMgPSAoTGlzdCl2YWx1ZTsKLQkJCQlpZiAoIHZhbHVlcy5zaXplKCkgPiAwICkgewotCQkJCQlyZWZFbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpdmFsdWVzLmdldChjb3VudCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICggdmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICkgewotCQkJCXJlZkVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCl2YWx1ZTsJCQkJCi0JCQl9Ci0JCQkgCi0JCQl3aGlsZSAoIHJlZkVsZW1lbnQgIT0gbnVsbCApIHsKLQkJCQlNZXRob2RFbGVtZW50IHNlbGVjdGFibGVSZWYgPSAoTWV0aG9kRWxlbWVudClMaWJyYXJ5VXRpbC5nZXRTZWxlY3RhYmxlKHJlZkVsZW1lbnQpOwotCQkJCWlmIChzZWxlY3RhYmxlUmVmICE9IG51bGwpIHsKLQkJCQkJUGFja2FnZVJlZmVyZW5jZSBwa2dSZWYgPSBkZXBlbmRlbmN5LmdldFJlZmVyZW5jZSgKLQkJCQkJCQlzZWxlY3RhYmxlUmVmLCB0cnVlKTsKLQkKLQkJCQkJaWYgKGVsZW1lbnQgPT0gc2VsZWN0YWJsZUVsZW1lbnQKLQkJCQkJCQkmJiByZWZFbGVtZW50ID09IHNlbGVjdGFibGVSZWYpIHsKLQkJCQkJCS8vIE5vIG5lZWQgdG8gYWRkIHRoaXMuCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQotCQkJCQlFbGVtZW50UmVmZXJlbmNlIHJlZiA9IHBrZ1JlZi5nZXRSZWZlcmVuY2UoZWxlbWVudCwgcmVmRWxlbWVudCk7Ci0JCQkJCWlmIChyZWYgPT0gbnVsbCkgewotCQkJCQkJcmVmID0gbmV3IEVsZW1lbnRSZWZlcmVuY2UoZWxlbWVudCwgcmVmRWxlbWVudCk7Ci0JCQkJCQlwa2dSZWYuYWRkUmVmZXJlbmNlKHJlZik7Ci0JCQkJCX0KLQkKLQkJCQkJcmVmLmFkZEZlYXR1cmUoZmVhdHVyZSk7Ci0JCQkJCQotCQkJCQlnZXREZXBlbmRlbmN5KHNlbGVjdGFibGVSZWYsIHRydWUpLmFkZERlcGVuZGVudCgKLQkJCQkJCQlzZWxlY3RhYmxlRWxlbWVudCk7Ci0JCQkJfQotCQkJCQotCQkJCXJlZkVsZW1lbnQgPSBudWxsOwotCQkJCWlmICggdmFsdWVzICE9IG51bGwgKSB7Ci0JCQkJCWNvdW50Kys7Ci0JCQkJCWlmICggY291bnQgPCB2YWx1ZXMuc2l6ZSgpICkgewotCQkJCQkJcmVmRWxlbWVudCA9IChNZXRob2RFbGVtZW50KXZhbHVlcy5nZXQoY291bnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkKLQkJcmV0dXJuIGRlcGVuZGVuY3k7Ci0JfQotCi0JcHJpdmF0ZSBQYWNrYWdlRGVwZW5kZW5jeSBnZXREZXBlbmRlbmN5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiBjcmVhdGUpIHsKLQkJaWYgKCFMaWJyYXJ5VXRpbC5zZWxlY3RhYmxlKGVsZW1lbnQpKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiRXJyb3IsIFNlbGVjdGFibGUgZWxlbWVudCByZXF1aXJlZDogIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVBhY2thZ2VEZXBlbmRlbmN5IGRlcGVuZGVuY3kgPSAoUGFja2FnZURlcGVuZGVuY3kpIGRlcGVuZGVuY3lNYXAKLQkJCQkuZ2V0KGVsZW1lbnQpOwotCQlpZiAoZGVwZW5kZW5jeSA9PSBudWxsICYmIGNyZWF0ZSkgewotCQkJZGVwZW5kZW5jeSA9IG5ldyBQYWNrYWdlRGVwZW5kZW5jeShlbGVtZW50KTsKLQkJCWRlcGVuZGVuY3lNYXAucHV0KGVsZW1lbnQsIGRlcGVuZGVuY3kpOwotCQl9Ci0KLQkJcmV0dXJuIGRlcGVuZGVuY3k7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRGVsZXRlZEVsZW1lbnQoQ29sbGVjdGlvbiBjaGFuZ2VkSXRlbXMpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGNoYW5nZWRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0Lm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXJlbW92ZVJlZmVyZW5jZSgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBlbGVtZW50IHJlZmVyZW5jZSBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50LCByZWJ1aWxkIGxhdGVyCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIEEgbWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVJlZmVyZW5jZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJUGFja2FnZURlcGVuZGVuY3kgZGVwZW5kZW5jeSA9IG51bGw7Ci0KLQkJTWV0aG9kRWxlbWVudCBwa2cgPSAoTWV0aG9kRWxlbWVudCkgTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlbGVtZW50KTsKLQkJaWYgKChwa2cgPT0gbnVsbCkgfHwgKChkZXBlbmRlbmN5ID0gZ2V0RGVwZW5kZW5jeShwa2csIGZhbHNlKSkgPT0gbnVsbCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWRlcGVuZGVuY3kucmVtb3ZlUmVmZXJlbmNlKGVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9FbGVtZW50RGVwZW5kZW5jeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9FbGVtZW50RGVwZW5kZW5jeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTQyYWYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRWxlbWVudERlcGVuZGVuY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBIb2xkcyB0aGUgYSBsaXN0IG9mIHBhY2thZ2UgcmVmZXJlbmNlcyBvZiBvbmUgcGFja2FnZSBlbGVtZW50IGl0IGFsc28gaG9sZHMgYQotICogbGlzdCBvZiBkZXBlbmRhbnQgcGFja2FnZSBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudERlcGVuZGVuY3kgewotCi0JLy8gdGhlIHBhY2thZ2UgZWxlbWVudAotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBsaXN0IG9mIEVsZW1lbnRSZWZlcmVuY2Ugb2JqZWN0cywgZWFjaCBFbGVtZW50UmVmZXJlbmNlIG9iamVjdCBob2xkcyBhCi0JICogbGlzdCBvZiByZWZlcmVuY2VzIG9mIHRoZSBzYW1lIHR5cGUKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCByZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogZGVwZW5kZW50cwotCSAqLwotCXByb3RlY3RlZCBMaXN0IGRlcGVuZGVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudERlcGVuZGVuY3koTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgYSBsaXN0IG9mIGVsZW1lbnRzIHRoaXMgZWxlbWVudCBkZXBlbmRzIG9uCi0JICogCi0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiBFbGVtZW50UmVmZXJlbmNlIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIEVsZW1lbnRSZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gcmVmRWxlbWVudCB0aGF0IHRoZSBjdXJyZW50Ci0JICogZWxlbWVudCByZWNlcmVuY2VzIHRvLgotCSAqIAotCSAqIEBwYXJhbSBSZWZFbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgZWxlbWVudCB0byB3aGljaCB0aGUgY3VycmVudCBlbGVtZW50IHJlZmVyZW5jZXMKLQkgKiBAcmV0dXJuIEVsZW1lbnRSZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgRWxlbWVudFJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCByZWZFbGVtZW50KSB7Ci0JCUVsZW1lbnRSZWZlcmVuY2UgcmVmOwotCQlPYmplY3QgcmVmRWw7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSByZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCXJlZiA9IChFbGVtZW50UmVmZXJlbmNlKSBpdC5uZXh0KCk7Ci0JCQlyZWZFbCA9IHJlZi5nZXRSZWZFbGVtZW50KCk7Ci0JCQlpZiAocmVmRWwgIT0gbnVsbCAmJiByZWZFbCA9PSByZWZFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIHJlZjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbGlzdCBvZiBlbGVtZW50cyB0aGF0IGRlcGVuZCBvbiB0aGlzIGVsZW1lbnQKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXBlbmRlbnRzKCkgewotCQlyZXR1cm4gZGVwZW5kZW50czsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgYSBkZXBlbmRlbnQKLQkgKiBAcGFyYW0gZWwgT2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgYWRkRGVwZW5kZW50KE1ldGhvZEVsZW1lbnQgZWwpIHsKLQkJaWYgKCFkZXBlbmRlbnRzLmNvbnRhaW5zKGVsKSkgewotCQkJZGVwZW5kZW50cy5hZGQoZWwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgcmVmZXJlbmNlCi0JICogQHBhcmFtIHJlZiBFbGVtZW50UmVmZXJlbmNlCi0JICovCi0JcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlKEVsZW1lbnRSZWZlcmVuY2UgcmVmKSB7Ci0JCXJlZmVyZW5jZXMuYWRkKHJlZik7Ci0JfQotCi0JLyoqCi0JICogcHJpbnQgb3V0IHRoZSByZWZlcmVuY2VzLiBUaGlzIGlzIGEgZGVidWdnaW5nIG1ldGhvZC4KLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50KCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgcmVmID0gaXQubmV4dCgpOwotCQkJaWYgKHJlZiBpbnN0YW5jZW9mIFBhY2thZ2VSZWZlcmVuY2UpIHsKLQkJCQkoKFBhY2thZ2VSZWZlcmVuY2UpIHJlZikucHJpbnQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJKChFbGVtZW50UmVmZXJlbmNlKSByZWYpLnByaW50KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRWxlbWVudERlcGVuZGVuY3lFcnJvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9FbGVtZW50RGVwZW5kZW5jeUVycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZTRmZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9FbGVtZW50RGVwZW5kZW5jeUVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhvbGRzIHRoZSBlbGVtZW50IGRlcGVuZGVuY3kgZXJyb3IgaW4gYSBjb25maWd1cmF0aW9uIGNsb3N1cmUuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50RGVwZW5kZW5jeUVycm9yIHsKLQotCS8vIHRoZSBlcnJvciBlbGVtZW50LCBjb3VsZCBiZSBhIE1ldGhvZFBhY2thZ2Ugb3IgYSBVSSBwYWNrYWdlCi0JcHJpdmF0ZSBPYmplY3QgZXJyb3JFbGVtZW50OwotCi0JLyoqCi0JICogbWFwIG9mIGNhdXNlZWxlbWVudCB0byB0aGUgRXJyb3JJbmZvIG9iamVjdAotCSAqLwotCXByaXZhdGUgTWFwPE9iamVjdCwgUGFja2FnZUVycm9yPiBlcnJvckluZm9NYXAgPSBuZXcgSGFzaE1hcDxPYmplY3QsIFBhY2thZ2VFcnJvcj4oKTsKLQotCXByaXZhdGUgaW50IGVycm9yQml0cyA9IDA7Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIEVsZW1lbnREZXBlbmRlbmN5RXJyb3IoT2JqZWN0IGVsZW1lbnQpIHsKLQkJdGhpcy5lcnJvckVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBlcnJvcgotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRFcnJvckVsZW1lbnQoKSB7Ci0JCXJldHVybiBlcnJvckVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50cyB0aGF0IGNhdXNlZCB0aGUgZXJyb3IKLQkgKiBAcmV0dXJuIE9iamVjdFtdCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENhdXNlRWxlbWVudHMoKSB7Ci0JCXJldHVybiBlcnJvckluZm9NYXAua2V5U2V0KCkudG9BcnJheSgpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgY291bnQgb2YgdGhlIGVycm9yIGluZm8gZW50cnkKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGVycm9ySW5mb01hcC5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogYWRkIGFuIGVycm9yIGVudHJ5Ci0JICogQHBhcmFtIGVycm9ySW5mbyBQYWNrYWdlRXJyb3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFcnJvcihQYWNrYWdlRXJyb3IgZXJyb3JJbmZvKSB7Ci0JCWVycm9ySW5mb01hcC5wdXQoZXJyb3JJbmZvLmdldENhdXNlRWxlbWVudCgpLCBlcnJvckluZm8pOwotCQllcnJvckJpdHMgfD0gZXJyb3JJbmZvLmdldEVycm9yTGV2ZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmUgdGhlIGVycm9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2F1c2VFbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGNhdXNlRWxlbWVudAotCSAqICAgICAgICAgICAgT2JqZWN0IHRoZSBlbGVtZW50IHRoYXQgY2F1c2VkIHRoZSBlcnJvcgotCSAqLwotCXB1YmxpYyBQYWNrYWdlRXJyb3IgcmVtb3ZlRXJyb3IoT2JqZWN0IGNhdXNlRWxlbWVudCkgewotCQlQYWNrYWdlRXJyb3IgZXJyb3IgPSBlcnJvckluZm9NYXAucmVtb3ZlKGNhdXNlRWxlbWVudCk7Ci0KLQkJLy8gcmVjYWxjdWxhdGUgdGhlIGVycm9yIGJpdHMKLQkJY2FsY3VsYXRlRXJyb3JCaXRzKCk7Ci0JCQotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlIHRoZSBlcnJvciBhc3NvY2lhdGVkIHdpdGggdGhlIGNhdXNlRWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBjYXVzZUVsZW1lbnQKLQkgKiAgICAgICAgICAgIE9iamVjdCB0aGUgZWxlbWVudCB0aGF0IGNhdXNlZCB0aGUgZXJyb3IKLQkgKi8KLQlwdWJsaWMgUGFja2FnZUVycm9yIGdldEVycm9yKE9iamVjdCBjYXVzZUVsZW1lbnQpIHsKLQkJcmV0dXJuIGVycm9ySW5mb01hcC5nZXQoY2F1c2VFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgYSBsaXN0IG9mIGFsbCBFcnJJbmZvIG9iamVjdHMKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIEVycm9ySW5mbyBvYmplY3RzCi0JICovCi0JcHVibGljIExpc3Q8UGFja2FnZUVycm9yPiBnZXRBbGwoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0PFBhY2thZ2VFcnJvcj4oZXJyb3JJbmZvTWFwLnZhbHVlcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayB0aGlzIGlzIGFuIGVycm9yIG9yIG5vdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Vycm9yKCkgewotCQlyZXR1cm4gKGVycm9yQml0cyAmIEVycm9ySW5mby5FUlJPUikgPiAwOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoaXMgaXMgYSB3YXJuaW5nCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXYXJuaW5nKCkgewotCQlyZXR1cm4gKGVycm9yQml0cyAmIEVycm9ySW5mby5XQVJOSU5HKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhpcyBpcyBkdWUgdG8gYW4gZXJyb3IgaW4gaXQncyBjaGlsZHJlbgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2hpbGRFcnJvcigpIHsKLQkJcmV0dXJuIChlcnJvckJpdHMgJiBQYWNrYWdlRXJyb3IuQ0hJTERfRVJST1IpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGlzIGlzIGR1ZSB0byBhIHdhcm5pbmcgaW4gaXQncyBjaGlsZHJlbgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2hpbGRXYXJuaW5nKCkgewotCQlyZXR1cm4gKGVycm9yQml0cyAmIFBhY2thZ2VFcnJvci5DSElMRF9XQVJOSU5HKSA+IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgY2FsY3VsYXRlRXJyb3JCaXRzKCkgewotCQllcnJvckJpdHMgPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZXJyb3JJbmZvTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWVycm9yQml0cyB8PSAoKEVycm9ySW5mbykgaXQubmV4dCgpKS5nZXRFcnJvckxldmVsKCk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0VsZW1lbnRFcnJvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9FbGVtZW50RXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcyMTRlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0VsZW1lbnRFcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpZGVudGlmaWVzIGEgY29uZmlndXJhdGlvbiBlcnJvciBiZXR3ZWVuIHR3byBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIGp4aQotICoKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRFcnJvciAgZXh0ZW5kcyBFcnJvckluZm8gaW1wbGVtZW50cyBJQ29uZmlndXJhdGlvbkVycm9yIHsKLQotCS8vIG5lZWQgdGhlIGNvbmZpZyBpZCB0byB1bmlxdWVseSBpZGVudGlmeSBhbiBlcnJvcgotCVN0cmluZyBjb25maWdJZDsKLQkKLQlwdWJsaWMgRWxlbWVudEVycm9yKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCAgCi0JCQlpbnQgZXJyb3JMZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIAotCQkJT2JqZWN0IG93bmVyRWxlbWVudCwgT2JqZWN0IGNhdXNlRWxlbWVudCwgCi0JCQlpbnQgcmVsYXRpb24pIHsKLQkJc3VwZXIoZXJyb3JMZXZlbCwgbWVzc2FnZSwgb3duZXJFbGVtZW50LCBjYXVzZUVsZW1lbnQsIHJlbGF0aW9uKTsKLQkJdGhpcy5jb25maWdJZCA9IGNvbmZpZy5nZXRHdWlkKCk7Ci0JfQotCi0JCi0JLy8gbWV0aG9kcyBmb3IgdGhlIElDb25maWd1cmF0aW9uRXJyb3IKLQkvLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldENhdXNlTWV0aG9kRWxlbWVudCgpIHsKLQkJaWYgKCB0aGlzLmNhdXNlRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXJldHVybiAoTWV0aG9kRWxlbWVudCl0aGlzLmNhdXNlRWxlbWVudDsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RXJyb3JNZXRob2RFbGVtZW50KCkgewotCQlpZiAoIHRoaXMub3duZXJFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApIHsKLQkJCXJldHVybiAoTWV0aG9kRWxlbWVudCl0aGlzLm93bmVyRWxlbWVudDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlNZXRob2RFbGVtZW50IG0xID0gZ2V0RXJyb3JNZXRob2RFbGVtZW50KCk7Ci0JCU1ldGhvZEVsZW1lbnQgbTIgPSBnZXRDYXVzZU1ldGhvZEVsZW1lbnQoKTsKLQkJaWYgKCBtMSAhPSBudWxsICYmIG0yICE9IG51bGwgKSB7Ci0JCQlyZXR1cm4gY29uZmlnSWQgKyAiLCIgKyBtMS5nZXRHdWlkKCkgKyAiLCIgKyBtMi5nZXRHdWlkKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCQotCQlyZXR1cm4gSW50ZWdlci50b0hleFN0cmluZyh0aGlzLmhhc2hDb2RlKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKSB7Ci0JCXN3aXRjaCAoZ2V0RXJyb3JMZXZlbCgpICkgewotCQljYXNlIEVycm9ySW5mby5FUlJPUjoKLQkJCXJldHVybiBJTWFya2VyLlNFVkVSSVRZX0VSUk9SOwotCQljYXNlIEVycm9ySW5mby5XQVJOSU5HOiAKLQkJCXJldHVybiBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkc7Ci0JCX0KLQkJCi0JCXJldHVybiBJTWFya2VyLlNFVkVSSVRZX0lORk87Ci0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0VsZW1lbnRSZWZlcmVuY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRWxlbWVudFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2U0YjRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRWxlbWVudFJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgZGVmaW5lcyBhbiBFbGVtZW50IFJlZmVyZW5jZSBiZXR3ZWVuIHR3byBlbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRSZWZlcmVuY2UgewotCi0JTWV0aG9kRWxlbWVudCBlbGVtZW50LCByZWZFbGVtZW50OwotCQotCS8vIHNhdmUgdGhlIGZlYXR1cmVzIHJlbGF0aW5nIHRvIHRoaXMgcmVmZXJlbmNlCi0JTGlzdDxFU3RydWN0dXJhbEZlYXR1cmU+IGZlYXR1cmVzID0gbmV3IEFycmF5TGlzdDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7Ci0JCi0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgdGhlIHJlZmVyZW5jZSBpbnN0YW5jZQotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gcmVmRWxlbWVudCBNZXRob2RFbGVtZW50IHRoZSByZWZlcmVuY2VkIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgRWxlbWVudFJlZmVyZW5jZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIE1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudCkgewotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLnJlZkVsZW1lbnQgPSByZWZFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSByZWZlcmVuY2VkIGVsZW1lbnQKLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldFJlZkVsZW1lbnQoKSB7Ci0JCXJldHVybiByZWZFbGVtZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJaWYgKCAhZmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkgKSB7Ci0JCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gZmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSk7Ci0JfQotCQotCS8qKgotCSAqIGRlYnVnZ2luZyBtZXRob2QgdG8gcHJpbnQgb3V0IHRoZSByZWxhdGlvbnNoaXAKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50KCkgewotCQlTeXN0ZW0ub3V0Ci0JCQkJLnByaW50bG4oIiAgICAiICsgTGlicmFyeVV0aWwuZ2V0TmFtZShlbGVtZW50KSArICIgLS0+ICIgKyBMaWJyYXJ5VXRpbC5nZXROYW1lKHJlZkVsZW1lbnQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIHJlZmVyZW5jZSBjYW4gYmUgaWdub3JlZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbklnbm9yZSgpIHsKLQkJLy8gaWYgdGhlIGVsZW1lbnQgaGFzIG5vIGNvbnRhaW5lciwgaXQncyBhIGRlbGV0ZWQgZWxlbWVudCwgaWdub3JlIGl0Ci0JCWlmICgoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQkJJiYgKChFT2JqZWN0KSBlbGVtZW50KS5lQ29udGFpbmVyKCkgPT0gbnVsbAotCQkJCXx8IChyZWZFbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCQkmJiAoKEVPYmplY3QpIHJlZkVsZW1lbnQpLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8vIERvbid0IHdhcm4gb24gb3B0aW9uYWwgaW5wdXRzIG5vdCBiZWluZyBwcmVzZW50Ci0JCS8vIHNvIGFkZGVkIHRoZSBjYW5JZ25vcmUoKSBtZXRob2QKLQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2YgVGFzaykgJiYgKHJlZkVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkpIHsKLQkJCS8vIGlmIGl0J3MgYSBtYW5kYXRvcnkgaW5wdXQsIGNhbiBpZ25vcmUKLQkJCWlmICgoKFRhc2spIGVsZW1lbnQpLmdldE1hbmRhdG9yeUlucHV0KCkuY29udGFpbnMocmVmRWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCS8vIG5vdCBtYW5kYXRvcnksIGJ1dCBvcHRpb25hbCwgb2ssIGlnbm9yZSBpdAotCQkJaWYgKCgoVGFzaykgZWxlbWVudCkuZ2V0T3B0aW9uYWxJbnB1dCgpLmNvbnRhaW5zKHJlZkVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQkvLyByb2xlJ3MgbW9kaWZpZXMgZmVhdHVyZSBpcyBhY3R1YWxseSBhIGRlcmVpdmVkIG9wcG9zaXRlIGZlYXR1cmUsCi0JCS8vIGl0J3MgdmFsdWUgY2FuIGJlIGFuIGVsZW1lbnQgbm90IHZpc2libGUgdG8gdGhpcyBwbHVnaW4KLQkJLy8gaWdub3JlIGl0Ci0JCS8vIEludmFsaWQgY29uZmlndXJhdGlvbiBkZXBlbmRlbmN5IGVycm9yIHJlcG9ydGVkCi0JCWlmICgoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGUpICYmIChyZWZFbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpKSB7Ci0JCQlSb2xlIHIgPSAoUm9sZSkgZWxlbWVudDsKLQkJCWlmIChyLmdldE1vZGlmaWVzKCkuY29udGFpbnMocmVmRWxlbWVudCkKLQkJCQkJJiYgIXIuZ2V0UmVzcG9uc2libGVGb3IoKS5jb250YWlucyhyZWZFbGVtZW50KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9FcnJvckluZm8uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRXJyb3JJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NjcyYTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9FcnJvckluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogQW4gRXJyb3JJbmZvIG9iamVjdCBob2xkcyB0aGUgZXJyb3IgbWVzc2FnZSBpbmZvIGNhdXNlZCBieSBhbiBlbGVtZW50LiBUaGUKLSAqIEVycm9ySW5mbyBvYmplY3QgaXMgb3duZWQgYnkgdGhlIG93bmVyIGVsZW1lbnQgd2hpY2ggaGFzIHRoaXMgZXJyb3IKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVycm9ySW5mbyB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSA0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hJTERfRVJST1IgPSA4OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hJTERfV0FSTklORyA9IDE2OwotCi0JLyoqCi0JICogdGhpcyBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgb3duZXIgZWxlbWVudCBhbmQgdGhlIGNhdXNlIGVsZW1lbnQuIAotCSAqIFRoZSBvd25lciBlbGVtZW50IHJlZmVyZW5jZXMgdG8gdGhlIHRoZSBjYXVzZSBlbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVGRVJFTkNFX1RPID0gMTY7Ci0KLQkvKioKLQkgKiB0aGlzIGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBvd25lciBlbGVtZW50IGFuZCB0aGUgY2F1c2UgZWxlbWVudC4gCi0JICogVGhlIG93bmVyIGVsZW1lbnQgaXMgcmVmZXJlbmNlZCBieSB0aGUgdGhlIGNhdXNlIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUZFUkVOQ0VEX0JZID0gMzI7Ci0KLQkvLyBlcnJvciBjYXRlZ29yeQotCXByb3RlY3RlZCBTdHJpbmcgY2F0ZWdvcnk7Ci0JCi0JcHJvdGVjdGVkIGludCBlcnJvckxldmVsOwotCi0JcHJvdGVjdGVkIE9iamVjdCBvd25lckVsZW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNhdXNlRWxlbWVudDsKLQotCXByb3RlY3RlZCBTdHJpbmcgZXJyb3JNZXNzYWdlOwotCi0JcHJvdGVjdGVkIGludCByZWxhdGlvbiA9IDA7Ci0KLQkvL3Byb3RlY3RlZCBDb25maWd1cmF0aW9uQ2xvc3VyZSBjbG9zdXJlID0gbnVsbDsKLQkKLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSBlcnJvckxldmVsIGludCB0aGUgZXJyb3IgbGV2ZWwKLQkgKiBAcGFyYW0gbWVzc2FnZSBTdHJpbmcgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50IE9iamVjdCwgdGhlIGVsZW1lbnQgdGhhdCBvd25zIHRoaXMgZXJyb3IKLQkgKiBAcGFyYW0gY2F1c2VFbGVtZW50IE9iamVjdCwgdGhlIGVsZW1lbnQgdGhhdCBjYXVzZWQgdGhpcyBlcnJvcgotCSAqIEBwYXJhbSByZWxhdGlvbiBpbnQgdGhlIHJlbGF0aGlvc2hpcCBiZXR3ZWVuIHRoZSBvd25lciBlbGVtZW50IGFuZCB0aGUgY2F1c2UgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgRXJyb3JJbmZvKGludCBlcnJvckxldmVsLCBTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IG93bmVyRWxlbWVudCwKLQkJCU9iamVjdCBjYXVzZUVsZW1lbnQsIGludCByZWxhdGlvbikgewotCQkvL3RoaXMuY2xvc3VyZSA9IGNsb3N1cmU7Ci0JCXRoaXMub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50OwotCQl0aGlzLmNhdXNlRWxlbWVudCA9IGNhdXNlRWxlbWVudDsKLQkJdGhpcy5lcnJvckxldmVsID0gZXJyb3JMZXZlbDsKLQkJdGhpcy5lcnJvck1lc3NhZ2UgPSBtZXNzYWdlOwotCQl0aGlzLnJlbGF0aW9uID0gcmVsYXRpb247Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlbGF0aW9uKCkgewotCQlyZXR1cm4gcmVsYXRpb247Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE93bmVyRWxlbWVudCgpIHsKLQkJcmV0dXJuIG93bmVyRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q2F1c2VFbGVtZW50KCkgewotCQlyZXR1cm4gY2F1c2VFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBlcnJvck1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVycm9yTGV2ZWwoKSB7Ci0JCXJldHVybiBlcnJvckxldmVsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXJyb3IoKSB7Ci0JCXJldHVybiAoZXJyb3JMZXZlbCAmIEVSUk9SKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXYXJuaW5nKCkgewotCQlyZXR1cm4gKGVycm9yTGV2ZWwgJiBXQVJOSU5HKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlcnJvciBjYXRlZ29yeQotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIGNhdGVnb3J5OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvSUNvbmZpZ3VyYXRpb25FcnJvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9JQ29uZmlndXJhdGlvbkVycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNjc2ZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9JQ29uZmlndXJhdGlvbkVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBDb25maWd1cmF0aW9uIGVycm9ycwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJhdGlvbkVycm9yIHsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWZmIGVycm9yIGlzIGEgd2FybmluZwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2FybmluZygpOwotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZmYgZXJyb3IgaXMgYW4gZXJyb3IKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Vycm9yKCk7Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgTWV0aG9kRWxlbWVudCBjb250YWluaW5nIHRoZSBlcnJvciwgaWUsIHRoZSBlbGVtZW50IHJlZmVycmluZyB0byBzb21ldGhpbmcgdGhhdCBpcyBtaXNzaW5nCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RXJyb3JNZXRob2RFbGVtZW50KCk7Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgTWV0aG9kRWxlbWVudCBjYXVzaW5nIHRoZSBlcnJvciwgaWUsIHRoZSBlbGVtZW50IHRoYXQgY2FuIGJlIHNlbGVjdGVkIHRvIGZpeCB0aGUgZXJyb3IKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRDYXVzZU1ldGhvZEVsZW1lbnQoKTsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGEgdW5pcXVlIElEIGZvciB0aGlzIGVycm9yCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gb25lIG9mIElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywgSU1hcmtlci5TRVZFUklUWV9JTkZPCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyCi0JICovCi0JcHVibGljIGludCBnZXRTZXZlcml0eSgpOwotCQotCS8qKgotCSAqIGdldCB0aGUgbWVzc2FnZSBzdHJpbmcgZm9yIHRoaXMgZXJyb3IKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBlcnJvciBjYXRlZ29yeQotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9QYWNrYWdlRGVwZW5kZW5jeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9QYWNrYWdlRGVwZW5kZW5jeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODM1NzRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvUGFja2FnZURlcGVuZGVuY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBIb2xkcyB0aGUgYSBsaXN0IG9mIHBhY2thZ2UgcmVmZXJlbmNlcyBvZiBvbmUgcGFja2FnZSBlbGVtZW50IGl0IGFsc28gaG9sZHMgYQotICogbGlzdCBvZiBkZXBlbmRhbnQgcGFja2FnZSBlbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBhY2thZ2VEZXBlbmRlbmN5IGV4dGVuZHMgRWxlbWVudERlcGVuZGVuY3kgewotCi0JcHJpdmF0ZSBib29sZWFuIGxvYWRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogY29uc3RydWN0IGEgcGFja2FnZSBkZXBlbmRlbmN5IGZvciB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIFBhY2thZ2VEZXBlbmRlbmN5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIGxvYWRlZCBmbGFnCi0JICogQHBhcmFtIGxvYWRlZCBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9hZGVkKGJvb2xlYW4gbG9hZGVkKSB7Ci0JCXRoaXMubG9hZGVkID0gbG9hZGVkOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIGlzIGxvYWRlZCBvciBub3QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xvYWRlZCgpIHsKLQkJcmV0dXJuIHRoaXMubG9hZGVkOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgcmVmZXJlbmNlIGZvciBhbiBlbGVtZW50Ci0JICogQHBhcmFtIHJlZkVsZW1lbnQgT2JqZWN0Ci0JICogQHBhcmFtIGNyZWF0ZSBib29sZWFuIGlmIHRydWUgY3JlYXRlIGlmIG5vdCBleGlzdC4KLQkgKiBAcmV0dXJuIFBhY2thZ2VSZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgUGFja2FnZVJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCByZWZFbGVtZW50LCBib29sZWFuIGNyZWF0ZSkgewotCQlQYWNrYWdlUmVmZXJlbmNlIHJlZiA9IChQYWNrYWdlUmVmZXJlbmNlKSBzdXBlcgotCQkJCS5nZXRSZWZlcmVuY2UocmVmRWxlbWVudCk7Ci0JCWlmIChyZWYgPT0gbnVsbCAmJiBjcmVhdGUpIHsKLQkJCXJlZiA9IG5ldyBQYWNrYWdlUmVmZXJlbmNlKGVsZW1lbnQsIHJlZkVsZW1lbnQpOwotCQkJc3VwZXIuYWRkUmVmZXJlbmNlKHJlZik7Ci0JCX0KLQotCQlyZXR1cm4gcmVmOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFBhY2thZ2VSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVmZXJlbmNlcygpOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRBbGxFbGVtZW50UmVmZXJlbmNlcygpIHsKLQkJTGlzdCBhbGxSZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBnZXRQYWNrYWdlUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlQYWNrYWdlUmVmZXJlbmNlIHBrZ1JlZiA9IChQYWNrYWdlUmVmZXJlbmNlKWl0Lm5leHQoKTsKLQkJCWFsbFJlZnMuYWRkQWxsKHBrZ1JlZi5nZXRSZWZlcmVuY2VzKCkpOwotCQl9Ci0JCQotCQlyZXR1cm4gYWxsUmVmczsKLQl9Ci0JCi0JLyoqCi0JICogcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHdpdGggdGhlIGdpdmVuIG93bmVyIGVsZW1lbnQKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50IE9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVJlZmVyZW5jZShNZXRob2RFbGVtZW50IG93bmVyRWxlbWVudCkgewotCQlQYWNrYWdlUmVmZXJlbmNlIHJlZjsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHN1cGVyLmdldFJlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlyZWYgPSAoUGFja2FnZVJlZmVyZW5jZSkgaXQubmV4dCgpOwotCQkJcmVmLnJlbW92ZVJlZmVyZW5jZShvd25lckVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZGVidWcgbWV0aG9kIHRvIHByaW50IG91dCB0aGUgcmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50KCkgewotCQlzdXBlci5wcmludCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9QYWNrYWdlRXJyb3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvUGFja2FnZUVycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjY2JkYjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9QYWNrYWdlRXJyb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIHRoaXMgY2xhc3MgaWRlbnRpZmllcyBhIGNvbmZpZ3VyYXRpb24gZXJyb3IgYmV0d2VlbiB0d28gcGFja2FnZXMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWNrYWdlRXJyb3IgZXh0ZW5kcyBFcnJvckluZm8gewotCi0JTGlzdDxFbGVtZW50RXJyb3I+IGVsZW1lbnRFcnJvcyA9IG51bGw7Ci0JCi0JcHVibGljIFBhY2thZ2VFcnJvcihpbnQgZXJyb3JMZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBvd25lckVsZW1lbnQsIAotCQkJT2JqZWN0IGNhdXNlRWxlbWVudCwgaW50IHJlbGF0aW9uKSB7Ci0JCXN1cGVyKGVycm9yTGV2ZWwsIG1lc3NhZ2UsIG93bmVyRWxlbWVudCwgY2F1c2VFbGVtZW50LCByZWxhdGlvbik7Ci0JCQotCQkvL2NoZWNrRWxlbWVudEVycm9ycygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRFcnJvckxldmVsKGludCBsZXZlbCkgewotCQllcnJvckxldmVsIHw9IGxldmVsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNFbGVtZW50RXJyb3IoKSB7Ci0JCXJldHVybiBlbGVtZW50RXJyb3MgIT0gbnVsbCAmJiBlbGVtZW50RXJyb3Muc2l6ZSgpID4gMDsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDaGlsZEVycm9yKCkgewotCQlyZXR1cm4gKGVycm9yTGV2ZWwgJiBDSElMRF9FUlJPUikgPiAwOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2hpbGRXYXJuaW5nKCkgewotCQlyZXR1cm4gKGVycm9yTGV2ZWwgJiBDSElMRF9XQVJOSU5HKSA+IDA7Ci0JfQotCQotLy8JLyoqCi0vLwkgKiBnZXQgYSBsaXN0IGVsZW1lbnQgZXJyb3JzIHdpdGhpbiB0aGlzIFBhY2thZ2VFcnJvcgotLy8JICogQHJldHVybgotLy8JICovCi0vLwlwdWJsaWMgTGlzdDxFbGVtZW50RXJyb3I+IGdldEVsZW1lbnRFcnJvckxpc3QoKSB7Ci0vLwkJCi0vLwkJcmV0dXJuIHRoaXMuZWxlbWVudEVycm9zOwotLy8JfQotCQotLy8KLS8vCXByaXZhdGUgdm9pZCBjaGVja0VsZW1lbnRFcnJvcnMoKSB7Ci0vLwkJaWYgKCBpc0NoaWxkRXJyb3IoKSB8fCBpc0NoaWxkV2FybmluZygpICkgewotLy8JCQlyZXR1cm47Ci0vLwkJfQotLy8JCQotLy8JCXRoaXMuZWxlbWVudEVycm9zID0gbmV3IEFycmF5TGlzdDxFbGVtZW50RXJyb3I+KCk7Ci0vLwotLy8JCWludCByZWxhdGlvbiA9IHRoaXMuZ2V0UmVsYXRpb24oKTsKLS8vCQlNZXRob2RFbGVtZW50IG93bmVyRWxlbWVudCA9IChNZXRob2RFbGVtZW50KSB0aGlzLmdldE93bmVyRWxlbWVudCgpOwotLy8JCU1ldGhvZEVsZW1lbnQgY2F1c2VFbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIHRoaXMuZ2V0Q2F1c2VFbGVtZW50KCk7Ci0vLwkJUGFja2FnZURlcGVuZGVuY3kgZGVwOwotLy8JCVBhY2thZ2VSZWZlcmVuY2UgcGtnUmVmID0gbnVsbDsKLS8vCi0vLwkJaWYgKHJlbGF0aW9uID09IEVycm9ySW5mby5SRUZFUkVOQ0VfVE8pIHsKLS8vCQkJZGVwID0gY2xvc3VyZS5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldERlcGVuZGVuY3lNYW5hZ2VyKCkKLS8vCQkJCQkuZ2V0RGVwZW5kZW5jeShvd25lckVsZW1lbnQpOwotLy8JCQlwa2dSZWYgPSBkZXAuZ2V0UmVmZXJlbmNlKGNhdXNlRWxlbWVudCwgZmFsc2UpOwotLy8JCX0gZWxzZSBpZiAocmVsYXRpb24gPT0gRXJyb3JJbmZvLlJFRkVSRU5DRURfQlkpIHsKLS8vCQkJZGVwID0gY2xvc3VyZS5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldERlcGVuZGVuY3lNYW5hZ2VyKCkKLS8vCQkJCQkuZ2V0RGVwZW5kZW5jeShjYXVzZUVsZW1lbnQpOwotLy8JCQlwa2dSZWYgPSBkZXAuZ2V0UmVmZXJlbmNlKG93bmVyRWxlbWVudCwgZmFsc2UpOwotLy8JCX0KLS8vCi0vLwkJaWYgKHBrZ1JlZiAhPSBudWxsKSB7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXQgPSBwa2dSZWYuZ2V0UmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0vLwkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCUVsZW1lbnRSZWZlcmVuY2UgcmVmID0gKEVsZW1lbnRSZWZlcmVuY2UpIGl0Lm5leHQoKTsKLS8vCi0vLwkJCQkvLyBEb24ndCBzaG93IHRoZSBlbnRyeSBpZiB0aGUgcmVmZXJlbmNlIGNhbiBiZSBpZ25vcmVkLgotLy8JCQkJaWYgKHJlZi5jYW5JZ25vcmUoKSkgewotLy8JCQkJCWNvbnRpbnVlOwotLy8JCQkJfQotLy8JCQkJRWxlbWVudEVycm9yIGVsZW1lbnRFcnJvcjsKLS8vCQkJCVN0cmluZyBtZXNzYWdlID0gIiI7Ci0vLwkJCQlNZXRob2RFbGVtZW50IGUxLCBlMjsKLS8vCi0vLwkJCQlpZiAocmVsYXRpb24gPT0gRXJyb3JJbmZvLlJFRkVSRU5DRV9UTykgewotLy8JCQkJCWUxID0gKE1ldGhvZEVsZW1lbnQpcmVmLmdldEVsZW1lbnQoKTsKLS8vCQkJCQllMiA9IChNZXRob2RFbGVtZW50KXJlZi5nZXRSZWZFbGVtZW50KCk7Ci0vLwkJCQl9IGVsc2UgewotLy8JCQkJCWUyID0gKE1ldGhvZEVsZW1lbnQpcmVmLmdldEVsZW1lbnQoKTsKLS8vCQkJCQllMSA9IChNZXRob2RFbGVtZW50KXJlZi5nZXRSZWZFbGVtZW50KCk7Ci0vLwkJCQl9Ci0vLwotLy8JCQkJLy8gaWYgdGhlIGVsZW1lbnQgaXMgc3VidHJhY3RlZCwgZG9uJ3QgaW5jbHVkZSB0aGUgcmVmZXJlbmNlCi0vLwkJCQlpZiAoIGNsb3N1cmUuaXNFbGVtZW50U3VidHJhY3RlZChlMSkgKSB7Ci0vLwkJCQkJY29udGludWU7Ci0vLwkJCQl9Ci0vLwkJCQkKLS8vCQkJCW1lc3NhZ2UgPSBMaWJyYXJ5UmVzb3VyY2VzLmJpbmQoTGlicmFyeVJlc291cmNlcy5FbGVtZW50RXJyb3JfbWlzc2luZ19lbGVtZW50X21lc3NhZ2UsIAotLy8JCQkJCQkobmV3IFN0cmluZ1tdIHtMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlMSksIAotLy8JCQkJCQkJCUxpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGUyKSB9KSk7Ci0vLwkJCQkKLS8vCQkJCWVsZW1lbnRFcnJvciA9IG5ldyBFbGVtZW50RXJyb3IoCi0vLwkJCQkJCXRoaXMuY2xvc3VyZSwgdGhpcy5nZXRFcnJvckxldmVsKCksCi0vLwkJCQkJCW1lc3NhZ2UsIGUxLCBlMiwgcmVsYXRpb24pOyAvLyROT04tTkxTLTEkCi0vLwotLy8JCQkJdGhpcy5lbGVtZW50RXJyb3MuYWRkKGVsZW1lbnRFcnJvcik7Ci0vLwkJCX0KLS8vCQl9Ci0vLwl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL1BhY2thZ2VSZWZlcmVuY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvUGFja2FnZVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmRlZjIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvUGFja2FnZVJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBBIHBhY2thZ2UgcmVmZXJlbmNlIGhvbGRzIHRoZSByZWZlcmVuY2Ugb2YgdGhlIGN1cnJlbnQgcGFja2FnZSBlbGVtZW50IHRvCi0gKiBhbm90aGVyIHBhY2thZ2UgZWxlbWVudC4gSWYgb25lIGVsZW1lbnQgaW4gdGhlIHBhY2thZ2UgcmVmZXJlbmNlcyB0byBhbm90aGVyCi0gKiBlbGVtZW50IGluIGFub3RoZXIgcGFja2FnZSwgdGhlIHRoaXMgcGFja2FnZSByZWZlcmVjZXMgdG8gdGhhdCBwYWNrYWdlLgotICogVW5saWtlIGVsZW1lbnQgcmVmZXJlbmNlcywgUGFja2FnZVJlZmVyZW5jZSBob2xkIGEgb25lIHRvIG9uZSByZWxhdGlvbnNoaXAKLSAqIGJldHdlZW4gdHdvIHBhY2thZ2VzIFRoZSBQYWNrYWdlcmVmZXJlbmNlIG9iamVjdCBhbHNvIGhvbGQgYSBsaXN0IG9mCi0gKiBFbGVtZW50UmVmZXJlbmNlcyBmb3IgYmV0d2VlbiB0aGUgdHdvIHBhY2thZ2VzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWNrYWdlUmVmZXJlbmNlIGV4dGVuZHMgRWxlbWVudFJlZmVyZW5jZSB7Ci0JCi0JLy8gbGlzdCBvZiBlbGVtZW50IHJlZmVyZWNlcyBiZXR3ZWVuIHRoZSB0d28gcGFja2FnZQotCXByaXZhdGUgTGlzdCByZWZMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIFBhY2thZ2VSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQpIHsKLQkJc3VwZXIoZWxlbWVudCwgcmVmRWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgbmV3IGVsZW1lbnQgcmVmZXJlbmNlIGlmIHRoZSByZWZlcmVuY2UgaXMgbm90IHNldC4gY2FsbAotCSAqIGhhc1JlZmVyZW5jZShPYmplY3QgZWxlbWVudCwgT2JqZWN0IHJlZkVsZW1lbnQpIGJlZm9yZSBjYWxsaW5nIHRoaXMKLQkgKiBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcmVmCi0JICovCi0JcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlKEVsZW1lbnRSZWZlcmVuY2UgcmVmKSB7Ci0JCXJlZkxpc3QuYWRkKHJlZik7Ci0JfQotCi0JLyoqCi0JICogZ2V0IGEgbGlzdCBvZiBlbGVtZW50IHJlZmVyZW5jZXMgYW1vbmcgdGhpcyBwYWNrYWdlIHJlZmVyZW5jZQotCSAqIAotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2YgRWxlbWVudFJlZmVyZW5jZSBvYmplY3RzCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIHJlZkxpc3Q7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50IHJlZmVyZW5jZSBpbiB0aGlzIHBhY2thZ2UgcmVmZXJlbmNlCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gcmVmRWxlbWVudAotCSAqIEByZXR1cm4gRWxlbWVudFJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBFbGVtZW50UmVmZXJlbmNlIGdldFJlZmVyZW5jZShPYmplY3QgZWxlbWVudCwgT2JqZWN0IHJlZkVsZW1lbnQpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHJlZkxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRWxlbWVudFJlZmVyZW5jZSByZWYgPSAoRWxlbWVudFJlZmVyZW5jZSkgaXQubmV4dCgpOwotCQkJaWYgKHJlZi5nZXRFbGVtZW50KCkgPT0gZWxlbWVudAotCQkJCQkmJiByZWYuZ2V0UmVmRWxlbWVudCgpID09IHJlZkVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gcmVmOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIGNoZWNrIHRoZSBlbGVtZW50IHJlZmVyZW5jZSBleGlzdHMgaW4gdGhpcyBwYWNrYWdlIHJlZmVyZW5jZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIHJlZkVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTWV0aG9kRWxlbWVudCByZWZFbGVtZW50KSB7Ci0JCQotCQlyZXR1cm4gZ2V0UmVmZXJlbmNlKGVsZW1lbnQsIHJlZkVsZW1lbnQpICE9IG51bGw7Ci0JfQotCi0vLwkvKioKLS8vCSAqIGNoZWNrIGlmIHRoZXJlIGlzIGEgcmVmZXJlbmNlIG9mIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudAotLy8JICogQHJldHVybgotLy8JICovCi0vLwlwdWJsaWMgYm9vbGVhbiBoYXNCYXNlUmVmZXJlbmNlKCkgewotLy8JCWZvciAoSXRlcmF0b3IgaXQgPSByZWZMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLS8vCQkJRWxlbWVudFJlZmVyZW5jZSByZWYgPSAoRWxlbWVudFJlZmVyZW5jZSkgaXQubmV4dCgpOwotLy8JCQlpZiAocmVmIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50UmVmZXJlbmNlKSB7Ci0vLwkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJfQotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIGZhbHNlOwotLy8JfQotCi0JLyoqCi0JICogcmVtb3ZlIHRoZSByZWZlcmVuY2Ugb3duZXJkIGJ5IHRoZSBzcGVjaWZpZWQgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBvd25lckVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQpIHsKLQkJT2JqZWN0IGU7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGkgPCByZWZMaXN0LnNpemUoKSkgewotCQkJRWxlbWVudFJlZmVyZW5jZSByZWYgPSAoRWxlbWVudFJlZmVyZW5jZSkgcmVmTGlzdC5nZXQoaSk7Ci0JCQllID0gcmVmLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlICE9IG51bGwgJiYgZSA9PSBvd25lckVsZW1lbnQpIHsKLQkJCQlyZWZMaXN0LnJlbW92ZShpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcHJpbnQgb3V0Ci0JICovCi0JcHVibGljIHZvaWQgcHJpbnQoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihMaWJyYXJ5VXRpbC5nZXROYW1lKGVsZW1lbnQpCi0JCQkJKyAiIC0tPiAiICsgTGlicmFyeVV0aWwuZ2V0TmFtZShyZWZFbGVtZW50KSk7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVmTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkoKEVsZW1lbnRSZWZlcmVuY2UpIGl0Lm5leHQoKSkucHJpbnQoKTsKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBwYWNrYWdlIHJlZmVyZW5jZSBjYW4gYmUgaWdub3JlZAotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbklnbm9yZSgpIHsKLQkJLy8gaWYgdGhlIHBhY2thZ2UgaGFzIG5vIGVsZW1lbnQgcmVmZXJlbmNlIG9yIGFsbCBlbGVtZW50IHJlZmVyZW5jZXMgY2FuCi0JCS8vIGJlIGlnbm9yZWQsIHJldHVybiB0cnVlCi0JCS8vIG90aGVyd2lzZSwgZmFsc2UKLQkJTGlzdCByZWZzID0gdGhpcy5nZXRSZWZlcmVuY2VzKCk7Ci0KLQkJaWYgKHJlZnMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHJlZnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRWxlbWVudFJlZmVyZW5jZSByZWYgPSAoRWxlbWVudFJlZmVyZW5jZSkgaXQubmV4dCgpOwotCQkJaWYgKCFyZWYuY2FuSWdub3JlKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMzNmZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZWxlbWVudCByZWFsaXphdGlvbiBzdXBwb3J0IGluIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2V2ZW50cy9JTGlicmFyeUNoYW5nZUxpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZXZlbnRzL0lMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxMjY2Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZXZlbnRzL0lMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciB7Ci0KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElPTl9MT0FERUQgPSAweDE7Ci0KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElPTl9TQVZFRCA9IDB4MjsKLQotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OX0NSRUFURUQgPSAweDQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05fQ0hBTkdFRCA9IDB4ODsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElPTl9ERUxFVEVEID0gMHgxMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElPTl9ORVdDSElMRCA9IDB4MjA7Ci0KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElPTl9DT05GSUdVUkFUSU9OX1NFTEVDVEVEID0gMHg0MDsKLQotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OX0xJQlJBUllfQ0xPU0VEID0gMHg4MDsKLQotCS8qKgotCSAqIG5vdGlmeSB0aGUgbGlzdGVuZXIgb2YgdGhlIGxpYnJhcnkgY2hhbmdlcy4KLQkgKiAKLQkgKiBAcGFyYW0gb3B0aW9uCi0JICogICAgICAgICAgICBpbnQgb25lIG9mIHRoZSBjaGFuZ2Ugb3B0aW9ucwotCSAqIEBwYXJhbSBjb2xsZWN0aW9uCi0JICogICAgICAgICAgICB0aGUgY2hhbmdlZCBlbGVtZW50cyBpbiB0aGUgbGlicmFyeSwgaWYgdGhlIG9wdGlvbiBpcwotCSAqICAgICAgICAgICAgT1BUSU9OX0NIQU5HRUQsIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2V2ZW50cy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZXZlbnRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBiYWM2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZXZlbnRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciBtZXRob2QgbGlicmFyeSBldmVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2ludGVybmFsL0xpYnJhcnlNYW5hZ2VyRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2ludGVybmFsL0xpYnJhcnlNYW5hZ2VyRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWFkYjI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9pbnRlcm5hbC9MaWJyYXJ5TWFuYWdlckVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmludGVybmFsOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBNb2RlbHMgYSAibGlicmFyeU1hbmFnZXIiIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBpbiB0aGUKLSAqICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5saWJyYXJ5TWFuYWdlcnMiIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeU1hbmFnZXJFbGVtZW50IHsKLQotCS8vIFRoZSBjb250cmlidXRpbmcgcGx1Zy1pbi4KLQlwcml2YXRlIEJ1bmRsZSBidW5kbGU7Ci0KLQkvLyBUaGUgbGlicmFyeSBtYW5hZ2VyIGNsYXNzIG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCi0JLy8gVGhlIGxpYnJhcnkgdHlwZSBpZGVudGlmaWVyLgotCXByaXZhdGUgU3RyaW5nIHR5cGVJZDsKLQotCS8vIFRoZSBsaWJyYXJ5IHR5cGUgZGlzcGxheSBuYW1lLgotCXByaXZhdGUgU3RyaW5nIHR5cGVOYW1lOwotCQotCXByaXZhdGUgaW50IHZlcnNpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250cmlidXRpbmcgcGx1Zy1pbgotCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkgKiAgICAgICAgICAgIHRoZSBsaWJyYXJ5IG1hbmFnZXIgY2xhc3MgbmFtZQotCSAqIEBwYXJhbSB0eXBlSWQKLQkgKiAgICAgICAgICAgIHRoZSBsaWJyYXJ5IHR5cGUgaWRlbnRpZmllcgotCSAqIEBwYXJhbSB0eXBlTmFtZQotCSAqICAgICAgICAgICAgdGhlIGxpYnJhcnkgdHlwZSBkaXNwbGF5IG5hbWUKLQkgKi8KLQlwdWJsaWMgTGlicmFyeU1hbmFnZXJFbGVtZW50KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBjbGFzc05hbWUsCi0JCQlTdHJpbmcgdHlwZUlkLCBTdHJpbmcgdHlwZU5hbWUsIGludCB2ZXJzaW9uKSB7Ci0JCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJdGhpcy50eXBlSWQgPSB0eXBlSWQ7Ci0JCXRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwbHVnLWluIHRoYXQgY29udHJpYnV0ZWQgdGhlIGV4dGVuc2lvbiBwb2ludAotCSAqIAotCSAqIEByZXR1cm4gYSBwbHVnLWluIGJ1bmRsZQotCSAqLwotCXB1YmxpYyBCdW5kbGUgZ2V0QnVuZGxlKCkgewotCQlyZXR1cm4gYnVuZGxlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlICJjbGFzcyIgYXR0cmlidXRlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgbWFuYWdlciBjbGFzcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlICJ0eXBlIiBhdHRyaWJ1dGUgdmFsdWUuCi0JICogCi0JICogQHJldHVybiBhIHVuaXF1ZSBzdHJpbmcgSUQgZm9yIHRoZSBsaWJyYXJ5IHR5cGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVJZCgpIHsKLQkJcmV0dXJuIHR5cGVJZDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSAidHlwZU5hbWUiIGF0dHJpYnV0ZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgZGlzcGxheSBuYW1lIGZvciB0aGUgbGlicmFyeSB0eXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHR5cGVOYW1lOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2ludGVybmFsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MWQwYTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2ludGVybmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGV4dGVuc2lvbiBwb2ludCBtYW5hZ2VtZW50IGZvciB0aGUgbGlicmFyeSBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvQm9va21hcmsuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvQm9va21hcmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZhZWZiOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0Jvb2ttYXJrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBib29rbWFyayBkYXRhIHN0cnVjdHVyZSBmb3IgdGhlIHB1Ymxpc2hlZCBib29rbWFyayBlbnRyaWVzLiAKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJvb2ttYXJrIHsKLQotCXN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzY1MjU4Mjc5MTMyNjMyMzg2M0w7Ci0KLQkvLyBwb2ludHMgdG8gdGhlIGRlc2NyaXB0aW9uIGZpbGUgaW4gdGhlIGZpbGUgc3lzdGVtCi0JcHJpdmF0ZSBTdHJpbmcgX2ZpbGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHVzZWQgYXMgImNsb3NlZCIgb3IgImRlZmF1bHQiIGljb24KLQlwcml2YXRlIFN0cmluZyBfY2xvc2VkSWNvbk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gdXNlZCBhcyAib3BlbiIgaWNvbgotCXByaXZhdGUgU3RyaW5nIF9vcGVuSWNvbk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gcHJlc2VudGF0aW9uIG5hbWUgb2YgdGhlIGVudHJ5Ci0JcHJpdmF0ZSBTdHJpbmcgX3ByZXNlbnRhdGlvbk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gd2hldGhlciBtb3VzZSBpcyBvdmVyIHRoZSBib29rbWFyawotCS8vIHRoaXMgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ci0JLy8gcHJpdmF0ZSBib29sZWFuIF9pc01vdXNlT3ZlciA9IGZhbHNlOwotCi0JLy8gd2hldGhlciB0aGUgZmlsZSBleGlzdHMgaW4gdGhlIGZpbGUgc3lzdGVtCi0JcHJpdmF0ZSBib29sZWFuIF9pc0V4aXN0ID0gdHJ1ZTsKLQotCS8vIHdoZXRoZXIgdGhlIGZpbGUgaXMgZnJvbSBjb250ZW50IGxpYnJhcnkKLQlwcml2YXRlIGJvb2xlYW4gX2lzRnJvbUNvbnRlbnRMaWJyYXJ5ID0gdHJ1ZTsKLQotCS8vIHVuaXF1ZSBpZC4KLQkvLyBBIGJvb2ttYXJrIG1heSBub3QgaGF2ZSBhIHVuaXF1ZUlEIGluIHdoaWNoIGNhc2UgdGhlCi0JLy8gYm9va21hcmsgaGFzIG5vIHJlbGF0aW9uIHRvIGFueSBsYXlvdXQgZWxlbWVudHMuCi0JcHJpdmF0ZSBTdHJpbmcgX3VuaXF1ZUlkID0gbnVsbDsKLQotCS8vIHdoZXRoZXIgdGhlIGJvb2ttYXJrIGlzIHZpc2libGUKLQlwcml2YXRlIGJvb2xlYW4gX2lzVmlzaWJsZSA9IHRydWU7Ci0KLQkvLyB3aGV0aGVyIHRoZSBib29rbWFyayBpcyBlbmFibGVkCi0JLy8gdGhpcyBpcyB0byBzdXBwb3J0IGEgc3BlY2lhbCBjYXNlIHdoZXJlIGJvb2ttYXJrcwotCS8vIGFyZSB0byByZW1haW4gaGlkZGVuIGFuZCBjYW5ub3QgYmUgdW5oaWRkZW4gYXMKLQkvLyB3ZWxsIGFzIHRyYW5zcGFyZW5jeQotCXByaXZhdGUgYm9vbGVhbiBfaXNFbmFibGVkID0gdHJ1ZTsKLQotCS8vIHdoZXRoZXIgdGhlIGJvb2ttYXJrIGlzIHRyYW5zcGFyZW50Ci0JcHJpdmF0ZSBib29sZWFuIF9pc1RyYW5zcGFyZW50ID0gZmFsc2U7Ci0KLQkvLyB3aGV0aGVyIHRoZSBib29rbWFyayBpcyBhIGRlZmF1bHQgb25lCi0JLy8gZGVmYXVsdCBtZWFucyB0aGF0IGl0IGlzIHB1Ymxpc2hlZCBhbmQgaXMgcmVhZC1vbmx5Ci0JcHJpdmF0ZSBib29sZWFuIF9pc0RlZmF1bHQgPSBmYWxzZTsKLQotCS8vIHdoZXRoZXIgdGhlIGJvb2ttYXJrIGlzIHRoZSBjdXJyZW50IG9uZQotCS8vIGN1cnJlbnQgbWVhbnMgdGhlIGZpcnN0IG9uZSB0byBiZSBmb2N1c2VkIG9uCi0JcHJpdmF0ZSBib29sZWFuIF9pc0N1cnJlbnQgPSBmYWxzZTsKLQotCXByaXZhdGUgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIEJvb2ttYXJrIHBhcmVudCA9IG51bGw7Ci0JCi0JLy8gdGhlIG93bmVyIGVsZW1lbnQgb2YgdGhlIG5vZGUKLQlwcml2YXRlIE9iamVjdCBvd25lciA9IG51bGw7Ci0JCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gVGFrZXMgaW4gdGhlIHByZXNlbnRhdGlvbiBuYW1lIG9mIHRoZSBwcm9jZXNzIGxheW91dAotCSAqIGVudHJ5LgotCSAqLwotCXB1YmxpYyBCb29rbWFyayhTdHJpbmcgbmFtZSkgewotCQlfdW5pcXVlSWQgPSBudWxsOwotCQlfcHJlc2VudGF0aW9uTmFtZSA9IG5hbWU7Ci0JCWlmIChfcHJlc2VudGF0aW9uTmFtZSA9PSBudWxsKSB7Ci0JCQlfcHJlc2VudGF0aW9uTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOYW1lIGFuZCB1bmlxdWVJZCBmb3IgYSBsYXlvdXQgbm9kZS4KLQkgKi8KLQlwdWJsaWMgQm9va21hcmsoU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUsIFN0cmluZyB1bmlxdWVJZCkgewotCQl0aGlzKHByZXNlbnRhdGlvbk5hbWUpOwotCQlfdW5pcXVlSWQgPSB1bmlxdWVJZDsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE93bmVyKE9iamVjdCBlbGVtZW50KSB7Ci0JCXRoaXMub3duZXIgPSBlbGVtZW50OwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldE93bmVyKCkgewotCQlyZXR1cm4gdGhpcy5vd25lcjsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gcmV0dXJuIHByZXNlbnRhdGlvbiBuYW1lIGFzIHRoZSB1c2VyIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFVzZXJPYmplY3QoKSB7Ci0JCXJldHVybiAoX3ByZXNlbnRhdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgdXNlciBvYmplY3QKLQkgKiBAcGFyYW0gdXNlck9iamVjdCBPYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2VyT2JqZWN0KE9iamVjdCB1c2VyT2JqZWN0KSB7Ci0JCV9wcmVzZW50YXRpb25OYW1lID0gKFN0cmluZykgdXNlck9iamVjdDsKLQkJaWYgKF9wcmVzZW50YXRpb25OYW1lID09IG51bGwpIHsKLQkJCV9wcmVzZW50YXRpb25OYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgcHJlc2VudGF0aW9uIG5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZW50YXRpb25OYW1lKFN0cmluZyBuYW1lKSB7Ci0JCV9wcmVzZW50YXRpb25OYW1lID0gbmFtZTsKLQkJaWYgKF9wcmVzZW50YXRpb25OYW1lID09IG51bGwpIHsKLQkJCV9wcmVzZW50YXRpb25OYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgcHJlc2VudGF0aW9uIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlc2VudGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIChfcHJlc2VudGF0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSBmaWxlIG5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgbmFtZSkgewotCQlfZmlsZU5hbWUgPSBuYW1lOwotCQlpZiAoX2ZpbGVOYW1lID09IG51bGwpIHsKLQkJCV9maWxlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGZpbGUgbmFtZQotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIChfZmlsZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgaWNvbiBuYW1lIGZvciB0aGUgY2xvc2VkIGljb24KLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbG9zZWRJY29uTmFtZShTdHJpbmcgbmFtZSkgewotCQlfY2xvc2VkSWNvbk5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgY2xvc2VkIGljb24gbmFtZQotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbG9zZWRJY29uTmFtZSgpIHsKLQkJcmV0dXJuIChfY2xvc2VkSWNvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgb3BlbiBpY29uIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgb3BlbiBpY29uIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE9wZW5JY29uTmFtZSgpIHsKLQkJcmV0dXJuIChfb3Blbkljb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIG9wZW4gaWNvbiBuYW1lCi0JICogCi0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3Blbkljb25OYW1lKFN0cmluZyBuYW1lKSB7Ci0JCV9vcGVuSWNvbk5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgZXhpc3QgZmxhZwotCSAqIAotCSAqIEBwYXJhbSBpc0V4aXN0IGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGlzdChib29sZWFuIGlzRXhpc3QpIHsKLQkJX2lzRXhpc3QgPSBpc0V4aXN0OwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZXhpc3QgZmxhZwotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXhpc3QoKSB7Ci0JCXJldHVybiAoX2lzRXhpc3QpOwotCX0KLQotCS8qKgotCSAqIHRoaXMgaXMgYSBsZWdhY3kgbWV0aG9kLCBub3QgdXNlZCBhbnkgbW9yZQotCSAqIEBkZXByZWNhdGVkCi0JICogQHBhcmFtIGZsYWcgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZyb21Db250ZW50TGlicmFyeShib29sZWFuIGZsYWcpIHsKLQkJX2lzRnJvbUNvbnRlbnRMaWJyYXJ5ID0gZmxhZzsKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIGlzIGEgbGVnYWN5IG1ldGhvZCwgbm90IHVzZWQgYW55IG1vcmUKLQkgKiBAZGVwcmVjYXRlZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRnJvbUNvbnRlbnRMaWJyYXJ5KCkgewotCQlyZXR1cm4gKF9pc0Zyb21Db250ZW50TGlicmFyeSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB1bmlxdWUgaWQgb2YgdGhlIGJvb2ttYXJrCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgewotCQlyZXR1cm4gKF91bmlxdWVJZCk7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSB1bmlxdWUgaWQgb2YgdGhlIGJvb2ttYXJrCi0JICogCi0JICogQHBhcmFtIHVuaXF1ZUlkIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgewotCQlfdW5pcXVlSWQgPSB1bmlxdWVJZDsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIHZpc2libGUgZmxhZwotCSAqIAotCSAqIEBwYXJhbSBpc1Zpc2libGUgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiBpc1Zpc2libGUpIHsKLQkJX2lzVmlzaWJsZSA9IGlzVmlzaWJsZTsKLQkJLy8gc3BlY2lhbCBjYXNlIHdoZXJlIGFsbCBjaGlsZHJlbiBuZWVkIHRvIGNoYW5nZSBhcyB3ZWxsCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0Q2hpbGRDb3VudCgpOyBpKyspIHsKLQkJCUJvb2ttYXJrIGNoaWxkID0gKEJvb2ttYXJrKSAoKEJvb2ttYXJrKSBnZXRDaGlsZEF0KGkpKTsKLQkJCWNoaWxkLnNldFZpc2libGUoaXNWaXNpYmxlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgdmlzaWJsZSBmbGFnCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgewotCQlyZXR1cm4gKF9pc1Zpc2libGUpOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgZW5hYmxlZCBmbGFnCi0JICogCi0JICogQHBhcmFtIGlzRW5hYmxlZCBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGlzRW5hYmxlZCkgewotCQlfaXNFbmFibGVkID0gaXNFbmFibGVkOwotCQkvLyBzcGVjaWFsIGNhc2Ugd2hlcmUgYWxsIGNoaWxkcmVuIG5lZWQgdG8gY2hhbmdlIGFzIHdlbGwKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRDaGlsZENvdW50KCk7IGkrKykgewotCQkJQm9va21hcmsgY2hpbGQgPSAoQm9va21hcmspICgoQm9va21hcmspIGdldENoaWxkQXQoaSkpOwotCQkJY2hpbGQuc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbmFibGVkIGZsYWcKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiAoX2lzRW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSB0cmFuc3BhcmFudCBmbGFnCi0JICogCi0JICogQHBhcmFtIGlzVHJhbnNwYXJlbnQgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYW5zcGFyZW5jeShib29sZWFuIGlzVHJhbnNwYXJlbnQpIHsKLQkJLy8gc2V0IGF0IHRoaXMgYm9va21hcmsgb25seSwgbm90IGNoaWxkcmVuCi0JCV9pc1RyYW5zcGFyZW50ID0gaXNUcmFuc3BhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHRyYW5zcGFyZW50IGZsYWcKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1RyYW5zcGFyZW50KCkgewotCQlyZXR1cm4gKF9pc1RyYW5zcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIGJvb2ttYXJrIGFzIGRlZmF1bHQKLQkgKiAKLQkgKiBAcGFyYW0gaXNEZWZhdWx0IGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KGJvb2xlYW4gaXNEZWZhdWx0KSB7Ci0JCV9pc0RlZmF1bHQgPSBpc0RlZmF1bHQ7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhpcyBib29rbWFyayBpcyBzZXQgYXMgZGVmYXVsdAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIChfaXNEZWZhdWx0KTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIGN1cnJlbnQgZmxhZwotCSAqIAotCSAqIEBwYXJhbSBpc0N1cnJlbnQgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnQoYm9vbGVhbiBpc0N1cnJlbnQpIHsKLQkJX2lzQ3VycmVudCA9IGlzQ3VycmVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGN1cnJlbnQgZmxhZwotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ3VycmVudCgpIHsKLQkJcmV0dXJuIChfaXNDdXJyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIG51bWJlciBvZiBjaGlsZHJlbgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgewotCQlyZXR1cm4gY2hpbGRyZW4uc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyByZWFsIGNoaWxkIGNvdW50IHJlZ2FyZGxlc3Mgb2YgdmlzaWJpbGl0eS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEFjdHVhbENoaWxkQ291bnQoKSB7Ci0JCXJldHVybiAoZ2V0Q2hpbGRDb3VudCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHNwZWNpZmllZCBjaGlsZAotCSAqIEBwYXJhbSBpIGludCBwb3NpdGlvbiBvZiB0aGUgY2hpbGQKLQkgKiBAcmV0dXJuIE9iamVjdCB0aGUgY2hpbGQgYm9va21hcmsKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENoaWxkQXQoaW50IGkpIHsKLQkJcmV0dXJuIGNoaWxkcmVuLmdldChpKTsKLQl9Ci0KLQkvKioKLQkgKiBzYW1lIGFzIGdldENoaWxkQXQKLQkgKiAKLQkgKiBAcGFyYW0gaSBpbnQgcG9zaXRpb24gb2YgdGhlIGNoaWxkCi0JICogQHJldHVybiBPYmplY3QgdGhlIGNoaWxkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxDaGlsZEF0KGludCBpKSB7Ci0JCXJldHVybiBjaGlsZHJlbi5nZXQoaSk7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgbmV3IGNoaWxkIGJvb2ttYXJrCi0JICogCi0JICogQHBhcmFtIGNoaWxkIEJvb2ttYXJrCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2hpbGQoQm9va21hcmsgY2hpbGQpIHsKLQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJY2hpbGQucGFyZW50ID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgQm9va21hcmsgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQ7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgcXVlcnkgc3RyaW5nIHRvIHRoaXMgYm9va21hcmsuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5U3RyaW5nKCkKLQl7Ci0JCXJldHVybiBxdWVyeVN0cmluZzsKLQl9Ci0JCi0JLyoqCi0JICogc2V0IHRoZSBxdWVyeSBzdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gcXVlcnlTdHIgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UXVlcnlTdHJpbmcoU3RyaW5nIHF1ZXJ5U3RyKQotCXsKLQkJdGhpcy5xdWVyeVN0cmluZyA9IHF1ZXJ5U3RyOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHhtbCBkb2N1bWVudCBmb3IgdGhpcyBib29rbWFyay4KLQkgKiAKLQkgKiBAcmV0dXJuIFhtbEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KCkgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBuZXcgWG1sRWxlbWVudCgiRWxlbWVudCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJndWlkIiwgZ2V0VW5pcXVlSWQoKSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBnZXRQcmVzZW50YXRpb25OYW1lKCkudHJpbSgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiY2xvc2VkSWNvbk5hbWUiLCBnZXRDbG9zZWRJY29uTmFtZSgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgib3Blbkljb25OYW1lIiwgZ2V0T3Blbkljb25OYW1lKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJleGlzdCIsIGlzRXhpc3QoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCSJmcm9tQ29udGVudExpYnJhcnkiLCBpc0Zyb21Db250ZW50TGlicmFyeSgpID8gInRydWUiIDogImZhbHNlIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkuc2V0QXR0cmlidXRlKCJ2aXNpYmxlIiwgaXNWaXNpYmxlKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCS5zZXRBdHRyaWJ1dGUoImVuYWJsZWQiLCBpc0VuYWJsZWQoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJLnNldEF0dHJpYnV0ZSgidHJhbnNwYXJlbnQiLCBpc1RyYW5zcGFyZW50KCkgPyAidHJ1ZSIgOiAiZmFsc2UiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCS5zZXRBdHRyaWJ1dGUoImRlZmF1bHQiLCBpc0RlZmF1bHQoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJLnNldEF0dHJpYnV0ZSgiY3VycmVudCIsIGlzQ3VycmVudCgpID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoImNsb3NlZEljb25JZCIsIGdldEljb25JZChnZXRDbG9zZWRJY29uTmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVN0cmluZyBxU3RyID0gZ2V0UXVlcnlTdHJpbmcoKTsKLQkJaWYgKCBxU3RyID09IG51bGwgfHwgcVN0ci5sZW5ndGgoKSA9PSAwICkgewotCQkJcVN0ciA9ICI/bm9kZUlkPSIgKyBlbGVtZW50WG1sLmdldElkKCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCXFTdHIgKz0gIiZub2RlSWQ9IiArIGVsZW1lbnRYbWwuZ2V0SWQoKTsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoInVybCIsIGdldEZpbGVOYW1lKCkgKyBxU3RyKTsgLy8kTk9OLU5MUy0xJAotCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGdldENoaWxkQ291bnQoKTsgaSsrKSB7Ci0JCQlCb29rbWFyayBjaGlsZCA9IChCb29rbWFyaykgZ2V0QWN0dWFsQ2hpbGRBdChpKTsKLQkJCWVsZW1lbnRYbWwuYWRkQ2hpbGQoY2hpbGQuZ2V0WG1sRWxlbWVudCgpKTsKLQkJfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotCQlyZXR1cm4gZ2V0RmlsZU5hbWUoKSArIGdldFF1ZXJ5U3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWNvbklkKFN0cmluZyBpY29uRmlsZU5hbWUpIHsKLQkJaWYgKCBpY29uRmlsZU5hbWUgPT0gbnVsbCApIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIEludGVnZXIudG9IZXhTdHJpbmcoaWNvbkZpbGVOYW1lLmhhc2hDb2RlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0Jvb2ttYXJrTGlzdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9Cb29rbWFya0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRhMTA2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0Jvb2ttYXJrTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyBhIGxpc3Qgb2YgYm9va21hcmtzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCb29rbWFya0xpc3QgewotCi0JLy8gYSBsaXN0IG9mIGJvb2ttYXJrIGl0ZW1zCi0JcHJpdmF0ZSBMaXN0IGJvb2ttYXJrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIGRlZmF1bHQgY29uc3RydWN0b3IKLQkgKgotCSAqLwotCXB1YmxpYyBCb29rbWFya0xpc3QoKSB7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgbmV3IGJvb2ttYXJrICBlbnRyeSB0byB0aGUgbGlzdAotCSAqIEBwYXJhbSBuYW1lIFN0cmluZyB0aGUgQm9va21hcmsgbmFtZQotCSAqIEBwYXJhbSBmaWxlTmFtZSBTdHJpbmcgdGhlIGZpbGUgbmFtZSBvZiB0aGUgYm9va21hcmsKLQkgKiBAcGFyYW0gc2V0QXNEZWZhdWx0IGJvb2xlYW4gc2V0IHRoZSBib29rbWFyayBhcyBkZWZhdWx0IGlmIHRydWUuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQm9va21hcmsoU3RyaW5nIG5hbWUsIFN0cmluZyBmaWxlTmFtZSwgYm9vbGVhbiBzZXRBc0RlZmF1bHQpIHsKLQkJX0Jvb2ttYXJrRW50cnkgZW50cnkgPSBuZXcgX0Jvb2ttYXJrRW50cnkobmFtZSwgZmlsZU5hbWUsIHNldEFzRGVmYXVsdCk7Ci0JCWJvb2ttYXJrcy5hZGQoZW50cnkpOwotCX0KLQotCS8qKgotCSAqIGdldCBhIGxpc3Qgb2YgYm9va21hcmsgZW50cmllcwotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEJvb2ttYXJrcygpIHsKLQkJcmV0dXJuIGJvb2ttYXJrczsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHhtbCBkb2N1bWVudCBmb3IgdGhlIGJvb2ttYXJrIGVudHJpZXMuCi0JICogCi0JICogQHJldHVybiBYbWxFbGVtZW50Ci0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudCgpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gbmV3IFhtbEVsZW1lbnQoIkJvb2ttYXJrcyIpOyAvLyROT04tTkxTLTEkCi0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGJvb2ttYXJrcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlfQm9va21hcmtFbnRyeSBlbnRyeSA9IChfQm9va21hcmtFbnRyeSkgaXQubmV4dCgpOwotCQkJU3RyaW5nIGJvb2ttYXJrID0gZW50cnkuZmlsZU5hbWU7Ci0KLQkJCS8vIFN0cmluZyB0YWJOYW1lPSIiOwotCQkJU3RyaW5nIHVybCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgaW5keCA9IGJvb2ttYXJrLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbmR4ID4gMCkgewotCQkJCS8vIHRhYk5hbWUgPSBib29rbWFyay5zdWJzdHJpbmcoMCwgaW5keCkucmVwbGFjZSgnXycsICcgJyk7Ci0JCQkJdXJsID0gYm9va21hcmsuc3Vic3RyaW5nKDAsIGluZHgpICsgIi5odG1sIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxlbWVudFhtbC5uZXdDaGlsZCgiQm9va21hcmsiKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBib29rbWFyaykgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJ0YWJOYW1lIiwgZW50cnkudGFiTmFtZSkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJ1cmwiLCB1cmwpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkiZGVmYXVsdCIsIChlbnRyeS5pc0RlZmF1bHQpID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIF9Cb29rbWFya0VudHJ5IHsKLQkJcHJpdmF0ZSBTdHJpbmcgZmlsZU5hbWU7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgdGFiTmFtZTsKLQotCQlib29sZWFuIGlzRGVmYXVsdDsKLQotCQlfQm9va21hcmtFbnRyeShTdHJpbmcgbmFtZSwgU3RyaW5nIGZpbGVOYW1lLCBib29sZWFuIGlzRGVmYXVsdCkgewotCQkJdGhpcy50YWJOYW1lID0gbmFtZS50cmltKCk7Ci0JCQl0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7Ci0JCQl0aGlzLmlzRGVmYXVsdCA9IGlzRGVmYXVsdDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9Ccm93c2luZ0xheW91dFNldHRpbmdzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0Jyb3dzaW5nTGF5b3V0U2V0dGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRiMjlmMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0Jyb3dzaW5nTGF5b3V0U2V0dGluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZWZpbmUgdGhlIGJyb3dzaW5nIHNldHRpbmdzLiBVSSBwcmVmZXJlbmNlIGNhbiBzZXQgdGhlIG9wdGlvbnMgdG8gY2hhbmdlIHRoZSBicm93c2luZyBiZWhhdmlvcgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBCcm93c2luZ0xheW91dFNldHRpbmdzIHsKLQotCXB1YmxpYyBzdGF0aWMgQnJvd3NpbmdMYXlvdXRTZXR0aW5ncyBJTlNUQU5DRSA9IG5ldyBCcm93c2luZ0xheW91dFNldHRpbmdzKCk7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbiA9IGZhbHNlOwotCQotCS8vIGlmIHRydWUsIHRoZSB0by1tYW55IG91dGdvaW5nIGFzc29jaWF0aW9uIGZyb20gYmFzZSB3aWxsIGJlIGlnbm9yZWQgaWYgdGhlIGV4dGVuZGVyIGhhcyBpdHMgb3duCi0JcHJpdmF0ZSBib29sZWFuIHVzZU5ld0V4dGVuZFNlbWFudGljcyA9IGZhbHNlOwotCQotCXByaXZhdGUgIEZpbGUgeHNsUGF0aCA9IG51bGw7Ci0JcHJpdmF0ZSAgRmlsZSBjc3NQYXRoID0gbnVsbDsKLQlwcml2YXRlIEZpbGUgc2NyaXB0UGF0aCA9IG51bGw7Ci0JCi0JLy8gcmVjb3JkIGFsbCB0aGUgc2l0ZXMgdXBkYXRlZCBzaW5jZSB0aGUgbGFzdCBjaGFuZ2UKLQlwcml2YXRlICBMaXN0IHVwZGF0ZWRTaXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlwdWJsaWMgdm9pZCBzZXRVc2VOZXdFeHRlbmRTZW1hbnRpY3MoYm9vbGVhbiBmbGFnKSB7Ci0JCXRoaXMudXNlTmV3RXh0ZW5kU2VtYW50aWNzID0gZmxhZzsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNVc2VOZXdFeHRlbmRTZW1hbnRpY3MoKSB7Ci0JCXJldHVybiB0aGlzLnVzZU5ld0V4dGVuZFNlbWFudGljczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycyA9IGZsYWc7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzU2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gdGhpcy5zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLnB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkID0gZmxhZzsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCgpIHsKLQkJcmV0dXJuIHRoaXMucHVibGlzaFVub3BlbkFjdGl2aXR5ZGQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLnB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uID0gZmxhZzsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMucHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb247Ci0JfQotCQotCXB1YmxpYyAgdm9pZCBzZXRYc2xQYXRoKEZpbGUgcGF0aCkgewotCQl4c2xQYXRoID0gcGF0aDsKLQl9Ci0JCi0JcHVibGljICB2b2lkIHNldENzc1BhdGgoRmlsZSBwYXRoKSB7Ci0JCWNzc1BhdGggPSBwYXRoOwotCX0KLQkKLQlwdWJsaWMgIHZvaWQgc2V0U2NyaXB0UGF0aChGaWxlIHBhdGgpIHsKLQkJc2NyaXB0UGF0aCA9IHBhdGg7Ci0JfQotCQotCXB1YmxpYyAgRmlsZSBnZXRYc2xQYXRoKCkgewotCQlyZXR1cm4geHNsUGF0aDsKLQl9Ci0JCi0JcHVibGljICBGaWxlIGdldENzc1BhdGgoKSB7Ci0JCXJldHVybiBjc3NQYXRoOwotCX0KLQkKLQlwdWJsaWMgIEZpbGUgZ2V0U2NyaXB0UGF0aCgpIHsKLQkJcmV0dXJuIHNjcmlwdFBhdGg7Ci0JfQotCQotCXB1YmxpYyAgdm9pZCBzZXRDaGFuZ2VkKCkgewotCQl1cGRhdGVkU2l0ZXMuY2xlYXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljICBib29sZWFuIG5lZWRVcGRhdGUoU3RyaW5nIHB1YkRpcikgewotCQlpZiAoIHB1YkRpciA9PSBudWxsICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiAhdXBkYXRlZFNpdGVzLmNvbnRhaW5zKHB1YkRpcik7Ci0JfQotCQotCXB1YmxpYyAgdm9pZCB1cGRhdGUoSHRtbEJ1aWxkZXIgYnVpbGRlcikgewotCQlpZiAoIChidWlsZGVyID09IG51bGwpIHx8ICFuZWVkVXBkYXRlKGJ1aWxkZXIuZ2V0UHVibGlzaERpcigpKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKCB4c2xQYXRoID09IG51bGwgfHwgY3NzUGF0aCA9PSBudWxsIHx8IHNjcmlwdFBhdGggPT0gbnVsbCkgewotCQkJLy8gdXNlIHRoZSBkZWZhdWx0Ci0JCQlMYXlvdXRSZXNvdXJjZXMuY29weUxheW91dEZpbGVzKGJ1aWxkZXIuZ2V0UHVibGlzaERpcigpKTsKLQkJCWJ1aWxkZXIubG9hZERlZmF1bHRMYXlvdXRYc2woKTsKLQkJfSBlbHNlIHsKLQkJCQotCQkJLy8gc2V0IHRoZSB4c2wgcGF0aAotCQkJYnVpbGRlci5zZXRMYXlvdXRYc2xSb290UGF0aCh4c2xQYXRoLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQotCQkJLy8gY29weSB0aGUgZmlscyB0byB0aGUgcHVibGlzaCBmb2xkZXIKLQkJCVN0cmluZyBpbmNsdWRlID0gIiouKiwqKi8qLioiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgZXhjbHVkZSA9IG51bGw7Ci0JCQlib29sZWFuIG92ZXJyaWRlID0gdHJ1ZTsKLQkJCQotCQkJRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShidWlsZGVyLmdldFB1Ymxpc2hEaXIoKSwgImNzcyIpOwkJCSAvLyROT04tTkxTLTEkCi0JCQlMYXlvdXRSZXNvdXJjZXMuY29weURpcihjc3NQYXRoLCBmb2xkZXIsIGluY2x1ZGUsIGV4Y2x1ZGUsIG92ZXJyaWRlKTsKLQkJCQotCQkJZm9sZGVyID0gbmV3IEZpbGUoYnVpbGRlci5nZXRQdWJsaXNoRGlyKCksICJzY3JpcHRzIik7CQkJIC8vJE5PTi1OTFMtMSQKLQkJCUxheW91dFJlc291cmNlcy5jb3B5RGlyKHNjcmlwdFBhdGgsIGZvbGRlciwgaW5jbHVkZSwgZXhjbHVkZSwgb3ZlcnJpZGUpOwotCQl9Ci0JCQotCQl1cGRhdGVkU2l0ZXMuYWRkKGJ1aWxkZXIuZ2V0UHVibGlzaERpcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0RlZmF1bHRDb250ZW50VmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0RlZmF1bHRDb250ZW50VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNDg0NDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9EZWZhdWx0Q29udGVudFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkNvbnRlbnRSZXNvdXJjZVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBJQ29udGVudFZhbGlkYXRvci4gVGhpcyB2YWxpZGF0b3IgaXMgdXNlZCBmb3IgYnJvd3NpbmcgYW5kIHByZXZpZXcKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29udGVudFZhbGlkYXRvciBpbXBsZW1lbnRzIElDb250ZW50VmFsaWRhdG9yIHsKLQotCXByb3RlY3RlZCBQcmludFN0cmVhbSBpbmZvOwotCi0JcHJvdGVjdGVkIFByaW50U3RyZWFtIHdhcm5pbmc7Ci0KLQlwcm90ZWN0ZWQgUHJpbnRTdHJlYW0gZXJyb3I7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1YkRpcjsKLQotCS8vcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0Jyb2tlbkxpbmtzID0gdHJ1ZTsKLQkJCi0JLyoqCi0JICogY29uc3RydWN0b3IKLQkgKgotCSAqLwotCXB1YmxpYyBEZWZhdWx0Q29udGVudFZhbGlkYXRvcigpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBwdWJEaXIKLQkgKi8KLQlwdWJsaWMgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3IoU3RyaW5nIHB1YkRpcikgewotCQl0aGlzLnB1YkRpciA9IHB1YkRpcjsKLQkJaW5mbyA9IFN5c3RlbS5vdXQ7Ci0JCXdhcm5pbmcgPSBTeXN0ZW0ub3V0OwotCQllcnJvciA9IFN5c3RlbS5lcnI7Ci0JfQotCi0JLyoqCi0JICogc2V0IHB1Ymxpc2ggZGlyCi0JICogQHBhcmFtIHB1YkRpciBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoRGlyKFN0cmluZyBwdWJEaXIpIHsKLQkJdGhpcy5wdWJEaXIgPSBwdWJEaXI7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaERpcigpIHsKLQkJcmV0dXJuIHRoaXMucHViRGlyOwotCX0KLQotLy8JcHVibGljIHZvaWQgc2V0U2hvd0Jyb2tlbkxpbmtzKGJvb2xlYW4gZmxhZykgewotLy8JCXNob3dCcm9rZW5MaW5rcyA9IGZsYWc7Ci0vLwl9Ci0JCi0JcHVibGljIGJvb2xlYW4gc2hvd0Jyb2tlbkxpbmtzKCkgewotCQlyZXR1cm4gdHJ1ZTsgLy8gZGVmYXVsdAotCX0KLQkKLQlwdWJsaWMgdm9pZCBzY2FuQ29udGVudChJRWxlbWVudExheW91dCBsYXlvdXQsIFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCU1ldGhvZEVsZW1lbnQgb3duZXIgPSBsYXlvdXQuZ2V0RWxlbWVudCgpOwotCQlTdHJpbmcgY29udGVudFBhdGggPSBsYXlvdXQuZ2V0RmlsZVBhdGgoKTsKLQotCQlDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXIgPSBnZXRTY2FubmVyKG93bmVyKTsKLQkJaWYgKCBzY2FubmVyICE9IG51bGwgKSB7Ci0JCQlzY2FubmVyLnJlc29sdmVSZXNvdXJjZXMob3duZXIsIGNvbnRlbnQsIGNvbnRlbnRQYXRoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHJlc291cmNlIHNjYW5uZXIgZm9yIHRoZSBlbGVtZW50LgotCSAqLwotCXByaXZhdGUgQ29udGVudFJlc291cmNlU2Nhbm5lciBnZXRTY2FubmVyKE1ldGhvZEVsZW1lbnQgb3duZXIpIHsKLQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3Iob3duZXIpOwotCQlpZiAoIHJlc01nciA9PSBudWxsICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZyByb290Q29udGVudFBhdGggPSByZXNNZ3IuZ2V0TG9naWNhbFBsdWdpblBhdGgob3duZXIpOwotCQlGaWxlIHNyY19yb290ID0gbmV3IEZpbGUocmVzTWdyLmdldFBoeXNpY2FsUGx1Z2luUGF0aChvd25lcikpOwotCQlGaWxlIHRndF9yb290ID0gbmV3IEZpbGUocHViRGlyLCByb290Q29udGVudFBhdGgpOwotCQlDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXIgPSBuZXcgQ29udGVudFJlc291cmNlU2Nhbm5lcihzcmNfcm9vdCwgdGd0X3Jvb3QsIHJvb3RDb250ZW50UGF0aCwgdGhpcyk7Ci0KLQkJcmV0dXJuIHNjYW5uZXI7Ci0JfQotCQotCXB1YmxpYyBMaW5rSW5mbyB2YWxpZGF0ZUxpbmsoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIGF0dHJpYnV0ZXMsCi0JCQlTdHJpbmcgdGV4dCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyB0YWcpIHsKLQotCQlMaW5rSW5mbyBpbmZvID0gbmV3IExpbmtJbmZvKG93bmVyLCB0aGlzLCBwdWJEaXIsIHRhZyk7Ci0JCWluZm8udmFsaWRhdGVMaW5rKGF0dHJpYnV0ZXMsIHRleHQsIGNvbmZpZyk7Ci0KLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JcHVibGljIHZvaWQgbG9nSW5mbyhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpbmZvCi0JCQkJLnByaW50bG4oTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxLCAoKG93bmVyID09IG51bGwpID8gIiIgOiBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShvd25lcikpICsgIjogIiArIG1lc3NhZ2UpKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbmZvLmZsdXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9nV2FybmluZyhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgbWVzc2FnZSkgewotCQl3YXJuaW5nCi0JCQkJLnByaW50bG4oTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0c0LCAoKG93bmVyID09IG51bGwpID8gIiIgOiBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShvd25lcikpICsgIjogIiArIG1lc3NhZ2UpKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl3YXJuaW5nLmZsdXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aCkgewotCQllcnJvcgotCQkJCS5wcmludGxuKE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHNywgKChvd25lciA9PSBudWxsKSA/ICIiIDogTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUob3duZXIpKSArICI6ICIgKyBtZXNzYWdlKSk7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKHRoICE9IG51bGwpIHsKLQkJCXRoLnByaW50U3RhY2tUcmFjZShlcnJvcik7Ci0JCX0KLQkJZXJyb3IuZmx1c2goKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGxvZ0luZm8oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJbG9nSW5mbyhudWxsLCBtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2dXYXJuaW5nKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWxvZ1dhcm5pbmcobnVsbCwgbWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aCkgewotCQlsb2dFcnJvcihudWxsLCBtZXNzYWdlLCB0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9nTWlzc2luZ1JlZmVyZW5jZShNZXRob2RFbGVtZW50IG93bmVyLAotCQkJTWV0aG9kRWxlbWVudCByZWZFbGVtZW50KSB7Ci0JCWxvZ1dhcm5pbmcoCi0JCQkJb3duZXIsCi0JCQkJTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMCwgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUocmVmRWxlbWVudCkpKTsgCi0JfQotCi0JcHVibGljIHZvaWQgbG9nTWlzc2luZ1JlZmVyZW5jZShNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgZ3VpZCwKLQkJCVN0cmluZyBsaW5rZWRUZXh0KSB7Ci0JCWxvZ1dhcm5pbmcob3duZXIsIE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTEsIGd1aWQpKTsgCi0JfQotCi0JcHVibGljIHZvaWQgbG9nTWlzc2luZ1Jlc291cmNlKE1ldGhvZEVsZW1lbnQgb3duZXIsIEZpbGUgcmVzb3VyY2VGaWxlLAotCQkJU3RyaW5nIHVybCkgewotCQlTdHJpbmcgbXNnOwotCQlpZiAocmVzb3VyY2VGaWxlICE9IG51bGwpIHsKLQkJCW1zZyA9IE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTIsIHJlc291cmNlRmlsZS5nZXRQYXRoKCksIHVybCk7IAotCQl9IGVsc2UgewotCQkJbXNnID0gTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNSwgdXJsKTsgCi0JCX0KLQotCQlsb2dXYXJuaW5nKG93bmVyLCBtc2cpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvZ0ludmFsaWRFeHRlcm5hbExpbmsoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIHVybCwKLQkJCVN0cmluZyBtZXNzYWdlKSB7Ci0JCVN0cmluZyB0ZXh0OwotCQlpZiAobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0ZXh0ID0gTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxOSwgdXJsLCBtZXNzYWdlKTsgCi0JCX0gZWxzZSB7Ci0JCQl0ZXh0ID0gTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNywgdXJsKTsgCi0JCX0KLQkJbG9nV2FybmluZyhvd25lciwgdGV4dCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgZGlzY2FyZGVkIG9yIG5vdAotCSAqIGRpc2NhcmRlZCBlbGVtZW50cyB3aWxsIGJlIHRyZWF0ZWQgYXMgb3V0IHNpZGUgdGhlIGNvbmZpZ3Vyc2F0aW9uCi0JICogCi0JICogQHBhcmFtIG93bmVyIE1ldGhvZEVsZW1lbnQgdGhlIG93bmVyIG9mIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIE9iamVjdCBmZWF0dXJlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBvciBPcHBvc2l0ZUZlYXR1cmUKLQkgKiBAcGFyYW0gZSBNZXRob2RFbGVtZW50IHRoZSBlbGVtZW50IHRvIGJlIGNoZWNrZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc2NhcmRlZChNZXRob2RFbGVtZW50IG93bmVyLCBPYmplY3QgZmVhdHVyZSwgTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgb3duZXIsIE1ldGhvZEVsZW1lbnQgZSkKLQl7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHNldERpc2NhcmRlZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBzaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBCcm93c2luZ0xheW91dFNldHRpbmdzLklOU1RBTkNFLmlzU2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCk7Ci0JfQotCQkKLQkvKioKLQkgKiBzaG93IGRlc2NyaXB0b3JzIG9uIG1ldGhvZCBlbGVtZW50IHBhZ2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG93UmVsYXRlZERlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSB0YWIgaWQgZm9yIHRoZSBhY3Rpdml0eSBsYXlvdXQKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEFjdGl2aXR5VGFiKCkgewotCQlyZXR1cm4gbnVsbDsgIC8vIHVzZSB0aGUgZGVmYXVsdAotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9EZWZhdWx0U2hhcGVpY29ucy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9EZWZhdWx0U2hhcGVpY29ucy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGI1NjJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvRGVmYXVsdFNoYXBlaWNvbnMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBEZWZhdWx0IFNoYXBlIEljb24gTWFwcGluZyBmb3IgdGhlIE1ldGhvZCBFbGVtZW50cy4KLQotIyBDb3JlIE1ldGhvZCBFbGVtZW50cwotYXJ0aWZhY3Q9aW1hZ2VzL2FydGlmYWN0LmdpZgotY29udGVudGVsZW1lbnQ9aW1hZ2VzL2d1aWRhbmNlLmdpZgotY29udGVudHBhY2thZ2U9aW1hZ2VzL2NvbnRlbnRfcGFja2FnZS5naWYKLWRlbGl2ZXJhYmxlPWltYWdlcy9hcnRpZmFjdC5naWYKLW1ldGhvZHBsdWdpbj1pbWFnZXMvbWV0aG9kX3BsdWdpbi5naWYKLW91dGNvbWU9aW1hZ2VzL2FydGlmYWN0LmdpZgotcm9sZT1pbWFnZXMvcm9sZS5naWYKLXRhc2s9aW1hZ2VzL3Rhc2suZ2lmCi0KLSMgR3VpZGFuY2UKLWNoZWNrbGlzdD1pbWFnZXMvY2hlY2tsaXN0LmdpZgotY29uY2VwdD1pbWFnZXMvY29uY2VwdC5naWYKLWV4YW1wbGU9aW1hZ2VzL2V4YW1wbGUuZ2lmCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM9aW1hZ2VzL2VzdGltYXRpb25jb25zaWRlcmF0aW9ucy5naWYKLWd1aWRhbmNlPWltYWdlcy9ndWlkYW5jZS5naWYKLWd1aWRsaW5lPWltYWdlcy9ndWlkbGluZS5naWYKLXByYWN0aWNlPWltYWdlcy9wcmFjdGljZS5naWYKLXJvYWRtYXA9aW1hZ2VzL3JvYWRtYXAuZ2lmCi1yZXBvcnQ9aW1hZ2VzL3JlcG9ydC5naWYKLXJldXNhYmxlYXNzZXQ9aW1hZ2VzL3JldXNhYmxlYXNzZXQuZ2lmCi1zdXBwb3J0aW5nbWF0ZXJpYWw9aW1hZ2VzL3N1cHBvcnRpbmdtYXRlcmlhbC5naWYKLXRlY2huaXF1ZT1pbWFnZXMvdGVjaG5pcXVlLmdpZgotdGVtcGxhdGU9aW1hZ2VzL3RlbXBsYXRlLmdpZgotdGVybWRlZmluaXRpb249aW1hZ2VzL3Rlcm1kZWZpbml0aW9uLmdpZgotdG9vbG1lbnRvcj1pbWFnZXMvdG9vbG1lbnRvci5naWYKLXdoaXRlcGFwZXI9aW1hZ2VzL3doaXRlcGFwZXIuZ2lmCi0KLSMgQ29udGVudCBDYXRlZ29yaWVzCi1jdXN0b21jYXRlZ29yeT1pbWFnZXMvY29udGVudF9wYWNrYWdlLmdpZgotZGlzY2lwbGluZT1pbWFnZXMvY29udGVudF9wYWNrYWdlLmdpZgotZGlzY2lwbGluZWdyb3VwaW5nPWltYWdlcy9jb250ZW50X3BhY2thZ2UuZ2lmCi1kb21haW49aW1hZ2VzL2NvbnRlbnRfcGFja2FnZS5naWYKLXJvbGVzZXQ9aW1hZ2VzL2NvbnRlbnRfcGFja2FnZS5naWYKLXJvbGVzZXRncm91cGluZz1pbWFnZXMvY29udGVudF9wYWNrYWdlLmdpZgotdG9vbD1pbWFnZXMvY29udGVudF9wYWNrYWdlLmdpZgotd29ya3Byb2R1Y3R0eXBlPWltYWdlcy9jb250ZW50X3BhY2thZ2UuZ2lmCi0KLSMgUHJvY2VzcyBFbGVtZW50cwotYWN0aXZpdHk9aW1hZ2VzL3Byb2Nlc3MuZ2lmCi1jYXBhYmlsaXR5cGF0dGVybj1pbWFnZXMvcHJvY2Vzcy5naWYKLWRlbGl2ZXJ5cHJvY2Vzcz1pbWFnZXMvcHJvY2Vzcy5naWYKLWl0ZXJhdGlvbj1pbWFnZXMvcHJvY2Vzcy5naWYKLXBoYXNlPWltYWdlcy9wcm9jZXNzLmdpZgotcHJvY2Vzcz1pbWFnZXMvcHJvY2Vzcy5naWYKLQotIyBEZXNjcmlwdG9ycwotY29tcG9zaXRlcm9sZT1pbWFnZXMvY29tcG9zaXRlcm9sZS5naWYKLXJvbGVkZXNjcmlwdG9yPWltYWdlcy9yb2xlZGVzX2xnX2RnbTMyLmdpZgotdGFza2Rlc2NyaXB0b3I9aW1hZ2VzL3Rhc2tkZXNfbGdfZGdtMzIuZ2lmCi10ZWFtcHJvZmlsZT1pbWFnZXMvdGVhbXByb2ZpbGUuZ2lmCi13b3JrcHJvZHVjdGRlc2NyaXB0b3I9aW1hZ2VzL3dvcmtkZXNfbGdfZGdtMzIuZ2lmCi1taWxlc3RvbmU9aW1hZ2VzL21pbGVzdG9uZS5naWYKLQotIyBNaXNjCi1nZW5lcmFsPWltYWdlcy9ndWlkYW5jZS5naWYKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvRWxlbWVudExheW91dE1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvRWxlbWVudExheW91dE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzNGQwYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0VsZW1lbnRMYXlvdXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkRlZmF1bHRFbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLklBY3Rpdml0eURpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5BYnN0cmFjdEVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkdlbmVyYWxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotCi0KLS8qKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSBFbGVtZW50TGF5b3V0TWFuYWdlci5jbGFzcwotCQkJLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmYXVsdF9jb25maWdfcGF0aCA9ICJub2NvbmZpZyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgYm9vbGVhbiBpc1B1Ymxpc2hpbmdNb2RlID0gZmFsc2U7IC8vIGRlZmF1bHQgdG8gYnJvd3NpbmcgbW9kZQotCQotCXByaXZhdGUgU3RyaW5nIHB1Ymxpc2hfZGlyID0gbnVsbDsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCi0JcHJpdmF0ZSBJQWN0aXZpdHlEaWFncmFtU2VydmljZSBkaWFncmFtU2VydmljZSA9IG51bGw7Ci0KLQkvLyBuZWVkIHRvIHNlcGVyYXRlIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9ybSBjb250ZW50IGFuZCBkaWFncmFtCi0JLy8gZGlhZ3JhbSBhZGFwdG9yIGZhY3Rvcnkgc2hvdWxkIG5vdCBiZSByb2xsZWQgdXAKLQlwcml2YXRlIExheW91dEFkYXB0ZXJGYWN0b3J5IGNvbnRlbnRMYXlvdXRBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JcHJpdmF0ZSBMYXlvdXRBZGFwdGVyRmFjdG9yeSBkaWFncmFtTGF5b3V0QWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQotCS8vIGNhY2hlIHRoZSBzdXBwcmVzc2lvbiBvYmplY3QgZm9yIHB1Ymxpc2hpbmcgbW9kZWwgb25seQotCS8vIG1hcCBvZiBwcm9jIGd1aWQgdG8gU3VwcHJlc2lpb24gb2JqZWN0CQotCXByaXZhdGUgTWFwIHN1cHJlc3Npb25NYXAgPSBudWxsOwotCQotCXByaXZhdGUgSUNvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yID0gbnVsbDsKLQkKLQlwcml2YXRlIEVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IG51bGw7Ci0JCi0JLy8gdGhlIGxheW91dCBleHRlbnNpb25zLiBlYWNoIGV4dGVuc2lvbiBpcyBpZGVudGlmaWVkIGJ5IHRoZSBwcm9wZXJ0eSBpZCBvZiB0aGUgY29uZmlndXJhdGlvbgotCXByaXZhdGUgTWFwPFN0cmluZywgTGF5b3V0RXh0ZW5zaW9uPiBsYXlvdXRFeHRlbnNpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMYXlvdXRFeHRlbnNpb24+KCk7Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaXNoaW5nTW9kZSgpCi0JewotCQlyZXR1cm4gdGhpcy5pc1B1Ymxpc2hpbmdNb2RlOwotCX0KLQkKLQlwdWJsaWMgRWxlbWVudExheW91dE1hbmFnZXIoKSB7Ci0JCXRoaXMobnVsbCwgbnVsbCwgbnVsbCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzKGNvbmZpZywgbnVsbCwgbnVsbCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIHB1Ymxpc2hkaXIsIElDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvciwgYm9vbGVhbiBpc1B1Ymxpc2hpbmdNb2RlKSB7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCQl0aGlzLmlzUHVibGlzaGluZ01vZGUgPSBpc1B1Ymxpc2hpbmdNb2RlOwotCQkKLQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJfQotCi0JCWlmIChwdWJsaXNoZGlyID09IG51bGwpIHsKLQkJCXB1Ymxpc2hkaXIgPSBMYXlvdXRSZXNvdXJjZXMuZ2V0RGVmYXVsdFB1Ymxpc2hEaXIoKTsKLQkJCWlmICghcHVibGlzaGRpci5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLQkJCQlwdWJsaXNoZGlyICs9IEZpbGUuc2VwYXJhdG9yOwotCQkJfQotCi0JCQkvLyBhbHNvIGFwcGVuZCB0aGUgY29uZmlndXJhdGlvbiBwYXRoCi0JCQlpZiAodGhpcy5jb25maWcgPT0gbnVsbCkgewotCQkJCXB1Ymxpc2hkaXIgKz0gZGVmYXVsdF9jb25maWdfcGF0aDsKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIHN0ciA9IFN0clV0aWwucmVtb3ZlU3BlY2lhbENoYXJhY3RlcnModGhpcy5jb25maWcuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoIHN0ciA9PSAiIiApIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlzdHIgPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKHRoaXMuY29uZmlnLnRvU3RyaW5nKCkuaGFzaENvZGUoKSk7Ci0JCQkJfQotCQkJCXB1Ymxpc2hkaXIgKz0gc3RyOwotCQkJfQotCQl9Ci0KLQkJc2V0UHVibGlzaERpcihwdWJsaXNoZGlyKTsKLQotCQljb250ZW50TGF5b3V0QWRhcHRlckZhY3RvcnkgPSBuZXcgTGF5b3V0QWRhcHRlckZhY3RvcnkodGhpcy5jb25maWcpOwotCQlkaWFncmFtTGF5b3V0QWRhcHRlckZhY3RvcnkgPSBuZXcgTGF5b3V0QWRhcHRlckZhY3RvcnkodGhpcy5jb25maWcpOwotCQkKLQkJLy8JbG9hZCB0aGUgbGF5b3V0IGV4dGVuc2lvbnMgZm9yIHRoaXMgY29uZmlndXJhdGlvbgotCQlsb2FkTGF5b3V0RXh0ZW5zaW9ucygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkTGF5b3V0RXh0ZW5zaW9ucygpIHsKLQkJaWYgKCBjb25maWcgPT0gbnVsbCApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gbG9hZCB0aGUgbGF5b3V0IGV4dGVuc2lvbnMgZm9yIHRoaXMgY29uZmlndXJhdGlvbgotCQlMaXN0IHByb3BzID0gY29uZmlnLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCQlpZiAoIHByb3BzICE9IG51bGwgJiYgcHJvcHMuc2l6ZSgpID4gMCApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRwID0gcHJvcHMuaXRlcmF0b3IoKTsgaXRwLmhhc05leHQoKTsgKSB7Ci0JCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSAoTWV0aG9kRWxlbWVudFByb3BlcnR5KWl0cC5uZXh0KCk7Ci0JCQkJU3RyaW5nIGlkID0gcHJvcC5nZXROYW1lKCk7Ci0JCQkJTGF5b3V0RXh0ZW5zaW9uIGV4dD0gTGF5b3V0RXh0ZW5zaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUV4dGVuc2lvbihpZCk7Ci0JCQkJaWYgKCBleHQgIT0gbnVsbCApIHsKLQkJCQkJZXh0LmluaXQodGhpcyk7Ci0JCQkJCWxheW91dEV4dGVuc2lvbnMucHV0KGlkLCBleHQpOwotCQkJCX0KLQkJCQkKLQkJCX0KLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgdmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBJQ29udGVudFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCWlmICh2YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJdmFsaWRhdG9yID0gbmV3IERlZmF1bHRDb250ZW50VmFsaWRhdG9yKGdldFB1Ymxpc2hEaXIoKSk7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci0JCi0JcHVibGljIEVsZW1lbnRSZWFsaXplciBnZXRFbGVtZW50UmVhbGl6ZXIoKSB7Ci0JCWlmICggcmVhbGl6ZXIgPT0gbnVsbCApIHsKLQkJCXJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCXJlYWxpemVyLnNldEZpbHRlcihjb250ZW50TGF5b3V0QWRhcHRlckZhY3RvcnkuZ2V0RmlsdGVyKCkpOwotCQl9Ci0JCQotCQlyZXR1cm4gcmVhbGl6ZXI7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudFJlYWxpemVyKEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQl0aGlzLnJlYWxpemVyID0gcmVhbGl6ZXI7CQkKLQl9Ci0JCi0JcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0V0JTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBjb250ZW50TGF5b3V0QWRhcHRlckZhY3Rvcnkud2JzQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0VEJTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBjb250ZW50TGF5b3V0QWRhcHRlckZhY3RvcnkudGJzQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gY29udGVudExheW91dEFkYXB0ZXJGYWN0b3J5LndwYnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRDQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGNvbnRlbnRMYXlvdXRBZGFwdGVyRmFjdG9yeS5jYnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXREaWFncmFtQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBkaWFncmFtTGF5b3V0QWRhcHRlckZhY3Rvcnkud2JzQWRhcHRlckZhY3Rvcnk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoSUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UgZGlhZ3JhbVNlcnZpY2UpIHsKLQkJdGhpcy5kaWFncmFtU2VydmljZSA9IGRpYWdyYW1TZXJ2aWNlOwotCX0KLQotCXB1YmxpYyBJQWN0aXZpdHlEaWFncmFtU2VydmljZSBnZXRBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKCkgewotCQlyZXR1cm4gdGhpcy5kaWFncmFtU2VydmljZTsKLQl9Ci0KLQlwdWJsaWMgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oUHJvY2VzcyBwcm9jKQotCXsKLQkJU3VwcHJlc3Npb24gc3VwID0gbnVsbDsKLQkJaWYgKCBpc1B1Ymxpc2hpbmdNb2RlKQotCQl7Ci0JCQlpZiAoIHN1cHJlc3Npb25NYXAgPT0gbnVsbCApCi0JCQl7Ci0JCQkJc3VwcmVzc2lvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQl9Ci0JCQlTdHJpbmcgZ3VpZCA9IHByb2MuZ2V0R3VpZCgpOwotCQkJc3VwID0gKFN1cHByZXNzaW9uKXN1cHJlc3Npb25NYXAuZ2V0KGd1aWQpOwotCQkJaWYgKCBzdXAgPT0gbnVsbCApCi0JCQl7Ci0JCQkJc3VwID0gY3JlYXRlU3VwcHJlc3Npb24ocHJvYyk7Ci0JCQkJc3VwcmVzc2lvbk1hcC5wdXQoZ3VpZCwgc3VwKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCXN1cCA9IGNyZWF0ZVN1cHByZXNzaW9uKHByb2MpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcmVwYXJlQWRhcHRvckZhY3Rvcmllc0ZvclByb2Nlc3MoUHJvY2VzcyBwcm9jKQotCXsKLQkJLy8gbmVlZCB0byBpdGVyYXRlIHRoZSBhZGFwdG9yIGZhY3RvcnkgdG8gZ2VuZXJhdGUgdGhlIGFkYXB0b3IgdHJlZQotCQlwcmVwYXJlQWRhcHRlcmZhY3RvcnlGb3IoZ2V0Q0JTQWRhcHRlckZhY3RvcnkoKSwgcHJvYyk7Ci0JCXByZXBhcmVBZGFwdGVyZmFjdG9yeUZvcihnZXRUQlNBZGFwdGVyRmFjdG9yeSgpLCBwcm9jKTsKLQkJcHJlcGFyZUFkYXB0ZXJmYWN0b3J5Rm9yKGdldFdCU0FkYXB0ZXJGYWN0b3J5KCksIHByb2MpOwotCQlwcmVwYXJlQWRhcHRlcmZhY3RvcnlGb3IoZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCksIHByb2MpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJlcGFyZUFkYXB0ZXJmYWN0b3J5Rm9yKAotCQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwgfHwgYWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQlwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIG9iajsKLQkJfSBlbHNlIHsKLQkJCXByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQob2JqLAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQl9Ci0KLQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gaXRlbXMgPSBwcm92aWRlci5nZXRDaGlsZHJlbihvYmopOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgcmF3aXRlbSA9IGl0Lm5leHQoKTsKLQotCQkJCU1ldGhvZEVsZW1lbnQgaXRlbSA9IChNZXRob2RFbGVtZW50KSBMaWJyYXJ5VXRpbAotCQkJCQkJLnVud3JhcChyYXdpdGVtKTsKLQkJCQlpZiAoKGl0ZW0gaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCQkJcHJlcGFyZUFkYXB0ZXJmYWN0b3J5Rm9yKGFkYXB0ZXJGYWN0b3J5LCByYXdpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJRWxlbWVudExheW91dCBjcmVhdGVMYXlvdXQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCQotCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBhbiBhY3Rpdml0eSwgd2UgbmVlZCB0byBmaW5lZCB0aGUgcGF0aCB0byB0aGUgcHJvY2VzcwotCQlTdHJpbmcgcGF0aCA9IG51bGw7Ci0JCVByb2Nlc3Mgb3duaW5nUHJvYyA9IG51bGw7Ci0JCWlmICggZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5ICkKLQkJewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KWVsZW1lbnQ7Ci0JCQlwYXRoID0gQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dC5nZXRQYXRoKGFjdCk7Ci0JCQlvd25pbmdQcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdCk7Ci0JCX0KLQkJCi0JCXJldHVybiBjcmVhdGVMYXlvdXQoZWxlbWVudCwgb3duaW5nUHJvYywgcGF0aCk7Ci0JfQotCi0JcHVibGljIElFbGVtZW50TGF5b3V0IGNyZWF0ZUxheW91dChNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlQcm9jZXNzIG93bmluZ1Byb2MsIFN0cmluZyBwYXRoKSB7Ci0JCUFic3RyYWN0RWxlbWVudExheW91dCBsYXlvdXQgPSBudWxsOwotCi0JCVN0cmluZyBjbGFzc05hbWU7Ci0JCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmlzRGVzY3JpcHRpb25FbGVtZW50KGVsZW1lbnQpKSB7Ci0JCQljbGFzc05hbWUgPSAiQ29udGVudERlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJY2xhc3NOYW1lID0gIkFjdGl2aXR5IjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKChlbGVtZW50IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpCi0JCQkJJiYgIShlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpKSB7Ci0JCQljbGFzc05hbWUgPSAiV29ya0JyZWFrZG93bkVsZW1lbnQiOyAvLyROT04tTkxTLTEkICAvLyB0YXNrZGVzY3JpcHRvciBoYXMgaXQncyBvd24gbGF5b3V0Ci0JCX0gZWxzZSB7Ci0JCQlDbGFzcyBpW10gPSBlbGVtZW50LmdldENsYXNzKCkuZ2V0SW50ZXJmYWNlcygpOwotCQkJaWYgKGkgIT0gbnVsbCAmJiBpLmxlbmd0aCA9PSAxKSB7Ci0JCQkJY2xhc3NOYW1lID0gaVswXS5nZXROYW1lKCk7Ci0JCQl9IGVsc2UgewotCQkJCWNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQl9Ci0KLQkJCWludCBpbmRleCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW5kZXggPj0gMCkgewotCQkJCWNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCX0KLQkJfQotCi0JCWNsYXNzTmFtZSA9IFBBQ0tBR0VfTkFNRSArICIuZWxlbWVudHMuIiArIGNsYXNzTmFtZSArICJMYXlvdXQiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQl0cnkgewotCQkJQ2xhc3MgYyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLQkJCWlmIChjICE9IG51bGwpIHsKLQkJCQlsYXlvdXQgPSAoQWJzdHJhY3RFbGVtZW50TGF5b3V0KSBjLm5ld0luc3RhbmNlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJLy8gZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlpZiAobGF5b3V0ID09IG51bGwpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTGF5b3V0IGNsYXNzICciICsgY2xhc3NOYW1lICsgIicgZm9yIGVsZW1lbnQKLQkJCS8vICciICsgZWxlbWVudC5nZXROYW1lKCkgKyAiJyBub3QgZGVmaW5lZC4gVXNlIEdlbmVyYWxMYXlvdXQiKTsKLQkJCWxheW91dCA9IG5ldyBHZW5lcmFsTGF5b3V0KCk7Ci0JCX0KLQotCQlpZiAobGF5b3V0IGluc3RhbmNlb2YgQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dCkgewotCQkJKChBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0KSBsYXlvdXQpLmluaXQodGhpcywgZWxlbWVudCwKLQkJCQkJb3duaW5nUHJvYywgcGF0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlsYXlvdXQuaW5pdCh0aGlzLCBlbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBsYXlvdXQ7Ci0JfQotCi0JcHVibGljIElFbGVtZW50TGF5b3V0IGdldExheW91dChNZXRob2RFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCS8vIFN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0R3VpZCgpOwotCQlJRWxlbWVudExheW91dCBsYXlvdXQgPSBudWxsOyAvLyAoSUVsZW1lbnRMYXlvdXQpbGF5b3V0TWFwLmdldChpZCk7Ci0JCWlmICgobGF5b3V0ID09IG51bGwpICYmIGNyZWF0ZSkgewotCQkJbGF5b3V0ID0gY3JlYXRlTGF5b3V0KGVsZW1lbnQpOwotCQkJLy8gbGF5b3V0TWFwLnB1dChpZCwgbGF5b3V0KTsKLQkJfQotCi0JCXJldHVybiBsYXlvdXQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBwX3BhcmFtZXRlcnMgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIlxcP3Byb2M9KC4qPykmcGF0aD0oLiopPyIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIElFbGVtZW50TGF5b3V0IGdldExheW91dChTdHJpbmcgdXJsKSB7Ci0KLQkJUHJvY2VzcyBvd25pbmdQcm9jID0gbnVsbDsKLQkJU3RyaW5nIHBhdGggPSBudWxsOwotCi0JCU1hdGNoZXIgbSA9IHBfcGFyYW1ldGVycy5tYXRjaGVyKHVybCk7Ci0JCWlmIChtLmZpbmQoKSkgewotCQkJU3RyaW5nIHByb2MgPSBtLmdyb3VwKDEpOwotCQkJcGF0aCA9IG0uZ3JvdXAoMik7Ci0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlvd25pbmdQcm9jID0gKFByb2Nlc3MpIG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudCgKLQkJCQkJCXByb2MpOwotCQkJfQotCQl9Ci0KLQkJLy8gTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpdXJsTWFwLmdldCh1cmwpOwotCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50RnJvbUZpbGVOYW1lKHVybCk7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBjcmVhdGVMYXlvdXQoZWxlbWVudCwgb3duaW5nUHJvYywgcGF0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNhbid0IGZpbmQgZWxlbWVudCBmb3IgdXJsICciICsgdXJsICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFF1ZXJ5U3RyaW5nKFN0cmluZyBwcm9jLCBTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gIj8iICsgUmVzb3VyY2VIZWxwZXIuVVJMX1BBUkFNRVRFUl9QUk9DRVNTICsgIj0iICsgcHJvYyArICImIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSsgUmVzb3VyY2VIZWxwZXIuVVJMX1BBUkFNRVRFUl9QQVRIICsgIj0iICsgcGF0aDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmNvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoRGlyKFN0cmluZyBwYXRoKSB7Ci0JCXRoaXMucHVibGlzaF9kaXIgPSBwYXRoOwotCQlpZiAoICF0aGlzLnB1Ymxpc2hfZGlyLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSApIHsKLQkJCXRoaXMucHVibGlzaF9kaXIgKz0gRmlsZS5zZXBhcmF0b3I7Ci0JCX0KLQotCQkvLyBpbml0aWFsaXplIHB1Ymxpc2hpbmcgc2l0ZSBpZiBuZWVkZWQKLQkJaW5pdF9wdWJsaXNoaW5nU2l0ZSgpOwotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaXNoRGlyKCkgewotCQlyZXR1cm4gdGhpcy5wdWJsaXNoX2RpcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdF9wdWJsaXNoaW5nU2l0ZSgpIHsKLQkJaWYgKCBCcm93c2luZ0xheW91dFNldHRpbmdzLklOU1RBTkNFLm5lZWRVcGRhdGUocHVibGlzaF9kaXIpICkgewotCQkJaWYgKCBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpICkgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJCZWdpbiBpbml0aWFsaXppbmcgcHVibGlzaGluZyBzaXRlOiAiICsgcHVibGlzaF9kaXIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCS8vIGNvcHkgdGhlIGxheW91dCBmaWxlcyBmcm9tIHBsdWdpbiBsYXlvdXQgdG8gcHVibGlzaGlnbiBzaXRlCi0JCQlMYXlvdXRSZXNvdXJjZXMuY29weUxheW91dEZpbGVzKHB1Ymxpc2hfZGlyKTsKLQkKLQkJCWlmICggTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKSApIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVuZCBpbml0aWFsaXppbmcgcHVibGlzaGluZyBzaXRlOiAiICsgcHVibGlzaF9kaXIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLS8vCXB1YmxpYyB2b2lkIGNvcHlMaWJyYXJ5UmVzb3VyY2VzKCkgewotLy8JCWlmICggTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKSApIHsKLS8vCQkJU3lzdGVtLm91dAotLy8JCQkJCS5wcmludGxuKCJCZWdpbiBjb3B5aW5nIGxpYnJhcnkgcmVzb3VyY2VzIHRvIHB1Ymxpc2hpbmcgc2l0ZTogIiArIHB1Ymxpc2hfZGlyKTsgLy8kTk9OLU5MUy0xJAotLy8JCX0KLS8vCQkKLS8vCQkvLyBjb3B5IGxpYnJhcnkgcmVzb3VyY2VzIGZyb20gbGlicmFyeSB0byBwdWJsaXNoaW5nIHNpdGUKLS8vCQlGaWxlIGxpYlJvb3QgPSBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpKTsKLS8vCQlpZiAobGliUm9vdCAhPSBudWxsKSB7Ci0vLwkJCUxheW91dFJlc291cmNlcy5jb3B5RGlyKGxpYlJvb3QuZ2V0UGF0aCgpLCBwdWJsaXNoX2Rpcik7Ci0vLwkJfQotLy8KLS8vCQlpZiAoIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCkgKSB7Ci0vLwkJCVN5c3RlbS5vdXQKLS8vCQkJCQkucHJpbnRsbigiRW5kIGNvcHlpbmcgbGlicmFyeSByZXNvdXJjZXMgdG8gcHVibGlzaGluZyBzaXRlOiAiICsgcHVibGlzaF9kaXIpOyAvLyROT04tTkxTLTEkCi0vLwkJfQotLy8JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCS8vIGxheW91dE1hcC5jbGVhcigpOwotCQkKLQkJZGlhZ3JhbVNlcnZpY2UgPSBudWxsOwotCQkKLQkJaWYgKCBzdXByZXNzaW9uTWFwICE9IG51bGwgKQotCQl7Ci0JCQlzdXByZXNzaW9uTWFwLmNsZWFyKCk7Ci0JCX0KLQkJCi0JCWxheW91dEV4dGVuc2lvbnMuY2xlYXIoKTsKLQkJbGF5b3V0RXh0ZW5zaW9ucyA9IG51bGw7Ci0JCQotCQljb250ZW50TGF5b3V0QWRhcHRlckZhY3RvcnkuY2xlYXIoKTsKLQkJZGlhZ3JhbUxheW91dEFkYXB0ZXJGYWN0b3J5LmNsZWFyKCk7Ci0JCQotCQlpZiAoIHZhbGlkYXRvciAhPSBudWxsICkKLQkJewotCQkJdmFsaWRhdG9yLmRpc3Bvc2UoKTsKLQkJCXZhbGlkYXRvciA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmICggcmVhbGl6ZXIgIT0gbnVsbCApIHsKLQkJCXJlYWxpemVyLmRpc3Bvc2UoKTsKLQkJCXJlYWxpemVyID0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKCBjb250ZW50TGF5b3V0QWRhcHRlckZhY3RvcnkgIT0gbnVsbCApIHsKLQkJCWNvbnRlbnRMYXlvdXRBZGFwdGVyRmFjdG9yeS5jbGVhcigpOwotCQkJY29udGVudExheW91dEFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsJCQkKLQkJfQotCQkKLQkJaWYgKCBkaWFncmFtTGF5b3V0QWRhcHRlckZhY3RvcnkgIT0gbnVsbCApIHsKLQkJCWRpYWdyYW1MYXlvdXRBZGFwdGVyRmFjdG9yeS5jbGVhcigpOwotCQkJZGlhZ3JhbUxheW91dEFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsJCQkKLQkJfQotCQkgCi0JfQotCi0JcHVibGljIGNsYXNzIExheW91dEFkYXB0ZXJGYWN0b3J5Ci0JewotCQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSB3YnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHRic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnkgd3Bic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgY2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCi0JCVByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlciBjb25maWd1cmF0b3IgPSBudWxsOwotCQkKLQkJcHVibGljIExheW91dEFkYXB0ZXJGYWN0b3J5KE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnKQotCQl7Ci0JCQkvLyBjcmVhdGUgYWRhcHQgZmFjdG9yaWVzCi0JCQkvLwotCQkJaWYoaXNQdWJsaXNoaW5nTW9kZSgpKSB7Ci0JCQkJd2JzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUHVibGlzaGluZ1dCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJdGJzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUHVibGlzaGluZ1RCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJd3Bic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVB1Ymxpc2hpbmdXUEJTQWRhcHRlckZhY3RvcnkoKTsKLQkJCQljYnNBZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVQdWJsaXNoaW5nQ0JTQWRhcHRlckZhY3RvcnkoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXdic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVdCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCQl0YnNBZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVUQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJd3Bic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVdQQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJY2JzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCX0KLQotCQkJLy8gc2V0IGNvbmZpZ3VyYXRpb24gZmlsdGVyCi0JCQljb25maWd1cmF0b3IgPSBuZXcgUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKG1ldGhvZENvbmZpZywgdGhpcyk7Ci0KLQkJCXdic0FkYXB0ZXJGYWN0b3J5LnNldEZpbHRlcihjb25maWd1cmF0b3IpOwotCQkJdGJzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7Ci0JCQl3cGJzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7Ci0JCQljYnNBZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIoY29uZmlndXJhdG9yKTsJCQotCQl9Ci0JCQotCQlwdWJsaWMgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCQlyZXR1cm4gY29uZmlndXJhdG9yOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBjbGVhcigpCi0JCXsKLQkJCQotCQkJaWYgKHdic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQl3YnNBZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIobnVsbCk7Ci0JCQkJd2JzQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJCXdic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJCX0KLQotCQkJaWYgKHRic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQl0YnNBZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIobnVsbCk7Ci0JCQkJdGJzQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJCXRic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJCX0KLQotCQkJaWYgKHdwYnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJd3Bic0FkYXB0ZXJGYWN0b3J5LnNldEZpbHRlcihudWxsKTsKLQkJCQl3cGJzQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJCXdwYnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQl9Ci0KLQkJCWlmIChjYnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJY2JzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKG51bGwpOwotCQkJCWNic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCQljYnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQl9Ci0JCQkKLQkJCWlmICggY29uZmlndXJhdG9yICE9IG51bGwgKSB7Ci0JCQkJY29uZmlndXJhdG9yLmRpc3Bvc2UoKTsKLQkJCQljb25maWd1cmF0b3IgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgU3VwcHJlc3Npb24gY3JlYXRlU3VwcHJlc3Npb24oUHJvY2VzcyBwcm9jKSB7Ci0JCS8vIGNoZWNrIGlmIHRoZXJlIGFyZSBleHRlbnNpb25zCi0JCWlmICggbGF5b3V0RXh0ZW5zaW9ucyAhPSBudWxsICYmIGxheW91dEV4dGVuc2lvbnMuc2l6ZSgpID4gMCApIHsKLQkJCWZvciAoIEl0ZXJhdG9yPExheW91dEV4dGVuc2lvbj4gaXQgPSBsYXlvdXRFeHRlbnNpb25zLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJTGF5b3V0RXh0ZW5zaW9uIGV4dCA9IGl0Lm5leHQoKTsKLQkJCQlTdXBwcmVzc2lvbiBzdXAgPSBleHQuZ2V0U3VwcHJlc3Npb24ocHJvYyk7Ci0JCQkJaWYgKCBzdXAgIT0gbnVsbCApIHsKLQkJCQkJcmV0dXJuIHN1cDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBuZXcgU3VwcHJlc3Npb24ocHJvYyk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0h0bWxCdWlsZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0h0bWxCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNzhiNzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9IdG1sQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkkxOG5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuVGltZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi54bWwuWFNMVFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMuUHJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Db250ZW50UmVzb3VyY2VTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBIVE1MIHBhZ2UgZm9yIGEgTWV0aG9kIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEh0bWxCdWlsZGVyIHsKLQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIHhzbFBhcmFtcyA9IG51bGw7Ci0KLQlwcml2YXRlIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIG1nciA9IG51bGw7Ci0KLQlwcml2YXRlIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGludGVybmFsX21nciA9IG51bGw7Ci0KLQkvL3ByaXZhdGUgQ29udGVudFJlc291cmNlU2Nhbm5lciBzY2FubmVyID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiBzY2FuQ29udGVudCA9IHRydWU7Ci0KLQkvLyBJZiB0cnVlLCBkaXNwbGF5IHRoZSAiU2hvdyB0cmVlIGJyb3dzZSIgaW1hZ2UvbGluayB0byB0aGUgcmlnaHQgb2YgYQotCS8vIHB1Ymxpc2hlZCBwYWdlLgotCXByaXZhdGUgYm9vbGVhbiBzaG93VHJlZUJyb3dzZXIgPSBmYWxzZTsKLQotCS8vcHJpdmF0ZSBJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCi0JLy8gb3ZlcnJpZGUgdGhpcyBwYXRoIHRvIHNwZWNpZnkgeHNsIHBhdGgKLQlwcml2YXRlIFN0cmluZyBsYXlvdXRYc2xSb290UGF0aCA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExheW91dFhzbFBhdGgoKTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBIdG1sQnVpbGRlcigpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBIdG1sQnVpbGRlcihFbGVtZW50TGF5b3V0TWFuYWdlciBtZ3IpIHsKLQkJaW5pdCgpOwotCQlzZXRMYXlvdXRNYW5hZ2VyKG1ncik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExheW91dFhzbFJvb3RQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoIHBhdGggIT0gbnVsbCAmJiBwYXRoLmxlbmd0aCgpID4gMCApIHsKLQkJCQl0aGlzLmxheW91dFhzbFJvb3RQYXRoID0gcGF0aDsKLQkJCQlpZiAoICF0aGlzLmxheW91dFhzbFJvb3RQYXRoLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSApIHsKLQkJCQkJdGhpcy5sYXlvdXRYc2xSb290UGF0aCArPSBGaWxlLnNlcGFyYXRvcjsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gZ2V0IHRoZSBsb2NhbGl6ZWQgZmlsZQotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRoaXMubGF5b3V0WHNsUm9vdFBhdGgsICJyZXNvdXJjZXMucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJTG9jYWxlIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0JCQkJU3RyaW5nIGxvY2FsRmlsZU5hbWUgPSBJMThuVXRpbC5nZXRMb2NhbGl6ZWRGaWxlKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGxvY2FsZSk7Ci0JCQkJaWYgKCBsb2NhbEZpbGVOYW1lICE9IG51bGwgKSB7Ci0JCQkJCWZpbGUgPSBuZXcgRmlsZShsb2NhbEZpbGVOYW1lKTsKLQkJCQl9Ci0JCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJeHNsUGFyYW1zLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7Ci0JCQkJfQkKLQkJCQkKLQkJCQkvLyB0aGUgUHJlZmVyZW5jZVV0aWwgYWxzbyB1c2VzIHRoZSB4c2wgcHJvcGVydGllcyBmb3IgYWN0aXZpdHkgYnJlYWtkb3duIGxheW91dAotCQkJCS8vIHNvIHNldCBpdCBhcyB3ZWxsCi0JCQkJUHJlZmVyZW5jZVV0aWwuc2V0WHNsUHJvcGVydGllcyh4c2xQYXJhbXMpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlkZWJ1ZyA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JCWxvYWREZWZhdWx0TGF5b3V0WHNsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZERlZmF1bHRMYXlvdXRYc2woKSB7Ci0JCWxheW91dFhzbFJvb3RQYXRoID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF5b3V0WHNsUGF0aCgpOwotCQl0cnkgewotCQkJeHNsUGFyYW1zID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvcGVydGllcygKLQkJCQkJIi9sYXlvdXQveHNsL3Jlc291cmNlcy5wcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJLy8gYWRkIHRoZSBjb2xvbiBwcm9wZXJ0eSwgCi0JCQl4c2xQYXJhbXMucHV0KCJjb2xvbl93aXRoX3NwYWNlIiwgTGlicmFyeVJlc291cmNlcy5jb2xvbl93aXRoX3NwYWNlKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQkvLyB0aGUgUHJlZmVyZW5jZVV0aWwgYWxzbyB1c2VzIHRoZSB4c2wgcHJvcGVydGllcyBmb3IgYWN0aXZpdHkgYnJlYWtkb3duIGxheW91dAotCQkJLy8gc28gc2V0IGl0IGFzIHdlbGwKLQkJCVByZWZlcmVuY2VVdGlsLnNldFhzbFByb3BlcnRpZXMoeHNsUGFyYW1zKTsKLQotCQkJCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXhzbFBhcmFtcyA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHVibGlzaCBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaXNoRGlyKCkgewotCQlyZXR1cm4gKG1nciA9PSBudWxsKSA/IG51bGwgOiBtZ3IuZ2V0UHVibGlzaERpcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHB1Ymxpc2ggZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hEaXIoU3RyaW5nIGRpcikgewotCQlpZiAobWdyICE9IG51bGwpIHsKLQkJCW1nci5zZXRQdWJsaXNoRGlyKGRpcik7Ci0JCX0KLQotCQkvL2dldFNjYW5uZXIoKS5zZXRUYXJnZXRSb290UGF0aChuZXcgRmlsZShnZXRQdWJsaXNoRGlyKCkpKTsKLQotCQkvLyBSZXNldCB0aGUgdmFsaWRhdG9yJ3MgcHVibGlzaCBkaXIuCi0JCWdldFZhbGlkYXRvcigpLnNldFB1Ymxpc2hEaXIoZGlyKTsKLQl9Ci0KLS8vCS8qKgotLy8JICogU2V0cyB0aGUgY29udGVudCB2YWxpZGF0b3IuCi0vLwkgKi8KLS8vCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcihJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLS8vCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLS8vCQlnZXRTY2FubmVyKCkuc2V0VmFsaWRhdG9yKHRoaXMudmFsaWRhdG9yKTsKLS8vCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgdmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBJQ29udGVudFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0vLwkJaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0vLwkJCXZhbGlkYXRvciA9IG5ldyBEZWZhdWx0Q29udGVudFZhbGlkYXRvcihnZXRQdWJsaXNoRGlyKCkpOwotLy8JCX0KLS8vCQlyZXR1cm4gdmFsaWRhdG9yOwotCQkKLQkJcmV0dXJuIHRoaXMubWdyLmdldFZhbGlkYXRvcigpOwotCX0KLQotLy8JLyoqCi0vLwkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHJlc291cmNlIHNjYW5uZXIgZm9yIHRoZSBlbGVtZW50LgotLy8JICovCi0vLwlwcml2YXRlIENvbnRlbnRSZXNvdXJjZVNjYW5uZXIgZ2V0U2Nhbm5lcihNZXRob2RFbGVtZW50IG93bmVyKSB7Ci0vLwkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3Iob3duZXIpOwotLy8JCWlmICggcmVzTWdyID09IG51bGwgKSB7Ci0vLwkJCXJldHVybiBudWxsOwotLy8JCX0KLS8vCQkKLS8vCQlTdHJpbmcgcm9vdENvbnRlbnRQYXRoID0gcmVzTWdyLmdldExvZ2ljYWxQbHVnaW5QYXRoKG93bmVyKTsKLS8vCQlGaWxlIHNyY19yb290ID0gbmV3IEZpbGUocmVzTWdyLmdldFBoeXNpY2FsUGx1Z2luUGF0aChvd25lcikpOwotLy8JCUZpbGUgdGd0X3Jvb3QgPSBuZXcgRmlsZShnZXRQdWJsaXNoRGlyKCksIHJvb3RDb250ZW50UGF0aCk7Ci0vLwkJQ29udGVudFJlc291cmNlU2Nhbm5lciBzY2FubmVyID0gbmV3IENvbnRlbnRSZXNvdXJjZVNjYW5uZXIoc3JjX3Jvb3QsIHRndF9yb290LCByb290Q29udGVudFBhdGgsIGdldFZhbGlkYXRvcigpKTsKLS8vCi0vLwkJcmV0dXJuIHNjYW5uZXI7Ci0vLwl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmbGFnIHRvIGRpc3BsYXkgdGhlICJTaG93IHRyZWUgYnJvd3NlciIgaW1hZ2UvbGluay4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmFibGVUcmVlQnJvd3Nlcihib29sZWFuIGZsYWcpIHsKLQkJdGhpcy5zaG93VHJlZUJyb3dzZXIgPSBmbGFnOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZXMgY29udGVudCBzY2FubmluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmFibGVDb250ZW50U2Nhbihib29sZWFuIHNjYW4pIHsKLQkJdGhpcy5zY2FuQ29udGVudCA9IHNjYW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBjb250ZW50IHNjYW5uaW5nIGlzIGVuYWJsZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGVudFNjYW5FbmFibGVkKCkgewotCQlyZXR1cm4gc2NhbkNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgRWxlbWVudCBMYXlvdXQgTWFuYWdlci4KLQkgKiA8cD4KLQkgKiBBIEVsZW1lbnQgTGF5b3V0IE1hbmFnZXIgaXMgYXNzb2NpYXRlZCB3aXRoIGEgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXlvdXRNYW5hZ2VyKEVsZW1lbnRMYXlvdXRNYW5hZ2VyIG1ncikgewotCQl0aGlzLm1nciA9IG1ncjsKLQkJaWYgKHRoaXMubWdyID09IG51bGwpIHsKLQkJCXRoaXMubWdyID0gZ2V0RGVmYXVsdExheW91dE1hbmFnZXIoKTsgCi0JCX0KLQotCQkvLyBVcGRhdGUgdGhlIHNjYW5uZXIgdGFyZ2V0IHBhdGguCi0JCS8vZ2V0U2Nhbm5lcigpLnNldFRhcmdldFJvb3RQYXRoKG5ldyBGaWxlKGdldFB1Ymxpc2hEaXIoKSkpOwotCi0JCS8vIFJlc2V0IHRoZSB2YWxpZGF0b3IgcHViIGRpci4KLQkJZ2V0VmFsaWRhdG9yKCkuc2V0UHVibGlzaERpcihnZXRQdWJsaXNoRGlyKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgRWxlbWVudCBMYXlvdXQgTWFuYWdlci4KLQkgKi8KLQlwcml2YXRlIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGdldERlZmF1bHRMYXlvdXRNYW5hZ2VyKCkgewotCQlpZiAoIHRoaXMuaW50ZXJuYWxfbWdyID09IG51bGwgKSB7Ci0JCQl0aGlzLmludGVybmFsX21nciA9IG5ldyBFbGVtZW50TGF5b3V0TWFuYWdlcigpOwotCQl9Ci0JCQotCQlyZXR1cm4gdGhpcy5pbnRlcm5hbF9tZ3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRWxlbWVudCBMYXlvdXQgTWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudExheW91dE1hbmFnZXIgZ2V0TGF5b3V0TWFuYWdlcigpIHsKLQkJaWYgKHRoaXMubWdyID09IG51bGwpIHsKLQkJCXRoaXMubWdyID0gZ2V0RGVmYXVsdExheW91dE1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gbWdyOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgSFRNTCBmb3IgYSBNZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgQSBNZXRob2QgZWxlbWVudC4KLQkgKiBAcmV0dXJuIEEgdXJsIG9mIHRoZSBnZW5lcmF0ZWQgY29udGVudCBIVE1MIGZpbGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUh0bWwoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB1cmwgPSBudWxsOwotCQlpZiAoZGVidWcpIHsKLQkJCWxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlJRWxlbWVudExheW91dCBsYXlvdXQgPSBnZXRMYXlvdXRNYW5hZ2VyKCkuZ2V0TGF5b3V0KGVsZW1lbnQsIHRydWUpOwotCQkJdXJsID0gZ2VuZXJhdGVIdG1sKGxheW91dCk7Ci0JCQlsb25nIGVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIlRpbWUgdGFrZW4gdG8gcmVuZGVyIEhUTUwgcGFnZSBmb3IgIiArIGVsZW1lbnQuZ2V0TmFtZSgpICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSI6ICIgKyAoZW5kVGltZSAtIHN0YXJ0VGltZSkgKyAiIG1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGVsc2UgewotCQkJSUVsZW1lbnRMYXlvdXQgbGF5b3V0ID0gZ2V0TGF5b3V0TWFuYWdlcigpLmdldExheW91dChlbGVtZW50LCB0cnVlKTsKLQkJCXVybCA9IGdlbmVyYXRlSHRtbChsYXlvdXQpOwotCQl9Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIEhUTUwgZm9yIGEgTWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgVGhlIFVSTCBvZiBhIE1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGdlbmVyYXRlSHRtbChTdHJpbmcgdXJsKSB7Ci0JCUlFbGVtZW50TGF5b3V0IGxheW91dCA9IGdldExheW91dE1hbmFnZXIoKS5nZXRMYXlvdXQodXJsKTsKLQkJZ2VuZXJhdGVIdG1sKGxheW91dCk7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIHRoZSBIVE1MIGZvciBhIE1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBsYXlvdXQKLQkgKiAgICAgICAgICAgIEEgTWV0aG9kIEVsZW1lbnQuIExheW91dCBvYmplY3QuCi0JICogQHBhcmFtIGxpbmtlZEVsZW1lbnRzCi0JICogICAgICAgICAgICBJZiBub3QgbnVsbCwgdGhpcyBvYmplY3Qgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBhIGxpc3Qgb2YKLQkgKiAgICAgICAgICAgIGxpbmtlZCBlbGVtZW50cyBpbiB0aGUgcGFnZS4KLQkgKiBAcmV0dXJuIEEgdXJsIG9mIHRoZSBnZW5lcmF0ZWQgY29udGVudCBIVE1MIGZpbGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUh0bWwoSUVsZW1lbnRMYXlvdXQgbGF5b3V0KSB7Ci0JCWlmIChsYXlvdXQgPT0gbnVsbCkgewotCQkJcmV0dXJuICJhYm91dDpibGFuayI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKCIqKiogZ2VuZXJhdGVIdG1sOiAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUobGF5b3V0LmdldEVsZW1lbnQoKSkgKTsKLQkJCi0JCS8vIGFkZCB0aW1lIGxvZ2dpbmcgd2hlbiBwdWJsaXNoaW5nIGVsZW1lbnQKLQkJbG9uZyB0aW1lX3N0YXJ0ID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lSW5NaWxsaXMoKTsKLQkJU3RyaW5nIGVsZW1lbnRQYXRoID0gbGF5b3V0LmdldEZpbGVQYXRoKCkucmVwbGFjZSgnLycsCi0JCQkJRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJU3RyaW5nIGVsZW1lbnRQYXRoTmFtZSA9IGVsZW1lbnRQYXRoCi0JCQkJKyBsYXlvdXQuZ2V0RmlsZU5hbWUoUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTCk7Ci0JCVN0cmluZyBmaWxlUGF0aCA9IHRoaXMuZ2V0UHVibGlzaERpcigpICsgZWxlbWVudFBhdGg7Ci0JCVN0cmluZyBodG1sX2ZpbGUgPSB0aGlzLmdldFB1Ymxpc2hEaXIoKSArIGVsZW1lbnRQYXRoTmFtZTsKLQotCQl0cnkgewotCi0JCQlTdHJpbmdCdWZmZXIgeG1sID0gZ2V0WG1sKGxheW91dCk7Ci0KLQkJCVN0cmluZyB4c2xfdXJpOwotCi0JCQlGaWxlIGYgPSBuZXcgRmlsZShmaWxlUGF0aCk7Ci0JCQlpZiAoIWYuZXhpc3RzKCkpIHsKLQkJCQlmLm1rZGlycygpOwotCQkJfQotCi0JCQkvLyBHZW5lcmF0ZSB0aGUgYWRkaXRvbmFsIG91dHB1dHMuCi0JCQlMaXN0IGxheW91dHMgPSBsYXlvdXQuZ2V0TGF5b3V0cygpOwotCQkJeHNsX3VyaSA9IGxheW91dFhzbFJvb3RQYXRoICsgbGF5b3V0LmdldFhzbFVybCgpOwotCQkJZ2VuZXJhdGVIdG1sKGxheW91dCwgeHNsX3VyaSwgaHRtbF9maWxlLCB4bWwpOwotCi0JCQkvLyBHZW5lcmF0ZSBvdGhlciBsYXlvdXQgZmlsZXMuCi0JCQlpZiAobGF5b3V0cyAhPSBudWxsICYmIGxheW91dHMuc2l6ZSgpID4gMCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBsYXlvdXRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJTGF5b3V0SW5mbyBpbmZvID0gKExheW91dEluZm8pIGl0Lm5leHQoKTsKLQkJCQkJeHNsX3VyaSA9IGxheW91dFhzbFJvb3RQYXRoICsgaW5mby5sYXlvdXRfeHNsOwotCQkJCQlTdHJpbmcgZmlsZSA9IGZpbGVQYXRoICsgaW5mby5maWxlTmFtZTsKLQkJCQkJZ2VuZXJhdGVIdG1sKGxheW91dCwgeHNsX3VyaSwgZmlsZSwgeG1sKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJaHRtbF9maWxlID0gbnVsbDsKLQkJfQotCi0JCWxvbmcgdGltZV9lbmQgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpOwotCQlsb25nIG1pbmlfc2Vjb25kcyA9IHRpbWVfZW5kIC0gdGltZV9zdGFydDsKLQkJaWYgKG1pbmlfc2Vjb25kcyA+IDEwMDApIHsKLQkJCVN0cmluZyBtc2cgPSBtaW5pX3NlY29uZHMKLQkJCQkJKyAiIG1pbmktc2Vjb25kKHMpIHB1Ymxpc2hpbmcgZWxlbWVudCAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUobGF5b3V0LmdldEVsZW1lbnQoKSkgKyAiWyIgKyBlbGVtZW50UGF0aE5hbWUgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IgPSBnZXRWYWxpZGF0b3IoKTsKLQkJCWlmICh2YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJfSBlbHNlIHsKLQkJCQl2YWxpZGF0b3IubG9nSW5mbyhtc2cpOwotCQkJfQotCQl9Ci0JCWlmIChodG1sX2ZpbGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGh0bWxfZmlsZTsKLQkJfQotCi0JCXJldHVybiAiYWJvdXQ6YmxhbmsiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIHRoZSBIVE1MIGZvciBhIE1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBsYXlvdXQKLQkgKiAgICAgICAgICAgIEEgTWV0aG9kIEVsZW1lbnQuIExheW91dCBvYmplY3QuCi0JICogQHBhcmFtIHhzbFVSSQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzdHlsZXNoZWV0LgotCSAqIEBwYXJhbSBodG1sRmlsZQotCSAqICAgICAgICAgICAgVGhlIEhUTUwgZmlsZSB0byBiZSBnZW5lcmF0ZWQuCi0JICogQHBhcmFtIHhtbAotCSAqICAgICAgICAgICAgVGhlIFhNTCBidWZmZXIuCi0JICogQHJldHVybiBBIHVybCBvZiB0aGUgZ2VuZXJhdGVkIGNvbnRlbnQgSFRNTCBmaWxlLgotCSAqLwotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUh0bWwoSUVsZW1lbnRMYXlvdXQgbGF5b3V0LAotCQkJU3RyaW5nIHhzbF91cmksIFN0cmluZyBodG1sX2ZpbGUsIFN0cmluZ0J1ZmZlciB4bWwpIHsKLQkJVGhyb3dhYmxlIHRoID0gbnVsbDsKLQkJaWYgKGxheW91dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlUaW1lciB0aW1lciA9IG51bGw7Ci0JCWlmICggZGVidWcgKSB7Ci0JCQl0aW1lciA9IG5ldyBUaW1lcigpOwotCQl9Ci0JCQotCQl0cnkgewotCQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJWFNMVFByb2Nlc3Nvci50cmFuc2Zvcm0oeHNsX3VyaSwgeG1sLnRvU3RyaW5nKCksIHhzbFBhcmFtcywgc3cpOwotCQkJc3cuZmx1c2goKTsKLQkJCVN0cmluZyBjb250ZW50ID0gc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsKLQotCQkJaWYgKCBkZWJ1ZykgewotCQkJCXRpbWVyLnN0b3AoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4odGltZXIuZ2V0VGltZSgpICsgIiBtaW5pIHNlY29uZHMgZm9yIHhtbC94c2x0IHRyYW5zZm9ybWF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0aW1lci5zdGFydCgpOwotCQkJfQotCQkJLy8gQWx3YXlzIHZhbGlkYXRlIGFuZCBmaXggdGhlIGNvbnRlbnQgYmVmb3JlIHB1Ymxpc2hpbmcuCi0JCQljb250ZW50ID0gUmVzb3VyY2VIZWxwZXIudmFsaWRhdGVDb250ZW50KGxheW91dC5nZXRFbGVtZW50KCksCi0JCQkJCWNvbnRlbnQsIGdldFZhbGlkYXRvcigpLCBsYXlvdXQuZ2V0TGF5b3V0TWdyKCkKLQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCWlmIChjb250ZW50U2NhbkVuYWJsZWQoKSkgewotLy8JCQkJc2NhbkNvbnRlbnRGb3JSZXNvdXJjZXMobGF5b3V0LmdldEVsZW1lbnQoKSwgY29udGVudCwgbGF5b3V0Ci0vLwkJCQkJCS5nZXRGaWxlUGF0aCgpKTsKLQkJCQlnZXRWYWxpZGF0b3IoKS5zY2FuQ29udGVudChsYXlvdXQsIGNvbnRlbnQpOwotCQkJfQotCi0JCQlpZiAoIGRlYnVnKSB7Ci0JCQkJdGltZXIuc3RvcCgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbih0aW1lci5nZXRUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBzY2FubmluZyBjb250ZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0aW1lci5zdGFydCgpOwotCQkJfQotCQkJCi0JCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLQkJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0oaHRtbF9maWxlKSwgInV0Zi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCW91dHB1dC53cml0ZShjb250ZW50KTsKLQkJCW91dHB1dC5mbHVzaCgpOwotCQkJb3V0cHV0LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRoID0gZTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aCA9IGU7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aCA9IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGggPSBlOwotCQl9Ci0KLQkJaWYgKHRoICE9IG51bGwpIHsKLQkJCXRoaXMuZ2V0VmFsaWRhdG9yKCkubG9nRXJyb3IobGF5b3V0LmdldEVsZW1lbnQoKSwKLQkJCQkJIkVycm9yIGdlbmVyYXRpbmcgZWxlbWVudCBjb250ZW50IiwgdGgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIEhUTUwgZm9yIGEgTWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxheW91dAotCSAqICAgICAgICAgICAgQSBNZXRob2QgRWxlbWVudC4gTGF5b3V0IG9iamVjdC4KLQkgKiBAcmV0dXJuIEEgdXJsIG9mIHRoZSBnZW5lcmF0ZWQgY29udGVudCBIVE1MIGZpbGUuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZ2V0WG1sKElFbGVtZW50TGF5b3V0IGxheW91dCkgewotCQlTdHJpbmdCdWZmZXIgeG1sID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlYbWxFbGVtZW50IHhtbEVsZW1lbnQgPSBsYXlvdXQuZ2V0WG1sRWxlbWVudCh0cnVlKTsKLQkJCi0JCS8vIHNldCB0aGUgbGFuZ3VhZ2UgYXR0cmlidXRlCi0JCUxvY2FsZSBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotCQlTdHJpbmcgbGFuZyA9IGxvY2FsZS5nZXRMYW5ndWFnZSgpOwotCQl4bWxFbGVtZW50LnNldEF0dHJpYnV0ZSgibGFuZyIsIGxhbmcpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKHNob3dUcmVlQnJvd3NlcikgewotCQkJeG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoInNob3dUcmVlQnJvd3NlciIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJeG1sLmFwcGVuZChYbWxIZWxwZXIuWE1MX0hFQURFUikuYXBwZW5kKHhtbEVsZW1lbnQudG9YbWwoKSk7Ci0KLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHhtbF9maWxlID0gdGhpcy5nZXRQdWJsaXNoRGlyKCkgKyAieG1sIiArIEZpbGUuc2VwYXJhdG9yOyAvLyROT04tTkxTLTEkCi0JCQkJeG1sX2ZpbGUgKz0gbGF5b3V0LmdldFR5cGUoKSArICIuIiArIGxheW91dC5nZXRGaWxlTmFtZSgiLnhtbCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlGaWxlIHhmID0gbmV3IEZpbGUoeG1sX2ZpbGUpOwotCQkJCWlmICggIXhmLmV4aXN0cygpICkKLQkJCQl7Ci0JCQkJCXhmLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQkJCQkJeGYuY3JlYXRlTmV3RmlsZSgpOwotCQkJCX0KLQkJCQkJCQkKLQkJCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLQkJCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKHhmKSwgInV0Zi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlvdXRwdXQud3JpdGUoeG1sLnRvU3RyaW5nKCkpOwotCQkJCW91dHB1dC5mbHVzaCgpOwotCQkJCW91dHB1dC5jbG9zZSgpOwotCQotCQkJCS8vIEZpbGVXcml0ZXIgeHcgPSBuZXcgRmlsZVdyaXRlcih4bWxfZmlsZSk7Ci0JCQkJLy8geHcud3JpdGUoeG1sLnRvU3RyaW5nKCkpOwotCQkJCS8vIHh3LmZsdXNoKCk7Ci0JCQkJLy8geHcuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4geG1sOwotCX0KLQotLy8JLyoqCi0vLwkgKiBTY2FucyB0aGUgY29udGVudCBmb3IgcmVzb3VyY2UgcmVmZXJlbmNlcy4KLS8vCSAqLwotLy8JcHJpdmF0ZSB2b2lkIHNjYW5Db250ZW50Rm9yUmVzb3VyY2VzKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBjb250ZW50LAotLy8JCQlTdHJpbmcgY29udGVudFBhdGgpIHsKLS8vCQlDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXIgPSBnZXRTY2FubmVyKG93bmVyKTsKLS8vCQlpZiAoIHNjYW5uZXIgIT0gbnVsbCApIHsKLS8vCQkJc2Nhbm5lci5yZXNvbHZlUmVzb3VyY2VzKG93bmVyLCBjb250ZW50LCBjb250ZW50UGF0aCk7Ci0vLwkJfQotLy8JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLS8vCQlpZiAodmFsaWRhdG9yICE9IG51bGwpIHsKLS8vCQkJdmFsaWRhdG9yLmRpc3Bvc2UoKTsKLS8vCQl9Ci0KLQkJaWYgKCBpbnRlcm5hbF9tZ3IgIT0gbnVsbCApIHsKLQkJCWludGVybmFsX21nci5jbGVhcigpOwotCQkJaW50ZXJuYWxfbWdyID0gbnVsbDsKLQkJfQotCQkKLQkJbWdyID0gbnVsbDsKLS8vCQlzY2FubmVyID0gbnVsbDsKLS8vCQl2YWxpZGF0b3IgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvSUNvbnRlbnRWYWxpZGF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvSUNvbnRlbnRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg0NThlNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0lDb250ZW50VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBpbnRlcmZhY2UgZm9yIGNvbnRlbnQgdmFsaWRhdG9yIGF0IGJyb3dzaW5nIGFuZCBwdWJsaXNoaW5nCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb250ZW50VmFsaWRhdG9yICB7Ci0KLQkvKioKLQkgKiBzZXQgcHVibGlzaCBkaXIKLQkgKiBAcGFyYW0gcHViRGlyIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hEaXIoU3RyaW5nIHB1YkRpcik7Ci0JCi0JLyoqCi0JICogc2hvdyBicm9rZW4gbGlua3MgaWYgdHJ1ZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3dCcm9rZW5MaW5rcygpOwotCQotCXB1YmxpYyB2b2lkIHNjYW5Db250ZW50KElFbGVtZW50TGF5b3V0IGxheW91dCwgU3RyaW5nIGNvbnRlbnQpIHRocm93cyBFeGNlcHRpb247Ci0KLQkvKioKLQkgKiB2YWxpZGF0ZSB0aGUgbGluayBhdHRyaWJ1dGUgYW5kIGxpbmtlZCB0ZXh0IGZvciB0aGUgb3duaW5nIGVsZW1lbnQgd2l0aGluIHRoZSBjb25maWd1cmF0aW9uLiAKLQkgKiBSZXR1cm5zIGEgTGlua0luZm8gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBvd25lciB7QGxpbmsgTWV0aG9kRWxlbWVudH0gdGhlIG93bmVyIGVsZW1lbnQKLQkgKiBAcGFyYW0gYXR0cmlidXRlcyBTdHJpbmcgdGhlIHVybCBhdHRyaWJ1dGVzCi0JICogQHBhcmFtIHRleHQgU3RyaW5nIHRoZSBsaW5rZWQgdGV4dAotCSAqIEBwYXJhbSBjb25maWcgTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSB0YWcgdGhlIEhUTUwgdGFnIChhLCBhcmVhKQotCSAqIEByZXR1cm4gTGlua0luZm8KLQkgKi8KLQlwdWJsaWMgTGlua0luZm8gdmFsaWRhdGVMaW5rKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBhdHRyaWJ1dGVzLAotCQkJU3RyaW5nIHRleHQsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgdGFnKTsKLQotCS8qKgotCSAqIGxvZyB0aGUgaW5mbyBmb3IgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBtZXNzYWdlIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0luZm8oTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIG1lc3NhZ2UpOwotCi0JLyoqCi0JICogbG9nIGEgbWlzc2luZyByZWZlcmVuY2UKLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSByZWZFbGVtZW50IE1ldGhvZEVsZW1lbnQgdGhlIHJlZmVybmVjZWQgZWxlbWVudCB0aGF0IGlzIG1pc3NpbmcgaW4gY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ01pc3NpbmdSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBvd25lciwKLQkJCU1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudCk7Ci0KLQkvKioKLQkgKiBsb2cgYSBtaXNzaW5nIHJlZmVyZW5jZQotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50IHRoZSBvd25lciBlbGVtZW50Ci0JICogQHBhcmFtIGd1aWQgU3RyaW5nIHRoZSByZWZlcmVuY2VkIGd1aWQgd2hpY2ggaXMgbm90IGEgdmFsaWQgZWxlbWVudCBpbiB0aGUgY29uZmlndXJhdGlvbiBhbnkgbW9yZQotCSAqIEBwYXJhbSBsaW5rZWRUZXh0IFN0cmluZyB0aGUgbGlua2VkIHRleHQgYWxvbmcgd2l0aCB0aGUgbGluay4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dNaXNzaW5nUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBndWlkLAotCQkJU3RyaW5nIGxpbmtlZFRleHQpOwotCi0JLyoqCi0JICogbG9nIGEgbWlzc2luZyByZXNvdXJjZSAKLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudCB0aGUgb3duZXIKLQkgKiBAcGFyYW0gcmVzb3VyY2VGaWxlIEZpbGUgdGhlIGZpbGUgdGhhdCBvd25lZCBieSB0aGUgZWxlbWVudCBhbmQgcmVmZXJlbmNlcyB0aGUgbWlzaW5nIHJlc291cmNlLCAKLQkgKiBudWxsIGlmIHRoZSBtaXNpbmcgcmVmZXJlbmNlIGlzIHJlZmVyZW5jZWQgYnkgdGhlIGVsZW1lbnQgaXRzZWxmIAotCSAqIEBwYXJhbSB1cmwgU3RyaW5nIHRoZSB1cmwgdGhhdCBjYW4ndCBiZSByZXNvdmxlZCB0byBhIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ01pc3NpbmdSZXNvdXJjZShNZXRob2RFbGVtZW50IG93bmVyLCBGaWxlIHJlc291cmNlRmlsZSwKLQkJCVN0cmluZyB1cmwpOwotCi0JLyoqCi0JICogbG9nbiBhIHdhcm5pbmcgbWVzc2FnZQotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIG1lc3NhZ2UgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgbG9nV2FybmluZyhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgbWVzc2FnZSk7Ci0KLQkvKioKLQkgKiBsb2cgYW4gZXJyb3IgbWVzc2FnZQotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIG1lc3NhZ2UgU3RyaW5nCi0JICogQHBhcmFtIHRoIFRocm93YWJsZSwgbnVsbCBpZiBub3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRoKTsKLQotCS8qKgotCSAqIGxvZyBhbiBpbnZhbGlkIGV4dGVybmFsIGxpbmsKLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSB1cmwgU3RyaW5nIHRoZSB1cmwKLQkgKiBAcGFyYW0gbWVzc2FnZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dJbnZhbGlkRXh0ZXJuYWxMaW5rKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyB1cmwsCi0JCQlTdHJpbmcgbWVzc2FnZSk7Ci0KLQkvKioKLQkgKiBsb2cgYSBtZXNzYWdlCi0JICogQHBhcmFtIG1lc3NhZ2UgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgbG9nSW5mbyhTdHJpbmcgbWVzc2FnZSk7Ci0KLQkvKioKLQkgKiBsb2cgYSB3YXJuaW5nCi0JICogQHBhcmFtIG1lc3NhZ2UgU3RyaW5nCi0gCSAqLwotCXB1YmxpYyB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpOwotCi0JLyoqCi0JICogbG9nIGFuIGVycm9yCi0JICogQHBhcmFtIG1lc3NhZ2UgU3RyaW5nCi0JICogQHBhcmFtIHRoIFRocm93YWJsZQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGgpOwotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgZGlzY2FyZGVkIG9yIG5vdAotCSAqIGRpc2NhcmRlZCBlbGVtZW50cyB3aWxsIGJlIHRyZWF0ZWQgYXMgb3V0IHNpZGUgdGhlIGNvbmZpZ3Vyc2F0aW9uCi0JICogCi0JICogQHBhcmFtIG93bmVyIE1ldGhvZEVsZW1lbnQgdGhlIG93bmVyIG9mIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIE9iamVjdCBmZWF0dXJlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBvciBPcHBvc2l0ZUZlYXR1cmUKLQkgKiBAcGFyYW0gZSBNZXRob2RFbGVtZW50IHRoZSBlbGVtZW50IHRvIGJlIGNoZWNrZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc2NhcmRlZChNZXRob2RFbGVtZW50IG93bmVyLCBPYmplY3QgZmVhdHVyZSwgTWV0aG9kRWxlbWVudCBlKTsKLQotCS8qKgotCSAqIHNldCBhbiBkaXNjYXJkZWQgZWxlbWVudAotCSAqIEBwYXJhbSBlIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNjYXJkZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZSk7Ci0KLQkvKioKLQkgKiBkaXNwb3NlIHRoZSBvYmplY3QgYW5kIGZyZWUgcmVzb3VyY2VzCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci0JCQotCS8qKgotCSAqIGFkZCBhIHJlZmVybmVjZWQgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGUgTWV0aG9kRWxlbWVudCB0aGUgZWxlbWVudCByZWZlcmVuY2VkIGJ5IHRoZSBvd25lciBlbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBvd25lciwgTWV0aG9kRWxlbWVudCBlKTsKLQkJCi0JLyoqCi0JICogZ2V0IHRoZSBmbGFnIGFib3V0IHNob3dpbmcgZXh0cmEgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGlua2VkIGVsZW1lbnRzIGZvciBkZXNjcmlwdG9ycwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpOwotCi0JLyoqCi0JICogc2hvdyBkZXNjcmlwdG9ycyBvbiBtZXRob2QgZWxlbWVudCBwYWdlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvd1JlbGF0ZWREZXNjcmlwdG9ycygpOwotCQotCS8qKgotCSAqIGdldCB0aGUgdGFiIGlkIGZvciB0aGUgYWN0aXZpdHkgbGF5b3V0Ci0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRBY3Rpdml0eVRhYigpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9JRWxlbWVudExheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9JRWxlbWVudExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjI5MjJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvSUVsZW1lbnRMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBlbGVtZW50IGxheW91dC4gYW55IGVsZW1lbnQgbGF5b3V0IHNob3VsZCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKiBBbiBlbGVtZW50IGxheW91dCBkZWZpbmVzIGhvdyB0aGUgZWxlbWVudCBzaG91bGQgYmUgcmVuZGVyZWQgaW4gYnJvd3NpbmcgYW5kIHB1Ymxpc2hpbmcuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVsZW1lbnRMYXlvdXQgewotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50IGlkLCB3aGljaCBpcyB0aGUgZWxlbWVudCdzIEdVSUQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogdGhlIHJlYWxpemVkIHByZXNlbnRhdGlvbiBuYW1lIG9mIHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCk7Ci0KLQkvKioKLQkgKiB0aGUgdXJsIG9mIHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVybCgpOwotCi0JLyoqCi0JICogdGhlIHVybCBmb3Igc2hhcGUgaWNvbiBvZiB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaGFwZWljb25VcmwoKTsKLQotCS8qKgotCSAqIHRoZSB1cmwgZm9yIG5vZGUgaWNvbiBvZiB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlaWNvblVybCgpOwotCi0JLyoqCi0JICogdGhlIHVybCBmb3IgZGlhZ3JhbSBpY29uIG9mIHRoZSBlbGVtZW50LCAKLQkgKiBmb3IgZXhhbXBsZSwgdGhlIGljb24gZm9yIGEgcm9sZSBpbiB0aGUgcm9sZS10YXNrLXdwIHJlbGF0aW9uc2hpcCBkaWFncmFtLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaWFncmFtaWNvblVybCgpOyAvLyBpY29uIGZvciBkaWFncmFtIHN1Y2ggYXMgUm9sZSBkaWFncmFtCi0KLQkvKioKLQkgKiB0aGUgbGF5b3V0IHhzbCB1cmwKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0WHNsVXJsKCk7Ci0KLQkvKioKLQkgKiB0aGUgYmFjayBwYXRoIG9mIHRoZSBlbGVtZW50IHJlbGF0aXZlIHRvIHRoZSBwdWJsaXNoaW5nIHJvb3QgZGlyLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrUGF0aCgpOwotCi0JLyoqCi0JICogZ2V0IHRoZSBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHB1Ymxpc2hpbmcgcm9vdAotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlUGF0aCgpOwotCi0JLyoqCi0JICogZ2V0IHRoZSBmaWxlIHBhdGggcmVsYXRpdmUgdG8gYW5vdGhlciBlbGVtZW50LiBUaGlzIGlzIHRoZQotCSAqIHJlbGF0aXZlVG8uYmFja3BhdGggKyB0aGlzLmVsZW1lbnRwYXRoCi0JICogCi0JICogQHBhcmFtIHJlbGF0aXZlVG8KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZVBhdGgoSUVsZW1lbnRMYXlvdXQgcmVsYXRpdmVUbyk7Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGZpbGUgbmFtZSBvZiB0aGUgZWxlbWVudCwgd2l0aCB0aGUgZ2l2ZW4gZXh0ZW5zaW9uLgotCSAqIEBwYXJhbSBleHQgU3RyaW5nIGV4dGVuc2lvbiwgc3VjaCBhcyAiLmh0bWwiCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKFN0cmluZyBleHQpOwotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50IAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIGdldCB0aGUgbGF5b3V0IG1hbmFnZXIgZm9yIHJhbmRlcmluZyB0aGUgbGF5b3V0IG9mIHRoZSBlbGVtZW50LgotCSAqIAotCSAqIEByZXR1cm4gRWxlbWVudExheW91dE1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgRWxlbWVudExheW91dE1hbmFnZXIgZ2V0TGF5b3V0TWdyKCk7Ci0KLQkvKioKLQkgKiBnZXQgdGhlIFhtbEVsZW1lbnQgZm9yIHRoZSBlbGVtZW50IGxheW91dC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5jbHVkZVJlZmVyZW5jZXMKLQkgKiAgICAgICAgICAgIHRydWUgdG8gaW5jbHVkZSB0aGUgeG1sIG9mIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQuIGZhbHNlIHRvCi0JICogICAgICAgICAgICBpZ25vcmUgdGhlIHhtbCBvZiB0aGUgcmVmZXJlbmNlcy4KLQkgKiBAcmV0dXJuIFhtbEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpOwotCi0JLyoqCi0JICogcmV0dXJuIGEgbGlzdCBvZiBMYXlvdXRJbmZvIG9iamVjdHMKLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBMYXlvdXRJbmZvIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRMYXlvdXRzKCk7Ci0KLQotCS8qKgotCSAqIGlmIHRoZSBlbGVtZW50J3MgY29udGVudCBpcyB0YXJnZXQgZm9yIGFub3RoZXIgZWxlbWVudCwgc2V0IGl0IGhlcmUuIGZvcgotCSAqIGV4YW1wbGUsIHN0ZXAgY29udGVudCBjYXQgdGFyZ2V0IGZvciBhIFRhc2sgb3IgYSB0YXNrIGRlc2NyaXB0b3IKLQkgKiBjb3B5cmlnaHQgY29udGVudCBjYW4gdGFyZ2V0IHRvIGRpZmZlcmVudCBlbGVtZW50cy4KLQkgKiAKLQkgKiBUaGUgcHVycG9zZSBvZiB0aGlzIGlzIHRoYXQgdGhlIHN5c3RlbSB3aWxsIGZpeCB0aGUgbGlua3MgaW4gdGhlIGNvbnRlbnQKLQkgKiB0byByZWxhdGl2ZSB0byB0aGUgdGFyZ2V0IGVsZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudFRhcmdldChNZXRob2RFbGVtZW50IHRhcmdldEVsZW1lbnQpOwotCi0JLyoqCi0JICogbmVlZCB0byBzZXQgdGhlIG93bmVyIG9mIHRoZSBjdXJyZW50IGxheW91dCBlbGVtZW50LiBJbiBtb3N0IGNhc2VzIHRoaXMKLQkgKiBzaG91bGQgYmUgdGhlIGVDb250YWluZXIgb2YgdGhlIGVsZW1lbnQuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgaW4gc29tZQotCSAqIHNpdHVhdGlvbiB0aGUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIG93bmVyIHdoZW4gdGhlIG9iamVjdCBpcyBjcmVhdGVkLgotCSAqIEZvciBleGFtcGxlLCB0aGUgQ29udGVudERlc2NyaXB0aW9uIG9iamVjdCdzIGVDb250aW5lciBpcyBudWxsIGlmIHRoZQotCSAqIGNvbnRlbnQgZmlsZSBpcyBub3Qgc2F2ZWQuCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudE93bmVyKE1ldGhvZEVsZW1lbnQgb3duZXIpOwotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGh0bWwgY29udGVudCBnZW5lcmF0ZWQgZnJvbSB0aGlzIHhzbCBmaWxlIG5lZWRzIHRvIGJlIHNjYW5uZWQgb3Igbm90Ci0JICogc2NhbiB0aGUgY29udGVudCBpcyBmb3IgaWRlbnRpZnlpbmcgZWxlbWVudCByZWZlcmVuY2VzIGluIHRoZSBjb250ZW50IGFuZCBjb3B5IG92ZXIgcmVzb3VyY2UgZmlsZXMKLQkgKiBpbiBzb21lIGNhc2VzIHdlIGRvbid0IG5lZWQgdG8gc2NhbiB0aGUgY29udGVudCwgZm9yIGV4YW1wbGUsIHRoZSBhY3Rpdml0eSBicmVha2Rvd24gc3RydWN0dXJlCi0JICogCi0JICogQHBhcmFtIHhzbFVybCB0aGUgeHNsIHRoYXQgaHRtbCBpcyBnZW5lcmF0ZWQgZnJvbSwgbnVsbCBmb3IgdGhlIGRlZmF1bHQgeHNsIGxheW91dAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIG5lZWRDb250ZW50U2NhbihTdHJpbmcgeHNsVXJsKTsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gc2hvdwotCSAqIEBkZXByZWNhdGVkIHRoaXMgbWV0aG9kIGlzIG5vdCBuZWVkZWQgYW55IG1vcmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaG93RWxlbWVudExpbmsoYm9vbGVhbiBzaG93KTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRFeHRlbnNpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGF5b3V0RXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMmFjZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLQotLyoqCi0gKiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBsYXlvdXQgZXh0ZW5kc2lvbgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMYXlvdXRFeHRlbnNpb24gewotCi0JcHJvdGVjdGVkIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1ncjsKLQkKLQkvKioKLQkgKiBkZWZhdWx0IGNvbnN0cnVjdG9yCi0JICoKLQkgKi8KLQlwdWJsaWMgTGF5b3V0RXh0ZW5zaW9uKCkgewotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNZ3IpIHsKLQkJdGhpcy5sYXlvdXRNZ3IgPSBsYXlvdXRNZ3I7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBFbGVtZW50UmVhbGl6ZXIgZ2V0RWxlbWVudFJlYWxpemVyKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCB2YWxpZGF0b3IuCi0JICovCi0JcHVibGljIGFic3RyYWN0IElDb250ZW50VmFsaWRhdG9yIGdldFZhbGlkYXRvcigpOwotCQotCXB1YmxpYyBhYnN0cmFjdCBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbihQcm9jZXNzIHByb2MpOwotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGF5b3V0RXh0ZW5zaW9uRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRFeHRlbnNpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYWUzOWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRFeHRlbnNpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuaW50ZXJuYWwuTGlicmFyeU1hbmFnZXJFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIExheW91dEV4dGVuc2lvbiBjb250cmlidXRpb25zCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXRFeHRlbnNpb25GYWN0b3J5IHsKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UgPSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUUgPSAiZWxlbWVudExheW91dEV4dGVuc2lvbnMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgImNsYXNzIiBhdHRyaWJ1dGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19BVFRSSUJfTkFNRSA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAiaWQiIGF0dHJpYnV0ZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FUVFJJQl9OQU1FID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBMYXlvdXRFeHRlbnNpb25GYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQotCS8vIEEgbWFwIG9mIGxpYnJhcnkgbWFuYWdlciBjb25maWd1cmF0aW9uIGVsZW1lbnRzLgotCXByaXZhdGUgTWFwPFN0cmluZywgTGF5b3V0RXh0ZW5zaW9uRWxlbWVudD4gbGF5b3V0RWxlbWVudHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExheW91dEV4dGVuc2lvbkVsZW1lbnQ+KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgTGF5b3V0RXh0ZW5zaW9uRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IExheW91dEV4dGVuc2lvbkZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIExheW91dEV4dGVuc2lvbkZhY3RvcnkoKSB7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCS8vIFByb2Nlc3MgdGhlICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5saWJyYXJ5TWFuYWdlcnMiIGV4dGVuc2lvbiBwb2ludAotCQkvLyBjb250cmlidXRvcnMuCi0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KAotCQkJCUVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UsIEVYVEVOU0lPTl9QT0lOVF9OQU1FKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKENMQVNTX0FUVFJJQl9OQU1FKTsKLQkJCQkJCVN0cmluZyBpZCA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZShJRF9BVFRSSUJfTkFNRSk7Ci0JCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwgJiYgY2xhc3NOYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkJCQkJJiYgaWQgIT0gbnVsbCAmJiBpZC50cmltKCkubGVuZ3RoKCkgPiAwKSB7CQkJCQkJCQotCQkJCQkJCUxheW91dEV4dGVuc2lvbkVsZW1lbnQgcHJvdmlkZXIgPSBsYXlvdXRFbGVtZW50cy5nZXQoaWQpOwotCQkJCQkJCWlmKHByb3ZpZGVyID09IG51bGwgKSB7Ci0JCQkJCQkJCXByb3ZpZGVyID0gbmV3IExheW91dEV4dGVuc2lvbkVsZW1lbnQoCi0JCQkJCQkJCQkJYnVuZGxlLCBjbGFzc05hbWUsIGlkKTsKLQkJCQkJCQkJbGF5b3V0RWxlbWVudHMucHV0KGlkLCBwcm92aWRlcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNFeHRlbnNpb24oU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBsYXlvdXRFbGVtZW50cy5jb250YWluc0tleShpZCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgbGF5b3V0IGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGV4dGVuc2lvbiBpZAotCSAqIEByZXR1cm4gTGF5b3V0RXh0ZW5zaW9uCi0JICovCi0JcHVibGljIExheW91dEV4dGVuc2lvbiBjcmVhdGVFeHRlbnNpb24oU3RyaW5nIGlkKSB7Ci0JCQotCQlpZiAoICFoYXNFeHRlbnNpb24oaWQpICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUxheW91dEV4dGVuc2lvbkVsZW1lbnQgcHJvdmlkZXIgPSAoTGF5b3V0RXh0ZW5zaW9uRWxlbWVudCkgbGF5b3V0RWxlbWVudHMuZ2V0KGlkKTsKLQkJdHJ5IHsKLQkJCUNsYXNzIGNsYXp6ID0gcHJvdmlkZXIuYnVuZGxlLmxvYWRDbGFzcyhwcm92aWRlci5jbGFzc05hbWUpOwotCQkJcmV0dXJuIChMYXlvdXRFeHRlbnNpb24pIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBMYXlvdXRFeHRlbnNpb25FbGVtZW50IHsKLQkJQnVuZGxlIGJ1bmRsZTsKLQkJU3RyaW5nIGNsYXNzTmFtZTsKLQkJU3RyaW5nIGlkOwotCQlwcml2YXRlIExheW91dEV4dGVuc2lvbkVsZW1lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGlkKSB7Ci0JCQl0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKLQkJCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQkJdGhpcy5pZCA9IGlkOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xheW91dEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY4ODVhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xheW91dEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotLyoqCi0gKiBsTHlvdXQgaW5mbyBmb3IgYW4gZWxlbWVudC4KLSAqIDxwPgotICogVGhpcyBpcyB1c2VkIHdoZW4gYW4gZWxlbWVudCBvdXRwdXQgbW9yZSB0aGVuIG9uZSBsYXlvdXQsIHN1Y2ggYXMgYWN0aXZpdHkKLSAqIHRhYnMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExheW91dEluZm8gewotCi0JcHVibGljIExheW91dEluZm8oU3RyaW5nIG5hbWUsIFN0cmluZyB4c2wsIFN0cmluZyBmaWxlTmFtZSwKLQkJCWJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGF5b3V0X3hzbCA9IHhzbDsKLQkJdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOwotCQl0aGlzLmlzUHJpbWFyeSA9IGlzUHJpbWFyeTsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgbmFtZSBvZiB0aGUgbGF5b3V0Ci0JICovCi0JcHVibGljIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogdGhlIGxheW91dCB4c2wgZmlsZSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBsYXlvdXRfeHNsOwotCi0JLyoqCi0JICogdGhlIG91dG91dCBmaWxlIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGZpbGVOYW1lOwotCi0JLyoqCi0JICogaXMgdGhpcyB0aGUgcHJpbWFyeSBsYXlvdXQ/IHRoaXMgYXBwbHkgdG8gdGhlIGNhc2Ugd2hlbiBvbmUgZWxlbWVudCBoYXMgbW9yZSB0aGFuIG9uZSBsYXlvdXQuCi0JICogIEZvciBleGFtcGxlLCBhbiBhY3Rpdml0eSBlbGVtZW50IGhhcyA0IGxheW91dHMuCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5OwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xheW91dFJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBkNTU0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xheW91dFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29weTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeHBhbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0KLS8qKgotICogYSB1dGlsaXR5IGNsYXNzIHRvIGhhbmRsZSBsYXlvdXQgcmVsYXRlZCByZXNvdXJjZXMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXRSZXNvdXJjZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBzaGFwZWljb25CdW5kbGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVEVNUF9MQVlPVVRfRElSID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgewotCQl0cnkgewotCQkJU3RyaW5nIHBrZyA9IExheW91dFJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIHJlc291cmNlID0gTGF5b3V0UmVzb3VyY2VzLmNsYXNzLmdldE5hbWUoKTsKLQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHJlc291cmNlKTsKLQkJCXNoYXBlaWNvbkJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShwa2cKLQkJCQkJKyAiLkRlZmF1bHRTaGFwZWljb25zIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJLyoKLQkJCSAqIFRFTVBfTEFZT1VUX0RJUiA9IGdldFN0cmluZygidGVtcF9sYXlvdXRfZGlyIik7IGlmICgKLQkJCSAqIFRFTVBfTEFZT1VUX0RJUiAhPSBudWxsICkgeyBURU1QX0xBWU9VVF9ESVIgPQotCQkJICogVEVNUF9MQVlPVVRfRElSLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOyB9Ci0JCQkgKi8KLQotCQkJLy8gTXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVQRiBydW5uaW5nIGRpZmZlcmVudCBsaWJzIGFyZSBzaGFyaW5nIHRoZSBzYW1lIGxheW91dCBkaXJlY3RvcnkKLQkJCS8vIHVzZSB0aW1lc3RhbXAgdG8gaWRlbnRpZnkgZWFjaCBpbnN0YW5jZQotCQkJLy8gd2UgbmVlZCB0byBjbGVhbiB0aGUgZmlsZXMgd2hlbiB0aGUgYXBwbGljYXRpb24gZXhpdAkJCQotCQkJU3RyaW5nIHVzZXJIb21lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJVEVNUF9MQVlPVVRfRElSID0gdXNlckhvbWUgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkrICJFUEYiICsgRmlsZS5zZXBhcmF0b3IgKyAibGF5b3V0IiArIEZpbGUuc2VwYXJhdG9yIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkrIExvbmcudG9IZXhTdHJpbmcoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lSW5NaWxsaXMoKSkgKyBGaWxlLnNlcGFyYXRvcjsKLQkJCQotCQkJRmlsZSBydXBUbXBEaXIgPSBuZXcgRmlsZShURU1QX0xBWU9VVF9ESVIpOwotCQkJaWYgKCFydXBUbXBEaXIuZXhpc3RzKCkpIHsKLQkJCQlydXBUbXBEaXIubWtkaXJzKCk7Ci0JCQl9IGVsc2UgewotCQkJCUZpbGVVdGlsLmRlbGV0ZUFsbEZpbGVzKHJ1cFRtcERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjYWxsIHRoaXMgd2hlbiB0aGUgYXBwbGljYXRpb24gZXhpdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhcigpCi0JewotCQl0cnkgewotCQkJRmlsZVV0aWwuZGVsZXRlQWxsRmlsZXMoVEVNUF9MQVlPVVRfRElSKTsKLQkJCQotCQkJLy8gYWxzbyBkZWxldGUgdGhlIGZvbGRlcgotCQkJbmV3IEZpbGUoVEVNUF9MQVlPVVRfRElSKS5kZWxldGUoKTsKLQkJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJLy8gYWxzbyByZXNldCB0aGUgYnJvd3NlciBzZXR0aW5ncyBzbyB0aGF0IHRoZSBsYXlvdXQgZGF0YSB3aWxsIGJlIGNvcGllZAotCQlCcm93c2luZ0xheW91dFNldHRpbmdzLklOU1RBTkNFLnNldENoYW5nZWQoKTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBkZWZhdWx0IHB1Ymxpc2ggcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRQdWJsaXNoRGlyKCkgewotCQlyZXR1cm4gVEVNUF9MQVlPVVRfRElSOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgeHNsIHVyaSBmb3IgdGhlIGdpdmVuIGtleXMKLQkgKiBAcGFyYW0ga2V5IFN0cmluZwotCSAqIEBwYXJhbSBzZWNvbmRLZXkgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0WHNsUGF0aChTdHJpbmcga2V5LCBTdHJpbmcgc2Vjb25kS2V5KSB7Ci0JCVN0cmluZyB1cmwgPSBnZXRYc2xVcmkoa2V5LCBzZWNvbmRLZXkpOwotCi0JCWlmICh1cmwgIT0gbnVsbCkgewotCQkJLy8gcmVzb2x2ZSB0aGUgZmlsZQotCQkJcmV0dXJuIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExheW91dFhzbFBhdGgoKSArIHVybDsKLQkJfQotCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgeHNsIHVyaSBmb3IgdGhlIGdpdmVuIGtleXMKLQkgKiBAcGFyYW0ga2V5IFN0cmluZwotCSAqIEBwYXJhbSBzZWNvbmRLZXkgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRYc2xVcmkoU3RyaW5nIGtleSwgU3RyaW5nIHNlY29uZEtleSkgewotCQlTdHJpbmcgdXJsID0gZ2V0U3RyaW5nKHJlc291cmNlQnVuZGxlLCBrZXkudG9Mb3dlckNhc2UoKSk7Ci0JCWlmICgodXJsID09IG51bGwpICYmIChzZWNvbmRLZXkgIT0gbnVsbCkpIHsKLQkJCXVybCA9IGdldFN0cmluZyhyZXNvdXJjZUJ1bmRsZSwgc2Vjb25kS2V5LnRvTG93ZXJDYXNlKCkpOwotCQl9Ci0KLQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQl1cmwgPSBnZXRTdHJpbmcocmVzb3VyY2VCdW5kbGUsICJkZWZhdWx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0KLQkJcmV0dXJuIHVybDsgCi0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgZGVmYXVsdCBzaGFwZSBpY29uIHVybAotCSAqIEBwYXJhbSBrZXkgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0U2hhcGVpY29uVXJsKFN0cmluZyBrZXkpIHsKLQkJU3RyaW5nIHVybCA9IGdldFN0cmluZyhzaGFwZWljb25CdW5kbGUsIGtleSk7Ci0JCWlmICh1cmwgPT0gbnVsbCkgewotCQkJdXJsID0gZ2V0U3RyaW5nKHNoYXBlaWNvbkJ1bmRsZSwgImdlbmVyYWwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFJlc291cmNlQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBudWxsOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgcmVzb3VyY2Ugc3RyaW5nIGZvciB0aGUga2V5Ci0JICogQHBhcmFtIGtleQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldFN0cmluZyhyZXNvdXJjZUJ1bmRsZSwga2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBjb3B5IGZpbGVzIGZyb20gb25lIGRpciB0byBhbm90aGVyCi0JICogQHBhcmFtIGZyb21EaXIgU3RyaW5nCi0JICogQHBhcmFtIHRvRGlyIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RGlyKFN0cmluZyBmcm9tRGlyLCBTdHJpbmcgdG9EaXIpIHsKLQotCQlTdHJpbmcgaW5jbHVkZXMgPSAiKi4qLCAqKi9jc3MvKi4qLCAqKi9pY29ucy8qLiosICoqL2ltYWdlcy8qLiosICoqL3Jlc291cmNlcy8qLiosICoqL3N0eWxlc2hlZXRzLyouKiwgKiovc2NyaXB0cy8qLioiOyAvLyROT04tTkxTLTEkCi0JCWNvcHlEaXIoZnJvbURpciwgdG9EaXIsIGluY2x1ZGVzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBjb3B5IGZpbGVzIGZyb20gb25lIGRpciB0byBhbm90aGVyLCB3aXRoIGZpbHRlcnMKLQkgKiBAcGFyYW0gZnJvbURpciBTdHJpbmcKLQkgKiBAcGFyYW0gdG9EaXIgU3RyaW5nCi0JICogQHBhcmFtIGluY2x1ZGVzIFN0cmluZwotCSAqIEBwYXJhbSBleGNsdWRlcyBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weURpcihTdHJpbmcgZnJvbURpciwgU3RyaW5nIHRvRGlyLCBTdHJpbmcgaW5jbHVkZXMsCi0JCQlTdHJpbmcgZXhjbHVkZXMpIHsKLQkJY29weURpcihuZXcgRmlsZShmcm9tRGlyKSwgbmV3IEZpbGUodG9EaXIpLCBpbmNsdWRlcywgZXhjbHVkZXMpOwotCX0KLQotCS8qKgotCSAqIGNvcHkgZGlyCi0JICogCi0JICogQHBhcmFtIGZyb21EaXIgRmlsZQotCSAqIEBwYXJhbSB0b0RpciBGaWxlCi0JICogQHBhcmFtIGluY2x1ZGVzIFN0cmluZwotCSAqIEBwYXJhbSBleGNsdWRlcyBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weURpcihGaWxlIGZyb21EaXIsIEZpbGUgdG9EaXIsIFN0cmluZyBpbmNsdWRlcywKLQkJCVN0cmluZyBleGNsdWRlcykKLQl7Ci0JCWNvcHlEaXIoZnJvbURpciwgdG9EaXIsIGluY2x1ZGVzLCBleGNsdWRlcywgdHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIGNvcHkgZGlyCi0JICogQHBhcmFtIGZyb21EaXIgRmlsZQotCSAqIEBwYXJhbSB0b0RpciBGaWxlCi0JICogQHBhcmFtIGluY2x1ZGVzIFN0cmluZwotCSAqIEBwYXJhbSBleGNsdWRlcyBTdHJpbmcKLQkgKiBAcGFyYW0gb3ZlcndyaXRlIGJvb2xlYW4gdHJ1ZSB0byBvdmVycmlkZSBleGlzdGluZyBmaWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RGlyKEZpbGUgZnJvbURpciwgRmlsZSB0b0RpciwgU3RyaW5nIGluY2x1ZGVzLAotCQkJU3RyaW5nIGV4Y2x1ZGVzLCBib29sZWFuIG92ZXJ3cml0ZSkgewotCQlDb3B5IGNwID0gbmV3IENvcHkoKTsKLQkJY3Auc2V0T3ZlcndyaXRlKG92ZXJ3cml0ZSk7IC8vIG9ubHkgY3BveSBuZXcgZmlsZXMgb3IgbmV3ZXIgZmlsZXMKLQkJaWYgKGluY2x1ZGVzICE9IG51bGwgfHwgZXhjbHVkZXMgIT0gbnVsbCkgewotCQkJRmlsZVNldCBzZXQgPSBuZXcgRmlsZVNldCgpOwotCQkJaWYgKGluY2x1ZGVzICE9IG51bGwpIHsKLQkJCQlzZXQuc2V0SW5jbHVkZXMoaW5jbHVkZXMpOwotCQkJfQotCi0JCQlpZiAoZXhjbHVkZXMgIT0gbnVsbCkgewotCQkJCXNldC5zZXRFeGNsdWRlcyhleGNsdWRlcyk7Ci0JCQl9Ci0KLQkJCXNldC5zZXREaXIoZnJvbURpcik7Ci0JCQljcC5hZGRGaWxlc2V0KHNldCk7Ci0JCX0KLQotCQljcC5zZXRUb2Rpcih0b0Rpcik7Ci0JCWNwLnNldFByb2plY3QobmV3IFByb2plY3QoKSk7Ci0JCWNwLmV4ZWN1dGUoKTsKLQotCX0KLQotCS8qKgotCSAqIGNvcHkgdGhlIGxheW91dCBmaWxlcyBmcm9tIHRoZSBsaWJyYXJ5IGxheW91dCBwYXRoIHRvIHRoZSBzcGVjaWZpZWQKLQkgKiBwdWJsaXNoIGZvbGRlcgotCSAqIAotCSAqIEBwYXJhbSB0b0RpcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5TGF5b3V0RmlsZXMoU3RyaW5nIHRvRGlyKSB7Ci0JCS8vIGNvcHkgdGhlIGxheW91dCBmaWxlcyB0byB0aGUgdGVtcCBmb2xkZXIKLQkJU3RyaW5nIHNvdXJjZURpciA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExheW91dFBhdGgoKTsKLQkJY29weURpcihzb3VyY2VEaXIsIHRvRGlyKTsKLQotCQl0cnkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuY29weUxvY2FsaXplZEZpbGVzKAotCQkJCQlMaWJyYXJ5UGx1Z2luLkxBWU9VVF9TQ1JJUFRTX1BBVEgsCi0JCQkJCW5ldyBGaWxlKHRvRGlyLCBMaWJyYXJ5UGx1Z2luLkxBWU9VVF9TQ1JJUFRTX0ZPTERFUiksIHRydWUsCi0JCQkJCWZhbHNlKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuemlwKEZpbGUgemlwRmlsZSwgRmlsZSB0b0RpcikgewotCQlFeHBhbmQgZXhwID0gbmV3IEV4cGFuZCgpOwotCQlleHAuc2V0T3ZlcndyaXRlKHRydWUpOyAKLQkJZXhwLnNldFNyYyh6aXBGaWxlKTsKLQkJZXhwLnNldERlc3QodG9EaXIpOwotCQlleHAuc2V0UHJvamVjdChuZXcgUHJvamVjdCgpKTsKLQkJZXhwLmV4ZWN1dGUoKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGF5b3V0UmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xheW91dFJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjEwZjhlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGF5b3V0UmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jCi0jIHVybHMgc3RhcnQgd2l0aCB0aGUgZm9sbG93aW5nIHdpbGwgYmUgdHJlYXRlZCBhcyBleHRlcm5hbCB1cmxzLCB1c2UgfCB0byBzcGVyYXRlIAotIwotI2V4dGVybmFsVXJsX3N0YXJ0V2l0aD1odHRwOi8vfGh0dHBzOi8vfGZ0cDovLwotIyBzZWUgYWxsIHRoZSBwb3NzaWJsZSBwcm90b2NhbHMgYXQ6Ci0jIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvdXJpLXNjaGVtZXMuaHRtbAotZXh0ZXJuYWxVcmxfc3RhcnRXaXRoPVthLXpBLVowLTlcXC5dezEsMTV9Oi8vCi0KLSMgWFNMIFN0eWxlc2hlZXQgTWFwcGluZyBmb3IgdGhlIE1ldGhvZCBFbGVtZW50cy4KLQotIyBDb3JlIE1ldGhvZCBFbGVtZW50cwotYXJ0aWZhY3Q9YXJ0aWZhY3QueHNsCi1kZWxpdmVyYWJsZT1kZWxpdmVyYWJsZS54c2wKLW91dGNvbWU9b3V0Y29tZS54c2wKLXJvbGU9cm9sZS54c2wKLXRhc2s9dGFzay54c2wKLQotIyBHdWlkYW5jZQotY2hlY2tsaXN0PWNoZWNrbGlzdC54c2wKLWNvbmNlcHQ9Z3VpZGFuY2UueHNsCi1leGFtcGxlPWd1aWRhbmNlX3dpdGhfYXR0YWNobWVudC54c2wKLWd1aWRlbGluZT1ndWlkYW5jZS54c2wKLXByYWN0aWNlPXByYWN0aWNlLnhzbAotcmVwb3J0PWd1aWRhbmNlLnhzbAotcm9hZG1hcD1ndWlkYW5jZS54c2wKLXJldXNhYmxlYXNzZXQ9Z3VpZGFuY2Vfd2l0aF9hdHRhY2htZW50LnhzbAotc3VwcG9ydGluZ21hdGVyaWFsPWd1aWRhbmNlLnhzbAotdGVtcGxhdGU9Z3VpZGFuY2Vfd2l0aF9hdHRhY2htZW50LnhzbAotdGVybWRlZmluaXRpb249Z3VpZGFuY2UueHNsCi10b29sbWVudG9yPWd1aWRhbmNlLnhzbAotd2hpdGVwYXBlcj1ndWlkYW5jZV93aXRoX2F0dGFjaG1lbnQueHNsCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM9Z3VpZGFuY2UueHNsCi0KLSMgQ29udGVudCBDYXRlZ29yaWVzCi1jdXN0b21jYXRlZ29yeT1jb250ZW50Y2F0ZWdvcnkueHNsCi1kaXNjaXBsaW5lPWNvbnRlbnRjYXRlZ29yeS54c2wKLWRpc2NpcGxpbmVncm91cGluZz1jb250ZW50Y2F0ZWdvcnkueHNsCi1kb21haW49Y29udGVudGNhdGVnb3J5LnhzbAotcm9sZXNldD1jb250ZW50Y2F0ZWdvcnkueHNsCi1yb2xlc2V0Z3JvdXBpbmc9Y29udGVudGNhdGVnb3J5LnhzbAotdG9vbD1jb250ZW50Y2F0ZWdvcnkueHNsCi13b3JrcHJvZHVjdHR5cGU9Y29udGVudGNhdGVnb3J5LnhzbAotCi0jIFByb2Nlc3MgRWxlbWVudHMKLSMgYWN0aXZpdHkgbGF5b3V0IHVzZSB0aGUgZGVmYXVsdCB0YWIgbGF5b3V0IHhzbAotI3dhcyB1c2luZyBhIHJlZnJlc2ggdG8gc2hvdyB0aGUgZGVmYXVsdCBwYWdlCi0jYnV0IGNhdXNlZCBwcm9ibGVtIGluIHRoZSBuYXZpZ2F0aW9uIGhpc3RvcnkgYmFjay9mb3J3YXJkIGluIGJyb3dzaW5nCi0jc28gc3dpdGNoIHRvIHRoZSBvbGQgd2F5IHRvIGdlbmVyYXRlIHRoZSBkZWZhdWx0IGxheW91dCB1c2luZyB0aGUgc2V0IGRlZmF1bHQgdGFiCi0jCi0jYWN0aXZpdHk9YWN0aXZpdHkueHNsCi0jY2FwYWJpbGl0eXBhdHRlcm49YWN0aXZpdHkueHNsCi0jZGVsaXZlcnlwcm9jZXNzPWFjdGl2aXR5LnhzbAotI2l0ZXJhdGlvbj1hY3Rpdml0eS54c2wKLSNwaGFzZT1hY3Rpdml0eS54c2wKLSNwcm9jZXNzPWFjdGl2aXR5LnhzbAotI3Byb2Nlc3Njb250cmlidXRpb249YWN0aXZpdHkueHNsCi0KLSMgRGVzY3JpcHRvcnMKLWNvbXBvc2l0ZXJvbGU9Y29tcG9zaXRlcm9sZS54c2wKLW1pbGVzdG9uZT1taWxlc3RvbmUueHNsCi1yb2xlZGVzY3JpcHRvcj1yb2xlX2Rlc2NyaXB0b3IueHNsCi10YXNrZGVzY3JpcHRvcj10YXNrX2Rlc2NyaXB0b3IueHNsCi10ZWFtcHJvZmlsZT10ZWFtcHJvZmlsZS54c2wKLXdvcmtwcm9kdWN0ZGVzY3JpcHRvcj1hcnRpZmFjdF9kZXNjcmlwdG9yLnhzbAotCi0jIE1pc2MKLWRlZmF1bHQ9ZGVmYXVsdC54c2wKLWdlbmVyYWw9Z2VuZXJhbC54c2wKLXBhZ2Vfbm90X2luc3RhbGxlZD1wYWdlX25vdF9pbnN0YWxsZWQueHNsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xpbmtJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xpbmtJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YWM2YjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MaW5rSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ueG1sLlhTTFRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci0KLS8qKgotICogY2xhc3MgdG8gcHJvY2VzcyBhbiBlbGVtZW50IGxpbmsgaW4gdGhlIGNvbnRlbnQKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpbmtJbmZvIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfQVRUUl9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfQVRUUl9HVUlEID0gImd1aWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX0FUVFJfSFJFRiA9ICJocmVmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19BVFRSX0tFWSA9ICJrZXkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX0FUVFJfVEVYVCA9ICJ0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19BVFRSX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGxpbmtlZFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGxpbmtFbGVtZW50ID0gbnVsbDsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzTWlzc2luZ1JlZmVyZW5jZSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGF0dHJpYnV0ZU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0JcHJpdmF0ZSBJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLQlwcml2YXRlIFN0cmluZyBwdWJEaXI7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdGFnOwotCQotCS8vVGVtcCBzb2x1dGlvbiBmb3IgZ2V0dGluZyBhcm91bmQgd2l0aG91dCBoYXZpbmcgYSBsaWJNZ3IgZHVyaW5nIG1pZ3JhdGlvbgotCS8vU2hvdWxkIGJlIHJlbW92ZWQgd2hlbiBsaWIgbG9hZGVkIGR1cmluZyBtaWdyYXRpb24gaXMgcmVnaXN0ZWQgd2l0aCBMaWIgc2VydmljZS4KLQlwcml2YXRlIHN0YXRpYyBNZXRob2RMaWJyYXJ5IGxpYnJhcnk7Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSB2YWxpZGF0b3IKLQkgKiBAcGFyYW0gcHViRGlyCi0JICovCi0JcHVibGljIExpbmtJbmZvKE1ldGhvZEVsZW1lbnQgb3duZXIsIElDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvciwKLQkJCVN0cmluZyBwdWJEaXIsIFN0cmluZyB0YWcpIHsKLQkJdGhpcy5vd25lckVsZW1lbnQgPSBvd25lcjsKLQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JCXRoaXMucHViRGlyID0gcHViRGlyOwotCQl0aGlzLnRhZyA9IHRhZzsKLQl9Ci0KLQkvKioKLQkgKiBpcyB0aGlzIGFuIGVsZW1lbnQgbGluaz8KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnRMaW5rKCkgewotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuaXNFbGVtZW50TGluayhnZXRFbGVtZW50TGlua1R5cGUoKSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50IGxpbmsgdHlwZQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TGlua1R5cGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoTElOS19BVFRSX0NMQVNTKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGd1aWQgb2YgdGhlIGVsZW1lbnQgbGluawotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRHdWlkKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKExJTktfQVRUUl9HVUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHVybCBvZiB0aGUgbGluawotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVcmwoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoTElOS19BVFRSX0hSRUYpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbGlua2VkIHRleHQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua2VkVGV4dCgpIHsKLQkJcmV0dXJuIGxpbmtlZFRleHQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBsaW5rZWQgZWxlbWVudAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldExpbmtlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBsaW5rRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGh0bWwgZm9yIHRoZSBsaW5rLgotCSAqIAotCSAqIEBwYXJhbSBzaG93QnJva2VuTGlua3MgYm9vbGVhbiB0cnVlIHRvIHNob3cgdGhlIGJyb2tlbiBsaW5rIG1hcmsuIGZhbHNlIHRvIHNob3cgdGV4dCBvbmx5Ci0JICogQHJldHVybiBTdHJpbmdCdWZmZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGdldEh0bWwoYm9vbGVhbiBzaG93QnJva2VuTGlua3MpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlpZiAoaXNNaXNzaW5nUmVmZXJlbmNlICYmIChwdWJEaXIgIT0gbnVsbCkpIHsKLQkJCVN0cmluZyB1cmwgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCFzaG93QnJva2VuTGlua3MpIHsKLQkJCQlidWZmZXIuYXBwZW5kKGxpbmtlZFRleHQpOwotCQkJCXJldHVybiBidWZmZXI7Ci0JCQl9Ci0KLQkJCXVybCA9IGdldE1pc3NpbmdFbGVtZW50VXJsKCk7Ci0JCQlidWZmZXIKLQkJCQkJLmFwcGVuZCgiPGltZyBhbHQ9XCJcIiBzcmM9XCIiICsgUmVzb3VyY2VIZWxwZXIuZ2V0QmFja1BhdGgob3duZXJFbGVtZW50KSArICJpbWFnZXMvbm9fcnVwLmdpZlwiPiYjMTYwOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJc2V0VXJsKHVybCk7Ci0JCX0KLQotCQlidWZmZXIuYXBwZW5kKCI8IiArIHRhZyk7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3IgKEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGl0ID0gYXR0cmlidXRlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA9IGl0Lm5leHQoKTsKLQkJCVN0cmluZyBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCVN0cmluZyB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlpZiAoTElOS19BVFRSX0hSRUYuZXF1YWxzKGtleSkKLQkJCQkJJiYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJYnVmZmVyLmFwcGVuZCgiICIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLmFwcGVuZChlbnRyeS5nZXRLZXkoKSkuYXBwZW5kKCI9IikgLy8kTk9OLU5MUy0xJAotCQkJCQkuYXBwZW5kKCJcIiIpLmFwcGVuZChlbnRyeS5nZXRWYWx1ZSgpKS5hcHBlbmQoIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJYnVmZmVyLmFwcGVuZCgiPiIpLmFwcGVuZChsaW5rZWRUZXh0KS5hcHBlbmQoIjwvIiArIHRhZyArICI+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJcmV0dXJuIGJ1ZmZlcjsKLQl9Ci0KLQkvKioKLQkgKiB2YWxpZGF0ZSB0aGUgbGluayBhdHRyaWJ1dGVzCi0JICogQHBhcmFtIGF0dHJpYnV0ZXMgU3RyaW5nIHRoZSBsaW5rIGF0dHJpYnV0ZXMKLQkgKiBAcGFyYW0gdGV4dCBTdHJpbmcgdGhlIGxpbmtlZCB0ZXh0Ci0JICogQHBhcmFtIGNvbmZpZyBNZXRob2RDb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVMaW5rKFN0cmluZyBhdHRyaWJ1dGVzLCBTdHJpbmcgdGV4dCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMubGlua2VkVGV4dCA9IHRleHQ7Ci0KLQkJTWF0Y2hlciBtMiA9IFJlc291cmNlSGVscGVyLnBfdGFnX2F0dHJpYnV0ZXMubWF0Y2hlcihhdHRyaWJ1dGVzKTsKLQkJd2hpbGUgKG0yLmZpbmQoKSkgewotCQkJU3RyaW5nIGF0dHJOYW1lID0gbTIuZ3JvdXAoMSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7Ci0JCQlTdHJpbmcgYXR0clZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChtMi5ncm91cCgzKSAhPSBudWxsKSB7Ci0JCQkJYXR0clZhbHVlID0gbTIuZ3JvdXAoMykudHJpbSgpOwotCQkJfSBlbHNlIGlmIChtMi5ncm91cCgyKSAhPSBudWxsKSB7Ci0JCQkJYXR0clZhbHVlID0gbTIuZ3JvdXAoMikudHJpbSgpOwotCQkJfQotCQkJCi0JCQkvKgotCQkJICogaWYgKGF0dHJWYWx1ZS5zdGFydHNXaXRoKCJcIiIpKSB7IGF0dHJWYWx1ZSA9Ci0JCQkgKiBhdHRyVmFsdWUuc3Vic3RyaW5nKDEpOyB9IGlmIChhdHRyVmFsdWUuZW5kc1dpdGgoIlwiIikpIHsKLQkJCSAqIGF0dHJWYWx1ZSA9IGF0dHJWYWx1ZS5zdWJzdHJpbmcoMCwgYXR0clZhbHVlLmxlbmd0aCgpIC0gMSk7IH0KLQkJCSAqLwotCi0JCQkvLyBHVlQ6IENhbm5vdCBQcmV2aWV3L0Jyb3dzZSBEZXNjcmlwdGlvbiBUYWIgd2hlbgotCQkJLy8gdGhlIENQIGNvbnRhaW5zIGNoaW5lc2UgY2hhcmFjdGVycwotCQkJLy8gZ2VuZXJhdGVkIGh0bWwgZnJvbSB4c2x0IGdvdCB0aGUgaHJlZiB1cmxzIGVuY29kZWQuIHdlIGRvbid0IHdhbnQKLQkJCS8vIHRoYXQgbWFrZSBzdXJlIGRlY29kZSB0aGUgdXJsIHVzaW5nICJVVEYtOCIgZW5jb2RpbmcKLQkJCWlmIChhdHRyTmFtZS5lcXVhbHMoTElOS19BVFRSX0hSRUYpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJYXR0clZhbHVlID0gZGVjb2RlKGF0dHJWYWx1ZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlhdHRyaWJ1dGVNYXAucHV0KGF0dHJOYW1lLCBhdHRyVmFsdWUpOwotCQl9Ci0KLQkJU3RyaW5nIGd1aWQgPSBnZXRHdWlkKCk7Ci0JCWlmIChndWlkID09IG51bGwpIHsKLQkJCS8vIGNoZWNrIGlmIHRoZSBmaWxlIGNvbnRhaW5zIGd1aWQsIGlmIHllcywgbmVlZCB0byBnZXQgdGhlIGVsZW1lbnQKLQkJCVN0cmluZyB1cmwgPSBnZXRVcmwoKTsKLQkJCWd1aWQgPSBSZXNvdXJjZUhlbHBlci5nZXRHdWlkRnJvbUZpbGVOYW1lKHVybCk7Ci0JCQlpZiAoZ3VpZCAhPSBudWxsKSB7Ci0JCQkJc2V0R3VpZChndWlkKTsKLQkJCX0KLQkJfQotCi0JCXZhbGlkYXRlRWxlbWVudFVybChjb25maWcpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZGVjb2RlKFN0cmluZyBzdHIpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFVSTERlY29kZXIuZGVjb2RlKHN0ciwgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBnZXQgYXR0cmlidXRlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKFN0cmluZykgYXR0cmlidXRlTWFwLmdldChuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgZ3VpZAotCSAqIEBwYXJhbSBndWlkIFN0cmluZwotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRHdWlkKFN0cmluZyBndWlkKSB7Ci0JCWF0dHJpYnV0ZU1hcC5wdXQoTElOS19BVFRSX0dVSUQsIGd1aWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVybChTdHJpbmcgdXJsKSB7Ci0JCWF0dHJpYnV0ZU1hcC5wdXQoTElOS19BVFRSX0hSRUYsIHVybCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRWxlbWVudFVybChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlTdHJpbmcgZ3VpZCA9IGdldEd1aWQoKTsKLQkJaWYgKGd1aWQgIT0gbnVsbCkgewotCQkJTWV0aG9kRWxlbWVudCBlID0gbnVsbDsKLQkJCWUgPSBnZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCi0JCQkvLyBpZiBwcm9jZXNzIGNvbXBvbmVudCwgZ2V0IHNob3cgdGhlIHByb2Nlc3MKLQkJCWlmIChlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCWUgPSAoKFByb2Nlc3NDb21wb25lbnQpIGUpLmdldFByb2Nlc3MoKTsKLQkJCX0KLQotCQkJLy8gMTU2NDc0IC0gUHJvY2VzcyBQYWNrYWdlIChlaXRoZXIgQ1AgcGFja2FnZSBvciBEUCBwYWNrYWdlKSBjYW4KLQkJCS8vIG5vdCBiZSBsaW5rZWQgaW4gUlRFCi0JCQkvLyBkb24ndCBzaG93IGxpbmsgZm9yIHBhY2thZ2VzLgotCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlIHx8IGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uCi0JCQkJCXx8IGUgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJZSA9IG51bGw7Ci0JCQkJLy8gcmVtb3ZlIHRoZSBsaW5rIGF0eXRyaWJ1dGUKLQkJCQlzZXRVcmwobnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZTEgPSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkJLmdldENhbGN1bGF0ZWRFbGVtZW50KGUsIGNvbmZpZyk7Ci0JCQkJCWlmIChlMSAhPSBudWxsKSB7Ci0JCQkJCQllID0gZTE7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpc01pc3NpbmdSZWZlcmVuY2UgPSB0cnVlOwotCQkJCQkJdmFsaWRhdG9yLmxvZ01pc3NpbmdSZWZlcmVuY2Uob3duZXJFbGVtZW50LCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaXNNaXNzaW5nUmVmZXJlbmNlID0gdHJ1ZTsKLQkJCQl2YWxpZGF0b3IubG9nTWlzc2luZ1JlZmVyZW5jZShvd25lckVsZW1lbnQsIGd1aWQsIGxpbmtlZFRleHQpOwotCQkJfQotCi0JCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJZ3VpZCA9IGUuZ2V0R3VpZCgpOwotCQkJCXNldEd1aWQoZ3VpZCk7Ci0JCQkJU3RyaW5nIHVybCA9IGdldFVybCgpOwotCi0JCQkJLy8gdXJsIGNhbiBiZSBudWxsLCBmb3IgZXhhbXBsZSwgYW4gZWxlbWVudCBsaW5rIGZvcgotCQkJCS8vIHByZXNlbnRhdGlvbiBuYW1lLCBzdWNoIGFzCi0JCQkJLy8gPGEgY2xhc3M9IlByZXNlbnRhdGlvbk5hbWUiCi0JCQkJLy8gZ3VpZD0ie0VFOTdBOENELTY2Q0EtNEE5Qi05ODcxLUUzQjk0Q0NFRDUyOH0iPlByb2plY3QKLQkJCQkvLyBNYW5hZ2VyPC9hPgotCQkJCS8vIHdlIG9ubHkgbmVlZCB0byBnZXQgdGhlIGVsZW1lbnQgZnJvbSB0aGUgZ3VpZAotCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQl1cmwgPSB1cmwudHJpbSgpOwotCQkJCQlpZiAoIXVybC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoCi0JCQkJCQkJUmVzb3VyY2VIZWxwZXIuVVJMX1NUUl9KQVZBU0NSSVBUKSkgewotCQkJCQkJdXJsID0gUmVzb3VyY2VIZWxwZXIuZ2V0VXJsKGUsIG93bmVyRWxlbWVudCwKLQkJCQkJCQkJUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTCwgdXJsKTsKLQkJCQkJCXNldFVybCh1cmwpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGlzRWxlbWVudExpbmsoKSAmJiAhdGFnLmVxdWFscygiYXJlYSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIHRleHQgPSBSZXNvdXJjZUhlbHBlci5nZXRMaW5rVGV4dChlLAotCQkJCQkJCWdldEVsZW1lbnRMaW5rVHlwZSgpKTsKLQkJCQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJCQkJLy8gaWYgbnVsbCwgY2FuIGJlIHVzZWQgdGV4dCwgZG9uJ3QgcmVzZXQgaXQKLQkJCQkJCXRoaXMubGlua2VkVGV4dCA9IHRleHQ7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAodmFsaWRhdG9yLmlzRGlzY2FyZGVkKG93bmVyRWxlbWVudCwgbnVsbCwgZSkpIHsKLQkJCQkJaXNNaXNzaW5nUmVmZXJlbmNlID0gdHJ1ZTsKLQkJCQkJdmFsaWRhdG9yLmxvZ01pc3NpbmdSZWZlcmVuY2Uob3duZXJFbGVtZW50LCBlKTsKLQkJCQkJZSA9IG51bGw7IC8vIGlnbm9yZSB0aGUgZWxlbWVudCBzaW5jZSBpdCdzIGRpc2NhcmRlZAotCQkJCX0KLQkJCX0KLQotCQkJdGhpcy5saW5rRWxlbWVudCA9IGU7Ci0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KFN0cmluZyBndWlkKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZTsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsICYmIGdldExpYnJhcnkoKSA9PSBudWxsKSB7Ci0JCQllID0gbWFuYWdlci5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQl9IGVsc2UgewotCQkJZSA9IGdldE1ldGhvZEVsZW1lbnRfKGd1aWQpOwotCQkJaWYgKGUgPT0gbnVsbCAmJiBtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQllID0gbWFuYWdlci5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlOwotCX0KLQotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX1BBR0VTX1hTTCA9ICJwYWdlc19ub3RfaW5zdGFsbGVkLyI7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGdldE1pc3NpbmdFbGVtZW50VXJsKCkgewotCQlpZiAoIWlzTWlzc2luZ1JlZmVyZW5jZSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTdHJpbmcgdXJsID0gbnVsbDsKLQotCQkvLyBpZiAobGlua0VsZW1lbnQgPT0gbnVsbCkgewotCQkvLyAvLyB0aGlzIGlzIGFuIGludmFsaWQgZWxlbWVudCwgbWF5YmUgZGVsZXRlZCBmcm9tIHRoZSBsaWJyYXJ5Ci0JCS8vIC8vIGFscmVhZHkKLQkJLy8gdXJsID0gUmVzb3VyY2VIZWxwZXIuTUlTU0lOR19QQUdFU19GT0xERVIgKyBnZXRHdWlkKCkKLQkJLy8gKyBSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MOwotCQkvLyB9IGVsc2UgewotCQkvLyB1cmwgPSBSZXNvdXJjZUhlbHBlci5NSVNTSU5HX1BBR0VTX0ZPTERFUgotCQkvLyArIFJlc291cmNlSGVscGVyLmdldEZpbGVOYW1lKGxpbmtFbGVtZW50LAotCQkvLyBSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MKTsKLQkJLy8gfQotCi0JCXVybCA9IFJlc291cmNlSGVscGVyLk1JU1NJTkdfUEFHRVNfRk9MREVSICsgInBhZ2VzX25vdF9pbnN0YWxsZWQiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIFJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTUw7Ci0KLQkJRmlsZSBmID0gbmV3IEZpbGUocHViRGlyLCB1cmwpOwotCQlGaWxlIGRpciA9IGYuZ2V0UGFyZW50RmlsZSgpOwotCQlpZiAoIWRpci5leGlzdHMoKSkgewotCQkJZGlyLm1rZGlycygpOwotCQl9Ci0KLQkJLy8gaWYgKCAhZi5leGlzdHMoKSApCi0JCXsKLQkJCS8vIGdlbmVyYXRlIHRoZSBodG1sIGZpbGUKLQkJCVhtbEVsZW1lbnQgeG1sID0gbmV3IFhtbEVsZW1lbnQoIkVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQkKLQkJCUxvY2FsZSBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotCQkJU3RyaW5nIGxhbmcgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKLQkJCXhtbC5zZXRBdHRyaWJ1dGUoImxhbmciLCBsYW5nKTsgLy8kTk9OLU5MUy0xJAotCi0KLQkJCWlmIChsaW5rRWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJeG1sLnNldEF0dHJpYnV0ZSgiaW52YWxpZExpbmsiLCAidHJ1ZSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgiZ3VpZCIsIGdldEd1aWQoKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIGxpbmtlZFRleHQpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXhtbAotCQkJCQkJLnNldEF0dHJpYnV0ZSgiZ3VpZCIsIGdldEd1aWQoKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgidHlwZSIsIGxpbmtFbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBsaW5rRWxlbWVudC5nZXROYW1lKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoCi0JCQkJCQkJCSJwbHVnaW5OYW1lIiwgTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGxpbmtFbGVtZW50KS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlTdHJpbmcgeHNsUGF0aCA9IExheW91dFJlc291cmNlcy5nZXREZWZhdWx0WHNsUGF0aCgKLQkJCQkJInBhZ2Vfbm90X2luc3RhbGxlZCIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQlzYXZlSHRtbCh4bWwsIHhzbFBhdGgsIGYpOwotCQl9Ci0KLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLmdldEJhY2tQYXRoKG93bmVyRWxlbWVudCkucmVwbGFjZSgKLQkJCQlGaWxlLnNlcGFyYXRvckNoYXIsICcvJykKLQkJCQkrIHVybDsKLQl9Ci0KLQkvKioKLQkgKiBzYXZlIGEgaHRtbCBmaWxlIAotCSAqIEBwYXJhbSB4bWxFbGVtZW50Ci0JICogQHBhcmFtIHhzbF91cmkKLQkgKiBAcGFyYW0gb3V0cHV0RmlsZQotCSAqIEBkZXByZWNhdGVkIHRoaXMgbWV0aG9kIGlkIG5vdCB1c2VkIGFueSBtb3JlCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUh0bWwoWG1sRWxlbWVudCB4bWxFbGVtZW50LCBTdHJpbmcgeHNsX3VyaSwgRmlsZSBvdXRwdXRGaWxlKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdCdWZmZXIgeG1sID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJeG1sLmFwcGVuZChYbWxIZWxwZXIuWE1MX0hFQURFUikuYXBwZW5kKHhtbEVsZW1lbnQudG9YbWwoKSk7Ci0KLQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRwdXQgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAotCQkJCQluZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKSwgInV0Zi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVByb3BlcnRpZXMgeHNsUGFyYW1zID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvcGVydGllcygKLQkJCQkJIi9sYXlvdXQveHNsL3Jlc291cmNlcy5wcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJWFNMVFByb2Nlc3Nvci50cmFuc2Zvcm0oeHNsX3VyaSwgeG1sLnRvU3RyaW5nKCksIHhzbFBhcmFtcywgb3V0cHV0KTsKLQkJCW91dHB1dC5mbHVzaCgpOwotCQkJb3V0cHV0LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50XyhTdHJpbmcgZ3VpZCkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChnZXRMaWJyYXJ5KCkgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IChJTGlicmFyeVJlc291cmNlU2V0KSBnZXRMaWJyYXJ5KCkKLQkJCQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiAoTWV0aG9kRWxlbWVudCkgcmVzb3VyY2VTZXQuZ2V0RU9iamVjdChndWlkKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0aCkgewotCQkJCQkvLyBMb2cgZXJyb3IgaGVyZQotCQkJCQl0aC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1ldGhvZExpYnJhcnkgZ2V0TGlicmFyeSgpIHsKLQkJcmV0dXJuIGxpYnJhcnk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCUxpbmtJbmZvLmxpYnJhcnkgPSBsaWJyYXJ5OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9Qcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOGI3YjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9Qcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFkYXB0ZXJGYWN0b3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLQotCi0vKioKLSAqIFRoZSBwcm9jZXNzIGZpbHRlciB3aXRoIGFkYXB0b3IgZmFjdG9yeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlciBleHRlbmRzIFByb2Nlc3NDb25maWd1cmF0b3IgaW1wbGVtZW50cwotCQlJQWRhcHRlckZhY3RvcnlGaWx0ZXIgewotCi0JcHJpdmF0ZSBFbGVtZW50TGF5b3V0TWFuYWdlci5MYXlvdXRBZGFwdGVyRmFjdG9yeSBmYWN0b3J5OwotCi0JLyoqCi0JICogY29uc3RydWN0b3IgdGhlIGZpbHRlcgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RDb25maWcKLQkgKiBAcGFyYW0gZmFjdG9yeQotCSAqLwotCXB1YmxpYyBQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIEVsZW1lbnRMYXlvdXRNYW5hZ2VyLkxheW91dEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIobWV0aG9kQ29uZmlnKTsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIEFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFdCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gZmFjdG9yeS53YnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIEFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFRCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gZmFjdG9yeS50YnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIEFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFdQQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGZhY3Rvcnkud3Bic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gQWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0Q0JTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBmYWN0b3J5LmNic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIGFjY2VwdCB0aGUgb2JqZWN0IG9yIG5vdC4KLQkgKiBAcGFyYW0gb2JqIE9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBzdXBlci5hY2NlcHQob2JqKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmYWN0b3J5ID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L1JpY2hUZXh0Q29udGVudFZhbGlkYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9SaWNoVGV4dENvbnRlbnRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM0MzdhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L1JpY2hUZXh0Q29udGVudFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQ7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRGVmYXVsdENvbnRlbnRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxpbmtJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogU3BlY2lhbCBjb250ZW50IHZhbGlkYXRvciBmb3IgdGhlIFJpY2ggVGV4dCBFZGl0b3IKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0Q29udGVudFZhbGlkYXRvciBleHRlbmRzIERlZmF1bHRDb250ZW50VmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIHZhbGlkYXRlcyBhIFVSTCB3aXRob3V0IGRlY29kaW5nIGl0Ci0JICovCi0JcHVibGljIExpbmtJbmZvIHZhbGlkYXRlTGluayhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgYXR0cmlidXRlcywKLQkJCVN0cmluZyB0ZXh0LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIHRhZykgewotCi0JCUxpbmtJbmZvIGluZm8gPSBuZXcgTGlua0luZm8ob3duZXIsIHRoaXMsIHB1YkRpciwgdGFnKSB7Ci0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlY29kZShTdHJpbmcgc3RyKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCQkJcmV0dXJuIHN0cjsKLQkJCX0KLQkJfTsKLQkJaW5mby52YWxpZGF0ZUxpbmsoYXR0cmlidXRlcywgdGV4dCwgY29uZmlnKTsKLQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9EaWFncmFtSW5mby5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL0RpYWdyYW1JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0Y2IxNmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL0RpYWdyYW1JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW07Ci0KLWltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSAqIGNsYXNzIGZvciBkaWFncmFtIGxheW91dAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1JbmZvIGV4dGVuZHMgTWV0aG9kRWxlbWVudERpYWdyYW0gewotCi0JcHJpdmF0ZSBpbnQgc3VwcHJlc3NlZENvdW50ID0gMDsKLQlwcml2YXRlIGludCBub2RlQ291bnQgPSAwOwotCQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICogQHBhcmFtIGRpYWdyYW1UeXBlCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUluZm8oU3RyaW5nIGRpYWdyYW1UeXBlLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoZWxlbWVudCk7Ci0KLQkJc3VwZXIuc2V0SFRNTE1hcChuZXcgSFRNTE1hcChkaWFncmFtVHlwZSArICJfIiArIGVsZW1lbnQuZ2V0TmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBhZGQgYSBkaWFncmFtIGFyZWEKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSB4Ci0JICogQHBhcmFtIHkKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICogQHBhcmFtIGFsdFRhZwotCSAqIEBwYXJhbSBzdXBwcmVzc2VkCi0JICovCi0JcHVibGljIHZvaWQgYWRkQXJlYShNZXRob2RFbGVtZW50IGUsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotCQkJU3RyaW5nIGFsdFRhZywgYm9vbGVhbiBzdXBwcmVzc2VkKSB7Ci0JCWlmICggc3VwcHJlc3NlZCApCi0JCXsKLQkJCXN1cHByZXNzZWRDb3VudCsrOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoYWx0VGFnID09IG51bGwpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJYWx0VGFnID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIGUpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQlpZiAoYWx0VGFnLmxlbmd0aCgpIDwgMSB8fCBhbHRUYWcgPT0gIiIpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlPYmplY3QgYmFzZSA9ICgoQWN0aXZpdHkpIGUpLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJCWFsdFRhZyA9ICgoQWN0aXZpdHkpIGJhc2UpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZSAhPSBudWxsKSB7Ci0JCQkJYWx0VGFnID0gZS5nZXROYW1lKCk7Ci0JCQl9IGVsc2UgewotCQkJCWFsdFRhZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlSZWN0YW5nbGUgY29vcmRpbmF0ZXMgPSBuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpOwotCQlTdHJpbmcgaHJlZiA9IFJlc291cmNlSGVscGVyLmdldFVybChlLCBzdXBlci5nZXRNZXRob2RFbGVtZW50KCksCi0JCQkJUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTCk7Ci0JCUhUTUxNYXAgbWFwID0gc3VwZXIuZ2V0SFRNTE1hcCgpOwotCQltYXAuYWRkQXJlYShuZXcgSFRNTEFyZWEoZS5nZXRHdWlkKCksIGhyZWYsICJyZWN0IiwgY29vcmRpbmF0ZXMsIGFsdFRhZykpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIEFkZCBncmFwaGljYWwgbm9kZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRHcmFwaGljYWxOb2RlcygpIHsKLQkJbm9kZUNvdW50Kys7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1hZ2UgcGF0aCByZWxhdGl2ZSB0byB0aGUgcHVibGlzaGluZyBkaXIuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZUZpbGVQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCXN1cGVyLnNldEltYWdlRmlsZU5hbWUoUmVzb3VyY2VIZWxwZXIuZ2V0QmFja1BhdGgoc3VwZXIKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgpKQotCQkJCSsgcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBudW1iZXIgb2YgYXJlYXMKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXJlYUNvdW50KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0SFRNTE1hcCgpLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIG51bWJlciBvZiBzdXBwcmVzc2VkIGFyZWFzCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN1cHByZXNzZWRDb3VudCgpIHsKLQkJcmV0dXJuIHN1cHByZXNzZWRDb3VudDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBudW1iZXIgb2YgZ3JhcGhpY2FsIG5vZGVzIGluIHRoZSBkaWFncmFtCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEdyYXBoaWNhbE5vZGVDb3VudCgpIHsKLQkJcmV0dXJuIG5vZGVDb3VudDsKLQl9Ci0JCi0JLyoqCi0JICogaXMgZW1wdHk/Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJCi0JCXJldHVybiBnZXRBcmVhQ291bnQoKSArIGdldFN1cHByZXNzZWRDb3VudCgpICsgZ2V0R3JhcGhpY2FsTm9kZUNvdW50KCkgPT0gMDsKLQkJCQkJCi0JfQotfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vSFRNTEFyZWEuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9IVE1MQXJlYS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTRiOWVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9IVE1MQXJlYS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW07Ci0KLWltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7Ci0KLS8qKgotICogRW5jYXBzdWxhdGVzIHRoZSBIVE1MIEFSRUEgdGFnLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhJCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MQXJlYSB7Ci0KLQlwcml2YXRlIFN0cmluZyBndWlkID0gIG51bGw7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgaHJlZjsKLQotCXByaXZhdGUgU3RyaW5nIHNoYXBlOwotCi0JcHJpdmF0ZSBSZWN0YW5nbGUgY29vcmRpbmF0ZXM7Ci0KLQlwcml2YXRlIFN0cmluZyBhbHRUYWc7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkhUTUxBcmVhPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgSFRNTEFyZWEoU3RyaW5nIGd1aWQsIFN0cmluZyBocmVmLCBTdHJpbmcgc2hhcGUsIFJlY3RhbmdsZSBjb29yZGluYXRlcywKLQkJCVN0cmluZyBhbHRUYWcpIHsKLQkJdGhpcy5ndWlkID0gZ3VpZDsKLQkJdGhpcy5ocmVmID0gaHJlZjsKLQkJdGhpcy5zaGFwZSA9IHNoYXBlOwotCQl0aGlzLmNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXM7Ci0JCXRoaXMuYWx0VGFnID0gYWx0VGFnOwotCQkKLQkJLy8gcmVtb3ZlIG5ldyBsaW5lIGNoYXJhY3RlcnMsIG90aGVyd2lzZSBpdCB3aWxsIGNhdXNlZCBhIHdoaXRlIHNwYWNlIGluIHRoZSBwdWJsaXNoZWQgaHRtbAotCQkvLyBub3QgYXMgZXhwZWN0ZWQuIAotCQkvLyBzZWUgYnVnIDAwMzg4OTc4IC0gRXh0cmEgc3BhY2UgaW4gdGhlIGZseW92ZXIgdGV4dCBpbiB0aGUgQ2FzcGlhbiBKYXBhbmVzZSBzaXRlCQkKLQkJaWYgKCB0aGlzLmFsdFRhZyAhPSBudWxsICkgewotCQkJdGhpcy5hbHRUYWcgPSB0aGlzLmFsdFRhZy5yZXBsYWNlQWxsKCIoXHJ8XG4pKyIsICIiKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBndWlkCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEd1aWQoKSB7Ci0JCXJldHVybiBndWlkOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBIUkVGLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHJlZigpIHsKLQkJcmV0dXJuIGhyZWY7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaGFwZSgpIHsKLQkJcmV0dXJuIHNoYXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvb3JkaW5hdGVzLgotCSAqLwotCXB1YmxpYyBSZWN0YW5nbGUgZ2V0Q29vcmRpbmF0ZXMoKSB7Ci0JCXJldHVybiBjb29yZGluYXRlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhbHQgdGFnLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWx0VGFnKCkgewotCQlyZXR1cm4gYWx0VGFnOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL0hUTUxNYXAuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9IVE1MTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MGFiYmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL0hUTUxNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogRW5jYXBzdWxhdGVzIHRoZSBIVE1MIE1BUCB0YWcuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSFRNTE1hcCB7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgYXJlYXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkhUTUxNYXA8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBIVE1MTWFwKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgYXJlYSB0byB0aGUgbWFwLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFyZWEoSFRNTEFyZWEgYXJlYSkgewotCQlpZiAoYXJlYSAhPSBudWxsKSB7Ci0JCQlhcmVhcy5hZGQoYXJlYSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIGl0ZXJhdGUgdGhlIGFyZWFzLgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRBcmVhcygpIHsKLQkJcmV0dXJuIGFyZWFzLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gYXJlYXMuc2l6ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL0lBY3Rpdml0eURpYWdyYW1TZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vSUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzYTU5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vSUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotCi1wdWJsaWMgaW50ZXJmYWNlIElBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIHsKLQotCS8qKgotCSAqIHNhdmUgdGhlIGVsZW1lbnQgZGlhZ3JhbSBpbWFnZSBhbmQgcmV0dXJucyB0aGUgaW1hZ2UgZmlsZSB1cmwuCi0JICogCi0JICogQHBhcmFtIHdyYXBlciBPYmplY3QgdGhlIGl0ZW0gcHJvdmlkZXIgd3JhcHBlciBvZiB0aGUgYWN0aXZpdHkgZWxlbWVudAotCSAqIEBwYXJhbSBpbWdQYXRoIFN0cmluZyB0aGUgZ2VuZXJhdGVkIGltYWdlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHB1Ymxpc2hpbmcgZGlyLgotCSAqIEBwYXJhbSBkaWFncmFtVHlwZQotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiAgICAgICAgICAgIElGaWx0ZXIKLQkgKiBAcGFyYW0gc3VwCi0JICogICAgICAgICAgICBTdXBwcmVzc2lvbgotCSAqIEByZXR1cm4gRGlhZ3JhbUluZm8gdGhlIGRpYWdyYW0gaW5mbwotCSAqLwotCXB1YmxpYyBEaWFncmFtSW5mbyBzYXZlRGlhZ3JhbShPYmplY3Qgd3JhcGVyLCBTdHJpbmcgaW1nUGF0aCwgU3RyaW5nIGRpYWdyYW1UeXBlLAotCQkJSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCk7Ci0JCi0JCi0JcHVibGljIEFjdGl2aXR5IGdldFJlYWxpemVkRm9yVW5tb2RpZmllZChPYmplY3Qgd3JhcHBlciwgSUZpbHRlciBmaWx0ZXIsIAotCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vTWV0aG9kRWxlbWVudERpYWdyYW0uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9NZXRob2RFbGVtZW50RGlhZ3JhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzkxZmQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9NZXRob2RFbGVtZW50RGlhZ3JhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtOwotCi1pbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyBhIHB1Ymxpc2hlZCBkaWFncmFtIGZvciBhIDxjb2RlPk1ldGhvZEVsZW1lbnQ8L2NvZGU+LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50RGlhZ3JhbSB7Ci0KLQkvLyBUaGUgTWV0aG9kRWxlbWVudC4KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQotCS8vIFRoZSBnZW5lcmF0ZWQgSlBFRyBmaWxlIG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgaW1hZ2VGaWxlTmFtZTsKLQotCS8vIFRoZSBIVE1MIEFyZWEgTWFwLgotCXByaXZhdGUgSFRNTE1hcCBodG1sTWFwOwotCi0JLy8gVGhlIEhUTUwgdGhhdCByZXByZXNlbnRzIHRoaXMgZGlhZ3JhbS4KLQkvLyBwcml2YXRlIFN0cmluZyBkaWFncmFtSFRNTDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Um9sZURpYWdyYW1JbmZvPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgVGhlIDxjb2RlPkNvbnRlbnRFbGVtZW50PC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudERpYWdyYW0oTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+TWV0aG9kRWxlbWVudDwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwdWJsaXNoZWQKLQkgKiBkaWFncmFtLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIDxjb2RlPk1ldGhvZEVsZW1lbnQ8L2NvZGU+IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHVibGlzaGVkCi0JICogICAgICAgICBkaWFncmFtLgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGZpbGUgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBpbWFnZSBmaWxlIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbWFnZUZpbGVOYW1lKCkgewotCQlyZXR1cm4gaW1hZ2VGaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbWFnZSBmaWxlIG5hbWUuCi0JICogCi0JICogQHBhcmFtIGltYWdlRmlsZU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBpbWFnZSBmaWxlIG5hbWUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2VGaWxlTmFtZShTdHJpbmcgaW1hZ2VGaWxlTmFtZSkgewotCQl0aGlzLmltYWdlRmlsZU5hbWUgPSBpbWFnZUZpbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEhUTUwgQXJlYSBNYXAuCi0JICogCi0JICogQHJldHVybiBUaGUgSFRNTCBBcmVhIE1hcC4KLQkgKi8KLQlwdWJsaWMgSFRNTE1hcCBnZXRIVE1MTWFwKCkgewotCQlyZXR1cm4gaHRtbE1hcDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBIVE1MIEFyZWEgTWFwLgotCSAqIAotCSAqIEBwYXJhbSBodG1sTWFwCi0JICogICAgICAgICAgICBUaGUgSFRNTCBBcmVhIE1hcC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIVE1MTWFwKEhUTUxNYXAgaHRtbE1hcCkgewotCQl0aGlzLmh0bWxNYXAgPSBodG1sTWFwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEhUTUwgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBkaWFncmFtLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIEhUTUwgc291cmNlIHRoYXQgcmVwcmVzZW50cyB0aGUgZGlhZ3JhbS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhUTUwoKSB7Ci0JCVN0cmluZ0J1ZmZlciBodG1sID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlodG1sLmFwcGVuZCgiPHA+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGltYWdlRmlsZU5hbWUgIT0gbnVsbCAmJiBodG1sTWFwICE9IG51bGwpIHsKLQkJCVN0cmluZyBtYXBOYW1lID0gaHRtbE1hcC5nZXROYW1lKCk7Ci0JCQlodG1sLmFwcGVuZCgiPG1hcCBuYW1lPVwiIikuYXBwZW5kKGh0bWxNYXAuZ2V0TmFtZSgpKS5hcHBlbmQoIlwiPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUl0ZXJhdG9yIGFyZWFzID0gaHRtbE1hcC5nZXRBcmVhcygpOwotCQkJd2hpbGUgKGFyZWFzLmhhc05leHQoKSkgewotCQkJCUhUTUxBcmVhIGh0bWxBcmVhID0gKEhUTUxBcmVhKSBhcmVhcy5uZXh0KCk7Ci0JCQkJUmVjdGFuZ2xlIGNvb3JkcyA9IGh0bWxBcmVhLmdldENvb3JkaW5hdGVzKCk7Ci0JCQkJaHRtbAotCQkJCQkJLmFwcGVuZCgiPGFyZWEgaHJlZj1cIiIpLmFwcGVuZChodG1sQXJlYS5nZXRIcmVmKCkpLmFwcGVuZCgiXCIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCS5hcHBlbmQoIiBzaGFwZT1cIiIpLmFwcGVuZChodG1sQXJlYS5nZXRTaGFwZSgpKS5hcHBlbmQoIlwiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkuYXBwZW5kKCIgY29vcmRzPVwiIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLmFwcGVuZCgoaW50KSBjb29yZHMuZ2V0WCgpKQotCQkJCQkJLmFwcGVuZCgiLCAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuYXBwZW5kKChpbnQpIGNvb3Jkcy5nZXRZKCkpCi0JCQkJCQkuYXBwZW5kKCIsICIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoKGludCkgKGNvb3Jkcy5nZXRYKCkgKyBjb29yZHMuZ2V0V2lkdGgoKSkpCi0JCQkJCQkuYXBwZW5kKCIsICIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoKGludCkgKGNvb3Jkcy5nZXRZKCkgKyBjb29yZHMuZ2V0SGVpZ2h0KCkpKQotCQkJCQkJLmFwcGVuZCgiXCIiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuYXBwZW5kKCIgYWx0PVwiIikuYXBwZW5kKGh0bWxBcmVhLmdldEFsdFRhZygpKS5hcHBlbmQoIlwiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkuYXBwZW5kKCIgdGl0bGU9XCIiKS5hcHBlbmQoaHRtbEFyZWEuZ2V0QWx0VGFnKCkpLmFwcGVuZCgiXCIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCS5hcHBlbmQoIi8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWh0bWwuYXBwZW5kKCI8L21hcD4iKTsgLy8kTk9OLU5MUy0xJAotCQkJaHRtbAotCQkJCQkuYXBwZW5kKCI8aW1nIGJvcmRlcj1cIjBcIiBzcmM9XCIiKS5hcHBlbmQoaW1hZ2VGaWxlTmFtZSkuYXBwZW5kKCJcIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkuYXBwZW5kKCIgYWx0PVwiIikuYXBwZW5kKG1hcE5hbWUpLmFwcGVuZCgiXCIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJLmFwcGVuZCgiIHRpdGxlPVwiIikuYXBwZW5kKG1hcE5hbWUpLmFwcGVuZCgiXCIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJLmFwcGVuZCgiIHVzZW1hcD1cIiMiKS5hcHBlbmQobWFwTmFtZSkuYXBwZW5kKCJcIi8+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWh0bWwuYXBwZW5kKCI8L3A+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGh0bWwudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHhtbCBlbGVtZW50IGZvciB0aGUgZGlhZ3JhbQotCSAqIEByZXR1cm4gWG1sRWxlbWVudAotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoKQotCXsKLQkJWG1sRWxlbWVudCB4bWxFbGVtZW50ID0gbnVsbDsKLQotCQlpZiAoaW1hZ2VGaWxlTmFtZSAhPSBudWxsICYmIGh0bWxNYXAgIT0gbnVsbCkgewotCQkJU3RyaW5nIG1hcE5hbWUgPSBodG1sTWFwLmdldE5hbWUoKTsKLQkJCVN0cmluZyBlc2NhcGVkTmFtZSA9IFN0clV0aWwudG9Fc2NhcGVkVW5pY29kZShtYXBOYW1lLCB0cnVlKS5yZXBsYWNlKCJcXHUiLCAiIik7Ci0JCQl4bWxFbGVtZW50ID0gbmV3IFhtbEVsZW1lbnQoIm1hcCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgZXNjYXBlZE5hbWUpICAvLyROT04tTkxTLTEkIAotCQkJCS5zZXRBdHRyaWJ1dGUoInNyYyIsIGltYWdlRmlsZU5hbWUpIC8vJE5PTi1OTFMtMSQgCi0JCQkJLnNldEF0dHJpYnV0ZSgiYWx0IiwgbWFwTmFtZSk7ICAvLyROT04tTkxTLTEkIAotCQkJCi0JCQlJdGVyYXRvciBhcmVhcyA9IGh0bWxNYXAuZ2V0QXJlYXMoKTsKLQkJCXdoaWxlIChhcmVhcy5oYXNOZXh0KCkpIHsKLQkJCQlIVE1MQXJlYSBodG1sQXJlYSA9IChIVE1MQXJlYSkgYXJlYXMubmV4dCgpOwotCQkJCVJlY3RhbmdsZSBjb29yZHMgPSBodG1sQXJlYS5nZXRDb29yZGluYXRlcygpOwotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgoaW50KSBjb29yZHMuZ2V0WCgpKQotCQkJCS5hcHBlbmQoIiwgIikgLy8kTk9OLU5MUy0xJAotCQkJCS5hcHBlbmQoKGludCkgY29vcmRzLmdldFkoKSkKLQkJCQkuYXBwZW5kKCIsICIpIC8vJE5PTi1OTFMtMSQKLQkJCQkuYXBwZW5kKChpbnQpIChjb29yZHMuZ2V0WCgpICsgY29vcmRzLmdldFdpZHRoKCkpKQotCQkJCS5hcHBlbmQoIiwgIikgLy8kTk9OLU5MUy0xJAotCQkJCS5hcHBlbmQoKGludCkgKGNvb3Jkcy5nZXRZKCkgKyBjb29yZHMuZ2V0SGVpZ2h0KCkpKTsKLQkJCQkKLQkJCQkvLyBuZWVkIHRvIGVzY2FwZSB0aGUgdXJsIHNpbmNlIGl0IHdpbGwgYmUgcGFzc2VkIGFzIGEgbGl0ZXJhbCBzdHJpbmcgdG8gYSBqYXZhc2NyaXB0IHZhcmlhYmxlCi0JCQkJeG1sRWxlbWVudC5uZXdDaGlsZCgiYXJlYSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgiZ3VpZCIsIChodG1sQXJlYS5nZXRHdWlkKCkgPT0gbnVsbCkgPyAiIiA6IGh0bWxBcmVhLmdldEd1aWQoKSApICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJLnNldEF0dHJpYnV0ZSgiaHJlZiIsIFN0clV0aWwuZXNjYXBlKGh0bWxBcmVhLmdldEhyZWYoKSkpCS8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgic2hhcGUiLCBodG1sQXJlYS5nZXRTaGFwZSgpKQkvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoImNvb3JkcyIsIGJ1ZmZlci50b1N0cmluZygpKQkvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoImFsdCIsIGh0bWxBcmVhLmdldEFsdFRhZygpKTsJLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4geG1sRWxlbWVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vUm9sZURpYWdyYW1QdWJsaXNoZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9Sb2xlRGlhZ3JhbVB1Ymxpc2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2EzZDFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9Sb2xlRGlhZ3JhbVB1Ymxpc2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtOwotCi1pbXBvcnQgamF2YS5hd3QuQmFzaWNTdHJva2U7Ci1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci1pbXBvcnQgamF2YS5hd3QuRm9udDsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljczJEOwotaW1wb3J0IGphdmEuYXd0LlBvaW50OwotaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKLWltcG9ydCBqYXZhLmF3dC5SZW5kZXJpbmdIaW50czsKLWltcG9ydCBqYXZhLmF3dC5UZXh0dXJlUGFpbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZ2VvbS5MaW5lMkQ7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlSU87Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuSTE4blV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5JbWFnZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHMuUm9sZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmZXJlbmNlcy5MaWJyYXJ5UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLS8qKgotICogUmVuZGVycyB0aGUgUm9sZSBkaWFncmFtIHVzaW5nIEphdmEyRCBhbmQgc2F2ZXMgaXQgYXMgYSBKUEVHIGZpbGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEaWFncmFtUHVibGlzaGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ZPTlRfTkFNRSA9ICJBcmlhbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0ZPTlRfU0laRSA9IDEwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfWF9NQVJHSU4gPSAyMDA7Ci0KLQkvLyBUaGUgbWF4aW11bSB3aWR0aCBvZiB0aGUgZ2VuZXJhdGVkIGltYWdlLgotCXByaXZhdGUgaW50IG1heEltYWdlV2lkdGggPSAxMDI0OwotCi0JLy8gVGhlIG1heGltdW0gaGVpZ2h0IG9mIHRoZSBnZW5lcmF0ZWQgaW1hZ2UuCi0JcHJpdmF0ZSBpbnQgbWF4SW1hZ2VIZWlnaHQgPSAxMDI0OwotCi0JLy8gVGhlIGJvcmRlciB3aWR0aC4KLQlwcml2YXRlIGludCBib3JkZXJXaWR0aCA9IDEwOwotCi0JLy8gVGhlIGJvcmRlciBoZWlnaHQuCi0JcHJpdmF0ZSBpbnQgYm9yZGVySGVpZ2h0ID0gMTA7Ci0KLQkvLyBUaGUgYWRkaXRpb25hbCBzcGFjaW5nIGJlZm9yZSB0aGUgbGVmdC1tb3N0IFRhc2sgYW5kL29yIFdvcmsgUHJvZHVjdAotCS8vIGltYWdlLgotCXByaXZhdGUgaW50IHhNYXJnaW4gPSAyNDA7Ci0KLQkvLyBUaGUgaG9yaXpvbnRhbCBzcGFjaW5nIGJldHdlZW4gdGhlIGVsZW1lbnQgaW1hZ2VzLgotCXByaXZhdGUgaW50IHhTcGFjaW5nOwotCi0JLy8gVGhlIHZlcnRpY2FsIHNwYWNpbmcgYmV0d2VlbiB0aGUgZWxlbWVudCBpbWFnZXMuCi0JcHJpdmF0ZSBpbnQgeVNwYWNpbmc7Ci0KLQkvLyBUaGUgbWF4aW11biBudW1iZXIgb2YgdGV4dCBsaW5lcyBmb3IgdGhlIGVsZW1lbnQgbGFiZWxzLgotCXByaXZhdGUgaW50IG1heFRleHRMaW5lczsKLQotCXByaXZhdGUgaW50IGxpbmVQYWRkaW5nID0gMTI7Ci0KLQlwcml2YXRlIEZvbnQgdGV4dEZvbnQgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5JbWFnZVB1Ymxpc2hlcjwvY29kZT4uCi0JICovCi0JcHVibGljIFJvbGVEaWFncmFtUHVibGlzaGVyKCkgewotCQkvLyBTZWxlY3QgdGhlIGZvbnQgZm9yIHJlbmRlcmluZyB0aGUgZWxlbWVudCBuYW1lcy4KLQkJU3RyaW5nIGZvbnROYW1lOwotCQlpbnQgZm9udFNpemU7Ci0JCWZvbnROYW1lID0gZ2V0Rm9udE5hbWUoKTsKLQkJaWYgKFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscyhQbGF0Zm9ybS5XU19XSU4zMikpIHsKLQkJCWZvbnRTaXplID0gSTE4blV0aWwuZ2V0SW50KAotCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9zaXplX3dpbjMyLAotCQkJCQlERUZBVUxUX0ZPTlRfU0laRSk7Ci0JCX0gZWxzZSB7Ci0JCQlmb250U2l6ZSA9IEkxOG5VdGlsLmdldEludChMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9zaXplLAotCQkJCQlERUZBVUxUX0ZPTlRfU0laRSk7Ci0JCX0KLQkJaWYgKGZvbnROYW1lLnN0YXJ0c1dpdGgoIlsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlmb250TmFtZSA9IERFRkFVTFRfRk9OVF9OQU1FOwotCQl9Ci0JCXRleHRGb250ID0gbmV3IEZvbnQoZm9udE5hbWUsIEZvbnQuUExBSU4sIGZvbnRTaXplKTsKLQotCQl4TWFyZ2luID0gSTE4blV0aWwuZ2V0SW50KExpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1feE1hcmdpbiwKLQkJCQlERUZBVUxUX1hfTUFSR0lOKTsKLQotCQl4U3BhY2luZyA9IExpYnJhcnlQcmVmZXJlbmNlcy5nZXRSb2xlRGlhZ3JhbUhvcml6b250YWxTcGFjaW5nKCk7Ci0JCXlTcGFjaW5nID0gTGlicmFyeVByZWZlcmVuY2VzLmdldFJvbGVEaWFncmFtVmVydGljYWxTcGFjaW5nKCk7Ci0JCW1heFRleHRMaW5lcyA9IExpYnJhcnlQcmVmZXJlbmNlcy5nZXRSb2xlRGlhZ3JhbU1heGltdW1UZXh0TGluZXMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Rm9udE5hbWUoKSB7Ci0JCVN0cmluZyBmb250TmFtZTsKLQkJaWYgKFBsYXRmb3JtLmdldE5MKCkuc3RhcnRzV2l0aCgiamEiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKFBsYXRmb3JtLldTX1dJTjMyKSkgewotCQkJCWZvbnROYW1lID0gTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl9qYTsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9udE5hbWUgPSBMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9uYW1lX2phOwotCQkJfQotCQl9IGVsc2UgaWYgKFBsYXRmb3JtLmdldE5MKCkuc3RhcnRzV2l0aCgia28iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKFBsYXRmb3JtLldTX1dJTjMyKSkgewotCQkJCWZvbnROYW1lID0gTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl9rbzsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9udE5hbWUgPSBMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9uYW1lX2tvOwotCQkJfQotCQl9IGVsc2UgaWYgKFBsYXRmb3JtLmdldE5MKCkuc3RhcnRzV2l0aCgiemhfVFciKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKFBsYXRmb3JtLldTX1dJTjMyKSkgewotCQkJCWZvbnROYW1lID0gTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl96aF9UVzsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9udE5hbWUgPSBMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9uYW1lX3poX1RXOwotCQkJfQotCQl9IGVsc2UgaWYgKFBsYXRmb3JtLmdldE5MKCkuc3RhcnRzV2l0aCgiemgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKFBsYXRmb3JtLldTX1dJTjMyKSkgewotCQkJCWZvbnROYW1lID0gTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl96aDsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9udE5hbWUgPSBMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9uYW1lX3poOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscyhQbGF0Zm9ybS5XU19XSU4zMikpIHsKLQkJCQlmb250TmFtZSA9IExpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1Gb250X25hbWVfd2luMzI7Ci0JCQl9IGVsc2UgewotCQkJCWZvbnROYW1lID0gTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfbmFtZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZm9udE5hbWU7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIFJvbGUgRGlhZ3JhbSBIVE1MIHNvdXJjZSBmb3IgdGhlIGdpdmVuIHJvbGUuCi0JICogCi0JICogQHBhcmFtIHJvbGUKLQkgKiAgICAgICAgICAgIFRoZSBSb2xlIGVsZW1lbnQuCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwdWJsaXNoIHBhdGguCi0JICogQHJldHVybiBBIDxjb2RlPk1ldGhvZEVsZW1lbnREaWFncmFtPC9jb2RlPiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZQotCSAqICAgICAgICAgcHVibGlzaGVkIGRpYWdyYW0uCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnREaWFncmFtIHB1Ymxpc2goUm9sZUxheW91dCByb2xlTGF5b3V0LCBGaWxlIHBhdGgpIHsKLQotCQlSb2xlIHJvbGUgPSAoUm9sZSkgcm9sZUxheW91dC5nZXRFbGVtZW50KCk7Ci0KLQkJaWYgKHJvbGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCU1ldGhvZEVsZW1lbnREaWFncmFtIGVsZW1lbnREaWFncmFtID0gbmV3IE1ldGhvZEVsZW1lbnREaWFncmFtKHJvbGUpOwotCi0JCQlTdHJpbmcgcHVibGlzaERpciA9IHJvbGVMYXlvdXQuZ2V0TGF5b3V0TWdyKCkuZ2V0UHVibGlzaERpcigpOwotCQkJU3RyaW5nIG1hcE5hbWUgPSByb2xlTGF5b3V0LmdldERpc3BsYXlOYW1lKCk7Ci0JCQlpZiAobWFwTmFtZSA9PSBudWxsIHx8IG1hcE5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCW1hcE5hbWUgPSAiVW5rbm93biI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJbWFwTmFtZSA9IG1hcE5hbWUucmVwbGFjZSgnICcsICdfJyk7Ci0JCQl9Ci0JCQlIVE1MTWFwIGh0bWxNYXAgPSBuZXcgSFRNTE1hcChtYXBOYW1lKTsKLQkJCWVsZW1lbnREaWFncmFtLnNldEhUTUxNYXAoaHRtbE1hcCk7Ci0KLQkJCS8vIENyZWF0ZSB0aGUgQVdUIEpQYW5lbCBmb3IgcmVuZGVyaW5nIHRoZSBkaWFncmFtLgotCQkJSlBhbmVsIHBhbmVsID0gbmV3IEpQYW5lbCgpOwotCi0JCQkvLyBDcmVhdGUgdGhlIG91dHB1dCBCdWZmZXJlZEltYWdlLgotCQkJQnVmZmVyZWRJbWFnZSBvdXRwdXRJbWFnZSA9IG5ldyBCdWZmZXJlZEltYWdlKG1heEltYWdlV2lkdGgsCi0JCQkJCW1heEltYWdlSGVpZ2h0LCBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQik7Ci0JCQlHcmFwaGljczJEIGcyZCA9IChHcmFwaGljczJEKSBvdXRwdXRJbWFnZS5nZXRHcmFwaGljcygpOwotCi0JCQkvLyBTd2l0Y2ggb24gYW50aS1hbGlhc2luZy4KLQkJCWcyZC5zZXRSZW5kZXJpbmdIaW50KFJlbmRlcmluZ0hpbnRzLktFWV9URVhUX0FOVElBTElBU0lORywKLQkJCQkJUmVuZGVyaW5nSGludHMuVkFMVUVfVEVYVF9BTlRJQUxJQVNfT04pOwotCQkJZzJkLnNldFJlbmRlcmluZ0hpbnQoUmVuZGVyaW5nSGludHMuS0VZX0FOVElBTElBU0lORywKLQkJCQkJUmVuZGVyaW5nSGludHMuVkFMVUVfQU5USUFMSUFTX09OKTsKLQkJCWcyZC5maWxsUmVjdCgwLCAwLCBtYXhJbWFnZVdpZHRoLCBtYXhJbWFnZUhlaWdodCk7Ci0KLQkJCS8vIFNldCB0aGUgc3Ryb2tlIGZvciBkcmF3aW5nIHRoZSBhc3NvY2lhdGlvbiBsaW5lcy4KLQkJCWcyZC5zZXRTdHJva2UobmV3IEJhc2ljU3Ryb2tlKDEuMjVmKSk7Ci0JCQlnMmQuc2V0Q29sb3IoQ29sb3IuQkxBQ0spOwotCi0JCQlpbnQgeE9mZnNldCA9IHhTcGFjaW5nIC8gMjsKLQotCQkJLy8gUmVuZGVycyB0aGUgVGFza3MgcGVyZm9ybWVkIGJ5IHRoZSBSb2xlLgotCQkJTGlzdCB0YXNrcyA9IHJvbGVMYXlvdXQuZ2V0UGVyZm9ybXMoKTsKLQkJCWludCB0b3RhbFRhc2tzID0gdGFza3MgIT0gbnVsbCA/IHRhc2tzLnNpemUoKSA6IDA7Ci0JCQlQb2ludCB0YXNrU3RhcnRQb2ludCA9IG5ldyBQb2ludChib3JkZXJXaWR0aCArIHhNYXJnaW4sCi0JCQkJCWJvcmRlckhlaWdodCk7Ci0JCQlQb2ludCB0YXNrRW5kUG9pbnQgPSBuZXcgUG9pbnQoYm9yZGVyV2lkdGggKyB4TWFyZ2luLCBib3JkZXJIZWlnaHQpOwotCQkJaW50IHggPSB0YXNrU3RhcnRQb2ludC54OwotCQkJaW50IHkgPSB0YXNrU3RhcnRQb2ludC55OwotCQkJaW50IHRhc2tzRW5kWCA9IDA7Ci0JCQlpZiAodG90YWxUYXNrcyA+IDApIHsKLQkJCQlpbnQgdGFza05vID0gMTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSB0YXNrcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgdGFza05vKyspIHsKLQkJCQkJVGFzayB0YXNrID0gKFRhc2spIGkubmV4dCgpOwotCi0JCQkJCUlFbGVtZW50TGF5b3V0IHRhc2tMYXlvdXQgPSByb2xlTGF5b3V0LmdldExheW91dE1ncigpCi0JCQkJCQkJLmdldExheW91dCh0YXNrLCB0cnVlKTsKLQotCQkJCQlTdHJpbmcgdGFza05hbWUgPSB0YXNrTGF5b3V0LmdldERpc3BsYXlOYW1lKCk7Ci0JCQkJCVN0cmluZyBpbWFnZUZpbGUgPSBwdWJsaXNoRGlyCi0JCQkJCQkJKyB0YXNrTGF5b3V0LmdldERpYWdyYW1pY29uVXJsKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlCdWZmZXJlZEltYWdlIHRhc2tJbWFnZSA9IEltYWdlVXRpbC5nZXRCdWZmZXJlZEltYWdlKAotCQkJCQkJCQlpbWFnZUZpbGUsIHBhbmVsKTsKLQkJCQkJCWludCB0YXNrV2lkdGggPSB0YXNrSW1hZ2UuZ2V0V2lkdGgoKTsKLQkJCQkJCWludCB0YXNrSGVpZ2h0ID0gdGFza0ltYWdlLmdldEhlaWdodCgpOwotCQkJCQkJaWYgKHRhc2tObyA9PSAxKSB7Ci0JCQkJCQkJdGFza0VuZFBvaW50LnggKz0gdGFza1dpZHRoOwotCQkJCQkJCXRhc2tFbmRQb2ludC55ICs9IHRhc2tIZWlnaHQ7Ci0JCQkJCQkJdGFza3NFbmRYID0gdGFza0VuZFBvaW50Lng7Ci0JCQkJCQl9Ci0JCQkJCQlSZWN0YW5nbGUgdGFza0ltYWdlUmVjdCA9IG5ldyBSZWN0YW5nbGUoeCwgeSwKLQkJCQkJCQkJdGFza1dpZHRoLCB0YXNrSGVpZ2h0KTsKLQkJCQkJCVRleHR1cmVQYWludCB0YXNrUGFpbnQgPSBuZXcgVGV4dHVyZVBhaW50KHRhc2tJbWFnZSwKLQkJCQkJCQkJdGFza0ltYWdlUmVjdCk7Ci0JCQkJCQlnMmQuc2V0UGFpbnQodGFza1BhaW50KTsKLQkJCQkJCWcyZC5maWxsKHRhc2tJbWFnZVJlY3QpOwotCQkJCQkJaWYgKHRhc2tOYW1lICE9IG51bGwpIHsKLQkJCQkJCQlJbWFnZVV0aWwuZHJhd1RleHQoZzJkLCB0YXNrTmFtZSwgdGV4dEZvbnQsCi0JCQkJCQkJCQlDb2xvci5CTEFDSywgeCAtIHhPZmZzZXQsIHRhc2tFbmRQb2ludC55LAotCQkJCQkJCQkJdGFza1dpZHRoICsgeFNwYWNpbmcsIG1heFRleHRMaW5lcyk7Ci0JCQkJCQl9Ci0KLQkJCQkJCVN0cmluZyBocmVmID0gdGFza0xheW91dC5nZXRGaWxlUGF0aChyb2xlTGF5b3V0KQotCQkJCQkJCQkrIHRhc2tMYXlvdXQuZ2V0RmlsZU5hbWUoIi5odG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCUhUTUxBcmVhIGh0bWxBcmVhID0gbmV3IEhUTUxBcmVhKHRhc2suZ2V0R3VpZCgpLCBocmVmLAotCQkJCQkJCQkicmVjdCIsIHRhc2tJbWFnZVJlY3QsIHRhc2tOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaHRtbE1hcC5hZGRBcmVhKGh0bWxBcmVhKTsKLQotCQkJCQkJaWYgKHggKyB0YXNrV2lkdGggPiB0YXNrc0VuZFgpIHsKLQkJCQkJCQl0YXNrc0VuZFggPSB4ICsgdGFza1dpZHRoOwotCQkJCQkJfQotCi0JCQkJCQlpZiAoaS5oYXNOZXh0KCkpIHsKLQkJCQkJCQlpbnQgeEluY3JlbWVudCA9IHRhc2tXaWR0aCArIHhTcGFjaW5nOwotCQkJCQkJCXggKz0geEluY3JlbWVudDsKLQkJCQkJCQl0YXNrRW5kUG9pbnQueCArPSB4SW5jcmVtZW50OwotCQkJCQkJCWlmICgoeCArIHhJbmNyZW1lbnQgKyB4T2Zmc2V0ICsgYm9yZGVyV2lkdGgpID4gbWF4SW1hZ2VXaWR0aCkgewotCQkJCQkJCQl4ID0gdGFza1N0YXJ0UG9pbnQueDsKLQkJCQkJCQkJaW50IHlJbmNyZW1lbnQgPSB0YXNrSGVpZ2h0ICsgeVNwYWNpbmc7Ci0JCQkJCQkJCXkgKz0geUluY3JlbWVudDsKLQkJCQkJCQkJdGFza0VuZFBvaW50LnkgKz0geUluY3JlbWVudDsKLQkJCQkJCQkJdGFza0VuZFBvaW50LnggPSB0YXNrU3RhcnRQb2ludC54ICsgdGFza1dpZHRoOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBSZW5kZXJzIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgdGhlIFJvbGUgaXMgcmVzcG9uc2libGUgZm9yLgotCQkJTGlzdCB3b3JrUHJvZHVjdHMgPSByb2xlTGF5b3V0LmdldFJlc3BvbnNpYmxlRm9yKCk7Ci0JCQlpbnQgdG90YWxXb3JrUHJvZHVjdHMgPSB3b3JrUHJvZHVjdHMgIT0gbnVsbCA/IHdvcmtQcm9kdWN0cy5zaXplKCkKLQkJCQkJOiAwOwotCQkJUG9pbnQgd29ya1Byb2R1Y3RTdGFydFBvaW50ID0gbmV3IFBvaW50KHRhc2tTdGFydFBvaW50LngsCi0JCQkJCWJvcmRlckhlaWdodCk7Ci0JCQlQb2ludCB3b3JrUHJvZHVjdEVuZFBvaW50ID0gbmV3IFBvaW50KHRhc2tTdGFydFBvaW50LngsCi0JCQkJCWJvcmRlckhlaWdodCk7Ci0JCQlpZiAodG90YWxUYXNrcyA+IDAgJiYgdG90YWxXb3JrUHJvZHVjdHMgPiAwKSB7Ci0JCQkJd29ya1Byb2R1Y3RTdGFydFBvaW50LnkgPSB0YXNrRW5kUG9pbnQueSArIHlTcGFjaW5nICsgeVNwYWNpbmcKLQkJCQkJCS8gMjsKLQkJCQl3b3JrUHJvZHVjdEVuZFBvaW50LnkgPSB3b3JrUHJvZHVjdFN0YXJ0UG9pbnQueTsKLQkJCX0gZWxzZSBpZiAodG90YWxUYXNrcyA+IDApIHsKLQkJCQl3b3JrUHJvZHVjdEVuZFBvaW50LnkgPSB0YXNrRW5kUG9pbnQueSArIGJvcmRlckhlaWdodDsKLQkJCX0KLQkJCXggPSB3b3JrUHJvZHVjdFN0YXJ0UG9pbnQueDsKLQkJCXkgPSB3b3JrUHJvZHVjdFN0YXJ0UG9pbnQueTsKLQkJCWludCB3b3JrUHJvZHVjdHNFbmRYID0gMDsKLQkJCWlmICh0b3RhbFdvcmtQcm9kdWN0cyA+IDApIHsKLQkJCQlpbnQgd29ya1Byb2R1Y3RObyA9IDE7Ci0JCQkJZm9yIChJdGVyYXRvciBpID0gd29ya1Byb2R1Y3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyB3b3JrUHJvZHVjdE5vKyspIHsKLQkJCQkJV29ya1Byb2R1Y3Qgd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIGkubmV4dCgpOwotCi0JCQkJCUlFbGVtZW50TGF5b3V0IHdwTGF5b3V0ID0gcm9sZUxheW91dC5nZXRMYXlvdXRNZ3IoKQotCQkJCQkJCS5nZXRMYXlvdXQod29ya1Byb2R1Y3QsIHRydWUpOwotCi0JCQkJCVN0cmluZyB3b3JrUHJvZHVjdE5hbWUgPSB3cExheW91dC5nZXREaXNwbGF5TmFtZSgpOwotCQkJCQlTdHJpbmcgaW1hZ2VGaWxlID0gcHVibGlzaERpcgotCQkJCQkJCSsgd3BMYXlvdXQuZ2V0RGlhZ3JhbWljb25VcmwoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUJ1ZmZlcmVkSW1hZ2Ugd29ya1Byb2R1Y3RJbWFnZSA9IEltYWdlVXRpbAotCQkJCQkJCQkuZ2V0QnVmZmVyZWRJbWFnZShpbWFnZUZpbGUsIHBhbmVsKTsKLQkJCQkJCWludCB3b3JrUHJvZHVjdFdpZHRoID0gd29ya1Byb2R1Y3RJbWFnZS5nZXRXaWR0aCgpOwotCQkJCQkJaW50IHdvcmtQcm9kdWN0SGVpZ2h0ID0gd29ya1Byb2R1Y3RJbWFnZS5nZXRIZWlnaHQoKTsKLQkJCQkJCWlmICh3b3JrUHJvZHVjdE5vID09IDEpIHsKLQkJCQkJCQl3b3JrUHJvZHVjdEVuZFBvaW50LnggKz0gd29ya1Byb2R1Y3RXaWR0aDsKLQkJCQkJCQl3b3JrUHJvZHVjdEVuZFBvaW50LnkgKz0gd29ya1Byb2R1Y3RIZWlnaHQ7Ci0JCQkJCQkJd29ya1Byb2R1Y3RzRW5kWCA9IHdvcmtQcm9kdWN0RW5kUG9pbnQueDsKLQkJCQkJCX0KLQkJCQkJCVJlY3RhbmdsZSB3b3JrUHJvZHVjdEltYWdlUmVjdCA9IG5ldyBSZWN0YW5nbGUoeCwgeSwKLQkJCQkJCQkJd29ya1Byb2R1Y3RXaWR0aCwgd29ya1Byb2R1Y3RIZWlnaHQpOwotCQkJCQkJVGV4dHVyZVBhaW50IHdvcmtQcm9kdWN0UGFpbnQgPSBuZXcgVGV4dHVyZVBhaW50KAotCQkJCQkJCQl3b3JrUHJvZHVjdEltYWdlLCB3b3JrUHJvZHVjdEltYWdlUmVjdCk7Ci0JCQkJCQlnMmQuc2V0UGFpbnQod29ya1Byb2R1Y3RQYWludCk7Ci0JCQkJCQlnMmQuZmlsbCh3b3JrUHJvZHVjdEltYWdlUmVjdCk7Ci0JCQkJCQlpZiAod29ya1Byb2R1Y3ROYW1lICE9IG51bGwpIHsKLQkJCQkJCQlJbWFnZVV0aWwuZHJhd1RleHQoZzJkLCB3b3JrUHJvZHVjdE5hbWUsIHRleHRGb250LAotCQkJCQkJCQkJQ29sb3IuQkxBQ0ssIHggLSB4T2Zmc2V0LAotCQkJCQkJCQkJd29ya1Byb2R1Y3RFbmRQb2ludC55LCB3b3JrUHJvZHVjdFdpZHRoCi0JCQkJCQkJCQkJCSsgeFNwYWNpbmcsIG1heFRleHRMaW5lcyk7Ci0JCQkJCQl9Ci0KLQkJCQkJCVN0cmluZyBocmVmID0gd3BMYXlvdXQuZ2V0RmlsZVBhdGgocm9sZUxheW91dCkKLQkJCQkJCQkJKyB3cExheW91dC5nZXRGaWxlTmFtZSgiLmh0bWwiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQlIVE1MQXJlYSBodG1sQXJlYSA9IG5ldyBIVE1MQXJlYSh3b3JrUHJvZHVjdC5nZXRHdWlkKCksCi0JCQkJCQkJCWhyZWYsCi0JCQkJCQkJCSJyZWN0Iiwgd29ya1Byb2R1Y3RJbWFnZVJlY3QsIHdvcmtQcm9kdWN0TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWh0bWxNYXAuYWRkQXJlYShodG1sQXJlYSk7Ci0KLQkJCQkJCWlmICh4ICsgd29ya1Byb2R1Y3RXaWR0aCA+IHdvcmtQcm9kdWN0c0VuZFgpIHsKLQkJCQkJCQl3b3JrUHJvZHVjdHNFbmRYID0geCArIHdvcmtQcm9kdWN0V2lkdGg7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChpLmhhc05leHQoKSkgewotCQkJCQkJCWludCB4SW5jcmVtZW50ID0gd29ya1Byb2R1Y3RXaWR0aCArIHhTcGFjaW5nOwotCQkJCQkJCXggKz0geEluY3JlbWVudDsKLQkJCQkJCQl3b3JrUHJvZHVjdEVuZFBvaW50LnggKz0geEluY3JlbWVudDsKLQkJCQkJCQlpZiAoKHggKyB4SW5jcmVtZW50ICsgeE9mZnNldCArIGJvcmRlcldpZHRoKSA+IG1heEltYWdlV2lkdGgpIHsKLQkJCQkJCQkJeCA9IHdvcmtQcm9kdWN0U3RhcnRQb2ludC54OwotCQkJCQkJCQlpbnQgeUluY3JlbWVudCA9IHdvcmtQcm9kdWN0SGVpZ2h0ICsgeVNwYWNpbmc7Ci0JCQkJCQkJCXkgKz0geUluY3JlbWVudDsKLQkJCQkJCQkJd29ya1Byb2R1Y3RFbmRQb2ludC55ICs9IHlJbmNyZW1lbnQ7Ci0JCQkJCQkJCXdvcmtQcm9kdWN0RW5kUG9pbnQueCA9IHdvcmtQcm9kdWN0U3RhcnRQb2ludC54Ci0JCQkJCQkJCQkJKyB3b3JrUHJvZHVjdFdpZHRoOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBSZW5kZXIgdGhlIFJvbGUuCi0JCQlQb2ludCByb2xlU3RhcnRQb2ludCA9IG5ldyBQb2ludCh4T2Zmc2V0IC0gNSwgYm9yZGVySGVpZ2h0KTsKLQkJCVBvaW50IHJvbGVFbmRQb2ludCA9IHJvbGVTdGFydFBvaW50OwotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgcm9sZU5hbWUgPSByb2xlTGF5b3V0LmdldERpc3BsYXlOYW1lKCk7Ci0JCQkJU3RyaW5nIGltYWdlRmlsZSA9IHB1Ymxpc2hEaXIgKyByb2xlTGF5b3V0LmdldERpYWdyYW1pY29uVXJsKCk7Ci0JCQkJQnVmZmVyZWRJbWFnZSByb2xlSW1hZ2UgPSBJbWFnZVV0aWwuZ2V0QnVmZmVyZWRJbWFnZShpbWFnZUZpbGUsCi0JCQkJCQlwYW5lbCk7Ci0JCQkJaW50IHJvbGVXaWR0aCA9IHJvbGVJbWFnZS5nZXRXaWR0aCgpOwotCQkJCWludCByb2xlSGVpZ2h0ID0gcm9sZUltYWdlLmdldEhlaWdodCgpOwotCQkJCXggPSB4T2Zmc2V0IC0gNTsKLQkJCQl5ID0gYm9yZGVySGVpZ2h0OwotCQkJCXJvbGVFbmRQb2ludC54ICs9IHJvbGVXaWR0aDsKLQkJCQlyb2xlRW5kUG9pbnQueSArPSByb2xlSGVpZ2h0OwotCQkJCWlmICh0b3RhbFdvcmtQcm9kdWN0cyA+IDApIHsKLQkJCQkJeSA9IGJvcmRlckhlaWdodAotCQkJCQkJCSsgKHdvcmtQcm9kdWN0RW5kUG9pbnQueSAtIHRhc2tTdGFydFBvaW50LnkgLSByb2xlSGVpZ2h0KQotCQkJCQkJCS8gMjsKLQotCQkJCQkvLyBSZW5kZXIgdGhlICJyZXNwb25zaWJsZSBmb3IiIGFzc29jaWF0aW9uIGxpbmUuCi0JCQkJCVBvaW50IHN0YXJ0UG9pbnQgPSBuZXcgUG9pbnQoeCArIHJvbGVXaWR0aCArIGxpbmVQYWRkaW5nCi0JCQkJCQkJLyAyLCB5ICsgcm9sZUhlaWdodCAvIDIpOwotCQkJCQlpbnQgbGluZUVuZFBvaW50ID0gd29ya1Byb2R1Y3RTdGFydFBvaW50LnggLSBsaW5lUGFkZGluZzsKLQkJCQkJaWYgKGxpbmVFbmRQb2ludCA+IChERUZBVUxUX1hfTUFSR0lOIC0geFNwYWNpbmcgLyAyKSkgewotCQkJCQkJbGluZUVuZFBvaW50ID0gKERFRkFVTFRfWF9NQVJHSU4gLSB4U3BhY2luZyAvIDIpOwotCQkJCQl9Ci0JCQkJCVBvaW50IGVuZFBvaW50ID0gbmV3IFBvaW50KHdvcmtQcm9kdWN0U3RhcnRQb2ludC54Ci0JCQkJCQkJLSBsaW5lUGFkZGluZywgd29ya1Byb2R1Y3RTdGFydFBvaW50LnkKLQkJCQkJCQkrICh3b3JrUHJvZHVjdEVuZFBvaW50LnkgLSB3b3JrUHJvZHVjdFN0YXJ0UG9pbnQueSkKLQkJCQkJCQkvIDIpOwotCQkJCQlyZW5kZXJBc3NvY2lhdGlvbihnMmQsIHN0YXJ0UG9pbnQsIGVuZFBvaW50LAotCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1SZXNwb25zaWJsZUZvcl90ZXh0LAotCQkJCQkJCXRleHRGb250LCBDb2xvci5CTEFDSyk7Ci0JCQkJfSBlbHNlIGlmICh0b3RhbFRhc2tzID4gMCkgewotCQkJCQl5ID0gYm9yZGVySGVpZ2h0Ci0JCQkJCQkJKyAodGFza0VuZFBvaW50LnkgLSB0YXNrU3RhcnRQb2ludC55IC0gcm9sZUhlaWdodCkKLQkJCQkJCQkvIDI7Ci0JCQkJfQotCQkJCXJvbGVTdGFydFBvaW50LnkgPSB5OwotCQkJCXJvbGVFbmRQb2ludC55ID0geSArIHJvbGVIZWlnaHQ7Ci0KLQkJCQlpZiAodG90YWxUYXNrcyA+IDApIHsKLQkJCQkJLy8gUmVuZGVyIHRoZSAicGVyZm9ybXMiIGFzc29jaWF0aW9uIGxpbmUuCi0JCQkJCVBvaW50IHN0YXJ0UG9pbnQgPSBuZXcgUG9pbnQoeCArIHJvbGVXaWR0aCArIGxpbmVQYWRkaW5nCi0JCQkJCQkJLyAyLCB5ICsgcm9sZUhlaWdodCAvIDIpOwotCQkJCQlpbnQgbGluZUVuZFBvaW50ID0gdGFza1N0YXJ0UG9pbnQueCAtIGxpbmVQYWRkaW5nOwotCQkJCQlpZiAobGluZUVuZFBvaW50ID4gKERFRkFVTFRfWF9NQVJHSU4gLSB4U3BhY2luZyAvIDIpKSB7Ci0JCQkJCQlsaW5lRW5kUG9pbnQgPSAoREVGQVVMVF9YX01BUkdJTiAtIHhTcGFjaW5nIC8gMik7Ci0JCQkJCX0KLQkJCQkJUG9pbnQgZW5kUG9pbnQgPSBuZXcgUG9pbnQobGluZUVuZFBvaW50LCBib3JkZXJIZWlnaHQKLQkJCQkJCQkrICh0YXNrRW5kUG9pbnQueSAtIHRhc2tTdGFydFBvaW50LnkpIC8gMik7Ci0JCQkJCXJlbmRlckFzc29jaWF0aW9uKGcyZCwgc3RhcnRQb2ludCwgZW5kUG9pbnQsCi0JCQkJCQkJTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbVBlcmZvcm1zX3RleHQsCi0JCQkJCQkJdGV4dEZvbnQsIENvbG9yLkJMQUNLKTsKLQkJCQl9Ci0JCQkJUmVjdGFuZ2xlIHJvbGVJbWFnZVJlY3QgPSBuZXcgUmVjdGFuZ2xlKHgsIHksIHJvbGVXaWR0aCwKLQkJCQkJCXJvbGVIZWlnaHQpOwotCQkJCVRleHR1cmVQYWludCByb2xlUGFpbnQgPSBuZXcgVGV4dHVyZVBhaW50KHJvbGVJbWFnZSwKLQkJCQkJCXJvbGVJbWFnZVJlY3QpOwotCQkJCWcyZC5zZXRQYWludChyb2xlUGFpbnQpOwotCQkJCWcyZC5maWxsKHJvbGVJbWFnZVJlY3QpOwotCQkJCWlmIChyb2xlTmFtZSAhPSBudWxsKSB7Ci0JCQkJCUltYWdlVXRpbC5kcmF3VGV4dChnMmQsIHJvbGVOYW1lLCB0ZXh0Rm9udCwgQ29sb3IuQkxBQ0ssIHgKLQkJCQkJCQktIHhPZmZzZXQsIHkgKyByb2xlSGVpZ2h0LCByb2xlV2lkdGggKyB4U3BhY2luZywKLQkJCQkJCQltYXhUZXh0TGluZXMpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0KLQkJCS8vIENhbGN1bGF0ZSB0aGUgb3B0aW1hbCB3aWR0aCBhbmQgaGVpZ2h0IGZvciB0aGUgcmVuZGVyZWQgaW1hZ2UuCi0JCQlpbnQgb3B0aW1hbFdpZHRoID0gTWF0aC5tYXgodGFza3NFbmRYLCB3b3JrUHJvZHVjdHNFbmRYKQotCQkJCQkrIGJvcmRlcldpZHRoOwotCQkJb3B0aW1hbFdpZHRoID0gTWF0aC5tYXgob3B0aW1hbFdpZHRoLCByb2xlRW5kUG9pbnQueCArIGJvcmRlcldpZHRoKTsKLQotCQkJb3B0aW1hbFdpZHRoID0gTWF0aC5taW4ob3B0aW1hbFdpZHRoLCBtYXhJbWFnZVdpZHRoKTsKLQotCQkJaW50IG9wdGltYWxIZWlnaHQgPSB3b3JrUHJvZHVjdEVuZFBvaW50LnkgKyBib3JkZXJIZWlnaHQ7Ci0JCQlvcHRpbWFsSGVpZ2h0ID0gTWF0aC5tYXgob3B0aW1hbEhlaWdodCwgcm9sZUVuZFBvaW50LnkKLQkJCQkJKyBib3JkZXJIZWlnaHQpOwotCQkJb3B0aW1hbFdpZHRoICs9IHhPZmZzZXQ7Ci0JCQlvcHRpbWFsSGVpZ2h0ICs9IChtYXhUZXh0TGluZXMgKiAxMCk7Ci0KLQkJCW9wdGltYWxIZWlnaHQgPSBNYXRoLm1pbihvcHRpbWFsSGVpZ2h0LCBtYXhJbWFnZUhlaWdodCk7Ci0JCQlCdWZmZXJlZEltYWdlIG9wdGltYWxJbWFnZSA9IG91dHB1dEltYWdlLmdldFN1YmltYWdlKDAsIDAsCi0JCQkJCW9wdGltYWxXaWR0aCwgb3B0aW1hbEhlaWdodCk7Ci0KLQkJCS8vIFNhdmUgdGhlIGltYWdlIGFzIGEgSlBFRyBmaWxlLgotCQkJRmlsZSBqcGdGaWxlID0gbmV3IEZpbGUocGF0aCwgcm9sZUxheW91dC5nZXRGaWxlUGF0aCgpCi0JCQkJCSsgcm9sZUxheW91dC5nZXRGaWxlTmFtZSgiLmpwZyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJRmlsZSBwYXJlbnRGb2xkZXIgPSBqcGdGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJCWlmICghcGFyZW50Rm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJcGFyZW50Rm9sZGVyLm1rZGlycygpOwotCQkJfQotCQkJSW1hZ2VJTy53cml0ZShvcHRpbWFsSW1hZ2UsICJqcGciLCBqcGdGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJZWxlbWVudERpYWdyYW0uc2V0SW1hZ2VGaWxlTmFtZShqcGdGaWxlLmdldE5hbWUoKSk7Ci0JCQlyZXR1cm4gZWxlbWVudERpYWdyYW07Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVuZGVycyB0aGUgYXNzb2NpYXRpb24gbGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gZzJkCi0JICogICAgICAgICAgICBUaGUgR3JhcGhpY3MyRCBjb250ZXh0LgotCSAqIEBwYXJhbSBzdGFydFBvaW50Ci0JICogICAgICAgICAgICBUaGUgc3RhcnQgcG9pbnQgb2YgdGhlIGxpbmUuCi0JICogQHBhcmFtIGVuZFBvaW50Ci0JICogICAgICAgICAgICBUaGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lLgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgYXNzb2NpYXRpb24gbmFtZS4KLQkgKiBAcGFyYW0gZm9udAotCSAqICAgICAgICAgICAgVGhlIGZvbnQgZm9yIHJlbmRlcmluZyB0aGUgYXNzb2NpYXRpb24gbmFtZS4KLQkgKiBAcGFyYW0gY29sb3IKLQkgKiAgICAgICAgICAgIHRoZSBjb2xvciBmb3IgcmVuZGVyaW5nIHRoZSBhc3NvY2lhdGlvbiBuYW1lLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbmRlckFzc29jaWF0aW9uKEdyYXBoaWNzMkQgZzJkLCBQb2ludCBzdGFydFBvaW50LAotCQkJUG9pbnQgZW5kUG9pbnQsIFN0cmluZyBuYW1lLCBGb250IGZvbnQsIENvbG9yIGNvbG9yKSB7Ci0JCWcyZC5kcmF3KG5ldyBMaW5lMkQuRG91YmxlKHN0YXJ0UG9pbnQueCwgc3RhcnRQb2ludC55LCBlbmRQb2ludC54LAotCQkJCWVuZFBvaW50LnkpKTsKLQkJaW50IHRleHRYID0gc3RhcnRQb2ludC54ICsgKGVuZFBvaW50LnggLSBzdGFydFBvaW50LngpIC8gMiAtIDQwOwotCQlpbnQgdGV4dFkgPSBzdGFydFBvaW50LnkgKyAoZW5kUG9pbnQueSAtIHN0YXJ0UG9pbnQueSkgLyAyIC0gNTsKLQkJaWYgKHN0YXJ0UG9pbnQueSAhPSBlbmRQb2ludC55KSB7Ci0JCQlnMmQuc2V0Q29sb3IoQ29sb3IuV0hJVEUpOwotCQkJZzJkLmZpbGxSZWN0KHRleHRYLCB0ZXh0WSwgODAsIDEwKTsKLQkJfSBlbHNlIHsKLQkJCXRleHRZIC09IDEwOwotCQl9Ci0JCUltYWdlVXRpbC5kcmF3VGV4dChnMmQsIG5hbWUsIGZvbnQsIGNvbG9yLCB0ZXh0WCwgdGV4dFksIDgwLCAzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWJmMzAzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyByb2xlIGFuZCBhY3Rpdml0eSBkaWFncmFtcyBpbiBhIHB1Ymxpc2hlZCBjb25maWd1cmFpdG9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQWJzdHJhY3RFbGVtZW50TGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0Fic3RyYWN0RWxlbWVudExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDlmZDU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQWJzdHJhY3RFbGVtZW50TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JU2F2ZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGxheW91dCBmb3IgYWxsIE1ldGhvZCBFbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpY25lIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFbGVtZW50TGF5b3V0IGltcGxlbWVudHMgSUVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFRkVSRU5DRSA9ICJyZWZlcmVuY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFRkVSRU5DRUxJU1QgPSAicmVmZXJlbmNlTGlzdCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcm90ZWN0ZWQgRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlcjsKLQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHVybCA9IG51bGw7Ci0KLQkvLyBlbGVtZW50IGVsZW1lbnQgcGF0aCByZWxhdGl2ZSB0byB0aGUgcHVibGlzaGluZyByb290Ci0JcHJvdGVjdGVkIFN0cmluZyBlbGVtZW50UGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyB0aGUgYmFjayB1cCBwYXRoIHRvIHJlYXRoIHRoZSBwdWJsaXNoaW5nIHJvb3QKLQlwcm90ZWN0ZWQgU3RyaW5nIGJhY2tQYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIG1hcCBvZiBsYXlvdXQgZmlsZSB0byB0aGUgb3V0cHV0IGZpbGUgZXh0ZW50aW9uLCBpZiB0aGUgZWxlbWVudCBoYXMgbW9yZQotCS8vIHRoYW4gb25lIGxheW91dCBvdXRwdXQKLQlwcm90ZWN0ZWQgTGlzdCBsYXlvdXRzID0gbnVsbDsKLQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IHRhcmdldEVsZW1lbnQgPSBudWxsOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0VsZW1lbnRMaW5rID0gdHJ1ZTsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWJ1ZyA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQlwdWJsaWMgQWJzdHJhY3RFbGVtZW50TGF5b3V0KCkgewotCX0KLQotCS8qKgotCSAqIGlmIHRoZSBlbGVtZW50J3MgY29udGVudCBpcyB0YXJnZXQgZm9yIGFub3RoZXIgZWxlbWVudCwgc2V0IGl0IGhlcmUuIGZvcgotCSAqIGV4YW1wbGUsIHN0ZXAgY29udGVudCBjYXQgdGFyZ2V0IGZvciBhIFRhc2sgb3IgYSB0YXNrIGRlc2NyaXB0b3IKLQkgKiBjb3B5cmlnaHQgY29udGVudCBjYW4gdGFyZ2V0IHRvIGRpZmZlcmVudCBlbGVtZW50cy4KLQkgKiAKLQkgKiBUaGUgcHVycG9zZSBvZiB0aGlzIGlzIHRoYXQgdGhlIHN5c3RlbSB3aWxsIGZpeCB0aGUgbGlua3MgaW4gdGhlIGNvbnRlbnQKLQkgKiB0byByZWxhdGl2ZSB0byB0aGUgdGFyZ2V0IGVsZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudFRhcmdldChNZXRob2RFbGVtZW50IHRhcmdldEVsZW1lbnQpIHsKLQkJdGhpcy50YXJnZXRFbGVtZW50ID0gdGFyZ2V0RWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBuZWVkIHRvIHNldCB0aGUgb3duZXIgb2YgdGhlIGN1cnJlbnQgbGF5b3V0IGVsZW1lbnQuIEluIG1vc3QgY2FzZXMgdGhpcwotCSAqIHNob3VsZCBiZSB0aGUgZUNvbnRhaW5lciBvZiB0aGUgZWxlbWVudC4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBpbiBzb21lCi0JICogc2l0dWF0aW9uIHRoZSBlbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gb3duZXIgd2hlbiB0aGUgb2JqZWN0IGlzIGNyZWF0ZWQuCi0JICogRm9yIGV4YW1wbGUsIHRoZSBDb250ZW50RGVzY3JpcHRpb24gb2JqZWN0J3MgZUNvbnRpbmVyIGlzIG51bGwgaWYgdGhlCi0JICogY29udGVudCBmaWxlIGlzIG5vdCBzYXZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50T3duZXIoTWV0aG9kRWxlbWVudCBvd25lcikgewotCQl0aGlzLm93bmVyRWxlbWVudCA9IG93bmVyOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2hvd0VsZW1lbnRMaW5rKGJvb2xlYW4gc2hvdykgewotCQl0aGlzLnNob3dFbGVtZW50TGluayA9IHNob3c7Ci0JfQotCQotCS8qKgotCSAqIGluaXRpYWxpemUgdGhlIGxheW91dCB3aXRoIHRoZSBlbGVtZW50IGxheW91dCBtYW5hZ2VyIGFuZCB0aGUgZWxlbWVudC4KLQkgKiBAcGFyYW0gbGF5b3V0TWFuYWdlciBFbGVtZW50TGF5b3V0TWFuYWdlcgotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQpOwotCi0JcHJvdGVjdGVkIHZvaWQgX19pbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5sYXlvdXRNYW5hZ2VyID0gbGF5b3V0TWFuYWdlcjsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJaWYgKCFDb25maWd1cmF0aW9uSGVscGVyLmlzRGVzY3JpcHRpb25FbGVtZW50KGVsZW1lbnQpKSB7Ci0JCQlpZiAoICEoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pICkgewotCQkJCS8vIG1ha2Ugc3VyZSB0aGUgZWxlbWVudCBpcyBsb2FkZWQgd2l0aCB0aGUgY29ycmVjdCBjb250YWluZXIKLQkJCQkvLyBvdGhlcndpc2UgdGhlICBlbGVtZW50IG1heSBub3QgaGF2ZSBhIHZhbGlkIGNvbnRhaW5lcgotCQkJCS8vIGFuZCB0aHVzIHRoZSBlbGVtZW50IGNvbnRlbnQgcGF0aCBjYW4ndCBiZSBkZXRlcm1pbmVkCi0JCQkJLy8gdGhpcyBpcyBqdXN0IGEgd29ya2Fyb3VuZC4gc2hvdWxkIHdlIGhhdmUgYSBiZXR0ZXIgd2F5IHRvIG1ha2Ugc3VyZSB0aGUgZWxlbWVudHMgYXJlIGxvYWRlZCBjb3JyZWN0bHk/Pz8/Pz8/Pz8/PwotCQkJCS8vIDE2MDQ0MSAtIE1pc3NpbmcgdGVtcGxhdGUgZmlsZXMgd2hlbiBwdWJsaXNoIGNvbmZpZ3VyYXRpb24KLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQkJCWlmICggcGx1Z2luID09IG51bGwgfHwgcGx1Z2luLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQotCQkJCQkvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuIGluIHB1Ymxpc2hpbmcgbW9kZSBzaW5jZSB0aGUgd2hvbGUgbGlicmFyeSBpcyBhbHJlYWR5IGxvYWRlZAotCQkJCQlpZiAoIGRlYnVnICYmIGdldExheW91dE1ncigpLmlzUHVibGlzaGluZ01vZGUoKSApIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6IEVsZW1lbnQgd2l0aG91dCBhIHZhbGlkIGNvbnRhaW5lcjogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCQotCQkJCQlMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW5zKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCQkJfSAKLQkJCX0KLQkJCWJ1aWxkUGF0aCgpOwotCQkJdGhpcy51cmwgPSBlbGVtZW50UGF0aCArIGdldEZpbGVOYW1lKFJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTUwpOwotCQl9Ci0JCQotCQkvLyB0aGlzIGlzIGEgd29ya2Fyb3VuZC4gCi0JCS8vIHdlIG5lZWQgdG8gcGFzcyBwYXJhbWV0ZXJzIGluIHRoZSBmaWxlIHVybCwgCi0JCS8vIGhvd2V2ZXIsIGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCB0aGUgcGFyYW1ldGVycyBpcyBub3QgcGFzc2VkIG92ZXIgaW4gYnJvd3NpbmcKLQkJLy8gc28gY3JlYXRlIGEgZHVtbXkgZmlsZQotCQlpZiAoIXRoaXMubGF5b3V0TWFuYWdlci5pc1B1Ymxpc2hpbmdNb2RlKCkgJiYgISgKLQkJCQkJZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbiAKLQkJCQl8fCBlbGVtZW50LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbgotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSApCi0JCXsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGh0bWxfZmlsZSA9IHRoaXMubGF5b3V0TWFuYWdlci5nZXRQdWJsaXNoRGlyKCkgKyB0aGlzLmdldEZpbGVQYXRoKCkgKyBnZXRGaWxlTmFtZShSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MKTsKLQkJCQlGaWxlIGYgPSBuZXcgRmlsZShodG1sX2ZpbGUpOwotCQkJCWlmICggIWYuZXhpc3RzKCkgKQotCQkJCXsKLQkJCQkJZi5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQkJCWYuY3JlYXRlTmV3RmlsZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCQotCQlwcmVsb2FkT3Bwb3NpdGVmZWF0dXJlcygpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByZWxvYWRPcHBvc2l0ZWZlYXR1cmVzKCkgewotCQkvLyBtYWtlIHN1cmUgdGhlIHByb2Nlc3NlcyBhcmUgbG9hZGVkIGJlZm9yZSBjYWxjdWxhdGluZyB0aGUgZmVhdHVyZQotCQkvLyBvdGhlcndpc2UgdGhlIG9wcG9zaXRlIGZlYXR1cmUgbWFwIGlzIG5vdCBwb3B1bGF0ZWQKLQkJLy8gZmluZSBmb3IgcHVibGlzaGluZyBzaW5jZSB0aGUgd2hvbGUgbGlicmFyeSBpcyBsb2FkZWQgYWxyZWFkeQotCQkvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciBicm93c2luZwotCQkvLyBsb2FkIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIHNwZWNpZmljYWxseQotCQlpZiAoIGdldExheW91dE1ncigpLmlzUHVibGlzaGluZ01vZGUoKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy9PcHBvc2l0ZUZlYXR1cmUgb2Y7Ci0JCVJlc291cmNlIHJlcyA9IGVsZW1lbnQuZVJlc291cmNlKCk7Ci0JCWlmICggcmVzID09IG51bGwgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVJlc291cmNlU2V0IHJlc1NldCA9IHJlcy5nZXRSZXNvdXJjZVNldCgpOwotCQlpZiAoICEocmVzU2V0IGluc3RhbmNlb2YgSUxpYnJhcnlSZXNvdXJjZVNldCkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUxpc3Q8T3Bwb3NpdGVGZWF0dXJlPiBvcHBvc2l0ZUZlYXR1cmVzID0gbmV3IEFycmF5TGlzdDxPcHBvc2l0ZUZlYXR1cmU+KCk7Ci0JCWlmICggdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgUm9sZSApIHsKLQkJCW9wcG9zaXRlRmVhdHVyZXMuYWRkKEFzc29jaWF0aW9uSGVscGVyLlJvbGVfUm9sZURlc2NyaXB0b3JzKTsKLQkJfSBlbHNlIGlmICggdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgVGFzayApIHsKLQkJCW9wcG9zaXRlRmVhdHVyZXMuYWRkKEFzc29jaWF0aW9uSGVscGVyLlRhc2tfVGFza0Rlc2NyaXB0b3JzKTsKLQkJfSBlbHNlIGlmICggdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QgKSB7Ci0JCQlvcHBvc2l0ZUZlYXR1cmVzLmFkZChBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9Xb3JrUHJvZHVjdERlc2NyaXB0b3JzKTsKLQkJfSBlbHNlIGlmICggdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgQ2hlY2tsaXN0ICkgewotCQkJb3Bwb3NpdGVGZWF0dXJlcy5hZGQoQXNzb2NpYXRpb25IZWxwZXIuQ2hlY2tsaXN0X0JyZWFrZG93bkVsZW1lbnRzKTsKLQkJfSBlbHNlIGlmICggdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgQ29uY2VwdCB8fCB0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBXaGl0ZXBhcGVyICkgewotCQkJb3Bwb3NpdGVGZWF0dXJlcy5hZGQoQXNzb2NpYXRpb25IZWxwZXIuQ29uY2VwdF9CcmVha2Rvd25FbGVtZW50cyk7Ci0JCX0gZWxzZSBpZiAoIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIENoZWNrbGlzdCApIHsKLQkJCW9wcG9zaXRlRmVhdHVyZXMuYWRkKEFzc29jaWF0aW9uSGVscGVyLkNoZWNrbGlzdF9CcmVha2Rvd25FbGVtZW50cyk7Ci0JCX0gZWxzZSBpZiAoIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIEV4YW1wbGUgKSB7Ci0JCQlvcHBvc2l0ZUZlYXR1cmVzLmFkZChBc3NvY2lhdGlvbkhlbHBlci5FeGFtcGxlX0JyZWFrZG93bkVsZW1lbnRzKTsKLQkJfSBlbHNlIGlmICggdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgR3VpZGVsaW5lICkgewotCQkJb3Bwb3NpdGVGZWF0dXJlcy5hZGQoQXNzb2NpYXRpb25IZWxwZXIuR3VpZGVsaW5lX0JyZWFrZG93bkVsZW1lbnRzKTsKLQkJfSBlbHNlIGlmICggdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCApIHsKLQkJCW9wcG9zaXRlRmVhdHVyZXMuYWRkKEFzc29jaWF0aW9uSGVscGVyLlJldXNhYmxlQXNzZXRfQnJlYWtkb3duRWxlbWVudHMpOwotCQl9IGVsc2UgaWYgKCB0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBSb2FkbWFwICkgewotCQkJb3Bwb3NpdGVGZWF0dXJlcy5hZGQoQXNzb2NpYXRpb25IZWxwZXIuUm9hZG1hcF9BY3Rpdml0ZXMpOwotCQl9IGVsc2UgaWYgKCB0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwgKSB7Ci0JCQlvcHBvc2l0ZUZlYXR1cmVzLmFkZChBc3NvY2lhdGlvbkhlbHBlci5TdXBwb3J0aW5nTWF0ZXJpYWxfQnJlYWtkb3duRWxlbWVudHMpOwotCQl9IAotCQotCQlpZiAoIG9wcG9zaXRlRmVhdHVyZXMuc2l6ZSgpID4gMCApIHsKLQkJCVNldDxTdHJpbmc+IEdVSURzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQkJR1VJRHMuYWRkKGVsZW1lbnQuZ2V0R3VpZCgpKTsKLQkJCSgoSUxpYnJhcnlSZXNvdXJjZVNldClyZXNTZXQpLmxvYWRPcHBvc2l0ZUZlYXR1cmVzKG9wcG9zaXRlRmVhdHVyZXMsIEdVSURzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldExheW91dEluZm8oTGF5b3V0SW5mbyBpbmZvKSB7Ci0JCWlmIChsYXlvdXRzID09IG51bGwpIHsKLQkJCWxheW91dHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJbGF5b3V0cy5hZGQoaW5mbyk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIGEgbGlzdCBvZiBMYXlvdXRJbmZvIG9iamVjdHMKLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBMYXlvdXRJbmZvIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRMYXlvdXRzKCkgewotCQlyZXR1cm4gbGF5b3V0czsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgbGF5b3V0IGJ5IG5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gTGF5b3V0SW5mbwotCSAqLwotCXB1YmxpYyBMYXlvdXRJbmZvIGdldExheW91dEluZm8oU3RyaW5nIG5hbWUpIHsKLQkJaWYgKCBsYXlvdXRzID09IG51bGwgfHwgbGF5b3V0cy5zaXplKCkgPT0gMCApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGF5b3V0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTGF5b3V0SW5mbyBpbmZvID0gKExheW91dEluZm8paXQubmV4dCgpOwotCQkJaWYgKCBpbmZvLm5hbWUuZXF1YWxzKG5hbWUpICkgewotCQkJCXJldHVybiBpbmZvOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0TGF5b3V0TWdyKCkKLQkgKi8KLQlwdWJsaWMgRWxlbWVudExheW91dE1hbmFnZXIgZ2V0TGF5b3V0TWdyKCkgewotCQlyZXR1cm4gdGhpcy5sYXlvdXRNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldEVsZW1lbnQoKQotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXREaXNwbGF5TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJCi0JCS8vIFtCdWcgMTk2Mzk5XSBQLW5hbWUgaXMgbm90IGluaGVyaXRlZCBmcm9tIGl0cyBiYXNlIGVsZW1lbnQgaW4gYW4gZXh0ZW5kaW5nIGVsZW1lbnQKLQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UHJlc2VudGF0aW9uTmFtZShlbGVtZW50LCBnZXRMYXlvdXRNZ3IoKS5nZXRDb25maWd1cmF0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldElkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRHdWlkKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0VXJsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRCYWNrUGF0aCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrUGF0aCgpIHsKLQkJcmV0dXJuIGJhY2tQYXRoOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldEZpbGVQYXRoKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVQYXRoKCkgewotCQlyZXR1cm4gZWxlbWVudFBhdGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZSBwYXRoIHJlbGF0aXZlIHRvIGFub3RoZXIgZWxlbWVudC4gVGhpcyBpcyB0aGUKLQkgKiByZWxhdGl2ZVRvLmJhY2twYXRoICsgdGhpcy5lbGVtZW50cGF0aC4KLQkgKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldEZpbGVQYXRoKElFbGVtZW50TGF5b3V0KQotCSAqLwotCi0JcHVibGljIFN0cmluZyBnZXRGaWxlUGF0aChJRWxlbWVudExheW91dCByZWxhdGl2ZVRvKSB7Ci0JCXJldHVybiByZWxhdGl2ZVRvLmdldEJhY2tQYXRoKCkgKyB0aGlzLmdldEZpbGVQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZSBuYW1lIHdpdGggdGhlIGdpdmVuIGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRGaWxlTmFtZShTdHJpbmcpCi0JICovCi0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKFN0cmluZyBleHQpIHsKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLmdldEZpbGVOYW1lKGVsZW1lbnQsIGV4dCk7Ci0JfQotCi0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhzbFVybCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRYc2xVcmwoKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCXJldHVybiBMYXlvdXRSZXNvdXJjZXMuZ2V0WHNsVXJpKGdldFR5cGUoKS50b0xvd2VyQ2FzZSgpLAotCQkJCQkiY29udGVudGVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJcmV0dXJuIExheW91dFJlc291cmNlcy5nZXRYc2xVcmkoZ2V0VHlwZSgpLnRvTG93ZXJDYXNlKCksIG51bGwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUGF0aCgpIHsKLQkJLy8gdGhpcyBpcyA8cGx1Z2luPi88ZWxlbWVudCB0eXBlPi8KLQkJZWxlbWVudFBhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCQliYWNrUGF0aCA9ICIuLyI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCAhKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSApCi0JCXsKLQkJCVN0cmluZyBwYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoZWxlbWVudCk7Ci0JCQlpZiAoIHBhdGggIT0gbnVsbCApIHsKLQkJCQllbGVtZW50UGF0aCA9IHBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCQkJYmFja1BhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRCYWNrUGF0aChlbGVtZW50KTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGh0bWwgY29udGVudCBnZW5lcmF0ZWQgZnJvbSB0aGlzIHhzbCBmaWxlIG5lZWRzIHRvIGJlIHNjYW5uZWQgb3Igbm90Ci0JICogc2NhbiB0aGUgY29udGVudCBpcyBmb3IgaWRlbnRpZnlpbmcgZWxlbWVudCByZWZlcmVuY2VzIGluIHRoZSBjb250ZW50IGFuZCBjb3B5IG92ZXIgcmVzb3VyY2UgZmlsZXMKLQkgKiBpbiBzb21lIGNhc2VzIHdlIGRvbid0IG5lZWQgdG8gc2NhbiB0aGUgY29udGVudCwgZm9yIGV4YW1wbGUsIHRoZSBhY3Rpdml0eSBicmVha2Rvd24gc3RydWN0dXJlCi0JICogCi0JICogQHBhcmFtIHhzbFVybCB0aGUgeHNsIHRoYXQgaHRtbCBpcyBnZW5lcmF0ZWQgZnJvbSwgbnVsbCBmb3IgdGhlIGRlZmF1bHQgeHNsIGxheW91dAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIG5lZWRDb250ZW50U2NhbihTdHJpbmcgeHNsVXJsKQotCXsKLQkJLy8gYnkgZGVmYXVsdCBhbGwgY29udGVudHMgYXJlIHNjYW5uZWQKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgbGF5b3V0IGZvciBhIGNoaWxkIGVsZW1lbnQgb2YgdGhpcyBlbGVtZW50Ci0JICogQWN0aXZpdHlFbGVtZW50TGF5b3V0IHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgbGF5b3V0IHdpdGggbm9kZSBwYXRoCi0JICogQHBhcmFtIGNoaWxkCi0JICogQHJldHVybiBJRWxlbWVudExheW91dAotCSAqLwotCXByb3RlY3RlZCBJRWxlbWVudExheW91dCBnZXRDaGlsZExheW91dChNZXRob2RFbGVtZW50IGNoaWxkKQotCXsKLQkJcmV0dXJuIGxheW91dE1hbmFnZXIuZ2V0TGF5b3V0KGNoaWxkLCB0cnVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NoaWxkKE9iamVjdCBmZWF0dXJlLCBYbWxFbGVtZW50IHBhcmVudCwgTWV0aG9kRWxlbWVudCBlLAotCQkJYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQlJRWxlbWVudExheW91dCBsID0gZ2V0Q2hpbGRMYXlvdXQoZSk7Ci0JCQlpZiAobCAhPSBudWxsKSB7Ci0JCQkJLy8gZG9uJ3QgaW5jbHVkZSB0aGUgcmVmZXJlbmNlcyBvZiB0aGUgcmVmZXJlY2VkIGVsZW1lbnRzLAotCQkJCS8vIG90aGVyd2lzZSwgbWF5IGNhdXNlIGRlYWRsb2NrCi0JCQkJYm9vbGVhbiBpc0NvbnRlbnQgPSAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpCi0JCQkJCQkmJiBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkJCS5pc0Rlc2NyaXB0aW9uRWxlbWVudCgoTWV0aG9kRWxlbWVudCkgZSk7Ci0JCQkJaWYgKGlzQ29udGVudCkgewotCQkJCQlpZiAodGFyZ2V0RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlsLnNldENvbnRlbnRUYXJnZXQodGFyZ2V0RWxlbWVudCk7Ci0JCQkJCX0KLQkJCQkJbC5zZXRFbGVtZW50T3duZXIoZWxlbWVudCk7Ci0JCQkJfQotCQkJCXBhcmVudC5hZGRDaGlsZChsLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NDaGlsZChPYmplY3QgZmVhdHVyZSwgWG1sRWxlbWVudCBwYXJlbnQsIExpc3QgaXRlbXMsCi0JCQlib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCWlmIChpdGVtcyAhPSBudWxsICYmIGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGUgPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSAoTWV0aG9kRWxlbWVudCkgZTsKLQkJCQkJZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQobWUsCi0JCQkJCQkJbGF5b3V0TWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJCQlJRWxlbWVudExheW91dCBsID0gZ2V0Q2hpbGRMYXlvdXQobWUpOwotCQkJCQkJaWYgKGwgIT0gbnVsbCkgewkJCQkJCQkKLQkJCQkJCQkvLyBkb24ndCBpbmNsdWRlIHRoZSByZWZlcmVuY2VzIG9mIHRoZSByZWZlcmVjZWQKLQkJCQkJCQkvLyBlbGVtZW50cywgb3RoZXJ3aXNlLCBtYXkgY2F1c2UgZGVhZGxvY2sKLQkJCQkJCQlwYXJlbnQuYWRkQ2hpbGQobC5nZXRYbWxFbGVtZW50KENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCQkJCS5pc0Rlc2NyaXB0aW9uRWxlbWVudChtZSkgPyB0cnVlCi0JCQkJCQkJCQk6IGluY2x1ZGVSZWZlcmVuY2VzKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIHRvLW1hbnkgcmVmZXJlbmNlcwotCSAqIEBwYXJhbSBlbGVtZW50WG1sIFhtbEVsZW1lbnQKLQkgKiBAcGFyYW0gaW5jbHVkZVJlZmVyZW5jZXMgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIGNhbGN1bGF0ZTBuUmVmZXJlbmNlcyhYbWxFbGVtZW50IGVsZW1lbnRYbWwsCi0JCQlib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCS8vIHJlZmVyZW5jZU1hcC5jbGVhcigpOwotCQlMaXN0IGZlYXR1cmVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKGVsZW1lbnQpOwotLy8JCUxpc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChmZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQkvLyBnZXQgYWxsIHN0cmluZyB0eXBlIGF0dHJpYnV0ZXMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzCi0JCQkJCQkuZ2V0KGkpOwotCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCWxvYWRGZWF0dXJlKGZlYXR1cmUsIGVsZW1lbnRYbWwsIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KCkgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBuZXcgWG1sRWxlbWVudCgiRWxlbWVudCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJJZCIsIGdldElkKCkpIC8vJE5PTi1OTFMtMSQJCi0JCQkJLnNldEF0dHJpYnV0ZSgiVHlwZSIsIGdldFR5cGUoKSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIlR5cGVOYW1lIiwgVG5nVXRpbC5nZXRUeXBlVGV4dChlbGVtZW50KSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIk5hbWUiLCBnZXROYW1lKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJCYWNrUGF0aCIsIGdldEJhY2tQYXRoKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJTaGFwZWljb25VcmwiLCBnZXRTaGFwZWljb25VcmwoKSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIkRpc3BsYXlOYW1lIiwgZ2V0RGlzcGxheU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoIHNob3dFbGVtZW50TGluayApIHsKLQkJCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJVcmwiLCBnZXRVcmwoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSAKLQkJCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCS8qKgotCSAqIGxvYWQgdGhlIGF0dHJpYnV0ZXMKLQkgKiBAcGFyYW0gZWxlbWVudFhtbCBYbWxFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgbG9hZEF0dHJpYnV0ZXMoWG1sRWxlbWVudCBlbGVtZW50WG1sKSB7Ci0KLQkJYm9vbGVhbiBpc0FjdGl2aXR5QXR0cmlidXRlID0gKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgCi0JCQl8fCAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgCi0JCQkJJiYgKGVsZW1lbnQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgb3duZXJFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpOwotCQkKLQkJTGlzdCBmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhlbGVtZW50KTsKLS8vCQlMaXN0IHByb3BlcnRpZXMgPSBlbGVtZW50LmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJLy8gZ2V0IGFsbCBzdHJpbmcgdHlwZSBhdHRyaWJ1dGVzCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHAgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7CQkJCi0JCQkJaWYgKCEocCBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpICkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSlwOwotCQkJCVN0cmluZyBuYW1lID0gcC5nZXROYW1lKCk7Ci0JCQkJCQkJCQkKLQkJCQlPYmplY3QgdmFsdWU7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKCJwcmVzZW50YXRpb25OYW1lIikpIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCS8vIHZhbHVlID0gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQpOwotCQkJCQl2YWx1ZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UHJlc2VudGF0aW9uTmFtZShlbGVtZW50LAotCQkJCQkJCWxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQl9IGVsc2UgaWYoIGlzQWN0aXZpdHlBdHRyaWJ1dGUgJiYgU3RyaW5nLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYXR0cmliLmdldEVBdHRyaWJ1dGVUeXBlKCkuZ2V0SW5zdGFuY2VDbGFzcygpKSkgewotCQkJCQkKLQkJCQkJLy8gZm9yIGFjdGl2aXR5LCB0aGUgd2F5IHRvIG1lcmdlIGF0dHJpYnV0ZSBmcm9tIGJhc2UgaXMgZGlmZmVyZW50Ci0JCQkJCXZhbHVlID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRBY3Rpdml0eVN0cmluZ0F0dHJpYnV0ZShlbGVtZW50LCBvd25lckVsZW1lbnQsIGF0dHJpYiwgZ2V0TGF5b3V0TWdyKCkuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IGdldEF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShwKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gZXNjYXBlIEJyaWVmIERlc2NyaXB0aW9uIGludG8gSFRNTCBlbnRpdGllcwotCQkJCWlmIChuYW1lLmVxdWFscygiYnJpZWZEZXNjcmlwdGlvbiIpICYmIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJTXVsdGlGaWxlWE1JU2F2ZUltcGwuTXlFc2NhcGUgbXlFc2NhcGUgPSBuZXcgTXVsdGlGaWxlWE1JU2F2ZUltcGwuTXlFc2NhcGUoKTsKLQkJCQkJdmFsdWUgPSBteUVzY2FwZS5jb252ZXJ0KChTdHJpbmcpdmFsdWUpOwotCQkJCQl2YWx1ZSA9IFN0clV0aWwuY29udmVydE5ld2xpbmVzVG9IVE1MKChTdHJpbmcpdmFsdWUpOwotCQkJCX0KLQotCQkJCWVsZW1lbnRYbWwKLQkJCQkJCS5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSkuc2V0VmFsdWUoKHZhbHVlID09IG51bGwpID8gIiIgOiB2YWx1ZS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgYXR0cmlidXRlIGZlYXR1cmUgdmFsdWUgYW5kIG1lcmdlIHRoZSB0ZXh0LCBmaXggdXJsIHJlZmVybmVjZXMsIGV0Yy4KLQkgKiBAcGFyYW0gZmVhdHVyZSBFU3RydWN0dXJhbEZlYXR1cmUKLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlRmVhdHVyZVZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZShlbGVtZW50LAotCQkJCW93bmVyRWxlbWVudCwgZmVhdHVyZSwgbGF5b3V0TWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkpOwotCi0JCS8vIG5vdyBpZiB0aGUgdGFyZ2V0IGlzIHNldCBhbmQgaXMgZGlmZmVyZW50IGZyb20gdGhlIGVsZW1lbnQgb3IgdGhlCi0JCS8vIGVsZW1lbnQncyBvd25lcgotCQkvLyB0aGVuIGZpeCB0aGUgY29udGVudAotCQlpZiAoKHRhcmdldEVsZW1lbnQgIT0gbnVsbCkgJiYgKHZhbHVlICE9IG51bGwpCi0JCQkJJiYgKHZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSkgewotCQkJU3RyaW5nIGNvbnRlbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIKLQkJCQkJLmdldEVsZW1lbnRQYXRoKChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSA/IAotCQkJCQkJCSgob3duZXJFbGVtZW50PT1udWxsKSA/IChNZXRob2RFbGVtZW50KSBlbGVtZW50LmVDb250YWluZXIoKSA6IG93bmVyRWxlbWVudCkgCi0JCQkJCQkJOiBlbGVtZW50KTsKLQotCQkJU3RyaW5nIGJhY2tQYXRoID0gUmVzb3VyY2VIZWxwZXIKLQkJCQkJLmdldEJhY2tQYXRoKCh0YXJnZXRFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSA/IChNZXRob2RFbGVtZW50KSB0YXJnZXRFbGVtZW50Ci0JCQkJCQkJLmVDb250YWluZXIoKQotCQkJCQkJCTogdGFyZ2V0RWxlbWVudCk7Ci0KLQkJCXZhbHVlID0gUmVzb3VyY2VIZWxwZXIuZml4Q29udGVudFVybFBhdGgodmFsdWUudG9TdHJpbmcoKSwKLQkJCQkJY29udGVudFBhdGgsIGJhY2tQYXRoKTsKLQotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIGxvYWQgdGhlIGNvcHlyaWdodCB0ZXh0Ci0JICogQHBhcmFtIGVsZW1lbnRYbWwgWG1sRWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRDb3B5cmlnaHQoWG1sRWxlbWVudCBlbGVtZW50WG1sKSB7Ci0KLQkJLy8gTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjdWxhdGVDb3B5cmlnaHQoZWxlbWVudCwKLQkJLy8gbGF5b3V0TWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCksIGl0ZW1zKTsKLQkJLy8gaWYgKCBpdGVtcy5zaXplKCkgPiAwICkKLQkJLy8gewotCQkvLyBTdXBwb3J0aW5nTWF0ZXJpYWwgY29weXJpZ2h0OwotCQkvLyBTdHJpbmdCdWZmZXIgY29weXJpZ2h0cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJLy8gZm9yICggSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLQkJLy8gewotCQkvLyBjb3B5cmlnaHQgPSAoU3VwcG9ydGluZ01hdGVyaWFsKSBpdC5uZXh0KCk7Ci0JCS8vIFN0cmluZyBzdGF0ZW1lbnQgPSBjb3B5cmlnaHQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCS8vCQkJCQkJCQotCQkvLyAvLyBuZWVkIHRvIGZpeCB0aGUgY29udGVudCBmb3IgcmVsYXRpdmUgbGlua3MuCi0JCS8vIC8vIHNpbmNlIHRoZSBsaW5rIGlzIGEgcmVsYXRpdmUgcGF0aCB0byB0aGUgU3VwcG9ydGluZ01hdGVyaWFsCi0JCS8vIGxvY2F0aW9uLAotCQkvLyAvLyBuZWVkIHRvIGNvbnZlcnQgdG8gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZWxlbWVudAotCQkvLyAvLyBzbyByZS1jYWxjdWF0ZSB0aGUgYmFjayBwYXRoCi0JCS8vIC8vIGp4aSwgMDYvMjgvMDUKLQkJLy8gU3RyaW5nIGNvbnRlbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoY29weXJpZ2h0KTsKLQkJLy8gU3RyaW5nIGJhY2tQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0QmFja1BhdGgoZWxlbWVudCk7Ci0JCS8vIHN0YXRlbWVudCA9IFJlc291cmNlSGVscGVyLmZpeENvbnRlbnRVcmxQYXRoKHN0YXRlbWVudCwgY29udGVudFBhdGgsCi0JCS8vIGJhY2tQYXRoKTsKLQkJLy8gY29weXJpZ2h0cy5hcHBlbmQoc3RhdGVtZW50KTsKLQkJLy8gfQotCQkvLwkJCQotCQkvLyBlbGVtZW50WG1sLm5ld0NoaWxkKCJjb3B5cmlnaHQiKS5zZXRWYWx1ZShjb3B5cmlnaHRzLnRvU3RyaW5nKCkpOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vIH0KLQotCQlTdHJpbmcgY29weXJpZ2h0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb3B5cmlnaHRUZXh0KGVsZW1lbnQsCi0JCQkJbGF5b3V0TWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQlpZiAoY29weXJpZ2h0ICE9IG51bGwgJiYgY29weXJpZ2h0Lmxlbmd0aCgpID4gMCkgewotCQkJZWxlbWVudFhtbC5uZXdDaGlsZCgiY29weXJpZ2h0Iikuc2V0VmFsdWUoY29weXJpZ2h0KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogY2FsY3VsYXRlIHRoZSB0by1vbmUgcmVmZXJlbmNlCi0JICogQHBhcmFtIGVsZW1lbnRYbWwgWG1sRWxlbWVudAotCSAqIEBwYXJhbSBpbmNsdWRlUmVmZXJlbmNlcyBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgY2FsY3VsYXRlMDFSZWZlcmVuY2VzKFhtbEVsZW1lbnQgZWxlbWVudFhtbCwKLQkJCWJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJTGlzdCBmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhlbGVtZW50KTsKLS8vCQlMaXN0IHByb3BlcnRpZXMgPSBlbGVtZW50LmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJLy8gZ2V0IGVsZW1lbnQgcmVmZXJlbmNlcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBwID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCi0JCQkJLy8gT2JqZWN0IHZhbHVlID0gZWxlbWVudC5nZXQoaSk7Ci0KLQkJCQlFQ2xhc3NpZmllciB0eXBlID0gcC5nZXRFVHlwZSgpOwotCQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBFQ2xhc3MpIHx8IHAuaXNNYW55KCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJbG9hZEZlYXR1cmUocCwgZWxlbWVudFhtbCwgaW5jbHVkZVJlZmVyZW5jZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogbG9hZCB0aGUgbm9uLWF0dHJpYnV0ZSBmZWF0dXJlCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gZWxlbWVudFhtbAotCSAqIEBwYXJhbSBpbmNsdWRlUmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBYbWxFbGVtZW50IGVsZW1lbnRYbWwsCi0JCQlib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCWdldEZlYXR1cmVWYWx1ZShmZWF0dXJlLCAgZWxlbWVudFhtbCwgaW5jbHVkZVJlZmVyZW5jZXMpOwotCX0KLQkKLQkvKioKLQkgKiBsb2FkIHRoZSBub24tYXR0cmlidXRlIGZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBlbGVtZW50WG1sCi0JICogQHBhcmFtIGluY2x1ZGVSZWZlcmVuY2VzCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGZWF0dXJlVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFhtbEVsZW1lbnQgZWxlbWVudFhtbCwKLQkJCWJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCi0JCWlmICghKGZlYXR1cmUuZ2V0RVR5cGUoKSBpbnN0YW5jZW9mIEVDbGFzcykpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nIG5hbWUgPSBmZWF0dXJlLmdldE5hbWUoKTsKLQotCQlpZiAoIWZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwKLQkJCQkJZmVhdHVyZSwgbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkvLyBCcm93c2luZyBzdG9wcyB3b3JraW5nIHdoZW4gYSByb2xlIGlzIHNldCB0bwotCQkJLy8gcmVwbGFjZWQgYW5vdGhlciByb2xlCi0JCQkvLyBmb3IgcmVwbGFjZXIsIHRoZSBiYXNlIHdpbGwgYmUgZXZhbHVhdGVkIHRvIHRoZSByZXBsYWNlcgotCQkJLy8gYW5kIGNhdXNpbmcgZGVhZGxvY2sKLQkJCWlmIChlICE9IG51bGwgJiYgZSAhPSBlbGVtZW50KSB7Ci0JCQkJYm9vbGVhbiBzaG93RGV0YWlsID0gKENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCS5pc0Rlc2NyaXB0aW9uRWxlbWVudChlKQotCQkJCS8qCi0JCQkJICogfHwgKHAgPT0KLQkJCQkgKiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpKQotCQkJCSAqLykgPyB0cnVlIDogaW5jbHVkZVJlZmVyZW5jZXM7Ci0JCQkJCi0JCQkJaWYgKCBhY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgZSkgKSB7Ci0JCQkJCWlmICggZWxlbWVudFhtbCAhPSBudWxsICkgewotCQkJCQkJcHJvY2Vzc0NoaWxkKGZlYXR1cmUsIGVsZW1lbnRYbWwKLQkJCQkJCQkJCQkubmV3Q2hpbGQoVEFHX1JFRkVSRU5DRSkuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSksIGUsIHNob3dEZXRhaWwpOyAvLyROT04tTkxTLTEkIAotCQkJCQl9Ci0JCQkJCQotCQkJCQlyZXR1cm4gZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJTGlzdCBwdiA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlpZiAoIGFjY2VwdEZlYXR1cmVWYWx1ZShmZWF0dXJlLCBwdikgKSB7Ci0JCQkJaWYgKCBlbGVtZW50WG1sICE9IG51bGwgKSB7Ci0JCQkJCWFkZFJlZmVyZW5jZXMoZmVhdHVyZSwgZWxlbWVudFhtbCwgbmFtZSwgcHYpOwotCQkJCX0KLQkJCQlyZXR1cm4gcHY7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBsb2FkIHRoZSBub24tYXR0cmlidXRlIGZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBlbGVtZW50WG1sCi0JICogQHBhcmFtIGluY2x1ZGVSZWZlcmVuY2VzCi0JICovCi0JcHVibGljIHZvaWQgbG9hZEZlYXR1cmUoT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsIFhtbEVsZW1lbnQgZWxlbWVudFhtbCwKLQkJCWJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJU3RyaW5nIG5hbWUgPSBmZWF0dXJlLmdldE5hbWUoKTsKLQotCQlpZiAoIWZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKGVsZW1lbnQsCi0JCQkJCWZlYXR1cmUsIGxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJLy8gQnJvd3Npbmcgc3RvcHMgd29ya2luZyB3aGVuIGEgcm9sZSBpcyBzZXQgdG8KLQkJCS8vIHJlcGxhY2VkIGFub3RoZXIgcm9sZQotCQkJLy8gZm9yIHJlcGxhY2VyLCB0aGUgYmFzZSB3aWxsIGJlIGV2YWx1YXRlZCB0byB0aGUgcmVwbGFjZXIKLQkJCS8vIGFuZCBjYXVzaW5nIGRlYWRsb2NrCi0JCQlpZiAoZSAhPSBudWxsICYmIGUgIT0gZWxlbWVudCkgewotCQkJCWJvb2xlYW4gc2hvd0RldGFpbCA9IChDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkuaXNEZXNjcmlwdGlvbkVsZW1lbnQoZSkKLQkJCQkvKgotCQkJCSAqIHx8IChwID09Ci0JCQkJICogVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHRTdGF0ZW1lbnQoKSkKLQkJCQkgKi8pID8gdHJ1ZSA6IGluY2x1ZGVSZWZlcmVuY2VzOwotCi0JCQkJaWYgKCBhY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgZSkgKQotCQkJCXsKLQkJCQkJcHJvY2Vzc0NoaWxkKGZlYXR1cmUsIAotCQkJCQkJCWVsZW1lbnRYbWwKLQkJCQkJCQkJCS5uZXdDaGlsZChUQUdfUkVGRVJFTkNFKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKSwgZSwgc2hvd0RldGFpbCk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCUxpc3QgcHYgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBmZWF0dXJlLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWlmICggYWNjZXB0RmVhdHVyZVZhbHVlKGZlYXR1cmUsIHB2KSAmJiBwdi5zaXplKCkgPiAwKSB7Ci0JCQkJYWRkUmVmZXJlbmNlcyhmZWF0dXJlLCBlbGVtZW50WG1sLCBuYW1lLCBwdik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBsb2FkIHJlZmVyZW5jZXMgZm9yIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIGVsZW1lbnRYbWwgWG1sRWxlbWVudAotCSAqIEBwYXJhbSBpbmNsdWRlUmVmZXJlbmNlcyBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFJlZmVyZW5jZXMoWG1sRWxlbWVudCBlbGVtZW50WG1sLCBib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoZWxlbWVudCk7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzCi0JCQkJCQkuZ2V0KGkpOwotCQkJCWlmIChmZWF0dXJlLmdldEVUeXBlKCkgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKLQkJCQkJbG9hZEZlYXR1cmUoZmVhdHVyZSwgZWxlbWVudFhtbCwgaW5jbHVkZVJlZmVyZW5jZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJQ29sbGVjdGlvbiBvcHBvc2l0ZVByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnQuZ2V0T3Bwb3NpdGVGZWF0dXJlcygpKTsKLQkJZm9yIChJdGVyYXRvciB6PSBvcHBvc2l0ZVByb3BlcnRpZXMuaXRlcmF0b3IoKTsgei5oYXNOZXh0KCk7ICkKLQkJewotCQkJT3Bwb3NpdGVGZWF0dXJlIG9mZWF0dXJlID0gKE9wcG9zaXRlRmVhdHVyZSkgei5uZXh0KCk7Ci0JCQlsb2FkRmVhdHVyZShvZmVhdHVyZSwgZWxlbWVudFhtbCwgaW5jbHVkZVJlZmVyZW5jZXMpOwotCQl9Ci0JCS8vZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoIlNob3dGdWxsTWV0aG9kQ29udGVudCIsIChsYXlvdXRNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCX0KLQotCS8qKgotCSAqIGFkZCB0aGUgcmVmZXJlbmNlIGxheW91dCB0byB0aGUgcmVzdWx0Ci0JICogQHBhcmFtIGZlYXR1cmUgT2JqZWN0Ci0JICogQHBhcmFtIGVsZW1lbnRYbWwgWG1sRWxlbWVudAotCSAqIEBwYXJhbSByZWZlcmVuY2VOYW1lIFN0cmluZwotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZWZlcmVuY2UoT2JqZWN0IGZlYXR1cmUsIFhtbEVsZW1lbnQgZWxlbWVudFhtbCwgU3RyaW5nIHJlZmVyZW5jZU5hbWUsCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJcHJvY2Vzc0NoaWxkKGZlYXR1cmUsIAotCQkJCWVsZW1lbnRYbWwKLQkJCQkJCS5uZXdDaGlsZChUQUdfUkVGRVJFTkNFKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCByZWZlcmVuY2VOYW1lKSwgZWxlbWVudCwgZmFsc2UpOyAvLyROT04tTkxTLTEkIAotCX0KLQotCS8qKgotCSAqIGFkZCByZWZlcmVuY2VzIHRvIHRoZSBsYXlvdXQKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBlbGVtZW50WG1sCi0JICogQHBhcmFtIHJlZmVyZW5jZU5hbWUKLQkgKiBAcGFyYW0gaXRlbXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZWZlcmVuY2VzKE9iamVjdCBmZWF0dXJlLCBYbWxFbGVtZW50IGVsZW1lbnRYbWwsIFN0cmluZyByZWZlcmVuY2VOYW1lLAotCQkJTGlzdCBpdGVtcykgewotCQlwcm9jZXNzQ2hpbGQoZmVhdHVyZSwgCi0JCQkJZWxlbWVudFhtbAotCQkJCQkJLm5ld0NoaWxkKFRBR19SRUZFUkVOQ0VMSVNUKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCByZWZlcmVuY2VOYW1lKSwgaXRlbXMsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IGdldFhtbEVsZW1lbnQoKTsKLQotCQkvLyBsb2FkIHRoZSByZWZlcmVuY2VzCi0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewotCi0JCQkvLyBsb2FkIHRoZSBjb3B5cmlnaHQgaW5mbwotCQkJbG9hZENvcHlyaWdodChlbGVtZW50WG1sKTsKLQotCQkJLy8gbG9hZCB0aGUgYXR0cmlidXRlcwotCQkJbG9hZEF0dHJpYnV0ZXMoZWxlbWVudFhtbCk7Ci0KLQkJCWxvYWRSZWZlcmVuY2VzKGVsZW1lbnRYbWwsIGZhbHNlKTsKLQkJfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCS8qKgotCSAqIHNvbWUgbGF5b3V0IG5lZWQgdG8gaGF2ZSB0aGUgZmVhdHVyZSB2YWx1ZXMgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4gU28KLQkgKiB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgZmVhdHVyZSBpcyBjYWxjdWxhdGVkIGluIHRoaXMgYWJzdHJhY3QKLQkgKiBjbGFzcwotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0RmVhdHVyZVZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0RmVhdHVyZVZhbHVlKE9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLkRlc2NyaWJhYmxlRWxlbWVudF9DdXN0b21DYXRlZ29yaWVzKSB7Ci0JCQlpZiAoIHZhbHVlIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkgKSB7Ci0JCQkJcmV0dXJuIGdldFB1Ymxpc2hDYXRlZ29yeVByb3BlcnR5KChNZXRob2RFbGVtZW50KXZhbHVlKTsKLQkJCX0gZWxzZSBpZiAoIHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCUxpc3QgaXRlbXMgPSAoTGlzdCl2YWx1ZTsKLQkJCQlpbnQgaSA9IDA7Ci0JCQkJd2hpbGUgKCBpIDwgaXRlbXMuc2l6ZSgpICkgewotCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdGVtcy5nZXQoaSk7Ci0JCQkJCWlmICggIWdldFB1Ymxpc2hDYXRlZ29yeVByb3BlcnR5KGUpICkgewotCQkJCQkJaXRlbXMucmVtb3ZlKGkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaSsrOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBnZXRQdWJsaXNoQ2F0ZWdvcnlQcm9wZXJ0eShNZXRob2RFbGVtZW50IGUpIHsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSBUbmdVdGlsLmdldFB1Ymxpc2hDYXRlZ29yeVByb3BlcnR5KGUpOwotCQlpZiAoIHByb3AgPT0gbnVsbCApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJU3RyaW5nIHYgPSBwcm9wLmdldFZhbHVlKCk7Ci0JCWlmICggdiA9PSBudWxsIHx8ICF2LnRvU3RyaW5nKCkuZXF1YWxzKCJ0cnVlIikgKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0U2hhcGVpY29uVXJsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNoYXBlaWNvblVybCgpIHsKLQkJVVJJIHVyaSA9IG51bGw7Ci0JCVN0cmluZyBpbWFnZVVybDsKLQkJCi0JCS8vIFN0cmluZyBpbWFnZUZpbGU7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQl1cmkgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudCkuZ2V0U2hhcGVpY29uKCk7Ci0JCX0KLQotCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBSZXNvdXJjZUhlbHBlci5nZXRSZXNvdXJjZU1ncihlbGVtZW50KTsKLQotCQlpZiAodXJpID09IG51bGwgfHwgcmVzTWdyID09IG51bGwgKSB7Ci0JCQlpbWFnZVVybCA9IGdldERlZmF1bHRTaGFwZWljb25VcmwoKTsKLQkJfSBlbHNlIHsKLQkJCWltYWdlVXJsID0gTmV0VXRpbC5kZWNvZGVkRmlsZVVybCh1cmkudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQkvLyBuZWVkIHRvIGNvcHkgdGhlIGltYWdlIGZpbGUgaWYgaXQncyBub3QgaW4gdGhlIGRlZmF1bHQgZGlyZWN0b3J5Ci0JCWlmICghaW1hZ2VVcmwuc3RhcnRzV2l0aCgiaW1hZ2VzLyIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCi0JCQkvLyBGcm9tIEVQRiAxLjIsIHNoYXBlSWNvbi9ub2RlSWNvbiBzdG9yZXMgdXJpIHJlbGF0aXZlIHRvIHBsdWdpbiBwYXRoLiAKLQkJCS8vIEJlbG93IHNlY3Rpb24gb2YgY29kZSBpcyBuZWNlc3NhcnkgdG8gYXBwZW5kIHBsdWdpbiBuYW1lIHRvIHNoYXBlSWNvbi9ub2RlSWNvbiB1cmkuCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JCQlpZihwbHVnaW4gIT0gbnVsbCl7Ci0JCQkJaWYoIWltYWdlVXJsLnN0YXJ0c1dpdGgocGx1Z2luLmdldE5hbWUoKSkgKXsKLS8vCQkJCQlTdHJpbmcgcGx1Z2luUGF0aCA9IFJlc291cmNlSGVscGVyLmdldFBsdWdpblBhdGgoZWxlbWVudCk7Ci0vLwkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocGx1Z2luUGF0aCArIEZpbGUuc2VwYXJhdG9yKyBpbWFnZVVybCk7Ci0vLwkJCQkJaW1hZ2VVcmwgPSBOZXRVdGlsLmVuY29kZUZpbGVVUkwoRmlsZVV0aWwuZ2V0UmVsYXRpdmVQYXRoKGZpbGUsIAotLy8JCQkJCQkJbmV3IEZpbGUobGliUm9vdCkpKTsKLQkJCQkJaW1hZ2VVcmwgPSBOZXRVdGlsLmVuY29kZUZpbGVVUkwocGx1Z2luLmdldE5hbWUoKSArICIvIiArIGltYWdlVXJsKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKCByZXNNZ3IgIT0gbnVsbCApIHsKLQkJCQkvLyBuZWVkIGRlY29kZWQgVVJMIGZvciBmaWxlIG9wcwotCQkJCVN0cmluZyBkZWNvZGVkSW1hZ2VVcmwgPSBOZXRVdGlsLmRlY29kZWRGaWxlVXJsKGltYWdlVXJsKTsKLQkJCQlGaWxlIHNvdXJjZSA9IG5ldyBGaWxlKHJlc01nci5yZXNvbHZlKGVsZW1lbnQsIGRlY29kZWRJbWFnZVVybCkpOwotCQkJCUZpbGUgZGVzdCA9IG5ldyBGaWxlKGdldExheW91dE1ncigpLmdldFB1Ymxpc2hEaXIoKSwgZGVjb2RlZEltYWdlVXJsKTsKLQkJCQlGaWxlVXRpbC5jb3B5RmlsZShzb3VyY2UsIGRlc3QpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGltYWdlVXJsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldE5vZGVpY29uVXJsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVpY29uVXJsKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTaGFwZWljb25VcmwoKSB7Ci0JCXJldHVybiBMYXlvdXRSZXNvdXJjZXMuZ2V0RGVmYXVsdFNoYXBlaWNvblVybChlbGVtZW50LmdldFR5cGUoKQotCQkJCS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0RGlhZ3JhbWljb25VcmwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlhZ3JhbWljb25VcmwoKSB7Ci0JCXJldHVybiAiaWNvbnMvIiArIGVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKSArICIuZ2lmIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogdGhpcyBpcyBhIHNoYXJlZCBtZXRob2QgdG8gbG9hZCB0aGUgd29yayBvcmRlciBvZiB0aGUgd29yayBicmVha2Rvd24KLQkgKiBlbGVtZW50LiB3aWxsIGJlIHVzZWQgYnkgYWxsIHdvcmsgYnJlYWtkb3duIGVsZW1udCBsYXlvdXQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRYbWwKLQkgKiAgICAgICAgICAgIFhtbEVsZW1lbnQgdGhlIHBhcmVudCB4bWwgZWxlbWVudCB0byBsb2FkIHRoZSB3b3JrIG9yZGVyCi0JICogICAgICAgICAgICBsYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkV29ya09yZGVyKFhtbEVsZW1lbnQgZWxlbWVudFhtbCkgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCk7Ci0KLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIGZlYXR1cmUsCi0JCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCVhtbEVsZW1lbnQgcHJlZGVjZXNzb3JYbWwgPSBlbGVtZW50WG1sCi0JCQkJLm5ld0NoaWxkKFRBR19SRUZFUkVOQ0VMSVNUKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBmZWF0dXJlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCWlmIChpdGVtcyAhPSBudWxsICYmIGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJV29ya09yZGVyIHdvID0gKFdvcmtPcmRlcikgaXQubmV4dCgpOwotCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSAoTWV0aG9kRWxlbWVudCkgQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkJLmNhbGMwMUZlYXR1cmVWYWx1ZSh3bywgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFdvcmtPcmRlcl9QcmVkKCksIGxheW91dE1hbmFnZXIKLQkJCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQlpZiAobWUgIT0gbnVsbCkgewotCQkJCQlJRWxlbWVudExheW91dCBsID0gZ2V0Q2hpbGRMYXlvdXQobWUpOwotCQkJCQlpZiAobCAhPSBudWxsKSB7Ci0JCQkJCQlwcmVkZWNlc3NvclhtbC5hZGRDaGlsZChsLmdldFhtbEVsZW1lbnQoZmFsc2UpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBzaG93IHRoZSBkZXNjcmlwdG9ycyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRGVzY3JpcHRvcnMoWG1sRWxlbWVudCBlbGVtZW50WG1sKSB7Ci0JCQotCQkvLyAxODA1ODMgLSBQdWIgb3B0aW9ucyB0byBhbGxvdyBhZGRpbmcgKHdoZW4gcHVibGlzaGluZykgYWxsIGRlc2NyaXB0b3JzIHVuZGVyIGEgbWV0aG9kIGVsZW1lbnQgaW4gZm9ybSBvZiB0aGVpciBwYXRoCi0JCQotCQlpZiAoICFnZXRMYXlvdXRNZ3IoKS5nZXRWYWxpZGF0b3IoKS5zaG93UmVsYXRlZERlc2NyaXB0b3JzKCkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIHNob3cgdGhlIHJvbGUgZGVzY3JpcHRvcnMgcmVmZXJlbmNpbmcgdGhpcyByb2xlCi0JCU9wcG9zaXRlRmVhdHVyZSBvZiA9IG51bGw7Ci0JCQotCQlpZiAoIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIFJvbGUgKSB7Ci0JCQlvZiA9IEFzc29jaWF0aW9uSGVscGVyLlJvbGVfUm9sZURlc2NyaXB0b3JzOwotCQl9IGVsc2UgaWYgKCB0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrICkgewotCQkJb2YgPSBBc3NvY2lhdGlvbkhlbHBlci5UYXNrX1Rhc2tEZXNjcmlwdG9yczsKLQkJfSBlbHNlIGlmICggdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QgKSB7Ci0JCQlvZiA9IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1dvcmtQcm9kdWN0RGVzY3JpcHRvcnM7Ci0JCX0KLQkJCQotCQlMaXN0IGRlc2NyaXB0b3JzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJdGhpcy5lbGVtZW50LCBvZiwKLQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQotCQkvLyBjcmVhdGUgYSBlbGVtZW50IG5vZGVzIGZvciBjZXNjcmlwdG9yIGxpc3QKLQkJWG1sRWxlbWVudCBkZXNjTGlzdFhtbCA9IGVsZW1lbnRYbWwubmV3Q2hpbGQoVEFHX1JFRkVSRU5DRUxJU1QpLnNldEF0dHJpYnV0ZSgibmFtZSIsICJkZXNjcmlwdG9ycyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMuc2l6ZSgpOyBpKysgKSB7Ci0JCQlEZXNjcmlwdG9yIGRlc2MgPSAoRGVzY3JpcHRvcilkZXNjcmlwdG9ycy5nZXQoaSk7Ci0JCQlJRWxlbWVudExheW91dCBsYXlvdXQgPSBnZXRDaGlsZExheW91dChkZXNjKTsKLQkJCVhtbEVsZW1lbnQgZGVzY1htbCA9IGxheW91dC5nZXRYbWxFbGVtZW50KGZhbHNlKTsKLQkJCWRlc2NMaXN0WG1sLmFkZENoaWxkKGRlc2NYbWwpOwotCQkJCi0JCQlMaXN0IHBhcmVudHMgPSBfX2dldFN1cGVyQWN0aXZpdGllcyhkZXNjKTsKLQkJCWZvciAoaW50IHAgPSAwOyBwIDwgcGFyZW50cy5zaXplKCk7IHArKyApIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpcGFyZW50cy5nZXQocCk7Ci0JCQkJbGF5b3V0ID0gZ2V0Q2hpbGRMYXlvdXQoYWN0KTsKLQkJCQlYbWxFbGVtZW50IGFjdFhtbCA9IGxheW91dC5nZXRYbWxFbGVtZW50KGZhbHNlKTsKLQkJCQlkZXNjWG1sLmFkZENoaWxkKGFjdFhtbCk7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IF9fZ2V0U3VwZXJBY3Rpdml0aWVzKEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCkgewotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJLy8gYnVpbGQgdGhlIHBhcmVudCBub2RlcwotCQlCcmVha2Rvd25FbGVtZW50IHBhcmVudCA9IGVsZW1lbnQuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7IAotCQl3aGlsZSAoIHBhcmVudCAhPSBudWxsICkgewotCQkJCi0JCQkvLyBuZWVkIHRvIHJlYWxpemUgdGhlIGFjdGl2aXR5LCBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBsaW5rIGFuZCBwYXJlbnQgbGlua3MKLQkJCS8vIDIwNDc0NSAtIHdyb25nIHByb2Nlc3MgdXNhZ2UgcGF0aCBmb3IgY29udHJpYnV0aW5nIGFjdGl2aXRpZXMKLQkJCXBhcmVudCA9IChCcmVha2Rvd25FbGVtZW50KUNvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQocGFyZW50LCBsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWlmICggcGFyZW50ID09IG51bGwgKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWl0ZW1zLmFkZCgwLCBwYXJlbnQpOwotCQkJaWYgKExpYnJhcnlVdGlsLmlzUHJvY2VzcyhwYXJlbnQpICkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJcGFyZW50ID0gcGFyZW50LmdldFN1cGVyQWN0aXZpdGllcygpOwotCQl9Ci0KLQkJcmV0dXJuIGl0ZW1zOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0Fic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTAyNWYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKioKLSAqIGFic3RyY3QgY2xhc3MgZm9yIHByb2Nlc3MgZWxlbWVudCBsYXlvdXQgdGhhdCBpcyBwcm9jZXNzIHNwZWNpZmljCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0IGV4dGVuZHMKLQkJQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXByb3RlY3RlZCBQcm9jZXNzIG93bmluZ1Byb2Nlc3MgPSBudWxsOwotCi0JcHJvdGVjdGVkIFN0cmluZyBlbGVtZW50UHJvY2Vzc1BhdGggPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgcmVsUHJvY2Vzc1BhdGggPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmdbXSBwYXRocyA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5TmFtZSA9IG51bGw7Ci0JCi0JLyoqCi0JICogY29uc3RydWN0IGEgbGF5b3V0IGZvciBwcm9jZXNzIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gbGF5b3V0TWFuYWdlcgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIG93bmluZ1Byb2MKLQkgKiBAcGFyYW0gcGF0aAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJUHJvY2VzcyBvd25pbmdQcm9jLCBTdHJpbmcgcGF0aCkgewotCi0JCWluaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0KLQkJdGhpcy5vd25pbmdQcm9jZXNzID0gb3duaW5nUHJvYzsKLQkJdGhpcy5lbGVtZW50UHJvY2Vzc1BhdGggPSBwYXRoOwotCi0JCWlmICh0aGlzLm93bmluZ1Byb2Nlc3MgPT0gbnVsbCkgewotCQkJdGhpcy5vd25pbmdQcm9jZXNzID0gVG5nVXRpbAotCQkJCQkuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgc3VwZXIuZWxlbWVudCk7Ci0JCX0KLQotCQlpZiAoTGlicmFyeVV0aWwuaXNQcm9jZXNzKGVsZW1lbnQpKSB7Ci0JCQlvd25pbmdQcm9jZXNzID0gKFByb2Nlc3MpIGVsZW1lbnQ7Ci0JCQllbGVtZW50UHJvY2Vzc1BhdGggPSBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0Lm1ha2VQYXRoKG51bGwsCi0JCQkJCWVsZW1lbnQpOwotCQkJcmVsUHJvY2Vzc1BhdGggPSBlbGVtZW50UHJvY2Vzc1BhdGg7Ci0JCX0KLQkJCi0JCWlmICggZWxlbWVudFByb2Nlc3NQYXRoID09IG51bGwgJiYgdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkKLQkJewotCQkJZWxlbWVudFByb2Nlc3NQYXRoID0gQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dC5nZXRQYXRoKChCcmVha2Rvd25FbGVtZW50KXRoaXMuZWxlbWVudCk7Ci0JCX0KLQkJCi0JCS8vIGdldCB0aGUgcGF0aCBhcnJheQotCQlwYXRocyA9IGdldFBhdGhBcnJheShlbGVtZW50UHJvY2Vzc1BhdGgpOwotCQkKLQl9Ci0KLQotCS8qKgotCSAqIHRoZSBwcm9jZXNzIHBhdGggb2YgdGhpcyBpdGVtIHJlbGF0aXZlIHRvIHRoZSBjYWxsaW5nIGl0ZW0KLQkgKiBAcGFyYW0gcGF0aAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbGF0aXZlUHJvY2Vzc1BhdGgoU3RyaW5nIHBhdGgpCi0JewotCQl0aGlzLnJlbFByb2Nlc3NQYXRoID0gcGF0aDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSByZWxhdGl2ZSBwcm9jZXNzIHBhdGgKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQcm9jZXNzUGF0aCgpCi0JewotCQlyZXR1cm4gdGhpcy5yZWxQcm9jZXNzUGF0aDsKLQl9Ci0JCi0vLwlwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLS8vCQlTdHJpbmcgdXJsID0gc3VwZXIuZ2V0VXJsKCk7Ci0vLwotLy8JCXJldHVybiB1cmwgKyBnZXRRdWVyeVN0cmluZygpOwotLy8JfQotCi0JLyoqCi0JICogZ2V0IHF1ZXJ5IHN0cmluZyBmb3IgdGhlIHByb2Nlc3MgZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWVyeVN0cmluZygpIHsKLS8vCQlpZiAob3duaW5nUHJvY2VzcyA9PSBlbGVtZW50KSB7Ci0vLwkJCXJldHVybiAiIjsKLS8vCQl9Ci0JCS8vIHJldHVybiAiPyIgKyBSZXNvdXJjZUhlbHBlci5VUkxfUEFSQU1FVEVSX1BST0NFU1MgKyAiPSIgKwotCQkvLyBvd25pbmdQcm9jZXNzLmdldEd1aWQoKSArICImIiArIFJlc291cmNlSGVscGVyLlVSTF9QQVJBTUVURVJfUEFUSCArCi0JCS8vICI9IiArIGVsZW1lbnRQcm9jZXNzUGF0aDsKLQotCQlyZXR1cm4gRWxlbWVudExheW91dE1hbmFnZXIuZ2V0UXVlcnlTdHJpbmcob3duaW5nUHJvY2Vzcy5nZXRHdWlkKCksCi0JCQkJZWxlbWVudFByb2Nlc3NQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXREaXNwbGF5TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJaWYgKCB0aGlzLmRpc3BsYXlOYW1lID09IG51bGwgKSB7Ci0JCQlQcm9jZXNzIHByb2MgPSBnZXRPd25pbmdQcm9jZXNzKCk7Ci0JCQkKLQkJCS8vIG5lZWQgdG8gaGFuZGxlIHRoZSBzdXByZXNzZWQgYnJlYWtkb3duIGVsZW1lbnRzCi0JCQkvLyB1c2UgdGhlIFN1cHJlc3MgdXRpbGl0eQotCQkJU3VwcHJlc3Npb24gc3VwID0gZ2V0U3VwcHJlc3Npb24ocHJvYyk7Ci0JCi0JCQkvLyBkaXNwbGF5IG5hbWUgbmVlZHMgdG8gYmUgZml4ZWQsIGV4dGVuZGVkIGFjdGl2aXR5IG1heSBuZWVkIHRvIGdldCBkaXNwbGF5IG5hbWUgZnJvbSB0aGUgYmFzZQotCQkJLy8gRFZUOiAgUE5zIG9mIGV4dGVuZGVkIHByb2Nlc3NlcyBubyBwaWNrZWQgdXAgZm9yIHB1Ymxpc2ggKFRDVCA2MzgpCi0JCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbGF5b3V0TWFuYWdlci5nZXRDQlNBZGFwdGVyRmFjdG9yeSgpOwotCQkJT2JqZWN0IHdyYXBwZXIgPSBzdXAuZ2V0T2JqZWN0QnlQYXRoKHRoaXMucGF0aHMsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCWlmICggd3JhcHBlciA9PSBudWxsICkgewotCQkJCXdyYXBwZXIgPSBzdXBlci5lbGVtZW50OwotCQkJfQotCQotCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdCgKLQkJCQkJd3JhcHBlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkKLQkJCXRoaXMuZGlzcGxheU5hbWUgPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUoZWxlbWVudCwKLQkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSwgYWRhcHRlcik7Ci0JCX0KLQkJCi0JCXJldHVybiBkaXNwbGF5TmFtZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN1cHByZXNzaW9uIGdldFN1cHByZXNzaW9uKFByb2Nlc3MgcHJvYykKLQl7Ci0JCXJldHVybiBsYXlvdXRNYW5hZ2VyLmdldFN1cHByZXNzaW9uKHByb2MpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KCkgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KCk7Ci0JCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJxdWVyeVN0cmluZyIsIGdldFF1ZXJ5U3RyaW5nKCkpIC8vJE5PTi1OTFMtMSQKLQkJCS8vLnNldEF0dHJpYnV0ZSgib3duaW5nUHJvY2Vzc0d1aWQiLCBvd25pbmdQcm9jZXNzLmdldEd1aWQoKSkgLy8gLy8kTk9OLU5MUy0xJAotCQkJLy8uc2V0QXR0cmlidXRlKCJlbGVtZW50UHJvY2Vzc1BhdGgiLCBlbGVtZW50UHJvY2Vzc1BhdGgpIC8vJE5PTi1OTFMtMSQKLQkJCS5zZXRBdHRyaWJ1dGUoInJlbFByb2Nlc3NQYXRoIiwgcmVsUHJvY2Vzc1BhdGgpOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9jZXNzIGdldE93bmluZ1Byb2Nlc3MoKSB7Ci0JCXJldHVybiBvd25pbmdQcm9jZXNzOwotCX0KLQotCXByb3RlY3RlZCBJRWxlbWVudExheW91dCBnZXRMYXlvdXQoUHJvY2Vzc0VsZW1lbnRJdGVtIGl0ZW0pIHsKLQkJSUVsZW1lbnRMYXlvdXQgbGF5b3V0ID0gbGF5b3V0TWFuYWdlci5jcmVhdGVMYXlvdXQoaXRlbS5lbGVtZW50LCBvd25pbmdQcm9jZXNzLCBpdGVtLnBhdGgpOwotCQkKLQkJaWYgKCBsYXlvdXQgaW5zdGFuY2VvZiBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0ICkKLQkJewkJCi0JCQkvLyBzZXQgdGhlIHJlbGF0aXZlIHBhdGggdG8gdGhpcyBsYXlvdXQgc2luY2UgdGhpcyBpcyB0aGUgY2FsbGVyCi0JCQlTdHJpbmcgcmVsUGF0aCA9IEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQuZ2V0UmVsYXRpdmVQYXRoKGl0ZW0ucGF0aCwgdGhpcy5lbGVtZW50UHJvY2Vzc1BhdGgpOwotCQkJKChBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0KWxheW91dCkuc2V0UmVsYXRpdmVQcm9jZXNzUGF0aChyZWxQYXRoKTsKLQkJfQotCQlyZXR1cm4gbGF5b3V0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3VwZXJBY3Rpdml0eVBhdGgoKSB7Ci0JCWlmICggZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQgKSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoKEJyZWFrZG93bkVsZW1lbnQpZWxlbWVudCkuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQlTdHJpbmcgaWQgPSBhY3QuZ2V0R3VpZCgpOwotCQkJaW50IGkgPSBlbGVtZW50UHJvY2Vzc1BhdGguaW5kZXhPZihpZCk7Ci0JCQlpZiAoIGkgPj0wICkgewotCQkJCXJldHVybiBlbGVtZW50UHJvY2Vzc1BhdGguc3Vic3RyaW5nKDAsIGkgKyBpZC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBzdGF0aWMgdXRpbGl0eSBtZXRob2RzIGZvciBtYWtlIGEgcGF0aCBmb3IgdGhlIHByb2Nlc3MgZWxlbm1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlUGF0aChTdHJpbmcgcGFyZW50UGF0aCwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChwYXJlbnRQYXRoID09IG51bGwgfHwgcGFyZW50UGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRHdWlkKCk7Ci0JCX0KLQotCQlyZXR1cm4gcGFyZW50UGF0aCArICIsIiArIGVsZW1lbnQuZ2V0R3VpZCgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogc3RhdGljIG1ldGhvZCB0byBnZXQgdGhlIHBhdGggb2YgYSBicmVhayBkb3duIGVsZW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGF0aChCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCi0JCVN0cmluZyBwYXRoID0gZWxlbWVudC5nZXRHdWlkKCk7Ci0JCUJyZWFrZG93bkVsZW1lbnQgYWN0ID0gZWxlbWVudDsKLQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGVsZW1lbnQpOwotCi0JCS8vIENoZWNrIHN1cGVyYWN0aXZpdHkgaXMgcHJvY2VzcyBhbmQgc2hvdWxkIG93bmluZyBwcm9jZXNzICh0aGlzIGlzIHVzZWZ1bCBpbiBkZWVwY29weQotCQl3aGlsZSAoIGFjdCAhPSBwcm9jICkKLQkJewotCQkJQWN0aXZpdHkgc3VwZXJBY3RzID0gYWN0LmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJaWYgKCBzdXBlckFjdHMgIT0gbnVsbCApCi0JCQl7Ci0JCQkJYWN0ID0gc3VwZXJBY3RzOwotCQkJCXBhdGggPSBhY3QuZ2V0R3VpZCgpICsgIiwiICsgcGF0aDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcGF0aDsJCQotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHBhdGggZm9yIGEgZ2l2ZW4gYnJlYWtkb3duIGVsZW1lbnQgaXRlbSBwcm92aWRlcgotCSAqIEBwYXJhbSB3cmFwcGVyIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXRoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpCi0JewotCQlPYmplY3QgZSA9IExpYnJhcnlVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJaWYgKCAhKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCU9iamVjdCB0b3BJdGVtID0gd3JhcHBlci5nZXRUb3BJdGVtKCk7Ci0JCVN0cmluZ0J1ZmZlciBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlwYXRoLmFwcGVuZCgoKE1ldGhvZEVsZW1lbnQpZSkuZ2V0R3VpZCgpKTsKLQkJCi0JCU9iamVjdCBwYXJlbnQgPSB3cmFwcGVyOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50ICE9IHRvcEl0ZW0pIHsKLQkJCWlmICggcGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCApIHsKLQkJCQlwYXJlbnQgPSAoKEJyZWFrZG93bkVsZW1lbnQpcGFyZW50KS5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCQllID0gcGFyZW50OwotCQkJfSBlbHNlIGlmICggcGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgKXsKLQkJCQlwYXJlbnQgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXBhcmVudCkuZ2V0UGFyZW50KHBhcmVudCk7Ci0JCQkJZSA9IExpYnJhcnlVdGlsLnVud3JhcChwYXJlbnQpOwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJaWYgKCBlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXBhdGguaW5zZXJ0KDAsICgoTWV0aG9kRWxlbWVudCllKS5nZXRHdWlkKCkgKyAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBwYXRoLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIHV0aWxpdHkgbWV0aG9kIHRvIGdldCB0aGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgcGFyZW50Ci0JICogQHBhcmFtIHBhdGggU3RyaW5nCi0JICogQHBhcmFtIHBhcmVudFBhdGggU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoU3RyaW5nIHBhdGgsIFN0cmluZyBwYXJlbnRQYXRoKSB7Ci0JCQotCQlpZiAoIHBhdGggPT0gbnVsbCApCi0JCXsKLQkJCXJldHVybiBwYXRoOwotCQl9Ci0JCQotCQlpZiAoIHBhdGguc3RhcnRzV2l0aChwYXJlbnRQYXRoKSApCi0JCXsKLQkJCXJldHVybiBwYXRoLnN1YnN0cmluZyhwYXJlbnRQYXRoLmxlbmd0aCgpKTsKLQkJfQotCQkKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBwYXRoIGFycnJheQotCSAqIEBwYXJhbSBwYXRoIFN0cmluZwotCSAqIEByZXR1cm4gU3RyaW5nW10KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFBhdGhBcnJheShTdHJpbmcgcGF0aCkKLQl7Ci0JCWlmICggcGF0aCA9PSBudWxsICkKLQkJewotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXXt9OwkJCQotCQl9Ci0JCQotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhdGgsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKCBzdC5oYXNNb3JlVG9rZW5zKCkgKQotCQl7Ci0JCQlTdHJpbmcgcyA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCWlmICggcy5sZW5ndGgoKSA+IDAgKQotCQkJewotCQkJCWl0ZW1zLmFkZChzKTsKLQkJCX0KLQkJfQotCQkKLQkJU3RyaW5nW10gYXJyID0gbmV3IFN0cmluZ1tpdGVtcy5zaXplKCldOwotCQlpdGVtcy50b0FycmF5KGFycik7Ci0JCQotCQlyZXR1cm4gYXJyOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIG93bmluZyBwcm9jZXNzIGZyb20gcGF0aCwgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHBhdGggaXMgdGhlIGd1aWQgb2YgdGhlIHByb2Nlc3MKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T3duaW5nUHJvY2Vzc0d1aWRGcm9tUGF0aChTdHJpbmcgcGF0aCkKLQl7Ci0JCWlmICggcGF0aCA9PSBudWxsICkKLQkJewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWludCBpbmRleCA9IHBhdGguaW5kZXhPZigiLCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBndWlkOwotCQlpZiAoIGluZGV4IDwgMCApCi0JCXsKLQkJCWd1aWQgPSBwYXRoOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJZ3VpZCA9IHBhdGguc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJfQotCQkKLQkJcmV0dXJuIGd1aWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBwYXJlbnQgcGF0aAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXJlbnRQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCWlmICggcGF0aCA9PSBudWxsICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWludCBpbmRleCA9IHBhdGgubGFzdEluZGV4T2YoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIGluZGV4ID4gMCApIHsKLQkJCXJldHVybiBwYXRoLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQWN0aXZpdHlMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQWN0aXZpdHlMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdjNWJiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0FjdGl2aXR5TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjA2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5UaW1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByZWRlY2Vzc29yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxheW91dEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0uRGlhZ3JhbUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0uSUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcy5CU0NvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcy5QcmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIFJvbGUuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5TGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dCB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCX05BTUVfQUNUSVZJVFlfREVTQyA9ICJEZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJfTkFNRV9BQ1RJVklUWV9XQlMgPSAiV0JTIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQl9OQU1FX0FDVElWSVRZX1RCUyA9ICJUQlMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCX05BTUVfQUNUSVZJVFlfV1BCUyA9ICJXUEJTIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJBQ0VfUkVQTEFDRU1FTlQgPSAiX0JSXyI7CSAvLyROT04tTkxTLTEkCi0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOQlJBQ0VfU1RSSU5HID0gIlxceyI7CSAvLyROT04tTkxTLTEkCi0JCi0Jb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbyB1c2VyRGlhZ3JhbUluZm8gPSBudWxsOwotCWJvb2xlYW4gZGVidWcgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQotCXByaXZhdGUgVEJTSXRlbURldGFpbCBpdGVtRGV0YWlsID0gbmV3IFRCU0l0ZW1EZXRhaWwoKTsKLQkKLQlwdWJsaWMgQWN0aXZpdHlMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogaW5pdGlhbGl6ZSB0aGUgbGF5b3V0Ci0JICovCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJCi0JCS8vIG1ha2Ugc3VyZSB0aGUgcHJvY2VzcyBpcyBsb2FkZWQKLQkJLy8gb3RoZXJ3aXNlIHRoZSBwcm9jZXNzIG9yIHByb2Nlc3MgZWxlbWVudHMgbWF5IG5vdCBoYXZlIGEgdmFsaWQgY29udGFpbmVyCi0JCS8vIGFuZCB0aHVzIHRoZSBlbGVtZW50IGNvbnRlbnQgcGF0aCBjYW4ndCBiZSBkZXRlcm1pbmVkCi0JCS8vIHRoaXMgaXMganVzdCBhIHdvcmthcm91bmQuIHNob3VsZCB3ZSBoYXZlIGEgYmV0dGVyIHdheSB0byBtYWtlIHN1cmUgdGhlIGVsZW1lbnRzIGFyZSBsb2FkZWQgY29ycmVjdGx5Pz8/Pz8/Pz8/Pz8KLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkJaWYgKCBwbHVnaW4gPT0gbnVsbCB8fCBwbHVnaW4uZUNvbnRhaW5lcigpID09IG51bGwgKSB7Ci0JCQkvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuIGluIHB1Ymxpc2hpbmcgbW9kZSBzaW5jZSB0aGUgd2hvbGUgbGlicmFyeSBpcyBhbHJlYWR5IGxvYWRlZAotCQkJaWYgKCBkZWJ1ZyAmJiBnZXRMYXlvdXRNZ3IoKS5pc1B1Ymxpc2hpbmdNb2RlKCkgKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogRWxlbWVudCB3aXRob3V0IGEgdmFsaWQgY29udGFpbmVyOiAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCUxpYnJhcnlVdGlsLmxvYWRBbGxQcm9jZXNzZXMoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJfQotCQkKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCi0JCXVzZXJEaWFncmFtSW5mbyA9IG5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvKChBY3Rpdml0eSllbGVtZW50KTsKLQkJCi0JCi0JCS8vIHNldHVwIHRoZSBtdWx0aSBsYXlvdXQgb3V0cHV0Ci0JCS8vIFN0cmluZyBmaWxlX2Rlc2MgPSBzdXBlci5nZXRGaWxlTmFtZShSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MKTsJCQotCQkKLQkJU3RyaW5nIGZpbGU7Ci0JCQotLy8JCWlmIChzdXBlci5lbGVtZW50LmdldEd1aWQoKS5zdGFydHNXaXRoKCJ7IikpCi0vLwkJewotLy8JCQlTdHJpbmcgbmV3R3VpZCA9IHN1cGVyLmVsZW1lbnQuZ2V0R3VpZCgpLnJlcGxhY2VGaXJzdCggT1BFTkJSQUNFX1NUUklORywgQlJBQ0VfUkVQTEFDRU1FTlQgKTsKLS8vCQkJZmlsZSA9IHN1cGVyLmVsZW1lbnQuZ2V0TmFtZSgpICsgbmV3R3VpZC5zdWJzdHJpbmcoMCwgbmV3R3VpZC5sZW5ndGgoKS0xKTsKLS8vCQl9Ci0vLwkJZWxzZQotCQkJLy9maWxlID0gU3RyVXRpbC5yZW1vdmVTcGVjaWFsQ2hhcmFjdGVycyhzdXBlci5lbGVtZW50LmdldE5hbWUoKSkgKyBzdXBlci5lbGVtZW50LmdldEd1aWQoKTsKLQkJCi0JCWZpbGUgPSBnZXRGaWxlTmFtZShSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCApIHsKLQkJCS8vIHJlcGxhY2UgJyBhbmQgIiB3aXRoIHNwYWNlCi0JCQlmaWxlID0gZmlsZS5yZXBsYWNlKCdcJycsICcgJykucmVwbGFjZSgnXCInLCAnICcpOwotCQkJCi0JCQlzZXRMYXlvdXRJbmZvKG5ldyBMYXlvdXRJbmZvKAotCQkJCVRBQl9OQU1FX0FDVElWSVRZX0RFU0MsICJhY3Rpdml0eV9kZXNjLnhzbCIsIGZpbGUgKyBUQUJVUkxfU1VGRklYX0RFU0MsIHRydWUpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCXNldExheW91dEluZm8obmV3IExheW91dEluZm8oCi0JCQkJVEFCX05BTUVfQUNUSVZJVFlfV1BCUywgImFjdGl2aXR5X3dwYnMueHNsIiwgZmlsZSArIFRBQlVSTF9TVUZGSVhfV1BCUywgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCXNldExheW91dEluZm8obmV3IExheW91dEluZm8oCi0JCQkJVEFCX05BTUVfQUNUSVZJVFlfVEJTLCAiYWN0aXZpdHlfdGJzLnhzbCIsIGZpbGUgKyBUQUJVUkxfU1VGRklYX1RCUywgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCXNldExheW91dEluZm8obmV3IExheW91dEluZm8oCi0JCQkJVEFCX05BTUVfQUNUSVZJVFlfV0JTLCAiYWN0aXZpdHlfd2JzLnhzbCIsIGZpbGUgKyBUQUJVUkxfU1VGRklYX1dCUywgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJCAKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgaW4gQWN0aXZpdHlMYXlvdXQuaW5pdDogbm8gZmlsZSBmb3IgZWxlbWVudCAiICsgc3VwZXIuZWxlbWVudC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WHNsVXJsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFhzbFVybCgpIHsKLQkJLy8gc2V0IHRoZSBkZWZhdWx0IHRhYiB1cmwsIHRoZSBkZWZhdWx0IHRhYiB3aWxsIGJlIHNldCBpbiBwdWJsaXNoaW5nLgotCQkvLyBmb3IgYnJvd3NpbmcsIHVzZSB0aGUgVEFCX05BTUVfQUNUSVZJVFlfV0JTIHRhYgotCQlTdHJpbmcgdGFiTmFtZSA9IGdldExheW91dE1ncigpLmdldFZhbGlkYXRvcigpLmdldERlZmF1bHRBY3Rpdml0eVRhYigpOwotCQlpZiAoIHRhYk5hbWUgPT0gbnVsbCApIHsKLQkJCXRhYk5hbWUgPSBUQUJfTkFNRV9BQ1RJVklUWV9XQlM7Ci0JCX0KLQkJTGF5b3V0SW5mbyBpbmZvID0gZ2V0TGF5b3V0SW5mbyh0YWJOYW1lKTsKLQkJaWYgKCBpbmZvID09IG51bGwgKSB7Ci0JCQlpbmZvID0gZ2V0TGF5b3V0SW5mbyhUQUJfTkFNRV9BQ1RJVklUWV9XQlMpOwotCQl9CQotCQkKLQkJcmV0dXJuIGluZm8ubGF5b3V0X3hzbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQlVSTF9TVUZGSVhfREVTQyA9ICJfZGVzYyIgKyBSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQlVSTF9TVUZGSVhfV1BCUyA9ICJfd3BicyIgKyBSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQlVSTF9TVUZGSVhfVEJTID0gIl90YnMiICsgUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTDsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJVUkxfU1VGRklYX1dCUyA9ICJfd2JzIiArIFJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTUw7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBY3Rpdml0eVRhYlVybChTdHJpbmcgdXJsKSB7Ci0JCQotCQlpZiAoIHVybCA9PSBudWxsIHx8IHVybC5sZW5ndGgoKSA9PSAwICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gKHVybC5lbmRzV2l0aChUQUJVUkxfU1VGRklYX0RFU0MpIAotCQkJCXx8IHVybC5lbmRzV2l0aChUQUJVUkxfU1VGRklYX1dQQlMpIAotCQkJCXx8IHVybC5lbmRzV2l0aChUQUJVUkxfU1VGRklYX1RCUykgCi0JCQkJfHwgdXJsLmVuZHNXaXRoKFRBQlVSTF9TVUZGSVhfV0JTKSApOwotCQkKLQl9Ci0JLyoqCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY29sbGVjdCB0aGUgU3VwcG9ydGluZ01hdGVyaWFscyB0aGF0IGFyZSBmb3IgdXNlciBkZWZpbmVkIGRpYWdyYW1zCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0RmVhdHVyZVZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJCi0JCWlmICggdmFsdWUgaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwgKSB7CQkJCi0JCQlyZXR1cm4gIXVzZXJEaWFncmFtSW5mby5pc0RpYWdyYW0oIChTdXBwb3J0aW5nTWF0ZXJpYWwpdmFsdWUgKTsKLQkJfQotCQllbHNlIGlmICggdmFsdWUgaW5zdGFuY2VvZiBMaXN0ICkKLQkJewotCQkJTGlzdCBpdGVtcyA9IChMaXN0KXZhbHVlOwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKCBpIDwgaXRlbXMuc2l6ZSgpICkKLQkJCXsKLQkJCQlPYmplY3QgbyA9IGl0ZW1zLmdldChpKTsKLQkJCQlpZiAoIChvIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSAmJiB1c2VyRGlhZ3JhbUluZm8uaXNEaWFncmFtKChTdXBwb3J0aW5nTWF0ZXJpYWwpbykgKSB7CQkJCi0JCQkJCWl0ZW1zLnJlbW92ZShpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCi0JCVN0cmluZyBtc2c7Ci0JCVRpbWVyIHQgPSBudWxsOwotCQlpZiAoIGRlYnVnICkgewotCQkJdCA9IG5ldyBUaW1lcigpOwkKLQkJCW1zZyA9ICJHZW5lcmF0aW5nIGxheW91dCB4bWwgZm9yICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSAgLy8kTk9OLU5MUy0xJCAKLQkJCQkrICIsIGluY2x1ZGVSZWZlcmVuY2VzID0gIiArIGluY2x1ZGVSZWZlcmVuY2VzOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJfQotCQkKLQotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KCk7Ci0JCQotCQkvLyBsb2FkIHRoZSBhdHRyaWJ1dGVzCi0JCWxvYWRBdHRyaWJ1dGVzKGVsZW1lbnRYbWwpOwotCQkKLS8vCQkvLyBzZXQgdGhlIGRlZmF1bHQgdGFiIHVybCwgdGhlIGRlZmF1bHQgdGFiIHdpbGwgYmUgc2V0IGluIHB1Ymxpc2hpbmcuCi0vLwkJLy8gZm9yIGJyb3dzaW5nLCB1c2UgdGhlIFRBQl9OQU1FX0FDVElWSVRZX1dCUyB0YWIKLS8vCQlTdHJpbmcgdGFiTmFtZSA9IGdldExheW91dE1ncigpLmdldFZhbGlkYXRvcigpLmdldERlZmF1bHRBY3Rpdml0eVRhYigpOwotLy8JCWlmICggdGFiTmFtZSA9PSBudWxsICkgewotLy8JCQl0YWJOYW1lID0gVEFCX05BTUVfQUNUSVZJVFlfV0JTOwotLy8JCX0KLS8vCQlMYXlvdXRJbmZvIGxpbmZvID0gZ2V0TGF5b3V0SW5mbyh0YWJOYW1lKTsKLS8vCQlpZiAoIGxpbmZvID09IG51bGwgKSB7Ci0vLwkJCWxpbmZvID0gZ2V0TGF5b3V0SW5mbyhUQUJfTkFNRV9BQ1RJVklUWV9XQlMpOwotLy8JCX0JCi0vLwkJCi0vLwkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoImRlZmF1bHRUYWJVcmwiLCBsaW5mby5maWxlTmFtZSk7Ci0vLwkJCi0JCVByb2Nlc3MgcHJvYyA9IGdldE93bmluZ1Byb2Nlc3MoKTsKLQkJCi0JCS8vIG5lZWQgdG8gaGFuZGxlIHRoZSBzdXByZXNzZWQgYnJlYWtkb3duIGVsZW1lbnRzCi0JCS8vIHVzZSB0aGUgU3VwcmVzcyB1dGlsaXR5Ci0JCVN1cHByZXNzaW9uIHN1cCA9IGdldFN1cHByZXNzaW9uKHByb2MpOwotCi0vLwkJLy8gZGlzcGxheSBuYW1lIG5lZWRzIHRvIGJlIGZpeGVkLCBleHRlbmRlZCBhY3Rpdml0eSBtYXkgbmVlZCB0byBnZXQgZGlzcGxheSBuYW1lIGZyb20gdGhlIGJhc2UKLS8vCQkvLyBEVlQ6ICBQTnMgb2YgZXh0ZW5kZWQgcHJvY2Vzc2VzIG5vIHBpY2tlZCB1cCBmb3IgcHVibGlzaCAoVENUIDYzOCkKLS8vCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbGF5b3V0TWFuYWdlci5nZXRDQlNBZGFwdGVyRmFjdG9yeSgpOwotLy8JCU9iamVjdCB3cmFwcGVyID0gc3VwLmdldE9iamVjdEJ5UGF0aChzdXBlci5wYXRocywgYWRhcHRlckZhY3RvcnkpOwotLy8JCWlmICggd3JhcHBlciA9PSBudWxsICkgewotLy8JCQl3cmFwcGVyID0gc3VwZXIuZWxlbWVudDsKLS8vCQl9Ci0vLwotLy8JCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0vLwkJCQl3cmFwcGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotLy8KLS8vCQlTdHJpbmcgZGlzcGxheU5hbWUgPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUoZWxlbWVudCwKLS8vCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUsIGFkYXB0ZXIpOwotLy8KLS8vCQllbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgiRGlzcGxheU5hbWUiLCBkaXNwbGF5TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWlmICghaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCXJldHVybiBlbGVtZW50WG1sOwotCQl9Ci0JCQotCQllbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgiU2hvd0Z1bGxNZXRob2RDb250ZW50IiwgKGxheW91dE1hbmFnZXIuZ2V0VmFsaWRhdG9yKCkuc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkpID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJLy8gZ2V0IHRoZSB0YWJzIHhtbCBzZWN0aW9uCi0JCVhtbEVsZW1lbnQgdGFic1htbCA9IGVsZW1lbnRYbWwubmV3Q2hpbGQoInRhYnMiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGF5b3V0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlMYXlvdXRJbmZvIGluZm8gPSAoTGF5b3V0SW5mbykgaXQubmV4dCgpOwotCQkJdGFic1htbC5uZXdDaGlsZCgidGFiIikgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgaW5mby5uYW1lKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoInVybCIsIHN1cGVyLmVsZW1lbnRQYXRoICsgaW5mby5maWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIGRvIGl0IG9ubHkgd2hlbiBpdCdzIGEgcHJvY2VzcyBvciBpdCdzIG5vdCBpbiBwdWJsaXNoaW5nIG1vZGVsCi0JCS8vIHNpbmNlIGluIHB1Ymxpc2hpbmcsIHRoZSBpdGVyYXRpb24gYWx3YXlzIHN0YXJ0IGZyb20gcHJvY2VzcwotCQkvLyBmb3IgYnJvd3NpbmcsIGl0IGNhbiBzdGFydCBpbiB0aGUgbWlkZGxlIAotCQlpZiAoICFnZXRMYXlvdXRNZ3IoKS5pc1B1Ymxpc2hpbmdNb2RlKCkgfHwgc3VwZXIuZWxlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyApIHsKLQkJCWdldExheW91dE1ncigpLnByZXBhcmVBZGFwdG9yRmFjdG9yaWVzRm9yUHJvY2Vzcyhwcm9jKTsKLQkJfQotCi0JCS8vIGxvYWQgdGhlIGNvcHlyaWdodCBpbmZvCi0JCWxvYWRDb3B5cmlnaHQoZWxlbWVudFhtbCk7Ci0KLQkJLy8gY2FsY3VsYXRlIG90aGVyIHNlbGVjdGVkIHJlZmVyZWNuZXMKLQkJTGlzdCBmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhlbGVtZW50KTsKLS8vCQlMaXN0IHByb3BlcnRpZXMgPSBlbGVtZW50LmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJLy8gZ2V0IGVsZW1lbnQgcmVmZXJlbmNlcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMKLQkJCQkJCS5nZXQoaSk7Ci0KLQkJCQkvLyBza2lwIHRoZSBicmVha2Rvd24gZWxlbWVudHMgc2luY2Ugd2Ugd2lsbCBidWlsZCB0aGUgYnJlYWtkb3duCi0JCQkJLy8gc3RydWN0dXJlIGxhdGVyCi0JCQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCS8vIE9iamVjdCB2YWx1ZSA9IGVsZW1lbnQuZ2V0KGkpOwotCQkJCUVDbGFzc2lmaWVyIHR5cGUgPSBmZWF0dXJlLmdldEVUeXBlKCk7Ci0JCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIEVDbGFzcykpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJbG9hZEZlYXR1cmUoZmVhdHVyZSwgZWxlbWVudFhtbCwgZmFsc2UpOwotCQkJfQotCQl9Ci0JCQotCQlDb2xsZWN0aW9uIG9wcG9zaXRlUHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3QoZWxlbWVudC5nZXRPcHBvc2l0ZUZlYXR1cmVzKCkpOwotCQlmb3IgKEl0ZXJhdG9yIHo9IG9wcG9zaXRlUHJvcGVydGllcy5pdGVyYXRvcigpOyB6Lmhhc05leHQoKTsgKQotCQl7Ci0JCQlPcHBvc2l0ZUZlYXR1cmUgb2ZlYXR1cmUgPSAoT3Bwb3NpdGVGZWF0dXJlKSB6Lm5leHQoKTsKLQkJCWxvYWRGZWF0dXJlKG9mZWF0dXJlLCBlbGVtZW50WG1sLCBpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCX0KLQkJCi0JCWlmICggZGVidWcgKSB7Ci0JCQl0LnN0b3AoKTsKLQkJCW1zZyA9IHQuZ2V0VGltZSgpICsgIiBtaW5pIHNlY29uZHMgYnVpbGRpbmcgQWN0aXZpdHkgRGVzY3Jpb3Rpb24geG1sIGZvciAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkgIDsgLy8kTk9OLU5MUy0xJCAJCQkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJCi0JCQl0LnN0YXJ0KCk7Ci0JCX0KLQotCQlidWlsZFdCUyhlbGVtZW50WG1sLCBzdXApOwotCQlpZiAoIGRlYnVnICkgewotCQkJdC5zdG9wKCk7Ci0JCQltc2cgPSB0LmdldFRpbWUoKSArICIgbWluaSBzZWNvbmRzIGJ1aWxkaW5nIFdCUyBmb3IgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICA7IC8vJE5PTi1OTFMtMSQgCQkJCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJCQotCQkJdC5zdGFydCgpOwotCQl9Ci0JCQotCQlidWlsZFRCUyhlbGVtZW50WG1sLCBzdXApOwkKLQkJCi0JCWlmICggZGVidWcgKSB7Ci0JCQl0LnN0b3AoKTsKLQkJCW1zZyA9IHQuZ2V0VGltZSgpICsgIiBtaW5pIHNlY29uZHMgYnVpbGRpbmcgVEJTIGZvciAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkgIDsgLy8kTk9OLU5MUy0xJCAJCQkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQotCQkJdC5zdGFydCgpOwotCQl9Ci0JCQotCQlidWlsZFdQQlMoZWxlbWVudFhtbCwgc3VwKTsKLQkJCi0JCWlmICggZGVidWcgKSB7Ci0JCQl0LnN0b3AoKTsKLQkJCW1zZyA9IHQuZ2V0VGltZSgpICsgIiBtaW5pIHNlY29uZHMgYnVpbGRpbmcgV1BCUyBmb3IgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICA7IC8vJE5PTi1OTFMtMSQgCQkJCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJCQotCQkJbXNnID0gdC5nZXRUb3RhbFRpbWUoKSArICIgbWluaSBzZWNvbmRzIGJ1aWxkaW5nIGxheW91dCB4bWwgZm9yICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSAgOyAvLyROT04tTkxTLTEkIAkJCQotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCX0KLQkJCi0JCQotLy8JCS8vIGZvciB0ZXN0IG9ubHkKLS8vCQlQcm9jZXNzTGF5b3V0RGF0YSBkYXRhID0gbmV3IFByb2Nlc3NMYXlvdXREYXRhKGdldE93bmluZ1Byb2Nlc3MoKS5nZXRHdWlkKCkpOwotLy8JCWxvYWRMYXlvdXREYXRhKGRhdGEsIHRydWUsIHRydWUsIHRydWUpOwotCQkKLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VXNlckRpYWdyYW1UZXh0KFN1cHBvcnRpbmdNYXRlcmlhbCB1c2VyRGlhZ3JhbSkKLQl7Ci0JCS8vIHVzZXIgZGVmaW5lZCBkaWFncmFtCi0JCUFic3RyYWN0RWxlbWVudExheW91dCBsID0gbmV3IEdlbmVyYWxMYXlvdXQoKTsKLQkJbC5pbml0KGdldExheW91dE1ncigpLCB1c2VyRGlhZ3JhbS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWwuc2V0Q29udGVudFRhcmdldChlbGVtZW50KTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCk7Ci0JCXJldHVybiAoU3RyaW5nKWwuZ2V0QXR0cmlidXRlRmVhdHVyZVZhbHVlKGZlYXR1cmUpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRDb2x1bW5zKFhtbEVsZW1lbnQgcGFyZW50WG1sLCBMaXN0IGNvbHMpIHsKLQkJWG1sRWxlbWVudCBjb2xzWG1sID0gcGFyZW50WG1sLm5ld0NoaWxkKCJjb2x1bW5zIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChJdGVyYXRvciBpdCA9IGNvbHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCUJTQ29sdW1uIGNvbCA9IChCU0NvbHVtbilpdC5uZXh0KCk7Ci0JCQljb2xzWG1sLm5ld0NoaWxkKCJjb2x1bW4iKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiaWQiLCBjb2wuaWQpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJsYWJlbCIsIGNvbC5sYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRXQlMoWG1sRWxlbWVudCBlbGVtZW50WG1sLCBTdXBwcmVzc2lvbiBzdXApCi0JewotCQkvLyBidWlsZCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSB0cmVlCi0JCVhtbEVsZW1lbnQgYnMgPSBlbGVtZW50WG1sCi0JCQkJLm5ld0NoaWxkKCJicmVha2Rvd24iKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiV29yayBCcmVha2Rvd24gU3RydWN0dXJlIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkuc2V0QXR0cmlidXRlKCJEaXNwbGF5TmFtZSIsIGdldERpc3BsYXlOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gc2V0IHRoZSBjb2x1bW5zCi0JCXNldENvbHVtbnMoYnMsIFByZWZlcmVuY2VVdGlsLmdldFdCU0NvbHVtbnMoKSk7Ci0JCQotCQkvLyBwdWJsaXNoIHRoZSBjb25zb2xpZGF0ZWQgdmlldwotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbGF5b3V0TWFuYWdlcgotCQkJCS5nZXRDQlNBZGFwdGVyRmFjdG9yeSgpOwotCQlDb21wb3NpdGVSb2xlcyBjcnMgPSBudWxsOyAvL25ldyBDb21wb3NpdGVSb2xlcyhhZGFwdGVyRmFjdG9yeSwgKEFjdGl2aXR5KSBzdXBlci5lbGVtZW50KTsKLQkJLy8gaWYgKCBzdXBlci5lbGVtZW50IGluc3RhbmNlb2YgUHJvY2VzcyApCi0JCXsKLQkJCVByb2Nlc3NVdGlsLnVwZGF0ZUlEcyhhZGFwdGVyRmFjdG9yeSwgc3VwLmdldFByb2Nlc3MoKSk7Ci0JCX0KLQotCQlBY3Rpdml0eUxheW91dFNldHRpbmcgc2V0dGluZyA9IG5ldyBBY3Rpdml0eUxheW91dFNldHRpbmcoCi0JCQkJYWRhcHRlckZhY3RvcnksIGNycywgc3VwKTsKLQotCQkvLyBlc2NhcGUgdGhlIHF1b3RlcyBpbiB0aGUgc3RyaW5nIHNpY25lIHdlIHNldCB0aGUgc3RyaW5nIGludG8gamF2YXNjcmlwdCB2YXJpYWJsZXMgaW4gdGhlIGxheW91dAotCQlzZXR0aW5nLmVzY2FwZVN0cmluZyA9IHRydWU7Ci0JCQotCQkvLyBzZXQgdG8gb25seSBzaG93IHRhc2sgZGVzY3JpcHRvcnMgZm9yIHN1Yi1hY3Rpdml0aWVzCi0JCXNldHRpbmcuc2hvd1Rhc2tPbmx5ID0gdHJ1ZTsKLQkJCi0JCS8vIG5lZWQgdG8gZ2V0IHRoZSByYXcgaXRlbSBwcm92aWRlciBmcm9tIHRoZSBhZGFwdGVyIGZhY3RvcnkKLQkJT2JqZWN0IHdyYXBwZXIgPSBzdXAuZ2V0T2JqZWN0QnlQYXRoKHN1cGVyLnBhdGhzLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmICggd3JhcHBlciA9PSBudWxsICkgewotCQkJd3JhcHBlciA9IHN1cGVyLmVsZW1lbnQ7Ci0JCX0gCi0JCQotCQlpZiAoIHN1cC5pc1N1cHByZXNzZWQod3JhcHBlcikgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVByb2Nlc3NFbGVtZW50SXRlbSBlbGVtZW50SXRlbSA9IG5ldyBQcm9jZXNzRWxlbWVudEl0ZW0od3JhcHBlciwgc3VwZXIuZWxlbWVudCwgc3VwZXIuZWxlbWVudFByb2Nlc3NQYXRoKTsKLQkJaXRlcmF0ZShlbGVtZW50SXRlbSwgYnMsIHNldHRpbmcpOwotCQkKLQotCQlYbWxFbGVtZW50IGRpYWdyYW1zID0gZWxlbWVudFhtbC5uZXdDaGlsZCgiZGlhZ3JhbXMiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJU3RyaW5nIGRpYWdyYW1UeXBlOwotCQlTdHJpbmcgaW1nRmlsZTsKLQkJZGlhZ3JhbVR5cGUgPSBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1c7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCB1c2VyRGlhZ3JhbSA9IHVzZXJEaWFncmFtSW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKTsKLQkJaWYgKCB1c2VyRGlhZ3JhbUluZm8uY2FuUHVibGlzaEFESW1hZ2UoKSAmJiAodXNlckRpYWdyYW0gIT0gbnVsbCkgKQotCQl7CQkJCQotCQkJZGlhZ3JhbXMubmV3Q2hpbGQoInVzZXJkaWFncmFtIikgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBkaWFncmFtVHlwZSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRWYWx1ZShnZXRVc2VyRGlhZ3JhbVRleHQodXNlckRpYWdyYW0pKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8gdWRkSW5mbyA9IGdldFJlYWxpemVkVUREKHN1cCwgZGlhZ3JhbVR5cGUpOwotCQkJYm9vbGVhbiBnZW5lcmF0ZWREaWFncmFtID0gdHJ1ZTsKLQkJCWlmKHVkZEluZm8gIT0gbnVsbCl7Ci0JCQkJdXNlckRpYWdyYW0gPSB1ZGRJbmZvLmdldEFjdGl2aXR5RGlhZ3JhbSgpOwotCQkJCWlmKHVkZEluZm8uY2FuUHVibGlzaEFESW1hZ2UoKSAmJiB1c2VyRGlhZ3JhbSAhPSBudWxsKXsKLQkJCQkJZGlhZ3JhbXMubmV3Q2hpbGQoInVzZXJkaWFncmFtIikgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgZGlhZ3JhbVR5cGUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldFZhbHVlKGdldFVzZXJEaWFncmFtVGV4dCh1c2VyRGlhZ3JhbSkpOwotCQkJCQlnZW5lcmF0ZWREaWFncmFtID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZihnZW5lcmF0ZWREaWFncmFtKXsKLQkJCQlpbWdGaWxlID0gUmVzb3VyY2VIZWxwZXIuZ2V0RGlhZ3JhbUZpbGVQYXRoTmFtZShlbGVtZW50LCBkaWFncmFtVHlwZSk7Ci0JCQkJRGlhZ3JhbUluZm8gZGlhZ3JhbV93b3JrZmxvdyA9IGdlbmVyYXRlRGlhZ3JhbShzdXAsIGRpYWdyYW1UeXBlLCBpbWdGaWxlKTsJCi0JCQkJaWYgKGRpYWdyYW1fd29ya2Zsb3cgIT0gbnVsbAotCQkJCQkmJiBkaWFncmFtX3dvcmtmbG93LmdldEltYWdlRmlsZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJZGlhZ3JhbXMubmV3Q2hpbGQoImRpYWdyYW0iKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJhbHQiLCBnZXREaWFncmFtRGlzcGxheU5hbWUoUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8uc2V0VmFsdWUoZGlhZ3JhbV93b3JrZmxvdy5nZXRIVE1MKCkpOwotCQkJCQkJLmFkZENoaWxkKGRpYWdyYW1fd29ya2Zsb3cuZ2V0WG1sRWxlbWVudCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWRpYWdyYW1UeXBlID0gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTDsKLQkJdXNlckRpYWdyYW0gPSB1c2VyRGlhZ3JhbUluZm8uZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCk7Ci0JCWlmICggdXNlckRpYWdyYW1JbmZvLmNhblB1Ymxpc2hBRERJbWFnZSgpICYmICh1c2VyRGlhZ3JhbSAhPSBudWxsKSApCi0JCXsJCQkJCi0JCQlkaWFncmFtcy5uZXdDaGlsZCgidXNlcmRpYWdyYW0iKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIGRpYWdyYW1UeXBlKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldFZhbHVlKGdldFVzZXJEaWFncmFtVGV4dCh1c2VyRGlhZ3JhbSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaW1nRmlsZSA9IFJlc291cmNlSGVscGVyLmdldERpYWdyYW1GaWxlUGF0aE5hbWUoZWxlbWVudCwgZGlhZ3JhbVR5cGUpOwotCQkJRGlhZ3JhbUluZm8gZGlhZ3JhbV9kZXRhaWwgPSBnZW5lcmF0ZURpYWdyYW0oc3VwLCBkaWFncmFtVHlwZSwgaW1nRmlsZSk7CQotCQkJaWYgKGRpYWdyYW1fZGV0YWlsICE9IG51bGwgJiYgZGlhZ3JhbV9kZXRhaWwuZ2V0SW1hZ2VGaWxlTmFtZSgpICE9IG51bGwpIHsKLQkJCQlkaWFncmFtcwotCQkJCQkJLm5ld0NoaWxkKCJkaWFncmFtIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUwpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoCi0JCQkJCQkJCSJhbHQiLCBnZXREaWFncmFtRGlzcGxheU5hbWUoUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vLnNldFZhbHVlKGRpYWdyYW1fZGV0YWlsLmdldEhUTUwoKSk7Ci0JCQkJCQkuYWRkQ2hpbGQoZGlhZ3JhbV9kZXRhaWwuZ2V0WG1sRWxlbWVudCgpKTsKLQkJCX0KLQkJfQotCQkKLQkJZGlhZ3JhbVR5cGUgPSBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWTsKLQkJdXNlckRpYWdyYW0gPSB1c2VyRGlhZ3JhbUluZm8uZ2V0V1BERGlhZ3JhbSgpOwotCQlpZiAoIHVzZXJEaWFncmFtSW5mby5jYW5QdWJsaXNoV1BESW1hZ2UoKSAmJiAodXNlckRpYWdyYW0gIT0gbnVsbCkgKQotCQl7CQkJCQotCQkJZGlhZ3JhbXMubmV3Q2hpbGQoInVzZXJkaWFncmFtIikgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBkaWFncmFtVHlwZSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRWYWx1ZShnZXRVc2VyRGlhZ3JhbVRleHQodXNlckRpYWdyYW0pKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWltZ0ZpbGUgPSBSZXNvdXJjZUhlbHBlci5nZXREaWFncmFtRmlsZVBhdGhOYW1lKGVsZW1lbnQsIGRpYWdyYW1UeXBlKTsKLQkJCURpYWdyYW1JbmZvIGRpYWdyYW1fd3AgPSBnZW5lcmF0ZURpYWdyYW0oc3VwLCBkaWFncmFtVHlwZSwgaW1nRmlsZSk7CQotCQkJaWYgKGRpYWdyYW1fd3AgIT0gbnVsbCAmJiBkaWFncmFtX3dwLmdldEltYWdlRmlsZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJZGlhZ3JhbXMubmV3Q2hpbGQoImRpYWdyYW0iKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1kpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoCi0JCQkJCQkJCSJhbHQiLCBnZXREaWFncmFtRGlzcGxheU5hbWUoUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1kpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkvLy5zZXRWYWx1ZShkaWFncmFtX3dwLmdldEhUTUwoKSk7Ci0JCQkJCQkuYWRkQ2hpbGQoZGlhZ3JhbV93cC5nZXRYbWxFbGVtZW50KCkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldERpYWdyYW1EaXNwbGF5TmFtZShTdHJpbmcgdHlwZSkgewotCQotCQlTdHJpbmcgbmFtZSA9IGdldERpc3BsYXlOYW1lKCk7Ci0JCWlmICggUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XLmVxdWFscyh0eXBlKSApIHsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLmFjdGl2aXR5RGlhZ3JhbU5hbWUsIG5hbWUpOwkJCi0JCX0gZWxzZSBpZiAoIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUwuZXF1YWxzKHR5cGUpICkgewotCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuYWN0aXZpdHlEZXRhaWxEaWFncmFtTmFtZSwgbmFtZSk7CQkKLQkJfSBlbHNlIGlmICggUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1kuZXF1YWxzKHR5cGUpICkgewotCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMud3BEZXBlbmRlbmN5RGlhZ3JhbU5hbWUsIG5hbWUpOwkJCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLS8vCXByaXZhdGUgRGlhZ3JhbUluZm8gZ2VuZXJhdGVEaWFncmFtKFN1cHByZXNzaW9uIHN1cCwgU3RyaW5nIGRpYWdyYW1UeXBlLCBTdHJpbmcgaW1nRmlsZSkgewotLy8JCQotLy8vLwkJaWYgKCAiX28zblpvU0ZyRWRxclg4WVZ6dnRsSWcsX2ppbjJvQ0dHRWRxTWNvdlJ6a0NRb3ciLmVxdWFscyhzdXBlci5lbGVtZW50UHJvY2Vzc1BhdGgpICkgewotLy8vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigieHgiKTsKLS8vLy8JCX0KLS8vCQkKLS8vCQlEaWFncmFtSW5mbyBpbmZvID0gbnVsbDsKLS8vCQlFbGVtZW50TGF5b3V0TWFuYWdlciBtZ3IgPSBnZXRMYXlvdXRNZ3IoKTsKLS8vCQlpZiAobWdyICE9IG51bGwpIHsKLS8vCQkJaW5mbyA9IG1nci5nZXRDYWNoZWREaWFncmFtSW5mbyhzdXAsIGRpYWdyYW1UeXBlLCBpbWdGaWxlKTsKLS8vCQkJaWYgKGluZm8gIT0gbnVsbCkgewotLy8JCQkJU3lzdGVtLmVyci5wcmludGxuKCIqKiogZGlhZ3JhbSBnZW5lcmF0ZWQ6ICIgKyBpbmZvLnBhdGggKyAiLCAgZmlsZSBuYW1lOiAiICsgaW1nRmlsZSk7Ci0vLwotLy8JCQkJcmV0dXJuIGluZm87Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJaW5mbyA9IGdlbmVyYXRlRGlhZ3JhbV8oc3VwLCBkaWFncmFtVHlwZSwgaW1nRmlsZSk7Ci0vLwkJaWYgKCBpbmZvICE9IG51bGwgKSB7Ci0vLwkJCWluZm8ucGF0aCA9IHN1cGVyLmVsZW1lbnRQcm9jZXNzUGF0aDsKLS8vCQl9Ci0vLwkJCi0vLwkJaWYgKG1nciAhPSBudWxsKSB7Ci0vLwkJCW1nci5hZGRDYWNoZWREaWFncmFtSW5mbyhpbmZvLCBzdXAsIGRpYWdyYW1UeXBlLCBpbWdGaWxlKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIGluZm87Ci0vLwl9Ci0JCi0JcHJpdmF0ZSBEaWFncmFtSW5mbyBnZW5lcmF0ZURpYWdyYW0oU3VwcHJlc3Npb24gc3VwLCBTdHJpbmcgZGlhZ3JhbVR5cGUsIFN0cmluZyBpbWdGaWxlKQotCXsKLQkJVGltZXIgdGltZXIgPSBudWxsOwotCQlpZiAoZGVidWcgKXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU1RBUlQ6IGdlbmVyYXRpbmcgZGlhZ3JhbSAiICsgaW1nRmlsZSk7Ci0JCQl0aW1lciA9IG5ldyBUaW1lcigpOwkJCQotCQl9Ci0JCS8vIGdlbmVyYXRlIGRpYWdyYW0KLQkJLy8gc2hvdyB0aGUgYWN0aXZpdHkgZGlhZ3JhbXMKLQkJSUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UgZGlhZ3JhbVNlcnZpY2UgPSBsYXlvdXRNYW5hZ2VyCi0JCQkJLmdldEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoKTsKLQkJRGlhZ3JhbUluZm8gZGlhZ3JhbSA9IG51bGw7Ci0JCWlmIChkaWFncmFtU2VydmljZSAhPSBudWxsKSB7Ci0JCQlJRmlsdGVyIGZpbHRlciA9IGxheW91dE1hbmFnZXIuZ2V0RGlhZ3JhbUFkYXB0ZXJGYWN0b3J5KCkuZ2V0RmlsdGVyKCk7Ci0JCQkKLQkJCS8vIGdldCB0aGUgd3JhcHBlciBmcm9tIHRoZSBXQlMgYWRhcHRlciBmYWN0b3J5Ci0JCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgoc3VwZXIucGF0aHMsIGxheW91dE1hbmFnZXIuZ2V0RGlhZ3JhbUFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJCi0JCQkvLyBTZXQgdGhlIHB1Ymxpc2hpbmcgbW9kZQotCQkJYm9vbGVhbiBwdWJsaXNoaW5nbW9kZSA9IExpYnJhcnlVdGlsLlBVQkxJU0hfTU9ERTsKLQkJCUxpYnJhcnlVdGlsLlBVQkxJU0hfTU9ERSA9IHRydWU7Ci0KLQkJCWRpYWdyYW0gPSBkaWFncmFtU2VydmljZS5zYXZlRGlhZ3JhbSh3cmFwcGVyLAotCQkJCQlpbWdGaWxlLAotCQkJCQlkaWFncmFtVHlwZSwgZmlsdGVyLCBzdXApOwotCQkJCi0JCQkvLyBzZXQgYmFjayB0byAKLQkJCUxpYnJhcnlVdGlsLlBVQkxJU0hfTU9ERSA9IHB1Ymxpc2hpbmdtb2RlOwotCQl9Ci0KLQkJaWYgKCB0aW1lciAhPSBudWxsICl7Ci0JCQl0aW1lci5zdG9wKCk7CQotCQkJU3RyaW5nIG1zZyA9IHRpbWVyLmdldFRpbWUoKSArICIgbWluaSBzZWNvbmRzIGdlbmVyYXRpbmcgIiArIGRpYWdyYW1UeXBlICsgIiBkaWFncmFtIiAgOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCQkJCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRU5EOiBnZW5lcmF0aW5nIGRpYWdyYW0gIiArIGltZ0ZpbGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gZGlhZ3JhbTsKLQotCX0KLQkKLQlwcml2YXRlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8gZ2V0UmVhbGl6ZWRVREQoU3VwcHJlc3Npb24gc3VwLCBTdHJpbmcgZGlhZ3JhbVR5cGUpCi0JewotCQkvLyBnZW5lcmF0ZSBkaWFncmFtCi0JCS8vIHNob3cgdGhlIGFjdGl2aXR5IGRpYWdyYW1zCi0JCUlBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIGRpYWdyYW1TZXJ2aWNlID0gbGF5b3V0TWFuYWdlcgotCQkJCS5nZXRBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKCk7Ci0JCWlmIChkaWFncmFtU2VydmljZSAhPSBudWxsKSB7Ci0JCQlJRmlsdGVyIGZpbHRlciA9IGxheW91dE1hbmFnZXIuZ2V0RGlhZ3JhbUFkYXB0ZXJGYWN0b3J5KCkuZ2V0RmlsdGVyKCk7Ci0JCQkKLQkJCS8vIGdldCB0aGUgd3JhcHBlciBmcm9tIHRoZSBXQlMgYWRhcHRlciBmYWN0b3J5Ci0JCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgoc3VwZXIucGF0aHMsIGxheW91dE1hbmFnZXIuZ2V0RGlhZ3JhbUFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCQlPYmplY3QgcmVhbGl6ZWQgPSBkaWFncmFtU2VydmljZS5nZXRSZWFsaXplZEZvclVubW9kaWZpZWQod3JhcHBlciwgZmlsdGVyLCBzdXApOwotCQkJCi0JCQlpZihyZWFsaXplZCBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvIHVkZEluZm8gPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbygKLQkJCQkJCShBY3Rpdml0eSlyZWFsaXplZCk7Ci0JCQkJaWYodWRkSW5mby5jYW5QdWJsaXNoQURJbWFnZSgpKXsKLQkJCQkJcmV0dXJuIHVkZEluZm87IAotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVEJTKFhtbEVsZW1lbnQgZWxlbWVudFhtbCwgU3VwcHJlc3Npb24gc3VwKQotCXsKLQkJWG1sRWxlbWVudCBicyA9IGVsZW1lbnRYbWwKLQkJLm5ld0NoaWxkKCJicmVha2Rvd24iKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJLnNldEF0dHJpYnV0ZSgiRGlzcGxheU5hbWUiLCBnZXREaXNwbGF5TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHNldCB0aGUgY29sdW1ucwotCQlzZXRDb2x1bW5zKGJzLCBQcmVmZXJlbmNlVXRpbC5nZXRUQlNDb2x1bW5zKCkpOwotCi0JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBsYXlvdXRNYW5hZ2VyLmdldFRCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCUNvbXBvc2l0ZVJvbGVzIGNycyA9IG51bGw7IC8vbmV3IENvbXBvc2l0ZVJvbGVzKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIHN1cGVyLmVsZW1lbnQpOwotCQkKLQkJLy8gcm9vbHVwIHRoZSBsYXlvdXQKLQkJSUJTSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJc3VwZXIuZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkKLQkJLy8gbmVlZCB0byBnZXQgdGhlIHJhdyBpdGVtIHByb3ZpZGVyIGZyb20gdGhlIGFkYXB0ZXIgZmFjdG9yeQotCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgoc3VwZXIucGF0aHMsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYgKCB3cmFwcGVyID09IG51bGwgKSB7Ci0JCQl3cmFwcGVyID0gc3VwZXIuZWxlbWVudDsKLQkJfQotCQlQcm9jZXNzRWxlbWVudEl0ZW0gZWxlbWVudEl0ZW0gPSBuZXcgUHJvY2Vzc0VsZW1lbnRJdGVtKHdyYXBwZXIsIHN1cGVyLmVsZW1lbnQsIHN1cGVyLmVsZW1lbnRQcm9jZXNzUGF0aCk7Ci0KLQkJLy8gY29sbGVjdCBhbGwgUm9sZURlc2NyaXB0b3JzIGJlZm9yZSByb2xsdXAKLQkJcHJvdmlkZXIuc2V0Um9sbGVkVXAoZmFsc2UpOwotCQlpdGVtRGV0YWlsLml0ZXJhdGUoYWRhcHRlckZhY3RvcnksIHdyYXBwZXIpOwotCi0JCXByb3ZpZGVyLnNldFJvbGxlZFVwKHRydWUpOwkJCi0JCUFjdGl2aXR5TGF5b3V0U2V0dGluZyBzZXR0aW5nID0gbmV3IEFjdGl2aXR5TGF5b3V0U2V0dGluZyhhZGFwdGVyRmFjdG9yeSwgY3JzLCBzdXApOwotCQlzZXR0aW5nLnJvbGx1cFJvbGVzID0gdHJ1ZTsKLQkJc2V0dGluZy5lc2NhcGVTdHJpbmcgPSB0cnVlOwotCi0JCWl0ZXJhdGUoZWxlbWVudEl0ZW0sIGJzLCBzZXR0aW5nKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkV1BCUyhYbWxFbGVtZW50IGVsZW1lbnRYbWwsIFN1cHByZXNzaW9uIHN1cCkKLQl7Ci0JCVhtbEVsZW1lbnQgYnMgPSBlbGVtZW50WG1sCi0JCS5uZXdDaGlsZCgiYnJlYWtkb3duIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgIldvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJLnNldEF0dHJpYnV0ZSgiRGlzcGxheU5hbWUiLCBnZXREaXNwbGF5TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHNldCB0aGUgY29sdW1ucwotCQlzZXRDb2x1bW5zKGJzLCBQcmVmZXJlbmNlVXRpbC5nZXRXUEJTQ29sdW1ucygpKTsKLQotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbGF5b3V0TWFuYWdlci5nZXRXUEJTQWRhcHRlckZhY3RvcnkoKTsKLQkJQ29tcG9zaXRlUm9sZXMgY3JzID0gbnVsbDsgLy9uZXcgQ29tcG9zaXRlUm9sZXMoYWRhcHRlckZhY3RvcnksIChBY3Rpdml0eSkgc3VwZXIuZWxlbWVudCk7Ci0JCQotCQkvLyByb29sdXAgdGhlIGxheW91dAotCQlJQlNJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChzdXBlci5lbGVtZW50LAotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXByb3ZpZGVyLnNldFJvbGxlZFVwKHRydWUpOwotCQkKLQkJQWN0aXZpdHlMYXlvdXRTZXR0aW5nIHNldHRpbmcgPSBuZXcgQWN0aXZpdHlMYXlvdXRTZXR0aW5nKGFkYXB0ZXJGYWN0b3J5LCBjcnMsIHN1cCk7Ci0JCXNldHRpbmcuZXNjYXBlU3RyaW5nID0gdHJ1ZTsKLQotCQkvLyBuZWVkIHRvIGdldCB0aGUgcmF3IGl0ZW0gcHJvdmlkZXIgZnJvbSB0aGUgYWRhcHRlciBmYWN0b3J5Ci0JCU9iamVjdCB3cmFwcGVyID0gc3VwLmdldE9iamVjdEJ5UGF0aChzdXBlci5wYXRocywgYWRhcHRlckZhY3RvcnkpOwotCQlpZiAoIHdyYXBwZXIgPT0gbnVsbCApIHsKLQkJCXdyYXBwZXIgPSBzdXBlci5lbGVtZW50OwotCQl9Ci0JCVByb2Nlc3NFbGVtZW50SXRlbSBlbGVtZW50SXRlbSA9IG5ldyBQcm9jZXNzRWxlbWVudEl0ZW0od3JhcHBlciwgc3VwZXIuZWxlbWVudCwgc3VwZXIuZWxlbWVudFByb2Nlc3NQYXRoKTsKLQkJaXRlcmF0ZShlbGVtZW50SXRlbSwgYnMsIHNldHRpbmcpOwotCi0JfQotCi0JLyoqCi0JICogaXRlcmF0ZSB0aGUgYnJlYWsgZG93biBzdHJ1Y3R1cmUgYW5kIGJ1aWxkIHRoZSB4bWwgZG9jdW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50SXRlbQotCSAqICAgICAgICAgICAgVGhlIG9iamVjdCB0byBpdGVyYXRlLiBJdCBjYW4gYmUgYSBicmVha2Rvd24gZWxlbWVudCwgb3IgaXQncwotCSAqICAgICAgICAgICAgYWRhcHRvcgotCSAqIEBwYXJhbSBwYXJlbnRYbWwKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwcml2YXRlIHZvaWQgaXRlcmF0ZShQcm9jZXNzRWxlbWVudEl0ZW0gcGFyZW50SXRlbSwgWG1sRWxlbWVudCBwYXJlbnRYbWwsCi0JCQlBY3Rpdml0eUxheW91dFNldHRpbmcgc2V0dGluZykgewotCQlpdGVyYXRlKHBhcmVudEl0ZW0sIHBhcmVudFhtbCwgc2V0dGluZywgMCk7Ci0JfQotCQotCS8vIGxldmVsIHRvIGV4cGFuZCBhbGwgQldTIGFjdGl2aXRpZXMgdG8sIDAgZm9yIHRoZSBmaXJzdCBsZXZlbAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ1RJVklUWV9TSE9XX0xFVkVMID0gMTsKLQkKLQkvKioKLQkgKiBpdGVyYXRlIHRoZSBicmVhayBkb3duIHN0cnVjdHVyZSBhbmQgYnVpbGQgdGhlIHhtbCBkb2N1bWVudAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRJdGVtCi0JICogICAgICAgICAgICBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUuIEl0IGNhbiBiZSBhIGJyZWFrZG93biBlbGVtZW50LCBvciBpdCdzCi0JICogICAgICAgICAgICBhZGFwdG9yCi0JICogQHBhcmFtIHBhcmVudFhtbAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXByaXZhdGUgdm9pZCBpdGVyYXRlKFByb2Nlc3NFbGVtZW50SXRlbSBwYXJlbnRJdGVtLCBYbWxFbGVtZW50IHBhcmVudFhtbCwKLQkJCUFjdGl2aXR5TGF5b3V0U2V0dGluZyBzZXR0aW5nLCBpbnQgYWN0TGV2ZWwpIHsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQkJT2JqZWN0IHBhcmVudE9iaiA9IHBhcmVudEl0ZW0ucmF3SXRlbTsKLQkJCQotCQlUaW1lciB0aW1lciA9IG51bGw7Ci0JCWlmIChkZWJ1ZyApewotCQkJdGltZXIgPSBuZXcgVGltZXIoKTsJCQkKLQkJfQotCQkKLQkJaWYgKHBhcmVudE9iaiBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJcHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBwYXJlbnRPYmo7Ci0JCX0gZWxzZSB7Ci0JCQlwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHNldHRpbmcuYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJCXBhcmVudE9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJfQotCi0JCS8vIEVpdGhlciBkZWxlZ2F0ZSB0aGUgY2FsbCBvciByZXR1cm4gbm90aGluZy4KLQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLS8vCQkJU3RyaW5nIGRpc3BsYXlOYW1lID0gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKHBhcmVudE9iaiwKLS8vCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLCBwcm92aWRlcik7Ci0vLwkJCXBhcmVudFhtbC5zZXRBdHRyaWJ1dGUoIkRpc3BsYXlOYW1lIiwgZGlzcGxheU5hbWUpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vTGlzdCB1bmlxdWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJQ29sbGVjdGlvbiBpdGVtcyA9IHByb3ZpZGVyLmdldENoaWxkcmVuKHBhcmVudE9iaik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCByYXdpdGVtID0gaXQubmV4dCgpOwotCi0JCQkJTWV0aG9kRWxlbWVudCBpdGVtID0gKE1ldGhvZEVsZW1lbnQpIExpYnJhcnlVdGlsCi0JCQkJCQkudW53cmFwKHJhd2l0ZW0pOwotCi0JCQkJaWYgKCBzZXR0aW5nLnNob3dUYXNrT25seSAmJiAoYWN0TGV2ZWwgPiBBQ1RJVklUWV9TSE9XX0xFVkVMKQotCQkJCQkJJiYgIShpdGVtIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgaXRlbSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSApIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKCBpdGVtID09IG51bGwgKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBhZGQgdGhlIGVsZW1lbnQgdG8gdGhlIHJlZmVyZW5jZSBsaXN0LCAKLQkJCQkvLyB0aGlzIGlzIGZvciBwdWJsaXNoaW5nIG9ubHksIGZvciBicm93c2luZywgdGhpcyBjYWxsIGRvZXMgbm90aGluZwotCQkJCWdldExheW91dE1ncigpLmdldFZhbGlkYXRvcigpLmFkZFJlZmVyZW5jZWRFbGVtZW50KHN1cGVyLmVsZW1lbnQsIGl0ZW0pOwotCQkJCQotCQkJCVByb2Nlc3NFbGVtZW50SXRlbSBlbGVtZW50SXRlbSA9IG5ldyBQcm9jZXNzRWxlbWVudEl0ZW0ocmF3aXRlbSwgaXRlbSwgcGFyZW50SXRlbSk7Ci0KLQkJCQkvLyBQcm9jZXNzIFB1Ymxpc2hpbmc6IFJlcGxhY2Ugcm9sZSBkZXNjcmlwdG9yCi0JCQkJLy8gd2l0aCBjb21wb3NpdGUgcm9sZQotCQkJCS8vIGlmIGl0IGNvbnRhaW5zIHRoZSByb2xlIGRlc2NyaXB0b3IgZHVyaW5nIHByZXZpZXcvcHVibGlzaGluZwotCQkJCS8vIHNvIGlmIHRoaXMgZ3V5IGlzIGEgUm9sZURlc2NycHRvciwgZmluZCB0aGUgY29tcG9zaXRlIHJvbGUKLQkJCQkvLyBkZXNjcmlwdG9yIHdpdGhpbiB0aGUgc2NvcGUKLQkJCQkvLyAKLQkJCQlpZiAoKHBhcmVudE9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5ICYmIHNldHRpbmcuY3JzICE9IG51bGwpCi0JCQkJCQkmJiAoaXRlbSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSkgewotCQkJCQlDb21wb3NpdGVSb2xlIGNyID0gc2V0dGluZy5jcnMuZ2V0Q29tcG9zaXRlUm9sZSgKLQkJCQkJCQkoQWN0aXZpdHkpIHBhcmVudE9iaiwgKFJvbGVEZXNjcmlwdG9yKSBpdGVtKTsKLQkJCQkJaWYgKGNyICE9IG51bGwpIHsKLQkJCQkJCWl0ZW0gPSBjcjsKLQkJCQkJfQotCQkJCX0KLQotCQkJCVhtbEVsZW1lbnQgY2hpbGQgPSBnZW5lcmF0ZUNoaWxkWG1sKGVsZW1lbnRJdGVtLCBwYXJlbnRYbWwsIHNldHRpbmcpOwotCQkJCQkKLQkJCQlwYXJlbnRYbWwuYWRkQ2hpbGQoY2hpbGQpOwotCQkJCQkJCQkJCi0JCQkJLy8gc2hvdyBvbmx5IHRhc2sgdGFzayBkZXNjcmlwdG9ycyBmb3Igc3ViIGFjdGl2aXRpZXMgaW4gdGhlIHRicyBsYXlvdXQKLQkJCQlpZiAoIHNldHRpbmcuc2hvd1Rhc2tPbmx5ICYmIChhY3RMZXZlbCA+IEFDVElWSVRZX1NIT1dfTEVWRUwpICYmICEoaXRlbSBpbnN0YW5jZW9mIEFjdGl2aXR5ICkpIHsKLQkJCQkJLy8gaWYgYWN0IGxldmVsID4gMCwgb25seSBpdGVyYXRlIHRoZSBzdWItYWN0aXZpdGllcwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gaW5ldGVyYXRlIGNoaWxkcmVuLCBub3QganVzdCBhY3Rpdml0eSwgYW55IGNoaWxkIGluIHRoZQotCQkJCS8vIHJhd2l0ZW0gc2hvdWxkIGJlIGl0ZXJhdGVkLAotCQkJCS8vIHN1Y2ggYXMgdGhlIHN1Yi1hcnRpZmFjdHMKLQkJCQlpdGVyYXRlKGVsZW1lbnRJdGVtLCBjaGlsZCwgc2V0dGluZywgCi0JCQkJCQkoaXRlbSBpbnN0YW5jZW9mIEFjdGl2aXR5KSA/IGFjdExldmVsKzEgOiBhY3RMZXZlbCk7CQkJCQotCQkJfQotCQl9Ci0JCQotCQlpZiAoIHRpbWVyICE9IG51bGwgKSB7Ci0JCQl0aW1lci5zdG9wKCk7CQotCQkJaWYgKHRpbWVyLmdldFRpbWUoKSA+IDEwMCkgewotCQkJCVN0cmluZyBtc2cgPSB0aW1lci5nZXRUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBpdGVyYXRpbmcgYnJlYWtkb3duIGl0ZW0gIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKHBhcmVudEl0ZW0uZWxlbWVudCkgIDsgLy8kTk9OLU5MUy0xJCAJCQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBYbWxFbGVtZW50IGdlbmVyYXRlQ2hpbGRYbWwoUHJvY2Vzc0VsZW1lbnRJdGVtIGVsZW1lbnRJdGVtLCBYbWxFbGVtZW50IHBhcmVudFhtbCwKLQkJCUFjdGl2aXR5TGF5b3V0U2V0dGluZyBzZXR0aW5nKQotCXsKLQkJVGltZXIgdGltZXIgPSBudWxsOwotCQlpZiAoZGVidWcgKXsKLQkJCXRpbWVyID0gbmV3IFRpbWVyKCk7CQkJCi0JCX0KLQkJCi0JCU1ldGhvZEVsZW1lbnQgaXRlbSA9IGVsZW1lbnRJdGVtLmVsZW1lbnQ7Ci0JCQotCQlJRWxlbWVudExheW91dCBsID0gZ2V0TGF5b3V0KGVsZW1lbnRJdGVtKTsKLQkKLQkJLy8gbGF0IHRoZSBwcmVzZW50YXRpb24gdG8gZGV0ZXJtaW5lIHdoZW4gdG8gc2hvdwotCQkvLyBzZXQgZ2VuZXJhdGUgdGhlIGZsYWcgZm9yIGJyb3dzaW5nCi0JCWJvb2xlYW4gaXNTdXByZXNzZWQgPSBzZXR0aW5nLnN1cC5pc1N1cHByZXNzZWQoZWxlbWVudEl0ZW0ucmF3SXRlbSk7Ci0JCWlmICggaXNTdXByZXNzZWQgKSB7Ci0JCQlpdGVtRGV0YWlsLmFkZFN1cHByZXNzZWQoZWxlbWVudEl0ZW0uZWxlbWVudCk7Ci0JCX0KLQkJCi0JCVhtbEVsZW1lbnQgY2hpbGQgPSBsLmdldFhtbEVsZW1lbnQoZmFsc2UpOwotCi0JCS8vIHdlIHN0aWxsIGdlbmVyYXRlIHRoZSBpdGVtIGV2ZW4gdGhvdWdoIGl0J3Mgc3VwcHJlc3NlZCwgCi0JCS8vIGxldCB0aGUgbGF5b3V0IGphdmFzY3JpcHQgdG8gaGFuZGxlIHRoZSBzaG93IG9yIGhpZGUKLQkJLy8gc2V0IHRoZSBpc1N1cHJlc3NlZCBmbGFnIGZvciBicm93c2luZyBtb2RlbCBvbmx5LAotCQkvLyBmb3IgcHVibGlzaGluZywgdGhlIGZsYWcgd2lsbCBiZSBnZWVucmF0ZWQgYW5kIHNhdmVkIGluIGEgc2VwZXJhdGVkIGpzIGZpbGUKLQkJLy8gcHVibGlzaGVkIGh0bWwgcGFnZXMgd2lsbCBnZXQgdGhlIGlzU3VwcmVzc2VkIGZsYWcgdmlhIGphdmFzY3JpcHQgbWV0aG9kLgotCQlpZiAoICFnZXRMYXlvdXRNZ3IoKS5pc1B1Ymxpc2hpbmdNb2RlKCkgKQotCQl7Ci0JCQljaGlsZC5zZXRBdHRyaWJ1dGUoImlzU3VwcmVzc2VkIiwgKGlzU3VwcmVzc2VkID8gInRydWUiIDogImZhbHNlIikgKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQkKLQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSBudWxsOwotCQlpZiAoZWxlbWVudEl0ZW0ucmF3SXRlbSBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGVsZW1lbnRJdGVtLnJhd0l0ZW07Ci0JCX0gZWxzZSB7Ci0JCQlhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgc2V0dGluZy5hZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQoZWxlbWVudEl0ZW0uZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCTsKLQkJfQotCi0JCS8vIGdldCB0aGUgaW5kZXggYW5kIHByZWRlY2Vzc29yIGluZGVjZXMKLQkJaWYgKGVsZW1lbnRJdGVtLmVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlTdHJpbmcgaW5kZXggPSBnZXRJbmRleChhZGFwdGVyKTsKLQkJCVN0cmluZyBtb2RlbEluZm8gPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUoaXRlbSwKLQkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPLCBhZGFwdGVyKTsKLQkJCVN0cmluZyB0ZWFtID0gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKGl0ZW0sCi0JCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVMsIGFkYXB0ZXIpOwotCQkJU3RyaW5nIHByZWZpeCA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShpdGVtLAotCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCwgYWRhcHRlcik7CQkJCi0JCQlTdHJpbmcgaXNFdmVudERyaXZlbiA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShpdGVtLAotCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTiwgYWRhcHRlcik7Ci0JCQlTdHJpbmcgaXNPbmdvaW5nID0gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKGl0ZW0sCi0JCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORywgYWRhcHRlcik7Ci0JCQlTdHJpbmcgaXNPcHRpb25hbCA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShpdGVtLAotCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09QVElPTkFMLCBhZGFwdGVyKTsKLQkJCVN0cmluZyBpc1BsYW5uZWQgPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUoaXRlbSwKLQkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19QTEFOTkVELCBhZGFwdGVyKTsKLQkJCVN0cmluZyBpc1JlcGVhdGFibGUgPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUoaXRlbSwKLQkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFLCBhZGFwdGVyKTsKLQkJCVN0cmluZyBoYXNNdWx0aXBsZU9jY3VycmVuY2VzID0gUHJvY2Vzc1V0aWwKLQkJCQkJLmdldEF0dHJpYnV0ZSgKLQkJCQkJCQlpdGVtLAotCQkJCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLAotCQkJCQkJCWFkYXB0ZXIpOwotCQkJCi0JCQlTdHJpbmcgZGlzcGxheU5hbWUgPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUoaXRlbSwKLQkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSwgYWRhcHRlcik7Ci0JCQkKLQkJCVN0cmluZyBtTmFtZSA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShpdGVtLAotCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUsIGFkYXB0ZXIpOwotCi0JCQkvLyBmb3IgV0JTIGxheW91dCB3ZSBwdXQgdGhlIHN0cmluZyBpbnRvIGphdmFzY3JpcHQgdmFyaWFibGVzCi0JCQkvLyBzbyBuZWVkIHRvIGVzY2FwZSB0aGUgcXVvdGVzICIgYW5kICcKLQkJCWlmICggc2V0dGluZy5lc2NhcGVTdHJpbmcgKQotCQkJewotCQkJCW1vZGVsSW5mbyA9IFN0clV0aWwuZXNjYXBlKG1vZGVsSW5mbyk7Ci0JCQkJZGlzcGxheU5hbWUgPSBYTUxVdGlsLmVzY2FwZShkaXNwbGF5TmFtZSk7Ci0JCQkJbU5hbWUgPSBYTUxVdGlsLmVzY2FwZShtTmFtZSk7Ci0JCQkJCi0JCQkJLy8gYW5kIHRoZSB1cmwKLQkJCQkvLyBuZWVkIGFuIGVzY2FwZWQgdXJsIGZvciBqYXZhc2NyaXB0Ci0JCQkJU3RyaW5nIGpzRXNjYXBlZFVybCA9IFN0clV0aWwuZXNjYXBlKGwuZ2V0VXJsKCkpOwotCQkJCWNoaWxkLnNldEF0dHJpYnV0ZSgiVXJsIiwganNFc2NhcGVkVXJsKTsgLy8kTk9OLU5MUy0xJAotCi0JCQl9Ci0JCQkKLQkJCWNoaWxkLnNldEF0dHJpYnV0ZSgiSW5kZXgiLCBpbmRleCkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJNb2RlbEluZm8iLCBtb2RlbEluZm8pIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgiVGVhbSIsIHRlYW0pOyAvLyROT04tTkxTLTEkCi0KLQkJCWNoaWxkLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAicHJlZml4Iikuc2V0VmFsdWUocHJlZml4KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQotCQkJY2hpbGQKLQkJCQkJLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiaXNFdmVudERyaXZlbiIpLnNldFZhbHVlKGlzRXZlbnREcml2ZW4pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCWNoaWxkCi0JCQkJCS5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgImlzT25nb2luZyIpLnNldFZhbHVlKGlzT25nb2luZyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIAotCQkJY2hpbGQKLQkJCQkJLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiaXNPcHRpb25hbCIpLnNldFZhbHVlKGlzT3B0aW9uYWwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCWNoaWxkCi0JCQkJCS5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgImlzUGxhbm5lZCIpLnNldFZhbHVlKGlzUGxhbm5lZCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIAotCQkJY2hpbGQKLQkJCQkJLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiaXNSZXBlYXRhYmxlIikuc2V0VmFsdWUoaXNSZXBlYXRhYmxlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgCi0JCQljaGlsZAotCQkJCQkubmV3Q2hpbGQoImF0dHJpYnV0ZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsICJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIikuc2V0VmFsdWUoaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIAotCi0JCQljaGlsZC5zZXRBdHRyaWJ1dGUoIkRpc3BsYXlOYW1lIiwgZGlzcGxheU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZC5zZXRBdHRyaWJ1dGUoIk5hbWUiLCBtTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQkJCi0KLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCVN0cmluZyBlbnRyeVN0YXRlID0gYWRhcHRlci5nZXRBdHRyaWJ1dGUoaXRlbSwgSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURSk7Ci0JCQlTdHJpbmcgZXhpdFN0YXRlID0gYWRhcHRlci5nZXRBdHRyaWJ1dGUoaXRlbSwgSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFKTsKLQkJCVN0cmluZyBkZWxpdmVyYWJsZSA9IGFkYXB0ZXIuZ2V0QXR0cmlidXRlKGl0ZW0sIElCU0l0ZW1Qcm92aWRlci5DT0xfREVMSVZFUkFCTEUpOwotCi0JCQljaGlsZC5zZXRBdHRyaWJ1dGUoIkVudHJ5U3RhdGUiLCBlbnRyeVN0YXRlKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoIkV4aXRTdGF0ZSIsIGV4aXRTdGF0ZSkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJEZWxpdmVyYWJsZSIsIGRlbGl2ZXJhYmxlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJU3RyaW5nIHByZWRlY2Vzc29ycyA9IGdldFByZWRlY2Vzc29ycyhhZGFwdGVyLAotCQkJCQlzZXR0aW5nLnN1cCk7Ci0JCQljaGlsZC5zZXRBdHRyaWJ1dGUoIlByZWRlY2Vzc29ycyIsIHByZWRlY2Vzc29ycyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIGlmIGl0J3MgYSB0YXNrIGRlc2NyaXB0b3IsIGdldCB0aGUgc3RlcHMKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCi0JCQlYbWxFbGVtZW50IHN0ZXBzWG1sID0gY2hpbGQubmV3Q2hpbGQoIlN0ZXBzIik7IC8vJE5PTi1OTFMtMSQKLQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVtOwotCQkJTGlzdCBzZWxTdGVwcyA9IHRkLmdldFNlbGVjdGVkU3RlcHMoKTsKLQkJCVRhc2sgdCA9IChUYXNrKSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCS5nZXRDYWxjdWxhdGVkRWxlbWVudCh0ZC5nZXRUYXNrKCksCi0JCQkJCQkJZ2V0TGF5b3V0TWdyKCkuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCWlmICh0ICE9IG51bGwpIHsKLQkJCQlMaXN0IHN0ZXBzID0gQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkJLmNhbGMwbkZlYXR1cmVWYWx1ZSh0LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0VGFza19TdGVwcygpLCBnZXRMYXlvdXRNZ3IoKQotCQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RlcHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJT2JqZWN0IHN0ZXAgPSBzdGVwcy5nZXQoaSk7Ci0JCQkJCWJvb2xlYW4gc2VsZWN0ZWQgPSBzZWxTdGVwcy5jb250YWlucyhzdGVwKTsKLQkJCQkJc3RlcHNYbWwKLQkJCQkJCQkubmV3Q2hpbGQoIlN0ZXAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkJCSJpbmRleCIsIEludGVnZXIudG9TdHJpbmcoaSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJCQkJInNlbGVjdGVkIiwgc2VsZWN0ZWQgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCS8vIGJ1aWxkIHRoZSB0ZWFtIHByb2ZpbGUgdHJlZS4KLQkJLy8gVGhpcyBpcyBhIHRlbXBvcmFyeSByZXBsYWNlbWVudCBmb3IgdGhlIHRlYW0gYnJlYWtkb3duCi0JCS8vIHN0cnVjdHVyZSBkaWFncmFtCi0JCWlmIChpdGVtIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCVRlYW1Qcm9maWxlIHN1cGVyVGVhbSA9ICgoVGVhbVByb2ZpbGUpaXRlbSkuZ2V0U3VwZXJUZWFtKCk7Ci0JCQljaGlsZC5zZXRBdHRyaWJ1dGUoImhhc1N1cGVyVGVhbSIsIChzdXBlclRlYW0gIT0gbnVsbCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCi0JCS8vIGlmIHJvbGUgcm9sbHVwIGlzIHNldCwgYnVpbGQgdGhlIHJvbGUgc3ViIHRyZWUKLQkJaWYgKHNldHRpbmcucm9sbHVwUm9sZXMgJiYgaXRlbSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlidWlsZFJvbGVSb2xsdXAoKFJvbGVEZXNjcmlwdG9yKSBpdGVtLCBjaGlsZCwgc2V0dGluZyk7Ci0JCX0KLQkJCi0JCWlmICggdGltZXIgIT0gbnVsbCApIHsKLQkJCXRpbWVyLnN0b3AoKTsJCi0JCQlpZiAodGltZXIuZ2V0VGltZSgpID4gMTAwKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IHRpbWVyLmdldFRpbWUoKSArICIgbWluaSBzZWNvbmRzIGdlbmVyYXRpbmcgeG1sIGZvciBicmVha2Rvd24gaXRlbSAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudEl0ZW0uZWxlbWVudCkgIDsgLy8kTk9OLU5MUy0xJCAJCQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBidWlsZFJvbGVSb2xsdXAoUm9sZURlc2NyaXB0b3Igcm9sZUl0ZW0sIFhtbEVsZW1lbnQgcGFyZW50WG1sLAotCQkJQWN0aXZpdHlMYXlvdXRTZXR0aW5nIHNldHRpbmcpIHsKLQkJUm9sZSByID0gcm9sZUl0ZW0uZ2V0Um9sZSgpOwotCQlMaXN0IGRlc2NyaXB0b3JzID0gaXRlbURldGFpbC5nZXREZXNjcmlwdG9ycyhyKTsKLQkJaWYgKCBkZXNjcmlwdG9ycyA9PSBudWxsICkgewotCQkJZGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJaWYgKCAhZGVzY3JpcHRvcnMuY29udGFpbnMocm9sZUl0ZW0pICkgewotCQkJZGVzY3JpcHRvcnMuYWRkKHJvbGVJdGVtKTsKLQkJfQotCQkKLQkJTGlzdCByZXNwb25zaWJsZUZvciA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBtb2RpZmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBwcmltYXJ5VGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgYWRkaXRpb25hbFRhc2tzID0gbmV3IEFycmF5TGlzdCgpOwkKLQkJTGlzdCBpdGVtczsKLQkJCi0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQotCQkJcm9sZUl0ZW0gPSAoUm9sZURlc2NyaXB0b3IpIGl0Lm5leHQoKTsKLQkJCQotCQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyb2xlSXRlbSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSwgCi0JCQkJCWdldExheW91dE1ncigpLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCXJlc3BvbnNpYmxlRm9yLmFkZEFsbChpdGVtcyk7Ci0JCQkJCi0JCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHJvbGVJdGVtLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9Nb2RpZmllcygpLCBnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQltb2RpZmllcy5hZGRBbGwoaXRlbXMpOwotCQkJCi0JCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHJvbGVJdGVtLAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Sb2xlRGVzY3JpcHRvcl9QcmltYXJ5VGFza0Rlc2NyaXB0b3JzLAotCQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlwcmltYXJ5VGFza3MuYWRkQWxsKGl0ZW1zKTsKLQkJCQotCQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyb2xlSXRlbSwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfQWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycywgCi0JCQkJCWdldExheW91dE1ncigpLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWFkZGl0aW9uYWxUYXNrcy5hZGRBbGwoaXRlbXMpOwotCQl9Ci0JCQotCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3BvbnNpYmxlRm9yLCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJY3JlYXRlUm9sZVJvbGx1cE5vZGVzKHBhcmVudFhtbCwgcmVzcG9uc2libGVGb3IsIFRuZ1V0aWwKLQkJCQkuZ2V0RmVhdHVyZVRleHQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSkpOwotCi0JCUNvbGxlY3Rpb25zLnNvcnQobW9kaWZpZXMsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQljcmVhdGVSb2xlUm9sbHVwTm9kZXMocGFyZW50WG1sLCBtb2RpZmllcywgVG5nVXRpbAotCQkJCS5nZXRGZWF0dXJlVGV4dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9Nb2RpZmllcygpKSk7Ci0KLQkJQ29sbGVjdGlvbnMuc29ydChwcmltYXJ5VGFza3MsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQljcmVhdGVSb2xlUm9sbHVwTm9kZXMocGFyZW50WG1sLCBwcmltYXJ5VGFza3MsIAotCQkJCUxpYnJhcnlSZXNvdXJjZXMuQWN0aXZpdHlMYXlvdXRfcHJpbWFyeVRhc2tzX3RleHQpOyAKLQotCQlDb2xsZWN0aW9ucy5zb3J0KGFkZGl0aW9uYWxUYXNrcywgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCWNyZWF0ZVJvbGVSb2xsdXBOb2RlcyhwYXJlbnRYbWwsIGFkZGl0aW9uYWxUYXNrcywgCi0JCQkJTGlicmFyeVJlc291cmNlcy5BY3Rpdml0eUxheW91dF9hZGRpdGlvbmFsVGFza3NfdGV4dCk7IAotCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVSb2xlUm9sbHVwTm9kZXMoWG1sRWxlbWVudCBwYXJlbnRYbWwsIExpc3QgaXRlbXMsCi0JCQlTdHJpbmcgaW5mbykgewotCQkKLQkJLy8gMTYwMTg4IC0gUHVibGlzaGVkIFRlYW0gQWxsb2NhdGlvbiB0YWIgc2hvd3MgcmVkdW5kYW50IGluZm9ybWF0aW9uCi0JCS8vIG9ubHkgc2hvdyBvbmUgZGVzY3JpcHRvciBpZiBtb3JlIHRoYW4gb25lIGFyZSBsaW5rZWQgdG8gdGhlIHNhbWUgdGFzayBvciB3cC4KLQkJLy8gc28ga2VlcCB0aGUgcHJvY2Vzc2VkIHRhc2sgYW5kIHdwIGluc3RlYWQgb2YgdGhlIGRlc2NyaXB0b3JzCi0JCUxpc3QgcHJvY2Vzc2VkID0gbmV3IEFycmF5TGlzdCgpOwotCQlNZXRob2RFbGVtZW50IGxpbmtlZCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpOwotCQkJbGlua2VkID0gbnVsbDsKLQkJCWlmICggZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yICkgewotCQkJCWxpbmtlZCA9ICgoVGFza0Rlc2NyaXB0b3IpZSkuZ2V0VGFzaygpOwotCQkJfSBlbHNlIGlmICggZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvciApIHsKLQkJCQlsaW5rZWQgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcillKS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJfQotCQkJaWYgKCBsaW5rZWQgPT0gbnVsbCApIHsKLQkJCQlsaW5rZWQgPSBlOwotCQkJfQotCQkJCi0JCQlpZiAoIHByb2Nlc3NlZC5jb250YWlucyhsaW5rZWQpICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlwcm9jZXNzZWQuYWRkKGxpbmtlZCk7Ci0JCQkKLQkJCUlFbGVtZW50TGF5b3V0IGwgPSBsYXlvdXRNYW5hZ2VyLmdldExheW91dChlLCB0cnVlKTsKLQkJCVhtbEVsZW1lbnQgY2hpbGQgPSBsLmdldFhtbEVsZW1lbnQoZmFsc2UpOwotCQkJY2hpbGQuc2V0QXR0cmlidXRlKCJNb2RlbEluZm8iLCBpbmZvKTsgLy8kTk9OLU5MUy0xJAotCQkJcGFyZW50WG1sLmFkZENoaWxkKGNoaWxkKTsKLQkJfQotCi0JfQotCi0KLQlwcml2YXRlIFN0cmluZyBnZXRJbmRleChJQlNJdGVtUHJvdmlkZXIgYWRhcHRlcikgewotCQkvLyBJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGZhY3RvcnkuYWRhcHQoZSwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTs7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCWludCBpbmRleCA9IGFkYXB0ZXIuZ2V0SWQoKTsKLQkJCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gSW50ZWdlci50b1N0cmluZyhpbmRleCk7Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQcmVkZWNlc3NvcnMoSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQkvLyBJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGZhY3RvcnkuYWRhcHQoZSwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTs7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCVByZWRlY2Vzc29yTGlzdCBsaXN0ID0gYWRhcHRlci5nZXRQcmVkZWNlc3NvcnMoKTsKLQkJCWlmIChsaXN0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbGlzdC50b1VuU3VwcHJlc3NlZFN0cmluZyhzdXAsIHRydWUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGNsYXNzIENvbXBvc2l0ZVJvbGVzIHsKLQkJLy8gYSBtYXAgb2YgYWN0aXZpdHkgdG8gQ29tcG9zaXRlUm9sZUluZm8KLQkJTWFwIGl0ZW1NYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCXB1YmxpYyBDb21wb3NpdGVSb2xlcyhDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJCUFjdGl2aXR5IGFjdCkgewotCQkJc2NhbihhZGFwdGVyRmFjdG9yeSwgbnVsbCwgYWN0KTsKLQkJfQotCi0JCXByaXZhdGUgQ29tcG9zaXRlUm9sZUluZm8gZ2V0Q29tcG9zaXRlUm9sZUluZm8oQWN0aXZpdHkgcGFyZW50LAotCQkJCUFjdGl2aXR5IGFjdCkgewotCQkJQ29tcG9zaXRlUm9sZUluZm8gaW5mbyA9IChDb21wb3NpdGVSb2xlSW5mbykgaXRlbU1hcC5nZXQoYWN0KTsKLQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQlpbmZvID0gbmV3IENvbXBvc2l0ZVJvbGVJbmZvKHBhcmVudCwgYWN0KTsKLQkJCQlpdGVtTWFwLnB1dChhY3QsIGluZm8pOwotCQkJfQotCi0JCQlyZXR1cm4gaW5mbzsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBzY2FuKENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQkJQWN0aXZpdHkgcGFyZW50LCBBY3Rpdml0eSBhY3QpIHsKLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChhY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCUNvbGxlY3Rpb24gaXRlbXMgPSBwcm92aWRlci5nZXRDaGlsZHJlbihhY3QpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgaXRlbSA9IChNZXRob2RFbGVtZW50KSBMaWJyYXJ5VXRpbC51bndyYXAoaXQKLQkJCQkJCQkubmV4dCgpKTsKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQkJCQlnZXRDb21wb3NpdGVSb2xlSW5mbyhwYXJlbnQsIGFjdCkuYWRkQ29tcG9zaXRlUm9sZSgKLQkJCQkJCQkJKENvbXBvc2l0ZVJvbGUpIGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJc2NhbihhZGFwdGVyRmFjdG9yeSwgYWN0LCAoQWN0aXZpdHkpIGl0ZW0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIGZpbmQgdGhlIGNvbXBvc2l0ZSByb2xlIGZvciB0aGUgcm9sZSBkZXNjcmlwdG9yIGZyb20gdGhlIGFjdGl2aXR5IGFuZAotCQkgKiBpdCdzIHBhcmVudHMsIHJldHVybiBudWxsIGlmIG5vdCBmb3VuZAotCQkgKiAKLQkJICogQHBhcmFtIGFjdGl2aXR5Ci0JCSAqIEBwYXJhbSBpdGVtCi0JCSAqIEByZXR1cm4gUm9sZURlc2NyaXB0b3IKLQkJICovCi0JCXByaXZhdGUgQ29tcG9zaXRlUm9sZSBnZXRDb21wb3NpdGVSb2xlKEFjdGl2aXR5IGFjdGl2aXR5LAotCQkJCVJvbGVEZXNjcmlwdG9yIGl0ZW0pIHsKLQkJCS8vIGl0ZXJhdGUgdGhlIGJyZWFrZG93biBlbGVtZW50cywKLQkJCS8vIGlmIHRoZXJlIGlzIGEgY29tcG9zaXRlIHJvbGUgdGhhdCBjb250YWlucyB0aGUgcm9sZSwgcmV0dXJuIHRoZQotCQkJLy8gY29tcG9zaXRlLAotCQkJLy8gaWYgbm90LCBmaW5kIGluIHRoZSBwYXJlbnQgYWN0aXZpdHkKLQotCQkJaWYgKGFjdGl2aXR5ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJQ29tcG9zaXRlUm9sZSBkZXNjID0gbnVsbDsKLQkJCUNvbXBvc2l0ZVJvbGVJbmZvIGluZm8gPSAoQ29tcG9zaXRlUm9sZUluZm8pIGl0ZW1NYXAuZ2V0KGFjdGl2aXR5KTsKLQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQlkZXNjID0gaW5mby5nZXRDb21wb3NpdGVSb2xlKGl0ZW0pOwotCQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGRlc2M7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIGdldENvbXBvc2l0ZVJvbGUoaW5mby5nZXRQYXJlbnRBY3Rpdml0eSgpLCBpdGVtKTsKLQkJCX0KLQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgQ29tcG9zaXRlUm9sZUluZm8gewotCQlBY3Rpdml0eSBwYXJlbnQ7Ci0KLQkJQWN0aXZpdHkgb3duZXI7Ci0KLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwdWJsaWMgQ29tcG9zaXRlUm9sZUluZm8oQWN0aXZpdHkgcGFyZW50LCBBY3Rpdml0eSBvd25lcikgewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkQ29tcG9zaXRlUm9sZShDb21wb3NpdGVSb2xlIGUpIHsKLQkJCWlmICghaXRlbXMuY29udGFpbnMoZSkpIHsKLQkJCQlpdGVtcy5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIEFjdGl2aXR5IGdldFBhcmVudEFjdGl2aXR5KCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCi0JCXByaXZhdGUgQ29tcG9zaXRlUm9sZSBnZXRDb21wb3NpdGVSb2xlKFJvbGVEZXNjcmlwdG9yIGl0ZW0pIHsKLQkJCWlmIChpdGVtcy5zaXplKCkgPT0gMCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlSb2xlIHIgPSBpdGVtLmdldFJvbGUoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJQ29tcG9zaXRlUm9sZSBjciA9IChDb21wb3NpdGVSb2xlKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGNyLmdldEFnZ3JlZ2F0ZWRSb2xlcygpLmNvbnRhaW5zKHIpKSB7Ci0JCQkJCXJldHVybiBjcjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIEFjdGl2aXR5TGF5b3V0U2V0dGluZyB7Ci0JCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JCXB1YmxpYyBDb21wb3NpdGVSb2xlcyBjcnM7Ci0KLQkJcHVibGljIFN1cHByZXNzaW9uIHN1cDsKLQotCQlib29sZWFuIHJvbGx1cFJvbGVzID0gZmFsc2U7Ci0KLQkJcHVibGljIGJvb2xlYW4gZXNjYXBlU3RyaW5nID0gZmFsc2U7Ci0JCQotCQkvLyBzZXQgdG8gc2hvdyB0YXNrIG9ubHkgZm9yIHN1YiBhY3Rpdml0aWVzCi0JCS8vIHRoaXMgb25seSBhcHBseSB0byBDQlMgbGF5b3V0Ci0JCXB1YmxpYyBib29sZWFuIHNob3dUYXNrT25seSA9IGZhbHNlOwotCQkKLQkJcHVibGljIEFjdGl2aXR5TGF5b3V0U2V0dGluZyhDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJCUNvbXBvc2l0ZVJvbGVzIGNycywgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JCQl0aGlzLmNycyA9IGNyczsKLQkJCXRoaXMuc3VwID0gc3VwOwotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgVEJTSXRlbURldGFpbCB7Ci0JCQotCQkvLyByZWNvcmQgdGhlIHN1cHByZXNzZWQgaXRlbXMKLQkJTGlzdCBzdXBwcmVzc2VkSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQkvLyBtYXAgb2Ygcm9sZSB0byByb2xlIGRlc2NyaXB0b3JzCi0JCU1hcCByb2xlRGVzY3JpcHRvck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlwdWJsaWMgVEJTSXRlbURldGFpbCgpIHsKLQkJCQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGRTdXBwcmVzc2VkKE9iamVjdCBpdGVtKSB7Ci0JCQlpZiAoICFzdXBwcmVzc2VkSXRlbXMuY29udGFpbnMoaXRlbSkgKSB7Ci0JCQkJc3VwcHJlc3NlZEl0ZW1zLmFkZChpdGVtKTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIHZvaWQgaXRlcmF0ZShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBPYmplY3QgcGFyZW50T2JqKSB7Ci0JCQotCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQkJCWlmIChwYXJlbnRPYmogaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHsKLQkJCQlwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHBhcmVudE9iajsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdCgKLQkJCQkJCXBhcmVudE9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCX0KLQotCQkJLy8gRWl0aGVyIGRlbGVnYXRlIHRoZSBjYWxsIG9yIHJldHVybiBub3RoaW5nLgotCQkJaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkJCi0JCQlDb2xsZWN0aW9uIGl0ZW1zID0gcHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGFyZW50T2JqKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IHJhd2l0ZW0gPSBpdC5uZXh0KCk7Ci0KLQkJCQlNZXRob2RFbGVtZW50IGl0ZW0gPSAoTWV0aG9kRWxlbWVudCkgTGlicmFyeVV0aWwudW53cmFwKHJhd2l0ZW0pOwotCQkJCWlmICggaXRlbSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yICkgewotCQkJCQlhZGRSb2xlRGVzY3JpcHRvciggKFJvbGVEZXNjcmlwdG9yKWl0ZW0gKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpdGVyYXRlKGFkYXB0ZXJGYWN0b3J5LCByYXdpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCQotCQlwcml2YXRlIHZvaWQgYWRkUm9sZURlc2NyaXB0b3IoUm9sZURlc2NyaXB0b3IgcmRlc2MpIHsKLQkJCVJvbGUgciA9IHJkZXNjLmdldFJvbGUoKTsKLQkJCWlmIChyICE9IG51bGwgKSB7Ci0JCQkJTGlzdCBpdGVtcyA9IChMaXN0KXJvbGVEZXNjcmlwdG9yTWFwLmdldChyKTsKLQkJCQlpZiAoIGl0ZW1zID09IG51bGwgKSB7Ci0JCQkJCWl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlyb2xlRGVzY3JpcHRvck1hcC5wdXQociwgaXRlbXMpOwotCQkJCQlpZiAoZGVidWcgKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGVkIFJvbGVEZXNjcmlwdG9yICIgKyByZGVzYy5nZXRQcmVzZW50YXRpb25OYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKCAhaXRlbXMuY29udGFpbnMocmRlc2MpICkgewotCQkJCQlpdGVtcy5hZGQocmRlc2MpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIExpc3QgZ2V0RGVzY3JpcHRvcnMoUm9sZSByKSB7Ci0JCQlyZXR1cm4gKExpc3Qpcm9sZURlc2NyaXB0b3JNYXAuZ2V0KHIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIGxvYWQgdGhlIHByb2Nlc3Mgc3BlY2lmaWMgbGF5b3V0IGRhdGEgZm9yIHB1Ymxpc2hpbmcuCi0JICogYnJvd3NpbmcgZG9lcyBub3QgbmVlZCB0aGlzIHNpbmNlIGl0J3MgZ2VuZXJhdGVkIG9uIHRoZSBmbHkKLQkgKiBAcGFyYW0gcHJvY19kYXRhCi0JICovCi0JcHVibGljIHZvaWQgbG9hZExheW91dERhdGEoUHJvY2Vzc0xheW91dERhdGEgcHJvY19kYXRhLCBib29sZWFuIGxvYWRXYnMsIGJvb2xlYW4gbG9hZFRicywgYm9vbGVhbiBsb2FkV3BicykKLQl7Ci0JCVRpbWVyIHQgPSBuZXcgVGltZXIoKTsJCQotCi0JCUFjdGl2aXR5TGF5b3V0RGF0YSBhY3RfZGF0YSA9IHByb2NfZGF0YS5jcmVhdGVBY3Rpdml0eUxhdW91dERhdGEodGhpcy5lbGVtZW50UHJvY2Vzc1BhdGgpOwotCQkKLQkJLy8gaXRlcmF0ZSB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgY29sbGVjdCB0aGUgaW5mby4KLQkJUHJvY2VzcyBwcm9jID0gZ2V0T3duaW5nUHJvY2VzcygpOwotCQlpZiAoIHByb2MgPT0gdGhpcy5lbGVtZW50ICkgewotCQkJc3VwQ291bnQgPSAwOwotCQl9Ci0JCQotCQkvLyBuZWVkIHRvIGhhbmRsZSB0aGUgc3VwcmVzc2VkIGJyZWFrZG93biBlbGVtZW50cwotCQkvLyB1c2UgdGhlIFN1cHJlc3MgdXRpbGl0eQotCQlTdXBwcmVzc2lvbiBzdXAgPSBnZXRTdXBwcmVzc2lvbihwcm9jKTsKLQotCQkvLyBuZWVkIHRvIGludGVyYXRlIHRoZSAzIGxheW91dCBzdHJ1Y3R1cmUgc2ljbmUgdGhlaXIgcGF0aCBpcyBkaWZmZXJlbnQKLQkJaWYgKCBsb2FkV2JzICkgewotCQkJbG9hZFdCU0xheW91dERhdGEoYWN0X2RhdGEsIHN1cCk7Ci0JCX0KLQkJCi0JCWlmICggbG9hZFRicyApIHsKLQkJCWxvYWRUQlNMYXlvdXREYXRhKGFjdF9kYXRhLCBzdXApOwotCQl9Ci0JCQotCQlpZiAoIGxvYWRXcGJzICkgewotCQkJbG9hZFdQQlNMYXlvdXREYXRhKGFjdF9kYXRhLCBzdXApOwotCQl9Ci0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJdC5zdG9wKCk7Ci0JCQlTdHJpbmcgbXNnID0gdC5nZXRUaW1lKCkKLQkJCQkJKyAiIG1pbmktc2Vjb25kKHMpIGxvYWRpbmcgbGF5b3V0IGRhdGEgZm9yIHByb2Nlc3MgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKHByb2MpIC8vJE5PTi1OTFMtMSQgLwotCQkJCQkrICIsIGFjdGl2aXR5OiAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoc3VwZXIuZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQgLwkJCQotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvYWRXQlNMYXlvdXREYXRhKEFjdGl2aXR5TGF5b3V0RGF0YSBhY3RfZGF0YSwgU3VwcHJlc3Npb24gc3VwKQotCXsKLQkJLy8gcHVibGlzaCB0aGUgY29uc29saWRhdGVkIHZpZXcKLQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGxheW91dE1hbmFnZXIKLQkJCQkuZ2V0Q0JTQWRhcHRlckZhY3RvcnkoKTsKLQkJQ29tcG9zaXRlUm9sZXMgY3JzID0gbnVsbDsgLy9uZXcgQ29tcG9zaXRlUm9sZXMoYWRhcHRlckZhY3RvcnksIChBY3Rpdml0eSkgc3VwZXIuZWxlbWVudCk7Ci0KLQkJQWN0aXZpdHlMYXlvdXRTZXR0aW5nIHNldHRpbmcgPSBuZXcgQWN0aXZpdHlMYXlvdXRTZXR0aW5nKAotCQkJCWFkYXB0ZXJGYWN0b3J5LCBjcnMsIHN1cCk7Ci0KLQkJLy8gbmVlZCB0byBnZXQgdGhlIHJhdyBpdGVtIHByb3ZpZGVyIGZyb20gdGhlIGFkYXB0ZXIgZmFjdG9yeQotCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgoc3VwZXIucGF0aHMsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYgKCB3cmFwcGVyID09IG51bGwgKSB7Ci0JCQl3cmFwcGVyID0gc3VwZXIuZWxlbWVudDsKLQkJfQotCQlQcm9jZXNzRWxlbWVudEl0ZW0gZWxlbWVudEl0ZW0gPSBuZXcgUHJvY2Vzc0VsZW1lbnRJdGVtKHdyYXBwZXIsIHN1cGVyLmVsZW1lbnQsIHN1cGVyLmVsZW1lbnRQcm9jZXNzUGF0aCk7Ci0JCWl0ZXJhdGVQcm9jZXNzSXRlbShlbGVtZW50SXRlbSwgYWN0X2RhdGEsIHNldHRpbmcsIHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0KLS8vCQkvLyBpZiB0aGVyZSBpcyBubyBwcm9jZXNzLWxvY2FsIHN1cHJlc3NlZCBpdGVtLCBkb24ndCBnZW5lcmF0ZSBkaWFncmFtcwotCQkvLyBubywgdGhpcyB3aWxsIG5vdCB3b3JrLCBzaW5jZSB0aGUgdGV4dCBjb2xvciBvZmQgdGhlIGRpYWdyYW0gaXMgZ3JlZW4sIGlmIHVzZSBiYXNlLCBpdCdzIGJsYWNrLgotCQkvLyBzbyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBkaWFncmFtIG5vIG1hdHRlciB3aGF0LgotLy8JCWlmICggIWFjdF9kYXRhLmhhc0xvY2FsU3VwcHJlc3NlZCgpICkKLS8vCQl7Ci0vLwkJCXJldHVybjsKLS8vCQl9Ci0JCQotCQlTdHJpbmcgZGlhZ3JhbVR5cGUsIGltZ0ZpbGU7Ci0JCQotCQkvLyBtYWtlIGEgc2hvcnQgcHJlZml4IGZvciB0aGUgZmlsZSBuYW1lCi0JCVN0cmluZyBwcmVmaXggPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKHN1cGVyLmVsZW1lbnRQcm9jZXNzUGF0aC5oYXNoQ29kZSgpKTsKLQkJCi0JCWRpYWdyYW1UeXBlID0gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XOwotCQlpbWdGaWxlID0gUmVzb3VyY2VIZWxwZXIuZ2V0RGlhZ3JhbUZpbGVQYXRoTmFtZShlbGVtZW50LCBwcmVmaXggKyAiXyIgKyBkaWFncmFtVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJRGlhZ3JhbUluZm8gZGlhZ3JhbV93b3JrZmxvdyA9IGdlbmVyYXRlRGlhZ3JhbShzdXAsIGRpYWdyYW1UeXBlLCBpbWdGaWxlKTsJCi0JCWlmIChkaWFncmFtX3dvcmtmbG93ICE9IG51bGwKLQkJCQkmJiBkaWFncmFtX3dvcmtmbG93LmdldEltYWdlRmlsZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQlhY3RfZGF0YS5zZXRBY3Rpdml0eURpYWdyYW1QYXRoKGRpYWdyYW1fd29ya2Zsb3cuZ2V0SW1hZ2VGaWxlTmFtZSgpKTsKLQkJfQotCQkKLQkJZGlhZ3JhbVR5cGUgPSBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMOwotCQlpbWdGaWxlID0gUmVzb3VyY2VIZWxwZXIuZ2V0RGlhZ3JhbUZpbGVQYXRoTmFtZShlbGVtZW50LCBwcmVmaXggKyAiXyIgKyBkaWFncmFtVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJRGlhZ3JhbUluZm8gZGlhZ3JhbV9kZXRhaWwgPSBnZW5lcmF0ZURpYWdyYW0oc3VwLCBkaWFncmFtVHlwZSwgaW1nRmlsZSk7CQotCQlpZiAoZGlhZ3JhbV9kZXRhaWwgIT0gbnVsbCAmJiBkaWFncmFtX2RldGFpbC5nZXRJbWFnZUZpbGVOYW1lKCkgIT0gbnVsbCkgewotCQkJYWN0X2RhdGEuc2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtUGF0aChkaWFncmFtX2RldGFpbC5nZXRJbWFnZUZpbGVOYW1lKCkpOwotCQl9Ci0KLQkJZGlhZ3JhbVR5cGUgPSBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWTsKLQkJaW1nRmlsZSA9IFJlc291cmNlSGVscGVyLmdldERpYWdyYW1GaWxlUGF0aE5hbWUoZWxlbWVudCwgcHJlZml4ICsgIl8iICsgZGlhZ3JhbVR5cGUpOyAvLyROT04tTkxTLTEkCi0JCURpYWdyYW1JbmZvIGRpYWdyYW1fd3AgPSBnZW5lcmF0ZURpYWdyYW0oc3VwLCBkaWFncmFtVHlwZSwgaW1nRmlsZSk7CQotCQlpZiAoZGlhZ3JhbV93cCAhPSBudWxsICYmIGRpYWdyYW1fd3AuZ2V0SW1hZ2VGaWxlTmFtZSgpICE9IG51bGwpIHsKLQkJCWFjdF9kYXRhLnNldFdQRGVwZW5kZW5jeURpYWdyYW1QYXRoKGRpYWdyYW1fd3AuZ2V0SW1hZ2VGaWxlTmFtZSgpKTsKLQkJfQotCi0JfQotCQotCXByaXZhdGUgdm9pZCBsb2FkVEJTTGF5b3V0RGF0YShBY3Rpdml0eUxheW91dERhdGEgYWN0X2RhdGEsIFN1cHByZXNzaW9uIHN1cCkKLQl7Ci0JCS8vIHB1Ymxpc2ggdGhlIGNvbnNvbGlkYXRlZCB2aWV3Ci0JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBsYXlvdXRNYW5hZ2VyCi0JCQkJLmdldFRCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCUNvbXBvc2l0ZVJvbGVzIGNycyA9IG51bGw7IC8vbmV3IENvbXBvc2l0ZVJvbGVzKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIHN1cGVyLmVsZW1lbnQpOwotCi0JCS8vIHJvb2x1cCB0aGUgbGF5b3V0Ci0JCUlCU0l0ZW1Qcm92aWRlciBwcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCXN1cGVyLmVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXByb3ZpZGVyLnNldFJvbGxlZFVwKHRydWUpOwotCi0JCQotCQlBY3Rpdml0eUxheW91dFNldHRpbmcgc2V0dGluZyA9IG5ldyBBY3Rpdml0eUxheW91dFNldHRpbmcoCi0JCQkJYWRhcHRlckZhY3RvcnksIGNycywgc3VwKTsKLQkJc2V0dGluZy5yb2xsdXBSb2xlcyA9IHRydWU7Ci0KLQkJCi0JCS8vIG5lZWQgdG8gZ2V0IHRoZSByYXcgaXRlbSBwcm92aWRlciBmcm9tIHRoZSBhZGFwdGVyIGZhY3RvcnkKLQkJT2JqZWN0IHdyYXBwZXIgPSBzdXAuZ2V0T2JqZWN0QnlQYXRoKHN1cGVyLnBhdGhzLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmICggd3JhcHBlciA9PSBudWxsICkgewotCQkJd3JhcHBlciA9IHN1cGVyLmVsZW1lbnQ7Ci0JCX0KLQkJUHJvY2Vzc0VsZW1lbnRJdGVtIGVsZW1lbnRJdGVtID0gbmV3IFByb2Nlc3NFbGVtZW50SXRlbSh3cmFwcGVyLCBzdXBlci5lbGVtZW50LCBzdXBlci5lbGVtZW50UHJvY2Vzc1BhdGgpOwotCQlpdGVyYXRlUHJvY2Vzc0l0ZW0oZWxlbWVudEl0ZW0sIGFjdF9kYXRhLCBzZXR0aW5nLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOwotCi0JfQotCQotCXByaXZhdGUgdm9pZCBsb2FkV1BCU0xheW91dERhdGEoQWN0aXZpdHlMYXlvdXREYXRhIGFjdF9kYXRhLCBTdXBwcmVzc2lvbiBzdXApCi0JewotCQkvLyBwdWJsaXNoIHRoZSBjb25zb2xpZGF0ZWQgdmlldwotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbGF5b3V0TWFuYWdlcgotCQkJCS5nZXRXUEJTQWRhcHRlckZhY3RvcnkoKTsKLQkJQ29tcG9zaXRlUm9sZXMgY3JzID0gbnVsbDsgLy9uZXcgQ29tcG9zaXRlUm9sZXMoYWRhcHRlckZhY3RvcnksIChBY3Rpdml0eSkgc3VwZXIuZWxlbWVudCk7Ci0KLQkJLy8gcm9vbHVwIHRoZSBsYXlvdXQKLQkJSUJTSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJc3VwZXIuZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJcHJvdmlkZXIuc2V0Um9sbGVkVXAodHJ1ZSk7Ci0JCi0JCUFjdGl2aXR5TGF5b3V0U2V0dGluZyBzZXR0aW5nID0gbmV3IEFjdGl2aXR5TGF5b3V0U2V0dGluZygKLQkJCQlhZGFwdGVyRmFjdG9yeSwgY3JzLCBzdXApOwotCi0JCQotCQkvLyBuZWVkIHRvIGdldCB0aGUgcmF3IGl0ZW0gcHJvdmlkZXIgZnJvbSB0aGUgYWRhcHRlciBmYWN0b3J5Ci0JCU9iamVjdCB3cmFwcGVyID0gc3VwLmdldE9iamVjdEJ5UGF0aChzdXBlci5wYXRocywgYWRhcHRlckZhY3RvcnkpOwotCQlpZiAoIHdyYXBwZXIgPT0gbnVsbCApIHsKLQkJCXdyYXBwZXIgPSBzdXBlci5lbGVtZW50OwotCQl9Ci0JCVByb2Nlc3NFbGVtZW50SXRlbSBlbGVtZW50SXRlbSA9IG5ldyBQcm9jZXNzRWxlbWVudEl0ZW0od3JhcHBlciwgc3VwZXIuZWxlbWVudCwgc3VwZXIuZWxlbWVudFByb2Nlc3NQYXRoKTsKLQkJaXRlcmF0ZVByb2Nlc3NJdGVtKGVsZW1lbnRJdGVtLCBhY3RfZGF0YSwgc2V0dGluZywgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBpbnQgc3VwQ291bnQgPSAwOwotCQotCXByaXZhdGUgdm9pZCBpdGVyYXRlUHJvY2Vzc0l0ZW0oUHJvY2Vzc0VsZW1lbnRJdGVtIHBhcmVudEl0ZW0sIEFjdGl2aXR5TGF5b3V0RGF0YSBhY3RfZGF0YSwgCi0JCQlBY3Rpdml0eUxheW91dFNldHRpbmcgc2V0dGluZywgYm9vbGVhbiBsb2FkV2JzLCBib29sZWFuIGxvYWRUYnMsIGJvb2xlYW4gbG9hZFdwYnMpIHsKLQkJCi0JCS8vU3RyaW5nIG1zZyA9ICIgLS0tIGl0ZXJhdGUgcHJvY2VzcyBpdGVtICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShwYXJlbnRJdGVtLmVsZW1lbnQpICsgIlsiICsgcGFyZW50SXRlbS5wYXRoICsgIl0iIDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgCQkJCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0KLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQkJT2JqZWN0IHBhcmVudE9iaiA9IHBhcmVudEl0ZW0ucmF3SXRlbTsKLQkJCi0JCWlmIChwYXJlbnRPYmogaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHsKLQkJCXByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgcGFyZW50T2JqOwotCQl9IGVsc2UgewotCQkJcHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBzZXR0aW5nLmFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCQlwYXJlbnRPYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCX0KLQotCQkvLyBFaXRoZXIgZGVsZWdhdGUgdGhlIGNhbGwgb3IgcmV0dXJuIG5vdGhpbmcuCi0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGl0ZW1zID0gcHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGFyZW50T2JqKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IHJhd2l0ZW0gPSBpdC5uZXh0KCk7CQkJCi0JCQkJCi0vLwkJCQkvLyBsYXQgdGhlIHByZXNlbnRhdGlvbiB0byBkZXRlcm1pbmUgd2hlbiB0byBzaG93Ci0vLwkJCQkvLyBzZXQgZ2VuZXJhdGUgdGhlIGZsYWcgZm9yIGJyb3dzaW5nCi0JCQkJYm9vbGVhbiBpc1N1cHJlc3NlZCA9IHNldHRpbmcuc3VwLmlzU3VwcHJlc3NlZChyYXdpdGVtKTsKLQkJCQlNZXRob2RFbGVtZW50IGl0ZW0gPSAoTWV0aG9kRWxlbWVudCkgTGlicmFyeVV0aWwKLQkJCQkJCS51bndyYXAocmF3aXRlbSk7Ci0JCQkJCQkJCQotCQkJCVByb2Nlc3NFbGVtZW50SXRlbSBlbGVtZW50SXRlbSA9IG5ldyBQcm9jZXNzRWxlbWVudEl0ZW0ocmF3aXRlbSwgaXRlbSwgcGFyZW50SXRlbSk7Ci0KLQkJCQlpZiAoZGVidWcgJiYgaXNTdXByZXNzZWQgKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic3VwcHJlc3NlZDogIiArICsrc3VwQ291bnQgKyAiIDogIiAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShpdGVtKSAKLQkJCQkJCQkrICI6ICIgKyBlbGVtZW50SXRlbS5wYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkKLQkJCQl9Ci0KLQkJCQlJRWxlbWVudExheW91dCBsID0gZ2V0TGF5b3V0KGVsZW1lbnRJdGVtKTsKLQkJCQlpZiAoIGwgaW5zdGFuY2VvZiBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0ICkKLQkJCQl7CQkKLQkJCQkJaWYgKCBpc1N1cHJlc3NlZCApCi0JCQkJCXsKLQkJCQkJCVN0cmluZyByZWxQYXRoID0gKChBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0KWwpLmdldFJlbGF0aXZlUHJvY2Vzc1BhdGgoKTsKLQkJCQkJCWFjdF9kYXRhLnNldFN1cHByZXNzZWQocmVsUGF0aCk7Ci0JCQkJCX0gCi0JCQkJCWVsc2UgCi0JCQkJCXsJCQkJCi0JCQkJCQkvLyBvbmx5IGl0ZXJhdGUgdW4tc3VwcHJlc3NlZCBpdGVtCi0JCQkJCQkvLyBpZiB0aGUgbGF5b3V0IGlzIGFuIGFjdGl2aXR5IGxheW91dCwgY29sbGVjdCB0aGUgbGF5b3V0IGRhdGEgZm9yIGl0Ci0JCQkJCQlpZiAoIGwgaW5zdGFuY2VvZiBBY3Rpdml0eUxheW91dCApCi0JCQkJCQl7Ci0JCQkJCQkJKChBY3Rpdml0eUxheW91dClsKS5sb2FkTGF5b3V0RGF0YShhY3RfZGF0YS5nZXRQcm9jZXNzTGF5b3V0RGF0YSgpLCAKLQkJCQkJCQkJIGxvYWRXYnMsIGxvYWRUYnMsIGxvYWRXcGJzKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQkvLyBpbmV0ZXJhdGUgY2hpbGRyZW4sIG5vdCBqdXN0IGFjdGl2aXR5LCBhbnkgY2hpbGQgaW4gdGhlCi0JCQkJCQkJLy8gcmF3aXRlbSBzaG91bGQgYmUgaXRlcmF0ZWQsCi0JCQkJCQkJLy8gc3VjaCBhcyB0aGUgc3ViLWFydGlmYWN0cwotCQkJCQkJCWl0ZXJhdGVQcm9jZXNzSXRlbShlbGVtZW50SXRlbSwgYWN0X2RhdGEsIHNldHRpbmcsIGxvYWRXYnMsIGxvYWRUYnMsIGxvYWRXcGJzKTsJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0JCi0JCi0JLyoqCi0JICogZ2V0IGFsbCB0aGUgbGlua2VkIHRhc2tzLCByb2xlcywgYW5kIHdvcmtwcm9kdWN0cyBmb3IgdGhpcyBhY3Rpdml0eSBhbmQgYWxsIGl0J3MgYnJlYWtkb3duIGVsZW1lbnRzLCByZWN1cnNpdmVseS4KLQkgKiB0aGUgZWxlbWVudCBmb3VuZCBhcmUgbm90aWZpZWQgdmlhIElDb250ZW50VmFsaWRhdG9yLmFkZFJlZmVyZW5jZWRFbGVtZW50KCkKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaW5kQWxsTGlua2VkRWxlbWVudHMoKSB7Ci0JCS8vIGl0ZXJhdGUgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIGNvbGxlY3QgdGhlIGluZm8uCi0JCVByb2Nlc3MgcHJvYyA9IGdldE93bmluZ1Byb2Nlc3MoKTsKLQkJCi0JCS8vIG5lZWQgdG8gaGFuZGxlIHRoZSBzdXByZXNzZWQgYnJlYWtkb3duIGVsZW1lbnRzCi0JCS8vIHVzZSB0aGUgU3VwcmVzcyB1dGlsaXR5Ci0JCVN1cHByZXNzaW9uIHN1cCA9IGdldFN1cHByZXNzaW9uKHByb2MpOwotCi0JCS8vIHB1Ymxpc2ggdGhlIGNvbnNvbGlkYXRlZCB2aWV3Ci0JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBsYXlvdXRNYW5hZ2VyCi0JCQkJLmdldENCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJLy8gbmVlZCB0byBnZXQgdGhlIHJhdyBpdGVtIHByb3ZpZGVyIGZyb20gdGhlIGFkYXB0ZXIgZmFjdG9yeQotCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgoc3VwZXIucGF0aHMsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYgKCB3cmFwcGVyID09IG51bGwgKSB7Ci0JCQl3cmFwcGVyID0gc3VwZXIuZWxlbWVudDsKLQkJfQotCQkKLQkJZ2V0TGF5b3V0TWdyKCkuZ2V0VmFsaWRhdG9yKCkuYWRkUmVmZXJlbmNlZEVsZW1lbnQobnVsbCwgc3VwZXIuZWxlbWVudCk7Ci0KLQkJaXRlcmF0ZUl0ZW1Gb3JMaW5rZWRFbGVtZW50cyh3cmFwcGVyLCBhZGFwdGVyRmFjdG9yeSwgc3VwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaXRlcmF0ZUl0ZW1Gb3JMaW5rZWRFbGVtZW50cyhPYmplY3QgcGFyZW50T2JqLCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0JCQotCQlpZiAocGFyZW50T2JqIGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQlwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHBhcmVudE9iajsKLQkJfSBlbHNlIHsKLQkJCXByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJCXBhcmVudE9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJfQotCi0JCS8vIEVpdGhlciBkZWxlZ2F0ZSB0aGUgY2FsbCBvciByZXR1cm4gbm90aGluZy4KLQkJaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJQ29sbGVjdGlvbiBpdGVtcyA9IHByb3ZpZGVyLmdldENoaWxkcmVuKHBhcmVudE9iaik7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgcmF3aXRlbSA9IGl0Lm5leHQoKTsJCQkKLQkJCQotCQkJaWYgKCBzdXAuaXNTdXBwcmVzc2VkKHJhd2l0ZW0pICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlNZXRob2RFbGVtZW50IGl0ZW0gPSAoTWV0aG9kRWxlbWVudCkgTGlicmFyeVV0aWwKLQkJCQkJLnVud3JhcChyYXdpdGVtKTsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IG51bGw7Ci0JCQlpZiAoIGl0ZW0gaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvciApIHsKLQkJCQllID0gKChUYXNrRGVzY3JpcHRvcilpdGVtKS5nZXRUYXNrKCk7Ci0JCQl9IGVsc2UgaWYgKCBpdGVtIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IgKSB7Ci0JCQkJZSA9ICgoUm9sZURlc2NyaXB0b3IpaXRlbSkuZ2V0Um9sZSgpOwotCQkJfSBlbHNlIGlmICggaXRlbSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvciApIHsKLQkJCQllID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpaXRlbSkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCX0gCi0JCQkKLQkJCWlmICggZSAhPSBudWxsICkgewotCQkJCWdldExheW91dE1ncigpLmdldFZhbGlkYXRvcigpLmFkZFJlZmVyZW5jZWRFbGVtZW50KGl0ZW0sIGUpOwotCQkJfSAKLQkJCQkKLQkJCU1ldGhvZEVsZW1lbnQgcGFyZW50ID0gKE1ldGhvZEVsZW1lbnQpIExpYnJhcnlVdGlsLnVud3JhcChyYXdpdGVtKTsKLQkJCWdldExheW91dE1ncigpLmdldFZhbGlkYXRvcigpLmFkZFJlZmVyZW5jZWRFbGVtZW50KHBhcmVudCwgaXRlbSk7Ci0KLQkJCWl0ZXJhdGVJdGVtRm9yTGlua2VkRWxlbWVudHMocmF3aXRlbSwgYWRhcHRlckZhY3RvcnksIHN1cCk7Ci0JCX0KLQl9CQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BY3Rpdml0eUxheW91dERhdGEuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQWN0aXZpdHlMYXlvdXREYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMjFlMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BY3Rpdml0eUxheW91dERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIGNsYXNzIHRvIGhvbGQgcHJvY2VzcyBzcGVjaWZpYyBsYXlvdXQgZGF0YSBmb3IgZWFjaCBhY3Rpdml0eQotICogdGhlIGRhdGEgd2lsbCBiZSB3cml0ZSBvdXQgdG8gYSBqYXZhc2NyaXB0IG1hcCAKLSAqIHNvIHRoYXQgYWN0aXZpdHkgbGF5b3V0IGluIHRoZSBwdWJsaXNoZWQgc2l0ZSBjYW4gZ2V0IHRoZSBzdGF0dXMgZHluYW1pY2FsbHkuCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5TGF5b3V0RGF0YSB7Ci0KLQlwcml2YXRlIFByb2Nlc3NMYXlvdXREYXRhIHByb2NfZGF0YTsKLQkKLQlwdWJsaWMgU3RyaW5nIGFkX2ltZ19wYXRoID0gbnVsbDsKLQlwdWJsaWMgU3RyaW5nIGFkZF9pbWdfcGF0aCA9IG51bGw7Ci0JcHVibGljIFN0cmluZyB3cGRfaW1nX3BhdGggPSBudWxsOwotCQotCS8vIG1hcCBvZiBzdXByZXNzZWQgaXRlbSdzIHJlbGF0aXZlIHBhdGggdG8gdGhlIGN1cnJlbnQgYWN0aXZpdHkKLQlwcml2YXRlIExpc3Qgc3VwcmVzc2VkSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JLyoqCi0JICogY29uc3R1Y3RvcgotCSAqIEBwYXJhbSBwcm9jX2RhdGEKLQkgKiBAcGFyYW0gYWN0aXZpdHlfcGF0aAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eUxheW91dERhdGEoUHJvY2Vzc0xheW91dERhdGEgcHJvY19kYXRhLCBTdHJpbmcgYWN0aXZpdHlfcGF0aCkKLQl7Ci0JCXRoaXMucHJvY19kYXRhID0gcHJvY19kYXRhOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgUHJvY2Vzc0xheW91dERhdGEKLQkgKiBAcmV0dXJuIFByb2Nlc3NMYXlvdXREYXRhCi0JICovCi0JcHVibGljIFByb2Nlc3NMYXlvdXREYXRhIGdldFByb2Nlc3NMYXlvdXREYXRhKCkKLQl7Ci0JCXJldHVybiBwcm9jX2RhdGE7Ci0JfQotCQotCS8qKgotCSAqIHNldCBhY3Rpdml0eSBkaWFncmFtIHBhdGgKLQkgKiBAcGFyYW0gcGF0aCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eURpYWdyYW1QYXRoKFN0cmluZyBwYXRoKQotCXsKLQkJYWRfaW1nX3BhdGggPSBwYXRoOwotCX0KLQkKLQkvKioKLQkgKiBzZXQgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0gcGF0aAotCSAqIEBwYXJhbSBwYXRoIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbVBhdGgoU3RyaW5nIHBhdGgpCi0JewotCQlhZGRfaW1nX3BhdGggPSBwYXRoOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXUERlcGVuZGVuY3lEaWFncmFtUGF0aChTdHJpbmcgcGF0aCkKLQl7Ci0JCXdwZF9pbWdfcGF0aCA9IHBhdGg7Ci0JfQotCQotCS8qKgotCSAqIHNldCB0aGUgZWxlbWVudCdzIHJlbGF0aXZlIHBhdGggZm9yIHRoZSBzdXBwcmVzcyBlbGVtZW50Ci0JICogQHBhcmFtIGl0ZW1SZWxQYXRoCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3VwcHJlc3NlZChTdHJpbmcgaXRlbVJlbFBhdGgpCi0JewotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiU3VwcHJlc3NlZDogIiArIGFjdGl2aXR5X3BhdGggKyAiOiAiICsgaXRlbVJlbFBhdGgpOwotCQkKLQkJaWYgKCAhc3VwcmVzc2VkSXRlbXMuY29udGFpbnMoaXRlbVJlbFBhdGgpICkKLQkJewotCQkJc3VwcmVzc2VkSXRlbXMuYWRkKGl0ZW1SZWxQYXRoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHN1cHByZXNzZWQgZWxlbWVudHMKLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIFN0cmluZyBmb3IgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHN1cHByZXNzZWQgZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTdXBwcmVzc2VkSXRlbXMoKQotCXsKLQkJcmV0dXJuIHN1cHJlc3NlZEl0ZW1zOwotCX0KLQkKLQkvKioKLQkgKiBjaGVjayBpZiB0aGVyZSBpcyBhbnkgc3VwcHJlc3NlZCBpdGVtIGxvY2FsIHRvIHRoaXMgcHJvY2VzcwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0xvY2FsU3VwcHJlc3NlZCgpCi0JewotCQlyZXR1cm4gKHN1cHJlc3NlZEl0ZW1zLnNpemUoKSA+IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQXJ0aWZhY3RMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQXJ0aWZhY3RMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEyODY5Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0FydGlmYWN0TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhbiBBcnRpZmFjdC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdExheW91dCBleHRlbmRzIFdvcmtQcm9kdWN0TGF5b3V0IHsKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciBBcnRpZmFjdExheW91dAotCSAqCi0JICovCi0JcHVibGljIEFydGlmYWN0TGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9DaGVja2xpc3RMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQ2hlY2tsaXN0TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjM2M3NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9DaGVja2xpc3RMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgQ2hlY2tsaXN0LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGVja2xpc3RMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIGNoZWNrIGxpc3QgbGF5b3V0Ci0JICoKLQkgKi8KLQlwdWJsaWMgQ2hlY2tsaXN0TGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIGluaXRpYWxpemUgdGhlIGxheW91dAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCi0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewotCQkJTGlzdCBjb250ZW50RWxlbWVudHMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5DaGVja2xpc3RfQ29udGVudEVsZW1lbnRzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQotCQkJTGlzdCBhY3Rpdml0aWVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuQ2hlY2tsaXN0X0JyZWFrZG93bkVsZW1lbnRzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQotCQkJY29udGVudEVsZW1lbnRzLmFkZEFsbChhY3Rpdml0aWVzKTsKLQotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5DaGVja2xpc3RfQ29udGVudEVsZW1lbnRzLCBlbGVtZW50WG1sLCAiY29udGVudEVsZW1lbnRzIiwgY29udGVudEVsZW1lbnRzKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQ29uY2VwdExheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Db25jZXB0TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NmM2NWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Db25jZXB0TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIENvbmNlcHQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmNlcHRMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JLyoqCi0JICogY29uc3RydWN0IGEgbGF5b3V0IGZvciBDb25jZXB0Ci0JICoKLQkgKi8KLQlwdWJsaWMgQ29uY2VwdExheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBpbml0aWFsaXplIHRoZSBsYXlvdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuQ29uY2VwdF9Db250ZW50RWxlbWVudHMsIGxheW91dE1hbmFnZXIKLQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCi0JCQlMaXN0IGFjdGl2aXRpZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Db25jZXB0X0JyZWFrZG93bkVsZW1lbnRzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQotCQkJY29udGVudEVsZW1lbnRzLmFkZEFsbChhY3Rpdml0aWVzKTsKLQkJCQotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5Db25jZXB0X0NvbnRlbnRFbGVtZW50cywgZWxlbWVudFhtbCwgImNvbnRlbnRFbGVtZW50cyIsIGNvbnRlbnRFbGVtZW50cyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGVsaXZlcmFibGVMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGVsaXZlcmFibGVMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I1NTU2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0RlbGl2ZXJhYmxlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIERlbGl2ZXJhYmxlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJhYmxlTGF5b3V0IGV4dGVuZHMgV29ya1Byb2R1Y3RMYXlvdXQgewotCi0JLyoqCi0JICogbGF5b3V0IGZvciBEZWxpdmVyYWJsZQotCSAqCi0JICovCi0JcHVibGljIERlbGl2ZXJhYmxlTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9EZXNjcmlwdG9yRGVzY3JpcHRpb25MYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGVzY3JpcHRvckRlc2NyaXB0aW9uTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMzVmNWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9EZXNjcmlwdG9yRGVzY3JpcHRpb25MYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogbGF5b3V0IGNsYXNzIGZvciBkZXNjcmlwdG9yIGNvbnRlbnRzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yRGVzY3JpcHRpb25MYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JTWV0aG9kRWxlbWVudCBkZXNjcmlwdG9yOwotCU1ldGhvZEVsZW1lbnQgbGlua2VkRWxlbWVudDsKLQlBYnN0cmFjdEVsZW1lbnRMYXlvdXQgbGlua2VkRGVzY3JpcHRpb25MYXlvdXQgPSBudWxsOwotCi0JLyoqCi0JICogbGF5b3V0IGZvciBkZXNjcmlwdG9ycwotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JEZXNjcmlwdGlvbkxheW91dChNZXRob2RFbGVtZW50IGRlc2NyaXB0b3IpIHsKLQkJdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLQl9Ci0JCi0JLyoqCi0JICogaW5pdGlhbGl6ZSB0aGUgbGF5b3V0Ci0JICovCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCQkKLQkJc3VwZXIudGFyZ2V0RWxlbWVudCA9IGRlc2NyaXB0b3I7Ci0JCXN1cGVyLm93bmVyRWxlbWVudCA9IGRlc2NyaXB0b3I7Ci0JCQotCQlpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlsaW5rZWRFbGVtZW50ID0gKChUYXNrRGVzY3JpcHRvcikgZGVzY3JpcHRvcikuZ2V0VGFzaygpOwotCQl9IGVsc2UgaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJbGlua2VkRWxlbWVudCA9ICgoUm9sZURlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldFJvbGUoKTsKLQkJfSBlbHNlIGlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQlsaW5rZWRFbGVtZW50ID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldFdvcmtQcm9kdWN0KCk7Ci0JCX0KLQkJCi0JCS8vIGdldCB0aGUgcmVhbGl6ZWQgb25lCi0JCS8vIDE5NjA5NCAtIFRhc2sgZGVzY3JpcHRvciBwYWdlIHNob3VsZCBzaG93IHRoZSByZWFsaXplZCBjb250ZW50IG9mIHRoZSBsaW5rZWQgZWxlbWVudAotCQlsaW5rZWRFbGVtZW50ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChsaW5rZWRFbGVtZW50LCBsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQotCQlpZiAobGlua2VkRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlsaW5rZWREZXNjcmlwdGlvbkxheW91dCA9IG5ldyBHZW5lcmFsTGF5b3V0KCk7Ci0JCQlsaW5rZWREZXNjcmlwdGlvbkxheW91dC5pbml0KGxheW91dE1hbmFnZXIsICgoRGVzY3JpYmFibGVFbGVtZW50KWxpbmtlZEVsZW1lbnQpLmdldFByZXNlbnRhdGlvbigpKTsKLQkJCWxpbmtlZERlc2NyaXB0aW9uTGF5b3V0LnNldENvbnRlbnRUYXJnZXQoZGVzY3JpcHRvcik7Ci0JCQlsaW5rZWREZXNjcmlwdGlvbkxheW91dC5zZXRFbGVtZW50T3duZXIobGlua2VkRWxlbWVudCk7CQkKLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgbG9hZEF0dHJpYnV0ZXMoWG1sRWxlbWVudCBlbGVtZW50WG1sKSB7Ci0KLQkJTWFwIGZlYXR1cmVWYWx1ZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoZWxlbWVudCk7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCS8vIGdldCBhbGwgc3RyaW5nIHR5cGUgYXR0cmlidXRlcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBwID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwkJCQotCQkJCWlmICghKHAgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSApIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCS8vRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSlwOwotCQkJCVN0cmluZyBuYW1lID0gcC5nZXROYW1lKCk7Ci0JCQkJCQkJCQotCQkJCU9iamVjdCB2YWx1ZTsKLQkJCQlpZiAobmFtZS5lcXVhbHMoInByZXNlbnRhdGlvbk5hbWUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJLy8gdmFsdWUgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZWxlbWVudCk7Ci0JCQkJCXZhbHVlID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQsCi0JCQkJCQkJbGF5b3V0TWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gZ2V0QXR0cmlidXRlRmVhdHVyZVZhbHVlKHApOwotCQkJCX0KLQkJCQkKLQkJCQlmZWF0dXJlVmFsdWVNYXAucHV0KG5hbWUsIHZhbHVlKTsKLQkJCX0KLQkJfQotCQkKLQkJU3RyaW5nIHJlZmluZWREZXNjTmFtZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpLmdldE5hbWUoKTsKLQkJU3RyaW5nIG1haW5EZXNjTmFtZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkuZ2V0TmFtZSgpOwotCQkKLQkJLy8gbm93LCBnZXQgdGhlIGZlYXR1cmUgdmFsdWUgZnJvbSB0aGUgbGluayBlbGVtZW50J3MgZGVjcmlwdGlvbgotCQlmZWF0dXJlcyA9IG51bGw7Ci0JCWlmICggKCBsaW5rZWREZXNjcmlwdGlvbkxheW91dCE9bnVsbCApICYmIChsaW5rZWREZXNjcmlwdGlvbkxheW91dC5nZXRFbGVtZW50KCkgIT0gbnVsbCkgKSB7Ci0vLwkJCXByb3BlcnRpZXMgPSBsaW5rZWREZXNjcmlwdGlvbkxheW91dC5nZXRFbGVtZW50KCkuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCQlmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhsaW5rZWREZXNjcmlwdGlvbkxheW91dC5nZXRFbGVtZW50KCkpOwotCQl9Ci0JCQotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJLy8gZ2V0IGFsbCBzdHJpbmcgdHlwZSBhdHRyaWJ1dGVzCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHAgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7CQkJCi0JCQkJaWYgKCEocCBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpICkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJLy9FQXR0cmlidXRlIGF0dHJpYiA9IChFQXR0cmlidXRlKXA7Ci0JCQkJU3RyaW5nIG5hbWUgPSBwLmdldE5hbWUoKTsKLQkJCQlpZiAoIG5hbWUuZXF1YWxzKG1haW5EZXNjTmFtZSkgKSB7Ci0JCQkJCW5hbWUgPSByZWZpbmVkRGVzY05hbWU7Ci0JCQkJfQotCQkJCQotCQkJCU9iamVjdCB2YWx1ZSA9IGZlYXR1cmVWYWx1ZU1hcC5nZXQobmFtZSk7Ci0JCQkJaWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoKCkgPT0gMCApIHsKLQkJCQkJdmFsdWUgPSBsaW5rZWREZXNjcmlwdGlvbkxheW91dC5nZXRBdHRyaWJ1dGVGZWF0dXJlVmFsdWUocCk7Ci0JCQkJCWZlYXR1cmVWYWx1ZU1hcC5wdXQobmFtZSwgdmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gbm93IHNldCB0aGUgdmFsdWVzCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBmZWF0dXJlVmFsdWVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSlpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpZW50cnkuZ2V0S2V5KCk7Ci0JCQlPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJZWxlbWVudFhtbC5uZXdDaGlsZCgiYXR0cmlidXRlIikJLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKQkJLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRWYWx1ZSgodmFsdWUgPT0gbnVsbCkgPyAiIiA6IHZhbHVlLnRvU3RyaW5nKCkpOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0Rlc2NyaXB0b3JMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGVzY3JpcHRvckxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWEwMmYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGVzY3JpcHRvckxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIGJhc2UgbGF5b3V0IGNsYXNzIGZvciBkZXNjcmlwdG9ycwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERlc2NyaXB0b3JMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+IGV4dHJhRmVhdHVyZXNGcm9tQ29udGVudEVsZW1lbnQgPSBBcnJheXMuYXNMaXN0KG5ldyBFU3RydWN0dXJhbEZlYXR1cmVbXSB7Ci0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpCQotCX0pOwotCi0JTWV0aG9kRWxlbWVudCBsaW5rZWRFbGVtZW50ID0gbnVsbDsKLQotCUFic3RyYWN0RWxlbWVudExheW91dCBlbGVtZW50TGF5b3V0ID0gbnVsbDsKLQkKLQlwcm90ZWN0ZWQgdm9pZCBfX2luaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0KLQkJLy8gMTk2MDk0IC0gVGFzayBkZXNjcmlwdG9yIHBhZ2Ugc2hvdWxkIHNob3cgdGhlIHJlYWxpemVkIGNvbnRlbnQgb2YgdGhlIGxpbmtlZCBlbGVtZW50Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCWxpbmtlZEVsZW1lbnQgPSAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRUYXNrKCk7Ci0JCQlsaW5rZWRFbGVtZW50ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChsaW5rZWRFbGVtZW50LCBsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWlmIChsaW5rZWRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQllbGVtZW50TGF5b3V0ID0gbmV3IFRhc2tMYXlvdXQoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCWxpbmtlZEVsZW1lbnQgPSAoKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRSb2xlKCk7Ci0JCQlsaW5rZWRFbGVtZW50ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChsaW5rZWRFbGVtZW50LCBsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWlmIChsaW5rZWRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQllbGVtZW50TGF5b3V0ID0gbmV3IFJvbGVMYXlvdXQoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQlsaW5rZWRFbGVtZW50ID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQlsaW5rZWRFbGVtZW50ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChsaW5rZWRFbGVtZW50LCBsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWlmIChsaW5rZWRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQllbGVtZW50TGF5b3V0ID0gbmV3IFdvcmtQcm9kdWN0TGF5b3V0KCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZWxlbWVudExheW91dCAhPSBudWxsKSB7Ci0JCQllbGVtZW50TGF5b3V0LmluaXQobGF5b3V0TWFuYWdlciwgbGlua2VkRWxlbWVudCk7Ci0JCQllbGVtZW50TGF5b3V0LnNldENvbnRlbnRUYXJnZXQoZWxlbWVudCk7Ci0JCX0JCi0JCQotCQkvLyBtYWtlIHN1cmUgdGhlIGxpbmtlZCBlbGVtZW50IGlzIGxvYWRlZAotCQlpZiAoIGxpbmtlZEVsZW1lbnQgIT0gbnVsbCApIHsKLQkJCWZvciAoSXRlcmF0b3I8RU9iamVjdD4gaXRlciA9IGxpbmtlZEVsZW1lbnQuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWl0ZXIubmV4dCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogZm9yIGRlc2NyaXB0b3JzLCBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBkZWZpbmVkLCBnZXQgZnJvbSB0aGUgbGliZWQKLQkgKiBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGZlYXR1cmUgRVN0cnVjdHVyYWxGZWF0dXJlCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlPYmplY3QgdmFsdWUgPSBzdXBlci5nZXRBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoZmVhdHVyZSk7Ci0JCWlmICgoZWxlbWVudExheW91dCA9PSBudWxsKSB8fCAodmFsdWUgIT0gbnVsbCkKLQkJCQkmJiAodmFsdWUudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApKSB7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQotCQkvLyBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBkZWZpbmVkLCBncmFiIHRoZSBhdHRyaWJ1dGUgdmFsdWUgZnJvbSB0aGUKLQkJLy8gbGlua2VkIGVsZW1lbnQKLQkJLy8gc3BlY2lmaWVkIGF0dHJpYnV0ZXMgb25seS4gQWRkIG1vcmUgZmVhdHVyZSBoZXJlIGlmIG5lZWRlZAotCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSkgewotCQkJcmV0dXJuIGVsZW1lbnRMYXlvdXQuZ2V0QXR0cmlidXRlRmVhdHVyZVZhbHVlKGZlYXR1cmUpOwotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbGF5b3V0IGZvciBhIGNoaWxkIGVsZW1lbnQgb2YgdGhpcyBlbGVtZW50Ci0JICogQWN0aXZpdHlFbGVtZW50TGF5b3V0IHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgbGF5b3V0IHdpdGggbm9kZSBwYXRoCi0JICogQHBhcmFtIGNoaWxkCi0JICogQHJldHVybiBJRWxlbWVudExheW91dAotCSAqLwotCXByb3RlY3RlZCBJRWxlbWVudExheW91dCBnZXRDaGlsZExheW91dChNZXRob2RFbGVtZW50IGNoaWxkKQotCXsKLQkJaWYgKCBsYXlvdXRNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpIAotCQkJCSYmIChjaGlsZCBpbnN0YW5jZW9mIERlc2NyaXB0b3JEZXNjcmlwdGlvbikgKSB7Ci0JCQlEZXNjcmlwdG9yRGVzY3JpcHRpb25MYXlvdXQgbCA9IG5ldyBEZXNjcmlwdG9yRGVzY3JpcHRpb25MYXlvdXQodGhpcy5lbGVtZW50KTsKLQkJCWwuaW5pdChsYXlvdXRNYW5hZ2VyLCBjaGlsZCk7Ci0JCQlyZXR1cm4gbDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBsYXlvdXRNYW5hZ2VyLmdldExheW91dChjaGlsZCwgdHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRFeHRyYUZlYXR1cmVzRnJvbUNvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gZXh0cmFGZWF0dXJlc0Zyb21Db250ZW50RWxlbWVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRGZWF0dXJlVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUpIHsKLQkJCi0JCVN1cHByZXNzaW9uIHN1cCA9IHN1cGVyLmdldFN1cHByZXNzaW9uKHN1cGVyLm93bmluZ1Byb2Nlc3MpOwotCQlpZiAoIHN1cCAhPSBudWxsICkgewotCQkJLy8gY2hlY2sgc3VwcHJlc3Npb24KLQkJCWlmICggdmFsdWUgaW5zdGFuY2VvZiBMaXN0ICkgewotCQkJCUxpc3QgaXRlbXMgPSAoTGlzdCl2YWx1ZTsKLQkJCQlpbnQgaSA9IDA7Ci0JCQkJd2hpbGUgKCBpIDwgaXRlbXMuc2l6ZSgpICkgewotCQkJCQlPYmplY3QgdiA9IGl0ZW1zLmdldChpKTsKLQkJCQkJaWYgKCBpc1N1cHByZXNzZWQoc3VwLCBmZWF0dXJlLCB2KSApIHsKLQkJCQkJCWl0ZW1zLnJlbW92ZShpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWkrKzsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAoIGl0ZW1zLnNpemUoKSA9PSAwICkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIGlzU3VwcHJlc3NlZChzdXAsIGZlYXR1cmUsIHZhbHVlKSApIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmFjY2VwdEZlYXR1cmVWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzU3VwcHJlc3NlZChTdXBwcmVzc2lvbiBzdXAsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yICkgewotCQkJcmV0dXJuIHN1cC5pc1N1cHByZXNzZWQoZWxlbWVudCk7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNUYXNrT3Bwb3NpdGVGZWF0dXJlKE9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiAoZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlRGVzY3JpcHRvcl9QcmltYXJ5VGFza0Rlc2NyaXB0b3JzKQotCQl8fCAoIGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfQWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycykKLQkJfHwgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX0Fzc2lzdHNJbl9UYXNrRGVzY3JpcHRvcnMpCi0JCXx8ICggZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycykKLQkJfHwgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycykKLQkJfHwgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzKQotCQl8fCAoIGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb21fVGFza0Rlc2NyaXB0b3JzKTsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9EaXNjaXBsaW5lTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0Rpc2NpcGxpbmVMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIyZWVkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0Rpc2NpcGxpbmVMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUxheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgRGlzY2lwbGluZUxheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0xheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjOWVlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0xheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYSBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7CQkJCQkJCi0JCQlMaXN0IHRhc2tzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX1Rhc2tzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX1Rhc2tzLCBlbGVtZW50WG1sLCAiY29udGVudEVsZW1lbnRzIiwgdGFza3MpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCUxpc3Qgd29ya1Byb2R1Y3RzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX1dvcmtQcm9kdWN0cywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc19Xb3JrUHJvZHVjdHMsIGVsZW1lbnRYbWwsICJjb250ZW50RWxlbWVudHMiLCB3b3JrUHJvZHVjdHMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9FeGFtcGxlTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0V4YW1wbGVMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQwZWI2Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0V4YW1wbGVMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYW4gRXhhbXBsZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhhbXBsZUxheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgRXhhbXBsZUxheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuRXhhbXBsZV9Db250ZW50RWxlbWVudHMsIGxheW91dE1hbmFnZXIKLQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJCi0JCQlMaXN0IGFjdGl2aXRpZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5FeGFtcGxlX0JyZWFrZG93bkVsZW1lbnRzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQotCQkJY29udGVudEVsZW1lbnRzLmFkZEFsbChhY3Rpdml0aWVzKTsKLQkJCQotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5FeGFtcGxlX0NvbnRlbnRFbGVtZW50cywgZWxlbWVudFhtbCwgImNvbnRlbnRFbGVtZW50cyIsIGNvbnRlbnRFbGVtZW50cyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJR3VpZGFuY2UgZ3VpZGFuY2UgPSAoR3VpZGFuY2UpIHN1cGVyLmVsZW1lbnQ7Ci0JCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCQkKLQkJCQkvLyBBdXRob3Jpbmc6ICBUZW1wbGF0ZSBhdHRhY2htZW50cyBvZiBhIGNvbnRyaWJ1dGluZyB0ZW1wbGF0ZSBndWlkYW5jZSBlbGVtZW50IGFyZSBub3QgYXBwZW5kZWQgdG8gdGhlIGJhc2UgbGlzdCBvZiBhdHRhY2htZW50cwkJCQkKLQkJCQkvL1N0cmluZyBhdHRhY2htZW50U3RyaW5nID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24pY29udGVudCkuZ2V0QXR0YWNobWVudHMoKTsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKTsKLQkJCQlTdHJpbmcgYXR0YWNobWVudFN0cmluZyA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKGNvbnRlbnQsIHN1cGVyLmVsZW1lbnQsIGZlYXR1cmUsIHN1cGVyLmxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlpZiAoIChhdHRhY2htZW50U3RyaW5nICE9IG51bGwpICYmIChhdHRhY2htZW50U3RyaW5nLmluZGV4T2YoQ29uZmlndXJhdGlvbkhlbHBlci5BVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SKSA+IDApICkKLQkJCQl7Ci0JCQkJCWF0dGFjaG1lbnRTdHJpbmcgPSBhdHRhY2htZW50U3RyaW5nLnJlcGxhY2VBbGwoQ29uZmlndXJhdGlvbkhlbHBlci5BVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SLCBUbmdVdGlsLkdVSURBTkNFX0ZJTEVTVFJJTkdfU0VQQVJBVE9SKTsgCi0JCQkJfQotCQkJCUxpc3QgYXR0YWNobWVudExpc3QgPSBUbmdVdGlsLmNvbnZlcnRHdWlkYW5jZUF0dGFjaG1lbnRzVG9MaXN0KGF0dGFjaG1lbnRTdHJpbmcpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGF0dGFjaG1lbnRMaXN0Lml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVN0cmluZyBhdHRhY2htZW50RmlsZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoYXR0YWNobWVudEZpbGUgIT0gbnVsbCkgewotCQkJCQkJTWF0Y2hlciBtID0gUmVzb3VyY2VIZWxwZXIucF90ZW1wbGF0ZV9hdHRhY2htZW50X3VybC5tYXRjaGVyKGF0dGFjaG1lbnRGaWxlKTsKLQkJCQkJCWlmICghbS5maW5kKCkpIHsKLQkJCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVXRpbC5nZXRGaWxlTmFtZShhdHRhY2htZW50RmlsZSk7Ci0JCQkJCQkJZWxlbWVudFhtbC5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkiYXR0YWNoZWRGaWxlIikuc2V0QXR0cmlidXRlKCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkidXJsIiwgImZpbGU6Ly8iICsgYXR0YWNobWVudEZpbGUpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJCQkJCS5zZXRBdHRyaWJ1dGUoImZpbGVOYW1lIiwgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCVN0cmluZyBmaWxlTmFtZSA9IG0uZ3JvdXAoMik7Ci0JCQkJCQkJZWxlbWVudFhtbC5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkiYXR0YWNoZWRGaWxlIikuc2V0QXR0cmlidXRlKCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkidXJsIiwgbS5ncm91cCgxKSkgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQkJCS5zZXRBdHRyaWJ1dGUoImZpbGVOYW1lIiwgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci19Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9HZW5lcmFsTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0dlbmVyYWxMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU2NzNkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0dlbmVyYWxMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhbExheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgR2VuZXJhbExheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0d1aWRlbGluZUxheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9HdWlkZWxpbmVMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg0N2QwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0d1aWRlbGluZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYSBHdWlkZWxpbmUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEd1aWRlbGluZUxheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgR3VpZGVsaW5lTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCi0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewotCQkJTGlzdCBjb250ZW50RWxlbWVudHMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5HdWlkZWxpbmVfQ29udGVudEVsZW1lbnRzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQotCQkJTGlzdCBhY3Rpdml0aWVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuR3VpZGVsaW5lX0JyZWFrZG93bkVsZW1lbnRzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQotCQkJY29udGVudEVsZW1lbnRzLmFkZEFsbChhY3Rpdml0aWVzKTsKLQotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5HdWlkZWxpbmVfQ29udGVudEVsZW1lbnRzLCBlbGVtZW50WG1sLCAiY29udGVudEVsZW1lbnRzIiwgY29udGVudEVsZW1lbnRzKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvT3V0Y29tZUxheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9PdXRjb21lTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NDk5YTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9PdXRjb21lTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIE91dGNvbWUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3V0Y29tZUxheW91dCBleHRlbmRzIFdvcmtQcm9kdWN0TGF5b3V0IHsKLQotCXB1YmxpYyBPdXRjb21lTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Qcm9jZXNzRWxlbWVudEl0ZW0uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJvY2Vzc0VsZW1lbnRJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMjk5MzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Qcm9jZXNzRWxlbWVudEl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBzaW1wbGUgaG9sZGVyIG9mIHByb2Nlc3MgZWxlbWVudCBpdGVtIGluZm8KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NFbGVtZW50SXRlbSB7Ci0JCi0JcHVibGljIE9iamVjdCByYXdJdGVtID0gbnVsbDsKLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQlwdWJsaWMgU3RyaW5nIHBhdGggPSBudWxsOwotCXB1YmxpYyBTdHJpbmcgcHJvY19ndWlkID0gbnVsbDsKLQkKLQlwdWJsaWMgUHJvY2Vzc0VsZW1lbnRJdGVtKE9iamVjdCByYXdJdGVtLCBNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwYXRoKQotCXsKLQkJdGhpcy5yYXdJdGVtID0gcmF3SXRlbTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJdGhpcy5wcm9jX2d1aWQgPSBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0LmdldE93bmluZ1Byb2Nlc3NHdWlkRnJvbVBhdGgocGF0aCk7Ci0JfQotCQotCXB1YmxpYyBQcm9jZXNzRWxlbWVudEl0ZW0oT2JqZWN0IHJhd0l0ZW0sIE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgUHJvY2Vzc0VsZW1lbnRJdGVtIHBhcmVudCkKLQl7Ci0JCXRoaXMucmF3SXRlbSA9IHJhd0l0ZW07Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMucGF0aCA9IEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQubWFrZVBhdGgocGFyZW50LnBhdGgsIHRoaXMuZWxlbWVudCk7IC8vIG1ha2UgcGF0aCBoZXJlCi0JCXRoaXMucHJvY19ndWlkID0gcGFyZW50LnByb2NfZ3VpZDsJCQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlTdHJpbmcoKQotCXsKLQkJcmV0dXJuIEVsZW1lbnRMYXlvdXRNYW5hZ2VyLmdldFF1ZXJ5U3RyaW5nKHByb2NfZ3VpZCwgcGF0aCk7CQkKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Byb2Nlc3NMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJvY2Vzc0xheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjVkODA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJvY2Vzc0xheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgUm9sZS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0xheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgUHJvY2Vzc0xheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KCk7Ci0KLQkJaWYgKCFpbmNsdWRlUmVmZXJlbmNlcykgewotCQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JCX0KLQotCQkvLyBidWlsZCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSB0cmVlCi0JCVhtbEVsZW1lbnQgYnMgPSBlbGVtZW50WG1sCi0JCQkJLm5ld0NoaWxkKCJicmVha2Rvd24iKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiV29yayBCcmVha2Rvd24gU3RydWN0dXJlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlpdGVyYXRlKHN1cGVyLmVsZW1lbnQsIGJzLCBhZGFwdGVyRmFjdG9yeSk7Ci0KLQkJYnMgPSBlbGVtZW50WG1sCi0JCQkJLm5ld0NoaWxkKCJicmVha2Rvd24iKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJaXRlcmF0ZShzdXBlci5lbGVtZW50LCBicywgYWRhcHRlckZhY3RvcnkpOwotCi0JCWJzID0gZWxlbWVudFhtbAotCQkJCS5uZXdDaGlsZCgiYnJlYWtkb3duIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgIldvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJaXRlcmF0ZShzdXBlci5lbGVtZW50LCBicywgYWRhcHRlckZhY3RvcnkpOwotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCS8qKgotCSAqIGl0ZXJhdGUgdGhlIGJyZWFrIGRvd24gc3RydWN0dXJlIGFuZCBidWlsZCB0aGUgeG1sIGRvY3VtZW50Ci0JICogCi0JICogQHBhcmFtIHBhcmVudE9iagotCSAqIEBwYXJhbSBwYXJlbnRYbWwKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwcml2YXRlIHZvaWQgaXRlcmF0ZShPYmplY3QgcGFyZW50T2JqLCBYbWxFbGVtZW50IHBhcmVudFhtbCwKLQkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQocGFyZW50T2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyBFaXRoZXIgZGVsZWdhdGUgdGhlIGNhbGwgb3IgcmV0dXJuIG5vdGhpbmcuCi0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGl0ZW1zID0gcHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGFyZW50T2JqKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBpdGVtID0gKE1ldGhvZEVsZW1lbnQpIExpYnJhcnlVdGlsLnVud3JhcChpdAotCQkJCQkJLm5leHQoKSk7Ci0JCQkJLy8gc3VwZXIucHJvY2Vzc0NoaWxkKHBhcmVudFhtbCwgaXRlbSwgZmFsc2UpOwotCQkJCUlFbGVtZW50TGF5b3V0IGwgPSBsYXlvdXRNYW5hZ2VyLmdldExheW91dChpdGVtLCB0cnVlKTsKLQkJCQlpZiAobCAhPSBudWxsKSB7Ci0JCQkJCVhtbEVsZW1lbnQgY2hpbGQgPSBsLmdldFhtbEVsZW1lbnQoZmFsc2UpOwotCQkJCQlwYXJlbnRYbWwuYWRkQ2hpbGQoY2hpbGQpOwotCi0JCQkJCS8vIGluZXRlcmF0ZSBjaGlsZHJlbgotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlpdGVyYXRlKGl0ZW0sIGNoaWxkLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Qcm9jZXNzTGF5b3V0RGF0YS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Qcm9jZXNzTGF5b3V0RGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjY4MzU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJvY2Vzc0xheW91dERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLQotLyoqCi0gKiAKLSAqIGNsYXNzIHRvIGhvbGQgcHJvY2VzcyBzcGVjaWZpYyBsYXlvdXQgZGF0YSBmb3IgZWFjaCBhY3Rpdml0eQotICogdGhlIGRhdGEgd2lsbCBiZSB3cml0ZSBvdXQgdG8gYSBqYXZhc2NyaXB0IG1hcCAKLSAqIHNvIHRoYXQgYWN0aXZpdHkgbGF5b3V0IGluIHRoZSBwdWJsaXNoZWQgc2l0ZSBjYW4gZ2V0IHRoZSBzdGF0dXMgZHluYW1pY2FsbHkuCi0gKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NMYXlvdXREYXRhIHsKLQotCU1hcCBhY3Rpdml0eU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JLyoqCi0JICogY29uc3RydWN0b3IKLQkgKiBAcGFyYW0gcHJvY19ndWlkCi0JICovCi0JcHVibGljIFByb2Nlc3NMYXlvdXREYXRhKFN0cmluZyBwcm9jX2d1aWQpCi0JewotCX0KLQkKLQkvKioKLQkgKiBjaGVjayBpZiBpdCBjb250YWlucyB0aGUgYWN0aXZpdHkgbGF5b3V0IG9mIHRoZSBzcGVjaWZpZWQgcGF0aAotCSAqIEBwYXJhbSBhY3Rpdml0eV9wYXRoIFN0cmluZwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FjdGl2aXR5TGF5b3V0KFN0cmluZyBhY3Rpdml0eV9wYXRoKQotCXsKLQkJcmV0dXJuIGFjdGl2aXR5TWFwLmNvbnRhaW5zS2V5KGFjdGl2aXR5X3BhdGgpOwotCX0KLQkKLQkvKioKLQkgKiBjcmVhdGUgYW4gQWN0aXZpdHlMYXlvdXREYXRhIGZvciB0aGUgYWN0aXZpdHkgcGF0aAotCSAqIEBwYXJhbSBhY3Rpdml0eV9wYXRoIFN0cmluZwotCSAqIEByZXR1cm4gQWN0aXZpdHlMYXlvdXREYXRhCi0JICovCi0JcHVibGljIEFjdGl2aXR5TGF5b3V0RGF0YSBjcmVhdGVBY3Rpdml0eUxhdW91dERhdGEoU3RyaW5nIGFjdGl2aXR5X3BhdGgpCi0JewotCQlBY3Rpdml0eUxheW91dERhdGEgZGF0YSA9IChBY3Rpdml0eUxheW91dERhdGEpYWN0aXZpdHlNYXAuZ2V0KGFjdGl2aXR5X3BhdGgpOwotCQlpZiAoIGRhdGEgPT0gbnVsbCApCi0JCXsKLQkJCWRhdGEgPSBuZXcgQWN0aXZpdHlMYXlvdXREYXRhKHRoaXMsIGFjdGl2aXR5X3BhdGgpOwotCQkJYWN0aXZpdHlNYXAucHV0KGFjdGl2aXR5X3BhdGgsIGRhdGEpOwotCQl9Ci0JCQotCQlyZXR1cm4gZGF0YTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGEgbWFwIG9mIHRoZSBhY3Rpdml0eSBsYXlvdXQgZGF0YQotCSAqIEByZXR1cm4gTWFwCi0JICovCi0JcHVibGljIE1hcCBnZXRBY3Rpdml0eUxheW91dERhdGFNYXAoKQotCXsKLQkJcmV0dXJuIGFjdGl2aXR5TWFwOwotCX0KLQkKLQkvKioKLQkgKiBwcmludCB0aGUgaW5mbyB0byBhIGphdmFzY3JpcHQgZmlsZSBpbiB0aGUgcHVibGlzaGVkIHNpdGUuIAotCSAqIFRoZXNlIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGxheW91dCBvZiBwcm9jZXNzIGVsZW1lbnRzLgotCSAqIEBwYXJhbSBwcyBQcmludFdyaXRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50KFByaW50V3JpdGVyIHBzKQotCXsKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBhY3Rpdml0eU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotCQl7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWl0Lm5leHQoKTsKLQkJCVN0cmluZyBhY3Rpdml0eV9wYXRoID0gKFN0cmluZyllbnRyeS5nZXRLZXkoKTsKLQkJCUFjdGl2aXR5TGF5b3V0RGF0YSBkYXRhID0gKEFjdGl2aXR5TGF5b3V0RGF0YSllbnRyeS5nZXRWYWx1ZSgpOwotCQkJaWYgKCBkYXRhLmFkX2ltZ19wYXRoICE9IG51bGwgKQotCQkJewotCQkJCVN0cmluZyBrZXkgPSBhY3Rpdml0eV9wYXRoICsgUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XOwotCQkJCXByaW50SW1nRmlsZShwcywga2V5LCBkYXRhLmFkX2ltZ19wYXRoKTsKLQkJCX0KLQkJCQotCQkJaWYgKCBkYXRhLmFkZF9pbWdfcGF0aCAhPSBudWxsICkKLQkJCXsKLQkJCQlTdHJpbmcga2V5ID0gYWN0aXZpdHlfcGF0aCArIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUw7Ci0JCQkJcHJpbnRJbWdGaWxlKHBzLCBrZXksIGRhdGEuYWRkX2ltZ19wYXRoKTsKLQkJCX0KLQkJCQotCQkJaWYgKCBkYXRhLndwZF9pbWdfcGF0aCAhPSBudWxsICkKLQkJCXsKLQkJCQlTdHJpbmcga2V5ID0gYWN0aXZpdHlfcGF0aCArIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZOwotCQkJCXByaW50SW1nRmlsZShwcywga2V5LCBkYXRhLndwZF9pbWdfcGF0aCk7Ci0JCQl9Ci0KLQkJCWlmICggZGF0YS5nZXRTdXBwcmVzc2VkSXRlbXMoKS5zaXplKCkgPiAwICkKLQkJCXsKLQkJCQlmb3IgKCBJdGVyYXRvciBpdDIgPSBkYXRhLmdldFN1cHByZXNzZWRJdGVtcygpLml0ZXJhdG9yKCk7IGl0Mi5oYXNOZXh0KCk7ICkKLQkJCQl7Ci0JCQkJCVN0cmluZyByZWxQYXRoID0gKFN0cmluZylpdDIubmV4dCgpOwotCQkJCQlTdHJpbmcga2V5ID0gYWN0aXZpdHlfcGF0aCArIHJlbFBhdGg7Ci0JCQkJCXByaW50U3VwcHJlc3NlZEl0ZW0ocHMsIGtleSk7Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwcmludEltZ0ZpbGUoUHJpbnRXcml0ZXIgcHMsIFN0cmluZyBrZXksIFN0cmluZyBmaWxlTmFtZSkKLQl7Ci0JCVN0cmluZyBsaW5lID0gImNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLmltYWdlRmlsZXNbXCIiICsga2V5ICsgIlwiXT1cIiIgKyBmaWxlTmFtZSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXBzLnByaW50bG4obGluZSk7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKGxpbmUpOwotCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHByaW50U3VwcHJlc3NlZEl0ZW0oUHJpbnRXcml0ZXIgcHMsIFN0cmluZyBrZXkpCi0JewotCQlTdHJpbmcgbGluZSA9ICJjb250ZW50UGFnZS5wcm9jZXNzUGFnZS5zdXBwcmVzc2VkSXRlbXNbXCIiICsga2V5ICsgIlwiXT10cnVlIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXBzLnByaW50bG4obGluZSk7CQotCQkvL1N5c3RlbS5vdXQucHJpbnRsbihsaW5lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWFjdGl2aXR5TWFwLmNsZWFyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9SZXBvcnRMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUmVwb3J0TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhOTllNjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9SZXBvcnRMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgUmVwb3J0LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvcnRMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIFJlcG9ydExheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuUmVwb3J0X1dvcmtQcm9kdWN0cywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLlJlcG9ydF9Xb3JrUHJvZHVjdHMsIGVsZW1lbnRYbWwsICJjb250ZW50RWxlbWVudHMiLCBjb250ZW50RWxlbWVudHMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9SZXVzYWJsZUFzc2V0TGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1JldXNhYmxlQXNzZXRMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwN2RkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1JldXNhYmxlQXNzZXRMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYSBSZXVzYWJsZSBBc3NldC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmV1c2FibGVBc3NldExheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgUmV1c2FibGVBc3NldExheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuUmV1c2FibGVBc3NldF9Db250ZW50RWxlbWVudHMsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJCi0JCQlMaXN0IGFjdGl2aXRpZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5SZXVzYWJsZUFzc2V0X0JyZWFrZG93bkVsZW1lbnRzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQotCQkJY29udGVudEVsZW1lbnRzLmFkZEFsbChhY3Rpdml0aWVzKTsKLQotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5SZXVzYWJsZUFzc2V0X0NvbnRlbnRFbGVtZW50cywgZWxlbWVudFhtbCwgImNvbnRlbnRFbGVtZW50cyIsIGNvbnRlbnRFbGVtZW50cyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJR3VpZGFuY2UgZ3VpZGFuY2UgPSAoR3VpZGFuY2UpIHN1cGVyLmVsZW1lbnQ7Ci0JCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCQkKLQkJCQkvLyBBdXRob3Jpbmc6ICBUZW1wbGF0ZSBhdHRhY2htZW50cyBvZiBhIGNvbnRyaWJ1dGluZyB0ZW1wbGF0ZSBndWlkYW5jZSBlbGVtZW50IGFyZSBub3QgYXBwZW5kZWQgdG8gdGhlIGJhc2UgbGlzdCBvZiBhdHRhY2htZW50cwkJCQkKLQkJCQkvL1N0cmluZyBhdHRhY2htZW50U3RyaW5nID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24pY29udGVudCkuZ2V0QXR0YWNobWVudHMoKTsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKTsKLQkJCQlTdHJpbmcgYXR0YWNobWVudFN0cmluZyA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKGNvbnRlbnQsIHN1cGVyLmVsZW1lbnQsIGZlYXR1cmUsIHN1cGVyLmxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlpZiAoIChhdHRhY2htZW50U3RyaW5nICE9IG51bGwpICYmIChhdHRhY2htZW50U3RyaW5nLmluZGV4T2YoQ29uZmlndXJhdGlvbkhlbHBlci5BVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SKSA+IDApICkKLQkJCQl7Ci0JCQkJCWF0dGFjaG1lbnRTdHJpbmcgPSBhdHRhY2htZW50U3RyaW5nLnJlcGxhY2VBbGwoQ29uZmlndXJhdGlvbkhlbHBlci5BVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SLCBUbmdVdGlsLkdVSURBTkNFX0ZJTEVTVFJJTkdfU0VQQVJBVE9SKTsgCi0JCQkJfQotCQkJCUxpc3QgYXR0YWNobWVudExpc3QgPSBUbmdVdGlsLmNvbnZlcnRHdWlkYW5jZUF0dGFjaG1lbnRzVG9MaXN0KGF0dGFjaG1lbnRTdHJpbmcpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGF0dGFjaG1lbnRMaXN0Lml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVN0cmluZyBhdHRhY2htZW50RmlsZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoYXR0YWNobWVudEZpbGUgIT0gbnVsbCkgewotCQkJCQkJTWF0Y2hlciBtID0gUmVzb3VyY2VIZWxwZXIucF90ZW1wbGF0ZV9hdHRhY2htZW50X3VybC5tYXRjaGVyKGF0dGFjaG1lbnRGaWxlKTsKLQkJCQkJCWlmICghbS5maW5kKCkpIHsKLQkJCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVXRpbC5nZXRGaWxlTmFtZShhdHRhY2htZW50RmlsZSk7Ci0JCQkJCQkJZWxlbWVudFhtbC5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkiYXR0YWNoZWRGaWxlIikuc2V0QXR0cmlidXRlKCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkidXJsIiwgImZpbGU6Ly8iICsgYXR0YWNobWVudEZpbGUpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJCQkJCS5zZXRBdHRyaWJ1dGUoImZpbGVOYW1lIiwgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCVN0cmluZyBmaWxlTmFtZSA9IG0uZ3JvdXAoMik7Ci0JCQkJCQkJZWxlbWVudFhtbC5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkiYXR0YWNoZWRGaWxlIikuc2V0QXR0cmlidXRlKCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkidXJsIiwgbS5ncm91cCgxKSkgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQkJCS5zZXRBdHRyaWJ1dGUoImZpbGVOYW1lIiwgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci19Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUm9hZG1hcExheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Sb2FkbWFwTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYTJlNDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Sb2FkbWFwTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIFJvYWRtYXAuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvYWRtYXBMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIFJvYWRtYXBMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLlJvYWRtYXBfQWN0aXZpdGVzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuUm9hZG1hcF9BY3Rpdml0ZXMsIGVsZW1lbnRYbWwsICJjb250ZW50RWxlbWVudHMiLCBjb250ZW50RWxlbWVudHMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Sb2xlRGVzY3JpcHRvckxheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Sb2xlRGVzY3JpcHRvckxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWRiOWJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUm9sZURlc2NyaXB0b3JMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoZSBsYXlvdXQgZm9yIGEgUm9sZURlc2NyaXB0b3IuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0b3JMYXlvdXQgZXh0ZW5kcyBEZXNjcmlwdG9yTGF5b3V0IHsKLQkKLQlwdWJsaWMgUm9sZURlc2NyaXB0b3JMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJLy8gdXNlIHRoZSBkZWZhdWx0Ci0JCS8vIGlmIHlvdSBuZWVkIHRvIGdlbmVyYXRlIGRpYWdyYW0sIHlvdSBtYXkgbmVlZCB0byBrZWVwIHRoZSBmZWF0dXJlCi0JCS8vIHZhbHVlcy4KLQkJLy8ganVzdCBkbyBzb21ldGhpbmcgc2ltaWxhciB0byB0aGUgUm9sZUxheW91dAotCQkvLyBOT1RFOiBmb3Igcm9sZS10YXNrcyByZWxhdGlvbnNoaXAsIHRoZSBmZWF0dXJlIGlzCi0JCS8vIFJvbGVEZXNjcmlwdG9yI2dldFBlcmZvcm1zQXNPd25lcgotCQkvLyBpdCdzIGEgYmlkaXJlY3Rpb25hbCBmZWF0dXJlLCBkb24ndCBuZWVkIG9wcG9zaXRlIGZlYXR1cmUKLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGxvYWRSZWZlcmVuY2VzKFhtbEVsZW1lbnQgZWxlbWVudFhtbCwgYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCi0JCXN1cGVyLmxvYWRSZWZlcmVuY2VzKGVsZW1lbnRYbWwsIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJCi0JCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJTaG93RnVsbE1ldGhvZENvbnRlbnQiLCAobGF5b3V0TWFuYWdlci5nZXRWYWxpZGF0b3IoKS5zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoKSkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCi0JCWlmICggKHN1cGVyLmVsZW1lbnRMYXlvdXQgIT0gbnVsbCApICYmIGxheW91dE1hbmFnZXIuZ2V0VmFsaWRhdG9yKCkuc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkgKSB7Ci0JCQkvLyBhbHNvIGxvYWQgdGhlIGxpbmtlZCBlbGVtZW50IHJlZmVyZW5jZWQgaW5mb3JtYXRpb24KLQkJCWZvciAoSXRlcmF0b3I8RVN0cnVjdHVyYWxGZWF0dXJlPiBpdGVyID0gZ2V0RXh0cmFGZWF0dXJlc0Zyb21Db250ZW50RWxlbWVudCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQkJc3VwZXIuZWxlbWVudExheW91dC5sb2FkRmVhdHVyZShmZWF0dXJlLCBlbGVtZW50WG1sLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBsb2FkIHRoZSBub24tYXR0cmlidXRlIGZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBlbGVtZW50WG1sCi0JICogQHBhcmFtIGluY2x1ZGVSZWZlcmVuY2VzCi0JICovCi0JcHVibGljIHZvaWQgbG9hZEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFhtbEVsZW1lbnQgZWxlbWVudFhtbCwKLQkJCWJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX01vZGlmaWVzKCkgKSB7Ci0JCQlMaXN0IHYgPSBjYWxjTW9kaWZpZWRXb3JrUHJvZHVjdERlc2NyaXB0b3JzKCk7Ci0JCQlhZGRSZWZlcmVuY2VzKGZlYXR1cmUsIGVsZW1lbnRYbWwsIGZlYXR1cmUuZ2V0TmFtZSgpLCB2KTsKLQkJfSBlbHNlIHsKLQkJCWdldEZlYXR1cmVWYWx1ZShmZWF0dXJlLCAgZWxlbWVudFhtbCwgaW5jbHVkZVJlZmVyZW5jZXMpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBMaXN0IGNhbGNNb2RpZmllZFdvcmtQcm9kdWN0RGVzY3JpcHRvcnMoKSB7Ci0JCUxpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gZ2V0TGF5b3V0TWdyKCkuZ2V0RWxlbWVudFJlYWxpemVyKCk7Ci0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX1ByaW1hcnlUYXNrRGVzY3JpcHRvcnM7Ci0JCUxpc3QgdjIgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlpZiAoIHYyLnNpemUoKSA+IDAgKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHYyLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotCQkJCQotCQkJCVN0cmluZyBwYXRoID0gc3VwZXIubWFrZVBhdGgoZ2V0U3VwZXJBY3Rpdml0eVBhdGgoKSwgZSk7Ci0JCQkJVGFza0Rlc2NyaXB0b3JMYXlvdXQgdGwgPSAoVGFza0Rlc2NyaXB0b3JMYXlvdXQpbGF5b3V0TWFuYWdlci5jcmVhdGVMYXlvdXQoZSwgb3duaW5nUHJvY2VzcywgcGF0aCk7Ci0JCQkJUm9sZURlc2NyaXB0b3IgciA9IChSb2xlRGVzY3JpcHRvcil0bC5nZXRGZWF0dXJlVmFsdWUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwgbnVsbCwgZmFsc2UpOwotCQkJCWlmICggciA9PSB0aGlzLmVsZW1lbnQgKSB7Ci0JCQkJCUxpc3QgdmFsdWUgPSAoTGlzdCl0bC5nZXRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgbnVsbCwgZmFsc2UpOwotCQkJCQlpZiAoIHZhbHVlICE9IG51bGwgJiYgdmFsdWUuc2l6ZSgpID4gMCApIHsKLQkJCQkJCWZvciAoIEl0ZXJhdG9yIGl0ciA9IHZhbHVlLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7ICkgewotCQkJCQkJCU9iamVjdCBvID0gaXRyLm5leHQoKTsKLQkJCQkJCQlpZiAoICF2LmNvbnRhaW5zKG8pICkgewotCQkJCQkJCQl2LmFkZChvKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB2OwotCX0KLQkJCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0RmVhdHVyZVZhbHVlKE9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJCi0JCWlmICggIXN1cGVyLmFjY2VwdEZlYXR1cmVWYWx1ZShmZWF0dXJlLCB2YWx1ZSkgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmICggIWlzVGFza09wcG9zaXRlRmVhdHVyZShmZWF0dXJlKSB8fCAhKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJTGlzdCBpdGVtcyA9IChMaXN0KXZhbHVlOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpIDwgaXRlbXMuc2l6ZSgpICkgewotCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXRlbXMuZ2V0KGkpOwotCQkJU3RyaW5nIHBhdGggPSBzdXBlci5tYWtlUGF0aChnZXRTdXBlckFjdGl2aXR5UGF0aCgpLCBlKTsKLQkJCVRhc2tEZXNjcmlwdG9yTGF5b3V0IHRsID0gKFRhc2tEZXNjcmlwdG9yTGF5b3V0KWxheW91dE1hbmFnZXIuY3JlYXRlTGF5b3V0KGUsIG93bmluZ1Byb2Nlc3MsIHBhdGgpOwotCQkJT2JqZWN0IG8gPSBudWxsOwotCQkJaWYgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX1ByaW1hcnlUYXNrRGVzY3JpcHRvcnMgKSB7Ci0JCQkJbyA9IHRsLmdldEZlYXR1cmVWYWx1ZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLCBudWxsLCBmYWxzZSk7CQkJCi0JCQl9IGVsc2UgaWYgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX0FkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMgKSB7Ci0JCQkJbyA9IHRsLmdldEZlYXR1cmVWYWx1ZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLCBudWxsLCBmYWxzZSk7CQkJCQkJCi0JCQl9IGVsc2UgaWYgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX0Fzc2lzdHNJbl9UYXNrRGVzY3JpcHRvcnMgKSB7Ci0JCQkgbyA9IHRsLmdldEZlYXR1cmVWYWx1ZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCksIG51bGwsIGZhbHNlKTsJCQkJCQkKLQkJCX0KLQkJCQotCQkJaWYgKCAobyA9PSB0aGlzLmVsZW1lbnQpIHx8IChvIGluc3RhbmNlb2YgTGlzdCkgJiYgKChMaXN0KW8pLmNvbnRhaW5zKHRoaXMuZWxlbWVudCkgKSB7Ci0JCQkJaSsrOwotCQkJfSBlbHNlIHsKLQkJCQlpdGVtcy5yZW1vdmUoaSk7Ci0JCQl9Ci0JCX0KLQotCi0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1JvbGVMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUm9sZUxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDk4MWRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUm9sZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0uTWV0aG9kRWxlbWVudERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0uUm9sZURpYWdyYW1QdWJsaXNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYSBSb2xlLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXByb3RlY3RlZCBNYXAgcmVmZXJlbmNlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBSb2xlTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgcGVyZm9ybXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJc3VwZXIuZWxlbWVudCwgQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9QcmltYXJ5X1Rhc2tzLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCXJlZmVyZW5jZU1hcC5wdXQoInBlcmZvcm1zIiwgcGVyZm9ybXMpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIE5PLCB0aGlzIGlzIHdyb25nISBzaG91bGQgY2FsY3VsYXRlIHRoZSByZWFsaXplZCBmZWF0dXJlIHZhbHVlIQotCQkJLy8gbW92ZWQgdG8gYWNjZXB0RmVhdHVyZVZhbHVlIHRvIGdldCB0aGUgcmVhbGl6ZWQgdmFsdWUgYW5kIHNhdmUgdG8KLQkJCS8vIHRoZSBtYXAKLQkJCS8vIGlmIChzdXBlci5lbGVtZW50IGluc3RhbmNlb2YgUm9sZUltcGwpCi0JCQkvLyB7Ci0JCQkvLyByZWZlcmVuY2VNYXAucHV0KCJyZXNwb25zaWJsZUZvciIsCi0JCQkvLyAoKFJvbGVJbXBsKXN1cGVyLmVsZW1lbnQpLmdldFJlc3BvbnNpYmxlRm9yKCkpOwotCQkJLy8gfQotCi0JCQlMaXN0IGFkZGl0aW9uYWxseVBlcmZvcm1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJCXN1cGVyLmVsZW1lbnQsIEFzc29jaWF0aW9uSGVscGVyLlJvbGVfU2Vjb25kYXJ5X1Rhc2tzLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCS8vIHJlZmVyZW5jZU1hcC5wdXQoImFkZGl0aW9uYWxseVBlcmZvcm1zIiwgYWRkaXRpb25hbGx5UGVyZm9ybXMpOwotCQkJLy8gLy8kTk9OLU5MUy0xJAotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1NlY29uZGFyeV9UYXNrcywgZWxlbWVudFhtbCwKLQkJCQkJImFkZGl0aW9uYWxseVBlcmZvcm1zIiwgYWRkaXRpb25hbGx5UGVyZm9ybXMpOyAvLyROT04tTkxTLTEkCi0JCQlSb2xlRGlhZ3JhbVB1Ymxpc2hlciBkaWFncmFtUHVibGlzaGVyID0gbmV3IFJvbGVEaWFncmFtUHVibGlzaGVyKCk7Ci0JCQlNZXRob2RFbGVtZW50RGlhZ3JhbSBkaWFncmFtID0gZGlhZ3JhbVB1Ymxpc2hlci5wdWJsaXNoKHRoaXMsCi0JCQkJCW5ldyBGaWxlKGxheW91dE1hbmFnZXIuZ2V0UHVibGlzaERpcigpKSk7Ci0KLQkJCWlmIChkaWFncmFtICE9IG51bGwpCi0JCQkJZWxlbWVudFhtbC5zZXRDb250ZW50KCJkaWFncmFtIiwgZGlhZ3JhbS5nZXRIVE1MKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCUxpc3Qgcm9sZVNldHMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJc3VwZXIuZWxlbWVudCwgQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9Sb2xlU2V0cywKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLlJvbGVfUm9sZVNldHMsIGVsZW1lbnRYbWwsCi0JCQkJCSJyb2xlU2V0cyIsIHJvbGVTZXRzKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQkvLyBhZGQgdGhlIGRlc2NyaXB0b3JzIHJlZmVyZW5jaW5nIHRoaXMgZWxlbWVudAotCQkJc3VwZXIucHJvY2Vzc0Rlc2NyaXB0b3JzKGVsZW1lbnRYbWwpOwotCQkJCi0JCX0KLQkJCi0JCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJTaG93RnVsbE1ldGhvZENvbnRlbnQiLCAobGF5b3V0TWFuYWdlci5nZXRWYWxpZGF0b3IoKS5zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoKSkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRQZXJmb3JtcygpIHsKLQkJTGlzdCBsaXN0ID0gKExpc3QpIHJlZmVyZW5jZU1hcC5nZXQoInBlcmZvcm1zIik7IC8vJE5PTi1OTFMtMSQKLQkJQ29sbGVjdGlvbnMuc29ydChsaXN0LCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QWRkaXRpb25hbGx5UGVyZm9ybXMoKSB7Ci0JCUxpc3QgbGlzdCA9IChMaXN0KSByZWZlcmVuY2VNYXAuZ2V0KCJhZGRpdGlvbmFsbHlQZXJmb3JtcyIpOyAvLyROT04tTkxTLTEkCi0JCUNvbGxlY3Rpb25zLnNvcnQobGlzdCwgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCXJldHVybiBsaXN0OwkJCi0JfQotCi0JcHVibGljIExpc3QgZ2V0UmVzcG9uc2libGVGb3IoKSB7Ci0JCUxpc3QgbGlzdCA9ICAoTGlzdCkgcmVmZXJlbmNlTWFwLmdldCgicmVzcG9uc2libGVGb3IiKTsgLy8kTk9OLU5MUy0xJAotCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQlyZXR1cm4gbGlzdDsJCQotCX0KLQotCXB1YmxpYyBMaXN0IGdldE1vZGlmaWVzKCkgewotCQlMaXN0IGxpc3QgPSAgKExpc3QpIHJlZmVyZW5jZU1hcC5nZXQoIm1vZGlmaWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJQ29sbGVjdGlvbnMuc29ydChsaXN0LCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJcmV0dXJuIGxpc3Q7CQkKLQl9Ci0KLQkvKioKLQkgKiBzb21lIGxheW91dCBuZWVkIHRvIGhhdmUgdGhlIGZlYXR1cmUgdmFsdWVzIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuIFNvCi0JICogdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiBhIGZlYXR1cmUgaXMgY2FsY3VsYXRlZCBpbiB0aGlzIGFic3RyYWN0Ci0JICogY2xhc3MKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUZlYXR1cmVWYWx1ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJlZmVyZW5jZU1hcC5wdXQobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIHNvbWUgbGF5b3V0IG5lZWQgdG8gaGF2ZSB0aGUgZmVhdHVyZSB2YWx1ZXMgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4gU28KLQkgKiB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgZmVhdHVyZSBpcyBjYWxjdWxhdGVkIGluIHRoaXMgYWJzdHJhY3QKLQkgKiBjbGFzcwotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0RmVhdHVyZVZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlKSB7Ci0KLQkJLy8gc2F2ZSB0aGUgZmVhdHVyZSB2YWx1ZSBmb3IgZGlhZ3JhbSBnZW5lcmF0aW9uCi0JCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSkgewotCQkJcmVmZXJlbmNlTWFwLnB1dCgicmVzcG9uc2libGVGb3IiLCB2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBzdXBlci5hY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEZlYXR1cmVWYWx1ZShPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5hY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgdmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9TdGVwTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1N0ZXBMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVkYzE4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1N0ZXBMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RlcExheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgU3RlcExheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1N1bW1hcnlQYWdlTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1N1bW1hcnlQYWdlTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NDI1ZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9TdW1tYXJ5UGFnZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBUaGUgbGF5b3V0IGZvciBhIHN1bW1hcnkgcGFnZSBvZiBhbiBlbGVtZW50LgotICogPHA+Ci0gKiBUaGUgc3VtbWFyeXBhZ2UgbGF5b3V0IGEgbGlzdCBvZiBlbGVtZW50cyByZWZlcmVuY2VkIGJ5IHRoZSBvd25lciBlbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdW1tYXJ5UGFnZUxheW91dCBpbXBsZW1lbnRzIElFbGVtZW50TGF5b3V0IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfVFlQRSA9ICJTdW1tYXJ5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9YU0wgPSAic3VtbWFyeS54c2wiOyAvLyROT04tTkxTLTEkCi0KLQlFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyOwotCi0JTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCi0JTGlzdCByZWZMaXN0OwotCi0JU3RyaW5nIHRpdGxlOwotCQotCVN0cmluZyBwcmVmaXg7Ci0KLQkvLyBTdHJpbmcgZmlsZU5hbWU7Ci0JSUVsZW1lbnRMYXlvdXQgZWxlbWVudExheW91dDsKLQotLy8JcHVibGljIFN1bW1hcnlQYWdlTGF5b3V0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsCi0vLwkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRpdGxlLCBMaXN0IHJlZkxpc3QpIHsKLS8vCQl0aGlzLmxheW91dE1hbmFnZXIgPSBsYXlvdXRNYW5hZ2VyOwotLy8JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0vLwkJdGhpcy5yZWZMaXN0ID0gcmVmTGlzdDsKLS8vCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0vLwotLy8JCXRoaXMuZWxlbWVudExheW91dCA9IGxheW91dE1hbmFnZXIuZ2V0TGF5b3V0KGVsZW1lbnQsIHRydWUpOwotLy8JfQotCQotCXB1YmxpYyBTdW1tYXJ5UGFnZUxheW91dChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdGl0bGUsIAotCQkJTGlzdCByZWZMaXN0KSAKLQl7Ci0JCXRoaXMubGF5b3V0TWFuYWdlciA9IGxheW91dE1hbmFnZXI7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMucmVmTGlzdCA9IHJlZkxpc3Q7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQkJdGhpcy5wcmVmaXggPSAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCAmJiBwcmVmaXguaW5kZXhPZigibnVsbCIpIDwgMCkgPyBwcmVmaXggOiAiU3VtbWFyeSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCXRoaXMuZWxlbWVudExheW91dCA9IGxheW91dE1hbmFnZXIuZ2V0TGF5b3V0KGVsZW1lbnQsIHRydWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEd1aWQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBMQVlPVVRfVFlQRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aXRsZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVcmwoKSB7Ci0JCXJldHVybiBlbGVtZW50TGF5b3V0LmdldEZpbGVQYXRoKCkKLQkJCQkrIGdldEZpbGVOYW1lKFJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTUwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2hhcGVpY29uVXJsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVpY29uVXJsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERpYWdyYW1pY29uVXJsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFhzbFVybCgpIHsKLQkJcmV0dXJuIExBWU9VVF9YU0w7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCYWNrUGF0aCgpIHsKLQkJcmV0dXJuIGVsZW1lbnRMYXlvdXQuZ2V0QmFja1BhdGgoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVQYXRoKCkgewotCQlyZXR1cm4gZWxlbWVudExheW91dC5nZXRGaWxlUGF0aCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZVBhdGgoSUVsZW1lbnRMYXlvdXQgcmVsYXRpdmVUbykgewotCQlyZXR1cm4gZWxlbWVudExheW91dC5nZXRGaWxlUGF0aChyZWxhdGl2ZVRvKTsKLQl9Ci0KLS8vCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoU3RyaW5nIGV4dCkgewotLy8JCXJldHVybiBTdHJVdGlsLm1ha2VWYWxpZEZpbGVOYW1lKHRpdGxlICsgIl8iKSArIGVsZW1lbnRMYXlvdXQuZ2V0RmlsZU5hbWUoZXh0KTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKFN0cmluZyBleHQpIHsKLQkJcmV0dXJuIFN0clV0aWwucmVtb3ZlU3BlY2lhbENoYXJhY3RlcnMocHJlZml4ICsgIl8iKSArIGVsZW1lbnRMYXlvdXQuZ2V0RmlsZU5hbWUoZXh0KTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGdldExheW91dE1ncigpIHsKLQkJcmV0dXJuIGxheW91dE1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQkKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gbmV3IFhtbEVsZW1lbnQoIkVsZW1lbnQiKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiVHlwZSIsIGdldFR5cGUoKSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIk5hbWUiLCBnZXROYW1lKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJVcmwiLCBnZXRVcmwoKSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIkJhY2tQYXRoIiwgZ2V0QmFja1BhdGgoKSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIkltYWdlVXJsIiwgZ2V0U2hhcGVpY29uVXJsKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJEaXNwbGF5TmFtZSIsIGdldERpc3BsYXlOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQkKLQkJCVN0cmluZyBjb3B5cmlnaHQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvcHlyaWdodFRleHQoZWxlbWVudCwKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJaWYgKGNvcHlyaWdodCAhPSBudWxsICYmIGNvcHlyaWdodC5sZW5ndGgoKSA+IDApIHsKLQkJCQllbGVtZW50WG1sLm5ld0NoaWxkKCJjb3B5cmlnaHQiKS5zZXRWYWx1ZShjb3B5cmlnaHQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCVhtbEVsZW1lbnQgcmVmWG1sID0gZWxlbWVudFhtbAotCQkJCQkubmV3Q2hpbGQoInJlZmVyZW5jZUxpc3QiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZWZMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZSA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IChNZXRob2RFbGVtZW50KSBlOwotCQkJCQltZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQobWUsCi0JCQkJCQkJbGF5b3V0TWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCQlpZiAobWUgIT0gbnVsbCkgewotCQkJCQkJSUVsZW1lbnRMYXlvdXQgbCA9IGxheW91dE1hbmFnZXIuZ2V0TGF5b3V0KG1lLCB0cnVlKTsKLQkJCQkJCWlmIChsICE9IG51bGwpIHsKLQkJCQkJCQkvLyBkb24ndCBpbmNsdWRlIHRoZSByZWZlcmVuY2VzIG9mIHRoZSByZWZlcmVjZWQKLQkJCQkJCQkvLyBlbGVtZW50cywgb3RoZXJ3aXNlLCBtYXkgY2F1c2UgZGVhZGxvY2sKLQkJCQkJCQlyZWZYbWwuYWRkQ2hpbGQobC5nZXRYbWxFbGVtZW50KGZhbHNlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRMYXlvdXRzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaWxlIG5hbWUgd2l0aCB0aGUgZ2l2ZW4gZXh0ZW5zaW9uIGZvciB0aGUgZ2l2ZW4gbGF5b3V0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoTGF5b3V0SW5mbyBpbmZvLCBTdHJpbmcgZXh0KSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5nZXRGaWxlTmFtZShlbGVtZW50LCBudWxsLCBpbmZvLm5hbWUsIGV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udGVudFRhcmdldChNZXRob2RFbGVtZW50IHRhcmdldEVsZW1lbnQpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50T3duZXIoTWV0aG9kRWxlbWVudCBvd25lcikgewotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBodG1sIGNvbnRlbnQgZ2VuZXJhdGVkIGZyb20gdGhpcyB4c2wgZmlsZSBuZWVkcyB0byBiZSBzY2FubmVkIG9yIG5vdAotCSAqIHNjYW4gdGhlIGNvbnRlbnQgaXMgZm9yIGlkZW50aWZ5aW5nIGVsZW1lbnQgcmVmZXJlbmNlcyBpbiB0aGUgY29udGVudCBhbmQgY29weSBvdmVyIHJlc291cmNlIGZpbGVzCi0JICogaW4gc29tZSBjYXNlcyB3ZSBkb24ndCBuZWVkIHRvIHNjYW4gdGhlIGNvbnRlbnQsIGZvciBleGFtcGxlLCB0aGUgYWN0aXZpdHkgYnJlYWtkb3duIHN0cnVjdHVyZQotCSAqIAotCSAqIEBwYXJhbSB4c2xVcmwgdGhlIHhzbCB0aGF0IGh0bWwgaXMgZ2VuZXJhdGVkIGZyb20sIG51bGwgZm9yIHRoZSBkZWZhdWx0IHhzbCBsYXlvdXQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBuZWVkQ29udGVudFNjYW4oU3RyaW5nIHhzbFVybCkKLQl7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2hvd0VsZW1lbnRMaW5rKGJvb2xlYW4gc2hvdykgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9TdXBwb3J0aW5nTWF0ZXJpYWxMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvU3VwcG9ydGluZ01hdGVyaWFsTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMzA5ZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9TdXBwb3J0aW5nTWF0ZXJpYWxMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgU3VwcG9ydGluZyBNYXRlcmlhbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3VwcG9ydGluZ01hdGVyaWFsTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWxMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLlN1cHBvcnRpbmdNYXRlcmlhbF9Db250ZW50RWxlbWVudHMsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJCi0JCQlMaXN0IGFjdGl2aXRpZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5TdXBwb3J0aW5nTWF0ZXJpYWxfQnJlYWtkb3duRWxlbWVudHMsIGxheW91dE1hbmFnZXIKLQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCi0JCQljb250ZW50RWxlbWVudHMuYWRkQWxsKGFjdGl2aXRpZXMpOwotCi0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLlN1cHBvcnRpbmdNYXRlcmlhbF9Db250ZW50RWxlbWVudHMsIGVsZW1lbnRYbWwsICJjb250ZW50RWxlbWVudHMiLCBjb250ZW50RWxlbWVudHMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9UYXNrRGVzY3JpcHRvckxheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9UYXNrRGVzY3JpcHRvckxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzVmNmYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVGFza0Rlc2NyaXB0b3JMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogVGhlIGxheW91dCBmb3IgYSBUYXNrRGVzY3JpcHRvci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRvckxheW91dCBleHRlbmRzIERlc2NyaXB0b3JMYXlvdXQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+IGV4dHJhRmVhdHVyZXNGcm9tVGFzayA9IEFycmF5cy5hc0xpc3QobmV3IEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIHsKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfVG9vbE1lbnRvcnMoKQotCX0pOwotCQotCXB1YmxpYyBUYXNrRGVzY3JpcHRvckxheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCXJldHVybiBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHMuQWJzdHJhY3RFbGVtZW50TGF5b3V0I2xvYWRSZWZlcmVuY2VzKFhtbEVsZW1lbnQsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFJlZmVyZW5jZXMoWG1sRWxlbWVudCBlbGVtZW50WG1sLCBib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoZWxlbWVudCk7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzCi0JCQkJCQkuZ2V0KGkpOwotCQkJCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpKSB7Ci0JCQkJCS8vIG5lZWQgdG8gaGFuZGxlIHRoZSBzdGVwIGNvbnRlbnRzIGJ5IGZpeGluZyB0aGUgbGlua3MKLQkJCQkJcHJvY2Vzc1N0ZXBzKGVsZW1lbnRYbWwsIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQkJCX0gZWxzZSBpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCkpIHsKLQkJCQkJc3VwZXIubG9hZFdvcmtPcmRlcihlbGVtZW50WG1sKTsKLQkJCQl9IGVsc2UgaWYgKGZlYXR1cmUuZ2V0RVR5cGUoKSBpbnN0YW5jZW9mIEVDbGFzcykgewotCQkJCQlsb2FkRmVhdHVyZShmZWF0dXJlLCBlbGVtZW50WG1sLCBpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQllbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgiU2hvd0Z1bGxNZXRob2RDb250ZW50IiwgKGxheW91dE1hbmFnZXIuZ2V0VmFsaWRhdG9yKCkuc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkpID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQotCQlpZiAoKHN1cGVyLmVsZW1lbnRMYXlvdXQgIT0gbnVsbCApICYmIGxheW91dE1hbmFnZXIuZ2V0VmFsaWRhdG9yKCkuc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkgKSB7Ci0JCQkvLyBhbHNvIGxvYWQgdGhlIGxpbmtlZCBlbGVtZW50IHJlZmVyZW5jZWQgaW5mb3JtYXRpb24KLQkJCWZvciAoSXRlcmF0b3I8RVN0cnVjdHVyYWxGZWF0dXJlPiBpdGVyYXRvciA9IGdldEV4dHJhRmVhdHVyZXNGcm9tQ29udGVudEVsZW1lbnQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJc3VwZXIuZWxlbWVudExheW91dC5sb2FkRmVhdHVyZShmZWF0dXJlLCBlbGVtZW50WG1sLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1N0ZXBzKFhtbEVsZW1lbnQgZWxlbWVudFhtbCwgYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQkKLQkJLy8gMTk2MDk0IC0gVGFzayBkZXNjcmlwdG9yIHBhZ2Ugc2hvdWxkIHNob3cgdGhlIHJlYWxpemVkIGNvbnRlbnQgb2YgdGhlIGxpbmtlZCBlbGVtZW50Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKTsKLQkJU3RyaW5nIGZlYXR1cmVfbmFtZSA9IGZlYXR1cmUuZ2V0TmFtZSgpOwotCi0JCUxpc3QgaXRlbXM7Ci0JCQotCQkvLyBwZXIgUGV0ZXIsIHRoaXMgaXMgbm90IHRoZSByaWdodCBiZWhhdmlvcgotCQkvLyBkZXNjcmlwdG9ycyBzaG91bGQgYWx3YXlzIHNob3cgdGhlIHNlbGVjdGVkIHN0ZXBzIG9mIHRoZSBvcmlnaW5hbCBlbGVtZW50Ci0JCS8vIGl0IHNob3VsZCBub3Qgc2hvdyB0aGUgcmVhbGl6ZWQgc3RlcHMKLQkJLy8gc28gcm9sbGJhY2sgdG8gdGhlIG9sZCBiZWhhdmlvcgotCQkvLyBKaW5odWEgWGkgMDgvMjgvMDcKLQkJLyoKLQkJaWYgKCBsYXlvdXRNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpKSB7Ci0JCQlpZiAobGlua2VkRWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJaXRlbXMgPSBudWxsOwotCQkJfSBlbHNlIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfU3RlcHMoKTsKLQkJCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGxpbmtlZEVsZW1lbnQsIGYsCi0JCQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQl9Ci0KLQkJfSBlbHNlIAotCQkqLwotCQl7Ci0JCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIGZlYXR1cmUsCi0JCQkJCWdldExheW91dE1ncigpLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJfQotCQkKLQkJWG1sRWxlbWVudCBzdGVwWG1sID0gZWxlbWVudFhtbAotCQkJCS5uZXdDaGlsZCgicmVmZXJlbmNlTGlzdCIpLnNldEF0dHJpYnV0ZSgibmFtZSIsIGZlYXR1cmVfbmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWlmIChpdGVtcyAhPSBudWxsICYmIGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGUgPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSAoTWV0aG9kRWxlbWVudCkgZTsKLQkJCQkJZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQobWUsCi0JCQkJCQkJbGF5b3V0TWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJCQlJRWxlbWVudExheW91dCBsID0gbGF5b3V0TWFuYWdlci5nZXRMYXlvdXQobWUsIHRydWUpOwotCQkJCQkJaWYgKGwgIT0gbnVsbCkgewotCQkJCQkJCWwuc2V0Q29udGVudFRhcmdldChlbGVtZW50KTsKLQkJCQkJCQlzdGVwWG1sLmFkZENoaWxkKGwKLQkJCQkJCQkJCS5nZXRYbWxFbGVtZW50KENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCQkJCQkJLmlzRGVzY3JpcHRpb25FbGVtZW50KG1lKSA/IHRydWUKLQkJCQkJCQkJCQkJOiBpbmNsdWRlUmVmZXJlbmNlcykpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRFeHRyYUZlYXR1cmVzRnJvbUNvbnRlbnRFbGVtZW50KCkgewotCQlBcnJheUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPiBmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPihleHRyYUZlYXR1cmVzRnJvbVRhc2spOwotCQlmZWF0dXJlcy5hZGRBbGwoc3VwZXIuZ2V0RXh0cmFGZWF0dXJlc0Zyb21Db250ZW50RWxlbWVudCgpKTsKLQkJcmV0dXJuIGZlYXR1cmVzOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU3VwcHJlc3NlZChTdXBwcmVzc2lvbiBzdXAsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgZWxlbWVudCkgewotCQkKLQkJLy8gbWFrZSBzdXJlIGFsbCBjYXNlcyBhcmUgY292ZXJlZAotCQlpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvciB8fCBlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yICkgewotCQkJU3RyaW5nIHBhdGggPSBzdXBlci5tYWtlUGF0aChzdXBlci5lbGVtZW50UHJvY2Vzc1BhdGgsIChNZXRob2RFbGVtZW50KWVsZW1lbnQpOwotCQkJU3RyaW5nW10gcGF0aHMgPSBzdXBlci5nZXRQYXRoQXJyYXkocGF0aCk7Ci0JCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbGF5b3V0TWFuYWdlci5nZXRDQlNBZGFwdGVyRmFjdG9yeSgpOwotCQkJT2JqZWN0IHdyYXBwZXIgPSBzdXAuZ2V0T2JqZWN0QnlQYXRoKHBhdGhzLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQlpZiAoIHdyYXBwZXIgPT0gbnVsbCApIHsKLQkJCQl3cmFwcGVyID0gZWxlbWVudDsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIHN1cC5pc1N1cHByZXNzZWQod3JhcHBlciwgZmVhdHVyZSk7Ci0JCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc3VwZXIuaXNTdXBwcmVzc2VkKHN1cCwgZmVhdHVyZSwgZWxlbWVudCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Rhc2tMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVGFza0xheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzQzYTM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVGFza0xheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYSBUYXNrLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBUYXNrTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCVRhc2sgdGFzayA9IChUYXNrKSBzdXBlci5lbGVtZW50OwotCQkJTGlzdCBwZXJmb3JtaW5nUm9sZXMgPSB0YXNrLmdldFBlcmZvcm1lZEJ5KCk7Ci0JCQlmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpdG9yID0gcGVyZm9ybWluZ1JvbGVzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCVJvbGUgcGVyZm9ybWluZ1JvbGUgPSAoUm9sZSkgaXRvci5uZXh0KCk7Ci0JCQkJaWYgKHBlcmZvcm1pbmdSb2xlICE9IG51bGwpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCByb2xlID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCgKLQkJCQkJCQkoTWV0aG9kRWxlbWVudCkgcGVyZm9ybWluZ1JvbGUsIGxheW91dE1hbmFnZXIKLQkJCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCQlpZiAocm9sZSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgcm9sZU5hbWUgPSAoKFJvbGUpIHJvbGUpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQkJCWlmIChyb2xlTmFtZSA9PSBudWxsIHx8IHJvbGVOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQlyb2xlTmFtZSA9IHJvbGUuZ2V0TmFtZSgpOwotCQkJCQkJfQotCQkJCQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoInBlcmZvcm1pbmdSb2xlTmFtZSIsIHJvbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYWRkUmVmZXJlbmNlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSwgZWxlbWVudFhtbCwgInBlcmZvcm1pbmdSb2xlIiwgcm9sZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCi0JCQkvLyBjYWxjdWxhdGUgdGhlIGNhdGVnb3JpZXMgb3Bwb3NpdGUgZmVhdHVyZQotCQkJLy8gbXVsdGlwbGljaXR5IGNoYW5nZSBmb3Igb3Bwb3NpdGUgZmVhdHVyZXMKLQkJCUxpc3QgZGlzY2lwbGluZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJc3VwZXIuZWxlbWVudCwgQXNzb2NpYXRpb25IZWxwZXIuVGFza19EaXNjaXBsaW5lcywKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLlRhc2tfRGlzY2lwbGluZXMsIGVsZW1lbnRYbWwsICJkaXNjaXBsaW5lcyIsIGRpc2NpcGxpbmVzKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlMaXN0IHVzZXJjYXRlZ29yaWVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJCXN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLkRlc2NyaWJhYmxlRWxlbWVudF9DdXN0b21DYXRlZ29yaWVzLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCXByb2Nlc3NDaGlsZChBc3NvY2lhdGlvbkhlbHBlci5EZXNjcmliYWJsZUVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcywgCi0JCQkJCWVsZW1lbnRYbWwKLQkJCQkJCQkubmV3Q2hpbGQoInJlZmVyZW5jZUxpc3QiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiY3VzdG9tQ2F0ZWdvcmllcyIpLCB1c2VyY2F0ZWdvcmllcywgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCQkvLyBhZGQgdGhlIGRlc2NyaXB0b3JzIHJlZmVyZW5jaW5nIHRoaXMgZWxlbWVudAotCQkJc3VwZXIucHJvY2Vzc0Rlc2NyaXB0b3JzKGVsZW1lbnRYbWwpOwotCi0JCX0KLQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoIlNob3dGdWxsTWV0aG9kQ29udGVudCIsIChsYXlvdXRNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkKLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1RlYW1Qcm9maWxlTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1RlYW1Qcm9maWxlTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNTExZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9UZWFtUHJvZmlsZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIFRlYW0gUHJvZmlsZSBsYXlvdXQgZm9yIGJyb3dzaW5nCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFRlYW1Qcm9maWxlTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgVGVhbVByb2ZpbGVMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCX0KLQkvKioKLQkgKiBsb2FkIHRoZSBub24tYXR0cmlidXRlIGZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBlbGVtZW50WG1sCi0JICogQHBhcmFtIGluY2x1ZGVSZWZlcmVuY2VzCi0JICovCi0JcHVibGljIHZvaWQgbG9hZEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFhtbEVsZW1lbnQgZWxlbWVudFhtbCwKLQkJCWJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJaWYgKCEoZmVhdHVyZS5nZXRFVHlwZSgpIGluc3RhbmNlb2YgRUNsYXNzKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIG5hbWUgPSBmZWF0dXJlLmdldE5hbWUoKTsKLQotCQlpZiAoIWZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKGVsZW1lbnQsCi0JCQkJCWZlYXR1cmUsIGxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJLy8gQnJvd3Npbmcgc3RvcHMgd29ya2luZyB3aGVuIGEgcm9sZSBpcyBzZXQgdG8KLQkJCS8vIHJlcGxhY2VkIGFub3RoZXIgcm9sZQotCQkJLy8gZm9yIHJlcGxhY2VyLCB0aGUgYmFzZSB3aWxsIGJlIGV2YWx1YXRlZCB0byB0aGUgcmVwbGFjZXIKLQkJCS8vIGFuZCBjYXVzaW5nIGRlYWRsb2NrCi0JCQlpZiAoZSAhPSBudWxsICYmIGUgIT0gZWxlbWVudCkgewotCQkJCWJvb2xlYW4gc2hvd0RldGFpbCA9IChDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkuaXNEZXNjcmlwdGlvbkVsZW1lbnQoZSkKLQkJCQkvKgotCQkJCSAqIHx8IChwID09Ci0JCQkJICogVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHRTdGF0ZW1lbnQoKSkKLQkJCQkgKi8pID8gdHJ1ZSA6IGluY2x1ZGVSZWZlcmVuY2VzOwotCi0JCQkJaWYgKCBhY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgZSkgKSB7Ci0JCQkJCXByb2Nlc3NDaGlsZChmZWF0dXJlLCAKLQkJCQkJCQllbGVtZW50WG1sCi0JCQkJCQkJCQkubmV3Q2hpbGQoInJlZmVyZW5jZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpLCBlLCBzaG93RGV0YWlsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCUxpc3QgcHYgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBmZWF0dXJlLAotCQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlMaXN0IHJvbGVEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmICgocHYgIT0gbnVsbCkgJiYgKCFwdi5pc0VtcHR5KCkpKQotCQkJewotCQkJCWZvciAoSXRlcmF0b3IgaXRvcj1wdi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspCi0JCQkJewotCQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgCi0JCQkJCXsKLQkJCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBvYmo7Ci0JCQkJCQlpZiAoKHJvbGVEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpCi0JCQkJCQkJfHwgKHJvbGVEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpKQotCQkJCQkJCXJvbGVEZXNjTGlzdC5hZGQob2JqKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKCBhY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgcm9sZURlc2NMaXN0KSAmJiByb2xlRGVzY0xpc3Quc2l6ZSgpID4gMCApIHsKLQkJCQlhZGRSZWZlcmVuY2VzKGZlYXR1cmUsIGVsZW1lbnRYbWwsIG5hbWUsIHJvbGVEZXNjTGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1RlbXBsYXRlTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1RlbXBsYXRlTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhM2NkMjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9UZW1wbGF0ZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIFRlbXBsYXRlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUxheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgVGVtcGxhdGVMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLlRlbXBsYXRlX1dvcmtQcm9kdWN0cywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLlRlbXBsYXRlX1dvcmtQcm9kdWN0cywgZWxlbWVudFhtbCwgImNvbnRlbnRFbGVtZW50cyIsIGNvbnRlbnRFbGVtZW50cyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJR3VpZGFuY2UgZ3VpZGFuY2UgPSAoR3VpZGFuY2UpIHN1cGVyLmVsZW1lbnQ7Ci0JCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCQkKLQkJCQkvLyBBdXRob3Jpbmc6ICBUZW1wbGF0ZSBhdHRhY2htZW50cyBvZiBhIGNvbnRyaWJ1dGluZyB0ZW1wbGF0ZSBndWlkYW5jZSBlbGVtZW50IGFyZSBub3QgYXBwZW5kZWQgdG8gdGhlIGJhc2UgbGlzdCBvZiBhdHRhY2htZW50cwkJCQkKLQkJCQkvL1N0cmluZyBhdHRhY2htZW50U3RyaW5nID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24pY29udGVudCkuZ2V0QXR0YWNobWVudHMoKTsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKTsKLQkJCQlTdHJpbmcgYXR0YWNobWVudFN0cmluZyA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKGNvbnRlbnQsIHN1cGVyLmVsZW1lbnQsIGZlYXR1cmUsIHN1cGVyLmxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlpZiAoIChhdHRhY2htZW50U3RyaW5nICE9IG51bGwpICYmIChhdHRhY2htZW50U3RyaW5nLmluZGV4T2YoQ29uZmlndXJhdGlvbkhlbHBlci5BVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SKSA+IDApICkKLQkJCQl7Ci0JCQkJCWF0dGFjaG1lbnRTdHJpbmcgPSBhdHRhY2htZW50U3RyaW5nLnJlcGxhY2VBbGwoQ29uZmlndXJhdGlvbkhlbHBlci5BVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SLCBUbmdVdGlsLkdVSURBTkNFX0ZJTEVTVFJJTkdfU0VQQVJBVE9SKTsgCi0JCQkJfQotCQkJCUxpc3QgYXR0YWNobWVudExpc3QgPSBUbmdVdGlsLmNvbnZlcnRHdWlkYW5jZUF0dGFjaG1lbnRzVG9MaXN0KGF0dGFjaG1lbnRTdHJpbmcpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGF0dGFjaG1lbnRMaXN0Lml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVN0cmluZyBhdHRhY2htZW50RmlsZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoYXR0YWNobWVudEZpbGUgIT0gbnVsbCkgewotCQkJCQkJTWF0Y2hlciBtID0gUmVzb3VyY2VIZWxwZXIucF90ZW1wbGF0ZV9hdHRhY2htZW50X3VybC5tYXRjaGVyKGF0dGFjaG1lbnRGaWxlKTsKLQkJCQkJCWlmICghbS5maW5kKCkpIHsKLQkJCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVXRpbC5nZXRGaWxlTmFtZShhdHRhY2htZW50RmlsZSk7Ci0JCQkJCQkJZWxlbWVudFhtbC5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkiYXR0YWNoZWRGaWxlIikuc2V0QXR0cmlidXRlKCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkidXJsIiwgImZpbGU6Ly8iICsgYXR0YWNobWVudEZpbGUpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJCQkJCS5zZXRBdHRyaWJ1dGUoImZpbGVOYW1lIiwgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCVN0cmluZyBmaWxlTmFtZSA9IG0uZ3JvdXAoMik7Ci0JCQkJCQkJZWxlbWVudFhtbC5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkiYXR0YWNoZWRGaWxlIikuc2V0QXR0cmlidXRlKCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkidXJsIiwgbS5ncm91cCgxKSkgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQkJCS5zZXRBdHRyaWJ1dGUoImZpbGVOYW1lIiwgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Ub29sTWVudG9yTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Rvb2xNZW50b3JMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc1MTkxMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Rvb2xNZW50b3JMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgVG9vbCBNZW50b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRvb2xNZW50b3JMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIFRvb2xNZW50b3JMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLlRvb2xNZW50b3JfVGFza3MsIGxheW91dE1hbmFnZXIKLQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5Ub29sTWVudG9yX1Rhc2tzLCBlbGVtZW50WG1sLCAiY29udGVudEVsZW1lbnRzIiwgY29udGVudEVsZW1lbnRzKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlMaXN0PE1ldGhvZEVsZW1lbnQ+IHRvb2xzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJCXN1cGVyLmVsZW1lbnQsIEFzc29jaWF0aW9uSGVscGVyLlRvb2xNZW50b3JfVG9vbHMsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJaW50IHN6ID0gdG9vbHMgPT0gbnVsbCA/IDAgOiB0b29scy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN6OyBpKyspIHsKLQkJCQlNZXRob2RFbGVtZW50IHRvb2wgPSB0b29scy5nZXQoaSk7Ci0JCQkJYWRkUmVmZXJlbmNlKEFzc29jaWF0aW9uSGVscGVyLlRvb2xNZW50b3JfVG9vbHMsIGVsZW1lbnRYbWwsICJ0b29sIiwgdG9vbCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9XaGl0ZXBhcGVyTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1doaXRlcGFwZXJMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVmN2YzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1doaXRlcGFwZXJMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYSBXaGl0ZXBhcGVyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV2hpdGVwYXBlckxheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0JCi0JcHVibGljIFdoaXRlcGFwZXJMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwgCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLkNvbmNlcHRfQ29udGVudEVsZW1lbnRzLCAKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkKLQkJCUxpc3QgYWN0aXZpdGllcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLkNvbmNlcHRfQnJlYWtkb3duRWxlbWVudHMsIGxheW91dE1hbmFnZXIKLQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCi0JCQljb250ZW50RWxlbWVudHMuYWRkQWxsKGFjdGl2aXRpZXMpOwotCi0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLkNvbmNlcHRfQ29udGVudEVsZW1lbnRzLCBlbGVtZW50WG1sLCAiY29udGVudEVsZW1lbnRzIiwgY29udGVudEVsZW1lbnRzKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlHdWlkYW5jZSBndWlkYW5jZSA9IChHdWlkYW5jZSkgc3VwZXIuZWxlbWVudDsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotCQkJCQotCQkJCS8vIEF1dGhvcmluZzogIFRlbXBsYXRlIGF0dGFjaG1lbnRzIG9mIGEgY29udHJpYnV0aW5nIHRlbXBsYXRlIGd1aWRhbmNlIGVsZW1lbnQgYXJlIG5vdCBhcHBlbmRlZCB0byB0aGUgYmFzZSBsaXN0IG9mIGF0dGFjaG1lbnRzCQkJCQotCQkJCS8vU3RyaW5nIGF0dGFjaG1lbnRTdHJpbmcgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiljb250ZW50KS5nZXRBdHRhY2htZW50cygpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50cygpOwotCQkJCVN0cmluZyBhdHRhY2htZW50U3RyaW5nID0gKFN0cmluZylDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoY29udGVudCwgc3VwZXIuZWxlbWVudCwgZmVhdHVyZSwgc3VwZXIubGF5b3V0TWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCWlmICggKGF0dGFjaG1lbnRTdHJpbmcgIT0gbnVsbCkgJiYgKGF0dGFjaG1lbnRTdHJpbmcuaW5kZXhPZihDb25maWd1cmF0aW9uSGVscGVyLkFUVFJJQlVURV9WQUxVRV9TRVBFUkFUT1IpID4gMCkgKQotCQkJCXsKLQkJCQkJYXR0YWNobWVudFN0cmluZyA9IGF0dGFjaG1lbnRTdHJpbmcucmVwbGFjZUFsbChDb25maWd1cmF0aW9uSGVscGVyLkFUVFJJQlVURV9WQUxVRV9TRVBFUkFUT1IsIFRuZ1V0aWwuR1VJREFOQ0VfRklMRVNUUklOR19TRVBBUkFUT1IpOyAKLQkJCQl9Ci0JCQkJTGlzdCBhdHRhY2htZW50TGlzdCA9IFRuZ1V0aWwuY29udmVydEd1aWRhbmNlQXR0YWNobWVudHNUb0xpc3QoYXR0YWNobWVudFN0cmluZyk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXR0YWNobWVudExpc3QuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJU3RyaW5nIGF0dGFjaG1lbnRGaWxlID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChhdHRhY2htZW50RmlsZSAhPSBudWxsKSB7Ci0JCQkJCQlNYXRjaGVyIG0gPSBSZXNvdXJjZUhlbHBlci5wX3RlbXBsYXRlX2F0dGFjaG1lbnRfdXJsLm1hdGNoZXIoYXR0YWNobWVudEZpbGUpOwotCQkJCQkJaWYgKCFtLmZpbmQoKSkgewotCQkJCQkJCVN0cmluZyBmaWxlTmFtZSA9IEZpbGVVdGlsLmdldEZpbGVOYW1lKGF0dGFjaG1lbnRGaWxlKTsKLQkJCQkJCQllbGVtZW50WG1sLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCSJhdHRhY2hlZEZpbGUiKS5zZXRBdHRyaWJ1dGUoIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSJ1cmwiLCAiZmlsZTovLyIgKyBhdHRhY2htZW50RmlsZSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQkJCQkJCQkJLnNldEF0dHJpYnV0ZSgiZmlsZU5hbWUiLCBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gbS5ncm91cCgyKTsKLQkJCQkJCQllbGVtZW50WG1sLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCSJhdHRhY2hlZEZpbGUiKS5zZXRBdHRyaWJ1dGUoIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSJ1cmwiLCBtLmdyb3VwKDEpKSAvLyROT04tTkxTLTEkIAotCQkJCQkJCQkJLnNldEF0dHJpYnV0ZSgiZmlsZU5hbWUiLCBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQkKLX0KLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1dvcmtCcmVha2Rvd25FbGVtZW50TGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1dvcmtCcmVha2Rvd25FbGVtZW50TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZTVkMTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Xb3JrQnJlYWtkb3duRWxlbWVudExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0KLS8qKgotICogVGhlIGxheW91dCBmb3Igd29yayBicmVha2Rvd24gRWxlbWVudHMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrQnJlYWtkb3duRWxlbWVudExheW91dCBleHRlbmRzIEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSB0aGUgd29ya29yZGVyCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFJlZmVyZW5jZXMoWG1sRWxlbWVudCBlbGVtZW50WG1sLCBib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoZWxlbWVudCk7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzCi0JCQkJCQkuZ2V0KGkpOwotCQkJCWlmIChmZWF0dXJlLmdldEVUeXBlKCkgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKLQkJCQkJaWYgKGZlYXR1cmUgIT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSkgewotCQkJCQkJbG9hZEZlYXR1cmUoZmVhdHVyZSwgZWxlbWVudFhtbCwgaW5jbHVkZVJlZmVyZW5jZXMpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc3VwZXIubG9hZFdvcmtPcmRlcihlbGVtZW50WG1sKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNjM4M2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvckxheW91dCBleHRlbmRzIERlc2NyaXB0b3JMYXlvdXQgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+IGV4dHJhRmVhdHVyZXNGcm9tV29ya1Byb2R1Y3QgPSBBcnJheXMuYXNMaXN0KG5ldyBFU3RydWN0dXJhbEZlYXR1cmVbXSB7Ci0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcnMoKQotCX0pOwotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkFic3RyYWN0RWxlbWVudExheW91dCNsb2FkUmVmZXJlbmNlcyhYbWxFbGVtZW50LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRSZWZlcmVuY2VzKFhtbEVsZW1lbnQgZWxlbWVudFhtbCwgYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCi0JCXN1cGVyLmxvYWRSZWZlcmVuY2VzKGVsZW1lbnRYbWwsIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJCi0JCS8vIDE2MTMyNSAtIFdQRGVzY3JpcHRvcnMgZGlkIG5vdCBzaG93IG1vZGlmeSBSb2xlRGVzY3JpcHRvcnMKLQkJLy8gZ2V0IHRoZSBtb2RpZmllcyBmZWF0dXJlCi0JCS8vIHRoaXMgZ3V5IGRvZXMgbm90IGhhdmUgYSBkZWZpbmVkIG9wcG9zaXRlIGZlYXR1cmUKLQkJLy8gdGhpcyBtZXRob2QgY2FsbCBpcyBub3Qgc2FmZS4gCi0vLwkJTGlzdCBtb2RpZnlSb2xlcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY01vZGlmeVJvbGVEZXNjcmlwdG9ycygKLS8vCQkJCShXb3JrUHJvZHVjdERlc2NyaXB0b3Ipc3VwZXIuZWxlbWVudCwgCi0vLwkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCi0JCUxpc3QgbW9kaWZ5Um9sZXMgPSBjYWxjTW9kaWZ5Um9sZURlc2NyaXB0b3JzKCk7Ci0JCQotCQlhZGRSZWZlcmVuY2VzKG51bGwsIGVsZW1lbnRYbWwsICJ3b3JrZWRPbkJ5IiwgbW9kaWZ5Um9sZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQllbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgiU2hvd0Z1bGxNZXRob2RDb250ZW50IiwgKGxheW91dE1hbmFnZXIuZ2V0VmFsaWRhdG9yKCkuc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkpID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQotCQlpZiAoKHN1cGVyLmVsZW1lbnRMYXlvdXQgIT0gbnVsbCApICYmIGxheW91dE1hbmFnZXIuZ2V0VmFsaWRhdG9yKCkuc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkgKSB7Ci0JCQkvLyBhbHNvIGxvYWQgdGhlIGxpbmtlZCBlbGVtZW50IHJlZmVyZW5jZWQgaW5mb3JtYXRpb24KLQkJCWZvciAoSXRlcmF0b3I8RVN0cnVjdHVyYWxGZWF0dXJlPiBpdGVyYXRvciA9IGdldEV4dHJhRmVhdHVyZXNGcm9tQ29udGVudEVsZW1lbnQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJc3VwZXIuZWxlbWVudExheW91dC5sb2FkRmVhdHVyZShmZWF0dXJlLCBlbGVtZW50WG1sLCBmYWxzZSk7Ci0JCQl9Ci0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+IGdldEV4dHJhRmVhdHVyZXNGcm9tQ29udGVudEVsZW1lbnQoKSB7Ci0JCUFycmF5TGlzdDxFU3RydWN0dXJhbEZlYXR1cmU+IGZlYXR1cmVzID0gbmV3IEFycmF5TGlzdDxFU3RydWN0dXJhbEZlYXR1cmU+KGV4dHJhRmVhdHVyZXNGcm9tV29ya1Byb2R1Y3QpOwotCQlmZWF0dXJlcy5hZGRBbGwoc3VwZXIuZ2V0RXh0cmFGZWF0dXJlc0Zyb21Db250ZW50RWxlbWVudCgpKTsKLQkJcmV0dXJuIGZlYXR1cmVzOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBjYWxjTW9kaWZ5Um9sZURlc2NyaXB0b3JzKCkgewotCQkKLQkJTGlzdCBtb2RpZnlSb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKTsKLQkJTGlzdCB0YXNrRGVzY3JpcHRvcnMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQllbGVtZW50LCAKLQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbV9UYXNrRGVzY3JpcHRvcnMsIAotCQkJCXJlYWxpemVyKTsKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB0YXNrRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVRhc2tEZXNjcmlwdG9yIHQgPSAoVGFza0Rlc2NyaXB0b3IpaXQubmV4dCgpOwotCQkJCi0JCQkvLyBtYWtlIHN1cmUgdGhlIHRhc2sgZGVzY3JpcHRvciBoYXMgdGhlIGN1cnJlbnQgd3AgZGVzY3JpcHRvciBhcyBvdXRwdXQKLQkJCVN0cmluZyBwYXRoID0gc3VwZXIubWFrZVBhdGgoZ2V0U3VwZXJBY3Rpdml0eVBhdGgoKSwgdCk7Ci0JCQlUYXNrRGVzY3JpcHRvckxheW91dCB0bCA9IChUYXNrRGVzY3JpcHRvckxheW91dClsYXlvdXRNYW5hZ2VyLmNyZWF0ZUxheW91dCh0LCBvd25pbmdQcm9jZXNzLCBwYXRoKTsKLQkJCUxpc3Qgb3V0cHV0cyA9IChMaXN0KXRsLmdldEZlYXR1cmVWYWx1ZShmZWF0dXJlLCBudWxsLCBmYWxzZSk7Ci0JCQkKLQkJCWlmICggb3V0cHV0cyAhPSBudWxsICYmIG91dHB1dHMuY29udGFpbnMoZWxlbWVudCkgKSB7CQotCQkJCUxpc3Qgcm9sZURlc2NyaXB0b3JzID0gKExpc3QpIHRsLmdldEZlYXR1cmVWYWx1ZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLCBudWxsLCBmYWxzZSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpID0gcm9sZURlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJCQl7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yIHIgPSAoUm9sZURlc2NyaXB0b3IpIGkubmV4dCgpOwotCQkJCQlpZiAoIChyICE9IG51bGwpICYmICFtb2RpZnlSb2xlcy5jb250YWlucyhyKSApIHsKLQkJCQkJCW1vZGlmeVJvbGVzLmFkZChyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG1vZGlmeVJvbGVzOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRGZWF0dXJlVmFsdWUoT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQkKLQkJaWYgKCAhc3VwZXIuYWNjZXB0RmVhdHVyZVZhbHVlKGZlYXR1cmUsIHZhbHVlKSApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKCAhaXNUYXNrT3Bwb3NpdGVGZWF0dXJlKGZlYXR1cmUpIHx8ICEodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlMaXN0IGl0ZW1zID0gKExpc3QpdmFsdWU7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGkgPCBpdGVtcy5zaXplKCkgKSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdGVtcy5nZXQoaSk7Ci0JCQlTdHJpbmcgcGF0aCA9IHN1cGVyLm1ha2VQYXRoKGdldFN1cGVyQWN0aXZpdHlQYXRoKCksIGUpOwotCQkJVGFza0Rlc2NyaXB0b3JMYXlvdXQgdGwgPSAoVGFza0Rlc2NyaXB0b3JMYXlvdXQpbGF5b3V0TWFuYWdlci5jcmVhdGVMYXlvdXQoZSwgb3duaW5nUHJvY2VzcywgcGF0aCk7Ci0JCQlMaXN0IG8gPSBudWxsOwotCQkJaWYgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9FeHRlcm5hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzICkgewotCQkJCW8gPSAoTGlzdCl0bC5nZXRGZWF0dXJlVmFsdWUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpLCBudWxsLCBmYWxzZSk7CQkJCi0JCQl9IGVsc2UgaWYgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyApIHsKLQkJCQlvID0gKExpc3QpdGwuZ2V0RmVhdHVyZVZhbHVlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCksIG51bGwsIGZhbHNlKTsJCQkKLQkJCX0gZWxzZSBpZiAoIGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX09wdGlvbmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMgKSB7Ci0JCQkJbyA9IChMaXN0KXRsLmdldEZlYXR1cmVWYWx1ZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCksIG51bGwsIGZhbHNlKTsJCQkKLQkJCX0gZWxzZSBpZiAoIGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb21fVGFza0Rlc2NyaXB0b3JzICkgewotCQkJCW8gPSAoTGlzdCl0bC5nZXRGZWF0dXJlVmFsdWUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCksIG51bGwsIGZhbHNlKTsJCQkKLQkJCX0gCi0JCQkKLQkJCWlmICggKG8gIT0gbnVsbCkgJiYgby5jb250YWlucyh0aGlzLmVsZW1lbnQpICkgewotCQkJCWkrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJaXRlbXMucmVtb3ZlKGkpOwotCQkJfQotCQl9Ci0KLQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Xb3JrUHJvZHVjdExheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Xb3JrUHJvZHVjdExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmM0YTVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvV29ya1Byb2R1Y3RMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGFuIEFydGlmYWN0LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdExheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgV29ya1Byb2R1Y3RMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewotCi0JCQkvLyBubyB0aGlzIHdpbGwgbG9zZSB0aGUgY29udHJpYnV0b3IKLQkJCS8vIFJvbGUgcmVzcG9uc2libGVSb2xlID0KLQkJCS8vIEFzc29jaWF0aW9uSGVscGVyLmdldFJlc3BvbnNpYmxlUm9sZSgoV29ya1Byb2R1Y3Qpc3VwZXIuZWxlbWVudCk7Ci0JCQkvL211bHRpcGxpY2l0eSBjaGFuZ2UgZm9yIG9wcG9zaXRlIGZlYXR1cmVzCi0JCQlMaXN0IHJlc3BvbnNpYmxlUm9sZXMgPSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCS5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGVzLAotCQkJCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotLy8JCQlpZiAocmVzcG9uc2libGVSb2xlICE9IG51bGwpIHsKLS8vCQkJCU1ldGhvZEVsZW1lbnQgcm9sZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoCi0vLwkJCQkJCShNZXRob2RFbGVtZW50KSByZXNwb25zaWJsZVJvbGUsIGxheW91dE1hbmFnZXIKLS8vCQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbigpKTsKLS8vCQkJCWlmIChyb2xlICE9IG51bGwpIHsKLS8vCQkJCQlTdHJpbmcgcm9sZU5hbWUgPSAoKFJvbGUpIHJvbGUpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLS8vCQkJCQlpZiAocm9sZU5hbWUgPT0gbnVsbCB8fCByb2xlTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0vLwkJCQkJCXJvbGVOYW1lID0gcm9sZS5nZXROYW1lKCk7Ci0vLwkJCQkJfQotLy8JCQkJCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJyZXNwb25zaWJsZVJvbGVOYW1lIiwgcm9sZU5hbWUpOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJYWRkUmVmZXJlbmNlKEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZSwgZWxlbWVudFhtbCwgInJlc3BvbnNpYmxlUm9sZSIsIHJvbGUpOyAvLyROT04tTkxTLTEkCi0vLwkJCQl9Ci0vLwkJCX0KLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfUmVzcG9uc2libGVSb2xlcywgZWxlbWVudFhtbCwgInJlc3BvbnNpYmxlUm9sZXMiLCByZXNwb25zaWJsZVJvbGVzKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBCcm93c2luZyBhIENvbmZpZ3VyYXRpb24gSW5jbHVkZXMgYSBSZWxhdGlvbnNoaXAgdGhhdCBpcyBub3QgUGFydCBvZiB0aGUgQ29uZmlndXJhdGlvbgotCQkJLy8gc2hvdWxkIGNhbGwgdGhlIGNvbmZpZ3VyYXRpb24gaGVscGVyIHRvIHJlYWxpemUgdGhlIHZhbHVlCi0JCQkvLyB0aGVyZSBpcyBubyBvcHBvc2l0ZSBmZWF0dXJlIGRlZmluZWQgZm9yIHRoaXMuIAotCQkJLy8gd2UgZ2V0IHRoZSB2YWx1ZSBpbiB0d28gc3RlcHM6Ci0JCQkvLyAxLiBnZXQgdGhlIHRhc2tzIHRoYXQgb3V0cHV0IHRoaXMgV1AKLQkJCS8vIDIuIGdldCB0aGUgcm9sZXMgdGhhdCBpcyB0aGUgcmVzcG9uc2libGUgZm9yIHRoZSB0YXNrcwotLy8JCQlMaXN0IG1vZGlmeVJvbGVzID0gQXNzb2NpYXRpb25IZWxwZXIKLS8vCQkJCQkuZ2V0TW9kaWZpZWRCeSgoV29ya1Byb2R1Y3QpIHN1cGVyLmVsZW1lbnQpOwotLy8JCQltb2RpZnlSb2xlcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnRzKAotLy8JCQkJCW1vZGlmeVJvbGVzLCBsYXlvdXRNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkKLS8vCQkJTGlzdCB0YXNrcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotLy8JCQkJCXN1cGVyLmVsZW1lbnQsIAotLy8JCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X091dHB1dEZyb21fVGFza3MsIAotLy8JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotLy8JCQlMaXN0IG1vZGlmeVJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdGFza3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLS8vCQkJCVRhc2sgdCA9IChUYXNrKWl0Lm5leHQoKTsKLS8vCQkJCUxpc3Qgcm9sZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLS8vCQkJCQkJdCwgCi0vLwkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSwgCi0vLwkJCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotLy8JCQkJZm9yIChJdGVyYXRvciBpdHIgPSByb2xlcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOyApIHsKLS8vCQkJCQlPYmplY3QgciA9IGl0ci5uZXh0KCk7Ci0vLwkJCQkJaWYgKCAhbW9kaWZ5Um9sZXMuY29udGFpbnMocikgKSB7Ci0vLwkJCQkJCW1vZGlmeVJvbGVzLmFkZChyKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJCQotCQkJTGlzdCBtb2RpZnlSb2xlcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY01vZGlmeVJvbGVzKAotCQkJCQkoV29ya1Byb2R1Y3Qpc3VwZXIuZWxlbWVudCwgCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJCi0JCQkvLyB0aGlzIGd1eSBkb2VzIG5vdCBoYXZlIGEgZGVmaW5lZCBvcHBvc2l0ZSBmZWF0dXJlCi0JCQkvLyBqdXN0IHBhc3MgbnVsbCBhcyBpdCdzIGZlYXR1cmUgb2JqZWN0LCBKaW5odWEgWGksIDA0LzE3LzIwMDYKLQkJCWFkZFJlZmVyZW5jZXMobnVsbCwgZWxlbWVudFhtbCwgIm1vZGlmeVJvbGVzIiwgbW9kaWZ5Um9sZXMpOyAvLyROT04tTkxTLTEkCi0KLQkJCUxpc3QgZG9tYWlucyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCQlzdXBlci5lbGVtZW50LCBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9Eb21haW5zLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfRG9tYWlucywgZWxlbWVudFhtbCwgImRvbWFpbnMiLCBkb21haW5zKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlMaXN0IHdvcmtQcm9kdWN0VHlwZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9Xb3JrUHJvZHVjdFR5cGVzLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfV29ya1Byb2R1Y3RUeXBlcywgZWxlbWVudFhtbCwgIndvcmtQcm9kdWN0VHlwZXMiLCB3b3JrUHJvZHVjdFR5cGVzKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlMaXN0IG1hbmRhdG9yeUlucHV0VG9UYXNrcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X01hbmRhdG9yeUlucHV0VG9fVGFza3MsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tzLCBlbGVtZW50WG1sLAotCQkJCQkibWFuZGF0b3J5SW5wdXRUb1Rhc2tzIiwgbWFuZGF0b3J5SW5wdXRUb1Rhc2tzKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlMaXN0IG9wdGlvbmFsSW5wdXRUb1Rhc2tzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfT3B0aW9uYWxJbnB1dFRvX1Rhc2tzLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfT3B0aW9uYWxJbnB1dFRvX1Rhc2tzLCBlbGVtZW50WG1sLAotCQkJCQkib3B0aW9uYWxJbnB1dFRvVGFza3MiLCBvcHRpb25hbElucHV0VG9UYXNrcyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJTGlzdCBvdXRwdXRGcm9tVGFza3MgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9PdXRwdXRGcm9tX1Rhc2tzLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfT3V0cHV0RnJvbV9UYXNrcywgCi0JCQkJCWVsZW1lbnRYbWwsICJvdXRwdXRGcm9tVGFza3MiLCBvdXRwdXRGcm9tVGFza3MpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCS8vIGFkZCB0aGUgZGVzY3JpcHRvcnMgcmVmZXJlbmNpbmcgdGhpcyBlbGVtZW50Ci0JCQlzdXBlci5wcm9jZXNzRGVzY3JpcHRvcnMoZWxlbWVudFhtbCk7Ci0KLQkJfQotCQllbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgiU2hvd0Z1bGxNZXRob2RDb250ZW50IiwgKGxheW91dE1hbmFnZXIuZ2V0VmFsaWRhdG9yKCkuc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkpID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YzRmM2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBsYXlvdXQgbWFuYWdlbWVudCBmb3IgbWV0aG9kIGFuZCBwcm9jZXNzIGVsZW1lbnRzIGluIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q1YmVmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciBtYW5hZ2luZyB0aGUgbGF5b3V0IG9mIG1ldGhvZCBhbmQgcHJvY2VzcyBlbGVtZW50cyBpbiBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9JWG1sRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC91dGlsL0lYbWxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYzg3ODkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC91dGlsL0lYbWxFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbDsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhbiBYTUwgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJWG1sRWxlbWVudCB7Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHhtbCBzdHJpbmcgdGV4dAotCSAqIEByZXR1cm4gU3RyaW5nQnVmZmVyCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciB0b1htbCgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L3V0aWwvWG1sRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC91dGlsL1htbEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmOTYxMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L3V0aWwvWG1sRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotCi0KLS8qKgotICogSW1wbGVtZW50cyBhIFhNTCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxFbGVtZW50IGltcGxlbWVudHMgSVhtbEVsZW1lbnQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlIgPSBGaWxlVXRpbC5MSU5FX1NFUDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBOT0RFX0lEID0gIm5vZGVJZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHByaXZhdGUgc3RhdGljIFN0cmluZyBQQVJFTlRfTk9ERV9JRCA9ICJwYXJlbnROb2RlSWQiOwotCi0JcHJpdmF0ZSBTdHJpbmcgZWxlbWVudF9uYW1lID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIGVsZW1lbnRfdmFsdWUgPSBudWxsOwotCi0JcHJpdmF0ZSBNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIE1hcCBjb250ZW50cyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIFN0cmluZyBpZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYW4gWG1sRWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBuYW1lIFN0cmluZwotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50KFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMobmFtZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlIGFuIFhtbEVsZW1lbnQKLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKLQkgKiBAcGFyYW0gaWQgU3RyaW5nCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQoU3RyaW5nIG5hbWUsIFN0cmluZyBpZCkgewotCQl0aGlzLmVsZW1lbnRfbmFtZSA9IG5hbWU7Ci0JCQotCQlpZiAoaWQgPT0gbnVsbCApIHsKLQkJCWlkID0gSW50ZWdlci50b0hleFN0cmluZyh0aGlzLnRvU3RyaW5nKCkuaGFzaENvZGUoKSk7Ci0JCX0KLQkJCi0JCXRoaXMuaWQgPSBpZDsKLQkJc2V0QXR0cmlidXRlKE5PREVfSUQsIHRoaXMuaWQpOwotCX0KLQkKLQkvKioKLQkgKiBzZXQgYXR0cmlidXRlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIFhtbEVsZW1lbnQgdGhlIGVsZW1lbnQgaXRzZWxmCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJYXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOwotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBYbWxFbGVtZW50IHRoZSBlbGVtZW50IGl0c2VsZgotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLmVsZW1lbnRfdmFsdWUgPSB2YWx1ZTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50LgotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBYbWxFbGVtZW50IHRoZSBlbGVtZW50IGl0c2VsZgotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IHNldENvbnRlbnQoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotCQljb250ZW50cy5wdXQobmFtZSwgdmFsdWUpOwotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgYSBjaGlsZCBlbGVtZW50Ci0JICogQHBhcmFtIGNoaWxkCi0JICogQHJldHVybiBYbWxFbGVtZW50IHRoZSBlbGVtZW50IGl0c2VsZgotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGFkZENoaWxkKFhtbEVsZW1lbnQgY2hpbGQpIHsKLQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlIGEgbmV3IGNoaWlsZCBlbGVtZW50Ci0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIFhtbEVsZW1lbnQgdGhlIGNoaWxkIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBuZXdDaGlsZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbmV3Q2hpbGQobmFtZSwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIGNyZWF0ZSBhIG5ldyBjaGlsZCBlbGVtZW50Ci0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuIFhtbEVsZW1lbnQgdGhlIGNoaWxkIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBuZXdDaGlsZChTdHJpbmcgbmFtZSwgU3RyaW5nIGlkKSB7Ci0JCVhtbEVsZW1lbnQgY2hpbGQgPSBuZXcgWG1sRWxlbWVudChuYW1lLCBpZCk7Ci0JCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCXJldHVybiBjaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGlkCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gdGhpcy5pZDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSB4bWwgc3RyaW5nCi0JICogQHJldHVybiBTdHJpbmdCdWZmZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIHRvWG1sKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAoY29udGVudHMuc2l6ZSgpID09IDAgJiYgY2hpbGRyZW4uc2l6ZSgpID09IDApIHsKLQkJCWJ1ZmZlci5hcHBlbmQoCi0JCQkJCVhtbEhlbHBlci5nZXRFbGVtZW50KGVsZW1lbnRfbmFtZSwgZWxlbWVudF92YWx1ZSwKLQkJCQkJCQlhdHRyaWJ1dGVzKSkuYXBwZW5kKEJSKTsKLQkJfSBlbHNlIHsKLQkJCWJ1ZmZlci5hcHBlbmQoWG1sSGVscGVyLmJlZ2luRWxlbWVudChlbGVtZW50X25hbWUsIGF0dHJpYnV0ZXMpKQotCQkJCQkuYXBwZW5kKEJSKTsKLQotCQkJLy8gcHJvY2VzcyB0aGUgY29udGVudHMKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjb250ZW50cy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJCU9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0TGlzdCA9ICgoTGlzdCkgdmFsdWUpLml0ZXJhdG9yKCk7IGl0TGlzdAotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKAotCQkJCQkJCQlYbWxIZWxwZXIuZ2V0RWxlbWVudChrZXksIGl0TGlzdC5uZXh0KCkKLQkJCQkJCQkJCQkudG9TdHJpbmcoKSwgbnVsbCkpLmFwcGVuZChCUik7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlidWZmZXIKLQkJCQkJCQkuYXBwZW5kKAotCQkJCQkJCQkJWG1sSGVscGVyCi0JCQkJCQkJCQkJCS5nZXRFbGVtZW50KAotCQkJCQkJCQkJCQkJCWtleSwKLQkJCQkJCQkJCQkJCQkodmFsdWUgPT0gbnVsbCkgPyAiIiA6IHZhbHVlLnRvU3RyaW5nKCksIG51bGwpKS5hcHBlbmQoQlIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCi0JCQkvLyBwcm9jZXNzIHRoZSBjaGlsZHJlbgotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlJWG1sRWxlbWVudCBjaGlsZCA9IChJWG1sRWxlbWVudCkgaXQubmV4dCgpOwotCQkJCWJ1ZmZlci5hcHBlbmQoY2hpbGQudG9YbWwoKSk7Ci0JCQl9Ci0KLQkJCWJ1ZmZlci5hcHBlbmQoWG1sSGVscGVyLmVuZEVsZW1lbnQoZWxlbWVudF9uYW1lKSkuYXBwZW5kKEJSKTsKLQkJfQotCi0JCXJldHVybiBidWZmZXI7Ci0JfQotCi0JLyoqCi0JICogc2F2ZSB0aGUgZWxlbWVudCdzIHhtbCB0byBhIGZpbGUKLQkgKiBAcGFyYW0gZmlsZVBhdGhOYW1lCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZVRvKFN0cmluZyBmaWxlUGF0aE5hbWUpIHsKLQkJU3RyaW5nQnVmZmVyIHhtbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJeG1sLmFwcGVuZChYbWxIZWxwZXIuWE1MX0hFQURFUikuYXBwZW5kKHRoaXMudG9YbWwoKSk7Ci0KLQkJdHJ5IHsKLQkJCS8vIG1heSBuZWVkIHRvIGNyZWF0ZSB0aGUgZm9sZGVycywgVE9ETwotCQkJLyoKLQkJCSAqIEZpbGUgeGYgPSBuZXcgRmlsZSggZmlsZVBhdGgpOyBpZiAoICF4Zi5leGlzdHMoKSApIHsgeGYubWtkaXJzKCk7IH0KLQkJCSAqLwotCi0JCQkvLyBuZWVkIHRvIGVuZm9yZSB1dGYtOCBlbmNvZGluZywgY2FuJ3QgdXNlIEZpbGVXcml0ZXIsIGp4aQotCQkJLy8gRmlsZVdyaXRlciB4dyA9IG5ldyBGaWxlV3JpdGVyKGZpbGVQYXRoTmFtZSk7Ci0JCQlPdXRwdXRTdHJlYW1Xcml0ZXIgeHcgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAotCQkJCQluZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlUGF0aE5hbWUpLCAidXRmLTgiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQl4dy53cml0ZSh4bWwudG9TdHJpbmcoKSk7Ci0JCQl4dy5mbHVzaCgpOwotCQkJeHcuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9YbWxIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9YbWxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmYWQyNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L3V0aWwvWG1sSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlhNTFV0aWw7Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgZm9yIHByb2Nlc3NpbmcgdGhlIFhNTCByZXByZXNlbnRhdGlvbiBvZiBhIE1ldGhvZCBFbGVtZW50LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKi8KLXB1YmxpYyBjbGFzcyBYbWxIZWxwZXIgewotCi0JLyoqCi0JICogWE1MIGRlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9IRUFERVIgPSBYTUxVdGlsLlhNTF9ERUNMQVJBVElPTgotCQkJKyBGaWxlVXRpbC5MSU5FX1NFUDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbGlkTmFtZShTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIFhNTFV0aWwuZXNjYXBlKGVsZW1lbnROYW1lLnJlcGxhY2UoJyAnLCAnLScpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBxdW90ZShTdHJpbmcgc3RyKSB7Ci0JCXJldHVybiAiXCIiICsgc3RyICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHMpIHsKLQkJcmV0dXJuIHMgPT0gbnVsbCA/ICIiIDogczsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSB0aGUgc3RhcnQgdGFnIG9mIGFuIHhtbCBlbGVtZW50Ci0JICogQHBhcmFtIGVsZW1lbnROYW1lCi0JICogQHBhcmFtIGF0dHJpYnV0ZXMKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJlZ2luRWxlbWVudChTdHJpbmcgZWxlbWVudE5hbWUsIE1hcCBhdHRyaWJ1dGVzKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoIjwiICsgdmFsaWROYW1lKGVsZW1lbnROYW1lKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKChhdHRyaWJ1dGVzICE9IG51bGwpICYmIChhdHRyaWJ1dGVzLnNpemUoKSA+IDApKSB7Ci0JCQlJdGVyYXRvciBpdCA9IGF0dHJpYnV0ZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkJU3RyaW5nIGtleSwgdmFsdWU7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJCWtleSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJCXZhbHVlID0gcXVvdGUoWE1MVXRpbC5lc2NhcGUoCi0JCQkJCQl2YWxpZGF0ZSgoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpKSwgdHJ1ZSkpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIiAiICsgdmFsaWROYW1lKGtleSkgKyAiPSIgKyB2YWx1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoIj4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlIGFuIGVuZCB0YWcgb2YgYW4geG1sIGVsZW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudE5hbWUKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuZEVsZW1lbnQoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiAiPC8iICsgdmFsaWROYW1lKGVsZW1lbnROYW1lKSArICI+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogY3JlYXRlIGFuIHhtbCBlbGVtZW50IHN0cmluZwotCSAqIEBwYXJhbSBlbGVtZW50TmFtZQotCSAqIEBwYXJhbSBlbGVtZW50VmFsdWUKLQkgKiBAcGFyYW0gYXR0cmlidXRlcwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudChTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBlbGVtZW50VmFsdWUsCi0JCQlNYXAgYXR0cmlidXRlcykgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKGJlZ2luRWxlbWVudChlbGVtZW50TmFtZSwgYXR0cmlidXRlcykpLmFwcGVuZCgKLQkJCQlYTUxVdGlsLmVzY2FwZSh2YWxpZGF0ZShlbGVtZW50VmFsdWUpLCB0cnVlKSkuYXBwZW5kKAotCQkJCWVuZEVsZW1lbnQoZWxlbWVudE5hbWUpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC91dGlsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMGYwMzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGxheW91dCBtYW5hZ2VtZW50IHN1cHBvcnQgZm9yIG1ldGhvZCBhbmQgcHJvY2VzcyBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkxNjE1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRoZSBsaWJyYXJ5IHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZlcmVuY2VzL0xpYnJhcnlQcmVmZXJlbmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZlcmVuY2VzL0xpYnJhcnlQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDNkODg5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogVGhlIExpYnJhcnkgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVByZWZlcmVuY2VzIHsKLQotCS8qKgotCSAqIFByZWZlcmVuY2Uga2V5IGZvciBzdG9yaW5nIHRoZSBVUkkgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZAotCSAqIGluIHRoZSBsYXN0IHNlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfTUVUSE9EX0xJUkFSWV9VUkkgPSAic2F2ZWRNZXRob2RMaWJyYXJ5VVJJIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJlZmVyZW5jZSBrZXkgZm9yIHN0b3JpbmcgdGhlIHR5cGUgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZAotCSAqIGluIHRoZSBsYXN0IHNlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfTUVUSE9EX0xJUkFSWV9UWVBFID0gInNhdmVkTWV0aG9kTGlicmFyeVR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcmVmZXJlbmNlIGtleSBmb3Igc3RvcmluZyB0aGUgZGlzY2FyZCB1bnJlc29sdmVkIHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMgPSAiZGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJlZmVyZW5jZSBrZXkgZm9yIHVzZSBuZXcgZXh0ZW5kcyBzZW1hbnRpY3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX05FV19FWFRFTkRTX1NFTUFOVElDUyA9ICJ1c2VOZXdFeHRlbmRzU2VtYW50aWNzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJlZmVyZW5jZSBrZXkgZm9yIHRoZSBob3Jpem9udGFsIHNwYWNpbmcgYmV0d2VlbiB0YXNrcyBhbmQgcm9sZXMgaW4gdGhlCi0JICogcm9sZSBkaWFncmFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfRElBR1JBTV9IT1JJWk9OVEFMX1NQQUNJTkcgPSAicm9sZURpYWdyYW1Ib3Jpem9udGFsU3BhY2luZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByZWZlcmVuY2Uga2V5IGZvciB0aGUgdmVydGljYWwgc3BhY2luZyBiZXR3ZWVuIHRhc2tzIGFuZCByb2xlcyBpbiB0aGUKLQkgKiByb2xlIGRpYWdyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9ESUFHUkFNX1ZFUlRJQ0FMX1NQQUNJTkcgPSAicm9sZURpYWdyYW1WZXJ0aWNhbFNwYWNpbmciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcmVmZXJlbmNlIGtleSBmb3IgdGhlIG1heGltdW4gZWxlbWVudCBsYWJlbCB0ZXh0IGxpbmVzIGluIHRoZSByb2xlCi0JICogZGlhZ3JhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX0RJQUdSQU1fTUFYX1RFWFRfTElORVMgPSAicm9sZURpYWdyYW1FbGVtZW50TGFiZWxUZXh0TGluZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMgPSBmYWxzZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVGQVVMVF9VU0VfTkVXX0VYVEVORFNfU0VNQU5USUNTID0gZmFsc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ST0xFX0RJQUdSQU1fSE9SSVpPTlRBTF9TUEFDSU5HID0gNzA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ST0xFX0RJQUdSQU1fVkVSVElDQUxfU1BBQ0lORyA9IDMwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUk9MRV9ESUFHUkFNX01BWF9URVhUX0xJTkVTID0gMzsKLQotCS8vIFRoZSBwbHVnLWluIHNwZWNpZmljIHByZWZlcmVuY2Ugc3RvcmUuCi0JcHJpdmF0ZSBzdGF0aWMgSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgcHJlZlN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCXN0YXRpYyB7Ci0JCS8vIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KERJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTLAotCQkJCURFRkFVTFRfRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChVU0VfTkVXX0VYVEVORFNfU0VNQU5USUNTLAotCQkJCURFRkFVTFRfVVNFX05FV19FWFRFTkRTX1NFTUFOVElDUyk7Ci0KLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoUk9MRV9ESUFHUkFNX0hPUklaT05UQUxfU1BBQ0lORywKLQkJCQlERUZBVUxUX1JPTEVfRElBR1JBTV9IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChST0xFX0RJQUdSQU1fVkVSVElDQUxfU1BBQ0lORywKLQkJCQlERUZBVUxUX1JPTEVfRElBR1JBTV9WRVJUSUNBTF9TUEFDSU5HKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoUk9MRV9ESUFHUkFNX01BWF9URVhUX0xJTkVTLAotCQkJCURFRkFVTFRfUk9MRV9ESUFHUkFNX01BWF9URVhUX0xJTkVTKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBVUkkgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZCBpbiB0aGUgbGFzdCBzZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNhdmVkTWV0aG9kTGlicmFyeVVSSSgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoU0FWRURfTUVUSE9EX0xJUkFSWV9VUkkpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBVUkkgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZCBpbiB0aGUgbGFzdCBzZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTYXZlZE1ldGhvZExpYnJhcnlVUkkoU3RyaW5nIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShTQVZFRF9NRVRIT0RfTElSQVJZX1VSSSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZCBpbiB0aGUgbGFzdCBzZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNhdmVkTWV0aG9kTGlicmFyeVR5cGUoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKFNBVkVEX01FVEhPRF9MSVJBUllfVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIHR5cGUgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZCBpbiB0aGUgbGFzdCBzZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTYXZlZE1ldGhvZExpYnJhcnlUeXBlKFN0cmluZyB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoU0FWRURfTUVUSE9EX0xJUkFSWV9UWVBFLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBkaXNjYXJkIHVucmVzb2x2ZWQgcmVmZXJlbmNlcyBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0RGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gREVGQVVMVF9ESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaXNjYXJkIHVucmVzb2x2ZWQgcmVmZXJlbmNlcyBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUyk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGRpc2NhcmQgdW5yZXNvbHZlZCByZWZlcmVuY2VzIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlcyhib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUywgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgdXNlIG5ldyBleHRlbmRzIHNlbWFudGljcyBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0VXNlTmV3RXh0ZW5kc1NlbWFudGljcygpIHsKLQkJcmV0dXJuIERFRkFVTFRfVVNFX05FV19FWFRFTkRTX1NFTUFOVElDUzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2UgbmV3IGV4dGVuZHMgc2VtYW50aWNzIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFVzZU5ld0V4dGVuZHNTZW1hbnRpY3MoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihVU0VfTkVXX0VYVEVORFNfU0VNQU5USUNTKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgdXNlIG5ldyBleHRlbmRzIHNlbWFudGljcyBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVc2VOZXdFeHRlbmRzU2VtYW50aWNzKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFVTRV9ORVdfRVhURU5EU19TRU1BTlRJQ1MsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHJvbGUgZGlhZ3JhbSBob3Jpem9udGFsIHNwYWNpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0RGVmYXVsdFJvbGVEaWFncmFtSG9yaXpvbnRhbFNwYWNpbmcoKSB7Ci0JCXJldHVybiBERUZBVUxUX1JPTEVfRElBR1JBTV9IT1JJWk9OVEFMX1NQQUNJTkc7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcm9sZSBkaWFncmFtIGhvcml6b250YWwgc3BhY2luZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRSb2xlRGlhZ3JhbUhvcml6b250YWxTcGFjaW5nKCkgewotCQlpbnQgdmFsdWUgPSBwcmVmU3RvcmUuZ2V0SW50KFJPTEVfRElBR1JBTV9IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQlyZXR1cm4gdmFsdWUgPiAwID8gdmFsdWUgOiBERUZBVUxUX1JPTEVfRElBR1JBTV9IT1JJWk9OVEFMX1NQQUNJTkc7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIHJvbGUgZGlhZ3JhbSBob3Jpem9udGFsIHNwYWNpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFJvbGVEaWFncmFtSG9yaXpvbnRhbFNwYWNpbmcoaW50IHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShST0xFX0RJQUdSQU1fSE9SSVpPTlRBTF9TUEFDSU5HLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCByb2xlIGRpYWdyYW0gdmVydGljYWwgc3BhY2luZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXREZWZhdWx0Um9sZURpYWdyYW1WZXJ0aWNhbFNwYWNpbmcoKSB7Ci0JCXJldHVybiBERUZBVUxUX1JPTEVfRElBR1JBTV9WRVJUSUNBTF9TUEFDSU5HOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJvbGUgZGlhZ3JhbSB2ZXJ0aWNhbCBzcGFjaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFJvbGVEaWFncmFtVmVydGljYWxTcGFjaW5nKCkgewotCQlpbnQgdmFsdWUgPSBwcmVmU3RvcmUuZ2V0SW50KFJPTEVfRElBR1JBTV9WRVJUSUNBTF9TUEFDSU5HKTsKLQkJcmV0dXJuIHZhbHVlID4gMCA/IHZhbHVlIDogREVGQVVMVF9ST0xFX0RJQUdSQU1fVkVSVElDQUxfU1BBQ0lORzsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgcm9sZSBkaWFncmFtIHZlcnRpY2FsIHNwYWNpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFJvbGVEaWFncmFtVmVydGljYWxTcGFjaW5nKGludCB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoUk9MRV9ESUFHUkFNX1ZFUlRJQ0FMX1NQQUNJTkcsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHJvbGUgZGlhZ3JhbSBlbGVtZW50IGxhYmVsIG1heGltdW0gdGV4dCBsaW5lcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXREZWZhdWx0Um9sZURpYWdyYW1NYXhpbXVtVGV4dExpbmVzKCkgewotCQlyZXR1cm4gREVGQVVMVF9ST0xFX0RJQUdSQU1fTUFYX1RFWFRfTElORVM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcm9sZSBkaWFncmFtIGVsZW1lbnQgbGFiZWwgbWF4aW11bSB0ZXh0IGxpbmVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFJvbGVEaWFncmFtTWF4aW11bVRleHRMaW5lcygpIHsKLQkJaW50IHZhbHVlID0gcHJlZlN0b3JlLmdldEludChST0xFX0RJQUdSQU1fTUFYX1RFWFRfTElORVMpOwotCQlyZXR1cm4gdmFsdWUgPiAwID8gdmFsdWUgOiBERUZBVUxUX1JPTEVfRElBR1JBTV9NQVhfVEVYVF9MSU5FUzsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgcm9sZSBkaWFncmFtIGVsZW1lbnQgbGFiZWwgbWF4aW11bSB0ZXh0IGxpbmVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSb2xlRGlhZ3JhbU1heGltdW1UZXh0TGluZXMoaW50IHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShST0xFX0RJQUdSQU1fTUFYX1RFWFRfTElORVMsIHZhbHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWNjMDM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBwcmVmZXJlbmNlIHN1cHBvcnQgZm9yIHRoZSBsaWJyYXJ5IHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL0JTQ29sdW1uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvQlNDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc4MWJhYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvQlNDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzOwotCi0vKioKLSAqIFNpbXBsZSBkYXRhIHN0cnVjdHVyZSB0byBpZGVudGlmeSBhIGJyZWFrZG93biBsYXlvdXQgY29sdW1uLgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBCU0NvbHVtbiB7Ci0KLQlwdWJsaWMgU3RyaW5nIGlkOwotCXB1YmxpYyBTdHJpbmcgbGFiZWw7Ci0JCi0JcHVibGljIEJTQ29sdW1uKFN0cmluZyBpZCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9MaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL0xpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZDRmNDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL0xpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmczsKLQotLyoqCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cyBleHRlbmRzIFByZWZlcmVuY2VDb25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MQVNUX0xJQlJBUllfUEFSRU5UX0RJUkVDVE9SWSA9IFBSRUZJWCArICJsYXN0X2xpYnJhcnlfX3BhcmVudF9kaXJlY3RvcnkiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MQVNUX0RFRkFVTFRfRElSRUNUT1JZX0NIRUNLRUQgPSBQUkVGSVggKyAibGFzdF9kZWZhdWx0X2RpcmVjdG9yeV9jaGVja2VkIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfUkFESU9fU0FWRV9DSE9JQ0UgPSBQUkVGSVggKyAicmFkaW9fc2F2ZV9jaG9pY2UiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MQVNUX1RSQU5TTEFUSU9OX0VYUE9SVF9ESVJFQ1RPUlkgPSBQUkVGSVggKyAibGFzdF90cmFuc2xhdGlvbl9leHBvcnRfZGlyZWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MQVNUX1BVQkxJU0hfRk9MREVSID0gUFJFRklYICsgImxhc3RfcHVibGlzaF9mb2xkZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9ERUZBVUxUX1BVQkxJU0hfRElSRUNUT1JZID0gUFJFRklYICsgImRlZmF1bHRfcHVibGlzaF9kaXJlY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9ERUZBVUxUX0ZFRURCQUNLX1VSTCA9IFBSRUZJWCArICJkZWZhdWx0X2ZlZWRiYWNrX3VybCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1BST01QVF9GT1JfTElCUkFSWV9BVF9TVEFSVFVQID0gUFJFRklYICsgInByb21wdF9mb3JfbGlicmFyeV9hdF9zdGFydHVwIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfU0VMRUNURURfQ09ORklHX0lOX0xBU1RfU0VTU0lPTiA9IFBSRUZJWCArICJzZWxlY3RlZF9jb25maWdfaW5fbGFzdF9zZXNzaW9uIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9ERUZBVUxUX0hJU1RPUllfU0laRSA9IFBSRUZJWCArICJkZWZhdWx0X2xpc3RfbGVuZ3RoX2xhYmVsIjsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjk0NjA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotCi0vKioKLSAqIENvbnN0YW50cyB0byBiZSB1c2VkIGluIHByZWZlcmVuY2Ugc3RvcmUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByZWZlcmVuY2VDb25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWYuIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gbW92ZWQgZnJvbSB0byBoZXJlIHRvIHNoYXJlIHRoZSBjb25zdGFudHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1dCU19DT0xVTU5TID0gTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfVEJTX0NPTFVNTlMgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX1RCU19DT0xVTU5TOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9XUEJTX0NPTFVNTlMgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUzsKLQotCS8vIGRlZmluZSB0aGUgZGVmYXVsdCBjb2x1bW5zIGZvciB3YnMsIHRicywgYW5kIHdwYnMgbGF5b3V0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1dCU19DT0xVTU5TID0gewotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSwKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSUQsCi0JCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCwKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTLCBJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8sCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUsIElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUExBTk5FRCwKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSwKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4sCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09QVElPTkFMIH07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfVEJTX0NPTFVNTlMgPSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCwKLQkJCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPLCBJQlNJdGVtUHJvdmlkZXIuQ09MX1RFQU1TLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFLCBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQsCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUwgfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9XUEJTX0NPTFVNTlMgPSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCwKLQkJCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPLCBJQlNJdGVtUHJvdmlkZXIuQ09MX0VOVFJZX1NUQVRFLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFLCBJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFLCBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQsCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUwgfTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL1ByZWZlcmVuY2VVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvUHJlZmVyZW5jZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkxZTE1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvUHJlZmVyZW5jZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogdXRpbGl0eSBjbGFzcyB0byBoYW5kbGUgdGhlIHByb2Nlc3MgZWxlbWVudCBsYXlvdXQgcHJlZmVyZW5jZXMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlVXRpbCB7Ci0JCQotCXByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgeHNsUGFyYW1zOwotCXByaXZhdGUgc3RhdGljIE1hcCBjb2xJZExhYmVsTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkvLyBxdWljayBzb2x1dGlvbiwgdGhlIHRlYW0gY29sdW1uIGZvciB0aGUgV0JTIHZpZXcuCi0JLy8gMTYyNzgzIC0gUHVibGlzaCB0ZWFtIGluZm9ybWF0aW9uIGluIFdCUyBmb3IgVERzCi0JcHJpdmF0ZSBzdGF0aWMgQlNDb2x1bW4gdGVhbUNvbCA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfU1RFUFMgPSAic3RlcHMiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHsKLQkJdHJ5IHsKLQkJCVByb3BlcnRpZXMgcGFyYW1zID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvcGVydGllcygKLQkJCQkJIi9sYXlvdXQveHNsL3Jlc291cmNlcy5wcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJc2V0WHNsUHJvcGVydGllcyhwYXJhbXMpOwotCQkJCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0WHNsUHJvcGVydGllcyhQcm9wZXJ0aWVzIG5ld1hzbFBhcmFtcykgewotCQl4c2xQYXJhbXMgPSBuZXdYc2xQYXJhbXM7CQotCQkKLQkJY29sSWRMYWJlbE1hcC5wdXQoSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCwgZ2V0TGFiZWwoImluZGV4VGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUsIGdldExhYmVsKCJuYW1lVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLCBnZXRMYWJlbCgiYnJlYWtkb3duRWxlbWVudFRleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY29sSWRMYWJlbE1hcC5wdXQoSURfU1RFUFMsIGdldExhYmVsKCJzdGVwc1RleHQiKSk7CQkgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCwgZ2V0TGFiZWwoInByZWZpeFRleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY29sSWRMYWJlbE1hcC5wdXQoSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFLCBnZXRMYWJlbCgidHlwZVRleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY29sSWRMYWJlbE1hcC5wdXQoSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPLCBnZXRMYWJlbCgibW9kZWxJbmZvVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUywgZ2V0TGFiZWwoInByZWRlY2Vzc29yc1RleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY29sSWRMYWJlbE1hcC5wdXQoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFLCBnZXRMYWJlbCgicmVwZWF0YWJsZVRleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY29sSWRMYWJlbE1hcC5wdXQoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HLCBnZXRMYWJlbCgib25nb2luZ1RleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY29sSWRMYWJlbE1hcC5wdXQoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4sIGdldExhYmVsKCJldmVudERyaXZlblRleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY29sSWRMYWJlbE1hcC5wdXQoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PUFRJT05BTCwgZ2V0TGFiZWwoIm9wdGlvbmFsVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQsIGdldExhYmVsKCJwbGFubmVkVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywgZ2V0TGFiZWwoIm11bHRpcGxlT2NjdXJyZW5jZXNUZXh0IikpOyAvLyROT04tTkxTLTEkCi0KLQkJY29sSWRMYWJlbE1hcC5wdXQoSUJTSXRlbVByb3ZpZGVyLkNPTF9URUFNUywgZ2V0TGFiZWwoInRlYW1UZXh0IikpOyAvLyROT04tTkxTLTEkCi0KLQkJY29sSWRMYWJlbE1hcC5wdXQoSUJTSXRlbVByb3ZpZGVyLkNPTF9ERUxJVkVSQUJMRSwgZ2V0TGFiZWwoImRlbGl2ZXJhYmxlVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0VOVFJZX1NUQVRFLCBnZXRMYWJlbCgiZW50cnlTdGF0ZVRleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY29sSWRMYWJlbE1hcC5wdXQoSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFLCBnZXRMYWJlbCgiZXhpdFN0YXRlVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRMYWJlbChTdHJpbmcga2V5KSB7Ci0JCVN0cmluZyBsYWJlbCA9IHhzbFBhcmFtcy5nZXRQcm9wZXJ0eShrZXkpOwotCQlpZiAoIGxhYmVsID09IG51bGwgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNhbid0IGZpbmQgcHJvcGVydHkgZW50cnkgZm9yICIgKyBrZXkpOyAvLyROT04tTkxTLTEkCi0JCQlsYWJlbCA9IGtleTsKLQkJfQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIGdldCBhIGxpc3Qgb2YgY29sdW1ucyBmb3IgV0JTIGxheW91dAotCSAqIEByZXR1cm4gTGlzdCBvZiBCU0NvbHVtbiBvYmplY3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFdCU0NvbHVtbnMoKSB7Ci0JCUxpc3QgY29scyA9IGdldFByZWZlcmVuY2VJdGVtcyhQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpOwotCQkKLQkJLy8gaWYgdGhlIFRCUyBjb2x1bW5zIGhhcyB0ZWFtLCBhbHNvIGFkZCB0byB0aGUgV0JTCi0JCS8vIDE2Mjc4MyAtIFB1Ymxpc2ggdGVhbSBpbmZvcm1hdGlvbiBpbiBXQlMgZm9yIFREcwotCQl0ZWFtQ29sID0gbnVsbDsKLQkJZ2V0VEJTQ29sdW1ucygpOwotCQlpZiAoIHRlYW1Db2wgIT0gbnVsbCApIHsKLQkJCWNvbHMuYWRkKGNvbHMuc2l6ZSgpLCB0ZWFtQ29sKTsKLQkJfQotCQlyZXR1cm4gY29sczsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGEgbGlzdCBvZiBjb2x1bW5zIGZvciBUQlMgbGF5b3V0Ci0JICogQHJldHVybiBMaXN0IG9mIEJTQ29sdW1uIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0VEJTQ29sdW1ucygpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VJdGVtcyhQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMpOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgYSBsaXN0IG9mIGNvbHVtbnMgZm9yIFdQQlMgbGF5b3V0Ci0JICogQHJldHVybiBMaXN0IG9mIEJTQ29sdW1uIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0V1BCU0NvbHVtbnMoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlSXRlbXMoUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUyk7Ci0JfQotCQotCS8qKgotCSAqIHZhbGlkYXRlIHRoZSBjb2x1bW5zCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlUHJlZmVyZW5jZXMoKSB7Ci0JCS8vIGNhbGwgdGhlIG1ldGhvZCB0byBtYWtlIHN1cmUgdGhlIGRlZmF1bHQgaXMgbG9hZGVkCi0JCWdldFdCU0NvbHVtbnMoKTsKLQkJZ2V0VEJTQ29sdW1ucygpOwotCQlnZXRXUEJTQ29sdW1ucygpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBMaXN0IGdldFByZWZlcmVuY2VJdGVtcyhTdHJpbmcga2V5KSB7Ci0JCQotCQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBzdG9yZSA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwkJCi0JCVN0cmluZyBzdHIgPSBzdG9yZS5nZXRTdHJpbmcoa2V5KTsKLQkJaWYgKHN0ciA9PSBudWxsKSB7Ci0JCQlzdHIgPSBzdG9yZS5nZXREZWZhdWx0U3RyaW5nKGtleSk7Ci0JCX0KLQkJCi0JCWlmICggc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDAgKSB7Ci0JCQlzdHIgPSBnZXREZWZhdWx0KGtleSk7Ci0JCQlzdG9yZS5zZXRWYWx1ZShrZXksIHN0cik7Ci0JCX0KLQkJCi0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0ciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIGlkID0gdG9rZW5zLm5leHRUb2tlbigpLnRyaW0oKTsJCQotCQkJaWYgKGlkICE9IG51bGwgJiYgaWQubGVuZ3RoKCkgIT0gMCApIHsKLQkJCQkKLQkJCQlCU0NvbHVtbiBjb2wgPSBuZXcgQlNDb2x1bW4oaWQsIGdldENvbFRleHQoaWQpKTsKLQkJCQlpdGVtcy5hZGQoY29sKTsKLQkJCQkvLyBhZGQgc3RlcHMgY29sdW1uIGZvciBXQlMKLQkJCQlpZiAoIGtleS5lcXVhbHMoUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKSAKLQkJCQkJCSYmIGlkLmVxdWFscyhJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FKSApIHsKLQkJCQkJY29sID0gbmV3IEJTQ29sdW1uKElEX1NURVBTLCBnZXRDb2xUZXh0KElEX1NURVBTKSk7Ci0JCQkJCWl0ZW1zLmFkZChjb2wpOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBzYXZlIHRoZSB0ZWFtIGNvbHVtbiBmb3IgV0JTCi0JCQkJLy8gMTYyNzgzIC0gUHVibGlzaCB0ZWFtIGluZm9ybWF0aW9uIGluIFdCUyBmb3IgVERzCi0JCQkJaWYgKCBJQlNJdGVtUHJvdmlkZXIuQ09MX1RFQU1TLmVxdWFscyhpZCkgKSB7Ci0JCQkJCXRlYW1Db2wgPSBjb2w7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDb2xUZXh0KFN0cmluZyBrZXkpIHsKLQkJU3RyaW5nIHRleHQgPSAoU3RyaW5nKWNvbElkTGFiZWxNYXAuZ2V0KGtleSk7Ci0JCWlmICggdGV4dCA9PSBudWxsICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJObyBsYWJlbCBkZWZpbmVkIGZvciBjb2x1bW4gIiArIGtleSk7ICAvLyROT04tTkxTLTEkCi0JCQl0ZXh0ID0ga2V5OwotCQl9Ci0JCQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgIFN0cmluZyBnZXREZWZhdWx0KFN0cmluZyBrZXkpIHsKLQkJaWYgKCBQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMuZXF1YWxzKGtleSkgKSB7Ci0JCQlyZXR1cm4gdG9TdHJpbmcoUHJlZmVyZW5jZUNvbnN0YW50cy5ERUZBVUxUX1dCU19DT0xVTU5TKTsKLQkJfQotCQkKLQkJaWYgKCBQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMuZXF1YWxzKGtleSkgKSB7Ci0JCQlyZXR1cm4gdG9TdHJpbmcoUHJlZmVyZW5jZUNvbnN0YW50cy5ERUZBVUxUX1RCU19DT0xVTU5TKTsKLQkJfQotCQkKLQkJaWYgKCBQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV1BCU19DT0xVTU5TLmVxdWFscyhrZXkpICkgewotCQkJcmV0dXJuIHRvU3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuREVGQVVMVF9XUEJTX0NPTFVNTlMpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKFN0cmluZ1tdIGlkcykgewotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbWF4ID0gaWRzLmxlbmd0aCAtIDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCXN0ckJ1Zi5hcHBlbmQoaWRzW2ldKQotCQkJCQkuYXBwZW5kKCcsJyk7Ci0JCX0KLQkJc3RyQnVmLmFwcGVuZChpZHNbaWRzLmxlbmd0aC0xXSk7Ci0JCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZVNlbGVjdGVkQ29uZmlnSW50b1BlcnNpc3RlbmNlKFN0cmluZyBjb25maWdOYW1lKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXN0b3JlCi0JCQkJLnNldFZhbHVlKAotCQkJCQkJTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9TRUxFQ1RFRF9DT05GSUdfSU5fTEFTVF9TRVNTSU9OLAotCQkJCQkJY29uZmlnTmFtZSk7Ci0JCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNhdmVkTGFzdENvbmZpZygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgc3RvcmUgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJcmV0dXJuIHN0b3JlCi0JCQkJLmdldFN0cmluZyhMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1NFTEVDVEVEX0NPTkZJR19JTl9MQVNUX1NFU1NJT04pOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWNjMDM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBwcmVmZXJlbmNlIHN1cHBvcnQgZm9yIHRoZSBsaWJyYXJ5IHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Byb2plY3QvTWV0aG9kTGlicmFyeVByb2plY3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcm9qZWN0L01ldGhvZExpYnJhcnlQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYzVlYWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Byb2plY3QvTWV0aG9kTGlicmFyeVByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgZm9yIG1hbmFnaW5nIHRoZSBNZXRob2QgTGlicmFyeSBQcm9qZWN0cyBpbiBhIHdvcmtzcGFjZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RMaWJyYXJ5UHJvamVjdCB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgaW4gdGhlIGN1cnJlbnQgd29ya3NwYWNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBBbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogQHBhcmFtIHByb2plY3ROYW1lCi0JICogICAgICAgICAgICBBIG5hbWUgZm9yIHRoZSBuZXcgbWV0aG9kIGxpYnJhcnkgcHJvamVjdC4KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgQSBwcm9ncmVzcyBtb25pdG9yLgotCSAqIEByZXR1cm4gQSBtZXRob2QgbGlicmFyeSBwcm9qZWN0LgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBjcmVhdGVQcm9qZWN0KFN0cmluZyBwYXRoLCBTdHJpbmcgcHJvamVjdE5hbWUsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQotCQkvLyBmaW5kIHRoZSBwcm9qZWN0IGJ5IHBhdGgKLQkJSVByb2plY3QgcHJvamVjdCA9IGZpbmRQcm9qZWN0KHBhdGgpOwkJCi0JCWlmIChwcm9qZWN0ICE9IG51bGwgKSB7Ci0JCQlwcm9qZWN0LmRlbGV0ZShJUHJvamVjdC5GT1JDRQotCQkJCQl8IElQcm9qZWN0Lk5FVkVSX0RFTEVURV9QUk9KRUNUX0NPTlRFTlQsIG1vbml0b3IpOwotCQl9Ci0JCQotCQlpZiAoIHByb2plY3ROYW1lID09IG51bGwgKSB7Ci0JCQlGaWxlIGxpYnJhcnlQYXRoID0gbmV3IEZpbGUocGF0aCk7Ci0JCQlwcm9qZWN0TmFtZSA9IGxpYnJhcnlQYXRoLmdldE5hbWUoKTsKLQkJfQotCQkKLQkJLy8gaWYgYSBwcm9qZWN0IG9mIHRoZSBzYW1lIG5hbWUgYWxzbyBleGlzdHMsIGRlbGV0ZSBpdAotCQkvLyB0aGlzIGlzIG5lZWRlZCB0byB0YWtlIGNhcmUgb2YgdGhlIGZvbGxvd2luZyBzY2VuYXJpbzoKLQkJLy8gYSBwcm9qZWN0IGlzIG9wZW5lZCBidXQgbm90IGNsb3NlZCBmb3Igc29tZSByZWFzb24KLQkJLy8gbm93IGNyZWF0ZSBhIG5ldyBsaWJyYXJ5IHdpdGggdGhlIHNhbWUgbmFtZSAoc2FtZSBsaWJyYXJ5IGZvbGRlcikKLQkJLy8gd2UgbmVlZCB0byBkZWxldGUgdGhlIHByZXZpb3VzIG9uZQotCQlwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJaWYgKHByb2plY3QuZXhpc3RzKCkpIHsKLQkJCXByb2plY3QuZGVsZXRlKElQcm9qZWN0LkZPUkNFCi0JCQkJCXwgSVByb2plY3QuTkVWRVJfREVMRVRFX1BST0pFQ1RfQ09OVEVOVCwgbW9uaXRvcik7Ci0JCX0KLQkJCi0KLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHdvcmtzcGFjZQotCQkJCS5uZXdQcm9qZWN0RGVzY3JpcHRpb24ocHJvamVjdE5hbWUpOwotCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMoTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuTkFUVVJFX0lEUyk7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gbmV3IFBhdGgocGF0aCk7Ci0JCWlmICghUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS5pc1ByZWZpeE9mKHByb2plY3RQYXRoKSkgewotCQkJZGVzY3JpcHRpb24uc2V0TG9jYXRpb24ocHJvamVjdFBhdGgpOwotCQl9Ci0JCXByb2plY3QuY3JlYXRlKGRlc2NyaXB0aW9uLCBtb25pdG9yKTsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGluIHRoZSBjdXJyZW50IHdvcmtzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgQW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBBIHByb2dyZXNzIG1vbml0b3IuCi0JICogQHJldHVybiBBIDxjb2RlPklQcm9qZWN0PC9jb2RlPiBvciA8b2NkZT5udWxsPC9jb2RlPiBpZiB0aGUgbWV0aG9kCi0JICogICAgICAgICBsaWJyYXJ5IHByb2plY3QgY2Fubm90IGJlIGNyZWF0ZWQuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGNyZWF0ZVByb2plY3QoU3RyaW5nIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLS8vCQlJUHJvamVjdCBwcm9qZWN0ID0gZmluZFByb2plY3QocGF0aCk7Ci0vLwkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotLy8JCQlwcm9qZWN0LmRlbGV0ZShJUHJvamVjdC5GT1JDRQotLy8JCQkJCXwgSVByb2plY3QuTkVWRVJfREVMRVRFX1BST0pFQ1RfQ09OVEVOVCwgbW9uaXRvcik7Ci0vLwkJfQotLy8JCUZpbGUgbGlicmFyeVBhdGggPSBuZXcgRmlsZShwYXRoKTsKLS8vCQlTdHJpbmcgcHJvamVjdFBhdGggPSBsaWJyYXJ5UGF0aC5nZXRBYnNvbHV0ZVBhdGgoKTsKLS8vCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBsaWJyYXJ5UGF0aC5nZXROYW1lKCk7Ci0vLwkJcmV0dXJuIGNyZWF0ZVByb2plY3QocHJvamVjdFBhdGgsIHByb2plY3ROYW1lLCBtb25pdG9yKTsKLQkJCi0JCXJldHVybiBjcmVhdGVQcm9qZWN0KHBhdGgsIG51bGwsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFZlcmlmaWVzIHRoYXQgYSB3b3Jrc3BhY2UgcHJvamVjdCBpcyBhIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIEEgd29ya3NwYWNlIHByb2plY3QuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gd29ya3NwYWNlIHByb2plY3QgaXMgYSBtZXRob2QKLQkgKiAgICAgICAgIGxpYnJhcnkgcHJvamVjdCwgPGNvZGU+ZmFsc2U8L2Nsb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWV0aG9kTGlicmFyeVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGNsb3NlUHJvamVjdE9uRXhpdCA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlpZiAoIXByb2plY3QuaXNPcGVuKCkpIHsKLQkJCQkJcHJvamVjdC5vcGVuKElSZXNvdXJjZS5CQUNLR1JPVU5EX1JFRlJFU0gsCi0JCQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCWNsb3NlUHJvamVjdE9uRXhpdCA9IHRydWU7Ci0JCQkJfQotCQkJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nW10gbmF0dXJlSWRzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCQkJCWlmIChBcnJheXMuYXNMaXN0KG5hdHVyZUlkcykuY29udGFpbnMoCi0JCQkJCQkJTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuTkFUVVJFX0lEKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGNsb3NlUHJvamVjdE9uRXhpdCkgewotCQkJCQl0cnkgewotCQkJCQkJcHJvamVjdC5jbG9zZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogTG9jYXRlcyBhIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgaW4gdGhlIGN1cnJlbnQgd29ya3NwYWNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBBbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogQHJldHVybiBBIDxjb2RlPklQcm9qZWN0PC9jb2RlPiBvciA8b2NkZT5udWxsPC9jb2RlPiBpZiB0aGUgbWV0aG9kCi0JICogICAgICAgICBsaWJyYXJ5IHByb2plY3QgY2Fubm90IGJlIGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZmluZFByb2plY3QoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZmluYWwgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJCWlmIChuZXcgRmlsZShwYXRoKS5jb21wYXJlVG8ocHJvamVjdC5nZXRMb2NhdGlvbigpLnRvRmlsZSgpKSA9PSAwCi0JCQkJCQkmJiBpc01ldGhvZExpYnJhcnlQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJCXJldHVybiBwcm9qZWN0OwotCQkJCX0KLQkJCQlpZiAobmV3IEZpbGUocGF0aCkuY29tcGFyZVRvKHByb2plY3QuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKSkgPT0gMCkgewotCQkJCQlyZXR1cm4gcHJvamVjdDsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBMb2NhdGVzIGEgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBpbiB0aGUgY3VycmVudCB3b3Jrc3BhY2UuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIEEgbWV0aG9kIGxpYnJhcnkuCi0JICogQHJldHVybiBBIDxjb2RlPklQcm9qZWN0PC9jb2RlPiBvciA8b2NkZT5udWxsPC9jb2RlPiBpZiB0aGUgbWV0aG9kCi0JICogICAgICAgICBsaWJyYXJ5IHByb2plY3QgY2Fubm90IGJlIGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZmluZFByb2plY3QoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXJldHVybiBmaW5kUHJvamVjdChnZXRMaWJyYXJ5UGF0aChsaWJyYXJ5KSk7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYW4gZXhpc3RpbmcgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBpbiB0aGUgY3VycmVudCB3b3Jrc3BhY2UuCi0JICogPHA+Ci0JICogSWYgdGhlIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgY2Fubm90IGJlIGxvY2F0ZWQsIGNyZWF0ZSBhIG5ldyBvbmUuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIEFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeS4KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgQSBwcm9ncmVzcyBtb25pdG9yLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbi4KLQkgKiBAcmV0dXJuIEEgPGNvZGU+SVByb2plY3Q8L2NvZGU+LgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBvcGVuUHJvamVjdChTdHJpbmcgcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSAKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG9wZW5Qcm9qZWN0KHBhdGgsIG51bGwsICBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhbiBleGlzdGluZyBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGluIHRoZSBjdXJyZW50IHdvcmtzcGFjZS4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBjYW5ub3QgYmUgbG9jYXRlZCwgY3JlYXRlIGEgbmV3IG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgQW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBBIHByb2dyZXNzIG1vbml0b3IuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uLgotCSAqIEByZXR1cm4gQSA8Y29kZT5JUHJvamVjdDwvY29kZT4uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IG9wZW5Qcm9qZWN0KFN0cmluZyBwYXRoLCBTdHJpbmcgcHJvamVjdE5hbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBuZXcgUGF0aChwYXRoICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkrIElQcm9qZWN0RGVzY3JpcHRpb24uREVTQ1JJUFRJT05fRklMRV9OQU1FKTsKLQotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOwotCQl0cnkgewotCQkJZGVzY3JpcHRpb24gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkKLQkJCQkJLmxvYWRQcm9qZWN0RGVzY3JpcHRpb24ocHJvamVjdFBhdGgpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJZGVzY3JpcHRpb24gPSBudWxsOwotCQl9Ci0KLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCS8vIC5wcm9qZWN0IGZpbGUgaXMgbWlzc2luZywgY3JlYXRlIGEgbmV3IG1ldGhvZCBsaWJyYXJ5Ci0JCQkvLyBwcm9qZWN0LgotCQkJcHJvamVjdCA9IE1ldGhvZExpYnJhcnlQcm9qZWN0LmNyZWF0ZVByb2plY3QocGF0aCwgcHJvamVjdE5hbWUsIG1vbml0b3IpOwotCQl9IGVsc2UgewotCQkJLy8gLnByb2plY3QgZmlsZSBleGlzdHMsIHJldHJpZXZlIHRoZSBwcm9qZWN0IGZyb20gdGhlCi0JCQkvLyB3b3Jrc3BhY2UuCi0JCQlpZiAoIHByb2plY3ROYW1lICE9IG51bGwgKSB7Ci0JCQkJZGVzY3JpcHRpb24uc2V0TmFtZShwcm9qZWN0TmFtZSk7Ci0JCQl9Ci0JCQkKLQkJCXByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoCi0JCQkJCWRlc2NyaXB0aW9uLmdldE5hbWUoKSk7Ci0JCQlpZiAoIXByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQkvLyBUaGUgcHJvamVjdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgd29ya3NwYWNlLiBDcmVhdGUgYSBuZXcKLQkJCQkvLyBtZXRob2QgbGlicmFyeSBwcm9qZWN0IHVzaW5nIHRoZSBwcm9qZWN0IG5hbWUgZnJvbSB0aGUKLQkJCQkvLyAucHJvamVjdCBmaWxlLgotCQkJCXByb2plY3QgPSBNZXRob2RMaWJyYXJ5UHJvamVjdC5jcmVhdGVQcm9qZWN0KHBhdGgsIHByb2plY3QKLQkJCQkJCS5nZXROYW1lKCksIG1vbml0b3IpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBUaGUgcHJvamVjdCBkb2VzIGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UuCi0JCQkJLy8gVmVyaWZ5IHRoYXQgdGhlIGxvY2F0aW9uIG1hdGNoZXMuIElmIG5vdCwgY3JlYXRlIGEgbmV3IG1ldGhvZAotCQkJCS8vIGxpYnJhcnkgcHJvamVjdC4KLQkJCQlpZiAobmV3IEZpbGUocGF0aCkuY29tcGFyZVRvKHByb2plY3QuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKSkgIT0gMCkgewotCQkJCQlwcm9qZWN0ID0gTWV0aG9kTGlicmFyeVByb2plY3QuY3JlYXRlUHJvamVjdChwYXRoLCBtb25pdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIXByb2plY3QuaXNPcGVuKCkpIHsKLQkJCXByb2plY3Qub3BlbihJUmVzb3VyY2UuQkFDS0dST1VORF9SRUZSRVNILCBtb25pdG9yKTsKLQkJfQotCi0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJfQotCi0JCS8vIE1ha2Ugc3VyZSB0aGUgcHJvamVjdCBoYXMgdGhlIE1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlLgotCQlTdHJpbmdbXSBuYXR1cmVJZHMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQkJaWYgKCFBcnJheXMuYXNMaXN0KG5hdHVyZUlkcykuY29udGFpbnMoCi0JCQkJTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuTkFUVVJFX0lEKSkgewotCQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKE1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlLk5BVFVSRV9JRFMpOwotCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgSVByb2plY3QuRk9SQ0UKLQkJCQkJfCBJUHJvamVjdC5LRUVQX0hJU1RPUlksIG1vbml0b3IpOwotCQl9Ci0KLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogQ2xvc2VzIGEgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBBbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIEEgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZVByb2plY3QoU3RyaW5nIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGZpbmRQcm9qZWN0KHBhdGgpOwotCQkvLyBjaGVjayBpZiB3b3Jrc3BhY2UgaXMgbW9kaWZpYWJsZQotCQlpZiAocHJvamVjdCAhPSBudWxsICYmICFwcm9qZWN0LmdldFdvcmtzcGFjZSgpLmlzVHJlZUxvY2tlZCgpICYmIHByb2plY3QuaXNPcGVuKCkpIHsKLQkJCXByb2plY3QuY2xvc2UobW9uaXRvcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgYSBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIEEgbWV0aG9kIGxpYnJhcnkuCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIEEgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZVByb2plY3QoTWV0aG9kTGlicmFyeSBsaWJyYXJ5LAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWNsb3NlUHJvamVjdChnZXRMaWJyYXJ5UGF0aChsaWJyYXJ5KSwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlcyBhIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgZnJvbSB0aGUgY3VycmVudCB3b3Jrc3BhY2UuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIEFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeS4KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgQSBwcm9ncmVzcyBtb25pdG9yLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgaXMgc3VjY2Vzc2Z1bGx5Ci0JICogICAgICAgICBkZWxldGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZVByb2plY3QoU3RyaW5nIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZmluZFByb2plY3QocGF0aCk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgewotCQkJCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCQl9Ci0JCQkJcHJvamVjdC5kZWxldGUoSVByb2plY3QuRk9SQ0UKLQkJCQkJCXwgSVByb2plY3QuTkVWRVJfREVMRVRFX1BST0pFQ1RfQ09OVEVOVCwgbW9uaXRvcik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlcyBhIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgZnJvbSB0aGUgY3VycmVudCB3b3Jrc3BhY2UuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIEEgbWV0aG9kIGxpYnJhcnkuCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIEEgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGlzIHN1Y2Nlc3NmdWxseQotCSAqICAgICAgICAgZGVsZXRlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlUHJvamVjdChNZXRob2RMaWJyYXJ5IGxpYnJhcnksCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIGRlbGV0ZVByb2plY3QoZ2V0TGlicmFyeVBhdGgobGlicmFyeSksIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqIEByZXR1cm4gQW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRMaWJyYXJ5UGF0aChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKGxpYnJhcnkuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpCi0JCQkJLmdldFBhcmVudCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Byb2plY3QvTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcm9qZWN0L01ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmM2MzYzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Byb2plY3QvTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIE1ldGhvZCBMaWJyYXJ5IFByb2plY3QgbmF0dXJlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlIGltcGxlbWVudHMgSVByb2plY3ROYXR1cmUgewotCi0JLyoqCi0JICogVGhlIG5hdHVyZSBJRCBmb3IgYSBNZXRob2QgTGlicmFyeSBQcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVFVSRV9JRCA9IE1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgTWV0aG9kIExpYnJhcnkgUHJvamVjdCBuYXR1cmUgSURzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gTkFUVVJFX0lEUyA9IHsgTkFUVVJFX0lEIH07Ci0KLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0TmF0dXJlI2NvbmZpZ3VyZSgpCi0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3ROYXR1cmUjZGVjb25maWd1cmUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlY29uZmlndXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3ROYXR1cmUjZ2V0UHJvamVjdCgpCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3ROYXR1cmUjc2V0UHJvamVjdChJUHJvamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcm9qZWN0L3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcm9qZWN0L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMxOGI0ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJvamVjdC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBtYW5hZ2VtZW50IG9mIG1ldGhvZCBsaWJyYXJ5IHByb2plY3RzIGluIGEgd29ya3NwYWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9FbGVtZW50RmlsZS5qYXZhLnR4dCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9FbGVtZW50RmlsZS5qYXZhLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE4ZWM1OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvRWxlbWVudEZpbGUuamF2YS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlczsKLQotLyoqCi0gKiAKLSAqIFRoaXMgY2xhc3MgaXMgZGVwcmljYXRlZC4gdXNlIEZpbGVOYW1lR2VuZXJhdG9yIGluc3RlYWQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50RmlsZSBpbXBsZW1lbnRzIENvbXBhcmFibGUgewotCXByaXZhdGUgU3RyaW5nIGd1aWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZmlsZU5hbWU7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IGluZGV4Q291bnRlciA9IDA7Ci0JCi0JcHVibGljIEVsZW1lbnRGaWxlKFN0cmluZyBndWlkLCBTdHJpbmcgZmlsZU5hbWUpIHsKLQkJdGhpcy5ndWlkID0gZ3VpZDsKLQkJdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOwotCQlpbmRleENvdW50ZXIgPSAwOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGUpCXsKLQkJRWxlbWVudEZpbGUgZUZpbGUgPSAoRWxlbWVudEZpbGUpIGU7Ci0JCQotCQlpZiAoIShnZXRHdWlkKCkuZXF1YWxzKGVGaWxlLmdldEd1aWQoKSkpIAotCQkJCSYmIGdldEZpbGVOYW1lKCkuZXF1YWxzKGVGaWxlLmdldEZpbGVOYW1lKCkpKSB7CQkJCi0JCQlyZXR1cm4gYXBwZW5kSW5kZXgoKTsKLQkJfQotCQlpbmRleENvdW50ZXIrKzsKLQkJcmV0dXJuIGdldEZpbGVOYW1lKCkuZXF1YWxzKGVGaWxlLmdldEZpbGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZmlsZU5hbWUuaGFzaENvZGUoKTsKLQl9Ci0JCi0JcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IGUpIHsJCQotCQlpZiAoZSBpbnN0YW5jZW9mIEVsZW1lbnRGaWxlKQotCQl7Ci0JCQlFbGVtZW50RmlsZSBhRmlsZSA9IChFbGVtZW50RmlsZSkgZTsKLQkJCXJldHVybiBmaWxlTmFtZS5jb21wYXJlVG8oYUZpbGUuZ2V0RmlsZU5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBmTmFtZSkgewotCQlmaWxlTmFtZSA9IGZOYW1lOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkJewotCQlyZXR1cm4gZmlsZU5hbWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0R3VpZCgpCXsKLQkJcmV0dXJuIGd1aWQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBhcHBlbmRJbmRleCgpIHsKLQkJU3RyaW5nQnVmZmVyIHRTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKGdldEZpbGVOYW1lKCkpOwotCQlpbnQgYmVnaW5kSWR4ID0gZ2V0RmlsZU5hbWUoKS5sYXN0SW5kZXhPZigiLSIpOwotCQlpbnQgZW5kSWR4ID0gZ2V0RmlsZU5hbWUoKS5sYXN0SW5kZXhPZigiLmh0bSIpOwotCQlpZiAoYmVnaW5kSWR4ID4gLTEgJiYgZW5kSWR4ID4gLTEpIHsKLQkJCWlmIChpbmRleENvdW50ZXIgPiAwKSB7Ci0JCQkJdFN0cmluZy5yZXBsYWNlKGJlZ2luZElkeCsxLCBlbmRJZHgsIEludGVnZXIudG9TdHJpbmcoKytpbmRleENvdW50ZXIpKTsJCi0JCQkJc2V0RmlsZU5hbWUodFN0cmluZy50b1N0cmluZygpKTsKLQkJCQkvL2luZGV4Q291bnRlciA9IDA7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZW5kSWR4ID4gLTEpIHsJCQkKLQkJCXRTdHJpbmcuaW5zZXJ0KGVuZElkeCwgIi0iICsgSW50ZWdlci50b1N0cmluZygrK2luZGV4Q291bnRlcikpOwotCQkJc2V0RmlsZU5hbWUodFN0cmluZy50b1N0cmluZygpKTsKLQkJCS8vaW5kZXhDb3VudGVyID0gMDsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL0xpYnJhcnlNb2RpZmljYXRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdiZmRlOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoaXMgaGVscGVyIGlzIHVzaW5nIGFuIGluc3RhbmNlIG9mIElBY3Rpb25NYW5hZ2VyIHRvIGtlZXAgdHJhY2sgb2YgY2hhbmdlcy4KLSAqIENsaWVuIG11c3Qge0BsaW5rICNkaXNwb3NlKCkgPGVtPmRpc3Bvc2U8L2VtPn0gdGhpcyBoZWxwZXIgYWZ0ZXIgdXNlLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlciB7Ci0KLQlBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9IG51bGw7Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqCi0JICovCi0JcHVibGljIExpYnJhcnlNb2RpZmljYXRpb25IZWxwZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBhY3Rpb24gbWFuYWdlcgotCSAqIEByZXR1cm4gQWN0aW9uTWFuYWdlcgotCSAqLwotCXB1YmxpYyBBY3Rpb25NYW5hZ2VyIGdldEFjdGlvbk1hbmFnZXIoKSB7Ci0JCWlmIChhY3Rpb25NZ3IgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFjdGlvbk1ncjsKLQkJfQotCi0JCWFjdGlvbk1nciA9IG5ldyBBY3Rpb25NYW5hZ2VyKCkgewotCQkJcHVibGljIGJvb2xlYW4gZG9BY3Rpb24oaW50IGFjdGlvblR5cGUsIEVPYmplY3Qgb2JqZWN0LAotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJCQlpZiAoY2FuVXBkYXRlKG9iamVjdCkpIHsKLQkJCQkJcmV0dXJuIHN1cGVyLmRvQWN0aW9uKGFjdGlvblR5cGUsIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsCi0JCQkJCQkJaW5kZXgpOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCB2b2lkIHNhdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCX0KLQkJfTsKLQotCQlyZXR1cm4gYWN0aW9uTWdyOwotCX0KLQotCS8qKgotCSAqIGRpc3Bvc2UKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChhY3Rpb25NZ3IgIT0gbnVsbCkgewotCQkJYWN0aW9uTWdyLmRpc3Bvc2UoKTsKLQkJCWFjdGlvbk1nciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB1cGRhdGUgaXMgYWxsb3dlZAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuVXBkYXRlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gVG5nVXRpbC5jaGVja0VkaXQob2JqZWN0LCBudWxsKTsKLQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlcl9jYW5ub3RVcGRhdGUsIFRuZ1V0aWwuZ2V0VHlwZVRleHQob2JqZWN0KSwgb2JqZWN0Ci0JCQkuZUdldChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKSk7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dDYWxsYmFjaygpLmRpc3BsYXlXYXJuaW5nKExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLAotCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLndhcm5pbmdEbGdfdGl0bGUKLQkJCQkJLCBtc2csIFRuZ1V0aWwuZ2V0TWVzc2FnZShzdGF0dXMpKTsKLQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgc2F2ZSBpcyBuZWVkZWQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVOZWVkZWQoKSB7Ci0JCXJldHVybiAoYWN0aW9uTWdyICE9IG51bGwpICYmIGFjdGlvbk1nci5pc1NhdmVOZWVkZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBkbyBzYXZlCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKCkgewotCQlpZiAoYWN0aW9uTWdyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRyeSB7CQkJCi0JCQlDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzID0gYWN0aW9uTWdyLmdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCQlGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gZ2V0UGVyc2lzdGVyKG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuZXJyb3JEbGdfc2F2ZUVycm9yCi0JCQkJCQkJLCByZXNvdXJjZS5nZXRVUkkoKS5pc0ZpbGUoKSA/IHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpIDogcmVzb3VyY2UuZ2V0VVJJKCkudG9TdHJpbmcoKSk7IAotCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dDYWxsYmFjaygpLmRpc3BsYXlFcnJvcihMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKSwKLQkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLmVycm9yRGxnX3RpdGxlCi0JCQkJCQkJLCBtc2csIGUpOwotCQkJCX0KLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJYWN0aW9uTWdyLnNhdmVJc0RvbmUoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHRoKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQkvLyBpZiByb2xsYmFjayBmYWlsZWQsIHJlbG9hZCB0aGUgbGlicmFyeQotCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkucmVvcGVuQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlMSkgewotCQkJCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBnZXRQZXJzaXN0ZXIoQ29sbGVjdGlvbiByZXNvdXJjZXMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJaWYocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlU2V0KSB7Ci0JCQkJSUxpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gKChJTGlicmFyeVJlc291cmNlU2V0KXJlc291cmNlU2V0KS5nZXRQZXJzaXN0ZXIoKTsKLQkJCQlpZihwZXJzaXN0ZXIgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gcGVyc2lzdGVyLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL05hbWVDYWNoZS5qYXZhLnR4dCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9OYW1lQ2FjaGUuamF2YS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZjZhMjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL05hbWVDYWNoZS5qYXZhLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuQm9va21hcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxpbmtJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIAotICogVGhpcyBjbGFzcyBpcyBkZXByaWNhdGVkLiB1c2UgRmlsZU5hbWVHZW5lcmF0b3IgaW5zdGVhZAotICoKLSAqLwotcHVibGljIGNsYXNzIE5hbWVDYWNoZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTmFtZUNhY2hlIGluc3RhbmNlID0gbmV3IE5hbWVDYWNoZSgpOwotCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBhTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JcHJpdmF0ZSBTZXQ8RWxlbWVudEZpbGU+IGFTZXQgPSBuZXcgSGFzaFNldDxFbGVtZW50RmlsZT4oKTsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZ01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqIEBkZXBsaWNhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTmFtZUNhY2hlIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBOYW1lQ2FjaGUoKSB7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlhTWFwLmNsZWFyKCk7Ci0JCWFTZXQuY2xlYXIoKTsKLQkJZ01hcC5jbGVhcigpOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGZpbGUgbmFtZSB3aXRoIHRoZSBnaXZlbiBwcmVmaXggYW5kIGV4dGVuc2lvbgotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gbmFtZVByZWZpeCBTdHJpbmcgcHJlZml4IGZvciB0aGUgbmFtZQotCSAqIEBwYXJhbSBuYW1lU3VmZml4IFN0cmluZyBzdWZmaXggZm9yIHRoZSBuYW1lCi0JICogQHBhcmFtIGV4dCBTdHJpbmcgZmlsZSBleHRlbnNpb24sIGZvciBleGFtcGxlLCAiLmh0bWwiCi0JICogQHJldHVybiBTdHJpbmcKLQkgKiBAZGVwbGljYXRlZAotCSAqLwkgCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZU5hbWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmFtZVByZWZpeCwKLQkJCVN0cmluZyBuYW1lU3VmZml4LCBTdHJpbmcgZXh0KSB7Ci0JCQotCQlTdHJpbmcgZXhpc3RpbmdFbGVtZW50TmFtZSA9IG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChuYW1lUHJlZml4ICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQobmFtZVByZWZpeCk7Ci0JCX0KLQkJCi0JCWlmIChlbGVtZW50LmdldE5hbWUoKSA9PSAiIikKLQkJCXJldHVybiAiMCIgKyBleHQ7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQlpZiAoIWdNYXAuaXNFbXB0eSgpKSB7Ci0JCQlleGlzdGluZ0VsZW1lbnROYW1lID0gIChTdHJpbmcpIGdNYXAuZ2V0KGVsZW1lbnQuZ2V0R3VpZCgpKTsKLQkJfQotCQkvLyBCcm93c2luZzogQnJvd3NpbmcgQ1Agd2l0aCBzcGVjaWFsIGNoYXJzIGZhaWxlZCB3aXRoCi0JCS8vIGJsYW5rIHBhZ2VzIGFuZCBTY3JpcHQgRXJyb3IgbmVlZCB0byBtYWtlIGEgdmFsaWQgZmlsZSBuYW1lCi0JCWJ1ZmZlci5hcHBlbmQoKGV4aXN0aW5nRWxlbWVudE5hbWUgIT0gbnVsbCkgPyBleGlzdGluZ0VsZW1lbnROYW1lIDogU3RyVXRpbC5yZW1vdmVTcGVjaWFsQ2hhcmFjdGVycyhlbGVtZW50LmdldE5hbWUoKSkpOwotCQlpZiAobmFtZVN1ZmZpeCAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKG5hbWVTdWZmaXgpOwotCQl9Ci0KLQkJaWYgKGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAoZXh0LmluZGV4T2YoIi4iKSA8IDApIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlleHQgPSAiLiIgKyBleHQ7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQoZXh0KTsKLQkJfQotCQkKLQkJaWYgKGV4aXN0aW5nRWxlbWVudE5hbWUgPT0gbnVsbCkgewotCQkJCi0JCQlFbGVtZW50RmlsZSBhID0gbmV3IEVsZW1lbnRGaWxlKGVsZW1lbnQuZ2V0R3VpZCgpLCBidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQkKLQkJCWlmIChhICE9IG51bGwgJiYgYVNldC5hZGQoYSkpIHsKLQkJCQlpbnQgZXh0RG90ID0gYS5nZXRGaWxlTmFtZSgpLmxhc3RJbmRleE9mKCIuIik7Ci0JCQkJYU1hcC5wdXQoKGV4dERvdCA8IDApID8gYS5nZXRGaWxlTmFtZSgpIDogYS5nZXRGaWxlTmFtZSgpLnN1YnN0cmluZygwLCBleHREb3QpLCBlbGVtZW50LmdldEd1aWQoKSk7CQkJIAotCQkJCWdNYXAucHV0KGVsZW1lbnQuZ2V0R3VpZCgpLCAoZXh0RG90IDwgMCkgPyBhLmdldEZpbGVOYW1lKCkgOiBhLmdldEZpbGVOYW1lKCkuc3Vic3RyaW5nKDAsIGV4dERvdCkpOwotCQkJfQotCQkKLQkJCXJldHVybiBhLmdldEZpbGVOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkKLQkKLQlwcml2YXRlIFN0cmluZyBnZXRGaWxlTmFtZShTdHJpbmcgZ3VpZCkgewotCQotCQlpZiAoZ3VpZCAhPSBudWxsICYmICFnTWFwLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIChTdHJpbmcpIGdNYXAuZ2V0KGd1aWQpOwotCQl9Ci0JCXJldHVybiBudWxsOyAKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGd1aWQgZnJvbSB0aGUgZmlsZSBuYW1lLCBhc3N1bWluZyB0aGUgZmlsZSBuYW1lIGlzIGdlbmVyYXRlZCBmcm9tIGFuIGVsZW1lbnQsIAotCSAqIHJldHVybiBudWxsIGlmIG5vdCBmb3VuZC4KLQkgKiBAcGFyYW0gZmlsZU5hbWUgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEd1aWRGcm9tRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWlmIChmaWxlTmFtZSA9PSBudWxsIHx8IChmaWxlTmFtZS5pbmRleE9mKCJyZXNvdXJjZXMvIikgPiAtMSAmJiBmaWxlTmFtZS5pbmRleE9mKCIuaHRtIikgPCAwKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0JCQkKLQkJCi0JCVN0cmluZyBndWlkID0gbnVsbDsKLQkJCi0JCWludCBpZHggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZigiLyIpOwotCQlpbnQgbGFzdElkeCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIuIik7Ci0KLQkJaWYgKGlkeCA+IC0xKSB7Ci0JCQlndWlkID0gKFN0cmluZykgYU1hcC5nZXQoKGxhc3RJZHggPiAtMSAmJiBpZHggPCBsYXN0SWR4KSA/IAotCQkJCQlmaWxlTmFtZS5zdWJzdHJpbmcoaWR4KzEsIGxhc3RJZHgpIDogKGlkeCA8IGZpbGVOYW1lLmxlbmd0aCgpKSA/IAotCQkJCQkJCWZpbGVOYW1lLnN1YnN0cmluZyhpZHgrMSkgOiBudWxsKTsKLQkJfSBlbHNlIHsKLQkJCWd1aWQgPSAoU3RyaW5nKSBhTWFwLmdldCgobGFzdElkeCA+IC0xKSA/IGZpbGVOYW1lLnN1YnN0cmluZygwLCBsYXN0SWR4KSA6IGZpbGVOYW1lKTsKLQkJfQotCQlpZiAoZ3VpZCA9PSBudWxsKQlyZXR1cm4gbnVsbDsJCQotCQotCQkvLyB0dXJuIG9mZiBlcnJvciByZXBvcnRpbmcgYW5kIHNlZSBpZiBndWlkIGV4aXN0cyBpbiBsaWJyYXJ5Ci0JCWJvb2xlYW4gb2xkUmVwb3J0X0Vycm9yID0gTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLlJFUE9SVF9FUlJPUjsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLlJFUE9SVF9FUlJPUiA9IGZhbHNlOwotLyoJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsqLwotCQkvL3BhcnQgb2YgdGVtcCBzb2x1dGlvbiBkdWUgdG8gbm90IGhhdmluZyBsaWIgbWdyIGR1cmluZyBtaWdyYXRpb24KLQkJTWV0aG9kRWxlbWVudCBlID0gTGlua0luZm8uZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLlJFUE9SVF9FUlJPUiA9IG9sZFJlcG9ydF9FcnJvcjsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiBndWlkOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGZpbGUgbmFtZSB3aXRoIHRoZSBnaXZlbiBwcmVmaXggYW5kIGV4dGVuc2lvbgotCSAqIEBwYXJhbSB2aWV3IEJvb2ttYXJrCi0JICogQHBhcmFtIG5hbWVQcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgdGhlIG5hbWUKLQkgKiBAcGFyYW0gbmFtZVN1ZmZpeCBTdHJpbmcgc3VmZml4IGZvciB0aGUgbmFtZQotCSAqIEBwYXJhbSBleHQgU3RyaW5nIGZpbGUgZXh0ZW5zaW9uLCBmb3IgZXhhbXBsZSwgIi5odG1sIgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICogQGRlcGxpY2F0ZWQgdGhpcyBtZXRob2QgaXMgbm90IG5lZWRlZCAKLQkgKi8JIAotCXByaXZhdGUgU3RyaW5nIGdldEZpbGVOYW1lKEJvb2ttYXJrIHZpZXcsIFN0cmluZyBuYW1lUHJlZml4LAotCQkJU3RyaW5nIG5hbWVTdWZmaXgsIFN0cmluZyBleHQpIHsKLQkJCi0JCVN0cmluZyBleGlzdGluZ0VsZW1lbnROYW1lID0gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5hbWVQcmVmaXggIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZChuYW1lUHJlZml4KTsKLQkJfQotCQkKLQkJaWYgKHZpZXcuZ2V0UHJlc2VudGF0aW9uTmFtZSgpID09ICIiKQotCQkJcmV0dXJuICIwIiArIGV4dDsgLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYgKCFnTWFwLmlzRW1wdHkoKSkgewotCQkJZXhpc3RpbmdFbGVtZW50TmFtZSA9ICAoU3RyaW5nKSBnTWFwLmdldCh2aWV3LmdldFVuaXF1ZUlkKCkpOwotCQl9Ci0JCS8vIEJyb3dzaW5nOiBCcm93c2luZyBDUCB3aXRoIHNwZWNpYWwgY2hhcnMgZmFpbGVkIHdpdGgKLQkJLy8gYmxhbmsgcGFnZXMgYW5kIFNjcmlwdCBFcnJvciBuZWVkIHRvIG1ha2UgYSB2YWxpZCBmaWxlIG5hbWUKLQkJYnVmZmVyLmFwcGVuZCgoZXhpc3RpbmdFbGVtZW50TmFtZSAhPSBudWxsKSA/IGV4aXN0aW5nRWxlbWVudE5hbWUgOiBTdHJVdGlsLnJlbW92ZVNwZWNpYWxDaGFyYWN0ZXJzKHZpZXcuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKSk7Ci0JCWlmIChuYW1lU3VmZml4ICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQobmFtZVN1ZmZpeCk7Ci0JCX0KLQotCQlpZiAoZXh0ICE9IG51bGwpIHsKLQkJCWlmIChleHQuaW5kZXhPZigiLiIpIDwgMCkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCWV4dCA9ICIuIiArIGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYnVmZmVyLmFwcGVuZChleHQpOwotCQl9Ci0KLQkJRWxlbWVudEZpbGUgYSA9IG5ldyBFbGVtZW50RmlsZSh2aWV3LmdldFVuaXF1ZUlkKCksIGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCi0JCWlmIChhICE9IG51bGwgJiYgYVNldC5hZGQoYSkpIHsKLQkJCWludCBleHREb3QgPSBhLmdldEZpbGVOYW1lKCkubGFzdEluZGV4T2YoIi4iKTsKLQkJCWFNYXAucHV0KChleHREb3QgPCAwKSA/IGEuZ2V0RmlsZU5hbWUoKSA6IGEuZ2V0RmlsZU5hbWUoKS5zdWJzdHJpbmcoMCwgZXh0RG90KSwgdmlldy5nZXRVbmlxdWVJZCgpKTsJCQkgCi0JCQlnTWFwLnB1dCh2aWV3LmdldFVuaXF1ZUlkKCksIChleHREb3QgPCAwKSA/IGEuZ2V0RmlsZU5hbWUoKSA6IGEuZ2V0RmlsZU5hbWUoKS5zdWJzdHJpbmcoMCwgZXh0RG90KSk7Ci0JCX0KLQotCQlyZXR1cm4gYS5nZXRGaWxlTmFtZSgpOyAKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvU2FmZVVwZGF0ZUNvbnRyb2xsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9TYWZlVXBkYXRlQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yjk1MDQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9TYWZlVXBkYXRlQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogYSB1dGlsaXR5IGNsYXNzIHRvIGFsbG93IFVJIHVwZGF0ZSB3aXRoIHRoZSB2YWxpZCBVSSB0aHJlYWQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2FmZVVwZGF0ZUNvbnRyb2xsZXIgewotCi0JLyoqCi0JICogc3luYyBleGVjdXRlIHRoZSBydW5uYWJsZSB3aXRoIHRoZSB2YWxpZCBVSSB0aHJlYWQuCi0JICogQHBhcmFtIHJ1bm5hYmxlIFJ1bm5hYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHN5bmNFeGVjKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCXRyeSB7Ci0JCQkvLyBzaW5jZSB0aGlzIHdpbGwgY2F1c2UgVUkgdXBkYXRlLCB3aGljaCBtdXN0IGJlIGV4ZWN1dGVkIGluIHRoZSBVSQotCQkJLy8gdGhyZWFkCi0JCQkvLyBvdGhlcndpc2UsIHdpbGwgY2F1c2UgSW52YWxpZCBUaHJlYWQgQWNjZXNzIGV4Y2VwdGlvbgotCQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCQlpZiAoZGlzcGxheSA9PSBudWxsKSB7Ci0JCQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJfQotCQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkgewotCQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJfSBlbHNlIHsKLQkJCQlkaXNwbGF5LnN5bmNFeGVjKHJ1bm5hYmxlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBhc3luYyBleGVjdXRlIHRoZSBydW5uYWJsZSB3aXRoIHRoZSB2YWxpZCBVSSB0aHJlYWQuCi0JICogQHBhcmFtIHJ1bm5hYmxlIFJ1bm5hYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFzeW5jRXhlYyhSdW5uYWJsZSBydW5uYWJsZSkgewotCQl0cnkgewotCQkJLy8gc2luY2UgdGhpcyB3aWxsIGNhdXNlIFVJIHVwZGF0ZSwgd2hpY2ggbXVzdCBiZSBleGVjdXRlZCBpbiB0aGUgVUkKLQkJCS8vIHRocmVhZAotCQkJLy8gb3RoZXJ3aXNlLCB3aWxsIGNhdXNlIEludmFsaWQgVGhyZWFkIEFjY2VzcyBleGNlcHRpb24KLQkJCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkgewotCQkJCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCX0KLQkJCWlmIChkaXNwbGF5ID09IG51bGwpIHsKLQkJCQlydW5uYWJsZS5ydW4oKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGlzcGxheS5hc3luY0V4ZWMocnVubmFibGUpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OTRiNjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIHRoZSBsaWJyYXJ5IHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvQ29udGVudFJlc291cmNlU2Nhbm5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvQ29udGVudFJlc291cmNlU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTIyOTExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0NvbnRlbnRSZXNvdXJjZVNjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JQ29udGVudFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIHV0aWxpdHkgY2xhc3MgdG8gc2NhbiBjb250ZW50IGFuZCBjb3B5IHJlc291cmNlcyB0byB0aGUgdGFyZ2V0IGxvY2F0aW9uIGZvciBicm93c2luZyBhbmQgcHVibGlzaGluZwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRSZXNvdXJjZVNjYW5uZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfaW1hZ2VfcmVmID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSIoPChpbWd8aWZyYW1lKS4qP3NyY1xccyo9XFxzKlwiKSguKj8pKFwiKSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBGaWxlIHNvdXJjZVJvb3RQYXRoOwotCi0JcHJpdmF0ZSBGaWxlIHRhcmdldFJvb3RQYXRoOwotCi0JcHJpdmF0ZSBTdHJpbmcgcm9vdENvbnRlbnRQYXRoOwotCQotCXByaXZhdGUgSUNvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0JcHJpdmF0ZSBMaXN0IHByb2Nlc3NlZEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogY29uc3RydWN0IHRoZSBvYmplY3Qgd2l0aCB0aGUgcm9vdCBwYXRoIG9mIHRoZSBzb3VyY2UgY29udGVudAotCSAqIEBwYXJhbSBzb3VyY2VSb290UGF0aCBGaWxlCi0JICovCi0JcHVibGljIENvbnRlbnRSZXNvdXJjZVNjYW5uZXIoRmlsZSBzb3VyY2VSb290UGF0aCwgRmlsZSB0YXJnZXRSb290UGF0aCwgU3RyaW5nIHJvb3RDb250ZW50UGF0aCkgewotCQl0aGlzKHNvdXJjZVJvb3RQYXRoLCB0YXJnZXRSb290UGF0aCwgcm9vdENvbnRlbnRQYXRoLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgdGhlIG9iamVjdCBpbnN0YW5jZSB3aXRoIHRoZSByb290IHBhdGggb2YgdGhlIHNvdXJjZSBjb250ZW50IGFuZCBhIGNvbnRlbnQgdmFsaWRhdG9yCi0JICogCi0JICogQHBhcmFtIHNvdXJjZVJvb3RQYXRoIEZpbGUKLQkgKiBAcGFyYW0gdmFsaWRhdG9yIElDb250ZW50VmFsaWRhdG9yCi0JICovCi0JcHVibGljIENvbnRlbnRSZXNvdXJjZVNjYW5uZXIoRmlsZSBzb3VyY2VSb290UGF0aCwgRmlsZSB0YXJnZXRSb290UGF0aCwgU3RyaW5nIHJvb3RDb250ZW50UGF0aCwgCi0JCQlJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJdGhpcy5zb3VyY2VSb290UGF0aCA9IHNvdXJjZVJvb3RQYXRoOwotCQl0aGlzLnRhcmdldFJvb3RQYXRoID0gdGFyZ2V0Um9vdFBhdGg7Ci0JCXRoaXMucm9vdENvbnRlbnRQYXRoID0gcm9vdENvbnRlbnRQYXRoOwotCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgY29udGVudCB2YWxpZGF0b3IKLQkgKiBAcGFyYW0gdmFsaWRhdG9yIElDb250ZW50VmFsaWRhdG9yCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKElDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHNvdXJjZSByb290IHBhdGgKLQkgKiBAcmV0dXJuIEZpbGUKLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRTb3VyY2VSb290UGF0aCgpIHsKLQkJcmV0dXJuIHRoaXMuc291cmNlUm9vdFBhdGg7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgdGFyZ2V0IHJvb3QgcGF0aAotCSAqIEByZXR1cm4gRmlsZQotCSAqLwotCXB1YmxpYyBGaWxlIGdldFRhcmdldFJvb3RQYXRoKCkgewotCQlyZXR1cm4gdGhpcy50YXJnZXRSb290UGF0aDsKLQl9Ci0JCi0JLyoqCi0JICogc2V0IHRoZSB0YXJnZXQgcm9vdCBwYXRoCi0JICogQHBhcmFtIHRhcmdldFJvb3RQYXRoIEZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRSb290UGF0aChGaWxlIHRhcmdldFJvb3RQYXRoKSB7Ci0JCXRoaXMudGFyZ2V0Um9vdFBhdGggPSB0YXJnZXRSb290UGF0aDsKLQl9Ci0KLQkvKioKLQkgKiByZXNvbHZlIHRoZSBpbWFnZXMgaW4gdGhlIHRleHQuIGNvcHkgdGhlIGltYWdlIHRvIGRlc3RpbmF0aW9uIGlmIG5lZWRlZAotCSAqIFRoaXMgaXMgdXNlZCBmb3IgY29weWluZyByZXNvdXJjZXMgZnJvbSBhIGxpYnJhcnkgdG8gYW5vdGhlciBkZXN0aW5hdGlvbgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50Ci0JICogQHBhcmFtIGNvbnRlbnRQYXRoCi0JICogICAgICAgICAgICB0aGUgY29udGVudCBwYXRoIG9mIHRoZSBzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvbHZlUmVzb3VyY2VzKFN0cmluZyBjb250ZW50LCBTdHJpbmcgY29udGVudFBhdGgpIHsKLQkJcmVzb2x2ZVJlc291cmNlcyhudWxsLCBjb250ZW50LCBjb250ZW50UGF0aCk7Ci0JfQotCi0JLyoqCi0JICogcmVzb2x2ZSB0aGUgaW1hZ2VzIGluIHRoZSB0ZXh0LiBjb3B5IHRoZSBpbWFnZSB0byBkZXN0aW5hdGlvbiBpZiBuZWVkZWQKLQkgKiBUaGlzIGlzIHVzZWQgZm9yIGNvcHlpbmcgcmVzb3VyY2VzIGZyb20gYSBsaWJyYXJ5IHRvIGFub3RoZXIgZGVzdGluYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBjb250ZW50IFN0cmluZwotCSAqIEBwYXJhbSBjb250ZW50UGF0aCBTdHJpbmcKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50IHBhdGggb2YgdGhlIHNvdXJjZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc29sdmVSZXNvdXJjZXMoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIGNvbnRlbnQsCi0JCQlTdHJpbmcgY29udGVudFBhdGgpIHsKLQkJcHJvY2Vzc2VkSXRlbXMuY2xlYXIoKTsKLQkJUmVzb3VyY2VIZWxwZXIucmVzb2x2ZVJlc291cmNlcyhvd25lciwgbnVsbCwgY29udGVudCwgY29udGVudFBhdGgsCi0JCQkJdGhpcy5zb3VyY2VSb290UGF0aCwgdGhpcy50YXJnZXRSb290UGF0aCwgdGhpcy5yb290Q29udGVudFBhdGgsIHByb2Nlc3NlZEl0ZW1zLAotCQkJCXZhbGlkYXRvcik7Ci0JfQotCi0JLyoqCi0JICogcmVzb2x2ZSB0aGUgaW1hZ2VzIGluIHRoZSB0ZXh0LiBjb3B5IHRoZSBpbWFnZSB0byBkZXN0aW5hdGlvbiBpZiBuZWVkZWQKLQkgKiBUaGlzIGlzIHVzZWQgZm9yIG1vdmluZyByZXNvdXJjZXMgd2l0aGluIGEgbGlicmFyeSBpZSwgd2hlbgotCSAqIHNvdXJjZVJvb3RQYXRoLmVxdWFscyh0YXJnZXRSb290UGF0aCkKLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHBhcmFtIGNvbnRlbnRQYXRoCi0JICogICAgICAgICAgICB0aGUgY29udGVudCBwYXRoIG9mIHRoZSBzb3VyY2UKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZVJlc291cmNlc1BsdWdpbihTdHJpbmcgY29udGVudCwgU3RyaW5nIGNvbnRlbnRQYXRoLAotCQkJU3RyaW5nIG9sZENvbnRlbnRQYXRoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJdHJ5IHsKLQkJCS8vIHByb2Nlc3MgaW1hZ2VzCi0JCQlNYXRjaGVyIG0gPSBSZXNvdXJjZUhlbHBlci5wX2ltYWdlX3JlZi5tYXRjaGVyKGNvbnRlbnQpOwotCQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQkJU3RyaW5nIHVybCA9IG0uZ3JvdXAoMyk7Ci0JCQkJdXJsID0gcHJvY2Vzc1Jlc291cmNlVXJsUGx1Z2luKHVybCwgY29udGVudFBhdGgsIG9sZENvbnRlbnRQYXRoKTsKLQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCBtLmdyb3VwKDEpICsgdXJsICsgbS5ncm91cCg0KSk7Ci0JCQl9Ci0JCQltLmFwcGVuZFRhaWwoc2IpOwotCi0JCQljb250ZW50ID0gc2IudG9TdHJpbmcoKTsKLQkJCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCQkvLyBwcm9jZXNzIGF0dGFjaG1lbnRzCi0JCQltID0gUmVzb3VyY2VIZWxwZXIucF9saW5rX3JlZl9nZW4ubWF0Y2hlcihjb250ZW50KTsKLQkJCXdoaWxlIChtLmZpbmQoKSkgewotCQkJCVN0cmluZ0J1ZmZlciBzYkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJLy8gU3RyaW5nIHRhZyA9IG0uZ3JvdXAoMSk7Ci0JCQkJU3RyaW5nIHVybHRleHQgPSAiICIgKyBtLmdyb3VwKDIpICsgIiAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlpZiAoUmVzb3VyY2VIZWxwZXIuZ2V0R3VpZEZyb21VcmwodXJsdGV4dCkgPT0gbnVsbCkgewotCQkJCQlNYXRjaGVyIG0yID0gUmVzb3VyY2VIZWxwZXIucF9saW5rX2hyZWZfcGlja2VyCi0JCQkJCQkJLm1hdGNoZXIodXJsdGV4dCk7Ci0JCQkJCWlmIChtMi5maW5kKCkpIHsKLQkJCQkJCVN0cmluZyB1cmwgPSBtMi5ncm91cCgxKS50cmltKCkucmVwbGFjZUFsbCgiXCIiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJdXJsID0gcHJvY2Vzc1Jlc291cmNlVXJsUGx1Z2luKHVybCwgY29udGVudFBhdGgsCi0JCQkJCQkJCW9sZENvbnRlbnRQYXRoKTsKLQkJCQkJCW0yLmFwcGVuZFJlcGxhY2VtZW50KHNiTGluaywgdXJsdGV4dC5zdWJzdHJpbmcobTIKLQkJCQkJCQkJLnN0YXJ0KCksIG0yLnN0YXJ0KDEpKQotCQkJCQkJCQkrIHVybCArIHVybHRleHQuc3Vic3RyaW5nKG0yLmVuZCgxKSwgbTIuZW5kKCkpKTsKLQkJCQkJCW0yLmFwcGVuZFRhaWwoc2JMaW5rKTsKLQkJCQkJCW0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIGNvbnRlbnQuc3Vic3RyaW5nKG0uc3RhcnQoKSwgbQotCQkJCQkJCQkuc3RhcnQoMikpCi0JCQkJCQkJCSsgc2JMaW5rLnRvU3RyaW5nKCkKLQkJCQkJCQkJKyBjb250ZW50LnN1YnN0cmluZyhtLmVuZCgyKSwgbS5lbmQoKSkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCQltLmFwcGVuZFRhaWwoc2IpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3NlcyBhIHJlc291cmNlIHVybCBmb3IgbW92aW5nIHdpdGhpbiBhIGxpYnJhcnkKLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogQHBhcmFtIGNvbnRlbnRQYXRoCi0JICogICAgICAgICAgICBuZXcgcGx1Z2luIHBhdGgKLQkgKiBAcGFyYW0gb2xkQ29udGVudFBhdGgKLQkgKiAgICAgICAgICAgIG9sZCBwbHVnaW4gcGF0aAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgcHJvY2Vzc1Jlc291cmNlVXJsUGx1Z2luKFN0cmluZyB1cmwsIFN0cmluZyBjb250ZW50UGF0aCwKLQkJCVN0cmluZyBvbGRDb250ZW50UGF0aCkgewotCQlTdHJpbmcgaW1hZ2VGaWxlID0gUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZVBhdGhGcm9tVXJsKHVybCwKLQkJCQlvbGRDb250ZW50UGF0aCk7Ci0JCWlmIChpbWFnZUZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIHVybDsKLQkJfQotCQlTdHJpbmcgbmV3VXJsID0gbnVsbDsKLQkJRmlsZSBzb3VyY2U7Ci0JCUZpbGUgZGVzdDsKLQkJLy8gdGFyZ2V0Um9vdFBhdGggaXMgc2V0IHRvIHRoZSB0YXJnZXQgcGx1Z2luIGRpcmVjdG9yeQotCQlzb3VyY2UgPSBuZXcgRmlsZSh0aGlzLnNvdXJjZVJvb3RQYXRoLmdldFBhcmVudEZpbGUoKSwgaW1hZ2VGaWxlKTsKLQkJaWYgKGltYWdlRmlsZS5pbmRleE9mKEZpbGUuc2VwYXJhdG9yKSAhPSAtMSkgewotCQkJU3RyaW5nIG9sZFBsdWdpbiA9IGltYWdlRmlsZS5zdWJzdHJpbmcoMCwgaW1hZ2VGaWxlCi0JCQkJCS5pbmRleE9mKEZpbGUuc2VwYXJhdG9yKSk7Ci0JCQlTdHJpbmcgbmV3UGx1Z2luID0gdGhpcy50YXJnZXRSb290UGF0aC5nZXROYW1lKCk7Ci0JCQluZXdVcmwgPSB1cmwucmVwbGFjZUZpcnN0KG9sZFBsdWdpbiwgbmV3UGx1Z2luKTsKLQkJCWltYWdlRmlsZSA9IGltYWdlRmlsZS5zdWJzdHJpbmcoaW1hZ2VGaWxlLmluZGV4T2YoRmlsZS5zZXBhcmF0b3IpKTsKLQkJfQotCQlkZXN0ID0gbmV3IEZpbGUodGhpcy50YXJnZXRSb290UGF0aCwgaW1hZ2VGaWxlKTsKLQotCQlGaWxlVXRpbC5jb3B5RmlsZShzb3VyY2UsIGRlc3QpOwotCi0JCXJldHVybiBuZXdVcmw7Ci0JfQotCi0JCi0JLyoqCi0JICogY29weSBhbGwgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhlIHRoZSBlbGVtZW50IGFuZCBhbGwgaXRzIGNvbnRhaW5lZCBlbGVtZW50cywgcmVjdXJzaXZlbHkKLQkgKiBAcGFyYW0gZWxlbWVudCBFT2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgY29weVJlc291cmNlcyhFT2JqZWN0IGVsZW1lbnQpIHsKLQkJCi0JCWlmICggZWxlbWVudCA9PSBudWxsICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQgKSB7Ci0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZGUgPSAoRGVzY3JpYmFibGVFbGVtZW50KWVsZW1lbnQ7Ci0JCQlTdHJpbmcgZWxlbWVudFBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChkZSk7Ci0JCQkKLQkJCS8vMS4gaWNvbnMKLQkJCWphdmEubmV0LlVSSSBpY29uID0gZGUuZ2V0U2hhcGVpY29uKCk7Ci0JCQlpZiAoIGljb24gIT0gbnVsbCApIHsKLQkJCQlTdHJpbmcgcGF0aCA9IGljb24uZ2V0UGF0aCgpOwotCQkJCUZpbGVVdGlsLmNvcHlGaWxlKAotCQkJCQkJbmV3IEZpbGUoZ2V0U291cmNlUm9vdFBhdGgoKSwgcGF0aCksIAotCQkJCQkJbmV3IEZpbGUoZ2V0VGFyZ2V0Um9vdFBhdGgoKSwgcGF0aCkpOwotCQkJfQotCQkJCi0JCQlpY29uID0gZGUuZ2V0Tm9kZWljb24oKTsKLQkJCWlmICggaWNvbiAhPSBudWxsICkgewotCQkJCVN0cmluZyBwYXRoID0gaWNvbi5nZXRQYXRoKCk7Ci0JCQkJRmlsZVV0aWwuY29weUZpbGUoCi0JCQkJCQluZXcgRmlsZShnZXRTb3VyY2VSb290UGF0aCgpLCBwYXRoKSwgCi0JCQkJCQluZXcgRmlsZShnZXRUYXJnZXRSb290UGF0aCgpLCBwYXRoKSk7Ci0JCQl9Ci0JCQkKLQkJCS8vIDIuIGF0dGFjaG1lbnRzCi0JCQotCQkJCi0JCQkvLyAzLiBjb250ZW50cwotCQkJQ29udGVudERlc2NyaXB0aW9uIGRlc2MgPSBkZS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCWlmICggZGVzYy5lQ29udGFpbmVyKCkgIT0gbnVsbCApIHsKLQkJCQlMaXN0IGZlYXR1cmVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKGRlc2MpOwotLy8JCQkJTGlzdCBwcm9wZXJ0aWVzID0gZGVzYy5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJCQkJCQkJCi0JCQkJLy8gZ2V0IGFsbCBzdHJpbmcgdHlwZSBhdHRyaWJ1dGVzCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzCi0JCQkJCQkJLmdldChpKTsKLQkJCQkJaWYgKCAhKGZlYXR1cmUgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSApIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlPYmplY3QgdmFsdWUgPSBkZXNjLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCWlmICggdmFsdWUgPT0gbnVsbCApIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQkKLQkJCQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCkgKSB7Ci0JCQkJCQlMaXN0IHNlY3Rpb25zID0gKExpc3QpdmFsdWU7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc2VjdGlvbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQkJCQlTdHJpbmcgdGV4dCA9ICgoU2VjdGlvbilpdC5uZXh0KCkpLmdldFNlY3Rpb25EZXNjcmlwdGlvbigpOwotCQkJCQkJCXJlc29sdmVSZXNvdXJjZXMoZGUsIHRleHQsIGVsZW1lbnRQYXRoKTsKLQkJCQkJCX0KLQkJCQkJfSAgZWxzZSBpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCkgKSB7Ci0JCQkJCQlTdHJpbmcgdXJscyA9IHZhbHVlLnRvU3RyaW5nKCkudHJpbSgpOwotCQkJCQkJaWYgKHVybHMubGVuZ3RoKCkgIT0gMCApIHsKLQkJCQkJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHVybHMsICJ8Iik7IC8vIHRoaXMgaXMgaGFyZGNvZGVkIHNvbWVob3cgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkgKSB7Ci0JCQkJCQkJCVN0cmluZyB1cmwgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQkJCQkJRmlsZVV0aWwuY29weUZpbGUoCi0JCQkJCQkJCQkJbmV3IEZpbGUoZ2V0U291cmNlUm9vdFBhdGgoKSwgZWxlbWVudFBhdGggKyB1cmwpLCAKLQkJCQkJCQkJCQluZXcgRmlsZShnZXRUYXJnZXRSb290UGF0aCgpLCBlbGVtZW50UGF0aCArIHVybCkpOwotCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyApIHsKLQkJCQkJCXJlc29sdmVSZXNvdXJjZXMoZGUsIHZhbHVlLnRvU3RyaW5nKCksIGVsZW1lbnRQYXRoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0NvbnZlcnRBY3Rpdml0eVR5cGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0NvbnZlcnRBY3Rpdml0eVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEwMjRmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9Db252ZXJ0QWN0aXZpdHlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBjbGFzcyB0byBjb252ZXJ0IGFjdGl2aXR5IHR5cGVzCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb252ZXJ0QWN0aXZpdHlUeXBlIHsKLQotLy8JcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHkgb2xkQWN0aXZpdHkgPSBudWxsOwotLy8JcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHkgbmV3QWN0aXZpdHkgPSBudWxsOwotLy8JCi0vLwkvLyBvcmlnaW5hbCBhY3Rpdml0eSdzIGNvbnRhaW5lcgotLy8JcHJpdmF0ZSBzdGF0aWMgUHJvY2Vzc1BhY2thZ2Ugb2xkQWN0aXZpdHlDb250YWluZXIgPSBudWxsOwotLy8JCi0vLwkvLyB0aGUgb3JpZ2luYWwgYWN0aXZpdHkncyBicmVha2Rvd24gbGlzdAotLy8JcHJpdmF0ZSBzdGF0aWMgTGlzdCBvbGRBY3Rpdml0eUJyZWFrZG93biA9IG51bGw7Ci0vLwkKLS8vCS8vIGluZGV4IG9mIHRoZSBvcmlnaW5hbCBhY3Rpdml0eSBpbiBpdCdzIHN1cGVyQWN0aXZpdHkncyBicmVha2Rvd24gbGlzdAotLy8JcHJpdmF0ZSBzdGF0aWMgaW50IG9sZEFjdGl2aXR5QnJlYWtkb3duSW5kZXggPSAtMTsKLS8vCQotLy8JLy8gb3JpZ2luYWwgQWN0aXZpdHkncyBwYXJlbnQgYWN0aXZpdHkKLS8vCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5IHN1cGVyQWN0ID0gbnVsbDsKLS8vCQotLy8JLy8gcGFyZW50IGFjdGl2aXR5J3MgYnJlYWtkb3duIGxpc3QKLS8vCXByaXZhdGUgc3RhdGljIEVMaXN0IHN1cGVyQWN0YnJlYWtkb3duTGlzdCA9IG51bGw7Ci0vLwkKLS8vCS8vIG9yaWdpbmFsIEFjdGl2aXR5J3MgdmFyaWFiaWxpdHlUeXBlCi0vLwlwcml2YXRlIHN0YXRpYyBWYXJpYWJpbGl0eVR5cGUgb2xkQWN0VmFyVHlwZSA9IG51bGw7Ci0vLwkKLS8vCS8vIG9yaWdpbmFsIEFjdGl2aXR5J3MgdmFyaWFiaWxpdHlFbGVtZW50Ci0vLwlwcml2YXRlIHN0YXRpYyBWYXJpYWJpbGl0eUVsZW1lbnQgb2xkQWN0VmFyRWxlbWVudCA9IG51bGw7Ci0vLwkKLS8vCS8vIG9yaWdpbmFsIEFjdGl2aXR5J3MgaW1tZWRpdGF0ZVZhcmlldGllcwotLy8JcHJpdmF0ZSBzdGF0aWMgTGlzdCBvbGRBY3RJbW1lZGlhdGVWYXJpZXRpZXNMaXN0ID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgaW50W10gY29tcGF0aWJsZUFjdGl2aXRpZXMgPSB7IFVtYVBhY2thZ2UuQUNUSVZJVFksCi0JCQlVbWFQYWNrYWdlLklURVJBVElPTiwKLQkJCVVtYVBhY2thZ2UuUEhBU0UsCi0JCQlVbWFQYWNrYWdlLkNBUEFCSUxJVFlfUEFUVEVSTiwKLQkJCVVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTUywKLQl9OwotCi0JcHVibGljIHN0YXRpYyBMaXN0IGNvbXBhdGlibGVBY3Rpdml0aWVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlzdGF0aWMgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBhdGlibGVBY3Rpdml0aWVzLmxlbmd0aDsgaSsrKQotCQkJY29tcGF0aWJsZUFjdGl2aXRpZXNMaXN0LmFkZChuZXcgSW50ZWdlcihjb21wYXRpYmxlQWN0aXZpdGllc1tpXSkpOwotCX0KLQotCS8vIFRoaXMgbWV0aG9kIGlzIGJ1Z2d5IGFuZCBpcyByZXBsYWNlZCB3aXRoIFR5cGVDb252ZXJ0ZXIuY29udmVydEFjdGl2aXR5KCkKLQkvLwotLy8JcHVibGljIHN0YXRpYyBBY3Rpdml0eSBjb252ZXJ0QWN0aXZpdHkoQWN0aXZpdHkgb2xkQWN0aXZpdHksIGludCBuZXdUeXBlLAotLy8JCQlEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCBjb21tYW5kKSB7Ci0vLwotLy8JCQotLy8JCUNvbnZlcnRBY3Rpdml0eVR5cGUub2xkQWN0aXZpdHkgPSBvbGRBY3Rpdml0eTsKLS8vCQkKLS8vCQkvLyBhY3Rpdml0eSBpcyBhbHJlYWR5IHRoaXMgdHlwZQotLy8JCWlmIChuZXdUeXBlID09IG9sZEFjdGl2aXR5LmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0vLwkJCXJldHVybiBudWxsOwotLy8JCX0KLS8vCQkKLS8vCQkvLyBuZXdUeXBlIGlzIG5vdCB2YWxpZAotLy8JCWlmICghY29tcGF0aWJsZUFjdGl2aXRpZXNMaXN0LmNvbnRhaW5zKG5ldyBJbnRlZ2VyKG5ld1R5cGUpKSkgewotLy8JCQlyZXR1cm4gbnVsbDsKLS8vCQl9Ci0vLwkJCi0vLwkJQWN0aXZpdHkgbmV3QWN0aXZpdHkgPSBkb0NvbnZlcnQobmV3VHlwZSwgY29tbWFuZCk7Ci0vLwotLy8JCXJldHVybiBuZXdBY3Rpdml0eTsKLS8vCX0KLS8vCi0vLwlwcml2YXRlIHN0YXRpYyBBY3Rpdml0eSBkb0NvbnZlcnQoaW50IG5ld1R5cGUsIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLS8vCQkKLS8vCQl0cnkgewotLy8JCQlGaWxlIG9sZEFjdGl2aXR5UGF0aEZpbGUgPSBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0vLwkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpLCBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyCi0vLwkJCQkJLmdldEVsZW1lbnRQYXRoKG9sZEFjdGl2aXR5KSk7Ci0vLwotLy8JCQkvLyBjcmVhdGUgbmV3IGFjdGl2aXR5Ci0vLwkJCW5ld0FjdGl2aXR5ID0gY3JlYXRlTmV3QWN0aXZpdHkobmV3VHlwZSk7Ci0vLwotLy8JCQkvLyBUT0RPOiBzdG9yZSBvbGRBY3Rpdml0eSdzIGZlYXR1cmVzIGhlcmUsIGFuZCBkb24ndCBzZXQgdGhlbSB1bnRpbAotLy8JCQkvLyBhZnRlciBvbGRhY3Rpdml0eSBpcyBkZWxldGVkCi0vLwkJCQotLy8JCQkvLyBzdG9yZSBvbGRBY3Rpdml0eSdzIGJyZWFrZG93biBsaXN0Ci0vLwkJCW9sZEFjdGl2aXR5QnJlYWtkb3duID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvbGRBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlvbGRBY3Rpdml0eUJyZWFrZG93bi5hZGQoaXRlci5uZXh0KCkpOwotLy8JCQl9Ci0vLwkJCW9sZEFjdGl2aXR5QnJlYWtkb3duSW5kZXggPSBnZXRJbmRleEluQnJlYWtkb3duKG9sZEFjdGl2aXR5KTsKLS8vCQkJCi0vLwkJCS8vIGNvcHkgYWxsIGRhdGEgZnJvbSBvbGRBY3Rpdml0eSB0byBuZXdBY3Rpdml0eQotLy8JCQlJdGVyYXRvciBpdGVyID0gb2xkQWN0aXZpdHkuZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpCi0vLwkJCQkJLml0ZXJhdG9yKCk7Ci0vLwkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotLy8JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyLm5leHQoKTsKLS8vCQkJCU9iamVjdCBvID0gb2xkQWN0aXZpdHkuZUdldChmZWF0dXJlKTsKLS8vCQkJCWlmIChmZWF0dXJlLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OCi0vLwkJCQkJCSYmIGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1VJRAotLy8JCQkJCQkmJiBmZWF0dXJlLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUwotLy8JCQkJCQkmJiBmZWF0dXJlLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuQUNUSVZJVFlfX1NVUEVSX0FDVElWSVRJRVMgCi0vLwkJCQkJCSYmIGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOUwotLy8JCQkJCQkmJiBmZWF0dXJlLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuUFJPQ0VTU19fVkFMSURfQ09OVEVYVAotLy8JCQkJCQkmJiBmZWF0dXJlLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUCi0vLwkJCQkJCSYmIGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFMKLS8vCQkJCQkJJiYgZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTFMKLS8vCQkJCQkJKSB7Ci0vLwkJCQkJbmV3QWN0aXZpdHkuZVNldChmZWF0dXJlLCBvKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8KLS8vCQkJLy8gc3RvcmUgR3VpZCBoZXJlCi0vLwkJCVN0cmluZyBvbGRBY3Rpdml0eUd1aWQgPSBvbGRBY3Rpdml0eS5nZXRHdWlkKCk7Ci0vLwotLy8JCQkvLyBzdG9yZSBvbGQgYWN0aXZpdHkncyBlQ29udGFpbmVyCi0vLwkJCW9sZEFjdGl2aXR5Q29udGFpbmVyID0gKFByb2Nlc3NQYWNrYWdlKSBvbGRBY3Rpdml0eQotLy8JCQkJCS5lQ29udGFpbmVyKCk7Ci0vLwotLy8JCQkvLyBzZXQgY29udGFpbmVyCi0vLwkJCW9sZEFjdGl2aXR5Q29udGFpbmVyLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZShvbGRBY3Rpdml0eSk7Ci0vLwkJCW9sZEFjdGl2aXR5Q29udGFpbmVyLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChuZXdBY3Rpdml0eSk7Ci0vLwotLy8JCQkvLyBjcmVhdGUgcHJlc2VudGF0aW9uCi0vLwkJCUNvbnRlbnREZXNjcmlwdGlvbiBuZXdDb250ZW50RGVzYyA9IENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLS8vCQkJCQkuY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKG5ld0FjdGl2aXR5KTsKLS8vCQkJbmV3QWN0aXZpdHkuc2V0UHJlc2VudGF0aW9uKG5ld0NvbnRlbnREZXNjKTsKLS8vCi0vLwkJCUZpbGUgbmV3QWN0aXZpdHlQYXRoRmlsZSA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLS8vCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCksIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIKLS8vCQkJCQkuZ2V0RWxlbWVudFBhdGgobmV3QWN0aXZpdHkpKTsKLS8vCQkJQ29udGVudFJlc291cmNlU2Nhbm5lciBzY2FubmVyID0gbmV3IENvbnRlbnRSZXNvdXJjZVNjYW5uZXIoCi0vLwkJCQkJb2xkQWN0aXZpdHlQYXRoRmlsZSk7Ci0vLwkJCXNjYW5uZXIuc2V0VGFyZ2V0Um9vdFBhdGgobmV3QWN0aXZpdHlQYXRoRmlsZSk7Ci0vLwotLy8JCQkvLyBjb3B5IGFsbCBwcmVzZW50YXRpb24gZGF0YSBmcm9tIG9sZEFjdGl2aXR5IHRvIG5ld0FjdGl2aXR5Ci0vLwkJCUNvbnRlbnREZXNjcmlwdGlvbiBvbGRDb250ZW50RGVzYyA9IG9sZEFjdGl2aXR5LmdldFByZXNlbnRhdGlvbigpOwotLy8JCQlpdGVyID0gb2xkQ29udGVudERlc2MuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotLy8JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLS8vCQkJCUVBdHRyaWJ1dGUgYXR0cmliID0gKEVBdHRyaWJ1dGUpIGl0ZXIubmV4dCgpOwotLy8JCQkJaWYgKGF0dHJpYi5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lECi0vLwkJCQkJCSYmIGF0dHJpYi5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFCi0vLwkJCQkJCSYmIGF0dHJpYi5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTCi0vLwkJCQkJCSYmIGF0dHJpYi5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFCi0vLwkJCQkJCSYmIGF0dHJpYi5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTCi0vLwkJCQkJCSYmIGF0dHJpYi5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRQotLy8JCQkJCQkmJiBhdHRyaWIuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMCi0vLwkJCQkJCSYmIGF0dHJpYi5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFCi0vLwkJCQkJCSYmIGF0dHJpYi5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1QKLS8vCQkJCQkJKSB7Ci0vLwkJCQkJT2JqZWN0IG8gPSBvbGRDb250ZW50RGVzYy5lR2V0KGF0dHJpYik7Ci0vLwkJCQkJaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcgJiYgKChTdHJpbmcpIG8pLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLS8vCQkJCQkJLy8gcHJvY2VzcyBsaW5rcwotLy8JCQkJCQlzY2FubmVyLnJlc29sdmVSZXNvdXJjZXMobmV3QWN0aXZpdHksIChTdHJpbmcpIG8sICIiKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJCQkvLyBzY2FubmVyLnJlc29sdmVSZXNvdXJjZXMobmV3QWN0aXZpdHksIChTdHJpbmcpIG8sCi0vLwkJCQkJCS8vIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuZ2V0RWxlbWVudFBhdGgobmV3QWN0aXZpdHkpKTsKLS8vCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotLy8JCQkJCX0KLS8vCQkJCQluZXdDb250ZW50RGVzYy5lU2V0KGF0dHJpYiwgbyk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJCi0vLwkJCS8vIG1ha2UgYnJlYWtkb3duIGxpbmtzCi0vLwkJCUxpc3Qgb2xkQWN0QnJlYWtkb3duTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJb2xkQWN0QnJlYWtkb3duTGlzdC5hZGRBbGwob2xkQWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSk7Ci0vLwkJCWZvciAoaXRlciA9IG9sZEFjdEJyZWFrZG93bkxpc3QuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCUJyZWFrZG93bkVsZW1lbnQgYmUgPSAoQnJlYWtkb3duRWxlbWVudClpdGVyLm5leHQoKTsKLS8vCQkJCWJlLnNldFN1cGVyQWN0aXZpdGllcyhudWxsKTsKLS8vCQkJfQotLy8JCQkKLS8vCQkJb2xkQWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jbGVhcigpOwotLy8JCQluZXdBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbChvbGRBY3Rpdml0eUJyZWFrZG93bik7Ci0vLwkJCS8vIG1vdmUgbmV3IGFjdGl2aXR5IHRvIHByb3BlciBpbmRleCBpbiB0aGUgcGFyZW50IGFjdCdzIGJyZWFrZG93biBsaXN0Ci0vLwkJCXN1cGVyQWN0ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eShvbGRBY3Rpdml0eSk7Ci0vLwkJCXN1cGVyQWN0YnJlYWtkb3duTGlzdCA9IChFTGlzdClzdXBlckFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotLy8JCQlzdXBlckFjdGJyZWFrZG93bkxpc3QuYWRkKG9sZEFjdGl2aXR5QnJlYWtkb3duSW5kZXgsIG5ld0FjdGl2aXR5KTsKLS8vCQkJCi0vLwkJCS8vIGhhbmRsZSB2YXJpYWJpbGl0eQotLy8JCQlvbGRBY3RWYXJFbGVtZW50ID0gb2xkQWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotLy8JCQlvbGRBY3RWYXJUeXBlID0gb2xkQWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0vLwkJCW9sZEFjdEltbWVkaWF0ZVZhcmlldGllc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCW9sZEFjdEltbWVkaWF0ZVZhcmlldGllc0xpc3QuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyLmdldEltbWVkaWF0ZVZhcmlldGllcyhvbGRBY3Rpdml0eSkpOwotLy8JCQkKLS8vCQkJaWYgKG9sZEFjdFZhckVsZW1lbnQgIT0gbnVsbCAmJiBvbGRBY3RWYXJUeXBlICE9IG51bGwpIHsKLS8vCQkJCW5ld0FjdGl2aXR5LnNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQob2xkQWN0VmFyRWxlbWVudCk7Ci0vLwkJCQluZXdBY3Rpdml0eS5zZXRWYXJpYWJpbGl0eVR5cGUob2xkQWN0VmFyVHlwZSk7Ci0vLwkJCX0KLS8vCQkJCi0vLwkJCWZvciAoaXRlciA9IG9sZEFjdEltbWVkaWF0ZVZhcmlldGllc0xpc3QuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotLy8JCQkJdmUuc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChuZXdBY3Rpdml0eSk7Ci0vLwkJCX0KLS8vCi0vLwkJCS8vIGNyZWF0ZSB0ZW1wIFByb2Nlc3NQYWNrYWdlIGFuZCBtb3ZlIG9sZEFjdGl2aXR5IHRvIGl0Ci0vLwkJCVByb2Nlc3NQYWNrYWdlIHRlbXBQYXJlbnQgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotLy8JCQl0ZW1wUGFyZW50LmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChvbGRBY3Rpdml0eSk7Ci0vLwkJCXRlbXBQYXJlbnQuc2V0TmFtZSgidGVtcCBQUCBmb3IgZGVsZXRpb24iKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQkJLy8gZGVsZXRlIG9sZCBBY3Rpdml0eSBoZXJlIC0gaWYgZmFpbHMsIHJvbGwgYmFjayBieSBkZWxldGluZyBuZXcgQWN0aXZpdHkKLS8vCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0vLwotLy8JCQlpZiAoIWNvbW1hbmQuZXhlY3V0ZWQgfHwgY29tbWFuZC5mYWlsZWQpIHsKLS8vCQkJCS8vIGRlbGV0ZSBmYWlsZWQsIG9yIHVzZXIgc2VsZWN0ZWQgY2FuY2VsIG9uIHRoZSAiZGVsZXRlCi0vLwkJCQkvLyByZWZlcmVuY2VzIiBkaWFsb2cKLS8vCQkJCS8vIGNsZWFuIHVwIG5ldyBBY3Rpdml0eQotLy8KLS8vCQkJCXVuZG8oKTsKLS8vCi0vLwkJCQluZXdBY3Rpdml0eSA9IG51bGw7Ci0vLwkJCQluZXdDb250ZW50RGVzYyA9IG51bGw7Ci0vLwkJCQlyZXR1cm4gbnVsbDsKLS8vCQkJfQotLy8KLS8vCQkJLy8gc2V0IG5ldyBhY3Rpdml0eSdzIEdVSUQKLS8vCQkJbmV3QWN0aXZpdHkuc2V0R3VpZChvbGRBY3Rpdml0eUd1aWQpOwotLy8JCQkKLS8vCQkJLy8gVE9ETzogdXBkYXRlIGVkaXRvciBjb250ZW50cyAKLS8vCi0vLwkJCS8vIFRPRE86IG9uIHJvbGxiYWNrLCBsaWJyYXJ5IG1heSBiZSBkaXJ0eSBiZWNhdXNlIG9mIHRoZQotLy8JCQkvLyBjb250YWluZXIvY29udGVudGRlc2MgY2hhbmdlcyB3ZSd2ZSBkb25lCi0vLwkJCS8vIGZpeCB0aGlzIGJ5IHN0b3JpbmcgYWxsIHRoZSBvbGQgYWN0aXZpdHkncyBpbmZvLCB0aGVuIG9ubHkgY3JlYXRlCi0vLwkJCS8vIG5ldyBhY3Rpdml0eSBhZnRlciBvbGQgb25lIGhhcwotLy8JCQkvLyBiZWVuIGRlbGV0ZWQuCi0vLwotLy8JCQlTZXQgbW9kaWZpZWRSZXNvdXJjZVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0vLwkJCQotLy8JCQkvLyBzYXZlIG5ldyBhY3Rpdml0eSBhbmQgaXRzIHByZXNlbnRhdGlvbgotLy8JCQlJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotLy8JCQkJCS5nZXRNZXRob2RMaWJyYXJ5UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLS8vCQkJdHJ5IHsKLS8vCQkJCWlmIChuZXdBY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKQotLy8JCQkJCW1vZGlmaWVkUmVzb3VyY2VTZXQuYWRkKG5ld0FjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLS8vCQkJCWlmIChuZXdBY3Rpdml0eS5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKSAhPSBudWxsKQotLy8JCQkJCW1vZGlmaWVkUmVzb3VyY2VTZXQuYWRkKG5ld0FjdGl2aXR5LmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpKTsKLS8vCQkJCWlmIChvbGRBY3Rpdml0eUNvbnRhaW5lci5lUmVzb3VyY2UoKSAhPSBudWxsKQotLy8JCQkJCW1vZGlmaWVkUmVzb3VyY2VTZXQuYWRkKG9sZEFjdGl2aXR5Q29udGFpbmVyLmVSZXNvdXJjZSgpKTsKLS8vCQkJCWlmIChzdXBlckFjdC5lUmVzb3VyY2UoKSAhPSBudWxsKQotLy8JCQkJCW1vZGlmaWVkUmVzb3VyY2VTZXQuYWRkKHN1cGVyQWN0LmVSZXNvdXJjZSgpKTsKLS8vCi0vLwkJCQlmb3IgKGl0ZXIgPSBtb2RpZmllZFJlc291cmNlU2V0Lml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLS8vCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXMpOwotLy8JCQkJfQotLy8JCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotLy8KLS8vCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotLy8JCQkJY29tbWFuZC51bmRvKCk7Ci0vLwkJCQkKLS8vCQkJCXVuZG8oKTsKLS8vCQkJCUxpYnJhcnlQbHVnaW4KLS8vCQkJCQkJLmdldERlZmF1bHQoKQotLy8JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLS8vCQkJCQkJLmRpc3BsYXlFcnJvcigKLS8vCQkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLmNvbnZlcnRBY3Rpdml0eUVycm9yX3RpdGxlLAotLy8JCQkJCQkJCU5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuc2F2ZUNvbnZlcnRlZEFjdGl2aXR5RXJyb3JfbXNnLCBuZXdBY3Rpdml0eS5nZXROYW1lKCkpLCAKLS8vCQkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLmVycm9yX3JlYXNvbiwKLS8vCQkJCQkJCQllKTsKLS8vCQkJCW5ld0FjdGl2aXR5ID0gbnVsbDsKLS8vCQkJfQotLy8JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotLy8JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQkJY29tbWFuZC51bmRvKCk7Ci0vLwkJCXVuZG8oKTsKLS8vCQkJTGlicmFyeVBsdWdpbgotLy8JCQkJCS5nZXREZWZhdWx0KCkKLS8vCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLS8vCQkJCQkuZGlzcGxheUVycm9yKAotLy8JCQkJCQkJTGlicmFyeVJlc291cmNlcy5jb252ZXJ0QWN0aXZpdHlFcnJvcl90aXRsZSwKLS8vCQkJCQkJCU5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuY29udmVydEFjdGl2aXR5RXJyb3JfbXNnLCBuZXdBY3Rpdml0eS5nZXROYW1lKCkpLCAKLS8vCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuZXJyb3JfcmVhc29uLCAKLS8vCQkJCQkJCWV4KTsKLS8vCQkJbmV3QWN0aXZpdHkgPSBudWxsOwotLy8JCX0KLS8vCQlyZXR1cm4gbmV3QWN0aXZpdHk7Ci0vLwl9Ci0vLwotLy8JcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHkgY3JlYXRlTmV3QWN0aXZpdHkoaW50IG5ld1R5cGUpIHsKLS8vCQlzd2l0Y2ggKG5ld1R5cGUpIHsKLS8vCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZOgotLy8JCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5KCk7Ci0vLwkJCWNhc2UgVW1hUGFja2FnZS5JVEVSQVRJT046Ci0vLwkJCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSXRlcmF0aW9uKCk7Ci0vLwkJCWNhc2UgVW1hUGFja2FnZS5QSEFTRToKLS8vCQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQaGFzZSgpOwotLy8JCQlkZWZhdWx0OgotLy8JCQkJcmV0dXJuIG51bGw7Ci0vLwkJfQotLy8JfQotLy8JCi0vLwlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0SW5kZXhJbkJyZWFrZG93bihBY3Rpdml0eSBhY3QpIHsKLS8vCQlpbnQgaW5kZXggPSAtMTsKLS8vCQlBY3Rpdml0eSBzdXBlckFjdCA9IFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkoYWN0KTsKLS8vCQlpZiAoc3VwZXJBY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0vLwkJCS8vIGdldCBwcm9jZXNzLCBmaW5kIGJyZWFrZG93bgotLy8JCQlpbmRleCA9ICgoUHJvY2Vzc0NvbXBvbmVudClzdXBlckFjdCkuZ2V0UHJvY2VzcygpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaW5kZXhPZihhY3QpOwotLy8JCX0KLS8vCQllbHNlIHsKLS8vCQkJaW5kZXggPSBzdXBlckFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmluZGV4T2YoYWN0KTsKLS8vCQl9Ci0vLwkJcmV0dXJuIGluZGV4OwotLy8JfQotLy8JCi0vLwlwcml2YXRlIHN0YXRpYyB2b2lkIHVuZG8oKSB7Ci0vLwkJLy8gdW5kbyBtb3Zpbmcgb2Ygb2xkQWN0aXZpdHkgdG8gdGhlIGZha2UgUFAKLS8vCQlpZiAob2xkQWN0aXZpdHlDb250YWluZXIgIT0gbnVsbCkgewotLy8JCQlvbGRBY3Rpdml0eUNvbnRhaW5lci5nZXRQcm9jZXNzRWxlbWVudHMoKS5yZW1vdmUobmV3QWN0aXZpdHkpOwotLy8JCQlpZiAoIW9sZEFjdGl2aXR5Q29udGFpbmVyLmdldFByb2Nlc3NFbGVtZW50cygpLmNvbnRhaW5zKG9sZEFjdGl2aXR5KSkKLS8vCQkJCW9sZEFjdGl2aXR5Q29udGFpbmVyLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChvbGRBY3Rpdml0eSk7Ci0vLwkJfQotLy8JCS8vIHVuZG8gdGhlIGJyZWFrZG93biBsaW5rIGNoYW5nZXMKLS8vCQlpZiAobmV3QWN0aXZpdHkgIT0gbnVsbCkgewotLy8JCQluZXdBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmNsZWFyKCk7Ci0vLwkJfQotLy8JCWlmIChvbGRBY3Rpdml0eUJyZWFrZG93biAhPSBudWxsICYmIG9sZEFjdGl2aXR5ICE9IG51bGwpIHsKLS8vLy8JCQlvbGRBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmNsZWFyKCk7Ci0vLwkJCW9sZEFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKG9sZEFjdGl2aXR5QnJlYWtkb3duKTsKLS8vCQl9Ci0vLwkJaWYgKHN1cGVyQWN0YnJlYWtkb3duTGlzdCAhPSBudWxsKSB7Ci0vLwkJCWlmIChuZXdBY3Rpdml0eSAhPSBudWxsKSB7Ci0vLwkJCQlzdXBlckFjdGJyZWFrZG93bkxpc3QucmVtb3ZlKG5ld0FjdGl2aXR5KTsKLS8vCQkJfQotLy8JCQlpZiAob2xkQWN0aXZpdHlCcmVha2Rvd25JbmRleCAhPSAtMSAmJiBvbGRBY3Rpdml0eSAhPSBudWxsICYmCi0vLwkJCQkJIXN1cGVyQWN0YnJlYWtkb3duTGlzdC5jb250YWlucyhvbGRBY3Rpdml0eSkpCi0vLwkJCQlzdXBlckFjdGJyZWFrZG93bkxpc3QuYWRkKG9sZEFjdGl2aXR5QnJlYWtkb3duSW5kZXgsIG9sZEFjdGl2aXR5KTsKLS8vCQl9Ci0vLwkJCi0vLwkJLy8gdmFyaWFiaWxpdHkKLS8vCQlpZiAob2xkQWN0VmFyRWxlbWVudCAhPSBudWxsICYmIG9sZEFjdFZhclR5cGUgIT0gbnVsbCkgewotLy8JCQlvbGRBY3Rpdml0eS5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KG9sZEFjdFZhckVsZW1lbnQpOwotLy8JCQlvbGRBY3Rpdml0eS5zZXRWYXJpYWJpbGl0eVR5cGUob2xkQWN0VmFyVHlwZSk7Ci0vLwkJfQotLy8JCQotLy8JCWlmIChvbGRBY3RJbW1lZGlhdGVWYXJpZXRpZXNMaXN0ICE9IG51bGwpIHsKLS8vCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2xkQWN0SW1tZWRpYXRlVmFyaWV0aWVzTGlzdC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXRlci5uZXh0KCk7Ci0vLwkJCQl2ZS5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KG9sZEFjdGl2aXR5KTsKLS8vCQkJfQotLy8JCX0KLS8vCi0vLwotLy8JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0NvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0NvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkMTdjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9Db3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQuQmFzaWNSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklDb250ZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogdXRpbGl0eSBjbGFzcyB0byBjb3B5IGF0dGFjaG1lZW50cyB0byBhbm90aGVyIGxvY2F0aW9uCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaWNuZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uIGV4dGVuZHMgQmFzaWNSZXNvdXJjZU1hbmFnZXIgewotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VTZXQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGVidWc7Ci0KLQlwcml2YXRlIE1hcCBlbGVtZW50VG9PbGRQbHVnaW5NYXA7Ci0KLQlwcml2YXRlIE1ldGhvZFBsdWdpbiBsYXN0T2xkUGx1Z2luID0gbnVsbDsKLQotCXB1YmxpYyBDb3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uKCkgewotCQlkZWJ1ZyA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQ29weSBhdHRhY2htZW50cyB3aXRoaW4gYSBsaWJyYXJ5LCBmcm9tIG9uZSBwbHVnaW4gdG8gYW5vdGhlcgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGNvcHlSZWZlcmVuY2VkQ29udGVudHMoQ29sbGVjdGlvbiBlbGVtZW50cywKLQkJCU1hcCBlbGVtZW50VG9PbGRQbHVnaW5NYXApIHsKLQkJbGFzdE9sZFBsdWdpbiA9IG51bGw7Ci0JCW1vZGlmaWVkUmVzb3VyY2VTZXQgPSBuZXcgSGFzaFNldCgpOwotCQlpZiAoZWxlbWVudFRvT2xkUGx1Z2luTWFwID09IG51bGwpIHsKLQkJCXJldHVybiBtb2RpZmllZFJlc291cmNlU2V0OwotCQl9Ci0JCXRoaXMuZWxlbWVudFRvT2xkUGx1Z2luTWFwID0gZWxlbWVudFRvT2xkUGx1Z2luTWFwOwotCi0JCUl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQkJUmVzb3VyY2UgciA9IChSZXNvdXJjZSkgbzsKLQkJCQlJdGVyYXRvciByZXNvdXJjZUl0ZXIgPSByLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAocmVzb3VyY2VJdGVyLmhhc05leHQoKSkgewotCQkJCQlFT2JqZWN0IGUgPSAoRU9iamVjdCkgcmVzb3VyY2VJdGVyLm5leHQoKTsKLQkJCQkJSGFuZGxlQXR0YWNobWVudHNQbHVnaW4oZSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSBvOwotCQkJCUhhbmRsZUF0dGFjaG1lbnRzUGx1Z2luKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlU2V0OwotCX0KLQotCXByaXZhdGUgdm9pZCBIYW5kbGVBdHRhY2htZW50c1BsdWdpbihFT2JqZWN0IGUpIHsKLQkJLy8gaGFuZGxlIHNlbGYKLQkJTWV0aG9kRWxlbWVudCBlbGVtZW50VG9Qcm9jZXNzID0gbnVsbDsKLQkJLy8gZmluZCB0aGUgb2xkIHBsdWdpbiwgaWYgdGhlcmUgaXMgb25lCi0JCWlmIChlbGVtZW50VG9PbGRQbHVnaW5NYXAgIT0gbnVsbAotCQkJCSYmIChNZXRob2RQbHVnaW4pIGVsZW1lbnRUb09sZFBsdWdpbk1hcC5nZXQoZSkgIT0gbnVsbCkgewotCQkJbGFzdE9sZFBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGVsZW1lbnRUb09sZFBsdWdpbk1hcC5nZXQoZSk7Ci0JCX0KLQotCQlpZiAobGFzdE9sZFBsdWdpbiAhPSBudWxsKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJCURlc2NyaWJhYmxlRWxlbWVudCBkZSA9IChEZXNjcmliYWJsZUVsZW1lbnQpIGU7Ci0KLQkJCQkvLyBDdXN0b20gaWNvbnMKLQkJCQl0cnkgewotCQkJCQkvLyBzaGFwZSBpY29uCi0JCQkJCWphdmEubmV0LlVSSSBzaGFwZUljb25VcmkgPSBkZS5nZXRTaGFwZWljb24oKTsKLQkJCQkJaWYgKHNoYXBlSWNvblVyaSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBUbyBoYW5kbGUgdGhlIHNoYXBlSWNvbi9ub2RlSWNvbiB1cmkgZ290IGNoYW5nZWQsIGl0cyByZWxhdGl2ZSB0byBwbHVnaW5QYXRoLgotCQkJCQkJamF2YS5uZXQuVVJJIHNyY1NoYXBlVXJpID0gVG5nVXRpbC5nZXRGdWxsUGF0aFVSSShkZSwKLQkJCQkJCQkJc2hhcGVJY29uVXJpKTsKLQkJCQkJCVN0cmluZyBzaGFwZUljb25QYXRoID0gc2hhcGVJY29uVXJpLmdldFBhdGgoKTsKLQkJCQkJCWlmKHNoYXBlSWNvblBhdGguaW5kZXhPZihsYXN0T2xkUGx1Z2luLmdldE5hbWUoKSkgPCAwKXsKLQkJCQkJCQlzcmNTaGFwZVVyaSA9IG5ldyBGaWxlKFJlc291cmNlSGVscGVyLmdldFBsdWdpblBhdGgobGFzdE9sZFBsdWdpbikgKyBGaWxlLnNlcGFyYXRvcisgc2hhcGVJY29uUGF0aCkudG9VUkkoKTsKLQkJCQkJCX0KLQkJCQkJCUZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKHNyY1NoYXBlVXJpKTsKLQkJCQkJCUZpbGUgdGd0RmlsZSA9IG5ldyBGaWxlKHNyY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKLQkJCQkJCQkJLnJlcGxhY2VGaXJzdCgKLQkJCQkJCQkJCQkiXFwiICsgRmlsZS5zZXBhcmF0b3IgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJKyBsYXN0T2xkUGx1Z2luLmdldE5hbWUoKQotCQkJCQkJCQkJCQkJKyAiXFwiICsgRmlsZS5zZXBhcmF0b3IsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkiXFwiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCSsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCQkJCQkJCSsgVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZGUpCi0JCQkJCQkJCQkJCQkJCS5nZXROYW1lKCkgKyAiXFwiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCSsgRmlsZS5zZXBhcmF0b3IpKTsKLQkJCQkJCWlmICghdGd0RmlsZS5leGlzdHMoKSkgewotCQkJCQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNyY0ZpbGUsIHRndEZpbGUpOwotCQkJCQkJfQotCQkJCQkJamF2YS5uZXQuVVJJIG5ld1NoYXBlSWNvblVyaSA9IG5ldyBqYXZhLm5ldC5VUkkoTmV0VXRpbAotCQkJCQkJCQkuZW5jb2RlRmlsZVVSTChGaWxlVXRpbC5nZXRSZWxhdGl2ZVBhdGgoCi0JCQkJCQkJCQkJdGd0RmlsZSwgbmV3IEZpbGUoUmVzb3VyY2VIZWxwZXIuZ2V0UGx1Z2luUGF0aChkZSkpKSkpOwotCQkJCQkJZGUuc2V0U2hhcGVpY29uKG5ld1NoYXBlSWNvblVyaSk7Ci0JCQkJCQltb2RpZmllZFJlc291cmNlU2V0LmFkZChkZS5lUmVzb3VyY2UoKSk7Ci0JCQkJCX0KLQotCQkJCQkvLyBub2RlIGljb24KLQkJCQkJamF2YS5uZXQuVVJJIG5vZGVJY29uVXJpID0gZGUuZ2V0Tm9kZWljb24oKTsKLQkJCQkJaWYgKG5vZGVJY29uVXJpICE9IG51bGwpIHsKLQkJCQkJCWphdmEubmV0LlVSSSBzcmNOb2RlVXJpID0gVG5nVXRpbC5nZXRGdWxsUGF0aFVSSShkZSwKLQkJCQkJCQkJbm9kZUljb25VcmkpOwotCQkJCQkJU3RyaW5nIG5vZGVJY29uUGF0aCA9IG5vZGVJY29uVXJpLmdldFBhdGgoKTsKLQkJCQkJCWlmKG5vZGVJY29uUGF0aC5pbmRleE9mKGxhc3RPbGRQbHVnaW4uZ2V0TmFtZSgpKSA8IDApewotCQkJCQkJCXNyY05vZGVVcmkgPSBuZXcgRmlsZShSZXNvdXJjZUhlbHBlci5nZXRQbHVnaW5QYXRoKGxhc3RPbGRQbHVnaW4pICsgRmlsZS5zZXBhcmF0b3IrIG5vZGVJY29uUGF0aCkudG9VUkkoKTsKLQkJCQkJCX0KLQkJCQkJCUZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKHNyY05vZGVVcmkpOwotCQkJCQkJRmlsZSB0Z3RGaWxlID0gbmV3IEZpbGUoc3JjRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQotCQkJCQkJCQkucmVwbGFjZUZpcnN0KAotCQkJCQkJCQkJCSJcXCIgKyBGaWxlLnNlcGFyYXRvciAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkrIGxhc3RPbGRQbHVnaW4uZ2V0TmFtZSgpCi0JCQkJCQkJCQkJCQkrICJcXCIgKyBGaWxlLnNlcGFyYXRvciwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSJcXCIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJCQkJCQkJKyBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihkZSkKLQkJCQkJCQkJCQkJCQkJLmdldE5hbWUoKSArICJcXCIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJKyBGaWxlLnNlcGFyYXRvcikpOwotCQkJCQkJaWYgKCF0Z3RGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkJRmlsZVV0aWwuY29weUZpbGUoc3JjRmlsZSwgdGd0RmlsZSk7Ci0JCQkJCQl9Ci0JCQkJCQlqYXZhLm5ldC5VUkkgbmV3Tm9kZUljb25VcmkgPSBuZXcgamF2YS5uZXQuVVJJKE5ldFV0aWwKLQkJCQkJCQkJLmVuY29kZUZpbGVVUkwoRmlsZVV0aWwuZ2V0UmVsYXRpdmVQYXRoKAotCQkJCQkJCQkJCXRndEZpbGUsIG5ldyBGaWxlKFJlc291cmNlSGVscGVyLmdldFBsdWdpblBhdGgoZGUpKSkpKTsKLQkJCQkJCWRlLnNldE5vZGVpY29uKG5ld05vZGVJY29uVXJpKTsKLQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VTZXQuYWRkKGRlLmVSZXNvdXJjZSgpKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJfQotCQkJCUhhbmRsZUF0dGFjaG1lbnRzUGx1Z2luKGRlLmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCQllbGVtZW50VG9Qcm9jZXNzID0gKENvbnRlbnREZXNjcmlwdGlvbikgZTsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQllbGVtZW50VG9Qcm9jZXNzID0gKE1ldGhvZEVsZW1lbnQpIGU7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIkNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24uSGFuZGxlQXR0YWNobWVudHNQbHVnaW46IHVua25vd24gdHlwZSAiICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChlbGVtZW50VG9Qcm9jZXNzICE9IG51bGwKLQkJCQkJJiYgZWxlbWVudFRvUHJvY2Vzcy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJLy8gc2V0IHVwIENvbnRlbnRSZXNvdXJjZVNjYW5uZXIgZm9yIHRoaXMgZWxlbWVudAotCQkJCS8vIGdpdmUgQ29udGVudFJlc291cmNlU2Nhbm5lciBzYW1lIGRpcmVjdG9yeSBmb3Igc291cmNlUm9vdFBhdGgKLQkJCQkvLyBhbmQgdGFyZ2V0Um9vdFBhdGgKLS8vCQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLS8vCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0vLwkJCQkKLS8vCQkJCVVSSSBlbGVtZW50VVJJID0gbWFuYWdlciAhPSBudWxsID8gbWFuYWdlci5nZXRFbGVtZW50UmVsYXRpdmVVUkkoZWxlbWVudFRvUHJvY2VzcykgOiBudWxsOwotLy8JCQkJaWYgKGVsZW1lbnRVUkkgPT0gbnVsbCB8fCBlbGVtZW50VVJJLnNlZ21lbnRDb3VudCgpIDwgMSkKLS8vCQkJCQlyZXR1cm47Ci0JCQkJCi0JCQkJCi0JCQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3IoZWxlbWVudFRvUHJvY2Vzcyk7Ci0JCQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgbGFzdE9sZFBsdWdpblJlc01nciA9IFJlc291cmNlSGVscGVyLmdldFJlc291cmNlTWdyKGxhc3RPbGRQbHVnaW4pOwotCQkJCQotCQkJCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IGdldFNjYW5uZXIoZWxlbWVudFRvUHJvY2Vzcyk7Ci0KLQkJCQkvLyBpdGVyYXRlIHRocnUgZWxlbWVudCdzIGNvbnRlbnQKLQkJCQlTdHJpbmcgY29udGVudFBhdGggPSBSZXNvdXJjZUhlbHBlcgotCQkJCQkJLmdldEVsZW1lbnRQYXRoKChNZXRob2RFbGVtZW50KSBlbGVtZW50VG9Qcm9jZXNzKTsKLQkJCQlpZiAoY29udGVudFBhdGggPT0gbnVsbCB8fCBjb250ZW50UGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCUxpYnJhcnlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ1dhcm5pbmcoCi0JCQkJCQkJCQlOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb25fbG9nX25vQ29udGVudFBhdGgsIChuZXcgT2JqZWN0W10geyAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnRUb1Byb2Nlc3MpLmdldE5hbWUoKSB9KSkpOyAKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIEZJWE1FOiB0aGlzIGlzIG5vdCBhbHdheXMgY29ycmVjdCB0aGlzIHJlbGF0aXZlIG9mIHRoZSBlbGVtZW50J3MgZm9sZGVyIG1pZ2h0IGhhdmUgYmVlbiBjaGFuZ2VkCi0JCQkJLy8gZHVyaW5nIG1vdmUvY29weQotCQkJCVN0cmluZyBvbGRDb250ZW50UGF0aCA9IGNvbnRlbnRQYXRoLnJlcGxhY2VGaXJzdChVbWFVdGlsCi0JCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnRUb1Byb2Nlc3MpLmdldE5hbWUoKSwKLQkJCQkJCWxhc3RPbGRQbHVnaW4uZ2V0TmFtZSgpKTsKLQkJCQlJdGVyYXRvciBpdGVyID0gZWxlbWVudFRvUHJvY2Vzcy5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpCi0JCQkJCQkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSkgaXRlci5uZXh0KCk7Ci0JCQkJCU9iamVjdCBvID0gZWxlbWVudFRvUHJvY2Vzcy5lR2V0KGF0dHJpYik7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCQlTdHJpbmcgY29udGVudCA9IChTdHJpbmcpIG87Ci0JCQkJCQlpZiAoY29udGVudC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IHNjYW5uZXIucmVzb2x2ZVJlc291cmNlc1BsdWdpbigKLQkJCQkJCQkJCWNvbnRlbnQsIGNvbnRlbnRQYXRoLCBvbGRDb250ZW50UGF0aCk7Ci0JCQkJCQkJaWYgKG5ld0NvbnRlbnQgIT0gbnVsbAotCQkJCQkJCQkJJiYgbmV3Q29udGVudC50cmltKCkubGVuZ3RoKCkgIT0gMAotCQkJCQkJCQkJJiYgIWNvbnRlbnQuZXF1YWxzKG5ld0NvbnRlbnQpKSB7Ci0JCQkJCQkJCWVsZW1lbnRUb1Byb2Nlc3MuZVNldChhdHRyaWIsIG5ld0NvbnRlbnQpOwotCQkJCQkJCQltb2RpZmllZFJlc291cmNlU2V0LmFkZChlbGVtZW50VG9Qcm9jZXNzCi0JCQkJCQkJCQkJLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBUZW1wbGF0ZSBhdHRhY2htZW50cwotLy8JCQkJU3RyaW5nIGxpYlJvb3QgPSBSZXNvdXJjZUhlbHBlci5nZXRWaXJ0dWFsTGlicmFyeVJvb3QoZWxlbWVudFRvUHJvY2Vzcyk7Ci0JCQkJaWYgKGVsZW1lbnRUb1Byb2Nlc3MgaW5zdGFuY2VvZiBHdWlkYW5jZURlc2NyaXB0aW9uKSB7Ci0JCQkJCVN0cmluZyBhdHRhY2htZW50U3RyaW5nID0gKChHdWlkYW5jZURlc2NyaXB0aW9uKSBlbGVtZW50VG9Qcm9jZXNzKQotCQkJCQkJCS5nZXRBdHRhY2htZW50cygpOwotCQkJCQlMaXN0IGF0dGFjaG1lbnRMaXN0ID0gVG5nVXRpbAotCQkJCQkJCS5jb252ZXJ0R3VpZGFuY2VBdHRhY2htZW50c1RvTGlzdChhdHRhY2htZW50U3RyaW5nKTsKLQkJCQkJZm9yIChpdGVyID0gYXR0YWNobWVudExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlTdHJpbmcgYXR0YWNobWVudCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGF0dGFjaG1lbnQgIT0gbnVsbAotCQkJCQkJCQkmJiBhdHRhY2htZW50LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlNYXRjaGVyIG0gPSBSZXNvdXJjZUhlbHBlci5wX3RlbXBsYXRlX2F0dGFjaG1lbnRfdXJsLm1hdGNoZXIoYXR0YWNobWVudCk7Ci0JCQkJCQkJaWYgKCFtLmZpbmQoKSkgewotCQkJCQkJCQlGaWxlIHNyY0NvbnRlbnRQYXRoID0gbmV3IEZpbGUobGFzdE9sZFBsdWdpblJlc01nci5yZXNvbHZlKGxhc3RPbGRQbHVnaW4sIG9sZENvbnRlbnRQYXRoKSk7Ci0JCQkJCQkJCUZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKHNyY0NvbnRlbnRQYXRoLAotCQkJCQkJCQkJCWF0dGFjaG1lbnQpOwotCQkJCQkJCQlGaWxlIHRndENvbnRlbnRQYXRoID0gbmV3IEZpbGUocmVzTWdyLmdldFBoeXNpY2FsUGF0aChlbGVtZW50VG9Qcm9jZXNzKSk7Ci0JCQkJCQkJCUZpbGUgdGd0RmlsZSA9IG5ldyBGaWxlKHRndENvbnRlbnRQYXRoLAotCQkJCQkJCQkJCWF0dGFjaG1lbnQpOwotCQkJCQkJCQlpZiAoIXRndEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNyY0ZpbGUsIHRndEZpbGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gaGFuZGxlIGNoaWxkcmVuCi0JCUl0ZXJhdG9yIGl0ZXIgPSBlLmVBbGxDb250ZW50cygpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUVPYmplY3QgY2hpbGQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlIYW5kbGVBdHRhY2htZW50c1BsdWdpbihjaGlsZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHJlc291cmNlIHNjYW5uZXIgZm9yIHRoZSBlbGVtZW50LgotCSAqLwotCXByaXZhdGUgQ29udGVudFJlc291cmNlU2Nhbm5lciBnZXRTY2FubmVyKE1ldGhvZEVsZW1lbnQgb3duZXIpIHsKLQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3Iob3duZXIpOwotCQlpZiAoIHJlc01nciA9PSBudWxsICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZyByb290Q29udGVudFBhdGggPSByZXNNZ3IuZ2V0TG9naWNhbFBsdWdpblBhdGgob3duZXIpOwotCQlGaWxlIHNyY19yb290ID0gbmV3IEZpbGUocmVzTWdyLmdldFBoeXNpY2FsUGx1Z2luUGF0aChvd25lcikpOwotCQlGaWxlIHRndF9yb290ID0gc3JjX3Jvb3Q7Ci0JCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBDb250ZW50UmVzb3VyY2VTY2FubmVyKHNyY19yb290LCB0Z3Rfcm9vdCwgcm9vdENvbnRlbnRQYXRoLCBnZXRWYWxpZGF0b3IoKSk7Ci0KLQkJcmV0dXJuIHNjYW5uZXI7Ci0JfQotCQotCXB1YmxpYyBJQ29udGVudFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCQotCS8qKgotCSAqIENvcHkgYWxsIGF0dGFjaG1lbnRzIGZyb20gb25lIGxpYnJhcnkgdG8gYW5vdGhlcgotCSAqIAotCSAqIEBwYXJhbSBvbGRMaWJEaXIKLQkgKiAgICAgICAgICAgIE9yaWdpbmFsIGxpYnJhcnkgcm9vdAotCSAqIEBwYXJhbSBuZXdMaWJEaXIKLQkgKiAgICAgICAgICAgIE5ldyBsaWJyYXJ5IHJvb3QKLQkgKiBAcGFyYW0geG1pTGlzdAotCSAqICAgICAgICAgICAgbGlzdCBvZiB4bWkgRmlsZSdzIChwYXNzIG51bGwgdG8gcHJvY2VzcyBhbGwgZmlsZXMgaW4KLQkgKiAgICAgICAgICAgIG5ld0xpYkRpcikKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgb3B0aW9uYWwgKGNhbiBiZSBudWxsKSBJUHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlBdHRhY2htZW50c0xpYnJhcnkoU3RyaW5nIG9sZExpYkRpciwKLQkJCVN0cmluZyBuZXdMaWJEaXIsIExpc3QgeG1pTGlzdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJLy8gZ2V0IGxpc3Qgb2YgLnhtaSBmaWxlcyBpbiBuZXdMaWJEaXIKLQkJaWYgKHhtaUxpc3QgPT0gbnVsbCkKLQkJCXhtaUxpc3QgPSBGaWxlVXRpbC5maWxlTGlzdChuZXcgRmlsZShuZXdMaWJEaXIpLCAieG1pIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJbW9uaXRvci5zdWJUYXNrKExpYnJhcnlSZXNvdXJjZXMuY29weWluZ0F0dGFjaG1lbnRzVGFza19uYW1lKTsKLQotCQlJdGVyYXRvciBpdGVyID0geG1pTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQlGaWxlIHhtaUZpbGUgPSAoRmlsZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoeG1pRmlsZS5leGlzdHMoKSkgewotCQkJCS8vIHBhcnNlIHhtaSBmaWxlCi0JCQkJU0FYUGFyc2VyWE1JIHBhcnNlciA9IG5ldyBTQVhQYXJzZXJYTUkobnVsbCk7Ci0JCQkJcGFyc2VyLnBhcnNlKHhtaUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCS8vIGl0ZXJhdGUgdGhydSBpdCdzIGVsZW1lbnRzLCBjaGVja2luZyBjb250ZW50IGZvciBhdHRhY2htZW50cwotCQkJCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBDb250ZW50UmVzb3VyY2VTY2FubmVyKAotCQkJCQkJbmV3IEZpbGUob2xkTGliRGlyKSwgbmV3IEZpbGUobmV3TGliRGlyKSwgbnVsbCk7Ci0JCQkJSGFuZGxlQXR0YWNobWVudHMocGFyc2VyLnhtaU1hcCwgc2Nhbm5lciwgeG1pRmlsZS5nZXRQYXJlbnQoKQotCQkJCQkJLnN1YnN0cmluZyhuZXdMaWJEaXIubGVuZ3RoKCkpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgSGFuZGxlQXR0YWNobWVudHMoSGFzaE1hcCBlTWFwLAotCQkJQ29udGVudFJlc291cmNlU2Nhbm5lciBzY2FubmVyLCBTdHJpbmcgY29udGVudFBhdGgpIHsKLQkJLy8gaGFuZGxlIHNlbGYKLQkJU3RyaW5nIGNvbnRlbnQgPSBTQVhQYXJzZXJYTUkuZ2V0RWxlbWVudENvbnRlbnQoZU1hcCk7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCS8vIHNjYW4gY29udGVudCBmb3IgYXR0YWNobWVudHMKLQkJCXNjYW5uZXIucmVzb2x2ZVJlc291cmNlcyhjb250ZW50LCBjb250ZW50UGF0aCk7Ci0JCX0KLQotCQkvLyBoYW5kbGUgY2hpbGRyZW4KLQkJSXRlcmF0b3IgaXRlciA9ICgoQXJyYXlMaXN0KSBlTWFwLmdldCgiY2hpbGRyZW4iKSkuaXRlcmF0b3IoKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUhhc2hNYXAgY2hpbGRNYXAgPSAoSGFzaE1hcCkgaXRlci5uZXh0KCk7Ci0JCQlIYW5kbGVBdHRhY2htZW50cyhjaGlsZE1hcCwgc2Nhbm5lciwgY29udGVudFBhdGgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9GaWxlTmFtZUdlbmVyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvRmlsZU5hbWVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk2ZWMyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9GaWxlTmFtZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBoZWxwZXIgY2xhc3MgdG8gcHJvZHVjZSBhIHVuaXF1ZSBuYW1lIGZvciBlYWNoIGd1aWQgb3IgZWxlbWVudAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMgotICoKLSAqLwotcHVibGljIGNsYXNzIEZpbGVOYW1lR2VuZXJhdG9yIHsKLQlwdWJsaWMgc3RhdGljIEZpbGVOYW1lR2VuZXJhdG9yIElOU1RBTkNFID0gbmV3IEZpbGVOYW1lR2VuZXJhdG9yKCk7Ci0JCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IG5hbWVUb0d1aWRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZ3VpZFRvTmFtZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCXByaXZhdGUgTWFwPFN0cmluZywgSW50ZWdlcj4gYmFzZU5hbWVJbmRleE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKLQkKLQlwcml2YXRlIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIHN2Y0xpc3RlbmVyOwotCQotCXByaXZhdGUgRmlsZU5hbWVHZW5lcmF0b3IoKSB7Ci0JCQotCQlzdmNMaXN0ZW5lciA9IG5ldyBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpewotCi0JCQlwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJCQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCUZpbGVOYW1lR2VuZXJhdG9yLnRoaXMuY2xlYXIoKTsKLQkJCQkKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeUNyZWF0ZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJRmlsZU5hbWVHZW5lcmF0b3IudGhpcy5jbGVhcigpOwotCQkJCQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCUZpbGVOYW1lR2VuZXJhdG9yLnRoaXMuY2xlYXIoKTsKLQkJCQkKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCUZpbGVOYW1lR2VuZXJhdG9yLnRoaXMuY2xlYXIoKTsKLQkJCQkKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeVNldChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQkJCi0JCQl9Ci0JCQkKLQkJfTsKLQkJCi0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIoc3ZjTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGd1aWQgZnJvbSB0aGUgZmlsZSBuYW1lLCBhc3N1bWluZyB0aGUgZmlsZSBuYW1lIGlzIGdlbmVyYXRlZCBmcm9tIGFuIGVsZW1lbnQsIAotCSAqIHJldHVybiBudWxsIGlmIG5vdCBmb3VuZC4KLQkgKiBAcGFyYW0gZmlsZU5hbWUgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRHdWlkRnJvbUZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgewotCQlpZiAoIGZpbGVOYW1lID09IG51bGwgfHwgZmlsZU5hbWUuZXF1YWxzKCIiKSApIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiBnZXRHdWlkRnJvbVVuaXF1ZU5hbWUoZ2V0VW5pcXVlTmFtZShmaWxlTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZmlsZSBuYW1lIHdpdGggdGhlIGdpdmVuIHByZWZpeCBhbmQgZXh0ZW5zaW9uCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBuYW1lUHJlZml4IFN0cmluZyBwcmVmaXggZm9yIHRoZSBuYW1lCi0JICogQHBhcmFtIG5hbWVTdWZmaXggU3RyaW5nIHN1ZmZpeCBmb3IgdGhlIG5hbWUKLQkgKiBAcGFyYW0gZXh0IFN0cmluZyBmaWxlIGV4dGVuc2lvbiwgZm9yIGV4YW1wbGUsICIuaHRtbCIKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwkgCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0RmlsZU5hbWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmFtZVByZWZpeCwKLQkJCVN0cmluZyBuYW1lU3VmZml4LCBTdHJpbmcgZXh0KSB7Ci0KLQkJU3RyaW5nIHVuaXF1ZU5hbWUgPSBnZXRVbmlxdWVOYW1lRm9yR3VpZChlbGVtZW50LmdldEd1aWQoKSwgZWxlbWVudC5nZXROYW1lKCkpOwotCQkKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5hbWVQcmVmaXggIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZChuYW1lUHJlZml4KTsKLQkJfQotCi0JCWJ1ZmZlci5hcHBlbmQodW5pcXVlTmFtZSk7Ci0JCQotCQlpZiAobmFtZVN1ZmZpeCAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKG5hbWVTdWZmaXgpOwotCQl9Ci0KLQkJaWYgKGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAoZXh0LmluZGV4T2YoIi4iKSA8IDApIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlleHQgPSAiLiIgKyBleHQ7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQoZXh0KTsKLQkJfQotCQkKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJbmFtZVRvR3VpZE1hcC5jbGVhcigpOwotCQlndWlkVG9OYW1lTWFwLmNsZWFyKCk7Ci0JCWJhc2VOYW1lSW5kZXhNYXAuY2xlYXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9OQU1FX0xFTkdUSCA9IDY0OwotCQotCXByaXZhdGUgU3RyaW5nIGdldFVuaXF1ZU5hbWVGb3JHdWlkKFN0cmluZyBndWlkLCBTdHJpbmcgZGVmYXVsdE5hbWUpIHsKLQkJaWYgKCBndWlkID09IG51bGwgfHwgZ3VpZC5lcXVhbHMoIiIpICkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJLy8gaWYgdGhlIG5hbWUgaXMgYWxyZWFkeSBnZW5lbnJhdGVkLCByZXR1cm4gaXQKLQkJU3RyaW5nIHVuaXF1ZU5hbWUgPSBndWlkVG9OYW1lTWFwLmdldChndWlkKTsKLQkJaWYgKCB1bmlxdWVOYW1lICE9IG51bGwgKSB7Ci0JCQlyZXR1cm4gdW5pcXVlTmFtZTsKLQkJfQotCQkKLQkJLy8gY29uc3RydWN0IHRoZSBiYXNlIGZpbGUgbmFtZSBvZiB0aGUgZWxlbWVudAotCQkvLyBub3RlOiB0byBtYWtlIHRoZSBuYW1lIGNvbnNpc3RlbnQgZXZlcnl0aW1lIHRoZSBuYW1lIGlzIGdlbmVyYXRlZCwgCi0JCS8vIHdlIHN0aWxsIG5lZWQgdG8gbWFrZSB0aGUgbmFtZSBndWlkIHNwZWNpZmljLiAKLQkJLy8gYXBwZW5kaW5nIHRoZSBndWlkIG1ha2VzIHRoZSBzdHJpbmcgdG8gbG9uZywgc28gdXNlIHRoZSBoYXNoY29kZQotCQkvLyBob3dldmVyLCBoYXNoY29kZSBtYXkgaGF2ZSBjb2xsaXNpb24sIHNvIHN0aWxsIG5lZWQgdG8gYXBwZW5kIHRoZSBzdWZmaXggaW5kZXgsCi0JCS8vIGluIHN1Y2ggY2FzZSwgdGhlIGZpbGUgbmFtZSBtYXkgc3RpbGwgbm90IHVuaXF1ZWx5IGJpbmRpbmcgdG8gdGhlIHNhbWUgZWxlbWVudCBjb25zaXN0ZW50bHkuCi0JCS8vIGJ1dCB0aGUgY2hhbmNlIGlzIG11Y2ggc21hbGxlcgotCQlpZiAoIGRlZmF1bHROYW1lID09IG51bGwgKSB7Ci0JCQlkZWZhdWx0TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0gCi0JCQotCQkvLyBtYWtlIHN1cmUgdGhlIGJhc2UgbmFtZSBzdHJpbmcgaXMgdmFsaWQgYW5kIG5vdCBleGNlZWQgdGhlIG1heGltdW0gbGVuZ3RoCi0JCVN0cmluZyBiYXNlTmFtZSA9IFN0clV0aWwucmVtb3ZlU3BlY2lhbENoYXJhY3RlcnMoZGVmYXVsdE5hbWUpOwkKLQkJaWYgKCBiYXNlTmFtZS5sZW5ndGgoKSA+IE1BWF9OQU1FX0xFTkdUSCApIHsKLQkJCWJhc2VOYW1lID0gYmFzZU5hbWUuc3Vic3RyaW5nKDAsIE1BWF9OQU1FX0xFTkdUSCk7Ci0JCX0KLQkJCQotCQliYXNlTmFtZSArPSAiXyIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGd1aWQuaGFzaENvZGUoKSkudG9VcHBlckNhc2UoKTsgLy8kTk9OLU5MUy0xJAotCi0JCXVuaXF1ZU5hbWUgPSBiYXNlTmFtZTsKLQkJSW50ZWdlciBpbmRleCA9IGJhc2VOYW1lSW5kZXhNYXAuZ2V0KGJhc2VOYW1lKTsKLQkJaWYgKCBpbmRleCA9PSBudWxsICkgewotCQkJLy8gdGhpcyBpcyB0aGUgZmlyc3Qgd2l0aCB0aGlzIGJhc2UgbmFtZSwgdXNlIGl0Ci0JCQlpbmRleCA9IG5ldyBJbnRlZ2VyKDEpOwotCQl9IGVsc2UgewotCQkJLy8gaW5jcmVhc2UgdGhlIGluZGV4IGJ5IG9uZSBhbmQgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGJhc2UgbmFtZQotCQkJaW5kZXgrKzsKLQkJCXVuaXF1ZU5hbWUgPSBiYXNlTmFtZSArICItIiArIGluZGV4LnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJYmFzZU5hbWVJbmRleE1hcC5wdXQoYmFzZU5hbWUsIGluZGV4KTsKLQkJZ3VpZFRvTmFtZU1hcC5wdXQoZ3VpZCwgdW5pcXVlTmFtZSk7Ci0JCW5hbWVUb0d1aWRNYXAucHV0KHVuaXF1ZU5hbWUsIGd1aWQpOwotCQlyZXR1cm4gdW5pcXVlTmFtZTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0R3VpZEZyb21VbmlxdWVOYW1lKFN0cmluZyB1bmlxdWVOYW1lKSB7Ci0JCXJldHVybiBuYW1lVG9HdWlkTWFwLmdldCh1bmlxdWVOYW1lKTsKLQl9Ci0JCQotCXByaXZhdGUgU3RyaW5nIGdldFVuaXF1ZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCQotCQl0cnkgewotCQlGaWxlIGYgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCWZpbGVOYW1lID0gZi5nZXROYW1lKCk7Ci0JCWludCBpbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCBpbmRleCA8IDAgKSB7Ci0JCQlyZXR1cm4gZmlsZU5hbWU7Ci0JCX0KLQkJCi0JCXJldHVybiBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9JY29uVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvSWNvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjZjZjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9JY29uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luOwotCi0vKioKLSAqIHV0aWxpdHkgY2xhc3MgdG8gbWFuYWdlIGljb24gdXJscwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEljb25VdGlsIHsKLQotCXByaXZhdGUgc3RhdGljIFVSTCBub2RlSWNvblBsdWdpblJvb3QgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9BY3Rpdml0eSA9ICJmdWxsL29iajE2L0FjdGl2aXR5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9BcnRpZmFjdCA9ICJmdWxsL29iajE2L0FydGlmYWN0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9DYXBhYmlsaXR5UGF0dGVybiA9ICJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9DaGVja2xpc3QgPSAiZnVsbC9vYmoxNi9DaGVja2xpc3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0NvbmNlcHQgPSAiZnVsbC9vYmoxNi9Db25jZXB0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9Db250ZW50UGFja2FnZSA9ICJmdWxsL29iajE2L0NvbnRlbnRQYWNrYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9DdXN0b21DYXRlZ29yeSA9ICJmdWxsL29iajE2L0N1c3RvbUNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9EZWxpdmVyYWJsZSA9ICJmdWxsL29iajE2L0RlbGl2ZXJhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9EZWxpdmVyeVByb2Nlc3MgPSAiZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0Rpc2NpcGxpbmUgPSAiZnVsbC9vYmoxNi9EaXNjaXBsaW5lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9EaXNjaXBsaW5lR3JvdXBpbmcgPSAiZnVsbC9vYmoxNi9EaXNjaXBsaW5lR3JvdXBpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0RvbWFpbiA9ICJmdWxsL29iajE2L0RvbWFpbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fRXN0aW1hdGUgPSAiZnVsbC9vYmoxNi9Fc3RpbWF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID0gImZ1bGwvb2JqMTYvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9FeGFtcGxlID0gImZ1bGwvb2JqMTYvRXhhbXBsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fR3VpZGVsaW5lID0gImZ1bGwvb2JqMTYvR3VpZGVsaW5lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9JdGVyYXRpb24gPSAiZnVsbC9vYmoxNi9JdGVyYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX01ldGhvZENvbmZpZ3VyYXRpb24gPSAiZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9NZXRob2RMaWJyYXJ5ID0gImZ1bGwvb2JqMTYvTWV0aG9kTGlicmFyeSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fTWV0aG9kUGFja2FnZSA9ICJmdWxsL29iajE2L01ldGhvZFBhY2thZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX01ldGhvZFBsdWdpbiA9ICJmdWxsL29iajE2L01ldGhvZFBsdWdpbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fTWlsZXN0b25lID0gImZ1bGwvb2JqMTYvTWlsZXN0b25lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9PdXRjb21lID0gImZ1bGwvb2JqMTYvT3V0Y29tZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUGhhc2UgPSAiZnVsbC9vYmoxNi9QaGFzZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUHJhY3RpY2UgPSAiZnVsbC9vYmoxNi9QcmFjdGljZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUHJvY2Vzc0NvbnRyaWJ1dGlvbiA9ICJmdWxsL29iajE2L1Byb2Nlc3NDb250cmlidXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1Byb2Nlc3NGYW1pbHkgPSAiZnVsbC9vYmoxNi9Qcm9jZXNzRmFtaWx5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9Qcm9jZXNzUGFja2FnZSA9ICJmdWxsL29iajE2L1Byb2Nlc3NQYWNrYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9SZXBvcnQgPSAiZnVsbC9vYmoxNi9SZXBvcnQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1JldXNhYmxlQXNzZXQgPSAiZnVsbC9vYmoxNi9SZXVzYWJsZUFzc2V0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9Sb2FkbWFwID0gImZ1bGwvb2JqMTYvUm9hZG1hcCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUm9sZSA9ICJmdWxsL29iajE2L1JvbGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1JvbGVTZXQgPSAiZnVsbC9vYmoxNi9Sb2xlU2V0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9Sb2xlU2V0R3JvdXBpbmcgPSAiZnVsbC9vYmoxNi9Sb2xlU2V0R3JvdXBpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1N1cHBvcnRpbmdNYXRlcmlhbCA9ICJmdWxsL29iajE2L1N1cHBvcnRpbmdNYXRlcmlhbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fVGFzayA9ICJmdWxsL29iajE2L1Rhc2siOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1RlbXBsYXRlID0gImZ1bGwvb2JqMTYvVGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1Rlcm1EZWZpbml0aW9uID0gImZ1bGwvb2JqMTYvVGVybURlZmluaXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1Rvb2wgPSAiZnVsbC9vYmoxNi9Ub29sIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9Ub29sTWVudG9yID0gImZ1bGwvb2JqMTYvVG9vbE1lbnRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fV2hpdGVwYXBlciA9ICJmdWxsL29iajE2L1doaXRlcGFwZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1dvcmtQcm9kdWN0ID0gImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1dvcmtQcm9kdWN0VHlwZSA9ICJmdWxsL29iajE2L1dvcmtQcm9kdWN0VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIG1hcCBvZiBpbWFnZSB0eXBlIHRvIGltYWdlCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIG5vZGVJY29uVXJsTWFwID0gbmV3IEhhc2hNYXAoKTsKLQlzdGF0aWMgewotCQlub2RlSWNvblVybE1hcC5wdXQoImFjdGl2aXR5IiwgSUNPTl9BY3Rpdml0eSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJhcnRpZmFjdCIsIElDT05fQXJ0aWZhY3QpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgiY2FwYWJpbGl0eXBhdHRlcm4iLCBJQ09OX0NhcGFiaWxpdHlQYXR0ZXJuKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoImNoZWNrbGlzdCIsIElDT05fQ2hlY2tsaXN0KTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoImNvbmNlcHQiLCBJQ09OX0NvbmNlcHQpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgiY29udGVudHBhY2thZ2UiLCBJQ09OX0NvbnRlbnRQYWNrYWdlKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoImN1c3RvbWNhdGVnb3J5IiwgSUNPTl9DdXN0b21DYXRlZ29yeSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJkZWxpdmVyYWJsZSIsIElDT05fRGVsaXZlcmFibGUpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgiZGVsaXZlcnlwcm9jZXNzIiwgSUNPTl9EZWxpdmVyeVByb2Nlc3MpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgiZGlzY2lwbGluZSIsIElDT05fRGlzY2lwbGluZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJkaXNjaXBsaW5lZ3JvdXBpbmciLCBJQ09OX0Rpc2NpcGxpbmVHcm91cGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJkb21haW4iLCBJQ09OX0RvbWFpbik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJlc3RpbWF0ZSIsIElDT05fRXN0aW1hdGUpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgKLQkJCQkiZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zIiwgSUNPTl9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgiZXhhbXBsZSIsIElDT05fRXhhbXBsZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJndWlkZWxpbmUiLCBJQ09OX0d1aWRlbGluZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJpdGVyYXRpb24iLCBJQ09OX0l0ZXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJtZXRob2Rjb25maWd1cmF0aW9uIiwgSUNPTl9NZXRob2RDb25maWd1cmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoIm1ldGhvZGxpYnJhcnkiLCBJQ09OX01ldGhvZExpYnJhcnkpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgibWV0aG9kcGFja2FnZSIsIElDT05fTWV0aG9kUGFja2FnZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJtZXRob2RwbHVnaW4iLCBJQ09OX01ldGhvZFBsdWdpbik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJtaWxlc3RvbmUiLCBJQ09OX01pbGVzdG9uZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJvdXRjb21lIiwgSUNPTl9PdXRjb21lKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInBoYXNlIiwgSUNPTl9QaGFzZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJwcmFjdGljZSIsIElDT05fUHJhY3RpY2UpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgicHJvY2Vzc2NvbnRyaWJ1dGlvbiIsIElDT05fUHJvY2Vzc0NvbnRyaWJ1dGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJwcm9jZXNzZmFtaWx5IiwgSUNPTl9Qcm9jZXNzRmFtaWx5KTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInByb2Nlc3NwYWNrYWdlIiwgSUNPTl9Qcm9jZXNzUGFja2FnZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJyZXBvcnQiLCBJQ09OX1JlcG9ydCk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJyZXVzYWJsZWFzc2V0IiwgSUNPTl9SZXVzYWJsZUFzc2V0KTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInJvYWRtYXAiLCBJQ09OX1JvYWRtYXApOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgicm9sZSIsIElDT05fUm9sZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJyb2xlc2V0IiwgSUNPTl9Sb2xlU2V0KTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInJvbGVzZXRncm91cGluZyIsIElDT05fUm9sZVNldEdyb3VwaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInN1cHBvcnRpbmdtYXRlcmlhbCIsIElDT05fU3VwcG9ydGluZ01hdGVyaWFsKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInRhc2siLCBJQ09OX1Rhc2spOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgidGVtcGxhdGUiLCBJQ09OX1RlbXBsYXRlKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInRlcm1kZWZpbml0aW9uIiwgSUNPTl9UZXJtRGVmaW5pdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJ0b29sIiwgSUNPTl9Ub29sKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInRvb2xtZW50b3IiLCBJQ09OX1Rvb2xNZW50b3IpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgid2hpdGVwYXBlciIsIElDT05fV2hpdGVwYXBlcik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJ3b3JrcHJvZHVjdCIsIElDT05fV29ya1Byb2R1Y3QpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgid29ya3Byb2R1Y3R0eXBlIiwgSUNPTl9Xb3JrUHJvZHVjdFR5cGUpOyAvLyROT04tTkxTLTEkCi0KLQkJbm9kZUljb25VcmxNYXAucHV0KCJyb2xlZGVzY3JpcHRvciIsIElDT05fUm9sZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJ0YXNrZGVzY3JpcHRvciIsIElDT05fVGFzayk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJ3b3JrcHJvZHVjdGRlc2NyaXB0b3IiLCBJQ09OX1dvcmtQcm9kdWN0KTsgLy8kTk9OLU5MUy0xJAotCi0JCXRyeSB7Ci0JCQlub2RlSWNvblBsdWdpblJvb3QgPSBGaWxlTG9jYXRvci5yZXNvbHZlKFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldEJhc2VVUkwoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbm9kZSBpY29uIHVybAotCSAqIAotCSAqIEBwYXJhbSB0eXBlIFN0cmluZyB0aGUgZWxlbWVudCB0eXBlCi0JICogQHJldHVybiBVUkwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXROb2RlSWNvblVSTChTdHJpbmcgdHlwZSkgewotCQl0cnkgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIG5vZGVJY29uVXJsTWFwLmdldCh0eXBlLnRvTG93ZXJDYXNlKCkpOwotCQkJaWYgKGtleSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBVUkwobm9kZUljb25QbHVnaW5Sb290LCAiaWNvbnMvIiArIGtleSArICIuZ2lmIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbm9kZSBpY29uIGZpbGUgbG9jYXRpb24gZm9yIHRoZSBlbGVtZW50IHR5cGUKLQkgKiBAcGFyYW0gdHlwZSBTdHJpbmcgdGhlIGVsZW1lbnQgdHlwZQotCSAqIEByZXR1cm4gRmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXROb2RlSWNvbkZpbGUoU3RyaW5nIHR5cGUpIHsKLQkJVVJMIHVybCA9IGdldE5vZGVJY29uVVJMKHR5cGUpOwotCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0ltcG9ydEV4cG9ydFV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0ltcG9ydEV4cG9ydFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MzODlmOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9JbXBvcnRFeHBvcnRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiB1dGlsaXR5IGNsYXNzIHRvIGhhbmRsZSBlbGVtZW50IHJlcGxhY2Ugb3IgcmVuYW1pbmcgZm9yIGltcG9ydC9leHBvcnQKLSAqIAotICogQGF1dGhvciA/Pz8KLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRFeHBvcnRVdGlsIHsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcHJvY0NvbXAKLQkgKiBAcGFyYW0gZGlyCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcgotCSAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2UoUHJvY2Vzc0NvbXBvbmVudCBwcm9jQ29tcCwgU3RyaW5nIGRpcikKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwKLQkJCUZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IsIFNBWEV4Y2VwdGlvbiB7Ci0JCUZpbGUgbmV3UHJvY0NvbXBGaWxlID0gbmV3IEZpbGUoZGlyLAotCQkJCU11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfTU9ERUxfRklMRU5BTUUpOwotCQlpZiAoIW5ld1Byb2NDb21wRmlsZS5leGlzdHMoKSkgewotCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigKLQkJCQkJTWVzc2FnZUZvcm1hdAotCQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLkltcG9ydEV4cG9ydFV0aWxfTVNHOCwgbmV3IE9iamVjdFtdIHsgbmV3UHJvY0NvbXBGaWxlIH0pKTsKLQkJfQotCi0JCVN0cmluZyBvbGRNb2RlbEZpbGVTdHIgPSBwcm9jQ29tcC5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJU3RyaW5nIG9sZFByb2NDb21wRGlyID0gbmV3IEZpbGUob2xkTW9kZWxGaWxlU3RyKS5nZXRQYXJlbnQoKTsKLQotCQlTdHJpbmcgc3VmZml4ID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0QmFja3VwRmlsZVN1ZmZpeCgpOwotCi0JCUZpbGUgdGVtcERpciA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCS8vIGNvcHkgZGlyIGEgdGVtcCBkaXIgaW5zaWRlIHRoZSB0YXJnZXQgZGlyCi0JCQkvLwotCQkJdGVtcERpciA9IG5ldyBGaWxlKG9sZFByb2NDb21wRGlyLCBzdWZmaXgpOwotCQkJaWYgKCF0ZW1wRGlyLm1rZGlyKCkpIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oCi0JCQkJCQlNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCQkJTGlicmFyeVJlc291cmNlcy5JbXBvcnRFeHBvcnRVdGlsX01TRzksIG5ldyBPYmplY3RbXSB7IHRlbXBEaXIgfSkpOwotCQkJfQotCQkJRmlsZVV0aWwuY29weURpcihuZXcgRmlsZShkaXIpLCB0ZW1wRGlyKTsKLQkJCW5ld1Byb2NDb21wRmlsZSA9IG5ldyBGaWxlKHRlbXBEaXIsCi0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfTU9ERUxfRklMRU5BTUUpOwotCi0JCQkvLyBsb2FkIHRoZSBuZXcgbW9kZWwueG1pCi0JCQkvLwotCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBwcm9jQ29tcAotCQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCVJlc291cmNlIG5ld1Jlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoVVJJCi0JCQkJCS5jcmVhdGVGaWxlVVJJKG5ld1Byb2NDb21wRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksIHRydWUpOwotCi0JCQkvLyBmaXggY29uZmlndXJhdGlvbiByZWZlcmVuY2VzCi0JCQkvLwotCQkJUHJvY2Vzc0NvbXBvbmVudCBuZXdQcm9jQ29tcCA9IChQcm9jZXNzQ29tcG9uZW50KSBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJLmdldE1ldGhvZEVsZW1lbnQobmV3UmVzb3VyY2UpOwotCQkJUHJvY2VzcyBuZXdQcm9jID0gbmV3UHJvY0NvbXAuZ2V0UHJvY2VzcygpOwotCQkJbmV3UHJvYwotCQkJCQkuc2V0RGVmYXVsdENvbnRleHQocHJvY0NvbXAuZ2V0UHJvY2VzcygpCi0JCQkJCQkJLmdldERlZmF1bHRDb250ZXh0KCkpOwotCQkJbmV3UHJvYy5nZXRWYWxpZENvbnRleHQoKS5jbGVhcigpOwotCQkJbmV3UHJvYy5nZXRWYWxpZENvbnRleHQoKS5hZGRBbGwoCi0JCQkJCXByb2NDb21wLmdldFByb2Nlc3MoKS5nZXRWYWxpZENvbnRleHQoKSk7Ci0KLQkJCS8vIGZpeCBhbGwgc3RlcHMKLQkJCS8vCQkKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ld1Byb2NDb21wLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQ7Ci0JCQkJCVRhc2sgdGFzayA9IHRhc2tEZXNjLmdldFRhc2soKTsKLQkJCQkJU3RyaW5nIHRhc2tOYW1lID0gdGFzayA9PSBudWxsID8gIk5PTkUiIDogIiciICsgdGFzay5nZXROYW1lKCkgKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGFzazogIiArIHRhc2tOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAodGFzayAhPSBudWxsKSB7Ci0JCQkJCQl0YXNrRGVzYy5nZXRTZWxlY3RlZFN0ZXBzKCkuY2xlYXIoKTsKLQkJCQkJCXRhc2tEZXNjLmdldFNlbGVjdGVkU3RlcHMoKS5hZGRBbGwodGFzay5nZXRTdGVwcygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gcmVwbGFjZSBHVUlEIG9mIG5ldyBQcm9jZXNzQ29tcG9uZW50IGFuZCBpdHMgUmVzb3VyY2VNYW5hZ2VyIHdpdGgKLQkJCS8vIG9sZCBvbmVzCi0JCQkvLwotCi0JCQkvLyAvLyByZWFkIHRoZSBtb2RlbC54bWkgZmlsZQotCQkJLy8gRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPQotCQkJLy8gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJLy8gRG9jdW1lbnQgZG9jID0gYnVpbGRlci5wYXJzZShuZXdQcm9jQ29tcEZpbGUpOwotCi0JCQkvLyBzZXQgR1VJRCBvZiBuZXcgUmVzb3VyY2VNYW5hZ2VyIHRvIG9sZCBHVUlECi0JCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJLmdldFJlc291cmNlTWFuYWdlcihwcm9jQ29tcC5lUmVzb3VyY2UoKSk7Ci0JCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5nZXRSZXNvdXJjZU1hbmFnZXIobmV3UmVzb3VyY2UpLnNldEd1aWQoCi0JCQkJCQlyZXNNZ3IuZ2V0R3VpZCgpKTsKLQkJCX0KLQotCQkJLy8gTm9kZUxpc3QgbGlzdCA9Ci0JCQkvLyBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciIpOwotCQkJLy8gRWxlbWVudCBlID0gKEVsZW1lbnQpIGxpc3QuaXRlbSgwKTsKLQkJCS8vIGUuc2V0QXR0cmlidXRlKCJ4bWk6aWQiLCBndWlkKTsKLQkJCS8vIGUuc2V0QXR0cmlidXRlKCJndWlkIiwgZ3VpZCk7Ci0KLQkJCS8vIHNldCBHVUlEIG9mIG5ldyBQcm9jZXNzQ29tcG9uZW50IHRvIG9sZCBHVUlECi0JCQluZXdQcm9jQ29tcC5zZXRHdWlkKHByb2NDb21wLmdldEd1aWQoKSk7Ci0KLQkJCS8vIGd1aWQgPSBwcm9jQ29tcC5nZXRHdWlkKCk7Ci0JCQkvLyBsaXN0ID0KLQkJCS8vIGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50Iik7Ci0JCQkvLyBlID0gKEVsZW1lbnQpIGxpc3QuaXRlbSgwKTsKLQkJCS8vIGUuc2V0QXR0cmlidXRlKCJ4bWk6aWQiLCBndWlkKTsKLQkJCS8vIGUuc2V0QXR0cmlidXRlKCJndWlkIiwgZ3VpZCk7Ci0KLQkJCS8vIHNhdmUgdGhlIG5ldyBtb2RlbC54bWkKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlNYXAgc2F2ZU9wdGlvbnMgPSBtYW5hZ2VyICE9IG51bGwgPyBtYW5hZ2VyLmdldFNhdmVPcHRpb25zKCkgOiBuZXcgSGFzaE1hcCgpOwkJCQotCQkJbmV3UmVzb3VyY2Uuc2F2ZShzYXZlT3B0aW9ucyk7Ci0KLQkJCS8vIGJhY2sgdXAgb2xkIG1vZGVsLnhtaQotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUob2xkTW9kZWxGaWxlU3RyKTsKLQkJCUZpbGVVdGlsLm1vdmVGaWxlKGZpbGUsIG5ldyBGaWxlKG9sZE1vZGVsRmlsZVN0ciArICIuYmFrIiArIHN1ZmZpeCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCUZpbGVVdGlsLm1vdmVGaWxlKG5ld1Byb2NDb21wRmlsZSwgbmV3IEZpbGUob2xkTW9kZWxGaWxlU3RyKSk7Ci0KLQkJCS8vIFhNTFV0aWwuc2F2ZURvY3VtZW50KGRvYywgb2xkTW9kZWxGaWxlU3RyKTsKLQotCQkJRmlsZSBuZXdDb250ZW50RmlsZSA9IG5ldyBGaWxlKHRlbXBEaXIsCi0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfQ09OVEVOVF9GSUxFTkFNRSk7Ci0KLQkJCS8vIGJhY2sgdXAgb2xkIGNvbnRlbnQueG1pCi0JCQlTdHJpbmcgY29udGVudEZpbGVTdHIgPSBvbGRQcm9jQ29tcERpciArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCSsgTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9DT05URU5UX0ZJTEVOQU1FOwotCQkJRmlsZSBvbGRDb250ZW50RmlsZSA9IG5ldyBGaWxlKGNvbnRlbnRGaWxlU3RyKTsKLQkJCUZpbGVVdGlsLm1vdmVGaWxlKG9sZENvbnRlbnRGaWxlLCBuZXcgRmlsZShjb250ZW50RmlsZVN0ciArICIuYmFrIiArIHN1ZmZpeCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIGNvcHkgbmV3IGNvbnRlbnQueG1pCi0JCQlpZiAobmV3Q29udGVudEZpbGUuZXhpc3RzKCkpIHsKLQkJCQlGaWxlVXRpbC5tb3ZlRmlsZShuZXdDb250ZW50RmlsZSwgb2xkQ29udGVudEZpbGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRlbXBEaXIgIT0gbnVsbCkgewotCQkJCUZpbGVVdGlsLmRlbGV0ZUFsbEZpbGVzKHRlbXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCXRlbXBEaXIuZGVsZXRlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9MaWJyYXJ5TWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTGlicmFyeU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNiYmE4Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9MaWJyYXJ5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5UcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkFkZFRvQ2F0ZWdvcnlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5SZW1vdmVGcm9tQ2F0ZWdvcnlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWlzYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgYWxsIHRoZSByb3V0aW5lcyB1c2VkIGJ5IHRoZSB0b29sIGVkaXRvciB0byBtYW5pcHVsYXRlCi0gKiB0aGUgYXNzb2NpYXRpb25zIG9mIGEgbWV0aG9kIGVsZW1lbnQgaW4gdGhlIGxpYnJhcnkgd2l0aCBvdGhlciBjYXRlZ29yaWVzIG9yCi0gKiBtZXRob2QgZWxlbWVudHMKLSAqIAotICogVXNlIGdldEF2YWlsYWJsZVhYWCB0byByZXRyaWV2ZSBhIHBpY2sgbGlzdCBvZiBjYXRlZ29yaWVzLCBtZXRob2QgZWxlbWVudCBmb3IKLSAqIGEgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQuIFVzZSBhZGRUb1hYWCB0byBlc3RhYmxpc2ggYSBuZXcgYXNzb2NpYXRpb24uIFVzZQotICogcmVtb3ZlRnJvbVhYWCB0byByZW1vdmUgYW4gZXhpc2l0aW5nIGFzc29jaWF0aW9uLgotICogCi0gKiBDYWxsIHJlbGVhc2VDYXRlZ29yaWVzKCkgYmVmb3JlIHRoZSBlZGl0b3IgY2xvc2VzLCBwYXNzaW5nIGluIGFsbCB0aGUKLSAqIGNhdGVnb3JpZXMgdGhhdCB5b3UgaGF2ZSByZXRyaWV2ZWQgd2l0aCBnZXRBdmFpbGFibGVYWFgoKSBmb3IgdGhlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlNYW5hZ2VyIHsKLQotCXByaXZhdGUgc3RhdGljIENvbXBhcmF0b3IgbmFtZUNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCWlmIChvMSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgbzIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudCkgbzEpLmdldE5hbWUoKS5jb21wYXJlVG8oCi0JCQkJCQkoKE1ldGhvZEVsZW1lbnQpIG8yKS5nZXROYW1lKCkpOwotCQkJfQotCi0JCQlyZXR1cm4gMDsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgc3RhdGljIExpYnJhcnlNYW5hZ2VyIGluc3RhbmNlID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlicmFyeU1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKExpYnJhcnlNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgTGlicmFyeU1hbmFnZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByb3RlY3RlZCBMaWJyYXJ5TWFuYWdlcigpIHsKLQl9Ci0KLQkvLyAvLy8vLy8KLQkvLyBCZWdpbiBvZiBjb2RlIG1vdmVkIGZyb20gTWV0aG9kRWxlbWVudFV0aWwgYW5kIG1hZGUgcHJpdmF0ZQotCS8vIC8vLy8vLwotCS8qKgotCSAqIFJldHVybiBjYXRlZ29yaWVzIGluIHRoZSBtb2RlbCwgZ2l2ZW4gcGFydGljdWxhciBvYmplY3QgYW5kIGNsYXNzCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBjbGFzcwotCSAqIEBwYXJhbSBTdHJpbmdbXQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVDYXRlZ29yaWVzKE1ldGhvZEVsZW1lbnQgb2JqZWN0LCBDbGFzcyBjbGFzc1R5cGUsCi0JCQlTdHJpbmdbXSBwYXRoKSB7Ci0JCUxpc3QgaXRlbUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU1ldGhvZFBsdWdpbiBtb2RlbCA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBvYmplY3QpOwotCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkvLyBhZGQgYWxsIGNhdGVnb3JpZXMgZnJvbSB0aGUgY3VycmVudCBwbHVnaW4KLQkJCS8vCi0JCQlDb250ZW50UGFja2FnZSBkaXNjaXBsaW5lUGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UobW9kZWwsCi0JCQkJCXBhdGgpOwotCQkJaWYgKGRpc2NpcGxpbmVQa2cgIT0gbnVsbCkgewotCQkJCUVMaXN0IGNvbnRlbnRDYXRzID0gKEVMaXN0KSBkaXNjaXBsaW5lUGtnLmdldENvbnRlbnRFbGVtZW50cygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudENhdHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBjb250ZW50Q2F0cy5nZXQoaSk7Ci0KLQkJCQkJaWYgKGNsYXNzVHlwZS5pc0luc3RhbmNlKGVsZW1lbnQpICYmIGVsZW1lbnQgIT0gb2JqZWN0KSB7Ci0JCQkJCQlpdGVtTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGFkZCBhbGwgY2F0ZWdvcmllcyBmcm9tIGJhc2UgcGx1Z2lucyB0aGF0IGFyZSBub3QgZXh0ZW5kZWQKLQkJCS8vCi0JCQlMaXN0IGxpc3QgPSBNaXNjLmdldEFsbEJhc2UobW9kZWwpOwotCQkJLy8gbGlzdC5hZGQoMCwgbW9kZWwpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJQ29udGVudFBhY2thZ2UgcGFyZW50RGlzY2lwbGluZXMgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSgKLQkJCQkJCSgoTWV0aG9kUGx1Z2luKSBsaXN0LmdldChqKSksIHBhdGgpOwotCQkJCWlmIChwYXJlbnREaXNjaXBsaW5lcyAhPSBudWxsKSB7Ci0JCQkJCUVMaXN0IGNvbnRlbnRDYXRzID0gKEVMaXN0KSBwYXJlbnREaXNjaXBsaW5lcwotCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50Q2F0cy5zaXplKCk7IGkrKykgewotCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBjb250ZW50Q2F0cy5nZXQoaSk7Ci0KLQkJCQkJCWlmIChjbGFzc1R5cGUuaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBpdGVtID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudDsKLQkJCQkJCQlpZiAoaXRlbS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gbnVsbCkgewotCQkJCQkJCQkvLyBtYWtlIHN1cmUgdGhlIGl0ZW1MaXN0IGRvZXNuJ3QgaGF2ZSBhCi0JCQkJCQkJCS8vIGNhdGVnb3J5IHRoYXQgZXh0ZW5kcyB0aGlzCi0JCQkJCQkJCWludCBrOwotCQkJCQkJCQlmb3IgKGsgPSAwOyBrIDwgaXRlbUxpc3Quc2l6ZSgpOyBrKyspIHsKLQkJCQkJCQkJCWlmICgoKFZhcmlhYmlsaXR5RWxlbWVudCkgaXRlbUxpc3QuZ2V0KGspKQotCQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IGl0ZW0pCi0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKGsgPT0gaXRlbUxpc3Quc2l6ZSgpKQotCQkJCQkJCQkJaXRlbUxpc3QuYWRkKGl0ZW0pOwotCi0JCQkJCQkJCS8vIGl0ZW1MaXN0LmFkZChpdGVtKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlDb2xsZWN0aW9ucy5zb3J0KGl0ZW1MaXN0LCBuYW1lQ29tcGFyYXRvcik7Ci0KLQkJcmV0dXJuIGl0ZW1MaXN0OwotCX0KLQotCS8vIC8vLy8vLy8vCi0JLy8gRW5kIG9mIGNvZGUgbW92ZWQgZnJvbSBNZXRob2RFbGVtZW50VXRpbAotCS8vIC8vLy8vLy8vCi0KLQkvKioKLQkgKiBHZXRzIGFsbCBkaXNjaXBsaW5lcyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQKLQkgKiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgRGlzY2lwbGluZSBvYmplY3RzCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlRGlzY2lwbGluZXMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVDYXRlZ29yaWVzKGUsIERpc2NpcGxpbmUuY2xhc3MsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVF9ESVNDSVBMSU5FX0RFRl9QQVRIKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCBkb21haW5zIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgRG9tYWluIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVEb21haW5zKE1ldGhvZEVsZW1lbnQgZSkgewotCQlMaXN0IGRvbWFpbnMgPSBnZXRBdmFpbGFibGVDYXRlZ29yaWVzKGUsIERvbWFpbi5jbGFzcywKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxUX0RPTUFJTl9QQVRIKTsKLQotCQkvLyBnZXQgYWxsIHRoZSBkb21haW5zIGluY2x1ZGluZyBzdWJkb21haW5zCi0JCS8vCi0JCUxpc3QgYWxsRG9tYWlucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZG9tYWlucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCURvbWFpbiBkb21haW4gPSAoRG9tYWluKSBpdGVyLm5leHQoKTsKLQkJCUl0ZXJhdG9yIGRvbWFpblRyZWUgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZG9tYWluLCB0cnVlKSB7Ci0KLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQlyZXR1cm4gKChEb21haW4pIG9iamVjdCkuZ2V0U3ViZG9tYWlucygpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCi0JCQl9OwotCQkJd2hpbGUgKGRvbWFpblRyZWUuaGFzTmV4dCgpKSB7Ci0JCQkJYWxsRG9tYWlucy5hZGQoZG9tYWluVHJlZS5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQkJQ29sbGVjdGlvbnMuc29ydChhbGxEb21haW5zLCBuYW1lQ29tcGFyYXRvcik7Ci0KLQkJcmV0dXJuIGFsbERvbWFpbnM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgd29yayBwcm9kdWN0IHR5cGVzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudAotCSAqIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gbGlzdCBvZiBXb3JrUHJvZHVjdFR5cGUgb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVdvcmtQcm9kdWN0VHlwZXMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVDYXRlZ29yaWVzKGUsIFdvcmtQcm9kdWN0VHlwZS5jbGFzcywKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxUX1dPUktfUFJPRFVDVF9UWVBFX1BBVEgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHJvbGUgc2V0cyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBsaXN0IG9mIFJvbGVTZXQgb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVJvbGVTZXRzKE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ2F0ZWdvcmllcyhlLCBSb2xlU2V0LmNsYXNzLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIGN1c3RvbSBjYXRlZ29yaWVzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudAotCSAqIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gbGlzdCBvZiBSb2xlU2V0IG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVDdXN0b21DYXRlZ29yaWVzKE1ldGhvZEVsZW1lbnQgZSkgewotCQlMaXN0IGNhdGVnb3JpZXMgPSBnZXRBdmFpbGFibGVDYXRlZ29yaWVzKGUsIEN1c3RvbUNhdGVnb3J5LmNsYXNzLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFRfQ1VTVE9NX0NBVEVHT1JZX1BBVEgpOwotCQkvLyBmaWx0ZXIgb3V0IHRoZSByb290IGN1c3RvbSBjYXRlZ29yaWVzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNhdGVnb3JpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIGl0ZXIubmV4dCgpKSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhdGVnb3JpZXM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdG9vbHMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gbGlzdCBvZiBUb29sIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVUb29scyhNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNhdGVnb3JpZXMoZSwgVG9vbC5jbGFzcywKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCBkaXNjaXBsaW5lIGdyb3VwaW5ncyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIGdpdmVuCi0JICogTWV0aG9kRWxlbWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgUm9sZVNldCBvYmplY3RzCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlRGlzY2lwbGluZUdyb3VwaW5ncyhNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNhdGVnb3JpZXMoZSwgRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCByb2xlIHNldCBncm91cGluZ3MgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50Ci0JICogb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBsaXN0IG9mIFJvbGVTZXQgb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVJvbGVTZXRHcm91cGluZ3MoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVDYXRlZ29yaWVzKGUsIFJvbGVTZXRHcm91cGluZy5jbGFzcywKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgYSB0YXNrIHRvIGEgZGlzY2lwbGluZQotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb25NZ3IKLQkgKiBAcGFyYW0gZGlzY2lwbGluZQotCSAqIEBwYXJhbSB0YXNrCi0JICogQHJldHVybiBEaXNjaXBsaW5lCi0JICovCi0JcHVibGljIERpc2NpcGxpbmUgYWRkVG9EaXNjaXBsaW5lKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCURpc2NpcGxpbmUgZGlzY2lwbGluZSwgVGFzayB0YXNrLCBMaXN0IHVzZWRDYXRlZ29yaWVzKSB7Ci0JCXJldHVybiAoRGlzY2lwbGluZSkgYWRkVG9DYXRlZ29yeShhY3Rpb25NZ3IsIGRpc2NpcGxpbmUsIHRhc2ssCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9UYXNrcygpLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoLCB0cnVlLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgd29ya3Byb2R1Y3QgdG8gYSBkb21haW4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uTWdyCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSB3cAotCSAqIEByZXR1cm4gRG9tYWluCi0JICovCi0JcHVibGljIERvbWFpbiBhZGRUb0RvbWFpbihJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIERvbWFpbiBkb21haW4sCi0JCQlXb3JrUHJvZHVjdCB3cCwgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlyZXR1cm4gKERvbWFpbikgYWRkVG9DYXRlZ29yeShhY3Rpb25NZ3IsIGRvbWFpbiwgd3AsCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCwgdHJ1ZSwgdXNlZENhdGVnb3JpZXMpOwotCX0KLQotCi0JLyoqCi0JICogYWRkIGEgd29yayBwcm9kdWN0IHRvIGEgV29ya1Byb2R1Y3RUeXBlCi0JICogCi0JICogQHBhcmFtIGFjdGlvbk1ncgotCSAqIEBwYXJhbSB3cFR5cGUKLQkgKiBAcGFyYW0gd3AKLQkgKiBAcmV0dXJuIFdvcmtQcm9kdWN0VHlwZQotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGUgYWRkVG9Xb3JrUHJvZHVjdFR5cGUoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLAotCQkJV29ya1Byb2R1Y3RUeXBlIHdwVHlwZSwgV29ya1Byb2R1Y3Qgd3AsIExpc3QgdXNlZENhdGVnb3JpZXMpIHsKLQkJcmV0dXJuIChXb3JrUHJvZHVjdFR5cGUpIGFkZFRvQ2F0ZWdvcnkoYWN0aW9uTWdyLCB3cFR5cGUsIHdwLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgsIHRydWUsIHVzZWRDYXRlZ29yaWVzKTsKLQl9Ci0KLQotCi0JLyoqCi0JICogYWRkIGFuIGVsZW1lbnQgdG8gYSBDdXN0b21DYXRlZ29yeQotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb25NZ3IKLQkgKiBAcGFyYW0gdXNlckRlZmluZWRDYXRlZ29yeQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBDdXN0b21DYXRlZ29yeQotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeSBhZGRUb0N1c3RvbUNhdGVnb3J5KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCUN1c3RvbUNhdGVnb3J5IHVzZXJEZWZpbmVkQ2F0ZWdvcnksIE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJcmV0dXJuIChDdXN0b21DYXRlZ29yeSkgYWRkVG9DYXRlZ29yeShhY3Rpb25NZ3IsCi0JCQkJCXVzZXJEZWZpbmVkQ2F0ZWdvcnksIGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKSwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgsIHRydWUsIHVzZWRDYXRlZ29yaWVzKTsKLQkJfQotCi0JCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkvLyByZXR1cm4gKEN1c3RvbUNhdGVnb3J5KSBhZGRUb0NhdGVnb3J5KGFjdGlvbk1nciwgdXNlckRlZmluZWRDYXRlZ29yeSwKLQkJLy8gZWxlbWVudCwKLQkJLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpLAotCQkvLyBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCwgdHJ1ZSk7Ci0JCS8vIH0KLQkJLy8gZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCS8vIHJldHVybiAoQ3VzdG9tQ2F0ZWdvcnkpIGFkZFRvQ2F0ZWdvcnkoYWN0aW9uTWdyLCB1c2VyRGVmaW5lZENhdGVnb3J5LAotCQkvLyBlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yaWVzKCksCi0JCS8vIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoLCB0cnVlKTsKLQkJLy8gfQotCQkvLyBlbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKXsKLQkJLy8gcmV0dXJuIChDdXN0b21DYXRlZ29yeSkgYWRkVG9DYXRlZ29yeShhY3Rpb25NZ3IsIHVzZXJEZWZpbmVkQ2F0ZWdvcnksCi0JCS8vIGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X1Byb2Nlc3NFbGVtZW50cygpLAotCQkvLyBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCwgdHJ1ZSk7Ci0JCS8vIH0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIGFkZCBhIHRvb2xtZW50b3IgdG8gYSBUb29sCi0JICogCi0JICogQHBhcmFtIGFjdGlvbk1ncgotCSAqIEBwYXJhbSB0b29sCi0JICogQHBhcmFtIHRvb2xNZW50b3IKLQkgKiBAcmV0dXJuIFRvb2wKLQkgKi8KLQlwdWJsaWMgVG9vbCBhZGRUb1Rvb2woSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBUb29sIHRvb2wsCi0JCQlUb29sTWVudG9yIHRvb2xNZW50b3IsIExpc3QgdXNlZENhdGVnb3JpZXMpIHsKLQkJcmV0dXJuIChUb29sKSBhZGRUb0NhdGVnb3J5KGFjdGlvbk1nciwgdG9vbCwgdG9vbE1lbnRvciwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sX1Rvb2xNZW50b3JzKCksCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCwgdHJ1ZSwgdXNlZENhdGVnb3JpZXMpOwotCX0KLQotCi0JLyoqCi0JICogYWRkIGEgcm9sZSB0byBhIFJvbGVTZXQKLQkgKiBAcGFyYW0gYWN0aW9uTWdyCi0JICogQHBhcmFtIHJvbGVTZXQKLQkgKiBAcGFyYW0gcm9sZQotCSAqIEByZXR1cm4gUm9sZVNldAotCSAqLwotCXB1YmxpYyBSb2xlU2V0IGFkZFRvUm9sZVNldChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIFJvbGVTZXQgcm9sZVNldCwKLQkJCVJvbGUgcm9sZSwgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlyZXR1cm4gKFJvbGVTZXQpIGFkZFRvQ2F0ZWdvcnkoYWN0aW9uTWdyLCByb2xlU2V0LCByb2xlLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZXMoKSwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoLCB0cnVlLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG1ldGhvZCBlbGVtZW50IHRvIHRoZSBjYXRlZ29yeS4gVGhpcyBtZXRob2QgbWlnaHQgY3JlYXRlIGEgbmV3Ci0JICogY29udHJpYnV0b3IgdG8gdGhlIGdpdmVuIGNhdGVnb3J5IGluIHRoZSBtZXRob2QgZWxlbWVudCdzIHBsdWdpbiBpZiB0aGUKLQkgKiBnaXZlbiBjYXRlZ29yeSBiZWxvbmdzIHRvIHRoZSBiYXNlIHBsdWdpbiBvZiB0aGUgbWV0aG9kIGVsZW1lbnQncyBwbHVnaW4uCi0JICogCi0JICogQHBhcmFtIGFjdGlvbk1ncgotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gY2F0ZWdvcnlQa2dQYXRoCi0JICogQHBhcmFtIGNoZWNrRm9yRXhpc3RpbmdDb250cmlidXRvcgotCSAqIEByZXR1cm4gdGhlIGFjdHVhbCBjYXRlZ29yeSB0aGF0IHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCBpcyBhZGRlZCB0bwotCSAqLwotCXB1YmxpYyBDb250ZW50Q2F0ZWdvcnkgYWRkVG9DYXRlZ29yeShJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsCi0JCQlDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnksIE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmdbXSBjYXRlZ29yeVBrZ1BhdGgsCi0JCQlib29sZWFuIGNoZWNrRm9yRXhpc3RpbmdDb250cmlidXRvciwgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlBZGRUb0NhdGVnb3J5Q29tbWFuZCBjbWQgPSBuZXcgQWRkVG9DYXRlZ29yeUNvbW1hbmQoY2F0ZWdvcnksIGVsZW1lbnQsCi0JCQkJZmVhdHVyZSwgY2F0ZWdvcnlQa2dQYXRoLCBjaGVja0ZvckV4aXN0aW5nQ29udHJpYnV0b3IsIHVzZWRDYXRlZ29yaWVzKTsKLQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJcmV0dXJuIChDb250ZW50Q2F0ZWdvcnkpICgoTGlzdCkgY21kLmdldEFmZmVjdGVkT2JqZWN0cygpKS5nZXQoMCk7Ci0JfQotCi0vLwlwdWJsaWMgdm9pZCBzZXRSZXNwb25zaWJsZVJvbGUoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBXb3JrUHJvZHVjdCB3cCwKLS8vCQkJUm9sZSByb2xlKSB7Ci0vLwkJSVJlc291cmNlQXdhcmVDb21tYW5kIGNtZCA9IG5ldyBTZXRPcHBvc2l0ZUZlYXR1cmVDb21tYW5kKHdwLAotLy8JCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfUmVzcG9uc2libGVSb2xlLCByb2xlKTsKLS8vCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotLy8JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgbWV0aG9kIGVsZW1lbnQgZnJvbSB0aGUgY2F0ZWdvcnkuIFRoaXMgbWV0aG9kIG1pZ2h0IGRlbGV0ZQotCSAqIHRoZSBjYXRlZ29yeSBpZiBpdCBpcyBhIGNvbnRyaWJ1dG9yIGFuZCBiZWNhbWUgZW1wdHkgYWZ0ZXIgdGhlIHJlbW92YWwgb2YKLQkgKiB0aGUgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgZmVhdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBjb250ZW50UGtnUGF0aAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kIGVsZW1lbnQgaXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQsIGZhbHNlCi0JICogICAgICAgICBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlRnJvbUNhdGVnb3J5KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSwgTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFN0cmluZ1tdIGNvbnRlbnRQa2dQYXRoLCBMaXN0IHVzZWRDYXRlZ29yaWVzKSB7Ci0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCBjbWQgPSBuZXcgUmVtb3ZlRnJvbUNhdGVnb3J5Q29tbWFuZChjYXRlZ29yeSwKLQkJCQllbGVtZW50LCBmZWF0dXJlLCBjb250ZW50UGtnUGF0aCwgdXNlZENhdGVnb3JpZXMpOwotCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQlyZXR1cm4gIWNtZC5nZXRSZXN1bHQoKS5pc0VtcHR5KCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgbWV0aG9kIGVsZW1lbnQgZnJvbSB0aGUgY2F0ZWdvcnkuIFRoaXMgbWV0aG9kIG1pZ2h0IGRlbGV0ZQotCSAqIHRoZSBjYXRlZ29yeSBpZiBpdCBpcyBhIGNvbnRyaWJ1dG9yIGFuZCBiZWNhbWUgZW1wdHkgYWZ0ZXIgdGhlIHJlbW92YWwgb2YKLQkgKiB0aGUgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgZmVhdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50RmVhdHVyZXMKLQkgKiAgICAgICAgICAgIGZlYXR1cmVzIHRvIGNoZWNrIGZvciBlbXB0aW5lc3MgYmVmb3JlIGRlbGV0aW5nIHRoZSBjYXRlZ29yeQotCSAqIEBwYXJhbSBjb250ZW50UGtnUGF0aAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kIGVsZW1lbnQgaXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQsIGZhbHNlCi0JICogICAgICAgICBvdGhlcndpc2UuCi0JICovCi0JLy8gcHVibGljIGJvb2xlYW4gcmVtb3ZlRnJvbUNhdGVnb3J5KENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSwgTWV0aG9kRWxlbWVudAotCS8vIGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFU3RydWN0dXJhbEZlYXR1cmVbXQotCS8vIGVsZW1lbnRGZWF0dXJlcywgU3RyaW5nW10gY29udGVudFBrZ1BhdGgpIHsKLQkvLyBib29sZWFuIHJldDsKLQkvLyBib29sZWFuIGVtcHR5ID0gZmFsc2U7Ci0JLy8gTWV0aG9kUGx1Z2luIGNhdGVnb3J5UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0ZWdvcnkpOwotCS8vIE1ldGhvZFBsdWdpbiBlbGVtZW50UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JLy8gQ29udGVudENhdGVnb3J5IHVzZWRDYXRlZ29yeTsKLQkvLyBpZihjYXRlZ29yeVBsdWdpbiAhPSBlbGVtZW50UGx1Z2luKSB7Ci0JLy8gdXNlZENhdGVnb3J5ID0KLQkvLyBUbmdVdGlsLmZpbmRDb250cmlidXRvcihVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShlbGVtZW50UGx1Z2luLAotCS8vIGNvbnRlbnRQa2dQYXRoKSwgY2F0ZWdvcnkpOwotCS8vIGlmKHVzZWRDYXRlZ29yeSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCS8vIGVsc2UgewotCS8vIHVzZWRDYXRlZ29yeSA9IGNhdGVnb3J5OwotCS8vIH0KLQkvLyBpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0JLy8gQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIHVzZWRDYXRlZ29yeS5lR2V0KGZlYXR1cmUpOwotCS8vIHJldCA9IGNvbGxlY3Rpb24ucmVtb3ZlKGVsZW1lbnQpOwotCS8vIGVtcHR5ID0gdHJ1ZTsKLQkvLyAvL1RPRE86IG5lZWQgcmV2aXNpdCB0byBmaW5kIGJldHRlciB3YXkgdG8gcmVtb3ZlIHRoZSBlbXB0eSBjb250cmlidXRvcnMKLQkvLyB3aXRob3V0IGFkZGluZyB0byBtdWNoIHdvcmsgb24gaW4gdGhlIFVJIGNvZGUKLQkvLyAvLwotCS8vIC8vIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JLy8gLy8gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBjYXRlZ29yeS5lR2V0KGVsZW1lbnRGZWF0dXJlc1tpXSk7Ci0JLy8gLy8gaWYoIWNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JLy8gLy8gZW1wdHkgPSBmYWxzZTsKLQkvLyAvLyBicmVhazsKLQkvLyAvLyB9Ci0JLy8gLy8gfQotCS8vIH0KLQkvLyBlbHNlIHsKLQkvLyB1c2VkQ2F0ZWdvcnkuZVNldChmZWF0dXJlLCBudWxsKTsKLQkvLyByZXQgPSB0cnVlOwotCS8vIH0KLQkvLyAvLyBpZihjYXRlZ29yeS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCAmJiBlbXB0eSkgewotCS8vIC8vIEVjb3JlVXRpbC5yZW1vdmUoY2F0ZWdvcnkpOwotCS8vIC8vIH0KLQkvLyByZXR1cm4gcmV0OwotCS8vIH0KLQkvLyBwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tRGlzY2lwbGluZShEaXNjaXBsaW5lIGRpc2NpcGxpbmUsIFRhc2sgdGFzaykgewotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9UYXNrcygpOwotCS8vIHJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkoZGlzY2lwbGluZSwgdGFzaywgZmVhdHVyZSwgbmV3Ci0JLy8gRVN0cnVjdHVyYWxGZWF0dXJlW10geyBmZWF0dXJlIH0sCi0JLy8gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpOwotCS8vIH0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tRGlzY2lwbGluZShJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsCi0JCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmUsIFRhc2sgdGFzaywgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfVGFza3MoKTsKLQkJcmV0dXJuIHJlbW92ZUZyb21DYXRlZ29yeShhY3Rpb25NZ3IsIGRpc2NpcGxpbmUsIHRhc2ssIGZlYXR1cmUsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgsIHVzZWRDYXRlZ29yaWVzKTsKLQl9Ci0KLQkvLyBwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tRG9tYWluKERvbWFpbiBkb21haW4sIFdvcmtQcm9kdWN0IHdwKSB7Ci0JLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPQotCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKTsKLQkvLyByZXR1cm4gcmVtb3ZlRnJvbUNhdGVnb3J5KGRvbWFpbiwgd3AsIGZlYXR1cmUsIG5ldyBFU3RydWN0dXJhbEZlYXR1cmVbXSB7Ci0JLy8gZmVhdHVyZSB9LCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGgpOwotCS8vIH0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUZyb21Eb21haW4oSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBEb21haW4gZG9tYWluLAotCQkJV29ya1Byb2R1Y3Qgd3AsIExpc3QgdXNlZENhdGVnb3JpZXMpIHsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREb21haW5fV29ya1Byb2R1Y3RzKCk7Ci0JCXJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkoYWN0aW9uTWdyLCBkb21haW4sIHdwLCBmZWF0dXJlLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCwgdXNlZENhdGVnb3JpZXMpOwotCX0KLQotCS8vIHB1YmxpYyBib29sZWFuIHJlbW92ZUZyb21Xb3JrUHJvZHVjdFR5cGUoV29ya1Byb2R1Y3RUeXBlIHdwVHlwZSwKLQkvLyBXb3JrUHJvZHVjdCB3cCkgewotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0KLQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3RzKCk7Ci0JLy8gcmV0dXJuIHJlbW92ZUZyb21DYXRlZ29yeSh3cFR5cGUsIHdwLCBmZWF0dXJlLCBuZXcgRVN0cnVjdHVyYWxGZWF0dXJlW10gewotCS8vIGZlYXR1cmUgfSwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoKTsKLQkvLyB9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tV29ya1Byb2R1Y3RUeXBlKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCVdvcmtQcm9kdWN0VHlwZSB3cFR5cGUsIFdvcmtQcm9kdWN0IHdwLCBMaXN0IHVzZWRDYXRlZ29yaWVzKSB7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0cygpOwotCQlyZXR1cm4gcmVtb3ZlRnJvbUNhdGVnb3J5KGFjdGlvbk1nciwgd3BUeXBlLCB3cCwgZmVhdHVyZSwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgsIHVzZWRDYXRlZ29yaWVzKTsKLQl9Ci0KLQkvLyBwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tUm9sZVNldChSb2xlU2V0IHJvbGVTZXQsIFJvbGUgcm9sZSkgewotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpOwotCS8vIHJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkocm9sZVNldCwgcm9sZSwgZmVhdHVyZSwgbmV3Ci0JLy8gRVN0cnVjdHVyYWxGZWF0dXJlW10geyBmZWF0dXJlIH0sIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCS8vIH0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUZyb21Sb2xlU2V0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgUm9sZVNldCByb2xlU2V0LAotCQkJUm9sZSByb2xlLCBMaXN0IHVzZWRDYXRlZ29yaWVzKSB7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpOwotCQlyZXR1cm4gcmVtb3ZlRnJvbUNhdGVnb3J5KGFjdGlvbk1nciwgcm9sZVNldCwgcm9sZSwgZmVhdHVyZSwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JfQotCi0JLy8gcHVibGljIGJvb2xlYW4gcmVtb3ZlRnJvbVRvb2woVG9vbCB0b29sLCBUb29sTWVudG9yIHRvb2xNZW50b3IpIHsKLQkvLyBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2xfVG9vbE1lbnRvcnMoKTsKLQkvLyByZXR1cm4gcmVtb3ZlRnJvbUNhdGVnb3J5KHRvb2wsIHRvb2xNZW50b3IsIGZlYXR1cmUsIG5ldwotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIHsgZmVhdHVyZSB9LCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoKTsKLQkvLyB9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tVG9vbChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIFRvb2wgdG9vbCwKLQkJCVRvb2xNZW50b3IgdG9vbE1lbnRvciwgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2xfVG9vbE1lbnRvcnMoKTsKLQkJcmV0dXJuIHJlbW92ZUZyb21DYXRlZ29yeShhY3Rpb25NZ3IsIHRvb2wsIHRvb2xNZW50b3IsIGZlYXR1cmUsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCwgdXNlZENhdGVnb3JpZXMpOwotCX0KLQotCS8vIHB1YmxpYyBib29sZWFuIHJlbW92ZUZyb21DdXN0b21DYXRlZ29yeShDdXN0b21DYXRlZ29yeQotCS8vIHVzZXJEZWZpbmVkQ2F0ZWdvcnksIE1ldGhvZEVsZW1lbnQgZSkgewotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjb250ZW50RWxlbWVudEZlYXR1cmUgPQotCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKTsKLQkvLyBFU3RydWN0dXJhbEZlYXR1cmUgY29udGVudENhdGVnb3J5RmVhdHVyZSA9Ci0JLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcmllcygpOwotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIGZlYXR1cmVzID0geyBjb250ZW50RWxlbWVudEZlYXR1cmUsCi0JLy8gY29udGVudENhdGVnb3J5RmVhdHVyZSB9OwotCS8vIGlmKGUgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCS8vIHJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkodXNlckRlZmluZWRDYXRlZ29yeSwgZSwgY29udGVudEVsZW1lbnRGZWF0dXJlLAotCS8vIGZlYXR1cmVzLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JLy8gfQotCS8vIGVsc2UgaWYoZSBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCS8vIHJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkodXNlckRlZmluZWRDYXRlZ29yeSwgZSwgY29udGVudENhdGVnb3J5RmVhdHVyZSwKLQkvLyBmZWF0dXJlcywgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgpOwotCS8vIH0KLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlRnJvbUN1c3RvbUNhdGVnb3J5KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCUN1c3RvbUNhdGVnb3J5IHVzZXJEZWZpbmVkQ2F0ZWdvcnksIE1ldGhvZEVsZW1lbnQgZSwgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlpZiAoZSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCQkJcmV0dXJuIHJlbW92ZUZyb21DYXRlZ29yeShhY3Rpb25NZ3IsIHVzZXJEZWZpbmVkQ2F0ZWdvcnksIGUsCi0JCQkJCWZlYXR1cmUsIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENhbGwgdGhpcyBtZXRob2QgYmVmb3JlIHRoZSBlZGl0b3IgY2xvc2VzLCBwYXNzaW5nIGluIGFsbCB0aGUgY2F0ZWdvcmllcwotCSAqIHRoYXQgeW91IGhhdmUgcmV0cmlldmVkIHdpdGggZ2V0QXZhaWxhYmxlWFhYKCkgZm9yIHRoZSBlZGl0b3IKLQkgKiAKLQkgKiBAcGFyYW0gY29uc3VtZXIKLQkgKiBAcGFyYW0gY2F0ZWdvcmllcwotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VDYXRlZ29yaWVzKE1ldGhvZEVsZW1lbnQgY29uc3VtZXIsIENvbGxlY3Rpb24gY2F0ZWdvcmllcykgewotCQlNZXRob2RQbHVnaW4gY29uc3VtZXJQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjb25zdW1lcik7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNhdGVnb3JpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ29udGVudENhdGVnb3J5KSBpdGVyLm5leHQoKTsKLQkJCU1ldGhvZFBsdWdpbiBjYXRlZ29yeVBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNhdGVnb3J5KTsKLQkJCWlmIChjYXRlZ29yeS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbAotCQkJCQkmJiBjYXRlZ29yeVBsdWdpbiA9PSBjb25zdW1lclBsdWdpbgotCQkJCQkmJiBUbmdVdGlsLmlzRW1wdHkoY2F0ZWdvcnkpKSB7Ci0JCQkJRWNvcmVVdGlsLnJlbW92ZShjYXRlZ29yeSk7Ci0JCQkJaWYgKGNhdGVnb3J5IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJVG5nVXRpbC5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkoY2F0ZWdvcnlQbHVnaW4pCi0JCQkJCQkJLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5yZW1vdmUoY2F0ZWdvcnkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nW10gcGF0aCA9IGdldENhdGVnb3J5UGFja2FnZVBhdGgoY2F0ZWdvcnkpOwotCQkJCS8vIHBhdGggY2FuIGJlIG51bGwgaWYgdGhlIGNhdGVnb3J5IGlzIGRlbGV0ZWQKLQkJCQkvLwotCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJQ29udGVudFBhY2thZ2UgY2F0ZWdvcnlQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSgKLQkJCQkJCQljb25zdW1lclBsdWdpbiwgcGF0aCk7Ci0JCQkJCUNvbnRlbnRDYXRlZ29yeSBjb250cmlidXRvciA9IFRuZ1V0aWwuZmluZENvbnRyaWJ1dG9yKAotCQkJCQkJCWNhdGVnb3J5UGtnLCBjYXRlZ29yeSk7Ci0JCQkJCWlmIChjb250cmlidXRvciAhPSBudWxsICYmIFRuZ1V0aWwuaXNFbXB0eShjb250cmlidXRvcikpIHsKLQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoY29udHJpYnV0b3IpOwotCQkJCQkJaWYgKGNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJCQlUbmdVdGlsLmdldFJvb3RDdXN0b21DYXRlZ29yeShjb25zdW1lclBsdWdpbikKLQkJCQkJCQkJCS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkucmVtb3ZlKGNvbnRyaWJ1dG9yKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVRhc2tzKENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ29udGVudEVsZW1lbnRzKFRhc2suY2xhc3MsIGNhdGVnb3J5LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlV29ya1Byb2R1Y3RzKENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSkgewotCQkvLyAvLyBzcGVjaWFsIGhhbmRsaW5nIHRvIGRpc2FsbG93IGFzc2lnbWVudCBvZiB3b3JrIHByb2R1Y3RzIHRvIGRvbWFpbgotCQkvLyB3aXRoIHN1YmRvbWFpbnMKLQkJLy8gLy8KLQkJLy8gaWYoY2F0ZWdvcnkgaW5zdGFuY2VvZiBEb21haW4gJiYKLQkJLy8gISgoRG9tYWluKWNhdGVnb3J5KS5nZXRTdWJkb21haW5zKCkuaXNFbXB0eSgpKSB7Ci0JCS8vIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkvLyB9Ci0KLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNvbnRlbnRFbGVtZW50cyhXb3JrUHJvZHVjdC5jbGFzcywgY2F0ZWdvcnksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVSb2xlcyhDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNvbnRlbnRFbGVtZW50cyhSb2xlLmNsYXNzLCBjYXRlZ29yeSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIHRoZSBnaXZlbiBjb250ZW50IGVsZW1lbnQKLQkgKiB0byByZWZlcmVuY2UgdG8KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kRWxlbWVudFR5cGUKLQkgKiAgICAgICAgICAgIGNvbmNyZWN0IGNsYXNzIG9mIHRoZSB0aGUgZ2l2ZW4gY29udGVudCBlbGVtZW50LgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGxvY2FsT25seQotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgb25seSB0aGUgZWxlbWVudHMgaW4gdGhlIGdpdmVuIGVsZW1lbnQncyBwbHVnaW4gYXJlCi0JICogICAgICAgICAgICBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0LgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVDb250ZW50RWxlbWVudHMoQ2xhc3MgbWV0aG9kRWxlbWVudFR5cGUsCi0JCQlDb250ZW50RWxlbWVudCBlbGVtZW50LCBib29sZWFuIGxvY2FsT25seSkgewotCQlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IG1vZGVsTGlzdDsKLQkJaWYgKGxvY2FsT25seSkgewotCQkJbW9kZWxMaXN0ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChVbWFVdGlsCi0JCQkJCS5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCkpOwotCQl9IGVsc2UgewotCQkJbW9kZWxMaXN0ID0gTWV0aG9kRWxlbWVudFV0aWwuZ2V0QWxsTW9kZWxzKGVsZW1lbnQpOwotCQl9Ci0JCWludCBzaXplID0gbW9kZWxMaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU1ldGhvZFBsdWdpbiBtb2RlbCA9IChNZXRob2RQbHVnaW4pIG1vZGVsTGlzdC5nZXQoaSk7Ci0JCQlDb250ZW50UGFja2FnZSBjb3JlQ29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKG1vZGVsLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0JCQlpZiAoY29yZUNvbnRlbnRQa2cgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCVRyZWVJdGVyYXRvciBpdGVyYXRvciA9IGNvcmVDb250ZW50UGtnLmVBbGxDb250ZW50cygpOwotCi0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IChPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAobWV0aG9kRWxlbWVudFR5cGUuaXNJbnN0YW5jZShvYmopICYmIG9iaiAhPSBlbGVtZW50KSB7Ci0JCQkJCWVsZW1lbnRMaXN0LmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUNvbGxlY3Rpb25zLnNvcnQoZWxlbWVudExpc3QsIG5hbWVDb21wYXJhdG9yKTsKLQotCQlyZXR1cm4gZWxlbWVudExpc3Q7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJvbGUKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVUYXNrcyhSb2xlIHJvbGUpIHsKLQkJLy8gV2hpbGUgZWRpdGluZyBhIHJvbGUsIHlvdSBvbmx5IGNhbiBhc3NpZ24gdGhpcyByb2xlIHRvIGEgdGFzayBpbiB0aGUKLQkJLy8gc2FtZSBwbHVnaW4uCi0JCS8vIE90aGV3aXNlIHlvdSB3aWxsIG1vZGlmeSB0aGUgYmFzZSBwbHVnaW4uCi0JCS8vCi0JCXJldHVybiBnZXRBdmFpbGFibGVDb250ZW50RWxlbWVudHMoVGFzay5jbGFzcywgcm9sZSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHdwCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlVGFza3MoV29ya1Byb2R1Y3Qgd3ApIHsKLQkJLy8gV2hpbGUgZWRpdGluZyBhIHdvcmsgcHJvZHVjdCwgeW91IG9ubHkgY2FuIGFzc2lnbiB0aGlzIHdvcmsgcHJvZHVjdAotCQkvLyB0byBhIHRhc2sgaW4gdGhlIHNhbWUgcGx1Z2luLgotCQkvLyBPdGhld2lzZSB5b3Ugd2lsbCBtb2RpZnkgdGhlIGJhc2UgcGx1Z2luLgotCQkvLwotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ29udGVudEVsZW1lbnRzKFRhc2suY2xhc3MsIHdwLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVSb2xlcyhXb3JrUHJvZHVjdCB3cCkgewotCQkvLyBXaGlsZSBlZGl0aW5nIGEgd29yayBwcm9kdWN0LCB5b3Ugb25seSBjYW4gYXNzaWduIHRoaXMgd29yayBwcm9kdWN0Ci0JCS8vIHRvIGEgcm9sZSBpbiB0aGUgc2FtZSBwbHVnaW4uCi0JCS8vIE90aGV3aXNlIHlvdSB3aWxsIG1vZGlmeSB0aGUgYmFzZSBwbHVnaW4uCi0JCS8vCi0JCXJldHVybiBnZXRBdmFpbGFibGVDb250ZW50RWxlbWVudHMoUm9sZS5jbGFzcywgd3AsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByb2xlCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlV29ya1Byb2R1Y3RzKFJvbGUgcm9sZSkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ29udGVudEVsZW1lbnRzKFdvcmtQcm9kdWN0LmNsYXNzLCByb2xlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhc2sKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVXb3JrUHJvZHVjdHMoVGFzayB0YXNrKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVDb250ZW50RWxlbWVudHMoV29ya1Byb2R1Y3QuY2xhc3MsIHRhc2ssIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdGFzawotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVJvbGVzKFRhc2sgdGFzaykgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ29udGVudEVsZW1lbnRzKFJvbGUuY2xhc3MsIHRhc2ssIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdGFzawotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFN0ZXBMaXN0KFRhc2sgdGFzaykgewotCQlpZiAodGFzay5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUwotCQkJCXx8IHRhc2suZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IFRuZ1V0aWwuZ2V0QmFzZSh0YXNrKTsKLQkJCWZpbmFsIExpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAodHlwZXMuaXNFbXB0eSgpKSB7Ci0JCQkJc3luY2hyb25pemVkICh0eXBlcykgewotCQkJCQlpZiAodHlwZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQl0eXBlcy5hZGQoVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKTsKLQkJCQkJCXR5cGVzLmFkZChWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlJdGVyYXRvciBleHRlbmRlZCA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihiYXNlKSB7Ci0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJTGlzdCBsaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCk7Ci0JCQkJCWlmIChsaXN0ID09IG51bGwgfHwgbGlzdC5pc0VtcHR5KCkpCi0JCQkJCQlDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCQkJCUxpc3Qgb3V0cHV0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgbGlzdC5nZXQoaSk7Ci0JCQkJCQlpZiAodHlwZXMuY29udGFpbnMoZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSkpIHsKLQkJCQkJCQlvdXRwdXRMaXN0LmFkZChlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gb3V0cHV0TGlzdC5pdGVyYXRvcigpOwotCQkJCX0KLQkJCX07Ci0JCQlmb3IgKDsgZXh0ZW5kZWQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdCA9IChUYXNrKSBleHRlbmRlZC5uZXh0KCk7Ci0JCQkJdC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBiYXNlCi0JICogQHBhcmFtIHZhcmlhYmlsaXR5VHlwZXMKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFeHRlbmRlZChWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSwgQ29sbGVjdGlvbiB2YXJpYWJpbGl0eVR5cGVzKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0RXh0ZW5kZWQobGlzdCwgYmFzZSwgdmFyaWFiaWxpdHlUeXBlcyk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0RXh0ZW5kZWQoTGlzdCBvdXRwdXRMaXN0LCBWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSwKLQkJCUNvbGxlY3Rpb24gdmFyaWFiaWxpdHlUeXBlcykgewotCQlMaXN0IGxpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoYmFzZSk7Ci0JCWlmIChsaXN0ID09IG51bGwgfHwgbGlzdC5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGxpc3QuZ2V0KGkpOwotCQkJaWYgKHZhcmlhYmlsaXR5VHlwZXMuY29udGFpbnMoZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSkpIHsKLQkJCQlvdXRwdXRMaXN0LmFkZChlKTsKLQkJCX0KLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBsaXN0LmdldChpKTsKLQkJCWlmICh2YXJpYWJpbGl0eVR5cGVzLmNvbnRhaW5zKGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkpKSB7Ci0JCQkJZ2V0RXh0ZW5kZWQob3V0cHV0TGlzdCwgYmFzZSwgdmFyaWFiaWxpdHlUeXBlcyk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldENhdGVnb3J5UGFja2FnZVBhdGgoQ29udGVudENhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCUVPYmplY3QgcGFyZW50ID0gbnVsbDsKLQkJZm9yIChwYXJlbnQgPSBjYXRlZ29yeS5lQ29udGFpbmVyKCk7IHBhcmVudCAhPSBudWxsCi0JCQkJJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSk7IHBhcmVudCA9IHBhcmVudAotCQkJCS5lQ29udGFpbmVyKCkpCi0JCQk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDb250ZW50UGFja2FnZSBjYXRlZ29yeVBrZyA9IChDb250ZW50UGFja2FnZSkgcGFyZW50OwotCQlyZXR1cm4gTWlzYy5nZXRQYXRoUmVsYXRpdmVUb1BsdWdpbihjYXRlZ29yeVBrZyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9MaWJyYXJ5VXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTGlicmFyeVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBlNmIwZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9MaWJyYXJ5VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVhNSVNhdmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gUFVCTElTSF9NT0RFID0gZmFsc2U7Ci0JCi0JLyoqCi0JICogQ2hlY2sgaXMgZ2l2ZW4gcGx1Z2luIG5hbWUgaXMgdmFsaWQgbmFtZSBpbiB0aGUgbGlicmFyeQotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1BsdWdpbk5hbWUoTWV0aG9kUGx1Z2luIHBsdWdpbiwgU3RyaW5nIG5ld05hbWUpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCXJldHVybiBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVWYWxpZGF0b3IobGliLAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TLAotCQkJCShJRmlsdGVyKSBudWxsLCBudWxsLCBVbWFQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX0VMRU1FTlRfX05BTUUpCi0JCQkJLmlzVmFsaWQobmV3TmFtZSk7CQkKLQl9Ci0KLQkvKioKLQkgKiBtZXRob2QgdG8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYSBwbHVnaW4gb3IgcGFja2FnZSBzbyB0aGF0IGlzIGNhbiBiZSBzZWxlY3RlZCBpbiBjb25maWd1cmF0aW9uIGVkaXRvci4gCi0JICogTWF5IG5lZWQgYSBiZXR0ZXIgbmFtZSBmb3IgdGhpcy4KLQkgKiBAcGFyYW0gZWxlbWVudCBFT2JqZWN0Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNlbGVjdGFibGUoRU9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkKLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGNvbnRhaW5lciBvZiB0aGUgZWxlbWVudCB0aGF0IGlzIHNlbGVjdGFibGUuCi0JICogQHBhcmFtIGVsZW1lbnQgRU9iamVjdAotCSAqIEByZXR1cm4gRU9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRU9iamVjdCBnZXRTZWxlY3RhYmxlKEVPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCUVPYmplY3QgcGtnID0gZWxlbWVudC5lQ29udGFpbmVyKCk7Ci0JCQl3aGlsZSAocGtnICE9IG51bGwgJiYgIShwa2cgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSApIHsKLQkJCQlwa2cgPSBwa2cuZUNvbnRhaW5lcigpOwotCQkJfQotCQkJcmV0dXJuIHBrZzsKLQkJCQotCQl9IGVsc2UgewotCQkJRU9iamVjdCBwYXJlbnQgPSBlbGVtZW50OwotCQkJd2hpbGUgKChwYXJlbnQgIT0gbnVsbCkgJiYgIXNlbGVjdGFibGUocGFyZW50KSkgewotCQkJCXBhcmVudCA9IHBhcmVudC5lQ29udGFpbmVyKCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIG1ldGhvZCBwbHVnaW4gZm9yIHRoZSBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgRU9iamVjdAotCSAqIEByZXR1cm4gTWV0aG9kUGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RQbHVnaW4gZ2V0TWV0aG9kUGx1Z2luKEVPYmplY3QgZWxlbWVudCkgewotCQkvLyBFT2JqZWN0IHBhcmVudCA9IGVsZW1lbnQ7Ci0JCS8vIHdoaWxlICgocGFyZW50ICE9IG51bGwpICYmICEocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkvLyBwYXJlbnQgPSBwYXJlbnQuZUNvbnRhaW5lcigpOwotCQkvLyB9Ci0JCS8vCi0JCS8vIHJldHVybiAoTWV0aG9kUGx1Z2luKSBwYXJlbnQ7Ci0KLQkJcmV0dXJuIFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIGdldCBhIHByaW50YWJsZSBuYW1lIHN0cmluZyBmb3IgdGhlIGVsZW1lbnQuIE5vdGUsIHRoaXMgaXMgbm90IHRoZSBlbGVtZW50IG5hbWUgYXR0cmlidXRlCi0JICogQHBhcmFtIGVsZW1lbnQgT2JqZWN0Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy51bmtub3duX3RleHQ7IAotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuIGdldEZ1bGxOYW1lKChNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IGEgcHJpbnRhYmxlIG5hbWUgZm9yIHRoZSBlbGVtZW50LgotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZ1bGxOYW1lKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoc2VsZWN0YWJsZShlbGVtZW50KSkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIlsiKS5hcHBlbmQoZWxlbWVudC5nZXROYW1lKCkpLmFwcGVuZCgiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU1ldGhvZEVsZW1lbnQgcGFyZW50ID0gZWxlbWVudDsKLQkJCXdoaWxlICgocGFyZW50ID0gKE1ldGhvZEVsZW1lbnQpIHBhcmVudC5lQ29udGFpbmVyKCkpICE9IG51bGwpIHsKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnVmZmVyLmluc2VydCgwLCAiWyIgKyBwYXJlbnQuZ2V0TmFtZSgpICsgIl0uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0TmFtZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50J3MgdHlwZTpuYW1lIGFzIGEgbG9jYWxpemVkIHN0cmluZwotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2FsaXplVHlwZU5hbWUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlTdHJpbmcgbmFtZVN0ciA9IFRuZ1V0aWwuZ2V0VHlwZVRleHQoZWxlbWVudCkgKyBMaWJyYXJ5UmVzb3VyY2VzLmNvbG9uX3dpdGhfc3BhY2UgOwotCQkJCi0JCQlpZiAoKChEZXNjcmliYWJsZUVsZW1lbnQpIGVsZW1lbnQpLmdldFByZXNlbnRhdGlvbk5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJbmFtZVN0ciArPSAiKCIgKyAoKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgIikgIiArICgoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50KS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJbmFtZVN0ciArPSBlbGVtZW50LmdldE5hbWUoKTsKLQkJCX0KLQkJCXJldHVybiBuYW1lU3RyIDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBnZXRUeXBlTmFtZShlbGVtZW50KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQncyB0eXBlOm5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlTmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGVsZW1lbnQgPT0gbnVsbCA/ICIiIDogZWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgZWxlbWVudC5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQncyB0eXBlOm5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGVsZW1lbnQgPT0gbnVsbCA/ICIiIDogZWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGVsZW1lbnQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIG1ldGhvZCBwbHVnaW5zIGluIHRoZSBsaWJyYXJ5Ci0JICogQHBhcmFtIGxpYnJhcnkgTWV0aG9kTGlicmFyeQotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2YgTWV0aG9kUGx1Z2luIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TWV0aG9kUGx1Z2lucyhNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRUxpc3QgZWxlbWVudHMgPSBsaWJyYXJ5LmVDb250ZW50cygpOwotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCWl0ZW1zLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0IGEgbGlzdCBvZiBndWlkIHN0cmluZ3Mgb2YgdGhlIG1ldGhvZCBwbHVnaW5zIGluIHRoZSBsaWJyYXJ5Ci0JICogQHBhcmFtIGxpYnJhcnkgTWV0aG9kTGlicmFyeQotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRNZXRob2RQbHVnaW5HdWlkcyhNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBlbGVtZW50cyA9IGxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RQbHVnaW4gZWxlbWVudCA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCQlpdGVtcy5hZGQoZWxlbWVudC5nZXRHdWlkKCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgTWV0aG9kUGx1Z2luIGluIHRoZSBsaWJyYXJ5IHdpdGggdGhlIGdpdmVuIHBsdWdpbiBndWlkLgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5IE1ldGhvZExpYnJhcnkKLQkgKiBAcGFyYW0gcGx1Z2luR3VpZCBTdHJpbmcKLQkgKiBAcmV0dXJuIE1ldGhvZFBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGx1Z2luIGdldE1ldGhvZFBsdWdpbihNZXRob2RMaWJyYXJ5IGxpYnJhcnksCi0JCQlTdHJpbmcgcGx1Z2luR3VpZCkgewotCQlpZiAocGx1Z2luR3VpZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUxpc3QgZWxlbWVudHMgPSBsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kUGx1Z2luIGVsZW1lbnQgPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKHBsdWdpbkd1aWQuZXF1YWxzKGVsZW1lbnQuZ2V0R3VpZCgpKSkgewotCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBNZXRob2RQbHVnaW4gaW4gdGhlIGxpYnJhcnkgd2l0aCB0aGUgZ2l2ZW4gcGx1Z2luIG5hbWUuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkgTWV0aG9kTGlicmFyeQotCSAqIEBwYXJhbSBuYW1lIFN0cmluZwotCSAqIEByZXR1cm4gTWV0aG9kUGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RQbHVnaW4gZ2V0TWV0aG9kUGx1Z2luQnlOYW1lKE1ldGhvZExpYnJhcnkgbGlicmFyeSwKLQkJCVN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTGlzdCBlbGVtZW50cyA9IGxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RQbHVnaW4gZWxlbWVudCA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCQlpZiAobmFtZS5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQkJCXJldHVybiBlbGVtZW50OwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoqCi0JICogZ2V0IGFsbCB0aGUgY29udGFpbmVkIE1ldGhvZFBhY2thZ2VzIGZvciB0aGUgZWxlbWVudCwgcmV0dXJuIGVtcHR5IGxpc3QgaWYgbm90aGluZyBmb3VuZC4KLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE1ldGhvZFBhY2thZ2VzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudC5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCWl0ZW1zLmFkZChlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQkvKioKLQkgKiB1cHdyYXAgdGhlIG9iamVjdAotCSAqIEBwYXJhbSBvYmogT2JqZWN0Ci0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCB1bndyYXAoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gVG5nVXRpbC51bndyYXAob2JqKTsKLQl9Ci0KLQkvKioKLQkgKiB1bndyYXAgdGhlIGNvbW1hbmQKLQkgKiBAcGFyYW0gY21kIENvbW1hbmQKLQkgKiBAcmV0dXJuIENvbW1hbmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbW1hbmQgdW53cmFwKENvbW1hbmQgY21kKSB7Ci0JCXJldHVybiBUbmdVdGlsLnVud3JhcChjbWQpOwotCX0KLQotCS8qKgotCSAqIGNsZWFyIHRoZSByZXNvdXJjZSB0aGUgZWxlbWVudHMgYXNzb2NpYXRlZCB0by4gU28gdGhhdCB0aGUgZWxlbWVudCBjYW4gYmUKLQkgKiBhZGRlZCB0byBhbm90aGVyIGxpYnJhcnkgYW5kIGdvdCBuZXcgcmVzb3VyY2UgYXNzaWduZWQuCi0JICogCi0JICogQHBhcmFtIGltcG9ydExpYnJhdHkKLQkgKiAgICAgICAgICAgIE1ldGhvZExpYnJhcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGV0YWNoRnJvbVJlc291cmNlKE1ldGhvZExpYnJhcnkgaW1wb3J0TGlicmF0eSkgewotCQlSZXNvdXJjZVNldCByZXNTZXQgPSBudWxsOwotCQlSZXNvdXJjZSByZXMgPSBpbXBvcnRMaWJyYXR5LmVSZXNvdXJjZSgpOwotCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCXJlc1NldCA9IHJlcy5nZXRSZXNvdXJjZVNldCgpOwotCQl9Ci0KLQkJaWYgKHJlc1NldCAhPSBudWxsKSB7Ci0JCQlmb3IgKFRyZWVJdGVyYXRvciBpdCA9IHJlc1NldC5nZXRBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTXVsdGlSZXNvdXJjZUVPYmplY3QpIHsKLQkJCQkJKChNdWx0aVJlc291cmNlRU9iamVjdCkgb2JqKS5lU2V0UmVzb3VyY2UobnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gY2xlYXIgYWxsIHRoZSB1bnJlc29sdmVkIHByb3hpZXMKLQkJY2xlYXJQcm94aWVzKGltcG9ydExpYnJhdHkpOwotCX0KLQotCS8qKgotCSAqIGNsZWFyIHByb3h5IGZvciB0aGUgZWxlbWVudC4gVGhpcyBpcyB1c2VkIHRvIGZpeCB0aGUgZWxlbWVudCB3aGVuIHRoZSBwcm94eSBjYW4ndCBiZSByZXNvbHZlZC4KLQkgKiBAcGFyYW0gZWxlbWVudCBFT2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyUHJveGllcyhFT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQuZUlzUHJveHkoKSkgewotCQkJLy8gcmVzZXQgdGhlIHByb3h5IHRvIG51bGwKLQkJCXNldFByb3h5VVJJKGVsZW1lbnQsIG51bGwpOwotCQl9IGVsc2UgewotCQkJLy8gaXRlcmF0ZSB0aGUgY2hpbGRyZW4KLQkJCWZvciAoVHJlZUl0ZXJhdG9yIGl0ID0gZWxlbWVudC5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG8uZUlzUHJveHkoKSkgewotCQkJCQlzZXRQcm94eVVSSShvLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIG9iamVjdCdzIHByb3h5IHVyaQotCSAqIEBwYXJhbSBvYmogRU9iamVjdAotCSAqIEBwYXJhbSB1cmkgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm94eVVSSShFT2JqZWN0IG9iaiwKLQkJCW9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkgdXJpKSB7Ci0JCSgob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCkgb2JqKS5lU2V0UHJveHlVUkkodXJpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldExvYWRlZFJlc291cmNlcyhNZXRob2RMaWJyYXJ5IGxpYiwgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZXhjbHVkZXMpIHsKLQotCQlDb2xsZWN0aW9uPFJlc291cmNlPiBsb2FkZWRyZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQotCQlmb3IgKEl0ZXJhdG9yPFJlc291cmNlPiBpdCA9IGxpYi5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpCi0JCQkJLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpaXQubmV4dCgpOwotCQkJaWYgKCByZXMuaXNMb2FkZWQoKSApIHsKLQkJCQlpZiAoIChleGNsdWRlcyA9PSBudWxsKSB8fCAhZXhjbHVkZXMuY29udGFpbnMocmVzKSApIHsKLQkJCQkJbG9hZGVkcmVzLmFkZChyZXMpOwotCQkJCX0KLQkJCX0KLQkJfQkKLQkJCi0JCXJldHVybiBsb2FkZWRyZXM7Ci0JfQotCQotCS8qKgotCSAqIGxvYWQgYWxsIGVsZW1lbnRzIGluIHRoZSBsaWJyYXJ5Ci0JICogQHBhcmFtIGxpYiBNZXRob2RMaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBsb2FkQWxsKE1ldGhvZExpYnJhcnkgbGliKSB7Ci0KLQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gbG9hZGVkcmVzID0gZ2V0TG9hZGVkUmVzb3VyY2VzKGxpYiwgbnVsbCk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yPEVPYmplY3Q+IGl0ZXIgPSBsaWIuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJdHJ5IHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJZm9yIChJdGVyYXRvcjxFT2JqZWN0PiBpdGVyYXRvciA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGdldExvYWRlZFJlc291cmNlcyhsaWIsIGxvYWRlZHJlcyk7Ci0JfQotCi0JCi0JLyoqCi0JICogbG9hZCBhbGwgcHJvY2Vzc2VzIGluIHRoZSBsaWJyYXJ5Ci0JICogQHBhcmFtIGxpYiBNZXRob2RMaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvYWRBbGxQcm9jZXNzZXMoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZ2V0TWV0aG9kUGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJdHJ5IHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQkJVG5nVXRpbC5nZXRBbGxQcm9jZXNzZXMocGx1Z2luKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkubG9nKGUpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIHNhdmUgYWxsIGVsZW1lbnRzIGluIHRoZSBsaWJyYXJ5IG5vdCBtYXR0ZXIgdGhlIGVsZW1lbnQgaXMgY2hhbmdlZCBvciBub3QuIAotCSAqIERvbid0IHJlZnJlc2ggdGhlIHdvcmtzcGFjZS4KLQkgKiBAcGFyYW0gbGliIE1ldGhvZExpYnJhcnkKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlQWxsKE1ldGhvZExpYnJhcnkgbGliKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2F2ZUxpYnJhcnkobGliLCB0cnVlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogc2F2ZSB0aGUgc3BlY2lmaWVkIG1ldGhvZCBsaWJyYXJ5IGJhc2VkIG9uIHRoZSBsaWJyYXJ5IHJlc291cmNlc2V0LiBZb3UKLQkgKiBuZWVkIHRvIHNldCB0aGUgcmVzb3VyY2Ugc2V0IGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kIHRvIHNhdmUgdGhlCi0JICogbGlicmFyeQotCSAqIAotCSAqIEBwYXJhbSBsaWIKLQkgKiAgICAgICAgICAgIE1ldGhvZExpYnJhcnkKLQkgKiBAcGFyYW0gc2F2ZUFsbAotCSAqICAgICAgICAgICAgYm9vbGVhbiBpZiB0cnVlLCBmb3JjZSBzYXZpbmcgYWxsIHRoZSByZXNvdXJjZXMgZXZlbiBpZiB0aGV5Ci0JICogICAgICAgICAgICBhcmUgbm90IG1vZGlmaWVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYiwgYm9vbGVhbiBzYXZlQWxsLAotCQkJYm9vbGVhbiByZWZyZXNoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUxpYnJhcnlSZXNvdXJjZVNldCBsaWJSZXNvdXJjZVNldCA9IChJTGlicmFyeVJlc291cmNlU2V0KSBsaWIuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJaWYobGliUmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHsKLQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGxpYlJlc291cmNlU2V0OwotCi0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCU1hcCBzYXZlT3B0aW9ucyA9IG1hbmFnZXIgIT0gbnVsbCA/IG1hbmFnZXIuZ2V0U2F2ZU9wdGlvbnMoKQotCQkJCQk6IG5ldyBIYXNoTWFwKCk7Ci0KLQkJCS8vIGJhY2sgdXAgY3VycmVudCBSRUZSRVNIX05FV19SRVNPVVJDRSBvcHRpb24KLQkJCU9iamVjdCBvbGQgPSBzYXZlT3B0aW9ucy5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuUkVGUkVTSF9ORVdfUkVTT1VSQ0UpOwotCQkJT2JqZWN0IG9sZENoZWNrTW9kaWZ5ID0gc2F2ZU9wdGlvbnMKLQkJCS5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuQ0hFQ0tfTU9ESUZZKTsKLQkJCXRyeSB7Ci0JCQkJLy8gZGlzYWJsZSB3b3Jrc3BhY2UgcmVmcmVzaCB3aGVuIG5ldyBmaWxlIGlzIGNyZWF0ZWQKLQkJCQlzYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuUkVGUkVTSF9ORVdfUkVTT1VSQ0UsCi0JCQkJCQlyZWZyZXNoID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXNhdmVPcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5DSEVDS19NT0RJRlksICJmYWxzZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkvLyBzYXZlIHJlc291cmNlIHNldCBoZXJlCi0JCQkJcmVzb3VyY2VTZXQuc2F2ZShzYXZlT3B0aW9ucywgc2F2ZUFsbCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCS8vIHJlc3RvcmUgUkVGUkVTSF9ORVdfUkVTT1VSQ0Ugb3B0aW9uCi0JCQkJc2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlJFRlJFU0hfTkVXX1JFU09VUkNFLCBvbGQpOwotCQkJCXNhdmVPcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5DSEVDS19NT0RJRlksIG9sZENoZWNrTW9kaWZ5KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWxpYlJlc291cmNlU2V0LnNhdmUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGxvYWQgdGhlIGxpYnJhcnkgYXQgdGhlIHNwZWNpZmllZCBwYXRoLiByZXR1cm4gdGhlIE1ldGhvZExpYnJhcnkuCi0JICogVGhpcyBtZXRob2QgaXMgZGlmZmVyZW50IGZyb20gdGhlIHRoZSBvcGVuIGxpYnJhcnkgaW4gTGlicmFyeVNlcnZpY2UuIAotCSAqIEl0IG9ubHkgbG9hZCB0aGUgcm93IGxpYnJhcnkgb2JqZWN0IGJ1dCB3aWxsIG5vdCBpbXBhY3QgdGhlIGN1cnJlbnQgRVBGIGVudmlyb25tZW50LgotCSAqIEBwYXJhbSBsaWJyYXJ5UGF0aCBTdHJpbmcKLQkgKiBAcmV0dXJuIE1ldGhvZExpYnJhcnkKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kTGlicmFyeSBsb2FkTGlicmFyeShTdHJpbmcgbGlicmFyeVBhdGgpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IFBlcnNpc3RlbmNlU2VydmljZS5JTlNUQU5DRS5jcmVhdGVSZXNvdXJjZVNldChTZXJ2aWNlcy5YTUlfUEVSU0lTVEVOQ0VfVFlQRSk7Ci0JCXJlc291cmNlU2V0LmxvYWRNZXRob2RMaWJyYXJpZXMoVVJJLmNyZWF0ZUZpbGVVUkkobGlicmFyeVBhdGgpLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQlyZXR1cm4gcmVzb3VyY2VTZXQuZ2V0Rmlyc3RNZXRob2RMaWJyYXJ5KCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSByb290IHBhdGggb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IAotCSAqIEBwYXJhbSBsaWIgTWV0aG9kTGlicmFyeQotCSAqIEByZXR1cm4gRmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRMaWJyYXJ5Um9vdFBhdGgoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJUmVzb3VyY2UgcmVzID0gbGliLmVSZXNvdXJjZSgpOwotCQlpZiAocmVzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJVVJJIHVyaSA9IHJlcy5nZXRVUkkoKTsKLQkJU3RyaW5nIHBhdGggPSB1cmkudG9GaWxlU3RyaW5nKCk7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKHBhdGgpOwotCQlyZXR1cm4gZi5nZXRQYXJlbnRGaWxlKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IGFsbCBwYWNrYWdlcyBpbiB0aGUgcGx1Z2luCi0JICogQHBhcmFtIHBsdWdpbiBNZXRob2RQbHVnaW4KLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsUGFja2FnZXMoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlMaXN0IGFsbFBrZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJTGlzdCBwa2dzID0gcGx1Z2luLmdldE1ldGhvZFBhY2thZ2VzKCk7Ci0JCWFsbFBrZ3MuYWRkQWxsKHBrZ3MpOwotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBwa2dzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWdldEFsbENoaWxkUGFja2FnZXMoKE1ldGhvZFBhY2thZ2UpIGl0Lm5leHQoKSwgYWxsUGtncyk7Ci0JCX0KLQotCQlyZXR1cm4gYWxsUGtnczsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgYWxsIGNoaWxkIHBhY2thZ2VzIG9mIHRoZSBnaXZlbiBNZXRob2RQYWNrYWdlIGFuZCBhZGQgdG8gdGhlIGxpc3QKLQkgKiBAcGFyYW0gcGtnIE1ldGhvZFBhY2thZ2UKLQkgKiBAcGFyYW0gcmVzdWx0IExpc3QgdGhlIHBhY2thZ2VzIGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldEFsbENoaWxkUGFja2FnZXMoTWV0aG9kUGFja2FnZSBwa2csIExpc3QgcmVzdWx0KSB7Ci0JCUxpc3QgcGtncyA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCXJlc3VsdC5hZGRBbGwocGtncyk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHBrZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJZ2V0QWxsQ2hpbGRQYWNrYWdlcygoTWV0aG9kUGFja2FnZSkgaXQubmV4dCgpLCByZXN1bHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IGFsbCBjb25maWd1cmF0aW9ucyByZWZlcmVuY2VkIGJ5IHRoaXMgcGx1Z2luCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEByZXR1cm4gTGlzdCBvZiBNZXRob2RDb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFzc29jaWF0ZWRDb25maWd1cmF0aW9ucyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCS8vIGdldCB0aGUgY29uZmlncyB0aGF0IHJlZmVyZW5jZXMgdGhpcyBtZXRob2QgcGx1Z2luCi0JCUxpc3QgYWxsQ29uZmlncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBjb25maWdzID0gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHBsdWdpbikKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoQXNzb2NpYXRpb25IZWxwZXIuTWV0aG9kUGx1Z2luX01ldGhvZENvbmZpZ3VyYXRpb25zKTsKLQkJYWRkVW5pcXVlSXRlbXMoY29uZmlncywgYWxsQ29uZmlncyk7Ci0KLQkJLy8gZ2V0IHRoZSBjb25maWdzIHRoYXQgcmVmZXJlbmNlcyB0aGUgcGFja2FnZXMgaW4gdGhpcyBwbHVnaW4KLQkJTGlzdCBwa2dzID0gZ2V0QWxsUGFja2FnZXMocGx1Z2luKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBrZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbyA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgaXQubmV4dCgpOwotCi0JCQljb25maWdzID0gKExpc3QpIG8KLQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKEFzc29jaWF0aW9uSGVscGVyLk1ldGhvZFBhY2thZ2VfTWV0aG9kQ29uZmlndXJhdGlvbnMpOwotCQkJYWRkVW5pcXVlSXRlbXMoY29uZmlncywgYWxsQ29uZmlncyk7Ci0JCX0KLQotCQkvLyBnZXQgdGhlIGNvbmdpZ3VyYXRpb25zIHRoYXQgcmVmZXJlbmNlZCBieSB0aGUgcHJvY2Vzc2VzIGluIHRoaXMKLQkJLy8gcGx1Z2luCi0JCUxpc3QgcHJvY3MgPSBUbmdVdGlsLmdldEFsbFByb2Nlc3NlcyhwbHVnaW4pOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcHJvY3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHAgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSBpdAotCQkJCQkubmV4dCgpOwotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjID0gcC5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJaWYgKChjICE9IG51bGwpICYmICFhbGxDb25maWdzLmNvbnRhaW5zKGMpKSB7Ci0JCQkJYWxsQ29uZmlncy5hZGQoYyk7Ci0JCQl9Ci0JCQlhZGRVbmlxdWVJdGVtcyhwLmdldFZhbGlkQ29udGV4dCgpLCBhbGxDb25maWdzKTsKLQkJfQotCi0JCXJldHVybiBhbGxDb25maWdzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkVW5pcXVlSXRlbXMoTGlzdCBmcm9tLCBMaXN0IHRvKSB7Ci0JCWlmIChmcm9tID09IG51bGwgfHwgdG8gPT0gbnVsbCB8fCBmcm9tLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZnJvbS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCWlmICghdG8uY29udGFpbnMobykpIHsKLQkJCQl0by5hZGQobyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB2YWxpZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBieSBmb3JjaW5nIHRvIHNlbGVjdCB0aGUgZ2xvYmFsIHBhY2thZ2VzIG9mCi0JICogdGhlIHNlbGVjdGVkIG1ldGhvZCBwbHVnaW5zLCB0aGlzIGlzIG5lZWRlZCBmb3IgY29uZmlndXJhdGlvbiBleHBvcnRpbmcuCi0JICogSWYgZ2xvYmFsIHBhY2thZ2VzIGFyZSBtaXNzaW5nLCB0aGUgZXhwb3J0ZWQgY29uZmlndXJhdGlvbiBpcyBub3QgdmFsaWQKLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uTWdyIGlmIG5vdCBudWxsLCB3aWxsIHVzZSB0aGUgZ2l2ZW4gSUFjdGlvbk1hbmFnZXIgdG8gY2hhbmdlIHRoZSBjb25maWd1cmF0aW9uLCBvdGhlcndpc2UgY29uZmlndXJhdGlvbiB3aWxsIGJlIGNoYW5nZWQgZGlyZWN0bHkKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0vLwkJTGlzdCBwbHVnaW5zID0gY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotLy8JCUxpc3QgcGtnU2VscyA9IGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0vLwotLy8JCWZvciAoSXRlcmF0b3IgaXRwID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdHAuaGFzTmV4dCgpOykgewotLy8JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRwLm5leHQoKTsKLS8vCQkJTGlzdCBwa2dzID0gVG5nVXRpbC5nZXRBbGxTeXN0ZW1QYWNrYWdlcyhwbHVnaW4pOwotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGtncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlPYmplY3QgcGtnID0gaXQubmV4dCgpOwotLy8JCQkJaWYgKCFwa2dTZWxzLmNvbnRhaW5zKHBrZykpIHsKLS8vCQkJCQlwa2dTZWxzLmFkZChwa2cpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotCQkKLQkJLy8gbW92ZWQgdG8gVG5nVXRpbAotCQlUbmdVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihhY3Rpb25NZ3IsIGNvbmZpZyk7Ci0JfQotCi0JLyoqCi0JICogdmFsaWRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gYnkgZm9yY2luZyB0byBzZWxlY3QgdGhlIGdsb2JhbCBwYWNrYWdlcyBvZgotCSAqIHRoZSBzZWxlY3RlZCBtZXRob2QgcGx1Z2lucywgdGhpcyBpcyBuZWVkZWQgZm9yIGNvbmZpZ3VyYXRpb24gZXhwb3J0aW5nLgotCSAqIElmIGdsb2JhbCBwYWNrYWdlcyBhcmUgbWlzc2luZywgdGhlIGV4cG9ydGVkIGNvbmZpZ3VyYXRpb24gaXMgbm90IHZhbGlkCi0JICogQHBhcmFtIHBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKG51bGwsIGNvbmZpZyk7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgY29weXJpZ2h0IG9iamVjdCBmb3IgYW4gZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN1cHBvcnRpbmdNYXRlcmlhbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3VwcG9ydGluZ01hdGVyaWFsIGdldENvcHlyaWdodChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3VwcG9ydGluZ01hdGVyaWFsIHNtID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RVbml0KSB7Ci0JCQlzbSA9ICgoTWV0aG9kVW5pdCkgZWxlbWVudCkuZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJc20gPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uKCkKLQkJCQkJLmdldENvcHlyaWdodFN0YXRlbWVudCgpOwotCQl9Ci0KLQkJLy8gaWYgbm8gY29weXJpZ2h0IG9mIGl0J3Mgb3duLCBnZXQgdGhlIGNvcHlyaWdodCBmcm9tIHRoZSBwbHVnaW4KLQkJaWYgKHNtID09IG51bGwpIHsKLQkJCU1ldGhvZFBsdWdpbiBwID0gZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQkJaWYgKHAgIT0gbnVsbCkgewotCQkJCXNtID0gcC5nZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzbTsKLQl9Ci0KLQkvKioKLQkgKiBmb3IgdGhlIGdpdmVuIGNvbnRhaW5lciBhbmQgZWxlbWVudHMgbGlzdCwgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaW4gdGhlIGxpc3QgaXMgY29udGFpbmVkIGJ5IHRoZSBjb250YWluZXIgb3Igbm90LiAKLQkgKiByZXR1cm4gYWxsIHRoZSBjb250YWluZWQgZWxlbWVudHMgZm9yIGEgZ2l2ZW4gY29udGFpbmVyCi0JICogQHBhcmFtIGNvbnRhaW5lciBPYmplY3QKLQkgKiBAcGFyYW0gZWxlbWVudHMgQ29sbGVjdGlvbgotCSAqIEByZXR1cm4gQ29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXRDb250YWluZWRFbGVtZW50cyhPYmplY3QgY29udGFpbmVyLAotCQkJQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCWNvbnRhaW5lciA9ICgoVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIpIGNvbnRhaW5lcikuZ2V0VGFyZ2V0KCk7Ci0JCX0KLQkJQXJyYXlMaXN0IGNvbnRhaW5lZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJCSYmIFVtYVV0aWwuaXNDb250YWluZWRCeSgoRU9iamVjdCkgZWxlbWVudCwgY29udGFpbmVyKSkgewotCQkJCWNvbnRhaW5lZC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lZDsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0d28gbWV0aG9kIGVsZW1lbnQgYXJlIGlkZW50aWNhbCBvciBub3QuIFR3byBlbGVtZW50cyBhcmUKLQkgKiBpZGVudGljYWwgaWYgYW5kIG9ubHkgaWY6IGFsbCB0aGUgYXR0cmlidXRlIHZhbHVlcyBhcmUgZXF1YWwgYWxsIHRoZQotCSAqIHJlZmVyZW5jZWQgZWxlbWVudHMgYXJlIGVxdWFsIGFsbCB0aGUgY29udGFpbmVkIGVsZW1lbnRzIGFyZSBpZGVudGljYWwKLQkgKiAKLQkgKiBAcGFyYW0gb2xkT2JqCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIG5ld09iagotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0lkZW50aWNhbChNZXRob2RFbGVtZW50IG9sZE9iaiwgTWV0aG9kRWxlbWVudCBuZXdPYmopIHsKLQotCQlpZiAoKG9sZE9iaiA9PSBudWxsKSAmJiAobmV3T2JqID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWlmICgob2xkT2JqID09IG51bGwpIHx8IChuZXdPYmogPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIHRoaXMgZG9lcyBub3Qgd29yaywgdGhlIHRvU3RyaW5nIGNvbnRhaW5zIHRoZSBvYmplY3QgaW5zdGFuY2UgaW5mbwotCQkvLyByZXR1cm4gb2xkT2JqLnRvU3RyaW5nKCkuZXF1YWxzKG5ld09iai50b1N0cmluZygpKTsKLQotCQlMaXN0IGZlYXR1cmVzID0gZ2V0U3RydWN0dXJhbEZlYXR1cmVzKG9sZE9iaik7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gb2xkT2JqLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMKLQkJCQkJCS5nZXQoaSk7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gb2xkT2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gbmV3T2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKG9sZFZhbHVlID09IG51bGwgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAob2xkVmFsdWUgPT0gbnVsbCB8fCBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlpZiAob2xkVmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0KLQkJCQkJLy8gaWYgaXQnYyBjb250YWlubWVudCBmZWF0dXJlIHZhbHVlLCBpdGVyYXRlIGl0Ci0JCQkJCU1ldGhvZEVsZW1lbnQgb2xkZSA9IChNZXRob2RFbGVtZW50KSBvbGRWYWx1ZTsKLQkJCQkJaWYgKG9sZGUuZUNvbnRhaW5lcigpID09IG9sZE9iaikgewotCQkJCQkJaWYgKCFpc0lkZW50aWNhbChvbGRlLCAoTWV0aG9kRWxlbWVudCkgbmV3VmFsdWUpKSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKG9sZFZhbHVlICE9IG5ld1ZhbHVlKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKG9sZFZhbHVlIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQlMaXN0IG9sZGwgPSAoTGlzdCkgb2xkVmFsdWU7Ci0JCQkJCUxpc3QgbmV3bCA9IChMaXN0KSBuZXdWYWx1ZTsKLQkJCQkJaWYgKG9sZGwuc2l6ZSgpICE9IG5ld2wuc2l6ZSgpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQotCQkJCQlmb3IgKGludCB4ID0gMDsgeCA8IG9sZGwuc2l6ZSgpOyB4KyspIHsKLQkJCQkJCU9iamVjdCBvID0gb2xkbC5nZXQoeCk7Ci0JCQkJCQlPYmplY3QgbiA9IG5ld2wuZ2V0KHgpOwotCQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQkJLy8gaWYgaXQnYyBjb250YWlubWVudCBmZWF0dXJlIHZhbHVlLCBpdGVyYXRlIGl0Ci0JCQkJCQkJTWV0aG9kRWxlbWVudCBvbGRlID0gKE1ldGhvZEVsZW1lbnQpIG87Ci0JCQkJCQkJaWYgKG9sZGUuZUNvbnRhaW5lcigpID09IG9sZE9iaikgewotCQkJCQkJCQlpZiAoIWlzSWRlbnRpY2FsKG9sZGUsIChNZXRob2RFbGVtZW50KSBuKSkgewotCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIGlmIChvbGRWYWx1ZSAhPSBuZXdWYWx1ZSkgewotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpZiAoIW8uZXF1YWxzKG4pKSB7Ci0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoIW9sZFZhbHVlLmVxdWFscyhuZXdWYWx1ZSkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBhIHByb2Nlc3Mgb3Igbm90LiAKLQkgKiBBIFByb2Nlc3MgaXMgYSBDYXBhYmlsaXR5UGF0dGVybiBvciBEZWxpdmVyeVByb2Nlc3Mgb2JqZWN0IAotCSAqIHRoYXQgaXMgY29udGFpbmVkIGJ5IGEgUHJvY2Vzc0NvbXBvbmVudC4KLQkgKiBAcGFyYW0gZSBFT2JqZWN0Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJvY2VzcyhFT2JqZWN0IGUpIHsKLQkJcmV0dXJuIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSAmJiAKLQkJCShlLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0VmFsaWRWaWV3cyhNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkKLQkJTGlzdCB2aWV3cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSB2aWV3ID0gKENvbnRlbnRDYXRlZ29yeSlpdC5uZXh0KCk7Ci0JCQlpZiAoICFDb25maWd1cmF0aW9uSGVscGVyLmlzQ29udHJpYnV0b3IodmlldykgKSB7Ci0JCQkJdmlldyA9IChDb250ZW50Q2F0ZWdvcnkpQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCh2aWV3LCBjb25maWcpOwotCQkJCWlmICggdmlldyAhPSBudWxsICYmICF2aWV3cy5jb250YWlucyh2aWV3KSApIHsKLQkJCQkJdmlld3MuYWRkKHZpZXcpOwotCQkJCX0gCi0JCQl9CQotCQl9Ci0JCQkJCi0JCXJldHVybiB2aWV3czsKLQl9Ci0JCi0vLwlwdWJsaWMgc3RhdGljIExpc3QgZ2V0U3VwZXJBY3Rpdml0aWVzKEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCkgewotLy8JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwotLy8JCS8vIGJ1aWxkIHRoZSBwYXJlbnQgbm9kZXMKLS8vCQlCcmVha2Rvd25FbGVtZW50IHBhcmVudCA9IGVsZW1lbnQuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7IAotLy8JCXdoaWxlICggcGFyZW50ICE9IG51bGwgKSB7Ci0vLwkJCWl0ZW1zLmFkZCgwLCBwYXJlbnQpOwotLy8JCQlpZiAoTGlicmFyeVV0aWwuaXNQcm9jZXNzKHBhcmVudCkgKSB7Ci0vLwkJCQlicmVhazsKLS8vCQkJfQotLy8JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0vLwkJfQotLy8KLS8vCQlyZXR1cm4gaXRlbXM7Ci0vLwl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbGwgc3RydWN0dXJhbCBmZWF0dXJlcyBmb3IgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFN0cnVjdHVyYWxGZWF0dXJlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJTGlzdCBwcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQotCQlpZiAocHJvcGVydGllcyAhPSBudWxsKSB7Ci0JCQlMaXN0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4oKTsKLQkJCS8vIGdldCBhbGwgZmVhdHVyZXMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5zaXplKCk7IGkrKykgewotCQkJCUVQcm9wZXJ0eSBwcm9wZXJ0eSA9IChFUHJvcGVydHkpIHByb3BlcnRpZXMuZ2V0KGkpOwotCQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gcHJvcGVydHkKLQkJCQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7Ci0JCQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmVhdHVyZXM7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0xvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNmY2OTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMb2cgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnZXIgSU5TVEFOQ0UgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldExvZ2dlcigpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9NaWdyYXRpb25VdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9NaWdyYXRpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZjA5MzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTWlncmF0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBIZWxwZXIgdXRpbGl0aWVzIGZvciB0aGUgTWlncmF0aW9uIFNlcnZpY2UuCi0gKgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWlncmF0aW9uVXRpbCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIGFsbCB0aGUgPGNvZGU+Q2FwYWJpbGl0eVBhdHRlcm48L2NvZGU+IGFuZCA8Y29kZT5EZWxpdmVyeVByb2Nlc3M8L2NvZGU+Ci0JICogaW4gdGhlIGN1cnJlbnQgTWV0aG9kIExpYnJhcnkuCi0JICoKLQkgKiBUT0RPOiBNb3ZlIHRoaXMgbWV0aG9kIHRvIHRoZSBjb20uaWJtLnJtbS5saWJyYXJ5LnNlcnZpY2VzLkxpYnJhcnlVdGlsIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldFByb2Nlc3NlcygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXAgcmVzdWx0ID0gbmV3IFRyZWVNYXAoKTsKLQkJTGlzdCBtZXRob2RQbHVnaW5zID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2lucyhsaWJyYXJ5KTsKLQkJZm9yIChJdGVyYXRvciBpID0gbWV0aG9kUGx1Z2lucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luID0gKE1ldGhvZFBsdWdpbilpLm5leHQoKTsKLQkJCVN0cmluZyBjYXBhYmlsaXR5UGF0dGVyblBhdGhzW10gPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aDsKLQkJCU1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSAgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwgY2FwYWJpbGl0eVBhdHRlcm5QYXRocyk7Ci0JCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQlnZXRDYXBhYmlsaXR5UGF0dGVybnMoKFByb2Nlc3NQYWNrYWdlKW1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nIGRlbGl2ZXJ5UHJvY2Vzc1BhdGhzW10gPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGg7Ci0JCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sIGRlbGl2ZXJ5UHJvY2Vzc1BhdGhzKTsKLQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc2VzKChQcm9jZXNzUGFja2FnZSltZXRob2RQYWNrYWdlLCByZXN1bHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgb2YgYWxsIDxjb2RlPkNhcGFiaWxpdHlQYXR0ZXJuPC9jb2RlPiBpbiB0aGUgY3VycmVudCBNZXRob2QgTGlicmFyeS4KLQkgKgotCSAqIFRPRE86IE1vdmUgdGhpcyBtZXRob2QgdG8gdGhlIGNvbS5pYm0ucm1tLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeVV0aWwgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGlicmFyeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU1hcCByZXN1bHQgPSBuZXcgVHJlZU1hcCgpOwotCQlMaXN0IG1ldGhvZFBsdWdpbnMgPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW5zKGxpYnJhcnkpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBtZXRob2RQbHVnaW5zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCU1ldGhvZFBsdWdpbiBtZXRob2RQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKWkubmV4dCgpOwotCQkJU3RyaW5nIGNhcGFiaWxpdHlQYXR0ZXJuUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoOwotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlICA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLCBjYXBhYmlsaXR5UGF0dGVyblBhdGhzKTsKLQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXRDYXBhYmlsaXR5UGF0dGVybnMoKFByb2Nlc3NQYWNrYWdlKW1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIGFsbCB0aGUgPGNvZGU+RGVsaXZlcnlQcm9jZXNzPC9jb2RlPiBpbiB0aGUgY3VycmVudCBNZXRob2QgTGlicmFyeS4KLQkgKgotCSAqIFRPRE86IE1vdmUgdGhpcyBtZXRob2QgdG8gdGhlIGNvbS5pYm0ucm1tLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeVV0aWwgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWFwIHJlc3VsdCA9IG5ldyBUcmVlTWFwKCk7Ci0JCUxpc3QgbWV0aG9kUGx1Z2lucyA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbnMobGlicmFyeSk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG1ldGhvZFBsdWdpbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kUGx1Z2luIG1ldGhvZFBsdWdpbiA9IChNZXRob2RQbHVnaW4paS5uZXh0KCk7Ci0JCQlTdHJpbmcgZGVsaXZlcnlQcm9jZXNzUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aDsKLQkJCU1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLCBkZWxpdmVyeVByb2Nlc3NQYXRocyk7Ci0JCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKFByb2Nlc3NQYWNrYWdlKW1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIGFsbCB0aGUgY29udGV4dHMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzcy4KLQkgKgotCSAqIFRPRE86IE1vdmUgdGhpcyBtZXRob2QgdG8gdGhlIGNvbS5pYm0ucm1tLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeVV0aWwgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0Q29udGV4dHMoUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCWlmIChwcm9jZXNzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXAgcmVzdWx0ID0gbmV3IFRyZWVNYXAoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29udGV4dCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJaWYgKGRlZmF1bHRDb250ZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdC5wdXQoZGVmYXVsdENvbnRleHQuZ2V0TmFtZSgpLCBkZWZhdWx0Q29udGV4dCk7Ci0JCX0KLQotCQlMaXN0IGNvbnRleHRzID0gcHJvY2Vzcy5nZXRWYWxpZENvbnRleHQoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gY29udGV4dHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb250ZXh0ID0gKE1ldGhvZENvbmZpZ3VyYXRpb24paS5uZXh0KCk7Ci0JCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0LnB1dChjb250ZXh0LmdldE5hbWUoKSwgY29udGV4dCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEFkZCBhIG1hcCBvZiBhbGwgPGNvZGU+Q2FwYWJpbGl0eVBhdHRlcm48L2NvZGU+IGluIGEgZ2l2ZW4gPGNvZGU+UHJvY2Vzc1BhY2thZ2U8L2NvZGU+LgotCSAqCi0JICogVE9ETzogTW92ZSB0aGlzIG1ldGhvZCB0byB0aGUgY29tLmlibS5ybW0ubGlicmFyeS5zZXJ2aWNlcy5MaWJyYXJ5VXRpbCBjbGFzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKFByb2Nlc3NQYWNrYWdlIHByb2Nlc3NQYWNrYWdlLCBNYXAgcmVzdWx0KSB7Ci0JCUxpc3QgY2hpbGRQYWNrYWdlcyA9IHByb2Nlc3NQYWNrYWdlLmdldENoaWxkUGFja2FnZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gY2hpbGRQYWNrYWdlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KW9iajsKLQkJCQlQcm9jZXNzIHByb2Nlc3MgID0gcHJvY2Vzc0NvbXBvbmVudC5nZXRQcm9jZXNzKCk7Ci0JCQkJaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQlTdHJpbmcgbmFtZSA9IHByb2Nlc3MuZ2V0TmFtZSgpOwotCQkJCQlyZXN1bHQucHV0KG5hbWUsIHByb2Nlc3MpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKChQcm9jZXNzUGFja2FnZSlvYmosIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBtYXAgb2YgYWxsIDxjb2RlPkRlbGl2ZXJ5UHJvY2VzczwvY29kZT4gaW4gYSBnaXZlbiA8Y29kZT5Qcm9jZXNzUGFja2FnZTwvY29kZT4uCi0JICoKLQkgKiBUT0RPOiBNb3ZlIHRoaXMgbWV0aG9kIHRvIHRoZSBjb20uaWJtLnJtbS5saWJyYXJ5LnNlcnZpY2VzLkxpYnJhcnlVdGlsIGNsYXNzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBnZXREZWxpdmVyeVByb2Nlc3NlcyhQcm9jZXNzUGFja2FnZSBwcm9jZXNzUGFja2FnZSwgTWFwIHJlc3VsdCkgewotCQlMaXN0IGNoaWxkUGFja2FnZXMgPSBwcm9jZXNzUGFja2FnZS5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGNoaWxkUGFja2FnZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlQcm9jZXNzQ29tcG9uZW50IHByb2Nlc3NDb21wb25lbnQgPSAoUHJvY2Vzc0NvbXBvbmVudClvYmo7Ci0JCQkJUHJvY2VzcyBwcm9jZXNzICA9IHByb2Nlc3NDb21wb25lbnQuZ2V0UHJvY2VzcygpOwotCQkJCWlmIChwcm9jZXNzIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gcHJvY2Vzcy5nZXROYW1lKCk7Ci0JCQkJCXJlc3VsdC5wdXQobmFtZSwgcHJvY2Vzcyk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NlcygoUHJvY2Vzc1BhY2thZ2Upb2JqLCByZXN1bHQpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTWFwIGdldEFjdGl2aXRpZXMoUHJvY2VzcyBwcm9jZXNzKXsKLQkJcmV0dXJuIGdldEFjdGl2aXRpZXMocHJvY2VzcywgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRBY3Rpdml0aWVzKFByb2Nlc3MgcHJvY2VzcywgYm9vbGVhbiBsaW5rZWRIYXNoTWFwKXsKLQkJTWFwIHJlc3VsdCA9IGxpbmtlZEhhc2hNYXAgPyBuZXcgTGlua2VkSGFzaE1hcCgpIDogbmV3IFRyZWVNYXAoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29udGV4dCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJUHJvY2Vzc0NvbmZpZ3VyYXRvciBmaWx0ZXIgPSBuZXcgUHJvY2Vzc0NvbmZpZ3VyYXRvcihkZWZhdWx0Q29udGV4dCk7Ci0JCWdldEFjdGl2aXRpZXMocHJvY2VzcywgcmVzdWx0LCBmaWx0ZXIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2QgcmV0dXJucyBMaXN0IG9mIGFjdGl2aXRpZXMgKHJlY3Vyc2l2ZWx5KSBmb3IgcGFydGljdWxhciBjb25maWd1cmF0aW9uIAotCSAqIHVuZGVyIGEgUHJvY2VzcyAoPGNvZGU+RGVsaXZlcnlQcm9jZXNzPC9jb2RlPiBvciA8Y29kZT5DYXBhYmlsaXR5UGF0dGVybjwvY29kZT4pLiAgCi0JICogIEBwYXJhbSBBY3Rpdml0eQotCSAqICBAcGFyYW0gTWFwCi0JICogIEBwYXJhbSBQcm9jZXNzQ29uZmlndXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGdldEFjdGl2aXRpZXMoQWN0aXZpdHkgcHJvY2VzcywgTWFwIHJlc3VsdCwgUHJvY2Vzc0NvbmZpZ3VyYXRvciBmaWx0ZXIpewotCQlyZXN1bHQucHV0KHByb2Nlc3MuZ2V0TmFtZSgpLCBwcm9jZXNzKTsKLQkJTGlzdCBsaXN0ID0gcHJvY2Vzcy5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQlpZihsaXN0LnNpemUoKSA+IDApewotCQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJaWYoZmlsdGVyICE9IG51bGwgJiYgZmlsdGVyLmFjY2VwdChvYmplY3QpKXsKLQkJCQkJCXJlc3VsdC5wdXQoKChBY3Rpdml0eSlvYmplY3QpLmdldE5hbWUoKSwgb2JqZWN0KTsKLQkJCQkJfQotCQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJCQlnZXRBY3Rpdml0aWVzKChBY3Rpdml0eSlvYmplY3QsIHJlc3VsdCwgZmlsdGVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTW9kZWxTdG9yYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9Nb2RlbFN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhZjg3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9Nb2RlbFN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1vZGVsU3RvcmFnZSB7Ci0JCi0JLyoqCi0JICogcmV0dXJuIHRoZSBNZXRob2RQbHVnaW5zIGluIHRoZSBjdXJyZW50IE1ldGhvZExpYnJhcnkKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8TWV0aG9kUGx1Z2luPiBnZXRCYXNlTW9kZWxzKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYiAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPihsaWIuZ2V0TWV0aG9kUGx1Z2lucygpKTsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBhIG5ldyBNZXRob2RMaWJyYXJ5IGFuZCByZXR1cm4gdGhlIGFzc29jaWF0ZWQgUmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VTZXQgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsCi0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICogQHBhcmFtIGRpciBTdHJpbmcKLQkgKiBAcGFyYW0gYk11bHRpcGxlIGJvb2xlYW4KLQkgKiBAcmV0dXJuIFJlc291cmNlCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIG5ld0xpYnJhcnkoSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCwKLQkJCVN0cmluZyBuYW1lLCBTdHJpbmcgZGlyLCBib29sZWFuIGJNdWx0aXBsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBsaWJfZmlsZW5hbWUgPSBudWxsOwotCQkvLyBNYXAgb3B0aW9ucyA9IG5ldwotCQkvLyBIYXNoTWFwKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5ERUZBVUxUX1NBVkVfT1BUSU9OUyk7Ci0JCWlmIChiTXVsdGlwbGUpIHsKLQkJCWxpYl9maWxlbmFtZSA9IE11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfTElCUkFSWV9NT0RFTF9GSUxFTkFNRTsKLQkJCS8vIG9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLk1VTFRJX0ZJTEUsIEJvb2xlYW4uVFJVRSk7Ci0JCX0gZWxzZSB7Ci0JCQlsaWJfZmlsZW5hbWUgPSBuYW1lOwotCQl9Ci0JCXJlc291cmNlU2V0LnVubG9hZCgpOwotCQlSZXNvdXJjZSByZXMgPSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlRmlsZVVSSShkaXIKLQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgbGliX2ZpbGVuYW1lKSk7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kTGlicmFyeSgpOwotCQlsaWIuc2V0TmFtZShuYW1lKTsKLQkJcmVzLmdldENvbnRlbnRzKCkuYWRkKGxpYik7Ci0JCXJlc291cmNlU2V0LnNhdmUobnVsbCk7Ci0JCXJldHVybiByZXM7Ci0JfQotCQotCS8qKgotCSAqIGluaXRpYWxpemUgYSBuZXcgbWV0aG9kIHBsdWdpbgotCSAqIEBwYXJhbSBlbXB0eU1vZGVsIE1ldGhvZFBsdWdpbgotCSAqIEByZXR1cm4gTWV0aG9kUGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RQbHVnaW4gaW5pdGlhbGl6ZShNZXRob2RQbHVnaW4gZW1wdHlNb2RlbCkgewotCQllbXB0eU1vZGVsLnNldFVzZXJDaGFuZ2VhYmxlKEJvb2xlYW4uVFJVRSk7Ci0KLQkJY3JlYXRlQ29udGVudFBhY2thZ2VzKGVtcHR5TW9kZWwsIE1vZGVsU3RydWN0dXJlLkRFRkFVTFRfRE9NQUlOX1BBVEgpOwotCQljcmVhdGVDb250ZW50UGFja2FnZXMoZW1wdHlNb2RlbCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0JCWNyZWF0ZUNvbnRlbnRQYWNrYWdlcyhlbXB0eU1vZGVsLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKTsKLQkJY3JlYXRlQ29udGVudFBhY2thZ2VzKGVtcHR5TW9kZWwsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCQljcmVhdGVDb250ZW50UGFja2FnZXMoZW1wdHlNb2RlbCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgpOwotCQljcmVhdGVDb250ZW50UGFja2FnZXMoZW1wdHlNb2RlbCwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCk7Ci0JCWNyZWF0ZUNvbnRlbnRQYWNrYWdlcyhlbXB0eU1vZGVsLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuc3RhbmRhcmRDYXRlZ29yeVBhdGgpOwotCi0JCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cgPSBjcmVhdGVDb250ZW50UGFja2FnZXMoZW1wdHlNb2RlbCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JCVRuZ1V0aWwuY3JlYXRlUm9vdEN1c3RvbUNhdGVnb3J5KGNvbnRlbnRQa2cpOwotCi0JCS8vIGNyZWF0ZSBEZWxpdmVyeVByb2Nlc3NlcyBwcm9jZXNzIHBhY2thZ2UKLQkJLy8KLQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJcGtnLnNldE5hbWUoTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoWzBdKTsKLQkJZW1wdHlNb2RlbC5nZXRNZXRob2RQYWNrYWdlcygpLmFkZChwa2cpOwotCi0JCS8vIGNyZWF0ZSBQcm9jZXNzQ29udHJpYnV0aW9ucyBwcm9jZXNzIHBhY2thZ2UKLQkJLy8KLQkJTW9kZWxTdHJ1Y3R1cmUuY3JlYXRlUHJvY2Vzc0NvbnRyaWJ1dGlvblBhY2thZ2UoZW1wdHlNb2RlbCk7Ci0KLQkJLy8gY3JlYXRlIENhcGFiaWxpdHlQYXR0ZXJucyBwcm9jZXNzIHBhY2thZ2UKLQkJLy8KLQkJcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJaW50IGxlbiA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoLmxlbmd0aCAtIDE7Ci0JCXBrZy5zZXROYW1lKE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoW2xlbl0pOwotCQlTdHJpbmdbXSBwYXRoID0gbmV3IFN0cmluZ1tsZW5dOwotCQlTeXN0ZW0uYXJyYXljb3B5KE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoLCAwLCBwYXRoLAotCQkJCTAsIGxlbik7Ci0JCUNvbnRlbnRQYWNrYWdlIGNvbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShlbXB0eU1vZGVsLCBwYXRoKTsKLQkJY29udFBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKHBrZyk7Ci0KLQkJLy8gLy8gY3JlYXRlIGluaGVyaXRlZCBkb21haW5zCi0JCS8vIC8vCi0JCS8vIExpc3QgYWxsQmFzZSA9IE1pc2MuZ2V0QWxsQmFzZShlbXB0eU1vZGVsKTsKLQkJLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJNb2RlbFN0b3JhZ2UuaW5pdGlhbGl6ZSgpOiBhbGxCYXNlPSIrYWxsQmFzZSk7Ci0JCS8vIGZvcihJdGVyYXRvciBpdGVyID0gYWxsQmFzZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJLy8gQ29udGVudFBhY2thZ2UgYmFzZURvbWFpblBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKGJhc2VQbHVnaW4sCi0JCS8vIE1vZGVsU3RydWN0dXJlLkRFRkFVTFRfRE9NQUlOX1BBVEgpOwotCQkvLyBJbmhlcml0ZWRDYXRlZ29yeVBhY2thZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldwotCQkvLyBJbmhlcml0ZWREb21haW5QYWNrYWdlTGlzdGVuZXIoZG9tYWluUGtnKTsKLQkJLy8gYmFzZURvbWFpblBrZy5lQWRhcHRlcnMoKS5hZGQobGlzdGVuZXIpOwotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0KLQkJLy8gYmFzZURvbWFpblBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCS8vIE9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCS8vIENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSA9IChDb250ZW50Q2F0ZWdvcnkpIGVsZW1lbnQ7Ci0JCS8vIGlmKGNhdGVnb3J5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBudWxsKSB7Ci0JCS8vIC8vIHRoaXMgY2F0ZWdvcnkgaXMgbm90IGEgaW5oZXJpdGVkIG9uZSwgY2FuIGJlIGFkZGVkLgotCQkvLyAvLwotCQkvLyBkb21haW5Qa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGxpc3RlbmVyLmNyZWF0ZUluaGVyaXRlZCgoQ29udGVudENhdGVnb3J5KQotCQkvLyBlbGVtZW50KSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQotCQkvLyBUT0RPOiB0ZXN0IG9uLWZseSBjcmVhdGlvbiBvZiBjYXRlZ29yeSBjb250cmlidXRvcgotCQkvLyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcikKLQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoZW1wdHlNb2RlbCwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gaXRlbVByb3ZpZGVyLmFkZEluaGVyaXRlZENhdGVnb3JpZXMoKTsKLQotCQlyZXR1cm4gZW1wdHlNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBlbXB0eU1vZGVsCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQ29udGVudFBhY2thZ2UgY3JlYXRlQ29udGVudFBhY2thZ2VzKE1ldGhvZFBsdWdpbiBtb2RlbCwKLQkJCVN0cmluZ1tdIHBhdGgpIHsKLQkJTGlzdCBsaXN0ID0gbW9kZWwuZ2V0TWV0aG9kUGFja2FnZXMoKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UobGlzdCwgcGF0aFswXSk7Ci0JCWlmIChwa2cgPT0gbnVsbCkgewotCQkJcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudFBhY2thZ2UoKTsKLQkJCXBrZy5zZXROYW1lKHBhdGhbMF0pOwotCQkJbGlzdC5hZGQocGtnKTsKLQkJfQotCQlmb3IgKGludCBpID0gMTsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKLQkJCWxpc3QgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQkJcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UobGlzdCwgcGF0aFtpXSk7Ci0JCQlpZiAocGtnID09IG51bGwpIHsKLQkJCQlwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50UGFja2FnZSgpOwotCQkJCXBrZy5zZXROYW1lKHBhdGhbaV0pOwotCQkJCWxpc3QuYWRkKHBrZyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBrZzsKLQl9Ci0KLQkvKioKLQkgKiBsb2FkIHRoZSBjb250YWlubWVudCBwcm94aWVzIGZvciB0aGUgb2JqZWN0Ci0JICogQHBhcmFtIG9iaiBFT2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvYWRDb250YWlubWVudFByb3hpZXMoRU9iamVjdCBvYmopIHsKLQkJLy8gZm9yKFRyZWVJdGVyYXRvciBpdGVyID0gb2JqLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJTGlzdCBsaXN0ID0gb2JqLmVDb250ZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUludGVybmFsRU9iamVjdCBvID0gKEludGVybmFsRU9iamVjdCkgbGlzdC5nZXQoaSk7Ci0JCQkvLyBJbnRlcm5hbEVPYmplY3QgbyA9IChJbnRlcm5hbEVPYmplY3QpaXRlci5uZXh0KCk7Ci0JCQlpZiAoby5lUHJveHlVUkkoKSAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJwcm94eSBVUkkgPSAiICsgby5lUHJveHlVUkkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG8uZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQlSZXNvdXJjZSByZXMgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShvLmVQcm94eVVSSSgpLCB0cnVlKTsKLQkJCQlJbnRlcm5hbEVPYmplY3QgcmVzb2x2ZWRPYmogPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCXJlc29sdmVkT2JqID0gKEludGVybmFsRU9iamVjdCkgcmVzLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVzb2x2ZWRPYmogPSAiICsgcmVzb2x2ZWRPYmopOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHJlc29sdmVkT2JqICE9IG51bGwpIHsKLQkJCQkJRWNvcmVVdGlsLnJlcGxhY2UobywgcmVzb2x2ZWRPYmopOwotCQkJCQkoKEJhc2ljRUxpc3QpIHJlcy5nZXRDb250ZW50cygpKS5zZXREYXRhKDEsCi0JCQkJCQkJbmV3IE9iamVjdFtdIHsgcmVzb2x2ZWRPYmogfSk7ICAgICAgICAgCi0JCQkJCW8gPSByZXNvbHZlZE9iajsKLQkJCQl9Ci0JCQl9Ci0JCQlsb2FkQ29udGFpbm1lbnRQcm94aWVzKG8pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbG9hZCBhbGwgcHJveGllcyBmb3IgdGhlIG9iamVjdAotCSAqIEBwYXJhbSBvYmogRU9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkQWxsUHJveGllcyhFT2JqZWN0IG9iaikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmouZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJfQotCQl9Ci0KLQkJLy8gbG9hZENvbnRhaW5tZW50UHJveGllcyhvYmopOwotCQkvLyBsb2FkQ3Jvc3NSZWZlcmVuY2VQcm94aWVzKG9iaik7Ci0JfQotCi0JLyoqCi0JICogbG9hZCBhbGwgY3Jvc3MgcmVmZXJlbmNlIHByb3hpZXMgZm9yIHRoZSBvYmplY3QKLQkgKiBAcGFyYW0gb2JqIEVPYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9hZENyb3NzUmVmZXJlbmNlUHJveGllcyhFT2JqZWN0IG9iaikgewotCQlMaXN0IGxpc3QgPSBvYmouZUNyb3NzUmVmZXJlbmNlcygpOwotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGxpc3QuZ2V0KGkpOwotCQkJbG9hZENyb3NzUmVmZXJlbmNlUHJveGllcyhvKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGZpbmQgYSBNZXRob2RFbGVtZW50IHdpdGggdGhlIGdpdmVuIGVsZW1lbnQgbmFtZSBpbiB0aGUgZWxlbWVudCBsaXN0Ci0JICogQHBhcmFtIG1ldGhvZEVsZW1lbnRzIFRoZSBlbGVtZW50IGxpc3QKLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKLQkgKiBAcmV0dXJuIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZmluZE1ldGhvZEVsZW1lbnQoTGlzdCBtZXRob2RFbGVtZW50cywKLQkJCVN0cmluZyBuYW1lKSB7Ci0JCWludCBzaXplID0gbWV0aG9kRWxlbWVudHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIG1ldGhvZEVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChuYW1lLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IG9mIGluZGV4IGludCBoZSBsaXN0IGxvY2F0aW9uIGZvciB0aGUgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIEBwYXJhbSBtZXRob2RFbGVtZW50cyBMaXN0Ci0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mKExpc3QgbWV0aG9kRWxlbWVudHMsIFN0cmluZyBuYW1lKSB7Ci0JCWludCBzaXplID0gbWV0aG9kRWxlbWVudHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIG1ldGhvZEVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChuYW1lLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvUGx1Z2luUmVmZXJlbmNlQ2hlY2tlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvUGx1Z2luUmVmZXJlbmNlQ2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTA3NWVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1BsdWdpblJlZmVyZW5jZUNoZWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiB1dGlsaXR5IGNsYXNzIHRvIGNoZWNrIHBsdWdpbiByZWZlcmVuY2VzCi0gKiBAYXV0aG9yID8/PwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luUmVmZXJlbmNlQ2hlY2tlciB7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgTGlzdCBjaGVja0NpcmN1bGFyRGVwZW5kZW50UGx1Z2luc0luTGlicmFyeSgpIHsKLS8vCQlMaXN0IGNkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCi0vLwkJTGlzdCBhbGxQbHVnaW5MaXN0ID0gTW9kZWxTdG9yYWdlLmdldEJhc2VNb2RlbHMoKTsKLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbGxQbHVnaW5MaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQlNZXRob2RQbHVnaW4gZWxlbWVudCA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotLy8JCQlpZiAoaGFzQ2lyY3VsYXJDb25mbGljdFdpdGhQbHVnaW4oZWxlbWVudCkpCi0vLwkJCQljZExpc3QuYWRkKGVsZW1lbnQpOwotLy8JCX0KLS8vCQlyZXR1cm4gY2RMaXN0OwotLy8JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFQbHVnaW4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQ2lyY3VsYXJDb25mbGljdFdpdGhQbHVnaW4oTWV0aG9kUGx1Z2luIGFQbHVnaW4pIHsJCQotLy8JCWJvb2xlYW4gYW5zd2VyID0gZmFsc2U7Ci0vLwotLy8JCUxpc3QgYWxsb3dhYmxlQmFzZUxpc3QgPSBnZXRBcHBsaWNhYmxlQmFzZVBsdWdpbnMoYVBsdWdpbik7Ci0vLwkJTGlzdCBleHRlbmRlZEJhc2VMaXN0ID0gYVBsdWdpbi5nZXRCYXNlcygpOwotLy8KLS8vCQlpZiAoIWFsbG93YWJsZUJhc2VMaXN0LmNvbnRhaW5zQWxsKGV4dGVuZGVkQmFzZUxpc3QpKSB7Ci0vLwkJCVN5c3RlbS5vdXQKLS8vCQkJCQkucHJpbnRsbigiJCQkOiBjaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkIGZvciAiICsgYVBsdWdpbi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0vLwkJCXByaW50UGx1Z2luTGlzdCgiYWxsb3dhYmxlIHBsdWdpbiBsaXN0IiwgYWxsb3dhYmxlQmFzZUxpc3QpOyAvLyROT04tTkxTLTEkCi0vLwkJCXByaW50UGx1Z2luTGlzdCgiY3VycmVudCBiYXNlIGxpc3QiLCBleHRlbmRlZEJhc2VMaXN0KTsgLy8kTk9OLU5MUy0xJAotLy8JCQlhbnN3ZXIgPSB0cnVlOwotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIGFuc3dlcjsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFQbHVnaW4uZ2V0QmFzZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBiYXNlID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZighRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koYVBsdWdpbiwgVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOX19CQVNFUywgYmFzZSkuaXNPSygpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBhUGx1Z2luCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PE1ldGhvZFBsdWdpbj4gZ2V0QXBwbGljYWJsZUJhc2VQbHVnaW5zKE1ldGhvZFBsdWdpbiBhUGx1Z2luKSB7Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBtb2RlbHMgPSBNb2RlbFN0b3JhZ2UuZ2V0QmFzZU1vZGVscygpOwotCi0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBkZXNjZW5kYW50TGlzdCA9IGdldERlc2NlbmRhbnRzKGFQbHVnaW4pOwotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZFBsdWdpbj4gaXRlciA9IGRlc2NlbmRhbnRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIGVsZW1lbnQgPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCWlmIChhUGx1Z2luLmdldEJhc2VzKCkuY29udGFpbnMoZWxlbWVudCkpIHsJCS8vcGFydCBvZiAxNzAzNjc6IGFsbG93IGl0IHRvIHNob3cgZm9yIHVuc2VsZWN0Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQltb2RlbHMucmVtb3ZlKGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIG1vZGVsczsKLQl9Ci0KLQkvLyB0aG9zZSB0d28gZ2V0RGVzY2VuZGFudHMoKSBtZXRob2RzIHNob3VsZCBiZSBtb3ZlZCBpbnRvIGxvd2VyIGxheWVyCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxNZXRob2RQbHVnaW4+IGdldERlc2NlbmRhbnRzKE1ldGhvZFBsdWdpbiBtZXRob2RPYmplY3QpIHsKLQkJTGlzdDxNZXRob2RQbHVnaW4+IGRlc2NlbmRhbnRMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0KLQkJTGlzdDxNZXRob2RQbHVnaW4+IG9iakxpc3QgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4oKTsKLQkJb2JqTGlzdC5hZGQobWV0aG9kT2JqZWN0KTsKLQotCQlnZXREZXNjZW5kYW50cyhkZXNjZW5kYW50TGlzdCwgb2JqTGlzdCk7Ci0KLQkJcmV0dXJuIGRlc2NlbmRhbnRMaXN0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3Q8TWV0aG9kUGx1Z2luPiBnZXREZXNjZW5kYW50cyhMaXN0PE1ldGhvZFBsdWdpbj4gYWxsRGVzY2VuZGFudExpc3QsCi0JCQlMaXN0PE1ldGhvZFBsdWdpbj4gbWV0aG9kT2JqZWN0TGlzdCkgewotCQlpZiAobWV0aG9kT2JqZWN0TGlzdC5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gYWxsRGVzY2VuZGFudExpc3Q7Ci0KLQkJTGlzdDxNZXRob2RQbHVnaW4+IGNvbWJEZXNjZW5kYW50TGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPigpOwotCi0JCWZvciAoSXRlcmF0b3I8TWV0aG9kUGx1Z2luPiBpdGVyID0gbWV0aG9kT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBlbGVtZW50ID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlMaXN0PE1ldGhvZFBsdWdpbj4gZGVzY2VuZGFudExpc3QgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkuZ2V0UGx1Z2luRGlyZWN0RXh0ZW5zaW9ucyhlbGVtZW50KTsKLQkJCWNvbWJEZXNjZW5kYW50TGlzdC5hZGRBbGwoZGVzY2VuZGFudExpc3QpOwotCi0JCX0KLQotCQlhbGxEZXNjZW5kYW50TGlzdC5hZGRBbGwobWV0aG9kT2JqZWN0TGlzdCk7Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBuZXh0Q2hlY2tMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0JCWZvciAoSXRlcmF0b3I8TWV0aG9kUGx1Z2luPiBpdGVyID0gY29tYkRlc2NlbmRhbnRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghYWxsRGVzY2VuZGFudExpc3QuY29udGFpbnMoZWxlbWVudCkpCi0JCQkJbmV4dENoZWNrTGlzdC5hZGQoZWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0RGVzY2VuZGFudHMoYWxsRGVzY2VuZGFudExpc3QsIG5leHRDaGVja0xpc3QpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBkZXNjCi0JICogQHBhcmFtIHBsdWdpbkxpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRQbHVnaW5MaXN0KFN0cmluZyBkZXNjLCBMaXN0IHBsdWdpbkxpc3QpIHsKLQkJU3lzdGVtLm91dC5wcmludCgiJCQkICIgKyBkZXNjICsgIjogWyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBsdWdpbkxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnQocGx1Z2luLmdldE5hbWUoKSArICIsICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJdIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1Jlc291cmNlSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9SZXNvdXJjZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzRhZTIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1Jlc291cmNlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnhtbC5YU0xUUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5EZWZhdWx0Q29udGVudFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUNvbnRlbnRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxheW91dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGlua0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkFjdGl2aXR5TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NZXRob2RMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUhlbHBlciB7Ci0KLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUkFDRV9SRVBMQUNFTUVOVCA9ICJfQlJfIjsgLy8kTk9OLU5MUy0xJAotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5CUkFDRV9TVFJJTkcgPSAiXFx7IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0JPT0tNQVJLX0lORElDQVRPUiA9ICIjIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1BBUkFNRVRFUl9JTkRJQ0FUT1IgPSAiPyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9QQVJBTUVURVJfUFJPQ0VTUyA9ICJwcm9jIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1NUUl9KQVZBU0NSSVBUID0gImphdmFzY3JpcHQ6IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1NUUl9NQUlMVE8gPSAibWFpbHRvOiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9QQVJBTUVURVJfUEFUSCA9ICJwYXRoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUVFJfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUVFJfS0VZID0gImtleSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BVFRSX1RFWFQgPSAidGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BVFRSX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUVFJfR1VJRCA9ICJndWlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUVFJfSFJFRiA9ICJocmVmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUVFJfVkFMVUVfSU5ERVggPSAiaW5kZXgiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX0VYVF9IVE1MID0gIi5odG1sIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9FWFRfSFRNID0gIi5odG0iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX0VYVF9KUEVHID0gIi5qcGVnIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19QQUdFU19GT0xERVIgPSAicGFnZXNfbm90X2luc3RhbGxlZC8iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmsgPSAiZWxlbWVudExpbmsiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmtXaXRoVHlwZSA9ICJlbGVtZW50TGlua1dpdGhUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rV2l0aFVzZXJUZXh0ID0gImVsZW1lbnRMaW5rV2l0aFVzZXJUZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfRk9MREVSID0gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5SRVNPVVJDRV9GT0xERVI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9odG1sX2ZpbGVfbmFtZSA9IFBhdHRlcm4KLQkJCS5jb21waWxlKCIoLiopLCguKilcXC5odG1sIik7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHRoaXMgb25lIGRvZXMgbm90IHdvcmsgd2hlbiBjb250YWluaW5nIG5vbi1lbmdsaXNoIGNoYXJhY3RlcnMsIHVzZSB0aGUKLQkvLyBtb3JlIGdlbmVyYWwgb25lCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfbGlua19yZWYgPQotCS8vIFBhdHRlcm4uY29tcGlsZSgiPGFcXHMrPyhbXj5dKik+KC4qPyk8L2E+IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwKLQkvLyBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9saW5rX3JlZiA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiPGFcXHMrPyguKj8pPiguKj8pPC9hPiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfdGVtcGxhdGVfYXR0YWNobWVudF91cmwgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIjxhXFxzKz9ocmVmXFxzKj89XFxzKj9cIiguKj8pXCJcXHMqPz4oLio/KTwvYT4iLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfYXJlYV9yZWYgPSBQYXR0ZXJuCi0vLwkJCS5jb21waWxlKAotLy8JCQkJCSI8YXJlYS4qPyhocmVmXFxzKj1cXHMqXCIoLio/KVwiKSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2FyZWFfcmVmID0gUGF0dGVybgotCS5jb21waWxlKAotCQkJIjxhcmVhXFxzKz8oLio/KS8/PiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfbGlua19yZWZfZ2VuID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSI8KGF8YXJlYSlcXHMrPyhbXj5dKik+IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9saW5rX3R5cGVfcGlja2VyID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSIgY2xhc3NcXHMqPz1cXHMqPyguKj8pXFxzKyIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfbGlua19ndWlkX3BpY2tlciA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiIGd1aWRcXHMqPz1cXHMqPyguKj8pXFxzKyIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfbGlua19ocmVmX3BpY2tlciA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiIGhyZWZcXHMqPz1cXHMqP1wiKC4qPylcIlxccysiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX3RhZ19yZWYgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIjwoW14+IV0qKShcXG58XFxyKShbXj5dKik+IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9pbWFnZV9yZWYgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIig8KGltZ3xpZnJhbWUpLio/c3JjXFxzKj1cXHMqXCIpKC4qPykoXCIpIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF91cmxfZGVjb2RlciA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiKDxbXj5dKj8oc3JjfGhyZWYpXFxzKj1cXHMqXCIpKC4qPykoXCJbXj5dKj8+KSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfdGFnX2F0dHJpYnV0ZXMgPSBQYXR0ZXJuCi0JLmNvbXBpbGUoCi0JCQkiKFtcXFMmJltePV1dKylcXHMqPVxccyooW1xcUyYmW15cIl1dK3xcIihbXFxTICYmW15cIl1dKylcIikiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2Nzc19yZWYgPSBQYXR0ZXJuLmNvbXBpbGUoCi0JCQkiIHVybFxcKCguKj8pXFwpIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQkvLyBkZWZpbmUgY29uc3RhbnRzIGZvciBkaWFncmFtIHR5cGUuCi0JLy8gVGhpcyB3aWxsIGJlIHVzZWQgd2hlbiBsaW5raW5nIGRpYWdyYW1zIGludG8gcHVibGlzaGVkIGNvbnRlbnRzCi0JLy8gQWN0aXZpdHkgZGlhZ3JhbQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUdSQU1fVFlQRV9XT1JLRkxPVyA9ICJBY3Rpdml0eSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTCA9ICJBY3Rpdml0eURldGFpbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFdQRGVwZW5kZW5jeSBkaWFncmFtCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1kgPSAiV1BEZXBlbmRlbmN5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgZGVmYXVsdFJlc291cmNlTWdyOwotCQkKLQlwdWJsaWMgUmVzb3VyY2VIZWxwZXIoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXREZWZhdWx0UmVzb3VyY2VNZ3IoSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgbWdyKSB7Ci0JCWRlZmF1bHRSZXNvdXJjZU1nciA9IG1ncjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgZ2V0RGVmYXVsdFJlc291cmNlTWdyKCkgewotCQlyZXR1cm4gZGVmYXVsdFJlc291cmNlTWdyOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIGdldFJlc291cmNlTWdyKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeShlbGVtZW50KTsKLQkJaWYgKCBsaWIgIT0gbnVsbCApIHsKLQkJCUlMaWJyYXJ5TWFuYWdlciBsaWJNZ3IgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldExpYnJhcnlNYW5hZ2VyKGxpYik7Ci0JCQlpZiAobGliTWdyID09IG51bGwpIHsKLQkJCQlsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJbGliTWdyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRMaWJyYXJ5TWFuYWdlcihsaWIpOwotCQkJfQotCQkJaWYgKGxpYk1nciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRSZXNvdXJjZU1ncigpOwotCQkJfQotCQkJcmV0dXJuIGxpYk1nci5nZXRSZXNvdXJjZU1hbmFnZXIoKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSByZXNvdXJjZSBmb2xkZXIgb2YgdGhlIHBsdWdpbiBpbiB0aGUgbGlicmFyeSwKLQkgKiByZWxhdGl2ZSB0byB0aGUgbGlicmFyeSByb290Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpblJlc291cmNlUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0UmVzb3VyY2VNZ3IoZWxlbWVudCk7Ci0JCWlmICggcmVzTWdyICE9IG51bGwgKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JCQlpZiAocGx1Z2luID09IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzTWdyLmdldExvZ2ljYWxSZXNvdXJjZVBhdGgoZWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiByZXNNZ3IuZ2V0TG9naWNhbFJlc291cmNlUGF0aChwbHVnaW4pOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHJlc291cmNlIGZvbGRlciBvZiB0aGUgZWxlbWVudCBpbiB0aGUKLQkgKiBsaWJyYXJ5LCByZWxhdGl2ZSB0byB0aGUgbGlicmFyeSByb290Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudFJlc291cmNlUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0UmVzb3VyY2VNZ3IoZWxlbWVudCk7Ci0JCWlmICggcmVzTWdyICE9IG51bGwgKSB7Ci0JCQlyZXR1cm4gcmVzTWdyLmdldExvZ2ljYWxSZXNvdXJjZVBhdGgoZWxlbWVudCk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXNvdXJjZSBmb2xkZXIgb2YgdGhlIGVsZW1lbnQgaW4gdGhlIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIGFic29sdXRlIHBhdGggb2YgdGhlIGVsZW1lbnQncyByZXNvdXJjZSBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBYnNvbHV0ZUVsZW1lbnRSZXNvdXJjZVBhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJlc291cmNlTWdyKGVsZW1lbnQpOwotCQlpZiAoIHJlc01nciAhPSBudWxsICkgewotCQkJcmV0dXJuIHJlc01nci5nZXRQaHlzaWNhbFJlc291cmNlUGF0aChlbGVtZW50KTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBmb2xkZXIgb2YgdGhlIGVsZW1lbnQgaW4gdGhlIGxpYnJhcnksCi0JICogcmVsYXRpdmUgdG8gdGhlIGxpYnJhcnkgcm9vdAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnRQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotLy8JCXRyeSB7Ci0vLwkJCVN0cmluZyBwYXRoID0gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5nZXRSZWxhdGl2ZUVsZW1lbnRQYXRoKGVsZW1lbnQpOwotLy8JCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGguZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotLy8JCQl7Ci0vLwkJCQlTeXN0ZW0ub3V0Ci0vLwkJCQkJCS5wcmludGxuKCJXYXJuaW5nISBObyBQYXRoIGZvciBFbGVtZW50IFsiICsgZWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjogIiArIGVsZW1lbnQuZ2V0TmFtZSgpICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLS8vCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotLy8JCQl9Ci0vLwkJCXJldHVybiBmaXhQYXRoKHBhdGgpOwotLy8JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotLy8JCQllLnByaW50U3RhY2tUcmFjZSgpOwotLy8JCX0KLS8vCi0vLwkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJlc291cmNlTWdyKGVsZW1lbnQpOwotCQlpZiAoIHJlc01nciAhPSBudWxsICkgewotCQkJcmV0dXJuIHJlc01nci5nZXRMb2dpY2FsUGF0aChlbGVtZW50KTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotLy8JcHJpdmF0ZSBzdGF0aWMgSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgZ2V0RmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcihNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLS8vCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVsZW1lbnQuZVJlc291cmNlKCk7Ci0vLwkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotLy8JCQlJTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0UGVyc2lzdGVyRm9yKHJlc291cmNlKTsKLS8vCQkJaWYocGVyc2lzdGVyIGluc3RhbmNlb2YgSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpIHsKLS8vCQkJCXJldHVybiAoKElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKXBlcnNpc3Rlcik7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJcmV0dXJuIG51bGw7Ci0vLwl9Ci0vLwkKLS8vCS8qKgotLy8JICogR2V0cyB0aGUgcGF0aCBvZiBhIG1ldGhvZCBlbGVtZW50J3MgZm9sZGVyIHJlbGF0aXZlIHRvIGl0cyBwbHVnLWluLgotLy8JICogCi0vLwkgKiBAcGFyYW0gZWxlbWVudAotLy8JICogQHJldHVybgotLy8JICogQGRlcGxpY2F0ZWQgCi0vLwkgKi8KLS8vCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRGb2xkZXJSZWxhdGl2ZVBhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0vLwkJSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gZ2V0RmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcihlbGVtZW50KTsKLS8vCQlyZXR1cm4gcGVyc2lzdGVyICE9IG51bGwgPyBwZXJzaXN0ZXIuZ2V0Rm9sZGVyUmVsYXRpdmVQYXRoKGVsZW1lbnQpIDogbnVsbDsKLS8vCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIGEgbWV0aG9kIGVsZW1lbnQncyBmb2xkZXIuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rm9sZGVyQWJzb2x1dGVQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotLy8JCWlmICggZWxlbWVudCA9PSBudWxsICkgewotLy8JCQlyZXR1cm4gbnVsbDsKLS8vCQl9Ci0vLwkJCi0vLwkJSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gZ2V0RmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcihlbGVtZW50KTsKLS8vCQlyZXR1cm4gcGVyc2lzdGVyICE9IG51bGwgPyBwZXJzaXN0ZXIuZ2V0Rm9sZGVyQWJzb2x1dGVQYXRoKGVsZW1lbnQpIDogbnVsbDsKLQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0UmVzb3VyY2VNZ3IoZWxlbWVudCk7Ci0JCWlmICggcmVzTWdyICE9IG51bGwgKSB7Ci0JCQlyZXR1cm4gcmVzTWdyLmdldFBoeXNpY2FsUGF0aChlbGVtZW50KTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0vLwkvKioKLS8vCSAqIHJldHVybiB0aGUgcGFyZW50IGZvbGRlciBvZiB0aGUgcGx1Z2luIG9yIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGVsZW1lbnQuCi0vLwkgKiBvciB0aGUgbGlicmFyeSByb290IGlmIHRoZSBlbGVtZW50IGlzIHRoZSBNZXRob2RMaWJyYXJ5LgotLy8JICogCi0vLwkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0vLwkgKiBAcmV0dXJuIFN0cmluZwotLy8JICovCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWaXJ0dWFsTGlicmFyeVJvb3QoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0vLwkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSApIHsKLS8vCQkJLy8gZGVmYXVsdCwgcmV0dXJuIHRoZSBjdXJyZW50IGxpYnJhcnkgcGF0aAotLy8JCQlyZXR1cm4gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCk7CQkJCQkKLS8vCQl9IAotLy8JCQotLy8JCVN0cmluZyBwYXRoID0gbnVsbDsKLS8vCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24gKSB7Ci0vLwkJCXBhdGggPSBnZXRGb2xkZXJBYnNvbHV0ZVBhdGgoZWxlbWVudCk7Ci0vLwkJfSBlbHNlIHsKLS8vCQkJcGF0aCA9IGdldFBsdWdpblBhdGgoZWxlbWVudCk7Ci0vLwkJfQotLy8JCQotLy8JCWlmICggcGF0aCAhPSBudWxsICkgewotLy8JCQlGaWxlIGYgPSBuZXcgRmlsZShwYXRoKTsKLS8vCQkJcmV0dXJuIGYuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotLy8JCX0KLS8vCQkKLS8vCQlyZXR1cm4gbnVsbDsKLS8vCX0KLQkKLS8vCS8qKgotLy8JICogZml4IHRoZSBwYXRoIGJ5IGFwcGVuZGluZyBhIEZpbGUuc2VwZXJhdG9yIHRvIHRoZSBlbmQgb2YgaXQKLS8vCSAqIEBwYXJhbSBwYXRoIFN0cmluZwotLy8JICogQHJldHVybiBTdHJpbmcKLS8vCSAqLwotLy8JcHVibGljIHN0YXRpYyBTdHJpbmcgZml4UGF0aChTdHJpbmcgcGF0aCkgewotLy8JCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0vLwkJewotLy8JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLS8vCQl9IGVsc2UgaWYgKCFwYXRoLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgewotLy8JCQlyZXR1cm4gcGF0aCArIEZpbGUuc2VwYXJhdG9yOwotLy8JCX0gZWxzZSB7Ci0vLwkJCXJldHVybiBwYXRoOwotLy8JCX0KLS8vCX0KLQotCQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudCdzIGJhY2sgcGF0aCByZWxhdGl2ZSB0byB0aGUgbGlicmFyeSByb290LiBGb3IgZXhhbXBsZSwKLQkgKiAiT3BlblVQXGd1aWRhbmNlXGNvbmNlcHRcYzEueG1sIiwgdGhlIGJhY2sgcGF0aCBpcyAiLi8uLi8uLi8uLi8iCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QmFja1BhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0vLwkJLy8gTGludXg6IEJyb3dzaW5nIGFuZCBwcmV2aWV3IHNob3dzIG9ubHkgcGxhaW4gdGV4dC4KLS8vCQkvLyBUaGVyZSBhcmUgbm8gaW1hZ2VzL3NlY3Rpb25zCi0vLwkJLy8gZWxlbWVudCBwYXRoIHNob3VsZCBjaGVjayBGaWxlLnNlcGFyYXRvckNoYXIgaW5zdGVhZCBvZiAiXCIKLS8vCQlTdHJpbmcgYmFja1BhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotLy8JCVN0cmluZyBwYXRoID0gZ2V0RWxlbWVudFBhdGgoZWxlbWVudCk7Ci0vLwkJaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoLmxlbmd0aCgpID4gMCkgewotLy8JCQliYWNrUGF0aCA9IHBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJykucmVwbGFjZUFsbCgKLS8vCQkJCQkiLio/LyIsICJcXC5cXC4vIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotLy8JCX0KLS8vCQlyZXR1cm4gIi4vIiArIGJhY2tQYXRoOyAvLyROT04tTkxTLTEkCi0JCQotCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1ncihlbGVtZW50KTsKLQkJaWYgKCByZXNNZ3IgIT0gbnVsbCApIHsKLQkJCXJldHVybiByZXNNZ3IuZ2V0QmFja1BhdGgoZWxlbWVudCk7Ci0JCX0KLQkJCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZmlsZSBuYW1lIHdpdGggdGhlIGdpdmVuIGV4dGVuc2lvbgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gZXh0IFN0cmluZyB0aGUgZmlsZSBleHRlbmFzaW9uLCBmb3IgZXhhbXBsZSwgIi5odG1sIgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgZXh0KSB7Ci0JCXJldHVybiBnZXRGaWxlTmFtZShlbGVtZW50LCBudWxsLCBudWxsLCBleHQpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZmlsZSBuYW1lIHdpdGggdGhlIGdpdmVuIHByZWZpeCBhbmQgZXh0ZW5zaW9uCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBuYW1lUHJlZml4IFN0cmluZyBwcmVmaXggZm9yIHRoZSBuYW1lCi0JICogQHBhcmFtIG5hbWVTdWZmaXggU3RyaW5nIHN1ZmZpeCBmb3IgdGhlIG5hbWUKLQkgKiBAcGFyYW0gZXh0IFN0cmluZyBmaWxlIGV4dGVuc2lvbiwgZm9yIGV4YW1wbGUsICIuaHRtbCIKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwkgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmFtZVByZWZpeCwKLQkJCVN0cmluZyBuYW1lU3VmZml4LCBTdHJpbmcgZXh0KSB7CQkKLQkJcmV0dXJuIEZpbGVOYW1lR2VuZXJhdG9yLklOU1RBTkNFLmdldEZpbGVOYW1lKGVsZW1lbnQsIG5hbWVQcmVmaXgsIG5hbWVTdWZmaXgsIGV4dCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBndWlkIGZyb20gdGhlIGZpbGUgbmFtZSwgYXNzdW1pbmcgdGhlIGZpbGUgbmFtZSBpcyBnZW5lcmF0ZWQgZnJvbSBhbiBlbGVtZW50LCAKLQkgKiByZXR1cm4gbnVsbCBpZiBub3QgZm91bmQuCi0JICogQHBhcmFtIGZpbGVOYW1lIFN0cmluZwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R3VpZEZyb21GaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJcmV0dXJuIEZpbGVOYW1lR2VuZXJhdG9yLklOU1RBTkNFLmdldEd1aWRGcm9tRmlsZU5hbWUoZmlsZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudCBmcm9tIHRoZSBmaWxlIG5hbWUsIGFzc3VtaW5nIHRoZSBmaWxlIG5hbWUgaXMgZ2VuZXJhdGVkIGZyb20gYW4gZWxlbWVudCwKLQkgKiByZXR1cm4gbnVsbCBpZiBub3QuCi0JICogQHBhcmFtIGZpbGVOYW1lIFN0cmluZwotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRFbGVtZW50RnJvbUZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgewotCQlTdHJpbmcgZ3VpZCA9IGdldEd1aWRGcm9tRmlsZU5hbWUoZmlsZU5hbWUpOwotCQlpZiAoZ3VpZCAhPSBudWxsKSB7Ci0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCXJldHVybiBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQgdXJsIHJlbGF0aXZlIHRvIHRoZSByZWZFbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSByZWZFbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gZmlsZUV4dCBTdHJpbmcgZmlsZSBleHRlbnNpb24KLQkgKiBAcGFyYW0gb2xkX3VybCBTdHJpbmcgdGhlIG9sZCB1cmwgb2YgdGhlIGVsZW1lbnQuIElmIHRoZSBvbGQgdXJsIGlzIG5vdCBudWxsLCAKLQkgKiBhbnkgYm9va21hcmsgb3IgdXJsIHBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0byB0aGUgbmV3IHVybAotCSAqIEByZXR1cm4gU3RyaW5nIFN0cmluZyB0aGUgbmV3IGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVcmwoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kRWxlbWVudCByZWZFbGVtZW50LCBTdHJpbmcgZmlsZUV4dCwgU3RyaW5nIG9sZF91cmwpIHsKLQkJU3RyaW5nIHVybCA9IGdldFVybChlbGVtZW50LCByZWZFbGVtZW50LCBmaWxlRXh0KTsKLQotCQkvLyBpZiB0aGUgb2xkIHVybCBoYXMgYm9va21hcmsgaW4gaXQsIGtlZXAgaXQKLQkJaWYgKG9sZF91cmwgIT0gbnVsbCkgewotCQkJaW50IGluZHggPSBvbGRfdXJsLmluZGV4T2YoVVJMX0JPT0tNQVJLX0lORElDQVRPUik7Ci0JCQlpZiAoaW5keCA8IDApIHsKLQkJCQkvLyBrZWVwIHVybCBxdWVyeSBzdHJpbmcgYXMgd2VsbAotCQkJCWluZHggPSBvbGRfdXJsLmluZGV4T2YoVVJMX1BBUkFNRVRFUl9JTkRJQ0FUT1IpOwotCQkJfQotCi0JCQlpZiAoaW5keCA+PSAwKSB7Ci0JCQkJdXJsID0gdXJsICsgb2xkX3VybC5zdWJzdHJpbmcoaW5keCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdXJsOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudCB1cmwgcmVsYXRpdmUgdG8gdGhlIHJlZkVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIHJlZkVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBmaWxlRXh0IFN0cmluZyBmaWxlIGV4dGVuc2lvbgotCSAqIEByZXR1cm4gU3RyaW5nIHRoZSB1cmwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVcmwoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kRWxlbWVudCByZWZFbGVtZW50LCBTdHJpbmcgZmlsZUV4dCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChyZWZFbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBnZXRFbGVtZW50UGF0aChlbGVtZW50KS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKQotCQkJCQkrIGdldEZpbGVOYW1lKGVsZW1lbnQsIGZpbGVFeHQpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIChnZXRCYWNrUGF0aChyZWZFbGVtZW50KSArIGdldEVsZW1lbnRQYXRoKGVsZW1lbnQpKS5yZXBsYWNlKAotCQkJCQlGaWxlLnNlcGFyYXRvckNoYXIsICcvJykKLQkJCQkJKyBnZXRGaWxlTmFtZShlbGVtZW50LCBmaWxlRXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbGluayB0ZXh0IGZvciBhbiBlbGVtZW50Ci0JICogQHBhcmFtIGUgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBsaW5rVHlwZSBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExpbmtUZXh0KE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIGxpbmtUeXBlKSB7Ci0JCVN0cmluZyBsaW5rZWRUZXh0ID0gbnVsbDsKLQkJCi0JCS8vIFJURSBtYXkgY2hhbmdlIHRoZSBjYXNlIG9mIGF0dHJpYnV0ZXMuCi0JCWlmICgobGlua1R5cGUgIT0gbnVsbCkKLQkJCQkmJiAhRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rV2l0aFVzZXJUZXh0LmVxdWFsc0lnbm9yZUNhc2UobGlua1R5cGUpKSB7Ci0JCQlpZiAoRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rV2l0aFR5cGUuZXF1YWxzSWdub3JlQ2FzZShsaW5rVHlwZSkpIHsKLQkJCQlsaW5rZWRUZXh0ID0gZ2V0RWxlbWVudExpbmtUZXh0KGUsIHRydWUpOwotCQkJfSBlbHNlIGlmIChFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmsuZXF1YWxzSWdub3JlQ2FzZShsaW5rVHlwZSkpIHsKLQkJCQlsaW5rZWRUZXh0ID0gZ2V0RWxlbWVudExpbmtUZXh0KGUsIGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBsaW5rZWRUZXh0OwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudCBsaW5rIHRleHQgZm9yIHRoZSBnaXZlbiBlbGVtZW50Ci0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSB3aXRoVHlwZSBib29sZWFuIGlmIHRydWUgdGhlIGVsZW1lbnQgdHlwZSBzdHJpbmcgd2lsbCBiZSBpbmNsdWRlZAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudExpbmtUZXh0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCWJvb2xlYW4gd2l0aFR5cGUpIHsKLQkJU3RyaW5nIHRleHQgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZWxlbWVudCk7Ci0KLQkJaWYgKHdpdGhUeXBlKSB7Ci0JCQlyZXR1cm4gZ2V0RWxlbWVudFR5cGVUZXh0KGVsZW1lbnQpICsgTGlicmFyeVJlc291cmNlcy5jb2xvbl93aXRoX3NwYWNlICsgdGV4dDsgCi0JCX0KLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBndGUgdGhlIGVsZW1lbnQgdHlwZSBzdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50VHlwZVRleHQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0VHlwZVRleHQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogYXV0byBnZW5lcmF0ZWQgZWxlbWVudCBsaW5rIDxhIGNsYXNzPSJlbGVtZW50TGluayIgaHJlZj0iZWxlbWVudF91cmwiCi0JICogZ3VpZD0iZWxlbWVudF9ndWlkIj5lbGVtZW50X3R5cGU6IGVsZW1lbnRfcHJlc2VudGF0aW9uX25hbWU8L2E+Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gd2l0aFR5cGUKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnRMaW5rKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCWJvb2xlYW4gd2l0aFR5cGUsIFN0cmluZyB1cmwpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXRFbGVtZW50TGlua1RleHQoZWxlbWVudCwgd2l0aFR5cGUpOwotCQlTdHJpbmcgbGlua0NsYXNzID0gRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rOwotCQlpZiAod2l0aFR5cGUpCi0JCQlsaW5rQ2xhc3MgPSBFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmtXaXRoVHlwZTsKLQkJcmV0dXJuIGdldEVsZW1lbnRMaW5rKGVsZW1lbnQsIHRleHQsIHVybCwgbGlua0NsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBlbGVtZW50IGxpbmsgd2l0aCB1c2VyIHNwZWNpZmllZCBsaW5rIHRleHQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIHVybAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudExpbmsoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdGV4dCwKLQkJCVN0cmluZyB1cmwpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRMaW5rKGVsZW1lbnQsIHRleHQsIHVybCwKLQkJCQlFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmtXaXRoVXNlclRleHQpOwotCX0KLQotCS8qKgotCSAqIGVsZW1lbnQgbGluayB3aXRoIHVzZXIgc3BlY2lmaWVkIGxpbmsgdGV4dAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gdXJsCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50TGluayhNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB0ZXh0LAotCQkJU3RyaW5nIHVybCwgU3RyaW5nIGxpbmtDbGFzcykgewotCQlyZXR1cm4gIjxhIGNsYXNzPVwiIiArIGxpbmtDbGFzcyArICJcIiAiICsgZ2V0VXJsVGV4dCh1cmwpICsgIiBndWlkPVwiIiArIGVsZW1lbnQuZ2V0R3VpZCgpICsgIlwiID4iICsgdGV4dCArICI8L2E+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JfQotCi0JLyoqCi0JICogdGhlIHBhc3NlZCBpbiB1cmwgbWlnaHQgY29udGFpbiB0aGUgaHJlZiBhdHRyaWJ1dGUgd2l0aCBpdCwgb3IgZXZlbiBvdGhlcgotCSAqIGF0dHJpYnV0ZXMsIHNvIGNoZWNrIGlmIHRoaXMgaXMgYSBwdXJlIHVybCBvciBub3QuIHJldHVybiB0aGUgdXJsIGhyZWYKLQkgKiB0ZXJtIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFVybFRleHQoU3RyaW5nIHVybCkgewotCQlpZiAodXJsID09IG51bGwpIHsKLQkJCXVybCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQl1cmwgPSB1cmwudHJpbSgpOwotCQl9Ci0KLQkJLy8gc3RhcnRzIHdpdGggaHJlZiwgb3IgY29udGFpbnMgYW4gaHJlZiB0ZXJtIGluIGl0Ci0JCWlmICh1cmwudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJocmVmIikgfHwgdXJsLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiIGhyZWYiKSA+IDApIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl7Ci0JCQlyZXR1cm4gdXJsOwotCQl9Ci0KLQkJcmV0dXJuICJocmVmPVwiIiArIHVybCArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIHZhbGlkYXRlIHRoZSBjb250ZW50IGJ5IGNoZWNraW5nIGVsZW1lbnQgbGlua3MgYW5kIGltYWdlcwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIHNvdXJjZQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFsaWRhdGVDb250ZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHNvdXJjZSkgewotCQlyZXR1cm4gdmFsaWRhdGVDb250ZW50KGVsZW1lbnQsIHNvdXJjZSwgbmV3IERlZmF1bHRDb250ZW50VmFsaWRhdG9yKCksCi0JCQkJbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGxpbmsgdHlwZSBpcyBlbGVtZW50IGxpbmsgb3Igbm90Ci0JICogQHBhcmFtIGxpbmtUeXBlIFN0cmluZwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VsZW1lbnRMaW5rKFN0cmluZyBsaW5rVHlwZSkgewotCQlpZiAobGlua1R5cGUgPT0gbnVsbCB8fCBsaW5rVHlwZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBSVEUgbWF5IGNoYW5nZSB0aGUgY2FzZSBvZiBhdHRyaWJ1dGVzLgotCQlyZXR1cm4gbGlua1R5cGUuZXF1YWxzSWdub3JlQ2FzZShFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmspCi0JCQkJfHwgbGlua1R5cGUuZXF1YWxzSWdub3JlQ2FzZShFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmtXaXRoVHlwZSkKLQkJCQl8fCBsaW5rVHlwZS5lcXVhbHNJZ25vcmVDYXNlKEVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGlua1dpdGhVc2VyVGV4dCk7Ci0JfQotCi0JLyoqCi0JICogdmFsaWRhdGUgdGhlIGNvbnRlbnQgYnkgY2hlY2tpbmcgZWxlbWVudCBsaW5rcyBhbmQgaW1hZ2VzLCBmb3IgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgb3duZXIKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudCwgdGhlIGVsZW1lbnQgdGhhdCBvd25zIHRoZSBjb250ZW50Ci0JICogQHBhcmFtIGNvbnRlbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBNZXRob2RDb25maWd1cmF0aW9uIHRoZSBjb25maWd1cmF0aW9uIHRvIHdoaWNoIHRoZSBjb250ZW50IGlzCi0JICogICAgICAgICAgICB2YWxpZGF0ZWQKLQkgKiBAcGFyYW0gbGlua2VkRWxlbWVudHMKLQkgKiAgICAgICAgICAgIExpc3QgYSBwYXNzZWQgaW4gbGlzdCB0byBjb2xsZWN0IHRoZSBsaW5rZWQgZWxlbWVudHMgaW4gdGhpcwotCSAqICAgICAgICAgICAgY29udGVudCwgaWYgbnVsbCwgbm8gbGlua2VkIGVsZW1lbnRzIGFyZSBjb2xsZWN0ZWQuCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHZhbGlkYXRlZCBjb250ZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFsaWRhdGVDb250ZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHNvdXJjZSwKLQkJCUlDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdHJ5IHsKLQkJCS8vIGZpcnN0IHZhbGlkYXRlIHRoZSB0YWdzLCByZW1vdmUgYW55IENGL0xGIGZyb20gdGhlIHRhZyB0ZXh0Ci0JCQlzb3VyY2UgPSB2YWxpZGF0ZVRhZyhzb3VyY2UpOwotCi0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlNYXRjaGVyIG0gPSBwX2xpbmtfcmVmLm1hdGNoZXIoc291cmNlKTsKLQotCQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSBtLmdyb3VwKCk7Ci0KLQkJCQkvLyBQcm9ibGVtcyBwYXJzaW5nIDxhIGhyZWY+IHRhZ3MKLQkJCQkvLyBuZWVkIHRvIHJlbW92ZSBhbGwgTEYsIENSIHdpdGhpbiB0aGUgPGEgLi4+IHRhZwotCQkJCVN0cmluZyB1cmx0ZXh0ID0gbS5ncm91cCgxKTsKLQkJCQlTdHJpbmcgbGlua2VkVGV4dCA9IG0uZ3JvdXAoMik7Ci0JCQkJTGlua0luZm8gaW5mbyA9IHZhbGlkYXRvci52YWxpZGF0ZUxpbmsoZWxlbWVudCwgdXJsdGV4dCwKLQkJCQkJCWxpbmtlZFRleHQsIGNvbmZpZywgImEiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJdGV4dCA9IGluZm8uZ2V0SHRtbCh2YWxpZGF0b3Iuc2hvd0Jyb2tlbkxpbmtzKCkpLnRvU3RyaW5nKCk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IGluZm8uZ2V0TGlua2VkRWxlbWVudCgpOwotCQkJCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJCQl2YWxpZGF0b3IuYWRkUmVmZXJlbmNlZEVsZW1lbnQoZWxlbWVudCwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlTdHJpbmcgcmVwbGFjZW1lbnQgPSB0ZXh0LnJlcGxhY2VBbGwoImZpbGU6Ly8vIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXBsYWNlbWVudCA9IHJlcGxhY2VtZW50LnJlcGxhY2VBbGwoImZpbGU6Ly8iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkJCQkKLQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCByZWdFeHBFc2NhcGUocmVwbGFjZW1lbnQpKTsKLQkJCX0KLQotCQkJbS5hcHBlbmRUYWlsKHNiKTsKLQotCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQkJfQotCi0JCQkvLyBhbHNvIGZpeCB0aGUgYXJlYSBtYXAKLQkJCXNvdXJjZSA9IHNiLnRvU3RyaW5nKCk7Ci0JCQltID0gcF9hcmVhX3JlZi5tYXRjaGVyKHNvdXJjZSk7Ci0JCQlzYi5zZXRMZW5ndGgoMCk7Ci0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmcgdGV4dCA9IG0uZ3JvdXAoKTsKLQotCQkJCVN0cmluZyB1cmx0ZXh0ID0gbS5ncm91cCgxKTsKLQkJCQlMaW5rSW5mbyBpbmZvID0gdmFsaWRhdG9yLnZhbGlkYXRlTGluayhlbGVtZW50LCB1cmx0ZXh0LAotCQkJCQkJIiIsIGNvbmZpZywgImFyZWEiKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJCi0JCQkJCS8vIGRvbid0IHNob3cgYnJva2VuIGxpbmtzIGluIGFyZWEgbWFwLiBTaG93IHBsYW4gdGV4dCBpbnN0ZWFkCi0JCQkJCXRleHQgPSBpbmZvLmdldEh0bWwoZmFsc2UvKnZhbGlkYXRvci5zaG93QnJva2VuTGlua3MoKSovKS50b1N0cmluZygpOwotCQkJCQlNZXRob2RFbGVtZW50IGUgPSBpbmZvLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJCQkJaWYgKGUgIT0gbnVsbCkgewotCQkJCQkJdmFsaWRhdG9yLmFkZFJlZmVyZW5jZWRFbGVtZW50KGVsZW1lbnQsIGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gdGV4dC5yZXBsYWNlQWxsKCJmaWxlOi8vLyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudC5yZXBsYWNlQWxsKCJmaWxlOi8vIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkJCi0JCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVnRXhwRXNjYXBlKHJlcGxhY2VtZW50KSk7Ci0JCQl9Ci0KLQkJCW0uYXBwZW5kVGFpbChzYik7Ci0KLQkJCS8vIFNoYXBlIGljb24gYnJva2VuIGluIHByZXZpZXcgYW5kIGJyb3dzaW5nCi0JCQkvLyAvLyBuZWVkIHRvIGRlY29kZSB0aGUgaW1hZ2UgcGF0aCB1bmxlc3Mgd2UgY2FuIGRpc2FibGUgdGhlIHVybAotCQkJLy8gZW5jb2RpbmcgaW4geHNsdAotCQkJLy8gc291cmNlID0gc2IudG9TdHJpbmcoKTsKLQkJCS8vIHNiLnNldExlbmd0aCgwKTsKLQkJCS8vIG0gPSBSZXNvdXJjZUhlbHBlci5wX2ltYWdlX3JlZi5tYXRjaGVyKHNvdXJjZSk7Ci0JCQkvLyB3aGlsZSAoIG0uZmluZCgpICkKLQkJCS8vIHsKLQkJCS8vIFN0cmluZyB1cmwgPSBtLmdyb3VwKDMpOwotCQkJLy8gdXJsID0gVVJMRGVjb2Rlci5kZWNvZGUodXJsLCAiVVRGLTgiKTsKLQkJCS8vIG0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIG0uZ3JvdXAoMSkgKyB1cmwgKyBtLmdyb3VwKDQpKTsKLQkJCS8vIH0KLQkJCS8vIG0uYXBwZW5kVGFpbChzYik7Ci0JCQkvLyByZXR1cm4gc2IudG9TdHJpbmcoKTsKLQotCQkJLy8gZGVjb2RlIHRoZSB1cmxzCi0JCQlyZXR1cm4gZGVjb2RlVXJsc0luQ29udGVudChzYi50b1N0cmluZygpKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBkZWNvZGUgdGhlIHVybHMgaW4gdGhlIGNvbnRlbnQuIENvbnRlbnQgZnJvbSB4c2x0IG91dHB1dCBhcmUgZW5jb2RlZC4gV2UKLQkgKiBkb24ndCB3YW50IHRoaXMgdG8gYmUgZW5jb2RlZCBzaW5jZSB0aGUgYnJvd3NlciBtYXkgZGVjb2RlIGl0IGluIGEgd3JvbmcKLQkgKiBlbmNvZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlVXJsc0luQ29udGVudChTdHJpbmcgY29udGVudCkgewotCQl0cnkgewotCQkJLy8gU2hhcGUgaWNvbiBicm9rZW4gaW4gcHJldmlldyBhbmQgYnJvd3NpbmcKLQkJCS8vIG5lZWQgdG8gZGVjb2RlIHRoZSBpbWFnZSBwYXRoIHVubGVzcyB3ZSBjYW4gZGlzYWJsZSB0aGUgdXJsCi0JCQkvLyBlbmNvZGluZyBpbiB4c2x0Ci0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlNYXRjaGVyIG0gPSBSZXNvdXJjZUhlbHBlci5wX3VybF9kZWNvZGVyLm1hdGNoZXIoY29udGVudCk7Ci0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmcgdXJsID0gbS5ncm91cCgzKTsKLQkJCQl1cmwgPSBVUkxEZWNvZGVyLmRlY29kZSh1cmwsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHRleHQgPSBtLmdyb3VwKDEpICsgdXJsICsgbS5ncm91cCg0KTsKLQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCByZWdFeHBFc2NhcGUodGV4dCkpOyAJCi0JCQl9Ci0JCQltLmFwcGVuZFRhaWwoc2IpOwotCi0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBlc2NhcGUgdGhlIHJlZ2V4cCByZXNlcnZlZCB3b3Jkcywgc3VjaCBhcyAkCi0JICogQHBhcmFtIHRleHQgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWdFeHBFc2NhcGUoU3RyaW5nIHRleHQpIHsKLQkJLy8gZXNjYXBlIHRoZSByZWdFeHAgcmVzZXJ2ZWQgd29yZHMsCi0JCS8vIHRoZSAkIHNpZ24gaXMgcmVzZXJ2ZWQgZm9yIGdyb3VwIG1hdGNoaW5nIAotCQlpbnQgaT10ZXh0LmluZGV4T2YoJyQnKTsgCi0JCWlmICggaSA8IDAgKSB7Ci0JCQlyZXR1cm4gdGV4dDsKLQkJfQotCQkKLQkJaW50IHN0YXJ0ID0gMDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJd2hpbGUgKCBpID4gc3RhcnQgKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBpKSkuYXBwZW5kKCJcXCIpOyAvLyROT04tTkxTLTEkCi0JCQlzdGFydCA9IGk7Ci0JCQlpPXRleHQuaW5kZXhPZignJCcsIHN0YXJ0KzEpOyAKLQkJfQotCQkKLQkJYnVmZmVyLmFwcGVuZCh0ZXh0LnN1YnN0cmluZyhzdGFydCkpOwotCQkKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBmaXggdGhlIGVsZW1lbnQgdXJsIGluIHRoZSB1cmx0ZXh0LiB0aGUgdGV4dCBpcyB0aGUgcGFydCBmcm9tIHRoZQotCSAqIHBfbGlua19yZWYgcGF0dGVybiBtYXRjaAotCSAqIAotCSAqIEBwYXJhbSB1cmx0ZXh0Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgTWV0aG9kQ29uZmlndXJhdGlvbiB0aGUgY29uZmlndXJhdGlvbiB0byB3aGljaCB0aGUgY29udGVudCBpcwotCSAqICAgICAgICAgICAgdmFsaWRhdGVkCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGZpeGVkIHRleHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaXhFbGVtZW50VXJsKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHVybHRleHQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlNYXRjaGVyIG0gPSBwX2xpbmtfaHJlZl9waWNrZXIubWF0Y2hlcigiICIgKyB1cmx0ZXh0ICsgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG0uZmluZCgpKSB7Ci0JCQlTdHJpbmcgdXJsID0gbS5ncm91cCgxKTsKLQkJCVN0cmluZyBuZXd1cmwgPSBudWxsOwotCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZEZyb21VcmwodXJsdGV4dCk7Ci0JCQkJaWYgKGd1aWQgIT0gbnVsbCkgewotCQkJCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IG1hbmFnZXIgIT0gbnVsbCA/IG1hbmFnZXIKLQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChndWlkKSA6IG51bGw7Ci0JCQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQkJCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJCQkJCWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KGUsCi0JCQkJCQkJCQljb25maWcpOwotCQkJCQkJfQotCQkJCQkJbmV3dXJsID0gZ2V0VXJsKGUsIGVsZW1lbnQsIEZJTEVfRVhUX0hUTUwsIHVybCk7Ci0JCQkJCX0KLQotCQkJCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBudWxsLCB3ZSBzaG91bGQgcmVtb3ZlIHRoZSB1cmwgbGluayBhbmQKLQkJCQkJLy8gbG9nIGFuIGVycm9yCi0JCQkJCS8vIFRPRE8KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChuZXd1cmwgIT0gbnVsbCAmJiAhbmV3dXJsLmVxdWFscyh1cmwpKSB7Ci0JCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gIiBocmVmPVwiIiArIG5ld3VybCArICJcIiAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCByZWdFeHBFc2NhcGUocmVwbGFjZW1lbnQpKTsKLQkJCQltLmFwcGVuZFRhaWwoc2IpOwotCQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdXJsdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQgbGluayB0eXBlIGZvciB0aGUgdXJsCi0JICogQHBhcmFtIHNvdXJjZSBTdHJpbmcgdGhlIGxpbmsKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgdHlwZSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50TGlua1R5cGUoU3RyaW5nIHNvdXJjZSkgewotCQlNYXRjaGVyIG0gPSBwX2xpbmtfdHlwZV9waWNrZXIubWF0Y2hlcigiICIgKyBzb3VyY2UgKyAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKG0uZmluZCgpKSB7Ci0JCQlyZXR1cm4gbS5ncm91cCgxKS50cmltKCkucmVwbGFjZUFsbCgiXCIiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBndWlkIGZyb20gdGhlIHVybAotCSAqIEBwYXJhbSBzb3VyY2UgU3RyaW5nIHRoZSB1cmwKLQkgKiBAcmV0dXJuIFN0cmlnbiB0aGUgZ3VpZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEd1aWRGcm9tVXJsKFN0cmluZyBzb3VyY2UpIHsKLQkJTWF0Y2hlciBtID0gcF9saW5rX2d1aWRfcGlja2VyLm1hdGNoZXIoIiAiICsgc291cmNlICsgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmIChtLmZpbmQoKSkgewotCQkJcmV0dXJuIG0uZ3JvdXAoMSkudHJpbSgpLnJlcGxhY2VBbGwoIlwiIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCW0gPSBwX2xpbmtfaHJlZl9waWNrZXIubWF0Y2hlcigiICIgKyBzb3VyY2UgKyAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKG0uZmluZCgpKSB7Ci0JCQlTdHJpbmcgaHJlZiA9IG0uZ3JvdXAoMSkudHJpbSgpLnJlcGxhY2VBbGwoIlwiIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBnZXRHdWlkRnJvbUZpbGVOYW1lKGhyZWYpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogaGFuZGxlIGEgYnVnIGluIElFLiBhbmNob3IgdGFnIGNhbid0IGhhdmUgQ1IgTEYsIGxpa2UgPEEgXHJcbgotCSAqIGhyZWY9Ind3dy55YWhvby5jb20iIFxyXG4+IHNjYW4gdGhlIHN0cmluZyBzb3VyY2UsIGZpbmQgYWxsIGFuY2hvciB0YWdzCi0JICogYW5kIHJlcGxhY2Ugd2l0aCBzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGZpeGVkIHNvdXJjZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbGlkYXRlVGFnKFN0cmluZyBzb3VyY2UpIHsKLQkJLy8gUGF0dGVybiBwX2FuY2hvcl9yZWYgPSBQYXR0ZXJuLmNvbXBpbGUoIigqKz8pPSgqLj8pIiwKLQkJLy8gUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOwotCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTWF0Y2hlciBtID0gcF90YWdfcmVmLm1hdGNoZXIoc291cmNlKTsKLQkJLy8gU3RyaW5nQnVmZmVyIHRlbXBTYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCVN0cmluZyB0ZXh0ID0gbS5ncm91cCgpOwotCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gZml4VGFnQXR0cmlidXRlKHRleHQpOwotCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVnRXhwRXNjYXBlKHJlcGxhY2VtZW50KSk7Ci0JCX0KLQotCQltLmFwcGVuZFRhaWwoc2IpOwotCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGZpeCB0YWcgYXR0cmlidXRlCi0JICogQHBhcmFtIHNvdXJjZQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZml4VGFnQXR0cmlidXRlKFN0cmluZyBzb3VyY2UpIHsKLQkJLy8gc2ltcGx5IHJlcGxhY2UgYWxsIENSIExGIHdpdGggJyAnLCBmaW5lIHR1bmUgbGF0ZXIKLQkJcmV0dXJuIHNvdXJjZQotCQkJCS5yZXBsYWNlQWxsKCJcXFxyXFxcbiIsICIgIikucmVwbGFjZUFsbCgiXFxcciIsICIgIikucmVwbGFjZUFsbCgiXFxcbiIsICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCi0JfQotCi0vLwkvKioKLS8vCSAqIGdldCB0aGUgcmVzb3VyY2UgZmlsZSB1cmwgcmVsYXRpdmUgdG8gdGhlIGxpYnJhcnkgcm9vdAotLy8JICogCi0vLwkgKiBAcGFyYW0gZQotLy8JICogICAgICAgICAgICBNZXRob2RFbGVtZW50IHRoZSBlbGVtZW50IHRoYXQgcmVmZXJlbmNlcyB0aGlzIHJlc291cmNlCi0vLwkgKiBAcGFyYW0gZmlsZQotLy8JICogICAgICAgICAgICBGaWxlIHRoZSByZXNvdXJjZSdzIHBoeXNpY2FsIHBhdGgKLS8vCSAqIEByZXR1cm4gU3RyaW5nIHRoZSB1cmwgdG8gdGhpcyByZXNvdXJjZSBmcm9tIHRoZSBlbGVtZW50Ci0vLwkgKiBAZGVwbGljYXRlZCB0aGlzIG1ldGhvZCBpcyBub3QgdmFsaWQgZm9yIGRpc3RyaWJ1dGVkIGxpYnJhcnkKLS8vCSAqLwotLy8JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlRmlsZVVybChNZXRob2RFbGVtZW50IGUsIEZpbGUgZmlsZSkgewotLy8JCVN0cmluZyBmaWxlVXJsID0gZ2V0RmlsZVVybChmaWxlKTsKLS8vCQkvLyBTdHJpbmcgZWxlbWVudFBhdGggPQotLy8JCS8vIFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRSZXNvdXJjZVBhdGgoZSkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsCi0vLwkJLy8gJy8nKTsKLS8vCi0vLwkJZmlsZVVybCA9IFJlc291cmNlSGVscGVyLmdldEJhY2tQYXRoKGUpICsgZmlsZVVybDsKLS8vCi0vLwkJcmV0dXJuIGZpbGVVcmw7Ci0vLwotLy8JfQotLy8KLS8vCS8qKgotLy8JICogcmV0dXJuIHRoZSBmaWxlJ3MgcmVsYXRpdmUgcGF0aCB0byB0aGUgcGx1Z2luIHJvb3QKLS8vCSAqIAotLy8JICogQHBhcmFtIGYKLS8vCSAqIEByZXR1cm4gU3RyaW5nCi0vLwkgKiBAZGVwbGljYXRlZCB0aGlzIG1ldGhvZCBpcyBub3QgdmFsaWQgZm9yIGRpc3RyaWJ1dGVkIGxpYnJhcnkKLS8vCSAqLwotLy8JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEZpbGVVcmwoRmlsZSBmKSB7Ci0vLwkJU3RyaW5nIHBhdGggPSBnZXRGaWxlUmVsUGF0aChmKTsKLS8vCQlwYXRoID0gcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLS8vCQlyZXR1cm4gcGF0aDsKLS8vCX0KLQotLy8JLyoqCi0vLwkgKiBnZXQgdGhlIFVSSSByZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkIGJhc2UKLS8vCSAqIAotLy8JICogQHBhcmFtIHVyaQotLy8JICogQHJldHVybiBqYXZhLm5ldC5VUkkKLS8vCSAqLwotLy8JcHVibGljIHN0YXRpYyBVUkkgZ2V0UmVsYXRpdmVVUkkoVVJJIHVyaSwgU3RyaW5nIHJvb3RQYXRoKSB7Ci0vLwkJcmV0dXJuIGdldFJlbGF0aXZlVVJJKHVyaSwgbmV3IEZpbGUocm9vdFBhdGgpLnRvVVJJKCkpOwotLy8JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBVUkkgcmVsYXRpdmUgdG8gdGhlIHNwZWNpZmllZCBiYXNlCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gamF2YS5uZXQuVVJJCi0JICogQGRlcGxpY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSSSBnZXRSZWxhdGl2ZVVSSShVUkkgdXJpLCBVUkkgcmVsYXRpdmVUbykgewotCQlVUkkgcmVsVXJpID0gcmVsYXRpdmVUby5yZWxhdGl2aXplKHVyaSk7Ci0JCXJldHVybiByZWxVcmk7Ci0JfQotCi0vLwkvKioKLS8vCSAqIHJlc29sdmUgdGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGxpYnJhcnkgcm9vdAotLy8JICogCi0vLwkgKiBAcGFyYW0gZgotLy8JICogQHJldHVybiBTdHJpbmcgdGhlIHJhbHRpdmUgcGF0aAotLy8JICogQGRlcGxpY2F0ZWQgdGhpcyBtZXRob2QgaXMgbm90IHZhbGlkIGZvciBkaXN0cmlidXRlZCBsaWJyYXJ5Ci0vLwkgKi8KLS8vCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRGaWxlUmVsUGF0aChGaWxlIGYpIHsKLS8vCQlGaWxlIGxpYnJhcnlSb290UGF0aCA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLS8vCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkpOwotLy8JCVN0cmluZyByb290ID0gbGlicmFyeVJvb3RQYXRoLmdldEFic29sdXRlUGF0aCgpOwotLy8JCVN0cmluZyBwYXRoID0gZi5nZXRBYnNvbHV0ZVBhdGgoKTsKLS8vCQlpZiAocGF0aC5zdGFydHNXaXRoKHJvb3QpKSB7Ci0vLwkJCXBhdGggPSBwYXRoLnN1YnN0cmluZyhyb290Lmxlbmd0aCgpKTsKLS8vCQl9Ci0vLwotLy8JCWlmIChwYXRoLnN0YXJ0c1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0vLwkJCXBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKLS8vCQl9Ci0vLwotLy8JCXJldHVybiBwYXRoOwotLy8JfQotCi0vLwkvKioKLS8vCSAqIGdldCB0aGUgVVJJIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5IHJvb3QKLS8vCSAqIAotLy8JICogQHBhcmFtIGYKLS8vCSAqIEByZXR1cm4gamF2YS5uZXQuVVJJCi0vLwkgKiBAZGVwbGljYXRlZCB0aGlzIG1ldGhvZCBpcyBub3QgdmFsaWQgZm9yIGRpc3RyaWJ1dGVkIGxpYnJhcnkKLS8vCSAqLwotLy8JcHJpdmF0ZSBzdGF0aWMgamF2YS5uZXQuVVJJIGdldEZpbGVSZWxhdGl2ZVVSSShGaWxlIGYpIHsKLS8vCQlGaWxlIGxpYnJhcnlSb290UGF0aCA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLS8vCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkpOwotLy8JCWphdmEubmV0LlVSSSBsaWJVUkkgPSBsaWJyYXJ5Um9vdFBhdGgudG9VUkkoKTsKLS8vCQlqYXZhLm5ldC5VUkkgZmlsZVVSSSA9IGYudG9VUkkoKTsKLS8vCQlqYXZhLm5ldC5VUkkgcmVsVXJpID0gbGliVVJJLnJlbGF0aXZpemUoZmlsZVVSSSk7Ci0vLwotLy8JCXJldHVybiByZWxVcmk7Ci0vLwl9Ci0KLQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gYXR0YWNobWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoVG9GaWxlRnJvbUVsZW1lbnQoCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQsIEZpbGUgYXR0YWNobWVudCkgewotCQlTdHJpbmcgZWxlbWVudExvYyA9IGdldEZvbGRlckFic29sdXRlUGF0aChlbGVtZW50KTsJCi0JCXJldHVybiBGaWxlVXRpbC5nZXRSZWxhdGl2ZVBhdGgoYXR0YWNobWVudCwgbmV3IEZpbGUoZWxlbWVudExvYykpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZmlsZSBwYXRoIG5hbWUgb2YgdGhlIHR5cGUgb2YgZGlhZ3JhbSBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gZGlhZ3JhbVR5cGUKLQkgKiAgICAgICAgICAgIFN0cmluZyBkaWFncmFtIHR5cGUgZGVmaW5lZCBpbiBvbmUgb2YgdGhlIGRpYWdyYW0gdHlwZQotCSAqICAgICAgICAgICAgY29uc3RhbnRzCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgbGlicmFyeSByb290Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGlhZ3JhbUZpbGVQYXRoTmFtZShNZXRob2RFbGVtZW50IGUsCi0JCQlTdHJpbmcgZGlhZ3JhbVR5cGUpIHsKLQkJLy8gSW5zdGFuY2VzIG9mIHRoZSBzYW1lIGFjdGl2aXR5L0NQIHNoYXJlIHRoZQotCQkvLyBzYW1lIGRpYWdyYW0gaW4gYSBEZWxpdmVyeSBQcm9jZXNzCi0JCS8vIG5lZWQgdG8gbWFrZSB0aGUgbmFtZSB1bmlxdWUKLS8vCQlyZXR1cm4gZ2V0RWxlbWVudFJlc291cmNlUGF0aChlKQotLy8JCQkJKyBTdHJVdGlsLnJlbW92ZVNwZWNpYWxDaGFyYWN0ZXJzKGUuZ2V0TmFtZSgpKQotLy8JCQkJKyAiXyIgKyBlLmdldEd1aWQoKSArICJfIiArIGRpYWdyYW1UeXBlICsgRklMRV9FWFRfSlBFRzsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQotCQlyZXR1cm4gZ2V0RWxlbWVudFJlc291cmNlUGF0aChlKQotCQkrIEZpbGVOYW1lR2VuZXJhdG9yLklOU1RBTkNFLmdldEZpbGVOYW1lKGUsICIiLCAiXyIgKyBkaWFncmFtVHlwZSwgRklMRV9FWFRfSlBFRyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFhtbEV4cG9ydGVkRGlhZ3JhbUltYWdlRmlsZU5hbWUoTWV0aG9kRWxlbWVudCBlLCBTdHJpbmcgZGlhZ3JhbVR5cGUsIFN0cmluZyBmb3JtYXQpIHsKLQkJU3RyaW5nIHN0ciA9IGUuZ2V0TmFtZSgpICsgIiAiICsgZS5nZXRHdWlkKCkgKyAiXyIgKyBkaWFncmFtVHlwZSArIGZvcm1hdDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJldHVybiBzdHI7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Fic29sdXRlcGF0aChTdHJpbmcgcGF0aCkgewotCQkKLQkJaWYgKCBwYXRoID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmICggCXBhdGguc3RhcnRzV2l0aCgiLyIpICAvLyROT04tTkxTLTEkCi0JCQkJfHwgcGF0aC5zdGFydHNXaXRoKEZpbGUuc2VwYXJhdG9yKSAKLQkJCQl8fCBwYXRoLmluZGV4T2YoIjoiKSA+IDAgKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgZmlsZSBiYXNlZCBvbiB0aGUgdXJsCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgU3RyaW5nIHRoZSB1cmwKLQkgKiBAcGFyYW0gY29udGVudFBhdGgKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgcGF0aCBvZiB0aGUgY29udGVudCB0aGF0IGNvbnRhaW5zIHRoaXMgdXJsCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgY29udGVudCBwdWJsaXNoaW5nIHJvb3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlUGF0aEZyb21VcmwoU3RyaW5nIHVybCwgU3RyaW5nIGNvbnRlbnRQYXRoKSB7Ci0KLQkJU3RyaW5nIGZpbGVQYXRoID0gdXJsOwotCQlpZiAoaXNFeHRlcm5hbExpbmsoZmlsZVBhdGgpCi0JCQkJfHwgZmlsZVBhdGguc3RhcnRzV2l0aCgibWFpbHRvOiIpIHx8IGZpbGVQYXRoLnN0YXJ0c1dpdGgoVVJMX0JPT0tNQVJLX0lORElDQVRPUikpIC8vJE5PTi1OTFMtMSQgCi0JCXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaW50IGluZGV4ID0gZmlsZVBhdGguaW5kZXhPZihOZXRVdGlsLkZJTEVfUFJFRklYXzMpOwotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJZmlsZVBhdGggPSBmaWxlUGF0aC5zdWJzdHJpbmcoTmV0VXRpbC5GSUxFX1BSRUZJWF8zLmxlbmd0aCgpKTsKLQkJfQotCi0JCWluZGV4ID0gZmlsZVBhdGguaW5kZXhPZihOZXRVdGlsLkZJTEVfUFJFRklYXzIpOwotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJZmlsZVBhdGggPSBmaWxlUGF0aC5zdWJzdHJpbmcoTmV0VXRpbC5GSUxFX1BSRUZJWF8yLmxlbmd0aCgpKTsKLQkJfQotCQkKLQkJaWYgKCBpc0Fic29sdXRlcGF0aChmaWxlUGF0aCkgKSB7Ci0JCQkvLyBhc3N1bWUgdGhpcyBpcyBhbiBhYnNvbHV0ZSBwYXRoCi0JCQlyZXR1cm4gdXJsOwotCQl9Ci0KLQkJRmlsZSBmID0gbmV3IEZpbGUoY29udGVudFBhdGgpOwotCQkKLQkJaW50IHN0YXJ0ID0gMDsKLQkJaW5kZXggPSAwOwotCQl3aGlsZSAoKGYgIT0gbnVsbCkgJiYgKGluZGV4ID0gZmlsZVBhdGguaW5kZXhPZigiLi4vIiwgc3RhcnQpKSA+PSAwKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCWYgPSBmLmdldFBhcmVudEZpbGUoKTsKLQkJCXN0YXJ0ID0gaW5kZXggKyAzOwotCQl9Ci0JCQotCQlTdHJpbmcgcm9vdEZvbGRlciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChmICE9IG51bGwpIHsKLQkJCXJvb3RGb2xkZXIgPSBmLmdldFBhdGgoKTsKLQkJfQotCi0JCWlmIChyb290Rm9sZGVyLmxlbmd0aCgpID4gMCAmJiAhcm9vdEZvbGRlci5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLQkJCXJvb3RGb2xkZXIgKz0gRmlsZS5zZXBhcmF0b3I7Ci0JCX0KLQotCQkvLyB0aGUgZmlsZSBwYXRoIGlzCi0JCVN0cmluZyBwYXRoID0gcm9vdEZvbGRlcgotCQkJCSsgZmlsZVBhdGguc3Vic3RyaW5nKHN0YXJ0KS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQotCQlyZXR1cm4gWE1MVXRpbC51bmVzY2FwZShOZXRVdGlsLmRlY29kZWRGaWxlVXJsKHBhdGgpKTsKLQl9Ci0KLQkvKioKLQkgKiBmb3IgdGhlIGdpdmVuIGNvbnRlbnQgd2l0aCB1cmwgYmFzZWQgb24gdGhlIG9sZENvbnRlbnRQYXRoLCByZXNvbHZlIHRvCi0JICogdGhlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGNvbnRlbnRQYXRoLiBJZiBiYWNrcGF0aCBpcwotCSAqIHNwZWNpZmllZCwgYWRkIHRoZSBiYWNrUGF0aC4gcmV0dXJuIHRoZSB1cGRhdGVkIGNvbnRlbnQuIEEgdHlwaWNhbAotCSAqIHNjZW5hcmlvIGlzIHRoZSBjb250ZW50IGlzIGZyb20gYSBjb250cmlidXRpbmcgZWxlbWVudCwgd2hpY2ggaGFzIHVybHMKLQkgKiByZWxhdGl2ZSB0byB0aGUgY29udHJpYnV0aW5nIGVsZW1lbnQncyBjb250ZW50UGF0aC4gVGhpcyBtZXRob2Qgd2lsbCBmaXgKLQkgKiB0aGUgdXJsIHRvIGJhc2VkIG9uIHRoZSBiYXNlIGVsZW1lbnQncyBjb250ZW50UGF0aC4KLQkgKiAKLQkgKiBTbyBjYWxsIGZpeENvbnRlbnRVcmxQYXRoKGNvbnRyaWJ1dG9yX3RleHQsIGNvbnRyaWJ1dG9yX2VsZW1lbnRQYXRoLAotCSAqIGJhc2VFbGVtZW50X2JhY2tQYXRoKQotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50Ci0JICogQHBhcmFtIGNvbnRlbnRQYXRoCi0JICogQHBhcmFtIG9sZENvbnRlbnRQYXRoCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHVwZGF0ZWQgY29udGVudCB3aXRoIGZpeGVkIHBhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZml4Q29udGVudFVybFBhdGgoU3RyaW5nIGNvbnRlbnQsIFN0cmluZyBjb250ZW50UGF0aCwKLQkJCVN0cmluZyBiYWNrUGF0aCkgewotCQkKLQkJaWYgKCBjb250ZW50UGF0aCA9PSBudWxsIHx8IGJhY2tQYXRoID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gY29udGVudDsKLQkJfQotCQkKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0cnkgewotCQkJLy8gcHJvY2VzcyBpbWFnZXMKLQkJCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfaW1hZ2VfcmVmLm1hdGNoZXIoY29udGVudCk7Ci0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmcgdXJsID0gbS5ncm91cCgzKTsKLQkJCQl1cmwgPSByZXNvbHZlVXJsKHVybCwgY29udGVudFBhdGgsIGJhY2tQYXRoKTsKLQkJCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVnRXhwRXNjYXBlKG0uZ3JvdXAoMSkgKyB1cmwgKyBtLmdyb3VwKDQpKSk7Ci0JCQkJfQotCQkJfQotCQkJbS5hcHBlbmRUYWlsKHNiKTsKLQotCQkJY29udGVudCA9IHNiLnRvU3RyaW5nKCk7Ci0JCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQkJLy8gcHJvY2VzcyBhdHRhY2htZW50cwotCQkJbSA9IFJlc291cmNlSGVscGVyLnBfbGlua19yZWZfZ2VuLm1hdGNoZXIoY29udGVudCk7Ci0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmdCdWZmZXIgc2JMaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCS8vIFN0cmluZyB0YWcgPSBtLmdyb3VwKDEpOwotCQkJCVN0cmluZyB1cmx0ZXh0ID0gIiAiICsgbS5ncm91cCgyKSArICIgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJaWYgKFJlc291cmNlSGVscGVyLmdldEd1aWRGcm9tVXJsKHVybHRleHQpID09IG51bGwpIHsKLQkJCQkJTWF0Y2hlciBtMiA9IFJlc291cmNlSGVscGVyLnBfbGlua19ocmVmX3BpY2tlcgotCQkJCQkJCS5tYXRjaGVyKHVybHRleHQpOwotCQkJCQlpZiAobTIuZmluZCgpKSB7Ci0JCQkJCQlTdHJpbmcgdXJsID0gbTIuZ3JvdXAoMSkudHJpbSgpLnJlcGxhY2VBbGwoIlwiIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCXVybCA9IHJlc29sdmVVcmwodXJsLCBjb250ZW50UGF0aCwgYmFja1BhdGgpOwotCQkJCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gdXJsdGV4dC5zdWJzdHJpbmcobTIuc3RhcnQoKSwgbTIuc3RhcnQoMSkpCi0JCQkJCQkJCQkrIHVybAotCQkJCQkJCQkJKyB1cmx0ZXh0LnN1YnN0cmluZyhtMi5lbmQoMSksIG0yLmVuZCgpKTsKLQkJCQkJCQkKLQkJCQkJCQltMi5hcHBlbmRSZXBsYWNlbWVudChzYkxpbmssIHJlZ0V4cEVzY2FwZShyZXBsYWNlbWVudCkpOwotCQkJCQkJCW0yLmFwcGVuZFRhaWwoc2JMaW5rKTsKLQkJCQkJCQkKLQkJCQkJCQlyZXBsYWNlbWVudCA9IGNvbnRlbnQuc3Vic3RyaW5nKG0uc3RhcnQoKSwgbS5zdGFydCgyKSkKLQkJCQkJCQkJCSsgc2JMaW5rLnRvU3RyaW5nKCkgKyBjb250ZW50LnN1YnN0cmluZyhtLmVuZCgyKSwgbS5lbmQoKSk7Ci0JCQkJCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVnRXhwRXNjYXBlKHJlcGxhY2VtZW50KSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJCW0uYXBwZW5kVGFpbChzYik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqIEBwYXJhbSBjb250ZW50UGF0aAotCSAqIEBwYXJhbSBiYWNrUGF0aAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVVybChTdHJpbmcgdXJsLCBTdHJpbmcgY29udGVudFBhdGgsCi0JCQlTdHJpbmcgYmFja1BhdGgpIHsKLQkJU3RyaW5nIG5ld191cmwgPSBnZXRGaWxlUGF0aEZyb21VcmwodXJsLCBjb250ZW50UGF0aCk7Ci0JCWlmIChuZXdfdXJsICE9IG51bGwgJiYgIW5ld191cmwuZXF1YWxzKHVybCkgKSB7Ci0JCQlpZiAoYmFja1BhdGggIT0gbnVsbCkgewotCQkJCW5ld191cmwgPSBiYWNrUGF0aCArIG5ld191cmw7Ci0JCQl9Ci0KLQkJCXJldHVybiBuZXdfdXJsLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX1VSTF9TVEFSVF9XSVRIID0gTGF5b3V0UmVzb3VyY2VzCi0JCQkuZ2V0U3RyaW5nKCJleHRlcm5hbFVybF9zdGFydFdpdGgiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfZXh0ZXJuYWxfdXJsX3N0YXJ0V2l0aCA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiKCIgKyBFWFRFUk5BTF9VUkxfU1RBUlRfV0lUSCArICIpIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoaXMgaXMgYW4gZXh0ZXJuYWwgdXJsIG9yIG5vdAotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHRlcm5hbExpbmsoU3RyaW5nIHVybCkgewotCQkvLyAxNjI5NjkgLSBSZWZpbmUgZXh0ZXJuYWwgbGluaydzIHJlZ3VsYXIgZXhwIGluIGVwZi5saWJyYXJ5L2xheW91dC9MYXlvdXRSZXNvdXJjZXMucHJvcGVydGllcwotCQkvLyBmaWxlOi8vIHNob3VsZCBiZSBleGNsdWRlZAotCQlpZiAoIHVybCA9PSBudWxsICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQl1cmwgPSB1cmwudG9Mb3dlckNhc2UoKTsKLQkJaWYgKCB1cmwuc3RhcnRzV2l0aCgiZmlsZTovLyIpICkgeyAgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoIHVybC5zdGFydHNXaXRoKCJodHRwOi8vIikgCS8vJE5PTi1OTFMtMSQKLQkJCQl8fCB1cmwuc3RhcnRzV2l0aCgiaHR0cHM6Ly8iKSAvLyROT04tTkxTLTEkCi0JCQkJfHwgdXJsLnN0YXJ0c1dpdGgoImZ0cDovLyIpICAvLyROT04tTkxTLTEkCi0JCQkJfHwgdXJsLnN0YXJ0c1dpdGgoInd3dy4iKSApIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCU1hdGNoZXIgbSA9IHBfZXh0ZXJuYWxfdXJsX3N0YXJ0V2l0aC5tYXRjaGVyKHVybCk7Ci0JCWlmIChtLmZpbmQoKSkgewotCQkJcmV0dXJuIChtLnN0YXJ0KDEpID09IDApOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhc2NyaXB0VXJsKFN0cmluZyB1cmwpIHsKLQkJaWYgKHVybCA9PSBudWxsICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB1cmwuc3RhcnRzV2l0aChVUkxfU1RSX01BSUxUTykKLQkJCQl8fCB1cmwudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFVSTF9TVFJfSkFWQVNDUklQVCk7Ci0JfQotCQotCS8qKgotCSAqIGZpbmQgdGhlIHJlc291cmNlIGZpbGUgYmFzZWQgb24gdGhlIHVybCwgY29weSB0aGUgZmlsZSB0byB0aGUgZGVzdGluYXRpb24KLQkgKiBmb2xkZXIuIGlmIHRoZSBmaWxlIGlzIGFuIGh0bWwgYXR0YWNobWVudCwgc2NhbiB0aGUgZmlsZSByZWN1cnNpdmVseSBhbmQKLQkgKiBjb3B5IGNvbnRhaW5lZCBpbWFnZXMsIHJlc291cmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQsIHRoZSBvd25lciBlbGVtZW50Ci0JICogQHBhcmFtIHJlc291cmNlRmlsZQotCSAqICAgICAgICAgICAgRmlsZSwgdGhlIHJlc291cmNlIGZpbGUKLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICBTdHJpbmcgdGhlIHVybCB0byBiZSBwcm9jZXNzZWQKLQkgKiBAcGFyYW0gY29udGVudFBhdGgKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgY29udGVudCBwYXRoIG9mIHRoZSB1cmwgb3duZXIsIHJlbGF0aXZlIHRvIHRoZQotCSAqICAgICAgICAgICAgc291cmNlIHJvb3QgcGF0aAotCSAqIEBwYXJhbSBzb3VyY2VSb290UGF0aAotCSAqICAgICAgICAgICAgRmlsZSB0aGUgc291cmNlIHJvb3QgcGF0aCwgdXN1YWxseSBpdCdzIHRoZSBsaWJyYXJ5IHJvb3QgcGF0aAotCSAqIEBwYXJhbSB0YXJnZXRSb290UGF0aAotCSAqICAgICAgICAgICAgRmlsZSB0aGUgdGFyZ2V0IHJvb3QgcGF0aCwgdXN1YWxseSBpdCdzIHRoZSBwdWJsaXNoaW5nIHJvb3QKLQkgKiAgICAgICAgICAgIHBhdGgKLQkgKiBAcGFyYW0gcm9vdENvbnRlbnRQYXRoIFN0cmluZyB0aGUgY29udGVudCBwYXRoIG9mIHRoZSByb290Ci0JICogQHBhcmFtIHByb2Nlc3NlZEl0ZW1zCi0JICogICAgICAgICAgICBMaXN0LCBhIGxpc3QgdG8gaG9sZCBhbGwgcHJvY2Vzc2VkIHVybHMsIHRvIGF2b2lkIGR1cGxpY2F0ZQotCSAqICAgICAgICAgICAgcHJvY2Vzc2luZwotCSAqIEBwYXJhbSB2YWxpZGF0b3IKLQkgKiAgICAgICAgICAgIElDb250ZW50VmFsaWRhdG9yCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGZpeGVkIHVybCwgbm90IHVzZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc1Jlc291cmNlVXJsKE1ldGhvZEVsZW1lbnQgb3duZXIsCi0JCQlGaWxlIHJlc291cmNlRmlsZSwgU3RyaW5nIHVybCwgU3RyaW5nIGNvbnRlbnRQYXRoLAotCQkJRmlsZSBzb3VyY2VSb290UGF0aCwgRmlsZSB0YXJnZXRSb290UGF0aCwgU3RyaW5nIHJvb3RDb250ZW50UGF0aCwgTGlzdCBwcm9jZXNzZWRJdGVtcywKLQkJCUlDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlpZiAodXJsID09IG51bGwgfHwgaXNFeHRlcm5hbExpbmsodXJsKSB8fCBpc0phdmFzY3JpcHRVcmwodXJsKQotCQkJCXx8IHVybC5zdGFydHNXaXRoKFVSTF9CT09LTUFSS19JTkRJQ0FUT1IpKSB7Ci0JCQlyZXR1cm4gdXJsOwotCQl9Ci0JCQotCQkvLyBpZiB0aGUgdXJsIGNvbnRhaW5zIHRoZSBndWlkLCBpdCBtaWdodCBiZSBzb21lIGtpbmQgb2YgZWxlbWVudCBsaW5rLAotCQkvLyBmb3IgZXhhbXBsZSwgYWN0aXZpdHkgY2FuIGhhdmUgbW9kZWwgdGhhbiBvbmUgZWxlbWVudCBsaW5rCi0JCVN0cmluZyBndWlkID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG93bmVyICE9IG51bGwpIHsKLQkJCWd1aWQgPSBvd25lci5nZXRHdWlkKCk7Ci0JCQlpZiAodXJsLmluZGV4T2YoZ3VpZCkgPj0gMCB8fCBpc0FjdGl2aXR5VGFiVXJsKHVybCkgKSB7CQkJCQotCQkJCXJldHVybiB1cmw7Ci0JCQl9CQkJCi0JCX0KLQkJCi0JCS8vIFB1Ymxpc2hpbmcgcmVwb3J0IGxpc3RzIG1pc3NpbmcgcmVzb3VyY2UgZmlsZXMgdGhhdAotCQkvLyBhcmUgcHJlc2VudAotCQkvLyBib29rbWFya3Mgc2hvdWxkIGJlIHN0cmlwcGVkIG91dCB3aGVuIGNoZWNraW5nIHJlc291cmNlCi0JCWludCBpbmRleCA9IHVybC5pbmRleE9mKFVSTF9CT09LTUFSS19JTkRJQ0FUT1IpOwotCQlpZiAoaW5kZXggPCAwKSB7Ci0JCQlpbmRleCA9IHVybC5pbmRleE9mKFVSTF9QQVJBTUVURVJfSU5ESUNBVE9SKTsKLQkJfQotCi0JCVN0cmluZyB1cmxfdGFpbCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbmRleCA+IDApIHsKLQkJCXVybF90YWlsID0gdXJsLnN1YnN0cmluZyhpbmRleCk7Ci0JCQl1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJfQotCi0JCVN0cmluZyBpbWFnZUZpbGUgPSBSZXNvdXJjZUhlbHBlci5nZXRGaWxlUGF0aEZyb21VcmwodXJsLCBjb250ZW50UGF0aCk7Ci0JCWlmIChpbWFnZUZpbGUgPT0gbnVsbCkgewotCQkJaWYgKHZhbGlkYXRvciAhPSBudWxsKSB7Ci0JCQkJdmFsaWRhdG9yLmxvZ01pc3NpbmdSZXNvdXJjZShvd25lciwgcmVzb3VyY2VGaWxlLCB1cmwpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCQotCQkvLyBpbmRleC5odG0gaXMgdGhlIGRlZmF1bHQgaW5kZXggZmlsZSwgYWx3YXlzIGlnbm9yZSBpdAotCQlpZiAoaW1hZ2VGaWxlLmVxdWFsc0lnbm9yZUNhc2UoImluZGV4Lmh0bSIpIHx8IGltYWdlRmlsZS5lcXVhbHNJZ25vcmVDYXNlKCJpbmRleC5odG1sIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl7Ci0JCQlyZXR1cm4gdXJsICsgdXJsX3RhaWw7Ci0JCX0KLQotCQlTdHJpbmcgbmV3VXJsID0gdXJsOwotCi0JCUZpbGUgc291cmNlOwotCQlGaWxlIGRlc3Q7Ci0JCQotCQkvLyBpZiB0aGUgdXJsIGlzIGEgbG9jYWwgZmlsZSBpbiBhbiBhYnNvbHV0ZSBwYXRoLCB3ZSBkb24ndCBjb3B5IHRoZSBmaWxlLCBsZWF2ZSBhcyBpcwotCQlzb3VyY2UgPSBuZXcgRmlsZShpbWFnZUZpbGUpOwotCQlpZiAoIHNvdXJjZS5leGlzdHMoKSApIHsKLQkJCXJldHVybiB1cmwgKyB1cmxfdGFpbDsKLQkJfQotCi0JCS8vIGlmIHJvb3QgQ29udGVudCBwYXRoIGlzIHNldCwgcmVtb3ZlIGZyb20gdGhlIGZpbGUgcGF0aAotCQlib29sZWFuIHVzZVB1YlJvb3QgPSB0cnVlOwotCQlTdHJpbmcgZmlsZVBhdGggPSBpbWFnZUZpbGU7Ci0JCWlmICggcm9vdENvbnRlbnRQYXRoICE9IG51bGwgJiYgcm9vdENvbnRlbnRQYXRoLmxlbmd0aCgpID4gMCApIHsKLQkJCWlmICggZmlsZVBhdGguc3RhcnRzV2l0aChyb290Q29udGVudFBhdGgpICkgewotCQkJCWZpbGVQYXRoID0gZmlsZVBhdGguc3Vic3RyaW5nKHJvb3RDb250ZW50UGF0aC5sZW5ndGgoKSk7Ci0JCQkJdXNlUHViUm9vdCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCS8vIGNoZWNrIGlmIHRoaXMgaXMgYSByZWFsIGZpbGUsIGlmIG5vdCwgaXQgaXMgYSByZWZlcmVuY2UgdG8gYSBiYXNlCi0JCS8vIHBsdWdpbgotCQlzb3VyY2UgPSBuZXcgRmlsZShzb3VyY2VSb290UGF0aCwgZmlsZVBhdGgpOwotCQkKLQkJLy8gaWYgdGhlIHNvdXJjZSBkb2VzIG5vdCBleGlzdCwgbWlnaHQgYmUgYSByZWZlcmVuY2UgdG8gYSByZXNvdXJjZSBpbiBhbm90aGVyIHBsdWdpbj8KLQkJLy8gZm9yIGV4YW1wbGUsIGlmIHRoZSBjb250ZW50IGlzIGNvbnRyaWJ1dGVkIGZyb20gYW5vdGhlciBlbGVtZW50IGluIGFub3RoZXIgcGx1Z2luLCB0aGlzIHdpbGwgaGFwcGVuCi0JCWlmICghc291cmNlLmV4aXN0cygpKSB7Ci0JCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciBtZ3IgPSBnZXRSZXNvdXJjZU1ncihvd25lcik7Ci0JCQlpZiAoIG1nciAhPSBudWxsICkgewotCQkJCVN0cmluZyB0bXBQYXRoID0gbWdyLnJlc29sdmUob3duZXIsIGZpbGVQYXRoKTsKLQkJCQlpZiAoIHRtcFBhdGggIT0gbnVsbCApIHsKLQkJCQkJc291cmNlID0gbmV3IEZpbGUodG1wUGF0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBpZiB0aGUgZmlsZSBpcyBub3QgaW4gdGhlIGxpYnJhcnksIGNoZWNrIHRoZSBwbHVnaW4gbGF5b3V0IGZvbGRlcgotCQlpZiAoIXNvdXJjZS5leGlzdHMoKSkgewotCQkJc291cmNlID0gbmV3IEZpbGUoTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF5b3V0UGF0aCgpLAotCQkJCQlmaWxlUGF0aCk7Ci0JCX0KLQotCQkvLyBpZiB0aGUgZmlsZVBhdGggaXMgcmVsYXRpdmUgdG8gdGhlIHB1YiByb290LCBmaXggdGhlIHRhcmdldCBwYXRoCi0JCWlmICggdXNlUHViUm9vdCAmJiByb290Q29udGVudFBhdGggIT0gbnVsbCAmJiByb290Q29udGVudFBhdGgubGVuZ3RoKCkgPiAwICkgewotCQkJRmlsZSB0bXBmID0gIG5ldyBGaWxlKHJvb3RDb250ZW50UGF0aCk7Ci0JCQl3aGlsZSAoIHRtcGYgIT0gbnVsbCApIHsKLQkJCQl0bXBmID0gdG1wZi5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJdGFyZ2V0Um9vdFBhdGggPSB0YXJnZXRSb290UGF0aC5nZXRQYXJlbnRGaWxlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWRlc3QgPSBuZXcgRmlsZSh0YXJnZXRSb290UGF0aCwgZmlsZVBhdGgpOwotCi0JCWlmIChzb3VyY2UuZXhpc3RzKCkpIHsKLQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNvdXJjZSwgZGVzdCk7Ci0KLQkJCS8vIGlmIHRoZSBmaWxlIGlzIGFuIGh0bWwgYXR0YWNobWVudCwgbmVlZCB0byBzY2FuIHRoZSBmaWxlIGFuZCBjb3B5Ci0JCQkvLyB0aGUgcmVmZXJlbmNlZCBmaWxlIGluIGl0LCByZWN1cnNpdmVseQotCQkJaWYgKGltYWdlRmlsZS5lbmRzV2l0aChSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE0pCi0JCQkJCXx8IGltYWdlRmlsZS5lbmRzV2l0aChSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MKSkgewotCQkJCUZpbGUgZiA9IG5ldyBGaWxlKGltYWdlRmlsZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzb2x2ZVJlc291cmNlcyhvd25lciwgZiwgRmlsZVV0aWwucmVhZEZpbGUoc291cmNlLAotCQkJCQkJCUZpbGVVdGlsLkVOQ09ESU5HX1VURl84KS50b1N0cmluZygpLCBmLmdldFBhcmVudCgpLAotCQkJCQkJCXNvdXJjZVJvb3RQYXRoLCB0YXJnZXRSb290UGF0aCwgcm9vdENvbnRlbnRQYXRoLCBwcm9jZXNzZWRJdGVtcywKLQkJCQkJCQl2YWxpZGF0b3IpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgdGhlIGRlc3RpbmF0aW9uIGZpbGUgaXMgdGhlcmUsIG1pZ2h0IGJlIGdlbmVyYXRlZCBkeW5hbWljYWxseSwgc28KLQkJLy8gZG9uJ3QgbG9nIGl0Ci0JCWVsc2UgaWYgKCFkZXN0LmV4aXN0cygpICYmIGlzVmFsaWRGaWxlVXJsKHVybCkgJiYgKHZhbGlkYXRvciAhPSBudWxsKSkgewotCQkJdmFsaWRhdG9yLmxvZ01pc3NpbmdSZXNvdXJjZShvd25lciwgcmVzb3VyY2VGaWxlLCB1cmwpOwotCQl9Ci0KLQkJcmV0dXJuIG5ld1VybCArIHVybF90YWlsOwotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0FjdGl2aXR5VGFiVXJsKFN0cmluZyB1cmwpIHsKLQkJcmV0dXJuIEFjdGl2aXR5TGF5b3V0LmlzQWN0aXZpdHlUYWJVcmwodXJsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRmlsZVVybChTdHJpbmcgdXJsKSB7Ci0JCS8vIGp1c3QgYSB0ZW1wIHNvbHV0aW9uIGhlcmUgdG8gZ2V0IHJpZCBvZiB0aGUgd3JvbmcgcmVwb3J0aW5nIG9mIG1zc2luZwotCQkvLyByZXNvdXJjZQotCQlpZiAodXJsID09IG51bGwgfHwgdXJsLmVxdWFscygiJyArIGRpYWdyYW1faW1nICsgJyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIHJlc29sdmUgdGhlIGltYWdlcyBpbiB0aGUgdGV4dC4gY29weSB0aGUgaW1hZ2UgdG8gZGVzdGluYXRpb24gaWYgbmVlZGVkCi0JICogVGhpcyBpcyB1c2VkIGZvciBjb3B5aW5nIHJlc291cmNlcyBmcm9tIGEgbGlicmFyeSB0byBhbm90aGVyIGRlc3RpbmF0aW9uCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50LCB0aGUgb3duZXIgZWxlbWVudAotCSAqIEBwYXJhbSByZXNvdXJjZUZpbGUKLQkgKiAgICAgICAgICAgIEZpbGUsIHRoZSByZXNvdXJjZSBmaWxlCi0JICogQHBhcmFtIGNvbnRlbnQKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgY29udGVudCBzdHJpbmcgdG8gYmUgcHJvY2Vzc2VkCi0JICogQHBhcmFtIGNvbnRlbnRQYXRoCi0JICogICAgICAgICAgICBTdHJpbmcgdGhlIGNvbnRlbnQgcGF0aCBvZiB0aGUgc291cmNlIHRleHQsIHJlbGF0aXZlIHRvIHRoZQotCSAqICAgICAgICAgICAgc291cmNlIHJvb3QgcGF0aAotCSAqIEBwYXJhbSBzb3VyY2VSb290UGF0aAotCSAqICAgICAgICAgICAgRmlsZSB0aGUgc291cmNlIHJvb3QgcGF0aCwgdXN1YWxseSBpdCdzIHRoZSBsaWJyYXJ5IHJvb3QgcGF0aAotCSAqIEBwYXJhbSB0YXJnZXRSb290UGF0aAotCSAqICAgICAgICAgICAgRmlsZSB0aGUgdGFyZ2V0IHJvb3QgcGF0aCwgdXN1YWxseSBpdCdzIHRoZSBwdWJsaXNoaW5nIHJvb3QKLQkgKiAgICAgICAgICAgIHBhdGgKLQkgKiBAcGFyYW0gcm9vdENvbnRlbnRQYXRoIFN0cmluZyB0aGUgY29udGVudCBwYXRoIG9mIHRoZSByb290Ci0JICogQHBhcmFtIHByb2Nlc3NlZEl0ZW1zCi0JICogICAgICAgICAgICBMaXN0LCBhIGxpc3QgdG8gaG9sZCBhbGwgcHJvY2Vzc2VkIHVybHMsIHRvIGF2b2lkIGR1cGxpY2F0ZQotCSAqICAgICAgICAgICAgcHJvY2Vzc2luZwotCSAqIEBwYXJhbSB2YWxpZGF0b3IKLQkgKiAgICAgICAgICAgIElDb250ZW50VmFsaWRhdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlc29sdmVSZXNvdXJjZXMoTWV0aG9kRWxlbWVudCBvd25lciwgRmlsZSByZXNvdXJjZUZpbGUsCi0JCQlTdHJpbmcgY29udGVudCwgU3RyaW5nIGNvbnRlbnRQYXRoLCBGaWxlIHNvdXJjZVJvb3RQYXRoLAotCQkJRmlsZSB0YXJnZXRSb290UGF0aCwgU3RyaW5nIHJvb3RDb250ZW50UGF0aCwgTGlzdCBwcm9jZXNzZWRJdGVtcywKLQkJCUlDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQl0cnkgewotCQkJLy8gcHJvY2VzcyBpbWFnZXMKLQkJCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfaW1hZ2VfcmVmLm1hdGNoZXIoY29udGVudCk7Ci0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmcgdXJsID0gbS5ncm91cCgzKTsKLQkJCQlpZiAoIXByb2Nlc3NlZEl0ZW1zLmNvbnRhaW5zKHVybCkpIHsKLQkJCQkJLy8gbm90ZTogYWRkIHRoZSB1cmwgaW50byB0aGUgcHJvY2Vzc2VkSXRlbXMgbGlzdCBmaXJzdCwKLQkJCQkJLy8gb3RoZXJ3aXNlIG1heSBnZXQgZGVhZGxvY2sgaWYgdGhlIHVybCBjb250ZW50IGhhcwotCQkJCQkvLyByZWZlcmVuY2UgYmFjayB0byB0aGUgb3duZXIKLQkJCQkJcHJvY2Vzc2VkSXRlbXMuYWRkKHVybCk7Ci0JCQkJCVJlc291cmNlSGVscGVyLnByb2Nlc3NSZXNvdXJjZVVybChvd25lciwgcmVzb3VyY2VGaWxlLCB1cmwsCi0JCQkJCQkJY29udGVudFBhdGgsIHNvdXJjZVJvb3RQYXRoLCB0YXJnZXRSb290UGF0aCwgcm9vdENvbnRlbnRQYXRoLCAKLQkJCQkJCQlwcm9jZXNzZWRJdGVtcywgdmFsaWRhdG9yKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCW0gPSBSZXNvdXJjZUhlbHBlci5wX2Nzc19yZWYubWF0Y2hlcihjb250ZW50KTsKLQkJCXdoaWxlIChtLmZpbmQoKSkgewotCQkJCVN0cmluZyBjc3NVUkwgPSBtLmdyb3VwKDEpOwotCi0JCQkJLy8gaXQncyBoYXJkIHRvIHRlbGwgaWYgdGhpcyBpcyBhIHJpZ2h0IG1hdGNoIG9yIG5vdAotCQkJCS8vIHNpbmNlIHdlIGNhbid0IHRlbGwgaWYgdGhlIG1hdGNoZWQgb25lIGlzIGFjdHVhbGx5IGZyb20gYSBjc3MKLQkJCQkvLyBvciBqdXN0IGEgaHRtbCB0ZXh0Ci0JCQkJLy8gZm9yIGV4YW1wbGUsIHRleHQgY2FuIGhhdmUgc29tZXRoaW5nIGxpa2UgdXJsKHh4eCkgd2hpY2ggaXMKLQkJCQkvLyBtYXRjaGVkIGhlcmUKLQkJCQkvLyB3ZSBkb24ndCB3YW50IHRvIHJlcG9ydCBtaXNzaW5nIHJlc291cmNlIGZvciB0aGlzCi0JCQkJLy8gc28gZG9uJ3Qgc2V0IHRoZSB2YWxpZGF0b3IKLQkJCQkvLyBQdWJsaXNoaW5nIHdhcm5pbmdzOiBpbmFwcHJvcHJpYXRlIHdhcm5pbmdzCi0JCQkJLy8gY29taW5nIGZyb20gcmVxdWlyZWQgY29weXJpdGUuaHRtCi0KLQkJCQlpZiAoIXByb2Nlc3NlZEl0ZW1zLmNvbnRhaW5zKGNzc1VSTCkpIHsKLQkJCQkJLy8gbm90ZTogYWRkIHRoZSB1cmwgaW50byB0aGUgcHJvY2Vzc2VkSXRlbXMgbGlzdCBmaXJzdCwKLQkJCQkJLy8gb3RoZXJ3aXNlIG1heSBnZXQgZGVhZGxvY2sgaWYgdGhlIHVybCBjb250ZW50IGhhcwotCQkJCQkvLyByZWZlcmVuY2UgYmFjayB0byB0aGUgb3duZXIKLQkJCQkJcHJvY2Vzc2VkSXRlbXMuYWRkKGNzc1VSTCk7Ci0JCQkJCVJlc291cmNlSGVscGVyCi0JCQkJCQkJLnByb2Nlc3NSZXNvdXJjZVVybChvd25lciwgcmVzb3VyY2VGaWxlLCBjc3NVUkwsCi0JCQkJCQkJCQljb250ZW50UGF0aCwgc291cmNlUm9vdFBhdGgsCi0JCQkJCQkJCQl0YXJnZXRSb290UGF0aCwgcm9vdENvbnRlbnRQYXRoLCBwcm9jZXNzZWRJdGVtcywgbnVsbC8qIHZhbGlkYXRvciAqLyk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBwcm9jZXNzIGF0dGFjaG1lbnRzCi0JCQltID0gUmVzb3VyY2VIZWxwZXIucF9saW5rX3JlZl9nZW4ubWF0Y2hlcihjb250ZW50KTsKLQkJCXdoaWxlIChtLmZpbmQoKSkgewotCQkJCS8vIFN0cmluZyB0YWcgPSBtLmdyb3VwKDEpOwotCQkJCVN0cmluZyB1cmx0ZXh0ID0gbS5ncm91cCgyKTsKLQkJCQlpZiAoUmVzb3VyY2VIZWxwZXIuZ2V0R3VpZEZyb21VcmwodXJsdGV4dCkgPT0gbnVsbCkgewotCQkJCQlNYXRjaGVyIG0yID0gUmVzb3VyY2VIZWxwZXIucF9saW5rX2hyZWZfcGlja2VyCi0JCQkJCQkJLm1hdGNoZXIoIiAiICsgdXJsdGV4dCArICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlpZiAobTIuZmluZCgpKSB7Ci0JCQkJCQlTdHJpbmcgdXJsID0gbTIuZ3JvdXAoMSkudHJpbSgpLnJlcGxhY2VBbGwoIlwiIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWlmICghcHJvY2Vzc2VkSXRlbXMuY29udGFpbnModXJsKSkgewotCQkJCQkJCS8vIG5vdGU6IGFkZCB0aGUgdXJsIGludG8gdGhlIHByb2Nlc3NlZEl0ZW1zIGxpc3QKLQkJCQkJCQkvLyBmaXJzdCwgb3RoZXJ3aXNlIG1heSBnZXQgZGVhZGxvY2sgaWYgdGhlIHVybAotCQkJCQkJCS8vIGNvbnRlbnQgaGFzIHJlZmVyZW5jZSBiYWNrIHRvIHRoZSBvd25lcgotCQkJCQkJCXByb2Nlc3NlZEl0ZW1zLmFkZCh1cmwpOwotCQkJCQkJCVJlc291cmNlSGVscGVyLnByb2Nlc3NSZXNvdXJjZVVybChvd25lciwKLQkJCQkJCQkJCXJlc291cmNlRmlsZSwgdXJsLCBjb250ZW50UGF0aCwKLQkJCQkJCQkJCXNvdXJjZVJvb3RQYXRoLCB0YXJnZXRSb290UGF0aCwgcm9vdENvbnRlbnRQYXRoLCAKLQkJCQkJCQkJCXByb2Nlc3NlZEl0ZW1zLCB2YWxpZGF0b3IpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogdGFrZSB0aGUgdGFnIGF0dHJpYnV0ZXMgc3RyaW5nIGFzIGlucHV0IGFuZCByZXR1cm5zIHRoZSBhdHRyaWJ1dGUKLQkgKiBuYW1lLXZhbHVlIG1hcAotCSAqIAotCSAqIEBwYXJhbSBhdHRyaWJ1dGVzU3RyCi0JICogQHJldHVybiBNYXAgdGhlIGF0dHJpYnV0ZSBuYW1lLXZhbHVlIG1hcAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldFRhZ0F0dHJpYnV0ZXMoU3RyaW5nIGF0dHJpYnV0ZXNTdHIpIHsKLQkJdHJ5IHsKLQkJCS8vIHVzZSBMaW5rZWRIYXNoTWFwIHRvIHJlc2VydmUgdGhlIG9yZGVyIG9mIHRoZSBhdHRyaWJ1dGVzCi0JCQlNYXAgYXR0cmlidXRlTWFwID0gbmV3IExpbmtlZEhhc2hNYXAoMyk7Ci0JCQlNYXRjaGVyIG0yID0gcF90YWdfYXR0cmlidXRlcy5tYXRjaGVyKGF0dHJpYnV0ZXNTdHIpOwotCi0JCQl3aGlsZSAobTIuZmluZCgpKSB7Ci0JCQkJU3RyaW5nIGF0dHJOYW1lID0gbTIuZ3JvdXAoMSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7Ci0JCQkJU3RyaW5nIGF0dHJWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKG0yLmdyb3VwKDMpICE9IG51bGwpIHsKLQkJCQkJYXR0clZhbHVlID0gbTIuZ3JvdXAoMykudHJpbSgpOwotCQkJCX0gZWxzZSBpZiAobTIuZ3JvdXAoMikgIT0gbnVsbCkgewotCQkJCQlhdHRyVmFsdWUgPSBtMi5ncm91cCgyKS50cmltKCk7Ci0JCQkJfQkJCQkKLQkJCi0JCQkJLy8gQ2Fubm90IFByZXZpZXcvQnJvd3NlIERlc2NyaXB0aW9uIFRhYiB3aGVuCi0JCQkJLy8gdGhlIENQIGNvbnRhaW5zIGNoaW5lc2UgY2hhcmFjdGVycwotCQkJCS8vIGdlbmVyYXRlZCBodG1sIGZyb20geHNsdCBnb3QgdGhlIGhyZWYgdXJscyBlbmNvZGVkLiB3ZSBkb24ndCB3YW50Ci0JCQkJLy8gdGhhdCBtYWtlIHN1cmUgZGVjb2RlIHRoZSB1cmwgdXNpbmcgIlVURi04IiBlbmNvZGluZwotCQkJCWlmIChhdHRyTmFtZS5lcXVhbHMoVEFHX0FUVFJfSFJFRikpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWF0dHJWYWx1ZSA9IFVSTERlY29kZXIuZGVjb2RlKGF0dHJWYWx1ZSwgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9CQkJCQkKLQkJCQl9Ci0JCQkJYXR0cmlidXRlTWFwLnB1dChhdHRyTmFtZSwgYXR0clZhbHVlKTsKLQkJCX0KLQkJCXJldHVybiBhdHRyaWJ1dGVNYXA7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CQkJCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHJldHVybnMgdGhlIGF0dHJpYnV0ZSBuYW1lLXZhbHVlIG1hcCBmb3IgYW4gSFRNTCBsaW5rCi0JICogCi0JICogQHBhcmFtIGxpbmsKLQkgKiBAcmV0dXJuIE1hcAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldEF0dHJpYnV0ZXNGcm9tTGluayhTdHJpbmcgbGluaykgewotCQlNYXRjaGVyIG0gPSBwX2xpbmtfcmVmLm1hdGNoZXIobGluayk7Ci0JCWlmIChtLmZpbmQoKSkgewotCQkJU3RyaW5nIGF0dHJpYnV0ZXMgPSBtLmdyb3VwKDEpOwotCQkJcmV0dXJuIGdldFRhZ0F0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyB0aGUgYXR0cmlidXRlIG5hbWUtdmFsdWUgbWFwIGZvciBhbiBIVE1MIGxpbmsKLQkgKiAKLQkgKiBAcGFyYW0gbGluawotCSAqIEByZXR1cm4gTWFwCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0QXR0cmlidXRlc0Zyb21MaW5rKFBhdHRlcm4gcGF0dGVybiwgU3RyaW5nIGxpbmspIHsKLQkJTWF0Y2hlciBtID0gcGF0dGVybi5tYXRjaGVyKGxpbmspOwotCQlpZiAobS5maW5kKCkpIHsKLQkJCVN0cmluZyBhdHRyaWJ1dGVzID0gbS5ncm91cCgxKTsKLQkJCXJldHVybiBnZXRUYWdBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiB0YWtlcyBhbiBhdHRyaWJ1dGVNYXAgKGllLCBmcm9tICNnZXRUYWdBdHRyaWJ1dGVzKSBhbmQgcmV0dXJucyB0aGUgU3RyaW5nCi0JICogcmVwcmVzZW50YXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gYXR0cmlidXRlTWFwCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGVzQXNTdHJpbmcoTWFwIGF0dHJpYnV0ZU1hcCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBhdHRyaWJ1dGVNYXAuZ2V0KGtleSk7Ci0JCQlpZiAoYnVmLmxlbmd0aCgpID4gMCkKLQkJCQlidWYuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1Zi5hcHBlbmQoa2V5ICsgIj1cIiIgKyB2YWx1ZSArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQmFkIGxpbmsgZnJvbSBXZWxjb21lIHBhZ2UgaHVtcCBjaGFydAotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREaXNjYXJkZWRFbGVtZW50VVJMKE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LAotCQkJTWV0aG9kRWxlbWVudCBsaW5rRWxlbWVudCwgU3RyaW5nIGd1aWQsIFN0cmluZyBwdWJEaXIpIHsKLQkJU3RyaW5nQnVmZmVyIGRpc2NhcmRlZEVsZW1lbnRVUkwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJZGlzY2FyZGVkRWxlbWVudFVSTC5hcHBlbmQoTUlTU0lOR19QQUdFU19GT0xERVIpLmFwcGVuZCgKLQkJCQkicGFnZXNfbm90X2luc3RhbGxlZCIpLmFwcGVuZChGSUxFX0VYVF9IVE1MKTsgLy8kTk9OLU5MUy0xJAotCi0JCUZpbGUgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKHB1YkRpciwgZGlzY2FyZGVkRWxlbWVudFVSTC50b1N0cmluZygpKTsKLQkJRmlsZSBkaXIgPSBvdXRwdXRGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJaWYgKCFkaXIuZXhpc3RzKCkpIHsKLQkJCWRpci5ta2RpcnMoKTsKLQkJfQotCi0JCS8vIGdlbmVyYXRlIHRoZSBodG1sIGZpbGUKLQkJWG1sRWxlbWVudCB4bWwgPSBuZXcgWG1sRWxlbWVudCgiRWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0KLQkJeG1sCi0JCQkJLnNldEF0dHJpYnV0ZSgiZ3VpZCIsIGd1aWQpLnNldEF0dHJpYnV0ZSgidHlwZSIsIGxpbmtFbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCkpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBsaW5rRWxlbWVudC5nZXROYW1lKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJInBsdWdpbk5hbWUiLCBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4obGlua0VsZW1lbnQpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQJCQkJCQkJCQotCQlTdHJpbmcgeHNsUGF0aCA9IExheW91dFJlc291cmNlcy5nZXREZWZhdWx0WHNsUGF0aCgicGFnZV9ub3RfaW5zdGFsbGVkIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQl0cnkgewotCQkJU3RyaW5nQnVmZmVyIHhtbDIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQl4bWwyLmFwcGVuZChYbWxIZWxwZXIuWE1MX0hFQURFUikuYXBwZW5kKHhtbC50b1htbCgpKTsKLQotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dHB1dCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0JCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpLCAidXRmLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJUHJvcGVydGllcyB4c2xQYXJhbXMgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcm9wZXJ0aWVzKAotCQkJCQkiL2xheW91dC94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlYU0xUUHJvY2Vzc29yCi0JCQkJCS50cmFuc2Zvcm0oeHNsUGF0aCwgeG1sMi50b1N0cmluZygpLCB4c2xQYXJhbXMsIG91dHB1dCk7Ci0JCQlvdXRwdXQuZmx1c2goKTsKLQkJCW91dHB1dC5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIGdldEJhY2tQYXRoKG93bmVyRWxlbWVudCkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJykKLQkJCQkrIGRpc2NhcmRlZEVsZW1lbnRVUkwudG9TdHJpbmcoKTsKLQl9Ci0JCi0JCi0JCi0JLyoqCi0JICogRk9SIFVTRSBXSVRIIFJJQ0ggVEVYVCBFRElUT1IKLQkgKiB2YWxpZGF0ZSB0aGUgY29udGVudCBieSBjaGVja2luZyBlbGVtZW50IGxpbmtzIGFuZCBpbWFnZXMsIGZvciB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBvd25lcgotCSAqIAotCSAqIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZSB2YWxpZGF0ZUNvbnRlbnQgbWV0aG9kLCBleGNlcHQgaXQgZG9lcyBub3QgZGVjb2RlIHRoZSByZXN1bHRzCi0JICogdmlhIFVSTERlY29kZXIuZGVjb2RlKCkKLQkgKiAKLQkgKiAgdGhpcyB3aWxsIGRvIHRoZSBmb2xsb3dpbmcgdG8gdGhlIEhUTUw6Ci0JICogIDEuICB1cGRhdGUgRWxlbWVudCBMaW5rcwotCSAqICAyLiAgY2hhbmdlIDxBIC4uPiB0byA8YSAuLj4KLQkgKiAgMy4gIGNoYW5nZSA8L0E+IHRvIDwvYT4KLQkgKiAgNC4gIGFkZCBkb3VibGUtcXVvdGVzICgiKSBhcm91bmQgYWxsIGF0dHJpYnV0ZSB2YWx1ZXMgaWYgdGhleSBhcmUgbWlzc2luZwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50LCB0aGUgZWxlbWVudCB0aGF0IG93bnMgdGhlIGNvbnRlbnQKLQkgKiBAcGFyYW0gY29udGVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIE1ldGhvZENvbmZpZ3VyYXRpb24gdGhlIGNvbmZpZ3VyYXRpb24gdG8gd2hpY2ggdGhlIGNvbnRlbnQgaXMKLQkgKiAgICAgICAgICAgIHZhbGlkYXRlZAotCSAqIEBwYXJhbSBsaW5rZWRFbGVtZW50cwotCSAqICAgICAgICAgICAgTGlzdCBhIHBhc3NlZCBpbiBsaXN0IHRvIGNvbGxlY3QgdGhlIGxpbmtlZCBlbGVtZW50cyBpbiB0aGlzCi0JICogICAgICAgICAgICBjb250ZW50LCBpZiBudWxsLCBubyBsaW5rZWQgZWxlbWVudHMgYXJlIGNvbGxlY3RlZC4KLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgdmFsaWRhdGVkIGNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YWxpZGF0ZVJpY2hUZXh0Q29udGVudChNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBzb3VyY2UsIElDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvcikgewotIAkJdHJ5IHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQkJCQotCQkJLy8gZmlyc3QgdmFsaWRhdGUgdGhlIHRhZ3MsIHJlbW92ZSBhbnkgQ0YvTEYgZnJvbSB0aGUgdGFnIHRleHQKLQkJCXNvdXJjZSA9IHZhbGlkYXRlVGFnKHNvdXJjZSk7Ci0KLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCU1hdGNoZXIgbSA9IHBfbGlua19yZWYubWF0Y2hlcihzb3VyY2UpOwotCi0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmcgdGV4dCA9IG0uZ3JvdXAoKTsKLQotCQkJCS8vIFByb2JsZW1zIHBhcnNpbmcgPGEgaHJlZj4gdGFncwotCQkJCS8vIG5lZWQgdG8gcmVtb3ZlIGFsbCBMRiwgQ1Igd2l0aGluIHRoZSA8YSAuLj4gdGFnCi0JCQkJU3RyaW5nIHVybHRleHQgPSBtLmdyb3VwKDEpOwotCQkJCVN0cmluZyBsaW5rZWRUZXh0ID0gbS5ncm91cCgyKTsKLQkJCQlMaW5rSW5mbyBpbmZvID0gdmFsaWRhdG9yLnZhbGlkYXRlTGluayhlbGVtZW50LCB1cmx0ZXh0LAotCQkJCQkJbGlua2VkVGV4dCwgY29uZmlnLCAiYSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQl0ZXh0ID0gaW5mby5nZXRIdG1sKHZhbGlkYXRvci5zaG93QnJva2VuTGlua3MoKSkudG9TdHJpbmcoKTsKLQkJCQkJTWV0aG9kRWxlbWVudCBlID0gaW5mby5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQkJCXZhbGlkYXRvci5hZGRSZWZlcmVuY2VkRWxlbWVudChlbGVtZW50LCBlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCVN0cmluZyByZXBsYWNlbWVudCA9IHRleHQucmVwbGFjZUFsbCgiZmlsZTovLy8iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnQucmVwbGFjZUFsbCgiZmlsZTovLyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVnRXhwRXNjYXBlKHJlcGxhY2VtZW50KSk7Ci0JCQl9Ci0KLQkJCW0uYXBwZW5kVGFpbChzYik7Ci0KLQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJCX0KLQotCQkJLy8gYWxzbyBmaXggdGhlIGFyZWEgbWFwCi0JCQlzb3VyY2UgPSBzYi50b1N0cmluZygpOwotCQkJbSA9IHBfYXJlYV9yZWYubWF0Y2hlcihzb3VyY2UpOwotCQkJc2Iuc2V0TGVuZ3RoKDApOwotCi0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmcgdGV4dCA9IG0uZ3JvdXAoKTsKLQotCQkJCS8vIFByb2JsZW1zIHBhcnNpbmcgPGEgaHJlZj4gdGFncwotCQkJCS8vIG5lZWQgdG8gcmVtb3ZlIGFsbCBMRiwgQ1Igd2l0aGluIHRoZSA8YSAuLj4gdGFnCi0JCQkJU3RyaW5nIHVybHRleHQgPSBtLmdyb3VwKDEpOwotCQkJCUxpbmtJbmZvIGluZm8gPSB2YWxpZGF0b3IudmFsaWRhdGVMaW5rKGVsZW1lbnQsIHVybHRleHQsCi0JCQkJCQkiIiwgY29uZmlnLCAiYXJlYSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJCXRleHQgPSBpbmZvLmdldEh0bWwodmFsaWRhdG9yLnNob3dCcm9rZW5MaW5rcygpKS50b1N0cmluZygpOwotCQkJCQlNZXRob2RFbGVtZW50IGUgPSBpbmZvLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJCQkJaWYgKGUgIT0gbnVsbCkgewotCQkJCQkJdmFsaWRhdG9yLmFkZFJlZmVyZW5jZWRFbGVtZW50KGVsZW1lbnQsIGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gdGV4dC5yZXBsYWNlQWxsKCJmaWxlOi8vLyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudC5yZXBsYWNlQWxsKCJmaWxlOi8vIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCByZWdFeHBFc2NhcGUocmVwbGFjZW1lbnQpKTsKLQkJCX0KLQotCQkJbS5hcHBlbmRUYWlsKHNiKTsKLQotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCX0KLQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotLy8JLyoqCi0vLwkgKiBjb3B5IGFsbCByZXNvdXJjZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQgdG8gdGhlIHRhcmdldCBsb2NhdGlvbi4KLS8vCSAqIHJlY3Vyc2l2ZSBhbGwgaXQncyBjb250YWluZWQgZWxlbWVudHMgaWYgcmVjdXJzaXZlIGlzIHRydWUuCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSBlbGVtZW50Ci0vLwkgKiBAcGFyYW0gZnJvbQotLy8JICogQHBhcmFtIHRvCi0vLwkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5QWxsUmVzb3VyY2VzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRmlsZSBmcm9tLCBGaWxlIHRvLCBib29sZWFuIHJlY3Vyc2l2ZSkgewotLy8JCQotLy8JCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBDb250ZW50UmVzb3VyY2VTY2FubmVyKGZyb20sIHRvLCApOwotLy8JCXNjYW5uZXIuc2V0VGFyZ2V0Um9vdFBhdGgodG8pOwotLy8JCXNjYW5uZXIuY29weVJlc291cmNlcyhlbGVtZW50KTsKLS8vCQkKLS8vCQlpZiAoIHJlY3Vyc2l2ZSApIHsKLS8vCQkJZm9yICggSXRlcmF0b3IgaXQgPSBlbGVtZW50LmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7ICkgewotLy8JCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLS8vCQkJCWlmICggb2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApIHsKLS8vCQkJCQlzY2FubmVyLmNvcHlSZXNvdXJjZXMoKE1ldGhvZEVsZW1lbnQpb2JqKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5QYXRoKE1ldGhvZEVsZW1lbnQgZSkgewkJCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJcmV0dXJuIGdldEZvbGRlckFic29sdXRlUGF0aChwbHVnaW4pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpblBhdGgoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlyZXR1cm4gZ2V0Rm9sZGVyQWJzb2x1dGVQYXRoKHBsdWdpbik7Ci0JfQotCQotCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9SZXNvdXJjZVV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1Jlc291cmNlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmUzM2FhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1Jlc291cmNlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgZm9yIG1hbmFnaW5nIHRoZSBNZXRob2QgTGlicmFyeSBhcyBhIHByb2plY3QgaW4gdGhlIEVjbGlwc2UKLSAqIHdvcmtzcGFjZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VVdGlsIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtZXRob2RMaWJyYXJ5TmF0dXJlID0gIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtZXRob2RMaWJyYXJ5TmF0dXJlcyA9IHsgbWV0aG9kTGlicmFyeU5hdHVyZSB9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1ZyA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NLX0ZJTEVOQU1FID0gIi5sb2NrIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGxpYiBNZXRob2RMaWJyYXJ5Ci0JICogQHBhcmFtIG1vbml0b3IgSVByb2dyZXNzTW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgb3BlbihNZXRob2RMaWJyYXJ5IGxpYiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJb3BlbihnZXRMaWJyYXJ5RGlyZWN0b3J5KGxpYiksIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBsaWJEaXIgU3RyaW5nCi0JICogQHBhcmFtIG1vbml0b3IgSVByb2dyZXNzTW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgb3BlbihTdHJpbmcgbGliRGlyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgobGliRGlyICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkrIElQcm9qZWN0RGVzY3JpcHRpb24uREVTQ1JJUFRJT05fRklMRV9OQU1FKTsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCWRlc2NyaXB0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpCi0JCQkJCS5sb2FkUHJvamVjdERlc2NyaXB0aW9uKHBhdGgpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJLy8gbWlzc2luZyAucHJvamVjdCBmaWxlCi0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiMjIyAtIGV4Y2VwdGlvbiBpbiBsb2FkUHJvamVjdERlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCQkvLyAucHJvamVjdCBmaWxlIGlzIG1pc3NpbmcgLSBjcmVhdGUgYSBuZXcgcHJvamVjdAotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIiMjIyAtIGNyZWF0aW5nIG5ldyBtZXRob2QgbGlicmFyeSBwcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcHJvamVjdCA9IGNyZWF0ZVZhbGlkUHJvamVjdEZyb21QYXRoKGxpYkRpciwgbW9uaXRvcik7Ci0JCQl9IGVsc2UgewotCQkJCS8vIC5wcm9qZWN0IGZpbGUgZXhpc3RzCi0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiIyMjIC0gb3BlbmluZyBleGlzdGluZyBtZXRob2QgbGlicmFyeSBwcm9qZWN0ICIgKyBkZXNjcmlwdGlvbi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQkJLy8gY2hlY2sgaWYgcHJvamVjdCBvZiB0aGlzIG5hbWUgZXhpc3RzIGluIHdvcmtzcGFjZQotCQkJCXByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoCi0JCQkJCQlkZXNjcmlwdGlvbi5nZXROYW1lKCkpOwotCi0JCQkJaWYgKCFwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJCS8vIHByb2plY3QgZG9lc24ndCBleGlzdCBpbiB3b3Jrc3BhY2UsIHNvIG1ha2Ugb25lIHdpdGggdGhlCi0JCQkJCS8vIHByb2plY3QgbmFtZSBpbiAucHJvamVjdAotCQkJCQl0cnkgewotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIiMjIyAtIGNyZWF0aW5nIGV4aXN0aW5nIC5wcm9qZWN0ICIgKyBkZXNjcmlwdGlvbi5nZXROYW1lKCkgKyAiIGluIHdvcmtzcGFjZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCX0KLQkJCQkJCXByb2plY3QgPSBjcmVhdGVQcm9qZWN0KGxpYkRpciwgcHJvamVjdC5nZXROYW1lKCksCi0JCQkJCQkJCW1vbml0b3IpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkvLyBmYWlsZWQgdG8gbWFrZSB0aGlzIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZSAtCi0JCQkJCQkvLyBhbm90aGVyIHByb2plY3QgbWF5IGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UgYXQgdGhpcwotCQkJCQkJLy8gbG9jYXRpb24KLQkJCQkJCS8vIHNvIHdlIG5lZWQgdG8gZGVsZXRlIHRoYXQgY29uZmxpY3RpbmcgcHJvamVjdCBhbmQgdHJ5Ci0JCQkJCQkvLyBhZ2FpbgotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIiMjIyAtIGNyZWF0aW5nIGV4aXN0aW5nIC5wcm9qZWN0IGZhaWxlZCAtIGRlbGV0aW5nIHdvcmtzcGFjZS1wcm9qZWN0IGluICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCWxpYkRpcgotCQkJCQkJCQkJCQkrICIgYW5kIGNyZWF0aW5nIHdvcmtzcGFjZS1wcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWRlbGV0ZVByb2plY3QobGliRGlyLCBtb25pdG9yKTsKLQkJCQkJCXByb2plY3QgPSBjcmVhdGVQcm9qZWN0KGxpYkRpciwgcHJvamVjdC5nZXROYW1lKCksCi0JCQkJCQkJCW1vbml0b3IpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gcHJvamVjdCBkb2VzIGV4aXN0IGluIHdvcmtzcGFjZSAtIG1ha2Ugc3VyZSBsb2NhdGlvbgotCQkJCQkvLyBtYXRjaGVzLCBpZiBub3QsIG1ha2UgYSBuZXcgcHJvamVjdAotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIiMjIyAtIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIiBleGlzdHMgaW4gd29ya3NwYWNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCWlmIChuZXcgRmlsZShsaWJEaXIpLmNvbXBhcmVUbyhwcm9qZWN0LmdldExvY2F0aW9uKCkKLQkJCQkJCQkudG9GaWxlKCkpICE9IDApIHsKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCIjIyMgLSBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIgZXhpc3RzIGluIHdvcmtzcGFjZSwgYnV0IGxvY2F0aW9uIGRpZmZlcnMgLSBjcmVhdGUgYSBuZXcgcHJvamVjdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCX0KLQkJCQkJCUZpbGUgcHJvamVjdEZpbGUgPSBwYXRoLnRvRmlsZSgpOwotCQkJCQkJaWYgKHByb2plY3RGaWxlLmNhbldyaXRlKCkpIHsKLQkJCQkJCQlwcm9qZWN0RmlsZS5kZWxldGUoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gdGhpcyB3aWxsIGNhdXNlIHRoZSBjYWxsZXIgdG8gZGlzcGxheSBhCi0JCQkJCQkJLy8gbWVzc2FnZWJveCBhc2tpbmcgdGhlIHVzZXIgdG8gbWFrZSAucHJvamVjdAotCQkJCQkJCS8vIHdyaXRhYmxlCi0JCQkJCQkJLy8gVE9ETzogdXNlIG91ciBvd24gdHlwZSBvZiBFeGNlcHRpb24/Ci0JCQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKAotCQkJCQkJCQkJIiMjIyIgKyBwcm9qZWN0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCXByb2plY3QgPSBjcmVhdGVWYWxpZFByb2plY3RGcm9tUGF0aChsaWJEaXIsIG1vbml0b3IpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJCS8vIGxpYkRpciBtdXN0IGJlIGFuIGludmFsaWQgcGF0aCAob3ZlcmxhcHMgd29ya3NwYWNlPykKLQkJCQkvLyBUT0RPOiB0aGlzIGV4Y2VwdGlvbiBpc24ndCBoYW5kbGVkIHdlbGwgLSBpdCBzaG91bGRuJ3QgaGFwcGVuCi0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKExpYnJhcnlSZXNvdXJjZXMuaW52YWxpZExpYnJhcnlQYXRoRXJyb3JfcmVhc29uKTsKLQkJCX0KLQkJCXByb2plY3Qub3BlbihJUmVzb3VyY2UuQkFDS0dST1VORF9SRUZSRVNILCBtb25pdG9yKTsJCQkJCQkKLQkJCQotCQkJLy8gU2V0IGxvY2sgZmlsZSBhcyB0ZWFtIHByaXZhdGUgbWVtYmVyIHNvIGl0IHdpbGwgbm90IGJlIHNoYXJlZCAoYWRkZWQgdG8gc291cmNlIGNvbnRyb2wpLgotCQkJLy8gVGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZSBwcm9qZWN0IGZvbGRlciBnb3QgcmVmcmVzaGVkLiBTbyB0aGlzIHBvcnRpb24gb2YgY29kZSBtdXN0IGJlCi0JCQkvLyBleGVjdXRlZCByaWdodCBhZnRlciBJUHJvamVjdC5vcGVuKCkgcmV0dXJuZWQuIFByb2plY3QgbXVzdCBiZSBvcGVuZWQgd2l0aCBJUmVzb3VyY2UuQkFDS0dST1VORF9SRUZSRVNICi0JCQkvLyB0byBwcmV2ZW50IGxvY2sgZmlsZSBmcm9tIGJlaW5nIGFkZGVkIHRvIHRoZSBwcm9qZWN0IGJlZm9yZSBpdCBpcyBzZXQgYXMgdGVhbSBwcml2YXRlIG1lbWJlcgotCQkJLy8KLQkJCUZpbGUgbG9ja0ZpbGUgPSBuZXcgRmlsZShsaWJEaXIsIFJlc291cmNlVXRpbC5MT0NLX0ZJTEVOQU1FKTsKLQkJCWlmKGxvY2tGaWxlLmV4aXN0cygpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVJlc291cmNlIHdzUmVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgobG9ja0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQkJCQkJaWYod3NSZXMgIT0gbnVsbCkgewotCQkJCQkJd3NSZXMucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBudWxsKTsKLQkJCQkJCXdzUmVzLnNldFRlYW1Qcml2YXRlTWVtYmVyKHRydWUpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBtb25pdG9yIGZvciBjaGFuZ2UgaW4gdGhlIHJlc291cmNlCi0vLwkJCVJlZnJlc2hNYW5hZ2VyLmdldEluc3RhbmNlKCkubW9uaXRvcihwcm9qZWN0KTsKLQotCQkJZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0KLQkJCS8vIG1ha2Ugc3VyZSBwcm9qZWN0IGhhcyB0aGUgTWV0aG9kTGlicmFyeU5hdHVyZQotCQkJU3RyaW5nW10gZXhpc3RpbmdOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCQlpZiAoIShBcnJheXMuYXNMaXN0KGV4aXN0aW5nTmF0dXJlcykuY29udGFpbnMobWV0aG9kTGlicmFyeU5hdHVyZSkpKSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiIyMjIC0gYWRkaW5nIG1ldGhvZGxpYnJhcnluYXR1cmUgdG8gIiArIGRlc2NyaXB0aW9uLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG1ldGhvZExpYnJhcnlOYXR1cmVzKTsKLQkJCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBJUHJvamVjdC5GT1JDRQotCQkJCQkJfCBJUHJvamVjdC5LRUVQX0hJU1RPUlksIG1vbml0b3IpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQl0aHJvdyBleDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENsb3NlcyBhIGxpYnJhcnkncyBwcm9qZWN0LiBJdCBmaW5kcyB0aGUgcHJvamVjdCBieSBsb2NhdGluZyBhIHByb2plY3QKLQkgKiB3aXRoIHRoZSBzYW1lIGxvY2F0aW9uIGFzIHRoZSBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWIKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBjbG9zZShNZXRob2RMaWJyYXJ5IGxpYiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotLy8JCUlQcm9qZWN0IHByb2plY3QgPSBmaW5kUHJvamVjdChsaWIpOwotLy8JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5pc09wZW4oKSkgewotLy8JCQlpZiAoZGVidWcpIHsKLS8vCQkJCVN5c3RlbS5vdXQKLS8vCQkJCQkJLnByaW50bG4oIiMjIyAtIGNsb3NpbmcgcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0vLwkJCX0KLS8vCQkJcHJvamVjdC5jbG9zZShtb25pdG9yKTsKLS8vCQl9IGVsc2UgewotLy8JCQlpZiAoZGVidWcpIHsKLS8vCQkJCVN5c3RlbS5vdXQKLS8vCQkJCQkJLnByaW50bG4oIiMjIyAtIEVSUk9SIGNsb3NpbmcgcHJvamVjdCBmb3IgbGlicmFyeSBpbiBcIiIgKyBnZXRMaWJyYXJ5RGlyZWN0b3J5KGxpYikgKyAiXCI6IHByb2plY3QgY291bGQgbm90IGJlIGZvdW5kLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLS8vCQkJfQotLy8JCX0KLQkJCi0JCWNsb3NlKGdldExpYnJhcnlEaXJlY3RvcnkobGliKSwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGRpciBTdHJpbmcKLQkgKiBAcGFyYW0gbW9uaXRvciBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGNsb3NlKFN0cmluZyBkaXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBmaW5kUHJvamVjdChkaXIpOwotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaXNPcGVuKCkpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCIjIyMgLSBjbG9zaW5nIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcHJvamVjdC5jbG9zZShtb25pdG9yKTsKLQkJCQotCQkJLy8gc3RvcCBtb25pdG9yaW5nIGNoYW5nZSBvbiB0aGUgcHJvamVjdAotCQkJLy8KLS8vCQkJUmVmcmVzaE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS51bm1vbml0b3IocHJvamVjdCk7Ci0JCQkKLQkJfSBlbHNlIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCIjIyMgLSBFUlJPUiBjbG9zaW5nIHByb2plY3QgZm9yIGxpYnJhcnkgaW4gXCIiICsgZGlyICsgIlwiOiBwcm9qZWN0IGNvdWxkIG5vdCBiZSBmb3VuZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkJCi0JLyoqCi0JICogTG9jYXRlcyB0aGUgcHJvamVjdCB3aXRoIHRoZSBzYW1lIGxvY2F0aW9uIGFzIHRoZSBsaWJyYXJ5J3MgZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBsaWIgTWV0aG9kTGlicmFyeQotCSAqIEByZXR1cm4gSVByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGZpbmRQcm9qZWN0KE1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCXJldHVybiBmaW5kUHJvamVjdChnZXRMaWJyYXJ5RGlyZWN0b3J5KGxpYikpOwotCX0KLQotCS8qKgotCSAqIExvY2F0ZXN0IHRoZSBwcm9qZWN0IHdob3NlIGxvY2F0aW9uIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGRpciBTdHJpbmcKLQkgKiBAcmV0dXJuIElQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBmaW5kUHJvamVjdChTdHJpbmcgZGlyKSB7Ci0JCWZpbmFsIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCQlpZiAobmV3IEZpbGUoZGlyKS5jb21wYXJlVG8ocHJvamVjdC5nZXRMb2NhdGlvbigpLnRvRmlsZSgpKSA9PSAwKSB7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiIyMjIC0gZm91bmQgcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiIHdpdGggbG9jYXRpb24gIiArIGRpcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCXJldHVybiBwcm9qZWN0OwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGVzIHRoZSBwcm9qZWN0IHdob3NlIGxvY2F0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWIgTWV0aG9kTGlicmFyeQotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVsZXRlUHJvamVjdChNZXRob2RMaWJyYXJ5IGxpYiwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZGVsZXRlUHJvamVjdChnZXRMaWJyYXJ5RGlyZWN0b3J5KGxpYiksIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIHByb2plY3Qgd2hvc2UgbG9jYXRpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGRlbGV0ZVByb2plY3QoU3RyaW5nIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gZGVsZXRlIGFueSB3b3Jrc3BhY2UgcHJvamVjdCB0aGF0IGV4aXN0cyBmb3IgdGhpcyBwYXRoCi0JCUlQcm9qZWN0IHByb2plY3QgPSBmaW5kUHJvamVjdChwYXRoKTsKLQkJdHJ5IHsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCIjIyMgLSBkZWxldGluZyBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgewotCQkJCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCQl9Ci0JCQkJcHJvamVjdC5kZWxldGUoSVByb2plY3QuRk9SQ0UKLQkJCQkJCXwgSVByb2plY3QuTkVWRVJfREVMRVRFX1BST0pFQ1RfQ09OVEVOVCwgbW9uaXRvcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBwcm9qZWN0IGZvciB0aGUgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIGxpYnJhcnkgaXMgbm90IGluIGEgdmFsaWQgcHJvamVjdCBsb2NhdGlvbiAoaWUsCi0JICogICAgICAgICBvdmVybGFwcyB0aGUgd29ya3NwYWNlKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGNyZWF0ZVByb2plY3QoTWV0aG9kTGlicmFyeSBsaWIsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIGNyZWF0ZVZhbGlkUHJvamVjdEZyb21QYXRoKGdldExpYnJhcnlEaXJlY3RvcnkobGliKSwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHByb2plY3QgZm9yIHRoZSBwYXRoIHNwZWNpZmllZCwgdXNpbmcgdGhlIGxhc3QgcGF0aCBmcmFnbWVudCBhcwotCSAqIHRoZSBwcm9qZWN0IG5hbWUuIFdpbGwgYXBwZW5kIGluY3JlYXNpbmcgaW50ZWdlcnMgdG8gdGhlIHByb2plY3QgbmFtZSBpbgotCSAqIG9yZGVyIHRvIGNyZWF0ZSBhIHZhbGlkIHByb2plY3QuIEZpcnN0IGRlbGV0ZXMgYW55IHdvcmtzcGFjZSBwcm9qZWN0Ci0JICogd2hvc2UgbG9jYXRpb24gaXMgdGhlIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEByZXR1cm4gSVByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGNyZWF0ZVZhbGlkUHJvamVjdEZyb21QYXRoKFN0cmluZyBwYXRoLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIGRlbGV0ZSBhbnkgd29ya3NwYWNlIHByb2plY3QgdGhhdCBleGlzdHMgZm9yIHRoaXMgcGF0aAotCQlJUHJvamVjdCBwcm9qZWN0ID0gZmluZFByb2plY3QocGF0aCk7Ci0JCXRyeSB7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJcHJvamVjdC5kZWxldGUoSVByb2plY3QuRk9SQ0UKLQkJCQkJCXwgSVByb2plY3QuTkVWRVJfREVMRVRFX1BST0pFQ1RfQ09OVEVOVCwgbW9uaXRvcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nIGxpYk5hbWUgPSBuZXcgRmlsZShwYXRoKS5nZXROYW1lKCk7Ci0JCVN0cmluZyBsaWJEaXIgPSBuZXcgRmlsZShwYXRoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBsaWJOYW1lOwotCQlpbnQgaSA9IDI7Ci0JCXdoaWxlIChpIDwgMTAwKSB7Ci0JCQl0cnkgewotCQkJCXByb2plY3QgPSBjcmVhdGVQcm9qZWN0KGxpYkRpciwgcHJvamVjdE5hbWUsIG1vbml0b3IpOwotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIiMjIyAtIGNyZWF0aW5nIG5ldyBtZXRob2QgbGlicmFyeSBwcm9qZWN0ICIgKyBwcm9qZWN0TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIHByb2plY3Q7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJcHJvamVjdE5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKGxpYk5hbWUpLmFwcGVuZCgnICcpLmFwcGVuZChpKyspCi0JCQkJCQkudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBdHRlbXB0cyB0byBjcmVhdGUgYSBwcm9qZWN0IG5hbWVkIHByb2plY3ROYW1lIGluIHRoZSBkaXJlY3RvcnkgZGlyLgotCSAqIFRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoaXMgZmFpbHMgZm9yIGFueSByZWFzb24uCi0JICogCi0JICogQHBhcmFtIGRpcgotCSAqIEBwYXJhbSBwcm9qZWN0TmFtZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQcm9qZWN0IGNyZWF0ZVByb2plY3QoU3RyaW5nIGRpciwgU3RyaW5nIHByb2plY3ROYW1lLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCi0JCS8vIGdldCBhIHByb2plY3QgaGFuZGxlCi0JCUlQcm9qZWN0IG5ld1Byb2plY3RIYW5kbGUgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gd29ya3NwYWNlCi0JCQkJLm5ld1Byb2plY3REZXNjcmlwdGlvbihuZXdQcm9qZWN0SGFuZGxlLmdldE5hbWUoKSk7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhtZXRob2RMaWJyYXJ5TmF0dXJlcyk7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gbmV3IFBhdGgoZGlyKTsKLQkJaWYgKCFQbGF0Zm9ybS5nZXRMb2NhdGlvbigpLmlzUHJlZml4T2YocHJvamVjdFBhdGgpKSB7Ci0JCQlkZXNjcmlwdGlvbi5zZXRMb2NhdGlvbihwcm9qZWN0UGF0aCk7Ci0JCX0KLQotCQluZXdQcm9qZWN0SGFuZGxlLmNyZWF0ZShkZXNjcmlwdGlvbiwgbW9uaXRvcik7Ci0JCXJldHVybiBuZXdQcm9qZWN0SGFuZGxlOwotCX0KLQotCS8qKgotCSAqIENsb3NlcyBhbGwgKG9wZW4pIHByb2plY3RzIHRoYXQgaGF2ZSB0aGUgTWV0aG9kTGlicmFyeSBuYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBJUHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlQWxsTWV0aG9kTGlicmFyeVByb2plY3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmaW5hbCBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQkJaWYgKHByb2plY3QuaXNPcGVuKCkKLQkJCQkJCSYmIHByb2plY3QuZ2V0TmF0dXJlKG1ldGhvZExpYnJhcnlOYXR1cmUpICE9IG51bGwpIHsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCIjIyMgLSBjbG9zaW5nIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXByb2plY3QuY2xvc2UobW9uaXRvcik7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBsaWIgTWV0aG9kTGlicmFyeQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGlicmFyeURpcmVjdG9yeShNZXRob2RMaWJyYXJ5IGxpYikgewotCQlyZXR1cm4gbmV3IEZpbGUobGliLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdXNlZFJlc291cmNlcwotCSAqIEByZXR1cm4gQ29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0T3V0T2ZTeW5jUmVzb3VyY2VzKENvbGxlY3Rpb248UmVzb3VyY2U+IHVzZWRSZXNvdXJjZXMpIHsKLQkJQXJyYXlMaXN0PFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IHVzZWRSZXNvdXJjZXMpIHsKLQkJCVN0cmluZyBmaWxlUGF0aCA9IHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJSVJlc291cmNlIHdzUmVzID0gRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihmaWxlUGF0aCk7Ci0JCQlpZih3c1JlcyAhPSBudWxsICYmICF3c1Jlcy5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTykpIHsKLQkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gY2hhbmdlZFJlc291cmNlczsKLQl9CQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMgQ29sbGVjdGlvbgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNPdXRPZlN5bmNoKENvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlcykgewotCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogcmVzb3VyY2VzKSB7Ci0JCQlpZihyZXNvdXJjZS5nZXRVUkkoKS5pc0ZpbGUoKSkgewotCQkJCVN0cmluZyBmaWxlUGF0aCA9IHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJCUlSZXNvdXJjZSB3c1JlcyA9IEZpbGVNYW5hZ2VyLmdldFJlc291cmNlRm9yTG9jYXRpb24oZmlsZVBhdGgpOwotCQkJCWlmKHdzUmVzICE9IG51bGwgJiYgIXdzUmVzLmlzU3luY2hyb25pemVkKElSZXNvdXJjZS5ERVBUSF9aRVJPKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlc1RvQ2hlY2sgQ29sbGVjdGlvbgotCSAqIEBwYXJhbSByZW1vdmVkUmVzb3VyY2VzIENvbGxlY3Rpb24KLQkgKiBAcGFyYW0gY2hhbmdlZFJlc291cmNlcyBDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrT3V0T2ZTeW5jaFJlc291cmNlcyhDb2xsZWN0aW9uIHJlc291cmNlc1RvQ2hlY2ssIAotCQkJQ29sbGVjdGlvbiByZW1vdmVkUmVzb3VyY2VzLCBDb2xsZWN0aW9uIGNoYW5nZWRSZXNvdXJjZXMpCi0JewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXNUb0NoZWNrLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIGZpbGVQYXRoID0gcmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0JCQlJUmVzb3VyY2Ugd3NSZXMgPSBGaWxlTWFuYWdlci5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKGZpbGVQYXRoKTsKLQkJCWlmKHdzUmVzID09IG51bGwpIHsKLQkJCQlyZW1vdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCQllbHNlIGlmKCF3c1Jlcy5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTykpIHsKLQkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBsaWIgTWV0aG9kTGlicmFyeQotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFJlc291cmNlcyhNZXRob2RMaWJyYXJ5IGxpYiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmKGxpYiAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcmogPSBNZXRob2RMaWJyYXJ5UHJvamVjdC5maW5kUHJvamVjdChsaWIpOwotCQkJaWYocHJqICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlwcmoucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9TQVhQYXJzZXJYTUkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1NBWFBhcnNlclhNSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTkzM2Q5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1NBWFBhcnNlclhNSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ueG1sLkFic3RyYWN0U0FYUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVYTUlTYXZlSW1wbC5NeUVzY2FwZTsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBwYXJzZXMgYW4gWE1JIGZpbGUsIGFuZCBzdG9yZXMgdGhlIGRhdGEgaW4gYSBIYXNoTWFwIGNhbGxlZCBhbgotICogImVNYXAiLgotICogPHA+Ci0gKiBBbiBlTWFwIGhhcyA0IGVudHJpZXM6Ci0gKiA8bGk+InRhZyIgLSB0aGUgZWxlbWVudCdzIHRhZzwvbGk+Ci0gKiA8bGk+ImF0dHJpYnV0ZXMiIC0gYW4gQXJyYXlMaXN0IG9mIHRoZSBYTUwgYXR0cmlidXRlcy4gRWFjaCBhdHRyaWJ1dGUgaXMgb2YKLSAqIHRoZSBmb3JtIChhdHRyaWJ1dGUgbmFtZSksKGF0dHJpYnV0ZSB2YWx1ZSk8L2xpPgotICogPGxpPiJjb250ZW50IiAtIHRoZSBlbGVtZW50J3MgY29udGVudDwvbGk+Ci0gKiA8bGk+ImNoaWxkcmVuIiAtIGFuIEFycmF5TGlzdCBvZiB0aGUgZWxlbWVudCdzIHN1Yi1lbGVtZW50cy4gRWFjaCBjaGlsZCBpcwotICogYW4gZU1hcC48L2xpPgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgcm9vdCBlbGVtZW50J3MgZU1hcCBpcyByZWZlcmVuY2VkIGJ5IFROR1NBWFBhcnNlclhNSS54bWlNYXAKLSAqIDwvcD4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTQVhQYXJzZXJYTUkgZXh0ZW5kcyBBYnN0cmFjdFNBWFBhcnNlciB7Ci0KLQlwdWJsaWMgSGFzaE1hcCB4bWlNYXA7Ci0KLQkvLyBwcml2YXRlIGludCBlbGVtZW50Q291bnQgPSAwOwotCXByaXZhdGUgU3RhY2sgc3RhY2s7Ci0KLQlwcml2YXRlIE15RXNjYXBlIGVzY2FwZSA9IG5ldyBNeUVzY2FwZSgpOwotCi0JcHVibGljIFNBWFBhcnNlclhNSShMb2dnZXIgbG9nZ2VyKSB7Ci0JCS8vIHZhbGlkYXRpbmcgaXMgZmFsc2Ugc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIERURAotCQlzdXBlcihsb2dnZXIsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgWE1MIHBhcnNlciBzdGFydHMgdG8gcGFyc2UgdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSB7Ci0JCXN1cGVyLnN0YXJ0RG9jdW1lbnQoKTsKLQkJc3RhY2sgPSBuZXcgU3RhY2soKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHsKLQkJc3VwZXIuZW5kRG9jdW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSTCwgU3RyaW5nIGxvY2FsTmFtZSwKLQkJCVN0cmluZyBxbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCUhhc2hNYXAgZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXRyeSB7Ci0JCQlIYXNoTWFwIHBhcmVudCA9IChIYXNoTWFwKSBzdGFjay5wZWVrKCk7Ci0JCQkoKEFycmF5TGlzdCkgcGFyZW50LmdldCgiY2hpbGRyZW4iKSkuYWRkKGVNYXApOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEVtcHR5U3RhY2tFeGNlcHRpb24gZSkgewotCQkJeG1pTWFwID0gZU1hcDsKLQkJfQotCi0JCS8vIHB1dCB0YWcKLQkJZU1hcC5wdXQoInRhZyIsIHFuYW1lKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHB1dCBhdHRyaWJ1dGVNYXAKLQkJTGlzdCBhdHRyaWJ1dGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoYXR0cmlidXRlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJYXR0cmlidXRlTGlzdC5hZGQoYXR0cmlidXRlcy5nZXRRTmFtZShpKQotCQkJCQkJKyAiLCIgKyBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWVNYXAucHV0KCJhdHRyaWJ1dGVzIiwgYXR0cmlidXRlTGlzdCk7IC8vJE5PTi1OTFMtMSQKLQotCQllTWFwLnB1dCgiY2hpbGRyZW4iLCBuZXcgQXJyYXlMaXN0KCkpOyAvLyROT04tTkxTLTEkCi0JCXN0YWNrLnB1c2goZU1hcCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJMLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcW5hbWUpIHsKLQkJdHJ5IHsKLQkJCUhhc2hNYXAgZU1hcCA9IChIYXNoTWFwKSBzdGFjay5wZWVrKCk7Ci0JCQlMaXN0IGF0dHJpYnV0ZUxpc3QgPSAoQXJyYXlMaXN0KSBlTWFwLmdldCgiYXR0cmlidXRlcyIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYXR0cmlidXRlTGlzdC5zaXplKCkgPT0gMCkKLQkJCQlpZiAoc3RyQnVmLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQllTWFwLnB1dCgiY29udGVudCIsIGVzY2FwZS5jb252ZXJ0TGluZXMoc3RyQnVmLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJfSBjYXRjaCAoRW1wdHlTdGFja0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXN0YWNrLnBvcCgpOwotCX0KLQotCS8qKgotCSAqIEZvciB1c2Ugd2l0aCBUTkdTQVhQYXJzZXJYTUkuIEZpbmQgYSBndWlkJ3MgZWxlbWVudCB0YWcgd2l0aGluIHRoZSBYTUkKLQkgKiBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50VGFnCi0JICogQHBhcmFtIGd1aWQKLQkgKiBAcGFyYW0geG1pTWFwCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSGFzaE1hcCBmaW5kRWxlbWVudFRhZ29mR3VpZChTdHJpbmcgZWxlbWVudFRhZywgU3RyaW5nIGd1aWQsCi0JCQlIYXNoTWFwIHhtaU1hcCkgewotCQlIYXNoTWFwIGVNYXAgPSBTQVhQYXJzZXJYTUkuZmluZEd1aWQoZ3VpZCwgeG1pTWFwKTsKLQotCQkvLyB3ZSBoYXZlIGhhc2htYXAgb2YgdGhlIGd1aWQncyBlbGVtZW50IC0gc2VhcmNoIGNoaWxkcmVuIGZvciB0aGUKLQkJLy8gZWxlbWVudFRhZwotCQlJdGVyYXRvciBpdGVyID0gKChBcnJheUxpc3QpIGVNYXAuZ2V0KCJjaGlsZHJlbiIpKS5pdGVyYXRvcigpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSGFzaE1hcCBjaGlsZE1hcCA9IChIYXNoTWFwKSBpdGVyLm5leHQoKTsKLQkJCWlmIChTQVhQYXJzZXJYTUkuZ2V0VGFnKGNoaWxkTWFwKS5lcXVhbHMoZWxlbWVudFRhZykpCi0JCQkJcmV0dXJuIGNoaWxkTWFwOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEZvciB1c2Ugd2l0aCBUTkdTQVhQYXJzZXJYTUkuIHNlYXJjaGVzIGVNYXAncyBjaGlsZHJlbiBmb3IgZWxlbWVudFRhZwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50VGFnCi0JICogQHBhcmFtIGVNYXAKLQkgKiBAcmV0dXJuIEhhc2hNYXAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEhhc2hNYXAgZ2V0Q2hpbGRFbGVtZW50VGFnKFN0cmluZyBlbGVtZW50VGFnLCBIYXNoTWFwIGVNYXApIHsKLQkJLy8gc2VhcmNoIGNoaWxkcmVuIGZvciB0aGUgZWxlbWVudFRhZwotCQlJdGVyYXRvciBpdGVyID0gKChBcnJheUxpc3QpIGVNYXAuZ2V0KCJjaGlsZHJlbiIpKS5pdGVyYXRvcigpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSGFzaE1hcCBjaGlsZE1hcCA9IChIYXNoTWFwKSBpdGVyLm5leHQoKTsKLQkJCWlmIChTQVhQYXJzZXJYTUkuZ2V0VGFnKGNoaWxkTWFwKS5lcXVhbHMoZWxlbWVudFRhZykpCi0JCQkJcmV0dXJuIGNoaWxkTWFwOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEZvciB1c2Ugd2l0aCBUTkdTQVhQYXJzZXJYTUkuIHJldHVybnMgVGFnIG9mIGVsZW1lbnQuIERvZXMgbm90IHJldHVybgotCSAqIG51bGwsIHJldHVybnMgIiIgaW5zdGVhZC4KLQkgKiAKLQkgKiBAcGFyYW0gZU1hcAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGFnKEhhc2hNYXAgZU1hcCkgewotCQlTdHJpbmcgdGFnID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGVNYXAgIT0gbnVsbCkKLQkJCXRhZyA9IChTdHJpbmcpIGVNYXAuZ2V0KCJ0YWciKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGFnICE9IG51bGwpCi0JCQlyZXR1cm4gdGFnOwotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdXNlIHdpdGggVE5HU0FYUGFyc2VyWE1JLiBnZXRzIGNvbnRlbnQgb2YgZWxlbWVudCAtIGNhbiBiZSBudWxsCi0JICogCi0JICogQHBhcmFtIGVNYXAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnRDb250ZW50KEhhc2hNYXAgZU1hcCkgewotCQlTdHJpbmcgY29udGVudCA9IG51bGw7Ci0JCWlmIChlTWFwICE9IG51bGwpCi0JCQljb250ZW50ID0gKFN0cmluZykgZU1hcC5nZXQoImNvbnRlbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBhIGd1aWQgY29udGFpbmVkIHdpdGhpbiB0aGUgZ2l2ZW4gZU1hcCAtIGNhbiByZXR1cm4gbnVsbAotCSAqIAotCSAqIEBwYXJhbSBndWlkCi0JICogICAgICAgICAgICBndWlkIHRvIGZpbmQKLQkgKiBAcGFyYW0gZU1hcAotCSAqICAgICAgICAgICAgdXNlIFROR1NBWFBhcnNlclhNSS54bWlNYXAsIG9yIGEgc3ViLWVNYXAKLQkgKiBAcmV0dXJuIEhhc2hNYXAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEhhc2hNYXAgZmluZEd1aWQoU3RyaW5nIGd1aWQsIEhhc2hNYXAgZU1hcCkgewotCQlBcnJheUxpc3QgYXR0TGlzdCA9IChBcnJheUxpc3QpIGVNYXAuZ2V0KCJhdHRyaWJ1dGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGd1aWQuZXF1YWxzKFNBWFBhcnNlclhNSS5nZXRHdWlkT2ZMaXN0KGF0dExpc3QpKSkKLQkJCXJldHVybiBlTWFwOwotCi0JCUl0ZXJhdG9yIGl0ZXIgPSAoKEFycmF5TGlzdCkgZU1hcC5nZXQoImNoaWxkcmVuIikpLml0ZXJhdG9yKCk7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlIYXNoTWFwIGNoaWxkTWFwID0gKEhhc2hNYXApIGl0ZXIubmV4dCgpOwotCQkJSGFzaE1hcCByZXN1bHQgPSBmaW5kR3VpZChndWlkLCBjaGlsZE1hcCk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdXNlIHdpdGggVE5HU0FYUGFyc2VyWE1JLgotCSAqIAotCSAqIEBwYXJhbSBhdHRMaXN0Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHdWlkT2ZMaXN0KEFycmF5TGlzdCBhdHRMaXN0KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBhdHRMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGF0dHBhaXIgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBhdHRuYW1lID0gYXR0cGFpci5zdWJzdHJpbmcoMCwgYXR0cGFpci5pbmRleE9mKCIsIikpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYXR0dmFsID0gYXR0cGFpci5zdWJzdHJpbmcoYXR0cGFpci5pbmRleE9mKCIsIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGF0dG5hbWUuZXF1YWxzKCJndWlkIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gYXR0dmFsOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEZvciB1c2Ugd2l0aCBUTkdTQVhQYXJzZXJYTUkgd2hlbiBwYXJzaW5nIHJlc21nci54bWkKLQkgKiAKLQkgKiBAcGFyYW0gYXR0TGlzdAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SWRPZkxpc3QoQXJyYXlMaXN0IGF0dExpc3QpIHsKLQkJSXRlcmF0b3IgaXRlciA9IGF0dExpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgYXR0cGFpciA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIGF0dG5hbWUgPSBhdHRwYWlyLnN1YnN0cmluZygwLCBhdHRwYWlyLmluZGV4T2YoIiwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBhdHR2YWwgPSBhdHRwYWlyLnN1YnN0cmluZyhhdHRwYWlyLmluZGV4T2YoIiwiKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYXR0bmFtZS5lcXVhbHMoImlkIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gYXR0dmFsOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlTWFwCi0JICogQHJldHVybiBVUkkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSSSBnZXRQcmVzZW50YXRpb25VcmlPZkVsZW1lbnQoSGFzaE1hcCBlTWFwKSB7Ci0JCWlmIChlTWFwID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHRhZyA9IFNBWFBhcnNlclhNSS5nZXRUYWcoZU1hcCk7Ci0KLQkJLy8gLy8gY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYW4gYnJlYWtkb3duRWxlbWVudCAtIGlmIHNvLCByZXR1cm4gbnVsbAotCQkvLyAvLyBiZWNhdXNlIHdoaWxlIGJyZWFrZG93bkVsZW1lbnRzIGhhdmUgcHJlc2VudGF0aW9ucywgdGhleSBhcmUgbm90Ci0JCS8vIHVzZWQuCi0JCS8vIGlmICh0YWcuZXF1YWxzKCJicmVha2Rvd25FbGVtZW50cyIpKSB7Ci0JCS8vIHJldHVybiBudWxsOwotCQkvLyB9Ci0JCS8vIC8vIHByb2Nlc3NlcyBkb24ndCB1c2UgdGhlaXIgcHJlc2VudGF0aW9uIGVpdGhlcgotCQkvLyBpZiAodGFnLmVxdWFscygicHJvY2VzcyIpKSB7Ci0JCS8vIHJldHVybiBudWxsOwotCQkvLyB9Ci0KLQkJLy8gbG9vayBmb3IgY2hpbGRQYWNrYWdlIHByZXNlbnRhdGlvbnMsIHdoaWNoIGFyZSBhbiBocmVmIGF0dHJpYnV0ZQotCQlpZiAodGFnLmVxdWFscygiY2hpbGRQYWNrYWdlcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUFycmF5TGlzdCBhdHRMaXN0ID0gKEFycmF5TGlzdCkgZU1hcC5nZXQoImF0dHJpYnV0ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJSXRlcmF0b3IgaXRlciA9IGF0dExpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBhdHRwYWlyID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJU3RyaW5nIGF0dG5hbWUgPSBhdHRwYWlyLnN1YnN0cmluZygwLCBhdHRwYWlyLmluZGV4T2YoIiwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgYXR0dmFsID0gYXR0cGFpci5zdWJzdHJpbmcoYXR0cGFpci5pbmRleE9mKCIsIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChhdHRuYW1lLmVxdWFscygiaHJlZiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdHJ5IHsKLQkJCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKGF0dHZhbCk7Ci0JCQkJCQlyZXR1cm4gdXJpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJCS8vIGlmIChhdHR2YWwuaW5kZXhPZigidW1hOi8vIikgIT0gLTEpIHsKLQkJCQkJLy8gU3RyaW5nIHByZXNJZCA9Ci0JCQkJCS8vIGF0dHZhbC5zdWJzdHJpbmcoYXR0dmFsLmluZGV4T2YoInVtYTovLyIpKzYpOwotCQkJCQkvLyByZXR1cm4gcHJlc0lkOwotCQkJCQkvLyB9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJQXJyYXlMaXN0IGNoaWxkTGlzdCA9IChBcnJheUxpc3QpIGVNYXAuZ2V0KCJjaGlsZHJlbiIpOyAvLyROT04tTkxTLTEkCi0JCUl0ZXJhdG9yIGl0ZXIgPSBjaGlsZExpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlIYXNoTWFwIGNoaWxkTWFwID0gKEhhc2hNYXApIGl0ZXIubmV4dCgpOwotCQkJdGFnID0gU0FYUGFyc2VyWE1JLmdldFRhZyhjaGlsZE1hcCk7Ci0JCQlpZiAodGFnLmVxdWFscygicHJlc2VudGF0aW9uIikpIHsgLy8gfHwgLy8kTk9OLU5MUy0xJAotCQkJCS8vIHRhZy5lcXVhbHMoInZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiKSkKLQkJCQkvLyB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUFycmF5TGlzdCBhdHRMaXN0ID0gKEFycmF5TGlzdCkgY2hpbGRNYXAuZ2V0KCJhdHRyaWJ1dGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlJdGVyYXRvciBhdHRJdGVyID0gYXR0TGlzdC5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChhdHRJdGVyLmhhc05leHQoKSkgewotCQkJCQlTdHJpbmcgYXR0cGFpciA9IChTdHJpbmcpIGF0dEl0ZXIubmV4dCgpOwotCQkJCQlTdHJpbmcgYXR0bmFtZSA9IGF0dHBhaXIuc3Vic3RyaW5nKDAsIGF0dHBhaXIuaW5kZXhPZigiLCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgYXR0dmFsID0gYXR0cGFpci5zdWJzdHJpbmcoYXR0cGFpci5pbmRleE9mKCIsIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoYXR0bmFtZS5lcXVhbHMoImhyZWYiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQl0cnkgewotCQkJCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKGF0dHZhbCk7Ci0JCQkJCQkJcmV0dXJuIHVyaTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJfQotCQkJCQkJLy8gaWYgKGF0dHZhbC5pbmRleE9mKCJ1bWE6Ly8iKSAhPSAtMSkgewotCQkJCQkJLy8gU3RyaW5nIHByZXNJZCA9Ci0JCQkJCQkvLyBhdHR2YWwuc3Vic3RyaW5nKGF0dHZhbC5pbmRleE9mKCJ1bWE6Ly8iKSs2KTsKLQkJCQkJCS8vIHJldHVybiBwcmVzSWQ7Ci0JCQkJCQkvLyB9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBpZiAoYXR0TGlzdC5zaXplKCkgPT0gMCkKLQkJCQkvLyBjb250aW51ZTsKLQkJCQkvLyBTdHJpbmcgYXR0cGFpciA9IChTdHJpbmcpYXR0TGlzdC5nZXQoMCk7Ci0JCQkJLy8gLy8gU3RyaW5nIGF0dG5hbWUgPSBhdHRwYWlyLnN1YnN0cmluZygwLAotCQkJCS8vIGF0dHBhaXIuaW5kZXhPZigiLCIpKTsKLQkJCQkvLyBTdHJpbmcgYXR0dmFsID0gYXR0cGFpci5zdWJzdHJpbmcoYXR0cGFpci5pbmRleE9mKCIsIikrMSk7Ci0JCQkJLy8gaWYgKGF0dHZhbC5pbmRleE9mKCJ1bWE6Ly8iKSAhPSAtMSkgewotCQkJCS8vIFN0cmluZyBwcmVzSWQgPSBhdHR2YWwuc3Vic3RyaW5nKGF0dHZhbC5pbmRleE9mKCJ1bWE6Ly8iKSs2KTsKLQkJCQkvLyByZXR1cm4gcHJlc0lkOwotCQkJCS8vIH0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZU1hcAotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lCi0JICogQHBhcmFtIGF0dHJpYnV0ZVZhbHVlCi0JICogQHJldHVybiBIYXNoTWFwCi0JICovCi0JcHVibGljIHN0YXRpYyBIYXNoTWFwIGZpbmRFbGVtZW50QnlBdHRyaWJ1dGUoSGFzaE1hcCBlTWFwLAotCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSkgewotCQkvLyBzZWFyY2ggdGhpcyBlTWFwJ3MgY2hpbGRyZW4KLQkJSXRlcmF0b3IgaXRlciA9ICgoQXJyYXlMaXN0KSBlTWFwLmdldCgiY2hpbGRyZW4iKSkuaXRlcmF0b3IoKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUhhc2hNYXAgY2hpbGRNYXAgPSAoSGFzaE1hcCkgaXRlci5uZXh0KCk7Ci0JCQlIYXNoTWFwIHJlc3VsdCA9IGZpbmRFbGVtZW50QnlBdHRyaWJ1dGUoY2hpbGRNYXAsIGF0dHJpYnV0ZU5hbWUsCi0JCQkJCWF0dHJpYnV0ZVZhbHVlKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJLy8gc2VhcmNoIHRoaXMgZU1hcAotCQlpdGVyID0gKChBcnJheUxpc3QpIGVNYXAuZ2V0KCJhdHRyaWJ1dGVzIikpLml0ZXJhdG9yKCk7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgYXR0cGFpciA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIGF0dG5hbWUgPSBhdHRwYWlyLnN1YnN0cmluZygwLCBhdHRwYWlyLmluZGV4T2YoIiwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBhdHR2YWwgPSBhdHRwYWlyLnN1YnN0cmluZyhhdHRwYWlyLmluZGV4T2YoIiwiKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYXR0bmFtZS5lcXVhbHMoYXR0cmlidXRlTmFtZSkgJiYgYXR0dmFsLmVxdWFscyhhdHRyaWJ1dGVWYWx1ZSkpCi0JCQkJcmV0dXJuIGVNYXA7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGVNYXAKLQkgKiBAcGFyYW0gYXR0cmlidXRlTmFtZQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlT2ZFbGVtZW50KEhhc2hNYXAgZU1hcCwKLQkJCVN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSAoKEFycmF5TGlzdCkgZU1hcC5nZXQoImF0dHJpYnV0ZXMiKSkuaXRlcmF0b3IoKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBhdHRwYWlyID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgYXR0bmFtZSA9IGF0dHBhaXIuc3Vic3RyaW5nKDAsIGF0dHBhaXIuaW5kZXhPZigiLCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGF0dHZhbCA9IGF0dHBhaXIuc3Vic3RyaW5nKGF0dHBhaXIuaW5kZXhPZigiLCIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChhdHRuYW1lLmVxdWFscyhhdHRyaWJ1dGVOYW1lKSkKLQkJCQlyZXR1cm4gYXR0dmFsOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvVGV4dFJlZmVyZW5jZVJlcGxhY2VySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvVGV4dFJlZmVyZW5jZVJlcGxhY2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGJjMDRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1RleHRSZWZlcmVuY2VSZXBsYWNlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBmb3IgSVRleHRSZWZlcmVuY2VSZXBsYWNlci4gVXNlZCBpbiBkZWVwIGNvcHkKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklUZXh0UmVmZXJlbmNlUmVwbGFjZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgVGV4dFJlZmVyZW5jZVJlcGxhY2VySW1wbCBpbXBsZW1lbnRzIElUZXh0UmVmZXJlbmNlUmVwbGFjZXIgewotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBDQVBBQklMSVRZX1BBVEggPSBNdWx0aUZpbGVTYXZlVXRpbC5DQVBBQklMSVRZX1BBVFRFUk5fUEFUSCArICIvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBERUxJVkVSWV9QQVRIID0gTXVsdGlGaWxlU2F2ZVV0aWwuREVMSVZFUllfUFJPQ0VTU19QQVRIICsgIi8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBsb2NhbERlYnVnICA9IGZhbHNlOwkKLQkKLQlwcml2YXRlIE1hcCBjb252ZXJ0TWFwKE1hcCBvbGRUb05ld09iamVjdE1hcCkgewotCQlpZiAob2xkVG9OZXdPYmplY3RNYXAgPT0gbnVsbCkgewotCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBvbGRUb05ld09iamVjdE1hcCBpcyBudWxsLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlNYXAgbSA9IG51bGw7Ci0JCUl0ZXJhdG9yIGl0ID0gb2xkVG9OZXdPYmplY3RNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3Qga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQlPYmplY3QgdmFsID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gb2xkIGtleSA9ICIgKyBrZXkpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gb2xkIHZhbCA9ICIgKyB2YWwpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoIGtleSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgdmFsIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCVN0cmluZyBuZXdLZXkgPSAoKE1ldGhvZEVsZW1lbnQpa2V5KS5nZXRHdWlkKCk7Ci0JCQkJU3RyaW5nIG5ld1ZhbCA9ICgoTWV0aG9kRWxlbWVudCl2YWwpLmdldEd1aWQoKTsKLQkJCQlpZiAoa2V5ICE9IG51bGwgJiYgdmFsICE9IG51bGwpIHsKLQkJCQkJaWYgKG0gPT0gbnVsbCkgewotCQkJCQkJbSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCX0KLQkJCQkJbS5wdXQobmV3S2V5LCBuZXdWYWwpOwotCQkJCX0KLQkJCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBuZXcga2V5ID0gIiArIG5ld0tleSArICIsIG5ld1ZhbCA9ICIgKyBuZXdWYWwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0gCi0JCX0KLQkJcmV0dXJuIG07Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNvdXJjZSBTdHJpbmcKLQkgKiBAcGFyYW0gb3duZXIgRU9iamVjdAotCSAqIEBvbGRUb05ld09iamVjdE1hcCBNYXAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVwbGFjZShTdHJpbmcgc291cmNlLCBFT2JqZWN0IG93bmVyLCBNYXAgb2xkVG9OZXdPYmplY3RNYXApIHsKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IEVudGVyaW5nIFRleHRSZWZlcmVuY2VSZXBsYWNlckltcGwucmVwbGFjZTogIiArIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IG93bmVyOiAiICsgb3duZXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nIHJldCA9IHJlcGxhY2VfKHNvdXJjZSwgb3duZXIsIG9sZFRvTmV3T2JqZWN0TWFwKTsKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCWJvb2xlYW4gbm9DaGFuZ2UgPSAhIHNvdXJjZS5lcXVhbHMocmV0KTsKLQkJCVN0cmluZyBzdHIgPSBzb3VyY2UuZXF1YWxzKHJldCkgPyAiTm8gY2huYW5nZSEiIDogcmV0OyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBFeGl0aW5nIFRleHRSZWZlcmVuY2VSZXBsYWNlckltcGwucmVwbGFjZTogIiArIHN0cik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyByZXBsYWNlXyhTdHJpbmcgc291cmNlLCBFT2JqZWN0IG93bmVyLCBNYXAgb2xkVG9OZXdPYmplY3RNYXApIHsJCi0JCU1hcCBsb2NhbE1hcCA9IGNvbnZlcnRNYXAob2xkVG9OZXdPYmplY3RNYXApOwotCQlpZiAobG9jYWxNYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuIHNvdXJjZTsKLQkJfQotCQkKLQkJU3RyaW5nIHJlcGxhY2luZ1BhdGggPSBudWxsOwotCQlTdHJpbmcgcmVwbGFjZWRQYXRoID0gbnVsbDsJCQkKLQkJaWYgKG93bmVyIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQlyZXBsYWNpbmdQYXRoID0gREVMSVZFUllfUEFUSDsKLQkJCXJlcGxhY2VkUGF0aCA9IENBUEFCSUxJVFlfUEFUSDsKLQkJfQotCQllbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQlyZXBsYWNpbmdQYXRoID0gQ0FQQUJJTElUWV9QQVRIOwotCQkJcmVwbGFjZWRQYXRoID0gREVMSVZFUllfUEFUSDsKLQkJfSBlbHNlIHsKLQkJCXJlcGxhY2luZ1BhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJcmVwbGFjZWRQYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlNYXRjaGVyIG0gPSBSZXNvdXJjZUhlbHBlci5wX2xpbmtfcmVmLm1hdGNoZXIoc291cmNlKTsKLQotCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCVN0cmluZyB0ZXh0ID0gbS5ncm91cCgpOwkJCQkJCQotCQkJTWFwIGF0dHJpYnV0ZU1hcCA9IFJlc291cmNlSGVscGVyLmdldEF0dHJpYnV0ZXNGcm9tTGluayh0ZXh0KTsKLQkJCVN0cmluZyBvbGRHdWlkID0gKFN0cmluZykgYXR0cmlidXRlTWFwLmdldChSZXNvdXJjZUhlbHBlci5UQUdfQVRUUl9HVUlEKTsJCi0JCQlTdHJpbmcgbmV3R3VpZCA9IG9sZEd1aWQgPT0gbnVsbCA/IG51bGwgOiAoU3RyaW5nKSBsb2NhbE1hcC5nZXQob2xkR3VpZCk7Ci0JCQkKLQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gdGV4dDogICAgICAiICsgdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBhdHRyaWJ1dGVNYXA6ICIgKyBhdHRyaWJ1dGVNYXApOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gb2xkR3VpZDogIiArIG9sZEd1aWQpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gbmV3R3VpZDogIiArIG5ld0d1aWQpOyAvLyROT04tTkxTLTEkCi0JCQl9CQkJCi0JCQlpZiAobmV3R3VpZCAhPSBudWxsICYmICFuZXdHdWlkLmVxdWFscyhvbGRHdWlkKSkgewotCQkJCQkJCQkKLQkJCQkvL1N0cmluZyByZXBsYWNlbWVudCA9IHRleHQucmVwbGFjZUFsbChvbGRHdWlkLCBuZXdHdWlkKTsKLQkJCQkvL0Nhbid0IHVzZSB0aGUgYWJvdmUgY29tbWVudGVkIG91dCBsaW5lLCBiZWNhdXNlIHNvbWUgZ3VpZCBzdHJpbmdzIGFyZSBub3QgdmFsaWQgcmVnZXggcGF0dGVybnMKLQkJCQlTdHJpbmcgcmVwbGFjZW1lbnQgPSByZXBsYWNlQWxsKHRleHQsIG9sZEd1aWQsIG5ld0d1aWQpOwkJCi0JCQkJaWYgKHJlcGxhY2VtZW50LmluZGV4T2YocmVwbGFjZWRQYXRoKSA+IDApIHsKLQkJCQkJcmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudC5yZXBsYWNlRmlyc3QocmVwbGFjZWRQYXRoLCByZXBsYWNpbmdQYXRoKTsKLQkJCQl9Ci0JCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gcmVwbGFjZW1lbnQ6ICIgKyByZXBsYWNlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVwbGFjZW1lbnQpOwkKLQkJCX0KLQkJCQotCQl9Ci0JCW0uYXBwZW5kVGFpbChzYik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdGV4dCBTdHJpbmcKLQkgKiBAcGFyYW0gcmVwbGFjZWQgU3RyaW5nCi0JICogQHBhcmFtIHJlcGxhY2luZyBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VBbGwoU3RyaW5nIHRleHQsIFN0cmluZyByZXBsYWNlZCwgU3RyaW5nIHJlcGxhY2luZykgewotCQlpbnQgZnJvbUluZGV4ID0gMDsKLQkJaW50IGl4ID0gdGV4dC5pbmRleE9mKHJlcGxhY2VkLCBmcm9tSW5kZXgpOwotCQlpZiAoaXggPCAwKSB7Ci0JCQlyZXR1cm4gdGV4dDsKLQkJfQkJCQotCQlpbnQgcmVwbGFjZWRMZW4gPSByZXBsYWNlZC5sZW5ndGgoKTsKLQkJU3RyaW5nQnVmZmVyIG5ld1RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXdoaWxlIChpeCA+PSBmcm9tSW5kZXgpIHsKLQkJCWlmIChpeCA+IGZyb21JbmRleCkgewotCQkJCW5ld1RleHQuYXBwZW5kKHRleHQuc3Vic3RyaW5nKGZyb21JbmRleCwgaXgpKTsKLQkJCX0KLQkJCW5ld1RleHQuYXBwZW5kKHJlcGxhY2luZyk7Ci0JCQlmcm9tSW5kZXggPSBpeCArIHJlcGxhY2VkTGVuOwotCQkJaXggPSB0ZXh0LmluZGV4T2YocmVwbGFjZWQsIGZyb21JbmRleCk7Ci0JCX0KLQkJaWYgKGZyb21JbmRleCA8IHRleHQubGVuZ3RoKCkgKSB7Ci0JCQluZXdUZXh0LmFwcGVuZCh0ZXh0LnN1YnN0cmluZyhmcm9tSW5kZXgsIHRleHQubGVuZ3RoKCkpKTsKLQkJfQotCQlyZXR1cm4gbmV3VGV4dC50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDBlMGUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGFjY2VzcyBhbmQgZWRpdGluZyBzdXBwb3J0IGZvciBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vLmN2c2lnbm9yZSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLy5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWMzNTU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgZGlhZ3JhbSBtaWdyYXRpb24gcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYxZTE1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW08L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODIwNTA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW07c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24sCi0gb3JnLmVjbGlwc2UuZXBmLnVtYSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeSwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZCwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0udXRpbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmOGU2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vaWNvbnMvZnVsbC9vYmoxNi9YTUxGaWxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9pY29ucy9mdWxsL29iajE2L1hNTEZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2I0NGJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9pY29ucy9mdWxsL29iajE2L1hNTEZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydFhNTC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vaWNvbnMvZnVsbC93aXpiYW4vRXhwb3J0WE1MLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI0OTgzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vaWNvbnMvZnVsbC93aXpiYW4vRXhwb3J0WE1MLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY3ODFjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1wbHVnaW5OYW1lPUVQRiBEaWFncmFtIE1pZ3JhdGlvbgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgV2l6YXJkcwotZXhwb3J0V29ya2Zsb3dUZW1wbGF0ZVdpemFyZE5hbWU9V29ya2Zsb3cgVGVtcGxhdGUKLWV4cG9ydFdvcmtmbG93VGVtcGxhdGVXaXphcmREZXNjcmlwdGlvbj1FeHBvcnQgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcyBkaWFncmFtIHRlbXBsYXRlLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjM5Nzg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci08IS0tCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgIAkgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi51aS5leHBvcnRXaXphcmRzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC53aXphcmRzLk1pZ3JhdGlvbkV4cG9ydFdpemFyZCIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvWE1MRmlsZS5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLndpemFyZHMuTWlncmF0aW9uRXhwb3J0V2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJWV4cG9ydFdvcmtmbG93VGVtcGxhdGVXaXphcmROYW1lIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLQkgICAgICAgICAlZXhwb3J0V29ya2Zsb3dUZW1wbGF0ZVdpemFyZERlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC53aXphcmRzLk1pZ3JhdGlvbkV4cG9ydFdpemFyZCIvPgotICAgPC9leHRlbnNpb24+Ci0gICAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuZGlhZ3JhbU1pZ3JhdGlvbiI+Ci0gICAgICA8ZGlhZ3JhbU1pZ3JhdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLkRpYWdyYW1NaWdyYXRpb24iLz4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9EaWFncmFtTWlncmF0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9EaWFncmFtTWlncmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZTIzODcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vRGlhZ3JhbU1pZ3JhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5JRGlhZ3JhbU1pZ3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQuc2VydmljZXMuV29ya2Zsb3dFeHBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS51dGlsLk1pZ3JhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgZGlncmFtIG1pZ3JhdGlvbiAKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1IC0gQXByaWwgMDQsIDIwMDcKLSAqIEBzaW5jZSAgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTWlncmF0aW9uIGltcGxlbWVudHMgSURpYWdyYW1NaWdyYXRpb24gewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVidWc7Ci0JCi0JcHVibGljIHZvaWQgbWlncmF0ZShDb2xsZWN0aW9uPFByb2Nlc3M+IHByb2Nlc3NlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CQotCQkvLyBkZWJ1ZwotCQlkZWJ1ZyA9IERpYWdyYW1NaWdyYXRpb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JCQotCQlXb3JrZmxvd0V4cG9ydFNlcnZpY2Ugc2VydmljZSA9IG5ldyBXb3JrZmxvd0V4cG9ydFNlcnZpY2UoKTsKLQkJCi0JCWludCAgZXJyb3JDb3VudCA9IDA7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gbnVsbDsKLQkJCi0JCWZvciAoSXRlcmF0b3I8UHJvY2Vzcz4gaXQgPSBwcm9jZXNzZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJUHJvY2VzcyBwcm9jID0gaXQubmV4dCgpOwotCQkJaWYgKGxpYiA9PSBudWxsKSB7Ci0JCQkJbGliID0gVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KHByb2MpOwotCQkJfQotCQkJCi0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBwcm9jOiAiICsgcHJvYyk7CS8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiAgcHJvYy5lUmVzb3VyY2UoKTogIiArICBwcm9jLmVSZXNvdXJjZSgpKTsvLyROT04tTkxTLTEkCi0JCQkJaWYgKHByb2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiAgcHJvYy5lUmVzb3VyY2UoKS5nZXRVUkkoKTogIiArICBwcm9jLmVSZXNvdXJjZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQkJU3RyaW5nIG1vZGVsRmlsZVBhdGggPSBwcm9jLmVSZXNvdXJjZSgpID09IG51bGwgPyBudWxsIDogCi0JCQkJCQkJCQkJcHJvYy5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCWlmIChtb2RlbEZpbGVQYXRoID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQkJCQotCQkJRmlsZSBjcEZvbGRlclBhdGggPSBuZXcgRmlsZShtb2RlbEZpbGVQYXRoKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQlTdHJpbmcgZGlhZ3JhbUZpbGVQYXRoID0gY3BGb2xkZXJQYXRoLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKwotCQkJCQkJCQkJCSJkaWFncmFtLnhtaSI7CQkJCS8vJE5PTi1OTFMtMSQKLQkJCUZpbGUgZGlhZ3JhbUZpbGUgPSBuZXcgRmlsZShkaWFncmFtRmlsZVBhdGgpOwotCQkJaWYgKGRpYWdyYW1GaWxlLmV4aXN0cygpKSB7Ci0JCQkJZGlhZ3JhbUZpbGUuZGVsZXRlKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gRGVsZXRlZCBkaWFncmFtRmlsZTogIiArIGRpYWdyYW1GaWxlKTsvLyROT04tTkxTLTEkCi0JCQkJUmVzb3VyY2VVdGlsLnJlZnJlc2hSZXNvdXJjZXMobGliLCBudWxsKTsKLQkJCX0KLQkJCS8vZGlhZ3JhbUZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZGlhZ3JhbUZpbGU6ICIgKyBkaWFncmFtRmlsZSk7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJdHJ5IHsKLQkJCQlzZXJ2aWNlLmV4cG9ydChwcm9jLCBwcm9jLCAiZGlhZ3JhbS54bWkiLCBjcEZvbGRlclBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWVycm9yQ291bnQrKzsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZmFpbGVkOiAiICsgZGlhZ3JhbUZpbGUpOwkvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gcHJvY2Vzc2VzLnNpemUoKTogIiArIHByb2Nlc3Nlcy5zaXplKCkpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBlcnJvckNvdW50OiAiICsgZXJyb3JDb3VudCk7CS8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJcmVtb3ZlT2xkRGlhZ3JhbXMocHJvY2Vzc2VzLCBsaWIpOwkJCQkKLQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVPbGREaWFncmFtcyhDb2xsZWN0aW9uPFByb2Nlc3M+IHByb2Nlc3NlcywgTWV0aG9kTGlicmFyeSBsaWIpIHsJCQotCQlpZiAobGliID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlib29sZWFuIG5lZWRTYXZlID0gZmFsc2U7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gcmVtb3ZlT2xkRGlhZ3JhbXMgLi4uIik7CS8vJE5PTi1OTFMtMSQKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPFByb2Nlc3M+IGl0ID0gcHJvY2Vzc2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVByb2Nlc3MgcHJvYyA9IGl0Lm5leHQoKTsKLQkJCWJvb2xlYW4gZGlydHkgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJTWFwIGFjdGl2aXRpZXMgPSBNaWdyYXRpb25VdGlsLmdldEFjdGl2aXRpZXMocHJvYywgdHJ1ZSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpaXQgPSBhY3Rpdml0aWVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGlpdC5oYXNOZXh0KCk7KSB7CQkJCQotCQkJCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBpaXQubmV4dCgpOwkJCQkJCQotCQkJCQkJRU9iamVjdCBjb250YWluZXIgPSBhY3QuZUNvbnRhaW5lcigpOwotCQkJCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBjb250YWluZXI7Ci0JCQkJCQkJaWYgKCEgcGtnLmdldERpYWdyYW1zKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCUFycmF5TGlzdCByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdChwa2cuZ2V0RGlhZ3JhbXMoKSk7Ci0JCQkJCQkJCXBrZy5nZXREaWFncmFtcygpLnJlbW92ZUFsbChyZW1vdmVMaXN0KTsKLQkJCQkJCQkJZGlydHkgPSB0cnVlOwotCQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHByb2M6ICIgKyBwcm9jKTsJLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gIHBrZzogIik7CQkJLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZGlydHkpIHsKLQkJCQkJcHJvYy5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCQkJbmVlZFNhdmUgPSB0cnVlOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JCWlmIChuZWVkU2F2ZSkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBsaWIuZVJlc291cmNlKCk7Ci0JCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJTWFwIHNhdmVPcHRpb25zID0gcmVzb3VyY2VTZXQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCk7Ci0JCQl0cnkgewotCQkJCXJlc291cmNlU2V0LnNhdmUoc2F2ZU9wdGlvbnMsIHRydWUpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9CQotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTE2ZjlkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL0RpYWdyYW1NaWdyYXRpb25QbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTWlncmF0aW9uUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIERpYWdyYW1NaWdyYXRpb25QbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBEaWFncmFtTWlncmF0aW9uUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vTWlncmF0aW9uRXhwb3J0Q29uc3RhbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9NaWdyYXRpb25FeHBvcnRDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E1NGE4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9NaWdyYXRpb25FeHBvcnRDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRpb25FeHBvcnRDb25zdGFudHMgewotCQotCS8qKgotCSAqIFRoZSBwcm9jZXNzIHR5cGUgcHJlZmVyZW5jZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU19UWVBFID0gInByb2Nlc3NUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHByb2Nlc3MgbmFtZSBwcmVmZXJlbmNlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTX05BTUUgPSAicHJvY2Vzc05hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcHJvY2VzcyBjb250ZXh0IHByZWZlcmVuY2Uga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NfQ09OVEVYVCA9ICJjb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHRhcmdldCBkaXJlY3RvcmllcyBwcmVmZXJlbmNlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfRElSRUNUT1JJRVMgPSAidGFyZ2V0RGlycyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSB0ZW1wbGF0ZSBuYW1lcyBwcmVmZXJlbmNlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURV9OQU1FUyA9ICJ0ZW1wbGF0ZU5hbWVzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBwcm9jZXNzIGNvbnRleHQgcHJlZmVyZW5jZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZJVFlfQ09OVEVYVCA9ICJhY3Rpdml0eSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVidWcgPSB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vTWlncmF0aW9uRXhwb3J0RXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9NaWdyYXRpb25FeHBvcnRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViMTEyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9NaWdyYXRpb25FeHBvcnRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRpb25FeHBvcnRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTA0OTQwMDM1MDUyNzcxMDYxNEw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTWlncmF0aW9uRXhwb3J0RXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqLwotCXB1YmxpYyBNaWdyYXRpb25FeHBvcnRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIobWVzc2FnZSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjYXVzZQotCSAqLwotCXB1YmxpYyBNaWdyYXRpb25FeHBvcnRFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0JCXN1cGVyKGNhdXNlKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcGFyYW0gY2F1c2UKLQkgKi8KLQlwdWJsaWMgTWlncmF0aW9uRXhwb3J0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLQkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL01pZ3JhdGlvblJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vTWlncmF0aW9uUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZTNiMTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vTWlncmF0aW9uUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIE1pZ3JhdGlvbiByZXNvdXJjZXMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNaWdyYXRpb25SZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIE1pZ3JhdGlvblJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya2Zsb3dfZXhwb3J0X3dpemFyZF90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrZmxvd19leHBvcnRfd2l6YXJkX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya2Zsb3dfZXhwb3J0X3dpemFyZF9wcm9jZXNzR3JvdXBfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrZmxvd19leHBvcnRfd2l6YXJkX2NhcGFiaWxpdHlQYXR0ZXJuUmFkaW9CdXR0b25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrZmxvd19leHBvcnRfd2l6YXJkX2RlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya2Zsb3dfZXhwb3J0X3dpemFyZF9wcm9jZXNzTmFtZUxhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya2Zsb3dfZXhwb3J0X3dpemFyZF9jb250ZXh0TmFtZUxhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya2Zsb3dfZXhwb3J0X3dpemFyZF90ZW1wbGF0ZUdyb3VwX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya2Zsb3dfZXhwb3J0X3dpemFyZF90ZW1wbGF0ZU5hbWVMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X2V4cG9ydF93aXphcmRfZGlyTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrZmxvd19leHBvcnRfd2l6YXJkX2Jyb3dzZUJ1dHRvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X292ZXJ3cml0ZVRleHREaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya2Zsb3dfb3ZlcndyaXRlVGV4dF9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya2Zsb3dfZXhwb3J0X3dpemFyZF9hY3Rpdml0aWVzTmFtZUxhYmVsX3RleHQ7Ci0KLQkJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3Blbl9tZXRob2RfbGlicmFyeV9lcnJvcl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuX21ldGhvZF9saWJyYXJ5X2Vycm9yX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR1JBUEhfTk9ERV9GT1JLOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdSQVBIX05PREVfSU5JVElBTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHUkFQSF9OT0RFX0ZJTkFMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdSQVBIX05PREVfREVDSVNJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR1JBUEhfTk9ERV9GUkVFX1RFWFQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR1JBUEhfTk9ERV9NRVJHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHUkFQSF9OT0RFX0pPSU47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR1JBUEhfTk9ERV9MSU5LOwotCQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1pZ3JhdGlvblJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMWYzODQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi13b3JrZmxvd19leHBvcnRfd2l6YXJkX3RpdGxlPUV4cG9ydCBXb3JrZmxvdyBXaXphcmQKLXdvcmtmbG93X2V4cG9ydF93aXphcmRfdGV4dD1XaXphcmQgdG8gZXhwb3J0IHdvcmtmbG93IChhY3Rpdml0eSBkaWFncmFtcykKLXdvcmtmbG93X2V4cG9ydF93aXphcmRfcHJvY2Vzc0dyb3VwX3RleHQ9UHJvY2Vzcwotd29ya2Zsb3dfZXhwb3J0X3dpemFyZF9jYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uX3RleHQ9Q2FwYWJpbGl0eSBQYXR0ZXJuCi13b3JrZmxvd19leHBvcnRfd2l6YXJkX2RlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uX3RleHQ9RGVsaXZlcnkgUHJvY2Vzcwotd29ya2Zsb3dfZXhwb3J0X3dpemFyZF9wcm9jZXNzTmFtZUxhYmVsX3RleHQ9UHJvY2VzczoKLXdvcmtmbG93X2V4cG9ydF93aXphcmRfY29udGV4dE5hbWVMYWJlbF90ZXh0PUNvbmZpZ3VyYXRpb246Ci13b3JrZmxvd19leHBvcnRfd2l6YXJkX3RlbXBsYXRlR3JvdXBfdGV4dD1UZW1wbGF0ZQotd29ya2Zsb3dfZXhwb3J0X3dpemFyZF90ZW1wbGF0ZU5hbWVMYWJlbF90ZXh0PUZpbGUgTmFtZToKLXdvcmtmbG93X2V4cG9ydF93aXphcmRfZGlyTGFiZWxfdGV4dD1EaXJlY3Rvcnk6Ci13b3JrZmxvd19leHBvcnRfd2l6YXJkX2Jyb3dzZUJ1dHRvbl90ZXh0PUJyb3dzZS4uLgotd29ya2Zsb3dfb3ZlcndyaXRlVGV4dERpYWxvZ190aXRsZT1PdmVyd3JpdGUKLXdvcmtmbG93X292ZXJ3cml0ZVRleHRfbXNnPURvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgZmlsZT8KLXdvcmtmbG93X2V4cG9ydF93aXphcmRfYWN0aXZpdGllc05hbWVMYWJlbF90ZXh0PUFjdGl2aXR5OgotCi1vcGVuX21ldGhvZF9saWJyYXJ5X2Vycm9yX3RpdGxlPU9wZW4gTWV0aG9kIExpYnJhcnkgRXJyb3IKLW9wZW5fbWV0aG9kX2xpYnJhcnlfZXJyb3JfdGV4dD1Zb3UgbmVlZCB0byBvcGVuIGEgbWV0aG9kIGxpYnJhcnkgYmVmb3JlIHBlcmZvcm1pbmcgYW4gZXhwb3J0LgotCi0jIEdyYXBoIE5vZGUgbmFtZXMKLQotR1JBUEhfTk9ERV9GT1JLPUZvcmsgTm9kZQotR1JBUEhfTk9ERV9JTklUSUFMPVN0YXJ0IE5vZGUKLUdSQVBIX05PREVfRklOQUw9RW5kIE5vZGUKLUdSQVBIX05PREVfREVDSVNJT049RGVjaXNpb24gbm9kZQotR1JBUEhfTk9ERV9GUkVFX1RFWFQ9RnJlZSBUZXh0Ci1HUkFQSF9OT0RFX01FUkdFPU1lcmdlIE5vZGUKLUdSQVBIX05PREVfSk9JTj1Kb2luIE5vZGUKLUdSQVBIX05PREVfTElOSz1MaW5rClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL0FjdGl2aXR5TWFwTm9kZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL0FjdGl2aXR5TWFwTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDBmOWI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9BY3Rpdml0eU1hcE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5tYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eU1hcE5vZGUgZXh0ZW5kcyBNYXBOb2RlIHsKLQotCXB1YmxpYyBBY3Rpdml0eU1hcE5vZGUoTm9kZSBub2RlKSB7Ci0JCXN1cGVyKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB1bWwgbm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZU5vZGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZU5vZGUoKTsKLQkJdW1sTm9kZSA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRBY3Rpdml0eSgpLmNyZWF0ZU5vZGUobmFtZSwKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpOwotCQlPYmplY3Qgb2JqID0gKE9iamVjdCkgbm9kZS5nZXRPYmplY3QoKTsKLS8qCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uKHVtbE5vZGUsICgoTWV0aG9kRWxlbWVudCkgb2JqKSk7Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFBoYXNlKSB7Ci0JCQlCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb25UeXBlKHVtbE5vZGUsIAotCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX1BIQVNFKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJdGVyYXRpb24pIHsKLQkJCUJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvblR5cGUodW1sTm9kZSwgCi0JCQkJCUJyaWRnZUhlbHBlci5VTUFfSVRFUkFUSU9OKTsKLQkJfSBlbHNlIHsKLQkJCUJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvblR5cGUodW1sTm9kZSwgCi0JCQkJCUJyaWRnZUhlbHBlci5VTUFfQUNUSVZJVFkpOwotCQl9Ki8KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCUJyaWRnZUhlbHBlci5hc3NvY2lhdGUodW1sTm9kZSwgKChNZXRob2RFbGVtZW50KSBvYmopKTsKLQkJfQotCi0JCWlmICh1bWxOb2RlICE9IG51bGwpIHsKLQkJCWdyYXBoVU1MTm9kZU1hcC5wdXQobm9kZSwgdW1sTm9kZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvQWN0aXZpdHlQYXJhbWV0ZXJNYXBlTm9kZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL0FjdGl2aXR5UGFyYW1ldGVyTWFwZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA0YjIyMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvQWN0aXZpdHlQYXJhbWV0ZXJNYXBlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTWFwZU5vZGUgZXh0ZW5kcyBNYXBOb2RlIHsKLQotCXB1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck1hcGVOb2RlKE5vZGUgbm9kZSkgewotCQlzdXBlcihub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdW1sIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVOb2RlKCkgewotCQlzdXBlci51cGRhdGVOb2RlKCk7Ci0JCXVtbE5vZGUgPSAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSBnZXRBY3Rpdml0eSgpLmNyZWF0ZU5vZGUobmFtZSwKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eVBhcmFtZXRlck5vZGUoKSk7Ci0JCU9iamVjdCBvYmogPSAoT2JqZWN0KSBub2RlLmdldE9iamVjdCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uKHVtbE5vZGUsICgoTWV0aG9kRWxlbWVudCkgb2JqKSk7Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uVHlwZSh1bWxOb2RlLCAKLQkJCQkJQnJpZGdlSGVscGVyLlVNQV9NSUxFU1RPTkUpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb25UeXBlKHVtbE5vZGUsIAotCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX1RBU0tfREVTQ1JJUFRPUik7Ci0JCX0KLQotCQlpZiAodW1sTm9kZSAhPSBudWxsKSB7Ci0JCQlncmFwaFVNTE5vZGVNYXAucHV0KG5vZGUsIHVtbE5vZGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL0RlY2lzaW9uTm9kZU1hcC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL0RlY2lzaW9uTm9kZU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTg1OGE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9EZWNpc2lvbk5vZGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5tYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkRlY2lzaW9uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERlY2lzaW9uTm9kZU1hcCBleHRlbmRzIE1hcE5vZGUgewotCi0KLQkvKioKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXB1YmxpYyBEZWNpc2lvbk5vZGVNYXAoTm9kZSBub2RlKSB7Ci0JCXN1cGVyKG5vZGUpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBVcGRhdGUgdW1sIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVOb2RlKCkgewotCQlzdXBlci51cGRhdGVOb2RlKCk7Ci0KLQkJdW1sTm9kZSA9IChEZWNpc2lvbk5vZGUpZ2V0QWN0aXZpdHkoKS5jcmVhdGVOb2RlKG5hbWUgPSAobmFtZSAhPSBudWxsKT8gbmFtZSA6ICIgIiwgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldERlY2lzaW9uTm9kZSgpKTsKLQkJCi0JCWlmKHVtbE5vZGUgIT0gbnVsbCl7Ci0JCQlncmFwaFVNTE5vZGVNYXAucHV0KG5vZGUsIHVtbE5vZGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL0ZpbmFsTm9kZU1hcC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL0ZpbmFsTm9kZU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTI3OTYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9GaW5hbE5vZGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5tYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RmluYWxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRmluYWxOb2RlTWFwIGV4dGVuZHMgTWFwTm9kZSB7Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHVibGljIEZpbmFsTm9kZU1hcChOb2RlIG5vZGUpIHsKLQkJc3VwZXIobm9kZSk7Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZSB1bWwgbm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZU5vZGUoKSB7Ci0JCQotCQlzdXBlci51cGRhdGVOb2RlKCk7Ci0JCXVtbE5vZGUgPSAoQWN0aXZpdHlGaW5hbE5vZGUpZ2V0QWN0aXZpdHkoKS5jcmVhdGVOb2RlKG5hbWUgPSAobmFtZSAhPSBudWxsKT8gbmFtZSA6IEdSQVBIX05PREVfRklOQUwsIAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RmluYWxOb2RlKCkpOwotCQkKLQkJaWYodW1sTm9kZSAhPSBudWxsKXsKLQkJCWdyYXBoVU1MTm9kZU1hcC5wdXQobm9kZSwgdW1sTm9kZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvRm9ya05vZGVNYXAuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9Gb3JrTm9kZU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWE5ZjJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9Gb3JrTm9kZU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLm1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRm9ya05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JrTm9kZU1hcCBleHRlbmRzIE1hcE5vZGUgewotCi0JLyoqCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQlwdWJsaWMgRm9ya05vZGVNYXAoTm9kZSBub2RlKSB7Ci0JCXN1cGVyKG5vZGUpOwotCX0KLQkKLQkvKioKLQkgKiAgVXBkYXRlIHVtbCBub2RlCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlTm9kZSgpIHsKLQkJc3VwZXIudXBkYXRlTm9kZSgpOwotCi0JCXVtbE5vZGUgPSAoRm9ya05vZGUpZ2V0QWN0aXZpdHkoKS5jcmVhdGVOb2RlKG5hbWUgPSAobmFtZSAhPSBudWxsKT8gbmFtZSA6IEdSQVBIX05PREVfRk9SS19OT0RFLCAKLQkJCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEZvcmtOb2RlKCkpOwotCQotCQlpZih1bWxOb2RlICE9IG51bGwpewotCQkJZ3JhcGhVTUxOb2RlTWFwLnB1dChub2RlLCB1bWxOb2RlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL0lNYXBDb25zdGFudHMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9JTWFwQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMTVmODQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL0lNYXBDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5tYXA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLk1pZ3JhdGlvblJlc291cmNlczsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWFwQ29uc3RhbnRzIHsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVidWcgID0gdHJ1ZTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9OT0RFX0ZPUktfTk9ERSA9ICIiOyAvL01pZ3JhdGlvblJlc291cmNlcy5HUkFQSF9OT0RFX0ZPUks7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQVBIX05PREVfSU5JVElBTCA9ICIiOyAvL01pZ3JhdGlvblJlc291cmNlcy5HUkFQSF9OT0RFX0lOSVRJQUw7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQVBIX05PREVfRklOQUwgPSAiIjsgLy8gTWlncmF0aW9uUmVzb3VyY2VzLkdSQVBIX05PREVfRklOQUw7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQVBIX05PREVfREVDSVNJT04gPSAgTWlncmF0aW9uUmVzb3VyY2VzLkdSQVBIX05PREVfREVDSVNJT047Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9OT0RFX0ZSRUVfVEVYVCA9IE1pZ3JhdGlvblJlc291cmNlcy5HUkFQSF9OT0RFX0ZSRUVfVEVYVDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9OT0RFX01FUkdFID0gTWlncmF0aW9uUmVzb3VyY2VzLkdSQVBIX05PREVfTUVSR0U7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfTk9ERV9KT0lOID0gIiI7IC8vTWlncmF0aW9uUmVzb3VyY2VzLkdSQVBIX05PREVfSk9JTjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBNYXAgZ3JhcGhVTUxOb2RlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9Jbml0aWFsTm9kZU1hcC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL0luaXRpYWxOb2RlTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNjVhNGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL0luaXRpYWxOb2RlTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Jbml0aWFsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlTWFwIGV4dGVuZHMgTWFwTm9kZSB7Ci0KLQkKLQkvKioKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXB1YmxpYyBJbml0aWFsTm9kZU1hcChOb2RlIG5vZGUpIHsKLQkJc3VwZXIobm9kZSk7Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZSB1bWwgbm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZU5vZGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZU5vZGUoKTsKLQkJdW1sTm9kZSA9IChJbml0aWFsTm9kZSlnZXRBY3Rpdml0eSgpLmNyZWF0ZU5vZGUobmFtZSA9IChuYW1lICE9IG51bGwpPyBuYW1lIDogR1JBUEhfTk9ERV9JTklUSUFMLCAKLQkJCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRpYWxOb2RlKCkpOwotCQkKLQkJaWYodW1sTm9kZSAhPSBudWxsKXsKLQkJCWdyYXBoVU1MTm9kZU1hcC5wdXQobm9kZSwgdW1sTm9kZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvSm9pbk5vZGVNYXAuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9Kb2luTm9kZU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjkyYTU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9Kb2luTm9kZU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLm1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSm9pbk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSm9pbk5vZGVNYXAgZXh0ZW5kcyBNYXBOb2RlIHsKLQotCXB1YmxpYyBKb2luTm9kZU1hcChOb2RlIG5vZGUpIHsKLQkJc3VwZXIobm9kZSk7Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZSB1bWwgbm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZU5vZGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZU5vZGUoKTsKLQkJdW1sTm9kZSA9IChKb2luTm9kZSlnZXRBY3Rpdml0eSgpLmNyZWF0ZU5vZGUobmFtZSA9IChuYW1lICE9IG51bGwpPyBuYW1lIDogR1JBUEhfTk9ERV9KT0lOLCAKLQkJCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEpvaW5Ob2RlKCkpOwotCQkKLQkJaWYodW1sTm9kZSAhPSBudWxsKXsKLQkJCWdyYXBoVU1MTm9kZU1hcC5wdXQobm9kZSwgdW1sTm9kZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvTWFwRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL01hcEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZiNTM2Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvTWFwRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5tYXA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLQotCi1wdWJsaWMgY2xhc3MgTWFwRmFjdG9yeSB7Ci0JTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlzdGF0aWMgTWFwRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQotCQotCXB1YmxpYyBzdGF0aWMgTWFwRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotCQkJZmFjdG9yeSA9IG5ldyBNYXBGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQ3JldGUgbWFwIG5vZGUKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTWFwTm9kZSBjcmVhdGUoTm9kZSBub2RlKSB7Ci0JCWludCBjbGFzc2lmaWVyID0gbm9kZS5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKTsKLQkJc3dpdGNoIChjbGFzc2lmaWVyKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERToKLQkJCXJldHVybiBjcmVhdGVXb3JrQnJlYWtEb3duRWxlbWVudE5vZGUobm9kZSk7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREU6Ci0JCQlUeXBlZE5vZGUgdHlwZWROb2RlID0gKFR5cGVkTm9kZSkgbm9kZTsKLQkJCWlmICh0eXBlZE5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5ERUNJU0lPTikgewotCQkJCUxpc3QgaW5jb21pbmdDb25uZWN0aW9ucyA9IHR5cGVkTm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCk7Ci0JCQkJCi0JCQkJaWYgKGluY29taW5nQ29ubmVjdGlvbnMuc2l6ZSgpID4gMSkKLQkJCQkJcmV0dXJuIGNyZWF0ZU1lcmdlTm9kZShub2RlKTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiBjcmVhdGVEZWNpc2lvbk5vZGUobm9kZSk7Ci0JCQkJCi0vLwkJCQlMaXN0IG91dGdvaW5nQ29ubmVjdGlvbnMgPSB0eXBlZE5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpOwotLy8JCQkJaWYgKGluY29taW5nQ29ubmVjdGlvbnMuc2l6ZSgpID4gMSAmJiBvdXRnb2luZ0Nvbm5lY3Rpb25zLnNpemUoKSA9PSAxKQotLy8JCQkJCXJldHVybiBjcmVhdGVNZXJnZU5vZGUobm9kZSk7Ci0vLwkJCQlpZiAoaW5jb21pbmdDb25uZWN0aW9ucy5zaXplKCkgPT0gMSAmJiBvdXRnb2luZ0Nvbm5lY3Rpb25zLnNpemUoKSA+IDEpCi0vLwkJCQkJcmV0dXJuIGNyZWF0ZURlY2lzaW9uTm9kZShub2RlKTsKLS8vCQkJCWlmIChpbmNvbWluZ0Nvbm5lY3Rpb25zLnNpemUoKSA+IDEKLS8vCQkJCQkJJiYgb3V0Z29pbmdDb25uZWN0aW9ucy5zaXplKCkgPiAxKSB7Ci0vLwkJCQkJY3JlYXRlTWVyZ2VOb2RlKG5vZGUpOwotLy8JCQkJCXJldHVybiBjcmVhdGVEZWNpc2lvbk5vZGUobm9kZSk7Ci0vLwkJCQl9Ci0JCQl9IGVsc2UgaWYgKHR5cGVkTm9kZS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNUQVJUKQotCQkJCXJldHVybiBjcmVhdGVJbml0aWFsTm9kZShub2RlKTsKLQkJCWVsc2UgaWYgKHR5cGVkTm9kZS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkVORCkKLQkJCQlyZXR1cm4gY3JlYXRlRmluYWxOb2RlKG5vZGUpOwotCQkJZWxzZSBpZiAodHlwZWROb2RlLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1lOQ0hfQkFSKSB7Ci0JCQkJTGlzdCBpbmNvbWluZ0Nvbm5lY3Rpb25zID0gdHlwZWROb2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKTsKLQkJCQlpZiAoaW5jb21pbmdDb25uZWN0aW9ucy5zaXplKCkgPiAxKQotCQkJCQlyZXR1cm4gY3JlYXRlSm9pbk5vZGUobm9kZSk7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gY3JlYXRlRm9ya05vZGUobm9kZSk7Ci0vLwkJCQlMaXN0IG91dGdvaW5nQ29ubmVjdGlvbnMgPSB0eXBlZE5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpOwotLy8JCQkJaWYgKGluY29taW5nQ29ubmVjdGlvbnMuc2l6ZSgpID4gMSAmJiBvdXRnb2luZ0Nvbm5lY3Rpb25zLnNpemUoKSA9PSAxKQotLy8JCQkJCXJldHVybiBjcmVhdGVKb2luTm9kZShub2RlKTsKLS8vCQkJCWlmIChpbmNvbWluZ0Nvbm5lY3Rpb25zLnNpemUoKSA9PSAxICYmIG91dGdvaW5nQ29ubmVjdGlvbnMuc2l6ZSgpID4gMSkKLS8vCQkJCQlyZXR1cm4gY3JlYXRlRm9ya05vZGUobm9kZSk7Ci0vLwkJCQlpZiAoaW5jb21pbmdDb25uZWN0aW9ucy5zaXplKCkgPiAxCi0vLwkJCQkJCSYmIG91dGdvaW5nQ29ubmVjdGlvbnMuc2l6ZSgpID4gMSkgewotLy8JCQkJCWNyZWF0ZUpvaW5Ob2RlKG5vZGUpOwotLy8JCQkJCXJldHVybiBjcmVhdGVGb3JrTm9kZShub2RlKTsKLS8vCQkJCX0KLQkJCX0gZWxzZSBpZiAodHlwZWROb2RlLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuRlJFRV9URVhUKSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUZyZWVUZXh0Tm9kZShub2RlKTsKLQkJCX0KLQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOSzoKLQkJCXJldHVybiBjcmVhdGVDb250cm9sRmxvdyhub2RlKTsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgbm9kZS5lQ2xhc3MoKS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgTWFwTm9kZSBjcmVhdGVXb3JrQnJlYWtEb3duRWxlbWVudE5vZGUoTm9kZSBub2RlKSB7Ci0JCU9iamVjdCBvYmogPSBub2RlLmdldE9iamVjdCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIAotCQkJcmV0dXJuIG5ldyBBY3Rpdml0eU1hcE5vZGUobm9kZSk7Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yIHx8IG9iaiBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgCi0JCQlyZXR1cm4gbmV3IEFjdGl2aXR5UGFyYW1ldGVyTWFwZU5vZGUobm9kZSk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIE1hcE5vZGUgY3JlYXRlRnJlZVRleHROb2RlKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIE1hcE5vZGUgY3JlYXRlRmluYWxOb2RlKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbmV3IEZpbmFsTm9kZU1hcChub2RlKTsKLQl9Ci0KLQlwcml2YXRlIE1hcE5vZGUgY3JlYXRlSW5pdGlhbE5vZGUoTm9kZSBub2RlKSB7Ci0JCXJldHVybiBuZXcgSW5pdGlhbE5vZGVNYXAobm9kZSk7Ci0JfQotCi0JcHJpdmF0ZSBNYXBOb2RlIGNyZWF0ZUNvbnRyb2xGbG93KE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIE1hcE5vZGUgY3JlYXRlTWVyZ2VOb2RlKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbmV3IE1lcmdlTm9kZU1hcChub2RlKTsKLQl9Ci0KLQlwcml2YXRlIE1hcE5vZGUgY3JlYXRlSm9pbk5vZGUoTm9kZSBub2RlKSB7Ci0JCXJldHVybiBuZXcgSm9pbk5vZGVNYXAobm9kZSk7Ci0JfQotCi0JcHJpdmF0ZSBNYXBOb2RlIGNyZWF0ZURlY2lzaW9uTm9kZShOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG5ldyBEZWNpc2lvbk5vZGVNYXAobm9kZSk7Ci0JfQotCi0JcHJpdmF0ZSBNYXBOb2RlIGNyZWF0ZUZvcmtOb2RlKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbmV3IEZvcmtOb2RlTWFwKG5vZGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9NYXBOb2RlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvTWFwTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTg3YTRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9NYXBOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLm1hcDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5QcmVjaXNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkZvcmtOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Kb2luTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuTWVyZ2VOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Cb3VuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLklkZW50aXR5QW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5SZWxhdGl2ZUJlbmRwb2ludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5kYXRhdHlwZS5SZWxhdGl2ZUJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1hcE5vZGUgaW1wbGVtZW50cyBJTWFwQ29uc3RhbnRzIHsKLQotCXByb3RlY3RlZCBOb2RlIG5vZGU7Ci0KLQkvL3ByaXZhdGUgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQ7Ci0KLQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBub3RhdGlvbk5vZGU7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCQotCXByaXZhdGUgRGlhZ3JhbSBkaWFncmFtOwotCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0JcHJvdGVjdGVkIEFjdGl2aXR5Tm9kZSB1bWxOb2RlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElNQUdFX0hFSUdIVCA9IDMyOwotCQotCXB1YmxpYyBNYXBOb2RlKE5vZGUgbm9kZSkgewotCQl0aGlzLm5vZGUgPSBub2RlOwotCX0KLQotCXB1YmxpYyBNYXBOb2RlKCkgewotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSByZXNvdXJjZQotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZVNldAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSB1cGRhdGVSZXNvdXJjZSgpIHsKLQkJRGlhZ3JhbSBkaWFncmFtID0gZ2V0RGlhZ3JhbSgpOwotCi0JCS8vIENoZWNrIGlmIG5vdGF0aW9uIGVsZW1lbnQgYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZ3JhcGhVTUxOb2RlTWFwLmdldChub2RlKSAhPSBudWxsKSB7Ci0JCQlvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGUgdGVtcFVNTE5vZGUgPSAoQWN0aXZpdHlOb2RlKSBncmFwaFVNTE5vZGVNYXAKLQkJCQkJLmdldChub2RlKTsKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgdGVtcE5vdGF0aW9uTm9kZSA9IGZpbmROb3RhdGlvbk5vZGUoCi0JCQkJCWRpYWdyYW0sIHRlbXBVTUxOb2RlKTsKLQkJCWlmICh0ZW1wTm90YXRpb25Ob2RlICE9IG51bGwpCi0JCQkJcmV0dXJuIHRlbXBOb3RhdGlvbk5vZGU7Ci0KLQkJfQotCi0JCS8vIENyZWF0ZSBBY3Rpdml0eSBOb2RlCi0JCXVwZGF0ZU5vZGUoKTsKLQotCQkvLyBDcmVhdGUgTm90YXRpb24gbm5vZGUKLQkJbm90YXRpb25Ob2RlID0gTWFwVXRpbC5jcmVhdGVOb3RhdGlvbk5vZGVfQUQoZGlhZ3JhbSwgdW1sTm9kZSk7Ci0JCWRpYWdyYW0uaW5zZXJ0Q2hpbGQobm90YXRpb25Ob2RlKTsKLQotCQkvLyBzZXQgc2l6ZQotCQlzZXRMYXlvdXRDb25zdHJhaW50KG5vZGUsIG5vdGF0aW9uTm9kZSk7Ci0KLQkJLy8gc2V0IGVsZW1lbnQKLQkJbm90YXRpb25Ob2RlLnNldEVsZW1lbnQodW1sTm9kZSk7Ci0KLQkJLy8gbWFyayBpbmhlcml0ZWQKLQkJc2V0SW5oZXJpdGVkQXR0cmlidXRlKG5vZGUsIG5vdGF0aW9uTm9kZSk7Ci0JCQotCQlyZXR1cm4gbm90YXRpb25Ob2RlOwotCX0KLQotCQotCS8qKgotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIG5vdGF0aW9uTm9kZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRMYXlvdXRDb25zdHJhaW50KG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUgbm9kZSwKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgbm90YXRpb25Ob2RlKSB7Ci0JCUJvdW5kcyBib3VuZHMgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpOwotCQkKLQkJaW50IHR5cGUgPSBuZXcgSW50ZWdlcihub3RhdGlvbk5vZGUuZ2V0VHlwZSgpKS5pbnRWYWx1ZSgpOwotCQlpZiAobm9kZS5nZXRIZWlnaHQoKSA9PSAtMSkgewotCQkJIGlmICh0eXBlID09IERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCB8fCB0eXBlID09IE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkJewotCQkJCSBib3VuZHMuc2V0SGVpZ2h0KDI0KTsKLQkJCSB9Ci0JCQkgZWxzZSBpZiAodHlwZSA9PSBGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCB8fCB0eXBlID09IEpvaW5Ob2RlRWRpdFBhcnQuVklTVUFMX0lEKQl7Ci0JCQkJIGJvdW5kcy5zZXRIZWlnaHQoNSk7Ci0JCQkgfQotCQkJIGVsc2UgaWYgKHR5cGUgPT0gQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQpewotCQkJCSBib3VuZHMuc2V0SGVpZ2h0KDI0KTsKLQkJCSB9Ci0JCX0gZWxzZSB7Ci0JCQlib3VuZHMuc2V0SGVpZ2h0KG5vZGUuZ2V0SGVpZ2h0KCkpOwotCQl9Ci0JCQotCQkvLyBEdWUgdG8gYnVnIGluIG9sZCBkaWFncmFtLCBzb21lIG9mIHRoZSBkZWNpc2lvbk5vZGUgd2lkdGggaXMgLTEKLQkJaWYgKChub2RlLmdldFdpZHRoKCkgPT0gLTEpICYmICh0eXBlID09IERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRAotCQkJCQl8fCB0eXBlID09IE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkpIHsKLQkJCQlib3VuZHMuc2V0V2lkdGgoNDgpOwotCQl9IGVsc2UgewotCQkJYm91bmRzLnNldFdpZHRoKG5vZGUuZ2V0V2lkdGgoKSk7Ci0JCX0KLQkJCi0JCWludCB3ID0gYm91bmRzLmdldFdpZHRoKCk7Ci0JCWludCBoID0gYm91bmRzLmdldEhlaWdodCgpOwotCQlEaW1lbnNpb24gZGltID0gRGlhZ3JhbUNvcmVVdGlsLmdldFRleHRTaXplSW5XcmFwTGFiZWwobmFtZSwgbnVsbCwgdywgaCwgbnVsbCk7Ci0JCWludCBkaW13ID0gZGltLndpZHRoOwotCQlpZiAodyA8IGRpbXcgJiYgZGltdyAhPSAwKSB7Ci0JCQlib3VuZHMuc2V0V2lkdGgoZGltdyk7Ci0JCX0KLQkJCi0vLwkJYm91bmRzLnNldEhlaWdodChub2RlLmdldEhlaWdodCgpKTsKLS8vCQlib3VuZHMuc2V0V2lkdGgobm9kZS5nZXRXaWR0aCgpKTsKLQkJYm91bmRzLnNldFgobm9kZS5nZXRMb2NhdGlvbigpLngpOwotCQlib3VuZHMuc2V0WShub2RlLmdldExvY2F0aW9uKCkueSk7Ci0JCW5vdGF0aW9uTm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KGJvdW5kcyk7Ci0JfQotCi0JLyoqCi0JICogU2V0IGluaGVyaXRlZCBhdHRyaWJ1dGUKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBub3RhdGlvbk5vZGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0SW5oZXJpdGVkQXR0cmlidXRlKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUgbm9kZSwKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgbm90YXRpb25Ob2RlKSB7Ci0JCWlmIChub2RlLmdldExpbmtlZEVsZW1lbnQoKSA9PSBudWxsKSB7Ci0JCQlpZiAobm9kZS5nZXRHcmFwaE5vZGUoKS5nZXRCcmllZkRlc2NyaXB0aW9uKCkgIT0gbnVsbAotCQkJCQkmJiAhKG5vZGUuZ2V0R3JhcGhOb2RlKCkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpLnRyaW0oKQotCQkJCQkJCS5lcXVhbHMoIiIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCUJyaWRnZUhlbHBlci5tYXJrSW5oZXJpdGVkKG5vdGF0aW9uTm9kZSk7Ci0JCX0gCi0JfQotCQotCQotCS8qKgotCSAqIEZpbmQgY29ycmVzcG9uZGluZyBub3RhdGlvbiBub2RlIGZvciB0aGUgdW1sIG5vZGUgaW4gdGhlIGRpYWdyYW0KLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEBwYXJhbSB1bWxOb2RlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBmaW5kTm90YXRpb25Ob2RlKAotCQkJRGlhZ3JhbSBkaWFncmFtLCBBY3Rpdml0eU5vZGUgdW1sTm9kZSkgewotCQlMaXN0IGxpc3QgPSBkaWFncmFtLmdldENoaWxkcmVuKCk7Ci0JCWlmIChsaXN0ICE9IG51bGwgJiYgbGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBub2RlID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIGl0ZXJhdG9yCi0JCQkJCQkubmV4dCgpOwotCQkJCWlmICh1bWxOb2RlLmVxdWFscyhub2RlLmdldEVsZW1lbnQoKSkpIHsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBVbWwgbm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZU5vZGUoKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgTmFtZWROb2RlKSB7Ci0JCQluYW1lID0gKChOYW1lZE5vZGUpIG5vZGUpLmdldE5hbWUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBvdXRnb2luZyBjb25uZWN0aW9ucwotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHVibGljIHZvaWQgb3V0Z29pbmdDb25uZWN0aW9ucyhOb2RlIG5vZGUpIHsKLQkJTGlzdCBjb25uZWN0aW9ucyA9IG5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpOwotCi0JCWlmIChjb25uZWN0aW9ucyAhPSBudWxsICYmIGNvbm5lY3Rpb25zLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb25uZWN0aW9ucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkKLQkJCQkvLyBjcmVhdGUgY29ubmVjdGlvbgotCQkJCUVkZ2UgZWRnZSA9IGNyZWF0ZUNvbm5lY3Rpb24obGluayk7Ci0KLQkJCQlBY3Rpdml0eU5vZGUgc291cmNlTm9kZSA9IChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGUpIGdyYXBoVU1MTm9kZU1hcAotCQkJCQkJLmdldChub2RlKTsKLQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIHNvdXJjZU5vdGF0aW9uTm9kZSA9IGZpbmROb3RhdGlvbk5vZGUoCi0JCQkJCQlnZXREaWFncmFtKCksIHNvdXJjZU5vZGUpOwotCi0JCQkJLy8gYWRkIHRoZSBlZGdlIGFzIHNvdXJjZSBlZGdlCi0JCQkJc291cmNlTm90YXRpb25Ob2RlLmdldFNvdXJjZUVkZ2VzKCkuYWRkKGVkZ2UpOwotCQkJCXNvdXJjZU5vdGF0aW9uTm9kZS5nZXREaWFncmFtKCkuaW5zZXJ0RWRnZShlZGdlKTsKLQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIFVNTCBjb250cm9sIGZsb3cKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBDb250cm9sRmxvdyBjcmVhdGVDb250cm9sRmxvdygpIHsKLQkJQ29udHJvbEZsb3cgY29udHJvbEZsb3cgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3cpIGdldEFjdGl2aXR5KCkKLQkJCQkuY3JlYXRlRWRnZSgiIiwgLypNaWdyYXRpb25SZXNvdXJjZXMuR1JBUEhfTk9ERV9MSU5LLCovIC8vJE5PTi1OTFMtMSQKLQkJCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRyb2xGbG93KCkpOwotCi0JCXJldHVybiBjb250cm9sRmxvdzsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyBzb3VyY2UgYW5kIHRhcmdldCBlbmQgcG9pbnRzIGZvciBzeW5jaHJvbml6YXRpb24gYmFyIGFuZCBkZWNpc2lvbiBub2RlCi0JICogQHBhcmFtIGVkZ2UKLQkgKiBAcGFyYW0gZmxvdwotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkU291cmNlQW5kVGFyZ2V0RW5kUG9pbnQoRWRnZSBlZGdlLCBMaW5rIGZsb3cpIHsKLQkJUG9pbnQgc3JjUG9pbnQgPSBmbG93LmdldFNvdXJjZUVuZFBvaW50KCk7Ci0JCVBvaW50IHRhcmdldFBvaW50ID0gZmxvdy5nZXRUYXJnZXRFbmRQb2ludCgpOwotCi0JCVZpZXcgc3JjVmlldyA9IGVkZ2UuZ2V0U291cmNlKCk7Ci0JCVZpZXcgdGFyZ2V0VmlldyA9IGVkZ2UuZ2V0VGFyZ2V0KCk7Ci0JCWludCBzcmNUeXBlID0gbmV3IEludGVnZXIoc3JjVmlldy5nZXRUeXBlKCkpLmludFZhbHVlKCk7Ci0JCWludCB0YXJnZXRUeXBlID0gbmV3IEludGVnZXIodGFyZ2V0Vmlldy5nZXRUeXBlKCkpLmludFZhbHVlKCk7Ci0KLQkJaWYgKHNyY1R5cGUgPT0gRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQgfHwgc3JjVHlwZSA9PSBKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCB8fAotCQkJCXNyY1R5cGUgPT0gRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEIHx8IHNyY1R5cGUgPT0gTWVyZ2VOb2RlRWRpdFBhcnQuVklTVUFMX0lEKSB7Ci0JCQlpZiAoc3JjUG9pbnQgIT0gbnVsbAotCQkJCQkmJiBzcmNWaWV3IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSApIHsKLQkJCQlCb3VuZHMgYm91bmRzID0gKEJvdW5kcykgKChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlKSBzcmNWaWV3KQotCQkJCQkJLmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJCQlJZGVudGl0eUFuY2hvciBhbmNob3IgPSBjcmVhdGVJZGVudGl0eUFuY2hvcihzcmNQb2ludCwgYm91bmRzKTsKLQkJCQlpZiAoYW5jaG9yICE9IG51bGwpCi0JCQkJCWVkZ2Uuc2V0U291cmNlQW5jaG9yKGFuY2hvcik7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRhcmdldFR5cGUgPT0gRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQgfHwgdGFyZ2V0VHlwZSA9PSBKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCB8fAotCQkJCXRhcmdldFR5cGUgPT0gRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEIHx8IHRhcmdldFR5cGUgPT0gTWVyZ2VOb2RlRWRpdFBhcnQuVklTVUFMX0lEKSB7Ci0JCQlpZiAodGFyZ2V0UG9pbnQgIT0gbnVsbAotCQkJCQkmJiB0YXJnZXRWaWV3IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgewotCQkJCUJvdW5kcyBib3VuZHMgPSAoQm91bmRzKSAoKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIHRhcmdldFZpZXcpCi0JCQkJCQkuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCQkJCUlkZW50aXR5QW5jaG9yIGFuY2hvciA9IGNyZWF0ZUlkZW50aXR5QW5jaG9yKHRhcmdldFBvaW50LCBib3VuZHMpOwotCQkJCWlmIChhbmNob3IgIT0gbnVsbCkKLQkJCQkJZWRnZS5zZXRUYXJnZXRBbmNob3IoYW5jaG9yKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkKLQkvKioKLQkgKiBDcmVhdGUgaWRlbnRpdHkgYW5jaG9yCi0JICogQHBhcmFtIHBvaW50Ci0JICogQHBhcmFtIGJvdW5kcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElkZW50aXR5QW5jaG9yIGNyZWF0ZUlkZW50aXR5QW5jaG9yKFBvaW50IHBvaW50LCBCb3VuZHMgYm91bmRzKSB7Ci0JCVBvaW50IHRlbXBQb2ludCA9IG5ldyBQb2ludChib3VuZHMuZ2V0WCgpICsgcG9pbnQueCwgYm91bmRzLmdldFkoKQotCQkJCSsgcG9pbnQueSk7Ci0KLQkJUHJlY2lzaW9uUG9pbnQgcHJlUG9pbnQgPSBNYXBVdGlsLmdldEFuY2hvclJlbGF0aXZlTG9jYXRpb24odGVtcFBvaW50LCBib3VuZHMpOwotCQlTdHJpbmcgaWQgPSBNYXBVdGlsLmNvbXBvc2VUZXJtaW5hbFN0cmluZyhwcmVQb2ludCk7Ci0KLQkJSWRlbnRpdHlBbmNob3IgdmFsdWUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlkZW50aXR5QW5jaG9yKCk7Ci0JCXZhbHVlLnNldElkKGlkKTsKLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCQotCQotCQotCS8qKgotCSAqIExvYWQgcmVsYXRpdmUgYmVuZCBwb2ludHMKLQkgKiBAcGFyYW0gZWRnZQotCSAqIEBwYXJhbSBmbG93Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRCZW5kUG9pbnRzKEVkZ2UgZWRnZSwgTGluayBmbG93KSB7Ci0JCUxpc3QgbGlzdCA9IGZsb3cuZ2V0QmVuZHBvaW50cygpOwotCQlMaXN0PFJlbGF0aXZlQmVuZHBvaW50PiByZWxhdGl2ZVBvaW50cyA9IG5ldyBBcnJheUxpc3Q8UmVsYXRpdmVCZW5kcG9pbnQ+KCk7Ci0KLQkJUmVsYXRpdmVCZW5kcG9pbnQgcmJwID0gbmV3IFJlbGF0aXZlQmVuZHBvaW50KDAsIDAsIDAsIDApOwotCi0JCXJlbGF0aXZlUG9pbnRzLmFkZChyYnApOwotCQlpZiAobGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUFic29sdXRlQmVuZHBvaW50IGFicCA9IChBYnNvbHV0ZUJlbmRwb2ludCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQotCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgc3JjTm9kZSA9IChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlKSBlZGdlLmdldFNvdXJjZSgpOwotCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgdGFyZ2V0Tm9kZSA9IChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlKSBlZGdlLmdldFRhcmdldCgpOwotCQkJCWludCBzcmNUeXBlID0gbmV3IEludGVnZXIoc3JjTm9kZS5nZXRUeXBlKCkpLmludFZhbHVlKCk7Ci0JCQkJaW50IHRhcmdldFR5cGUgPSBuZXcgSW50ZWdlcih0YXJnZXROb2RlLmdldFR5cGUoKSkuaW50VmFsdWUoKTsKLQkJCQkKLQkJCQlCb3VuZHMgc291cmNlQm91bmRzID0gKEJvdW5kcykgc3JjTm9kZS5nZXRMYXlvdXRDb25zdHJhaW50KCk7CQkJCQotCQkJCUJvdW5kcyB0YXJnZXRCb3VuZHMgPSAoQm91bmRzKSB0YXJnZXROb2RlLmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJCQkJCQotCQkJCWludCBzcmNMaW5lID0gTWFwVXRpbC5nZXROb09mTGluZXMoc3JjTm9kZSk7Ci0JCQkJaW50IHRhcmdldExpbmUgPSBNYXBVdGlsLmdldE5vT2ZMaW5lcyh0YXJnZXROb2RlKTsKLQkJCQlpbnQgc3JjSGVpZ2h0ID0gTWFwVXRpbC5nZXRUZXh0SGVpZ2h0KHNyY05vZGUpOwotCQkJCWludCB0YXJnZXRIZWlnaHQgPSBNYXBVdGlsLmdldFRleHRIZWlnaHQodGFyZ2V0Tm9kZSk7Ci0JCQkJCi0JCQkJaW50IHNyY1ggPSBzb3VyY2VCb3VuZHMuZ2V0WCgpICsgc291cmNlQm91bmRzLmdldFdpZHRoKCkgLyAyOwotCQkJCWludCBzcmNZID0gc291cmNlQm91bmRzLmdldFkoKSArIChJTUFHRV9IRUlHSFQgKyAoc3JjTGluZSAqIHNyY0hlaWdodCkpIC8gMjsKLQkJCQlpbnQgdGFyWCA9IHRhcmdldEJvdW5kcy5nZXRYKCkgKyB0YXJnZXRCb3VuZHMuZ2V0V2lkdGgoKSAvIDI7Ci0JCQkJaW50IHRhclkgPSB0YXJnZXRCb3VuZHMuZ2V0WSgpICsgKElNQUdFX0hFSUdIVCArICh0YXJnZXRMaW5lICogdGFyZ2V0SGVpZ2h0KSkgLyAyOwotCi0JCQkJaWYgKHNyY1R5cGUgPT0gRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQKLQkJCQkJCXx8IHNyY1R5cGUgPT0gSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQKLQkJCQkJCXx8IHNyY1R5cGUgPT0gRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lECi0JCQkJCQl8fCBzcmNUeXBlID09IE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkgewotCQkJCQlQb2ludCBzcmNQb2ludCA9IGZsb3cuZ2V0U291cmNlRW5kUG9pbnQoKTsKLQkJCQkJaWYgKHNyY1BvaW50ICE9IG51bGwpIHsKLQkJCQkJCXNyY1ggPSBzb3VyY2VCb3VuZHMuZ2V0WCgpICsgc3JjUG9pbnQueDsKLQkJCQkJCXNyY1kgPSBzb3VyY2VCb3VuZHMuZ2V0WSgpICsgc3JjUG9pbnQueTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAodGFyZ2V0VHlwZSA9PSBGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRAotCQkJCQkJfHwgdGFyZ2V0VHlwZSA9PSBKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRAotCQkJCQkJfHwgdGFyZ2V0VHlwZSA9PSBEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQKLQkJCQkJCXx8IHRhcmdldFR5cGUgPT0gTWVyZ2VOb2RlRWRpdFBhcnQuVklTVUFMX0lEKSB7Ci0JCQkJCVBvaW50IHRhcmdldFBvaW50ID0gZmxvdy5nZXRUYXJnZXRFbmRQb2ludCgpOwkJCi0JCQkJCWlmICh0YXJnZXRQb2ludCAhPSBudWxsKSB7Ci0JCQkJCQl0YXJYID0gdGFyZ2V0Qm91bmRzLmdldFgoKSArIHRhcmdldFBvaW50Lng7Ci0JCQkJCQl0YXJZID0gdGFyZ2V0Qm91bmRzLmdldFkoKSArIHRhcmdldFBvaW50Lnk7Ci0JCQkJCX0JCQkKLQkJCQl9CQkJCi0JCQkJaWYgKHRhcmdldFR5cGUgPT0gQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQpewkKLQkJCQkJdGFyWCA9IHRhcmdldEJvdW5kcy5nZXRYKCkgKyB0YXJnZXRCb3VuZHMuZ2V0V2lkdGgoKSAvIDI7Ci0JCQkJCXRhclkgPSB0YXJnZXRCb3VuZHMuZ2V0WSgpICsgdGFyZ2V0Qm91bmRzLmdldEhlaWdodCgpIC8gMjsJCQotCQkJCX0KLQotCQkJCWludCByZWwxID0gYWJwLnggLSBzcmNYOwotCQkJCWludCByZWwyID0gYWJwLnkgLSBzcmNZOwotCQkJCWludCByZWwzID0gYWJwLnggLSB0YXJYOwotCQkJCWludCByZWw0ID0gYWJwLnkgLSB0YXJZOwotCi0JCQkJUmVsYXRpdmVCZW5kcG9pbnQgcmJwMSA9IG5ldyBSZWxhdGl2ZUJlbmRwb2ludChyZWwxLCByZWwyLAotCQkJCQkJcmVsMywgcmVsNCk7Ci0JCQkJcmVsYXRpdmVQb2ludHMuYWRkKHJicDEpOwotCQkJfQotCQl9Ci0JCXJlbGF0aXZlUG9pbnRzLmFkZChyYnApOwotCi0JCWlmIChyZWxhdGl2ZVBvaW50cy5zaXplKCkgPiAwKSB7Ci0JCQlSZWxhdGl2ZUJlbmRwb2ludHMgYmVuZHBvaW50cyA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVJlbGF0aXZlQmVuZHBvaW50cygpOwotCQkJYmVuZHBvaW50cy5zZXRQb2ludHMocmVsYXRpdmVQb2ludHMpOwotCQkJZWRnZS5zZXRCZW5kcG9pbnRzKGJlbmRwb2ludHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRmluZCBlZGdlIGluIGRpYWdyYW0gZ2l2ZW4gc291cmNlIGFuZCB0YXJnZXQgbm9kZXMKLQkgKiBAcGFyYW0gc291cmNlTm9kZQotCSAqIEBwYXJhbSB0YXJnZXROb2RlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgRWRnZSBmaW5kRWRnZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIHNvdXJjZU5vZGUsCi0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIHRhcmdldE5vZGUpIHsKLQkJTGlzdCBsaXN0ID0gbm90YXRpb25Ob2RlLmdldERpYWdyYW0oKS5nZXRFZGdlcygpOwotCQlpZiAobGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUVkZ2UgZWRnZSA9IChFZGdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKChlZGdlLmdldFRhcmdldCgpICE9IG51bGwpCi0JCQkJCQkmJiB0YXJnZXROb2RlLmVxdWFscyhlZGdlLmdldFRhcmdldCgpKQotCQkJCQkJJiYgKGVkZ2UuZ2V0U291cmNlKCkgIT0gbnVsbCkKLQkJCQkJCSYmIHNvdXJjZU5vZGUuZXF1YWxzKGVkZ2UuZ2V0U291cmNlKCkpKSB7Ci0JCQkJCXJldHVybiBlZGdlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZSBpbmNvbWluZyBjb25uZWN0aW9ucwotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHVibGljIHZvaWQgaW5jb21pbmdDb25uZWN0aW9ucyhOb2RlIG5vZGUpIHsKLQkJTGlzdCBjb25uZWN0aW9ucyA9IG5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpOwotCi0JCWlmIChjb25uZWN0aW9ucyAhPSBudWxsICYmIGNvbm5lY3Rpb25zLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb25uZWN0aW9ucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkKLQkJCQkvLyBjcmVhdGUgZWRnZQotCQkJCUVkZ2UgZWRnZSA9IGNyZWF0ZUNvbm5lY3Rpb24obGluayk7Ci0KLQkJCQlBY3Rpdml0eU5vZGUgc291cmNlTm9kZSA9IChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGUpIGdyYXBoVU1MTm9kZU1hcAotCQkJCQkJLmdldChub2RlKTsKLQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIHNvdXJjZU5vdGF0aW9uTm9kZSA9IGZpbmROb3RhdGlvbk5vZGUoCi0JCQkJCQlnZXREaWFncmFtKCksIHNvdXJjZU5vZGUpOwotCi0JCQkJLy8gYWRkIHRoZSBlZGdlIGFzIHRhcmdldCBlZGdlCi0JCQkJc291cmNlTm90YXRpb25Ob2RlLmdldFRhcmdldEVkZ2VzKCkuYWRkKGVkZ2UpOwotCQkJCXNvdXJjZU5vdGF0aW9uTm9kZS5nZXREaWFncmFtKCkuaW5zZXJ0RWRnZShlZGdlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBub3RhdGlvbiBlZGdlIGZvciB0aGUgZ2l2ZW4gbGluawotCSAqIEBwYXJhbSBsaW5rCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgRWRnZSBjcmVhdGVDb25uZWN0aW9uKExpbmsgbGluaykgewotCQkvLyBnZXQgc291cmNlIGFuZCB0YXJnZXQgb2JqZWN0cyBvZiB0aGUgbGluawotCQlOb2RlIHNvdXJjZU9iaiA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCU5vZGUgdGFyZ2V0T2JqID0gbGluay5nZXRUYXJnZXQoKTsKLQotCQkvLyBnZXQgdW1sIG5vZGVzCi0JCUFjdGl2aXR5Tm9kZSBzb3VyY2VVTUxOb2RlID0gKG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZSkgZ3JhcGhVTUxOb2RlTWFwCi0JCQkJLmdldChzb3VyY2VPYmopOwotCQlBY3Rpdml0eU5vZGUgdGFyZ2V0VU1MTm9kZSA9IChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGUpIGdyYXBoVU1MTm9kZU1hcAotCQkJCS5nZXQodGFyZ2V0T2JqKTsKLQotCQkvLyBnZXQgbm90YXRpb24gbm9kZXMKLQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBzb3VyY2VOb3RhdGlvbk5vZGUgPSBmaW5kTm90YXRpb25Ob2RlKAotCQkJCWdldERpYWdyYW0oKSwgc291cmNlVU1MTm9kZSk7Ci0JCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgdGFyZ2V0Tm90YXRpb25Ob2RlID0gZmluZE5vdGF0aW9uTm9kZSgKLQkJCQlnZXREaWFncmFtKCksIHRhcmdldFVNTE5vZGUpOwotCi0JCUVkZ2UgZWRnZSA9IGZpbmRFZGdlKHNvdXJjZU5vdGF0aW9uTm9kZSwgdGFyZ2V0Tm90YXRpb25Ob2RlKTsKLQkJaWYgKGVkZ2UgPT0gbnVsbCAmJiB0YXJnZXROb3RhdGlvbk5vZGUgIT0gbnVsbCkgewotCQkJQ29udHJvbEZsb3cgY29udHJvbEZsb3cgPSBjcmVhdGVDb250cm9sRmxvdygpOwotCi0JCQlpZiAodGFyZ2V0VU1MTm9kZSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJCWNvbnRyb2xGbG93LnNldFNvdXJjZSgoQWN0aXZpdHlOb2RlKSBzb3VyY2VVTUxOb2RlKTsKLQkJCQljb250cm9sRmxvdy5zZXRUYXJnZXQoKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0VU1MTm9kZSk7Ci0JCQl9Ci0KLQkJCS8vIGNyZWF0ZSBub3RhdGlvbiBlZGdlCi0JCQllZGdlID0gTWFwVXRpbC5jcmVhdGVFZGdlX0FEKHNvdXJjZU5vdGF0aW9uTm9kZSwgdGFyZ2V0Tm90YXRpb25Ob2RlLAotCQkJCQljb250cm9sRmxvdyk7Ci0JCQllZGdlLnNldEVsZW1lbnQoY29udHJvbEZsb3cpOwotCQkJbG9hZFNvdXJjZUFuZFRhcmdldEVuZFBvaW50KGVkZ2UsIGxpbmspOwotCQkJbG9hZEJlbmRQb2ludHMoZWRnZSwgbGluayk7Ci0JCX0KLQkJcmV0dXJuIGVkZ2U7Ci0JfQotCi0JLy8gcHJpdmF0ZSBFZGdlIGZpbmRFZGdlKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93IGZsb3csIERpYWdyYW0KLQkvLyBkaWFncmFtKSB7Ci0JLy8gTGlzdCBsaXN0ID0gZGlhZ3JhbS5nZXRDaGlsZHJlbigpOwotCS8vIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkvLyBPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCS8vIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFZGdlKSB7Ci0JLy8gT2JqZWN0IGVsZW1lbnQgPSAoKEVkZ2UpIG9iamVjdCkuZ2V0RWxlbWVudCgpOwotCS8vIGlmIChmbG93LmVxdWFscyhlbGVtZW50KSkgewotCS8vIHJldHVybiAoRWRnZSkgb2JqZWN0OwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBudWxsOwotCS8vIH0KLQotCXByaXZhdGUgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotLyoJCWlmIChkaWFncmFtID09IG51bGwpIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5nZXQoMCk7Ci0JCQlkaWFncmFtID0gKERpYWdyYW0pIHJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDEpOwotCQl9Ki8KLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JcHVibGljIEFjdGl2aXR5IGdldEFjdGl2aXR5KCkgewotLyoJCWlmIChhY3Rpdml0eSA9PSBudWxsKSB7Ci0JCQkvLyByZXR1cm4KLQkJCS8vIChBY3Rpdml0eSkoKE1vZGVsKWdldFVNTE9iamVjdCgpKS5hbGxPd25lZEVsZW1lbnRzKCkuZ2V0KDApOwotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIHJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmdldCgwKTsKLQkJCWFjdGl2aXR5ID0gKEFjdGl2aXR5KSByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJfSovCi0JCXJldHVybiBhY3Rpdml0eTsKLQl9Ci0JLy8gcHVibGljIEVPYmplY3QgZ2V0VU1MT2JqZWN0KCl7Ci0JLy8gaWYoZU9iamVjdCA9PSBudWxsKXsKLQkvLwkJCQotCS8vIGVPYmplY3QgPSAoQWN0aXZpdHkpZ2V0UmVzb3VyY2UoMCkuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JLy8gfQotCS8vIHJldHVybiBlT2JqZWN0OwotCS8vIH0KLQotCXB1YmxpYyB2b2lkIHNldERpYWdyYW0oRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCXRoaXMuZGlhZ3JhbSA9IGRpYWdyYW07Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZpdHkoQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCX0KLQotCS8vIHByaXZhdGUgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoaW50IGkpewotCS8vIHJldHVybiAoUmVzb3VyY2UpcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuZ2V0KGkpOwotCS8vIH0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL01hcFV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9NYXBVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZjBlMmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL01hcFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlByZWNpc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVGVtcGxhdGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkRlY2lzaW9uTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkZvcmtOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Jbml0aWFsTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Kb2luTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuTWVyZ2VOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5NZXJnZU5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuQ29tbW9uUGFyc2VySGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMuVmlld1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5GaWd1cmVVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uQm91bmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRlc2NyaXB0aW9uU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZpbGxTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTGluZVN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcmFtZXRlck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRGVjaXNpb25Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkZpbmFsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Gb3JrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Jbml0aWFsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Kb2luTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5NZXJnZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci0KLS8qKgotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqLwotCi1wdWJsaWMgY2xhc3MgTWFwVXRpbCB7Ci0KLQkvKioKLQkgKiBDcmVhdGUgbm90YXRpb24gbm9kZSBpbiBkaWFncmFtIGNvcnJlc3BvbmRpbmcgdG8gYWN0aXZpdHkgbm9kZQotCSAqIAotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHBhcmFtIHVtbE5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBOb2RlIGNyZWF0ZU5vdGF0aW9uTm9kZV9BRChEaWFncmFtIGRpYWdyYW0sIE9iamVjdCBvYmopIHsKLQkJTm9kZSBub3RhdGlvbk5vZGUgPSBudWxsOwotCi0JCUFjdGl2aXR5Tm9kZSB1bWxOb2RlID0gb2JqIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlID8gKEFjdGl2aXR5Tm9kZSkgb2JqCi0JCQkJOiBudWxsOwotCQlpZiAodW1sTm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIHsKLQkJCVN0cmluZyB0eXBlID0gQnJpZGdlSGVscGVyLmdldEVBbm5vdGF0aW9uVHlwZSh1bWxOb2RlLAotCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX1RZUEUpOwotCQkJaWYgKHR5cGUuZXF1YWxzSWdub3JlQ2FzZShCcmlkZ2VIZWxwZXIuVU1BX1BIQVNFKSkgewotCQkJCS8vIFBoYXNlCi0JCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQkJbmV3IEludGVnZXIoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEKQotCQkJCQkJLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQkKLQkJCX0gZWxzZSBpZiAodHlwZS5lcXVhbHNJZ25vcmVDYXNlKEJyaWRnZUhlbHBlci5VTUFfSVRFUkFUSU9OKSkgewotCQkJCS8vIEl0ZXJhdGlvbgotCQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJCW5ldyBJbnRlZ2VyKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuVklTVUFMX0lEKQotCQkJCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUobm90YXRpb25Ob2RlLCB1bWxOb2RlLCBuZXcgSW50ZWdlcigKLQkJCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIEFjdGl2aXR5Ci0JCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQkJbmV3IEludGVnZXIoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCQkJLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQl9Ci0JCQkKLQkJCS8vIHNldCBkZWZhdWx0IGZvbnQgc3R5bGUKLQkJCXNldERlZmF1bHRGb250U3R5bGUobm90YXRpb25Ob2RlKTsKLQkJCQotCQl9IGVsc2UgaWYgKHVtbE5vZGUgaW5zdGFuY2VvZiBJbml0aWFsTm9kZSkgewotCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQluZXcgSW50ZWdlcihJbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCUluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCX0gZWxzZSBpZiAodW1sTm9kZSBpbnN0YW5jZW9mIERlY2lzaW9uTm9kZSkgewotCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQluZXcgSW50ZWdlcihEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQlEZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJfSBlbHNlIGlmICh1bWxOb2RlIGluc3RhbmNlb2YgTWVyZ2VOb2RlKSB7Ci0JCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCW5ldyBJbnRlZ2VyKE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCU1lcmdlTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQl9IGVsc2UgaWYgKHVtbE5vZGUgaW5zdGFuY2VvZiBGb3JrTm9kZSkgewotCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQluZXcgSW50ZWdlcihGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCX0gZWxzZSBpZiAodW1sTm9kZSBpbnN0YW5jZW9mIEpvaW5Ob2RlKSB7Ci0JCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCW5ldyBJbnRlZ2VyKEpvaW5Ob2RlRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJfSBlbHNlIGlmICh1bWxOb2RlIGluc3RhbmNlb2YgRmluYWxOb2RlKSB7Ci0JCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZQotCQkJCQkuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLCBuZXcgSW50ZWdlcigKLQkJCQkJCQlBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUobm90YXRpb25Ob2RlLCB1bWxOb2RlLCBuZXcgSW50ZWdlcigKLQkJCQkJQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJfSBlbHNlIGlmICh1bWxOb2RlIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IEJyaWRnZUhlbHBlci5nZXRFQW5ub3RhdGlvblR5cGUodW1sTm9kZSwKLQkJCQkJQnJpZGdlSGVscGVyLlVNQV9UWVBFKTsKLQkJCWlmICh0eXBlLmVxdWFsc0lnbm9yZUNhc2UoQnJpZGdlSGVscGVyLlVNQV9NSUxFU1RPTkUpKSB7Ci0JCQkJLy8gTWlsZXN0b25lCi0JCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQkJbmV3IEludGVnZXIoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCQkJLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCQlBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzSWdub3JlQ2FzZShCcmlkZ2VIZWxwZXIuVU1BX1RBU0tfREVTQ1JJUFRPUikpIHsKLQkJCQkvLyBUYXNrRGVzY3JpcHRvcgotCQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJCW5ldyBJbnRlZ2VyKEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCQkJLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlWaWV3U2VydmljZQotCQkJCQkJLmNyZWF0ZU5vZGUobm90YXRpb25Ob2RlLCB1bWxOb2RlLCBuZXcgSW50ZWdlcigKLQkJCQkJCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCQkJLnRvU3RyaW5nKCksCi0JCQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfQotCi0JCQkvLwlzZXQgZGVmYXVsdCBmb250IHN0eWxlCi0JCQlzZXREZWZhdWx0Rm9udFN0eWxlKG5vdGF0aW9uTm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gbm90YXRpb25Ob2RlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBub3RhdGlvbiBub2RlIGZvciBtb2RlbCBub2RlIGluIEFERCBhbmQgV1BECi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gb2JqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTm9kZSBjcmVhdGVOb3RhdGlvbk5vZGVfQUREb3JXUEQoRGlhZ3JhbSBkaWFncmFtLCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlIG9iaikgewotCQlOb2RlIG5vdGF0aW9uTm9kZSA9IG51bGw7Ci0JCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUgbm9kZSA9IG9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUgPyAob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgb2JqCi0JCQkJOiBudWxsOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlKSB7Ci0JCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIG5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQlSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkvKgotCQkJICogVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIG5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJICogUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJICogQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkgKi8KLQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGUpIHsKLQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgbm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCS8qCi0JCQkgKiBWaWV3U2VydmljZS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgbm9kZSwgbmV3IEludGVnZXIoCi0JCQkgKiBXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkgKiBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCSAqLwotCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdE5vZGUpIHsKLQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgbm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCVdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgbm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCVdvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQl9Ci0JCQotCQkvLyBzZXQgZGVmYXVsdCBmb250IHN0eWxlIGZvciBub3RhdGlvbiBub2RlCi0JCXNldERlZmF1bHRGb250U3R5bGUobm90YXRpb25Ob2RlKTsKLQkJcmV0dXJuIG5vdGF0aW9uTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBDcmVhdGUgdGV4dCBmb3IgZnJlZSBmb3JtIHRleHQKLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTm9kZSBjcmVhdGVUZXh0KERpYWdyYW0gZGlhZ3JhbSwKLQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUgbm9kZSkgewotCi0JCS8vIGNyZWF0ZSB0ZXh0Ci0JCU5vZGUgdGV4dCA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgVmlld1R5cGUuVEVYVCwKLQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCi0JCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUodGV4dCwgVmlld1R5cGUuRElBR1JBTV9OQU1FLAotCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKHRleHQsIENvbW1vblBhcnNlckhpbnQuREVTQ1JJUFRJT04sCi0JCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0KLQkJLy8gY3JlYXRlIGRlc2NyaXB0aW9uCi0JCUdyYXBoTm9kZSBncmFwaE5vZGUgPSAoR3JhcGhOb2RlKSBub2RlLmdldE9iamVjdCgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlQcm9wZXJ0eSBwcm9wID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRQcm9wZXJ0eUJ5S2V5KGdyYXBoTm9kZQotCQkJCS5nZXRQcm9wZXJ0eSgpLCBHcmFwaGljYWxEYXRhSGVscGVyLkdSQVBIX05PREVfRlJFRV9URVhUKTsKLQotCQlpZiAocHJvcCAhPSBudWxsKQotCQkJZGVzY3JpcHRpb24gPSBwcm9wLmdldFZhbHVlKCk7Ci0JCURlc2NyaXB0aW9uU3R5bGUgZGVzY1N0eWxlID0gKERlc2NyaXB0aW9uU3R5bGUpIHRleHQKLQkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkRFU0NSSVBUSU9OX1NUWUxFKTsKLQkJZGVzY1N0eWxlLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJCi0JCS8vIAotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJLy8gY3JlYXRlIGZpbGwgc3R5bGUKLQkJRmlsbFN0eWxlIGZpbGxTdHlsZSA9IChGaWxsU3R5bGUpIHRleHQKLQkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZJTExfU1RZTEUpOwotCQlpZiAoZmlsbFN0eWxlICE9IG51bGwpIHsKLQkJCS8vIGZpbGwgY29sb3IKLQkJCVJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzdG9yZSwKLQkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsKLQkJCWZpbGxTdHlsZS5zZXRGaWxsQ29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKQotCQkJCQkuaW50VmFsdWUoKSk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgbGluZSBzdHlsZQotCQlMaW5lU3R5bGUgbGluZVN0eWxlID0gKExpbmVTdHlsZSkgdGV4dAotCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTElORV9TVFlMRSk7Ci0JCWlmIChsaW5lU3R5bGUgIT0gbnVsbCkgewotCQkJLy8gbGluZSBjb2xvcgotCQkJUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKHN0b3JlLAotCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOwotCQkJbGluZVN0eWxlLnNldExpbmVDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpCi0JCQkJCS5pbnRWYWx1ZSgpKTsKLQkJfQotCi0JCS8vIGNyZWF0ZSBmb250IHN0eWxlCi0JCUZvbnRTdHlsZSBmb250U3R5bGUgPSAoRm9udFN0eWxlKSB0ZXh0Ci0JCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsKLQkJRm9udCBvbGRGb250ID0gbnVsbDsKLQkJaWYgKGZvbnRTdHlsZSAhPSBudWxsKSB7Ci0JCQkvLyBnZXQgZm9udCBwcm9wZXJ0aWVzCi0JCQlTdHJpbmcgZm9udE5hbWUgPSBnZXRQcm9wZXJ0eVZhbHVlKGdyYXBoTm9kZSwKLQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9OQU1FKTsKLQkJCWlmIChmb250TmFtZSA9PSBudWxsKSBmb250TmFtZSA9IFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVF9OQU1FOwotCQkJU3RyaW5nIG9sZEZvbnRTdHlsZVN0ciA9IGdldFByb3BlcnR5VmFsdWUoZ3JhcGhOb2RlLAotCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX1NUWUxFKTsJCi0JCQlTdHJpbmcgZm9udEhlaWdodFN0ciA9IGdldFByb3BlcnR5VmFsdWUoZ3JhcGhOb2RlLAotCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0hFSUdIVCk7CQkJCi0JCQlTdHJpbmcgZm9udFJlZCA9IGdldFByb3BlcnR5VmFsdWUoZ3JhcGhOb2RlLAotCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX1JFRCk7Ci0JCQlTdHJpbmcgZm9udEdyZWVuID0gZ2V0UHJvcGVydHlWYWx1ZShncmFwaE5vZGUsCi0JCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfR1JFRU4pOwotCQkJU3RyaW5nIGZvbnRCbHVlID0gZ2V0UHJvcGVydHlWYWx1ZShncmFwaE5vZGUsCi0JCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfQkxVRSk7Ci0JCQkKLQkJCWludCByZWQgPSAwOwotCQkJaW50IGdyZWVuID0gMDsKLQkJCWludCBibHVlID0gMDsKLQotCQkJaWYgKGZvbnROYW1lICE9IG51bGwpCi0JCQkJZm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnROYW1lKTsKLQkJCQotCQkJaW50IG9sZEZvbnRTdHlsZSA9IDA7Ci0JCQlpZiAob2xkRm9udFN0eWxlU3RyICE9IG51bGwpIHsKLQkJCQlvbGRGb250U3R5bGUgPSBuZXcgSW50ZWdlcihvbGRGb250U3R5bGVTdHIpLmludFZhbHVlKCk7Ci0JCQkJaWYgKG9sZEZvbnRTdHlsZSA9PSAxKQotCQkJCQlmb250U3R5bGUuc2V0Qm9sZCh0cnVlKTsKLQkJCQlpZiAob2xkRm9udFN0eWxlID09IDIpCi0JCQkJCWZvbnRTdHlsZS5zZXRJdGFsaWModHJ1ZSk7Ci0JCQkJaWYgKG9sZEZvbnRTdHlsZSA9PSAzKSB7Ci0JCQkJCWZvbnRTdHlsZS5zZXRCb2xkKHRydWUpOwotCQkJCQlmb250U3R5bGUuc2V0SXRhbGljKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gc2V0IGZvbnQgaGVpZ2h0Ci0JCQlpbnQgZm9udEhlaWdodCA9IFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVF9TSVpFOwotCQkJaWYgKGZvbnRIZWlnaHRTdHIgIT0gbnVsbCkKLQkJCQlmb250SGVpZ2h0ID0gbmV3IEludGVnZXIoZm9udEhlaWdodFN0cikuaW50VmFsdWUoKTsKLQkJCWZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnRIZWlnaHQpOwotCQkJCi0JCQkvLyBzZXQgZm9udCBSR0IgY29sb3IKLQkJCWlmIChmb250UmVkICE9IG51bGwpCi0JCQkJcmVkID0gbmV3IEludGVnZXIoZm9udFJlZCkuaW50VmFsdWUoKTsKLQkJCWlmIChmb250R3JlZW4gIT0gbnVsbCkKLQkJCQlncmVlbiA9IG5ldyBJbnRlZ2VyKGZvbnRHcmVlbikuaW50VmFsdWUoKTsKLQkJCWlmIChmb250Qmx1ZSAhPSBudWxsKQotCQkJCWJsdWUgPSBuZXcgSW50ZWdlcihmb250Qmx1ZSkuaW50VmFsdWUoKTsKLQotCQkJUkdCIGZvbnRSR0IgPSBuZXcgUkdCKHJlZCwgZ3JlZW4sIGJsdWUpOwotCQkJZm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpCi0JCQkJCS5pbnRWYWx1ZSgpKTsJCQkKLQkJCQotCQkJLy8gbWFrZSBvbGQgZm9udCBhcyB3ZWxsCi0JCQlvbGRGb250ID0gbmV3IEZvbnQobnVsbCwgZm9udE5hbWUsIGZvbnRIZWlnaHQsIG9sZEZvbnRTdHlsZSk7Ci0JCX0KLQkKLQkJRGltZW5zaW9uIGQgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0VGV4dEV4dGVudHMoZGVzY3JpcHRpb24sIG9sZEZvbnQpOwotCQlpZiAob2xkRm9udCAhPSBudWxsKSB7Ci0JCQlvbGRGb250LmRpc3Bvc2UoKTsKLQkJfQotCQlpbnQgbm9PZkxpbmVzID0gMTsKLQkJaWYgKGQgIT0gbnVsbCAmJiBkLndpZHRoID4gMCkgewotCQkJaWYgKG5vZGUuZ2V0V2lkdGgoKSA9PSAtMSkKLQkJCQlub09mTGluZXMgPSAxOwotCQkJZWxzZSB7Ci0JCQkJaW50IGRpdiA9IGQud2lkdGggLyBub2RlLmdldFdpZHRoKCk7CQkKLQkJCQlpbnQgbW9kID0gZC53aWR0aCAlIG5vZGUuZ2V0V2lkdGgoKTsKLS8vCQkJCWlmIChtb2QgIT0gMCkKLQkJCQkJZGl2Kys7Ci0JCQkJbm9PZkxpbmVzID0gZGl2OwotCQkJfQotCQl9Ci0KLQkJaW50IHRleHRIZWlnaHQgPSBkLmhlaWdodDsJCQotCi0JCS8vIGNyZWF0ZSBsYXlvdXQgY29udHJhaW50Ci0JCUJvdW5kcyBib3VuZHMgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpOwotLy8JCWJvdW5kcy5zZXRIZWlnaHQobm9PZkxpbmVzICogdGV4dEhlaWdodCk7Ci0JCWlmIChub2RlLmdldFdpZHRoKCkgPT0gLTEpIHsKLQkJCWludCB0ZXh0V2lkdGggPSBkLndpZHRoOwotCQkJYm91bmRzLnNldFdpZHRoKHRleHRXaWR0aCk7Ci0JCX0KLQkJZWxzZQotCQkJYm91bmRzLnNldFdpZHRoKG5vZGUuZ2V0V2lkdGgoKSk7Ci0JCWJvdW5kcy5zZXRYKG5vZGUuZ2V0TG9jYXRpb24oKS54KTsKLQkJYm91bmRzLnNldFkobm9kZS5nZXRMb2NhdGlvbigpLnkpOwotCi0JCXRleHQuc2V0TGF5b3V0Q29uc3RyYWludChib3VuZHMpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWRnZSBmb3IgQUQgZGlhZ3JhbQotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VOb2RlCi0JICogQHBhcmFtIHRhcmdldE5vZGUKLQkgKiBAcGFyYW0gYWN0RWRnZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVkZ2UgY3JlYXRlRWRnZV9BRChOb2RlIHNvdXJjZU5vZGUsIE5vZGUgdGFyZ2V0Tm9kZSwKLQkJCUFjdGl2aXR5RWRnZSBhY3RFZGdlKSB7Ci0JCWlmIChhY3RFZGdlIGluc3RhbmNlb2YgQ29udHJvbEZsb3cpIHsKLQkJCUVkZ2UgZWRnZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZUVkZ2Uoc291cmNlTm9kZSwgdGFyZ2V0Tm9kZSwgYWN0RWRnZSwKLQkJCQkJbmV3IEludGVnZXIoQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShlZGdlLCBhY3RFZGdlLCBuZXcgSW50ZWdlcigKLQkJCQkJQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCXJldHVybiBlZGdlOwotCQl9Ci0JCQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCQotCS8qKgotCSAqIENyZWF0ZSBlZGdlIGZvciBXUEQgZGlhZ3JhbQotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VOb2RlCi0JICogQHBhcmFtIHRhcmdldE5vZGUKLQkgKiBAcGFyYW0gYWN0RWRnZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVkZ2UgY3JlYXRlRWRnZV9XUEQoTm9kZSBzb3VyY2VOb2RlLCBOb2RlIHRhcmdldE5vZGUsCi0JCQlFT2JqZWN0IGFjdEVkZ2UpIHsKLQkJaWYgKGFjdEVkZ2UgaW5zdGFuY2VvZiBMaW5rKSB7Ci0JCQlFZGdlIGVkZ2UgPSBWaWV3U2VydmljZS5jcmVhdGVFZGdlKHNvdXJjZU5vZGUsIHRhcmdldE5vZGUsIGFjdEVkZ2UsCi0JCQkJCW5ldyBJbnRlZ2VyKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKGVkZ2UsIGFjdEVkZ2UsIG5ldyBJbnRlZ2VyKAotCQkJCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJcmV0dXJuIGVkZ2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCS8qKgotCSAqIENyZWF0ZSBlZGdlIGZvciBBREQgZGlhZ3JhbQotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VOb2RlCi0JICogQHBhcmFtIHRhcmdldE5vZGUKLQkgKiBAcGFyYW0gYWN0RWRnZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVkZ2UgY3JlYXRlRWRnZV9BREQoTm9kZSBzb3VyY2VOb2RlLCBOb2RlIHRhcmdldE5vZGUsCi0JCQlFT2JqZWN0IGFjdEVkZ2UpIHsKLQkJaWYgKGFjdEVkZ2UgaW5zdGFuY2VvZiBMaW5rKSB7Ci0JCQlFZGdlIGVkZ2UgPSBWaWV3U2VydmljZS5jcmVhdGVFZGdlKHNvdXJjZU5vZGUsIHRhcmdldE5vZGUsIGFjdEVkZ2UsCi0JCQkJCW5ldyBJbnRlZ2VyKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShlZGdlLCBhY3RFZGdlLCBuZXcgSW50ZWdlcigKLQkJCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQlyZXR1cm4gZWRnZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5VmFsdWUoR3JhcGhOb2RlIGdyYXBoTm9kZSwgU3RyaW5nIGtleSkgewotCQlQcm9wZXJ0eSBwcm9wID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRQcm9wZXJ0eUJ5S2V5KGdyYXBoTm9kZQotCQkJCS5nZXRQcm9wZXJ0eSgpLCBrZXkpOwotCi0JCWlmIChwcm9wICE9IG51bGwpIHsKLQkJCXJldHVybiBwcm9wLmdldFZhbHVlKCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIG5vIG9mIGxpbmVzIGluIHRoZSBub2RlIHRleHQgYmFzZWQgb24gdGV4dCB3aWR0aCBhbmQgd2lkdGggb2YKLQkgKiBmaWd1cmUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXROb09mTGluZXMoTm9kZSBub2RlKSB7Ci0JCWludCBub09mTGluZXMgPSAxOwotCQlpZiAobm9kZS5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIG5vZGUuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7Ci0JCQlTdHJpbmcgdGV4dCA9ICgoTmFtZWRFbGVtZW50KSBub2RlLmdldEVsZW1lbnQoKSkuZ2V0TmFtZSgpOwotCQkJRm9udCBmID0gVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UOwotCQkJRGltZW5zaW9uIGQgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0VGV4dEV4dGVudHModGV4dCwgZik7Ci0KLQkJCUJvdW5kcyBib3VuZHMgPSAoQm91bmRzKSBub2RlLmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJCWlmIChkICE9IG51bGwgJiYgZC53aWR0aCA+IDApIHsKLQkJCQlpbnQgZGl2ID0gZC53aWR0aCAvIGJvdW5kcy5nZXRXaWR0aCgpOwotCQkJCWludCBtb2QgPSBkLndpZHRoICUgYm91bmRzLmdldFdpZHRoKCk7Ci0JCQkJaWYgKG1vZCAhPSAwKQotCQkJCQlkaXYrKzsKLQkJCQlub09mTGluZXMgPSBkaXY7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5vT2ZMaW5lczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gaGVpZ2h0IG9mIHRleHQgb2YgdGggZW5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRUZXh0SGVpZ2h0KE5vZGUgbm9kZSkgewotCQlpZiAobm9kZS5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIG5vZGUuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7Ci0JCQlTdHJpbmcgdGV4dCA9ICgoTmFtZWRFbGVtZW50KSBub2RlLmdldEVsZW1lbnQoKSkuZ2V0TmFtZSgpOwotCQkJRm9udCBmID0gVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UOwotCQkJRGltZW5zaW9uIGQgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0VGV4dEV4dGVudHModGV4dCwgZik7Ci0KLQkJCWlmIChkICE9IG51bGwpCi0JCQkJcmV0dXJuIGQuaGVpZ2h0OwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgcG9pbnQgdG8gdGVybWluYWwgc3RyaW5nCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcG9zZVRlcm1pbmFsU3RyaW5nKFByZWNpc2lvblBvaW50IHApIHsKLQkJZmluYWwgY2hhciBURVJNSU5BTF9TVEFSVF9DSEFSID0gJygnOwotCQlmaW5hbCBjaGFyIFRFUk1JTkFMX0RFTElNSVRFUl9DSEFSID0gJywnOwotCQlmaW5hbCBjaGFyIFRFUk1JTkFMX0VORF9DSEFSID0gJyknOwotCi0JCVN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigyNCk7Ci0JCXMuYXBwZW5kKFRFUk1JTkFMX1NUQVJUX0NIQVIpOyAvLyAxIGNoYXIKLQkJcy5hcHBlbmQoKGZsb2F0KSBwLnByZWNpc2VYKTsgLy8gMTAgY2hhcnMKLQkJcy5hcHBlbmQoVEVSTUlOQUxfREVMSU1JVEVSX0NIQVIpOyAvLyAxIGNoYXIKLQkJcy5hcHBlbmQoKGZsb2F0KSBwLnByZWNpc2VZKTsgLy8gMTAgY2hhcnMKLQkJcy5hcHBlbmQoVEVSTUlOQUxfRU5EX0NIQVIpOyAvLyAxIGNoYXIKLQkJcmV0dXJuIHMudG9TdHJpbmcoKTsgLy8gMjQgY2hhcnMgbWF4ICgrMSBmb3Igc2FmZXR5LCBpLmUuIGZvciBzdHJpbmcKLQkJCQkJCQkJLy8gdGVybWluYXRpb24pCi0JfQotCi0JLyoqCi0JICogR2V0IHJlbGF0aXZlIGFuY2hvciBsb2NhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogQHBhcmFtIGJvdW5kcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByZWNpc2lvblBvaW50IGdldEFuY2hvclJlbGF0aXZlTG9jYXRpb24oUG9pbnQgcCwKLQkJCUJvdW5kcyBib3VuZHMpIHsKLQkJUHJlY2lzaW9uUG9pbnQgcmVsTG9jYXRpb247Ci0JCVBvaW50IHRlbXAgPSBuZXcgUG9pbnQocCk7Ci0JCWlmIChwLnggPCBib3VuZHMuZ2V0WCgpIHx8IHAueCA+IGJvdW5kcy5nZXRYKCkgKyBib3VuZHMuZ2V0V2lkdGgoKQotCQkJCXx8IHAueSA8IGJvdW5kcy5nZXRZKCkKLQkJCQl8fCBwLnkgPiBib3VuZHMuZ2V0WSgpICsgYm91bmRzLmdldEhlaWdodCgpKSB7Ci0JCQlpZiAocC54IDwgYm91bmRzLmdldFgoKSB8fCBwLnggPiBib3VuZHMuZ2V0WCgpICsgYm91bmRzLmdldFdpZHRoKCkpIHsKLQkJCQl0ZW1wLnggPSBwLnggPCBib3VuZHMuZ2V0WCgpID8gYm91bmRzLmdldFgoKSA6IGJvdW5kcy5nZXRYKCkKLQkJCQkJCSsgYm91bmRzLmdldFdpZHRoKCk7Ci0JCQl9Ci0JCQlpZiAocC55IDwgYm91bmRzLmdldFkoKSB8fCBwLnkgPiBib3VuZHMuZ2V0WSgpICsgYm91bmRzLmdldEhlaWdodCgpKSB7Ci0JCQkJdGVtcC55ID0gcC55IDwgYm91bmRzLmdldFkoKSA/IGJvdW5kcy5nZXRZKCkgOiBib3VuZHMuZ2V0WSgpCi0JCQkJCQkrIGJvdW5kcy5nZXRIZWlnaHQoKTsKLQkJCX0KLQkJCXJlbExvY2F0aW9uID0gbmV3IFByZWNpc2lvblBvaW50KChkb3VibGUpICh0ZW1wLnggLSBib3VuZHMuZ2V0WCgpKQotCQkJCQkvIGJvdW5kcy5nZXRXaWR0aCgpLCAoZG91YmxlKSAodGVtcC55IC0gYm91bmRzLmdldFkoKSkKLQkJCQkJLyBib3VuZHMuZ2V0SGVpZ2h0KCkpOwotCQl9IGVsc2UgewotCi0JCQlyZWxMb2NhdGlvbiA9IG5ldyBQcmVjaXNpb25Qb2ludCgoZG91YmxlKSAodGVtcC54IC0gYm91bmRzLmdldFgoKSkKLQkJCQkJLyBib3VuZHMuZ2V0V2lkdGgoKSwgKGRvdWJsZSkgKHRlbXAueSAtIGJvdW5kcy5nZXRZKCkpCi0JCQkJCS8gYm91bmRzLmdldEhlaWdodCgpKTsKLQkJfQotCQlyZXR1cm4gcmVsTG9jYXRpb247Ci0JfQotCi0JCi0JLyoqCi0JICogU2V0IGRlZmF1bHQgZm9udCBzdHlsZSBmb3Igbm90YXRpb24gbm9kZQotCSAqIEBwYXJhbSBub3RhdGlvbk5vZGUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNldERlZmF1bHRGb250U3R5bGUoTm9kZSBub3RhdGlvbk5vZGUpIHsKLQkJLy8JY3JlYXRlIGZvbnQgc3R5bGUKLQkJRm9udFN0eWxlIGZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vdGF0aW9uTm9kZQotCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7Ci0KLQkJaWYgKGZvbnRTdHlsZSAhPSBudWxsKSB7Ci0KLQkJCS8vIHNldCBmb250IG5hbWUKLQkJCVN0cmluZyBmb250TmFtZSA9IFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVF9OQU1FOwotCQkJaWYgKGZvbnROYW1lICE9IG51bGwpCi0JCQkJZm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnROYW1lKTsKLQotCQkJLy8gc2V0IGZvbnQgaGVpZ2h0Ci0JCQlpbnQgZm9udEhlaWdodCA9IFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVF9TSVpFOwotCQkJZm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udEhlaWdodCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvTWVyZ2VOb2RlTWFwLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvTWVyZ2VOb2RlTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNjJlZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL01lcmdlTm9kZU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLm1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuTWVyZ2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICoKLSAqLwotcHVibGljIGNsYXNzIE1lcmdlTm9kZU1hcCBleHRlbmRzIE1hcE5vZGUgewotCi0JcHVibGljIE1lcmdlTm9kZU1hcChOb2RlIG5vZGUpIHsKLQkJc3VwZXIobm9kZSk7Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZSB1bWwgbm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZU5vZGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZU5vZGUoKTsKLQkJdW1sTm9kZSA9IChNZXJnZU5vZGUpZ2V0QWN0aXZpdHkoKS5jcmVhdGVOb2RlKG5hbWUgPSAobmFtZSAhPSBudWxsKT8gbmFtZSA6ICIgIiwgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE1lcmdlTm9kZSgpKTsKLQkJCi0JCWlmKHVtbE5vZGUgIT0gbnVsbCl7Ci0JCQlncmFwaFVNTE5vZGVNYXAucHV0KG5vZGUsIHVtbE5vZGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvc2VydmljZXMvV29ya2Zsb3cyWE1JUmVzb3VyY2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9zZXJ2aWNlcy9Xb3JrZmxvdzJYTUlSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q0OGQ3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9zZXJ2aWNlcy9Xb3JrZmxvdzJYTUlSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MU2F2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlTYXZlSW1wbDsKLQotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqIAotICovCi0KLXB1YmxpYyBjbGFzcyBXb3JrZmxvdzJYTUlSZXNvdXJjZUltcGwgZXh0ZW5kcyBYTUlSZXNvdXJjZUltcGwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FTkNPRElORyA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgV29ya2Zsb3cyWE1JUmVzb3VyY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB1cmkKLQkgKi8KLQlwdWJsaWMgV29ya2Zsb3cyWE1JUmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKLQkJc3VwZXIodXJpKTsKLQotCQlnZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQkJZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9TQ0hFTUFfTE9DQVRJT04sIEJvb2xlYW4uVFJVRSk7Ci0KLQkJZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0JCWdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0VOQ09ERURfQVRUUklCVVRFX1NUWUxFLCBCb29sZWFuLlRSVUUpOwotCQkKLQkJZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgREVGQVVMVF9FTkNPRElORyk7Ci0JCWdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRU5DT0RJTkcsIERFRkFVTFRfRU5DT0RJTkcpOwotCQkKLQotCQlnZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9MRVhJQ0FMX0hBTkRMRVIsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNSVJlc291cmNlLk9QVElPTl9VU0VfWE1JX1RZUEUsIEJvb2xlYW4uVFJVRSk7Ci0JCWdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUlSZXNvdXJjZS5PUFRJT05fVVNFX1hNSV9UWVBFLCBCb29sZWFuLlRSVUUpOwotCQlzZXRUcmFja2luZ01vZGlmaWNhdGlvbih0cnVlKTsKLQkJLy9zZXRJbnRyaW5zaWNJRFRvRU9iamVjdE1hcChtYXApOwotCQlpZFRvRU9iamVjdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWNyZWF0ZVhNTEhlbHBlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VVVUlEcygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCBYTUxTYXZlIGNyZWF0ZVhNTFNhdmUoKSB7Ci0JCXJldHVybiBuZXcgWE1JU2F2ZUltcGwoY3JlYXRlWE1MSGVscGVyKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzYXZlKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzdXBlci5zYXZlKG9wdGlvbnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvc2VydmljZXMvV29ya2Zsb3dFeHBvcnRTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9zZXJ2aWNlcy9Xb3JrZmxvd0V4cG9ydFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlNTQ4Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9zZXJ2aWNlcy9Xb3JrZmxvd0V4cG9ydFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5EaWFncmFtT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uTWlncmF0aW9uRXhwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5tYXAuSU1hcENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwLk1hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLm1hcC5NYXBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5tYXAuTWFwVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWRkd3BkLm1hcC5Db25uZWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0udXRpbC5NaWdyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLlZpZXdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkJvdW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLQotcHVibGljIGNsYXNzIFdvcmtmbG93RXhwb3J0U2VydmljZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1hNSV9FWFRFTlNJT04gPSAiLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBib29sZWFuIGRlYnVnOwotCQotCXB1YmxpYyBzdGF0aWMgV29ya2Zsb3dFeHBvcnRTZXJ2aWNlIHNpbmdsZXRvbiA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIFdvcmtmbG93RXhwb3J0U2VydmljZSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKHNpbmdsZXRvbiA9PSBudWxsKSB7Ci0JCQlzaW5nbGV0b24gPSBuZXcgV29ya2Zsb3dFeHBvcnRTZXJ2aWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci0KLQkvKioKLQkgKiBFeHBvcnQgYWN0aXZpdHkgZGlhZ3JhbSBkYXRhCi0JICogQHBhcmFtIHByb2MKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiBAcGFyYW0gdGFyZ2V0RGlyCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgTWlncmF0aW9uRXhwb3J0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwb3J0KFByb2Nlc3MgcHJvYywgQWN0aXZpdHkgYWN0aXZpdHksIFN0cmluZyBmaWxlTmFtZSwKLQkJCUZpbGUgdGFyZ2V0RGlyKSB0aHJvd3MgTWlncmF0aW9uRXhwb3J0RXhjZXB0aW9uIHsKLQotCQlkZWJ1ZyA9IERpYWdyYW1NaWdyYXRpb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JCQotCQkvLyBjb25zdHJ1Y3QgdGhlIGV4cG9ydCB0YXJnZXQgeG1sIGZpbGUgcGF0aAotCQlQYXRoIGV4cG9ydFBhdGggPSBuZXcgUGF0aCh0YXJnZXREaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlib29sZWFuIGVuZFdpdGhYbWlFeHQgPSBmaWxlTmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKAotCQkJCURFRkFVTFRfWE1JX0VYVEVOU0lPTik7Ci0KLQkJU3RyaW5nIGV4cG9ydFhNSVBhdGggPSAoZXhwb3J0UGF0aC5hcHBlbmQoZW5kV2l0aFhtaUV4dCA/IGZpbGVOYW1lCi0JCQkJOiAoZmlsZU5hbWUgKyBERUZBVUxUX1hNSV9FWFRFTlNJT04pKSkudG9PU1N0cmluZygpOwotCi0KLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKGV4cG9ydFhNSVBhdGgpOwotCQkKLS8qCQkvLyBDcmVhdGUgcmVzb3VyY2Ugc2V0Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotCi0JCS8vWE1MUmVzb3VyY2VJbXBsIHhtaXJlcyA9IG5ldyBXb3JrZmxvdzJYTUlSZXNvdXJjZUltcGwodXJpKTsKLQkJLy9SZXNvdXJjZSB4bWlyZXMgPSAgbmV3IEdNRlJlc291cmNlRmFjdG9yeSgpLmNyZWF0ZVJlc291cmNlKHVyaSk7Ci0JCVJlc291cmNlIHhtaXJlcyA9ICBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShwcm9jKQotCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZSh1cmkpOwotCi0JCXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmFkZCh4bWlyZXMpOyovCi0JCURpYWdyYW1NYW5hZ2VyIG1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKHByb2MsIHRoaXMpOwotCQkKLQkJdHJ5IHsKLQkJCVRyYW5zYWN0aW9uIHR4ID0gIG1nci5nZXRFZGl0aW5nRG9tYWluKCkuc3RhcnRUcmFuc2FjdGlvbihmYWxzZSwKLQkJCQkJQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCVJlc291cmNlIHhtaXJlcyA9IG1nci5nZXRSZXNvdXJjZSgpOwotCQkJdHguY29tbWl0KCk7Ci0JCQkKLQkJCS8vIENyZWF0ZSB0ZW1wIG1hcAotCQkJSU1hcENvbnN0YW50cy5ncmFwaFVNTE5vZGVNYXAuY2xlYXIoKTsKLQkJCQotCQkJaWYgKHByb2MgPT0gYWN0aXZpdHkpIHsKLQkJCQlNYXAgYWN0aXZpdGllcyA9IE1pZ3JhdGlvblV0aWwuZ2V0QWN0aXZpdGllcyhwcm9jLCB0cnVlKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWN0aXZpdGllcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgaXQubmV4dCgpOwotCQkJCQlhZGRBRCh4bWlyZXMsIHByb2MsIGFjdCwgbWdyKTsKLQkJCQkJYWRkQUREKHhtaXJlcywgcHJvYywgYWN0LCBtZ3IpOwotCQkJCQlhZGRXUEQoeG1pcmVzLCBwcm9jLCBhY3QsIG1ncik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlhZGRBRCh4bWlyZXMsIHByb2MsIGFjdGl2aXR5LCBtZ3IpOwotCQkJCWFkZEFERCh4bWlyZXMsIHByb2MsIGFjdGl2aXR5LCBtZ3IpOwotCQkJCWFkZFdQRCh4bWlyZXMsIHByb2MsIGFjdGl2aXR5LCBtZ3IpOwotCQkJfQotCi0vKgkJCXR4LmNvbW1pdCgpOyovCi0JCQkKLQkJCUxpc3QgY29udGVudHMgPSB4bWlyZXMuZ2V0Q29udGVudHMoKTsKLQkJCWlmIChjb250ZW50cyAhPSBudWxsICYmICEgY29udGVudHMuaXNFbXB0eSgpKSB7Ci0JCQkJeG1pcmVzLnNhdmUobnVsbCk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBuZXcgTWlncmF0aW9uRXhwb3J0RXhjZXB0aW9uKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYobWdyICE9IG51bGwpIHsKLQkJCQltZ3IucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZERhdGFUb1Jlc291cmNlX1dQRChSZXNvdXJjZSB4bWlSZXNvdXJjZSwgUHJvY2VzcyBwcm9jLAotCQkJQWN0aXZpdHkgdW1hQWN0aXZpdHkpIHsJCi0JCQotCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gZCAgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFVNQURpYWdyYW0odW1hQWN0aXZpdHksIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNLCBmYWxzZSk7Ci0JCWlmIChkICE9IG51bGwpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV1BERC0+Iitwcm9jLmdldE5hbWUoKSsiOjoiK3VtYUFjdGl2aXR5LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSB3cGREaWFncmFtID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpOwotCQkJYWRkRGF0YVRvUmVzb3VyY2VfQUREb3JXUEQocHJvYywgdW1hQWN0aXZpdHksIHhtaVJlc291cmNlLAotCQkJCQl3cGREaWFncmFtKTsKLQkJfQotCX0KLQkKLQotCXByaXZhdGUgdm9pZCBhZGREYXRhVG9SZXNvdXJjZV9BREQoUmVzb3VyY2UgeG1pUmVzb3VyY2UsCi0JCQlQcm9jZXNzIHByb2MsIEFjdGl2aXR5IHVtYUFjdGl2aXR5KSB7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSBkID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRVTUFEaWFncmFtKHVtYUFjdGl2aXR5LAotCQkJCQkJSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNLCBmYWxzZSk7Ci0JCWlmIChkICE9IG51bGwpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQURELT4iK3Byb2MuZ2V0TmFtZSgpKyI6Iit1bWFBY3Rpdml0eS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBhZGREaWFncmFtID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlQWN0aXZpdHlEZXRhaWxEaWFncmFtKCk7Ci0JCQlhZGREYXRhVG9SZXNvdXJjZV9BRERvcldQRChwcm9jLCB1bWFBY3Rpdml0eSwgeG1pUmVzb3VyY2UsCi0JCQkJCWFkZERpYWdyYW0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZERhdGFUb1Jlc291cmNlX0FERG9yV1BEKFByb2Nlc3MgcHJvYywgQWN0aXZpdHkgdW1hQWN0aXZpdHksIAotCQkJUmVzb3VyY2UgeG1pUmVzb3VyY2UsIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0gYWRkT3JXcGREaWFncmFtKSB7Ci0JCVN1cHByZXNzaW9uIHN1cCA9IG5ldyBTdXBwcmVzc2lvbihwcm9jKTsKLQkJYWRkT3JXcGREaWFncmFtLnNldFN1cHByZXNzaW9uKHN1cCk7Ci0JCVN0cmluZyBraW5kID0gbnVsbDsKLQkJUHJlZmVyZW5jZXNIaW50IHByZWZIaW50ID0gbnVsbDsKLQkJaWYgKGFkZE9yV3BkRGlhZ3JhbSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQkJYWRkT3JXcGREaWFncmFtLnNldEZpbHRlcihQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFKTsKLQkJCWtpbmQgPSBEaWFncmFtTWFuYWdlci5BRERfa2luZDsKLQkJCXByZWZIaW50ID0gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVDsKLQkJfSBlbHNlIGlmIChhZGRPcldwZERpYWdyYW0gaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKSB7Ci0JCQlraW5kID0gRGlhZ3JhbU1hbmFnZXIuV1BEX2tpbmQ7Ci0JCQlwcmVmSGludCA9IFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UOwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJYWRkT3JXcGREaWFncmFtLnNldE9iamVjdCh1bWFBY3Rpdml0eSk7Ci0JCWFkZE9yV3BkRGlhZ3JhbS5zZXRMaW5rZWRFbGVtZW50KHVtYUFjdGl2aXR5KTsKLQkJCi0JCS8vCXNldCBzdXBwcmVzc2lvbi9wdWJsaXNoZWQgaW5mbyBmb3IgQURELyBXUERECi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSB1bWFEaWFncmFtID0gYWRkT3JXcGREaWFncmFtLmdldFVNQURpYWdyYW0oKTsKLQkJaWYgKHVtYURpYWdyYW0gIT0gbnVsbCkgewotCQkJaWYgKHVtYURpYWdyYW0uZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpKSB7CQotCQkJCWlmIChhZGRPcldwZERpYWdyYW0gaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pewotCQkJCQlEaWFncmFtT3B0aW9ucy5zZXRQdWJsaXNoQUREKHVtYUFjdGl2aXR5LCBmYWxzZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGFkZE9yV3BkRGlhZ3JhbSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pIHsKLQkJCQkJRGlhZ3JhbU9wdGlvbnMuc2V0UHVibGlzaFdQREQodW1hQWN0aXZpdHksIGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZ2V0IGF1dG9MYXlvdXQgZmxhZyBpZiBkaWFncmFtIGlzIEFERAotCQlpZiAoYWRkT3JXcGREaWFncmFtIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7Ci0JCQlib29sZWFuIHZhbHVlID0gR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkuaXNBdXRvTGF5b3V0KChBY3Rpdml0eURldGFpbERpYWdyYW0pIGFkZE9yV3BkRGlhZ3JhbSk7Ci0JCQkoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgYWRkT3JXcGREaWFncmFtKS5zZXRBdXRvTGF5b3V0KHZhbHVlKTsKLQkJfQotCQkKLQkJLy8gQ3JlYXRlIGRpYWdyYW0KLQkJRGlhZ3JhbSBkaWFncmFtID0gVmlld1NlcnZpY2UuY3JlYXRlRGlhZ3JhbShhZGRPcldwZERpYWdyYW0sIGtpbmQsCi0JCQkJcHJlZkhpbnQpOwotCQlkaWFncmFtLnNldEVsZW1lbnQoYWRkT3JXcGREaWFncmFtKTsKLQkJZGlhZ3JhbS5zZXROYW1lKHVtYUFjdGl2aXR5LmdldE5hbWUoKSk7Ci0JCQotCQl4bWlSZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChhZGRPcldwZERpYWdyYW0pOwotCQl4bWlSZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtKTsKLQkJCi0JCUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCQotCQlMaXN0IGRpYWdyYW1Ob2RlcyA9IGFkZE9yV3BkRGlhZ3JhbS5nZXROb2RlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGlhZ3JhbU5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTm9kZSApIHsKLQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqOwotCQkJCWlmICgob2JqIGluc3RhbmNlb2YgVHlwZWROb2RlKSAmJgotCQkJCQkJKCgoVHlwZWROb2RlKW9iaikuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5GUkVFX1RFWFQpKQl7CQotCQkJCQkvLyBkbyBzcGVjaWFsIGhhbmRpbmcgZm9yIGZyZWUgdGV4dCBub2RlCQkJCQkKLQkJCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSB0ZXh0ID0gTWFwVXRpbC5jcmVhdGVUZXh0KGRpYWdyYW0sIChOb2RlKSBvYmopOwotCQkJCQlkaWFncmFtLmluc2VydENoaWxkKHRleHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gQ3JlYXRlIE5vdGF0aW9uIG5ub2RlCi0JCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgbm90YXRpb25Ob2RlID0gTWFwVXRpbC5jcmVhdGVOb3RhdGlvbk5vZGVfQUREb3JXUEQoZGlhZ3JhbSwgbm9kZSk7Ci0JCQkJCWlmIChub3RhdGlvbk5vZGUgPT0gbnVsbCkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJZGlhZ3JhbS5pbnNlcnRDaGlsZChub3RhdGlvbk5vZGUpOwotCi0JCQkJCUJvdW5kcyBib3VuZHMgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpOwotCQkJCQlib3VuZHMuc2V0SGVpZ2h0KG5vZGUuZ2V0SGVpZ2h0KCkpOwotCQkJCQlib3VuZHMuc2V0V2lkdGgobm9kZS5nZXRXaWR0aCgpKTsKLQkJCQkJYm91bmRzLnNldFgobm9kZS5nZXRMb2NhdGlvbigpLngpOwotCQkJCQlib3VuZHMuc2V0WShub2RlLmdldExvY2F0aW9uKCkueSk7Ci0JCQkJCW5vdGF0aW9uTm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KGJvdW5kcyk7Ci0KLQkJCQkJbm90YXRpb25Ob2RlLnNldEVsZW1lbnQobm9kZSk7Ci0JCQkJCi0JCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCQkJbWFwLnB1dChub2RlLCBub3RhdGlvbk5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJCi0JCUNvbm5lY3Rpb25GYWN0b3J5IGZhY3RvcnkgPSBuZXcgQ29ubmVjdGlvbkZhY3RvcnkoZGlhZ3JhbSwgbWFwLCBraW5kKTsKLQkJLy8gQ3JlYXRlIE91dGdvaW5nIGNvbm5lY3Rpb25zCi0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQlmYWN0b3J5Lm91dGdvaW5nQ29ubmVjdGlvbnMoKE5vZGUpIG9iaik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBDcmVhdGUgT3V0Z29pbmcgY29ubmVjdGlvbnMKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCWZhY3RvcnkuaW5jb21pbmdDb25uZWN0aW9ucygoTm9kZSkgb2JqKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gbGlzdAotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZERhdGFUb1Jlc291cmNlX0FEKCBSZXNvdXJjZSB4bWlSZXNvdXJjZSwgUHJvY2VzcyBwcm9jLAotCQkJQWN0aXZpdHkgdW1hQWN0aXZpdHkpIHsKLQotCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gZCA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0VU1BRGlhZ3JhbSh1bWFBY3Rpdml0eSwgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0sCi0JCQkJCQlmYWxzZSk7Ci0JCWlmIChkID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQUQtPiIrcHJvYy5nZXROYW1lKCkrIjoiK3VtYUFjdGl2aXR5LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCQotCQkvLyBDcmVhdGUgdG9wIGxldmVsIFVNTCBhY3Rpdml0eQotCQlFT2JqZWN0IGFjdGl2aXR5ID0gVU1MRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5KCkpOwotCQlpZiAoYWN0aXZpdHkgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgewotCQkJKChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSlhY3Rpdml0eSkuc2V0TmFtZSh1bWFBY3Rpdml0eS5nZXROYW1lKCkpOwotCQl9Ci0JCWlmIChhY3Rpdml0eSBpbnN0YW5jZW9mIEVNb2RlbEVsZW1lbnQpIHsKLQkJCS8vQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uKChFTW9kZWxFbGVtZW50KSBhY3Rpdml0eSwgKChNZXRob2RFbGVtZW50KSB1bWFBY3Rpdml0eSkpOwotLy8JCQlVbWFVbWxVdGlsLmNyZWF0ZUVBbm5vdGF0aW9uRm9yVW1sKChOYW1lZEVsZW1lbnQpIGFjdGl2aXR5LAotLy8JCQkJCXVtYUFjdGl2aXR5LmdldEd1aWQoKSk7Ci0JCQkKLQkJCUJyaWRnZUhlbHBlci5hc3NvY2lhdGUoKEVNb2RlbEVsZW1lbnQpIGFjdGl2aXR5LCB1bWFBY3Rpdml0eSk7Ci0JCX0KLQkJCi0JCS8vIENyZWF0ZSBkaWFncmFtCi0JCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZURpYWdyYW0oYWN0aXZpdHksIERpYWdyYW1NYW5hZ2VyLkFEX2tpbmQsCi0JCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCWRpYWdyYW0uc2V0RWxlbWVudChhY3Rpdml0eSk7Ci0JCWlmIChhY3Rpdml0eSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSB7Ci0JCQlkaWFncmFtLnNldE5hbWUodW1hQWN0aXZpdHkuZ2V0TmFtZSgpKTsKLQkJfQotCQotCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IG5ldyBTdXBwcmVzc2lvbihwcm9jKTsKLQkJCi0JCUFjdGl2aXR5RGlhZ3JhbSBhZCA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHlEaWFncmFtKCk7Ci0JCWFkLnNldFN1cHByZXNzaW9uKHN1cHByZXNzaW9uKTsKLQkJYWQuc2V0T2JqZWN0KHVtYUFjdGl2aXR5KTsKLQkJaWYgKGFkLmlzTmV3KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gc2V0IHN1cHByZXNzaW9uL3B1Ymxpc2hlZCBpbmZvIGZvciBBRCAKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIHVtYURpYWdyYW0gPSBhZC5nZXRVTUFEaWFncmFtKCk7Ci0JCWlmICh1bWFEaWFncmFtICE9IG51bGwpIHsKLQkJCWlmICh1bWFEaWFncmFtLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkgewkKLQkJCQlEaWFncmFtT3B0aW9ucy5zZXRQdWJsaXNoQUQodW1hQWN0aXZpdHksIGZhbHNlKTsKLQkJCX0KLQkJfQotCQkKLS8vCQlyZXR1cm4gKExpc3QpIGFkLmdldE5vZGVzKCk7Ci0JCQotLy8JCUxpc3QgZGlhZ3JhbU5vZGVzID0gZ2V0QWN0aXZpdHlEaWFncmFtRGF0YShzdXBwcmVzc2lvbiwgdW1hQWN0aXZpdHkpOwotCQlMaXN0IGRpYWdyYW1Ob2RlcyA9IGFkLmdldE5vZGVzKCk7Ci0JCWlmIChkaWFncmFtTm9kZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCi0KLQkJeG1pUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoYWN0aXZpdHkpOwotCQl4bWlSZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtKTsKLQkJCQotCQlMaXN0IG1hcE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlIYXNoTWFwIG1hcE5vZGVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCS8vIENyZWF0ZSBVTUwgYW5kIG5vdGF0aW9uIG5vZGVzCi0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBkaWFncmFtTm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBOb2RlICkgewotCQkJCWlmICgob2JqIGluc3RhbmNlb2YgVHlwZWROb2RlKSAmJgotCQkJCQkJKCgoVHlwZWROb2RlKW9iaikuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5GUkVFX1RFWFQpKQl7CQotCQkJCQkvLyBkbyBzcGVjaWFsIGhhbmRpbmcgZm9yIGZyZWUgdGV4dCBub2RlCi0JCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgdGV4dCA9IE1hcFV0aWwuY3JlYXRlVGV4dChkaWFncmFtLCAoTm9kZSkgb2JqKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCU1hcE5vZGUgbWFwTm9kZSA9IE1hcEZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGUoKE5vZGUpIG9iaik7Ci0JCQkJCW1hcE5vZGUuc2V0QWN0aXZpdHkoKG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KWFjdGl2aXR5KTsKLQkJCQkJbWFwTm9kZS5zZXREaWFncmFtKGRpYWdyYW0pOwotCQkJCQkKLQkJCQkJbWFwTm9kZS51cGRhdGVSZXNvdXJjZSgpOwotCQkJCQltYXBOb2Rlcy5hZGQobWFwTm9kZSk7Ci0JCQkJCW1hcE5vZGVzTWFwLnB1dChtYXBOb2RlLCAoTm9kZSkgb2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIENyZWF0ZSBPdXRnb2luZyBjb25uZWN0aW9ucwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFwTm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNYXBOb2RlKSB7Ci0JCQkJKChNYXBOb2RlKSBvYmopLm91dGdvaW5nQ29ubmVjdGlvbnMoKE5vZGUpIG1hcE5vZGVzTWFwLmdldCgoTWFwTm9kZSkgb2JqKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIENyZWF0ZSBpbmNvbWluZyBjb25uZWN0aW9ucwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFwTm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNYXBOb2RlKSB7Ci0JCQkJKChNYXBOb2RlKSBvYmopLmluY29taW5nQ29ubmVjdGlvbnMoKE5vZGUpIG1hcE5vZGVzTWFwLmdldCgoTWFwTm9kZSkgb2JqKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIGFjdGl2aXR5IGRpYWdyYW0gZGF0YQotCSAqIEBwYXJhbSBzdXAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldEFjdGl2aXR5RGlhZ3JhbURhdGEoU3VwcHJlc3Npb24gc3VwLCBBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlBY3Rpdml0eURpYWdyYW0gYWQgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5RGlhZ3JhbSgpOwotCQlhZC5zZXRTdXBwcmVzc2lvbihzdXApOwotCQlhZC5zZXRPYmplY3QoYWN0aXZpdHkpOwotCQlpZiAoYWQuaXNOZXcoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChMaXN0KSBhZC5nZXROb2RlcygpOwotCi0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRBRChmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgUHJvY2VzcyBwcm9jLAotCQkJZmluYWwgQWN0aXZpdHkgdW1hQWN0aXZpdHksIGZpbmFsIERpYWdyYW1NYW5hZ2VyIG1ncikgewotCQlhZGRUb1Jlc291cmNlKHJlc291cmNlLCBwcm9jLCB1bWFBY3Rpdml0eSwgbWdyLCAwKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEFERChmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgUHJvY2VzcyBwcm9jLAotCQkJZmluYWwgQWN0aXZpdHkgdW1hQWN0aXZpdHksIGZpbmFsIERpYWdyYW1NYW5hZ2VyIG1ncikgewotCQlhZGRUb1Jlc291cmNlKHJlc291cmNlLCBwcm9jLCB1bWFBY3Rpdml0eSwgbWdyLCAxKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFdQRChmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgUHJvY2VzcyBwcm9jLAotCQkJZmluYWwgQWN0aXZpdHkgdW1hQWN0aXZpdHksIGZpbmFsIERpYWdyYW1NYW5hZ2VyIG1ncikgewotCQlhZGRUb1Jlc291cmNlKHJlc291cmNlLCBwcm9jLCB1bWFBY3Rpdml0eSwgbWdyLCAyKTsKLQl9Ci0JCi0JLy90eXBlOiAwPUFELCAxPUFERCwgMj1XUEQKLQlwcml2YXRlIHZvaWQgYWRkVG9SZXNvdXJjZShmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSwKLQkJCWZpbmFsIFByb2Nlc3MgcHJvYywgZmluYWwgQWN0aXZpdHkgdW1hQWN0aXZpdHksCi0JCQlmaW5hbCBEaWFncmFtTWFuYWdlciBtZ3IsIGZpbmFsIGludCB0eXBlKSB7Ci0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlUcmFuc2FjdGlvbiB0eCA9IG1nci5nZXRFZGl0aW5nRG9tYWluKCkuc3RhcnRUcmFuc2FjdGlvbigKLQkJCQkJCQlmYWxzZSwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQotCQkJCQlpZiAodHlwZSA9PSAwKSB7Ci0JCQkJCQlhZGREYXRhVG9SZXNvdXJjZV9BRChyZXNvdXJjZSwgcHJvYywgdW1hQWN0aXZpdHkpOwotCQkJCQl9IGVsc2UgaWYgKHR5cGUgPT0gMSkgewotCQkJCQkJYWRkRGF0YVRvUmVzb3VyY2VfQUREKHJlc291cmNlLCBwcm9jLCB1bWFBY3Rpdml0eSk7Ci0JCQkJCX0gZWxzZSBpZiAodHlwZSA9PSAyKSB7Ci0JCQkJCQlhZGREYXRhVG9SZXNvdXJjZV9XUEQocmVzb3VyY2UsIHByb2MsIHVtYUFjdGl2aXR5KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWFzc2VydCAoZmFsc2UpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQl0eC5jb21taXQoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC93aXphcmRzL01pZ3JhdGlvbkV4cG9ydFdpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvd2l6YXJkcy9NaWdyYXRpb25FeHBvcnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QyM2I4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC93aXphcmRzL01pZ3JhdGlvbkV4cG9ydFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLkRpYWdyYW1NaWdyYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLk1pZ3JhdGlvbkV4cG9ydEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uTWlncmF0aW9uUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5zZXJ2aWNlcy5Xb3JrZmxvd0V4cG9ydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEV4cG9ydCB3aXphcmQgZm9yIGV4cG9ydGluZyBkaWFncmFtcwotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1pZ3JhdGlvbkV4cG9ydFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElFeHBvcnRXaXphcmQgewotCi0JLy8gVGhlIHdvcmtiZW5jaCBpbnN0YW5jZS4KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaCB3b3JrYmVuY2g7Ci0KLQkvLyBUaGUgd29ya2JlbmNoIHNlbGVjdGlvbiB3aGVuIHRoZSB3aXphcmQgd2FzIHN0YXJ0ZWQuCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCS8vIFRoZSBmaXJzdCB3aXphcmQgcGFnZS4KLQlwcm90ZWN0ZWQgTWlncmF0aW9uRXhwb3J0V2l6YXJkUGFnZSBwYWdlMTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBkaWFncmFtIG1pZ3JhdGlvbiBleHBvcnQKLQkgKi8KLQlwdWJsaWMgTWlncmF0aW9uRXhwb3J0V2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlpZiAocGFnZTEgIT0gbnVsbCkgewotCi0JCQlQcm9jZXNzIHByb2MgPSBwYWdlMS5nZXRQcm9jZXNzKCk7Ci0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IHBhZ2UxLmdldEFjdGl2aXR5KCk7Ci0JCQkvLyBNZXRob2RDb25maWd1cmF0aW9uIG1jID0gcGFnZTEuZ2V0Q29udGV4dCgpOwotCi0JCQlTdHJpbmcgZmlsZU5hbWUgPSBwYWdlMS5nZXRUZW1wbGF0ZU5hbWUoKTsKLQkJCVN0cmluZyB0YXJnZXREaXIgPSBwYWdlMS5nZXRUYXJnZXREaXJlY3RvcnkoKTsKLQotCQkJU3RyaW5nIHRlbXBsYXRlRmlsZU5hbWUgPSBmaWxlTmFtZSArICIueG1pIjsgLy8kTk9OLU5MUy0xJAotCQkJRmlsZSB0ZW1wbGF0ZUZpbGUgPSBuZXcgRmlsZSh0YXJnZXREaXIsIHRlbXBsYXRlRmlsZU5hbWUpOwotCQkJaWYgKHRlbXBsYXRlRmlsZS5leGlzdHMoKSkgewotCQkJCWJvb2xlYW4gb2sgPSBEaWFncmFtTWlncmF0aW9uUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5UHJvbXB0KAotCQkJCQkJCQlNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfb3ZlcndyaXRlVGV4dERpYWxvZ190aXRsZSwKLQkJCQkJCQkJTWlncmF0aW9uUmVzb3VyY2VzCi0JCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQlNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfb3ZlcndyaXRlVGV4dF9tc2csCi0JCQkJCQkJCQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJCQkJCQkJCQl0ZW1wbGF0ZUZpbGVOYW1lLAotCQkJCQkJCQkJCQkJCQl0YXJnZXREaXIgfSkpOwotCi0JCQkJaWYgKCFvaykgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQl0cnkgewotCQkJCWJvb2xlYW4gc3VjY2VzcyA9IFdvcmtmbG93RXhwb3J0U2VydmljZS5nZXRJbnN0YW5jZSgpLmV4cG9ydCgKLQkJCQkJCXByb2MsIGFjdGl2aXR5LCBmaWxlTmFtZSwgbmV3IEZpbGUodGFyZ2V0RGlyKSk7Ci0KLQkJCQlpZiAoc3VjY2VzcykgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0KLQkJCX0gY2F0Y2ggKE1pZ3JhdGlvbkV4cG9ydEV4Y2VwdGlvbiB4ZSkgewotCQkJCXhlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMud29ya2JlbmNoID0gd29ya2JlbmNoOwotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQkvLyBzdXBlci5hZGRQYWdlcygpOwotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYiA9PSBudWxsKSB7Ci0JCQlEaWFncmFtTWlncmF0aW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCU1pZ3JhdGlvblJlc291cmNlcy5vcGVuX21ldGhvZF9saWJyYXJ5X2Vycm9yX3RpdGxlLAotCQkJCQkJCU1pZ3JhdGlvblJlc291cmNlcy5vcGVuX21ldGhvZF9saWJyYXJ5X2Vycm9yX3RleHQpOwotCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlwYWdlMSA9IG5ldyBNaWdyYXRpb25FeHBvcnRXaXphcmRQYWdlKCk7Ci0JCWFkZFBhZ2UocGFnZTEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJLy8gcmV0dXJuIHN1cGVyLmNhbkZpbmlzaCgpOwotCQlyZXR1cm4gcGFnZTEuaXNQYWdlQ29tcGxldGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY3JlYXRlUGFnZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLQkJc3VwZXIuY3JlYXRlUGFnZUNvbnRyb2xzKHBhZ2VDb250YWluZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvd2l6YXJkcy9NaWdyYXRpb25FeHBvcnRXaXphcmRQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC93aXphcmRzL01pZ3JhdGlvbkV4cG9ydFdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZlMDE5ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC93aXphcmRzL01pZ3JhdGlvbkV4cG9ydFdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uTWlncmF0aW9uRXhwb3J0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5NaWdyYXRpb25SZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLnV0aWwuTWlncmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBFeHBvcnQgd2l6YXJkIHBhZ2UgZm9yIGV4cG9ydGluZyBkaWFncmFtcwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICoKLSAqLwotcHVibGljIGNsYXNzIE1pZ3JhdGlvbkV4cG9ydFdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMKLQkJSVdpemFyZFBhZ2UsIExpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IE1pZ3JhdGlvbkV4cG9ydFdpemFyZFBhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9BUlJBWSA9IG5ldyBTdHJpbmdbMF07Ci0KLQlwcml2YXRlIEJ1dHRvbiBjYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gZGVsaXZlcnlQcm9jZXNzUmFkaW9CdXR0b247Ci0KLQlwcml2YXRlIENvbWJvIHByb2Nlc3NDb21ibzsKLQotLy8JcHJpdmF0ZSBDb21ibyBjb250ZXh0Q29tYm87Ci0KLQlwcml2YXRlIENvbWJvIGFjdGl2aXR5Q29tYm87Ci0KLQlwcml2YXRlIENvbWJvIHRlbXBsYXRlTmFtZUNvbWJvOwotCi0JcHJpdmF0ZSBDb21ibyB0ZW1wbGF0ZURpckNvbWJvOwotCi0JcHJpdmF0ZSBNYXAgY2FwYWJpbGl0eVBhdHRlcm5zOwotCi0JcHJpdmF0ZSBNYXAgZGVsaXZlcnlQcm9jZXNzZXM7Ci0KLQlwcml2YXRlIE1hcCBhY3Rpdml0aWVzOwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIE1pZ3JhdGlvbkV4cG9ydFdpemFyZFBhZ2UoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKE1pZ3JhdGlvblJlc291cmNlcy53b3JrZmxvd19leHBvcnRfd2l6YXJkX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oTWlncmF0aW9uUmVzb3VyY2VzLndvcmtmbG93X2V4cG9ydF93aXphcmRfdGV4dCk7Ci0JCQotCQlzZXRJbWFnZURlc2NyaXB0b3IoRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL3dpemJhbi9FeHBvcnRYTUwuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBjb21wb3NpdGUgdG8gaG9sZCB0aGUgd2lkZ2V0cy4KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQotCQkvLyBDcmVhdGUgdGhlIFByb2Nlc3MgZ3JvdXAuCi0JCUdyb3VwIHByb2Nlc3NHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJcHJvY2Vzc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlwcm9jZXNzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXByb2Nlc3NHcm91cAotCQkJCS5zZXRUZXh0KE1pZ3JhdGlvblJlc291cmNlcy53b3JrZmxvd19leHBvcnRfd2l6YXJkX3Byb2Nlc3NHcm91cF90ZXh0KTsKLQotCQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwcm9jZXNzR3JvdXAsIFNXVC5OVUxMKTsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCWNhcGFiaWxpdHlQYXR0ZXJuUmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlJBRElPKTsKLQkJY2FwYWJpbGl0eVBhdHRlcm5SYWRpb0J1dHRvbgotCQkJCS5zZXRUZXh0KE1pZ3JhdGlvblJlc291cmNlcy53b3JrZmxvd19leHBvcnRfd2l6YXJkX2NhcGFiaWxpdHlQYXR0ZXJuUmFkaW9CdXR0b25fdGV4dCk7Ci0JCWNhcGFiaWxpdHlQYXR0ZXJuUmFkaW9CdXR0b24KLQkJCQkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQkJdXBkYXRlUHJvY2Vzc0NvbWJvKGNhcGFiaWxpdHlQYXR0ZXJucyk7Ci0JCQkJCQl1cGRhdGVBY3Rpdml0eUNvbWJvKGdldFByb2Nlc3MoKSk7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJfQotCQkJCX0pOwotCi0JCWRlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCWRlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uCi0JCQkJLnNldFRleHQoTWlncmF0aW9uUmVzb3VyY2VzLndvcmtmbG93X2V4cG9ydF93aXphcmRfZGVsaXZlcnlQcm9jZXNzUmFkaW9CdXR0b25fdGV4dCk7Ci0JCWRlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uCi0JCQkJLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJCXVwZGF0ZVByb2Nlc3NDb21ibyhkZWxpdmVyeVByb2Nlc3Nlcyk7Ci0JCQkJCQl1cGRhdGVBY3Rpdml0eUNvbWJvKGdldFByb2Nlc3MoKSk7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJfQotCQkJCX0pOwotCi0JCUNvbXBvc2l0ZSBwcm9jZXNzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwcm9jZXNzR3JvdXAsIFNXVC5OVUxMKTsKLQkJcHJvY2Vzc0NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJcHJvY2Vzc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBwcm9jZXNzTmFtZUxhYmVsID0gbmV3IExhYmVsKHByb2Nlc3NDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcHJvY2Vzc05hbWVMYWJlbAotCQkJCS5zZXRUZXh0KE1pZ3JhdGlvblJlc291cmNlcy53b3JrZmxvd19leHBvcnRfd2l6YXJkX3Byb2Nlc3NOYW1lTGFiZWxfdGV4dCk7Ci0KLQkJcHJvY2Vzc0NvbWJvID0gbmV3IENvbWJvKHByb2Nlc3NDb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJcHJvY2Vzc0NvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlwcm9jZXNzQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLS8vCQkJCXVwZGF0ZUNvbnRleHRDb21ibyhnZXRQcm9jZXNzKCkpOwotLy8JCQkJaWYgKGdldFByb2Nlc3NDb250ZXh0TmFtZSgpICE9IG51bGwpIHsKLS8vCQkJCQlTdHJpbmcgY29udGV4dE5hbWUgPSBnZXRQcm9jZXNzQ29udGV4dE5hbWUoKTsKLS8vCQkJCQlNYXAgcmVzdWx0ID0gTWlncmF0aW9uVXRpbC5nZXRDb250ZXh0cyhnZXRQcm9jZXNzKCkpOwotLy8JCQkJCXVwZGF0ZUFjdGl2aXR5Q29tYm8oZ2V0UHJvY2VzcygpLAotLy8JCQkJCQkJKE1ldGhvZENvbmZpZ3VyYXRpb24pIHJlc3VsdC5nZXQoY29udGV4dE5hbWUpKTsKLS8vCQkJCX0KLQkJCQl1cGRhdGVBY3Rpdml0eUNvbWJvKGdldFByb2Nlc3MoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJfQotCQl9KTsKLQotLy8JCUxhYmVsIGNvbnRleHROYW1lTGFiZWwgPSBuZXcgTGFiZWwocHJvY2Vzc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotLy8JCWNvbnRleHROYW1lTGFiZWwKLS8vCQkJCS5zZXRUZXh0KE1pZ3JhdGlvblJlc291cmNlcy53b3JrZmxvd19leHBvcnRfd2l6YXJkX2NvbnRleHROYW1lTGFiZWxfdGV4dCk7Ci0vLwotLy8JCWNvbnRleHRDb21ibyA9IG5ldyBDb21ibyhwcm9jZXNzQ29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0vLwkJY29udGV4dENvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotLy8JCWNvbnRleHRDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0vLwotLy8JCWNvbnRleHRDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0vLwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0vLwkJCQlTdHJpbmcgY29udGV4dE5hbWUgPSBnZXRQcm9jZXNzQ29udGV4dE5hbWUoKTsKLS8vCQkJCU1hcCByZXN1bHQgPSBNaWdyYXRpb25VdGlsLmdldENvbnRleHRzKGdldFByb2Nlc3MoKSk7Ci0vLwkJCQl1cGRhdGVBY3Rpdml0eUNvbWJvKGdldFByb2Nlc3MoKSwgKE1ldGhvZENvbmZpZ3VyYXRpb24pIHJlc3VsdAotLy8JCQkJCQkuZ2V0KGNvbnRleHROYW1lKSk7Ci0vLwkJCX0KLS8vCi0vLwkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotLy8JCQl9Ci0vLwkJfSk7Ci0KLQkJTGFiZWwgYWN0aXZpdGllc05hbWVMYWJlbCA9IG5ldyBMYWJlbChwcm9jZXNzQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWFjdGl2aXRpZXNOYW1lTGFiZWwKLQkJCQkuc2V0VGV4dChNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF9hY3Rpdml0aWVzTmFtZUxhYmVsX3RleHQpOwotCi0JCWFjdGl2aXR5Q29tYm8gPSBuZXcgQ29tYm8ocHJvY2Vzc0NvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlhY3Rpdml0eUNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlhY3Rpdml0eUNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCQljYXBhYmlsaXR5UGF0dGVybnMgPSBNaWdyYXRpb25VdGlsLmdldENhcGFiaWxpdHlQYXR0ZXJucygpOwotCQlkZWxpdmVyeVByb2Nlc3NlcyA9IE1pZ3JhdGlvblV0aWwuZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKTsKLQkJU3RyaW5nIHNhdmVkUHJvY2Vzc1R5cGUgPSBEaWFncmFtTWlncmF0aW9uUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJCQlNaWdyYXRpb25FeHBvcnRDb25zdGFudHMuUFJPQ0VTU19UWVBFKTsKLQkJaWYgKHNhdmVkUHJvY2Vzc1R5cGUgIT0gbnVsbAotCQkJCSYmIHNhdmVkUHJvY2Vzc1R5cGUuZXF1YWxzKCJEZWxpdmVyeVByb2Nlc3MiKSAmJiBkZWxpdmVyeVByb2Nlc3Nlcy5zaXplKCkgPiAwKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWRlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCXVwZGF0ZVByb2Nlc3NDb21ibyhkZWxpdmVyeVByb2Nlc3Nlcyk7Ci0JCX0gZWxzZSBpZiAoc2F2ZWRQcm9jZXNzVHlwZSAhPSBudWxsICYmIGNhcGFiaWxpdHlQYXR0ZXJucyAhPSBudWxsICYmIGNhcGFiaWxpdHlQYXR0ZXJucy5zaXplKCkgPiAwKSB7Ci0JCQljYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCXVwZGF0ZVByb2Nlc3NDb21ibyhjYXBhYmlsaXR5UGF0dGVybnMpOwotCQl9IGVsc2UgaWYgKGNhcGFiaWxpdHlQYXR0ZXJucyAhPSBudWxsICYmIGNhcGFiaWxpdHlQYXR0ZXJucy5zaXplKCkgPiAwKSB7Ci0JCQljYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCXVwZGF0ZVByb2Nlc3NDb21ibyhjYXBhYmlsaXR5UGF0dGVybnMpOwotCQl9IGVsc2UgewotCQkJZGVsaXZlcnlQcm9jZXNzUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJdXBkYXRlUHJvY2Vzc0NvbWJvKGRlbGl2ZXJ5UHJvY2Vzc2VzKTsKLQkJfQotCi0JCXVwZGF0ZUFjdGl2aXR5Q29tYm8oZ2V0UHJvY2VzcygpKTsKLQkJCi0JCS8vIENyZWF0ZSB0aGUgUHJvamVjdCBUZW1wbGF0ZSBncm91cC4KLQkJR3JvdXAgdGVtcGxhdGVHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJdGVtcGxhdGVHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJdGVtcGxhdGVHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdGVtcGxhdGVHcm91cAotCQkJCS5zZXRUZXh0KE1pZ3JhdGlvblJlc291cmNlcy53b3JrZmxvd19leHBvcnRfd2l6YXJkX3RlbXBsYXRlR3JvdXBfdGV4dCk7Ci0KLQkJQ29tcG9zaXRlIHRlbXBsYXRlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0ZW1wbGF0ZUdyb3VwLCBTV1QuTlVMTCk7Ci0JCXRlbXBsYXRlQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQl0ZW1wbGF0ZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCB0ZW1wbGF0ZU5hbWVMYWJlbCA9IG5ldyBMYWJlbCh0ZW1wbGF0ZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl0ZW1wbGF0ZU5hbWVMYWJlbAotCQkJCS5zZXRUZXh0KE1pZ3JhdGlvblJlc291cmNlcy53b3JrZmxvd19leHBvcnRfd2l6YXJkX3RlbXBsYXRlTmFtZUxhYmVsX3RleHQpOwotCi0JCXRlbXBsYXRlTmFtZUNvbWJvID0gbmV3IENvbWJvKHRlbXBsYXRlQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJdGVtcGxhdGVOYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCVN0cmluZyBwcmV2TmFtZSA9IERpYWdyYW1NaWdyYXRpb25QbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQkJCU1pZ3JhdGlvbkV4cG9ydENvbnN0YW50cy5URU1QTEFURV9OQU1FUyk7Ci0JCWlmIChwcmV2TmFtZSAhPSBudWxsKSB7Ci0JCQl0ZW1wbGF0ZU5hbWVDb21iby5hZGQocHJldk5hbWUpOwotCQl9Ci0JCXRlbXBsYXRlTmFtZUNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCQluZXcgTGFiZWwodGVtcGxhdGVDb21wb3NpdGUsIFNXVC5OT05FKTsKLQotCQlMYWJlbCBkaXJMYWJlbCA9IG5ldyBMYWJlbCh0ZW1wbGF0ZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlkaXJMYWJlbAotCQkJCS5zZXRUZXh0KE1pZ3JhdGlvblJlc291cmNlcy53b3JrZmxvd19leHBvcnRfd2l6YXJkX2RpckxhYmVsX3RleHQpOwotCi0JCXRlbXBsYXRlRGlyQ29tYm8gPSBuZXcgQ29tYm8odGVtcGxhdGVDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl0ZW1wbGF0ZURpckNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlTdHJpbmcgc2F2ZWREaXIgPSBEaWFncmFtTWlncmF0aW9uUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJCQlNaWdyYXRpb25FeHBvcnRDb25zdGFudHMuVEFSR0VUX0RJUkVDVE9SSUVTKTsKLQkJaWYgKHNhdmVkRGlyICE9IG51bGwpIHsKLQkJCXRlbXBsYXRlRGlyQ29tYm8uYWRkKHNhdmVkRGlyKTsKLQkJCXRlbXBsYXRlRGlyQ29tYm8uc2V0VGV4dChzYXZlZERpcik7Ci0JCX0KLQkJdGVtcGxhdGVEaXJDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24odGVtcGxhdGVDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYnJvd3NlQnV0dG9uCi0JCQkJLnNldFRleHQoTWlncmF0aW9uUmVzb3VyY2VzLndvcmtmbG93X2V4cG9ydF93aXphcmRfYnJvd3NlQnV0dG9uX3RleHQpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXRyeSB7Ci0JCQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHNoZWxsLAotCQkJCQkJCVNXVC5OT05FKTsKLQkJCQkJU3RyaW5nIHNlbGVjdGVkRGlyID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkJaWYgKHNlbGVjdGVkRGlyICE9IG51bGwpIHsKLQkJCQkJCXRlbXBsYXRlRGlyQ29tYm8uYWRkKHNlbGVjdGVkRGlyLCAwKTsKLQkJCQkJCXRlbXBsYXRlRGlyQ29tYm8uc2V0VGV4dChzZWxlY3RlZERpcik7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgUHJvY2VzcyBDb21iby4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9jZXNzQ29tYm8oTWFwIHByb2Nlc3NlcykgewotCQlpZiAocHJvY2Vzc2VzICE9IG51bGwgJiYgcHJvY2Vzc2VzLnNpemUoKSA+IDApIHsKLQkJCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1twcm9jZXNzZXMuc2l6ZSgpXTsKLQkJCXByb2Nlc3Nlcy5rZXlTZXQoKS50b0FycmF5KG5hbWVzKTsKLQkJCXByb2Nlc3NDb21iby5zZXRJdGVtcyhuYW1lcyk7Ci0JCQlTdHJpbmcgc2F2ZWRQcm9jZXNzID0gRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQkJCQlNaWdyYXRpb25FeHBvcnRDb25zdGFudHMuUFJPQ0VTU19OQU1FKTsKLQkJCWlmIChzYXZlZFByb2Nlc3MgIT0gbnVsbCAmJiBwcm9jZXNzZXMuY29udGFpbnNLZXkoc2F2ZWRQcm9jZXNzKSkgewotCQkJCXByb2Nlc3NDb21iby5zZXRUZXh0KHNhdmVkUHJvY2Vzcyk7Ci0JCQl9IGVsc2UgewotCQkJCXByb2Nlc3NDb21iby5zZXRUZXh0KHByb2Nlc3NDb21iby5nZXRJdGVtKDApKTsKLQkJCX0KLS8vCQkJdXBkYXRlQ29udGV4dENvbWJvKGdldFByb2Nlc3MoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwcm9jZXNzQ29tYm8uc2V0SXRlbXMoRU1QVFlfQVJSQVkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgQ29udGV4dCBDb21iby4KLQkgKi8KLS8vCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRleHRDb21ibyhQcm9jZXNzIHByb2Nlc3MpIHsKLS8vCQl0cnkgewotLy8JCQlNYXAgY29udGV4dHMgPSBNaWdyYXRpb25VdGlsLmdldENvbnRleHRzKHByb2Nlc3MpOwotLy8JCQlpZiAoY29udGV4dHMgIT0gbnVsbCAmJiBjb250ZXh0cy5zaXplKCkgPiAwKSB7Ci0vLwkJCQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbY29udGV4dHMuc2l6ZSgpXTsKLS8vCQkJCWNvbnRleHRzLmtleVNldCgpLnRvQXJyYXkobmFtZXMpOwotLy8JCQkJY29udGV4dENvbWJvLnNldEl0ZW1zKG5hbWVzKTsKLS8vCQkJCVN0cmluZyBzYXZlZENvbnRleHQgPSBEaWFncmFtbWluZ01pZ3JhdGlvblBsdWdpbi5nZXREZWZhdWx0KCkKLS8vCQkJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLS8vCQkJCQkJCQlNaWdyYXRpb25FeHBvcnRDb25zdGFudHMuUFJPQ0VTU19DT05URVhUKTsKLS8vCQkJCWlmIChzYXZlZENvbnRleHQgIT0gbnVsbCAmJiBjb250ZXh0cy5jb250YWluc0tleShzYXZlZENvbnRleHQpKSB7Ci0vLwkJCQkJY29udGV4dENvbWJvLnNldFRleHQoc2F2ZWRDb250ZXh0KTsKLS8vCQkJCX0gZWxzZSB7Ci0vLwkJCQkJU3RyaW5nIGRlZmF1bHRDb250ZXh0ID0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpCi0vLwkJCQkJCQkuZ2V0TmFtZSgpOwotLy8JCQkJCWNvbnRleHRDb21iby5zZXRUZXh0KGRlZmF1bHRDb250ZXh0KTsKLS8vCQkJCX0KLS8vCQkJfSBlbHNlIHsKLS8vCQkJCWNvbnRleHRDb21iby5zZXRJdGVtcyhFTVBUWV9BUlJBWSk7Ci0vLwkJCX0KLS8vCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8JCX0KLS8vCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGFjdGl2aXRpdHkgQ29tYm8uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQWN0aXZpdHlDb21ibyhQcm9jZXNzIHByb2Nlc3MpIHsKLQkJdHJ5IHsKLQkJCWFjdGl2aXRpZXMgPSBNaWdyYXRpb25VdGlsLmdldEFjdGl2aXRpZXMocHJvY2Vzcyk7Ci0JCQlpZiAoYWN0aXZpdGllcyAhPSBudWxsICYmIGFjdGl2aXRpZXMuc2l6ZSgpID4gMCkgewotCQkJCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1thY3Rpdml0aWVzLnNpemUoKV07Ci0JCQkJYWN0aXZpdGllcy5rZXlTZXQoKS50b0FycmF5KG5hbWVzKTsKLQkJCQlhY3Rpdml0eUNvbWJvLnNldEl0ZW1zKG5hbWVzKTsKLQkJCQkvLyBTdHJpbmcgc2F2ZWRDb250ZXh0ID0gV29ya2Zsb3dFeHBQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLy8gLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQkvLyBXb3JrZmxvd0V4cG9ydENvbnN0YW50cy5BQ1RJVklUWV9DT05URVhUKTsKLQkJCQkvLyBpZiAoc2F2ZWRDb250ZXh0ICE9IG51bGwgJiYKLQkJCQkvLyBjb250ZXh0cy5jb250YWluc0tleShzYXZlZENvbnRleHQpKSB7Ci0JCQkJLy8gYWN0aXZpdHlDb21iby5zZXRUZXh0KHNhdmVkQ29udGV4dCk7Ci0JCQkJLy8gfSBlbHNlIHsKLQkJCQkvLyBTdHJpbmcgZGVmYXVsdENvbnRleHQgPSBwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkKLQkJCQkvLyAuZ2V0TmFtZSgpOwotCQkJCS8vIGFjdGl2aXR5Q29tYm8uc2V0VGV4dChkZWZhdWx0Q29udGV4dCk7Ci0JCQkJLy8gfQotCQkJCWFjdGl2aXR5Q29tYm8uc2V0VGV4dChuYW1lc1swXSk7Ci0JCQl9IGVsc2UgewotCQkJCWFjdGl2aXR5Q29tYm8uc2V0SXRlbXMoRU1QVFlfQVJSQVkpOwotCQkJfQotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBQcm9jZXNzLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCWlmIChjYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IHByb2Nlc3NDb21iby5nZXRUZXh0KCk7Ci0JCQlyZXR1cm4gKFByb2Nlc3MpIGNhcGFiaWxpdHlQYXR0ZXJucy5nZXQobmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgbmFtZSA9IHByb2Nlc3NDb21iby5nZXRUZXh0KCk7Ci0JCQlyZXR1cm4gKFByb2Nlc3MpIGRlbGl2ZXJ5UHJvY2Vzc2VzLmdldChuYW1lKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlbGVjdGVkIFByb2Nlc3MgY29udGV4dC4KLQkgKi8KLS8vCXB1YmxpYyBTdHJpbmcgZ2V0UHJvY2Vzc0NvbnRleHROYW1lKCkgewotLy8JCXJldHVybiAoU3RyaW5nKSBjb250ZXh0Q29tYm8uZ2V0VGV4dCgpOwotLy8JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGVtcGxhdGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRlbXBsYXRlTmFtZSgpIHsKLQkJcmV0dXJuIHRlbXBsYXRlTmFtZUNvbWJvLmdldFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXJnZXQgZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gdGVtcGxhdGVEaXJDb21iby5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWlmIChwcm9jZXNzQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDAKLS8vCQkJCSYmIGNvbnRleHRDb21iby5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCSYmIHRlbXBsYXRlTmFtZUNvbWJvLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJJiYgdGVtcGxhdGVEaXJDb21iby5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCSYmIGFjdGl2aXR5Q29tYm8uZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgQWN0aXZpdHkgZ2V0QWN0aXZpdHkoKSB7Ci0JCWlmIChhY3Rpdml0eUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgIT0gLTEpIHsKLQkJCVN0cmluZyBhY3Rpdml0eU5hbWUgPSBhY3Rpdml0eUNvbWJvLmdldFRleHQoKTsKLQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBhY3Rpdml0aWVzLmdldChhY3Rpdml0eU5hbWUpOwotCQkJcmV0dXJuIGFjdGl2aXR5OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotLy8JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0Q29udGV4dCgpIHsKLS8vCQlpZiAoZ2V0UHJvY2Vzc0NvbnRleHROYW1lKCkgIT0gbnVsbCkgewotLy8JCQlTdHJpbmcgY29udGV4dE5hbWUgPSBnZXRQcm9jZXNzQ29udGV4dE5hbWUoKTsKLS8vCQkJTWFwIHJlc3VsdCA9IE1pZ3JhdGlvblV0aWwuZ2V0Q29udGV4dHMoZ2V0UHJvY2VzcygpKTsKLS8vCQkJcmV0dXJuIChNZXRob2RDb25maWd1cmF0aW9uKSByZXN1bHQuZ2V0KGNvbnRleHROYW1lKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIG51bGw7Ci0vLwl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZGR3cGQvbWFwL0Nvbm5lY3Rpb25GYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZGR3cGQvbWFwL0Nvbm5lY3Rpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4N2EyMjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWRkd3BkL21hcC9Db25uZWN0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZGR3cGQubWFwOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5QcmVjaXNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwLk1hcFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uQm91bmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5JZGVudGl0eUFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uUmVsYXRpdmVCZW5kcG9pbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uZGF0YXR5cGUuUmVsYXRpdmVCZW5kcG9pbnQ7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0aW9uRmFjdG9yeSB7Ci0KLQlwcml2YXRlIEhhc2hNYXAgbWFwID0gbnVsbDsKLQotCXByaXZhdGUgRGlhZ3JhbSBkaWFncmFtID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIGtpbmQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfSEVJR0hUID0gMzI7Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkZhY3RvcnkoRGlhZ3JhbSBkaWFncmFtLCBIYXNoTWFwIG1hcCwgU3RyaW5nIGtpbmQpIHsKLQkJdGhpcy5tYXAgPSBtYXA7Ci0JCXRoaXMuZGlhZ3JhbSA9IGRpYWdyYW07Ci0JCXRoaXMua2luZCA9IGtpbmQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIG91dGdvaW5nIGNvbm5lY3Rpb25zCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBvdXRnb2luZ0Nvbm5lY3Rpb25zKE5vZGUgbm9kZSkgewotCQlMaXN0IGNvbm5lY3Rpb25zID0gbm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCk7Ci0KLQkJaWYgKGNvbm5lY3Rpb25zICE9IG51bGwgJiYgY29ubmVjdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbm5lY3Rpb25zLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlcmF0b3IubmV4dCgpOwotCi0JCQkJLy8gY3JlYXRlIGNvbm5lY3Rpb24KLQkJCQlFZGdlIGVkZ2UgPSBjcmVhdGVDb25uZWN0aW9uKGxpbmspOwotCi0JCQkJLy8gZ2V0IHNvdXJjZSBub2RlCi0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBzb3VyY2VOb3RhdGlvbk5vZGUgPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgbWFwCi0JCQkJCQkuZ2V0KG5vZGUpOwotCi0JCQkJLy8gYWRkIHRoZSBlZGdlIGFzIHNvdXJjZSBlZGdlCi0JCQkJc291cmNlTm90YXRpb25Ob2RlLmdldFNvdXJjZUVkZ2VzKCkuYWRkKGVkZ2UpOwotCQkJCXNvdXJjZU5vdGF0aW9uTm9kZS5nZXREaWFncmFtKCkuaW5zZXJ0RWRnZShlZGdlKTsKLQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGluY29taW5nIGNvbm5lY3Rpb25zCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbmNvbWluZ0Nvbm5lY3Rpb25zKE5vZGUgbm9kZSkgewotCQlMaXN0IGNvbm5lY3Rpb25zID0gbm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCk7Ci0KLQkJaWYgKGNvbm5lY3Rpb25zICE9IG51bGwgJiYgY29ubmVjdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbm5lY3Rpb25zLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlcmF0b3IubmV4dCgpOwotCi0JCQkJLy8gY3JlYXRlIGVkZ2UKLQkJCQlFZGdlIGVkZ2UgPSBjcmVhdGVDb25uZWN0aW9uKGxpbmspOwotCi0JCQkJLy8gZ2V0IHNvdXJjZSBub2RlCi0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBzb3VyY2VOb3RhdGlvbk5vZGUgPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgbWFwCi0JCQkJCQkuZ2V0KG5vZGUpOwotCi0JCQkJLy8gYWRkIHRoZSBlZGdlIGFzIHRhcmdldCBlZGdlCi0JCQkJc291cmNlTm90YXRpb25Ob2RlLmdldFRhcmdldEVkZ2VzKCkuYWRkKGVkZ2UpOwotCQkJCXNvdXJjZU5vdGF0aW9uTm9kZS5nZXREaWFncmFtKCkuaW5zZXJ0RWRnZShlZGdlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBub3RhdGlvbiBlZGdlIGZvciB0aGUgZ2l2ZW4gbGluawotCSAqIAotCSAqIEBwYXJhbSBsaW5rCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgRWRnZSBjcmVhdGVDb25uZWN0aW9uKExpbmsgbGluaykgewotCQkvLyBnZXQgc291cmNlIGFuZCB0YXJnZXQgb2JqZWN0cyBvZiB0aGUgbGluawotCQlOb2RlIHNvdXJjZU9iaiA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCU5vZGUgdGFyZ2V0T2JqID0gbGluay5nZXRUYXJnZXQoKTsKLQotCQkvLyBnZXQgbm90YXRpb24gbm9kZXMKLQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBzb3VyY2VOb3RhdGlvbk5vZGUgPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgbWFwCi0JCQkJLmdldChzb3VyY2VPYmopOwotCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIHRhcmdldE5vdGF0aW9uTm9kZSA9IChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlKSBtYXAKLQkJCQkuZ2V0KHRhcmdldE9iaik7Ci0KLQkJRWRnZSBlZGdlID0gZmluZEVkZ2Uoc291cmNlTm90YXRpb25Ob2RlLCB0YXJnZXROb3RhdGlvbk5vZGUpOwotCQlpZiAoZWRnZSA9PSBudWxsICYmIHRhcmdldE5vdGF0aW9uTm9kZSAhPSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgbm90YXRpb24gZWRnZQotCQkJaWYgKGtpbmQgPT0gRGlhZ3JhbU1hbmFnZXIuQUREX2tpbmQpCi0JCQkJZWRnZSA9IE1hcFV0aWwuY3JlYXRlRWRnZV9XUEQoc291cmNlTm90YXRpb25Ob2RlLAotCQkJCQkJdGFyZ2V0Tm90YXRpb25Ob2RlLCBsaW5rKTsKLQkJCWVsc2UgaWYgKGtpbmQgPT0gRGlhZ3JhbU1hbmFnZXIuV1BEX2tpbmQpCi0JCQkJZWRnZSA9IE1hcFV0aWwuY3JlYXRlRWRnZV9XUEQoc291cmNlTm90YXRpb25Ob2RlLAotCQkJCQkJdGFyZ2V0Tm90YXRpb25Ob2RlLCBsaW5rKTsKLQotCQkJaWYgKGVkZ2UgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJZWRnZS5zZXRFbGVtZW50KGxpbmspOwotCQkJbG9hZFNvdXJjZUFuZFRhcmdldEVuZFBvaW50KGVkZ2UsIGxpbmspOwotCQkJbG9hZEJlbmRQb2ludHMoZWRnZSwgbGluayk7Ci0JCX0KLQkJcmV0dXJuIGVkZ2U7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgc291cmNlIGFuZCB0YXJnZXQgZW5kIHBvaW50cyBmb3Igc3luY2hyb25pemF0aW9uIGJhciBhbmQgZGVjaXNpb24KLQkgKiBub2RlCi0JICogCi0JICogQHBhcmFtIGVkZ2UKLQkgKiBAcGFyYW0gZmxvdwotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkU291cmNlQW5kVGFyZ2V0RW5kUG9pbnQoRWRnZSBlZGdlLCBMaW5rIGZsb3cpIHsKLQkJUG9pbnQgc3JjUG9pbnQgPSBmbG93LmdldFNvdXJjZUVuZFBvaW50KCk7Ci0JCVBvaW50IHRhcmdldFBvaW50ID0gZmxvdy5nZXRUYXJnZXRFbmRQb2ludCgpOwotCi0JCVZpZXcgc3JjVmlldyA9IGVkZ2UuZ2V0U291cmNlKCk7Ci0JCVZpZXcgdGFyZ2V0VmlldyA9IGVkZ2UuZ2V0VGFyZ2V0KCk7Ci0KLQkJaWYgKHNyY1BvaW50ICE9IG51bGwKLQkJCQkmJiBzcmNWaWV3IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgewotCQkJQm91bmRzIGJvdW5kcyA9IChCb3VuZHMpICgob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgc3JjVmlldykKLQkJCQkJLmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJCS8vIGZvciBXUEQsIGhlaWdodCBpcyBub3Qgc3RvcmVkIGFuZCBpdCdzIGFsd2F5cyBzYW1lLgotCQkJLy8gV2UgZG8gbmVlZCBjb3JyZWN0IGhlaWdodCB0byBjYWxjdWxhdGUgaWRlbnRpdHkgYW5jaG9yIGluIEdNRgotCQkJaWYgKGJvdW5kcy5nZXRIZWlnaHQoKSA9PSAtMSkKLQkJCQlib3VuZHMuc2V0SGVpZ2h0KDQwKTsKLQkJCUlkZW50aXR5QW5jaG9yIGFuY2hvciA9IGNyZWF0ZUlkZW50aXR5QW5jaG9yKHNyY1BvaW50LCBib3VuZHMpOwotCQkJaWYgKGFuY2hvciAhPSBudWxsKQotCQkJCWVkZ2Uuc2V0U291cmNlQW5jaG9yKGFuY2hvcik7Ci0JCX0KLQotCQlpZiAodGFyZ2V0UG9pbnQgIT0gbnVsbAotCQkJCSYmIHRhcmdldFZpZXcgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlKSB7Ci0JCQlCb3VuZHMgYm91bmRzID0gKEJvdW5kcykgKChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlKSB0YXJnZXRWaWV3KQotCQkJCQkuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCQkJLy8gRm9yIFdQRCwgaGVpZ2h0IGlzIG5vdCBzdG9yZWQgYW5kIGl0J3MgYWx3YXlzIHNhbWUuCi0JCQkvLyBXZSBkbyBuZWVkIGNvcnJlY3QgaGVpZ2h0IHRvIGNhbGN1bGF0ZSBpZGVudGl0eSBhbmNob3IgaW4gR01GCi0JCQlpZiAoYm91bmRzLmdldEhlaWdodCgpID09IC0xKQotCQkJCWJvdW5kcy5zZXRIZWlnaHQoNDApOwotCQkJSWRlbnRpdHlBbmNob3IgYW5jaG9yID0gY3JlYXRlSWRlbnRpdHlBbmNob3IodGFyZ2V0UG9pbnQsIGJvdW5kcyk7Ci0JCQlpZiAoYW5jaG9yICE9IG51bGwpCi0JCQkJZWRnZS5zZXRUYXJnZXRBbmNob3IoYW5jaG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBpZGVudGl0eSBhbmNob3IKLQkgKiAKLQkgKiBAcGFyYW0gcG9pbnQKLQkgKiBAcGFyYW0gYm91bmRzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSWRlbnRpdHlBbmNob3IgY3JlYXRlSWRlbnRpdHlBbmNob3IoUG9pbnQgcG9pbnQsIEJvdW5kcyBib3VuZHMpIHsKLQkJUHJlY2lzaW9uUG9pbnQgcHJlUG9pbnQgPSBNYXBVdGlsLmdldEFuY2hvclJlbGF0aXZlTG9jYXRpb24ocG9pbnQsCi0JCQkJYm91bmRzKTsKLQkJU3RyaW5nIGlkID0gTWFwVXRpbC5jb21wb3NlVGVybWluYWxTdHJpbmcocHJlUG9pbnQpOwotCi0JCUlkZW50aXR5QW5jaG9yIHZhbHVlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJZGVudGl0eUFuY2hvcigpOwotCQl2YWx1ZS5zZXRJZChpZCk7Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIExvYWQgcmVsYXRpdmUgYmVuZCBwb2ludHMKLQkgKiAKLQkgKiBAcGFyYW0gZWRnZQotCSAqIEBwYXJhbSBmbG93Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRCZW5kUG9pbnRzKEVkZ2UgZWRnZSwgTGluayBmbG93KSB7Ci0JCUxpc3QgbGlzdCA9IGZsb3cuZ2V0QmVuZHBvaW50cygpOwotCQlMaXN0PFJlbGF0aXZlQmVuZHBvaW50PiByZWxhdGl2ZVBvaW50cyA9IG5ldyBBcnJheUxpc3Q8UmVsYXRpdmVCZW5kcG9pbnQ+KCk7Ci0KLQkJUmVsYXRpdmVCZW5kcG9pbnQgcmJwID0gbmV3IFJlbGF0aXZlQmVuZHBvaW50KDAsIDAsIDAsIDApOwotCi0JCXJlbGF0aXZlUG9pbnRzLmFkZChyYnApOwotCQlpZiAobGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUFic29sdXRlQmVuZHBvaW50IGFicCA9IChBYnNvbHV0ZUJlbmRwb2ludCkgaXRlcmF0b3IubmV4dCgpOwotCi0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBzcmNOb2RlID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIGVkZ2UKLQkJCQkJCS5nZXRTb3VyY2UoKTsKLQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIHRhcmdldE5vZGUgPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgZWRnZQotCQkJCQkJLmdldFRhcmdldCgpOwotCi0JCQkJQm91bmRzIHNvdXJjZUJvdW5kcyA9IChCb3VuZHMpIHNyY05vZGUuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCQkJCUJvdW5kcyB0YXJnZXRCb3VuZHMgPSAoQm91bmRzKSB0YXJnZXROb2RlLmdldExheW91dENvbnN0cmFpbnQoKTsKLQotCQkJCWludCBzcmNMaW5lID0gTWFwVXRpbC5nZXROb09mTGluZXMoc3JjTm9kZSk7Ci0JCQkJaW50IHRhcmdldExpbmUgPSBNYXBVdGlsLmdldE5vT2ZMaW5lcyh0YXJnZXROb2RlKTsKLQkJCQlpbnQgc3JjSGVpZ2h0ID0gTWFwVXRpbC5nZXRUZXh0SGVpZ2h0KHNyY05vZGUpOwotCQkJCWludCB0YXJnZXRIZWlnaHQgPSBNYXBVdGlsLmdldFRleHRIZWlnaHQodGFyZ2V0Tm9kZSk7Ci0KLQkJCQlpbnQgc3JjWCA9IHNvdXJjZUJvdW5kcy5nZXRYKCkgKyBzb3VyY2VCb3VuZHMuZ2V0V2lkdGgoKSAvIDI7Ci0JCQkJaW50IHNyY1kgPSBzb3VyY2VCb3VuZHMuZ2V0WSgpCi0JCQkJCQkrIChJTUFHRV9IRUlHSFQgKyAoc3JjTGluZSAqIHNyY0hlaWdodCkpIC8gMjsKLQkJCQlpbnQgdGFyWCA9IHRhcmdldEJvdW5kcy5nZXRYKCkgKyB0YXJnZXRCb3VuZHMuZ2V0V2lkdGgoKSAvIDI7Ci0JCQkJaW50IHRhclkgPSB0YXJnZXRCb3VuZHMuZ2V0WSgpCi0JCQkJCQkrIChJTUFHRV9IRUlHSFQgKyAodGFyZ2V0TGluZSAqIHRhcmdldEhlaWdodCkpIC8gMjsKLQotCQkJCWludCByZWwxID0gYWJwLnggLSBzcmNYOwotCQkJCWludCByZWwyID0gYWJwLnkgLSBzcmNZOwotCQkJCWludCByZWwzID0gYWJwLnggLSB0YXJYOwotCQkJCWludCByZWw0ID0gYWJwLnkgLSB0YXJZOwotCi0JCQkJUmVsYXRpdmVCZW5kcG9pbnQgcmJwMSA9IG5ldyBSZWxhdGl2ZUJlbmRwb2ludChyZWwxLCByZWwyLAotCQkJCQkJcmVsMywgcmVsNCk7Ci0JCQkJcmVsYXRpdmVQb2ludHMuYWRkKHJicDEpOwotCQkJfQotCQl9Ci0JCXJlbGF0aXZlUG9pbnRzLmFkZChyYnApOwotCi0JCWlmIChyZWxhdGl2ZVBvaW50cy5zaXplKCkgPiAwKSB7Ci0JCQlSZWxhdGl2ZUJlbmRwb2ludHMgYmVuZHBvaW50cyA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVJlbGF0aXZlQmVuZHBvaW50cygpOwotCQkJYmVuZHBvaW50cy5zZXRQb2ludHMocmVsYXRpdmVQb2ludHMpOwotCQkJZWRnZS5zZXRCZW5kcG9pbnRzKGJlbmRwb2ludHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRmluZCBlZGdlIGluIGRpYWdyYW0gZ2l2ZW4gc291cmNlIGFuZCB0YXJnZXQgbm9kZXMKLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlTm9kZQotCSAqIEBwYXJhbSB0YXJnZXROb2RlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgRWRnZSBmaW5kRWRnZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIHNvdXJjZU5vZGUsCi0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIHRhcmdldE5vZGUpIHsKLQkJTGlzdCBsaXN0ID0gZGlhZ3JhbS5nZXRFZGdlcygpOwotCQlpZiAobGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUVkZ2UgZWRnZSA9IChFZGdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKChlZGdlLmdldFRhcmdldCgpICE9IG51bGwpCi0JCQkJCQkmJiB0YXJnZXROb2RlLmVxdWFscyhlZGdlLmdldFRhcmdldCgpKQotCQkJCQkJJiYgKGVkZ2UuZ2V0U291cmNlKCkgIT0gbnVsbCkKLQkJCQkJCSYmIHNvdXJjZU5vZGUuZXF1YWxzKGVkZ2UuZ2V0U291cmNlKCkpKSB7Ci0JCQkJCXJldHVybiBlZGdlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL3V0aWwvTWlncmF0aW9uVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vdXRpbC9NaWdyYXRpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZTJkNzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vdXRpbC9NaWdyYXRpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIEhlbHBlciB1dGlsaXRpZXMgZm9yIHRoZSBNaWdyYXRpb24gU2VydmljZS4KLSAqCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRpb25VdGlsIHsKLQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgb2YgYWxsIHRoZSA8Y29kZT5DYXBhYmlsaXR5UGF0dGVybjwvY29kZT4gYW5kIDxjb2RlPkRlbGl2ZXJ5UHJvY2VzczwvY29kZT4KLQkgKiBpbiB0aGUgY3VycmVudCBNZXRob2QgTGlicmFyeS4KLQkgKgotCSAqIFRPRE86IE1vdmUgdGhpcyBtZXRob2QgdG8gdGhlIGNvbS5pYm0ucm1tLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeVV0aWwgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0UHJvY2Vzc2VzKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGlicmFyeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU1hcCByZXN1bHQgPSBuZXcgVHJlZU1hcCgpOwotCQlMaXN0IG1ldGhvZFBsdWdpbnMgPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW5zKGxpYnJhcnkpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBtZXRob2RQbHVnaW5zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCU1ldGhvZFBsdWdpbiBtZXRob2RQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKWkubmV4dCgpOwotCQkJU3RyaW5nIGNhcGFiaWxpdHlQYXR0ZXJuUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoOwotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlICA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLCBjYXBhYmlsaXR5UGF0dGVyblBhdGhzKTsKLQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJCWdldENhcGFiaWxpdHlQYXR0ZXJucygoUHJvY2Vzc1BhY2thZ2UpbWV0aG9kUGFja2FnZSwgcmVzdWx0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlTdHJpbmcgZGVsaXZlcnlQcm9jZXNzUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aDsKLQkJCW1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwgZGVsaXZlcnlQcm9jZXNzUGF0aHMpOwotCQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKFByb2Nlc3NQYWNrYWdlKW1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG1hcCBvZiBhbGwgPGNvZGU+Q2FwYWJpbGl0eVBhdHRlcm48L2NvZGU+IGluIHRoZSBjdXJyZW50IE1ldGhvZCBMaWJyYXJ5LgotCSAqCi0JICogVE9ETzogTW92ZSB0aGlzIG1ldGhvZCB0byB0aGUgY29tLmlibS5ybW0ubGlicmFyeS5zZXJ2aWNlcy5MaWJyYXJ5VXRpbCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRDYXBhYmlsaXR5UGF0dGVybnMoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWFwIHJlc3VsdCA9IG5ldyBUcmVlTWFwKCk7Ci0JCUxpc3QgbWV0aG9kUGx1Z2lucyA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbnMobGlicmFyeSk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG1ldGhvZFBsdWdpbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kUGx1Z2luIG1ldGhvZFBsdWdpbiA9IChNZXRob2RQbHVnaW4paS5uZXh0KCk7Ci0JCQlTdHJpbmcgY2FwYWJpbGl0eVBhdHRlcm5QYXRoc1tdID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGg7Ci0JCQlNZXRob2RQYWNrYWdlIG1ldGhvZFBhY2thZ2UgID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sIGNhcGFiaWxpdHlQYXR0ZXJuUGF0aHMpOwotCQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCWdldENhcGFiaWxpdHlQYXR0ZXJucygoUHJvY2Vzc1BhY2thZ2UpbWV0aG9kUGFja2FnZSwgcmVzdWx0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgb2YgYWxsIHRoZSA8Y29kZT5EZWxpdmVyeVByb2Nlc3M8L2NvZGU+IGluIHRoZSBjdXJyZW50IE1ldGhvZCBMaWJyYXJ5LgotCSAqCi0JICogVE9ETzogTW92ZSB0aGlzIG1ldGhvZCB0byB0aGUgY29tLmlibS5ybW0ubGlicmFyeS5zZXJ2aWNlcy5MaWJyYXJ5VXRpbCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBnZXREZWxpdmVyeVByb2Nlc3NlcygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXAgcmVzdWx0ID0gbmV3IFRyZWVNYXAoKTsKLQkJTGlzdCBtZXRob2RQbHVnaW5zID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2lucyhsaWJyYXJ5KTsKLQkJZm9yIChJdGVyYXRvciBpID0gbWV0aG9kUGx1Z2lucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luID0gKE1ldGhvZFBsdWdpbilpLm5leHQoKTsKLQkJCVN0cmluZyBkZWxpdmVyeVByb2Nlc3NQYXRoc1tdID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoOwotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sIGRlbGl2ZXJ5UHJvY2Vzc1BhdGhzKTsKLQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NlcygoUHJvY2Vzc1BhY2thZ2UpbWV0aG9kUGFja2FnZSwgcmVzdWx0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgb2YgYWxsIHRoZSBjb250ZXh0cyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzLgotCSAqCi0JICogVE9ETzogTW92ZSB0aGlzIG1ldGhvZCB0byB0aGUgY29tLmlibS5ybW0ubGlicmFyeS5zZXJ2aWNlcy5MaWJyYXJ5VXRpbCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRDb250ZXh0cyhQcm9jZXNzIHByb2Nlc3MpIHsKLQkJaWYgKHByb2Nlc3MgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGlicmFyeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU1hcCByZXN1bHQgPSBuZXcgVHJlZU1hcCgpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb250ZXh0ID0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlpZiAoZGVmYXVsdENvbnRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0LnB1dChkZWZhdWx0Q29udGV4dC5nZXROYW1lKCksIGRlZmF1bHRDb250ZXh0KTsKLQkJfQotCi0JCUxpc3QgY29udGV4dHMgPSBwcm9jZXNzLmdldFZhbGlkQ29udGV4dCgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBjb250ZXh0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbnRleHQgPSAoTWV0aG9kQ29uZmlndXJhdGlvbilpLm5leHQoKTsKLQkJCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQucHV0KGNvbnRleHQuZ2V0TmFtZSgpLCBjb250ZXh0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgbWFwIG9mIGFsbCA8Y29kZT5DYXBhYmlsaXR5UGF0dGVybjwvY29kZT4gaW4gYSBnaXZlbiA8Y29kZT5Qcm9jZXNzUGFja2FnZTwvY29kZT4uCi0JICoKLQkgKiBUT0RPOiBNb3ZlIHRoaXMgbWV0aG9kIHRvIHRoZSBjb20uaWJtLnJtbS5saWJyYXJ5LnNlcnZpY2VzLkxpYnJhcnlVdGlsIGNsYXNzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBnZXRDYXBhYmlsaXR5UGF0dGVybnMoUHJvY2Vzc1BhY2thZ2UgcHJvY2Vzc1BhY2thZ2UsIE1hcCByZXN1bHQpIHsKLQkJTGlzdCBjaGlsZFBhY2thZ2VzID0gcHJvY2Vzc1BhY2thZ2UuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBjaGlsZFBhY2thZ2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCU9iamVjdCBvYmogPSBpLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jZXNzQ29tcG9uZW50ID0gKFByb2Nlc3NDb21wb25lbnQpb2JqOwotCQkJCVByb2Nlc3MgcHJvY2VzcyAgPSBwcm9jZXNzQ29tcG9uZW50LmdldFByb2Nlc3MoKTsKLQkJCQlpZiAocHJvY2VzcyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gcHJvY2Vzcy5nZXROYW1lKCk7Ci0JCQkJCXJlc3VsdC5wdXQobmFtZSwgcHJvY2Vzcyk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXRDYXBhYmlsaXR5UGF0dGVybnMoKFByb2Nlc3NQYWNrYWdlKW9iaiwgcmVzdWx0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBhIG1hcCBvZiBhbGwgPGNvZGU+RGVsaXZlcnlQcm9jZXNzPC9jb2RlPiBpbiBhIGdpdmVuIDxjb2RlPlByb2Nlc3NQYWNrYWdlPC9jb2RlPi4KLQkgKgotCSAqIFRPRE86IE1vdmUgdGhpcyBtZXRob2QgdG8gdGhlIGNvbS5pYm0ucm1tLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeVV0aWwgY2xhc3MuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGdldERlbGl2ZXJ5UHJvY2Vzc2VzKFByb2Nlc3NQYWNrYWdlIHByb2Nlc3NQYWNrYWdlLCBNYXAgcmVzdWx0KSB7Ci0JCUxpc3QgY2hpbGRQYWNrYWdlcyA9IHByb2Nlc3NQYWNrYWdlLmdldENoaWxkUGFja2FnZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gY2hpbGRQYWNrYWdlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KW9iajsKLQkJCQlQcm9jZXNzIHByb2Nlc3MgID0gcHJvY2Vzc0NvbXBvbmVudC5nZXRQcm9jZXNzKCk7Ci0JCQkJaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBwcm9jZXNzLmdldE5hbWUoKTsKLQkJCQkJcmVzdWx0LnB1dChuYW1lLCBwcm9jZXNzKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc2VzKChQcm9jZXNzUGFja2FnZSlvYmosIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0QWN0aXZpdGllcyhQcm9jZXNzIHByb2Nlc3MpewotCQlyZXR1cm4gZ2V0QWN0aXZpdGllcyhwcm9jZXNzLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTWFwIGdldEFjdGl2aXRpZXMoUHJvY2VzcyBwcm9jZXNzLCBib29sZWFuIGxpbmtlZEhhc2hNYXApewotCQlNYXAgcmVzdWx0ID0gbGlua2VkSGFzaE1hcCA/IG5ldyBMaW5rZWRIYXNoTWFwKCkgOiBuZXcgVHJlZU1hcCgpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb250ZXh0ID0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlQcm9jZXNzQ29uZmlndXJhdG9yIGZpbHRlciA9IG5ldyBQcm9jZXNzQ29uZmlndXJhdG9yKGRlZmF1bHRDb250ZXh0KTsKLQkJZ2V0QWN0aXZpdGllcyhwcm9jZXNzLCByZXN1bHQsIGZpbHRlcik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIE1ldGhvZCByZXR1cm5zIExpc3Qgb2YgYWN0aXZpdGllcyAocmVjdXJzaXZlbHkpIGZvciBwYXJ0aWN1bGFyIGNvbmZpZ3VyYXRpb24gCi0JICogdW5kZXIgYSBQcm9jZXNzICg8Y29kZT5EZWxpdmVyeVByb2Nlc3M8L2NvZGU+IG9yIDxjb2RlPkNhcGFiaWxpdHlQYXR0ZXJuPC9jb2RlPikuICAKLQkgKiAgQHBhcmFtIEFjdGl2aXR5Ci0JICogIEBwYXJhbSBNYXAKLQkgKiAgQHBhcmFtIFByb2Nlc3NDb25maWd1cmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZ2V0QWN0aXZpdGllcyhBY3Rpdml0eSBwcm9jZXNzLCBNYXAgcmVzdWx0LCBQcm9jZXNzQ29uZmlndXJhdG9yIGZpbHRlcil7Ci0JCXJlc3VsdC5wdXQocHJvY2Vzcy5nZXROYW1lKCksIHByb2Nlc3MpOwotCQlMaXN0IGxpc3QgPSBwcm9jZXNzLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCWlmKGxpc3Quc2l6ZSgpID4gMCl7Ci0JCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkJCU9iamVjdCBvYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCQlpZihmaWx0ZXIgIT0gbnVsbCAmJiBmaWx0ZXIuYWNjZXB0KG9iamVjdCkpewotCQkJCQkJcmVzdWx0LnB1dCgoKEFjdGl2aXR5KW9iamVjdCkuZ2V0TmFtZSgpLCBvYmplY3QpOwotCQkJCQl9Ci0JCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJCWdldEFjdGl2aXRpZXMoKEFjdGl2aXR5KW9iamVjdCwgcmVzdWx0LCBmaWx0ZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Ly5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjOWY3OTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MWNjMDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QsCi0gb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLAotIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QudXRpbAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBjb20uaWJtLmljdQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDk0ZWZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIG1vZGVsLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvbW9kZWwvTVNfUHJvamVjdF8yMDAzLmdlbm1vZGVsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9tb2RlbC9NU19Qcm9qZWN0XzIwMDMuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NDZmMmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9tb2RlbC9NU19Qcm9qZWN0XzIwMDMuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdCIgbW9kZWxOYW1lPSJNU19Qcm9qZWN0XzIwMDMiIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLnhzZC5lY29yZS5pbXBvcnRlciI+Ci0gIDxmb3JlaWduTW9kZWw+ZmlsZTovQzovRWNsaXBzZTMxMS9NU19Qcm9qZWN0XzIwMDMueHNkPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9Ik1zcHJvamVjdCIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmVwZiIgcmVzb3VyY2U9IlhNTCIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGxvYWRJbml0aWFsaXphdGlvbj0idHJ1ZSIgZWNvcmVQYWNrYWdlPSJtc3Byb2plY3QuZWNvcmUjLyI+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9BY2NydWVBdCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0FsaWFzVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQXV0aG9yVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0Jvb2tpbmdUeXBlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQm9va2luZ1R5cGVUeXBlMSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQ2FsY3VsYXRpb25UeXBlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQ2F0ZWdvcnlUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Db2RlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQ29tcGFueVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0NvbnN0cmFpbnRUeXBlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQ29udGFjdFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0Nvc3RSYXRlVGFibGVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9DdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQ3VycmVuY3lTeW1ib2xUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9EYXlUeXBlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9EZWZhdWx0VGFza0VWTWV0aG9kVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRGVmYXVsdFRhc2tUeXBlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRHVyYXRpb25Gb3JtYXRUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9EdXJhdGlvbkZvcm1hdFR5cGUxIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9EdXJhdGlvbkZvcm1hdFR5cGUyIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9EdXJhdGlvbkZvcm1hdFR5cGUzIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9EdXJhdGlvbkZvcm1hdFR5cGU0Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9EdXJhdGlvbkZvcm1hdFR5cGU1Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9FYXJuZWRWYWx1ZU1ldGhvZFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0Vhcm5lZFZhbHVlTWV0aG9kVHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0VtYWlsQWRkcmVzc1R5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0V4dGVybmFsVGFza1Byb2plY3RUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9GaXhlZENvc3RBY2NydWFsVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRllTdGFydERhdGVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Hcm91cFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0h5cGVybGlua0FkZHJlc3NUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9IeXBlcmxpbmtBZGRyZXNzVHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0h5cGVybGlua0FkZHJlc3NUeXBlMiIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0h5cGVybGlua1N1YkFkZHJlc3NUeXBlMSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9IeXBlcmxpbmtUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9IeXBlcmxpbmtUeXBlMSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vSHlwZXJsaW5rVHlwZTIiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0luaXRpYWxzVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vTGFnRm9ybWF0VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0xldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vTWFuYWdlclR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL01hdGVyaWFsTGFiZWxUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9OYW1lVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vTmFtZVR5cGUxIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9OYW1lVHlwZTIiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL05hbWVUeXBlMyIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vTmV3VGFza1N0YXJ0RGF0ZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL05UQWNjb3VudFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL091dGxpbmVOdW1iZXJUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9PdmVydGltZVJhdGVGb3JtYXRUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9PdmVydGltZVJhdGVGb3JtYXRUeXBlMSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vUGhvbmV0aWNBbGlhc1R5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1Bob25ldGljc1R5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1ByZWZpeFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1JhdGVUYWJsZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1JvbGx1cFR5cGVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9TdGFuZGFyZFJhdGVGb3JtYXRUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9TdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vU3ViamVjdFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1N1YnByb2plY3ROYW1lVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vVGl0bGVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9UeXBlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vVHlwZVR5cGUxIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9UeXBlVHlwZTIiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1R5cGVUeXBlMyIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vVHlwZVR5cGU0Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9UeXBlVHlwZTUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1VJRFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1VuaXRUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZWxpc3RTb3J0T3JkZXJUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9XZWVrU3RhcnREYXlUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Xb3JrQ29udG91clR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1dvcmtGb3JtYXRUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Xb3JrR3JvdXBUeXBlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC91SUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3Rhc2tVSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3Jlc291cmNlVUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9wZXJjZW50V29ya0NvbXBsZXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9hY3R1YWxDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9hY3R1YWxGaW5pc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2FjdHVhbE92ZXJ0aW1lQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYWN0dWFsT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9hY3R1YWxTdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYWN0dWFsV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYUNXUCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvY29uZmlybWVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9jb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9jb3N0UmF0ZVRhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9jb3N0VmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2NWIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9kZWxheSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvZmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9maW5pc2hWYXJpYW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvaHlwZXJsaW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9oeXBlcmxpbmtBZGRyZXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9oeXBlcmxpbmtTdWJBZGRyZXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC93b3JrVmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2hhc0ZpeGVkUmF0ZVVuaXRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9maXhlZE1hdGVyaWFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9sZXZlbGluZ0RlbGF5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9sZXZlbGluZ0RlbGF5Rm9ybWF0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9saW5rZWRGaWVsZHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L21pbGVzdG9uZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvbm90ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L292ZXJhbGxvY2F0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L292ZXJ0aW1lQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvb3ZlcnRpbWVXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9yZWd1bGFyV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvcmVtYWluaW5nQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvcmVtYWluaW5nT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9yZW1haW5pbmdPdmVydGltZVdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3JlbWFpbmluZ1dvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3Jlc3BvbnNlUGVuZGluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvc3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3N0b3AiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3Jlc3VtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvc3RhcnRWYXJpYW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvdW5pdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3VwZGF0ZU5lZWRlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvdkFDIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC93b3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC93b3JrQ29udG91ciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYkNXUyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYkNXUCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYm9va2luZ1R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2FjdHVhbFdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvY3JlYXRpb25EYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvZXh0ZW5kZWRBdHRyaWJ1dGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9iYXNlbGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3RpbWVwaGFzZWREYXRhIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnRzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudHMvYXNzaWdubWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9BdmFpbGFiaWxpdHlQZXJpb2QiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0F2YWlsYWJpbGl0eVBlcmlvZC9hdmFpbGFibGVGcm9tIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXZhaWxhYmlsaXR5UGVyaW9kL2F2YWlsYWJsZVRvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXZhaWxhYmlsaXR5UGVyaW9kL2F2YWlsYWJsZVVuaXRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0F2YWlsYWJpbGl0eVBlcmlvZHMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9BdmFpbGFiaWxpdHlQZXJpb2RzL2F2YWlsYWJpbGl0eVBlcmlvZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL3RpbWVwaGFzZWREYXRhIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUvbnVtYmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUvaW50ZXJpbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL3N0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUvZmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUvZHVyYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZS9kdXJhdGlvbkZvcm1hdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL2VzdGltYXRlZER1cmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUvd29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL2Nvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZS9iQ1dTIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUvYkNXUCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMi9udW1iZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTIvd29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMi9jb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUyL2JDV1MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTIvYkNXUCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTMvdGltZXBoYXNlZERhdGEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTMvbnVtYmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUzL3N0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUzL2ZpbmlzaCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMy93b3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUzL2Nvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTMvYkNXUyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMy9iQ1dQIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0NhbGVuZGFyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9DYWxlbmRhci91SUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9DYWxlbmRhci9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQ2FsZW5kYXIvaXNCYXNlQ2FsZW5kYXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9DYWxlbmRhci9iYXNlQ2FsZW5kYXJVSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vQ2FsZW5kYXIvd2Vla0RheXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vQ2FsZW5kYXJzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vQ2FsZW5kYXJzL2NhbGVuZGFyIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0RvY3VtZW50Um9vdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0RvY3VtZW50Um9vdC9taXhlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Eb2N1bWVudFJvb3QveE1MTlNQcmVmaXhNYXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vRG9jdW1lbnRSb290L3hTSVNjaGVtYUxvY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0RvY3VtZW50Um9vdC9wcm9qZWN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS9maWVsZElEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUvZmllbGROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUvYWxpYXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS9waG9uZXRpY0FsaWFzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUvcm9sbHVwVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL2NhbGN1bGF0aW9uVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL2Zvcm11bGEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS9yZXN0cmljdFZhbHVlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL3ZhbHVlbGlzdFNvcnRPcmRlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL2FwcGVuZE5ld1ZhbHVlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL2RlZmF1bHQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUvdmFsdWVMaXN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUyL3VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMi9maWVsZElEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUyL3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUyL3ZhbHVlSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTIvZHVyYXRpb25Gb3JtYXQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTMvdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUzL2ZpZWxkSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTMvdmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTMvdmFsdWVJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMy9kdXJhdGlvbkZvcm1hdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlNC91SUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTQvZmllbGRJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlNC92YWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlNC92YWx1ZUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGU0L2R1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlcy9leHRlbmRlZEF0dHJpYnV0ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9NYXNrIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9NYXNrL2xldmVsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vTWFzay90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vTWFzay9sZW5ndGgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9NYXNrL3NlcGFyYXRvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9NYXNrcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL01hc2tzL21hc2siLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL2ZpZWxkSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZS9maWVsZE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZS9hbGlhcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL3Bob25ldGljQWxpYXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUvdmFsdWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUvZW50ZXJwcmlzZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL2VudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUvcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUvbGVhZk9ubHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZS9hbGxMZXZlbHNSZXF1aXJlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL29ubHlUYWJsZVZhbHVlc0FsbG93ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUvbWFza3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZTIvdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUyL2ZpZWxkSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZTIvdmFsdWVJRCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZTMiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlMy91SUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZTMvZmllbGRJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlMy92YWx1ZUlEIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2Rlcy9vdXRsaW5lQ29kZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9QcmVkZWNlc3NvckxpbmsiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ByZWRlY2Vzc29yTGluay9wcmVkZWNlc3NvclVJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ByZWRlY2Vzc29yTGluay90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJlZGVjZXNzb3JMaW5rL2Nyb3NzUHJvamVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ByZWRlY2Vzc29yTGluay9jcm9zc1Byb2plY3ROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJlZGVjZXNzb3JMaW5rL2xpbmtMYWciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9QcmVkZWNlc3NvckxpbmsvbGFnRm9ybWF0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC90aXRsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvc3ViamVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvY2F0ZWdvcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2NvbXBhbnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L21hbmFnZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2F1dGhvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvY3JlYXRpb25EYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9yZXZpc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbGFzdFNhdmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9zY2hlZHVsZUZyb21TdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvc3RhcnREYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9maW5pc2hEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9mWVN0YXJ0RGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvY3JpdGljYWxTbGFja0xpbWl0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9jdXJyZW5jeURpZ2l0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvY3VycmVuY3lTeW1ib2wiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2N1cnJlbmN5U3ltYm9sUG9zaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2NhbGVuZGFyVUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9kZWZhdWx0U3RhcnRUaW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9kZWZhdWx0RmluaXNoVGltZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbWludXRlc1BlckRheSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbWludXRlc1BlcldlZWsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2RheXNQZXJNb250aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZGVmYXVsdFRhc2tUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9kZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZGVmYXVsdFN0YW5kYXJkUmF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZGVmYXVsdE92ZXJ0aW1lUmF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3dvcmtGb3JtYXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2VkaXRhYmxlQWN0dWFsQ29zdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2hvbm9yQ29uc3RyYWludHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2Vhcm5lZFZhbHVlTWV0aG9kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9pbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L211bHRpcGxlQ3JpdGljYWxQYXRocyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbmV3VGFza3NFZmZvcnREcml2ZW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L25ld1Rhc2tzRXN0aW1hdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9zcGxpdHNJblByb2dyZXNzVGFza3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3NwcmVhZEFjdHVhbENvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3NwcmVhZFBlcmNlbnRDb21wbGV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvdGFza1VwZGF0ZXNSZXNvdXJjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZmlzY2FsWWVhclN0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC93ZWVrU3RhcnREYXkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L21vdmVDb21wbGV0ZWRFbmRzQmFjayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2siLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L21vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9tb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2Jhc2VsaW5lRm9yRWFybmVkVmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvc3RhdHVzRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvY3VycmVudERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L21pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2F1dG9saW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9uZXdUYXNrU3RhcnREYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9kZWZhdWx0VGFza0VWTWV0aG9kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9wcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZXh0ZW5kZWRDcmVhdGlvbkRhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2FjdHVhbHNJblN5bmMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3JlbW92ZUZpbGVQcm9wZXJ0aWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9hZG1pblByb2plY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9vdXRsaW5lQ29kZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC93QlNNYXNrcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2V4dGVuZGVkQXR0cmlidXRlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2NhbGVuZGFycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3Rhc2tzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvcmVzb3VyY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvYXNzaWdubWVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vUmF0ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmF0ZS9yYXRlc0Zyb20iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SYXRlL3JhdGVzVG8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SYXRlL3JhdGVUYWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1JhdGUvc3RhbmRhcmRSYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmF0ZS9zdGFuZGFyZFJhdGVGb3JtYXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SYXRlL292ZXJ0aW1lUmF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1JhdGUvb3ZlcnRpbWVSYXRlRm9ybWF0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmF0ZS9jb3N0UGVyVXNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1JhdGVzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUmF0ZXMvcmF0ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvaUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2lzTnVsbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2luaXRpYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvcGhvbmV0aWNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvblRBY2NvdW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvbWF0ZXJpYWxMYWJlbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2NvZGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9ncm91cCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3dvcmtHcm91cCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2VtYWlsQWRkcmVzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2h5cGVybGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2h5cGVybGlua0FkZHJlc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9oeXBlcmxpbmtTdWJBZGRyZXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvbWF4VW5pdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9wZWFrVW5pdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9vdmVyQWxsb2NhdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYXZhaWxhYmxlRnJvbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2F2YWlsYWJsZVRvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvc3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9maW5pc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9jYW5MZXZlbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2FjY3J1ZUF0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvd29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3JlZ3VsYXJXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvb3ZlcnRpbWVXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYWN0dWFsV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3JlbWFpbmluZ1dvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9hY3R1YWxPdmVydGltZVdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9yZW1haW5pbmdPdmVydGltZVdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9wZXJjZW50V29ya0NvbXBsZXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvc3RhbmRhcmRSYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvc3RhbmRhcmRSYXRlRm9ybWF0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvY29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL292ZXJ0aW1lUmF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL292ZXJ0aW1lUmF0ZUZvcm1hdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL292ZXJ0aW1lQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2Nvc3RQZXJVc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9hY3R1YWxDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYWN0dWFsT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvcmVtYWluaW5nQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3JlbWFpbmluZ092ZXJ0aW1lQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3dvcmtWYXJpYW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2Nvc3RWYXJpYW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3NWIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvY1YiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9hQ1dQIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvY2FsZW5kYXJVSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9ub3RlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2JDV1MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9iQ1dQIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvaXNHZW5lcmljIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvaXNJbmFjdGl2ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2lzRW50ZXJwcmlzZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2Jvb2tpbmdUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYWN0dWFsV29ya1Byb3RlY3RlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2FjdGl2ZURpcmVjdG9yeUdVSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9jcmVhdGlvbkRhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvZXh0ZW5kZWRBdHRyaWJ1dGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYmFzZWxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvb3V0bGluZUNvZGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYXZhaWxhYmlsaXR5UGVyaW9kcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9yYXRlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS90aW1lcGhhc2VkRGF0YSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZXMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZXMvcmVzb3VyY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vVGFzayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay91SUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2lEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9pc051bGwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2NyZWF0ZURhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2NvbnRhY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3dCUyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svd0JTTGV2ZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL291dGxpbmVOdW1iZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL291dGxpbmVMZXZlbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcHJpb3JpdHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3N0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9maW5pc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2R1cmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9kdXJhdGlvbkZvcm1hdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svd29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svc3RvcCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcmVzdW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9yZXN1bWVWYWxpZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZWZmb3J0RHJpdmVuIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9yZWN1cnJpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL292ZXJBbGxvY2F0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2VzdGltYXRlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svbWlsZXN0b25lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9zdW1tYXJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9jcml0aWNhbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svaXNTdWJwcm9qZWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9pc1N1YnByb2plY3RSZWFkT25seSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svc3VicHJvamVjdE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2V4dGVybmFsVGFzayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZXh0ZXJuYWxUYXNrUHJvamVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZWFybHlTdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZWFybHlGaW5pc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2xhdGVTdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svbGF0ZUZpbmlzaCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svc3RhcnRWYXJpYW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZmluaXNoVmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3dvcmtWYXJpYW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZnJlZVNsYWNrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay90b3RhbFNsYWNrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9maXhlZENvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2ZpeGVkQ29zdEFjY3J1YWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3BlcmNlbnRDb21wbGV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcGVyY2VudFdvcmtDb21wbGV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svY29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svb3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9vdmVydGltZVdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2FjdHVhbFN0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9hY3R1YWxGaW5pc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2FjdHVhbER1cmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9hY3R1YWxDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9hY3R1YWxPdmVydGltZUNvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2FjdHVhbFdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2FjdHVhbE92ZXJ0aW1lV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcmVndWxhcldvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3JlbWFpbmluZ0R1cmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9yZW1haW5pbmdDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9yZW1haW5pbmdXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9yZW1haW5pbmdPdmVydGltZUNvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3JlbWFpbmluZ092ZXJ0aW1lV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYUNXUCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svY1YiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2NvbnN0cmFpbnRUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9jYWxlbmRhclVJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svY29uc3RyYWludERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2RlYWRsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9sZXZlbEFzc2lnbm1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9sZXZlbGluZ0NhblNwbGl0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9sZXZlbGluZ0RlbGF5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9sZXZlbGluZ0RlbGF5Rm9ybWF0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9wcmVMZXZlbGVkU3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3ByZUxldmVsZWRGaW5pc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2h5cGVybGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svaHlwZXJsaW5rQWRkcmVzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svaHlwZXJsaW5rU3ViQWRkcmVzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svaWdub3JlUmVzb3VyY2VDYWxlbmRhciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svbm90ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2hpZGVCYXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3JvbGx1cCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYkNXUyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYkNXUCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcGh5c2ljYWxQZXJjZW50Q29tcGxldGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2Vhcm5lZFZhbHVlTWV0aG9kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcHJlZGVjZXNzb3JMaW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9hY3R1YWxXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9hY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9leHRlbmRlZEF0dHJpYnV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2Jhc2VsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svb3V0bGluZUNvZGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay90aW1lcGhhc2VkRGF0YSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9UYXNrcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2tzL3Rhc2siLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vVGltZVBlcmlvZCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGltZVBlcmlvZC9mcm9tRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1RpbWVQZXJpb2QvdG9EYXRlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1RpbWVwaGFzZWREYXRhVHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGltZXBoYXNlZERhdGFUeXBlL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UaW1lcGhhc2VkRGF0YVR5cGUvdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGltZXBoYXNlZERhdGFUeXBlL3N0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGltZXBoYXNlZERhdGFUeXBlL2ZpbmlzaCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1RpbWVwaGFzZWREYXRhVHlwZS91bml0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGltZXBoYXNlZERhdGFUeXBlL3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1ZhbHVlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZS92YWx1ZUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVmFsdWUvcGFyZW50VmFsdWVJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ZhbHVlL3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVmFsdWUvZGVzY3JpcHRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vVmFsdWUyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZTIvaUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZTIvdmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZTIvZGVzY3JpcHRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vVmFsdWVMaXN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vVmFsdWVMaXN0L3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1ZhbHVlcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ZhbHVlcy9ncm91cCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZXMvdmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vV0JTTWFzayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vV0JTTWFzay9sZXZlbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dCU01hc2svdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dCU01hc2svbGVuZ3RoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vV0JTTWFzay9zZXBhcmF0b3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vV0JTTWFza3MiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dCU01hc2tzL3ZlcmlmeVVuaXF1ZUNvZGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vV0JTTWFza3MvZ2VuZXJhdGVDb2RlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dCU01hc2tzL3ByZWZpeCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9XQlNNYXNrcy93QlNNYXNrIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1dlZWtEYXkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dlZWtEYXkvZGF5VHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dlZWtEYXkvZGF5V29ya2luZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9XZWVrRGF5L3RpbWVQZXJpb2QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vV2Vla0RheS93b3JraW5nVGltZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vV2Vla0RheXMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9XZWVrRGF5cy93ZWVrRGF5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1dvcmtpbmdUaW1lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Xb3JraW5nVGltZS9mcm9tVGltZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dvcmtpbmdUaW1lL3RvVGltZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9Xb3JraW5nVGltZXMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Xb3JraW5nVGltZXMvd29ya2luZ1RpbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9tb2RlbC9tc3Byb2plY3QuZWNvcmUgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L21vZGVsL21zcHJvamVjdC5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFlYmQyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L21vZGVsL21zcHJvamVjdC5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDU1MTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0ibXNwcm9qZWN0IgotICAgIG5zVVJJPSJodHRwOi8vZXBmLmVjbGlwc2Uub3JnL21zcHJvamVjdCIgbnNQcmVmaXg9Im1zcHJvamVjdCI+Ci0gIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZnVsbCBwcm9qZWN0IHNjaGVtYSBkZWZpbml0aW9uIGZyb20gdGhlIHByb2plY3QgbGV2ZWwgZG93biwgJiN4RDsmI3hBOyYjeDk7JiN4OTtzdGFydGluZyB3aXRoIGRhdGEgdHlwZSBkZWZpbml0aW9ucy4iLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQW5ub3RhdGlvbnM+Ci0gICAgPGRldGFpbHMga2V5PSJhcHBpbmZvIiB2YWx1ZT0iVGhlIE1pY3Jvc29mdCBQcm9qZWN0IERhdGEgSW50ZXJjaGFuZ2UgU2NoZW1hIGZvciBNaWNyb3NvZnQgUHJvamVjdCAxMC4mI3hEOyYjeEE7JiN4OTsmI3g5OyIvPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJBY2NydWVBdCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjY3J1ZUF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdGl2ZURpcmVjdG9yeUdVSURfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSIxNiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJBbGlhc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFsaWFzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXNzaWdubWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBc3NpZ25tZW50Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFza1VJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNvdXJjZVVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNvdXJjZVVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBlcmNlbnRXb3JrQ29tcGxldGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygd29yayBjb21wbGV0ZWQgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGVyY2VudFdvcmtDb21wbGV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbENvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgY29zdCBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsRmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBmaW5pc2ggZGF0ZSBvZiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZUNvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgb3ZlcnRpbWUgY29zdCBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZVdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGFtb3VudCBvZiBvdmVydGltZSB3b3JrIGluY3VycmVkIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBzdGFydCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgYW1vdW50IG9mIHdvcmsgaW5jdXJyZWQgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIGFzc2lnbm1lbnQgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29uZmlybWVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBSZXNvdXJjZSBoYXMgYWNjZXB0ZWQgYWxsIG9mIGhpcyBvciBoZXIgYXNzaWdubWVudHMuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29uZmlybWVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByb2plY3RlZCBvciBzY2hlZHVsZWQgY29zdCBvZiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdFJhdGVUYWJsZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0Nvc3RSYXRlVGFibGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvc3QgcmF0ZSB0YWJsZSB1c2VkIGZvciB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0UmF0ZVRhYmxlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY29zdCBhbmQgYmFzZWxpbmUgY29zdCBmb3IgYSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0VmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjViIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVhcm5lZCB2YWx1ZSBjb3N0IHZhcmlhbmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNWIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVsYXkiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgdGhhdCB0aGUgYXNzaWdubWVudCBpcyBkZWxheWVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlbGF5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2hWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhcmlhbmNlIG9mIHRoZSBhc3NpZ25tZW50IGZpbmlzaCBkYXRlIGZyb20gdGhlIGJhc2VsaW5lIGZpbmlzaCBkYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaFZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aXRsZSBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rQWRkcmVzc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtBZGRyZXNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rU3ViQWRkcmVzcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua1N1YkFkZHJlc3NUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkb2N1bWVudCBib29rbWFyayBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya1ZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhcmlhbmNlIG9mIGFzc2lnbm1lbnQgd29yayBmcm9tIHRoZSBiYXNlbGluZSB3b3JrIGFzIG1pbnV0ZXMgeCAxMDAwLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhhc0ZpeGVkUmF0ZVVuaXRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBVbml0cyBhcmUgRml4ZWQgUmF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIYXNGaXhlZFJhdGVVbml0cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpeGVkTWF0ZXJpYWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIGNvbnN1bXB0aW9uIG9mIHRoZSBhc3NpZ25lZCBtYXRlcmlhbCByZXNvdXJjZSBvY2N1cnMgaW4gYSBzaW5nbGUsIGZpeGVkIGFtb3VudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaXhlZE1hdGVyaWFsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxpbmdEZWxheSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlbGF5IGNhdXNlZCBieSBsZXZlbGluZy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0RlbGF5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxpbmdEZWxheUZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0xldmVsaW5nRGVsYXlGb3JtYXRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgZHVyYXRpb24gb2YgdGhlIGRlbGF5LiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgMjE9bnVsbCwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxpbmdEZWxheUZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxpbmtlZEZpZWxkcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgUHJvamVjdCBpcyBsaW5rZWQgdG8gYW5vdGhlciBPTEUgb2JqZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxpbmtlZEZpZWxkcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbGVzdG9uZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgYXNzaWdubWVudCBpcyBhIG1pbGVzdG9uZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNaWxlc3RvbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub3RlcyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUZXh0IG5vdGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOb3RlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJhbGxvY2F0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIGFzc2lnbm1lbnQgaXMgb3ZlcmFsbG9jYXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVyYWxsb2NhdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3VtIG9mIHRoZSBhY3R1YWwgYW5kIHJlbWFpbmluZyBvdmVydGltZSBjb3N0IG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgZm9yIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZ3VsYXJXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBub24tb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgZm9yIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlZ3VsYXJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgY29zdCBvZiBjb21wbGV0aW5nIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ0Nvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdPdmVydGltZUNvc3QiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgcHJvamVjdGVkIG92ZXJ0aW1lIGNvc3Qgb2YgY29tcGxldGluZyB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdPdmVydGltZVdvcmsiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIG92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIHRvIGNvbXBsZXRlIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ092ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ1dvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHdvcmsgc2NoZWR1bGVkIHRvIGNvbXBsZXRlIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ1dvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNwb25zZVBlbmRpbmciIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRydWUgaWYgYSByZXNwb25zZSBoYXMgbm90IGJlZW4gcmVjZWl2ZWQgZm9yIGEgVGVhbUFzc2lnbiBtZXNzYWdlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNwb25zZVBlbmRpbmciLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0b3AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSBhc3NpZ25tZW50IHdhcyBzdG9wcGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0b3AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXN1bWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSBhc3NpZ25tZW50IHJlc3VtZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzdW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnRWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhcmlhbmNlIG9mIHRoZSBhc3NpZ25tZW50IHN0YXJ0IGRhdGUgZnJvbSB0aGUgYmFzZWxpbmUgc3RhcnQgZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydFZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idW5pdHMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIHVuaXRzIGZvciB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVbml0cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVwZGF0ZU5lZWRlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVHJ1ZSBpZiB0aGUgcmVzb3VyY2UgYXNzaWduZWQgdG8gYSB0YXNrIG5lZWRzIHRvIGJlIHVwZGF0ZWQgYXMgdG8gdGhlIHN0YXR1cyBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVcGRhdGVOZWVkZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2QUMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGJhc2xpbmUgY29zdCBhbmQgdG90YWwgY29zdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWQUMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBzY2hlZHVsZWQgd29yayBmb3IgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtDb250b3VyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vV29ya0NvbnRvdXJUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdvcmsgY29udG91ciBvZiB0aGUgYXNzaWdubWVudC4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPUZsYXQsIDE9QmFjayBMb2FkZWQsIDI9RnJvbnQgTG9hZGVkLCAzPURvdWJsZSBQZWFrLCA0PUVhcmx5IFBlYWssIDU9TGF0ZSBQZWFrLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY9QmVsbCwgNz1UdXJ0bGUsIDg9Q29udG91cmVkJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya0NvbnRvdXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBvbiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSBhc3NpZ25tZW50IHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJvb2tpbmdUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQm9va2luZ1R5cGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBib29raW5nIHR5cGUgb2YgdGhlIGFzc2lnbm1lbnQuIDE9Q29tbWl0ZWQsIDI9UHJvcG9zZWQmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCb29raW5nVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFdvcmtQcm90ZWN0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIHRocm91Z2ggd2hpY2ggYWN0dWFsIHdvcmsgaXMgcHJvdGVjdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIHRocm91Z2ggd2hpY2ggYWN0dWFsIG92ZXJ0aW1lIHdvcmsgaXMgcHJvdGVjdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyZWF0aW9uRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgd2FzIGNyZWF0ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyZWF0aW9uRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVuZGVkQXR0cmlidXRlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0V4dGVuZGVkQXR0cmlidXRlNCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIGJhY2sgdG8gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSB0YWJsZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSB1bmlxdWUgSUQgb3IgdGhlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQgSUQsIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlbGluZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9CYXNlbGluZTMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiBiYXNlbGluZSB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGltZXBoYXNlZERhdGEiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpbWUgcGhhc2VkIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVwaGFzZWREYXRhIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXNzaWdubWVudHMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXNzaWdubWVudHNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3NpZ25tZW50IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Fzc2lnbm1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBhc3NpZ25tZW50IGluIGVhY2ggQXNzaWdubWVudHMgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBc3NpZ25tZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQXV0aG9yVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXV0aG9yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkF2YWlsYWJpbGl0eVBlcmlvZCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFiaWxpdHlQZXJpb2RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdmFpbGFibGVGcm9tIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgcmVzb3VyY2UgYmVjb21lcyBhdmFpbGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgcGVyaW9kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFibGVGcm9tIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXZhaWxhYmxlVG8iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGFzdCBkYXRlIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBwZXJpb2QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJsZVRvIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXZhaWxhYmxlVW5pdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGVyY2VudGFnZSB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUgZHVyaW5nIHRoZSBzcGVjaWZpZWQgcGVyaW9kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFibGVVbml0cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkF2YWlsYWJpbGl0eVBlcmlvZHMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmlsaXR5UGVyaW9kc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImF2YWlsYWJpbGl0eVBlcmlvZCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9BdmFpbGFiaWxpdHlQZXJpb2QiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGVyaW9kIHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJpbGl0eVBlcmlvZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJhc2VsaW5lIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGltZXBoYXNlZERhdGEiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpbWUgcGhhc2VkIGRhdGEgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrIGJhc2VsaW5lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im51bWJlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBudW1iZXIgb2YgdGhlIGJhc2VsaW5lIGRhdGEgcmVjb3JkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOdW1iZXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbnRlcmltIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGlzIGlzIGFuIEludGVyaW0gQmFzZWxpbmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkludGVyaW0iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzayB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzayB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR1cmF0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBkdXJhdGlvbiBvZiB0aGUgdGFzayB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb25Gb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EdXJhdGlvbkZvcm1hdFR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgRHVyYXRpb24gb2YgdGhlIFRhc2sgYmFzZWxpbmUuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRlZER1cmF0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBiYXNlbGluZSBkdXJhdGlvbiBvZiB0aGUgdGFzayB3YXMgZXN0aW1hdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFc3RpbWF0ZWREdXJhdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmsiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIHdvcmsgb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByb2plY3RlZCBjb3N0IG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIHRhc2sgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJhc2VsaW5lMiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJudW1iZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgbnVtYmVyIG9mIHRoZSBiYXNlbGluZSBkYXRhIHJlY29yZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTnVtYmVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29yayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3b3JrIGFzc2lnbmVkIHRoZSByZXNvdXJjZSB3aGVuIHRoZSBiYXNlbGluZSBpcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3QiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdGVkIGNvc3QgZm9yIHRoZSByZXNvdXJjZSB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldCBjb3N0IG9mIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygb2YgdGhlIHdvcmsgcGVyZm9ybWVkIGJ5IHRoZSByZXNvdXJjZSBmb3IgdGhlIHByb2plY3QgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJhc2VsaW5lMyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZV8uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lcGhhc2VkRGF0YSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSBwaGFzZWQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIEJhc2VsaW5lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVwaGFzZWREYXRhIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibnVtYmVyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgbnVtYmVyIG9mIHRoZSBiYXNlbGluZSBkYXRhIHJlY29yZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOdW1iZXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIHN0YXJ0IGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmsiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdG90YWwgYW1vdW50IG9mIHdvcmsgc2NoZWR1bGVkIG9uIHRoZSBhc3NpZ25tZW50IHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdG90YWwgcHJvamVjdGVkIGNvc3Qgb2YgdGhlIGFzc2lnbm1lbnQgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBvbiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSBhc3NpZ25tZW50IHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCA1IDYgNyA4IDkgMTAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQm9va2luZ1R5cGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQm9va2luZ1R5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQm9va2luZ1R5cGVUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJvb2tpbmdUeXBlXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDYWxjdWxhdGlvblR5cGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsY3VsYXRpb25UeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2FsZW5kYXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsZW5kYXJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY2FsZW5kYXIuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9OYW1lVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSBjYWxlbmRhci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzQmFzZUNhbGVuZGFyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBjYWxlbmRhciBpcyBhIGJhc2UgY2FsZW5kYXIuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzQmFzZUNhbGVuZGFyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmFzZUNhbGVuZGFyVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGJhc2UgY2FsZW5kYXIgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gd2hpY2ggdGhpcyBjYWxlbmRhciBkZXBlbmRzLiBPbmx5IGFwcGxpY2FibGUgaWYgdGhlIGNhbGVuZGFyIGlzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBhIGJhc2UgY2FsZW5kYXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VDYWxlbmRhclVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndlZWtEYXlzIiBlVHlwZT0iIy8vV2Vla0RheXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiBXZWVrZGF5cyB0aGF0IGRlZmluZXMgdGhpcyBjYWxlbmRhci4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2Vla0RheXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDYWxlbmRhcnMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsZW5kYXJzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2FsZW5kYXIiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2FsZW5kYXIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDYWxlbmRhcnMgYXJlIHVzZWQgdG8gZGVmaW5lIHN0YW5kYXJkIHdvcmtpbmcgYW5kICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIG5vbi13b3JraW5nIHRpbWVzLiBQcm9qZWN0cyBtdXN0IGhhdmUgb25lIGJhc2UgY2FsZW5kYXIuIFRhc2tzIGFuZCByZXNvdXJjZXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgbWF5IGhhdmUgdGhlaXIgb3duIG5vbi1iYXNlIGNhbGVuZGFycyB3aGljaCBhcmUgYmFzZWQgb24gYSBiYXNlIGNhbGVuZGFyLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNhdGVnb3J5VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2F0ZWdvcnlfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ29kZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvZGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ29tcGFueVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbXBhbnlfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ29uc3RyYWludFR5cGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29uc3RyYWludFR5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQgNSA2IDciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ29udGFjdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnRhY3RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ29zdFJhdGVUYWJsZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0UmF0ZVRhYmxlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3VycmVuY3lTeW1ib2xQb3NpdGlvbl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ3VycmVuY3lTeW1ib2xUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDdXJyZW5jeVN5bWJvbF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRheVR5cGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGF5VHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCA1IDYgNyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRlZmF1bHRUYXNrRVZNZXRob2RUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdFRhc2tFVk1ldGhvZF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEZWZhdWx0VGFza1R5cGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdFRhc2tUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRG9jdW1lbnRSb290Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0ibWl4ZWQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWl4ZWQiIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50V2lsZGNhcmQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iOm1peGVkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InhNTE5TUHJlZml4TWFwIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InhtbG5zOnByZWZpeCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ4U0lTY2hlbWFMb2NhdGlvbiIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmdUb1N0cmluZ01hcEVudHJ5IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ4c2k6c2NoZW1hTG9jYXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvamVjdCIgdXBwZXJCb3VuZD0iLTIiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9qZWN0IiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByb2plY3QgaXMgdGhlIHRvcCBsZXZlbCBlbGVtZW50IG9mIHRoZSBkb2N1bWVudC4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2plY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRHVyYXRpb25Gb3JtYXRUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Xy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRHVyYXRpb25Gb3JtYXRUeXBlMiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Xy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRHVyYXRpb25Gb3JtYXRUeXBlMyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Xy5fM18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRHVyYXRpb25Gb3JtYXRUeXBlNCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Xy5fNF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRHVyYXRpb25Gb3JtYXRUeXBlNSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Xy5fNV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRWFybmVkVmFsdWVNZXRob2RUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWFybmVkVmFsdWVNZXRob2RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRWFybmVkVmFsdWVNZXRob2RUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVhcm5lZFZhbHVlTWV0aG9kXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJFbWFpbEFkZHJlc3NUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFbWFpbEFkZHJlc3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXh0ZW5kZWRBdHRyaWJ1dGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZElEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIFBJRCBvZiB0aGUgY3VzdG9tIGZpZWxkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZElEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGROYW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSBjdXN0b20gZmllbGQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkTmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsaWFzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vQWxpYXNUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFsaWFzIG9mIHRoZSBjdXN0b20gZmllbGQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWxpYXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwaG9uZXRpY0FsaWFzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vUGhvbmV0aWNBbGlhc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGhvbmV0aWMgcHJvbnVuY2lhdGlvbiBvZiB0aGUgYWxpYXMgb2YgdGhlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbSBmaWVsZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaG9uZXRpY0FsaWFzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm9sbHVwVHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1JvbGx1cFR5cGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSG93IHJvbGx1cHMgYXJlIGNhbGN1bGF0ZWQuIFZhbHVlcyBhcmU6IDA9TWF4aW11bSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1IgZm9yIGZsYWcgZmllbGRzKSwgMT1NaW5pbXVtIChBTkQgZm9yIGZsYWcgZmllbGRzKSwgMj1Db3VudCBhbGwsIDM9U3VtLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0PUF2ZXJhZ2UsIDU9QXZlcmFnZSBGaXJzdCBTdWJsZXZlbCwgNj1Db3VudCBGaXJzdCBTdWJsZXZlbCwgNz1Db3VudCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25zdW1tYXJpZXMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUm9sbHVwVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhbGN1bGF0aW9uVHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0NhbGN1bGF0aW9uVHlwZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHJvbGx1cHMgYXJlIGNhbGN1bGF0ZWQgZm9yIHRhc2sgYW5kIGdyb3VwIHN1bW1hcnkgcm93cy4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1Ob25lLCAxPVJvbGx1cCwgMj1DYWxjdWxhdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxjdWxhdGlvblR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmb3JtdWxhIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtdWxhIHRoYXQgTWljcm9zb2Z0IFByb2plY3QgdXNlcyB0byBwb3B1bGF0ZSB0aGUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tIHRhc2sgZmllbGQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZvcm11bGEiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXN0cmljdFZhbHVlcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgUmVzdHJpY3RWYWx1ZXM9VHJ1ZSB0aGVuIG9ubHkgdmFsdWVzIGluIHRoZSBsaXN0IGFyZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkIGluIHRoZSBmaWxlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3RyaWN0VmFsdWVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVsaXN0U29ydE9yZGVyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vVmFsdWVsaXN0U29ydE9yZGVyVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkhvdyB2YWx1ZSBsaXN0cyBhcmUgc29ydGVkLiBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPURlc2NlbmRpbmcsIDE9QXNjZW5kaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlbGlzdFNvcnRPcmRlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFwcGVuZE5ld1ZhbHVlcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgQXBwZW5kTmV3VmFsdWVzPVRydWUgdGhlbiBhbnkgbmV3IHZhbHVlcyBhZGRlZCBpbiBhIHByb2plY3QgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQgdG8gdGhlIGxpc3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFwcGVuZE5ld1ZhbHVlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBwb2ludHMgdG8gdGhlIGRlZmF1bHQgdmFsdWUgaW4gdGhlIGxpc3QuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCBwcmVzZW50IGlmIG5vIGRlZmF1bHQgaXMgc2V0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsdWVMaXN0IiBlVHlwZT0iIy8vVmFsdWVMaXN0IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hlbiB2YWx1ZXMgb2YgZXh0ZW5kZWQgYXR0cmlidXRlcyBhcmUgc3BlY2lmaWVkIGFzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgb2YgZWxlbWVudHMgaW4gdGhlIHNjaGVtYSwgdGhleSBtYXkgZWl0aGVyIGJlIHNwZWNpZmllZCBieSB2YWx1ZXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYnkgcmVmZXJlbmNlcyB0byB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGlzIGxpc3QuICBBcHBsaWNhdGlvbnMgbWF5ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc3VtZSBvcmRlcmluZyBvZiB0aGUgbGlzdCBieSBvcmRlcmluZyBzcGVjaWZpZWQgaGVyZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVMaXN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXh0ZW5kZWRBdHRyaWJ1dGUyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZElEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBQSUQgb2YgdGhlIGN1c3RvbSBmaWVsZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dCBsb29rdXAgdGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBidWxrIGR1cmF0aW9uLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTk9JSwgMjA9ZSUsIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlbmRlZEF0dHJpYnV0ZTMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGVfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIFBJRCBvZiB0aGUgY3VzdG9tIGZpZWxkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZElEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0IGxvb2t1cCB0YWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR1cmF0aW9uRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRHVyYXRpb25Gb3JtYXRUeXBlMyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGJ1bGsgZHVyYXRpb24uICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMD1lJSwgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4dGVuZGVkQXR0cmlidXRlNCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZV8uXzNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZElEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaWVsZCBJRCBpbiB0aGUgbG9jYWxpc2VkIGxhbmd1YWdlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dCBsb29rdXAgdGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR1cmF0aW9uRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRHVyYXRpb25Gb3JtYXRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgMjA9ZSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlbmRlZEF0dHJpYnV0ZXMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGVzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZW5kZWRBdHRyaWJ1dGUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRXh0ZW5kZWRBdHRyaWJ1dGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFYWNoIG9mIHRoZSBpbmRpdmlkdWFsIGVudHJpZXMgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZXMgZGVmaW5pdGlvbiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLiAgVGhlcmUgYXJlIG5vIGxpbWl0cyB0byB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHRoYXQgbWF5IGFwcGVhciwgYnV0IHByb2plY3QgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgd2lsbCBvbmx5IHVuZGVyc3RhbmQgRmxhZzEtRmxhZzEwLCBldGMuICBUaGlzIG11c3QgYXBwZWFyIG9uY2UgaW4gZWFjaCBFeHRlbmRlZEF0dHJpYnV0ZXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZXJuYWxUYXNrUHJvamVjdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJGaXhlZENvc3RBY2NydWFsVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRml4ZWRDb3N0QWNjcnVhbF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRllTdGFydERhdGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRllTdGFydERhdGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJHcm91cFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikdyb3VwXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua0FkZHJlc3NUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtBZGRyZXNzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua0FkZHJlc3NUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rQWRkcmVzc18uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rQWRkcmVzc1R5cGUyIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtBZGRyZXNzXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rU3ViQWRkcmVzc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua1N1YkFkZHJlc3NfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua1N1YkFkZHJlc3NUeXBlMiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rU3ViQWRkcmVzc18uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua1R5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua1R5cGUyIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkluaXRpYWxzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW5pdGlhbHNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTGFnRm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxhZ0Zvcm1hdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0RlbGF5Rm9ybWF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0RlbGF5Rm9ybWF0Xy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTWFuYWdlclR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hbmFnZXJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWFzayI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXNrXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWwiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsZXZlbCBvZiB0aGUgbWFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVHlwZVR5cGU1Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2YgbWFzay4gVmFsdWVzIGFyZTogMD1OdW1iZXJzLCAxPVVwcGVyIENhc2UgTGV0dGVycywgMj1Mb3dlciBDYXNlIExldHRlcnMsIDM9Q2hhcmFjdGVycyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGVuZ3RoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWF4aW11bSBsZW5ndGggaW4gY2hhcmFjdGVycyBvZiB0aGUgb3V0bGluZSBjb2RlIHZhbHVlcy4gIElmIGxlbmd0aCBpcyBhbnksIHRoZSB2YWx1ZSBpcyB6ZXJvLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZW5ndGgiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZXBhcmF0b3IiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlcGFyYXRvciB2YWx1ZSBvZiB0aGUgY29kZSB2YWx1ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNlcGFyYXRvciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1hc2tzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hc2tzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFzayIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NYXNrIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvdXIgZWxlbWVudHMgb2YgdGhlIG1hc2sgY29uc3RpdHV0ZSB0aGUgZm9ybWF0IGluIHdoaWNoIHRoZSBvdXRsaW5lIGNvZGUgbXVzdCBhcHBlYXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hc2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJNYXRlcmlhbExhYmVsVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWF0ZXJpYWxMYWJlbF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJOYW1lVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJOYW1lVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5hbWVUeXBlMiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZV8uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTmFtZVR5cGUzIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lXy5fM18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjI1NSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJOZXdUYXNrU3RhcnREYXRlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5ld1Rhc2tTdGFydERhdGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTlRBY2NvdW50VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTlRBY2NvdW50Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGxpbmVDb2RlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb3Jlc3BvbmRzIHRvIHRoZSBmaWVsZCBudW1iZXIgb2Ygb3V0bGluZSBjb2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZElEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGROYW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZE5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbGlhcyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWxpYXMgb2YgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFsaWFzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGhvbmV0aWNBbGlhcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGhvbmV0aWMgcHJvbnVuY2lhdGlvbiBvZiB0aGUgYWxpYXMgb2YgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBob25ldGljQWxpYXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YWx1ZXMiIGVUeXBlPSIjLy9WYWx1ZXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWVzIG9mIHRoZSB0YWJsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVudGVycHJpc2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkluZGljYXRlcyB3aGV0aGVyIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlIGlzIGFuIGVudGVycHJpc2UgY3VzdG9tIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRW50ZXJwcmlzZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHJlZmVyZW5jZSB0byBhbm90aGVyIGN1c3RvbSBmaWVsZCBmb3Igd2hpY2ggdGhpcyBpcyBhbiBhbGlhcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUgY2FuIGJlIHVzZWQgYnkgdGhlIFJlc291cmNlIFN1YnN0aXR1dGlvbiBXaXphcmQgaW4gTWljcm9zb2Z0IFByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxlYWZPbmx5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIG9yIG5vdCB2YWx1ZXMgc3BlY2lmaWVkIGluIHRoaXMgb3V0bGluZSBjb2RlIGZpZWxkIG11c3QgYmUgbGVhZiB2YWx1ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxlYWZPbmx5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWxsTGV2ZWxzUmVxdWlyZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik5ldyBjb2RlcyBtdXN0IGhhdmUgYWxsIGxldmVscyBwcmVzZW50LiAgTm90IGF2YWlsYWJsZSBmb3IgRW50ZXJwcmlzZSBDb2Rlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWxsTGV2ZWxzUmVxdWlyZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvbmx5VGFibGVWYWx1ZXNBbGxvd2VkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHZhbHVlcyBzcGVjaWZpZWQgbXVzdCBjb21lIGZyb20gdmFsdWVzIHRhYmxlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPbmx5VGFibGVWYWx1ZXNBbGxvd2VkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFza3MiIGVUeXBlPSIjLy9NYXNrcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0YWJsZSBvZiBlbnRyaWVzIHRoYXQgZGVmaW5lIHRoZSBvdXRsaW5lIGNvZGUgbWFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFza3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRsaW5lQ29kZTIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgb3V0bGluZSBjb2RlIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpZWxkIElEIGluIHRoZSBsb2NhbGlzZWQgbGFuZ3VhZ2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIGluIHRoZSB2YWx1ZSBsaXN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBpbiB0aGUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZSBjb2RlIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRsaW5lQ29kZTMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGVfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgb3V0bGluZSBjb2RlIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpZWxkIElEIGluIHRoZSBsb2NhbGlzZWQgbGFuZ3VhZ2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIGluIHRoZSB2YWx1ZSBsaXN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgb3V0bGluZSBjb2RlIGNvbGxlY3Rpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRsaW5lQ29kZXMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGVzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0bGluZUNvZGUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vT3V0bGluZUNvZGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaW5kaXZpZHVhbCBvdXRsaW5lIGNvZGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik91dGxpbmVOdW1iZXJUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lTnVtYmVyXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVJhdGVGb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyA0IDUgNyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJPdmVydGltZVJhdGVGb3JtYXRUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lUmF0ZUZvcm1hdF8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyA0IDUgNyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJQaG9uZXRpY0FsaWFzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGhvbmV0aWNBbGlhc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlBob25ldGljc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBob25ldGljc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcmVkZWNlc3NvckxpbmsiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlZGVjZXNzb3JMaW5rXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlZGVjZXNzb3JVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcHJlZGVjZXNzb3IgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlZGVjZXNzb3JVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVHlwZVR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxpbmsgdHlwZS4gIFZhbHVlcyBhcmUgMD1GRiwgMT1GUywgMj1TRiBhbmQgMz1TUyYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3Jvc3NQcm9qZWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBwcmVkZWNlc3NvciBpcyBwYXJ0IG9mIGFub3RoZXIgcHJvamVjdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3Jvc3NQcm9qZWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3Jvc3NQcm9qZWN0TmFtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZXh0ZXJuYWwgcHJlZGVjZXNzb3IgcHJvamVjdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3Jvc3NQcm9qZWN0TmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxpbmtMYWciIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgbGFnIGluIHRlbnRocyBvZiBhIG1pbnV0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGlua0xhZyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxhZ0Zvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0xhZ0Zvcm1hdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBsYWcgZm9ybWF0LiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA9ZSUsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGFnRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUHJlZml4VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlZml4Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9qZWN0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVUlEVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9OYW1lVHlwZTMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRpdGxlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVGl0bGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpdGxlIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaXRsZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1YmplY3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdWJqZWN0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdWJqZWN0IG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJqZWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2F0ZWdvcnkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9DYXRlZ29yeVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY2F0ZWdvcnkgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhdGVnb3J5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29tcGFueSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbXBhbnlUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbXBhbnkgdGhhdCBvd25zIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb21wYW55Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFuYWdlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL01hbmFnZXJUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1hbmFnZXIgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hbmFnZXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRob3IiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9BdXRob3JUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGF1dGhvciBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXV0aG9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JlYXRpb25EYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgcHJvamVjdCB3YXMgY3JlYXRlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3JlYXRpb25EYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmV2aXNpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBudW1iZXIgb2YgdGltZXMgYSBwcm9qZWN0IGhhcyBiZWVuIHNhdmVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXZpc2lvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imxhc3RTYXZlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHByb2plY3Qgd2FzIGxhc3Qgc2F2ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikxhc3RTYXZlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjaGVkdWxlRnJvbVN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBwcm9qZWN0IGlzIHNjaGR1bGVkIGZyb20gdGhlIHN0YXJ0IGRhdGUgb3IgZmluaXNoIGRhdGUuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTY2hlZHVsZUZyb21TdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0RGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdGFydCBkYXRlIG9mIHRoZSBwcm9qZWN0LiBSZXF1aXJlZCBpZiBTY2hlZHVsZUZyb21TdGFydCBpcyB0cnVlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnREYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaW5pc2ggZGF0ZSBvZiB0aGUgcHJvamVjdC4gUmVxdWlyZWQgaWYgU2NoZWR1bGVGcm9tU3RhcnQgaXMgZmFsc2UuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2hEYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZllTdGFydERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9GWVN0YXJ0RGF0ZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJGaXNjYWwgWWVhciBzdGFydGluZyBtb250aC4gVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzE9SmFudWFyeSwgMj1GZWJydWFyeSwgMz1NYXJjaCwgND1BcHJpbCwgNT1NYXksIDY9SnVuZSwgNz1KdWx5LCAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7OD1BdWd1c3QsIDk9U2VwdGVtYmVyLCAxMD1PY3RvYmVyLCAxMT1Ob3ZlbWJlciwgMTI9RGVjZW1iZXIgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZZU3RhcnREYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JpdGljYWxTbGFja0xpbWl0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIGRheXMgcGFzdCBpdHMgZW5kIGRhdGUgdGhhdCBhIHRhc2sgY2FuIGdvICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtiZWZvcmUgTWljcm9zb2Z0IFByb2plY3QgbWFya3MgdGhhdCB0YXNrIGFzIGEgY3JpdGljYWwgdGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3JpdGljYWxTbGFja0xpbWl0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3VycmVuY3lEaWdpdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHN5bWJvbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3VycmVuY3lEaWdpdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjdXJyZW5jeVN5bWJvbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0N1cnJlbmN5U3ltYm9sVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjdXJyZW5jeSBzeW1ib2wgdXNlZCBpbiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3VycmVuY3lTeW1ib2wiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjdXJyZW5jeVN5bWJvbFBvc2l0aW9uIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbmN5IHN5bWJvbC4gIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPUJlZm9yZSwgMT1BZnRlciwgMj1CZWZvcmUgV2l0aCBTcGFjZSwgMz1BZnRlciB3aXRoIHNwYWNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDdXJyZW5jeVN5bWJvbFBvc2l0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FsZW5kYXJVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcm9qZWN0IGNhbGVuZGFyLiAgUmVmZXJzIHRvIGEgdmFsaWQgVUlEIGluIHRoZSAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Q2FsZW5kYXJzIGVsZW1lbnQgb2YgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBTY2hlbWEuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFyVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdFN0YXJ0VGltZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9UaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgc3RhcnQgdGltZSBvZiBuZXcgdGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRTdGFydFRpbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0RmluaXNoVGltZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9UaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgZmluaXNoIHRpbWUgb2YgbmV3IHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0RmluaXNoVGltZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbnV0ZXNQZXJEYXkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBudW1iZXIgb2YgbWludXRlcyBwZXIgZGF5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNaW51dGVzUGVyRGF5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWludXRlc1BlcldlZWsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBudW1iZXIgb2YgbWludXRlcyBwZXIgd2Vlay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWludXRlc1BlcldlZWsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkYXlzUGVyTW9udGgiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBudW1iZXIgb2YgZGF5cyBwZXIgbW9udGguIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRheXNQZXJNb250aCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRUYXNrVHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0RlZmF1bHRUYXNrVHlwZVR5cGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjEiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCB0eXBlIG9mIG5ldyB0YXNrcy4gVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9Rml4ZWQgVW5pdHMsIDE9Rml4ZWQgRHVyYXRpb24sIDI9Rml4ZWQgV29yay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdFRhc2tUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9EZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBmcm9tIHdoZXJlIGZpeGVkIGNvc3RzIGFyZSBhY2NydWVkLiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzE9U3RhcnQsIDI9UHJvcmF0ZWQsIDM9RW5kIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRGaXhlZENvc3RBY2NydWFsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdFN0YW5kYXJkUmF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHN0YW5kYXJkIHJhdGUgZm9yIG5ldyByZXNvdXJjZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRTdGFuZGFyZFJhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0T3ZlcnRpbWVSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgb3ZlcnRpbWUgcmF0ZSBmb3IgbmV3IHJlc291cmNlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdE92ZXJ0aW1lUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR1cmF0aW9uRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRHVyYXRpb25Gb3JtYXRUeXBlNSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGJ1bGsgZHVyYXRpb24uICBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Mz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgMjA9ZSUsIDIxPW51bGwsICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTszNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTs1Mz1udWxsLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrRm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHdvcmsgdW5pdCBmb3JtYXQuIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsxPW0sIDI9aCwgMz1kLCA0PXcsIDU9bW8iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya0Zvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVkaXRhYmxlQWN0dWFsQ29zdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIG9yIG5vdCBhY3R1YWwgY29zdHMgYXJlIGVkaXRhYmxlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFZGl0YWJsZUFjdHVhbENvc3RzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaG9ub3JDb25zdHJhaW50cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0YXNrcyBob25vdXIgdGhlaXIgY29uc3RyYWludCBkYXRlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSG9ub3JDb25zdHJhaW50cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVhcm5lZFZhbHVlTWV0aG9kIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRWFybmVkVmFsdWVNZXRob2RUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IG1ldGhvZCBmb3IgY2FsY3VsYXRpbmcgZWFybmVkIHZhbHVlLiBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MD1QZXJjZW50IENvbXBsZXRlLCAxPVBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWFybmVkVmFsdWVNZXRob2QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdG8gY2FsY3VsYXRlIHN1YnRhc2tzIGFzIHN1bW1hcnkgdGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im11bHRpcGxlQ3JpdGljYWxQYXRocyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgbXVsdGlwbGUgY3JpdGljYWwgcGF0aHMgYXJlIGNhbGN1bGF0ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik11bHRpcGxlQ3JpdGljYWxQYXRocyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5ld1Rhc2tzRWZmb3J0RHJpdmVuIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIG5ldyB0YXNrcyBhcmUgZWZmb3J0IGRyaXZlbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmV3VGFza3NFZmZvcnREcml2ZW4iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuZXdUYXNrc0VzdGltYXRlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0byBzaG93IHRoZSBlc3RpbWF0ZWQgZHVyYXRpb24gYnkgZGVmYXVsdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmV3VGFza3NFc3RpbWF0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzcGxpdHNJblByb2dyZXNzVGFza3MiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgaW4tcHJvZ3Jlc3MgdGFza3MgY2FuIGJlIHNwbGl0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTcGxpdHNJblByb2dyZXNzVGFza3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzcHJlYWRBY3R1YWxDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIGFjdHVhbCBjb3N0cyBhcmUgc3ByZWFkIHRvIHRoZSBzdGF0dXMgZGF0ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3ByZWFkQWN0dWFsQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwcmVhZFBlcmNlbnRDb21wbGV0ZSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgcGVyY2VudCBjb21wbGV0ZSBpcyBzcHJlYWQgdG8gdGhlIHN0YXR1cyBkYXRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTcHJlYWRQZXJjZW50Q29tcGxldGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXNrVXBkYXRlc1Jlc291cmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHVwZGF0ZXMgdG8gdGFza3MgdXBkYXRlIHJlc291cmNlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFza1VwZGF0ZXNSZXNvdXJjZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpc2NhbFllYXJTdGFydCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIGZpc2NhbCB5ZWFyIG51bWJlcmluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaXNjYWxZZWFyU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3ZWVrU3RhcnREYXkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9XZWVrU3RhcnREYXlUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3RhcnQgZGF5IG9mIHRoZSB3ZWVrLiBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MD1TdW5kYXksIDE9TW9uZGF5LCAyPVR1ZXNkYXksIDM9V2VkbmVzZGF5LCA0PVRodXJzZGF5LCA1PUZyaWRheSwgNj1TYXR1cmRheSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrU3RhcnREYXkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtb3ZlQ29tcGxldGVkRW5kc0JhY2siCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtTcGVjaWZpZXMgd2hldGhlciB0aGUgZW5kIG9mIGNvbXBsZXRlZCBwb3J0aW9ucyBvZiB0YXNrcyBzY2hlZHVsZWQgdG8gYmVnaW4gYWZ0ZXIgdGhlICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O3N0YXR1cyBkYXRlIGJ1dCBiZWd1biBlYXJseSBzaG91bGQgYmUgbW92ZWQgYmFjayB0byB0aGUgc3RhdHVzIGRhdGUuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNb3ZlQ29tcGxldGVkRW5kc0JhY2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtb3ZlUmVtYWluaW5nU3RhcnRzQmFjayIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O1NwZWNpZmllcyB3aGV0aGVyIHRoZSBiZWdpbm5pbmcgb2YgcmVtYWluaW5nIHBvcnRpb25zIG9mIHRhc2tzIHNjaGVkdWxlZCB0byBiZWdpbiBhZnRlciB0aGUgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7c3RhdHVzIGRhdGUgYnV0IGJlZ3VuIGVhcmx5IHNob3VsZCBiZSBtb3ZlZCBiYWNrIHRvIHRoZSBzdGF0dXMgZGF0ZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1vdmVSZW1haW5pbmdTdGFydHNCYWNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtTcGVjaWZpZXMgd2hldGhlciB0aGUgYmVnaW5uaW5nIG9mIHJlbWFpbmluZyBwb3J0aW9ucyBvZiB0YXNrcyBzY2hlZHVsZWQgdG8gaGF2ZSBiZWd1biBsYXRlICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O3Nob3VsZCBiZSBtb3ZlZCB1cCB0byB0aGUgc3RhdHVzIGRhdGUuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O1NwZWNpZmllcyB3aGV0aGVyIHRoZSBlbmQgb2YgY29tcGxldGVkIHBvcnRpb25zIG9mIHRhc2tzIHNjaGVkdWxlZCB0byBoYXZlIGJlZW4gY29tcGxldGVkICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O2JlZm9yZSB0aGUgc3RhdHVzIGRhdGUgYnV0IGJlZ3VuIGxhdGUgc2hvdWxkIGJlIG1vdmVkIHVwIHRvIHRoZSBzdGF0dXMgZGF0ZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJhc2VsaW5lRm9yRWFybmVkVmFsdWUiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9CYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzcGVjaWZpYyBiYXNlbGluZSB1c2VkIHRvIGNhbGN1bGF0ZSBWYXJpYW5jZSB2YWx1ZXMuICBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MD1CYXNlbGluZSwgMT1CYXNlbGluZSAxLCAyPUJhc2VsaW5lIDIsIDM9QmFzZWxpbmUgMywgND1CYXNlbGluZSA0LCA1PUJhc2VsaW5lIDUsIDY9QmFzZWxpbmUgNiwgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5Ozc9QmFzZWxpbmUgNywgOD1CYXNlbGluZSA4LCA5PUJhc2VsaW5lIDksIDEwPUJhc2VsaW5lIDEwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lRm9yRWFybmVkVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdG8gYXV0b21hdGljYWxseSBhZGQgbmV3IHJlc291cmNlcyB0byB0aGUgcmVzb3VyY2UgcG9vbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhdHVzRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRhdGUgdXNlZCBmb3IgY2FsY3VsYXRpb24gYW5kIHJlcG9ydGluZy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhdHVzRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImN1cnJlbnREYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN5c3RlbSBkYXRlIHRoYXQgdGhlIFhNTCB3YXMgZ2VuZXJhdGVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDdXJyZW50RGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHByb2plY3Qgd2FzIGNyZWF0ZWQgYnkgYSBQcm9qZWN0IFNlcnZlciB1c2VyIGFzIG9wcG9zZWQgdG8gYW4gTlQgdXNlci4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRvbGluayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0byBhdXRvbGluayBpbnNlcnRlZCBvciBtb3ZlZCB0YXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXV0b2xpbmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuZXdUYXNrU3RhcnREYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTmV3VGFza1N0YXJ0RGF0ZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBkYXRlIGZvciBuZXcgdGFza3Mgc3RhcnQuICBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MD1Qcm9qZWN0IFN0YXJ0IERhdGUsIDE9Q3VycmVudCBEYXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5ld1Rhc2tTdGFydERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0VGFza0VWTWV0aG9kIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBlYXJuZWQgdmFsdWUgbWV0aG9kIGZvciB0YXNrcy4gIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPVBlcmNlbnQgQ29tcGxldGUsIDE9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0VGFza0VWTWV0aG9kIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvamVjdEV4dGVybmFsbHlFZGl0ZWQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHByb2plY3QgWE1MIHdhcyBlZGl0ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2plY3RFeHRlcm5hbGx5RWRpdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZW5kZWRDcmVhdGlvbkRhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEYXRlIHVzZWQgZm9yIGNhbGN1bGF0aW9uIGFuZCByZXBvcnRpbmcuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQ3JlYXRpb25EYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsc0luU3luYyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBhbGwgYWN0dWFsIHdvcmsgaGFzIGJlZW4gc3luY2hyb25pemVkIHdpdGggdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbHNJblN5bmMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1vdmVGaWxlUHJvcGVydGllcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0byByZW1vdmUgYWxsIGZpbGUgcHJvcGVydGllcyBvbiBzYXZlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1vdmVGaWxlUHJvcGVydGllcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFkbWluUHJvamVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcHJvamVjdCBpcyBhbiBhZG1pbmlzdHJhdGl2ZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBZG1pblByb2plY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRsaW5lQ29kZXMiIGVUeXBlPSIjLy9PdXRsaW5lQ29kZXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiBvdXRsaW5lIGNvZGUgZGVmaW5pdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9qZWN0LiAgVGhlc2UgY29kZXMgbWF5IGJlIGFzc29jaWF0ZWQgb25seSB3aXRoIHRoaXMgcHJvamVjdCwgb3IgbWF5IGJlIGNvbW1vbiBhbW9uZyBzZXZlcmFsIHByb2plY3RzIChlbnRlcnByaXNlIGNvZGVzKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id0JTTWFza3MiIGVUeXBlPSIjLy9XQlNNYXNrcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0YWJsZSBvZiBlbnRyaWVzIHRoYXQgZGVmaW5lIHRoZSBvdXRsaW5lIGNvZGUgbWFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV0JTTWFza3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlbmRlZEF0dHJpYnV0ZXMiIGVUeXBlPSIjLy9FeHRlbmRlZEF0dHJpYnV0ZXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiBleHRlbmRlZCBhdHRyaWJ1dGUgKGN1c3RvbSBmaWVsZCkgZGVmaW5pdGlvbnMgJiN4RDsmI3hBOyAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjYWxlbmRhcnMiIGVUeXBlPSIjLy9DYWxlbmRhcnMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiBjYWxlbmRhcnMgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlICYjeEQ7JiN4QTsgICAgICAgIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFycyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhc2tzIiBlVHlwZT0iIy8vVGFza3MiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiB0YXNrcyB0aGF0IG1ha2UgdXAgdGhlIHByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzb3VyY2VzIiBlVHlwZT0iIy8vUmVzb3VyY2VzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgcmVzb3VyY2VzIHRoYXQgbWFrZSB1cCB0aGUgcHJvamVjdC4mI3hEOyYjeEE7ICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzb3VyY2VzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzaWdubWVudHMiIGVUeXBlPSIjLy9Bc3NpZ25tZW50cyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIGFzc2lnbm1lbnRzIHRoYXQgbWFrZSB1cCB0aGUgcHJvamVjdC4mI3hEOyYjeEE7ICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBc3NpZ25tZW50cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJhdGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhdGVzRnJvbSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHJhdGUgYmVjb21lcyBlZmZlY3RpdmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVzRnJvbSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhdGVzVG8iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGFzdCBkYXRlIHRoYXQgdGhlIHJhdGUgaXMgZWZmZWN0aXZlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlc1RvIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmF0ZVRhYmxlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vUmF0ZVRhYmxlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmF0ZSB0YWJsZSBmb3IgdGhlIHJlc291cmNlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPUEsIDE9QiwgMj1DLCAzPUQsIDQ9RSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlVGFibGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFuZGFyZFJhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdGFuZGFyZCByYXRlIGZvciB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwZXJpb2Qgc3BlY2lmaWVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFuZGFyZFJhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFuZGFyZFJhdGVGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdGFuZGFyZFJhdGVGb3JtYXRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXRzIHVzZWQgYnkgTWljcm9zb2Z0IFByb2plY3QgdG8gZGlzcGxheSB0aGUgc3RhbmRhcmQgcmF0ZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZUZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lUmF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG92ZXJ0aW1lIHJhdGUgZm9yIHRoZSByZXNvdXJjZSBmb3IgdGhlIHBlcmlvZCBzcGVjaWZpZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lUmF0ZUZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL092ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pdHMgdXNlZCBieSBNaWNyb3NvZnQgUHJvamVjdCB0byBkaXNwbGF5IHRoZSBvdmVydGltZSByYXRlLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vLCA3PXkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdFBlclVzZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvc3QgcGVyIHVzZSBvZiB0aGUgcmVzb3VyY2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RQZXJVc2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSYXRlcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJhdGUiIHVwcGVyQm91bmQ9IjI1IiBlVHlwZT0iIy8vUmF0ZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZpbml0aW9uIG9mIGEgdGltZSBwZXJpb2QsIGFuZCB0aGUgcmF0ZXMgYXBwbGljYWJsZSBmb3IgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlc291cmNlIGR1cmluZyB0aGF0IHBlcmlvZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlJhdGVUYWJsZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlVGFibGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVzb3VyY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzb3VyY2VfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlEIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcG9zaXRpb24gaWRlbnRpZmllciBvZiB0aGUgcmVzb3VyY2Ugd2l0aGluIHRoZSBsaXN0IG9mIHJlc291cmNlcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vTmFtZVR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1R5cGVUeXBlNCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIHJlc291cmNlLiBWYWx1ZXMgYXJlOiAwPU1hdGVyaWFsLCAxPVdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzTnVsbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIG51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzTnVsbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImluaXRpYWxzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSW5pdGlhbHNUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGluaXRpYWxzIG9mIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW5pdGlhbHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwaG9uZXRpY3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9QaG9uZXRpY3NUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBob25ldGljIHNwZWxsaW5nIG9mIHRoZSByZXNvdXJjZSBuYW1lLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIHVzZSB3aXRoIEphcGFuZXNlIG9ubHkuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBob25ldGljcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5UQWNjb3VudCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL05UQWNjb3VudFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgTlQgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOVEFjY291bnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYXRlcmlhbExhYmVsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTWF0ZXJpYWxMYWJlbFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pdCBvZiBtZWFzdXJlIGZvciB0aGUgbWF0ZXJpYWwgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hdGVyaWFsTGFiZWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb2RlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vQ29kZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29kZSBvciBvdGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvZGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0dyb3VwVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBncm91cCB0byB3aGljaCB0aGUgcmVzb3VyY2UgYmVsb25ncy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iR3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrR3JvdXAiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrR3JvdXBUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2Ygd29ya2dyb3VwIHRvIHdoaWNoIHRoZSByZXNvdXJjZSBiZWxvbmdzLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPURlZmF1bHQsIDE9Tm9uZSwgMj1FbWFpbCwgMz1XZWImI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya0dyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW1haWxBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRW1haWxBZGRyZXNzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbWFpbCBhZGRyZXNzIG9mIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRW1haWxBZGRyZXNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGl0bGUgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rQWRkcmVzc1R5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtBZGRyZXNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rU3ViQWRkcmVzcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua1N1YkFkZHJlc3NUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRvY3VtZW50IGJvb2ttYXJrIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rU3ViQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1heFVuaXRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIxLjAiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWF4aW11bSBudW1iZXIgb2YgdW5pdHMgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXhVbml0cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBlYWtVbml0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXJnZXN0IG51bWJlciBvZiB1bml0cyBhc3NpZ25lZCB0byB0aGUgcmVzb3VyY2UgYXQgYW55IHRpbWUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBlYWtVbml0cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJBbGxvY2F0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHJlc291cmNlIGlzIG92ZXJhbGxvY2F0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJBbGxvY2F0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdmFpbGFibGVGcm9tIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpcnN0IGRhdGUgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFibGVGcm9tIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXZhaWxhYmxlVG8iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGFzdCBkYXRlIHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJsZVRvIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIHN0YXJ0IGRhdGUgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYW5MZXZlbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcmVzb3VyY2UgY2FuIGJlIGxldmVsZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbkxldmVsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWNjcnVlQXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9BY2NydWVBdCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkhvdyBjb3N0IGlzIGFjY3J1ZWQgYWdhaW5zdCB0aGUgcmVzb3VyY2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDE9U3RhcnQsIDI9RW5kLCAzPVByb3JhdGVkJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjY3J1ZUF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29yayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0b3RhbCB3b3JrIGFzc2lnbmVkIHRvIHRoZSByZXNvdXJjZSBhY3Jvc3MgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVndWxhcldvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIG5vbi1vdmVydGltZSB3b3JrIGFzc2lnbmVkIHRvIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVndWxhcldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIG92ZXJ0aW1lIHdvcmsgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBhY3R1YWwgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgcmVtYWluaW5nIHdvcmsgcmVxdWlyZWQgdG8gY29tcGxldGUgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBhY3R1YWwgb3ZlcnRpbWUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdPdmVydGltZVdvcmsiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHJlbWFpbmluZyBvdmVydGltZSB3b3JrIHJlcXVpcmVkIHRvIGNvbXBsZXRlIGFsbCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVyY2VudFdvcmtDb21wbGV0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBlcmNlbnRhZ2Ugb2Ygd29yayBjb21wbGV0ZWQgYWNyb3NzIGFsbCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGVyY2VudFdvcmtDb21wbGV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YW5kYXJkUmF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN0YW5kYXJkIHJhdGUgb2YgdGhlIHJlc291cmNlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGFzIG9mIHRoZSBjdXJyZW50IGRhdGUgaWYgYSByYXRlIHRhYmxlIGV4aXN0cyBmb3IgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFuZGFyZFJhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFuZGFyZFJhdGVGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIHN0YW5kYXJkIHJhdGUuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPW0sIDI9aCwgMz1kLCA0PXcsIDU9bW8sIDc9eSwgOD1tYXRlcmlhbCByZXNvdXJjZSByYXRlIChvciBibGFuayBzeW1ib2wgc3BlY2lmaWVkKSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFuZGFyZFJhdGVGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdG90YWwgcHJvamVjdCBjb3N0IGZvciB0aGUgcmVzb3VyY2UgYWNyb3NzIGFsbCBhc3NpZ25lZCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lUmF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG92ZXJ0aW1lIHJhdGUgb2YgdGhlIHJlc291cmNlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGFzIG9mIHRoZSBjdXJyZW50IGRhdGUgaWYgYSByYXRlIHRhYmxlIGV4aXN0cyBmb3IgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVJhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVJhdGVGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9PdmVydGltZVJhdGVGb3JtYXRUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIG92ZXJ0aW1lIHJhdGUuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPW0sIDI9aCwgMz1kLCA0PXcsIDU9bW8sIDc9eSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVJhdGVGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZUNvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0b3RhbCBvdmVydGltZSBjb3N0IGZvciB0aGUgcmVzb3VyY2UgaW5jbHVkaW5nIGFjdHVhbCBhbmQgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3RzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0UGVyVXNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29zdCBwZXIgdXNlIG9mIHRoZSByZXNvdXJjZS4gVGhpcyB2YWx1ZSBpcyBhcyBvZiB0aGUgY3VycmVudCBkYXRlIGlmIGEgcmF0ZSB0YWJsZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdFBlclVzZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbENvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgY29zdCBpbmN1cnJlZCBieSB0aGUgcmVzb3VyY2UgYWNyb3NzIGFsbCBhc3NpZ25lZCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBvdmVydGltZSBjb3N0IGluY3VycmVkIGJ5IHRoZSByZXNvdXJjZSBhY3Jvc3MgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHByb2plY3RlZCBjb3N0IG9mIHRoZSByZXNvdXJjZSB0byBjb21wbGV0ZSBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ0Nvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdPdmVydGltZUNvc3QiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgcHJvamVjdGVkIG92ZXJ0aW1lIGNvc3Qgb2YgdGhlIHJlc291cmNlIHRvIGNvbXBsZXRlIGFsbCBhc3NpZ25lZCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya1ZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYmFzZWxpbmUgd29yayBhbmQgdGhlIHdvcmsgYXMgbWludXRlcyB4IDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3RWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGJhc2VsaW5lIGNvc3QgYW5kIHRoZSBjb3N0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0VmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzViIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVhcm5lZCB2YWx1ZSBzY2hlZHVsZSB2YXJpYW5jZSwgdGhyb3VnaCB0aGUgcHJvamVjdCBzdGF0dXMgZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU1YiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjViIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVhcm5lZCB2YWx1ZSBjb3N0IHZhcmlhbmNlLCB0aHJvdWdoIHRoZSBwcm9qZWN0IHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDViIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGNvc3Qgb2YgdGhlIHdvcmsgcGVyZm9ybWVkIGJ5IHRoZSByZXNvdXJjZSBmb3IgdGhlIHByb2plY3QgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQUNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhbGVuZGFyVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVzb3VyY2UgY2FsZW5kYXIuUmVmZXJzIHRvIGEgdmFsaWQgVUlEIGluIHRoZSBDYWxlbmRhcnMgZWxlbWVudCBvZiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgTWljcm9zb2Z0IFByb2plY3QgWE1MIFNjaGVtYS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsZW5kYXJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub3RlcyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUZXh0IG5vdGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5vdGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXQgY29zdCBvZiB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIG9mIHRoZSB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwcm9qZWN0IHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0dlbmVyaWMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBnZW5lcmljLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc0dlbmVyaWMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0luYWN0aXZlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgc2V0IHRvIGluYWN0aXZlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc0luYWN0aXZlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNFbnRlcnByaXNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgYW4gRW50ZXJwcmlzZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNFbnRlcnByaXNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYm9va2luZ1R5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Cb29raW5nVHlwZVR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBib29raW5nIHR5cGUgb2YgdGhlIHJlc291cmNlLiAxPUNvbW1pdGVkLCAyPVByb3Bvc2VkJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJvb2tpbmdUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsV29ya1Byb3RlY3RlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIHRocm91Z2ggd2hpY2ggYWN0dWFsIG92ZXJ0aW1lIHdvcmsgaXMgcHJvdGVjdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3RpdmVEaXJlY3RvcnlHVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgQWN0aXZlIERpcmVjdG9yeSBHVUlEIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdGl2ZURpcmVjdG9yeUdVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcmVhdGlvbkRhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSB3YXMgY3JlYXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3JlYXRpb25EYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZW5kZWRBdHRyaWJ1dGUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRXh0ZW5kZWRBdHRyaWJ1dGUzIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIG9mIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIGJhY2sgdG8gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSB0YWJsZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSB1bmlxdWUgSUQgb3IgdGhlIEZpZWxkIElELCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHZhbHVlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VsaW5lIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Jhc2VsaW5lMiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBiYXNlbGluZSB2YWx1ZXMgZm9yIHRoZSByZXNvdXJjZXMuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0bGluZUNvZGUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vT3V0bGluZUNvZGUzIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIG9mIGFuIG91dGxpbmUgY29kZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gYSBwb2ludGVyIGJhY2sgdG8gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG91dGxpbmUgY29kZSB0YWJsZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSB1bmlxdWUgSUQgb3IgdGhlIEZpZWxkIElELCBhbmQgdGhlIHZhbHVlIHdoaWNoIGlzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImF2YWlsYWJpbGl0eVBlcmlvZHMiIGVUeXBlPSIjLy9BdmFpbGFiaWxpdHlQZXJpb2RzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBjb2xsZWN0aW9uIG9mIHBlcmlvZHMgZHVyaW5nIHdoaWNoIHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJpbGl0eVBlcmlvZHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyYXRlcyIgZVR5cGU9IiMvL1JhdGVzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBjb2xsZWN0aW9uIG9mIHBlcmlvZHMgYW5kIHRoZSByYXRlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBvbmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGltZXBoYXNlZERhdGEiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpbWUgcGhhc2VkIGRhdGEmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZXBoYXNlZERhdGEiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXNvdXJjZXMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzb3VyY2VzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzb3VyY2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUmVzb3VyY2UiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSByZXNvdXJjZSBpbiBlYWNoIFJlc291cmNlcyBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNvdXJjZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlJvbGx1cFR5cGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUm9sbHVwVHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCA1IDYgNyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTdGFuZGFyZFJhdGVGb3JtYXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhbmRhcmRSYXRlRm9ybWF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1IDciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFuZGFyZFJhdGVGb3JtYXRfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1IDcgOCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTdWJqZWN0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3ViamVjdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTdWJwcm9qZWN0TmFtZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YnByb2plY3ROYW1lXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2siPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFza18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwb3NpdGlvbiBpZGVudGlmaWVyIG9mIHRoZSB0YXNrIHdpdGhpbiB0aGUgbGlzdCBvZiB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vTmFtZVR5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVHlwZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiB0YXNrLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPUZpeGVkIFVuaXRzLCAxPUZpeGVkIER1cmF0aW9uLCAyPUZpeGVkIFdvcmsuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc051bGwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB3aGV0aGVyIHRoZSB0YXNrIGlzIG51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzTnVsbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyZWF0ZURhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSB0YXNrIHdhcyBjcmVhdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcmVhdGVEYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29udGFjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnRhY3RUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbnRhY3QgcGVyc29uIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGFjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndCUyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlIGNvZGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldCUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndCU0xldmVsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByaWdodG1vc3QgV0JTIGxldmVsIG9mIHRoZSB0YXNrLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV0JTTGV2ZWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdXRsaW5lTnVtYmVyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vT3V0bGluZU51bWJlclR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgb3V0bGluZSBudW1iZXIgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVOdW1iZXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdXRsaW5lTGV2ZWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBvdXRsaW5lIGxldmVsIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lTGV2ZWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmlvcml0eSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByaW9yaXR5IG9mIHRoZSB0YXNrIGZyb20gMCB0byAxMDAwLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmlvcml0eSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR1cmF0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBsYW5uZWQgZHVyYXRpb24gb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb25Gb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EdXJhdGlvbkZvcm1hdFR5cGU0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgRHVyYXRpb24gb2YgdGhlIFRhc2suICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMD1lJSwgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmsiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHNjaGVkdWxlZCB3b3JrIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0b3AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSB0YXNrIHdhcyBzdG9wcGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdG9wIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzdW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgdGFzayByZXN1bWVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXN1bWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXN1bWVWYWxpZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBjYW4gYmUgcmVzdW1lZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzdW1lVmFsaWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlZmZvcnREcml2ZW4iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgZWZmb3J0LWRyaXZlbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWZmb3J0RHJpdmVuIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVjdXJyaW5nIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGEgcmVjdXJyaW5nIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlY3VycmluZyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJBbGxvY2F0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgb3ZlcmFsbG9jYXRlZC4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGluZm9ybWF0aW9uYWwgb25seS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlckFsbG9jYXRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBlc3RpbWF0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbGVzdG9uZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBhIG1pbGVzdG9uZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWlsZXN0b25lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3VtbWFyeSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBhIHN1bW1hcnkgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3VtbWFyeSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyaXRpY2FsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGluIHRoZSBjcml0aWNhbCBjaGFpbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3JpdGljYWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1N1YnByb2plY3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgYW4gaW5zZXJ0ZWQgcHJvamVjdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNTdWJwcm9qZWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNTdWJwcm9qZWN0UmVhZE9ubHkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIGluc2VydGVkIHByb2plY3QgaXMgcmVhZC1vbmx5LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc1N1YnByb2plY3RSZWFkT25seSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1YnByb2plY3ROYW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3VicHJvamVjdE5hbWVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgaW5zZXJ0ZWQgcHJvamVjdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3VicHJvamVjdE5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbFRhc2siIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgZXh0ZXJuYWwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVybmFsVGFzayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsVGFza1Byb2plY3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9FeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzb3VyY2UgbG9jYXRpb24gYW5kIHRhc2sgaWRlbnRpZmllciBvZiB0aGUgZXh0ZXJuYWwgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZXJuYWxUYXNrUHJvamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVhcmx5U3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWFybHkgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWFybHlTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVhcmx5RmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVhcmx5IGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJseUZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxhdGVTdGFydCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXRlIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxhdGVTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxhdGVGaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGF0ZSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGF0ZUZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0VmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YXJpYW5jZSBvZiB0aGUgdGFzayBzdGFydCBkYXRlIGZyb20gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJhc2VsaW5lIHN0YXJ0IGRhdGUgYXMgbWludXRlcyB4IDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0VmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2hWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhcmlhbmNlIG9mIHRoZSB0YXNrIGZpbmlzaCBkYXRlIGZyb20gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJhc2VsaW5lIGZpbmlzaCBkYXRlIGFzIG1pbnV0ZXMgeCAxMDAwLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2hWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YXJpYW5jZSBvZiB0YXNrIHdvcmsgZnJvbSB0aGUgYmFzZWxpbmUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzayB3b3JrIGFzIG1pbnV0ZXMgeCAxMDAwLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrVmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmcmVlU2xhY2siIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgZnJlZSBzbGFjay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRnJlZVNsYWNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idG90YWxTbGFjayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiB0b3RhbCBzbGFjay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVG90YWxTbGFjayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpeGVkQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaXhlZCBjb3N0IG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaXhlZENvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaXhlZENvc3RBY2NydWFsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRml4ZWRDb3N0QWNjcnVhbFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJIb3cgdGhlIGZpeGVkIGNvc3QgaXMgYWNjcnVlZCBhZ2FpbnN0IHRoZSB0YXNrLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAxPVN0YXJ0LCAyPVByb3JhdGVkIGFuZCAzPUVuZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRml4ZWRDb3N0QWNjcnVhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBlcmNlbnRDb21wbGV0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhc2sgZHVyYXRpb24gY29tcGxldGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZXJjZW50Q29tcGxldGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZXJjZW50V29ya0NvbXBsZXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGVyY2VudGFnZSBvZiB0aGUgdGFzayB3b3JrIGNvbXBsZXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGVyY2VudFdvcmtDb21wbGV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3QiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcm9qZWN0ZWQgb3Igc2NoZWR1bGVkIGNvc3Qgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZUNvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdW0gb2YgdGhlIGFjdHVhbCBhbmQgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3Qgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxTdGFydCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxGaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxEdXJhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgZHVyYXRpb24gb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbER1cmF0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBjb3N0IG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIG92ZXJ0aW1lIGNvc3Qgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHdvcmsgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBvdmVydGltZSB3b3JrIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVndWxhcldvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIG5vbi1vdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlZ3VsYXJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nRHVyYXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHRpbWUgcmVxdWlyZWQgdG8gY29tcGxldGUgdGhlIHVuZmluaXNoZWQgcG9ydGlvbiBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nRHVyYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHByb2plY3RlZCBjb3N0IG9mIGNvbXBsZXRpbmcgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ0Nvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyB3b3JrIHNjaGVkdWxlZCB0byBjb21wbGV0ZSB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lQ29zdCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBvdmVydGltZSBjb3N0IHByb2plY3RlZCB0byBmaW5pc2ggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ092ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lV29yayIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgdG8gZmluaXNoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSB0YXNrIHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjViIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVhcm5lZCB2YWx1ZSBjb3N0IHZhcmlhbmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDViIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbnN0cmFpbnRUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ29uc3RyYWludFR5cGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbnN0cmFpbnQgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPUFzIFNvb24gQXMgUG9zc2libGUsIDE9QXMgTGF0ZSBBcyBQb3NzaWJsZSwgMj1NdXN0IFN0YXJ0IE9uLCAzPU11c3QgRmluaXNoIE9uLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0PVN0YXJ0IE5vIEVhcmxpZXIgVGhhbiwgNT1TdGFydCBObyBMYXRlciBUaGFuLCA2PUZpbmlzaCBObyBFYXJsaWVyIFRoYW4gYW5kIDc9RmluaXNoIE5vIExhdGVyIFRoYW4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29uc3RyYWludFR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYWxlbmRhclVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRhc2sgY2FsZW5kYXIuUmVmZXJzIHRvIGEgdmFsaWQgVUlEIGluIHRoZSBDYWxlbmRhcnMgZWxlbWVudCBvZiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgTWljcm9zb2Z0IFByb2plY3QgWE1MIFNjaGVtYS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsZW5kYXJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25zdHJhaW50RGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIGFyZ3VtZW50IGZvciB0aGUgdGFzayBjb25zdHJhaW50IHR5cGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnN0cmFpbnREYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVhZGxpbmUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVhZGxpbmUgZm9yIHRoZSB0YXNrIHRvIGJlIGNvbXBsZXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVhZGxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbEFzc2lnbm1lbnRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIGxldmVsaW5nIGNhbiBhZGp1c3QgYXNzaWdubWVudHMuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsQXNzaWdubWVudHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbGluZ0NhblNwbGl0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIGxldmVsaW5nIGNhbiBzcGxpdCB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxpbmdDYW5TcGxpdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsaW5nRGVsYXkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWxheSBjYXVzZWQgYnkgbGV2ZWxpbmcgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbGluZ0RlbGF5Rm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgZHVyYXRpb24gb2YgdGhlIGRlbGF5LiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA9ZSUsIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxpbmdEZWxheUZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZUxldmVsZWRTdGFydCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdGFydCBkYXRlIG9mIHRoZSB0YXNrIGJlZm9yZSBpdCB3YXMgbGV2ZWxlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlTGV2ZWxlZFN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlTGV2ZWxlZEZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzayBiZWZvcmUgaXQgd2FzIGxldmVsZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZUxldmVsZWRGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtUeXBlMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aXRsZSBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rQWRkcmVzcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua0FkZHJlc3NUeXBlMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtBZGRyZXNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rU3ViQWRkcmVzcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua1N1YkFkZHJlc3NUeXBlMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkb2N1bWVudCBib29rbWFyayBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rU3ViQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imlnbm9yZVJlc291cmNlQ2FsZW5kYXIiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaWdub3JlcyB0aGUgcmVzb3VyY2UgY2FsZW5kYXIuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Iklnbm9yZVJlc291cmNlQ2FsZW5kYXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub3RlcyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUZXh0IG5vdGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTm90ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoaWRlQmFyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBHQU5UVCBiYXIgb2YgdGhlIHRhc2sgaXMgaGlkZGVuIHdoZW4gZGlzcGxheWVkIGluIE1pY3Jvc29mdCBQcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIaWRlQmFyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm9sbHVwIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIHJvbGxlZCB1cC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUm9sbHVwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgdGFzayB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGh5c2ljYWxQZXJjZW50Q29tcGxldGUiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJjZW50YWdlIGNvbXBsZXRlIHZhbHVlIGVudGVyZWQgYnkgdGhlIFByb2plY3QgTWFuYWdlci4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgY2FuIGJlIHVzZWQgYXMgYW4gYWx0ZXJuYXRpdmUgZm9yIGNhbGN1bGF0aW5nIEJDV1AuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBoeXNpY2FsUGVyY2VudENvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWFybmVkVmFsdWVNZXRob2QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9FYXJuZWRWYWx1ZU1ldGhvZFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWV0aG9kIGZvciBjYWxjdWxhdGluZyBlYXJuZWQgdmFsdWUuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9UGVyY2VudCBDb21wbGV0ZSwgMT1QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVhcm5lZFZhbHVlTWV0aG9kIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZGVjZXNzb3JMaW5rIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1ByZWRlY2Vzc29yTGluayIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgdGhlIHByZWRlY2Vzc29yIHRhc2sgb2YgdGhlIHRhc2sgdGhhdCBjb250YWlucyBpdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlZGVjZXNzb3JMaW5rIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsV29ya1Byb3RlY3RlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIHRocm91Z2ggd2hpY2ggYWN0dWFsIG92ZXJ0aW1lIHdvcmsgaXMgcHJvdGVjdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlbmRlZEF0dHJpYnV0ZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9FeHRlbmRlZEF0dHJpYnV0ZTIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgYW4gZXh0ZW5kZWQgYXR0cmlidXRlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgYmFjayB0byB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgRmllbGQgSUQsIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZWxpbmUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQmFzZWxpbmUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiBiYXNlbGluZSB2YWx1ZXMgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0bGluZUNvZGUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vT3V0bGluZUNvZGUyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIG9mIGFuIG91dGxpbmUgY29kZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIGJhY2sgdG8gdGhlIG91dGxpbmUgY29kZSB0YWJsZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSB1bmlxdWUgSUQgb3IgdGhlIEZpZWxkIElELCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHZhbHVlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRpbWVwaGFzZWREYXRhIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1RpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aW1lIHBoYXNlZCBkYXRhIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZXBoYXNlZERhdGEiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhc2siIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFzayIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIHRhc2sgaW4gZWFjaCBUYXNrcyBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGltZVBlcmlvZCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lUGVyaW9kXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZnJvbURhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYmVnaW5uaW5nIG9mIHRoZSBleGNlcHRpb24gdGltZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZyb21EYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idG9EYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVuZCBvZiB0aGUgZXhjZXB0aW9uIHRpbWUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUb0RhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUaW1lcGhhc2VkRGF0YVR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZpbml0aW9uIG9mIHRoZSB0aW1lIHBoYXNlZCBkYXRhIGJsb2NrLiYjeEQ7JiN4QTsmI3g5OyYjeDk7ICAgICAgICAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVwaGFzZWREYXRhVHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1R5cGVUeXBlMyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgVGhlIHR5cGUgb2YgdGFzayB0aW1lcGhhc2VkIGRhdGEuIFZhbHVlcyBhcmU6JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMT1Bc3NpZ25tZW50IFJlbWFpbmluZyBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMj1Bc3NpZ25tZW50IEFjdHVhbCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMz1Bc3NpZ25tZW50IEFjdHVhbCBPdmVydGltZSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgND1Bc3NpZ25tZW50IEJhc2VsaW5lIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1PUFzc2lnbm1lbnQgQmFzZWxpbmUgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDY9QXNzaWdubWVudCBBY3R1YWwgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDc9UmVzb3VyY2UgQmFzZWxpbmUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDg9UmVzb3VyY2UgQmFzZWxpbmUgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDk9VGFzayBCYXNlbGluZSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMTA9VGFzayBCYXNlbGluZSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMTE9VGFzayBQZXJjZW50IENvbXBsZXRlJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMTY9QXNzaWdubWVudCBCYXNlbGluZSAxIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxNz1Bc3NpZ25tZW50IEJhc2VsaW5lIDEgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDE4PVRhc2sgQmFzZWxpbmUgMSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMTk9VGFzayBCYXNlbGluZSAxIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyMD1SZXNvdXJjZSBCYXNlbGluZSAxIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyMT1SZXNvdXJjZSBCYXNlbGluZSAxIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyMj1Bc3NpZ25tZW50IEJhc2VsaW5lIDIgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDIzPUFzc2lnbm1lbnQgQmFzZWxpbmUgMiBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjQ9VGFzayBCYXNlbGluZSAyIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyNT1UYXNrIEJhc2VsaW5lIDIgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDI2PVJlc291cmNlIEJhc2VsaW5lIDIgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDI3PVJlc291cmNlIEJhc2VsaW5lIDIgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDI4PUFzc2lnbm1lbnQgQmFzZWxpbmUgMyBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjk9QXNzaWdubWVudCBCYXNlbGluZSAzIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzMD1UYXNrIEJhc2VsaW5lIDMgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDMxPVRhc2sgQmFzZWxpbmUgMyBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzI9UmVzb3VyY2UgQmFzZWxpbmUgMyBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzM9UmVzb3VyY2UgQmFzZWxpbmUgMyBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzQ9QXNzaWdubWVudCBCYXNlbGluZSA0IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzNT1Bc3NpZ25tZW50IEJhc2VsaW5lIDQgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM2PVRhc2sgQmFzZWxpbmUgNCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzc9VGFzayBCYXNlbGluZSA0IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzOD1SZXNvdXJjZSBCYXNlbGluZSA0IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzOT1SZXNvdXJjZSBCYXNlbGluZSA0IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0MD1Bc3NpZ25tZW50IEJhc2VsaW5lIDUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQxPUFzc2lnbm1lbnQgQmFzZWxpbmUgNSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDI9VGFzayBCYXNlbGluZSA1IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0Mz1UYXNrIEJhc2VsaW5lIDUgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQ0PVJlc291cmNlIEJhc2VsaW5lIDUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQ1PVJlc291cmNlIEJhc2VsaW5lIDUgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQ2PUFzc2lnbm1lbnQgQmFzZWxpbmUgNiBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDc9QXNzaWdubWVudCBCYXNlbGluZSA2IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0OD1UYXNrIEJhc2VsaW5lIDYgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQ5PVRhc2sgQmFzZWxpbmUgNiBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTA9UmVzb3VyY2UgQmFzZWxpbmUgNiBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTE9UmVzb3VyY2UgQmFzZWxpbmUgNiBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTI9QXNzaWdubWVudCBCYXNlbGluZSA3IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1Mz1Bc3NpZ25tZW50IEJhc2VsaW5lIDcgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU0PVRhc2sgQmFzZWxpbmUgNyBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTU9VGFzayBCYXNlbGluZSA3IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1Nj1SZXNvdXJjZSBCYXNlbGluZSA3IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1Nz1SZXNvdXJjZSBCYXNlbGluZSA3IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1OD1Bc3NpZ25tZW50IEJhc2VsaW5lIDggV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU5PUFzc2lnbm1lbnQgQmFzZWxpbmUgOCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjA9VGFzayBCYXNlbGluZSA4IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2MT1UYXNrIEJhc2VsaW5lIDggQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDYyPVJlc291cmNlIEJhc2VsaW5lIDggV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDYzPVJlc291cmNlIEJhc2VsaW5lIDggQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDY0PUFzc2lnbm1lbnQgQmFzZWxpbmUgOSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjU9QXNzaWdubWVudCBCYXNlbGluZSA5IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2Nj1UYXNrIEJhc2VsaW5lIDkgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDY3PVRhc2sgQmFzZWxpbmUgOSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjg9UmVzb3VyY2UgQmFzZWxpbmUgOSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjk9UmVzb3VyY2UgQmFzZWxpbmUgOSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNzA9QXNzaWdubWVudCBCYXNlbGluZSAxMCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNzE9QXNzaWdubWVudCBCYXNlbGluZSAxMCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNzI9VGFzayBCYXNlbGluZSAxMCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNzM9VGFzayBCYXNlbGluZSAxMCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNzQ9UmVzb3VyY2UgQmFzZWxpbmUgMTAgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDc1PVJlc291cmNlIEJhc2VsaW5lIDEwIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3Nj1QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcmVjb3JkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHRpbWVwaGFzZWQgZGF0YSBwZXJpb2QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmluaXNoIGRhdGUgb2YgdGhlIHRpbWVwaGFzZWQgZGF0YSBwZXJpb2QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idW5pdCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1VuaXRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpbWUgdW5pdCBvZiB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPW0sIDE9aCwgMj1kLCAzPXcsIDU9bW8sIDg9eSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVuaXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgcGVyIHVuaXQgb2YgdGltZSBmb3IgdGhlIHRpbWVwaGFzZWQgZGF0YSBwZXJpb2QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJUaXRsZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpdGxlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlR5cGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlR5cGVUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJUeXBlVHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGUzIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZV8uXzNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxNiAxNyAxOCAxOSAyMCAyMSAyMiAyMyAyNCAyNSAyNiAyNyAyOCAyOSAzMCAzMSAzMiAzMyAzNCAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA0NSA0NiA0NyA0OCA0OSA1MCA1MSA1MiA1MyA1NCA1NSA1NiA1NyA1OCA1OSA2MCA2MSA2MiA2MyA2NCA2NSA2NiA2NyA2OCA2OSA3MCA3MSA3MiA3MyA3NCA3NSA3NiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJUeXBlVHlwZTQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlXy5fNF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJUeXBlVHlwZTUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlXy5fNV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVUlEVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iMTYiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVW5pdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVbml0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA1IDgiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmFsdWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSBvdXRsaW5lIGNvZGUgdmFsdWUgYWNyb3NzIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFyZW50VmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIG9mIHRoZSBwYXJlbnQgbm9kZSBvZiB0aGUgb3V0bGluZSBjb2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQYXJlbnRWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCB2YWx1ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGRlc2NyaXB0aW9uIG9mIHRoaXMgdmFsdWUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlc2NyaXB0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmFsdWUyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlEIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVbmlxdWUgSUQgb2YgdmFsdWUgYWNyb3NzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgdmFsdWUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB2YWx1ZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgbGlzdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVzY3JpcHRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWYWx1ZUxpc3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVMaXN0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsdWUiIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVmFsdWUyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlcyB0aGF0IG1ha2UgdXAgdGhlIHZhbHVlIGxpc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVmFsdWVsaXN0U29ydE9yZGVyVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlbGlzdFNvcnRPcmRlcl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWYWx1ZXMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAiIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDowIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbHVlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1ZhbHVlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGluZGl2aWR1YWwgdmFsdWVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXQlNNYXNrIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldCU01hc2tfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxldmVsIG9mIHRoZSBtYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9UeXBlVHlwZTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiB0aGUgbm9kZSB2YWx1ZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlcyBhcmU6IDA9TnVtYmVycywgMT1VcHBlcmNhc2UgTGV0dGVycywgMj1Mb3dlcmNhc2UgTGV0dGVycywgMz1DaGFyYWN0ZXJzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGVuZ3RoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtYXhpbXVtIGxlbmd0aCBpbiBjaGFyYWN0ZXJzLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIG9taXR0ZWQgd2hlbiBsZW5ndGggaXMgJnF1b3Q7YW55JnF1b3Q7LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZW5ndGgiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZXBhcmF0b3IiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNlcGFyYXRvciBjaGFyYWN0ZXIgb2YgdGhlIG5vZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNlcGFyYXRvciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldCU01hc2tzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldCU01hc2tzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyaWZ5VW5pcXVlQ29kZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIFdCUyBjb2RlcyBhcmUgdW5pcXVlIGZvciBuZXcgdGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZlcmlmeVVuaXF1ZUNvZGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2VuZXJhdGVDb2RlcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgV0JTIGNvZGVzIGFyZSBnZW5lcmF0ZWQgZm9yIG5ldyB0YXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iR2VuZXJhdGVDb2RlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWZpeCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1ByZWZpeFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJlZml4IGZvciBhbGwgV0JTIGNvZGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVmaXgiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3QlNNYXNrIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1dCU01hc2siIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgV0JTIE1hc2sgdGhhdCBpcyBhcHBsaWVkIHRvIGFsbCB0YXNrcyBpbiB0aGUgUHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV0JTTWFzayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldlZWtEYXkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2Vla0RheV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRheVR5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9EYXlUeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIGRheS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9RXhjZXB0aW9uLCAxPU1vbmRheSwgMj1UdWVzZGF5LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMz1XZWRuZXNkYXksIDQ9VGh1cnNkYXksIDU9RnJpZGF5LCA2PVNhdHVyZGF5LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNz1TdW5kYXkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGF5VHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRheVdvcmtpbmciIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHNwZWNpZmllZCBkYXRlIG9yIGRheSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBpcyB3b3JraW5nLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEYXlXb3JraW5nIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGltZVBlcmlvZCIgZVR5cGU9IiMvL1RpbWVQZXJpb2QiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIGEgY29udGlndW91cyBzZXQgb2YgZXhjZXB0aW9uIGRheXMuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lUGVyaW9kIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya2luZ1RpbWVzIiBlVHlwZT0iIy8vV29ya2luZ1RpbWVzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2Ygd29ya2luZyB0aW1lcyB0aGF0IGRlZmluZSB0aGUgdGltZSB3b3JrZWQgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSB3ZWVrZGF5LiAgT25lIG9mIHRoZXNlIG11c3QgYmUgcHJlc2VudCwgYW5kIHRoZXJlIG1heSBiZSBubyBtb3JlIHRoYW4gZml2ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtpbmdUaW1lcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldlZWtEYXlzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldlZWtEYXlzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2Vla0RheSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9XZWVrRGF5IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSB3ZWVrZGF5IGVpdGhlciBkZWZpbmVzIHJlZ3VsYXIgZGF5cyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgd2VlayBvciBleGNlcHRpb24gZGF5cyBpbiB0aGUgY2FsZW5kYXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldlZWtEYXkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJXZWVrU3RhcnREYXlUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2Vla1N0YXJ0RGF5Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJXb3JrQ29udG91clR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrQ29udG91cl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCA1IDYgNyA4Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IldvcmtGb3JtYXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya0Zvcm1hdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJXb3JrR3JvdXBUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya0dyb3VwXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JraW5nVGltZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JraW5nVGltZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZyb21UaW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1RpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYmVnaW5uaW5nIG9mIHRoZSB3b3JraW5nIHRpbWUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRnJvbVRpbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0b1RpbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbmQgb2YgdGhlIHdvcmtpbmcgIHRpbWUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVG9UaW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya2luZ1RpbWVzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtpbmdUaW1lc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtpbmdUaW1lIiB1cHBlckJvdW5kPSI1IgotICAgICAgICBlVHlwZT0iIy8vV29ya2luZ1RpbWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIHRoZSB3b3JraW5nIHRpbWUgZHVyaW5nIHRoZSB3ZWVrZGF5LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtpbmdUaW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MzQzYjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgPGNvcHlyaWdodD4KLSMgPC9jb3B5cmlnaHQ+Ci0jCi0jICRJZDogcGx1Z2luLnByb3BlcnRpZXMsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo1NyBqdGhhbSBFeHAgJAotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1wbHVnaW5OYW1lID0gRVBGIE1TUHJvamVjdDIwMDMgTW9kZWwKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNjE5NTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPCEtLQotIDxjb3B5cmlnaHQ+Ci0gPC9jb3B5cmlnaHQ+Ci0KLSAkSWQ6IHBsdWdpbi54bWwsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo1NyBqdGhhbSBFeHAgJAotLS0+Ci0KLTxwbHVnaW4+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICA8cGFja2FnZSAKLSAgICAgICB1cmkgPSAiaHR0cDovL2VwZi5lY2xpcHNlLm9yZy9tc3Byb2plY3QiIAotICAgICAgIGNsYXNzID0gIm9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSIKLSAgICAgICBnZW5Nb2RlbCA9ICJtb2RlbC9NU19Qcm9qZWN0XzIwMDMuZ2VubW9kZWwiIC8+IAotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZXh0ZW5zaW9uX3BhcnNlciI+Ci0gICAgPHBhcnNlciAKLSAgICAgICB0eXBlPSJtc3Byb2plY3QiIAotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWwuTXNwcm9qZWN0UmVzb3VyY2VGYWN0b3J5SW1wbCIgLz4KLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Fzc2lnbm1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQXNzaWdubWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzhiYzQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQXNzaWdubWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzNCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFzc2lnbm1lbnQuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ1IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Bc3NpZ25tZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFRhc2tVSUQgPGVtPlRhc2sgVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVzb3VyY2VVSUQgPGVtPlJlc291cmNlIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsRmluaXNoIDxlbT5BY3R1YWwgRmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0IDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbE92ZXJ0aW1lV29yayA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxTdGFydCA8ZW0+QWN0dWFsIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNDb25maXJtZWQgPGVtPkNvbmZpcm1lZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDb3N0UmF0ZVRhYmxlIDxlbT5Db3N0IFJhdGUgVGFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDb3N0VmFyaWFuY2UgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDViA8ZW0+Q1Y8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXREZWxheSA8ZW0+RGVsYXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEZpbmlzaFZhcmlhbmNlIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGlua0FkZHJlc3MgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNIYXNGaXhlZFJhdGVVbml0cyA8ZW0+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0ZpeGVkTWF0ZXJpYWwgPGVtPkZpeGVkIE1hdGVyaWFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0TGV2ZWxpbmdEZWxheSA8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0IDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0xpbmtlZEZpZWxkcyA8ZW0+TGlua2VkIEZpZWxkczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXROb3RlcyA8ZW0+Tm90ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc092ZXJhbGxvY2F0ZWQgPGVtPk92ZXJhbGxvY2F0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRPdmVydGltZVdvcmsgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZWd1bGFyV29yayA8ZW0+UmVndWxhciBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNSZXNwb25zZVBlbmRpbmcgPGVtPlJlc3BvbnNlIFBlbmRpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdG9wIDxlbT5TdG9wPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVzdW1lIDxlbT5SZXN1bWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdGFydFZhcmlhbmNlIDxlbT5TdGFydCBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFVuaXRzIDxlbT5Vbml0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzVXBkYXRlTmVlZGVkIDxlbT5VcGRhdGUgTmVlZGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VkFDIDxlbT5WQUM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29ya0NvbnRvdXIgPGVtPldvcmsgQ29udG91cjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1MgPGVtPkJDV1M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Qm9va2luZ1R5cGUgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJhc2VsaW5lIDxlbT5CYXNlbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdBc3NpZ25tZW50Xy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFzc2lnbm1lbnQgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9VSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFzayBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhc2sgVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUYXNrVUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9UYXNrVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUYXNrVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRUYXNrVUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VGFza1VJRCA8ZW0+VGFzayBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhc2sgVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYXNrVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUYXNrVUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXNvdXJjZVVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfUmVzb3VyY2VVSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc291cmNlVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRSZXNvdXJjZVVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlc291cmNlVUlEIDxlbT5SZXNvdXJjZSBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc291cmNlVUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIHdvcmsgY29tcGxldGVkIG9uIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQZXJjZW50V29ya0NvbXBsZXRlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9QZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQZXJjZW50V29ya0NvbXBsZXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRQZXJjZW50V29ya0NvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBlcmNlbnRXb3JrQ29tcGxldGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBjb3N0IGluY3VycmVkIG9uIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbENvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0FjdHVhbENvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbENvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldEFjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbENvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgRmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIGZpbmlzaCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsRmluaXNoKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0FjdHVhbEZpbmlzaCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbEZpbmlzaCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxGaW5pc2goKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxGaW5pc2ggPGVtPkFjdHVhbCBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBGaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsRmluaXNoKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBvdmVydGltZSBjb3N0IGluY3VycmVkIG9uIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxPdmVydGltZUNvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldEFjdHVhbE92ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIGFtb3VudCBvZiBvdmVydGltZSB3b3JrIGluY3VycmVkIG9uIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbE92ZXJ0aW1lV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9BY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxPdmVydGltZVdvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgc3RhcnQgZGF0ZSBvZiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsU3RhcnQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQWN0dWFsU3RhcnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxTdGFydCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbFN0YXJ0IDxlbT5BY3R1YWwgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbFN0YXJ0KE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBhbW91bnQgb2Ygd29yayBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0FjdHVhbFdvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbFdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxXb3JrIDxlbT5BY3R1YWwgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbFdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgYXNzaWdubWVudCB0by1kYXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QUNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBQ1dQKCkKLQkgKiBAc2VlICN1bnNldEFDV1AoKQotCSAqIEBzZWUgI3NldEFDV1AoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9BQ1dQKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQUNXUCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEFDV1AoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QUNXUCgpCi0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QUNXUChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEFDV1AoKQotCSAqIEBzZWUgI2dldEFDV1AoKQotCSAqIEBzZWUgI3NldEFDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRBQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BQ1dQPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAc2VlICNzZXRBQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QUNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uZmlybWVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBSZXNvdXJjZSBoYXMgYWNjZXB0ZWQgYWxsIG9mIGhpcyBvciBoZXIgYXNzaWdubWVudHMuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25maXJtZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q29uZmlybWVkKCkKLQkgKiBAc2VlICN1bnNldENvbmZpcm1lZCgpCi0JICogQHNlZSAjc2V0Q29uZmlybWVkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9Db25maXJtZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvbmZpcm1lZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNDb25maXJtZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0NvbmZpcm1lZCA8ZW0+Q29uZmlybWVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db25maXJtZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q29uZmlybWVkKCkKLQkgKiBAc2VlICN1bnNldENvbmZpcm1lZCgpCi0JICogQHNlZSAjaXNDb25maXJtZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbmZpcm1lZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzQ29uZmlybWVkIDxlbT5Db25maXJtZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Q29uZmlybWVkKCkKLQkgKiBAc2VlICNpc0NvbmZpcm1lZCgpCi0JICogQHNlZSAjc2V0Q29uZmlybWVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDb25maXJtZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzQ29uZmlybWVkIDxlbT5Db25maXJtZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmZpcm1lZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0Q29uZmlybWVkKCkKLQkgKiBAc2VlICNpc0NvbmZpcm1lZCgpCi0JICogQHNlZSAjc2V0Q29uZmlybWVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDb25maXJtZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwcm9qZWN0ZWQgb3Igc2NoZWR1bGVkIGNvc3Qgb2YgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9Db3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvc3QgUmF0ZSBUYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvc3QgcmF0ZSB0YWJsZSB1c2VkIGZvciB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgUmF0ZSBUYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29zdFJhdGVUYWJsZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQ29zdFJhdGVUYWJsZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNvc3RSYXRlVGFibGVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3N0UmF0ZVRhYmxlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRDb3N0UmF0ZVRhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFJhdGVUYWJsZSA8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0IFJhdGUgVGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvc3RSYXRlVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3RSYXRlVGFibGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0IFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjb3N0IGFuZCBiYXNlbGluZSBjb3N0IGZvciBhIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI3Vuc2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRDb3N0VmFyaWFuY2UoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9Db3N0VmFyaWFuY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3N0VmFyaWFuY2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRDb3N0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDb3N0VmFyaWFuY2UgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICN1bnNldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0VmFyaWFuY2UoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRDb3N0VmFyaWFuY2UoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDb3N0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3RWYXJpYW5jZSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldENvc3RWYXJpYW5jZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldENvc3RWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q1Y8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEVhcm5lZCB2YWx1ZSBjb3N0IHZhcmlhbmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q1Y8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q1YoKQotCSAqIEBzZWUgI3Vuc2V0Q1YoKQotCSAqIEBzZWUgI3NldENWKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQ1YoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDVicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldENWKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q1YgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DVjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDVigpCi0JICogQHNlZSAjdW5zZXRDVigpCi0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENWKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENWIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRDVigpCi0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBzZWUgI3NldENWKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENWIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q1Y8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENWKCkKLQkgKiBAc2VlICNnZXRDVigpCi0JICogQHNlZSAjc2V0Q1YoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVsYXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgdGhhdCB0aGUgYXNzaWdubWVudCBpcyBkZWxheWVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVsYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlbGF5KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9EZWxheSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVsYXknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldERlbGF5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RGVsYXkgPGVtPkRlbGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWxheTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVsYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlbGF5KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaW5pc2goT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2ggVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YXJpYW5jZSBvZiB0aGUgYXNzaWdubWVudCBmaW5pc2ggZGF0ZSBmcm9tIHRoZSBiYXNlbGluZSBmaW5pc2ggZGF0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmluaXNoVmFyaWFuY2UoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0ZpbmlzaFZhcmlhbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaW5pc2hWYXJpYW5jZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RmluaXNoVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRGaW5pc2hWYXJpYW5jZSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpbmlzaFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5pc2hWYXJpYW5jZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkh5cGVybGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpdGxlIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmsoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfSHlwZXJsaW5rKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSHlwZXJsaW5rVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSHlwZXJsaW5rJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEh5cGVybGluaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGluayA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEh5cGVybGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SHlwZXJsaW5rKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SHlwZXJsaW5rQWRkcmVzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9IeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSHlwZXJsaW5rQWRkcmVzc1R5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0h5cGVybGlua0FkZHJlc3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SHlwZXJsaW5rQWRkcmVzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGlua0FkZHJlc3MgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SHlwZXJsaW5rQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SHlwZXJsaW5rQWRkcmVzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZG9jdW1lbnQgYm9va21hcmsgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEh5cGVybGlua1N1YkFkZHJlc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfSHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lkh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSHlwZXJsaW5rU3ViQWRkcmVzcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEh5cGVybGlua1N1YkFkZHJlc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YXJpYW5jZSBvZiBhc3NpZ25tZW50IHdvcmsgZnJvbSB0aGUgYmFzZWxpbmUgd29yayBhcyBtaW51dGVzIHggMTAwMC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICN1bnNldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0V29ya1ZhcmlhbmNlKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfV29ya1ZhcmlhbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV29ya1ZhcmlhbmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0V29ya1ZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29ya1ZhcmlhbmNlKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0V29ya1ZhcmlhbmNlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0V29ya1ZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRXb3JrVmFyaWFuY2UoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRXb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBVbml0cyBhcmUgRml4ZWQgUmF0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEhhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAc2VlICN1bnNldEhhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAc2VlICNzZXRIYXNGaXhlZFJhdGVVbml0cyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfSGFzRml4ZWRSYXRlVW5pdHMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0hhc0ZpeGVkUmF0ZVVuaXRzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0hhc0ZpeGVkUmF0ZVVuaXRzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNIYXNGaXhlZFJhdGVVbml0cyA8ZW0+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEhhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAc2VlICN1bnNldEhhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAc2VlICNpc0hhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIYXNGaXhlZFJhdGVVbml0cyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzSGFzRml4ZWRSYXRlVW5pdHMgPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEhhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAc2VlICNpc0hhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAc2VlICNzZXRIYXNGaXhlZFJhdGVVbml0cyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SGFzRml4ZWRSYXRlVW5pdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzSGFzRml4ZWRSYXRlVW5pdHMgPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYXMgRml4ZWQgUmF0ZSBVbml0czwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SGFzRml4ZWRSYXRlVW5pdHMoKQotCSAqIEBzZWUgI2lzSGFzRml4ZWRSYXRlVW5pdHMoKQotCSAqIEBzZWUgI3NldEhhc0ZpeGVkUmF0ZVVuaXRzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRIYXNGaXhlZFJhdGVVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Rml4ZWQgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIGNvbnN1bXB0aW9uIG9mIHRoZSBhc3NpZ25lZCBtYXRlcmlhbCByZXNvdXJjZSBvY2N1cnMgaW4gYSBzaW5nbGUsIGZpeGVkIGFtb3VudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpeGVkIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEZpeGVkTWF0ZXJpYWwoKQotCSAqIEBzZWUgI3Vuc2V0Rml4ZWRNYXRlcmlhbCgpCi0JICogQHNlZSAjc2V0Rml4ZWRNYXRlcmlhbChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfRml4ZWRNYXRlcmlhbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRml4ZWRNYXRlcmlhbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNGaXhlZE1hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNGaXhlZE1hdGVyaWFsIDxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Rml4ZWQgTWF0ZXJpYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Rml4ZWRNYXRlcmlhbCgpCi0JICogQHNlZSAjdW5zZXRGaXhlZE1hdGVyaWFsKCkKLQkgKiBAc2VlICNpc0ZpeGVkTWF0ZXJpYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpeGVkTWF0ZXJpYWwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0ZpeGVkTWF0ZXJpYWwgPGVtPkZpeGVkIE1hdGVyaWFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEZpeGVkTWF0ZXJpYWwoKQotCSAqIEBzZWUgI2lzRml4ZWRNYXRlcmlhbCgpCi0JICogQHNlZSAjc2V0Rml4ZWRNYXRlcmlhbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Rml4ZWRNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNGaXhlZE1hdGVyaWFsIDxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Rml4ZWQgTWF0ZXJpYWw8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEZpeGVkTWF0ZXJpYWwoKQotCSAqIEBzZWUgI2lzRml4ZWRNYXRlcmlhbCgpCi0JICogQHNlZSAjc2V0Rml4ZWRNYXRlcmlhbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Rml4ZWRNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGV2ZWxpbmcgRGVsYXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWxheSBjYXVzZWQgYnkgbGV2ZWxpbmcuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbGluZyBEZWxheTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGV2ZWxpbmdEZWxheShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfTGV2ZWxpbmdEZWxheSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGV2ZWxpbmdEZWxheScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TGV2ZWxpbmdEZWxheSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldExldmVsaW5nRGVsYXkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbGluZyBEZWxheTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGV2ZWxpbmdEZWxheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGV2ZWxpbmdEZWxheShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgZHVyYXRpb24gb2YgdGhlIGRlbGF5LiAgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAyMT1udWxsLCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9MZXZlbGluZ0RlbGF5Rm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xldmVsaW5nRGVsYXlGb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldExldmVsaW5nRGVsYXlGb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0IDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGV2ZWxpbmdEZWxheUZvcm1hdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxpbmtlZCBGaWVsZHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIFByb2plY3QgaXMgbGlua2VkIHRvIGFub3RoZXIgT0xFIG9iamVjdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxpbmtlZCBGaWVsZHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TGlua2VkRmllbGRzKCkKLQkgKiBAc2VlICN1bnNldExpbmtlZEZpZWxkcygpCi0JICogQHNlZSAjc2V0TGlua2VkRmllbGRzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9MaW5rZWRGaWVsZHMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xpbmtlZEZpZWxkcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNMaW5rZWRGaWVsZHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0xpbmtlZEZpZWxkcyA8ZW0+TGlua2VkIEZpZWxkczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGlua2VkIEZpZWxkczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRMaW5rZWRGaWVsZHMoKQotCSAqIEBzZWUgI3Vuc2V0TGlua2VkRmllbGRzKCkKLQkgKiBAc2VlICNpc0xpbmtlZEZpZWxkcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGlua2VkRmllbGRzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNMaW5rZWRGaWVsZHMgPGVtPkxpbmtlZCBGaWVsZHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TGlua2VkRmllbGRzKCkKLQkgKiBAc2VlICNpc0xpbmtlZEZpZWxkcygpCi0JICogQHNlZSAjc2V0TGlua2VkRmllbGRzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRMaW5rZWRGaWVsZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzTGlua2VkRmllbGRzIDxlbT5MaW5rZWQgRmllbGRzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rZWQgRmllbGRzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRMaW5rZWRGaWVsZHMoKQotCSAqIEBzZWUgI2lzTGlua2VkRmllbGRzKCkKLQkgKiBAc2VlICNzZXRMaW5rZWRGaWVsZHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldExpbmtlZEZpZWxkcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWlsZXN0b25lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBhc3NpZ25tZW50IGlzIGEgbWlsZXN0b25lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWlsZXN0b25lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1pbGVzdG9uZSgpCi0JICogQHNlZSAjdW5zZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI3NldE1pbGVzdG9uZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfTWlsZXN0b25lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNaWxlc3RvbmUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTWlsZXN0b25lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWlsZXN0b25lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1pbGVzdG9uZSgpCi0JICogQHNlZSAjdW5zZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNaWxlc3RvbmUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc01pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1pbGVzdG9uZSgpCi0JICogQHNlZSAjaXNNaWxlc3RvbmUoKQotCSAqIEBzZWUgI3NldE1pbGVzdG9uZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TWlsZXN0b25lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc01pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaWxlc3RvbmU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE1pbGVzdG9uZSgpCi0JICogQHNlZSAjaXNNaWxlc3RvbmUoKQotCSAqIEBzZWUgI3NldE1pbGVzdG9uZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TWlsZXN0b25lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGV4dCBub3RlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob3RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm90ZXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfTm90ZXMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTm90ZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Tm90ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXROb3RlcyA8ZW0+Tm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vdGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Tm90ZXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk92ZXJhbGxvY2F0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIGFzc2lnbm1lbnQgaXMgb3ZlcmFsbG9jYXRlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJhbGxvY2F0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0T3ZlcmFsbG9jYXRlZCgpCi0JICogQHNlZSAjdW5zZXRPdmVyYWxsb2NhdGVkKCkKLQkgKiBAc2VlICNzZXRPdmVyYWxsb2NhdGVkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9PdmVyYWxsb2NhdGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVyYWxsb2NhdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc092ZXJhbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc092ZXJhbGxvY2F0ZWQgPGVtPk92ZXJhbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJhbGxvY2F0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0T3ZlcmFsbG9jYXRlZCgpCi0JICogQHNlZSAjdW5zZXRPdmVyYWxsb2NhdGVkKCkKLQkgKiBAc2VlICNpc092ZXJhbGxvY2F0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE92ZXJhbGxvY2F0ZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc092ZXJhbGxvY2F0ZWQgPGVtPk92ZXJhbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0T3ZlcmFsbG9jYXRlZCgpCi0JICogQHNlZSAjaXNPdmVyYWxsb2NhdGVkKCkKLQkgKiBAc2VlICNzZXRPdmVyYWxsb2NhdGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRPdmVyYWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc092ZXJhbGxvY2F0ZWQgPGVtPk92ZXJhbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJhbGxvY2F0ZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE92ZXJhbGxvY2F0ZWQoKQotCSAqIEBzZWUgI2lzT3ZlcmFsbG9jYXRlZCgpCi0JICogQHNlZSAjc2V0T3ZlcmFsbG9jYXRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0T3ZlcmFsbG9jYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHN1bSBvZiB0aGUgYWN0dWFsIGFuZCByZW1haW5pbmcgb3ZlcnRpbWUgY29zdCBvZiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfT3ZlcnRpbWVDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVydGltZUNvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldE92ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE92ZXJ0aW1lQ29zdCA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZUNvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2NoZWR1bGVkIG92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE92ZXJ0aW1lV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9PdmVydGltZVdvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVydGltZVdvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0T3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE92ZXJ0aW1lV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVndWxhciBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIG5vbi1vdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWd1bGFyIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlZ3VsYXJXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1JlZ3VsYXJXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVndWxhcldvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVndWxhcldvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZWd1bGFyV29yayA8ZW0+UmVndWxhciBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWd1bGFyIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlZ3VsYXJXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWd1bGFyV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgcHJvamVjdGVkIGNvc3Qgb2YgY29tcGxldGluZyB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZW1haW5pbmdDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9SZW1haW5pbmdDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRSZW1haW5pbmdDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgcHJvamVjdGVkIG92ZXJ0aW1lIGNvc3Qgb2YgY29tcGxldGluZyB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZW1haW5pbmdPdmVydGltZUNvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1JlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nT3ZlcnRpbWVDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdPdmVydGltZUNvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHJlbWFpbmluZyBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCB0byBjb21wbGV0ZSB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nT3ZlcnRpbWVXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgd29yayBzY2hlZHVsZWQgdG8gY29tcGxldGUgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9SZW1haW5pbmdXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSZW1haW5pbmdXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nV29yayA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNwb25zZSBQZW5kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUcnVlIGlmIGEgcmVzcG9uc2UgaGFzIG5vdCBiZWVuIHJlY2VpdmVkIGZvciBhIFRlYW1Bc3NpZ24gbWVzc2FnZS4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlc3BvbnNlUGVuZGluZygpCi0JICogQHNlZSAjdW5zZXRSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBzZWUgI3NldFJlc3BvbnNlUGVuZGluZyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfUmVzcG9uc2VQZW5kaW5nKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXNwb25zZVBlbmRpbmcnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUmVzcG9uc2VQZW5kaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNSZXNwb25zZVBlbmRpbmcgPGVtPlJlc3BvbnNlIFBlbmRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc3BvbnNlIFBlbmRpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UmVzcG9uc2VQZW5kaW5nKCkKLQkgKiBAc2VlICN1bnNldFJlc3BvbnNlUGVuZGluZygpCi0JICogQHNlZSAjaXNSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc3BvbnNlUGVuZGluZyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzUmVzcG9uc2VQZW5kaW5nIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJlc3BvbnNlUGVuZGluZygpCi0JICogQHNlZSAjaXNSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBzZWUgI3NldFJlc3BvbnNlUGVuZGluZyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UmVzcG9uc2VQZW5kaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1Jlc3BvbnNlUGVuZGluZyA8ZW0+UmVzcG9uc2UgUGVuZGluZzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzcG9uc2UgUGVuZGluZzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UmVzcG9uc2VQZW5kaW5nKCkKLQkgKiBAc2VlICNpc1Jlc3BvbnNlUGVuZGluZygpCi0JICogQHNlZSAjc2V0UmVzcG9uc2VQZW5kaW5nKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSZXNwb25zZVBlbmRpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2NoZWR1bGVkIHN0YXJ0IGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhcnQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfU3RhcnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFydCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RvcDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhhdCB0aGUgYXNzaWdubWVudCB3YXMgc3RvcHBlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0b3A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0b3AoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfU3RvcCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0b3AnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0U3RvcCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0b3AgPGVtPlN0b3A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0b3A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0b3AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0b3AoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3VtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhhdCB0aGUgYXNzaWdubWVudCByZXN1bWVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXN1bWUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfUmVzdW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVzdW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlc3VtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlc3VtZSA8ZW0+UmVzdW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN1bWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlc3VtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVzdW1lKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydCBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhcmlhbmNlIG9mIHRoZSBhc3NpZ25tZW50IHN0YXJ0IGRhdGUgZnJvbSB0aGUgYmFzZWxpbmUgc3RhcnQgZGF0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFydFZhcmlhbmNlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9TdGFydFZhcmlhbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFydFZhcmlhbmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRTdGFydFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RhcnRWYXJpYW5jZSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdGFydFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydFZhcmlhbmNlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VW5pdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBudW1iZXIgb2YgdW5pdHMgZm9yIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5pdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VW5pdHMoKQotCSAqIEBzZWUgI3Vuc2V0VW5pdHMoKQotCSAqIEBzZWUgI3NldFVuaXRzKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfVW5pdHMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVbml0cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldFVuaXRzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VW5pdHMgPGVtPlVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vbml0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRVbml0cygpCi0JICogQHNlZSAjdW5zZXRVbml0cygpCi0JICogQHNlZSAjZ2V0VW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVuaXRzKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFVuaXRzIDxlbT5Vbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRVbml0cygpCi0JICogQHNlZSAjZ2V0VW5pdHMoKQotCSAqIEBzZWUgI3NldFVuaXRzKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VW5pdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFVuaXRzIDxlbT5Vbml0czwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5pdHM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFVuaXRzKCkKLQkgKiBAc2VlICNnZXRVbml0cygpCi0JICogQHNlZSAjc2V0VW5pdHMoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXBkYXRlIE5lZWRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVHJ1ZSBpZiB0aGUgcmVzb3VyY2UgYXNzaWduZWQgdG8gYSB0YXNrIG5lZWRzIHRvIGJlIHVwZGF0ZWQgYXMgdG8gdGhlIHN0YXR1cyBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VXBkYXRlTmVlZGVkKCkKLQkgKiBAc2VlICN1bnNldFVwZGF0ZU5lZWRlZCgpCi0JICogQHNlZSAjc2V0VXBkYXRlTmVlZGVkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9VcGRhdGVOZWVkZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1VwZGF0ZU5lZWRlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNVcGRhdGVOZWVkZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1VwZGF0ZU5lZWRlZCA8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRVcGRhdGVOZWVkZWQoKQotCSAqIEBzZWUgI3Vuc2V0VXBkYXRlTmVlZGVkKCkKLQkgKiBAc2VlICNpc1VwZGF0ZU5lZWRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXBkYXRlTmVlZGVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNVcGRhdGVOZWVkZWQgPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VXBkYXRlTmVlZGVkKCkKLQkgKiBAc2VlICNpc1VwZGF0ZU5lZWRlZCgpCi0JICogQHNlZSAjc2V0VXBkYXRlTmVlZGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRVcGRhdGVOZWVkZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzVXBkYXRlTmVlZGVkIDxlbT5VcGRhdGUgTmVlZGVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VcGRhdGUgTmVlZGVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRVcGRhdGVOZWVkZWQoKQotCSAqIEBzZWUgI2lzVXBkYXRlTmVlZGVkKCkKLQkgKiBAc2VlICNzZXRVcGRhdGVOZWVkZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFVwZGF0ZU5lZWRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VkFDPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGJhc2xpbmUgY29zdCBhbmQgdG90YWwgY29zdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZBQzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRWQUMoKQotCSAqIEBzZWUgI3Vuc2V0VkFDKCkKLQkgKiBAc2VlICNzZXRWQUMoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9WQUMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWQUMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRWQUMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRWQUMgPGVtPlZBQzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VkFDPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFZBQygpCi0JICogQHNlZSAjdW5zZXRWQUMoKQotCSAqIEBzZWUgI2dldFZBQygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VkFDKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFZBQyA8ZW0+VkFDPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFZBQygpCi0JICogQHNlZSAjZ2V0VkFDKCkKLQkgKiBAc2VlICNzZXRWQUMoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRWQUMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFZBQyA8ZW0+VkFDPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WQUM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFZBQygpCi0JICogQHNlZSAjZ2V0VkFDKCkKLQkgKiBAc2VlICNzZXRWQUMoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRWQUMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2Ygc2NoZWR1bGVkIHdvcmsgZm9yIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9Xb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29yayA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yayBDb250b3VyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgd29yayBjb250b3VyIG9mIHRoZSBhc3NpZ25tZW50LiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1GbGF0LCAxPUJhY2sgTG9hZGVkLCAyPUZyb250IExvYWRlZCwgMz1Eb3VibGUgUGVhaywgND1FYXJseSBQZWFrLCA1PUxhdGUgUGVhaywgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY9QmVsbCwgNz1UdXJ0bGUsIDg9Q29udG91cmVkCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIENvbnRvdXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdvcmtDb250b3VyKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9Xb3JrQ29udG91cigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtDb250b3VyVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV29ya0NvbnRvdXInIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFdvcmtDb250b3VyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29ya0NvbnRvdXIgPGVtPldvcmsgQ29udG91cjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBDb250b3VyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JrQ29udG91cigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29ya0NvbnRvdXIoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CQ1dTPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIG9uIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9CQ1dTKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQkNXUycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEJDV1MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QkNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIGFzc2lnbm1lbnQgdG8tZGF0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQkNXUCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1AnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJDV1AoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJvb2tpbmcgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHRoZSBib29raW5nIHR5cGUgb2YgdGhlIGFzc2lnbm1lbnQuIDE9Q29tbWl0ZWQsIDI9UHJvcG9zZWQKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJvb2tpbmcgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Qm9va2luZ1R5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0Jvb2tpbmdUeXBlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQm9va2luZ1R5cGVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCb29raW5nVHlwZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0Qm9va2luZ1R5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCb29raW5nVHlwZSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Cb29raW5nIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJvb2tpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCb29raW5nVHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCB3b3JrIGlzIHByb3RlY3RlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsV29ya1Byb3RlY3RlZChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9BY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsV29ya1Byb3RlY3RlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCBvdmVydGltZSB3b3JrIGlzIHByb3RlY3RlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JlYXRpb24gRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhhdCB0aGUgYXNzaWdubWVudCB3YXMgY3JlYXRlZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3JlYXRpb25EYXRlKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0NyZWF0aW9uRGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NyZWF0aW9uRGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRDcmVhdGlvbkRhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDcmVhdGlvbkRhdGUgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3JlYXRpb25EYXRlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFsdWUgb2YgYW4gZXh0ZW5kZWQgYXR0cmlidXRlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIGJhY2sgdG8gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSB0YWJsZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSB1bmlxdWUgSUQgb3IgdGhlIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZCBJRCwgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0V4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVuZGVkQXR0cmlidXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2VsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvbGxlY3Rpb24gb2YgYmFzZWxpbmUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2VsaW5lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQmFzZWxpbmUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQmFzZWxpbmUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRCYXNlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpbWUgcGhhc2VkIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfVGltZXBoYXNlZERhdGEoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGltZXBoYXNlZERhdGEnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRUaW1lcGhhc2VkRGF0YSgpOwotCi19IC8vIEFzc2lnbm1lbnQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQXNzaWdubWVudHMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQXNzaWdubWVudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE4MGNlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Fzc2lnbm1lbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFzc2lnbm1lbnRzLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFzc2lnbm1lbnRzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHMjZ2V0QXNzaWdubWVudCA8ZW0+QXNzaWdubWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdBc3NpZ25tZW50c18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBc3NpZ25tZW50cyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFzc2lnbm1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgYXNzaWdubWVudCBpbiBlYWNoIEFzc2lnbm1lbnRzIGNvbGxlY3Rpb24uCi0JICogICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3NpZ25tZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRzX0Fzc2lnbm1lbnQoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Fzc2lnbm1lbnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRBc3NpZ25tZW50KCk7Ci0KLX0gLy8gQXNzaWdubWVudHMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQXZhaWxhYmlsaXR5UGVyaW9kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0F2YWlsYWJpbGl0eVBlcmlvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTdkODA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQXZhaWxhYmlsaXR5UGVyaW9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBdmFpbGFiaWxpdHlQZXJpb2QuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdmFpbGFiaWxpdHkgUGVyaW9kPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZUZyb20gPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVUbyA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVVbml0cyA8ZW0+QXZhaWxhYmxlIFVuaXRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdBdmFpbGFiaWxpdHlQZXJpb2RfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXZhaWxhYmlsaXR5UGVyaW9kIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXZhaWxhYmxlIEZyb208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIHJlc291cmNlIGJlY29tZXMgYXZhaWxhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHBlcmlvZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgRnJvbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXZhaWxhYmxlRnJvbShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kX0F2YWlsYWJsZUZyb20oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdmFpbGFibGVGcm9tJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEF2YWlsYWJsZUZyb20oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZUZyb20gPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgRnJvbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXZhaWxhYmxlRnJvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXZhaWxhYmxlRnJvbShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXZhaWxhYmxlIFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGFzdCBkYXRlIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBwZXJpb2QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmxlIFRvPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdmFpbGFibGVUbyhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kX0F2YWlsYWJsZVRvKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXZhaWxhYmxlVG8nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QXZhaWxhYmxlVG8oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZVRvIDxlbT5BdmFpbGFibGUgVG88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF2YWlsYWJsZSBUbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVG8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF2YWlsYWJsZVRvKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdmFpbGFibGUgVW5pdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwZXJjZW50YWdlIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZSBkdXJpbmcgdGhlIHNwZWNpZmllZCBwZXJpb2QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmxlIFVuaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICN1bnNldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICNzZXRBdmFpbGFibGVVbml0cyhmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBdmFpbGFiaWxpdHlQZXJpb2RfQXZhaWxhYmxlVW5pdHMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdmFpbGFibGVVbml0cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEF2YWlsYWJsZVVuaXRzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVVbml0cyA8ZW0+QXZhaWxhYmxlIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgVW5pdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QXZhaWxhYmxlVW5pdHMoKQotCSAqIEBzZWUgI3Vuc2V0QXZhaWxhYmxlVW5pdHMoKQotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdmFpbGFibGVVbml0cyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZVVuaXRzIDxlbT5BdmFpbGFibGUgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QXZhaWxhYmxlVW5pdHMoKQotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICNzZXRBdmFpbGFibGVVbml0cyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEF2YWlsYWJsZVVuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZVVuaXRzIDxlbT5BdmFpbGFibGUgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QXZhaWxhYmxlVW5pdHMoKQotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICNzZXRBdmFpbGFibGVVbml0cyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEF2YWlsYWJsZVVuaXRzKCk7Ci0KLX0gLy8gQXZhaWxhYmlsaXR5UGVyaW9kCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0F2YWlsYWJpbGl0eVBlcmlvZHMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQXZhaWxhYmlsaXR5UGVyaW9kcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGRlOTZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQXZhaWxhYmlsaXR5UGVyaW9kcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBdmFpbGFiaWxpdHlQZXJpb2RzLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kcyNnZXRBdmFpbGFiaWxpdHlQZXJpb2QgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdBdmFpbGFiaWxpdHlQZXJpb2RzXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEF2YWlsYWJpbGl0eVBlcmlvZHMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdmFpbGFiaWxpdHkgUGVyaW9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBlcmlvZCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kc19BdmFpbGFiaWxpdHlQZXJpb2QoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXZhaWxhYmlsaXR5UGVyaW9kJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCk7Ci0KLX0gLy8gQXZhaWxhYmlsaXR5UGVyaW9kcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9CYXNlbGluZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9CYXNlbGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzVhZGQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQmFzZWxpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJhc2VsaW5lLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmFzZWxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldE51bWJlciA8ZW0+TnVtYmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzSW50ZXJpbSA8ZW0+SW50ZXJpbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0RHVyYXRpb24gPGVtPkR1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjaXNFc3RpbWF0ZWREdXJhdGlvbiA8ZW0+RXN0aW1hdGVkIER1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldFdvcmsgPGVtPldvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1AgPGVtPkJDV1A8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQmFzZWxpbmVfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmFzZWxpbmUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdGltZSBwaGFzZWQgZGF0YSBibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2sgYmFzZWxpbmUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX1RpbWVwaGFzZWREYXRhKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RpbWVwaGFzZWREYXRhJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0VGltZXBoYXNlZERhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk51bWJlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBudW1iZXIgb2YgdGhlIGJhc2VsaW5lIGRhdGEgcmVjb3JkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk51bWJlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TnVtYmVyKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfTnVtYmVyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOdW1iZXInIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldE51bWJlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TnVtYmVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE51bWJlcihCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkludGVyaW08L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhpcyBpcyBhbiBJbnRlcmltIEJhc2VsaW5lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkludGVyaW08L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SW50ZXJpbSgpCi0JICogQHNlZSAjdW5zZXRJbnRlcmltKCkKLQkgKiBAc2VlICNzZXRJbnRlcmltKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfSW50ZXJpbSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ludGVyaW0nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSW50ZXJpbSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNpc0ludGVyaW0gPGVtPkludGVyaW08L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkludGVyaW08L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SW50ZXJpbSgpCi0JICogQHNlZSAjdW5zZXRJbnRlcmltKCkKLQkgKiBAc2VlICNpc0ludGVyaW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEludGVyaW0oYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjaXNJbnRlcmltIDxlbT5JbnRlcmltPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEludGVyaW0oKQotCSAqIEBzZWUgI2lzSW50ZXJpbSgpCi0JICogQHNlZSAjc2V0SW50ZXJpbShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SW50ZXJpbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzSW50ZXJpbSA8ZW0+SW50ZXJpbTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJpbTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SW50ZXJpbSgpCi0JICogQHNlZSAjaXNJbnRlcmltKCkKLQkgKiBAc2VlICNzZXRJbnRlcmltKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJbnRlcmltKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhcnQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX1N0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhcnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0U3RhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXJ0KE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmluaXNoKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZV9GaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaW5pc2gnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RmluaXNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EdXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBkdXJhdGlvbiBvZiB0aGUgdGFzayB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldER1cmF0aW9uKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZV9EdXJhdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0R1cmF0aW9uJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldER1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldER1cmF0aW9uIDxlbT5EdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldER1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREdXJhdGlvbihPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RHVyYXRpb24gRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBEdXJhdGlvbiBvZiB0aGUgVGFzayBiYXNlbGluZS4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgMjA9ZSUsIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX0R1cmF0aW9uRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRHVyYXRpb25Gb3JtYXRUeXBlMSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRHVyYXRpb25Gb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldER1cmF0aW9uRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXN0aW1hdGVkIER1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBiYXNlbGluZSBkdXJhdGlvbiBvZiB0aGUgdGFzayB3YXMgZXN0aW1hdGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRlZCBEdXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFc3RpbWF0ZWREdXJhdGlvbigpCi0JICogQHNlZSAjdW5zZXRFc3RpbWF0ZWREdXJhdGlvbigpCi0JICogQHNlZSAjc2V0RXN0aW1hdGVkRHVyYXRpb24oYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZV9Fc3RpbWF0ZWREdXJhdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGVkRHVyYXRpb24nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRXN0aW1hdGVkRHVyYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjaXNFc3RpbWF0ZWREdXJhdGlvbiA8ZW0+RXN0aW1hdGVkIER1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI3Vuc2V0RXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI2lzRXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVzdGltYXRlZER1cmF0aW9uKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzRXN0aW1hdGVkRHVyYXRpb24gPGVtPkVzdGltYXRlZCBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRFc3RpbWF0ZWREdXJhdGlvbigpCi0JICogQHNlZSAjaXNFc3RpbWF0ZWREdXJhdGlvbigpCi0JICogQHNlZSAjc2V0RXN0aW1hdGVkRHVyYXRpb24oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEVzdGltYXRlZER1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjaXNFc3RpbWF0ZWREdXJhdGlvbiA8ZW0+RXN0aW1hdGVkIER1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEVzdGltYXRlZER1cmF0aW9uKCkKLQkgKiBAc2VlICNpc0VzdGltYXRlZER1cmF0aW9uKCkKLQkgKiBAc2VlICNzZXRFc3RpbWF0ZWREdXJhdGlvbihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RXN0aW1hdGVkRHVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgd29yayBvZiB0aGUgdGFzayB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0V29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcHJvamVjdGVkIGNvc3Qgb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZV9Db3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CQ1dTPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfQkNXUygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCQ1dTKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSB0YXNrIHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfQkNXUCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1AnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCQ1dQKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1AoKTsKLQotfSAvLyBCYXNlbGluZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9CYXNlbGluZTIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQmFzZWxpbmUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYTc3MWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9CYXNlbGluZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJhc2VsaW5lMi5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmFzZWxpbmUyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldE51bWJlciA8ZW0+TnVtYmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUyKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdCYXNlbGluZV8uXzFfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmFzZWxpbmUyIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TnVtYmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIG51bWJlciBvZiB0aGUgYmFzZWxpbmUgZGF0YSByZWNvcmQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TnVtYmVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROdW1iZXIoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTJfTnVtYmVyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTnVtYmVyJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXROdW1iZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldE51bWJlciA8ZW0+TnVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OdW1iZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE51bWJlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TnVtYmVyKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHdvcmsgYXNzaWduZWQgdGhlIHJlc291cmNlIHdoZW4gdGhlIGJhc2VsaW5lIGlzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lMl9Xb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcHJvamVjdGVkIGNvc3QgZm9yIHRoZSByZXNvdXJjZSB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDb3N0KCkKLQkgKiBAc2VlICN1bnNldENvc3QoKQotCSAqIEBzZWUgI3NldENvc3QoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUyX0Nvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0Q29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDb3N0KCkKLQkgKiBAc2VlICN1bnNldENvc3QoKQotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3QoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRDb3N0IDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENvc3QoKQotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBzZWUgI3NldENvc3QoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENvc3QoKQotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBzZWUgI3NldENvc3QoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CQ1dTPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYnVkZ2V0IGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTJfQkNXUygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXRlZCBjb3N0IG9mIG9mIHRoZSB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwcm9qZWN0IHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUyX0JDV1AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dQJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJDV1AoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dQKCk7Ci0KLX0gLy8gQmFzZWxpbmUyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Jhc2VsaW5lMy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9CYXNlbGluZTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5YTZjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Jhc2VsaW5lMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQmFzZWxpbmUzLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2VsaW5lMzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lMygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQmFzZWxpbmVfLl8yXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJhc2VsaW5lMyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRpbWVwaGFzZWQgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0aW1lIHBoYXNlZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgQmFzZWxpbmUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUzX1RpbWVwaGFzZWREYXRhKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RpbWVwaGFzZWREYXRhJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0VGltZXBoYXNlZERhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk51bWJlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBudW1iZXIgb2YgdGhlIGJhc2VsaW5lIGRhdGEgcmVjb3JkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TnVtYmVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROdW1iZXIoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lM19OdW1iZXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J051bWJlcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROdW1iZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldE51bWJlciA8ZW0+TnVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OdW1iZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE51bWJlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TnVtYmVyKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50IHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFydChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUzX1N0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUzX0ZpbmlzaCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaW5pc2gnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmluaXNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmlzaChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRvdGFsIGFtb3VudCBvZiB3b3JrIHNjaGVkdWxlZCBvbiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTNfV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0V29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0V29yayA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRvdGFsIHByb2plY3RlZCBjb3N0IG9mIHRoZSBhc3NpZ25tZW50IHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvc3QoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lM19Db3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Nvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29zdChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBvbiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lM19CQ1dTKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQkNXUycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEJDV1MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCQ1dTKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QkNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIGFzc2lnbm1lbnQgdG8tZGF0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lM19CQ1dQKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQkNXUCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEJDV1AoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCQ1dQKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QkNXUCgpOwotCi19IC8vIEJhc2VsaW5lMwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9DYWxlbmRhci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9DYWxlbmRhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjk1ZDAzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQ2FsZW5kYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENhbGVuZGFyLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYWxlbmRhcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjaXNJc0Jhc2VDYWxlbmRhciA8ZW0+SXMgQmFzZSBDYWxlbmRhcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRCYXNlQ2FsZW5kYXJVSUQgPGVtPkJhc2UgQ2FsZW5kYXIgVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2dldFdlZWtEYXlzIDxlbT5XZWVrIERheXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRDYWxlbmRhcigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ2FsZW5kYXJfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2FsZW5kYXIgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY2FsZW5kYXIuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRDYWxlbmRhcl9VSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRVSUQgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBuYW1lIG9mIHRoZSBjYWxlbmRhci4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0Q2FsZW5kYXJfTmFtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk5hbWVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOYW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgQmFzZSBDYWxlbmRhcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgY2FsZW5kYXIgaXMgYSBiYXNlIGNhbGVuZGFyLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNCYXNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI3Vuc2V0SXNCYXNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI3NldElzQmFzZUNhbGVuZGFyKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0Q2FsZW5kYXJfSXNCYXNlQ2FsZW5kYXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0lzQmFzZUNhbGVuZGFyJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzQmFzZUNhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2lzSXNCYXNlQ2FsZW5kYXIgPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNCYXNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI3Vuc2V0SXNCYXNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI2lzSXNCYXNlQ2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzQmFzZUNhbGVuZGFyKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2lzSXNCYXNlQ2FsZW5kYXIgPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNCYXNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI2lzSXNCYXNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI3NldElzQmFzZUNhbGVuZGFyKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc0Jhc2VDYWxlbmRhcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2lzSXNCYXNlQ2FsZW5kYXIgPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNpc0lzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNzZXRJc0Jhc2VDYWxlbmRhcihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNCYXNlQ2FsZW5kYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgQ2FsZW5kYXIgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGJhc2UgY2FsZW5kYXIgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB3aGljaCB0aGlzIGNhbGVuZGFyIGRlcGVuZHMuIE9ubHkgYXBwbGljYWJsZSBpZiB0aGUgY2FsZW5kYXIgaXMgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYSBiYXNlIGNhbGVuZGFyLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIENhbGVuZGFyIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QmFzZUNhbGVuZGFyVUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0Q2FsZW5kYXJfQmFzZUNhbGVuZGFyVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCYXNlQ2FsZW5kYXJVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEJhc2VDYWxlbmRhclVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRCYXNlQ2FsZW5kYXJVSUQgPGVtPkJhc2UgQ2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIENhbGVuZGFyIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QmFzZUNhbGVuZGFyVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCYXNlQ2FsZW5kYXJVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XZWVrIERheXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIFdlZWtkYXlzIHRoYXQgZGVmaW5lcyB0aGlzIGNhbGVuZGFyLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldlZWsgRGF5czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0V2Vla0RheXMoV2Vla0RheXMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0Q2FsZW5kYXJfV2Vla0RheXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXZWVrRGF5cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlZWtEYXlzIGdldFdlZWtEYXlzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2dldFdlZWtEYXlzIDxlbT5XZWVrIERheXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldlZWsgRGF5czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0V2Vla0RheXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdlZWtEYXlzKFdlZWtEYXlzIHZhbHVlKTsKLQotfSAvLyBDYWxlbmRhcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9DYWxlbmRhcnMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQ2FsZW5kYXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYjYyY2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9DYWxlbmRhcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ2FsZW5kYXJzLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNhbGVuZGFyczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFycyNnZXRDYWxlbmRhciA8ZW0+Q2FsZW5kYXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRDYWxlbmRhcnMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NhbGVuZGFyc18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDYWxlbmRhcnMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWxlbmRhcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQ2FsZW5kYXJzIGFyZSB1c2VkIHRvIGRlZmluZSBzdGFuZGFyZCB3b3JraW5nIGFuZCAKLQkgKiAgICAgICAgICAgICAgICAgICAgIG5vbi13b3JraW5nIHRpbWVzLiBQcm9qZWN0cyBtdXN0IGhhdmUgb25lIGJhc2UgY2FsZW5kYXIuIFRhc2tzIGFuZCByZXNvdXJjZXMgCi0JICogICAgICAgICAgICAgICAgICAgICBtYXkgaGF2ZSB0aGVpciBvd24gbm9uLWJhc2UgY2FsZW5kYXJzIHdoaWNoIGFyZSBiYXNlZCBvbiBhIGJhc2UgY2FsZW5kYXIuCi0JICogICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FsZW5kYXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0Q2FsZW5kYXJzX0NhbGVuZGFyKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NhbGVuZGFyJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0Q2FsZW5kYXIoKTsKLQotfSAvLyBDYWxlbmRhcnMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRG9jdW1lbnRSb290LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0RvY3VtZW50Um9vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjc3NTU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRG9jdW1lbnRSb290LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEb2N1bWVudFJvb3QuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvY3VtZW50IFJvb3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCNnZXRYTUxOU1ByZWZpeE1hcCA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0WFNJU2NoZW1hTG9jYXRpb24gPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldFByb2plY3QgPGVtPlByb2plY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXREb2N1bWVudFJvb3QoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9Jycga2luZD0nbWl4ZWQnIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvY3VtZW50Um9vdCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1peGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NaXhlZDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1peGVkPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldERvY3VtZW50Um9vdF9NaXhlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudFdpbGRjYXJkJyBuYW1lPSc6bWl4ZWQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldE1peGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YTUxOUyBQcmVmaXggTWFwPC9iPjwvZW0+JyBtYXAuCi0JICogVGhlIGtleSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiBhbmQgdGhlIHZhbHVlIGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+JyBtYXAgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT4nIG1hcC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKQotCSAqIEBtb2RlbCBtYXBUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIGtleVR5cGU9ImphdmEubGFuZy5TdHJpbmciIHZhbHVlVHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3htbG5zOnByZWZpeCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVNYXAgZ2V0WE1MTlNQcmVmaXhNYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcC4KLQkgKiBUaGUga2V5IGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIGFuZCB0aGUgdmFsdWUgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nIG1hcCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicgbWFwLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldERvY3VtZW50Um9vdF9YU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQG1vZGVsIG1hcFR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIga2V5VHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdmFsdWVUeXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0neHNpOnNjaGVtYUxvY2F0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRU1hcCBnZXRYU0lTY2hlbWFMb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvamVjdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHByb2plY3QgaXMgdGhlIHRvcCBsZXZlbCBlbGVtZW50IG9mIHRoZSBkb2N1bWVudC4KLQkgKiAJCQkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvamVjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJvamVjdChQcm9qZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldERvY3VtZW50Um9vdF9Qcm9qZWN0KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgdXBwZXI9Ii0yIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcm9qZWN0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCNnZXRQcm9qZWN0IDxlbT5Qcm9qZWN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgdmFsdWUpOwotCi19IC8vIERvY3VtZW50Um9vdApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTkzNzgzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4dGVuZGVkQXR0cmlidXRlLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRGaWVsZE5hbWUgPGVtPkZpZWxkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFBob25ldGljQWxpYXMgPGVtPlBob25ldGljIEFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFJvbGx1cFR5cGUgPGVtPlJvbGx1cCBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldENhbGN1bGF0aW9uVHlwZSA8ZW0+Q2FsY3VsYXRpb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRGb3JtdWxhIDxlbT5Gb3JtdWxhPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2lzUmVzdHJpY3RWYWx1ZXMgPGVtPlJlc3RyaWN0IFZhbHVlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIgPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2lzQXBwZW5kTmV3VmFsdWVzIDxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXREZWZhdWx0IDxlbT5EZWZhdWx0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFZhbHVlTGlzdCA8ZW0+VmFsdWUgTGlzdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdFeHRlbmRlZEF0dHJpYnV0ZV8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFeHRlbmRlZEF0dHJpYnV0ZSBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpZWxkIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBQSUQgb2YgdGhlIGN1c3RvbSBmaWVsZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmllbGRJRChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfRmllbGRJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaWVsZElEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWVsZElEKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWVsZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbmFtZSBvZiB0aGUgY3VzdG9tIGZpZWxkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWVsZE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlX0ZpZWxkTmFtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaWVsZE5hbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmllbGROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEZpZWxkTmFtZSA8ZW0+RmllbGQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWVsZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsaWFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWxpYXMgb2YgdGhlIGN1c3RvbSBmaWVsZAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWxpYXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlX0FsaWFzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQWxpYXNUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBbGlhcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBbGlhcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRBbGlhcyA8ZW0+QWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFsaWFzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBbGlhcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWxpYXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBob25ldGljIEFsaWFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGhvbmV0aWMgcHJvbnVuY2lhdGlvbiBvZiB0aGUgYWxpYXMgb2YgdGhlIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tIGZpZWxkCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBob25ldGljIEFsaWFzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQaG9uZXRpY0FsaWFzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9QaG9uZXRpY0FsaWFzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUGhvbmV0aWNBbGlhc1R5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Bob25ldGljQWxpYXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGhvbmV0aWNBbGlhcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRQaG9uZXRpY0FsaWFzIDxlbT5QaG9uZXRpYyBBbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBob25ldGljQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBob25ldGljQWxpYXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvbGx1cCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBIb3cgcm9sbHVwcyBhcmUgY2FsY3VsYXRlZC4gVmFsdWVzIGFyZTogMD1NYXhpbXVtIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9SIGZvciBmbGFnIGZpZWxkcyksIDE9TWluaW11bSAoQU5EIGZvciBmbGFnIGZpZWxkcyksIDI9Q291bnQgYWxsLCAzPVN1bSwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0PUF2ZXJhZ2UsIDU9QXZlcmFnZSBGaXJzdCBTdWJsZXZlbCwgNj1Db3VudCBGaXJzdCBTdWJsZXZlbCwgNz1Db3VudCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbnN1bW1hcmllcwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xsdXAgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Um9sbHVwVHlwZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlX1JvbGx1cFR5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Sb2xsdXBUeXBlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUm9sbHVwVHlwZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0Um9sbHVwVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRSb2xsdXBUeXBlIDxlbT5Sb2xsdXAgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Um9sbHVwIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJvbGx1cFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJvbGx1cFR5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWxjdWxhdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHJvbGx1cHMgYXJlIGNhbGN1bGF0ZWQgZm9yIHRhc2sgYW5kIGdyb3VwIHN1bW1hcnkgcm93cy4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPU5vbmUsIDE9Um9sbHVwLCAyPUNhbGN1bGF0aW9uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhbGN1bGF0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhbGN1bGF0aW9uVHlwZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlX0NhbGN1bGF0aW9uVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGN1bGF0aW9uVHlwZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NhbGN1bGF0aW9uVHlwZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0Q2FsY3VsYXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldENhbGN1bGF0aW9uVHlwZSA8ZW0+Q2FsY3VsYXRpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FsY3VsYXRpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FsY3VsYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYWxjdWxhdGlvblR5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Gb3JtdWxhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZm9ybXVsYSB0aGF0IE1pY3Jvc29mdCBQcm9qZWN0IHVzZXMgdG8gcG9wdWxhdGUgdGhlIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tIHRhc2sgZmllbGQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZvcm11bGE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZvcm11bGEoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlX0Zvcm11bGEoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRm9ybXVsYScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGb3JtdWxhKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEZvcm11bGEgPGVtPkZvcm11bGE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZvcm11bGE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZvcm11bGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZvcm11bGEoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3RyaWN0IFZhbHVlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgUmVzdHJpY3RWYWx1ZXM9VHJ1ZSB0aGVuIG9ubHkgdmFsdWVzIGluIHRoZSBsaXN0IGFyZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQgaW4gdGhlIGZpbGUKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlc3RyaWN0VmFsdWVzKCkKLQkgKiBAc2VlICN1bnNldFJlc3RyaWN0VmFsdWVzKCkKLQkgKiBAc2VlICNzZXRSZXN0cmljdFZhbHVlcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlX1Jlc3RyaWN0VmFsdWVzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXN0cmljdFZhbHVlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNSZXN0cmljdFZhbHVlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc1Jlc3RyaWN0VmFsdWVzIDxlbT5SZXN0cmljdCBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc3RyaWN0IFZhbHVlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXN0cmljdFZhbHVlcygpCi0JICogQHNlZSAjdW5zZXRSZXN0cmljdFZhbHVlcygpCi0JICogQHNlZSAjaXNSZXN0cmljdFZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVzdHJpY3RWYWx1ZXMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjaXNSZXN0cmljdFZhbHVlcyA8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJlc3RyaWN0VmFsdWVzKCkKLQkgKiBAc2VlICNpc1Jlc3RyaWN0VmFsdWVzKCkKLQkgKiBAc2VlICNzZXRSZXN0cmljdFZhbHVlcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UmVzdHJpY3RWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc1Jlc3RyaWN0VmFsdWVzIDxlbT5SZXN0cmljdCBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3RyaWN0IFZhbHVlczwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UmVzdHJpY3RWYWx1ZXMoKQotCSAqIEBzZWUgI2lzUmVzdHJpY3RWYWx1ZXMoKQotCSAqIEBzZWUgI3NldFJlc3RyaWN0VmFsdWVzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSZXN0cmljdFZhbHVlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWVsaXN0IFNvcnQgT3JkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEhvdyB2YWx1ZSBsaXN0cyBhcmUgc29ydGVkLiBWYWx1ZXMgYXJlOiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA9RGVzY2VuZGluZywgMT1Bc2NlbmRpbmcKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlbGlzdFNvcnRPcmRlcihCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlX1ZhbHVlbGlzdFNvcnRPcmRlcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlbGlzdFNvcnRPcmRlclR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlbGlzdFNvcnRPcmRlcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VmFsdWVsaXN0U29ydE9yZGVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFZhbHVlbGlzdFNvcnRPcmRlciA8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlbGlzdFNvcnRPcmRlcihCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFwcGVuZCBOZXcgVmFsdWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBJZiBBcHBlbmROZXdWYWx1ZXM9VHJ1ZSB0aGVuIGFueSBuZXcgdmFsdWVzIGFkZGVkIGluIGEgcHJvamVjdCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIHRvIHRoZSBsaXN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBcHBlbmROZXdWYWx1ZXMoKQotCSAqIEBzZWUgI3Vuc2V0QXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAc2VlICNzZXRBcHBlbmROZXdWYWx1ZXMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9BcHBlbmROZXdWYWx1ZXMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FwcGVuZE5ld1ZhbHVlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNBcHBlbmROZXdWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjaXNBcHBlbmROZXdWYWx1ZXMgPGVtPkFwcGVuZCBOZXcgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBcHBlbmROZXdWYWx1ZXMoKQotCSAqIEBzZWUgI3Vuc2V0QXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAc2VlICNpc0FwcGVuZE5ld1ZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXBwZW5kTmV3VmFsdWVzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2lzQXBwZW5kTmV3VmFsdWVzIDxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRBcHBlbmROZXdWYWx1ZXMoKQotCSAqIEBzZWUgI2lzQXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAc2VlICNzZXRBcHBlbmROZXdWYWx1ZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEFwcGVuZE5ld1ZhbHVlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2lzQXBwZW5kTmV3VmFsdWVzIDxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEFwcGVuZE5ld1ZhbHVlcygpCi0JICogQHNlZSAjaXNBcHBlbmROZXdWYWx1ZXMoKQotCSAqIEBzZWUgI3NldEFwcGVuZE5ld1ZhbHVlcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QXBwZW5kTmV3VmFsdWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIHBvaW50cyB0byB0aGUgZGVmYXVsdCB2YWx1ZSBpbiB0aGUgbGlzdC4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgcHJlc2VudCBpZiBubyBkZWZhdWx0IGlzIHNldC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVmYXVsdChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfRGVmYXVsdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZWZhdWx0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RGVmYXVsdCA8ZW0+RGVmYXVsdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgTGlzdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hlbiB2YWx1ZXMgb2YgZXh0ZW5kZWQgYXR0cmlidXRlcyBhcmUgc3BlY2lmaWVkIGFzIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyBvZiBlbGVtZW50cyBpbiB0aGUgc2NoZW1hLCB0aGV5IG1heSBlaXRoZXIgYmUgc3BlY2lmaWVkIGJ5IHZhbHVlcyAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGJ5IHJlZmVyZW5jZXMgdG8gdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdGhpcyBsaXN0LiAgQXBwbGljYXRpb25zIG1heSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc3VtZSBvcmRlcmluZyBvZiB0aGUgbGlzdCBieSBvcmRlcmluZyBzcGVjaWZpZWQgaGVyZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgTGlzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VmFsdWVMaXN0KFZhbHVlTGlzdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9WYWx1ZUxpc3QoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZUxpc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlWYWx1ZUxpc3QgZ2V0VmFsdWVMaXN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFZhbHVlTGlzdCA8ZW0+VmFsdWUgTGlzdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgTGlzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VmFsdWVMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZUxpc3QoVmFsdWVMaXN0IHZhbHVlKTsKLQotfSAvLyBFeHRlbmRlZEF0dHJpYnV0ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZTIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNWE3OGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4dGVuZGVkQXR0cmlidXRlMi5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlMjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0V4dGVuZGVkQXR0cmlidXRlXy5fMV8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFeHRlbmRlZEF0dHJpYnV0ZTIgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgY29sbGVjdGlvbi4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlMl9VSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1VJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRVSUQgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpZWxkIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgUElEIG9mIHRoZSBjdXN0b20gZmllbGQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpZWxkSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlMl9GaWVsZElEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpZWxkSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmllbGRJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWVsZElEKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX1ZhbHVlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dCBsb29rdXAgdGFibGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfVmFsdWVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RHVyYXRpb24gRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBidWxrIGR1cmF0aW9uLiAgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5PSUsIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX0R1cmF0aW9uRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRHVyYXRpb25Gb3JtYXRUeXBlMiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRHVyYXRpb25Gb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldER1cmF0aW9uRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotfSAvLyBFeHRlbmRlZEF0dHJpYnV0ZTIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGUzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjhiMjhjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGUzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeHRlbmRlZEF0dHJpYnV0ZTMuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdFeHRlbmRlZEF0dHJpYnV0ZV8uXzJfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5kZWRBdHRyaWJ1dGUzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIGNvbGxlY3Rpb24uCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIFBJRCBvZiB0aGUgY3VzdG9tIGZpZWxkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWVsZElEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfRmllbGRJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaWVsZElEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmllbGRJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlM19WYWx1ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXQgbG9va3VwIHRhYmxlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX1ZhbHVlSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMD1lJSwgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlM19EdXJhdGlvbkZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkR1cmF0aW9uRm9ybWF0VHlwZTMiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0R1cmF0aW9uRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLX0gLy8gRXh0ZW5kZWRBdHRyaWJ1dGUzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlNC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRkMWVjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXh0ZW5kZWRBdHRyaWJ1dGU0LmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlNCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXh0ZW5kZWRBdHRyaWJ1dGVfLl8zXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuZGVkQXR0cmlidXRlNCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZpZWxkIElEIGluIHRoZSBsb2NhbGlzZWQgbGFuZ3VhZ2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmllbGRJRChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X0ZpZWxkSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmllbGRJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpZWxkSUQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlNF9WYWx1ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXQgbG9va3VwIHRhYmxlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfVmFsdWVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RHVyYXRpb24gRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBidWxrIGR1cmF0aW9uLiAgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfRHVyYXRpb25Gb3JtYXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5EdXJhdGlvbkZvcm1hdFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0R1cmF0aW9uRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLX0gLy8gRXh0ZW5kZWRBdHRyaWJ1dGU0CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU0OGYwNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeHRlbmRlZEF0dHJpYnV0ZXMuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ1IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlcyNnZXRFeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdFeHRlbmRlZEF0dHJpYnV0ZXNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5kZWRBdHRyaWJ1dGVzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFYWNoIG9mIHRoZSBpbmRpdmlkdWFsIGVudHJpZXMgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZXMgZGVmaW5pdGlvbiAKLQkgKiAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uICBUaGVyZSBhcmUgbm8gbGltaXRzIHRvIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCBtYXkgYXBwZWFyLCBidXQgcHJvamVjdCAKLQkgKiAgICAgICAgICAgICAgICAgICAgIHdpbGwgb25seSB1bmRlcnN0YW5kIEZsYWcxLUZsYWcxMCwgZXRjLiAgVGhpcyBtdXN0IGFwcGVhciBvbmNlIGluIGVhY2ggRXh0ZW5kZWRBdHRyaWJ1dGVzIAotCSAqICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlc19FeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVuZGVkQXR0cmlidXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQotfSAvLyBFeHRlbmRlZEF0dHJpYnV0ZXMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTWFzay5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9NYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3Zjk5YjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9NYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNYXNrLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NYXNrPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRTZXBhcmF0b3IgPGVtPlNlcGFyYXRvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE1hc2soKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01hc2tfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWFzayBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGV2ZWwgb2YgdGhlIG1hc2suCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMZXZlbChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE1hc2tfTGV2ZWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xldmVsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRMZXZlbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrI2dldExldmVsIDxlbT5MZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMZXZlbChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0eXBlIG9mIG1hc2suIFZhbHVlcyBhcmU6IDA9TnVtYmVycywgMT1VcHBlciBDYXNlIExldHRlcnMsIDI9TG93ZXIgQ2FzZSBMZXR0ZXJzLCAzPUNoYXJhY3RlcnMKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE1hc2tfVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlR5cGVUeXBlNSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVHlwZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZW5ndGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBtYXhpbXVtIGxlbmd0aCBpbiBjaGFyYWN0ZXJzIG9mIHRoZSBvdXRsaW5lIGNvZGUgdmFsdWVzLiAgSWYgbGVuZ3RoIGlzIGFueSwgdGhlIHZhbHVlIGlzIHplcm8uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxlbmd0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGVuZ3RoKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0TWFza19MZW5ndGgoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xlbmd0aCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxlbmd0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGVuZ3RoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMZW5ndGgoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXBhcmF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzZXBhcmF0b3IgdmFsdWUgb2YgdGhlIGNvZGUgdmFsdWVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXBhcmF0b3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlcGFyYXRvcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0TWFza19TZXBhcmF0b3IoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU2VwYXJhdG9yJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNlcGFyYXRvcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrI2dldFNlcGFyYXRvciA8ZW0+U2VwYXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXBhcmF0b3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNlcGFyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VwYXJhdG9yKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTWFzawpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9NYXNrcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9NYXNrcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDA2NGFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTWFza3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWFza3MuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ1IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWFza3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrcyNnZXRNYXNrIDxlbT5NYXNrPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0TWFza3MoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01hc2tzXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hc2tzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFzazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZm91ciBlbGVtZW50cyBvZiB0aGUgbWFzayBjb25zdGl0dXRlIHRoZSBmb3JtYXQgaW4gd2hpY2ggdGhlIG91dGxpbmUgY29kZSBtdXN0IGFwcGVhci4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFzazwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRNYXNrc19NYXNrKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNYXNrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0TWFzaygpOwotCi19IC8vIE1hc2tzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01zcHJvamVjdEZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTXNwcm9qZWN0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzVlN2ZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTXNwcm9qZWN0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTXNwcm9qZWN0RmFjdG9yeS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1zcHJvamVjdEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNc3Byb2plY3RGYWN0b3J5IGVJTlNUQU5DRSA9IG5ldyBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0RmFjdG9yeUltcGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXNzaWdubWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXNzaWdubWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXNzaWdubWVudCBjcmVhdGVBc3NpZ25tZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFzc2lnbm1lbnRzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Bc3NpZ25tZW50czwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXNzaWdubWVudHMgY3JlYXRlQXNzaWdubWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXZhaWxhYmlsaXR5UGVyaW9kIGNyZWF0ZUF2YWlsYWJpbGl0eVBlcmlvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUF2YWlsYWJpbGl0eVBlcmlvZHMgY3JlYXRlQXZhaWxhYmlsaXR5UGVyaW9kcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CYXNlbGluZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmFzZWxpbmU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJhc2VsaW5lIGNyZWF0ZUJhc2VsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJhc2VsaW5lMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmFzZWxpbmUyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCYXNlbGluZTIgY3JlYXRlQmFzZWxpbmUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJhc2VsaW5lMzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmFzZWxpbmUzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCYXNlbGluZTMgY3JlYXRlQmFzZWxpbmUzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNhbGVuZGFyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DYWxlbmRhcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ2FsZW5kYXIgY3JlYXRlQ2FsZW5kYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2FsZW5kYXJzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DYWxlbmRhcnM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNhbGVuZGFycyBjcmVhdGVDYWxlbmRhcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG9jdW1lbnRSb290IGNyZWF0ZURvY3VtZW50Um9vdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXh0ZW5kZWRBdHRyaWJ1dGUgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXh0ZW5kZWRBdHRyaWJ1dGUyIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlMigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFeHRlbmRlZEF0dHJpYnV0ZTMgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGUzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4dGVuZGVkQXR0cmlidXRlNCBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXh0ZW5kZWRBdHRyaWJ1dGVzIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NYXNrPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NYXNrPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNYXNrIGNyZWF0ZU1hc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWFza3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1hc2tzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNYXNrcyBjcmVhdGVNYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGxpbmUgQ29kZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT3V0bGluZUNvZGUgY3JlYXRlT3V0bGluZUNvZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlMjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT3V0bGluZUNvZGUyIGNyZWF0ZU91dGxpbmVDb2RlMigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PdXRsaW5lIENvZGUzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PdXRsaW5lIENvZGUzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPdXRsaW5lQ29kZTMgY3JlYXRlT3V0bGluZUNvZGUzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGxpbmUgQ29kZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGxpbmUgQ29kZXM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU91dGxpbmVDb2RlcyBjcmVhdGVPdXRsaW5lQ29kZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJlZGVjZXNzb3JMaW5rIGNyZWF0ZVByZWRlY2Vzc29yTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9qZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9qZWN0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9qZWN0IGNyZWF0ZVByb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmF0ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmF0ZSBjcmVhdGVSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJhdGVzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SYXRlczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmF0ZXMgY3JlYXRlUmF0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVzb3VyY2VzIGNyZWF0ZVJlc291cmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYXNrIGNyZWF0ZVRhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFza3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2tzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYXNrcyBjcmVhdGVUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UaW1lIFBlcmlvZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRpbWVQZXJpb2QgY3JlYXRlVGltZVBlcmlvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UaW1lcGhhc2VkIERhdGEgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGltZXBoYXNlZCBEYXRhIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRpbWVwaGFzZWREYXRhVHlwZSBjcmVhdGVUaW1lcGhhc2VkRGF0YVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VmFsdWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlWYWx1ZSBjcmVhdGVWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5WYWx1ZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlZhbHVlMjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFsdWUyIGNyZWF0ZVZhbHVlMigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5WYWx1ZSBMaXN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5WYWx1ZSBMaXN0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlWYWx1ZUxpc3QgY3JlYXRlVmFsdWVMaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlZhbHVlczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VmFsdWVzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlWYWx1ZXMgY3JlYXRlVmFsdWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldCUyBNYXNrPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XQlMgTWFzazwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV0JTTWFzayBjcmVhdGVXQlNNYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldCUyBNYXNrczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V0JTIE1hc2tzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXQlNNYXNrcyBjcmVhdGVXQlNNYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XZWVrIERheTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2VlayBEYXk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlZWtEYXkgY3JlYXRlV2Vla0RheSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XZWVrIERheXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldlZWsgRGF5czwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV2Vla0RheXMgY3JlYXRlV2Vla0RheXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29ya2luZyBUaW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JraW5nIFRpbWU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtpbmdUaW1lIGNyZWF0ZVdvcmtpbmdUaW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmtpbmcgVGltZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmtpbmcgVGltZXM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtpbmdUaW1lcyBjcmVhdGVXb3JraW5nVGltZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTXNwcm9qZWN0UGFja2FnZSBnZXRNc3Byb2plY3RQYWNrYWdlKCk7Ci0KLX0gLy9Nc3Byb2plY3RGYWN0b3J5CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01zcHJvamVjdFBhY2thZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTXNwcm9qZWN0UGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzg3YzRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTXNwcm9qZWN0UGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1NDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNc3Byb2plY3RQYWNrYWdlLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSBmdWxsIHByb2plY3Qgc2NoZW1hIGRlZmluaXRpb24gZnJvbSB0aGUgcHJvamVjdCBsZXZlbCBkb3duLCAKLSAqIAkJc3RhcnRpbmcgd2l0aCBkYXRhIHR5cGUgZGVmaW5pdGlvbnMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0RmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTXNwcm9qZWN0UGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJtc3Byb2plY3QiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vZXBmLmVjbGlwc2Uub3JnL21zcHJvamVjdCI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJtc3Byb2plY3QiOwotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNc3Byb2plY3RQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCA8ZW0+QXNzaWdubWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXNrIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1RBU0tfVUlEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19SRVNPVVJDRV9VSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1BFUkNFTlRfV09SS19DT01QTEVURSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19BQ1RVQUxfQ09TVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIEZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0FDVFVBTF9GSU5JU0ggPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX0NPU1QgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX1dPUksgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBTdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0FDVFVBTF9TVEFSVCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19BQ1RVQUxfV09SSyA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QUNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0FDV1AgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25maXJtZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19DT05GSVJNRUQgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQ09TVCA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvc3QgUmF0ZSBUYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0NPU1RfUkFURV9UQUJMRSA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvc3QgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19DT1NUX1ZBUklBTkNFID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q1Y8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19DViA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlbGF5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fREVMQVkgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19GSU5JU0ggPSAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pc2ggVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19GSU5JU0hfVkFSSUFOQ0UgPSAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IeXBlcmxpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19IWVBFUkxJTksgPSAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0hZUEVSTElOS19BRERSRVNTID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fSFlQRVJMSU5LX1NVQl9BRERSRVNTID0gMjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1dPUktfVkFSSUFOQ0UgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgRml4ZWQgUmF0ZSBVbml0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0hBU19GSVhFRF9SQVRFX1VOSVRTID0gMjM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Rml4ZWQgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19GSVhFRF9NQVRFUklBTCA9IDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxldmVsaW5nIERlbGF5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVkgPSAyNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19MRVZFTElOR19ERUxBWV9GT1JNQVQgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRmllbGRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fTElOS0VEX0ZJRUxEUyA9IDI3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1pbGVzdG9uZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX01JTEVTVE9ORSA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fTk9URVMgPSAyOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdmVyYWxsb2NhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fT1ZFUkFMTE9DQVRFRCA9IDMwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19PVkVSVElNRV9DT1NUID0gMzE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX09WRVJUSU1FX1dPUksgPSAzMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWd1bGFyIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19SRUdVTEFSX1dPUksgPSAzMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1JFTUFJTklOR19DT1NUID0gMzQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVCA9IDM1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUksgPSAzNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1JFTUFJTklOR19XT1JLID0gMzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2UgUGVuZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1JFU1BPTlNFX1BFTkRJTkcgPSAzODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1NUQVJUID0gMzk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RvcDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1NUT1AgPSA0MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXN1bWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19SRVNVTUUgPSA0MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydCBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1NUQVJUX1ZBUklBTkNFID0gNDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19VTklUUyA9IDQzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVwZGF0ZSBOZWVkZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19VUERBVEVfTkVFREVEID0gNDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VkFDPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fVkFDID0gNDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1dPUksgPSA0NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrIENvbnRvdXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19XT1JLX0NPTlRPVVIgPSA0NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CQ1dTPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQkNXUyA9IDQ4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19CQ1dQID0gNDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Qm9va2luZyBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQk9PS0lOR19UWVBFID0gNTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQUNUVUFMX1dPUktfUFJPVEVDVEVEID0gNTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEID0gNTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3JlYXRpb24gRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0NSRUFUSU9OX0RBVEUgPSA1MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0VYVEVOREVEX0FUVFJJQlVURSA9IDU0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2VsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19CQVNFTElORSA9IDU1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWVwaGFzZWQgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fVElNRVBIQVNFRF9EQVRBID0gNTY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkFzc2lnbm1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9GRUFUVVJFX0NPVU5UID0gNTc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50c0ltcGwgPGVtPkFzc2lnbm1lbnRzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEFzc2lnbm1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UU19fQVNTSUdOTUVOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkFzc2lnbm1lbnRzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRTX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXZhaWxhYmlsaXR5UGVyaW9kSW1wbCA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5BdmFpbGFiaWxpdHlQZXJpb2RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFWQUlMQUJJTElUWV9QRVJJT0QgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF2YWlsYWJsZSBGcm9tPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX0ZST00gPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF2YWlsYWJsZSBUbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9UTyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXZhaWxhYmxlIFVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1VOSVRTID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBVkFJTEFCSUxJVFlfUEVSSU9EX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXZhaWxhYmlsaXR5UGVyaW9kc0ltcGwgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkF2YWlsYWJpbGl0eVBlcmlvZHNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBVkFJTEFCSUxJVFlfUEVSSU9EUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXZhaWxhYmlsaXR5IFBlcmlvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVZBSUxBQklMSVRZX1BFUklPRFNfX0FWQUlMQUJJTElUWV9QRVJJT0QgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBVkFJTEFCSUxJVFlfUEVSSU9EU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCA8ZW0+QmFzZWxpbmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWVwaGFzZWQgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkVfX1RJTUVQSEFTRURfREFUQSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnVtYmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkVfX05VTUJFUiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJpbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19JTlRFUklNID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19TVEFSVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkVfX0ZJTklTSCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fRFVSQVRJT04gPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19EVVJBVElPTl9GT1JNQVQgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRlZCBEdXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19FU1RJTUFURURfRFVSQVRJT04gPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fV09SSyA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19DT1NUID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CQ1dTPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkVfX0JDV1MgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkVfX0JDV1AgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QmFzZWxpbmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkVfRkVBVFVSRV9DT1VOVCA9IDEyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUySW1wbCA8ZW0+QmFzZWxpbmUyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lMkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRCYXNlbGluZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUyID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OdW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTJfX05VTUJFUiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FMl9fV09SSyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FMl9fQ09TVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FMl9fQkNXUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FMl9fQkNXUCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkJhc2VsaW5lMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTJfRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsIDxlbT5CYXNlbGluZTM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEJhc2VsaW5lMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBCQVNFTElORTMgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWVwaGFzZWQgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUzX19USU1FUEhBU0VEX0RBVEEgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk51bWJlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19fTlVNQkVSID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19fU1RBUlQgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19fRklOSVNIID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUzX19XT1JLID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUzX19DT1NUID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CQ1dTPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUzX19CQ1dTID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUzX19CQ1dQID0gNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QmFzZWxpbmUzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19GRUFUVVJFX0NPVU5UID0gODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkNhbGVuZGFySW1wbCA8ZW0+Q2FsZW5kYXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQ2FsZW5kYXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Q2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ0FMRU5EQVIgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBTEVOREFSX19VSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQUxFTkRBUl9fTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQmFzZSBDYWxlbmRhcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBTEVOREFSX19JU19CQVNFX0NBTEVOREFSID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlIENhbGVuZGFyIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBTEVOREFSX19CQVNFX0NBTEVOREFSX1VJRCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2VlayBEYXlzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FMRU5EQVJfX1dFRUtfREFZUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkNhbGVuZGFyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBTEVOREFSX0ZFQVRVUkVfQ09VTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQ2FsZW5kYXJzSW1wbCA8ZW0+Q2FsZW5kYXJzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkNhbGVuZGFyc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDYWxlbmRhcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ0FMRU5EQVJTID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYWxlbmRhcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FMRU5EQVJTX19DQUxFTkRBUiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkNhbGVuZGFyczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQUxFTkRBUlNfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Eb2N1bWVudFJvb3RJbXBsIDxlbT5Eb2N1bWVudCBSb290PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkRvY3VtZW50Um9vdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXREb2N1bWVudFJvb3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVCA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX01JWEVEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YTUxOUyBQcmVmaXggTWFwPC9iPjwvZW0+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WFNJIFNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT04gPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2plY3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19QUk9KRUNUID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX0lEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWVsZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19GSUVMRF9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fQUxJQVMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBob25ldGljIEFsaWFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19QSE9ORVRJQ19BTElBUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sbHVwIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVfX1JPTExVUF9UWVBFID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYWxjdWxhdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19DQUxDVUxBVElPTl9UWVBFID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Gb3JtdWxhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19GT1JNVUxBID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXN0cmljdCBWYWx1ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVfX1JFU1RSSUNUX1ZBTFVFUyA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWVsaXN0IFNvcnQgT3JkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFTElTVF9TT1JUX09SREVSID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BcHBlbmQgTmV3IFZhbHVlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fQVBQRU5EX05FV19WQUxVRVMgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVfX0RFRkFVTFQgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBMaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19WQUxVRV9MSVNUID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCA9IDEyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbCA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTIgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUyX19VSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFMl9fRklFTERfSUQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFMl9fVkFMVUUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFMl9fVkFMVUVfSUQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTJfX0RVUkFUSU9OX0ZPUk1BVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFMl9GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlM0ltcGwgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUzID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFM19fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTNfX0ZJRUxEX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFX0lEID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdXJhdGlvbiBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUzX19EVVJBVElPTl9GT1JNQVQgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTNfRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlNEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFNCA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTRfX1VJRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEU0X19GSUVMRF9JRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEU0X19WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEU0X19WQUxVRV9JRCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVyYXRpb24gRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFNF9fRFVSQVRJT05fRk9STUFUID0gNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlNDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEU0X0ZFQVRVUkVfQ09VTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVzSW1wbCA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZXNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURVMgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURVNfX0VYVEVOREVEX0FUVFJJQlVURSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1hc2tJbXBsIDxlbT5NYXNrPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1hc2tJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0TWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNQVNLID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNQVNLX19MRVZFTCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1BU0tfX1RZUEUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxlbmd0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1BU0tfX0xFTkdUSCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VwYXJhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUFTS19fU0VQQVJBVE9SID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+TWFzazwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNQVNLX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTWFza3NJbXBsIDxlbT5NYXNrczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRNYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNQVNLUyA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hc2s8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1BU0tTX19NQVNLID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+TWFza3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUFTS1NfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZUltcGwgPGVtPk91dGxpbmUgQ29kZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRPdXRsaW5lQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREUgPSAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERV9fRklFTERfSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX0ZJRUxEX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsaWFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19BTElBUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGhvbmV0aWMgQWxpYXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX1BIT05FVElDX0FMSUFTID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX1ZBTFVFUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50ZXJwcmlzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERV9fRU5URVJQUklTRSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50ZXJwcmlzZSBPdXRsaW5lIENvZGUgQWxpYXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX0VOVEVSUFJJU0VfT1VUTElORV9DT0RFX0FMSUFTID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERV9fUkVTT1VSQ0VfU1VCU1RJVFVUSU9OX0VOQUJMRUQgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxlYWYgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERV9fTEVBRl9PTkxZID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19BTExfTEVWRUxTX1JFUVVJUkVEID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19PTkxZX1RBQkxFX1ZBTFVFU19BTExPV0VEID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFza3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX01BU0tTID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk91dGxpbmUgQ29kZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfRkVBVFVSRV9DT1VOVCA9IDEyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGUySW1wbCA8ZW0+T3V0bGluZSBDb2RlMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZTJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0T3V0bGluZUNvZGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERTIgPSAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREUyX19VSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFMl9fRklFTERfSUQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFMl9fVkFMVUVfSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5PdXRsaW5lIENvZGUyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERTJfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZTNJbXBsIDxlbT5PdXRsaW5lIENvZGUzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlM0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRPdXRsaW5lQ29kZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFMyA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERTNfX1VJRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREUzX19GSUVMRF9JRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREUzX19WQUxVRV9JRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk91dGxpbmUgQ29kZTM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFM19GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2Rlc0ltcGwgPGVtPk91dGxpbmUgQ29kZXM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE91dGxpbmVDb2RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVTID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0bGluZSBDb2RlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVTX19PVVRMSU5FX0NPREUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5PdXRsaW5lIENvZGVzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERVNfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5QcmVkZWNlc3NvckxpbmtJbXBsIDxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByZWRlY2Vzc29yTGlua0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRQcmVkZWNlc3NvckxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJFREVDRVNTT1JfTElOSyA9IDIxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSRURFQ0VTU09SX0xJTktfX1BSRURFQ0VTU09SX1VJRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSRURFQ0VTU09SX0xJTktfX1RZUEUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyb3NzIFByb2plY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNUID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Dcm9zcyBQcm9qZWN0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNUX05BTUUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgTGFnPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJFREVDRVNTT1JfTElOS19fTElOS19MQUcgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhZyBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkVERUNFU1NPUl9MSU5LX19MQUdfRk9STUFUID0gNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkVERUNFU1NPUl9MSU5LX0ZFQVRVUkVfQ09VTlQgPSA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwgPGVtPlByb2plY3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0pFQ1QgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19VSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaXRsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1RJVExFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWJqZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fU1VCSkVDVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19DQVRFR09SWSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tcGFueTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0NPTVBBTlkgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbmFnZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19NQU5BR0VSID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19BVVRIT1IgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyZWF0aW9uIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19DUkVBVElPTl9EQVRFID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXZpc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1JFVklTSU9OID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYXN0IFNhdmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTEFTVF9TQVZFRCA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19TQ0hFRFVMRV9GUk9NX1NUQVJUID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1NUQVJUX0RBVEUgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pc2ggRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0ZJTklTSF9EQVRFID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RlkgU3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0ZZU1RBUlRfREFURSA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyaXRpY2FsIFNsYWNrIExpbWl0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ1JJVElDQUxfU0xBQ0tfTElNSVQgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW5jeSBEaWdpdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19DVVJSRU5DWV9ESUdJVFMgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW5jeSBTeW1ib2w8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19DVVJSRU5DWV9TWU1CT0wgPSAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19DVVJSRU5DWV9TWU1CT0xfUE9TSVRJT04gPSAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYWxlbmRhciBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19DQUxFTkRBUl9VSUQgPSAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFN0YXJ0IFRpbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19ERUZBVUxUX1NUQVJUX1RJTUUgPSAyMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IEZpbmlzaCBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fREVGQVVMVF9GSU5JU0hfVElNRSA9IDIxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1pbnV0ZXMgUGVyIERheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX01JTlVURVNfUEVSX0RBWSA9IDIyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1pbnV0ZXMgUGVyIFdlZWs8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19NSU5VVEVTX1BFUl9XRUVLID0gMjM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF5cyBQZXIgTW9udGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19EQVlTX1BFUl9NT05USCA9IDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVGFzayBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fREVGQVVMVF9UQVNLX1RZUEUgPSAyNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMID0gMjY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fREVGQVVMVF9TVEFOREFSRF9SQVRFID0gMjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fREVGQVVMVF9PVkVSVElNRV9SQVRFID0gMjg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVyYXRpb24gRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fRFVSQVRJT05fRk9STUFUID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19XT1JLX0ZPUk1BVCA9IDMwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVkaXRhYmxlIEFjdHVhbCBDb3N0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0VESVRBQkxFX0FDVFVBTF9DT1NUUyA9IDMxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhvbm9yIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fSE9OT1JfQ09OU1RSQUlOVFMgPSAzMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FYXJuZWQgVmFsdWUgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fRUFSTkVEX1ZBTFVFX01FVEhPRCA9IDMzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0lOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWSA9IDM0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTVVMVElQTEVfQ1JJVElDQUxfUEFUSFMgPSAzNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX05FV19UQVNLU19FRkZPUlRfRFJJVkVOID0gMzY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV3IFRhc2tzIEVzdGltYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX05FV19UQVNLU19FU1RJTUFURUQgPSAzNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19TUExJVFNfSU5fUFJPR1JFU1NfVEFTS1MgPSAzODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TcHJlYWQgQWN0dWFsIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19TUFJFQURfQUNUVUFMX0NPU1QgPSAzOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1NQUkVBRF9QRVJDRU5UX0NPTVBMRVRFID0gNDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFzayBVcGRhdGVzIFJlc291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fVEFTS19VUERBVEVTX1JFU09VUkNFID0gNDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmlzY2FsIFllYXIgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19GSVNDQUxfWUVBUl9TVEFSVCA9IDQyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlZWsgU3RhcnQgRGF5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fV0VFS19TVEFSVF9EQVkgPSA0MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0JBQ0sgPSA0NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX01PVkVfUkVNQUlOSU5HX1NUQVJUU19CQUNLID0gNDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEZvcndhcmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfRk9SV0FSRCA9IDQ2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfRk9SV0FSRCA9IDQ3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19CQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFID0gNDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19BVVRPX0FERF9ORVdfUkVTT1VSQ0VTX0FORF9UQVNLUyA9IDQ5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXR1cyBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fU1RBVFVTX0RBVEUgPSA1MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXJyZW50IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19DVVJSRU5UX0RBVEUgPSA1MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaWNyb3NvZnQgUHJvamVjdCBTZXJ2ZXIgVVJMPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTUlDUk9TT0ZUX1BST0pFQ1RfU0VSVkVSX1VSTCA9IDUyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dG9saW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQVVUT0xJTksgPSA1MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OZXcgVGFzayBTdGFydCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTkVXX1RBU0tfU1RBUlRfREFURSA9IDU0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVGFzayBFViBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19ERUZBVUxUX1RBU0tfRVZfTUVUSE9EID0gNTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1BST0pFQ1RfRVhURVJOQUxMWV9FRElURUQgPSA1NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fRVhURU5ERURfQ1JFQVRJT05fREFURSA9IDU3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbHMgSW4gU3luYzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0FDVFVBTFNfSU5fU1lOQyA9IDU4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19SRU1PVkVfRklMRV9QUk9QRVJUSUVTID0gNTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRtaW4gUHJvamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0FETUlOX1BST0pFQ1QgPSA2MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRsaW5lIENvZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fT1VUTElORV9DT0RFUyA9IDYxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldCUyBNYXNrczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1dCU19NQVNLUyA9IDYyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19FWFRFTkRFRF9BVFRSSUJVVEVTID0gNjM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FsZW5kYXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ0FMRU5EQVJTID0gNjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFza3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19UQVNLUyA9IDY1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1JFU09VUkNFUyA9IDY2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2lnbm1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQVNTSUdOTUVOVFMgPSA2NzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UHJvamVjdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX0ZFQVRVUkVfQ09VTlQgPSA2ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVJbXBsIDxlbT5SYXRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSQVRFID0gMjM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmF0ZXMgRnJvbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBVEVfX1JBVEVTX0ZST00gPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhdGVzIFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFURV9fUkFURVNfVE8gPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhdGUgVGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVRFX19SQVRFX1RBQkxFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFuZGFyZCBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFURV9fU1RBTkRBUkRfUkFURSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVRFX19TVEFOREFSRF9SQVRFX0ZPUk1BVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBVEVfX09WRVJUSU1FX1JBVEUgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFURV9fT1ZFUlRJTUVfUkFURV9GT1JNQVQgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvc3QgUGVyIFVzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBVEVfX0NPU1RfUEVSX1VTRSA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlJhdGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFURV9GRUFUVVJFX0NPVU5UID0gODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVzSW1wbCA8ZW0+UmF0ZXM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmF0ZXNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UmF0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkFURVMgPSAyNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVRFU19fUkFURSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlJhdGVzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBVEVTX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsIDxlbT5SZXNvdXJjZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRVNPVVJDRSA9IDI1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19VSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX05BTUUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fVFlQRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgTnVsbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19JU19OVUxMID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbml0aWFsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19JTklUSUFMUyA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGhvbmV0aWNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1BIT05FVElDUyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TlQgQWNjb3VudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19OVEFDQ09VTlQgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hdGVyaWFsIExhYmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX01BVEVSSUFMX0xBQkVMID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0NPREUgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0dST1VQID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBHcm91cDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19XT1JLX0dST1VQID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW1haWwgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19FTUFJTF9BRERSRVNTID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SHlwZXJsaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0hZUEVSTElOSyA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluayBBZGRyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0hZUEVSTElOS19BRERSRVNTID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0hZUEVSTElOS19TVUJfQUREUkVTUyA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1heCBVbml0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19NQVhfVU5JVFMgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZWFrIFVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1BFQUtfVU5JVFMgPSAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdmVyIEFsbG9jYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19PVkVSX0FMTE9DQVRFRCA9IDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF2YWlsYWJsZSBGcm9tPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0FWQUlMQUJMRV9GUk9NID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXZhaWxhYmxlIFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0FWQUlMQUJMRV9UTyA9IDIwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1NUQVJUID0gMjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0ZJTklTSCA9IDIyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhbiBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19DQU5fTEVWRUwgPSAyMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2NydWUgQXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQUNDUlVFX0FUID0gMjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19XT1JLID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVndWxhciBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1JFR1VMQVJfV09SSyA9IDI2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fT1ZFUlRJTUVfV09SSyA9IDI3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0FDVFVBTF9XT1JLID0gMjg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtYWluaW5nIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fUkVNQUlOSU5HX1dPUksgPSAyOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BQ1RVQUxfT1ZFUlRJTUVfV09SSyA9IDMwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLID0gMzE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1BFUkNFTlRfV09SS19DT01QTEVURSA9IDMyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YW5kYXJkIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fU1RBTkRBUkRfUkFURSA9IDMzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEVfRk9STUFUID0gMzQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19DT1NUID0gMzU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19PVkVSVElNRV9SQVRFID0gMzY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fT1ZFUlRJTUVfUkFURV9GT1JNQVQgPSAzNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX09WRVJUSU1FX0NPU1QgPSAzODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3N0IFBlciBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQ09TVF9QRVJfVVNFID0gMzk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQUNUVUFMX0NPU1QgPSA0MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BQ1RVQUxfT1ZFUlRJTUVfQ09TVCA9IDQxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1JFTUFJTklOR19DT1NUID0gNDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1QgPSA0MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1dPUktfVkFSSUFOQ0UgPSA0NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3N0IFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0NPU1RfVkFSSUFOQ0UgPSA0NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TVjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19TViA9IDQ2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNWPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0NWID0gNDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QUNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BQ1dQID0gNDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FsZW5kYXIgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0NBTEVOREFSX1VJRCA9IDQ5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX05PVEVTID0gNTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19CQ1dTID0gNTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19CQ1dQID0gNTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgR2VuZXJpYzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19JU19HRU5FUklDID0gNTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgSW5hY3RpdmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fSVNfSU5BQ1RJVkUgPSA1NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbnRlcnByaXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0lTX0VOVEVSUFJJU0UgPSA1NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Cb29raW5nIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQk9PS0lOR19UWVBFID0gNTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRCA9IDU3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQgPSA1ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQUNUSVZFX0RJUkVDVE9SWV9HVUlEID0gNTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3JlYXRpb24gRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19DUkVBVElPTl9EQVRFID0gNjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fRVhURU5ERURfQVRUUklCVVRFID0gNjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZWxpbmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19CQVNFTElORSA9IDYyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGxpbmUgQ29kZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX09VVExJTkVfQ09ERSA9IDYzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0FWQUlMQUJJTElUWV9QRVJJT0RTID0gNjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmF0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fUkFURVMgPSA2NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19USU1FUEhBU0VEX0RBVEEgPSA2NjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UmVzb3VyY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfRkVBVFVSRV9DT1VOVCA9IDY3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VzSW1wbCA8ZW0+UmVzb3VyY2VzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRSZXNvdXJjZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VTID0gMjY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFU19fUkVTT1VSQ0UgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5SZXNvdXJjZXM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VTX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwgPGVtPlRhc2s8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRBU0sgPSAyNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19VSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fSUQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19OQU1FID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fVFlQRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgTnVsbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0lTX05VTEwgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyZWF0ZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ1JFQVRFX0RBVEUgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19DT05UQUNUID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XQlM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19XQlMgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldCUyBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1dCU19MRVZFTCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0bGluZSBOdW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PVVRMSU5FX05VTUJFUiA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0bGluZSBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09VVExJTkVfTEVWRUwgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcmlvcml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BSSU9SSVRZID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19TVEFSVCA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0ZJTklTSCA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRFVSQVRJT04gPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdXJhdGlvbiBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19EVVJBVElPTl9GT1JNQVQgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fV09SSyA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0b3A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19TVE9QID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzdW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUkVTVU1FID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzdW1lIFZhbGlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUkVTVU1FX1ZBTElEID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWZmb3J0IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VGRk9SVF9EUklWRU4gPSAyMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWN1cnJpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19SRUNVUlJJTkcgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdmVyIEFsbG9jYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09WRVJfQUxMT0NBVEVEID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRVNUSU1BVEVEID0gMjM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWlsZXN0b25lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTUlMRVNUT05FID0gMjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VtbWFyeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1NVTU1BUlkgPSAyNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Dcml0aWNhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0NSSVRJQ0FMID0gMjY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgU3VicHJvamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0lTX1NVQlBST0pFQ1QgPSAyNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0lTX1NVQlBST0pFQ1RfUkVBRF9PTkxZID0gMjg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VicHJvamVjdCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU1VCUFJPSkVDVF9OQU1FID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgVGFzazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VYVEVSTkFMX1RBU0sgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FWFRFUk5BTF9UQVNLX1BST0pFQ1QgPSAzMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FYXJseSBTdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VBUkxZX1NUQVJUID0gMzI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWFybHkgRmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRUFSTFlfRklOSVNIID0gMzM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGF0ZSBTdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0xBVEVfU1RBUlQgPSAzNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYXRlIEZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0xBVEVfRklOSVNIID0gMzU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19TVEFSVF9WQVJJQU5DRSA9IDM2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaCBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0ZJTklTSF9WQVJJQU5DRSA9IDM3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19XT1JLX1ZBUklBTkNFID0gMzg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJlZSBTbGFjazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0ZSRUVfU0xBQ0sgPSAzOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub3RhbCBTbGFjazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1RPVEFMX1NMQUNLID0gNDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Rml4ZWQgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0ZJWEVEX0NPU1QgPSA0MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaXhlZCBDb3N0IEFjY3J1YWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19GSVhFRF9DT1NUX0FDQ1JVQUwgPSA0MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJjZW50IENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUEVSQ0VOVF9DT01QTEVURSA9IDQzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BFUkNFTlRfV09SS19DT01QTEVURSA9IDQ0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19DT1NUID0gNDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09WRVJUSU1FX0NPU1QgPSA0NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1ZFUlRJTUVfV09SSyA9IDQ3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBTdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDVFVBTF9TVEFSVCA9IDQ4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBGaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19BQ1RVQUxfRklOSVNIID0gNDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIER1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQUNUVUFMX0RVUkFUSU9OID0gNTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19BQ1RVQUxfQ09TVCA9IDUxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQUNUVUFMX09WRVJUSU1FX0NPU1QgPSA1MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDVFVBTF9XT1JLID0gNTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19BQ1RVQUxfT1ZFUlRJTUVfV09SSyA9IDU0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZ3VsYXIgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JFR1VMQVJfV09SSyA9IDU1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBEdXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JFTUFJTklOR19EVVJBVElPTiA9IDU2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUkVNQUlOSU5HX0NPU1QgPSA1NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JFTUFJTklOR19XT1JLID0gNTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVCA9IDU5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUkVNQUlOSU5HX09WRVJUSU1FX1dPUksgPSA2MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQUNXUCA9IDYxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNWPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ1YgPSA2MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25zdHJhaW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19DT05TVFJBSU5UX1RZUEUgPSA2MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYWxlbmRhciBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19DQUxFTkRBUl9VSUQgPSA2NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25zdHJhaW50IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19DT05TVFJBSU5UX0RBVEUgPSA2NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWFkbGluZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0RFQURMSU5FID0gNjY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGV2ZWwgQXNzaWdubWVudHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19MRVZFTF9BU1NJR05NRU5UUyA9IDY3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxldmVsaW5nIENhbiBTcGxpdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0xFVkVMSU5HX0NBTl9TUExJVCA9IDY4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxldmVsaW5nIERlbGF5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTEVWRUxJTkdfREVMQVkgPSA2OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19MRVZFTElOR19ERUxBWV9GT1JNQVQgPSA3MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgTGV2ZWxlZCBTdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BSRV9MRVZFTEVEX1NUQVJUID0gNzE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIExldmVsZWQgRmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUFJFX0xFVkVMRURfRklOSVNIID0gNzI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SHlwZXJsaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fSFlQRVJMSU5LID0gNzM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SHlwZXJsaW5rIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19IWVBFUkxJTktfQUREUkVTUyA9IDc0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluayBTdWIgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0hZUEVSTElOS19TVUJfQUREUkVTUyA9IDc1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklnbm9yZSBSZXNvdXJjZSBDYWxlbmRhcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0lHTk9SRV9SRVNPVVJDRV9DQUxFTkRBUiA9IDc2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTk9URVMgPSA3NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IaWRlIEJhcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0hJREVfQkFSID0gNzg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sbHVwPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUk9MTFVQID0gNzk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0JDV1MgPSA4MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQkNXUCA9IDgxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QSFlTSUNBTF9QRVJDRU5UX0NPTVBMRVRFID0gODI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWFybmVkIFZhbHVlIE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VBUk5FRF9WQUxVRV9NRVRIT0QgPSA4MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvciBMaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QUkVERUNFU1NPUl9MSU5LID0gODQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQUNUVUFMX1dPUktfUFJPVEVDVEVEID0gODU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEID0gODY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FWFRFTkRFRF9BVFRSSUJVVEUgPSA4NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlbGluZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQkFTRUxJTkUgPSA4ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRsaW5lIENvZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09VVExJTkVfQ09ERSA9IDg5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWVwaGFzZWQgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fVElNRVBIQVNFRF9EQVRBID0gOTA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlRhc2s8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19GRUFUVVJFX0NPVU5UID0gOTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrc0ltcGwgPGVtPlRhc2tzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFRhc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRBU0tTID0gMjg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFzazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS1NfX1RBU0sgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5UYXNrczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRpbWVQZXJpb2RJbXBsIDxlbT5UaW1lIFBlcmlvZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lUGVyaW9kSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFRpbWVQZXJpb2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVElNRV9QRVJJT0QgPSAyOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Gcm9tIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUSU1FX1BFUklPRF9fRlJPTV9EQVRFID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UbyBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVElNRV9QRVJJT0RfX1RPX0RBVEUgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5UaW1lIFBlcmlvZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUSU1FX1BFUklPRF9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRpbWVwaGFzZWREYXRhVHlwZUltcGwgPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRpbWVwaGFzZWREYXRhVHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVElNRVBIQVNFRF9EQVRBX1RZUEUgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVElNRVBIQVNFRF9EQVRBX1RZUEVfX1RZUEUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFX19VSUQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVElNRVBIQVNFRF9EQVRBX1RZUEVfX1NUQVJUID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUSU1FUEhBU0VEX0RBVEFfVFlQRV9fRklOSVNIID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VOSVQgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVElNRVBIQVNFRF9EQVRBX1RZUEVfX1ZBTFVFID0gNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VGltZXBoYXNlZCBEYXRhIFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVElNRVBIQVNFRF9EQVRBX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZUltcGwgPGVtPlZhbHVlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFZBTFVFID0gMzE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRV9fVkFMVUVfSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmVudCBWYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFX19QQVJFTlRfVkFMVUVfSUQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUVfX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFX19ERVNDUklQVElPTiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWUySW1wbCA8ZW0+VmFsdWUyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlMkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRWYWx1ZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVkFMVUUyID0gMzI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRTJfX0lEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFMl9fVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUUyX19ERVNDUklQVElPTiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlZhbHVlMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRTJfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZUxpc3RJbXBsIDxlbT5WYWx1ZSBMaXN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlTGlzdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRWYWx1ZUxpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVkFMVUVfTElTVCA9IDMzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRV9MSVNUX19WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlZhbHVlIExpc3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUVfTElTVF9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlc0ltcGwgPGVtPlZhbHVlczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZXNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VmFsdWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFZBTFVFUyA9IDM0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRVNfX0dST1VQID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUVTX19WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlZhbHVlczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRVNfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XQlNNYXNrSW1wbCA8ZW0+V0JTIE1hc2s8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV0JTTWFza0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRXQlNNYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdCU19NQVNLID0gMzU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXQlNfTUFTS19fTEVWRUwgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXQlNfTUFTS19fVFlQRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGVuZ3RoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0JTX01BU0tfX0xFTkdUSCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VwYXJhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0JTX01BU0tfX1NFUEFSQVRPUiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPldCUyBNYXNrPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdCU19NQVNLX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV0JTTWFza3NJbXBsIDxlbT5XQlMgTWFza3M8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV0JTTWFza3NJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0V0JTTWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV0JTX01BU0tTID0gMzY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdCU19NQVNLU19fVkVSSUZZX1VOSVFVRV9DT0RFUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQ29kZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXQlNfTUFTS1NfX0dFTkVSQVRFX0NPREVTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXQlNfTUFTS1NfX1BSRUZJWCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V0JTIE1hc2s8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdCU19NQVNLU19fV0JTX01BU0sgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5XQlMgTWFza3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0JTX01BU0tTX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV2Vla0RheUltcGwgPGVtPldlZWsgRGF5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldlZWtEYXlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0V2Vla0RheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXRUVLX0RBWSA9IDM3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRheSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VFS19EQVlfX0RBWV9UWVBFID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXkgV29ya2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFRUtfREFZX19EQVlfV09SS0lORyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZSBQZXJpb2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUVLX0RBWV9fVElNRV9QRVJJT0QgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmtpbmcgVGltZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUVLX0RBWV9fV09SS0lOR19USU1FUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPldlZWsgRGF5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFRUtfREFZX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV2Vla0RheXNJbXBsIDxlbT5XZWVrIERheXM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV2Vla0RheXNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0V2Vla0RheXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV0VFS19EQVlTID0gMzg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2VlayBEYXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFRUtfREFZU19fV0VFS19EQVkgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5XZWVrIERheXM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VFS19EQVlTX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV29ya2luZ1RpbWVJbXBsIDxlbT5Xb3JraW5nIFRpbWU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV29ya2luZ1RpbWVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0V29ya2luZ1RpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS0lOR19USU1FID0gMzk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJvbSBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS0lOR19USU1FX19GUk9NX1RJTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvIFRpbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLSU5HX1RJTUVfX1RPX1RJTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Xb3JraW5nIFRpbWU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS0lOR19USU1FX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV29ya2luZ1RpbWVzSW1wbCA8ZW0+V29ya2luZyBUaW1lczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Xb3JraW5nVGltZXNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0V29ya2luZ1RpbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktJTkdfVElNRVMgPSA0MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JraW5nIFRpbWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktJTkdfVElNRVNfX1dPUktJTkdfVElNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPldvcmtpbmcgVGltZXM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS0lOR19USU1FU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+QWNjcnVlIEF0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRBY2NydWVBdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBQ0NSVUVfQVQgPSA0MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+QWN0aXZlIERpcmVjdG9yeSBHVUlEIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQUNUSVZFX0RJUkVDVE9SWV9HVUlEX1RZUEUgPSA0MjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+QWxpYXMgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRBbGlhc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQUxJQVNfVFlQRSA9IDQzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5BdXRob3IgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRBdXRob3JUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFVVEhPUl9UWVBFID0gNDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9UWVBFID0gNDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkJvb2tpbmcgVHlwZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRCb29raW5nVHlwZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQk9PS0lOR19UWVBFX1RZUEUgPSA0NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Qm9va2luZyBUeXBlIFR5cGUxPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRCb29raW5nVHlwZVR5cGUxKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJPT0tJTkdfVFlQRV9UWVBFMSA9IDQ3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5DYWxjdWxhdGlvbiBUeXBlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldENhbGN1bGF0aW9uVHlwZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ0FMQ1VMQVRJT05fVFlQRV9UWVBFID0gNDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkNhdGVnb3J5IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Q2F0ZWdvcnlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENBVEVHT1JZX1RZUEUgPSA0OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q29kZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldENvZGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPREVfVFlQRSA9IDUwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Db21wYW55IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Q29tcGFueVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09NUEFOWV9UWVBFID0gNTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkNvbnN0cmFpbnQgVHlwZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDb25zdHJhaW50VHlwZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9UWVBFX1RZUEUgPSA1MjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q29udGFjdCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldENvbnRhY3RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlRBQ1RfVFlQRSA9IDUzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Db3N0IFJhdGUgVGFibGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Q29zdFJhdGVUYWJsZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09TVF9SQVRFX1RBQkxFX1RZUEUgPSA1NDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9UWVBFID0gNTU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkN1cnJlbmN5IFN5bWJvbCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEN1cnJlbmN5U3ltYm9sVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDVVJSRU5DWV9TWU1CT0xfVFlQRSA9IDU2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EYXkgVHlwZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXREYXlUeXBlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEQVlfVFlQRV9UWVBFID0gNTc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkRlZmF1bHQgRml4ZWQgQ29zdCBBY2NydWFsIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFID0gNTg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2QgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVGQVVMVF9UQVNLX0VWX01FVEhPRF9UWVBFID0gNTk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkRlZmF1bHQgVGFzayBUeXBlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldERlZmF1bHRUYXNrVHlwZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVGQVVMVF9UQVNLX1RZUEVfVFlQRSA9IDYwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RHVyYXRpb25Gb3JtYXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERVUkFUSU9OX0ZPUk1BVF9UWVBFID0gNjE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVVJBVElPTl9GT1JNQVRfVFlQRTEgPSA2MjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUyPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXREdXJhdGlvbkZvcm1hdFR5cGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERVUkFUSU9OX0ZPUk1BVF9UWVBFMiA9IDYzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTM8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldER1cmF0aW9uRm9ybWF0VHlwZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFVSQVRJT05fRk9STUFUX1RZUEUzID0gNjQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlNDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RHVyYXRpb25Gb3JtYXRUeXBlNCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVVJBVElPTl9GT1JNQVRfVFlQRTQgPSA2NTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU1PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXREdXJhdGlvbkZvcm1hdFR5cGU1KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERVUkFUSU9OX0ZPUk1BVF9UWVBFNSA9IDY2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEVhcm5lZFZhbHVlTWV0aG9kVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFQVJORURfVkFMVUVfTUVUSE9EX1RZUEUgPSA2NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZCBUeXBlMTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RWFybmVkVmFsdWVNZXRob2RUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFQVJORURfVkFMVUVfTUVUSE9EX1RZUEUxID0gNjg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkVtYWlsIEFkZHJlc3MgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRFbWFpbEFkZHJlc3NUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVNQUlMX0FERFJFU1NfVFlQRSA9IDY5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3QgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWFRFUk5BTF9UQVNLX1BST0pFQ1RfVFlQRSA9IDcwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5GaXhlZCBDb3N0IEFjY3J1YWwgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRGaXhlZENvc3RBY2NydWFsVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBGSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRSA9IDcxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5GWSBTdGFydCBEYXRlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEZZU3RhcnREYXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBGWV9TVEFSVF9EQVRFX1RZUEUgPSA3MjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+R3JvdXAgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRHcm91cFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgR1JPVVBfVFlQRSA9IDczOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEh5cGVybGlua0FkZHJlc3NUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEhZUEVSTElOS19BRERSRVNTX1RZUEUgPSA3NDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0SHlwZXJsaW5rQWRkcmVzc1R5cGUxKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEhZUEVSTElOS19BRERSRVNTX1RZUEUxID0gNzU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkh5cGVybGluayBBZGRyZXNzIFR5cGUyPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEh5cGVybGlua0FkZHJlc3NUeXBlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfQUREUkVTU19UWVBFMiA9IDc2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3MgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRSA9IDc3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3MgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFMSA9IDc4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3MgVHlwZTI8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFMiA9IDc5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5IeXBlcmxpbmsgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRIeXBlcmxpbmtUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEhZUEVSTElOS19UWVBFID0gODA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkh5cGVybGluayBUeXBlMTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRIeXBlcmxpbmtUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfVFlQRTEgPSA4MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIFR5cGUyPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEh5cGVybGlua1R5cGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEhZUEVSTElOS19UWVBFMiA9IDgyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Jbml0aWFscyBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEluaXRpYWxzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJTklUSUFMU19UWVBFID0gODM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkxhZyBGb3JtYXQgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0TGFnRm9ybWF0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMQUdfRk9STUFUX1RZUEUgPSA4NDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldExldmVsaW5nRGVsYXlGb3JtYXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9UWVBFID0gODU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdCBUeXBlMTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9UWVBFMSA9IDg2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5NYW5hZ2VyIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0TWFuYWdlclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUFOQUdFUl9UWVBFID0gODc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk1hdGVyaWFsIExhYmVsIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0TWF0ZXJpYWxMYWJlbFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUFURVJJQUxfTEFCRUxfVFlQRSA9IDg4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5OYW1lIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0TmFtZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTkFNRV9UWVBFID0gODk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk5hbWUgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0TmFtZVR5cGUxKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5BTUVfVFlQRTEgPSA5MDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TmFtZSBUeXBlMjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXROYW1lVHlwZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTkFNRV9UWVBFMiA9IDkxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5OYW1lIFR5cGUzPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE5hbWVUeXBlMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBOQU1FX1RZUEUzID0gOTI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0TmV3VGFza1N0YXJ0RGF0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTkVXX1RBU0tfU1RBUlRfREFURV9UWVBFID0gOTM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk5UIEFjY291bnQgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXROVEFjY291bnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5UX0FDQ09VTlRfVFlQRSA9IDk0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5PdXRsaW5lIE51bWJlciBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE91dGxpbmVOdW1iZXJUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE9VVExJTkVfTlVNQkVSX1RZUEUgPSA5NTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBPVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFID0gOTY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0IFR5cGUxPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRPdmVydGltZVJhdGVGb3JtYXRUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBPVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFMSA9IDk3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5QaG9uZXRpYyBBbGlhcyBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFBob25ldGljQWxpYXNUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBIT05FVElDX0FMSUFTX1RZUEUgPSA5ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UGhvbmV0aWNzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UGhvbmV0aWNzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQSE9ORVRJQ1NfVFlQRSA9IDk5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5QcmVmaXggVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRQcmVmaXhUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBSRUZJWF9UWVBFID0gMTAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5SYXRlIFRhYmxlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFJhdGVUYWJsZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkFURV9UQUJMRV9UWVBFID0gMTAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Sb2xsdXAgVHlwZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRSb2xsdXBUeXBlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0xMVVBfVFlQRV9UWVBFID0gMTAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRTdGFuZGFyZFJhdGVGb3JtYXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEUgPSAxMDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0IFR5cGUxPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTVEFOREFSRF9SQVRFX0ZPUk1BVF9UWVBFMSA9IDEwNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+U3ViamVjdCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFN1YmplY3RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNVQkpFQ1RfVFlQRSA9IDEwNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+U3VicHJvamVjdCBOYW1lIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0U3VicHJvamVjdE5hbWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNVQlBST0pFQ1RfTkFNRV9UWVBFID0gMTA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5UaXRsZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFRpdGxlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUSVRMRV9UWVBFID0gMTA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5UeXBlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFR5cGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRZUEVfVFlQRSA9IDEwODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VHlwZSBUeXBlMTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VHlwZVR5cGUxKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRZUEVfVFlQRTEgPSAxMDk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlR5cGUgVHlwZTI8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFR5cGVUeXBlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUWVBFX1RZUEUyID0gMTEwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5UeXBlIFR5cGUzPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUeXBlVHlwZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVFlQRV9UWVBFMyA9IDExMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VHlwZSBUeXBlNDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VHlwZVR5cGU0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRZUEVfVFlQRTQgPSAxMTI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlR5cGUgVHlwZTU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFR5cGVUeXBlNSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUWVBFX1RZUEU1ID0gMTEzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5VSUQgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRVSURUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFVJRF9UWVBFID0gMTE0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Vbml0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFVuaXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFVOSVRfVFlQRSA9IDExNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXIgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VmFsdWVsaXN0U29ydE9yZGVyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBWQUxVRUxJU1RfU09SVF9PUkRFUl9UWVBFID0gMTE2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5XZWVrIFN0YXJ0IERheSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRXZWVrU3RhcnREYXlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdFRUtfU1RBUlRfREFZX1RZUEUgPSAxMTc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPldvcmsgQ29udG91ciBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRXb3JrQ29udG91clR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19DT05UT1VSX1RZUEUgPSAxMTg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPldvcmsgRm9ybWF0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdvcmtGb3JtYXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfRk9STUFUX1RZUEUgPSAxMTk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPldvcmsgR3JvdXAgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0V29ya0dyb3VwVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX0dST1VQX1RZUEUgPSAxMjA7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCA8ZW0+QXNzaWdubWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Bc3NpZ25tZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBc3NpZ25tZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVSUQgPGVtPlVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVSUQoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRUYXNrVUlEIDxlbT5UYXNrIFVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhc2sgVUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFRhc2tVSUQoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfVGFza1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVzb3VyY2VVSUQgPGVtPlJlc291cmNlIFVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc291cmNlIFVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZXNvdXJjZVVJRCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZXNvdXJjZVVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUGVyY2VudFdvcmtDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbEZpbmlzaCA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBGaW5pc2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsRmluaXNoKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbEZpbmlzaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0IDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbE92ZXJ0aW1lV29yayA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxTdGFydCA8ZW0+QWN0dWFsIFN0YXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIFN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxXb3JrIDxlbT5BY3R1YWwgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbFdvcmsoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFDV1A8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QUNXUCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0NvbmZpcm1lZCA8ZW0+Q29uZmlybWVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29uZmlybWVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzQ29uZmlybWVkKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0NvbmZpcm1lZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Db3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDb3N0UmF0ZVRhYmxlIDxlbT5Db3N0IFJhdGUgVGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0IFJhdGUgVGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFJhdGVUYWJsZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Db3N0UmF0ZVRhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDb3N0VmFyaWFuY2UgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0IFZhcmlhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Db3N0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENWIDxlbT5DVjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNWPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENWKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0NWKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXREZWxheSA8ZW0+RGVsYXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWxheTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXREZWxheSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9EZWxheSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5pc2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RmluaXNoKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0ZpbmlzaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RmluaXNoVmFyaWFuY2UgPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRGaW5pc2hWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9GaW5pc2hWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IeXBlcmxpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0SHlwZXJsaW5rKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0h5cGVybGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0SHlwZXJsaW5rQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0h5cGVybGlua0FkZHJlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0h5cGVybGlua1N1YkFkZHJlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcmsgVmFyaWFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1dvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNIYXNGaXhlZFJhdGVVbml0cyA8ZW0+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IYXMgRml4ZWQgUmF0ZSBVbml0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0hhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0hhc0ZpeGVkUmF0ZVVuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0ZpeGVkTWF0ZXJpYWwgPGVtPkZpeGVkIE1hdGVyaWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Rml4ZWQgTWF0ZXJpYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNGaXhlZE1hdGVyaWFsKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0ZpeGVkTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldExldmVsaW5nRGVsYXkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0TGV2ZWxpbmdEZWxheSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9MZXZlbGluZ0RlbGF5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0IDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9MZXZlbGluZ0RlbGF5Rm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0xpbmtlZEZpZWxkcyA8ZW0+TGlua2VkIEZpZWxkczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxpbmtlZCBGaWVsZHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNMaW5rZWRGaWVsZHMoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfTGlua2VkRmllbGRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc01pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzTWlsZXN0b25lKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X01pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Tm90ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Tm90ZXMoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfTm90ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzT3ZlcmFsbG9jYXRlZCA8ZW0+T3ZlcmFsbG9jYXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXJhbGxvY2F0ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNPdmVyYWxsb2NhdGVkKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X092ZXJhbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE92ZXJ0aW1lQ29zdCA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0T3ZlcnRpbWVDb3N0KCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X092ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlcnRpbWUgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRPdmVydGltZVdvcmsoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZWd1bGFyV29yayA8ZW0+UmVndWxhciBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVndWxhciBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlZ3VsYXJXb3JrKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlZ3VsYXJXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdDb3N0IDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFpbmluZyBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVtYWluaW5nQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZW1haW5pbmdPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFpbmluZyBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ1dvcmsoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVtYWluaW5nV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNSZXNwb25zZVBlbmRpbmcgPGVtPlJlc3BvbnNlIFBlbmRpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzUmVzcG9uc2VQZW5kaW5nKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1Jlc3BvbnNlUGVuZGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RhcnQoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0b3AgPGVtPlN0b3A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdG9wPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0b3AoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfU3RvcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVzdW1lIDxlbT5SZXN1bWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXN1bWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVzdW1lKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1Jlc3VtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RhcnRWYXJpYW5jZSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydCBWYXJpYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdGFydFZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1N0YXJ0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFVuaXRzIDxlbT5Vbml0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVuaXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFVuaXRzKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1VuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1VwZGF0ZU5lZWRlZCA8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNVcGRhdGVOZWVkZWQoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfVXBkYXRlTmVlZGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRWQUMgPGVtPlZBQzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZBQzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRWQUMoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfVkFDKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRXb3JrKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1dvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtDb250b3VyIDxlbT5Xb3JrIENvbnRvdXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrIENvbnRvdXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29ya0NvbnRvdXIoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfV29ya0NvbnRvdXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dTPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1MoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1A8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9CQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCb29raW5nVHlwZSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Qm9va2luZyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJvb2tpbmdUeXBlKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0Jvb2tpbmdUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxXb3JrUHJvdGVjdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDcmVhdGlvbkRhdGUgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DcmVhdGlvbiBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENyZWF0aW9uRGF0ZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9DcmVhdGlvbkRhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBc3NpZ25tZW50X0V4dGVuZGVkQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJhc2VsaW5lIDxlbT5CYXNlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QmFzZWxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QmFzZWxpbmUoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFzc2lnbm1lbnRfQmFzZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFRpbWVwaGFzZWREYXRhKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBc3NpZ25tZW50X1RpbWVwaGFzZWREYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzIDxlbT5Bc3NpZ25tZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Bc3NpZ25tZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFzc2lnbm1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50cyNnZXRBc3NpZ25tZW50IDxlbT5Bc3NpZ25tZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Bc3NpZ25tZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50cyNnZXRBc3NpZ25tZW50KCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXNzaWdubWVudHNfQXNzaWdubWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QjZ2V0QXZhaWxhYmxlRnJvbSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdmFpbGFibGUgRnJvbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZUZyb20oKQotCSAqIEBzZWUgI2dldEF2YWlsYWJpbGl0eVBlcmlvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kX0F2YWlsYWJsZUZyb20oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QjZ2V0QXZhaWxhYmxlVG8gPGVtPkF2YWlsYWJsZSBUbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF2YWlsYWJsZSBUbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZVRvKCkKLQkgKiBAc2VlICNnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEF2YWlsYWJpbGl0eVBlcmlvZF9BdmFpbGFibGVUbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVVbml0cyA8ZW0+QXZhaWxhYmxlIFVuaXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXZhaWxhYmxlIFVuaXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QjZ2V0QXZhaWxhYmxlVW5pdHMoKQotCSAqIEBzZWUgI2dldEF2YWlsYWJpbGl0eVBlcmlvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kX0F2YWlsYWJsZVVuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZHMgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2RzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2RzI2dldEF2YWlsYWJpbGl0eVBlcmlvZCA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kcyNnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKQotCSAqIEBzZWUgI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEF2YWlsYWJpbGl0eVBlcmlvZHNfQXZhaWxhYmlsaXR5UGVyaW9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lIDxlbT5CYXNlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CYXNlbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEJhc2VsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldFRpbWVwaGFzZWREYXRhKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QmFzZWxpbmVfVGltZXBoYXNlZERhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk51bWJlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0TnVtYmVyKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfTnVtYmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjaXNJbnRlcmltIDxlbT5JbnRlcmltPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW50ZXJpbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjaXNJbnRlcmltKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfSW50ZXJpbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRTdGFydCgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lX1N0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5pc2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lX0ZpbmlzaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldER1cmF0aW9uIDxlbT5EdXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkR1cmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXREdXJhdGlvbigpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lX0R1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9EdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzRXN0aW1hdGVkRHVyYXRpb24gPGVtPkVzdGltYXRlZCBEdXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVzdGltYXRlZCBEdXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjaXNFc3RpbWF0ZWREdXJhdGlvbigpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lX0VzdGltYXRlZER1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0V29yayA8ZW0+V29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldFdvcmsoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9Xb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldENvc3QoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9Db3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1MoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9CQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1A8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1AoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9CQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiA8ZW0+QmFzZWxpbmUyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJhc2VsaW5lMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRCYXNlbGluZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OdW1iZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXROdW1iZXIoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUyX051bWJlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldFdvcmsoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUyX1dvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRDb3N0KCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9Db3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dTPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTJfQkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QkNXUDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldEJDV1AoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUyX0JDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzIDxlbT5CYXNlbGluZTM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QmFzZWxpbmUzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEJhc2VsaW5lMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFRpbWVwaGFzZWREYXRhKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJhc2VsaW5lM19UaW1lcGhhc2VkRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk51bWJlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldE51bWJlcigpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfTnVtYmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0U3RhcnQoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX1N0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluaXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0RmluaXNoKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lM19GaW5pc2goKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0V29yayA8ZW0+V29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRXb3JrKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lM19Xb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0Q29zdCgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QkNXUzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1MoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX0JDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1A8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lM19CQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyIDxlbT5DYWxlbmRhcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DYWxlbmRhcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2dldFVJRCgpCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENhbGVuZGFyX1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRDYWxlbmRhcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q2FsZW5kYXJfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2lzSXNCYXNlQ2FsZW5kYXIgPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNpc0lzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNnZXRDYWxlbmRhcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q2FsZW5kYXJfSXNCYXNlQ2FsZW5kYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRCYXNlQ2FsZW5kYXJVSUQgPGVtPkJhc2UgQ2FsZW5kYXIgVUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QmFzZSBDYWxlbmRhciBVSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2dldEJhc2VDYWxlbmRhclVJRCgpCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENhbGVuZGFyX0Jhc2VDYWxlbmRhclVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2dldFdlZWtEYXlzIDxlbT5XZWVrIERheXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5XZWVrIERheXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2dldFdlZWtEYXlzKCkKLQkgKiBAc2VlICNnZXRDYWxlbmRhcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q2FsZW5kYXJfV2Vla0RheXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXJzIDxlbT5DYWxlbmRhcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2FsZW5kYXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENhbGVuZGFycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXJzI2dldENhbGVuZGFyIDxlbT5DYWxlbmRhcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q2FsZW5kYXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFycyNnZXRDYWxlbmRhcigpCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDYWxlbmRhcnNfQ2FsZW5kYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290IDxlbT5Eb2N1bWVudCBSb290PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RG9jdW1lbnRSb290KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NaXhlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldE1peGVkKCkKLQkgKiBAc2VlICNnZXREb2N1bWVudFJvb3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERvY3VtZW50Um9vdF9NaXhlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCNnZXRYTUxOU1ByZWZpeE1hcCA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCNnZXRYTUxOU1ByZWZpeE1hcCgpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0WFNJU2NoZW1hTG9jYXRpb24gPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hTSVNjaGVtYUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldFByb2plY3QgPGVtPlByb2plY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Qcm9qZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0UHJvamVjdCgpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfUHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEV4dGVuZGVkQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWVsZCBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RmllbGRJRCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0ZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRGaWVsZE5hbWUgPGVtPkZpZWxkIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWVsZCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRGaWVsZE5hbWUoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9GaWVsZE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRBbGlhcyA8ZW0+QWxpYXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbGlhczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0QWxpYXMoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9BbGlhcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFBob25ldGljQWxpYXMgPGVtPlBob25ldGljIEFsaWFzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFBob25ldGljQWxpYXMoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9QaG9uZXRpY0FsaWFzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0Um9sbHVwVHlwZSA8ZW0+Um9sbHVwIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Sb2xsdXAgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0Um9sbHVwVHlwZSgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX1JvbGx1cFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRDYWxjdWxhdGlvblR5cGUgPGVtPkNhbGN1bGF0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYWxjdWxhdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRDYWxjdWxhdGlvblR5cGUoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9DYWxjdWxhdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRGb3JtdWxhIDxlbT5Gb3JtdWxhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Rm9ybXVsYTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0Rm9ybXVsYSgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0Zvcm11bGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc1Jlc3RyaWN0VmFsdWVzIDxlbT5SZXN0cmljdCBWYWx1ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXN0cmljdCBWYWx1ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2lzUmVzdHJpY3RWYWx1ZXMoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9SZXN0cmljdFZhbHVlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFZhbHVlbGlzdFNvcnRPcmRlciA8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZWxpc3QgU29ydCBPcmRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0VmFsdWVsaXN0U29ydE9yZGVyKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfVmFsdWVsaXN0U29ydE9yZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjaXNBcHBlbmROZXdWYWx1ZXMgPGVtPkFwcGVuZCBOZXcgVmFsdWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2lzQXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfQXBwZW5kTmV3VmFsdWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RGVmYXVsdCA8ZW0+RGVmYXVsdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmF1bHQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldERlZmF1bHQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9EZWZhdWx0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0VmFsdWVMaXN0IDxlbT5WYWx1ZSBMaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VmFsdWUgTGlzdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0VmFsdWVMaXN0KCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfVmFsdWVMaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEV4dGVuZGVkQXR0cmlidXRlMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRVSUQgPGVtPlVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldFVJRCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmllbGQgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRGaWVsZElEKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlMl9GaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWUgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRWYWx1ZUlEKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlMl9WYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfRHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFVJRCA8ZW0+VUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0VUlEKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlM19VSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWVsZCBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldEZpZWxkSUQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX0ZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZSBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFZhbHVlSUQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX1ZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlM19EdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlNDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCNnZXRVSUQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlNCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpZWxkIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0RmllbGRJRCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfRmllbGRJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VmFsdWVJRCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfVmFsdWVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlNCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X0R1cmF0aW9uRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlcyA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZXMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEV4dGVuZGVkQXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzI2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEV4dGVuZGVkQXR0cmlidXRlc19FeHRlbmRlZEF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrIDxlbT5NYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1hc2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1hc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrI2dldExldmVsIDxlbT5MZXZlbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrI2dldExldmVsKCkKLQkgKiBAc2VlICNnZXRNYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNYXNrX0xldmVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRNYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNYXNrX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrI2dldExlbmd0aCA8ZW0+TGVuZ3RoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGVuZ3RoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrI2dldExlbmd0aCgpCi0JICogQHNlZSAjZ2V0TWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWFza19MZW5ndGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrI2dldFNlcGFyYXRvciA8ZW0+U2VwYXJhdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VwYXJhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrI2dldFNlcGFyYXRvcigpCi0JICogQHNlZSAjZ2V0TWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWFza19TZXBhcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza3MgPGVtPk1hc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1hc2tzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2tzI2dldE1hc2sgPGVtPk1hc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1hc2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2tzI2dldE1hc2soKQotCSAqIEBzZWUgI2dldE1hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNYXNrc19NYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0T3V0bGluZUNvZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpZWxkIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRGaWVsZElEKCkKLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGVfRmllbGRJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldEZpZWxkTmFtZSA8ZW0+RmllbGQgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpZWxkIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldEZpZWxkTmFtZSgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0ZpZWxkTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldEFsaWFzIDxlbT5BbGlhczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFsaWFzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRBbGlhcygpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0FsaWFzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0UGhvbmV0aWNBbGlhcyA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QaG9uZXRpYyBBbGlhczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0UGhvbmV0aWNBbGlhcygpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX1Bob25ldGljQWxpYXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRWYWx1ZXMgPGVtPlZhbHVlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlZhbHVlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0VmFsdWVzKCkKLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0T3V0bGluZUNvZGVfVmFsdWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNFbnRlcnByaXNlIDxlbT5FbnRlcnByaXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RW50ZXJwcmlzZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNFbnRlcnByaXNlKCkKLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGVfRW50ZXJwcmlzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzIDxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVudGVycHJpc2UgT3V0bGluZSBDb2RlIEFsaWFzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0VudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkKLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGVfUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNMZWFmT25seSA8ZW0+TGVhZiBPbmx5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGVhZiBPbmx5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0xlYWZPbmx5KCkKLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGVfTGVhZk9ubHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0FsbExldmVsc1JlcXVpcmVkIDxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWxsIExldmVscyBSZXF1aXJlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNBbGxMZXZlbHNSZXF1aXJlZCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0FsbExldmVsc1JlcXVpcmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkIDxlbT5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkKLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGVfT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldE1hc2tzIDxlbT5NYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk1hc2tzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRNYXNrcygpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE91dGxpbmVDb2RlX01hc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiA8ZW0+T3V0bGluZSBDb2RlMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PdXRsaW5lIENvZGUyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE91dGxpbmVDb2RlMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRVSUQgPGVtPlVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyI2dldFVJRCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTJfVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmllbGQgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRGaWVsZElEKCkKLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlMl9GaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWUgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRWYWx1ZUlEKCkKLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlMl9WYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyA8ZW0+T3V0bGluZSBDb2RlMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PdXRsaW5lIENvZGUzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE91dGxpbmVDb2RlMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRVSUQgPGVtPlVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzI2dldFVJRCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTNfVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmllbGQgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRGaWVsZElEKCkKLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlM19GaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWUgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRWYWx1ZUlEKCkKLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlM19WYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlcyA8ZW0+T3V0bGluZSBDb2RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PdXRsaW5lIENvZGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZXMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE91dGxpbmVDb2RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzI2dldE91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk91dGxpbmUgQ29kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE91dGxpbmVDb2Rlc19PdXRsaW5lQ29kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsgPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcmVkZWNlc3NvckxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0UHJlZGVjZXNzb3JVSUQgPGVtPlByZWRlY2Vzc29yIFVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByZWRlY2Vzc29yIFVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldFByZWRlY2Vzc29yVUlEKCkKLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvckxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19QcmVkZWNlc3NvclVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFByZWRlY2Vzc29yTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJlZGVjZXNzb3JMaW5rX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjaXNDcm9zc1Byb2plY3QgPGVtPkNyb3NzIFByb2plY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Dcm9zcyBQcm9qZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjaXNDcm9zc1Byb2plY3QoKQotCSAqIEBzZWUgI2dldFByZWRlY2Vzc29yTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJlZGVjZXNzb3JMaW5rX0Nyb3NzUHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRDcm9zc1Byb2plY3ROYW1lIDxlbT5Dcm9zcyBQcm9qZWN0IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Dcm9zcyBQcm9qZWN0IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRDcm9zc1Byb2plY3ROYW1lKCkKLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvckxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19Dcm9zc1Byb2plY3ROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldExpbmtMYWcgPGVtPkxpbmsgTGFnPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGluayBMYWc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRMaW5rTGFnKCkKLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvckxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19MaW5rTGFnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldExhZ0Zvcm1hdCA8ZW0+TGFnIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxhZyBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRMYWdGb3JtYXQoKQotCSAqIEBzZWUgI2dldFByZWRlY2Vzc29yTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJlZGVjZXNzb3JMaW5rX0xhZ0Zvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0IDxlbT5Qcm9qZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2plY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFVJRCA8ZW0+VUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFVJRCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9VSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0VGl0bGUgPGVtPlRpdGxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGl0bGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0VGl0bGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfVGl0bGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN1YmplY3QgPGVtPlN1YmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdWJqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN1YmplY3QoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfU3ViamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2F0ZWdvcnkgPGVtPkNhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2F0ZWdvcnkoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQ2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENvbXBhbnkgPGVtPkNvbXBhbnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db21wYW55PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENvbXBhbnkoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQ29tcGFueSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TWFuYWdlciA8ZW0+TWFuYWdlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hbmFnZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TWFuYWdlcigpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9NYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRBdXRob3IgPGVtPkF1dGhvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF1dGhvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRBdXRob3IoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQXV0aG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDcmVhdGlvbkRhdGUgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DcmVhdGlvbiBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENyZWF0aW9uRGF0ZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DcmVhdGlvbkRhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFJldmlzaW9uIDxlbT5SZXZpc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJldmlzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFJldmlzaW9uKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1JldmlzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRMYXN0U2F2ZWQgPGVtPkxhc3QgU2F2ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MYXN0IFNhdmVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldExhc3RTYXZlZCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9MYXN0U2F2ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU2NoZWR1bGVGcm9tU3RhcnQgPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU2NoZWR1bGVGcm9tU3RhcnQoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfU2NoZWR1bGVGcm9tU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0IERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0U3RhcnREYXRlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1N0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RmluaXNoRGF0ZSA8ZW0+RmluaXNoIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5pc2ggRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRGaW5pc2hEYXRlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0ZpbmlzaERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEZZU3RhcnREYXRlIDxlbT5GWSBTdGFydCBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RlkgU3RhcnQgRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRGWVN0YXJ0RGF0ZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9GWVN0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3JpdGljYWxTbGFja0xpbWl0IDxlbT5Dcml0aWNhbCBTbGFjayBMaW1pdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNyaXRpY2FsIFNsYWNrIExpbWl0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENyaXRpY2FsU2xhY2tMaW1pdCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Dcml0aWNhbFNsYWNrTGltaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbmN5RGlnaXRzIDxlbT5DdXJyZW5jeSBEaWdpdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DdXJyZW5jeSBEaWdpdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lEaWdpdHMoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQ3VycmVuY3lEaWdpdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbmN5U3ltYm9sIDxlbT5DdXJyZW5jeSBTeW1ib2w8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DdXJyZW5jeSBTeW1ib2w8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lTeW1ib2woKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQ3VycmVuY3lTeW1ib2woKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24gPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0N1cnJlbmN5U3ltYm9sUG9zaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhbGVuZGFyVUlEIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYWxlbmRhciBVSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQ2FsZW5kYXJVSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFydFRpbWUgPGVtPkRlZmF1bHQgU3RhcnQgVGltZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmF1bHQgU3RhcnQgVGltZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0U3RhcnRUaW1lKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0RlZmF1bHRTdGFydFRpbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRGaW5pc2hUaW1lIDxlbT5EZWZhdWx0IEZpbmlzaCBUaW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBGaW5pc2ggVGltZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0RmluaXNoVGltZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0RmluaXNoVGltZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TWludXRlc1BlckRheSA8ZW0+TWludXRlcyBQZXIgRGF5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWludXRlcyBQZXIgRGF5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1pbnV0ZXNQZXJEYXkoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTWludXRlc1BlckRheSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TWludXRlc1BlcldlZWsgPGVtPk1pbnV0ZXMgUGVyIFdlZWs8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1pbnV0ZXNQZXJXZWVrKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01pbnV0ZXNQZXJXZWVrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREYXlzUGVyTW9udGggPGVtPkRheXMgUGVyIE1vbnRoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGF5cyBQZXIgTW9udGg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGF5c1Blck1vbnRoKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0RheXNQZXJNb250aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFRhc2tUeXBlIDxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrVHlwZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0VGFza1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsIDxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmF1bHQgRml4ZWQgQ29zdCBBY2NydWFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0RlZmF1bHRGaXhlZENvc3RBY2NydWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0U3RhbmRhcmRSYXRlIDxlbT5EZWZhdWx0IFN0YW5kYXJkIFJhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IFN0YW5kYXJkIFJhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0U3RhbmRhcmRSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlIDxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0T3ZlcnRpbWVSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0R1cmF0aW9uRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXb3JrRm9ybWF0IDxlbT5Xb3JrIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcmsgRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFdvcmtGb3JtYXQoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfV29ya0Zvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNFZGl0YWJsZUFjdHVhbENvc3RzIDxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNFZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0VkaXRhYmxlQWN0dWFsQ29zdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzSG9ub3JDb25zdHJhaW50cyA8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0hvbm9yQ29uc3RyYWludHMoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfSG9ub3JDb25zdHJhaW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RWFybmVkVmFsdWVNZXRob2QgPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEVhcm5lZFZhbHVlTWV0aG9kKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0Vhcm5lZFZhbHVlTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSA8ZW0+SW5zZXJ0ZWQgUHJvamVjdHMgTGlrZSBTdW1tYXJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5zZXJ0ZWQgUHJvamVjdHMgTGlrZSBTdW1tYXJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMgPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TXVsdGlwbGUgQ3JpdGljYWwgUGF0aHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTXVsdGlwbGVDcml0aWNhbFBhdGhzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuIDxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTmV3VGFza3NFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTmV3VGFza3NFZmZvcnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTmV3VGFza3NFc3RpbWF0ZWQgPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OZXcgVGFza3MgRXN0aW1hdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTmV3VGFza3NFc3RpbWF0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIDxlbT5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZEFjdHVhbENvc3QgPGVtPlNwcmVhZCBBY3R1YWwgQ29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNwcmVhZCBBY3R1YWwgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZEFjdHVhbENvc3QoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfU3ByZWFkQWN0dWFsQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUgPGVtPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfU3ByZWFkUGVyY2VudENvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1Rhc2tVcGRhdGVzUmVzb3VyY2UgPGVtPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1Rhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfVGFza1VwZGF0ZXNSZXNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNGaXNjYWxZZWFyU3RhcnQgPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmlzY2FsIFllYXIgU3RhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNGaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRmlzY2FsWWVhclN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXZWVrU3RhcnREYXkgPGVtPldlZWsgU3RhcnQgRGF5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V2VlayBTdGFydCBEYXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V2Vla1N0YXJ0RGF5KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1dlZWtTdGFydERheSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2sgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgQmFjazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgQmFjazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Nb3ZlQ29tcGxldGVkRW5kc0JhY2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2sgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEJhY2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Nb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCA8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEZvcndhcmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSA8ZW0+QmFzZWxpbmUgRm9yIEVhcm5lZCBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9CYXNlbGluZUZvckVhcm5lZFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyA8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdXRvIEFkZCBOZXcgUmVzb3VyY2VzIEFuZCBUYXNrczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9BdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN0YXR1c0RhdGUgPGVtPlN0YXR1cyBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhdHVzIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0U3RhdHVzRGF0ZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9TdGF0dXNEYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW50RGF0ZSA8ZW0+Q3VycmVudCBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3VycmVudCBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbnREYXRlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0N1cnJlbnREYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NaWNyb3NvZnQgUHJvamVjdCBTZXJ2ZXIgVVJMPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9NaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9saW5rIDxlbT5BdXRvbGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF1dG9saW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQXV0b2xpbmsoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQXV0b2xpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE5ld1Rhc2tTdGFydERhdGUgPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OZXcgVGFzayBTdGFydCBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE5ld1Rhc2tTdGFydERhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTmV3VGFza1N0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCA8ZW0+RGVmYXVsdCBUYXNrIEVWIE1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0VGFza0VWTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkIDxlbT5Qcm9qZWN0IEV4dGVybmFsbHkgRWRpdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSA8ZW0+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVuZGVkIENyZWF0aW9uIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRXh0ZW5kZWRDcmVhdGlvbkRhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWN0dWFsc0luU3luYyA8ZW0+QWN0dWFscyBJbiBTeW5jPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFscyBJbiBTeW5jPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWN0dWFsc0luU3luYygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9BY3R1YWxzSW5TeW5jKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzIDxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FkbWluUHJvamVjdCA8ZW0+QWRtaW4gUHJvamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFkbWluIFByb2plY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBZG1pblByb2plY3QoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQWRtaW5Qcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRPdXRsaW5lQ29kZXMgPGVtPk91dGxpbmUgQ29kZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5PdXRsaW5lIENvZGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE91dGxpbmVDb2RlcygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvamVjdF9PdXRsaW5lQ29kZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFdCU01hc2tzIDxlbT5XQlMgTWFza3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5XQlMgTWFza3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V0JTTWFza3MoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2plY3RfV0JTTWFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEV4dGVuZGVkQXR0cmlidXRlcyA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9qZWN0X0V4dGVuZGVkQXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2FsZW5kYXJzIDxlbT5DYWxlbmRhcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5DYWxlbmRhcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2FsZW5kYXJzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9qZWN0X0NhbGVuZGFycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0VGFza3MgPGVtPlRhc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VGFza3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0VGFza3MoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2plY3RfVGFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFJlc291cmNlcyA8ZW0+UmVzb3VyY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UmVzb3VyY2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFJlc291cmNlcygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvamVjdF9SZXNvdXJjZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEFzc2lnbm1lbnRzIDxlbT5Bc3NpZ25tZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkFzc2lnbm1lbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEFzc2lnbm1lbnRzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9qZWN0X0Fzc2lnbm1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUgPGVtPlJhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0UmF0ZXNGcm9tIDxlbT5SYXRlcyBGcm9tPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmF0ZXMgRnJvbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRSYXRlc0Zyb20oKQotCSAqIEBzZWUgI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJhdGVfUmF0ZXNGcm9tKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRSYXRlc1RvIDxlbT5SYXRlcyBUbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJhdGVzIFRvPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVzVG8oKQotCSAqIEBzZWUgI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJhdGVfUmF0ZXNUbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0UmF0ZVRhYmxlIDxlbT5SYXRlIFRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmF0ZSBUYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRSYXRlVGFibGUoKQotCSAqIEBzZWUgI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJhdGVfUmF0ZVRhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRTdGFuZGFyZFJhdGUgPGVtPlN0YW5kYXJkIFJhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFuZGFyZCBSYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjZ2V0UmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmF0ZV9TdGFuZGFyZFJhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKQotCSAqIEBzZWUgI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJhdGVfU3RhbmRhcmRSYXRlRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGUgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVydGltZSBSYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldE92ZXJ0aW1lUmF0ZSgpCi0JICogQHNlZSAjZ2V0UmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmF0ZV9PdmVydGltZVJhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGVGb3JtYXQoKQotCSAqIEBzZWUgI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJhdGVfT3ZlcnRpbWVSYXRlRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRDb3N0UGVyVXNlIDxlbT5Db3N0IFBlciBVc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0IFBlciBVc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0Q29zdFBlclVzZSgpCi0JICogQHNlZSAjZ2V0UmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmF0ZV9Db3N0UGVyVXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVzIDxlbT5SYXRlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SYXRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJhdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlcyNnZXRSYXRlIDxlbT5SYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlcyNnZXRSYXRlKCkKLQkgKiBAc2VlICNnZXRSYXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmF0ZXNfUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSA8ZW0+UmVzb3VyY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVzb3VyY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSZXNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFVJRCA8ZW0+VUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRVSUQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9VSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRJRCA8ZW0+SUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SUQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9JRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNOdWxsIDxlbT5JcyBOdWxsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgTnVsbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc051bGwoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jc051bGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRJbml0aWFscyA8ZW0+SW5pdGlhbHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Jbml0aWFsczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SW5pdGlhbHMoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jbml0aWFscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFBob25ldGljcyA8ZW0+UGhvbmV0aWNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGhvbmV0aWNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQaG9uZXRpY3MoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9QaG9uZXRpY3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROVEFjY291bnQgPGVtPk5UIEFjY291bnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OVCBBY2NvdW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROVEFjY291bnQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9OVEFjY291bnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRNYXRlcmlhbExhYmVsIDxlbT5NYXRlcmlhbCBMYWJlbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hdGVyaWFsIExhYmVsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRNYXRlcmlhbExhYmVsKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfTWF0ZXJpYWxMYWJlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvZGUgPGVtPkNvZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb2RlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ29kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdyb3VwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRHcm91cCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0dyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0V29ya0dyb3VwIDxlbT5Xb3JrIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V29yayBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0V29ya0dyb3VwKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfV29ya0dyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0RW1haWxBZGRyZXNzIDxlbT5FbWFpbCBBZGRyZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RW1haWwgQWRkcmVzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0RW1haWxBZGRyZXNzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfRW1haWxBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IeXBlcmxpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEh5cGVybGluaygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0h5cGVybGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEh5cGVybGlua0FkZHJlc3MgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9IeXBlcmxpbmtBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSHlwZXJsaW5rU3ViQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE1heFVuaXRzIDxlbT5NYXggVW5pdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXggVW5pdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE1heFVuaXRzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfTWF4VW5pdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQZWFrVW5pdHMgPGVtPlBlYWsgVW5pdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QZWFrIFVuaXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQZWFrVW5pdHMoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9QZWFrVW5pdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc092ZXJBbGxvY2F0ZWQgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzT3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX092ZXJBbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFibGVGcm9tIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFibGVGcm9tKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQXZhaWxhYmxlRnJvbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEF2YWlsYWJsZVRvIDxlbT5BdmFpbGFibGUgVG88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdmFpbGFibGUgVG88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEF2YWlsYWJsZVRvKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQXZhaWxhYmxlVG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U3RhcnQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9TdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluaXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRGaW5pc2goKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9GaW5pc2goKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0NhbkxldmVsIDxlbT5DYW4gTGV2ZWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYW4gTGV2ZWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzQ2FuTGV2ZWwoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9DYW5MZXZlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjY3J1ZUF0IDxlbT5BY2NydWUgQXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY2NydWUgQXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjY3J1ZUF0KCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWNjcnVlQXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0V29yaygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1dvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZWd1bGFyV29yayA8ZW0+UmVndWxhciBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVndWxhciBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZWd1bGFyV29yaygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1JlZ3VsYXJXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlcnRpbWUgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsV29yaygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbFdvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFpbmluZyBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUmVtYWluaW5nV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lV29yayA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0dWFsT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZW1haW5pbmdPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9QZXJjZW50V29ya0NvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U3RhbmRhcmRSYXRlIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U3RhbmRhcmRSYXRlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfU3RhbmRhcmRSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0IDxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9TdGFuZGFyZFJhdGVGb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0IDxlbT5Db3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0Nvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVJhdGUgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVydGltZSBSYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVJhdGUoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVydGltZVJhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVJhdGVGb3JtYXQgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX092ZXJ0aW1lUmF0ZUZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lQ29zdCA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX092ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvc3RQZXJVc2UgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvc3QgUGVyIFVzZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdFBlclVzZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0Nvc3RQZXJVc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0dWFsQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0dWFsT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1JlbWFpbmluZ0Nvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1JlbWFpbmluZ092ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcmsgVmFyaWFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1dvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvc3RWYXJpYW5jZSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvc3QgVmFyaWFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0Nvc3RWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFNWIDxlbT5TVjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNWPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTVigpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1NWKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q1YgPGVtPkNWPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q1Y8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENWKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QUNXUDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QUNXUCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0FDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FsZW5kYXIgVUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDYWxlbmRhclVJRCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0NhbGVuZGFyVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Tm90ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE5vdGVzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfTm90ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QkNXUzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0JDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QkNXUDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0JDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzR2VuZXJpYyA8ZW0+SXMgR2VuZXJpYzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIEdlbmVyaWM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNHZW5lcmljKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSXNHZW5lcmljKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0luYWN0aXZlIDxlbT5JcyBJbmFjdGl2ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIEluYWN0aXZlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzSW5hY3RpdmUoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jc0luYWN0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0VudGVycHJpc2UgPGVtPklzIEVudGVycHJpc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBFbnRlcnByaXNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0lzRW50ZXJwcmlzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJvb2tpbmdUeXBlIDxlbT5Cb29raW5nIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Cb29raW5nIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJvb2tpbmdUeXBlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQm9va2luZ1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxXb3JrUHJvdGVjdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdGl2ZURpcmVjdG9yeUdVSUQgPGVtPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdGl2ZURpcmVjdG9yeUdVSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDcmVhdGlvbkRhdGUgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DcmVhdGlvbiBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9DcmVhdGlvbkRhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9FeHRlbmRlZEF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QmFzZWxpbmUgPGVtPkJhc2VsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5CYXNlbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QmFzZWxpbmUoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9CYXNlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3V0bGluZUNvZGUgPGVtPk91dGxpbmUgQ29kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+T3V0bGluZSBDb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdXRsaW5lQ29kZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlc291cmNlX091dGxpbmVDb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcyA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlc291cmNlX0F2YWlsYWJpbGl0eVBlcmlvZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSYXRlcyA8ZW0+UmF0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5SYXRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmF0ZXMoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9SYXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlc291cmNlX1RpbWVwaGFzZWREYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlcyA8ZW0+UmVzb3VyY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlc291cmNlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2VzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSZXNvdXJjZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlcyNnZXRSZXNvdXJjZSA8ZW0+UmVzb3VyY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJlc291cmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXMjZ2V0UmVzb3VyY2UoKQotCSAqIEBzZWUgI2dldFJlc291cmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VzX1Jlc291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sgPGVtPlRhc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0VUlEKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SUQgPGVtPklEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SUQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIE51bGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc051bGwoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfSXNOdWxsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDcmVhdGVEYXRlIDxlbT5DcmVhdGUgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNyZWF0ZSBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENyZWF0ZURhdGUoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQ3JlYXRlRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29udGFjdCA8ZW0+Q29udGFjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbnRhY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29udGFjdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Db250YWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXQlMgPGVtPldCUzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldCUzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXQlMoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfV0JTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXQlNMZXZlbCA8ZW0+V0JTIExldmVsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V0JTIExldmVsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdCU0xldmVsKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1dCU0xldmVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdXRsaW5lTnVtYmVyIDxlbT5PdXRsaW5lIE51bWJlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk91dGxpbmUgTnVtYmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE91dGxpbmVOdW1iZXIoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfT3V0bGluZU51bWJlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZUxldmVsIDxlbT5PdXRsaW5lIExldmVsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3V0bGluZSBMZXZlbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdXRsaW5lTGV2ZWwoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfT3V0bGluZUxldmVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmlvcml0eSA8ZW0+UHJpb3JpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcmlvcml0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmlvcml0eSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Qcmlvcml0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RhcnQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluaXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19GaW5pc2goKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldER1cmF0aW9uIDxlbT5EdXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkR1cmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldER1cmF0aW9uKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0R1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0R1cmF0aW9uRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXb3JrKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1dvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN0b3AgPGVtPlN0b3A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdG9wPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN0b3AoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfU3RvcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVzdW1lIDxlbT5SZXN1bWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXN1bWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVzdW1lKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1Jlc3VtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSZXN1bWVWYWxpZCA8ZW0+UmVzdW1lIFZhbGlkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzdW1lIFZhbGlkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVzdW1lVmFsaWQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUmVzdW1lVmFsaWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRWZmb3J0RHJpdmVuIDxlbT5FZmZvcnQgRHJpdmVuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWZmb3J0IERyaXZlbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19FZmZvcnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVjdXJyaW5nIDxlbT5SZWN1cnJpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWN1cnJpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSZWN1cnJpbmcoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUmVjdXJyaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc092ZXJBbGxvY2F0ZWQgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX092ZXJBbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRXN0aW1hdGVkIDxlbT5Fc3RpbWF0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Fc3RpbWF0ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRXN0aW1hdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc01pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTWlsZXN0b25lKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX01pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNTdW1tYXJ5IDxlbT5TdW1tYXJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3VtbWFyeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1N1bW1hcnkoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfU3VtbWFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNDcml0aWNhbCA8ZW0+Q3JpdGljYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Dcml0aWNhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0NyaXRpY2FsKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0NyaXRpY2FsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdCA8ZW0+SXMgU3VicHJvamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFN1YnByb2plY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfSXNTdWJwcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdFJlYWRPbmx5IDxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfSXNTdWJwcm9qZWN0UmVhZE9ubHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN1YnByb2plY3ROYW1lIDxlbT5TdWJwcm9qZWN0IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdWJwcm9qZWN0IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3VicHJvamVjdE5hbWUoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfU3VicHJvamVjdE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRXh0ZXJuYWxUYXNrIDxlbT5FeHRlcm5hbCBUYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXh0ZXJuYWwgVGFzazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0V4dGVybmFsVGFzaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19FeHRlcm5hbFRhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEV4dGVybmFsVGFza1Byb2plY3QgPGVtPkV4dGVybmFsIFRhc2sgUHJvamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVybmFsIFRhc2sgUHJvamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFeHRlcm5hbFRhc2tQcm9qZWN0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0V4dGVybmFsVGFza1Byb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEVhcmx5U3RhcnQgPGVtPkVhcmx5IFN0YXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWFybHkgU3RhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybHlTdGFydCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19FYXJseVN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJseUZpbmlzaCA8ZW0+RWFybHkgRmluaXNoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWFybHkgRmluaXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEVhcmx5RmluaXNoKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0Vhcmx5RmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMYXRlU3RhcnQgPGVtPkxhdGUgU3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MYXRlIFN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExhdGVTdGFydCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19MYXRlU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExhdGVGaW5pc2ggPGVtPkxhdGUgRmluaXNoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGF0ZSBGaW5pc2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGF0ZUZpbmlzaCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19MYXRlRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdGFydFZhcmlhbmNlIDxlbT5TdGFydCBWYXJpYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN0YXJ0VmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfU3RhcnRWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RmluaXNoVmFyaWFuY2UgPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaW5pc2hWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19GaW5pc2hWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V29yayBWYXJpYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfV29ya1ZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGcmVlU2xhY2sgPGVtPkZyZWUgU2xhY2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GcmVlIFNsYWNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZyZWVTbGFjaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19GcmVlU2xhY2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFRvdGFsU2xhY2sgPGVtPlRvdGFsIFNsYWNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VG90YWwgU2xhY2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0VG90YWxTbGFjaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Ub3RhbFNsYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3QgPGVtPkZpeGVkIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaXhlZCBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpeGVkQ29zdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19GaXhlZENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpeGVkQ29zdEFjY3J1YWwgPGVtPkZpeGVkIENvc3QgQWNjcnVhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpeGVkIENvc3QgQWNjcnVhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3RBY2NydWFsKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0ZpeGVkQ29zdEFjY3J1YWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBlcmNlbnRDb21wbGV0ZSA8ZW0+UGVyY2VudCBDb21wbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBlcmNlbnQgQ29tcGxldGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1BlcmNlbnRDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUGVyY2VudFdvcmtDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29zdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Db3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVydGltZSBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19PdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX092ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsU3RhcnQgPGVtPkFjdHVhbCBTdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBTdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxTdGFydCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxTdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsRmluaXNoIDxlbT5BY3R1YWwgRmluaXNoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxGaW5pc2goKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxEdXJhdGlvbiA8ZW0+QWN0dWFsIER1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIER1cmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbER1cmF0aW9uKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbER1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbENvc3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0IDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsV29yaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbE92ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlZ3VsYXIgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZWd1bGFyV29yaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19SZWd1bGFyV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nRHVyYXRpb24gPGVtPlJlbWFpbmluZyBEdXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFpbmluZyBEdXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdEdXJhdGlvbigpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19SZW1haW5pbmdEdXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdDb3N0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1JlbWFpbmluZ0Nvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtYWluaW5nIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nV29yaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19SZW1haW5pbmdXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1JlbWFpbmluZ092ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19SZW1haW5pbmdPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFDV1AgPGVtPkFDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFDV1AoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQUNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q1YgPGVtPkNWPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q1Y8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q1YoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQ1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnN0cmFpbnRUeXBlIDxlbT5Db25zdHJhaW50IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db25zdHJhaW50IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29uc3RyYWludFR5cGUoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQ29uc3RyYWludFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENhbGVuZGFyVUlEIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYWxlbmRhciBVSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQ2FsZW5kYXJVSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnN0cmFpbnREYXRlIDxlbT5Db25zdHJhaW50IERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db25zdHJhaW50IERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29uc3RyYWludERhdGUoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQ29uc3RyYWludERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldERlYWRsaW5lIDxlbT5EZWFkbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlYWRsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldERlYWRsaW5lKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0RlYWRsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsQXNzaWdubWVudHMgPGVtPkxldmVsIEFzc2lnbm1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0xldmVsQXNzaWdubWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxpbmdDYW5TcGxpdCA8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19MZXZlbGluZ0NhblNwbGl0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMZXZlbGluZ0RlbGF5IDxlbT5MZXZlbGluZyBEZWxheTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVsaW5nIERlbGF5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExldmVsaW5nRGVsYXkoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfTGV2ZWxpbmdEZWxheSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfTGV2ZWxpbmdEZWxheUZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJlTGV2ZWxlZFN0YXJ0IDxlbT5QcmUgTGV2ZWxlZCBTdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByZSBMZXZlbGVkIFN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZUxldmVsZWRTdGFydCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19QcmVMZXZlbGVkU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZUxldmVsZWRGaW5pc2ggPGVtPlByZSBMZXZlbGVkIEZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByZSBMZXZlbGVkIEZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmVMZXZlbGVkRmluaXNoKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1ByZUxldmVsZWRGaW5pc2goKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEh5cGVybGluayA8ZW0+SHlwZXJsaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHlwZXJsaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEh5cGVybGluaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19IeXBlcmxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEh5cGVybGlua0FkZHJlc3MgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SHlwZXJsaW5rQWRkcmVzcygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19IeXBlcmxpbmtBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19IeXBlcmxpbmtTdWJBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIgPGVtPklnbm9yZSBSZXNvdXJjZSBDYWxlbmRhcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklnbm9yZSBSZXNvdXJjZSBDYWxlbmRhcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Tm90ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Tm90ZXMoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfTm90ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSGlkZUJhciA8ZW0+SGlkZSBCYXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IaWRlIEJhcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0hpZGVCYXIoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfSGlkZUJhcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSb2xsdXAgPGVtPlJvbGx1cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJvbGx1cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JvbGx1cCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Sb2xsdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dTPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1MoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1A8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19CQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSA8ZW0+UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEVhcm5lZFZhbHVlTWV0aG9kIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19FYXJuZWRWYWx1ZU1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmVkZWNlc3NvckxpbmsgPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX1ByZWRlY2Vzc29yTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfRXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QmFzZWxpbmUgPGVtPkJhc2VsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5CYXNlbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCYXNlbGluZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19CYXNlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfT3V0bGluZUNvZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFRpbWVwaGFzZWREYXRhKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX1RpbWVwaGFzZWREYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzIDxlbT5UYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYXNrczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrcyNnZXRUYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrcyNnZXRUYXNrKCkKLQkgKiBAc2VlICNnZXRUYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza3NfVGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kIDxlbT5UaW1lIFBlcmlvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UaW1lIFBlcmlvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGltZVBlcmlvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QjZ2V0RnJvbURhdGUgPGVtPkZyb20gRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZyb20gRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZCNnZXRGcm9tRGF0ZSgpCi0JICogQHNlZSAjZ2V0VGltZVBlcmlvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGltZVBlcmlvZF9Gcm9tRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QjZ2V0VG9EYXRlIDxlbT5UbyBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VG8gRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZCNnZXRUb0RhdGUoKQotCSAqIEBzZWUgI2dldFRpbWVQZXJpb2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRpbWVQZXJpb2RfVG9EYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSA8ZW0+VGltZXBoYXNlZCBEYXRhIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGltZXBoYXNlZCBEYXRhIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGltZXBoYXNlZERhdGFUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRVSUQgPGVtPlVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFVJRCgpCi0JICogQHNlZSAjZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0U3RhcnQoKQotCSAqIEBzZWUgI2dldFRpbWVwaGFzZWREYXRhVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGltZXBoYXNlZERhdGFUeXBlX1N0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluaXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0RmluaXNoKCkKLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9GaW5pc2goKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VW5pdCA8ZW0+VW5pdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVuaXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRVbml0KCkKLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9Vbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldFRpbWVwaGFzZWREYXRhVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGltZXBoYXNlZERhdGFUeXBlX1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZSBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0VmFsdWVJRCgpCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFZhbHVlX1ZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRQYXJlbnRWYWx1ZUlEIDxlbT5QYXJlbnQgVmFsdWUgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYXJlbnQgVmFsdWUgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFBhcmVudFZhbHVlSUQoKQotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRWYWx1ZV9QYXJlbnRWYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VmFsdWVfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRWYWx1ZV9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIgPGVtPlZhbHVlMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5WYWx1ZTI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VmFsdWUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldElEIDxlbT5JRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIjZ2V0SUQoKQotCSAqIEBzZWUgI2dldFZhbHVlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VmFsdWUyX0lEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldFZhbHVlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VmFsdWUyX1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldFZhbHVlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VmFsdWUyX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdCA8ZW0+VmFsdWUgTGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5WYWx1ZSBMaXN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFZhbHVlTGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdCNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0VmFsdWVMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRWYWx1ZUxpc3RfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzIDxlbT5WYWx1ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VmFsdWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFZhbHVlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlcyNnZXRHcm91cCgpCi0JICogQHNlZSAjZ2V0VmFsdWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRWYWx1ZXNfR3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlcyNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXMjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldFZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VmFsdWVzX1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sgPGVtPldCUyBNYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldCUyBNYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXQlNNYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZXZlbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRMZXZlbCgpCi0JICogQHNlZSAjZ2V0V0JTTWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V0JTTWFza19MZXZlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0V0JTTWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V0JTTWFza19UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRMZW5ndGggPGVtPkxlbmd0aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxlbmd0aDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRMZW5ndGgoKQotCSAqIEBzZWUgI2dldFdCU01hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdCU01hc2tfTGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRTZXBhcmF0b3IgPGVtPlNlcGFyYXRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcGFyYXRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRTZXBhcmF0b3IoKQotCSAqIEBzZWUgI2dldFdCU01hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdCU01hc2tfU2VwYXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzIDxlbT5XQlMgTWFza3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V0JTIE1hc2tzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V0JTTWFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNpc1ZlcmlmeVVuaXF1ZUNvZGVzIDxlbT5WZXJpZnkgVW5pcXVlIENvZGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQHNlZSAjZ2V0V0JTTWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdCU01hc2tzX1ZlcmlmeVVuaXF1ZUNvZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNHZW5lcmF0ZUNvZGVzIDxlbT5HZW5lcmF0ZSBDb2RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdlbmVyYXRlIENvZGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNpc0dlbmVyYXRlQ29kZXMoKQotCSAqIEBzZWUgI2dldFdCU01hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXQlNNYXNrc19HZW5lcmF0ZUNvZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVmaXg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2dldFByZWZpeCgpCi0JICogQHNlZSAjZ2V0V0JTTWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdCU01hc2tzX1ByZWZpeCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjZ2V0V0JTTWFzayA8ZW0+V0JTIE1hc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPldCUyBNYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNnZXRXQlNNYXNrKCkKLQkgKiBAc2VlICNnZXRXQlNNYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V0JTTWFza3NfV0JTTWFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5IDxlbT5XZWVrIERheTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XZWVrIERheTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V2Vla0RheSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0RGF5VHlwZSA8ZW0+RGF5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EYXkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNnZXREYXlUeXBlKCkKLQkgKiBAc2VlICNnZXRXZWVrRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXZWVrRGF5X0RheVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2lzRGF5V29ya2luZyA8ZW0+RGF5IFdvcmtpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EYXkgV29ya2luZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNpc0RheVdvcmtpbmcoKQotCSAqIEBzZWUgI2dldFdlZWtEYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdlZWtEYXlfRGF5V29ya2luZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0VGltZVBlcmlvZCA8ZW0+VGltZSBQZXJpb2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5UaW1lIFBlcmlvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNnZXRUaW1lUGVyaW9kKCkKLQkgKiBAc2VlICNnZXRXZWVrRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWVrRGF5X1RpbWVQZXJpb2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldFdvcmtpbmdUaW1lcyA8ZW0+V29ya2luZyBUaW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPldvcmtpbmcgVGltZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0V29ya2luZ1RpbWVzKCkKLQkgKiBAc2VlICNnZXRXZWVrRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWVrRGF5X1dvcmtpbmdUaW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5cyA8ZW0+V2VlayBEYXlzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldlZWsgRGF5czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdlZWtEYXlzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5cyNnZXRXZWVrRGF5IDxlbT5XZWVrIERheTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+V2VlayBEYXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzI2dldFdlZWtEYXkoKQotCSAqIEBzZWUgI2dldFdlZWtEYXlzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXZWVrRGF5c19XZWVrRGF5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lIDxlbT5Xb3JraW5nIFRpbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29ya2luZyBUaW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya2luZ1RpbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZSNnZXRGcm9tVGltZSA8ZW0+RnJvbSBUaW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RnJvbSBUaW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZSNnZXRGcm9tVGltZSgpCi0JICogQHNlZSAjZ2V0V29ya2luZ1RpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtpbmdUaW1lX0Zyb21UaW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUjZ2V0VG9UaW1lIDxlbT5UbyBUaW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VG8gVGltZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUjZ2V0VG9UaW1lKCkKLQkgKiBAc2VlICNnZXRXb3JraW5nVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya2luZ1RpbWVfVG9UaW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lcyA8ZW0+V29ya2luZyBUaW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JraW5nIFRpbWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtpbmdUaW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzI2dldFdvcmtpbmdUaW1lIDxlbT5Xb3JraW5nIFRpbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPldvcmtpbmcgVGltZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzI2dldFdvcmtpbmdUaW1lKCkKLQkgKiBAc2VlICNnZXRXb3JraW5nVGltZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtpbmdUaW1lc19Xb3JraW5nVGltZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5BY2NydWUgQXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkFjY3J1ZSBBdDwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdBY2NydWVBdF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzEgMiAzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRBY2NydWVBdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQWN0aXZlRGlyZWN0b3J5R1VJRF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzE2JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkFsaWFzIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkFsaWFzIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0FsaWFzXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTAnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEFsaWFzVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkF1dGhvciBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5BdXRob3IgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXV0aG9yXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRBdXRob3JUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+QmFzZWxpbmUgRm9yIEVhcm5lZCBWYWx1ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Jhc2VsaW5lRm9yRWFybmVkVmFsdWVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzIDQgNSA2IDcgOCA5IDEwJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5Cb29raW5nIFR5cGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Qm9va2luZyBUeXBlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQm9va2luZ1R5cGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEJvb2tpbmdUeXBlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5Cb29raW5nIFR5cGUgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkJvb2tpbmcgVHlwZSBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdCb29raW5nVHlwZV8uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEJvb2tpbmdUeXBlVHlwZTEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+Q2FsY3VsYXRpb24gVHlwZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5DYWxjdWxhdGlvbiBUeXBlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ2FsY3VsYXRpb25UeXBlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxIDInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldENhbGN1bGF0aW9uVHlwZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5DYXRlZ29yeSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5DYXRlZ29yeSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDYXRlZ29yeV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Q2F0ZWdvcnlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+Q29kZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Db2RlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvZGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldENvZGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+Q29tcGFueSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Db21wYW55IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvbXBhbnlfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldENvbXBhbnlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkNvbnN0cmFpbnQgVHlwZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Db25zdHJhaW50IFR5cGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb25zdHJhaW50VHlwZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMgNCA1IDYgNyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Q29uc3RyYWludFR5cGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+Q29udGFjdCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Db250YWN0IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvbnRhY3RfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldENvbnRhY3RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkNvc3QgUmF0ZSBUYWJsZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Db3N0IFJhdGUgVGFibGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb3N0UmF0ZVRhYmxlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxIDIgMyA0JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDb3N0UmF0ZVRhYmxlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ3VycmVuY3lTeW1ib2xQb3NpdGlvbl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+Q3VycmVuY3kgU3ltYm9sIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkN1cnJlbmN5IFN5bWJvbCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDdXJyZW5jeVN5bWJvbF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzIwJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDdXJyZW5jeVN5bWJvbFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RGF5IFR5cGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RGF5IFR5cGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEYXlUeXBlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxIDIgMyA0IDUgNiA3JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREYXlUeXBlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0RlZmF1bHRGaXhlZENvc3RBY2NydWFsXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMSAyIDMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldERlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEZWZhdWx0VGFza0VWTWV0aG9kXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREZWZhdWx0VGFza0VWTWV0aG9kVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5EZWZhdWx0IFRhc2sgVHlwZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EZWZhdWx0IFRhc2sgVHlwZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0RlZmF1bHRUYXNrVHlwZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREZWZhdWx0VGFza1R5cGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEdXJhdGlvbkZvcm1hdF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldER1cmF0aW9uRm9ybWF0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEdXJhdGlvbkZvcm1hdF8uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPSczIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGUxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUyPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0R1cmF0aW9uRm9ybWF0Xy5fMl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldER1cmF0aW9uRm9ybWF0VHlwZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTM8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRHVyYXRpb25Gb3JtYXRfLl8zXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlNDwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEdXJhdGlvbkZvcm1hdF8uXzRfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPSczIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGU0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlNTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU1PC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0R1cmF0aW9uRm9ybWF0Xy5fNV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldER1cmF0aW9uRm9ybWF0VHlwZTUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRWFybmVkVmFsdWVNZXRob2RfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEVhcm5lZFZhbHVlTWV0aG9kVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kIFR5cGUxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kIFR5cGUxPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Vhcm5lZFZhbHVlTWV0aG9kXy5fMV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RWFybmVkVmFsdWVNZXRob2RUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkVtYWlsIEFkZHJlc3MgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RW1haWwgQWRkcmVzcyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdFbWFpbEFkZHJlc3NfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEVtYWlsQWRkcmVzc1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0V4dGVybmFsVGFza1Byb2plY3RfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEV4dGVybmFsVGFza1Byb2plY3RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+Rml4ZWQgQ29zdCBBY2NydWFsIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkZpeGVkIENvc3QgQWNjcnVhbCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdGaXhlZENvc3RBY2NydWFsXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIGVudW1lcmF0aW9uPScxIDIgMyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RlkgU3RhcnQgRGF0ZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5GWSBTdGFydCBEYXRlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRllTdGFydERhdGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RllTdGFydERhdGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+R3JvdXAgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+R3JvdXAgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nR3JvdXBfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEdyb3VwVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkh5cGVybGluayBBZGRyZXNzIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkh5cGVybGluayBBZGRyZXNzIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0h5cGVybGlua0FkZHJlc3NfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEh5cGVybGlua0FkZHJlc3NUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkh5cGVybGluayBBZGRyZXNzIFR5cGUxPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdIeXBlcmxpbmtBZGRyZXNzXy5fMV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rQWRkcmVzc1R5cGUxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkh5cGVybGluayBBZGRyZXNzIFR5cGUyPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdIeXBlcmxpbmtBZGRyZXNzXy5fMl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rQWRkcmVzc1R5cGUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdIeXBlcmxpbmtTdWJBZGRyZXNzXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGUxPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdIeXBlcmxpbmtTdWJBZGRyZXNzXy5fMV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGUyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3MgVHlwZTI8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0h5cGVybGlua1N1YkFkZHJlc3NfLl8yXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5IeXBlcmxpbmsgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SHlwZXJsaW5rIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0h5cGVybGlua18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkh5cGVybGluayBUeXBlMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SHlwZXJsaW5rIFR5cGUxPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdIeXBlcmxpbmtfLl8xXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRIeXBlcmxpbmtUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkh5cGVybGluayBUeXBlMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SHlwZXJsaW5rIFR5cGUyPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdIeXBlcmxpbmtfLl8yXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRIeXBlcmxpbmtUeXBlMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkluaXRpYWxzIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkluaXRpYWxzIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0luaXRpYWxzXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRJbml0aWFsc1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+TGFnIEZvcm1hdCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5MYWcgRm9ybWF0IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTGFnRm9ybWF0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TGFnRm9ybWF0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTGV2ZWxpbmdEZWxheUZvcm1hdF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldExldmVsaW5nRGVsYXlGb3JtYXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdCBUeXBlMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0IFR5cGUxPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0xldmVsaW5nRGVsYXlGb3JtYXRfLl8xXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+TWFuYWdlciBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5NYW5hZ2VyIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01hbmFnZXJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE1hbmFnZXJUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+TWF0ZXJpYWwgTGFiZWwgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TWF0ZXJpYWwgTGFiZWwgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTWF0ZXJpYWxMYWJlbF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TWF0ZXJpYWxMYWJlbFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5OYW1lIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk5hbWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTmFtZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TmFtZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5OYW1lIFR5cGUxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5OYW1lIFR5cGUxPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdOYW1lXy5fMV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TmFtZVR5cGUxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+TmFtZSBUeXBlMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TmFtZSBUeXBlMjwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTmFtZV8uXzJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE5hbWVUeXBlMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPk5hbWUgVHlwZTM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk5hbWUgVHlwZTM8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J05hbWVfLl8zXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nMjU1JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXROYW1lVHlwZTMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+TmV3IFRhc2sgU3RhcnQgRGF0ZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5OZXcgVGFzayBTdGFydCBEYXRlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTmV3VGFza1N0YXJ0RGF0ZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TmV3VGFza1N0YXJ0RGF0ZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5OVCBBY2NvdW50IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk5UIEFjY291bnQgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTlRBY2NvdW50Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXROVEFjY291bnRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+T3V0bGluZSBOdW1iZXIgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+T3V0bGluZSBOdW1iZXIgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nT3V0bGluZU51bWJlcl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0T3V0bGluZU51bWJlclR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdPdmVydGltZVJhdGVGb3JtYXRfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScxIDIgMyA0IDUgNyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdCBUeXBlMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQgVHlwZTE8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nT3ZlcnRpbWVSYXRlRm9ybWF0Xy5fMV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzEgMiAzIDQgNSA3JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRPdmVydGltZVJhdGVGb3JtYXRUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlBob25ldGljIEFsaWFzIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlBob25ldGljIEFsaWFzIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Bob25ldGljQWxpYXNfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0UGhvbmV0aWNBbGlhc1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5QaG9uZXRpY3MgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+UGhvbmV0aWNzIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Bob25ldGljc18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0UGhvbmV0aWNzVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlByZWZpeCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5QcmVmaXggVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJlZml4Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTAnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFByZWZpeFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+UmF0ZSBUYWJsZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5SYXRlIFRhYmxlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUmF0ZVRhYmxlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxIDIgMyA0JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRSYXRlVGFibGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlJvbGx1cCBUeXBlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlJvbGx1cCBUeXBlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUm9sbHVwVHlwZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMgNCA1IDYgNyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Um9sbHVwVHlwZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdTdGFuZGFyZFJhdGVGb3JtYXRfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScxIDIgMyA0IDUgNyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdCBUeXBlMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQgVHlwZTE8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nU3RhbmRhcmRSYXRlRm9ybWF0Xy5fMV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzEgMiAzIDQgNSA3IDgnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+U3ViamVjdCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5TdWJqZWN0IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1N1YmplY3RfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFN1YmplY3RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+U3VicHJvamVjdCBOYW1lIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlN1YnByb2plY3QgTmFtZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdTdWJwcm9qZWN0TmFtZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0U3VicHJvamVjdE5hbWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+VGl0bGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VGl0bGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGl0bGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFRpdGxlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5UeXBlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlR5cGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUeXBlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxIDInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFR5cGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlR5cGUgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlR5cGUgVHlwZTE8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVHlwZV8uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUeXBlVHlwZTEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+VHlwZSBUeXBlMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VHlwZSBUeXBlMjwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUeXBlXy5fMl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFR5cGVUeXBlMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5UeXBlIFR5cGUzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5UeXBlIFR5cGUzPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1R5cGVfLl8zXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgMjggMjkgMzAgMzEgMzIgMzMgMzQgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNDUgNDYgNDcgNDggNDkgNTAgNTEgNTIgNTMgNTQgNTUgNTYgNTcgNTggNTkgNjAgNjEgNjIgNjMgNjQgNjUgNjYgNjcgNjggNjkgNzAgNzEgNzIgNzMgNzQgNzUgNzYnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFR5cGVUeXBlMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5UeXBlIFR5cGU0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5UeXBlIFR5cGU0PC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1R5cGVfLl80Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUeXBlVHlwZTQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+VHlwZSBUeXBlNTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VHlwZSBUeXBlNTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUeXBlXy5fNV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFR5cGVUeXBlNSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlVJRCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5VSUQgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVUlEXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nMTYnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFVJRFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+VW5pdCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Vbml0IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVW5pdF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMgNSA4JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRVbml0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5WYWx1ZWxpc3QgU29ydCBPcmRlciBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5WYWx1ZWxpc3QgU29ydCBPcmRlciBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ZhbHVlbGlzdFNvcnRPcmRlcl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VmFsdWVsaXN0U29ydE9yZGVyVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5XZWVrIFN0YXJ0IERheSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5XZWVrIFN0YXJ0IERheSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dlZWtTdGFydERheV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMgNCA1IDYnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFdlZWtTdGFydERheVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+V29yayBDb250b3VyIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPldvcmsgQ29udG91ciBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtDb250b3VyXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxIDIgMyA0IDUgNiA3IDgnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFdvcmtDb250b3VyVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5Xb3JrIEZvcm1hdCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Xb3JrIEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtGb3JtYXRfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScxIDIgMyA0IDUnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFdvcmtGb3JtYXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPldvcmsgR3JvdXAgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+V29yayBHcm91cCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtHcm91cF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFdvcmtHcm91cFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1zcHJvamVjdEZhY3RvcnkgZ2V0TXNwcm9qZWN0RmFjdG9yeSgpOwotCi19IC8vTXNwcm9qZWN0UGFja2FnZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9PdXRsaW5lQ29kZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9PdXRsaW5lQ29kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTE5YWY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE91dGxpbmVDb2RlLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRsaW5lIENvZGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRGaWVsZE5hbWUgPGVtPkZpZWxkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldFBob25ldGljQWxpYXMgPGVtPlBob25ldGljIEFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldFZhbHVlcyA8ZW0+VmFsdWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzRW50ZXJwcmlzZSA8ZW0+RW50ZXJwcmlzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyA8ZW0+RW50ZXJwcmlzZSBPdXRsaW5lIENvZGUgQWxpYXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzTGVhZk9ubHkgPGVtPkxlYWYgT25seTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0FsbExldmVsc1JlcXVpcmVkIDxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCA8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRNYXNrcyA8ZW0+TWFza3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nT3V0bGluZUNvZGVfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3V0bGluZUNvZGUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQ29yZXNwb25kcyB0byB0aGUgZmllbGQgbnVtYmVyIG9mIG91dGxpbmUgY29kZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpZWxkSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX0ZpZWxkSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmllbGRJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmllbGRJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG5hbWUgb2YgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpZWxkTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVfRmllbGROYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpZWxkTmFtZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaWVsZE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RmllbGROYW1lIDxlbT5GaWVsZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaWVsZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpZWxkTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWxpYXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbGlhcyBvZiB0aGUgY3VzdG9tIG91dGxpbmUgY29kZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWxpYXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsaWFzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZV9BbGlhcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBbGlhcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBbGlhcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRBbGlhcyA8ZW0+QWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFsaWFzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBbGlhcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWxpYXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBob25ldGljIEFsaWFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGhvbmV0aWMgcHJvbnVuY2lhdGlvbiBvZiB0aGUgYWxpYXMgb2YgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBob25ldGljIEFsaWFzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQaG9uZXRpY0FsaWFzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZV9QaG9uZXRpY0FsaWFzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Bob25ldGljQWxpYXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGhvbmV0aWNBbGlhcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRQaG9uZXRpY0FsaWFzIDxlbT5QaG9uZXRpYyBBbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBob25ldGljQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBob25ldGljQWxpYXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhbHVlcyBvZiB0aGUgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb3V0bGluZSBjb2RlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFZhbHVlcyhWYWx1ZXMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVfVmFsdWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWVzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFsdWVzIGdldFZhbHVlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRWYWx1ZXMgPGVtPlZhbHVlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRWYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlcyhWYWx1ZXMgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW50ZXJwcmlzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUgaXMgYW4gZW50ZXJwcmlzZSBjdXN0b20gb3V0bGluZSBjb2RlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRlcnByaXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEVudGVycHJpc2UoKQotCSAqIEBzZWUgI3Vuc2V0RW50ZXJwcmlzZSgpCi0JICogQHNlZSAjc2V0RW50ZXJwcmlzZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX0VudGVycHJpc2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VudGVycHJpc2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRW50ZXJwcmlzZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0VudGVycHJpc2UgPGVtPkVudGVycHJpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVudGVycHJpc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RW50ZXJwcmlzZSgpCi0JICogQHNlZSAjdW5zZXRFbnRlcnByaXNlKCkKLQkgKiBAc2VlICNpc0VudGVycHJpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVudGVycHJpc2UoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNFbnRlcnByaXNlIDxlbT5FbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEVudGVycHJpc2UoKQotCSAqIEBzZWUgI2lzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjc2V0RW50ZXJwcmlzZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RW50ZXJwcmlzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzRW50ZXJwcmlzZSA8ZW0+RW50ZXJwcmlzZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW50ZXJwcmlzZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RW50ZXJwcmlzZSgpCi0JICogQHNlZSAjaXNFbnRlcnByaXNlKCkKLQkgKiBAc2VlICNzZXRFbnRlcnByaXNlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRFbnRlcnByaXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSByZWZlcmVuY2UgdG8gYW5vdGhlciBjdXN0b20gZmllbGQgZm9yIHdoaWNoIHRoaXMgaXMgYW4gYWxpYXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudGVycHJpc2UgT3V0bGluZSBDb2RlIEFsaWFzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyhCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX0VudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMgPGVtPkVudGVycHJpc2UgT3V0bGluZSBDb2RlIEFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUgY2FuIGJlIHVzZWQgYnkgdGhlIFJlc291cmNlIFN1YnN0aXR1dGlvbiBXaXphcmQgaW4gTWljcm9zb2Z0IFByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQHNlZSAjdW5zZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBzZWUgI3NldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCA8ZW0+UmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQHNlZSAjdW5zZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBzZWUgI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQHNlZSAjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBzZWUgI3NldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkKLQkgKiBAc2VlICNpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQHNlZSAjc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxlYWYgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciBvciBub3QgdmFsdWVzIHNwZWNpZmllZCBpbiB0aGlzIG91dGxpbmUgY29kZSBmaWVsZCBtdXN0IGJlIGxlYWYgdmFsdWVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZWFmIE9ubHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TGVhZk9ubHkoKQotCSAqIEBzZWUgI3Vuc2V0TGVhZk9ubHkoKQotCSAqIEBzZWUgI3NldExlYWZPbmx5KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVfTGVhZk9ubHkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xlYWZPbmx5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0xlYWZPbmx5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzTGVhZk9ubHkgPGVtPkxlYWYgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGVhZiBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldExlYWZPbmx5KCkKLQkgKiBAc2VlICN1bnNldExlYWZPbmx5KCkKLQkgKiBAc2VlICNpc0xlYWZPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMZWFmT25seShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0xlYWZPbmx5IDxlbT5MZWFmIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TGVhZk9ubHkoKQotCSAqIEBzZWUgI2lzTGVhZk9ubHkoKQotCSAqIEBzZWUgI3NldExlYWZPbmx5KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRMZWFmT25seSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzTGVhZk9ubHkgPGVtPkxlYWYgT25seTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGVhZiBPbmx5PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRMZWFmT25seSgpCi0JICogQHNlZSAjaXNMZWFmT25seSgpCi0JICogQHNlZSAjc2V0TGVhZk9ubHkoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldExlYWZPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBOZXcgY29kZXMgbXVzdCBoYXZlIGFsbCBsZXZlbHMgcHJlc2VudC4gIE5vdCBhdmFpbGFibGUgZm9yIEVudGVycHJpc2UgQ29kZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBzZWUgI3Vuc2V0QWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBzZWUgI3NldEFsbExldmVsc1JlcXVpcmVkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVfQWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FsbExldmVsc1JlcXVpcmVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0FsbExldmVsc1JlcXVpcmVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzQWxsTGV2ZWxzUmVxdWlyZWQgPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBzZWUgI3Vuc2V0QWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBzZWUgI2lzQWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsbExldmVsc1JlcXVpcmVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzQWxsTGV2ZWxzUmVxdWlyZWQgPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBzZWUgI2lzQWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBzZWUgI3NldEFsbExldmVsc1JlcXVpcmVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRBbGxMZXZlbHNSZXF1aXJlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzQWxsTGV2ZWxzUmVxdWlyZWQgPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEFsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICNpc0FsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICNzZXRBbGxMZXZlbHNSZXF1aXJlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QWxsTGV2ZWxzUmVxdWlyZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdmFsdWVzIHNwZWNpZmllZCBtdXN0IGNvbWUgZnJvbSB2YWx1ZXMgdGFibGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjdW5zZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkKLQkgKiBAc2VlICNzZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVfT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT25seVRhYmxlVmFsdWVzQWxsb3dlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCA8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkKLQkgKiBAc2VlICN1bnNldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBzZWUgI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQgPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkKLQkgKiBAc2VlICNzZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkIDxlbT5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkKLQkgKiBAc2VlICNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBzZWUgI3NldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hc2tzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdGFibGUgb2YgZW50cmllcyB0aGF0IGRlZmluZSB0aGUgb3V0bGluZSBjb2RlIG1hc2suCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hc2tzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRNYXNrcyhNYXNrcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZV9NYXNrcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01hc2tzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWFza3MgZ2V0TWFza3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0TWFza3MgPGVtPk1hc2tzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXNrczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1hc2tzKE1hc2tzIHZhbHVlKTsKLQotfSAvLyBPdXRsaW5lQ29kZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9PdXRsaW5lQ29kZTIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMzAxYjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9PdXRsaW5lQ29kZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE91dGxpbmVDb2RlMi5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0bGluZSBDb2RlMjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGUyKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdPdXRsaW5lQ29kZV8uXzFfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3V0bGluZUNvZGUyIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgb3V0bGluZSBjb2RlIGNvbGxlY3Rpb24uCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZTJfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZpZWxkIElEIGluIHRoZSBsb2NhbGlzZWQgbGFuZ3VhZ2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpZWxkSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlMl9GaWVsZElEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpZWxkSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmllbGRJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWVsZElEKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBJRCBpbiB0aGUgdmFsdWUgbGlzdCBhc3NvY2lhdGVkIHdpdGggdGhlIGRlZmluaXRpb24gaW4gdGhlIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZSBjb2RlIGNvbGxlY3Rpb24uCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZTJfVmFsdWVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi19IC8vIE91dGxpbmVDb2RlMgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9PdXRsaW5lQ29kZTMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NWU4MzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9PdXRsaW5lQ29kZTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE91dGxpbmVDb2RlMy5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0bGluZSBDb2RlMzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGUzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdPdXRsaW5lQ29kZV8uXzJfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3V0bGluZUNvZGUzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgb3V0bGluZSBjb2RlIGNvbGxlY3Rpb24uCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZTNfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZpZWxkIElEIGluIHRoZSBsb2NhbGlzZWQgbGFuZ3VhZ2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpZWxkSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlM19GaWVsZElEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpZWxkSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmllbGRJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWVsZElEKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBJRCBpbiB0aGUgdmFsdWUgbGlzdCBhc3NvY2lhdGVkIHdpdGggdGhlIGRlZmluaXRpb24gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgb3V0bGluZSBjb2RlIGNvbGxlY3Rpb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGUzX1ZhbHVlSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotfSAvLyBPdXRsaW5lQ29kZTMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGVzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2Rlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDY4NjJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE91dGxpbmVDb2Rlcy5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRsaW5lIENvZGVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzI2dldE91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZXMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J091dGxpbmVDb2Rlc18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBPdXRsaW5lQ29kZXMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRsaW5lIENvZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBpbmRpdmlkdWFsIG91dGxpbmUgY29kZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dGxpbmUgQ29kZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZXNfT3V0bGluZUNvZGUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdXRsaW5lQ29kZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE91dGxpbmVDb2RlKCk7Ci0KLX0gLy8gT3V0bGluZUNvZGVzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ByZWRlY2Vzc29yTGluay5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9QcmVkZWNlc3NvckxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNjYWI3ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ByZWRlY2Vzc29yTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJlZGVjZXNzb3JMaW5rLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmVkZWNlc3NvciBMaW5rPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldFByZWRlY2Vzc29yVUlEIDxlbT5QcmVkZWNlc3NvciBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2lzQ3Jvc3NQcm9qZWN0IDxlbT5Dcm9zcyBQcm9qZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRDcm9zc1Byb2plY3ROYW1lIDxlbT5Dcm9zcyBQcm9qZWN0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldExpbmtMYWcgPGVtPkxpbmsgTGFnPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRMYWdGb3JtYXQgPGVtPkxhZyBGb3JtYXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcmVkZWNlc3NvckxpbmsoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ByZWRlY2Vzc29yTGlua18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcmVkZWNlc3NvckxpbmsgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvciBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcHJlZGVjZXNzb3IgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkZWNlc3NvciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZWRlY2Vzc29yVUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJlZGVjZXNzb3JMaW5rX1ByZWRlY2Vzc29yVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmVkZWNlc3NvclVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UHJlZGVjZXNzb3JVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldFByZWRlY2Vzc29yVUlEIDxlbT5QcmVkZWNlc3NvciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWRlY2Vzc29yIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3JVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWRlY2Vzc29yVUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGxpbmsgdHlwZS4gIFZhbHVlcyBhcmUgMD1GRiwgMT1GUywgMj1TRiBhbmQgMz1TUwotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcmVkZWNlc3NvckxpbmtfVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlR5cGVUeXBlMSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVHlwZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyb3NzIFByb2plY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHByZWRlY2Vzc29yIGlzIHBhcnQgb2YgYW5vdGhlciBwcm9qZWN0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyb3NzIFByb2plY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q3Jvc3NQcm9qZWN0KCkKLQkgKiBAc2VlICN1bnNldENyb3NzUHJvamVjdCgpCi0JICogQHNlZSAjc2V0Q3Jvc3NQcm9qZWN0KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJlZGVjZXNzb3JMaW5rX0Nyb3NzUHJvamVjdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ3Jvc3NQcm9qZWN0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0Nyb3NzUHJvamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjaXNDcm9zc1Byb2plY3QgPGVtPkNyb3NzIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNyb3NzIFByb2plY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q3Jvc3NQcm9qZWN0KCkKLQkgKiBAc2VlICN1bnNldENyb3NzUHJvamVjdCgpCi0JICogQHNlZSAjaXNDcm9zc1Byb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyb3NzUHJvamVjdChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjaXNDcm9zc1Byb2plY3QgPGVtPkNyb3NzIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Q3Jvc3NQcm9qZWN0KCkKLQkgKiBAc2VlICNpc0Nyb3NzUHJvamVjdCgpCi0JICogQHNlZSAjc2V0Q3Jvc3NQcm9qZWN0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDcm9zc1Byb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjaXNDcm9zc1Byb2plY3QgPGVtPkNyb3NzIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyb3NzIFByb2plY3Q8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENyb3NzUHJvamVjdCgpCi0JICogQHNlZSAjaXNDcm9zc1Byb2plY3QoKQotCSAqIEBzZWUgI3NldENyb3NzUHJvamVjdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q3Jvc3NQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Dcm9zcyBQcm9qZWN0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBleHRlcm5hbCBwcmVkZWNlc3NvciBwcm9qZWN0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyb3NzIFByb2plY3QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3Jvc3NQcm9qZWN0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJlZGVjZXNzb3JMaW5rX0Nyb3NzUHJvamVjdE5hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ3Jvc3NQcm9qZWN0TmFtZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDcm9zc1Byb2plY3ROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRDcm9zc1Byb2plY3ROYW1lIDxlbT5Dcm9zcyBQcm9qZWN0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNyb3NzIFByb2plY3QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3Jvc3NQcm9qZWN0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGluayBMYWc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2YgbGFnIGluIHRlbnRocyBvZiBhIG1pbnV0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rIExhZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGlua0xhZyhCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByZWRlY2Vzc29yTGlua19MaW5rTGFnKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMaW5rTGFnJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRMaW5rTGFnKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRMaW5rTGFnIDxlbT5MaW5rIExhZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGluayBMYWc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExpbmtMYWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExpbmtMYWcoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MYWcgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBsYWcgZm9ybWF0LiAgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCA0Mz1tbz8sIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYWcgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYWdGb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcmVkZWNlc3NvckxpbmtfTGFnRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTGFnRm9ybWF0VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGFnRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRMYWdGb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldExhZ0Zvcm1hdCA8ZW0+TGFnIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGFnIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGFnRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMYWdGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLX0gLy8gUHJlZGVjZXNzb3JMaW5rCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Byb2plY3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODgwNzAzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYyMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2plY3QuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2plY3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFRpdGxlIDxlbT5UaXRsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN1YmplY3QgPGVtPlN1YmplY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDYXRlZ29yeSA8ZW0+Q2F0ZWdvcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDb21wYW55IDxlbT5Db21wYW55PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TWFuYWdlciA8ZW0+TWFuYWdlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEF1dGhvciA8ZW0+QXV0aG9yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0UmV2aXNpb24gPGVtPlJldmlzaW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TGFzdFNhdmVkIDxlbT5MYXN0IFNhdmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTY2hlZHVsZUZyb21TdGFydCA8ZW0+U2NoZWR1bGUgRnJvbSBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RllTdGFydERhdGUgPGVtPkZZIFN0YXJ0IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDcml0aWNhbFNsYWNrTGltaXQgPGVtPkNyaXRpY2FsIFNsYWNrIExpbWl0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lEaWdpdHMgPGVtPkN1cnJlbmN5IERpZ2l0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbmN5U3ltYm9sIDxlbT5DdXJyZW5jeSBTeW1ib2w8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uIDxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFN0YXJ0VGltZSA8ZW0+RGVmYXVsdCBTdGFydCBUaW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdEZpbmlzaFRpbWUgPGVtPkRlZmF1bHQgRmluaXNoIFRpbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRNaW51dGVzUGVyRGF5IDxlbT5NaW51dGVzIFBlciBEYXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRNaW51dGVzUGVyV2VlayA8ZW0+TWludXRlcyBQZXIgV2VlazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERheXNQZXJNb250aCA8ZW0+RGF5cyBQZXIgTW9udGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0VGFza1R5cGUgPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwgPGVtPkRlZmF1bHQgRml4ZWQgQ29zdCBBY2NydWFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSA8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSA8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFdvcmtGb3JtYXQgPGVtPldvcmsgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNFZGl0YWJsZUFjdHVhbENvc3RzIDxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0hvbm9yQ29uc3RyYWludHMgPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RWFybmVkVmFsdWVNZXRob2QgPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSA8ZW0+SW5zZXJ0ZWQgUHJvamVjdHMgTGlrZSBTdW1tYXJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMgPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNOZXdUYXNrc0VmZm9ydERyaXZlbiA8ZW0+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRXN0aW1hdGVkIDxlbT5OZXcgVGFza3MgRXN0aW1hdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcGxpdHNJblByb2dyZXNzVGFza3MgPGVtPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3ByZWFkQWN0dWFsQ29zdCA8ZW0+U3ByZWFkIEFjdHVhbCBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUgPGVtPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNUYXNrVXBkYXRlc1Jlc291cmNlIDxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0Zpc2NhbFllYXJTdGFydCA8ZW0+RmlzY2FsIFllYXIgU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXZWVrU3RhcnREYXkgPGVtPldlZWsgU3RhcnQgRGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2sgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgQmFjazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2sgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCA8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEZvcndhcmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSA8ZW0+QmFzZWxpbmUgRm9yIEVhcm5lZCBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzIDxlbT5BdXRvIEFkZCBOZXcgUmVzb3VyY2VzIEFuZCBUYXNrczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN0YXR1c0RhdGUgPGVtPlN0YXR1cyBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVudERhdGUgPGVtPkN1cnJlbnQgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCA8ZW0+TWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQXV0b2xpbmsgPGVtPkF1dG9saW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TmV3VGFza1N0YXJ0RGF0ZSA8ZW0+TmV3IFRhc2sgU3RhcnQgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrRVZNZXRob2QgPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkIDxlbT5Qcm9qZWN0IEV4dGVybmFsbHkgRWRpdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUgPGVtPkV4dGVuZGVkIENyZWF0aW9uIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FjdHVhbHNJblN5bmMgPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzUmVtb3ZlRmlsZVByb3BlcnRpZXMgPGVtPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FkbWluUHJvamVjdCA8ZW0+QWRtaW4gUHJvamVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE91dGxpbmVDb2RlcyA8ZW0+T3V0bGluZSBDb2RlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFdCU01hc2tzIDxlbT5XQlMgTWFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFeHRlbmRlZEF0dHJpYnV0ZXMgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDYWxlbmRhcnMgPGVtPkNhbGVuZGFyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFRhc2tzIDxlbT5UYXNrczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFJlc291cmNlcyA8ZW0+UmVzb3VyY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0QXNzaWdubWVudHMgPGVtPkFzc2lnbm1lbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJvamVjdF8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9qZWN0IGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVJRChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9VSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5VSURUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVSUQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X05hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5OYW1lVHlwZTMiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J05hbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRpdGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdGl0bGUgb2YgdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRpdGxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUaXRsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9UaXRsZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpdGxlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGl0bGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VGl0bGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRUaXRsZSA8ZW0+VGl0bGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRpdGxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUaXRsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGl0bGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YmplY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzdWJqZWN0IG9mIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWJqZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdWJqZWN0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1N1YmplY3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5TdWJqZWN0VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3ViamVjdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTdWJqZWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0U3ViamVjdCA8ZW0+U3ViamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3ViamVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3ViamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3ViamVjdChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjYXRlZ29yeSBvZiB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0ZWdvcnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhdGVnb3J5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0NhdGVnb3J5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2F0ZWdvcnlUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDYXRlZ29yeScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhdGVnb3J5IDxlbT5DYXRlZ29yeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0ZWdvcnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYXRlZ29yeShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29tcGFueTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvbXBhbnkgdGhhdCBvd25zIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db21wYW55PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb21wYW55KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0NvbXBhbnkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Db21wYW55VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29tcGFueScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb21wYW55KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q29tcGFueSA8ZW0+Q29tcGFueTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29tcGFueTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29tcGFueSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29tcGFueShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFuYWdlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG1hbmFnZXIgb2YgdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hbmFnZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1hbmFnZXIoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTWFuYWdlcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hbmFnZXJUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNYW5hZ2VyJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1hbmFnZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRNYW5hZ2VyIDxlbT5NYW5hZ2VyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYW5hZ2VyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYW5hZ2VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYW5hZ2VyKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdXRob3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhdXRob3Igb2YgdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXV0aG9yKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0F1dGhvcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF1dGhvclR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0F1dGhvcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBdXRob3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRBdXRob3IgPGVtPkF1dGhvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdXRob3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF1dGhvcihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JlYXRpb24gRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhhdCB0aGUgcHJvamVjdCB3YXMgY3JlYXRlZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3JlYXRpb25EYXRlKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0NyZWF0aW9uRGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NyZWF0aW9uRGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRDcmVhdGlvbkRhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDcmVhdGlvbkRhdGUgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3JlYXRpb25EYXRlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXZpc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG51bWJlciBvZiB0aW1lcyBhIHByb2plY3QgaGFzIGJlZW4gc2F2ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJldmlzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXZpc2lvbihCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfUmV2aXNpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JldmlzaW9uJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRSZXZpc2lvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFJldmlzaW9uIDxlbT5SZXZpc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmV2aXNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJldmlzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXZpc2lvbihCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxhc3QgU2F2ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIHByb2plY3Qgd2FzIGxhc3Qgc2F2ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxhc3QgU2F2ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExhc3RTYXZlZChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9MYXN0U2F2ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMYXN0U2F2ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0TGFzdFNhdmVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TGFzdFNhdmVkIDxlbT5MYXN0IFNhdmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYXN0IFNhdmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMYXN0U2F2ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExhc3RTYXZlZChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NoZWR1bGUgRnJvbSBTdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBwcm9qZWN0IGlzIHNjaGR1bGVkIGZyb20gdGhlIHN0YXJ0IGRhdGUgb3IgZmluaXNoIGRhdGUuCi0JICogCQkJCQkJCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U2NoZWR1bGVGcm9tU3RhcnQoKQotCSAqIEBzZWUgI3Vuc2V0U2NoZWR1bGVGcm9tU3RhcnQoKQotCSAqIEBzZWUgI3NldFNjaGVkdWxlRnJvbVN0YXJ0KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9TY2hlZHVsZUZyb21TdGFydCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU2NoZWR1bGVGcm9tU3RhcnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2NoZWR1bGVGcm9tU3RhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NjaGVkdWxlRnJvbVN0YXJ0IDxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFNjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICN1bnNldFNjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNpc1NjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTY2hlZHVsZUZyb21TdGFydChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU2NoZWR1bGVGcm9tU3RhcnQgPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0U2NoZWR1bGVGcm9tU3RhcnQoKQotCSAqIEBzZWUgI2lzU2NoZWR1bGVGcm9tU3RhcnQoKQotCSAqIEBzZWUgI3NldFNjaGVkdWxlRnJvbVN0YXJ0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRTY2hlZHVsZUZyb21TdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTY2hlZHVsZUZyb21TdGFydCA8ZW0+U2NoZWR1bGUgRnJvbSBTdGFydDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZWR1bGUgRnJvbSBTdGFydDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0U2NoZWR1bGVGcm9tU3RhcnQoKQotCSAqIEBzZWUgI2lzU2NoZWR1bGVGcm9tU3RhcnQoKQotCSAqIEBzZWUgI3NldFNjaGVkdWxlRnJvbVN0YXJ0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRTY2hlZHVsZUZyb21TdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHByb2plY3QuIFJlcXVpcmVkIGlmIFNjaGVkdWxlRnJvbVN0YXJ0IGlzIHRydWUuCi0JICogCQkJCQkJCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0IERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0RGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9TdGFydERhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFydERhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0U3RhcnREYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0U3RhcnREYXRlIDxlbT5TdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXJ0RGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmluaXNoIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmaW5pc2ggZGF0ZSBvZiB0aGUgcHJvamVjdC4gUmVxdWlyZWQgaWYgU2NoZWR1bGVGcm9tU3RhcnQgaXMgZmFsc2UuCi0JICogCQkJCQkJCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaW5pc2hEYXRlKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0ZpbmlzaERhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaW5pc2hEYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEZpbmlzaERhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRGaW5pc2hEYXRlIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpbmlzaERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmlzaERhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZZIFN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEZpc2NhbCBZZWFyIHN0YXJ0aW5nIG1vbnRoLiBWYWx1ZXMgYXJlOiAKLQkgKiAJCQkJCQkxPUphbnVhcnksIDI9RmVicnVhcnksIDM9TWFyY2gsIDQ9QXByaWwsIDU9TWF5LCA2PUp1bmUsIDc9SnVseSwgCi0JICogCQkJCQkJOD1BdWd1c3QsIDk9U2VwdGVtYmVyLCAxMD1PY3RvYmVyLCAxMT1Ob3ZlbWJlciwgMTI9RGVjZW1iZXIgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZZIFN0YXJ0IERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZZU3RhcnREYXRlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9GWVN0YXJ0RGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkZZU3RhcnREYXRlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRllTdGFydERhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEZZU3RhcnREYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RllTdGFydERhdGUgPGVtPkZZIFN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZZIFN0YXJ0IERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZZU3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGWVN0YXJ0RGF0ZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyaXRpY2FsIFNsYWNrIExpbWl0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbnVtYmVyIG9mIGRheXMgcGFzdCBpdHMgZW5kIGRhdGUgdGhhdCBhIHRhc2sgY2FuIGdvIAotCSAqIAkJCQkJCWJlZm9yZSBNaWNyb3NvZnQgUHJvamVjdCBtYXJrcyB0aGF0IHRhc2sgYXMgYSBjcml0aWNhbCB0YXNrLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Dcml0aWNhbCBTbGFjayBMaW1pdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3JpdGljYWxTbGFja0xpbWl0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9Dcml0aWNhbFNsYWNrTGltaXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NyaXRpY2FsU2xhY2tMaW1pdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0Q3JpdGljYWxTbGFja0xpbWl0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3JpdGljYWxTbGFja0xpbWl0IDxlbT5Dcml0aWNhbCBTbGFjayBMaW1pdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3JpdGljYWwgU2xhY2sgTGltaXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENyaXRpY2FsU2xhY2tMaW1pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3JpdGljYWxTbGFja0xpbWl0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3VycmVuY3kgRGlnaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBzeW1ib2wuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkN1cnJlbmN5IERpZ2l0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3VycmVuY3lEaWdpdHMoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0N1cnJlbmN5RGlnaXRzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDdXJyZW5jeURpZ2l0cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0Q3VycmVuY3lEaWdpdHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeURpZ2l0cyA8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DdXJyZW5jeSBEaWdpdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEN1cnJlbmN5RGlnaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDdXJyZW5jeURpZ2l0cyhCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkN1cnJlbmN5IFN5bWJvbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGN1cnJlbmN5IHN5bWJvbCB1c2VkIGluIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DdXJyZW5jeSBTeW1ib2w8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEN1cnJlbmN5U3ltYm9sKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0N1cnJlbmN5U3ltYm9sKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ3VycmVuY3lTeW1ib2xUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDdXJyZW5jeVN5bWJvbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDdXJyZW5jeVN5bWJvbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbmN5U3ltYm9sIDxlbT5DdXJyZW5jeSBTeW1ib2w8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkN1cnJlbmN5IFN5bWJvbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3VycmVuY3lTeW1ib2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEN1cnJlbmN5U3ltYm9sKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwb3NpdGlvbiBvZiB0aGUgY3VycmVuY3kgc3ltYm9sLiAgVmFsdWVzIGFyZTogCi0JICogCQkJCQkJMD1CZWZvcmUsIDE9QWZ0ZXIsIDI9QmVmb3JlIFdpdGggU3BhY2UsIDM9QWZ0ZXIgd2l0aCBzcGFjZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9DdXJyZW5jeVN5bWJvbFBvc2l0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0N1cnJlbmN5U3ltYm9sUG9zaXRpb24nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uIDxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbihCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhbGVuZGFyIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHByb2plY3QgY2FsZW5kYXIuICBSZWZlcnMgdG8gYSB2YWxpZCBVSUQgaW4gdGhlIAotCSAqIAkJCQkJCUNhbGVuZGFycyBlbGVtZW50IG9mIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBYTUwgU2NoZW1hLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxlbmRhciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhbGVuZGFyVUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9DYWxlbmRhclVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ2FsZW5kYXJVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldENhbGVuZGFyVUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FsZW5kYXIgVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2FsZW5kYXJVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IFN0YXJ0IFRpbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IHN0YXJ0IHRpbWUgb2YgbmV3IHRhc2tzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFN0YXJ0IFRpbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlZmF1bHRTdGFydFRpbWUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRGVmYXVsdFN0YXJ0VGltZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVmYXVsdFN0YXJ0VGltZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXREZWZhdWx0U3RhcnRUaW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFN0YXJ0VGltZSA8ZW0+RGVmYXVsdCBTdGFydCBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFN0YXJ0IFRpbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlZmF1bHRTdGFydFRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRTdGFydFRpbWUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgRmluaXNoIFRpbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IGZpbmlzaCB0aW1lIG9mIG5ldyB0YXNrcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBGaW5pc2ggVGltZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVmYXVsdEZpbmlzaFRpbWUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRGVmYXVsdEZpbmlzaFRpbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlZmF1bHRGaW5pc2hUaW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldERlZmF1bHRGaW5pc2hUaW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdEZpbmlzaFRpbWUgPGVtPkRlZmF1bHQgRmluaXNoIFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgRmluaXNoIFRpbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlZmF1bHRGaW5pc2hUaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0RmluaXNoVGltZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWludXRlcyBQZXIgRGF5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbnVtYmVyIG9mIG1pbnV0ZXMgcGVyIGRheS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWludXRlcyBQZXIgRGF5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNaW51dGVzUGVyRGF5KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9NaW51dGVzUGVyRGF5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNaW51dGVzUGVyRGF5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRNaW51dGVzUGVyRGF5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TWludXRlc1BlckRheSA8ZW0+TWludXRlcyBQZXIgRGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NaW51dGVzIFBlciBEYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1pbnV0ZXNQZXJEYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1pbnV0ZXNQZXJEYXkoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaW51dGVzIFBlciBXZWVrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbnVtYmVyIG9mIG1pbnV0ZXMgcGVyIHdlZWsuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbnV0ZXMgUGVyIFdlZWs8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1pbnV0ZXNQZXJXZWVrKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9NaW51dGVzUGVyV2VlaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWludXRlc1BlcldlZWsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldE1pbnV0ZXNQZXJXZWVrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TWludXRlc1BlcldlZWsgPGVtPk1pbnV0ZXMgUGVyIFdlZWs8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1pbnV0ZXMgUGVyIFdlZWs8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1pbnV0ZXNQZXJXZWVrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNaW51dGVzUGVyV2VlayhCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRheXMgUGVyIE1vbnRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbnVtYmVyIG9mIGRheXMgcGVyIG1vbnRoLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EYXlzIFBlciBNb250aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGF5c1Blck1vbnRoKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9EYXlzUGVyTW9udGgoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RheXNQZXJNb250aCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RGF5c1Blck1vbnRoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGF5c1Blck1vbnRoIDxlbT5EYXlzIFBlciBNb250aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGF5cyBQZXIgTW9udGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERheXNQZXJNb250aCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGF5c1Blck1vbnRoKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBUYXNrIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgdHlwZSBvZiBuZXcgdGFza3MuIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTA9Rml4ZWQgVW5pdHMsIDE9Rml4ZWQgRHVyYXRpb24sIDI9Rml4ZWQgV29yay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBUYXNrIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAc2VlICN1bnNldERlZmF1bHRUYXNrVHlwZSgpCi0JICogQHNlZSAjc2V0RGVmYXVsdFRhc2tUeXBlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9EZWZhdWx0VGFza1R5cGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIxIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5EZWZhdWx0VGFza1R5cGVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZWZhdWx0VGFza1R5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldERlZmF1bHRUYXNrVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrVHlwZSA8ZW0+RGVmYXVsdCBUYXNrIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERlZmF1bHRUYXNrVHlwZSgpCi0JICogQHNlZSAjdW5zZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI2dldERlZmF1bHRUYXNrVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdFRhc2tUeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFRhc2tUeXBlIDxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI2dldERlZmF1bHRUYXNrVHlwZSgpCi0JICogQHNlZSAjc2V0RGVmYXVsdFRhc2tUeXBlKEJpZ0ludGVnZXIpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXREZWZhdWx0VGFza1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrVHlwZSA8ZW0+RGVmYXVsdCBUYXNrIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI2dldERlZmF1bHRUYXNrVHlwZSgpCi0JICogQHNlZSAjc2V0RGVmYXVsdFRhc2tUeXBlKEJpZ0ludGVnZXIpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXREZWZhdWx0VGFza1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgRml4ZWQgQ29zdCBBY2NydWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBmcm9tIHdoZXJlIGZpeGVkIGNvc3RzIGFyZSBhY2NydWVkLiAgVmFsdWVzIGFyZTogCi0JICogCQkJCQkJMT1TdGFydCwgMj1Qcm9yYXRlZCwgMz1FbmQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9EZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwgPGVtPkRlZmF1bHQgRml4ZWQgQ29zdCBBY2NydWFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBzdGFuZGFyZCByYXRlIGZvciBuZXcgcmVzb3VyY2VzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFN0YW5kYXJkIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjdW5zZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkKLQkgKiBAc2VlICNzZXREZWZhdWx0U3RhbmRhcmRSYXRlKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlZmF1bHRTdGFuZGFyZFJhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXREZWZhdWx0U3RhbmRhcmRSYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSA8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFN0YW5kYXJkIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjdW5zZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0U3RhbmRhcmRSYXRlKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFuZGFyZFJhdGUgPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkKLQkgKiBAc2VlICNzZXREZWZhdWx0U3RhbmRhcmRSYXRlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSA8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFN0YW5kYXJkIFJhdGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldERlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBzZWUgI2dldERlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBzZWUgI3NldERlZmF1bHRTdGFuZGFyZFJhdGUoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXREZWZhdWx0U3RhbmRhcmRSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IG92ZXJ0aW1lIHJhdGUgZm9yIG5ldyByZXNvdXJjZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICN1bnNldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBzZWUgI3NldERlZmF1bHRPdmVydGltZVJhdGUoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9EZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVmYXVsdE92ZXJ0aW1lUmF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldERlZmF1bHRPdmVydGltZVJhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlIDxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICN1bnNldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBzZWUgI2dldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRPdmVydGltZVJhdGUoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSA8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBzZWUgI2dldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBzZWUgI3NldERlZmF1bHRPdmVydGltZVJhdGUoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlIDxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpCi0JICogQHNlZSAjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpCi0JICogQHNlZSAjc2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldERlZmF1bHRPdmVydGltZVJhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAyMT1udWxsLCAKLQkgKiAJCQkJCQkzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIAotCSAqIAkJCQkJCTUzPW51bGwuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0R1cmF0aW9uRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRHVyYXRpb25Gb3JtYXRUeXBlNSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRHVyYXRpb25Gb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldER1cmF0aW9uRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgd29yayB1bml0IGZvcm1hdC4gVmFsdWVzIGFyZTogCi0JICogCQkJCQkJMT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXb3JrRm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9Xb3JrRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya0Zvcm1hdFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmtGb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFdvcmtGb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXb3JrRm9ybWF0IDxlbT5Xb3JrIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdvcmtGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmtGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgb3Igbm90IGFjdHVhbCBjb3N0cyBhcmUgZWRpdGFibGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVkaXRhYmxlIEFjdHVhbCBDb3N0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAc2VlICN1bnNldEVkaXRhYmxlQWN0dWFsQ29zdHMoKQotCSAqIEBzZWUgI3NldEVkaXRhYmxlQWN0dWFsQ29zdHMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0VkaXRhYmxlQWN0dWFsQ29zdHMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFZGl0YWJsZUFjdHVhbENvc3RzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0VkaXRhYmxlQWN0dWFsQ29zdHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0VkaXRhYmxlQWN0dWFsQ29zdHMgPGVtPkVkaXRhYmxlIEFjdHVhbCBDb3N0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEVkaXRhYmxlQWN0dWFsQ29zdHMoKQotCSAqIEBzZWUgI3Vuc2V0RWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQHNlZSAjaXNFZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFZGl0YWJsZUFjdHVhbENvc3RzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNFZGl0YWJsZUFjdHVhbENvc3RzIDxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQHNlZSAjaXNFZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAc2VlICNzZXRFZGl0YWJsZUFjdHVhbENvc3RzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRFZGl0YWJsZUFjdHVhbENvc3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0VkaXRhYmxlQWN0dWFsQ29zdHMgPGVtPkVkaXRhYmxlIEFjdHVhbCBDb3N0czwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRFZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAc2VlICNpc0VkaXRhYmxlQWN0dWFsQ29zdHMoKQotCSAqIEBzZWUgI3NldEVkaXRhYmxlQWN0dWFsQ29zdHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEVkaXRhYmxlQWN0dWFsQ29zdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhvbm9yIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGFza3MgaG9ub3VyIHRoZWlyIGNvbnN0cmFpbnQgZGF0ZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEhvbm9yQ29uc3RyYWludHMoKQotCSAqIEBzZWUgI3Vuc2V0SG9ub3JDb25zdHJhaW50cygpCi0JICogQHNlZSAjc2V0SG9ub3JDb25zdHJhaW50cyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfSG9ub3JDb25zdHJhaW50cygpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSG9ub3JDb25zdHJhaW50cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNIb25vckNvbnN0cmFpbnRzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNIb25vckNvbnN0cmFpbnRzIDxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SG9ub3JDb25zdHJhaW50cygpCi0JICogQHNlZSAjdW5zZXRIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICNpc0hvbm9yQ29uc3RyYWludHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEhvbm9yQ29uc3RyYWludHMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0hvbm9yQ29uc3RyYWludHMgPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEhvbm9yQ29uc3RyYWludHMoKQotCSAqIEBzZWUgI2lzSG9ub3JDb25zdHJhaW50cygpCi0JICogQHNlZSAjc2V0SG9ub3JDb25zdHJhaW50cyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SG9ub3JDb25zdHJhaW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNIb25vckNvbnN0cmFpbnRzIDxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEhvbm9yQ29uc3RyYWludHMoKQotCSAqIEBzZWUgI2lzSG9ub3JDb25zdHJhaW50cygpCi0JICogQHNlZSAjc2V0SG9ub3JDb25zdHJhaW50cyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SG9ub3JDb25zdHJhaW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWFybmVkIFZhbHVlIE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgbWV0aG9kIGZvciBjYWxjdWxhdGluZyBlYXJuZWQgdmFsdWUuIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTA9UGVyY2VudCBDb21wbGV0ZSwgMT1QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVhcm5lZFZhbHVlTWV0aG9kKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9FYXJuZWRWYWx1ZU1ldGhvZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkVhcm5lZFZhbHVlTWV0aG9kVHlwZTEiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Vhcm5lZFZhbHVlTWV0aG9kJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEVhcm5lZFZhbHVlTWV0aG9kIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWFybmVkVmFsdWVNZXRob2QoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0byBjYWxjdWxhdGUgc3VidGFza3MgYXMgc3VtbWFyeSB0YXNrcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5zZXJ0ZWQgUHJvamVjdHMgTGlrZSBTdW1tYXJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQHNlZSAjdW5zZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBzZWUgI3NldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5zZXJ0ZWQgUHJvamVjdHMgTGlrZSBTdW1tYXJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQHNlZSAjdW5zZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBzZWUgI2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSA8ZW0+SW5zZXJ0ZWQgUHJvamVjdHMgTGlrZSBTdW1tYXJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQHNlZSAjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBzZWUgI3NldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSA8ZW0+SW5zZXJ0ZWQgUHJvamVjdHMgTGlrZSBTdW1tYXJ5PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQHNlZSAjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBzZWUgI3NldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciBtdWx0aXBsZSBjcml0aWNhbCBwYXRocyBhcmUgY2FsY3VsYXRlZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TXVsdGlwbGUgQ3JpdGljYWwgUGF0aHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAc2VlICN1bnNldE11bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQHNlZSAjc2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9NdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNdWx0aXBsZUNyaXRpY2FsUGF0aHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTXVsdGlwbGVDcml0aWNhbFBhdGhzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMgPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBzZWUgI3Vuc2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAc2VlICNpc011bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMgPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE11bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQHNlZSAjaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBzZWUgI3NldE11bHRpcGxlQ3JpdGljYWxQYXRocyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc011bHRpcGxlQ3JpdGljYWxQYXRocyA8ZW0+TXVsdGlwbGUgQ3JpdGljYWwgUGF0aHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBzZWUgI2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAc2VlICNzZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE11bHRpcGxlQ3JpdGljYWxQYXRocygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciBuZXcgdGFza3MgYXJlIGVmZm9ydCBkcml2ZW4uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICN1bnNldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNzZXROZXdUYXNrc0VmZm9ydERyaXZlbihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTmV3VGFza3NFZmZvcnREcml2ZW4oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J05ld1Rhc2tzRWZmb3J0RHJpdmVuJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc05ld1Rhc2tzRWZmb3J0RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNOZXdUYXNrc0VmZm9ydERyaXZlbiA8ZW0+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICN1bnNldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROZXdUYXNrc0VmZm9ydERyaXZlbihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTmV3VGFza3NFZmZvcnREcml2ZW4gPGVtPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNzZXROZXdUYXNrc0VmZm9ydERyaXZlbihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTmV3VGFza3NFZmZvcnREcml2ZW4gPGVtPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI2lzTmV3VGFza3NFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI3NldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXROZXdUYXNrc0VmZm9ydERyaXZlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmV3IFRhc2tzIEVzdGltYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRvIHNob3cgdGhlIGVzdGltYXRlZCBkdXJhdGlvbiBieSBkZWZhdWx0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OZXcgVGFza3MgRXN0aW1hdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE5ld1Rhc2tzRXN0aW1hdGVkKCkKLQkgKiBAc2VlICN1bnNldE5ld1Rhc2tzRXN0aW1hdGVkKCkKLQkgKiBAc2VlICNzZXROZXdUYXNrc0VzdGltYXRlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J05ld1Rhc2tzRXN0aW1hdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc05ld1Rhc2tzRXN0aW1hdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNOZXdUYXNrc0VzdGltYXRlZCA8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXROZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjdW5zZXROZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjaXNOZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmV3VGFza3NFc3RpbWF0ZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRXN0aW1hdGVkIDxlbT5OZXcgVGFza3MgRXN0aW1hdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE5ld1Rhc2tzRXN0aW1hdGVkKCkKLQkgKiBAc2VlICNpc05ld1Rhc2tzRXN0aW1hdGVkKCkKLQkgKiBAc2VlICNzZXROZXdUYXNrc0VzdGltYXRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TmV3VGFza3NFc3RpbWF0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTmV3VGFza3NFc3RpbWF0ZWQgPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE5ld1Rhc2tzRXN0aW1hdGVkKCkKLQkgKiBAc2VlICNpc05ld1Rhc2tzRXN0aW1hdGVkKCkKLQkgKiBAc2VlICNzZXROZXdUYXNrc0VzdGltYXRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TmV3VGFza3NFc3RpbWF0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIGluLXByb2dyZXNzIHRhc2tzIGNhbiBiZSBzcGxpdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcygpCi0JICogQHNlZSAjdW5zZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBzZWUgI3NldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTcGxpdHNJblByb2dyZXNzVGFza3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcGxpdHNJblByb2dyZXNzVGFza3MgPGVtPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcygpCi0JICogQHNlZSAjdW5zZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBzZWUgI2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTcGxpdHNJblByb2dyZXNzVGFza3MoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcyA8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcygpCi0JICogQHNlZSAjaXNTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBzZWUgI3NldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcyA8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcygpCi0JICogQHNlZSAjaXNTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBzZWUgI3NldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TcHJlYWQgQWN0dWFsIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciBhY3R1YWwgY29zdHMgYXJlIHNwcmVhZCB0byB0aGUgc3RhdHVzIGRhdGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNwcmVhZCBBY3R1YWwgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICN1bnNldFNwcmVhZEFjdHVhbENvc3QoKQotCSAqIEBzZWUgI3NldFNwcmVhZEFjdHVhbENvc3QoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1NwcmVhZEFjdHVhbENvc3QoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NwcmVhZEFjdHVhbENvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU3ByZWFkQWN0dWFsQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3ByZWFkQWN0dWFsQ29zdCA8ZW0+U3ByZWFkIEFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQHNlZSAjdW5zZXRTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNpc1NwcmVhZEFjdHVhbENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNwcmVhZEFjdHVhbENvc3QoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZEFjdHVhbENvc3QgPGVtPlNwcmVhZCBBY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNpc1NwcmVhZEFjdHVhbENvc3QoKQotCSAqIEBzZWUgI3NldFNwcmVhZEFjdHVhbENvc3QoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFNwcmVhZEFjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3ByZWFkQWN0dWFsQ29zdCA8ZW0+U3ByZWFkIEFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFNwcmVhZEFjdHVhbENvc3QoKQotCSAqIEBzZWUgI2lzU3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQHNlZSAjc2V0U3ByZWFkQWN0dWFsQ29zdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0U3ByZWFkQWN0dWFsQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgcGVyY2VudCBjb21wbGV0ZSBpcyBzcHJlYWQgdG8gdGhlIHN0YXR1cyBkYXRlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBzZWUgI3Vuc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICNzZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NwcmVhZFBlcmNlbnRDb21wbGV0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTcHJlYWRQZXJjZW50Q29tcGxldGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSA8ZW0+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQHNlZSAjdW5zZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBzZWUgI2lzU3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSA8ZW0+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQHNlZSAjc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3ByZWFkUGVyY2VudENvbXBsZXRlIDxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQHNlZSAjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBzZWUgI3NldFNwcmVhZFBlcmNlbnRDb21wbGV0ZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdXBkYXRlcyB0byB0YXNrcyB1cGRhdGUgcmVzb3VyY2VzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQHNlZSAjdW5zZXRUYXNrVXBkYXRlc1Jlc291cmNlKCkKLQkgKiBAc2VlICNzZXRUYXNrVXBkYXRlc1Jlc291cmNlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9UYXNrVXBkYXRlc1Jlc291cmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUYXNrVXBkYXRlc1Jlc291cmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1Rhc2tVcGRhdGVzUmVzb3VyY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1Rhc2tVcGRhdGVzUmVzb3VyY2UgPGVtPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFRhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBzZWUgI3Vuc2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQHNlZSAjaXNUYXNrVXBkYXRlc1Jlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUYXNrVXBkYXRlc1Jlc291cmNlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNUYXNrVXBkYXRlc1Jlc291cmNlIDxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQHNlZSAjaXNUYXNrVXBkYXRlc1Jlc291cmNlKCkKLQkgKiBAc2VlICNzZXRUYXNrVXBkYXRlc1Jlc291cmNlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRUYXNrVXBkYXRlc1Jlc291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1Rhc2tVcGRhdGVzUmVzb3VyY2UgPGVtPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRUYXNrVXBkYXRlc1Jlc291cmNlKCkKLQkgKiBAc2VlICNpc1Rhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBzZWUgI3NldFRhc2tVcGRhdGVzUmVzb3VyY2UoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFRhc2tVcGRhdGVzUmVzb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpc2NhbCBZZWFyIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgd2hldGhlciB0byB1c2UgZmlzY2FsIHllYXIgbnVtYmVyaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEZpc2NhbFllYXJTdGFydCgpCi0JICogQHNlZSAjdW5zZXRGaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBzZWUgI3NldEZpc2NhbFllYXJTdGFydChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaXNjYWxZZWFyU3RhcnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRmlzY2FsWWVhclN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNGaXNjYWxZZWFyU3RhcnQgPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRGaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBzZWUgI3Vuc2V0RmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICNpc0Zpc2NhbFllYXJTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmlzY2FsWWVhclN0YXJ0KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNGaXNjYWxZZWFyU3RhcnQgPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEZpc2NhbFllYXJTdGFydCgpCi0JICogQHNlZSAjaXNGaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBzZWUgI3NldEZpc2NhbFllYXJTdGFydChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RmlzY2FsWWVhclN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0Zpc2NhbFllYXJTdGFydCA8ZW0+RmlzY2FsIFllYXIgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRGaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBzZWUgI2lzRmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICNzZXRGaXNjYWxZZWFyU3RhcnQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEZpc2NhbFllYXJTdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2VlayBTdGFydCBEYXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFN0YXJ0IGRheSBvZiB0aGUgd2Vlay4gVmFsdWVzIGFyZTogCi0JICogCQkJCQkJMD1TdW5kYXksIDE9TW9uZGF5LCAyPVR1ZXNkYXksIDM9V2VkbmVzZGF5LCA0PVRodXJzZGF5LCA1PUZyaWRheSwgNj1TYXR1cmRheQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XZWVrIFN0YXJ0IERheTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V2Vla1N0YXJ0RGF5KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9XZWVrU3RhcnREYXkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrU3RhcnREYXlUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXZWVrU3RhcnREYXknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFdlZWtTdGFydERheSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFdlZWtTdGFydERheSA8ZW0+V2VlayBTdGFydCBEYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldlZWsgU3RhcnQgRGF5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXZWVrU3RhcnREYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdlZWtTdGFydERheShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1vdmUgQ29tcGxldGVkIEVuZHMgQmFjazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCQkJCQkJCVNwZWNpZmllcyB3aGV0aGVyIHRoZSBlbmQgb2YgY29tcGxldGVkIHBvcnRpb25zIG9mIHRhc2tzIHNjaGVkdWxlZCB0byBiZWdpbiBhZnRlciB0aGUgCi0JICogCQkJCQkJCXN0YXR1cyBkYXRlIGJ1dCBiZWd1biBlYXJseSBzaG91bGQgYmUgbW92ZWQgYmFjayB0byB0aGUgc3RhdHVzIGRhdGUuCi0JICogCQkJCQkJCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgQmFjazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBzZWUgI3Vuc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkKLQkgKiBAc2VlICNzZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X01vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01vdmVDb21wbGV0ZWRFbmRzQmFjaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVDb21wbGV0ZWRFbmRzQmFjayA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkKLQkgKiBAc2VlICN1bnNldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQHNlZSAjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1vdmVDb21wbGV0ZWRFbmRzQmFjayhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkKLQkgKiBAc2VlICNpc01vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQHNlZSAjc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgQmFjazwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkKLQkgKiBAc2VlICNpc01vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQHNlZSAjc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAJCQkJCQkJU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGJlZ2lubmluZyBvZiByZW1haW5pbmcgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGJlZ2luIGFmdGVyIHRoZSAKLQkgKiAJCQkJCQkJc3RhdHVzIGRhdGUgYnV0IGJlZ3VuIGVhcmx5IHNob3VsZCBiZSBtb3ZlZCBiYWNrIHRvIHRoZSBzdGF0dXMgZGF0ZS4KLQkgKiAJCQkJCQkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEJhY2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKQotCSAqIEBzZWUgI3Vuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKQotCSAqIEBzZWUgI3NldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9Nb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01vdmVSZW1haW5pbmdTdGFydHNCYWNrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayA8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEJhY2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAc2VlICN1bnNldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2sgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAc2VlICNzZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2sgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKQotCSAqIEBzZWUgI2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKQotCSAqIEBzZWUgI3NldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEZvcndhcmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAkJCQkJCQlTcGVjaWZpZXMgd2hldGhlciB0aGUgYmVnaW5uaW5nIG9mIHJlbWFpbmluZyBwb3J0aW9ucyBvZiB0YXNrcyBzY2hlZHVsZWQgdG8gaGF2ZSBiZWd1biBsYXRlIAotCSAqIAkJCQkJCQlzaG91bGQgYmUgbW92ZWQgdXAgdG8gdGhlIHN0YXR1cyBkYXRlLgotCSAqIAkJCQkJCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpCi0JICogQHNlZSAjdW5zZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpCi0JICogQHNlZSAjc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEZvcndhcmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBzZWUgI3Vuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBzZWUgI2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCA8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEZvcndhcmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBzZWUgI2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBzZWUgI3NldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCA8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEZvcndhcmQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpCi0JICogQHNlZSAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpCi0JICogQHNlZSAjc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAkJCQkJCQlTcGVjaWZpZXMgd2hldGhlciB0aGUgZW5kIG9mIGNvbXBsZXRlZCBwb3J0aW9ucyBvZiB0YXNrcyBzY2hlZHVsZWQgdG8gaGF2ZSBiZWVuIGNvbXBsZXRlZCAKLQkgKiAJCQkJCQkJYmVmb3JlIHRoZSBzdGF0dXMgZGF0ZSBidXQgYmVndW4gbGF0ZSBzaG91bGQgYmUgbW92ZWQgdXAgdG8gdGhlIHN0YXR1cyBkYXRlLgotCSAqIAkJCQkJCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAc2VlICN1bnNldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQHNlZSAjc2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9Nb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQHNlZSAjdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKQotCSAqIEBzZWUgI2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQHNlZSAjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKQotCSAqIEBzZWUgI3NldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQHNlZSAjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKQotCSAqIEBzZWUgI3NldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc3BlY2lmaWMgYmFzZWxpbmUgdXNlZCB0byBjYWxjdWxhdGUgVmFyaWFuY2UgdmFsdWVzLiAgVmFsdWVzIGFyZTogCi0JICogCQkJCQkJMD1CYXNlbGluZSwgMT1CYXNlbGluZSAxLCAyPUJhc2VsaW5lIDIsIDM9QmFzZWxpbmUgMywgND1CYXNlbGluZSA0LCA1PUJhc2VsaW5lIDUsIDY9QmFzZWxpbmUgNiwgCi0JICogCQkJCQkJNz1CYXNlbGluZSA3LCA4PUJhc2VsaW5lIDgsIDk9QmFzZWxpbmUgOSwgMTA9QmFzZWxpbmUgMTAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZWxpbmUgRm9yIEVhcm5lZCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCYXNlbGluZUZvckVhcm5lZFZhbHVlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSA8ZW0+QmFzZWxpbmUgRm9yIEVhcm5lZCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZWxpbmUgRm9yIEVhcm5lZCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBhZGQgbmV3IHJlc291cmNlcyB0byB0aGUgcmVzb3VyY2UgcG9vbC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAc2VlICN1bnNldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpCi0JICogQHNlZSAjc2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9BdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyA8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpCi0JICogQHNlZSAjdW5zZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI2lzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyA8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAc2VlICNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpCi0JICogQHNlZSAjc2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzIDxlbT5BdXRvIEFkZCBOZXcgUmVzb3VyY2VzIEFuZCBUYXNrczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpCi0JICogQHNlZSAjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI3NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGF0dXMgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGF0ZSB1c2VkIGZvciBjYWxjdWxhdGlvbiBhbmQgcmVwb3J0aW5nLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGF0dXMgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhdHVzRGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9TdGF0dXNEYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhdHVzRGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRTdGF0dXNEYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0U3RhdHVzRGF0ZSA8ZW0+U3RhdHVzIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXR1cyBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdGF0dXNEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGF0dXNEYXRlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DdXJyZW50IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzeXN0ZW0gZGF0ZSB0aGF0IHRoZSBYTUwgd2FzIGdlbmVyYXRlZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3VycmVudCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDdXJyZW50RGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9DdXJyZW50RGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0N1cnJlbnREYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEN1cnJlbnREYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVudERhdGUgPGVtPkN1cnJlbnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VycmVudCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDdXJyZW50RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3VycmVudERhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHByb2plY3Qgd2FzIGNyZWF0ZWQgYnkgYSBQcm9qZWN0IFNlcnZlciB1c2VyIGFzIG9wcG9zZWQgdG8gYW4gTlQgdXNlci4KLQkgKiAJCQkJCQkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAc2VlICN1bnNldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKQotCSAqIEBzZWUgI3NldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCA8ZW0+TWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAc2VlICN1bnNldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKQotCSAqIEBzZWUgI2lzTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCA8ZW0+TWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAc2VlICNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKQotCSAqIEBzZWUgI3NldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCA8ZW0+TWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQHNlZSAjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAc2VlICNzZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdXRvbGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0byBhdXRvbGluayBpbnNlcnRlZCBvciBtb3ZlZCB0YXNrcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXV0b2xpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QXV0b2xpbmsoKQotCSAqIEBzZWUgI3Vuc2V0QXV0b2xpbmsoKQotCSAqIEBzZWUgI3NldEF1dG9saW5rKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9BdXRvbGluaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXV0b2xpbmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQXV0b2xpbmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9saW5rIDxlbT5BdXRvbGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXV0b2xpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QXV0b2xpbmsoKQotCSAqIEBzZWUgI3Vuc2V0QXV0b2xpbmsoKQotCSAqIEBzZWUgI2lzQXV0b2xpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF1dG9saW5rKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvbGluayA8ZW0+QXV0b2xpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QXV0b2xpbmsoKQotCSAqIEBzZWUgI2lzQXV0b2xpbmsoKQotCSAqIEBzZWUgI3NldEF1dG9saW5rKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRBdXRvbGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvbGluayA8ZW0+QXV0b2xpbms8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dG9saW5rPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBdXRvbGluaygpCi0JICogQHNlZSAjaXNBdXRvbGluaygpCi0JICogQHNlZSAjc2V0QXV0b2xpbmsoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEF1dG9saW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OZXcgVGFzayBTdGFydCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBkYXRlIGZvciBuZXcgdGFza3Mgc3RhcnQuICBWYWx1ZXMgYXJlOiAKLQkgKiAJCQkJCQkwPVByb2plY3QgU3RhcnQgRGF0ZSwgMT1DdXJyZW50IERhdGUKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmV3IFRhc2sgU3RhcnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmV3VGFza1N0YXJ0RGF0ZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTmV3VGFza1N0YXJ0RGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk5ld1Rhc2tTdGFydERhdGVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOZXdUYXNrU3RhcnREYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXROZXdUYXNrU3RhcnREYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TmV3VGFza1N0YXJ0RGF0ZSA8ZW0+TmV3IFRhc2sgU3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmV3IFRhc2sgU3RhcnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmV3VGFza1N0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmV3VGFza1N0YXJ0RGF0ZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgVGFzayBFViBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IGVhcm5lZCB2YWx1ZSBtZXRob2QgZm9yIHRhc2tzLiAgVmFsdWVzIGFyZTogCi0JICogCQkJCQkJMD1QZXJjZW50IENvbXBsZXRlLCAxPVBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGUKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBUYXNrIEVWIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVmYXVsdFRhc2tFVk1ldGhvZChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRGVmYXVsdFRhc2tFVk1ldGhvZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRlZmF1bHRUYXNrRVZNZXRob2RUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZWZhdWx0VGFza0VWTWV0aG9kJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREZWZhdWx0VGFza0VWTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCA8ZW0+RGVmYXVsdCBUYXNrIEVWIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBUYXNrIEVWIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdFRhc2tFVk1ldGhvZChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHByb2plY3QgWE1MIHdhcyBlZGl0ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKQotCSAqIEBzZWUgI3NldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9Qcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkIDxlbT5Qcm9qZWN0IEV4dGVybmFsbHkgRWRpdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IEV4dGVybmFsbHkgRWRpdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICN1bnNldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKQotCSAqIEBzZWUgI2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKQotCSAqIEBzZWUgI3NldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCA8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKQotCSAqIEBzZWUgI2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKQotCSAqIEBzZWUgI3NldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGF0ZSB1c2VkIGZvciBjYWxjdWxhdGlvbiBhbmQgcmVwb3J0aW5nLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeHRlbmRlZENyZWF0aW9uRGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9FeHRlbmRlZENyZWF0aW9uRGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVuZGVkQ3JlYXRpb25EYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEV4dGVuZGVkQ3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUgPGVtPkV4dGVuZGVkIENyZWF0aW9uIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVuZGVkIENyZWF0aW9uIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEV4dGVuZGVkQ3JlYXRpb25EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeHRlbmRlZENyZWF0aW9uRGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFscyBJbiBTeW5jPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIGFsbCBhY3R1YWwgd29yayBoYXMgYmVlbiBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFscyBJbiBTeW5jPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFjdHVhbHNJblN5bmMoKQotCSAqIEBzZWUgI3Vuc2V0QWN0dWFsc0luU3luYygpCi0JICogQHNlZSAjc2V0QWN0dWFsc0luU3luYyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQWN0dWFsc0luU3luYygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsc0luU3luYycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNBY3R1YWxzSW5TeW5jKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBY3R1YWxzSW5TeW5jIDxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBY3R1YWxzSW5TeW5jKCkKLQkgKiBAc2VlICN1bnNldEFjdHVhbHNJblN5bmMoKQotCSAqIEBzZWUgI2lzQWN0dWFsc0luU3luYygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsc0luU3luYyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWN0dWFsc0luU3luYyA8ZW0+QWN0dWFscyBJbiBTeW5jPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEFjdHVhbHNJblN5bmMoKQotCSAqIEBzZWUgI2lzQWN0dWFsc0luU3luYygpCi0JICogQHNlZSAjc2V0QWN0dWFsc0luU3luYyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QWN0dWFsc0luU3luYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBY3R1YWxzSW5TeW5jIDxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QWN0dWFsc0luU3luYygpCi0JICogQHNlZSAjaXNBY3R1YWxzSW5TeW5jKCkKLQkgKiBAc2VlICNzZXRBY3R1YWxzSW5TeW5jKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRBY3R1YWxzSW5TeW5jKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRvIHJlbW92ZSBhbGwgZmlsZSBwcm9wZXJ0aWVzIG9uIHNhdmUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoKQotCSAqIEBzZWUgI3Vuc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoKQotCSAqIEBzZWUgI3NldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9SZW1vdmVGaWxlUHJvcGVydGllcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtb3ZlRmlsZVByb3BlcnRpZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUmVtb3ZlRmlsZVByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzIDxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICN1bnNldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1vdmVGaWxlUHJvcGVydGllcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzUmVtb3ZlRmlsZVByb3BlcnRpZXMgPGVtPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoKQotCSAqIEBzZWUgI2lzUmVtb3ZlRmlsZVByb3BlcnRpZXMoKQotCSAqIEBzZWUgI3NldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRSZW1vdmVGaWxlUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNSZW1vdmVGaWxlUHJvcGVydGllcyA8ZW0+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoKQotCSAqIEBzZWUgI2lzUmVtb3ZlRmlsZVByb3BlcnRpZXMoKQotCSAqIEBzZWUgI3NldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSZW1vdmVGaWxlUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWRtaW4gUHJvamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgcHJvamVjdCBpcyBhbiBhZG1pbmlzdHJhdGl2ZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZG1pbiBQcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFkbWluUHJvamVjdCgpCi0JICogQHNlZSAjdW5zZXRBZG1pblByb2plY3QoKQotCSAqIEBzZWUgI3NldEFkbWluUHJvamVjdChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQWRtaW5Qcm9qZWN0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBZG1pblByb2plY3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQWRtaW5Qcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBZG1pblByb2plY3QgPGVtPkFkbWluIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFkbWluIFByb2plY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QWRtaW5Qcm9qZWN0KCkKLQkgKiBAc2VlICN1bnNldEFkbWluUHJvamVjdCgpCi0JICogQHNlZSAjaXNBZG1pblByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFkbWluUHJvamVjdChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWRtaW5Qcm9qZWN0IDxlbT5BZG1pbiBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEFkbWluUHJvamVjdCgpCi0JICogQHNlZSAjaXNBZG1pblByb2plY3QoKQotCSAqIEBzZWUgI3NldEFkbWluUHJvamVjdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QWRtaW5Qcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FkbWluUHJvamVjdCA8ZW0+QWRtaW4gUHJvamVjdDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRtaW4gUHJvamVjdDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QWRtaW5Qcm9qZWN0KCkKLQkgKiBAc2VlICNpc0FkbWluUHJvamVjdCgpCi0JICogQHNlZSAjc2V0QWRtaW5Qcm9qZWN0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRBZG1pblByb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dGxpbmUgQ29kZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIG91dGxpbmUgY29kZSBkZWZpbml0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuICBUaGVzZSBjb2RlcyBtYXkgYmUgYXNzb2NpYXRlZCBvbmx5IHdpdGggdGhpcyBwcm9qZWN0LCBvciBtYXkgYmUgY29tbW9uIGFtb25nIHNldmVyYWwgcHJvamVjdHMgKGVudGVycHJpc2UgY29kZXMpLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRsaW5lIENvZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRPdXRsaW5lQ29kZXMoT3V0bGluZUNvZGVzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfT3V0bGluZUNvZGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3V0bGluZUNvZGVzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT3V0bGluZUNvZGVzIGdldE91dGxpbmVDb2RlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE91dGxpbmVDb2RlcyA8ZW0+T3V0bGluZSBDb2RlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3V0bGluZSBDb2RlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdXRsaW5lQ29kZXMoT3V0bGluZUNvZGVzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldCUyBNYXNrczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRhYmxlIG9mIGVudHJpZXMgdGhhdCBkZWZpbmUgdGhlIG91dGxpbmUgY29kZSBtYXNrLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XQlMgTWFza3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFdCU01hc2tzKFdCU01hc2tzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfV0JTTWFza3MoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXQlNNYXNrcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdCU01hc2tzIGdldFdCU01hc2tzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V0JTTWFza3MgPGVtPldCUyBNYXNrczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V0JTIE1hc2tzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRXQlNNYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V0JTTWFza3MoV0JTTWFza3MgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvbGxlY3Rpb24gb2YgZXh0ZW5kZWQgYXR0cmlidXRlIChjdXN0b20gZmllbGQpIGRlZmluaXRpb25zIAotCSAqICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFeHRlbmRlZEF0dHJpYnV0ZXMoRXh0ZW5kZWRBdHRyaWJ1dGVzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRXh0ZW5kZWRBdHRyaWJ1dGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXh0ZW5kZWRBdHRyaWJ1dGVzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXh0ZW5kZWRBdHRyaWJ1dGVzIGdldEV4dGVuZGVkQXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEV4dGVuZGVkQXR0cmlidXRlcyA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeHRlbmRlZEF0dHJpYnV0ZXMoRXh0ZW5kZWRBdHRyaWJ1dGVzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhbGVuZGFyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvbGxlY3Rpb24gb2YgY2FsZW5kYXJzIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSAKLQkgKiAgICAgICAgIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhbGVuZGFyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q2FsZW5kYXJzKENhbGVuZGFycykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0NhbGVuZGFycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NhbGVuZGFycycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNhbGVuZGFycyBnZXRDYWxlbmRhcnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDYWxlbmRhcnMgPGVtPkNhbGVuZGFyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FsZW5kYXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDYWxlbmRhcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhbGVuZGFycyhDYWxlbmRhcnMgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFza3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIHRhc2tzIHRoYXQgbWFrZSB1cCB0aGUgcHJvamVjdC4KLQkgKiAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VGFza3MoVGFza3MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9UYXNrcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Rhc2tzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFza3MgZ2V0VGFza3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRUYXNrcyA8ZW0+VGFza3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhc2tzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRUYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGFza3MoVGFza3MgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMgdGhhdCBtYWtlIHVwIHRoZSBwcm9qZWN0LgotCSAqICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmVzb3VyY2VzKFJlc291cmNlcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1Jlc291cmNlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc291cmNlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlc291cmNlcyBnZXRSZXNvdXJjZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXNvdXJjZXMgPGVtPlJlc291cmNlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc291cmNlcyhSZXNvdXJjZXMgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXNzaWdubWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIGFzc2lnbm1lbnRzIHRoYXQgbWFrZSB1cCB0aGUgcHJvamVjdC4KLQkgKiAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFzc2lnbm1lbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBc3NpZ25tZW50cyhBc3NpZ25tZW50cykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0Fzc2lnbm1lbnRzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXNzaWdubWVudHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBc3NpZ25tZW50cyBnZXRBc3NpZ25tZW50cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEFzc2lnbm1lbnRzIDxlbT5Bc3NpZ25tZW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXNzaWdubWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBc3NpZ25tZW50cyhBc3NpZ25tZW50cyB2YWx1ZSk7Ci0KLX0gLy8gUHJvamVjdApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9SYXRlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1JhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVlNDgwNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1JhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJhdGUuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVzRnJvbSA8ZW0+UmF0ZXMgRnJvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVzVG8gPGVtPlJhdGVzIFRvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0UmF0ZVRhYmxlIDxlbT5SYXRlIFRhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0U3RhbmRhcmRSYXRlIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0IDxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldE92ZXJ0aW1lUmF0ZSA8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRDb3N0UGVyVXNlIDxlbT5Db3N0IFBlciBVc2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSYXRlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdSYXRlXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJhdGUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYXRlcyBGcm9tPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGF0IHRoZSByYXRlIGJlY29tZXMgZWZmZWN0aXZlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJhdGVzIEZyb208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJhdGVzRnJvbShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmF0ZV9SYXRlc0Zyb20oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmF0ZXNGcm9tJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJhdGVzRnJvbSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVzRnJvbSA8ZW0+UmF0ZXMgRnJvbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmF0ZXMgRnJvbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmF0ZXNGcm9tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSYXRlc0Zyb20oT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJhdGVzIFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGFzdCBkYXRlIHRoYXQgdGhlIHJhdGUgaXMgZWZmZWN0aXZlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJhdGVzIFRvPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSYXRlc1RvKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSYXRlX1JhdGVzVG8oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmF0ZXNUbycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSYXRlc1RvKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0UmF0ZXNUbyA8ZW0+UmF0ZXMgVG88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJhdGVzIFRvPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSYXRlc1RvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSYXRlc1RvKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYXRlIFRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJhdGUgdGFibGUgZm9yIHRoZSByZXNvdXJjZS4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPUEsIDE9QiwgMj1DLCAzPUQsIDQ9RQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SYXRlIFRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSYXRlVGFibGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSYXRlX1JhdGVUYWJsZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVUYWJsZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JhdGVUYWJsZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UmF0ZVRhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0UmF0ZVRhYmxlIDxlbT5SYXRlIFRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SYXRlIFRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSYXRlVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJhdGVUYWJsZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YW5kYXJkIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzdGFuZGFyZCByYXRlIGZvciB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwZXJpb2Qgc3BlY2lmaWVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0YW5kYXJkIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YW5kYXJkUmF0ZShCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJhdGVfU3RhbmRhcmRSYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFuZGFyZFJhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldFN0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFN0YW5kYXJkUmF0ZSA8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhbmRhcmRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFuZGFyZFJhdGUoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXRzIHVzZWQgYnkgTWljcm9zb2Z0IFByb2plY3QgdG8gZGlzcGxheSB0aGUgc3RhbmRhcmQgcmF0ZS4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vLCA3PXkKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhbmRhcmRSYXRlRm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmF0ZV9TdGFuZGFyZFJhdGVGb3JtYXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5TdGFuZGFyZFJhdGVGb3JtYXRUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFuZGFyZFJhdGVGb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFN0YW5kYXJkUmF0ZUZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YW5kYXJkUmF0ZUZvcm1hdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBvdmVydGltZSByYXRlIGZvciB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwZXJpb2Qgc3BlY2lmaWVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE92ZXJ0aW1lUmF0ZShCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJhdGVfT3ZlcnRpbWVSYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVydGltZVJhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldE92ZXJ0aW1lUmF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldE92ZXJ0aW1lUmF0ZSA8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZVJhdGUoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVydGltZSBSYXRlIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXRzIHVzZWQgYnkgTWljcm9zb2Z0IFByb2plY3QgdG8gZGlzcGxheSB0aGUgb3ZlcnRpbWUgcmF0ZS4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vLCA3PXkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE92ZXJ0aW1lUmF0ZUZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJhdGVfT3ZlcnRpbWVSYXRlRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcnRpbWVSYXRlRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRPdmVydGltZVJhdGVGb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGVGb3JtYXQgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZVJhdGVGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0IFBlciBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb3N0IHBlciB1c2Ugb2YgdGhlIHJlc291cmNlLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBQZXIgVXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3N0UGVyVXNlKEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmF0ZV9Db3N0UGVyVXNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3N0UGVyVXNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRDb3N0UGVyVXNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0Q29zdFBlclVzZSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0IFBlciBVc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvc3RQZXJVc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3RQZXJVc2UoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLX0gLy8gUmF0ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9SYXRlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9SYXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmQ3ZWQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUmF0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmF0ZXMuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmF0ZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlcyNnZXRSYXRlIDxlbT5SYXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmF0ZXMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JhdGVzXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJhdGVzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmaW5pdGlvbiBvZiBhIHRpbWUgcGVyaW9kLCBhbmQgdGhlIHJhdGVzIGFwcGxpY2FibGUgZm9yIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlc291cmNlIGR1cmluZyB0aGF0IHBlcmlvZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmF0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSYXRlc19SYXRlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiB1cHBlcj0iMjUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRSYXRlKCk7Ci0KLX0gLy8gUmF0ZXMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUmVzb3VyY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA2NGY5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Jlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjg2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmVzb3VyY2UuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldElEIDxlbT5JRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc051bGwgPGVtPklzIE51bGw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SW5pdGlhbHMgPGVtPkluaXRpYWxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFBob25ldGljcyA8ZW0+UGhvbmV0aWNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE5UQWNjb3VudCA8ZW0+TlQgQWNjb3VudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRNYXRlcmlhbExhYmVsIDxlbT5NYXRlcmlhbCBMYWJlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb2RlIDxlbT5Db2RlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrR3JvdXAgPGVtPldvcmsgR3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0RW1haWxBZGRyZXNzIDxlbT5FbWFpbCBBZGRyZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEh5cGVybGluayA8ZW0+SHlwZXJsaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEh5cGVybGlua0FkZHJlc3MgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRNYXhVbml0cyA8ZW0+TWF4IFVuaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFBlYWtVbml0cyA8ZW0+UGVhayBVbml0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc092ZXJBbGxvY2F0ZWQgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEF2YWlsYWJsZUZyb20gPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEF2YWlsYWJsZVRvIDxlbT5BdmFpbGFibGUgVG88L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzQ2FuTGV2ZWwgPGVtPkNhbiBMZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY2NydWVBdCA8ZW0+QWNjcnVlIEF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmsgPGVtPldvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVdvcmsgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nV29yayA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTdGFuZGFyZFJhdGUgPGVtPlN0YW5kYXJkIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0IDxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lUmF0ZSA8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVJhdGVGb3JtYXQgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lQ29zdCA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0UGVyVXNlIDxlbT5Db3N0IFBlciBVc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0IDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdDb3N0IDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0VmFyaWFuY2UgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U1YgPGVtPlNWPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENWIDxlbT5DVjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENhbGVuZGFyVUlEIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1MgPGVtPkJDV1M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzR2VuZXJpYyA8ZW0+SXMgR2VuZXJpYzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzSW5hY3RpdmUgPGVtPklzIEluYWN0aXZlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNFbnRlcnByaXNlIDxlbT5JcyBFbnRlcnByaXNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJvb2tpbmdUeXBlIDxlbT5Cb29raW5nIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdGl2ZURpcmVjdG9yeUdVSUQgPGVtPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDcmVhdGlvbkRhdGUgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3V0bGluZUNvZGUgPGVtPk91dGxpbmUgQ29kZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFiaWxpdHlQZXJpb2RzIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSYXRlcyA8ZW0+UmF0ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdSZXNvdXJjZV8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZSBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1VJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwb3NpdGlvbiBpZGVudGlmaWVyIG9mIHRoZSByZXNvdXJjZSB3aXRoaW4gdGhlIGxpc3Qgb2YgcmVzb3VyY2VzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0lEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0SUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SUQgPGVtPklEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX05hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5OYW1lVHlwZTEiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J05hbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdHlwZSBvZiByZXNvdXJjZS4gVmFsdWVzIGFyZTogMD1NYXRlcmlhbCwgMT1Xb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1R5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UeXBlVHlwZTQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1R5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIE51bGw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBudWxsLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIE51bGw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNOdWxsKCkKLQkgKiBAc2VlICN1bnNldElzTnVsbCgpCi0JICogQHNlZSAjc2V0SXNOdWxsKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfSXNOdWxsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJc051bGwnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNOdWxsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNOdWxsIDxlbT5JcyBOdWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBOdWxsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzTnVsbCgpCi0JICogQHNlZSAjdW5zZXRJc051bGwoKQotCSAqIEBzZWUgI2lzSXNOdWxsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc051bGwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc051bGwgPGVtPklzIE51bGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNOdWxsKCkKLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQHNlZSAjc2V0SXNOdWxsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc051bGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgTnVsbDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNOdWxsKCkKLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQHNlZSAjc2V0SXNOdWxsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc051bGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluaXRpYWxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgaW5pdGlhbHMgb2YgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJbml0aWFscyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfSW5pdGlhbHMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Jbml0aWFsc1R5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0luaXRpYWxzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEluaXRpYWxzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEluaXRpYWxzIDxlbT5Jbml0aWFsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdGlhbHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEluaXRpYWxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbml0aWFscyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGhvbmV0aWNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGhvbmV0aWMgc3BlbGxpbmcgb2YgdGhlIHJlc291cmNlIG5hbWUuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciB1c2Ugd2l0aCBKYXBhbmVzZSBvbmx5LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBob25ldGljczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGhvbmV0aWNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9QaG9uZXRpY3MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QaG9uZXRpY3NUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQaG9uZXRpY3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGhvbmV0aWNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFBob25ldGljcyA8ZW0+UGhvbmV0aWNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QaG9uZXRpY3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBob25ldGljcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGhvbmV0aWNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OVCBBY2NvdW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgTlQgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5UIEFjY291bnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5UQWNjb3VudChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfTlRBY2NvdW50KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTlRBY2NvdW50VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTlRBY2NvdW50JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5UQWNjb3VudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROVEFjY291bnQgPGVtPk5UIEFjY291bnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5UIEFjY291bnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5UQWNjb3VudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TlRBY2NvdW50KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXRlcmlhbCBMYWJlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXQgb2YgbWVhc3VyZSBmb3IgdGhlIG1hdGVyaWFsIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hdGVyaWFsIExhYmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYXRlcmlhbExhYmVsKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9NYXRlcmlhbExhYmVsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWF0ZXJpYWxMYWJlbFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01hdGVyaWFsTGFiZWwnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWF0ZXJpYWxMYWJlbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRNYXRlcmlhbExhYmVsIDxlbT5NYXRlcmlhbCBMYWJlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWF0ZXJpYWwgTGFiZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hdGVyaWFsTGFiZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1hdGVyaWFsTGFiZWwoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb2RlIG9yIG90aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2RlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb2RlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Db2RlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ29kZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvZGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29kZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb2RlIDxlbT5Db2RlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db2RlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb2RlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGdyb3VwIHRvIHdoaWNoIHRoZSByZXNvdXJjZSBiZWxvbmdzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRHcm91cChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfR3JvdXAoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Hcm91cFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0dyb3VwJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEdyb3VwKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHcm91cChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yayBHcm91cDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHR5cGUgb2Ygd29ya2dyb3VwIHRvIHdoaWNoIHRoZSByZXNvdXJjZSBiZWxvbmdzLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9RGVmYXVsdCwgMT1Ob25lLCAyPUVtYWlsLCAzPVdlYgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgR3JvdXA8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdvcmtHcm91cChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1dvcmtHcm91cCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtHcm91cFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmtHcm91cCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0V29ya0dyb3VwKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmtHcm91cCA8ZW0+V29yayBHcm91cDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBHcm91cDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V29ya0dyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrR3JvdXAoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbWFpbCBBZGRyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW1haWwgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RW1haWxBZGRyZXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9FbWFpbEFkZHJlc3MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FbWFpbEFkZHJlc3NUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFbWFpbEFkZHJlc3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RW1haWxBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEVtYWlsQWRkcmVzcyA8ZW0+RW1haWwgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW1haWwgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RW1haWxBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbWFpbEFkZHJlc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkh5cGVybGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpdGxlIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEh5cGVybGluayhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfSHlwZXJsaW5rKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSHlwZXJsaW5rVHlwZTEiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0h5cGVybGluaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRIeXBlcmxpbmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SHlwZXJsaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIeXBlcmxpbmsoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkh5cGVybGluayBBZGRyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEh5cGVybGlua0FkZHJlc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0h5cGVybGlua0FkZHJlc3MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5IeXBlcmxpbmtBZGRyZXNzVHlwZTEiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0h5cGVybGlua0FkZHJlc3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SHlwZXJsaW5rQWRkcmVzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEh5cGVybGlua0FkZHJlc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkh5cGVybGluayBTdWIgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRvY3VtZW50IGJvb2ttYXJrIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEh5cGVybGlua1N1YkFkZHJlc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0h5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSHlwZXJsaW5rU3ViQWRkcmVzcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXggVW5pdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMS4wIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdW5pdHMgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1heCBVbml0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNYXhVbml0cygpCi0JICogQHNlZSAjdW5zZXRNYXhVbml0cygpCi0JICogQHNlZSAjc2V0TWF4VW5pdHMoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfTWF4VW5pdHMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIxLjAiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01heFVuaXRzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0TWF4VW5pdHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF4VW5pdHMgPGVtPk1heCBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWF4IFVuaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1heFVuaXRzKCkKLQkgKiBAc2VlICN1bnNldE1heFVuaXRzKCkKLQkgKiBAc2VlICNnZXRNYXhVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWF4VW5pdHMoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE1heFVuaXRzIDxlbT5NYXggVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TWF4VW5pdHMoKQotCSAqIEBzZWUgI2dldE1heFVuaXRzKCkKLQkgKiBAc2VlICNzZXRNYXhVbml0cyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE1heFVuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF4VW5pdHMgPGVtPk1heCBVbml0czwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWF4IFVuaXRzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNYXhVbml0cygpCi0JICogQHNlZSAjZ2V0TWF4VW5pdHMoKQotCSAqIEBzZWUgI3NldE1heFVuaXRzKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TWF4VW5pdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlYWsgVW5pdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBsYXJnZXN0IG51bWJlciBvZiB1bml0cyBhc3NpZ25lZCB0byB0aGUgcmVzb3VyY2UgYXQgYW55IHRpbWUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVhayBVbml0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRQZWFrVW5pdHMoKQotCSAqIEBzZWUgI3Vuc2V0UGVha1VuaXRzKCkKLQkgKiBAc2VlICNzZXRQZWFrVW5pdHMoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfUGVha1VuaXRzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGVha1VuaXRzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0UGVha1VuaXRzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFBlYWtVbml0cyA8ZW0+UGVhayBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGVhayBVbml0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRQZWFrVW5pdHMoKQotCSAqIEBzZWUgI3Vuc2V0UGVha1VuaXRzKCkKLQkgKiBAc2VlICNnZXRQZWFrVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBlYWtVbml0cyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGVha1VuaXRzIDxlbT5QZWFrIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFBlYWtVbml0cygpCi0JICogQHNlZSAjZ2V0UGVha1VuaXRzKCkKLQkgKiBAc2VlICNzZXRQZWFrVW5pdHMoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRQZWFrVW5pdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQZWFrVW5pdHMgPGVtPlBlYWsgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlYWsgVW5pdHM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFBlYWtVbml0cygpCi0JICogQHNlZSAjZ2V0UGVha1VuaXRzKCkKLQkgKiBAc2VlICNzZXRQZWFrVW5pdHMoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRQZWFrVW5pdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk92ZXIgQWxsb2NhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSByZXNvdXJjZSBpcyBvdmVyYWxsb2NhdGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE92ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjc2V0T3ZlckFsbG9jYXRlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX092ZXJBbGxvY2F0ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J092ZXJBbGxvY2F0ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzT3ZlckFsbG9jYXRlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc092ZXJBbGxvY2F0ZWQgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICN1bnNldE92ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI2lzT3ZlckFsbG9jYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlckFsbG9jYXRlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc092ZXJBbGxvY2F0ZWQgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE92ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI2lzT3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjc2V0T3ZlckFsbG9jYXRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0T3ZlckFsbG9jYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzT3ZlckFsbG9jYXRlZCA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3NldE92ZXJBbGxvY2F0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE92ZXJBbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF2YWlsYWJsZSBGcm9tPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZmlyc3QgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmxlIEZyb208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF2YWlsYWJsZUZyb20oT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0F2YWlsYWJsZUZyb20oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdmFpbGFibGVGcm9tJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEF2YWlsYWJsZUZyb20oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QXZhaWxhYmxlRnJvbSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdmFpbGFibGVGcm9tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdmFpbGFibGVGcm9tKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdmFpbGFibGUgVG88L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBsYXN0IGRhdGUgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgVG88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF2YWlsYWJsZVRvKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BdmFpbGFibGVUbygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0F2YWlsYWJsZVRvJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEF2YWlsYWJsZVRvKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEF2YWlsYWJsZVRvIDxlbT5BdmFpbGFibGUgVG88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF2YWlsYWJsZSBUbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVG8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF2YWlsYWJsZVRvKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhcnQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1N0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhcnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0U3RhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXJ0KE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmluaXNoKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9GaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaW5pc2gnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RmluaXNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYW4gTGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHJlc291cmNlIGNhbiBiZSBsZXZlbGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhbiBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDYW5MZXZlbCgpCi0JICogQHNlZSAjdW5zZXRDYW5MZXZlbCgpCi0JICogQHNlZSAjc2V0Q2FuTGV2ZWwoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9DYW5MZXZlbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ2FuTGV2ZWwnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQ2FuTGV2ZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNDYW5MZXZlbCA8ZW0+Q2FuIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYW4gTGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q2FuTGV2ZWwoKQotCSAqIEBzZWUgI3Vuc2V0Q2FuTGV2ZWwoKQotCSAqIEBzZWUgI2lzQ2FuTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhbkxldmVsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzQ2FuTGV2ZWwgPGVtPkNhbiBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRDYW5MZXZlbCgpCi0JICogQHNlZSAjaXNDYW5MZXZlbCgpCi0JICogQHNlZSAjc2V0Q2FuTGV2ZWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldENhbkxldmVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNDYW5MZXZlbCA8ZW0+Q2FuIExldmVsPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYW4gTGV2ZWw8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENhbkxldmVsKCkKLQkgKiBAc2VlICNpc0NhbkxldmVsKCkKLQkgKiBAc2VlICNzZXRDYW5MZXZlbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q2FuTGV2ZWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY3J1ZSBBdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSG93IGNvc3QgaXMgYWNjcnVlZCBhZ2FpbnN0IHRoZSByZXNvdXJjZS4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAxPVN0YXJ0LCAyPUVuZCwgMz1Qcm9yYXRlZAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY3J1ZSBBdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWNjcnVlQXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BY2NydWVBdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFjY3J1ZUF0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY2NydWVBdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0QWNjcnVlQXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWNjcnVlQXQgPGVtPkFjY3J1ZSBBdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjcnVlIEF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY2NydWVBdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWNjcnVlQXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdG90YWwgd29yayBhc3NpZ25lZCB0byB0aGUgcmVzb3VyY2UgYWNyb3NzIGFsbCBhc3NpZ25lZCB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Xb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmsgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZ3VsYXIgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiBub24tb3ZlcnRpbWUgd29yayBhc3NpZ25lZCB0byB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVndWxhciBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWd1bGFyV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfUmVndWxhcldvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZWd1bGFyV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSZWd1bGFyV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZWd1bGFyV29yayA8ZW0+UmVndWxhciBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWd1bGFyIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlZ3VsYXJXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWd1bGFyV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiBvdmVydGltZSB3b3JrIGFzc2lnbmVkIHRvIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZVdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX092ZXJ0aW1lV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J092ZXJ0aW1lV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE92ZXJ0aW1lV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2YgYWN0dWFsIHdvcmsgcGVyZm9ybWVkIGJ5IHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQWN0dWFsV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbFdvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxXb3JrIDxlbT5BY3R1YWwgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbFdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIHJlbWFpbmluZyB3b3JrIHJlcXVpcmVkIHRvIGNvbXBsZXRlIGFsbCBhc3NpZ25lZCB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfUmVtYWluaW5nV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ1dvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVtYWluaW5nV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ1dvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlbWFpbmluZ1dvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIGFjdHVhbCBvdmVydGltZSB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbE92ZXJ0aW1lV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIHJlbWFpbmluZyBvdmVydGltZSB3b3JrIHJlcXVpcmVkIHRvIGNvbXBsZXRlIGFsbCB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9SZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdPdmVydGltZVdvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGVyY2VudGFnZSBvZiB3b3JrIGNvbXBsZXRlZCBhY3Jvc3MgYWxsIHRhc2tzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGVyY2VudFdvcmtDb21wbGV0ZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1BlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1BlcmNlbnRXb3JrQ29tcGxldGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFBlcmNlbnRXb3JrQ29tcGxldGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBlcmNlbnRXb3JrQ29tcGxldGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFuZGFyZCBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc3RhbmRhcmQgcmF0ZSBvZiB0aGUgcmVzb3VyY2UuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBhcyBvZiB0aGUgY3VycmVudCBkYXRlIGlmIGEgcmF0ZSB0YWJsZSBleGlzdHMgZm9yIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFuZGFyZCBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFuZGFyZFJhdGUoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9TdGFuZGFyZFJhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YW5kYXJkUmF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0U3RhbmRhcmRSYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YW5kYXJkUmF0ZSA8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhbmRhcmRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFuZGFyZFJhdGUoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXRzIHVzZWQgYnkgTWljcm9zb2Z0IFByb2plY3QgdG8gZGlzcGxheSB0aGUgc3RhbmRhcmQgcmF0ZS4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vLCA3PXksIDg9bWF0ZXJpYWwgcmVzb3VyY2UgcmF0ZSAob3IgYmxhbmsgc3ltYm9sIHNwZWNpZmllZCkKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhbmRhcmRSYXRlRm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfU3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuU3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YW5kYXJkUmF0ZUZvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YW5kYXJkUmF0ZUZvcm1hdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0b3RhbCBwcm9qZWN0IGNvc3QgZm9yIHRoZSByZXNvdXJjZSBhY3Jvc3MgYWxsIGFzc2lnbmVkIHRhc2tzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Db3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVydGltZSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgb3ZlcnRpbWUgcmF0ZSBvZiB0aGUgcmVzb3VyY2UuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBhcyBvZiB0aGUgY3VycmVudCBkYXRlIGlmIGEgcmF0ZSB0YWJsZSBleGlzdHMgZm9yIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZVJhdGUoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9PdmVydGltZVJhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J092ZXJ0aW1lUmF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0T3ZlcnRpbWVSYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lUmF0ZSA8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZVJhdGUoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVydGltZSBSYXRlIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXRzIHVzZWQgYnkgTWljcm9zb2Z0IFByb2plY3QgdG8gZGlzcGxheSB0aGUgb3ZlcnRpbWUgcmF0ZS4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vLCA3PXkKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3ZlcnRpbWVSYXRlRm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfT3ZlcnRpbWVSYXRlRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J092ZXJ0aW1lUmF0ZUZvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPdmVydGltZVJhdGVGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE92ZXJ0aW1lUmF0ZUZvcm1hdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0b3RhbCBvdmVydGltZSBjb3N0IGZvciB0aGUgcmVzb3VyY2UgaW5jbHVkaW5nIGFjdHVhbCBhbmQgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3RzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX092ZXJ0aW1lQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcnRpbWVDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvc3QgUGVyIFVzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvc3QgcGVyIHVzZSBvZiB0aGUgcmVzb3VyY2UuIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMgZm9yIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0IFBlciBVc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvc3RQZXJVc2UoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Db3N0UGVyVXNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3N0UGVyVXNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRDb3N0UGVyVXNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvc3RQZXJVc2UgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBQZXIgVXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3N0UGVyVXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0UGVyVXNlKEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgY29zdCBpbmN1cnJlZCBieSB0aGUgcmVzb3VyY2UgYWNyb3NzIGFsbCBhc3NpZ25lZCB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0FjdHVhbENvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbENvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldEFjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgb3ZlcnRpbWUgY29zdCBpbmN1cnJlZCBieSB0aGUgcmVzb3VyY2UgYWNyb3NzIGFsbCBhc3NpZ25lZCB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxPdmVydGltZUNvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldEFjdHVhbE92ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxPdmVydGltZUNvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1haW5pbmcgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgY29zdCBvZiB0aGUgcmVzb3VyY2UgdG8gY29tcGxldGUgYWxsIGFzc2lnbmVkIHRhc2tzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZW1haW5pbmdDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfUmVtYWluaW5nQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdDb3N0IDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlbWFpbmluZ0Nvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgb3ZlcnRpbWUgY29zdCBvZiB0aGUgcmVzb3VyY2UgdG8gY29tcGxldGUgYWxsIGFzc2lnbmVkIHRhc2tzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZW1haW5pbmdPdmVydGltZUNvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9SZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ092ZXJ0aW1lQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGJhc2VsaW5lIHdvcmsgYW5kIHRoZSB3b3JrIGFzIG1pbnV0ZXMgeCAxMDAwLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICN1bnNldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0V29ya1ZhcmlhbmNlKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1dvcmtWYXJpYW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmtWYXJpYW5jZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldFdvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICN1bnNldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrVmFyaWFuY2UoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0V29ya1ZhcmlhbmNlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0V29ya1ZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0V29ya1ZhcmlhbmNlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0V29ya1ZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0IFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBiYXNlbGluZSBjb3N0IGFuZCB0aGUgY29zdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0IFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldENvc3RWYXJpYW5jZShmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Db3N0VmFyaWFuY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3N0VmFyaWFuY2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRDb3N0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0IFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldENvc3RWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29zdFZhcmlhbmNlKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0VmFyaWFuY2UgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldENvc3RWYXJpYW5jZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldENvc3RWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvc3RWYXJpYW5jZSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldENvc3RWYXJpYW5jZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldENvc3RWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U1Y8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEVhcm5lZCB2YWx1ZSBzY2hlZHVsZSB2YXJpYW5jZSwgdGhyb3VnaCB0aGUgcHJvamVjdCBzdGF0dXMgZGF0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TVjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTVigpCi0JICogQHNlZSAjdW5zZXRTVigpCi0JICogQHNlZSAjc2V0U1YoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfU1YoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTVicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldFNWKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFNWIDxlbT5TVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U1Y8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U1YoKQotCSAqIEBzZWUgI3Vuc2V0U1YoKQotCSAqIEBzZWUgI2dldFNWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTVihmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U1YgPGVtPlNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFNWKCkKLQkgKiBAc2VlICNnZXRTVigpCi0JICogQHNlZSAjc2V0U1YoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRTVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFNWIDxlbT5TVjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U1Y8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFNWKCkKLQkgKiBAc2VlICNnZXRTVigpCi0JICogQHNlZSAjc2V0U1YoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRTVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q1Y8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEVhcm5lZCB2YWx1ZSBjb3N0IHZhcmlhbmNlLCB0aHJvdWdoIHRoZSBwcm9qZWN0IHN0YXR1cyBkYXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNWPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENWKCkKLQkgKiBAc2VlICN1bnNldENWKCkKLQkgKiBAc2VlICNzZXRDVihmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9DVigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NWJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0Q1YoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q1YgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DVjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDVigpCi0JICogQHNlZSAjdW5zZXRDVigpCi0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENWKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDViA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Q1YoKQotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAc2VlICNzZXRDVihmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldENWKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q1YgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DVjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0Q1YoKQotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAc2VlICNzZXRDVihmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldENWKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIGNvc3Qgb2YgdGhlIHdvcmsgcGVyZm9ybWVkIGJ5IHRoZSByZXNvdXJjZSBmb3IgdGhlIHByb2plY3QgdG8tZGF0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QUNXUCgpCi0JICogQHNlZSAjc2V0QUNXUChmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BQ1dQKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQUNXUCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEFDV1AoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QUNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBQ1dQKCkKLQkgKiBAc2VlICN1bnNldEFDV1AoKQotCSAqIEBzZWUgI2dldEFDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFDV1AoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFDV1AgPGVtPkFDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QUNXUCgpCi0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQHNlZSAjc2V0QUNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEFDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BQ1dQPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAc2VlICNzZXRBQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QUNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FsZW5kYXIgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVzb3VyY2UgY2FsZW5kYXIuUmVmZXJzIHRvIGEgdmFsaWQgVUlEIGluIHRoZSBDYWxlbmRhcnMgZWxlbWVudCBvZiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBYTUwgU2NoZW1hLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhbGVuZGFyIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FsZW5kYXJVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9DYWxlbmRhclVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ2FsZW5kYXJVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldENhbGVuZGFyVUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENhbGVuZGFyVUlEIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhbGVuZGFyIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhbGVuZGFyVUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Tm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRleHQgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob3RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm90ZXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX05vdGVzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J05vdGVzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5vdGVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm90ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROb3RlcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJ1ZGdldCBjb3N0IG9mIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQkNXUygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCQ1dTKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXRlZCBjb3N0IG9mIG9mIHRoZSB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwcm9qZWN0IHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQkNXUCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1AnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCQ1dQKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIEdlbmVyaWM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBnZW5lcmljLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEdlbmVyaWM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNHZW5lcmljKCkKLQkgKiBAc2VlICN1bnNldElzR2VuZXJpYygpCi0JICogQHNlZSAjc2V0SXNHZW5lcmljKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfSXNHZW5lcmljKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJc0dlbmVyaWMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNHZW5lcmljKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNHZW5lcmljIDxlbT5JcyBHZW5lcmljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBHZW5lcmljPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzR2VuZXJpYygpCi0JICogQHNlZSAjdW5zZXRJc0dlbmVyaWMoKQotCSAqIEBzZWUgI2lzSXNHZW5lcmljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0dlbmVyaWMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0dlbmVyaWMgPGVtPklzIEdlbmVyaWM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNHZW5lcmljKCkKLQkgKiBAc2VlICNpc0lzR2VuZXJpYygpCi0JICogQHNlZSAjc2V0SXNHZW5lcmljKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc0dlbmVyaWMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzR2VuZXJpYyA8ZW0+SXMgR2VuZXJpYzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgR2VuZXJpYzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNHZW5lcmljKCkKLQkgKiBAc2VlICNpc0lzR2VuZXJpYygpCi0JICogQHNlZSAjc2V0SXNHZW5lcmljKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc0dlbmVyaWMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIEluYWN0aXZlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgc2V0IHRvIGluYWN0aXZlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEluYWN0aXZlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzSW5hY3RpdmUoKQotCSAqIEBzZWUgI3Vuc2V0SXNJbmFjdGl2ZSgpCi0JICogQHNlZSAjc2V0SXNJbmFjdGl2ZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0lzSW5hY3RpdmUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0lzSW5hY3RpdmUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNJbmFjdGl2ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzSW5hY3RpdmUgPGVtPklzIEluYWN0aXZlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBJbmFjdGl2ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0luYWN0aXZlKCkKLQkgKiBAc2VlICN1bnNldElzSW5hY3RpdmUoKQotCSAqIEBzZWUgI2lzSXNJbmFjdGl2ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNJbmFjdGl2ZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzSW5hY3RpdmUgPGVtPklzIEluYWN0aXZlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzSW5hY3RpdmUoKQotCSAqIEBzZWUgI2lzSXNJbmFjdGl2ZSgpCi0JICogQHNlZSAjc2V0SXNJbmFjdGl2ZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNJbmFjdGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNJbmFjdGl2ZSA8ZW0+SXMgSW5hY3RpdmU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEluYWN0aXZlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc0luYWN0aXZlKCkKLQkgKiBAc2VlICNpc0lzSW5hY3RpdmUoKQotCSAqIEBzZWUgI3NldElzSW5hY3RpdmUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzSW5hY3RpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIEVudGVycHJpc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBhbiBFbnRlcnByaXNlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEVudGVycHJpc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNFbnRlcnByaXNlKCkKLQkgKiBAc2VlICN1bnNldElzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjc2V0SXNFbnRlcnByaXNlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfSXNFbnRlcnByaXNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJc0VudGVycHJpc2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNFbnRlcnByaXNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNFbnRlcnByaXNlIDxlbT5JcyBFbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBFbnRlcnByaXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjdW5zZXRJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI2lzSXNFbnRlcnByaXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0VudGVycHJpc2UoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0VudGVycHJpc2UgPGVtPklzIEVudGVycHJpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNFbnRlcnByaXNlKCkKLQkgKiBAc2VlICNpc0lzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjc2V0SXNFbnRlcnByaXNlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc0VudGVycHJpc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzRW50ZXJwcmlzZSA8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNFbnRlcnByaXNlKCkKLQkgKiBAc2VlICNpc0lzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjc2V0SXNFbnRlcnByaXNlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc0VudGVycHJpc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJvb2tpbmcgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHRoZSBib29raW5nIHR5cGUgb2YgdGhlIHJlc291cmNlLiAxPUNvbW1pdGVkLCAyPVByb3Bvc2VkCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Qm9va2luZyBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRCb29raW5nVHlwZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0Jvb2tpbmdUeXBlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQm9va2luZ1R5cGVUeXBlMSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQm9va2luZ1R5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEJvb2tpbmdUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJvb2tpbmdUeXBlIDxlbT5Cb29raW5nIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJvb2tpbmcgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Qm9va2luZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJvb2tpbmdUeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIHRocm91Z2ggd2hpY2ggYWN0dWFsIHdvcmsgaXMgcHJvdGVjdGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsV29ya1Byb3RlY3RlZChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbFdvcmtQcm90ZWN0ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsV29ya1Byb3RlY3RlZChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIHRocm91Z2ggd2hpY2ggYWN0dWFsIG92ZXJ0aW1lIHdvcmsgaXMgcHJvdGVjdGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBBY3RpdmUgRGlyZWN0b3J5IEdVSUQgZm9yIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdGl2ZURpcmVjdG9yeUdVSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0FjdGl2ZURpcmVjdG9yeUdVSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0aXZlRGlyZWN0b3J5R1VJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBY3RpdmVEaXJlY3RvcnlHVUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdGl2ZURpcmVjdG9yeUdVSUQgPGVtPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZlIERpcmVjdG9yeSBHVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3RpdmVEaXJlY3RvcnlHVUlEKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DcmVhdGlvbiBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSB3YXMgY3JlYXRlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDcmVhdGlvbkRhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0NyZWF0aW9uRGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NyZWF0aW9uRGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRDcmVhdGlvbkRhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyZWF0aW9uRGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhbHVlIG9mIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgYmFjayB0byB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgRmllbGQgSUQsIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfRXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXh0ZW5kZWRBdHRyaWJ1dGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZWxpbmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYmFzZWxpbmUgdmFsdWVzIGZvciB0aGUgcmVzb3VyY2VzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2VsaW5lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0Jhc2VsaW5lKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Jhc2VsaW5lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QmFzZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dGxpbmUgQ29kZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZSBvZiBhbiBvdXRsaW5lIGNvZGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtIGEgcG9pbnRlciBiYWNrIHRvIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG91dGxpbmUgY29kZSB0YWJsZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSB1bmlxdWUgSUQgb3IgdGhlIEZpZWxkIElELCBhbmQgdGhlIHZhbHVlIHdoaWNoIGlzIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3V0bGluZSBDb2RlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX091dGxpbmVDb2RlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J091dGxpbmVDb2RlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0T3V0bGluZUNvZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIGNvbGxlY3Rpb24gb2YgcGVyaW9kcyBkdXJpbmcgd2hpY2ggdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QXZhaWxhYmlsaXR5UGVyaW9kcyhBdmFpbGFiaWxpdHlQZXJpb2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0F2YWlsYWJpbGl0eVBlcmlvZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdmFpbGFiaWxpdHlQZXJpb2RzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXZhaWxhYmlsaXR5UGVyaW9kcyBnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXZhaWxhYmlsaXR5UGVyaW9kcyhBdmFpbGFiaWxpdHlQZXJpb2RzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJhdGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIGNvbGxlY3Rpb24gb2YgcGVyaW9kcyBhbmQgdGhlIHJhdGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIG9uZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SYXRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmF0ZXMoUmF0ZXMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfUmF0ZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSYXRlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJhdGVzIGdldFJhdGVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJhdGVzIDxlbT5SYXRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmF0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJhdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSYXRlcyhSYXRlcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdGltZSBwaGFzZWQgZGF0YQotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9UaW1lcGhhc2VkRGF0YSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUaW1lcGhhc2VkRGF0YScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCk7Ci0KLX0gLy8gUmVzb3VyY2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Jlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmJmNmYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJlc291cmNlcy5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXMjZ2V0UmVzb3VyY2UgPGVtPlJlc291cmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdSZXNvdXJjZXNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIHJlc291cmNlIGluIGVhY2ggUmVzb3VyY2VzIGNvbGxlY3Rpb24uCi0JICogICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VzX1Jlc291cmNlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVzb3VyY2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRSZXNvdXJjZSgpOwotCi19IC8vIFJlc291cmNlcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UYXNrLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Rhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBiNDEyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Rhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNzEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRJRCA8ZW0+SUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNOdWxsIDxlbT5JcyBOdWxsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q3JlYXRlRGF0ZSA8ZW0+Q3JlYXRlIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb250YWN0IDxlbT5Db250YWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V0JTIDxlbT5XQlM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXQlNMZXZlbCA8ZW0+V0JTIExldmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZU51bWJlciA8ZW0+T3V0bGluZSBOdW1iZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdXRsaW5lTGV2ZWwgPGVtPk91dGxpbmUgTGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmlvcml0eSA8ZW0+UHJpb3JpdHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldER1cmF0aW9uIDxlbT5EdXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RvcCA8ZW0+U3RvcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlc3VtZSA8ZW0+UmVzdW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSZXN1bWVWYWxpZCA8ZW0+UmVzdW1lIFZhbGlkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFZmZvcnREcml2ZW4gPGVtPkVmZm9ydCBEcml2ZW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JlY3VycmluZyA8ZW0+UmVjdXJyaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRXN0aW1hdGVkIDxlbT5Fc3RpbWF0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc01pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNTdW1tYXJ5IDxlbT5TdW1tYXJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNDcml0aWNhbCA8ZW0+Q3JpdGljYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdCA8ZW0+SXMgU3VicHJvamVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkgPGVtPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3VicHJvamVjdE5hbWUgPGVtPlN1YnByb2plY3QgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRXh0ZXJuYWxUYXNrIDxlbT5FeHRlcm5hbCBUYXNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCA8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybHlTdGFydCA8ZW0+RWFybHkgU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJseUZpbmlzaCA8ZW0+RWFybHkgRmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGF0ZVN0YXJ0IDxlbT5MYXRlIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGF0ZUZpbmlzaCA8ZW0+TGF0ZSBGaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdGFydFZhcmlhbmNlIDxlbT5TdGFydCBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpbmlzaFZhcmlhbmNlIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGcmVlU2xhY2sgPGVtPkZyZWUgU2xhY2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRUb3RhbFNsYWNrIDxlbT5Ub3RhbCBTbGFjazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpeGVkQ29zdCA8ZW0+Rml4ZWQgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpeGVkQ29zdEFjY3J1YWwgPGVtPkZpeGVkIENvc3QgQWNjcnVhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBlcmNlbnRDb21wbGV0ZSA8ZW0+UGVyY2VudCBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdmVydGltZVdvcmsgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxTdGFydCA8ZW0+QWN0dWFsIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsRmluaXNoIDxlbT5BY3R1YWwgRmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsRHVyYXRpb24gPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0IDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlZ3VsYXJXb3JrIDxlbT5SZWd1bGFyIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdEdXJhdGlvbiA8ZW0+UmVtYWluaW5nIER1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENWIDxlbT5DVjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnN0cmFpbnRUeXBlIDxlbT5Db25zdHJhaW50IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29uc3RyYWludERhdGUgPGVtPkNvbnN0cmFpbnQgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldERlYWRsaW5lIDxlbT5EZWFkbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxBc3NpZ25tZW50cyA8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsaW5nQ2FuU3BsaXQgPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExldmVsaW5nRGVsYXkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJlTGV2ZWxlZFN0YXJ0IDxlbT5QcmUgTGV2ZWxlZCBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZUxldmVsZWRGaW5pc2ggPGVtPlByZSBMZXZlbGVkIEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEh5cGVybGluayA8ZW0+SHlwZXJsaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SHlwZXJsaW5rQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIgPGVtPklnbm9yZSBSZXNvdXJjZSBDYWxlbmRhcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSGlkZUJhciA8ZW0+SGlkZSBCYXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JvbGx1cCA8ZW0+Um9sbHVwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1AgPGVtPkJDV1A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSA8ZW0+UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEVhcm5lZFZhbHVlTWV0aG9kIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJlZGVjZXNzb3JMaW5rIDxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QmFzZWxpbmUgPGVtPkJhc2VsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZUNvZGUgPGVtPk91dGxpbmUgQ29kZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUYXNrXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2sgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1VJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBvc2l0aW9uIGlkZW50aWZpZXIgb2YgdGhlIHRhc2sgd2l0aGluIHRoZSBsaXN0IG9mIHRhc2tzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0lEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldElEIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBuYW1lIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfTmFtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk5hbWVUeXBlMiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTmFtZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHR5cGUgb2YgdGFzay4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPUZpeGVkIFVuaXRzLCAxPUZpeGVkIER1cmF0aW9uLCAyPUZpeGVkIFdvcmsuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlR5cGVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIE51bGw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSB0YXNrIGlzIG51bGwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgTnVsbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc051bGwoKQotCSAqIEBzZWUgI3Vuc2V0SXNOdWxsKCkKLQkgKiBAc2VlICNzZXRJc051bGwoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0lzTnVsbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSXNOdWxsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzTnVsbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNOdWxsIDxlbT5JcyBOdWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBOdWxsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzTnVsbCgpCi0JICogQHNlZSAjdW5zZXRJc051bGwoKQotCSAqIEBzZWUgI2lzSXNOdWxsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc051bGwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc051bGwoKQotCSAqIEBzZWUgI2lzSXNOdWxsKCkKLQkgKiBAc2VlICNzZXRJc051bGwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzTnVsbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc051bGwgPGVtPklzIE51bGw8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIE51bGw8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzTnVsbCgpCi0JICogQHNlZSAjaXNJc051bGwoKQotCSAqIEBzZWUgI3NldElzTnVsbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNOdWxsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DcmVhdGUgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhhdCB0aGUgdGFzayB3YXMgY3JlYXRlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGUgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3JlYXRlRGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19DcmVhdGVEYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ3JlYXRlRGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRDcmVhdGVEYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q3JlYXRlRGF0ZSA8ZW0+Q3JlYXRlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0ZSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDcmVhdGVEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDcmVhdGVEYXRlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250YWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29udGFjdCBwZXJzb24gZm9yIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbnRhY3QoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQ29udGFjdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNvbnRhY3RUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb250YWN0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvbnRhY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb250YWN0IDxlbT5Db250YWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db250YWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb250YWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb250YWN0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XQlM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgY29kZSBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XQlM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdCUyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19XQlMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV0JTJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFdCUygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdCUyA8ZW0+V0JTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5XQlM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdCUygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V0JTKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XQlMgTGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByaWdodG1vc3QgV0JTIGxldmVsIG9mIHRoZSB0YXNrLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XQlMgTGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdCU0xldmVsKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1dCU0xldmVsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dCU0xldmVsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFdCU0xldmVsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V0JTTGV2ZWwgPGVtPldCUyBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V0JTIExldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXQlNMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V0JTTGV2ZWwoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dGxpbmUgTnVtYmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgb3V0bGluZSBudW1iZXIgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3V0bGluZSBOdW1iZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE91dGxpbmVOdW1iZXIoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfT3V0bGluZU51bWJlcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVOdW1iZXJUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdXRsaW5lTnVtYmVyJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE91dGxpbmVOdW1iZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdXRsaW5lTnVtYmVyIDxlbT5PdXRsaW5lIE51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3V0bGluZSBOdW1iZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE91dGxpbmVOdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE91dGxpbmVOdW1iZXIoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dGxpbmUgTGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBvdXRsaW5lIGxldmVsIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dGxpbmUgTGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE91dGxpbmVMZXZlbChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfT3V0bGluZUxldmVsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdXRsaW5lTGV2ZWwnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldE91dGxpbmVMZXZlbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE91dGxpbmVMZXZlbCA8ZW0+T3V0bGluZSBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3V0bGluZSBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3V0bGluZUxldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdXRsaW5lTGV2ZWwoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcmlvcml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHByaW9yaXR5IG9mIHRoZSB0YXNrIGZyb20gMCB0byAxMDAwLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByaW9yaXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmlvcml0eShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUHJpb3JpdHkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByaW9yaXR5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRQcmlvcml0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByaW9yaXR5IDxlbT5Qcmlvcml0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJpb3JpdHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByaW9yaXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmlvcml0eShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2NoZWR1bGVkIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1N0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhcnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0U3RhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19GaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaW5pc2gnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RmluaXNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5pc2goT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkR1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGxhbm5lZCBkdXJhdGlvbiBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RHVyYXRpb24oT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRHVyYXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEdXJhdGlvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXREdXJhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldER1cmF0aW9uIDxlbT5EdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldER1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREdXJhdGlvbihPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RHVyYXRpb24gRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBEdXJhdGlvbiBvZiB0aGUgVGFzay4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMD1lJSwgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRHVyYXRpb25Gb3JtYXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5EdXJhdGlvbkZvcm1hdFR5cGU0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEdXJhdGlvbkZvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2Ygc2NoZWR1bGVkIHdvcmsgZm9yIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0V29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdvcmsgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0b3A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIHRhc2sgd2FzIHN0b3BwZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RvcDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RvcChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19TdG9wKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RvcCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRTdG9wKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RvcCA8ZW0+U3RvcDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RvcDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RvcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RvcChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzdW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGF0IHRoZSB0YXNrIHJlc3VtZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXN1bWUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUmVzdW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVzdW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlc3VtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlc3VtZSA8ZW0+UmVzdW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN1bWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlc3VtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVzdW1lKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXN1bWUgVmFsaWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgY2FuIGJlIHJlc3VtZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdW1lIFZhbGlkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlc3VtZVZhbGlkKCkKLQkgKiBAc2VlICN1bnNldFJlc3VtZVZhbGlkKCkKLQkgKiBAc2VlICNzZXRSZXN1bWVWYWxpZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUmVzdW1lVmFsaWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc3VtZVZhbGlkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1Jlc3VtZVZhbGlkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSZXN1bWVWYWxpZCA8ZW0+UmVzdW1lIFZhbGlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN1bWUgVmFsaWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UmVzdW1lVmFsaWQoKQotCSAqIEBzZWUgI3Vuc2V0UmVzdW1lVmFsaWQoKQotCSAqIEBzZWUgI2lzUmVzdW1lVmFsaWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc3VtZVZhbGlkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSZXN1bWVWYWxpZCA8ZW0+UmVzdW1lIFZhbGlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJlc3VtZVZhbGlkKCkKLQkgKiBAc2VlICNpc1Jlc3VtZVZhbGlkKCkKLQkgKiBAc2VlICNzZXRSZXN1bWVWYWxpZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UmVzdW1lVmFsaWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVzdW1lVmFsaWQgPGVtPlJlc3VtZSBWYWxpZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdW1lIFZhbGlkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRSZXN1bWVWYWxpZCgpCi0JICogQHNlZSAjaXNSZXN1bWVWYWxpZCgpCi0JICogQHNlZSAjc2V0UmVzdW1lVmFsaWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFJlc3VtZVZhbGlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FZmZvcnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlzIGVmZm9ydC1kcml2ZW4uCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWZmb3J0IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI3Vuc2V0RWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNzZXRFZmZvcnREcml2ZW4oYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0VmZm9ydERyaXZlbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRWZmb3J0RHJpdmVuJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0VmZm9ydERyaXZlbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRWZmb3J0RHJpdmVuIDxlbT5FZmZvcnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FZmZvcnQgRHJpdmVuPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEVmZm9ydERyaXZlbigpCi0JICogQHNlZSAjdW5zZXRFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI2lzRWZmb3J0RHJpdmVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFZmZvcnREcml2ZW4oYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VmZm9ydERyaXZlbiA8ZW0+RWZmb3J0IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI2lzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNzZXRFZmZvcnREcml2ZW4oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEVmZm9ydERyaXZlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFZmZvcnREcml2ZW4gPGVtPkVmZm9ydCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVmZm9ydCBEcml2ZW48L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEVmZm9ydERyaXZlbigpCi0JICogQHNlZSAjaXNFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI3NldEVmZm9ydERyaXZlbihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RWZmb3J0RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWN1cnJpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgaXMgYSByZWN1cnJpbmcgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWN1cnJpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UmVjdXJyaW5nKCkKLQkgKiBAc2VlICN1bnNldFJlY3VycmluZygpCi0JICogQHNlZSAjc2V0UmVjdXJyaW5nKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19SZWN1cnJpbmcoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlY3VycmluZycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNSZWN1cnJpbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JlY3VycmluZyA8ZW0+UmVjdXJyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWN1cnJpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UmVjdXJyaW5nKCkKLQkgKiBAc2VlICN1bnNldFJlY3VycmluZygpCi0JICogQHNlZSAjaXNSZWN1cnJpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlY3VycmluZyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVjdXJyaW5nIDxlbT5SZWN1cnJpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0UmVjdXJyaW5nKCkKLQkgKiBAc2VlICNpc1JlY3VycmluZygpCi0JICogQHNlZSAjc2V0UmVjdXJyaW5nKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRSZWN1cnJpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVjdXJyaW5nIDxlbT5SZWN1cnJpbmc8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlY3VycmluZzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UmVjdXJyaW5nKCkKLQkgKiBAc2VlICNpc1JlY3VycmluZygpCi0JICogQHNlZSAjc2V0UmVjdXJyaW5nKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSZWN1cnJpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk92ZXIgQWxsb2NhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlzIG92ZXJhbGxvY2F0ZWQuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGluZm9ybWF0aW9uYWwgb25seS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICN1bnNldE92ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3NldE92ZXJBbGxvY2F0ZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX092ZXJBbGxvY2F0ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J092ZXJBbGxvY2F0ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzT3ZlckFsbG9jYXRlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzT3ZlckFsbG9jYXRlZCA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE92ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVyQWxsb2NhdGVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3NldE92ZXJBbGxvY2F0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE92ZXJBbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzT3ZlckFsbG9jYXRlZCA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3NldE92ZXJBbGxvY2F0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE92ZXJBbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgdGFzayBpcyBlc3RpbWF0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEVzdGltYXRlZCgpCi0JICogQHNlZSAjdW5zZXRFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI3NldEVzdGltYXRlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRXN0aW1hdGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFc3RpbWF0ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRXN0aW1hdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFc3RpbWF0ZWQgPGVtPkVzdGltYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEVzdGltYXRlZCgpCi0JICogQHNlZSAjdW5zZXRFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI2lzRXN0aW1hdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFc3RpbWF0ZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VzdGltYXRlZCA8ZW0+RXN0aW1hdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEVzdGltYXRlZCgpCi0JICogQHNlZSAjaXNFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI3NldEVzdGltYXRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RXN0aW1hdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VzdGltYXRlZCA8ZW0+RXN0aW1hdGVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0ZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEVzdGltYXRlZCgpCi0JICogQHNlZSAjaXNFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI3NldEVzdGltYXRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RXN0aW1hdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaWxlc3RvbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgaXMgYSBtaWxlc3RvbmUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWlsZXN0b25lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1pbGVzdG9uZSgpCi0JICogQHNlZSAjdW5zZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI3NldE1pbGVzdG9uZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfTWlsZXN0b25lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNaWxlc3RvbmUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTWlsZXN0b25lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWlsZXN0b25lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1pbGVzdG9uZSgpCi0JICogQHNlZSAjdW5zZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNaWxlc3RvbmUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc01pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1pbGVzdG9uZSgpCi0JICogQHNlZSAjaXNNaWxlc3RvbmUoKQotCSAqIEBzZWUgI3NldE1pbGVzdG9uZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TWlsZXN0b25lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc01pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaWxlc3RvbmU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE1pbGVzdG9uZSgpCi0JICogQHNlZSAjaXNNaWxlc3RvbmUoKQotCSAqIEBzZWUgI3NldE1pbGVzdG9uZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TWlsZXN0b25lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdW1tYXJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlzIGEgc3VtbWFyeSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1bW1hcnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U3VtbWFyeSgpCi0JICogQHNlZSAjdW5zZXRTdW1tYXJ5KCkKLQkgKiBAc2VlICNzZXRTdW1tYXJ5KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19TdW1tYXJ5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdW1tYXJ5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1N1bW1hcnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1N1bW1hcnkgPGVtPlN1bW1hcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1bW1hcnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U3VtbWFyeSgpCi0JICogQHNlZSAjdW5zZXRTdW1tYXJ5KCkKLQkgKiBAc2VlICNpc1N1bW1hcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1bW1hcnkoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1N1bW1hcnkgPGVtPlN1bW1hcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0U3VtbWFyeSgpCi0JICogQHNlZSAjaXNTdW1tYXJ5KCkKLQkgKiBAc2VlICNzZXRTdW1tYXJ5KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRTdW1tYXJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1N1bW1hcnkgPGVtPlN1bW1hcnk8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1bW1hcnk8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFN1bW1hcnkoKQotCSAqIEBzZWUgI2lzU3VtbWFyeSgpCi0JICogQHNlZSAjc2V0U3VtbWFyeShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0U3VtbWFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JpdGljYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgaXMgaW4gdGhlIGNyaXRpY2FsIGNoYWluLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyaXRpY2FsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENyaXRpY2FsKCkKLQkgKiBAc2VlICN1bnNldENyaXRpY2FsKCkKLQkgKiBAc2VlICNzZXRDcml0aWNhbChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQ3JpdGljYWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NyaXRpY2FsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0NyaXRpY2FsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNDcml0aWNhbCA8ZW0+Q3JpdGljYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNyaXRpY2FsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENyaXRpY2FsKCkKLQkgKiBAc2VlICN1bnNldENyaXRpY2FsKCkKLQkgKiBAc2VlICNpc0NyaXRpY2FsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDcml0aWNhbChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzQ3JpdGljYWwgPGVtPkNyaXRpY2FsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENyaXRpY2FsKCkKLQkgKiBAc2VlICNpc0NyaXRpY2FsKCkKLQkgKiBAc2VlICNzZXRDcml0aWNhbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q3JpdGljYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzQ3JpdGljYWwgPGVtPkNyaXRpY2FsPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Dcml0aWNhbDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0Q3JpdGljYWwoKQotCSAqIEBzZWUgI2lzQ3JpdGljYWwoKQotCSAqIEBzZWUgI3NldENyaXRpY2FsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDcml0aWNhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgU3VicHJvamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgdGFzayBpcyBhbiBpbnNlcnRlZCBwcm9qZWN0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFN1YnByb2plY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNTdWJwcm9qZWN0KCkKLQkgKiBAc2VlICN1bnNldElzU3VicHJvamVjdCgpCi0JICogQHNlZSAjc2V0SXNTdWJwcm9qZWN0KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Jc1N1YnByb2plY3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0lzU3VicHJvamVjdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc1N1YnByb2plY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdCA8ZW0+SXMgU3VicHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3VicHJvamVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc1N1YnByb2plY3QoKQotCSAqIEBzZWUgI3Vuc2V0SXNTdWJwcm9qZWN0KCkKLQkgKiBAc2VlICNpc0lzU3VicHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNTdWJwcm9qZWN0KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3QgPGVtPklzIFN1YnByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNTdWJwcm9qZWN0KCkKLQkgKiBAc2VlICNpc0lzU3VicHJvamVjdCgpCi0JICogQHNlZSAjc2V0SXNTdWJwcm9qZWN0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc1N1YnByb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNTdWJwcm9qZWN0IDxlbT5JcyBTdWJwcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTdWJwcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc1N1YnByb2plY3QoKQotCSAqIEBzZWUgI2lzSXNTdWJwcm9qZWN0KCkKLQkgKiBAc2VlICNzZXRJc1N1YnByb2plY3QoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzU3VicHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIGluc2VydGVkIHByb2plY3QgaXMgcmVhZC1vbmx5LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAc2VlICN1bnNldElzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAc2VlICNzZXRJc1N1YnByb2plY3RSZWFkT25seShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfSXNTdWJwcm9qZWN0UmVhZE9ubHkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0lzU3VicHJvamVjdFJlYWRPbmx5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzU3VicHJvamVjdFJlYWRPbmx5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3RSZWFkT25seSA8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAc2VlICN1bnNldElzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAc2VlICNpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1N1YnByb2plY3RSZWFkT25seShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkgPGVtPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAc2VlICNpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAc2VlICNzZXRJc1N1YnByb2plY3RSZWFkT25seShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkgPGVtPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoKQotCSAqIEBzZWUgI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkoKQotCSAqIEBzZWUgI3NldElzU3VicHJvamVjdFJlYWRPbmx5KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc1N1YnByb2plY3RSZWFkT25seSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VicHJvamVjdCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBpbnNlcnRlZCBwcm9qZWN0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YnByb2plY3QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3VicHJvamVjdE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfU3VicHJvamVjdE5hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5TdWJwcm9qZWN0TmFtZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1YnByb2plY3ROYW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFN1YnByb2plY3ROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3VicHJvamVjdE5hbWUgPGVtPlN1YnByb2plY3QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3VicHJvamVjdCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdWJwcm9qZWN0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3VicHJvamVjdE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVybmFsIFRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgaXMgZXh0ZXJuYWwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgVGFzazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFeHRlcm5hbFRhc2soKQotCSAqIEBzZWUgI3Vuc2V0RXh0ZXJuYWxUYXNrKCkKLQkgKiBAc2VlICNzZXRFeHRlcm5hbFRhc2soYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0V4dGVybmFsVGFzaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXh0ZXJuYWxUYXNrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0V4dGVybmFsVGFzaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRXh0ZXJuYWxUYXNrIDxlbT5FeHRlcm5hbCBUYXNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBUYXNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEV4dGVybmFsVGFzaygpCi0JICogQHNlZSAjdW5zZXRFeHRlcm5hbFRhc2soKQotCSAqIEBzZWUgI2lzRXh0ZXJuYWxUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeHRlcm5hbFRhc2soYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0V4dGVybmFsVGFzayA8ZW0+RXh0ZXJuYWwgVGFzazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRFeHRlcm5hbFRhc2soKQotCSAqIEBzZWUgI2lzRXh0ZXJuYWxUYXNrKCkKLQkgKiBAc2VlICNzZXRFeHRlcm5hbFRhc2soYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEV4dGVybmFsVGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFeHRlcm5hbFRhc2sgPGVtPkV4dGVybmFsIFRhc2s8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIFRhc2s8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEV4dGVybmFsVGFzaygpCi0JICogQHNlZSAjaXNFeHRlcm5hbFRhc2soKQotCSAqIEBzZWUgI3NldEV4dGVybmFsVGFzayhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RXh0ZXJuYWxUYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzb3VyY2UgbG9jYXRpb24gYW5kIHRhc2sgaWRlbnRpZmllciBvZiB0aGUgZXh0ZXJuYWwgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEV4dGVybmFsVGFza1Byb2plY3QoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRXh0ZXJuYWxUYXNrUHJvamVjdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVybmFsVGFza1Byb2plY3RUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeHRlcm5hbFRhc2tQcm9qZWN0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEV4dGVybmFsVGFza1Byb2plY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFeHRlcm5hbFRhc2tQcm9qZWN0IDxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIFRhc2sgUHJvamVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXh0ZXJuYWxUYXNrUHJvamVjdChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWFybHkgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBlYXJseSBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVhcmx5IFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFYXJseVN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0Vhcmx5U3RhcnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFYXJseVN0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEVhcmx5U3RhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJseVN0YXJ0IDxlbT5FYXJseSBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWFybHkgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVhcmx5U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVhcmx5U3RhcnQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVhcmx5IEZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGVhcmx5IGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVhcmx5IEZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RWFybHlGaW5pc2goT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRWFybHlGaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFYXJseUZpbmlzaCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRFYXJseUZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEVhcmx5RmluaXNoIDxlbT5FYXJseSBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVhcmx5IEZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RWFybHlGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVhcmx5RmluaXNoKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MYXRlIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGF0ZSBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxhdGUgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExhdGVTdGFydChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19MYXRlU3RhcnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMYXRlU3RhcnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0TGF0ZVN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGF0ZVN0YXJ0IDxlbT5MYXRlIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYXRlIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMYXRlU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExhdGVTdGFydChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGF0ZSBGaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBsYXRlIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxhdGUgRmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYXRlRmluaXNoKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0xhdGVGaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMYXRlRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldExhdGVGaW5pc2goKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMYXRlRmluaXNoIDxlbT5MYXRlIEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGF0ZSBGaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhdGVGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExhdGVGaW5pc2goT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YXJ0IFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFyaWFuY2Ugb2YgdGhlIHRhc2sgc3RhcnQgZGF0ZSBmcm9tIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJhc2VsaW5lIHN0YXJ0IGRhdGUgYXMgbWludXRlcyB4IDEwMDAuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0VmFyaWFuY2UoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1N0YXJ0VmFyaWFuY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YXJ0VmFyaWFuY2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFN0YXJ0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdGFydFZhcmlhbmNlIDxlbT5TdGFydCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YXJ0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXJ0VmFyaWFuY2UoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2ggVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YXJpYW5jZSBvZiB0aGUgdGFzayBmaW5pc2ggZGF0ZSBmcm9tIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJhc2VsaW5lIGZpbmlzaCBkYXRlIGFzIG1pbnV0ZXMgeCAxMDAwLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmluaXNoVmFyaWFuY2UoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0ZpbmlzaFZhcmlhbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaW5pc2hWYXJpYW5jZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RmluaXNoVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaW5pc2hWYXJpYW5jZSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpbmlzaFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5pc2hWYXJpYW5jZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YXJpYW5jZSBvZiB0YXNrIHdvcmsgZnJvbSB0aGUgYmFzZWxpbmUgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrIHdvcmsgYXMgbWludXRlcyB4IDEwMDAuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3Vuc2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRXb3JrVmFyaWFuY2UoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Xb3JrVmFyaWFuY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrVmFyaWFuY2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRXb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICN1bnNldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrVmFyaWFuY2UoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRXb3JrVmFyaWFuY2UoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRXb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFdvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RnJlZSBTbGFjazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiBmcmVlIHNsYWNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZyZWUgU2xhY2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZyZWVTbGFjayhCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRnJlZVNsYWNrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGcmVlU2xhY2snIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEZyZWVTbGFjaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZyZWVTbGFjayA8ZW0+RnJlZSBTbGFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RnJlZSBTbGFjazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RnJlZVNsYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGcmVlU2xhY2soQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub3RhbCBTbGFjazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiB0b3RhbCBzbGFjay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub3RhbCBTbGFjazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VG90YWxTbGFjayhCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfVG90YWxTbGFjaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVG90YWxTbGFjaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VG90YWxTbGFjaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFRvdGFsU2xhY2sgPGVtPlRvdGFsIFNsYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ub3RhbCBTbGFjazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VG90YWxTbGFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VG90YWxTbGFjayhCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpeGVkIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmaXhlZCBjb3N0IG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpeGVkIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Rml4ZWRDb3N0KCkKLQkgKiBAc2VlICN1bnNldEZpeGVkQ29zdCgpCi0JICogQHNlZSAjc2V0Rml4ZWRDb3N0KGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRml4ZWRDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRml4ZWRDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0Rml4ZWRDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Rml4ZWRDb3N0IDxlbT5GaXhlZCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaXhlZCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEZpeGVkQ29zdCgpCi0JICogQHNlZSAjdW5zZXRGaXhlZENvc3QoKQotCSAqIEBzZWUgI2dldEZpeGVkQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Rml4ZWRDb3N0KGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpeGVkQ29zdCA8ZW0+Rml4ZWQgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRGaXhlZENvc3QoKQotCSAqIEBzZWUgI2dldEZpeGVkQ29zdCgpCi0JICogQHNlZSAjc2V0Rml4ZWRDb3N0KGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Rml4ZWRDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3QgPGVtPkZpeGVkIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpeGVkIENvc3Q8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEZpeGVkQ29zdCgpCi0JICogQHNlZSAjZ2V0Rml4ZWRDb3N0KCkKLQkgKiBAc2VlICNzZXRGaXhlZENvc3QoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRGaXhlZENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpeGVkIENvc3QgQWNjcnVhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSG93IHRoZSBmaXhlZCBjb3N0IGlzIGFjY3J1ZWQgYWdhaW5zdCB0aGUgdGFzay4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAxPVN0YXJ0LCAyPVByb3JhdGVkIGFuZCAzPUVuZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpeGVkQ29zdEFjY3J1YWwoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkZpeGVkQ29zdEFjY3J1YWxUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaXhlZENvc3RBY2NydWFsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpeGVkQ29zdEFjY3J1YWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3RBY2NydWFsIDxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpeGVkIENvc3QgQWNjcnVhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Rml4ZWRDb3N0QWNjcnVhbChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyY2VudCBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhc2sgZHVyYXRpb24gY29tcGxldGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcmNlbnQgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBlcmNlbnRDb21wbGV0ZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQZXJjZW50Q29tcGxldGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFBlcmNlbnRDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBlcmNlbnRDb21wbGV0ZSA8ZW0+UGVyY2VudCBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGVyY2VudCBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGVyY2VudENvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZXJjZW50Q29tcGxldGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwZXJjZW50YWdlIG9mIHRoZSB0YXNrIHdvcmsgY29tcGxldGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGVyY2VudFdvcmtDb21wbGV0ZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUGVyY2VudFdvcmtDb21wbGV0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGVyY2VudFdvcmtDb21wbGV0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZXJjZW50V29ya0NvbXBsZXRlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHByb2plY3RlZCBvciBzY2hlZHVsZWQgY29zdCBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Db3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzdW0gb2YgdGhlIGFjdHVhbCBhbmQgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3Qgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19PdmVydGltZUNvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J092ZXJ0aW1lQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0T3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2Ygb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE92ZXJ0aW1lV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19PdmVydGltZVdvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVydGltZVdvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0T3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE92ZXJ0aW1lV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxTdGFydChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BY3R1YWxTdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbFN0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsU3RhcnQgPGVtPkFjdHVhbCBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsU3RhcnQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBGaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsRmluaXNoKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0FjdHVhbEZpbmlzaCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbEZpbmlzaCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxGaW5pc2goKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxGaW5pc2ggPGVtPkFjdHVhbCBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBGaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsRmluaXNoKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgRHVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgZHVyYXRpb24gb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIER1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxEdXJhdGlvbihPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BY3R1YWxEdXJhdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbER1cmF0aW9uJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbER1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsRHVyYXRpb24gPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIER1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxEdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsRHVyYXRpb24oT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIGNvc3Qgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbENvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0FjdHVhbENvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbENvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldEFjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbENvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBvdmVydGltZSBjb3N0IG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxPdmVydGltZUNvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0FjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRBY3R1YWxPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxPdmVydGltZUNvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCB3b3JrIGZvciB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BY3R1YWxXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBvdmVydGltZSB3b3JrIGZvciB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0FjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbE92ZXJ0aW1lV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZ3VsYXIgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiBub24tb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZ3VsYXIgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVndWxhcldvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUmVndWxhcldvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZWd1bGFyV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSZWd1bGFyV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlZ3VsYXJXb3JrIDxlbT5SZWd1bGFyIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZ3VsYXIgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlZ3VsYXJXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1haW5pbmcgRHVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2YgdGltZSByZXF1aXJlZCB0byBjb21wbGV0ZSB0aGUgdW5maW5pc2hlZCBwb3J0aW9uIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBEdXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nRHVyYXRpb24oT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUmVtYWluaW5nRHVyYXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdEdXJhdGlvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSZW1haW5pbmdEdXJhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ0R1cmF0aW9uIDxlbT5SZW1haW5pbmcgRHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBEdXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nRHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlbWFpbmluZ0R1cmF0aW9uKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1haW5pbmcgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgY29zdCBvZiBjb21wbGV0aW5nIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZW1haW5pbmdDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19SZW1haW5pbmdDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRSZW1haW5pbmdDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgd29yayBzY2hlZHVsZWQgdG8gY29tcGxldGUgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ1dvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUmVtYWluaW5nV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ1dvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVtYWluaW5nV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgb3ZlcnRpbWUgY29zdCBwcm9qZWN0ZWQgdG8gZmluaXNoIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZW1haW5pbmdPdmVydGltZUNvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1JlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nT3ZlcnRpbWVDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdPdmVydGltZUNvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHJlbWFpbmluZyBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCB0byBmaW5pc2ggdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ092ZXJ0aW1lV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19SZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdPdmVydGltZVdvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIHRhc2sgdG8tZGF0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QUNXUCgpCi0JICogQHNlZSAjc2V0QUNXUChmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0FDV1AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBQ1dQJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QUNXUCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFDV1AgPGVtPkFDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QUNXUCgpCi0JICogQHNlZSAjdW5zZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBQ1dQKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFDV1AgPGVtPkFDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QUNXUCgpCi0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQHNlZSAjc2V0QUNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEFDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFDV1AgPGVtPkFDV1A8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFDV1A8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEFDV1AoKQotCSAqIEBzZWUgI2dldEFDV1AoKQotCSAqIEBzZWUgI3NldEFDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRBQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DVjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRWFybmVkIHZhbHVlIGNvc3QgdmFyaWFuY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q1Y8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q1YoKQotCSAqIEBzZWUgI3Vuc2V0Q1YoKQotCSAqIEBzZWUgI3NldENWKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQ1YoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDVicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldENWKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q1YgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DVjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDVigpCi0JICogQHNlZSAjdW5zZXRDVigpCi0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENWKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENWIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRDVigpCi0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBzZWUgI3NldENWKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENWIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q1Y8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENWKCkKLQkgKiBAc2VlICNnZXRDVigpCi0JICogQHNlZSAjc2V0Q1YoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uc3RyYWludCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29uc3RyYWludCBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1BcyBTb29uIEFzIFBvc3NpYmxlLCAxPUFzIExhdGUgQXMgUG9zc2libGUsIDI9TXVzdCBTdGFydCBPbiwgMz1NdXN0IEZpbmlzaCBPbiwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0PVN0YXJ0IE5vIEVhcmxpZXIgVGhhbiwgNT1TdGFydCBObyBMYXRlciBUaGFuLCA2PUZpbmlzaCBObyBFYXJsaWVyIFRoYW4gYW5kIDc9RmluaXNoIE5vIExhdGVyIFRoYW4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25zdHJhaW50IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbnN0cmFpbnRUeXBlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Db25zdHJhaW50VHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNvbnN0cmFpbnRUeXBlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29uc3RyYWludFR5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldENvbnN0cmFpbnRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29uc3RyYWludFR5cGUgPGVtPkNvbnN0cmFpbnQgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29uc3RyYWludCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb25zdHJhaW50VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29uc3RyYWludFR5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWxlbmRhciBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0YXNrIGNhbGVuZGFyLlJlZmVycyB0byBhIHZhbGlkIFVJRCBpbiB0aGUgQ2FsZW5kYXJzIGVsZW1lbnQgb2YgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgTWljcm9zb2Z0IFByb2plY3QgWE1MIFNjaGVtYS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxlbmRhciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhbGVuZGFyVUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19DYWxlbmRhclVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ2FsZW5kYXJVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldENhbGVuZGFyVUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FsZW5kYXIgVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2FsZW5kYXJVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25zdHJhaW50IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIGFyZ3VtZW50IGZvciB0aGUgdGFzayBjb25zdHJhaW50IHR5cGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uc3RyYWludCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb25zdHJhaW50RGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Db25zdHJhaW50RGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvbnN0cmFpbnREYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldENvbnN0cmFpbnREYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29uc3RyYWludERhdGUgPGVtPkNvbnN0cmFpbnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29uc3RyYWludCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb25zdHJhaW50RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29uc3RyYWludERhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlYWRsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVhZGxpbmUgZm9yIHRoZSB0YXNrIHRvIGJlIGNvbXBsZXRlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWFkbGluZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVhZGxpbmUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRGVhZGxpbmUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZWFkbGluZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXREZWFkbGluZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldERlYWRsaW5lIDxlbT5EZWFkbGluZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVhZGxpbmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlYWRsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWFkbGluZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGV2ZWwgQXNzaWdubWVudHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgbGV2ZWxpbmcgY2FuIGFkanVzdCBhc3NpZ25tZW50cy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAc2VlICN1bnNldExldmVsQXNzaWdubWVudHMoKQotCSAqIEBzZWUgI3NldExldmVsQXNzaWdubWVudHMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0xldmVsQXNzaWdubWVudHMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xldmVsQXNzaWdubWVudHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTGV2ZWxBc3NpZ25tZW50cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxBc3NpZ25tZW50cyA8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsIEFzc2lnbm1lbnRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldExldmVsQXNzaWdubWVudHMoKQotCSAqIEBzZWUgI3Vuc2V0TGV2ZWxBc3NpZ25tZW50cygpCi0JICogQHNlZSAjaXNMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMZXZlbEFzc2lnbm1lbnRzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNMZXZlbEFzc2lnbm1lbnRzIDxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAc2VlICNpc0xldmVsQXNzaWdubWVudHMoKQotCSAqIEBzZWUgI3NldExldmVsQXNzaWdubWVudHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldExldmVsQXNzaWdubWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxBc3NpZ25tZW50cyA8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsIEFzc2lnbm1lbnRzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAc2VlICNpc0xldmVsQXNzaWdubWVudHMoKQotCSAqIEBzZWUgI3NldExldmVsQXNzaWdubWVudHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldExldmVsQXNzaWdubWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxldmVsaW5nIENhbiBTcGxpdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciBsZXZlbGluZyBjYW4gc3BsaXQgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldExldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBzZWUgI3Vuc2V0TGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQHNlZSAjc2V0TGV2ZWxpbmdDYW5TcGxpdChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfTGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGV2ZWxpbmdDYW5TcGxpdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNMZXZlbGluZ0NhblNwbGl0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNMZXZlbGluZ0NhblNwbGl0IDxlbT5MZXZlbGluZyBDYW4gU3BsaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRMZXZlbGluZ0NhblNwbGl0KCkKLQkgKiBAc2VlICN1bnNldExldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBzZWUgI2lzTGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGV2ZWxpbmdDYW5TcGxpdChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxpbmdDYW5TcGxpdCA8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldExldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBzZWUgI2lzTGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQHNlZSAjc2V0TGV2ZWxpbmdDYW5TcGxpdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TGV2ZWxpbmdDYW5TcGxpdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNMZXZlbGluZ0NhblNwbGl0IDxlbT5MZXZlbGluZyBDYW4gU3BsaXQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQHNlZSAjaXNMZXZlbGluZ0NhblNwbGl0KCkKLQkgKiBAc2VlICNzZXRMZXZlbGluZ0NhblNwbGl0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRMZXZlbGluZ0NhblNwbGl0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZXZlbGluZyBEZWxheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlbGF5IGNhdXNlZCBieSBsZXZlbGluZyB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbGluZyBEZWxheTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGV2ZWxpbmdEZWxheShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfTGV2ZWxpbmdEZWxheSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGV2ZWxpbmdEZWxheScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TGV2ZWxpbmdEZWxheSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExldmVsaW5nRGVsYXkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbGluZyBEZWxheTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGV2ZWxpbmdEZWxheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGV2ZWxpbmdEZWxheShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgZHVyYXRpb24gb2YgdGhlIGRlbGF5LiAgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExldmVsaW5nRGVsYXlGb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0xldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5MZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xldmVsaW5nRGVsYXlGb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldExldmVsaW5nRGVsYXlGb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0IDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGV2ZWxpbmdEZWxheUZvcm1hdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZSBMZXZlbGVkIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzayBiZWZvcmUgaXQgd2FzIGxldmVsZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIExldmVsZWQgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZUxldmVsZWRTdGFydChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19QcmVMZXZlbGVkU3RhcnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmVMZXZlbGVkU3RhcnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UHJlTGV2ZWxlZFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJlTGV2ZWxlZFN0YXJ0IDxlbT5QcmUgTGV2ZWxlZCBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIExldmVsZWQgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZUxldmVsZWRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlTGV2ZWxlZFN0YXJ0KE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmUgTGV2ZWxlZCBGaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzayBiZWZvcmUgaXQgd2FzIGxldmVsZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIExldmVsZWQgRmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVMZXZlbGVkRmluaXNoKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1ByZUxldmVsZWRGaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmVMZXZlbGVkRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFByZUxldmVsZWRGaW5pc2goKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmVMZXZlbGVkRmluaXNoIDxlbT5QcmUgTGV2ZWxlZCBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZSBMZXZlbGVkIEZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlTGV2ZWxlZEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlTGV2ZWxlZEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SHlwZXJsaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdGl0bGUgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmsoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfSHlwZXJsaW5rKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSHlwZXJsaW5rVHlwZTIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0h5cGVybGluaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRIeXBlcmxpbmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEh5cGVybGluayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SHlwZXJsaW5rIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmtBZGRyZXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0h5cGVybGlua0FkZHJlc3MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5IeXBlcmxpbmtBZGRyZXNzVHlwZTIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0h5cGVybGlua0FkZHJlc3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SHlwZXJsaW5rQWRkcmVzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEh5cGVybGlua0FkZHJlc3MgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SHlwZXJsaW5rQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SHlwZXJsaW5rQWRkcmVzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZG9jdW1lbnQgYm9va21hcmsgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0h5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0h5cGVybGlua1N1YkFkZHJlc3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgaWdub3JlcyB0aGUgcmVzb3VyY2UgY2FsZW5kYXIuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI3Vuc2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQHNlZSAjc2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSWdub3JlUmVzb3VyY2VDYWxlbmRhcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyIDxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklnbm9yZSBSZXNvdXJjZSBDYWxlbmRhcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAc2VlICN1bnNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhciA8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQHNlZSAjc2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyIDxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklnbm9yZSBSZXNvdXJjZSBDYWxlbmRhcjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQHNlZSAjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNzZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGV4dCBub3RlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm90ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vdGVzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX05vdGVzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J05vdGVzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5vdGVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob3RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Tm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5vdGVzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IaWRlIEJhcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgR0FOVFQgYmFyIG9mIHRoZSB0YXNrIGlzIGhpZGRlbiB3aGVuIGRpc3BsYXllZCBpbiBNaWNyb3NvZnQgUHJvamVjdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IaWRlIEJhcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIaWRlQmFyKCkKLQkgKiBAc2VlICN1bnNldEhpZGVCYXIoKQotCSAqIEBzZWUgI3NldEhpZGVCYXIoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0hpZGVCYXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0hpZGVCYXInIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSGlkZUJhcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSGlkZUJhciA8ZW0+SGlkZSBCYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhpZGUgQmFyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEhpZGVCYXIoKQotCSAqIEBzZWUgI3Vuc2V0SGlkZUJhcigpCi0JICogQHNlZSAjaXNIaWRlQmFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIaWRlQmFyKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNIaWRlQmFyIDxlbT5IaWRlIEJhcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRIaWRlQmFyKCkKLQkgKiBAc2VlICNpc0hpZGVCYXIoKQotCSAqIEBzZWUgI3NldEhpZGVCYXIoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEhpZGVCYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSGlkZUJhciA8ZW0+SGlkZSBCYXI8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhpZGUgQmFyPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRIaWRlQmFyKCkKLQkgKiBAc2VlICNpc0hpZGVCYXIoKQotCSAqIEBzZWUgI3NldEhpZGVCYXIoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEhpZGVCYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvbGx1cDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgdGFzayBpcyByb2xsZWQgdXAuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sbHVwPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJvbGx1cCgpCi0JICogQHNlZSAjdW5zZXRSb2xsdXAoKQotCSAqIEBzZWUgI3NldFJvbGx1cChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUm9sbHVwKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSb2xsdXAnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUm9sbHVwKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSb2xsdXAgPGVtPlJvbGx1cDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Um9sbHVwPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJvbGx1cCgpCi0JICogQHNlZSAjdW5zZXRSb2xsdXAoKQotCSAqIEBzZWUgI2lzUm9sbHVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSb2xsdXAoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JvbGx1cCA8ZW0+Um9sbHVwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJvbGx1cCgpCi0JICogQHNlZSAjaXNSb2xsdXAoKQotCSAqIEBzZWUgI3NldFJvbGx1cChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Um9sbHVwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JvbGx1cCA8ZW0+Um9sbHVwPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xsdXA8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJvbGx1cCgpCi0JICogQHNlZSAjaXNSb2xsdXAoKQotCSAqIEBzZWUgI3NldFJvbGx1cChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Um9sbHVwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CQ1dTPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19CQ1dTKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQkNXUycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEJDV1MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QkNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIHRhc2sgdG8tZGF0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0JDV1AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dQJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCQ1dQKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEJDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGVyY2VudGFnZSBjb21wbGV0ZSB2YWx1ZSBlbnRlcmVkIGJ5IHRoZSBQcm9qZWN0IE1hbmFnZXIuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgY2FuIGJlIHVzZWQgYXMgYW4gYWx0ZXJuYXRpdmUgZm9yIGNhbGN1bGF0aW5nIEJDV1AuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1BoeXNpY2FsUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSA8ZW0+UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWFybmVkIFZhbHVlIE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG1ldGhvZCBmb3IgY2FsY3VsYXRpbmcgZWFybmVkIHZhbHVlLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9UGVyY2VudCBDb21wbGV0ZSwgMT1QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RWFybmVkVmFsdWVNZXRob2QoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0Vhcm5lZFZhbHVlTWV0aG9kKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRWFybmVkVmFsdWVNZXRob2RUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFYXJuZWRWYWx1ZU1ldGhvZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RWFybmVkVmFsdWVNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJuZWRWYWx1ZU1ldGhvZCA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVhcm5lZFZhbHVlTWV0aG9kKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3IgTGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlZmluZXMgdGhlIHByZWRlY2Vzc29yIHRhc2sgb2YgdGhlIHRhc2sgdGhhdCBjb250YWlucyBpdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUHJlZGVjZXNzb3JMaW5rKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZWRlY2Vzc29yTGluaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFByZWRlY2Vzc29yTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIHRocm91Z2ggd2hpY2ggYWN0dWFsIHdvcmsgaXMgcHJvdGVjdGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsV29ya1Byb3RlY3RlZChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsV29ya1Byb3RlY3RlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCBvdmVydGltZSB3b3JrIGlzIHByb3RlY3RlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZSBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIGJhY2sgdG8gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSB0YWJsZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSB1bmlxdWUgSUQgb3IgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgRmllbGQgSUQsIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXh0ZW5kZWRBdHRyaWJ1dGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZWxpbmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIGJhc2VsaW5lIHZhbHVlcyBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlbGluZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0Jhc2VsaW5lKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQmFzZWxpbmUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRCYXNlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3V0bGluZSBDb2RlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhbHVlIG9mIGFuIG91dGxpbmUgY29kZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgYmFjayB0byB0aGUgb3V0bGluZSBjb2RlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgRmllbGQgSUQsIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19PdXRsaW5lQ29kZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdXRsaW5lQ29kZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE91dGxpbmVDb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdGltZSBwaGFzZWQgZGF0YSBibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfVGltZXBoYXNlZERhdGEoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGltZXBoYXNlZERhdGEnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRUaW1lcGhhc2VkRGF0YSgpOwotCi19IC8vIFRhc2sKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVGFza3MuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVGFza3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVjNDNjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Rhc2tzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRhc2tzLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2tzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3MjZ2V0VGFzayA8ZW0+VGFzazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUYXNrc18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUYXNrcyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgdGFzayBpbiBlYWNoIFRhc2tzIGNvbGxlY3Rpb24uCi0JICogICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFzazwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrc19UYXNrKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUYXNrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0VGFzaygpOwotCi19IC8vIFRhc2tzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1RpbWVQZXJpb2QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVGltZVBlcmlvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzhjYmFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVGltZVBlcmlvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUaW1lUGVyaW9kLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGltZSBQZXJpb2Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kI2dldEZyb21EYXRlIDxlbT5Gcm9tIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZCNnZXRUb0RhdGUgPGVtPlRvIERhdGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUaW1lUGVyaW9kKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUaW1lUGVyaW9kXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRpbWVQZXJpb2QgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Gcm9tIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBiZWdpbm5pbmcgb2YgdGhlIGV4Y2VwdGlvbiB0aW1lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Gcm9tIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZyb21EYXRlKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUaW1lUGVyaW9kX0Zyb21EYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRnJvbURhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RnJvbURhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZCNnZXRGcm9tRGF0ZSA8ZW0+RnJvbSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Gcm9tIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZyb21EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGcm9tRGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VG8gRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGVuZCBvZiB0aGUgZXhjZXB0aW9uIHRpbWUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRvIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRvRGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGltZVBlcmlvZF9Ub0RhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUb0RhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0VG9EYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QjZ2V0VG9EYXRlIDxlbT5UbyBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UbyBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUb0RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRvRGF0ZShPYmplY3QgdmFsdWUpOwotCi19IC8vIFRpbWVQZXJpb2QKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVGltZXBoYXNlZERhdGFUeXBlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1RpbWVwaGFzZWREYXRhVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmRkMGY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVGltZXBoYXNlZERhdGFUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUaW1lcGhhc2VkRGF0YVR5cGUuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIGRlZmluaXRpb24gb2YgdGhlIHRpbWUgcGhhc2VkIGRhdGEgYmxvY2suCi0gKiAJCSAgICAgICAgCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFVuaXQgPGVtPlVuaXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRpbWVwaGFzZWREYXRhVHlwZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGltZXBoYXNlZERhdGFUeXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGltZXBoYXNlZERhdGFUeXBlIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogICAgICAgICAgICAgICAgIFRoZSB0eXBlIG9mIHRhc2sgdGltZXBoYXNlZCBkYXRhLiBWYWx1ZXMgYXJlOgotCSAqICAgICAgICAgICAgICAgICAgICAgMT1Bc3NpZ25tZW50IFJlbWFpbmluZyBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAyPUFzc2lnbm1lbnQgQWN0dWFsIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDM9QXNzaWdubWVudCBBY3R1YWwgT3ZlcnRpbWUgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgND1Bc3NpZ25tZW50IEJhc2VsaW5lIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDU9QXNzaWdubWVudCBCYXNlbGluZSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA2PUFzc2lnbm1lbnQgQWN0dWFsIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDc9UmVzb3VyY2UgQmFzZWxpbmUgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgOD1SZXNvdXJjZSBCYXNlbGluZSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA5PVRhc2sgQmFzZWxpbmUgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMTA9VGFzayBCYXNlbGluZSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICAxMT1UYXNrIFBlcmNlbnQgQ29tcGxldGUKLQkgKiAgICAgICAgICAgICAgICAgICAgIDE2PUFzc2lnbm1lbnQgQmFzZWxpbmUgMSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAxNz1Bc3NpZ25tZW50IEJhc2VsaW5lIDEgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMTg9VGFzayBCYXNlbGluZSAxIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDE5PVRhc2sgQmFzZWxpbmUgMSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICAyMD1SZXNvdXJjZSBCYXNlbGluZSAxIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDIxPVJlc291cmNlIEJhc2VsaW5lIDEgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMjI9QXNzaWdubWVudCBCYXNlbGluZSAyIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDIzPUFzc2lnbm1lbnQgQmFzZWxpbmUgMiBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICAyND1UYXNrIEJhc2VsaW5lIDIgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMjU9VGFzayBCYXNlbGluZSAyIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDI2PVJlc291cmNlIEJhc2VsaW5lIDIgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMjc9UmVzb3VyY2UgQmFzZWxpbmUgMiBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICAyOD1Bc3NpZ25tZW50IEJhc2VsaW5lIDMgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMjk9QXNzaWdubWVudCBCYXNlbGluZSAzIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDMwPVRhc2sgQmFzZWxpbmUgMyBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAzMT1UYXNrIEJhc2VsaW5lIDMgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMzI9UmVzb3VyY2UgQmFzZWxpbmUgMyBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAzMz1SZXNvdXJjZSBCYXNlbGluZSAzIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDM0PUFzc2lnbm1lbnQgQmFzZWxpbmUgNCBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAzNT1Bc3NpZ25tZW50IEJhc2VsaW5lIDQgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMzY9VGFzayBCYXNlbGluZSA0IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDM3PVRhc2sgQmFzZWxpbmUgNCBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICAzOD1SZXNvdXJjZSBCYXNlbGluZSA0IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDM5PVJlc291cmNlIEJhc2VsaW5lIDQgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNDA9QXNzaWdubWVudCBCYXNlbGluZSA1IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQxPUFzc2lnbm1lbnQgQmFzZWxpbmUgNSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA0Mj1UYXNrIEJhc2VsaW5lIDUgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNDM9VGFzayBCYXNlbGluZSA1IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQ0PVJlc291cmNlIEJhc2VsaW5lIDUgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNDU9UmVzb3VyY2UgQmFzZWxpbmUgNSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA0Nj1Bc3NpZ25tZW50IEJhc2VsaW5lIDYgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNDc9QXNzaWdubWVudCBCYXNlbGluZSA2IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQ4PVRhc2sgQmFzZWxpbmUgNiBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA0OT1UYXNrIEJhc2VsaW5lIDYgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNTA9UmVzb3VyY2UgQmFzZWxpbmUgNiBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA1MT1SZXNvdXJjZSBCYXNlbGluZSA2IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDUyPUFzc2lnbm1lbnQgQmFzZWxpbmUgNyBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA1Mz1Bc3NpZ25tZW50IEJhc2VsaW5lIDcgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNTQ9VGFzayBCYXNlbGluZSA3IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDU1PVRhc2sgQmFzZWxpbmUgNyBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA1Nj1SZXNvdXJjZSBCYXNlbGluZSA3IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDU3PVJlc291cmNlIEJhc2VsaW5lIDcgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNTg9QXNzaWdubWVudCBCYXNlbGluZSA4IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDU5PUFzc2lnbm1lbnQgQmFzZWxpbmUgOCBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA2MD1UYXNrIEJhc2VsaW5lIDggV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNjE9VGFzayBCYXNlbGluZSA4IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDYyPVJlc291cmNlIEJhc2VsaW5lIDggV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNjM9UmVzb3VyY2UgQmFzZWxpbmUgOCBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA2ND1Bc3NpZ25tZW50IEJhc2VsaW5lIDkgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNjU9QXNzaWdubWVudCBCYXNlbGluZSA5IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDY2PVRhc2sgQmFzZWxpbmUgOSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA2Nz1UYXNrIEJhc2VsaW5lIDkgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNjg9UmVzb3VyY2UgQmFzZWxpbmUgOSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA2OT1SZXNvdXJjZSBCYXNlbGluZSA5IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDcwPUFzc2lnbm1lbnQgQmFzZWxpbmUgMTAgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNzE9QXNzaWdubWVudCBCYXNlbGluZSAxMCBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA3Mj1UYXNrIEJhc2VsaW5lIDEwIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDczPVRhc2sgQmFzZWxpbmUgMTAgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNzQ9UmVzb3VyY2UgQmFzZWxpbmUgMTAgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNzU9UmVzb3VyY2UgQmFzZWxpbmUgMTAgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNzY9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZQotCSAqICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRpbWVwaGFzZWREYXRhVHlwZV9UeXBlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVHlwZVR5cGUzIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRpbWVwaGFzZWQgZGF0YSByZWNvcmQuCi0JICogICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRpbWVwaGFzZWREYXRhVHlwZV9VSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHRpbWVwaGFzZWQgZGF0YSBwZXJpb2QuCi0JICogICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhcnQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRpbWVwaGFzZWREYXRhVHlwZV9TdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZpbmlzaCBkYXRlIG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLgotCSAqICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaW5pc2goT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRpbWVwaGFzZWREYXRhVHlwZV9GaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaW5pc2gnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RmluaXNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpbWUgdW5pdCBvZiB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4gCi0JICogICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9bSwgMT1oLCAyPWQsIDM9dywgNT1tbywgOD15Ci0JICogICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vbml0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVbml0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGltZXBoYXNlZERhdGFUeXBlX1VuaXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Vbml0VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVW5pdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VW5pdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VW5pdCA8ZW0+VW5pdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VW5pdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VW5pdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFsdWUgcGVyIHVuaXQgb2YgdGltZSBmb3IgdGhlIHRpbWVwaGFzZWQgZGF0YSBwZXJpb2QuCi0JICogICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRpbWVwaGFzZWREYXRhVHlwZV9WYWx1ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gVGltZXBoYXNlZERhdGFUeXBlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ZhbHVlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNTM4YjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVmFsdWUuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ1IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0UGFyZW50VmFsdWVJRCA8ZW0+UGFyZW50IFZhbHVlIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRWYWx1ZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVmFsdWVfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmFsdWUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgb3V0bGluZSBjb2RlIHZhbHVlIGFjcm9zcyB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRWYWx1ZV9WYWx1ZUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRWYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcmVudCBWYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhbHVlIG9mIHRoZSBwYXJlbnQgbm9kZSBvZiB0aGUgb3V0bGluZSBjb2RlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJlbnQgVmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhcmVudFZhbHVlSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRWYWx1ZV9QYXJlbnRWYWx1ZUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQYXJlbnRWYWx1ZUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRQYXJlbnRWYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFBhcmVudFZhbHVlSUQgPGVtPlBhcmVudCBWYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFyZW50IFZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYXJlbnRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQYXJlbnRWYWx1ZUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgdmFsdWUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWVfVmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBkZXNjcmlwdGlvbiBvZiB0aGlzIHZhbHVlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlX0Rlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Rlc2NyaXB0aW9uJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIFZhbHVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ZhbHVlMi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE5ODllZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ZhbHVlMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVmFsdWUyLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYWx1ZTI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIjZ2V0SUQgPGVtPklEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlMigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVmFsdWVfLl8xXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhbHVlMiBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBVbmlxdWUgSUQgb2YgdmFsdWUgYWNyb3NzIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlMl9JRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0lEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIjZ2V0SUQgPGVtPklEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgdmFsdWUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWUyX1ZhbHVlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHZhbHVlIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGxpc3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWUyX0Rlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Rlc2NyaXB0aW9uJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBWYWx1ZTIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVmFsdWVMaXN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ZhbHVlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDkwMmI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVmFsdWVMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFZhbHVlTGlzdC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYWx1ZSBMaXN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlTGlzdCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVmFsdWVMaXN0Xy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhbHVlTGlzdCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhbHVlcyB0aGF0IG1ha2UgdXAgdGhlIHZhbHVlIGxpc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWVMaXN0X1ZhbHVlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFZhbHVlKCk7Ci0KLX0gLy8gVmFsdWVMaXN0CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ZhbHVlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRkMWNkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ZhbHVlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBWYWx1ZXMuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ1IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYWx1ZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXMjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlcyNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRWYWx1ZXMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ZhbHVlc18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBWYWx1ZXMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRWYWx1ZXNfR3JvdXAoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDowJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBpbmRpdmlkdWFsIHZhbHVlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWVzX1ZhbHVlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIGdyb3VwPScjZ3JvdXA6MCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFZhbHVlKCk7Ci0KLX0gLy8gVmFsdWVzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dCU01hc2suamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV0JTTWFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTY5ZmIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV0JTTWFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV0JTTWFzay5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V0JTIE1hc2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldExldmVsIDxlbT5MZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRMZW5ndGggPGVtPkxlbmd0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldFNlcGFyYXRvciA8ZW0+U2VwYXJhdG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V0JTTWFzaygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV0JTTWFza18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXQlNNYXNrIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBsZXZlbCBvZiB0aGUgbWFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExldmVsKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V0JTTWFza19MZXZlbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xldmVsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRMZXZlbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldExldmVsIDxlbT5MZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMZXZlbChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0eXBlIG9mIHRoZSBub2RlIHZhbHVlLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZXMgYXJlOiAwPU51bWJlcnMsIDE9VXBwZXJjYXNlIExldHRlcnMsIDI9TG93ZXJjYXNlIExldHRlcnMsIDM9Q2hhcmFjdGVycy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2tfVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlR5cGVUeXBlMiIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1R5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGVuZ3RoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbWF4aW11bSBsZW5ndGggaW4gY2hhcmFjdGVycy4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIG9taXR0ZWQgd2hlbiBsZW5ndGggaXMgImFueSIuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxlbmd0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGVuZ3RoKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXQlNNYXNrX0xlbmd0aCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGVuZ3RoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExlbmd0aCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldExlbmd0aCA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExlbmd0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGVuZ3RoKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXBhcmF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyIG9mIHRoZSBub2RlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXBhcmF0b3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlcGFyYXRvcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V0JTTWFza19TZXBhcmF0b3IoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NlcGFyYXRvcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTZXBhcmF0b3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRTZXBhcmF0b3IgPGVtPlNlcGFyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VwYXJhdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZXBhcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlcGFyYXRvcihTdHJpbmcgdmFsdWUpOwotCi19IC8vIFdCU01hc2sKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV0JTTWFza3MuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV0JTTWFza3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDExNjg4Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dCU01hc2tzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXQlNNYXNrcy5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XQlMgTWFza3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNpc1ZlcmlmeVVuaXF1ZUNvZGVzIDxlbT5WZXJpZnkgVW5pcXVlIENvZGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2lzR2VuZXJhdGVDb2RlcyA8ZW0+R2VuZXJhdGUgQ29kZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjZ2V0V0JTTWFzayA8ZW0+V0JTIE1hc2s8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXQlNNYXNrcygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV0JTTWFza3NfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV0JTTWFza3MgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJpZnkgVW5pcXVlIENvZGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIFdCUyBjb2RlcyBhcmUgdW5pcXVlIGZvciBuZXcgdGFza3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBzZWUgI3Vuc2V0VmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBzZWUgI3NldFZlcmlmeVVuaXF1ZUNvZGVzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V0JTTWFza3NfVmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWZXJpZnlVbmlxdWVDb2RlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNWZXJpZnlVbmlxdWVDb2RlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNpc1ZlcmlmeVVuaXF1ZUNvZGVzIDxlbT5WZXJpZnkgVW5pcXVlIENvZGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJpZnkgVW5pcXVlIENvZGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAc2VlICN1bnNldFZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAc2VlICNpc1ZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWZXJpZnlVbmlxdWVDb2Rlcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNpc1ZlcmlmeVVuaXF1ZUNvZGVzIDxlbT5WZXJpZnkgVW5pcXVlIENvZGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAc2VlICNpc1ZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAc2VlICNzZXRWZXJpZnlVbmlxdWVDb2Rlcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VmVyaWZ5VW5pcXVlQ29kZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNpc1ZlcmlmeVVuaXF1ZUNvZGVzIDxlbT5WZXJpZnkgVW5pcXVlIENvZGVzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJpZnkgVW5pcXVlIENvZGVzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQHNlZSAjaXNWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQHNlZSAjc2V0VmVyaWZ5VW5pcXVlQ29kZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFZlcmlmeVVuaXF1ZUNvZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBDb2RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciBXQlMgY29kZXMgYXJlIGdlbmVyYXRlZCBmb3IgbmV3IHRhc2tzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZSBDb2RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAc2VlICN1bnNldEdlbmVyYXRlQ29kZXMoKQotCSAqIEBzZWUgI3NldEdlbmVyYXRlQ29kZXMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXQlNNYXNrc19HZW5lcmF0ZUNvZGVzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nR2VuZXJhdGVDb2RlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNHZW5lcmF0ZUNvZGVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2lzR2VuZXJhdGVDb2RlcyA8ZW0+R2VuZXJhdGUgQ29kZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlIENvZGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEdlbmVyYXRlQ29kZXMoKQotCSAqIEBzZWUgI3Vuc2V0R2VuZXJhdGVDb2RlcygpCi0JICogQHNlZSAjaXNHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHZW5lcmF0ZUNvZGVzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2lzR2VuZXJhdGVDb2RlcyA8ZW0+R2VuZXJhdGUgQ29kZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0R2VuZXJhdGVDb2RlcygpCi0JICogQHNlZSAjaXNHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAc2VlICNzZXRHZW5lcmF0ZUNvZGVzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRHZW5lcmF0ZUNvZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNHZW5lcmF0ZUNvZGVzIDxlbT5HZW5lcmF0ZSBDb2RlczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGUgQ29kZXM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEdlbmVyYXRlQ29kZXMoKQotCSAqIEBzZWUgI2lzR2VuZXJhdGVDb2RlcygpCi0JICogQHNlZSAjc2V0R2VuZXJhdGVDb2Rlcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0R2VuZXJhdGVDb2RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcHJlZml4IGZvciBhbGwgV0JTIGNvZGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZWZpeChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V0JTTWFza3NfUHJlZml4KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZml4VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlZml4JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByZWZpeCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWZpeChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V0JTIE1hc2s8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIFdCUyBNYXNrIHRoYXQgaXMgYXBwbGllZCB0byBhbGwgdGFza3MgaW4gdGhlIFByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldCUyBNYXNrPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2tzX1dCU01hc2soKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2siIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dCU01hc2snIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRXQlNNYXNrKCk7Ci0KLX0gLy8gV0JTTWFza3MKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV2Vla0RheS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9XZWVrRGF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YTM0NzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9XZWVrRGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXZWVrRGF5LmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XZWVrIERheTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0RGF5VHlwZSA8ZW0+RGF5IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNpc0RheVdvcmtpbmcgPGVtPkRheSBXb3JraW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0VGltZVBlcmlvZCA8ZW0+VGltZSBQZXJpb2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNnZXRXb3JraW5nVGltZXMgPGVtPldvcmtpbmcgVGltZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXZWVrRGF5KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXZWVrRGF5Xy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlZWtEYXkgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EYXkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHR5cGUgb2YgZGF5LiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPUV4Y2VwdGlvbiwgMT1Nb25kYXksIDI9VHVlc2RheSwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMz1XZWRuZXNkYXksIDQ9VGh1cnNkYXksIDU9RnJpZGF5LCA2PVNhdHVyZGF5LCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3PVN1bmRheQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EYXkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGF5VHlwZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdlZWtEYXlfRGF5VHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRheVR5cGVUeXBlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGF5VHlwZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RGF5VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldERheVR5cGUgPGVtPkRheSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EYXkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGF5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGF5VHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRheSBXb3JraW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBzcGVjaWZpZWQgZGF0ZSBvciBkYXkgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBpcyB3b3JraW5nLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EYXkgV29ya2luZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXREYXlXb3JraW5nKCkKLQkgKiBAc2VlICN1bnNldERheVdvcmtpbmcoKQotCSAqIEBzZWUgI3NldERheVdvcmtpbmcoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXZWVrRGF5X0RheVdvcmtpbmcoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RheVdvcmtpbmcnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRGF5V29ya2luZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2lzRGF5V29ya2luZyA8ZW0+RGF5IFdvcmtpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRheSBXb3JraW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERheVdvcmtpbmcoKQotCSAqIEBzZWUgI3Vuc2V0RGF5V29ya2luZygpCi0JICogQHNlZSAjaXNEYXlXb3JraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREYXlXb3JraW5nKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjaXNEYXlXb3JraW5nIDxlbT5EYXkgV29ya2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXREYXlXb3JraW5nKCkKLQkgKiBAc2VlICNpc0RheVdvcmtpbmcoKQotCSAqIEBzZWUgI3NldERheVdvcmtpbmcoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldERheVdvcmtpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2lzRGF5V29ya2luZyA8ZW0+RGF5IFdvcmtpbmc8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRheSBXb3JraW5nPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXREYXlXb3JraW5nKCkKLQkgKiBAc2VlICNpc0RheVdvcmtpbmcoKQotCSAqIEBzZWUgI3NldERheVdvcmtpbmcoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldERheVdvcmtpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRpbWUgUGVyaW9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGEgY29udGlndW91cyBzZXQgb2YgZXhjZXB0aW9uIGRheXMuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRpbWUgUGVyaW9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRUaW1lUGVyaW9kKFRpbWVQZXJpb2QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V2Vla0RheV9UaW1lUGVyaW9kKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGltZVBlcmlvZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRpbWVQZXJpb2QgZ2V0VGltZVBlcmlvZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldFRpbWVQZXJpb2QgPGVtPlRpbWUgUGVyaW9kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lIFBlcmlvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VGltZVBlcmlvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGltZVBlcmlvZChUaW1lUGVyaW9kIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmtpbmcgVGltZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIHdvcmtpbmcgdGltZXMgdGhhdCBkZWZpbmUgdGhlIHRpbWUgd29ya2VkIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSB3ZWVrZGF5LiAgT25lIG9mIHRoZXNlIG11c3QgYmUgcHJlc2VudCwgYW5kIHRoZXJlIG1heSBiZSBubyBtb3JlIHRoYW4gZml2ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29ya2luZyBUaW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0V29ya2luZ1RpbWVzKFdvcmtpbmdUaW1lcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXZWVrRGF5X1dvcmtpbmdUaW1lcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmtpbmdUaW1lcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtpbmdUaW1lcyBnZXRXb3JraW5nVGltZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNnZXRXb3JraW5nVGltZXMgPGVtPldvcmtpbmcgVGltZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmtpbmcgVGltZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFdvcmtpbmdUaW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29ya2luZ1RpbWVzKFdvcmtpbmdUaW1lcyB2YWx1ZSk7Ci0KLX0gLy8gV2Vla0RheQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9XZWVrRGF5cy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9XZWVrRGF5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzFjYWViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV2Vla0RheXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV2Vla0RheXMuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ1IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2VlayBEYXlzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXMjZ2V0V2Vla0RheSA8ZW0+V2VlayBEYXk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXZWVrRGF5cygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV2Vla0RheXNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2Vla0RheXMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XZWVrIERheTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIHdlZWtkYXkgZWl0aGVyIGRlZmluZXMgcmVndWxhciBkYXlzIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHdlZWsgb3IgZXhjZXB0aW9uIGRheXMgaW4gdGhlIGNhbGVuZGFyLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XZWVrIERheTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXZWVrRGF5c19XZWVrRGF5KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXZWVrRGF5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0V2Vla0RheSgpOwotCi19IC8vIFdlZWtEYXlzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dvcmtpbmdUaW1lLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dvcmtpbmdUaW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YTUyMGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Xb3JraW5nVGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JraW5nVGltZS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmtpbmcgVGltZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lI2dldEZyb21UaW1lIDxlbT5Gcm9tIFRpbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUjZ2V0VG9UaW1lIDxlbT5UbyBUaW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V29ya2luZ1RpbWUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtpbmdUaW1lXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtpbmdUaW1lIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RnJvbSBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYmVnaW5uaW5nIG9mIHRoZSB3b3JraW5nIHRpbWUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Gcm9tIFRpbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZyb21UaW1lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXb3JraW5nVGltZV9Gcm9tVGltZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRnJvbVRpbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RnJvbVRpbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUjZ2V0RnJvbVRpbWUgPGVtPkZyb20gVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RnJvbSBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGcm9tVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RnJvbVRpbWUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvIFRpbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBlbmQgb2YgdGhlIHdvcmtpbmcgIHRpbWUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UbyBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUb1RpbWUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdvcmtpbmdUaW1lX1RvVGltZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVG9UaW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFRvVGltZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZSNnZXRUb1RpbWUgPGVtPlRvIFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRvIFRpbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRvVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VG9UaW1lKE9iamVjdCB2YWx1ZSk7Ci0KLX0gLy8gV29ya2luZ1RpbWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV29ya2luZ1RpbWVzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dvcmtpbmdUaW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTgwMGEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV29ya2luZ1RpbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtpbmdUaW1lcy5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JraW5nIFRpbWVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzI2dldFdvcmtpbmdUaW1lIDxlbT5Xb3JraW5nIFRpbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXb3JraW5nVGltZXMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtpbmdUaW1lc18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JraW5nVGltZXMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JraW5nIFRpbWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlZmluZXMgdGhlIHdvcmtpbmcgdGltZSBkdXJpbmcgdGhlIHdlZWtkYXkuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JraW5nIFRpbWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V29ya2luZ1RpbWVzX1dvcmtpbmdUaW1lKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgdXBwZXI9IjUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmtpbmdUaW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0V29ya2luZ1RpbWUoKTsKLQotfSAvLyBXb3JraW5nVGltZXMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Bc3NpZ25tZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Fzc2lnbm1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4Y2FlNWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Fzc2lnbm1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXNzaWdubWVudEltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFzc2lnbm1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFRhc2tVSUQgPGVtPlRhc2sgVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0UmVzb3VyY2VVSUQgPGVtPlJlc291cmNlIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0QWN0dWFsRmluaXNoIDxlbT5BY3R1YWwgRmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0IDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEFjdHVhbE92ZXJ0aW1lV29yayA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRBY3R1YWxTdGFydCA8ZW0+QWN0dWFsIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjaXNDb25maXJtZWQgPGVtPkNvbmZpcm1lZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRDb3N0UmF0ZVRhYmxlIDxlbT5Db3N0IFJhdGUgVGFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRDb3N0VmFyaWFuY2UgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRDViA8ZW0+Q1Y8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXREZWxheSA8ZW0+RGVsYXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEZpbmlzaFZhcmlhbmNlIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEh5cGVybGlua0FkZHJlc3MgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjaXNIYXNGaXhlZFJhdGVVbml0cyA8ZW0+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNpc0ZpeGVkTWF0ZXJpYWwgPGVtPkZpeGVkIE1hdGVyaWFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0TGV2ZWxpbmdEZWxheSA8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0IDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNpc0xpbmtlZEZpZWxkcyA8ZW0+TGlua2VkIEZpZWxkczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2lzTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXROb3RlcyA8ZW0+Tm90ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNpc092ZXJhbGxvY2F0ZWQgPGVtPk92ZXJhbGxvY2F0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRPdmVydGltZVdvcmsgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRSZWd1bGFyV29yayA8ZW0+UmVndWxhciBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjaXNSZXNwb25zZVBlbmRpbmcgPGVtPlJlc3BvbnNlIFBlbmRpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRTdG9wIDxlbT5TdG9wPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0UmVzdW1lIDxlbT5SZXN1bWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRTdGFydFZhcmlhbmNlIDxlbT5TdGFydCBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFVuaXRzIDxlbT5Vbml0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2lzVXBkYXRlTmVlZGVkIDxlbT5VcGRhdGUgTmVlZGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0VkFDIDxlbT5WQUM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0V29ya0NvbnRvdXIgPGVtPldvcmsgQ29udG91cjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEJDV1MgPGVtPkJDV1M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0Qm9va2luZ1R5cGUgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEJhc2VsaW5lIDxlbT5CYXNlbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NpZ25tZW50SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQXNzaWdubWVudCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFVJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHVJRCA9IFVJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXNrVUlEKCkgPGVtPlRhc2sgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXNrVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVEFTS19VSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFza1VJRCgpIDxlbT5UYXNrIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFza1VJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdGFza1VJRCA9IFRBU0tfVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVUlEKCkgPGVtPlJlc291cmNlIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBSRVNPVVJDRV9VSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VVSUQoKSA8ZW0+UmVzb3VyY2UgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZVVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgcmVzb3VyY2VVSUQgPSBSRVNPVVJDRV9VSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHBlcmNlbnRXb3JrQ29tcGxldGUgPSBQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsQ29zdCgpIDxlbT5BY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIEFDVFVBTF9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbENvc3QoKSA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGFjdHVhbENvc3QgPSBBQ1RVQUxfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxGaW5pc2goKSA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfRklOSVNIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbEZpbmlzaCgpIDxlbT5BY3R1YWwgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsRmluaXNoID0gQUNUVUFMX0ZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBhY3R1YWxPdmVydGltZUNvc3QgPSBBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsT3ZlcnRpbWVXb3JrID0gQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsU3RhcnQoKSA8ZW0+QWN0dWFsIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX1NUQVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFN0YXJ0KCkgPGVtPkFjdHVhbCBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsU3RhcnQgPSBBQ1RVQUxfU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsV29yaygpIDxlbT5BY3R1YWwgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsV29yaygpIDxlbT5BY3R1YWwgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxXb3JrID0gQUNUVUFMX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QUNXUCgpIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEFDV1BfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QUNXUCgpIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYUNXUCA9IEFDV1BfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEFDV1AgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFDV1BFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDb25maXJtZWQoKSA8ZW0+Q29uZmlybWVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0NvbmZpcm1lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENPTkZJUk1FRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDb25maXJtZWQoKSA8ZW0+Q29uZmlybWVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0NvbmZpcm1lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29uZmlybWVkID0gQ09ORklSTUVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDb25maXJtZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvbmZpcm1lZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBDT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3QoKSA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgY29zdCA9IENPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdFJhdGVUYWJsZSgpIDxlbT5Db3N0IFJhdGUgVGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3RSYXRlVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBDT1NUX1JBVEVfVEFCTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdFJhdGVUYWJsZSgpIDxlbT5Db3N0IFJhdGUgVGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3RSYXRlVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGNvc3RSYXRlVGFibGUgPSBDT1NUX1JBVEVfVEFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdFZhcmlhbmNlKCkgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3RWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBDT1NUX1ZBUklBTkNFX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RWYXJpYW5jZSgpIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBjb3N0VmFyaWFuY2UgPSBDT1NUX1ZBUklBTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDb3N0IFZhcmlhbmNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb3N0VmFyaWFuY2VFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q1YoKSA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IENWX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENWKCkgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDVigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGNWID0gQ1ZfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIENWIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjVkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWxheSgpIDxlbT5EZWxheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVsYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBERUxBWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWxheSgpIDxlbT5EZWxheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVsYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGRlbGF5ID0gREVMQVlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZpbmlzaCA9IEZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hWYXJpYW5jZSgpIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgRklOSVNIX1ZBUklBTkNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaFZhcmlhbmNlKCkgPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoVmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGZpbmlzaFZhcmlhbmNlID0gRklOSVNIX1ZBUklBTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGluaygpIDxlbT5IeXBlcmxpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFlQRVJMSU5LX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGluaygpIDxlbT5IeXBlcmxpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBoeXBlcmxpbmsgPSBIWVBFUkxJTktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rQWRkcmVzcygpIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFlQRVJMSU5LX0FERFJFU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rQWRkcmVzcygpIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBoeXBlcmxpbmtBZGRyZXNzID0gSFlQRVJMSU5LX0FERFJFU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBoeXBlcmxpbmtTdWJBZGRyZXNzID0gSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtWYXJpYW5jZSgpIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgV09SS19WQVJJQU5DRV9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrVmFyaWFuY2UoKSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgd29ya1ZhcmlhbmNlID0gV09SS19WQVJJQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgV29yayBWYXJpYW5jZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gd29ya1ZhcmlhbmNlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSGFzRml4ZWRSYXRlVW5pdHMoKSA8ZW0+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSGFzRml4ZWRSYXRlVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBIQVNfRklYRURfUkFURV9VTklUU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIYXNGaXhlZFJhdGVVbml0cygpIDxlbT5IYXMgRml4ZWQgUmF0ZSBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzRml4ZWRSYXRlVW5pdHMgPSBIQVNfRklYRURfUkFURV9VTklUU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSGFzIEZpeGVkIFJhdGUgVW5pdHMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc0ZpeGVkUmF0ZVVuaXRzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRml4ZWRNYXRlcmlhbCgpIDxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGaXhlZE1hdGVyaWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRklYRURfTUFURVJJQUxfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRml4ZWRNYXRlcmlhbCgpIDxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGaXhlZE1hdGVyaWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaXhlZE1hdGVyaWFsID0gRklYRURfTUFURVJJQUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEZpeGVkIE1hdGVyaWFsIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaXhlZE1hdGVyaWFsRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsaW5nRGVsYXkoKSA8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBMRVZFTElOR19ERUxBWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbGluZ0RlbGF5KCkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5ID0gTEVWRUxJTkdfREVMQVlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpIDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpIDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGxldmVsaW5nRGVsYXlGb3JtYXQgPSBMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMaW5rZWRGaWVsZHMoKSA8ZW0+TGlua2VkIEZpZWxkczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNMaW5rZWRGaWVsZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBMSU5LRURfRklFTERTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xpbmtlZEZpZWxkcygpIDxlbT5MaW5rZWQgRmllbGRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0xpbmtlZEZpZWxkcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbGlua2VkRmllbGRzID0gTElOS0VEX0ZJRUxEU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTGlua2VkIEZpZWxkcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbGlua2VkRmllbGRzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWlsZXN0b25lKCkgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNaWxlc3RvbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBNSUxFU1RPTkVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWlsZXN0b25lKCkgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNaWxlc3RvbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1pbGVzdG9uZSA9IE1JTEVTVE9ORV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTWlsZXN0b25lIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtaWxlc3RvbmVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90ZXMoKSA8ZW0+Tm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RFU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb3RlcygpIDxlbT5Ob3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbm90ZXMgPSBOT1RFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc092ZXJhbGxvY2F0ZWQoKSA8ZW0+T3ZlcmFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNPdmVyYWxsb2NhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gT1ZFUkFMTE9DQVRFRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNPdmVyYWxsb2NhdGVkKCkgPGVtPk92ZXJhbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzT3ZlcmFsbG9jYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gb3ZlcmFsbG9jYXRlZCA9IE9WRVJBTExPQ0FURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE92ZXJhbGxvY2F0ZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG92ZXJhbGxvY2F0ZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVDb3N0KCkgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIE9WRVJUSU1FX0NPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVDb3N0KCkgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgb3ZlcnRpbWVDb3N0ID0gT1ZFUlRJTUVfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVdvcmsoKSA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBPVkVSVElNRV9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lV29yaygpIDxlbT5PdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgb3ZlcnRpbWVXb3JrID0gT1ZFUlRJTUVfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWd1bGFyV29yaygpIDxlbT5SZWd1bGFyIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZ3VsYXJXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSRUdVTEFSX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVndWxhcldvcmsoKSA8ZW0+UmVndWxhciBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZWd1bGFyV29yayA9IFJFR1VMQVJfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdDb3N0KCkgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nQ29zdCgpIDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgcmVtYWluaW5nQ29zdCA9IFJFTUFJTklOR19DT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIHJlbWFpbmluZ092ZXJ0aW1lQ29zdCA9IFJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZW1haW5pbmdPdmVydGltZVdvcmsgPSBSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdXb3JrKCkgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSRU1BSU5JTkdfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdXb3JrKCkgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlbWFpbmluZ1dvcmsgPSBSRU1BSU5JTkdfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Jlc3BvbnNlUGVuZGluZygpIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Jlc3BvbnNlUGVuZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFU1BPTlNFX1BFTkRJTkdfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVzcG9uc2VQZW5kaW5nKCkgPGVtPlJlc3BvbnNlIFBlbmRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVzcG9uc2VQZW5kaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXNwb25zZVBlbmRpbmcgPSBSRVNQT05TRV9QRU5ESU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSZXNwb25zZSBQZW5kaW5nIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXNwb25zZVBlbmRpbmdFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBTVEFSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydCgpIDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgc3RhcnQgPSBTVEFSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdG9wKCkgPGVtPlN0b3A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0b3AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFNUT1BfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RvcCgpIDxlbT5TdG9wPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdG9wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0b3AgPSBTVE9QX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3VtZSgpIDxlbT5SZXN1bWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3VtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVTVU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3VtZSgpIDxlbT5SZXN1bWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3VtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZXN1bWUgPSBSRVNVTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnRWYXJpYW5jZSgpIDxlbT5TdGFydCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnRWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFNUQVJUX1ZBUklBTkNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0VmFyaWFuY2UoKSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHN0YXJ0VmFyaWFuY2UgPSBTVEFSVF9WQVJJQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbml0cygpIDxlbT5Vbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgVU5JVFNfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5pdHMoKSA8ZW0+VW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgdW5pdHMgPSBVTklUU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVW5pdHMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVuaXRzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVXBkYXRlTmVlZGVkKCkgPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVXBkYXRlTmVlZGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVVBEQVRFX05FRURFRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVcGRhdGVOZWVkZWQoKSA8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNVcGRhdGVOZWVkZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZU5lZWRlZCA9IFVQREFURV9ORUVERURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFVwZGF0ZSBOZWVkZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZU5lZWRlZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWQUMoKSA8ZW0+VkFDPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWQUMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgVkFDX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZBQygpIDxlbT5WQUM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZBQygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IHZBQyA9IFZBQ19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVkFDIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2QUNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBXT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCB3b3JrID0gV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrQ29udG91cigpIDxlbT5Xb3JrIENvbnRvdXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtDb250b3VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgV09SS19DT05UT1VSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtDb250b3VyKCkgPGVtPldvcmsgQ29udG91cjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya0NvbnRvdXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHdvcmtDb250b3VyID0gV09SS19DT05UT1VSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1MoKSA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBCQ1dTX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1MoKSA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGJDV1MgPSBCQ1dTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBCQ1dTIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiQ1dTRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1AoKSA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBCQ1dQX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1AoKSA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBCQ1dQIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiQ1dQRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJvb2tpbmdUeXBlKCkgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Qm9va2luZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBCT09LSU5HX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Qm9va2luZ1R5cGUoKSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCb29raW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgYm9va2luZ1R5cGUgPSBCT09LSU5HX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxXb3JrUHJvdGVjdGVkID0gQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPSBBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRpb25EYXRlKCkgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQ1JFQVRJT05fREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcmVhdGlvbkRhdGUoKSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JlYXRpb25EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0aW9uRGF0ZSA9IENSRUFUSU9OX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBleHRlbmRlZEF0dHJpYnV0ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlbGluZSgpIDxlbT5CYXNlbGluZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGJhc2VsaW5lID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVwaGFzZWREYXRhKCkgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRpbWVwaGFzZWREYXRhID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBc3NpZ25tZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEFzc2lnbm1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgbmV3VUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVUlEID0gdUlEOwotCQl1SUQgPSBuZXdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVUlELCBvbGRVSUQsIHVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFRhc2tVSUQoKSB7Ci0JCXJldHVybiB0YXNrVUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhc2tVSUQoQmlnSW50ZWdlciBuZXdUYXNrVUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVGFza1VJRCA9IHRhc2tVSUQ7Ci0JCXRhc2tVSUQgPSBuZXdUYXNrVUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RBU0tfVUlELCBvbGRUYXNrVUlELCB0YXNrVUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UmVzb3VyY2VVSUQoKSB7Ci0JCXJldHVybiByZXNvdXJjZVVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVVJRChCaWdJbnRlZ2VyIG5ld1Jlc291cmNlVUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkUmVzb3VyY2VVSUQgPSByZXNvdXJjZVVJRDsKLQkJcmVzb3VyY2VVSUQgPSBuZXdSZXNvdXJjZVVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNPVVJDRV9VSUQsIG9sZFJlc291cmNlVUlELCByZXNvdXJjZVVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFBlcmNlbnRXb3JrQ29tcGxldGUoKSB7Ci0JCXJldHVybiBwZXJjZW50V29ya0NvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBlcmNlbnRXb3JrQ29tcGxldGUoQmlnSW50ZWdlciBuZXdQZXJjZW50V29ya0NvbXBsZXRlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkUGVyY2VudFdvcmtDb21wbGV0ZSA9IHBlcmNlbnRXb3JrQ29tcGxldGU7Ci0JCXBlcmNlbnRXb3JrQ29tcGxldGUgPSBuZXdQZXJjZW50V29ya0NvbXBsZXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1BFUkNFTlRfV09SS19DT01QTEVURSwgb2xkUGVyY2VudFdvcmtDb21wbGV0ZSwgcGVyY2VudFdvcmtDb21wbGV0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldEFjdHVhbENvc3QoKSB7Ci0JCXJldHVybiBhY3R1YWxDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbENvc3QoQmlnRGVjaW1hbCBuZXdBY3R1YWxDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkQWN0dWFsQ29zdCA9IGFjdHVhbENvc3Q7Ci0JCWFjdHVhbENvc3QgPSBuZXdBY3R1YWxDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9DT1NULCBvbGRBY3R1YWxDb3N0LCBhY3R1YWxDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxGaW5pc2goKSB7Ci0JCXJldHVybiBhY3R1YWxGaW5pc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsRmluaXNoKE9iamVjdCBuZXdBY3R1YWxGaW5pc2gpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbEZpbmlzaCA9IGFjdHVhbEZpbmlzaDsKLQkJYWN0dWFsRmluaXNoID0gbmV3QWN0dWFsRmluaXNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9GSU5JU0gsIG9sZEFjdHVhbEZpbmlzaCwgYWN0dWFsRmluaXNoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkgewotCQlyZXR1cm4gYWN0dWFsT3ZlcnRpbWVDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIG5ld0FjdHVhbE92ZXJ0aW1lQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZEFjdHVhbE92ZXJ0aW1lQ29zdCA9IGFjdHVhbE92ZXJ0aW1lQ29zdDsKLQkJYWN0dWFsT3ZlcnRpbWVDb3N0ID0gbmV3QWN0dWFsT3ZlcnRpbWVDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9DT1NULCBvbGRBY3R1YWxPdmVydGltZUNvc3QsIGFjdHVhbE92ZXJ0aW1lQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkgewotCQlyZXR1cm4gYWN0dWFsT3ZlcnRpbWVXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbE92ZXJ0aW1lV29yayhPYmplY3QgbmV3QWN0dWFsT3ZlcnRpbWVXb3JrKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxPdmVydGltZVdvcmsgPSBhY3R1YWxPdmVydGltZVdvcms7Ci0JCWFjdHVhbE92ZXJ0aW1lV29yayA9IG5ld0FjdHVhbE92ZXJ0aW1lV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfV09SSywgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrLCBhY3R1YWxPdmVydGltZVdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbFN0YXJ0KCkgewotCQlyZXR1cm4gYWN0dWFsU3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsU3RhcnQoT2JqZWN0IG5ld0FjdHVhbFN0YXJ0KSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxTdGFydCA9IGFjdHVhbFN0YXJ0OwotCQlhY3R1YWxTdGFydCA9IG5ld0FjdHVhbFN0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9TVEFSVCwgb2xkQWN0dWFsU3RhcnQsIGFjdHVhbFN0YXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxXb3JrKCkgewotCQlyZXR1cm4gYWN0dWFsV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxXb3JrKE9iamVjdCBuZXdBY3R1YWxXb3JrKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxXb3JrID0gYWN0dWFsV29yazsKLQkJYWN0dWFsV29yayA9IG5ld0FjdHVhbFdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1dPUkssIG9sZEFjdHVhbFdvcmssIGFjdHVhbFdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0QUNXUCgpIHsKLQkJcmV0dXJuIGFDV1A7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QUNXUChmbG9hdCBuZXdBQ1dQKSB7Ci0JCWZsb2F0IG9sZEFDV1AgPSBhQ1dQOwotCQlhQ1dQID0gbmV3QUNXUDsKLQkJYm9vbGVhbiBvbGRBQ1dQRVNldCA9IGFDV1BFU2V0OwotCQlhQ1dQRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNXUCwgb2xkQUNXUCwgYUNXUCwgIW9sZEFDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBQ1dQKCkgewotCQlmbG9hdCBvbGRBQ1dQID0gYUNXUDsKLQkJYm9vbGVhbiBvbGRBQ1dQRVNldCA9IGFDV1BFU2V0OwotCQlhQ1dQID0gQUNXUF9FREVGQVVMVDsKLQkJYUNXUEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDV1AsIG9sZEFDV1AsIEFDV1BfRURFRkFVTFQsIG9sZEFDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRBQ1dQKCkgewotCQlyZXR1cm4gYUNXUEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25maXJtZWQoKSB7Ci0JCXJldHVybiBjb25maXJtZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uZmlybWVkKGJvb2xlYW4gbmV3Q29uZmlybWVkKSB7Ci0JCWJvb2xlYW4gb2xkQ29uZmlybWVkID0gY29uZmlybWVkOwotCQljb25maXJtZWQgPSBuZXdDb25maXJtZWQ7Ci0JCWJvb2xlYW4gb2xkQ29uZmlybWVkRVNldCA9IGNvbmZpcm1lZEVTZXQ7Ci0JCWNvbmZpcm1lZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPTkZJUk1FRCwgb2xkQ29uZmlybWVkLCBjb25maXJtZWQsICFvbGRDb25maXJtZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDb25maXJtZWQoKSB7Ci0JCWJvb2xlYW4gb2xkQ29uZmlybWVkID0gY29uZmlybWVkOwotCQlib29sZWFuIG9sZENvbmZpcm1lZEVTZXQgPSBjb25maXJtZWRFU2V0OwotCQljb25maXJtZWQgPSBDT05GSVJNRURfRURFRkFVTFQ7Ci0JCWNvbmZpcm1lZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPTkZJUk1FRCwgb2xkQ29uZmlybWVkLCBDT05GSVJNRURfRURFRkFVTFQsIG9sZENvbmZpcm1lZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldENvbmZpcm1lZCgpIHsKLQkJcmV0dXJuIGNvbmZpcm1lZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0Q29zdCgpIHsKLQkJcmV0dXJuIGNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdChCaWdEZWNpbWFsIG5ld0Nvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRDb3N0ID0gY29zdDsKLQkJY29zdCA9IG5ld0Nvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVCwgb2xkQ29zdCwgY29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldENvc3RSYXRlVGFibGUoKSB7Ci0JCXJldHVybiBjb3N0UmF0ZVRhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvc3RSYXRlVGFibGUoQmlnSW50ZWdlciBuZXdDb3N0UmF0ZVRhYmxlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkQ29zdFJhdGVUYWJsZSA9IGNvc3RSYXRlVGFibGU7Ci0JCWNvc3RSYXRlVGFibGUgPSBuZXdDb3N0UmF0ZVRhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1RfUkFURV9UQUJMRSwgb2xkQ29zdFJhdGVUYWJsZSwgY29zdFJhdGVUYWJsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRDb3N0VmFyaWFuY2UoKSB7Ci0JCXJldHVybiBjb3N0VmFyaWFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdFZhcmlhbmNlKGZsb2F0IG5ld0Nvc3RWYXJpYW5jZSkgewotCQlmbG9hdCBvbGRDb3N0VmFyaWFuY2UgPSBjb3N0VmFyaWFuY2U7Ci0JCWNvc3RWYXJpYW5jZSA9IG5ld0Nvc3RWYXJpYW5jZTsKLQkJYm9vbGVhbiBvbGRDb3N0VmFyaWFuY2VFU2V0ID0gY29zdFZhcmlhbmNlRVNldDsKLQkJY29zdFZhcmlhbmNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9WQVJJQU5DRSwgb2xkQ29zdFZhcmlhbmNlLCBjb3N0VmFyaWFuY2UsICFvbGRDb3N0VmFyaWFuY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDb3N0VmFyaWFuY2UoKSB7Ci0JCWZsb2F0IG9sZENvc3RWYXJpYW5jZSA9IGNvc3RWYXJpYW5jZTsKLQkJYm9vbGVhbiBvbGRDb3N0VmFyaWFuY2VFU2V0ID0gY29zdFZhcmlhbmNlRVNldDsKLQkJY29zdFZhcmlhbmNlID0gQ09TVF9WQVJJQU5DRV9FREVGQVVMVDsKLQkJY29zdFZhcmlhbmNlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9WQVJJQU5DRSwgb2xkQ29zdFZhcmlhbmNlLCBDT1NUX1ZBUklBTkNFX0VERUZBVUxULCBvbGRDb3N0VmFyaWFuY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRDb3N0VmFyaWFuY2UoKSB7Ci0JCXJldHVybiBjb3N0VmFyaWFuY2VFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRDVigpIHsKLQkJcmV0dXJuIGNWOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENWKGZsb2F0IG5ld0NWKSB7Ci0JCWZsb2F0IG9sZENWID0gY1Y7Ci0JCWNWID0gbmV3Q1Y7Ci0JCWJvb2xlYW4gb2xkQ1ZFU2V0ID0gY1ZFU2V0OwotCQljVkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NWLCBvbGRDViwgY1YsICFvbGRDVkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldENWKCkgewotCQlmbG9hdCBvbGRDViA9IGNWOwotCQlib29sZWFuIG9sZENWRVNldCA9IGNWRVNldDsKLQkJY1YgPSBDVl9FREVGQVVMVDsKLQkJY1ZFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DViwgb2xkQ1YsIENWX0VERUZBVUxULCBvbGRDVkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldENWKCkgewotCQlyZXR1cm4gY1ZFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldERlbGF5KCkgewotCQlyZXR1cm4gZGVsYXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVsYXkoQmlnSW50ZWdlciBuZXdEZWxheSkgewotCQlCaWdJbnRlZ2VyIG9sZERlbGF5ID0gZGVsYXk7Ci0JCWRlbGF5ID0gbmV3RGVsYXk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fREVMQVksIG9sZERlbGF5LCBkZWxheSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmluaXNoKCkgewotCQlyZXR1cm4gZmluaXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmlzaChPYmplY3QgbmV3RmluaXNoKSB7Ci0JCU9iamVjdCBvbGRGaW5pc2ggPSBmaW5pc2g7Ci0JCWZpbmlzaCA9IG5ld0ZpbmlzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19GSU5JU0gsIG9sZEZpbmlzaCwgZmluaXNoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RmluaXNoVmFyaWFuY2UoKSB7Ci0JCXJldHVybiBmaW5pc2hWYXJpYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2hWYXJpYW5jZShCaWdJbnRlZ2VyIG5ld0ZpbmlzaFZhcmlhbmNlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRmluaXNoVmFyaWFuY2UgPSBmaW5pc2hWYXJpYW5jZTsKLQkJZmluaXNoVmFyaWFuY2UgPSBuZXdGaW5pc2hWYXJpYW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19GSU5JU0hfVkFSSUFOQ0UsIG9sZEZpbmlzaFZhcmlhbmNlLCBmaW5pc2hWYXJpYW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh5cGVybGluayhTdHJpbmcgbmV3SHlwZXJsaW5rKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmsgPSBoeXBlcmxpbms7Ci0JCWh5cGVybGluayA9IG5ld0h5cGVybGluazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IWVBFUkxJTkssIG9sZEh5cGVybGluaywgaHlwZXJsaW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtBZGRyZXNzKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtBZGRyZXNzKFN0cmluZyBuZXdIeXBlcmxpbmtBZGRyZXNzKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmtBZGRyZXNzID0gaHlwZXJsaW5rQWRkcmVzczsKLQkJaHlwZXJsaW5rQWRkcmVzcyA9IG5ld0h5cGVybGlua0FkZHJlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX0FERFJFU1MsIG9sZEh5cGVybGlua0FkZHJlc3MsIGh5cGVybGlua0FkZHJlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKSB7Ci0JCXJldHVybiBoeXBlcmxpbmtTdWJBZGRyZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua1N1YkFkZHJlc3MoU3RyaW5nIG5ld0h5cGVybGlua1N1YkFkZHJlc3MpIHsKLQkJU3RyaW5nIG9sZEh5cGVybGlua1N1YkFkZHJlc3MgPSBoeXBlcmxpbmtTdWJBZGRyZXNzOwotCQloeXBlcmxpbmtTdWJBZGRyZXNzID0gbmV3SHlwZXJsaW5rU3ViQWRkcmVzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IWVBFUkxJTktfU1VCX0FERFJFU1MsIG9sZEh5cGVybGlua1N1YkFkZHJlc3MsIGh5cGVybGlua1N1YkFkZHJlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0V29ya1ZhcmlhbmNlKCkgewotCQlyZXR1cm4gd29ya1ZhcmlhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtWYXJpYW5jZShmbG9hdCBuZXdXb3JrVmFyaWFuY2UpIHsKLQkJZmxvYXQgb2xkV29ya1ZhcmlhbmNlID0gd29ya1ZhcmlhbmNlOwotCQl3b3JrVmFyaWFuY2UgPSBuZXdXb3JrVmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkV29ya1ZhcmlhbmNlRVNldCA9IHdvcmtWYXJpYW5jZUVTZXQ7Ci0JCXdvcmtWYXJpYW5jZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfVkFSSUFOQ0UsIG9sZFdvcmtWYXJpYW5jZSwgd29ya1ZhcmlhbmNlLCAhb2xkV29ya1ZhcmlhbmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0V29ya1ZhcmlhbmNlKCkgewotCQlmbG9hdCBvbGRXb3JrVmFyaWFuY2UgPSB3b3JrVmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkV29ya1ZhcmlhbmNlRVNldCA9IHdvcmtWYXJpYW5jZUVTZXQ7Ci0JCXdvcmtWYXJpYW5jZSA9IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0JCXdvcmtWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfVkFSSUFOQ0UsIG9sZFdvcmtWYXJpYW5jZSwgV09SS19WQVJJQU5DRV9FREVGQVVMVCwgb2xkV29ya1ZhcmlhbmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0V29ya1ZhcmlhbmNlKCkgewotCQlyZXR1cm4gd29ya1ZhcmlhbmNlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0hhc0ZpeGVkUmF0ZVVuaXRzKCkgewotCQlyZXR1cm4gaGFzRml4ZWRSYXRlVW5pdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGFzRml4ZWRSYXRlVW5pdHMoYm9vbGVhbiBuZXdIYXNGaXhlZFJhdGVVbml0cykgewotCQlib29sZWFuIG9sZEhhc0ZpeGVkUmF0ZVVuaXRzID0gaGFzRml4ZWRSYXRlVW5pdHM7Ci0JCWhhc0ZpeGVkUmF0ZVVuaXRzID0gbmV3SGFzRml4ZWRSYXRlVW5pdHM7Ci0JCWJvb2xlYW4gb2xkSGFzRml4ZWRSYXRlVW5pdHNFU2V0ID0gaGFzRml4ZWRSYXRlVW5pdHNFU2V0OwotCQloYXNGaXhlZFJhdGVVbml0c0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hBU19GSVhFRF9SQVRFX1VOSVRTLCBvbGRIYXNGaXhlZFJhdGVVbml0cywgaGFzRml4ZWRSYXRlVW5pdHMsICFvbGRIYXNGaXhlZFJhdGVVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEhhc0ZpeGVkUmF0ZVVuaXRzKCkgewotCQlib29sZWFuIG9sZEhhc0ZpeGVkUmF0ZVVuaXRzID0gaGFzRml4ZWRSYXRlVW5pdHM7Ci0JCWJvb2xlYW4gb2xkSGFzRml4ZWRSYXRlVW5pdHNFU2V0ID0gaGFzRml4ZWRSYXRlVW5pdHNFU2V0OwotCQloYXNGaXhlZFJhdGVVbml0cyA9IEhBU19GSVhFRF9SQVRFX1VOSVRTX0VERUZBVUxUOwotCQloYXNGaXhlZFJhdGVVbml0c0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hBU19GSVhFRF9SQVRFX1VOSVRTLCBvbGRIYXNGaXhlZFJhdGVVbml0cywgSEFTX0ZJWEVEX1JBVEVfVU5JVFNfRURFRkFVTFQsIG9sZEhhc0ZpeGVkUmF0ZVVuaXRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SGFzRml4ZWRSYXRlVW5pdHMoKSB7Ci0JCXJldHVybiBoYXNGaXhlZFJhdGVVbml0c0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGaXhlZE1hdGVyaWFsKCkgewotCQlyZXR1cm4gZml4ZWRNYXRlcmlhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaXhlZE1hdGVyaWFsKGJvb2xlYW4gbmV3Rml4ZWRNYXRlcmlhbCkgewotCQlib29sZWFuIG9sZEZpeGVkTWF0ZXJpYWwgPSBmaXhlZE1hdGVyaWFsOwotCQlmaXhlZE1hdGVyaWFsID0gbmV3Rml4ZWRNYXRlcmlhbDsKLQkJYm9vbGVhbiBvbGRGaXhlZE1hdGVyaWFsRVNldCA9IGZpeGVkTWF0ZXJpYWxFU2V0OwotCQlmaXhlZE1hdGVyaWFsRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklYRURfTUFURVJJQUwsIG9sZEZpeGVkTWF0ZXJpYWwsIGZpeGVkTWF0ZXJpYWwsICFvbGRGaXhlZE1hdGVyaWFsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Rml4ZWRNYXRlcmlhbCgpIHsKLQkJYm9vbGVhbiBvbGRGaXhlZE1hdGVyaWFsID0gZml4ZWRNYXRlcmlhbDsKLQkJYm9vbGVhbiBvbGRGaXhlZE1hdGVyaWFsRVNldCA9IGZpeGVkTWF0ZXJpYWxFU2V0OwotCQlmaXhlZE1hdGVyaWFsID0gRklYRURfTUFURVJJQUxfRURFRkFVTFQ7Ci0JCWZpeGVkTWF0ZXJpYWxFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19GSVhFRF9NQVRFUklBTCwgb2xkRml4ZWRNYXRlcmlhbCwgRklYRURfTUFURVJJQUxfRURFRkFVTFQsIG9sZEZpeGVkTWF0ZXJpYWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRGaXhlZE1hdGVyaWFsKCkgewotCQlyZXR1cm4gZml4ZWRNYXRlcmlhbEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TGV2ZWxpbmdEZWxheSgpIHsKLQkJcmV0dXJuIGxldmVsaW5nRGVsYXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV2ZWxpbmdEZWxheShCaWdJbnRlZ2VyIG5ld0xldmVsaW5nRGVsYXkpIHsKLQkJQmlnSW50ZWdlciBvbGRMZXZlbGluZ0RlbGF5ID0gbGV2ZWxpbmdEZWxheTsKLQkJbGV2ZWxpbmdEZWxheSA9IG5ld0xldmVsaW5nRGVsYXk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVksIG9sZExldmVsaW5nRGVsYXksIGxldmVsaW5nRGVsYXkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCkgewotCQlyZXR1cm4gbGV2ZWxpbmdEZWxheUZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KEJpZ0ludGVnZXIgbmV3TGV2ZWxpbmdEZWxheUZvcm1hdCkgewotCQlCaWdJbnRlZ2VyIG9sZExldmVsaW5nRGVsYXlGb3JtYXQgPSBsZXZlbGluZ0RlbGF5Rm9ybWF0OwotCQlsZXZlbGluZ0RlbGF5Rm9ybWF0ID0gbmV3TGV2ZWxpbmdEZWxheUZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MRVZFTElOR19ERUxBWV9GT1JNQVQsIG9sZExldmVsaW5nRGVsYXlGb3JtYXQsIGxldmVsaW5nRGVsYXlGb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xpbmtlZEZpZWxkcygpIHsKLQkJcmV0dXJuIGxpbmtlZEZpZWxkczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaW5rZWRGaWVsZHMoYm9vbGVhbiBuZXdMaW5rZWRGaWVsZHMpIHsKLQkJYm9vbGVhbiBvbGRMaW5rZWRGaWVsZHMgPSBsaW5rZWRGaWVsZHM7Ci0JCWxpbmtlZEZpZWxkcyA9IG5ld0xpbmtlZEZpZWxkczsKLQkJYm9vbGVhbiBvbGRMaW5rZWRGaWVsZHNFU2V0ID0gbGlua2VkRmllbGRzRVNldDsKLQkJbGlua2VkRmllbGRzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTElOS0VEX0ZJRUxEUywgb2xkTGlua2VkRmllbGRzLCBsaW5rZWRGaWVsZHMsICFvbGRMaW5rZWRGaWVsZHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRMaW5rZWRGaWVsZHMoKSB7Ci0JCWJvb2xlYW4gb2xkTGlua2VkRmllbGRzID0gbGlua2VkRmllbGRzOwotCQlib29sZWFuIG9sZExpbmtlZEZpZWxkc0VTZXQgPSBsaW5rZWRGaWVsZHNFU2V0OwotCQlsaW5rZWRGaWVsZHMgPSBMSU5LRURfRklFTERTX0VERUZBVUxUOwotCQlsaW5rZWRGaWVsZHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MSU5LRURfRklFTERTLCBvbGRMaW5rZWRGaWVsZHMsIExJTktFRF9GSUVMRFNfRURFRkFVTFQsIG9sZExpbmtlZEZpZWxkc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldExpbmtlZEZpZWxkcygpIHsKLQkJcmV0dXJuIGxpbmtlZEZpZWxkc0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNaWxlc3RvbmUoKSB7Ci0JCXJldHVybiBtaWxlc3RvbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWlsZXN0b25lKGJvb2xlYW4gbmV3TWlsZXN0b25lKSB7Ci0JCWJvb2xlYW4gb2xkTWlsZXN0b25lID0gbWlsZXN0b25lOwotCQltaWxlc3RvbmUgPSBuZXdNaWxlc3RvbmU7Ci0JCWJvb2xlYW4gb2xkTWlsZXN0b25lRVNldCA9IG1pbGVzdG9uZUVTZXQ7Ci0JCW1pbGVzdG9uZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX01JTEVTVE9ORSwgb2xkTWlsZXN0b25lLCBtaWxlc3RvbmUsICFvbGRNaWxlc3RvbmVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRNaWxlc3RvbmUoKSB7Ci0JCWJvb2xlYW4gb2xkTWlsZXN0b25lID0gbWlsZXN0b25lOwotCQlib29sZWFuIG9sZE1pbGVzdG9uZUVTZXQgPSBtaWxlc3RvbmVFU2V0OwotCQltaWxlc3RvbmUgPSBNSUxFU1RPTkVfRURFRkFVTFQ7Ci0JCW1pbGVzdG9uZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX01JTEVTVE9ORSwgb2xkTWlsZXN0b25lLCBNSUxFU1RPTkVfRURFRkFVTFQsIG9sZE1pbGVzdG9uZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1pbGVzdG9uZSgpIHsKLQkJcmV0dXJuIG1pbGVzdG9uZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb3RlcygpIHsKLQkJcmV0dXJuIG5vdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGVzKFN0cmluZyBuZXdOb3RlcykgewotCQlTdHJpbmcgb2xkTm90ZXMgPSBub3RlczsKLQkJbm90ZXMgPSBuZXdOb3RlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19OT1RFUywgb2xkTm90ZXMsIG5vdGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPdmVyYWxsb2NhdGVkKCkgewotCQlyZXR1cm4gb3ZlcmFsbG9jYXRlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVyYWxsb2NhdGVkKGJvb2xlYW4gbmV3T3ZlcmFsbG9jYXRlZCkgewotCQlib29sZWFuIG9sZE92ZXJhbGxvY2F0ZWQgPSBvdmVyYWxsb2NhdGVkOwotCQlvdmVyYWxsb2NhdGVkID0gbmV3T3ZlcmFsbG9jYXRlZDsKLQkJYm9vbGVhbiBvbGRPdmVyYWxsb2NhdGVkRVNldCA9IG92ZXJhbGxvY2F0ZWRFU2V0OwotCQlvdmVyYWxsb2NhdGVkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUkFMTE9DQVRFRCwgb2xkT3ZlcmFsbG9jYXRlZCwgb3ZlcmFsbG9jYXRlZCwgIW9sZE92ZXJhbGxvY2F0ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRPdmVyYWxsb2NhdGVkKCkgewotCQlib29sZWFuIG9sZE92ZXJhbGxvY2F0ZWQgPSBvdmVyYWxsb2NhdGVkOwotCQlib29sZWFuIG9sZE92ZXJhbGxvY2F0ZWRFU2V0ID0gb3ZlcmFsbG9jYXRlZEVTZXQ7Ci0JCW92ZXJhbGxvY2F0ZWQgPSBPVkVSQUxMT0NBVEVEX0VERUZBVUxUOwotCQlvdmVyYWxsb2NhdGVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUkFMTE9DQVRFRCwgb2xkT3ZlcmFsbG9jYXRlZCwgT1ZFUkFMTE9DQVRFRF9FREVGQVVMVCwgb2xkT3ZlcmFsbG9jYXRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE92ZXJhbGxvY2F0ZWQoKSB7Ci0JCXJldHVybiBvdmVyYWxsb2NhdGVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRPdmVydGltZUNvc3QoKSB7Ci0JCXJldHVybiBvdmVydGltZUNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgbmV3T3ZlcnRpbWVDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkT3ZlcnRpbWVDb3N0ID0gb3ZlcnRpbWVDb3N0OwotCQlvdmVydGltZUNvc3QgPSBuZXdPdmVydGltZUNvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUlRJTUVfQ09TVCwgb2xkT3ZlcnRpbWVDb3N0LCBvdmVydGltZUNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE92ZXJ0aW1lV29yaygpIHsKLQkJcmV0dXJuIG92ZXJ0aW1lV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVydGltZVdvcmsoT2JqZWN0IG5ld092ZXJ0aW1lV29yaykgewotCQlPYmplY3Qgb2xkT3ZlcnRpbWVXb3JrID0gb3ZlcnRpbWVXb3JrOwotCQlvdmVydGltZVdvcmsgPSBuZXdPdmVydGltZVdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUlRJTUVfV09SSywgb2xkT3ZlcnRpbWVXb3JrLCBvdmVydGltZVdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlZ3VsYXJXb3JrKCkgewotCQlyZXR1cm4gcmVndWxhcldvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVndWxhcldvcmsoT2JqZWN0IG5ld1JlZ3VsYXJXb3JrKSB7Ci0JCU9iamVjdCBvbGRSZWd1bGFyV29yayA9IHJlZ3VsYXJXb3JrOwotCQlyZWd1bGFyV29yayA9IG5ld1JlZ3VsYXJXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFR1VMQVJfV09SSywgb2xkUmVndWxhcldvcmssIHJlZ3VsYXJXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nQ29zdCgpIHsKLQkJcmV0dXJuIHJlbWFpbmluZ0Nvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsIG5ld1JlbWFpbmluZ0Nvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRSZW1haW5pbmdDb3N0ID0gcmVtYWluaW5nQ29zdDsKLQkJcmVtYWluaW5nQ29zdCA9IG5ld1JlbWFpbmluZ0Nvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX0NPU1QsIG9sZFJlbWFpbmluZ0Nvc3QsIHJlbWFpbmluZ0Nvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKSB7Ci0JCXJldHVybiByZW1haW5pbmdPdmVydGltZUNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgbmV3UmVtYWluaW5nT3ZlcnRpbWVDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkUmVtYWluaW5nT3ZlcnRpbWVDb3N0ID0gcmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCQlyZW1haW5pbmdPdmVydGltZUNvc3QgPSBuZXdSZW1haW5pbmdPdmVydGltZUNvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1QsIG9sZFJlbWFpbmluZ092ZXJ0aW1lQ29zdCwgcmVtYWluaW5nT3ZlcnRpbWVDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKSB7Ci0JCXJldHVybiByZW1haW5pbmdPdmVydGltZVdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKE9iamVjdCBuZXdSZW1haW5pbmdPdmVydGltZVdvcmspIHsKLQkJT2JqZWN0IG9sZFJlbWFpbmluZ092ZXJ0aW1lV29yayA9IHJlbWFpbmluZ092ZXJ0aW1lV29yazsKLQkJcmVtYWluaW5nT3ZlcnRpbWVXb3JrID0gbmV3UmVtYWluaW5nT3ZlcnRpbWVXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLLCBvbGRSZW1haW5pbmdPdmVydGltZVdvcmssIHJlbWFpbmluZ092ZXJ0aW1lV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVtYWluaW5nV29yaygpIHsKLQkJcmV0dXJuIHJlbWFpbmluZ1dvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nV29yayhPYmplY3QgbmV3UmVtYWluaW5nV29yaykgewotCQlPYmplY3Qgb2xkUmVtYWluaW5nV29yayA9IHJlbWFpbmluZ1dvcms7Ci0JCXJlbWFpbmluZ1dvcmsgPSBuZXdSZW1haW5pbmdXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19XT1JLLCBvbGRSZW1haW5pbmdXb3JrLCByZW1haW5pbmdXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZXNwb25zZVBlbmRpbmcoKSB7Ci0JCXJldHVybiByZXNwb25zZVBlbmRpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzcG9uc2VQZW5kaW5nKGJvb2xlYW4gbmV3UmVzcG9uc2VQZW5kaW5nKSB7Ci0JCWJvb2xlYW4gb2xkUmVzcG9uc2VQZW5kaW5nID0gcmVzcG9uc2VQZW5kaW5nOwotCQlyZXNwb25zZVBlbmRpbmcgPSBuZXdSZXNwb25zZVBlbmRpbmc7Ci0JCWJvb2xlYW4gb2xkUmVzcG9uc2VQZW5kaW5nRVNldCA9IHJlc3BvbnNlUGVuZGluZ0VTZXQ7Ci0JCXJlc3BvbnNlUGVuZGluZ0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU1BPTlNFX1BFTkRJTkcsIG9sZFJlc3BvbnNlUGVuZGluZywgcmVzcG9uc2VQZW5kaW5nLCAhb2xkUmVzcG9uc2VQZW5kaW5nRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmVzcG9uc2VQZW5kaW5nKCkgewotCQlib29sZWFuIG9sZFJlc3BvbnNlUGVuZGluZyA9IHJlc3BvbnNlUGVuZGluZzsKLQkJYm9vbGVhbiBvbGRSZXNwb25zZVBlbmRpbmdFU2V0ID0gcmVzcG9uc2VQZW5kaW5nRVNldDsKLQkJcmVzcG9uc2VQZW5kaW5nID0gUkVTUE9OU0VfUEVORElOR19FREVGQVVMVDsKLQkJcmVzcG9uc2VQZW5kaW5nRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTUE9OU0VfUEVORElORywgb2xkUmVzcG9uc2VQZW5kaW5nLCBSRVNQT05TRV9QRU5ESU5HX0VERUZBVUxULCBvbGRSZXNwb25zZVBlbmRpbmdFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZXNwb25zZVBlbmRpbmcoKSB7Ci0JCXJldHVybiByZXNwb25zZVBlbmRpbmdFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChPYmplY3QgbmV3U3RhcnQpIHsKLQkJT2JqZWN0IG9sZFN0YXJ0ID0gc3RhcnQ7Ci0JCXN0YXJ0ID0gbmV3U3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RBUlQsIG9sZFN0YXJ0LCBzdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U3RvcCgpIHsKLQkJcmV0dXJuIHN0b3A7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RvcChPYmplY3QgbmV3U3RvcCkgewotCQlPYmplY3Qgb2xkU3RvcCA9IHN0b3A7Ci0JCXN0b3AgPSBuZXdTdG9wOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUT1AsIG9sZFN0b3AsIHN0b3ApKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlc3VtZSgpIHsKLQkJcmV0dXJuIHJlc3VtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bWUoT2JqZWN0IG5ld1Jlc3VtZSkgewotCQlPYmplY3Qgb2xkUmVzdW1lID0gcmVzdW1lOwotCQlyZXN1bWUgPSBuZXdSZXN1bWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTVU1FLCBvbGRSZXN1bWUsIHJlc3VtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFN0YXJ0VmFyaWFuY2UoKSB7Ci0JCXJldHVybiBzdGFydFZhcmlhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0VmFyaWFuY2UoQmlnSW50ZWdlciBuZXdTdGFydFZhcmlhbmNlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkU3RhcnRWYXJpYW5jZSA9IHN0YXJ0VmFyaWFuY2U7Ci0JCXN0YXJ0VmFyaWFuY2UgPSBuZXdTdGFydFZhcmlhbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJUX1ZBUklBTkNFLCBvbGRTdGFydFZhcmlhbmNlLCBzdGFydFZhcmlhbmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldFVuaXRzKCkgewotCQlyZXR1cm4gdW5pdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5pdHMoZmxvYXQgbmV3VW5pdHMpIHsKLQkJZmxvYXQgb2xkVW5pdHMgPSB1bml0czsKLQkJdW5pdHMgPSBuZXdVbml0czsKLQkJYm9vbGVhbiBvbGRVbml0c0VTZXQgPSB1bml0c0VTZXQ7Ci0JCXVuaXRzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVU5JVFMsIG9sZFVuaXRzLCB1bml0cywgIW9sZFVuaXRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VW5pdHMoKSB7Ci0JCWZsb2F0IG9sZFVuaXRzID0gdW5pdHM7Ci0JCWJvb2xlYW4gb2xkVW5pdHNFU2V0ID0gdW5pdHNFU2V0OwotCQl1bml0cyA9IFVOSVRTX0VERUZBVUxUOwotCQl1bml0c0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VOSVRTLCBvbGRVbml0cywgVU5JVFNfRURFRkFVTFQsIG9sZFVuaXRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VW5pdHMoKSB7Ci0JCXJldHVybiB1bml0c0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVcGRhdGVOZWVkZWQoKSB7Ci0JCXJldHVybiB1cGRhdGVOZWVkZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlTmVlZGVkKGJvb2xlYW4gbmV3VXBkYXRlTmVlZGVkKSB7Ci0JCWJvb2xlYW4gb2xkVXBkYXRlTmVlZGVkID0gdXBkYXRlTmVlZGVkOwotCQl1cGRhdGVOZWVkZWQgPSBuZXdVcGRhdGVOZWVkZWQ7Ci0JCWJvb2xlYW4gb2xkVXBkYXRlTmVlZGVkRVNldCA9IHVwZGF0ZU5lZWRlZEVTZXQ7Ci0JCXVwZGF0ZU5lZWRlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VQREFURV9ORUVERUQsIG9sZFVwZGF0ZU5lZWRlZCwgdXBkYXRlTmVlZGVkLCAhb2xkVXBkYXRlTmVlZGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VXBkYXRlTmVlZGVkKCkgewotCQlib29sZWFuIG9sZFVwZGF0ZU5lZWRlZCA9IHVwZGF0ZU5lZWRlZDsKLQkJYm9vbGVhbiBvbGRVcGRhdGVOZWVkZWRFU2V0ID0gdXBkYXRlTmVlZGVkRVNldDsKLQkJdXBkYXRlTmVlZGVkID0gVVBEQVRFX05FRURFRF9FREVGQVVMVDsKLQkJdXBkYXRlTmVlZGVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVVBEQVRFX05FRURFRCwgb2xkVXBkYXRlTmVlZGVkLCBVUERBVEVfTkVFREVEX0VERUZBVUxULCBvbGRVcGRhdGVOZWVkZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRVcGRhdGVOZWVkZWQoKSB7Ci0JCXJldHVybiB1cGRhdGVOZWVkZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRWQUMoKSB7Ci0JCXJldHVybiB2QUM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VkFDKGZsb2F0IG5ld1ZBQykgewotCQlmbG9hdCBvbGRWQUMgPSB2QUM7Ci0JCXZBQyA9IG5ld1ZBQzsKLQkJYm9vbGVhbiBvbGRWQUNFU2V0ID0gdkFDRVNldDsKLQkJdkFDRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVkFDLCBvbGRWQUMsIHZBQywgIW9sZFZBQ0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFZBQygpIHsKLQkJZmxvYXQgb2xkVkFDID0gdkFDOwotCQlib29sZWFuIG9sZFZBQ0VTZXQgPSB2QUNFU2V0OwotCQl2QUMgPSBWQUNfRURFRkFVTFQ7Ci0JCXZBQ0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1ZBQywgb2xkVkFDLCBWQUNfRURFRkFVTFQsIG9sZFZBQ0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFZBQygpIHsKLQkJcmV0dXJuIHZBQ0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRXb3JrKCkgewotCQlyZXR1cm4gd29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrKE9iamVjdCBuZXdXb3JrKSB7Ci0JCU9iamVjdCBvbGRXb3JrID0gd29yazsKLQkJd29yayA9IG5ld1dvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SSywgb2xkV29yaywgd29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFdvcmtDb250b3VyKCkgewotCQlyZXR1cm4gd29ya0NvbnRvdXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29ya0NvbnRvdXIoQmlnSW50ZWdlciBuZXdXb3JrQ29udG91cikgewotCQlCaWdJbnRlZ2VyIG9sZFdvcmtDb250b3VyID0gd29ya0NvbnRvdXI7Ci0JCXdvcmtDb250b3VyID0gbmV3V29ya0NvbnRvdXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SS19DT05UT1VSLCBvbGRXb3JrQ29udG91ciwgd29ya0NvbnRvdXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QkNXUyhmbG9hdCBuZXdCQ1dTKSB7Ci0JCWZsb2F0IG9sZEJDV1MgPSBiQ1dTOwotCQliQ1dTID0gbmV3QkNXUzsKLQkJYm9vbGVhbiBvbGRCQ1dTRVNldCA9IGJDV1NFU2V0OwotCQliQ1dTRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUywgb2xkQkNXUywgYkNXUywgIW9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dTKCkgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYm9vbGVhbiBvbGRCQ1dTRVNldCA9IGJDV1NFU2V0OwotCQliQ1dTID0gQkNXU19FREVGQVVMVDsKLQkJYkNXU0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1MsIG9sZEJDV1MsIEJDV1NfRURFRkFVTFQsIG9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXU0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1AoKSB7Ci0JCXJldHVybiBiQ1dQOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1AoZmxvYXQgbmV3QkNXUCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYkNXUCA9IG5ld0JDV1A7Ci0JCWJvb2xlYW4gb2xkQkNXUEVTZXQgPSBiQ1dQRVNldDsKLQkJYkNXUEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1AsIG9sZEJDV1AsIGJDV1AsICFvbGRCQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QkNXUCgpIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJvb2xlYW4gb2xkQkNXUEVTZXQgPSBiQ1dQRVNldDsKLQkJYkNXUCA9IEJDV1BfRURFRkFVTFQ7Ci0JCWJDV1BFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQ1dQLCBvbGRCQ1dQLCBCQ1dQX0VERUZBVUxULCBvbGRCQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUCgpIHsKLQkJcmV0dXJuIGJDV1BFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEJvb2tpbmdUeXBlKCkgewotCQlyZXR1cm4gYm9va2luZ1R5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9va2luZ1R5cGUoQmlnSW50ZWdlciBuZXdCb29raW5nVHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZEJvb2tpbmdUeXBlID0gYm9va2luZ1R5cGU7Ci0JCWJvb2tpbmdUeXBlID0gbmV3Qm9va2luZ1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQk9PS0lOR19UWVBFLCBvbGRCb29raW5nVHlwZSwgYm9va2luZ1R5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKSB7Ci0JCXJldHVybiBhY3R1YWxXb3JrUHJvdGVjdGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0IG5ld0FjdHVhbFdvcmtQcm90ZWN0ZWQpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbFdvcmtQcm90ZWN0ZWQgPSBhY3R1YWxXb3JrUHJvdGVjdGVkOwotCQlhY3R1YWxXb3JrUHJvdGVjdGVkID0gbmV3QWN0dWFsV29ya1Byb3RlY3RlZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SS19QUk9URUNURUQsIG9sZEFjdHVhbFdvcmtQcm90ZWN0ZWQsIGFjdHVhbFdvcmtQcm90ZWN0ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIHsKLQkJcmV0dXJuIGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoT2JqZWN0IG5ld0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCkgewotCQlPYmplY3Qgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkID0gYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkOwotCQlhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPSBuZXdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVELCBvbGRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQsIGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRpb25EYXRlKCkgewotCQlyZXR1cm4gY3JlYXRpb25EYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyZWF0aW9uRGF0ZShPYmplY3QgbmV3Q3JlYXRpb25EYXRlKSB7Ci0JCU9iamVjdCBvbGRDcmVhdGlvbkRhdGUgPSBjcmVhdGlvbkRhdGU7Ci0JCWNyZWF0aW9uRGF0ZSA9IG5ld0NyZWF0aW9uRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DUkVBVElPTl9EQVRFLCBvbGRDcmVhdGlvbkRhdGUsIGNyZWF0aW9uRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpIHsKLQkJaWYgKGV4dGVuZGVkQXR0cmlidXRlID09IG51bGwpIHsKLQkJCWV4dGVuZGVkQXR0cmlidXRlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEV4dGVuZGVkQXR0cmlidXRlNC5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19FWFRFTkRFRF9BVFRSSUJVVEUpOwotCQl9Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QmFzZWxpbmUoKSB7Ci0JCWlmIChiYXNlbGluZSA9PSBudWxsKSB7Ci0JCQliYXNlbGluZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChCYXNlbGluZTMuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkFTRUxJTkUpOwotCQl9Ci0JCXJldHVybiBiYXNlbGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VGltZXBoYXNlZERhdGEoKSB7Ci0JCWlmICh0aW1lcGhhc2VkRGF0YSA9PSBudWxsKSB7Ci0JCQl0aW1lcGhhc2VkRGF0YSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChUaW1lcGhhc2VkRGF0YVR5cGUuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVElNRVBIQVNFRF9EQVRBKTsKLQkJfQotCQlyZXR1cm4gdGltZXBoYXNlZERhdGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JBU0VMSU5FOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEJhc2VsaW5lKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVElNRVBIQVNFRF9EQVRBOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFRpbWVwaGFzZWREYXRhKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RBU0tfVUlEOgotCQkJCXJldHVybiBnZXRUYXNrVUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTT1VSQ0VfVUlEOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZVVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlyZXR1cm4gZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBnZXRBY3R1YWxDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsRmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbE92ZXJ0aW1lQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBnZXRBY3R1YWxPdmVydGltZVdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbFN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1dPUks6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbFdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1dQOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QUNXUCgpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT05GSVJNRUQ6Ci0JCQkJcmV0dXJuIGlzQ29uZmlybWVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldENvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUX1JBVEVfVEFCTEU6Ci0JCQkJcmV0dXJuIGdldENvc3RSYXRlVGFibGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUX1ZBUklBTkNFOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0Q29zdFZhcmlhbmNlKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NWOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0Q1YoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fREVMQVk6Ci0JCQkJcmV0dXJuIGdldERlbGF5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIOgotCQkJCXJldHVybiBnZXRGaW5pc2goKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19GSU5JU0hfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIGdldEZpbmlzaFZhcmlhbmNlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LOgotCQkJCXJldHVybiBnZXRIeXBlcmxpbmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlyZXR1cm4gZ2V0SHlwZXJsaW5rQWRkcmVzcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlyZXR1cm4gZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRXb3JrVmFyaWFuY2UoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSEFTX0ZJWEVEX1JBVEVfVU5JVFM6Ci0JCQkJcmV0dXJuIGlzSGFzRml4ZWRSYXRlVW5pdHMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklYRURfTUFURVJJQUw6Ci0JCQkJcmV0dXJuIGlzRml4ZWRNYXRlcmlhbCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MRVZFTElOR19ERUxBWToKLQkJCQlyZXR1cm4gZ2V0TGV2ZWxpbmdEZWxheSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xJTktFRF9GSUVMRFM6Ci0JCQkJcmV0dXJuIGlzTGlua2VkRmllbGRzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX01JTEVTVE9ORToKLQkJCQlyZXR1cm4gaXNNaWxlc3RvbmUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTk9URVM6Ci0JCQkJcmV0dXJuIGdldE5vdGVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUkFMTE9DQVRFRDoKLQkJCQlyZXR1cm4gaXNPdmVyYWxsb2NhdGVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldE92ZXJ0aW1lQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIGdldE92ZXJ0aW1lV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFR1VMQVJfV09SSzoKLQkJCQlyZXR1cm4gZ2V0UmVndWxhcldvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfQ09TVDoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX1dPUks6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ1dvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNQT05TRV9QRU5ESU5HOgotCQkJCXJldHVybiBpc1Jlc3BvbnNlUGVuZGluZygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVEFSVDoKLQkJCQlyZXR1cm4gZ2V0U3RhcnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVE9QOgotCQkJCXJldHVybiBnZXRTdG9wKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTVU1FOgotCQkJCXJldHVybiBnZXRSZXN1bWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVEFSVF9WQVJJQU5DRToKLQkJCQlyZXR1cm4gZ2V0U3RhcnRWYXJpYW5jZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VOSVRTOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0VW5pdHMoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVVBEQVRFX05FRURFRDoKLQkJCQlyZXR1cm4gaXNVcGRhdGVOZWVkZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVkFDOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0VkFDKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUks6Ci0JCQkJcmV0dXJuIGdldFdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLX0NPTlRPVVI6Ci0JCQkJcmV0dXJuIGdldFdvcmtDb250b3VyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUzoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1MoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1AoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQk9PS0lOR19UWVBFOgotCQkJCXJldHVybiBnZXRCb29raW5nVHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ1JFQVRJT05fREFURToKLQkJCQlyZXR1cm4gZ2V0Q3JlYXRpb25EYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCXJldHVybiBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JBU0VMSU5FOgotCQkJCXJldHVybiBnZXRCYXNlbGluZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RJTUVQSEFTRURfREFUQToKLQkJCQlyZXR1cm4gZ2V0VGltZXBoYXNlZERhdGEoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVUlEOgotCQkJCXNldFVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RBU0tfVUlEOgotCQkJCXNldFRhc2tVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNPVVJDRV9VSUQ6Ci0JCQkJc2V0UmVzb3VyY2VVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19QRVJDRU5UX1dPUktfQ09NUExFVEU6Ci0JCQkJc2V0UGVyY2VudFdvcmtDb21wbGV0ZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9DT1NUOgotCQkJCXNldEFjdHVhbENvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfRklOSVNIOgotCQkJCXNldEFjdHVhbEZpbmlzaCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfU1RBUlQ6Ci0JCQkJc2V0QWN0dWFsU3RhcnQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9XT1JLOgotCQkJCXNldEFjdHVhbFdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDV1A6Ci0JCQkJc2V0QUNXUCgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT05GSVJNRUQ6Ci0JCQkJc2V0Q29uZmlybWVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUOgotCQkJCXNldENvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUX1JBVEVfVEFCTEU6Ci0JCQkJc2V0Q29zdFJhdGVUYWJsZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1RfVkFSSUFOQ0U6Ci0JCQkJc2V0Q29zdFZhcmlhbmNlKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NWOgotCQkJCXNldENWKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0RFTEFZOgotCQkJCXNldERlbGF5KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIOgotCQkJCXNldEZpbmlzaCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIX1ZBUklBTkNFOgotCQkJCXNldEZpbmlzaFZhcmlhbmNlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LOgotCQkJCXNldEh5cGVybGluaygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJc2V0SHlwZXJsaW5rQWRkcmVzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX1NVQl9BRERSRVNTOgotCQkJCXNldEh5cGVybGlua1N1YkFkZHJlc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJc2V0V29ya1ZhcmlhbmNlKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hBU19GSVhFRF9SQVRFX1VOSVRTOgotCQkJCXNldEhhc0ZpeGVkUmF0ZVVuaXRzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19GSVhFRF9NQVRFUklBTDoKLQkJCQlzZXRGaXhlZE1hdGVyaWFsKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MRVZFTElOR19ERUxBWToKLQkJCQlzZXRMZXZlbGluZ0RlbGF5KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVlfRk9STUFUOgotCQkJCXNldExldmVsaW5nRGVsYXlGb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MSU5LRURfRklFTERTOgotCQkJCXNldExpbmtlZEZpZWxkcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTUlMRVNUT05FOgotCQkJCXNldE1pbGVzdG9uZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTk9URVM6Ci0JCQkJc2V0Tm90ZXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJBTExPQ0FURUQ6Ci0JCQkJc2V0T3ZlcmFsbG9jYXRlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRPdmVydGltZUNvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSVElNRV9XT1JLOgotCQkJCXNldE92ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVHVUxBUl9XT1JLOgotCQkJCXNldFJlZ3VsYXJXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfQ09TVDoKLQkJCQlzZXRSZW1haW5pbmdDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfV09SSzoKLQkJCQlzZXRSZW1haW5pbmdXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNQT05TRV9QRU5ESU5HOgotCQkJCXNldFJlc3BvbnNlUGVuZGluZygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUT1A6Ci0JCQkJc2V0U3RvcCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTVU1FOgotCQkJCXNldFJlc3VtZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RBUlRfVkFSSUFOQ0U6Ci0JCQkJc2V0U3RhcnRWYXJpYW5jZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VOSVRTOgotCQkJCXNldFVuaXRzKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VQREFURV9ORUVERUQ6Ci0JCQkJc2V0VXBkYXRlTmVlZGVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19WQUM6Ci0JCQkJc2V0VkFDKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUks6Ci0JCQkJc2V0V29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SS19DT05UT1VSOgotCQkJCXNldFdvcmtDb250b3VyKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUzoKLQkJCQlzZXRCQ1dTKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1A6Ci0JCQkJc2V0QkNXUCgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CT09LSU5HX1RZUEU6Ci0JCQkJc2V0Qm9va2luZ1R5cGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsV29ya1Byb3RlY3RlZCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ1JFQVRJT05fREFURToKLQkJCQlzZXRDcmVhdGlvbkRhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQVNFTElORToKLQkJCQlnZXRCYXNlbGluZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0QmFzZWxpbmUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5jbGVhcigpOwotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVEFTS19VSUQ6Ci0JCQkJc2V0VGFza1VJRChUQVNLX1VJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU09VUkNFX1VJRDoKLQkJCQlzZXRSZXNvdXJjZVVJRChSRVNPVVJDRV9VSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19QRVJDRU5UX1dPUktfQ09NUExFVEU6Ci0JCQkJc2V0UGVyY2VudFdvcmtDb21wbGV0ZShQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfQ09TVDoKLQkJCQlzZXRBY3R1YWxDb3N0KEFDVFVBTF9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX0ZJTklTSDoKLQkJCQlzZXRBY3R1YWxGaW5pc2goQUNUVUFMX0ZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lQ29zdChBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29yayhBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9TVEFSVDoKLQkJCQlzZXRBY3R1YWxTdGFydChBQ1RVQUxfU1RBUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SSzoKLQkJCQlzZXRBY3R1YWxXb3JrKEFDVFVBTF9XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNXUDoKLQkJCQl1bnNldEFDV1AoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09ORklSTUVEOgotCQkJCXVuc2V0Q29uZmlybWVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1Q6Ci0JCQkJc2V0Q29zdChDT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9SQVRFX1RBQkxFOgotCQkJCXNldENvc3RSYXRlVGFibGUoQ09TVF9SQVRFX1RBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9WQVJJQU5DRToKLQkJCQl1bnNldENvc3RWYXJpYW5jZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DVjoKLQkJCQl1bnNldENWKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0RFTEFZOgotCQkJCXNldERlbGF5KERFTEFZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIOgotCQkJCXNldEZpbmlzaChGSU5JU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19GSU5JU0hfVkFSSUFOQ0U6Ci0JCQkJc2V0RmluaXNoVmFyaWFuY2UoRklOSVNIX1ZBUklBTkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LOgotCQkJCXNldEh5cGVybGluayhIWVBFUkxJTktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtBZGRyZXNzKEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX1NVQl9BRERSRVNTOgotCQkJCXNldEh5cGVybGlua1N1YkFkZHJlc3MoSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SS19WQVJJQU5DRToKLQkJCQl1bnNldFdvcmtWYXJpYW5jZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IQVNfRklYRURfUkFURV9VTklUUzoKLQkJCQl1bnNldEhhc0ZpeGVkUmF0ZVVuaXRzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJWEVEX01BVEVSSUFMOgotCQkJCXVuc2V0Rml4ZWRNYXRlcmlhbCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MRVZFTElOR19ERUxBWToKLQkJCQlzZXRMZXZlbGluZ0RlbGF5KExFVkVMSU5HX0RFTEFZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVlfRk9STUFUOgotCQkJCXNldExldmVsaW5nRGVsYXlGb3JtYXQoTEVWRUxJTkdfREVMQVlfRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTElOS0VEX0ZJRUxEUzoKLQkJCQl1bnNldExpbmtlZEZpZWxkcygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19NSUxFU1RPTkU6Ci0JCQkJdW5zZXRNaWxlc3RvbmUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTk9URVM6Ci0JCQkJc2V0Tm90ZXMoTk9URVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSQUxMT0NBVEVEOgotCQkJCXVuc2V0T3ZlcmFsbG9jYXRlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSVElNRV9DT1NUOgotCQkJCXNldE92ZXJ0aW1lQ29zdChPVkVSVElNRV9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRPdmVydGltZVdvcmsoT1ZFUlRJTUVfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFR1VMQVJfV09SSzoKLQkJCQlzZXRSZWd1bGFyV29yayhSRUdVTEFSX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfQ09TVDoKLQkJCQlzZXRSZW1haW5pbmdDb3N0KFJFTUFJTklOR19DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KFJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nV29yayhSRU1BSU5JTkdfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU1BPTlNFX1BFTkRJTkc6Ci0JCQkJdW5zZXRSZXNwb25zZVBlbmRpbmcoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoU1RBUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVE9QOgotCQkJCXNldFN0b3AoU1RPUF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU1VNRToKLQkJCQlzZXRSZXN1bWUoUkVTVU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RBUlRfVkFSSUFOQ0U6Ci0JCQkJc2V0U3RhcnRWYXJpYW5jZShTVEFSVF9WQVJJQU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VOSVRTOgotCQkJCXVuc2V0VW5pdHMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVVBEQVRFX05FRURFRDoKLQkJCQl1bnNldFVwZGF0ZU5lZWRlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19WQUM6Ci0JCQkJdW5zZXRWQUMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SSzoKLQkJCQlzZXRXb3JrKFdPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLX0NPTlRPVVI6Ci0JCQkJc2V0V29ya0NvbnRvdXIoV09SS19DT05UT1VSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUzoKLQkJCQl1bnNldEJDV1MoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUDoKLQkJCQl1bnNldEJDV1AoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQk9PS0lOR19UWVBFOgotCQkJCXNldEJvb2tpbmdUeXBlKEJPT0tJTkdfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRDoKLQkJCQlzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKEFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ1JFQVRJT05fREFURToKLQkJCQlzZXRDcmVhdGlvbkRhdGUoQ1JFQVRJT05fREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JBU0VMSU5FOgotCQkJCWdldEJhc2VsaW5lKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVElNRVBIQVNFRF9EQVRBOgotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VSUQ6Ci0JCQkJcmV0dXJuIFVJRF9FREVGQVVMVCA9PSBudWxsID8gdUlEICE9IG51bGwgOiAhVUlEX0VERUZBVUxULmVxdWFscyh1SUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RBU0tfVUlEOgotCQkJCXJldHVybiBUQVNLX1VJRF9FREVGQVVMVCA9PSBudWxsID8gdGFza1VJRCAhPSBudWxsIDogIVRBU0tfVUlEX0VERUZBVUxULmVxdWFscyh0YXNrVUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNPVVJDRV9VSUQ6Ci0JCQkJcmV0dXJuIFJFU09VUkNFX1VJRF9FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VVSUQgIT0gbnVsbCA6ICFSRVNPVVJDRV9VSURfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlVUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19QRVJDRU5UX1dPUktfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIFBFUkNFTlRfV09SS19DT01QTEVURV9FREVGQVVMVCA9PSBudWxsID8gcGVyY2VudFdvcmtDb21wbGV0ZSAhPSBudWxsIDogIVBFUkNFTlRfV09SS19DT01QTEVURV9FREVGQVVMVC5lcXVhbHMocGVyY2VudFdvcmtDb21wbGV0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX0NPU1Q6Ci0JCQkJcmV0dXJuIEFDVFVBTF9DT1NUX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxDb3N0ICE9IG51bGwgOiAhQUNUVUFMX0NPU1RfRURFRkFVTFQuZXF1YWxzKGFjdHVhbENvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9GSU5JU0g6Ci0JCQkJcmV0dXJuIEFDVFVBTF9GSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbEZpbmlzaCAhPSBudWxsIDogIUFDVFVBTF9GSU5JU0hfRURFRkFVTFQuZXF1YWxzKGFjdHVhbEZpbmlzaCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxPdmVydGltZUNvc3QgIT0gbnVsbCA6ICFBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsT3ZlcnRpbWVDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbE92ZXJ0aW1lV29yayAhPSBudWxsIDogIUFDVFVBTF9PVkVSVElNRV9XT1JLX0VERUZBVUxULmVxdWFscyhhY3R1YWxPdmVydGltZVdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9TVEFSVDoKLQkJCQlyZXR1cm4gQUNUVUFMX1NUQVJUX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxTdGFydCAhPSBudWxsIDogIUFDVFVBTF9TVEFSVF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsU3RhcnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9XT1JLOgotCQkJCXJldHVybiBBQ1RVQUxfV09SS19FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsV29yayAhPSBudWxsIDogIUFDVFVBTF9XT1JLX0VERUZBVUxULmVxdWFscyhhY3R1YWxXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1dQOgotCQkJCXJldHVybiBpc1NldEFDV1AoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT05GSVJNRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0Q29uZmlybWVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVDoKLQkJCQlyZXR1cm4gQ09TVF9FREVGQVVMVCA9PSBudWxsID8gY29zdCAhPSBudWxsIDogIUNPU1RfRURFRkFVTFQuZXF1YWxzKGNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1RfUkFURV9UQUJMRToKLQkJCQlyZXR1cm4gQ09TVF9SQVRFX1RBQkxFX0VERUZBVUxUID09IG51bGwgPyBjb3N0UmF0ZVRhYmxlICE9IG51bGwgOiAhQ09TVF9SQVRFX1RBQkxFX0VERUZBVUxULmVxdWFscyhjb3N0UmF0ZVRhYmxlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUX1ZBUklBTkNFOgotCQkJCXJldHVybiBpc1NldENvc3RWYXJpYW5jZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NWOgotCQkJCXJldHVybiBpc1NldENWKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fREVMQVk6Ci0JCQkJcmV0dXJuIERFTEFZX0VERUZBVUxUID09IG51bGwgPyBkZWxheSAhPSBudWxsIDogIURFTEFZX0VERUZBVUxULmVxdWFscyhkZWxheSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIOgotCQkJCXJldHVybiBGSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaCAhPSBudWxsIDogIUZJTklTSF9FREVGQVVMVC5lcXVhbHMoZmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19GSU5JU0hfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVCA9PSBudWxsID8gZmluaXNoVmFyaWFuY2UgIT0gbnVsbCA6ICFGSU5JU0hfVkFSSUFOQ0VfRURFRkFVTFQuZXF1YWxzKGZpbmlzaFZhcmlhbmNlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IWVBFUkxJTks6Ci0JCQkJcmV0dXJuIEhZUEVSTElOS19FREVGQVVMVCA9PSBudWxsID8gaHlwZXJsaW5rICE9IG51bGwgOiAhSFlQRVJMSU5LX0VERUZBVUxULmVxdWFscyhoeXBlcmxpbmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOS19BRERSRVNTOgotCQkJCXJldHVybiBIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVCA9PSBudWxsID8gaHlwZXJsaW5rQWRkcmVzcyAhPSBudWxsIDogIUhZUEVSTElOS19BRERSRVNTX0VERUZBVUxULmVxdWFscyhoeXBlcmxpbmtBZGRyZXNzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IWVBFUkxJTktfU1VCX0FERFJFU1M6Ci0JCQkJcmV0dXJuIEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVCA9PSBudWxsID8gaHlwZXJsaW5rU3ViQWRkcmVzcyAhPSBudWxsIDogIUhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVC5lcXVhbHMoaHlwZXJsaW5rU3ViQWRkcmVzcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SS19WQVJJQU5DRToKLQkJCQlyZXR1cm4gaXNTZXRXb3JrVmFyaWFuY2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IQVNfRklYRURfUkFURV9VTklUUzoKLQkJCQlyZXR1cm4gaXNTZXRIYXNGaXhlZFJhdGVVbml0cygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJWEVEX01BVEVSSUFMOgotCQkJCXJldHVybiBpc1NldEZpeGVkTWF0ZXJpYWwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MRVZFTElOR19ERUxBWToKLQkJCQlyZXR1cm4gTEVWRUxJTkdfREVMQVlfRURFRkFVTFQgPT0gbnVsbCA/IGxldmVsaW5nRGVsYXkgIT0gbnVsbCA6ICFMRVZFTElOR19ERUxBWV9FREVGQVVMVC5lcXVhbHMobGV2ZWxpbmdEZWxheSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVlfRk9STUFUOgotCQkJCXJldHVybiBMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGxldmVsaW5nRGVsYXlGb3JtYXQgIT0gbnVsbCA6ICFMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQuZXF1YWxzKGxldmVsaW5nRGVsYXlGb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xJTktFRF9GSUVMRFM6Ci0JCQkJcmV0dXJuIGlzU2V0TGlua2VkRmllbGRzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTUlMRVNUT05FOgotCQkJCXJldHVybiBpc1NldE1pbGVzdG9uZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX05PVEVTOgotCQkJCXJldHVybiBOT1RFU19FREVGQVVMVCA9PSBudWxsID8gbm90ZXMgIT0gbnVsbCA6ICFOT1RFU19FREVGQVVMVC5lcXVhbHMobm90ZXMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJBTExPQ0FURUQ6Ci0JCQkJcmV0dXJuIGlzU2V0T3ZlcmFsbG9jYXRlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIE9WRVJUSU1FX0NPU1RfRURFRkFVTFQgPT0gbnVsbCA/IG92ZXJ0aW1lQ29zdCAhPSBudWxsIDogIU9WRVJUSU1FX0NPU1RfRURFRkFVTFQuZXF1YWxzKG92ZXJ0aW1lQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9PSBudWxsID8gb3ZlcnRpbWVXb3JrICE9IG51bGwgOiAhT1ZFUlRJTUVfV09SS19FREVGQVVMVC5lcXVhbHMob3ZlcnRpbWVXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRUdVTEFSX1dPUks6Ci0JCQkJcmV0dXJuIFJFR1VMQVJfV09SS19FREVGQVVMVCA9PSBudWxsID8gcmVndWxhcldvcmsgIT0gbnVsbCA6ICFSRUdVTEFSX1dPUktfRURFRkFVTFQuZXF1YWxzKHJlZ3VsYXJXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfQ09TVDoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ0Nvc3QgIT0gbnVsbCA6ICFSRU1BSU5JTkdfQ09TVF9FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdPdmVydGltZUNvc3QgIT0gbnVsbCA6ICFSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nT3ZlcnRpbWVDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ092ZXJ0aW1lV29yayAhPSBudWxsIDogIVJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdPdmVydGltZVdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19XT1JLOgotCQkJCXJldHVybiBSRU1BSU5JTkdfV09SS19FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nV29yayAhPSBudWxsIDogIVJFTUFJTklOR19XT1JLX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNQT05TRV9QRU5ESU5HOgotCQkJCXJldHVybiBpc1NldFJlc3BvbnNlUGVuZGluZygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJUOgotCQkJCXJldHVybiBTVEFSVF9FREVGQVVMVCA9PSBudWxsID8gc3RhcnQgIT0gbnVsbCA6ICFTVEFSVF9FREVGQVVMVC5lcXVhbHMoc3RhcnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUT1A6Ci0JCQkJcmV0dXJuIFNUT1BfRURFRkFVTFQgPT0gbnVsbCA/IHN0b3AgIT0gbnVsbCA6ICFTVE9QX0VERUZBVUxULmVxdWFscyhzdG9wKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNVTUU6Ci0JCQkJcmV0dXJuIFJFU1VNRV9FREVGQVVMVCA9PSBudWxsID8gcmVzdW1lICE9IG51bGwgOiAhUkVTVU1FX0VERUZBVUxULmVxdWFscyhyZXN1bWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJUX1ZBUklBTkNFOgotCQkJCXJldHVybiBTVEFSVF9WQVJJQU5DRV9FREVGQVVMVCA9PSBudWxsID8gc3RhcnRWYXJpYW5jZSAhPSBudWxsIDogIVNUQVJUX1ZBUklBTkNFX0VERUZBVUxULmVxdWFscyhzdGFydFZhcmlhbmNlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VTklUUzoKLQkJCQlyZXR1cm4gaXNTZXRVbml0cygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VQREFURV9ORUVERUQ6Ci0JCQkJcmV0dXJuIGlzU2V0VXBkYXRlTmVlZGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVkFDOgotCQkJCXJldHVybiBpc1NldFZBQygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUks6Ci0JCQkJcmV0dXJuIFdPUktfRURFRkFVTFQgPT0gbnVsbCA/IHdvcmsgIT0gbnVsbCA6ICFXT1JLX0VERUZBVUxULmVxdWFscyh3b3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLX0NPTlRPVVI6Ci0JCQkJcmV0dXJuIFdPUktfQ09OVE9VUl9FREVGQVVMVCA9PSBudWxsID8gd29ya0NvbnRvdXIgIT0gbnVsbCA6ICFXT1JLX0NPTlRPVVJfRURFRkFVTFQuZXF1YWxzKHdvcmtDb250b3VyKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQ1dTOgotCQkJCXJldHVybiBpc1NldEJDV1MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQ1dQOgotCQkJCXJldHVybiBpc1NldEJDV1AoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CT09LSU5HX1RZUEU6Ci0JCQkJcmV0dXJuIEJPT0tJTkdfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gYm9va2luZ1R5cGUgIT0gbnVsbCA6ICFCT09LSU5HX1RZUEVfRURFRkFVTFQuZXF1YWxzKGJvb2tpbmdUeXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJcmV0dXJuIEFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsV29ya1Byb3RlY3RlZCAhPSBudWxsIDogIUFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsV29ya1Byb3RlY3RlZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCAhPSBudWxsIDogIUFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DUkVBVElPTl9EQVRFOgotCQkJCXJldHVybiBDUkVBVElPTl9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjcmVhdGlvbkRhdGUgIT0gbnVsbCA6ICFDUkVBVElPTl9EQVRFX0VERUZBVUxULmVxdWFscyhjcmVhdGlvbkRhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGUgIT0gbnVsbCAmJiAhZXh0ZW5kZWRBdHRyaWJ1dGUuaXNFbXB0eSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JBU0VMSU5FOgotCQkJCXJldHVybiBiYXNlbGluZSAhPSBudWxsICYmICFiYXNlbGluZS5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVElNRVBIQVNFRF9EQVRBOgotCQkJCXJldHVybiB0aW1lcGhhc2VkRGF0YSAhPSBudWxsICYmICF0aW1lcGhhc2VkRGF0YS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1SUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdGFza1VJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGFza1VJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzb3VyY2VVSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlc291cmNlVUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwZXJjZW50V29ya0NvbXBsZXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwZXJjZW50V29ya0NvbXBsZXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxGaW5pc2g6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbEZpbmlzaCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsT3ZlcnRpbWVDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxPdmVydGltZUNvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbE92ZXJ0aW1lV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsT3ZlcnRpbWVXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxTdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsU3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbFdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbFdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFDV1A6ICIpOwotCQlpZiAoYUNXUEVTZXQpIHJlc3VsdC5hcHBlbmQoYUNXUCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbmZpcm1lZDogIik7Ci0JCWlmIChjb25maXJtZWRFU2V0KSByZXN1bHQuYXBwZW5kKGNvbmZpcm1lZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvc3RSYXRlVGFibGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvc3RSYXRlVGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvc3RWYXJpYW5jZTogIik7Ci0JCWlmIChjb3N0VmFyaWFuY2VFU2V0KSByZXN1bHQuYXBwZW5kKGNvc3RWYXJpYW5jZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNWOiAiKTsKLQkJaWYgKGNWRVNldCkgcmVzdWx0LmFwcGVuZChjVik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlbGF5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWxheSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmluaXNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaW5pc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaFZhcmlhbmNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaW5pc2hWYXJpYW5jZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaHlwZXJsaW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoeXBlcmxpbmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGlua0FkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh5cGVybGlua0FkZHJlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGlua1N1YkFkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh5cGVybGlua1N1YkFkZHJlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcmtWYXJpYW5jZTogIik7Ci0JCWlmICh3b3JrVmFyaWFuY2VFU2V0KSByZXN1bHQuYXBwZW5kKHdvcmtWYXJpYW5jZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGhhc0ZpeGVkUmF0ZVVuaXRzOiAiKTsKLQkJaWYgKGhhc0ZpeGVkUmF0ZVVuaXRzRVNldCkgcmVzdWx0LmFwcGVuZChoYXNGaXhlZFJhdGVVbml0cyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpeGVkTWF0ZXJpYWw6ICIpOwotCQlpZiAoZml4ZWRNYXRlcmlhbEVTZXQpIHJlc3VsdC5hcHBlbmQoZml4ZWRNYXRlcmlhbCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxldmVsaW5nRGVsYXk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxldmVsaW5nRGVsYXkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxldmVsaW5nRGVsYXlGb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxldmVsaW5nRGVsYXlGb3JtYXQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxpbmtlZEZpZWxkczogIik7Ci0JCWlmIChsaW5rZWRGaWVsZHNFU2V0KSByZXN1bHQuYXBwZW5kKGxpbmtlZEZpZWxkcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1pbGVzdG9uZTogIik7Ci0JCWlmIChtaWxlc3RvbmVFU2V0KSByZXN1bHQuYXBwZW5kKG1pbGVzdG9uZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vdGVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChub3Rlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlcmFsbG9jYXRlZDogIik7Ci0JCWlmIChvdmVyYWxsb2NhdGVkRVNldCkgcmVzdWx0LmFwcGVuZChvdmVyYWxsb2NhdGVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlcnRpbWVDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvdmVydGltZUNvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZWd1bGFyV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVndWxhcldvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ0Nvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ0Nvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ092ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtYWluaW5nT3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdPdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ092ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVtYWluaW5nV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtYWluaW5nV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzcG9uc2VQZW5kaW5nOiAiKTsKLQkJaWYgKHJlc3BvbnNlUGVuZGluZ0VTZXQpIHJlc3VsdC5hcHBlbmQocmVzcG9uc2VQZW5kaW5nKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdG9wOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdG9wKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXN1bWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlc3VtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhcnRWYXJpYW5jZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhcnRWYXJpYW5jZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdW5pdHM6ICIpOwotCQlpZiAodW5pdHNFU2V0KSByZXN1bHQuYXBwZW5kKHVuaXRzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdXBkYXRlTmVlZGVkOiAiKTsKLQkJaWYgKHVwZGF0ZU5lZWRlZEVTZXQpIHJlc3VsdC5hcHBlbmQodXBkYXRlTmVlZGVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdkFDOiAiKTsKLQkJaWYgKHZBQ0VTZXQpIHJlc3VsdC5hcHBlbmQodkFDKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQod29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd29ya0NvbnRvdXI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdvcmtDb250b3VyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dTOiAiKTsKLQkJaWYgKGJDV1NFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1MpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dQOiAiKTsKLQkJaWYgKGJDV1BFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1ApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBib29raW5nVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYm9va2luZ1R5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbFdvcmtQcm90ZWN0ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbFdvcmtQcm90ZWN0ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjcmVhdGlvbkRhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNyZWF0aW9uRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Fzc2lnbm1lbnRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQXNzaWdubWVudHNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQXNzaWdubWVudHNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMjU2NzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Fzc2lnbm1lbnRzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXNzaWdubWVudHNJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXNzaWdubWVudHM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50c0ltcGwjZ2V0QXNzaWdubWVudCA8ZW0+QXNzaWdubWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFzc2lnbm1lbnRzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQXNzaWdubWVudHMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFzc2lnbm1lbnQoKSA8ZW0+QXNzaWdubWVudDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYXNzaWdubWVudCA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXNzaWdubWVudHNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXNzaWdubWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QXNzaWdubWVudCgpIHsKLQkJaWYgKGFzc2lnbm1lbnQgPT0gbnVsbCkgewotCQkJYXNzaWdubWVudCA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChBc3NpZ25tZW50LmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRTX19BU1NJR05NRU5UKTsKLQkJfQotCQlyZXR1cm4gYXNzaWdubWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVFNfX0FTU0lHTk1FTlQ6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QXNzaWdubWVudCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVFNfX0FTU0lHTk1FTlQ6Ci0JCQkJcmV0dXJuIGdldEFzc2lnbm1lbnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVFNfX0FTU0lHTk1FTlQ6Ci0JCQkJZ2V0QXNzaWdubWVudCgpLmNsZWFyKCk7Ci0JCQkJZ2V0QXNzaWdubWVudCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UU19fQVNTSUdOTUVOVDoKLQkJCQlnZXRBc3NpZ25tZW50KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UU19fQVNTSUdOTUVOVDoKLQkJCQlyZXR1cm4gYXNzaWdubWVudCAhPSBudWxsICYmICFhc3NpZ25tZW50LmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vQXNzaWdubWVudHNJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQXZhaWxhYmlsaXR5UGVyaW9kSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0F2YWlsYWJpbGl0eVBlcmlvZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg2MGJhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQXZhaWxhYmlsaXR5UGVyaW9kSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXZhaWxhYmlsaXR5UGVyaW9kSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5BdmFpbGFiaWxpdHlQZXJpb2RJbXBsI2dldEF2YWlsYWJsZUZyb20gPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXZhaWxhYmlsaXR5UGVyaW9kSW1wbCNnZXRBdmFpbGFibGVUbyA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXZhaWxhYmlsaXR5UGVyaW9kSW1wbCNnZXRBdmFpbGFibGVVbml0cyA8ZW0+QXZhaWxhYmxlIFVuaXRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXZhaWxhYmlsaXR5UGVyaW9kSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQXZhaWxhYmlsaXR5UGVyaW9kIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXZhaWxhYmxlRnJvbSgpIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlRnJvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQVZBSUxBQkxFX0ZST01fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXZhaWxhYmxlRnJvbSgpIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlRnJvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhdmFpbGFibGVGcm9tID0gQVZBSUxBQkxFX0ZST01fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXZhaWxhYmxlVG8oKSA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdmFpbGFibGVUbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQVZBSUxBQkxFX1RPX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZVRvKCkgPGVtPkF2YWlsYWJsZSBUbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVG8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYXZhaWxhYmxlVG8gPSBBVkFJTEFCTEVfVE9fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXZhaWxhYmxlVW5pdHMoKSA8ZW0+QXZhaWxhYmxlIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdmFpbGFibGVVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBBVkFJTEFCTEVfVU5JVFNfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXZhaWxhYmxlVW5pdHMoKSA8ZW0+QXZhaWxhYmxlIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdmFpbGFibGVVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGF2YWlsYWJsZVVuaXRzID0gQVZBSUxBQkxFX1VOSVRTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBdmFpbGFibGUgVW5pdHMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGF2YWlsYWJsZVVuaXRzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEF2YWlsYWJpbGl0eVBlcmlvZEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdmFpbGFiaWxpdHlQZXJpb2QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF2YWlsYWJsZUZyb20oKSB7Ci0JCXJldHVybiBhdmFpbGFibGVGcm9tOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF2YWlsYWJsZUZyb20oT2JqZWN0IG5ld0F2YWlsYWJsZUZyb20pIHsKLQkJT2JqZWN0IG9sZEF2YWlsYWJsZUZyb20gPSBhdmFpbGFibGVGcm9tOwotCQlhdmFpbGFibGVGcm9tID0gbmV3QXZhaWxhYmxlRnJvbTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfRlJPTSwgb2xkQXZhaWxhYmxlRnJvbSwgYXZhaWxhYmxlRnJvbSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QXZhaWxhYmxlVG8oKSB7Ci0JCXJldHVybiBhdmFpbGFibGVUbzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdmFpbGFibGVUbyhPYmplY3QgbmV3QXZhaWxhYmxlVG8pIHsKLQkJT2JqZWN0IG9sZEF2YWlsYWJsZVRvID0gYXZhaWxhYmxlVG87Ci0JCWF2YWlsYWJsZVRvID0gbmV3QXZhaWxhYmxlVG87Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1RPLCBvbGRBdmFpbGFibGVUbywgYXZhaWxhYmxlVG8pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0QXZhaWxhYmxlVW5pdHMoKSB7Ci0JCXJldHVybiBhdmFpbGFibGVVbml0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdmFpbGFibGVVbml0cyhmbG9hdCBuZXdBdmFpbGFibGVVbml0cykgewotCQlmbG9hdCBvbGRBdmFpbGFibGVVbml0cyA9IGF2YWlsYWJsZVVuaXRzOwotCQlhdmFpbGFibGVVbml0cyA9IG5ld0F2YWlsYWJsZVVuaXRzOwotCQlib29sZWFuIG9sZEF2YWlsYWJsZVVuaXRzRVNldCA9IGF2YWlsYWJsZVVuaXRzRVNldDsKLQkJYXZhaWxhYmxlVW5pdHNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVU5JVFMsIG9sZEF2YWlsYWJsZVVuaXRzLCBhdmFpbGFibGVVbml0cywgIW9sZEF2YWlsYWJsZVVuaXRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QXZhaWxhYmxlVW5pdHMoKSB7Ci0JCWZsb2F0IG9sZEF2YWlsYWJsZVVuaXRzID0gYXZhaWxhYmxlVW5pdHM7Ci0JCWJvb2xlYW4gb2xkQXZhaWxhYmxlVW5pdHNFU2V0ID0gYXZhaWxhYmxlVW5pdHNFU2V0OwotCQlhdmFpbGFibGVVbml0cyA9IEFWQUlMQUJMRV9VTklUU19FREVGQVVMVDsKLQkJYXZhaWxhYmxlVW5pdHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVU5JVFMsIG9sZEF2YWlsYWJsZVVuaXRzLCBBVkFJTEFCTEVfVU5JVFNfRURFRkFVTFQsIG9sZEF2YWlsYWJsZVVuaXRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QXZhaWxhYmxlVW5pdHMoKSB7Ci0JCXJldHVybiBhdmFpbGFibGVVbml0c0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9GUk9NOgotCQkJCXJldHVybiBnZXRBdmFpbGFibGVGcm9tKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1RPOgotCQkJCXJldHVybiBnZXRBdmFpbGFibGVUbygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9VTklUUzoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEF2YWlsYWJsZVVuaXRzKCkpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfRlJPTToKLQkJCQlzZXRBdmFpbGFibGVGcm9tKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVE86Ci0JCQkJc2V0QXZhaWxhYmxlVG8oKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9VTklUUzoKLQkJCQlzZXRBdmFpbGFibGVVbml0cygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX0ZST006Ci0JCQkJc2V0QXZhaWxhYmxlRnJvbShBVkFJTEFCTEVfRlJPTV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9UTzoKLQkJCQlzZXRBdmFpbGFibGVUbyhBVkFJTEFCTEVfVE9fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVU5JVFM6Ci0JCQkJdW5zZXRBdmFpbGFibGVVbml0cygpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9GUk9NOgotCQkJCXJldHVybiBBVkFJTEFCTEVfRlJPTV9FREVGQVVMVCA9PSBudWxsID8gYXZhaWxhYmxlRnJvbSAhPSBudWxsIDogIUFWQUlMQUJMRV9GUk9NX0VERUZBVUxULmVxdWFscyhhdmFpbGFibGVGcm9tKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVE86Ci0JCQkJcmV0dXJuIEFWQUlMQUJMRV9UT19FREVGQVVMVCA9PSBudWxsID8gYXZhaWxhYmxlVG8gIT0gbnVsbCA6ICFBVkFJTEFCTEVfVE9fRURFRkFVTFQuZXF1YWxzKGF2YWlsYWJsZVRvKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVU5JVFM6Ci0JCQkJcmV0dXJuIGlzU2V0QXZhaWxhYmxlVW5pdHMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF2YWlsYWJsZUZyb206ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF2YWlsYWJsZUZyb20pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF2YWlsYWJsZVRvOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdmFpbGFibGVUbyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXZhaWxhYmxlVW5pdHM6ICIpOwotCQlpZiAoYXZhaWxhYmxlVW5pdHNFU2V0KSByZXN1bHQuYXBwZW5kKGF2YWlsYWJsZVVuaXRzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0F2YWlsYWJpbGl0eVBlcmlvZEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9BdmFpbGFiaWxpdHlQZXJpb2RzSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0F2YWlsYWJpbGl0eVBlcmlvZHNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNjU0ODEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0F2YWlsYWJpbGl0eVBlcmlvZHNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBdmFpbGFiaWxpdHlQZXJpb2RzSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdmFpbGFiaWxpdHkgUGVyaW9kczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkF2YWlsYWJpbGl0eVBlcmlvZHNJbXBsI2dldEF2YWlsYWJpbGl0eVBlcmlvZCA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEF2YWlsYWJpbGl0eVBlcmlvZHNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBBdmFpbGFiaWxpdHlQZXJpb2RzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKSA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhdmFpbGFiaWxpdHlQZXJpb2QgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEF2YWlsYWJpbGl0eVBlcmlvZHNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKSB7Ci0JCWlmIChhdmFpbGFiaWxpdHlQZXJpb2QgPT0gbnVsbCkgewotCQkJYXZhaWxhYmlsaXR5UGVyaW9kID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEF2YWlsYWJpbGl0eVBlcmlvZC5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EU19fQVZBSUxBQklMSVRZX1BFUklPRCk7Ci0JCX0KLQkJcmV0dXJuIGF2YWlsYWJpbGl0eVBlcmlvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRFNfX0FWQUlMQUJJTElUWV9QRVJJT0Q6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EU19fQVZBSUxBQklMSVRZX1BFUklPRDoKLQkJCQlyZXR1cm4gZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RTX19BVkFJTEFCSUxJVFlfUEVSSU9EOgotCQkJCWdldEF2YWlsYWJpbGl0eVBlcmlvZCgpLmNsZWFyKCk7Ci0JCQkJZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RTX19BVkFJTEFCSUxJVFlfUEVSSU9EOgotCQkJCWdldEF2YWlsYWJpbGl0eVBlcmlvZCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRFNfX0FWQUlMQUJJTElUWV9QRVJJT0Q6Ci0JCQkJcmV0dXJuIGF2YWlsYWJpbGl0eVBlcmlvZCAhPSBudWxsICYmICFhdmFpbGFiaWxpdHlQZXJpb2QuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9BdmFpbGFiaWxpdHlQZXJpb2RzSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Jhc2VsaW5lMkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9CYXNlbGluZTJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZGMzZDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Jhc2VsaW5lMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJhc2VsaW5lMkltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2VsaW5lMjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lMkltcGwjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTJJbXBsI2dldFdvcmsgPGVtPldvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTJJbXBsI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTJJbXBsI2dldEJDV1MgPGVtPkJDV1M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTJJbXBsI2dldEJDV1AgPGVtPkJDV1A8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlbGluZTJJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBCYXNlbGluZTIgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdW1iZXIoKSA8ZW0+TnVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBOVU1CRVJfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TnVtYmVyKCkgPGVtPk51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TnVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBudW1iZXIgPSBOVU1CRVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBXT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCB3b3JrID0gV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQ09TVF9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBjb3N0ID0gQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ29zdCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29zdEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dTID0gQkNXU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXU0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXUF9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dQID0gQkNXUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXUEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBCYXNlbGluZTJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmFzZWxpbmUyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TnVtYmVyKCkgewotCQlyZXR1cm4gbnVtYmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE51bWJlcihCaWdJbnRlZ2VyIG5ld051bWJlcikgewotCQlCaWdJbnRlZ2VyIG9sZE51bWJlciA9IG51bWJlcjsKLQkJbnVtYmVyID0gbmV3TnVtYmVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fTlVNQkVSLCBvbGROdW1iZXIsIG51bWJlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0V29yaygpIHsKLQkJcmV0dXJuIHdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29yayhPYmplY3QgbmV3V29yaykgewotCQlPYmplY3Qgb2xkV29yayA9IHdvcms7Ci0JCXdvcmsgPSBuZXdXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fV09SSywgb2xkV29yaywgd29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRDb3N0KCkgewotCQlyZXR1cm4gY29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3N0KGZsb2F0IG5ld0Nvc3QpIHsKLQkJZmxvYXQgb2xkQ29zdCA9IGNvc3Q7Ci0JCWNvc3QgPSBuZXdDb3N0OwotCQlib29sZWFuIG9sZENvc3RFU2V0ID0gY29zdEVTZXQ7Ci0JCWNvc3RFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0NPU1QsIG9sZENvc3QsIGNvc3QsICFvbGRDb3N0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q29zdCgpIHsKLQkJZmxvYXQgb2xkQ29zdCA9IGNvc3Q7Ci0JCWJvb2xlYW4gb2xkQ29zdEVTZXQgPSBjb3N0RVNldDsKLQkJY29zdCA9IENPU1RfRURFRkFVTFQ7Ci0JCWNvc3RFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0NPU1QsIG9sZENvc3QsIENPU1RfRURFRkFVTFQsIG9sZENvc3RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRDb3N0KCkgewotCQlyZXR1cm4gY29zdEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1MoKSB7Ci0JCXJldHVybiBiQ1dTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1MoZmxvYXQgbmV3QkNXUykgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYkNXUyA9IG5ld0JDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXU0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUywgb2xkQkNXUywgYkNXUywgIW9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dTKCkgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYm9vbGVhbiBvbGRCQ1dTRVNldCA9IGJDV1NFU2V0OwotCQliQ1dTID0gQkNXU19FREVGQVVMVDsKLQkJYkNXU0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUywgb2xkQkNXUywgQkNXU19FREVGQVVMVCwgb2xkQkNXU0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEJDV1MoKSB7Ci0JCXJldHVybiBiQ1dTRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0QkNXUCgpIHsKLQkJcmV0dXJuIGJDV1A7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QkNXUChmbG9hdCBuZXdCQ1dQKSB7Ci0JCWZsb2F0IG9sZEJDV1AgPSBiQ1dQOwotCQliQ1dQID0gbmV3QkNXUDsKLQkJYm9vbGVhbiBvbGRCQ1dQRVNldCA9IGJDV1BFU2V0OwotCQliQ1dQRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19CQ1dQLCBvbGRCQ1dQLCBiQ1dQLCAhb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1AoKSB7Ci0JCWZsb2F0IG9sZEJDV1AgPSBiQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCQliQ1dQRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19CQ1dQLCBvbGRCQ1dQLCBCQ1dQX0VERUZBVUxULCBvbGRCQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUCgpIHsKLQkJcmV0dXJuIGJDV1BFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX05VTUJFUjoKLQkJCQlyZXR1cm4gZ2V0TnVtYmVyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19XT1JLOgotCQkJCXJldHVybiBnZXRXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19DT1NUOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0Q29zdCgpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1M6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dTKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1AoKSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fTlVNQkVSOgotCQkJCXNldE51bWJlcigoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fV09SSzoKLQkJCQlzZXRXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0NPU1Q6Ci0JCQkJc2V0Q29zdCgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1M6Ci0JCQkJc2V0QkNXUygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1A6Ci0JCQkJc2V0QkNXUCgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19OVU1CRVI6Ci0JCQkJc2V0TnVtYmVyKE5VTUJFUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fV09SSzoKLQkJCQlzZXRXb3JrKFdPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0NPU1Q6Ci0JCQkJdW5zZXRDb3N0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUzoKLQkJCQl1bnNldEJDV1MoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19CQ1dQOgotCQkJCXVuc2V0QkNXUCgpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fTlVNQkVSOgotCQkJCXJldHVybiBOVU1CRVJfRURFRkFVTFQgPT0gbnVsbCA/IG51bWJlciAhPSBudWxsIDogIU5VTUJFUl9FREVGQVVMVC5lcXVhbHMobnVtYmVyKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX1dPUks6Ci0JCQkJcmV0dXJuIFdPUktfRURFRkFVTFQgPT0gbnVsbCA/IHdvcmsgIT0gbnVsbCA6ICFXT1JLX0VERUZBVUxULmVxdWFscyh3b3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0NPU1Q6Ci0JCQkJcmV0dXJuIGlzU2V0Q29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUzoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dTKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19CQ1dQOgotCQkJCXJldHVybiBpc1NldEJDV1AoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG51bWJlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobnVtYmVyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0OiAiKTsKLQkJaWYgKGNvc3RFU2V0KSByZXN1bHQuYXBwZW5kKGNvc3QpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dTOiAiKTsKLQkJaWYgKGJDV1NFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1MpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dQOiAiKTsKLQkJaWYgKGJDV1BFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1ApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQmFzZWxpbmUySW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Jhc2VsaW5lM0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9CYXNlbGluZTNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NWNmNDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Jhc2VsaW5lM0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJhc2VsaW5lM0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmFzZWxpbmUzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUzSW1wbCNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUzSW1wbCNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lM0ltcGwjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUzSW1wbCNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lM0ltcGwjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lM0ltcGwjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lM0ltcGwjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lM0ltcGwjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJhc2VsaW5lM0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEJhc2VsaW5lMyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZXBoYXNlZERhdGEoKSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRpbWVwaGFzZWREYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdGltZXBoYXNlZERhdGEgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE51bWJlcigpIDxlbT5OdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE51bWJlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNQkVSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE51bWJlcigpIDxlbT5OdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE51bWJlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBudW1iZXIgPSBOVU1CRVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydCgpIDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc3RhcnQgPSBTVEFSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2goKSA8ZW0+RmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTklTSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2goKSA8ZW0+RmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmluaXNoID0gRklOSVNIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrKCkgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgd29yayA9IFdPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3QoKSA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb3N0ID0gQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dTID0gQkNXU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXU0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXUF9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dQID0gQkNXUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXUEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBCYXNlbGluZTNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmFzZWxpbmUzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCkgewotCQlpZiAodGltZXBoYXNlZERhdGEgPT0gbnVsbCkgewotCQkJdGltZXBoYXNlZERhdGEgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVGltZXBoYXNlZERhdGFUeXBlLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fVElNRVBIQVNFRF9EQVRBKTsKLQkJfQotCQlyZXR1cm4gdGltZXBoYXNlZERhdGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROdW1iZXIoKSB7Ci0JCXJldHVybiBudW1iZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TnVtYmVyKFN0cmluZyBuZXdOdW1iZXIpIHsKLQkJU3RyaW5nIG9sZE51bWJlciA9IG51bWJlcjsKLQkJbnVtYmVyID0gbmV3TnVtYmVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fTlVNQkVSLCBvbGROdW1iZXIsIG51bWJlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChTdHJpbmcgbmV3U3RhcnQpIHsKLQkJU3RyaW5nIG9sZFN0YXJ0ID0gc3RhcnQ7Ci0JCXN0YXJ0ID0gbmV3U3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19TVEFSVCwgb2xkU3RhcnQsIHN0YXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaW5pc2goKSB7Ci0JCXJldHVybiBmaW5pc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluaXNoKFN0cmluZyBuZXdGaW5pc2gpIHsKLQkJU3RyaW5nIG9sZEZpbmlzaCA9IGZpbmlzaDsKLQkJZmluaXNoID0gbmV3RmluaXNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fRklOSVNILCBvbGRGaW5pc2gsIGZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0V29yaygpIHsKLQkJcmV0dXJuIHdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29yayhPYmplY3QgbmV3V29yaykgewotCQlPYmplY3Qgb2xkV29yayA9IHdvcms7Ci0JCXdvcmsgPSBuZXdXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fV09SSywgb2xkV29yaywgd29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29zdCgpIHsKLQkJcmV0dXJuIGNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdChTdHJpbmcgbmV3Q29zdCkgewotCQlTdHJpbmcgb2xkQ29zdCA9IGNvc3Q7Ci0JCWNvc3QgPSBuZXdDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQ09TVCwgb2xkQ29zdCwgY29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dTKGZsb2F0IG5ld0JDV1MpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJDV1MgPSBuZXdCQ1dTOwotCQlib29sZWFuIG9sZEJDV1NFU2V0ID0gYkNXU0VTZXQ7Ci0JCWJDV1NFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1MsIG9sZEJDV1MsIGJDV1MsICFvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QkNXUygpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXUyA9IEJDV1NfRURFRkFVTFQ7Ci0JCWJDV1NFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1MsIG9sZEJDV1MsIEJDV1NfRURFRkFVTFQsIG9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXU0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1AoKSB7Ci0JCXJldHVybiBiQ1dQOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1AoZmxvYXQgbmV3QkNXUCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYkNXUCA9IG5ld0JDV1A7Ci0JCWJvb2xlYW4gb2xkQkNXUEVTZXQgPSBiQ1dQRVNldDsKLQkJYkNXUEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQkNXUCwgb2xkQkNXUCwgYkNXUCwgIW9sZEJDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dQKCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYm9vbGVhbiBvbGRCQ1dQRVNldCA9IGJDV1BFU2V0OwotCQliQ1dQID0gQkNXUF9FREVGQVVMVDsKLQkJYkNXUEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQkNXUCwgb2xkQkNXUCwgQkNXUF9FREVGQVVMVCwgb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEJDV1AoKSB7Ci0JCXJldHVybiBiQ1dQRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VGltZXBoYXNlZERhdGEoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fVElNRVBIQVNFRF9EQVRBOgotCQkJCXJldHVybiBnZXRUaW1lcGhhc2VkRGF0YSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fTlVNQkVSOgotCQkJCXJldHVybiBnZXROdW1iZXIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1NUQVJUOgotCQkJCXJldHVybiBnZXRTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fRklOSVNIOgotCQkJCXJldHVybiBnZXRGaW5pc2goKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1dPUks6Ci0JCQkJcmV0dXJuIGdldFdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldENvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1M6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dTKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQkNXUDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1AoKSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fVElNRVBIQVNFRF9EQVRBOgotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuY2xlYXIoKTsKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fTlVNQkVSOgotCQkJCXNldE51bWJlcigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19TVEFSVDoKLQkJCQlzZXRTdGFydCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19GSU5JU0g6Ci0JCQkJc2V0RmluaXNoKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1dPUks6Ci0JCQkJc2V0V29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19DT1NUOgotCQkJCXNldENvc3QoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQkNXUzoKLQkJCQlzZXRCQ1dTKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQkNXUDoKLQkJCQlzZXRCQ1dQKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1RJTUVQSEFTRURfREFUQToKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fTlVNQkVSOgotCQkJCXNldE51bWJlcihOVU1CRVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1NUQVJUOgotCQkJCXNldFN0YXJ0KFNUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19GSU5JU0g6Ci0JCQkJc2V0RmluaXNoKEZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fV09SSzoKLQkJCQlzZXRXb3JrKFdPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0NPU1Q6Ci0JCQkJc2V0Q29zdChDT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dTOgotCQkJCXVuc2V0QkNXUygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1A6Ci0JCQkJdW5zZXRCQ1dQKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhICE9IG51bGwgJiYgIXRpbWVwaGFzZWREYXRhLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX05VTUJFUjoKLQkJCQlyZXR1cm4gTlVNQkVSX0VERUZBVUxUID09IG51bGwgPyBudW1iZXIgIT0gbnVsbCA6ICFOVU1CRVJfRURFRkFVTFQuZXF1YWxzKG51bWJlcik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19TVEFSVDoKLQkJCQlyZXR1cm4gU1RBUlRfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0ICE9IG51bGwgOiAhU1RBUlRfRURFRkFVTFQuZXF1YWxzKHN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0ZJTklTSDoKLQkJCQlyZXR1cm4gRklOSVNIX0VERUZBVUxUID09IG51bGwgPyBmaW5pc2ggIT0gbnVsbCA6ICFGSU5JU0hfRURFRkFVTFQuZXF1YWxzKGZpbmlzaCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19XT1JLOgotCQkJCXJldHVybiBXT1JLX0VERUZBVUxUID09IG51bGwgPyB3b3JrICE9IG51bGwgOiAhV09SS19FREVGQVVMVC5lcXVhbHMod29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19DT1NUOgotCQkJCXJldHVybiBDT1NUX0VERUZBVUxUID09IG51bGwgPyBjb3N0ICE9IG51bGwgOiAhQ09TVF9FREVGQVVMVC5lcXVhbHMoY29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dTOgotCQkJCXJldHVybiBpc1NldEJDV1MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1A6Ci0JCQkJcmV0dXJuIGlzU2V0QkNXUCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobnVtYmVyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChudW1iZXIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGFydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmluaXNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaW5pc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGJDV1M6ICIpOwotCQlpZiAoYkNXU0VTZXQpIHJlc3VsdC5hcHBlbmQoYkNXUyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGJDV1A6ICIpOwotCQlpZiAoYkNXUEVTZXQpIHJlc3VsdC5hcHBlbmQoYkNXUCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9CYXNlbGluZTNJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQmFzZWxpbmVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQmFzZWxpbmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MDcwNTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Jhc2VsaW5lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODk2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQmFzZWxpbmVJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmFzZWxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNpc0ludGVyaW0gPGVtPkludGVyaW08L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmVJbXBsI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmVJbXBsI2dldER1cmF0aW9uIDxlbT5EdXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmVJbXBsI2lzRXN0aW1hdGVkRHVyYXRpb24gPGVtPkVzdGltYXRlZCBEdXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmVJbXBsI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQmFzZWxpbmVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBCYXNlbGluZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZXBoYXNlZERhdGEoKSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRpbWVwaGFzZWREYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdGltZXBoYXNlZERhdGEgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE51bWJlcigpIDxlbT5OdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE51bWJlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIE5VTUJFUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdW1iZXIoKSA8ZW0+TnVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIG51bWJlciA9IE5VTUJFUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ludGVyaW0oKSA8ZW0+SW50ZXJpbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJbnRlcmltKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSU5URVJJTV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbnRlcmltKCkgPGVtPkludGVyaW08L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSW50ZXJpbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW50ZXJpbSA9IElOVEVSSU1fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEludGVyaW0gYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGludGVyaW1FU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBTVEFSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydCgpIDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgc3RhcnQgPSBTVEFSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2goKSA8ZW0+RmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEZJTklTSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2goKSA8ZW0+RmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZmluaXNoID0gRklOSVNIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uKCkgPGVtPkR1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgRFVSQVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb24oKSA8ZW0+RHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldER1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGR1cmF0aW9uID0gRFVSQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbkZvcm1hdCgpIDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdCA9IERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VzdGltYXRlZER1cmF0aW9uKCkgPGVtPkVzdGltYXRlZCBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFc3RpbWF0ZWREdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVTVElNQVRFRF9EVVJBVElPTl9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFc3RpbWF0ZWREdXJhdGlvbigpIDxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVzdGltYXRlZER1cmF0aW9uID0gRVNUSU1BVEVEX0RVUkFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBFc3RpbWF0ZWQgRHVyYXRpb24gYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVzdGltYXRlZER1cmF0aW9uRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrKCkgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgd29yayA9IFdPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGNvc3QgPSBDT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1MoKSA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBCQ1dTX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1MoKSA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGJDV1MgPSBCQ1dTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBCQ1dTIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiQ1dTRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1AoKSA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBCQ1dQX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1AoKSA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBCQ1dQIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiQ1dQRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEJhc2VsaW5lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEJhc2VsaW5lKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCkgewotCQlpZiAodGltZXBoYXNlZERhdGEgPT0gbnVsbCkgewotCQkJdGltZXBoYXNlZERhdGEgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVGltZXBoYXNlZERhdGFUeXBlLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19USU1FUEhBU0VEX0RBVEEpOwotCQl9Ci0JCXJldHVybiB0aW1lcGhhc2VkRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXROdW1iZXIoKSB7Ci0JCXJldHVybiBudW1iZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TnVtYmVyKEJpZ0ludGVnZXIgbmV3TnVtYmVyKSB7Ci0JCUJpZ0ludGVnZXIgb2xkTnVtYmVyID0gbnVtYmVyOwotCQludW1iZXIgPSBuZXdOdW1iZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX05VTUJFUiwgb2xkTnVtYmVyLCBudW1iZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ludGVyaW0oKSB7Ci0JCXJldHVybiBpbnRlcmltOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEludGVyaW0oYm9vbGVhbiBuZXdJbnRlcmltKSB7Ci0JCWJvb2xlYW4gb2xkSW50ZXJpbSA9IGludGVyaW07Ci0JCWludGVyaW0gPSBuZXdJbnRlcmltOwotCQlib29sZWFuIG9sZEludGVyaW1FU2V0ID0gaW50ZXJpbUVTZXQ7Ci0JCWludGVyaW1FU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fSU5URVJJTSwgb2xkSW50ZXJpbSwgaW50ZXJpbSwgIW9sZEludGVyaW1FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJbnRlcmltKCkgewotCQlib29sZWFuIG9sZEludGVyaW0gPSBpbnRlcmltOwotCQlib29sZWFuIG9sZEludGVyaW1FU2V0ID0gaW50ZXJpbUVTZXQ7Ci0JCWludGVyaW0gPSBJTlRFUklNX0VERUZBVUxUOwotCQlpbnRlcmltRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0lOVEVSSU0sIG9sZEludGVyaW0sIElOVEVSSU1fRURFRkFVTFQsIG9sZEludGVyaW1FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJbnRlcmltKCkgewotCQlyZXR1cm4gaW50ZXJpbUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIHN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KE9iamVjdCBuZXdTdGFydCkgewotCQlPYmplY3Qgb2xkU3RhcnQgPSBzdGFydDsKLQkJc3RhcnQgPSBuZXdTdGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fU1RBUlQsIG9sZFN0YXJ0LCBzdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmluaXNoKCkgewotCQlyZXR1cm4gZmluaXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmlzaChPYmplY3QgbmV3RmluaXNoKSB7Ci0JCU9iamVjdCBvbGRGaW5pc2ggPSBmaW5pc2g7Ci0JCWZpbmlzaCA9IG5ld0ZpbmlzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRklOSVNILCBvbGRGaW5pc2gsIGZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RHVyYXRpb24oKSB7Ci0JCXJldHVybiBkdXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREdXJhdGlvbihPYmplY3QgbmV3RHVyYXRpb24pIHsKLQkJT2JqZWN0IG9sZER1cmF0aW9uID0gZHVyYXRpb247Ci0JCWR1cmF0aW9uID0gbmV3RHVyYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0RVUkFUSU9OLCBvbGREdXJhdGlvbiwgZHVyYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpIHsKLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgbmV3RHVyYXRpb25Gb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGREdXJhdGlvbkZvcm1hdCA9IGR1cmF0aW9uRm9ybWF0OwotCQlkdXJhdGlvbkZvcm1hdCA9IG5ld0R1cmF0aW9uRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTl9GT1JNQVQsIG9sZER1cmF0aW9uRm9ybWF0LCBkdXJhdGlvbkZvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXN0aW1hdGVkRHVyYXRpb24oKSB7Ci0JCXJldHVybiBlc3RpbWF0ZWREdXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFc3RpbWF0ZWREdXJhdGlvbihib29sZWFuIG5ld0VzdGltYXRlZER1cmF0aW9uKSB7Ci0JCWJvb2xlYW4gb2xkRXN0aW1hdGVkRHVyYXRpb24gPSBlc3RpbWF0ZWREdXJhdGlvbjsKLQkJZXN0aW1hdGVkRHVyYXRpb24gPSBuZXdFc3RpbWF0ZWREdXJhdGlvbjsKLQkJYm9vbGVhbiBvbGRFc3RpbWF0ZWREdXJhdGlvbkVTZXQgPSBlc3RpbWF0ZWREdXJhdGlvbkVTZXQ7Ci0JCWVzdGltYXRlZER1cmF0aW9uRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0VTVElNQVRFRF9EVVJBVElPTiwgb2xkRXN0aW1hdGVkRHVyYXRpb24sIGVzdGltYXRlZER1cmF0aW9uLCAhb2xkRXN0aW1hdGVkRHVyYXRpb25FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRFc3RpbWF0ZWREdXJhdGlvbigpIHsKLQkJYm9vbGVhbiBvbGRFc3RpbWF0ZWREdXJhdGlvbiA9IGVzdGltYXRlZER1cmF0aW9uOwotCQlib29sZWFuIG9sZEVzdGltYXRlZER1cmF0aW9uRVNldCA9IGVzdGltYXRlZER1cmF0aW9uRVNldDsKLQkJZXN0aW1hdGVkRHVyYXRpb24gPSBFU1RJTUFURURfRFVSQVRJT05fRURFRkFVTFQ7Ci0JCWVzdGltYXRlZER1cmF0aW9uRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0VTVElNQVRFRF9EVVJBVElPTiwgb2xkRXN0aW1hdGVkRHVyYXRpb24sIEVTVElNQVRFRF9EVVJBVElPTl9FREVGQVVMVCwgb2xkRXN0aW1hdGVkRHVyYXRpb25FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRFc3RpbWF0ZWREdXJhdGlvbigpIHsKLQkJcmV0dXJuIGVzdGltYXRlZER1cmF0aW9uRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFdvcmsoKSB7Ci0JCXJldHVybiB3b3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmsoT2JqZWN0IG5ld1dvcmspIHsKLQkJT2JqZWN0IG9sZFdvcmsgPSB3b3JrOwotCQl3b3JrID0gbmV3V29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fV09SSywgb2xkV29yaywgd29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldENvc3QoKSB7Ci0JCXJldHVybiBjb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvc3QoQmlnRGVjaW1hbCBuZXdDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkQ29zdCA9IGNvc3Q7Ci0JCWNvc3QgPSBuZXdDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19DT1NULCBvbGRDb3N0LCBjb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1MoKSB7Ci0JCXJldHVybiBiQ1dTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1MoZmxvYXQgbmV3QkNXUykgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYkNXUyA9IG5ld0JDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXU0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dTLCBvbGRCQ1dTLCBiQ1dTLCAhb2xkQkNXU0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1MoKSB7Ci0JCWZsb2F0IG9sZEJDV1MgPSBiQ1dTOwotCQlib29sZWFuIG9sZEJDV1NFU2V0ID0gYkNXU0VTZXQ7Ci0JCWJDV1MgPSBCQ1dTX0VERUZBVUxUOwotCQliQ1dTRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0JDV1MsIG9sZEJDV1MsIEJDV1NfRURFRkFVTFQsIG9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXU0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1AoKSB7Ci0JCXJldHVybiBiQ1dQOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1AoZmxvYXQgbmV3QkNXUCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYkNXUCA9IG5ld0JDV1A7Ci0JCWJvb2xlYW4gb2xkQkNXUEVTZXQgPSBiQ1dQRVNldDsKLQkJYkNXUEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dQLCBvbGRCQ1dQLCBiQ1dQLCAhb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1AoKSB7Ci0JCWZsb2F0IG9sZEJDV1AgPSBiQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCQliQ1dQRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0JDV1AsIG9sZEJDV1AsIEJDV1BfRURFRkFVTFQsIG9sZEJDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VGltZXBoYXNlZERhdGEoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIGdldFRpbWVwaGFzZWREYXRhKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX05VTUJFUjoKLQkJCQlyZXR1cm4gZ2V0TnVtYmVyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0lOVEVSSU06Ci0JCQkJcmV0dXJuIGlzSW50ZXJpbSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldFN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0RmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0RVUkFUSU9OOgotCQkJCXJldHVybiBnZXREdXJhdGlvbigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldER1cmF0aW9uRm9ybWF0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0VTVElNQVRFRF9EVVJBVElPTjoKLQkJCQlyZXR1cm4gaXNFc3RpbWF0ZWREdXJhdGlvbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fV09SSzoKLQkJCQlyZXR1cm4gZ2V0V29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19DT1NUOgotCQkJCXJldHVybiBnZXRDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0JDV1M6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dTKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dQOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QkNXUCgpKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1RJTUVQSEFTRURfREFUQToKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmNsZWFyKCk7Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fTlVNQkVSOgotCQkJCXNldE51bWJlcigoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19JTlRFUklNOgotCQkJCXNldEludGVyaW0oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19TVEFSVDoKLQkJCQlzZXRTdGFydCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTjoKLQkJCQlzZXREdXJhdGlvbigoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlzZXREdXJhdGlvbkZvcm1hdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19FU1RJTUFURURfRFVSQVRJT046Ci0JCQkJc2V0RXN0aW1hdGVkRHVyYXRpb24oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19XT1JLOgotCQkJCXNldFdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19DT1NUOgotCQkJCXNldENvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUzoKLQkJCQlzZXRCQ1dTKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dQOgotCQkJCXNldEJDV1AoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fTlVNQkVSOgotCQkJCXNldE51bWJlcihOVU1CRVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fSU5URVJJTToKLQkJCQl1bnNldEludGVyaW0oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1NUQVJUOgotCQkJCXNldFN0YXJ0KFNUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goRklOSVNIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0RVUkFUSU9OOgotCQkJCXNldER1cmF0aW9uKERVUkFUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlzZXREdXJhdGlvbkZvcm1hdChEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRVNUSU1BVEVEX0RVUkFUSU9OOgotCQkJCXVuc2V0RXN0aW1hdGVkRHVyYXRpb24oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1dPUks6Ci0JCQkJc2V0V29yayhXT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0NPU1Q6Ci0JCQkJc2V0Q29zdChDT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0JDV1M6Ci0JCQkJdW5zZXRCQ1dTKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dQOgotCQkJCXVuc2V0QkNXUCgpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhICE9IG51bGwgJiYgIXRpbWVwaGFzZWREYXRhLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fTlVNQkVSOgotCQkJCXJldHVybiBOVU1CRVJfRURFRkFVTFQgPT0gbnVsbCA/IG51bWJlciAhPSBudWxsIDogIU5VTUJFUl9FREVGQVVMVC5lcXVhbHMobnVtYmVyKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fSU5URVJJTToKLQkJCQlyZXR1cm4gaXNTZXRJbnRlcmltKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1NUQVJUOgotCQkJCXJldHVybiBTVEFSVF9FREVGQVVMVCA9PSBudWxsID8gc3RhcnQgIT0gbnVsbCA6ICFTVEFSVF9FREVGQVVMVC5lcXVhbHMoc3RhcnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19GSU5JU0g6Ci0JCQkJcmV0dXJuIEZJTklTSF9FREVGQVVMVCA9PSBudWxsID8gZmluaXNoICE9IG51bGwgOiAhRklOSVNIX0VERUZBVUxULmVxdWFscyhmaW5pc2gpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTjoKLQkJCQlyZXR1cm4gRFVSQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGR1cmF0aW9uICE9IG51bGwgOiAhRFVSQVRJT05fRURFRkFVTFQuZXF1YWxzKGR1cmF0aW9uKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGR1cmF0aW9uRm9ybWF0ICE9IG51bGwgOiAhRFVSQVRJT05fRk9STUFUX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbkZvcm1hdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0VTVElNQVRFRF9EVVJBVElPTjoKLQkJCQlyZXR1cm4gaXNTZXRFc3RpbWF0ZWREdXJhdGlvbigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19XT1JLOgotCQkJCXJldHVybiBXT1JLX0VERUZBVUxUID09IG51bGwgPyB3b3JrICE9IG51bGwgOiAhV09SS19FREVGQVVMVC5lcXVhbHMod29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0NPU1Q6Ci0JCQkJcmV0dXJuIENPU1RfRURFRkFVTFQgPT0gbnVsbCA/IGNvc3QgIT0gbnVsbCA6ICFDT1NUX0VERUZBVUxULmVxdWFscyhjb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUzoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dTKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0JDV1A6Ci0JCQkJcmV0dXJuIGlzU2V0QkNXUCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobnVtYmVyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChudW1iZXIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGludGVyaW06ICIpOwotCQlpZiAoaW50ZXJpbUVTZXQpIHJlc3VsdC5hcHBlbmQoaW50ZXJpbSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGFydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmluaXNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaW5pc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR1cmF0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkdXJhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZHVyYXRpb25Gb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGR1cmF0aW9uRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlc3RpbWF0ZWREdXJhdGlvbjogIik7Ci0JCWlmIChlc3RpbWF0ZWREdXJhdGlvbkVTZXQpIHJlc3VsdC5hcHBlbmQoZXN0aW1hdGVkRHVyYXRpb24pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dTOiAiKTsKLQkJaWYgKGJDV1NFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1MpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dQOiAiKTsKLQkJaWYgKGJDV1BFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1ApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQmFzZWxpbmVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQ2FsZW5kYXJJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQ2FsZW5kYXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZDA4ZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0NhbGVuZGFySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ2FsZW5kYXJJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYWxlbmRhcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkNhbGVuZGFySW1wbCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkNhbGVuZGFySW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQ2FsZW5kYXJJbXBsI2lzSXNCYXNlQ2FsZW5kYXIgPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhckltcGwjZ2V0QmFzZUNhbGVuZGFyVUlEIDxlbT5CYXNlIENhbGVuZGFyIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkNhbGVuZGFySW1wbCNnZXRXZWVrRGF5cyA8ZW0+V2VlayBEYXlzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2FsZW5kYXJJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBDYWxlbmRhciB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFVJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHVJRCA9IFVJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNCYXNlQ2FsZW5kYXIoKSA8ZW0+SXMgQmFzZSBDYWxlbmRhcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc0Jhc2VDYWxlbmRhcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0JBU0VfQ0FMRU5EQVJfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNCYXNlQ2FsZW5kYXIoKSA8ZW0+SXMgQmFzZSBDYWxlbmRhcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc0Jhc2VDYWxlbmRhcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNCYXNlQ2FsZW5kYXIgPSBJU19CQVNFX0NBTEVOREFSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBCYXNlIENhbGVuZGFyIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Jhc2VDYWxlbmRhckVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlQ2FsZW5kYXJVSUQoKSA8ZW0+QmFzZSBDYWxlbmRhciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhc2VDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEJBU0VfQ0FMRU5EQVJfVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VDYWxlbmRhclVJRCgpIDxlbT5CYXNlIENhbGVuZGFyIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZUNhbGVuZGFyVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBiYXNlQ2FsZW5kYXJVSUQgPSBCQVNFX0NBTEVOREFSX1VJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlZWtEYXlzKCkgPGVtPldlZWsgRGF5czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2Vla0RheXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBXZWVrRGF5cyB3ZWVrRGF5cyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2FsZW5kYXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FsZW5kYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgbmV3VUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVUlEID0gdUlEOwotCQl1SUQgPSBuZXdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNCYXNlQ2FsZW5kYXIoKSB7Ci0JCXJldHVybiBpc0Jhc2VDYWxlbmRhcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0Jhc2VDYWxlbmRhcihib29sZWFuIG5ld0lzQmFzZUNhbGVuZGFyKSB7Ci0JCWJvb2xlYW4gb2xkSXNCYXNlQ2FsZW5kYXIgPSBpc0Jhc2VDYWxlbmRhcjsKLQkJaXNCYXNlQ2FsZW5kYXIgPSBuZXdJc0Jhc2VDYWxlbmRhcjsKLQkJYm9vbGVhbiBvbGRJc0Jhc2VDYWxlbmRhckVTZXQgPSBpc0Jhc2VDYWxlbmRhckVTZXQ7Ci0JCWlzQmFzZUNhbGVuZGFyRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX0lTX0JBU0VfQ0FMRU5EQVIsIG9sZElzQmFzZUNhbGVuZGFyLCBpc0Jhc2VDYWxlbmRhciwgIW9sZElzQmFzZUNhbGVuZGFyRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNCYXNlQ2FsZW5kYXIoKSB7Ci0JCWJvb2xlYW4gb2xkSXNCYXNlQ2FsZW5kYXIgPSBpc0Jhc2VDYWxlbmRhcjsKLQkJYm9vbGVhbiBvbGRJc0Jhc2VDYWxlbmRhckVTZXQgPSBpc0Jhc2VDYWxlbmRhckVTZXQ7Ci0JCWlzQmFzZUNhbGVuZGFyID0gSVNfQkFTRV9DQUxFTkRBUl9FREVGQVVMVDsKLQkJaXNCYXNlQ2FsZW5kYXJFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fSVNfQkFTRV9DQUxFTkRBUiwgb2xkSXNCYXNlQ2FsZW5kYXIsIElTX0JBU0VfQ0FMRU5EQVJfRURFRkFVTFQsIG9sZElzQmFzZUNhbGVuZGFyRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNCYXNlQ2FsZW5kYXIoKSB7Ci0JCXJldHVybiBpc0Jhc2VDYWxlbmRhckVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0QmFzZUNhbGVuZGFyVUlEKCkgewotCQlyZXR1cm4gYmFzZUNhbGVuZGFyVUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhc2VDYWxlbmRhclVJRChCaWdJbnRlZ2VyIG5ld0Jhc2VDYWxlbmRhclVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZEJhc2VDYWxlbmRhclVJRCA9IGJhc2VDYWxlbmRhclVJRDsKLQkJYmFzZUNhbGVuZGFyVUlEID0gbmV3QmFzZUNhbGVuZGFyVUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19CQVNFX0NBTEVOREFSX1VJRCwgb2xkQmFzZUNhbGVuZGFyVUlELCBiYXNlQ2FsZW5kYXJVSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2Vla0RheXMgZ2V0V2Vla0RheXMoKSB7Ci0JCXJldHVybiB3ZWVrRGF5czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXZWVrRGF5cyhXZWVrRGF5cyBuZXdXZWVrRGF5cywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlXZWVrRGF5cyBvbGRXZWVrRGF5cyA9IHdlZWtEYXlzOwotCQl3ZWVrRGF5cyA9IG5ld1dlZWtEYXlzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19XRUVLX0RBWVMsIG9sZFdlZWtEYXlzLCBuZXdXZWVrRGF5cyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2Vla0RheXMoV2Vla0RheXMgbmV3V2Vla0RheXMpIHsKLQkJaWYgKG5ld1dlZWtEYXlzICE9IHdlZWtEYXlzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh3ZWVrRGF5cyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl3ZWVrRGF5cykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1dFRUtfREFZUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3V2Vla0RheXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3V2Vla0RheXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19XRUVLX0RBWVMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V2Vla0RheXMobmV3V2Vla0RheXMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fV0VFS19EQVlTLCBuZXdXZWVrRGF5cywgbmV3V2Vla0RheXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1dFRUtfREFZUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0V2Vla0RheXMobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fSVNfQkFTRV9DQUxFTkRBUjoKLQkJCQlyZXR1cm4gaXNJc0Jhc2VDYWxlbmRhcigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fQkFTRV9DQUxFTkRBUl9VSUQ6Ci0JCQkJcmV0dXJuIGdldEJhc2VDYWxlbmRhclVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19XRUVLX0RBWVM6Ci0JCQkJcmV0dXJuIGdldFdlZWtEYXlzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19VSUQ6Ci0JCQkJc2V0VUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX0lTX0JBU0VfQ0FMRU5EQVI6Ci0JCQkJc2V0SXNCYXNlQ2FsZW5kYXIoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19CQVNFX0NBTEVOREFSX1VJRDoKLQkJCQlzZXRCYXNlQ2FsZW5kYXJVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fV0VFS19EQVlTOgotCQkJCXNldFdlZWtEYXlzKChXZWVrRGF5cyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fVUlEOgotCQkJCXNldFVJRChVSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fSVNfQkFTRV9DQUxFTkRBUjoKLQkJCQl1bnNldElzQmFzZUNhbGVuZGFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19CQVNFX0NBTEVOREFSX1VJRDoKLQkJCQlzZXRCYXNlQ2FsZW5kYXJVSUQoQkFTRV9DQUxFTkRBUl9VSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fV0VFS19EQVlTOgotCQkJCXNldFdlZWtEYXlzKChXZWVrRGF5cyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19JU19CQVNFX0NBTEVOREFSOgotCQkJCXJldHVybiBpc1NldElzQmFzZUNhbGVuZGFyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX0JBU0VfQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBCQVNFX0NBTEVOREFSX1VJRF9FREVGQVVMVCA9PSBudWxsID8gYmFzZUNhbGVuZGFyVUlEICE9IG51bGwgOiAhQkFTRV9DQUxFTkRBUl9VSURfRURFRkFVTFQuZXF1YWxzKGJhc2VDYWxlbmRhclVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1dFRUtfREFZUzoKLQkJCQlyZXR1cm4gd2Vla0RheXMgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc0Jhc2VDYWxlbmRhcjogIik7Ci0JCWlmIChpc0Jhc2VDYWxlbmRhckVTZXQpIHJlc3VsdC5hcHBlbmQoaXNCYXNlQ2FsZW5kYXIpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiYXNlQ2FsZW5kYXJVSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGJhc2VDYWxlbmRhclVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NhbGVuZGFySW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0NhbGVuZGFyc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9DYWxlbmRhcnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZjVlZTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0NhbGVuZGFyc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENhbGVuZGFyc0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNhbGVuZGFyczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkNhbGVuZGFyc0ltcGwjZ2V0Q2FsZW5kYXIgPGVtPkNhbGVuZGFyPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2FsZW5kYXJzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQ2FsZW5kYXJzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWxlbmRhcigpIDxlbT5DYWxlbmRhcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxlbmRhcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNhbGVuZGFyID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDYWxlbmRhcnNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FsZW5kYXJzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldENhbGVuZGFyKCkgewotCQlpZiAoY2FsZW5kYXIgPT0gbnVsbCkgewotCQkJY2FsZW5kYXIgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQ2FsZW5kYXIuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTX19DQUxFTkRBUik7Ci0JCX0KLQkJcmV0dXJuIGNhbGVuZGFyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUlNfX0NBTEVOREFSOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENhbGVuZGFyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUlNfX0NBTEVOREFSOgotCQkJCXJldHVybiBnZXRDYWxlbmRhcigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUlNfX0NBTEVOREFSOgotCQkJCWdldENhbGVuZGFyKCkuY2xlYXIoKTsKLQkJCQlnZXRDYWxlbmRhcigpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUlNfX0NBTEVOREFSOgotCQkJCWdldENhbGVuZGFyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUlNfX0NBTEVOREFSOgotCQkJCXJldHVybiBjYWxlbmRhciAhPSBudWxsICYmICFjYWxlbmRhci5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL0NhbGVuZGFyc0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Eb2N1bWVudFJvb3RJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRG9jdW1lbnRSb290SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzEzMDFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Eb2N1bWVudFJvb3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEb2N1bWVudFJvb3RJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlRU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvY3VtZW50IFJvb3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Eb2N1bWVudFJvb3RJbXBsI2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Eb2N1bWVudFJvb3RJbXBsI2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRQcm9qZWN0IDxlbT5Qcm9qZWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRSb290SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRG9jdW1lbnRSb290IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaXhlZCgpIDxlbT5NaXhlZDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaXhlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgbWl4ZWQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WE1MTlNQcmVmaXhNYXAoKSA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fScgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WE1MTlNQcmVmaXhNYXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTWFwIHhNTE5TUHJlZml4TWFwID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhTSVNjaGVtYUxvY2F0aW9uKCkgPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn0nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFhTSVNjaGVtYUxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU1hcCB4U0lTY2hlbWFMb2NhdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnRSb290SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldE1peGVkKCkgewotCQlpZiAobWl4ZWQgPT0gbnVsbCkgewotCQkJbWl4ZWQgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQpOwotCQl9Ci0JCXJldHVybiBtaXhlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU1hcCBnZXRYTUxOU1ByZWZpeE1hcCgpIHsKLQkJaWYgKHhNTE5TUHJlZml4TWFwID09IG51bGwpIHsKLQkJCXhNTE5TUHJlZml4TWFwID0gbmV3IEVjb3JlRU1hcChFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5KCksIEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbC5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQKTsKLQkJfQotCQlyZXR1cm4geE1MTlNQcmVmaXhNYXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVNYXAgZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSB7Ci0JCWlmICh4U0lTY2hlbWFMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQl4U0lTY2hlbWFMb2NhdGlvbiA9IG5ldyBFY29yZUVNYXAoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTik7Ci0JCX0KLQkJcmV0dXJuIHhTSVNjaGVtYUxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiAoUHJvamVjdClnZXRNaXhlZCgpLmdldChNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfUHJvamVjdCgpLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcm9qZWN0KFByb2plY3QgbmV3UHJvamVjdCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLmJhc2ljQWRkKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9Qcm9qZWN0KCksIG5ld1Byb2plY3QsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoUHJvamVjdCBuZXdQcm9qZWN0KSB7Ci0JCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQoTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X1Byb2plY3QoKSwgbmV3UHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1peGVkKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRYTUxOU1ByZWZpeE1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19QUk9KRUNUOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRQcm9qZWN0KG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCXJldHVybiBnZXRNaXhlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJcmV0dXJuIGdldFhNTE5TUHJlZml4TWFwKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlyZXR1cm4gZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19QUk9KRUNUOgotCQkJCXJldHVybiBnZXRQcm9qZWN0KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCWdldE1peGVkKCkuY2xlYXIoKTsKLQkJCQlnZXRNaXhlZCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJZ2V0WE1MTlNQcmVmaXhNYXAoKS5jbGVhcigpOwotCQkJCWdldFhNTE5TUHJlZml4TWFwKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlnZXRYU0lTY2hlbWFMb2NhdGlvbigpLmNsZWFyKCk7Ci0JCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19QUk9KRUNUOgotCQkJCXNldFByb2plY3QoKFByb2plY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJZ2V0TWl4ZWQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCWdldFhNTE5TUHJlZml4TWFwKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlnZXRYU0lTY2hlbWFMb2NhdGlvbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1BST0pFQ1Q6Ci0JCQkJc2V0UHJvamVjdCgoUHJvamVjdCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQlyZXR1cm4gbWl4ZWQgIT0gbnVsbCAmJiAhbWl4ZWQuaXNFbXB0eSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJcmV0dXJuIHhNTE5TUHJlZml4TWFwICE9IG51bGwgJiYgIXhNTE5TUHJlZml4TWFwLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbiAhPSBudWxsICYmICF4U0lTY2hlbWFMb2NhdGlvbi5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fUFJPSkVDVDoKLQkJCQlyZXR1cm4gZ2V0UHJvamVjdCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtaXhlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWl4ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Eb2N1bWVudFJvb3RJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUxNGU0My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlMjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlMkltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTJJbXBsI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTJJbXBsI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbCNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRXh0ZW5kZWRBdHRyaWJ1dGUyIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdUlEID0gVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkSUQoKSA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkSUQoKSA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmllbGRJRCA9IEZJRUxEX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFZBTFVFX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlSUQoKSA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHZhbHVlSUQgPSBWQUxVRV9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbkZvcm1hdCgpIDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgRFVSQVRJT05fRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0ID0gRFVSQVRJT05fRk9STUFUX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEV4dGVuZGVkQXR0cmlidXRlMkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgbmV3VUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVUlEID0gdUlEOwotCQl1SUQgPSBuZXdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVUlELCBvbGRVSUQsIHVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGRJRCgpIHsKLQkJcmV0dXJuIGZpZWxkSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmllbGRJRChTdHJpbmcgbmV3RmllbGRJRCkgewotCQlTdHJpbmcgb2xkRmllbGRJRCA9IGZpZWxkSUQ7Ci0JCWZpZWxkSUQgPSBuZXdGaWVsZElEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX0ZJRUxEX0lELCBvbGRGaWVsZElELCBmaWVsZElEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpIHsKLQkJcmV0dXJuIHZhbHVlSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIG5ld1ZhbHVlSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRWYWx1ZUlEID0gdmFsdWVJRDsKLQkJdmFsdWVJRCA9IG5ld1ZhbHVlSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVkFMVUVfSUQsIG9sZFZhbHVlSUQsIHZhbHVlSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpIHsKLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgbmV3RHVyYXRpb25Gb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGREdXJhdGlvbkZvcm1hdCA9IGR1cmF0aW9uRm9ybWF0OwotCQlkdXJhdGlvbkZvcm1hdCA9IG5ld0R1cmF0aW9uRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX0RVUkFUSU9OX0ZPUk1BVCwgb2xkRHVyYXRpb25Gb3JtYXQsIGR1cmF0aW9uRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIGdldEZpZWxkSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gZ2V0VmFsdWVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVUlEOgotCQkJCXNldFVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fRFVSQVRJT05fRk9STUFUOgotCQkJCXNldER1cmF0aW9uRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRChGSUVMRF9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVkFMVUVfSUQ6Ci0JCQkJc2V0VmFsdWVJRChWQUxVRV9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlzZXREdXJhdGlvbkZvcm1hdChEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1VJRDoKLQkJCQlyZXR1cm4gVUlEX0VERUZBVUxUID09IG51bGwgPyB1SUQgIT0gbnVsbCA6ICFVSURfRURFRkFVTFQuZXF1YWxzKHVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIEZJRUxEX0lEX0VERUZBVUxUID09IG51bGwgPyBmaWVsZElEICE9IG51bGwgOiAhRklFTERfSURfRURFRkFVTFQuZXF1YWxzKGZpZWxkSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBWQUxVRV9JRF9FREVGQVVMVCA9PSBudWxsID8gdmFsdWVJRCAhPSBudWxsIDogIVZBTFVFX0lEX0VERUZBVUxULmVxdWFscyh2YWx1ZUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJcmV0dXJuIERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCA9PSBudWxsID8gZHVyYXRpb25Gb3JtYXQgIT0gbnVsbCA6ICFEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQuZXF1YWxzKGR1cmF0aW9uRm9ybWF0KTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaWVsZElEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaWVsZElEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR1cmF0aW9uRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkdXJhdGlvbkZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0V4dGVuZGVkQXR0cmlidXRlMkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZTNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWE2YTk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZTNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeHRlbmRlZEF0dHJpYnV0ZTNJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGUzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlM0ltcGwjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTNJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlM0ltcGwjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTNJbXBsI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZEF0dHJpYnV0ZTNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFeHRlbmRlZEF0dHJpYnV0ZTMgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWVsZElEID0gRklFTERfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVkFMVUVfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdmFsdWVJRCA9IFZBTFVFX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXQgPSBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEV4dGVuZGVkQXR0cmlidXRlMygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFVJRCgpIHsKLQkJcmV0dXJuIHVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVSUQoQmlnSW50ZWdlciBuZXdVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRVSUQgPSB1SUQ7Ci0JCXVJRCA9IG5ld1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19VSUQsIG9sZFVJRCwgdUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZElEKCkgewotCQlyZXR1cm4gZmllbGRJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWVsZElEKFN0cmluZyBuZXdGaWVsZElEKSB7Ci0JCVN0cmluZyBvbGRGaWVsZElEID0gZmllbGRJRDsKLQkJZmllbGRJRCA9IG5ld0ZpZWxkSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fRklFTERfSUQsIG9sZEZpZWxkSUQsIGZpZWxkSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRWYWx1ZUlEKCkgewotCQlyZXR1cm4gdmFsdWVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZUlEKEJpZ0ludGVnZXIgbmV3VmFsdWVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFZhbHVlSUQgPSB2YWx1ZUlEOwotCQl2YWx1ZUlEID0gbmV3VmFsdWVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRV9JRCwgb2xkVmFsdWVJRCwgdmFsdWVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldER1cmF0aW9uRm9ybWF0KCkgewotCQlyZXR1cm4gZHVyYXRpb25Gb3JtYXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlciBuZXdEdXJhdGlvbkZvcm1hdCkgewotCQlCaWdJbnRlZ2VyIG9sZER1cmF0aW9uRm9ybWF0ID0gZHVyYXRpb25Gb3JtYXQ7Ci0JCWR1cmF0aW9uRm9ybWF0ID0gbmV3RHVyYXRpb25Gb3JtYXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fRFVSQVRJT05fRk9STUFULCBvbGREdXJhdGlvbkZvcm1hdCwgZHVyYXRpb25Gb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVUlEOgotCQkJCXJldHVybiBnZXRVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gZ2V0RmllbGRJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBnZXRWYWx1ZUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBnZXREdXJhdGlvbkZvcm1hdCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19VSUQ6Ci0JCQkJc2V0VUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVUlEOgotCQkJCXNldFVJRChVSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKEZJRUxEX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKFZBTFVFX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fRFVSQVRJT05fRk9STUFUOgotCQkJCXNldER1cmF0aW9uRm9ybWF0KERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gRklFTERfSURfRURFRkFVTFQgPT0gbnVsbCA/IGZpZWxkSUQgIT0gbnVsbCA6ICFGSUVMRF9JRF9FREVGQVVMVC5lcXVhbHMoZmllbGRJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIFZBTFVFX0lEX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZUlEICE9IG51bGwgOiAhVkFMVUVfSURfRURFRkFVTFQuZXF1YWxzKHZhbHVlSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlyZXR1cm4gRFVSQVRJT05fRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBkdXJhdGlvbkZvcm1hdCAhPSBudWxsIDogIURVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMoZHVyYXRpb25Gb3JtYXQpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1SUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpZWxkSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpZWxkSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZHVyYXRpb25Gb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGR1cmF0aW9uRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlNEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNDhiN2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlNEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4dGVuZGVkQXR0cmlidXRlNEltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbCNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlNEltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbCNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlNEltcGwjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuZGVkQXR0cmlidXRlNEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEV4dGVuZGVkQXR0cmlidXRlNCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFVJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHVJRCA9IFVJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkSUQgPSBGSUVMRF9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlSUQoKSA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBWQUxVRV9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB2YWx1ZUlEID0gVkFMVUVfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbkZvcm1hdCgpIDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdCA9IERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFeHRlbmRlZEF0dHJpYnV0ZTRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChCaWdJbnRlZ2VyIG5ld1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkSUQoKSB7Ci0JCXJldHVybiBmaWVsZElEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkSUQoU3RyaW5nIG5ld0ZpZWxkSUQpIHsKLQkJU3RyaW5nIG9sZEZpZWxkSUQgPSBmaWVsZElEOwotCQlmaWVsZElEID0gbmV3RmllbGRJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19GSUVMRF9JRCwgb2xkRmllbGRJRCwgZmllbGRJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKSB7Ci0JCXJldHVybiB2YWx1ZUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciBuZXdWYWx1ZUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVmFsdWVJRCA9IHZhbHVlSUQ7Ci0JCXZhbHVlSUQgPSBuZXdWYWx1ZUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1ZBTFVFX0lELCBvbGRWYWx1ZUlELCB2YWx1ZUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKSB7Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIG5ld0R1cmF0aW9uRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkRHVyYXRpb25Gb3JtYXQgPSBkdXJhdGlvbkZvcm1hdDsKLQkJZHVyYXRpb25Gb3JtYXQgPSBuZXdEdXJhdGlvbkZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19EVVJBVElPTl9GT1JNQVQsIG9sZER1cmF0aW9uRm9ybWF0LCBkdXJhdGlvbkZvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBnZXRGaWVsZElEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIGdldFZhbHVlSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldER1cmF0aW9uRm9ybWF0KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1VJRDoKLQkJCQlzZXRVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUVfSUQ6Ci0JCQkJc2V0VmFsdWVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlzZXREdXJhdGlvbkZvcm1hdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoRklFTERfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoVkFMVUVfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoRFVSQVRJT05fRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19VSUQ6Ci0JCQkJcmV0dXJuIFVJRF9FREVGQVVMVCA9PSBudWxsID8gdUlEICE9IG51bGwgOiAhVUlEX0VERUZBVUxULmVxdWFscyh1SUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBGSUVMRF9JRF9FREVGQVVMVCA9PSBudWxsID8gZmllbGRJRCAhPSBudWxsIDogIUZJRUxEX0lEX0VERUZBVUxULmVxdWFscyhmaWVsZElEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gVkFMVUVfSURfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlSUQgIT0gbnVsbCA6ICFWQUxVRV9JRF9FREVGQVVMVC5lcXVhbHModmFsdWVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGR1cmF0aW9uRm9ybWF0ICE9IG51bGwgOiAhRFVSQVRJT05fRk9STUFUX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbkZvcm1hdCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1SUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmllbGRJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmllbGRJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkdXJhdGlvbkZvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZHVyYXRpb25Gb3JtYXQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZjBkYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2dldEZpZWxkTmFtZSA8ZW0+RmllbGQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCNnZXRBbGlhcyA8ZW0+QWxpYXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZUltcGwjZ2V0UGhvbmV0aWNBbGlhcyA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZUltcGwjZ2V0Um9sbHVwVHlwZSA8ZW0+Um9sbHVwIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZUltcGwjZ2V0Q2FsY3VsYXRpb25UeXBlIDxlbT5DYWxjdWxhdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2dldEZvcm11bGEgPGVtPkZvcm11bGE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZUltcGwjaXNSZXN0cmljdFZhbHVlcyA8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2dldFZhbHVlbGlzdFNvcnRPcmRlciA8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZUltcGwjaXNBcHBlbmROZXdWYWx1ZXMgPGVtPkFwcGVuZCBOZXcgVmFsdWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2dldERlZmF1bHQgPGVtPkRlZmF1bHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZUltcGwjZ2V0VmFsdWVMaXN0IDxlbT5WYWx1ZSBMaXN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFeHRlbmRlZEF0dHJpYnV0ZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkSUQoKSA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkSUQoKSA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmllbGRJRCA9IEZJRUxEX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkTmFtZSgpIDxlbT5GaWVsZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGROYW1lKCkgPGVtPkZpZWxkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWVsZE5hbWUgPSBGSUVMRF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsaWFzKCkgPGVtPkFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbGlhcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJQVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWxpYXMoKSA8ZW0+QWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFsaWFzID0gQUxJQVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGhvbmV0aWNBbGlhcygpIDxlbT5QaG9uZXRpYyBBbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGhvbmV0aWNBbGlhcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhPTkVUSUNfQUxJQVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGhvbmV0aWNBbGlhcygpIDxlbT5QaG9uZXRpYyBBbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGhvbmV0aWNBbGlhcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwaG9uZXRpY0FsaWFzID0gUEhPTkVUSUNfQUxJQVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sbHVwVHlwZSgpIDxlbT5Sb2xsdXAgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um9sbHVwVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFJPTExVUF9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvbGx1cFR5cGUoKSA8ZW0+Um9sbHVwIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGx1cFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHJvbGx1cFR5cGUgPSBST0xMVVBfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWxjdWxhdGlvblR5cGUoKSA8ZW0+Q2FsY3VsYXRpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FsY3VsYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgQ0FMQ1VMQVRJT05fVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWxjdWxhdGlvblR5cGUoKSA8ZW0+Q2FsY3VsYXRpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FsY3VsYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBjYWxjdWxhdGlvblR5cGUgPSBDQUxDVUxBVElPTl9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZvcm11bGEoKSA8ZW0+Rm9ybXVsYTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Rm9ybXVsYSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STVVMQV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGb3JtdWxhKCkgPGVtPkZvcm11bGE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZvcm11bGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZm9ybXVsYSA9IEZPUk1VTEFfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXN0cmljdFZhbHVlcygpIDxlbT5SZXN0cmljdCBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVzdHJpY3RWYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRVNUUklDVF9WQUxVRVNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVzdHJpY3RWYWx1ZXMoKSA8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Jlc3RyaWN0VmFsdWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXN0cmljdFZhbHVlcyA9IFJFU1RSSUNUX1ZBTFVFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVzdHJpY3QgVmFsdWVzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXN0cmljdFZhbHVlc0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIoKSA8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlbGlzdFNvcnRPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFZBTFVFTElTVF9TT1JUX09SREVSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlbGlzdFNvcnRPcmRlcigpIDxlbT5WYWx1ZWxpc3QgU29ydCBPcmRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVsaXN0U29ydE9yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB2YWx1ZWxpc3RTb3J0T3JkZXIgPSBWQUxVRUxJU1RfU09SVF9PUkRFUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0FwcGVuZE5ld1ZhbHVlcygpIDxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBcHBlbmROZXdWYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBBUFBFTkRfTkVXX1ZBTFVFU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBcHBlbmROZXdWYWx1ZXMoKSA8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhcHBlbmROZXdWYWx1ZXMgPSBBUFBFTkRfTkVXX1ZBTFVFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQXBwZW5kIE5ldyBWYWx1ZXMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFwcGVuZE5ld1ZhbHVlc0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0KCkgPGVtPkRlZmF1bHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdCgpIDxlbT5EZWZhdWx0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRfID0gREVGQVVMVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlTGlzdCgpIDxlbT5WYWx1ZSBMaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUxpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBWYWx1ZUxpc3QgdmFsdWVMaXN0ID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFeHRlbmRlZEF0dHJpYnV0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGRJRCgpIHsKLQkJcmV0dXJuIGZpZWxkSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmllbGRJRChTdHJpbmcgbmV3RmllbGRJRCkgewotCQlTdHJpbmcgb2xkRmllbGRJRCA9IGZpZWxkSUQ7Ci0JCWZpZWxkSUQgPSBuZXdGaWVsZElEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfSUQsIG9sZEZpZWxkSUQsIGZpZWxkSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKLQkJcmV0dXJuIGZpZWxkTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWVsZE5hbWUoU3RyaW5nIG5ld0ZpZWxkTmFtZSkgewotCQlTdHJpbmcgb2xkRmllbGROYW1lID0gZmllbGROYW1lOwotCQlmaWVsZE5hbWUgPSBuZXdGaWVsZE5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GSUVMRF9OQU1FLCBvbGRGaWVsZE5hbWUsIGZpZWxkTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWxpYXMoKSB7Ci0JCXJldHVybiBhbGlhczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGlhcyhTdHJpbmcgbmV3QWxpYXMpIHsKLQkJU3RyaW5nIG9sZEFsaWFzID0gYWxpYXM7Ci0JCWFsaWFzID0gbmV3QWxpYXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19BTElBUywgb2xkQWxpYXMsIGFsaWFzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQaG9uZXRpY0FsaWFzKCkgewotCQlyZXR1cm4gcGhvbmV0aWNBbGlhczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQaG9uZXRpY0FsaWFzKFN0cmluZyBuZXdQaG9uZXRpY0FsaWFzKSB7Ci0JCVN0cmluZyBvbGRQaG9uZXRpY0FsaWFzID0gcGhvbmV0aWNBbGlhczsKLQkJcGhvbmV0aWNBbGlhcyA9IG5ld1Bob25ldGljQWxpYXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19QSE9ORVRJQ19BTElBUywgb2xkUGhvbmV0aWNBbGlhcywgcGhvbmV0aWNBbGlhcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFJvbGx1cFR5cGUoKSB7Ci0JCXJldHVybiByb2xsdXBUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGx1cFR5cGUoQmlnSW50ZWdlciBuZXdSb2xsdXBUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkUm9sbHVwVHlwZSA9IHJvbGx1cFR5cGU7Ci0JCXJvbGx1cFR5cGUgPSBuZXdSb2xsdXBUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUk9MTFVQX1RZUEUsIG9sZFJvbGx1cFR5cGUsIHJvbGx1cFR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRDYWxjdWxhdGlvblR5cGUoKSB7Ci0JCXJldHVybiBjYWxjdWxhdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FsY3VsYXRpb25UeXBlKEJpZ0ludGVnZXIgbmV3Q2FsY3VsYXRpb25UeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkQ2FsY3VsYXRpb25UeXBlID0gY2FsY3VsYXRpb25UeXBlOwotCQljYWxjdWxhdGlvblR5cGUgPSBuZXdDYWxjdWxhdGlvblR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19DQUxDVUxBVElPTl9UWVBFLCBvbGRDYWxjdWxhdGlvblR5cGUsIGNhbGN1bGF0aW9uVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9ybXVsYSgpIHsKLQkJcmV0dXJuIGZvcm11bGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9ybXVsYShTdHJpbmcgbmV3Rm9ybXVsYSkgewotCQlTdHJpbmcgb2xkRm9ybXVsYSA9IGZvcm11bGE7Ci0JCWZvcm11bGEgPSBuZXdGb3JtdWxhOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRk9STVVMQSwgb2xkRm9ybXVsYSwgZm9ybXVsYSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVzdHJpY3RWYWx1ZXMoKSB7Ci0JCXJldHVybiByZXN0cmljdFZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXN0cmljdFZhbHVlcyhib29sZWFuIG5ld1Jlc3RyaWN0VmFsdWVzKSB7Ci0JCWJvb2xlYW4gb2xkUmVzdHJpY3RWYWx1ZXMgPSByZXN0cmljdFZhbHVlczsKLQkJcmVzdHJpY3RWYWx1ZXMgPSBuZXdSZXN0cmljdFZhbHVlczsKLQkJYm9vbGVhbiBvbGRSZXN0cmljdFZhbHVlc0VTZXQgPSByZXN0cmljdFZhbHVlc0VTZXQ7Ci0JCXJlc3RyaWN0VmFsdWVzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19SRVNUUklDVF9WQUxVRVMsIG9sZFJlc3RyaWN0VmFsdWVzLCByZXN0cmljdFZhbHVlcywgIW9sZFJlc3RyaWN0VmFsdWVzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmVzdHJpY3RWYWx1ZXMoKSB7Ci0JCWJvb2xlYW4gb2xkUmVzdHJpY3RWYWx1ZXMgPSByZXN0cmljdFZhbHVlczsKLQkJYm9vbGVhbiBvbGRSZXN0cmljdFZhbHVlc0VTZXQgPSByZXN0cmljdFZhbHVlc0VTZXQ7Ci0JCXJlc3RyaWN0VmFsdWVzID0gUkVTVFJJQ1RfVkFMVUVTX0VERUZBVUxUOwotCQlyZXN0cmljdFZhbHVlc0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUkVTVFJJQ1RfVkFMVUVTLCBvbGRSZXN0cmljdFZhbHVlcywgUkVTVFJJQ1RfVkFMVUVTX0VERUZBVUxULCBvbGRSZXN0cmljdFZhbHVlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJlc3RyaWN0VmFsdWVzKCkgewotCQlyZXR1cm4gcmVzdHJpY3RWYWx1ZXNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFZhbHVlbGlzdFNvcnRPcmRlcigpIHsKLQkJcmV0dXJuIHZhbHVlbGlzdFNvcnRPcmRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZWxpc3RTb3J0T3JkZXIoQmlnSW50ZWdlciBuZXdWYWx1ZWxpc3RTb3J0T3JkZXIpIHsKLQkJQmlnSW50ZWdlciBvbGRWYWx1ZWxpc3RTb3J0T3JkZXIgPSB2YWx1ZWxpc3RTb3J0T3JkZXI7Ci0JCXZhbHVlbGlzdFNvcnRPcmRlciA9IG5ld1ZhbHVlbGlzdFNvcnRPcmRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFTElTVF9TT1JUX09SREVSLCBvbGRWYWx1ZWxpc3RTb3J0T3JkZXIsIHZhbHVlbGlzdFNvcnRPcmRlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXBwZW5kTmV3VmFsdWVzKCkgewotCQlyZXR1cm4gYXBwZW5kTmV3VmFsdWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFwcGVuZE5ld1ZhbHVlcyhib29sZWFuIG5ld0FwcGVuZE5ld1ZhbHVlcykgewotCQlib29sZWFuIG9sZEFwcGVuZE5ld1ZhbHVlcyA9IGFwcGVuZE5ld1ZhbHVlczsKLQkJYXBwZW5kTmV3VmFsdWVzID0gbmV3QXBwZW5kTmV3VmFsdWVzOwotCQlib29sZWFuIG9sZEFwcGVuZE5ld1ZhbHVlc0VTZXQgPSBhcHBlbmROZXdWYWx1ZXNFU2V0OwotCQlhcHBlbmROZXdWYWx1ZXNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0FQUEVORF9ORVdfVkFMVUVTLCBvbGRBcHBlbmROZXdWYWx1ZXMsIGFwcGVuZE5ld1ZhbHVlcywgIW9sZEFwcGVuZE5ld1ZhbHVlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEFwcGVuZE5ld1ZhbHVlcygpIHsKLQkJYm9vbGVhbiBvbGRBcHBlbmROZXdWYWx1ZXMgPSBhcHBlbmROZXdWYWx1ZXM7Ci0JCWJvb2xlYW4gb2xkQXBwZW5kTmV3VmFsdWVzRVNldCA9IGFwcGVuZE5ld1ZhbHVlc0VTZXQ7Ci0JCWFwcGVuZE5ld1ZhbHVlcyA9IEFQUEVORF9ORVdfVkFMVUVTX0VERUZBVUxUOwotCQlhcHBlbmROZXdWYWx1ZXNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0FQUEVORF9ORVdfVkFMVUVTLCBvbGRBcHBlbmROZXdWYWx1ZXMsIEFQUEVORF9ORVdfVkFMVUVTX0VERUZBVUxULCBvbGRBcHBlbmROZXdWYWx1ZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRBcHBlbmROZXdWYWx1ZXMoKSB7Ci0JCXJldHVybiBhcHBlbmROZXdWYWx1ZXNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRfOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5ld0RlZmF1bHQpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHQgPSBkZWZhdWx0XzsKLQkJZGVmYXVsdF8gPSBuZXdEZWZhdWx0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fREVGQVVMVCwgb2xkRGVmYXVsdCwgZGVmYXVsdF8pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFsdWVMaXN0IGdldFZhbHVlTGlzdCgpIHsKLQkJcmV0dXJuIHZhbHVlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRWYWx1ZUxpc3QoVmFsdWVMaXN0IG5ld1ZhbHVlTGlzdCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlWYWx1ZUxpc3Qgb2xkVmFsdWVMaXN0ID0gdmFsdWVMaXN0OwotCQl2YWx1ZUxpc3QgPSBuZXdWYWx1ZUxpc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRV9MSVNULCBvbGRWYWx1ZUxpc3QsIG5ld1ZhbHVlTGlzdCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVMaXN0KFZhbHVlTGlzdCBuZXdWYWx1ZUxpc3QpIHsKLQkJaWYgKG5ld1ZhbHVlTGlzdCAhPSB2YWx1ZUxpc3QpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHZhbHVlTGlzdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl2YWx1ZUxpc3QpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VmFsdWVMaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1ZhbHVlTGlzdCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRV9MSVNULCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFZhbHVlTGlzdChuZXdWYWx1ZUxpc3QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFX0xJU1QsIG5ld1ZhbHVlTGlzdCwgbmV3VmFsdWVMaXN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0VmFsdWVMaXN0KG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIGdldEZpZWxkSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX05BTUU6Ci0JCQkJcmV0dXJuIGdldEZpZWxkTmFtZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQUxJQVM6Ci0JCQkJcmV0dXJuIGdldEFsaWFzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19QSE9ORVRJQ19BTElBUzoKLQkJCQlyZXR1cm4gZ2V0UGhvbmV0aWNBbGlhcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUk9MTFVQX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFJvbGx1cFR5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0NBTENVTEFUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGdldENhbGN1bGF0aW9uVHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRk9STVVMQToKLQkJCQlyZXR1cm4gZ2V0Rm9ybXVsYSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUkVTVFJJQ1RfVkFMVUVTOgotCQkJCXJldHVybiBpc1Jlc3RyaWN0VmFsdWVzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVMSVNUX1NPUlRfT1JERVI6Ci0JCQkJcmV0dXJuIGdldFZhbHVlbGlzdFNvcnRPcmRlcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQVBQRU5EX05FV19WQUxVRVM6Ci0JCQkJcmV0dXJuIGlzQXBwZW5kTmV3VmFsdWVzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fREVGQVVMVDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVDoKLQkJCQlyZXR1cm4gZ2V0VmFsdWVMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GSUVMRF9OQU1FOgotCQkJCXNldEZpZWxkTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19BTElBUzoKLQkJCQlzZXRBbGlhcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19QSE9ORVRJQ19BTElBUzoKLQkJCQlzZXRQaG9uZXRpY0FsaWFzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JPTExVUF9UWVBFOgotCQkJCXNldFJvbGx1cFR5cGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0NBTENVTEFUSU9OX1RZUEU6Ci0JCQkJc2V0Q2FsY3VsYXRpb25UeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GT1JNVUxBOgotCQkJCXNldEZvcm11bGEoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUkVTVFJJQ1RfVkFMVUVTOgotCQkJCXNldFJlc3RyaWN0VmFsdWVzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFTElTVF9TT1JUX09SREVSOgotCQkJCXNldFZhbHVlbGlzdFNvcnRPcmRlcigoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQVBQRU5EX05FV19WQUxVRVM6Ci0JCQkJc2V0QXBwZW5kTmV3VmFsdWVzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0RFRkFVTFQ6Ci0JCQkJc2V0RGVmYXVsdCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRV9MSVNUOgotCQkJCXNldFZhbHVlTGlzdCgoVmFsdWVMaXN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRChGSUVMRF9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfTkFNRToKLQkJCQlzZXRGaWVsZE5hbWUoRklFTERfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQUxJQVM6Ci0JCQkJc2V0QWxpYXMoQUxJQVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1BIT05FVElDX0FMSUFTOgotCQkJCXNldFBob25ldGljQWxpYXMoUEhPTkVUSUNfQUxJQVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JPTExVUF9UWVBFOgotCQkJCXNldFJvbGx1cFR5cGUoUk9MTFVQX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0NBTENVTEFUSU9OX1RZUEU6Ci0JCQkJc2V0Q2FsY3VsYXRpb25UeXBlKENBTENVTEFUSU9OX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZPUk1VTEE6Ci0JCQkJc2V0Rm9ybXVsYShGT1JNVUxBX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19SRVNUUklDVF9WQUxVRVM6Ci0JCQkJdW5zZXRSZXN0cmljdFZhbHVlcygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFTElTVF9TT1JUX09SREVSOgotCQkJCXNldFZhbHVlbGlzdFNvcnRPcmRlcihWQUxVRUxJU1RfU09SVF9PUkRFUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQVBQRU5EX05FV19WQUxVRVM6Ci0JCQkJdW5zZXRBcHBlbmROZXdWYWx1ZXMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19ERUZBVUxUOgotCQkJCXNldERlZmF1bHQoREVGQVVMVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVDoKLQkJCQlzZXRWYWx1ZUxpc3QoKFZhbHVlTGlzdCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBGSUVMRF9JRF9FREVGQVVMVCA9PSBudWxsID8gZmllbGRJRCAhPSBudWxsIDogIUZJRUxEX0lEX0VERUZBVUxULmVxdWFscyhmaWVsZElEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX05BTUU6Ci0JCQkJcmV0dXJuIEZJRUxEX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGZpZWxkTmFtZSAhPSBudWxsIDogIUZJRUxEX05BTUVfRURFRkFVTFQuZXF1YWxzKGZpZWxkTmFtZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19BTElBUzoKLQkJCQlyZXR1cm4gQUxJQVNfRURFRkFVTFQgPT0gbnVsbCA/IGFsaWFzICE9IG51bGwgOiAhQUxJQVNfRURFRkFVTFQuZXF1YWxzKGFsaWFzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1BIT05FVElDX0FMSUFTOgotCQkJCXJldHVybiBQSE9ORVRJQ19BTElBU19FREVGQVVMVCA9PSBudWxsID8gcGhvbmV0aWNBbGlhcyAhPSBudWxsIDogIVBIT05FVElDX0FMSUFTX0VERUZBVUxULmVxdWFscyhwaG9uZXRpY0FsaWFzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JPTExVUF9UWVBFOgotCQkJCXJldHVybiBST0xMVVBfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gcm9sbHVwVHlwZSAhPSBudWxsIDogIVJPTExVUF9UWVBFX0VERUZBVUxULmVxdWFscyhyb2xsdXBUeXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0NBTENVTEFUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIENBTENVTEFUSU9OX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGNhbGN1bGF0aW9uVHlwZSAhPSBudWxsIDogIUNBTENVTEFUSU9OX1RZUEVfRURFRkFVTFQuZXF1YWxzKGNhbGN1bGF0aW9uVHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GT1JNVUxBOgotCQkJCXJldHVybiBGT1JNVUxBX0VERUZBVUxUID09IG51bGwgPyBmb3JtdWxhICE9IG51bGwgOiAhRk9STVVMQV9FREVGQVVMVC5lcXVhbHMoZm9ybXVsYSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19SRVNUUklDVF9WQUxVRVM6Ci0JCQkJcmV0dXJuIGlzU2V0UmVzdHJpY3RWYWx1ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFTElTVF9TT1JUX09SREVSOgotCQkJCXJldHVybiBWQUxVRUxJU1RfU09SVF9PUkRFUl9FREVGQVVMVCA9PSBudWxsID8gdmFsdWVsaXN0U29ydE9yZGVyICE9IG51bGwgOiAhVkFMVUVMSVNUX1NPUlRfT1JERVJfRURFRkFVTFQuZXF1YWxzKHZhbHVlbGlzdFNvcnRPcmRlcik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19BUFBFTkRfTkVXX1ZBTFVFUzoKLQkJCQlyZXR1cm4gaXNTZXRBcHBlbmROZXdWYWx1ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0RFRkFVTFQ6Ci0JCQkJcmV0dXJuIERFRkFVTFRfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRfICE9IG51bGwgOiAhREVGQVVMVF9FREVGQVVMVC5lcXVhbHMoZGVmYXVsdF8pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVDoKLQkJCQlyZXR1cm4gdmFsdWVMaXN0ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmaWVsZElEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaWVsZElEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaWVsZE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWxpYXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFsaWFzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwaG9uZXRpY0FsaWFzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwaG9uZXRpY0FsaWFzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByb2xsdXBUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyb2xsdXBUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYWxjdWxhdGlvblR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhbGN1bGF0aW9uVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZm9ybXVsYTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZm9ybXVsYSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzdHJpY3RWYWx1ZXM6ICIpOwotCQlpZiAocmVzdHJpY3RWYWx1ZXNFU2V0KSByZXN1bHQuYXBwZW5kKHJlc3RyaWN0VmFsdWVzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWVsaXN0U29ydE9yZGVyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZWxpc3RTb3J0T3JkZXIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFwcGVuZE5ld1ZhbHVlczogIik7Ci0JCWlmIChhcHBlbmROZXdWYWx1ZXNFU2V0KSByZXN1bHQuYXBwZW5kKGFwcGVuZE5ld1ZhbHVlcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlZmF1bHRfKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGVzSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJkZTA5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGVzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXh0ZW5kZWRBdHRyaWJ1dGVzSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlc0ltcGwjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuZGVkQXR0cmlidXRlc0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEV4dGVuZGVkQXR0cmlidXRlcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZXh0ZW5kZWRBdHRyaWJ1dGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEV4dGVuZGVkQXR0cmlidXRlc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZEF0dHJpYnV0ZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFeHRlbmRlZEF0dHJpYnV0ZS5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVTX19FWFRFTkRFRF9BVFRSSUJVVEUpOwotCQl9Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFU19fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEV4dGVuZGVkQXR0cmlidXRlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVTX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGdldEV4dGVuZGVkQXR0cmlidXRlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURVNfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFU19fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVTX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlICE9IG51bGwgJiYgIWV4dGVuZGVkQXR0cmlidXRlLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vRXh0ZW5kZWRBdHRyaWJ1dGVzSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01hc2tJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvTWFza0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzMzYzNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvTWFza0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1hc2tJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWFzazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1hc2tJbXBsI2dldExldmVsIDxlbT5MZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1hc2tJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrSW1wbCNnZXRMZW5ndGggPGVtPkxlbmd0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1hc2tJbXBsI2dldFNlcGFyYXRvciA8ZW0+U2VwYXJhdG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWFza0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1hc2sgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbCgpIDxlbT5MZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBMRVZFTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbCgpIDxlbT5MZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGxldmVsID0gTEVWRUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExlbmd0aCgpIDxlbT5MZW5ndGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExlbmd0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIExFTkdUSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZW5ndGgoKSA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGxlbmd0aCA9IExFTkdUSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXBhcmF0b3IoKSA8ZW0+U2VwYXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXBhcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUEFSQVRPUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXBhcmF0b3IoKSA8ZW0+U2VwYXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXBhcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2VwYXJhdG9yID0gU0VQQVJBVE9SX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1hc2tJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWFzaygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldExldmVsKCkgewotCQlyZXR1cm4gbGV2ZWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV2ZWwoQmlnSW50ZWdlciBuZXdMZXZlbCkgewotCQlCaWdJbnRlZ2VyIG9sZExldmVsID0gbGV2ZWw7Ci0JCWxldmVsID0gbmV3TGV2ZWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fTEVWRUwsIG9sZExldmVsLCBsZXZlbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoQmlnSW50ZWdlciBuZXdUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBsZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKEJpZ0ludGVnZXIgbmV3TGVuZ3RoKSB7Ci0JCUJpZ0ludGVnZXIgb2xkTGVuZ3RoID0gbGVuZ3RoOwotCQlsZW5ndGggPSBuZXdMZW5ndGg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fTEVOR1RILCBvbGRMZW5ndGgsIGxlbmd0aCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VwYXJhdG9yKCkgewotCQlyZXR1cm4gc2VwYXJhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcGFyYXRvcihTdHJpbmcgbmV3U2VwYXJhdG9yKSB7Ci0JCVN0cmluZyBvbGRTZXBhcmF0b3IgPSBzZXBhcmF0b3I7Ci0JCXNlcGFyYXRvciA9IG5ld1NlcGFyYXRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19TRVBBUkFUT1IsIG9sZFNlcGFyYXRvciwgc2VwYXJhdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFVkVMOgotCQkJCXJldHVybiBnZXRMZXZlbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19MRU5HVEg6Ci0JCQkJcmV0dXJuIGdldExlbmd0aCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX1NFUEFSQVRPUjoKLQkJCQlyZXR1cm4gZ2V0U2VwYXJhdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFVkVMOgotCQkJCXNldExldmVsKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fVFlQRToKLQkJCQlzZXRUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fTEVOR1RIOgotCQkJCXNldExlbmd0aCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX1NFUEFSQVRPUjoKLQkJCQlzZXRTZXBhcmF0b3IoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19MRVZFTDoKLQkJCQlzZXRMZXZlbChMRVZFTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fTEVOR1RIOgotCQkJCXNldExlbmd0aChMRU5HVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19TRVBBUkFUT1I6Ci0JCQkJc2V0U2VwYXJhdG9yKFNFUEFSQVRPUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fTEVWRUw6Ci0JCQkJcmV0dXJuIExFVkVMX0VERUZBVUxUID09IG51bGwgPyBsZXZlbCAhPSBudWxsIDogIUxFVkVMX0VERUZBVUxULmVxdWFscyhsZXZlbCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFTkdUSDoKLQkJCQlyZXR1cm4gTEVOR1RIX0VERUZBVUxUID09IG51bGwgPyBsZW5ndGggIT0gbnVsbCA6ICFMRU5HVEhfRURFRkFVTFQuZXF1YWxzKGxlbmd0aCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fU0VQQVJBVE9SOgotCQkJCXJldHVybiBTRVBBUkFUT1JfRURFRkFVTFQgPT0gbnVsbCA/IHNlcGFyYXRvciAhPSBudWxsIDogIVNFUEFSQVRPUl9FREVGQVVMVC5lcXVhbHMoc2VwYXJhdG9yKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxldmVsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGVuZ3RoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZW5ndGgpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNlcGFyYXRvcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2VwYXJhdG9yKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWFza0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9NYXNrc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9NYXNrc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdhN2VmOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvTWFza3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNYXNrc0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NYXNrczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1hc2tzSW1wbCNnZXRNYXNrIDxlbT5NYXNrPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWFza3NJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNYXNrcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFzaygpIDxlbT5NYXNrPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtYXNrID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNYXNrc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRNYXNrcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNYXNrKCkgewotCQlpZiAobWFzayA9PSBudWxsKSB7Ci0JCQltYXNrID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1hc2suY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuTUFTS1NfX01BU0spOwotCQl9Ci0JCXJldHVybiBtYXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLU19fTUFTSzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNYXNrKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLU19fTUFTSzoKLQkJCQlyZXR1cm4gZ2V0TWFzaygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLU19fTUFTSzoKLQkJCQlnZXRNYXNrKCkuY2xlYXIoKTsKLQkJCQlnZXRNYXNrKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tTX19NQVNLOgotCQkJCWdldE1hc2soKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tTX19NQVNLOgotCQkJCXJldHVybiBtYXNrICE9IG51bGwgJiYgIW1hc2suaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9NYXNrc0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Nc3Byb2plY3RGYWN0b3J5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01zcHJvamVjdEZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMDJjZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01zcHJvamVjdEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQ0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTXNwcm9qZWN0RmFjdG9yeUltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1zcHJvamVjdEZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgTXNwcm9qZWN0RmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTXNwcm9qZWN0RmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UOiByZXR1cm4gY3JlYXRlQXNzaWdubWVudCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRTOiByZXR1cm4gY3JlYXRlQXNzaWdubWVudHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EOiByZXR1cm4gY3JlYXRlQXZhaWxhYmlsaXR5UGVyaW9kKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRFM6IHJldHVybiBjcmVhdGVBdmFpbGFiaWxpdHlQZXJpb2RzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkU6IHJldHVybiBjcmVhdGVCYXNlbGluZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMjogcmV0dXJuIGNyZWF0ZUJhc2VsaW5lMigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMzogcmV0dXJuIGNyZWF0ZUJhc2VsaW5lMygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSOiByZXR1cm4gY3JlYXRlQ2FsZW5kYXIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUlM6IHJldHVybiBjcmVhdGVDYWxlbmRhcnMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UOiByZXR1cm4gY3JlYXRlRG9jdW1lbnRSb290KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFOiByZXR1cm4gY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyOiByZXR1cm4gY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGUyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMzogcmV0dXJuIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlMygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTQ6IHJldHVybiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVTOiByZXR1cm4gY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTSzogcmV0dXJuIGNyZWF0ZU1hc2soKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLUzogcmV0dXJuIGNyZWF0ZU1hc2tzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFOiByZXR1cm4gY3JlYXRlT3V0bGluZUNvZGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyOiByZXR1cm4gY3JlYXRlT3V0bGluZUNvZGUyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMzogcmV0dXJuIGNyZWF0ZU91dGxpbmVDb2RlMygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERVM6IHJldHVybiBjcmVhdGVPdXRsaW5lQ29kZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LOiByZXR1cm4gY3JlYXRlUHJlZGVjZXNzb3JMaW5rKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVDogcmV0dXJuIGNyZWF0ZVByb2plY3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFOiByZXR1cm4gY3JlYXRlUmF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVTOiByZXR1cm4gY3JlYXRlUmF0ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRTogcmV0dXJuIGNyZWF0ZVJlc291cmNlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTOiByZXR1cm4gY3JlYXRlUmVzb3VyY2VzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTSzogcmV0dXJuIGNyZWF0ZVRhc2soKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLUzogcmV0dXJuIGNyZWF0ZVRhc2tzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0Q6IHJldHVybiBjcmVhdGVUaW1lUGVyaW9kKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEU6IHJldHVybiBjcmVhdGVUaW1lcGhhc2VkRGF0YVR5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTogcmV0dXJuIGNyZWF0ZVZhbHVlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyOiByZXR1cm4gY3JlYXRlVmFsdWUyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfTElTVDogcmV0dXJuIGNyZWF0ZVZhbHVlTGlzdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFUzogcmV0dXJuIGNyZWF0ZVZhbHVlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLOiByZXR1cm4gY3JlYXRlV0JTTWFzaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLUzogcmV0dXJuIGNyZWF0ZVdCU01hc2tzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVk6IHJldHVybiBjcmVhdGVXZWVrRGF5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlTOiByZXR1cm4gY3JlYXRlV2Vla0RheXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUU6IHJldHVybiBjcmVhdGVXb3JraW5nVGltZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRVM6IHJldHVybiBjcmVhdGVXb3JraW5nVGltZXMoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQUNDUlVFX0FUOgotCQkJCXJldHVybiBjcmVhdGVBY2NydWVBdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFDVElWRV9ESVJFQ1RPUllfR1VJRF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFMSUFTX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUFsaWFzVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFVVEhPUl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVBdXRob3JUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJPT0tJTkdfVFlQRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVCb29raW5nVHlwZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CT09LSU5HX1RZUEVfVFlQRTE6Ci0JCQkJcmV0dXJuIGNyZWF0ZUJvb2tpbmdUeXBlVHlwZTFGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxDVUxBVElPTl9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUNhbGN1bGF0aW9uVHlwZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQVRFR09SWV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDYXRlZ29yeVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT0RFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvZGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09NUEFOWV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDb21wYW55VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPTlNUUkFJTlRfVFlQRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDb25zdHJhaW50VHlwZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT05UQUNUX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbnRhY3RUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09TVF9SQVRFX1RBQkxFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvc3RSYXRlVGFibGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ1VSUkVOQ1lfU1lNQk9MX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUN1cnJlbmN5U3ltYm9sVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRBWV9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZURheVR5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuREVGQVVMVF9UQVNLX0VWX01FVEhPRF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVEZWZhdWx0VGFza0VWTWV0aG9kVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRFRkFVTFRfVEFTS19UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZURlZmF1bHRUYXNrVHlwZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjcmVhdGVEdXJhdGlvbkZvcm1hdFR5cGUxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEUyOgotCQkJCXJldHVybiBjcmVhdGVEdXJhdGlvbkZvcm1hdFR5cGUyRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEUzOgotCQkJCXJldHVybiBjcmVhdGVEdXJhdGlvbkZvcm1hdFR5cGUzRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEU0OgotCQkJCXJldHVybiBjcmVhdGVEdXJhdGlvbkZvcm1hdFR5cGU0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEU1OgotCQkJCXJldHVybiBjcmVhdGVEdXJhdGlvbkZvcm1hdFR5cGU1RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FQVJORURfVkFMVUVfTUVUSE9EX1RZUEUxOgotCQkJCXJldHVybiBjcmVhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRU1BSUxfQUREUkVTU19UWVBFOgotCQkJCXJldHVybiBjcmVhdGVFbWFpbEFkZHJlc3NUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURVJOQUxfVEFTS19QUk9KRUNUX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4dGVybmFsVGFza1Byb2plY3RUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRklYRURfQ09TVF9BQ0NSVUFMX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUZpeGVkQ29zdEFjY3J1YWxUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRllfU1RBUlRfREFURV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVGWVN0YXJ0RGF0ZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5HUk9VUF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVHcm91cFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfQUREUkVTU19UWVBFOgotCQkJCXJldHVybiBjcmVhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19BRERSRVNTX1RZUEUxOgotCQkJCXJldHVybiBjcmVhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTFGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfQUREUkVTU19UWVBFMjoKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUyRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1NVQl9BRERSRVNTX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1NVQl9BRERSRVNTX1RZUEUxOgotCQkJCXJldHVybiBjcmVhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTFGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRTI6Ci0JCQkJcmV0dXJuIGNyZWF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlMkZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19UWVBFOgotCQkJCXJldHVybiBjcmVhdGVIeXBlcmxpbmtUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1RZUEUxOgotCQkJCXJldHVybiBjcmVhdGVIeXBlcmxpbmtUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19UWVBFMjoKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rVHlwZTJGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5JTklUSUFMU19UWVBFOgotCQkJCXJldHVybiBjcmVhdGVJbml0aWFsc1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5MQUdfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUxhZ0Zvcm1hdFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5MRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5MRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRTE6Ci0JCQkJcmV0dXJuIGNyZWF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BTkFHRVJfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlTWFuYWdlclR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVRFUklBTF9MQUJFTF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVNYXRlcmlhbExhYmVsVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5BTUVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlTmFtZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEUxOgotCQkJCXJldHVybiBjcmVhdGVOYW1lVHlwZTFGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEUyOgotCQkJCXJldHVybiBjcmVhdGVOYW1lVHlwZTJGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEUzOgotCQkJCXJldHVybiBjcmVhdGVOYW1lVHlwZTNGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ORVdfVEFTS19TVEFSVF9EQVRFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZU5ld1Rhc2tTdGFydERhdGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTlRfQUNDT1VOVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVOVEFjY291bnRUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9OVU1CRVJfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlT3V0bGluZU51bWJlclR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRTE6Ci0JCQkJcmV0dXJuIGNyZWF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUEhPTkVUSUNfQUxJQVNfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlUGhvbmV0aWNBbGlhc1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QSE9ORVRJQ1NfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlUGhvbmV0aWNzVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRUZJWF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVQcmVmaXhUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9UQUJMRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVSYXRlVGFibGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUk9MTFVQX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlUm9sbHVwVHlwZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5TVEFOREFSRF9SQVRFX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRTE6Ci0JCQkJcmV0dXJuIGNyZWF0ZVN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuU1VCSkVDVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVTdWJqZWN0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNVQlBST0pFQ1RfTkFNRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVTdWJwcm9qZWN0TmFtZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USVRMRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVUaXRsZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlVHlwZVR5cGUxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFMjoKLQkJCQlyZXR1cm4gY3JlYXRlVHlwZVR5cGUyRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFMzoKLQkJCQlyZXR1cm4gY3JlYXRlVHlwZVR5cGUzRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFNDoKLQkJCQlyZXR1cm4gY3JlYXRlVHlwZVR5cGU0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFNToKLQkJCQlyZXR1cm4gY3JlYXRlVHlwZVR5cGU1RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVUlEX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVVJRFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5VTklUX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVVuaXRUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVMSVNUX1NPUlRfT1JERVJfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlVmFsdWVsaXN0U29ydE9yZGVyVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfU1RBUlRfREFZX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVdlZWtTdGFydERheVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLX0NPTlRPVVJfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlV29ya0NvbnRvdXJUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlV29ya0Zvcm1hdFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLX0dST1VQX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtHcm91cFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQUNDUlVFX0FUOgotCQkJCXJldHVybiBjb252ZXJ0QWNjcnVlQXRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFDVElWRV9ESVJFQ1RPUllfR1VJRF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0QWN0aXZlRGlyZWN0b3J5R1VJRFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFMSUFTX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRBbGlhc1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFVVEhPUl9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0QXV0aG9yVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJPT0tJTkdfVFlQRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Qm9va2luZ1R5cGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CT09LSU5HX1RZUEVfVFlQRTE6Ci0JCQkJcmV0dXJuIGNvbnZlcnRCb29raW5nVHlwZVR5cGUxVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxDVUxBVElPTl9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRDYWxjdWxhdGlvblR5cGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQVRFR09SWV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q2F0ZWdvcnlUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT0RFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRDb2RlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09NUEFOWV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q29tcGFueVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPTlNUUkFJTlRfVFlQRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q29uc3RyYWludFR5cGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT05UQUNUX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRDb250YWN0VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09TVF9SQVRFX1RBQkxFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRDb3N0UmF0ZVRhYmxlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ1VSUkVOQ1lfU1lNQk9MX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRDdXJyZW5jeVN5bWJvbFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRBWV9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnREYXlUeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydERlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuREVGQVVMVF9UQVNLX0VWX01FVEhPRF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RGVmYXVsdFRhc2tFVk1ldGhvZFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRFRkFVTFRfVEFTS19UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnREZWZhdWx0VGFza1R5cGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydER1cmF0aW9uRm9ybWF0VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEUyOgotCQkJCXJldHVybiBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlMlRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEUzOgotCQkJCXJldHVybiBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlM1RvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEU0OgotCQkJCXJldHVybiBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlNFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEU1OgotCQkJCXJldHVybiBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlNVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RWFybmVkVmFsdWVNZXRob2RUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FQVJORURfVkFMVUVfTUVUSE9EX1RZUEUxOgotCQkJCXJldHVybiBjb252ZXJ0RWFybmVkVmFsdWVNZXRob2RUeXBlMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRU1BSUxfQUREUkVTU19UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RW1haWxBZGRyZXNzVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURVJOQUxfVEFTS19QUk9KRUNUX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRklYRURfQ09TVF9BQ0NSVUFMX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRGaXhlZENvc3RBY2NydWFsVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRllfU1RBUlRfREFURV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RllTdGFydERhdGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5HUk9VUF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0R3JvdXBUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfQUREUkVTU19UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0SHlwZXJsaW5rQWRkcmVzc1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19BRERSRVNTX1RZUEUxOgotCQkJCXJldHVybiBjb252ZXJ0SHlwZXJsaW5rQWRkcmVzc1R5cGUxVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfQUREUkVTU19UWVBFMjoKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua0FkZHJlc3NUeXBlMlRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1NVQl9BRERSRVNTX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1NVQl9BRERSRVNTX1RZUEUxOgotCQkJCXJldHVybiBjb252ZXJ0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRTI6Ci0JCQkJcmV0dXJuIGNvbnZlcnRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTJUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0SHlwZXJsaW5rVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1RZUEUxOgotCQkJCXJldHVybiBjb252ZXJ0SHlwZXJsaW5rVHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19UWVBFMjoKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua1R5cGUyVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5JTklUSUFMU19UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0SW5pdGlhbHNUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5MQUdfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRMYWdGb3JtYXRUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5MRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydExldmVsaW5nRGVsYXlGb3JtYXRUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5MRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRTE6Ci0JCQkJcmV0dXJuIGNvbnZlcnRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BTkFHRVJfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydE1hbmFnZXJUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVRFUklBTF9MQUJFTF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0TWF0ZXJpYWxMYWJlbFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5BTUVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydE5hbWVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEUxOgotCQkJCXJldHVybiBjb252ZXJ0TmFtZVR5cGUxVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEUyOgotCQkJCXJldHVybiBjb252ZXJ0TmFtZVR5cGUyVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEUzOgotCQkJCXJldHVybiBjb252ZXJ0TmFtZVR5cGUzVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ORVdfVEFTS19TVEFSVF9EQVRFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnROZXdUYXNrU3RhcnREYXRlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTlRfQUNDT1VOVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0TlRBY2NvdW50VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9OVU1CRVJfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydE91dGxpbmVOdW1iZXJUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRTE6Ci0JCQkJcmV0dXJuIGNvbnZlcnRPdmVydGltZVJhdGVGb3JtYXRUeXBlMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUEhPTkVUSUNfQUxJQVNfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFBob25ldGljQWxpYXNUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QSE9ORVRJQ1NfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFBob25ldGljc1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRUZJWF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0UHJlZml4VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9UQUJMRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0UmF0ZVRhYmxlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUk9MTFVQX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFJvbGx1cFR5cGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5TVEFOREFSRF9SQVRFX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRTE6Ci0JCQkJcmV0dXJuIGNvbnZlcnRTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuU1VCSkVDVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0U3ViamVjdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNVQlBST0pFQ1RfTkFNRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0U3VicHJvamVjdE5hbWVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USVRMRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VGl0bGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydFR5cGVUeXBlMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFMjoKLQkJCQlyZXR1cm4gY29udmVydFR5cGVUeXBlMlRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFMzoKLQkJCQlyZXR1cm4gY29udmVydFR5cGVUeXBlM1RvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFNDoKLQkJCQlyZXR1cm4gY29udmVydFR5cGVUeXBlNFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFNToKLQkJCQlyZXR1cm4gY29udmVydFR5cGVUeXBlNVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVUlEX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRVSURUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5VTklUX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRVbml0VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVMSVNUX1NPUlRfT1JERVJfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFZhbHVlbGlzdFNvcnRPcmRlclR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfU1RBUlRfREFZX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRXZWVrU3RhcnREYXlUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLX0NPTlRPVVJfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFdvcmtDb250b3VyVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFdvcmtGb3JtYXRUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLX0dST1VQX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRXb3JrR3JvdXBUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBc3NpZ25tZW50IGNyZWF0ZUFzc2lnbm1lbnQoKSB7Ci0JCUFzc2lnbm1lbnRJbXBsIGFzc2lnbm1lbnQgPSBuZXcgQXNzaWdubWVudEltcGwoKTsKLQkJcmV0dXJuIGFzc2lnbm1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFzc2lnbm1lbnRzIGNyZWF0ZUFzc2lnbm1lbnRzKCkgewotCQlBc3NpZ25tZW50c0ltcGwgYXNzaWdubWVudHMgPSBuZXcgQXNzaWdubWVudHNJbXBsKCk7Ci0JCXJldHVybiBhc3NpZ25tZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXZhaWxhYmlsaXR5UGVyaW9kIGNyZWF0ZUF2YWlsYWJpbGl0eVBlcmlvZCgpIHsKLQkJQXZhaWxhYmlsaXR5UGVyaW9kSW1wbCBhdmFpbGFiaWxpdHlQZXJpb2QgPSBuZXcgQXZhaWxhYmlsaXR5UGVyaW9kSW1wbCgpOwotCQlyZXR1cm4gYXZhaWxhYmlsaXR5UGVyaW9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBdmFpbGFiaWxpdHlQZXJpb2RzIGNyZWF0ZUF2YWlsYWJpbGl0eVBlcmlvZHMoKSB7Ci0JCUF2YWlsYWJpbGl0eVBlcmlvZHNJbXBsIGF2YWlsYWJpbGl0eVBlcmlvZHMgPSBuZXcgQXZhaWxhYmlsaXR5UGVyaW9kc0ltcGwoKTsKLQkJcmV0dXJuIGF2YWlsYWJpbGl0eVBlcmlvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJhc2VsaW5lIGNyZWF0ZUJhc2VsaW5lKCkgewotCQlCYXNlbGluZUltcGwgYmFzZWxpbmUgPSBuZXcgQmFzZWxpbmVJbXBsKCk7Ci0JCXJldHVybiBiYXNlbGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmFzZWxpbmUyIGNyZWF0ZUJhc2VsaW5lMigpIHsKLQkJQmFzZWxpbmUySW1wbCBiYXNlbGluZTIgPSBuZXcgQmFzZWxpbmUySW1wbCgpOwotCQlyZXR1cm4gYmFzZWxpbmUyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCYXNlbGluZTMgY3JlYXRlQmFzZWxpbmUzKCkgewotCQlCYXNlbGluZTNJbXBsIGJhc2VsaW5lMyA9IG5ldyBCYXNlbGluZTNJbXBsKCk7Ci0JCXJldHVybiBiYXNlbGluZTM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENhbGVuZGFyIGNyZWF0ZUNhbGVuZGFyKCkgewotCQlDYWxlbmRhckltcGwgY2FsZW5kYXIgPSBuZXcgQ2FsZW5kYXJJbXBsKCk7Ci0JCXJldHVybiBjYWxlbmRhcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ2FsZW5kYXJzIGNyZWF0ZUNhbGVuZGFycygpIHsKLQkJQ2FsZW5kYXJzSW1wbCBjYWxlbmRhcnMgPSBuZXcgQ2FsZW5kYXJzSW1wbCgpOwotCQlyZXR1cm4gY2FsZW5kYXJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb2N1bWVudFJvb3QgY3JlYXRlRG9jdW1lbnRSb290KCkgewotCQlEb2N1bWVudFJvb3RJbXBsIGRvY3VtZW50Um9vdCA9IG5ldyBEb2N1bWVudFJvb3RJbXBsKCk7Ci0JCXJldHVybiBkb2N1bWVudFJvb3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4dGVuZGVkQXR0cmlidXRlIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlKCkgewotCQlFeHRlbmRlZEF0dHJpYnV0ZUltcGwgZXh0ZW5kZWRBdHRyaWJ1dGUgPSBuZXcgRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsKCk7Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRBdHRyaWJ1dGUyIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlMigpIHsKLQkJRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbCBleHRlbmRlZEF0dHJpYnV0ZTIgPSBuZXcgRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbCgpOwotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGUyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeHRlbmRlZEF0dHJpYnV0ZTMgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGUzKCkgewotCQlFeHRlbmRlZEF0dHJpYnV0ZTNJbXBsIGV4dGVuZGVkQXR0cmlidXRlMyA9IG5ldyBFeHRlbmRlZEF0dHJpYnV0ZTNJbXBsKCk7Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZTM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4dGVuZGVkQXR0cmlidXRlNCBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTQoKSB7Ci0JCUV4dGVuZGVkQXR0cmlidXRlNEltcGwgZXh0ZW5kZWRBdHRyaWJ1dGU0ID0gbmV3IEV4dGVuZGVkQXR0cmlidXRlNEltcGwoKTsKLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlNDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRBdHRyaWJ1dGVzIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlcygpIHsKLQkJRXh0ZW5kZWRBdHRyaWJ1dGVzSW1wbCBleHRlbmRlZEF0dHJpYnV0ZXMgPSBuZXcgRXh0ZW5kZWRBdHRyaWJ1dGVzSW1wbCgpOwotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNYXNrIGNyZWF0ZU1hc2soKSB7Ci0JCU1hc2tJbXBsIG1hc2sgPSBuZXcgTWFza0ltcGwoKTsKLQkJcmV0dXJuIG1hc2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1hc2tzIGNyZWF0ZU1hc2tzKCkgewotCQlNYXNrc0ltcGwgbWFza3MgPSBuZXcgTWFza3NJbXBsKCk7Ci0JCXJldHVybiBtYXNrczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3V0bGluZUNvZGUgY3JlYXRlT3V0bGluZUNvZGUoKSB7Ci0JCU91dGxpbmVDb2RlSW1wbCBvdXRsaW5lQ29kZSA9IG5ldyBPdXRsaW5lQ29kZUltcGwoKTsKLQkJcmV0dXJuIG91dGxpbmVDb2RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPdXRsaW5lQ29kZTIgY3JlYXRlT3V0bGluZUNvZGUyKCkgewotCQlPdXRsaW5lQ29kZTJJbXBsIG91dGxpbmVDb2RlMiA9IG5ldyBPdXRsaW5lQ29kZTJJbXBsKCk7Ci0JCXJldHVybiBvdXRsaW5lQ29kZTI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE91dGxpbmVDb2RlMyBjcmVhdGVPdXRsaW5lQ29kZTMoKSB7Ci0JCU91dGxpbmVDb2RlM0ltcGwgb3V0bGluZUNvZGUzID0gbmV3IE91dGxpbmVDb2RlM0ltcGwoKTsKLQkJcmV0dXJuIG91dGxpbmVDb2RlMzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3V0bGluZUNvZGVzIGNyZWF0ZU91dGxpbmVDb2RlcygpIHsKLQkJT3V0bGluZUNvZGVzSW1wbCBvdXRsaW5lQ29kZXMgPSBuZXcgT3V0bGluZUNvZGVzSW1wbCgpOwotCQlyZXR1cm4gb3V0bGluZUNvZGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcmVkZWNlc3NvckxpbmsgY3JlYXRlUHJlZGVjZXNzb3JMaW5rKCkgewotCQlQcmVkZWNlc3NvckxpbmtJbXBsIHByZWRlY2Vzc29yTGluayA9IG5ldyBQcmVkZWNlc3NvckxpbmtJbXBsKCk7Ci0JCXJldHVybiBwcmVkZWNlc3Nvckxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2plY3QgY3JlYXRlUHJvamVjdCgpIHsKLQkJUHJvamVjdEltcGwgcHJvamVjdCA9IG5ldyBQcm9qZWN0SW1wbCgpOwotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmF0ZSBjcmVhdGVSYXRlKCkgewotCQlSYXRlSW1wbCByYXRlID0gbmV3IFJhdGVJbXBsKCk7Ci0JCXJldHVybiByYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSYXRlcyBjcmVhdGVSYXRlcygpIHsKLQkJUmF0ZXNJbXBsIHJhdGVzID0gbmV3IFJhdGVzSW1wbCgpOwotCQlyZXR1cm4gcmF0ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKCkgewotCQlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2VJbXBsKCk7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VzIGNyZWF0ZVJlc291cmNlcygpIHsKLQkJUmVzb3VyY2VzSW1wbCByZXNvdXJjZXMgPSBuZXcgUmVzb3VyY2VzSW1wbCgpOwotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrIGNyZWF0ZVRhc2soKSB7Ci0JCVRhc2tJbXBsIHRhc2sgPSBuZXcgVGFza0ltcGwoKTsKLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tzIGNyZWF0ZVRhc2tzKCkgewotCQlUYXNrc0ltcGwgdGFza3MgPSBuZXcgVGFza3NJbXBsKCk7Ci0JCXJldHVybiB0YXNrczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGltZVBlcmlvZCBjcmVhdGVUaW1lUGVyaW9kKCkgewotCQlUaW1lUGVyaW9kSW1wbCB0aW1lUGVyaW9kID0gbmV3IFRpbWVQZXJpb2RJbXBsKCk7Ci0JCXJldHVybiB0aW1lUGVyaW9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUaW1lcGhhc2VkRGF0YVR5cGUgY3JlYXRlVGltZXBoYXNlZERhdGFUeXBlKCkgewotCQlUaW1lcGhhc2VkRGF0YVR5cGVJbXBsIHRpbWVwaGFzZWREYXRhVHlwZSA9IG5ldyBUaW1lcGhhc2VkRGF0YVR5cGVJbXBsKCk7Ci0JCXJldHVybiB0aW1lcGhhc2VkRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhbHVlIGNyZWF0ZVZhbHVlKCkgewotCQlWYWx1ZUltcGwgdmFsdWUgPSBuZXcgVmFsdWVJbXBsKCk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFsdWUyIGNyZWF0ZVZhbHVlMigpIHsKLQkJVmFsdWUySW1wbCB2YWx1ZTIgPSBuZXcgVmFsdWUySW1wbCgpOwotCQlyZXR1cm4gdmFsdWUyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYWx1ZUxpc3QgY3JlYXRlVmFsdWVMaXN0KCkgewotCQlWYWx1ZUxpc3RJbXBsIHZhbHVlTGlzdCA9IG5ldyBWYWx1ZUxpc3RJbXBsKCk7Ci0JCXJldHVybiB2YWx1ZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhbHVlcyBjcmVhdGVWYWx1ZXMoKSB7Ci0JCVZhbHVlc0ltcGwgdmFsdWVzID0gbmV3IFZhbHVlc0ltcGwoKTsKLQkJcmV0dXJuIHZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV0JTTWFzayBjcmVhdGVXQlNNYXNrKCkgewotCQlXQlNNYXNrSW1wbCB3YnNNYXNrID0gbmV3IFdCU01hc2tJbXBsKCk7Ci0JCXJldHVybiB3YnNNYXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXQlNNYXNrcyBjcmVhdGVXQlNNYXNrcygpIHsKLQkJV0JTTWFza3NJbXBsIHdic01hc2tzID0gbmV3IFdCU01hc2tzSW1wbCgpOwotCQlyZXR1cm4gd2JzTWFza3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlZWtEYXkgY3JlYXRlV2Vla0RheSgpIHsKLQkJV2Vla0RheUltcGwgd2Vla0RheSA9IG5ldyBXZWVrRGF5SW1wbCgpOwotCQlyZXR1cm4gd2Vla0RheTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2Vla0RheXMgY3JlYXRlV2Vla0RheXMoKSB7Ci0JCVdlZWtEYXlzSW1wbCB3ZWVrRGF5cyA9IG5ldyBXZWVrRGF5c0ltcGwoKTsKLQkJcmV0dXJuIHdlZWtEYXlzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JraW5nVGltZSBjcmVhdGVXb3JraW5nVGltZSgpIHsKLQkJV29ya2luZ1RpbWVJbXBsIHdvcmtpbmdUaW1lID0gbmV3IFdvcmtpbmdUaW1lSW1wbCgpOwotCQlyZXR1cm4gd29ya2luZ1RpbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtpbmdUaW1lcyBjcmVhdGVXb3JraW5nVGltZXMoKSB7Ci0JCVdvcmtpbmdUaW1lc0ltcGwgd29ya2luZ1RpbWVzID0gbmV3IFdvcmtpbmdUaW1lc0ltcGwoKTsKLQkJcmV0dXJuIHdvcmtpbmdUaW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVBY2NydWVBdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRBY2NydWVBdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlQWN0aXZlRGlyZWN0b3J5R1VJRFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEFjdGl2ZURpcmVjdG9yeUdVSURUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUFsaWFzVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0QWxpYXNUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUF1dGhvclR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEF1dGhvclR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlQm9va2luZ1R5cGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEJvb2tpbmdUeXBlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUJvb2tpbmdUeXBlVHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Qm9va2luZ1R5cGVUeXBlMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUNhbGN1bGF0aW9uVHlwZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Q2FsY3VsYXRpb25UeXBlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlQ2F0ZWdvcnlUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDYXRlZ29yeVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlQ29kZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydENvZGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUNvbXBhbnlUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDb21wYW55VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlQ29uc3RyYWludFR5cGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydENvbnN0cmFpbnRUeXBlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlQ29udGFjdFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydENvbnRhY3RUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVDb3N0UmF0ZVRhYmxlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDb3N0UmF0ZVRhYmxlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVDdXJyZW5jeVN5bWJvbFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEN1cnJlbmN5U3ltYm9sVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRGF5VHlwZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RGF5VHlwZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RGVmYXVsdFRhc2tFVk1ldGhvZFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVEZWZhdWx0VGFza1R5cGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydERlZmF1bHRUYXNrVHlwZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVEdXJhdGlvbkZvcm1hdFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlMUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnREdXJhdGlvbkZvcm1hdFR5cGUxVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlMkZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnREdXJhdGlvbkZvcm1hdFR5cGUyVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlM0Zyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnREdXJhdGlvbkZvcm1hdFR5cGUzVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlNEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnREdXJhdGlvbkZvcm1hdFR5cGU0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlNUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnREdXJhdGlvbkZvcm1hdFR5cGU1VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEVhcm5lZFZhbHVlTWV0aG9kVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RWFybmVkVmFsdWVNZXRob2RUeXBlMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlRW1haWxBZGRyZXNzVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RW1haWxBZGRyZXNzVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RXh0ZXJuYWxUYXNrUHJvamVjdFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlRml4ZWRDb3N0QWNjcnVhbFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEZpeGVkQ29zdEFjY3J1YWxUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVGWVN0YXJ0RGF0ZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RllTdGFydERhdGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVHcm91cFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEdyb3VwVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SHlwZXJsaW5rQWRkcmVzc1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRIeXBlcmxpbmtBZGRyZXNzVHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUyRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRIeXBlcmxpbmtBZGRyZXNzVHlwZTJUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEh5cGVybGlua1N1YkFkZHJlc3NUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlMUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlMkZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUh5cGVybGlua1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEh5cGVybGlua1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlSHlwZXJsaW5rVHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEh5cGVybGlua1R5cGUxVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUh5cGVybGlua1R5cGUyRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRIeXBlcmxpbmtUeXBlMlRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVJbml0aWFsc1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEluaXRpYWxzVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlTGFnRm9ybWF0VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRMYWdGb3JtYXRUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVNYW5hZ2VyVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TWFuYWdlclR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTWF0ZXJpYWxMYWJlbFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE1hdGVyaWFsTGFiZWxUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROYW1lVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVOYW1lVHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE5hbWVUeXBlMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVOYW1lVHlwZTJGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE5hbWVUeXBlMlRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVOYW1lVHlwZTNGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE5hbWVUeXBlM1RvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlTmV3VGFza1N0YXJ0RGF0ZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TmV3VGFza1N0YXJ0RGF0ZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZU5UQWNjb3VudFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE5UQWNjb3VudFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlT3V0bGluZU51bWJlclR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE91dGxpbmVOdW1iZXJUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlMUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRPdmVydGltZVJhdGVGb3JtYXRUeXBlMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlUGhvbmV0aWNBbGlhc1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFBob25ldGljQWxpYXNUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVBob25ldGljc1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFBob25ldGljc1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlUHJlZml4VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0UHJlZml4VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlUmF0ZVRhYmxlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRSYXRlVGFibGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlUm9sbHVwVHlwZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Um9sbHVwVHlwZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFN0YW5kYXJkUmF0ZUZvcm1hdFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlU3ViamVjdFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFN1YmplY3RUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVN1YnByb2plY3ROYW1lVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U3VicHJvamVjdE5hbWVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVRpdGxlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VGl0bGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVUeXBlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUeXBlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVR5cGVUeXBlMUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUeXBlVHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVUeXBlVHlwZTJGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VHlwZVR5cGUyVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlVHlwZVR5cGUzRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFR5cGVUeXBlM1RvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVR5cGVUeXBlNEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUeXBlVHlwZTRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVUeXBlVHlwZTVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VHlwZVR5cGU1VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVVSURUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRVSURUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVVbml0VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRVbml0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVZhbHVlbGlzdFNvcnRPcmRlclR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VmFsdWVsaXN0U29ydE9yZGVyVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVdlZWtTdGFydERheVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V2Vla1N0YXJ0RGF5VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVdvcmtDb250b3VyVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRXb3JrQ29udG91clR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVXb3JrRm9ybWF0VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRXb3JrRm9ybWF0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVdvcmtHcm91cFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V29ya0dyb3VwVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNc3Byb2plY3RQYWNrYWdlIGdldE1zcHJvamVjdFBhY2thZ2UoKSB7Ci0JCXJldHVybiAoTXNwcm9qZWN0UGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNc3Byb2plY3RQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9Nc3Byb2plY3RGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01zcHJvamVjdFBhY2thZ2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvTXNwcm9qZWN0UGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdiMmEwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvTXNwcm9qZWN0UGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzMTMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNc3Byb2plY3RQYWNrYWdlSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5FY29yZVJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLmltcGwuWE1MVHlwZVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsLk1zcHJvamVjdFZhbGlkYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNc3Byb2plY3RQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIE1zcHJvamVjdFBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGFja2FnZUZpbGVuYW1lID0gIm1zcHJvamVjdC5lY29yZSI7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhc3NpZ25tZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFzc2lnbm1lbnRzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGF2YWlsYWJpbGl0eVBlcmlvZEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhdmFpbGFiaWxpdHlQZXJpb2RzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGJhc2VsaW5lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGJhc2VsaW5lMkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBiYXNlbGluZTNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY2FsZW5kYXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY2FsZW5kYXJzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRvY3VtZW50Um9vdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBleHRlbmRlZEF0dHJpYnV0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBleHRlbmRlZEF0dHJpYnV0ZTJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXh0ZW5kZWRBdHRyaWJ1dGUzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGV4dGVuZGVkQXR0cmlidXRlNEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBleHRlbmRlZEF0dHJpYnV0ZXNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWFza0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtYXNrc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBvdXRsaW5lQ29kZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBvdXRsaW5lQ29kZTJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgb3V0bGluZUNvZGUzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG91dGxpbmVDb2Rlc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcmVkZWNlc3NvckxpbmtFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvamVjdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByYXRlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJhdGVzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlc291cmNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlc291cmNlc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0YXNrRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRhc2tzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRpbWVQZXJpb2RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGltZXBoYXNlZERhdGFUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHZhbHVlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHZhbHVlMkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB2YWx1ZUxpc3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdmFsdWVzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdic01hc2tFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2JzTWFza3NFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2Vla0RheUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3ZWVrRGF5c0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JraW5nVGltZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JraW5nVGltZXNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgYWNjcnVlQXRFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgYWN0aXZlRGlyZWN0b3J5R1VJRFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgYWxpYXNUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGF1dGhvclR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgYm9va2luZ1R5cGVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGJvb2tpbmdUeXBlVHlwZTFFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgY2FsY3VsYXRpb25UeXBlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBjYXRlZ29yeVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgY29kZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgY29tcGFueVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgY29uc3RyYWludFR5cGVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGNvbnRhY3RUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGNvc3RSYXRlVGFibGVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGN1cnJlbmN5U3ltYm9sVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBkYXlUeXBlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZGVmYXVsdFRhc2tFVk1ldGhvZFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZGVmYXVsdFRhc2tUeXBlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBkdXJhdGlvbkZvcm1hdFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZHVyYXRpb25Gb3JtYXRUeXBlMUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBkdXJhdGlvbkZvcm1hdFR5cGUyRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGR1cmF0aW9uRm9ybWF0VHlwZTNFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZHVyYXRpb25Gb3JtYXRUeXBlNEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBkdXJhdGlvbkZvcm1hdFR5cGU1RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGVhcm5lZFZhbHVlTWV0aG9kVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBlYXJuZWRWYWx1ZU1ldGhvZFR5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGVtYWlsQWRkcmVzc1R5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZXh0ZXJuYWxUYXNrUHJvamVjdFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZml4ZWRDb3N0QWNjcnVhbFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZnlTdGFydERhdGVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGdyb3VwVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBoeXBlcmxpbmtBZGRyZXNzVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBoeXBlcmxpbmtBZGRyZXNzVHlwZTFFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rQWRkcmVzc1R5cGUyRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTJFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBoeXBlcmxpbmtUeXBlMUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBoeXBlcmxpbmtUeXBlMkVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBpbml0aWFsc1R5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbGFnRm9ybWF0VHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTFFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbWFuYWdlclR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbWF0ZXJpYWxMYWJlbFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbmFtZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbmFtZVR5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG5hbWVUeXBlMkVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBuYW1lVHlwZTNFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbmV3VGFza1N0YXJ0RGF0ZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbnRBY2NvdW50VHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBvdXRsaW5lTnVtYmVyVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBvdmVydGltZVJhdGVGb3JtYXRUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHBob25ldGljQWxpYXNUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHBob25ldGljc1R5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgcHJlZml4VHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSByYXRlVGFibGVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHJvbGx1cFR5cGVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgc3RhbmRhcmRSYXRlRm9ybWF0VHlwZTFFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgc3ViamVjdFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgc3VicHJvamVjdE5hbWVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHRpdGxlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB0eXBlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB0eXBlVHlwZTFFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdHlwZVR5cGUyRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHR5cGVUeXBlM0VEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB0eXBlVHlwZTRFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdHlwZVR5cGU1RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHVpZFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdW5pdFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdmFsdWVsaXN0U29ydE9yZGVyVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB3ZWVrU3RhcnREYXlUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHdvcmtDb250b3VyVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB3b3JrRm9ybWF0VHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB3b3JrR3JvdXBUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTXNwcm9qZWN0UGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIE1zcHJvamVjdEZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1zcHJvamVjdFBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKE1zcHJvamVjdFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCU1zcHJvamVjdFBhY2thZ2VJbXBsIHRoZU1zcHJvamVjdFBhY2thZ2UgPSAoTXNwcm9qZWN0UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgTXNwcm9qZWN0UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBNc3Byb2plY3RQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCVhNTFR5cGVQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkJLy8gTG9hZCBwYWNrYWdlcwotCQl0aGVNc3Byb2plY3RQYWNrYWdlLmxvYWRQYWNrYWdlKCk7Ci0KLQkJLy8gRml4IGxvYWRlZCBwYWNrYWdlcwotCQl0aGVNc3Byb2plY3RQYWNrYWdlLmZpeFBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIFJlZ2lzdGVyIHBhY2thZ2UgdmFsaWRhdG9yCi0JCUVWYWxpZGF0b3IuUmVnaXN0cnkuSU5TVEFOQ0UucHV0Ci0JCQkodGhlTXNwcm9qZWN0UGFja2FnZSwgCi0JCQkgbmV3IEVWYWxpZGF0b3IuRGVzY3JpcHRvcigpIHsKLQkJCQkgcHVibGljIEVWYWxpZGF0b3IgZ2V0RVZhbGlkYXRvcigpIHsKLQkJCQkJIHJldHVybiBNc3Byb2plY3RWYWxpZGF0b3IuSU5TVEFOQ0U7Ci0JCQkJIH0KLQkJCSB9KTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZU1zcHJvamVjdFBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZU1zcHJvamVjdFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBc3NpZ25tZW50KCkgewotCQlpZiAoYXNzaWdubWVudEVDbGFzcyA9PSBudWxsKSB7Ci0JCQlhc3NpZ25tZW50RUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzKTsKLQkJfQotCQlyZXR1cm4gYXNzaWdubWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1VJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfVGFza1VJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVzb3VyY2VVSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1BlcmNlbnRXb3JrQ29tcGxldGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbENvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbEZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsT3ZlcnRpbWVDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxPdmVydGltZVdvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbFN0YXJ0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BQ1dQKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ29uZmlybWVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0Nvc3RSYXRlVGFibGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Db3N0VmFyaWFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9DVigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0RlbGF5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfRmluaXNoKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfRmluaXNoVmFyaWFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IeXBlcmxpbmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IeXBlcmxpbmtBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfSHlwZXJsaW5rU3ViQWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1dvcmtWYXJpYW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0hhc0ZpeGVkUmF0ZVVuaXRzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfRml4ZWRNYXRlcmlhbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0xldmVsaW5nRGVsYXkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9MZXZlbGluZ0RlbGF5Rm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfTGlua2VkRmllbGRzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfTWlsZXN0b25lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfTm90ZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9PdmVyYWxsb2NhdGVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfT3ZlcnRpbWVDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVndWxhcldvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZW1haW5pbmdDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVtYWluaW5nV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1Jlc3BvbnNlUGVuZGluZygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1N0YXJ0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfU3RvcCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1Jlc3VtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1N0YXJ0VmFyaWFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Vbml0cygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1VwZGF0ZU5lZWRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1ZBQygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1dvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Xb3JrQ29udG91cigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0JDV1MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0OCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9CQ1dQKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQm9va2luZ1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxXb3JrUHJvdGVjdGVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ3JlYXRpb25EYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFzc2lnbm1lbnRfRXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXNzaWdubWVudF9CYXNlbGluZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBc3NpZ25tZW50X1RpbWVwaGFzZWREYXRhKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXNzaWdubWVudHMoKSB7Ci0JCWlmIChhc3NpZ25tZW50c0VDbGFzcyA9PSBudWxsKSB7Ci0JCQlhc3NpZ25tZW50c0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNCk7Ci0JCX0KLQkJcmV0dXJuIGFzc2lnbm1lbnRzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFzc2lnbm1lbnRzX0Fzc2lnbm1lbnQoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRBc3NpZ25tZW50cygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKSB7Ci0JCWlmIChhdmFpbGFiaWxpdHlQZXJpb2RFQ2xhc3MgPT0gbnVsbCkgewotCQkJYXZhaWxhYmlsaXR5UGVyaW9kRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg2KTsKLQkJfQotCQlyZXR1cm4gYXZhaWxhYmlsaXR5UGVyaW9kRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEF2YWlsYWJpbGl0eVBlcmlvZF9BdmFpbGFibGVGcm9tKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBdmFpbGFiaWxpdHlQZXJpb2RfQXZhaWxhYmxlVG8oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEF2YWlsYWJpbGl0eVBlcmlvZF9BdmFpbGFibGVVbml0cygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEF2YWlsYWJpbGl0eVBlcmlvZCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCkgewotCQlpZiAoYXZhaWxhYmlsaXR5UGVyaW9kc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQlhdmFpbGFiaWxpdHlQZXJpb2RzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3KTsKLQkJfQotCQlyZXR1cm4gYXZhaWxhYmlsaXR5UGVyaW9kc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBdmFpbGFiaWxpdHlQZXJpb2RzX0F2YWlsYWJpbGl0eVBlcmlvZCgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldEF2YWlsYWJpbGl0eVBlcmlvZHMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QmFzZWxpbmUoKSB7Ci0JCWlmIChiYXNlbGluZUVDbGFzcyA9PSBudWxsKSB7Ci0JCQliYXNlbGluZUVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOCk7Ci0JCX0KLQkJcmV0dXJuIGJhc2VsaW5lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJhc2VsaW5lX1RpbWVwaGFzZWREYXRhKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0QmFzZWxpbmUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lX051bWJlcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9JbnRlcmltKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lX1N0YXJ0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lX0ZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9EdXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9EdXJhdGlvbkZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9Fc3RpbWF0ZWREdXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9Xb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lX0Nvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfQkNXUygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfQkNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRCYXNlbGluZTIoKSB7Ci0JCWlmIChiYXNlbGluZTJFQ2xhc3MgPT0gbnVsbCkgewotCQkJYmFzZWxpbmUyRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg5KTsKLQkJfQotCQlyZXR1cm4gYmFzZWxpbmUyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9OdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9Xb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTJfQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUyX0JDV1MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9CQ1dQKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEJhc2VsaW5lMygpIHsKLQkJaWYgKGJhc2VsaW5lM0VDbGFzcyA9PSBudWxsKSB7Ci0JCQliYXNlbGluZTNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDEwKTsKLQkJfQotCQlyZXR1cm4gYmFzZWxpbmUzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJhc2VsaW5lM19UaW1lcGhhc2VkRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldEJhc2VsaW5lMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX051bWJlcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX1N0YXJ0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfRmluaXNoKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX0Nvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lM19CQ1dTKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfQkNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDYWxlbmRhcigpIHsKLQkJaWYgKGNhbGVuZGFyRUNsYXNzID09IG51bGwpIHsKLQkJCWNhbGVuZGFyRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxNSk7Ci0JCX0KLQkJcmV0dXJuIGNhbGVuZGFyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENhbGVuZGFyX1VJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldENhbGVuZGFyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9OYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0Q2FsZW5kYXIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENhbGVuZGFyX0lzQmFzZUNhbGVuZGFyKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0Q2FsZW5kYXIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENhbGVuZGFyX0Jhc2VDYWxlbmRhclVJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldENhbGVuZGFyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDYWxlbmRhcl9XZWVrRGF5cygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldENhbGVuZGFyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENhbGVuZGFycygpIHsKLQkJaWYgKGNhbGVuZGFyc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQljYWxlbmRhcnNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDE2KTsKLQkJfQotCQlyZXR1cm4gY2FsZW5kYXJzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENhbGVuZGFyc19DYWxlbmRhcigpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldENhbGVuZGFycygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREb2N1bWVudFJvb3QoKSB7Ci0JCWlmIChkb2N1bWVudFJvb3RFQ2xhc3MgPT0gbnVsbCkgewotCQkJZG9jdW1lbnRSb290RUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgyOSk7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50Um9vdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREb2N1bWVudFJvb3RfTWl4ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXREb2N1bWVudFJvb3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9YTUxOU1ByZWZpeE1hcCgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldERvY3VtZW50Um9vdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hTSVNjaGVtYUxvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0RG9jdW1lbnRSb290KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfUHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldERvY3VtZW50Um9vdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpIHsKLQkJaWYgKGV4dGVuZGVkQXR0cmlidXRlRUNsYXNzID09IG51bGwpIHsKLQkJCWV4dGVuZGVkQXR0cmlidXRlRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzOSk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0ZpZWxkSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfRmllbGROYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0FsaWFzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX1Bob25ldGljQWxpYXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfUm9sbHVwVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9DYWxjdWxhdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfRm9ybXVsYSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9SZXN0cmljdFZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9WYWx1ZWxpc3RTb3J0T3JkZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfQXBwZW5kTmV3VmFsdWVzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0RlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEV4dGVuZGVkQXR0cmlidXRlX1ZhbHVlTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldEV4dGVuZGVkQXR0cmlidXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZTJFQ2xhc3MgPT0gbnVsbCkgewotCQkJZXh0ZW5kZWRBdHRyaWJ1dGUyRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg0MCk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlMkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfRmllbGRJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX1ZhbHVlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfVmFsdWVJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX0R1cmF0aW9uRm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEV4dGVuZGVkQXR0cmlidXRlMygpIHsKLQkJaWYgKGV4dGVuZGVkQXR0cmlidXRlM0VDbGFzcyA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZEF0dHJpYnV0ZTNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDQxKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGUzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlM19VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlM19GaWVsZElEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlM19WYWx1ZUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfRHVyYXRpb25Gb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCkgewotCQlpZiAoZXh0ZW5kZWRBdHRyaWJ1dGU0RUNsYXNzID09IG51bGwpIHsKLQkJCWV4dGVuZGVkQXR0cmlidXRlNEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDIpOwotCQl9Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZTRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X1VJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlNCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X0ZpZWxkSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9WYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlNCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X1ZhbHVlSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9EdXJhdGlvbkZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlNCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZXNFQ2xhc3MgPT0gbnVsbCkgewotCQkJZXh0ZW5kZWRBdHRyaWJ1dGVzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg0Myk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZXNfRXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWFzaygpIHsKLQkJaWYgKG1hc2tFQ2xhc3MgPT0gbnVsbCkgewotCQkJbWFza0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNjIpOwotCQl9Ci0JCXJldHVybiBtYXNrRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1hc2tfTGV2ZWwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRNYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNYXNrX1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRNYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNYXNrX0xlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE1hc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1hc2tfU2VwYXJhdG9yKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0TWFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNYXNrcygpIHsKLQkJaWYgKG1hc2tzRUNsYXNzID09IG51bGwpIHsKLQkJCW1hc2tzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg2Myk7Ci0JCX0KLQkJcmV0dXJuIG1hc2tzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1hc2tzX01hc2soKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRNYXNrcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRPdXRsaW5lQ29kZSgpIHsKLQkJaWYgKG91dGxpbmVDb2RlRUNsYXNzID09IG51bGwpIHsKLQkJCW91dGxpbmVDb2RlRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3MSk7Ci0JCX0KLQkJcmV0dXJuIG91dGxpbmVDb2RlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0ZpZWxkSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRPdXRsaW5lQ29kZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGVfRmllbGROYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0FsaWFzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX1Bob25ldGljQWxpYXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRPdXRsaW5lQ29kZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0T3V0bGluZUNvZGVfVmFsdWVzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0VudGVycHJpc2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRPdXRsaW5lQ29kZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGVfRW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRPdXRsaW5lQ29kZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGVfUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0xlYWZPbmx5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0FsbExldmVsc1JlcXVpcmVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRPdXRsaW5lQ29kZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE91dGxpbmVDb2RlX01hc2tzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE91dGxpbmVDb2RlMigpIHsKLQkJaWYgKG91dGxpbmVDb2RlMkVDbGFzcyA9PSBudWxsKSB7Ci0JCQlvdXRsaW5lQ29kZTJFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDcyKTsKLQkJfQotCQlyZXR1cm4gb3V0bGluZUNvZGUyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlMl9VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRPdXRsaW5lQ29kZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlMl9GaWVsZElEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTJfVmFsdWVJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRPdXRsaW5lQ29kZTMoKSB7Ci0JCWlmIChvdXRsaW5lQ29kZTNFQ2xhc3MgPT0gbnVsbCkgewotCQkJb3V0bGluZUNvZGUzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3Myk7Ci0JCX0KLQkJcmV0dXJuIG91dGxpbmVDb2RlM0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTNfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTNfRmllbGRJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUzX1ZhbHVlSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRPdXRsaW5lQ29kZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0T3V0bGluZUNvZGVzKCkgewotCQlpZiAob3V0bGluZUNvZGVzRUNsYXNzID09IG51bGwpIHsKLQkJCW91dGxpbmVDb2Rlc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNzQpOwotCQl9Ci0JCXJldHVybiBvdXRsaW5lQ29kZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0T3V0bGluZUNvZGVzX091dGxpbmVDb2RlKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0T3V0bGluZUNvZGVzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByZWRlY2Vzc29yTGluaygpIHsKLQkJaWYgKHByZWRlY2Vzc29yTGlua0VDbGFzcyA9PSBudWxsKSB7Ci0JCQlwcmVkZWNlc3NvckxpbmtFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDgwKTsKLQkJfQotCQlyZXR1cm4gcHJlZGVjZXNzb3JMaW5rRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19QcmVkZWNlc3NvclVJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByZWRlY2Vzc29yTGluaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJlZGVjZXNzb3JMaW5rX1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcmVkZWNlc3NvckxpbmsoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19Dcm9zc1Byb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcmVkZWNlc3NvckxpbmsoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19Dcm9zc1Byb2plY3ROYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJlZGVjZXNzb3JMaW5rKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfTGlua0xhZygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByZWRlY2Vzc29yTGluaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJlZGVjZXNzb3JMaW5rX0xhZ0Zvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByZWRlY2Vzc29yTGluaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9qZWN0KCkgewotCQlpZiAocHJvamVjdEVDbGFzcyA9PSBudWxsKSB7Ci0JCQlwcm9qZWN0RUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg4Mik7Ci0JCX0KLQkJcmV0dXJuIHByb2plY3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1RpdGxlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9TdWJqZWN0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DYXRlZ29yeSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQ29tcGFueSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQXV0aG9yKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DcmVhdGlvbkRhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1JldmlzaW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9MYXN0U2F2ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9TY2hlZHVsZUZyb21TdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1N0YXJ0RGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0ZpbmlzaERhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9GWVN0YXJ0RGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NyaXRpY2FsU2xhY2tMaW1pdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0N1cnJlbmN5RGlnaXRzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQ3VycmVuY3lTeW1ib2woKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DdXJyZW5jeVN5bWJvbFBvc2l0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQ2FsZW5kYXJVSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0U3RhcnRUaW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdEZpbmlzaFRpbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9NaW51dGVzUGVyRGF5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTWludXRlc1BlcldlZWsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EYXlzUGVyTW9udGgoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0VGFza1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0RlZmF1bHRTdGFuZGFyZFJhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0T3ZlcnRpbWVSYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRHVyYXRpb25Gb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Xb3JrRm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRWRpdGFibGVBY3R1YWxDb3N0cygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0hvbm9yQ29uc3RyYWludHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9FYXJuZWRWYWx1ZU1ldGhvZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X011bHRpcGxlQ3JpdGljYWxQYXRocygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTmV3VGFza3NFc3RpbWF0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9TcGxpdHNJblByb2dyZXNzVGFza3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9TcHJlYWRBY3R1YWxDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfU3ByZWFkUGVyY2VudENvbXBsZXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfVGFza1VwZGF0ZXNSZXNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0Zpc2NhbFllYXJTdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1dlZWtTdGFydERheSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01vdmVDb21wbGV0ZWRFbmRzQmFjaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Nb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Nyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9CYXNlbGluZUZvckVhcm5lZFZhbHVlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfU3RhdHVzRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0N1cnJlbnREYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0F1dG9saW5rKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTmV3VGFza1N0YXJ0RGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0RlZmF1bHRUYXNrRVZNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Qcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0V4dGVuZGVkQ3JlYXRpb25EYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQWN0dWFsc0luU3luYygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQWRtaW5Qcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2plY3RfT3V0bGluZUNvZGVzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2plY3RfV0JTTWFza3MoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvamVjdF9FeHRlbmRlZEF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Myk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvamVjdF9DYWxlbmRhcnMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvamVjdF9UYXNrcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9qZWN0X1Jlc291cmNlcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9qZWN0X0Fzc2lnbm1lbnRzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmF0ZSgpIHsKLQkJaWYgKHJhdGVFQ2xhc3MgPT0gbnVsbCkgewotCQkJcmF0ZUVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoODMpOwotCQl9Ci0JCXJldHVybiByYXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJhdGVfUmF0ZXNGcm9tKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmF0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmF0ZV9SYXRlc1RvKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmF0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmF0ZV9SYXRlVGFibGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSYXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSYXRlX1N0YW5kYXJkUmF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJhdGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJhdGVfU3RhbmRhcmRSYXRlRm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmF0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmF0ZV9PdmVydGltZVJhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSYXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSYXRlX092ZXJ0aW1lUmF0ZUZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJhdGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJhdGVfQ29zdFBlclVzZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJhdGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmF0ZXMoKSB7Ci0JCWlmIChyYXRlc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQlyYXRlc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoODQpOwotCQl9Ci0JCXJldHVybiByYXRlc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSYXRlc19SYXRlKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UmF0ZXMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVzb3VyY2UoKSB7Ci0JCWlmIChyZXNvdXJjZUVDbGFzcyA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZUVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoODYpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0lzTnVsbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jbml0aWFscygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9QaG9uZXRpY3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfTlRBY2NvdW50KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX01hdGVyaWFsTGFiZWwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Hcm91cCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfV29ya0dyb3VwKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9FbWFpbEFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0h5cGVybGluaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSHlwZXJsaW5rQWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSHlwZXJsaW5rU3ViQWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfTWF4VW5pdHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1BlYWtVbml0cygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfT3ZlckFsbG9jYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQXZhaWxhYmxlRnJvbSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQXZhaWxhYmxlVG8oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1N0YXJ0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9GaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0NhbkxldmVsKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY2NydWVBdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUmVndWxhcldvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX092ZXJ0aW1lV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0dWFsV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUmVtYWluaW5nV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0dWFsT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZW1haW5pbmdPdmVydGltZVdvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1BlcmNlbnRXb3JrQ29tcGxldGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1N0YW5kYXJkUmF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfU3RhbmRhcmRSYXRlRm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Db3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVydGltZVJhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX092ZXJ0aW1lUmF0ZUZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfT3ZlcnRpbWVDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Db3N0UGVyVXNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxPdmVydGltZUNvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1JlbWFpbmluZ0Nvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1JlbWFpbmluZ092ZXJ0aW1lQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Myk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfV29ya1ZhcmlhbmNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Db3N0VmFyaWFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1NWKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9DVigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Nyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQUNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0OCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ2FsZW5kYXJVSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX05vdGVzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9CQ1dTKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9CQ1dQKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jc0dlbmVyaWMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0lzSW5hY3RpdmUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0lzRW50ZXJwcmlzZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQm9va2luZ1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbFdvcmtQcm90ZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1OCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0aXZlRGlyZWN0b3J5R1VJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1OSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ3JlYXRpb25EYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9FeHRlbmRlZEF0dHJpYnV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfQmFzZWxpbmUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlX091dGxpbmVDb2RlKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9BdmFpbGFiaWxpdHlQZXJpb2RzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9SYXRlcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfVGltZXBoYXNlZERhdGEoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVzb3VyY2VzKCkgewotCQlpZiAocmVzb3VyY2VzRUNsYXNzID09IG51bGwpIHsKLQkJCXJlc291cmNlc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoODcpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VzX1Jlc291cmNlKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UmVzb3VyY2VzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhc2soKSB7Ci0JCWlmICh0YXNrRUNsYXNzID09IG51bGwpIHsKLQkJCXRhc2tFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDkzKTsKLQkJfQotCQlyZXR1cm4gdGFza0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1VJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0lzTnVsbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQ3JlYXRlRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQ29udGFjdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfV0JTKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19XQlNMZXZlbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfT3V0bGluZU51bWJlcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfT3V0bGluZUxldmVsKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUHJpb3JpdHkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19TdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0ZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0R1cmF0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRHVyYXRpb25Gb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Xb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfU3RvcCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1Jlc3VtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1Jlc3VtZVZhbGlkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRWZmb3J0RHJpdmVuKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUmVjdXJyaW5nKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfT3ZlckFsbG9jYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0VzdGltYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX01pbGVzdG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1N1bW1hcnkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Dcml0aWNhbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0lzU3VicHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0lzU3VicHJvamVjdFJlYWRPbmx5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfU3VicHJvamVjdE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19FeHRlcm5hbFRhc2soKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19FeHRlcm5hbFRhc2tQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRWFybHlTdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0Vhcmx5RmluaXNoKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfTGF0ZVN0YXJ0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfTGF0ZUZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1N0YXJ0VmFyaWFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19GaW5pc2hWYXJpYW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1dvcmtWYXJpYW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0ZyZWVTbGFjaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1RvdGFsU2xhY2soKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19GaXhlZENvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19GaXhlZENvc3RBY2NydWFsKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUGVyY2VudENvbXBsZXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUGVyY2VudFdvcmtDb21wbGV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0Nvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19PdmVydGltZUNvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19PdmVydGltZVdvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Nyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxTdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbEZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbER1cmF0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbE92ZXJ0aW1lQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbFdvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1Myk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxPdmVydGltZVdvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19SZWd1bGFyV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1JlbWFpbmluZ0R1cmF0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1JlbWFpbmluZ1dvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1OCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19SZW1haW5pbmdPdmVydGltZUNvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1OSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19SZW1haW5pbmdPdmVydGltZVdvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BQ1dQKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQ1YoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Db25zdHJhaW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0NhbGVuZGFyVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQ29uc3RyYWludERhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19EZWFkbGluZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0xldmVsQXNzaWdubWVudHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Nyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19MZXZlbGluZ0NhblNwbGl0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfTGV2ZWxpbmdEZWxheSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0xldmVsaW5nRGVsYXlGb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19QcmVMZXZlbGVkU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19QcmVMZXZlbGVkRmluaXNoKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfSHlwZXJsaW5rKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfSHlwZXJsaW5rQWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDc0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0h5cGVybGlua1N1YkFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19JZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfTm90ZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3Nyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19IaWRlQmFyKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUm9sbHVwKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQkNXUygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0JDV1AoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19QaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0Vhcm5lZFZhbHVlTWV0aG9kKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoODMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tfUHJlZGVjZXNzb3JMaW5rKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoODQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsV29ya1Byb3RlY3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrX0V4dGVuZGVkQXR0cmlidXRlKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoODcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tfQmFzZWxpbmUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4OCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19PdXRsaW5lQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrX1RpbWVwaGFzZWREYXRhKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFza3MoKSB7Ci0JCWlmICh0YXNrc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQl0YXNrc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOTQpOwotCQl9Ci0JCXJldHVybiB0YXNrc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrc19UYXNrKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0VGFza3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGltZVBlcmlvZCgpIHsKLQkJaWYgKHRpbWVQZXJpb2RFQ2xhc3MgPT0gbnVsbCkgewotCQkJdGltZVBlcmlvZEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOTUpOwotCQl9Ci0JCXJldHVybiB0aW1lUGVyaW9kRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVQZXJpb2RfRnJvbURhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lUGVyaW9kKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUaW1lUGVyaW9kX1RvRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRpbWVQZXJpb2QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkgewotCQlpZiAodGltZXBoYXNlZERhdGFUeXBlRUNsYXNzID09IG51bGwpIHsKLQkJCXRpbWVwaGFzZWREYXRhVHlwZUVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOTYpOwotCQl9Ci0JCXJldHVybiB0aW1lcGhhc2VkRGF0YVR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGltZXBoYXNlZERhdGFUeXBlX1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9TdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRpbWVwaGFzZWREYXRhVHlwZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGltZXBoYXNlZERhdGFUeXBlX0ZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRpbWVwaGFzZWREYXRhVHlwZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGltZXBoYXNlZERhdGFUeXBlX1VuaXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9WYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRpbWVwaGFzZWREYXRhVHlwZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRWYWx1ZSgpIHsKLQkJaWYgKHZhbHVlRUNsYXNzID09IG51bGwpIHsKLQkJCXZhbHVlRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMDYpOwotCQl9Ci0JCXJldHVybiB2YWx1ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRWYWx1ZV9WYWx1ZUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFZhbHVlX1BhcmVudFZhbHVlSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRWYWx1ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFsdWVfVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRWYWx1ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFsdWVfRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRWYWx1ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRWYWx1ZTIoKSB7Ci0JCWlmICh2YWx1ZTJFQ2xhc3MgPT0gbnVsbCkgewotCQkJdmFsdWUyRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMDcpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFsdWUyX0lEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRWYWx1ZTJfVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRWYWx1ZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFZhbHVlMl9EZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFZhbHVlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRWYWx1ZUxpc3QoKSB7Ci0JCWlmICh2YWx1ZUxpc3RFQ2xhc3MgPT0gbnVsbCkgewotCQkJdmFsdWVMaXN0RUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMDgpOwotCQl9Ci0JCXJldHVybiB2YWx1ZUxpc3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VmFsdWVMaXN0X1ZhbHVlKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0VmFsdWVMaXN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFZhbHVlcygpIHsKLQkJaWYgKHZhbHVlc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQl2YWx1ZXNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExMCk7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRWYWx1ZXNfR3JvdXAoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRWYWx1ZXMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFZhbHVlc19WYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFZhbHVlcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXQlNNYXNrKCkgewotCQlpZiAod2JzTWFza0VDbGFzcyA9PSBudWxsKSB7Ci0JCQl3YnNNYXNrRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMTEpOwotCQl9Ci0JCXJldHVybiB3YnNNYXNrRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdCU01hc2tfTGV2ZWwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXQlNNYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXQlNNYXNrX1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXQlNNYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXQlNNYXNrX0xlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFdCU01hc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdCU01hc2tfU2VwYXJhdG9yKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0V0JTTWFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXQlNNYXNrcygpIHsKLQkJaWYgKHdic01hc2tzRUNsYXNzID09IG51bGwpIHsKLQkJCXdic01hc2tzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMTIpOwotCQl9Ci0JCXJldHVybiB3YnNNYXNrc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXQlNNYXNrc19WZXJpZnlVbmlxdWVDb2RlcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFdCU01hc2tzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXQlNNYXNrc19HZW5lcmF0ZUNvZGVzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0V0JTTWFza3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdCU01hc2tzX1ByZWZpeCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFdCU01hc2tzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXQlNNYXNrc19XQlNNYXNrKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0V0JTTWFza3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V2Vla0RheSgpIHsKLQkJaWYgKHdlZWtEYXlFQ2xhc3MgPT0gbnVsbCkgewotCQkJd2Vla0RheUVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTEzKTsKLQkJfQotCQlyZXR1cm4gd2Vla0RheUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWVrRGF5X0RheVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXZWVrRGF5KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWVrRGF5X0RheVdvcmtpbmcoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXZWVrRGF5KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWVrRGF5X1RpbWVQZXJpb2QoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRXZWVrRGF5KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWVrRGF5X1dvcmtpbmdUaW1lcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFdlZWtEYXkoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V2Vla0RheXMoKSB7Ci0JCWlmICh3ZWVrRGF5c0VDbGFzcyA9PSBudWxsKSB7Ci0JCQl3ZWVrRGF5c0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTE0KTsKLQkJfQotCQlyZXR1cm4gd2Vla0RheXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2Vla0RheXNfV2Vla0RheSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFdlZWtEYXlzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtpbmdUaW1lKCkgewotCQlpZiAod29ya2luZ1RpbWVFQ2xhc3MgPT0gbnVsbCkgewotCQkJd29ya2luZ1RpbWVFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExOSk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtpbmdUaW1lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtpbmdUaW1lX0Zyb21UaW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0V29ya2luZ1RpbWUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtpbmdUaW1lX1RvVGltZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFdvcmtpbmdUaW1lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtpbmdUaW1lcygpIHsKLQkJaWYgKHdvcmtpbmdUaW1lc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQl3b3JraW5nVGltZXNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDEyMCk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtpbmdUaW1lc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JraW5nVGltZXNfV29ya2luZ1RpbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRXb3JraW5nVGltZXMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0QWNjcnVlQXQoKSB7Ci0JCWlmIChhY2NydWVBdEVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlhY2NydWVBdEVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMCk7Ci0JCX0KLQkJcmV0dXJuIGFjY3J1ZUF0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUoKSB7Ci0JCWlmIChhY3RpdmVEaXJlY3RvcnlHVUlEVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlhY3RpdmVEaXJlY3RvcnlHVUlEVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMSk7Ci0JCX0KLQkJcmV0dXJuIGFjdGl2ZURpcmVjdG9yeUdVSURUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0QWxpYXNUeXBlKCkgewotCQlpZiAoYWxpYXNUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWFsaWFzVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMik7Ci0JCX0KLQkJcmV0dXJuIGFsaWFzVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEF1dGhvclR5cGUoKSB7Ci0JCWlmIChhdXRob3JUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWF1dGhvclR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDUpOwotCQl9Ci0JCXJldHVybiBhdXRob3JUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUoKSB7Ci0JCWlmIChiYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQliYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTEpOwotCQl9Ci0JCXJldHVybiBiYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEJvb2tpbmdUeXBlVHlwZSgpIHsKLQkJaWYgKGJvb2tpbmdUeXBlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlib29raW5nVHlwZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDEyKTsKLQkJfQotCQlyZXR1cm4gYm9va2luZ1R5cGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Qm9va2luZ1R5cGVUeXBlMSgpIHsKLQkJaWYgKGJvb2tpbmdUeXBlVHlwZTFFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJYm9va2luZ1R5cGVUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTMpOwotCQl9Ci0JCXJldHVybiBib29raW5nVHlwZVR5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Q2FsY3VsYXRpb25UeXBlVHlwZSgpIHsKLQkJaWYgKGNhbGN1bGF0aW9uVHlwZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJY2FsY3VsYXRpb25UeXBlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTQpOwotCQl9Ci0JCXJldHVybiBjYWxjdWxhdGlvblR5cGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Q2F0ZWdvcnlUeXBlKCkgewotCQlpZiAoY2F0ZWdvcnlUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWNhdGVnb3J5VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTcpOwotCQl9Ci0JCXJldHVybiBjYXRlZ29yeVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRDb2RlVHlwZSgpIHsKLQkJaWYgKGNvZGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWNvZGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxOCk7Ci0JCX0KLQkJcmV0dXJuIGNvZGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Q29tcGFueVR5cGUoKSB7Ci0JCWlmIChjb21wYW55VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQljb21wYW55VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTkpOwotCQl9Ci0JCXJldHVybiBjb21wYW55VHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldENvbnN0cmFpbnRUeXBlVHlwZSgpIHsKLQkJaWYgKGNvbnN0cmFpbnRUeXBlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQljb25zdHJhaW50VHlwZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDIwKTsKLQkJfQotCQlyZXR1cm4gY29uc3RyYWludFR5cGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Q29udGFjdFR5cGUoKSB7Ci0JCWlmIChjb250YWN0VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQljb250YWN0VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjEpOwotCQl9Ci0JCXJldHVybiBjb250YWN0VHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldENvc3RSYXRlVGFibGVUeXBlKCkgewotCQlpZiAoY29zdFJhdGVUYWJsZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJY29zdFJhdGVUYWJsZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDIyKTsKLQkJfQotCQlyZXR1cm4gY29zdFJhdGVUYWJsZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSgpIHsKLQkJaWYgKGN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgyMyk7Ci0JCX0KLQkJcmV0dXJuIGN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Q3VycmVuY3lTeW1ib2xUeXBlKCkgewotCQlpZiAoY3VycmVuY3lTeW1ib2xUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWN1cnJlbmN5U3ltYm9sVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjQpOwotCQl9Ci0JCXJldHVybiBjdXJyZW5jeVN5bWJvbFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXREYXlUeXBlVHlwZSgpIHsKLQkJaWYgKGRheVR5cGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWRheVR5cGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgyNSk7Ci0JCX0KLQkJcmV0dXJuIGRheVR5cGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlKCkgewotCQlpZiAoZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWRlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjYpOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXREZWZhdWx0VGFza0VWTWV0aG9kVHlwZSgpIHsKLQkJaWYgKGRlZmF1bHRUYXNrRVZNZXRob2RUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWRlZmF1bHRUYXNrRVZNZXRob2RUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgyNyk7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRUYXNrRVZNZXRob2RUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RGVmYXVsdFRhc2tUeXBlVHlwZSgpIHsKLQkJaWYgKGRlZmF1bHRUYXNrVHlwZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZGVmYXVsdFRhc2tUeXBlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjgpOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0VGFza1R5cGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlKCkgewotCQlpZiAoZHVyYXRpb25Gb3JtYXRUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWR1cmF0aW9uRm9ybWF0VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzApOwotCQl9Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGUxKCkgewotCQlpZiAoZHVyYXRpb25Gb3JtYXRUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkdXJhdGlvbkZvcm1hdFR5cGUxRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzMSk7Ci0JCX0KLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0VHlwZTFFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGUyKCkgewotCQlpZiAoZHVyYXRpb25Gb3JtYXRUeXBlMkVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkdXJhdGlvbkZvcm1hdFR5cGUyRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzMik7Ci0JCX0KLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0VHlwZTJFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGUzKCkgewotCQlpZiAoZHVyYXRpb25Gb3JtYXRUeXBlM0VEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkdXJhdGlvbkZvcm1hdFR5cGUzRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzMyk7Ci0JCX0KLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0VHlwZTNFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGU0KCkgewotCQlpZiAoZHVyYXRpb25Gb3JtYXRUeXBlNEVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkdXJhdGlvbkZvcm1hdFR5cGU0RURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzNCk7Ci0JCX0KLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0VHlwZTRFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGU1KCkgewotCQlpZiAoZHVyYXRpb25Gb3JtYXRUeXBlNUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkdXJhdGlvbkZvcm1hdFR5cGU1RURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzNSk7Ci0JCX0KLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0VHlwZTVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRFYXJuZWRWYWx1ZU1ldGhvZFR5cGUoKSB7Ci0JCWlmIChlYXJuZWRWYWx1ZU1ldGhvZFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZWFybmVkVmFsdWVNZXRob2RUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzNik7Ci0JCX0KLQkJcmV0dXJuIGVhcm5lZFZhbHVlTWV0aG9kVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEVhcm5lZFZhbHVlTWV0aG9kVHlwZTEoKSB7Ci0JCWlmIChlYXJuZWRWYWx1ZU1ldGhvZFR5cGUxRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWVhcm5lZFZhbHVlTWV0aG9kVHlwZTFFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDM3KTsKLQkJfQotCQlyZXR1cm4gZWFybmVkVmFsdWVNZXRob2RUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEVtYWlsQWRkcmVzc1R5cGUoKSB7Ci0JCWlmIChlbWFpbEFkZHJlc3NUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWVtYWlsQWRkcmVzc1R5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDM4KTsKLQkJfQotCQlyZXR1cm4gZW1haWxBZGRyZXNzVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEV4dGVybmFsVGFza1Byb2plY3RUeXBlKCkgewotCQlpZiAoZXh0ZXJuYWxUYXNrUHJvamVjdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZXh0ZXJuYWxUYXNrUHJvamVjdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDQ0KTsKLQkJfQotCQlyZXR1cm4gZXh0ZXJuYWxUYXNrUHJvamVjdFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRGaXhlZENvc3RBY2NydWFsVHlwZSgpIHsKLQkJaWYgKGZpeGVkQ29zdEFjY3J1YWxUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWZpeGVkQ29zdEFjY3J1YWxUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg0NSk7Ci0JCX0KLQkJcmV0dXJuIGZpeGVkQ29zdEFjY3J1YWxUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RllTdGFydERhdGVUeXBlKCkgewotCQlpZiAoZnlTdGFydERhdGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWZ5U3RhcnREYXRlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDYpOwotCQl9Ci0JCXJldHVybiBmeVN0YXJ0RGF0ZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRHcm91cFR5cGUoKSB7Ci0JCWlmIChncm91cFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZ3JvdXBUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg0Nyk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEh5cGVybGlua0FkZHJlc3NUeXBlKCkgewotCQlpZiAoaHlwZXJsaW5rQWRkcmVzc1R5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rQWRkcmVzc1R5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDQ4KTsKLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rQWRkcmVzc1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZTEoKSB7Ci0JCWlmIChoeXBlcmxpbmtBZGRyZXNzVHlwZTFFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rQWRkcmVzc1R5cGUxRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg0OSk7Ci0JCX0KLQkJcmV0dXJuIGh5cGVybGlua0FkZHJlc3NUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEh5cGVybGlua0FkZHJlc3NUeXBlMigpIHsKLQkJaWYgKGh5cGVybGlua0FkZHJlc3NUeXBlMkVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQloeXBlcmxpbmtBZGRyZXNzVHlwZTJFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDUwKTsKLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rQWRkcmVzc1R5cGUyRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUoKSB7Ci0JCWlmIChoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQloeXBlcmxpbmtTdWJBZGRyZXNzVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNTEpOwotCQl9Ci0JCXJldHVybiBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSgpIHsKLQkJaWYgKGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQloeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTFFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDUyKTsKLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyKCkgewotCQlpZiAoaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWh5cGVybGlua1N1YkFkZHJlc3NUeXBlMkVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNTMpOwotCQl9Ci0JCXJldHVybiBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTJFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRIeXBlcmxpbmtUeXBlKCkgewotCQlpZiAoaHlwZXJsaW5rVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQloeXBlcmxpbmtUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg1NCk7Ci0JCX0KLQkJcmV0dXJuIGh5cGVybGlua1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRIeXBlcmxpbmtUeXBlMSgpIHsKLQkJaWYgKGh5cGVybGlua1R5cGUxRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWh5cGVybGlua1R5cGUxRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg1NSk7Ci0JCX0KLQkJcmV0dXJuIGh5cGVybGlua1R5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rVHlwZTIoKSB7Ci0JCWlmIChoeXBlcmxpbmtUeXBlMkVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQloeXBlcmxpbmtUeXBlMkVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNTYpOwotCQl9Ci0JCXJldHVybiBoeXBlcmxpbmtUeXBlMkVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEluaXRpYWxzVHlwZSgpIHsKLQkJaWYgKGluaXRpYWxzVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlpbml0aWFsc1R5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDU3KTsKLQkJfQotCQlyZXR1cm4gaW5pdGlhbHNUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TGFnRm9ybWF0VHlwZSgpIHsKLQkJaWYgKGxhZ0Zvcm1hdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbGFnRm9ybWF0VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNTgpOwotCQl9Ci0JCXJldHVybiBsYWdGb3JtYXRUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUoKSB7Ci0JCWlmIChsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNTkpOwotCQl9Ci0JCXJldHVybiBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldExldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSgpIHsKLQkJaWYgKGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTFFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDYwKTsKLQkJfQotCQlyZXR1cm4gbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TWFuYWdlclR5cGUoKSB7Ci0JCWlmIChtYW5hZ2VyVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQltYW5hZ2VyVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNjEpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE1hdGVyaWFsTGFiZWxUeXBlKCkgewotCQlpZiAobWF0ZXJpYWxMYWJlbFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbWF0ZXJpYWxMYWJlbFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDY0KTsKLQkJfQotCQlyZXR1cm4gbWF0ZXJpYWxMYWJlbFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXROYW1lVHlwZSgpIHsKLQkJaWYgKG5hbWVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCW5hbWVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg2NSk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TmFtZVR5cGUxKCkgewotCQlpZiAobmFtZVR5cGUxRURhdGFUeXBlID09IG51bGwpIHsKLQkJCW5hbWVUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNjYpOwotCQl9Ci0JCXJldHVybiBuYW1lVHlwZTFFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXROYW1lVHlwZTIoKSB7Ci0JCWlmIChuYW1lVHlwZTJFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbmFtZVR5cGUyRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg2Nyk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVUeXBlMkVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE5hbWVUeXBlMygpIHsKLQkJaWYgKG5hbWVUeXBlM0VEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQluYW1lVHlwZTNFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDY4KTsKLQkJfQotCQlyZXR1cm4gbmFtZVR5cGUzRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TmV3VGFza1N0YXJ0RGF0ZVR5cGUoKSB7Ci0JCWlmIChuZXdUYXNrU3RhcnREYXRlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQluZXdUYXNrU3RhcnREYXRlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNjkpOwotCQl9Ci0JCXJldHVybiBuZXdUYXNrU3RhcnREYXRlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE5UQWNjb3VudFR5cGUoKSB7Ci0JCWlmIChudEFjY291bnRUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCW50QWNjb3VudFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDcwKTsKLQkJfQotCQlyZXR1cm4gbnRBY2NvdW50VHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE91dGxpbmVOdW1iZXJUeXBlKCkgewotCQlpZiAob3V0bGluZU51bWJlclR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJb3V0bGluZU51bWJlclR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDc1KTsKLQkJfQotCQlyZXR1cm4gb3V0bGluZU51bWJlclR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRPdmVydGltZVJhdGVGb3JtYXRUeXBlKCkgewotCQlpZiAob3ZlcnRpbWVSYXRlRm9ybWF0VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlvdmVydGltZVJhdGVGb3JtYXRUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3Nik7Ci0JCX0KLQkJcmV0dXJuIG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRPdmVydGltZVJhdGVGb3JtYXRUeXBlMSgpIHsKLQkJaWYgKG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxRURhdGFUeXBlID09IG51bGwpIHsKLQkJCW92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3Nyk7Ci0JCX0KLQkJcmV0dXJuIG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0UGhvbmV0aWNBbGlhc1R5cGUoKSB7Ci0JCWlmIChwaG9uZXRpY0FsaWFzVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlwaG9uZXRpY0FsaWFzVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNzgpOwotCQl9Ci0JCXJldHVybiBwaG9uZXRpY0FsaWFzVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFBob25ldGljc1R5cGUoKSB7Ci0JCWlmIChwaG9uZXRpY3NUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXBob25ldGljc1R5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDc5KTsKLQkJfQotCQlyZXR1cm4gcGhvbmV0aWNzVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFByZWZpeFR5cGUoKSB7Ci0JCWlmIChwcmVmaXhUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXByZWZpeFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDgxKTsKLQkJfQotCQlyZXR1cm4gcHJlZml4VHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFJhdGVUYWJsZVR5cGUoKSB7Ci0JCWlmIChyYXRlVGFibGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXJhdGVUYWJsZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDg1KTsKLQkJfQotCQlyZXR1cm4gcmF0ZVRhYmxlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFJvbGx1cFR5cGVUeXBlKCkgewotCQlpZiAocm9sbHVwVHlwZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJcm9sbHVwVHlwZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDg4KTsKLQkJfQotCQlyZXR1cm4gcm9sbHVwVHlwZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRTdGFuZGFyZFJhdGVGb3JtYXRUeXBlKCkgewotCQlpZiAoc3RhbmRhcmRSYXRlRm9ybWF0VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlzdGFuZGFyZFJhdGVGb3JtYXRUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg4OSk7Ci0JCX0KLQkJcmV0dXJuIHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSgpIHsKLQkJaWYgKHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg5MCk7Ci0JCX0KLQkJcmV0dXJuIHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0U3ViamVjdFR5cGUoKSB7Ci0JCWlmIChzdWJqZWN0VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlzdWJqZWN0VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOTEpOwotCQl9Ci0JCXJldHVybiBzdWJqZWN0VHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFN1YnByb2plY3ROYW1lVHlwZSgpIHsKLQkJaWYgKHN1YnByb2plY3ROYW1lVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlzdWJwcm9qZWN0TmFtZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDkyKTsKLQkJfQotCQlyZXR1cm4gc3VicHJvamVjdE5hbWVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VGl0bGVUeXBlKCkgewotCQlpZiAodGl0bGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXRpdGxlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOTcpOwotCQl9Ci0JCXJldHVybiB0aXRsZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRUeXBlVHlwZSgpIHsKLQkJaWYgKHR5cGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXR5cGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg5OCk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHlwZVR5cGUxKCkgewotCQlpZiAodHlwZVR5cGUxRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXR5cGVUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOTkpOwotCQl9Ci0JCXJldHVybiB0eXBlVHlwZTFFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRUeXBlVHlwZTIoKSB7Ci0JCWlmICh0eXBlVHlwZTJFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJdHlwZVR5cGUyRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMDApOwotCQl9Ci0JCXJldHVybiB0eXBlVHlwZTJFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRUeXBlVHlwZTMoKSB7Ci0JCWlmICh0eXBlVHlwZTNFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJdHlwZVR5cGUzRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMDEpOwotCQl9Ci0JCXJldHVybiB0eXBlVHlwZTNFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRUeXBlVHlwZTQoKSB7Ci0JCWlmICh0eXBlVHlwZTRFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJdHlwZVR5cGU0RURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMDIpOwotCQl9Ci0JCXJldHVybiB0eXBlVHlwZTRFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRUeXBlVHlwZTUoKSB7Ci0JCWlmICh0eXBlVHlwZTVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJdHlwZVR5cGU1RURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMDMpOwotCQl9Ci0JCXJldHVybiB0eXBlVHlwZTVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRVSURUeXBlKCkgewotCQlpZiAodWlkVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQl1aWRUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMDQpOwotCQl9Ci0JCXJldHVybiB1aWRUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VW5pdFR5cGUoKSB7Ci0JCWlmICh1bml0VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQl1bml0VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTA1KTsKLQkJfQotCQlyZXR1cm4gdW5pdFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlKCkgewotCQlpZiAodmFsdWVsaXN0U29ydE9yZGVyVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQl2YWx1ZWxpc3RTb3J0T3JkZXJUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMDkpOwotCQl9Ci0JCXJldHVybiB2YWx1ZWxpc3RTb3J0T3JkZXJUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0V2Vla1N0YXJ0RGF5VHlwZSgpIHsKLQkJaWYgKHdlZWtTdGFydERheVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJd2Vla1N0YXJ0RGF5VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTE1KTsKLQkJfQotCQlyZXR1cm4gd2Vla1N0YXJ0RGF5VHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFdvcmtDb250b3VyVHlwZSgpIHsKLQkJaWYgKHdvcmtDb250b3VyVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQl3b3JrQ29udG91clR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExNik7Ci0JCX0KLQkJcmV0dXJuIHdvcmtDb250b3VyVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFdvcmtGb3JtYXRUeXBlKCkgewotCQlpZiAod29ya0Zvcm1hdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJd29ya0Zvcm1hdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExNyk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtGb3JtYXRUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0V29ya0dyb3VwVHlwZSgpIHsKLQkJaWYgKHdvcmtHcm91cFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJd29ya0dyb3VwVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTE4KTsKLQkJfQotCQlyZXR1cm4gd29ya0dyb3VwVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTXNwcm9qZWN0RmFjdG9yeSBnZXRNc3Byb2plY3RGYWN0b3J5KCkgewotCQlyZXR1cm4gKE1zcHJvamVjdEZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0xvYWRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogTGFvZHMgdGhlIHBhY2thZ2UgYW5kIGFueSBzdWItcGFja2FnZXMgZnJvbSB0aGVpciBzZXJpYWxpemVkIGZvcm0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFBhY2thZ2UoKSB7Ci0JCWlmIChpc0xvYWRlZCkgcmV0dXJuOwotCQlpc0xvYWRlZCA9IHRydWU7Ci0KLQkJVVJMIHVybCA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2UocGFja2FnZUZpbGVuYW1lKTsKLQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTWlzc2luZyBzZXJpYWxpemVkIHBhY2thZ2U6ICIgKyBwYWNrYWdlRmlsZW5hbWUpOwotCQl9Ci0JCVJlc291cmNlIHJlc291cmNlID0gbmV3IEVjb3JlUmVzb3VyY2VGYWN0b3J5SW1wbCgpLmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkodXJsLnRvU3RyaW5nKCkpKTsKLQkJdHJ5IHsKLQkJCXJlc291cmNlLmxvYWQobnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJfQotCQlpbml0aWFsaXplRnJvbUxvYWRlZEVQYWNrYWdlKHRoaXMsIChFUGFja2FnZSlyZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKSk7Ci0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRml4ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEZpeGVzIHVwIHRoZSBsb2FkZWQgcGFja2FnZSwgdG8gbWFrZSBpdCBhcHBlYXIgYXMgaWYgaXQgaGFkIGJlZW4gcHJvZ3JhbW1hdGljYWxseSBidWlsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXhQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0ZpeGVkKSByZXR1cm47Ci0JCWlzRml4ZWQgPSB0cnVlOwotCQlmaXhFQ2xhc3NpZmllcnMoKTsKLQl9Ci19IC8vTXNwcm9qZWN0UGFja2FnZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZTJJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvT3V0bGluZUNvZGUySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDA2YjEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZTJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZTJJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRsaW5lIENvZGUyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGUySW1wbCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlMkltcGwjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZTJJbXBsI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3V0bGluZUNvZGUySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgT3V0bGluZUNvZGUyIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdUlEID0gVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkSUQoKSA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkSUQoKSA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmllbGRJRCA9IEZJRUxEX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlSUQoKSA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBWQUxVRV9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB2YWx1ZUlEID0gVkFMVUVfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT3V0bGluZUNvZGUySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGxpbmVDb2RlMigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFVJRCgpIHsKLQkJcmV0dXJuIHVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVSUQoQmlnSW50ZWdlciBuZXdVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRVSUQgPSB1SUQ7Ci0JCXVJRCA9IG5ld1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19VSUQsIG9sZFVJRCwgdUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZElEKCkgewotCQlyZXR1cm4gZmllbGRJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWVsZElEKFN0cmluZyBuZXdGaWVsZElEKSB7Ci0JCVN0cmluZyBvbGRGaWVsZElEID0gZmllbGRJRDsKLQkJZmllbGRJRCA9IG5ld0ZpZWxkSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fRklFTERfSUQsIG9sZEZpZWxkSUQsIGZpZWxkSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRWYWx1ZUlEKCkgewotCQlyZXR1cm4gdmFsdWVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZUlEKEJpZ0ludGVnZXIgbmV3VmFsdWVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFZhbHVlSUQgPSB2YWx1ZUlEOwotCQl2YWx1ZUlEID0gbmV3VmFsdWVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19WQUxVRV9JRCwgb2xkVmFsdWVJRCwgdmFsdWVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBnZXRGaWVsZElEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIGdldFZhbHVlSUQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fVUlEOgotCQkJCXNldFVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fVUlEOgotCQkJCXNldFVJRChVSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKEZJRUxEX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fVkFMVUVfSUQ6Ci0JCQkJc2V0VmFsdWVJRChWQUxVRV9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gRklFTERfSURfRURFRkFVTFQgPT0gbnVsbCA/IGZpZWxkSUQgIT0gbnVsbCA6ICFGSUVMRF9JRF9FREVGQVVMVC5lcXVhbHMoZmllbGRJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIFZBTFVFX0lEX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZUlEICE9IG51bGwgOiAhVkFMVUVfSURfRURFRkFVTFQuZXF1YWxzKHZhbHVlSUQpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1SUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpZWxkSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpZWxkSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlSUQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9PdXRsaW5lQ29kZTJJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvT3V0bGluZUNvZGUzSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2RlM0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBmZGE3OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvT3V0bGluZUNvZGUzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogT3V0bGluZUNvZGUzSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0bGluZSBDb2RlMzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlM0ltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZTNJbXBsI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGUzSW1wbCNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE91dGxpbmVDb2RlM0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE91dGxpbmVDb2RlMyB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFVJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHVJRCA9IFVJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkSUQgPSBGSUVMRF9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVkFMVUVfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdmFsdWVJRCA9IFZBTFVFX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE91dGxpbmVDb2RlM0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRsaW5lQ29kZTMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgbmV3VUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVUlEID0gdUlEOwotCQl1SUQgPSBuZXdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fVUlELCBvbGRVSUQsIHVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGRJRCgpIHsKLQkJcmV0dXJuIGZpZWxkSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmllbGRJRChTdHJpbmcgbmV3RmllbGRJRCkgewotCQlTdHJpbmcgb2xkRmllbGRJRCA9IGZpZWxkSUQ7Ci0JCWZpZWxkSUQgPSBuZXdGaWVsZElEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX0ZJRUxEX0lELCBvbGRGaWVsZElELCBmaWVsZElEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpIHsKLQkJcmV0dXJuIHZhbHVlSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIG5ld1ZhbHVlSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRWYWx1ZUlEID0gdmFsdWVJRDsKLQkJdmFsdWVJRCA9IG5ld1ZhbHVlSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fVkFMVUVfSUQsIG9sZFZhbHVlSUQsIHZhbHVlSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fVUlEOgotCQkJCXJldHVybiBnZXRVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gZ2V0RmllbGRJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBnZXRWYWx1ZUlEKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX1VJRDoKLQkJCQlzZXRVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRChGSUVMRF9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoVkFMVUVfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX1VJRDoKLQkJCQlyZXR1cm4gVUlEX0VERUZBVUxUID09IG51bGwgPyB1SUQgIT0gbnVsbCA6ICFVSURfRURFRkFVTFQuZXF1YWxzKHVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIEZJRUxEX0lEX0VERUZBVUxUID09IG51bGwgPyBmaWVsZElEICE9IG51bGwgOiAhRklFTERfSURfRURFRkFVTFQuZXF1YWxzKGZpZWxkSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBWQUxVRV9JRF9FREVGQVVMVCA9PSBudWxsID8gdmFsdWVJRCAhPSBudWxsIDogIVZBTFVFX0lEX0VERUZBVUxULmVxdWFscyh2YWx1ZUlEKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaWVsZElEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaWVsZElEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vT3V0bGluZUNvZGUzSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2RlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTlhZmM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE91dGxpbmVDb2RlSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0bGluZSBDb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2dldEZpZWxkTmFtZSA8ZW0+RmllbGQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNnZXRBbGlhcyA8ZW0+QWxpYXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZUltcGwjZ2V0UGhvbmV0aWNBbGlhcyA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZUltcGwjZ2V0VmFsdWVzIDxlbT5WYWx1ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZUltcGwjaXNFbnRlcnByaXNlIDxlbT5FbnRlcnByaXNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2dldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzIDxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCA8ZW0+UmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZUltcGwjaXNMZWFmT25seSA8ZW0+TGVhZiBPbmx5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2lzQWxsTGV2ZWxzUmVxdWlyZWQgPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZUltcGwjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkIDxlbT5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2dldE1hc2tzIDxlbT5NYXNrczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE91dGxpbmVDb2RlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgT3V0bGluZUNvZGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkSUQgPSBGSUVMRF9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZE5hbWUoKSA8ZW0+RmllbGQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkTmFtZSgpIDxlbT5GaWVsZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmllbGROYW1lID0gRklFTERfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbGlhcygpIDxlbT5BbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUFTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsaWFzKCkgPGVtPkFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbGlhcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhbGlhcyA9IEFMSUFTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBob25ldGljQWxpYXMoKSA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBob25ldGljQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBIT05FVElDX0FMSUFTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBob25ldGljQWxpYXMoKSA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBob25ldGljQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGhvbmV0aWNBbGlhcyA9IFBIT05FVElDX0FMSUFTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVzKCkgPGVtPlZhbHVlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFsdWVzIHZhbHVlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFbnRlcnByaXNlKCkgPGVtPkVudGVycHJpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRW50ZXJwcmlzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVOVEVSUFJJU0VfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRW50ZXJwcmlzZSgpIDxlbT5FbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VudGVycHJpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVudGVycHJpc2UgPSBFTlRFUlBSSVNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBFbnRlcnByaXNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbnRlcnByaXNlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKCkgPGVtPkVudGVycHJpc2UgT3V0bGluZSBDb2RlIEFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEVOVEVSUFJJU0VfT1VUTElORV9DT0RFX0FMSUFTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKCkgPGVtPkVudGVycHJpc2UgT3V0bGluZSBDb2RlIEFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMgPSBFTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpIDxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKSA8ZW0+UmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPSBSRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xlYWZPbmx5KCkgPGVtPkxlYWYgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNMZWFmT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIExFQUZfT05MWV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMZWFmT25seSgpIDxlbT5MZWFmIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGVhZk9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGxlYWZPbmx5ID0gTEVBRl9PTkxZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBMZWFmIE9ubHkgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGxlYWZPbmx5RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQWxsTGV2ZWxzUmVxdWlyZWQoKSA8ZW0+QWxsIExldmVscyBSZXF1aXJlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBbGxMZXZlbHNSZXF1aXJlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEFMTF9MRVZFTFNfUkVRVUlSRURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQWxsTGV2ZWxzUmVxdWlyZWQoKSA8ZW0+QWxsIExldmVscyBSZXF1aXJlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBbGxMZXZlbHNSZXF1aXJlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWxsTGV2ZWxzUmVxdWlyZWQgPSBBTExfTEVWRUxTX1JFUVVJUkVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBbGwgTGV2ZWxzIFJlcXVpcmVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhbGxMZXZlbHNSZXF1aXJlZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKSA8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gT05MWV9UQUJMRV9WQUxVRVNfQUxMT1dFRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkgPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gb25seVRhYmxlVmFsdWVzQWxsb3dlZCA9IE9OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG9ubHlUYWJsZVZhbHVlc0FsbG93ZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXNrcygpIDxlbT5NYXNrczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNYXNrcyBtYXNrcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT3V0bGluZUNvZGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0bGluZUNvZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkSUQoKSB7Ci0JCXJldHVybiBmaWVsZElEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkSUQoU3RyaW5nIG5ld0ZpZWxkSUQpIHsKLQkJU3RyaW5nIG9sZEZpZWxkSUQgPSBmaWVsZElEOwotCQlmaWVsZElEID0gbmV3RmllbGRJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX0lELCBvbGRGaWVsZElELCBmaWVsZElEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoKSB7Ci0JCXJldHVybiBmaWVsZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmllbGROYW1lKFN0cmluZyBuZXdGaWVsZE5hbWUpIHsKLQkJU3RyaW5nIG9sZEZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKLQkJZmllbGROYW1lID0gbmV3RmllbGROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRklFTERfTkFNRSwgb2xkRmllbGROYW1lLCBmaWVsZE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFsaWFzKCkgewotCQlyZXR1cm4gYWxpYXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxpYXMoU3RyaW5nIG5ld0FsaWFzKSB7Ci0JCVN0cmluZyBvbGRBbGlhcyA9IGFsaWFzOwotCQlhbGlhcyA9IG5ld0FsaWFzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxJQVMsIG9sZEFsaWFzLCBhbGlhcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGhvbmV0aWNBbGlhcygpIHsKLQkJcmV0dXJuIHBob25ldGljQWxpYXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGhvbmV0aWNBbGlhcyhTdHJpbmcgbmV3UGhvbmV0aWNBbGlhcykgewotCQlTdHJpbmcgb2xkUGhvbmV0aWNBbGlhcyA9IHBob25ldGljQWxpYXM7Ci0JCXBob25ldGljQWxpYXMgPSBuZXdQaG9uZXRpY0FsaWFzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUEhPTkVUSUNfQUxJQVMsIG9sZFBob25ldGljQWxpYXMsIHBob25ldGljQWxpYXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFsdWVzIGdldFZhbHVlcygpIHsKLQkJcmV0dXJuIHZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRWYWx1ZXMoVmFsdWVzIG5ld1ZhbHVlcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlWYWx1ZXMgb2xkVmFsdWVzID0gdmFsdWVzOwotCQl2YWx1ZXMgPSBuZXdWYWx1ZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19WQUxVRVMsIG9sZFZhbHVlcywgbmV3VmFsdWVzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoVmFsdWVzIG5ld1ZhbHVlcykgewotCQlpZiAobmV3VmFsdWVzICE9IHZhbHVlcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodmFsdWVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXZhbHVlcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19WQUxVRVMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ZhbHVlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdWYWx1ZXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFZhbHVlcyhuZXdWYWx1ZXMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1ZBTFVFUywgbmV3VmFsdWVzLCBuZXdWYWx1ZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VudGVycHJpc2UoKSB7Ci0JCXJldHVybiBlbnRlcnByaXNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudGVycHJpc2UoYm9vbGVhbiBuZXdFbnRlcnByaXNlKSB7Ci0JCWJvb2xlYW4gb2xkRW50ZXJwcmlzZSA9IGVudGVycHJpc2U7Ci0JCWVudGVycHJpc2UgPSBuZXdFbnRlcnByaXNlOwotCQlib29sZWFuIG9sZEVudGVycHJpc2VFU2V0ID0gZW50ZXJwcmlzZUVTZXQ7Ci0JCWVudGVycHJpc2VFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0UsIG9sZEVudGVycHJpc2UsIGVudGVycHJpc2UsICFvbGRFbnRlcnByaXNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RW50ZXJwcmlzZSgpIHsKLQkJYm9vbGVhbiBvbGRFbnRlcnByaXNlID0gZW50ZXJwcmlzZTsKLQkJYm9vbGVhbiBvbGRFbnRlcnByaXNlRVNldCA9IGVudGVycHJpc2VFU2V0OwotCQllbnRlcnByaXNlID0gRU5URVJQUklTRV9FREVGQVVMVDsKLQkJZW50ZXJwcmlzZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRU5URVJQUklTRSwgb2xkRW50ZXJwcmlzZSwgRU5URVJQUklTRV9FREVGQVVMVCwgb2xkRW50ZXJwcmlzZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEVudGVycHJpc2UoKSB7Ci0JCXJldHVybiBlbnRlcnByaXNlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpIHsKLQkJcmV0dXJuIGVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKEJpZ0ludGVnZXIgbmV3RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMpIHsKLQkJQmlnSW50ZWdlciBvbGRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyA9IGVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzOwotCQllbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyA9IG5ld0VudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRU5URVJQUklTRV9PVVRMSU5FX0NPREVfQUxJQVMsIG9sZEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzLCBlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkgewotCQlyZXR1cm4gcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZChib29sZWFuIG5ld1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCkgewotCQlib29sZWFuIG9sZFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCA9IHJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZDsKLQkJcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkID0gbmV3UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkOwotCQlib29sZWFuIG9sZFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZEVTZXQgPSByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0OwotCQlyZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1JFU09VUkNFX1NVQlNUSVRVVElPTl9FTkFCTEVELCBvbGRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQsIHJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCwgIW9sZFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpIHsKLQkJYm9vbGVhbiBvbGRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPSByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQ7Ci0JCWJvb2xlYW4gb2xkUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkRVNldCA9IHJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZEVTZXQ7Ci0JCXJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCA9IFJFU09VUkNFX1NVQlNUSVRVVElPTl9FTkFCTEVEX0VERUZBVUxUOwotCQlyZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1JFU09VUkNFX1NVQlNUSVRVVElPTl9FTkFCTEVELCBvbGRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQsIFJFU09VUkNFX1NVQlNUSVRVVElPTl9FTkFCTEVEX0VERUZBVUxULCBvbGRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKSB7Ci0JCXJldHVybiByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGVhZk9ubHkoKSB7Ci0JCXJldHVybiBsZWFmT25seTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZWFmT25seShib29sZWFuIG5ld0xlYWZPbmx5KSB7Ci0JCWJvb2xlYW4gb2xkTGVhZk9ubHkgPSBsZWFmT25seTsKLQkJbGVhZk9ubHkgPSBuZXdMZWFmT25seTsKLQkJYm9vbGVhbiBvbGRMZWFmT25seUVTZXQgPSBsZWFmT25seUVTZXQ7Ci0JCWxlYWZPbmx5RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19MRUFGX09OTFksIG9sZExlYWZPbmx5LCBsZWFmT25seSwgIW9sZExlYWZPbmx5RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TGVhZk9ubHkoKSB7Ci0JCWJvb2xlYW4gb2xkTGVhZk9ubHkgPSBsZWFmT25seTsKLQkJYm9vbGVhbiBvbGRMZWFmT25seUVTZXQgPSBsZWFmT25seUVTZXQ7Ci0JCWxlYWZPbmx5ID0gTEVBRl9PTkxZX0VERUZBVUxUOwotCQlsZWFmT25seUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTEVBRl9PTkxZLCBvbGRMZWFmT25seSwgTEVBRl9PTkxZX0VERUZBVUxULCBvbGRMZWFmT25seUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldExlYWZPbmx5KCkgewotCQlyZXR1cm4gbGVhZk9ubHlFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWxsTGV2ZWxzUmVxdWlyZWQoKSB7Ci0JCXJldHVybiBhbGxMZXZlbHNSZXF1aXJlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxMZXZlbHNSZXF1aXJlZChib29sZWFuIG5ld0FsbExldmVsc1JlcXVpcmVkKSB7Ci0JCWJvb2xlYW4gb2xkQWxsTGV2ZWxzUmVxdWlyZWQgPSBhbGxMZXZlbHNSZXF1aXJlZDsKLQkJYWxsTGV2ZWxzUmVxdWlyZWQgPSBuZXdBbGxMZXZlbHNSZXF1aXJlZDsKLQkJYm9vbGVhbiBvbGRBbGxMZXZlbHNSZXF1aXJlZEVTZXQgPSBhbGxMZXZlbHNSZXF1aXJlZEVTZXQ7Ci0JCWFsbExldmVsc1JlcXVpcmVkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTExfTEVWRUxTX1JFUVVJUkVELCBvbGRBbGxMZXZlbHNSZXF1aXJlZCwgYWxsTGV2ZWxzUmVxdWlyZWQsICFvbGRBbGxMZXZlbHNSZXF1aXJlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEFsbExldmVsc1JlcXVpcmVkKCkgewotCQlib29sZWFuIG9sZEFsbExldmVsc1JlcXVpcmVkID0gYWxsTGV2ZWxzUmVxdWlyZWQ7Ci0JCWJvb2xlYW4gb2xkQWxsTGV2ZWxzUmVxdWlyZWRFU2V0ID0gYWxsTGV2ZWxzUmVxdWlyZWRFU2V0OwotCQlhbGxMZXZlbHNSZXF1aXJlZCA9IEFMTF9MRVZFTFNfUkVRVUlSRURfRURFRkFVTFQ7Ci0JCWFsbExldmVsc1JlcXVpcmVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTExfTEVWRUxTX1JFUVVJUkVELCBvbGRBbGxMZXZlbHNSZXF1aXJlZCwgQUxMX0xFVkVMU19SRVFVSVJFRF9FREVGQVVMVCwgb2xkQWxsTGV2ZWxzUmVxdWlyZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRBbGxMZXZlbHNSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIGFsbExldmVsc1JlcXVpcmVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBvbmx5VGFibGVWYWx1ZXNBbGxvd2VkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoYm9vbGVhbiBuZXdPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKSB7Ci0JCWJvb2xlYW4gb2xkT25seVRhYmxlVmFsdWVzQWxsb3dlZCA9IG9ubHlUYWJsZVZhbHVlc0FsbG93ZWQ7Ci0JCW9ubHlUYWJsZVZhbHVlc0FsbG93ZWQgPSBuZXdPbmx5VGFibGVWYWx1ZXNBbGxvd2VkOwotCQlib29sZWFuIG9sZE9ubHlUYWJsZVZhbHVlc0FsbG93ZWRFU2V0ID0gb25seVRhYmxlVmFsdWVzQWxsb3dlZEVTZXQ7Ci0JCW9ubHlUYWJsZVZhbHVlc0FsbG93ZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX09OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRUQsIG9sZE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQsIG9ubHlUYWJsZVZhbHVlc0FsbG93ZWQsICFvbGRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpIHsKLQkJYm9vbGVhbiBvbGRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkID0gb25seVRhYmxlVmFsdWVzQWxsb3dlZDsKLQkJYm9vbGVhbiBvbGRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldCA9IG9ubHlUYWJsZVZhbHVlc0FsbG93ZWRFU2V0OwotCQlvbmx5VGFibGVWYWx1ZXNBbGxvd2VkID0gT05MWV9UQUJMRV9WQUxVRVNfQUxMT1dFRF9FREVGQVVMVDsKLQkJb25seVRhYmxlVmFsdWVzQWxsb3dlZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fT05MWV9UQUJMRV9WQUxVRVNfQUxMT1dFRCwgb2xkT25seVRhYmxlVmFsdWVzQWxsb3dlZCwgT05MWV9UQUJMRV9WQUxVRVNfQUxMT1dFRF9FREVGQVVMVCwgb2xkT25seVRhYmxlVmFsdWVzQWxsb3dlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBvbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWFza3MgZ2V0TWFza3MoKSB7Ci0JCXJldHVybiBtYXNrczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNYXNrcyhNYXNrcyBuZXdNYXNrcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlNYXNrcyBvbGRNYXNrcyA9IG1hc2tzOwotCQltYXNrcyA9IG5ld01hc2tzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTUFTS1MsIG9sZE1hc2tzLCBuZXdNYXNrcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFza3MoTWFza3MgbmV3TWFza3MpIHsKLQkJaWYgKG5ld01hc2tzICE9IG1hc2tzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChtYXNrcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCltYXNrcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19NQVNLUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3TWFza3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TWFza3MpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTUFTS1MsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0TWFza3MobmV3TWFza3MsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX01BU0tTLCBuZXdNYXNrcywgbmV3TWFza3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19WQUxVRVM6Ci0JCQkJCXJldHVybiBiYXNpY1NldFZhbHVlcyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19NQVNLUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0TWFza3MobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gZ2V0RmllbGRJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRklFTERfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RmllbGROYW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTElBUzoKLQkJCQlyZXR1cm4gZ2V0QWxpYXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1BIT05FVElDX0FMSUFTOgotCQkJCXJldHVybiBnZXRQaG9uZXRpY0FsaWFzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19WQUxVRVM6Ci0JCQkJcmV0dXJuIGdldFZhbHVlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRU5URVJQUklTRToKLQkJCQlyZXR1cm4gaXNFbnRlcnByaXNlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRU5URVJQUklTRV9PVVRMSU5FX0NPREVfQUxJQVM6Ci0JCQkJcmV0dXJuIGdldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19SRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRDoKLQkJCQlyZXR1cm4gaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19MRUFGX09OTFk6Ci0JCQkJcmV0dXJuIGlzTGVhZk9ubHkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTExfTEVWRUxTX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc0FsbExldmVsc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fT05MWV9UQUJMRV9WQUxVRVNfQUxMT1dFRDoKLQkJCQlyZXR1cm4gaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTUFTS1M6Ci0JCQkJcmV0dXJuIGdldE1hc2tzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19GSUVMRF9OQU1FOgotCQkJCXNldEZpZWxkTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTElBUzoKLQkJCQlzZXRBbGlhcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19QSE9ORVRJQ19BTElBUzoKLQkJCQlzZXRQaG9uZXRpY0FsaWFzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1ZBTFVFUzoKLQkJCQlzZXRWYWx1ZXMoKFZhbHVlcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRU5URVJQUklTRToKLQkJCQlzZXRFbnRlcnByaXNlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0VfT1VUTElORV9DT0RFX0FMSUFTOgotCQkJCXNldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19SRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRDoKLQkJCQlzZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTEVBRl9PTkxZOgotCQkJCXNldExlYWZPbmx5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0FMTF9MRVZFTFNfUkVRVUlSRUQ6Ci0JCQkJc2V0QWxsTGV2ZWxzUmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fT05MWV9UQUJMRV9WQUxVRVNfQUxMT1dFRDoKLQkJCQlzZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX01BU0tTOgotCQkJCXNldE1hc2tzKChNYXNrcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoRklFTERfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX05BTUU6Ci0JCQkJc2V0RmllbGROYW1lKEZJRUxEX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0FMSUFTOgotCQkJCXNldEFsaWFzKEFMSUFTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19QSE9ORVRJQ19BTElBUzoKLQkJCQlzZXRQaG9uZXRpY0FsaWFzKFBIT05FVElDX0FMSUFTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19WQUxVRVM6Ci0JCQkJc2V0VmFsdWVzKChWYWx1ZXMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRU5URVJQUklTRToKLQkJCQl1bnNldEVudGVycHJpc2UoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19FTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBUzoKLQkJCQlzZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyhFTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUkVTT1VSQ0VfU1VCU1RJVFVUSU9OX0VOQUJMRUQ6Ci0JCQkJdW5zZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19MRUFGX09OTFk6Ci0JCQkJdW5zZXRMZWFmT25seSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0FMTF9MRVZFTFNfUkVRVUlSRUQ6Ci0JCQkJdW5zZXRBbGxMZXZlbHNSZXF1aXJlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX09OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRUQ6Ci0JCQkJdW5zZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTUFTS1M6Ci0JCQkJc2V0TWFza3MoKE1hc2tzKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIEZJRUxEX0lEX0VERUZBVUxUID09IG51bGwgPyBmaWVsZElEICE9IG51bGwgOiAhRklFTERfSURfRURFRkFVTFQuZXF1YWxzKGZpZWxkSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRklFTERfTkFNRToKLQkJCQlyZXR1cm4gRklFTERfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZmllbGROYW1lICE9IG51bGwgOiAhRklFTERfTkFNRV9FREVGQVVMVC5lcXVhbHMoZmllbGROYW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0FMSUFTOgotCQkJCXJldHVybiBBTElBU19FREVGQVVMVCA9PSBudWxsID8gYWxpYXMgIT0gbnVsbCA6ICFBTElBU19FREVGQVVMVC5lcXVhbHMoYWxpYXMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUEhPTkVUSUNfQUxJQVM6Ci0JCQkJcmV0dXJuIFBIT05FVElDX0FMSUFTX0VERUZBVUxUID09IG51bGwgPyBwaG9uZXRpY0FsaWFzICE9IG51bGwgOiAhUEhPTkVUSUNfQUxJQVNfRURFRkFVTFQuZXF1YWxzKHBob25ldGljQWxpYXMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTOgotCQkJCXJldHVybiB2YWx1ZXMgIT0gbnVsbDsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0U6Ci0JCQkJcmV0dXJuIGlzU2V0RW50ZXJwcmlzZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRU5URVJQUklTRV9PVVRMSU5FX0NPREVfQUxJQVM6Ci0JCQkJcmV0dXJuIEVOVEVSUFJJU0VfT1VUTElORV9DT0RFX0FMSUFTX0VERUZBVUxUID09IG51bGwgPyBlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyAhPSBudWxsIDogIUVOVEVSUFJJU0VfT1VUTElORV9DT0RFX0FMSUFTX0VERUZBVUxULmVxdWFscyhlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19SRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRDoKLQkJCQlyZXR1cm4gaXNTZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0xFQUZfT05MWToKLQkJCQlyZXR1cm4gaXNTZXRMZWFmT25seSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxMX0xFVkVMU19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNTZXRBbGxMZXZlbHNSZXF1aXJlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fT05MWV9UQUJMRV9WQUxVRVNfQUxMT1dFRDoKLQkJCQlyZXR1cm4gaXNTZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19NQVNLUzoKLQkJCQlyZXR1cm4gbWFza3MgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGZpZWxkSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpZWxkSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpZWxkTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmllbGROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhbGlhczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWxpYXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBob25ldGljQWxpYXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBob25ldGljQWxpYXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVudGVycHJpc2U6ICIpOwotCQlpZiAoZW50ZXJwcmlzZUVTZXQpIHJlc3VsdC5hcHBlbmQoZW50ZXJwcmlzZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkOiAiKTsKLQkJaWYgKHJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZEVTZXQpIHJlc3VsdC5hcHBlbmQocmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGVhZk9ubHk6ICIpOwotCQlpZiAobGVhZk9ubHlFU2V0KSByZXN1bHQuYXBwZW5kKGxlYWZPbmx5KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWxsTGV2ZWxzUmVxdWlyZWQ6ICIpOwotCQlpZiAoYWxsTGV2ZWxzUmVxdWlyZWRFU2V0KSByZXN1bHQuYXBwZW5kKGFsbExldmVsc1JlcXVpcmVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb25seVRhYmxlVmFsdWVzQWxsb3dlZDogIik7Ci0JCWlmIChvbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldCkgcmVzdWx0LmFwcGVuZChvbmx5VGFibGVWYWx1ZXNBbGxvd2VkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL091dGxpbmVDb2RlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2Rlc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2Y2QzYzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2Rlc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE91dGxpbmVDb2Rlc0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGxpbmUgQ29kZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZXNJbXBsI2dldE91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRsaW5lQ29kZXNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBPdXRsaW5lQ29kZXMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVDb2RlKCkgPGVtPk91dGxpbmUgQ29kZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG91dGxpbmVDb2RlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPdXRsaW5lQ29kZXNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0bGluZUNvZGVzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE91dGxpbmVDb2RlKCkgewotCQlpZiAob3V0bGluZUNvZGUgPT0gbnVsbCkgewotCQkJb3V0bGluZUNvZGUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoT3V0bGluZUNvZGUuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFU19fT1VUTElORV9DT0RFKTsKLQkJfQotCQlyZXR1cm4gb3V0bGluZUNvZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERVNfX09VVExJTkVfQ09ERToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRPdXRsaW5lQ29kZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFU19fT1VUTElORV9DT0RFOgotCQkJCXJldHVybiBnZXRPdXRsaW5lQ29kZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVTX19PVVRMSU5FX0NPREU6Ci0JCQkJZ2V0T3V0bGluZUNvZGUoKS5jbGVhcigpOwotCQkJCWdldE91dGxpbmVDb2RlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERVNfX09VVExJTkVfQ09ERToKLQkJCQlnZXRPdXRsaW5lQ29kZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFU19fT1VUTElORV9DT0RFOgotCQkJCXJldHVybiBvdXRsaW5lQ29kZSAhPSBudWxsICYmICFvdXRsaW5lQ29kZS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL091dGxpbmVDb2Rlc0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9QcmVkZWNlc3NvckxpbmtJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUHJlZGVjZXNzb3JMaW5rSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzZhMzk4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9QcmVkZWNlc3NvckxpbmtJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcmVkZWNlc3NvckxpbmtJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3Nvckxpbms7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmVkZWNlc3NvciBMaW5rPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJlZGVjZXNzb3JMaW5rSW1wbCNnZXRQcmVkZWNlc3NvclVJRCA8ZW0+UHJlZGVjZXNzb3IgVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJlZGVjZXNzb3JMaW5rSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJlZGVjZXNzb3JMaW5rSW1wbCNpc0Nyb3NzUHJvamVjdCA8ZW0+Q3Jvc3MgUHJvamVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByZWRlY2Vzc29yTGlua0ltcGwjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSA8ZW0+Q3Jvc3MgUHJvamVjdCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJlZGVjZXNzb3JMaW5rSW1wbCNnZXRMaW5rTGFnIDxlbT5MaW5rIExhZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByZWRlY2Vzc29yTGlua0ltcGwjZ2V0TGFnRm9ybWF0IDxlbT5MYWcgRm9ybWF0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJlZGVjZXNzb3JMaW5rSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUHJlZGVjZXNzb3JMaW5rIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZGVjZXNzb3JVSUQoKSA8ZW0+UHJlZGVjZXNzb3IgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFBSRURFQ0VTU09SX1VJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVkZWNlc3NvclVJRCgpIDxlbT5QcmVkZWNlc3NvciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWRlY2Vzc29yVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBwcmVkZWNlc3NvclVJRCA9IFBSRURFQ0VTU09SX1VJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDcm9zc1Byb2plY3QoKSA8ZW0+Q3Jvc3MgUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDcm9zc1Byb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBDUk9TU19QUk9KRUNUX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nyb3NzUHJvamVjdCgpIDxlbT5Dcm9zcyBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Nyb3NzUHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY3Jvc3NQcm9qZWN0ID0gQ1JPU1NfUFJPSkVDVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ3Jvc3MgUHJvamVjdCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY3Jvc3NQcm9qZWN0RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyb3NzUHJvamVjdE5hbWUoKSA8ZW0+Q3Jvc3MgUHJvamVjdCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcm9zc1Byb2plY3ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDUk9TU19QUk9KRUNUX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSgpIDxlbT5Dcm9zcyBQcm9qZWN0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyb3NzUHJvamVjdE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY3Jvc3NQcm9qZWN0TmFtZSA9IENST1NTX1BST0pFQ1RfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5rTGFnKCkgPGVtPkxpbmsgTGFnPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaW5rTGFnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTElOS19MQUdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGlua0xhZygpIDxlbT5MaW5rIExhZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlua0xhZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgbGlua0xhZyA9IExJTktfTEFHX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhZ0Zvcm1hdCgpIDxlbT5MYWcgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYWdGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBMQUdfRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhZ0Zvcm1hdCgpIDxlbT5MYWcgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYWdGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGxhZ0Zvcm1hdCA9IExBR19GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJlZGVjZXNzb3JMaW5rSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFByZWRlY2Vzc29yTGluaygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFByZWRlY2Vzc29yVUlEKCkgewotCQlyZXR1cm4gcHJlZGVjZXNzb3JVSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZGVjZXNzb3JVSUQoQmlnSW50ZWdlciBuZXdQcmVkZWNlc3NvclVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFByZWRlY2Vzc29yVUlEID0gcHJlZGVjZXNzb3JVSUQ7Ci0JCXByZWRlY2Vzc29yVUlEID0gbmV3UHJlZGVjZXNzb3JVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fUFJFREVDRVNTT1JfVUlELCBvbGRQcmVkZWNlc3NvclVJRCwgcHJlZGVjZXNzb3JVSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKEJpZ0ludGVnZXIgbmV3VHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDcm9zc1Byb2plY3QoKSB7Ci0JCXJldHVybiBjcm9zc1Byb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3Jvc3NQcm9qZWN0KGJvb2xlYW4gbmV3Q3Jvc3NQcm9qZWN0KSB7Ci0JCWJvb2xlYW4gb2xkQ3Jvc3NQcm9qZWN0ID0gY3Jvc3NQcm9qZWN0OwotCQljcm9zc1Byb2plY3QgPSBuZXdDcm9zc1Byb2plY3Q7Ci0JCWJvb2xlYW4gb2xkQ3Jvc3NQcm9qZWN0RVNldCA9IGNyb3NzUHJvamVjdEVTZXQ7Ci0JCWNyb3NzUHJvamVjdEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1QsIG9sZENyb3NzUHJvamVjdCwgY3Jvc3NQcm9qZWN0LCAhb2xkQ3Jvc3NQcm9qZWN0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q3Jvc3NQcm9qZWN0KCkgewotCQlib29sZWFuIG9sZENyb3NzUHJvamVjdCA9IGNyb3NzUHJvamVjdDsKLQkJYm9vbGVhbiBvbGRDcm9zc1Byb2plY3RFU2V0ID0gY3Jvc3NQcm9qZWN0RVNldDsKLQkJY3Jvc3NQcm9qZWN0ID0gQ1JPU1NfUFJPSkVDVF9FREVGQVVMVDsKLQkJY3Jvc3NQcm9qZWN0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fQ1JPU1NfUFJPSkVDVCwgb2xkQ3Jvc3NQcm9qZWN0LCBDUk9TU19QUk9KRUNUX0VERUZBVUxULCBvbGRDcm9zc1Byb2plY3RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRDcm9zc1Byb2plY3QoKSB7Ci0JCXJldHVybiBjcm9zc1Byb2plY3RFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3Jvc3NQcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIGNyb3NzUHJvamVjdE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3Jvc3NQcm9qZWN0TmFtZShTdHJpbmcgbmV3Q3Jvc3NQcm9qZWN0TmFtZSkgewotCQlTdHJpbmcgb2xkQ3Jvc3NQcm9qZWN0TmFtZSA9IGNyb3NzUHJvamVjdE5hbWU7Ci0JCWNyb3NzUHJvamVjdE5hbWUgPSBuZXdDcm9zc1Byb2plY3ROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1RfTkFNRSwgb2xkQ3Jvc3NQcm9qZWN0TmFtZSwgY3Jvc3NQcm9qZWN0TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldExpbmtMYWcoKSB7Ci0JCXJldHVybiBsaW5rTGFnOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmtMYWcoQmlnSW50ZWdlciBuZXdMaW5rTGFnKSB7Ci0JCUJpZ0ludGVnZXIgb2xkTGlua0xhZyA9IGxpbmtMYWc7Ci0JCWxpbmtMYWcgPSBuZXdMaW5rTGFnOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0xJTktfTEFHLCBvbGRMaW5rTGFnLCBsaW5rTGFnKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TGFnRm9ybWF0KCkgewotCQlyZXR1cm4gbGFnRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhZ0Zvcm1hdChCaWdJbnRlZ2VyIG5ld0xhZ0Zvcm1hdCkgewotCQlCaWdJbnRlZ2VyIG9sZExhZ0Zvcm1hdCA9IGxhZ0Zvcm1hdDsKLQkJbGFnRm9ybWF0ID0gbmV3TGFnRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0xBR19GT1JNQVQsIG9sZExhZ0Zvcm1hdCwgbGFnRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1BSRURFQ0VTU09SX1VJRDoKLQkJCQlyZXR1cm4gZ2V0UHJlZGVjZXNzb3JVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fQ1JPU1NfUFJPSkVDVDoKLQkJCQlyZXR1cm4gaXNDcm9zc1Byb2plY3QoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fQ1JPU1NfUFJPSkVDVF9OQU1FOgotCQkJCXJldHVybiBnZXRDcm9zc1Byb2plY3ROYW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fTElOS19MQUc6Ci0JCQkJcmV0dXJuIGdldExpbmtMYWcoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19MQUdfRk9STUFUOgotCQkJCXJldHVybiBnZXRMYWdGb3JtYXQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fUFJFREVDRVNTT1JfVUlEOgotCQkJCXNldFByZWRlY2Vzc29yVUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fVFlQRToKLQkJCQlzZXRUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fQ1JPU1NfUFJPSkVDVDoKLQkJCQlzZXRDcm9zc1Byb2plY3QoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1RfTkFNRToKLQkJCQlzZXRDcm9zc1Byb2plY3ROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19MSU5LX0xBRzoKLQkJCQlzZXRMaW5rTGFnKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fTEFHX0ZPUk1BVDoKLQkJCQlzZXRMYWdGb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fUFJFREVDRVNTT1JfVUlEOgotCQkJCXNldFByZWRlY2Vzc29yVUlEKFBSRURFQ0VTU09SX1VJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fQ1JPU1NfUFJPSkVDVDoKLQkJCQl1bnNldENyb3NzUHJvamVjdCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNUX05BTUU6Ci0JCQkJc2V0Q3Jvc3NQcm9qZWN0TmFtZShDUk9TU19QUk9KRUNUX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19MSU5LX0xBRzoKLQkJCQlzZXRMaW5rTGFnKExJTktfTEFHX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fTEFHX0ZPUk1BVDoKLQkJCQlzZXRMYWdGb3JtYXQoTEFHX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fUFJFREVDRVNTT1JfVUlEOgotCQkJCXJldHVybiBQUkVERUNFU1NPUl9VSURfRURFRkFVTFQgPT0gbnVsbCA/IHByZWRlY2Vzc29yVUlEICE9IG51bGwgOiAhUFJFREVDRVNTT1JfVUlEX0VERUZBVUxULmVxdWFscyhwcmVkZWNlc3NvclVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIGlzU2V0Q3Jvc3NQcm9qZWN0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fQ1JPU1NfUFJPSkVDVF9OQU1FOgotCQkJCXJldHVybiBDUk9TU19QUk9KRUNUX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGNyb3NzUHJvamVjdE5hbWUgIT0gbnVsbCA6ICFDUk9TU19QUk9KRUNUX05BTUVfRURFRkFVTFQuZXF1YWxzKGNyb3NzUHJvamVjdE5hbWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0xJTktfTEFHOgotCQkJCXJldHVybiBMSU5LX0xBR19FREVGQVVMVCA9PSBudWxsID8gbGlua0xhZyAhPSBudWxsIDogIUxJTktfTEFHX0VERUZBVUxULmVxdWFscyhsaW5rTGFnKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19MQUdfRk9STUFUOgotCQkJCXJldHVybiBMQUdfRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBsYWdGb3JtYXQgIT0gbnVsbCA6ICFMQUdfRk9STUFUX0VERUZBVUxULmVxdWFscyhsYWdGb3JtYXQpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHJlZGVjZXNzb3JVSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZWRlY2Vzc29yVUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0eXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0eXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjcm9zc1Byb2plY3Q6ICIpOwotCQlpZiAoY3Jvc3NQcm9qZWN0RVNldCkgcmVzdWx0LmFwcGVuZChjcm9zc1Byb2plY3QpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjcm9zc1Byb2plY3ROYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjcm9zc1Byb2plY3ROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsaW5rTGFnOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsaW5rTGFnKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsYWdGb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxhZ0Zvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1ByZWRlY2Vzc29yTGlua0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Qcm9qZWN0SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1Byb2plY3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZjRkMDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1Byb2plY3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzcxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvamVjdEltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2plY3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRUaXRsZSA8ZW0+VGl0bGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRTdWJqZWN0IDxlbT5TdWJqZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0Q2F0ZWdvcnkgPGVtPkNhdGVnb3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0Q29tcGFueSA8ZW0+Q29tcGFueTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldE1hbmFnZXIgPGVtPk1hbmFnZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRBdXRob3IgPGVtPkF1dGhvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldFJldmlzaW9uIDxlbT5SZXZpc2lvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldExhc3RTYXZlZCA8ZW0+TGFzdCBTYXZlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzU2NoZWR1bGVGcm9tU3RhcnQgPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRTdGFydERhdGUgPGVtPlN0YXJ0IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRGaW5pc2hEYXRlIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldEZZU3RhcnREYXRlIDxlbT5GWSBTdGFydCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0Q3JpdGljYWxTbGFja0xpbWl0IDxlbT5Dcml0aWNhbCBTbGFjayBMaW1pdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldEN1cnJlbmN5RGlnaXRzIDxlbT5DdXJyZW5jeSBEaWdpdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRDdXJyZW5jeVN5bWJvbCA8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbiA8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldERlZmF1bHRTdGFydFRpbWUgPGVtPkRlZmF1bHQgU3RhcnQgVGltZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldERlZmF1bHRGaW5pc2hUaW1lIDxlbT5EZWZhdWx0IEZpbmlzaCBUaW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0TWludXRlc1BlckRheSA8ZW0+TWludXRlcyBQZXIgRGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0TWludXRlc1BlcldlZWsgPGVtPk1pbnV0ZXMgUGVyIFdlZWs8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREYXlzUGVyTW9udGggPGVtPkRheXMgUGVyIE1vbnRoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0RGVmYXVsdFRhc2tUeXBlIDxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsIDxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldERlZmF1bHRTdGFuZGFyZFJhdGUgPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldERlZmF1bHRPdmVydGltZVJhdGUgPGVtPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRXb3JrRm9ybWF0IDxlbT5Xb3JrIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzRWRpdGFibGVBY3R1YWxDb3N0cyA8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNIb25vckNvbnN0cmFpbnRzIDxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldEVhcm5lZFZhbHVlTWV0aG9kIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzIDxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzTmV3VGFza3NFZmZvcnREcml2ZW4gPGVtPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNOZXdUYXNrc0VzdGltYXRlZCA8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIDxlbT5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc1NwcmVhZEFjdHVhbENvc3QgPGVtPlNwcmVhZCBBY3R1YWwgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzU3ByZWFkUGVyY2VudENvbXBsZXRlIDxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzVGFza1VwZGF0ZXNSZXNvdXJjZSA8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNGaXNjYWxZZWFyU3RhcnQgPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0V2Vla1N0YXJ0RGF5IDxlbT5XZWVrIFN0YXJ0IERheTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUgPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyA8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRTdGF0dXNEYXRlIDxlbT5TdGF0dXMgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldEN1cnJlbnREYXRlIDxlbT5DdXJyZW50IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc0F1dG9saW5rIDxlbT5BdXRvbGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldE5ld1Rhc2tTdGFydERhdGUgPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREZWZhdWx0VGFza0VWTWV0aG9kIDxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCA8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldEV4dGVuZGVkQ3JlYXRpb25EYXRlIDxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNBY3R1YWxzSW5TeW5jIDxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzIDxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNBZG1pblByb2plY3QgPGVtPkFkbWluIFByb2plY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRPdXRsaW5lQ29kZXMgPGVtPk91dGxpbmUgQ29kZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRXQlNNYXNrcyA8ZW0+V0JTIE1hc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0Q2FsZW5kYXJzIDxlbT5DYWxlbmRhcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRUYXNrcyA8ZW0+VGFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRSZXNvdXJjZXMgPGVtPlJlc291cmNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldEFzc2lnbm1lbnRzIDxlbT5Bc3NpZ25tZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBQcm9qZWN0IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVJRCA9IFVJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpdGxlKCkgPGVtPlRpdGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaXRsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGl0bGUoKSA8ZW0+VGl0bGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRpdGxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlID0gVElUTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3ViamVjdCgpIDxlbT5TdWJqZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJKRUNUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YmplY3QoKSA8ZW0+U3ViamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzdWJqZWN0ID0gU1VCSkVDVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXRlZ29yeSgpIDxlbT5DYXRlZ29yeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhdGVnb3J5KCkgPGVtPkNhdGVnb3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjYXRlZ29yeSA9IENBVEVHT1JZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbXBhbnkoKSA8ZW0+Q29tcGFueTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29tcGFueSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFOWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21wYW55KCkgPGVtPkNvbXBhbnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbXBhbnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcGFueSA9IENPTVBBTllfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFuYWdlcigpIDxlbT5NYW5hZ2VyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYW5hZ2VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5BR0VSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hbmFnZXIoKSA8ZW0+TWFuYWdlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFuYWdlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYW5hZ2VyID0gTUFOQUdFUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3IoKSA8ZW0+QXV0aG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRob3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3IoKSA8ZW0+QXV0aG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRob3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXV0aG9yID0gQVVUSE9SX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyZWF0aW9uRGF0ZSgpIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IENSRUFUSU9OX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRpb25EYXRlKCkgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGlvbkRhdGUgPSBDUkVBVElPTl9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJldmlzaW9uKCkgPGVtPlJldmlzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXZpc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFJFVklTSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJldmlzaW9uKCkgPGVtPlJldmlzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXZpc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgcmV2aXNpb24gPSBSRVZJU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYXN0U2F2ZWQoKSA8ZW0+TGFzdCBTYXZlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFzdFNhdmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBMQVNUX1NBVkVEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhc3RTYXZlZCgpIDxlbT5MYXN0IFNhdmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYXN0U2F2ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgbGFzdFNhdmVkID0gTEFTVF9TQVZFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NjaGVkdWxlRnJvbVN0YXJ0KCkgPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2NoZWR1bGVGcm9tU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBTQ0hFRFVMRV9GUk9NX1NUQVJUX0VERUZBVUxUID0gdHJ1ZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU2NoZWR1bGVGcm9tU3RhcnQoKSA8ZW0+U2NoZWR1bGUgRnJvbSBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTY2hlZHVsZUZyb21TdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2NoZWR1bGVGcm9tU3RhcnQgPSBTQ0hFRFVMRV9GUk9NX1NUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBTY2hlZHVsZSBGcm9tIFN0YXJ0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzY2hlZHVsZUZyb21TdGFydEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydERhdGUoKSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBTVEFSVF9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0RGF0ZSgpIDxlbT5TdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgc3RhcnREYXRlID0gU1RBUlRfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hEYXRlKCkgPGVtPkZpbmlzaCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2hEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGSU5JU0hfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hEYXRlKCkgPGVtPkZpbmlzaCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2hEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZpbmlzaERhdGUgPSBGSU5JU0hfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGWVN0YXJ0RGF0ZSgpIDxlbT5GWSBTdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGWVN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEZZU1RBUlRfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGWVN0YXJ0RGF0ZSgpIDxlbT5GWSBTdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGWVN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZllTdGFydERhdGUgPSBGWVNUQVJUX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JpdGljYWxTbGFja0xpbWl0KCkgPGVtPkNyaXRpY2FsIFNsYWNrIExpbWl0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcml0aWNhbFNsYWNrTGltaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBDUklUSUNBTF9TTEFDS19MSU1JVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcml0aWNhbFNsYWNrTGltaXQoKSA8ZW0+Q3JpdGljYWwgU2xhY2sgTGltaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyaXRpY2FsU2xhY2tMaW1pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgY3JpdGljYWxTbGFja0xpbWl0ID0gQ1JJVElDQUxfU0xBQ0tfTElNSVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVuY3lEaWdpdHMoKSA8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDdXJyZW5jeURpZ2l0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIENVUlJFTkNZX0RJR0lUU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXJyZW5jeURpZ2l0cygpIDxlbT5DdXJyZW5jeSBEaWdpdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1cnJlbmN5RGlnaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBjdXJyZW5jeURpZ2l0cyA9IENVUlJFTkNZX0RJR0lUU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXJyZW5jeVN5bWJvbCgpIDxlbT5DdXJyZW5jeSBTeW1ib2w8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1cnJlbmN5U3ltYm9sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDVVJSRU5DWV9TWU1CT0xfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVuY3lTeW1ib2woKSA8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDdXJyZW5jeVN5bWJvbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjdXJyZW5jeVN5bWJvbCA9IENVUlJFTkNZX1NZTUJPTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKCkgPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIENVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKCkgPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgY3VycmVuY3lTeW1ib2xQb3NpdGlvbiA9IENVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWxlbmRhclVJRCgpIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhbGVuZGFyVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgQ0FMRU5EQVJfVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhbGVuZGFyVUlEKCkgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGNhbGVuZGFyVUlEID0gQ0FMRU5EQVJfVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRTdGFydFRpbWUoKSA8ZW0+RGVmYXVsdCBTdGFydCBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0U3RhcnRUaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBERUZBVUxUX1NUQVJUX1RJTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFN0YXJ0VGltZSgpIDxlbT5EZWZhdWx0IFN0YXJ0IFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRTdGFydFRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZGVmYXVsdFN0YXJ0VGltZSA9IERFRkFVTFRfU1RBUlRfVElNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0RmluaXNoVGltZSgpIDxlbT5EZWZhdWx0IEZpbmlzaCBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0RmluaXNoVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgREVGQVVMVF9GSU5JU0hfVElNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0RmluaXNoVGltZSgpIDxlbT5EZWZhdWx0IEZpbmlzaCBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0RmluaXNoVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkZWZhdWx0RmluaXNoVGltZSA9IERFRkFVTFRfRklOSVNIX1RJTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWludXRlc1BlckRheSgpIDxlbT5NaW51dGVzIFBlciBEYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1pbnV0ZXNQZXJEYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBNSU5VVEVTX1BFUl9EQVlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWludXRlc1BlckRheSgpIDxlbT5NaW51dGVzIFBlciBEYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1pbnV0ZXNQZXJEYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIG1pbnV0ZXNQZXJEYXkgPSBNSU5VVEVTX1BFUl9EQVlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWludXRlc1BlcldlZWsoKSA8ZW0+TWludXRlcyBQZXIgV2VlazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWludXRlc1BlcldlZWsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBNSU5VVEVTX1BFUl9XRUVLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbnV0ZXNQZXJXZWVrKCkgPGVtPk1pbnV0ZXMgUGVyIFdlZWs8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1pbnV0ZXNQZXJXZWVrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBtaW51dGVzUGVyV2VlayA9IE1JTlVURVNfUEVSX1dFRUtfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF5c1Blck1vbnRoKCkgPGVtPkRheXMgUGVyIE1vbnRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREYXlzUGVyTW9udGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBEQVlTX1BFUl9NT05USF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXlzUGVyTW9udGgoKSA8ZW0+RGF5cyBQZXIgTW9udGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERheXNQZXJNb250aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZGF5c1Blck1vbnRoID0gREFZU19QRVJfTU9OVEhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFRhc2tUeXBlKCkgPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBERUZBVUxUX1RBU0tfVFlQRV9FREVGQVVMVCA9IG5ldyBCaWdJbnRlZ2VyKCIxIik7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0VGFza1R5cGUoKSA8ZW0+RGVmYXVsdCBUYXNrIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRUYXNrVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZGVmYXVsdFRhc2tUeXBlID0gREVGQVVMVF9UQVNLX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIERlZmF1bHQgVGFzayBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0VGFza1R5cGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKSA8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKSA8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCA9IERFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRTdGFuZGFyZFJhdGUoKSA8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IERFRkFVTFRfU1RBTkRBUkRfUkFURV9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkgPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGRlZmF1bHRTdGFuZGFyZFJhdGUgPSBERUZBVUxUX1NUQU5EQVJEX1JBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIERlZmF1bHQgU3RhbmRhcmQgUmF0ZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkgPGVtPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX09WRVJUSU1FX1JBVEVfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpIDxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBkZWZhdWx0T3ZlcnRpbWVSYXRlID0gREVGQVVMVF9PVkVSVElNRV9SQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBEZWZhdWx0IE92ZXJ0aW1lIFJhdGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRPdmVydGltZVJhdGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbkZvcm1hdCgpIDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdCA9IERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrRm9ybWF0KCkgPGVtPldvcmsgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgV09SS19GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya0Zvcm1hdCgpIDxlbT5Xb3JrIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya0Zvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgd29ya0Zvcm1hdCA9IFdPUktfRk9STUFUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRWRpdGFibGVBY3R1YWxDb3N0cygpIDxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVESVRBQkxFX0FDVFVBTF9DT1NUU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFZGl0YWJsZUFjdHVhbENvc3RzKCkgPGVtPkVkaXRhYmxlIEFjdHVhbCBDb3N0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlZGl0YWJsZUFjdHVhbENvc3RzID0gRURJVEFCTEVfQUNUVUFMX0NPU1RTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBFZGl0YWJsZSBBY3R1YWwgQ29zdHMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVkaXRhYmxlQWN0dWFsQ29zdHNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIb25vckNvbnN0cmFpbnRzKCkgPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0hvbm9yQ29uc3RyYWludHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBIT05PUl9DT05TVFJBSU5UU19FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0hvbm9yQ29uc3RyYWludHMoKSA8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSG9ub3JDb25zdHJhaW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaG9ub3JDb25zdHJhaW50cyA9IEhPTk9SX0NPTlNUUkFJTlRTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBIb25vciBDb25zdHJhaW50cyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaG9ub3JDb25zdHJhaW50c0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEVBUk5FRF9WQUxVRV9NRVRIT0RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKSA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGVhcm5lZFZhbHVlTWV0aG9kID0gRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpIDxlbT5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSU5TRVJURURfUFJPSkVDVFNfTElLRV9TVU1NQVJZX0VERUZBVUxUID0gdHJ1ZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkgPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSA9IElOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSW5zZXJ0ZWQgUHJvamVjdHMgTGlrZSBTdW1tYXJ5IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnlFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKSA8ZW0+TXVsdGlwbGUgQ3JpdGljYWwgUGF0aHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTVVMVElQTEVfQ1JJVElDQUxfUEFUSFNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzKCkgPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc011bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbXVsdGlwbGVDcml0aWNhbFBhdGhzID0gTVVMVElQTEVfQ1JJVElDQUxfUEFUSFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE11bHRpcGxlIENyaXRpY2FsIFBhdGhzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtdWx0aXBsZUNyaXRpY2FsUGF0aHNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNOZXdUYXNrc0VmZm9ydERyaXZlbigpIDxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNOZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE5FV19UQVNLU19FRkZPUlRfRFJJVkVOX0VERUZBVUxUID0gdHJ1ZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTmV3VGFza3NFZmZvcnREcml2ZW4oKSA8ZW0+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTmV3VGFza3NFZmZvcnREcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG5ld1Rhc2tzRWZmb3J0RHJpdmVuID0gTkVXX1RBU0tTX0VGRk9SVF9EUklWRU5fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBuZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05ld1Rhc2tzRXN0aW1hdGVkKCkgPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBORVdfVEFTS1NfRVNUSU1BVEVEX0VERUZBVUxUID0gdHJ1ZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTmV3VGFza3NFc3RpbWF0ZWQoKSA8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNOZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbmV3VGFza3NFc3RpbWF0ZWQgPSBORVdfVEFTS1NfRVNUSU1BVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBOZXcgVGFza3MgRXN0aW1hdGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBuZXdUYXNrc0VzdGltYXRlZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpIDxlbT5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1BMSVRTX0lOX1BST0dSRVNTX1RBU0tTX0VERUZBVUxUID0gdHJ1ZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkgPGVtPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNwbGl0c0luUHJvZ3Jlc3NUYXNrcyA9IFNQTElUU19JTl9QUk9HUkVTU19UQVNLU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU3BsaXRzIEluIFByb2dyZXNzIFRhc2tzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzcGxpdHNJblByb2dyZXNzVGFza3NFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTcHJlYWRBY3R1YWxDb3N0KCkgPGVtPlNwcmVhZCBBY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1BSRUFEX0FDVFVBTF9DT1NUX0VERUZBVUxUID0gdHJ1ZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3ByZWFkQWN0dWFsQ29zdCgpIDxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3ByZWFkQWN0dWFsQ29zdCA9IFNQUkVBRF9BQ1RVQUxfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU3ByZWFkIEFjdHVhbCBDb3N0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzcHJlYWRBY3R1YWxDb3N0RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3ByZWFkUGVyY2VudENvbXBsZXRlKCkgPGVtPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNQUkVBRF9QRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpIDxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNwcmVhZFBlcmNlbnRDb21wbGV0ZSA9IFNQUkVBRF9QRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBTcHJlYWQgUGVyY2VudCBDb21wbGV0ZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3ByZWFkUGVyY2VudENvbXBsZXRlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVGFza1VwZGF0ZXNSZXNvdXJjZSgpIDxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFRBU0tfVVBEQVRFU19SRVNPVVJDRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNUYXNrVXBkYXRlc1Jlc291cmNlKCkgPGVtPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNUYXNrVXBkYXRlc1Jlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0YXNrVXBkYXRlc1Jlc291cmNlID0gVEFTS19VUERBVEVTX1JFU09VUkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBUYXNrIFVwZGF0ZXMgUmVzb3VyY2UgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHRhc2tVcGRhdGVzUmVzb3VyY2VFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNGaXNjYWxZZWFyU3RhcnQoKSA8ZW0+RmlzY2FsIFllYXIgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRklTQ0FMX1lFQVJfU1RBUlRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmlzY2FsWWVhclN0YXJ0KCkgPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Zpc2NhbFllYXJTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmlzY2FsWWVhclN0YXJ0ID0gRklTQ0FMX1lFQVJfU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEZpc2NhbCBZZWFyIFN0YXJ0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaXNjYWxZZWFyU3RhcnRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2Vla1N0YXJ0RGF5KCkgPGVtPldlZWsgU3RhcnQgRGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXZWVrU3RhcnREYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBXRUVLX1NUQVJUX0RBWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXZWVrU3RhcnREYXkoKSA8ZW0+V2VlayBTdGFydCBEYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdlZWtTdGFydERheSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgd2Vla1N0YXJ0RGF5ID0gV0VFS19TVEFSVF9EQVlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKSA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1PVkVfQ09NUExFVEVEX0VORFNfQkFDS19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKSA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbW92ZUNvbXBsZXRlZEVuZHNCYWNrID0gTU9WRV9DT01QTEVURURfRU5EU19CQUNLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2sgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1vdmVDb21wbGV0ZWRFbmRzQmFja0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0JBQ0tfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKSA8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEJhY2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1vdmVSZW1haW5pbmdTdGFydHNCYWNrID0gTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0JBQ0tfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb3ZlUmVtYWluaW5nU3RhcnRzQmFja0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKSA8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEZvcndhcmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkID0gTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTU9WRV9DT01QTEVURURfRU5EU19GT1JXQVJEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPSBNT1ZFX0NPTVBMRVRFRF9FTkRTX0ZPUldBUkRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoKSA8ZW0+QmFzZWxpbmUgRm9yIEVhcm5lZCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpIDxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBiYXNlbGluZUZvckVhcm5lZFZhbHVlID0gQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpIDxlbT5BdXRvIEFkZCBOZXcgUmVzb3VyY2VzIEFuZCBUYXNrczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBBVVRPX0FERF9ORVdfUkVTT1VSQ0VTX0FORF9UQVNLU19FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpIDxlbT5BdXRvIEFkZCBOZXcgUmVzb3VyY2VzIEFuZCBUYXNrczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyA9IEFVVE9fQUREX05FV19SRVNPVVJDRVNfQU5EX1RBU0tTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBdXRvIEFkZCBOZXcgUmVzb3VyY2VzIEFuZCBUYXNrcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXR1c0RhdGUoKSA8ZW0+U3RhdHVzIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXR1c0RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFNUQVRVU19EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXR1c0RhdGUoKSA8ZW0+U3RhdHVzIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXR1c0RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgc3RhdHVzRGF0ZSA9IFNUQVRVU19EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1cnJlbnREYXRlKCkgPGVtPkN1cnJlbnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3VycmVudERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IENVUlJFTlRfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXJyZW50RGF0ZSgpIDxlbT5DdXJyZW50IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1cnJlbnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGN1cnJlbnREYXRlID0gQ1VSUkVOVF9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpIDxlbT5NaWNyb3NvZnQgUHJvamVjdCBTZXJ2ZXIgVVJMPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBNSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKSA8ZW0+TWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMID0gTUlDUk9TT0ZUX1BST0pFQ1RfU0VSVkVSX1VSTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0F1dG9saW5rKCkgPGVtPkF1dG9saW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0F1dG9saW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQVVUT0xJTktfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQXV0b2xpbmsoKSA8ZW0+QXV0b2xpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQXV0b2xpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGF1dG9saW5rID0gQVVUT0xJTktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEF1dG9saW5rIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdXRvbGlua0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROZXdUYXNrU3RhcnREYXRlKCkgPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5ld1Rhc2tTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBORVdfVEFTS19TVEFSVF9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5ld1Rhc2tTdGFydERhdGUoKSA8ZW0+TmV3IFRhc2sgU3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmV3VGFza1N0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgbmV3VGFza1N0YXJ0RGF0ZSA9IE5FV19UQVNLX1NUQVJUX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgpIDxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza0VWTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREVGQVVMVF9UQVNLX0VWX01FVEhPRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0VGFza0VWTWV0aG9kKCkgPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRUYXNrRVZNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGRlZmF1bHRUYXNrRVZNZXRob2QgPSBERUZBVUxUX1RBU0tfRVZfTUVUSE9EX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKSA8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBST0pFQ1RfRVhURVJOQUxMWV9FRElURURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKSA8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPSBQUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBQcm9qZWN0IEV4dGVybmFsbHkgRWRpdGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSgpIDxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgRVhURU5ERURfQ1JFQVRJT05fREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSgpIDxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBleHRlbmRlZENyZWF0aW9uRGF0ZSA9IEVYVEVOREVEX0NSRUFUSU9OX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBY3R1YWxzSW5TeW5jKCkgPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBY3R1YWxzSW5TeW5jKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQUNUVUFMU19JTl9TWU5DX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0FjdHVhbHNJblN5bmMoKSA8ZW0+QWN0dWFscyBJbiBTeW5jPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0FjdHVhbHNJblN5bmMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjdHVhbHNJblN5bmMgPSBBQ1RVQUxTX0lOX1NZTkNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEFjdHVhbHMgSW4gU3luYyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWN0dWFsc0luU3luY0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkgPGVtPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVtb3ZlRmlsZVByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRU1PVkVfRklMRV9QUk9QRVJUSUVTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkgPGVtPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVtb3ZlRmlsZVByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpbGVQcm9wZXJ0aWVzID0gUkVNT1ZFX0ZJTEVfUFJPUEVSVElFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVtb3ZlIEZpbGUgUHJvcGVydGllcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBZG1pblByb2plY3QoKSA8ZW0+QWRtaW4gUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBZG1pblByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBBRE1JTl9QUk9KRUNUX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0FkbWluUHJvamVjdCgpIDxlbT5BZG1pbiBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0FkbWluUHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRtaW5Qcm9qZWN0ID0gQURNSU5fUFJPSkVDVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQWRtaW4gUHJvamVjdCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRtaW5Qcm9qZWN0RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3V0bGluZUNvZGVzKCkgPGVtPk91dGxpbmUgQ29kZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE91dGxpbmVDb2RlcyBvdXRsaW5lQ29kZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V0JTTWFza3MoKSA8ZW0+V0JTIE1hc2tzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXQlNNYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFdCU01hc2tzIHdCU01hc2tzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVuZGVkQXR0cmlidXRlcygpIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFeHRlbmRlZEF0dHJpYnV0ZXMgZXh0ZW5kZWRBdHRyaWJ1dGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhbGVuZGFycygpIDxlbT5DYWxlbmRhcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhbGVuZGFycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENhbGVuZGFycyBjYWxlbmRhcnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFza3MoKSA8ZW0+VGFza3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFza3MgdGFza3MgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VzKCkgPGVtPlJlc291cmNlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2VzIHJlc291cmNlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBc3NpZ25tZW50cygpIDxlbT5Bc3NpZ25tZW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXNzaWdubWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBBc3NpZ25tZW50cyBhc3NpZ25tZW50cyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvamVjdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9qZWN0KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKFN0cmluZyBuZXdVSUQpIHsKLQkJU3RyaW5nIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpdGxlKFN0cmluZyBuZXdUaXRsZSkgewotCQlTdHJpbmcgb2xkVGl0bGUgPSB0aXRsZTsKLQkJdGl0bGUgPSBuZXdUaXRsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19USVRMRSwgb2xkVGl0bGUsIHRpdGxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdWJqZWN0KCkgewotCQlyZXR1cm4gc3ViamVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdWJqZWN0KFN0cmluZyBuZXdTdWJqZWN0KSB7Ci0JCVN0cmluZyBvbGRTdWJqZWN0ID0gc3ViamVjdDsKLQkJc3ViamVjdCA9IG5ld1N1YmplY3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1VCSkVDVCwgb2xkU3ViamVjdCwgc3ViamVjdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBjYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeShTdHJpbmcgbmV3Q2F0ZWdvcnkpIHsKLQkJU3RyaW5nIG9sZENhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JCWNhdGVnb3J5ID0gbmV3Q2F0ZWdvcnk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FURUdPUlksIG9sZENhdGVnb3J5LCBjYXRlZ29yeSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFueSgpIHsKLQkJcmV0dXJuIGNvbXBhbnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tcGFueShTdHJpbmcgbmV3Q29tcGFueSkgewotCQlTdHJpbmcgb2xkQ29tcGFueSA9IGNvbXBhbnk7Ci0JCWNvbXBhbnkgPSBuZXdDb21wYW55OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NPTVBBTlksIG9sZENvbXBhbnksIGNvbXBhbnkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hbmFnZXIoKSB7Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hbmFnZXIoU3RyaW5nIG5ld01hbmFnZXIpIHsKLQkJU3RyaW5nIG9sZE1hbmFnZXIgPSBtYW5hZ2VyOwotCQltYW5hZ2VyID0gbmV3TWFuYWdlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NQU5BR0VSLCBvbGRNYW5hZ2VyLCBtYW5hZ2VyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdXRob3IoKSB7Ci0JCXJldHVybiBhdXRob3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0aG9yKFN0cmluZyBuZXdBdXRob3IpIHsKLQkJU3RyaW5nIG9sZEF1dGhvciA9IGF1dGhvcjsKLQkJYXV0aG9yID0gbmV3QXV0aG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVEhPUiwgb2xkQXV0aG9yLCBhdXRob3IpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0aW9uRGF0ZSgpIHsKLQkJcmV0dXJuIGNyZWF0aW9uRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvbkRhdGUoT2JqZWN0IG5ld0NyZWF0aW9uRGF0ZSkgewotCQlPYmplY3Qgb2xkQ3JlYXRpb25EYXRlID0gY3JlYXRpb25EYXRlOwotCQljcmVhdGlvbkRhdGUgPSBuZXdDcmVhdGlvbkRhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1JFQVRJT05fREFURSwgb2xkQ3JlYXRpb25EYXRlLCBjcmVhdGlvbkRhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRSZXZpc2lvbigpIHsKLQkJcmV0dXJuIHJldmlzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJldmlzaW9uKEJpZ0ludGVnZXIgbmV3UmV2aXNpb24pIHsKLQkJQmlnSW50ZWdlciBvbGRSZXZpc2lvbiA9IHJldmlzaW9uOwotCQlyZXZpc2lvbiA9IG5ld1JldmlzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFVklTSU9OLCBvbGRSZXZpc2lvbiwgcmV2aXNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExhc3RTYXZlZCgpIHsKLQkJcmV0dXJuIGxhc3RTYXZlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXN0U2F2ZWQoT2JqZWN0IG5ld0xhc3RTYXZlZCkgewotCQlPYmplY3Qgb2xkTGFzdFNhdmVkID0gbGFzdFNhdmVkOwotCQlsYXN0U2F2ZWQgPSBuZXdMYXN0U2F2ZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTEFTVF9TQVZFRCwgb2xkTGFzdFNhdmVkLCBsYXN0U2F2ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NjaGVkdWxlRnJvbVN0YXJ0KCkgewotCQlyZXR1cm4gc2NoZWR1bGVGcm9tU3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NoZWR1bGVGcm9tU3RhcnQoYm9vbGVhbiBuZXdTY2hlZHVsZUZyb21TdGFydCkgewotCQlib29sZWFuIG9sZFNjaGVkdWxlRnJvbVN0YXJ0ID0gc2NoZWR1bGVGcm9tU3RhcnQ7Ci0JCXNjaGVkdWxlRnJvbVN0YXJ0ID0gbmV3U2NoZWR1bGVGcm9tU3RhcnQ7Ci0JCWJvb2xlYW4gb2xkU2NoZWR1bGVGcm9tU3RhcnRFU2V0ID0gc2NoZWR1bGVGcm9tU3RhcnRFU2V0OwotCQlzY2hlZHVsZUZyb21TdGFydEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NDSEVEVUxFX0ZST01fU1RBUlQsIG9sZFNjaGVkdWxlRnJvbVN0YXJ0LCBzY2hlZHVsZUZyb21TdGFydCwgIW9sZFNjaGVkdWxlRnJvbVN0YXJ0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0U2NoZWR1bGVGcm9tU3RhcnQoKSB7Ci0JCWJvb2xlYW4gb2xkU2NoZWR1bGVGcm9tU3RhcnQgPSBzY2hlZHVsZUZyb21TdGFydDsKLQkJYm9vbGVhbiBvbGRTY2hlZHVsZUZyb21TdGFydEVTZXQgPSBzY2hlZHVsZUZyb21TdGFydEVTZXQ7Ci0JCXNjaGVkdWxlRnJvbVN0YXJ0ID0gU0NIRURVTEVfRlJPTV9TVEFSVF9FREVGQVVMVDsKLQkJc2NoZWR1bGVGcm9tU3RhcnRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TQ0hFRFVMRV9GUk9NX1NUQVJULCBvbGRTY2hlZHVsZUZyb21TdGFydCwgU0NIRURVTEVfRlJPTV9TVEFSVF9FREVGQVVMVCwgb2xkU2NoZWR1bGVGcm9tU3RhcnRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTY2hlZHVsZUZyb21TdGFydCgpIHsKLQkJcmV0dXJuIHNjaGVkdWxlRnJvbVN0YXJ0RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFN0YXJ0RGF0ZSgpIHsKLQkJcmV0dXJuIHN0YXJ0RGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydERhdGUoT2JqZWN0IG5ld1N0YXJ0RGF0ZSkgewotCQlPYmplY3Qgb2xkU3RhcnREYXRlID0gc3RhcnREYXRlOwotCQlzdGFydERhdGUgPSBuZXdTdGFydERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBUlRfREFURSwgb2xkU3RhcnREYXRlLCBzdGFydERhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZpbmlzaERhdGUoKSB7Ci0JCXJldHVybiBmaW5pc2hEYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmlzaERhdGUoT2JqZWN0IG5ld0ZpbmlzaERhdGUpIHsKLQkJT2JqZWN0IG9sZEZpbmlzaERhdGUgPSBmaW5pc2hEYXRlOwotCQlmaW5pc2hEYXRlID0gbmV3RmluaXNoRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GSU5JU0hfREFURSwgb2xkRmluaXNoRGF0ZSwgZmluaXNoRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEZZU3RhcnREYXRlKCkgewotCQlyZXR1cm4gZllTdGFydERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RllTdGFydERhdGUoQmlnSW50ZWdlciBuZXdGWVN0YXJ0RGF0ZSkgewotCQlCaWdJbnRlZ2VyIG9sZEZZU3RhcnREYXRlID0gZllTdGFydERhdGU7Ci0JCWZZU3RhcnREYXRlID0gbmV3RllTdGFydERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRllTVEFSVF9EQVRFLCBvbGRGWVN0YXJ0RGF0ZSwgZllTdGFydERhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRDcml0aWNhbFNsYWNrTGltaXQoKSB7Ci0JCXJldHVybiBjcml0aWNhbFNsYWNrTGltaXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JpdGljYWxTbGFja0xpbWl0KEJpZ0ludGVnZXIgbmV3Q3JpdGljYWxTbGFja0xpbWl0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkQ3JpdGljYWxTbGFja0xpbWl0ID0gY3JpdGljYWxTbGFja0xpbWl0OwotCQljcml0aWNhbFNsYWNrTGltaXQgPSBuZXdDcml0aWNhbFNsYWNrTGltaXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1JJVElDQUxfU0xBQ0tfTElNSVQsIG9sZENyaXRpY2FsU2xhY2tMaW1pdCwgY3JpdGljYWxTbGFja0xpbWl0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q3VycmVuY3lEaWdpdHMoKSB7Ci0JCXJldHVybiBjdXJyZW5jeURpZ2l0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW5jeURpZ2l0cyhCaWdJbnRlZ2VyIG5ld0N1cnJlbmN5RGlnaXRzKSB7Ci0JCUJpZ0ludGVnZXIgb2xkQ3VycmVuY3lEaWdpdHMgPSBjdXJyZW5jeURpZ2l0czsKLQkJY3VycmVuY3lEaWdpdHMgPSBuZXdDdXJyZW5jeURpZ2l0czsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9ESUdJVFMsIG9sZEN1cnJlbmN5RGlnaXRzLCBjdXJyZW5jeURpZ2l0cykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVuY3lTeW1ib2woKSB7Ci0JCXJldHVybiBjdXJyZW5jeVN5bWJvbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW5jeVN5bWJvbChTdHJpbmcgbmV3Q3VycmVuY3lTeW1ib2wpIHsKLQkJU3RyaW5nIG9sZEN1cnJlbmN5U3ltYm9sID0gY3VycmVuY3lTeW1ib2w7Ci0JCWN1cnJlbmN5U3ltYm9sID0gbmV3Q3VycmVuY3lTeW1ib2w7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MLCBvbGRDdXJyZW5jeVN5bWJvbCwgY3VycmVuY3lTeW1ib2wpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKCkgewotCQlyZXR1cm4gY3VycmVuY3lTeW1ib2xQb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKEJpZ0ludGVnZXIgbmV3Q3VycmVuY3lTeW1ib2xQb3NpdGlvbikgewotCQlCaWdJbnRlZ2VyIG9sZEN1cnJlbmN5U3ltYm9sUG9zaXRpb24gPSBjdXJyZW5jeVN5bWJvbFBvc2l0aW9uOwotCQljdXJyZW5jeVN5bWJvbFBvc2l0aW9uID0gbmV3Q3VycmVuY3lTeW1ib2xQb3NpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9TWU1CT0xfUE9TSVRJT04sIG9sZEN1cnJlbmN5U3ltYm9sUG9zaXRpb24sIGN1cnJlbmN5U3ltYm9sUG9zaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRDYWxlbmRhclVJRCgpIHsKLQkJcmV0dXJuIGNhbGVuZGFyVUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhbGVuZGFyVUlEKEJpZ0ludGVnZXIgbmV3Q2FsZW5kYXJVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRDYWxlbmRhclVJRCA9IGNhbGVuZGFyVUlEOwotCQljYWxlbmRhclVJRCA9IG5ld0NhbGVuZGFyVUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSX1VJRCwgb2xkQ2FsZW5kYXJVSUQsIGNhbGVuZGFyVUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0U3RhcnRUaW1lKCkgewotCQlyZXR1cm4gZGVmYXVsdFN0YXJ0VGltZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0U3RhcnRUaW1lKE9iamVjdCBuZXdEZWZhdWx0U3RhcnRUaW1lKSB7Ci0JCU9iamVjdCBvbGREZWZhdWx0U3RhcnRUaW1lID0gZGVmYXVsdFN0YXJ0VGltZTsKLQkJZGVmYXVsdFN0YXJ0VGltZSA9IG5ld0RlZmF1bHRTdGFydFRpbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9TVEFSVF9USU1FLCBvbGREZWZhdWx0U3RhcnRUaW1lLCBkZWZhdWx0U3RhcnRUaW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0RmluaXNoVGltZSgpIHsKLQkJcmV0dXJuIGRlZmF1bHRGaW5pc2hUaW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRGaW5pc2hUaW1lKE9iamVjdCBuZXdEZWZhdWx0RmluaXNoVGltZSkgewotCQlPYmplY3Qgb2xkRGVmYXVsdEZpbmlzaFRpbWUgPSBkZWZhdWx0RmluaXNoVGltZTsKLQkJZGVmYXVsdEZpbmlzaFRpbWUgPSBuZXdEZWZhdWx0RmluaXNoVGltZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJTklTSF9USU1FLCBvbGREZWZhdWx0RmluaXNoVGltZSwgZGVmYXVsdEZpbmlzaFRpbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRNaW51dGVzUGVyRGF5KCkgewotCQlyZXR1cm4gbWludXRlc1BlckRheTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaW51dGVzUGVyRGF5KEJpZ0ludGVnZXIgbmV3TWludXRlc1BlckRheSkgewotCQlCaWdJbnRlZ2VyIG9sZE1pbnV0ZXNQZXJEYXkgPSBtaW51dGVzUGVyRGF5OwotCQltaW51dGVzUGVyRGF5ID0gbmV3TWludXRlc1BlckRheTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9EQVksIG9sZE1pbnV0ZXNQZXJEYXksIG1pbnV0ZXNQZXJEYXkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRNaW51dGVzUGVyV2VlaygpIHsKLQkJcmV0dXJuIG1pbnV0ZXNQZXJXZWVrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbnV0ZXNQZXJXZWVrKEJpZ0ludGVnZXIgbmV3TWludXRlc1BlcldlZWspIHsKLQkJQmlnSW50ZWdlciBvbGRNaW51dGVzUGVyV2VlayA9IG1pbnV0ZXNQZXJXZWVrOwotCQltaW51dGVzUGVyV2VlayA9IG5ld01pbnV0ZXNQZXJXZWVrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01JTlVURVNfUEVSX1dFRUssIG9sZE1pbnV0ZXNQZXJXZWVrLCBtaW51dGVzUGVyV2VlaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldERheXNQZXJNb250aCgpIHsKLQkJcmV0dXJuIGRheXNQZXJNb250aDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXlzUGVyTW9udGgoQmlnSW50ZWdlciBuZXdEYXlzUGVyTW9udGgpIHsKLQkJQmlnSW50ZWdlciBvbGREYXlzUGVyTW9udGggPSBkYXlzUGVyTW9udGg7Ci0JCWRheXNQZXJNb250aCA9IG5ld0RheXNQZXJNb250aDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EQVlTX1BFUl9NT05USCwgb2xkRGF5c1Blck1vbnRoLCBkYXlzUGVyTW9udGgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREZWZhdWx0VGFza1R5cGUoKSB7Ci0JCXJldHVybiBkZWZhdWx0VGFza1R5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFRhc2tUeXBlKEJpZ0ludGVnZXIgbmV3RGVmYXVsdFRhc2tUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRGVmYXVsdFRhc2tUeXBlID0gZGVmYXVsdFRhc2tUeXBlOwotCQlkZWZhdWx0VGFza1R5cGUgPSBuZXdEZWZhdWx0VGFza1R5cGU7Ci0JCWJvb2xlYW4gb2xkRGVmYXVsdFRhc2tUeXBlRVNldCA9IGRlZmF1bHRUYXNrVHlwZUVTZXQ7Ci0JCWRlZmF1bHRUYXNrVHlwZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfVEFTS19UWVBFLCBvbGREZWZhdWx0VGFza1R5cGUsIGRlZmF1bHRUYXNrVHlwZSwgIW9sZERlZmF1bHRUYXNrVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldERlZmF1bHRUYXNrVHlwZSgpIHsKLQkJQmlnSW50ZWdlciBvbGREZWZhdWx0VGFza1R5cGUgPSBkZWZhdWx0VGFza1R5cGU7Ci0JCWJvb2xlYW4gb2xkRGVmYXVsdFRhc2tUeXBlRVNldCA9IGRlZmF1bHRUYXNrVHlwZUVTZXQ7Ci0JCWRlZmF1bHRUYXNrVHlwZSA9IERFRkFVTFRfVEFTS19UWVBFX0VERUZBVUxUOwotCQlkZWZhdWx0VGFza1R5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfVFlQRSwgb2xkRGVmYXVsdFRhc2tUeXBlLCBERUZBVUxUX1RBU0tfVFlQRV9FREVGQVVMVCwgb2xkRGVmYXVsdFRhc2tUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RGVmYXVsdFRhc2tUeXBlKCkgewotCQlyZXR1cm4gZGVmYXVsdFRhc2tUeXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRGaXhlZENvc3RBY2NydWFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKEJpZ0ludGVnZXIgbmV3RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwpIHsKLQkJQmlnSW50ZWdlciBvbGREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCA9IGRlZmF1bHRGaXhlZENvc3RBY2NydWFsOwotCQlkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCA9IG5ld0RlZmF1bHRGaXhlZENvc3RBY2NydWFsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMLCBvbGREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCwgZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpIHsKLQkJcmV0dXJuIGRlZmF1bHRTdGFuZGFyZFJhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZShmbG9hdCBuZXdEZWZhdWx0U3RhbmRhcmRSYXRlKSB7Ci0JCWZsb2F0IG9sZERlZmF1bHRTdGFuZGFyZFJhdGUgPSBkZWZhdWx0U3RhbmRhcmRSYXRlOwotCQlkZWZhdWx0U3RhbmRhcmRSYXRlID0gbmV3RGVmYXVsdFN0YW5kYXJkUmF0ZTsKLQkJYm9vbGVhbiBvbGREZWZhdWx0U3RhbmRhcmRSYXRlRVNldCA9IGRlZmF1bHRTdGFuZGFyZFJhdGVFU2V0OwotCQlkZWZhdWx0U3RhbmRhcmRSYXRlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9TVEFOREFSRF9SQVRFLCBvbGREZWZhdWx0U3RhbmRhcmRSYXRlLCBkZWZhdWx0U3RhbmRhcmRSYXRlLCAhb2xkRGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldERlZmF1bHRTdGFuZGFyZFJhdGUoKSB7Ci0JCWZsb2F0IG9sZERlZmF1bHRTdGFuZGFyZFJhdGUgPSBkZWZhdWx0U3RhbmRhcmRSYXRlOwotCQlib29sZWFuIG9sZERlZmF1bHRTdGFuZGFyZFJhdGVFU2V0ID0gZGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQ7Ci0JCWRlZmF1bHRTdGFuZGFyZFJhdGUgPSBERUZBVUxUX1NUQU5EQVJEX1JBVEVfRURFRkFVTFQ7Ci0JCWRlZmF1bHRTdGFuZGFyZFJhdGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1NUQU5EQVJEX1JBVEUsIG9sZERlZmF1bHRTdGFuZGFyZFJhdGUsIERFRkFVTFRfU1RBTkRBUkRfUkFURV9FREVGQVVMVCwgb2xkRGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldERlZmF1bHRTdGFuZGFyZFJhdGUoKSB7Ci0JCXJldHVybiBkZWZhdWx0U3RhbmRhcmRSYXRlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpIHsKLQkJcmV0dXJuIGRlZmF1bHRPdmVydGltZVJhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZShmbG9hdCBuZXdEZWZhdWx0T3ZlcnRpbWVSYXRlKSB7Ci0JCWZsb2F0IG9sZERlZmF1bHRPdmVydGltZVJhdGUgPSBkZWZhdWx0T3ZlcnRpbWVSYXRlOwotCQlkZWZhdWx0T3ZlcnRpbWVSYXRlID0gbmV3RGVmYXVsdE92ZXJ0aW1lUmF0ZTsKLQkJYm9vbGVhbiBvbGREZWZhdWx0T3ZlcnRpbWVSYXRlRVNldCA9IGRlZmF1bHRPdmVydGltZVJhdGVFU2V0OwotCQlkZWZhdWx0T3ZlcnRpbWVSYXRlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9PVkVSVElNRV9SQVRFLCBvbGREZWZhdWx0T3ZlcnRpbWVSYXRlLCBkZWZhdWx0T3ZlcnRpbWVSYXRlLCAhb2xkRGVmYXVsdE92ZXJ0aW1lUmF0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldERlZmF1bHRPdmVydGltZVJhdGUoKSB7Ci0JCWZsb2F0IG9sZERlZmF1bHRPdmVydGltZVJhdGUgPSBkZWZhdWx0T3ZlcnRpbWVSYXRlOwotCQlib29sZWFuIG9sZERlZmF1bHRPdmVydGltZVJhdGVFU2V0ID0gZGVmYXVsdE92ZXJ0aW1lUmF0ZUVTZXQ7Ci0JCWRlZmF1bHRPdmVydGltZVJhdGUgPSBERUZBVUxUX09WRVJUSU1FX1JBVEVfRURFRkFVTFQ7Ci0JCWRlZmF1bHRPdmVydGltZVJhdGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX09WRVJUSU1FX1JBVEUsIG9sZERlZmF1bHRPdmVydGltZVJhdGUsIERFRkFVTFRfT1ZFUlRJTUVfUkFURV9FREVGQVVMVCwgb2xkRGVmYXVsdE92ZXJ0aW1lUmF0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldERlZmF1bHRPdmVydGltZVJhdGUoKSB7Ci0JCXJldHVybiBkZWZhdWx0T3ZlcnRpbWVSYXRlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpIHsKLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgbmV3RHVyYXRpb25Gb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGREdXJhdGlvbkZvcm1hdCA9IGR1cmF0aW9uRm9ybWF0OwotCQlkdXJhdGlvbkZvcm1hdCA9IG5ld0R1cmF0aW9uRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RVUkFUSU9OX0ZPUk1BVCwgb2xkRHVyYXRpb25Gb3JtYXQsIGR1cmF0aW9uRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0V29ya0Zvcm1hdCgpIHsKLQkJcmV0dXJuIHdvcmtGb3JtYXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29ya0Zvcm1hdChCaWdJbnRlZ2VyIG5ld1dvcmtGb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGRXb3JrRm9ybWF0ID0gd29ya0Zvcm1hdDsKLQkJd29ya0Zvcm1hdCA9IG5ld1dvcmtGb3JtYXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV09SS19GT1JNQVQsIG9sZFdvcmtGb3JtYXQsIHdvcmtGb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VkaXRhYmxlQWN0dWFsQ29zdHMoKSB7Ci0JCXJldHVybiBlZGl0YWJsZUFjdHVhbENvc3RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRhYmxlQWN0dWFsQ29zdHMoYm9vbGVhbiBuZXdFZGl0YWJsZUFjdHVhbENvc3RzKSB7Ci0JCWJvb2xlYW4gb2xkRWRpdGFibGVBY3R1YWxDb3N0cyA9IGVkaXRhYmxlQWN0dWFsQ29zdHM7Ci0JCWVkaXRhYmxlQWN0dWFsQ29zdHMgPSBuZXdFZGl0YWJsZUFjdHVhbENvc3RzOwotCQlib29sZWFuIG9sZEVkaXRhYmxlQWN0dWFsQ29zdHNFU2V0ID0gZWRpdGFibGVBY3R1YWxDb3N0c0VTZXQ7Ci0JCWVkaXRhYmxlQWN0dWFsQ29zdHNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FRElUQUJMRV9BQ1RVQUxfQ09TVFMsIG9sZEVkaXRhYmxlQWN0dWFsQ29zdHMsIGVkaXRhYmxlQWN0dWFsQ29zdHMsICFvbGRFZGl0YWJsZUFjdHVhbENvc3RzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RWRpdGFibGVBY3R1YWxDb3N0cygpIHsKLQkJYm9vbGVhbiBvbGRFZGl0YWJsZUFjdHVhbENvc3RzID0gZWRpdGFibGVBY3R1YWxDb3N0czsKLQkJYm9vbGVhbiBvbGRFZGl0YWJsZUFjdHVhbENvc3RzRVNldCA9IGVkaXRhYmxlQWN0dWFsQ29zdHNFU2V0OwotCQllZGl0YWJsZUFjdHVhbENvc3RzID0gRURJVEFCTEVfQUNUVUFMX0NPU1RTX0VERUZBVUxUOwotCQllZGl0YWJsZUFjdHVhbENvc3RzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRURJVEFCTEVfQUNUVUFMX0NPU1RTLCBvbGRFZGl0YWJsZUFjdHVhbENvc3RzLCBFRElUQUJMRV9BQ1RVQUxfQ09TVFNfRURFRkFVTFQsIG9sZEVkaXRhYmxlQWN0dWFsQ29zdHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRFZGl0YWJsZUFjdHVhbENvc3RzKCkgewotCQlyZXR1cm4gZWRpdGFibGVBY3R1YWxDb3N0c0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNIb25vckNvbnN0cmFpbnRzKCkgewotCQlyZXR1cm4gaG9ub3JDb25zdHJhaW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIb25vckNvbnN0cmFpbnRzKGJvb2xlYW4gbmV3SG9ub3JDb25zdHJhaW50cykgewotCQlib29sZWFuIG9sZEhvbm9yQ29uc3RyYWludHMgPSBob25vckNvbnN0cmFpbnRzOwotCQlob25vckNvbnN0cmFpbnRzID0gbmV3SG9ub3JDb25zdHJhaW50czsKLQkJYm9vbGVhbiBvbGRIb25vckNvbnN0cmFpbnRzRVNldCA9IGhvbm9yQ29uc3RyYWludHNFU2V0OwotCQlob25vckNvbnN0cmFpbnRzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSE9OT1JfQ09OU1RSQUlOVFMsIG9sZEhvbm9yQ29uc3RyYWludHMsIGhvbm9yQ29uc3RyYWludHMsICFvbGRIb25vckNvbnN0cmFpbnRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SG9ub3JDb25zdHJhaW50cygpIHsKLQkJYm9vbGVhbiBvbGRIb25vckNvbnN0cmFpbnRzID0gaG9ub3JDb25zdHJhaW50czsKLQkJYm9vbGVhbiBvbGRIb25vckNvbnN0cmFpbnRzRVNldCA9IGhvbm9yQ29uc3RyYWludHNFU2V0OwotCQlob25vckNvbnN0cmFpbnRzID0gSE9OT1JfQ09OU1RSQUlOVFNfRURFRkFVTFQ7Ci0JCWhvbm9yQ29uc3RyYWludHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19IT05PUl9DT05TVFJBSU5UUywgb2xkSG9ub3JDb25zdHJhaW50cywgSE9OT1JfQ09OU1RSQUlOVFNfRURFRkFVTFQsIG9sZEhvbm9yQ29uc3RyYWludHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRIb25vckNvbnN0cmFpbnRzKCkgewotCQlyZXR1cm4gaG9ub3JDb25zdHJhaW50c0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RWFybmVkVmFsdWVNZXRob2QoKSB7Ci0JCXJldHVybiBlYXJuZWRWYWx1ZU1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFYXJuZWRWYWx1ZU1ldGhvZChCaWdJbnRlZ2VyIG5ld0Vhcm5lZFZhbHVlTWV0aG9kKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRWFybmVkVmFsdWVNZXRob2QgPSBlYXJuZWRWYWx1ZU1ldGhvZDsKLQkJZWFybmVkVmFsdWVNZXRob2QgPSBuZXdFYXJuZWRWYWx1ZU1ldGhvZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FQVJORURfVkFMVUVfTUVUSE9ELCBvbGRFYXJuZWRWYWx1ZU1ldGhvZCwgZWFybmVkVmFsdWVNZXRob2QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpIHsKLQkJcmV0dXJuIGluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoYm9vbGVhbiBuZXdJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkpIHsKLQkJYm9vbGVhbiBvbGRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPSBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnk7Ci0JCWluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSA9IG5ld0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeTsKLQkJYm9vbGVhbiBvbGRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnlFU2V0ID0gaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldDsKLQkJaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSU5TRVJURURfUFJPSkVDVFNfTElLRV9TVU1NQVJZLCBvbGRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnksIGluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSwgIW9sZEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpIHsKLQkJYm9vbGVhbiBvbGRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPSBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnk7Ci0JCWJvb2xlYW4gb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldCA9IGluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQ7Ci0JCWluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSA9IElOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWV9FREVGQVVMVDsKLQkJaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSU5TRVJURURfUFJPSkVDVFNfTElLRV9TVU1NQVJZLCBvbGRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnksIElOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWV9FREVGQVVMVCwgb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkgewotCQlyZXR1cm4gaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc011bHRpcGxlQ3JpdGljYWxQYXRocygpIHsKLQkJcmV0dXJuIG11bHRpcGxlQ3JpdGljYWxQYXRoczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoYm9vbGVhbiBuZXdNdWx0aXBsZUNyaXRpY2FsUGF0aHMpIHsKLQkJYm9vbGVhbiBvbGRNdWx0aXBsZUNyaXRpY2FsUGF0aHMgPSBtdWx0aXBsZUNyaXRpY2FsUGF0aHM7Ci0JCW11bHRpcGxlQ3JpdGljYWxQYXRocyA9IG5ld011bHRpcGxlQ3JpdGljYWxQYXRoczsKLQkJYm9vbGVhbiBvbGRNdWx0aXBsZUNyaXRpY2FsUGF0aHNFU2V0ID0gbXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldDsKLQkJbXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTVVMVElQTEVfQ1JJVElDQUxfUEFUSFMsIG9sZE11bHRpcGxlQ3JpdGljYWxQYXRocywgbXVsdGlwbGVDcml0aWNhbFBhdGhzLCAhb2xkTXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKCkgewotCQlib29sZWFuIG9sZE11bHRpcGxlQ3JpdGljYWxQYXRocyA9IG11bHRpcGxlQ3JpdGljYWxQYXRoczsKLQkJYm9vbGVhbiBvbGRNdWx0aXBsZUNyaXRpY2FsUGF0aHNFU2V0ID0gbXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldDsKLQkJbXVsdGlwbGVDcml0aWNhbFBhdGhzID0gTVVMVElQTEVfQ1JJVElDQUxfUEFUSFNfRURFRkFVTFQ7Ci0JCW11bHRpcGxlQ3JpdGljYWxQYXRoc0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01VTFRJUExFX0NSSVRJQ0FMX1BBVEhTLCBvbGRNdWx0aXBsZUNyaXRpY2FsUGF0aHMsIE1VTFRJUExFX0NSSVRJQ0FMX1BBVEhTX0VERUZBVUxULCBvbGRNdWx0aXBsZUNyaXRpY2FsUGF0aHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKSB7Ci0JCXJldHVybiBtdWx0aXBsZUNyaXRpY2FsUGF0aHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmV3VGFza3NFZmZvcnREcml2ZW4oKSB7Ci0JCXJldHVybiBuZXdUYXNrc0VmZm9ydERyaXZlbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZXdUYXNrc0VmZm9ydERyaXZlbihib29sZWFuIG5ld05ld1Rhc2tzRWZmb3J0RHJpdmVuKSB7Ci0JCWJvb2xlYW4gb2xkTmV3VGFza3NFZmZvcnREcml2ZW4gPSBuZXdUYXNrc0VmZm9ydERyaXZlbjsKLQkJbmV3VGFza3NFZmZvcnREcml2ZW4gPSBuZXdOZXdUYXNrc0VmZm9ydERyaXZlbjsKLQkJYm9vbGVhbiBvbGROZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQgPSBuZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQ7Ci0JCW5ld1Rhc2tzRWZmb3J0RHJpdmVuRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tTX0VGRk9SVF9EUklWRU4sIG9sZE5ld1Rhc2tzRWZmb3J0RHJpdmVuLCBuZXdUYXNrc0VmZm9ydERyaXZlbiwgIW9sZE5ld1Rhc2tzRWZmb3J0RHJpdmVuRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oKSB7Ci0JCWJvb2xlYW4gb2xkTmV3VGFza3NFZmZvcnREcml2ZW4gPSBuZXdUYXNrc0VmZm9ydERyaXZlbjsKLQkJYm9vbGVhbiBvbGROZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQgPSBuZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQ7Ci0JCW5ld1Rhc2tzRWZmb3J0RHJpdmVuID0gTkVXX1RBU0tTX0VGRk9SVF9EUklWRU5fRURFRkFVTFQ7Ci0JCW5ld1Rhc2tzRWZmb3J0RHJpdmVuRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tTX0VGRk9SVF9EUklWRU4sIG9sZE5ld1Rhc2tzRWZmb3J0RHJpdmVuLCBORVdfVEFTS1NfRUZGT1JUX0RSSVZFTl9FREVGQVVMVCwgb2xkTmV3VGFza3NFZmZvcnREcml2ZW5FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXROZXdUYXNrc0VmZm9ydERyaXZlbigpIHsKLQkJcmV0dXJuIG5ld1Rhc2tzRWZmb3J0RHJpdmVuRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05ld1Rhc2tzRXN0aW1hdGVkKCkgewotCQlyZXR1cm4gbmV3VGFza3NFc3RpbWF0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmV3VGFza3NFc3RpbWF0ZWQoYm9vbGVhbiBuZXdOZXdUYXNrc0VzdGltYXRlZCkgewotCQlib29sZWFuIG9sZE5ld1Rhc2tzRXN0aW1hdGVkID0gbmV3VGFza3NFc3RpbWF0ZWQ7Ci0JCW5ld1Rhc2tzRXN0aW1hdGVkID0gbmV3TmV3VGFza3NFc3RpbWF0ZWQ7Ci0JCWJvb2xlYW4gb2xkTmV3VGFza3NFc3RpbWF0ZWRFU2V0ID0gbmV3VGFza3NFc3RpbWF0ZWRFU2V0OwotCQluZXdUYXNrc0VzdGltYXRlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FU1RJTUFURUQsIG9sZE5ld1Rhc2tzRXN0aW1hdGVkLCBuZXdUYXNrc0VzdGltYXRlZCwgIW9sZE5ld1Rhc2tzRXN0aW1hdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TmV3VGFza3NFc3RpbWF0ZWQoKSB7Ci0JCWJvb2xlYW4gb2xkTmV3VGFza3NFc3RpbWF0ZWQgPSBuZXdUYXNrc0VzdGltYXRlZDsKLQkJYm9vbGVhbiBvbGROZXdUYXNrc0VzdGltYXRlZEVTZXQgPSBuZXdUYXNrc0VzdGltYXRlZEVTZXQ7Ci0JCW5ld1Rhc2tzRXN0aW1hdGVkID0gTkVXX1RBU0tTX0VTVElNQVRFRF9FREVGQVVMVDsKLQkJbmV3VGFza3NFc3RpbWF0ZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS1NfRVNUSU1BVEVELCBvbGROZXdUYXNrc0VzdGltYXRlZCwgTkVXX1RBU0tTX0VTVElNQVRFRF9FREVGQVVMVCwgb2xkTmV3VGFza3NFc3RpbWF0ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXROZXdUYXNrc0VzdGltYXRlZCgpIHsKLQkJcmV0dXJuIG5ld1Rhc2tzRXN0aW1hdGVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpIHsKLQkJcmV0dXJuIHNwbGl0c0luUHJvZ3Jlc3NUYXNrczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcGxpdHNJblByb2dyZXNzVGFza3MoYm9vbGVhbiBuZXdTcGxpdHNJblByb2dyZXNzVGFza3MpIHsKLQkJYm9vbGVhbiBvbGRTcGxpdHNJblByb2dyZXNzVGFza3MgPSBzcGxpdHNJblByb2dyZXNzVGFza3M7Ci0JCXNwbGl0c0luUHJvZ3Jlc3NUYXNrcyA9IG5ld1NwbGl0c0luUHJvZ3Jlc3NUYXNrczsKLQkJYm9vbGVhbiBvbGRTcGxpdHNJblByb2dyZXNzVGFza3NFU2V0ID0gc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldDsKLQkJc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BMSVRTX0lOX1BST0dSRVNTX1RBU0tTLCBvbGRTcGxpdHNJblByb2dyZXNzVGFza3MsIHNwbGl0c0luUHJvZ3Jlc3NUYXNrcywgIW9sZFNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcygpIHsKLQkJYm9vbGVhbiBvbGRTcGxpdHNJblByb2dyZXNzVGFza3MgPSBzcGxpdHNJblByb2dyZXNzVGFza3M7Ci0JCWJvb2xlYW4gb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldCA9IHNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQ7Ci0JCXNwbGl0c0luUHJvZ3Jlc3NUYXNrcyA9IFNQTElUU19JTl9QUk9HUkVTU19UQVNLU19FREVGQVVMVDsKLQkJc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BMSVRTX0lOX1BST0dSRVNTX1RBU0tTLCBvbGRTcGxpdHNJblByb2dyZXNzVGFza3MsIFNQTElUU19JTl9QUk9HUkVTU19UQVNLU19FREVGQVVMVCwgb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkgewotCQlyZXR1cm4gc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NwcmVhZEFjdHVhbENvc3QoKSB7Ci0JCXJldHVybiBzcHJlYWRBY3R1YWxDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwcmVhZEFjdHVhbENvc3QoYm9vbGVhbiBuZXdTcHJlYWRBY3R1YWxDb3N0KSB7Ci0JCWJvb2xlYW4gb2xkU3ByZWFkQWN0dWFsQ29zdCA9IHNwcmVhZEFjdHVhbENvc3Q7Ci0JCXNwcmVhZEFjdHVhbENvc3QgPSBuZXdTcHJlYWRBY3R1YWxDb3N0OwotCQlib29sZWFuIG9sZFNwcmVhZEFjdHVhbENvc3RFU2V0ID0gc3ByZWFkQWN0dWFsQ29zdEVTZXQ7Ci0JCXNwcmVhZEFjdHVhbENvc3RFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfQUNUVUFMX0NPU1QsIG9sZFNwcmVhZEFjdHVhbENvc3QsIHNwcmVhZEFjdHVhbENvc3QsICFvbGRTcHJlYWRBY3R1YWxDb3N0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0U3ByZWFkQWN0dWFsQ29zdCgpIHsKLQkJYm9vbGVhbiBvbGRTcHJlYWRBY3R1YWxDb3N0ID0gc3ByZWFkQWN0dWFsQ29zdDsKLQkJYm9vbGVhbiBvbGRTcHJlYWRBY3R1YWxDb3N0RVNldCA9IHNwcmVhZEFjdHVhbENvc3RFU2V0OwotCQlzcHJlYWRBY3R1YWxDb3N0ID0gU1BSRUFEX0FDVFVBTF9DT1NUX0VERUZBVUxUOwotCQlzcHJlYWRBY3R1YWxDb3N0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX0FDVFVBTF9DT1NULCBvbGRTcHJlYWRBY3R1YWxDb3N0LCBTUFJFQURfQUNUVUFMX0NPU1RfRURFRkFVTFQsIG9sZFNwcmVhZEFjdHVhbENvc3RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTcHJlYWRBY3R1YWxDb3N0KCkgewotCQlyZXR1cm4gc3ByZWFkQWN0dWFsQ29zdEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTcHJlYWRQZXJjZW50Q29tcGxldGUoKSB7Ci0JCXJldHVybiBzcHJlYWRQZXJjZW50Q29tcGxldGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKGJvb2xlYW4gbmV3U3ByZWFkUGVyY2VudENvbXBsZXRlKSB7Ci0JCWJvb2xlYW4gb2xkU3ByZWFkUGVyY2VudENvbXBsZXRlID0gc3ByZWFkUGVyY2VudENvbXBsZXRlOwotCQlzcHJlYWRQZXJjZW50Q29tcGxldGUgPSBuZXdTcHJlYWRQZXJjZW50Q29tcGxldGU7Ci0JCWJvb2xlYW4gb2xkU3ByZWFkUGVyY2VudENvbXBsZXRlRVNldCA9IHNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQ7Ci0JCXNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQUkVBRF9QRVJDRU5UX0NPTVBMRVRFLCBvbGRTcHJlYWRQZXJjZW50Q29tcGxldGUsIHNwcmVhZFBlcmNlbnRDb21wbGV0ZSwgIW9sZFNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpIHsKLQkJYm9vbGVhbiBvbGRTcHJlYWRQZXJjZW50Q29tcGxldGUgPSBzcHJlYWRQZXJjZW50Q29tcGxldGU7Ci0JCWJvb2xlYW4gb2xkU3ByZWFkUGVyY2VudENvbXBsZXRlRVNldCA9IHNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQ7Ci0JCXNwcmVhZFBlcmNlbnRDb21wbGV0ZSA9IFNQUkVBRF9QRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxUOwotCQlzcHJlYWRQZXJjZW50Q29tcGxldGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfUEVSQ0VOVF9DT01QTEVURSwgb2xkU3ByZWFkUGVyY2VudENvbXBsZXRlLCBTUFJFQURfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVCwgb2xkU3ByZWFkUGVyY2VudENvbXBsZXRlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCkgewotCQlyZXR1cm4gc3ByZWFkUGVyY2VudENvbXBsZXRlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Rhc2tVcGRhdGVzUmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0YXNrVXBkYXRlc1Jlc291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhc2tVcGRhdGVzUmVzb3VyY2UoYm9vbGVhbiBuZXdUYXNrVXBkYXRlc1Jlc291cmNlKSB7Ci0JCWJvb2xlYW4gb2xkVGFza1VwZGF0ZXNSZXNvdXJjZSA9IHRhc2tVcGRhdGVzUmVzb3VyY2U7Ci0JCXRhc2tVcGRhdGVzUmVzb3VyY2UgPSBuZXdUYXNrVXBkYXRlc1Jlc291cmNlOwotCQlib29sZWFuIG9sZFRhc2tVcGRhdGVzUmVzb3VyY2VFU2V0ID0gdGFza1VwZGF0ZXNSZXNvdXJjZUVTZXQ7Ci0JCXRhc2tVcGRhdGVzUmVzb3VyY2VFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLX1VQREFURVNfUkVTT1VSQ0UsIG9sZFRhc2tVcGRhdGVzUmVzb3VyY2UsIHRhc2tVcGRhdGVzUmVzb3VyY2UsICFvbGRUYXNrVXBkYXRlc1Jlc291cmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpIHsKLQkJYm9vbGVhbiBvbGRUYXNrVXBkYXRlc1Jlc291cmNlID0gdGFza1VwZGF0ZXNSZXNvdXJjZTsKLQkJYm9vbGVhbiBvbGRUYXNrVXBkYXRlc1Jlc291cmNlRVNldCA9IHRhc2tVcGRhdGVzUmVzb3VyY2VFU2V0OwotCQl0YXNrVXBkYXRlc1Jlc291cmNlID0gVEFTS19VUERBVEVTX1JFU09VUkNFX0VERUZBVUxUOwotCQl0YXNrVXBkYXRlc1Jlc291cmNlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS19VUERBVEVTX1JFU09VUkNFLCBvbGRUYXNrVXBkYXRlc1Jlc291cmNlLCBUQVNLX1VQREFURVNfUkVTT1VSQ0VfRURFRkFVTFQsIG9sZFRhc2tVcGRhdGVzUmVzb3VyY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRUYXNrVXBkYXRlc1Jlc291cmNlKCkgewotCQlyZXR1cm4gdGFza1VwZGF0ZXNSZXNvdXJjZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGaXNjYWxZZWFyU3RhcnQoKSB7Ci0JCXJldHVybiBmaXNjYWxZZWFyU3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlzY2FsWWVhclN0YXJ0KGJvb2xlYW4gbmV3RmlzY2FsWWVhclN0YXJ0KSB7Ci0JCWJvb2xlYW4gb2xkRmlzY2FsWWVhclN0YXJ0ID0gZmlzY2FsWWVhclN0YXJ0OwotCQlmaXNjYWxZZWFyU3RhcnQgPSBuZXdGaXNjYWxZZWFyU3RhcnQ7Ci0JCWJvb2xlYW4gb2xkRmlzY2FsWWVhclN0YXJ0RVNldCA9IGZpc2NhbFllYXJTdGFydEVTZXQ7Ci0JCWZpc2NhbFllYXJTdGFydEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZJU0NBTF9ZRUFSX1NUQVJULCBvbGRGaXNjYWxZZWFyU3RhcnQsIGZpc2NhbFllYXJTdGFydCwgIW9sZEZpc2NhbFllYXJTdGFydEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEZpc2NhbFllYXJTdGFydCgpIHsKLQkJYm9vbGVhbiBvbGRGaXNjYWxZZWFyU3RhcnQgPSBmaXNjYWxZZWFyU3RhcnQ7Ci0JCWJvb2xlYW4gb2xkRmlzY2FsWWVhclN0YXJ0RVNldCA9IGZpc2NhbFllYXJTdGFydEVTZXQ7Ci0JCWZpc2NhbFllYXJTdGFydCA9IEZJU0NBTF9ZRUFSX1NUQVJUX0VERUZBVUxUOwotCQlmaXNjYWxZZWFyU3RhcnRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GSVNDQUxfWUVBUl9TVEFSVCwgb2xkRmlzY2FsWWVhclN0YXJ0LCBGSVNDQUxfWUVBUl9TVEFSVF9FREVGQVVMVCwgb2xkRmlzY2FsWWVhclN0YXJ0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RmlzY2FsWWVhclN0YXJ0KCkgewotCQlyZXR1cm4gZmlzY2FsWWVhclN0YXJ0RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRXZWVrU3RhcnREYXkoKSB7Ci0JCXJldHVybiB3ZWVrU3RhcnREYXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2Vla1N0YXJ0RGF5KEJpZ0ludGVnZXIgbmV3V2Vla1N0YXJ0RGF5KSB7Ci0JCUJpZ0ludGVnZXIgb2xkV2Vla1N0YXJ0RGF5ID0gd2Vla1N0YXJ0RGF5OwotCQl3ZWVrU3RhcnREYXkgPSBuZXdXZWVrU3RhcnREYXk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV0VFS19TVEFSVF9EQVksIG9sZFdlZWtTdGFydERheSwgd2Vla1N0YXJ0RGF5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKSB7Ci0JCXJldHVybiBtb3ZlQ29tcGxldGVkRW5kc0JhY2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKGJvb2xlYW4gbmV3TW92ZUNvbXBsZXRlZEVuZHNCYWNrKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZUNvbXBsZXRlZEVuZHNCYWNrID0gbW92ZUNvbXBsZXRlZEVuZHNCYWNrOwotCQltb3ZlQ29tcGxldGVkRW5kc0JhY2sgPSBuZXdNb3ZlQ29tcGxldGVkRW5kc0JhY2s7Ci0JCWJvb2xlYW4gb2xkTW92ZUNvbXBsZXRlZEVuZHNCYWNrRVNldCA9IG1vdmVDb21wbGV0ZWRFbmRzQmFja0VTZXQ7Ci0JCW1vdmVDb21wbGV0ZWRFbmRzQmFja0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfQkFDSywgb2xkTW92ZUNvbXBsZXRlZEVuZHNCYWNrLCBtb3ZlQ29tcGxldGVkRW5kc0JhY2ssICFvbGRNb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZUNvbXBsZXRlZEVuZHNCYWNrID0gbW92ZUNvbXBsZXRlZEVuZHNCYWNrOwotCQlib29sZWFuIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFja0VTZXQgPSBtb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0OwotCQltb3ZlQ29tcGxldGVkRW5kc0JhY2sgPSBNT1ZFX0NPTVBMRVRFRF9FTkRTX0JBQ0tfRURFRkFVTFQ7Ci0JCW1vdmVDb21wbGV0ZWRFbmRzQmFja0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfQkFDSywgb2xkTW92ZUNvbXBsZXRlZEVuZHNCYWNrLCBNT1ZFX0NPTVBMRVRFRF9FTkRTX0JBQ0tfRURFRkFVTFQsIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFja0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpIHsKLQkJcmV0dXJuIG1vdmVDb21wbGV0ZWRFbmRzQmFja0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpIHsKLQkJcmV0dXJuIG1vdmVSZW1haW5pbmdTdGFydHNCYWNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKGJvb2xlYW4gbmV3TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2spIHsKLQkJYm9vbGVhbiBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayA9IG1vdmVSZW1haW5pbmdTdGFydHNCYWNrOwotCQltb3ZlUmVtYWluaW5nU3RhcnRzQmFjayA9IG5ld01vdmVSZW1haW5pbmdTdGFydHNCYWNrOwotCQlib29sZWFuIG9sZE1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldCA9IG1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldDsKLQkJbW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2tFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDSywgb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2ssIG1vdmVSZW1haW5pbmdTdGFydHNCYWNrLCAhb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2tFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpIHsKLQkJYm9vbGVhbiBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayA9IG1vdmVSZW1haW5pbmdTdGFydHNCYWNrOwotCQlib29sZWFuIG9sZE1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldCA9IG1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldDsKLQkJbW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2sgPSBNT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDS19FREVGQVVMVDsKLQkJbW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2tFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDSywgb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2ssIE1PVkVfUkVNQUlOSU5HX1NUQVJUU19CQUNLX0VERUZBVUxULCBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzQmFja0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkgewotCQlyZXR1cm4gbW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2tFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKSB7Ci0JCXJldHVybiBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZChib29sZWFuIG5ld01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPSBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZDsKLQkJbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPSBuZXdNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZDsKLQkJYm9vbGVhbiBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQgPSBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQ7Ci0JCW1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkQsIG9sZE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkLCBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCwgIW9sZE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPSBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZDsKLQkJYm9vbGVhbiBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQgPSBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQ7Ci0JCW1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkID0gTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkRfRURFRkFVTFQ7Ci0JCW1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkQsIG9sZE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkLCBNT1ZFX1JFTUFJTklOR19TVEFSVFNfRk9SV0FSRF9FREVGQVVMVCwgb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpIHsKLQkJcmV0dXJuIG1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpIHsKLQkJcmV0dXJuIG1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoYm9vbGVhbiBuZXdNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQpIHsKLQkJYm9vbGVhbiBvbGRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPSBtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQ7Ci0JCW1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCA9IG5ld01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZDsKLQkJYm9vbGVhbiBvbGRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmRFU2V0ID0gbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkRVNldDsKLQkJbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19GT1JXQVJELCBvbGRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQsIG1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCwgIW9sZE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpIHsKLQkJYm9vbGVhbiBvbGRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPSBtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQ7Ci0JCWJvb2xlYW4gb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkRVNldCA9IG1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQ7Ci0JCW1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCA9IE1PVkVfQ09NUExFVEVEX0VORFNfRk9SV0FSRF9FREVGQVVMVDsKLQkJbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19GT1JXQVJELCBvbGRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQsIE1PVkVfQ09NUExFVEVEX0VORFNfRk9SV0FSRF9FREVGQVVMVCwgb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkgewotCQlyZXR1cm4gbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlKCkgewotCQlyZXR1cm4gYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlKEJpZ0ludGVnZXIgbmV3QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSkgewotCQlCaWdJbnRlZ2VyIG9sZEJhc2VsaW5lRm9yRWFybmVkVmFsdWUgPSBiYXNlbGluZUZvckVhcm5lZFZhbHVlOwotCQliYXNlbGluZUZvckVhcm5lZFZhbHVlID0gbmV3QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19CQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFLCBvbGRCYXNlbGluZUZvckVhcm5lZFZhbHVlLCBiYXNlbGluZUZvckVhcm5lZFZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKSB7Ci0JCXJldHVybiBhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKGJvb2xlYW4gbmV3QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKSB7Ci0JCWJvb2xlYW4gb2xkQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzID0gYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzOwotCQlhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPSBuZXdBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3M7Ci0JCWJvb2xlYW4gb2xkQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzRVNldCA9IGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQ7Ci0JCWF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9fQUREX05FV19SRVNPVVJDRVNfQU5EX1RBU0tTLCBvbGRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MsIGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcywgIW9sZEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpIHsKLQkJYm9vbGVhbiBvbGRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPSBhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3M7Ci0JCWJvb2xlYW4gb2xkQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzRVNldCA9IGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQ7Ci0JCWF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyA9IEFVVE9fQUREX05FV19SRVNPVVJDRVNfQU5EX1RBU0tTX0VERUZBVUxUOwotCQlhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3NFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRPX0FERF9ORVdfUkVTT1VSQ0VTX0FORF9UQVNLUywgb2xkQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzLCBBVVRPX0FERF9ORVdfUkVTT1VSQ0VTX0FORF9UQVNLU19FREVGQVVMVCwgb2xkQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkgewotCQlyZXR1cm4gYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFN0YXR1c0RhdGUoKSB7Ci0JCXJldHVybiBzdGF0dXNEYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXR1c0RhdGUoT2JqZWN0IG5ld1N0YXR1c0RhdGUpIHsKLQkJT2JqZWN0IG9sZFN0YXR1c0RhdGUgPSBzdGF0dXNEYXRlOwotCQlzdGF0dXNEYXRlID0gbmV3U3RhdHVzRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVEFUVVNfREFURSwgb2xkU3RhdHVzRGF0ZSwgc3RhdHVzRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3VycmVudERhdGUoKSB7Ci0JCXJldHVybiBjdXJyZW50RGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50RGF0ZShPYmplY3QgbmV3Q3VycmVudERhdGUpIHsKLQkJT2JqZWN0IG9sZEN1cnJlbnREYXRlID0gY3VycmVudERhdGU7Ci0JCWN1cnJlbnREYXRlID0gbmV3Q3VycmVudERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOVF9EQVRFLCBvbGRDdXJyZW50RGF0ZSwgY3VycmVudERhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKSB7Ci0JCXJldHVybiBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoYm9vbGVhbiBuZXdNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKSB7Ci0JCWJvb2xlYW4gb2xkTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCA9IG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkw7Ci0JCW1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPSBuZXdNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMOwotCQlib29sZWFuIG9sZE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0ID0gbWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTEVTZXQ7Ci0JCW1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMLCBvbGRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMLCBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMLCAhb2xkTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKSB7Ci0JCWJvb2xlYW4gb2xkTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCA9IG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkw7Ci0JCWJvb2xlYW4gb2xkTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTEVTZXQgPSBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMRVNldDsKLQkJbWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCA9IE1JQ1JPU09GVF9QUk9KRUNUX1NFUlZFUl9VUkxfRURFRkFVTFQ7Ci0JCW1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMLCBvbGRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMLCBNSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMX0VERUZBVUxULCBvbGRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpIHsKLQkJcmV0dXJuIG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXV0b2xpbmsoKSB7Ci0JCXJldHVybiBhdXRvbGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRvbGluayhib29sZWFuIG5ld0F1dG9saW5rKSB7Ci0JCWJvb2xlYW4gb2xkQXV0b2xpbmsgPSBhdXRvbGluazsKLQkJYXV0b2xpbmsgPSBuZXdBdXRvbGluazsKLQkJYm9vbGVhbiBvbGRBdXRvbGlua0VTZXQgPSBhdXRvbGlua0VTZXQ7Ci0JCWF1dG9saW5rRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUT0xJTkssIG9sZEF1dG9saW5rLCBhdXRvbGluaywgIW9sZEF1dG9saW5rRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QXV0b2xpbmsoKSB7Ci0JCWJvb2xlYW4gb2xkQXV0b2xpbmsgPSBhdXRvbGluazsKLQkJYm9vbGVhbiBvbGRBdXRvbGlua0VTZXQgPSBhdXRvbGlua0VTZXQ7Ci0JCWF1dG9saW5rID0gQVVUT0xJTktfRURFRkFVTFQ7Ci0JCWF1dG9saW5rRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUT0xJTkssIG9sZEF1dG9saW5rLCBBVVRPTElOS19FREVGQVVMVCwgb2xkQXV0b2xpbmtFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRBdXRvbGluaygpIHsKLQkJcmV0dXJuIGF1dG9saW5rRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXROZXdUYXNrU3RhcnREYXRlKCkgewotCQlyZXR1cm4gbmV3VGFza1N0YXJ0RGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZXdUYXNrU3RhcnREYXRlKEJpZ0ludGVnZXIgbmV3TmV3VGFza1N0YXJ0RGF0ZSkgewotCQlCaWdJbnRlZ2VyIG9sZE5ld1Rhc2tTdGFydERhdGUgPSBuZXdUYXNrU3RhcnREYXRlOwotCQluZXdUYXNrU3RhcnREYXRlID0gbmV3TmV3VGFza1N0YXJ0RGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS19TVEFSVF9EQVRFLCBvbGROZXdUYXNrU3RhcnREYXRlLCBuZXdUYXNrU3RhcnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRUYXNrRVZNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFRhc2tFVk1ldGhvZChCaWdJbnRlZ2VyIG5ld0RlZmF1bHRUYXNrRVZNZXRob2QpIHsKLQkJQmlnSW50ZWdlciBvbGREZWZhdWx0VGFza0VWTWV0aG9kID0gZGVmYXVsdFRhc2tFVk1ldGhvZDsKLQkJZGVmYXVsdFRhc2tFVk1ldGhvZCA9IG5ld0RlZmF1bHRUYXNrRVZNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9UQVNLX0VWX01FVEhPRCwgb2xkRGVmYXVsdFRhc2tFVk1ldGhvZCwgZGVmYXVsdFRhc2tFVk1ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKSB7Ci0JCXJldHVybiBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZChib29sZWFuIG5ld1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKSB7Ci0JCWJvb2xlYW4gb2xkUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPSBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZDsKLQkJcHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPSBuZXdQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZDsKLQkJYm9vbGVhbiBvbGRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQgPSBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQ7Ci0JCXByb2plY3RFeHRlcm5hbGx5RWRpdGVkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUFJPSkVDVF9FWFRFUk5BTExZX0VESVRFRCwgb2xkUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQsIHByb2plY3RFeHRlcm5hbGx5RWRpdGVkLCAhb2xkUHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpIHsKLQkJYm9vbGVhbiBvbGRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCA9IHByb2plY3RFeHRlcm5hbGx5RWRpdGVkOwotCQlib29sZWFuIG9sZFByb2plY3RFeHRlcm5hbGx5RWRpdGVkRVNldCA9IHByb2plY3RFeHRlcm5hbGx5RWRpdGVkRVNldDsKLQkJcHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPSBQUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEX0VERUZBVUxUOwotCQlwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1BST0pFQ1RfRVhURVJOQUxMWV9FRElURUQsIG9sZFByb2plY3RFeHRlcm5hbGx5RWRpdGVkLCBQUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEX0VERUZBVUxULCBvbGRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkgewotCQlyZXR1cm4gcHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKSB7Ci0JCXJldHVybiBleHRlbmRlZENyZWF0aW9uRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlbmRlZENyZWF0aW9uRGF0ZShPYmplY3QgbmV3RXh0ZW5kZWRDcmVhdGlvbkRhdGUpIHsKLQkJT2JqZWN0IG9sZEV4dGVuZGVkQ3JlYXRpb25EYXRlID0gZXh0ZW5kZWRDcmVhdGlvbkRhdGU7Ci0JCWV4dGVuZGVkQ3JlYXRpb25EYXRlID0gbmV3RXh0ZW5kZWRDcmVhdGlvbkRhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQ1JFQVRJT05fREFURSwgb2xkRXh0ZW5kZWRDcmVhdGlvbkRhdGUsIGV4dGVuZGVkQ3JlYXRpb25EYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBY3R1YWxzSW5TeW5jKCkgewotCQlyZXR1cm4gYWN0dWFsc0luU3luYzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxzSW5TeW5jKGJvb2xlYW4gbmV3QWN0dWFsc0luU3luYykgewotCQlib29sZWFuIG9sZEFjdHVhbHNJblN5bmMgPSBhY3R1YWxzSW5TeW5jOwotCQlhY3R1YWxzSW5TeW5jID0gbmV3QWN0dWFsc0luU3luYzsKLQkJYm9vbGVhbiBvbGRBY3R1YWxzSW5TeW5jRVNldCA9IGFjdHVhbHNJblN5bmNFU2V0OwotCQlhY3R1YWxzSW5TeW5jRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQUNUVUFMU19JTl9TWU5DLCBvbGRBY3R1YWxzSW5TeW5jLCBhY3R1YWxzSW5TeW5jLCAhb2xkQWN0dWFsc0luU3luY0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEFjdHVhbHNJblN5bmMoKSB7Ci0JCWJvb2xlYW4gb2xkQWN0dWFsc0luU3luYyA9IGFjdHVhbHNJblN5bmM7Ci0JCWJvb2xlYW4gb2xkQWN0dWFsc0luU3luY0VTZXQgPSBhY3R1YWxzSW5TeW5jRVNldDsKLQkJYWN0dWFsc0luU3luYyA9IEFDVFVBTFNfSU5fU1lOQ19FREVGQVVMVDsKLQkJYWN0dWFsc0luU3luY0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FDVFVBTFNfSU5fU1lOQywgb2xkQWN0dWFsc0luU3luYywgQUNUVUFMU19JTl9TWU5DX0VERUZBVUxULCBvbGRBY3R1YWxzSW5TeW5jRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QWN0dWFsc0luU3luYygpIHsKLQkJcmV0dXJuIGFjdHVhbHNJblN5bmNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVtb3ZlRmlsZVByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiByZW1vdmVGaWxlUHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1vdmVGaWxlUHJvcGVydGllcyhib29sZWFuIG5ld1JlbW92ZUZpbGVQcm9wZXJ0aWVzKSB7Ci0JCWJvb2xlYW4gb2xkUmVtb3ZlRmlsZVByb3BlcnRpZXMgPSByZW1vdmVGaWxlUHJvcGVydGllczsKLQkJcmVtb3ZlRmlsZVByb3BlcnRpZXMgPSBuZXdSZW1vdmVGaWxlUHJvcGVydGllczsKLQkJYm9vbGVhbiBvbGRSZW1vdmVGaWxlUHJvcGVydGllc0VTZXQgPSByZW1vdmVGaWxlUHJvcGVydGllc0VTZXQ7Ci0JCXJlbW92ZUZpbGVQcm9wZXJ0aWVzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVNT1ZFX0ZJTEVfUFJPUEVSVElFUywgb2xkUmVtb3ZlRmlsZVByb3BlcnRpZXMsIHJlbW92ZUZpbGVQcm9wZXJ0aWVzLCAhb2xkUmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRSZW1vdmVGaWxlUHJvcGVydGllcygpIHsKLQkJYm9vbGVhbiBvbGRSZW1vdmVGaWxlUHJvcGVydGllcyA9IHJlbW92ZUZpbGVQcm9wZXJ0aWVzOwotCQlib29sZWFuIG9sZFJlbW92ZUZpbGVQcm9wZXJ0aWVzRVNldCA9IHJlbW92ZUZpbGVQcm9wZXJ0aWVzRVNldDsKLQkJcmVtb3ZlRmlsZVByb3BlcnRpZXMgPSBSRU1PVkVfRklMRV9QUk9QRVJUSUVTX0VERUZBVUxUOwotCQlyZW1vdmVGaWxlUHJvcGVydGllc0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFTU9WRV9GSUxFX1BST1BFUlRJRVMsIG9sZFJlbW92ZUZpbGVQcm9wZXJ0aWVzLCBSRU1PVkVfRklMRV9QUk9QRVJUSUVTX0VERUZBVUxULCBvbGRSZW1vdmVGaWxlUHJvcGVydGllc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gcmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRtaW5Qcm9qZWN0KCkgewotCQlyZXR1cm4gYWRtaW5Qcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkbWluUHJvamVjdChib29sZWFuIG5ld0FkbWluUHJvamVjdCkgewotCQlib29sZWFuIG9sZEFkbWluUHJvamVjdCA9IGFkbWluUHJvamVjdDsKLQkJYWRtaW5Qcm9qZWN0ID0gbmV3QWRtaW5Qcm9qZWN0OwotCQlib29sZWFuIG9sZEFkbWluUHJvamVjdEVTZXQgPSBhZG1pblByb2plY3RFU2V0OwotCQlhZG1pblByb2plY3RFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BRE1JTl9QUk9KRUNULCBvbGRBZG1pblByb2plY3QsIGFkbWluUHJvamVjdCwgIW9sZEFkbWluUHJvamVjdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEFkbWluUHJvamVjdCgpIHsKLQkJYm9vbGVhbiBvbGRBZG1pblByb2plY3QgPSBhZG1pblByb2plY3Q7Ci0JCWJvb2xlYW4gb2xkQWRtaW5Qcm9qZWN0RVNldCA9IGFkbWluUHJvamVjdEVTZXQ7Ci0JCWFkbWluUHJvamVjdCA9IEFETUlOX1BST0pFQ1RfRURFRkFVTFQ7Ci0JCWFkbWluUHJvamVjdEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FETUlOX1BST0pFQ1QsIG9sZEFkbWluUHJvamVjdCwgQURNSU5fUFJPSkVDVF9FREVGQVVMVCwgb2xkQWRtaW5Qcm9qZWN0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QWRtaW5Qcm9qZWN0KCkgewotCQlyZXR1cm4gYWRtaW5Qcm9qZWN0RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3V0bGluZUNvZGVzIGdldE91dGxpbmVDb2RlcygpIHsKLQkJcmV0dXJuIG91dGxpbmVDb2RlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRPdXRsaW5lQ29kZXMoT3V0bGluZUNvZGVzIG5ld091dGxpbmVDb2RlcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlPdXRsaW5lQ29kZXMgb2xkT3V0bGluZUNvZGVzID0gb3V0bGluZUNvZGVzOwotCQlvdXRsaW5lQ29kZXMgPSBuZXdPdXRsaW5lQ29kZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fT1VUTElORV9DT0RFUywgb2xkT3V0bGluZUNvZGVzLCBuZXdPdXRsaW5lQ29kZXMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dGxpbmVDb2RlcyhPdXRsaW5lQ29kZXMgbmV3T3V0bGluZUNvZGVzKSB7Ci0JCWlmIChuZXdPdXRsaW5lQ29kZXMgIT0gb3V0bGluZUNvZGVzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChvdXRsaW5lQ29kZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpb3V0bGluZUNvZGVzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19PVVRMSU5FX0NPREVTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdPdXRsaW5lQ29kZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3T3V0bGluZUNvZGVzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19PVVRMSU5FX0NPREVTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE91dGxpbmVDb2RlcyhuZXdPdXRsaW5lQ29kZXMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19PVVRMSU5FX0NPREVTLCBuZXdPdXRsaW5lQ29kZXMsIG5ld091dGxpbmVDb2RlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXQlNNYXNrcyBnZXRXQlNNYXNrcygpIHsKLQkJcmV0dXJuIHdCU01hc2tzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFdCU01hc2tzKFdCU01hc2tzIG5ld1dCU01hc2tzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVdCU01hc2tzIG9sZFdCU01hc2tzID0gd0JTTWFza3M7Ci0JCXdCU01hc2tzID0gbmV3V0JTTWFza3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV0JTX01BU0tTLCBvbGRXQlNNYXNrcywgbmV3V0JTTWFza3MpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdCU01hc2tzKFdCU01hc2tzIG5ld1dCU01hc2tzKSB7Ci0JCWlmIChuZXdXQlNNYXNrcyAhPSB3QlNNYXNrcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAod0JTTWFza3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpd0JTTWFza3MpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dCU19NQVNLUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3V0JTTWFza3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3V0JTTWFza3MpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dCU19NQVNLUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRXQlNNYXNrcyhuZXdXQlNNYXNrcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dCU19NQVNLUywgbmV3V0JTTWFza3MsIG5ld1dCU01hc2tzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4dGVuZGVkQXR0cmlidXRlcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKEV4dGVuZGVkQXR0cmlidXRlcyBuZXdFeHRlbmRlZEF0dHJpYnV0ZXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRXh0ZW5kZWRBdHRyaWJ1dGVzIG9sZEV4dGVuZGVkQXR0cmlidXRlcyA9IGV4dGVuZGVkQXR0cmlidXRlczsKLQkJZXh0ZW5kZWRBdHRyaWJ1dGVzID0gbmV3RXh0ZW5kZWRBdHRyaWJ1dGVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVMsIG9sZEV4dGVuZGVkQXR0cmlidXRlcywgbmV3RXh0ZW5kZWRBdHRyaWJ1dGVzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlbmRlZEF0dHJpYnV0ZXMoRXh0ZW5kZWRBdHRyaWJ1dGVzIG5ld0V4dGVuZGVkQXR0cmlidXRlcykgewotCQlpZiAobmV3RXh0ZW5kZWRBdHRyaWJ1dGVzICE9IGV4dGVuZGVkQXR0cmlidXRlcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZXh0ZW5kZWRBdHRyaWJ1dGVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWV4dGVuZGVkQXR0cmlidXRlcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQVRUUklCVVRFUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3RXh0ZW5kZWRBdHRyaWJ1dGVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0V4dGVuZGVkQXR0cmlidXRlcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQVRUUklCVVRFUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFeHRlbmRlZEF0dHJpYnV0ZXMobmV3RXh0ZW5kZWRBdHRyaWJ1dGVzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQVRUUklCVVRFUywgbmV3RXh0ZW5kZWRBdHRyaWJ1dGVzLCBuZXdFeHRlbmRlZEF0dHJpYnV0ZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ2FsZW5kYXJzIGdldENhbGVuZGFycygpIHsKLQkJcmV0dXJuIGNhbGVuZGFyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDYWxlbmRhcnMoQ2FsZW5kYXJzIG5ld0NhbGVuZGFycywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlDYWxlbmRhcnMgb2xkQ2FsZW5kYXJzID0gY2FsZW5kYXJzOwotCQljYWxlbmRhcnMgPSBuZXdDYWxlbmRhcnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJTLCBvbGRDYWxlbmRhcnMsIG5ld0NhbGVuZGFycyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FsZW5kYXJzKENhbGVuZGFycyBuZXdDYWxlbmRhcnMpIHsKLQkJaWYgKG5ld0NhbGVuZGFycyAhPSBjYWxlbmRhcnMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNhbGVuZGFycyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljYWxlbmRhcnMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q2FsZW5kYXJzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NhbGVuZGFycykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENhbGVuZGFycyhuZXdDYWxlbmRhcnMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUlMsIG5ld0NhbGVuZGFycywgbmV3Q2FsZW5kYXJzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tzIGdldFRhc2tzKCkgewotCQlyZXR1cm4gdGFza3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VGFza3MoVGFza3MgbmV3VGFza3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJVGFza3Mgb2xkVGFza3MgPSB0YXNrczsKLQkJdGFza3MgPSBuZXdUYXNrczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLUywgb2xkVGFza3MsIG5ld1Rhc2tzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXNrcyhUYXNrcyBuZXdUYXNrcykgewotCQlpZiAobmV3VGFza3MgIT0gdGFza3MpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHRhc2tzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXRhc2tzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VGFza3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VGFza3MpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFRhc2tzKG5ld1Rhc2tzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS1MsIG5ld1Rhc2tzLCBuZXdUYXNrcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZXMgZ2V0UmVzb3VyY2VzKCkgewotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJlc291cmNlcyhSZXNvdXJjZXMgbmV3UmVzb3VyY2VzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVJlc291cmNlcyBvbGRSZXNvdXJjZXMgPSByZXNvdXJjZXM7Ci0JCXJlc291cmNlcyA9IG5ld1Jlc291cmNlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRVNPVVJDRVMsIG9sZFJlc291cmNlcywgbmV3UmVzb3VyY2VzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZXMoUmVzb3VyY2VzIG5ld1Jlc291cmNlcykgewotCQlpZiAobmV3UmVzb3VyY2VzICE9IHJlc291cmNlcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmVzb3VyY2VzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJlc291cmNlcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSZXNvdXJjZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmVzb3VyY2VzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRVNPVVJDRVMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmVzb3VyY2VzKG5ld1Jlc291cmNlcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFU09VUkNFUywgbmV3UmVzb3VyY2VzLCBuZXdSZXNvdXJjZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXNzaWdubWVudHMgZ2V0QXNzaWdubWVudHMoKSB7Ci0JCXJldHVybiBhc3NpZ25tZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBc3NpZ25tZW50cyhBc3NpZ25tZW50cyBuZXdBc3NpZ25tZW50cywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlBc3NpZ25tZW50cyBvbGRBc3NpZ25tZW50cyA9IGFzc2lnbm1lbnRzOwotCQlhc3NpZ25tZW50cyA9IG5ld0Fzc2lnbm1lbnRzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FTU0lHTk1FTlRTLCBvbGRBc3NpZ25tZW50cywgbmV3QXNzaWdubWVudHMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFzc2lnbm1lbnRzKEFzc2lnbm1lbnRzIG5ld0Fzc2lnbm1lbnRzKSB7Ci0JCWlmIChuZXdBc3NpZ25tZW50cyAhPSBhc3NpZ25tZW50cykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYXNzaWdubWVudHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYXNzaWdubWVudHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FTU0lHTk1FTlRTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBc3NpZ25tZW50cyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBc3NpZ25tZW50cykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVNTSUdOTUVOVFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QXNzaWdubWVudHMobmV3QXNzaWdubWVudHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BU1NJR05NRU5UUywgbmV3QXNzaWdubWVudHMsIG5ld0Fzc2lnbm1lbnRzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX09VVExJTkVfQ09ERVM6Ci0JCQkJCXJldHVybiBiYXNpY1NldE91dGxpbmVDb2RlcyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV0JTX01BU0tTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRXQlNNYXNrcyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQVRUUklCVVRFUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUlM6Ci0JCQkJCXJldHVybiBiYXNpY1NldENhbGVuZGFycyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS1M6Ci0JCQkJCXJldHVybiBiYXNpY1NldFRhc2tzKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRVNPVVJDRVM6Ci0JCQkJCXJldHVybiBiYXNpY1NldFJlc291cmNlcyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVNTSUdOTUVOVFM6Ci0JCQkJCXJldHVybiBiYXNpY1NldEFzc2lnbm1lbnRzKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RJVExFOgotCQkJCXJldHVybiBnZXRUaXRsZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NVQkpFQ1Q6Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQVRFR09SWToKLQkJCQlyZXR1cm4gZ2V0Q2F0ZWdvcnkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DT01QQU5ZOgotCQkJCXJldHVybiBnZXRDb21wYW55KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUFOQUdFUjoKLQkJCQlyZXR1cm4gZ2V0TWFuYWdlcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVEhPUjoKLQkJCQlyZXR1cm4gZ2V0QXV0aG9yKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1JFQVRJT05fREFURToKLQkJCQlyZXR1cm4gZ2V0Q3JlYXRpb25EYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVWSVNJT046Ci0JCQkJcmV0dXJuIGdldFJldmlzaW9uKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTEFTVF9TQVZFRDoKLQkJCQlyZXR1cm4gZ2V0TGFzdFNhdmVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU0NIRURVTEVfRlJPTV9TVEFSVDoKLQkJCQlyZXR1cm4gaXNTY2hlZHVsZUZyb21TdGFydCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVEFSVF9EQVRFOgotCQkJCXJldHVybiBnZXRTdGFydERhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GSU5JU0hfREFURToKLQkJCQlyZXR1cm4gZ2V0RmluaXNoRGF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZZU1RBUlRfREFURToKLQkJCQlyZXR1cm4gZ2V0RllTdGFydERhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DUklUSUNBTF9TTEFDS19MSU1JVDoKLQkJCQlyZXR1cm4gZ2V0Q3JpdGljYWxTbGFja0xpbWl0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfRElHSVRTOgotCQkJCXJldHVybiBnZXRDdXJyZW5jeURpZ2l0cygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX1NZTUJPTDoKLQkJCQlyZXR1cm4gZ2V0Q3VycmVuY3lTeW1ib2woKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9TWU1CT0xfUE9TSVRJT046Ci0JCQkJcmV0dXJuIGdldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUl9VSUQ6Ci0JCQkJcmV0dXJuIGdldENhbGVuZGFyVUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9TVEFSVF9USU1FOgotCQkJCXJldHVybiBnZXREZWZhdWx0U3RhcnRUaW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9GSU5JU0hfVElNRToKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9EQVk6Ci0JCQkJcmV0dXJuIGdldE1pbnV0ZXNQZXJEYXkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9XRUVLOgotCQkJCXJldHVybiBnZXRNaW51dGVzUGVyV2VlaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RBWVNfUEVSX01PTlRIOgotCQkJCXJldHVybiBnZXREYXlzUGVyTW9udGgoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFRhc2tUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUw6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9TVEFOREFSRF9SQVRFOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX09WRVJUSU1FX1JBVEU6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XT1JLX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0V29ya0Zvcm1hdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VESVRBQkxFX0FDVFVBTF9DT1NUUzoKLQkJCQlyZXR1cm4gaXNFZGl0YWJsZUFjdHVhbENvc3RzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0hPTk9SX0NPTlNUUkFJTlRTOgotCQkJCXJldHVybiBpc0hvbm9yQ29uc3RyYWludHMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRUFSTkVEX1ZBTFVFX01FVEhPRDoKLQkJCQlyZXR1cm4gZ2V0RWFybmVkVmFsdWVNZXRob2QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19JTlNFUlRFRF9QUk9KRUNUU19MSUtFX1NVTU1BUlk6Ci0JCQkJcmV0dXJuIGlzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01VTFRJUExFX0NSSVRJQ0FMX1BBVEhTOgotCQkJCXJldHVybiBpc011bHRpcGxlQ3JpdGljYWxQYXRocygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS1NfRUZGT1JUX0RSSVZFTjoKLQkJCQlyZXR1cm4gaXNOZXdUYXNrc0VmZm9ydERyaXZlbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS1NfRVNUSU1BVEVEOgotCQkJCXJldHVybiBpc05ld1Rhc2tzRXN0aW1hdGVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQTElUU19JTl9QUk9HUkVTU19UQVNLUzoKLQkJCQlyZXR1cm4gaXNTcGxpdHNJblByb2dyZXNzVGFza3MoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBpc1NwcmVhZEFjdHVhbENvc3QoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX1BFUkNFTlRfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIGlzU3ByZWFkUGVyY2VudENvbXBsZXRlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tfVVBEQVRFU19SRVNPVVJDRToKLQkJCQlyZXR1cm4gaXNUYXNrVXBkYXRlc1Jlc291cmNlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZJU0NBTF9ZRUFSX1NUQVJUOgotCQkJCXJldHVybiBpc0Zpc2NhbFllYXJTdGFydCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XRUVLX1NUQVJUX0RBWToKLQkJCQlyZXR1cm4gZ2V0V2Vla1N0YXJ0RGF5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19CQUNLOgotCQkJCXJldHVybiBpc01vdmVDb21wbGV0ZWRFbmRzQmFjaygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDSzoKLQkJCQlyZXR1cm4gaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfRk9SV0FSRDoKLQkJCQlyZXR1cm4gaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0ZPUldBUkQ6Ci0JCQkJcmV0dXJuIGlzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0JBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUU6Ci0JCQkJcmV0dXJuIGdldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRPX0FERF9ORVdfUkVTT1VSQ0VTX0FORF9UQVNLUzoKLQkJCQlyZXR1cm4gaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBVFVTX0RBVEU6Ci0JCQkJcmV0dXJuIGdldFN0YXR1c0RhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5UX0RBVEU6Ci0JCQkJcmV0dXJuIGdldEN1cnJlbnREYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlDUk9TT0ZUX1BST0pFQ1RfU0VSVkVSX1VSTDoKLQkJCQlyZXR1cm4gaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9MSU5LOgotCQkJCXJldHVybiBpc0F1dG9saW5rKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLX1NUQVJUX0RBVEU6Ci0JCQkJcmV0dXJuIGdldE5ld1Rhc2tTdGFydERhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfRVZfTUVUSE9EOgotCQkJCXJldHVybiBnZXREZWZhdWx0VGFza0VWTWV0aG9kKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUFJPSkVDVF9FWFRFUk5BTExZX0VESVRFRDoKLQkJCQlyZXR1cm4gaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FWFRFTkRFRF9DUkVBVElPTl9EQVRFOgotCQkJCXJldHVybiBnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FDVFVBTFNfSU5fU1lOQzoKLQkJCQlyZXR1cm4gaXNBY3R1YWxzSW5TeW5jKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFTU9WRV9GSUxFX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGlzUmVtb3ZlRmlsZVByb3BlcnRpZXMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQURNSU5fUFJPSkVDVDoKLQkJCQlyZXR1cm4gaXNBZG1pblByb2plY3QoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fT1VUTElORV9DT0RFUzoKLQkJCQlyZXR1cm4gZ2V0T3V0bGluZUNvZGVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV0JTX01BU0tTOgotCQkJCXJldHVybiBnZXRXQlNNYXNrcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGdldEV4dGVuZGVkQXR0cmlidXRlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSUzoKLQkJCQlyZXR1cm4gZ2V0Q2FsZW5kYXJzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS1M6Ci0JCQkJcmV0dXJuIGdldFRhc2tzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BU1NJR05NRU5UUzoKLQkJCQlyZXR1cm4gZ2V0QXNzaWdubWVudHMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVUlEOgotCQkJCXNldFVJRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19USVRMRToKLQkJCQlzZXRUaXRsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1VCSkVDVDoKLQkJCQlzZXRTdWJqZWN0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQVRFR09SWToKLQkJCQlzZXRDYXRlZ29yeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ09NUEFOWToKLQkJCQlzZXRDb21wYW55KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NQU5BR0VSOgotCQkJCXNldE1hbmFnZXIoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVEhPUjoKLQkJCQlzZXRBdXRob3IoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJc2V0Q3JlYXRpb25EYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRVZJU0lPTjoKLQkJCQlzZXRSZXZpc2lvbigoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0xBU1RfU0FWRUQ6Ci0JCQkJc2V0TGFzdFNhdmVkKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TQ0hFRFVMRV9GUk9NX1NUQVJUOgotCQkJCXNldFNjaGVkdWxlRnJvbVN0YXJ0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVEFSVF9EQVRFOgotCQkJCXNldFN0YXJ0RGF0ZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklOSVNIX0RBVEU6Ci0JCQkJc2V0RmluaXNoRGF0ZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRllTVEFSVF9EQVRFOgotCQkJCXNldEZZU3RhcnREYXRlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1JJVElDQUxfU0xBQ0tfTElNSVQ6Ci0JCQkJc2V0Q3JpdGljYWxTbGFja0xpbWl0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfRElHSVRTOgotCQkJCXNldEN1cnJlbmN5RGlnaXRzKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MOgotCQkJCXNldEN1cnJlbmN5U3ltYm9sKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9TWU1CT0xfUE9TSVRJT046Ci0JCQkJc2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSX1VJRDoKLQkJCQlzZXRDYWxlbmRhclVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBUlRfVElNRToKLQkJCQlzZXREZWZhdWx0U3RhcnRUaW1lKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJTklTSF9USU1FOgotCQkJCXNldERlZmF1bHRGaW5pc2hUaW1lKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9EQVk6Ci0JCQkJc2V0TWludXRlc1BlckRheSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01JTlVURVNfUEVSX1dFRUs6Ci0JCQkJc2V0TWludXRlc1BlcldlZWsoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EQVlTX1BFUl9NT05USDoKLQkJCQlzZXREYXlzUGVyTW9udGgoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfVFlQRToKLQkJCQlzZXREZWZhdWx0VGFza1R5cGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTDoKLQkJCQlzZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBTkRBUkRfUkFURToKLQkJCQlzZXREZWZhdWx0U3RhbmRhcmRSYXRlKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfT1ZFUlRJTUVfUkFURToKLQkJCQlzZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlzZXREdXJhdGlvbkZvcm1hdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dPUktfRk9STUFUOgotCQkJCXNldFdvcmtGb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FRElUQUJMRV9BQ1RVQUxfQ09TVFM6Ci0JCQkJc2V0RWRpdGFibGVBY3R1YWxDb3N0cygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSE9OT1JfQ09OU1RSQUlOVFM6Ci0JCQkJc2V0SG9ub3JDb25zdHJhaW50cygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRUFSTkVEX1ZBTFVFX01FVEhPRDoKLQkJCQlzZXRFYXJuZWRWYWx1ZU1ldGhvZCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0lOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWToKLQkJCQlzZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01VTFRJUExFX0NSSVRJQ0FMX1BBVEhTOgotCQkJCXNldE11bHRpcGxlQ3JpdGljYWxQYXRocygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tTX0VGRk9SVF9EUklWRU46Ci0JCQkJc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FU1RJTUFURUQ6Ci0JCQkJc2V0TmV3VGFza3NFc3RpbWF0ZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQTElUU19JTl9QUk9HUkVTU19UQVNLUzoKLQkJCQlzZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQUkVBRF9BQ1RVQUxfQ09TVDoKLQkJCQlzZXRTcHJlYWRBY3R1YWxDb3N0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfUEVSQ0VOVF9DT01QTEVURToKLQkJCQlzZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tfVVBEQVRFU19SRVNPVVJDRToKLQkJCQlzZXRUYXNrVXBkYXRlc1Jlc291cmNlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GSVNDQUxfWUVBUl9TVEFSVDoKLQkJCQlzZXRGaXNjYWxZZWFyU3RhcnQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dFRUtfU1RBUlRfREFZOgotCQkJCXNldFdlZWtTdGFydERheSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfQkFDSzoKLQkJCQlzZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfUkVNQUlOSU5HX1NUQVJUU19CQUNLOgotCQkJCXNldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfRk9SV0FSRDoKLQkJCQlzZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19GT1JXQVJEOgotCQkJCXNldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRToKLQkJCQlzZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1M6Ci0JCQkJc2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVEFUVVNfREFURToKLQkJCQlzZXRTdGF0dXNEYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5UX0RBVEU6Ci0JCQkJc2V0Q3VycmVudERhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01JQ1JPU09GVF9QUk9KRUNUX1NFUlZFUl9VUkw6Ci0JCQkJc2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUT0xJTks6Ci0JCQkJc2V0QXV0b2xpbmsoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLX1NUQVJUX0RBVEU6Ci0JCQkJc2V0TmV3VGFza1N0YXJ0RGF0ZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfVEFTS19FVl9NRVRIT0Q6Ci0JCQkJc2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1BST0pFQ1RfRVhURVJOQUxMWV9FRElURUQ6Ci0JCQkJc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0NSRUFUSU9OX0RBVEU6Ci0JCQkJc2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FDVFVBTFNfSU5fU1lOQzoKLQkJCQlzZXRBY3R1YWxzSW5TeW5jKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRU1PVkVfRklMRV9QUk9QRVJUSUVTOgotCQkJCXNldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BRE1JTl9QUk9KRUNUOgotCQkJCXNldEFkbWluUHJvamVjdCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fT1VUTElORV9DT0RFUzoKLQkJCQlzZXRPdXRsaW5lQ29kZXMoKE91dGxpbmVDb2RlcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dCU19NQVNLUzoKLQkJCQlzZXRXQlNNYXNrcygoV0JTTWFza3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FWFRFTkRFRF9BVFRSSUJVVEVTOgotCQkJCXNldEV4dGVuZGVkQXR0cmlidXRlcygoRXh0ZW5kZWRBdHRyaWJ1dGVzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJTOgotCQkJCXNldENhbGVuZGFycygoQ2FsZW5kYXJzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS1M6Ci0JCQkJc2V0VGFza3MoKFRhc2tzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTOgotCQkJCXNldFJlc291cmNlcygoUmVzb3VyY2VzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVNTSUdOTUVOVFM6Ci0JCQkJc2V0QXNzaWdubWVudHMoKEFzc2lnbm1lbnRzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19USVRMRToKLQkJCQlzZXRUaXRsZShUSVRMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NVQkpFQ1Q6Ci0JCQkJc2V0U3ViamVjdChTVUJKRUNUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FURUdPUlk6Ci0JCQkJc2V0Q2F0ZWdvcnkoQ0FURUdPUllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DT01QQU5ZOgotCQkJCXNldENvbXBhbnkoQ09NUEFOWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01BTkFHRVI6Ci0JCQkJc2V0TWFuYWdlcihNQU5BR0VSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUSE9SOgotCQkJCXNldEF1dGhvcihBVVRIT1JfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DUkVBVElPTl9EQVRFOgotCQkJCXNldENyZWF0aW9uRGF0ZShDUkVBVElPTl9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVWSVNJT046Ci0JCQkJc2V0UmV2aXNpb24oUkVWSVNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19MQVNUX1NBVkVEOgotCQkJCXNldExhc3RTYXZlZChMQVNUX1NBVkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU0NIRURVTEVfRlJPTV9TVEFSVDoKLQkJCQl1bnNldFNjaGVkdWxlRnJvbVN0YXJ0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NUQVJUX0RBVEU6Ci0JCQkJc2V0U3RhcnREYXRlKFNUQVJUX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GSU5JU0hfREFURToKLQkJCQlzZXRGaW5pc2hEYXRlKEZJTklTSF9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRllTVEFSVF9EQVRFOgotCQkJCXNldEZZU3RhcnREYXRlKEZZU1RBUlRfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSSVRJQ0FMX1NMQUNLX0xJTUlUOgotCQkJCXNldENyaXRpY2FsU2xhY2tMaW1pdChDUklUSUNBTF9TTEFDS19MSU1JVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX0RJR0lUUzoKLQkJCQlzZXRDdXJyZW5jeURpZ2l0cyhDVVJSRU5DWV9ESUdJVFNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9TWU1CT0w6Ci0JCQkJc2V0Q3VycmVuY3lTeW1ib2woQ1VSUkVOQ1lfU1lNQk9MX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OOgotCQkJCXNldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJfVUlEOgotCQkJCXNldENhbGVuZGFyVUlEKENBTEVOREFSX1VJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBUlRfVElNRToKLQkJCQlzZXREZWZhdWx0U3RhcnRUaW1lKERFRkFVTFRfU1RBUlRfVElNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfRklOSVNIX1RJTUU6Ci0JCQkJc2V0RGVmYXVsdEZpbmlzaFRpbWUoREVGQVVMVF9GSU5JU0hfVElNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01JTlVURVNfUEVSX0RBWToKLQkJCQlzZXRNaW51dGVzUGVyRGF5KE1JTlVURVNfUEVSX0RBWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01JTlVURVNfUEVSX1dFRUs6Ci0JCQkJc2V0TWludXRlc1BlcldlZWsoTUlOVVRFU19QRVJfV0VFS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RBWVNfUEVSX01PTlRIOgotCQkJCXNldERheXNQZXJNb250aChEQVlTX1BFUl9NT05USF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfVEFTS19UWVBFOgotCQkJCXVuc2V0RGVmYXVsdFRhc2tUeXBlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMOgotCQkJCXNldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKERFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9TVEFOREFSRF9SQVRFOgotCQkJCXVuc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX09WRVJUSU1FX1JBVEU6Ci0JCQkJdW5zZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlzZXREdXJhdGlvbkZvcm1hdChEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XT1JLX0ZPUk1BVDoKLQkJCQlzZXRXb3JrRm9ybWF0KFdPUktfRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRURJVEFCTEVfQUNUVUFMX0NPU1RTOgotCQkJCXVuc2V0RWRpdGFibGVBY3R1YWxDb3N0cygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19IT05PUl9DT05TVFJBSU5UUzoKLQkJCQl1bnNldEhvbm9yQ29uc3RyYWludHMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRUFSTkVEX1ZBTFVFX01FVEhPRDoKLQkJCQlzZXRFYXJuZWRWYWx1ZU1ldGhvZChFQVJORURfVkFMVUVfTUVUSE9EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSU5TRVJURURfUFJPSkVDVFNfTElLRV9TVU1NQVJZOgotCQkJCXVuc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01VTFRJUExFX0NSSVRJQ0FMX1BBVEhTOgotCQkJCXVuc2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FRkZPUlRfRFJJVkVOOgotCQkJCXVuc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tTX0VTVElNQVRFRDoKLQkJCQl1bnNldE5ld1Rhc2tzRXN0aW1hdGVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQTElUU19JTl9QUk9HUkVTU19UQVNLUzoKLQkJCQl1bnNldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfQUNUVUFMX0NPU1Q6Ci0JCQkJdW5zZXRTcHJlYWRBY3R1YWxDb3N0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQUkVBRF9QRVJDRU5UX0NPTVBMRVRFOgotCQkJCXVuc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tfVVBEQVRFU19SRVNPVVJDRToKLQkJCQl1bnNldFRhc2tVcGRhdGVzUmVzb3VyY2UoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklTQ0FMX1lFQVJfU1RBUlQ6Ci0JCQkJdW5zZXRGaXNjYWxZZWFyU3RhcnQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV0VFS19TVEFSVF9EQVk6Ci0JCQkJc2V0V2Vla1N0YXJ0RGF5KFdFRUtfU1RBUlRfREFZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19CQUNLOgotCQkJCXVuc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfUkVNQUlOSU5HX1NUQVJUU19CQUNLOgotCQkJCXVuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkQ6Ci0JCQkJdW5zZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0ZPUldBUkQ6Ci0JCQkJdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRToKLQkJCQlzZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlKEJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRPX0FERF9ORVdfUkVTT1VSQ0VTX0FORF9UQVNLUzoKLQkJCQl1bnNldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVEFUVVNfREFURToKLQkJCQlzZXRTdGF0dXNEYXRlKFNUQVRVU19EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOVF9EQVRFOgotCQkJCXNldEN1cnJlbnREYXRlKENVUlJFTlRfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01JQ1JPU09GVF9QUk9KRUNUX1NFUlZFUl9VUkw6Ci0JCQkJdW5zZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9MSU5LOgotCQkJCXVuc2V0QXV0b2xpbmsoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tfU1RBUlRfREFURToKLQkJCQlzZXROZXdUYXNrU3RhcnREYXRlKE5FV19UQVNLX1NUQVJUX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfRVZfTUVUSE9EOgotCQkJCXNldERlZmF1bHRUYXNrRVZNZXRob2QoREVGQVVMVF9UQVNLX0VWX01FVEhPRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1BST0pFQ1RfRVhURVJOQUxMWV9FRElURUQ6Ci0JCQkJdW5zZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FWFRFTkRFRF9DUkVBVElPTl9EQVRFOgotCQkJCXNldEV4dGVuZGVkQ3JlYXRpb25EYXRlKEVYVEVOREVEX0NSRUFUSU9OX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BQ1RVQUxTX0lOX1NZTkM6Ci0JCQkJdW5zZXRBY3R1YWxzSW5TeW5jKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFTU9WRV9GSUxFX1BST1BFUlRJRVM6Ci0JCQkJdW5zZXRSZW1vdmVGaWxlUHJvcGVydGllcygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BRE1JTl9QUk9KRUNUOgotCQkJCXVuc2V0QWRtaW5Qcm9qZWN0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX09VVExJTkVfQ09ERVM6Ci0JCQkJc2V0T3V0bGluZUNvZGVzKChPdXRsaW5lQ29kZXMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dCU19NQVNLUzoKLQkJCQlzZXRXQlNNYXNrcygoV0JTTWFza3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVM6Ci0JCQkJc2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKChFeHRlbmRlZEF0dHJpYnV0ZXMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSUzoKLQkJCQlzZXRDYWxlbmRhcnMoKENhbGVuZGFycyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS1M6Ci0JCQkJc2V0VGFza3MoKFRhc2tzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRVNPVVJDRVM6Ci0JCQkJc2V0UmVzb3VyY2VzKChSZXNvdXJjZXMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FTU0lHTk1FTlRTOgotCQkJCXNldEFzc2lnbm1lbnRzKChBc3NpZ25tZW50cyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19VSUQ6Ci0JCQkJcmV0dXJuIFVJRF9FREVGQVVMVCA9PSBudWxsID8gdUlEICE9IG51bGwgOiAhVUlEX0VERUZBVUxULmVxdWFscyh1SUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19USVRMRToKLQkJCQlyZXR1cm4gVElUTEVfRURFRkFVTFQgPT0gbnVsbCA/IHRpdGxlICE9IG51bGwgOiAhVElUTEVfRURFRkFVTFQuZXF1YWxzKHRpdGxlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVUJKRUNUOgotCQkJCXJldHVybiBTVUJKRUNUX0VERUZBVUxUID09IG51bGwgPyBzdWJqZWN0ICE9IG51bGwgOiAhU1VCSkVDVF9FREVGQVVMVC5lcXVhbHMoc3ViamVjdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIENBVEVHT1JZX0VERUZBVUxUID09IG51bGwgPyBjYXRlZ29yeSAhPSBudWxsIDogIUNBVEVHT1JZX0VERUZBVUxULmVxdWFscyhjYXRlZ29yeSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ09NUEFOWToKLQkJCQlyZXR1cm4gQ09NUEFOWV9FREVGQVVMVCA9PSBudWxsID8gY29tcGFueSAhPSBudWxsIDogIUNPTVBBTllfRURFRkFVTFQuZXF1YWxzKGNvbXBhbnkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01BTkFHRVI6Ci0JCQkJcmV0dXJuIE1BTkFHRVJfRURFRkFVTFQgPT0gbnVsbCA/IG1hbmFnZXIgIT0gbnVsbCA6ICFNQU5BR0VSX0VERUZBVUxULmVxdWFscyhtYW5hZ2VyKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRIT1I6Ci0JCQkJcmV0dXJuIEFVVEhPUl9FREVGQVVMVCA9PSBudWxsID8gYXV0aG9yICE9IG51bGwgOiAhQVVUSE9SX0VERUZBVUxULmVxdWFscyhhdXRob3IpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJcmV0dXJuIENSRUFUSU9OX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGNyZWF0aW9uRGF0ZSAhPSBudWxsIDogIUNSRUFUSU9OX0RBVEVfRURFRkFVTFQuZXF1YWxzKGNyZWF0aW9uRGF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVWSVNJT046Ci0JCQkJcmV0dXJuIFJFVklTSU9OX0VERUZBVUxUID09IG51bGwgPyByZXZpc2lvbiAhPSBudWxsIDogIVJFVklTSU9OX0VERUZBVUxULmVxdWFscyhyZXZpc2lvbik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTEFTVF9TQVZFRDoKLQkJCQlyZXR1cm4gTEFTVF9TQVZFRF9FREVGQVVMVCA9PSBudWxsID8gbGFzdFNhdmVkICE9IG51bGwgOiAhTEFTVF9TQVZFRF9FREVGQVVMVC5lcXVhbHMobGFzdFNhdmVkKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TQ0hFRFVMRV9GUk9NX1NUQVJUOgotCQkJCXJldHVybiBpc1NldFNjaGVkdWxlRnJvbVN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBUlRfREFURToKLQkJCQlyZXR1cm4gU1RBUlRfREFURV9FREVGQVVMVCA9PSBudWxsID8gc3RhcnREYXRlICE9IG51bGwgOiAhU1RBUlRfREFURV9FREVGQVVMVC5lcXVhbHMoc3RhcnREYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GSU5JU0hfREFURToKLQkJCQlyZXR1cm4gRklOSVNIX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaERhdGUgIT0gbnVsbCA6ICFGSU5JU0hfREFURV9FREVGQVVMVC5lcXVhbHMoZmluaXNoRGF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRllTVEFSVF9EQVRFOgotCQkJCXJldHVybiBGWVNUQVJUX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGZZU3RhcnREYXRlICE9IG51bGwgOiAhRllTVEFSVF9EQVRFX0VERUZBVUxULmVxdWFscyhmWVN0YXJ0RGF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1JJVElDQUxfU0xBQ0tfTElNSVQ6Ci0JCQkJcmV0dXJuIENSSVRJQ0FMX1NMQUNLX0xJTUlUX0VERUZBVUxUID09IG51bGwgPyBjcml0aWNhbFNsYWNrTGltaXQgIT0gbnVsbCA6ICFDUklUSUNBTF9TTEFDS19MSU1JVF9FREVGQVVMVC5lcXVhbHMoY3JpdGljYWxTbGFja0xpbWl0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9ESUdJVFM6Ci0JCQkJcmV0dXJuIENVUlJFTkNZX0RJR0lUU19FREVGQVVMVCA9PSBudWxsID8gY3VycmVuY3lEaWdpdHMgIT0gbnVsbCA6ICFDVVJSRU5DWV9ESUdJVFNfRURFRkFVTFQuZXF1YWxzKGN1cnJlbmN5RGlnaXRzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9TWU1CT0w6Ci0JCQkJcmV0dXJuIENVUlJFTkNZX1NZTUJPTF9FREVGQVVMVCA9PSBudWxsID8gY3VycmVuY3lTeW1ib2wgIT0gbnVsbCA6ICFDVVJSRU5DWV9TWU1CT0xfRURFRkFVTFQuZXF1YWxzKGN1cnJlbmN5U3ltYm9sKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9TWU1CT0xfUE9TSVRJT046Ci0JCQkJcmV0dXJuIENVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9FREVGQVVMVCA9PSBudWxsID8gY3VycmVuY3lTeW1ib2xQb3NpdGlvbiAhPSBudWxsIDogIUNVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9FREVGQVVMVC5lcXVhbHMoY3VycmVuY3lTeW1ib2xQb3NpdGlvbik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBDQUxFTkRBUl9VSURfRURFRkFVTFQgPT0gbnVsbCA/IGNhbGVuZGFyVUlEICE9IG51bGwgOiAhQ0FMRU5EQVJfVUlEX0VERUZBVUxULmVxdWFscyhjYWxlbmRhclVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9TVEFSVF9USU1FOgotCQkJCXJldHVybiBERUZBVUxUX1NUQVJUX1RJTUVfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRTdGFydFRpbWUgIT0gbnVsbCA6ICFERUZBVUxUX1NUQVJUX1RJTUVfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRTdGFydFRpbWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfRklOSVNIX1RJTUU6Ci0JCQkJcmV0dXJuIERFRkFVTFRfRklOSVNIX1RJTUVfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRGaW5pc2hUaW1lICE9IG51bGwgOiAhREVGQVVMVF9GSU5JU0hfVElNRV9FREVGQVVMVC5lcXVhbHMoZGVmYXVsdEZpbmlzaFRpbWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01JTlVURVNfUEVSX0RBWToKLQkJCQlyZXR1cm4gTUlOVVRFU19QRVJfREFZX0VERUZBVUxUID09IG51bGwgPyBtaW51dGVzUGVyRGF5ICE9IG51bGwgOiAhTUlOVVRFU19QRVJfREFZX0VERUZBVUxULmVxdWFscyhtaW51dGVzUGVyRGF5KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9XRUVLOgotCQkJCXJldHVybiBNSU5VVEVTX1BFUl9XRUVLX0VERUZBVUxUID09IG51bGwgPyBtaW51dGVzUGVyV2VlayAhPSBudWxsIDogIU1JTlVURVNfUEVSX1dFRUtfRURFRkFVTFQuZXF1YWxzKG1pbnV0ZXNQZXJXZWVrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EQVlTX1BFUl9NT05USDoKLQkJCQlyZXR1cm4gREFZU19QRVJfTU9OVEhfRURFRkFVTFQgPT0gbnVsbCA/IGRheXNQZXJNb250aCAhPSBudWxsIDogIURBWVNfUEVSX01PTlRIX0VERUZBVUxULmVxdWFscyhkYXlzUGVyTW9udGgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfVEFTS19UWVBFOgotCQkJCXJldHVybiBpc1NldERlZmF1bHRUYXNrVHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMOgotCQkJCXJldHVybiBERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9FREVGQVVMVCA9PSBudWxsID8gZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwgIT0gbnVsbCA6ICFERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9FREVGQVVMVC5lcXVhbHMoZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBTkRBUkRfUkFURToKLQkJCQlyZXR1cm4gaXNTZXREZWZhdWx0U3RhbmRhcmRSYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9PVkVSVElNRV9SQVRFOgotCQkJCXJldHVybiBpc1NldERlZmF1bHRPdmVydGltZVJhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJcmV0dXJuIERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCA9PSBudWxsID8gZHVyYXRpb25Gb3JtYXQgIT0gbnVsbCA6ICFEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQuZXF1YWxzKGR1cmF0aW9uRm9ybWF0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XT1JLX0ZPUk1BVDoKLQkJCQlyZXR1cm4gV09SS19GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IHdvcmtGb3JtYXQgIT0gbnVsbCA6ICFXT1JLX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMod29ya0Zvcm1hdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRURJVEFCTEVfQUNUVUFMX0NPU1RTOgotCQkJCXJldHVybiBpc1NldEVkaXRhYmxlQWN0dWFsQ29zdHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19IT05PUl9DT05TVFJBSU5UUzoKLQkJCQlyZXR1cm4gaXNTZXRIb25vckNvbnN0cmFpbnRzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRUFSTkVEX1ZBTFVFX01FVEhPRDoKLQkJCQlyZXR1cm4gRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVCA9PSBudWxsID8gZWFybmVkVmFsdWVNZXRob2QgIT0gbnVsbCA6ICFFQVJORURfVkFMVUVfTUVUSE9EX0VERUZBVUxULmVxdWFscyhlYXJuZWRWYWx1ZU1ldGhvZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSU5TRVJURURfUFJPSkVDVFNfTElLRV9TVU1NQVJZOgotCQkJCXJldHVybiBpc1NldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01VTFRJUExFX0NSSVRJQ0FMX1BBVEhTOgotCQkJCXJldHVybiBpc1NldE11bHRpcGxlQ3JpdGljYWxQYXRocygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FRkZPUlRfRFJJVkVOOgotCQkJCXJldHVybiBpc1NldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tTX0VTVElNQVRFRDoKLQkJCQlyZXR1cm4gaXNTZXROZXdUYXNrc0VzdGltYXRlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQTElUU19JTl9QUk9HUkVTU19UQVNLUzoKLQkJCQlyZXR1cm4gaXNTZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfQUNUVUFMX0NPU1Q6Ci0JCQkJcmV0dXJuIGlzU2V0U3ByZWFkQWN0dWFsQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQUkVBRF9QRVJDRU5UX0NPTVBMRVRFOgotCQkJCXJldHVybiBpc1NldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tfVVBEQVRFU19SRVNPVVJDRToKLQkJCQlyZXR1cm4gaXNTZXRUYXNrVXBkYXRlc1Jlc291cmNlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklTQ0FMX1lFQVJfU1RBUlQ6Ci0JCQkJcmV0dXJuIGlzU2V0RmlzY2FsWWVhclN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV0VFS19TVEFSVF9EQVk6Ci0JCQkJcmV0dXJuIFdFRUtfU1RBUlRfREFZX0VERUZBVUxUID09IG51bGwgPyB3ZWVrU3RhcnREYXkgIT0gbnVsbCA6ICFXRUVLX1NUQVJUX0RBWV9FREVGQVVMVC5lcXVhbHMod2Vla1N0YXJ0RGF5KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0JBQ0s6Ci0JCQkJcmV0dXJuIGlzU2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0JBQ0s6Ci0JCQkJcmV0dXJuIGlzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfRk9SV0FSRDoKLQkJCQlyZXR1cm4gaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfRk9SV0FSRDoKLQkJCQlyZXR1cm4gaXNTZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19CQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFOgotCQkJCXJldHVybiBCQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBiYXNlbGluZUZvckVhcm5lZFZhbHVlICE9IG51bGwgOiAhQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9FREVGQVVMVC5lcXVhbHMoYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1M6Ci0JCQkJcmV0dXJuIGlzU2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBVFVTX0RBVEU6Ci0JCQkJcmV0dXJuIFNUQVRVU19EQVRFX0VERUZBVUxUID09IG51bGwgPyBzdGF0dXNEYXRlICE9IG51bGwgOiAhU1RBVFVTX0RBVEVfRURFRkFVTFQuZXF1YWxzKHN0YXR1c0RhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTlRfREFURToKLQkJCQlyZXR1cm4gQ1VSUkVOVF9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjdXJyZW50RGF0ZSAhPSBudWxsIDogIUNVUlJFTlRfREFURV9FREVGQVVMVC5lcXVhbHMoY3VycmVudERhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01JQ1JPU09GVF9QUk9KRUNUX1NFUlZFUl9VUkw6Ci0JCQkJcmV0dXJuIGlzU2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9MSU5LOgotCQkJCXJldHVybiBpc1NldEF1dG9saW5rKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tfU1RBUlRfREFURToKLQkJCQlyZXR1cm4gTkVXX1RBU0tfU1RBUlRfREFURV9FREVGQVVMVCA9PSBudWxsID8gbmV3VGFza1N0YXJ0RGF0ZSAhPSBudWxsIDogIU5FV19UQVNLX1NUQVJUX0RBVEVfRURFRkFVTFQuZXF1YWxzKG5ld1Rhc2tTdGFydERhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfVEFTS19FVl9NRVRIT0Q6Ci0JCQkJcmV0dXJuIERFRkFVTFRfVEFTS19FVl9NRVRIT0RfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRUYXNrRVZNZXRob2QgIT0gbnVsbCA6ICFERUZBVUxUX1RBU0tfRVZfTUVUSE9EX0VERUZBVUxULmVxdWFscyhkZWZhdWx0VGFza0VWTWV0aG9kKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19QUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEOgotCQkJCXJldHVybiBpc1NldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQ1JFQVRJT05fREFURToKLQkJCQlyZXR1cm4gRVhURU5ERURfQ1JFQVRJT05fREFURV9FREVGQVVMVCA9PSBudWxsID8gZXh0ZW5kZWRDcmVhdGlvbkRhdGUgIT0gbnVsbCA6ICFFWFRFTkRFRF9DUkVBVElPTl9EQVRFX0VERUZBVUxULmVxdWFscyhleHRlbmRlZENyZWF0aW9uRGF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQUNUVUFMU19JTl9TWU5DOgotCQkJCXJldHVybiBpc1NldEFjdHVhbHNJblN5bmMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRU1PVkVfRklMRV9QUk9QRVJUSUVTOgotCQkJCXJldHVybiBpc1NldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQURNSU5fUFJPSkVDVDoKLQkJCQlyZXR1cm4gaXNTZXRBZG1pblByb2plY3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19PVVRMSU5FX0NPREVTOgotCQkJCXJldHVybiBvdXRsaW5lQ29kZXMgIT0gbnVsbDsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XQlNfTUFTS1M6Ci0JCQkJcmV0dXJuIHdCU01hc2tzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGVzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJTOgotCQkJCXJldHVybiBjYWxlbmRhcnMgIT0gbnVsbDsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLUzoKLQkJCQlyZXR1cm4gdGFza3MgIT0gbnVsbDsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRVNPVVJDRVM6Ci0JCQkJcmV0dXJuIHJlc291cmNlcyAhPSBudWxsOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FTU0lHTk1FTlRTOgotCQkJCXJldHVybiBhc3NpZ25tZW50cyAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1SUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRpdGxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0aXRsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3ViamVjdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3ViamVjdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2F0ZWdvcnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhdGVnb3J5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb21wYW55OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb21wYW55KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtYW5hZ2VyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYW5hZ2VyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdXRob3I6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF1dGhvcik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3JlYXRpb25EYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjcmVhdGlvbkRhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJldmlzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXZpc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGFzdFNhdmVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsYXN0U2F2ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNjaGVkdWxlRnJvbVN0YXJ0OiAiKTsKLQkJaWYgKHNjaGVkdWxlRnJvbVN0YXJ0RVNldCkgcmVzdWx0LmFwcGVuZChzY2hlZHVsZUZyb21TdGFydCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0RGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhcnREYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaW5pc2hEYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaW5pc2hEYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmWVN0YXJ0RGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZllTdGFydERhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNyaXRpY2FsU2xhY2tMaW1pdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3JpdGljYWxTbGFja0xpbWl0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjdXJyZW5jeURpZ2l0czogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3VycmVuY3lEaWdpdHMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGN1cnJlbmN5U3ltYm9sOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjdXJyZW5jeVN5bWJvbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3VycmVuY3lTeW1ib2xQb3NpdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3VycmVuY3lTeW1ib2xQb3NpdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2FsZW5kYXJVSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhbGVuZGFyVUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0U3RhcnRUaW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0U3RhcnRUaW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0RmluaXNoVGltZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVmYXVsdEZpbmlzaFRpbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1pbnV0ZXNQZXJEYXk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1pbnV0ZXNQZXJEYXkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1pbnV0ZXNQZXJXZWVrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtaW51dGVzUGVyV2Vlayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGF5c1Blck1vbnRoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkYXlzUGVyTW9udGgpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRUYXNrVHlwZTogIik7Ci0JCWlmIChkZWZhdWx0VGFza1R5cGVFU2V0KSByZXN1bHQuYXBwZW5kKGRlZmF1bHRUYXNrVHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRGaXhlZENvc3RBY2NydWFsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVmYXVsdFN0YW5kYXJkUmF0ZTogIik7Ci0JCWlmIChkZWZhdWx0U3RhbmRhcmRSYXRlRVNldCkgcmVzdWx0LmFwcGVuZChkZWZhdWx0U3RhbmRhcmRSYXRlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVmYXVsdE92ZXJ0aW1lUmF0ZTogIik7Ci0JCWlmIChkZWZhdWx0T3ZlcnRpbWVSYXRlRVNldCkgcmVzdWx0LmFwcGVuZChkZWZhdWx0T3ZlcnRpbWVSYXRlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZHVyYXRpb25Gb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGR1cmF0aW9uRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlZGl0YWJsZUFjdHVhbENvc3RzOiAiKTsKLQkJaWYgKGVkaXRhYmxlQWN0dWFsQ29zdHNFU2V0KSByZXN1bHQuYXBwZW5kKGVkaXRhYmxlQWN0dWFsQ29zdHMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBob25vckNvbnN0cmFpbnRzOiAiKTsKLQkJaWYgKGhvbm9yQ29uc3RyYWludHNFU2V0KSByZXN1bHQuYXBwZW5kKGhvbm9yQ29uc3RyYWludHMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlYXJuZWRWYWx1ZU1ldGhvZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZWFybmVkVmFsdWVNZXRob2QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeTogIik7Ci0JCWlmIChpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnlFU2V0KSByZXN1bHQuYXBwZW5kKGluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG11bHRpcGxlQ3JpdGljYWxQYXRoczogIik7Ci0JCWlmIChtdWx0aXBsZUNyaXRpY2FsUGF0aHNFU2V0KSByZXN1bHQuYXBwZW5kKG11bHRpcGxlQ3JpdGljYWxQYXRocyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5ld1Rhc2tzRWZmb3J0RHJpdmVuOiAiKTsKLQkJaWYgKG5ld1Rhc2tzRWZmb3J0RHJpdmVuRVNldCkgcmVzdWx0LmFwcGVuZChuZXdUYXNrc0VmZm9ydERyaXZlbik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5ld1Rhc2tzRXN0aW1hdGVkOiAiKTsKLQkJaWYgKG5ld1Rhc2tzRXN0aW1hdGVkRVNldCkgcmVzdWx0LmFwcGVuZChuZXdUYXNrc0VzdGltYXRlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNwbGl0c0luUHJvZ3Jlc3NUYXNrczogIik7Ci0JCWlmIChzcGxpdHNJblByb2dyZXNzVGFza3NFU2V0KSByZXN1bHQuYXBwZW5kKHNwbGl0c0luUHJvZ3Jlc3NUYXNrcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNwcmVhZEFjdHVhbENvc3Q6ICIpOwotCQlpZiAoc3ByZWFkQWN0dWFsQ29zdEVTZXQpIHJlc3VsdC5hcHBlbmQoc3ByZWFkQWN0dWFsQ29zdCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNwcmVhZFBlcmNlbnRDb21wbGV0ZTogIik7Ci0JCWlmIChzcHJlYWRQZXJjZW50Q29tcGxldGVFU2V0KSByZXN1bHQuYXBwZW5kKHNwcmVhZFBlcmNlbnRDb21wbGV0ZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRhc2tVcGRhdGVzUmVzb3VyY2U6ICIpOwotCQlpZiAodGFza1VwZGF0ZXNSZXNvdXJjZUVTZXQpIHJlc3VsdC5hcHBlbmQodGFza1VwZGF0ZXNSZXNvdXJjZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpc2NhbFllYXJTdGFydDogIik7Ci0JCWlmIChmaXNjYWxZZWFyU3RhcnRFU2V0KSByZXN1bHQuYXBwZW5kKGZpc2NhbFllYXJTdGFydCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdlZWtTdGFydERheTogIik7Ci0JCXJlc3VsdC5hcHBlbmQod2Vla1N0YXJ0RGF5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtb3ZlQ29tcGxldGVkRW5kc0JhY2s6ICIpOwotCQlpZiAobW92ZUNvbXBsZXRlZEVuZHNCYWNrRVNldCkgcmVzdWx0LmFwcGVuZChtb3ZlQ29tcGxldGVkRW5kc0JhY2spOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtb3ZlUmVtYWluaW5nU3RhcnRzQmFjazogIik7Ci0JCWlmIChtb3ZlUmVtYWluaW5nU3RhcnRzQmFja0VTZXQpIHJlc3VsdC5hcHBlbmQobW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2spOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZDogIik7Ci0JCWlmIChtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQpIHJlc3VsdC5hcHBlbmQobW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQ6ICIpOwotCQlpZiAobW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkRVNldCkgcmVzdWx0LmFwcGVuZChtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiYXNlbGluZUZvckVhcm5lZFZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChiYXNlbGluZUZvckVhcm5lZFZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3M6ICIpOwotCQlpZiAoYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzRVNldCkgcmVzdWx0LmFwcGVuZChhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGF0dXNEYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGF0dXNEYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjdXJyZW50RGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3VycmVudERhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkw6ICIpOwotCQlpZiAobWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTEVTZXQpIHJlc3VsdC5hcHBlbmQobWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF1dG9saW5rOiAiKTsKLQkJaWYgKGF1dG9saW5rRVNldCkgcmVzdWx0LmFwcGVuZChhdXRvbGluayk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5ld1Rhc2tTdGFydERhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5ld1Rhc2tTdGFydERhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRUYXNrRVZNZXRob2Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlZmF1bHRUYXNrRVZNZXRob2QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByb2plY3RFeHRlcm5hbGx5RWRpdGVkOiAiKTsKLQkJaWYgKHByb2plY3RFeHRlcm5hbGx5RWRpdGVkRVNldCkgcmVzdWx0LmFwcGVuZChwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4dGVuZGVkQ3JlYXRpb25EYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleHRlbmRlZENyZWF0aW9uRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsc0luU3luYzogIik7Ci0JCWlmIChhY3R1YWxzSW5TeW5jRVNldCkgcmVzdWx0LmFwcGVuZChhY3R1YWxzSW5TeW5jKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVtb3ZlRmlsZVByb3BlcnRpZXM6ICIpOwotCQlpZiAocmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0KSByZXN1bHQuYXBwZW5kKHJlbW92ZUZpbGVQcm9wZXJ0aWVzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWRtaW5Qcm9qZWN0OiAiKTsKLQkJaWYgKGFkbWluUHJvamVjdEVTZXQpIHJlc3VsdC5hcHBlbmQoYWRtaW5Qcm9qZWN0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb2plY3RJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmF0ZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SYXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWNkYWY2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SYXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmF0ZUltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SYXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmF0ZUltcGwjZ2V0UmF0ZXNGcm9tIDxlbT5SYXRlcyBGcm9tPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmF0ZUltcGwjZ2V0UmF0ZXNUbyA8ZW0+UmF0ZXMgVG88L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlSW1wbCNnZXRSYXRlVGFibGUgPGVtPlJhdGUgVGFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlSW1wbCNnZXRTdGFuZGFyZFJhdGUgPGVtPlN0YW5kYXJkIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlSW1wbCNnZXRTdGFuZGFyZFJhdGVGb3JtYXQgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmF0ZUltcGwjZ2V0T3ZlcnRpbWVSYXRlIDxlbT5PdmVydGltZSBSYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmF0ZUltcGwjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0IDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVJbXBsI2dldENvc3RQZXJVc2UgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJhdGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBSYXRlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmF0ZXNGcm9tKCkgPGVtPlJhdGVzIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhdGVzRnJvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkFURVNfRlJPTV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYXRlc0Zyb20oKSA8ZW0+UmF0ZXMgRnJvbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmF0ZXNGcm9tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJhdGVzRnJvbSA9IFJBVEVTX0ZST01fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmF0ZXNUbygpIDxlbT5SYXRlcyBUbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmF0ZXNUbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkFURVNfVE9fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmF0ZXNUbygpIDxlbT5SYXRlcyBUbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmF0ZXNUbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByYXRlc1RvID0gUkFURVNfVE9fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmF0ZVRhYmxlKCkgPGVtPlJhdGUgVGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhdGVUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFJBVEVfVEFCTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmF0ZVRhYmxlKCkgPGVtPlJhdGUgVGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhdGVUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgcmF0ZVRhYmxlID0gUkFURV9UQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFuZGFyZFJhdGUoKSA8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhbmRhcmRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgU1RBTkRBUkRfUkFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFuZGFyZFJhdGUoKSA8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhbmRhcmRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBzdGFuZGFyZFJhdGUgPSBTVEFOREFSRF9SQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCgpIDxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgU1RBTkRBUkRfUkFURV9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHN0YW5kYXJkUmF0ZUZvcm1hdCA9IFNUQU5EQVJEX1JBVEVfRk9STUFUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lUmF0ZSgpIDxlbT5PdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBPVkVSVElNRV9SQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lUmF0ZSgpIDxlbT5PdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIG92ZXJ0aW1lUmF0ZSA9IE9WRVJUSU1FX1JBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVJhdGVGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBPVkVSVElNRV9SQVRFX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVJhdGVGb3JtYXQoKSA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgb3ZlcnRpbWVSYXRlRm9ybWF0ID0gT1ZFUlRJTUVfUkFURV9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdFBlclVzZSgpIDxlbT5Db3N0IFBlciBVc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3RQZXJVc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBDT1NUX1BFUl9VU0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdFBlclVzZSgpIDxlbT5Db3N0IFBlciBVc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3RQZXJVc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGNvc3RQZXJVc2UgPSBDT1NUX1BFUl9VU0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmF0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRSYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSYXRlc0Zyb20oKSB7Ci0JCXJldHVybiByYXRlc0Zyb207Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmF0ZXNGcm9tKE9iamVjdCBuZXdSYXRlc0Zyb20pIHsKLQkJT2JqZWN0IG9sZFJhdGVzRnJvbSA9IHJhdGVzRnJvbTsKLQkJcmF0ZXNGcm9tID0gbmV3UmF0ZXNGcm9tOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVTX0ZST00sIG9sZFJhdGVzRnJvbSwgcmF0ZXNGcm9tKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSYXRlc1RvKCkgewotCQlyZXR1cm4gcmF0ZXNUbzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSYXRlc1RvKE9iamVjdCBuZXdSYXRlc1RvKSB7Ci0JCU9iamVjdCBvbGRSYXRlc1RvID0gcmF0ZXNUbzsKLQkJcmF0ZXNUbyA9IG5ld1JhdGVzVG87Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURVNfVE8sIG9sZFJhdGVzVG8sIHJhdGVzVG8pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRSYXRlVGFibGUoKSB7Ci0JCXJldHVybiByYXRlVGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmF0ZVRhYmxlKEJpZ0ludGVnZXIgbmV3UmF0ZVRhYmxlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkUmF0ZVRhYmxlID0gcmF0ZVRhYmxlOwotCQlyYXRlVGFibGUgPSBuZXdSYXRlVGFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURV9UQUJMRSwgb2xkUmF0ZVRhYmxlLCByYXRlVGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRTdGFuZGFyZFJhdGUoKSB7Ci0JCXJldHVybiBzdGFuZGFyZFJhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhbmRhcmRSYXRlKEJpZ0RlY2ltYWwgbmV3U3RhbmRhcmRSYXRlKSB7Ci0JCUJpZ0RlY2ltYWwgb2xkU3RhbmRhcmRSYXRlID0gc3RhbmRhcmRSYXRlOwotCQlzdGFuZGFyZFJhdGUgPSBuZXdTdGFuZGFyZFJhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fU1RBTkRBUkRfUkFURSwgb2xkU3RhbmRhcmRSYXRlLCBzdGFuZGFyZFJhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKSB7Ci0JCXJldHVybiBzdGFuZGFyZFJhdGVGb3JtYXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhbmRhcmRSYXRlRm9ybWF0KEJpZ0ludGVnZXIgbmV3U3RhbmRhcmRSYXRlRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkU3RhbmRhcmRSYXRlRm9ybWF0ID0gc3RhbmRhcmRSYXRlRm9ybWF0OwotCQlzdGFuZGFyZFJhdGVGb3JtYXQgPSBuZXdTdGFuZGFyZFJhdGVGb3JtYXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fU1RBTkRBUkRfUkFURV9GT1JNQVQsIG9sZFN0YW5kYXJkUmF0ZUZvcm1hdCwgc3RhbmRhcmRSYXRlRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0T3ZlcnRpbWVSYXRlKCkgewotCQlyZXR1cm4gb3ZlcnRpbWVSYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJ0aW1lUmF0ZShCaWdEZWNpbWFsIG5ld092ZXJ0aW1lUmF0ZSkgewotCQlCaWdEZWNpbWFsIG9sZE92ZXJ0aW1lUmF0ZSA9IG92ZXJ0aW1lUmF0ZTsKLQkJb3ZlcnRpbWVSYXRlID0gbmV3T3ZlcnRpbWVSYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX09WRVJUSU1FX1JBVEUsIG9sZE92ZXJ0aW1lUmF0ZSwgb3ZlcnRpbWVSYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkgewotCQlyZXR1cm4gb3ZlcnRpbWVSYXRlRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJ0aW1lUmF0ZUZvcm1hdChCaWdJbnRlZ2VyIG5ld092ZXJ0aW1lUmF0ZUZvcm1hdCkgewotCQlCaWdJbnRlZ2VyIG9sZE92ZXJ0aW1lUmF0ZUZvcm1hdCA9IG92ZXJ0aW1lUmF0ZUZvcm1hdDsKLQkJb3ZlcnRpbWVSYXRlRm9ybWF0ID0gbmV3T3ZlcnRpbWVSYXRlRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX09WRVJUSU1FX1JBVEVfRk9STUFULCBvbGRPdmVydGltZVJhdGVGb3JtYXQsIG92ZXJ0aW1lUmF0ZUZvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldENvc3RQZXJVc2UoKSB7Ci0JCXJldHVybiBjb3N0UGVyVXNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvc3RQZXJVc2UoQmlnRGVjaW1hbCBuZXdDb3N0UGVyVXNlKSB7Ci0JCUJpZ0RlY2ltYWwgb2xkQ29zdFBlclVzZSA9IGNvc3RQZXJVc2U7Ci0JCWNvc3RQZXJVc2UgPSBuZXdDb3N0UGVyVXNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX0NPU1RfUEVSX1VTRSwgb2xkQ29zdFBlclVzZSwgY29zdFBlclVzZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFU19GUk9NOgotCQkJCXJldHVybiBnZXRSYXRlc0Zyb20oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFU19UTzoKLQkJCQlyZXR1cm4gZ2V0UmF0ZXNUbygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVfVEFCTEU6Ci0JCQkJcmV0dXJuIGdldFJhdGVUYWJsZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1NUQU5EQVJEX1JBVEU6Ci0JCQkJcmV0dXJuIGdldFN0YW5kYXJkUmF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1NUQU5EQVJEX1JBVEVfRk9STUFUOgotCQkJCXJldHVybiBnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19PVkVSVElNRV9SQVRFOgotCQkJCXJldHVybiBnZXRPdmVydGltZVJhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19PVkVSVElNRV9SQVRFX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fQ09TVF9QRVJfVVNFOgotCQkJCXJldHVybiBnZXRDb3N0UGVyVXNlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVTX0ZST006Ci0JCQkJc2V0UmF0ZXNGcm9tKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFU19UTzoKLQkJCQlzZXRSYXRlc1RvKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFX1RBQkxFOgotCQkJCXNldFJhdGVUYWJsZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1NUQU5EQVJEX1JBVEU6Ci0JCQkJc2V0U3RhbmRhcmRSYXRlKChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fU1RBTkRBUkRfUkFURV9GT1JNQVQ6Ci0JCQkJc2V0U3RhbmRhcmRSYXRlRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fT1ZFUlRJTUVfUkFURToKLQkJCQlzZXRPdmVydGltZVJhdGUoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19PVkVSVElNRV9SQVRFX0ZPUk1BVDoKLQkJCQlzZXRPdmVydGltZVJhdGVGb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19DT1NUX1BFUl9VU0U6Ci0JCQkJc2V0Q29zdFBlclVzZSgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFU19GUk9NOgotCQkJCXNldFJhdGVzRnJvbShSQVRFU19GUk9NX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURVNfVE86Ci0JCQkJc2V0UmF0ZXNUbyhSQVRFU19UT19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVfVEFCTEU6Ci0JCQkJc2V0UmF0ZVRhYmxlKFJBVEVfVEFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19TVEFOREFSRF9SQVRFOgotCQkJCXNldFN0YW5kYXJkUmF0ZShTVEFOREFSRF9SQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fU1RBTkRBUkRfUkFURV9GT1JNQVQ6Ci0JCQkJc2V0U3RhbmRhcmRSYXRlRm9ybWF0KFNUQU5EQVJEX1JBVEVfRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fT1ZFUlRJTUVfUkFURToKLQkJCQlzZXRPdmVydGltZVJhdGUoT1ZFUlRJTUVfUkFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX09WRVJUSU1FX1JBVEVfRk9STUFUOgotCQkJCXNldE92ZXJ0aW1lUmF0ZUZvcm1hdChPVkVSVElNRV9SQVRFX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX0NPU1RfUEVSX1VTRToKLQkJCQlzZXRDb3N0UGVyVXNlKENPU1RfUEVSX1VTRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURVNfRlJPTToKLQkJCQlyZXR1cm4gUkFURVNfRlJPTV9FREVGQVVMVCA9PSBudWxsID8gcmF0ZXNGcm9tICE9IG51bGwgOiAhUkFURVNfRlJPTV9FREVGQVVMVC5lcXVhbHMocmF0ZXNGcm9tKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFU19UTzoKLQkJCQlyZXR1cm4gUkFURVNfVE9fRURFRkFVTFQgPT0gbnVsbCA/IHJhdGVzVG8gIT0gbnVsbCA6ICFSQVRFU19UT19FREVGQVVMVC5lcXVhbHMocmF0ZXNUbyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURV9UQUJMRToKLQkJCQlyZXR1cm4gUkFURV9UQUJMRV9FREVGQVVMVCA9PSBudWxsID8gcmF0ZVRhYmxlICE9IG51bGwgOiAhUkFURV9UQUJMRV9FREVGQVVMVC5lcXVhbHMocmF0ZVRhYmxlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19TVEFOREFSRF9SQVRFOgotCQkJCXJldHVybiBTVEFOREFSRF9SQVRFX0VERUZBVUxUID09IG51bGwgPyBzdGFuZGFyZFJhdGUgIT0gbnVsbCA6ICFTVEFOREFSRF9SQVRFX0VERUZBVUxULmVxdWFscyhzdGFuZGFyZFJhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1NUQU5EQVJEX1JBVEVfRk9STUFUOgotCQkJCXJldHVybiBTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVCA9PSBudWxsID8gc3RhbmRhcmRSYXRlRm9ybWF0ICE9IG51bGwgOiAhU1RBTkRBUkRfUkFURV9GT1JNQVRfRURFRkFVTFQuZXF1YWxzKHN0YW5kYXJkUmF0ZUZvcm1hdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fT1ZFUlRJTUVfUkFURToKLQkJCQlyZXR1cm4gT1ZFUlRJTUVfUkFURV9FREVGQVVMVCA9PSBudWxsID8gb3ZlcnRpbWVSYXRlICE9IG51bGwgOiAhT1ZFUlRJTUVfUkFURV9FREVGQVVMVC5lcXVhbHMob3ZlcnRpbWVSYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19PVkVSVElNRV9SQVRFX0ZPUk1BVDoKLQkJCQlyZXR1cm4gT1ZFUlRJTUVfUkFURV9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IG92ZXJ0aW1lUmF0ZUZvcm1hdCAhPSBudWxsIDogIU9WRVJUSU1FX1JBVEVfRk9STUFUX0VERUZBVUxULmVxdWFscyhvdmVydGltZVJhdGVGb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX0NPU1RfUEVSX1VTRToKLQkJCQlyZXR1cm4gQ09TVF9QRVJfVVNFX0VERUZBVUxUID09IG51bGwgPyBjb3N0UGVyVXNlICE9IG51bGwgOiAhQ09TVF9QRVJfVVNFX0VERUZBVUxULmVxdWFscyhjb3N0UGVyVXNlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJhdGVzRnJvbTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmF0ZXNGcm9tKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByYXRlc1RvOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyYXRlc1RvKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByYXRlVGFibGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJhdGVUYWJsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhbmRhcmRSYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGFuZGFyZFJhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YW5kYXJkUmF0ZUZvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhbmRhcmRSYXRlRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvdmVydGltZVJhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG92ZXJ0aW1lUmF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlcnRpbWVSYXRlRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvdmVydGltZVJhdGVGb3JtYXQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvc3RQZXJVc2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvc3RQZXJVc2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9SYXRlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1JhdGVzSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1JhdGVzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzJjMDU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SYXRlc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJhdGVzSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJhdGVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmF0ZXNJbXBsI2dldFJhdGUgPGVtPlJhdGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSYXRlc0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFJhdGVzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYXRlKCkgPGVtPlJhdGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJhdGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJhdGVzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFJhdGVzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJhdGUoKSB7Ci0JCWlmIChyYXRlID09IG51bGwpIHsKLQkJCXJhdGUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUmF0ZS5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5SQVRFU19fUkFURSk7Ci0JCX0KLQkJcmV0dXJuIHJhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVTX19SQVRFOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJhdGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVTX19SQVRFOgotCQkJCXJldHVybiBnZXRSYXRlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVTX19SQVRFOgotCQkJCWdldFJhdGUoKS5jbGVhcigpOwotCQkJCWdldFJhdGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURVNfX1JBVEU6Ci0JCQkJZ2V0UmF0ZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURVNfX1JBVEU6Ci0JCQkJcmV0dXJuIHJhdGUgIT0gbnVsbCAmJiAhcmF0ZS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL1JhdGVzSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1Jlc291cmNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1Jlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTI3ZDdiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMTUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZXNvdXJjZUltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRJRCA8ZW0+SUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2lzSXNOdWxsIDxlbT5JcyBOdWxsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEluaXRpYWxzIDxlbT5Jbml0aWFsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRQaG9uZXRpY3MgPGVtPlBob25ldGljczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXROVEFjY291bnQgPGVtPk5UIEFjY291bnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0TWF0ZXJpYWxMYWJlbCA8ZW0+TWF0ZXJpYWwgTGFiZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0Q29kZSA8ZW0+Q29kZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0V29ya0dyb3VwIDxlbT5Xb3JrIEdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEVtYWlsQWRkcmVzcyA8ZW0+RW1haWwgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0TWF4VW5pdHMgPGVtPk1heCBVbml0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRQZWFrVW5pdHMgPGVtPlBlYWsgVW5pdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBdmFpbGFibGVGcm9tIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBdmFpbGFibGVUbyA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNpc0NhbkxldmVsIDxlbT5DYW4gTGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QWNjcnVlQXQgPGVtPkFjY3J1ZSBBdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFJlZ3VsYXJXb3JrIDxlbT5SZWd1bGFyIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEFjdHVhbE92ZXJ0aW1lV29yayA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0U3RhbmRhcmRSYXRlIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRPdmVydGltZVJhdGUgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0IDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0Q29zdFBlclVzZSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFNWIDxlbT5TVjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRDViA8ZW0+Q1Y8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEJDV1AgPGVtPkJDV1A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjaXNJc0dlbmVyaWMgPGVtPklzIEdlbmVyaWM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjaXNJc0luYWN0aXZlIDxlbT5JcyBJbmFjdGl2ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNpc0lzRW50ZXJwcmlzZSA8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRCb29raW5nVHlwZSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEIDxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QmFzZWxpbmUgPGVtPkJhc2VsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcyA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0UmF0ZXMgPGVtPlJhdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFJlc291cmNlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdUlEID0gVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElEKCkgPGVtPklEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElEKCkgPGVtPklEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgaUQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzTnVsbCgpIDxlbT5JcyBOdWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX05VTExfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNOdWxsKCkgPGVtPklzIE51bGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNOdWxsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc051bGwgPSBJU19OVUxMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBOdWxsIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc051bGxFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbHMoKSA8ZW0+SW5pdGlhbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRpYWxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTklUSUFMU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0aWFscygpIDxlbT5Jbml0aWFsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5pdGlhbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaW5pdGlhbHMgPSBJTklUSUFMU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaG9uZXRpY3MoKSA8ZW0+UGhvbmV0aWNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBIT05FVElDU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaG9uZXRpY3MoKSA8ZW0+UGhvbmV0aWNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGhvbmV0aWNzID0gUEhPTkVUSUNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5UQWNjb3VudCgpIDxlbT5OVCBBY2NvdW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROVEFjY291bnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5UQUNDT1VOVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROVEFjY291bnQoKSA8ZW0+TlQgQWNjb3VudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TlRBY2NvdW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5UQWNjb3VudCA9IE5UQUNDT1VOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXRlcmlhbExhYmVsKCkgPGVtPk1hdGVyaWFsIExhYmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXRlcmlhbExhYmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVRFUklBTF9MQUJFTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXRlcmlhbExhYmVsKCkgPGVtPk1hdGVyaWFsIExhYmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXRlcmlhbExhYmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hdGVyaWFsTGFiZWwgPSBNQVRFUklBTF9MQUJFTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2RlKCkgPGVtPkNvZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPREVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29kZSgpIDxlbT5Db2RlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvZGUgPSBDT0RFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwKCkgPGVtPkdyb3VwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAoKSA8ZW0+R3JvdXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdyb3VwID0gR1JPVVBfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya0dyb3VwKCkgPGVtPldvcmsgR3JvdXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFdPUktfR1JPVVBfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya0dyb3VwKCkgPGVtPldvcmsgR3JvdXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgd29ya0dyb3VwID0gV09SS19HUk9VUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbWFpbEFkZHJlc3MoKSA8ZW0+RW1haWwgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW1haWxBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTUFJTF9BRERSRVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVtYWlsQWRkcmVzcygpIDxlbT5FbWFpbCBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbWFpbEFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZW1haWxBZGRyZXNzID0gRU1BSUxfQUREUkVTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmsoKSA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUEVSTElOS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmsoKSA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rID0gSFlQRVJMSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua0FkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua0FkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rQWRkcmVzcyA9IEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzcyA9IEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXhVbml0cygpIDxlbT5NYXggVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1heFVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IE1BWF9VTklUU19FREVGQVVMVCA9IDEuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXhVbml0cygpIDxlbT5NYXggVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1heFVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgbWF4VW5pdHMgPSBNQVhfVU5JVFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE1heCBVbml0cyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF4VW5pdHNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVha1VuaXRzKCkgPGVtPlBlYWsgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlYWtVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBQRUFLX1VOSVRTX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlYWtVbml0cygpIDxlbT5QZWFrIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZWFrVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBwZWFrVW5pdHMgPSBQRUFLX1VOSVRTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBQZWFrIFVuaXRzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwZWFrVW5pdHNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNPdmVyQWxsb2NhdGVkKCkgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBPVkVSX0FMTE9DQVRFRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNPdmVyQWxsb2NhdGVkKCkgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG92ZXJBbGxvY2F0ZWQgPSBPVkVSX0FMTE9DQVRFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgT3ZlciBBbGxvY2F0ZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG92ZXJBbGxvY2F0ZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXZhaWxhYmxlRnJvbSgpIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlRnJvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQVZBSUxBQkxFX0ZST01fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXZhaWxhYmxlRnJvbSgpIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlRnJvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhdmFpbGFibGVGcm9tID0gQVZBSUxBQkxFX0ZST01fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXZhaWxhYmxlVG8oKSA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdmFpbGFibGVUbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQVZBSUxBQkxFX1RPX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZVRvKCkgPGVtPkF2YWlsYWJsZSBUbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVG8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYXZhaWxhYmxlVG8gPSBBVkFJTEFCTEVfVE9fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBTVEFSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydCgpIDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgc3RhcnQgPSBTVEFSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2goKSA8ZW0+RmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEZJTklTSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2goKSA8ZW0+RmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZmluaXNoID0gRklOSVNIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ2FuTGV2ZWwoKSA8ZW0+Q2FuIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0NhbkxldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ0FOX0xFVkVMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0NhbkxldmVsKCkgPGVtPkNhbiBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDYW5MZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuTGV2ZWwgPSBDQU5fTEVWRUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIENhbiBMZXZlbCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuTGV2ZWxFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjcnVlQXQoKSA8ZW0+QWNjcnVlIEF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2NydWVBdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEFDQ1JVRV9BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2NydWVBdCgpIDxlbT5BY2NydWUgQXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY3J1ZUF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBhY2NydWVBdCA9IEFDQ1JVRV9BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrKCkgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFdPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHdvcmsgPSBXT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZ3VsYXJXb3JrKCkgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFJFR1VMQVJfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWd1bGFyV29yaygpIDxlbT5SZWd1bGFyIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZ3VsYXJXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlZ3VsYXJXb3JrID0gUkVHVUxBUl9XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lV29yaygpIDxlbT5PdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IE9WRVJUSU1FX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVXb3JrKCkgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBvdmVydGltZVdvcmsgPSBPVkVSVElNRV9XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFdvcmsoKSA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFdvcmsoKSA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsV29yayA9IEFDVFVBTF9XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ1dvcmsoKSA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ1dvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFJFTUFJTklOR19XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ1dvcmsoKSA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ1dvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVtYWluaW5nV29yayA9IFJFTUFJTklOR19XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxPdmVydGltZVdvcmsgPSBBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVtYWluaW5nT3ZlcnRpbWVXb3JrID0gUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHBlcmNlbnRXb3JrQ29tcGxldGUgPSBQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhbmRhcmRSYXRlKCkgPGVtPlN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFNUQU5EQVJEX1JBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhbmRhcmRSYXRlKCkgPGVtPlN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgc3RhbmRhcmRSYXRlID0gU1RBTkRBUkRfUkFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKSA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFNUQU5EQVJEX1JBVEVfRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCgpIDxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBzdGFuZGFyZFJhdGVGb3JtYXQgPSBTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBDT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3QoKSA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgY29zdCA9IENPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVSYXRlKCkgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIE9WRVJUSU1FX1JBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVSYXRlKCkgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgb3ZlcnRpbWVSYXRlID0gT1ZFUlRJTUVfUkFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVJhdGVGb3JtYXQoKSA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIE9WRVJUSU1FX1JBVEVfRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpIDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBvdmVydGltZVJhdGVGb3JtYXQgPSBPVkVSVElNRV9SQVRFX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZUNvc3QoKSA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZUNvc3QoKSA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBvdmVydGltZUNvc3QgPSBPVkVSVElNRV9DT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RQZXJVc2UoKSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0UGVyVXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQ09TVF9QRVJfVVNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RQZXJVc2UoKSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0UGVyVXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBjb3N0UGVyVXNlID0gQ09TVF9QRVJfVVNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbENvc3QoKSA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBBQ1RVQUxfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxDb3N0KCkgPGVtPkFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBhY3R1YWxDb3N0ID0gQUNUVUFMX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgYWN0dWFsT3ZlcnRpbWVDb3N0ID0gQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nQ29zdCgpIDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFJFTUFJTklOR19DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ0Nvc3QoKSA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIHJlbWFpbmluZ0Nvc3QgPSBSRU1BSU5JTkdfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCByZW1haW5pbmdPdmVydGltZUNvc3QgPSBSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrVmFyaWFuY2UoKSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1ZhcmlhbmNlKCkgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IHdvcmtWYXJpYW5jZSA9IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFdvcmsgVmFyaWFuY2UgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHdvcmtWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0VmFyaWFuY2UoKSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IENPU1RfVkFSSUFOQ0VfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdFZhcmlhbmNlKCkgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3RWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGNvc3RWYXJpYW5jZSA9IENPU1RfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIENvc3QgVmFyaWFuY2UgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvc3RWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTVigpIDxlbT5TVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U1YoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgU1ZfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U1YoKSA8ZW0+U1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgc1YgPSBTVl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU1YgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNWRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENWKCkgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDVigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBDVl9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDVigpIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBjViA9IENWX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDViBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY1ZFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QUNXUCgpIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEFDV1BfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QUNXUCgpIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYUNXUCA9IEFDV1BfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEFDV1AgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFDV1BFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsZW5kYXJVSUQoKSA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIENBTEVOREFSX1VJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWxlbmRhclVJRCgpIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhbGVuZGFyVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBjYWxlbmRhclVJRCA9IENBTEVOREFSX1VJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb3RlcygpIDxlbT5Ob3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEVTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vdGVzKCkgPGVtPk5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBub3RlcyA9IE5PVEVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1MoKSA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBCQ1dTX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1MoKSA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGJDV1MgPSBCQ1dTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBCQ1dTIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiQ1dTRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1AoKSA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBCQ1dQX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1AoKSA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBCQ1dQIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiQ1dQRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNHZW5lcmljKCkgPGVtPklzIEdlbmVyaWM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNHZW5lcmljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfR0VORVJJQ19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0dlbmVyaWMoKSA8ZW0+SXMgR2VuZXJpYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc0dlbmVyaWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzR2VuZXJpYyA9IElTX0dFTkVSSUNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIEdlbmVyaWMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzR2VuZXJpY0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzSW5hY3RpdmUoKSA8ZW0+SXMgSW5hY3RpdmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNJbmFjdGl2ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0lOQUNUSVZFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzSW5hY3RpdmUoKSA8ZW0+SXMgSW5hY3RpdmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNJbmFjdGl2ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmFjdGl2ZSA9IElTX0lOQUNUSVZFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBJbmFjdGl2ZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmFjdGl2ZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzRW50ZXJwcmlzZSgpIDxlbT5JcyBFbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzRW50ZXJwcmlzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0VOVEVSUFJJU0VfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNFbnRlcnByaXNlKCkgPGVtPklzIEVudGVycHJpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNFbnRlcnByaXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VudGVycHJpc2UgPSBJU19FTlRFUlBSSVNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBFbnRlcnByaXNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VudGVycHJpc2VFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Qm9va2luZ1R5cGUoKSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCb29raW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEJPT0tJTkdfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCb29raW5nVHlwZSgpIDxlbT5Cb29raW5nIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJvb2tpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBib29raW5nVHlwZSA9IEJPT0tJTkdfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKSA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbFdvcmtQcm90ZWN0ZWQgPSBBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA9IEFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEKCkgPGVtPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZFX0RJUkVDVE9SWV9HVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2ZURpcmVjdG9yeUdVSUQoKSA8ZW0+QWN0aXZlIERpcmVjdG9yeSBHVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFjdGl2ZURpcmVjdG9yeUdVSUQgPSBBQ1RJVkVfRElSRUNUT1JZX0dVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRpb25EYXRlKCkgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQ1JFQVRJT05fREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcmVhdGlvbkRhdGUoKSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JlYXRpb25EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0aW9uRGF0ZSA9IENSRUFUSU9OX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBleHRlbmRlZEF0dHJpYnV0ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlbGluZSgpIDxlbT5CYXNlbGluZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGJhc2VsaW5lID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVDb2RlKCkgPGVtPk91dGxpbmUgQ29kZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG91dGxpbmVDb2RlID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMoKSA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBBdmFpbGFiaWxpdHlQZXJpb2RzIGF2YWlsYWJpbGl0eVBlcmlvZHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmF0ZXMoKSA8ZW0+UmF0ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmF0ZXMgcmF0ZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZXBoYXNlZERhdGEoKSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRpbWVwaGFzZWREYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdGltZXBoYXNlZERhdGEgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChCaWdJbnRlZ2VyIG5ld1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19VSUQsIG9sZFVJRCwgdUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0SUQoKSB7Ci0JCXJldHVybiBpRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJRChCaWdJbnRlZ2VyIG5ld0lEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkSUQgPSBpRDsKLQkJaUQgPSBuZXdJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSUQsIG9sZElELCBpRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIG5ld1R5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzTnVsbCgpIHsKLQkJcmV0dXJuIGlzTnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc051bGwoYm9vbGVhbiBuZXdJc051bGwpIHsKLQkJYm9vbGVhbiBvbGRJc051bGwgPSBpc051bGw7Ci0JCWlzTnVsbCA9IG5ld0lzTnVsbDsKLQkJYm9vbGVhbiBvbGRJc051bGxFU2V0ID0gaXNOdWxsRVNldDsKLQkJaXNOdWxsRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX05VTEwsIG9sZElzTnVsbCwgaXNOdWxsLCAhb2xkSXNOdWxsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNOdWxsKCkgewotCQlib29sZWFuIG9sZElzTnVsbCA9IGlzTnVsbDsKLQkJYm9vbGVhbiBvbGRJc051bGxFU2V0ID0gaXNOdWxsRVNldDsKLQkJaXNOdWxsID0gSVNfTlVMTF9FREVGQVVMVDsKLQkJaXNOdWxsRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX05VTEwsIG9sZElzTnVsbCwgSVNfTlVMTF9FREVGQVVMVCwgb2xkSXNOdWxsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNOdWxsKCkgewotCQlyZXR1cm4gaXNOdWxsRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxzKCkgewotCQlyZXR1cm4gaW5pdGlhbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbHMoU3RyaW5nIG5ld0luaXRpYWxzKSB7Ci0JCVN0cmluZyBvbGRJbml0aWFscyA9IGluaXRpYWxzOwotCQlpbml0aWFscyA9IG5ld0luaXRpYWxzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JTklUSUFMUywgb2xkSW5pdGlhbHMsIGluaXRpYWxzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQaG9uZXRpY3MoKSB7Ci0JCXJldHVybiBwaG9uZXRpY3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGhvbmV0aWNzKFN0cmluZyBuZXdQaG9uZXRpY3MpIHsKLQkJU3RyaW5nIG9sZFBob25ldGljcyA9IHBob25ldGljczsKLQkJcGhvbmV0aWNzID0gbmV3UGhvbmV0aWNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QSE9ORVRJQ1MsIG9sZFBob25ldGljcywgcGhvbmV0aWNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROVEFjY291bnQoKSB7Ci0JCXJldHVybiBuVEFjY291bnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TlRBY2NvdW50KFN0cmluZyBuZXdOVEFjY291bnQpIHsKLQkJU3RyaW5nIG9sZE5UQWNjb3VudCA9IG5UQWNjb3VudDsKLQkJblRBY2NvdW50ID0gbmV3TlRBY2NvdW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OVEFDQ09VTlQsIG9sZE5UQWNjb3VudCwgblRBY2NvdW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXRlcmlhbExhYmVsKCkgewotCQlyZXR1cm4gbWF0ZXJpYWxMYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXRlcmlhbExhYmVsKFN0cmluZyBuZXdNYXRlcmlhbExhYmVsKSB7Ci0JCVN0cmluZyBvbGRNYXRlcmlhbExhYmVsID0gbWF0ZXJpYWxMYWJlbDsKLQkJbWF0ZXJpYWxMYWJlbCA9IG5ld01hdGVyaWFsTGFiZWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX01BVEVSSUFMX0xBQkVMLCBvbGRNYXRlcmlhbExhYmVsLCBtYXRlcmlhbExhYmVsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2RlKCkgewotCQlyZXR1cm4gY29kZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2RlKFN0cmluZyBuZXdDb2RlKSB7Ci0JCVN0cmluZyBvbGRDb2RlID0gY29kZTsKLQkJY29kZSA9IG5ld0NvZGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPREUsIG9sZENvZGUsIGNvZGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEdyb3VwKCkgewotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R3JvdXAoU3RyaW5nIG5ld0dyb3VwKSB7Ci0JCVN0cmluZyBvbGRHcm91cCA9IGdyb3VwOwotCQlncm91cCA9IG5ld0dyb3VwOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19HUk9VUCwgb2xkR3JvdXAsIGdyb3VwKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0V29ya0dyb3VwKCkgewotCQlyZXR1cm4gd29ya0dyb3VwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtHcm91cChCaWdJbnRlZ2VyIG5ld1dvcmtHcm91cCkgewotCQlCaWdJbnRlZ2VyIG9sZFdvcmtHcm91cCA9IHdvcmtHcm91cDsKLQkJd29ya0dyb3VwID0gbmV3V29ya0dyb3VwOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX0dST1VQLCBvbGRXb3JrR3JvdXAsIHdvcmtHcm91cCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW1haWxBZGRyZXNzKCkgewotCQlyZXR1cm4gZW1haWxBZGRyZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVtYWlsQWRkcmVzcyhTdHJpbmcgbmV3RW1haWxBZGRyZXNzKSB7Ci0JCVN0cmluZyBvbGRFbWFpbEFkZHJlc3MgPSBlbWFpbEFkZHJlc3M7Ci0JCWVtYWlsQWRkcmVzcyA9IG5ld0VtYWlsQWRkcmVzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRU1BSUxfQUREUkVTUywgb2xkRW1haWxBZGRyZXNzLCBlbWFpbEFkZHJlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGluaygpIHsKLQkJcmV0dXJuIGh5cGVybGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmsoU3RyaW5nIG5ld0h5cGVybGluaykgewotCQlTdHJpbmcgb2xkSHlwZXJsaW5rID0gaHlwZXJsaW5rOwotCQloeXBlcmxpbmsgPSBuZXdIeXBlcmxpbms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOSywgb2xkSHlwZXJsaW5rLCBoeXBlcmxpbmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua0FkZHJlc3MoKSB7Ci0JCXJldHVybiBoeXBlcmxpbmtBZGRyZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua0FkZHJlc3MoU3RyaW5nIG5ld0h5cGVybGlua0FkZHJlc3MpIHsKLQkJU3RyaW5nIG9sZEh5cGVybGlua0FkZHJlc3MgPSBoeXBlcmxpbmtBZGRyZXNzOwotCQloeXBlcmxpbmtBZGRyZXNzID0gbmV3SHlwZXJsaW5rQWRkcmVzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSFlQRVJMSU5LX0FERFJFU1MsIG9sZEh5cGVybGlua0FkZHJlc3MsIGh5cGVybGlua0FkZHJlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKSB7Ci0JCXJldHVybiBoeXBlcmxpbmtTdWJBZGRyZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua1N1YkFkZHJlc3MoU3RyaW5nIG5ld0h5cGVybGlua1N1YkFkZHJlc3MpIHsKLQkJU3RyaW5nIG9sZEh5cGVybGlua1N1YkFkZHJlc3MgPSBoeXBlcmxpbmtTdWJBZGRyZXNzOwotCQloeXBlcmxpbmtTdWJBZGRyZXNzID0gbmV3SHlwZXJsaW5rU3ViQWRkcmVzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSFlQRVJMSU5LX1NVQl9BRERSRVNTLCBvbGRIeXBlcmxpbmtTdWJBZGRyZXNzLCBoeXBlcmxpbmtTdWJBZGRyZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldE1heFVuaXRzKCkgewotCQlyZXR1cm4gbWF4VW5pdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWF4VW5pdHMoZmxvYXQgbmV3TWF4VW5pdHMpIHsKLQkJZmxvYXQgb2xkTWF4VW5pdHMgPSBtYXhVbml0czsKLQkJbWF4VW5pdHMgPSBuZXdNYXhVbml0czsKLQkJYm9vbGVhbiBvbGRNYXhVbml0c0VTZXQgPSBtYXhVbml0c0VTZXQ7Ci0JCW1heFVuaXRzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX01BWF9VTklUUywgb2xkTWF4VW5pdHMsIG1heFVuaXRzLCAhb2xkTWF4VW5pdHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRNYXhVbml0cygpIHsKLQkJZmxvYXQgb2xkTWF4VW5pdHMgPSBtYXhVbml0czsKLQkJYm9vbGVhbiBvbGRNYXhVbml0c0VTZXQgPSBtYXhVbml0c0VTZXQ7Ci0JCW1heFVuaXRzID0gTUFYX1VOSVRTX0VERUZBVUxUOwotCQltYXhVbml0c0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVhfVU5JVFMsIG9sZE1heFVuaXRzLCBNQVhfVU5JVFNfRURFRkFVTFQsIG9sZE1heFVuaXRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TWF4VW5pdHMoKSB7Ci0JCXJldHVybiBtYXhVbml0c0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldFBlYWtVbml0cygpIHsKLQkJcmV0dXJuIHBlYWtVbml0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQZWFrVW5pdHMoZmxvYXQgbmV3UGVha1VuaXRzKSB7Ci0JCWZsb2F0IG9sZFBlYWtVbml0cyA9IHBlYWtVbml0czsKLQkJcGVha1VuaXRzID0gbmV3UGVha1VuaXRzOwotCQlib29sZWFuIG9sZFBlYWtVbml0c0VTZXQgPSBwZWFrVW5pdHNFU2V0OwotCQlwZWFrVW5pdHNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEVBS19VTklUUywgb2xkUGVha1VuaXRzLCBwZWFrVW5pdHMsICFvbGRQZWFrVW5pdHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRQZWFrVW5pdHMoKSB7Ci0JCWZsb2F0IG9sZFBlYWtVbml0cyA9IHBlYWtVbml0czsKLQkJYm9vbGVhbiBvbGRQZWFrVW5pdHNFU2V0ID0gcGVha1VuaXRzRVNldDsKLQkJcGVha1VuaXRzID0gUEVBS19VTklUU19FREVGQVVMVDsKLQkJcGVha1VuaXRzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFQUtfVU5JVFMsIG9sZFBlYWtVbml0cywgUEVBS19VTklUU19FREVGQVVMVCwgb2xkUGVha1VuaXRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UGVha1VuaXRzKCkgewotCQlyZXR1cm4gcGVha1VuaXRzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJBbGxvY2F0ZWQoKSB7Ci0JCXJldHVybiBvdmVyQWxsb2NhdGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJBbGxvY2F0ZWQoYm9vbGVhbiBuZXdPdmVyQWxsb2NhdGVkKSB7Ci0JCWJvb2xlYW4gb2xkT3ZlckFsbG9jYXRlZCA9IG92ZXJBbGxvY2F0ZWQ7Ci0JCW92ZXJBbGxvY2F0ZWQgPSBuZXdPdmVyQWxsb2NhdGVkOwotCQlib29sZWFuIG9sZE92ZXJBbGxvY2F0ZWRFU2V0ID0gb3ZlckFsbG9jYXRlZEVTZXQ7Ci0JCW92ZXJBbGxvY2F0ZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUl9BTExPQ0FURUQsIG9sZE92ZXJBbGxvY2F0ZWQsIG92ZXJBbGxvY2F0ZWQsICFvbGRPdmVyQWxsb2NhdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0T3ZlckFsbG9jYXRlZCgpIHsKLQkJYm9vbGVhbiBvbGRPdmVyQWxsb2NhdGVkID0gb3ZlckFsbG9jYXRlZDsKLQkJYm9vbGVhbiBvbGRPdmVyQWxsb2NhdGVkRVNldCA9IG92ZXJBbGxvY2F0ZWRFU2V0OwotCQlvdmVyQWxsb2NhdGVkID0gT1ZFUl9BTExPQ0FURURfRURFRkFVTFQ7Ci0JCW92ZXJBbGxvY2F0ZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUl9BTExPQ0FURUQsIG9sZE92ZXJBbGxvY2F0ZWQsIE9WRVJfQUxMT0NBVEVEX0VERUZBVUxULCBvbGRPdmVyQWxsb2NhdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0T3ZlckFsbG9jYXRlZCgpIHsKLQkJcmV0dXJuIG92ZXJBbGxvY2F0ZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QXZhaWxhYmxlRnJvbSgpIHsKLQkJcmV0dXJuIGF2YWlsYWJsZUZyb207Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlRnJvbShPYmplY3QgbmV3QXZhaWxhYmxlRnJvbSkgewotCQlPYmplY3Qgb2xkQXZhaWxhYmxlRnJvbSA9IGF2YWlsYWJsZUZyb207Ci0JCWF2YWlsYWJsZUZyb20gPSBuZXdBdmFpbGFibGVGcm9tOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCTEVfRlJPTSwgb2xkQXZhaWxhYmxlRnJvbSwgYXZhaWxhYmxlRnJvbSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QXZhaWxhYmxlVG8oKSB7Ci0JCXJldHVybiBhdmFpbGFibGVUbzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdmFpbGFibGVUbyhPYmplY3QgbmV3QXZhaWxhYmxlVG8pIHsKLQkJT2JqZWN0IG9sZEF2YWlsYWJsZVRvID0gYXZhaWxhYmxlVG87Ci0JCWF2YWlsYWJsZVRvID0gbmV3QXZhaWxhYmxlVG87Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9UTywgb2xkQXZhaWxhYmxlVG8sIGF2YWlsYWJsZVRvKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIHN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KE9iamVjdCBuZXdTdGFydCkgewotCQlPYmplY3Qgb2xkU3RhcnQgPSBzdGFydDsKLQkJc3RhcnQgPSBuZXdTdGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBUlQsIG9sZFN0YXJ0LCBzdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmluaXNoKCkgewotCQlyZXR1cm4gZmluaXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmlzaChPYmplY3QgbmV3RmluaXNoKSB7Ci0JCU9iamVjdCBvbGRGaW5pc2ggPSBmaW5pc2g7Ci0JCWZpbmlzaCA9IG5ld0ZpbmlzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRklOSVNILCBvbGRGaW5pc2gsIGZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2FuTGV2ZWwoKSB7Ci0JCXJldHVybiBjYW5MZXZlbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYW5MZXZlbChib29sZWFuIG5ld0NhbkxldmVsKSB7Ci0JCWJvb2xlYW4gb2xkQ2FuTGV2ZWwgPSBjYW5MZXZlbDsKLQkJY2FuTGV2ZWwgPSBuZXdDYW5MZXZlbDsKLQkJYm9vbGVhbiBvbGRDYW5MZXZlbEVTZXQgPSBjYW5MZXZlbEVTZXQ7Ci0JCWNhbkxldmVsRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NBTl9MRVZFTCwgb2xkQ2FuTGV2ZWwsIGNhbkxldmVsLCAhb2xkQ2FuTGV2ZWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDYW5MZXZlbCgpIHsKLQkJYm9vbGVhbiBvbGRDYW5MZXZlbCA9IGNhbkxldmVsOwotCQlib29sZWFuIG9sZENhbkxldmVsRVNldCA9IGNhbkxldmVsRVNldDsKLQkJY2FuTGV2ZWwgPSBDQU5fTEVWRUxfRURFRkFVTFQ7Ci0JCWNhbkxldmVsRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NBTl9MRVZFTCwgb2xkQ2FuTGV2ZWwsIENBTl9MRVZFTF9FREVGQVVMVCwgb2xkQ2FuTGV2ZWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRDYW5MZXZlbCgpIHsKLQkJcmV0dXJuIGNhbkxldmVsRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRBY2NydWVBdCgpIHsKLQkJcmV0dXJuIGFjY3J1ZUF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY3J1ZUF0KEJpZ0ludGVnZXIgbmV3QWNjcnVlQXQpIHsKLQkJQmlnSW50ZWdlciBvbGRBY2NydWVBdCA9IGFjY3J1ZUF0OwotCQlhY2NydWVBdCA9IG5ld0FjY3J1ZUF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ0NSVUVfQVQsIG9sZEFjY3J1ZUF0LCBhY2NydWVBdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0V29yaygpIHsKLQkJcmV0dXJuIHdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29yayhPYmplY3QgbmV3V29yaykgewotCQlPYmplY3Qgb2xkV29yayA9IHdvcms7Ci0JCXdvcmsgPSBuZXdXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLLCBvbGRXb3JrLCB3b3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZWd1bGFyV29yaygpIHsKLQkJcmV0dXJuIHJlZ3VsYXJXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ3VsYXJXb3JrKE9iamVjdCBuZXdSZWd1bGFyV29yaykgewotCQlPYmplY3Qgb2xkUmVndWxhcldvcmsgPSByZWd1bGFyV29yazsKLQkJcmVndWxhcldvcmsgPSBuZXdSZWd1bGFyV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVHVUxBUl9XT1JLLCBvbGRSZWd1bGFyV29yaywgcmVndWxhcldvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE92ZXJ0aW1lV29yaygpIHsKLQkJcmV0dXJuIG92ZXJ0aW1lV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVydGltZVdvcmsoT2JqZWN0IG5ld092ZXJ0aW1lV29yaykgewotCQlPYmplY3Qgb2xkT3ZlcnRpbWVXb3JrID0gb3ZlcnRpbWVXb3JrOwotCQlvdmVydGltZVdvcmsgPSBuZXdPdmVydGltZVdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX1dPUkssIG9sZE92ZXJ0aW1lV29yaywgb3ZlcnRpbWVXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxXb3JrKCkgewotCQlyZXR1cm4gYWN0dWFsV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxXb3JrKE9iamVjdCBuZXdBY3R1YWxXb3JrKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxXb3JrID0gYWN0dWFsV29yazsKLQkJYWN0dWFsV29yayA9IG5ld0FjdHVhbFdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9XT1JLLCBvbGRBY3R1YWxXb3JrLCBhY3R1YWxXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZW1haW5pbmdXb3JrKCkgewotCQlyZXR1cm4gcmVtYWluaW5nV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1haW5pbmdXb3JrKE9iamVjdCBuZXdSZW1haW5pbmdXb3JrKSB7Ci0JCU9iamVjdCBvbGRSZW1haW5pbmdXb3JrID0gcmVtYWluaW5nV29yazsKLQkJcmVtYWluaW5nV29yayA9IG5ld1JlbWFpbmluZ1dvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19XT1JLLCBvbGRSZW1haW5pbmdXb3JrLCByZW1haW5pbmdXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmsoKSB7Ci0JCXJldHVybiBhY3R1YWxPdmVydGltZVdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKE9iamVjdCBuZXdBY3R1YWxPdmVydGltZVdvcmspIHsKLQkJT2JqZWN0IG9sZEFjdHVhbE92ZXJ0aW1lV29yayA9IGFjdHVhbE92ZXJ0aW1lV29yazsKLQkJYWN0dWFsT3ZlcnRpbWVXb3JrID0gbmV3QWN0dWFsT3ZlcnRpbWVXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfT1ZFUlRJTUVfV09SSywgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrLCBhY3R1YWxPdmVydGltZVdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpIHsKLQkJcmV0dXJuIHJlbWFpbmluZ092ZXJ0aW1lV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoT2JqZWN0IG5ld1JlbWFpbmluZ092ZXJ0aW1lV29yaykgewotCQlPYmplY3Qgb2xkUmVtYWluaW5nT3ZlcnRpbWVXb3JrID0gcmVtYWluaW5nT3ZlcnRpbWVXb3JrOwotCQlyZW1haW5pbmdPdmVydGltZVdvcmsgPSBuZXdSZW1haW5pbmdPdmVydGltZVdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLLCBvbGRSZW1haW5pbmdPdmVydGltZVdvcmssIHJlbWFpbmluZ092ZXJ0aW1lV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFBlcmNlbnRXb3JrQ29tcGxldGUoKSB7Ci0JCXJldHVybiBwZXJjZW50V29ya0NvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBlcmNlbnRXb3JrQ29tcGxldGUoQmlnSW50ZWdlciBuZXdQZXJjZW50V29ya0NvbXBsZXRlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkUGVyY2VudFdvcmtDb21wbGV0ZSA9IHBlcmNlbnRXb3JrQ29tcGxldGU7Ci0JCXBlcmNlbnRXb3JrQ29tcGxldGUgPSBuZXdQZXJjZW50V29ya0NvbXBsZXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QRVJDRU5UX1dPUktfQ09NUExFVEUsIG9sZFBlcmNlbnRXb3JrQ29tcGxldGUsIHBlcmNlbnRXb3JrQ29tcGxldGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRTdGFuZGFyZFJhdGUoKSB7Ci0JCXJldHVybiBzdGFuZGFyZFJhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhbmRhcmRSYXRlKEJpZ0RlY2ltYWwgbmV3U3RhbmRhcmRSYXRlKSB7Ci0JCUJpZ0RlY2ltYWwgb2xkU3RhbmRhcmRSYXRlID0gc3RhbmRhcmRSYXRlOwotCQlzdGFuZGFyZFJhdGUgPSBuZXdTdGFuZGFyZFJhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEUsIG9sZFN0YW5kYXJkUmF0ZSwgc3RhbmRhcmRSYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkgewotCQlyZXR1cm4gc3RhbmRhcmRSYXRlRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YW5kYXJkUmF0ZUZvcm1hdChCaWdJbnRlZ2VyIG5ld1N0YW5kYXJkUmF0ZUZvcm1hdCkgewotCQlCaWdJbnRlZ2VyIG9sZFN0YW5kYXJkUmF0ZUZvcm1hdCA9IHN0YW5kYXJkUmF0ZUZvcm1hdDsKLQkJc3RhbmRhcmRSYXRlRm9ybWF0ID0gbmV3U3RhbmRhcmRSYXRlRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFOREFSRF9SQVRFX0ZPUk1BVCwgb2xkU3RhbmRhcmRSYXRlRm9ybWF0LCBzdGFuZGFyZFJhdGVGb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRDb3N0KCkgewotCQlyZXR1cm4gY29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3N0KEJpZ0RlY2ltYWwgbmV3Q29zdCkgewotCQlCaWdEZWNpbWFsIG9sZENvc3QgPSBjb3N0OwotCQljb3N0ID0gbmV3Q29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09TVCwgb2xkQ29zdCwgY29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldE92ZXJ0aW1lUmF0ZSgpIHsKLQkJcmV0dXJuIG92ZXJ0aW1lUmF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVydGltZVJhdGUoQmlnRGVjaW1hbCBuZXdPdmVydGltZVJhdGUpIHsKLQkJQmlnRGVjaW1hbCBvbGRPdmVydGltZVJhdGUgPSBvdmVydGltZVJhdGU7Ci0JCW92ZXJ0aW1lUmF0ZSA9IG5ld092ZXJ0aW1lUmF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfUkFURSwgb2xkT3ZlcnRpbWVSYXRlLCBvdmVydGltZVJhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRPdmVydGltZVJhdGVGb3JtYXQoKSB7Ci0JCXJldHVybiBvdmVydGltZVJhdGVGb3JtYXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVSYXRlRm9ybWF0KEJpZ0ludGVnZXIgbmV3T3ZlcnRpbWVSYXRlRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkT3ZlcnRpbWVSYXRlRm9ybWF0ID0gb3ZlcnRpbWVSYXRlRm9ybWF0OwotCQlvdmVydGltZVJhdGVGb3JtYXQgPSBuZXdPdmVydGltZVJhdGVGb3JtYXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX1JBVEVfRk9STUFULCBvbGRPdmVydGltZVJhdGVGb3JtYXQsIG92ZXJ0aW1lUmF0ZUZvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldE92ZXJ0aW1lQ29zdCgpIHsKLQkJcmV0dXJuIG92ZXJ0aW1lQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVydGltZUNvc3QoQmlnRGVjaW1hbCBuZXdPdmVydGltZUNvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRPdmVydGltZUNvc3QgPSBvdmVydGltZUNvc3Q7Ci0JCW92ZXJ0aW1lQ29zdCA9IG5ld092ZXJ0aW1lQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfQ09TVCwgb2xkT3ZlcnRpbWVDb3N0LCBvdmVydGltZUNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRDb3N0UGVyVXNlKCkgewotCQlyZXR1cm4gY29zdFBlclVzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3N0UGVyVXNlKEJpZ0RlY2ltYWwgbmV3Q29zdFBlclVzZSkgewotCQlCaWdEZWNpbWFsIG9sZENvc3RQZXJVc2UgPSBjb3N0UGVyVXNlOwotCQljb3N0UGVyVXNlID0gbmV3Q29zdFBlclVzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09TVF9QRVJfVVNFLCBvbGRDb3N0UGVyVXNlLCBjb3N0UGVyVXNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0QWN0dWFsQ29zdCgpIHsKLQkJcmV0dXJuIGFjdHVhbENvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsQ29zdChCaWdEZWNpbWFsIG5ld0FjdHVhbENvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRBY3R1YWxDb3N0ID0gYWN0dWFsQ29zdDsKLQkJYWN0dWFsQ29zdCA9IG5ld0FjdHVhbENvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9DT1NULCBvbGRBY3R1YWxDb3N0LCBhY3R1YWxDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkgewotCQlyZXR1cm4gYWN0dWFsT3ZlcnRpbWVDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIG5ld0FjdHVhbE92ZXJ0aW1lQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZEFjdHVhbE92ZXJ0aW1lQ29zdCA9IGFjdHVhbE92ZXJ0aW1lQ29zdDsKLQkJYWN0dWFsT3ZlcnRpbWVDb3N0ID0gbmV3QWN0dWFsT3ZlcnRpbWVDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfT1ZFUlRJTUVfQ09TVCwgb2xkQWN0dWFsT3ZlcnRpbWVDb3N0LCBhY3R1YWxPdmVydGltZUNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRSZW1haW5pbmdDb3N0KCkgewotCQlyZXR1cm4gcmVtYWluaW5nQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1haW5pbmdDb3N0KEJpZ0RlY2ltYWwgbmV3UmVtYWluaW5nQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZFJlbWFpbmluZ0Nvc3QgPSByZW1haW5pbmdDb3N0OwotCQlyZW1haW5pbmdDb3N0ID0gbmV3UmVtYWluaW5nQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX0NPU1QsIG9sZFJlbWFpbmluZ0Nvc3QsIHJlbWFpbmluZ0Nvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKSB7Ci0JCXJldHVybiByZW1haW5pbmdPdmVydGltZUNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgbmV3UmVtYWluaW5nT3ZlcnRpbWVDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkUmVtYWluaW5nT3ZlcnRpbWVDb3N0ID0gcmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCQlyZW1haW5pbmdPdmVydGltZUNvc3QgPSBuZXdSZW1haW5pbmdPdmVydGltZUNvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19PVkVSVElNRV9DT1NULCBvbGRSZW1haW5pbmdPdmVydGltZUNvc3QsIHJlbWFpbmluZ092ZXJ0aW1lQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRXb3JrVmFyaWFuY2UoKSB7Ci0JCXJldHVybiB3b3JrVmFyaWFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29ya1ZhcmlhbmNlKGZsb2F0IG5ld1dvcmtWYXJpYW5jZSkgewotCQlmbG9hdCBvbGRXb3JrVmFyaWFuY2UgPSB3b3JrVmFyaWFuY2U7Ci0JCXdvcmtWYXJpYW5jZSA9IG5ld1dvcmtWYXJpYW5jZTsKLQkJYm9vbGVhbiBvbGRXb3JrVmFyaWFuY2VFU2V0ID0gd29ya1ZhcmlhbmNlRVNldDsKLQkJd29ya1ZhcmlhbmNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1dPUktfVkFSSUFOQ0UsIG9sZFdvcmtWYXJpYW5jZSwgd29ya1ZhcmlhbmNlLCAhb2xkV29ya1ZhcmlhbmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0V29ya1ZhcmlhbmNlKCkgewotCQlmbG9hdCBvbGRXb3JrVmFyaWFuY2UgPSB3b3JrVmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkV29ya1ZhcmlhbmNlRVNldCA9IHdvcmtWYXJpYW5jZUVTZXQ7Ci0JCXdvcmtWYXJpYW5jZSA9IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0JCXdvcmtWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX1ZBUklBTkNFLCBvbGRXb3JrVmFyaWFuY2UsIFdPUktfVkFSSUFOQ0VfRURFRkFVTFQsIG9sZFdvcmtWYXJpYW5jZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFdvcmtWYXJpYW5jZSgpIHsKLQkJcmV0dXJuIHdvcmtWYXJpYW5jZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldENvc3RWYXJpYW5jZSgpIHsKLQkJcmV0dXJuIGNvc3RWYXJpYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3N0VmFyaWFuY2UoZmxvYXQgbmV3Q29zdFZhcmlhbmNlKSB7Ci0JCWZsb2F0IG9sZENvc3RWYXJpYW5jZSA9IGNvc3RWYXJpYW5jZTsKLQkJY29zdFZhcmlhbmNlID0gbmV3Q29zdFZhcmlhbmNlOwotCQlib29sZWFuIG9sZENvc3RWYXJpYW5jZUVTZXQgPSBjb3N0VmFyaWFuY2VFU2V0OwotCQljb3N0VmFyaWFuY2VFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09TVF9WQVJJQU5DRSwgb2xkQ29zdFZhcmlhbmNlLCBjb3N0VmFyaWFuY2UsICFvbGRDb3N0VmFyaWFuY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDb3N0VmFyaWFuY2UoKSB7Ci0JCWZsb2F0IG9sZENvc3RWYXJpYW5jZSA9IGNvc3RWYXJpYW5jZTsKLQkJYm9vbGVhbiBvbGRDb3N0VmFyaWFuY2VFU2V0ID0gY29zdFZhcmlhbmNlRVNldDsKLQkJY29zdFZhcmlhbmNlID0gQ09TVF9WQVJJQU5DRV9FREVGQVVMVDsKLQkJY29zdFZhcmlhbmNlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfVkFSSUFOQ0UsIG9sZENvc3RWYXJpYW5jZSwgQ09TVF9WQVJJQU5DRV9FREVGQVVMVCwgb2xkQ29zdFZhcmlhbmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q29zdFZhcmlhbmNlKCkgewotCQlyZXR1cm4gY29zdFZhcmlhbmNlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0U1YoKSB7Ci0JCXJldHVybiBzVjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTVihmbG9hdCBuZXdTVikgewotCQlmbG9hdCBvbGRTViA9IHNWOwotCQlzViA9IG5ld1NWOwotCQlib29sZWFuIG9sZFNWRVNldCA9IHNWRVNldDsKLQkJc1ZFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1YsIG9sZFNWLCBzViwgIW9sZFNWRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0U1YoKSB7Ci0JCWZsb2F0IG9sZFNWID0gc1Y7Ci0JCWJvb2xlYW4gb2xkU1ZFU2V0ID0gc1ZFU2V0OwotCQlzViA9IFNWX0VERUZBVUxUOwotCQlzVkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TViwgb2xkU1YsIFNWX0VERUZBVUxULCBvbGRTVkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFNWKCkgewotCQlyZXR1cm4gc1ZFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRDVigpIHsKLQkJcmV0dXJuIGNWOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENWKGZsb2F0IG5ld0NWKSB7Ci0JCWZsb2F0IG9sZENWID0gY1Y7Ci0JCWNWID0gbmV3Q1Y7Ci0JCWJvb2xlYW4gb2xkQ1ZFU2V0ID0gY1ZFU2V0OwotCQljVkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DViwgb2xkQ1YsIGNWLCAhb2xkQ1ZFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDVigpIHsKLQkJZmxvYXQgb2xkQ1YgPSBjVjsKLQkJYm9vbGVhbiBvbGRDVkVTZXQgPSBjVkVTZXQ7Ci0JCWNWID0gQ1ZfRURFRkFVTFQ7Ci0JCWNWRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NWLCBvbGRDViwgQ1ZfRURFRkFVTFQsIG9sZENWRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q1YoKSB7Ci0JCXJldHVybiBjVkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEFDV1AoKSB7Ci0JCXJldHVybiBhQ1dQOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFDV1AoZmxvYXQgbmV3QUNXUCkgewotCQlmbG9hdCBvbGRBQ1dQID0gYUNXUDsKLQkJYUNXUCA9IG5ld0FDV1A7Ci0JCWJvb2xlYW4gb2xkQUNXUEVTZXQgPSBhQ1dQRVNldDsKLQkJYUNXUEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1dQLCBvbGRBQ1dQLCBhQ1dQLCAhb2xkQUNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEFDV1AoKSB7Ci0JCWZsb2F0IG9sZEFDV1AgPSBhQ1dQOwotCQlib29sZWFuIG9sZEFDV1BFU2V0ID0gYUNXUEVTZXQ7Ci0JCWFDV1AgPSBBQ1dQX0VERUZBVUxUOwotCQlhQ1dQRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDV1AsIG9sZEFDV1AsIEFDV1BfRURFRkFVTFQsIG9sZEFDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRBQ1dQKCkgewotCQlyZXR1cm4gYUNXUEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q2FsZW5kYXJVSUQoKSB7Ci0JCXJldHVybiBjYWxlbmRhclVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYWxlbmRhclVJRChCaWdJbnRlZ2VyIG5ld0NhbGVuZGFyVUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkQ2FsZW5kYXJVSUQgPSBjYWxlbmRhclVJRDsKLQkJY2FsZW5kYXJVSUQgPSBuZXdDYWxlbmRhclVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FMRU5EQVJfVUlELCBvbGRDYWxlbmRhclVJRCwgY2FsZW5kYXJVSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vdGVzKCkgewotCQlyZXR1cm4gbm90ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm90ZXMoU3RyaW5nIG5ld05vdGVzKSB7Ci0JCVN0cmluZyBvbGROb3RlcyA9IG5vdGVzOwotCQlub3RlcyA9IG5ld05vdGVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OT1RFUywgb2xkTm90ZXMsIG5vdGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1MoKSB7Ci0JCXJldHVybiBiQ1dTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1MoZmxvYXQgbmV3QkNXUykgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYkNXUyA9IG5ld0JDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXU0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dTLCBvbGRCQ1dTLCBiQ1dTLCAhb2xkQkNXU0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1MoKSB7Ci0JCWZsb2F0IG9sZEJDV1MgPSBiQ1dTOwotCQlib29sZWFuIG9sZEJDV1NFU2V0ID0gYkNXU0VTZXQ7Ci0JCWJDV1MgPSBCQ1dTX0VERUZBVUxUOwotCQliQ1dTRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JDV1MsIG9sZEJDV1MsIEJDV1NfRURFRkFVTFQsIG9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXU0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1AoKSB7Ci0JCXJldHVybiBiQ1dQOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1AoZmxvYXQgbmV3QkNXUCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYkNXUCA9IG5ld0JDV1A7Ci0JCWJvb2xlYW4gb2xkQkNXUEVTZXQgPSBiQ1dQRVNldDsKLQkJYkNXUEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dQLCBvbGRCQ1dQLCBiQ1dQLCAhb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1AoKSB7Ci0JCWZsb2F0IG9sZEJDV1AgPSBiQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCQliQ1dQRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JDV1AsIG9sZEJDV1AsIEJDV1BfRURFRkFVTFQsIG9sZEJDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc0dlbmVyaWMoKSB7Ci0JCXJldHVybiBpc0dlbmVyaWM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNHZW5lcmljKGJvb2xlYW4gbmV3SXNHZW5lcmljKSB7Ci0JCWJvb2xlYW4gb2xkSXNHZW5lcmljID0gaXNHZW5lcmljOwotCQlpc0dlbmVyaWMgPSBuZXdJc0dlbmVyaWM7Ci0JCWJvb2xlYW4gb2xkSXNHZW5lcmljRVNldCA9IGlzR2VuZXJpY0VTZXQ7Ci0JCWlzR2VuZXJpY0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19HRU5FUklDLCBvbGRJc0dlbmVyaWMsIGlzR2VuZXJpYywgIW9sZElzR2VuZXJpY0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzR2VuZXJpYygpIHsKLQkJYm9vbGVhbiBvbGRJc0dlbmVyaWMgPSBpc0dlbmVyaWM7Ci0JCWJvb2xlYW4gb2xkSXNHZW5lcmljRVNldCA9IGlzR2VuZXJpY0VTZXQ7Ci0JCWlzR2VuZXJpYyA9IElTX0dFTkVSSUNfRURFRkFVTFQ7Ci0JCWlzR2VuZXJpY0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19HRU5FUklDLCBvbGRJc0dlbmVyaWMsIElTX0dFTkVSSUNfRURFRkFVTFQsIG9sZElzR2VuZXJpY0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzR2VuZXJpYygpIHsKLQkJcmV0dXJuIGlzR2VuZXJpY0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc0luYWN0aXZlKCkgewotCQlyZXR1cm4gaXNJbmFjdGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0luYWN0aXZlKGJvb2xlYW4gbmV3SXNJbmFjdGl2ZSkgewotCQlib29sZWFuIG9sZElzSW5hY3RpdmUgPSBpc0luYWN0aXZlOwotCQlpc0luYWN0aXZlID0gbmV3SXNJbmFjdGl2ZTsKLQkJYm9vbGVhbiBvbGRJc0luYWN0aXZlRVNldCA9IGlzSW5hY3RpdmVFU2V0OwotCQlpc0luYWN0aXZlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0lOQUNUSVZFLCBvbGRJc0luYWN0aXZlLCBpc0luYWN0aXZlLCAhb2xkSXNJbmFjdGl2ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzSW5hY3RpdmUoKSB7Ci0JCWJvb2xlYW4gb2xkSXNJbmFjdGl2ZSA9IGlzSW5hY3RpdmU7Ci0JCWJvb2xlYW4gb2xkSXNJbmFjdGl2ZUVTZXQgPSBpc0luYWN0aXZlRVNldDsKLQkJaXNJbmFjdGl2ZSA9IElTX0lOQUNUSVZFX0VERUZBVUxUOwotCQlpc0luYWN0aXZlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0lOQUNUSVZFLCBvbGRJc0luYWN0aXZlLCBJU19JTkFDVElWRV9FREVGQVVMVCwgb2xkSXNJbmFjdGl2ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzSW5hY3RpdmUoKSB7Ci0JCXJldHVybiBpc0luYWN0aXZlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzRW50ZXJwcmlzZSgpIHsKLQkJcmV0dXJuIGlzRW50ZXJwcmlzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0VudGVycHJpc2UoYm9vbGVhbiBuZXdJc0VudGVycHJpc2UpIHsKLQkJYm9vbGVhbiBvbGRJc0VudGVycHJpc2UgPSBpc0VudGVycHJpc2U7Ci0JCWlzRW50ZXJwcmlzZSA9IG5ld0lzRW50ZXJwcmlzZTsKLQkJYm9vbGVhbiBvbGRJc0VudGVycHJpc2VFU2V0ID0gaXNFbnRlcnByaXNlRVNldDsKLQkJaXNFbnRlcnByaXNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0VOVEVSUFJJU0UsIG9sZElzRW50ZXJwcmlzZSwgaXNFbnRlcnByaXNlLCAhb2xkSXNFbnRlcnByaXNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNFbnRlcnByaXNlKCkgewotCQlib29sZWFuIG9sZElzRW50ZXJwcmlzZSA9IGlzRW50ZXJwcmlzZTsKLQkJYm9vbGVhbiBvbGRJc0VudGVycHJpc2VFU2V0ID0gaXNFbnRlcnByaXNlRVNldDsKLQkJaXNFbnRlcnByaXNlID0gSVNfRU5URVJQUklTRV9FREVGQVVMVDsKLQkJaXNFbnRlcnByaXNlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0VOVEVSUFJJU0UsIG9sZElzRW50ZXJwcmlzZSwgSVNfRU5URVJQUklTRV9FREVGQVVMVCwgb2xkSXNFbnRlcnByaXNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNFbnRlcnByaXNlKCkgewotCQlyZXR1cm4gaXNFbnRlcnByaXNlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRCb29raW5nVHlwZSgpIHsKLQkJcmV0dXJuIGJvb2tpbmdUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvb2tpbmdUeXBlKEJpZ0ludGVnZXIgbmV3Qm9va2luZ1R5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGRCb29raW5nVHlwZSA9IGJvb2tpbmdUeXBlOwotCQlib29raW5nVHlwZSA9IG5ld0Jvb2tpbmdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CT09LSU5HX1RZUEUsIG9sZEJvb2tpbmdUeXBlLCBib29raW5nVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpIHsKLQkJcmV0dXJuIGFjdHVhbFdvcmtQcm90ZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsV29ya1Byb3RlY3RlZChPYmplY3QgbmV3QWN0dWFsV29ya1Byb3RlY3RlZCkgewotCQlPYmplY3Qgb2xkQWN0dWFsV29ya1Byb3RlY3RlZCA9IGFjdHVhbFdvcmtQcm90ZWN0ZWQ7Ci0JCWFjdHVhbFdvcmtQcm90ZWN0ZWQgPSBuZXdBY3R1YWxXb3JrUHJvdGVjdGVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfV09SS19QUk9URUNURUQsIG9sZEFjdHVhbFdvcmtQcm90ZWN0ZWQsIGFjdHVhbFdvcmtQcm90ZWN0ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIHsKLQkJcmV0dXJuIGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoT2JqZWN0IG5ld0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCkgewotCQlPYmplY3Qgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkID0gYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkOwotCQlhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPSBuZXdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRCwgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkLCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFjdGl2ZURpcmVjdG9yeUdVSUQoKSB7Ci0JCXJldHVybiBhY3RpdmVEaXJlY3RvcnlHVUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZURpcmVjdG9yeUdVSUQoU3RyaW5nIG5ld0FjdGl2ZURpcmVjdG9yeUdVSUQpIHsKLQkJU3RyaW5nIG9sZEFjdGl2ZURpcmVjdG9yeUdVSUQgPSBhY3RpdmVEaXJlY3RvcnlHVUlEOwotCQlhY3RpdmVEaXJlY3RvcnlHVUlEID0gbmV3QWN0aXZlRGlyZWN0b3J5R1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUSVZFX0RJUkVDVE9SWV9HVUlELCBvbGRBY3RpdmVEaXJlY3RvcnlHVUlELCBhY3RpdmVEaXJlY3RvcnlHVUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGlvbkRhdGUoKSB7Ci0JCXJldHVybiBjcmVhdGlvbkRhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRpb25EYXRlKE9iamVjdCBuZXdDcmVhdGlvbkRhdGUpIHsKLQkJT2JqZWN0IG9sZENyZWF0aW9uRGF0ZSA9IGNyZWF0aW9uRGF0ZTsKLQkJY3JlYXRpb25EYXRlID0gbmV3Q3JlYXRpb25EYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DUkVBVElPTl9EQVRFLCBvbGRDcmVhdGlvbkRhdGUsIGNyZWF0aW9uRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpIHsKLQkJaWYgKGV4dGVuZGVkQXR0cmlidXRlID09IG51bGwpIHsKLQkJCWV4dGVuZGVkQXR0cmlidXRlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEV4dGVuZGVkQXR0cmlidXRlMy5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRVhURU5ERURfQVRUUklCVVRFKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEJhc2VsaW5lKCkgewotCQlpZiAoYmFzZWxpbmUgPT0gbnVsbCkgewotCQkJYmFzZWxpbmUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQmFzZWxpbmUyLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQVNFTElORSk7Ci0JCX0KLQkJcmV0dXJuIGJhc2VsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRPdXRsaW5lQ29kZSgpIHsKLQkJaWYgKG91dGxpbmVDb2RlID09IG51bGwpIHsKLQkJCW91dGxpbmVDb2RlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE91dGxpbmVDb2RlMy5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1VUTElORV9DT0RFKTsKLQkJfQotCQlyZXR1cm4gb3V0bGluZUNvZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEF2YWlsYWJpbGl0eVBlcmlvZHMgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpIHsKLQkJcmV0dXJuIGF2YWlsYWJpbGl0eVBlcmlvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QXZhaWxhYmlsaXR5UGVyaW9kcyhBdmFpbGFiaWxpdHlQZXJpb2RzIG5ld0F2YWlsYWJpbGl0eVBlcmlvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQXZhaWxhYmlsaXR5UGVyaW9kcyBvbGRBdmFpbGFiaWxpdHlQZXJpb2RzID0gYXZhaWxhYmlsaXR5UGVyaW9kczsKLQkJYXZhaWxhYmlsaXR5UGVyaW9kcyA9IG5ld0F2YWlsYWJpbGl0eVBlcmlvZHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJJTElUWV9QRVJJT0RTLCBvbGRBdmFpbGFiaWxpdHlQZXJpb2RzLCBuZXdBdmFpbGFiaWxpdHlQZXJpb2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdmFpbGFiaWxpdHlQZXJpb2RzKEF2YWlsYWJpbGl0eVBlcmlvZHMgbmV3QXZhaWxhYmlsaXR5UGVyaW9kcykgewotCQlpZiAobmV3QXZhaWxhYmlsaXR5UGVyaW9kcyAhPSBhdmFpbGFiaWxpdHlQZXJpb2RzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhdmFpbGFiaWxpdHlQZXJpb2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWF2YWlsYWJpbGl0eVBlcmlvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QXZhaWxhYmlsaXR5UGVyaW9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBdmFpbGFiaWxpdHlQZXJpb2RzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQklMSVRZX1BFUklPRFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QXZhaWxhYmlsaXR5UGVyaW9kcyhuZXdBdmFpbGFiaWxpdHlQZXJpb2RzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJJTElUWV9QRVJJT0RTLCBuZXdBdmFpbGFiaWxpdHlQZXJpb2RzLCBuZXdBdmFpbGFiaWxpdHlQZXJpb2RzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJhdGVzIGdldFJhdGVzKCkgewotCQlyZXR1cm4gcmF0ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmF0ZXMoUmF0ZXMgbmV3UmF0ZXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUmF0ZXMgb2xkUmF0ZXMgPSByYXRlczsKLQkJcmF0ZXMgPSBuZXdSYXRlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkFURVMsIG9sZFJhdGVzLCBuZXdSYXRlcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmF0ZXMoUmF0ZXMgbmV3UmF0ZXMpIHsKLQkJaWYgKG5ld1JhdGVzICE9IHJhdGVzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyYXRlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyYXRlcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JBVEVTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSYXRlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSYXRlcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JBVEVTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJhdGVzKG5ld1JhdGVzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JBVEVTLCBuZXdSYXRlcywgbmV3UmF0ZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VGltZXBoYXNlZERhdGEoKSB7Ci0JCWlmICh0aW1lcGhhc2VkRGF0YSA9PSBudWxsKSB7Ci0JCQl0aW1lcGhhc2VkRGF0YSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChUaW1lcGhhc2VkRGF0YVR5cGUuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1RJTUVQSEFTRURfREFUQSk7Ci0JCX0KLQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEV4dGVuZGVkQXR0cmlidXRlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JBU0VMSU5FOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEJhc2VsaW5lKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09VVExJTkVfQ09ERToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRPdXRsaW5lQ29kZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0QXZhaWxhYmlsaXR5UGVyaW9kcyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JBVEVTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRSYXRlcyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1RJTUVQSEFTRURfREFUQToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRUaW1lcGhhc2VkRGF0YSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lEOgotCQkJCXJldHVybiBnZXRJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfTlVMTDoKLQkJCQlyZXR1cm4gaXNJc051bGwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lOSVRJQUxTOgotCQkJCXJldHVybiBnZXRJbml0aWFscygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QSE9ORVRJQ1M6Ci0JCQkJcmV0dXJuIGdldFBob25ldGljcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OVEFDQ09VTlQ6Ci0JCQkJcmV0dXJuIGdldE5UQWNjb3VudCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVRFUklBTF9MQUJFTDoKLQkJCQlyZXR1cm4gZ2V0TWF0ZXJpYWxMYWJlbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT0RFOgotCQkJCXJldHVybiBnZXRDb2RlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0dST1VQOgotCQkJCXJldHVybiBnZXRHcm91cCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX0dST1VQOgotCQkJCXJldHVybiBnZXRXb3JrR3JvdXAoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRU1BSUxfQUREUkVTUzoKLQkJCQlyZXR1cm4gZ2V0RW1haWxBZGRyZXNzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOSzoKLQkJCQlyZXR1cm4gZ2V0SHlwZXJsaW5rKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19BRERSRVNTOgotCQkJCXJldHVybiBnZXRIeXBlcmxpbmtBZGRyZXNzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlyZXR1cm4gZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVhfVU5JVFM6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRNYXhVbml0cygpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEVBS19VTklUUzoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldFBlYWtVbml0cygpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJcmV0dXJuIGlzT3ZlckFsbG9jYXRlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQkxFX0ZST006Ci0JCQkJcmV0dXJuIGdldEF2YWlsYWJsZUZyb20oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQkxFX1RPOgotCQkJCXJldHVybiBnZXRBdmFpbGFibGVUbygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFSVDoKLQkJCQlyZXR1cm4gZ2V0U3RhcnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRklOSVNIOgotCQkJCXJldHVybiBnZXRGaW5pc2goKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FOX0xFVkVMOgotCQkJCXJldHVybiBpc0NhbkxldmVsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ0NSVUVfQVQ6Ci0JCQkJcmV0dXJuIGdldEFjY3J1ZUF0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1dPUks6Ci0JCQkJcmV0dXJuIGdldFdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVHVUxBUl9XT1JLOgotCQkJCXJldHVybiBnZXRSZWd1bGFyV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBnZXRPdmVydGltZVdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX1dPUks6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbFdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX1dPUks6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ1dvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbE92ZXJ0aW1lV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlyZXR1cm4gZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFOREFSRF9SQVRFOgotCQkJCXJldHVybiBnZXRTdGFuZGFyZFJhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldFN0YW5kYXJkUmF0ZUZvcm1hdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUOgotCQkJCXJldHVybiBnZXRDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX1JBVEU6Ci0JCQkJcmV0dXJuIGdldE92ZXJ0aW1lUmF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldE92ZXJ0aW1lQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1BFUl9VU0U6Ci0JCQkJcmV0dXJuIGdldENvc3RQZXJVc2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbENvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbE92ZXJ0aW1lQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfQ09TVDoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRXb3JrVmFyaWFuY2UoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRDb3N0VmFyaWFuY2UoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NWOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0U1YoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NWOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0Q1YoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDV1A6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRBQ1dQKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DQUxFTkRBUl9VSUQ6Ci0JCQkJcmV0dXJuIGdldENhbGVuZGFyVUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX05PVEVTOgotCQkJCXJldHVybiBnZXROb3RlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dTOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QkNXUygpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1AoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0dFTkVSSUM6Ci0JCQkJcmV0dXJuIGlzSXNHZW5lcmljKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19JTkFDVElWRToKLQkJCQlyZXR1cm4gaXNJc0luYWN0aXZlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19FTlRFUlBSSVNFOgotCQkJCXJldHVybiBpc0lzRW50ZXJwcmlzZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQk9PS0lOR19UWVBFOgotCQkJCXJldHVybiBnZXRCb29raW5nVHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUSVZFX0RJUkVDVE9SWV9HVUlEOgotCQkJCXJldHVybiBnZXRBY3RpdmVEaXJlY3RvcnlHVUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJcmV0dXJuIGdldENyZWF0aW9uRGF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGdldEV4dGVuZGVkQXR0cmlidXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JBU0VMSU5FOgotCQkJCXJldHVybiBnZXRCYXNlbGluZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVVRMSU5FX0NPREU6Ci0JCQkJcmV0dXJuIGdldE91dGxpbmVDb2RlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJJTElUWV9QRVJJT0RTOgotCQkJCXJldHVybiBnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JBVEVTOgotCQkJCXJldHVybiBnZXRSYXRlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIGdldFRpbWVwaGFzZWREYXRhKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19VSUQ6Ci0JCQkJc2V0VUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lEOgotCQkJCXNldElEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19OVUxMOgotCQkJCXNldElzTnVsbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lOSVRJQUxTOgotCQkJCXNldEluaXRpYWxzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEhPTkVUSUNTOgotCQkJCXNldFBob25ldGljcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX05UQUNDT1VOVDoKLQkJCQlzZXROVEFjY291bnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVRFUklBTF9MQUJFTDoKLQkJCQlzZXRNYXRlcmlhbExhYmVsKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09ERToKLQkJCQlzZXRDb2RlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fR1JPVVA6Ci0JCQkJc2V0R3JvdXAoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX0dST1VQOgotCQkJCXNldFdvcmtHcm91cCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19FTUFJTF9BRERSRVNTOgotCQkJCXNldEVtYWlsQWRkcmVzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOSzoKLQkJCQlzZXRIeXBlcmxpbmsoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtBZGRyZXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSFlQRVJMSU5LX1NVQl9BRERSRVNTOgotCQkJCXNldEh5cGVybGlua1N1YkFkZHJlc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVhfVU5JVFM6Ci0JCQkJc2V0TWF4VW5pdHMoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFQUtfVU5JVFM6Ci0JCQkJc2V0UGVha1VuaXRzKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSX0FMTE9DQVRFRDoKLQkJCQlzZXRPdmVyQWxsb2NhdGVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQkxFX0ZST006Ci0JCQkJc2V0QXZhaWxhYmxlRnJvbSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9UTzoKLQkJCQlzZXRBdmFpbGFibGVUbygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQVJUOgotCQkJCXNldFN0YXJ0KChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRklOSVNIOgotCQkJCXNldEZpbmlzaCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NBTl9MRVZFTDoKLQkJCQlzZXRDYW5MZXZlbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDQ1JVRV9BVDoKLQkJCQlzZXRBY2NydWVBdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLOgotCQkJCXNldFdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRUdVTEFSX1dPUks6Ci0JCQkJc2V0UmVndWxhcldvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9XT1JLOgotCQkJCXNldE92ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9XT1JLOgotCQkJCXNldEFjdHVhbFdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfV09SSzoKLQkJCQlzZXRSZW1haW5pbmdXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFOgotCQkJCXNldFBlcmNlbnRXb3JrQ29tcGxldGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURToKLQkJCQlzZXRTdGFuZGFyZFJhdGUoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURV9GT1JNQVQ6Ci0JCQkJc2V0U3RhbmRhcmRSYXRlRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1Q6Ci0JCQkJc2V0Q29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFOgotCQkJCXNldE92ZXJ0aW1lUmF0ZSgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFX0ZPUk1BVDoKLQkJCQlzZXRPdmVydGltZVJhdGVGb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRPdmVydGltZUNvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09TVF9QRVJfVVNFOgotCQkJCXNldENvc3RQZXJVc2UoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRBY3R1YWxPdmVydGltZUNvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SS19WQVJJQU5DRToKLQkJCQlzZXRXb3JrVmFyaWFuY2UoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfVkFSSUFOQ0U6Ci0JCQkJc2V0Q29zdFZhcmlhbmNlKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVjoKLQkJCQlzZXRTVigoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ1Y6Ci0JCQkJc2V0Q1YoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDV1A6Ci0JCQkJc2V0QUNXUCgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FMRU5EQVJfVUlEOgotCQkJCXNldENhbGVuZGFyVUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX05PVEVTOgotCQkJCXNldE5vdGVzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUzoKLQkJCQlzZXRCQ1dTKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dQOgotCQkJCXNldEJDV1AoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0dFTkVSSUM6Ci0JCQkJc2V0SXNHZW5lcmljKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfSU5BQ1RJVkU6Ci0JCQkJc2V0SXNJbmFjdGl2ZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0VOVEVSUFJJU0U6Ci0JCQkJc2V0SXNFbnRlcnByaXNlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQk9PS0lOR19UWVBFOgotCQkJCXNldEJvb2tpbmdUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRDoKLQkJCQlzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVElWRV9ESVJFQ1RPUllfR1VJRDoKLQkJCQlzZXRBY3RpdmVEaXJlY3RvcnlHVUlEKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ1JFQVRJT05fREFURToKLQkJCQlzZXRDcmVhdGlvbkRhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JBU0VMSU5FOgotCQkJCWdldEJhc2VsaW5lKCkuY2xlYXIoKTsKLQkJCQlnZXRCYXNlbGluZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVVRMSU5FX0NPREU6Ci0JCQkJZ2V0T3V0bGluZUNvZGUoKS5jbGVhcigpOwotCQkJCWdldE91dGxpbmVDb2RlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJJTElUWV9QRVJJT0RTOgotCQkJCXNldEF2YWlsYWJpbGl0eVBlcmlvZHMoKEF2YWlsYWJpbGl0eVBlcmlvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkFURVM6Ci0JCQkJc2V0UmF0ZXMoKFJhdGVzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1RJTUVQSEFTRURfREFUQToKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmNsZWFyKCk7Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lEOgotCQkJCXNldElEKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX05VTEw6Ci0JCQkJdW5zZXRJc051bGwoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lOSVRJQUxTOgotCQkJCXNldEluaXRpYWxzKElOSVRJQUxTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BIT05FVElDUzoKLQkJCQlzZXRQaG9uZXRpY3MoUEhPTkVUSUNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX05UQUNDT1VOVDoKLQkJCQlzZXROVEFjY291bnQoTlRBQ0NPVU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX01BVEVSSUFMX0xBQkVMOgotCQkJCXNldE1hdGVyaWFsTGFiZWwoTUFURVJJQUxfTEFCRUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09ERToKLQkJCQlzZXRDb2RlKENPREVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fR1JPVVA6Ci0JCQkJc2V0R3JvdXAoR1JPVVBfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SS19HUk9VUDoKLQkJCQlzZXRXb3JrR3JvdXAoV09SS19HUk9VUF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19FTUFJTF9BRERSRVNTOgotCQkJCXNldEVtYWlsQWRkcmVzcyhFTUFJTF9BRERSRVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOSzoKLQkJCQlzZXRIeXBlcmxpbmsoSFlQRVJMSU5LX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19BRERSRVNTOgotCQkJCXNldEh5cGVybGlua0FkZHJlc3MoSFlQRVJMSU5LX0FERFJFU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSFlQRVJMSU5LX1NVQl9BRERSRVNTOgotCQkJCXNldEh5cGVybGlua1N1YkFkZHJlc3MoSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX01BWF9VTklUUzoKLQkJCQl1bnNldE1heFVuaXRzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QRUFLX1VOSVRTOgotCQkJCXVuc2V0UGVha1VuaXRzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSX0FMTE9DQVRFRDoKLQkJCQl1bnNldE92ZXJBbGxvY2F0ZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9GUk9NOgotCQkJCXNldEF2YWlsYWJsZUZyb20oQVZBSUxBQkxFX0ZST01fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQkxFX1RPOgotCQkJCXNldEF2YWlsYWJsZVRvKEFWQUlMQUJMRV9UT19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFSVDoKLQkJCQlzZXRTdGFydChTVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19GSU5JU0g6Ci0JCQkJc2V0RmluaXNoKEZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DQU5fTEVWRUw6Ci0JCQkJdW5zZXRDYW5MZXZlbCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNDUlVFX0FUOgotCQkJCXNldEFjY3J1ZUF0KEFDQ1JVRV9BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLOgotCQkJCXNldFdvcmsoV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRUdVTEFSX1dPUks6Ci0JCQkJc2V0UmVndWxhcldvcmsoUkVHVUxBUl9XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0T3ZlcnRpbWVXb3JrKE9WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX1dPUks6Ci0JCQkJc2V0QWN0dWFsV29yayhBQ1RVQUxfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfV09SSzoKLQkJCQlzZXRSZW1haW5pbmdXb3JrKFJFTUFJTklOR19XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29yayhBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFOgotCQkJCXNldFBlcmNlbnRXb3JrQ29tcGxldGUoUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEU6Ci0JCQkJc2V0U3RhbmRhcmRSYXRlKFNUQU5EQVJEX1JBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURV9GT1JNQVQ6Ci0JCQkJc2V0U3RhbmRhcmRSYXRlRm9ybWF0KFNUQU5EQVJEX1JBVEVfRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1Q6Ci0JCQkJc2V0Q29zdChDT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX1JBVEU6Ci0JCQkJc2V0T3ZlcnRpbWVSYXRlKE9WRVJUSU1FX1JBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfUkFURV9GT1JNQVQ6Ci0JCQkJc2V0T3ZlcnRpbWVSYXRlRm9ybWF0KE9WRVJUSU1FX1JBVEVfRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0T3ZlcnRpbWVDb3N0KE9WRVJUSU1FX0NPU1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09TVF9QRVJfVVNFOgotCQkJCXNldENvc3RQZXJVc2UoQ09TVF9QRVJfVVNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9DT1NUOgotCQkJCXNldEFjdHVhbENvc3QoQUNUVUFMX0NPU1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19DT1NUOgotCQkJCXNldFJlbWFpbmluZ0Nvc3QoUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KFJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJdW5zZXRXb3JrVmFyaWFuY2UoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfVkFSSUFOQ0U6Ci0JCQkJdW5zZXRDb3N0VmFyaWFuY2UoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NWOgotCQkJCXVuc2V0U1YoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NWOgotCQkJCXVuc2V0Q1YoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDV1A6Ci0JCQkJdW5zZXRBQ1dQKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DQUxFTkRBUl9VSUQ6Ci0JCQkJc2V0Q2FsZW5kYXJVSUQoQ0FMRU5EQVJfVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX05PVEVTOgotCQkJCXNldE5vdGVzKE5PVEVTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JDV1M6Ci0JCQkJdW5zZXRCQ1dTKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dQOgotCQkJCXVuc2V0QkNXUCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfR0VORVJJQzoKLQkJCQl1bnNldElzR2VuZXJpYygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfSU5BQ1RJVkU6Ci0JCQkJdW5zZXRJc0luYWN0aXZlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19FTlRFUlBSSVNFOgotCQkJCXVuc2V0SXNFbnRlcnByaXNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CT09LSU5HX1RZUEU6Ci0JCQkJc2V0Qm9va2luZ1R5cGUoQk9PS0lOR19UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRDoKLQkJCQlzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKEFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKEFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RJVkVfRElSRUNUT1JZX0dVSUQ6Ci0JCQkJc2V0QWN0aXZlRGlyZWN0b3J5R1VJRChBQ1RJVkVfRElSRUNUT1JZX0dVSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ1JFQVRJT05fREFURToKLQkJCQlzZXRDcmVhdGlvbkRhdGUoQ1JFQVRJT05fREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkFTRUxJTkU6Ci0JCQkJZ2V0QmFzZWxpbmUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1VUTElORV9DT0RFOgotCQkJCWdldE91dGxpbmVDb2RlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJJTElUWV9QRVJJT0RTOgotCQkJCXNldEF2YWlsYWJpbGl0eVBlcmlvZHMoKEF2YWlsYWJpbGl0eVBlcmlvZHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SQVRFUzoKLQkJCQlzZXRSYXRlcygoUmF0ZXMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19VSUQ6Ci0JCQkJcmV0dXJuIFVJRF9FREVGQVVMVCA9PSBudWxsID8gdUlEICE9IG51bGwgOiAhVUlEX0VERUZBVUxULmVxdWFscyh1SUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlEICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19UWVBFOgotCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX05VTEw6Ci0JCQkJcmV0dXJuIGlzU2V0SXNOdWxsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lOSVRJQUxTOgotCQkJCXJldHVybiBJTklUSUFMU19FREVGQVVMVCA9PSBudWxsID8gaW5pdGlhbHMgIT0gbnVsbCA6ICFJTklUSUFMU19FREVGQVVMVC5lcXVhbHMoaW5pdGlhbHMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QSE9ORVRJQ1M6Ci0JCQkJcmV0dXJuIFBIT05FVElDU19FREVGQVVMVCA9PSBudWxsID8gcGhvbmV0aWNzICE9IG51bGwgOiAhUEhPTkVUSUNTX0VERUZBVUxULmVxdWFscyhwaG9uZXRpY3MpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OVEFDQ09VTlQ6Ci0JCQkJcmV0dXJuIE5UQUNDT1VOVF9FREVGQVVMVCA9PSBudWxsID8gblRBY2NvdW50ICE9IG51bGwgOiAhTlRBQ0NPVU5UX0VERUZBVUxULmVxdWFscyhuVEFjY291bnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVRFUklBTF9MQUJFTDoKLQkJCQlyZXR1cm4gTUFURVJJQUxfTEFCRUxfRURFRkFVTFQgPT0gbnVsbCA/IG1hdGVyaWFsTGFiZWwgIT0gbnVsbCA6ICFNQVRFUklBTF9MQUJFTF9FREVGQVVMVC5lcXVhbHMobWF0ZXJpYWxMYWJlbCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPREU6Ci0JCQkJcmV0dXJuIENPREVfRURFRkFVTFQgPT0gbnVsbCA/IGNvZGUgIT0gbnVsbCA6ICFDT0RFX0VERUZBVUxULmVxdWFscyhjb2RlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fR1JPVVA6Ci0JCQkJcmV0dXJuIEdST1VQX0VERUZBVUxUID09IG51bGwgPyBncm91cCAhPSBudWxsIDogIUdST1VQX0VERUZBVUxULmVxdWFscyhncm91cCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1dPUktfR1JPVVA6Ci0JCQkJcmV0dXJuIFdPUktfR1JPVVBfRURFRkFVTFQgPT0gbnVsbCA/IHdvcmtHcm91cCAhPSBudWxsIDogIVdPUktfR1JPVVBfRURFRkFVTFQuZXF1YWxzKHdvcmtHcm91cCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0VNQUlMX0FERFJFU1M6Ci0JCQkJcmV0dXJuIEVNQUlMX0FERFJFU1NfRURFRkFVTFQgPT0gbnVsbCA/IGVtYWlsQWRkcmVzcyAhPSBudWxsIDogIUVNQUlMX0FERFJFU1NfRURFRkFVTFQuZXF1YWxzKGVtYWlsQWRkcmVzcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOSzoKLQkJCQlyZXR1cm4gSFlQRVJMSU5LX0VERUZBVUxUID09IG51bGwgPyBoeXBlcmxpbmsgIT0gbnVsbCA6ICFIWVBFUkxJTktfRURFRkFVTFQuZXF1YWxzKGh5cGVybGluayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19BRERSRVNTOgotCQkJCXJldHVybiBIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVCA9PSBudWxsID8gaHlwZXJsaW5rQWRkcmVzcyAhPSBudWxsIDogIUhZUEVSTElOS19BRERSRVNTX0VERUZBVUxULmVxdWFscyhoeXBlcmxpbmtBZGRyZXNzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSFlQRVJMSU5LX1NVQl9BRERSRVNTOgotCQkJCXJldHVybiBIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQgPT0gbnVsbCA/IGh5cGVybGlua1N1YkFkZHJlc3MgIT0gbnVsbCA6ICFIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQuZXF1YWxzKGh5cGVybGlua1N1YkFkZHJlc3MpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVhfVU5JVFM6Ci0JCQkJcmV0dXJuIGlzU2V0TWF4VW5pdHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEVBS19VTklUUzoKLQkJCQlyZXR1cm4gaXNTZXRQZWFrVW5pdHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJcmV0dXJuIGlzU2V0T3ZlckFsbG9jYXRlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCTEVfRlJPTToKLQkJCQlyZXR1cm4gQVZBSUxBQkxFX0ZST01fRURFRkFVTFQgPT0gbnVsbCA/IGF2YWlsYWJsZUZyb20gIT0gbnVsbCA6ICFBVkFJTEFCTEVfRlJPTV9FREVGQVVMVC5lcXVhbHMoYXZhaWxhYmxlRnJvbSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9UTzoKLQkJCQlyZXR1cm4gQVZBSUxBQkxFX1RPX0VERUZBVUxUID09IG51bGwgPyBhdmFpbGFibGVUbyAhPSBudWxsIDogIUFWQUlMQUJMRV9UT19FREVGQVVMVC5lcXVhbHMoYXZhaWxhYmxlVG8pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFSVDoKLQkJCQlyZXR1cm4gU1RBUlRfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0ICE9IG51bGwgOiAhU1RBUlRfRURFRkFVTFQuZXF1YWxzKHN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRklOSVNIOgotCQkJCXJldHVybiBGSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaCAhPSBudWxsIDogIUZJTklTSF9FREVGQVVMVC5lcXVhbHMoZmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FOX0xFVkVMOgotCQkJCXJldHVybiBpc1NldENhbkxldmVsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDQ1JVRV9BVDoKLQkJCQlyZXR1cm4gQUNDUlVFX0FUX0VERUZBVUxUID09IG51bGwgPyBhY2NydWVBdCAhPSBudWxsIDogIUFDQ1JVRV9BVF9FREVGQVVMVC5lcXVhbHMoYWNjcnVlQXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLOgotCQkJCXJldHVybiBXT1JLX0VERUZBVUxUID09IG51bGwgPyB3b3JrICE9IG51bGwgOiAhV09SS19FREVGQVVMVC5lcXVhbHMod29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFR1VMQVJfV09SSzoKLQkJCQlyZXR1cm4gUkVHVUxBUl9XT1JLX0VERUZBVUxUID09IG51bGwgPyByZWd1bGFyV29yayAhPSBudWxsIDogIVJFR1VMQVJfV09SS19FREVGQVVMVC5lcXVhbHMocmVndWxhcldvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBPVkVSVElNRV9XT1JLX0VERUZBVUxUID09IG51bGwgPyBvdmVydGltZVdvcmsgIT0gbnVsbCA6ICFPVkVSVElNRV9XT1JLX0VERUZBVUxULmVxdWFscyhvdmVydGltZVdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfV09SSzoKLQkJCQlyZXR1cm4gQUNUVUFMX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbFdvcmsgIT0gbnVsbCA6ICFBQ1RVQUxfV09SS19FREVGQVVMVC5lcXVhbHMoYWN0dWFsV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19XT1JLOgotCQkJCXJldHVybiBSRU1BSU5JTkdfV09SS19FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nV29yayAhPSBudWxsIDogIVJFTUFJTklOR19XT1JLX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIEFDVFVBTF9PVkVSVElNRV9XT1JLX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxPdmVydGltZVdvcmsgIT0gbnVsbCA6ICFBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVC5lcXVhbHMoYWN0dWFsT3ZlcnRpbWVXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdPdmVydGltZVdvcmsgIT0gbnVsbCA6ICFSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nT3ZlcnRpbWVXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFOgotCQkJCXJldHVybiBQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQgPT0gbnVsbCA/IHBlcmNlbnRXb3JrQ29tcGxldGUgIT0gbnVsbCA6ICFQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQuZXF1YWxzKHBlcmNlbnRXb3JrQ29tcGxldGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFOREFSRF9SQVRFOgotCQkJCXJldHVybiBTVEFOREFSRF9SQVRFX0VERUZBVUxUID09IG51bGwgPyBzdGFuZGFyZFJhdGUgIT0gbnVsbCA6ICFTVEFOREFSRF9SQVRFX0VERUZBVUxULmVxdWFscyhzdGFuZGFyZFJhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFOREFSRF9SQVRFX0ZPUk1BVDoKLQkJCQlyZXR1cm4gU1RBTkRBUkRfUkFURV9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IHN0YW5kYXJkUmF0ZUZvcm1hdCAhPSBudWxsIDogIVNUQU5EQVJEX1JBVEVfRk9STUFUX0VERUZBVUxULmVxdWFscyhzdGFuZGFyZFJhdGVGb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUOgotCQkJCXJldHVybiBDT1NUX0VERUZBVUxUID09IG51bGwgPyBjb3N0ICE9IG51bGwgOiAhQ09TVF9FREVGQVVMVC5lcXVhbHMoY29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX1JBVEU6Ci0JCQkJcmV0dXJuIE9WRVJUSU1FX1JBVEVfRURFRkFVTFQgPT0gbnVsbCA/IG92ZXJ0aW1lUmF0ZSAhPSBudWxsIDogIU9WRVJUSU1FX1JBVEVfRURFRkFVTFQuZXF1YWxzKG92ZXJ0aW1lUmF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX1JBVEVfRk9STUFUOgotCQkJCXJldHVybiBPVkVSVElNRV9SQVRFX0ZPUk1BVF9FREVGQVVMVCA9PSBudWxsID8gb3ZlcnRpbWVSYXRlRm9ybWF0ICE9IG51bGwgOiAhT1ZFUlRJTUVfUkFURV9GT1JNQVRfRURFRkFVTFQuZXF1YWxzKG92ZXJ0aW1lUmF0ZUZvcm1hdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIE9WRVJUSU1FX0NPU1RfRURFRkFVTFQgPT0gbnVsbCA/IG92ZXJ0aW1lQ29zdCAhPSBudWxsIDogIU9WRVJUSU1FX0NPU1RfRURFRkFVTFQuZXF1YWxzKG92ZXJ0aW1lQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfUEVSX1VTRToKLQkJCQlyZXR1cm4gQ09TVF9QRVJfVVNFX0VERUZBVUxUID09IG51bGwgPyBjb3N0UGVyVXNlICE9IG51bGwgOiAhQ09TVF9QRVJfVVNFX0VERUZBVUxULmVxdWFscyhjb3N0UGVyVXNlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX0NPU1Q6Ci0JCQkJcmV0dXJuIEFDVFVBTF9DT1NUX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxDb3N0ICE9IG51bGwgOiAhQUNUVUFMX0NPU1RfRURFRkFVTFQuZXF1YWxzKGFjdHVhbENvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbE92ZXJ0aW1lQ29zdCAhPSBudWxsIDogIUFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxULmVxdWFscyhhY3R1YWxPdmVydGltZUNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfQ09TVDoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ0Nvc3QgIT0gbnVsbCA6ICFSRU1BSU5JTkdfQ09TVF9FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nT3ZlcnRpbWVDb3N0ICE9IG51bGwgOiAhUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ092ZXJ0aW1lQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIGlzU2V0V29ya1ZhcmlhbmNlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIGlzU2V0Q29zdFZhcmlhbmNlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NWOgotCQkJCXJldHVybiBpc1NldFNWKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NWOgotCQkJCXJldHVybiBpc1NldENWKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDV1A6Ci0JCQkJcmV0dXJuIGlzU2V0QUNXUCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DQUxFTkRBUl9VSUQ6Ci0JCQkJcmV0dXJuIENBTEVOREFSX1VJRF9FREVGQVVMVCA9PSBudWxsID8gY2FsZW5kYXJVSUQgIT0gbnVsbCA6ICFDQUxFTkRBUl9VSURfRURFRkFVTFQuZXF1YWxzKGNhbGVuZGFyVUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTk9URVM6Ci0JCQkJcmV0dXJuIE5PVEVTX0VERUZBVUxUID09IG51bGwgPyBub3RlcyAhPSBudWxsIDogIU5PVEVTX0VERUZBVUxULmVxdWFscyhub3Rlcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JDV1M6Ci0JCQkJcmV0dXJuIGlzU2V0QkNXUygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dQOgotCQkJCXJldHVybiBpc1NldEJDV1AoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfR0VORVJJQzoKLQkJCQlyZXR1cm4gaXNTZXRJc0dlbmVyaWMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfSU5BQ1RJVkU6Ci0JCQkJcmV0dXJuIGlzU2V0SXNJbmFjdGl2ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19FTlRFUlBSSVNFOgotCQkJCXJldHVybiBpc1NldElzRW50ZXJwcmlzZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CT09LSU5HX1RZUEU6Ci0JCQkJcmV0dXJuIEJPT0tJTkdfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gYm9va2luZ1R5cGUgIT0gbnVsbCA6ICFCT09LSU5HX1RZUEVfRURFRkFVTFQuZXF1YWxzKGJvb2tpbmdUeXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbFdvcmtQcm90ZWN0ZWQgIT0gbnVsbCA6ICFBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQuZXF1YWxzKGFjdHVhbFdvcmtQcm90ZWN0ZWQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQ6Ci0JCQkJcmV0dXJuIEFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkICE9IG51bGwgOiAhQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxULmVxdWFscyhhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RJVkVfRElSRUNUT1JZX0dVSUQ6Ci0JCQkJcmV0dXJuIEFDVElWRV9ESVJFQ1RPUllfR1VJRF9FREVGQVVMVCA9PSBudWxsID8gYWN0aXZlRGlyZWN0b3J5R1VJRCAhPSBudWxsIDogIUFDVElWRV9ESVJFQ1RPUllfR1VJRF9FREVGQVVMVC5lcXVhbHMoYWN0aXZlRGlyZWN0b3J5R1VJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJcmV0dXJuIENSRUFUSU9OX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGNyZWF0aW9uRGF0ZSAhPSBudWxsIDogIUNSRUFUSU9OX0RBVEVfRURFRkFVTFQuZXF1YWxzKGNyZWF0aW9uRGF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGUgIT0gbnVsbCAmJiAhZXh0ZW5kZWRBdHRyaWJ1dGUuaXNFbXB0eSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQVNFTElORToKLQkJCQlyZXR1cm4gYmFzZWxpbmUgIT0gbnVsbCAmJiAhYmFzZWxpbmUuaXNFbXB0eSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVVRMSU5FX0NPREU6Ci0JCQkJcmV0dXJuIG91dGxpbmVDb2RlICE9IG51bGwgJiYgIW91dGxpbmVDb2RlLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQklMSVRZX1BFUklPRFM6Ci0JCQkJcmV0dXJuIGF2YWlsYWJpbGl0eVBlcmlvZHMgIT0gbnVsbDsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkFURVM6Ci0JCQkJcmV0dXJuIHJhdGVzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1RJTUVQSEFTRURfREFUQToKLQkJCQlyZXR1cm4gdGltZXBoYXNlZERhdGEgIT0gbnVsbCAmJiAhdGltZXBoYXNlZERhdGEuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1SUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNOdWxsOiAiKTsKLQkJaWYgKGlzTnVsbEVTZXQpIHJlc3VsdC5hcHBlbmQoaXNOdWxsKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaW5pdGlhbHM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGluaXRpYWxzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwaG9uZXRpY3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBob25ldGljcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgblRBY2NvdW50OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuVEFjY291bnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1hdGVyaWFsTGFiZWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1hdGVyaWFsTGFiZWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvZGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvZGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdyb3VwOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd29ya0dyb3VwOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrR3JvdXApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVtYWlsQWRkcmVzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZW1haWxBZGRyZXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoeXBlcmxpbms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh5cGVybGluayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaHlwZXJsaW5rQWRkcmVzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaHlwZXJsaW5rQWRkcmVzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaHlwZXJsaW5rU3ViQWRkcmVzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaHlwZXJsaW5rU3ViQWRkcmVzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWF4VW5pdHM6ICIpOwotCQlpZiAobWF4VW5pdHNFU2V0KSByZXN1bHQuYXBwZW5kKG1heFVuaXRzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGVha1VuaXRzOiAiKTsKLQkJaWYgKHBlYWtVbml0c0VTZXQpIHJlc3VsdC5hcHBlbmQocGVha1VuaXRzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlckFsbG9jYXRlZDogIik7Ci0JCWlmIChvdmVyQWxsb2NhdGVkRVNldCkgcmVzdWx0LmFwcGVuZChvdmVyQWxsb2NhdGVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXZhaWxhYmxlRnJvbTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXZhaWxhYmxlRnJvbSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXZhaWxhYmxlVG86ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF2YWlsYWJsZVRvKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYW5MZXZlbDogIik7Ci0JCWlmIChjYW5MZXZlbEVTZXQpIHJlc3VsdC5hcHBlbmQoY2FuTGV2ZWwpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY2NydWVBdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWNjcnVlQXQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlZ3VsYXJXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZWd1bGFyV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlcnRpbWVXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvdmVydGltZVdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbFdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbFdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ1dvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ1dvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbE92ZXJ0aW1lV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsT3ZlcnRpbWVXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdPdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ092ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGVyY2VudFdvcmtDb21wbGV0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGVyY2VudFdvcmtDb21wbGV0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhbmRhcmRSYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGFuZGFyZFJhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YW5kYXJkUmF0ZUZvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhbmRhcmRSYXRlRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvdmVydGltZVJhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG92ZXJ0aW1lUmF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlcnRpbWVSYXRlRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvdmVydGltZVJhdGVGb3JtYXQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0UGVyVXNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3N0UGVyVXNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZUNvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVtYWluaW5nQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtYWluaW5nQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVtYWluaW5nT3ZlcnRpbWVDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZW1haW5pbmdPdmVydGltZUNvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcmtWYXJpYW5jZTogIik7Ci0JCWlmICh3b3JrVmFyaWFuY2VFU2V0KSByZXN1bHQuYXBwZW5kKHdvcmtWYXJpYW5jZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvc3RWYXJpYW5jZTogIik7Ci0JCWlmIChjb3N0VmFyaWFuY2VFU2V0KSByZXN1bHQuYXBwZW5kKGNvc3RWYXJpYW5jZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNWOiAiKTsKLQkJaWYgKHNWRVNldCkgcmVzdWx0LmFwcGVuZChzVik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNWOiAiKTsKLQkJaWYgKGNWRVNldCkgcmVzdWx0LmFwcGVuZChjVik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFDV1A6ICIpOwotCQlpZiAoYUNXUEVTZXQpIHJlc3VsdC5hcHBlbmQoYUNXUCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhbGVuZGFyVUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYWxlbmRhclVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbm90ZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5vdGVzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dTOiAiKTsKLQkJaWYgKGJDV1NFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1MpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dQOiAiKTsKLQkJaWYgKGJDV1BFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1ApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc0dlbmVyaWM6ICIpOwotCQlpZiAoaXNHZW5lcmljRVNldCkgcmVzdWx0LmFwcGVuZChpc0dlbmVyaWMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc0luYWN0aXZlOiAiKTsKLQkJaWYgKGlzSW5hY3RpdmVFU2V0KSByZXN1bHQuYXBwZW5kKGlzSW5hY3RpdmUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc0VudGVycHJpc2U6ICIpOwotCQlpZiAoaXNFbnRlcnByaXNlRVNldCkgcmVzdWx0LmFwcGVuZChpc0VudGVycHJpc2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBib29raW5nVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYm9va2luZ1R5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbFdvcmtQcm90ZWN0ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbFdvcmtQcm90ZWN0ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3RpdmVEaXJlY3RvcnlHVUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3RpdmVEaXJlY3RvcnlHVUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjcmVhdGlvbkRhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNyZWF0aW9uRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Jlc291cmNlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1Jlc291cmNlc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SZXNvdXJjZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZmU2MzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1Jlc291cmNlc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJlc291cmNlc0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc291cmNlczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlc0ltcGwjZ2V0UmVzb3VyY2UgPGVtPlJlc291cmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUmVzb3VyY2VzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZSgpIDxlbT5SZXNvdXJjZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlc291cmNlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZXNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJlc291cmNlKCkgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmVzb3VyY2UgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUmVzb3VyY2UuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTX19SRVNPVVJDRSk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRVNfX1JFU09VUkNFOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlc291cmNlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRVNfX1JFU09VUkNFOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRVNfX1JFU09VUkNFOgotCQkJCWdldFJlc291cmNlKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNvdXJjZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRVNfX1JFU09VUkNFOgotCQkJCWdldFJlc291cmNlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRVNfX1JFU09VUkNFOgotCQkJCXJldHVybiByZXNvdXJjZSAhPSBudWxsICYmICFyZXNvdXJjZS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL1Jlc291cmNlc0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9UYXNrSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1Rhc2tJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ODc4NDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1Rhc2tJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzQwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGFza0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3Nvckxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0SUQgPGVtPklEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldENyZWF0ZURhdGUgPGVtPkNyZWF0ZSBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Q29udGFjdCA8ZW0+Q29udGFjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFdCUyA8ZW0+V0JTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0V0JTTGV2ZWwgPGVtPldCUyBMZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldE91dGxpbmVOdW1iZXIgPGVtPk91dGxpbmUgTnVtYmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0T3V0bGluZUxldmVsIDxlbT5PdXRsaW5lIExldmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UHJpb3JpdHkgPGVtPlByaW9yaXR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFN0b3AgPGVtPlN0b3A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRSZXN1bWUgPGVtPlJlc3VtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzUmVzdW1lVmFsaWQgPGVtPlJlc3VtZSBWYWxpZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzRWZmb3J0RHJpdmVuIDxlbT5FZmZvcnQgRHJpdmVuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNSZWN1cnJpbmcgPGVtPlJlY3VycmluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzT3ZlckFsbG9jYXRlZCA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc0VzdGltYXRlZCA8ZW0+RXN0aW1hdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzU3VtbWFyeSA8ZW0+U3VtbWFyeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzQ3JpdGljYWwgPGVtPkNyaXRpY2FsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNJc1N1YnByb2plY3QgPGVtPklzIFN1YnByb2plY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc0lzU3VicHJvamVjdFJlYWRPbmx5IDxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFN1YnByb2plY3ROYW1lIDxlbT5TdWJwcm9qZWN0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc0V4dGVybmFsVGFzayA8ZW0+RXh0ZXJuYWwgVGFzazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEV4dGVybmFsVGFza1Byb2plY3QgPGVtPkV4dGVybmFsIFRhc2sgUHJvamVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEVhcmx5U3RhcnQgPGVtPkVhcmx5IFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RWFybHlGaW5pc2ggPGVtPkVhcmx5IEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldExhdGVTdGFydCA8ZW0+TGF0ZSBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldExhdGVGaW5pc2ggPGVtPkxhdGUgRmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0U3RhcnRWYXJpYW5jZSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRGaW5pc2hWYXJpYW5jZSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RnJlZVNsYWNrIDxlbT5GcmVlIFNsYWNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0VG90YWxTbGFjayA8ZW0+VG90YWwgU2xhY2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRGaXhlZENvc3QgPGVtPkZpeGVkIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRGaXhlZENvc3RBY2NydWFsIDxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRQZXJjZW50Q29tcGxldGUgPGVtPlBlcmNlbnQgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0QWN0dWFsU3RhcnQgPGVtPkFjdHVhbCBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEFjdHVhbEZpbmlzaCA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEFjdHVhbER1cmF0aW9uIDxlbT5BY3R1YWwgRHVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxXb3JrIDxlbT5BY3R1YWwgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEFjdHVhbE92ZXJ0aW1lV29yayA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRSZWd1bGFyV29yayA8ZW0+UmVndWxhciBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UmVtYWluaW5nRHVyYXRpb24gPGVtPlJlbWFpbmluZyBEdXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UmVtYWluaW5nV29yayA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEFDV1AgPGVtPkFDV1A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRDViA8ZW0+Q1Y8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRDb25zdHJhaW50VHlwZSA8ZW0+Q29uc3RyYWludCBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldENvbnN0cmFpbnREYXRlIDxlbT5Db25zdHJhaW50IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXREZWFkbGluZSA8ZW0+RGVhZGxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc0xldmVsQXNzaWdubWVudHMgPGVtPkxldmVsIEFzc2lnbm1lbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNMZXZlbGluZ0NhblNwbGl0IDxlbT5MZXZlbGluZyBDYW4gU3BsaXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRMZXZlbGluZ0RlbGF5IDxlbT5MZXZlbGluZyBEZWxheTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldExldmVsaW5nRGVsYXlGb3JtYXQgPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFByZUxldmVsZWRTdGFydCA8ZW0+UHJlIExldmVsZWQgU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRQcmVMZXZlbGVkRmluaXNoIDxlbT5QcmUgTGV2ZWxlZCBGaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEh5cGVybGlua0FkZHJlc3MgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyIDxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXROb3RlcyA8ZW0+Tm90ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc0hpZGVCYXIgPGVtPkhpZGUgQmFyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNSb2xsdXAgPGVtPlJvbGx1cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEJDV1MgPGVtPkJDV1M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUgPGVtPlBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRFYXJuZWRWYWx1ZU1ldGhvZCA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFByZWRlY2Vzc29yTGluayA8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEJhc2VsaW5lIDxlbT5CYXNlbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldE91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFRhc2sgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SUQoKSA8ZW0+SUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SUQoKSA8ZW0+SUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBpRCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNOdWxsKCkgPGVtPklzIE51bGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNOdWxsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfTlVMTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc051bGwoKSA8ZW0+SXMgTnVsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc051bGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTnVsbCA9IElTX05VTExfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIE51bGwgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTnVsbEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcmVhdGVEYXRlKCkgPGVtPkNyZWF0ZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGVEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBDUkVBVEVfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcmVhdGVEYXRlKCkgPGVtPkNyZWF0ZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGVEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZURhdGUgPSBDUkVBVEVfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250YWN0KCkgPGVtPkNvbnRhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnRhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRBQ1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udGFjdCgpIDxlbT5Db250YWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb250YWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnRhY3QgPSBDT05UQUNUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdCUygpIDxlbT5XQlM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdCUygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0JTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdCUygpIDxlbT5XQlM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdCUygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB3QlMgPSBXQlNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V0JTTGV2ZWwoKSA8ZW0+V0JTIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXQlNMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0JTX0xFVkVMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdCU0xldmVsKCkgPGVtPldCUyBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V0JTTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgd0JTTGV2ZWwgPSBXQlNfTEVWRUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3V0bGluZU51bWJlcigpIDxlbT5PdXRsaW5lIE51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3V0bGluZU51bWJlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUTElORV9OVU1CRVJfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3V0bGluZU51bWJlcigpIDxlbT5PdXRsaW5lIE51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3V0bGluZU51bWJlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBvdXRsaW5lTnVtYmVyID0gT1VUTElORV9OVU1CRVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3V0bGluZUxldmVsKCkgPGVtPk91dGxpbmUgTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE91dGxpbmVMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIE9VVExJTkVfTEVWRUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3V0bGluZUxldmVsKCkgPGVtPk91dGxpbmUgTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE91dGxpbmVMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgb3V0bGluZUxldmVsID0gT1VUTElORV9MRVZFTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmlvcml0eSgpIDxlbT5Qcmlvcml0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJpb3JpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBQUklPUklUWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmlvcml0eSgpIDxlbT5Qcmlvcml0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJpb3JpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHByaW9yaXR5ID0gUFJJT1JJVFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBTVEFSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydCgpIDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgc3RhcnQgPSBTVEFSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2goKSA8ZW0+RmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEZJTklTSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2goKSA8ZW0+RmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZmluaXNoID0gRklOSVNIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uKCkgPGVtPkR1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgRFVSQVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb24oKSA8ZW0+RHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldER1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGR1cmF0aW9uID0gRFVSQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbkZvcm1hdCgpIDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdCA9IERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrKCkgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFdPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHdvcmsgPSBXT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0b3AoKSA8ZW0+U3RvcDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RvcCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RPUF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdG9wKCkgPGVtPlN0b3A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0b3AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgc3RvcCA9IFNUT1BfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzdW1lKCkgPGVtPlJlc3VtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzdW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSRVNVTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzdW1lKCkgPGVtPlJlc3VtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzdW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlc3VtZSA9IFJFU1VNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Jlc3VtZVZhbGlkKCkgPGVtPlJlc3VtZSBWYWxpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZXN1bWVWYWxpZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFU1VNRV9WQUxJRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXN1bWVWYWxpZCgpIDxlbT5SZXN1bWUgVmFsaWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVzdW1lVmFsaWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlc3VtZVZhbGlkID0gUkVTVU1FX1ZBTElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSZXN1bWUgVmFsaWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlc3VtZVZhbGlkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRWZmb3J0RHJpdmVuKCkgPGVtPkVmZm9ydCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRWZmb3J0RHJpdmVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRUZGT1JUX0RSSVZFTl9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFZmZvcnREcml2ZW4oKSA8ZW0+RWZmb3J0IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFZmZvcnREcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVmZm9ydERyaXZlbiA9IEVGRk9SVF9EUklWRU5fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEVmZm9ydCBEcml2ZW4gYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVmZm9ydERyaXZlbkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlY3VycmluZygpIDxlbT5SZWN1cnJpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVjdXJyaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVDVVJSSU5HX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlY3VycmluZygpIDxlbT5SZWN1cnJpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVjdXJyaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWN1cnJpbmcgPSBSRUNVUlJJTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJlY3VycmluZyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVjdXJyaW5nRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzT3ZlckFsbG9jYXRlZCgpIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gT1ZFUl9BTExPQ0FURURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzT3ZlckFsbG9jYXRlZCgpIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvdmVyQWxsb2NhdGVkID0gT1ZFUl9BTExPQ0FURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE92ZXIgQWxsb2NhdGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvdmVyQWxsb2NhdGVkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXN0aW1hdGVkKCkgPGVtPkVzdGltYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFc3RpbWF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFU1RJTUFURURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXN0aW1hdGVkKCkgPGVtPkVzdGltYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFc3RpbWF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVzdGltYXRlZCA9IEVTVElNQVRFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRXN0aW1hdGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlc3RpbWF0ZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNaWxlc3RvbmUoKSA8ZW0+TWlsZXN0b25lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01pbGVzdG9uZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1JTEVTVE9ORV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNaWxlc3RvbmUoKSA8ZW0+TWlsZXN0b25lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01pbGVzdG9uZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWlsZXN0b25lID0gTUlMRVNUT05FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNaWxlc3RvbmUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1pbGVzdG9uZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N1bW1hcnkoKSA8ZW0+U3VtbWFyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTdW1tYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1VNTUFSWV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTdW1tYXJ5KCkgPGVtPlN1bW1hcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3VtbWFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VtbWFyeSA9IFNVTU1BUllfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFN1bW1hcnkgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHN1bW1hcnlFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDcml0aWNhbCgpIDxlbT5Dcml0aWNhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDcml0aWNhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENSSVRJQ0FMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0NyaXRpY2FsKCkgPGVtPkNyaXRpY2FsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0NyaXRpY2FsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjcml0aWNhbCA9IENSSVRJQ0FMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDcml0aWNhbCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY3JpdGljYWxFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1N1YnByb2plY3QoKSA8ZW0+SXMgU3VicHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1N1YnByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19TVUJQUk9KRUNUX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzU3VicHJvamVjdCgpIDxlbT5JcyBTdWJwcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzU3VicHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTdWJwcm9qZWN0ID0gSVNfU1VCUFJPSkVDVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgU3VicHJvamVjdCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTdWJwcm9qZWN0RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkoKSA8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19TVUJQUk9KRUNUX1JFQURfT05MWV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1N1YnByb2plY3RSZWFkT25seSgpIDxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTdWJwcm9qZWN0UmVhZE9ubHkgPSBJU19TVUJQUk9KRUNUX1JFQURfT05MWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgU3VicHJvamVjdCBSZWFkIE9ubHkgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3VicHJvamVjdFJlYWRPbmx5RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YnByb2plY3ROYW1lKCkgPGVtPlN1YnByb2plY3QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3VicHJvamVjdE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQlBST0pFQ1RfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJwcm9qZWN0TmFtZSgpIDxlbT5TdWJwcm9qZWN0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YnByb2plY3ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN1YnByb2plY3ROYW1lID0gU1VCUFJPSkVDVF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXh0ZXJuYWxUYXNrKCkgPGVtPkV4dGVybmFsIFRhc2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXh0ZXJuYWxUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRVhURVJOQUxfVEFTS19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeHRlcm5hbFRhc2soKSA8ZW0+RXh0ZXJuYWwgVGFzazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFeHRlcm5hbFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGV4dGVybmFsVGFzayA9IEVYVEVSTkFMX1RBU0tfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEV4dGVybmFsIFRhc2sgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGV4dGVybmFsVGFza0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlcm5hbFRhc2tQcm9qZWN0KCkgPGVtPkV4dGVybmFsIFRhc2sgUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfVEFTS19QUk9KRUNUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsVGFza1Byb2plY3QoKSA8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbFRhc2tQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGV4dGVybmFsVGFza1Byb2plY3QgPSBFWFRFUk5BTF9UQVNLX1BST0pFQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWFybHlTdGFydCgpIDxlbT5FYXJseSBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWFybHlTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgRUFSTFlfU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWFybHlTdGFydCgpIDxlbT5FYXJseSBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWFybHlTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBlYXJseVN0YXJ0ID0gRUFSTFlfU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWFybHlGaW5pc2goKSA8ZW0+RWFybHkgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFYXJseUZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgRUFSTFlfRklOSVNIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVhcmx5RmluaXNoKCkgPGVtPkVhcmx5IEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWFybHlGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZWFybHlGaW5pc2ggPSBFQVJMWV9GSU5JU0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGF0ZVN0YXJ0KCkgPGVtPkxhdGUgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhdGVTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgTEFURV9TVEFSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYXRlU3RhcnQoKSA8ZW0+TGF0ZSBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGF0ZVN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGxhdGVTdGFydCA9IExBVEVfU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGF0ZUZpbmlzaCgpIDxlbT5MYXRlIEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGF0ZUZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgTEFURV9GSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGF0ZUZpbmlzaCgpIDxlbT5MYXRlIEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGF0ZUZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBsYXRlRmluaXNoID0gTEFURV9GSU5JU0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnRWYXJpYW5jZSgpIDxlbT5TdGFydCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnRWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFNUQVJUX1ZBUklBTkNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0VmFyaWFuY2UoKSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHN0YXJ0VmFyaWFuY2UgPSBTVEFSVF9WQVJJQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hWYXJpYW5jZSgpIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgRklOSVNIX1ZBUklBTkNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaFZhcmlhbmNlKCkgPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoVmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGZpbmlzaFZhcmlhbmNlID0gRklOSVNIX1ZBUklBTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtWYXJpYW5jZSgpIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgV09SS19WQVJJQU5DRV9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrVmFyaWFuY2UoKSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgd29ya1ZhcmlhbmNlID0gV09SS19WQVJJQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgV29yayBWYXJpYW5jZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gd29ya1ZhcmlhbmNlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZyZWVTbGFjaygpIDxlbT5GcmVlIFNsYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGcmVlU2xhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBGUkVFX1NMQUNLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZyZWVTbGFjaygpIDxlbT5GcmVlIFNsYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGcmVlU2xhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGZyZWVTbGFjayA9IEZSRUVfU0xBQ0tfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG90YWxTbGFjaygpIDxlbT5Ub3RhbCBTbGFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG90YWxTbGFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRPVEFMX1NMQUNLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvdGFsU2xhY2soKSA8ZW0+VG90YWwgU2xhY2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRvdGFsU2xhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHRvdGFsU2xhY2sgPSBUT1RBTF9TTEFDS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaXhlZENvc3QoKSA8ZW0+Rml4ZWQgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Rml4ZWRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEZJWEVEX0NPU1RfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rml4ZWRDb3N0KCkgPGVtPkZpeGVkIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpeGVkQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGZpeGVkQ29zdCA9IEZJWEVEX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEZpeGVkIENvc3QgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZpeGVkQ29zdEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaXhlZENvc3RBY2NydWFsKCkgPGVtPkZpeGVkIENvc3QgQWNjcnVhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpeGVkQ29zdEFjY3J1YWwoKSA8ZW0+Rml4ZWQgQ29zdCBBY2NydWFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaXhlZENvc3RBY2NydWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpeGVkQ29zdEFjY3J1YWwgPSBGSVhFRF9DT1NUX0FDQ1JVQUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyY2VudENvbXBsZXRlKCkgPGVtPlBlcmNlbnQgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFBFUkNFTlRfQ09NUExFVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyY2VudENvbXBsZXRlKCkgPGVtPlBlcmNlbnQgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgcGVyY2VudENvbXBsZXRlID0gUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFBFUkNFTlRfV09SS19DT01QTEVURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgcGVyY2VudFdvcmtDb21wbGV0ZSA9IFBFUkNFTlRfV09SS19DT01QTEVURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBDT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3QoKSA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgY29zdCA9IENPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVDb3N0KCkgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIE9WRVJUSU1FX0NPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVDb3N0KCkgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgb3ZlcnRpbWVDb3N0ID0gT1ZFUlRJTUVfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVdvcmsoKSA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBPVkVSVElNRV9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lV29yaygpIDxlbT5PdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgb3ZlcnRpbWVXb3JrID0gT1ZFUlRJTUVfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxTdGFydCgpIDxlbT5BY3R1YWwgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsU3RhcnQoKSA8ZW0+QWN0dWFsIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxTdGFydCA9IEFDVFVBTF9TVEFSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxGaW5pc2goKSA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfRklOSVNIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbEZpbmlzaCgpIDxlbT5BY3R1YWwgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsRmluaXNoID0gQUNUVUFMX0ZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxEdXJhdGlvbigpIDxlbT5BY3R1YWwgRHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbER1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfRFVSQVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsRHVyYXRpb24oKSA8ZW0+QWN0dWFsIER1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxEdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxEdXJhdGlvbiA9IEFDVFVBTF9EVVJBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxDb3N0KCkgPGVtPkFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQUNUVUFMX0NPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsQ29zdCgpIDxlbT5BY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgYWN0dWFsQ29zdCA9IEFDVFVBTF9DT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGFjdHVhbE92ZXJ0aW1lQ29zdCA9IEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFdvcmsoKSA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFdvcmsoKSA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsV29yayA9IEFDVFVBTF9XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxPdmVydGltZVdvcmsgPSBBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWd1bGFyV29yaygpIDxlbT5SZWd1bGFyIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZ3VsYXJXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSRUdVTEFSX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVndWxhcldvcmsoKSA8ZW0+UmVndWxhciBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZWd1bGFyV29yayA9IFJFR1VMQVJfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdEdXJhdGlvbigpIDxlbT5SZW1haW5pbmcgRHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ0R1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSRU1BSU5JTkdfRFVSQVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nRHVyYXRpb24oKSA8ZW0+UmVtYWluaW5nIER1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdEdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZW1haW5pbmdEdXJhdGlvbiA9IFJFTUFJTklOR19EVVJBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdDb3N0KCkgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nQ29zdCgpIDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgcmVtYWluaW5nQ29zdCA9IFJFTUFJTklOR19DT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ1dvcmsoKSA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ1dvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFJFTUFJTklOR19XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ1dvcmsoKSA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ1dvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVtYWluaW5nV29yayA9IFJFTUFJTklOR19XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIHJlbWFpbmluZ092ZXJ0aW1lQ29zdCA9IFJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZW1haW5pbmdPdmVydGltZVdvcmsgPSBSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBQ1dQKCkgPGVtPkFDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQUNXUF9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBQ1dQKCkgPGVtPkFDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBhQ1dQID0gQUNXUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQUNXUCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYUNXUEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDVigpIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQ1ZfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q1YoKSA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgY1YgPSBDVl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ1YgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNWRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnN0cmFpbnRUeXBlKCkgPGVtPkNvbnN0cmFpbnQgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29uc3RyYWludFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBDT05TVFJBSU5UX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uc3RyYWludFR5cGUoKSA8ZW0+Q29uc3RyYWludCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25zdHJhaW50VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgY29uc3RyYWludFR5cGUgPSBDT05TVFJBSU5UX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsZW5kYXJVSUQoKSA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIENBTEVOREFSX1VJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWxlbmRhclVJRCgpIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhbGVuZGFyVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBjYWxlbmRhclVJRCA9IENBTEVOREFSX1VJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25zdHJhaW50RGF0ZSgpIDxlbT5Db25zdHJhaW50IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnN0cmFpbnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBDT05TVFJBSU5UX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uc3RyYWludERhdGUoKSA8ZW0+Q29uc3RyYWludCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25zdHJhaW50RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb25zdHJhaW50RGF0ZSA9IENPTlNUUkFJTlRfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWFkbGluZSgpIDxlbT5EZWFkbGluZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVhZGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IERFQURMSU5FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlYWRsaW5lKCkgPGVtPkRlYWRsaW5lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWFkbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkZWFkbGluZSA9IERFQURMSU5FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTGV2ZWxBc3NpZ25tZW50cygpIDxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTEVWRUxfQVNTSUdOTUVOVFNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTGV2ZWxBc3NpZ25tZW50cygpIDxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsZXZlbEFzc2lnbm1lbnRzID0gTEVWRUxfQVNTSUdOTUVOVFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIExldmVsIEFzc2lnbm1lbnRzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsZXZlbEFzc2lnbm1lbnRzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTGV2ZWxpbmdDYW5TcGxpdCgpIDxlbT5MZXZlbGluZyBDYW4gU3BsaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIExFVkVMSU5HX0NBTl9TUExJVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMZXZlbGluZ0NhblNwbGl0KCkgPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNMZXZlbGluZ0NhblNwbGl0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsZXZlbGluZ0NhblNwbGl0ID0gTEVWRUxJTkdfQ0FOX1NQTElUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBMZXZlbGluZyBDYW4gU3BsaXQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGxldmVsaW5nQ2FuU3BsaXRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWxpbmdEZWxheSgpIDxlbT5MZXZlbGluZyBEZWxheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWxpbmdEZWxheSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIExFVkVMSU5HX0RFTEFZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsaW5nRGVsYXkoKSA8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGxldmVsaW5nRGVsYXkgPSBMRVZFTElOR19ERUxBWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCkgPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCkgPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgbGV2ZWxpbmdEZWxheUZvcm1hdCA9IExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVMZXZlbGVkU3RhcnQoKSA8ZW0+UHJlIExldmVsZWQgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZUxldmVsZWRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUFJFX0xFVkVMRURfU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlTGV2ZWxlZFN0YXJ0KCkgPGVtPlByZSBMZXZlbGVkIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVMZXZlbGVkU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcHJlTGV2ZWxlZFN0YXJ0ID0gUFJFX0xFVkVMRURfU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlTGV2ZWxlZEZpbmlzaCgpIDxlbT5QcmUgTGV2ZWxlZCBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZUxldmVsZWRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFBSRV9MRVZFTEVEX0ZJTklTSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVMZXZlbGVkRmluaXNoKCkgPGVtPlByZSBMZXZlbGVkIEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlTGV2ZWxlZEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBwcmVMZXZlbGVkRmluaXNoID0gUFJFX0xFVkVMRURfRklOSVNIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGluaygpIDxlbT5IeXBlcmxpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFlQRVJMSU5LX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGluaygpIDxlbT5IeXBlcmxpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBoeXBlcmxpbmsgPSBIWVBFUkxJTktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rQWRkcmVzcygpIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFlQRVJMSU5LX0FERFJFU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rQWRkcmVzcygpIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBoeXBlcmxpbmtBZGRyZXNzID0gSFlQRVJMSU5LX0FERFJFU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBoeXBlcmxpbmtTdWJBZGRyZXNzID0gSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpIDxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElHTk9SRV9SRVNPVVJDRV9DQUxFTkRBUl9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkgPGVtPklnbm9yZSBSZXNvdXJjZSBDYWxlbmRhcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpZ25vcmVSZXNvdXJjZUNhbGVuZGFyID0gSUdOT1JFX1JFU09VUkNFX0NBTEVOREFSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXIgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlnbm9yZVJlc291cmNlQ2FsZW5kYXJFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90ZXMoKSA8ZW0+Tm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RFU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb3RlcygpIDxlbT5Ob3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbm90ZXMgPSBOT1RFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0hpZGVCYXIoKSA8ZW0+SGlkZSBCYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSGlkZUJhcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEhJREVfQkFSX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0hpZGVCYXIoKSA8ZW0+SGlkZSBCYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSGlkZUJhcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGlkZUJhciA9IEhJREVfQkFSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBIaWRlIEJhciBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGlkZUJhckVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JvbGx1cCgpIDxlbT5Sb2xsdXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUm9sbHVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUk9MTFVQX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JvbGx1cCgpIDxlbT5Sb2xsdXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUm9sbHVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByb2xsdXAgPSBST0xMVVBfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJvbGx1cCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcm9sbHVwRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1MoKSA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBCQ1dTX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1MoKSA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGJDV1MgPSBCQ1dTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBCQ1dTIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiQ1dTRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1AoKSA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBCQ1dQX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJDV1AoKSA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBCQ1dQIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiQ1dQRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKCkgPGVtPlBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpIDxlbT5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgcGh5c2ljYWxQZXJjZW50Q29tcGxldGUgPSBQSFlTSUNBTF9QRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVhcm5lZFZhbHVlTWV0aG9kKCkgPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVhcm5lZFZhbHVlTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZWFybmVkVmFsdWVNZXRob2QgPSBFQVJORURfVkFMVUVfTUVUSE9EX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZGVjZXNzb3JMaW5rKCkgPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcHJlZGVjZXNzb3JMaW5rID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKSA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbFdvcmtQcm90ZWN0ZWQgPSBBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA9IEFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGV4dGVuZGVkQXR0cmlidXRlID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VsaW5lKCkgPGVtPkJhc2VsaW5lPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYmFzZWxpbmUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3V0bGluZUNvZGUoKSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgb3V0bGluZUNvZGUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZXBoYXNlZERhdGEoKSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRpbWVwaGFzZWREYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdGltZXBoYXNlZERhdGEgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFzaygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFVJRCgpIHsKLQkJcmV0dXJuIHVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVSUQoQmlnSW50ZWdlciBuZXdVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRVSUQgPSB1SUQ7Ci0JCXVJRCA9IG5ld1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19VSUQsIG9sZFVJRCwgdUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0SUQoKSB7Ci0JCXJldHVybiBpRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJRChCaWdJbnRlZ2VyIG5ld0lEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkSUQgPSBpRDsKLQkJaUQgPSBuZXdJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JRCwgb2xkSUQsIGlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoQmlnSW50ZWdlciBuZXdUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzTnVsbCgpIHsKLQkJcmV0dXJuIGlzTnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc051bGwoYm9vbGVhbiBuZXdJc051bGwpIHsKLQkJYm9vbGVhbiBvbGRJc051bGwgPSBpc051bGw7Ci0JCWlzTnVsbCA9IG5ld0lzTnVsbDsKLQkJYm9vbGVhbiBvbGRJc051bGxFU2V0ID0gaXNOdWxsRVNldDsKLQkJaXNOdWxsRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfTlVMTCwgb2xkSXNOdWxsLCBpc051bGwsICFvbGRJc051bGxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc051bGwoKSB7Ci0JCWJvb2xlYW4gb2xkSXNOdWxsID0gaXNOdWxsOwotCQlib29sZWFuIG9sZElzTnVsbEVTZXQgPSBpc051bGxFU2V0OwotCQlpc051bGwgPSBJU19OVUxMX0VERUZBVUxUOwotCQlpc051bGxFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19OVUxMLCBvbGRJc051bGwsIElTX05VTExfRURFRkFVTFQsIG9sZElzTnVsbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzTnVsbCgpIHsKLQkJcmV0dXJuIGlzTnVsbEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVEYXRlKCkgewotCQlyZXR1cm4gY3JlYXRlRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDcmVhdGVEYXRlKE9iamVjdCBuZXdDcmVhdGVEYXRlKSB7Ci0JCU9iamVjdCBvbGRDcmVhdGVEYXRlID0gY3JlYXRlRGF0ZTsKLQkJY3JlYXRlRGF0ZSA9IG5ld0NyZWF0ZURhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1JFQVRFX0RBVEUsIG9sZENyZWF0ZURhdGUsIGNyZWF0ZURhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRhY3QoKSB7Ci0JCXJldHVybiBjb250YWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRhY3QoU3RyaW5nIG5ld0NvbnRhY3QpIHsKLQkJU3RyaW5nIG9sZENvbnRhY3QgPSBjb250YWN0OwotCQljb250YWN0ID0gbmV3Q29udGFjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05UQUNULCBvbGRDb250YWN0LCBjb250YWN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXQlMoKSB7Ci0JCXJldHVybiB3QlM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V0JTKFN0cmluZyBuZXdXQlMpIHsKLQkJU3RyaW5nIG9sZFdCUyA9IHdCUzsKLQkJd0JTID0gbmV3V0JTOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dCUywgb2xkV0JTLCB3QlMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdCU0xldmVsKCkgewotCQlyZXR1cm4gd0JTTGV2ZWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V0JTTGV2ZWwoU3RyaW5nIG5ld1dCU0xldmVsKSB7Ci0JCVN0cmluZyBvbGRXQlNMZXZlbCA9IHdCU0xldmVsOwotCQl3QlNMZXZlbCA9IG5ld1dCU0xldmVsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dCU19MRVZFTCwgb2xkV0JTTGV2ZWwsIHdCU0xldmVsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPdXRsaW5lTnVtYmVyKCkgewotCQlyZXR1cm4gb3V0bGluZU51bWJlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdXRsaW5lTnVtYmVyKFN0cmluZyBuZXdPdXRsaW5lTnVtYmVyKSB7Ci0JCVN0cmluZyBvbGRPdXRsaW5lTnVtYmVyID0gb3V0bGluZU51bWJlcjsKLQkJb3V0bGluZU51bWJlciA9IG5ld091dGxpbmVOdW1iZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9OVU1CRVIsIG9sZE91dGxpbmVOdW1iZXIsIG91dGxpbmVOdW1iZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRPdXRsaW5lTGV2ZWwoKSB7Ci0JCXJldHVybiBvdXRsaW5lTGV2ZWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0bGluZUxldmVsKEJpZ0ludGVnZXIgbmV3T3V0bGluZUxldmVsKSB7Ci0JCUJpZ0ludGVnZXIgb2xkT3V0bGluZUxldmVsID0gb3V0bGluZUxldmVsOwotCQlvdXRsaW5lTGV2ZWwgPSBuZXdPdXRsaW5lTGV2ZWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9MRVZFTCwgb2xkT3V0bGluZUxldmVsLCBvdXRsaW5lTGV2ZWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRQcmlvcml0eSgpIHsKLQkJcmV0dXJuIHByaW9yaXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByaW9yaXR5KEJpZ0ludGVnZXIgbmV3UHJpb3JpdHkpIHsKLQkJQmlnSW50ZWdlciBvbGRQcmlvcml0eSA9IHByaW9yaXR5OwotCQlwcmlvcml0eSA9IG5ld1ByaW9yaXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSSU9SSVRZLCBvbGRQcmlvcml0eSwgcHJpb3JpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoT2JqZWN0IG5ld1N0YXJ0KSB7Ci0JCU9iamVjdCBvbGRTdGFydCA9IHN0YXJ0OwotCQlzdGFydCA9IG5ld1N0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUQVJULCBvbGRTdGFydCwgc3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZpbmlzaCgpIHsKLQkJcmV0dXJuIGZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2goT2JqZWN0IG5ld0ZpbmlzaCkgewotCQlPYmplY3Qgb2xkRmluaXNoID0gZmluaXNoOwotCQlmaW5pc2ggPSBuZXdGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklOSVNILCBvbGRGaW5pc2gsIGZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RHVyYXRpb24oKSB7Ci0JCXJldHVybiBkdXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREdXJhdGlvbihPYmplY3QgbmV3RHVyYXRpb24pIHsKLQkJT2JqZWN0IG9sZER1cmF0aW9uID0gZHVyYXRpb247Ci0JCWR1cmF0aW9uID0gbmV3RHVyYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRFVSQVRJT04sIG9sZER1cmF0aW9uLCBkdXJhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldER1cmF0aW9uRm9ybWF0KCkgewotCQlyZXR1cm4gZHVyYXRpb25Gb3JtYXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlciBuZXdEdXJhdGlvbkZvcm1hdCkgewotCQlCaWdJbnRlZ2VyIG9sZER1cmF0aW9uRm9ybWF0ID0gZHVyYXRpb25Gb3JtYXQ7Ci0JCWR1cmF0aW9uRm9ybWF0ID0gbmV3RHVyYXRpb25Gb3JtYXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRFVSQVRJT05fRk9STUFULCBvbGREdXJhdGlvbkZvcm1hdCwgZHVyYXRpb25Gb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFdvcmsoKSB7Ci0JCXJldHVybiB3b3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmsoT2JqZWN0IG5ld1dvcmspIHsKLQkJT2JqZWN0IG9sZFdvcmsgPSB3b3JrOwotCQl3b3JrID0gbmV3V29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XT1JLLCBvbGRXb3JrLCB3b3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTdG9wKCkgewotCQlyZXR1cm4gc3RvcDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdG9wKE9iamVjdCBuZXdTdG9wKSB7Ci0JCU9iamVjdCBvbGRTdG9wID0gc3RvcDsKLQkJc3RvcCA9IG5ld1N0b3A7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RPUCwgb2xkU3RvcCwgc3RvcCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVzdW1lKCkgewotCQlyZXR1cm4gcmVzdW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc3VtZShPYmplY3QgbmV3UmVzdW1lKSB7Ci0JCU9iamVjdCBvbGRSZXN1bWUgPSByZXN1bWU7Ci0JCXJlc3VtZSA9IG5ld1Jlc3VtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRVNVTUUsIG9sZFJlc3VtZSwgcmVzdW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZXN1bWVWYWxpZCgpIHsKLQkJcmV0dXJuIHJlc3VtZVZhbGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc3VtZVZhbGlkKGJvb2xlYW4gbmV3UmVzdW1lVmFsaWQpIHsKLQkJYm9vbGVhbiBvbGRSZXN1bWVWYWxpZCA9IHJlc3VtZVZhbGlkOwotCQlyZXN1bWVWYWxpZCA9IG5ld1Jlc3VtZVZhbGlkOwotCQlib29sZWFuIG9sZFJlc3VtZVZhbGlkRVNldCA9IHJlc3VtZVZhbGlkRVNldDsKLQkJcmVzdW1lVmFsaWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRVNVTUVfVkFMSUQsIG9sZFJlc3VtZVZhbGlkLCByZXN1bWVWYWxpZCwgIW9sZFJlc3VtZVZhbGlkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmVzdW1lVmFsaWQoKSB7Ci0JCWJvb2xlYW4gb2xkUmVzdW1lVmFsaWQgPSByZXN1bWVWYWxpZDsKLQkJYm9vbGVhbiBvbGRSZXN1bWVWYWxpZEVTZXQgPSByZXN1bWVWYWxpZEVTZXQ7Ci0JCXJlc3VtZVZhbGlkID0gUkVTVU1FX1ZBTElEX0VERUZBVUxUOwotCQlyZXN1bWVWYWxpZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFU1VNRV9WQUxJRCwgb2xkUmVzdW1lVmFsaWQsIFJFU1VNRV9WQUxJRF9FREVGQVVMVCwgb2xkUmVzdW1lVmFsaWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZXN1bWVWYWxpZCgpIHsKLQkJcmV0dXJuIHJlc3VtZVZhbGlkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VmZm9ydERyaXZlbigpIHsKLQkJcmV0dXJuIGVmZm9ydERyaXZlbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZmZvcnREcml2ZW4oYm9vbGVhbiBuZXdFZmZvcnREcml2ZW4pIHsKLQkJYm9vbGVhbiBvbGRFZmZvcnREcml2ZW4gPSBlZmZvcnREcml2ZW47Ci0JCWVmZm9ydERyaXZlbiA9IG5ld0VmZm9ydERyaXZlbjsKLQkJYm9vbGVhbiBvbGRFZmZvcnREcml2ZW5FU2V0ID0gZWZmb3J0RHJpdmVuRVNldDsKLQkJZWZmb3J0RHJpdmVuRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUZGT1JUX0RSSVZFTiwgb2xkRWZmb3J0RHJpdmVuLCBlZmZvcnREcml2ZW4sICFvbGRFZmZvcnREcml2ZW5FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRFZmZvcnREcml2ZW4oKSB7Ci0JCWJvb2xlYW4gb2xkRWZmb3J0RHJpdmVuID0gZWZmb3J0RHJpdmVuOwotCQlib29sZWFuIG9sZEVmZm9ydERyaXZlbkVTZXQgPSBlZmZvcnREcml2ZW5FU2V0OwotCQllZmZvcnREcml2ZW4gPSBFRkZPUlRfRFJJVkVOX0VERUZBVUxUOwotCQllZmZvcnREcml2ZW5FU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FRkZPUlRfRFJJVkVOLCBvbGRFZmZvcnREcml2ZW4sIEVGRk9SVF9EUklWRU5fRURFRkFVTFQsIG9sZEVmZm9ydERyaXZlbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEVmZm9ydERyaXZlbigpIHsKLQkJcmV0dXJuIGVmZm9ydERyaXZlbkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWN1cnJpbmcoKSB7Ci0JCXJldHVybiByZWN1cnJpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVjdXJyaW5nKGJvb2xlYW4gbmV3UmVjdXJyaW5nKSB7Ci0JCWJvb2xlYW4gb2xkUmVjdXJyaW5nID0gcmVjdXJyaW5nOwotCQlyZWN1cnJpbmcgPSBuZXdSZWN1cnJpbmc7Ci0JCWJvb2xlYW4gb2xkUmVjdXJyaW5nRVNldCA9IHJlY3VycmluZ0VTZXQ7Ci0JCXJlY3VycmluZ0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFQ1VSUklORywgb2xkUmVjdXJyaW5nLCByZWN1cnJpbmcsICFvbGRSZWN1cnJpbmdFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRSZWN1cnJpbmcoKSB7Ci0JCWJvb2xlYW4gb2xkUmVjdXJyaW5nID0gcmVjdXJyaW5nOwotCQlib29sZWFuIG9sZFJlY3VycmluZ0VTZXQgPSByZWN1cnJpbmdFU2V0OwotCQlyZWN1cnJpbmcgPSBSRUNVUlJJTkdfRURFRkFVTFQ7Ci0JCXJlY3VycmluZ0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFQ1VSUklORywgb2xkUmVjdXJyaW5nLCBSRUNVUlJJTkdfRURFRkFVTFQsIG9sZFJlY3VycmluZ0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJlY3VycmluZygpIHsKLQkJcmV0dXJuIHJlY3VycmluZ0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPdmVyQWxsb2NhdGVkKCkgewotCQlyZXR1cm4gb3ZlckFsbG9jYXRlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVyQWxsb2NhdGVkKGJvb2xlYW4gbmV3T3ZlckFsbG9jYXRlZCkgewotCQlib29sZWFuIG9sZE92ZXJBbGxvY2F0ZWQgPSBvdmVyQWxsb2NhdGVkOwotCQlvdmVyQWxsb2NhdGVkID0gbmV3T3ZlckFsbG9jYXRlZDsKLQkJYm9vbGVhbiBvbGRPdmVyQWxsb2NhdGVkRVNldCA9IG92ZXJBbGxvY2F0ZWRFU2V0OwotCQlvdmVyQWxsb2NhdGVkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUl9BTExPQ0FURUQsIG9sZE92ZXJBbGxvY2F0ZWQsIG92ZXJBbGxvY2F0ZWQsICFvbGRPdmVyQWxsb2NhdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0T3ZlckFsbG9jYXRlZCgpIHsKLQkJYm9vbGVhbiBvbGRPdmVyQWxsb2NhdGVkID0gb3ZlckFsbG9jYXRlZDsKLQkJYm9vbGVhbiBvbGRPdmVyQWxsb2NhdGVkRVNldCA9IG92ZXJBbGxvY2F0ZWRFU2V0OwotCQlvdmVyQWxsb2NhdGVkID0gT1ZFUl9BTExPQ0FURURfRURFRkFVTFQ7Ci0JCW92ZXJBbGxvY2F0ZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSX0FMTE9DQVRFRCwgb2xkT3ZlckFsbG9jYXRlZCwgT1ZFUl9BTExPQ0FURURfRURFRkFVTFQsIG9sZE92ZXJBbGxvY2F0ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRPdmVyQWxsb2NhdGVkKCkgewotCQlyZXR1cm4gb3ZlckFsbG9jYXRlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFc3RpbWF0ZWQoKSB7Ci0JCXJldHVybiBlc3RpbWF0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXN0aW1hdGVkKGJvb2xlYW4gbmV3RXN0aW1hdGVkKSB7Ci0JCWJvb2xlYW4gb2xkRXN0aW1hdGVkID0gZXN0aW1hdGVkOwotCQllc3RpbWF0ZWQgPSBuZXdFc3RpbWF0ZWQ7Ci0JCWJvb2xlYW4gb2xkRXN0aW1hdGVkRVNldCA9IGVzdGltYXRlZEVTZXQ7Ci0JCWVzdGltYXRlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VTVElNQVRFRCwgb2xkRXN0aW1hdGVkLCBlc3RpbWF0ZWQsICFvbGRFc3RpbWF0ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRFc3RpbWF0ZWQoKSB7Ci0JCWJvb2xlYW4gb2xkRXN0aW1hdGVkID0gZXN0aW1hdGVkOwotCQlib29sZWFuIG9sZEVzdGltYXRlZEVTZXQgPSBlc3RpbWF0ZWRFU2V0OwotCQllc3RpbWF0ZWQgPSBFU1RJTUFURURfRURFRkFVTFQ7Ci0JCWVzdGltYXRlZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VTVElNQVRFRCwgb2xkRXN0aW1hdGVkLCBFU1RJTUFURURfRURFRkFVTFQsIG9sZEVzdGltYXRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEVzdGltYXRlZCgpIHsKLQkJcmV0dXJuIGVzdGltYXRlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNaWxlc3RvbmUoKSB7Ci0JCXJldHVybiBtaWxlc3RvbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWlsZXN0b25lKGJvb2xlYW4gbmV3TWlsZXN0b25lKSB7Ci0JCWJvb2xlYW4gb2xkTWlsZXN0b25lID0gbWlsZXN0b25lOwotCQltaWxlc3RvbmUgPSBuZXdNaWxlc3RvbmU7Ci0JCWJvb2xlYW4gb2xkTWlsZXN0b25lRVNldCA9IG1pbGVzdG9uZUVTZXQ7Ci0JCW1pbGVzdG9uZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX01JTEVTVE9ORSwgb2xkTWlsZXN0b25lLCBtaWxlc3RvbmUsICFvbGRNaWxlc3RvbmVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRNaWxlc3RvbmUoKSB7Ci0JCWJvb2xlYW4gb2xkTWlsZXN0b25lID0gbWlsZXN0b25lOwotCQlib29sZWFuIG9sZE1pbGVzdG9uZUVTZXQgPSBtaWxlc3RvbmVFU2V0OwotCQltaWxlc3RvbmUgPSBNSUxFU1RPTkVfRURFRkFVTFQ7Ci0JCW1pbGVzdG9uZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX01JTEVTVE9ORSwgb2xkTWlsZXN0b25lLCBNSUxFU1RPTkVfRURFRkFVTFQsIG9sZE1pbGVzdG9uZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1pbGVzdG9uZSgpIHsKLQkJcmV0dXJuIG1pbGVzdG9uZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdW1tYXJ5KCkgewotCQlyZXR1cm4gc3VtbWFyeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdW1tYXJ5KGJvb2xlYW4gbmV3U3VtbWFyeSkgewotCQlib29sZWFuIG9sZFN1bW1hcnkgPSBzdW1tYXJ5OwotCQlzdW1tYXJ5ID0gbmV3U3VtbWFyeTsKLQkJYm9vbGVhbiBvbGRTdW1tYXJ5RVNldCA9IHN1bW1hcnlFU2V0OwotCQlzdW1tYXJ5RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1VNTUFSWSwgb2xkU3VtbWFyeSwgc3VtbWFyeSwgIW9sZFN1bW1hcnlFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRTdW1tYXJ5KCkgewotCQlib29sZWFuIG9sZFN1bW1hcnkgPSBzdW1tYXJ5OwotCQlib29sZWFuIG9sZFN1bW1hcnlFU2V0ID0gc3VtbWFyeUVTZXQ7Ci0JCXN1bW1hcnkgPSBTVU1NQVJZX0VERUZBVUxUOwotCQlzdW1tYXJ5RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1VNTUFSWSwgb2xkU3VtbWFyeSwgU1VNTUFSWV9FREVGQVVMVCwgb2xkU3VtbWFyeUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFN1bW1hcnkoKSB7Ci0JCXJldHVybiBzdW1tYXJ5RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NyaXRpY2FsKCkgewotCQlyZXR1cm4gY3JpdGljYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JpdGljYWwoYm9vbGVhbiBuZXdDcml0aWNhbCkgewotCQlib29sZWFuIG9sZENyaXRpY2FsID0gY3JpdGljYWw7Ci0JCWNyaXRpY2FsID0gbmV3Q3JpdGljYWw7Ci0JCWJvb2xlYW4gb2xkQ3JpdGljYWxFU2V0ID0gY3JpdGljYWxFU2V0OwotCQljcml0aWNhbEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSSVRJQ0FMLCBvbGRDcml0aWNhbCwgY3JpdGljYWwsICFvbGRDcml0aWNhbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldENyaXRpY2FsKCkgewotCQlib29sZWFuIG9sZENyaXRpY2FsID0gY3JpdGljYWw7Ci0JCWJvb2xlYW4gb2xkQ3JpdGljYWxFU2V0ID0gY3JpdGljYWxFU2V0OwotCQljcml0aWNhbCA9IENSSVRJQ0FMX0VERUZBVUxUOwotCQljcml0aWNhbEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSSVRJQ0FMLCBvbGRDcml0aWNhbCwgQ1JJVElDQUxfRURFRkFVTFQsIG9sZENyaXRpY2FsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q3JpdGljYWwoKSB7Ci0JCXJldHVybiBjcml0aWNhbEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc1N1YnByb2plY3QoKSB7Ci0JCXJldHVybiBpc1N1YnByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNTdWJwcm9qZWN0KGJvb2xlYW4gbmV3SXNTdWJwcm9qZWN0KSB7Ci0JCWJvb2xlYW4gb2xkSXNTdWJwcm9qZWN0ID0gaXNTdWJwcm9qZWN0OwotCQlpc1N1YnByb2plY3QgPSBuZXdJc1N1YnByb2plY3Q7Ci0JCWJvb2xlYW4gb2xkSXNTdWJwcm9qZWN0RVNldCA9IGlzU3VicHJvamVjdEVTZXQ7Ci0JCWlzU3VicHJvamVjdEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1QsIG9sZElzU3VicHJvamVjdCwgaXNTdWJwcm9qZWN0LCAhb2xkSXNTdWJwcm9qZWN0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNTdWJwcm9qZWN0KCkgewotCQlib29sZWFuIG9sZElzU3VicHJvamVjdCA9IGlzU3VicHJvamVjdDsKLQkJYm9vbGVhbiBvbGRJc1N1YnByb2plY3RFU2V0ID0gaXNTdWJwcm9qZWN0RVNldDsKLQkJaXNTdWJwcm9qZWN0ID0gSVNfU1VCUFJPSkVDVF9FREVGQVVMVDsKLQkJaXNTdWJwcm9qZWN0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfU1VCUFJPSkVDVCwgb2xkSXNTdWJwcm9qZWN0LCBJU19TVUJQUk9KRUNUX0VERUZBVUxULCBvbGRJc1N1YnByb2plY3RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc1N1YnByb2plY3QoKSB7Ci0JCXJldHVybiBpc1N1YnByb2plY3RFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNTdWJwcm9qZWN0UmVhZE9ubHkoKSB7Ci0JCXJldHVybiBpc1N1YnByb2plY3RSZWFkT25seTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1N1YnByb2plY3RSZWFkT25seShib29sZWFuIG5ld0lzU3VicHJvamVjdFJlYWRPbmx5KSB7Ci0JCWJvb2xlYW4gb2xkSXNTdWJwcm9qZWN0UmVhZE9ubHkgPSBpc1N1YnByb2plY3RSZWFkT25seTsKLQkJaXNTdWJwcm9qZWN0UmVhZE9ubHkgPSBuZXdJc1N1YnByb2plY3RSZWFkT25seTsKLQkJYm9vbGVhbiBvbGRJc1N1YnByb2plY3RSZWFkT25seUVTZXQgPSBpc1N1YnByb2plY3RSZWFkT25seUVTZXQ7Ci0JCWlzU3VicHJvamVjdFJlYWRPbmx5RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfU1VCUFJPSkVDVF9SRUFEX09OTFksIG9sZElzU3VicHJvamVjdFJlYWRPbmx5LCBpc1N1YnByb2plY3RSZWFkT25seSwgIW9sZElzU3VicHJvamVjdFJlYWRPbmx5RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoKSB7Ci0JCWJvb2xlYW4gb2xkSXNTdWJwcm9qZWN0UmVhZE9ubHkgPSBpc1N1YnByb2plY3RSZWFkT25seTsKLQkJYm9vbGVhbiBvbGRJc1N1YnByb2plY3RSZWFkT25seUVTZXQgPSBpc1N1YnByb2plY3RSZWFkT25seUVTZXQ7Ci0JCWlzU3VicHJvamVjdFJlYWRPbmx5ID0gSVNfU1VCUFJPSkVDVF9SRUFEX09OTFlfRURFRkFVTFQ7Ci0JCWlzU3VicHJvamVjdFJlYWRPbmx5RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfU1VCUFJPSkVDVF9SRUFEX09OTFksIG9sZElzU3VicHJvamVjdFJlYWRPbmx5LCBJU19TVUJQUk9KRUNUX1JFQURfT05MWV9FREVGQVVMVCwgb2xkSXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc1N1YnByb2plY3RSZWFkT25seSgpIHsKLQkJcmV0dXJuIGlzU3VicHJvamVjdFJlYWRPbmx5RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN1YnByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gc3VicHJvamVjdE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3VicHJvamVjdE5hbWUoU3RyaW5nIG5ld1N1YnByb2plY3ROYW1lKSB7Ci0JCVN0cmluZyBvbGRTdWJwcm9qZWN0TmFtZSA9IHN1YnByb2plY3ROYW1lOwotCQlzdWJwcm9qZWN0TmFtZSA9IG5ld1N1YnByb2plY3ROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVQlBST0pFQ1RfTkFNRSwgb2xkU3VicHJvamVjdE5hbWUsIHN1YnByb2plY3ROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbFRhc2soKSB7Ci0JCXJldHVybiBleHRlcm5hbFRhc2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXh0ZXJuYWxUYXNrKGJvb2xlYW4gbmV3RXh0ZXJuYWxUYXNrKSB7Ci0JCWJvb2xlYW4gb2xkRXh0ZXJuYWxUYXNrID0gZXh0ZXJuYWxUYXNrOwotCQlleHRlcm5hbFRhc2sgPSBuZXdFeHRlcm5hbFRhc2s7Ci0JCWJvb2xlYW4gb2xkRXh0ZXJuYWxUYXNrRVNldCA9IGV4dGVybmFsVGFza0VTZXQ7Ci0JCWV4dGVybmFsVGFza0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVSTkFMX1RBU0ssIG9sZEV4dGVybmFsVGFzaywgZXh0ZXJuYWxUYXNrLCAhb2xkRXh0ZXJuYWxUYXNrRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RXh0ZXJuYWxUYXNrKCkgewotCQlib29sZWFuIG9sZEV4dGVybmFsVGFzayA9IGV4dGVybmFsVGFzazsKLQkJYm9vbGVhbiBvbGRFeHRlcm5hbFRhc2tFU2V0ID0gZXh0ZXJuYWxUYXNrRVNldDsKLQkJZXh0ZXJuYWxUYXNrID0gRVhURVJOQUxfVEFTS19FREVGQVVMVDsKLQkJZXh0ZXJuYWxUYXNrRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURVJOQUxfVEFTSywgb2xkRXh0ZXJuYWxUYXNrLCBFWFRFUk5BTF9UQVNLX0VERUZBVUxULCBvbGRFeHRlcm5hbFRhc2tFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRFeHRlcm5hbFRhc2soKSB7Ci0JCXJldHVybiBleHRlcm5hbFRhc2tFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCgpIHsKLQkJcmV0dXJuIGV4dGVybmFsVGFza1Byb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXh0ZXJuYWxUYXNrUHJvamVjdChTdHJpbmcgbmV3RXh0ZXJuYWxUYXNrUHJvamVjdCkgewotCQlTdHJpbmcgb2xkRXh0ZXJuYWxUYXNrUHJvamVjdCA9IGV4dGVybmFsVGFza1Byb2plY3Q7Ci0JCWV4dGVybmFsVGFza1Byb2plY3QgPSBuZXdFeHRlcm5hbFRhc2tQcm9qZWN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVSTkFMX1RBU0tfUFJPSkVDVCwgb2xkRXh0ZXJuYWxUYXNrUHJvamVjdCwgZXh0ZXJuYWxUYXNrUHJvamVjdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RWFybHlTdGFydCgpIHsKLQkJcmV0dXJuIGVhcmx5U3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWFybHlTdGFydChPYmplY3QgbmV3RWFybHlTdGFydCkgewotCQlPYmplY3Qgb2xkRWFybHlTdGFydCA9IGVhcmx5U3RhcnQ7Ci0JCWVhcmx5U3RhcnQgPSBuZXdFYXJseVN0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUkxZX1NUQVJULCBvbGRFYXJseVN0YXJ0LCBlYXJseVN0YXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRFYXJseUZpbmlzaCgpIHsKLQkJcmV0dXJuIGVhcmx5RmluaXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVhcmx5RmluaXNoKE9iamVjdCBuZXdFYXJseUZpbmlzaCkgewotCQlPYmplY3Qgb2xkRWFybHlGaW5pc2ggPSBlYXJseUZpbmlzaDsKLQkJZWFybHlGaW5pc2ggPSBuZXdFYXJseUZpbmlzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJMWV9GSU5JU0gsIG9sZEVhcmx5RmluaXNoLCBlYXJseUZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TGF0ZVN0YXJ0KCkgewotCQlyZXR1cm4gbGF0ZVN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhdGVTdGFydChPYmplY3QgbmV3TGF0ZVN0YXJ0KSB7Ci0JCU9iamVjdCBvbGRMYXRlU3RhcnQgPSBsYXRlU3RhcnQ7Ci0JCWxhdGVTdGFydCA9IG5ld0xhdGVTdGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX1NUQVJULCBvbGRMYXRlU3RhcnQsIGxhdGVTdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TGF0ZUZpbmlzaCgpIHsKLQkJcmV0dXJuIGxhdGVGaW5pc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGF0ZUZpbmlzaChPYmplY3QgbmV3TGF0ZUZpbmlzaCkgewotCQlPYmplY3Qgb2xkTGF0ZUZpbmlzaCA9IGxhdGVGaW5pc2g7Ci0JCWxhdGVGaW5pc2ggPSBuZXdMYXRlRmluaXNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xBVEVfRklOSVNILCBvbGRMYXRlRmluaXNoLCBsYXRlRmluaXNoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0U3RhcnRWYXJpYW5jZSgpIHsKLQkJcmV0dXJuIHN0YXJ0VmFyaWFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRWYXJpYW5jZShCaWdJbnRlZ2VyIG5ld1N0YXJ0VmFyaWFuY2UpIHsKLQkJQmlnSW50ZWdlciBvbGRTdGFydFZhcmlhbmNlID0gc3RhcnRWYXJpYW5jZTsKLQkJc3RhcnRWYXJpYW5jZSA9IG5ld1N0YXJ0VmFyaWFuY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RBUlRfVkFSSUFOQ0UsIG9sZFN0YXJ0VmFyaWFuY2UsIHN0YXJ0VmFyaWFuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRGaW5pc2hWYXJpYW5jZSgpIHsKLQkJcmV0dXJuIGZpbmlzaFZhcmlhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmlzaFZhcmlhbmNlKEJpZ0ludGVnZXIgbmV3RmluaXNoVmFyaWFuY2UpIHsKLQkJQmlnSW50ZWdlciBvbGRGaW5pc2hWYXJpYW5jZSA9IGZpbmlzaFZhcmlhbmNlOwotCQlmaW5pc2hWYXJpYW5jZSA9IG5ld0ZpbmlzaFZhcmlhbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSF9WQVJJQU5DRSwgb2xkRmluaXNoVmFyaWFuY2UsIGZpbmlzaFZhcmlhbmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldFdvcmtWYXJpYW5jZSgpIHsKLQkJcmV0dXJuIHdvcmtWYXJpYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrVmFyaWFuY2UoZmxvYXQgbmV3V29ya1ZhcmlhbmNlKSB7Ci0JCWZsb2F0IG9sZFdvcmtWYXJpYW5jZSA9IHdvcmtWYXJpYW5jZTsKLQkJd29ya1ZhcmlhbmNlID0gbmV3V29ya1ZhcmlhbmNlOwotCQlib29sZWFuIG9sZFdvcmtWYXJpYW5jZUVTZXQgPSB3b3JrVmFyaWFuY2VFU2V0OwotCQl3b3JrVmFyaWFuY2VFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XT1JLX1ZBUklBTkNFLCBvbGRXb3JrVmFyaWFuY2UsIHdvcmtWYXJpYW5jZSwgIW9sZFdvcmtWYXJpYW5jZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFdvcmtWYXJpYW5jZSgpIHsKLQkJZmxvYXQgb2xkV29ya1ZhcmlhbmNlID0gd29ya1ZhcmlhbmNlOwotCQlib29sZWFuIG9sZFdvcmtWYXJpYW5jZUVTZXQgPSB3b3JrVmFyaWFuY2VFU2V0OwotCQl3b3JrVmFyaWFuY2UgPSBXT1JLX1ZBUklBTkNFX0VERUZBVUxUOwotCQl3b3JrVmFyaWFuY2VFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XT1JLX1ZBUklBTkNFLCBvbGRXb3JrVmFyaWFuY2UsIFdPUktfVkFSSUFOQ0VfRURFRkFVTFQsIG9sZFdvcmtWYXJpYW5jZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFdvcmtWYXJpYW5jZSgpIHsKLQkJcmV0dXJuIHdvcmtWYXJpYW5jZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RnJlZVNsYWNrKCkgewotCQlyZXR1cm4gZnJlZVNsYWNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZyZWVTbGFjayhCaWdJbnRlZ2VyIG5ld0ZyZWVTbGFjaykgewotCQlCaWdJbnRlZ2VyIG9sZEZyZWVTbGFjayA9IGZyZWVTbGFjazsKLQkJZnJlZVNsYWNrID0gbmV3RnJlZVNsYWNrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZSRUVfU0xBQ0ssIG9sZEZyZWVTbGFjaywgZnJlZVNsYWNrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VG90YWxTbGFjaygpIHsKLQkJcmV0dXJuIHRvdGFsU2xhY2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG90YWxTbGFjayhCaWdJbnRlZ2VyIG5ld1RvdGFsU2xhY2spIHsKLQkJQmlnSW50ZWdlciBvbGRUb3RhbFNsYWNrID0gdG90YWxTbGFjazsKLQkJdG90YWxTbGFjayA9IG5ld1RvdGFsU2xhY2s7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVE9UQUxfU0xBQ0ssIG9sZFRvdGFsU2xhY2ssIHRvdGFsU2xhY2spKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0Rml4ZWRDb3N0KCkgewotCQlyZXR1cm4gZml4ZWRDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpeGVkQ29zdChmbG9hdCBuZXdGaXhlZENvc3QpIHsKLQkJZmxvYXQgb2xkRml4ZWRDb3N0ID0gZml4ZWRDb3N0OwotCQlmaXhlZENvc3QgPSBuZXdGaXhlZENvc3Q7Ci0JCWJvb2xlYW4gb2xkRml4ZWRDb3N0RVNldCA9IGZpeGVkQ29zdEVTZXQ7Ci0JCWZpeGVkQ29zdEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1QsIG9sZEZpeGVkQ29zdCwgZml4ZWRDb3N0LCAhb2xkRml4ZWRDb3N0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Rml4ZWRDb3N0KCkgewotCQlmbG9hdCBvbGRGaXhlZENvc3QgPSBmaXhlZENvc3Q7Ci0JCWJvb2xlYW4gb2xkRml4ZWRDb3N0RVNldCA9IGZpeGVkQ29zdEVTZXQ7Ci0JCWZpeGVkQ29zdCA9IEZJWEVEX0NPU1RfRURFRkFVTFQ7Ci0JCWZpeGVkQ29zdEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1QsIG9sZEZpeGVkQ29zdCwgRklYRURfQ09TVF9FREVGQVVMVCwgb2xkRml4ZWRDb3N0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Rml4ZWRDb3N0KCkgewotCQlyZXR1cm4gZml4ZWRDb3N0RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpeGVkQ29zdEFjY3J1YWwoKSB7Ci0JCXJldHVybiBmaXhlZENvc3RBY2NydWFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpeGVkQ29zdEFjY3J1YWwoU3RyaW5nIG5ld0ZpeGVkQ29zdEFjY3J1YWwpIHsKLQkJU3RyaW5nIG9sZEZpeGVkQ29zdEFjY3J1YWwgPSBmaXhlZENvc3RBY2NydWFsOwotCQlmaXhlZENvc3RBY2NydWFsID0gbmV3Rml4ZWRDb3N0QWNjcnVhbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSVhFRF9DT1NUX0FDQ1JVQUwsIG9sZEZpeGVkQ29zdEFjY3J1YWwsIGZpeGVkQ29zdEFjY3J1YWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRQZXJjZW50Q29tcGxldGUoKSB7Ci0JCXJldHVybiBwZXJjZW50Q29tcGxldGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVyY2VudENvbXBsZXRlKEJpZ0ludGVnZXIgbmV3UGVyY2VudENvbXBsZXRlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkUGVyY2VudENvbXBsZXRlID0gcGVyY2VudENvbXBsZXRlOwotCQlwZXJjZW50Q29tcGxldGUgPSBuZXdQZXJjZW50Q29tcGxldGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEVSQ0VOVF9DT01QTEVURSwgb2xkUGVyY2VudENvbXBsZXRlLCBwZXJjZW50Q29tcGxldGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkgewotCQlyZXR1cm4gcGVyY2VudFdvcmtDb21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQZXJjZW50V29ya0NvbXBsZXRlKEJpZ0ludGVnZXIgbmV3UGVyY2VudFdvcmtDb21wbGV0ZSkgewotCQlCaWdJbnRlZ2VyIG9sZFBlcmNlbnRXb3JrQ29tcGxldGUgPSBwZXJjZW50V29ya0NvbXBsZXRlOwotCQlwZXJjZW50V29ya0NvbXBsZXRlID0gbmV3UGVyY2VudFdvcmtDb21wbGV0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QRVJDRU5UX1dPUktfQ09NUExFVEUsIG9sZFBlcmNlbnRXb3JrQ29tcGxldGUsIHBlcmNlbnRXb3JrQ29tcGxldGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRDb3N0KCkgewotCQlyZXR1cm4gY29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3N0KEJpZ0RlY2ltYWwgbmV3Q29zdCkgewotCQlCaWdEZWNpbWFsIG9sZENvc3QgPSBjb3N0OwotCQljb3N0ID0gbmV3Q29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT1NULCBvbGRDb3N0LCBjb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0T3ZlcnRpbWVDb3N0KCkgewotCQlyZXR1cm4gb3ZlcnRpbWVDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIG5ld092ZXJ0aW1lQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZE92ZXJ0aW1lQ29zdCA9IG92ZXJ0aW1lQ29zdDsKLQkJb3ZlcnRpbWVDb3N0ID0gbmV3T3ZlcnRpbWVDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJUSU1FX0NPU1QsIG9sZE92ZXJ0aW1lQ29zdCwgb3ZlcnRpbWVDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPdmVydGltZVdvcmsoKSB7Ci0JCXJldHVybiBvdmVydGltZVdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVXb3JrKE9iamVjdCBuZXdPdmVydGltZVdvcmspIHsKLQkJT2JqZWN0IG9sZE92ZXJ0aW1lV29yayA9IG92ZXJ0aW1lV29yazsKLQkJb3ZlcnRpbWVXb3JrID0gbmV3T3ZlcnRpbWVXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJUSU1FX1dPUkssIG9sZE92ZXJ0aW1lV29yaywgb3ZlcnRpbWVXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxTdGFydCgpIHsKLQkJcmV0dXJuIGFjdHVhbFN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbFN0YXJ0KE9iamVjdCBuZXdBY3R1YWxTdGFydCkgewotCQlPYmplY3Qgb2xkQWN0dWFsU3RhcnQgPSBhY3R1YWxTdGFydDsKLQkJYWN0dWFsU3RhcnQgPSBuZXdBY3R1YWxTdGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfU1RBUlQsIG9sZEFjdHVhbFN0YXJ0LCBhY3R1YWxTdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsRmluaXNoKCkgewotCQlyZXR1cm4gYWN0dWFsRmluaXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbEZpbmlzaChPYmplY3QgbmV3QWN0dWFsRmluaXNoKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxGaW5pc2ggPSBhY3R1YWxGaW5pc2g7Ci0JCWFjdHVhbEZpbmlzaCA9IG5ld0FjdHVhbEZpbmlzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfRklOSVNILCBvbGRBY3R1YWxGaW5pc2gsIGFjdHVhbEZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsRHVyYXRpb24oKSB7Ci0JCXJldHVybiBhY3R1YWxEdXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxEdXJhdGlvbihPYmplY3QgbmV3QWN0dWFsRHVyYXRpb24pIHsKLQkJT2JqZWN0IG9sZEFjdHVhbER1cmF0aW9uID0gYWN0dWFsRHVyYXRpb247Ci0JCWFjdHVhbER1cmF0aW9uID0gbmV3QWN0dWFsRHVyYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0RVUkFUSU9OLCBvbGRBY3R1YWxEdXJhdGlvbiwgYWN0dWFsRHVyYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRBY3R1YWxDb3N0KCkgewotCQlyZXR1cm4gYWN0dWFsQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxDb3N0KEJpZ0RlY2ltYWwgbmV3QWN0dWFsQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZEFjdHVhbENvc3QgPSBhY3R1YWxDb3N0OwotCQlhY3R1YWxDb3N0ID0gbmV3QWN0dWFsQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfQ09TVCwgb2xkQWN0dWFsQ29zdCwgYWN0dWFsQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldEFjdHVhbE92ZXJ0aW1lQ29zdCgpIHsKLQkJcmV0dXJuIGFjdHVhbE92ZXJ0aW1lQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxPdmVydGltZUNvc3QoQmlnRGVjaW1hbCBuZXdBY3R1YWxPdmVydGltZUNvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRBY3R1YWxPdmVydGltZUNvc3QgPSBhY3R1YWxPdmVydGltZUNvc3Q7Ci0JCWFjdHVhbE92ZXJ0aW1lQ29zdCA9IG5ld0FjdHVhbE92ZXJ0aW1lQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfT1ZFUlRJTUVfQ09TVCwgb2xkQWN0dWFsT3ZlcnRpbWVDb3N0LCBhY3R1YWxPdmVydGltZUNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbFdvcmsoKSB7Ci0JCXJldHVybiBhY3R1YWxXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbFdvcmsoT2JqZWN0IG5ld0FjdHVhbFdvcmspIHsKLQkJT2JqZWN0IG9sZEFjdHVhbFdvcmsgPSBhY3R1YWxXb3JrOwotCQlhY3R1YWxXb3JrID0gbmV3QWN0dWFsV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfV09SSywgb2xkQWN0dWFsV29yaywgYWN0dWFsV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkgewotCQlyZXR1cm4gYWN0dWFsT3ZlcnRpbWVXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbE92ZXJ0aW1lV29yayhPYmplY3QgbmV3QWN0dWFsT3ZlcnRpbWVXb3JrKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxPdmVydGltZVdvcmsgPSBhY3R1YWxPdmVydGltZVdvcms7Ci0JCWFjdHVhbE92ZXJ0aW1lV29yayA9IG5ld0FjdHVhbE92ZXJ0aW1lV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfT1ZFUlRJTUVfV09SSywgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrLCBhY3R1YWxPdmVydGltZVdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlZ3VsYXJXb3JrKCkgewotCQlyZXR1cm4gcmVndWxhcldvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVndWxhcldvcmsoT2JqZWN0IG5ld1JlZ3VsYXJXb3JrKSB7Ci0JCU9iamVjdCBvbGRSZWd1bGFyV29yayA9IHJlZ3VsYXJXb3JrOwotCQlyZWd1bGFyV29yayA9IG5ld1JlZ3VsYXJXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFR1VMQVJfV09SSywgb2xkUmVndWxhcldvcmssIHJlZ3VsYXJXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZW1haW5pbmdEdXJhdGlvbigpIHsKLQkJcmV0dXJuIHJlbWFpbmluZ0R1cmF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ0R1cmF0aW9uKE9iamVjdCBuZXdSZW1haW5pbmdEdXJhdGlvbikgewotCQlPYmplY3Qgb2xkUmVtYWluaW5nRHVyYXRpb24gPSByZW1haW5pbmdEdXJhdGlvbjsKLQkJcmVtYWluaW5nRHVyYXRpb24gPSBuZXdSZW1haW5pbmdEdXJhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfRFVSQVRJT04sIG9sZFJlbWFpbmluZ0R1cmF0aW9uLCByZW1haW5pbmdEdXJhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldFJlbWFpbmluZ0Nvc3QoKSB7Ci0JCXJldHVybiByZW1haW5pbmdDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ0Nvc3QoQmlnRGVjaW1hbCBuZXdSZW1haW5pbmdDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkUmVtYWluaW5nQ29zdCA9IHJlbWFpbmluZ0Nvc3Q7Ci0JCXJlbWFpbmluZ0Nvc3QgPSBuZXdSZW1haW5pbmdDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19DT1NULCBvbGRSZW1haW5pbmdDb3N0LCByZW1haW5pbmdDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZW1haW5pbmdXb3JrKCkgewotCQlyZXR1cm4gcmVtYWluaW5nV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1haW5pbmdXb3JrKE9iamVjdCBuZXdSZW1haW5pbmdXb3JrKSB7Ci0JCU9iamVjdCBvbGRSZW1haW5pbmdXb3JrID0gcmVtYWluaW5nV29yazsKLQkJcmVtYWluaW5nV29yayA9IG5ld1JlbWFpbmluZ1dvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX1dPUkssIG9sZFJlbWFpbmluZ1dvcmssIHJlbWFpbmluZ1dvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKSB7Ci0JCXJldHVybiByZW1haW5pbmdPdmVydGltZUNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgbmV3UmVtYWluaW5nT3ZlcnRpbWVDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkUmVtYWluaW5nT3ZlcnRpbWVDb3N0ID0gcmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCQlyZW1haW5pbmdPdmVydGltZUNvc3QgPSBuZXdSZW1haW5pbmdPdmVydGltZUNvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1QsIG9sZFJlbWFpbmluZ092ZXJ0aW1lQ29zdCwgcmVtYWluaW5nT3ZlcnRpbWVDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKSB7Ci0JCXJldHVybiByZW1haW5pbmdPdmVydGltZVdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKE9iamVjdCBuZXdSZW1haW5pbmdPdmVydGltZVdvcmspIHsKLQkJT2JqZWN0IG9sZFJlbWFpbmluZ092ZXJ0aW1lV29yayA9IHJlbWFpbmluZ092ZXJ0aW1lV29yazsKLQkJcmVtYWluaW5nT3ZlcnRpbWVXb3JrID0gbmV3UmVtYWluaW5nT3ZlcnRpbWVXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLLCBvbGRSZW1haW5pbmdPdmVydGltZVdvcmssIHJlbWFpbmluZ092ZXJ0aW1lV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRBQ1dQKCkgewotCQlyZXR1cm4gYUNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBQ1dQKGZsb2F0IG5ld0FDV1ApIHsKLQkJZmxvYXQgb2xkQUNXUCA9IGFDV1A7Ci0JCWFDV1AgPSBuZXdBQ1dQOwotCQlib29sZWFuIG9sZEFDV1BFU2V0ID0gYUNXUEVTZXQ7Ci0JCWFDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1dQLCBvbGRBQ1dQLCBhQ1dQLCAhb2xkQUNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEFDV1AoKSB7Ci0JCWZsb2F0IG9sZEFDV1AgPSBhQ1dQOwotCQlib29sZWFuIG9sZEFDV1BFU2V0ID0gYUNXUEVTZXQ7Ci0JCWFDV1AgPSBBQ1dQX0VERUZBVUxUOwotCQlhQ1dQRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNXUCwgb2xkQUNXUCwgQUNXUF9FREVGQVVMVCwgb2xkQUNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEFDV1AoKSB7Ci0JCXJldHVybiBhQ1dQRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0Q1YoKSB7Ci0JCXJldHVybiBjVjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDVihmbG9hdCBuZXdDVikgewotCQlmbG9hdCBvbGRDViA9IGNWOwotCQljViA9IG5ld0NWOwotCQlib29sZWFuIG9sZENWRVNldCA9IGNWRVNldDsKLQkJY1ZFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DViwgb2xkQ1YsIGNWLCAhb2xkQ1ZFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDVigpIHsKLQkJZmxvYXQgb2xkQ1YgPSBjVjsKLQkJYm9vbGVhbiBvbGRDVkVTZXQgPSBjVkVTZXQ7Ci0JCWNWID0gQ1ZfRURFRkFVTFQ7Ci0JCWNWRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1YsIG9sZENWLCBDVl9FREVGQVVMVCwgb2xkQ1ZFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRDVigpIHsKLQkJcmV0dXJuIGNWRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRDb25zdHJhaW50VHlwZSgpIHsKLQkJcmV0dXJuIGNvbnN0cmFpbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnN0cmFpbnRUeXBlKEJpZ0ludGVnZXIgbmV3Q29uc3RyYWludFR5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGRDb25zdHJhaW50VHlwZSA9IGNvbnN0cmFpbnRUeXBlOwotCQljb25zdHJhaW50VHlwZSA9IG5ld0NvbnN0cmFpbnRUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfVFlQRSwgb2xkQ29uc3RyYWludFR5cGUsIGNvbnN0cmFpbnRUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q2FsZW5kYXJVSUQoKSB7Ci0JCXJldHVybiBjYWxlbmRhclVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYWxlbmRhclVJRChCaWdJbnRlZ2VyIG5ld0NhbGVuZGFyVUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkQ2FsZW5kYXJVSUQgPSBjYWxlbmRhclVJRDsKLQkJY2FsZW5kYXJVSUQgPSBuZXdDYWxlbmRhclVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DQUxFTkRBUl9VSUQsIG9sZENhbGVuZGFyVUlELCBjYWxlbmRhclVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29uc3RyYWludERhdGUoKSB7Ci0JCXJldHVybiBjb25zdHJhaW50RGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW50RGF0ZShPYmplY3QgbmV3Q29uc3RyYWludERhdGUpIHsKLQkJT2JqZWN0IG9sZENvbnN0cmFpbnREYXRlID0gY29uc3RyYWludERhdGU7Ci0JCWNvbnN0cmFpbnREYXRlID0gbmV3Q29uc3RyYWludERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09OU1RSQUlOVF9EQVRFLCBvbGRDb25zdHJhaW50RGF0ZSwgY29uc3RyYWludERhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERlYWRsaW5lKCkgewotCQlyZXR1cm4gZGVhZGxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVhZGxpbmUoT2JqZWN0IG5ld0RlYWRsaW5lKSB7Ci0JCU9iamVjdCBvbGREZWFkbGluZSA9IGRlYWRsaW5lOwotCQlkZWFkbGluZSA9IG5ld0RlYWRsaW5lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RFQURMSU5FLCBvbGREZWFkbGluZSwgZGVhZGxpbmUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xldmVsQXNzaWdubWVudHMoKSB7Ci0JCXJldHVybiBsZXZlbEFzc2lnbm1lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExldmVsQXNzaWdubWVudHMoYm9vbGVhbiBuZXdMZXZlbEFzc2lnbm1lbnRzKSB7Ci0JCWJvb2xlYW4gb2xkTGV2ZWxBc3NpZ25tZW50cyA9IGxldmVsQXNzaWdubWVudHM7Ci0JCWxldmVsQXNzaWdubWVudHMgPSBuZXdMZXZlbEFzc2lnbm1lbnRzOwotCQlib29sZWFuIG9sZExldmVsQXNzaWdubWVudHNFU2V0ID0gbGV2ZWxBc3NpZ25tZW50c0VTZXQ7Ci0JCWxldmVsQXNzaWdubWVudHNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTF9BU1NJR05NRU5UUywgb2xkTGV2ZWxBc3NpZ25tZW50cywgbGV2ZWxBc3NpZ25tZW50cywgIW9sZExldmVsQXNzaWdubWVudHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRMZXZlbEFzc2lnbm1lbnRzKCkgewotCQlib29sZWFuIG9sZExldmVsQXNzaWdubWVudHMgPSBsZXZlbEFzc2lnbm1lbnRzOwotCQlib29sZWFuIG9sZExldmVsQXNzaWdubWVudHNFU2V0ID0gbGV2ZWxBc3NpZ25tZW50c0VTZXQ7Ci0JCWxldmVsQXNzaWdubWVudHMgPSBMRVZFTF9BU1NJR05NRU5UU19FREVGQVVMVDsKLQkJbGV2ZWxBc3NpZ25tZW50c0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMX0FTU0lHTk1FTlRTLCBvbGRMZXZlbEFzc2lnbm1lbnRzLCBMRVZFTF9BU1NJR05NRU5UU19FREVGQVVMVCwgb2xkTGV2ZWxBc3NpZ25tZW50c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldExldmVsQXNzaWdubWVudHMoKSB7Ci0JCXJldHVybiBsZXZlbEFzc2lnbm1lbnRzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xldmVsaW5nQ2FuU3BsaXQoKSB7Ci0JCXJldHVybiBsZXZlbGluZ0NhblNwbGl0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExldmVsaW5nQ2FuU3BsaXQoYm9vbGVhbiBuZXdMZXZlbGluZ0NhblNwbGl0KSB7Ci0JCWJvb2xlYW4gb2xkTGV2ZWxpbmdDYW5TcGxpdCA9IGxldmVsaW5nQ2FuU3BsaXQ7Ci0JCWxldmVsaW5nQ2FuU3BsaXQgPSBuZXdMZXZlbGluZ0NhblNwbGl0OwotCQlib29sZWFuIG9sZExldmVsaW5nQ2FuU3BsaXRFU2V0ID0gbGV2ZWxpbmdDYW5TcGxpdEVTZXQ7Ci0JCWxldmVsaW5nQ2FuU3BsaXRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTElOR19DQU5fU1BMSVQsIG9sZExldmVsaW5nQ2FuU3BsaXQsIGxldmVsaW5nQ2FuU3BsaXQsICFvbGRMZXZlbGluZ0NhblNwbGl0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TGV2ZWxpbmdDYW5TcGxpdCgpIHsKLQkJYm9vbGVhbiBvbGRMZXZlbGluZ0NhblNwbGl0ID0gbGV2ZWxpbmdDYW5TcGxpdDsKLQkJYm9vbGVhbiBvbGRMZXZlbGluZ0NhblNwbGl0RVNldCA9IGxldmVsaW5nQ2FuU3BsaXRFU2V0OwotCQlsZXZlbGluZ0NhblNwbGl0ID0gTEVWRUxJTkdfQ0FOX1NQTElUX0VERUZBVUxUOwotCQlsZXZlbGluZ0NhblNwbGl0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfQ0FOX1NQTElULCBvbGRMZXZlbGluZ0NhblNwbGl0LCBMRVZFTElOR19DQU5fU1BMSVRfRURFRkFVTFQsIG9sZExldmVsaW5nQ2FuU3BsaXRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRMZXZlbGluZ0NhblNwbGl0KCkgewotCQlyZXR1cm4gbGV2ZWxpbmdDYW5TcGxpdEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TGV2ZWxpbmdEZWxheSgpIHsKLQkJcmV0dXJuIGxldmVsaW5nRGVsYXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV2ZWxpbmdEZWxheShCaWdJbnRlZ2VyIG5ld0xldmVsaW5nRGVsYXkpIHsKLQkJQmlnSW50ZWdlciBvbGRMZXZlbGluZ0RlbGF5ID0gbGV2ZWxpbmdEZWxheTsKLQkJbGV2ZWxpbmdEZWxheSA9IG5ld0xldmVsaW5nRGVsYXk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVksIG9sZExldmVsaW5nRGVsYXksIGxldmVsaW5nRGVsYXkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCkgewotCQlyZXR1cm4gbGV2ZWxpbmdEZWxheUZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KEJpZ0ludGVnZXIgbmV3TGV2ZWxpbmdEZWxheUZvcm1hdCkgewotCQlCaWdJbnRlZ2VyIG9sZExldmVsaW5nRGVsYXlGb3JtYXQgPSBsZXZlbGluZ0RlbGF5Rm9ybWF0OwotCQlsZXZlbGluZ0RlbGF5Rm9ybWF0ID0gbmV3TGV2ZWxpbmdEZWxheUZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTElOR19ERUxBWV9GT1JNQVQsIG9sZExldmVsaW5nRGVsYXlGb3JtYXQsIGxldmVsaW5nRGVsYXlGb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByZUxldmVsZWRTdGFydCgpIHsKLQkJcmV0dXJuIHByZUxldmVsZWRTdGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVMZXZlbGVkU3RhcnQoT2JqZWN0IG5ld1ByZUxldmVsZWRTdGFydCkgewotCQlPYmplY3Qgb2xkUHJlTGV2ZWxlZFN0YXJ0ID0gcHJlTGV2ZWxlZFN0YXJ0OwotCQlwcmVMZXZlbGVkU3RhcnQgPSBuZXdQcmVMZXZlbGVkU3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFX0xFVkVMRURfU1RBUlQsIG9sZFByZUxldmVsZWRTdGFydCwgcHJlTGV2ZWxlZFN0YXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcmVMZXZlbGVkRmluaXNoKCkgewotCQlyZXR1cm4gcHJlTGV2ZWxlZEZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVMZXZlbGVkRmluaXNoKE9iamVjdCBuZXdQcmVMZXZlbGVkRmluaXNoKSB7Ci0JCU9iamVjdCBvbGRQcmVMZXZlbGVkRmluaXNoID0gcHJlTGV2ZWxlZEZpbmlzaDsKLQkJcHJlTGV2ZWxlZEZpbmlzaCA9IG5ld1ByZUxldmVsZWRGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFX0xFVkVMRURfRklOSVNILCBvbGRQcmVMZXZlbGVkRmluaXNoLCBwcmVMZXZlbGVkRmluaXNoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmsoKSB7Ci0JCXJldHVybiBoeXBlcmxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rKFN0cmluZyBuZXdIeXBlcmxpbmspIHsKLQkJU3RyaW5nIG9sZEh5cGVybGluayA9IGh5cGVybGluazsKLQkJaHlwZXJsaW5rID0gbmV3SHlwZXJsaW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOSywgb2xkSHlwZXJsaW5rLCBoeXBlcmxpbmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua0FkZHJlc3MoKSB7Ci0JCXJldHVybiBoeXBlcmxpbmtBZGRyZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua0FkZHJlc3MoU3RyaW5nIG5ld0h5cGVybGlua0FkZHJlc3MpIHsKLQkJU3RyaW5nIG9sZEh5cGVybGlua0FkZHJlc3MgPSBoeXBlcmxpbmtBZGRyZXNzOwotCQloeXBlcmxpbmtBZGRyZXNzID0gbmV3SHlwZXJsaW5rQWRkcmVzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTktfQUREUkVTUywgb2xkSHlwZXJsaW5rQWRkcmVzcywgaHlwZXJsaW5rQWRkcmVzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpIHsKLQkJcmV0dXJuIGh5cGVybGlua1N1YkFkZHJlc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rU3ViQWRkcmVzcyhTdHJpbmcgbmV3SHlwZXJsaW5rU3ViQWRkcmVzcykgewotCQlTdHJpbmcgb2xkSHlwZXJsaW5rU3ViQWRkcmVzcyA9IGh5cGVybGlua1N1YkFkZHJlc3M7Ci0JCWh5cGVybGlua1N1YkFkZHJlc3MgPSBuZXdIeXBlcmxpbmtTdWJBZGRyZXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOS19TVUJfQUREUkVTUywgb2xkSHlwZXJsaW5rU3ViQWRkcmVzcywgaHlwZXJsaW5rU3ViQWRkcmVzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpIHsKLQkJcmV0dXJuIGlnbm9yZVJlc291cmNlQ2FsZW5kYXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcihib29sZWFuIG5ld0lnbm9yZVJlc291cmNlQ2FsZW5kYXIpIHsKLQkJYm9vbGVhbiBvbGRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyID0gaWdub3JlUmVzb3VyY2VDYWxlbmRhcjsKLQkJaWdub3JlUmVzb3VyY2VDYWxlbmRhciA9IG5ld0lnbm9yZVJlc291cmNlQ2FsZW5kYXI7Ci0JCWJvb2xlYW4gb2xkSWdub3JlUmVzb3VyY2VDYWxlbmRhckVTZXQgPSBpZ25vcmVSZXNvdXJjZUNhbGVuZGFyRVNldDsKLQkJaWdub3JlUmVzb3VyY2VDYWxlbmRhckVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lHTk9SRV9SRVNPVVJDRV9DQUxFTkRBUiwgb2xkSWdub3JlUmVzb3VyY2VDYWxlbmRhciwgaWdub3JlUmVzb3VyY2VDYWxlbmRhciwgIW9sZElnbm9yZVJlc291cmNlQ2FsZW5kYXJFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkgewotCQlib29sZWFuIG9sZElnbm9yZVJlc291cmNlQ2FsZW5kYXIgPSBpZ25vcmVSZXNvdXJjZUNhbGVuZGFyOwotCQlib29sZWFuIG9sZElnbm9yZVJlc291cmNlQ2FsZW5kYXJFU2V0ID0gaWdub3JlUmVzb3VyY2VDYWxlbmRhckVTZXQ7Ci0JCWlnbm9yZVJlc291cmNlQ2FsZW5kYXIgPSBJR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVJfRURFRkFVTFQ7Ci0JCWlnbm9yZVJlc291cmNlQ2FsZW5kYXJFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVIsIG9sZElnbm9yZVJlc291cmNlQ2FsZW5kYXIsIElHTk9SRV9SRVNPVVJDRV9DQUxFTkRBUl9FREVGQVVMVCwgb2xkSWdub3JlUmVzb3VyY2VDYWxlbmRhckVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKSB7Ci0JCXJldHVybiBpZ25vcmVSZXNvdXJjZUNhbGVuZGFyRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vdGVzKCkgewotCQlyZXR1cm4gbm90ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm90ZXMoU3RyaW5nIG5ld05vdGVzKSB7Ci0JCVN0cmluZyBvbGROb3RlcyA9IG5vdGVzOwotCQlub3RlcyA9IG5ld05vdGVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05PVEVTLCBvbGROb3Rlcywgbm90ZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0hpZGVCYXIoKSB7Ci0JCXJldHVybiBoaWRlQmFyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhpZGVCYXIoYm9vbGVhbiBuZXdIaWRlQmFyKSB7Ci0JCWJvb2xlYW4gb2xkSGlkZUJhciA9IGhpZGVCYXI7Ci0JCWhpZGVCYXIgPSBuZXdIaWRlQmFyOwotCQlib29sZWFuIG9sZEhpZGVCYXJFU2V0ID0gaGlkZUJhckVTZXQ7Ci0JCWhpZGVCYXJFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ISURFX0JBUiwgb2xkSGlkZUJhciwgaGlkZUJhciwgIW9sZEhpZGVCYXJFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRIaWRlQmFyKCkgewotCQlib29sZWFuIG9sZEhpZGVCYXIgPSBoaWRlQmFyOwotCQlib29sZWFuIG9sZEhpZGVCYXJFU2V0ID0gaGlkZUJhckVTZXQ7Ci0JCWhpZGVCYXIgPSBISURFX0JBUl9FREVGQVVMVDsKLQkJaGlkZUJhckVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hJREVfQkFSLCBvbGRIaWRlQmFyLCBISURFX0JBUl9FREVGQVVMVCwgb2xkSGlkZUJhckVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEhpZGVCYXIoKSB7Ci0JCXJldHVybiBoaWRlQmFyRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JvbGx1cCgpIHsKLQkJcmV0dXJuIHJvbGx1cDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xsdXAoYm9vbGVhbiBuZXdSb2xsdXApIHsKLQkJYm9vbGVhbiBvbGRSb2xsdXAgPSByb2xsdXA7Ci0JCXJvbGx1cCA9IG5ld1JvbGx1cDsKLQkJYm9vbGVhbiBvbGRSb2xsdXBFU2V0ID0gcm9sbHVwRVNldDsKLQkJcm9sbHVwRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUk9MTFVQLCBvbGRSb2xsdXAsIHJvbGx1cCwgIW9sZFJvbGx1cEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJvbGx1cCgpIHsKLQkJYm9vbGVhbiBvbGRSb2xsdXAgPSByb2xsdXA7Ci0JCWJvb2xlYW4gb2xkUm9sbHVwRVNldCA9IHJvbGx1cEVTZXQ7Ci0JCXJvbGx1cCA9IFJPTExVUF9FREVGQVVMVDsKLQkJcm9sbHVwRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUk9MTFVQLCBvbGRSb2xsdXAsIFJPTExVUF9FREVGQVVMVCwgb2xkUm9sbHVwRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Um9sbHVwKCkgewotCQlyZXR1cm4gcm9sbHVwRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QkNXUyhmbG9hdCBuZXdCQ1dTKSB7Ci0JCWZsb2F0IG9sZEJDV1MgPSBiQ1dTOwotCQliQ1dTID0gbmV3QkNXUzsKLQkJYm9vbGVhbiBvbGRCQ1dTRVNldCA9IGJDV1NFU2V0OwotCQliQ1dTRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUywgb2xkQkNXUywgYkNXUywgIW9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dTKCkgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYm9vbGVhbiBvbGRCQ1dTRVNldCA9IGJDV1NFU2V0OwotCQliQ1dTID0gQkNXU19FREVGQVVMVDsKLQkJYkNXU0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JDV1MsIG9sZEJDV1MsIEJDV1NfRURFRkFVTFQsIG9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXU0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1AoKSB7Ci0JCXJldHVybiBiQ1dQOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1AoZmxvYXQgbmV3QkNXUCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYkNXUCA9IG5ld0JDV1A7Ci0JCWJvb2xlYW4gb2xkQkNXUEVTZXQgPSBiQ1dQRVNldDsKLQkJYkNXUEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JDV1AsIG9sZEJDV1AsIGJDV1AsICFvbGRCQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QkNXUCgpIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJvb2xlYW4gb2xkQkNXUEVTZXQgPSBiQ1dQRVNldDsKLQkJYkNXUCA9IEJDV1BfRURFRkFVTFQ7Ci0JCWJDV1BFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQ1dQLCBvbGRCQ1dQLCBCQ1dQX0VERUZBVUxULCBvbGRCQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUCgpIHsKLQkJcmV0dXJuIGJDV1BFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKCkgewotCQlyZXR1cm4gcGh5c2ljYWxQZXJjZW50Q29tcGxldGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoQmlnSW50ZWdlciBuZXdQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSkgewotCQlCaWdJbnRlZ2VyIG9sZFBoeXNpY2FsUGVyY2VudENvbXBsZXRlID0gcGh5c2ljYWxQZXJjZW50Q29tcGxldGU7Ci0JCXBoeXNpY2FsUGVyY2VudENvbXBsZXRlID0gbmV3UGh5c2ljYWxQZXJjZW50Q29tcGxldGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURSwgb2xkUGh5c2ljYWxQZXJjZW50Q29tcGxldGUsIHBoeXNpY2FsUGVyY2VudENvbXBsZXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RWFybmVkVmFsdWVNZXRob2QoKSB7Ci0JCXJldHVybiBlYXJuZWRWYWx1ZU1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFYXJuZWRWYWx1ZU1ldGhvZChCaWdJbnRlZ2VyIG5ld0Vhcm5lZFZhbHVlTWV0aG9kKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRWFybmVkVmFsdWVNZXRob2QgPSBlYXJuZWRWYWx1ZU1ldGhvZDsKLQkJZWFybmVkVmFsdWVNZXRob2QgPSBuZXdFYXJuZWRWYWx1ZU1ldGhvZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJORURfVkFMVUVfTUVUSE9ELCBvbGRFYXJuZWRWYWx1ZU1ldGhvZCwgZWFybmVkVmFsdWVNZXRob2QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UHJlZGVjZXNzb3JMaW5rKCkgewotCQlpZiAocHJlZGVjZXNzb3JMaW5rID09IG51bGwpIHsKLQkJCXByZWRlY2Vzc29yTGluayA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQcmVkZWNlc3NvckxpbmsuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFREVDRVNTT1JfTElOSyk7Ci0JCX0KLQkJcmV0dXJuIHByZWRlY2Vzc29yTGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKSB7Ci0JCXJldHVybiBhY3R1YWxXb3JrUHJvdGVjdGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0IG5ld0FjdHVhbFdvcmtQcm90ZWN0ZWQpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbFdvcmtQcm90ZWN0ZWQgPSBhY3R1YWxXb3JrUHJvdGVjdGVkOwotCQlhY3R1YWxXb3JrUHJvdGVjdGVkID0gbmV3QWN0dWFsV29ya1Byb3RlY3RlZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfV09SS19QUk9URUNURUQsIG9sZEFjdHVhbFdvcmtQcm90ZWN0ZWQsIGFjdHVhbFdvcmtQcm90ZWN0ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIHsKLQkJcmV0dXJuIGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoT2JqZWN0IG5ld0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCkgewotCQlPYmplY3Qgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkID0gYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkOwotCQlhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPSBuZXdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVELCBvbGRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQsIGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpIHsKLQkJaWYgKGV4dGVuZGVkQXR0cmlidXRlID09IG51bGwpIHsKLQkJCWV4dGVuZGVkQXR0cmlidXRlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEV4dGVuZGVkQXR0cmlidXRlMi5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFTkRFRF9BVFRSSUJVVEUpOwotCQl9Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QmFzZWxpbmUoKSB7Ci0JCWlmIChiYXNlbGluZSA9PSBudWxsKSB7Ci0JCQliYXNlbGluZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChCYXNlbGluZS5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQVNFTElORSk7Ci0JCX0KLQkJcmV0dXJuIGJhc2VsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRPdXRsaW5lQ29kZSgpIHsKLQkJaWYgKG91dGxpbmVDb2RlID09IG51bGwpIHsKLQkJCW91dGxpbmVDb2RlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE91dGxpbmVDb2RlMi5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0NPREUpOwotCQl9Ci0JCXJldHVybiBvdXRsaW5lQ29kZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VGltZXBoYXNlZERhdGEoKSB7Ci0JCWlmICh0aW1lcGhhc2VkRGF0YSA9PSBudWxsKSB7Ci0JCQl0aW1lcGhhc2VkRGF0YSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChUaW1lcGhhc2VkRGF0YVR5cGUuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVElNRVBIQVNFRF9EQVRBKTsKLQkJfQotCQlyZXR1cm4gdGltZXBoYXNlZERhdGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRURFQ0VTU09SX0xJTks6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UHJlZGVjZXNzb3JMaW5rKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEV4dGVuZGVkQXR0cmlidXRlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkFTRUxJTkU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QmFzZWxpbmUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0NPREU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0T3V0bGluZUNvZGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VGltZXBoYXNlZERhdGEoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSUQ6Ci0JCQkJcmV0dXJuIGdldElEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19OVUxMOgotCQkJCXJldHVybiBpc0lzTnVsbCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DUkVBVEVfREFURToKLQkJCQlyZXR1cm4gZ2V0Q3JlYXRlRGF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlRBQ1Q6Ci0JCQkJcmV0dXJuIGdldENvbnRhY3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XQlM6Ci0JCQkJcmV0dXJuIGdldFdCUygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dCU19MRVZFTDoKLQkJCQlyZXR1cm4gZ2V0V0JTTGV2ZWwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX05VTUJFUjoKLQkJCQlyZXR1cm4gZ2V0T3V0bGluZU51bWJlcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfTEVWRUw6Ci0JCQkJcmV0dXJuIGdldE91dGxpbmVMZXZlbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSSU9SSVRZOgotCQkJCXJldHVybiBnZXRQcmlvcml0eSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUQVJUOgotCQkJCXJldHVybiBnZXRTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0RmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRFVSQVRJT046Ci0JCQkJcmV0dXJuIGdldER1cmF0aW9uKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBnZXREdXJhdGlvbkZvcm1hdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dPUks6Ci0JCQkJcmV0dXJuIGdldFdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVE9QOgotCQkJCXJldHVybiBnZXRTdG9wKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FOgotCQkJCXJldHVybiBnZXRSZXN1bWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRVNVTUVfVkFMSUQ6Ci0JCQkJcmV0dXJuIGlzUmVzdW1lVmFsaWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUZGT1JUX0RSSVZFTjoKLQkJCQlyZXR1cm4gaXNFZmZvcnREcml2ZW4oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVDVVJSSU5HOgotCQkJCXJldHVybiBpc1JlY3VycmluZygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSX0FMTE9DQVRFRDoKLQkJCQlyZXR1cm4gaXNPdmVyQWxsb2NhdGVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VTVElNQVRFRDoKLQkJCQlyZXR1cm4gaXNFc3RpbWF0ZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTUlMRVNUT05FOgotCQkJCXJldHVybiBpc01pbGVzdG9uZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVU1NQVJZOgotCQkJCXJldHVybiBpc1N1bW1hcnkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1JJVElDQUw6Ci0JCQkJcmV0dXJuIGlzQ3JpdGljYWwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfU1VCUFJPSkVDVDoKLQkJCQlyZXR1cm4gaXNJc1N1YnByb2plY3QoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfU1VCUFJPSkVDVF9SRUFEX09OTFk6Ci0JCQkJcmV0dXJuIGlzSXNTdWJwcm9qZWN0UmVhZE9ubHkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1VCUFJPSkVDVF9OQU1FOgotCQkJCXJldHVybiBnZXRTdWJwcm9qZWN0TmFtZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVSTkFMX1RBU0s6Ci0JCQkJcmV0dXJuIGlzRXh0ZXJuYWxUYXNrKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVSTkFMX1RBU0tfUFJPSkVDVDoKLQkJCQlyZXR1cm4gZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUkxZX1NUQVJUOgotCQkJCXJldHVybiBnZXRFYXJseVN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTFlfRklOSVNIOgotCQkJCXJldHVybiBnZXRFYXJseUZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xBVEVfU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldExhdGVTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xBVEVfRklOSVNIOgotCQkJCXJldHVybiBnZXRMYXRlRmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RBUlRfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIGdldFN0YXJ0VmFyaWFuY2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSU5JU0hfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIGdldEZpbmlzaFZhcmlhbmNlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SS19WQVJJQU5DRToKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldFdvcmtWYXJpYW5jZSgpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GUkVFX1NMQUNLOgotCQkJCXJldHVybiBnZXRGcmVlU2xhY2soKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19UT1RBTF9TTEFDSzoKLQkJCQlyZXR1cm4gZ2V0VG90YWxTbGFjaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1Q6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRGaXhlZENvc3QoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklYRURfQ09TVF9BQ0NSVUFMOgotCQkJCXJldHVybiBnZXRGaXhlZENvc3RBY2NydWFsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEVSQ0VOVF9DT01QTEVURToKLQkJCQlyZXR1cm4gZ2V0UGVyY2VudENvbXBsZXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFOgotCQkJCXJldHVybiBnZXRQZXJjZW50V29ya0NvbXBsZXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09TVDoKLQkJCQlyZXR1cm4gZ2V0Q29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldE92ZXJ0aW1lQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIGdldE92ZXJ0aW1lV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9TVEFSVDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsU3RhcnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfRklOSVNIOgotCQkJCXJldHVybiBnZXRBY3R1YWxGaW5pc2goKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfRFVSQVRJT046Ci0JCQkJcmV0dXJuIGdldEFjdHVhbER1cmF0aW9uKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbENvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUks6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbFdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVHVUxBUl9XT1JLOgotCQkJCXJldHVybiBnZXRSZWd1bGFyV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19EVVJBVElPTjoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nRHVyYXRpb24oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfQ09TVDoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19XT1JLOgotCQkJCXJldHVybiBnZXRSZW1haW5pbmdXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1dQOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QUNXUCgpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DVjoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldENWKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfVFlQRToKLQkJCQlyZXR1cm4gZ2V0Q29uc3RyYWludFR5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DQUxFTkRBUl9VSUQ6Ci0JCQkJcmV0dXJuIGdldENhbGVuZGFyVUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09OU1RSQUlOVF9EQVRFOgotCQkJCXJldHVybiBnZXRDb25zdHJhaW50RGF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RFQURMSU5FOgotCQkJCXJldHVybiBnZXREZWFkbGluZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMX0FTU0lHTk1FTlRTOgotCQkJCXJldHVybiBpc0xldmVsQXNzaWdubWVudHMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfQ0FOX1NQTElUOgotCQkJCXJldHVybiBpc0xldmVsaW5nQ2FuU3BsaXQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVk6Ci0JCQkJcmV0dXJuIGdldExldmVsaW5nRGVsYXkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTElOR19ERUxBWV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldExldmVsaW5nRGVsYXlGb3JtYXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUkVfTEVWRUxFRF9TVEFSVDoKLQkJCQlyZXR1cm4gZ2V0UHJlTGV2ZWxlZFN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFX0xFVkVMRURfRklOSVNIOgotCQkJCXJldHVybiBnZXRQcmVMZXZlbGVkRmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LOgotCQkJCXJldHVybiBnZXRIeXBlcmxpbmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlyZXR1cm4gZ2V0SHlwZXJsaW5rQWRkcmVzcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlyZXR1cm4gZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lHTk9SRV9SRVNPVVJDRV9DQUxFTkRBUjoKLQkJCQlyZXR1cm4gaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05PVEVTOgotCQkJCXJldHVybiBnZXROb3RlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hJREVfQkFSOgotCQkJCXJldHVybiBpc0hpZGVCYXIoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUk9MTFVQOgotCQkJCXJldHVybiBpc1JvbGx1cCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQ1dTOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QkNXUygpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQ1dQOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QkNXUCgpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QSFlTSUNBTF9QRVJDRU5UX0NPTVBMRVRFOgotCQkJCXJldHVybiBnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUk5FRF9WQUxVRV9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGdldEVhcm5lZFZhbHVlTWV0aG9kKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFREVDRVNTT1JfTElOSzoKLQkJCQlyZXR1cm4gZ2V0UHJlZGVjZXNzb3JMaW5rKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGdldEV4dGVuZGVkQXR0cmlidXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkFTRUxJTkU6Ci0JCQkJcmV0dXJuIGdldEJhc2VsaW5lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9DT0RFOgotCQkJCXJldHVybiBnZXRPdXRsaW5lQ29kZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RJTUVQSEFTRURfREFUQToKLQkJCQlyZXR1cm4gZ2V0VGltZXBoYXNlZERhdGEoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVUlEOgotCQkJCXNldFVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lEOgotCQkJCXNldElEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19UWVBFOgotCQkJCXNldFR5cGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19OVUxMOgotCQkJCXNldElzTnVsbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1JFQVRFX0RBVEU6Ci0JCQkJc2V0Q3JlYXRlRGF0ZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09OVEFDVDoKLQkJCQlzZXRDb250YWN0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XQlM6Ci0JCQkJc2V0V0JTKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XQlNfTEVWRUw6Ci0JCQkJc2V0V0JTTGV2ZWwoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfTlVNQkVSOgotCQkJCXNldE91dGxpbmVOdW1iZXIoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfTEVWRUw6Ci0JCQkJc2V0T3V0bGluZUxldmVsKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJJT1JJVFk6Ci0JCQkJc2V0UHJpb3JpdHkoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVEFSVDoKLQkJCQlzZXRTdGFydCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklOSVNIOgotCQkJCXNldEZpbmlzaCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRFVSQVRJT046Ci0JCQkJc2V0RHVyYXRpb24oKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlzZXREdXJhdGlvbkZvcm1hdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dPUks6Ci0JCQkJc2V0V29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RPUDoKLQkJCQlzZXRTdG9wKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRVNVTUU6Ci0JCQkJc2V0UmVzdW1lKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRVNVTUVfVkFMSUQ6Ci0JCQkJc2V0UmVzdW1lVmFsaWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VGRk9SVF9EUklWRU46Ci0JCQkJc2V0RWZmb3J0RHJpdmVuKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUNVUlJJTkc6Ci0JCQkJc2V0UmVjdXJyaW5nKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSX0FMTE9DQVRFRDoKLQkJCQlzZXRPdmVyQWxsb2NhdGVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FU1RJTUFURUQ6Ci0JCQkJc2V0RXN0aW1hdGVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19NSUxFU1RPTkU6Ci0JCQkJc2V0TWlsZXN0b25lKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVU1NQVJZOgotCQkJCXNldFN1bW1hcnkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSSVRJQ0FMOgotCQkJCXNldENyaXRpY2FsKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19TVUJQUk9KRUNUOgotCQkJCXNldElzU3VicHJvamVjdCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfU1VCUFJPSkVDVF9SRUFEX09OTFk6Ci0JCQkJc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVQlBST0pFQ1RfTkFNRToKLQkJCQlzZXRTdWJwcm9qZWN0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURVJOQUxfVEFTSzoKLQkJCQlzZXRFeHRlcm5hbFRhc2soKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVSTkFMX1RBU0tfUFJPSkVDVDoKLQkJCQlzZXRFeHRlcm5hbFRhc2tQcm9qZWN0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJMWV9TVEFSVDoKLQkJCQlzZXRFYXJseVN0YXJ0KChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJMWV9GSU5JU0g6Ci0JCQkJc2V0RWFybHlGaW5pc2goKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xBVEVfU1RBUlQ6Ci0JCQkJc2V0TGF0ZVN0YXJ0KChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX0ZJTklTSDoKLQkJCQlzZXRMYXRlRmluaXNoKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVEFSVF9WQVJJQU5DRToKLQkJCQlzZXRTdGFydFZhcmlhbmNlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklOSVNIX1ZBUklBTkNFOgotCQkJCXNldEZpbmlzaFZhcmlhbmNlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SS19WQVJJQU5DRToKLQkJCQlzZXRXb3JrVmFyaWFuY2UoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRlJFRV9TTEFDSzoKLQkJCQlzZXRGcmVlU2xhY2soKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19UT1RBTF9TTEFDSzoKLQkJCQlzZXRUb3RhbFNsYWNrKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklYRURfQ09TVDoKLQkJCQlzZXRGaXhlZENvc3QoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklYRURfQ09TVF9BQ0NSVUFMOgotCQkJCXNldEZpeGVkQ29zdEFjY3J1YWwoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfQ09NUExFVEU6Ci0JCQkJc2V0UGVyY2VudENvbXBsZXRlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFOgotCQkJCXNldFBlcmNlbnRXb3JrQ29tcGxldGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT1NUOgotCQkJCXNldENvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9DT1NUOgotCQkJCXNldE92ZXJ0aW1lQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0T3ZlcnRpbWVXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfU1RBUlQ6Ci0JCQkJc2V0QWN0dWFsU3RhcnQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9GSU5JU0g6Ci0JCQkJc2V0QWN0dWFsRmluaXNoKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfRFVSQVRJT046Ci0JCQkJc2V0QWN0dWFsRHVyYXRpb24oKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9DT1NUOgotCQkJCXNldEFjdHVhbENvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRBY3R1YWxPdmVydGltZUNvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfV09SSzoKLQkJCQlzZXRBY3R1YWxXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRBY3R1YWxPdmVydGltZVdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFR1VMQVJfV09SSzoKLQkJCQlzZXRSZWd1bGFyV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0RVUkFUSU9OOgotCQkJCXNldFJlbWFpbmluZ0R1cmF0aW9uKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfQ09TVDoKLQkJCQlzZXRSZW1haW5pbmdDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1dQOgotCQkJCXNldEFDV1AoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1Y6Ci0JCQkJc2V0Q1YoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09OU1RSQUlOVF9UWVBFOgotCQkJCXNldENvbnN0cmFpbnRUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ0FMRU5EQVJfVUlEOgotCQkJCXNldENhbGVuZGFyVUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09OU1RSQUlOVF9EQVRFOgotCQkJCXNldENvbnN0cmFpbnREYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ERUFETElORToKLQkJCQlzZXREZWFkbGluZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxfQVNTSUdOTUVOVFM6Ci0JCQkJc2V0TGV2ZWxBc3NpZ25tZW50cygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfQ0FOX1NQTElUOgotCQkJCXNldExldmVsaW5nQ2FuU3BsaXQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0RFTEFZOgotCQkJCXNldExldmVsaW5nRGVsYXkoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTElOR19ERUxBWV9GT1JNQVQ6Ci0JCQkJc2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX1NUQVJUOgotCQkJCXNldFByZUxldmVsZWRTdGFydCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFX0xFVkVMRURfRklOSVNIOgotCQkJCXNldFByZUxldmVsZWRGaW5pc2goKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOSzoKLQkJCQlzZXRIeXBlcmxpbmsoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOS19BRERSRVNTOgotCQkJCXNldEh5cGVybGlua0FkZHJlc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVI6Ci0JCQkJc2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTk9URVM6Ci0JCQkJc2V0Tm90ZXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hJREVfQkFSOgotCQkJCXNldEhpZGVCYXIoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JPTExVUDoKLQkJCQlzZXRSb2xsdXAoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JDV1M6Ci0JCQkJc2V0QkNXUygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQ1dQOgotCQkJCXNldEJDV1AoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURToKLQkJCQlzZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUk5FRF9WQUxVRV9NRVRIT0Q6Ci0JCQkJc2V0RWFybmVkVmFsdWVNZXRob2QoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUkVERUNFU1NPUl9MSU5LOgotCQkJCWdldFByZWRlY2Vzc29yTGluaygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJlZGVjZXNzb3JMaW5rKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXNldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQVNFTElORToKLQkJCQlnZXRCYXNlbGluZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0QmFzZWxpbmUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0NPREU6Ci0JCQkJZ2V0T3V0bGluZUNvZGUoKS5jbGVhcigpOwotCQkJCWdldE91dGxpbmVDb2RlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVElNRVBIQVNFRF9EQVRBOgotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuY2xlYXIoKTsKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lEOgotCQkJCXNldElEKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX05VTEw6Ci0JCQkJdW5zZXRJc051bGwoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1JFQVRFX0RBVEU6Ci0JCQkJc2V0Q3JlYXRlRGF0ZShDUkVBVEVfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlRBQ1Q6Ci0JCQkJc2V0Q29udGFjdChDT05UQUNUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV0JTOgotCQkJCXNldFdCUyhXQlNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XQlNfTEVWRUw6Ci0JCQkJc2V0V0JTTGV2ZWwoV0JTX0xFVkVMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9OVU1CRVI6Ci0JCQkJc2V0T3V0bGluZU51bWJlcihPVVRMSU5FX05VTUJFUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfTEVWRUw6Ci0JCQkJc2V0T3V0bGluZUxldmVsKE9VVExJTkVfTEVWRUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUklPUklUWToKLQkJCQlzZXRQcmlvcml0eShQUklPUklUWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUQVJUOgotCQkJCXNldFN0YXJ0KFNUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklOSVNIOgotCQkJCXNldEZpbmlzaChGSU5JU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19EVVJBVElPTjoKLQkJCQlzZXREdXJhdGlvbihEVVJBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlzZXREdXJhdGlvbkZvcm1hdChEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XT1JLOgotCQkJCXNldFdvcmsoV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUT1A6Ci0JCQkJc2V0U3RvcChTVE9QX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FOgotCQkJCXNldFJlc3VtZShSRVNVTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRVNVTUVfVkFMSUQ6Ci0JCQkJdW5zZXRSZXN1bWVWYWxpZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FRkZPUlRfRFJJVkVOOgotCQkJCXVuc2V0RWZmb3J0RHJpdmVuKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFQ1VSUklORzoKLQkJCQl1bnNldFJlY3VycmluZygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSX0FMTE9DQVRFRDoKLQkJCQl1bnNldE92ZXJBbGxvY2F0ZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVNUSU1BVEVEOgotCQkJCXVuc2V0RXN0aW1hdGVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX01JTEVTVE9ORToKLQkJCQl1bnNldE1pbGVzdG9uZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVU1NQVJZOgotCQkJCXVuc2V0U3VtbWFyeSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DUklUSUNBTDoKLQkJCQl1bnNldENyaXRpY2FsKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1Q6Ci0JCQkJdW5zZXRJc1N1YnByb2plY3QoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfU1VCUFJPSkVDVF9SRUFEX09OTFk6Ci0JCQkJdW5zZXRJc1N1YnByb2plY3RSZWFkT25seSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVUJQUk9KRUNUX05BTUU6Ci0JCQkJc2V0U3VicHJvamVjdE5hbWUoU1VCUFJPSkVDVF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURVJOQUxfVEFTSzoKLQkJCQl1bnNldEV4dGVybmFsVGFzaygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLX1BST0pFQ1Q6Ci0JCQkJc2V0RXh0ZXJuYWxUYXNrUHJvamVjdChFWFRFUk5BTF9UQVNLX1BST0pFQ1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJMWV9TVEFSVDoKLQkJCQlzZXRFYXJseVN0YXJ0KEVBUkxZX1NUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTFlfRklOSVNIOgotCQkJCXNldEVhcmx5RmluaXNoKEVBUkxZX0ZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xBVEVfU1RBUlQ6Ci0JCQkJc2V0TGF0ZVN0YXJ0KExBVEVfU1RBUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX0ZJTklTSDoKLQkJCQlzZXRMYXRlRmluaXNoKExBVEVfRklOSVNIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RBUlRfVkFSSUFOQ0U6Ci0JCQkJc2V0U3RhcnRWYXJpYW5jZShTVEFSVF9WQVJJQU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSF9WQVJJQU5DRToKLQkJCQlzZXRGaW5pc2hWYXJpYW5jZShGSU5JU0hfVkFSSUFOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XT1JLX1ZBUklBTkNFOgotCQkJCXVuc2V0V29ya1ZhcmlhbmNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZSRUVfU0xBQ0s6Ci0JCQkJc2V0RnJlZVNsYWNrKEZSRUVfU0xBQ0tfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19UT1RBTF9TTEFDSzoKLQkJCQlzZXRUb3RhbFNsYWNrKFRPVEFMX1NMQUNLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklYRURfQ09TVDoKLQkJCQl1bnNldEZpeGVkQ29zdCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSVhFRF9DT1NUX0FDQ1JVQUw6Ci0JCQkJc2V0Rml4ZWRDb3N0QWNjcnVhbChGSVhFRF9DT1NUX0FDQ1JVQUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QRVJDRU5UX0NPTVBMRVRFOgotCQkJCXNldFBlcmNlbnRDb21wbGV0ZShQRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFOgotCQkJCXNldFBlcmNlbnRXb3JrQ29tcGxldGUoUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09TVDoKLQkJCQlzZXRDb3N0KENPU1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9DT1NUOgotCQkJCXNldE92ZXJ0aW1lQ29zdChPVkVSVElNRV9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRPdmVydGltZVdvcmsoT1ZFUlRJTUVfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9TVEFSVDoKLQkJCQlzZXRBY3R1YWxTdGFydChBQ1RVQUxfU1RBUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfRklOSVNIOgotCQkJCXNldEFjdHVhbEZpbmlzaChBQ1RVQUxfRklOSVNIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0RVUkFUSU9OOgotCQkJCXNldEFjdHVhbER1cmF0aW9uKEFDVFVBTF9EVVJBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9DT1NUOgotCQkJCXNldEFjdHVhbENvc3QoQUNUVUFMX0NPU1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRBY3R1YWxPdmVydGltZUNvc3QoQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfV09SSzoKLQkJCQlzZXRBY3R1YWxXb3JrKEFDVFVBTF9XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKEFDVFVBTF9PVkVSVElNRV9XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVHVUxBUl9XT1JLOgotCQkJCXNldFJlZ3VsYXJXb3JrKFJFR1VMQVJfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19EVVJBVElPTjoKLQkJCQlzZXRSZW1haW5pbmdEdXJhdGlvbihSRU1BSU5JTkdfRFVSQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfQ09TVDoKLQkJCQlzZXRSZW1haW5pbmdDb3N0KFJFTUFJTklOR19DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nV29yayhSRU1BSU5JTkdfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lV29yayhSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDV1A6Ci0JCQkJdW5zZXRBQ1dQKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NWOgotCQkJCXVuc2V0Q1YoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09OU1RSQUlOVF9UWVBFOgotCQkJCXNldENvbnN0cmFpbnRUeXBlKENPTlNUUkFJTlRfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NBTEVOREFSX1VJRDoKLQkJCQlzZXRDYWxlbmRhclVJRChDQUxFTkRBUl9VSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05TVFJBSU5UX0RBVEU6Ci0JCQkJc2V0Q29uc3RyYWludERhdGUoQ09OU1RSQUlOVF9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fREVBRExJTkU6Ci0JCQkJc2V0RGVhZGxpbmUoREVBRExJTkVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTF9BU1NJR05NRU5UUzoKLQkJCQl1bnNldExldmVsQXNzaWdubWVudHMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfQ0FOX1NQTElUOgotCQkJCXVuc2V0TGV2ZWxpbmdDYW5TcGxpdCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTElOR19ERUxBWToKLQkJCQlzZXRMZXZlbGluZ0RlbGF5KExFVkVMSU5HX0RFTEFZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVlfRk9STUFUOgotCQkJCXNldExldmVsaW5nRGVsYXlGb3JtYXQoTEVWRUxJTkdfREVMQVlfRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFX0xFVkVMRURfU1RBUlQ6Ci0JCQkJc2V0UHJlTGV2ZWxlZFN0YXJ0KFBSRV9MRVZFTEVEX1NUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFX0xFVkVMRURfRklOSVNIOgotCQkJCXNldFByZUxldmVsZWRGaW5pc2goUFJFX0xFVkVMRURfRklOSVNIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LOgotCQkJCXNldEh5cGVybGluayhIWVBFUkxJTktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtBZGRyZXNzKEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LX1NVQl9BRERSRVNTOgotCQkJCXNldEh5cGVybGlua1N1YkFkZHJlc3MoSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSUdOT1JFX1JFU09VUkNFX0NBTEVOREFSOgotCQkJCXVuc2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19OT1RFUzoKLQkJCQlzZXROb3RlcyhOT1RFU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hJREVfQkFSOgotCQkJCXVuc2V0SGlkZUJhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ST0xMVVA6Ci0JCQkJdW5zZXRSb2xsdXAoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUzoKLQkJCQl1bnNldEJDV1MoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUDoKLQkJCQl1bnNldEJDV1AoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURToKLQkJCQlzZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZShQSFlTSUNBTF9QRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTkVEX1ZBTFVFX01FVEhPRDoKLQkJCQlzZXRFYXJuZWRWYWx1ZU1ldGhvZChFQVJORURfVkFMVUVfTUVUSE9EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFREVDRVNTT1JfTElOSzoKLQkJCQlnZXRQcmVkZWNlc3NvckxpbmsoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsV29ya1Byb3RlY3RlZChBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKEFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JBU0VMSU5FOgotCQkJCWdldEJhc2VsaW5lKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9DT0RFOgotCQkJCWdldE91dGxpbmVDb2RlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVElNRVBIQVNFRF9EQVRBOgotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19VSUQ6Ci0JCQkJcmV0dXJuIFVJRF9FREVGQVVMVCA9PSBudWxsID8gdUlEICE9IG51bGwgOiAhVUlEX0VERUZBVUxULmVxdWFscyh1SUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaUQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19UWVBFOgotCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfTlVMTDoKLQkJCQlyZXR1cm4gaXNTZXRJc051bGwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DUkVBVEVfREFURToKLQkJCQlyZXR1cm4gQ1JFQVRFX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGNyZWF0ZURhdGUgIT0gbnVsbCA6ICFDUkVBVEVfREFURV9FREVGQVVMVC5lcXVhbHMoY3JlYXRlRGF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09OVEFDVDoKLQkJCQlyZXR1cm4gQ09OVEFDVF9FREVGQVVMVCA9PSBudWxsID8gY29udGFjdCAhPSBudWxsIDogIUNPTlRBQ1RfRURFRkFVTFQuZXF1YWxzKGNvbnRhY3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dCUzoKLQkJCQlyZXR1cm4gV0JTX0VERUZBVUxUID09IG51bGwgPyB3QlMgIT0gbnVsbCA6ICFXQlNfRURFRkFVTFQuZXF1YWxzKHdCUyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV0JTX0xFVkVMOgotCQkJCXJldHVybiBXQlNfTEVWRUxfRURFRkFVTFQgPT0gbnVsbCA/IHdCU0xldmVsICE9IG51bGwgOiAhV0JTX0xFVkVMX0VERUZBVUxULmVxdWFscyh3QlNMZXZlbCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9OVU1CRVI6Ci0JCQkJcmV0dXJuIE9VVExJTkVfTlVNQkVSX0VERUZBVUxUID09IG51bGwgPyBvdXRsaW5lTnVtYmVyICE9IG51bGwgOiAhT1VUTElORV9OVU1CRVJfRURFRkFVTFQuZXF1YWxzKG91dGxpbmVOdW1iZXIpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfTEVWRUw6Ci0JCQkJcmV0dXJuIE9VVExJTkVfTEVWRUxfRURFRkFVTFQgPT0gbnVsbCA/IG91dGxpbmVMZXZlbCAhPSBudWxsIDogIU9VVExJTkVfTEVWRUxfRURFRkFVTFQuZXF1YWxzKG91dGxpbmVMZXZlbCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJJT1JJVFk6Ci0JCQkJcmV0dXJuIFBSSU9SSVRZX0VERUZBVUxUID09IG51bGwgPyBwcmlvcml0eSAhPSBudWxsIDogIVBSSU9SSVRZX0VERUZBVUxULmVxdWFscyhwcmlvcml0eSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RBUlQ6Ci0JCQkJcmV0dXJuIFNUQVJUX0VERUZBVUxUID09IG51bGwgPyBzdGFydCAhPSBudWxsIDogIVNUQVJUX0VERUZBVUxULmVxdWFscyhzdGFydCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklOSVNIOgotCQkJCXJldHVybiBGSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaCAhPSBudWxsIDogIUZJTklTSF9FREVGQVVMVC5lcXVhbHMoZmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19EVVJBVElPTjoKLQkJCQlyZXR1cm4gRFVSQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGR1cmF0aW9uICE9IG51bGwgOiAhRFVSQVRJT05fRURFRkFVTFQuZXF1YWxzKGR1cmF0aW9uKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJcmV0dXJuIERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCA9PSBudWxsID8gZHVyYXRpb25Gb3JtYXQgIT0gbnVsbCA6ICFEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQuZXF1YWxzKGR1cmF0aW9uRm9ybWF0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XT1JLOgotCQkJCXJldHVybiBXT1JLX0VERUZBVUxUID09IG51bGwgPyB3b3JrICE9IG51bGwgOiAhV09SS19FREVGQVVMVC5lcXVhbHMod29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RPUDoKLQkJCQlyZXR1cm4gU1RPUF9FREVGQVVMVCA9PSBudWxsID8gc3RvcCAhPSBudWxsIDogIVNUT1BfRURFRkFVTFQuZXF1YWxzKHN0b3ApOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFU1VNRToKLQkJCQlyZXR1cm4gUkVTVU1FX0VERUZBVUxUID09IG51bGwgPyByZXN1bWUgIT0gbnVsbCA6ICFSRVNVTUVfRURFRkFVTFQuZXF1YWxzKHJlc3VtZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FX1ZBTElEOgotCQkJCXJldHVybiBpc1NldFJlc3VtZVZhbGlkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUZGT1JUX0RSSVZFTjoKLQkJCQlyZXR1cm4gaXNTZXRFZmZvcnREcml2ZW4oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUNVUlJJTkc6Ci0JCQkJcmV0dXJuIGlzU2V0UmVjdXJyaW5nKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJcmV0dXJuIGlzU2V0T3ZlckFsbG9jYXRlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VTVElNQVRFRDoKLQkJCQlyZXR1cm4gaXNTZXRFc3RpbWF0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19NSUxFU1RPTkU6Ci0JCQkJcmV0dXJuIGlzU2V0TWlsZXN0b25lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1VNTUFSWToKLQkJCQlyZXR1cm4gaXNTZXRTdW1tYXJ5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1JJVElDQUw6Ci0JCQkJcmV0dXJuIGlzU2V0Q3JpdGljYWwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19TVUJQUk9KRUNUOgotCQkJCXJldHVybiBpc1NldElzU3VicHJvamVjdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1RfUkVBRF9PTkxZOgotCQkJCXJldHVybiBpc1NldElzU3VicHJvamVjdFJlYWRPbmx5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1VCUFJPSkVDVF9OQU1FOgotCQkJCXJldHVybiBTVUJQUk9KRUNUX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHN1YnByb2plY3ROYW1lICE9IG51bGwgOiAhU1VCUFJPSkVDVF9OQU1FX0VERUZBVUxULmVxdWFscyhzdWJwcm9qZWN0TmFtZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURVJOQUxfVEFTSzoKLQkJCQlyZXR1cm4gaXNTZXRFeHRlcm5hbFRhc2soKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIEVYVEVSTkFMX1RBU0tfUFJPSkVDVF9FREVGQVVMVCA9PSBudWxsID8gZXh0ZXJuYWxUYXNrUHJvamVjdCAhPSBudWxsIDogIUVYVEVSTkFMX1RBU0tfUFJPSkVDVF9FREVGQVVMVC5lcXVhbHMoZXh0ZXJuYWxUYXNrUHJvamVjdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTFlfU1RBUlQ6Ci0JCQkJcmV0dXJuIEVBUkxZX1NUQVJUX0VERUZBVUxUID09IG51bGwgPyBlYXJseVN0YXJ0ICE9IG51bGwgOiAhRUFSTFlfU1RBUlRfRURFRkFVTFQuZXF1YWxzKGVhcmx5U3RhcnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUkxZX0ZJTklTSDoKLQkJCQlyZXR1cm4gRUFSTFlfRklOSVNIX0VERUZBVUxUID09IG51bGwgPyBlYXJseUZpbmlzaCAhPSBudWxsIDogIUVBUkxZX0ZJTklTSF9FREVGQVVMVC5lcXVhbHMoZWFybHlGaW5pc2gpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xBVEVfU1RBUlQ6Ci0JCQkJcmV0dXJuIExBVEVfU1RBUlRfRURFRkFVTFQgPT0gbnVsbCA/IGxhdGVTdGFydCAhPSBudWxsIDogIUxBVEVfU1RBUlRfRURFRkFVTFQuZXF1YWxzKGxhdGVTdGFydCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEFURV9GSU5JU0g6Ci0JCQkJcmV0dXJuIExBVEVfRklOSVNIX0VERUZBVUxUID09IG51bGwgPyBsYXRlRmluaXNoICE9IG51bGwgOiAhTEFURV9GSU5JU0hfRURFRkFVTFQuZXF1YWxzKGxhdGVGaW5pc2gpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUQVJUX1ZBUklBTkNFOgotCQkJCXJldHVybiBTVEFSVF9WQVJJQU5DRV9FREVGQVVMVCA9PSBudWxsID8gc3RhcnRWYXJpYW5jZSAhPSBudWxsIDogIVNUQVJUX1ZBUklBTkNFX0VERUZBVUxULmVxdWFscyhzdGFydFZhcmlhbmNlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSU5JU0hfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVCA9PSBudWxsID8gZmluaXNoVmFyaWFuY2UgIT0gbnVsbCA6ICFGSU5JU0hfVkFSSUFOQ0VfRURFRkFVTFQuZXF1YWxzKGZpbmlzaFZhcmlhbmNlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XT1JLX1ZBUklBTkNFOgotCQkJCXJldHVybiBpc1NldFdvcmtWYXJpYW5jZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZSRUVfU0xBQ0s6Ci0JCQkJcmV0dXJuIEZSRUVfU0xBQ0tfRURFRkFVTFQgPT0gbnVsbCA/IGZyZWVTbGFjayAhPSBudWxsIDogIUZSRUVfU0xBQ0tfRURFRkFVTFQuZXF1YWxzKGZyZWVTbGFjayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVE9UQUxfU0xBQ0s6Ci0JCQkJcmV0dXJuIFRPVEFMX1NMQUNLX0VERUZBVUxUID09IG51bGwgPyB0b3RhbFNsYWNrICE9IG51bGwgOiAhVE9UQUxfU0xBQ0tfRURFRkFVTFQuZXF1YWxzKHRvdGFsU2xhY2spOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1Q6Ci0JCQkJcmV0dXJuIGlzU2V0Rml4ZWRDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklYRURfQ09TVF9BQ0NSVUFMOgotCQkJCXJldHVybiBGSVhFRF9DT1NUX0FDQ1JVQUxfRURFRkFVTFQgPT0gbnVsbCA/IGZpeGVkQ29zdEFjY3J1YWwgIT0gbnVsbCA6ICFGSVhFRF9DT1NUX0FDQ1JVQUxfRURFRkFVTFQuZXF1YWxzKGZpeGVkQ29zdEFjY3J1YWwpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIFBFUkNFTlRfQ09NUExFVEVfRURFRkFVTFQgPT0gbnVsbCA/IHBlcmNlbnRDb21wbGV0ZSAhPSBudWxsIDogIVBFUkNFTlRfQ09NUExFVEVfRURFRkFVTFQuZXF1YWxzKHBlcmNlbnRDb21wbGV0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFOgotCQkJCXJldHVybiBQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQgPT0gbnVsbCA/IHBlcmNlbnRXb3JrQ29tcGxldGUgIT0gbnVsbCA6ICFQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQuZXF1YWxzKHBlcmNlbnRXb3JrQ29tcGxldGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPU1Q6Ci0JCQkJcmV0dXJuIENPU1RfRURFRkFVTFQgPT0gbnVsbCA/IGNvc3QgIT0gbnVsbCA6ICFDT1NUX0VERUZBVUxULmVxdWFscyhjb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBPVkVSVElNRV9DT1NUX0VERUZBVUxUID09IG51bGwgPyBvdmVydGltZUNvc3QgIT0gbnVsbCA6ICFPVkVSVElNRV9DT1NUX0VERUZBVUxULmVxdWFscyhvdmVydGltZUNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIE9WRVJUSU1FX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IG92ZXJ0aW1lV29yayAhPSBudWxsIDogIU9WRVJUSU1FX1dPUktfRURFRkFVTFQuZXF1YWxzKG92ZXJ0aW1lV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1NUQVJUOgotCQkJCXJldHVybiBBQ1RVQUxfU1RBUlRfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbFN0YXJ0ICE9IG51bGwgOiAhQUNUVUFMX1NUQVJUX0VERUZBVUxULmVxdWFscyhhY3R1YWxTdGFydCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0ZJTklTSDoKLQkJCQlyZXR1cm4gQUNUVUFMX0ZJTklTSF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsRmluaXNoICE9IG51bGwgOiAhQUNUVUFMX0ZJTklTSF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsRmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfRFVSQVRJT046Ci0JCQkJcmV0dXJuIEFDVFVBTF9EVVJBVElPTl9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsRHVyYXRpb24gIT0gbnVsbCA6ICFBQ1RVQUxfRFVSQVRJT05fRURFRkFVTFQuZXF1YWxzKGFjdHVhbER1cmF0aW9uKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfQ09TVDoKLQkJCQlyZXR1cm4gQUNUVUFMX0NPU1RfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbENvc3QgIT0gbnVsbCA6ICFBQ1RVQUxfQ09TVF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxPdmVydGltZUNvc3QgIT0gbnVsbCA6ICFBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsT3ZlcnRpbWVDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfV09SSzoKLQkJCQlyZXR1cm4gQUNUVUFMX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbFdvcmsgIT0gbnVsbCA6ICFBQ1RVQUxfV09SS19FREVGQVVMVC5lcXVhbHMoYWN0dWFsV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIEFDVFVBTF9PVkVSVElNRV9XT1JLX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxPdmVydGltZVdvcmsgIT0gbnVsbCA6ICFBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVC5lcXVhbHMoYWN0dWFsT3ZlcnRpbWVXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUdVTEFSX1dPUks6Ci0JCQkJcmV0dXJuIFJFR1VMQVJfV09SS19FREVGQVVMVCA9PSBudWxsID8gcmVndWxhcldvcmsgIT0gbnVsbCA6ICFSRUdVTEFSX1dPUktfRURFRkFVTFQuZXF1YWxzKHJlZ3VsYXJXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfRFVSQVRJT046Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19EVVJBVElPTl9FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nRHVyYXRpb24gIT0gbnVsbCA6ICFSRU1BSU5JTkdfRFVSQVRJT05fRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ0R1cmF0aW9uKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfQ09TVDoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ0Nvc3QgIT0gbnVsbCA6ICFSRU1BSU5JTkdfQ09TVF9FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX1dPUks6Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19XT1JLX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdXb3JrICE9IG51bGwgOiAhUkVNQUlOSU5HX1dPUktfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ1dvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nT3ZlcnRpbWVDb3N0ICE9IG51bGwgOiAhUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ092ZXJ0aW1lQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdPdmVydGltZVdvcmsgIT0gbnVsbCA6ICFSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nT3ZlcnRpbWVXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1dQOgotCQkJCXJldHVybiBpc1NldEFDV1AoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DVjoKLQkJCQlyZXR1cm4gaXNTZXRDVigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfVFlQRToKLQkJCQlyZXR1cm4gQ09OU1RSQUlOVF9UWVBFX0VERUZBVUxUID09IG51bGwgPyBjb25zdHJhaW50VHlwZSAhPSBudWxsIDogIUNPTlNUUkFJTlRfVFlQRV9FREVGQVVMVC5lcXVhbHMoY29uc3RyYWludFR5cGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NBTEVOREFSX1VJRDoKLQkJCQlyZXR1cm4gQ0FMRU5EQVJfVUlEX0VERUZBVUxUID09IG51bGwgPyBjYWxlbmRhclVJRCAhPSBudWxsIDogIUNBTEVOREFSX1VJRF9FREVGQVVMVC5lcXVhbHMoY2FsZW5kYXJVSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfREFURToKLQkJCQlyZXR1cm4gQ09OU1RSQUlOVF9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjb25zdHJhaW50RGF0ZSAhPSBudWxsIDogIUNPTlNUUkFJTlRfREFURV9FREVGQVVMVC5lcXVhbHMoY29uc3RyYWludERhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RFQURMSU5FOgotCQkJCXJldHVybiBERUFETElORV9FREVGQVVMVCA9PSBudWxsID8gZGVhZGxpbmUgIT0gbnVsbCA6ICFERUFETElORV9FREVGQVVMVC5lcXVhbHMoZGVhZGxpbmUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMX0FTU0lHTk1FTlRTOgotCQkJCXJldHVybiBpc1NldExldmVsQXNzaWdubWVudHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTElOR19DQU5fU1BMSVQ6Ci0JCQkJcmV0dXJuIGlzU2V0TGV2ZWxpbmdDYW5TcGxpdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0RFTEFZOgotCQkJCXJldHVybiBMRVZFTElOR19ERUxBWV9FREVGQVVMVCA9PSBudWxsID8gbGV2ZWxpbmdEZWxheSAhPSBudWxsIDogIUxFVkVMSU5HX0RFTEFZX0VERUZBVUxULmVxdWFscyhsZXZlbGluZ0RlbGF5KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTElOR19ERUxBWV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9FREVGQVVMVCA9PSBudWxsID8gbGV2ZWxpbmdEZWxheUZvcm1hdCAhPSBudWxsIDogIUxFVkVMSU5HX0RFTEFZX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMobGV2ZWxpbmdEZWxheUZvcm1hdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFX0xFVkVMRURfU1RBUlQ6Ci0JCQkJcmV0dXJuIFBSRV9MRVZFTEVEX1NUQVJUX0VERUZBVUxUID09IG51bGwgPyBwcmVMZXZlbGVkU3RhcnQgIT0gbnVsbCA6ICFQUkVfTEVWRUxFRF9TVEFSVF9FREVGQVVMVC5lcXVhbHMocHJlTGV2ZWxlZFN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUkVfTEVWRUxFRF9GSU5JU0g6Ci0JCQkJcmV0dXJuIFBSRV9MRVZFTEVEX0ZJTklTSF9FREVGQVVMVCA9PSBudWxsID8gcHJlTGV2ZWxlZEZpbmlzaCAhPSBudWxsIDogIVBSRV9MRVZFTEVEX0ZJTklTSF9FREVGQVVMVC5lcXVhbHMocHJlTGV2ZWxlZEZpbmlzaCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LOgotCQkJCXJldHVybiBIWVBFUkxJTktfRURFRkFVTFQgPT0gbnVsbCA/IGh5cGVybGluayAhPSBudWxsIDogIUhZUEVSTElOS19FREVGQVVMVC5lcXVhbHMoaHlwZXJsaW5rKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlyZXR1cm4gSFlQRVJMSU5LX0FERFJFU1NfRURFRkFVTFQgPT0gbnVsbCA/IGh5cGVybGlua0FkZHJlc3MgIT0gbnVsbCA6ICFIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVC5lcXVhbHMoaHlwZXJsaW5rQWRkcmVzcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LX1NVQl9BRERSRVNTOgotCQkJCXJldHVybiBIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQgPT0gbnVsbCA/IGh5cGVybGlua1N1YkFkZHJlc3MgIT0gbnVsbCA6ICFIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQuZXF1YWxzKGh5cGVybGlua1N1YkFkZHJlc3MpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lHTk9SRV9SRVNPVVJDRV9DQUxFTkRBUjoKLQkJCQlyZXR1cm4gaXNTZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTk9URVM6Ci0JCQkJcmV0dXJuIE5PVEVTX0VERUZBVUxUID09IG51bGwgPyBub3RlcyAhPSBudWxsIDogIU5PVEVTX0VERUZBVUxULmVxdWFscyhub3Rlcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSElERV9CQVI6Ci0JCQkJcmV0dXJuIGlzU2V0SGlkZUJhcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JPTExVUDoKLQkJCQlyZXR1cm4gaXNTZXRSb2xsdXAoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQ1dTOgotCQkJCXJldHVybiBpc1NldEJDV1MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQ1dQOgotCQkJCXJldHVybiBpc1NldEJDV1AoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QSFlTSUNBTF9QRVJDRU5UX0NPTVBMRVRFOgotCQkJCXJldHVybiBQSFlTSUNBTF9QRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxUID09IG51bGwgPyBwaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSAhPSBudWxsIDogIVBIWVNJQ0FMX1BFUkNFTlRfQ09NUExFVEVfRURFRkFVTFQuZXF1YWxzKHBoeXNpY2FsUGVyY2VudENvbXBsZXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJORURfVkFMVUVfTUVUSE9EOgotCQkJCXJldHVybiBFQVJORURfVkFMVUVfTUVUSE9EX0VERUZBVUxUID09IG51bGwgPyBlYXJuZWRWYWx1ZU1ldGhvZCAhPSBudWxsIDogIUVBUk5FRF9WQUxVRV9NRVRIT0RfRURFRkFVTFQuZXF1YWxzKGVhcm5lZFZhbHVlTWV0aG9kKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUkVERUNFU1NPUl9MSU5LOgotCQkJCXJldHVybiBwcmVkZWNlc3NvckxpbmsgIT0gbnVsbCAmJiAhcHJlZGVjZXNzb3JMaW5rLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJcmV0dXJuIEFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsV29ya1Byb3RlY3RlZCAhPSBudWxsIDogIUFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsV29ya1Byb3RlY3RlZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCAhPSBudWxsIDogIUFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlICE9IG51bGwgJiYgIWV4dGVuZGVkQXR0cmlidXRlLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQVNFTElORToKLQkJCQlyZXR1cm4gYmFzZWxpbmUgIT0gbnVsbCAmJiAhYmFzZWxpbmUuaXNFbXB0eSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfQ09ERToKLQkJCQlyZXR1cm4gb3V0bGluZUNvZGUgIT0gbnVsbCAmJiAhb3V0bGluZUNvZGUuaXNFbXB0eSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RJTUVQSEFTRURfREFUQToKLQkJCQlyZXR1cm4gdGltZXBoYXNlZERhdGEgIT0gbnVsbCAmJiAhdGltZXBoYXNlZERhdGEuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1SUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNOdWxsOiAiKTsKLQkJaWYgKGlzTnVsbEVTZXQpIHJlc3VsdC5hcHBlbmQoaXNOdWxsKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3JlYXRlRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3JlYXRlRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29udGFjdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29udGFjdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd0JTOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3QlMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdCU0xldmVsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3QlNMZXZlbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3V0bGluZU51bWJlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3V0bGluZU51bWJlcik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3V0bGluZUxldmVsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvdXRsaW5lTGV2ZWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByaW9yaXR5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcmlvcml0eSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaW5pc2g6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpbmlzaCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZHVyYXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGR1cmF0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkdXJhdGlvbkZvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZHVyYXRpb25Gb3JtYXQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0b3A6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0b3ApOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc3VtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVzdW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXN1bWVWYWxpZDogIik7Ci0JCWlmIChyZXN1bWVWYWxpZEVTZXQpIHJlc3VsdC5hcHBlbmQocmVzdW1lVmFsaWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlZmZvcnREcml2ZW46ICIpOwotCQlpZiAoZWZmb3J0RHJpdmVuRVNldCkgcmVzdWx0LmFwcGVuZChlZmZvcnREcml2ZW4pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZWN1cnJpbmc6ICIpOwotCQlpZiAocmVjdXJyaW5nRVNldCkgcmVzdWx0LmFwcGVuZChyZWN1cnJpbmcpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvdmVyQWxsb2NhdGVkOiAiKTsKLQkJaWYgKG92ZXJBbGxvY2F0ZWRFU2V0KSByZXN1bHQuYXBwZW5kKG92ZXJBbGxvY2F0ZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlc3RpbWF0ZWQ6ICIpOwotCQlpZiAoZXN0aW1hdGVkRVNldCkgcmVzdWx0LmFwcGVuZChlc3RpbWF0ZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtaWxlc3RvbmU6ICIpOwotCQlpZiAobWlsZXN0b25lRVNldCkgcmVzdWx0LmFwcGVuZChtaWxlc3RvbmUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdW1tYXJ5OiAiKTsKLQkJaWYgKHN1bW1hcnlFU2V0KSByZXN1bHQuYXBwZW5kKHN1bW1hcnkpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjcml0aWNhbDogIik7Ci0JCWlmIChjcml0aWNhbEVTZXQpIHJlc3VsdC5hcHBlbmQoY3JpdGljYWwpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc1N1YnByb2plY3Q6ICIpOwotCQlpZiAoaXNTdWJwcm9qZWN0RVNldCkgcmVzdWx0LmFwcGVuZChpc1N1YnByb2plY3QpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc1N1YnByb2plY3RSZWFkT25seTogIik7Ci0JCWlmIChpc1N1YnByb2plY3RSZWFkT25seUVTZXQpIHJlc3VsdC5hcHBlbmQoaXNTdWJwcm9qZWN0UmVhZE9ubHkpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdWJwcm9qZWN0TmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3VicHJvamVjdE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4dGVybmFsVGFzazogIik7Ci0JCWlmIChleHRlcm5hbFRhc2tFU2V0KSByZXN1bHQuYXBwZW5kKGV4dGVybmFsVGFzayk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4dGVybmFsVGFza1Byb2plY3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4dGVybmFsVGFza1Byb2plY3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVhcmx5U3RhcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGVhcmx5U3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVhcmx5RmluaXNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChlYXJseUZpbmlzaCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGF0ZVN0YXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsYXRlU3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhdGVGaW5pc2g6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxhdGVGaW5pc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0VmFyaWFuY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YXJ0VmFyaWFuY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaFZhcmlhbmNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaW5pc2hWYXJpYW5jZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd29ya1ZhcmlhbmNlOiAiKTsKLQkJaWYgKHdvcmtWYXJpYW5jZUVTZXQpIHJlc3VsdC5hcHBlbmQod29ya1ZhcmlhbmNlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZnJlZVNsYWNrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmcmVlU2xhY2spOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRvdGFsU2xhY2s6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRvdGFsU2xhY2spOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpeGVkQ29zdDogIik7Ci0JCWlmIChmaXhlZENvc3RFU2V0KSByZXN1bHQuYXBwZW5kKGZpeGVkQ29zdCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpeGVkQ29zdEFjY3J1YWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpeGVkQ29zdEFjY3J1YWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBlcmNlbnRDb21wbGV0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGVyY2VudENvbXBsZXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwZXJjZW50V29ya0NvbXBsZXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwZXJjZW50V29ya0NvbXBsZXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvdmVydGltZUNvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG92ZXJ0aW1lQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlcnRpbWVXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvdmVydGltZVdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbFN0YXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxTdGFydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsRmluaXNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxGaW5pc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbER1cmF0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxEdXJhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsT3ZlcnRpbWVDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxPdmVydGltZUNvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbFdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbFdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbE92ZXJ0aW1lV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsT3ZlcnRpbWVXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZWd1bGFyV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVndWxhcldvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ0R1cmF0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZW1haW5pbmdEdXJhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVtYWluaW5nQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtYWluaW5nQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVtYWluaW5nV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtYWluaW5nV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVtYWluaW5nT3ZlcnRpbWVDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZW1haW5pbmdPdmVydGltZUNvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ092ZXJ0aW1lV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtYWluaW5nT3ZlcnRpbWVXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhQ1dQOiAiKTsKLQkJaWYgKGFDV1BFU2V0KSByZXN1bHQuYXBwZW5kKGFDV1ApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjVjogIik7Ci0JCWlmIChjVkVTZXQpIHJlc3VsdC5hcHBlbmQoY1YpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb25zdHJhaW50VHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29uc3RyYWludFR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhbGVuZGFyVUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYWxlbmRhclVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29uc3RyYWludERhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbnN0cmFpbnREYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWFkbGluZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVhZGxpbmUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxldmVsQXNzaWdubWVudHM6ICIpOwotCQlpZiAobGV2ZWxBc3NpZ25tZW50c0VTZXQpIHJlc3VsdC5hcHBlbmQobGV2ZWxBc3NpZ25tZW50cyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxldmVsaW5nQ2FuU3BsaXQ6ICIpOwotCQlpZiAobGV2ZWxpbmdDYW5TcGxpdEVTZXQpIHJlc3VsdC5hcHBlbmQobGV2ZWxpbmdDYW5TcGxpdCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxldmVsaW5nRGVsYXk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxldmVsaW5nRGVsYXkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxldmVsaW5nRGVsYXlGb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxldmVsaW5nRGVsYXlGb3JtYXQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByZUxldmVsZWRTdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlTGV2ZWxlZFN0YXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcmVMZXZlbGVkRmluaXNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcmVMZXZlbGVkRmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoeXBlcmxpbms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh5cGVybGluayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaHlwZXJsaW5rQWRkcmVzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaHlwZXJsaW5rQWRkcmVzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaHlwZXJsaW5rU3ViQWRkcmVzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaHlwZXJsaW5rU3ViQWRkcmVzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWdub3JlUmVzb3VyY2VDYWxlbmRhcjogIik7Ci0JCWlmIChpZ25vcmVSZXNvdXJjZUNhbGVuZGFyRVNldCkgcmVzdWx0LmFwcGVuZChpZ25vcmVSZXNvdXJjZUNhbGVuZGFyKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbm90ZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5vdGVzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoaWRlQmFyOiAiKTsKLQkJaWYgKGhpZGVCYXJFU2V0KSByZXN1bHQuYXBwZW5kKGhpZGVCYXIpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByb2xsdXA6ICIpOwotCQlpZiAocm9sbHVwRVNldCkgcmVzdWx0LmFwcGVuZChyb2xsdXApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dTOiAiKTsKLQkJaWYgKGJDV1NFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1MpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dQOiAiKTsKLQkJaWYgKGJDV1BFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1ApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwaHlzaWNhbFBlcmNlbnRDb21wbGV0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGh5c2ljYWxQZXJjZW50Q29tcGxldGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVhcm5lZFZhbHVlTWV0aG9kOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChlYXJuZWRWYWx1ZU1ldGhvZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsV29ya1Byb3RlY3RlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsV29ya1Byb3RlY3RlZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UYXNrSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1Rhc2tzSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1Rhc2tzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2Y1ZWVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9UYXNrc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRhc2tzSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2tzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza3NJbXBsI2dldFRhc2sgPGVtPlRhc2s8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrc0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFRhc2tzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXNrKCkgPGVtPlRhc2s8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRhc2sgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRhc2soKSB7Ci0JCWlmICh0YXNrID09IG51bGwpIHsKLQkJCXRhc2sgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVGFzay5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5UQVNLU19fVEFTSyk7Ci0JCX0KLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tTX19UQVNLOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFRhc2soKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tTX19UQVNLOgotCQkJCXJldHVybiBnZXRUYXNrKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tTX19UQVNLOgotCQkJCWdldFRhc2soKS5jbGVhcigpOwotCQkJCWdldFRhc2soKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS1NfX1RBU0s6Ci0JCQkJZ2V0VGFzaygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS1NfX1RBU0s6Ci0JCQkJcmV0dXJuIHRhc2sgIT0gbnVsbCAmJiAhdGFzay5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL1Rhc2tzSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1RpbWVQZXJpb2RJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVGltZVBlcmlvZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRlNzE4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVGltZVBlcmlvZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRpbWVQZXJpb2RJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRpbWUgUGVyaW9kPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZVBlcmlvZEltcGwjZ2V0RnJvbURhdGUgPGVtPkZyb20gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRpbWVQZXJpb2RJbXBsI2dldFRvRGF0ZSA8ZW0+VG8gRGF0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRpbWVQZXJpb2RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBUaW1lUGVyaW9kIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnJvbURhdGUoKSA8ZW0+RnJvbSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGcm9tRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgRlJPTV9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZyb21EYXRlKCkgPGVtPkZyb20gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnJvbURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZnJvbURhdGUgPSBGUk9NX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG9EYXRlKCkgPGVtPlRvIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRvRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9fREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb0RhdGUoKSA8ZW0+VG8gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHRvRGF0ZSA9IFRPX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGltZVBlcmlvZEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRUaW1lUGVyaW9kKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGcm9tRGF0ZSgpIHsKLQkJcmV0dXJuIGZyb21EYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZyb21EYXRlKE9iamVjdCBuZXdGcm9tRGF0ZSkgewotCQlPYmplY3Qgb2xkRnJvbURhdGUgPSBmcm9tRGF0ZTsKLQkJZnJvbURhdGUgPSBuZXdGcm9tRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5USU1FX1BFUklPRF9fRlJPTV9EQVRFLCBvbGRGcm9tRGF0ZSwgZnJvbURhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFRvRGF0ZSgpIHsKLQkJcmV0dXJuIHRvRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb0RhdGUoT2JqZWN0IG5ld1RvRGF0ZSkgewotCQlPYmplY3Qgb2xkVG9EYXRlID0gdG9EYXRlOwotCQl0b0RhdGUgPSBuZXdUb0RhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0RfX1RPX0RBVEUsIG9sZFRvRGF0ZSwgdG9EYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EX19GUk9NX0RBVEU6Ci0JCQkJcmV0dXJuIGdldEZyb21EYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0RfX1RPX0RBVEU6Ci0JCQkJcmV0dXJuIGdldFRvRGF0ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FX1BFUklPRF9fRlJPTV9EQVRFOgotCQkJCXNldEZyb21EYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FX1BFUklPRF9fVE9fREFURToKLQkJCQlzZXRUb0RhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FX1BFUklPRF9fRlJPTV9EQVRFOgotCQkJCXNldEZyb21EYXRlKEZST01fREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EX19UT19EQVRFOgotCQkJCXNldFRvRGF0ZShUT19EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FX1BFUklPRF9fRlJPTV9EQVRFOgotCQkJCXJldHVybiBGUk9NX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGZyb21EYXRlICE9IG51bGwgOiAhRlJPTV9EQVRFX0VERUZBVUxULmVxdWFscyhmcm9tRGF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0RfX1RPX0RBVEU6Ci0JCQkJcmV0dXJuIFRPX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IHRvRGF0ZSAhPSBudWxsIDogIVRPX0RBVEVfRURFRkFVTFQuZXF1YWxzKHRvRGF0ZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmcm9tRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZnJvbURhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRvRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodG9EYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVGltZVBlcmlvZEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9UaW1lcGhhc2VkRGF0YVR5cGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVGltZXBoYXNlZERhdGFUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzJhMGNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9UaW1lcGhhc2VkRGF0YVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUaW1lcGhhc2VkRGF0YVR5cGVJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGEgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRpbWVwaGFzZWREYXRhVHlwZUltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRpbWVwaGFzZWREYXRhVHlwZUltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lcGhhc2VkRGF0YVR5cGVJbXBsI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRpbWVwaGFzZWREYXRhVHlwZUltcGwjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lcGhhc2VkRGF0YVR5cGVJbXBsI2dldFVuaXQgPGVtPlVuaXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lcGhhc2VkRGF0YVR5cGVJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRpbWVwaGFzZWREYXRhVHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFRpbWVwaGFzZWREYXRhVHlwZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBTVEFSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydCgpIDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgc3RhcnQgPSBTVEFSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2goKSA8ZW0+RmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEZJTklTSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2goKSA8ZW0+RmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZmluaXNoID0gRklOSVNIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVuaXQoKSA8ZW0+VW5pdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFVOSVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5pdCgpIDxlbT5Vbml0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB1bml0ID0gVU5JVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRpbWVwaGFzZWREYXRhVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRUaW1lcGhhc2VkRGF0YVR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKEJpZ0ludGVnZXIgbmV3VHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFVJRCgpIHsKLQkJcmV0dXJuIHVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVSUQoQmlnSW50ZWdlciBuZXdVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRVSUQgPSB1SUQ7Ci0JCXVJRCA9IG5ld1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVUlELCBvbGRVSUQsIHVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChPYmplY3QgbmV3U3RhcnQpIHsKLQkJT2JqZWN0IG9sZFN0YXJ0ID0gc3RhcnQ7Ci0JCXN0YXJ0ID0gbmV3U3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1NUQVJULCBvbGRTdGFydCwgc3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZpbmlzaCgpIHsKLQkJcmV0dXJuIGZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2goT2JqZWN0IG5ld0ZpbmlzaCkgewotCQlPYmplY3Qgb2xkRmluaXNoID0gZmluaXNoOwotCQlmaW5pc2ggPSBuZXdGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX0ZJTklTSCwgb2xkRmluaXNoLCBmaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRVbml0KCkgewotCQlyZXR1cm4gdW5pdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbml0KEJpZ0ludGVnZXIgbmV3VW5pdCkgewotCQlCaWdJbnRlZ2VyIG9sZFVuaXQgPSB1bml0OwotCQl1bml0ID0gbmV3VW5pdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVU5JVCwgb2xkVW5pdCwgdW5pdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVUlEOgotCQkJCXJldHVybiBnZXRVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldFN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0RmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VOSVQ6Ci0JCQkJcmV0dXJuIGdldFVuaXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19UWVBFOgotCQkJCXNldFR5cGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVUlEOgotCQkJCXNldFVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19TVEFSVDoKLQkJCQlzZXRTdGFydCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19VTklUOgotCQkJCXNldFVuaXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVUlEOgotCQkJCXNldFVJRChVSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoU1RBUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fRklOSVNIOgotCQkJCXNldEZpbmlzaChGSU5JU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVU5JVDoKLQkJCQlzZXRVbml0KFVOSVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19UWVBFOgotCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VJRDoKLQkJCQlyZXR1cm4gVUlEX0VERUZBVUxUID09IG51bGwgPyB1SUQgIT0gbnVsbCA6ICFVSURfRURFRkFVTFQuZXF1YWxzKHVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1NUQVJUOgotCQkJCXJldHVybiBTVEFSVF9FREVGQVVMVCA9PSBudWxsID8gc3RhcnQgIT0gbnVsbCA6ICFTVEFSVF9FREVGQVVMVC5lcXVhbHMoc3RhcnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19GSU5JU0g6Ci0JCQkJcmV0dXJuIEZJTklTSF9FREVGQVVMVCA9PSBudWxsID8gZmluaXNoICE9IG51bGwgOiAhRklOSVNIX0VERUZBVUxULmVxdWFscyhmaW5pc2gpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19VTklUOgotCQkJCXJldHVybiBVTklUX0VERUZBVUxUID09IG51bGwgPyB1bml0ICE9IG51bGwgOiAhVU5JVF9FREVGQVVMVC5lcXVhbHModW5pdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1SUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGFydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmluaXNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaW5pc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVuaXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVuaXQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1RpbWVwaGFzZWREYXRhVHlwZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZTJJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVmFsdWUySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDk0NDkzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZTJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBWYWx1ZTJJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYWx1ZTI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZTJJbXBsI2dldElEIDxlbT5JRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlMkltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWUySW1wbCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWx1ZTJJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBWYWx1ZTIgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJRCgpIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJRCgpIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGlEID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFZhbHVlMkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYWx1ZTIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRJRCgpIHsKLQkJcmV0dXJuIGlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElEKEJpZ0ludGVnZXIgbmV3SUQpIHsKLQkJQmlnSW50ZWdlciBvbGRJRCA9IGlEOwotCQlpRCA9IG5ld0lEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fSUQsIG9sZElELCBpRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19JRDoKLQkJCQlyZXR1cm4gZ2V0SUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fSUQ6Ci0JCQkJc2V0SUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19JRDoKLQkJCQlzZXRJRChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaUQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9WYWx1ZTJJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVmFsdWVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVmFsdWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZTFkZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVmFsdWVJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVJbXBsI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVJbXBsI2dldFBhcmVudFZhbHVlSUQgPGVtPlBhcmVudCBWYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZUltcGwjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVmFsdWVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBWYWx1ZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlSUQoKSA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBWQUxVRV9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB2YWx1ZUlEID0gVkFMVUVfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyZW50VmFsdWVJRCgpIDxlbT5QYXJlbnQgVmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmVudFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBQQVJFTlRfVkFMVUVfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyZW50VmFsdWVJRCgpIDxlbT5QYXJlbnQgVmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmVudFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHBhcmVudFZhbHVlSUQgPSBQQVJFTlRfVkFMVUVfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFZhbHVlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpIHsKLQkJcmV0dXJuIHZhbHVlSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIG5ld1ZhbHVlSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRWYWx1ZUlEID0gdmFsdWVJRDsKLQkJdmFsdWVJRCA9IG5ld1ZhbHVlSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1ZBTFVFX0lELCBvbGRWYWx1ZUlELCB2YWx1ZUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UGFyZW50VmFsdWVJRCgpIHsKLQkJcmV0dXJuIHBhcmVudFZhbHVlSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50VmFsdWVJRChCaWdJbnRlZ2VyIG5ld1BhcmVudFZhbHVlSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRQYXJlbnRWYWx1ZUlEID0gcGFyZW50VmFsdWVJRDsKLQkJcGFyZW50VmFsdWVJRCA9IG5ld1BhcmVudFZhbHVlSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1BBUkVOVF9WQUxVRV9JRCwgb2xkUGFyZW50VmFsdWVJRCwgcGFyZW50VmFsdWVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gZ2V0VmFsdWVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19QQVJFTlRfVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIGdldFBhcmVudFZhbHVlSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fVkFMVUVfSUQ6Ci0JCQkJc2V0VmFsdWVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19QQVJFTlRfVkFMVUVfSUQ6Ci0JCQkJc2V0UGFyZW50VmFsdWVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoVkFMVUVfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fUEFSRU5UX1ZBTFVFX0lEOgotCQkJCXNldFBhcmVudFZhbHVlSUQoUEFSRU5UX1ZBTFVFX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIFZBTFVFX0lEX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZUlEICE9IG51bGwgOiAhVkFMVUVfSURfRURFRkFVTFQuZXF1YWxzKHZhbHVlSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19QQVJFTlRfVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIFBBUkVOVF9WQUxVRV9JRF9FREVGQVVMVCA9PSBudWxsID8gcGFyZW50VmFsdWVJRCAhPSBudWxsIDogIVBBUkVOVF9WQUxVRV9JRF9FREVGQVVMVC5lcXVhbHMocGFyZW50VmFsdWVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZhbHVlSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhcmVudFZhbHVlSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhcmVudFZhbHVlSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVmFsdWVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVmFsdWVMaXN0SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlNzdlMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVmFsdWVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVmFsdWVMaXN0SW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlZhbHVlIExpc3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZUxpc3RJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFZhbHVlTGlzdEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFZhbHVlTGlzdCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB2YWx1ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFsdWVMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFZhbHVlTGlzdCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRWYWx1ZSgpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFZhbHVlMi5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9MSVNUX19WQUxVRSk7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9MSVNUX19WQUxVRToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRWYWx1ZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfTElTVF9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX0xJU1RfX1ZBTFVFOgotCQkJCWdldFZhbHVlKCkuY2xlYXIoKTsKLQkJCQlnZXRWYWx1ZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9MSVNUX19WQUxVRToKLQkJCQlnZXRWYWx1ZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfTElTVF9fVkFMVUU6Ci0JCQkJcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgIXZhbHVlLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vVmFsdWVMaXN0SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZTg1MjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFZhbHVlc0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYWx1ZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZXNJbXBsI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlc0ltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVmFsdWVzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgVmFsdWVzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cCgpIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFZhbHVlc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYWx1ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cCgpIHsKLQkJaWYgKGdyb3VwID09IG51bGwpIHsKLQkJCWdyb3VwID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlZBTFVFU19fR1JPVVApOwotCQl9Ci0JCXJldHVybiBncm91cDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYWx1ZXNfVmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFU19fR1JPVVA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX1ZBTFVFOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFZhbHVlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX0dST1VQOgotCQkJCXJldHVybiBnZXRHcm91cCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFU19fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFU19fR1JPVVA6Ci0JCQkJZ2V0R3JvdXAoKS5jbGVhcigpOwotCQkJCWdldEdyb3VwKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVTX19WQUxVRToKLQkJCQlnZXRWYWx1ZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0VmFsdWUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVTX19HUk9VUDoKLQkJCQlnZXRHcm91cCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFU19fVkFMVUU6Ci0JCQkJZ2V0VmFsdWUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFU19fR1JPVVA6Ci0JCQkJcmV0dXJuIGdyb3VwICE9IG51bGwgJiYgIWdyb3VwLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX1ZBTFVFOgotCQkJCXJldHVybiAhZ2V0VmFsdWUoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXApOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9WYWx1ZXNJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV0JTTWFza0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XQlNNYXNrSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjVhYTAwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XQlNNYXNrSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV0JTTWFza0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2s7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XQlMgTWFzazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tJbXBsI2dldExldmVsIDxlbT5MZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XQlNNYXNrSW1wbCNnZXRMZW5ndGggPGVtPkxlbmd0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tJbXBsI2dldFNlcGFyYXRvciA8ZW0+U2VwYXJhdG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV0JTTWFza0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdCU01hc2sgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbCgpIDxlbT5MZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBMRVZFTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbCgpIDxlbT5MZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGxldmVsID0gTEVWRUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExlbmd0aCgpIDxlbT5MZW5ndGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExlbmd0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVOR1RIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExlbmd0aCgpIDxlbT5MZW5ndGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExlbmd0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsZW5ndGggPSBMRU5HVEhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VwYXJhdG9yKCkgPGVtPlNlcGFyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VwYXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVBBUkFUT1JfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VwYXJhdG9yKCkgPGVtPlNlcGFyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VwYXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcGFyYXRvciA9IFNFUEFSQVRPUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXQlNNYXNrSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdCU01hc2soKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRMZXZlbCgpIHsKLQkJcmV0dXJuIGxldmVsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExldmVsKEJpZ0ludGVnZXIgbmV3TGV2ZWwpIHsKLQkJQmlnSW50ZWdlciBvbGRMZXZlbCA9IGxldmVsOwotCQlsZXZlbCA9IG5ld0xldmVsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19MRVZFTCwgb2xkTGV2ZWwsIGxldmVsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIG5ld1R5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoU3RyaW5nIG5ld0xlbmd0aCkgewotCQlTdHJpbmcgb2xkTGVuZ3RoID0gbGVuZ3RoOwotCQlsZW5ndGggPSBuZXdMZW5ndGg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX0xFTkdUSCwgb2xkTGVuZ3RoLCBsZW5ndGgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcGFyYXRvcigpIHsKLQkJcmV0dXJuIHNlcGFyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXBhcmF0b3IoU3RyaW5nIG5ld1NlcGFyYXRvcikgewotCQlTdHJpbmcgb2xkU2VwYXJhdG9yID0gc2VwYXJhdG9yOwotCQlzZXBhcmF0b3IgPSBuZXdTZXBhcmF0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX1NFUEFSQVRPUiwgb2xkU2VwYXJhdG9yLCBzZXBhcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX0xFVkVMOgotCQkJCXJldHVybiBnZXRMZXZlbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX0xFTkdUSDoKLQkJCQlyZXR1cm4gZ2V0TGVuZ3RoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX1NFUEFSQVRPUjoKLQkJCQlyZXR1cm4gZ2V0U2VwYXJhdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19MRVZFTDoKLQkJCQlzZXRMZXZlbCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19UWVBFOgotCQkJCXNldFR5cGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fTEVOR1RIOgotCQkJCXNldExlbmd0aCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX1NFUEFSQVRPUjoKLQkJCQlzZXRTZXBhcmF0b3IoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fTEVWRUw6Ci0JCQkJc2V0TGV2ZWwoTEVWRUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fTEVOR1RIOgotCQkJCXNldExlbmd0aChMRU5HVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fU0VQQVJBVE9SOgotCQkJCXNldFNlcGFyYXRvcihTRVBBUkFUT1JfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19MRVZFTDoKLQkJCQlyZXR1cm4gTEVWRUxfRURFRkFVTFQgPT0gbnVsbCA/IGxldmVsICE9IG51bGwgOiAhTEVWRUxfRURFRkFVTFQuZXF1YWxzKGxldmVsKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19MRU5HVEg6Ci0JCQkJcmV0dXJuIExFTkdUSF9FREVGQVVMVCA9PSBudWxsID8gbGVuZ3RoICE9IG51bGwgOiAhTEVOR1RIX0VERUZBVUxULmVxdWFscyhsZW5ndGgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19TRVBBUkFUT1I6Ci0JCQkJcmV0dXJuIFNFUEFSQVRPUl9FREVGQVVMVCA9PSBudWxsID8gc2VwYXJhdG9yICE9IG51bGwgOiAhU0VQQVJBVE9SX0VERUZBVUxULmVxdWFscyhzZXBhcmF0b3IpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobGV2ZWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxldmVsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0eXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0eXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZW5ndGg6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxlbmd0aCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2VwYXJhdG9yOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzZXBhcmF0b3IpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9XQlNNYXNrSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1dCU01hc2tzSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1dCU01hc2tzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2ZkNzEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XQlNNYXNrc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdCU01hc2tzSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3M7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XQlMgTWFza3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XQlNNYXNrc0ltcGwjaXNWZXJpZnlVbmlxdWVDb2RlcyA8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tzSW1wbCNpc0dlbmVyYXRlQ29kZXMgPGVtPkdlbmVyYXRlIENvZGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV0JTTWFza3NJbXBsI2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV0JTTWFza3NJbXBsI2dldFdCU01hc2sgPGVtPldCUyBNYXNrPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV0JTTWFza3NJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBXQlNNYXNrcyB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVmVyaWZ5VW5pcXVlQ29kZXMoKSA8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFZFUklGWV9VTklRVUVfQ09ERVNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVmVyaWZ5VW5pcXVlQ29kZXMoKSA8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmVyaWZ5VW5pcXVlQ29kZXMgPSBWRVJJRllfVU5JUVVFX0NPREVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBWZXJpZnkgVW5pcXVlIENvZGVzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJpZnlVbmlxdWVDb2Rlc0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlQ29kZXMoKSA8ZW0+R2VuZXJhdGUgQ29kZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzR2VuZXJhdGVDb2RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEdFTkVSQVRFX0NPREVTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlQ29kZXMoKSA8ZW0+R2VuZXJhdGUgQ29kZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzR2VuZXJhdGVDb2RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhdGVDb2RlcyA9IEdFTkVSQVRFX0NPREVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBHZW5lcmF0ZSBDb2RlcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhdGVDb2Rlc0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVmaXgoKSA8ZW0+UHJlZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVmaXgoKSA8ZW0+UHJlZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJlZml4ID0gUFJFRklYX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V0JTTWFzaygpIDxlbT5XQlMgTWFzazwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXQlNNYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgd0JTTWFzayA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV0JTTWFza3NJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0V0JTTWFza3MoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZlcmlmeVVuaXF1ZUNvZGVzKCkgewotCQlyZXR1cm4gdmVyaWZ5VW5pcXVlQ29kZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyaWZ5VW5pcXVlQ29kZXMoYm9vbGVhbiBuZXdWZXJpZnlVbmlxdWVDb2RlcykgewotCQlib29sZWFuIG9sZFZlcmlmeVVuaXF1ZUNvZGVzID0gdmVyaWZ5VW5pcXVlQ29kZXM7Ci0JCXZlcmlmeVVuaXF1ZUNvZGVzID0gbmV3VmVyaWZ5VW5pcXVlQ29kZXM7Ci0JCWJvb2xlYW4gb2xkVmVyaWZ5VW5pcXVlQ29kZXNFU2V0ID0gdmVyaWZ5VW5pcXVlQ29kZXNFU2V0OwotCQl2ZXJpZnlVbmlxdWVDb2Rlc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fVkVSSUZZX1VOSVFVRV9DT0RFUywgb2xkVmVyaWZ5VW5pcXVlQ29kZXMsIHZlcmlmeVVuaXF1ZUNvZGVzLCAhb2xkVmVyaWZ5VW5pcXVlQ29kZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRWZXJpZnlVbmlxdWVDb2RlcygpIHsKLQkJYm9vbGVhbiBvbGRWZXJpZnlVbmlxdWVDb2RlcyA9IHZlcmlmeVVuaXF1ZUNvZGVzOwotCQlib29sZWFuIG9sZFZlcmlmeVVuaXF1ZUNvZGVzRVNldCA9IHZlcmlmeVVuaXF1ZUNvZGVzRVNldDsKLQkJdmVyaWZ5VW5pcXVlQ29kZXMgPSBWRVJJRllfVU5JUVVFX0NPREVTX0VERUZBVUxUOwotCQl2ZXJpZnlVbmlxdWVDb2Rlc0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fVkVSSUZZX1VOSVFVRV9DT0RFUywgb2xkVmVyaWZ5VW5pcXVlQ29kZXMsIFZFUklGWV9VTklRVUVfQ09ERVNfRURFRkFVTFQsIG9sZFZlcmlmeVVuaXF1ZUNvZGVzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VmVyaWZ5VW5pcXVlQ29kZXMoKSB7Ci0JCXJldHVybiB2ZXJpZnlVbmlxdWVDb2Rlc0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZUNvZGVzKCkgewotCQlyZXR1cm4gZ2VuZXJhdGVDb2RlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUNvZGVzKGJvb2xlYW4gbmV3R2VuZXJhdGVDb2RlcykgewotCQlib29sZWFuIG9sZEdlbmVyYXRlQ29kZXMgPSBnZW5lcmF0ZUNvZGVzOwotCQlnZW5lcmF0ZUNvZGVzID0gbmV3R2VuZXJhdGVDb2RlczsKLQkJYm9vbGVhbiBvbGRHZW5lcmF0ZUNvZGVzRVNldCA9IGdlbmVyYXRlQ29kZXNFU2V0OwotCQlnZW5lcmF0ZUNvZGVzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19HRU5FUkFURV9DT0RFUywgb2xkR2VuZXJhdGVDb2RlcywgZ2VuZXJhdGVDb2RlcywgIW9sZEdlbmVyYXRlQ29kZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRHZW5lcmF0ZUNvZGVzKCkgewotCQlib29sZWFuIG9sZEdlbmVyYXRlQ29kZXMgPSBnZW5lcmF0ZUNvZGVzOwotCQlib29sZWFuIG9sZEdlbmVyYXRlQ29kZXNFU2V0ID0gZ2VuZXJhdGVDb2Rlc0VTZXQ7Ci0JCWdlbmVyYXRlQ29kZXMgPSBHRU5FUkFURV9DT0RFU19FREVGQVVMVDsKLQkJZ2VuZXJhdGVDb2Rlc0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fR0VORVJBVEVfQ09ERVMsIG9sZEdlbmVyYXRlQ29kZXMsIEdFTkVSQVRFX0NPREVTX0VERUZBVUxULCBvbGRHZW5lcmF0ZUNvZGVzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0R2VuZXJhdGVDb2RlcygpIHsKLQkJcmV0dXJuIGdlbmVyYXRlQ29kZXNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlyZXR1cm4gcHJlZml4OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgbmV3UHJlZml4KSB7Ci0JCVN0cmluZyBvbGRQcmVmaXggPSBwcmVmaXg7Ci0JCXByZWZpeCA9IG5ld1ByZWZpeDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1BSRUZJWCwgb2xkUHJlZml4LCBwcmVmaXgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0V0JTTWFzaygpIHsKLQkJaWYgKHdCU01hc2sgPT0gbnVsbCkgewotCQkJd0JTTWFzayA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChXQlNNYXNrLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fV0JTX01BU0spOwotCQl9Ci0JCXJldHVybiB3QlNNYXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1dCU19NQVNLOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFdCU01hc2soKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fVkVSSUZZX1VOSVFVRV9DT0RFUzoKLQkJCQlyZXR1cm4gaXNWZXJpZnlVbmlxdWVDb2RlcygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX0dFTkVSQVRFX0NPREVTOgotCQkJCXJldHVybiBpc0dlbmVyYXRlQ29kZXMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19QUkVGSVg6Ci0JCQkJcmV0dXJuIGdldFByZWZpeCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fV0JTX01BU0s6Ci0JCQkJcmV0dXJuIGdldFdCU01hc2soKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19WRVJJRllfVU5JUVVFX0NPREVTOgotCQkJCXNldFZlcmlmeVVuaXF1ZUNvZGVzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX0dFTkVSQVRFX0NPREVTOgotCQkJCXNldEdlbmVyYXRlQ29kZXMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fUFJFRklYOgotCQkJCXNldFByZWZpeCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19XQlNfTUFTSzoKLQkJCQlnZXRXQlNNYXNrKCkuY2xlYXIoKTsKLQkJCQlnZXRXQlNNYXNrKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fVkVSSUZZX1VOSVFVRV9DT0RFUzoKLQkJCQl1bnNldFZlcmlmeVVuaXF1ZUNvZGVzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fR0VORVJBVEVfQ09ERVM6Ci0JCQkJdW5zZXRHZW5lcmF0ZUNvZGVzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fUFJFRklYOgotCQkJCXNldFByZWZpeChQUkVGSVhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1dCU19NQVNLOgotCQkJCWdldFdCU01hc2soKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fVkVSSUZZX1VOSVFVRV9DT0RFUzoKLQkJCQlyZXR1cm4gaXNTZXRWZXJpZnlVbmlxdWVDb2RlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fR0VORVJBVEVfQ09ERVM6Ci0JCQkJcmV0dXJuIGlzU2V0R2VuZXJhdGVDb2RlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fUFJFRklYOgotCQkJCXJldHVybiBQUkVGSVhfRURFRkFVTFQgPT0gbnVsbCA/IHByZWZpeCAhPSBudWxsIDogIVBSRUZJWF9FREVGQVVMVC5lcXVhbHMocHJlZml4KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1dCU19NQVNLOgotCQkJCXJldHVybiB3QlNNYXNrICE9IG51bGwgJiYgIXdCU01hc2suaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmVyaWZ5VW5pcXVlQ29kZXM6ICIpOwotCQlpZiAodmVyaWZ5VW5pcXVlQ29kZXNFU2V0KSByZXN1bHQuYXBwZW5kKHZlcmlmeVVuaXF1ZUNvZGVzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ2VuZXJhdGVDb2RlczogIik7Ci0JCWlmIChnZW5lcmF0ZUNvZGVzRVNldCkgcmVzdWx0LmFwcGVuZChnZW5lcmF0ZUNvZGVzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJlZml4OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcmVmaXgpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9XQlNNYXNrc0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XZWVrRGF5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1dlZWtEYXlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZTQ5YzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1dlZWtEYXlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXZWVrRGF5SW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldlZWsgRGF5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV2Vla0RheUltcGwjZ2V0RGF5VHlwZSA8ZW0+RGF5IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XZWVrRGF5SW1wbCNpc0RheVdvcmtpbmcgPGVtPkRheSBXb3JraW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV2Vla0RheUltcGwjZ2V0VGltZVBlcmlvZCA8ZW0+VGltZSBQZXJpb2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XZWVrRGF5SW1wbCNnZXRXb3JraW5nVGltZXMgPGVtPldvcmtpbmcgVGltZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWVrRGF5SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV2Vla0RheSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERheVR5cGUoKSA8ZW0+RGF5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERheVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBEQVlfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXlUeXBlKCkgPGVtPkRheSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREYXlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBkYXlUeXBlID0gREFZX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEYXlXb3JraW5nKCkgPGVtPkRheSBXb3JraW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0RheVdvcmtpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQVlfV09SS0lOR19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEYXlXb3JraW5nKCkgPGVtPkRheSBXb3JraW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0RheVdvcmtpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRheVdvcmtpbmcgPSBEQVlfV09SS0lOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRGF5IFdvcmtpbmcgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRheVdvcmtpbmdFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUaW1lUGVyaW9kKCkgPGVtPlRpbWUgUGVyaW9kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaW1lUGVyaW9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGltZVBlcmlvZCB0aW1lUGVyaW9kID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtpbmdUaW1lcygpIDxlbT5Xb3JraW5nIFRpbWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JraW5nVGltZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBXb3JraW5nVGltZXMgd29ya2luZ1RpbWVzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXZWVrRGF5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlZWtEYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREYXlUeXBlKCkgewotCQlyZXR1cm4gZGF5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXlUeXBlKEJpZ0ludGVnZXIgbmV3RGF5VHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZERheVR5cGUgPSBkYXlUeXBlOwotCQlkYXlUeXBlID0gbmV3RGF5VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fREFZX1RZUEUsIG9sZERheVR5cGUsIGRheVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RheVdvcmtpbmcoKSB7Ci0JCXJldHVybiBkYXlXb3JraW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERheVdvcmtpbmcoYm9vbGVhbiBuZXdEYXlXb3JraW5nKSB7Ci0JCWJvb2xlYW4gb2xkRGF5V29ya2luZyA9IGRheVdvcmtpbmc7Ci0JCWRheVdvcmtpbmcgPSBuZXdEYXlXb3JraW5nOwotCQlib29sZWFuIG9sZERheVdvcmtpbmdFU2V0ID0gZGF5V29ya2luZ0VTZXQ7Ci0JCWRheVdvcmtpbmdFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fREFZX1dPUktJTkcsIG9sZERheVdvcmtpbmcsIGRheVdvcmtpbmcsICFvbGREYXlXb3JraW5nRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RGF5V29ya2luZygpIHsKLQkJYm9vbGVhbiBvbGREYXlXb3JraW5nID0gZGF5V29ya2luZzsKLQkJYm9vbGVhbiBvbGREYXlXb3JraW5nRVNldCA9IGRheVdvcmtpbmdFU2V0OwotCQlkYXlXb3JraW5nID0gREFZX1dPUktJTkdfRURFRkFVTFQ7Ci0JCWRheVdvcmtpbmdFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fREFZX1dPUktJTkcsIG9sZERheVdvcmtpbmcsIERBWV9XT1JLSU5HX0VERUZBVUxULCBvbGREYXlXb3JraW5nRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RGF5V29ya2luZygpIHsKLQkJcmV0dXJuIGRheVdvcmtpbmdFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUaW1lUGVyaW9kIGdldFRpbWVQZXJpb2QoKSB7Ci0JCXJldHVybiB0aW1lUGVyaW9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFRpbWVQZXJpb2QoVGltZVBlcmlvZCBuZXdUaW1lUGVyaW9kLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVRpbWVQZXJpb2Qgb2xkVGltZVBlcmlvZCA9IHRpbWVQZXJpb2Q7Ci0JCXRpbWVQZXJpb2QgPSBuZXdUaW1lUGVyaW9kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19USU1FX1BFUklPRCwgb2xkVGltZVBlcmlvZCwgbmV3VGltZVBlcmlvZCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGltZVBlcmlvZChUaW1lUGVyaW9kIG5ld1RpbWVQZXJpb2QpIHsKLQkJaWYgKG5ld1RpbWVQZXJpb2QgIT0gdGltZVBlcmlvZCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodGltZVBlcmlvZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0aW1lUGVyaW9kKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fVElNRV9QRVJJT0QsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1RpbWVQZXJpb2QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VGltZVBlcmlvZCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1RJTUVfUEVSSU9ELCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFRpbWVQZXJpb2QobmV3VGltZVBlcmlvZCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19USU1FX1BFUklPRCwgbmV3VGltZVBlcmlvZCwgbmV3VGltZVBlcmlvZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JraW5nVGltZXMgZ2V0V29ya2luZ1RpbWVzKCkgewotCQlyZXR1cm4gd29ya2luZ1RpbWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFdvcmtpbmdUaW1lcyhXb3JraW5nVGltZXMgbmV3V29ya2luZ1RpbWVzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVdvcmtpbmdUaW1lcyBvbGRXb3JraW5nVGltZXMgPSB3b3JraW5nVGltZXM7Ci0JCXdvcmtpbmdUaW1lcyA9IG5ld1dvcmtpbmdUaW1lczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fV09SS0lOR19USU1FUywgb2xkV29ya2luZ1RpbWVzLCBuZXdXb3JraW5nVGltZXMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtpbmdUaW1lcyhXb3JraW5nVGltZXMgbmV3V29ya2luZ1RpbWVzKSB7Ci0JCWlmIChuZXdXb3JraW5nVGltZXMgIT0gd29ya2luZ1RpbWVzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh3b3JraW5nVGltZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpd29ya2luZ1RpbWVzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fV09SS0lOR19USU1FUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3V29ya2luZ1RpbWVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dvcmtpbmdUaW1lcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1dPUktJTkdfVElNRVMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V29ya2luZ1RpbWVzKG5ld1dvcmtpbmdUaW1lcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19XT1JLSU5HX1RJTUVTLCBuZXdXb3JraW5nVGltZXMsIG5ld1dvcmtpbmdUaW1lcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fVElNRV9QRVJJT0Q6Ci0JCQkJCXJldHVybiBiYXNpY1NldFRpbWVQZXJpb2QobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19XT1JLSU5HX1RJTUVTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRXb3JraW5nVGltZXMobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9UWVBFOgotCQkJCXJldHVybiBnZXREYXlUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9XT1JLSU5HOgotCQkJCXJldHVybiBpc0RheVdvcmtpbmcoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1RJTUVfUEVSSU9EOgotCQkJCXJldHVybiBnZXRUaW1lUGVyaW9kKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1dPUktJTkdfVElNRVM6Ci0JCQkJcmV0dXJuIGdldFdvcmtpbmdUaW1lcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fREFZX1RZUEU6Ci0JCQkJc2V0RGF5VHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19EQVlfV09SS0lORzoKLQkJCQlzZXREYXlXb3JraW5nKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fVElNRV9QRVJJT0Q6Ci0JCQkJc2V0VGltZVBlcmlvZCgoVGltZVBlcmlvZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19XT1JLSU5HX1RJTUVTOgotCQkJCXNldFdvcmtpbmdUaW1lcygoV29ya2luZ1RpbWVzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19EQVlfVFlQRToKLQkJCQlzZXREYXlUeXBlKERBWV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9XT1JLSU5HOgotCQkJCXVuc2V0RGF5V29ya2luZygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fVElNRV9QRVJJT0Q6Ci0JCQkJc2V0VGltZVBlcmlvZCgoVGltZVBlcmlvZCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1dPUktJTkdfVElNRVM6Ci0JCQkJc2V0V29ya2luZ1RpbWVzKChXb3JraW5nVGltZXMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9UWVBFOgotCQkJCXJldHVybiBEQVlfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZGF5VHlwZSAhPSBudWxsIDogIURBWV9UWVBFX0VERUZBVUxULmVxdWFscyhkYXlUeXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fREFZX1dPUktJTkc6Ci0JCQkJcmV0dXJuIGlzU2V0RGF5V29ya2luZygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19USU1FX1BFUklPRDoKLQkJCQlyZXR1cm4gdGltZVBlcmlvZCAhPSBudWxsOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19XT1JLSU5HX1RJTUVTOgotCQkJCXJldHVybiB3b3JraW5nVGltZXMgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRheVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRheVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRheVdvcmtpbmc6ICIpOwotCQlpZiAoZGF5V29ya2luZ0VTZXQpIHJlc3VsdC5hcHBlbmQoZGF5V29ya2luZyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9XZWVrRGF5SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1dlZWtEYXlzSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1dlZWtEYXlzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzBiZGFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XZWVrRGF5c0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdlZWtEYXlzSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5czsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldlZWsgRGF5czwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldlZWtEYXlzSW1wbCNnZXRXZWVrRGF5IDxlbT5XZWVrIERheTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlZWtEYXlzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV2Vla0RheXMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlZWtEYXkoKSA8ZW0+V2VlayBEYXk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2Vla0RheSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHdlZWtEYXkgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdlZWtEYXlzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlZWtEYXlzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFdlZWtEYXkoKSB7Ci0JCWlmICh3ZWVrRGF5ID09IG51bGwpIHsKLQkJCXdlZWtEYXkgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoV2Vla0RheS5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWVNfX1dFRUtfREFZKTsKLQkJfQotCQlyZXR1cm4gd2Vla0RheTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlTX19XRUVLX0RBWToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRXZWVrRGF5KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWVNfX1dFRUtfREFZOgotCQkJCXJldHVybiBnZXRXZWVrRGF5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZU19fV0VFS19EQVk6Ci0JCQkJZ2V0V2Vla0RheSgpLmNsZWFyKCk7Ci0JCQkJZ2V0V2Vla0RheSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWVNfX1dFRUtfREFZOgotCQkJCWdldFdlZWtEYXkoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZU19fV0VFS19EQVk6Ci0JCQkJcmV0dXJuIHdlZWtEYXkgIT0gbnVsbCAmJiAhd2Vla0RheS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL1dlZWtEYXlzSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1dvcmtpbmdUaW1lSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1dvcmtpbmdUaW1lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2E1NmMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Xb3JraW5nVGltZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtpbmdUaW1lSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29ya2luZyBUaW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV29ya2luZ1RpbWVJbXBsI2dldEZyb21UaW1lIDxlbT5Gcm9tIFRpbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Xb3JraW5nVGltZUltcGwjZ2V0VG9UaW1lIDxlbT5UbyBUaW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya2luZ1RpbWVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBXb3JraW5nVGltZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZyb21UaW1lKCkgPGVtPkZyb20gVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnJvbVRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEZST01fVElNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGcm9tVGltZSgpIDxlbT5Gcm9tIFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZyb21UaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZyb21UaW1lID0gRlJPTV9USU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvVGltZSgpIDxlbT5UbyBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb1RpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFRPX1RJTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG9UaW1lKCkgPGVtPlRvIFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRvVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCB0b1RpbWUgPSBUT19USU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtpbmdUaW1lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtpbmdUaW1lKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGcm9tVGltZSgpIHsKLQkJcmV0dXJuIGZyb21UaW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZyb21UaW1lKE9iamVjdCBuZXdGcm9tVGltZSkgewotCQlPYmplY3Qgb2xkRnJvbVRpbWUgPSBmcm9tVGltZTsKLQkJZnJvbVRpbWUgPSBuZXdGcm9tVGltZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVfX0ZST01fVElNRSwgb2xkRnJvbVRpbWUsIGZyb21UaW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRUb1RpbWUoKSB7Ci0JCXJldHVybiB0b1RpbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9UaW1lKE9iamVjdCBuZXdUb1RpbWUpIHsKLQkJT2JqZWN0IG9sZFRvVGltZSA9IHRvVGltZTsKLQkJdG9UaW1lID0gbmV3VG9UaW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRV9fVE9fVElNRSwgb2xkVG9UaW1lLCB0b1RpbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FX19GUk9NX1RJTUU6Ci0JCQkJcmV0dXJuIGdldEZyb21UaW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FX19UT19USU1FOgotCQkJCXJldHVybiBnZXRUb1RpbWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FX19GUk9NX1RJTUU6Ci0JCQkJc2V0RnJvbVRpbWUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRV9fVE9fVElNRToKLQkJCQlzZXRUb1RpbWUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVfX0ZST01fVElNRToKLQkJCQlzZXRGcm9tVGltZShGUk9NX1RJTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVfX1RPX1RJTUU6Ci0JCQkJc2V0VG9UaW1lKFRPX1RJTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRV9fRlJPTV9USU1FOgotCQkJCXJldHVybiBGUk9NX1RJTUVfRURFRkFVTFQgPT0gbnVsbCA/IGZyb21UaW1lICE9IG51bGwgOiAhRlJPTV9USU1FX0VERUZBVUxULmVxdWFscyhmcm9tVGltZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FX19UT19USU1FOgotCQkJCXJldHVybiBUT19USU1FX0VERUZBVUxUID09IG51bGwgPyB0b1RpbWUgIT0gbnVsbCA6ICFUT19USU1FX0VERUZBVUxULmVxdWFscyh0b1RpbWUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZnJvbVRpbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZyb21UaW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0b1RpbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRvVGltZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dvcmtpbmdUaW1lSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1dvcmtpbmdUaW1lc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Xb3JraW5nVGltZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZjI0ZTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1dvcmtpbmdUaW1lc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtpbmdUaW1lc0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmtpbmcgVGltZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Xb3JraW5nVGltZXNJbXBsI2dldFdvcmtpbmdUaW1lIDxlbT5Xb3JraW5nIFRpbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JraW5nVGltZXNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBXb3JraW5nVGltZXMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtpbmdUaW1lKCkgPGVtPldvcmtpbmcgVGltZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JraW5nVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHdvcmtpbmdUaW1lID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JraW5nVGltZXNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya2luZ1RpbWVzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFdvcmtpbmdUaW1lKCkgewotCQlpZiAod29ya2luZ1RpbWUgPT0gbnVsbCkgewotCQkJd29ya2luZ1RpbWUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoV29ya2luZ1RpbWUuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FU19fV09SS0lOR19USU1FKTsKLQkJfQotCQlyZXR1cm4gd29ya2luZ1RpbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRVNfX1dPUktJTkdfVElNRToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRXb3JraW5nVGltZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FU19fV09SS0lOR19USU1FOgotCQkJCXJldHVybiBnZXRXb3JraW5nVGltZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVTX19XT1JLSU5HX1RJTUU6Ci0JCQkJZ2V0V29ya2luZ1RpbWUoKS5jbGVhcigpOwotCQkJCWdldFdvcmtpbmdUaW1lKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRVNfX1dPUktJTkdfVElNRToKLQkJCQlnZXRXb3JraW5nVGltZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FU19fV09SS0lOR19USU1FOgotCQkJCXJldHVybiB3b3JraW5nVGltZSAhPSBudWxsICYmICF3b3JraW5nVGltZS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL1dvcmtpbmdUaW1lc0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9tc3Byb2plY3QuZWNvcmUgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvbXNwcm9qZWN0LmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWViZDIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9tc3Byb2plY3QuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1NTExICswLDAgQEAKLTw/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+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTY3ZmQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlM2I4MGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdEFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEyNTNkZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0QWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzOCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1zcHJvamVjdEFkYXB0ZXJGYWN0b3J5LmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0MSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1zcHJvamVjdEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBNc3Byb2plY3RQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTXNwcm9qZWN0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTXNwcm9qZWN0U3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IE1zcHJvamVjdFN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFzc2lnbm1lbnQoQXNzaWdubWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXNzaWdubWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFzc2lnbm1lbnRzKEFzc2lnbm1lbnRzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBc3NpZ25tZW50c0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUF2YWlsYWJpbGl0eVBlcmlvZChBdmFpbGFiaWxpdHlQZXJpb2Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUF2YWlsYWJpbGl0eVBlcmlvZEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUF2YWlsYWJpbGl0eVBlcmlvZHMoQXZhaWxhYmlsaXR5UGVyaW9kcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXZhaWxhYmlsaXR5UGVyaW9kc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUJhc2VsaW5lKEJhc2VsaW5lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVCYXNlbGluZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUJhc2VsaW5lMihCYXNlbGluZTIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUJhc2VsaW5lMkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUJhc2VsaW5lMyhCYXNlbGluZTMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUJhc2VsaW5lM0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNhbGVuZGFyKENhbGVuZGFyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDYWxlbmRhckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNhbGVuZGFycyhDYWxlbmRhcnMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNhbGVuZGFyc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZURvY3VtZW50Um9vdChEb2N1bWVudFJvb3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURvY3VtZW50Um9vdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUV4dGVuZGVkQXR0cmlidXRlKEV4dGVuZGVkQXR0cmlidXRlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUV4dGVuZGVkQXR0cmlidXRlMihFeHRlbmRlZEF0dHJpYnV0ZTIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlMkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUV4dGVuZGVkQXR0cmlidXRlMyhFeHRlbmRlZEF0dHJpYnV0ZTMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlM0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUV4dGVuZGVkQXR0cmlidXRlNChFeHRlbmRlZEF0dHJpYnV0ZTQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlNEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUV4dGVuZGVkQXR0cmlidXRlcyhFeHRlbmRlZEF0dHJpYnV0ZXMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1hc2soTWFzayBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWFza0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1hc2tzKE1hc2tzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNYXNrc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU91dGxpbmVDb2RlKE91dGxpbmVDb2RlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVPdXRsaW5lQ29kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU91dGxpbmVDb2RlMihPdXRsaW5lQ29kZTIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU91dGxpbmVDb2RlMkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU91dGxpbmVDb2RlMyhPdXRsaW5lQ29kZTMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU91dGxpbmVDb2RlM0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU91dGxpbmVDb2RlcyhPdXRsaW5lQ29kZXMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU91dGxpbmVDb2Rlc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVByZWRlY2Vzc29yTGluayhQcmVkZWNlc3Nvckxpbmsgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByZWRlY2Vzc29yTGlua0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVByb2plY3QoUHJvamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJhdGUoUmF0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmF0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJhdGVzKFJhdGVzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSYXRlc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlKFJlc291cmNlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlcyhSZXNvdXJjZXMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRhc2soVGFzayBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGFza0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRhc2tzKFRhc2tzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUYXNrc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRpbWVQZXJpb2QoVGltZVBlcmlvZCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGltZVBlcmlvZEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVRpbWVwaGFzZWREYXRhVHlwZShUaW1lcGhhc2VkRGF0YVR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRpbWVwaGFzZWREYXRhVHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVZhbHVlKFZhbHVlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVWYWx1ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVZhbHVlMihWYWx1ZTIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVZhbHVlMkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVZhbHVlTGlzdChWYWx1ZUxpc3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVZhbHVlTGlzdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVZhbHVlcyhWYWx1ZXMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVZhbHVlc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdCU01hc2soV0JTTWFzayBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV0JTTWFza0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdCU01hc2tzKFdCU01hc2tzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXQlNNYXNrc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdlZWtEYXkoV2Vla0RheSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2Vla0RheUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdlZWtEYXlzKFdlZWtEYXlzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXZWVrRGF5c0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtpbmdUaW1lKFdvcmtpbmdUaW1lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JraW5nVGltZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtpbmdUaW1lcyhXb3JraW5nVGltZXMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtpbmdUaW1lc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQgPGVtPkFzc2lnbm1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFzc2lnbm1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHMgPGVtPkFzc2lnbm1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXNzaWdubWVudHNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUF2YWlsYWJpbGl0eVBlcmlvZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2RzIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZHMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXZhaWxhYmlsaXR5UGVyaW9kc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCYXNlbGluZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIgPGVtPkJhc2VsaW5lMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCYXNlbGluZTJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzIDxlbT5CYXNlbGluZTM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQmFzZWxpbmUzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyIDxlbT5DYWxlbmRhcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhbGVuZGFyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFycyA8ZW0+Q2FsZW5kYXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXJzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhbGVuZGFyc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QgPGVtPkRvY3VtZW50IFJvb3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRG9jdW1lbnRSb290QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGUyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0IDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlNEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZXMgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZXMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGVzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sgPGVtPk1hc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1hc2tBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza3MgPGVtPk1hc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWFza3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUgPGVtPk91dGxpbmUgQ29kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU91dGxpbmVDb2RlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiA8ZW0+T3V0bGluZSBDb2RlMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRsaW5lQ29kZTJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzIDxlbT5PdXRsaW5lIENvZGUzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU91dGxpbmVDb2RlM0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZXMgPGVtPk91dGxpbmUgQ29kZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZXMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlT3V0bGluZUNvZGVzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayA8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcmVkZWNlc3NvckxpbmtBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlIDxlbT5SYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVzIDxlbT5SYXRlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJhdGVzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlIDxlbT5SZXNvdXJjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlc291cmNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlcyA8ZW0+UmVzb3VyY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2VzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlc291cmNlc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzIDxlbT5UYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QgPGVtPlRpbWUgUGVyaW9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUaW1lUGVyaW9kQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSA8ZW0+VGltZXBoYXNlZCBEYXRhIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGltZXBoYXNlZERhdGFUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiA8ZW0+VmFsdWUyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVZhbHVlMkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3QgPGVtPlZhbHVlIExpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVmFsdWVMaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlcyA8ZW0+VmFsdWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVZhbHVlc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrIDxlbT5XQlMgTWFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV0JTTWFza0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyA8ZW0+V0JTIE1hc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV0JTTWFza3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSA8ZW0+V2VlayBEYXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlZWtEYXlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXMgPGVtPldlZWsgRGF5czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlZWtEYXlzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lIDxlbT5Xb3JraW5nIFRpbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JraW5nVGltZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXMgPGVtPldvcmtpbmcgVGltZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya2luZ1RpbWVzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL01zcHJvamVjdEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0UmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFJlc291cmNlRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE5N2I5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0UmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNc3Byb2plY3RSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0MSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlJlc291cmNlIEZhY3Rvcnk8L2I+IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2FnZS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWwuTXNwcm9qZWN0UmVzb3VyY2VJbXBsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNc3Byb2plY3RSZXNvdXJjZUZhY3RvcnlJbXBsIGV4dGVuZHMgUmVzb3VyY2VGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTXNwcm9qZWN0UmVzb3VyY2VGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlYTUxSZXNvdXJjZSByZXN1bHQgPSBuZXcgTXNwcm9qZWN0UmVzb3VyY2VJbXBsKHVyaSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOwotCi0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1NDSEVNQV9MT0NBVElPTiwgQm9vbGVhbi5UUlVFKTsKLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0VOQ09ERURfQVRUUklCVVRFX1NUWUxFLCBCb29sZWFuLlRSVUUpOwotCi0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9MRVhJQ0FMX0hBTkRMRVIsIEJvb2xlYW4uVFJVRSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19IC8vTXNwcm9qZWN0UmVzb3VyY2VGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFJlc291cmNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjdlMTA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTXNwcm9qZWN0UmVzb3VyY2VJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0MSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlJlc291cmNlIDwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QudXRpbC5Nc3Byb2plY3RSZXNvdXJjZUZhY3RvcnlJbXBsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNc3Byb2plY3RSZXNvdXJjZUltcGwgZXh0ZW5kcyBYTUxSZXNvdXJjZUltcGwgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHVyaSB0aGUgVVJJIG9mIHRoZSBuZXcgcmVzb3VyY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNc3Byb2plY3RSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCX0KLQotCXByb3RlY3RlZCBYTUxIZWxwZXIgY3JlYXRlWE1MSGVscGVyKCl7Ci0JICAgIHJldHVybiBuZXcgTXNwcm9qZWN0WE1MSGVscGVySW1wbCh0aGlzKTsKLQl9Ci19IC8vTXNwcm9qZWN0UmVzb3VyY2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0U3dpdGNoLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0U3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YTkwYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1zcHJvamVjdFN3aXRjaC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDEganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNc3Byb2plY3RTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTXNwcm9qZWN0UGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1zcHJvamVjdFN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlQ6IHsKLQkJCQlBc3NpZ25tZW50IGFzc2lnbm1lbnQgPSAoQXNzaWdubWVudCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXNzaWdubWVudChhc3NpZ25tZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVFM6IHsKLQkJCQlBc3NpZ25tZW50cyBhc3NpZ25tZW50cyA9IChBc3NpZ25tZW50cyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXNzaWdubWVudHMoYXNzaWdubWVudHMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EOiB7Ci0JCQkJQXZhaWxhYmlsaXR5UGVyaW9kIGF2YWlsYWJpbGl0eVBlcmlvZCA9IChBdmFpbGFiaWxpdHlQZXJpb2QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUF2YWlsYWJpbGl0eVBlcmlvZChhdmFpbGFiaWxpdHlQZXJpb2QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EUzogewotCQkJCUF2YWlsYWJpbGl0eVBlcmlvZHMgYXZhaWxhYmlsaXR5UGVyaW9kcyA9IChBdmFpbGFiaWxpdHlQZXJpb2RzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBdmFpbGFiaWxpdHlQZXJpb2RzKGF2YWlsYWJpbGl0eVBlcmlvZHMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTogewotCQkJCUJhc2VsaW5lIGJhc2VsaW5lID0gKEJhc2VsaW5lKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VCYXNlbGluZShiYXNlbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMjogewotCQkJCUJhc2VsaW5lMiBiYXNlbGluZTIgPSAoQmFzZWxpbmUyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VCYXNlbGluZTIoYmFzZWxpbmUyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzOiB7Ci0JCQkJQmFzZWxpbmUzIGJhc2VsaW5lMyA9IChCYXNlbGluZTMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUJhc2VsaW5lMyhiYXNlbGluZTMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUjogewotCQkJCUNhbGVuZGFyIGNhbGVuZGFyID0gKENhbGVuZGFyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDYWxlbmRhcihjYWxlbmRhcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSUzogewotCQkJCUNhbGVuZGFycyBjYWxlbmRhcnMgPSAoQ2FsZW5kYXJzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDYWxlbmRhcnMoY2FsZW5kYXJzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVDogewotCQkJCURvY3VtZW50Um9vdCBkb2N1bWVudFJvb3QgPSAoRG9jdW1lbnRSb290KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEb2N1bWVudFJvb3QoZG9jdW1lbnRSb290KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFOiB7Ci0JCQkJRXh0ZW5kZWRBdHRyaWJ1dGUgZXh0ZW5kZWRBdHRyaWJ1dGUgPSAoRXh0ZW5kZWRBdHRyaWJ1dGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUV4dGVuZGVkQXR0cmlidXRlKGV4dGVuZGVkQXR0cmlidXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMjogewotCQkJCUV4dGVuZGVkQXR0cmlidXRlMiBleHRlbmRlZEF0dHJpYnV0ZTIgPSAoRXh0ZW5kZWRBdHRyaWJ1dGUyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZTIoZXh0ZW5kZWRBdHRyaWJ1dGUyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMzogewotCQkJCUV4dGVuZGVkQXR0cmlidXRlMyBleHRlbmRlZEF0dHJpYnV0ZTMgPSAoRXh0ZW5kZWRBdHRyaWJ1dGUzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZTMoZXh0ZW5kZWRBdHRyaWJ1dGUzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNDogewotCQkJCUV4dGVuZGVkQXR0cmlidXRlNCBleHRlbmRlZEF0dHJpYnV0ZTQgPSAoRXh0ZW5kZWRBdHRyaWJ1dGU0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZTQoZXh0ZW5kZWRBdHRyaWJ1dGU0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFUzogewotCQkJCUV4dGVuZGVkQXR0cmlidXRlcyBleHRlbmRlZEF0dHJpYnV0ZXMgPSAoRXh0ZW5kZWRBdHRyaWJ1dGVzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZXMoZXh0ZW5kZWRBdHRyaWJ1dGVzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTSzogewotCQkJCU1hc2sgbWFzayA9IChNYXNrKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNYXNrKG1hc2spOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLUzogewotCQkJCU1hc2tzIG1hc2tzID0gKE1hc2tzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNYXNrcyhtYXNrcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTogewotCQkJCU91dGxpbmVDb2RlIG91dGxpbmVDb2RlID0gKE91dGxpbmVDb2RlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VPdXRsaW5lQ29kZShvdXRsaW5lQ29kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTI6IHsKLQkJCQlPdXRsaW5lQ29kZTIgb3V0bGluZUNvZGUyID0gKE91dGxpbmVDb2RlMil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlT3V0bGluZUNvZGUyKG91dGxpbmVDb2RlMik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTM6IHsKLQkJCQlPdXRsaW5lQ29kZTMgb3V0bGluZUNvZGUzID0gKE91dGxpbmVDb2RlMyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlT3V0bGluZUNvZGUzKG91dGxpbmVDb2RlMyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERVM6IHsKLQkJCQlPdXRsaW5lQ29kZXMgb3V0bGluZUNvZGVzID0gKE91dGxpbmVDb2Rlcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlT3V0bGluZUNvZGVzKG91dGxpbmVDb2Rlcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTks6IHsKLQkJCQlQcmVkZWNlc3NvckxpbmsgcHJlZGVjZXNzb3JMaW5rID0gKFByZWRlY2Vzc29yTGluayl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJlZGVjZXNzb3JMaW5rKHByZWRlY2Vzc29yTGluayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1Q6IHsKLQkJCQlQcm9qZWN0IHByb2plY3QgPSAoUHJvamVjdCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJvamVjdChwcm9qZWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURTogewotCQkJCVJhdGUgcmF0ZSA9IChSYXRlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSYXRlKHJhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFUzogewotCQkJCVJhdGVzIHJhdGVzID0gKFJhdGVzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSYXRlcyhyYXRlcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFOiB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlc291cmNlKHJlc291cmNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTOiB7Ci0JCQkJUmVzb3VyY2VzIHJlc291cmNlcyA9IChSZXNvdXJjZXMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlc291cmNlcyhyZXNvdXJjZXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLOiB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRhc2sodGFzayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tTOiB7Ci0JCQkJVGFza3MgdGFza3MgPSAoVGFza3MpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRhc2tzKHRhc2tzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0Q6IHsKLQkJCQlUaW1lUGVyaW9kIHRpbWVQZXJpb2QgPSAoVGltZVBlcmlvZCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGltZVBlcmlvZCh0aW1lUGVyaW9kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEU6IHsKLQkJCQlUaW1lcGhhc2VkRGF0YVR5cGUgdGltZXBoYXNlZERhdGFUeXBlID0gKFRpbWVwaGFzZWREYXRhVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVGltZXBoYXNlZERhdGFUeXBlKHRpbWVwaGFzZWREYXRhVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFOiB7Ci0JCQkJVmFsdWUgdmFsdWUgPSAoVmFsdWUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVZhbHVlKHZhbHVlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyOiB7Ci0JCQkJVmFsdWUyIHZhbHVlMiA9IChWYWx1ZTIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVZhbHVlMih2YWx1ZTIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9MSVNUOiB7Ci0JCQkJVmFsdWVMaXN0IHZhbHVlTGlzdCA9IChWYWx1ZUxpc3QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVZhbHVlTGlzdCh2YWx1ZUxpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVM6IHsKLQkJCQlWYWx1ZXMgdmFsdWVzID0gKFZhbHVlcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVmFsdWVzKHZhbHVlcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLOiB7Ci0JCQkJV0JTTWFzayB3YnNNYXNrID0gKFdCU01hc2spdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdCU01hc2sod2JzTWFzayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLUzogewotCQkJCVdCU01hc2tzIHdic01hc2tzID0gKFdCU01hc2tzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXQlNNYXNrcyh3YnNNYXNrcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZOiB7Ci0JCQkJV2Vla0RheSB3ZWVrRGF5ID0gKFdlZWtEYXkpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdlZWtEYXkod2Vla0RheSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZUzogewotCQkJCVdlZWtEYXlzIHdlZWtEYXlzID0gKFdlZWtEYXlzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXZWVrRGF5cyh3ZWVrRGF5cyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRTogewotCQkJCVdvcmtpbmdUaW1lIHdvcmtpbmdUaW1lID0gKFdvcmtpbmdUaW1lKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXb3JraW5nVGltZSh3b3JraW5nVGltZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRVM6IHsKLQkJCQlXb3JraW5nVGltZXMgd29ya2luZ1RpbWVzID0gKFdvcmtpbmdUaW1lcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV29ya2luZ1RpbWVzKHdvcmtpbmdUaW1lcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFzc2lnbm1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXNzaWdubWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXNzaWdubWVudChBc3NpZ25tZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXNzaWdubWVudHM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXNzaWdubWVudHM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFzc2lnbm1lbnRzKEFzc2lnbm1lbnRzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBdmFpbGFiaWxpdHlQZXJpb2QoQXZhaWxhYmlsaXR5UGVyaW9kIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUF2YWlsYWJpbGl0eVBlcmlvZHMoQXZhaWxhYmlsaXR5UGVyaW9kcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJhc2VsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJhc2VsaW5lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VCYXNlbGluZShCYXNlbGluZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJhc2VsaW5lMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CYXNlbGluZTI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUJhc2VsaW5lMihCYXNlbGluZTIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CYXNlbGluZTM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmFzZWxpbmUzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VCYXNlbGluZTMoQmFzZWxpbmUzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2FsZW5kYXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2FsZW5kYXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNhbGVuZGFyKENhbGVuZGFyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2FsZW5kYXJzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNhbGVuZGFyczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ2FsZW5kYXJzKENhbGVuZGFycyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRG9jdW1lbnRSb290KERvY3VtZW50Um9vdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUV4dGVuZGVkQXR0cmlidXRlKEV4dGVuZGVkQXR0cmlidXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZTIoRXh0ZW5kZWRBdHRyaWJ1dGUyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZTMoRXh0ZW5kZWRBdHRyaWJ1dGUzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlNDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZTQoRXh0ZW5kZWRBdHRyaWJ1dGU0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZXMoRXh0ZW5kZWRBdHRyaWJ1dGVzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NYXNrPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNYXNrKE1hc2sgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NYXNrczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NYXNrczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWFza3MoTWFza3Mgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0bGluZSBDb2RlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRsaW5lQ29kZShPdXRsaW5lQ29kZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGxpbmUgQ29kZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0bGluZSBDb2RlMjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlT3V0bGluZUNvZGUyKE91dGxpbmVDb2RlMiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGxpbmUgQ29kZTM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0bGluZSBDb2RlMzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlT3V0bGluZUNvZGUzKE91dGxpbmVDb2RlMyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGxpbmUgQ29kZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0bGluZSBDb2RlczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlT3V0bGluZUNvZGVzKE91dGxpbmVDb2RlcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHJlZGVjZXNzb3JMaW5rKFByZWRlY2Vzc29yTGluayBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2plY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHJvamVjdChQcm9qZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SYXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSYXRlKFJhdGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SYXRlczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SYXRlczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUmF0ZXMoUmF0ZXMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2UoUmVzb3VyY2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2VzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZXMoUmVzb3VyY2VzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUYXNrKFRhc2sgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVGFza3MoVGFza3Mgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UaW1lIFBlcmlvZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UaW1lIFBlcmlvZDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVGltZVBlcmlvZChUaW1lUGVyaW9kIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGltZXBoYXNlZCBEYXRhIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGltZXBoYXNlZCBEYXRhIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRpbWVwaGFzZWREYXRhVHlwZShUaW1lcGhhc2VkRGF0YVR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVmFsdWUoVmFsdWUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5WYWx1ZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmFsdWUyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VWYWx1ZTIoVmFsdWUyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmFsdWUgTGlzdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5WYWx1ZSBMaXN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VWYWx1ZUxpc3QoVmFsdWVMaXN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmFsdWVzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlZhbHVlczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVmFsdWVzKFZhbHVlcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldCUyBNYXNrPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldCUyBNYXNrPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXQlNNYXNrKFdCU01hc2sgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XQlMgTWFza3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V0JTIE1hc2tzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXQlNNYXNrcyhXQlNNYXNrcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlZWsgRGF5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlZWsgRGF5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXZWVrRGF5KFdlZWtEYXkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWVrIERheXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2VlayBEYXlzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXZWVrRGF5cyhXZWVrRGF5cyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmtpbmcgVGltZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JraW5nIFRpbWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtpbmdUaW1lKFdvcmtpbmdUaW1lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29ya2luZyBUaW1lczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JraW5nIFRpbWVzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JraW5nVGltZXMoV29ya2luZ1RpbWVzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Nc3Byb2plY3RTd2l0Y2gKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RWYWxpZGF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY0YzA4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTgzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTXNwcm9qZWN0VmFsaWRhdG9yLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0MSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QudXRpbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpY0NoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS51dGlsLlhNTFR5cGVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5WYWxpZGF0b3I8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNc3Byb2plY3RWYWxpZGF0b3IgZXh0ZW5kcyBFT2JqZWN0VmFsaWRhdG9yIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1zcHJvamVjdFZhbGlkYXRvciBJTlNUQU5DRSA9IG5ldyBNc3Byb2plY3RWYWxpZGF0b3IoKTsKLQotCS8qKgotCSAqIEEgY29uc3RhbnQgZm9yIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWMjZ2V0U291cmNlKCkgc291cmNlfSBvZiBkaWFnbm9zdGljIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYyNnZXRDb2RlKCkgY29kZXN9IGZyb20gdGhpcyBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYyNnZXRTb3VyY2UoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWMjZ2V0Q29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUdOT1NUSUNfU09VUkNFID0gIm9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QiOwotCi0JLyoqCi0JICogQSBjb25zdGFudCB3aXRoIGEgZml4ZWQgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIGFzIHRoZSBiYXNlIHZhbHVlIGZvciBhZGRpdGlvbmFsIGhhbmQgd3JpdHRlbiBjb25zdGFudHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFTkVSQVRFRF9ESUFHTk9TVElDX0NPREVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogQSBjb25zdGFudCB3aXRoIGEgZml4ZWQgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIGFzIHRoZSBiYXNlIHZhbHVlIGZvciBhZGRpdGlvbmFsIGhhbmQgd3JpdHRlbiBjb25zdGFudHMgaW4gYSBkZXJpdmVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERJQUdOT1NUSUNfQ09ERV9DT1VOVCA9IEdFTkVSQVRFRF9ESUFHTk9TVElDX0NPREVfQ09VTlQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIGJhc2UgcGFja2FnZSB2YWxpZGF0b3IuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhNTFR5cGVWYWxpZGF0b3IgeG1sVHlwZVZhbGlkYXRvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTXNwcm9qZWN0VmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCQl4bWxUeXBlVmFsaWRhdG9yID0gWE1MVHlwZVZhbGlkYXRvci5JTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIG9mIHRoaXMgdmFsaWRhdG9yIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7Ci0JICByZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+dmFsaWRhdGVYWFg8L2NvZGU+IGZvciB0aGUgY29ycmVzb25kaW5nIGNsYXNzaWZpZXIgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKGludCBjbGFzc2lmaWVySUQsIE9iamVjdCB2YWx1ZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlQ6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQXNzaWdubWVudCgoQXNzaWdubWVudCl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRTOgotCQkJCXJldHVybiB2YWxpZGF0ZUFzc2lnbm1lbnRzKChBc3NpZ25tZW50cyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0Q6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQXZhaWxhYmlsaXR5UGVyaW9kKChBdmFpbGFiaWxpdHlQZXJpb2QpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVBdmFpbGFiaWxpdHlQZXJpb2RzKChBdmFpbGFiaWxpdHlQZXJpb2RzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQmFzZWxpbmUoKEJhc2VsaW5lKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyOgotCQkJCXJldHVybiB2YWxpZGF0ZUJhc2VsaW5lMigoQmFzZWxpbmUyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzOgotCQkJCXJldHVybiB2YWxpZGF0ZUJhc2VsaW5lMygoQmFzZWxpbmUzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVI6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ2FsZW5kYXIoKENhbGVuZGFyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTOgotCQkJCXJldHVybiB2YWxpZGF0ZUNhbGVuZGFycygoQ2FsZW5kYXJzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVEb2N1bWVudFJvb3QoKERvY3VtZW50Um9vdCl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gdmFsaWRhdGVFeHRlbmRlZEF0dHJpYnV0ZSgoRXh0ZW5kZWRBdHRyaWJ1dGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyOgotCQkJCXJldHVybiB2YWxpZGF0ZUV4dGVuZGVkQXR0cmlidXRlMigoRXh0ZW5kZWRBdHRyaWJ1dGUyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVFeHRlbmRlZEF0dHJpYnV0ZTMoKEV4dGVuZGVkQXR0cmlidXRlMyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTQ6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRXh0ZW5kZWRBdHRyaWJ1dGU0KChFeHRlbmRlZEF0dHJpYnV0ZTQpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVTOgotCQkJCXJldHVybiB2YWxpZGF0ZUV4dGVuZGVkQXR0cmlidXRlcygoRXh0ZW5kZWRBdHRyaWJ1dGVzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTSzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVNYXNrKChNYXNrKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS1M6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTWFza3MoKE1hc2tzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFOgotCQkJCXJldHVybiB2YWxpZGF0ZU91dGxpbmVDb2RlKChPdXRsaW5lQ29kZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTI6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlT3V0bGluZUNvZGUyKChPdXRsaW5lQ29kZTIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzOgotCQkJCXJldHVybiB2YWxpZGF0ZU91dGxpbmVDb2RlMygoT3V0bGluZUNvZGUzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVPdXRsaW5lQ29kZXMoKE91dGxpbmVDb2Rlcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTks6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUHJlZGVjZXNzb3JMaW5rKChQcmVkZWNlc3NvckxpbmspdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUOgotCQkJCXJldHVybiB2YWxpZGF0ZVByb2plY3QoKFByb2plY3QpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFOgotCQkJCXJldHVybiB2YWxpZGF0ZVJhdGUoKFJhdGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVSYXRlcygoUmF0ZXMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVSZXNvdXJjZSgoUmVzb3VyY2UpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRVM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUmVzb3VyY2VzKChSZXNvdXJjZXMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLOgotCQkJCXJldHVybiB2YWxpZGF0ZVRhc2soKFRhc2spdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVUYXNrcygoVGFza3MpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FX1BFUklPRDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVUaW1lUGVyaW9kKChUaW1lUGVyaW9kKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVGltZXBoYXNlZERhdGFUeXBlKChUaW1lcGhhc2VkRGF0YVR5cGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVWYWx1ZSgoVmFsdWUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTI6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVmFsdWUyKChWYWx1ZTIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9MSVNUOgotCQkJCXJldHVybiB2YWxpZGF0ZVZhbHVlTGlzdCgoVmFsdWVMaXN0KXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVTOgotCQkJCXJldHVybiB2YWxpZGF0ZVZhbHVlcygoVmFsdWVzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0s6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV0JTTWFzaygoV0JTTWFzayl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVXQlNNYXNrcygoV0JTTWFza3MpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWToKLQkJCQlyZXR1cm4gdmFsaWRhdGVXZWVrRGF5KChXZWVrRGF5KXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlTOgotCQkJCXJldHVybiB2YWxpZGF0ZVdlZWtEYXlzKChXZWVrRGF5cyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVXb3JraW5nVGltZSgoV29ya2luZ1RpbWUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVTOgotCQkJCXJldHVybiB2YWxpZGF0ZVdvcmtpbmdUaW1lcygoV29ya2luZ1RpbWVzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQUNDUlVFX0FUOgotCQkJCXJldHVybiB2YWxpZGF0ZUFjY3J1ZUF0KChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQUNUSVZFX0RJUkVDVE9SWV9HVUlEX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFMSUFTX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQWxpYXNUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVVRIT1JfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVBdXRob3JUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CT09LSU5HX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVCb29raW5nVHlwZVR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CT09LSU5HX1RZUEVfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQm9va2luZ1R5cGVUeXBlMSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTENVTEFUSU9OX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVDYWxjdWxhdGlvblR5cGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FURUdPUllfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVDYXRlZ29yeVR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPREVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVDb2RlVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09NUEFOWV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUNvbXBhbnlUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT05TVFJBSU5UX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVDb25zdHJhaW50VHlwZVR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT05UQUNUX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ29udGFjdFR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPU1RfUkFURV9UQUJMRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUNvc3RSYXRlVGFibGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DVVJSRU5DWV9TWU1CT0xfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVDdXJyZW5jeVN5bWJvbFR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRBWV9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRGF5VHlwZVR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZURlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRFRkFVTFRfVEFTS19FVl9NRVRIT0RfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVEZWZhdWx0VGFza0VWTWV0aG9kVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRFRkFVTFRfVEFTS19UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRGVmYXVsdFRhc2tUeXBlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMToKLQkJCQlyZXR1cm4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUxKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEUyOgotCQkJCXJldHVybiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTIoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRTM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMygoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFNDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGU0KChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEU1OgotCQkJCXJldHVybiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FQVJORURfVkFMVUVfTUVUSE9EX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFMToKLQkJCQlyZXR1cm4gdmFsaWRhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRU1BSUxfQUREUkVTU19UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUVtYWlsQWRkcmVzc1R5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVSTkFMX1RBU0tfUFJPSkVDVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUV4dGVybmFsVGFza1Byb2plY3RUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5GSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVGaXhlZENvc3RBY2NydWFsVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRllfU1RBUlRfREFURV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUZZU3RhcnREYXRlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkdST1VQX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlR3JvdXBUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfQUREUkVTU19UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUh5cGVybGlua0FkZHJlc3NUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfQUREUkVTU19UWVBFMToKLQkJCQlyZXR1cm4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTEoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19BRERSRVNTX1RZUEUyOgotCQkJCXJldHVybiB2YWxpZGF0ZUh5cGVybGlua0FkZHJlc3NUeXBlMigoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1NVQl9BRERSRVNTX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFMToKLQkJCQlyZXR1cm4gdmFsaWRhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUh5cGVybGlua1R5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19UWVBFMToKLQkJCQlyZXR1cm4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlMSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1RZUEUyOgotCQkJCXJldHVybiB2YWxpZGF0ZUh5cGVybGlua1R5cGUyKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5JTklUSUFMU19UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUluaXRpYWxzVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEFHX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUxhZ0Zvcm1hdFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5MRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkxFVkVMSU5HX0RFTEFZX0ZPUk1BVF9UWVBFMToKLQkJCQlyZXR1cm4gdmFsaWRhdGVMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQU5BR0VSX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTWFuYWdlclR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BVEVSSUFMX0xBQkVMX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTWF0ZXJpYWxMYWJlbFR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5BTUVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVOYW1lVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMToKLQkJCQlyZXR1cm4gdmFsaWRhdGVOYW1lVHlwZTEoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5BTUVfVFlQRTI6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTmFtZVR5cGUyKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEUzOgotCQkJCXJldHVybiB2YWxpZGF0ZU5hbWVUeXBlMygoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkVXX1RBU0tfU1RBUlRfREFURV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZU5ld1Rhc2tTdGFydERhdGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTlRfQUNDT1VOVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZU5UQWNjb3VudFR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfTlVNQkVSX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlT3V0bGluZU51bWJlclR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiB2YWxpZGF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUEhPTkVUSUNfQUxJQVNfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVQaG9uZXRpY0FsaWFzVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUEhPTkVUSUNTX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUGhvbmV0aWNzVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFRklYX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUHJlZml4VHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9UQUJMRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVJhdGVUYWJsZVR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ST0xMVVBfVFlQRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVJvbGx1cFR5cGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5TVUJKRUNUX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlU3ViamVjdFR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNVQlBST0pFQ1RfTkFNRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVN1YnByb2plY3ROYW1lVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElUTEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVUaXRsZVR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVUeXBlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVHlwZVR5cGUxKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVUeXBlVHlwZTIoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEUzOgotCQkJCXJldHVybiB2YWxpZGF0ZVR5cGVUeXBlMygoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTQ6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVHlwZVR5cGU0KChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFNToKLQkJCQlyZXR1cm4gdmFsaWRhdGVUeXBlVHlwZTUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5VSURfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVVSURUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5VTklUX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVW5pdFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRUxJU1RfU09SVF9PUkRFUl9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVZhbHVlbGlzdFNvcnRPcmRlclR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX1NUQVJUX0RBWV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVdlZWtTdGFydERheVR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLX0NPTlRPVVJfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVXb3JrQ29udG91clR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVdvcmtGb3JtYXRUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19HUk9VUF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVdvcmtHcm91cFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWRlZmF1bHQ6IAotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBc3NpZ25tZW50KEFzc2lnbm1lbnQgYXNzaWdubWVudCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChhc3NpZ25tZW50LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBc3NpZ25tZW50cyhBc3NpZ25tZW50cyBhc3NpZ25tZW50cywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChhc3NpZ25tZW50cywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQXZhaWxhYmlsaXR5UGVyaW9kKEF2YWlsYWJpbGl0eVBlcmlvZCBhdmFpbGFiaWxpdHlQZXJpb2QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoYXZhaWxhYmlsaXR5UGVyaW9kLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBdmFpbGFiaWxpdHlQZXJpb2RzKEF2YWlsYWJpbGl0eVBlcmlvZHMgYXZhaWxhYmlsaXR5UGVyaW9kcywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChhdmFpbGFiaWxpdHlQZXJpb2RzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVCYXNlbGluZShCYXNlbGluZSBiYXNlbGluZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChiYXNlbGluZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQmFzZWxpbmUyKEJhc2VsaW5lMiBiYXNlbGluZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoYmFzZWxpbmUyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVCYXNlbGluZTMoQmFzZWxpbmUzIGJhc2VsaW5lMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChiYXNlbGluZTMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNhbGVuZGFyKENhbGVuZGFyIGNhbGVuZGFyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGNhbGVuZGFyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDYWxlbmRhcnMoQ2FsZW5kYXJzIGNhbGVuZGFycywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChjYWxlbmRhcnMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURvY3VtZW50Um9vdChEb2N1bWVudFJvb3QgZG9jdW1lbnRSb290LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGRvY3VtZW50Um9vdCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRXh0ZW5kZWRBdHRyaWJ1dGUoRXh0ZW5kZWRBdHRyaWJ1dGUgZXh0ZW5kZWRBdHRyaWJ1dGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoZXh0ZW5kZWRBdHRyaWJ1dGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUV4dGVuZGVkQXR0cmlidXRlMihFeHRlbmRlZEF0dHJpYnV0ZTIgZXh0ZW5kZWRBdHRyaWJ1dGUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGV4dGVuZGVkQXR0cmlidXRlMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRXh0ZW5kZWRBdHRyaWJ1dGUzKEV4dGVuZGVkQXR0cmlidXRlMyBleHRlbmRlZEF0dHJpYnV0ZTMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoZXh0ZW5kZWRBdHRyaWJ1dGUzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFeHRlbmRlZEF0dHJpYnV0ZTQoRXh0ZW5kZWRBdHRyaWJ1dGU0IGV4dGVuZGVkQXR0cmlidXRlNCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChleHRlbmRlZEF0dHJpYnV0ZTQsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUV4dGVuZGVkQXR0cmlidXRlcyhFeHRlbmRlZEF0dHJpYnV0ZXMgZXh0ZW5kZWRBdHRyaWJ1dGVzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGV4dGVuZGVkQXR0cmlidXRlcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTWFzayhNYXNrIG1hc2ssIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQobWFzaywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTWFza3MoTWFza3MgbWFza3MsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQobWFza3MsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU91dGxpbmVDb2RlKE91dGxpbmVDb2RlIG91dGxpbmVDb2RlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KG91dGxpbmVDb2RlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPdXRsaW5lQ29kZTIoT3V0bGluZUNvZGUyIG91dGxpbmVDb2RlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChvdXRsaW5lQ29kZTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU91dGxpbmVDb2RlMyhPdXRsaW5lQ29kZTMgb3V0bGluZUNvZGUzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KG91dGxpbmVDb2RlMywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlT3V0bGluZUNvZGVzKE91dGxpbmVDb2RlcyBvdXRsaW5lQ29kZXMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQob3V0bGluZUNvZGVzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQcmVkZWNlc3NvckxpbmsoUHJlZGVjZXNzb3JMaW5rIHByZWRlY2Vzc29yTGluaywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChwcmVkZWNlc3NvckxpbmssIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVByb2plY3QoUHJvamVjdCBwcm9qZWN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHByb2plY3QsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJhdGUoUmF0ZSByYXRlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHJhdGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJhdGVzKFJhdGVzIHJhdGVzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHJhdGVzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChyZXNvdXJjZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUmVzb3VyY2VzKFJlc291cmNlcyByZXNvdXJjZXMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQocmVzb3VyY2VzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUYXNrKFRhc2sgdGFzaywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCh0YXNrLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUYXNrcyhUYXNrcyB0YXNrcywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCh0YXNrcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVGltZVBlcmlvZChUaW1lUGVyaW9kIHRpbWVQZXJpb2QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQodGltZVBlcmlvZCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVGltZXBoYXNlZERhdGFUeXBlKFRpbWVwaGFzZWREYXRhVHlwZSB0aW1lcGhhc2VkRGF0YVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQodGltZXBoYXNlZERhdGFUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZShWYWx1ZSB2YWx1ZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCh2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVmFsdWUyKFZhbHVlMiB2YWx1ZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQodmFsdWUyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZUxpc3QoVmFsdWVMaXN0IHZhbHVlTGlzdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCh2YWx1ZUxpc3QsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVZhbHVlcyhWYWx1ZXMgdmFsdWVzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHZhbHVlcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV0JTTWFzayhXQlNNYXNrIHdic01hc2ssIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQod2JzTWFzaywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV0JTTWFza3MoV0JTTWFza3Mgd2JzTWFza3MsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQod2JzTWFza3MsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdlZWtEYXkoV2Vla0RheSB3ZWVrRGF5LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHdlZWtEYXksIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdlZWtEYXlzKFdlZWtEYXlzIHdlZWtEYXlzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHdlZWtEYXlzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXb3JraW5nVGltZShXb3JraW5nVGltZSB3b3JraW5nVGltZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCh3b3JraW5nVGltZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV29ya2luZ1RpbWVzKFdvcmtpbmdUaW1lcyB3b3JraW5nVGltZXMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQod29ya2luZ1RpbWVzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBY2NydWVBdChCaWdJbnRlZ2VyIGFjY3J1ZUF0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVBY2NydWVBdF9FbnVtZXJhdGlvbihhY2NydWVBdCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlQWNjcnVlQXRfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gQUNDUlVFX0FUX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+QWNjcnVlIEF0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQWNjcnVlQXRfRW51bWVyYXRpb24oQmlnSW50ZWdlciBhY2NydWVBdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IEFDQ1JVRV9BVF9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhhY2NydWVBdCk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWNjcnVlQXQoKSwgYWNjcnVlQXQsIEFDQ1JVRV9BVF9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUFjdGl2ZURpcmVjdG9yeUdVSURUeXBlKFN0cmluZyBhY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQWN0aXZlRGlyZWN0b3J5R1VJRFR5cGVfTWF4TGVuZ3RoKGFjdGl2ZURpcmVjdG9yeUdVSURUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQWN0aXZlRGlyZWN0b3J5R1VJRFR5cGVfTWF4TGVuZ3RoKFN0cmluZyBhY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gYWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gMTY7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2ZURpcmVjdG9yeUdVSURUeXBlKCksIGFjdGl2ZURpcmVjdG9yeUdVSURUeXBlLCBsZW5ndGgsIDE2LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBbGlhc1R5cGUoU3RyaW5nIGFsaWFzVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQWxpYXNUeXBlX01heExlbmd0aChhbGlhc1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+QWxpYXMgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUFsaWFzVHlwZV9NYXhMZW5ndGgoU3RyaW5nIGFsaWFzVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gYWxpYXNUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUwOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRBbGlhc1R5cGUoKSwgYWxpYXNUeXBlLCBsZW5ndGgsIDUwLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBdXRob3JUeXBlKFN0cmluZyBhdXRob3JUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVBdXRob3JUeXBlX01heExlbmd0aChhdXRob3JUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkF1dGhvciBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQXV0aG9yVHlwZV9NYXhMZW5ndGgoU3RyaW5nIGF1dGhvclR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGF1dGhvclR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdXRob3JUeXBlKCksIGF1dGhvclR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZShCaWdJbnRlZ2VyIGJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZV9FbnVtZXJhdGlvbihiYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBCQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlKCksIGJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlLCBCQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVCb29raW5nVHlwZVR5cGUoQmlnSW50ZWdlciBib29raW5nVHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUJvb2tpbmdUeXBlVHlwZV9FbnVtZXJhdGlvbihib29raW5nVHlwZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUJvb2tpbmdUeXBlVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBCT09LSU5HX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkJvb2tpbmcgVHlwZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQm9va2luZ1R5cGVUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgYm9va2luZ1R5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gQk9PS0lOR19UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoYm9va2luZ1R5cGVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRCb29raW5nVHlwZVR5cGUoKSwgYm9va2luZ1R5cGVUeXBlLCBCT09LSU5HX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUJvb2tpbmdUeXBlVHlwZTEoQmlnSW50ZWdlciBib29raW5nVHlwZVR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVCb29raW5nVHlwZVR5cGUxX0VudW1lcmF0aW9uKGJvb2tpbmdUeXBlVHlwZTEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUJvb2tpbmdUeXBlVHlwZTFfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gQk9PS0lOR19UWVBFX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+Qm9va2luZyBUeXBlIFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQm9va2luZ1R5cGVUeXBlMV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGJvb2tpbmdUeXBlVHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBCT09LSU5HX1RZUEVfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoYm9va2luZ1R5cGVUeXBlMSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Qm9va2luZ1R5cGVUeXBlMSgpLCBib29raW5nVHlwZVR5cGUxLCBCT09LSU5HX1RZUEVfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDYWxjdWxhdGlvblR5cGVUeXBlKEJpZ0ludGVnZXIgY2FsY3VsYXRpb25UeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQ2FsY3VsYXRpb25UeXBlVHlwZV9FbnVtZXJhdGlvbihjYWxjdWxhdGlvblR5cGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVDYWxjdWxhdGlvblR5cGVUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIENBTENVTEFUSU9OX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkNhbGN1bGF0aW9uIFR5cGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNhbGN1bGF0aW9uVHlwZVR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBjYWxjdWxhdGlvblR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gQ0FMQ1VMQVRJT05fVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGNhbGN1bGF0aW9uVHlwZVR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldENhbGN1bGF0aW9uVHlwZVR5cGUoKSwgY2FsY3VsYXRpb25UeXBlVHlwZSwgQ0FMQ1VMQVRJT05fVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ2F0ZWdvcnlUeXBlKFN0cmluZyBjYXRlZ29yeVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUNhdGVnb3J5VHlwZV9NYXhMZW5ndGgoY2F0ZWdvcnlUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkNhdGVnb3J5IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDYXRlZ29yeVR5cGVfTWF4TGVuZ3RoKFN0cmluZyBjYXRlZ29yeVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGNhdGVnb3J5VHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldENhdGVnb3J5VHlwZSgpLCBjYXRlZ29yeVR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDb2RlVHlwZShTdHJpbmcgY29kZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUNvZGVUeXBlX01heExlbmd0aChjb2RlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5Db2RlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDb2RlVHlwZV9NYXhMZW5ndGgoU3RyaW5nIGNvZGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBjb2RlVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldENvZGVUeXBlKCksIGNvZGVUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ29tcGFueVR5cGUoU3RyaW5nIGNvbXBhbnlUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVDb21wYW55VHlwZV9NYXhMZW5ndGgoY29tcGFueVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+Q29tcGFueSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ29tcGFueVR5cGVfTWF4TGVuZ3RoKFN0cmluZyBjb21wYW55VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gY29tcGFueVR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wYW55VHlwZSgpLCBjb21wYW55VHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvbnN0cmFpbnRUeXBlVHlwZShCaWdJbnRlZ2VyIGNvbnN0cmFpbnRUeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQ29uc3RyYWludFR5cGVUeXBlX0VudW1lcmF0aW9uKGNvbnN0cmFpbnRUeXBlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlQ29uc3RyYWludFR5cGVUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIENPTlNUUkFJTlRfVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+Q29uc3RyYWludCBUeXBlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDb25zdHJhaW50VHlwZVR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBjb25zdHJhaW50VHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBDT05TVFJBSU5UX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhjb25zdHJhaW50VHlwZVR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnN0cmFpbnRUeXBlVHlwZSgpLCBjb25zdHJhaW50VHlwZVR5cGUsIENPTlNUUkFJTlRfVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ29udGFjdFR5cGUoU3RyaW5nIGNvbnRhY3RUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVDb250YWN0VHlwZV9NYXhMZW5ndGgoY29udGFjdFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+Q29udGFjdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ29udGFjdFR5cGVfTWF4TGVuZ3RoKFN0cmluZyBjb250YWN0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gY29udGFjdFR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250YWN0VHlwZSgpLCBjb250YWN0VHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvc3RSYXRlVGFibGVUeXBlKEJpZ0ludGVnZXIgY29zdFJhdGVUYWJsZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUNvc3RSYXRlVGFibGVUeXBlX0VudW1lcmF0aW9uKGNvc3RSYXRlVGFibGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVDb3N0UmF0ZVRhYmxlVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBDT1NUX1JBVEVfVEFCTEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkNvc3QgUmF0ZSBUYWJsZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ29zdFJhdGVUYWJsZVR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBjb3N0UmF0ZVRhYmxlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IENPU1RfUkFURV9UQUJMRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGNvc3RSYXRlVGFibGVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb3N0UmF0ZVRhYmxlVHlwZSgpLCBjb3N0UmF0ZVRhYmxlVHlwZSwgQ09TVF9SQVRFX1RBQkxFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZShCaWdJbnRlZ2VyIGN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZV9FbnVtZXJhdGlvbihjdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb24gVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgY3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhjdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUoKSwgY3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUsIENVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ3VycmVuY3lTeW1ib2xUeXBlKFN0cmluZyBjdXJyZW5jeVN5bWJvbFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUN1cnJlbmN5U3ltYm9sVHlwZV9NYXhMZW5ndGgoY3VycmVuY3lTeW1ib2xUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkN1cnJlbmN5IFN5bWJvbCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ3VycmVuY3lTeW1ib2xUeXBlX01heExlbmd0aChTdHJpbmcgY3VycmVuY3lTeW1ib2xUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBjdXJyZW5jeVN5bWJvbFR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gMjA7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEN1cnJlbmN5U3ltYm9sVHlwZSgpLCBjdXJyZW5jeVN5bWJvbFR5cGUsIGxlbmd0aCwgMjAsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURheVR5cGVUeXBlKEJpZ0ludGVnZXIgZGF5VHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZURheVR5cGVUeXBlX0VudW1lcmF0aW9uKGRheVR5cGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVEYXlUeXBlVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBEQVlfVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+RGF5IFR5cGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURheVR5cGVUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgZGF5VHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBEQVlfVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGRheVR5cGVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREYXlUeXBlVHlwZSgpLCBkYXlUeXBlVHlwZSwgREFZX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZShCaWdJbnRlZ2VyIGRlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlX0VudW1lcmF0aW9uKGRlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIERFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSgpLCBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUsIERFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEZWZhdWx0VGFza0VWTWV0aG9kVHlwZShCaWdJbnRlZ2VyIGRlZmF1bHRUYXNrRVZNZXRob2RUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVEZWZhdWx0VGFza0VWTWV0aG9kVHlwZV9FbnVtZXJhdGlvbihkZWZhdWx0VGFza0VWTWV0aG9kVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gREVGQVVMVF9UQVNLX0VWX01FVEhPRF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+RGVmYXVsdCBUYXNrIEVWIE1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBkZWZhdWx0VGFza0VWTWV0aG9kVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IERFRkFVTFRfVEFTS19FVl9NRVRIT0RfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhkZWZhdWx0VGFza0VWTWV0aG9kVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUoKSwgZGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUsIERFRkFVTFRfVEFTS19FVl9NRVRIT0RfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURlZmF1bHRUYXNrVHlwZVR5cGUoQmlnSW50ZWdlciBkZWZhdWx0VGFza1R5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVEZWZhdWx0VGFza1R5cGVUeXBlX0VudW1lcmF0aW9uKGRlZmF1bHRUYXNrVHlwZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZURlZmF1bHRUYXNrVHlwZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gREVGQVVMVF9UQVNLX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkRlZmF1bHQgVGFzayBUeXBlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEZWZhdWx0VGFza1R5cGVUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgZGVmYXVsdFRhc2tUeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IERFRkFVTFRfVEFTS19UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZGVmYXVsdFRhc2tUeXBlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVmYXVsdFRhc2tUeXBlVHlwZSgpLCBkZWZhdWx0VGFza1R5cGVUeXBlLCBERUZBVUxUX1RBU0tfVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlKEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGVfRW51bWVyYXRpb24oZHVyYXRpb25Gb3JtYXRUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gRFVSQVRJT05fRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjExIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBEVVJBVElPTl9GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhkdXJhdGlvbkZvcm1hdFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldER1cmF0aW9uRm9ybWF0VHlwZSgpLCBkdXJhdGlvbkZvcm1hdFR5cGUsIERVUkFUSU9OX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMShCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTFfRW51bWVyYXRpb24oZHVyYXRpb25Gb3JtYXRUeXBlMSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBEVVJBVElPTl9GT1JNQVRfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjExIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBEVVJBVElPTl9GT1JNQVRfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZHVyYXRpb25Gb3JtYXRUeXBlMSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMSgpLCBkdXJhdGlvbkZvcm1hdFR5cGUxLCBEVVJBVElPTl9GT1JNQVRfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUyKEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXRUeXBlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMl9FbnVtZXJhdGlvbihkdXJhdGlvbkZvcm1hdFR5cGUyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUyX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIERVUkFUSU9OX0ZPUk1BVF9UWVBFMl9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0NCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUyX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXRUeXBlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IERVUkFUSU9OX0ZPUk1BVF9UWVBFMl9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhkdXJhdGlvbkZvcm1hdFR5cGUyKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREdXJhdGlvbkZvcm1hdFR5cGUyKCksIGR1cmF0aW9uRm9ybWF0VHlwZTIsIERVUkFUSU9OX0ZPUk1BVF9UWVBFMl9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTMoQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGUzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUzX0VudW1lcmF0aW9uKGR1cmF0aW9uRm9ybWF0VHlwZTMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTNfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gRFVSQVRJT05fRk9STUFUX1RZUEUzX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTNfRW51bWVyYXRpb24oQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGUzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gRFVSQVRJT05fRk9STUFUX1RZUEUzX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGR1cmF0aW9uRm9ybWF0VHlwZTMpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldER1cmF0aW9uRm9ybWF0VHlwZTMoKSwgZHVyYXRpb25Gb3JtYXRUeXBlMywgRFVSQVRJT05fRk9STUFUX1RZUEUzX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlNChCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZTQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTRfRW51bWVyYXRpb24oZHVyYXRpb25Gb3JtYXRUeXBlNCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlNF9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBEVVJBVElPTl9GT1JNQVRfVFlQRTRfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjExIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlNF9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZTQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBEVVJBVElPTl9GT1JNQVRfVFlQRTRfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZHVyYXRpb25Gb3JtYXRUeXBlNCk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RHVyYXRpb25Gb3JtYXRUeXBlNCgpLCBkdXJhdGlvbkZvcm1hdFR5cGU0LCBEVVJBVElPTl9GT1JNQVRfVFlQRTRfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGU1KEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXRUeXBlNSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlNV9FbnVtZXJhdGlvbihkdXJhdGlvbkZvcm1hdFR5cGU1LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGU1X0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIERVUkFUSU9OX0ZPUk1BVF9UWVBFNV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0NCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGU1X0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXRUeXBlNSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IERVUkFUSU9OX0ZPUk1BVF9UWVBFNV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhkdXJhdGlvbkZvcm1hdFR5cGU1KTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREdXJhdGlvbkZvcm1hdFR5cGU1KCksIGR1cmF0aW9uRm9ybWF0VHlwZTUsIERVUkFUSU9OX0ZPUk1BVF9UWVBFNV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZShCaWdJbnRlZ2VyIGVhcm5lZFZhbHVlTWV0aG9kVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlX0VudW1lcmF0aW9uKGVhcm5lZFZhbHVlTWV0aG9kVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGVhcm5lZFZhbHVlTWV0aG9kVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IEVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhlYXJuZWRWYWx1ZU1ldGhvZFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEVhcm5lZFZhbHVlTWV0aG9kVHlwZSgpLCBlYXJuZWRWYWx1ZU1ldGhvZFR5cGUsIEVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZTEoQmlnSW50ZWdlciBlYXJuZWRWYWx1ZU1ldGhvZFR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxX0VudW1lcmF0aW9uKGVhcm5lZFZhbHVlTWV0aG9kVHlwZTEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZTFfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2QgVHlwZTE8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgZWFybmVkVmFsdWVNZXRob2RUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IEVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZWFybmVkVmFsdWVNZXRob2RUeXBlMSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWFybmVkVmFsdWVNZXRob2RUeXBlMSgpLCBlYXJuZWRWYWx1ZU1ldGhvZFR5cGUxLCBFQVJORURfVkFMVUVfTUVUSE9EX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRW1haWxBZGRyZXNzVHlwZShTdHJpbmcgZW1haWxBZGRyZXNzVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRW1haWxBZGRyZXNzVHlwZV9NYXhMZW5ndGgoZW1haWxBZGRyZXNzVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5FbWFpbCBBZGRyZXNzIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFbWFpbEFkZHJlc3NUeXBlX01heExlbmd0aChTdHJpbmcgZW1haWxBZGRyZXNzVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gZW1haWxBZGRyZXNzVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEVtYWlsQWRkcmVzc1R5cGUoKSwgZW1haWxBZGRyZXNzVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUV4dGVybmFsVGFza1Byb2plY3RUeXBlKFN0cmluZyBleHRlcm5hbFRhc2tQcm9qZWN0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRXh0ZXJuYWxUYXNrUHJvamVjdFR5cGVfTWF4TGVuZ3RoKGV4dGVybmFsVGFza1Byb2plY3RUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkV4dGVybmFsIFRhc2sgUHJvamVjdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRXh0ZXJuYWxUYXNrUHJvamVjdFR5cGVfTWF4TGVuZ3RoKFN0cmluZyBleHRlcm5hbFRhc2tQcm9qZWN0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gZXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSgpLCBleHRlcm5hbFRhc2tQcm9qZWN0VHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUZpeGVkQ29zdEFjY3J1YWxUeXBlKFN0cmluZyBmaXhlZENvc3RBY2NydWFsVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRml4ZWRDb3N0QWNjcnVhbFR5cGVfRW51bWVyYXRpb24oZml4ZWRDb3N0QWNjcnVhbFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUZpeGVkQ29zdEFjY3J1YWxUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgIjEiLAotCQkJCSAiMiIsCi0JCQkJICIzIgotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+Rml4ZWQgQ29zdCBBY2NydWFsIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVGaXhlZENvc3RBY2NydWFsVHlwZV9FbnVtZXJhdGlvbihTdHJpbmcgZml4ZWRDb3N0QWNjcnVhbFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBGSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhmaXhlZENvc3RBY2NydWFsVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKSwgZml4ZWRDb3N0QWNjcnVhbFR5cGUsIEZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRllTdGFydERhdGVUeXBlKEJpZ0ludGVnZXIgZnlTdGFydERhdGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVGWVN0YXJ0RGF0ZVR5cGVfRW51bWVyYXRpb24oZnlTdGFydERhdGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVGWVN0YXJ0RGF0ZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gRllfU1RBUlRfREFURV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTIiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+RlkgU3RhcnQgRGF0ZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRllTdGFydERhdGVUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgZnlTdGFydERhdGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gRllfU1RBUlRfREFURV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGZ5U3RhcnREYXRlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RllTdGFydERhdGVUeXBlKCksIGZ5U3RhcnREYXRlVHlwZSwgRllfU1RBUlRfREFURV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlR3JvdXBUeXBlKFN0cmluZyBncm91cFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUdyb3VwVHlwZV9NYXhMZW5ndGgoZ3JvdXBUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkdyb3VwIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVHcm91cFR5cGVfTWF4TGVuZ3RoKFN0cmluZyBncm91cFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGdyb3VwVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEdyb3VwVHlwZSgpLCBncm91cFR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZShTdHJpbmcgaHlwZXJsaW5rQWRkcmVzc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUh5cGVybGlua0FkZHJlc3NUeXBlX01heExlbmd0aChoeXBlcmxpbmtBZGRyZXNzVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGVfTWF4TGVuZ3RoKFN0cmluZyBoeXBlcmxpbmtBZGRyZXNzVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gaHlwZXJsaW5rQWRkcmVzc1R5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRIeXBlcmxpbmtBZGRyZXNzVHlwZSgpLCBoeXBlcmxpbmtBZGRyZXNzVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua0FkZHJlc3NUeXBlMShTdHJpbmcgaHlwZXJsaW5rQWRkcmVzc1R5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTFfTWF4TGVuZ3RoKGh5cGVybGlua0FkZHJlc3NUeXBlMSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlMTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua0FkZHJlc3NUeXBlMV9NYXhMZW5ndGgoU3RyaW5nIGh5cGVybGlua0FkZHJlc3NUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gaHlwZXJsaW5rQWRkcmVzc1R5cGUxLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SHlwZXJsaW5rQWRkcmVzc1R5cGUxKCksIGh5cGVybGlua0FkZHJlc3NUeXBlMSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua0FkZHJlc3NUeXBlMihTdHJpbmcgaHlwZXJsaW5rQWRkcmVzc1R5cGUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTJfTWF4TGVuZ3RoKGh5cGVybGlua0FkZHJlc3NUeXBlMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua0FkZHJlc3NUeXBlMl9NYXhMZW5ndGgoU3RyaW5nIGh5cGVybGlua0FkZHJlc3NUeXBlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gaHlwZXJsaW5rQWRkcmVzc1R5cGUyLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SHlwZXJsaW5rQWRkcmVzc1R5cGUyKCksIGh5cGVybGlua0FkZHJlc3NUeXBlMiwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlKFN0cmluZyBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGVfTWF4TGVuZ3RoKGh5cGVybGlua1N1YkFkZHJlc3NUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGVfTWF4TGVuZ3RoKFN0cmluZyBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZSgpLCBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlMShTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTFfTWF4TGVuZ3RoKGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3MgVHlwZTE8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTFfTWF4TGVuZ3RoKFN0cmluZyBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSgpLCBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIoU3RyaW5nIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyX01heExlbmd0aChoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGUyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIoKSwgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rVHlwZShTdHJpbmcgaHlwZXJsaW5rVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlSHlwZXJsaW5rVHlwZV9NYXhMZW5ndGgoaHlwZXJsaW5rVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5IeXBlcmxpbmsgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1R5cGVfTWF4TGVuZ3RoKFN0cmluZyBoeXBlcmxpbmtUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBoeXBlcmxpbmtUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SHlwZXJsaW5rVHlwZSgpLCBoeXBlcmxpbmtUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rVHlwZTEoU3RyaW5nIGh5cGVybGlua1R5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVIeXBlcmxpbmtUeXBlMV9NYXhMZW5ndGgoaHlwZXJsaW5rVHlwZTEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rVHlwZTFfTWF4TGVuZ3RoKFN0cmluZyBoeXBlcmxpbmtUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gaHlwZXJsaW5rVHlwZTEubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRIeXBlcmxpbmtUeXBlMSgpLCBoeXBlcmxpbmtUeXBlMSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1R5cGUyKFN0cmluZyBoeXBlcmxpbmtUeXBlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlSHlwZXJsaW5rVHlwZTJfTWF4TGVuZ3RoKGh5cGVybGlua1R5cGUyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkh5cGVybGluayBUeXBlMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1R5cGUyX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua1R5cGUyLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SHlwZXJsaW5rVHlwZTIoKSwgaHlwZXJsaW5rVHlwZTIsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVJbml0aWFsc1R5cGUoU3RyaW5nIGluaXRpYWxzVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlSW5pdGlhbHNUeXBlX01heExlbmd0aChpbml0aWFsc1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SW5pdGlhbHMgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUluaXRpYWxzVHlwZV9NYXhMZW5ndGgoU3RyaW5nIGluaXRpYWxzVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gaW5pdGlhbHNUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5pdGlhbHNUeXBlKCksIGluaXRpYWxzVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxhZ0Zvcm1hdFR5cGUoQmlnSW50ZWdlciBsYWdGb3JtYXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVMYWdGb3JtYXRUeXBlX0VudW1lcmF0aW9uKGxhZ0Zvcm1hdFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUxhZ0Zvcm1hdFR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gTEFHX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+TGFnIEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTGFnRm9ybWF0VHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGxhZ0Zvcm1hdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBMQUdfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMobGFnRm9ybWF0VHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGFnRm9ybWF0VHlwZSgpLCBsYWdGb3JtYXRUeXBlLCBMQUdfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZShCaWdJbnRlZ2VyIGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZV9FbnVtZXJhdGlvbihsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjExIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMobGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldExldmVsaW5nRGVsYXlGb3JtYXRUeXBlKCksIGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlLCBMRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMShCaWdJbnRlZ2VyIGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxX0VudW1lcmF0aW9uKGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0NCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQgVHlwZTE8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTFfRW51bWVyYXRpb24oQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBMRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMobGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEoKSwgbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxLCBMRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVNYW5hZ2VyVHlwZShTdHJpbmcgbWFuYWdlclR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZU1hbmFnZXJUeXBlX01heExlbmd0aChtYW5hZ2VyVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5NYW5hZ2VyIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVNYW5hZ2VyVHlwZV9NYXhMZW5ndGgoU3RyaW5nIG1hbmFnZXJUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBtYW5hZ2VyVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE1hbmFnZXJUeXBlKCksIG1hbmFnZXJUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTWF0ZXJpYWxMYWJlbFR5cGUoU3RyaW5nIG1hdGVyaWFsTGFiZWxUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVNYXRlcmlhbExhYmVsVHlwZV9NYXhMZW5ndGgobWF0ZXJpYWxMYWJlbFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+TWF0ZXJpYWwgTGFiZWwgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1hdGVyaWFsTGFiZWxUeXBlX01heExlbmd0aChTdHJpbmcgbWF0ZXJpYWxMYWJlbFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IG1hdGVyaWFsTGFiZWxUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWF0ZXJpYWxMYWJlbFR5cGUoKSwgbWF0ZXJpYWxMYWJlbFR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOYW1lVHlwZShTdHJpbmcgbmFtZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZU5hbWVUeXBlX01heExlbmd0aChuYW1lVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5OYW1lIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOYW1lVHlwZV9NYXhMZW5ndGgoU3RyaW5nIG5hbWVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBuYW1lVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVUeXBlKCksIG5hbWVUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmFtZVR5cGUxKFN0cmluZyBuYW1lVHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZU5hbWVUeXBlMV9NYXhMZW5ndGgobmFtZVR5cGUxLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPk5hbWUgVHlwZTE8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOYW1lVHlwZTFfTWF4TGVuZ3RoKFN0cmluZyBuYW1lVHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IG5hbWVUeXBlMS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVUeXBlMSgpLCBuYW1lVHlwZTEsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOYW1lVHlwZTIoU3RyaW5nIG5hbWVUeXBlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTmFtZVR5cGUyX01heExlbmd0aChuYW1lVHlwZTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+TmFtZSBUeXBlMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5hbWVUeXBlMl9NYXhMZW5ndGgoU3RyaW5nIG5hbWVUeXBlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gbmFtZVR5cGUyLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZVR5cGUyKCksIG5hbWVUeXBlMiwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5hbWVUeXBlMyhTdHJpbmcgbmFtZVR5cGUzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVOYW1lVHlwZTNfTWF4TGVuZ3RoKG5hbWVUeXBlMywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5OYW1lIFR5cGUzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmFtZVR5cGUzX01heExlbmd0aChTdHJpbmcgbmFtZVR5cGUzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBuYW1lVHlwZTMubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gMjU1OwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lVHlwZTMoKSwgbmFtZVR5cGUzLCBsZW5ndGgsIDI1NSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmV3VGFza1N0YXJ0RGF0ZVR5cGUoQmlnSW50ZWdlciBuZXdUYXNrU3RhcnREYXRlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTmV3VGFza1N0YXJ0RGF0ZVR5cGVfRW51bWVyYXRpb24obmV3VGFza1N0YXJ0RGF0ZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZU5ld1Rhc2tTdGFydERhdGVUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIE5FV19UQVNLX1NUQVJUX0RBVEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5ld1Rhc2tTdGFydERhdGVUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgbmV3VGFza1N0YXJ0RGF0ZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBORVdfVEFTS19TVEFSVF9EQVRFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMobmV3VGFza1N0YXJ0RGF0ZVR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE5ld1Rhc2tTdGFydERhdGVUeXBlKCksIG5ld1Rhc2tTdGFydERhdGVUeXBlLCBORVdfVEFTS19TVEFSVF9EQVRFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOVEFjY291bnRUeXBlKFN0cmluZyBudEFjY291bnRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVOVEFjY291bnRUeXBlX01heExlbmd0aChudEFjY291bnRUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPk5UIEFjY291bnQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5UQWNjb3VudFR5cGVfTWF4TGVuZ3RoKFN0cmluZyBudEFjY291bnRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBudEFjY291bnRUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0TlRBY2NvdW50VHlwZSgpLCBudEFjY291bnRUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlT3V0bGluZU51bWJlclR5cGUoU3RyaW5nIG91dGxpbmVOdW1iZXJUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVPdXRsaW5lTnVtYmVyVHlwZV9NYXhMZW5ndGgob3V0bGluZU51bWJlclR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+T3V0bGluZSBOdW1iZXIgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU91dGxpbmVOdW1iZXJUeXBlX01heExlbmd0aChTdHJpbmcgb3V0bGluZU51bWJlclR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IG91dGxpbmVOdW1iZXJUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0bGluZU51bWJlclR5cGUoKSwgb3V0bGluZU51bWJlclR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlKEJpZ0ludGVnZXIgb3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZV9FbnVtZXJhdGlvbihvdmVydGltZVJhdGVGb3JtYXRUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIE9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5PdmVydGltZSBSYXRlIEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBPVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUoKSwgb3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSwgT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxKEJpZ0ludGVnZXIgb3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxX0VudW1lcmF0aW9uKG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlMV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBPVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0IFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTFfRW51bWVyYXRpb24oQmlnSW50ZWdlciBvdmVydGltZVJhdGVGb3JtYXRUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IE9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdmVydGltZVJhdGVGb3JtYXRUeXBlMSgpLCBvdmVydGltZVJhdGVGb3JtYXRUeXBlMSwgT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQaG9uZXRpY0FsaWFzVHlwZShTdHJpbmcgcGhvbmV0aWNBbGlhc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVBob25ldGljQWxpYXNUeXBlX01heExlbmd0aChwaG9uZXRpY0FsaWFzVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5QaG9uZXRpYyBBbGlhcyBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGhvbmV0aWNBbGlhc1R5cGVfTWF4TGVuZ3RoKFN0cmluZyBwaG9uZXRpY0FsaWFzVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gcGhvbmV0aWNBbGlhc1R5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTA7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFBob25ldGljQWxpYXNUeXBlKCksIHBob25ldGljQWxpYXNUeXBlLCBsZW5ndGgsIDUwLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQaG9uZXRpY3NUeXBlKFN0cmluZyBwaG9uZXRpY3NUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVQaG9uZXRpY3NUeXBlX01heExlbmd0aChwaG9uZXRpY3NUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPlBob25ldGljcyBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGhvbmV0aWNzVHlwZV9NYXhMZW5ndGgoU3RyaW5nIHBob25ldGljc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IHBob25ldGljc1R5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRQaG9uZXRpY3NUeXBlKCksIHBob25ldGljc1R5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQcmVmaXhUeXBlKFN0cmluZyBwcmVmaXhUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVQcmVmaXhUeXBlX01heExlbmd0aChwcmVmaXhUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPlByZWZpeCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUHJlZml4VHlwZV9NYXhMZW5ndGgoU3RyaW5nIHByZWZpeFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IHByZWZpeFR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTA7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFByZWZpeFR5cGUoKSwgcHJlZml4VHlwZSwgbGVuZ3RoLCA1MCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUmF0ZVRhYmxlVHlwZShCaWdJbnRlZ2VyIHJhdGVUYWJsZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVJhdGVUYWJsZVR5cGVfRW51bWVyYXRpb24ocmF0ZVRhYmxlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlUmF0ZVRhYmxlVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBSQVRFX1RBQkxFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5SYXRlIFRhYmxlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSYXRlVGFibGVUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgcmF0ZVRhYmxlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFJBVEVfVEFCTEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhyYXRlVGFibGVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRSYXRlVGFibGVUeXBlKCksIHJhdGVUYWJsZVR5cGUsIFJBVEVfVEFCTEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJvbGx1cFR5cGVUeXBlKEJpZ0ludGVnZXIgcm9sbHVwVHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVJvbGx1cFR5cGVUeXBlX0VudW1lcmF0aW9uKHJvbGx1cFR5cGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVSb2xsdXBUeXBlVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBST0xMVVBfVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+Um9sbHVwIFR5cGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJvbGx1cFR5cGVUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgcm9sbHVwVHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBST0xMVVBfVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHJvbGx1cFR5cGVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xsdXBUeXBlVHlwZSgpLCByb2xsdXBUeXBlVHlwZSwgUk9MTFVQX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUoQmlnSW50ZWdlciBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlX0VudW1lcmF0aW9uKHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVN0YW5kYXJkUmF0ZUZvcm1hdFR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgc3RhbmRhcmRSYXRlRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoc3RhbmRhcmRSYXRlRm9ybWF0VHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZSgpLCBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlLCBTVEFOREFSRF9SQVRFX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEoQmlnSW50ZWdlciBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZTFfRW51bWVyYXRpb24oc3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQgVHlwZTE8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoc3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxKCksIHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxLCBTVEFOREFSRF9SQVRFX0ZPUk1BVF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVN1YmplY3RUeXBlKFN0cmluZyBzdWJqZWN0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlU3ViamVjdFR5cGVfTWF4TGVuZ3RoKHN1YmplY3RUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPlN1YmplY3QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVN1YmplY3RUeXBlX01heExlbmd0aChTdHJpbmcgc3ViamVjdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IHN1YmplY3RUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3ViamVjdFR5cGUoKSwgc3ViamVjdFR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTdWJwcm9qZWN0TmFtZVR5cGUoU3RyaW5nIHN1YnByb2plY3ROYW1lVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlU3VicHJvamVjdE5hbWVUeXBlX01heExlbmd0aChzdWJwcm9qZWN0TmFtZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+U3VicHJvamVjdCBOYW1lIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTdWJwcm9qZWN0TmFtZVR5cGVfTWF4TGVuZ3RoKFN0cmluZyBzdWJwcm9qZWN0TmFtZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IHN1YnByb2plY3ROYW1lVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFN1YnByb2plY3ROYW1lVHlwZSgpLCBzdWJwcm9qZWN0TmFtZVR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUaXRsZVR5cGUoU3RyaW5nIHRpdGxlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlVGl0bGVUeXBlX01heExlbmd0aCh0aXRsZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+VGl0bGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVRpdGxlVHlwZV9NYXhMZW5ndGgoU3RyaW5nIHRpdGxlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gdGl0bGVUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGl0bGVUeXBlKCksIHRpdGxlVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlKEJpZ0ludGVnZXIgdHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVR5cGVUeXBlX0VudW1lcmF0aW9uKHR5cGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVUeXBlVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBUWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5UeXBlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHR5cGVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRUeXBlVHlwZSgpLCB0eXBlVHlwZSwgVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGUxKEJpZ0ludGVnZXIgdHlwZVR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVUeXBlVHlwZTFfRW51bWVyYXRpb24odHlwZVR5cGUxLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVUeXBlVHlwZTFfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gVFlQRV9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPlR5cGUgVHlwZTE8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZTFfRW51bWVyYXRpb24oQmlnSW50ZWdlciB0eXBlVHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBUWVBFX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHR5cGVUeXBlMSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VHlwZVR5cGUxKCksIHR5cGVUeXBlMSwgVFlQRV9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlMihCaWdJbnRlZ2VyIHR5cGVUeXBlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlVHlwZVR5cGUyX0VudW1lcmF0aW9uKHR5cGVUeXBlMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlVHlwZVR5cGUyX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFRZUEVfVFlQRTJfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5UeXBlIFR5cGUyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGUyX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgdHlwZVR5cGUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gVFlQRV9UWVBFMl9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh0eXBlVHlwZTIpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFR5cGVUeXBlMigpLCB0eXBlVHlwZTIsIFRZUEVfVFlQRTJfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZTMoQmlnSW50ZWdlciB0eXBlVHlwZTMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVR5cGVUeXBlM19FbnVtZXJhdGlvbih0eXBlVHlwZTMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVR5cGVUeXBlM19FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBUWVBFX1RZUEUzX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0NSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0OCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1NCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjU2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1NyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjU5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjY1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2NiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjY4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2OSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNzAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjcxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNzMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjc0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3NSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNzYiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+VHlwZSBUeXBlMzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlM19FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHR5cGVUeXBlMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFRZUEVfVFlQRTNfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnModHlwZVR5cGUzKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRUeXBlVHlwZTMoKSwgdHlwZVR5cGUzLCBUWVBFX1RZUEUzX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGU0KEJpZ0ludGVnZXIgdHlwZVR5cGU0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVUeXBlVHlwZTRfRW51bWVyYXRpb24odHlwZVR5cGU0LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVUeXBlVHlwZTRfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gVFlQRV9UWVBFNF9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPlR5cGUgVHlwZTQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZTRfRW51bWVyYXRpb24oQmlnSW50ZWdlciB0eXBlVHlwZTQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBUWVBFX1RZUEU0X19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHR5cGVUeXBlNCk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VHlwZVR5cGU0KCksIHR5cGVUeXBlNCwgVFlQRV9UWVBFNF9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlNShCaWdJbnRlZ2VyIHR5cGVUeXBlNSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlVHlwZVR5cGU1X0VudW1lcmF0aW9uKHR5cGVUeXBlNSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlVHlwZVR5cGU1X0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFRZUEVfVFlQRTVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5UeXBlIFR5cGU1PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGU1X0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgdHlwZVR5cGU1LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gVFlQRV9UWVBFNV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh0eXBlVHlwZTUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFR5cGVUeXBlNSgpLCB0eXBlVHlwZTUsIFRZUEVfVFlQRTVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVVSURUeXBlKFN0cmluZyB1aWRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVVSURUeXBlX01heExlbmd0aCh1aWRUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPlVJRCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVUlEVHlwZV9NYXhMZW5ndGgoU3RyaW5nIHVpZFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IHVpZFR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gMTY7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFVJRFR5cGUoKSwgdWlkVHlwZSwgbGVuZ3RoLCAxNiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVW5pdFR5cGUoQmlnSW50ZWdlciB1bml0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlVW5pdFR5cGVfRW51bWVyYXRpb24odW5pdFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVVuaXRUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFVOSVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPlVuaXQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVVuaXRUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgdW5pdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBVTklUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnModW5pdFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFVuaXRUeXBlKCksIHVuaXRUeXBlLCBVTklUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlKEJpZ0ludGVnZXIgdmFsdWVsaXN0U29ydE9yZGVyVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlVmFsdWVsaXN0U29ydE9yZGVyVHlwZV9FbnVtZXJhdGlvbih2YWx1ZWxpc3RTb3J0T3JkZXJUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFZBTFVFTElTVF9TT1JUX09SREVSX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5WYWx1ZWxpc3QgU29ydCBPcmRlciBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVmFsdWVsaXN0U29ydE9yZGVyVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHZhbHVlbGlzdFNvcnRPcmRlclR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBWQUxVRUxJU1RfU09SVF9PUkRFUl9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHZhbHVlbGlzdFNvcnRPcmRlclR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFZhbHVlbGlzdFNvcnRPcmRlclR5cGUoKSwgdmFsdWVsaXN0U29ydE9yZGVyVHlwZSwgVkFMVUVMSVNUX1NPUlRfT1JERVJfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdlZWtTdGFydERheVR5cGUoQmlnSW50ZWdlciB3ZWVrU3RhcnREYXlUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVXZWVrU3RhcnREYXlUeXBlX0VudW1lcmF0aW9uKHdlZWtTdGFydERheVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVdlZWtTdGFydERheVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gV0VFS19TVEFSVF9EQVlfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPldlZWsgU3RhcnQgRGF5IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXZWVrU3RhcnREYXlUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgd2Vla1N0YXJ0RGF5VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFdFRUtfU1RBUlRfREFZX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMod2Vla1N0YXJ0RGF5VHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2Vla1N0YXJ0RGF5VHlwZSgpLCB3ZWVrU3RhcnREYXlUeXBlLCBXRUVLX1NUQVJUX0RBWV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV29ya0NvbnRvdXJUeXBlKEJpZ0ludGVnZXIgd29ya0NvbnRvdXJUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVXb3JrQ29udG91clR5cGVfRW51bWVyYXRpb24od29ya0NvbnRvdXJUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVXb3JrQ29udG91clR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gV09SS19DT05UT1VSX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Xb3JrIENvbnRvdXIgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdvcmtDb250b3VyVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHdvcmtDb250b3VyVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFdPUktfQ09OVE9VUl9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHdvcmtDb250b3VyVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0NvbnRvdXJUeXBlKCksIHdvcmtDb250b3VyVHlwZSwgV09SS19DT05UT1VSX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXb3JrRm9ybWF0VHlwZShCaWdJbnRlZ2VyIHdvcmtGb3JtYXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVXb3JrRm9ybWF0VHlwZV9FbnVtZXJhdGlvbih3b3JrRm9ybWF0VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlV29ya0Zvcm1hdFR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gV09SS19GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPldvcmsgRm9ybWF0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXb3JrRm9ybWF0VHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHdvcmtGb3JtYXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gV09SS19GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh3b3JrRm9ybWF0VHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0Zvcm1hdFR5cGUoKSwgd29ya0Zvcm1hdFR5cGUsIFdPUktfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXb3JrR3JvdXBUeXBlKEJpZ0ludGVnZXIgd29ya0dyb3VwVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlV29ya0dyb3VwVHlwZV9FbnVtZXJhdGlvbih3b3JrR3JvdXBUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVXb3JrR3JvdXBUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFdPUktfR1JPVVBfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPldvcmsgR3JvdXAgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdvcmtHcm91cFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciB3b3JrR3JvdXBUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gV09SS19HUk9VUF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHdvcmtHcm91cFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtHcm91cFR5cGUoKSwgd29ya0dyb3VwVHlwZSwgV09SS19HUk9VUF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotfSAvL01zcHJvamVjdFZhbGlkYXRvcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFhNTEhlbHBlckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RYTUxIZWxwZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1Y2Q3N2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFhNTEhlbHBlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuRmllbGRQb3NpdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxIZWxwZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5pbnRlcm5hbC5YTUxDYWxlbmRhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUudXRpbC5YTUxUeXBlVXRpbDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuRGF0ZUZvcm1hdDsKLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci0KLS8qKgotICogQ3JlYXRlIGEgc2xpZ2h0bHkgY3VzdG9taXplZCBYTUxIZWxwZXJJbXBsIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTXNwcm9qZWN0WE1MSGVscGVySW1wbCBleHRlbmRzIFhNTEhlbHBlckltcGwgaW1wbGVtZW50cyBYTUxIZWxwZXIgewotCi0JIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGF0ZUZvcm1hdCBbXSBFREFURV9GT1JNQVRTID0KLQkgIHsKLQkJbmV3IFNhZmVTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkJ1QnSEg6bW06c3MiKSwKLQkgICAgbmV3IFNhZmVTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkJ1QnSEg6bW06c3NaIiksCi0JICAgIG5ldyBTYWZlU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZFoiKQotCSAgfTsKLQkgCi0JIC8qKgotCSAgKiBDb25zdHJ1Y3RvcgotCSAgKiBAcGFyYW0gcmVzb3VyY2UKLQkgICovCi0JcHVibGljIE1zcHJvamVjdFhNTEhlbHBlckltcGwoWE1MUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJc3VwZXIocmVzb3VyY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGJvb2xlYW4gdmFsdWUgdG8gZWl0aGVyICIwIiBvciAiMSIKLQkgKiBDb252ZXJ0IERhdGVUaW1lIHZhbHVlIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBNUyBwcm9qZWN0Ci0JICovCi0JIHB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVGYWN0b3J5IGZhY3RvcnksIEVEYXRhVHlwZSBkYXRhVHlwZSwgT2JqZWN0IHZhbHVlKQotCSAgewotCQkgCi0vLwkJIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5pbXBsLlhNTFR5cGVGYWN0b3J5SW1wbCBhRmFjdG9yeSA9IG5ldyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuaW1wbC5YTUxUeXBlRmFjdG9yeUltcGwoKTsKLS8vCQkgU3lzdGVtLm91dC5wcmludGxuKCIkJCQkJCBkYXRhVHlwZSBuYW1lID0gIiArIGRhdGFUeXBlLmdldE5hbWUoKSk7Ci0JCSAKLQkJIGlmICgiQm9vbGVhbiIuZXF1YWxzSWdub3JlQ2FzZShkYXRhVHlwZS5nZXROYW1lKCkpKSB7Ci0vLwkJCSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBuZWVkIHRvIG92ZXJyaWRlIHRoZSBCb29sZWFuOiAiICsgdmFsdWUpOwotCQkJIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJIFN0cmluZyBycyA9ICIwIjsKLQkJCQkgdHJ5IHsKLQkJCQkJIEJvb2xlYW4gYk9iamVjdCA9IChCb29sZWFuKXZhbHVlOwotCQkJCQkgaWYgKGJPYmplY3QuYm9vbGVhblZhbHVlKCkpCi0JCQkJCQkgcnMgPSAiMSI7Ci0JCQkJIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotLy8JCQkJIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGNvbnZlcnRlZCBzdHJpbmcgPSAiICsgcnMpOwotCQkJCSByZXR1cm4gcnM7Ci0JCQkgfQotCQkJIHJldHVybiBudWxsOyAKLQkJIH0gZWxzZSBpZiAoIkRhdGVUaW1lIi5lcXVhbHNJZ25vcmVDYXNlKGRhdGFUeXBlLmdldE5hbWUoKSkpIHsKLS8vCQkJIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIG5lZWQgdG8gb3ZlcnJpZGUgdGhlIERhdGVUaW1lOiAiICsgdmFsdWUuZ2V0Q2xhc3MoKSArICIsIiArIHZhbHVlKTsKLQkJCSBpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCSAgIFN0cmluZyBycyA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0JCQkJICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkKLQkJCQkgICAgewotCQkJCSAgICAgIHJzID0gRURBVEVfRk9STUFUU1swXS5mb3JtYXQoKERhdGUpdmFsdWUpOwotCQkJCSAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgWE1MQ2FsZW5kYXIpewotCQkJCQkgIHJzID0gKChYTUxDYWxlbmRhcil2YWx1ZSkudG9TdHJpbmcoKTsKLQkJCQkJICBpbnQgaWR4ID0gcnMuaW5kZXhPZignLicpOwotCQkJCQkgIGlmIChpZHggPiAwKQotCQkJCQkJICBycyA9IHJzLnN1YnN0cmluZygwLCBpZHgpOwotCQkJCQl9Ci0vLwkJCQkgICBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBjb252ZXJ0ZWQgc3RyaW5nID0gIiArIHJzKTsKLQkJCQkgICByZXR1cm4gcnM7Ci0JCQkgfQotCQkJIHJldHVybiBudWxsOyAKLQkJIH0KLQkJIAotLy8JCSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBFRmFjdG9yeSwgRURhdGFUeXBlLCB2YWx1ZSA9ICIgKyBmYWN0b3J5ICsgIiwiICsgZGF0YVR5cGUgKyAiLCIgKyB2YWx1ZSk7Ci0JCSBTdHJpbmcgcnMgPSBzdXBlci5jb252ZXJ0VG9TdHJpbmcoIGZhY3RvcnksICBkYXRhVHlwZSwgIHZhbHVlKTsKLS8vCQkgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgY29udmVydGVkIHN0cmluZyAob3V0KSA9ICIgKyBycyk7Ci0JCSByZXR1cm4gcnM7Ci0JICB9Ci0JIAotCSAvKioKLQkgICogQ29udmVydCB0aGUgMSBvciAwIGJvb2xlYW4gdmFsdWUgdG8gYW4gQm9vbGVhbiBPYmplY3QKLQkgICogY29udmVydCB0aGUgZGF0ZXRpbWUgc3RyaW5nIGludG8gWE1MQ2FsZW5kYXIgb2JqZWN0LgotCSAgKi8KLQkgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVGYWN0b3J5IGVGYWN0b3J5LCBFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgdmFsdWUpCi0JICB7Ci0JCSBpZiAoIkJvb2xlYW4iLmVxdWFsc0lnbm9yZUNhc2UoZURhdGFUeXBlLmdldE5hbWUoKSkpIHsKLS8vCQkJIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIG5lZWQgdG8gY29udmVydCBmcm9tIEJvb2xlYW46ICIgKyB2YWx1ZSk7Ci0JCQkgaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkgaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSB8fCB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCIxIikpCi0JCQkJCSByZXR1cm4gQm9vbGVhbi5UUlVFOwotCQkJCSBlbHNlCi0JCQkJCSByZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJCSB9Ci0JCQkgcmV0dXJuIG51bGw7IAotCQkgfSBlbHNlIGlmICgiRGF0ZVRpbWUiLmVxdWFsc0lnbm9yZUNhc2UoZURhdGFUeXBlLmdldE5hbWUoKSkpIHsKLS8vCQkJIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIG5lZWQgdG8gY29udmVydCBmcm9tIERhdGVUaW1lOiAiICsgdmFsdWUpOwotCQkJIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJICAgcmV0dXJuIG5ldyBYTUxDYWxlbmRhcihjb2xsYXBzZVdoaXRlU3BhY2UodmFsdWUpLCBYTUxDYWxlbmRhci5EQVRFVElNRSk7Ci0JCQkgfQotCQkJIHJldHVybiBudWxsOyAKLQkJIH0KLQkJIAotLy8JCSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBFRmFjdG9yeSwgRURhdGFUeXBlLCB2YWx1ZSA9ICIgKyBlRmFjdG9yeSArICIsIiArIGVEYXRhVHlwZSArICIsIiArIHZhbHVlKTsKLQkJIE9iamVjdCBybyA9IHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoIGVGYWN0b3J5LCAgZURhdGFUeXBlLCAgdmFsdWUpOwotLy8JCSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBjb252ZXJ0ZWQgb2JqZWN0IChpbikgPSAiICsgcm8pOwotCQkgcmV0dXJuIHJvOwotCSAgfQotCSAKLQkgcHJvdGVjdGVkIFN0cmluZyBjb2xsYXBzZVdoaXRlU3BhY2UoU3RyaW5nIHZhbHVlKQotCSB7Ci0JCSByZXR1cm4gWE1MVHlwZVV0aWwubm9ybWFsaXplKHZhbHVlLCB0cnVlKTsKLQkgfQotCSAgCi0JIHByaXZhdGUgc3RhdGljIGNsYXNzIFNhZmVTaW1wbGVEYXRlRm9ybWF0IGV4dGVuZHMgU2ltcGxlRGF0ZUZvcm1hdAotCSB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXB1YmxpYyBTYWZlU2ltcGxlRGF0ZUZvcm1hdChTdHJpbmcgcGF0dGVybikKLQkgICAgewotCSAgICAgIHN1cGVyKHBhdHRlcm4pOwotCSAgICB9Ci0KLQkgICAgcHVibGljIHN5bmNocm9uaXplZCBEYXRlIHBhcnNlKFN0cmluZyBzb3VyY2UpIHRocm93cyBQYXJzZUV4Y2VwdGlvbgotCSAgICB7Ci0JICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlKHNvdXJjZSk7Ci0JICAgIH0KLQotCSAgICBwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdChEYXRlIGRhdGUsIFN0cmluZ0J1ZmZlciB0b0FwcGVuZFRvLCBGaWVsZFBvc2l0aW9uIHBvcykKLQkgICAgewotCSAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBzdXBlci5mb3JtYXQoZGF0ZSwgdG9BcHBlbmRUbywgcG9zKTsKLS8vCSAgICAgIHJlc3VsdC5pbnNlcnQocmVzdWx0Lmxlbmd0aCgpIC0gMiwgIjoiKTsKLQkgICAgICByZXR1cm4gcmVzdWx0OwotCSAgICB9Ci0JICB9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYwM2Q4OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgYWNjZXNzaW5nIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVlNzQwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm08L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNGZiODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlZmVhdHVyZVBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOTkwODYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5pbmkgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2Q0OTZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQotYXBwTmFtZT0lZmVhdHVyZU5hbWUKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jICgkbmwkLyBwcmVmaXggdG8gcGVybWl0IGxvY2FsZS1zcGVjaWZpYyB0cmFuc2xhdGlvbnMgb2YgZW50aXJlIGZpbGUpCi13ZWxjb21lUGFnZT0kbmwkL3dlbGNvbWUueG1sCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MWE4OGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQbGF0Zm9ybSAzLjMuMCB3aXRoIEVNRiBHRUYgR01GCi0KLWJsdXJiPUVjbGlwc2UgUGxhdGZvcm1cblwKLVxuXAotVmVyc2lvbjogMy4zLjBcblwKLUJ1aWxkIGlkOiBJMjAwNzA2MjUtMTUwMFxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtXG5cCi1cblwKLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlXG5cCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWQ4YjMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5naWYsXAotICAgICAgICAgICAgICAgd2VsY29tZS54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgbmwvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vZWNsaXBzZTMyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2RhL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvZGEvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEzZmJmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvZGEvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFBsYXRmb3JtIDMuMy4wIG1lZCBFTUYgR0VGIEdNRgotCi1ibHVyYj1FY2xpcHNlLXBsYXRmb3JtXG5cCi1cblwKLVZlcnNpb246IDMuMy4wXG5cCi1CeWctaWQ6IEkyMDA3MDYyNS0xNTAwXG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotQmVzXHUwMGY4ZyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtXG5cCi1cblwKLURldHRlIHByb2R1a3QgaW5kZWhvbGRlciBzb2Z0d2FyZSwgZGVyIGVyIHVkdmlrbGV0IGFmXG5cCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvZGUvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9kZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDc3ZmFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9kZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWZlYXR1cmVOYW1lPUVjbGlwc2UgUGxhdGZvcm0gMy4zLjAgbWl0IEVNRiBHRUYgR01GCi0KLWJsdXJiPUVjbGlwc2UgUGxhdGZvcm1cblwKLVxuXAotVmVyc2lvbjogMy4zLjBcblwKLUJ1aWxkLUlEOiBJMjAwNzA2MjUtMTUwMFxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1CZXN1Y2hlbiBTaWUgZGllIFdlYnNlaXRlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGxhdGZvcm0uXG5cCi1cblwKLURpZXNlcyBQcm9kdWt0IGVudGhcdTAwZTRsdCBTb2Z0d2FyZSwgZGllIHZvbiBkZXJcblwKLUFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKSBlbnR3aWNrZWx0IHd1cmRlLgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2VzL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvZXMvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjMzhhNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvZXMvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFBsYXRmb3JtIDMuMy4wIGNvbiBFTUYgR0VGIEdNRgotCi1ibHVyYj1QbGF0YWZvcm1hIEVjbGlwc2VcblwKLVxuXAotVmVyc2lcdTAwZjNuOiAzLjMuMFxuXAotSUQgZGUgYnVpbGQ6IEkyMDA3MDYyNS0xNTAwXG5cCi1cblwKLShjKSBDb3B5cmlnaHQgQ29sYWJvcmFkb3JlcyBkZSBFY2xpcHNlIHkgb3Ryb3MgMjAwMCwgMjAwNy4gIFJlc2VydmFkb3MgdG9kb3MgbG9zIGRlcmVjaG9zLlxuXAotVmlzaXRlIGxhIHBcdTAwZTFnaW5hIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGxhdGZvcm1cblwKLVxuXAotRXN0ZSBwcm9kdWN0byBpbmNsdXllIHNvZnR3YXJlIGRlc2Fycm9sbGFkbyBwb3IgbGFcblwKLUFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9mci9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2ZyL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ODI0N2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2ZyL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQbGF0Zm9ybSAzLjMuMCBhdmVjIEVNRiBHRUYgR01GCi0KLWJsdXJiPUVjbGlwc2UgUGxhdGZvcm1cblwKLVxuXAotVmVyc2lvbiA6IDMuMy4wXG5cCi1JRCBkZSBjb25zdHJ1Y3Rpb24gOiBJMjAwNzA2MjUtMTUwMFxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdGV6IGxhIHBhZ2Ugc3VpdmFudGUgOiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtXG5cCi1cblwKLUNlIHByb2R1aXQgY29udGllbnQgZGVzIGxvZ2ljaWVscyBkXHUwMGU5dmVsb3BwXHUwMGU5cyBwYXJcblwKLUFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9pdC9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2l0L2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNTViM2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2l0L2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotZmVhdHVyZU5hbWU9UGlhdHRhZm9ybWEgRWNsaXBzZSAzLjMuMCBjb24gRU1GIEdFRiBHTUYKLQotYmx1cmI9UGlhdHRhZm9ybWEgRWNsaXBzZVxuXAotXG5cCi1WZXJzaW9uZTogMy4zLjBcblwKLUlkIGJ1aWxkOiBJMjAwNzA2MjUtMTUwMFxuXAotXG5cCi0oYykgQ29weXJpZ2h0IGNvbnRyaWJ1dG9yIEVjbGlwc2UgZSBhbHRyaSAyMDAwLCAyMDA3LiAgVHV0dGkgaSBkaXJpdHRpIHJpc2VydmF0aS5cblwKLVZpc2l0YXJlIGwnaW5kaXJpenpvIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGxhdGZvcm1cblwKLVxuXAotUXVlc3RvIHByb2RvdHRvIGluY2x1ZGUgc29mdHdhcmUgc3ZpbHVwcGF0byBkYVxuXAotQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gaHR0cDovL3d3dy5hcGFjaGUub3JnLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2phL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvamEvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY4MzY5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvamEvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFBsYXRmb3JtIDMuMy4wIHdpdGggRU1GIEdFRiBHTUYKLQotYmx1cmI9RWNsaXBzZSBQbGF0Zm9ybVxuXAotXG5cCi1cdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjM6IDMuMy4wXG5cCi1cdTMwZDNcdTMwZWJcdTMwYzkgSUQ6IEkyMDA3MDYyNS0xNTAwXG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGxhdGZvcm0gXHUzMDkyXHU1M2MyXHU3MTY3XHUzMDAyXG5cCi1cblwKLVx1MzA1M1x1MzA2ZVx1ODhmZFx1NTRjMVx1MzA2Ylx1MzA2Zlx1MzAwMUFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKVxuXAotXHUzMDZiXHUzMDg4XHUzMDhhXHU5NThiXHU3NjdhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGJkXHUzMGQ1XHUzMGM4XHUzMGE2XHUzMGE3XHUzMGEyXHUzMDRjXHU1NDJiXHUzMDdlXHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwva28vYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9rby9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGFmOWRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9rby9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWZlYXR1cmVOYW1lPUVjbGlwc2UgXHVkNTBjXHViN2FiXHVkM2ZjIDMuMy4wKEVNRiBHRUYgR01GIFx1ZDNlY1x1ZDU2OCkKLQotYmx1cmI9RWNsaXBzZSBcdWQ1MGNcdWI3YWJcdWQzZmNcblwKLVxuXAotXHViYzg0XHVjODA0OiAzLjMuMFxuXAotXHViZTRjXHViNGRjIElEOiBJMjAwNzA2MjUtMTUwMFxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtIFx1YzZmOVx1YzBhY1x1Yzc3NFx1ZDJiOFx1Yjk3YyBcdWJjMjlcdWJiMzhcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuXG5cCi1cblwKLVx1Yzc3NCBcdWM4MWNcdWQ0ODhcdWM1ZDBcdWIyOTQgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oaHR0cDovL3d3dy5hcGFjaGUub3JnLylcdWM1ZDBcdWMxMWMgXG5cCi1cdWFjMWNcdWJjMWNcdWQ1NWMgXHVjMThjXHVkNTA0XHVkMmI4XHVjNmU4XHVjNWI0XHVhYzAwIFx1ZDNlY1x1ZDU2OFx1YjQxOFx1YzViNCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvcHQvQlIvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9wdC9CUi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTRiMzI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9wdC9CUi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWZlYXR1cmVOYW1lPUVjbGlwc2UgUGxhdGZvcm0gMy4zLjAgY29tIEVNRiBHRUYgR01GCi0KLWJsdXJiPUVjbGlwc2UgUGxhdGZvcm1cblwKLVxuXAotVmVyc1x1MDBlM286IDMuMy4wXG5cCi1JRCBkYSBDb25zdHJ1XHUwMGU3XHUwMGUzbzogSTIwMDcwNjI1LTE1MDBcblwKLVxuXAotKGMpIENvcHlyaWdodCBjb250cmlidWlkb3JlcyBFY2xpcHNlIGUgb3V0cm9zIDIwMDAsIDIwMDcuIFRvZG9zIG9zIGRpcmVpdG9zIHJlc2VydmFkb3MuXG5cCi1WaXNpdGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXAotXG5cCi1Fc3RlIHByb2R1dG8gaW5jbHVpIHNvZnR3YXJlIGRlc2Vudm9sdmlkbyBwZWxhXG5cCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvcnUvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9ydS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjgxZjA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9ydS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWZlYXR1cmVOYW1lPVx1MDQxZlx1MDQzYlx1MDQzMFx1MDQ0Mlx1MDQ0NFx1MDQzZVx1MDQ0MFx1MDQzY1x1MDQzMCBFY2xpcHNlIDMuMy4wIFx1MDQ0MSBFTUYgR0VGIEdNRgotCi1ibHVyYj1cdTA0MWZcdTA0M2JcdTA0MzBcdTA0NDJcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzAgRWNsaXBzZVxuXAotXG5cCi1cdTA0MTJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0NGY6IDMuMy4wXG5cCi1cdTA0MThcdTA0MTQgXHUwNDNhXHUwNDNlXHUwNDNjXHUwNDNmXHUwNDNlXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNhXHUwNDM4OiBJMjAwNzA2MjUtMTUwMFxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIFx1MDQxMlx1MDQ0MVx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDQ5XHUwNDM4XHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDRiLlxuXAotXHUwNDFmXHUwNDNlXHUwNDQxXHUwNDM1XHUwNDQyXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzMFx1MDQzZFx1MDQzOFx1MDQ0Nlx1MDQ0MyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtXG5cCi1cblwKLVx1MDQxMiBcdTA0NDFcdTA0M2VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzIgXHUwNDM0XHUwNDMwXHUwNDNkXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlIFx1MDQzZlx1MDQ0MFx1MDQzZVx1MDQzNFx1MDQ0M1x1MDQzYVx1MDQ0Mlx1MDQzMCBcdTA0MzJcdTA0NDVcdTA0M2VcdTA0MzRcdTA0MzhcdTA0NDIgXHUwNDNhXHUwNDNlXHUwNDM0LCBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M2VcdTA0NDJcdTA0MzBcdTA0M2RcdTA0M2RcdTA0NGJcdTA0MzlcblwKLUFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC96aC9DTi9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL3poL0NOL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOWFlNDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL3poL0NOL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotZmVhdHVyZU5hbWU9XHU1ZTI2XHU2NzA5IEVNRiBHRUYgR01GIFx1NzY4NCBFY2xpcHNlIFBsYXRmb3JtIDMuMy4wCi0KLWJsdXJiPUVjbGlwc2UgUGxhdGZvcm1cblwKLVxuXAotXHU3MjQ4XHU2NzJjXHVmZjFhMy4zLjBcblwKLVx1NWRlNVx1NGY1Y1x1NzI0OFx1NjcyY1x1NjgwN1x1OGJjNlx1ZmYxYUkyMDA3MDYyNS0xNTAwXG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVx1OGJmN1x1OGJiZlx1OTVlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtXG5cCi1cblwKLVx1NjcyY1x1NGVhN1x1NTRjMVx1NTMwNVx1NTQyYlx1NzUzMSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvblx1ZmYwOGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9cdWZmMDlcdTVmMDBcdTUzZDFcdTc2ODRcdThmNmZcdTRlZjZcbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL3poL1RXL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvemgvVFcvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI3NTFjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvemgvVFcvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFBsYXRmb3JtIDMuMy4wIHdpdGggRU1GIEdFRiBHTUYKLQotYmx1cmI9RWNsaXBzZSBcdTVlNzNcdTUzZjBcblwKLVxuXAotXHU3MjQ4XHU2NzJjXHVmZjFhMy4zLjBcblwKLVx1NWVmYVx1N2Y2ZSBJRFx1ZmYxYUkyMDA3MDYyNS0xNTAwXG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVx1OGFjYlx1OTAyMFx1OGEyYSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtXG5cCi1cblwKLVx1NjcyY1x1NzUyMlx1NTRjMVx1NTMwNVx1NTQyYiBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvXG5cCi1cdTYyNDBcdTk1OGJcdTc2N2NcdTc2ODRcdThlZGZcdTlhZDQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlNDY1OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLWZlYXR1cmVQbHVnaW5OYW1lPUVQRiBQbGF0Zm9ybSBGZWF0dXJlCi1mZWF0dXJlUGx1Z2luTmFtZU5MPUVQRiBQbGF0Zm9ybSBGZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vd2VsY29tZS54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vd2VsY29tZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMDkyNDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL3dlbGNvbWUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPHdlbGNvbWVQYWdlIAotCXRpdGxlPSJFY2xpcHNlIE1vZGVsaW5nIEZyYW1ld29yayAoRU1GKSI+Ci0KLTxpbnRybz5FTUYgaXMgYSBKYXZhL1hNTCBmcmFtZXdvcmsgZm9yIGdlbmVyYXRpbmcgdG9vbHMgYW5kIG90aGVyIGFwcGxpY2F0aW9ucwotYmFzZWQgb24gc2ltcGxlIGNsYXNzIG1vZGVscy4KLTwvaW50cm8+Ci0KLTxpdGVtPjxiPldoYXQgaXMgRU1GPzwvYj4KLQlSZWFkIHRoZSA8dG9waWMgaHJlZj0iL29yZy5lY2xpcHNlLmVtZi5kb2MvcmVmZXJlbmNlcy9vdmVydmlldy9FTUYuaHRtbCI+b3ZlcnZpZXc8L3RvcGljPiBhcnRpY2xlIHRvIGxlYXJuIGFib3V0IEVNRi4KLQlUaGVuLCBmb2xsb3cgdGhlIDx0b3BpYyBocmVmPSIvb3JnLmVjbGlwc2UuZW1mLmRvYy90dXRvcmlhbHMvY2xpYm1vZC9jbGlibW9kLmh0bWwiPnR1dG9yaWFsPC90b3BpYz4gdG8gc2VlIGhvdyBlYXN5IGl0IGlzIHRvIGdlbmVyYXRlIGEgbW9kZWwuCi08L2l0ZW0+Ci0KLTxpdGVtPjxiPkxlYXJuIE1vcmU8L2I+Ci0JVGhpcyBpcyB0aGUgb2ZmaWNpYWwgc2l0ZSBvZiBFTUY6IDx0b3BpYyBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZiI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWY8L3RvcGljPgotPC9pdGVtPgotCi08L3dlbGNvbWVQYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZTZlNmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDcxODdjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmc7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dCwKLSBvcmcuZWNsaXBzZS5oZWxwLmJhc2UsCi0gb3JnLmVjbGlwc2UudWkuYnJvd3NlciwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWksCi0gb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXMsCi0gb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkcwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRiODI0OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvaWNvbnMvUmVwb3J0aW5nLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL1JlcG9ydGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOGNjOGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvaWNvbnMvUmVwb3J0aW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL1dlYlB1Ymxpc2guZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvaWNvbnMvV2ViUHVibGlzaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZGNmMGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvaWNvbnMvV2ViUHVibGlzaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9pY29ucy9mdWxsL3dpemJhbi9QdWJsaXNoQ29uZmlndXJhdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9pY29ucy9mdWxsL3dpemJhbi9QdWJsaXNoQ29uZmlndXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDk4MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvaWNvbnMvZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RhOGIxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJFR0lOIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBEZWZhdWx0IFB1Ymxpc2ggUGF0aAotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotcHVibGlzaFBhdGg9PHVzZXIuaG9tZT4vPGFwcC5uYW1lPi9QdWJsaXNoCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBFTkQgTk8gVFJBTlNMQVRJT04KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgUHVibGlzaGluZyBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgRGVmYXVsdCBGZWVkYmFjayBVUkwKLWZlZWRiYWNrVVJMPWh0dHA6Ly93d3cucHVibGlzaGVkX3dlYnNpdGUuY29tL2ZlZWRiYWNrCi0KLSMgUHVibGlzaCBDb25maWd1cmF0aW9uIEFjdGlvbgotcHVibGlzaENvbmZpZ0FjdGlvbj0mUHVibGlzaC4uLgotcHVibGlzaENvbmZpZ0FjdGlvblRvb2x0aXA9UHVibGlzaCBhIHdlYiBzaXRlIGZvciBhIGNvbmZpZ3VyYXRpb24KLQotIyBQcmVmZXJlbmNlIFBhZ2UKLXJvb3RQYWdlTmFtZT1QdWJsaXNoaW5nL0Jyb3dzaW5nCi1yb2xlRGlhZ3JhbVBhZ2VOYW1lPVJvbGUgRGlhZ3JhbQotYWN0aXZpdHlEaWFncmFtUGFnZU5hbWU9QWN0aXZpdHkgRGlhZ3JhbXMKLXB1Ymxpc2hpbmdPcHRpb25zPVB1Ymxpc2hpbmcgT3B0aW9ucwotCi0jIFB1Ymxpc2hpbmcgQWN0aW9ucwotY29uZmlnQWN0aW9uU2V0PUNvbmZpZ3VyYXRpb24KLWNvbmZpZ01lbnU9JkNvbmZpZ3VyYXRpb24KLQotIyBQcmludCBDb25maWd1cmF0aW9uIEFjdGlvbgotcHJpbnRDb25maWdBY3Rpb249UHJpbnQKLQotIyB0aGUgdGl0bGUgZm9yIHRoZSBwdWJsaXNoZWQgc2l0ZQotI2Rvbid0IGRlZmluZSBoZXJlLCBsZXQgdXNlciBzcGVjaWZ5IGl0LgotI3RpdGxlPU9wZW5VUC9CYXNpYwotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMzNzIxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJwdWJsaXNoQ29uZmlnV2l6YXJkIgotICAgICAgICAgbmFtZT0iUHVibGlzaCBNZXRob2QgQ29uZmlndXJhaXRvbiBXaXphcmQgRXh0ZW5zaW9uIgotICAgICAgICAgc2NoZW1hPSJzY2hlbWEvUHVibGlzaENvbmZpZ1dpemFyZC5leHNkIiAvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0gICAgICA8YWN0aW9uU2V0Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuQ29uZmlnQWN0aW9uU2V0IgotICAgICAgICAgICAgbGFiZWw9IiVjb25maWdBY3Rpb25TZXQiCi0gICAgICAgICAgICB2aXNpYmxlPSJmYWxzZSI+Ci0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm1lbnUuY29uZmlndXJhdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlY29uZmlnTWVudSIKLSAgICAgICAgICAgICAgIHBhdGg9ImFkZGl0aW9ucyIvPiAgCi0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuYWN0aW9ucy5QdWJsaXNoQ29uZmlnQWN0aW9uIgotICAgICAgICAgICAgICAgaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jb25maWd1cmF0aW9uX3B1Ymxpc2hfY29udGV4dCIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL1dlYlB1Ymxpc2guZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmFjdGlvbnMuUHVibGlzaCIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlcHVibGlzaENvbmZpZ0FjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5tZW51LmNvbmZpZ3VyYXRpb24vYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giLz4KLSAgICAgIDwvYWN0aW9uU2V0PgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZUV4dGVuc2lvbnMiPgotICAgICAgPHBlcnNwZWN0aXZlRXh0ZW5zaW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdQZXJzcGVjdGl2ZSI+Ci0gICAgICAgICA8YWN0aW9uU2V0Ci0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuQ29uZmlnQWN0aW9uU2V0Ij4KLSAgICAgICAgIDwvYWN0aW9uU2V0PgotICAgICAgPC9wZXJzcGVjdGl2ZUV4dGVuc2lvbj4KLSAgICAgIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQnJvd3NpbmdQZXJzcGVjdGl2ZSI+Ci0gICAgICAgICA8YWN0aW9uU2V0Ci0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuQ29uZmlnQWN0aW9uU2V0Ij4KLSAgICAgICAgIDwvYWN0aW9uU2V0PgotICAgICAgPC9wZXJzcGVjdGl2ZUV4dGVuc2lvbj4gICAgICAKLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0UGFydEFzc29jaWF0aW9ucyI+Ci0gICAgICA8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuQ29uZmlnQWN0aW9uU2V0Ij4KLSAgICAgICAgIDxwYXJ0Ci0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3IiPgotICAgICAgICAgPC9wYXJ0PgotICAgICAgPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXMuUHVibGlzaGluZ1ByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkucHJlZmVyZW5jZXMuUm9vdFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgbmFtZT0iJXJvb3RQYWdlTmFtZSIvPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5Sb2xlRGlhZ3JhbVByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlJvbGVEaWFncmFtUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXMuUHVibGlzaGluZ1ByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgbmFtZT0iJXJvbGVEaWFncmFtUGFnZU5hbWUiLz4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXMuQWN0aXZpdHlEaWFncmFtUHJlZmVyZW5jZVBhZ2UiCi0JICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXMuQWN0aXZpdHlEaWFncmFtUHJlZmVyZW5jZVBhZ2UiCi0JCSAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXMuUHVibGlzaGluZ1ByZWZlcmVuY2VQYWdlIgotCQkgICAgbmFtZT0iJWFjdGl2aXR5RGlhZ3JhbVBhZ2VOYW1lIi8+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+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9QdWJsaXNoZXJFbGVtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUHVibGlzaGVyRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWI2ODdhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9QdWJsaXNoZXJFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5BYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuQWJzdHJhY3RQdWJsaXNoV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgYXR0cmlidXRlcyBmb3IgYSBwdWJsaXNoZXIgZXh0ZW5zaW9uIHBvaW50Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaGVyRWxlbWVudCB7Ci0JQnVuZGxlIGJ1bmRsZTsKLQlwcml2YXRlIFN0cmluZyBpZDsKLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQlwcml2YXRlIFN0cmluZyBpY29uOwotCXByaXZhdGUgU3RyaW5nIHdpemFyZENsYXNzOwotCXByaXZhdGUgU3RyaW5nIG1hbmFnZXJDbGFzczsJCi0JCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIFB1Ymxpc2hlckVsZW1lbnQgZXh0ZW5zaW9uIHBvaW50Ci0JICogQHBhcmFtIGJ1bmRsZSBCdW5kbGUgdGhlIGJ1bmRsZSB0aGF0IGxhb2QgdGhlIGVsZW1lbnQgZGVmaW5pdGlvbiBmaWxlCi0JICogQHBhcmFtIGlkIFN0cmluZwotCSAqIEBwYXJhbSBsYWJlbCBTdHJpbmcKLQkgKiBAcGFyYW0gaWNvbiBTdHJpbmcgaWNvbiBwYXRoCi0JICogQHBhcmFtIHdpemFyZENsYXNzIFN0cmluZyB0aGUgcHVibGlzaGluZyB3aXphcmQgY2xhc3MuIAotCSAqIFRoaXMgY2xhc3MgbXVzdCBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLndpemFyZHMuQWJzdHJhY3RQdWJsaXNoV2l6YXJkIGNsYXNzCi0JICogQHBhcmFtIG1hbmFnZXJDbGFzcyBTdHJpbmcgdGhlIHB1Ymxpc2ggbWFtYWdlciBjbGFzcy4gCi0JICogdGhpcyBjbGFzcyBtdXN0IGV4dGVuZHMgdGhlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLkFic3RyYWN0UHVibGlzaE1hbmFnZXIgY2xhc3MuCi0JICovCi0JcHVibGljIFB1Ymxpc2hlckVsZW1lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGlkLCBTdHJpbmcgbGFiZWwsIFN0cmluZyBpY29uLCBTdHJpbmcgd2l6YXJkQ2xhc3MsIFN0cmluZyBtYW5hZ2VyQ2xhc3MpIHsKLQkJdGhpcy5idW5kbGUgPSBidW5kbGU7IAotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJdGhpcy5pY29uID0gaWNvbjsKLQkJdGhpcy53aXphcmRDbGFzcyA9IHdpemFyZENsYXNzOwotCQl0aGlzLm1hbmFnZXJDbGFzcyA9IG1hbmFnZXJDbGFzczsJCQotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHB1Ymxpc2ggd2l6YXJkCi0JICogCi0JICogQHJldHVybiBBYnN0cmFjdFB1Ymxpc2hXaXphcmQKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFB1Ymxpc2hXaXphcmQgZ2V0UHVibGlzaFdpemFyZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlDbGFzcyBjbGF6eiA9IGJ1bmRsZS5sb2FkQ2xhc3Mod2l6YXJkQ2xhc3MpOwotCQlyZXR1cm4gKEFic3RyYWN0UHVibGlzaFdpemFyZCkgY2xhenoubmV3SW5zdGFuY2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBwdWJsaXNoIG1hbmFnZXIKLQkgKiAKLQkgKiBAcmV0dXJuIEFic3RyYWN0UHVibGlzaE1hbmFnZXIKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyIGdldFB1Ymxpc2hNYW5hZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUNsYXNzIGNsYXp6ID0gYnVuZGxlLmxvYWRDbGFzcyhtYW5hZ2VyQ2xhc3MpOwotCQlyZXR1cm4gKEFic3RyYWN0UHVibGlzaE1hbmFnZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgaWQgb2YgdGhlIHB1Ymxpc2hlcgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsgCi0JCXJldHVybiBpZDsgCi0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgbGFiZWwgb2YgdGhlIHB1Ymxpc2hlcgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBwdWJsaXNoZXIgaWNvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlpZiAoIGljb24gPT0gbnVsbCB8fCBpY29uLmxlbmd0aCgpID09IDAgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCVVSTCBpbnN0YWxsVVJMID0gYnVuZGxlLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCVVSTCBpY29uVVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLCBpY29uKTsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpY29uVVJMKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1B1Ymxpc2hpbmdVSVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1B1Ymxpc2hpbmdVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjAzOTQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9QdWJsaXNoaW5nVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuQnJvd3NpbmdMYXlvdXRTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmZXJlbmNlcy5MaWJyYXJ5UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIGZvciB0aGUgcHVibGlzaGluZyBVSSBwbHVnaW4uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFB1Ymxpc2hpbmdVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoaW5nVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmNvcmUucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCQotCQl1cGRhdGVMYXlvdXRTZXR0aW5ncygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5jb3JlLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBQdWJsaXNoaW5nVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiB1cGRhdGUgdGhlIHB1Ymxpc2hpbmcvYnJvd3NpbmcgbGF5b3V0IHNldHRpbmdzLgotCSAqIENhbGwgdGhpcyBtZXRob2Qgd2hlbiBldmVyIHB1Ymxpc2hpbmcvYnJvd3NpbmcgcmVsYXRlZCBwcmVmZXJlbmNlcyBhcmUgY2hhbmdlZC4KLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUxheW91dFNldHRpbmdzKCkgCi0JewotCQkvLyBjYWxsIHRoZSBsaWJyYXJ5IFVJIHRvIHVwZGF0ZSB0aGUgc2V0dGluZ3MgZmlyc3QKLQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS51cGRhdGVMYXlvdXRTZXR0aW5ncygpOwotCQkKLQkJLy8gZ2V0IHRoZSBza2luIHNldHRpbmcgZnJvbSBwcmVmZXJlbmNlCi0JCS8vYm9vbGVhbiBwdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkKCk7CQotCQkvL2Jvb2xlYW4gcHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24gPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbigpOwotCQlib29sZWFuIGV4dHJhRGVzY3JpcHRvckluZm8gPSBQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXRFeHRyYURlc2NyaXB0b3JJbmZvKCk7Ci0JCS8vYm9vbGVhbiB1c2VuZXdFeHRlbmRzID0gTGlicmFyeVByZWZlcmVuY2VzLmdldFVzZU5ld0V4dGVuZHNTZW1hbnRpY3MoKTsKLQkJCi0JCS8vQnJvd3NpbmdMYXlvdXRTZXR0aW5ncy5JTlNUQU5DRS5zZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihwdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbik7Ci0JCS8vQnJvd3NpbmdMYXlvdXRTZXR0aW5ncy5JTlNUQU5DRS5zZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZChwdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCk7Ci0JCUJyb3dzaW5nTGF5b3V0U2V0dGluZ3MuSU5TVEFOQ0Uuc2V0U2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKGV4dHJhRGVzY3JpcHRvckluZm8pOwotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUHVibGlzaGluZ1VJUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUHVibGlzaGluZ1VJUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYzk3ZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1B1Ymxpc2hpbmdVSVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIFB1Ymxpc2hpbmcgVUkgcmVzb3VyY2UgYnVuZGxlLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQdWJsaXNoaW5nVUlSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNsYXNzCi0JCQkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUHVibGlzaGluZ1VJUmVzb3VyY2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb25maWdXaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnV2l6YXJkUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbnRlbnRXaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29udGVudFdpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaFByb2Nlc3Nlc1JhZGlvQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94TGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zV2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zV2l6YXJkUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaFdlYlNpdGVHcm91cF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzaW5nTGF5b3V0R3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRpdGxlQW5kTGlua3NHcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9va0FuZEZlZWxHcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGl0bGVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFubmVySW1hZ2VMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWJvdXRIVE1MTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZlZWRiYWNrVVJMTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdsb3NzYXJ5QW5kSW5kZXhHcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaEdsb3NzYXJ5TGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hJbmRleExhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YWxpZGF0aW9uR3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrRXh0ZXJuYWxMaW5rc0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0QnJva2VuTGlua3NMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhZ3JhbUdyb3VwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoQWN0aXZpdHlEZXRhaWxEaWFncmFtc0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoRXh0ZW5kZWRBY3Rpdml0eURpYWdyYW1zTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxheW91dEdyb3VwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoTGlnaHRXZWlnaHRUcmVlTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hFeHRyYURlc2NyaXB0b3JJbmZvTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hFbXB0eUNhdGVnb3JpZXNMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RGVzdGluYXRpb25XaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RGVzdGluYXRpb25XaXphcmRQYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXJMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2ViQXBwR3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHluYW1pY1dlYkFwcFJhZGlvQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmNsdWRlU2VhcmNoQ2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdlYkFwcGxpY2F0aW9uTmFtZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXN0aW5hdGlvbkRpcmVjdG9yeUdyb3VwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXRoTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVzZURlZmF1bHRQYXRoQ2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVzZURlZmF1bHRGZWVkYmFja0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmNsdWRlU2VhcmNoZXNMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xpZW50U2lkZVNlYXJjaFJhZGlvQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJTaWRlU2VhcmNoUmFkaW9CdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlV0FSRmlsZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1c2VBcHBsZXRDaGVja2JveF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2l0ZUN1c3RvbWl6YXRpb25XaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2l0ZUN1c3RvbWl6YXRpb25XaXphcmRQYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0aGVtZUFuZFNraW5Hcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvd0Jhbm5lckNoZWNrYm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RTa2luTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhcGFiaWxpdHlQYXR0ZXJuc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcnlQcm9jZXNzZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRWaWV3c0luZm9fbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFZpZXdDb250cmlidXRvckluZm9fbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFZpZXdTYW1lVmlld0luZm9fbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZmVyZW5jZVBhZ2VfZGVmYXVsdFBhdGhfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRTcGFjaW5nR3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tzSG9yaXpvbmFsU3BhY2luZ0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrc1ZlcnRpY2FsU3BhY2luZ0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50VGV4dExhYmVsR3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1heExpbmVPZlRleHRMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZEhvcml6b25hbFNwYWNpbmdFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkVmVydGljYWxTcGFjaW5nRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFRleHRMaW5lc0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maXJtUGF0aERpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3ZlcndyaXRlRGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5jZWxQdWJsaXNoQ29uZmlnX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXZpZXdDb25maWdFcnJvcl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdSZXBvcnRFcnJvcl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pc3NpbmdWaWV3RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2Fubm90UHVibGlzaEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRQYXRoRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFBhdGhDaGFyc0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWdFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmV2aWV3Q29uZmlnRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1JlcG9ydEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWdFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVGaWxlc0Vycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZURpckVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5Ccm93c2VyRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2ViQXBwTmFtZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdlYkFwcE5hbWVDaGFyc0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3dSZWxhdGVkRGVzY3JpcHRvcnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRBYm91dFBhdGhFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkQWJvdXRQYXRoQ2hhcnNFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3REZWZhdWx0QWN0aXZpdHlUYWJfdGV4dDsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFB1Ymxpc2hpbmdVSVJlc291cmNlcy5jbGFzcyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWZjYTI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYXRpb24gV2l6YXJkCi1wdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlPVB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYXRpb24KLQotIyBTZWxlY3QgTWV0aG9kIENvbmZpZ3VyYXRpb24gV2l6YXJkIFBhZ2UKLXNlbGVjdENvbmZpZ1dpemFyZFBhZ2VfdGl0bGU9U2VsZWN0IG1ldGhvZCBjb25maWd1cmF0aW9uCi1zZWxlY3RDb25maWdXaXphcmRQYWdlX3RleHQ9U2VsZWN0IGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdGhhdCBjb250YWlucyB0aGUgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyB3aGljaCB5b3Ugd291bGQgbGlrZSB0byBwdWJsaXNoLgotY29uZmlnTGFiZWxfdGV4dD1NZXRob2QgY29uZmlndXJhdGlvbjoKLQotIyBTZWxlY3QgTWV0aG9kIENvbmZpZ3VyYXRpb24gQ29udGVudCBXaXphcmQgUGFnZQotc2VsZWN0Q29udGVudFdpemFyZFBhZ2VfdGl0bGU9U2VsZWN0IG1ldGhvZCBjb25maWd1cmF0aW9uIGNvbnRlbnQKLXNlbGVjdENvbnRlbnRXaXphcmRQYWdlX3RleHQ9U2VsZWN0IHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBjb250ZW50IHRvIHB1Ymxpc2guIFlvdSBjYW4gY2hvb3NlIHRvIHB1Ymxpc2ggdGhlIGVudGlyZSBjb25maWd1cmF0aW9uIG9yIG9ubHkgYSBmZXcgc2VsZWN0IHByb2Nlc3NlcyBpbiB0aGUgY29uZmlndXJhdGlvbi4KLXB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbl90ZXh0PVB1Ymxpc2ggdGhlIGVudGlyZSBjb25maWd1cmF0aW9uCi1wdWJsaXNoUHJvY2Vzc2VzUmFkaW9CdXR0b25fdGV4dD1QdWJsaXNoIHNlbGVjdGVkIHByb2Nlc3NlczoKLWluY2x1ZGVCYXNlUHJvY2Vzc2VzQ2hlY2tib3hMYWJlbF90ZXh0PVB1Ymxpc2ggcmVmZXJlbmNlZCBiYXNlIHByb2Nlc3NlcwotCi0jIFNlbGVjdCBQdWJsaXNoaW5nIE9wdGlvbnMgV2l6YXJkIFBhZ2UKLXNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zV2l6YXJkUGFnZV90aXRsZT1TZWxlY3QgcHVibGlzaGluZyBvcHRpb25zCi1zZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1dpemFyZFBhZ2VfdGV4dD1TZWxlY3QgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucy4gVGhlc2Ugb3B0aW9ucyB3aWxsIGJlIHVzZWQgdG8gY3VzdG9taXplIHRoZSBsb29rIGFuZCBiZWhhdmlvciBvZiB0aGUgcHVibGlzaGVkIHdlYnNpdGUuCi10aXRsZUFuZExpbmtzR3JvdXBfdGV4dD1UaXRsZSBhbmQgbGlua3MKLXRpdGxlTGFiZWxfdGV4dD1UaXRsZToKLWFib3V0SFRNTExhYmVsX3RleHQ9QWJvdXQgY29udGVudDoKLWZlZWRiYWNrVVJMTGFiZWxfdGV4dD1GZWVkYmFjayBVUkw6Ci1nbG9zc2FyeUFuZEluZGV4R3JvdXBfdGV4dD1HbG9zc2FyeSBhbmQgaW5kZXgKLXB1Ymxpc2hHbG9zc2FyeUxhYmVsX3RleHQ9UHVibGlzaCBnbG9zc2FyeQotcHVibGlzaEluZGV4TGFiZWxfdGV4dD1QdWJsaXNoIGluZGV4Ci1sb29rQW5kRmVlbEdyb3VwX3RleHQ9TG9vayBhbmQgZmVlbAotYmFubmVySW1hZ2VMYWJlbF90ZXh0PUJhbm5lciBpbWFnZToKLXZhbGlkYXRpb25Hcm91cF90ZXh0PVZhbGlkYXRpb24KLWNoZWNrRXh0ZXJuYWxMaW5rc0xhYmVsX3RleHQ9Q2hlY2sgZXh0ZXJuYWwgaHlwZXJsaW5rcwotY29udmVydEJyb2tlbkxpbmtzTGFiZWxfdGV4dD1Db252ZXJ0IGJyb2tlbiBoeXBlcmxpbmtzIHRvIHBsYWluIHRleHQKLWRpYWdyYW1Hcm91cF90ZXh0PURpYWdyYW1zCi1wdWJsaXNoQWN0aXZpdHlEZXRhaWxEaWFncmFtc0xhYmVsX3RleHQ9UHVibGlzaCBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbXMgdGhhdCBoYXZlIG5vdCBiZWVuIG1hbnVhbGx5IGNyZWF0ZWQKLXB1Ymxpc2hFeHRlbmRlZEFjdGl2aXR5RGlhZ3JhbXNMYWJlbF90ZXh0PVB1Ymxpc2ggYWN0aXZpdHkgZGlhZ3JhbXMgZm9yIHVubW9kaWZpZWQgYWN0aXZpdHkgZXh0ZW5zaW9ucwotbGF5b3V0R3JvdXBfdGV4dD1MYXlvdXQKLXB1Ymxpc2hMaWdodFdlaWdodFRyZWVMYWJlbF90ZXh0PVNob3cgcmVsYXRpb25zaGlwIHN1Yi1mb2xkZXJzIGluIG5hdmlnYXRpb24gdHJlZXMKLXB1Ymxpc2hFeHRyYURlc2NyaXB0b3JJbmZvTGFiZWxfdGV4dD1JbmNsdWRlIG1ldGhvZCBjb250ZW50IGluIGRlc2NyaXB0b3IgcGFnZXMKLXB1Ymxpc2hFbXB0eUNhdGVnb3JpZXNMYWJlbF90ZXh0PVB1Ymxpc2ggY2F0ZWdvcmllcyB3aXRoIG5vIGNhdGVnb3JpemVkIGVsZW1lbnRzCi1wdWJsaXNoV2ViU2l0ZUdyb3VwX3RleHQ9UHVibGlzaGVkIHdlYnNpdGUKLWJyb3dzaW5nTGF5b3V0R3JvdXBfdGV4dD1Ccm93c2luZyBMYXlvdXQKLXNob3dSZWxhdGVkRGVzY3JpcHRvcnNfdGV4dD1JbmNsdWRlIGxpbmtzIHRvIHJlbGF0ZWQgZGVzY3JpcHRvcnMgaW4gcm9sZSwgdGFzayBhbmQgd29yayBwcm9kdWN0IHBhZ2VzCi1zaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlX3RleHQ9U2hvdyB0YXNrIGRlc2NyaXB0b3JzIGluIG5hdmlnYXRpb24gdHJlZXMKLXNlbGVjdERlZmF1bHRBY3Rpdml0eVRhYl90ZXh0PURlZmF1bHQgdGFiIGZvciBhY3Rpdml0eSBwYWdlczoKLQotIyBTZWxlY3QgRGVzdGluYXRpb24gV2l6YXJkIFBhZ2UKLXNlbGVjdERlc3RpbmF0aW9uV2l6YXJkUGFnZV90aXRsZT1TZWxlY3QgZGVzdGluYXRpb24gZGlyZWN0b3J5IGFuZCB3ZWJzaXRlIGZvcm1hdAotc2VsZWN0RGVzdGluYXRpb25XaXphcmRQYWdlX3RleHQ9U2VsZWN0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgYW5kIGZvcm1hdCBmb3IgdGhlIHB1Ymxpc2hlZCB3ZWJzaXRlLgotZGlyTGFiZWxfdGV4dD1EaXJlY3Rvcnk6Ci13ZWJBcHBHcm91cF90ZXh0PVdlYnNpdGUgZm9ybWF0Ci1zdGF0aWNXZWJTaXRlUmFkaW9CdXR0b25fdGV4dD1TdGF0aWMgd2ViIHNpdGUKLWR5bmFtaWNXZWJBcHBSYWRpb0J1dHRvbl90ZXh0PUphdmEgRUUgd2ViIGFwcGxpY2F0aW9uIHBhY2thZ2VkIGluIGEgV0FSIGZpbGUgKHJlcXVpcmVzIEphdmEgU2VydmxldCAyLjMgb3IgYWJvdmUgY29tcGxpYW50IHNlcnZsZXQgY29udGFpbmVyKQotaW5jbHVkZVNlYXJjaENoZWNrYm94X3RleHQ9SW5jbHVkZSBzZWFyY2ggY2FwYWJpbGl0eQotd2ViQXBwbGljYXRpb25OYW1lTGFiZWxfdGV4dD1XZWIgYXBwbGljYXRpb24gbmFtZToKLQotZGVzdGluYXRpb25EaXJlY3RvcnlHcm91cF90ZXh0PURlc3RpbmF0aW9uIGRpcmVjdG9yeQotcGF0aExhYmVsX3RleHQ9UGF0aDoKLXVzZURlZmF1bHRQYXRoQ2hlY2tib3hfdGV4dD1Vc2UgZGVmYXVsdCBwYXRoCi11c2VEZWZhdWx0RmVlZGJhY2tMYWJlbF90ZXh0PVVzZSBkZWZhdWx0IGZlZWRiYWNrIFVSTAotCi1pbmNsdWRlU2VhcmNoQ2hlY2tib3hfdGV4dD1JbmNsdWRlIHNlYXJjaCBjYXBhYmlsaXR5IChyZXF1aXJlcyBjb250YWluZXIgZm9yIHNlcnZsZXQpCi1pbmNsdWRlU2VhcmNoZXNMYWJlbF90ZXh0PUluY2x1ZGUgc2VhcmNoIGNhcGFiaWxpdHkKLWNsaWVudFNpZGVTZWFyY2hSYWRpb0J1dHRvbl90ZXh0PSBDbGllbnQgc2lkZSBzZWFyY2ggKHJlcXVpcmVzIEphdmEgYXBwbGV0IHN1cHBvcnQgaW4gYnJvd3NlcikKLXNlcnZlclNpZGVTZWFyY2hSYWRpb0J1dHRvbl90ZXh0PSBTZXJ2ZXIgc2lkZSBzZWFyY2ggKHJlcXVpcmVzIENvbnRhaW5lciBmb3Igc2VydmxldCkKLWdlbmVyYXRlV0FSRmlsZUxhYmVsX3RleHQ9R2VuZXJhdGUgV0FSIChXZWIgQVJjaGl2ZSkgZmlsZQotCi11c2VBcHBsZXRDaGVja2JveF90ZXh0PVN1cHBvcnQgdmlldyBjdXN0b21pemF0aW9uIChyZXF1aXJlcyBKYXZhIGFwcGxldCBzdXBwb3J0IGluIGJyb3dzZXIpCi0KLXNpdGVDdXN0b21pemF0aW9uV2l6YXJkUGFnZV90aXRsZT1DdXN0b21pemUgV2Vic2l0ZQotc2l0ZUN1c3RvbWl6YXRpb25XaXphcmRQYWdlX3RleHQ9Q3VzdG9taXplIFdlYnNpdGUgbG9vayBhbmQgZmVlbAotdGhlbWVBbmRTa2luR3JvdXBfdGV4dD1UaGVtZSBhbmQgU2tpbgotc2hvd0Jhbm5lckNoZWNrYm94X3RleHQ9U2hvdyBiYW5uZXIKLXNlbGVjdFNraW5MYWJlbF90ZXh0PVNlbGVjdCBza2luOgotCi0jIEZJWE1FISBTaG91bGQgdGhlc2UgYmUgd2FybmluZyBtZXNzYWdlcz8KLSMgSW5mb3JtYXRpb24gTWVzc2FnZQotaW52YWxpZFZpZXdzSW5mb19tc2c9VGhlIGZvbGxvd2luZyB2aWV3KHMpIGluIGNvbmZpZ3VyYXRpb24gJyd7MH0nJyB3aWxsIG5vdCBiZSBwdWJsaXNoZWQ6Ci1pbnZhbGlkVmlld0NvbnRyaWJ1dG9ySW5mb19tc2c9ezB9OiBUaGUgdmlldyBpcyBhIGNvbnRyaWJ1dG9yCi1pbnZhbGlkVmlld1NhbWVWaWV3SW5mb19tc2c9ezB9OiBUaGlzIHZpZXcgaXMgYSBkdXBsaWNhdGUgb2YgYW5vdGhlciB2aWV3Ci0KLWNhcGFiaWxpdHlQYXR0ZXJuc190ZXh0PUNhcGFiaWxpdHkgUGF0dGVybnMKLWRlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQ9RGVsaXZlcnkgUHJvY2Vzc2VzCi0KLSMgUHVibGlzaGluZyBQcmVmZXJlbmNlIFBhZ2UKLXByZWZlcmVuY2VQYWdlX2RlZmF1bHRQYXRoX3RleHQ9RGVmYXVsdCBwYXRoOgotCi0jIFJvbGUgRGlhZ3JhbSBQcmVmZXJlbmNlIFBhZ2UKLWVsZW1lbnRTcGFjaW5nR3JvdXBfdGV4dD1TcGFjaW5nIGJldHdlZW4gdGFzayBhbmQgd29yayBwcm9kdWN0IGVsZW1lbnRzCi10YXNrc0hvcml6b25hbFNwYWNpbmdMYWJlbF90ZXh0PUhvcml6b250YWwgc3BhY2luZzoKLXRhc2tzVmVydGljYWxTcGFjaW5nTGFiZWxfdGV4dD1WZXJ0aWNhbCBzcGFjaW5nOgotZWxlbWVudFRleHRMYWJlbEdyb3VwX3RleHQ9RWxlbWVudCBsYWJlbHMKLW1heExpbmVPZlRleHRMYWJlbF90ZXh0PU1heGltdW0gbGluZSBvZiB0ZXh0OgotCi0jIFJvbGUgRGlhZ3JhbSBQcmVmZXJlbmNlIFBhZ2UgRXJyb3IgTWVzc2FnZXMKLWludmFsaWRIb3Jpem9uYWxTcGFjaW5nRXJyb3JfbXNnPUhvcml6b250YWwgc3BhY2luZyBtdXN0IGJlIGFuIGludGVnZXIgd2l0aCB2YWx1ZSByYW5naW5nIGZyb20gezB9IHRvIHsxfS4KLWludmFsaWRWZXJ0aWNhbFNwYWNpbmdFcnJvcl9tc2c9VmVydGljYWwgc3BhY2luZyBtdXN0IGJlIGFuIGludGVnZXIgd2l0aCB2YWx1ZSByYW5naW5nIGZyb20gezB9IHRvIHsxfS4KLWludmFsaWRUZXh0TGluZXNFcnJvcl9tc2c9TnVtYmVyIG9mIHRleHQgbGluZXMgbXVzdCBiZSBhbiBpbnRlZ2VyIHdpdGggdmFsdWUgcmFuZ2luZyBmcm9tIHswfSB0byB7MX0uCi0KLSMgQ29uZmlybWF0aW9uIERpYWxvZ3MKLXB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU9UHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbgotY29uZmlybVBhdGhEaWFsb2dfdGV4dD1UaGUgZGVzdGluYXRpb24gcGF0aCBoYXMgYmVlbiByZXNvbHZlZCB0byAnJ3swfScnLiBEbyB5b3Ugd2FudCB0byBwcm9jZWVkPwotb3ZlcndyaXRlRGlhbG9nX3RleHQ9VGhlIGRlc3RpbmF0aW9uIHBhdGggJyd7MH0nJyBhbHJlYWR5IGV4aXN0cy4gQWxsIGZpbGVzIGluIHRoZSBmb2xkZXIgd2lsbCBiZSBkZWxldGVkLiBEbyB5b3Ugd2FudCB0byBwcm9jZWVkPwotY2FuY2VsUHVibGlzaENvbmZpZ19tc2c9VGhlIHB1Ymxpc2hpbmcgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZC4KLQotIyBFcnJvciBEaWFsb2dzCi1wcmV2aWV3Q29uZmlnRXJyb3JfdGl0bGU9UHJldmlldyBQdWJsaXNoZWQgTWV0aG9kIENvbmZpZ3VyYXRpb24KLXZpZXdSZXBvcnRFcnJvcl90aXRsZT1WaWV3IFB1Ymxpc2hpbmcgUmVwb3J0Ci0KLSMgRXJyb3IgTWVzc2FnZXMKLW1pc3NpbmdWaWV3RXJyb3JfbXNnPUlVUFAwMTAwRTogVGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIHZpZXcuIEVkaXQgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIGFkZCBhIHZpZXcsIG9yIHNlbGVjdCBhbm90aGVyIGNvbmZpZ3VyYXRpb24uCi1jYW5ub3RQdWJsaXNoRXJyb3JfbXNnPUlVUFAwMTAxRTogVGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIHB1Ymxpc2hlZC4KLWludmFsaWRQYXRoRXJyb3JfbXNnPUlVUFAwMTAyRTogVGhlIGRlc3RpbmF0aW9uIHBhdGggaXMgYmxhbmsgb3IgaW52YWxpZC4KLWludmFsaWRQYXRoQ2hhcnNFcnJvcl9tc2c9SVVQUDAxMDNFOiBUaGUgZGVzdGluYXRpb24gcGF0aCBjYW5ub3QgY29udGFpbiB0aGVzZSBjaGFyYWN0ZXJzOiBcXCAjICogPyAiIDwgPiB8ICEgJSAvCi1wdWJsaXNoQ29uZmlnRXJyb3JfbXNnPUlVUFAwMTA0RTogVGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gd2FzIG5vdCBwdWJsaXNoZWQgc3VjY2Vzc2Z1bGx5LgotcHJldmlld0NvbmZpZ0Vycm9yX21zZz1JVVBQMDEwNUU6IFVuYWJsZSB0byBvcGVuIGFuIEhUTUwgYnJvd3NlciB0byBwcmV2aWV3IHRoZSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLXZpZXdSZXBvcnRFcnJvcl9tc2c9SVVQUDAxMDZFOiBVbmFibGUgdG8gb3BlbiBhbiBIVE1MIGJyb3dzZXIgdG8gdmlldyB0aGUgcHVibGlzaGluZyByZXBvcnQuCi13ZWJBcHBOYW1lRXJyb3JfbXNnPUlVUFAwMTA3RTogVGhlIHdlYiBhcHBsaWNhdGlvbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLgotd2ViQXBwTmFtZUNoYXJzRXJyb3JfbXNnPUlVUFAwMTA4RTogVGhlIHdlYiBhcHBsaWNhdGlvbiBuYW1lIGNhbm5vdCBjb250YWluIHRoZXNlIGNoYXJhY3RlcnM6IFxcICMgKiA/ICIgPCA+IHwgISAlIC8KLWludmFsaWRBYm91dFBhdGhFcnJvcl9tc2c9SVVQUDAxMDlFOiBUaGUgcGF0aCBpcyBpbnZhbGlkLgotaW52YWxpZEFib3V0UGF0aENoYXJzRXJyb3JfbXNnPUlVUFAwMTEwRTogVGhlIHBhdGggY2Fubm90IGNvbnRhaW4gdGhlc2UgY2hhcmFjdGVyczogIyAqID8gIiA8ID4gfCAhICUgLwotCi0jIEVycm9yIFJlYXNvbnMgJiBSZWNvbW1lbmRlZCBBY3Rpb25zCi1wdWJsaXNoQ29uZmlnRXJyb3JfcmVhc29uPUNsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1kZWxldGVGaWxlc0Vycm9yX3JlYXNvbj1UaGUgZGVzdGluYXRpb24gcGF0aCAnJ3swfScnIGNvbnRhaW5zIGZpbGVzIHRoYXQgY2Fubm90IGJlIGRlbGV0ZWQuXG5cbkNsb3NlIHRoaXMgZGlhbG9nIGFuZCBzcGVjaWZ5IGFub3RoZXIgcGF0aC4KLWNyZWF0ZURpckVycm9yX3JlYXNvbj1UaGUgZGVzdGluYXRpb24gcGF0aCAnJ3swfScnIGNhbm5vdCBiZSBjcmVhdGVkLlxuXG5DbG9zZSB0aGlzIGRpYWxvZyBhbmQgc3BlY2lmeSBhbm90aGVyIHBhdGguCi1vcGVuQnJvd3NlckVycm9yX3JlYXNvbj1UaGUgZGVmYXVsdCBIVE1MIGJyb3dzZXIgb24gdGhpcyBzeXN0ZW0gY2Fubm90IGJlIGRldGVjdGVkIG9yIGxvY2F0ZWQuXG5cbkNsb3NlIHRoaXMgZGlhbG9nIGFuZCBvcGVuIHRoZSBmaWxlICcnezB9JycgbWFudWFsbHkgd2l0aCBhbiBIVE1MIGJyb3dzZXIuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2FjdGlvbnMvUHVibGlzaENvbmZpZ0FjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2FjdGlvbnMvUHVibGlzaENvbmZpZ0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWE5OTE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9hY3Rpb25zL1B1Ymxpc2hDb25maWdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkcy5QdWJsaXNoQ29uZmlnV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBJbnZva2VzIHRoZSBQdWJsaXNoIE1ldGhvZCBDb25maWd1cmF0aW9uIHdpemFyZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaENvbmZpZ0FjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KElXb3JrYmVuY2hXaW5kb3cpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihJQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQl0cnkgewotCQkJLy8gSW5zdGFudGlhdGUgYW5kIGluaXRpYWxpemUgdGhlIFB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYWl0b24KLQkJCS8vIHdpemFyZC4KLQkJCVB1Ymxpc2hDb25maWdXaXphcmQgd2l6YXJkID0gbmV3IFB1Ymxpc2hDb25maWdXaXphcmQoKTsKLQkJCXdpemFyZC5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIG51bGwpOwotCi0JCQkvLyBJbnN0YW50aWF0ZSB0aGUgd2l6YXJkIGNvbnRhaW5lciB3aXRoIHRoZSB3aXphcmQgYW5kIG9wZW4gaXQuCi0JCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgd2l6YXJkKTsKLQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkiRXJyb3IgcHVibGlzaGluZyBjb250ZW50IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiwgSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvYWN0aW9ucy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvYWN0aW9ucy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OGVlMDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2FjdGlvbnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgYWN0aW9ucyBmb3IgdGhlIHB1Ymxpc2hpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2ludGVybmFsL3dpemFyZHMvUHVibGlzaENvbmZpZ09wZXJhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2ludGVybmFsL3dpemFyZHMvUHVibGlzaENvbmZpZ09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjM3MzlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9pbnRlcm5hbC93aXphcmRzL1B1Ymxpc2hDb25maWdPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuUHVibGlzaGluZ1Jlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5BYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLkFic3RyYWN0Vmlld0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaEhUTUxPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0uUHJvZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFRoZSBwdWJsaXNoIGNvbmZpZ3VyYXRpb24gb3BlcmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoQ29uZmlnT3BlcmF0aW9uIGltcGxlbWVudHMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJR19FUlJPUl9USVRMRSA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DT05GSUdfRVJST1JfTVNHID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdFcnJvcl9tc2c7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJR19FUlJPUl9SRUFTT04gPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0Vycm9yX3JlYXNvbjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVZJRVdfQ09ORklHX0VSUk9SX1RJVExFID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnByZXZpZXdDb25maWdFcnJvcl90aXRsZTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVZJRVdfQ09ORklHX0VSUk9SX01TRyA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wcmV2aWV3Q29uZmlnRXJyb3JfbXNnOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19SRVBPUlRfRVJST1JfVElUTEUgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMudmlld1JlcG9ydEVycm9yX3RpdGxlOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19SRVBPUlRfRVJST1JfTVNHID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnZpZXdSZXBvcnRFcnJvcl9tc2c7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9CUk9XU0VSX0VSUk9SX1JFQVNPTiA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5vcGVuQnJvd3NlckVycm9yX3JlYXNvbjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ09ORklHX0NBTkNFTF9NU0cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY2FuY2VsUHVibGlzaENvbmZpZ19tc2c7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQWJzdHJhY3RQdWJsaXNoTWFuYWdlciBwdWJsaXNoTWdyOwotCi0JcHJpdmF0ZSBTdHJpbmcgcHVibGlzaGVkX3VybDsKLQotCXByaXZhdGUgU3RyaW5nIHJlcG9ydF91cmw7Ci0KLQlwcml2YXRlIE1zZ0RpYWxvZyBtc2dEaWFsb2c7Ci0KLQlwcml2YXRlIEV4Y2VwdGlvbiBydW5FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoQ29uZmlnT3BlcmF0aW9uKEFic3RyYWN0UHVibGlzaE1hbmFnZXIgcHVibGlzaE1ncikgewotCQlzdXBlcigpOwotCQl0aGlzLnB1Ymxpc2hNZ3IgPSBwdWJsaXNoTWdyOwotCQl0aGlzLm1zZ0RpYWxvZyA9IFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB2aWV3IGJ1aWxkZXIuCi0JICogCi0JICogQHJldHVybiBBYnN0cmFjdFZpZXdCdWlsZGVyCi0JICovCi0JcHVibGljIEFic3RyYWN0Vmlld0J1aWxkZXIgZ2V0Vmlld0J1aWxkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnB1Ymxpc2hNZ3IuZ2V0Vmlld0J1aWxkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHVybCBmb3IgdGhlIHB1Ymxpc2hlZCBzaXRlCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hlZFVybCgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hlZF91cmw7Ci0JfQotCi0JLyoqCi0JICogcnVuIHRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSB0aGUgcHVibGlzaGluZyB0YXNrLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJ1bkV4Y2VwdGlvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb25pdG9yCi0JCQkJCS5zZXRUYXNrTmFtZShQdWJsaXNoaW5nUmVzb3VyY2VzLnB1Ymxpc2hpbmdDb25maWd1cmF0aW9uVGFza19uYW1lKTsgLy8kTk9OLU5MUy0xJAkJCQotCQkJcHVibGlzaE1nci5wdWJsaXNoKG1vbml0b3IpOwotCi0JCQlwdWJsaXNoZWRfdXJsID0gcHVibGlzaE1nci5nZXRQdWJsaXNoZWRVcmwoKTsKLQkJCXJlcG9ydF91cmwgPSBwdWJsaXNoTWdyLmdldFB1Ymxpc2hSZXBvcnRVcmwoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJ1bkV4Y2VwdGlvbiA9IGU7Ci0JCX0KLQotCQlmaW5hbCBib29sZWFuIGNhbmNlbGVkID0gbW9uaXRvci5pc0NhbmNlbGVkKCk7Ci0KLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmIChjYW5jZWxlZCkgewotCQkJCQltc2dEaWFsb2cuZGlzcGxheUluZm8oUFVCTElTSF9DT05GSUdfRVJST1JfVElUTEUsCi0JCQkJCQkJUFVCTElTSF9DT05GSUdfQ0FOQ0VMX01TRyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlpZiAocHVibGlzaGVkX3VybCA9PSBudWxsIHx8IHJlcG9ydF91cmwgPT0gbnVsbCkgewotCQkJCQltc2dEaWFsb2cuZGlzcGxheUVycm9yKFBVQkxJU0hfQ09ORklHX0VSUk9SX1RJVExFLAotCQkJCQkJCVBVQkxJU0hfQ09ORklHX0VSUk9SX01TRywKLQkJCQkJCQlQVUJMSVNIX0NPTkZJR19FUlJPUl9SRUFTT04sIHJ1bkV4Y2VwdGlvbik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlQdWJsaXNoT3B0aW9ucyBvcHRpb25zID0gcHVibGlzaE1nci5nZXRWaWV3QnVpbGRlcigpCi0JCQkJCQkuZ2V0T3B0aW9ucygpOwotCQkJCWlmIChvcHRpb25zIGluc3RhbmNlb2YgUHVibGlzaEhUTUxPcHRpb25zKSB7Ci0JCQkJCWlmICghKChQdWJsaXNoSFRNTE9wdGlvbnMpIG9wdGlvbnMpCi0JCQkJCQkJLmlzUHVibGlzaER5bmFtaWNXZWJBcHAoKSkgewotCQkJCQkJLy8gTGF1bmNoIGEgSFRNTCBicm93c2VyIHRvIHZpZXcgdGhlIHB1Ymxpc2hlZCBzaXRlLgotCQkJCQkJaWYgKG9wZW5Ccm93c2VyKHB1Ymxpc2hlZF91cmwpID09IGZhbHNlKSB7Ci0JCQkJCQkJU3RyaW5nIHJlYXNvbiA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCQkJT1BFTl9CUk9XU0VSX0VSUk9SX1JFQVNPTiwKLQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IHB1Ymxpc2hlZF91cmwgfSk7Ci0JCQkJCQkJbXNnRGlhbG9nLmRpc3BsYXlFcnJvcihQUkVWSUVXX0NPTkZJR19FUlJPUl9USVRMRSwKLQkJCQkJCQkJCVBSRVZJRVdfQ09ORklHX0VSUk9SX01TRywgcmVhc29uKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIExhdW5jaCBhIEhUTUwgYnJvd3NlciB0byB2aWV3IHRoZSByZXBvcnQgb24gdGhlIHB1Ymxpc2hlZAotCQkJCS8vIHNpdGUuCi0JCQkJaWYgKG9wZW5Ccm93c2VyKHJlcG9ydF91cmwpID09IGZhbHNlKSB7Ci0JCQkJCVN0cmluZyByZWFzb24gPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQlPUEVOX0JST1dTRVJfRVJST1JfUkVBU09OLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IHJlcG9ydF91cmwgfSk7Ci0JCQkJCW1zZ0RpYWxvZy5kaXNwbGF5RXJyb3IoVklFV19SRVBPUlRfRVJST1JfVElUTEUsCi0JCQkJCQkJVklFV19SRVBPUlRfRVJST1JfTVNHLCByZWFzb24pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogb3BlbiBhIGJyb3dzZXIgdG8gc2hvdyB0aGUgcHVibGlzaGVkIGNvbnRlbnQuCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgU3RyaW5nIHRoZSBzaXRlIHVybAotCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIGJyb3dzZXIgb3BlbmVkIHN1Y2Nlc3NmdWxseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBvcGVuQnJvd3NlcihmaW5hbCBTdHJpbmcgdXJsKSB7Ci0JCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCQl0cnkgewotCQkJLy8gTGF1bmNoIHRoZSBkZWZhdWx0IEhUTUwgdmlld2VyIHRvIGRpc3BsYXkgdGhlIEhUTUwgcGFnZS4KLQkJCS8vIE9uIExpbnV4LCB0aGlzIGNhbid0IGxhdW5jaCB1cmxzLCBvbmx5IGxvY2FsIGZpbGVzIGNhbiBiZQotCQkJLy8gbGF1bmNoZWQuCi0JCQkvLyBTb3JyeSBJIGhhdmUgdXNlIGludGVybmFsIGNsYXNzIGhlcmUuCi0JCQkvLyBob3BlIEVjbGlwc2Uub3JnIGNhbiBoYXZlIGEgcHVibGljIGFwaSB0byBkbyBzby4KLQkJCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIndpbjMyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXN1Y2Nlc3MgPSBQcm9ncmFtLmxhdW5jaCh1cmwpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBJQnJvd3NlciBicm93c2VyID0KLQkJCQkvLyBvcmcuZWNsaXBzZS5oZWxwLmludGVybmFsLmJyb3dzZXIuQnJvd3Nlck1hbmFnZXIKLQkJCQkvLyAuZ2V0SW5zdGFuY2UoKS5jcmVhdGVCcm93c2VyKHRydWUpOwotCQkJCS8vIGlmIChicm93c2VyID09IG51bGwpIHsKLQkJCQkvLyB0cnkgewotCQkJCS8vIGJyb3dzZXIuZGlzcGxheVVSTCh1cmwpOwotCQkJCS8vIHN1Y2Nlc3MgPSB0cnVlOwotCQkJCS8vIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCi0JCQkJLy8gMTU1NDkwIC0gQ2Fubm90IGRldGVjdGVkIGRlZmF1bHQgYnJvd3NlciB3aGVuIHByZXZpZXcKLQkJCQkvLyBwdWJsaXNoZWQgY29uZmlndXJhdGlvbiBvbiBMaW51eAotCQkJCS8vIGNoYW5nZWQgdG8gdXNlIHN3dCBicm93c2VyCi0JCQkJc3VjY2VzcyA9IHRydWU7Ci0JCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJLy8gLy8gb3BlbiBhbm90aGVyIHN3dCBicm93c2VyIHNpbmNlIHdlIGhhdmUgbm8gKHNpbXBsZSkKLQkJCQkJCS8vIHdheSBvZiBjcmVhdGluZyBhIHN5c3RlbSBkZWZhdWx0IGJyb3dzZXIKLQkJCQkJCS8vIC8vIHRoZSBFY2xpcHNlIGd1eXMgaGlkZSBhbGwgdGhlIGdvb2QgYXBpcyBhcwotCQkJCQkJLy8gaW50ZXJuYWwKLQkJCQkJCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKCk7Ci0JCQkJCQlzaGVsbC5zZXRUZXh0KHVybCk7Ci0JCQkJCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQkJCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQkJCQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCQkJCUJyb3dzZXIgcG9wdXBfYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQkJCQlwb3B1cF9icm93c2VyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKAotCQkJCQkJCQlHcmlkRGF0YS5GSUxMX0JPVEggfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLQkJCQkJCQkJCQl8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpKTsKLQkJCQkJCXBvcHVwX2Jyb3dzZXIuc2V0VXJsKHVybCk7Ci0JCQkJCQlzaGVsbC5vcGVuKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlzdWNjZXNzID0gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gc3VjY2VzczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjczOGZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIG1hbmFnaW5nIHRoZSBwdWJsaXNoaW5nIFVJLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9BY3Rpdml0eURpYWdyYW1QcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL0FjdGl2aXR5RGlhZ3JhbVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNGU0ZTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL0FjdGl2aXR5RGlhZ3JhbVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLnByZWZlcmVuY2VzLkJhc2VQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotCi0vKioKLSAqIFByZWZlcmVuY2UgcGFnZSBmb3IgZGlhZ3JhbSBvcHRpb25zCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGlhZ3JhbVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQmFzZVByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlLCBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0KLQlDb21wb3NpdGUgY29tcG9zaXRlOwotCi0JaW50IE5VTV9DT0xVTU4gPSAzOwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkOwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9wdWJsaXNoX2FkX2Zvcl9hY3Rpdml0eV9leHRlbnNpb247Ci0JCi0JcHVibGljIEFjdGl2aXR5RGlhZ3JhbVByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLQkJLy8gQ3JlYXRlIGFjdGl2aXR5IGRpYWdyYW0gZ3JvdXAuCi0JCUdyb3VwIGFjdGl2aXR5RGlhZ3JhbUdyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5wcmVmZXJlbmNlX0FjdGl2aXR5X0RpYWdyYW0sIDEpOwotCi0JCWN0cmxfcHVibGlzaF9hZF9mb3JfYWN0aXZpdHlfZXh0ZW5zaW9uID0gY3JlYXRlQ2hlY2tib3goCi0JCQkJYWN0aXZpdHlEaWFncmFtR3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtKTsKLQotCQkvLyBDcmVhdGUgYWN0aXZpdHkgZGV0YXRpbCBkaWFncmFtIGdyb3VwLgotCQlHcm91cCBhY3Rpdml0eURldGFpbERpYWdyYW1Hcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJlZmVyZW5jZV9BY3Rpdml0eV9EZXRhaWxfRGlhZ3JhbSwgMSk7Ci0KLQkJY3RybF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkID0gY3JlYXRlQ2hlY2tib3goCi0JCQkJYWN0aXZpdHlEZXRhaWxEaWFncmFtR3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvbXB0Zm9yX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGRfdGV4dCk7Ci0JCQotLy8JCWN0cmxfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZCA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotLy8JCWN0cmxfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZAotLy8JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvbXB0Zm9yX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGRfdGV4dCk7IAotLy8KLS8vCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0vLwkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0vLwkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLS8vCQljdHJsX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLS8vCQkKLS8vCQljdHJsX3B1Ymxpc2hfYWRfZm9yX2FjdGl2aXR5X2V4dGVuc2lvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotLy8JCWN0cmxfcHVibGlzaF9hZF9mb3JfYWN0aXZpdHlfZXh0ZW5zaW9uCi0vLwkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5wcm9tcHRfZm9yX3B1Ymxpc2hfZXh0ZW5kX2FjdGl2aXR5X2RpYWdyYW0pOyAKLS8vCQkJCQotCQkKLQkJaW5pdGlhbGl6ZVZhbHVlcygpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCi0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFByZWZlcmVuY2VQYWdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJc3RvcmVWYWx1ZXMoKTsKLQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQkvLyB1cGRhdGUgdGhlIHNldHRpbmdzIGZvciBicm93c2luZwotCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnVwZGF0ZUxheW91dFNldHRpbmdzKCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQkvLyBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCS8vIHN0b3JlLnNldFZhbHVlKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUFJPTVBUX0ZPUl9MSUJSQVJZX0FUX1NUQVJUVVAsCi0JCS8vIGN0cmxfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZC5nZXRTZWxlY3Rpb24oKSk7Ci0JCUxpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLnNldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkKGN0cmxfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZAotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oY3RybF9wdWJsaXNoX2FkX2Zvcl9hY3Rpdml0eV9leHRlbnNpb24KLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0cygpIHsKLQkJLy8gSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQljdHJsX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGQuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJY3RybF9wdWJsaXNoX2FkX2Zvcl9hY3Rpdml0eV9leHRlbnNpb24uc2V0U2VsZWN0aW9uKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJLy8gSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkvLyBjdHJsX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGQuc2V0U2VsZWN0aW9uKHN0b3JlLmdldEJvb2xlYW4oTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9QUk9NUFRfRk9SX0xJQlJBUllfQVRfU1RBUlRVUCkpOwotCQljdHJsX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGQuc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLmdldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkKCkpOwotCQljdHJsX3B1Ymxpc2hfYWRfZm9yX2FjdGl2aXR5X2V4dGVuc2lvbgotCQkJCS5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJCS5nZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQ29tbW9uUHJlZlBhZ2UjZG9HZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9EZWxldGVDb25maWdDb21tYW5kTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9EZWxldGVDb25maWdDb21tYW5kTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk2Zjk2ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvRGVsZXRlQ29uZmlnQ29tbWFuZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogQ29tbWFuZCBsaXN0ZW5lciBmb3IgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQKLSAqIENsZWFuIGFsbCBjb25maWd1cmF0aW9uIHNwZWNpZmljIHB1Ymxpc2hpbmcgcHJlZmVyZW5jZXMgd2hlbiB0aGUgY29uZmlndXJhdGlvbiBpcyBkZWxldGVkCi0gKiBAYXV0aG9yIFhpYW5nIERvbmcgSHUKLSAqIEBzaW5jZSAxLjIKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODE0ODcKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZUNvbmZpZ0NvbW1hbmRMaXN0ZW5lciBpbXBsZW1lbnRzCi0JCUlEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZExpc3RlbmVyIHsKLQotCXB1YmxpYyB2b2lkIGNvbGxlY3RPYmplY3RzVG9EZWxldGVDb250ZW50KENvbGxlY3Rpb24gY29sbGVjdGVkT2JqZWN0cywKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29sbGVjdE9iamVjdHNUb1JlbW92ZShDb2xsZWN0aW9uIG9iamVjdHNUb1JlbW92ZSwKLQkJCUVPYmplY3QgZWxlbWVudFRvRGVsZXRlLCBFT2JqZWN0IHJlZmVyZW5jZXIsIENvbGxlY3Rpb24gcmVmZXJlbmNlcykgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIENsYXNzIGdldENvbW1hbmRUeXBlKCkgewotCQlyZXR1cm4gRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQuY2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5RXhlY3V0ZWQoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gKChEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCljb21tYW5kKS5nZXRSZXN1bHQoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHJlc3VsdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KXsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXQubmV4dCgpOwotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pewotCQkJCVN0cmluZyBjb25maWdJZCA9ICgoTWV0aG9kQ29uZmlndXJhdGlvbillbGVtZW50KS5nZXRHdWlkKCk7Ci0JCQkJcmVtb3ZlUHVibGlzaFByZWZlcmVuY2VzKGNvbmZpZ0lkKTsKLQkJCX0KLQkJfQotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zYXZlQWxsUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmVFeGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgcHJlVW5kbyhDb21tYW5kIGNvbW1hbmQpIHsKLQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVQdWJsaXNoUHJlZmVyZW5jZXMoU3RyaW5nIGNvbmZpZ0lkKXsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMucmVtb3ZlQWJvdXRIVE1MKGNvbmZpZ0lkKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMucmVtb3ZlQmFubmVySW1hZ2UoY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVDaGVja0V4dGVybmFsTGlua3MoY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVDb252ZXJ0QnJva2VuTGlua3MoY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVFeHRyYURlc2NyaXB0b3JJbmZvKGNvbmZpZ0lkKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMucmVtb3ZlRmVlZGJhY2tVUkwoY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVJbmNsdWRlR2xvc3NhcnkoY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVJbmNsdWRlSW5kZXgoY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVJbmNsdWRlU2VhcmNoKGNvbmZpZ0lkKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMucmVtb3ZlSW5jbHVkZVNlcnZsZXRTZWFyY2goY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVMaWdodFdlaWdodFRyZWUoY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVQdWJsaXNoRW50aXJlQ29uZmlnKGNvbmZpZ0lkKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMucmVtb3ZlUHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVQdWJsaXNoUGF0aChjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZVB1Ymxpc2hTdGF0aWNXZWJTaXRlKGNvbmZpZ0lkKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMucmVtb3ZlUHVibGlzaFVub3BlbkFjdGl2aXR5REQoY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVUaXRsZShjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZVdlYkFwcE5hbWUoY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVTaG93UmVsYXRlZERlc2NyaXB0b3JzKGNvbmZpZ0lkKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMucmVtb3ZlU2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZShjb25maWdJZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcG9zdFVuZG8oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9QdWJsaXNoaW5nUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9QdWJsaXNoaW5nUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE1OWNlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvUHVibGlzaGluZ1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLnByZWZlcmVuY2VzLkJhc2VQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFRoZSBQdWJsaXNoaW5nIHByZWZlcmVuY2UgcGFnZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqIEJ1Z3MgZml4ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+aHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1Njk1NzwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaGluZ1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQmFzZVByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByaXZhdGUgVGV4dCBkZXN0aW5hdGlvblBhdGhUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IGZlZWRiYWNrVVJMVGV4dDsKLQotCXByaXZhdGUgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGV4dHJhRGVzY3JpcHRvckluZm9DaGVja2JveDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIFNXVCBjb250cm9sIGZvciB0aGUgY3VzdG9taXplZCBib2R5IG9mIHRoaXMKLQkgKiBwcmVmZXJlbmNlIHBhZ2UgdW5kZXIgdGhlIGdpdmVuIHBhcmVudCBjb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBuZXcgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIDEpOwotCi0JCS8vIENyZWF0ZSB0aGUgRGVzdGluYXRpb24gcGF0aCBncm91cC4KLQkJLyoKLQkJICogR3JvdXAgZGVzdGluYXRpb25Hcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCSAqIFB1Ymxpc2hpbmdVSVJlc291cmNlcy5kZXN0aW5hdGlvbkRpcmVjdG9yeUdyb3VwX3RleHQsIDMpOwotCQkgKi8KLQotCQkvLyBDcmVhdGUgdGhlIFB1Ymxpc2hlZCBXZWJzaXRlIGdyb3VwLgotCQlHcm91cCB3ZWJTaXRlR3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoV2ViU2l0ZUdyb3VwX3RleHQsIDMpOwotCQljcmVhdGVMYWJlbCh3ZWJTaXRlR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnByZWZlcmVuY2VQYWdlX2RlZmF1bHRQYXRoX3RleHQpOwotCQlkZXN0aW5hdGlvblBhdGhUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KHdlYlNpdGVHcm91cCk7Ci0JCWJyb3dzZUJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbih3ZWJTaXRlR3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkJST1dTRV9CVVRUT05fVEVYVCk7Ci0JCWNyZWF0ZUxhYmVsKHdlYlNpdGVHcm91cCwgUHVibGlzaGluZ1VJUmVzb3VyY2VzLmZlZWRiYWNrVVJMTGFiZWxfdGV4dCk7Ci0JCWZlZWRiYWNrVVJMVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dCh3ZWJTaXRlR3JvdXAsIDIpOwotCi0JCS8vIENyZWF0ZSB0aGUgQnJvd3NpbmcgZ3JvdXAuCi0JCUdyb3VwIGJyb3dzaW5nR3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLCBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYnJvd3NpbmdMYXlvdXRHcm91cF90ZXh0LCAxKTsKLQkJZXh0cmFEZXNjcmlwdG9ySW5mb0NoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3goYnJvd3NpbmdHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaEV4dHJhRGVzY3JpcHRvckluZm9MYWJlbF90ZXh0LCAxKTsKLQotCQlpbml0Q29udHJvbHMoKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMgd2l0aCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250cm9scygpIHsKLQkJZGVzdGluYXRpb25QYXRoVGV4dC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmdldFB1Ymxpc2hQYXRoKCkpOwotCQlmZWVkYmFja1VSTFRleHQuc2V0VGV4dChQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXRGZWVkYmFja1VSTCgpKTsKLQkJZXh0cmFEZXNjcmlwdG9ySW5mb0NoZWNrYm94LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRFeHRyYURlc2NyaXB0b3JJbmZvKCkpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgZXZlbnQgbGlzdGVuZXJzIHRvIHRoZSBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlkZXN0aW5hdGlvblBhdGhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmICghaXNQYXRoVmFsaWQoZGVzdGluYXRpb25QYXRoVGV4dC5nZXRUZXh0KCkpKSB7Ci0JCQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzZXRWYWxpZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlvcGVuRGlyZWN0b3J5RGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtRGVmYXVsdHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCWluaXRpYWxpemVEZWZhdWx0cygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJc3RvcmVWYWx1ZXMoKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2F2ZUFsbFByZWZlcmVuY2VzKCk7Ci0JCQotCQkvLyB1cGRhdGUgdGhlIHNldHRpbmdzIGZvciBicm93c2luZwotCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnVwZGF0ZUxheW91dFNldHRpbmdzKCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRQdWJsaXNoUGF0aChkZXN0aW5hdGlvblBhdGhUZXh0LmdldFRleHQoKQotCQkJCS50cmltKCkpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5zZXRGZWVkYmFja1VSTChmZWVkYmFja1VSTFRleHQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLnNldEV4dHJhRGVzY3JpcHRvckluZm8oZXh0cmFEZXNjcmlwdG9ySW5mb0NoZWNrYm94Ci0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCi0vLwkJLy8gRklYTUUhIFJldmlldyBpbXBsZW1lbnRhdGlvbi4KLS8vCQkvLyBhbGxvdyB0byBwYXNzIHRoZSB2YWx1ZSB0byB0aGUgbGlicmFyeSBicm93c2luZwotLy8JCS8vIFN5c3RlbS5zZXRQcm9wZXJ0eShFWFRSQV9ERVNDUklQVE9SX0lORk8sCi0vLwkJLy8gZXh0cmFEZXNjcmlwdG9ySW5mb0N0ci5nZXRTZWxlY3Rpb24oKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotLy8JCURlZmF1bHRDb250ZW50VmFsaWRhdG9yCi0vLwkJCQkuc2V0RGVmYXVsdFNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycyhleHRyYURlc2NyaXB0b3JJbmZvQ2hlY2tib3gKLS8vCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkgewotCQlkZXN0aW5hdGlvblBhdGhUZXh0LnNldFRleHQoUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGVmYXVsdFB1Ymxpc2hQYXRoKCkpOwotCQlmZWVkYmFja1VSTFRleHQKLQkJCQkuc2V0VGV4dChQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXREZWZhdWx0RmVlZGJhY2tVUkwoKSk7Ci0JCWV4dHJhRGVzY3JpcHRvckluZm9DaGVja2JveC5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGVmYXVsdEV4dHJhRGVzY3JpcHRvckluZm8oKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2RvR2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSB1c2VyIHNwZWNpZmllZCBkZXN0aW5hdGlvbiBwYXRoLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1BhdGhWYWxpZChTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgubGVuZ3RoKCkgPD0gMCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkUGF0aEVycm9yX21zZyk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUlQYXRoIGVjUGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKHBhdGgpOwotCQlib29sZWFuIGlzVmFsaWQgPSBlY1BhdGguaXNWYWxpZFBhdGgocGF0aCk7Ci0JCWlmICghaXNWYWxpZCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkUGF0aEVycm9yX21zZyk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICghU3RyVXRpbC5pc1ZhbGlkUHVibGlzaFBhdGgocGF0aCkpIHsKLQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW52YWxpZFBhdGhDaGFyc0Vycm9yX21zZyk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgdGhlIGRpcmVjdG9yeSBkaWFsb2cuCi0JICovCi0JcHJpdmF0ZSB2b2lkIG9wZW5EaXJlY3RvcnlEaWFsb2coKSB7Ci0JCXRyeSB7Ci0JCQlEaXJlY3RvcnlEaWFsb2cgZGQgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGNvbXBvc2l0ZS5nZXRTaGVsbCgpLAotCQkJCQlTV1QuTk9ORSk7Ci0JCQlTdHJpbmcgZGVzdGluYXRpb24gPSBkZC5vcGVuKCk7Ci0JCQlpZiAoZGVzdGluYXRpb24gIT0gbnVsbCkgewotCQkJCWRlc3RpbmF0aW9uUGF0aFRleHQuc2V0VGV4dChkZXN0aW5hdGlvbik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9QdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjY1Mzc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9QdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkFjdGl2aXR5TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgUHVibGlzaGluZyBVSSBwcmVmZXJlbmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfRU5USVJFX0NPTkZJRyA9ICJwdWJsaXNoRW50aXJlQ29uZmlnIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gInRpdGxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBTk5FUl9JTUFHRSA9ICJiYW5uZXJJbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQk9VVF9IVE1MID0gImFib3V0SFRNTCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUVEQkFDS19VUkwgPSAiZmVlZGJhY2tVUkwiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfR0xPU1NBUlkgPSAiaW5jbHVkZUdsb3NzYXJ5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfSU5ERVggPSAiaW5jbHVkZUluZGV4IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLX0VYVEVSTkFMX0xJTktTID0gImNoZWNrRXh0ZXJuYWxMaW5rcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJUX0JST0tFTl9MSU5LUyA9ICJjb252ZXJ0QnJva2VuTGlua3MiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElHSFRfV0VJR0hUX1RSRUUgPSAibGlnaHRXZWlnaHRUcmVlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0RFU0NSSVBUT1JfSU5GTyA9ICJleHRyYURlc2NyaXB0b3JJbmZvIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfVU5PUEVOX0FDVElWSVRZX0REID0gInB1Ymxpc2hVbm9wZW5BY3Rpdml0eUREIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTiA9ICJwdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX1BBVEggPSAicHVibGlzaFBhdGgiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9TVEFUSUNfV0VCX1NJVEUgPSAicHVibGlzaFN0YXRpY1dlYlNpdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9TRVJWTEVUX1NFQVJDSCA9ICJpbmNsdWRlU2VydmxldFNlYXJjaCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJBUFBfTkFNRSA9ICJ3ZWJBcHBOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfU0VBUkNIID0gImluY2x1ZGVTZWFyY2giOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVElBTElaRUQgPSAiaW5pdGlhbGl6ZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV19SRUxBVEVEX0RFU0NSSVBUT1JTID0gInNob3dSZWxhdGVkRGVzY3JpcHRvcnMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV19ERVNDUklQVE9SU19JTl9OQVZJR0FUSU9OVFJFRSA9ICJzaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQUNUSVZJVFlfVEFCID0gImRlZmF1bHRBY3Rpdml0eVRhYiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BVQkxJU0hfRk9MREVSX05BTUUgPSAiUHVibGlzaCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0VGl0bGUgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRCYW5uZXJJbWFnZSA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdEFib3V0SFRNTCA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdEZlZWRiYWNrVVJMID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0UHVibGlzaFBhdGggPSBudWxsOwotCi0JLy8gVGhlIHBsdWctaW4gc3BlY2lmaWMgcHJlZmVyZW5jZSBzdG9yZS4KLQlwcml2YXRlIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCXN0YXRpYyB7Ci0JCS8vIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFBVQkxJU0hfRU5USVJFX0NPTkZJRywgdHJ1ZSk7Ci0KLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoVElUTEUsIGdldERlZmF1bHRUaXRsZSgpKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoQkFOTkVSX0lNQUdFLCBnZXREZWZhdWx0QmFubmVySW1hZ2UoKSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KEFCT1VUX0hUTUwsIGdldERlZmF1bHRBYm91dEhUTUwoKSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KEZFRURCQUNLX1VSTCwgZ2V0RGVmYXVsdEZlZWRiYWNrVVJMKCkpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChJTkNMVURFX0dMT1NTQVJZLCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KElOQ0xVREVfSU5ERVgsIGZhbHNlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoQ0hFQ0tfRVhURVJOQUxfTElOS1MsIGZhbHNlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoQ09OVkVSVF9CUk9LRU5fTElOS1MsIGZhbHNlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoUFVCTElTSF9VTk9QRU5fQUNUSVZJVFlfREQsIGZhbHNlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoUFVCTElTSF9BRF9GT1JfQUNUSVZJVFlfRVhURU5TSU9OLCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KExJR0hUX1dFSUdIVF9UUkVFLCB0cnVlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoRVhUUkFfREVTQ1JJUFRPUl9JTkZPLAotCQkJCWdldERlZmF1bHRFeHRyYURlc2NyaXB0b3JJbmZvKCkpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChERUZBVUxUX0FDVElWSVRZX1RBQiwKLQkJCQlBY3Rpdml0eUxheW91dC5UQUJfTkFNRV9BQ1RJVklUWV9XQlMpOwotCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFBVQkxJU0hfUEFUSCwgZ2V0RGVmYXVsdFB1Ymxpc2hQYXRoKCkpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChQVUJMSVNIX1NUQVRJQ19XRUJfU0lURSwgdHJ1ZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KElOQ0xVREVfU0VSVkxFVF9TRUFSQ0gsIHRydWUpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChXRUJBUFBfTkFNRSwgIiIpOyAvLyROT04tTkxTLTEkCQkJCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KElOQ0xVREVfU0VBUkNILCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIGVudGlyZSBjb25maWd1cmF0aW9uIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRQdWJsaXNoRW50aXJlQ29uZmlnKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgUFVCTElTSF9FTlRJUkVfQ09ORklHKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihQVUJMSVNIX0VOVElSRV9DT05GSUcpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBlbnRpcmUgY29uZmlndXJhdGlvbnByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFB1Ymxpc2hFbnRpcmVDb25maWcoU3RyaW5nIGNvbmZpZ0lkLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgUFVCTElTSF9FTlRJUkVfQ09ORklHLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBlbnRpcmUgY29uZmlndXJhdGlvbiBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUKLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVQdWJsaXNoRW50aXJlQ29uZmlnKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBQVUJMSVNIX0VOVElSRV9DT05GSUcpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgdGl0bGUgZm9yIGEgcHVibGlzaGVkIHdlYnNpdGUuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCB0aXRsZSBmb3IgYSBwdWJsaXNoZWQgd2Vic2l0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRUaXRsZSgpIHsKLQkJaWYgKGRlZmF1bHRUaXRsZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgdXJsID0gUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmcoInRpdGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICh1cmwgPT0gbnVsbCB8fCB1cmwubGVuZ3RoKCkgPT0gMCB8fCB1cmwuc3RhcnRzV2l0aCgiWyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl1cmwgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZGVmYXVsdFRpdGxlID0gdXJsOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0VGl0bGU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgd2ViIHNpdGUgdGl0bGUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gdGhlIHdlYiBzaXRlIHRpdGxlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGl0bGUoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIFRJVExFKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKFRJVExFKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHdlYiBzaXRlIHRpdGxlIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSB3ZWIgc2l0ZSB0aXRsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgY29uZmlnSWQsIFN0cmluZyB0aXRsZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBUSVRMRSwgdGl0bGUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHdlYiBzaXRlIHRpdGxlIHByZWZlcmVuY2UgdG8gYmUgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVUaXRsZShTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIFRJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IGJhbm5lciBpbWFnZSBmb3IgYSBwdWJsaXNoZWQgd2Vic2l0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGJhbm5lciBpbWFnZSBmb3IgYSBwdWJsaXNoZWQgd2Vic2l0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRCYW5uZXJJbWFnZSgpIHsKLQkJaWYgKGRlZmF1bHRCYW5uZXJJbWFnZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgaW1hZ2UgPSBQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZygKLQkJCQkJImJhbm5lckltYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbWFnZSA9PSBudWxsIHx8IGltYWdlLmxlbmd0aCgpID09IDAgfHwgaW1hZ2Uuc3RhcnRzV2l0aCgiWyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlkZWZhdWx0QmFubmVySW1hZ2UgPSBpbWFnZTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEJhbm5lckltYWdlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGJhbm5lciBpbWFnZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiB0aGUgYmFubmVyIGltYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QmFubmVySW1hZ2UoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIEJBTk5FUl9JTUFHRSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhCQU5ORVJfSU1BR0UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYmFubmVyIGltYWdlIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiAgICAgICAgICAgIHRoZSBiYW5uZXIgaW1hZ2UgVVJMCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEJhbm5lckltYWdlKFN0cmluZyBjb25maWdJZCwgU3RyaW5nIGltYWdlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIEJBTk5FUl9JTUFHRSwgaW1hZ2UpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhbm5lciBpbWFnZSBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQmFubmVySW1hZ2UoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBCQU5ORVJfSU1BR0UpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgYWJvdXQgSFRNTCBmb3IgYSBwdWJsaXNoZWQgd2Vic2l0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGFib3V0IEhUTUwgZm9yIGEgcHVibGlzaGVkIHdlYnNpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0QWJvdXRIVE1MKCkgewotCQlpZiAoZGVmYXVsdEFib3V0SFRNTCA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgZmlsZSA9IFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldFN0cmluZygiYWJvdXRIVE1MIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChmaWxlID09IG51bGwgfHwgZmlsZS5sZW5ndGgoKSA9PSAwIHx8IGZpbGUuc3RhcnRzV2l0aCgiWyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlmaWxlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWRlZmF1bHRBYm91dEhUTUwgPSBmaWxlOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0QWJvdXRIVE1MOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFib3V0IEhUTUwgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gdGhlIGFib3V0IEhUTUwgZmlsZSBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWJvdXRIVE1MKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBBQk9VVF9IVE1MKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKEFCT1VUX0hUTUwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYWJvdXQgSFRNTCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBhYm91dCBIVE1MIGZpbGUgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBYm91dEhUTUwoU3RyaW5nIGNvbmZpZ0lkLCBTdHJpbmcgcGF0aCkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBBQk9VVF9IVE1MLCBwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhYm91dCBIVE1MIHByZWZlcmVuY2UgdG8gYmUgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBYm91dEhUTUwoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBBQk9VVF9IVE1MKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IGZlZWRiYWNrIFVSTCBmb3IgYSBwdWJsaXNoZWQgd2Vic2l0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGZlZWRiYWNrIFVSTCBmb3IgYSBwdWJsaXNoZWQgd2Vic2l0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRGZWVkYmFja1VSTCgpIHsKLQkJaWYgKGRlZmF1bHRGZWVkYmFja1VSTCA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0RmVlZGJhY2tVUkwgPSAiaHR0cDovL3d3dy5wdWJsaXNoZWRfd2Vic2l0ZS5jb20vZmVlZGJhY2siOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGRlZmF1bHRGZWVkYmFja1VSTDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBmZWVkYmFjayBVUkwgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmZWVkYmFjayBVUkwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGZWVkYmFja1VSTCgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoRkVFREJBQ0tfVVJMKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmZWVkYmFjayBVUkwgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICB0aGUgZmVlZGJhY2sgVVJMCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEZlZWRiYWNrVVJMKFN0cmluZyB1cmwpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKEZFRURCQUNLX1VSTCwgdXJsKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBmZWVkYmFjayBVUkwgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gdGhlIGZlZWRiYWNrIFVSTAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZlZWRiYWNrVVJMKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBGRUVEQkFDS19VUkwpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoRkVFREJBQ0tfVVJMKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZlZWRiYWNrIFVSTCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgdGhlIGZlZWRiYWNrIFVSTAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGZWVkYmFja1VSTChTdHJpbmcgY29uZmlnSWQsIFN0cmluZyB1cmwpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgRkVFREJBQ0tfVVJMLCB1cmwpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZlZWRiYWNrIFVSTCBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmVlZGJhY2tVUkwoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBGRUVEQkFDS19VUkwpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGluY2x1ZGUgZ2xvc3NhcnkgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEluY2x1ZGVHbG9zc2FyeShTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIElOQ0xVREVfR0xPU1NBUlkpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKElOQ0xVREVfR0xPU1NBUlkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5jbHVkZSBnbG9zc2FyeSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbmNsdWRlR2xvc3NhcnkoU3RyaW5nIGNvbmZpZ0lkLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIElOQ0xVREVfR0xPU1NBUlksCi0JCQkJdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluY2x1ZGUgZ2xvc3NhcnkgcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUluY2x1ZGVHbG9zc2FyeShTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlCi0JCQkJLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIElOQ0xVREVfR0xPU1NBUlkpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGluY2x1ZGUgaW5kZXggcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEluY2x1ZGVJbmRleChTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIElOQ0xVREVfSU5ERVgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKElOQ0xVREVfSU5ERVgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5jbHVkZSBpbmRleCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbmNsdWRlSW5kZXgoU3RyaW5nIGNvbmZpZ0lkLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZQotCQkJCS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIElOQ0xVREVfSU5ERVgsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbmNsdWRlIGluZGV4IHByZWZlcmVuY2UgdG8gYmUgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVJbmNsdWRlSW5kZXgoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBJTkNMVURFX0lOREVYKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjaGVjayBleHRlcm5hbCBsaW5rcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Q2hlY2tFeHRlcm5hbExpbmtzKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgQ0hFQ0tfRVhURVJOQUxfTElOS1MpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKENIRUNLX0VYVEVSTkFMX0xJTktTKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNoZWNrIGV4dGVybmFsIGxpbmtzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENoZWNrRXh0ZXJuYWxMaW5rcyhTdHJpbmcgY29uZmlnSWQsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKAotCQkJCWdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgQ0hFQ0tfRVhURVJOQUxfTElOS1MsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjaGVjayBleHRlcm5hbCBsaW5rcyBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQ2hlY2tFeHRlcm5hbExpbmtzKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBDSEVDS19FWFRFUk5BTF9MSU5LUyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29udmVydCBicm9rZW4gbGlua3MgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldENvbnZlcnRCcm9rZW5MaW5rcyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIENPTlZFUlRfQlJPS0VOX0xJTktTKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihDT05WRVJUX0JST0tFTl9MSU5LUyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb252ZXJ0IGJyb2tlbiBsaW5rcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb252ZXJ0QnJva2VuTGlua3MoU3RyaW5nIGNvbmZpZ0lkLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZSgKLQkJCQlnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIENPTlZFUlRfQlJPS0VOX0xJTktTLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29udmVydCBicm9rZW4gbGlua3MgcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUNvbnZlcnRCcm9rZW5MaW5rcyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgQ09OVkVSVF9CUk9LRU5fTElOS1MpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggdW5vcGVuIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0UHVibGlzaFVub3BlbkFjdGl2aXR5REQoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBQVUJMSVNIX1VOT1BFTl9BQ1RJVklUWV9ERCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oUFVCTElTSF9VTk9QRU5fQUNUSVZJVFlfREQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCB1bm9wZW4gYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW1zIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eUREKFN0cmluZyBjb25maWdJZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIFBVQkxJU0hfVU5PUEVOX0FDVElWSVRZX0RELCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCB1bm9wZW4gYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW1zIHByZWZlcmVuY2UgdG8gYmUgZGVmYXVsdAotCSAqIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVB1Ymxpc2hVbm9wZW5BY3Rpdml0eUREKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBQVUJMSVNIX1VOT1BFTl9BQ1RJVklUWV9ERCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBhY3Rpdml5IGRpYWdyYW1zIGZvciBiYXNlIGFjdGl2aXRpZXMgd2l0aCB1bm1vZGlmaWVkCi0JICogZXh0ZW5zaW9uIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIFBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oUFVCTElTSF9BRF9GT1JfQUNUSVZJVFlfRVhURU5TSU9OKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggYWN0aXZpeSBkaWFncmFtcyBmb3IgYmFzZSBhY3Rpdml0aWVzIHdpdGggdW5tb2RpZmllZAotCSAqIGV4dGVuc2lvbiBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihTdHJpbmcgY29uZmlnSWQsCi0JCQlib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgUFVCTElTSF9BRF9GT1JfQUNUSVZJVFlfRVhURU5TSU9OLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBhY3Rpdml5IGRpYWdyYW1zIGZvciBiYXNlIGFjdGl2aXRpZXMgd2l0aCB1bm1vZGlmaWVkCi0JICogZXh0ZW5zaW9uIHByZWZlcmVuY2UgdG8gYmUgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgUFVCTElTSF9BRF9GT1JfQUNUSVZJVFlfRVhURU5TSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaWdodCB3ZWlnaHQgdHJlZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0TGlnaHRXZWlnaHRUcmVlKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgTElHSFRfV0VJR0hUX1RSRUUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKExJR0hUX1dFSUdIVF9UUkVFKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxpZ2h0IHdlaWdodCB0cmVlIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldExpZ2h0V2VpZ2h0VHJlZShTdHJpbmcgY29uZmlnSWQsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgTElHSFRfV0VJR0hUX1RSRUUsCi0JCQkJdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxpZ2h0IHdlaWdodCB0cmVlIHByZWZlcmVuY2UgdG8gYmUgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVMaWdodFdlaWdodFRyZWUoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIExJR0hUX1dFSUdIVF9UUkVFKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IGV4dHJhIGRlc2NyaXB0b3IgaW5mbyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldERlZmF1bHRFeHRyYURlc2NyaXB0b3JJbmZvKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZXh0cmEgZGVzY3JpcHRvciBpbmZvIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRFeHRyYURlc2NyaXB0b3JJbmZvKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oRVhUUkFfREVTQ1JJUFRPUl9JTkZPKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZWZhdWx0IGV4dHJhIGRlc2NyaXB0b3IgaW5mbyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RXh0cmFEZXNjcmlwdG9ySW5mbyhib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShFWFRSQV9ERVNDUklQVE9SX0lORk8sIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBleHRyYSBkZXNjcmlwdG9yIGluZm8gcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEV4dHJhRGVzY3JpcHRvckluZm8oU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBFWFRSQV9ERVNDUklQVE9SX0lORk8pOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKEVYVFJBX0RFU0NSSVBUT1JfSU5GTyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBleHRyYSBkZXNjcmlwdG9yIGluZm8gcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RXh0cmFEZXNjcmlwdG9ySW5mbyhTdHJpbmcgY29uZmlnSWQsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBFWFRSQV9ERVNDUklQVE9SX0lORk8sIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBleHRyYSBkZXNjcmlwdG9yIGluZm8gcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUV4dHJhRGVzY3JpcHRvckluZm8oU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIEVYVFJBX0RFU0NSSVBUT1JfSU5GTyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBwYXRoIGZvciBhIHB1Ymxpc2hlZCB3ZWIgc2l0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHBhdGggZm9yIGEgcHVibGlzaGVkIHdlYiBzaXRlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRQdWJsaXNoUGF0aCgpIHsKLQkJaWYgKGRlZmF1bHRQdWJsaXNoUGF0aCA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0UHVibGlzaFBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYXBwTmFtZSA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldEFwcGxpY2F0aW9uU2hvcnROYW1lKCk7Ci0JCQlpZiAoYXBwTmFtZSAhPSBudWxsICYmIGFwcE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZGVmYXVsdFB1Ymxpc2hQYXRoID0gZGVmYXVsdFB1Ymxpc2hQYXRoICsgRmlsZVV0aWwuRklMRV9TRVAKLQkJCQkJCSsgYXBwTmFtZSArIEZpbGVVdGlsLkZJTEVfU0VQCi0JCQkJCQkrIERFRkFVTFRfUFVCTElTSF9GT0xERVJfTkFNRTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVmYXVsdFB1Ymxpc2hQYXRoID0gZGVmYXVsdFB1Ymxpc2hQYXRoICsgRmlsZVV0aWwuRklMRV9TRVAKLQkJCQkJCSsgREVGQVVMVF9QVUJMSVNIX0ZPTERFUl9OQU1FOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWZhdWx0UHVibGlzaFBhdGg7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBwYXRoIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHVibGlzaCBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHVibGlzaFBhdGgoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKFBVQkxJU0hfUEFUSCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBwYXRoIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwdWJsaXNoIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHVibGlzaFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFBVQkxJU0hfUEFUSCwgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBwYXRoIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIHRoZSBwdWJsaXNoIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQdWJsaXNoUGF0aChTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgUFVCTElTSF9QQVRIKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKFBVQkxJU0hfUEFUSCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIHBhdGggcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgcHVibGlzaCBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFB1Ymxpc2hQYXRoKFN0cmluZyBjb25maWdJZCwgU3RyaW5nIHBhdGgpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgUFVCTElTSF9QQVRILCBwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIHBhdGggcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVB1Ymxpc2hQYXRoKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgUFVCTElTSF9QQVRIKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIHN0YXRpYyB3ZWIgc2l0ZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0UHVibGlzaFN0YXRpY1dlYlNpdGUoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBQVUJMSVNIX1NUQVRJQ19XRUJfU0lURSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oUFVCTElTSF9TVEFUSUNfV0VCX1NJVEUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBzdGF0aWMgd2ViIHNpdGUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHVibGlzaFN0YXRpY1dlYlNpdGUoU3RyaW5nIGNvbmZpZ0lkLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgUFVCTElTSF9TVEFUSUNfV0VCX1NJVEUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIHN0YXRpYyB3ZWIgc2l0ZSBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlUHVibGlzaFN0YXRpY1dlYlNpdGUoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIFBVQkxJU0hfU1RBVElDX1dFQl9TSVRFKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbmNsdWRlIGFwcGxldCBzZWFyY2ggcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEluY2x1ZGVTZXJ2bGV0U2VhcmNoKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgSU5DTFVERV9TRVJWTEVUX1NFQVJDSCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oSU5DTFVERV9TRVJWTEVUX1NFQVJDSCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbmNsdWRlIHNlcnZsZXQgc2VhcmNoIHByZWZlcmVuY2UgdmFsdWUuLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbmNsdWRlU2VydmxldFNlYXJjaChTdHJpbmcgY29uZmlnSWQsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBJTkNMVURFX1NFUlZMRVRfU0VBUkNILCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5jbHVkZSBzZXJ2bGV0IHNlYXJjaCBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUuLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUluY2x1ZGVTZXJ2bGV0U2VhcmNoKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBJTkNMVURFX1NFUlZMRVRfU0VBUkNIKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbmNsdWRlIHNlYXJjaCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0SW5jbHVkZVNlYXJjaChTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIElOQ0xVREVfU0VBUkNIKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihJTkNMVURFX1NFQVJDSCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbmNsdWRlIHNlYXJjaCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbmNsdWRlU2VhcmNoKFN0cmluZyBjb25maWdJZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBJTkNMVURFX1NFQVJDSCwKLQkJCQl2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5jbHVkZSBzZWFyY2ggcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUluY2x1ZGVTZWFyY2goU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBJTkNMVURFX1NFQVJDSCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgd2ViIGFwcGxpY2F0aW9uIG5hbWUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXZWJBcHBOYW1lKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBXRUJBUFBfTkFNRSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhXRUJBUFBfTkFNRSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB3ZWIgYXBwbGljYXRpb24gbmFtZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSB3ZWIgYXBwbGljYXRpb24gbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXZWJBcHBOYW1lKFN0cmluZyBjb25maWdJZCwgU3RyaW5nIG5hbWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgV0VCQVBQX05BTUUsIG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHdlYiBhcHBsaWNhdGlvbiBuYW1lIHByZWZlcmVuY2UgdG8gYmUgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVXZWJBcHBOYW1lKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgV0VCQVBQX05BTUUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIHNwZWNpZmljIHByZWZlcmVuY2UgcHJlZml4LgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSBwcmVmZXJlbmNlIHByZWZpeCBhc3NpZ25lZCB0byB0aGUgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbmZpZ1ByZWZQcmVmaXgoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXJldHVybiBjb25maWdJZCArICIuIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMgcHJlZmVyZW5jZXMgaW5pdGlhbGl6ZWQgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKFN0cmluZyBjb25maWdJZCkgewotCQlyZXR1cm4gcHJlZlN0b3JlCi0JCQkJLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBJTklUSUFMSVpFRCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29uZmlndXJhdGlvbiBzcGVjaWZpYyBwcmVmZXJlbmNlcyBpbml0aWFsaXplZCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoU3RyaW5nIGNvbmZpZ0lkLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIElOSVRJQUxJWkVELCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29uZmlndXJhdGlvbiBzcGVjaWZpYyBwcmVmZXJlbmNlcyBpbml0aWFsaXplZCBwcmVmZXJlbmNlIHRvIGJlCi0JICogZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVDb25maWdQcmVmSW5pdGlhbGl6ZWQoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBJTklUSUFMSVpFRCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2hvdyByZWxhdGVkIGRlc2NyaXB0b3JzIGluIGNvbnRlbnQgcGFnZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRTaG93UmVsYXRlZERlc2NyaXB0b3JzKFN0cmluZyBjb25maWdJZCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIFNIT1dfUkVMQVRFRF9ERVNDUklQVE9SUyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2hvdyByZWxhdGVkIGRlc2NyaXB0b3JzIGluIGNvbnRlbnQgcGFnZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTaG93UmVsYXRlZERlc2NyaXB0b3JzKFN0cmluZyBjb25maWdJZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIFNIT1dfUkVMQVRFRF9ERVNDUklQVE9SUywgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNob3cgcmVsYXRlZCBkZXNjcmlwdG9ycyBpbiBjb250ZW50IHBhZ2UgcHJlZmVyZW5jZSB0byBiZQotCSAqIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlU2hvd1JlbGF0ZWREZXNjcmlwdG9ycyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgU0hPV19SRUxBVEVEX0RFU0NSSVBUT1JTKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaG93IGRlc2NyaXB0b3JzIGluIG5hdmlnYXRpb24gdHJlZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRTaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlKFN0cmluZyBjb25maWdJZCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIFNIT1dfREVTQ1JJUFRPUlNfSU5fTkFWSUdBVElPTlRSRUUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNob3cgZGVzY3JpcHRvcnMgaW4gbmF2aWdhdGlvbiB0cmVlIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWUoU3RyaW5nIGNvbmZpZ0lkLAotCQkJYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIFNIT1dfREVTQ1JJUFRPUlNfSU5fTkFWSUdBVElPTlRSRUUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaG93IGRlc2NyaXB0b3JzIGluIG5hdmlnYXRpb24gdHJlZSBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQKLQkgKiB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVTaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBTSE9XX0RFU0NSSVBUT1JTX0lOX05BVklHQVRJT05UUkVFKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IGFjdGl2aXR5IHRhYiBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBhY3Rpdml0eSB0YWIgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRBY3Rpdml0eVRhYihTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgREVGQVVMVF9BQ1RJVklUWV9UQUIpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoREVGQVVMVF9BQ1RJVklUWV9UQUIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGVmYXVsdCBhY3Rpdml0eSB0YWIgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB0YWJOYW1lCi0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCBhY3Rpdml0eSB0YWIgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0QWN0aXZpdHlUYWIoU3RyaW5nIGNvbmZpZ0lkLCBTdHJpbmcgdGFiTmFtZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoCi0JCQkJZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBERUZBVUxUX0FDVElWSVRZX1RBQiwgdGFiTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgYWxsIHRoZSBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZUFsbFByZWZlcmVuY2VzKCkgewotCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL1JvbGVEaWFncmFtUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9Sb2xlRGlhZ3JhbVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OGU0NDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL1JvbGVEaWFncmFtUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmZXJlbmNlcy5MaWJyYXJ5UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS5wcmVmZXJlbmNlcy5CYXNlUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogVGhlIFB1Ymxpc2hpbmcgcHJlZmVyZW5jZSBwYWdlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIAotICogQnVncyBmaXhlZDoKLSAqIDx1bD4KLSAqIDxsaT5odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU2OTU3PC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGlhZ3JhbVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQmFzZVByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLQkJTW9kaWZ5TGlzdGVuZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1JTl9IT1JJWk9OVEFMX1NQQUNJTkcgPSA1MDsKLQotCXByaXZhdGUgc3RhdGljIGludCBNQVhfSE9SSVpPTlRBTF9TUEFDSU5HID0gMjAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1JTl9WRVJUSUNBTF9TUEFDSU5HID0gMjU7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgTUFYX1ZFUlRJQ0FMX1NQQUNJTkcgPSAxMDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgTUlOX1RFWFRfTElORVMgPSAxOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1BWF9URVhUX0xJTkVTID0gNTsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByaXZhdGUgVGV4dCBob3Jpem9uYWxTcGFjaW5nVGV4dDsKLQotCXByaXZhdGUgVGV4dCB2ZXJ0aWNhbFNwYWNpbmdUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IHRleHRMaW5lc1RleHQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBTV1QgY29udHJvbCBmb3IgdGhlIGN1c3RvbWl6ZWQgYm9keSBvZiB0aGlzCi0JICogcHJlZmVyZW5jZSBwYWdlIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQgY29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiB0aGUgbmV3IGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQotCQkvLyBDcmVhdGUgU3BhY2luZyBiZXR3ZWVuIHRhc2sgYW5kIHdvcmsgcHJvZHVjdCBlbGVtZW50cyBncm91cC4KLQkJR3JvdXAgZWxlbWVudFNwYWNpbmdHcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmVsZW1lbnRTcGFjaW5nR3JvdXBfdGV4dCwgMik7Ci0KLQkJY3JlYXRlTGFiZWwoZWxlbWVudFNwYWNpbmdHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMudGFza3NIb3Jpem9uYWxTcGFjaW5nTGFiZWxfdGV4dCk7Ci0JCWhvcml6b25hbFNwYWNpbmdUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KGVsZW1lbnRTcGFjaW5nR3JvdXAsICIiLCAyNSk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbChlbGVtZW50U3BhY2luZ0dyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy50YXNrc1ZlcnRpY2FsU3BhY2luZ0xhYmVsX3RleHQpOwotCQl2ZXJ0aWNhbFNwYWNpbmdUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KGVsZW1lbnRTcGFjaW5nR3JvdXAsICIiLCAyNSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgRWxlbWVudCB0ZXh0IGxhYmVsIGdyb3VwLgotCQlHcm91cCBlbGVtZW50VGV4dExhYmVsR3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5lbGVtZW50VGV4dExhYmVsR3JvdXBfdGV4dCwgMik7Ci0KLQkJY3JlYXRlTGFiZWwoZWxlbWVudFRleHRMYWJlbEdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5tYXhMaW5lT2ZUZXh0TGFiZWxfdGV4dCk7Ci0JCXRleHRMaW5lc1RleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQoZWxlbWVudFRleHRMYWJlbEdyb3VwLCAiIiwgMTUpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgcHJlZmVyZW5jZSBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCWhvcml6b25hbFNwYWNpbmdUZXh0LnNldFRleHQoU3RyaW5nLnZhbHVlT2YoTGlicmFyeVByZWZlcmVuY2VzCi0JCQkJLmdldFJvbGVEaWFncmFtSG9yaXpvbnRhbFNwYWNpbmcoKSkpOwotCQl2ZXJ0aWNhbFNwYWNpbmdUZXh0LnNldFRleHQoU3RyaW5nLnZhbHVlT2YoTGlicmFyeVByZWZlcmVuY2VzCi0JCQkJLmdldFJvbGVEaWFncmFtVmVydGljYWxTcGFjaW5nKCkpKTsKLQkJdGV4dExpbmVzVGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKExpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5nZXRSb2xlRGlhZ3JhbU1heGltdW1UZXh0TGluZXMoKSkpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgZXZlbnQgbGlzdGVuZXJzIHRvIHRoZSBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlob3Jpem9uYWxTcGFjaW5nVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJdmVydGljYWxTcGFjaW5nVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJdGV4dExpbmVzVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXIjbW9kaWZ5VGV4dChNb2RpZnlFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQlzZXRWYWxpZCh0cnVlKTsKLQotCQlpbnQgdmFsdWUgPSAwOwotCQlpZiAoZS53aWRnZXQgPT0gaG9yaXpvbmFsU3BhY2luZ1RleHQpIHsKLQkJCXZhbHVlID0gZ2V0SG9yaXpvbnRhbFNwYWNpbmcoKTsKLQkJCWlmICh2YWx1ZSA8IE1JTl9IT1JJWk9OVEFMX1NQQUNJTkcKLQkJCQkJfHwgdmFsdWUgPiBNQVhfSE9SSVpPTlRBTF9TUEFDSU5HKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5iaW5kKAotCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRIb3Jpem9uYWxTcGFjaW5nRXJyb3JfbXNnLAotCQkJCQkJbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIoTUlOX0hPUklaT05UQUxfU1BBQ0lORyksCi0JCQkJCQkJCW5ldyBJbnRlZ2VyKE1BWF9IT1JJWk9OVEFMX1NQQUNJTkcpIH0pKTsKLQkJCQlzZXRWYWxpZChmYWxzZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZS53aWRnZXQgPT0gdmVydGljYWxTcGFjaW5nVGV4dCkgewotCQkJdmFsdWUgPSBnZXRWZXJ0aWNhbFNwYWNpbmcoKTsKLQkJCWlmICh2YWx1ZSA8IE1JTl9WRVJUSUNBTF9TUEFDSU5HIHx8IHZhbHVlID4gTUFYX1ZFUlRJQ0FMX1NQQUNJTkcpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJpbmQoCi0JCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW52YWxpZFZlcnRpY2FsU3BhY2luZ0Vycm9yX21zZywKLQkJCQkJCW5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKE1JTl9WRVJUSUNBTF9TUEFDSU5HKSwKLQkJCQkJCQkJbmV3IEludGVnZXIoTUFYX1ZFUlRJQ0FMX1NQQUNJTkcpIH0pKTsKLQkJCQlzZXRWYWxpZChmYWxzZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZS53aWRnZXQgPT0gdGV4dExpbmVzVGV4dCkgewotCQkJdmFsdWUgPSBnZXRNYXhpbXVtVGV4dExpbmVzKCk7Ci0JCQlpZiAodmFsdWUgPCBNSU5fVEVYVF9MSU5FUyB8fCB2YWx1ZSA+IE1BWF9URVhUX0xJTkVTKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5iaW5kKAotCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRUZXh0TGluZXNFcnJvcl9tc2csCi0JCQkJCQluZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcihNSU5fVEVYVF9MSU5FUyksCi0JCQkJCQkJCW5ldyBJbnRlZ2VyKE1BWF9URVhUX0xJTkVTKSB9KSk7Ci0JCQkJc2V0VmFsaWQoZmFsc2UpOwotCQkJfQotCQl9Ci0KLQkJdXBkYXRlQXBwbHlCdXR0b24oKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyBzcGVjaWFsIHByb2Nlc3Npbmcgd2hlbiB0aGlzIHBhZ2UncyBEZWZhdWx0cyBidXR0b24gaGFzIGJlZW4KLQkgKiBwcmVzc2VkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCWhvcml6b25hbFNwYWNpbmdUZXh0LnNldFRleHQoIiIgLy8kTk9OLU5MUy0xJAotCQkJCSsgTGlicmFyeVByZWZlcmVuY2VzLmdldERlZmF1bHRSb2xlRGlhZ3JhbUhvcml6b250YWxTcGFjaW5nKCkpOwotCQl2ZXJ0aWNhbFNwYWNpbmdUZXh0LnNldFRleHQoIiIgLy8kTk9OLU5MUy0xJAotCQkJCSsgTGlicmFyeVByZWZlcmVuY2VzLmdldERlZmF1bHRSb2xlRGlhZ3JhbVZlcnRpY2FsU3BhY2luZygpKTsKLQkJdGV4dExpbmVzVGV4dC5zZXRUZXh0KCIiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIExpYnJhcnlQcmVmZXJlbmNlcy5nZXREZWZhdWx0Um9sZURpYWdyYW1NYXhpbXVtVGV4dExpbmVzKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJTGlicmFyeVByZWZlcmVuY2VzCi0JCQkJLnNldFJvbGVEaWFncmFtSG9yaXpvbnRhbFNwYWNpbmcoZ2V0SG9yaXpvbnRhbFNwYWNpbmcoKSk7Ci0JCUxpYnJhcnlQcmVmZXJlbmNlcy5zZXRSb2xlRGlhZ3JhbVZlcnRpY2FsU3BhY2luZyhnZXRWZXJ0aWNhbFNwYWNpbmcoKSk7Ci0JCUxpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5zZXRSb2xlRGlhZ3JhbU1heGltdW1UZXh0TGluZXMoZ2V0TWF4aW11bVRleHRMaW5lcygpKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgaG9yaXpvbnRhbCBzcGFjaW5nIGJldHdlZW4gdGFza3MgYW5kIHJvbGVzLgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0SG9yaXpvbnRhbFNwYWNpbmcoKSB7Ci0JCXJldHVybiBTdHJVdGlsLmdldEludFZhbHVlKGhvcml6b25hbFNwYWNpbmdUZXh0LmdldFRleHQoKS50cmltKCksIDApOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHZlcnRpY2FsIHNwYWNpbmcgYmV0d2VlbiB0YXNrcyBhbmQgcm9sZXMuCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRWZXJ0aWNhbFNwYWNpbmcoKSB7Ci0JCXJldHVybiBTdHJVdGlsLmdldEludFZhbHVlKHZlcnRpY2FsU3BhY2luZ1RleHQuZ2V0VGV4dCgpLnRyaW0oKSwgMCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgZWxlbWVudCBsYWJlbCB0ZXh0IGxpbmVzLgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0TWF4aW11bVRleHRMaW5lcygpIHsKLQkJcmV0dXJuIFN0clV0aWwuZ2V0SW50VmFsdWUodGV4dExpbmVzVGV4dC5nZXRUZXh0KCkudHJpbSgpLCAwKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjU4YzIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBwcmVmZXJlbmNlIHN1cHBvcnQgZm9yIHRoZSBwdWJsaXNoaW5nIFVJLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL0Fic3RyYWN0UHVibGlzaFdpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvQWJzdHJhY3RQdWJsaXNoV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4Zjc5YzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvQWJzdHJhY3RQdWJsaXNoV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBBYnN0cmFjdCBwdWJsaXNoaW5nIHdpemFyZCBjbGFzcy4gCi0gKiB1c2UgdGhlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnB1Ymxpc2hlcnMgZXh0ZW5zaW9uIHBvaW50IHRvIGV4dGVuZCB0aGlzIGNsYXNzIAotICogaWYgeW91IG5lZWQgdG8gY3VzdG9taXplIHRoZSBwdWJsaXNoaW5nIHVpLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHVibGlzaFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLy8gVGhlIHB1Ymxpc2hpbmcgb3B0aW9ucy4KLQlwcm90ZWN0ZWQgUHVibGlzaE9wdGlvbnMgZGF0YU1vZGVsID0gbnVsbDsKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICoKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RQdWJsaXNoV2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBmaW5pc2ggdGhlIHdpemFyZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpOwotCi0JLyoqCi0JICogaW5pdGlhbGl6ZSB0aGUgd2l6YXJkLgotCSAqIAotCSAqIEBwYXJhbSB3b3JrYmVuY2ggSVdvcmtiZW5jaAotCSAqIEBwYXJhbSBzZWxlY3Rpb24gSVN0cnVjdHVyZWRTZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pOwotCQotCS8qKgotCSAqIGdldCB0aGUgcHVibGlzaCBvcHRpb25zCi0JICogCi0JICogQHJldHVybiBQdWJsaXNoT3B0aW9ucwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBQdWJsaXNoT3B0aW9ucyBnZXRQdWJsaXNoT3B0aW9ucygpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvUHVibGlzaENvbmZpZ1dpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvUHVibGlzaENvbmZpZ1dpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjA2NjI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1B1Ymxpc2hDb25maWdXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoSFRNTE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5QdWJsaXNoaW5nVUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogQSB3aXphcmQgdGhhdCBndWlkZXMgdGhlIHVzZXIgdG8gcHVibGlzaCBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHRvIGEgd2ViCi0gKiBzaXRlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hDb25maWdXaXphcmQgZXh0ZW5kcyBCYXNlV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9JRCA9IFB1Ymxpc2hDb25maWdXaXphcmQuY2xhc3MuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogVGhlIFB1Ymxpc2ggQ29uZmlndXJhdGlvbiB3aXphcmQgZXh0ZW5zaW9uIHBvaW50IElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9FWFRFTlNJT05fUE9JTlRfSUQgPSAib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHVibGlzaENvbmZpZ1dpemFyZCI7IC8vJE5PTi1OTFMtMSQJCi0KLQkvLyBUaGUgc2VsZWN0IGNvbmZpZ3VyYXRpb24gd2l6YXJkIHBhZ2UuCi0JcHJvdGVjdGVkIFNlbGVjdENvbmZpZ1BhZ2Ugc2VsZWN0Q29uZmlnUGFnZTsKLQotCS8vIFRoZSBzZWxlY3QgY29uZmlndXJhdGlvbiBjb250ZW50IHdpemFyZCBwYWdlLgotCXByb3RlY3RlZCBTZWxlY3RDb250ZW50UGFnZSBzZWxlY3RDb250ZW50UGFnZTsKLQotCS8vIFRoZSBzZWxlY3QgcHVibGlzaGluZyBvcHRpb25zIHdpemFyZCBwYWdlLgotCXByb3RlY3RlZCBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2Ugc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlOwotCi0JLy8gVGhlIHNlbGVjdCBkZXN0aW5hdGlvbiB3aXphcmQgcGFnZS4KLQlwcm90ZWN0ZWQgU2VsZWN0RGVzdGluYXRpb25QYWdlIHNlbGVjdERlc3RpbmF0aW9uUGFnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hDb25maWdXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlci5pbml0KHdvcmtiZW5jaCwgc2VsZWN0aW9uKTsKLQkJc2V0V2luZG93VGl0bGUoUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZCNnZXRXaXphcmRFeHRlbmRlckV4dGVuc2lvblBvaW50SWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2l6YXJkRXh0ZW5kZXJFeHRlbnNpb25Qb2ludElkKCkgewotCQlyZXR1cm4gV0laQVJEX0VYVEVOU0lPTl9QT0lOVF9JRDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlpZiAod2l6YXJkRXh0ZW5kZXIgPT0gbnVsbCkgewotCQkJc2VsZWN0Q29uZmlnUGFnZSA9IG5ldyBTZWxlY3RDb25maWdQYWdlKCk7Ci0JCQlzZWxlY3RDb250ZW50UGFnZSA9IG5ldyBTZWxlY3RDb250ZW50UGFnZSgpOwotCQkJc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlID0gbmV3IFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSgpOwotCQkJc2VsZWN0RGVzdGluYXRpb25QYWdlID0gbmV3IFNlbGVjdERlc3RpbmF0aW9uUGFnZSgpOwotCQkJc3VwZXIuYWRkUGFnZShzZWxlY3RDb25maWdQYWdlKTsKLQkJCXN1cGVyLmFkZFBhZ2Uoc2VsZWN0Q29udGVudFBhZ2UpOwotCQkJc3VwZXIuYWRkUGFnZShzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UpOwotCQkJc3VwZXIuYWRkUGFnZShzZWxlY3REZXN0aW5hdGlvblBhZ2UpOwotCQl9IGVsc2UgewotCQkJTGlzdDxJV2l6YXJkUGFnZT4gd2l6YXJkUGFnZXMgPSBuZXcgQXJyYXlMaXN0PElXaXphcmRQYWdlPigpOwotCi0JCQlJV2l6YXJkUGFnZSBwYWdlID0gd2l6YXJkRXh0ZW5kZXIKLQkJCQkJLmdldFJlcGxhY2VXaXphcmRQYWdlKFNlbGVjdENvbmZpZ1BhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdENvbmZpZ1BhZ2UgPSBuZXcgU2VsZWN0Q29uZmlnUGFnZSgpOwotCQkJCXdpemFyZFBhZ2VzLmFkZChzZWxlY3RDb25maWdQYWdlKTsKLQkJCX0KLQotCQkJcGFnZSA9IHdpemFyZEV4dGVuZGVyCi0JCQkJCS5nZXRSZXBsYWNlV2l6YXJkUGFnZShTZWxlY3RDb250ZW50UGFnZS5QQUdFX05BTUUpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCXdpemFyZFBhZ2VzLmFkZChwYWdlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0Q29udGVudFBhZ2UgPSBuZXcgU2VsZWN0Q29udGVudFBhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQoc2VsZWN0Q29udGVudFBhZ2UpOwotCQkJfQotCi0JCQlwYWdlID0gd2l6YXJkRXh0ZW5kZXIKLQkJCQkJLmdldFJlcGxhY2VXaXphcmRQYWdlKFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZS5QQUdFX05BTUUpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCXdpemFyZFBhZ2VzLmFkZChwYWdlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlID0gbmV3IFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSgpOwotCQkJCXdpemFyZFBhZ2VzLmFkZChzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UpOwotCQkJfQotCi0JCQlwYWdlID0gd2l6YXJkRXh0ZW5kZXIKLQkJCQkJLmdldFJlcGxhY2VXaXphcmRQYWdlKFNlbGVjdERlc3RpbmF0aW9uUGFnZS5QQUdFX05BTUUpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCXdpemFyZFBhZ2VzLmFkZChwYWdlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0RGVzdGluYXRpb25QYWdlID0gbmV3IFNlbGVjdERlc3RpbmF0aW9uUGFnZSgpOwotCQkJCXdpemFyZFBhZ2VzLmFkZChzZWxlY3REZXN0aW5hdGlvblBhZ2UpOwotCQkJfQotCi0JCQlzdXBlci5nZXROZXdXaXphcmRQYWdlcyh3aXphcmRQYWdlcyk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB3aXphcmRQYWdlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJSVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IChJV2l6YXJkUGFnZSkgaXQubmV4dCgpOwotCQkJCXN1cGVyLmFkZFBhZ2Uod2l6YXJkUGFnZSk7Ci0JCQl9Ci0KLQkJCXdpemFyZEV4dGVuZGVyLmluaXRXaXphcmRQYWdlcyh3aXphcmRQYWdlcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLQkJc3VwZXIuY3JlYXRlUGFnZUNvbnRyb2xzKHBhZ2VDb250YWluZXIpOwotCQlwYWdlQ29udGFpbmVyLmdldFNoZWxsKCkuc2V0SW1hZ2UoCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCQkJImZ1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJaWYgKHdpemFyZEV4dGVuZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiB3aXphcmRFeHRlbmRlci5kb0ZpbmlzaCgpOwotCQl9IGVsc2UgewotCQkJUHVibGlzaE1hbmFnZXIgcHVibGlzaGVyID0gbmV3IFB1Ymxpc2hNYW5hZ2VyKCk7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSBwdWJsaXNoQ29uZmlnKHNlbGVjdENvbmZpZ1BhZ2UuZ2V0Q29uZmlnTmFtZSgpLAotCQkJCQlnZXRQdWJsaXNoaW5nT3B0aW9ucygpLCBwdWJsaXNoZXIpOwotCQkJaWYgKHB1Ymxpc2hlciAhPSBudWxsKSB7Ci0JCQkJcHVibGlzaGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCXJldHVybiBzdWNjZXNzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHVibGlzaGVzIHRoZSBzZWxlY3RlZCBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnTmFtZQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqICAgICAgICAgICAgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucwotCSAqLwotCXB1YmxpYyBib29sZWFuIHB1Ymxpc2hDb25maWcoU3RyaW5nIGNvbmZpZ05hbWUsIFB1Ymxpc2hPcHRpb25zIG9wdGlvbnMsCi0JCQlQdWJsaXNoTWFuYWdlciBwdWJsaXNoZXIpIHsKLQkJdHJ5IHsKLQkJCWlmIChjaGVja0FuZENyZWF0ZURpcihvcHRpb25zKSkgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBjb25maWdOYW1lKTsKLQotCQkJCXB1Ymxpc2hlci5pbml0KG9wdGlvbnMuZ2V0UHVibGlzaERpcigpLCBjb25maWcsIG9wdGlvbnMpOwotCQkJCVB1Ymxpc2hpbmdPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFB1Ymxpc2hpbmdPcGVyYXRpb24oCi0JCQkJCQlwdWJsaXNoZXIpOwotCi0JCQkJUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZyBkbGcgPSBuZXcgUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZygKLQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHB1Ymxpc2hlcgotCQkJCQkJCQkuZ2V0Vmlld0J1aWxkZXIoKSk7Ci0KLQkJCQlVSUhlbHBlci5ydW5XaXRoUHJvZ3Jlc3Mob3BlcmF0aW9uLCBkbGcsIHRydWUsCi0JCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ1dpemFyZF90aXRsZSk7Ci0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlLAotCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0Vycm9yX21zZywKLQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdFcnJvcl9yZWFzb24sIGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSAhPSBudWxsKSB7Ci0JCQkJc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlLnNhdmVQcmVmZXJlbmNlcygpOwotCQkJfQotCQkJaWYgKHNlbGVjdERlc3RpbmF0aW9uUGFnZSAhPSBudWxsKSB7Ci0JCQkJc2VsZWN0RGVzdGluYXRpb25QYWdlLnNhdmVQcmVmZXJlbmNlcygpOwotCQkJfQotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBjb25maWdOYW1lKTsKLQkJCVN0cmluZyBjb25maWdJZCA9IGNvbmZpZy5nZXRHdWlkKCk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQsIHRydWUpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2F2ZUFsbFByZWZlcmVuY2VzKCk7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBwdWJsaXNoaW5nIG9wdGlvbnMuCi0JICogCi0JICogQHJldHVybiB0aGUgdXNlciBzcGVjaWZpZWQgcHVibGlzaGluZyBvcHRpb25zLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoT3B0aW9ucyBnZXRQdWJsaXNoaW5nT3B0aW9ucygpIHsKLQkJUHVibGlzaE9wdGlvbnMgb3B0aW9uczsKLQkJCi0JCWlmIChzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UgIT0gbnVsbCkgewotCQkJb3B0aW9ucyA9IHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZS5nZXRQdWJsaXNoaW5nT3B0aW9ucygpOwotCQl9Ci0JCWVsc2UgewotCQkJb3B0aW9ucyA9IG5ldyBQdWJsaXNoT3B0aW9ucygpOwotCQl9Ci0KLQkJaWYgKHNlbGVjdENvbnRlbnRQYWdlICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gcHVibGlzaENvbmZpZyA9IHNlbGVjdENvbnRlbnRQYWdlLmdldFB1Ymxpc2hDb25maWdTZWxlY3Rpb24oKTsKLQkJCW9wdGlvbnMuc2V0UHVibGlzaENvbmZpZ3VyYXRpb24ocHVibGlzaENvbmZpZyk7Ci0JCQlvcHRpb25zLnNldFB1Ymxpc2hQcm9jZXNzKCFwdWJsaXNoQ29uZmlnKTsKLQkJCWlmICghcHVibGlzaENvbmZpZykgewotCQkJCW9wdGlvbnMuc2V0UHJvY2Vzc2VzKHNlbGVjdENvbnRlbnRQYWdlLmdldFNlbGVjdGVkUHJvY2Vzc2VzKCkpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoc2VsZWN0RGVzdGluYXRpb25QYWdlICE9IG51bGwpIHsKLQkJCW9wdGlvbnMuc2V0UHVibGlzaERpcihzZWxlY3REZXN0aW5hdGlvblBhZ2UuZ2V0UHVibGlzaERpcmVjdG9yeSgpKTsKLQotCQkJaWYgKCFzZWxlY3REZXN0aW5hdGlvblBhZ2UuZ2V0U3RhdGljV2ViU2l0ZVNlbGVjdGlvbigpCi0JCQkJCSYmIG9wdGlvbnMgaW5zdGFuY2VvZiBQdWJsaXNoSFRNTE9wdGlvbnMpIHsKLQkJCQlQdWJsaXNoSFRNTE9wdGlvbnMgaHRtbE9wdGlvbnMgPSAoUHVibGlzaEhUTUxPcHRpb25zKSBvcHRpb25zOwotCQkJCWh0bWxPcHRpb25zLnNldFB1Ymxpc2hEeW5hbWljV2ViQXBwKHRydWUpOwotCQkJCWh0bWxPcHRpb25zLnNldER5bmFtaWNXZWJBcHBOYW1lKHNlbGVjdERlc3RpbmF0aW9uUGFnZQotCQkJCQkJLmdldFdlYkFwcE5hbWUoKSk7Ci0JCQkJaHRtbE9wdGlvbnMuc2V0SW5jbHVkZVNlcnZsZXRTZWFyY2goc2VsZWN0RGVzdGluYXRpb25QYWdlCi0JCQkJCQkuZ2V0SW5jbHVkZVNlYXJjaFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBvcHRpb25zOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBhbmQgY3JlYXRlcyB0aGUgZGVzdGluYXRpb24gcGF0aCB3aGVyZSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiB3aWxsIGJlIHB1Ymxpc2hlZC4KLQkgKiAKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqICAgICAgICAgICAgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGRlc3RpbmF0aW9uIHBhdGggaXMgdmFsaWQsCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2hlY2tBbmRDcmVhdGVEaXIoUHVibGlzaE9wdGlvbnMgb3B0aW9ucykgewotCQlTdHJpbmcgZGlyID0gb3B0aW9ucy5nZXRQdWJsaXNoRGlyKCk7Ci0JCVN0cmluZyBkZWZhdWx0UHVibGlzaFBhdGggPSBQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZWZhdWx0UHVibGlzaFBhdGgoKTsKLQkJYm9vbGVhbiBhbnN3ZXIgPSBmYWxzZTsKLQotCQlJUGF0aCBlY1BhdGggPSBQYXRoLmZyb21PU1N0cmluZyhkaXIpOwotCQlpZiAoIWVjUGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCVN0cmluZyBwYXRoID0gZGVmYXVsdFB1Ymxpc2hQYXRoCi0JCQkJCSsgU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpICsgZGlyOyAvLyROT04tTkxTLTEkCi0JCQlhbnN3ZXIgPSBQdWJsaXNoaW5nVUlQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlQcm9tcHQoCi0JCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGUsCi0JCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNvbmZpcm1QYXRoRGlhbG9nX3RleHQsCi0JCQkJCQkJCQkJCXBhdGgpKTsKLQotCQkJaWYgKGFuc3dlcikgewotCQkJCW9wdGlvbnMuc2V0UHVibGlzaERpcihkaXIpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIpOwotCi0JCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQlGaWxlW10gZmlsZXMgPSBmaWxlLmxpc3RGaWxlcygpOwotCQkJaWYgKGZpbGVzICE9IG51bGwgJiYgZmlsZXMubGVuZ3RoID4gMCkgewotCQkJCWFuc3dlciA9IFB1Ymxpc2hpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLm92ZXJ3cml0ZURpYWxvZ190ZXh0LAotCQkJCQkJCQkJCQkJZGlyKSk7Ci0KLQkJCQlpZiAoYW5zd2VyID09IHRydWUpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWFuc3dlciA9IEZpbGVVdGlsCi0JCQkJCQkJCS5kZWxldGVBbGxGaWxlcyhmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCWlmIChhbnN3ZXIgPT0gZmFsc2UpIHsKLQkJCQkJCQlQdWJsaXNoaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5jYW5ub3RQdWJsaXNoRXJyb3JfbXNnLAotCQkJCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5kZWxldGVGaWxlc0Vycm9yX3JlYXNvbiwKLQkJCQkJCQkJCQkJCQkJCWRpcikpOwotCQkJCQkJCXJldHVybiBmYWxzZTsKLQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJUHVibGlzaGluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNhbm5vdFB1Ymxpc2hFcnJvcl9tc2csCi0JCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJCQkJCQlkaXIpLCBlKTsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCWFuc3dlciA9IGZpbGUubWtkaXJzKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGUsCi0JCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY2Fubm90UHVibGlzaEVycm9yX21zZywKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5iaW5kKAotCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY3JlYXRlRGlyRXJyb3JfcmVhc29uLAotCQkJCQkJCQlmaWxlLmdldEFic29sdXRlUGF0aCgpKSwgZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKCFhbnN3ZXIpIHsKLQkJCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlLAotCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNhbm5vdFB1Ymxpc2hFcnJvcl9tc2csCi0JCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNyZWF0ZURpckVycm9yX3JlYXNvbiwKLQkJCQkJCQkJZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBhbnN3ZXI7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvUHVibGlzaE9wdGlvbkNvbnRyaWJ1dGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvUHVibGlzaE9wdGlvbkNvbnRyaWJ1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjhiM2I2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1B1Ymxpc2hPcHRpb25Db250cmlidXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLS8qKgotICogTW9kZWxzIGEgInB1Ymxpc2hPcHRpb24iIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBpbiB0aGUKLSAqICJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wdWJsaXNoQ29uZmlndXJhdGlvbldpemFyZCIgZXh0ZW5zaW9uIHBvaW50LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hPcHRpb25Db250cmlidXRpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0JcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRTZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgZXhwb3J0IG9wdGlvbiBuYW1lCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICB0aGUgZXhwb3J0IG9wdGlvbiBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZWZhdWx0U2VsZWN0aW9uCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhpcyBvcHRpb24gaXMgc2VsZWN0ZWQgYnkgZGVmYXVsdAotCSAqLwotCXB1YmxpYyBQdWJsaXNoT3B0aW9uQ29udHJpYnV0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24sCi0JCQlib29sZWFuIGRlZmF1bHRTZWxlY3Rpb24pIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQl0aGlzLmRlZmF1bHRTZWxlY3Rpb24gPSBkZWZhdWx0U2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBleHBvcnQgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGV4cG9ydCBvcHRpb24gbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBleHBvcnQgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGV4cG9ydCBvcHRpb24gZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBzZWxlY2l0b24gb2YgdGhpcyBleHBvcnQgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBvcHRpb24gc2hvdWxkIGJlIHNlbGVjdGVkIGJ5IGRlZmF1bHQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gZGVmYXVsdFNlbGVjdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1B1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1B1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I4ZTA5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BY3Rpdml0eURpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZS5EaWFncmFtSW1hZ2VTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5BYnN0cmFjdFZpZXdCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBUaGUgcHVibGlzaCBjb25maWd1cmF0aW9uIHByb2dyZXNzIGRpYWxvZy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZyBleHRlbmRzIFByb2dyZXNzTW9uaXRvckRpYWxvZyB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBkaWFncmFtVmlld2VySG9sZGVyOwotCi0JcHJpdmF0ZSBBYnN0cmFjdFZpZXdCdWlsZGVyIHZpZXdCdWlsZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZyhTaGVsbCBwYXJlbnQsCi0JCQlBYnN0cmFjdFZpZXdCdWlsZGVyIHZpZXdCdWlsZGVyKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMudmlld0J1aWxkZXIgPSB2aWV3QnVpbGRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBjdHJsID0gc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCWlmICh2aWV3QnVpbGRlciAhPSBudWxsKSB7Ci0JCQkvLyBDcmVhdGUgdGhlIGRpYWdyYW0gdmlld2VyIGhvbGRlciBhbmQgdGhlIGRpYWdyYW0gc2VydmljZS4KLQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkJZGlhZ3JhbVZpZXdlckhvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgxLCAxKSk7Ci0JCQlkaWFncmFtVmlld2VySG9sZGVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJCUVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1nciA9IHZpZXdCdWlsZGVyLmdldExheW91dE1ncigpOwotCQkJU3RyaW5nIG5ld0RpYWdyYW1zID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygiUFVCTElTSF9ORVdfRElBR1JBTSIpOyAvLyROT04tTkxTLTEkCi0JCQlCb29sZWFuIG5ld0RpYWdyYW0gPSBuZXcgQm9vbGVhbih0cnVlKTsKLQkJCWlmKG5ld0RpYWdyYW1zICE9IG51bGwgJiYgbmV3RGlhZ3JhbXMubGVuZ3RoKCkgPiAwKXsKLQkJCQluZXdEaWFncmFtID0gbmV3IEJvb2xlYW4obmV3RGlhZ3JhbXMpOwotCQkJfQotCQkJaWYgKG5ld0RpYWdyYW0uYm9vbGVhblZhbHVlKCkpIHsKLQkJCQlEaWFncmFtSW1hZ2VTZXJ2aWNlIGRpYWdyYW1TZXJ2aWNlID0gbmV3IERpYWdyYW1JbWFnZVNlcnZpY2UoCi0JCQkJCQlkaWFncmFtVmlld2VySG9sZGVyLAotCQkJCQkJbmV3IEZpbGUobGF5b3V0TWdyLmdldFB1Ymxpc2hEaXIoKSkpOwotCQkJCWRpYWdyYW1TZXJ2aWNlLnNldENvbmZpZyhsYXlvdXRNZ3IuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlkaWFncmFtU2VydmljZS5zZXRQdWJsaXNoZWRVbkNyZWF0ZWRBREQodmlld0J1aWxkZXIKLQkJCQkJCS5nZXRPcHRpb25zKCkuaXNQdWJsaXNoVW5vcGVuQUREKCkpOwotCQkJCWRpYWdyYW1TZXJ2aWNlLnNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKHZpZXdCdWlsZGVyCi0JCQkJCQkuZ2V0T3B0aW9ucygpLmlzUHVibGlzaEJhc2VBRCgpKTsKLQkJCQlsYXlvdXRNZ3Iuc2V0QWN0aXZpdHlEaWFncmFtU2VydmljZShkaWFncmFtU2VydmljZSk7Ci0JCQl9IGVsc2UgewotCQkJCUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UgZGlhZ3JhbVNlcnZpY2UgPSBuZXcgQWN0aXZpdHlEaWFncmFtU2VydmljZSgKLQkJCQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIsCi0JCQkJCQluZXcgRmlsZShsYXlvdXRNZ3IuZ2V0UHVibGlzaERpcigpKSk7Ci0JCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0UHVibGlzaGVkVW5DcmVhdGVkQUREKHZpZXdCdWlsZGVyCi0JCQkJCQkuZ2V0T3B0aW9ucygpLmlzUHVibGlzaFVub3BlbkFERCgpKTsKLQkJCQlkaWFncmFtU2VydmljZS5zZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbih2aWV3QnVpbGRlcgotCQkJCQkJLmdldE9wdGlvbnMoKS5pc1B1Ymxpc2hCYXNlQUQoKSk7Ci0JCQkJbGF5b3V0TWdyLnNldEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoZGlhZ3JhbVNlcnZpY2UpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGN0cmw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBXaW5kb3cuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCQotCQl2aWV3QnVpbGRlciA9IG51bGw7Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1B1Ymxpc2hpbmdPcGVyYXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1B1Ymxpc2hpbmdPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQxMDk0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoaW5nT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuQWJzdHJhY3RQdWJsaXNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5BYnN0cmFjdFZpZXdCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hIVE1MT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLlByb2dyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdlYkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV29ya2JlbmNoQnJvd3NlclN1cHBvcnQ7Ci0KLS8qKgotICogUGVyZm9ybXMgdGhlIHJlYWwgd29yayBvZiBwdWJsaXNoaW5nIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hpbmdPcGVyYXRpb24gaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ09ORklHX0VSUk9SX1RJVExFID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJR19FUlJPUl9NU0cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0Vycm9yX21zZzsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ09ORklHX0VSUk9SX1JFQVNPTiA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRXJyb3JfcmVhc29uOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFVklFV19DT05GSUdfRVJST1JfVElUTEUgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHJldmlld0NvbmZpZ0Vycm9yX3RpdGxlOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFVklFV19DT05GSUdfRVJST1JfTVNHID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnByZXZpZXdDb25maWdFcnJvcl9tc2c7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX1JFUE9SVF9FUlJPUl9USVRMRSA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy52aWV3UmVwb3J0RXJyb3JfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX1JFUE9SVF9FUlJPUl9NU0cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMudmlld1JlcG9ydEVycm9yX21zZzsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX0JST1dTRVJfRVJST1JfUkVBU09OID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLm9wZW5Ccm93c2VyRXJyb3JfcmVhc29uOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DT05GSUdfQ0FOQ0VMX01TRyA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5jYW5jZWxQdWJsaXNoQ29uZmlnX21zZzsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyIHB1Ymxpc2hNZ3I7Ci0KLQlwcml2YXRlIFN0cmluZyBwdWJsaXNoZWRfdXJsOwotCi0JcHJpdmF0ZSBTdHJpbmcgcmVwb3J0X3VybDsKLQotCXByaXZhdGUgTXNnRGlhbG9nIG1zZ0RpYWxvZzsKLQotCXByaXZhdGUgRXhjZXB0aW9uIHJ1bkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hpbmdPcGVyYXRpb24oQWJzdHJhY3RQdWJsaXNoTWFuYWdlciBwdWJsaXNoTWdyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucHVibGlzaE1nciA9IHB1Ymxpc2hNZ3I7Ci0JCXRoaXMubXNnRGlhbG9nID0gUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHZpZXcgYnVpbGRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIEFic3RyYWN0Vmlld0J1aWxkZXIKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RWaWV3QnVpbGRlciBnZXRWaWV3QnVpbGRlcigpIHsKLQkJcmV0dXJuIHRoaXMucHVibGlzaE1nci5nZXRWaWV3QnVpbGRlcigpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgdXJsIGZvciB0aGUgcHVibGlzaGVkIHNpdGUKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaGVkVXJsKCkgewotCQlyZXR1cm4gcHVibGlzaGVkX3VybDsKLQl9Ci0KLQkvKioKLQkgKiBydW4gdGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIHRoZSBwdWJsaXNoaW5nIHRhc2suCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCi0JCXRyeSB7Ci0JCQlfcnVuSXQobW9uaXRvcik7Ci0JCX0gZmluYWxseSB7Ci0JCQl0aGlzLnB1Ymxpc2hNZ3IgPSBudWxsOwotCQkJdGhpcy5tc2dEaWFsb2cgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcnVuIHRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSB0aGUgcHVibGlzaGluZyB0YXNrLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIF9ydW5JdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlydW5FeGNlcHRpb24gPSBudWxsOwotCQl0cnkgewotCQkJbW9uaXRvcgotCQkJCQkuc2V0VGFza05hbWUoUHVibGlzaGluZ1Jlc291cmNlcy5wdWJsaXNoaW5nQ29uZmlndXJhdGlvblRhc2tfbmFtZSk7IC8vJE5PTi1OTFMtMSQJCQkKLQkJCXB1Ymxpc2hNZ3IucHVibGlzaChtb25pdG9yKTsKLQotCQkJcHVibGlzaGVkX3VybCA9IHB1Ymxpc2hNZ3IuZ2V0UHVibGlzaGVkVXJsKCk7Ci0JCQlyZXBvcnRfdXJsID0gcHVibGlzaE1nci5nZXRQdWJsaXNoUmVwb3J0VXJsKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlydW5FeGNlcHRpb24gPSBlOwotCQl9Ci0KLQkJZmluYWwgYm9vbGVhbiBjYW5jZWxlZCA9IG1vbml0b3IuaXNDYW5jZWxlZCgpOwotCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoY2FuY2VsZWQpIHsKLQkJCQkJbXNnRGlhbG9nLmRpc3BsYXlJbmZvKFBVQkxJU0hfQ09ORklHX0VSUk9SX1RJVExFLAotCQkJCQkJCVBVQkxJU0hfQ09ORklHX0NBTkNFTF9NU0cpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaWYgKHJlcG9ydF91cmwgPT0gbnVsbCkgewotCQkJCQltc2dEaWFsb2cuZGlzcGxheUVycm9yKFBVQkxJU0hfQ09ORklHX0VSUk9SX1RJVExFLAotCQkJCQkJCVBVQkxJU0hfQ09ORklHX0VSUk9SX01TRywKLQkJCQkJCQlQVUJMSVNIX0NPTkZJR19FUlJPUl9SRUFTT04sIHJ1bkV4Y2VwdGlvbik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlQdWJsaXNoT3B0aW9ucyBvcHRpb25zID0gcHVibGlzaE1nci5nZXRWaWV3QnVpbGRlcigpCi0JCQkJCQkuZ2V0T3B0aW9ucygpOwotCQkJCWJvb2xlYW4gdG9PcGVuUHVibGlzaGVkVXJpID0gZmFsc2U7Ci0JCQkJaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBQdWJsaXNoSFRNTE9wdGlvbnMpIHsKLQkJCQkJaWYgKCEoKFB1Ymxpc2hIVE1MT3B0aW9ucykgb3B0aW9ucykKLQkJCQkJCQkuaXNQdWJsaXNoRHluYW1pY1dlYkFwcCgpKSB7Ci0JCQkJCQl0b09wZW5QdWJsaXNoZWRVcmkgPSB0cnVlOwotCQkJCQkJaWYgKHB1Ymxpc2hlZF91cmwgPT0gbnVsbCkgewotCQkJCQkJCW1zZ0RpYWxvZy5kaXNwbGF5RXJyb3IoUFVCTElTSF9DT05GSUdfRVJST1JfVElUTEUsCi0JCQkJCQkJCQlQVUJMSVNIX0NPTkZJR19FUlJPUl9NU0csCi0JCQkJCQkJCQlQVUJMSVNIX0NPTkZJR19FUlJPUl9SRUFTT04sIHJ1bkV4Y2VwdGlvbik7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJLy8gcmVtb3ZlZCBsYXVuY2ggb2YgcHVibGlzaGVkX3VybAotCQkJCS8vIGJlY2F1c2UgbGF1bmNoaW5nIDIgVVJMUyBhdCBuZWFybHkgdGhlIHNhbWUgdGltZSAKLQkJCQkvLyB3YXMgY2F1c2luZyBwcm9ibGVtcyB3aXRoIElFNyAmIEZpcmVmb3gKLQkJCQkvLyBpbnN0ZWFkLCB0aGUgcmVwb3J0IEhUTUwgZmlsZSBoYXMgYW4KLQkJCQkvLyBvbmxvYWQgc2NyaXB0IG9mIHRoZSBib2R5IGVsZW1lbnQgdGhhdCB3aWxsCi0JCQkJLy8gbG9hZCB0aGUgcHVibGlzaGVkIHVybAotCQkJCQotCQkJCS8vIExhdW5jaCBhIEhUTUwgYnJvd3NlciB0byB2aWV3IHRoZSBwdWJsaXNoZWQgc2l0ZS4KLQkJCQlpZiAodG9PcGVuUHVibGlzaGVkVXJpICYmIG9wZW5Ccm93c2VyKHB1Ymxpc2hlZF91cmwpID09IGZhbHNlKSB7Ci0JCQkJCVN0cmluZyByZWFzb24gPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQlPUEVOX0JST1dTRVJfRVJST1JfUkVBU09OLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IHB1Ymxpc2hlZF91cmwgfSk7Ci0JCQkJCW1zZ0RpYWxvZy5kaXNwbGF5RXJyb3IoUFJFVklFV19DT05GSUdfRVJST1JfVElUTEUsCi0JCQkJCQkJUFJFVklFV19DT05GSUdfRVJST1JfTVNHLCByZWFzb24pOwotCQkJCX0KLQotCi0JCQkJLy8gTGF1bmNoIGEgSFRNTCBicm93c2VyIHRvIHZpZXcgdGhlIHJlcG9ydCBvbiB0aGUgcHVibGlzaGVkCi0JCQkJLy8gc2l0ZS4KLQkJCQlpZiAob3BlblNXVEJyb3dzZXIocmVwb3J0X3VybCkgPT0gZmFsc2UpIHsKLQkJCQkJU3RyaW5nIHJlYXNvbiA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCU9QRU5fQlJPV1NFUl9FUlJPUl9SRUFTT04sCi0JCQkJCQkJbmV3IE9iamVjdFtdIHsgcmVwb3J0X3VybCB9KTsKLQkJCQkJbXNnRGlhbG9nLmRpc3BsYXlFcnJvcihWSUVXX1JFUE9SVF9FUlJPUl9USVRMRSwKLQkJCQkJCQlWSUVXX1JFUE9SVF9FUlJPUl9NU0csIHJlYXNvbik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gb3BlblNXVEJyb3dzZXIoZmluYWwgU3RyaW5nIHVybFN0cmluZykgewotCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKERpc3BsYXkuZ2V0RGVmYXVsdCgpLCBTV1QuU0hFTExfVFJJTSk7Ci0JCQlzaGVsbC5zZXRUZXh0KHVybFN0cmluZyk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCUJyb3dzZXIgcG9wdXBfYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQlwb3B1cF9icm93c2VyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQkJcG9wdXBfYnJvd3Nlci5zZXRVcmwodXJsU3RyaW5nKTsKLQkJCXNoZWxsLm9wZW4oKTsKLQkJCXN1Y2Nlc3MgPSB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCVB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQl9Ci0JCXJldHVybiBzdWNjZXNzOwotCX0KLQotCS8qKgotCSAqIG9wZW4gYSBicm93c2VyIHRvIHNob3cgdGhlIHB1Ymxpc2hlZCBjb250ZW50LgotCSAqIAotCSAqIEBwYXJhbSB1cmxTdHJpbmcKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgc2l0ZSB1cmwKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBicm93c2VyIG9wZW5lZCBzdWNjZXNzZnVsbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gb3BlbkJyb3dzZXIoZmluYWwgU3RyaW5nIHVybFN0cmluZykgewotCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIndpbjMyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXN1Y2Nlc3MgPSBQcm9ncmFtLmxhdW5jaCh1cmxTdHJpbmcpOwotCQkJfSBlbHNlIHsKLQkJCQlzdWNjZXNzID0gdHJ1ZTsKLQkJCQlJV2ViQnJvd3NlciBicm93c2VyID0gbnVsbDsKLQkJCQlJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQgYnJvd3NlclN1cHBvcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEJyb3dzZXJTdXBwb3J0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJYnJvd3NlciA9IGJyb3dzZXJTdXBwb3J0LmdldEV4dGVybmFsQnJvd3NlcigpOwotCQkJCQlpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkJCQlVUkwgdXJsID0gbmV3IEZpbGUodXJsU3RyaW5nKS50b1VSTCgpOwotCQkJCQkJYnJvd3Nlci5vcGVuVVJMKHVybCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleCkgewotCQkJCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsKLQkJCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXN1Y2Nlc3MgPSBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBzdWNjZXNzOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdENvbmZpZ1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdENvbmZpZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThiMDY2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3RDb25maWdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHRvCi0gKiBwdWJsaXNoLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdENvbmZpZ1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIHBhZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RDb25maWdQYWdlLmNsYXNzLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBUYWJsZSB0YWJsZTsKLQotCXByb3RlY3RlZCBUYWJsZVZpZXdlciBjb25maWdWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBicmllZkRlc2NUZXh0OwotCi0JcHJvdGVjdGVkIExpc3QgcHJvY2Vzc1ZpZXdzOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzZWxlY3RlZENvbmZpZ05hbWU7Ci0KLQkvKioKLQkgKiAKLQkgKiBAYXV0aG9yIHNrYW5ub29yCi0JICogQGRlcHJlY2F0ZWQgKHNlZSBiZWxvdyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIuKQotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBDb25maWd1cmF0aW9uVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotCQkJaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBpbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBpbmRleCkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgZWxlbWVudDsKLQkJCXJldHVybiBjb25maWcuZ2V0TmFtZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0Q29sdW1uVGV4dChvYmplY3QsIGNvbHVtbkluZGV4KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0Q29sdW1uSW1hZ2Uob2JqZWN0LCBjb2x1bW5JbmRleCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0Q29uZmlnUGFnZSgpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoUHVibGlzaGluZ1VJUmVzb3VyY2VzLnNlbGVjdENvbmZpZ1dpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0Q29uZmlnV2l6YXJkUGFnZV90ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9QdWJsaXNoQ29uZmlndXJhdGlvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY29uZmlnTGFiZWxfdGV4dCk7Ci0KLQkJdGFibGUgPSBuZXcgVGFibGUoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDEyMDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMjgwOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQljb25maWdWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1RFWFQpOwotCi0JCWJyaWVmRGVzY1RleHQgPSBjcmVhdGVNdWx0aUxpbmVUZXh0KGNvbXBvc2l0ZSwgIiIsIDM2MCwgODAsIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCi0JCVBsYXRmb3JtVUkKLQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJLnNldEhlbHAoCi0JCQkJCQljb21wb3NpdGUsCi0JCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5DT05GSUdVUkFUSU9OX1BVQkxJU0hfV0laQVJEX0FMTF9QQUdFU19DT05URVhUKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMgd2l0aCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250cm9scygpIHsKLQkJLy8gY29uZmlnVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IENvbmZpZ3VyYXRpb25UYWJsZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCWNvbmZpZ1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljb25maWdWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbltdIGNvbmZpZ3MgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbnMoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQlMaXN0PE9iamVjdD4gY29uZmlnc0xpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJY29uZmlnc0xpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QoY29uZmlncykpOwotCQlDb2xsZWN0aW9ucy5zb3J0KGNvbmZpZ3NMaXN0LCBDb21wYXJhdG9ycy5ERUZBVUxUX0NPTVBBUkFUT1IpOwotCQljb25maWdWaWV3ZXIuc2V0SW5wdXQoY29uZmlnc0xpc3QudG9BcnJheSgpKTsKLQkJLy8gY29uZmlnVmlld2VyLnNldElucHV0KGNvbmZpZ3MpOwotCi0JCWlmIChjb25maWdzLmxlbmd0aCA+IDApIHsKLQkJCS8vIFNlbGVjdCB0aGUgZmlyc3QgY29uZmlnIGFuZCBkaXNwbGF5IGl0cyBicmllZiBkZXNjcmlwdGlvbi4KLQkJCXRhYmxlLnNlbGVjdCgwKTsKLQkJCXNldEJyaWVmRGVzY3JpcHRpb24oY29uZmlnc1swXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIHRvIHRoZSB3aXphcmQgcGFnZSBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWNvbmZpZ1ZpZXdlcgotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCQlPYmplY3RbXSBjb25maWdzID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCQkJCQlzZXRCcmllZkRlc2NyaXB0aW9uKChNZXRob2RDb25maWd1cmF0aW9uKSBjb25maWdzWzBdKTsKLQkJCQkJCX0KLQkJCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShMaWJyYXJ5VUlSZXNvdXJjZXMubm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQotCQlpZiAodGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSA+IDApIHsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlzZWxlY3RlZENvbmZpZ05hbWUgPSBpdGVtc1swXS5nZXRUZXh0KCk7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIHNlbGVjdGVkQ29uZmlnTmFtZSk7Ci0JCQlwcm9jZXNzVmlld3MgPSBudWxsOwotCQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQkJcHJvY2Vzc1ZpZXdzID0gZ2V0VmFsaWRDb25maWdWaWV3cyhjb25maWcpOwotCQkJfQotCi0JCQlpZiAocHJvY2Vzc1ZpZXdzICE9IG51bGwgJiYgcHJvY2Vzc1ZpZXdzLnNpemUoKSA+IDApIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5taXNzaW5nVmlld0Vycm9yX21zZyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNnZXROZXh0UGFnZURhdGEoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TmV4dFBhZ2VEYXRhKCkgewotCQlyZXR1cm4gZ2V0Q29uZmlnTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYSBsaXN0IG9mIHZhbGlkIGNvbmZpZ3VyYXRpb24gdmlld3MuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGNvbmZpZ3VyYXRpb24gdmlld3MKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdDxDb250ZW50Q2F0ZWdvcnk+IGdldFZhbGlkQ29uZmlnVmlld3MoCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlTdHJpbmcgbXNnOwotCQlTdHJpbmdCdWZmZXIgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTGlzdDxDb250ZW50Q2F0ZWdvcnk+IHZpZXdzID0gbmV3IEFycmF5TGlzdDxDb250ZW50Q2F0ZWdvcnk+KCk7Ci0JCWZvciAoSXRlcmF0b3I8Q29udGVudENhdGVnb3J5PiBpdCA9IGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKS5pdGVyYXRvcigpOyBpdAotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgdmlldyA9IGl0Lm5leHQoKTsKLQkJCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmlzQ29udHJpYnV0b3IodmlldykpIHsKLQkJCQltc2cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkVmlld0NvbnRyaWJ1dG9ySW5mb19tc2csCi0JCQkJCQl2aWV3LmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQkJbWVzc2FnZS5hcHBlbmQoU3RyVXRpbC5UQUIpLmFwcGVuZChtc2cpLmFwcGVuZCgKLQkJCQkJCVN0clV0aWwuTElORV9GRUVEKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmlldyA9IChDb250ZW50Q2F0ZWdvcnkpIENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCS5nZXRDYWxjdWxhdGVkRWxlbWVudCh2aWV3LCBjb25maWcpOwotCQkJCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCQkJaWYgKHZpZXdzLmNvbnRhaW5zKHZpZXcpKSB7Ci0JCQkJCQltc2cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRWaWV3U2FtZVZpZXdJbmZvX21zZywKLQkJCQkJCQkJCQl2aWV3LmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQkJCQltZXNzYWdlLmFwcGVuZChTdHJVdGlsLlRBQikuYXBwZW5kKG1zZykuYXBwZW5kKAotCQkJCQkJCQlTdHJVdGlsLkxJTkVfRkVFRCk7Ci0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXZpZXdzLmFkZCh2aWV3KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChtZXNzYWdlLmxlbmd0aCgpID4gMCkgewotCQkJbXNnID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJpbmQoCi0JCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkVmlld3NJbmZvX21zZywgY29uZmlnCi0JCQkJCQkJLmdldE5hbWUoKSk7Ci0JCQltZXNzYWdlLmluc2VydCgwLCBtc2cgKyBTdHJVdGlsLkxJTkVfRkVFRCArIFN0clV0aWwuTElORV9GRUVEKTsKLQotCQkJLy8gRklYTUUhIFNob3VsZCBub3QgZGlzcGxheSB3YXJuaW5nIG1lc3NhZ2VzIGluIHRoZSBicmllZgotCQkJLy8gZGVzY3JpcHRpb24gZmllbGQuCi0JCQlicmllZkRlc2NUZXh0LnNldFRleHQobWVzc2FnZS50b1N0cmluZygpKTsKLQkJfQotCi0JCXJldHVybiB2aWV3czsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHVzZXIgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnTmFtZSgpIHsKLQkJcmV0dXJuIHNlbGVjdGVkQ29uZmlnTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgdGhlIEJyaWVmIERlc2NyaXB0aW9uIHRleHQgY29udHJvbCB3aXRoIHRoZSBnaXZlbgotCSAqIGNvbmZpZ3VyYXRpb24ncyBicmllZiBkZXNjcmlwb3Rpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEJyaWVmRGVzY3JpcHRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJYnJpZWZEZXNjVGV4dC5zZXRUZXh0KGNvbmZpZy5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0Q29udGVudFBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdENvbnRlbnRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZDRhMmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0Q29udGVudFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzLlByb2Nlc3NUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzLlByb2Nlc3NUcmVlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS52aWV3cy5Qcm9jZXNzVHJlZVVJRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXMuUHVibGlzaGluZ1VJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHB1Ymxpc2ggdGhlIGVudGlyZSBtZXRob2QKLSAqIGNvbmZpZ3VyYXRpb24gb3Igb25seSBzcGVjaWZpYyBwcm9jZXNzZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0Q29udGVudFBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdENvbnRlbnRQYWdlLmNsYXNzLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBCdXR0b24gcHVibGlzaENvbmZpZ1JhZGlvQnV0dG9uOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBwdWJsaXNoUHJvY2Vzc2VzUmFkaW9CdXR0b247Ci0KLQlwcm90ZWN0ZWQgQ2hlY2tib3hUcmVlVmlld2VyIHByb2Nlc3NWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGluY2x1ZGVCYXNlUHJvY2Vzc2VzQ2hlY2tib3g7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgUHJvY2Vzc1ZpZXdlckNvbnRlbnRQcm92aWRlciBleHRlbmRzCi0JCQlQcm9jZXNzVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0KLQkJcHJpdmF0ZSBMaXN0PE1ldGhvZFBhY2thZ2U+IHBhY2thZ2VzID0gbmV3IEFycmF5TGlzdDxNZXRob2RQYWNrYWdlPigpOwotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKFZpZXdlciwKLQkJICogICAgICBPYmplY3QsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJc3VwZXIuaW5wdXRDaGFuZ2VkKHZpZXdlciwgb2xkSW5wdXQsIG5ld0lucHV0KTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBwYXJlbnRFbGVtZW50OwotCQkJCUxpc3Q8T2JqZWN0PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCXBhY2thZ2VzID0gY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJCQlMaXN0PE1ldGhvZFBsdWdpbj4gcGx1Z2lucyA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZFBsdWdpbj4gaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gaXQubmV4dCgpOwotCQkJCQlMaXN0PFByb2Nlc3M+IHByb2Nlc3NlcyA9IFRuZ1V0aWwuZ2V0QWxsUHJvY2Vzc2VzKHBsdWdpbik7Ci0JCQkJCWlmIChwcm9jZXNzZXMuc2l6ZSgpID4gMCkgewotCQkJCQkJY2hpbGRyZW4uYWRkKHBsdWdpbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGNoaWxkcmVuLnRvQXJyYXkoKTsKLQkJCX0gZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NUcmVlVUlGb2xkZXIpIHsKLQkJCQlQcm9jZXNzVHJlZVVJRm9sZGVyIHVpRm9sZGVyID0gKFByb2Nlc3NUcmVlVUlGb2xkZXIpIHBhcmVudEVsZW1lbnQ7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHVpRm9sZGVyLmdldFBhcmVudCgpOwotCQkJCWlmICh1aUZvbGRlci5nZXROYW1lKCkgPT0gQ0FQQUJJTElUWV9QQVRURVJOUykgewotCQkJCQlMaXN0PENhcGFiaWxpdHlQYXR0ZXJuPiBzZWxlY3RlZENhcGFiaWxpdHlQYXR0ZXJucyA9IG5ldyBBcnJheUxpc3Q8Q2FwYWJpbGl0eVBhdHRlcm4+KCk7Ci0JCQkJCUxpc3Q8Q2FwYWJpbGl0eVBhdHRlcm4+IGNhcGFiaWxpdHlQYXR0ZXJucyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCQkJCS5nZXRDYXBhYmlsaXR5UGF0dGVybnMocGx1Z2luKTsKLQkJCQkJZm9yIChJdGVyYXRvcjxDYXBhYmlsaXR5UGF0dGVybj4gaXQgPSBjYXBhYmlsaXR5UGF0dGVybnMKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQkJQ2FwYWJpbGl0eVBhdHRlcm4gY3AgPSBpdC5uZXh0KCk7Ci0JCQkJCQlQcm9jZXNzUGFja2FnZSBwa2cgPSBVbWFVdGlsLmdldFByb2Nlc3NQYWNrYWdlKGNwKTsKLQkJCQkJCWlmIChwYWNrYWdlcy5jb250YWlucyhwa2cpKSB7Ci0JCQkJCQkJc2VsZWN0ZWRDYXBhYmlsaXR5UGF0dGVybnMuYWRkKGNwKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gc2VsZWN0ZWRDYXBhYmlsaXR5UGF0dGVybnMudG9BcnJheSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUxpc3Q8RGVsaXZlcnlQcm9jZXNzPiBzZWxlY3RlZERlbGl2ZXJ5UHJvY2Vzc2VzID0gbmV3IEFycmF5TGlzdDxEZWxpdmVyeVByb2Nlc3M+KCk7Ci0JCQkJCUxpc3Q8RGVsaXZlcnlQcm9jZXNzPiBkZWxpdmVyeVByb2Nlc3NlcyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NlcyhwbHVnaW4pOwotCQkJCQlmb3IgKEl0ZXJhdG9yPERlbGl2ZXJ5UHJvY2Vzcz4gaXQgPSBkZWxpdmVyeVByb2Nlc3NlcwotCQkJCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlEZWxpdmVyeVByb2Nlc3MgZHAgPSBpdC5uZXh0KCk7Ci0JCQkJCQlQcm9jZXNzUGFja2FnZSBwa2cgPSBVbWFVdGlsLmdldFByb2Nlc3NQYWNrYWdlKGRwKTsKLQkJCQkJCWlmIChwYWNrYWdlcy5jb250YWlucyhwa2cpKSB7Ci0JCQkJCQkJc2VsZWN0ZWREZWxpdmVyeVByb2Nlc3Nlcy5hZGQoZHApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBzZWxlY3RlZERlbGl2ZXJ5UHJvY2Vzc2VzLnRvQXJyYXkoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdENvbnRlbnRQYWdlKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0Q29udGVudFdpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0Q29udGVudFdpemFyZFBhZ2VfdGV4dCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIDEpOwotCi0JCXB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKGNvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ1JhZGlvQnV0dG9uX3RleHQsIDEsIHRydWUpOwotCi0JCXB1Ymxpc2hQcm9jZXNzZXNSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKGNvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaFByb2Nlc3Nlc1JhZGlvQnV0dG9uX3RleHQsIDEsCi0JCQkJZmFsc2UpOwotCi0JCUNvbXBvc2l0ZSBwcm9jZXNzQ29tcG9zaXRlID0gY3JlYXRlQ2hpbGRHcmlkTGF5b3V0Q29tcG9zaXRlKGNvbXBvc2l0ZSwKLQkJCQkxKTsKLQotCQlwcm9jZXNzVmlld2VyID0gbmV3IENoZWNrYm94VHJlZVZpZXdlcihwcm9jZXNzQ29tcG9zaXRlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RICi0JCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMzAwOwotCQlwcm9jZXNzVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlpbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3gocHJvY2Vzc0NvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW5jbHVkZUJhc2VQcm9jZXNzZXNDaGVja2JveExhYmVsX3RleHQpOwotCi0JCWluaXRDb250cm9scygpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMgd2l0aCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250cm9scygpIHsKLQkJcHJvY2Vzc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFByb2Nlc3NWaWV3ZXJDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXByb2Nlc3NWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgUHJvY2Vzc1RyZWVMYWJlbFByb3ZpZGVyKCkpOwotCi0JCVN0cmluZyBjb25maWdJZCA9IGNvbmZpZyAhPSBudWxsID8gY29uZmlnLmdldEd1aWQoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gcHVibGlzaENvbmZpZyA9IFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldFB1Ymxpc2hFbnRpcmVDb25maWcoY29uZmlnSWQpOwotCQlwdWJsaXNoQ29uZmlnUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHB1Ymxpc2hDb25maWcpOwotCQlwdWJsaXNoUHJvY2Vzc2VzUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKCFwdWJsaXNoQ29uZmlnKTsKLQkJcHJvY2Vzc1ZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZCghcHVibGlzaENvbmZpZyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBldmVudCBoYW5kbGVycyB0byB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlwdWJsaXNoQ29uZmlnUmFkaW9CdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCXB1Ymxpc2hQcm9jZXNzZXNSYWRpb0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJaW5jbHVkZUJhc2VQcm9jZXNzZXNDaGVja2JveC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQotCQlwcm9jZXNzVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlPYmplY3QgY2hlY2tlZEVsZW1lbnQgPSBldmVudC5nZXRFbGVtZW50KCk7Ci0JCQkJYm9vbGVhbiBjaGVja2VkID0gZXZlbnQuZ2V0Q2hlY2tlZCgpOwotCi0JCQkJcHJvY2Vzc1ZpZXdlci5zZXRDaGVja2VkKGNoZWNrZWRFbGVtZW50LCBjaGVja2VkKTsKLQkJCQlwcm9jZXNzVmlld2VyLnNldFN1YnRyZWVDaGVja2VkKGNoZWNrZWRFbGVtZW50LCBjaGVja2VkKTsKLQkJCQlpZiAoaW5jbHVkZUJhc2VQcm9jZXNzZXNDaGVja2JveC5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlzZWxlY3RCYXNlUHJvY2Vzc2VzKCk7Ci0JCQkJfQotCQkJCXVwZGF0ZUNoZWNrZWRTdGF0ZXMoKTsKLQotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgY2hlY2sgc3RhdGVzIG9mIHByb2Nlc3MgdHJlZSB2aWV3ZXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNoZWNrZWRTdGF0ZXMoKSB7Ci0JCUlUcmVlQ29udGVudFByb3ZpZGVyIGNwID0gKElUcmVlQ29udGVudFByb3ZpZGVyKSBwcm9jZXNzVmlld2VyCi0JCQkJLmdldENvbnRlbnRQcm92aWRlcigpOwotCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIHBsdWdpbnMgPSBjcC5nZXRDaGlsZHJlbihjb25maWcpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJT2JqZWN0W10gdWlGb2xkZXJzID0gY3AuZ2V0Q2hpbGRyZW4ocGx1Z2luc1tpXSk7Ci0JCQkJaW50IHRvdGFsVUlGb2xkZXJzID0gdWlGb2xkZXJzLmxlbmd0aDsKLQkJCQlpbnQgY2hlY2tlZFVJRm9sZGVycyA9IDA7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCB1aUZvbGRlcnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJT2JqZWN0W10gcHJvY2Vzc2VzID0gY3AuZ2V0Q2hpbGRyZW4odWlGb2xkZXJzW2pdKTsKLQkJCQkJaW50IHRvdGFsUHJvY2Vzc2VzID0gcHJvY2Vzc2VzLmxlbmd0aDsKLQkJCQkJaW50IGNoZWNrZWRQcm9jZXNzZXMgPSAwOwotCQkJCQlmb3IgKGludCBrID0gMDsgayA8IHByb2Nlc3Nlcy5sZW5ndGg7IGsrKykgewotCQkJCQkJaWYgKHByb2Nlc3NWaWV3ZXIuZ2V0Q2hlY2tlZChwcm9jZXNzZXNba10pKSB7Ci0JCQkJCQkJY2hlY2tlZFByb2Nlc3NlcysrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChjaGVja2VkUHJvY2Vzc2VzID09IDApIHsKLQkJCQkJCXByb2Nlc3NWaWV3ZXIuc2V0R3JheUNoZWNrZWQodWlGb2xkZXJzW2pdLCBmYWxzZSk7Ci0JCQkJCX0gZWxzZSBpZiAoY2hlY2tlZFByb2Nlc3NlcyA9PSB0b3RhbFByb2Nlc3NlcykgewotCQkJCQkJcHJvY2Vzc1ZpZXdlci5zZXRHcmF5ZWQodWlGb2xkZXJzW2pdLCBmYWxzZSk7Ci0JCQkJCQlwcm9jZXNzVmlld2VyLnNldENoZWNrZWQodWlGb2xkZXJzW2pdLCB0cnVlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXByb2Nlc3NWaWV3ZXIuc2V0R3JheUNoZWNrZWQodWlGb2xkZXJzW2pdLCB0cnVlKTsKLQkJCQkJfQotCQkJCQlpZiAocHJvY2Vzc1ZpZXdlci5nZXRDaGVja2VkKHVpRm9sZGVyc1tqXSkpIHsKLQkJCQkJCWNoZWNrZWRVSUZvbGRlcnMrKzsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoY2hlY2tlZFVJRm9sZGVycyA9PSB0b3RhbFVJRm9sZGVycykgewotCQkJCQlwcm9jZXNzVmlld2VyLnNldEdyYXllZChwbHVnaW5zW2ldLCBmYWxzZSk7Ci0JCQkJCXByb2Nlc3NWaWV3ZXIuc2V0Q2hlY2tlZChwbHVnaW5zW2ldLCB0cnVlKTsKLQkJCQl9IGVsc2UgaWYgKGNoZWNrZWRVSUZvbGRlcnMgPT0gMCkgewotCQkJCQlwcm9jZXNzVmlld2VyLnNldEdyYXlDaGVja2VkKHBsdWdpbnNbaV0sIGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlwcm9jZXNzVmlld2VyLnNldEdyYXlDaGVja2VkKHBsdWdpbnNbaV0sIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNlbGVjdHMgdGhlIHJlZmVyZW5jZWQgYmFzZSBwcm9jZXNzZXMgaW4gdGhlIHByb2Nlc3MgdHJlZSB2aWV3ZXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdEJhc2VQcm9jZXNzZXMoKSB7Ci0JCS8vIEdldCB0aGUgcmVmZXJlbmNlZCBiYXNlIHByb2Nlc3Nlcy4KLQkJTGlzdDxQcm9jZXNzPiBwcm9jZXNzZXMgPSBnZXRTZWxlY3RlZFByb2Nlc3NlcygpOwotCQlMaXN0PFByb2Nlc3M+IGJhc2VQcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3M+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwcm9jZXNzZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJQ29uZmlndXJhdGlvbkhlbHBlci5nZXRCYXNlUHJvY2Vzc2VzKChBY3Rpdml0eSkgaXQubmV4dCgpLCBjb25maWcsCi0JCQkJCWJhc2VQcm9jZXNzZXMpOwotCQl9Ci0KLQkJLy8gVXBkYXRlIHRoZSBwcm9jZXNzIHRyZWUgdmlld2VyLgotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYmFzZVByb2Nlc3Nlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0Lm5leHQoKTsKLQkJCXByb2Nlc3NWaWV3ZXIuc2V0Q2hlY2tlZChlbGVtZW50LCB0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQoRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJcHJvY2Vzc1ZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZCgKLQkJCQlwdWJsaXNoUHJvY2Vzc2VzUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCi0JCWlmIChldmVudC53aWRnZXQgPT0gaW5jbHVkZUJhc2VQcm9jZXNzZXNDaGVja2JveCkgewotCQkJLy8gSWYgc2VsZWN0ZWQsIHNlbGVjdCBhbGwgcmVmZXJlbmNlZCBiYXNlIHByb2Nlc3Nlcy4KLQkJCXNlbGVjdEJhc2VQcm9jZXNzZXMoKTsKLQkJCXVwZGF0ZUNoZWNrZWRTdGF0ZXMoKTsKLQkJfQotCi0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2Ujb25FbnRlclBhZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG9uRW50ZXJQYWdlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJU3RyaW5nIGNvbmZpZ05hbWUgPSAoU3RyaW5nKSBvYmo7Ci0JCQljb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZQotCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBjb25maWdOYW1lKTsKLQkJCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJCXByb2Nlc3NWaWV3ZXIuc2V0SW5wdXQoY29uZmlnKTsKLQkJCQlwcm9jZXNzVmlld2VyLmV4cGFuZEFsbCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChwdWJsaXNoQ29uZmlnUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBnZXRTZWxlY3RlZFByb2Nlc3NlcygpLnNpemUoKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNnZXROZXh0UGFnZURhdGEoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TmV4dFBhZ2VEYXRhKCkgewotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHNlbGVjdGVkIHByb2Nlc3NlcyB0byBiZSBwdWJsaXNoZWQuCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgPGNvZGU+UHJvY2VzczwvY29kZT4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRQdWJsaXNoQ29uZmlnU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gcHVibGlzaENvbmZpZ1JhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSB1c2VyIHNlbGVjdGVkIHByb2Nlc3NlcyB0byBiZSBwdWJsaXNoZWQuCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgPGNvZGU+UHJvY2VzczwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTGlzdDxQcm9jZXNzPiBnZXRTZWxlY3RlZFByb2Nlc3NlcygpIHsKLQkJTGlzdDxQcm9jZXNzPiBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3M+KCk7Ci0JCU9iamVjdFtdIHNlbGVjdGVkID0gcHJvY2Vzc1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJaWYgKHNlbGVjdGVkICE9IG51bGwgJiYgc2VsZWN0ZWQubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJCWlmIChzZWxlY3RlZFtpXSBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCQkJcHJvY2Vzc2VzLmFkZCgoUHJvY2Vzcykgc2VsZWN0ZWRbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvY2Vzc2VzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0RGVzdGluYXRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3REZXN0aW5hdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA0ZGIyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3REZXN0aW5hdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLkNvbW1vblByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgYW5kCi0gKiBmb3JtYXQgZm9yIHRoZSBwdWJsaXNoZWQgd2ViIHNpdGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0RGVzdGluYXRpb25QYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0RGVzdGluYXRpb25QYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9ERUxJTUlURVIgPSAifCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQTElUX1BSRUZFUkVOQ0VfREVMSU1JVEVSID0gIlxcIiArIFBSRUZFUkVOQ0VfREVMSU1JVEVSOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRQYXRoID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCS5nZXREZWZhdWx0UHVibGlzaFBhdGgoKTsKLQotCXByb3RlY3RlZCBTaGVsbCBzaGVsbDsKLQotCXByb3RlY3RlZCBDb21ibyBkaXJDb21ibzsKLQotCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0JcHJvdGVjdGVkIEdyb3VwIHdlYkFwcEdyb3VwOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBzdGF0aWNXZWJTaXRlUmFkaW9CdXR0b247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHN0YXRpY1dlYlNpdGVDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGphdmFXZWJBcHBSYWRpb0J1dHRvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgamF2YVdlYkFwcENvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBMYWJlbCB3ZWJBcHBOYW1lTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgQ29tYm8gd2ViQXBwTmFtZUNvbWJvOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBpbmNsdWRlU2VhcmNoQ2hlY2tib3g7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQlwcm90ZWN0ZWQgTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBzZWxlY3RlZENvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3REZXN0aW5hdGlvblBhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5zZWxlY3REZXN0aW5hdGlvbldpemFyZFBhZ2VfdGl0bGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnNlbGVjdERlc3RpbmF0aW9uV2l6YXJkUGFnZV90ZXh0LAotCQkJCVB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZ1bGwvd2l6YmFuL1B1Ymxpc2hDb25maWd1cmF0aW9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdERlc3RpbmF0aW9uUGFnZSgpIHsKLQkJdGhpcyhQQUdFX05BTUUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIDEpOwotCi0JCUNvbXBvc2l0ZSBkaXJDb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKGNvbXBvc2l0ZSwgMyk7Ci0KLQkJY3JlYXRlTGFiZWwoZGlyQ29tcG9zaXRlLCBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuZGlyTGFiZWxfdGV4dCk7Ci0KLQkJZGlyQ29tYm8gPSBjcmVhdGVDb21ib2JveChkaXJDb21wb3NpdGUpOwotCi0JCWJyb3dzZUJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihkaXJDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkJST1dTRV9CVVRUT05fVEVYVCk7Ci0KLQkJd2ViQXBwR3JvdXAgPSBzdXBlci5jcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy53ZWJBcHBHcm91cF90ZXh0LCAxKTsKLQotCQlzdGF0aWNXZWJTaXRlUmFkaW9CdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbih3ZWJBcHBHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc3RhdGljV2ViU2l0ZVJhZGlvQnV0dG9uX3RleHQpOwotCi0JCXN0YXRpY1dlYlNpdGVDb21wb3NpdGUgPSBjcmVhdGVDaGlsZEdyaWRMYXlvdXRDb21wb3NpdGUod2ViQXBwR3JvdXAsIDEpOwotCi0JCWphdmFXZWJBcHBSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKHdlYkFwcEdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5keW5hbWljV2ViQXBwUmFkaW9CdXR0b25fdGV4dCk7Ci0KLQkJamF2YVdlYkFwcENvbXBvc2l0ZSA9IGNyZWF0ZUNoaWxkR3JpZExheW91dENvbXBvc2l0ZSh3ZWJBcHBHcm91cCwgMyk7Ci0KLQkJaW5jbHVkZVNlYXJjaENoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3goamF2YVdlYkFwcENvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW5jbHVkZVNlYXJjaENoZWNrYm94X3RleHQsIDMpOwotCi0JCXdlYkFwcE5hbWVMYWJlbCA9IGNyZWF0ZUxhYmVsKGphdmFXZWJBcHBDb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLndlYkFwcGxpY2F0aW9uTmFtZUxhYmVsX3RleHQpOwotCi0JCXdlYkFwcE5hbWVDb21ibyA9IGNyZWF0ZUNvbWJvYm94KGphdmFXZWJBcHBDb21wb3NpdGUsIDIpOwotCi0JCWluaXRDb250cm9scygpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMgd2l0aCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250cm9scygpIHsKLQkJU3RyaW5nIGNvbmZpZ0lkID0gY29uZmlnICE9IG51bGwgPyBjb25maWcuZ2V0R3VpZCgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgZGlyID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0UHVibGlzaFBhdGgoY29uZmlnSWQpOwotCQlpZiAoZGlyICE9IG51bGwgJiYgZGlyLmxlbmd0aCgpID4gMCkgewotCQkJZGlyQ29tYm8uc2V0SXRlbXMoc3ViQXJyYXkoY292ZXJTdHJpbmdUb0FycmF5KGRpcikpKTsKLQkJCWRpckNvbWJvLnNlbGVjdCgwKTsKLQkJfQotCi0JCWJvb2xlYW4gcHVibGlzaFN0YXRpY1dlYlNpdGUgPSBQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRQdWJsaXNoU3RhdGljV2ViU2l0ZShjb25maWdJZCk7Ci0JCXN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24ocHVibGlzaFN0YXRpY1dlYlNpdGUpOwotCQlqYXZhV2ViQXBwUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKCFwdWJsaXNoU3RhdGljV2ViU2l0ZSk7Ci0KLQkJaW5jbHVkZVNlYXJjaENoZWNrYm94LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRJbmNsdWRlU2VhcmNoKGNvbmZpZ0lkKSk7Ci0KLQkJU3RyaW5nIHdlYkFwcE5hbWUgPSBQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXRXZWJBcHBOYW1lKGNvbmZpZ0lkKTsKLQkJaWYgKHdlYkFwcE5hbWUgIT0gbnVsbCAmJiB3ZWJBcHBOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJd2ViQXBwTmFtZUNvbWJvLnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7IHdlYkFwcE5hbWUgfSk7Ci0JCQl3ZWJBcHBOYW1lQ29tYm8uc2V0VGV4dCh3ZWJBcHBOYW1lKTsKLQkJfQotCi0JCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBldmVudCBoYW5kbGVycyB0byB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlkaXJDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coc2hlbGwsCi0JCQkJCQkJU1dULk5PTkUpOwotCQkJCQlTdHJpbmcgc2VsZWN0ZWREaXIgPSBkaWFsb2cub3BlbigpOwotCQkJCQlpZiAoc2VsZWN0ZWREaXIgIT0gbnVsbCkgewotCQkJCQkJZGlyQ29tYm8uc2V0VGV4dChzZWxlY3RlZERpcik7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJc3RhdGljV2ViU2l0ZVJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVDb250cm9scygpOwotCQkJfQotCQl9KTsKLQotCQlqYXZhV2ViQXBwUmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXdlYkFwcE5hbWVDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBzdWJBcnJheShTdHJpbmdbXSBhcnIpIHsKLQkJaW50IGxsID0gQ29tbW9uUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZUhpc3RvcnlTaXplKCk7Ci0JCWlmIChsbCA8IDEpCi0JCQlsbCA9IENvbW1vblByZWZlcmVuY2VzLmdldERlZmF1bHRQcmVmZXJlbmNlSGlzdG9yeVNpemUoKTsKLQotCQlpbnQgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aDsKLQotCQlpZiAoYXJyTGVuZ3RoIDwgbGwgJiYgYXJyWzBdLmVxdWFscyhkZWZhdWx0UGF0aCkpCi0JCQlyZXR1cm4gYXJyOwotCi0JCWxsID0gYXJyTGVuZ3RoID49IGxsID8gbGwgOiBhcnJMZW5ndGggKyAxOwotCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2xsXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsbCAtIDE7IGkrKykgewotCQkJcmVzdWx0W2ldID0gYXJyW2ldOwotCQl9Ci0JCXJlc3VsdFtsbCAtIDFdID0gYXJyWzBdLmVxdWFscyhkZWZhdWx0UGF0aCkgPyBhcnJbbGxdIDogZGVmYXVsdFBhdGg7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gY292ZXJTdHJpbmdUb0FycmF5KFN0cmluZyBwcmVmZXJlbmNlU3RyKSB7Ci0JCXJldHVybiBwcmVmZXJlbmNlU3RyLnNwbGl0KFNQTElUX1BSRUZFUkVOQ0VfREVMSU1JVEVSKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRBcnJheVRvU3RyaW5nKFN0cmluZ1tdIGFycikgewotCQlTdHJpbmdCdWZmZXIgc0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKGFyciA9PSBudWxsIHx8IGFyci5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBzQnVmZmVyLnRvU3RyaW5nKCk7Ci0JCXNCdWZmZXIuYXBwZW5kKGFyclswXSk7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7Ci0JCQlzQnVmZmVyLmFwcGVuZChQUkVGRVJFTkNFX0RFTElNSVRFUik7Ci0JCQlzQnVmZmVyLmFwcGVuZChhcnJbaV0pOwotCQl9Ci0JCXJldHVybiBzQnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJYm9vbGVhbiBwdWJsaXNoU3RhdGljV2ViU2l0ZSA9IGdldFN0YXRpY1dlYlNpdGVTZWxlY3Rpb24oKTsKLQkJd2ViQXBwTmFtZUxhYmVsLnNldEVuYWJsZWQoIXB1Ymxpc2hTdGF0aWNXZWJTaXRlKTsKLQkJd2ViQXBwTmFtZUNvbWJvLnNldEVuYWJsZWQoIXB1Ymxpc2hTdGF0aWNXZWJTaXRlKTsKLQkJaW5jbHVkZVNlYXJjaENoZWNrYm94LnNldEVuYWJsZWQoIXB1Ymxpc2hTdGF0aWNXZWJTaXRlKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2Ujb25FbnRlclBhZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG9uRW50ZXJQYWdlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCWNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBvYmo7Ci0JCQlpZiAoIXNlbGVjdGVkQ29uZmlncy5jb250YWlucyhjb25maWcpKSB7Ci0JCQkJc2VsZWN0ZWRDb25maWdzLmFkZChjb25maWcpOwotCQkJCWluaXRDb250cm9scygpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCVN0cmluZyBwYXRoID0gZ2V0UHVibGlzaERpcmVjdG9yeSgpOwotCQlJUGF0aCBlY1BhdGggPSBQYXRoLmZyb21PU1N0cmluZyhwYXRoKTsKLQkJYm9vbGVhbiBpc1ZhbGlkID0gZWNQYXRoLmlzVmFsaWRQYXRoKHBhdGgpOwotCQlpZiAoIWlzVmFsaWQpIHsKLQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW52YWxpZFBhdGhFcnJvcl9tc2cpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKCFTdHJVdGlsLmlzVmFsaWRQdWJsaXNoUGF0aChwYXRoKSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkUGF0aENoYXJzRXJyb3JfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJfQotCQlpZiAocGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoIWdldFN0YXRpY1dlYlNpdGVTZWxlY3Rpb24oKSkgewotCQkJU3RyaW5nIHdlYkFwcE5hbWUgPSBnZXRXZWJBcHBOYW1lKCk7Ci0JCQlpZiAod2ViQXBwTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy53ZWJBcHBOYW1lRXJyb3JfbXNnKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgaWYgKCFTdHJVdGlsLmlzVmFsaWROYW1lKHdlYkFwcE5hbWUpKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy53ZWJBcHBOYW1lQ2hhcnNFcnJvcl9tc2cpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgcHVibGlzaCBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaXNoRGlyZWN0b3J5KCkgewotCQlTdHJpbmcgZGlyVGV4dCA9IGRpckNvbWJvLmdldFRleHQoKS50cmltKCk7Ci0JCWlmIChkaXJUZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJRmlsZSBkaXIgPSBuZXcgRmlsZShkaXJDb21iby5nZXRUZXh0KCkudHJpbSgpKTsKLQkJCXJldHVybiBkaXIuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIGRpclRleHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFB1Ymxpc2hEaXJlY3RvcnlBcnJheSgpIHsKLQkJU3RyaW5nIHNlbGVjdGVkdGV4dCA9IGRpckNvbWJvLmdldFRleHQoKTsKLQotCQlpZiAoZGlyQ29tYm8uaW5kZXhPZihzZWxlY3RlZHRleHQpID4gMCkgewotCQkJZGlyQ29tYm8ucmVtb3ZlKHNlbGVjdGVkdGV4dCk7Ci0JCX0KLQotCQlpZiAoZGlyQ29tYm8uaW5kZXhPZihzZWxlY3RlZHRleHQpIDwgMCkgewotCQkJZGlyQ29tYm8uYWRkKHNlbGVjdGVkdGV4dCwgMCk7Ci0JCX0KLQotCQlpZiAoZGlyQ29tYm8uaW5kZXhPZihkZWZhdWx0UGF0aCkgPiAwKSB7Ci0JCQlkaXJDb21iby5yZW1vdmUoZGVmYXVsdFBhdGgpOwotCQl9Ci0KLQkJcmV0dXJuIGRpckNvbWJvLmdldEl0ZW1zKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgc3RhdGljIHdlYiBzaXRlIHNlbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRTdGF0aWNXZWJTaXRlU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gc3RhdGljV2ViU2l0ZVJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGluY2x1ZGUgc2VhcmNoIHNlbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRJbmNsdWRlU2VhcmNoU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gaW5jbHVkZVNlYXJjaENoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHdlYiBhcGxpY2F0aW9uIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXZWJBcHBOYW1lKCkgewotCQlyZXR1cm4gd2ViQXBwTmFtZUNvbWJvLmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIHVzZXIgc2VsZWN0aW9ucyBpbiB0aGlzIHdpemFyZCBwYWdlIHRvIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkgewotCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCVN0cmluZyBjb25maWdJZCA9IGNvbmZpZy5nZXRHdWlkKCk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRQdWJsaXNoUGF0aChjb25maWdJZCwKLQkJCQkJY29udmVydEFycmF5VG9TdHJpbmcoZ2V0UHVibGlzaERpcmVjdG9yeUFycmF5KCkpKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFB1Ymxpc2hTdGF0aWNXZWJTaXRlKGNvbmZpZ0lkLAotCQkJCQlnZXRTdGF0aWNXZWJTaXRlU2VsZWN0aW9uKCkpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0SW5jbHVkZVNlYXJjaChjb25maWdJZCwKLQkJCQkJZ2V0SW5jbHVkZVNlYXJjaFNlbGVjdGlvbigpKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFdlYkFwcE5hbWUoY29uZmlnSWQsIGdldFdlYkFwcE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2NmMDIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHMuQWN0aXZpdHlMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaEhUTUxPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXMuUHVibGlzaGluZ1VJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCB0aGUgcHVibGlzaGluZyBvcHRpb25zIGZvciB0aGUKLSAqIGdlbmVyYXRlZCB3ZWIgc2l0ZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKiBmaXggZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDY1NjcKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBTaGVsbCBzaGVsbDsKLQotCXByb3RlY3RlZCBUZXh0IHRpdGxlVGV4dDsKLQotCXByb3RlY3RlZCBUZXh0IGFib3V0SFRNTFRleHQ7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBmZWVkYmFja1VSTFRleHQ7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHNlbGVjdEhUTUxCdXR0b247Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hHbG9zc2FyeUNoZWNrYm94OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBwdWJsaXNoSW5kZXhDaGVja2JveDsKLQotCXByb3RlY3RlZCBUZXh0IGJhbm5lckltYWdlVGV4dDsKLQotCXByb3RlY3RlZCBCdXR0b24gc2VsZWN0SW1hZ2VCdXR0b247Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNoZWNrRXh0ZXJuYWxMaW5rc0NoZWNrYm94OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjb252ZXJ0QnJva2VuTGlua3NDaGVja2JveDsKLQotCXByb3RlY3RlZCBCdXR0b24gcHVibGlzaFVub3BlbkFERENoZWNrYm94OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBwdWJsaXNoQmFzZUFEQ2hlY2tib3g7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hMaWdodFdlaWdodFRyZWVDaGVja2JveDsKLQotCXByb3RlY3RlZCBCdXR0b24gZXh0cmFEZXNjcmlwdG9ySW5mb0N0cjsKLQotCXByb3RlY3RlZCBCdXR0b24gc2hvd1JlbGF0ZWREZXNjcmlwdG9yczsKLQotCXByb3RlY3RlZCBCdXR0b24gc2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZTsKLQotCXByb3RlY3RlZCBDb21ib1ZpZXdlciBhY3Rpdml0eVRhYlZpZXdlcjsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCXByb3RlY3RlZCBMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IHNlbGVjdGVkQ29uZmlncyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4oKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBhY3Rpdml0eVRhYk1hcCA9IG5ldyBUcmVlTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0Jc3RhdGljIHsKLQkJYWN0aXZpdHlUYWJNYXAucHV0KEFjdGl2aXR5TGF5b3V0LlRBQl9OQU1FX0FDVElWSVRZX0RFU0MsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVzY3JpcHRpb25QYWdlX3RpdGxlKTsKLQkJYWN0aXZpdHlUYWJNYXAucHV0KEFjdGl2aXR5TGF5b3V0LlRBQl9OQU1FX0FDVElWSVRZX1dCUywKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1dvcmtCcmVha2Rvd25TdHJ1Y3R1cmUpOwotCQlhY3Rpdml0eVRhYk1hcC5wdXQoQWN0aXZpdHlMYXlvdXQuVEFCX05BTUVfQUNUSVZJVFlfVEJTLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfVGVhbUFsbG9jYXRpb24pOwotCQlhY3Rpdml0eVRhYk1hcC5wdXQoQWN0aXZpdHlMYXlvdXQuVEFCX05BTUVfQUNUSVZJVFlfV1BCUywKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1dvcmtQcm9kdWN0VXNhZ2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zV2l6YXJkUGFnZV90aXRsZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0UHVibGlzaGluZ09wdGlvbnNXaXphcmRQYWdlX3RleHQsCi0JCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCQkJCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKCkgewotCQl0aGlzKFBBR0VfTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMSk7Ci0KLQkJY3JlYXRlVGl0bGVBbmRMaW5rc0dyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUdsb3NzYXJ5QW5kSW5kZXhHcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVMb29rQW5kRmVlbEdyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZVZhbGlkYXRpb24oY29tcG9zaXRlKTsKLQkJY3JlYXRlRGlhZ3JhbUdlbmVyYXRpb25Hcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVMYXlvdXRHcm91cChjb21wb3NpdGUpOwotCi0JCWluaXRDb250cm9scygpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQlQbGF0Zm9ybVVJCi0JCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCS5zZXRIZWxwKAotCQkJCQkJY29tcG9zaXRlLAotCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuQ09ORklHVVJBVElPTl9QVUJMSVNIX1dJWkFSRF9BTExfUEFHRVNfQ09OVEVYVCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGl0bGUgYW5kIGxpbmtzIGdyb3VwLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiB0aGUgZ3JvdXAgY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIEdyb3VwIGNyZWF0ZVRpdGxlQW5kTGlua3NHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIHRpdGxlQW5kTGlua3NHcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnRpdGxlQW5kTGlua3NHcm91cF90ZXh0LCAzKTsKLQotCQljcmVhdGVMYWJlbCh0aXRsZUFuZExpbmtzR3JvdXAsIFB1Ymxpc2hpbmdVSVJlc291cmNlcy50aXRsZUxhYmVsX3RleHQpOwotCQl0aXRsZVRleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQodGl0bGVBbmRMaW5rc0dyb3VwLCAiIiwgMzYwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMYWJlbCh0aXRsZUFuZExpbmtzR3JvdXAsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxhYmVsKHRpdGxlQW5kTGlua3NHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYWJvdXRIVE1MTGFiZWxfdGV4dCk7Ci0JCWFib3V0SFRNTFRleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQodGl0bGVBbmRMaW5rc0dyb3VwLCAiIiwgMzYwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlzZWxlY3RIVE1MQnV0dG9uID0gbmV3IEJ1dHRvbih0aXRsZUFuZExpbmtzR3JvdXAsIFNXVC5OT05FKTsKLQkJc2VsZWN0SFRNTEJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5TRUxFQ1RfQlVUVE9OX1RFWFQpOwotCi0JCWNyZWF0ZUxhYmVsKHRpdGxlQW5kTGlua3NHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuZmVlZGJhY2tVUkxMYWJlbF90ZXh0KTsKLQkJZmVlZGJhY2tVUkxUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KHRpdGxlQW5kTGlua3NHcm91cCwgIiIsIDM2MCwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3JlYXRlTGFiZWwodGl0bGVBbmRMaW5rc0dyb3VwLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gdGl0bGVBbmRMaW5rc0dyb3VwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIExvb2sgYW5kIGZlZWwgZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBncm91cCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgR3JvdXAgY3JlYXRlTG9va0FuZEZlZWxHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIGxvb2tBbmRGZWVsR3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5sb29rQW5kRmVlbEdyb3VwX3RleHQsIDMpOwotCi0JCWNyZWF0ZUxhYmVsKGxvb2tBbmRGZWVsR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJhbm5lckltYWdlTGFiZWxfdGV4dCk7Ci0JCWJhbm5lckltYWdlVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChsb29rQW5kRmVlbEdyb3VwLCAiIiwgMzYwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlzZWxlY3RJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24obG9va0FuZEZlZWxHcm91cCwgU1dULk5PTkUpOwotCQlzZWxlY3RJbWFnZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5TRUxFQ1RfQlVUVE9OX1RFWFQpOwotCi0JCXJldHVybiBsb29rQW5kRmVlbEdyb3VwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIEdsb3NhcnkgYW5kIGluZGV4IGdyb3VwLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiB0aGUgZ3JvdXAgY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIEdyb3VwIGNyZWF0ZUdsb3NzYXJ5QW5kSW5kZXhHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIGdsb3NzYXJ5QW5kSW5kZXhHcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmdsb3NzYXJ5QW5kSW5kZXhHcm91cF90ZXh0LCAyKTsKLQotCQlwdWJsaXNoR2xvc3NhcnlDaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KGdsb3NzYXJ5QW5kSW5kZXhHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaEdsb3NzYXJ5TGFiZWxfdGV4dCk7Ci0JCXB1Ymxpc2hJbmRleENoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3goZ2xvc3NhcnlBbmRJbmRleEdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoSW5kZXhMYWJlbF90ZXh0KTsKLQotCQlyZXR1cm4gZ2xvc3NhcnlBbmRJbmRleEdyb3VwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFZhbGlkYXRpb24gZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBncm91cCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgR3JvdXAgY3JlYXRlVmFsaWRhdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIHZhbGlkYXRpb25Hcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnZhbGlkYXRpb25Hcm91cF90ZXh0LCAyKTsKLQotCQljaGVja0V4dGVybmFsTGlua3NDaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KHZhbGlkYXRpb25Hcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY2hlY2tFeHRlcm5hbExpbmtzTGFiZWxfdGV4dCk7Ci0KLQkJY29udmVydEJyb2tlbkxpbmtzQ2hlY2tib3ggPSBjcmVhdGVDaGVja2JveCh2YWxpZGF0aW9uR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNvbnZlcnRCcm9rZW5MaW5rc0xhYmVsX3RleHQpOwotCi0JCXJldHVybiB2YWxpZGF0aW9uR3JvdXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgRGlhZ3JhbSBHZW5lcmF0aW9uIGdyb3VwLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiB0aGUgZ3JvdXAgY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIEdyb3VwIGNyZWF0ZURpYWdyYW1HZW5lcmF0aW9uR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBkaWFncmFtR3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5kaWFncmFtR3JvdXBfdGV4dCwgMSk7Ci0KLQkJcHVibGlzaFVub3BlbkFERENoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3goZGlhZ3JhbUdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQWN0aXZpdHlEZXRhaWxEaWFncmFtc0xhYmVsX3RleHQpOwotCi0JCXB1Ymxpc2hCYXNlQURDaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KGRpYWdyYW1Hcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaEV4dGVuZGVkQWN0aXZpdHlEaWFncmFtc0xhYmVsX3RleHQpOwotCi0JCXJldHVybiBkaWFncmFtR3JvdXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgTGF5b3V0IGdyb3VwLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiB0aGUgZ3JvdXAgY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIEdyb3VwIGNyZWF0ZUxheW91dEdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgbGF5b3V0R3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5sYXlvdXRHcm91cF90ZXh0LCAxKTsKLQotCQlwdWJsaXNoTGlnaHRXZWlnaHRUcmVlQ2hlY2tib3ggPSBjcmVhdGVDaGVja2JveChsYXlvdXRHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaExpZ2h0V2VpZ2h0VHJlZUxhYmVsX3RleHQpOwotCi0JCXNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWUgPSBjcmVhdGVDaGVja2JveChsYXlvdXRHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZV90ZXh0KTsKLQotCQlleHRyYURlc2NyaXB0b3JJbmZvQ3RyID0gY3JlYXRlQ2hlY2tib3gobGF5b3V0R3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hFeHRyYURlc2NyaXB0b3JJbmZvTGFiZWxfdGV4dCk7Ci0KLQkJc2hvd1JlbGF0ZWREZXNjcmlwdG9ycyA9IGNyZWF0ZUNoZWNrYm94KGxheW91dEdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5zaG93UmVsYXRlZERlc2NyaXB0b3JzX3RleHQpOwotCi0JCUNvbXBvc2l0ZSBhY3Rpdml0eVRhYkNvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUobGF5b3V0R3JvdXAsCi0JCQkJMik7Ci0JCSgoR3JpZExheW91dCkgYWN0aXZpdHlUYWJDb21wb3NpdGUuZ2V0TGF5b3V0KCkpLm1hcmdpblRvcCA9IC01OwotCQkoKEdyaWRMYXlvdXQpIGFjdGl2aXR5VGFiQ29tcG9zaXRlLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gLTU7Ci0KLQkJY3JlYXRlTGFiZWwoYWN0aXZpdHlUYWJDb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnNlbGVjdERlZmF1bHRBY3Rpdml0eVRhYl90ZXh0KTsKLQotCQlhY3Rpdml0eVRhYlZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihhY3Rpdml0eVRhYkNvbXBvc2l0ZSwgU1dULkJPUkRFUgotCQkJCXwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORwotCQkJCXwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJYWN0aXZpdHlUYWJWaWV3ZXIuZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IHBhcmFtKSB7Ci0JCQkJaWYgKHBhcmFtIGluc3RhbmNlb2YgTWFwLkVudHJ5KSB7Ci0JCQkJCXJldHVybiAoU3RyaW5nKSAoKE1hcC5FbnRyeSkgcGFyYW0pLmdldFZhbHVlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIHBhcmFtLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlhY3Rpdml0eVRhYlZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCi0JCXJldHVybiBsYXlvdXRHcm91cDsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlIGEgbWVhbnMgdG8gYWRkIGFkZGl0aW9uYWwgb3B0aW9ucyB0byB0aGUgcHVibGlzaGVkIHdlYiBzaXRlCi0JICogZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbmNsdWRlQWRkaXRpb25hbFB1Ymxpc2hpbmdPcHRpb25zKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMgZ3JvdXBzIHRvIHRoaXMgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQdWJsaXNoaW5nT3B0aW9uc0dyb3VwcyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCVN0cmluZyBjb25maWdJZCA9IGNvbmZpZyAhPSBudWxsID8gY29uZmlnLmdldEd1aWQoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJdGl0bGVUZXh0LnNldFRleHQoUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0VGl0bGUoY29uZmlnSWQpKTsKLQkJYmFubmVySW1hZ2VUZXh0LnNldFRleHQoUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0QmFubmVySW1hZ2UoY29uZmlnSWQpKTsKLQkJYWJvdXRIVE1MVGV4dC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmdldEFib3V0SFRNTChjb25maWdJZCkpOwotCQlmZWVkYmFja1VSTFRleHQuc2V0VGV4dChQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRGZWVkYmFja1VSTChjb25maWdJZCkpOwotCQlwdWJsaXNoR2xvc3NhcnlDaGVja2JveC5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0SW5jbHVkZUdsb3NzYXJ5KGNvbmZpZ0lkKSk7Ci0JCXB1Ymxpc2hJbmRleENoZWNrYm94LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRJbmNsdWRlSW5kZXgoY29uZmlnSWQpKTsKLQkJY2hlY2tFeHRlcm5hbExpbmtzQ2hlY2tib3guc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldENoZWNrRXh0ZXJuYWxMaW5rcyhjb25maWdJZCkpOwotCQljb252ZXJ0QnJva2VuTGlua3NDaGVja2JveC5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0Q29udmVydEJyb2tlbkxpbmtzKGNvbmZpZ0lkKSk7Ci0JCXB1Ymxpc2hVbm9wZW5BRERDaGVja2JveC5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0UHVibGlzaFVub3BlbkFjdGl2aXR5REQoY29uZmlnSWQpKTsKLQkJcHVibGlzaEJhc2VBRENoZWNrYm94LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihjb25maWdJZCkpOwotCQlwdWJsaXNoTGlnaHRXZWlnaHRUcmVlQ2hlY2tib3guc2V0U2VsZWN0aW9uKCFQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRMaWdodFdlaWdodFRyZWUoY29uZmlnSWQpKTsKLQkJZXh0cmFEZXNjcmlwdG9ySW5mb0N0ci5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RXh0cmFEZXNjcmlwdG9ySW5mbyhjb25maWdJZCkpOwotCQlzaG93UmVsYXRlZERlc2NyaXB0b3JzLnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRTaG93UmVsYXRlZERlc2NyaXB0b3JzKGNvbmZpZ0lkKSk7Ci0JCXNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWUuc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldFNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWUoY29uZmlnSWQpKTsKLQotCQlpZiAoYWN0aXZpdHlUYWJWaWV3ZXIuZ2V0Q29tYm8oKS5nZXRJdGVtQ291bnQoKSA9PSAwKSB7Ci0JCQlhY3Rpdml0eVRhYlZpZXdlci5hZGQoYWN0aXZpdHlUYWJNYXAuZW50cnlTZXQoKS50b0FycmF5KCkpOwotCQl9Ci0JCWFjdGl2aXR5VGFiVmlld2VyLmdldENvbWJvKCkuc2V0VGV4dCgKLQkJCQlhY3Rpdml0eVRhYk1hcC5nZXQoUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkJCS5nZXREZWZhdWx0QWN0aXZpdHlUYWIoY29uZmlnSWQpKSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lcnMgZm9yIHRoZSBjb250cm9scyBvbiB0aGlzIHBhZ2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzZWxlY3RJbWFnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULk9QRU4pOwotCQkJCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10gewotCQkJCQkJCSIqLmdpZiIsICIqLmpwZyIsICIqLmJtcCIgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVN0cmluZyBpbWFnZUZpbGUgPSBkaWFsb2cub3BlbigpOwotCQkJCQlpZiAoaW1hZ2VGaWxlICE9IG51bGwpIHsKLQkJCQkJCWJhbm5lckltYWdlVGV4dC5zZXRUZXh0KGltYWdlRmlsZSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJc2VsZWN0SFRNTEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULk9QRU4pOwotCQkJCQlkaWFsb2cKLQkJCQkJCQkuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10gewotCQkJCQkJCQkJIiouaHRtIiwgIiouaHRtbCIgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlTdHJpbmcgaHRtbEZpbGUgPSBkaWFsb2cub3BlbigpOwotCQkJCQlpZiAoaHRtbEZpbGUgIT0gbnVsbCkgewotCQkJCQkJYWJvdXRIVE1MVGV4dC5zZXRUZXh0KGh0bWxGaWxlKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlhYm91dEhUTUxUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNvbkVudGVyUGFnZShPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgb25FbnRlclBhZ2UoT2JqZWN0IG9iaikgewotCQlpZiAob2JqICE9IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBzZWxlY3RlZENvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBvYmo7Ci0JCQlpZiAoIXNlbGVjdGVkQ29uZmlncy5jb250YWlucyhzZWxlY3RlZENvbmZpZykpIHsKLQkJCQlzZWxlY3RlZENvbmZpZ3MuYWRkKHNlbGVjdGVkQ29uZmlnKTsKLQkJCX0KLQkJCWlmIChzZWxlY3RlZENvbmZpZyAhPSBjb25maWcpIHsKLQkJCQljb25maWcgPSBzZWxlY3RlZENvbmZpZzsKLQkJCQlpbml0Q29udHJvbHMoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlTdHJpbmcgcGF0aCA9IGFib3V0SFRNTFRleHQuZ2V0VGV4dCgpOwotCQlJUGF0aCBlY1BhdGggPSBQYXRoLmZyb21PU1N0cmluZyhwYXRoKTsKLQkJYm9vbGVhbiBpc1ZhbGlkID0gZWNQYXRoLmlzVmFsaWRQYXRoKHBhdGgpOwotCQlpZiAoIWlzVmFsaWQpIHsKLQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW52YWxpZEFib3V0UGF0aEVycm9yX21zZyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoIVN0clV0aWwuaXNWYWxpZFB1Ymxpc2hQYXRoKHBhdGgpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRBYm91dFBhdGhDaGFyc0Vycm9yX21zZyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNnZXROZXh0UGFnZURhdGEoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TmV4dFBhZ2VEYXRhKCkgewotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc2VsZWN0ZWQgcHVibGlzaGluZyBvcHRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5QdWJsaXNoT3B0aW9uczwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIFB1Ymxpc2hPcHRpb25zIGdldFB1Ymxpc2hpbmdPcHRpb25zKCkgewotCQlQdWJsaXNoSFRNTE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBQdWJsaXNoSFRNTE9wdGlvbnMoKTsKLQotCQlvcHRpb25zLnNldFRpdGxlKGdldFdlYlNpdGVUaXRsZSgpKTsKLQkJb3B0aW9ucy5zZXRCYW5uZXJJbWFnZShnZXRCYW5uZXJJbWFnZVBhdGgoKSk7Ci0JCW9wdGlvbnMuc2V0QWJvdXRIVE1MKGdldEFib3V0SFRNTFBhdGgoKSk7Ci0JCW9wdGlvbnMuc2V0RmVlZGJhY2tVUkwoZ2V0RmVlZGJhY2tVUkwoKSk7Ci0JCW9wdGlvbnMuc2V0UHVibGlzaEdsb3NzYXJ5KGdldFB1Ymxpc2hHbG9zc2FyeVNlbGVjdGlvbigpKTsKLQkJb3B0aW9ucy5zZXRQdWJsaXNoSW5kZXgoZ2V0UHVibGlzaEluZGV4U2VsZWN0aW9uKCkpOwotCQlvcHRpb25zLnNldENoZWNrRXh0ZXJuYWxMaW5rcyhnZXRDaGVja0V4dGVybmFsTGlua3NTZWxlY3Rpb24oKSk7Ci0JCW9wdGlvbnMuc2V0UHVibGlzaFVub3BlbkFERChnZXRQdWJsaXNoVW5vcGVuQUREU2VsZWN0aW9uKCkpOwotCQlvcHRpb25zLnNldFB1Ymxpc2hCYXNlQUQoZ2V0UHVibGlzaEJhc2VBRFNlbGVjdGlvbigpKTsKLQkJb3B0aW9ucy5zZXRDb252ZXJ0QnJva2VuTGlua3MoZ2V0Q29udmVydEJyb2tlbkxpbmtzU2VsZWN0aW9uKCkpOwotCQlvcHRpb25zLnNldFB1Ymxpc2hMaWdodFdlaWdodFRyZWUoZ2V0UHVibGlzaExpZ2h0V2VpZ2h0VHJlZVNlbGVjdGlvbigpKTsKLQkJb3B0aW9ucwotCQkJCS5zZXRTaG93TWV0aG9kQ29udGVudEluRGVzY3JpcHRvcnMoZ2V0U2hvd0V4dHJhRGVzY3JpcHRvckluZm9TZWxlY3Rpb24oKSk7Ci0JCW9wdGlvbnMKLQkJCQkuc2V0U2hvd1JlbGF0ZWREZXNjcmlwdG9ycyhzaG93UmVsYXRlZERlc2NyaXB0b3JzCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQlvcHRpb25zCi0JCQkJLnNldFNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWUoc2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZQotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQotCQlTdHJpbmcgZGVmYXVsdEFjdGl2aXR5VGFiID0gZ2V0RGVmYXVsdEFjdGl2aXR5VGFiU2VsZWN0aW9uKCk7Ci0JCWlmIChkZWZhdWx0QWN0aXZpdHlUYWIgIT0gbnVsbCkgewotCQkJb3B0aW9ucy5zZXREZWZhdWx0QWN0aXZpdHlUYWIoZGVmYXVsdEFjdGl2aXR5VGFiKTsKLQkJfQotCi0JCXJldHVybiBvcHRpb25zOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHdlYiBzaXRlIHRpdGxlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0V2ViU2l0ZVRpdGxlKCkgewotCQlyZXR1cm4gdGl0bGVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgYmFubmVyIGltYWdlIHBhdGguCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRCYW5uZXJJbWFnZVBhdGgoKSB7Ci0JCXJldHVybiBiYW5uZXJJbWFnZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBhYm91dCBIVE1MIHBhdGguCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBYm91dEhUTUxQYXRoKCkgewotCQlyZXR1cm4gYWJvdXRIVE1MVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGZlZWRiYWNrIFVSTC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZlZWRiYWNrVVJMKCkgewotCQlyZXR1cm4gZmVlZGJhY2tVUkxUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgcHVibGlzaCBnbG9zc2FyeSBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0UHVibGlzaEdsb3NzYXJ5U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gcHVibGlzaEdsb3NzYXJ5Q2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgcHVibGlzaCBpbmRleCBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0UHVibGlzaEluZGV4U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gcHVibGlzaEluZGV4Q2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgY2hlY2sgZXh0ZXJuYWwgbGlua3Mgc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldENoZWNrRXh0ZXJuYWxMaW5rc1NlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGNoZWNrRXh0ZXJuYWxMaW5rc0NoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGNvbnZlcnQgYnJva2VuIGxpbmtzIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRDb252ZXJ0QnJva2VuTGlua3NTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBjb252ZXJ0QnJva2VuTGlua3NDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBhdXRvIGdlbmVyYXRlIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0UHVibGlzaFVub3BlbkFERFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHB1Ymxpc2hVbm9wZW5BRERDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBwdWJsaXNoIGFjdGl2aXR5IGRpYWdyYW0gZm9yIGJhc2UgYWN0aXZ0aWVzIHdpdGgKLQkgKiB1bm1vZGlmaWVkIGV4dGVuc2lvbnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0UHVibGlzaEJhc2VBRFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHB1Ymxpc2hCYXNlQURDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBnZW5lcmF0ZSBsaWdodCB3ZWlnaHQgdHJlZSBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0UHVibGlzaExpZ2h0V2VpZ2h0VHJlZVNlbGVjdGlvbigpIHsKLQkJcmV0dXJuICFwdWJsaXNoTGlnaHRXZWlnaHRUcmVlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgc2hvdyBleHRyYSBkZXNjcmlwdG9yIGluZm8gc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldFNob3dFeHRyYURlc2NyaXB0b3JJbmZvU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gZXh0cmFEZXNjcmlwdG9ySW5mb0N0ci5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBzaG93IHJlbGF0ZWQgZGVzY3JpcHRvciBpbiBjb250ZW50IHBhZ2UKLQkgKiBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0U2hvd1JlbGF0ZWREZXNjcmlwdG9yc1NlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNob3dSZWxhdGVkRGVzY3JpcHRvcnMuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgc2hvdyBkZXNjcmlwdG9ycyBpbiBuYXZpZ2F0aW9uIHRyZWUgc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldFNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWVTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBzaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGRlZmF1bHQgYWN0aXZpdHkgdGFiIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRBY3Rpdml0eVRhYlNlbGVjdGlvbigpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBhY3Rpdml0eVRhYlZpZXdlcgotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJTWFwLkVudHJ5IGl0ZW0gPSAoTWFwLkVudHJ5KSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChpdGVtID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIChTdHJpbmcpIGl0ZW0uZ2V0S2V5KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgdXNlciBzZWxlY3Rpb25zIGluIHRoaXMgd2l6YXJkIHBhZ2UgdG8gcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlUHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNvbmZpZ0lkID0gY29uZmlnLmdldEd1aWQoKTsKLQkJCXNhdmVUaXRsZUFuZExpbmtzUHJlZmVyZW5jZXMoY29uZmlnSWQpOwotCQkJc2F2ZUdsb3NzYXJ5QW5kSW5kZXhQcmVmZXJlbmNlcyhjb25maWdJZCk7Ci0JCQlzYXZlVmFsaWRhdGlvblByZWZlcmVuY2VzKGNvbmZpZ0lkKTsKLQkJCXNhdmVEaWFncmFtR2VuZXJhdGlvblByZWZlcmVuY2VzKGNvbmZpZ0lkKTsKLQkJCXNhdmVMYXlvdXRQcmVmZXJlbmNlcyhjb25maWdJZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgdGl0bGUgYW5kIGxpbmtzIHByZWZlcmVuY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVUaXRsZUFuZExpbmtzUHJlZmVyZW5jZXMoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFRpdGxlKGNvbmZpZ0lkLCBnZXRXZWJTaXRlVGl0bGUoKSk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldEJhbm5lckltYWdlKGNvbmZpZ0lkLCBnZXRCYW5uZXJJbWFnZVBhdGgoKSk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldEFib3V0SFRNTChjb25maWdJZCwgZ2V0QWJvdXRIVE1MUGF0aCgpKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0RmVlZGJhY2tVUkwoY29uZmlnSWQsIGdldEZlZWRiYWNrVVJMKCkpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBnbG9zYWFyeSBhbmQgaW5kZXggcHJlZmVyZW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZUdsb3NzYXJ5QW5kSW5kZXhQcmVmZXJlbmNlcyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0SW5jbHVkZUdsb3NzYXJ5KGNvbmZpZ0lkLAotCQkJCWdldFB1Ymxpc2hHbG9zc2FyeVNlbGVjdGlvbigpKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0SW5jbHVkZUluZGV4KGNvbmZpZ0lkLAotCQkJCWdldFB1Ymxpc2hJbmRleFNlbGVjdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlVmFsaWRhdGlvblByZWZlcmVuY2VzKFN0cmluZyBjb25maWdJZCkgewotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRDaGVja0V4dGVybmFsTGlua3MoY29uZmlnSWQsCi0JCQkJZ2V0Q2hlY2tFeHRlcm5hbExpbmtzU2VsZWN0aW9uKCkpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRDb252ZXJ0QnJva2VuTGlua3MoY29uZmlnSWQsCi0JCQkJZ2V0Q29udmVydEJyb2tlbkxpbmtzU2VsZWN0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBkaWFncmFtIGdlbmVyYXRpb24gcHJlZmVyZW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZURpYWdyYW1HZW5lcmF0aW9uUHJlZmVyZW5jZXMoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eUREKGNvbmZpZ0lkLAotCQkJCWdldFB1Ymxpc2hVbm9wZW5BRERTZWxlY3Rpb24oKSk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKGNvbmZpZ0lkLAotCQkJCWdldFB1Ymxpc2hCYXNlQURTZWxlY3Rpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGxheW91dCBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlTGF5b3V0UHJlZmVyZW5jZXMoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldExpZ2h0V2VpZ2h0VHJlZShjb25maWdJZCwKLQkJCQlnZXRQdWJsaXNoTGlnaHRXZWlnaHRUcmVlU2VsZWN0aW9uKCkpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRFeHRyYURlc2NyaXB0b3JJbmZvKGNvbmZpZ0lkLAotCQkJCWdldFNob3dFeHRyYURlc2NyaXB0b3JJbmZvU2VsZWN0aW9uKCkpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRTaG93UmVsYXRlZERlc2NyaXB0b3JzKGNvbmZpZ0lkLAotCQkJCWdldFNob3dSZWxhdGVkRGVzY3JpcHRvcnNTZWxlY3Rpb24oKSk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWUoY29uZmlnSWQsCi0JCQkJZ2V0U2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZVNlbGVjdGlvbigpKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0RGVmYXVsdEFjdGl2aXR5VGFiKGNvbmZpZ0lkLAotCQkJCWdldERlZmF1bHRBY3Rpdml0eVRhYlNlbGVjdGlvbigpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YTExMDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5yY3AudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MjNkOWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYucmNwLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5yY3AudWkuUkNQVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiAKLSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5yY3AudWkuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLndpemFyZHMKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdCwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS51aS5pZGUsCi0gb3JnLmVjbGlwc2UudWkuaW50cm8sCi0gb3JnLmVjbGlwc2UuaGVscC51aSwKLSBvcmcuZWNsaXBzZS5oZWxwLndlYmFwcCwKLSBvcmcuZWNsaXBzZS50b21jYXQsCi0gb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWksCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2Fib3V0Lm1hcHBpbmdzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI4MGIzYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0jIFVzdWFsbHkgZ2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUuCi0KLTA9QGJ1aWxkLUlEQAotMT0xLjIuMC4yCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MWRkYmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luX2N1c3RvbWl6YXRpb24uaW5pLFwKLSAgICAgICAgICAgICAgIHNwbGFzaC5ibXAsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi0gICAgICAgICAgICAgICAKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvY29tcG9zZXIucHJvZHVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvY29tcG9zZXIucHJvZHVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFjYTYxNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2NvbXBvc2VyLnByb2R1Y3QKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9wZGUgdmVyc2lvbj0iMy4xIj8+Ci0KLTxwcm9kdWN0IG5hbWU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIiIGlkPSJvcmcuZWNsaXBzZS5lcGYucmNwLnVpLmNvbXBvc2VyIiBhcHBsaWNhdGlvbj0ib3JnLmVjbGlwc2UuZXBmLnJjcC51aS5NYWluQXBwbGljYXRpb24iIHVzZUZlYXR1cmVzPSJ0cnVlIj4KLQotICAgPGFib3V0SW5mbz4KLSAgICAgIDxpbWFnZSBwYXRoPSJpY29ucy9hYm91dC5naWYiLz4KLSAgICAgIDx0ZXh0PgotICAgICAgICAgJWFib3V0VGV4dAotICAgICAgPC90ZXh0PgotICAgPC9hYm91dEluZm8+Ci0KLSAgIDxjb25maWdJbmkgdXNlPSJkZWZhdWx0Ii8+Ci0KLSAgIDxsYXVuY2hlckFyZ3M+Ci0gICAgICA8cHJvZ3JhbUFyZ3M+LWRhdGEgQHVzZXIuaG9tZS9FUEYvd29ya3NwYWNlLjEyME0zIC1kZWZhdWx0bGlicmFyeSBPcGVuVVA8L3Byb2dyYW1BcmdzPgotICAgICAgPHZtQXJncz4tWG1zNjRtIC1YbXg1MTJtPC92bUFyZ3M+Ci0gICA8L2xhdW5jaGVyQXJncz4KLQotICAgPHdpbmRvd0ltYWdlcyBpMTY9Ii9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHJvZHVjdC5naWYiIGkzMj0iL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZnVsbC9vYmozMi9wcm9kdWN0MzIuZ2lmIi8+Ci0KLSAgIDxzcGxhc2gKLSAgICAgIHN0YXJ0dXBQcm9ncmVzc1JlY3Q9IjAsMjgwLDQ1NSwxNSIKLSAgICAgIHN0YXJ0dXBNZXNzYWdlUmVjdD0iNywyMjAsNDQxLDIwIgotICAgICAgc3RhcnR1cEZvcmVncm91bmRDb2xvcj0iQzhENUVBIiAvPgotICAgPGxhdW5jaGVyIG5hbWU9ImVwZiI+Ci0gICAgICA8c29sYXJpcy8+Ci0gICAgICA8d2luIHVzZUljbz0iZmFsc2UiPgotICAgICAgICAgPGJtcC8+Ci0gICAgICA8L3dpbj4KLSAgIDwvbGF1bmNoZXI+Ci0KLSAgIDxwbHVnaW5zPgotICAgPC9wbHVnaW5zPgotCi0gICA8ZmVhdHVyZXM+Ci0gICAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZXBmLnByb2R1Y3QuZmVhdHVyZSIgdmVyc2lvbj0iMS4yLjAucXVhbGlmaWVyIi8+Ci0gICA8L2ZlYXR1cmVzPgotCi08L3Byb2R1Y3Q+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2NvbmZpZy9yY3BfcGFja2FnaW5nL2NvbmZpZy5pbmkgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2NvbmZpZy9yY3BfcGFja2FnaW5nL2NvbmZpZy5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYjI5MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9jb25maWcvcmNwX3BhY2thZ2luZy9jb25maWcuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotIyBFY2xpcHNlIHJ1bnRpbWUgY29uZmlndXJhdGlvbiBmaWxlCi0jIFRoaXMgZmlsZSBjb250YWlucyBhIG51bWJlciBvZiBrZXkvdmFsdWUgcGFpcnMgdGhhdCBhcmUgbWVyZ2VkIGludG8gdGhlIAotIyBTeXN0ZW0gcHJvcGVydGllcyBvbiBzeXN0ZW0gc3RhcnR1cC4gIFRoZSB2YWx1ZXMgY29udHJvbCB0aGUgd2F5IHRoZSAKLSMgcnVudGltZSBpcyBzdHJ1Y3R1cmVkIGFuZCBydW5zLgotCi0jIE5vdGU6ICBPbmx5IHBsYXRmb3JtOi9iYXNlLyBhbmQgZmlsZTogVVJMcyBhcmUgc3VwcG9ydGVkLiAgSW4gZ2VuZXJhbCB0aGUgCi0jIFVSTHMgZ2l2ZW4gbWF5IGluY2x1ZGUgYSB2ZXJzaW9uIG51bWJlciAoZS5nLiwgLi4uL2xvY2F0aW9uXzEuMi4zKS4gIAotIyBJZiBhIHZlcnNpb24gaXMgbm90IHNwZWNpZmllZCwgdGhlIHN5c3RlbSBiaW5kcwotIyB0byB0aGUgbG9jYXRpb24gd2hpY2ggbWF0Y2hlcyBleGFjdGx5IG9yIHRvIHRoZSB2ZXJzaW9uZWQgbG9jYXRpb24gd2l0aCB0aGUKLSMgbGF0ZXN0IHZlcnNpb24gbnVtYmVyLiAgSWYgYSB2ZXJzaW9uIG51bWJlciBpcyBnaXZlbiB0aGVuIG9ubHkgZXhhY3QgbWF0Y2hlcwotIyBhcmUgY29uc2lkZXJlZC4KLQotIyBUaGUgVVJMIGZvciB0aGUgcnVudGltZSBlbnRyeSBwb2ludC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzCi0jIHBsYXRmb3JtOi9iYXNlL3BsdWdpbnMvb3JnLmVjbGlwc2Uub3NnaSAKLSNvc2dpLmZyYW1ld29yaz1wbGF0Zm9ybTovYmFzZS9wbHVnaW5zL29yZy5lY2xpcHNlLm9zZ2kKLQotIyBUaGUgY2xhc3NwYXRoIGZvciB0aGUgZnJhbWV3b3JrIGZvdW5kIGF0IHRoZSBvc2dpLmZyYW1ld29yayBsb2NhdGlvbi4gIFRoaXMgCi0jIGNvbW1hLXNlcGFyYXRlZCBsaXN0IGNvbnRhaW5zIGVpdGhlciBVUkxzIG9yIHNpbXBsZSBlbGVtZW50IG5hbWVzLiAgU2ltcGxlCi0jIG5hbWVzIGFyZSBhc3N1bWVkIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBmcmFtZXdvcmsncyBpbnN0YWxsIGRpcmVjdG9yeS4gIAotIyBUeXBpY2FsbHkgdGhpcyB2YWx1ZSBuZWVkIG5vdCBiZSBzZXQgYXMgaXQgaXMgaW5pdGlhbGl6ZWQgYnkgdGhlIGZyYW1ld29yayBpdHNlbGYuCi0jIFZlcnNpb24gbWF0Y2ggc2VhcmNoaW5nIGlzIG5vdCBkb25lIGZvciBVUkxzIGxpc3RlZCBoZXJlLgotI29zZ2kuZnJhbWV3b3JrQ2xhc3NQYXRoID0KLQotIyBUaGUgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbG9jYXRpb25zIHRvIHNlYXJjaCBmb3IgdGhlIHNwbGFzaCBzY3JlZW4gZmlsZSAoc3BsYXNoLmJtcCkuCi0jIEZvciBlYWNoIGxpc3QgZWxlbWVudCBhIHN1YmRpcmVjdG9yeSBzdHJ1Y3R1cmUgYmFzZWQgb24gdGhlIHBhdHRlcm4gbmwvPGxvY2FsZT4gaXMgc2VhcmNoZWQuCi0jIFRoZSBzeXN0ZW0gYmluZHMgdG8gdGhlIGZpcnN0IG1hdGNoaW5nIGZpbGUuICBUaGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlLgotI29zZ2kuc3BsYXNoUGF0aD0KLQotIyBUaGUgbG9jYXRpb24gb2YgdGhlIHNwbGFzaCBzY3JlZW4gZmlsZS4gIElmIHRoaXMgdmFsdWUgaXMgc2V0IGF0IHN5c3RlbSBzdGFydHVwIGl0IGlzIHVzZWQgCi0jIGluIGZhdm91ciBvZiB0aGUgb3NnaS5zcGxhc2hQYXRoIHNlYXJjaGluZyBvdXRsaW5lZCBhYm92ZS4gIElmIHRoZSB2YWx1ZSBpcyBub3Qgc2V0IAotIyB0aGUgc2VhcmNoaW5nIGlzIGRvbmUgYW5kIHRoaXMga2V5IGlzIGJvdW5kIHRvIHRoZSByZXN1bHQgb2YgdGhlIHNlYXJjaC4KLSNvc2dpLnNwbGFzaExvY2F0aW9uID0KLQotIyBUaGUgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYnVuZGxlcyB3aGljaCBhcmUgYXV0b21hdGljYWxseSBpbnN0YWxsZWQgYW5kIG9wdGlvbmFsbHkgc3RhcnRlZAotIyBvbmNlIHRoZSBzeXN0ZW0gaXMgdXAgYW5kIHJ1bm5pbmcuICBFYWNoIGVudHJ5IGlmIG9mIHRoZSBmb3JtCi0jICAgICA8VVJMIHwgc2ltcGxlIGJ1bmRsZSBsb2NhdGlvbj5bQCBbPHN0YXJ0bGV2ZWw+XSBbIjpzdGFydCJdXQotIyBJZiB0aGUgc3RhcnRsZXZlbCBpcyBvbWl0dGVkIHRoZW4gdGhlIGZyYW1ld29yayB3aWxsIHVzZSB0aGUgZGVmYXVsdCBzdGFydCBsZXZlbCBmb3IgdGhlIGJ1bmRsZS4KLSMgSWYgdGhlICJzdGFydCIgdGFnIGlzIGFkZGVkIHRoZW4gdGhlIGJ1bmRsZSB3aWxsIGJlIG1hcmtlZCBhcyBzdGFydGVkIGFmdGVyIGJlaW5nIGluc3RhbGxlZC4KLSMgU2ltcGxlIGJ1bmRsZSBsb2NhdGlvbnMgYXJlIGludGVyZXByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGUgZnJhbWV3b3JrJ3MgcGFyZW50IGRpcmVjdG9yeS4KLSMgVGhlIHN0YXJ0bGV2ZWwgaW5kaWNhdGVzIHRoZSBPU0dpIHN0YXJ0IGxldmVsIGF0IHdoaWNoIHRoZSBidW5kbGUgc2hvdWxkIHJ1bi4KLSMgSWYgdGhpcyB2YWx1ZSBpcyBub3Qgc2V0LCB0aGUgc3lzdGVtIGNvbXB1dGVzIGFuIGFwcHJvcHJpYXRlIGRlZmF1bHQuCi0jb3NnaS5idW5kbGVzPW9yZy5lY2xpcHNlLmNvcmUucnVudGltZUAyOnN0YXJ0LGNvbS5pYm0ucm1jLmxpYnJhcnksb3JnLmVjbGlwc2UudWkuaWRlLG9yZy5lY2xpcHNlLmhlbHAuYXBwc2VydmVyLG9yZy5lY2xpcHNlLmhlbHAuYmFzZSxvcmcuZWNsaXBzZS51cGRhdGUudWksY29tLmlibS51bWEsY29tLmlibS51bWEuY29yZSxjb20uaWJtLnVtYWYuZWNvcmUsY29tLmlibS50bmd1aS5lZGl0LG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLG9yZy5lY2xpcHNlLmVtZixvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLG9yZy5lY2xpcHNlLmVtZi5lZGl0LG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLG9yZy5lY2xpcHNlLnVpLG9yZy5lY2xpcHNlLnVpLmlkZQotCi0jIFRoZSBwcm9kdWN0IHRvIHJ1bi4gIEEgZ2l2ZW4gRWNsaXBzZSBjb25maWd1cmF0aW9uIG1heSBjb250YWluIG1hbnkgcHJvZHVjdHMuCi0jIFRoZSBwcm9kdWN0IGlkZW50aWZpZWQgd2lsbCBzdXBwbHkgdGhlIGJyYW5kaW5nICh3aW5kb3cgaWNvbnMsIHRpdGxlIGJhciB0ZXh0KSBldGMgCi0jIGFzIHdlbGwgYXMgZGVmaW5lIHRoZSBkZWZhdWx0IGFwcGxpY2F0aW9uIHRvIHJ1bi4gIAotI2VjbGlwc2UucHJvZHVjdD1vcmcuZWNsaXBzZS5wbGF0Zm9ybQotCi0jIFRoZSBhcHBsaWNhdGlvbiB0byBydW4uICBUaGUgdmFsdWUgc3BlY2lmaWVkIGhlcmUgaXMgdGhlIGlkIG9mIHRoZSBhcHBsaWNhdGlvbiBleHRlbnNpb24KLSMgdGhlIHJ1bnRpbWUgd2lsbCBmaW5kLCBpbnN0YW50aWF0ZSBhbmQgZXhlY3V0ZSBvbmNlIHRoZSBzeXN0ZW0gaXMgdXAuICBOb3RlIHRoYXQgdHlwaWNhbGx5IAotIyB0aGUgaWRlbnRpZmllZCBlY2xpcHNlLnByb2R1Y3QgZGVmaW5lcyB0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiB0byBydW4uCi1lY2xpcHNlLmFwcGxpY2F0aW9uPW9yZy5lY2xpcHNlLmVwZi5yY3AudWkuTWFpbkFwcGxpY2F0aW9uCi0KLSMgVGhlIGJ1aWxkIGlkZW50aWZpZXIKLWVjbGlwc2UuYnVpbGRJZD1NMjAwNDA5MTYxMTI1Ci0KLSMgRW5kIG9mIGZpbGUgbWFya2VyIC0gbXVzdCBiZSBoZXJlCi1lb2Y9ZW9mClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9lY2xpcHNlMzIucG5nIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhmYWMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvYWJvdXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9hYm91dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOGI4NzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9hYm91dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2FwcGxpY2F0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvYXBwbGljYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGMyOTEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvYXBwbGljYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9lY2xpcHNlLnBuZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZWNsaXBzZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOTc1MjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9lY2xpcHNlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZXRvb2wxNi9oZWxwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZXRvb2wxNi9oZWxwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ3MDMwMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2V0b29sMTYvaGVscC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2V0b29sMTYvc2VhcmNoX21lbnUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9ldG9vbDE2L3NlYXJjaF9tZW51LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBmNWQ4My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2V0b29sMTYvc2VhcmNoX21lbnUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9mdWxsL29iajE2L3Byb2R1Y3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9mdWxsL29iajE2L3Byb2R1Y3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGMyOTEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm9kdWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZnVsbC9vYmozMi9wcm9kdWN0MzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9mdWxsL29iajMyL3Byb2R1Y3QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9mdWxsL29iajMyL3Byb2R1Y3QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL25ld19jb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9uZXdfY29uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FlYTg5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL25ld19jb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZGY2NzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgQ29tcG9zZXIgUkNQIFVJCi1wcm9kdWN0TmFtZT1FUEYgQ29tcG9zZXIKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIEFib3V0IHRleHQKLWFib3V0VGV4dD1FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyXG5cCi1cblwKLVZlcnNpb246IHsxfVxuXAotQnVpbGQgTGFiZWw6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbgotCi0jIENhdGVnb3J5Ci1tZXRob2RDYXRlZ29yeU5hbWU9TWV0aG9kCi0KLSMgVmlld3MKLXdlbGNvbWVWaWV3TmFtZT1XZWxjb21lCi0KLSMgQWN0aW9ucwotZ2xvYmFsQWN0aW9uU2V0PUdsb2JhbCBBY3Rpb24gU2V0Ci1uZXdBY3Rpb249Jk5ldwotbmV3QWN0aW9uVG9vbHRpcD1OZXcKLW9wZW5BY3Rpb249Jk9wZW4uLi4KLW9wZW5BY3Rpb25Ub29sdGlwPU9wZW4KLXNlYXJjaEFjdGlvbj0mU2VhcmNoLi4uCi1zZWFyY2hBY3Rpb25Ub29sdGlwPVNlYXJjaAotd2VsY29tZUFjdGlvbj0mV2VsY29tZQotd2VsY29tZUFjdGlvblRvb2xUaXA9V2VsY29tZQotCi0jIFRvb2x0aXBzCi1zaG9ydGN1dC5vdmVydmlldy50b29sdGlwPVJldHVybiB0byBPdmVydmlldyBwYWdlCi1zaG9ydGN1dC50dXRvcmlhbHMudG9vbHRpcD1SZXR1cm4gdG8gVHV0b3JpYWwgcGFnZQotc2hvcnRjdXQuZmlyc3RzdGVwcy50b29sdGlwPVJldHVybiB0byBGaXJzdCBTdGVwcyBwYWdlCi1zaG9ydGN1dC53ZWJyZXNvdXJjZXMudG9vbHRpcD1SZXR1cm4gdG8gV2ViIFJlc291cmNlcyBwYWdlICAgICAgIAotCi0jQWN0aW9uIFNldAotYWN0aW9uU2V0LmRlc2NyaXB0aW9uID0gSGVscCBTeXN0ZW0gVG9vbGJhciBBY3Rpb25zCi1hY3Rpb25TZXQubGFiZWwgPSBIZWxwIFN5c3RlbQotc2VhcmNoQWN0aW9uLmxhYmVsID0gUyZlYXJjaCBIZWxwCi1zZWFyY2hBY3Rpb24udG9vbHRpcCA9IFNlYXJjaCBIZWxwCi1keW5hbWljSGVscEFjdGlvbi5sYWJlbCA9ICZEeW5hbWljIEhlbHAgCi1keW5hbWljSGVscEFjdGlvbi50b29sdGlwID0gRHluYW1pYyBIZWxwCi0KLSNBY3Rpdml0aWVzL0NhcGFiaWxpdGllcwotYWN0aXZpdHkuZ2VuZXJhbD1JbXBvcnQgYW5kIEV4cG9ydCBQcm9qZWN0cyBhbmQgUmVzb3VyY2VzCi1hY3Rpdml0eS5nZW5lcmFsLmRlc2M9VXNlIHRoZSBzdGFuZGFyZCBFY2xpcHNlIEltcG9ydC9FeHBvcnQgUHJvamVjdC9SZXNvdXJjZXMgY2FwYWJpbGl0aWVzLgotYWN0aXZpdHkudGVhbS5jdnM9Q1ZTIFN1cHBvcnQKLWFjdGl2aXR5LnRlYW0uY3ZzLmRlc2M9VXNlIHRoZSBDb25jdXJyZW50IFZlcnNpb25zIFN5c3RlbSAoQ1ZTKSB0byBtYW5hZ2UgcmVzb3VyY2VzLgotYWN0aXZpdHkudGVhbT1Db3JlIFRlYW0gU3VwcG9ydAotYWN0aXZpdHkudGVhbS5kZXNjPVNoYXJlIHByb2plY3RzIHVzaW5nIGNvbmZpZ3VyYXRpb24gbWFuYWdlbWVudCBzeXN0ZW1zLgotCi1hY3Rpdml0eS5jYXQuZ2VuZXJhbD1HZW5lcmFsCi1hY3Rpdml0eS5jYXQuZ2VuZXJhbC5kZXNjPVVzZSB0aGUgc3RhbmRhcmQgRWNsaXBzZSBjYXBhYmlsaXRpZXMuCi1hY3Rpdml0eS5jYXQudGVhbT1UZWFtCi1hY3Rpdml0eS5jYXQudGVhbS5kZXNjPVVzZSBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQgc3lzdGVtcyB0byBtYW5hZ2UgcmVzb3VyY2VzLgotCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzID0gQ2FwYWJpbGl0aWVzCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5TmFtZSA9ICZDYXBhYmlsaXRpZXMKLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuY2F0ZWdvcnlOYW1lID0gJkNhcGFiaWxpdGllcwotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eVByb21wdEJ1dHRvbiA9ICZQcm9tcHQgd2hlbiBlbmFibGluZyBjYXBhYmlsaXRpZXMKLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlQcm9tcHRCdXR0b25Ub29sdGlwID0gUHJvbXB0IHdoZW4gYSBmZWF0dXJlIGlzIGZpcnN0IHVzZWQgdGhhdCByZXF1aXJlcyBlbmFibGVtZW50IG9mIGNhcGFiaWxpdGllcwotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5jYXB0aW9uTWVzc2FnZSA9IENhcGFiaWxpdGllcyBhbGxvdyB5b3UgdG8gZW5hYmxlIG9yIGRpc2FibGUgdmFyaW91cyBwcm9kdWN0IGNvbXBvbmVudHMuICBUaGVzZSBjYXBhYmlsaXRpZXMgYXJlIGdyb3VwZWQgYWNjb3JkaW5nIHRvIGEgc2V0IG9mIHByZWRlZmluZWQgY2F0ZWdvcmllcy4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmN2JmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Ik1haW5BcHBsaWNhdGlvbiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zIj4KLSAgICAgIDxhcHBsaWNhdGlvbj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucmNwLnVpLk1haW5BcHBsaWNhdGlvbiI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgIDwvYXBwbGljYXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9ImNvbXBvc2VyIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcm9kdWN0cyI+Ci0gICAgICA8cHJvZHVjdAotICAgICAgICAgICAgYXBwbGljYXRpb249Im9yZy5lY2xpcHNlLmVwZi5yY3AudWkuTWFpbkFwcGxpY2F0aW9uIgotICAgICAgICAgICAgbmFtZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciI+Ci0gICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgIG5hbWU9InByZWZlcmVuY2VDdXN0b21pemF0aW9uIgotICAgICAgICAgICAgICAgdmFsdWU9InBsdWdpbl9jdXN0b21pemF0aW9uLmluaSIvPgotICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICBuYW1lPSJzdGFydHVwRm9yZWdyb3VuZENvbG9yIgotICAgICAgICAgICAgICAgdmFsdWU9IkM4RDVFQSIvPgotICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICBuYW1lPSJzdGFydHVwTWVzc2FnZVJlY3QiCi0gICAgICAgICAgICAgICB2YWx1ZT0iNywyMjAsNDQxLDIwIi8+Ci0gICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgIG5hbWU9InN0YXJ0dXBQcm9ncmVzc1JlY3QiCi0gICAgICAgICAgICAgICB2YWx1ZT0iMCwyODAsNDU1LDE1Ii8+Ci0gICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgIG5hbWU9ImFib3V0SW1hZ2UiCi0gICAgICAgICAgICAgICB2YWx1ZT0iaWNvbnMvYWJvdXQuZ2lmIi8+Ci0gICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgIG5hbWU9ImFib3V0VGV4dCIKLSAgICAgICAgICAgICAgIHZhbHVlPSIlYWJvdXRUZXh0Ii8+Ci0gICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgIG5hbWU9IndpbmRvd0ltYWdlcyIKLSAgICAgICAgICAgICAgIHZhbHVlPSJpY29ucy9mdWxsL29iajE2L3Byb2R1Y3QuZ2lmLGljb25zL2Z1bGwvb2JqMzIvcHJvZHVjdDMyLmdpZiIvPgotICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICBuYW1lPSJhcHBOYW1lIgotICAgICAgICAgICAgICAgdmFsdWU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIiPgotICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgIDwvcHJvZHVjdD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9ImVkaXQiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iT3BlbiBhIG1ldGhvZCBlbGVtZW50IgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmNwLnVpLmFjdGlvbnMub3BlbkVsZW1lbnQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0gICAgICA8YWN0aW9uU2V0Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWFjdGlvblNldC5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLnVpLmFjdGlvbnMiCi0gICAgICAgICAgICBsYWJlbD0iJWFjdGlvblNldC5sYWJlbCIKLSAgICAgICAgICAgIHZpc2libGU9InRydWUiPgotICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuaGVscC51aS5pbnRlcm5hbC5TZWFyY2hBY3Rpb24iCi0gICAgICAgICAgICAgICBpY29uPSIkbmwkL2ljb25zL2V0b29sMTYvc2VhcmNoX21lbnUuZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAudWkuc2VhcmNoIgotICAgICAgICAgICAgICAgbGFiZWw9IiVzZWFyY2hBY3Rpb24ubGFiZWwiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iaGVscC9ncm91cC5oZWxwIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sYmFyUGF0aD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmZpbGUvYnVpbGQuZ3JvdXAiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlc2VhcmNoQWN0aW9uLnRvb2x0aXAiLz4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5oZWxwLnVpLmludGVybmFsLkR5bmFtaWNIZWxwQWN0aW9uIgotICAgICAgICAgICAgICAgaWNvbj0iJG5sJC9pY29ucy9ldG9vbDE2L2hlbHAuZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAudWkuZHluYW1pY0hlbHAiCi0gICAgICAgICAgICAgICBsYWJlbD0iJWR5bmFtaWNIZWxwQWN0aW9uLmxhYmVsIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImhlbHAvZ3JvdXAuaGVscCIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5maWxlL2J1aWxkLmdyb3VwIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWR5bmFtaWNIZWxwQWN0aW9uLnRvb2x0aXAiLz4KLSAgICAgIDwvYWN0aW9uU2V0PgotICAgPC9leHRlbnNpb24+Ci0gICAKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzIj4KLSAgICAJPGFjdGl2aXR5Ci0gCQkJaWQ9ImFjdGl2aXR5LmV4dGVybmFsdG9vbCIKLSAJCQluYW1lPSJoaWRlRXh0ZXJuYWx0b29sTWVudXMiPgotIAkJPC9hY3Rpdml0eT4KLSAJCTxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nCi0JIAkJYWN0aXZpdHlJZD0iYWN0aXZpdHkuZXh0ZXJuYWx0b29sIgotCQkJcGF0dGVybj0ib3JnXC5lY2xpcHNlXC51aVwuZXh0ZXJuYWx0b29scy9vcmdcLmVjbGlwc2VcLnVpXC5leHRlcm5hbHRvb2xzXC5FeHRlcm5hbFRvb2xNZW51RGVsZWdhdGUuKiI+Ci0gCQk8L2FjdGl2aXR5UGF0dGVybkJpbmRpbmc+Ci0JPC9leHRlbnNpb24+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvcGx1Z2luX2N1c3RvbWl6YXRpb24uaW5pIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9wbHVnaW5fY3VzdG9taXphdGlvbi5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMjZkZGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9wbHVnaW5fY3VzdG9taXphdGlvbi5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1vcmcuZWNsaXBzZS51aS9ET0NLX1BFUlNQRUNUSVZFX0JBUj1UT1BfUklHSFQKLW9yZy5lY2xpcHNlLnVpL2luaXRpYWxGYXN0Vmlld0JhckxvY2F0aW9uPXJpZ2h0Ci1vcmcuZWNsaXBzZS51aS9TSE9XX1RSQURJVElPTkFMX1NUWUxFX1RBQlM9ZmFsc2UKLW9yZy5lY2xpcHNlLnVpL09QRU5fTkVXX1BFUlNQRUNUSVZFPU9QRU5fUEVSU1BFQ1RJVkVfUkVQTEFDRQotb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvYXBwbmFtZT1FUEYKLW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fVEFTS1NfUEVSX1JPVz01Ci1vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL0FERF9ST0xFX1RBU0tTX0JPWF9CR19DT0xPUl9SR0I9MjU1LDI1NSwxNTYKLW9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvQUREX1dQX0JPWF9CR19DT0xPUl9SR0I9MjU1LDI1NSwyMDUKLW9yZy5lY2xpcHNlLnRlYW0uY29yZS9pZ25vcmVfZmlsZXM9LmxvY2tcbnRydWVcbgotb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9QVUJMSVNIX05FV19ESUFHUkFNPXRydWUKLW9yZy5lY2xpcHNlLnVpL1NIT1dfUFJPR1JFU1NfT05fU1RBUlRVUD10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NwbGFzaC5ibXAgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NwbGFzaC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZWVlNDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcGxhc2guYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9NYWluQWN0aW9uQmFyQWR2aXNvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9NYWluQWN0aW9uQmFyQWR2aXNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWRlZDUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvTWFpbkFjdGlvbkJhckFkdmlzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlZpZXdIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zLk5ld1dpemFyZE1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zLlVJQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLmFjdGlvbnMuVUlPcGVuUGVyc3BlY3RpdmVEaWFsb2dBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uR3JvdXBNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Db250cmlidXRpb25JdGVtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3RvcnkuSVdvcmtiZW5jaEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5BY3Rpb25CYXJBZHZpc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklBY3Rpb25CYXJDb25maWd1cmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREVBY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JSURFQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmFwcGxpY2F0aW9uLklBY3Rpb25CYXJDb25maWd1cmVyMjsKLQotLyoqCi0gKiBDcmVhdGVzLCBhZGRzIGFuZCBkaXNwb3NlcyB0aGUgYWN0aW9ucyBhZGRlZCB0byBhIHdvcmtiZW5jaCB3aW5kb3cuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1haW5BY3Rpb25CYXJBZHZpc29yIGV4dGVuZHMgQWN0aW9uQmFyQWR2aXNvciB7Ci0KLQkvLyBBbGwgYWN0aW9ucyBzaG91bGQgYmUgY3JlYXRlZCBpbiBtYWtlQWN0aW9ucyBhbmQgcmVmZXJlbmNlZCBpbiB0aGUKLQkvLyBmaWxsIG1ldGhvZHMuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBhY3Rpb25zIGFyZW4ndCByZWNyZWF0ZWQKLQkvLyB3aGVuIGZpbGxBY3Rpb25CYXJzIGlzIGNhbGxlZCB3aXRoIEZJTExfUFJPWFkuCi0KLQkvLyBGaWxlIGFjdGlvbnMuCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gbmV3QWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gY2xvc2VBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBjbG9zZUFsbEFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHNhdmVBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBzYXZlQXNBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBzYXZlQWxsQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gcmV2ZXJ0QWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gbW92ZUFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHJlbmFtZUFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHJlZnJlc2hBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBpbXBvcnRBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBleHBvcnRBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBwcm9wZXJ0aWVzQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gZXhpdEFjdGlvbjsKLQotCS8vIEVkaXQgYWN0aW9ucy4KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBvcGVuRWxlbWVudEFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHVuZG9BY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiByZWRvQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gY3V0QWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gY29weUFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHBhc3RlQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gZGVsZXRlQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gc2VsZWN0QWxsQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gZmluZEFjdGlvbjsKLQotCS8vIE5hdmlnYXRlIGFjdGlvbnMuCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gZ29JbnRvQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gbmV4dEFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHByZXZpb3VzQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gYmFja0FjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIGZvcndhcmRBY3Rpb247Ci0KLQkvLyBXaW5kb3cgYWN0aW9ucy4KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBvcGVuTmV3V2luZG93QWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gb3BlblBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gY3VzdG9taXplUGVyc3BlY3RpdmVBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBzYXZlUGVyc3BlY3RpdmVBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiByZXNldFBlcnNwZWN0aXZlQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gY2xvc2VQZXJzcGVjdGl2ZUFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIGNsb3NlQWxsUGVyc3BlY3RpdmVBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBwcmVmZXJlbmNlc0FjdGlvbjsKLQotCS8vIFdpbmRvdyBuYXZpZ2F0aW9uIGFjdGlvbnMuCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gbmV4dEVkaXRvckFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHByZXZpb3VzRWRpdG9yQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gbmV4dFBhcnRBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBwcmV2aW91c1BhcnRBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBuZXh0UGVyc3BlY3RpdmVBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBwcmV2aW91c1BlcnNwZWN0aXZlQWN0aW9uOwotCi0JLy8gSGVscCBhY3Rpb25zLgotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHdlbGNvbWVBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBoZWxwQ29udGVudHNBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBhYm91dEFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIG5ld1dpemFyZERyb3BEb3duQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gbG9ja1Rvb2xCYXJBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBlZGl0QWN0aW9uU2V0QWN0aW9uOwotCi0JcHJvdGVjdGVkIE1lbnVNYW5hZ2VyIG1haW5IZWxwTWVudTsKLQotCXByb3RlY3RlZCBNZW51TWFuYWdlciBtYWluRmlsZU1lbnU7Ci0KLQlwcm90ZWN0ZWQgTWVudU1hbmFnZXIgaW50ZXJuYWxNZW51OwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJlcgotCSAqICAgICAgICAgICAgdGhlIGFjdGlvbiBiYXIgY29uZmlndXJlcgotCSAqLwotCXB1YmxpYyBNYWluQWN0aW9uQmFyQWR2aXNvcihJQWN0aW9uQmFyQ29uZmlndXJlciBjb25maWd1cmVyKSB7Ci0JCXN1cGVyKGNvbmZpZ3VyZXIpOwotCQl3aW5kb3cgPSBjb25maWd1cmVyLmdldFdpbmRvd0NvbmZpZ3VyZXIoKS5nZXRXaW5kb3coKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRkIHRoZSB3b3JrYmVuY2ggd2luZG93LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHdvcmtiZW5jaCB3aW5kb3cKLQkgKi8KLQlwdWJsaWMgSVdvcmtiZW5jaFdpbmRvdyBnZXRXaW5kb3coKSB7Ci0JCXJldHVybiB3aW5kb3c7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5BY3Rpb25CYXJBZHZpc29yI21ha2VBY3Rpb25zKGZpbmFsCi0JICogICAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtYWtlQWN0aW9ucyhmaW5hbCBJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQlpZiAoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5pc0Nsb3NpbmcoKSkKLQkJCXJldHVybjsKLQotCQkvLyBDcmVhdGVzIHRoZSBhY3Rpb25zIGFuZCByZWdpc3RlcnMgdGhlbS4gUmVnaXN0ZXJpbmcgaXMgbmVlZGVkIHRvCi0JCS8vIGVuc3VyZSB0aGF0IGtleSBiaW5kaW5ncyB3b3JrLiBUaGUgY29ycmVzcG9uZGluZyBjb21tYW5kcyBrZXkKLQkJLy8gYmluZGluZ3MgYXJlIGRlZmluZWQgaW4gdGhlIHBsdWdpbi54bWwgZmlsZS4gUmVnaXN0ZXJpbmcgYWxzbwotCQkvLyBwcm92aWRlcyBhdXRvbWF0aWMgZGlzcG9zYWwgb2YgdGhlIGFjdGlvbnMgd2hlbiB0aGUgd2luZG93IGlzIGNsb3NlZC4KLQotCQluZXdBY3Rpb24gPSBBY3Rpb25GYWN0b3J5Lk5FVy5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIobmV3QWN0aW9uKTsKLQotCQljbG9zZUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuQ0xPU0UuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKGNsb3NlQWN0aW9uKTsKLQotCQljbG9zZUFsbEFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuQ0xPU0VfQUxMLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihjbG9zZUFsbEFjdGlvbik7Ci0KLQkJc2F2ZUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuU0FWRS5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoc2F2ZUFjdGlvbik7Ci0KLQkJc2F2ZUFzQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5TQVZFX0FTLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihzYXZlQXNBY3Rpb24pOwotCi0JCXNhdmVBbGxBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlNBVkVfQUxMLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihzYXZlQWxsQWN0aW9uKTsKLQotCQlyZXZlcnRBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlJFVkVSVC5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIocmV2ZXJ0QWN0aW9uKTsKLQotCQltb3ZlQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5NT1ZFLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3Rlcihtb3ZlQWN0aW9uKTsKLQotCQlyZW5hbWVBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlJFTkFNRS5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIocmVuYW1lQWN0aW9uKTsKLQotCQlyZWZyZXNoQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5SRUZSRVNILmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihyZWZyZXNoQWN0aW9uKTsKLQotCQlpbXBvcnRBY3Rpb24gPSBVSUFjdGlvbkZhY3RvcnkuVUlfSU1QT1JULmNyZWF0ZSh3aW5kb3cpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGltcG9ydEFjdGlvbiwKLQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5GSUxFX0lNUE9SVF9DT05URVhUKTsKLQkJcmVnaXN0ZXIoaW1wb3J0QWN0aW9uKTsKLQotCQlleHBvcnRBY3Rpb24gPSBVSUFjdGlvbkZhY3RvcnkuVUlfRVhQT1JULmNyZWF0ZSh3aW5kb3cpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGV4cG9ydEFjdGlvbiwKLQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5GSUxFX0VYUE9SVF9DT05URVhUKTsKLQkJcmVnaXN0ZXIoZXhwb3J0QWN0aW9uKTsKLQotCQlwcm9wZXJ0aWVzQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5QUk9QRVJUSUVTLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3Rlcihwcm9wZXJ0aWVzQWN0aW9uKTsKLQotCQlleGl0QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5RVUlULmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihleGl0QWN0aW9uKTsKLQotCQlvcGVuRWxlbWVudEFjdGlvbiA9IFVJQWN0aW9uRmFjdG9yeS5PUEVOX0VMRU1FTlQuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKG9wZW5FbGVtZW50QWN0aW9uKTsKLQotCQl1bmRvQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5VTkRPLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3Rlcih1bmRvQWN0aW9uKTsKLQotCQlyZWRvQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5SRURPLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihyZWRvQWN0aW9uKTsKLQotCQljdXRBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkNVVC5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoY3V0QWN0aW9uKTsKLQotCQljb3B5QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5DT1BZLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3Rlcihjb3B5QWN0aW9uKTsKLQotCQlwYXN0ZUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuUEFTVEUuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHBhc3RlQWN0aW9uKTsKLQotCQlkZWxldGVBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkRFTEVURS5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoZGVsZXRlQWN0aW9uKTsKLQotCQlzZWxlY3RBbGxBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlNFTEVDVF9BTEwuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHNlbGVjdEFsbEFjdGlvbik7Ci0KLQkJZmluZEFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuRklORC5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoZmluZEFjdGlvbik7Ci0KLQkJZ29JbnRvQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5HT19JTlRPLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3Rlcihnb0ludG9BY3Rpb24pOwotCi0JCW5leHRBY3Rpb24gPSBBY3Rpb25GYWN0b3J5Lk5FWFQuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKG5leHRBY3Rpb24pOwotCi0JCXByZXZpb3VzQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5QUkVWSU9VUy5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIocHJldmlvdXNBY3Rpb24pOwotCi0JCWJhY2tBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkJBQ0suY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKGJhY2tBY3Rpb24pOwotCi0JCWZvcndhcmRBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkZPUldBUkQuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKGZvcndhcmRBY3Rpb24pOwotCi0JCW9wZW5OZXdXaW5kb3dBY3Rpb24gPSBBY3Rpb25GYWN0b3J5Lk9QRU5fTkVXX1dJTkRPVy5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIob3Blbk5ld1dpbmRvd0FjdGlvbik7Ci0KLQkJbmV4dEVkaXRvckFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuTkVYVF9FRElUT1IuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKG5leHRFZGl0b3JBY3Rpb24pOwotCi0JCXByZXZpb3VzRWRpdG9yQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5QUkVWSU9VU19FRElUT1IuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHByZXZpb3VzRWRpdG9yQWN0aW9uKTsKLQotCQluZXh0UGFydEFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuTkVYVF9QQVJULmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihuZXh0UGFydEFjdGlvbik7Ci0KLQkJcHJldmlvdXNQYXJ0QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5QUkVWSU9VU19QQVJULmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihwcmV2aW91c1BhcnRBY3Rpb24pOwotCi0JCW5leHRQZXJzcGVjdGl2ZUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuTkVYVF9QRVJTUEVDVElWRS5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIobmV4dFBlcnNwZWN0aXZlQWN0aW9uKTsKLQotCQlwcmV2aW91c1BlcnNwZWN0aXZlQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5QUkVWSU9VU19QRVJTUEVDVElWRQotCQkJCS5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIocHJldmlvdXNQZXJzcGVjdGl2ZUFjdGlvbik7Ci0KLQkJb3BlblBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uID0gY3JlYXRlVE5HT3BlblBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uKHdpbmRvdyk7Ci0JCW9wZW5QZXJzcGVjdGl2ZURpYWxvZ0FjdGlvbi5zZXRUZXh0KFJDUFVJUmVzb3VyY2VzLm90aGVyTWVudUl0ZW1fdGV4dCk7Ci0JCXJlZ2lzdGVyKG9wZW5QZXJzcGVjdGl2ZURpYWxvZ0FjdGlvbik7Ci0KLQkJY3VzdG9taXplUGVyc3BlY3RpdmVBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkVESVRfQUNUSU9OX1NFVFMKLQkJCQkuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKGN1c3RvbWl6ZVBlcnNwZWN0aXZlQWN0aW9uKTsKLQotCQlzYXZlUGVyc3BlY3RpdmVBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlNBVkVfUEVSU1BFQ1RJVkUuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHNhdmVQZXJzcGVjdGl2ZUFjdGlvbik7Ci0KLQkJcmVzZXRQZXJzcGVjdGl2ZUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuUkVTRVRfUEVSU1BFQ1RJVkUuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHJlc2V0UGVyc3BlY3RpdmVBY3Rpb24pOwotCi0JCWNsb3NlUGVyc3BlY3RpdmVBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkNMT1NFX1BFUlNQRUNUSVZFLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihjbG9zZVBlcnNwZWN0aXZlQWN0aW9uKTsKLQotCQljbG9zZUFsbFBlcnNwZWN0aXZlQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5DTE9TRV9BTExfUEVSU1BFQ1RJVkVTCi0JCQkJLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihjbG9zZUFsbFBlcnNwZWN0aXZlQWN0aW9uKTsKLQotCQlwcmVmZXJlbmNlc0FjdGlvbiA9IEFjdGlvbkZhY3RvcnkuUFJFRkVSRU5DRVMuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHByZWZlcmVuY2VzQWN0aW9uKTsKLQotCQl3ZWxjb21lQWN0aW9uID0gVUlBY3Rpb25GYWN0b3J5LlNIT1dfSU5UUk8uY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHdlbGNvbWVBY3Rpb24pOwotCQlJbWFnZURlc2NyaXB0b3IgaW1nRGVzID0gUkNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC9vYmoxNi9wcm9kdWN0LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCXdlbGNvbWVBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKGltZ0Rlcyk7Ci0KLQkJaGVscENvbnRlbnRzQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5IRUxQX0NPTlRFTlRTLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihoZWxwQ29udGVudHNBY3Rpb24pOwotCi0JCWFib3V0QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5BQk9VVC5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoYWJvdXRBY3Rpb24pOwotCi0JCS8vIEZJWE1FISBGaWx0ZXIgb3V0IFByb2plY3QuLi4gZnJvbSB0aGUgZHJvcC1kb3duIG1lbnUuCi0JCW5ld1dpemFyZERyb3BEb3duQWN0aW9uID0gSURFQWN0aW9uRmFjdG9yeS5ORVdfV0laQVJEX0RST1BfRE9XTgotCQkJCS5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIobmV3V2l6YXJkRHJvcERvd25BY3Rpb24pOwotCi0JCWxvY2tUb29sQmFyQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5MT0NLX1RPT0xfQkFSLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3Rlcihsb2NrVG9vbEJhckFjdGlvbik7Ci0KLQkJZWRpdEFjdGlvblNldEFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuRURJVF9BQ1RJT05fU0VUUy5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoZWRpdEFjdGlvblNldEFjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5BY3Rpb25CYXJBZHZpc29yI2ZpbGxNZW51QmFyKElNZW51TWFuYWdlcgotCSAqICAgICAgbWVudUJhcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsTWVudUJhcihJTWVudU1hbmFnZXIgbWVudUJhcikgewotCQlpZiAoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5pc0Nsb3NpbmcoKSkKLQkJCXJldHVybjsKLQkJbWFpbkZpbGVNZW51ID0gY3JlYXRlRmlsZU1lbnUobWVudUJhcik7Ci0JCW1lbnVCYXIuYWRkKG1haW5GaWxlTWVudSk7Ci0JCW1lbnVCYXIuYWRkKGNyZWF0ZUVkaXRNZW51KG1lbnVCYXIpKTsKLQotCQlJTWVudU1hbmFnZXIgbmF2TWFuYWdlciA9IGNyZWF0ZU5hdmlnYXRlTWVudShtZW51QmFyKTsKLQkJbWVudUJhci5hZGQobmF2TWFuYWdlcik7Ci0JCW5hdk1hbmFnZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJbWVudUJhci5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCW1lbnVCYXIuYWRkKGNyZWF0ZVdpbmRvd01lbnUobWVudUJhcikpOwotCi0JCW1haW5IZWxwTWVudSA9IGNyZWF0ZUhlbHBNZW51KG1lbnVCYXIpOwotCQltZW51QmFyLmFkZChtYWluSGVscE1lbnUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIEZpbGUgbWVudSBtYW5hZ2VyLgotCSAqLwotCXB1YmxpYyBNZW51TWFuYWdlciBnZXRGaWxlTWVudU1hbmFnZXIoKSB7Ci0JCXJldHVybiBtYWluRmlsZU1lbnU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgSGVscCBtZW51IG1hbmFnZXIuCi0JICovCi0JcHVibGljIE1lbnVNYW5hZ2VyIGdldEhlbHBNZW51TWFuYWdlcigpIHsKLQkJcmV0dXJuIG1haW5IZWxwTWVudTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLkFjdGlvbkJhckFkdmlzb3IjZmlsbENvb2xCYXIoSUNvb2xCYXJNYW5hZ2VyCi0JICogICAgICBjb29sQmFyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxDb29sQmFyKElDb29sQmFyTWFuYWdlciBjb29sQmFyKSB7Ci0JCWlmIChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmlzQ2xvc2luZygpKQotCQkJcmV0dXJuOwotCQljb29sQmFyLmFkZChjcmVhdGVGaWxlVG9vbGJhcihjb29sQmFyKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgRmlsZSBtZW51LgotCSAqLwotCXByb3RlY3RlZCBNZW51TWFuYWdlciBjcmVhdGVGaWxlTWVudShJTWVudU1hbmFnZXIgbWVudUJhcikgewotCQlNZW51TWFuYWdlciBmaWxlTWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlSQ1BVSVJlc291cmNlcy5maWxlTWVudUl0ZW1fdGV4dCwKLQkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRklMRSk7Ci0JCWZpbGVNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5GSUxFX1NUQVJUKSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBOZXcgc3ViIG1lbnUsIHVzaW5nIHRoZSBzYW1lIGlkIGZvciBpdCBhcyB0aGUgTmV3IGFjdGlvbi4KLQkJU3RyaW5nIG5ld1RleHQgPSBSQ1BVSVJlc291cmNlcy5maWxlTmV3TWVudUl0ZW1fdGV4dDsKLQkJU3RyaW5nIG5ld0lkID0gQWN0aW9uRmFjdG9yeS5ORVcuZ2V0SWQoKTsKLQkJTWVudU1hbmFnZXIgbmV3TWVudSA9IG5ldyBNZW51TWFuYWdlcihuZXdUZXh0LCBuZXdJZCkgewotCQkJcHVibGljIFN0cmluZyBnZXRNZW51VGV4dCgpIHsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0TWVudVRleHQoKTsKLQkJCX0KLQkJfTsKLQkJbmV3TWVudS5hZGQobmV3IFNlcGFyYXRvcihuZXdJZCkpOwotCQluZXdNZW51LmFkZChuZXcgTmV3V2l6YXJkTWVudShnZXRXaW5kb3coKSwgbnVsbCkpOwotCQluZXdNZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCWZpbGVNZW51LmFkZChuZXdNZW51KTsKLQkJZmlsZU1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk5FV19FWFQpKTsKLQotCQlmaWxlTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJTWVudU1hbmFnZXIgb3BlblN1Yk1lbnUgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJUkNQVUlSZXNvdXJjZXMuZmlsZU9wZW5NZW51SXRlbV90ZXh0LAotCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuT1BFTl9FWFQpOwotCQlvcGVuU3ViTWVudQotCQkJCS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCW9wZW5TdWJNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQlmaWxlTWVudS5hZGQob3BlblN1Yk1lbnUpOwotCi0JCWZpbGVNZW51LmFkZChjbG9zZUFjdGlvbik7Ci0JCWZpbGVNZW51LmFkZChjbG9zZUFsbEFjdGlvbik7Ci0JCWZpbGVNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQlmaWxlTWVudS5hZGQoc2F2ZUFjdGlvbik7Ci0JCWZpbGVNZW51LmFkZChzYXZlQXNBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQoc2F2ZUFsbEFjdGlvbik7Ci0JCWZpbGVNZW51LmFkZChyZXZlcnRBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZmlsZU1lbnUuYWRkKG1vdmVBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQocmVuYW1lQWN0aW9uKTsKLQkJZmlsZU1lbnUuYWRkKHJlZnJlc2hBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZmlsZU1lbnUuYWRkKGltcG9ydEFjdGlvbik7Ci0JCWZpbGVNZW51LmFkZChleHBvcnRBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZmlsZU1lbnUuYWRkKHByb3BlcnRpZXNBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZmlsZU1lbnUuYWRkKGV4aXRBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuRklMRV9FTkQpKTsKLQotCQlyZXR1cm4gZmlsZU1lbnU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgRWRpdCBtZW51LgotCSAqLwotCXByb3RlY3RlZCBNZW51TWFuYWdlciBjcmVhdGVFZGl0TWVudShJTWVudU1hbmFnZXIgbWVudUJhcikgewotCQlNZW51TWFuYWdlciBlZGl0TWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlSQ1BVSVJlc291cmNlcy5lZGl0TWVudUl0ZW1fdGV4dCwKLQkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCk7Ci0JCWVkaXRNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5FRElUX1NUQVJUKSk7Ci0JCWVkaXRNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJZWRpdE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCWVkaXRNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoIm9wZW5ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQllZGl0TWVudS5hZGQob3BlbkVsZW1lbnRBY3Rpb24pOwotCQllZGl0TWVudS5hZGQoY3V0QWN0aW9uKTsKLQkJZWRpdE1lbnUuYWRkKGNvcHlBY3Rpb24pOwotCQllZGl0TWVudS5hZGQocGFzdGVBY3Rpb24pOwotCQllZGl0TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZWRpdE1lbnUuYWRkKGRlbGV0ZUFjdGlvbik7Ci0JCWVkaXRNZW51LmFkZChzZWxlY3RBbGxBY3Rpb24pOwotCQllZGl0TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZWRpdE1lbnUuYWRkKGZpbmRBY3Rpb24pOwotCQllZGl0TWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuRURJVF9FTkQpKTsKLQkJcmV0dXJuIGVkaXRNZW51OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIE5hdmlnYXRlIG1lbnUuCi0JICovCi0JcHJvdGVjdGVkIE1lbnVNYW5hZ2VyIGNyZWF0ZU5hdmlnYXRlTWVudShJTWVudU1hbmFnZXIgbWVudUJhcikgewotCQlNZW51TWFuYWdlciBuYXZNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCVJDUFVJUmVzb3VyY2VzLm5hdmlnYXRlTWVudUl0ZW1fdGV4dCwKLQkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fTkFWSUdBVEUpOwotCQluYXZNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJbmF2TWVudS5hZGQoZ29JbnRvQWN0aW9uKTsKLQkJbmF2TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJbmF2TWVudS5hZGQobmV4dEFjdGlvbik7Ci0JCW5hdk1lbnUuYWRkKHByZXZpb3VzQWN0aW9uKTsKLQkJbmF2TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJbmF2TWVudS5hZGQoYmFja0FjdGlvbik7Ci0JCW5hdk1lbnUuYWRkKGZvcndhcmRBY3Rpb24pOwotCQluYXZNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5XQl9FTkQpKTsKLQkJcmV0dXJuIG5hdk1lbnU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgV2luZG93IG1lbnUuCi0JICovCi0JcHJvdGVjdGVkIE1lbnVNYW5hZ2VyIGNyZWF0ZVdpbmRvd01lbnUoSU1lbnVNYW5hZ2VyIG1lbnVCYXIpIHsKLQkJTWVudU1hbmFnZXIgd2luZG93TWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlSQ1BVSVJlc291cmNlcy53aW5kb3dNZW51SXRlbV90ZXh0LAotCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9XSU5ET1cpOwotCQl3aW5kb3dNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5XQl9TVEFSVCkpOwotCQl3aW5kb3dNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQotCQlNZW51TWFuYWdlciBjaGFuZ2VQZXJzcE1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJUkNQVUlSZXNvdXJjZXMud2luZG93T3BlblBlcnNwZWN0aXZlTWVudUl0ZW1fdGV4dCwKLQkJCQkib3BlblBlcnNwZWN0aXZlIik7IC8vJE5PTi1OTFMtMSQKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY2hhbmdlUGVyc3BNZW51SXRlbSA9IENvbnRyaWJ1dGlvbkl0ZW1GYWN0b3J5LlBFUlNQRUNUSVZFU19TSE9SVExJU1QKLQkJCQkuY3JlYXRlKGdldFdpbmRvdygpKTsKLQkJY2hhbmdlUGVyc3BNZW51TWdyLmFkZChjaGFuZ2VQZXJzcE1lbnVJdGVtKTsKLQkJd2luZG93TWVudS5hZGQoY2hhbmdlUGVyc3BNZW51TWdyKTsKLQkJTWVudU1hbmFnZXIgc2hvd1ZpZXdNZW51TWdyID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCVJDUFVJUmVzb3VyY2VzLndpbmRvd1Nob3dWaWV3TWVudUl0ZW1fdGV4dCwgInNob3dWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gc2hvd1ZpZXdNZW51ID0gQ29udHJpYnV0aW9uSXRlbUZhY3RvcnkuVklFV1NfU0hPUlRMSVNUCi0JCQkJLmNyZWF0ZShnZXRXaW5kb3coKSk7Ci0JCXNob3dWaWV3TWVudU1nci5hZGQoc2hvd1ZpZXdNZW51KTsKLQkJd2luZG93TWVudS5hZGQoc2hvd1ZpZXdNZW51TWdyKTsKLQotCQl3aW5kb3dNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQl3aW5kb3dNZW51LmFkZChjdXN0b21pemVQZXJzcGVjdGl2ZUFjdGlvbik7Ci0JCXdpbmRvd01lbnUuYWRkKHNhdmVQZXJzcGVjdGl2ZUFjdGlvbik7Ci0JCXdpbmRvd01lbnUuYWRkKHJlc2V0UGVyc3BlY3RpdmVBY3Rpb24pOwotCQl3aW5kb3dNZW51LmFkZChjbG9zZVBlcnNwZWN0aXZlQWN0aW9uKTsKLQkJd2luZG93TWVudS5hZGQoY2xvc2VBbGxQZXJzcGVjdGl2ZUFjdGlvbik7Ci0JCXdpbmRvd01lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCXdpbmRvd01lbnUuYWRkKHByZWZlcmVuY2VzQWN0aW9uKTsKLQkJd2luZG93TWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuV0JfRU5EKSk7Ci0JCXJldHVybiB3aW5kb3dNZW51OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUludGVybmFsTWVudShmaW5hbCBJTWVudU1hbmFnZXIgaGVscE1tZW51KSB7Ci0JCWludGVybmFsTWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlSQ1BVSVJlc291cmNlcy5tYWluQWN0aW9uQmFyQWR2aXNvcl9EaWFnbm9zaXMsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWludGVybmFsTWVudS5hZGQobmV3IEFjdGlvbigKLQkJCQlSQ1BVSVJlc291cmNlcy5tYWluQWN0aW9uQmFyQWR2aXNvcl9IZWFsdGhDaGVjaykgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVZpZXdIZWxwZXIuY2hlY2tMaWJyYXJ5SGVhbHRoKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIEhlbHAgbWVudS4KLQkgKi8KLQlwcm90ZWN0ZWQgTWVudU1hbmFnZXIgY3JlYXRlSGVscE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnVCYXIpIHsKLQkJTWVudU1hbmFnZXIgaGVscE1tZW51ID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCVJDUFVJUmVzb3VyY2VzLmhlbHBNZW51SXRlbV90ZXh0LAotCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9IRUxQKTsKLQkJaGVscE1tZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5IRUxQX1NUQVJUKSk7Ci0JCWhlbHBNbWVudS5hZGQod2VsY29tZUFjdGlvbik7Ci0KLQkJaGVscE1tZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQloZWxwTW1lbnUuYWRkKGhlbHBDb250ZW50c0FjdGlvbik7Ci0JCWhlbHBNbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKCJncm91cC5oZWxwIikpOyAvLyROT04tTkxTLTEkCi0KLQkJaGVscE1tZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQloZWxwTW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcigiZ3JvdXAuYXNzaXN0IikpOyAvLyROT04tTkxTLTEkCi0KLQkJaGVscE1tZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQloZWxwTW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcigiZ3JvdXAudG9vbHMiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQloZWxwTW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCWhlbHBNbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKCJncm91cC51cGRhdGVzIikpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gTWVudSBpdGVtcyBmb3IgaW50ZXJuYWwgdG9vbAotCQloZWxwTW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCWhlbHBNbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKCJncm91cC5pbnRlcm5hbCIpKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVJbnRlcm5hbE1lbnUoaGVscE1tZW51KTsKLQotCQloZWxwTW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCWhlbHBNbWVudS5hZGQoYWJvdXRBY3Rpb24pOwotCQloZWxwTW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkhFTFBfRU5EKSk7Ci0KLQkJcmV0dXJuIGhlbHBNbWVudTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBGaWxlIHRvb2xiYXIuCi0JICovCi0JcHJvdGVjdGVkIElUb29sQmFyTWFuYWdlciBjcmVhdGVGaWxlVG9vbGJhcihJQ29vbEJhck1hbmFnZXIgY29vbEJhcikgewotCQlJQWN0aW9uQmFyQ29uZmlndXJlcjIgYWN0aW9uQmFyQ29uZmlndXJlciA9IChJQWN0aW9uQmFyQ29uZmlndXJlcjIpIGdldEFjdGlvbkJhckNvbmZpZ3VyZXIoKTsKLQkJSU1lbnVNYW5hZ2VyIHBvcFVwTWVudSA9IG5ldyBNZW51TWFuYWdlcigpOwotCQlwb3BVcE1lbnUuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGxvY2tUb29sQmFyQWN0aW9uKSk7Ci0JCXBvcFVwTWVudS5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oZWRpdEFjdGlvblNldEFjdGlvbikpOwotCQljb29sQmFyLnNldENvbnRleHRNZW51TWFuYWdlcihwb3BVcE1lbnUpOwotCi0JCWNvb2xCYXIuYWRkKG5ldyBHcm91cE1hcmtlcihJSURFQWN0aW9uQ29uc3RhbnRzLkdST1VQX0ZJTEUpKTsKLQkJSVRvb2xCYXJNYW5hZ2VyIGZpbGVUb29sQmFyID0gYWN0aW9uQmFyQ29uZmlndXJlcgotCQkJCS5jcmVhdGVUb29sQmFyTWFuYWdlcigpOwotCQlmaWxlVG9vbEJhci5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk5FV19HUk9VUCkpOwotCQlmaWxlVG9vbEJhci5hZGQobmV3V2l6YXJkRHJvcERvd25BY3Rpb24pOwotCQlmaWxlVG9vbEJhci5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTkVXX0VYVCkpOwotCQlmaWxlVG9vbEJhci5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuU0FWRV9HUk9VUCkpOwotCQlmaWxlVG9vbEJhci5hZGQoc2F2ZUFjdGlvbik7Ci0JCWZpbGVUb29sQmFyLmFkZChzYXZlQWxsQWN0aW9uKTsKLQkJZmlsZVRvb2xCYXIuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlNBVkVfRVhUKSk7Ci0JCWZpbGVUb29sQmFyLmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0KLQkJcmV0dXJuIGZpbGVUb29sQmFyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGN1c3RvbSBvcGVuIHBlcnNwZWN0aXZlIGRpYWxvZwotCSAqIAotCSAqIEBwYXJhbSB3aW5kb3cKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gY3JlYXRlVE5HT3BlblBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uKAotCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJaWYgKHdpbmRvdyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJSVdvcmtiZW5jaEFjdGlvbiBhY3Rpb24gPSBuZXcgVUlPcGVuUGVyc3BlY3RpdmVEaWFsb2dBY3Rpb24od2luZG93KTsKLQkJYWN0aW9uLnNldElkKCJvcGVuUGVyc3BlY3RpdmVEaWFsb2ciKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9NYWluQXBwbGljYXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvTWFpbkFwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNzRhYzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9NYWluQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5Db21tYW5kTGluZVJ1blV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbi5Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250cm9scyBhbGwgYXNwZWN0cyBvZiB0aGUgYXBwbGljYXRpb24ncyBleGVjdXRpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWFpbkFwcGxpY2F0aW9uIGltcGxlbWVudHMgSUFwcGxpY2F0aW9uIHsKLQkKLQkvLyBEYXRhIG1vZGUgY29uc3RhbnRzIGZvciB1c2VyLCBjb25maWd1cmF0aW9uIGFuZCBkYXRhIGxvY2F0aW9ucy4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORSA9ICJAbm9uZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fREVGQVVMVCA9ICJAbm9EZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0hPTUUgPSAiQHVzZXIuaG9tZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9ESVIgPSAiQHVzZXIuZGlyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVVNFUl9IT01FID0gInVzZXIuaG9tZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1VTRVJfRElSID0gInVzZXIuZGlyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbiNzdGFydChvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb25Db250ZXh0KQotCSAqLwotCXB1YmxpYyBPYmplY3Qgc3RhcnQoSUFwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IFBsYXRmb3JtVUkuY3JlYXRlRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuT05fVE9QKTsKLQkJdHJ5IHsKLQkJCWJvb2xlYW4gbm9Mb2NrID0gZmFsc2U7Ci0JCQlTdHJpbmdbXSBhcHBBcmdzID0gUGxhdGZvcm0uZ2V0QXBwbGljYXRpb25BcmdzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFwcEFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoYXBwQXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKCItbGlicmFyeSIpICYmIGkgPCAoYXBwQXJncy5sZW5ndGggLSAxKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBsb2NhdGlvbiA9IGFwcEFyZ3NbaSArIDFdOwotCQkJCQlsb2NhdGlvbiA9IGJ1aWxkTG9jYXRpb24obG9jYXRpb24pOwotCQkJCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQkJTGlicmFyeVVJTWFuYWdlci5zZXRDb21tYW5kTGluZUxpYnJhcnkobG9jYXRpb24pOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChhcHBBcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoIi1kZWZhdWx0bGlicmFyeSIpICYmIGkgPCAoYXBwQXJncy5sZW5ndGggLSAxKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBsb2NhdGlvbiA9IGFwcEFyZ3NbaSArIDFdOwotCQkJCQlsb2NhdGlvbiA9IGJ1aWxkTG9jYXRpb24obG9jYXRpb24pOwotCQkJCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQkJTGlicmFyeVVJTWFuYWdlci5zZXRDb21tYW5kTGluZURlZmF1bHRMaWJyYXJ5KGxvY2F0aW9uKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoYXBwQXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKCItbm9sb2NrIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlub0xvY2sgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAoYXBwQXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKCItYmF0Y2giKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCUNvbW1hbmRMaW5lUnVuVXRpbC5nZXRJbnN0YW5jZSgpLnNldE5lZWRUb1J1bih0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghbm9Mb2NrICYmICFjaGVja1dvcmtzcGFjZUxvY2soc2hlbGwpKSB7Ci0JCQkJUGxhdGZvcm0uZW5kU3BsYXNoKCk7Ci0JCQkJcmV0dXJuIElBcHBsaWNhdGlvbi5FWElUX09LOwotCQkJfQotCi0JCQlpbnQgcmV0dXJuQ29kZSA9IGNyZWF0ZVdvcmtiZW5jaEFkdmlzb3IoZGlzcGxheSk7Ci0JCQlpZiAocmV0dXJuQ29kZSA9PSBQbGF0Zm9ybVVJLlJFVFVSTl9SRVNUQVJUKSB7Ci0JCQkJcmV0dXJuIElBcHBsaWNhdGlvbi5FWElUX1JFU1RBUlQ7Ci0JCQl9Ci0JCQlyZXR1cm4gSUFwcGxpY2F0aW9uLkVYSVRfT0s7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc2hlbGwgIT0gbnVsbCkgewotCQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWRpc3BsYXkuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbiNzdG9wKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQlmaW5hbCBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCWlmICh3b3JrYmVuY2ggPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gd29ya2JlbmNoLmdldERpc3BsYXkoKTsKLQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJCQl3b3JrYmVuY2guY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHdvcmtiZW5jaCBhZHZpc29yLgotCSAqLwotCXByb3RlY3RlZCBpbnQgY3JlYXRlV29ya2JlbmNoQWR2aXNvcihEaXNwbGF5IGRpc3BsYXkpIHsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuY3JlYXRlQW5kUnVuV29ya2JlbmNoKGRpc3BsYXksCi0JCQkJbmV3IE1haW5Xb3JrYmVuY2hBZHZpc29yKCkpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB0aGUgd29ya3NwYWNlIGxvY2sgdGhhdCBpcyB1c2VkIHRvIHByZXZlbnQgYSBsaWJyYXJ5IGJlZW4gb3BlbmVkCi0JICogbXVsdGlwbGUgdGltZXMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tXb3Jrc3BhY2VMb2NrKFNoZWxsIHNoZWxsKSB7Ci0JCUxvY2F0aW9uIHdvcmtzcGFjZUxvY2F0aW9uID0gUGxhdGZvcm0uZ2V0SW5zdGFuY2VMb2NhdGlvbigpOwotCQlTdHJpbmcgYXBwTmFtZSA9IFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCk7Ci0JCXRyeSB7Ci0JCQlpZiAod29ya3NwYWNlTG9jYXRpb24ubG9jaygpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihzaGVsbCwgTkxTLmJpbmQoCi0JCQkJCVJDUFVJUmVzb3VyY2VzLndvcmtzcGFjZUNhbm5vdExvY2tUaXRsZSwgYXBwTmFtZSksIE5MUwotCQkJCQkuYmluZChSQ1BVSVJlc291cmNlcy53b3Jrc3BhY2VDYW5ub3RMb2NrTWVzc2FnZSwgYXBwTmFtZSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlSQ1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCU5MUwotCQkJCQkJCS5iaW5kKFJDUFVJUmVzb3VyY2VzLndvcmtzcGFjZUNhbm5vdExvY2tNZXNzYWdlLAotCQkJCQkJCQkJYXBwTmFtZSksIGUpOwotCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oc2hlbGwsIE5MUy5iaW5kKAotCQkJCQlSQ1BVSVJlc291cmNlcy53b3Jrc3BhY2VDYW5ub3RMb2NrVGl0bGUsIGFwcE5hbWUpLCBlCi0JCQkJCS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIHRha2VuIGZyb20gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0b3IuTG9jYXRpb25NYW5hZ2VyLmJ1aWxkTG9jYXRpb24KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBidWlsZExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgewotCQlTdHJpbmcgdHJpbW1lZExvY2F0aW9uID0gbG9jYXRpb24udHJpbSgpOwotCQlTdHJpbmcgcmVzdWx0ID0gdHJpbW1lZExvY2F0aW9uOwotCQlpZiAodHJpbW1lZExvY2F0aW9uLmVxdWFsc0lnbm9yZUNhc2UoTk9ORSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRyaW1tZWRMb2NhdGlvbi5lcXVhbHNJZ25vcmVDYXNlKE5PX0RFRkFVTFQpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0cmltbWVkTG9jYXRpb24uc3RhcnRzV2l0aChVU0VSX0hPTUUpKSB7Ci0JCQlTdHJpbmcgYmFzZSA9IHN1YnN0aXR1dGVWYXIobG9jYXRpb24sIFVTRVJfSE9NRSwgUFJPUF9VU0VSX0hPTUUpOwotCQkJcmVzdWx0ID0gbmV3IEZpbGUoYmFzZSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCX0gZWxzZSBpZiAodHJpbW1lZExvY2F0aW9uLnN0YXJ0c1dpdGgoVVNFUl9ESVIpKSB7Ci0JCQlTdHJpbmcgYmFzZSA9IHN1YnN0aXR1dGVWYXIobG9jYXRpb24sIFVTRVJfRElSLCBQUk9QX1VTRVJfRElSKTsKLQkJCXJlc3VsdCA9IG5ldyBGaWxlKGJhc2UpLmdldEFic29sdXRlUGF0aCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzdWJzdGl0dXRlVmFyKFN0cmluZyBzb3VyY2UsIFN0cmluZyB2YXIsIFN0cmluZyBwcm9wKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShwcm9wLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHZhbHVlICsgc291cmNlLnN1YnN0cmluZyh2YXIubGVuZ3RoKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9NYWluV29ya2JlbmNoQWR2aXNvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9NYWluV29ya2JlbmNoQWR2aXNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTE5ZWY2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvTWFpbldvcmtiZW5jaEFkdmlzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkNvbW1hbmRMaW5lUnVuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSVdvcmtiZW5jaENvbmZpZ3VyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hXaW5kb3dBZHZpc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLm1vZGVsLldvcmtiZW5jaEFkYXB0ZXJCdWlsZGVyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogQ3JlYXRlcyB0aGUgd2luZG93IGFkdmlzb3IgYW5kIHNwZWNpZmllcyB0aGUgcGVyc3BlY3RpdmUgaWQgZm9yIHRoZSBpbml0aWFsCi0gKiB3aW5kb3cuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWFpbldvcmtiZW5jaEFkdmlzb3IgZXh0ZW5kcyBXb3JrYmVuY2hBZHZpc29yIHsKLQotCXByb3RlY3RlZCBMb2dnZXIgbG9nZ2VyOwotCi0JcHJpdmF0ZSB2b2lkIGRlY2xhcmVXb3JrYmVuY2hJbWFnZShCdW5kbGUgaWRlQnVuZGxlLCBTdHJpbmcgc3ltYm9saWNOYW1lLAotCQkJU3RyaW5nIHBhdGgsIGJvb2xlYW4gc2hhcmVkKSB7Ci0JCVVSTCB1cmwgPSBGaWxlTG9jYXRvci5maW5kKGlkZUJ1bmRsZSwgbmV3IFBhdGgocGF0aCksIG51bGwpOwotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JCWdldFdvcmtiZW5jaENvbmZpZ3VyZXIoKS5kZWNsYXJlSW1hZ2Uoc3ltYm9saWNOYW1lLCBkZXNjLCBzaGFyZWQpOwotCX0KLQotCS8qKgotCSAqIERlY2xhcmVzIGFsbCBJREUtc3BlY2lmaWMgd29ya2JlbmNoIGltYWdlcyB0aGF0IGFyZSB1c2VkIGJ5IHNvbWUgYnVuZGxlZAotCSAqIHBsdWdpbnMKLQkgKiAKLQkgKiBAc2VlIElXb3JrYmVuY2hDb25maWd1cmVyI2RlY2xhcmVJbWFnZQotCSAqLwotCXByaXZhdGUgdm9pZCBkZWNsYXJlV29ya2JlbmNoSW1hZ2VzKCkgewotCQlmaW5hbCBTdHJpbmcgSUNPTlNfUEFUSCA9ICIkbmwkL2ljb25zL2Z1bGwvIjsvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBQQVRIX09CSkVDVCA9IElDT05TX1BBVEggKyAib2JqMTYvIjsgLy8gTW9kZWwgb2JqZWN0IC8vIGljb25zLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgUEFUSF9FVE9PTCA9IElDT05TX1BBVEggKyAiZXRvb2wxNi8iOyAvLyBFbmFibGVkIHRvb2xiYXIgaWNvbnMuLy8kTk9OLU5MUy0xJAotCi0JCUJ1bmRsZSBpZGVCdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnVpLmlkZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJZGVjbGFyZVdvcmtiZW5jaEltYWdlKGlkZUJ1bmRsZSwgSURFLlNoYXJlZEltYWdlcy5JTUdfT0JKX1BST0pFQ1QsCi0JCQkJUEFUSF9PQkpFQ1QgKyAicHJqX29iai5naWYiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAotCQkJCUlERS5TaGFyZWRJbWFnZXMuSU1HX09CSl9QUk9KRUNUX0NMT1NFRCwgUEFUSF9PQkpFQ1QKLQkJCQkJCSsgImNwcmpfb2JqLmdpZiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkJZGVjbGFyZVdvcmtiZW5jaEltYWdlKGlkZUJ1bmRsZSwKLQkJCQlJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfT0JKU19FUlJPUl9QQVRILCBQQVRIX09CSkVDVAotCQkJCQkJKyAiZXJyb3JfdHNrLmdpZiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCi0JCQkJSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX09CSlNfV0FSTklOR19QQVRILCBQQVRIX09CSkVDVAotCQkJCQkJKyAid2Fybl90c2suZ2lmIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJZGVjbGFyZVdvcmtiZW5jaEltYWdlKGlkZUJ1bmRsZSwKLQkJCQlJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfT0JKU19JTkZPX1BBVEgsIFBBVEhfT0JKRUNUCi0JCQkJCQkrICJpbmZvX3Rzay5naWYiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJCAgCSAgCQotCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAotCQkJCUlERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19FVE9PTF9QUk9CTEVNX0NBVEVHT1JZLAotCQkJCVBBVEhfRVRPT0wgKyAicHJvYmxlbV9jYXRlZ29yeS5naWYiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yI2luaXRpYWxpemUoSVdvcmtiZW5jaENvbmZpZ3VyZXIpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJV29ya2JlbmNoQ29uZmlndXJlciBjb25maWd1cmVyKSB7Ci0JCWxvZ2dlciA9IFJDUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKTsKLQkJc3VwZXIuaW5pdGlhbGl6ZShjb25maWd1cmVyKTsKLQkJY29uZmlndXJlci5zZXRTYXZlQW5kUmVzdG9yZSh0cnVlKTsKLQotCQkvLyBSZW1lbWJlciB0aGUgaW5zdGFsbCBkaXIgYW5kIGhhbmRsZSB0aGUgLWxpYnJhcnkgY29tbWFuZCBsaW5lCi0JCS8vIHBhcmFtZXRlci4KLQkJU3RyaW5nIGFwcFN0YXJ0RGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOyAvLyROT04tTkxTLTEkCi0JCWxvZ2dlci5sb2dJbmZvKFJDUFVJUmVzb3VyY2VzLnN0YXJ0dXBfZGlyX2xvZ19pbmZvX3RleHQgKyBhcHBTdGFydERpcik7IAotCi0JCWRlY2xhcmVXb3JrYmVuY2hJbWFnZXMoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvciNjcmVhdGVXb3JrYmVuY2hXaW5kb3dBZHZpc29yKElXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyKQotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hXaW5kb3dBZHZpc29yIGNyZWF0ZVdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IoCi0JCQlJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjb25maWd1cmVyKSB7Ci0JCXJldHVybiBuZXcgTWFpbldvcmtiZW5jaFdpbmRvd0Fkdmlzb3IoY29uZmlndXJlcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3IjZ2V0SW5pdGlhbFdpbmRvd1BlcnNwZWN0aXZlSWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5pdGlhbFdpbmRvd1BlcnNwZWN0aXZlSWQoKSB7Ci0JCWlmIChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmlzQ2xvc2luZygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBBdXRob3JpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvciNwcmVTdGFydHVwKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVTdGFydHVwKCkgewotCQlzdXBlci5wcmVTdGFydHVwKCk7Ci0JCVdvcmtiZW5jaEFkYXB0ZXJCdWlsZGVyLnJlZ2lzdGVyQWRhcHRlcnMoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvciNwcmVTaHV0ZG93bigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJlU2h1dGRvd24oKSB7Ci0JCS8vIFJlbWVtYmVyIHdoZXRoZXIgdGhlIHdlbGNvbWUgdmlldyBleGlzdHMgb3Igbm90IGJlZm9yZSBleGl0aW5nLgotCQlJV29ya2JlbmNoV2luZG93IGFjdGl2ZVdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmIChhY3RpdmVXaW5kb3cgIT0gbnVsbCkgewotCi0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gYWN0aXZlV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlpZiAocGFnZSBpbnN0YW5jZW9mIFdvcmtiZW5jaFBhZ2UpIHsKLQkJCQkJSVZpZXdSZWZlcmVuY2VbXSB2d1JlZkxpc3QgPSBwYWdlLmdldFZpZXdSZWZlcmVuY2VzKCk7Ci0KLQkJCQkJYm9vbGVhbiBpbnRyb1ZpZXdFeGlzdHMgPSBmYWxzZTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2d1JlZkxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmICh2d1JlZkxpc3RbaV0uZ2V0SWQoKS5lcXVhbHMoCi0JCQkJCQkJCSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pbnRyb3ZpZXciKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaW50cm9WaWV3RXhpc3RzID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBSQ1BVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQkJCXN0b3JlCi0JCQkJCQkJLnNldFZhbHVlKAotCQkJCQkJCQkJIndlbGNvbWVfaW50cm9fdmlld19leGlzdHMiLCBpbnRyb1ZpZXdFeGlzdHMpOyAvLyROT04tTkxTLTEkCi0JCQkJCVJDUFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3IjcG9zdFNodXRkb3duKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwb3N0U2h1dGRvd24oKSB7Ci0JCXRyeSB7Ci0JCQkvLyBTYXZlIHRoZSB3b3Jrc3BhY2UgYW5kIHJlbW92ZSAuc25hcCBmaWxlIGluIHRoZQotCQkJLy8gd29ya3NwYWNlXC5tZXRhZGF0YVwucGx1Z2luc1xvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyBmb2xkZXIuCi0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuc2F2ZSh0cnVlLCBudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvciNwb3N0U3RhcnR1cCgpCi0JICovCi0JcHVibGljIHZvaWQgcG9zdFN0YXJ0dXAoKSB7Ci0JCUNvbW1hbmRMaW5lUnVuVXRpbCBydW5VdGlsID0gQ29tbWFuZExpbmVSdW5VdGlsLmdldEluc3RhbmNlKCk7Ci0JCWlmIChydW5VdGlsLmlzTmVlZFRvUnVuKCkpIHsKLQkJCXJ1blV0aWwuZXhlY3V0ZShQbGF0Zm9ybS5nZXRBcHBsaWNhdGlvbkFyZ3MoKSk7Ci0KLQkJCWZpbmFsIElXb3JrYmVuY2ggd29ya2JlbmNoID0gZ2V0V29ya2JlbmNoQ29uZmlndXJlcigpCi0JCQkJCS5nZXRXb3JrYmVuY2goKTsKLQkJCXdvcmtiZW5jaC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXdvcmtiZW5jaC5jbG9zZSgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJc3VwZXIucG9zdFN0YXJ0dXAoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvTWFpbldvcmtiZW5jaFdpbmRvd0Fkdmlzb3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvTWFpbldvcmtiZW5jaFdpbmRvd0Fkdmlzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjNjEyMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL01haW5Xb3JrYmVuY2hXaW5kb3dBZHZpc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLkFjdGlvbkJhckFkdmlzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSUFjdGlvbkJhckNvbmZpZ3VyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSVdvcmtiZW5jaENvbmZpZ3VyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoV2luZG93QWR2aXNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5BY3Rpb25TZXRDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLlBsdWdpbkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50cm8uSUludHJvUGFydDsKLQotLyoqCi0gKiBUaGUgYXBwbGljYXRpb24gc3BlY2lmaWMgd29ya2JlbmNoIHdpbmRvdyBhZHZpc29yLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogZml4IHRvIGhpZGUgdGhlIHdvcmtpbmcgc2V0IGFuZCBleHRlcm5hbCB0b29sIGJhciBidXR0b25zIEAgMjAwNy0wNi0xNAotICovCi1wdWJsaWMgY2xhc3MgTWFpbldvcmtiZW5jaFdpbmRvd0Fkdmlzb3IgZXh0ZW5kcyBXb3JrYmVuY2hXaW5kb3dBZHZpc29yIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nW10gZmlsZU1lbnVSZW1vdmFsTGlzdCA9IHsKLQkJCSJvcmcuZWNsaXBzZS51aS5vcGVuTG9jYWxGaWxlIiwgLy8kTk9OLU5MUy0xJAotCQkJIm9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5uZXdUZXh0RWRpdG9yIiwgLy8kTk9OLU5MUy0xJAotCQkJIm9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5vcGVuRXh0ZXJuYWxGaWxlIiwgLy8kTk9OLU5MUy0xJAotCQkJImNvbnZlcnN0TGluZURlbGltaXRlcnNUbyIgLy8kTk9OLU5MUy0xJAotCX07Ci0KLQlwcm90ZWN0ZWQgTWFpbkFjdGlvbkJhckFkdmlzb3IgbWFpbkFjdGlvbkJhcjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZwlBTk5PVEFUSU9OTkFWSUdBVElPTl9JRAkJPSAib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0LmFjdGlvblNldC5hbm5vdGF0aW9uTmF2aWdhdGlvbiI7CS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcJV09SS0lOR1NFVEFDVElPTlNFVF9JRAkJPSAib3JnLmVjbGlwc2UudWkuV29ya2luZ1NldEFjdGlvblNldCI7CQkJCQkJCS8vJE5PTi1OTFMtMSQKLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZwlFWFRFUk5BTFRPT0xTU0VUX0lECQkJPSAib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5FeHRlcm5hbFRvb2xzU2V0IjsJCQkJLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgSVBlcnNwZWN0aXZlTGlzdGVuZXIgcGVyc3BlY3RpdmVMaXN0ZW5lciA9IG5ldyBJUGVyc3BlY3RpdmVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcGVyc3BlY3RpdmVDaGFuZ2VkKElXb3JrYmVuY2hQYWdlIHBhZ2UsCi0JCQkJSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBwZXJzcGVjdGl2ZSwgU3RyaW5nIGNoYW5nZUlkKSB7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHBlcnNwZWN0aXZlQWN0aXZhdGVkKElXb3JrYmVuY2hQYWdlIHBhZ2UsCi0JCQkJSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBwZXJzcGVjdGl2ZSkgewotCQkJLy8gZG8gbm90IHNob3cgdGhlIFdvcmtpbmdTZXRzYWN0aW9uU2V0IHRvb2xiYXIgYnV0dG9ucwotCQkJcGFnZS5oaWRlQWN0aW9uU2V0KFdPUktJTkdTRVRBQ1RJT05TRVRfSUQpOyAKLQkJCS8vIGRvIG5vdCBzaG93IHRoZSBFeHRlcm5hbCBUb29scyBidXR0b24gb24gdGhlIHRvb2xiYXIKLS8vCQkJcGFnZS5oaWRlQWN0aW9uU2V0KEVYVEVSTkFMVE9PTFNTRVRfSUQpOwotCQkJcGFnZS5oaWRlQWN0aW9uU2V0KEFOTk9UQVRJT05OQVZJR0FUSU9OX0lEKTsJCi0JCX0KLQl9OwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyZXIKLQkgKiAgICAgICAgICAgIEFuIG9iamVjdCBmb3IgY29uZmlndXJpbmcgdGhlIHdvcmtiZW5jaCB3aW5kb3cuCi0JICovCi0JcHVibGljIE1haW5Xb3JrYmVuY2hXaW5kb3dBZHZpc29yKElXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIpIHsKLQkJc3VwZXIoY29uZmlndXJlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hXaW5kb3dBZHZpc29yI2NyZWF0ZUFjdGlvbkJhckFkdmlzb3IoSUFjdGlvbkJhckNvbmZpZ3VyZXIpCi0JICovCi0JcHVibGljIEFjdGlvbkJhckFkdmlzb3IgY3JlYXRlQWN0aW9uQmFyQWR2aXNvcigKLQkJCUlBY3Rpb25CYXJDb25maWd1cmVyIGNvbmZpZ3VyZXIpIHsKLQkJbWFpbkFjdGlvbkJhciA9IG5ldyBNYWluQWN0aW9uQmFyQWR2aXNvcihjb25maWd1cmVyKTsKLQkJcmV0dXJuIG1haW5BY3Rpb25CYXI7Ci0JfQotCi0JLyoqCi0JICogYWRkIG9wZXJhdGlvbnMgdG8gYmUgcGVyZm9ybWVkIGF0IHBvc3RXaW5kb3dDcmVhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwb3N0V2luZG93Q3JlYXRlKCkgewotCQlJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjb25maWd1cmVyID0gZ2V0V2luZG93Q29uZmlndXJlcigpOwotCQlPYmplY3QgZGF0YSA9IGNvbmZpZ3VyZXIuZ2V0RGF0YSgiaXNSZXN0b3JlZFdvcmtiZW5jaCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCWNvbmZpZ3VyZXIuZ2V0V2luZG93KCkuZ2V0U2hlbGwoKS5zZXRMb2NhdGlvbigzMCwgMzApOwotCQkJY29uZmlndXJlci5nZXRXaW5kb3coKS5nZXRTaGVsbCgpLnNldFNpemUoMTAyNCwgNzYwKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoV2luZG93QWR2aXNvciNwcmVXaW5kb3dPcGVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVXaW5kb3dPcGVuKCkgewotCQlJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjb25maWd1cmVyID0gZ2V0V2luZG93Q29uZmlndXJlcigpOwotCQljb25maWd1cmVyLnNldFNob3dDb29sQmFyKHRydWUpOwotCQljb25maWd1cmVyLnNldFNob3dQZXJzcGVjdGl2ZUJhcih0cnVlKTsKLQkJY29uZmlndXJlci5zZXRTaG93U3RhdHVzTGluZSh0cnVlKTsKLQkJY29uZmlndXJlci5zZXRTaG93UHJvZ3Jlc3NJbmRpY2F0b3IodHJ1ZSk7Ci0JCWNvbmZpZ3VyZXIuc2V0VGl0bGUoUkNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZygicHJvZHVjdE5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3IjcG9zdFdpbmRvd09wZW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHBvc3RXaW5kb3dPcGVuKCkgewotCQlpZiAoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5pc0Nsb3NpbmcoKSkgICAgIAotCQkJcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQlJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjb25maWd1cmVyID0gZ2V0V2luZG93Q29uZmlndXJlcigpOwotCQljb25maWd1cmVyLmdldFdpbmRvdygpLmdldFNoZWxsKCkuc2V0SW1hZ2UoCi0JCQkJUkNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKCJmdWxsL29iajE2L3Byb2R1Y3QuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0KLQkJTWVudU1hbmFnZXIgZmlsZU1tZW51ID0gbWFpbkFjdGlvbkJhci5nZXRGaWxlTWVudU1hbmFnZXIoKTsKLQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IGZpbGVNbWVudS5nZXRJdGVtcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobmVlZFRvUmVtb3ZlRnJvbShpdGVtc1tpXS5nZXRJZCgpLCBmaWxlTWVudVJlbW92YWxMaXN0KSkKLQkJCQlmaWxlTW1lbnUucmVtb3ZlKGl0ZW1zW2ldKTsKLQkJfQotCi0JCS8vIHRoaXMgaXMgYSBoYWNrIHRvIGNoYW5nZSB0aGUgSGVscCB8IFNvZnR3YXJlIFVwZGF0ZXMgfCBNYW5hZ2UKLQkJLy8gQ29uZmlndXJhdGlvbnMgdG8gTWFuYWdlIFNvZnR3YXJlIENvbmZpZ3VyYXRpb24uLi4KLQkJTWVudU1hbmFnZXIgaGVscE1tZW51ID0gbWFpbkFjdGlvbkJhci5nZXRIZWxwTWVudU1hbmFnZXIoKTsKLQkJaXRlbXMgPSBoZWxwTW1lbnUuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGl0ZW1zW2ldIGluc3RhbmNlb2YgQWN0aW9uU2V0Q29udHJpYnV0aW9uSXRlbSkgewotCQkJCUFjdGlvblNldENvbnRyaWJ1dGlvbkl0ZW0gZWxlbWVudCA9IChBY3Rpb25TZXRDb250cmlidXRpb25JdGVtKSBpdGVtc1tpXTsKLQkJCQlpZiAoZWxlbWVudC5nZXRJZCgpLmVxdWFscygib3JnLmVjbGlwc2UudXBkYXRlLnVpLnVwZGF0ZU1lbnUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCUlDb250cmlidXRpb25JdGVtIGNvbnRyaWJNZW51TWdyID0gZWxlbWVudC5nZXRJbm5lckl0ZW0oKTsKLQkJCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBzdWJNZW51SXRlbXMgPSAoKE1lbnVNYW5hZ2VyKSBjb250cmliTWVudU1ncikKLQkJCQkJCQkuZ2V0SXRlbXMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzdWJNZW51SXRlbXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUlDb250cmlidXRpb25JdGVtIGlubmVySXRlbSA9ICgoQWN0aW9uU2V0Q29udHJpYnV0aW9uSXRlbSkgc3ViTWVudUl0ZW1zW2pdKQotCQkJCQkJCQkuZ2V0SW5uZXJJdGVtKCk7Ci0JCQkJCQlpZiAoaW5uZXJJdGVtIGluc3RhbmNlb2YgUGx1Z2luQWN0aW9uQ29udHJpYnV0aW9uSXRlbQotCQkJCQkJCQkmJiBpbm5lckl0ZW0uZ2V0SWQoKS5lcXVhbHMoCi0JCQkJCQkJCQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5jb25maWdNYW5hZ2VyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCUlBY3Rpb24gYWN0aW9uID0gKChQbHVnaW5BY3Rpb25Db250cmlidXRpb25JdGVtKSBpbm5lckl0ZW0pCi0JCQkJCQkJCQkuZ2V0QWN0aW9uKCk7Ci0JCQkJCQkJYWN0aW9uCi0JCQkJCQkJCQkuc2V0VGV4dChSQ1BVSVJlc291cmNlcy5tZW51X2hlbHBfc29mdHdhcmVfdXBkYXRlc19tYW5hZ2Vfc29mdHdhcmVfY29uZmlnX3RleHQpOyAKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5hZGRQZXJzcGVjdGl2ZUxpc3RlbmVyKHBlcnNwZWN0aXZlTGlzdGVuZXIpOwotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCS8vIGRvIG5vdCBzaG93IHRoZSBXb3JraW5nU2V0c2FjdGlvblNldCB0b29sYmFyIGJ1dHRvbnMKLQkJcGFnZS5oaWRlQWN0aW9uU2V0KFdPUktJTkdTRVRBQ1RJT05TRVRfSUQpOyAKLQkJLy8gZG8gbm90IHNob3cgdGhlIEV4dGVybmFsIFRvb2xzIGJ1dHRvbiBvbiB0aGUgdG9vbGJhcgotLy8JCXBhZ2UuaGlkZUFjdGlvblNldChFWFRFUk5BTFRPT0xTU0VUX0lEKTsKLQkJcGFnZS5oaWRlQWN0aW9uU2V0KEFOTk9UQVRJT05OQVZJR0FUSU9OX0lEKTsJCi0JCQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBuZWVkVG9SZW1vdmVGcm9tKFN0cmluZyBpZCwgU3RyaW5nW10gbGlzdCkgewotCQlib29sZWFuIHJjID0gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobGlzdFtpXS5lcXVhbHMoaWQpKSB7Ci0JCQkJcmMgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByYzsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgY3VzdG9tIG9wZXJhdGlvbnMgYXQgcG9zdFdpbmRvd1Jlc3RvcmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwb3N0V2luZG93UmVzdG9yZSgpIHRocm93cyBXb3JrYmVuY2hFeGNlcHRpb24gewotCQlJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjb25maWd1cmVyID0gZ2V0V2luZG93Q29uZmlndXJlcigpOwotCQljb25maWd1cmVyLnNldERhdGEoImlzUmVzdG9yZWRXb3JrYmVuY2giLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCX0KLQotCS8qKgotCSogQ3VzdG9taXplIG9wZW5JbnRybyB0byBhdm9pZCBhbiBFY2xpcHNlIGJ1ZwotCSogQ3VzdG9taXplcyBpdCBzbyBpdCB3aWxsIG9wZW4gaW4gdGhlIHN0YW5kYnkgbW9kZSBpZiB0aGlzIGlzIGEgcmVzdG9yZWQKLQkqIHNlc3Npb24gYW5kIHRoZSBsYXN0IHNlc3Npb24gaGFkIHRoZSBJbnRyb1ZpZXcgb3Blbiwgb3RoZXJ3aXNlIGNsb3NlIGl0Ci0JKiAKLQkqLwotCXB1YmxpYyB2b2lkIG9wZW5JbnRybygpIHsKLQkJc3VwZXIub3BlbkludHJvKCk7Ci0KLQkJSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlciA9IGdldFdpbmRvd0NvbmZpZ3VyZXIoKTsKLQkJT2JqZWN0IGRhdGEgPSBjb25maWd1cmVyLmdldERhdGEoImlzUmVzdG9yZWRXb3JrYmVuY2giKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCQkvLyBpZiBub3QgcmVzdG9yZWQgd29ya3NwYWNlLCBqdXN0IGV4ZWMgdGhlIGRlZmF1bHQgaW4gc3VwZXIuCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBhbHdheXMgYWxsb3dzIHRoZSBpbnRybyB2aWV3IHRvIG9wZW4gZmlyc3QsIGFuZCB0aGVuIHB1dCBpdCBpbnRvCi0JCS8vIHN0YW5kYnkgbW9kZQotCQkvLyBvdGhlcndpc2Ugb3RoZXIgZmFzdCB2aWV3cyBzdWNoIGFzIHNlYXJjaCBoZWxwIHdpbGwgYmUgb3Blbi1lZCBhcwotCQkvLyBmdWxsIG1vZGUKLQkJLy8gZXZlbiB0aGUgd2VsY29tZSBwYWdlIGlzIGNsb3NlZC4KLQkJLy8gaWYgKGlzSW50cm9WaWV3RXhpc3RzSW5MYXN0U2Vzc2lvbigpKSB7Ci0JCUlXb3JrYmVuY2hDb25maWd1cmVyIHdiQ29uZmlnID0gZ2V0V2luZG93Q29uZmlndXJlcigpCi0JCQkJLmdldFdvcmtiZW5jaENvbmZpZ3VyZXIoKTsKLQkJSUludHJvUGFydCBpbnRyb1BhcnQgPSB3YkNvbmZpZy5nZXRXb3JrYmVuY2goKS5nZXRJbnRyb01hbmFnZXIoKQotCQkJCS5nZXRJbnRybygpOwotCQl3YkNvbmZpZy5nZXRXb3JrYmVuY2goKS5nZXRJbnRyb01hbmFnZXIoKS5zZXRJbnRyb1N0YW5kYnkoaW50cm9QYXJ0LAotCQkJCXRydWUpOwotCQkvLyB9IGVsc2UgewotCQlpZiAoIWlzSW50cm9WaWV3RXhpc3RzSW5MYXN0U2Vzc2lvbigpKSB7Ci0JCQljbG9zZUludHJvVmlldygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSW50cm9WaWV3RXhpc3RzSW5MYXN0U2Vzc2lvbigpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFJDUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJcmV0dXJuIHN0b3JlLmdldEJvb2xlYW4oIndlbGNvbWVfaW50cm9fdmlld19leGlzdHMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBjbG9zZUludHJvVmlldygpIHsKLQkJdHJ5IHsKLQkJCUlWaWV3UGFydCB2cCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5maW5kVmlldygKLQkJCQkJCQkib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaW50cm92aWV3Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5oaWRlVmlldyh2cCk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL1JDUFVJUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL1JDUFVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYWQzZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9SQ1BVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIFJDUCBVSSBwbHVnLWluIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJDUFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFJDUFVJUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJDUFVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbiNzdG9wKEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUkNQVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvUkNQVUlSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvUkNQVUlSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThkOGFmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL1JDUFVJUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSQ1BVSVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBSQ1BVSVJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFJDUFVJUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlTWVudUl0ZW1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVOZXdNZW51SXRlbV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZU9wZW5NZW51SXRlbV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdE1lbnVJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuYXZpZ2F0ZU1lbnVJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hNZW51SXRlbV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbk1lbnVJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aW5kb3dNZW51SXRlbV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2luZG93T3BlblBlcnNwZWN0aXZlTWVudUl0ZW1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpbmRvd1Nob3dWaWV3TWVudUl0ZW1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGhlbHBNZW51SXRlbV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3RHJvcERvd25fdG9vbHRpcF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3RoZXJNZW51SXRlbV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkF1dGhvcmluZ1BlcnNwZWN0aXZlQWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuQnJvd3NpbmdQZXJzcGVjdGl2ZUFjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdEFjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBncmFkZUxpYnJhcnlBY3Rpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YXJ0dXBfZGlyX2xvZ19pbmZvX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZW51X2hlbHBfc29mdHdhcmVfdXBkYXRlc19tYW5hZ2Vfc29mdHdhcmVfY29uZmlnX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3Jrc3BhY2VDYW5ub3RMb2NrVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3Jrc3BhY2VDYW5ub3RMb2NrTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1haW5BY3Rpb25CYXJBZHZpc29yX0RpYWdub3NpczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1haW5BY3Rpb25CYXJBZHZpc29yX0hlYWx0aENoZWNrOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFpbkFjdGlvbkJhckFkdmlzb3JfUmVtb3ZlUmVmZXJlbmNlOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgUkNQVUlSZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEzMDY3Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBGaWxlIE1lbnUKLWZpbGVNZW51SXRlbV90ZXh0PSZGaWxlCi1maWxlTmV3TWVudUl0ZW1fdGV4dD0mTmV3Ci1maWxlT3Blbk1lbnVJdGVtX3RleHQ9TyZwZW4KLQotIyBFZGl0IE1lbnUKLWVkaXRNZW51SXRlbV90ZXh0PSZFZGl0Ci0KLSMgTmF2aWdhdGUgTWVudQotbmF2aWdhdGVNZW51SXRlbV90ZXh0PSZOYXZpZ2F0ZQotCi0jIFNlYXJjaCBNZW51Ci1zZWFyY2hNZW51SXRlbV90ZXh0PSZTZWFyY2gKLQotIyBDb25maWd1cmF0aW9uIE1lbnUKLWNvbmZpZ3VyYXRpb25NZW51SXRlbV90ZXh0PSZDb25maWd1cmF0aW9uCi0KLSMgV2luZG93IE1lbnUKLXdpbmRvd01lbnVJdGVtX3RleHQ9JldpbmRvdwotd2luZG93T3BlblBlcnNwZWN0aXZlTWVudUl0ZW1fdGV4dD0mT3BlbiBQZXJzcGVjdGl2ZQotd2luZG93U2hvd1ZpZXdNZW51SXRlbV90ZXh0PVNob3cgJlZpZXcKLQotIyBIZWxwIE1lbnUKLWhlbHBNZW51SXRlbV90ZXh0PSZIZWxwCi0KLSMgTmV3IERyb3AgRG93biBNZW51Ci1uZXdEcm9wRG93bl90b29sdGlwX3RleHQ9TmV3Ci1vdGhlck1lbnVJdGVtX3RleHQ9T3RoZXIuLi4KLQotIyBPcGVuIFBlcnNwZWN0aXZlIEFjdGlvbnMKLW9wZW5BdXRob3JpbmdQZXJzcGVjdGl2ZUFjdGlvbl90ZXh0PUF1dGhvcmluZwotb3BlbkJyb3dzaW5nUGVyc3BlY3RpdmVBY3Rpb25fdGV4dD1Ccm93c2luZwotCi0jIE1pc2MgQWN0aW9ucwotZWRpdEFjdGlvbl90ZXh0PSZFZGl0Ci11cGdyYWRlTGlicmFyeUFjdGlvbl90ZXh0PVVwZ3JhZGUgTWV0aG9kIExpYnJhcnkgZnJvbSBJMSB0byBJMi4uLgotCi1zdGFydHVwX2Rpcl9sb2dfaW5mb190ZXh0PUlORk86IEFwcGxpY2F0aW9uIHN0YXJ0IGRpcmVjdG9yeSA9Ci1tZW51X2hlbHBfc29mdHdhcmVfdXBkYXRlc19tYW5hZ2Vfc29mdHdhcmVfY29uZmlnX3RleHQ9Jk1hbmFnZSBTb2Z0d2FyZSBDb25maWd1cmF0aW9uLi4uCi0KLXdvcmtzcGFjZUNhbm5vdExvY2tUaXRsZT1DYW5ub3Qgc3RhcnQgezB9Ci13b3Jrc3BhY2VDYW5ub3RMb2NrTWVzc2FnZT17MH0gY2Fubm90IGJlIHN0YXJ0ZWQgd2hpbGUgYW5vdGhlciBpbnN0YW5jZSBpcyBydW5uaW5nLiAgU3dpdGNoIHRvIHRoZSBydW5uaW5nIGluc3RhbmNlIG9yIGNsb3NlIGl0IGFuZCByZXN0YXJ0IHRoZSBhcHBsaWNhdGlvbiBhZ2Fpbi4KLW1haW5BY3Rpb25CYXJBZHZpc29yX0RpYWdub3Npcz1EaWFnbm9zaXMgYW5kIFJlcGFpciBUb29scwotbWFpbkFjdGlvbkJhckFkdmlzb3JfSGVhbHRoQ2hlY2s9UGVyZm9ybSBIZWFsdGggQ2hlY2sgb24gTGlicmFyeS4uLgotbWFpbkFjdGlvbkJhckFkdmlzb3JfUmVtb3ZlUmVmZXJlbmNlPVJlbW92ZSBSZWZlcmVuY2VzIHRvIEludmFsaWQgT2JqZWN0cy4uLgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL0FjdGlvbkNvbnN0YW50cy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL0FjdGlvbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2Y5MmQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9BY3Rpb25Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yY3AudWkuYWN0aW9uczsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBtZW51IGFuZCB0b29sYmFyIHBhdGhzIGZvciBhZGRpbmcgYWN0aW9ucy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25Db25zdGFudHMgewotCi0JLyoqCi0JICogRmlsZSA+IE5ldyBtZW51IGdyb3VwIG5hbWUgZm9yIGFkZGluZyBOZXcgYWN0aW9ucwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVyA9ICJuZXciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBGaWxlID4gT3BlbiBtZW51IGdyb3VwIG5hbWUgZm9yIGFkZGluZyBPcGVuIGFjdGlvbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOID0gIm9wZW4iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZWFyY2ggbWVudSBncm91cCBuYW1lcyBmb3IgYWRkaW5nIFNlYXJjaCBhY3Rpb25zCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VBUkNIID0gInNlYXJjaCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQVJDSF9TVEFSVCA9ICJzZWFyY2hTdGFydCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQVJDSF9FTkQgPSAic2VhcmNoRW5kIjsgLy8kTk9OLU5MUy0xJCAKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL0ludHJvZHVjdGlvbkFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL0ludHJvZHVjdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWVmNmVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9JbnRyb2R1Y3Rpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yY3AudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yY3AudWkuUkNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSW50cm9BY3Rpb247Ci0KLS8qKgotICogRGlzcGxheXMgdGhlIHdlbGNvbWUgc2NyZWVuIGZvciB0aGUgYXBwbGljYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnRyb2R1Y3Rpb25BY3Rpb24gZXh0ZW5kcyBJbnRyb0FjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSB3aW5kb3cKLQkgKiAgICAgICAgICAgIHRoZSB3b3JrYmVuY2ggd2luZG93Ci0JICovCi0JcHVibGljIEludHJvZHVjdGlvbkFjdGlvbihJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQlzdXBlcih3aW5kb3cpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoaXMgYWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYW4gaW1hZ2UgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBhY3Rpb24uCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWdEZXNjcmlwdG9yID0gUkNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9vYmoxNi9wcm9kdWN0LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBpbWdEZXNjcmlwdG9yOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL05ld0J1dHRvbkFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL05ld0J1dHRvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzZhMjM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9OZXdCdXR0b25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yY3AudWkuUkNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5SQ1BVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotCi0vKioKLSAqIERpc3BsYXlzIGEgZHJvcCBkb3duIGNvbWJvIGZvciBjcmVhdGluZyBuZXcgbWV0aG9kIGxpYnJhcnksIHBsdWctaW4gYW5kCi0gKiBjb25maWd1cmF0aW9uLiBUaGlzIGFjdGlvbiBpcyBpbnZva2VkIHZpYSB0aGUgTmV3IGJ1dHRvbiBvbiB0aGUgc3lzdGVtCi0gKiB0b29sYmFyLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTmV3QnV0dG9uQWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSU1lbnVDcmVhdG9yIHsKLQotCXByaXZhdGUgTWVudSBmaWxlTmV3RHJvcGRvd24gPSBudWxsOwotCi0JLyogU2hlbGwtU2hhcmluZwotCXByaXZhdGUgTmV3TGlicmFyeUFjdGlvbiBuZXdMaWJyYXJ5QWN0aW9uID0gbnVsbDsKLQotCXByaXZhdGUgTmV3UGx1Z2luQWN0aW9uIG5ld1BsdWdpbkFjdGlvbiA9IG51bGw7Ci0KLQlwcml2YXRlIE5ld0NvbmZpZ3VyYXRpb25BY3Rpb24gbmV3Q29uZmlndXJhdGlvbkFjdGlvbiA9IG51bGw7Ci0KLQlwcml2YXRlIE5ld1dpemFyZEFjdGlvbiBuZXdXaXphcmRBY3Rpb24gPSBudWxsOwotCSovCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdCdXR0b25BY3Rpb24oKSB7Ci0JCXNldElkKCJmaWxlTmV3RHJvcGRvd24iKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUb29sVGlwVGV4dChSQ1BVSVJlc291cmNlcy5uZXdEcm9wRG93bl90b29sdGlwX3RleHQpOwotCi0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBSQ1BVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJuZXdfY29uLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihpbWFnZURlc2NyaXB0b3IpOwotCi0JCXNldE1lbnVDcmVhdG9yKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvciNnZXRNZW51KENvbnRyb2wpCi0JICovCi0JcHVibGljIE1lbnUgZ2V0TWVudShDb250cm9sIHBhcmVudCkgewotCQlpZiAoZmlsZU5ld0Ryb3Bkb3duICE9IG51bGwpIHsKLQkJCXJldHVybiBmaWxlTmV3RHJvcGRvd247Ci0JCX0KLQotCQlmaWxlTmV3RHJvcGRvd24gPSBuZXcgTWVudShwYXJlbnQpOwotCQlNZW51SXRlbSBuZXdMaWJyYXJ5TUl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU5ld0Ryb3Bkb3duLCBTV1QuUFVTSCk7Ci0JCW5ld0xpYnJhcnlNSXRlbS5zZXRUZXh0KExpYnJhcnlVSVRleHQuVEVYVF9NRVRIT0RfTElCQVJBUlkpOwotCQluZXcgTWVudUl0ZW0oZmlsZU5ld0Ryb3Bkb3duLCBTV1QuU0VQQVJBVE9SKTsKLQkJTWVudUl0ZW0gbmV3UGx1Z2luTUl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU5ld0Ryb3Bkb3duLCBTV1QuUFVTSCk7Ci0JCW5ld1BsdWdpbk1JdGVtLnNldFRleHQoTGlicmFyeVVJVGV4dC5URVhUX01FVEhPRF9QTFVHSU4pOwotCQlNZW51SXRlbSBuZXdDb25maWdNSXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTmV3RHJvcGRvd24sIFNXVC5QVVNIKTsKLQkJbmV3Q29uZmlnTUl0ZW0uc2V0VGV4dChMaWJyYXJ5VUlUZXh0LlRFWFRfTUVUSE9EX0NPTkZJR1VSQVRPTik7Ci0JCW5ldyBNZW51SXRlbShmaWxlTmV3RHJvcGRvd24sIFNXVC5TRVBBUkFUT1IpOwotCQlNZW51SXRlbSBuZXdPdGhlck1JdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVOZXdEcm9wZG93biwgU1dULlBVU0gpOwotCQluZXdPdGhlck1JdGVtLnNldFRleHQoUkNQVUlSZXNvdXJjZXMub3RoZXJNZW51SXRlbV90ZXh0KTsKLQotCQkvKiBTaGVsbC1TaGFyaW5nCQkKLQkJbmV3TGlicmFyeUFjdGlvbiA9IG5ldyBOZXdMaWJyYXJ5QWN0aW9uKCk7Ci0JCW5ld1BsdWdpbkFjdGlvbiA9IG5ldyBOZXdQbHVnaW5BY3Rpb24oKTsKLQkJbmV3Q29uZmlndXJhdGlvbkFjdGlvbiA9IG5ldyBOZXdDb25maWd1cmF0aW9uQWN0aW9uKCk7Ci0JCWlmIChuZXdXaXphcmRBY3Rpb24gPT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFdpbmRvdyB3YldpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJbmV3V2l6YXJkQWN0aW9uID0gbmV3IE5ld1dpemFyZEFjdGlvbih3YldpbmRvdyk7Ci0JCX0KLQotCQluZXdMaWJyYXJ5TUl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCW5ld0xpYnJhcnlBY3Rpb24ucnVuKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJbmV3UGx1Z2luTUl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCW5ld1BsdWdpbkFjdGlvbi5ydW4oKTsKLQkJCX0KLQkJfSk7Ci0JCW5ld0NvbmZpZ01JdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQluZXdDb25maWd1cmF0aW9uQWN0aW9uLnJ1bigpOwotCQkJfQotCQl9KTsKLQkJCi0JCW5ld090aGVyTUl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCW5ld1dpemFyZEFjdGlvbi5ydW4oKTsKLQkJCX0KLQkJfSk7Ci0JCSovCi0KLQkJcmV0dXJuIGZpbGVOZXdEcm9wZG93bjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3IjZ2V0TWVudShNZW51KQotCSAqLwotCXB1YmxpYyBNZW51IGdldE1lbnUoTWVudSBwYXJlbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQkvKgotCQlpZiAobmV3V2l6YXJkQWN0aW9uID09IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgd2JXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCW5ld1dpemFyZEFjdGlvbiA9IG5ldyBOZXdXaXphcmRBY3Rpb24od2JXaW5kb3cpOwotCQl9Ci0JCW5ld1dpemFyZEFjdGlvbi5ydW4oKTsKLQkJKi8KLQl9Ci0KLQkvKioKLQkgKiBkaXNwb3NlIHRoZSBmaWxlTmV3RHJvcGRvd24gb2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGZpbGVOZXdEcm9wZG93biAhPSBudWxsKSB7Ci0JCQlmaWxlTmV3RHJvcGRvd24uZGlzcG9zZSgpOwotCQkJZmlsZU5ld0Ryb3Bkb3duID0gbnVsbDsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9OZXdXaXphcmRNZW51LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvTmV3V2l6YXJkTWVudS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjBkNDQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9OZXdXaXphcmRNZW51LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkJhc2VOZXdXaXphcmRNZW51OwotCi0vKioKLSAqIFBvcHVsYXRlcyB0aGUgRmlsZSA+IE5ldyBtZW51IHdpdGggbmV3IHdpemFyZHMgY2F0ZWdvcml6ZWQgdW5kZXIKLSAqICJvcmcuZWNsaXBzZS5lcGYudWkubmV3V2l6YXJkcy5jYXRlZ29yeSIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgTmV3V2l6YXJkTWVudSBleHRlbmRzIEJhc2VOZXdXaXphcmRNZW51IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgd2l6YXJkIHNob3J0Y3V0IG1lbnUgZm9yIHRoZSBJREUuCi0JICogCi0JICogQHBhcmFtIHdpbmRvdwotCSAqICAgICAgICAgICAgdGhlIHdpbmRvdyBjb250YWluaW5nIHRoZSBtZW51Ci0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICB0aGUgY29udHJpYnV0aW9uIGl0ZW0gaWRlbnRpZmllciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTmV3V2l6YXJkTWVudShJV29ya2JlbmNoV2luZG93IHdpbmRvdywgU3RyaW5nIGlkKSB7Ci0JCXN1cGVyKHdpbmRvdywgaWQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5CYXNlTmV3V2l6YXJkTWVudSNhZGRJdGVtcyhvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbk1hbmFnZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMoTGlzdCBsaXN0KSB7Ci0JCWlmIChhZGRTaG9ydGN1dHMobGlzdCkpIHsKLQkJCS8vIEFkZCBhIHNlcGFyYXRvciBhZnRlciB0aGUgTWV0aG9kIENPbmZpZ3VyYXRpb24gbWVudSBpdGVtLgotCQkJaWYgKGxpc3Quc2l6ZSgpID4gMykgewotCQkJCWxpc3QuYWRkKDMsIG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQl9Ci0JCQlsaXN0LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQl9Ci0JCWxpc3QuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGdldFNob3dEaWFsb2dBY3Rpb24oKSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL1VJQWN0aW9uRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL1VJQWN0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzYxZTc0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9VSUFjdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGx2MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5SQ1BVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuUmV0YXJnZXRBY3Rpb247Ci0KLS8qKgotICogQ3JlYXRlcyBhY3Rpb25zIHRoYXQgYXJlIHNwZWNpZmljIHRvIHRoZSBFUEYgQ29tcG9zZXIgd29ya2JlbmNoLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVUlBY3Rpb25GYWN0b3J5IGV4dGVuZHMgQWN0aW9uRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXByb3RlY3RlZCBVSUFjdGlvbkZhY3RvcnkoU3RyaW5nIGFjdGlvbklkKSB7Ci0JCXN1cGVyKGFjdGlvbklkKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBjdXN0b21pemVkIFNIT1dfSU5UUk8gYWN0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBY3Rpb25GYWN0b3J5IFNIT1dfSU5UUk8gPSBuZXcgQWN0aW9uRmFjdG9yeSgiaW50cm8iKSB7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIElXb3JrYmVuY2hBY3Rpb24gY3JlYXRlKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCQlpZiAod2luZG93ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlJV29ya2JlbmNoQWN0aW9uIGFjdGlvbiA9IG5ldyBJbnRyb2R1Y3Rpb25BY3Rpb24od2luZG93KTsKLQkJCWFjdGlvbi5zZXRJZChnZXRJZCgpKTsKLQkJCXJldHVybiBhY3Rpb247Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlIGEgY3VzdG9taXplZCBPUEVOX0VMRU1FTlQgYWN0aW9uIHRoYXQgaXMgZXF1YXZpbGVudCB0byB0aGUgRURJVCBtZW51Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBY3Rpb25GYWN0b3J5IE9QRU5fRUxFTUVOVCA9IG5ldyBBY3Rpb25GYWN0b3J5KCJlZGl0IikgeyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBJV29ya2JlbmNoQWN0aW9uIGNyZWF0ZShJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkJaWYgKHdpbmRvdyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJUmV0YXJnZXRBY3Rpb24gYWN0aW9uID0gbmV3IFJldGFyZ2V0QWN0aW9uKCJPcGVuRWxlbWVudCIsICAvLyROT04tTkxTLTEkCi0JCQkJCVJDUFVJUmVzb3VyY2VzLmVkaXRNZW51SXRlbV90ZXh0KTsKLQkJCXdpbmRvdy5nZXRQYXJ0U2VydmljZSgpLmFkZFBhcnRMaXN0ZW5lcihhY3Rpb24pOwotCQkJYWN0aW9uCi0JCQkJCS5zZXRBY3Rpb25EZWZpbml0aW9uSWQoIm9yZy5lY2xpcHNlLmVwZi5yY3AudWkuYWN0aW9ucy5vcGVuRWxlbWVudCIpOyAgLy8kTk9OLU5MUy0xJAotCQkJSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSB3aW5kb3cuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldFNoYXJlZEltYWdlcygpOwotCQkJYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0NPUFkpKTsKLQkJCWFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0NPUFlfRElTQUJMRUQpKTsKLQotCQkJcmV0dXJuIGFjdGlvbjsKLQkJfQotCX07Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgY3VzdG9taXplZCBJTVBPUlQgYWN0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBY3Rpb25GYWN0b3J5IFVJX0lNUE9SVCA9IG5ldyBBY3Rpb25GYWN0b3J5KCJpbXBvcnQiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlwdWJsaWMgSVdvcmtiZW5jaEFjdGlvbiBjcmVhdGUoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJCQkJaWYgKHdpbmRvdyA9PSBudWxsKSB7Ci0JCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJCX0KLQkJCQkJSVdvcmtiZW5jaEFjdGlvbiBhY3Rpb24gPSBuZXcgVUlJbXBvcnRSZXNvdXJjZXNBY3Rpb24od2luZG93KTsKLQkJCQkJYWN0aW9uLnNldElkKGdldElkKCkpOwotCQkJCQlyZXR1cm4gYWN0aW9uOwotCQkJCX0KLQl9OwotCQkKLQkvKioKLQkgKiBXb3JrYmVuY2ggYWN0aW9uIChpZCAiZXhwb3J0Iik6IE9wZW5zIHRoZSBleHBvcnQgd2l6YXJkLiBUaGlzIGFjdGlvbgotCSAqIG1haW50YWlucyBpdHMgZW5hYmxlbWVudCBzdGF0ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFjdGlvbkZhY3RvcnkgVUlfRVhQT1JUID0gbmV3IEFjdGlvbkZhY3RvcnkoImV4cG9ydCIpIHsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgSVdvcmtiZW5jaEFjdGlvbiBjcmVhdGUoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJCWlmICh3aW5kb3cgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCUlXb3JrYmVuY2hBY3Rpb24gYWN0aW9uID0gbmV3IFVJRXhwb3J0UmVzb3VyY2VzQWN0aW9uKHdpbmRvdyk7Ci0JCQlhY3Rpb24uc2V0SWQoZ2V0SWQoKSk7Ci0JCQlyZXR1cm4gYWN0aW9uOwotCQl9Ci0JfTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL1VJRXhwb3J0UmVzb3VyY2VzQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvVUlFeHBvcnRSZXNvdXJjZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzZGZhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvVUlFeHBvcnRSZXNvdXJjZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGx2MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJjcC51aS53aXphcmRzLlVJRXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5FeHBvcnRSZXNvdXJjZXNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi0KLXB1YmxpYyBjbGFzcyBVSUV4cG9ydFJlc291cmNlc0FjdGlvbiBleHRlbmRzIEV4cG9ydFJlc291cmNlc0FjdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1dJWkFSRF9XSURUSCA9IDQ3MDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfV0laQVJEX0hFSUdIVCA9IDU1MDsKLQotCS8qKgotCSAqIFRoZSB3b3JrYmVuY2ggd2luZG93OyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBoYXMgYmVlbgotCSAqIDxjb2RlPmRpc3Bvc2U8L2NvZGU+ZC4KLQkgKi8KLQlwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93OwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gd29ya2JlbmNoCi0JICovCi0JcHVibGljIFVJRXhwb3J0UmVzb3VyY2VzQWN0aW9uKElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCXRoaXMod29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSB3b3JrYmVuY2gKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKi8KLQlwdWJsaWMgVUlFeHBvcnRSZXNvdXJjZXNBY3Rpb24oSVdvcmtiZW5jaCB3b3JrYmVuY2gsIFN0cmluZyBsYWJlbCkgewotCQl0aGlzKHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSwgbGFiZWwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHdpbmRvdwotCSAqLwotCXB1YmxpYyBVSUV4cG9ydFJlc291cmNlc0FjdGlvbihJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl0aGlzKHdpbmRvdywgV29ya2JlbmNoTWVzc2FnZXMuRXhwb3J0UmVzb3VyY2VzQWN0aW9uX3RleHQpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHdpbmRvdwotCSAqIEBwYXJhbSBsYWJlbAotCSAqLwotCXB1YmxpYyBVSUV4cG9ydFJlc291cmNlc0FjdGlvbihJV29ya2JlbmNoV2luZG93IHdpbmRvdywgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKHdpbmRvdywgbGFiZWwpOwotCQl0aGlzLndvcmtiZW5jaFdpbmRvdyA9IHdpbmRvdzsKLQl9Ci0KLQlwdWJsaWMgVUlFeHBvcnRXaXphcmQgZ2V0VUlFeHBvcnRXaXphcmQoKSB7Ci0JCXJldHVybiBuZXcgVUlFeHBvcnRXaXphcmQoKTsKLQl9Ci0JCi0JLyoqCi0JICogSW52b2tlIHRoZSBFeHBvcnQgd2l6YXJkcyBzZWxlY3Rpb24gV2l6YXJkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKHdvcmtiZW5jaFdpbmRvdyA9PSBudWxsKSB7Ci0JCQkvLyBhY3Rpb24gaGFzIGJlZW4gZGlzcG9zZWQKLQkJCXJldHVybjsKLQkJfQotCQlVSUV4cG9ydFdpemFyZCB3aXphcmQgPSBnZXRVSUV4cG9ydFdpemFyZCgpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb25Ub1Bhc3M7Ci0JCS8vIGdldCB0aGUgY3VycmVudCB3b3JrYmVuY2ggc2VsZWN0aW9uCi0JCUlTZWxlY3Rpb24gd29ya2JlbmNoU2VsZWN0aW9uID0gd29ya2JlbmNoV2luZG93LmdldFNlbGVjdGlvblNlcnZpY2UoKQotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHdvcmtiZW5jaFNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlzZWxlY3Rpb25Ub1Bhc3MgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHdvcmtiZW5jaFNlbGVjdGlvbjsKLQkJfSBlbHNlIHsKLQkJCXNlbGVjdGlvblRvUGFzcyA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0JCX0KLQotCQl3aXphcmQuaW5pdCh3b3JrYmVuY2hXaW5kb3cuZ2V0V29ya2JlbmNoKCksIHNlbGVjdGlvblRvUGFzcyk7Ci0JCUlEaWFsb2dTZXR0aW5ncyB3b3JrYmVuY2hTZXR0aW5ncyA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJSURpYWxvZ1NldHRpbmdzIHdpemFyZFNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MKLQkJCQkuZ2V0U2VjdGlvbigiRXhwb3J0UmVzb3VyY2VzQWN0aW9uIik7ICAvLyROT04tTkxTLTEkCi0JCWlmICh3aXphcmRTZXR0aW5ncyA9PSBudWxsKQotCQkJd2l6YXJkU2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncwotCQkJCQkuYWRkTmV3U2VjdGlvbigiRXhwb3J0UmVzb3VyY2VzQWN0aW9uIik7ICAvLyROT04tTkxTLTEkCi0JCXdpemFyZC5zZXREaWFsb2dTZXR0aW5ncyh3aXphcmRTZXR0aW5ncyk7Ci0JCXdpemFyZC5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0KLQkJU2hlbGwgcGFyZW50ID0gd29ya2JlbmNoV2luZG93LmdldFNoZWxsKCk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHBhcmVudCwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKAotCQkJCU1hdGgubWF4KFNJWklOR19XSVpBUkRfV0lEVEgsIGRpYWxvZy5nZXRTaGVsbCgpLmdldFNpemUoKS54KSwKLQkJCQlTSVpJTkdfV0laQVJEX0hFSUdIVCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0JCQkJSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzLkVYUE9SVF9XSVpBUkQpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9VSUltcG9ydFJlc291cmNlc0FjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL1VJSW1wb3J0UmVzb3VyY2VzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Y2M2NWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL1VJSW1wb3J0UmVzb3VyY2VzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yY3AudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yY3AudWkud2l6YXJkcy5VSUV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLndpemFyZHMuVUlJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5JbXBvcnRSZXNvdXJjZXNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBjbGFzcy4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLQotcHVibGljIGNsYXNzIFVJSW1wb3J0UmVzb3VyY2VzQWN0aW9uIGV4dGVuZHMgSW1wb3J0UmVzb3VyY2VzQWN0aW9uIHsKLQotCXByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3c7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1dJWkFSRF9XSURUSCA9IDQ3MDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfV0laQVJEX0hFSUdIVCA9IDU1MDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHdvcmtiZW5jaAotCSAqLwotCXB1YmxpYyBVSUltcG9ydFJlc291cmNlc0FjdGlvbihJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQl0aGlzKHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gd2luZG93Ci0JICovCi0JcHVibGljIFVJSW1wb3J0UmVzb3VyY2VzQWN0aW9uKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCXN1cGVyKHdpbmRvdyk7Ci0JCXRoaXMud29ya2JlbmNoV2luZG93ID0gd2luZG93OwotCX0KLQotCXB1YmxpYyBVSUltcG9ydFdpemFyZCBnZXRVSUltcG9ydFdpemFyZCgpIHsKLQkJcmV0dXJuIG5ldyBVSUltcG9ydFdpemFyZCgpOwotCX0KLQkKLQkvKioKLQkgKiBJbnZva2UgdGhlIEltcG9ydCB3aXphcmRzIHNlbGVjdGlvbiBXaXphcmQuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAod29ya2JlbmNoV2luZG93ID09IG51bGwpIHsKLQkJCS8vIGFjdGlvbiBoYXMgYmVlbiBkaXNwb3NlZAotCQkJcmV0dXJuOwotCQl9Ci0JCVVJSW1wb3J0V2l6YXJkIHdpemFyZCA9IGdldFVJSW1wb3J0V2l6YXJkKCk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvblRvUGFzczsKLQkJLy8gZ2V0IHRoZSBjdXJyZW50IHdvcmtiZW5jaCBzZWxlY3Rpb24KLQkJSVNlbGVjdGlvbiB3b3JrYmVuY2hTZWxlY3Rpb24gPSB3b3JrYmVuY2hXaW5kb3cuZ2V0U2VsZWN0aW9uU2VydmljZSgpCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAod29ya2JlbmNoU2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCXNlbGVjdGlvblRvUGFzcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgd29ya2JlbmNoU2VsZWN0aW9uOwotCQl9IGVsc2UgewotCQkJc2VsZWN0aW9uVG9QYXNzID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQkJfQotCi0JCXdpemFyZC5pbml0KHdvcmtiZW5jaFdpbmRvdy5nZXRXb3JrYmVuY2goKSwgc2VsZWN0aW9uVG9QYXNzKTsKLQkJSURpYWxvZ1NldHRpbmdzIHdvcmtiZW5jaFNldHRpbmdzID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlJRGlhbG9nU2V0dGluZ3Mgd2l6YXJkU2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncwotCQkJCS5nZXRTZWN0aW9uKCJJbXBvcnRSZXNvdXJjZXNBY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAod2l6YXJkU2V0dGluZ3MgPT0gbnVsbCkKLQkJCXdpemFyZFNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MKLQkJCQkJLmFkZE5ld1NlY3Rpb24oIkltcG9ydFJlc291cmNlc0FjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCXdpemFyZC5zZXREaWFsb2dTZXR0aW5ncyh3aXphcmRTZXR0aW5ncyk7Ci0JCXdpemFyZC5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0KLQkJU2hlbGwgcGFyZW50ID0gd29ya2JlbmNoV2luZG93LmdldFNoZWxsKCk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHBhcmVudCwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKAotCQkJCU1hdGgubWF4KFNJWklOR19XSVpBUkRfV0lEVEgsIGRpYWxvZy5nZXRTaGVsbCgpLmdldFNpemUoKS54KSwKLQkJCQlTSVpJTkdfV0laQVJEX0hFSUdIVCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0JCQkJSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzLklNUE9SVF9XSVpBUkQpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvVUlPcGVuUGVyc3BlY3RpdmVEaWFsb2dBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9VSU9wZW5QZXJzcGVjdGl2ZURpYWxvZ0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjE3ZDM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9VSU9wZW5QZXJzcGVjdGl2ZURpYWxvZ0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yY3AudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5QZXJzcGVjdGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5PcGVuUGVyc3BlY3RpdmVEaWFsb2dBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5TZWxlY3RQZXJzcGVjdGl2ZURpYWxvZzsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBjbGFzcy4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLQotcHVibGljIGNsYXNzIFVJT3BlblBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uIGV4dGVuZHMgT3BlblBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uIHsKLQlwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93OwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gd2luZG93Ci0JICovCi0JcHVibGljIFVJT3BlblBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCXN1cGVyKHdpbmRvdyk7Ci0JCXRoaXMud29ya2JlbmNoV2luZG93ID0gd2luZG93OwotCX0KLQotCSAvKioKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0gICAgICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAod29ya2JlbmNoV2luZG93ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTZWxlY3RQZXJzcGVjdGl2ZURpYWxvZyBkbGcgPSBuZXcgU2VsZWN0UGVyc3BlY3RpdmVEaWFsb2coCi0JCQkJd29ya2JlbmNoV2luZG93LmdldFNoZWxsKCksIHdvcmtiZW5jaFdpbmRvdy5nZXRXb3JrYmVuY2goKQotCQkJCQkJLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKSk7Ci0JCWRsZy5vcGVuKCk7Ci0JCWlmIChkbGcuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5DQU5DRUwpCi0JCQlyZXR1cm47Ci0JCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgZGVzYyA9IGRsZy5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJUGVyc3BlY3RpdmVVdGlsLm9wZW5QZXJzcGVjdGl2ZShkZXNjLmdldElkKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJd29ya2JlbmNoV2luZG93ID0gbnVsbDsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDhlNzYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBhY3Rpb25zIGZvciB0aGUgc3RhbmRhbG9uZSBSQ1AtYmFzZWQgRVBGIENvbXBvc2VyLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZGNlZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBzdGFuZGFsb25lIFJDUC1iYXNlZCBFUEYgQ29tcG9zZXIuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS93aXphcmRzL1VJRXhwb3J0V2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3dpemFyZHMvVUlFeHBvcnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ4NzVlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3dpemFyZHMvVUlFeHBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yY3AudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuV2l6YXJkQ2F0ZWdvcmllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5FeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5XaXphcmRDb2xsZWN0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLldvcmtiZW5jaFdpemFyZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuQWRhcHRhYmxlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLklXaXphcmRDYXRlZ29yeTsKLQotLyoqCi0gKiBVSUV4cG9ydCBjbGFzcyB3aWxsIGZpbHRlciBvdXQgdGhlIHdpemFyZCBjYXRlZ29yaWVzIHdoaWNoIGFyZSBub3QgcmVsYXRlZCAKLSAqIHRvIEVQRi4gVUlFeHBvcnQgYWxsb3dzIG9ubHkgVW5DYXRlZ29yaXplZCA8bGluaz5XaXphcmRzUmVnaXN0cnlSZWFkZXIuVU5DQVRFR09SSVpFRF9XSVpBUkRfQ0FURUdPUlk8L2xpbms+Ci0gKiBjYXRlZ29yeSAgKDxsaW5rPm9yZy5lY2xpcHNlLnVpLk90aGVyczwvbGluaz4pCi0gKiBhbmQgZmlsdGVycyBhcyB3ZWxsIGluIE90aGVycyBjYXRlZ29yeSB3aXphcmRzIGxpc3QuICAKLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVUlFeHBvcnRXaXphcmQgZXh0ZW5kcyBFeHBvcnRXaXphcmQgewotCi0JcHJvdGVjdGVkIEFkYXB0YWJsZUxpc3QgZ2V0QXZhaWxhYmxlRXhwb3J0V2l6YXJkcygpIHsKLQkJLy8gVE9ETzogZXhwb3J0cyBhcmUgc3RpbGwgZmxhdCAtIHdlIG5lZWQgdG8gZ2V0IGF0IHRoZSBmbGF0IGxpc3QuIEFsbAotCQkvLyB3aXphcmRzIHdpbGwgYmUgaW4gdGhlICJvdGhlciIgY2F0ZWdvcnkuCi0JCUlXaXphcmRDYXRlZ29yeSByb290ID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRFeHBvcnRXaXphcmRSZWdpc3RyeSgpLmdldFJvb3RDYXRlZ29yeSgpOwotCQlXaXphcmRDb2xsZWN0aW9uRWxlbWVudCBjYXRlZ29yeSA9IChXaXphcmRDb2xsZWN0aW9uRWxlbWVudCkgcm9vdAotCQkJCS5maW5kQ2F0ZWdvcnkobmV3IFBhdGgoV2l6YXJkQ2F0ZWdvcmllcy5FWFBPUlRfV0laQVJEU19DQVRFR09SWSkpOwotCQkKLQkJQWRhcHRhYmxlTGlzdCByZXN1bHQ7Ci0JCWlmIChjYXRlZ29yeSA9PSBudWxsKQotCQkJcmVzdWx0ID0gbmV3IEFkYXB0YWJsZUxpc3QoKTsKLQkJZWxzZQotCQkJcmVzdWx0ID0gY2F0ZWdvcnkuZ2V0V2l6YXJkQWRhcHRhYmxlTGlzdCgpOwotCi0JCUFkYXB0YWJsZUxpc3QgZmlsdGVyZWRSZXN1bHQgPSBkb0ZpbHRlcihyZXN1bHQpOwotCQlpZihmaWx0ZXJlZFJlc3VsdC5zaXplKCkgPiAwKXsKLQkJCXJldHVybiBmaWx0ZXJlZFJlc3VsdDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBmaWx0ZXIgb3V0IG5vbi1hbGxvd2FibGUgZXhwb3J0IHdpemFyZCBjYXRlZ29yaWVzCi0JICogQHBhcmFtIGxpc3QKLQkgKiBAcmV0dXJuIEFkYXB0YWJsZUxpc3QKLQkgKi8KLQlwdWJsaWMgQWRhcHRhYmxlTGlzdCBkb0ZpbHRlcihBZGFwdGFibGVMaXN0IGxpc3QpewotCQlMaXN0IGV4dGVuc2lvbnMgPSBVSUV4cG9ydFdpemFyZEV4dGVuc2lvblBvaW50LmdldEluc3RhbmNlKCkuZ2V0UGFnZVByb3ZpZGVycygpOwotCQlBZGFwdGFibGVMaXN0IGZpbHRlcmVkUmVzdWx0ID0gbmV3IEFkYXB0YWJsZUxpc3QoKTsKLQkJT2JqZWN0W10gb2JqcyA9IGxpc3QuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7Ci0JCQlXb3JrYmVuY2hXaXphcmRFbGVtZW50IG9iaiA9IChXb3JrYmVuY2hXaXphcmRFbGVtZW50KSBvYmpzW2ldOwotCQkJU3RyaW5nIGlkID0gb2JqLmdldElkKCk7Ci0JCQlpZighZXh0ZW5zaW9ucy5pc0VtcHR5KCkgJiYgZXh0ZW5zaW9ucy5jb250YWlucyhpZCkpewotCQkJCWZpbHRlcmVkUmVzdWx0LmFkZChvYmopOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWx0ZXJlZFJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3dpemFyZHMvVUlFeHBvcnRXaXphcmRFeHRlbnNpb25Qb2ludC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS93aXphcmRzL1VJRXhwb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY5OTdkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3dpemFyZHMvVUlFeHBvcnRXaXphcmRFeHRlbnNpb25Qb2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yY3AudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5SQ1BVSVBsdWdpbjsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSAnb3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMiIGV4dGVuc2lvbiBwb2ludC4KLSAqIDxwPgotICogVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGEgY29udHJpYnV0aW5nIHBsdWctaW4gdG8gYWRkIGl0cyBleHBvcnQgd2l6YXJkcwotICogdG8gdGhlIHN0YW5kYWxvbmUgUkNQLWJhc2VkIEVQRiBDb21wb3NlciBFeHBvcnQgd2l6YXJkIHBhZ2UuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVSUV4cG9ydFdpemFyZEV4dGVuc2lvblBvaW50IHsKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FU1BBQ0UgPSAib3JnLmVjbGlwc2UuZXBmLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FID0gImV4cG9ydFdpemFyZHMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIEF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX1BST1ZJREVSX0VYVEVOU0lPTl9BVFRSX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBBcnJheUxpc3QgZXh0ZW5zaW9uc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFVJRXhwb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQgaW5zdGFuY2UgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBVSUV4cG9ydFdpemFyZEV4dGVuc2lvblBvaW50IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChVSUltcG9ydFdpemFyZEV4dGVuc2lvblBvaW50LmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgVUlFeHBvcnRXaXphcmRFeHRlbnNpb25Qb2ludCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFVJRXhwb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIHBhZ2UgcHJvdmlkZXJzCi0JICogCi0JICogQHJldHVybiBhbGwgdGhlIHBhZ2UgcHJvdmlkZXJzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFBhZ2VQcm92aWRlcnMoKSB7Ci0JCXJldHVybiBleHRlbnNpb25zTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgY29uZmlndXJhdGlvbiBwcm92aWRlcnMgc3BlY2lmaWVkIHZpYSB0aGUKLQkgKiAib3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMiIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkRXh0ZW5zaW9uKCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQlQQUdFX1BST1ZJREVSU19FWFRFTlNJT05fTkFNRVNQQUNFLAotCQkJCVBBR0VfUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIGlkID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKFBBR0VfUFJPVklERVJfRVhURU5TSU9OX0FUVFJfSUQpOwotCQkJCQkJZXh0ZW5zaW9uc0xpc3QuYWRkKGlkKTsKLQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJUkNQVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCSJGYWlsZWQgdG8gZXhwb3J0IGltcG9ydCBjb250cmlidXRpb24gZXh0ZW5zaW9uIHBvaW50cyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvd2l6YXJkcy9VSUltcG9ydFdpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS93aXphcmRzL1VJSW1wb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1M2EwZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS93aXphcmRzL1VJSW1wb3J0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLldpemFyZENhdGVnb3JpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuSW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuV2l6YXJkQ29sbGVjdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5Xb3JrYmVuY2hXaXphcmRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLkFkYXB0YWJsZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5JV2l6YXJkQ2F0ZWdvcnk7Ci0KLS8qKgotICogVUlJbXBvcnQgY2xhc3Mgd2lsbCBmaWx0ZXIgb3V0IHRoZSB3aXphcmQgY2F0ZWdvcmllcyB3aGljaCBhcmUgbm90IHJlbGF0ZWQgdG8KLSAqIEVQRi4gVUlJbXBvcnQgYWxsb3dzIG9ubHkgVW5DYXRlZ29yaXplZAotICogPGxpbms+V2l6YXJkc1JlZ2lzdHJ5UmVhZGVyLlVOQ0FURUdPUklaRURfV0laQVJEX0NBVEVHT1JZPC9saW5rPiBjYXRlZ29yeSAoPGxpbms+b3JnLmVjbGlwc2UudWkuT3RoZXJzPC9saW5rPikKLSAqIGFuZCBmaWx0ZXJzIGFzIHdlbGwgaW4gT3RoZXJzIGNhdGVnb3J5IHdpemFyZHMgbGlzdC4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLQotcHVibGljIGNsYXNzIFVJSW1wb3J0V2l6YXJkIGV4dGVuZHMgSW1wb3J0V2l6YXJkIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltcG9ydCB3aXphcmRzIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgaW52b2NhdGlvbi4gQWxzbyBmaWx0ZXIKLQkgKiBpbXBvcnQgd2l6YXJkIGxpc3Qgb2YgdW5jYXRlZ29yaXplZCAob3JnLmVjbGlwc2UudWkuT3RoZXJzKQotCSAqLwotCXByb3RlY3RlZCBBZGFwdGFibGVMaXN0IGdldEF2YWlsYWJsZUltcG9ydFdpemFyZHMoKSB7Ci0JCS8vIFRPRE86IGltcG9ydHMgYXJlIHN0aWxsIGZsYXQgLSB3ZSBuZWVkIHRvIGdldCBhdCB0aGUgZmxhdCBsaXN0LiBBbGwKLQkJLy8gd2l6YXJkcyB3aWxsIGJlIGluIHRoZSAib3RoZXIiIGNhdGVnb3J5LgotCQlJV2l6YXJkQ2F0ZWdvcnkgcm9vdCA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0SW1wb3J0V2l6YXJkUmVnaXN0cnkoKS5nZXRSb290Q2F0ZWdvcnkoKTsKLQkJV2l6YXJkQ29sbGVjdGlvbkVsZW1lbnQgY2F0ZWdvcnkgPSAoV2l6YXJkQ29sbGVjdGlvbkVsZW1lbnQpIHJvb3QKLQkJCQkuZmluZENhdGVnb3J5KG5ldyBQYXRoKFdpemFyZENhdGVnb3JpZXMuSU1QT1JUX1dJWkFSRFNfQ0FURUdPUlkpKTsKLQkJQWRhcHRhYmxlTGlzdCByZXN1bHQ7Ci0JCWlmIChjYXRlZ29yeSA9PSBudWxsKQotCQkJcmVzdWx0ID0gbmV3IEFkYXB0YWJsZUxpc3QoKTsKLQkJZWxzZQotCQkJcmVzdWx0ID0gY2F0ZWdvcnkuZ2V0V2l6YXJkQWRhcHRhYmxlTGlzdCgpOwotCi0JCUFkYXB0YWJsZUxpc3QgZmlsdGVyZWRSZXN1bHQgPSBkb0ZpbHRlcihyZXN1bHQpOwotCQlpZiAoZmlsdGVyZWRSZXN1bHQuc2l6ZSgpID4gMCkgewotCQkJcmV0dXJuIGZpbHRlcmVkUmVzdWx0OwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogRmlsdGVyIG91dCBub24tYWxsb3dhYmxlIGltcG9ydCB3aXphcmQgY2F0ZWdvcmllcwotCSAqIAotCSAqIEBwYXJhbSBsaXN0Ci0JICogQHJldHVybiBBZGFwdGFibGVMaXN0Ci0JICovCi0JcHVibGljIEFkYXB0YWJsZUxpc3QgZG9GaWx0ZXIoQWRhcHRhYmxlTGlzdCBsaXN0KSB7Ci0JCUxpc3QgZXh0ZW5zaW9ucyA9IFVJSW1wb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRQYWdlUHJvdmlkZXJzKCk7Ci0JCUFkYXB0YWJsZUxpc3QgZmlsdGVyZWRSZXN1bHQgPSBuZXcgQWRhcHRhYmxlTGlzdCgpOwotCQlPYmplY3RbXSBvYmpzID0gbGlzdC5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspIHsKLQkJCVdvcmtiZW5jaFdpemFyZEVsZW1lbnQgb2JqID0gKFdvcmtiZW5jaFdpemFyZEVsZW1lbnQpIG9ianNbaV07Ci0JCQlTdHJpbmcgaWQgPSBvYmouZ2V0SWQoKTsKLQkJCWlmICghZXh0ZW5zaW9ucy5pc0VtcHR5KCkgJiYgZXh0ZW5zaW9ucy5jb250YWlucyhpZCkpIHsKLQkJCQlmaWx0ZXJlZFJlc3VsdC5hZGQob2JqKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsdGVyZWRSZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS93aXphcmRzL1VJSW1wb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvd2l6YXJkcy9VSUltcG9ydFdpemFyZEV4dGVuc2lvblBvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNTVmNTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS93aXphcmRzL1VJSW1wb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yY3AudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5SQ1BVSVBsdWdpbjsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSAnb3JnLmVjbGlwc2UuZXBmLnVpLmltcG9ydFdpemFyZHMiIGV4dGVuc2lvbiBwb2ludC4KLSAqIDxwPgotICogVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGEgY29udHJpYnV0aW5nIHBsdWctaW4gdG8gYWRkIGl0cyBpbXBvcnQgd2l6YXJkcwotICogdG8gdGhlIHN0YW5kYWxvbmUgUkNQLWJhc2VkIEVQRiBDb21wb3NlciBJbXBvcnQgd2l6YXJkIHBhZ2UuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVSUltcG9ydFdpemFyZEV4dGVuc2lvblBvaW50IHsKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FU1BBQ0UgPSAib3JnLmVjbGlwc2UuZXBmLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FID0gImltcG9ydFdpemFyZHMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIEF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX1BST1ZJREVSX0VYVEVOU0lPTl9BVFRSX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBBcnJheUxpc3QgZXh0ZW5zaW9uc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFVJSW1wb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQgaW5zdGFuY2UgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBVSUltcG9ydFdpemFyZEV4dGVuc2lvblBvaW50IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChVSUltcG9ydFdpemFyZEV4dGVuc2lvblBvaW50LmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgVUlJbXBvcnRXaXphcmRFeHRlbnNpb25Qb2ludCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFVJSW1wb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIHBhZ2UgcHJvdmlkZXJzCi0JICogCi0JICogQHJldHVybiBhbGwgdGhlIHBhZ2UgcHJvdmlkZXJzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFBhZ2VQcm92aWRlcnMoKSB7Ci0JCXJldHVybiBleHRlbnNpb25zTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgY29uZmlndXJhdGlvbiBwcm92aWRlcnMgc3BlY2lmaWVkIHZpYSB0aGUKLQkgKiAiY29tLmlibS5wcm9jZXNzLnBhZ2VQcm92aWRlcnMiIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkRXh0ZW5zaW9uKCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQlQQUdFX1BST1ZJREVSU19FWFRFTlNJT05fTkFNRVNQQUNFLAotCQkJCVBBR0VfUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIGlkID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKFBBR0VfUFJPVklERVJfRVhURU5TSU9OX0FUVFJfSUQpOwotCQkJCQkJZXh0ZW5zaW9uc0xpc3QuYWRkKGlkKTsKLQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJUkNQVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCSJGYWlsZWQgdG8gZXhwb3J0IGltcG9ydCBjb250cmlidXRpb24gZXh0ZW5zaW9uIHBvaW50cyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvd2l6YXJkcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3dpemFyZHMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGQwZTdmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvd2l6YXJkcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBleHBvcnQgYW5kIGltcG9ydCB3aXphcmRzIFVJIG1hbmFnZW1lbnQgaW4gdGhlIHN0YW5kYWxvbmUgUkNQLWJhc2VkIEVQRiBDb21wb3Nlci4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZjBmNDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NTE4M2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5yY3A8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MyNDNmMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlZmVhdHVyZVBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5yY3A7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2Fib3V0Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOTkwODYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2Fib3V0LmluaSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDRmNGZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWZlYXR1cmVUZXh0Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1hcHBsaWNhdGlvbl8zMi5naWYKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi1hcHBOYW1lPSVmZWF0dXJlTmFtZQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLXdlbGNvbWVQYWdlPSRubCQvd2VsY29tZS54bWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQubWFwcGluZ3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjgwYjNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLSMgVXN1YWxseSBnZW5lcmF0ZWQgYXQgYnVpbGQgdGltZS4KLQotMD1AYnVpbGQtSURACi0xPTEuMi4wLjIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1NDMxMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIFJDUAotCi1mZWF0dXJlVGV4dD1FUEYgUkNQXG5cCi1cblwKLVZlcnNpb246IHsxfSBcblwKLUJ1aWxkIExhYmVsOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG5cCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hcHBsaWNhdGlvbl8zMi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2FwcGxpY2F0aW9uXzMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2FwcGxpY2F0aW9uXzMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUwNTI5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBubC8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhcHBsaWNhdGlvbl8zMi5naWYsXAotICAgICAgICAgICAgICAgd2VsY29tZS54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvZGEvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvZGEvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkNzUxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2RhL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIFJDUAotCi1mZWF0dXJlVGV4dD1FUEYgUkNQXG5cCi1cblwKLVZlcnNpb246IHsxfSBcblwKLUJ5Z2dlZXRpa2V0OiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2RlL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2RlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NTJhMjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9kZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiAtIFJDUAotCi1mZWF0dXJlVGV4dD1FUEYgUkNQXG5cCi1cblwKLVZlcnNpb246IHsxfSBcblwKLUJ1aWxkLUtlbm5zYXR6OiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9lcy9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9lcy9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGFiMDI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvZXMvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1SQ1AgZGUgRVBGCi0KLWZlYXR1cmVUZXh0PUVQRiBSQ1BcblwKLVxuXAotVmVyc2lcdTAwZjNuOiB7MX0gXG5cCi1FdGlxdWV0YSBkZSBidWlsZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgQ29sYWJvcmFkb3JlcyBkZSBFY2xpcHNlIHkgb3Ryb3MgMjAwMCwgMjAwNy4gIFJlc2VydmFkb3MgdG9kb3MgbG9zIGRlcmVjaG9zLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9mci9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9mci9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjgyMGVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvZnIvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgUkNQCi0KLWZlYXR1cmVUZXh0PUVQRiBSQ1BcblwKLVxuXAotVmVyc2lvbiA6IHsxfSBcblwKLUxpYmVsbFx1MDBlOSBkZSB2ZXJzaW9uIDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvaXQvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvaXQvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNmZTFmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2l0L2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9UkNQIEVQRgotCi1mZWF0dXJlVGV4dD1FUEYgUkNQXG5cCi1cblwKLVZlcnNpb25lOiB7MX0gXG5cCi1FdGljaGV0dGEgYnVpbGQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGUgYWx0cmkgMjAwMCwgMjAwNy4gIFR1dHRpIGkgZGlyaXR0aSByaXNlcnZhdGkuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2phL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2phL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZTg1MjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9qYS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBSQ1AKLQotZmVhdHVyZVRleHQ9RVBGIFJDUFxuXAotXG5cCi1cdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjM6IHsxfSBcblwKLVx1MzBkM1x1MzBlYlx1MzBjOVx1MzBmYlx1MzBlOVx1MzBkOVx1MzBlYjogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3Avbmwva28vYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3Avbmwva28vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZmZDU1ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2tvL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIFJDUAotCi1mZWF0dXJlVGV4dD1FUEYgUkNQXG5cCi1cblwKLVx1YmM4NFx1YzgwNDogezF9IFxuXAotXHViZTRjXHViNGRjIFx1YjgwOFx1Yzc3NFx1YmUxNDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvcHQvQlIvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvcHQvQlIvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwMDZmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL3B0L0JSL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIFJDUAotCi1mZWF0dXJlVGV4dD1FUEYgUkNQXG5cCi1cblwKLVZlcnNcdTAwZTNvOiB7MX0gXG5cCi1Db25zdHJ1XHUwMGU3XHUwMGUzbzogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgY29udHJpYnVpZG9yZXMgRWNsaXBzZSBlIG91dHJvcyAyMDAwLCAyMDA3LiBUb2RvcyBvcyBEaXJlaXRvcyBSZXNlcnZhZG9zLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9ydS9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9ydS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDE0MmE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvcnUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgUkNQCi0KLWZlYXR1cmVUZXh0PUVQRiBSQ1BcblwKLVxuXAotXHUwNDEyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDRmOiB7MX0gXG5cCi1cdTA0MWFcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2FcdTA0MzA6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIFx1MDQxMlx1MDQ0MVx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDQ5XHUwNDM4XHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDRiLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC96aC9DTi9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC96aC9DTi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzA1MjlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvemgvQ04vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgUkNQCi0KLWZlYXR1cmVUZXh0PUVQRiBSQ1BcblwKLVxuXAotXHU3MjQ4XHU2NzJjXHVmZjFhezF9IFxuXAotXHU1ZGU1XHU0ZjVjXHU3MjQ4XHU2NzJjXHU2ODA3XHU3YjdlXHVmZjFhezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiBcbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL3poL1RXL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL3poL1RXL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MDc5ZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC96aC9UVy9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBSQ1AKLQotZmVhdHVyZVRleHQ9RVBGIFJDUFxuXAotXG5cCi1cdTcyNDhcdTY3MmNcdWZmMWF7MX1cblwKLVx1NWVmYVx1N2Y2ZVx1NmExOVx1N2M2NFx1ZmYxYXswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI5ZmUxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1mZWF0dXJlUGx1Z2luTmFtZT1FUEYgUkNQIEZlYXR1cmUKLWZlYXR1cmVQbHVnaW5OYW1lTkw9RVBGIFJDUCBGZWF0dXJlIChOTDEpCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL3dlbGNvbWUueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC93ZWxjb21lLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY0MGQwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL3dlbGNvbWUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08d2VsY29tZVBhZ2UgCi0JdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsiPgotCi08aW50cm8+V2VsY29tZSB0byBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrCi08L2ludHJvPgotCi08aXRlbT48Yj5XaGF0IGlzIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms/PC9iPgotCQotPC9pdGVtPgotCi08aXRlbT48Yj5MZWFybiBNb3JlPC9iPgotCi08L2l0ZW0+Ci0KLTwvd2VsY29tZVBhZ2U+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzRmMjBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIj4KLQkJPGF0dHJpYnV0ZXM+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhdHRyaWJ1dGVzPgotCQk8L2F0dHJpYnV0ZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBkZDg5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIFJpY2ggVGV4dCBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Ly5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yjc5YTc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNjY5NmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IHJpY2h0ZXh0LmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS51aS5mb3JtcywKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLAotIG9yZy5lY2xpcHNlLmVwZi51aSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dCwKLSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9ncywKLSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbCwKLSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQucHJlZmVyZW5jZXMKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZmYmY4Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXNvdXJjZS5yaWNodGV4dC5qYXIgPSBzcmMvCi1vdXRwdXQucmljaHRleHQuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gcmljaHRleHQuamFyLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcnRlLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkSW1hZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRJbWFnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMDhhOGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRJbWFnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZExpbmsuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRMaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IxMTE5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZExpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRPcmRlcmVkTGlzdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZE9yZGVyZWRMaXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhZTQxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZE9yZGVyZWRMaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkVGFibGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRUYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwODg0NjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRUYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZFVub3JkZXJlZExpc3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRVbm9yZGVyZWRMaXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM0NGVjNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZFVub3JkZXJlZExpc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9Cb2xkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQm9sZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYzU5ODcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9Cb2xkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQ2xlYXJDb250ZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQ2xlYXJDb250ZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZmNjQxNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0NsZWFyQ29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0NvcHkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9Db3B5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTliYzY1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0NvcHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9DdXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9DdXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDQzMTQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQ3V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvRmluZFJlcGxhY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9GaW5kUmVwbGFjZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4Zjg4NzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9GaW5kUmVwbGFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0luZGVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0luZGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNmUxNTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9JbmRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9JdGFsaWMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9JdGFsaWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWI1YTQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvSXRhbGljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvT3V0ZGVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L091dGRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGNkYTNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvT3V0ZGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1Bhc3RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvUGFzdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzc2NjhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvUGFzdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9QYXN0ZVBsYWluVGV4dC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1Bhc3RlUGxhaW5UZXh0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxYTIyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1Bhc3RlUGxhaW5UZXh0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvU3Vic2NyaXB0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvU3Vic2NyaXB0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiMzFhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1N1YnNjcmlwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1N1cGVyc2NyaXB0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvU3VwZXJzY3JpcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGIyNjZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvU3VwZXJzY3JpcHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9UaWR5SFRNTC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1RpZHlIVE1MLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiYzlkZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1RpZHlIVE1MLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvVW5kZXJsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvVW5kZXJsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJhOTY0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1VuZGVybGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZEltYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkSW1hZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTQ1MjEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkSW1hZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRMaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkTGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMDhkY2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRMaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkTGluay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZExpbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTkxOTRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkTGluay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZE9yZGVyZWRMaXN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkT3JkZXJlZExpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjgxNGMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkT3JkZXJlZExpc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRUYWJsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZFRhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2ODg1OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZFRhYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkVW5vcmRlcmVkTGlzdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZFVub3JkZXJlZExpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGZkZmM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkVW5vcmRlcmVkTGlzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0JvbGQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9Cb2xkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBkZjllNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0JvbGQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9DbGVhckNvbnRlbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9DbGVhckNvbnRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTU4MzI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQ2xlYXJDb250ZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQ29weS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0NvcHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzJhY2VlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQ29weS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0N1dC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0N1dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlODYzNWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9DdXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9GaW5kUmVwbGFjZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0ZpbmRSZXBsYWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEyNTdlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0ZpbmRSZXBsYWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSW5kZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSW5kZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgxOTVkMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0luZGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0l0YWxpYy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0l0YWxpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMGNkMTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9JdGFsaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9KdXN0aWZ5Q2VudGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeUNlbnRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYWJmMDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9KdXN0aWZ5Q2VudGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeUZ1bGwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9KdXN0aWZ5RnVsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MGEzYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9KdXN0aWZ5RnVsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0p1c3RpZnlMZWZ0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeUxlZnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODU0NjliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeUxlZnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9KdXN0aWZ5UmlnaHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9KdXN0aWZ5UmlnaHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDA1YWYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeVJpZ2h0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvT3V0ZGVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L091dGRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDZiOTRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvT3V0ZGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1Bhc3RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvUGFzdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGQzOWExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvUGFzdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9QYXN0ZVBsYWluVGV4dC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1Bhc3RlUGxhaW5UZXh0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhmOTg5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1Bhc3RlUGxhaW5UZXh0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvU3RyaWtlVGhyb3VnaC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1N0cmlrZVRocm91Z2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTAzNTQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvU3RyaWtlVGhyb3VnaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1N1YnNjcmlwdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1N1YnNjcmlwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMGY3MTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdWJzY3JpcHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdXBlcnNjcmlwdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1N1cGVyc2NyaXB0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI4NjYzNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1N1cGVyc2NyaXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvVGlkeUhUTUwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9UaWR5SFRNTC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZjI0MTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9UaWR5SFRNTC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1VuZGVybGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1VuZGVybGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NDc2ZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9VbmRlcmxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzczMjZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgUmljaCBUZXh0Ci1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVEhFIEZPTExPV0lORyBQUk9QRVJUSUVTIFNIT1VMRCBOT1QgQkUgVFJBTlNMQVRFRCEhIQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUaGUgSFRNTCBmaWxlIHVzZWQgdG8gcmVuZGVyIHRoZSBSaWNoIFRleHQgRWRpdG9yLgotUmljaFRleHQuZWRpdG9ySFRNTD1ydGUuaHRtCi0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE2ODdmNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icmljaFRleHRKYXZhU2NyaXB0IiBuYW1lPSJSaWNoIFRleHQgSmF2YSBTY3JpcHQiIHNjaGVtYT0ic2NoZW1hL3JpY2hUZXh0SmF2YVNjcmlwdC5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnJpY2hUZXh0SmF2YVNjcmlwdCI+Ci0gICAgICA8c2NyaXB0Ci0gICAgICAgICAgICBwYXRoPSJydGUvcnRlLmpzIgotICAgICAgICAgICAgb3JkZXI9IjAiPgotICAgICAgPC9zY3JpcHQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL2JsYW5rLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvYmxhbmsuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDk3MjdhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvYmxhbmsuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLQotPGh0bWw+Ci08aGVhZD4KLQk8dGl0bGU+PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGM2YzllLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvcnRlLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDQ1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLWJvZHkgewotCWJhY2tncm91bmQtaW1hZ2U6IG5vbmU7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLSAJZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gCWZvbnQtc2l6ZTogMTBwdDsKLQltYXJnaW46IDNweDsKLQlwYWRkaW5nOiAwcHg7IAkKLX0KLQotcCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotfQotCi1oMSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiBsYXJnZTsKLX0KLQotaDIgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTUwJTsKLX0KLQotaDMgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotfQotCi1oNCwgaDUsIGg2IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLX0KLQotYTpsaW5rIHsKLQljb2xvcjogIzAwMzM5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hOmFjdGl2ZSB7Ci0JY29sb3I6ICMwMDMzOTk7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1hOnZpc2l0ZWQgewotCWNvbG9yOiAjMDAzMzk5OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWE6aG92ZXIgewotCWNvbG9yOiAjZmYwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotb2wgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlsaXN0LXN0eWxlLXR5cGU6IGRlY2ltYWw7Ci0JbWFyZ2luLWxlZnQ6IDMwcHg7Ci19Ci0KLW9sIGxpIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdGV4dC1hbGlnbjogbGVmdAotfQotCi11bCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCWxpc3Qtc3R5bGUtdHlwZTogZGlzYzsKLQltYXJnaW4tbGVmdDogMzBweDsKLQltYXJnaW4tdG9wOiAwcHg7Ci19Ci0KLXVsIGxpIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotdGFibGUgewotCWJhY2tncm91bmQtaW1hZ2U6IG5vbmU7Ci0JYmFja2dyb3VuZDogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7CQotfQotCi10Ym9keSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCXZhbGlnbjogYmFzZWxpbmU7Ci19Ci0KLXRoIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotdGQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLX0KLQotdGQgdWwgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQltYXJnaW4tYm90dG9tOiAwcHg7Ci0JbWFyZ2luLWxlZnQ6IDMwcHg7Ci19Ci0KLS5wYWdlVGl0bGUgewotCWJhY2tncm91bmQ6ICM5OTk5Y2M7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1zaXplOiAxMnB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXBhZGRpbmctYm90dG9tOiA1cHg7Ci0JcGFkZGluZy1sZWZ0OiAxMHB4OwotCXBhZGRpbmctcmlnaHQ6IDEwcHg7Ci0JcGFkZGluZy10b3A6IDVweDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi0ucGFnZVRpdGxlU2VwYXJhdG9yIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotCXBhZGRpbmc6IDBweDsKLX0KLQotLnRhYiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzVjODFhNzsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7IAotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmFjdGl2ZVRhYiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2M4ZDdlMzsKLQljb2xvcjogIzI5M2Q2YjsJCi0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOyAKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWEudGFiOmxpbmssIGEudGFiOmFjdGl2ZSwgYS50YWI6dmlzaXRlZCB7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOyAKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWEudGFiOmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsJCi19Ci0KLS5vdmVydmlldyB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JcGFkZGluZy1ib3R0b206IDEwcHg7Ci0JcGFkZGluZy1sZWZ0OiAyMHB4OwotCXBhZGRpbmctcmlnaHQ6IDBweDsKLQlwYWRkaW5nLXRvcDogMTBweDsKLX0KLQotLm92ZXJ2aWV3VGFibGUgewotCWJhY2tncm91bmQ6ICNmZmZmZmY7Ci0Jd2lkdGg6IDEwMCU7CQotfQotCi0ub3ZlcnZpZXdUYWJsZSB0ZCB7Ci0JcGFkZGluZy1ib3R0b206IDVweDsKLQlwYWRkaW5nLWxlZnQ6IDVweDsKLQlwYWRkaW5nLXJpZ2h0OiA1cHg7Ci0JcGFkZGluZy10b3A6IDVweDsKLX0KLQotLm92ZXJ2aWV3U2VwYXJhdG9yIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotCXBhZGRpbmc6IDBweDsKLX0KLQotLmV4cGFuZENvbGxhcHNlVGV4dCB7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotCXBhZGRpbmctbGVmdDogNXB4OwotCXBhZGRpbmctcmlnaHQ6IDVweDsKLX0KLQotLmV4cGFuZENvbGxhcHNlTGluayB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JcGFkZGluZy1ib3R0b206IDVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5leHBhbmRDb2xsYXBzZUxpbms6aG92ZXIgewotCWNvbG9yOiAjMDAwMGZmOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0uZXhwYW5kQ29sbGFwc2VMaW5rOnZpc2l0ZWQgewotCWNvbG9yOiAjMzMzMzMzOwotfQotCi0uc2VjdGlvbkhlYWRpbmcgewotCWJhY2tncm91bmQtY29sb3I6ICM5OGIxYzQ7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JY3Vyc29yOiBoYW5kOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlmb250LXdlaWdodDogYm9sZDsKLQlwYWRkaW5nLWJvdHRvbTogMnB4OwotCXBhZGRpbmctbGVmdDogMnB4OwotCXBhZGRpbmctdG9wOiAycHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uc2VjdGlvbkNvbnRlbnQgewotCXBhZGRpbmctYm90dG9tOiAwcHg7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAwcHg7Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLS5zZWN0aW9uVGFibGUgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMXB4OwotCXBhZGRpbmctYm90dG9tOiAxMHB4OwotCXBhZGRpbmctbGVmdDogMTBweDsKLQlwYWRkaW5nLXJpZ2h0OiAxMHB4OwotCXBhZGRpbmctdG9wOiAxMHB4OwotCXdpZHRoOiAxMDAlOwotfQotCi0uc2VjdGlvblRhYmxlSGVhZGluZyB7Ci0JYmFja2dyb3VuZDogI2VlZTsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDBweDsKLQljb2xvcjogIzMzMzMzMzsKLQloZWlnaHQ6IDIwOwotCXRleHQtYWxpZ246IGxlZnQ7Ci0Jd2lkdGg6IDIwJTsKLX0KLQotLnNlY3Rpb25UYWJsZUNlbGwgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotfQotCi0uYnJlYWtkb3duVGFibGUgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMXB4OwotCXBhZGRpbmctYm90dG9tOiAwcHg7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAwcHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5icmVha2Rvd25UYWJsZSB0aCB7Ci0JYmFja2dyb3VuZDogI2VlZTsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDBweDsKLQljb2xvcjogIzMzMzMzMzsKLQloZWlnaHQ6IDIwOwotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLS5icmVha2Rvd25UYWJsZSB0ZCB7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci19Ci0KLS5kZWZhdWx0VGFibGUgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCXBhZGRpbmctYm90dG9tOiAwcHg7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAwcHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5kZWZhdWx0VGFibGUgdGQgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLS5zdWJTZWN0aW9uSGVhZGluZyB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnN1YlNlY3Rpb25Db250ZW50IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwkKLX0KLQotLnN0ZXBIZWFkaW5nIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotCWNvbG9yOiAjMjkzZDZiOwotCWN1cnNvcjogaGFuZDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JcGFkZGluZy1ib3R0b206IDJweDsKLQlwYWRkaW5nLWxlZnQ6IDJweDsKLQlwYWRkaW5nLXRvcDogMnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnN0ZXBDb250ZW50IHsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDBweDsKLQlwYWRkaW5nLWJvdHRvbTogNXB4OwotCXBhZGRpbmctbGVmdDogMHB4OwotCXBhZGRpbmctcmlnaHQ6IDBweDsKLQlwYWRkaW5nLXRvcDogMHB4OwotCXRleHQtYWxpZ246IHJpZ2h0OwotfQotCi0uc3RlcFRhYmxlIHsKLQlib3JkZXItYm90dG9tOiAjOTk5OTk5IHNvbGlkIDFweDsKLQlib3JkZXItbGVmdDogIzk5OTk5OSBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjOTk5OTk5IHNvbGlkIDBweDsKLQlib3JkZXItdG9wOiAjOTk5OTk5IHNvbGlkIDBweDsKLQlwYWRkaW5nLWJvdHRvbTogMjBweDsKLQlwYWRkaW5nLWxlZnQ6IDEwcHg7Ci0JcGFkZGluZy1yaWdodDogMTBweDsKLQlwYWRkaW5nLXRvcDogMTBweDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLnN0ZXBUYWJsZSB0ZCB7Ci0JYm9yZGVyOiAjY2NjIHNvbGlkIDBweDsKLX0KLQotLnN0ZXBTZXBhcmF0b3IgewotCWJhY2tncm91bmQtY29sb3I6ICNjY2NjY2M7Ci0JcGFkZGluZzogMHB4OwotfQotCi0uYmFja1RvVG9wTGluayB7Ci0JY29sb3I6ICNmZmZmZjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsJCi0JbWFyZ2luOiAwcHg7Ci0JcGFkZGluZy1ib3R0b206IDEwcHg7Ci0JdGV4dC1hbGlnbjogbWlkZGxlOwkKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5iYWNrVG9Ub3BMaW5rOmhvdmVyIHsKLQljb2xvcjogIzk2OTsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmJhY2tUb1RvcExpbms6dmlzaXRlZCB7Ci0JY29sb3I6ICM1YzgxYTc7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwkKLX0KLQotLmNvcHlyaWdodCB7Ci0JY29sb3I6ICM3MDgwYjA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci0JcGFkZGluZy1yaWdodDogMTBweDsKLQlwYWRkaW5nLXRvcDogMjVweDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotCXdpZHRoOiAxMDAlOwotfQotCi0udmVyc2lvbkluZm8gewotCWNvbG9yOiAjNzA4MGIwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCXBhZGRpbmctbGVmdDogMTBweDsKLQlwYWRkaW5nLXJpZ2h0OiAwcHg7Ci0JcGFkZGluZy10b3A6IDI1cHg7Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLS5xdW90ZSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLmNvZGVTYW1wbGUgewotCWZvbnQtZmFtaWx5OiBjb3VyaWVyOwotCWZvbnQtc2l6ZTogMTBwdDsJCQotfQotCi0uZWxlbWVudExpbmsgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsJCi0JY29sb3I6ICMwMDAwZmY7Ci19Ci0KLS5lbGVtZW50TGlua1dpdGhUeXBlIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JY29sb3I6ICMwMDAwZmY7Ci19Ci0KLS5lbGVtZW50TGlua1dpdGhVc2VyVGV4dCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCWNvbG9yOiAjMDAwMGZmOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvcnRlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NTFjYjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTxodG1sPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0JPGhlYWQ+Ci0JCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJydGUuanMiPjwvc2NyaXB0PgkJCi0JPC9oZWFkPgotCTxib2R5IGxlZnRNYXJnaW49IjAiIHRvcE1hcmdpbj0iMCIgbWFyZ2luaGVpZ2h0PSIwIiBtYXJnaW53aWR0aD0iMCIgc2Nyb2xsPSJubyIgc3R5bGU9Im92ZXJmbG93OiBoaWRkZW4iPgotCQk8aWZyYW1lIGlkPSJydGUiIG5hbWU9InJ0ZSIgc3R5bGU9ImJvcmRlcjogbm9uZTsiIGZyYW1lYm9yZGVyPSIwIiBzY3JvbGxpbmc9ImF1dG8iIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiPjwvaWZyYW1lPgotCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0JCQlpbml0RWRpdG9yKCdydGUnLCAncnRlLmNzcycsIG51bGwpOwotCQk8L3NjcmlwdD4KLQk8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS5qcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvcnRlLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzFiYjYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvcnRlLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTI3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBAYXV0aG9yIEtlbHZpbiBMb3cKLS8vIEBzaW5jZSAxLjAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBOb3RlOiBNb3ppbGxhL0ZpcmVmb3ggZG9lcyBub3QgYWxsb3cgdW5wcml2aWxlZ2VkIHNjcmlwdHMgdG8gaW52b2tlIHRoZSBjdXQsCi0vLyBjb3B5IGFuZCBwYXN0ZSBjb21tYW5kcy4gVGhlIEphdmFzY3JpcHQgbXVzdCBlaXRoZXIgYmUgc2lnbmVkCi0vLyAoc2VlIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvcHJvamVjdHMvc2VjdXJpdHkvY29tcG9uZW50cy9zaWduZWQtc2NyaXB0cy5odG1sKSwKLS8vIG9yIHRoZSB1c2VycyBtdXN0IGNoYW5nZSB0aGVpciBwcmVmZXJlbmNlcwotLy8gKHNlZSBodHRwOi8vd3d3Lm1vemlsbGEub3JnL2VkaXRvci9taWRhc2RlbW8vc2VjdXJpdHlwcmVmcy5odG1sKS4KLS8vIEFsdGVybmF0aXZlbHksIHRoZSB1c2VycyBjYW4gdXNlIHRoZSBjdHJsLXgsIGN0cmwtYyBhbmQgY3RybC12IGtleXMuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12YXIgcnRlID0gbmV3IFJURSgpOwotCi1mdW5jdGlvbiBSVEUoKSB7Ci19Ci0KLVJURS5wcm90b3R5cGUuU1RBVFVTX05PUCA9IDA7Ci1SVEUucHJvdG90eXBlLlNUQVRVU19JTklUSUFMSVpFRCA9IDE7Ci1SVEUucHJvdG90eXBlLlNUQVRVU19NT0RJRklFRCA9IDI7Ci1SVEUucHJvdG90eXBlLlNUQVRVU19HRVRfVEVYVCA9IDM7Ci1SVEUucHJvdG90eXBlLlNUQVRVU19LRVlfRE9XTiA9IDQ7Ci1SVEUucHJvdG90eXBlLlNUQVRVU19LRVlfVVAgPSA1OwotUlRFLnByb3RvdHlwZS5TVEFUVVNfU0VMRUNUX1RFWFQgPSA2OwotUlRFLnByb3RvdHlwZS5TVEFUVVNfU0VMRUNUX0NPTlRST0wgPSA3OwotUlRFLnByb3RvdHlwZS5TVEFUVVNfU0VMRUNUX05PTkUgPSA4OwotUlRFLnByb3RvdHlwZS5TVEFUVVNfRVhFQ19DTUQgPSA5OwotUlRFLnByb3RvdHlwZS5TVEFUVVNfUkVGT1JNQVRfTElOS1MgPSAxMDsKLQotUlRFLnByb3RvdHlwZS5LRVlfQVJST1dfRE9XTiA9IDQwOwotUlRFLnByb3RvdHlwZS5LRVlfQVJST1dfTEVGVCA9IDM3OwotUlRFLnByb3RvdHlwZS5LRVlfQVJST1dfUklHSFQgPSAzOTsKLVJURS5wcm90b3R5cGUuS0VZX0FSUk9XX1VQID0gMzg7Ci1SVEUucHJvdG90eXBlLktFWV9CQUNLU1BBQ0UgPSA4OwotUlRFLnByb3RvdHlwZS5LRVlfRU5EID0gMzU7Ci1SVEUucHJvdG90eXBlLktFWV9IT01FID0gMzY7Ci1SVEUucHJvdG90eXBlLktFWV9QQUdFX0RPV04gPSAzNDsKLVJURS5wcm90b3R5cGUuS0VZX1BBR0VfVVAgPSAzMzsKLVJURS5wcm90b3R5cGUuS0VZX1RBQiA9IDk7Ci1SVEUucHJvdG90eXBlLktFWV9DID0gNjc7Ci1SVEUucHJvdG90eXBlLktFWV9GID0gNzA7Ci1SVEUucHJvdG90eXBlLktFWV9TID0gODM7Ci1SVEUucHJvdG90eXBlLktFWV9WID0gODY7Ci1SVEUucHJvdG90eXBlLktFWV9YID0gODg7Ci1SVEUucHJvdG90eXBlLktFWV9aID0gOTA7Ci0KLVJURS5wcm90b3R5cGUuQ01EX0NPUFkgPSAiY29weSI7Ci1SVEUucHJvdG90eXBlLkNNRF9DVVQgPSAiY3V0IjsKLVJURS5wcm90b3R5cGUuQ01EX0ZJTkRfVEVYVCA9ICJmaW5kVGV4dCI7Ci1SVEUucHJvdG90eXBlLkNNRF9QQVNURSA9ICJwYXN0ZSI7Ci1SVEUucHJvdG90eXBlLkNNRF9TQVZFID0gInNhdmUiOwotUlRFLnByb3RvdHlwZS5DTURfU0FWRV9BTEwgPSAic2F2ZUFsbCI7Ci0KLVJURS5wcm90b3R5cGUuVEFCTEVfSEVBREVSU19OT05FID0gMDsKLVJURS5wcm90b3R5cGUuVEFCTEVfSEVBREVSU19DT0xTID0gMTsKLVJURS5wcm90b3R5cGUuVEFCTEVfSEVBREVSU19ST1dTID0gMjsKLVJURS5wcm90b3R5cGUuVEFCTEVfSEVBREVSU19CT1RIID0gMzsKLQotUlRFLnByb3RvdHlwZS5TVFlMRV9CT0xEID0gMTsKLVJURS5wcm90b3R5cGUuU1RZTEVfSVRBTElDID0gUlRFLlNUWUxFX0JPTEQgPDwgMTsKLVJURS5wcm90b3R5cGUuU1RZTEVfVU5ERVJMSU5FID0gUlRFLlNUWUxFX0lUQUxJQyA8PCAxOwotUlRFLnByb3RvdHlwZS5TVFlMRV9TVUJTQ1JJUFQgPSBSVEUuU1RZTEVfVU5ERVJMSU5FIDw8IDE7Ci1SVEUucHJvdG90eXBlLlNUWUxFX1NVUEVSU0NSSVBUID0gUlRFLlNUWUxFX1NVQlNDUklQVCA8PCAxOwotCi1SVEUucHJvdG90eXBlLmVkaXRvcklkOwotUlRFLnByb3RvdHlwZS5lZGl0b3JDU1M7Ci1SVEUucHJvdG90eXBlLmJhc2VIUkVGOwotUlRFLnByb3RvdHlwZS5zdXBwb3J0UmljaFRleHRFZGl0aW5nID0gdHJ1ZTsKLVJURS5wcm90b3R5cGUuZWRpdG9yRG9jOwotUlRFLnByb3RvdHlwZS5zZWxlY3Rpb247Ci1SVEUucHJvdG90eXBlLnNlbGVjdGlvblJhbmdlOwotUlRFLnByb3RvdHlwZS5yZWFkT25seSA9IGZhbHNlOwotUlRFLnByb3RvdHlwZS5pbml0aWFsaXplZCA9IGZhbHNlOwotUlRFLnByb3RvdHlwZS5tb2RpZmllZCA9IGZhbHNlOwotCi0KLS8vSW5pdGlhbGl6ZXMgdGhlIGVkaXRvci4KLVJURS5wcm90b3R5cGUuaW5pdEVkaXRvciA9IGZ1bmN0aW9uKGlkLCBjc3MsIGJhc2VVUkwpIHsKLQl0aGlzLmVkaXRvcklkID0gaWQ7Ci0JdGhpcy5lZGl0b3JDU1MgPSBjc3M7Ci0JdGhpcy5iYXNlSFJFRiA9IGJhc2VVUkw7Ci0JdHJ5IHsKLQkJdGhpcy5lbmFibGVSaWNoVGV4dEVkaXRpbmcoJycpOwotCQl0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTsKLQkJdGhpcy5zZXRTdGF0dXModGhpcy5TVEFUVVNfSU5JVElBTElaRUQsIG51bGwpOwotCX0KLQljYXRjaCAoZSkgewotCQl0aGlzLnN1cHBvcnRSaWNoVGV4dEVkaXRpbmcgPSBmYWxzZTsKLQl9Ci19Ci0KLS8vIEhhbmRsZXMgdGhlIGtleSBldmVudHMuCi1SVEUucHJvdG90eXBlLmtleVByZXNzZWQgPSBmdW5jdGlvbihldmVudCkgewotCXZhciBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTsKLQlpZiAoa2V5Q29kZSA9PSAwICYmICFkb2N1bWVudC5hbGwpIHsKLQkJa2V5Q29kZSA9IGV2ZW50LmNoYXJDb2RlOwotCQlzd2l0Y2ggKGtleUNvZGUpIHsKLQkJCWNhc2UgOTk6Ci0JCQkJa2V5Q29kZSA9IHJ0ZS5LRVlfQzsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTAyOgotCQkJCWtleUNvZGUgPSBydGUuS0VZX0Y7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDExNToKLQkJCQlrZXlDb2RlID0gcnRlLktFWV9TOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxMTg6Ci0JCQkJa2V5Q29kZSA9IHJ0ZS5LRVlfVjsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTIwOgotCQkJCWtleUNvZGUgPSBydGUuS0VZX1g7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDEyMjoKLQkJCQlrZXlDb2RlID0gcnRlLktFWV9aOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCXZhciBjdHJsS2V5ID0gZXZlbnQuY3RybEtleTsKLQl2YXIgc2hpZnRLZXkgPSBldmVudC5zaGlmdEtleTsKLQkKLQlzd2l0Y2goa2V5Q29kZSkgewotCQljYXNlIHJ0ZS5LRVlfQVJST1dfRE9XTjoKLQkJY2FzZSBydGUuS0VZX0FSUk9XX0xFRlQ6Ci0JCWNhc2UgcnRlLktFWV9BUlJPV19SSUdIVDoKLQkJY2FzZSBydGUuS0VZX0FSUk9XX1VQOgotCQljYXNlIHJ0ZS5LRVlfRU5EOgotCQljYXNlIHJ0ZS5LRVlfSE9NRToKLQkJY2FzZSBydGUuS0VZX1BBR0VfRE9XTjoKLQkJY2FzZSBydGUuS0VZX1BBR0VfVVA6Ci0JCWNhc2UgcnRlLktFWV9UQUI6Ci0JCQlicmVhazsKLQkJY2FzZSBydGUuS0VZX0JBQ0tTUEFDRToKLQkJCWlmICghcnRlLnJlYWRPbmx5KSB7Ci0JCQkJc2V0VGltZW91dCgicnRlLnNldFN0YXR1cyhydGUuU1RBVFVTX01PRElGSUVELCBudWxsKTsiLCAxMCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBydGUuS0VZX0M6Ci0JCQlpZiAoY3RybEtleSkgewotCQkJCXJ0ZS5zZXRTdGF0dXMocnRlLlNUQVRVU19LRVlfRE9XTiwgcnRlLkNNRF9DT1BZKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCFkb2N1bWVudC5hbGwgJiYgcnRlLnJlYWRPbmx5KSB7Ci0JCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKLQkJCX0KLQkJCWJyZWFrOwkJCQotCQljYXNlIHJ0ZS5LRVlfRjoKLQkJCWlmIChjdHJsS2V5KSB7Ci0JCQkJaWYgKGRvY3VtZW50LmFsbCkgewotCQkJCQlldmVudC5rZXlDb2RlID0gLTE7Ci0JCQkJCWV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJCX0KLQkJCQlydGUuc2V0U3RhdHVzKHJ0ZS5TVEFUVVNfS0VZX0RPV04sIHJ0ZS5DTURfRklORF9URVhUKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCFkb2N1bWVudC5hbGwgJiYgcnRlLnJlYWRPbmx5KSB7Ci0JCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIHJ0ZS5LRVlfUzoKLQkJCWlmICghcnRlLnJlYWRPbmx5ICYmIGN0cmxLZXkpIHsKLQkJCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJCWV2ZW50LmtleUNvZGUgPSAtMTsKLQkJCQkJZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0JCQkJfQotCQkJCWlmIChzaGlmdEtleSkgewotCQkJCQlydGUuc2V0U3RhdHVzKHJ0ZS5TVEFUVVNfS0VZX0RPV04sIHJ0ZS5DTURfU0FWRV9BTEwpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcnRlLnNldFN0YXR1cyhydGUuU1RBVFVTX0tFWV9ET1dOLCBydGUuQ01EX1NBVkUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKCFkb2N1bWVudC5hbGwgJiYgcnRlLnJlYWRPbmx5KSB7Ci0JCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKLQkJCX0JCQkKLQkJCWJyZWFrOwotCQljYXNlIHJ0ZS5LRVlfVjoKLQkJCWlmIChjdHJsS2V5KSB7CQkKLQkJCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJCWV2ZW50LmtleUNvZGUgPSAtMTsKLQkJCQkJZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTsKLQkJCQkJaWYgKCFydGUucmVhZE9ubHkpIHsKLQkJCQkJCXJ0ZS5zZXRTdGF0dXMocnRlLlNUQVRVU19LRVlfRE9XTiwgcnRlLkNNRF9QQVNURSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmICghcnRlLnJlYWRPbmx5KSB7Ci0JCQkJCQkvLyBXb3JrYXJvdW5kIE1vemlsbGEvRmlyZWZveCBwYXN0ZSBpc3N1ZXMuCi0JCQkJCQlzZXRUaW1lb3V0KCJydGUuc2V0U3RhdHVzKHJ0ZS5TVEFUVVNfS0VZX0RPV04sIHJ0ZS5DTURfUEFTVEUpOyIsIDEwKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICghZG9jdW1lbnQuYWxsICYmIHJ0ZS5yZWFkT25seSkgewotCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBydGUuS0VZX1g6Ci0JCQlpZiAoY3RybEtleSkgewotCQkJCXJ0ZS5zZXRTdGF0dXMocnRlLlNUQVRVU19LRVlfRE9XTiwgcnRlLkNNRF9DVVQpOwotCQkJfQotCQkJZWxzZSBpZiAoIWRvY3VtZW50LmFsbCAmJiBydGUucmVhZE9ubHkpIHsKLQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgcnRlLktFWV9aOgotCQkJaWYgKCFydGUucmVhZE9ubHkgJiYgY3RybEtleSkgewotCQkJCXNldFRpbWVvdXQoInJ0ZS5zZXRTdGF0dXMocnRlLlNUQVRVU19NT0RJRklFRCwgbnVsbCk7IiwgMTApOwotCQkJfQotCQkJZWxzZSBpZiAoIWRvY3VtZW50LmFsbCAmJiBydGUucmVhZE9ubHkpIHsKLQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJfQkJCQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAoIWRvY3VtZW50LmFsbCAmJiBydGUucmVhZE9ubHkpIHsKLQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJfQotCX0KLX0KLQotUlRFLnByb3RvdHlwZS5zZWxDaGFuZ2VkID0gZnVuY3Rpb24oZXZlbnQpIHsKLQlydGUudXBkYXRlU2VsZWN0aW9uKCk7Ci19Ci0KLVJURS5wcm90b3R5cGUuZW5hYmxlUmljaFRleHRFZGl0aW5nID0gZnVuY3Rpb24oaHRtbCkgewotCXZhciBkb2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmVkaXRvcklkKS5jb250ZW50V2luZG93LmRvY3VtZW50OwotCWRvYy5kZXNpZ25Nb2RlID0gIm9uIjsKLQkKLQl2YXIgaHRtbFNyYyA9ICc8aHRtbD48aGVhZD48dGl0bGU+PC90aXRsZT4nOwotCQotCWlmICh0aGlzLmVkaXRvckNTUyAhPSBudWxsICYmIHRoaXMuZWRpdG9yQ1NTICE9ICcnKSB7Ci0JCWh0bWxTcmMgKz0gJzxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0iJyArIHRoaXMuZWRpdG9yQ1NTICsgJyIgdHlwZT0idGV4dC9jc3MiLz4nOwotCX0KLQkKLQlpZiAodGhpcy5iYXNlSFJFRiAhPSBudWxsICYmIHRoaXMuYmFzZUhSRUYgIT0gJycpIHsJCi0JCWh0bWxTcmMgKz0gJzxiYXNlIGhyZWY9IicgKyB0aGlzLmJhc2VIUkVGICsgJyIvPic7Ci0JfQotCQotCWlmICghZG9jdW1lbnQuYWxsICYmIGh0bWwgPT0gJycpIHsKLQkJLy8gTW96aWxsYS9GaXJlZm94IHdpbGwgb25seSBkaXNwbGF5IHRoZSBjYXJldCBpZiA8YnIvPiBpcyBhZGRlZCB0byB0aGUgSFRNTCBib2R5LgotCQkvLyBBZGRpbmcgPGJyLz4gYWxzbyBlbmFibGVzIHRoZSBiYWNrc3BhY2UgYW5kIGRlbGV0ZSBrZXkgYnkgZGVmYXVsdC4gT3RoZXJ3aXNlLCB0aGUKLQkJLy8gdXNlciBuZWVkIHRvIGVudGVyIHNvbWUgdGV4dCBiZWZvcmUgdGhlc2UgMiBrZXlzIHN0YXJ0IHRvIGZ1bmN0aW9uLgotCQlodG1sID0gIjxiciAvPiI7Ci0JfQotCQotCWh0bWxTcmMgKz0gJzwvaGVhZD48Ym9keT4nICsgaHRtbCArICc8L2JvZHk+PC9odG1sPic7Ci0JCi0JZG9jLm9wZW4oKTsKLQlkb2Mud3JpdGUoaHRtbFNyYyk7Ci0JZG9jLmNsb3NlKCk7Ci0JCi0JdGhpcy5tb2RpZmllZCA9IGZhbHNlOwotCi0JaWYgKCJhdHRhY2hFdmVudCIgaW4gZG9jKSB7Ci0JCWRvYy5hdHRhY2hFdmVudCgib25rZXlkb3duIiwgdGhpcy5rZXlQcmVzc2VkKTsKLQkJZG9jLmF0dGFjaEV2ZW50KCJvbnNlbGVjdGlvbmNoYW5nZSIsIHRoaXMuc2VsQ2hhbmdlZCk7Ci0JCS8vIGZvciBEbkQgKGludGVybmFsKQotCQlkb2MuYm9keS5hdHRhY2hFdmVudCgib25kcm9wIiwgdGhpcy5jaGVja01vZGlmaWVkKTsKLQkJLy8gZm9yIGltYWdlL3RhYmxlIHJlc2l6aW5nOgotCQlkb2MuYm9keS5hdHRhY2hFdmVudCgib25yZXNpemVlbmQiLCB0aGlzLmNoZWNrTW9kaWZpZWQpOwotCX0JCi0JaWYgKCJhZGRFdmVudExpc3RlbmVyIiBpbiBkb2MpIHsKLQkJZG9jLmFkZEV2ZW50TGlzdGVuZXIoImtleXByZXNzIiwgdGhpcy5rZXlQcmVzc2VkLCB0cnVlKTsKLQkJZG9jLmFkZEV2ZW50TGlzdGVuZXIoImtleXByZXNzIiwgdGhpcy5zZWxDaGFuZ2VkLCBmYWxzZSk7Ci0JCWRvYy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgdGhpcy5zZWxDaGFuZ2VkLCBmYWxzZSk7Ci0JCWRvYy5hZGRFdmVudExpc3RlbmVyKCJkcmFnZHJvcCIsIHRoaXMuY2hlY2tNb2RpZmllZCwgZmFsc2UpOwotCQkKLQkJLy8gY2hlY2sgbW91c2V1cCBldmVudCBmb3IgaW1hZ2UvdGFibGUgcmVzaXppbmcKLQkJZG9jLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCB0aGlzLmNoZWNrTW9kaWZpZWQsIGZhbHNlKTsKLQl9Ci0KLQl0aGlzLnNldFN0YXR1cyh0aGlzLlNUQVRVU19FWEVDX0NNRCwgMSk7Ci19Ci0KLS8vIHRoaXMgb25lIGlzIGZvciBtb2RpZmljYXRpb24gY2hlY2sgb24gZHJhZyBuIGRyb3Agd2l0aGluIHRoZSBSVEUKLS8vIGNoZWNrTW9kaWZpZWQgbGlzdGVuZXIKLVJURS5wcm90b3R5cGUuY2hlY2tNb2RpZmllZCA9IGZ1bmN0aW9uKGV2ZW50KSB7Ci0Jc2V0VGltZW91dCgicnRlLnNldFN0YXR1cyhydGUuU1RBVFVTX01PRElGSUVELCBudWxsKTsiLCAxMCk7Ci19Ci0KLS8vIFNldHMgdGhlIGhlaWdodCBvZiB0aGUgZWRpdG9yLgotUlRFLnByb3RvdHlwZS5zZXRIZWlnaHQgPSBmdW5jdGlvbihoZWlnaHQpIHsKLQlpZiAodGhpcy5pbml0aWFsaXplZCkgewotCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmVkaXRvcklkKS5oZWlnaHQgPSBoZWlnaHQgKyAicHgiOwotCX0KLX0KLQotLy8gU2V0cyB0aGUgc3RhdHVzLgotLy8gTm90ZTogQnkgZGVmYXVsdCwgRmlyZWZveCBkaXNhYmxlcyBjaGFuZ2VzIHRvIHRoZSBzdGF0dXMgYmFyLiBGb3IgdGhpcyB0byB3b3JrLCB0aGUgdXNlcgotLy8gbXVzdCBzZXQgdGhlIGdsb2JhbCBwcmVmZXJlbmNlICJkb20uZGlzYWJsZV93aW5kb3dfc3RhdHVzX2NoYW5nZSIgdG8gZmFsc2UuCi0vLyBGb3IgRmlyZWZveCAxLjAueCwgdGhpcyBzZXR0aW5nIGNhbiBiZSBtYWRlIGluIC91c3IvZmlyZWZveC0xLjAuNy9kZWZhdWx0cy9wcmVmL2ZpcmVmb3guanMuCi1SVEUucHJvdG90eXBlLnNldFN0YXR1cyA9IGZ1bmN0aW9uKHR5cGUsIHZhbHVlKSB7Ci0JdmFyIHN0YXR1cyA9ICckJCQnICsgdHlwZTsKLQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSAnJykgewotCQlzdGF0dXMgKz0gKCckJyArIHZhbHVlKTsJCQotCX0KLQl3aW5kb3cuc3RhdHVzID0gc3RhdHVzOwotCXdpbmRvdy5zdGF0dXMgPSAnJCQkJyArIHRoaXMuU1RBVFVTX05PUDsKLX0KLQotLy8gUmV0dXJucyB0aGUgSFRNTCBzb3VyY2UuCi1SVEUucHJvdG90eXBlLmdldEhUTUwgPSBmdW5jdGlvbigpIHsKLQl2YXIgaHRtbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw7Ci0JaWYgKGh0bWwgPT0gIjxQPiZuYnNwOzwvUD4iKSB7Ci0JCWh0bWwgPSAiIjsKLQl9Ci0JaWYgKGh0bWwgIT0gbnVsbCAmJiBodG1sICE9ICcnKSB7Ci0JCXZhciByZWdFeCA9IG5ldyBSZWdFeHAoIlwiZmlsZVw6KFtePV0qKSgvcmVzb3VyY2VzLykoW15cIl0rKVwiIiwgImciKTsKLQkJaHRtbCA9IGh0bWwucmVwbGFjZShyZWdFeCwgIlwiLi9yZXNvdXJjZXMvJDNcIiIpOwotCQlyZWdFeCA9IG5ldyBSZWdFeHAoIlwiZmlsZVw6KFtePV0qKS8jKFteXCJdKylcIiIsICJnIik7Ci0JCWh0bWwgPSBodG1sLnJlcGxhY2UocmVnRXgsICJcIiMkMlwiIik7Ci0JfQotCXJldHVybiBodG1sOwotfQotCi0vL1JldHVybnMgdGhlIEhUTUwgc291cmNlIHRvIHRoZSBKYXZhIGxheWVyCi1SVEUucHJvdG90eXBlLmdldFRleHQgPSBmdW5jdGlvbigpIHsKLQl2YXIgaHRtbCA9IHRoaXMuZ2V0SFRNTCgpOwotCXRoaXMuc2V0U3RhdHVzKHRoaXMuU1RBVFVTX0dFVF9URVhULCBodG1sKTsKLQlyZXR1cm4gaHRtbDsKLX0KLQotUlRFLnByb3RvdHlwZS5zZXRJbm5lckhUTUwgPSBmdW5jdGlvbihodG1sKSB7Ci0JaWYgKGRvY3VtZW50LmFsbCkgewotCQkvLyBJRSBoYXMgcHJvYmxlbSBzZXR0aW5nIGNvbXBsZXggSFRNTCBzZXQgdmlhIGRvYy5ib2R5LmlubmVySFRNTC4KLQkJdGhpcy5lbmFibGVSaWNoVGV4dEVkaXRpbmcoaHRtbCk7Ci0JfQotCWVsc2UgewotCQlpZiAoaHRtbCA9PSAnJykgewotCQkJLy8gTW96aWxsYS9GaXJlZm94IHdpbGwgb25seSBkaXNwbGF5IHRoZSBjYXJldCBpZiA8YnIvPiBpcyBhZGRlZCB0byB0aGUgSFRNTCBib2R5LgotCQkJaHRtbCA9ICI8YnIvPiI7Ci0JCX0KLQkJdmFyIGRvYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7Ci0JCWlmIChkb2MuYm9keSAhPSBudWxsKSB7Ci0JCQlkb2MuYm9keS5pbm5lckhUTUwgPSBodG1sOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gTW96aWxsYS9GaXJlZm94IGNhbiB0YWtlIGEgd2hpbGUgdG8gaW5pdGlhbGl6ZSBkb2N1bWVudC5ib2R5Ci0JCQkvLyBhZnRlciBkb2N1bWVudC53cml0ZSgpLgotCQkJdHJ5IHsKLQkJCQlzZXRUaW1lb3V0KCJ0aGlzLnNldElubmVySFRNTCgnIiArIGh0bWwgKyAiJyk7IiwgMTApOwotCQkJfQotCQkJY2F0Y2ggKGUpIHsKLQkJCX0KLQkJfQotCX0KLX0KLQotLy8gU2V0cyB0aGUgSFRNTCBzb3VyY2UuCi1SVEUucHJvdG90eXBlLnNldFRleHQgPSBmdW5jdGlvbihodG1sKSB7Ci0JaWYgKHRoaXMuc3VwcG9ydFJpY2hUZXh0RWRpdGluZykgewotCQlodG1sID0gdGhpcy5kZWNvZGVTdHJpbmcoaHRtbCk7Ci0JCXRoaXMuc2V0SW5uZXJIVE1MKGh0bWwpOwotCQl0aGlzLm1vZGlmaWVkID0gZmFsc2U7Ci0JCXRoaXMuc2V0U3RhdHVzKHRoaXMuU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQl9Ci19Ci0KLS8vIERlY29kZXMgdGhlIEhUTUwgcGFzc2VkIGZyb20gdGhlIEphdmEgbGF5ZXIuCi1SVEUucHJvdG90eXBlLmRlY29kZVN0cmluZyA9IGZ1bmN0aW9uKHN0cikgewotCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIgIT0gJycpIHsKLQkJaWYgKGRvY3VtZW50LmFsbCkgewotCQkJc3RyID0gc3RyLnJlcGxhY2UoLyVzcSUvZywgIiciKTsKLQkJCXN0ciA9IHN0ci5yZXBsYWNlKC8lRU9MJS9nLCAiXG4iKTsKLQkJfQotCQllbHNlIHsKLQkJCXN0ciA9IHN0ci5yZXBsYWNlKC8lc3ElL2csICImYXBvczsiKTsKLQkJCXN0ciA9IHN0ci5yZXBsYWNlKC8lRU9MJS9nLCAiIik7Ci0JCQlzdHIgPSBzdHIucmVwbGFjZSgvXG4vZywgIiIpOwotCQl9Ci0JfQotCXJldHVybiBzdHI7Ci19Ci0KLS8vIHVwZGF0ZXMgc2VsZWN0aW9uIHdpdGhvdXQgbm90aWZ5aW5nIHRoZSBKYXZhIGxheWVyIG9mIHRoZSBzZWxlY3Rpb24gc3RhdGUKLVJURS5wcm90b3R5cGUuaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24gPSBmdW5jdGlvbigpIHsKLQlpZiAoIXRoaXMuc3VwcG9ydFJpY2hUZXh0RWRpdGluZykgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQkKLQkKLQljb250ZW50V2luZG93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5lZGl0b3JJZCkuY29udGVudFdpbmRvdzsKLQl0aGlzLmVkaXRvckRvYyA9IGNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7Ci0JCi0JaWYgKGRvY3VtZW50LmFsbCkgewotCQl0aGlzLnNlbGVjdGlvbiA9IHRoaXMuZWRpdG9yRG9jLnNlbGVjdGlvbjsKLQkJaWYgKHRoaXMuc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCXRoaXMuc2VsZWN0aW9uUmFuZ2UgPSB0aGlzLnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOwotCQkJdGhpcy5yZWZvcm1hdEVsZW1lbnRMaW5rcygpOwotCQl9Ci0JfQotCWVsc2UgewotCQl0aGlzLnNlbGVjdGlvbiA9IGNvbnRlbnRXaW5kb3cuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICh0aGlzLnNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQl0aGlzLnNlbGVjdGlvblJhbmdlID0gdGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2VBdCh0aGlzLnNlbGVjdGlvbi5yYW5nZUNvdW50IC0gMSkuY2xvbmVSYW5nZSgpOwotCQkJaWYgKHRoaXMuc2VsZWN0aW9uUmFuZ2Uuc3RhcnRDb250YWluZXIubm9kZU5hbWUgPT0gIkhUTUwiICYmCi0JCQkJCXRoaXMuc2VsZWN0aW9uUmFuZ2UuZW5kQ29udGFpbmVyLm5vZGVOYW1lID09ICJIVE1MIikgewotCQkJCS8vIE1vemlsbGEgc2VsZWN0cyB0aGUgd2hvbGUgZG9jdW1lbnQgd2hlbiB0aGVyZSdzIG5vIFJURSBjb250ZW50LCBzbyBzZWxlY3QganVzdCB0aGUgYm9keQotCQkJCXRoaXMuc2VsZWN0aW9uUmFuZ2UgPSB0aGlzLmVkaXRvckRvYy5jcmVhdGVSYW5nZSgpOwotCQkJCXRoaXMuc2VsZWN0aW9uUmFuZ2Uuc2V0U3RhcnQodGhpcy5lZGl0b3JEb2MuYm9keSwgMCk7Ci0JCQkJdGhpcy5zZWxlY3Rpb25SYW5nZS5zZXRFbmQodGhpcy5lZGl0b3JEb2MuYm9keSwgMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFVwZGF0ZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGFuZCBzZWxlY3Rpb24gcmFuZ2UuCi1SVEUucHJvdG90eXBlLnVwZGF0ZVNlbGVjdGlvbiA9IGZ1bmN0aW9uKCkgewotCWlmICghdGhpcy5zdXBwb3J0UmljaFRleHRFZGl0aW5nKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9CQotCQotCWNvbnRlbnRXaW5kb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmVkaXRvcklkKS5jb250ZW50V2luZG93OwotCXRoaXMuZWRpdG9yRG9jID0gY29udGVudFdpbmRvdy5kb2N1bWVudDsKLQkKLQl2YXIgdGVtcFNlbFJhbmdlOwotCXZhciBzZWxPZmZzZXRTdGFydCA9IDA7Ci0JdmFyIHNlbGVjdGVkVGV4dCA9ICIiOwotCXZhciBmb250TmFtZSA9ICIiOwotCXZhciBmb250U2l6ZSA9ICIiOwotCXZhciBibG9ja1N0eWxlID0gIiI7Ci0JdmFyIHRleHRGbGFncyA9IDA7Ci0JCi0JCi0JaWYgKGRvY3VtZW50LmFsbCkgewotCQl0aGlzLnNlbGVjdGlvbiA9IHRoaXMuZWRpdG9yRG9jLnNlbGVjdGlvbjsKLQkJaWYgKHRoaXMuc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCXRoaXMuc2VsZWN0aW9uUmFuZ2UgPSB0aGlzLnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOwotCQkJaWYgKHRoaXMuc2VsZWN0aW9uUmFuZ2UgIT0gbnVsbCAmJiB0aGlzLnNlbGVjdGlvbi50eXBlICE9ICJDb250cm9sIikgewotCQkJCXRlbXBTZWxSYW5nZSA9IHRoaXMuc2VsZWN0aW9uUmFuZ2UuZHVwbGljYXRlKCk7Ci0JCQl9Ci0JCQl0aGlzLnJlZm9ybWF0RWxlbWVudExpbmtzKCk7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCXRoaXMuc2VsZWN0aW9uID0gY29udGVudFdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHRoaXMuc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCXRoaXMuc2VsZWN0aW9uUmFuZ2UgPSB0aGlzLnNlbGVjdGlvbi5nZXRSYW5nZUF0KHRoaXMuc2VsZWN0aW9uLnJhbmdlQ291bnQgLSAxKS5jbG9uZVJhbmdlKCk7Ci0JCQl0ZW1wU2VsUmFuZ2UgPSB0aGlzLnNlbGVjdGlvblJhbmdlLmNsb25lUmFuZ2UoKTsKLQkJfQotCX0KLQlpZiAodGVtcFNlbFJhbmdlICE9IG51bGwpIHsKLQkJdHJ5IHsKLQkJCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCQlpZiAodGhpcy5zZWxlY3Rpb25SYW5nZS50ZXh0KSB7Ci0JCQkJCXNlbGVjdGVkVGV4dCA9IHRoaXMuc2VsZWN0aW9uUmFuZ2UudGV4dDsKLQkJCQl9Ci0JCQkJLyogZm9yIGdldHRpbmcgdGhpcy5zZWxlY3Rpb24gb2Zmc2V0IC0gY29tbWVudGVkIGJlY2F1c2Ugd2UgY2FuJ3Qgc2VsZWN0IHRoZQotCQkJCSAqIHByb3BlciBsb2NhdGlvbiBpbiB0aGUgSFRNTCBzb3VyY2UgdGFiIGJlY2F1c2UgSlRpZHkncyByZWZvcm1hdHRpbmcgb2YgdGhlIEhUTUwKLQkJCQl2YXIgaHRtbCA9IHRoaXMuZ2V0SFRNTCgpOwotCSAgICAgICAgICAgIHZhciB0ZW1wU2VsTGVuID0gdGVtcFNlbFJhbmdlLmh0bWxUZXh0Lmxlbmd0aDsJCQkKLQkgICAgICAgICAgICB0ZW1wU2VsUmFuZ2UubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCAtaHRtbC5sZW5ndGgpOwotCSAgICAgICAgICAgIHNlbE9mZnNldFN0YXJ0ID0gdGVtcFNlbFJhbmdlLmh0bWxUZXh0Lmxlbmd0aCAtIHRlbXBTZWxMZW47Ci0JICAgICAgICAgICAgKi8KLQkJCQl2YXIgc2VsUGFyZW50ID0gdGVtcFNlbFJhbmdlLnBhcmVudEVsZW1lbnQoKTsKLQkJCQlmb250TmFtZSA9IHRlbXBTZWxSYW5nZS5xdWVyeUNvbW1hbmRWYWx1ZSgnZm9udE5hbWUnKTsKLQkJCQlmb250U2l6ZSA9IHRlbXBTZWxSYW5nZS5xdWVyeUNvbW1hbmRWYWx1ZSgnZm9udFNpemUnKTsKLQkJCQlibG9ja1N0eWxlID0gdGVtcFNlbFJhbmdlLnF1ZXJ5Q29tbWFuZFZhbHVlKCdmb3JtYXRCbG9jaycpOwotCQkJCWlmIChibG9ja1N0eWxlID09ICJOb3JtYWwiKSB7Ci0JCQkJCWlmIChzZWxQYXJlbnQuY2xhc3NOYW1lID09ICJxdW90ZSIpIHsKLQkJCQkJCWJsb2NrU3R5bGUgPSAiPHF1b3RlPiI7Ci0JCQkJCX0gZWxzZSBpZiAoc2VsUGFyZW50LmNsYXNzTmFtZSA9PSAiY29kZVNhbXBsZSIpIHsKLQkJCQkJCWJsb2NrU3R5bGUgPSAiPGNvZGU+IjsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWJsb2NrU3R5bGUgPSAiPHA+IjsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoYmxvY2tTdHlsZSA9PSAiSGVhZGluZyAzIikgewotCQkJCQlibG9ja1N0eWxlID0gIjxoMz4iOwotCQkJCX0gZWxzZSBpZiAoYmxvY2tTdHlsZSA9PSAiSGVhZGluZyA0IikgewotCQkJCQlibG9ja1N0eWxlID0gIjxoND4iOwotCQkJCX0gZWxzZSBpZiAoYmxvY2tTdHlsZSA9PSAiSGVhZGluZyA1IikgewotCQkJCQlibG9ja1N0eWxlID0gIjxoNT4iOwotCQkJCX0gZWxzZSBpZiAoYmxvY2tTdHlsZSA9PSAiIiB8fCBibG9ja1N0eWxlID09IG51bGwpIHsKLQkJCQkJYmxvY2tTdHlsZSA9ICI8cD4iOwotCQkJCX0KLQkJCQlpZiAodGVtcFNlbFJhbmdlLnF1ZXJ5Q29tbWFuZFZhbHVlKCdib2xkJykgPT0gdHJ1ZSkgewotCQkJCQl0ZXh0RmxhZ3MgfD0gdGhpcy5TVFlMRV9CT0xEOwotCQkJCX0KLQkJCQlpZiAodGVtcFNlbFJhbmdlLnF1ZXJ5Q29tbWFuZFZhbHVlKCdpdGFsaWMnKSA9PSB0cnVlKSB7Ci0JCQkJCXRleHRGbGFncyB8PSB0aGlzLlNUWUxFX0lUQUxJQzsKLQkJCQl9Ci0JCQkJaWYgKHRlbXBTZWxSYW5nZS5xdWVyeUNvbW1hbmRWYWx1ZSgndW5kZXJsaW5lJykgPT0gdHJ1ZSkgewotCQkJCQl0ZXh0RmxhZ3MgfD0gdGhpcy5TVFlMRV9VTkRFUkxJTkU7Ci0JCQkJfQotCQkJCWlmICh0ZW1wU2VsUmFuZ2UucXVlcnlDb21tYW5kVmFsdWUoJ3N1YnNjcmlwdCcpID09IHRydWUpIHsKLQkJCQkJdGV4dEZsYWdzIHw9IHRoaXMuU1RZTEVfU1VCU0NSSVBUOwotCQkJCX0KLQkJCQlpZiAodGVtcFNlbFJhbmdlLnF1ZXJ5Q29tbWFuZFZhbHVlKCdzdXBlcnNjcmlwdCcpID09IHRydWUpIHsKLQkJCQkJdGV4dEZsYWdzIHw9IHRoaXMuU1RZTEVfU1VQRVJTQ1JJUFQ7Ci0JCQkJfQotCQkJCXRoaXMuc2V0U3RhdHVzKHRoaXMuU1RBVFVTX1NFTEVDVF9URVhULCAvKiBzZWxPZmZzZXRTdGFydCArICIkIiArICovCi0JCQkJCQlmb250TmFtZSArICIkIiArIGZvbnRTaXplICsgIiQiICsgYmxvY2tTdHlsZSArICIkIiArIHRleHRGbGFncyArICIkIiArIHNlbGVjdGVkVGV4dCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh0aGlzLnNlbGVjdGlvblJhbmdlICE9IG51bGwpIHsKLQkJCQkJc2VsZWN0ZWRUZXh0ID0gdGhpcy5zZWxlY3Rpb25SYW5nZS50b1N0cmluZygpOwotCQkJCX0KLQkJCQl2YXIgc2VsUGFyZW50ID0gdGhpcy5zZWxlY3Rpb24uZm9jdXNOb2RlOwotCQkJCWZvbnROYW1lID0gdGhpcy5lZGl0b3JEb2MucXVlcnlDb21tYW5kVmFsdWUoJ2ZvbnROYW1lJyk7Ci0JCQkJaWYgKGZvbnROYW1lID09ICIiKSB7Ci0JCQkJCWZvbnROYW1lID0gImRlZmF1bHQiOwotCQkJCX0KLQkJCQlmb250U2l6ZSA9IHRoaXMuZWRpdG9yRG9jLnF1ZXJ5Q29tbWFuZFZhbHVlKCdmb250U2l6ZScpOwotCQkJCWlmIChmb250U2l6ZSA9PSAiIikgewotCQkJCQlmb250U2l6ZSA9ICJkZWZhdWx0IjsKLQkJCQl9Ci0JCQkJYmxvY2tTdHlsZSA9IHRoaXMuZWRpdG9yRG9jLnF1ZXJ5Q29tbWFuZFZhbHVlKCdmb3JtYXRCbG9jaycpOwotCQkJCWlmIChibG9ja1N0eWxlID09ICJwIikgewotCQkJCQlpZiAoc2VsUGFyZW50LnBhcmVudE5vZGUuY2xhc3NOYW1lID09ICJxdW90ZSIpIHsKLQkJCQkJCWJsb2NrU3R5bGUgPSAiPHF1b3RlPiI7Ci0JCQkJCX0gZWxzZSBpZiAoc2VsUGFyZW50LnBhcmVudE5vZGUuY2xhc3NOYW1lID09ICJjb2RlU2FtcGxlIikgewotCQkJCQkJYmxvY2tTdHlsZSA9ICI8Y29kZT4iOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYmxvY2tTdHlsZSA9ICI8cD4iOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChibG9ja1N0eWxlID09ICJoMyIpIHsKLQkJCQkJYmxvY2tTdHlsZSA9ICI8aDM+IjsKLQkJCQl9IGVsc2UgaWYgKGJsb2NrU3R5bGUgPT0gImg0IikgewotCQkJCQlibG9ja1N0eWxlID0gIjxoND4iOwotCQkJCX0gZWxzZSBpZiAoYmxvY2tTdHlsZSA9PSAiaDUiKSB7Ci0JCQkJCWJsb2NrU3R5bGUgPSAiPGg1PiI7Ci0JCQkJfSBlbHNlIGlmIChibG9ja1N0eWxlID09ICIiKSB7Ci0JCQkJCWJsb2NrU3R5bGUgPSAiPHA+IjsKLQkJCQl9Ci0JCQkJaWYgKHRoaXMuZWRpdG9yRG9jLnF1ZXJ5Q29tbWFuZFN0YXRlKCdib2xkJykgPT0gdHJ1ZSkgewotCQkJCQl0ZXh0RmxhZ3MgfD0gdGhpcy5TVFlMRV9CT0xEOwotCQkJCX0KLQkJCQlpZiAodGhpcy5lZGl0b3JEb2MucXVlcnlDb21tYW5kU3RhdGUoJ2l0YWxpYycpID09IHRydWUpIHsKLQkJCQkJdGV4dEZsYWdzIHw9IHRoaXMuU1RZTEVfSVRBTElDOwotCQkJCX0KLQkJCQlpZiAodGhpcy5lZGl0b3JEb2MucXVlcnlDb21tYW5kU3RhdGUoJ3VuZGVybGluZScpID09IHRydWUpIHsKLQkJCQkJdGV4dEZsYWdzIHw9IHRoaXMuU1RZTEVfVU5ERVJMSU5FOwotCQkJCX0KLQkJCQlpZiAodGhpcy5lZGl0b3JEb2MucXVlcnlDb21tYW5kU3RhdGUoJ3N1YnNjcmlwdCcpID09IHRydWUpIHsKLQkJCQkJdGV4dEZsYWdzIHw9IHRoaXMuU1RZTEVfU1VCU0NSSVBUOwotCQkJCX0KLQkJCQlpZiAodGhpcy5lZGl0b3JEb2MucXVlcnlDb21tYW5kU3RhdGUoJ3N1cGVyc2NyaXB0JykgPT0gdHJ1ZSkgewotCQkJCQl0ZXh0RmxhZ3MgfD0gdGhpcy5TVFlMRV9TVVBFUlNDUklQVDsKLQkJCQl9Ci0JCQkJdGhpcy5zZXRTdGF0dXModGhpcy5TVEFUVVNfU0VMRUNUX1RFWFQsIC8qIHNlbE9mZnNldFN0YXJ0ICsgIiQiICsgKi8KLQkJCQkJCWZvbnROYW1lICsgIiQiICsgZm9udFNpemUgKyAiJCIgKyBibG9ja1N0eWxlICsgIiQiICsgdGV4dEZsYWdzICsgIiQiICsgc2VsZWN0ZWRUZXh0KTsKLQkJCX0KLQkJfSBjYXRjaCAoZSkge30KLQl9CQotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFNldHMgZm9jdXMgdG8gdGhpcyBlZGl0b3IuCi1SVEUucHJvdG90eXBlLnNldEZvY3VzID0gZnVuY3Rpb24oKSB7Ci0JaWYgKCF0aGlzLnN1cHBvcnRSaWNoVGV4dEVkaXRpbmcpIHsKLQkJcmV0dXJuOwotCX0JCi0JY29udGVudFdpbmRvdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3c7Ci0JY29udGVudFdpbmRvdy5mb2N1cygpOwotCXRoaXMuc2V0U3RhdHVzKHRoaXMuU1RBVFVTX0VYRUNfQ01ELCAxKTsJCi19Ci0KLS8vIFJlZm9ybWF0cyBlbGVtZW50IGxpbmtzIGNyZWF0ZWQgdmlhIGRyYWcgJiBkcm9wLgotUlRFLnByb3RvdHlwZS5yZWZvcm1hdEVsZW1lbnRMaW5rcyA9IGZ1bmN0aW9uKCkgewotCXZhciBsaW5rc1JlZm9ybWF0dGVkID0gMDsKLQl2YXIgZWxlbWVudHMgPSB0aGlzLmVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnQScpOwotCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJaWYgKGVsZW1lbnQuY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2VsZW1lbnRsaW5rJyB8fAotCQkJCWVsZW1lbnQuY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2VsZW1lbnRsaW5rd2l0aHR5cGUnIHx8Ci0JCQkJZWxlbWVudC5jbGFzc05hbWUudG9Mb3dlckNhc2UoKSA9PSAnZWxlbWVudGxpbmt3aXRodXNlcnRleHQnKSB7Ci0gCQkJaWYgKGVsZW1lbnQuZmlyc3RDaGlsZCAhPSBudWxsICYmIGVsZW1lbnQuZmlyc3RDaGlsZC5maXJzdENoaWxkICE9IG51bGwgJiYKLSAJCQkJZWxlbWVudC5maXJzdENoaWxkLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZCAhPSBudWxsKSB7Ci0gCQkJCXZhciBsaW5rVGV4dCA9IGVsZW1lbnQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQubm9kZVZhbHVlOwotIAkJCQllbGVtZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQuZmlyc3RDaGlsZCk7Ci0gCQkJCWVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5lZGl0b3JEb2MuY3JlYXRlVGV4dE5vZGUobGlua1RleHQpKTsKLSAJCQkJbGlua3NSZWZvcm1hdHRlZCsrOwotIAkJCX0KLQkJfQotCX0KLQlpZiAobGlua3NSZWZvcm1hdHRlZCA+IDApIHsKLQkJdGhpcy5zZXRTdGF0dXModGhpcy5TVEFUVVNfUkVGT1JNQVRfTElOS1MsIG51bGwpOwotCX0KLX0KLQotLy8gRm9ybWF0cyB0aGUgc2VsZWN0ZWQgdGV4dC4KLVJURS5wcm90b3R5cGUuZm9ybWF0VGV4dCA9IGZ1bmN0aW9uKGNvbW1hbmQsIG9wdGlvbikgewotCWlmICghdGhpcy5yZWFkT25seSAmJiB0aGlzLmludGVybmFsVXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJaWYgKHRoaXMuZWRpdG9yRG9jLmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCBvcHRpb24pKSB7Ci0JCQl0aGlzLnNldFN0YXR1cyh0aGlzLlNUQVRVU19FWEVDX0NNRCwgMSk7CQkKLQkJCXRoaXMuc2V0U3RhdHVzKHRoaXMuU1RBVFVTX01PRElGSUVELCBudWxsKTsKLQkJfQotCX0KLX0KLQotLy8gQWRkcyBIVE1MLgotUlRFLnByb3RvdHlwZS5hZGRIVE1MID0gZnVuY3Rpb24oaHRtbCkgewotCWlmICghdGhpcy5yZWFkT25seSAmJiBodG1sICE9ICIiKSAgewotCQlodG1sID0gdGhpcy5kZWNvZGVTdHJpbmcoaHRtbCk7Ci0JCWlmICh0aGlzLmludGVybmFsVXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCQlpZiAodGhpcy5zZWxlY3Rpb25SYW5nZS50ZXh0ICE9IG51bGwpIHsKLQkJCQkJdGhpcy5zZWxlY3Rpb25SYW5nZS5wYXN0ZUhUTUwoaHRtbCk7Ci0JCQkJCXRoaXMuc2V0U3RhdHVzKHRoaXMuU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJCQkJdGhpcy5zZXRTdGF0dXModGhpcy5TVEFUVVNfTU9ESUZJRUQsIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMuc2VsZWN0aW9uUmFuZ2UuZGVsZXRlQ29udGVudHMoKTsKLQkJCQl2YXIgZG9jdW1lbnRGcmFnbWVudCA9IHRoaXMuc2VsZWN0aW9uUmFuZ2UuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGh0bWwpOwotCQkJCXRoaXMuc2VsZWN0aW9uUmFuZ2UuaW5zZXJ0Tm9kZShkb2N1bWVudEZyYWdtZW50KTsKLQkJCQl0aGlzLnNldFN0YXR1cyh0aGlzLlNUQVRVU19FWEVDX0NNRCwgMSk7Ci0JCQkJdGhpcy5zZXRTdGF0dXModGhpcy5TVEFUVVNfTU9ESUZJRUQsIG51bGwpOwotCQkJfQotCQl9Ci0JfQotfQotCi0vLyBBZGRzIGFuIGltYWdlLgotUlRFLnByb3RvdHlwZS5hZGRJbWFnZSA9IGZ1bmN0aW9uKHVybCwgaGVpZ2h0LCB3aWR0aCwgYWx0KSB7Ci0JaWYgKHRoaXMuaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSkgewotCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQlpZiAodXJsICE9IG51bGwgJiYgdXJsICE9ICcnKSB7Ci0JCQkJdGhpcy5mb3JtYXRUZXh0KCdpbnNlcnRpbWFnZScsIHVybCk7Ci0JCQl9Ci0JCQlpZiAodGhpcy5zZWxlY3Rpb24gIT0gbnVsbCAmJiB0aGlzLnNlbGVjdGlvbi50eXBlID09ICdDb250cm9sJyAmJiB0aGlzLnNlbGVjdGlvblJhbmdlICE9IG51bGwpIHsKLQkJCQlpZiAoaGVpZ2h0ICE9IG51bGwgJiYgaGVpZ2h0ICE9ICcnKSB0aGlzLnNlbGVjdGlvblJhbmdlLml0ZW0oKS5oZWlnaHQgPSBoZWlnaHQ7Ci0JCQkJaWYgKHdpZHRoICE9IG51bGwgJiYgd2lkdGggIT0gJycpIHRoaXMuc2VsZWN0aW9uUmFuZ2UuaXRlbSgpLndpZHRoID0gd2lkdGg7Ci0JCQkJaWYgKGFsdCAhPSBudWxsKSB0aGlzLnNlbGVjdGlvblJhbmdlLml0ZW0oKS5hbHQgPSBhbHQ7CQkKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXZhciBTVEFSVF9NQVJLRVIgPSAiQV8tXy1fIjsKLQkJCXZhciBFTkRfTUFSS0VSID0gIjouOi46IjsKLQkJCQkvLyBtYXJrIGltZyBsaW5rcyB3aXRoIFNUQVJUX01BUktFUiArIGlkICsgRU5EX01BUktFUiBpbiB0aGUgaWQsIGZvciBsYXRlciByZWNvdmVyeQotCQkJdmFyIGVsZW1lbnRzID0gdGhpcy5lZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpOwotCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQkJZWxlbWVudC5pZCA9IFNUQVJUX01BUktFUiArIGVsZW1lbnQuaWQgKyBFTkRfTUFSS0VSOwotCQkJfQotCQkJaWYgKHVybCAhPSBudWxsICYmIHVybCAhPSAnJykgewotCQkJCXRoaXMuZm9ybWF0VGV4dCgnaW5zZXJ0aW1hZ2UnLCB1cmwpOwotCQkJfQotCQkJaWYgKHRoaXMuaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSkgewotCQkJCXZhciByZWdFeElEID0gbmV3IFJlZ0V4cChTVEFSVF9NQVJLRVIgKyAiKC4qPykiICsgRU5EX01BUktFUik7Ci0JCQkJdmFyIGVsZW1lbnRzID0gdGhpcy5lZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpOwotCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCQkJdmFyIGlkID0gZWxlbWVudC5pZDsKLQkJCQkJaWYgKGlkICE9IG51bGwgJiYgaWQgIT0gJycpIHsKLQkJCQkJCVJlZ0V4cC5sYXN0SW5kZXg9MDsKLQkJCQkJCXZhciBtYXRjaEFycmF5ID0gaWQubWF0Y2gocmVnRXhJRCk7Ci0JCQkJCQlpZiAobWF0Y2hBcnJheSAhPSBudWxsICYmIG1hdGNoQXJyYXkubGVuZ3RoID4gMCkgewotCQkJCQkJCXZhciBuZXdJZCA9IG1hdGNoQXJyYXlbMV07Ci0JCQkJCQkJaWYgKG5ld0lkLmxlbmd0aCA+IDApIHsKLQkJCQkJCQkJZWxlbWVudC5pZCA9IG5ld0lkOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdpZCcpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIG5vIGlkLCBtdXN0IGJlIHRoZSBuZXcgaW1nCi0JCQkJCQlpZiAoaGVpZ2h0ICE9IG51bGwgJiYgaGVpZ2h0ICE9ICcnKSBlbGVtZW50LmhlaWdodCA9IGhlaWdodDsKLQkJCQkJCWlmICh3aWR0aCAhPSBudWxsICYmIHdpZHRoICE9ICcnKSBlbGVtZW50LndpZHRoID0gd2lkdGg7Ci0JCQkJCQlpZiAoYWx0ICE9IG51bGwpIGVsZW1lbnQuYWx0ID0gYWx0OwkJCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdGhpcy5zZXRTdGF0dXModGhpcy5TVEFUVVNfTU9ESUZJRUQsIG51bGwpOwotCX0KLX0KLQotLy8gQWRkcyBhIGhvcml6b250YWwgbGluZS4KLVJURS5wcm90b3R5cGUuYWRkTGluZSA9IGZ1bmN0aW9uKCkgewotCXRoaXMuZm9ybWF0VGV4dCgnaW5zZXJ0aG9yaXpvbnRhbHJ1bGUnLCBudWxsKTsKLX0KLQotLy8gQWRkcyBhIGxpbmsuCi1SVEUucHJvdG90eXBlLmFkZExpbmsgPSBmdW5jdGlvbih1cmwpIHsKLQlpZiAoIXRoaXMucmVhZE9ubHkgJiYgdXJsICE9IG51bGwgJiYgdXJsICE9ICcnICYmIHRoaXMuaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSkgewotCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQlpZiAodGhpcy5zZWxlY3Rpb25SYW5nZS50ZXh0ID09IG51bGwgfHwgdGhpcy5zZWxlY3Rpb25SYW5nZS50ZXh0ID09ICcnKSB7Ci0JCQkJdGhpcy5zZWxlY3Rpb25SYW5nZS50ZXh0ID0gdXJsOwotCQkJCXRoaXMuc2V0U3RhdHVzKHRoaXMuU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJCQl0aGlzLnNldFN0YXR1cyh0aGlzLlNUQVRVU19NT0RJRklFRCwgbnVsbCk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0aGlzLnNlbGVjdGlvblJhbmdlLmV4ZWNDb21tYW5kKCdjcmVhdGVsaW5rJywgZmFsc2UsIHVybCkpIHsKLQkJCQl0aGlzLnNldFN0YXR1cyh0aGlzLlNUQVRVU19FWEVDX0NNRCwgMSk7Ci0JCQkJdGhpcy5zZXRTdGF0dXModGhpcy5TVEFUVVNfTU9ESUZJRUQsIG51bGwpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHRoaXMuc2VsZWN0aW9uID09IG51bGwgfHwgdGhpcy5zZWxlY3Rpb24gPT0gIiIpIHsJCQotCQkJCXZhciB1cmxUZXh0Tm9kZSA9IHRoaXMuZWRpdG9yRG9jLmNyZWF0ZVRleHROb2RlKHVybCk7Ci0JCQkJaW5zZXJ0Tm9kZUF0U2VsZWN0aW9uKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVkaXRvckZyYW1lSWQpLmNvbnRlbnRXaW5kb3csIHVybFRleHROb2RlKTsKLQkJCX0JCQkKLQkJCWlmICh0aGlzLmVkaXRvckRvYy5leGVjQ29tbWFuZCgnY3JlYXRlbGluaycsIGZhbHNlLCB1cmwpKSB7Ci0JCQkJdGhpcy5zZXRTdGF0dXModGhpcy5TVEFUVVNfRVhFQ19DTUQsIDEpOwotCQkJCXRoaXMuc2V0U3RhdHVzKHRoaXMuU1RBVFVTX01PRElGSUVELCBudWxsKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLy8gQWRkcyBhbiBvcmRlcmVkIGxpc3QuCi1SVEUucHJvdG90eXBlLmFkZE9yZGVyZWRMaXN0ID0gZnVuY3Rpb24oKSB7Ci0JdGhpcy5mb3JtYXRUZXh0KCdpbnNlcnRvcmRlcmVkbGlzdCcsIG51bGwpOwotfQotCi0vLyBBZGRzIGEgdGFibGUuCi1SVEUucHJvdG90eXBlLmFkZFRhYmxlID0gZnVuY3Rpb24ocm93cywgY29scywgd2lkdGgsIHN1bW1hcnksIGNhcHRpb24sIHRhYmxlaGVhZGVycykgewotCWlmICh0aGlzLnJlYWRPbmx5KSByZXR1cm47Ci0JaWYgKHJvd3MgPT0gMCkgcm93cyA9IDI7Ci0JaWYgKGNvbHMgPT0gMCkgY29scyA9IDI7Ci0JaWYgKHdpZHRoID09IDApIHdpZHRoID0gIjg1JSI7Ci0JaWYgKHRoaXMuaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSkgewotCQl2YXIgdGFibGUgPSB0aGlzLmVkaXRvckRvYy5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpOwotCQl0YWJsZS5jZWxsUGFkZGluZyA9ICIyIjsKLQkJdGFibGUuY2VsbFNwYWNpbmcgPSAiMCI7Ci0JCXRhYmxlLmJvcmRlciA9ICIxIjsKLQkJdGFibGUud2lkdGggPSB3aWR0aDsKLQkJdGFibGUudGl0bGUgPSAiIjsKLQkJaWYgKHN1bW1hcnkgIT0gbnVsbCAmJiBzdW1tYXJ5ICE9ICcnKSB7Ci0JCQl0YWJsZS5zdW1tYXJ5ID0gc3VtbWFyeTsKLQkJfQotCQlpZiAoY2FwdGlvbiAhPSBudWxsICYmIGNhcHRpb24gIT0gJycpIHsKLQkJCXRhYmxlLnRpdGxlID0gY2FwdGlvbjsKLQkJCXRhYmxlLmNyZWF0ZUNhcHRpb24oKTsKLQkJCXZhciBjYXB0aW9uTm9kZSA9IHRoaXMuZWRpdG9yRG9jLmNyZWF0ZVRleHROb2RlKGNhcHRpb24pOwotCQkJdGFibGUuY2FwdGlvbi5hcHBlbmRDaGlsZChjYXB0aW9uTm9kZSk7Ci0JCX0KLQkJdGJvZHkgPSB0aGlzLmVkaXRvckRvYy5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpOwotCQlmb3IgKHZhciBpID0gMDsgaSA8IHJvd3M7IGkrKykgewotCQkJdHIgPSB0aGlzLmVkaXRvckRvYy5jcmVhdGVFbGVtZW50KCJ0ciIpOwotCQkJZm9yICh2YXIgaiA9IDA7IGogPCBjb2xzOyBqKyspIHsKLQkJCQlpZiAoaSA9PSAwICYmICh0YWJsZWhlYWRlcnMgPT0gdGhpcy5UQUJMRV9IRUFERVJTX0NPTFMgfHwgdGFibGVoZWFkZXJzID09IHRoaXMuVEFCTEVfSEVBREVSU19CT1RIKSkgewotCQkJCQl0aCA9IHRoaXMuZWRpdG9yRG9jLmNyZWF0ZUVsZW1lbnQoInRoIik7Ci0JCQkJCXRoLnNjb3BlID0gImNvbCI7Ci0JCQkJCXRoLmlkID0gIiI7Ci0JCQkJCXRoLmFiYnIgPSB0aC5pZDsKLQkJCQkJdmFyIGhlYWRlck5vZGUgPSB0aGlzLmVkaXRvckRvYy5jcmVhdGVUZXh0Tm9kZSh0aC5pZCk7Ci0JCQkJCXRoLmFwcGVuZENoaWxkKGhlYWRlck5vZGUpOwotCQkJCQlpZiAoIWRvY3VtZW50LmFsbCkgewotCQkJCQkJYnIgPSB0aGlzLmVkaXRvckRvYy5jcmVhdGVFbGVtZW50KCJiciIpOwotCQkJCQkJdGguYXBwZW5kQ2hpbGQoYnIpOwotCQkJCQl9Ci0JCQkJCXRyLmFwcGVuZENoaWxkKHRoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoaiA9PSAwICYmICh0YWJsZWhlYWRlcnMgPT0gdGhpcy5UQUJMRV9IRUFERVJTX1JPV1MgfHwgdGFibGVoZWFkZXJzID09IHRoaXMuVEFCTEVfSEVBREVSU19CT1RIKSkgewotCQkJCQl0aCA9IHRoaXMuZWRpdG9yRG9jLmNyZWF0ZUVsZW1lbnQoInRoIik7Ci0JCQkJCXRoLnNjb3BlID0gInJvdyI7Ci0JCQkJCXRoLmlkID0gIiI7Ci0JCQkJCXRoLmFiYnIgPSB0aC5pZDsKLQkJCQkJdmFyIGhlYWRlck5vZGUgPSB0aGlzLmVkaXRvckRvYy5jcmVhdGVUZXh0Tm9kZSh0aC5pZCk7Ci0JCQkJCXRoLmFwcGVuZENoaWxkKGhlYWRlck5vZGUpOwotCQkJCQlpZiAoIWRvY3VtZW50LmFsbCkgewotCQkJCQkJYnIgPSB0aGlzLmVkaXRvckRvYy5jcmVhdGVFbGVtZW50KCJiciIpOwotCQkJCQkJdGguYXBwZW5kQ2hpbGQoYnIpOwotCQkJCQl9Ci0JCQkJCXRyLmFwcGVuZENoaWxkKHRoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXRkID0gdGhpcy5lZGl0b3JEb2MuY3JlYXRlRWxlbWVudCgidGQiKTsKLQkJCQkJaWYgKCFkb2N1bWVudC5hbGwpIHsKLQkJCQkJCWJyID0gdGhpcy5lZGl0b3JEb2MuY3JlYXRlRWxlbWVudCgiYnIiKTsKLQkJCQkJCXRkLmFwcGVuZENoaWxkKGJyKTsKLQkJCQkJfQotCQkJCQl0ci5hcHBlbmRDaGlsZCh0ZCk7Ci0JCQkJfQotCQkJfQotCQkJdGJvZHkuYXBwZW5kQ2hpbGQodHIpOwotICAgIAl9Ci0JCXRhYmxlLmFwcGVuZENoaWxkKHRib2R5KTsKLQkJaWYgKGRvY3VtZW50LmFsbCkgewotCQkJdGhpcy5zZWxlY3Rpb25SYW5nZS5wYXJlbnRFbGVtZW50KCkuYXBwZW5kQ2hpbGQodGFibGUpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5zZWxlY3Rpb25SYW5nZS5pbnNlcnROb2RlKHRhYmxlKTsKLQkJfQotCQl0aGlzLnNldFN0YXR1cyh0aGlzLlNUQVRVU19FWEVDX0NNRCwgMSk7Ci0JCXRoaXMuc2V0U3RhdHVzKHRoaXMuU1RBVFVTX01PRElGSUVELCBudWxsKTsJCQkKLQl9Ci19Ci0KLS8vIEFkZHMgYW4gdW5vcmRlcmVkIGxpc3QuCi1SVEUucHJvdG90eXBlLmFkZFVub3JkZXJlZExpc3QgPSBmdW5jdGlvbigpIHsKLQl0aGlzLmZvcm1hdFRleHQoJ2luc2VydHVub3JkZXJlZGxpc3QnLCBudWxsKTsKLX0KLQotLy8gU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLVJURS5wcm90b3R5cGUuYmFja0NvbG9yID0gZnVuY3Rpb24oY29sb3IpIHsKLQlpZiAoY29sb3IgIT0gbnVsbCAmJiBjb2xvciAhPSAnJykgewotCQl0aGlzLmZvcm1hdFRleHQoJ2JhY2tjb2xvcicsIGNvbG9yKTsKLQl9Ci19Ci0KLS8vIFRvZ2dsZXMgdGhlICdib2xkJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi1SVEUucHJvdG90eXBlLmJvbGQgPSBmdW5jdGlvbigpIHsKLQl0aGlzLmZvcm1hdFRleHQoJ2JvbGQnLCBudWxsKTsKLX0KLQotLy8gQ29waWVzIHRoZSBzZWxlY3RlZCB0ZXh0IHRvIHRoZSBjbGlwYm9hcmQuCi1SVEUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbigpIHsKLQlpZiAodGhpcy5pbnRlcm5hbFVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCWlmICh0aGlzLmVkaXRvckRvYy5leGVjQ29tbWFuZCgnY29weScsIGZhbHNlLCBudWxsKSkgewotCQkJdGhpcy5zZXRTdGF0dXModGhpcy5TVEFUVVNfRVhFQ19DTUQsIDEpOwotCQl9Ci0JfQotfQotCi0vLyBDdXRzIHRoZSBzZWxlY3RlZCB0ZXh0IHRvIHRoZSBjbGlwYm9hcmQuCi1SVEUucHJvdG90eXBlLmN1dCA9IGZ1bmN0aW9uKCkgewotCXRoaXMuZm9ybWF0VGV4dCgnY3V0JywgbnVsbCk7Ci19Ci0KLS8vIERlbGV0ZXMgdGhlIHNlbGVjdGVkIHRleHQuCi1SVEUucHJvdG90eXBlLmRlbGV0ZVRleHQgPSBmdW5jdGlvbigpIHsKLQl0aGlzLmZvcm1hdFRleHQoJ2RlbGV0ZScsIG51bGwpOwotfQotCi0vLyBGaW5kcyB0ZXh0LgotUlRFLnByb3RvdHlwZS5maW5kVGV4dCA9IGZ1bmN0aW9uKHRleHQsIGRpciwgb3B0aW9ucykgewotCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dCA9PSAiIikgewotCQlyZXR1cm47Ci0JfQotCWVsc2UgewotCQl0ZXh0ID0gdGhpcy5kZWNvZGVTdHJpbmcodGV4dCk7Ci0JfQotCQotCWlmICh0aGlzLmludGVybmFsVXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJaWYgKGRvY3VtZW50LmFsbCkgewotCQkJdGhpcy5zZWxlY3Rpb25SYW5nZS5jb2xsYXBzZShkaXIgPCAwKTsKLQkJCWlmICh0aGlzLnNlbGVjdGlvblJhbmdlLmZpbmRUZXh0KHRleHQsIGRpciwgb3B0aW9ucykpIHsKLQkJCQl0aGlzLnNlbGVjdGlvblJhbmdlLnNjcm9sbEludG9WaWV3KCk7Ci0JCQkJdGhpcy5zZWxlY3Rpb25SYW5nZS5zZWxlY3QoKTsKLQkJCQl0aGlzLnNlbGVjdGlvblJhbmdlLmNvbGxhcHNlKGRpciA8IDApOwotCQkJCXRoaXMuc2V0U3RhdHVzKHRoaXMuU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJCX0KLQkJfQotCQllbHNlIHsJCi0JCQkvLyBmaW5kKHRleHQsIGNhc2VTZW5zaXRpdmUsIGJhY2t3YXJkcywgd3JhcEFyb3VuZCwgd2hvbGVXb3JkLCBzZWFyY2hJbkZyYW1lcywgc2hvd0RpYWxvZykKLQkJCXZhciBjYXNlU2Vuc2l0aXZlID0gdHJ1ZTsKLQkJCXZhciBiYWNrd2FyZHMgPSBmYWxzZTsKLQkJCXZhciB3aG9sZVdvcmQgPSB0cnVlOwotCQkJaWYgKChvcHRpb25zICYgNCkgPT0gMCkgY2FzZVNlbnNpdGl2ZSA9IGZhbHNlOwotCQkJaWYgKGRpciA9PSAtMSkgYmFja3dhcmRzID0gdHJ1ZTsKLQkJCWlmICgob3B0aW9ucyAmIDIpID09IDApIHdob2xlV29yZCA9IGZhbHNlOwotCQkJaWYgKGNvbnRlbnRXaW5kb3cuZmluZCh0ZXh0LCBjYXNlU2Vuc2l0aXZlLCBiYWNrd2FyZHMsIGZhbHNlLCB3aG9sZVdvcmQsIGZhbHNlLCBmYWxzZSkpIHsKLQkJCQl0aGlzLnNldFN0YXR1cyh0aGlzLlNUQVRVU19FWEVDX0NNRCwgMSk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLS8vIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlIHNlbGVjdGVkIHRleHQuCi1SVEUucHJvdG90eXBlLmZvcmVDb2xvciA9IGZ1bmN0aW9uKGNvbG9yKSB7Ci0JaWYgKGNvbG9yICE9IG51bGwgJiYgY29sb3IgIT0gJycpIHsKLQkJdGhpcy5mb3JtYXRUZXh0KCdmb3JlY29sb3InLCBjb2xvcik7Ci0JfQotfQotCi0vLyBGb3JtYXRzIHRoZSBzZWxlY3RlZCB0ZXh0IHVzaW5nIHRoZSBnaXZlbiBIVE1MIGhlYWRpbmcgdGFnLgotUlRFLnByb3RvdHlwZS5mb3JtYXRCbG9jayA9IGZ1bmN0aW9uKHRhZykgewotCWlmICh0YWcgIT0gbnVsbCAmJiB0YWcgIT0gJycpIHsKLQkJdGhpcy5mb3JtYXRUZXh0KCdmb3JtYXRibG9jaycsIHRhZyk7Ci0JfQotfQotCi0KLVJURS5wcm90b3R5cGUuSU5ERU5URURfTElTVF9CQURfSFRNTF9JRSA9ICI8L2xpPi4qPGxpIHN0eWxlPVwibGlzdC1zdHlsZTogbm9uZVwiPiI7Ci1SVEUucHJvdG90eXBlLklOREVOVEVEX0xJU1RfQkFEX0hUTUxfTU9aID0gIjwvbGk+Lio8bGkgc3R5bGU9XCJsaXN0LXN0eWxlLXR5cGU6IG5vbmU7IGxpc3Qtc3R5bGUtaW1hZ2U6IG5vbmU7IGxpc3Qtc3R5bGUtcG9zaXRpb246IG91dHNpZGU7XCI+IjsKLQotLy8gSW5kZW50cyB0aGUgc2VsZWN0ZWQgdGV4dC4KLVJURS5wcm90b3R5cGUuaW5kZW50ID0gZnVuY3Rpb24oKSB7Ci0JdGhpcy5mb3JtYXRUZXh0KCdpbmRlbnQnLCBudWxsKTsKLQkvLyBmaXggZm9yIHN1Yi1saXN0cwotCXZhciBodG1sID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5lZGl0b3JJZCkuY29udGVudFdpbmRvdy5kb2N1bWVudC5ib2R5LmlubmVySFRNTDsKLQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCWh0bWwgPSBodG1sLnJlcGxhY2UodGhpcy5JTkRFTlRFRF9MSVNUX0JBRF9IVE1MX0lFLCAiIik7Ci0JfSBlbHNlIHsKLQkJLy8gZmlyZWZveCBzb21ldGltZXMgcHV0cyB0aGUgc2FtZSBhcyBJRSwgc29tZXRpbWVzIG1vcmUganVuawotCQlodG1sID0gaHRtbC5yZXBsYWNlKHRoaXMuSU5ERU5URURfTElTVF9CQURfSFRNTF9JRSwgIiIpOwotCQlodG1sID0gaHRtbC5yZXBsYWNlKHRoaXMuSU5ERU5URURfTElTVF9CQURfSFRNTF9NT1osICIiKTsKLQl9Ci0JdGhpcy5zZXRUZXh0KGh0bWwpOwotfQotCi0vLyBUb2dnbGVzIHRoZSAnaXRhbGljJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi1SVEUucHJvdG90eXBlLml0YWxpYyA9IGZ1bmN0aW9uKCkgewotCXRoaXMuZm9ybWF0VGV4dCgnaXRhbGljJywgbnVsbCk7Ci19Ci0KLS8vIENlbnRlciBqdXN0aWZpZXMgdGhlIHNlbGVjdGVkIHRleHQuCi1SVEUucHJvdG90eXBlLmp1c3RpZnlDZW50ZXIgPSBmdW5jdGlvbigpIHsKLQl0aGlzLmZvcm1hdFRleHQoJ2p1c3RpZnljZW50ZXInLCBudWxsKTsKLX0KLQotLy8gRnVsbHkganVzdGlmaWVzIHRoZSBzZWxlY3RlZCB0ZXh0LgotUlRFLnByb3RvdHlwZS5qdXN0aWZ5RnVsbCA9IGZ1bmN0aW9uKCkgewotCXRoaXMuZm9ybWF0VGV4dCgnanVzdGlmeWZ1bGwnLCBudWxsKTsKLX0KLQotLy8gTGVmdCBqdXN0aWZpZXMgdGhlIHNlbGVjdGVkIHRleHQuCi1SVEUucHJvdG90eXBlLmp1c3RpZnlMZWZ0ID0gZnVuY3Rpb24oKSB7Ci0JdGhpcy5mb3JtYXRUZXh0KCdqdXN0aWZ5bGVmdCcsIG51bGwpOwotfQotCi0vLyBSaWdodCBqdXN0aWZpZXMgdGhlIHNlbGVjdGVkIHRleHQuCi1SVEUucHJvdG90eXBlLmp1c3RpZnlSaWdodCA9IGZ1bmN0aW9uKCkgewotCXRoaXMuZm9ybWF0VGV4dCgnanVzdGlmeXJpZ2h0JywgbnVsbCk7Ci19Ci0KLS8vIE91dGRlbnRzIHRoZSBzZWxlY3RlZCB0ZXh0LgotUlRFLnByb3RvdHlwZS5vdXRkZW50ID0gZnVuY3Rpb24oKSB7Ci0JdGhpcy5mb3JtYXRUZXh0KCdvdXRkZW50JywgbnVsbCk7Ci19Ci0KLS8vIFBhc3RlcyB0ZXh0IGZyb20gdGhlIGNsaXBib2FyZC4KLVJURS5wcm90b3R5cGUucGFzdGUgPSBmdW5jdGlvbihzb3VyY2VVUkwpIHsKLQlpZiAoc291cmNlVVJMID09IG51bGwpIHsKLQkJc291cmNlVVJMID0gIiI7Ci0JfQotCWVsc2UgewotCQlzb3VyY2VVUkwgPSB0aGlzLmRlY29kZVN0cmluZyhzb3VyY2VVUkwpOwotCX0KLQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCXZhciBTVEFSVF9NQVJLRVIgPSAiQV8tXy1fIjsKLQkJdmFyIEVORF9NQVJLRVIgPSAiOi46LjoiOwotCQkvLyBtYXJrIGltZyBhbmQgPGEgLz4gbGlua3Mgd2l0aCBTVEFSVF9NQVJLRVIgKyBzcmMvaHJlZiArIEVORF9NQVJLRVIgaW4gdGhlIGlkLCBmb3IgbGF0ZXIgcmVjb3ZlcnkKLQkJdmFyIGVsZW1lbnRzID0gdGhpcy5lZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpOwotCQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJdmFyIGlkID0gZWxlbWVudC5pZDsKLQkJCWVsZW1lbnQuaWQgPSBTVEFSVF9NQVJLRVIgKyBlbGVtZW50LnNyYyArIEVORF9NQVJLRVIgKyBpZDsKLQkJfQotCQl2YXIgZWxlbWVudHMgPSB0aGlzLmVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYScpOwotCQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJdmFyIGlkID0gZWxlbWVudC5pZDsKLQkJCWVsZW1lbnQuaWQgPSBTVEFSVF9NQVJLRVIgKyBlbGVtZW50LmhyZWYgKyBFTkRfTUFSS0VSICsgaWQ7Ci0JCX0KLQotCQkvLyBjaGFuZ2UgdGhlIDxiYXNlPiBvZiB0aGUgZG9jdW1lbnQKLQkJdmFyIG9sZEJhc2VIUkVGID0gdGhpcy5lZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2Jhc2UnKVswXS5ocmVmOwotCQl0aGlzLmVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYmFzZScpWzBdLmhyZWYgPSBzb3VyY2VVUkw7Ci0KLQkJdGhpcy5mb3JtYXRUZXh0KCdwYXN0ZScsIG51bGwpOwotCQkKLQkJLy8gcmVzdG9yZSA8YmFzZT4KLQkJdGhpcy5lZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2Jhc2UnKVswXS5ocmVmID0gb2xkQmFzZUhSRUY7Ci0JfQotCWVsc2UgewotCQl0aGlzLnNldFN0YXR1cyh0aGlzLlNUQVRVU19FWEVDX0NNRCwgMSk7Ci0JCXRoaXMuc2V0U3RhdHVzKHRoaXMuU1RBVFVTX01PRElGSUVELCBudWxsKTsKLQl9Ci0JaWYgKHRoaXMuaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSkgewotCQl0cnkgewotCQkJdmFyIHJlZ0V4UmVzID0gbmV3IFJlZ0V4cCgiZmlsZVw6KFtePV0rKSgvcmVzb3VyY2VzLykoLispIiwgImciKTsKLQkJCXZhciByZWdFeFJlZiA9IG5ldyBSZWdFeHAoIiguKykoIy4rKSIpOwotCQkJdmFyIHJlZ0V4ID0gbmV3IFJlZ0V4cCgiZmlsZVw6KFtePV0rKS8oW14vXSspIiwgImciKTsJCi0JCQl2YXIgcmVnRXhJRCA9IG5ldyBSZWdFeHAoU1RBUlRfTUFSS0VSICsgIiguKj8pIiArIEVORF9NQVJLRVIgKyAiKC4qPykiKTsKLQkJCXZhciBlbGVtZW50cyA9IHRoaXMuZWRpdG9yRG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKTsKLQkJCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCXZhciBpZCA9IGVsZW1lbnQuaWQ7Ci0JCQkJaWYgKGlkICE9IG51bGwgJiYgaWQgIT0gJycpIHsKLQkJCQkJUmVnRXhwLmxhc3RJbmRleD0wOwotCQkJCQl2YXIgbWF0Y2hBcnJheSA9IGlkLm1hdGNoKHJlZ0V4SUQpOwotCQkJCQlpZiAobWF0Y2hBcnJheSAhPSBudWxsICYmIG1hdGNoQXJyYXkubGVuZ3RoID4gMSkgewotCQkJCQkJZWxlbWVudC5zcmMgPSBtYXRjaEFycmF5WzFdOwotCQkJCQkJaWYgKG1hdGNoQXJyYXkubGVuZ3RoID4gMiAmJiBtYXRjaEFycmF5WzJdLmxlbmd0aCA+IDApIHsKLQkJCQkJCQllbGVtZW50LmlkID0gbWF0Y2hBcnJheVsyXTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdpZCcpOwotCQkJCQkJfQotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdmFyIHNyYyA9IGVsZW1lbnQuc3JjOwotCQkJCWlmIChzcmMgIT0gbnVsbCAmJiBzcmMgIT0gJycpIHsKLQkJCQkJaWYgKHNyYy5pbmRleE9mKCdhYm91dDouL3Jlc291cmNlcycpICE9IC0xKSB7Ci0JCQkJCQkvLyBmaXggZm9yIElFIDcgd2hlbiBwYXN0aW5nIGZyb20gYW5vdGhlciBSVEUKLQkJCQkJCS8vIElFNyByZXNvbHZlcyB0aGVzZSBhcyAiYWJvdXQ6Li9yZXNvdXJjZXMvPGZpbGU+IgotCQkJCQkJLy8gc28gcmVtb3ZlIHRoZSAiYWJvdXQ6LiIKLQkJCQkJCXNyYyA9IHNyYy5yZXBsYWNlKCJhYm91dDoiLCAiIik7Ci0JCQkJCX0KLQkJCQkJaWYgKHNyYy5pbmRleE9mKCdhYm91dDpyZXNvdXJjZXMnKSAhPSAtMSkgewotCQkJCQkJLy8gZml4IGZvciBJRSA3IHdoZW4gcGFzdGluZyBmcm9tIGFub3RoZXIgUlRFCi0JCQkJCQkvLyBJRTcgc29tZXRpbWVzIHJlc29sdmVzIHRoZXNlIGFzICJhYm91dDpyZXNvdXJjZXMvPGZpbGU+IgotCQkJCQkJLy8gc28gcmVtb3ZlIHRoZSAiYWJvdXQ6IiBhbmQgcHV0IGluICIuLyIKLQkJCQkJCXNyYyA9IHNyYy5yZXBsYWNlKCJhYm91dDoiLCAiLi8iKTsKLQkJCQkJfQotCQkJCQlpZiAoc3JjLmluZGV4T2YoJ3Jlc291cmNlcycpICE9IC0xKSB7Ci0JCQkJCQllbGVtZW50LnNyYyA9IHNyYy5yZXBsYWNlKHJlZ0V4UmVzLCAiLi9yZXNvdXJjZXMvJDMiKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWVsZW1lbnQuc3JjID0gc3JjLnJlcGxhY2UocmVnRXgsICIuL3Jlc291cmNlcy8kMiIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdmFyIGVsZW1lbnRzID0gdGhpcy5lZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2EnKTsKLQkJCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCXZhciBpZCA9IGVsZW1lbnQuaWQ7Ci0JCQkJaWYgKGlkICE9IG51bGwgJiYgaWQgIT0gJycpIHsKLQkJCQkJUmVnRXhwLmxhc3RJbmRleD0wOwotCQkJCQl2YXIgbWF0Y2hBcnJheSA9IGlkLm1hdGNoKHJlZ0V4SUQpOwotCQkJCQlpZiAobWF0Y2hBcnJheSAhPSBudWxsICYmIG1hdGNoQXJyYXkubGVuZ3RoID4gMSkgewotCQkJCQkJZWxlbWVudC5ocmVmID0gbWF0Y2hBcnJheVsxXTsKLQkJCQkJCWlmIChtYXRjaEFycmF5Lmxlbmd0aCA+IDIgJiYgbWF0Y2hBcnJheVsyXS5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJZWxlbWVudC5pZCA9IG1hdGNoQXJyYXlbMl07Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTsKLQkJCQkJCX0KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXZhciBocmVmID0gZWxlbWVudC5ocmVmOwotCQkJCWlmIChocmVmICE9IG51bGwgJiYgaHJlZiAhPSAnJykgewotCQkJCQkvLyBmaXggc2VsZi1yZWZlcmVuY2luZyBocmVmcwotCQkJCQlpZiAoaHJlZi5pbmRleE9mKCcjJykgIT0gLTEpIHsKLQkJCQkJCVJlZ0V4cC5sYXN0SW5kZXg9MDsKLQkJCQkJCXZhciBtYXRjaEFycmF5ID0gaHJlZi5tYXRjaChyZWdFeFJlZik7Ci0JCQkJCQlpZiAobWF0Y2hBcnJheSAhPSBudWxsICYmIG1hdGNoQXJyYXkubGVuZ3RoID4gMikgewotCQkJCQkJCXZhciBocmVmRmlsZSA9IG1hdGNoQXJyYXlbMV07Ci0JCQkJCQkJdmFyIHJlZiA9IG1hdGNoQXJyYXlbMl07Ci0JCQkJCQkJaWYgKGhyZWZGaWxlID09IHNvdXJjZVVSTCkgewotCQkJCQkJCQllbGVtZW50LmhyZWYgPSByZWY7Ci0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBmaXggaHJlZnMgYWxyZWFkeSBpbiByZXNvdXJjZXMKLQkJCQkJaWYgKGhyZWYuaW5kZXhPZigncmVzb3VyY2VzJykgIT0gLTEpIHsKLQkJCQkJCWVsZW1lbnQuaHJlZiA9IGhyZWYucmVwbGFjZShyZWdFeFJlcywgIi4vcmVzb3VyY2VzLyQzIik7Ci0JCQkJCX0KLQkJCQkJLy8gZml4IGhyZWZzIG5vdCBpbiByZXNvdXJjZXMKLQkJCQkJZWxzZSB7Ci0JCQkJCQllbGVtZW50LmhyZWYgPSBocmVmLnJlcGxhY2UocmVnRXgsICIuL3Jlc291cmNlcy8kMiIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChlKSB7Ci0JCX0KLQl9Ci19Ci0KLS8vIFJlZG8gdGhlIHByZXZpb3VzIGNvbW1hbmQuCi1SVEUucHJvdG90eXBlLnJlZG8gPSBmdW5jdGlvbigpIHsKLQl0aGlzLmZvcm1hdFRleHQoJ3JlZG8nLCBudWxsKTsKLX0KLQotLy8gUmVkbyB0aGUgcHJldmlvdXMgY29tbWFuZC4KLVJURS5wcm90b3R5cGUucmVtb3ZlRm9ybWF0ID0gZnVuY3Rpb24oKSB7Ci0JdGhpcy5mb3JtYXRUZXh0KCdyZW1vdmVmb3JtYXQnLCBudWxsKTsKLX0KLQotCi0KLVJURS5wcm90b3R5cGUuX3JlcGxhY2VBbGxUZXh0ID0gZnVuY3Rpb24oZmluZFRleHQsIHJlcGxhY2VUZXh0LCBvcHRpb25zKSB7Ci0JLy8gdGhpcyBpcyBJRSBvbmx5Ci0JaWYgKGRvY3VtZW50LmFsbCkgewotCQl2YXIgdGVtcFJhbmdlID0gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsKLQkJdGVtcFJhbmdlLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgLTEwMDAwMDAwMDAwKTsKLQkJZG8gewotCQkJdGVtcFJhbmdlLmNvbGxhcHNlKCk7Ci0JCQlpZiAodGVtcFJhbmdlLmZpbmRUZXh0KGZpbmRUZXh0LCAxMDAwMDAwMDAwMCwgb3B0aW9ucykpIHsKLQkJCQl0ZW1wUmFuZ2UudGV4dCA9IHJlcGxhY2VUZXh0OwotCQkJCXRlbXBSYW5nZS5zZWxlY3QoKTsKLQkJCX0gZWxzZSB7CQkKLQkJCQlicmVhazsKLQkJCX0KLQkJfSB3aGlsZSAodHJ1ZSk7Ci0JfQotfQotCi0vLyBSZXBsYWNlcyBhbGwgdGV4dC4KLVJURS5wcm90b3R5cGUucmVwbGFjZUFsbFRleHQgPSBmdW5jdGlvbihmaW5kVGV4dCwgcmVwbGFjZVRleHQsIG9wdGlvbnMpIHsKLQlpZiAodGhpcy5yZWFkT25seSB8fCBmaW5kVGV4dCA9PSBudWxsIHx8IGZpbmRUZXh0ID09ICIiKSB7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZSB7Ci0JCWZpbmRUZXh0ID0gdGhpcy5kZWNvZGVTdHJpbmcoZmluZFRleHQpOwotCX0KLQlpZiAocmVwbGFjZVRleHQgPT0gbnVsbCkgewotCQlyZXBsYWNlVGV4dCA9ICIiOwotCX0KLQllbHNlIHsKLQkJcmVwbGFjZVRleHQgPSB0aGlzLmRlY29kZVN0cmluZyhyZXBsYWNlVGV4dCk7Ci0JfQotCQotCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJLy8gVE9ETzogTW92ZSB0aGUgaW5zZXJ0aW9uIHBvaW50IHRvIHRoZSBzdGFydCBvZiB0aGUgSFRNTAotCQkvLyBhbmQgcGVyZm9ybSBhIHNlYXJjaCBhbmQgcmVwbGFjZSBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24uIAotCQl0aGlzLl9yZXBsYWNlQWxsVGV4dChmaW5kVGV4dCwgcmVwbGFjZVRleHQsIG9wdGlvbnMpOwotCX0KLQllbHNlIHsKLQkJLy8gVE9ETzogRW11bGF0ZSB0aGUgSUUgaW1wbGVtZW50YXRpb24uCi0JCXZhciBodG1sID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5lZGl0b3JJZCkuY29udGVudFdpbmRvdy5kb2N1bWVudC5ib2R5LmlubmVySFRNTDsKLQkJdmFyIG9wdGlvblN0ciA9ICIvZyI7Ci0JCWlmICgob3B0aW9ucyAmIDQpID09IDApIHsKLQkJCW9wdGlvblN0ciArPSAiaSI7Ci0JCX0KLQkJdmFyIHJlZ0V4cCA9IGV2YWwoIi8iICsgZmluZFRleHQgKyBvcHRpb25TdHIpOwotCQlodG1sID0gaHRtbC5yZXBsYWNlKHJlZ0V4cCwgcmVwbGFjZVRleHQpOwotCQl0aGlzLnNldFRleHQoaHRtbCk7Ci0JfQotCQotCXRoaXMuc2V0U3RhdHVzKHRoaXMuU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQl0aGlzLnNldFN0YXR1cyh0aGlzLlNUQVRVU19NT0RJRklFRCwgbnVsbCk7Ci19Ci0KLS8vIFJlcGxhY2VzIHRleHQuCi1SVEUucHJvdG90eXBlLnJlcGxhY2VUZXh0ID0gZnVuY3Rpb24ocmVwbGFjZVRleHQsIGRpciwgb3B0aW9ucykgewotCWlmICh0aGlzLnJlYWRPbmx5IHx8ICF0aGlzLmludGVybmFsVXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAocmVwbGFjZVRleHQgPT0gbnVsbCkgewotCQlyZXBsYWNlVGV4dCA9ICIiOwotCX0KLQllbHNlIHsKLQkJcmVwbGFjZVRleHQgPSB0aGlzLmRlY29kZVN0cmluZyhyZXBsYWNlVGV4dCk7Ci0JfQotCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJdGhpcy5zZWxlY3Rpb25SYW5nZS50ZXh0ID0gcmVwbGFjZVRleHQ7Ci0JCWlmIChyZXBsYWNlVGV4dCAhPSAiIikgewotCQkJdGhpcy5zZWxlY3Rpb25SYW5nZS5tb3ZlU3RhcnQoIndvcmQiLCAtMSk7Ci0JCQl0aGlzLnNlbGVjdGlvblJhbmdlLnNlbGVjdCgpOwotCQkJdGhpcy5zZWxlY3Rpb25SYW5nZS5jb2xsYXBzZShkaXIgPCAwKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJdGhpcy5zZWxlY3Rpb25SYW5nZS5kZWxldGVDb250ZW50cygpOwotCQl0aGlzLnNlbGVjdGlvblJhbmdlLmluc2VydE5vZGUodGhpcy5lZGl0b3JEb2MuY3JlYXRlVGV4dE5vZGUocmVwbGFjZVRleHQpKTsKLQl9Ci0JdGhpcy5zZXRTdGF0dXModGhpcy5TVEFUVVNfRVhFQ19DTUQsIDEpOwotCXRoaXMuc2V0U3RhdHVzKHRoaXMuU1RBVFVTX01PRElGSUVELCBudWxsKTsKLX0KLQotLy8gU2VsZWN0cyBhbGwgdGV4dC4KLVJURS5wcm90b3R5cGUuc2VsZWN0QWxsID0gZnVuY3Rpb24oKSB7Ci0JaWYgKHRoaXMuaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSkgewotCQlpZiAodGhpcy5lZGl0b3JEb2MuZXhlY0NvbW1hbmQoJ3NlbGVjdGFsbCcsIGZhbHNlLCBudWxsKSkgewotCQkJdGhpcy5zZXRTdGF0dXModGhpcy5TVEFUVVNfRVhFQ19DTUQsIDEpOwotCQl9Ci0JfQotfQotCi0vLyBTZXRzIHRoZSBmb250IG5hbWUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0LgotUlRFLnByb3RvdHlwZS5zZXRGb250TmFtZSA9IGZ1bmN0aW9uKG5hbWUpIHsKLQlpZiAodGhpcy5pbnRlcm5hbFVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCWlmIChuYW1lID09ICcnKSB7Ci0JCQkJdGhpcy5mb3JtYXRUZXh0KCdyZW1vdmVGb3JtYXQnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5mb3JtYXRUZXh0KCdmb250bmFtZScsIG5hbWUpOwotCQkJfQotCQl9Ci0JfQotfQotCi0vLyBTZXRzIHRoZSBmb250IHNpemUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0LgotUlRFLnByb3RvdHlwZS5zZXRGb250U2l6ZSA9IGZ1bmN0aW9uKHNpemUpIHsKLQlpZiAodGhpcy5pbnRlcm5hbFVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCWlmIChzaXplICE9IG51bGwpIHsKLQkJCWlmIChzaXplID09ICcnKSB7Ci0JCQkJdGhpcy5mb3JtYXRUZXh0KCdyZW1vdmVGb3JtYXQnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5mb3JtYXRUZXh0KCdmb250c2l6ZScsIHNpemUpOwotCQkJfQotCQl9Ci0JfQotfQotCi0vLyBTZXRzIHRoZSBmb250IHN0eWxlIGZvciB0aGUgc2VsZWN0ZWQgdGV4dC4KLVJURS5wcm90b3R5cGUuc2V0Rm9udFN0eWxlID0gZnVuY3Rpb24oc3R5bGUpIHsgCi0JaWYgKCF0aGlzLnJlYWRPbmx5ICYmIHN0eWxlICE9IG51bGwgJiYgc3R5bGUgIT0gJycgJiYgdGhpcy5pbnRlcm5hbFVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJdGhpcy5zZWxlY3Rpb25SYW5nZS5leGVjQ29tbWFuZCgicmVtb3ZlZm9ybWF0Iik7Ci0JCQkJdGhpcy5zZWxlY3Rpb25SYW5nZS5wYXJlbnRFbGVtZW50KCkucmVtb3ZlQXR0cmlidXRlKCJjbGFzc05hbWUiKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoZSkgewotCQl9Ci0JCWlmIChzdHlsZSA9PSAiPHF1b3RlPiIpIHsKLQkJCXRoaXMuZm9ybWF0VGV4dCgnZm9ybWF0YmxvY2snLCAnPHA+Jyk7Ci0JCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJdGhpcy5zZWxlY3Rpb25SYW5nZS5wYXJlbnRFbGVtZW50KCkuY2xhc3NOYW1lID0gInF1b3RlIjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMuc2VsZWN0aW9uLmZvY3VzTm9kZS5wYXJlbnROb2RlLmNsYXNzTmFtZSA9ICJxdW90ZSI7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoc3R5bGUgPT0gIjxjb2RlPiIpIHsKLQkJCXRoaXMuZm9ybWF0VGV4dCgnZm9ybWF0YmxvY2snLCAnPHA+Jyk7Ci0JCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJdGhpcy5zZWxlY3Rpb25SYW5nZS5wYXJlbnRFbGVtZW50KCkuY2xhc3NOYW1lID0gImNvZGVTYW1wbGUiOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5zZWxlY3Rpb24uZm9jdXNOb2RlLnBhcmVudE5vZGUuY2xhc3NOYW1lID0gImNvZGVTYW1wbGUiOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKCFkb2N1bWVudC5hbGwgJiYgc3R5bGUgPT0gIjxwPiIpIHsKLQkJCQkvLyBBIGhhY2sgdG8gZ2V0IHJpZCBvZiB0aGUgImNsYXNzTmFtZSIgYXR0cmlidXRlIGluIE1vemlsbGEvRmlyZWZveC4KLQkJCQl0aGlzLmZvcm1hdFRleHQoJ2Zvcm1hdGJsb2NrJywgJzxoND4nKTsKLQkJCX0KLQkJCXRoaXMuZm9ybWF0VGV4dCgnZm9ybWF0YmxvY2snLCBzdHlsZSk7Ci0JCX0KLQl9Ci19Ci0KLS8vIFNldHMgd2hldGhlciB0aGUgY29udGVudCBjYW4gYmUgZWRpdGVkLgotUlRFLnByb3RvdHlwZS5zZXRFZGl0YWJsZSA9IGZ1bmN0aW9uKGVkaXRhYmxlKSB7Ci0JdmFyIGRvYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7Ci0gICAgaWYgKGVkaXRhYmxlICE9IG51bGwgJiYgZWRpdGFibGUgPT0gJ3RydWUnKSB7Ci0JCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCWRvYy5ib2R5LmNvbnRlbnRFZGl0YWJsZSA9ICJ0cnVlIjsKLQkJfQotCQllbHNlIHsKLQkJCWRvYy5kZXNpZ25Nb2RlID0gIm9uIjsKLQkJfQotCQl0aGlzLnJlYWRPbmx5ID0gZmFsc2U7Ci0JfQotCWVsc2UgewotCQlpZiAoZG9jdW1lbnQuYWxsKSB7CQkKLQkJCWRvYy5ib2R5LmNvbnRlbnRFZGl0YWJsZSA9ICJmYWxzZSI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlkb2MuZGVzaWduTW9kZSA9ICJvZmYiOwotCQl9Ci0JCXRoaXMucmVhZE9ubHkgPSB0cnVlOwotCX0KLQl0aGlzLnNldFN0YXR1cyh0aGlzLlNUQVRVU19FWEVDX0NNRCwgMSk7CQotfQotCi0vLyBUb2dnbGVzIHRoZSAnc3RyaWtlLXRocm91Z2gnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLVJURS5wcm90b3R5cGUuc3RyaWtlVGhyb3VnaCA9IGZ1bmN0aW9uKCkgewotCXRoaXMuZm9ybWF0VGV4dCgnc3RyaWtldGhyb3VnaCcsIHNpemUpOwotfQotCi0vLyBUb2dnbGVzIHRoZSAnc3Vic2NyaXB0JyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi1SVEUucHJvdG90eXBlLnN1YnNjcmlwdCA9IGZ1bmN0aW9uKCkgewotCXRoaXMuZm9ybWF0VGV4dCgnc3Vic2NyaXB0JywgbnVsbCk7Ci19Ci0KLS8vIFRvZ2dsZXMgdGhlICdzdXBlcnNjcmlwdCcgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotUlRFLnByb3RvdHlwZS5zdXBlcnNjcmlwdCA9IGZ1bmN0aW9uKCkgewotCXRoaXMuZm9ybWF0VGV4dCgnc3VwZXJzY3JpcHQnLCBudWxsKTsKLX0KLQotLy8gVG9nZ2xlcyB0aGUgJ3VuZGVybGluZScgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotUlRFLnByb3RvdHlwZS51bmRlcmxpbmUgPSBmdW5jdGlvbigpIHsKLQl0aGlzLmZvcm1hdFRleHQoJ3VuZGVybGluZScsIG51bGwpOwotfQotCi0vLyBDb252ZXJ0cyBhIGxpbmsgdG8gbm9ybWFsIHRleHQuCi1SVEUucHJvdG90eXBlLnVubGluayA9IGZ1bmN0aW9uKCkgewotCXRoaXMuZm9ybWF0VGV4dCgndW5saW5rJywgbnVsbCk7Ci19Ci0KLWZ1bmN0aW9uIE9ialRvU3RyaW5nKG9iamVjdCkgewotCXZhciByZXQgPSAiT2JqZWN0ICIgKyBvYmplY3QubmFtZSArICIgaXMgW1xuIjsKLQlmb3IgKHZhciBwcm9wIGluIG9iamVjdCkgewotCQlyZXQgKz0gIiAgIiArIHByb3AgKyAiIGlzICIgKyBvYmplY3RbcHJvcF0gKyAiO1xuIjsKLQl9Ci0JcmV0dXJuIHJldCArICJdIjsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvcnRlLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvcnRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhkMDI2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9ydGUiPgotCTx4c2w6dmFyaWFibGUgbmFtZT0icnRlX2lkIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+PC94c2w6dmFyaWFibGU+Ci0JPGh0bWw+Ci0JCTxoZWFkPgotCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0icnRlX2pzIj4KLQkJCTx4c2w6dmFyaWFibGUgbmFtZT0ianMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAanMiLz48L3hzbDp2YXJpYWJsZT4KLQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7JGpzfSI+PC9zY3JpcHQ+Ci0JCTwveHNsOmZvci1lYWNoPgotCQk8L2hlYWQ+Ci0JCTxib2R5IGxlZnRNYXJnaW49IjAiIHRvcE1hcmdpbj0iMCIgbWFyZ2luaGVpZ2h0PSIwIiBtYXJnaW53aWR0aD0iMCIgc2Nyb2xsPSJubyIgc3R5bGU9Im92ZXJmbG93OiBoaWRkZW4iPgotCQkJPGlmcmFtZSBpZD0ieyRydGVfaWR9IiBuYW1lPSJ7JHJ0ZV9pZH0iIHN0eWxlPSJib3JkZXI6IG5vbmU7IiBmcmFtZWJvcmRlcj0iMCIgc2Nyb2xsaW5nPSJhdXRvIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj48L2lmcmFtZT4KLQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0JCQkJcnRlLmluaXRFZGl0b3IoJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWQiLz4nLCAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjc3MiLz4nLCAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBiYXNlVVJMIi8+Jyk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9ib2R5PgotCTwvaHRtbD4KLTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NjaGVtYS9yaWNoVGV4dEphdmFTY3JpcHQuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zY2hlbWEvcmljaFRleHRKYXZhU2NyaXB0LmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlOTlkM2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NjaGVtYS9yaWNoVGV4dEphdmFTY3JpcHQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dCIgaWQ9InJpY2hUZXh0SmF2YVNjcmlwdCIgbmFtZT0iUmljaCBUZXh0IEphdmEgU2NyaXB0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBjb250cmlidXRpb25zIHRvIHRoZSBKYXZhc2NyaXB0IHVuZGVybHlpbmcgdGhlIFJpY2ggVGV4dCB3aWRnZXQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNjcmlwdCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzY3JpcHQiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXRoIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im9yZGVyIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvSVJpY2hUZXh0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9JUmljaFRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU5OGI3OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9JUmljaFRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRmluZFJlcGxhY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5IZWxwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiA8cD4KLSAqIEEgcmljaCB0ZXh0IGNvbnRyb2wgaXMgYW4gZWRpdGFibGUgdXNlciBpbnRlcmZhY2Ugb2JqZWN0IHRoYXQgZGlzcGxheXMgcmljaAotICogdGV4dCBhbmQgaW1hZ2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSaWNoVGV4dCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OQU1FID0gInJpY2hUZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEByZXR1cm4gdGhpcyByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGxheW91dCBkYXRhLgotCSAqIAotCSAqIEBwYXJhbSBsYXlvdXREYXRhCi0JICogICAgICAgICAgICB0aGUgbGF5b3V0IGRhdGEgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGF5b3V0RGF0YShPYmplY3QgbGF5b3V0RGF0YSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXlvdXQgZGF0YS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoaXMgY29udHJvbCdzIGxheW91dCBkYXRhCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRMYXlvdXREYXRhKCk7Ci0KLQkvKioKLQkgKiBTZXRzIGZvY3VzIHRvIHRoaXMgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpOwotCi0JLyoqCi0JICogVGVsbHMgdGhlIGNvbnRyb2wgaXQgZG9lcyBub3QgaGF2ZSBmb2N1cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCbHVyKCk7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGlzIGNvbnRyb2wgaGFzIGZvY3VzLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjb250cm9sIGhhcyB0aGUgdXNlci1pbnRlcmZhY2UgZm9jdXMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNGb2N1cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyB0ZXh0IGFuZCBpbWFnZSBsaW5rcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGxpbmtzIGluIHRoaXMgY29udHJvbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZVBhdGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVkaXRhYmxlIHN0YXRlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRlbnQgaXMgZWRpYXRibGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRFZGl0YWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgZWRpdGFibGUgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIGVkaXRhYmxlCi0JICogICAgICAgICAgICB0aGUgZWRpdGFibGUgc3RhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKTsKLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBjb250ZW50IGhhcyBiZWVuIG1vZGlmaWVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRlbnQgaGFzIGJlZW4gbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRNb2RpZmllZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kaWZpZWQgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIG1vZGlmaWVkCi0JICogICAgICAgICAgICB0aGUgbW9kaWZpZWQgc3RhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RpZmllZChib29sZWFuIG1vZGlmaWVkKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJpY2ggdGV4dCBjb250ZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJpY2ggdGV4dCBjb250ZW50IGZvcm1hdHRlZCBpbiBhIG1hcmt1cCBsYW5ndWFnZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgcmljaCB0ZXh0IGNvbnRlbnQuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSByaWNoIHRleHQgY29udGVudCBmb3JtYXR0ZWQgaW4gYSBtYXJrdXAgbGFuZ3VhZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KTsKLQotCS8qKgotCSAqIFJlc3RvcmVzIHRoZSByaWNoIHRleHQgY29udGVudCBiYWNrIHRvIHRoZSBpbml0aWFsIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3RvcmVUZXh0KCk7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZWRpdG9yIGNvbnRlbnQgaGFzIGJlZW4gbW9kaWZpZWQuIElmIGl0IGhhcyBiZWVuCi0JICogbW9kaWZpZWQsIG5vdGlmeSB0aGUgbW9kaWZ5IGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja01vZGlmeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBkZXNjcmliZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPlJpY2hUZXh0U2VsZWN0aW9uPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRTZWxlY3Rpb24gZ2V0U2VsZWN0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXBwbGljYXRpb24gc3BlY2lmaWMgcHJvcGVydHkgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGhhcyBub3QKLQkgKiAgICAgICAgIGJlZW4gc2V0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXREYXRhKFN0cmluZyBrZXkpOwotCi0JLyoqCi0JICogU2V0cyBhbiBhcHBsaWNhdGlvbiBzcGVjaWZpYyBwcm9wZXJ0eSBuYW1lIGFuZCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGEoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiByaWNoIHRleHQgY29tbWFuZC4gVGhlIHN1cHBvcnRlZCBjb21tYW5kIHN0cmluZ3MgYXJlCi0JICogZGVmaW5lZCBpbiA8Y29kZT5SaWNoVGV4dENvbW1hbmQ8Y29kZT4uCi0JICogCi0JICogQHBhcmFtCWNvbW1hbmQJCWEgcmljaCB0ZXh0IGNvbW1hbmQgc3RyaW5nCi0JICogQHJldHVybglhIHN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IHRoZSBleGVjdXRlZCBjb21tYW5kCi0JICovCi0JcHVibGljIGludCBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCk7Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gcmljaCB0ZXh0IGNvbW1hbmQgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIuIFRoZQotCSAqIHN1cHBvcnRlZCBjb21tYW5kIHN0cmluZ3MgYXJlIGRlZmluZWQgaW4gPGNvZGU+UmljaFRleHRDb21tYW5kPGNvZGU+LgotCSAqIAotCSAqIEBwYXJhbQljb21tYW5kCQlhIHJpY2ggdGV4dCBjb21tYW5kIHN0cmluZwotCSAqIEBwYXJhbQlwYXJhbQkJYSBwYXJhbWV0ZXIgZm9yIHRoZSBjb21tYW5kIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybglhIHN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IHRoZSBleGVjdXRlZCBjb21tYW5kCi0JICovCi0JcHVibGljIGludCBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCwgU3RyaW5nIHBhcmFtKTsKLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiByaWNoIHRleHQgY29tbWFuZCB3aXRoIGFuIGFycmF5IG9mIHBhcmFtZXRlcnMuIFRoZQotCSAqIHN1cHBvcnRlZCBjb21tYW5kIHN0cmluZ3MgYXJlIGRlZmluZWQgaW4gPGNvZGU+UmljaFRleHRDb21tYW5kPGNvZGU+LgotCSAqIAotCSAqIEBwYXJhbQljb21tYW5kCQlhIHJpY2ggdGV4dCBjb21tYW5kIHN0cmluZwotCSAqIEBwYXJhbQlwYXJhbXMJCWFuIGFycmF5IG9mIHBhcmFtZXRlcnMgZm9yIHRoZSBjb21tYW5kIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybglhIHN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IHRoZSBleGVjdXRlZCBjb21tYW5kCi0JICovCi0JcHVibGljIGludCBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCwgU3RyaW5nW10gcGFyYW1zKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGlmeSBsaXN0ZW5lcnMgYXR0YWNoZWQgdG8gdGhpcyBjb250cm9sLgotCSAqIAotCSAqIEByZXR1cm4gYW4gaXRlcmF0b3IgZm9yIHJldHJpZXZpbmcgdGhlIG1vZGlmeSBsaXN0ZW5lcnMKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8TW9kaWZ5TGlzdGVuZXI+IGdldE1vZGlmeUxpc3RlbmVycygpOwotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZCB3aGVuCi0JICoga2V5cyBhcmUgcHJlc3NlZCBhbmQgcmVsZWFzZWQgd2l0aGluIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRLZXlMaXN0ZW5lcihLZXlMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIGtleXMgYXJlIHByZXNzZWQgYW5kIHJlbGVhc2VkIHdpdGhpbiB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUtleUxpc3RlbmVyKEtleUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQgd2hlbgotCSAqIHRoZSBjb250ZW50IG9mIHRoaXMgY29udHJvbCBpcyBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIHRoZSBjb250ZW50IG9mIHRoaXMgY29udHJvbCBpcyBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQWRkcyB0aGUgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmZWQgd2hlbgotCSAqIHRoaXMgY29udHJvbCBpcyBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4gdGhpcyBjb250cm9sIGlzIGRpc3Bvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVEaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQgd2hlbgotCSAqIGhlbHAgZXZlbnRzIGFyZSBnZW5lcmF0ZWQgZm9yIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRIZWxwTGlzdGVuZXIoSGVscExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4gaGVscCBldmVudHMgYXJlIGdlbmVyYXRlZCBmb3IgdGhpcyBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVIZWxwTGlzdGVuZXIoSGVscExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmVkIHdoZW4KLQkgKiBhbiBldmVudCBvZiB0aGUgZ2l2ZW4gdHlwZSBvY2N1cnMgd2l0aGluIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGV2ZW50IG9jY3VycwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKGludCBldmVudFR5cGUsIExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmZWQKLQkgKiB3aGVuIGFuIGV2ZW50IG9mIHRoZSBnaXZlbiB0eXBlIG9jY3VycyB3aXRoaW4gdGhpcyBlY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gdG8KLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGV2ZW50Ci0JICogICAgICAgICAgICBvY2N1cnMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihpbnQgZXZlbnRUeXBlLCBMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIG1vZGlmeSBsaXN0ZW5lcnMKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeU1vZGlmeUxpc3RlbmVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIGZvciByZXRyaWV2aW5nIHRoZSBldmVudCBsaXN0ZW5lcnMgYXR0YWNoZWQgdG8gdGhpcwotCSAqICAgICAgICAgY29udHJvbAotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxSaWNoVGV4dExpc3RlbmVyPiBnZXRMaXN0ZW5lcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJhc2UgVVJMIG9mIHRoZSByaWNoIHRleHQgY29udHJvbCB3aG9zZSBjb250ZW50IHdhcyBsYXN0Ci0JICogY29waWVkIHRvIHRoZSBjbGlwYm9hcmQuCi0JICogCi0JICogQHJldHVybiB0aGUgYmFzZSBVUkwgb2YgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBVUkwgZ2V0Q29weVVSTCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgYmFzZSBVUkwgb2YgdGhlIHJpY2ggdGV4dCBjb250cm9sIHdob3NlIGNvbnRlbnQgd2FzIGxhc3QgY29waWVkCi0JICogdG8gdGhlIGNsaXBib2FyZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3B5VVJMKCk7Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyB0aGUgb3BlcmF0aW5nIHN5c3RlbSByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGlzIGNvbnRyb2wgaGFzIGJlZW4gZGlzcG9zZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNvbnRyb2wgaXMgZGlzcG9zZWQgc3VjY2Vzc2Z1bGx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCgpOwotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbnRyb2wncyBGaW5kUmVwbGFjZUFjdGlvbgotCSAqLwotCXB1YmxpYyBGaW5kUmVwbGFjZUFjdGlvbiBnZXRGaW5kUmVwbGFjZUFjdGlvbigpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIEZpbmRSZXBsYWNlQWN0aW9uIHRvIHVzZQotCSAqIEBwYXJhbSBmaW5kUmVwbGFjZUFjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmRSZXBsYWNlQWN0aW9uKEZpbmRSZXBsYWNlQWN0aW9uIGZpbmRSZXBsYWNlQWN0aW9uKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBpbml0aWFsVGV4dCB2YXJpYWJsZSwgd2hpY2ggc3RvcmVzIHdoYXQgaXMgc2F2ZWQgb24gZGlzawotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFRleHQoU3RyaW5nIHRleHQpOwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIFJpY2ggVGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFN0cmluZyBiYXNlUGF0aCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9JUmljaFRleHRFZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDhmNmE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRmluZFJlcGxhY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgcmljaCB0ZXh0IGVkaXRvci4KLSAqIDxwPgotICogQSByaWNoIHRleHQgZWRpdG9yIGlzIGEgY29tcG9zaXRlIHVzZXIgaW50ZXJmYWNlIG9iamVjdCB0aGF0IGluY2x1ZGVzIGEgdG9vbAotICogYmFyLCBhIHRhYiBmb2xkZXIgZm9yIGVudGVyaW5nIHRoZSByaWNoIHRleHQgY29udGVudCwgYW5kIGEgdGFiIGZvbGRlciBmb3IKLSAqIHZpZXdpbmcgYW5kIG1vZGlmeWluZyB0aGUgcmljaCB0ZXh0IGNvbnRlbnQgaW4gYSBtYXJrdXAgbGFuZ3VhZ2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSaWNoVGV4dEVkaXRvciBleHRlbmRzIElSaWNoVGV4dCB7Ci0KLQkvKioKLQkgKiBGaWxscyB0aGUgdG9vbCBiYXIgd2l0aCByaWNoIHRleHQgYWN0aW9uIGl0ZW1zLgotCSAqIAotCSAqIEBwYXJhbSB0b29sQmFyCi0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBlZGl0b3IgdG9vbCBiYXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsVG9vbEJhcihJUmljaFRleHRUb29sQmFyIHRvb2xCYXIpOwotCi0JLyoqCi0JICogU2VsZWN0cyB0aGUgcmljaCB0ZXh0IG9yIHRoZSBtYXJrdXAgbGFuZ3VhZ2UgdGFiLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgPGNvZGU+MDwvY29kZT4gZm9yIHRoZSByaWNoIHRleHQgdGFiLCA8Y29kZT4xPC9jb2RlPiBmb3IKLQkgKiAgICAgICAgICAgIHRoZSBtYXJrdXAgbGFuZ3VhZ2UgdGFiCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgRmluZFJlcGxhY2VBY3Rpb24gdG8gdXNlCi0JICogQHBhcmFtIGZpbmRSZXBsYWNlQWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluZFJlcGxhY2VBY3Rpb24oRmluZFJlcGxhY2VBY3Rpb24gZmluZFJlcGxhY2VBY3Rpb24pOwotCQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBSaWNoIFRleHQgRWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiBAcGFyYW0gZWRpdG9yU2l0ZQotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBTdHJpbmcgYmFzZVBhdGgsCi0JCQlJRWRpdG9yU2l0ZSBlZGl0b3JTaXRlKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvSVJpY2hUZXh0VG9vbEJhci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvSVJpY2hUZXh0VG9vbEJhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2E1M2Q1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dFRvb2xCYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlJpY2hUZXh0Q29tYm9BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlRvb2xCYXJNYW5hZ2VyOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgcmljaCB0ZXh0IGVkaXRvciB0b29sYmFyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmljaFRleHRUb29sQmFyIHsKLQotCQotCS8qKgotCSAqIEFkZHMgYSBidXR0b24gYWN0aW9uIHRvIHRoZSB0b29sIGJhci4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uCi0JICogICAgICAgICAgICB0aGUgYnV0dG9uIGFjdGlvbiB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBY3Rpb24oSUFjdGlvbiBhY3Rpb24pOwotCi0JLyoqCi0JICogQWRkcyBhIGNvbWJvIGFjdGlvbiB0byB0aGUgdG9vbCBiYXIuCi0JICogCi0JICogQHBhcmFtIGFjdGlvbgotCSAqICAgICAgICAgICAgdGhlIGNvbWJvIGFjdGlvbiB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBY3Rpb24oUmljaFRleHRDb21ib0FjdGlvbiBpdGVtKTsKLQotCS8qKgotCSAqIEFkZHMgYSBzZXBhcmF0b3IgdG8gdGhlIHRvb2wgYmFyLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlcGFyYXRvcigpOwotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgdG9vbGJhciBzdGF0ZS4KLQkgKiA8cD4KLQkgKiBFbmFibGVzL2Rpc2FibGVzIGFjdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKLQkgKiBSaWNoVGV4dEVkaXRvciB0YWIgKFJpY2hUZXh0IHZzLiBIVE1MKQotCSAqIAotCSAqIEBwYXJhbSBlZGl0YWJsZSBzcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgbm9uLVJlYWRPbmx5IGNvbW1hbmRzCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlVG9vbEJhcihib29sZWFuIGVuYWJsZWQpOwotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRvb2xiYXIgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBUb29sQmFyTWFuYWdlciBnZXRUb29sYmFyTWdyKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWZhYmMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJFR0lOIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1mb250TmFtZUFjdGlvbl9DU1NfRGVmYXVsdD1hcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1mb250TmFtZUFjdGlvbl9DU1NfRGVmYXVsdF9Nb3ppbGxhPWFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBFTkQgTk8gVFJBTlNMQVRJT04KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLQotCi0jIEZvbnQgU3R5bGUgTmFtZXMKLWZvbnRTdHlsZV9ub3JtYWw9Tm9ybWFsCi1mb250U3R5bGVfc2VjdGlvbkhlYWRpbmc9U2VjdGlvbiBIZWFkaW5nCi1mb250U3R5bGVfc3Vic2VjdGlvbkhlYWRpbmc9U3Vic2VjdGlvbiBIZWFkaW5nCi1mb250U3R5bGVfc3ViU3Vic2VjdGlvbkhlYWRpbmc9U3ViIFN1YnNlY3Rpb24gSGVhZGluZwotZm9udFN0eWxlX3F1b3RlPVF1b3RlCi1mb250U3R5bGVfY29kZVNhbXBsZT1Db2RlIFNhbXBsZQotCi0jIEhUTUwgQmxvY2sgVGFncwotYmxvY2tUYWdfcGFyYWdyYXBoPVBhcmFncmFwaAotYmxvY2tUYWdfaGVhZGluZzE9SGVhZGluZyAxCi1ibG9ja1RhZ19oZWFkaW5nMj1IZWFkaW5nIDIKLWJsb2NrVGFnX2hlYWRpbmczPUhlYWRpbmcgMwotYmxvY2tUYWdfaGVhZGluZzQ9SGVhZGluZyA0Ci1ibG9ja1RhZ19oZWFkaW5nNT1IZWFkaW5nIDUKLWJsb2NrVGFnX2hlYWRpbmc2PUhlYWRpbmcgNgotYmxvY2tUYWdfYWRkcmVzcz1BZGRyZXNzCi1ibG9ja1RhZ19wcmVmb3JtYXR0ZWRUZXh0PVByZWZvcm1hdHRlZCBUZXh0Ci0KLSMgSFRNTCBGb250IE5hbWVzCi1mb250TmFtZV9kZWZhdWx0PURlZmF1bHQKLWZvbnROYW1lX2FyaWFsPUFyaWFsCi1mb250TmFtZV9jb3VyaWVyTmV3PUNvdXJpZXIgTmV3Ci1mb250TmFtZV90aW1lc05ld1JvbWFuPVRpbWVzIE5ldyBSb21hbgotZm9udE5hbWVfdmVyZGFuYT1WZXJkYW5hCi0KLSMgUmljaCBUZXh0IEVkaXRvciBUb29sIEJ1dHRvbnMKLWFkZEhvcml6b250YWxCYXJBY3Rpb25fdG9vbFRpcFRleHQ9QWRkIEhvcml6b250YWwgQmFyCi1hZGRJbWFnZUFjdGlvbl90b29sVGlwVGV4dD1BZGQgSW1hZ2UKLWFkZExpbmVBY3Rpb25fdG9vbFRpcFRleHQ9QWRkIExpbmUKLWFkZExpbmtBY3Rpb25fdG9vbFRpcFRleHQ9QWRkIExpbmsKLWFkZE9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0PUFkZCBPcmRlcmVkIExpc3QKLWFkZFRhYmxlQWN0aW9uX3Rvb2xUaXBUZXh0PUFkZCBUYWJsZQotYWRkVW5vcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dD1BZGQgVW5vcmRlcmVkIExpc3QKLWJvbGRBY3Rpb25fdG9vbFRpcFRleHQ9Qm9sZAotY2xlYXJDb250ZW50QWN0aW9uX3Rvb2xUaXBUZXh0PUNsZWFyIENvbnRlbnQKLWNvcHlBY3Rpb25fdG9vbFRpcFRleHQ9Q29weQotY3V0QWN0aW9uX3Rvb2xUaXBUZXh0PUN1dAotZmluZFJlcGxhY2VBY3Rpb25fdG9vbFRpcFRleHQ9RmluZC9SZXBsYWNlCi1pbmRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9SW5kZW50Ci1pdGFsaWNBY3Rpb25fdG9vbFRpcFRleHQ9SXRhbGljCi1qdXN0aWZ5Q2VudGVyQWN0aW9uX3Rvb2xUaXBUZXh0PUp1c3RpZnkgQ2VudGVyCi1qdXN0aWZ5RnVsbEFjdGlvbl90b29sVGlwVGV4dD1KdXN0aWZ5IEZ1bGwKLWp1c3RpZnlMZWZ0QWN0aW9uX3Rvb2xUaXBUZXh0PUp1c3RpZnkgTGVmdAotanVzdGlmeVJpZ2h0QWN0aW9uX3Rvb2xUaXBUZXh0PUp1c3RpZnkgUmlnaHQKLW91dGRlbnRBY3Rpb25fdG9vbFRpcFRleHQ9T3V0ZGVudAotcGFzdGVBY3Rpb25fdG9vbFRpcFRleHQ9UGFzdGUKLXBhc3RlUGxhaW5UZXh0QWN0aW9uX3Rvb2xUaXBUZXh0PVBhc3RlIGFzIHBsYWluIHRleHQKLXN1YnNjcmlwdEFjdGlvbl90b29sVGlwVGV4dD1TdWJzY3JpcHQKLXN1cGVyc2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0PVN1cGVyc2NyaXB0Ci11bmRlcmxpbmVBY3Rpb25fdG9vbFRpcFRleHQ9VW5kZXJsaW5lCi10aWR5X2NsZWFuX3RleHQ9RGVmYXVsdCBDbGVhbgotdGlkeV9jbGVhbmVyX3RleHQ9Q2xlYW4gTVMgSFRNTAotdGlkeV9jbGVhbmVzdF90ZXh0PUNsZWFuIFdvcmQgMjAwMCBIVE1MCi10aWR5X2NsZWFuX3Rvb2xUaXBUZXh0PUNsZWFuIHdpdGggSlRpZHkgdXNpbmcgZGVmYXVsdCBvcHRpb25zCi10aWR5X2NsZWFuZXJfdG9vbFRpcFRleHQ9Q2xlYW4gSFRNTCBvZiBNUyBIVE1MCi10aWR5X2NsZWFuZXN0X3Rvb2xUaXBUZXh0PUNsZWFuIFdvcmQgMjAwMCBIVE1MCi0KLQotIyBSaWNoIFRleHQgRWRpdG9yIENvbWJvYm94ZXMKLWZvbnRTdHlsZUFjdGlvbl90b29sVGlwVGV4dD1TZXQgRm9udCBTdHlsZQotYmxvY2tUYWdBY3Rpb25fdG9vbFRpcFRleHQ9U2V0IEJsb2NrIFRhZwotZm9udE5hbWVBY3Rpb25fdG9vbFRpcFRleHQ9U2V0IEZvbnQKLWZvbnROYW1lQWN0aW9uX0RlZmF1bHRGb250TmFtZT1EZWZhdWx0IGZvbnQKLWZvbnRTaXplQWN0aW9uX3Rvb2xUaXBUZXh0PVNldCBGb250IFNpemUKLQotIyBSaWNoIFRleHQgRWRpdG9yIENvbnRleHQgTWVudSBJdGVtcwotY3V0QWN0aW9uX3RleHQ9JkN1dAotY29weUFjdGlvbl90ZXh0PUMmb3B5Ci1wYXN0ZUFjdGlvbl90ZXh0PSZQYXN0ZQotcGFzdGVQbGFpblRleHRBY3Rpb25fdGV4dD1QYXN0ZSAmYXMgcGxhaW4gdGV4dAotCi0jIFJpY2ggVGV4dCBFZGl0b3IgVGFicwotcmljaFRleHRUYWJfdGV4dD1SaWNoIFRleHQKLXJpY2hUZXh0VGFiX3Rvb2xUaXBUZXh0PUVkaXQgY29udGVudCBpbiByaWNoIHRleHQKLWh0bWxUYWJfdGV4dD1IVE1MCi1odG1sVGFiX3Rvb2xUaXBUZXh0PUVkaXQgY29udGVudCBpbiBIVE1MCi0KLSMgQWRkIERpYWxvZ3MKLWFkZEltYWdlRGlhbG9nX3RpdGxlPUFkZCBJbWFnZQotYWRkTGlua0RpYWxvZ190aXRsZT1BZGQgTGluawotYWRkVGFibGVEaWFsb2dfdGl0bGU9QWRkIFRhYmxlCi1maW5kUmVwbGFjZURpYWxvZ190aXRsZT1GaW5kL1JlcGxhY2UKLXVybExhYmVsX3RleHQ9VVJMOgotc3VtbWFyeUxhYmVsX3RleHQ9U3VtbWFyeToKLWNhcHRpb25MYWJlbF90ZXh0PUNhcHRpb246Ci1yb3dzTGFiZWxfdGV4dD1Sb3dzOgotY29sdW1uc0xhYmVsX3RleHQ9Q29sdW1uczoKLXdpZHRoTGFiZWxfdGV4dD1XaWR0aDoKLXRhYmxlU3R5bGVMYWJlbF90ZXh0PVN0eWxlOgotdGFibGVIZWFkZXJOb25lX3RleHQ9VGFibGUgd2l0aCBubyBoZWFkZXJzCi10YWJsZUhlYWRlckNvbHNfdGV4dD1UYWJsZSB3aXRoIGNvbHVtbiBoZWFkZXJzCi10YWJsZUhlYWRlclJvd3NfdGV4dD1UYWJsZSB3aXRoIHJvdyBoZWFkZXJzCi10YWJsZUhlYWRlckJvdGhfdGV4dD1UYWJsZSB3aXRoIGNvbHVtbiBhbmQgcm93IGhlYWRlcnMKLWJyb3dzZUJ1dHRvbl90ZXh0PUJyb3dzZS4uLgotCi0jIENsZWFyIEVkaXRvciBDb250ZW50IERpYWxvZwotY2xlYXJDb250ZW50RGlhbG9nX3RpdGxlPUNsZWFyIEVkaXRvciBDb250ZW50IENvbmZpcm1hdGlvbgotY2xlYXJDb250ZW50RGlhbG9nX3RleHQ9RG8geW91IHJlYWxseSB3YW50IHRvIGNsZWFyIHRoZSBjb250ZW50IG9mIHRoaXMgcmljaCB0ZXh0IGVkaXRvcj8KLQotIyBGaW5kL1JlcGxhY2UgRGlhbG9nCi1maW5kTGFiZWxfdGV4dD1GaW5kOgotcmVwbGFjZUxhYmVsX3RleHQ9UmVwbGFjZSB3aXRoOgotb3B0aW9uc0dyb3VwX3RleHQ9T3B0aW9ucwotY2FzZVNlbnNpdGl2ZUNoZWNrYm94X3RleHQ9Q2FzZSBzZW5zaXRpdmUKLXdob2xlV29yZENoZWNrYm94X3RleHQ9V2hvbGUgd29yZAotZGlyZWN0aW9uR3JvdXBfdGV4dD1EaXJlY3Rpb24KLWZvcndhcmRSYWRpb0J1dHRvbl90ZXh0PUZvcndhcmQKLWJhY2t3YXJkUmFkaW9CdXR0b25fdGV4dD1CYWNrd2FyZAotZmluZEJ1dHRvbl90ZXh0PUZpbmQKLXJlcGxhY2VCdXR0b25fdGV4dD1SZXBsYWNlCi1yZXBsYWNlRmluZEJ1dHRvbl90ZXh0PVJlcGxhY2UvRmluZAotcmVwbGFjZWFsbEJ1dHRvbl90ZXh0PVJlcGxhY2UgQWxsCi0jIHRha2VuIGZyb20gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IKLUZpbmRSZXBsYWNlX1N0YXR1c19ub01hdGNoX2xhYmVsPVN0cmluZyBOb3QgRm91bmQKLQotIyBQcmVmZXJlbmNlIFBhZ2UKLW1heENoYXJzUGVyTGluZUxhYmVsX3RleHQ9TWF4aW11bSBjaGFyYWN0ZXJzIHBlciBsaW5lOgotaW5kZW50SFRNTENoZWNrYm94X3RleHQ9SW5kZW50IEhUTUwgdGFncwotaW5kZW50U2l6ZUxhYmVsX3RleHQ9SW5kZW50IFNpemU6Ci11cmxEaXNwbGF5TmFtZUxhYmVsX3RleHQ9VVJMIERpc3BsYXkgTmFtZToKLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFmNWM4My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLmh0bWwuSFRNTEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnhtbC5YU0xUUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkNvcHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQ3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkZpbmRSZXBsYWNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlBhc3RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlBhc3RlUGxhaW5UZXh0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5TdGF0dXNUZXh0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuU3RhdHVzVGV4dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuSGVscExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IHJpY2ggdGV4dCBjb250cm9sIGltcGxlbWVudGF0aW9uLgotICogPHA+Ci0gKiBUaGUgZGVmYXVsdCByaWNoIHRleHQgZWRpdG9yIHVzZXMgWEhUTUwgYXMgdGhlIHVuZGVybHlpbmcgbWFya3VwIGxhbmd1YWdlIGZvcgotICogdGhlIHJpY2ggdGV4dCBjb250ZW50LiBJdCBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIFNXVCA8Y29kZT5Ccm93c2VyPC9jb2RlPgotICogY29udHJvbCBhbmQgREhUTUwgKEhUTUwsIENTUyBhbmQgSmF2YVNjcmlwdCkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dCBpbXBsZW1lbnRzIElSaWNoVGV4dCB7Ci0KLQkvLyBFbmNvZGVkIHNpbmdsZSBxdW90ZS4gQWxsIHNpbmdsZSBxdW90ZXMgbmVlZCB0byBiZSBzcGVjaWFsbHkgZW5jb2RlZCB0bwotCS8vIGF2b2lkIEphdmFTY3JpcHQgZXJyb3Igd2hlbiBjYWxsaW5nIEJyb3dzZS5leGVjdXRlQ29tbWFuZCgpLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNPREVEX1NJTkdMRV9RVU9URSA9ICIlc3ElIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ERURfTkVXTElORSA9ICIlRU9MJSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUVVNfUFJFRklYID0gIiQkJCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfUFJFRklYX0xFTkdUSCA9IFNUQVRVU19QUkVGSVgubGVuZ3RoKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX05PUCA9IDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0lOSVRJQUxJWkVEID0gMTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfTU9ESUZJRUQgPSAyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19HRVRfVEVYVCA9IDM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0tFWV9ET1dOID0gNDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfS0VZX1VQID0gNTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfU0VMRUNUX1RFWFQgPSA2OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19TRUxFQ1RfQ09OVFJPTCA9IDc7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX1NFTEVDVF9OT05FID0gODsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfRVhFQ19DTUQgPSA5OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19SRUZPUk1BVF9MSU5LUyA9IDEwOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyByaWNoVGV4dEphdmFTY3JpcHRFeHRlbnNpb25Qb2ludE5hbWUgPSAib3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnJpY2hUZXh0SmF2YVNjcmlwdCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudFtdIHNjcmlwdEV4dGVuc2lvbnMgPSBnZXRKYXZhU2NyaXB0RXh0ZW5zaW9ucygpOwotCi0JLy8gVGhlIGRlZmF1bHQgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBsaW5rcyAoPGhyZWY+LCA8aW1nPiwgZXRjLikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9CQVNFX1BBVEggPSBTeXN0ZW0KLQkJCS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIikgLy8kTk9OLU5MUy0xJAotCQkJKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIikgKyAicnRlIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvLyBJZiB0cnVlLCBsb2cgZGVidWdnaW5nIGluZm8uCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVidWc7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBsb2dnZXIuCi0JcHJvdGVjdGVkIExvZ2dlciBsb2dnZXI7Ci0KLQkvLyBUaGUgdW5kZXJseWluZyBTV1QgQnJvd3NlciB1c2VkIGZvciBsb2FkaW5nIHRoZSBKYXZhU2NyaXB0L0RIVE1MIGVkaXRvci4KLQlwcm90ZWN0ZWQgQnJvd3NlciBlZGl0b3I7Ci0KLQkvLyBUaGUgdW5kZXJseWluZyBPbGVDb250cm9sU2l0ZSBmb3IgdGhlIFNXVCBCcm93c2VyIChXaW4zMiBvbmx5KS4KLQlwcm90ZWN0ZWQgQ29udHJvbCBlZGl0b3JDb250cm9sOwotCi0JLy8gVGhlIGJhc2UgVVJMIG9mIHRoZSByaWNoIHRleHQgY29udHJvbCB3aG9zZSBjb250ZW50IHdhcyBsYXN0Ci0JLy8gY29waWVkIHRvIHRoZSBjbGlwYm9hcmQuCi0JcHJvdGVjdGVkIHN0YXRpYyBVUkwgY29weVVSTDsKLQotCS8vIFRoZSBjb250ZXh0IG1lbnUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udHJvbC4KLQlwcm90ZWN0ZWQgTWVudSBjb250ZXh0TWVudTsKLQotCS8vIFRoZSBmb2xkZXIgdGhhdCBjb250YWlucyB0aGUgc3VwcG9ydGluZyBDU1MgYW5kIEphdmFTY3JpcHQgZmlsZXMKLQlwcm90ZWN0ZWQgU3RyaW5nIHJ0ZUZvbGRlcjsKLQotCS8vIFRoZSBVUkwgdGhhdCBwb2ludHMgdG8gdGhlIHN1cHBvcnRpbmcgQ1NTIGFuZCBKYXZhU2NyaXB0IGZpbGVzLgotCXByb3RlY3RlZCBTdHJpbmcgcnRlVVJMOwotCi0JLy8gVGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgbGlua3MgKDxocmVmPiwgPGltZz4sIGV0Yy4pCi0JcHJvdGVjdGVkIFN0cmluZyBiYXNlUGF0aDsKLQotCS8vIFRoZSBESFRNTCBpbml0aWFsaXphdGlvbiBmbGFnLgotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemVkOwotCi0JLy8gVGhlIGluaXRpYWwgZm9jdXMuCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZWRXaXRoRm9jdXM7Ci0KLQkvLyBUaGUgY29udHJvbCdzIGluaXRpYWwgdGV4dC4gVGhpcyBpcyB1c2VkIHRvIGNhY2hlIHRoZSBIVE1MIHNvdXJjZSBwYXNzZWQKLQkvLyBpbiB2aWEgc2V0VGV4dCgpd2hpbGUgdGhlIERIVE1MIGluaXRpYWxpemF0aW9uIGlzIGhhcHBlbmluZy4KLQlwcm90ZWN0ZWQgU3RyaW5nIGluaXRpYWxUZXh0OwotCi0JLy8gVGhlIGNvbnRyb2wncyBjdXJyZW50IHRleHQuCi0JcHJvdGVjdGVkIFN0cmluZyBjdXJyZW50VGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgY29udHJvbCdzIGVkaXRhYmxlIGZsYWcuCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWRpdGFibGUgPSB0cnVlOwotCi0JLy8gVGhlIGNvbnRyb2wncyBtb2RpZmljYXRpb24gZmxhZy4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb2RpZmllZDsKLQotCS8vIFRoZSBjb250cm9sJ3MgdGV4dCBhbmQgb2JqZWN0IHNlbGVjdGlvbiBmbGFnLgotCXByb3RlY3RlZCBib29sZWFuIGhhc1NlbGVjdGlvbjsKLQotCS8vIFRoZSBjb250cm9sJ3MgdGV4dCBzZWxlY3Rpb24KLQlwcm90ZWN0ZWQgUmljaFRleHRTZWxlY3Rpb24gcmljaFRleHRTZWxlY3Rpb24gPSBuZXcgUmljaFRleHRTZWxlY3Rpb24oKTsKLQotCS8vIEphdmFTY3JpcHQgY29tbWFuZCBleGVjdXRpb24gc3RhdHVzIGNvZGUuCi0JcHJvdGVjdGVkIGludCBzdGF0dXMgPSAwOwotCi0JLy8gVGhlIEhUTUwgc291cmNlIGZvcm1hdHRlci4KLQlwcm90ZWN0ZWQgSFRNTEZvcm1hdHRlciBodG1sRm9ybWF0dGVyOwotCi0JLy8gVGhlIFNXVCBldmVudCBsaXN0ZW5lcnMuCi0JcHJvdGVjdGVkIE1hcDxMaXN0ZW5lciwgUmljaFRleHRMaXN0ZW5lcj4gbGlzdGVuZXJzOwotCi0JLy8gVGhlIG1vZGlmeSBsaXN0ZW5lcnMuCi0JcHJvdGVjdGVkIExpc3Q8TW9kaWZ5TGlzdGVuZXI+IG1vZGlmeUxpc3RlbmVyczsKLQotCS8vIFRoZSBjb250cm9sJ3MgZWRpdCBmbGFnLgotCXByb3RlY3RlZCBib29sZWFuIG5vdGlmeWluZ01vZGlmeUxpc3RlbmVycyA9IGZhbHNlOwotCi0JLy8gVGhlIGNvbnRyb2xzJ3MgZm9jdXMgZmxhZy4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNGb2N1cyA9IGZhbHNlOwotCi0JLy8gVGhlIGNvbnRyb2xzJ3MgcHJvY2Vzc2luZyBKYXZhU2NyaXB0IGV2ZW50IGZsYWcuCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc2luZ0pTRXZlbnQgPSBmYWxzZTsKLQotCS8vIFRoZSBjb250cm9scydzIHByb2Nlc3NpbmcgTU9ESUZJRUQgSmF2YVNjcmlwdCBldmVudCBmbGFnLgotCXByb3RlY3RlZCBib29sZWFuIGNoZWNraW5nTW9kaWZ5RXZlbnQgPSBmYWxzZTsKLQotCS8vIFRoZSBjb250cm9sJ3MgZmluZC9yZXBsYWNlIHRleHQgYWN0aW9uCi0JcHJvdGVjdGVkIEZpbmRSZXBsYWNlQWN0aW9uIGZpbmRSZXBsYWNlQWN0aW9uOwotCQotCS8vIFRoZSBjb250cm9sJ3MgSUUgZmxhZwotCXByb3RlY3RlZCBib29sZWFuIGlzSUUgPSBmYWxzZTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLiAgTXVzdCBjYWxsIGluaXQoLi4pIGJlZm9yZSB1c2luZyB0aGlzIHdpZGdldC4KLQkgKi8KLQlwdWJsaWMgUmljaFRleHQoKSB7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHN0eWxlIGZvciB0aGlzIGNvbnRyb2wKLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBsaW5rcwotCSAqLwotCXB1YmxpYyBSaWNoVGV4dChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFN0cmluZyBiYXNlUGF0aCkgewotCQlpbml0KHBhcmVudCwgc3R5bGUsIGJhc2VQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgc3R5bGUgZm9yIHRoaXMgY29udHJvbAotCSAqLwotCXB1YmxpYyBSaWNoVGV4dChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJdGhpcyhwYXJlbnQsIHN0eWxlLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFN0cmluZyBiYXNlUGF0aCkgewotCQlkZWJ1ZyA9IFJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQlsb2dnZXIgPSBSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCk7Ci0JCWZpbmRSZXBsYWNlQWN0aW9uID0gbmV3IEZpbmRSZXBsYWNlQWN0aW9uKHRoaXMpOwotCQlydGVGb2xkZXIgPSBSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW5zdGFsbFBhdGgoKSArICJydGUvIjsgLy8kTk9OLU5MUy0xJAkJCi0JCXJ0ZVVSTCA9IFhNTFV0aWwuZXNjYXBlKCJmaWxlOi8vIiArIHJ0ZUZvbGRlcik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0QmFzZVBhdGgoYmFzZVBhdGgpOwotCi0JCXRyeSB7Ci0JCQllZGl0b3IgPSBuZXcgQnJvd3NlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKCJSaWNoVGV4dCIsICJiYXNlUGF0aD0iICsgYmFzZVBhdGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWVkaXRvci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCWVkaXRvci5zZXREYXRhKFBST1BFUlRZX05BTUUsIHRoaXMpOwotCQkJaW5pdENvbnRyb2wocGFyZW50LCBzdHlsZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllZGl0b3IgPSBudWxsOwotCQkJU3RyaW5nIG1zZyA9ICJGYWlsZWQgdG8gY3JlYXRlIFJpY2hUZXh0IHdpdGggYmFzZVBhdGg9IiArIGJhc2VQYXRoOyAvLyROT04tTkxTLTEkCi0JCQlsb2dnZXIubG9nRXJyb3IobXNnLCBlKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBiYXNlIHBhdGggZm9yIHJlc29sdmluZyBsaW5rcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRCYXNlUGF0aChTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aCAhPSBudWxsICYmIHBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpZiAocGF0aC5zdGFydHNXaXRoKEZpbGVVdGlsLlVOQ19QQVRIX1BSRUZJWCkpIHsKLQkJCQliYXNlUGF0aCA9IEZpbGVVdGlsLlVOQ19QQVRIX1BSRUZJWAotCQkJCQkJKyBGaWxlVXRpbC5hcHBlbmRTZXBhcmF0b3IocGF0aC5zdWJzdHJpbmcoCi0JCQkJCQkJCUZpbGVVdGlsLlVOQ19QQVRIX1BSRUZJWF9MRU5HVEgpLnJlcGxhY2UoJ1xcJywKLQkJCQkJCQkJJy8nKSwgIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQliYXNlUGF0aCA9IEZpbGVVdGlsLmFwcGVuZFNlcGFyYXRvcihwYXRoKS5yZXBsYWNlKCdcXCcsICcvJyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQliYXNlUGF0aCA9IEZpbGVVdGlsLmFwcGVuZFNlcGFyYXRvcihERUZBVUxUX0JBU0VfUEFUSCkucmVwbGFjZSgKLQkJCQkJJ1xcJywgJy8nKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHN0eWxlIGZvciB0aGlzIGNvbnRyb2wKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIHdoZW4gYW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoaWxlIGluaXRpYWx6aW5nIHRoaXMgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlhZGRTdGF0dXNUZXh0TGlzdGVuZXIoKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKCJpbml0IiwgImFkZGVkIHN0YXR1cyB0ZXh0IGxpc3RlbmVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQlTdHJpbmcgZWRpdG9ySFRNTCA9IGdlbmVyYXRlRWRpdG9ySFRNTCgpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImluaXQiLCAiZ2VuZXJhdGVkIGVkaXRvciBIVE1MIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQllZGl0b3Iuc2V0VGV4dChlZGl0b3JIVE1MKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKCJpbml0IiwgImxvYWRlZCBlZGl0b3IgSFRNTCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJY29udGV4dE1lbnUgPSBuZXcgTWVudShwYXJlbnQuZ2V0U2hlbGwoKSwgU1dULlBPUF9VUCk7Ci0JCQllZGl0b3Iuc2V0TWVudShjb250ZXh0TWVudSk7Ci0JCQlmaWxsQ29udGV4dE1lbnUoY29udGV4dE1lbnUpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImluaXQiLCAiYWRkZWQgY29udGV4dCBtZW51Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQlhZGRMaXN0ZW5lcnMoKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKCJpbml0IiwgImFkZGVkIGxpc3RlbmVycyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJaHRtbEZvcm1hdHRlciA9IG5ldyBIVE1MRm9ybWF0dGVyKCk7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlwcmludERlYnVnTWVzc2FnZSgiaW5pdCIsICJpbnN0YW50aWF0ZWQgSFRNTEZvcm1hdHRlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWVkaXRvciA9IG51bGw7Ci0JCQlkaXNwb3NlKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEByZXR1cm4gdGhpcyByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBlZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGF5b3V0IGRhdGEuCi0JICogCi0JICogQHBhcmFtIGxheW91dERhdGEKLQkgKiAgICAgICAgICAgIHRoZSBsYXlvdXQgZGF0YSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXlvdXREYXRhKE9iamVjdCBsYXlvdXREYXRhKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXlvdXQgZGF0YS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoaXMgY29udHJvbCdzIGxheW91dCBkYXRhCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRMYXlvdXREYXRhKCkgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCXJldHVybiBlZGl0b3IuZ2V0TGF5b3V0RGF0YSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldHMgZm9jdXMgdG8gdGhpcyBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpZiAoZGVidWcpIHsKLQkJCXByaW50RGVidWdNZXNzYWdlKCJzZXRGb2N1cywgZWRpdGFibGU9IiArIGVkaXRhYmxlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJaWYgKGluaXRpYWxpemVkKSB7Ci0JCQkJaWYgKCFQbGF0Zm9ybS5nZXRPUygpLmVxdWFscygid2luMzIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIFdvcmthcm91bmQgZm9yIE1vemlsbGEgYW5kIEZpcmVmb3ggcmljaCB0ZXh0IGVkaXRvciBmb2N1cwotCQkJCQkvLyBpc3N1ZS4KLQkJCQkJZWRpdG9yLnNldEZvY3VzKCk7Ci0JCQkJfQotCQkJCWV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRk9DVVMpOwotCQkJCWhhc0ZvY3VzID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5pdGlhbGl6ZWRXaXRoRm9jdXMgPSB0cnVlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGVsbHMgdGhlIGNvbnRyb2wgaXQgZG9lcyBub3QgaGF2ZSBmb2N1cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCbHVyKCkgewotCQlpZiAoZGVidWcpIHsKLQkJCXByaW50RGVidWdNZXNzYWdlKCJzZXRCbHVyLCBlZGl0YWJsZT0iICsgZWRpdGFibGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQlpZiAoaW5pdGlhbGl6ZWQpIHsKLQkJCQloYXNGb2N1cyA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQlpbml0aWFsaXplZFdpdGhGb2N1cyA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBjb250cm9sIGhhcyBmb2N1cy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY29udHJvbCBoYXMgdGhlIHVzZXItaW50ZXJmYWNlIGZvY3VzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJcmV0dXJuIGhhc0ZvY3VzOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIHRleHQgYW5kIGltYWdlIGxpbmtzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgbGlua3MgaW4gdGhpcyBjb250cm9sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYXNlUGF0aCgpIHsKLQkJcmV0dXJuIGJhc2VQYXRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJhc2UgVVJMIG9mIHRoZSByaWNoIHRleHQgY29udHJvbCB3aG9zZSBjb250ZW50IHdhcyBsYXN0Ci0JICogY29waWVkIHRvIHRoZSBjbGlwYm9hcmQuCi0JICogCi0JICogQHJldHVybiB0aGUgYmFzZSBVUkwgb2YgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBVUkwgZ2V0Q29weVVSTCgpIHsKLQkJcmV0dXJuIGNvcHlVUkw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYmFzZSBVUkwgb2YgdGhlIHJpY2ggdGV4dCBjb250cm9sIHdob3NlIGNvbnRlbnQgd2FzIGxhc3QgY29waWVkCi0JICogdG8gdGhlIGNsaXBib2FyZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3B5VVJMKCkgewotCQl0cnkgewotCQkJY29weVVSTCA9IG5ldyBGaWxlKGJhc2VQYXRoKS50b1VSTCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJY29weVVSTCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlZGl0YWJsZSBzdGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50IGlzIGVkaXRhYmxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RWRpdGFibGUoKSB7Ci0JCXJldHVybiBlZGl0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBlZGl0YWJsZSBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdGFibGUKLQkgKiAgICAgICAgICAgIHRoZSBlZGl0YWJsZSBzdGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJdGhpcy5lZGl0YWJsZSA9IGVkaXRhYmxlOwotCQlpZiAoaW5pdGlhbGl6ZWQpIHsKLQkJCWV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRURJVEFCTEUsICIiICsgZWRpdGFibGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgY29udGVudCBoYXMgYmVlbiBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50IGhhcyBiZWVuIG1vZGlmaWVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0TW9kaWZpZWQoKSB7Ci0JCXJldHVybiBtb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2RpZmllZCBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kaWZpZWQKLQkgKiAgICAgICAgICAgIHRoZSBtb2RpZmllZCBzdGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVkKGJvb2xlYW4gbW9kaWZpZWQpIHsKLQkJdGhpcy5tb2RpZmllZCA9IG1vZGlmaWVkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJpY2ggdGV4dCBjb250ZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJpY2ggdGV4dCBjb250ZW50IGZvcm1hdHRlZCBpbiBhIG1hcmt1cCBsYW5ndWFnZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsICYmIGluaXRpYWxpemVkKSB7Ci0JCQl0cnkgewotCQkJCWV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5HRVRfVEVYVCk7Ci0JCQkJaWYgKGN1cnJlbnRUZXh0ICE9IG51bGwgJiYgY3VycmVudFRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWN1cnJlbnRUZXh0ID0gY3VycmVudFRleHQucmVwbGFjZUFsbCgKLQkJCQkJCQkiPFA+Jm5ic3A7PC9QPiIsICI8YnIvPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkKLQkJCQkJY3VycmVudFRleHQgPSB0aWR5VGV4dChjdXJyZW50VGV4dCk7Ci0JCQkJCWN1cnJlbnRUZXh0ID0gZm9ybWF0SFRNTChjdXJyZW50VGV4dCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3VycmVudFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImdldFRleHQiLCAidGV4dD0iLCBjdXJyZW50VGV4dCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlyZXR1cm4gY3VycmVudFRleHQ7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdEhUTUwoU3RyaW5nIHRleHQpIHsKLQkJU3RyaW5nIGZvcm1hdHRlZFRleHQ7Ci0JCXRyeSB7Ci0JCQkvLyBDYWxsIEpUaWR5IHRvIGZvcm1hdCB0aGUgc291cmNlIHRvIFhIVE1MLgotCQkJZm9ybWF0dGVkVGV4dCA9IGh0bWxGb3JtYXR0ZXIuZm9ybWF0SFRNTCh0ZXh0KTsKLQkJCWlmIChodG1sRm9ybWF0dGVyLmdldExhc3RFcnJvclN0cigpICE9IG51bGwpIHsKLQkJCQlsb2dnZXIubG9nRXJyb3IoaHRtbEZvcm1hdHRlci5nZXRMYXN0RXJyb3JTdHIoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZm9ybWF0dGVkVGV4dDsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcmljaCB0ZXh0IGNvbnRlbnQuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSByaWNoIHRleHQgY29udGVudCBmb3JtYXR0ZWQgaW4gYSBtYXJrdXAgbGFuZ3VhZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoInNldFRleHQiLCAidGV4dD0iLCB0ZXh0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCVN0cmluZyBuZXdUZXh0ID0gdGV4dDsKLQkJCWlmIChuZXdUZXh0ICE9IG51bGwpIHsKLQkJCQluZXdUZXh0ID0gdGlkeVRleHQobmV3VGV4dCk7Ci0JCQkJLy8gQ2FsbCBKVGlkeSB0byBmb3JtYXQgdGhlIHNvdXJjZSB0byBYSFRNTC4KLQkJCQluZXdUZXh0ID0gZm9ybWF0SFRNTChuZXdUZXh0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmV3VGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmIChpbml0aWFsaXplZCkgewotCQkJCW1vZGlmaWVkID0gIW5ld1RleHQuZXF1YWxzKGN1cnJlbnRUZXh0KTsKLQkJCX0KLQkJCWluaXRpYWxUZXh0ID0gbmV3VGV4dDsKLQkJCWlmIChpbml0aWFsVGV4dC5lcXVhbHMoIiIpICYmICFpc0lFKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbml0aWFsVGV4dCA9ICI8YnIgLz4iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJInNldFRleHQiLCAibW9kaWZpZWQ9IiArIG1vZGlmaWVkICsgIiwgbmV3VGV4dD0iLCBuZXdUZXh0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQotCQkJaWYgKGluaXRpYWxpemVkKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlNFVF9URVhULCBuZXdUZXh0KTsKLQkJCQkJZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlNFVF9FRElUQUJMRSwgIiIgKyBlZGl0YWJsZSk7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQotCQkJY3VycmVudFRleHQgPSBuZXdUZXh0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVzdG9yZXMgdGhlIHJpY2ggdGV4dCBjb250ZW50IGJhY2sgdG8gdGhlIGluaXRpYWwgdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgcmVzdG9yZVRleHQoKSB7Ci0JCXNldFRleHQoaW5pdGlhbFRleHQpOwotCQltb2RpZmllZCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlbGVjdGVkIHRleHQgb3IgPGNvZGU+IiI8L2NvZGU+IGlmIHRoZXJlIGlzIG5vCi0JICogICAgICAgICBoYXNTZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdGVkVGV4dCgpIHsKLQkJLy8gZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkdFVF9TRUxFQ1RFRF9URVhUKTsKLQkJcmV0dXJuIHJpY2hUZXh0U2VsZWN0aW9uLmdldFRleHQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQjZ2V0U2VsZWN0ZWQoKQotCSAqLwotCXB1YmxpYyBSaWNoVGV4dFNlbGVjdGlvbiBnZXRTZWxlY3RlZCgpIHsKLQkJcmV0dXJuIHJpY2hUZXh0U2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXBwbGljYXRpb24gc3BlY2lmaWMgcHJvcGVydHkgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGhhcyBub3QKLQkgKiAgICAgICAgIGJlZW4gc2V0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXREYXRhKFN0cmluZyBrZXkpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3IuZ2V0RGF0YShrZXkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldHMgYW4gYXBwbGljYXRpb24gc3BlY2lmaWMgcHJvcGVydHkgbmFtZSBhbmQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5zZXREYXRhKGtleSwgdmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIEphdmFTY3JpcHQuCi0JICogCi0JICogQHBhcmFtIHNjcmlwdAotCSAqICAgICAgICAgICAgdGhlIEphdmFTY3JpcHQgdG8gZXhlY3V0ZQotCSAqIEByZXR1cm4gYSBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgZXhlY3V0ZWQgc2NyaXB0Ci0JICovCi0JcHJvdGVjdGVkIGludCBleGVjdXRlKGZpbmFsIFN0cmluZyBzY3JpcHQpIHsKLQkJc3RhdHVzID0gMDsKLQkJaWYgKGVkaXRvciAhPSBudWxsICYmIHNjcmlwdCAhPSBudWxsICYmIHNjcmlwdC5sZW5ndGgoKSA+IDApIHsKLQkJCWZpbmFsIFN0cmluZyBzY3JpcHRUb1J1biA9ICJydGUuIiArIHNjcmlwdDsKLQkJCXRyeSB7Ci0JCQkJaWYgKCFpc0lFICYmIHByb2Nlc3NpbmdKU0V2ZW50KSB7Ci0JCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJZWRpdG9yLmV4ZWN1dGUoc2NyaXB0VG9SdW4pOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9IGVsc2UgewotCQkJCQllZGl0b3IuZXhlY3V0ZShzY3JpcHRUb1J1bik7Ci0JCQkJfQotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlwcmludERlYnVnTWVzc2FnZSgiZXhlY3V0ZSIsIHNjcmlwdFRvUnVuKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBtc2cgPSAiRmFpbGVkIHRvIGV4ZWN1dGUgIiArIHNjcmlwdDsgLy8kTk9OLU5MUy0xJAotCQkJCWxvZ2dlci5sb2dFcnJvcihtc2csIGUpOwotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlwcmludERlYnVnTWVzc2FnZSgiZXhlY3V0ZSIsIG1zZyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gcmljaCB0ZXh0IGNvbW1hbmQuIFRoZSBzdXBwb3J0ZWQgY29tbWFuZCBzdHJpbmdzIGFyZQotCSAqIGRlZmluZWQgaW4gPGNvZGU+UmljaFRleHRDb21tYW5kPGNvZGU+LgotCSAqIAotCSAqIEBwYXJhbQljb21tYW5kCQlhIHJpY2ggdGV4dCBjb21tYW5kIHN0cmluZy4KLQkgKiBAcmV0dXJuCWEgc3RhdHVzIGNvZGUgcmV0dXJuZWQgYnkgdGhlIGV4ZWN1dGVkIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgaW50IGV4ZWN1dGVDb21tYW5kKFN0cmluZyBjb21tYW5kKSB7Ci0JCXN0YXR1cyA9IDA7Ci0JCWlmIChjb21tYW5kICE9IG51bGwgJiYgY29tbWFuZC5lcXVhbHMoUmljaFRleHRDb21tYW5kLkNMRUFSX0NPTlRFTlQpKSB7Ci0JCQlTdHJpbmcgb2xkSW5pdGlhbFRleHQgPSBpbml0aWFsVGV4dDsKLQkJCXNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQlpbml0aWFsVGV4dCA9IG9sZEluaXRpYWxUZXh0OwotCQkJc3RhdHVzID0gMTsKLQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCW5vdGlmeU1vZGlmeUxpc3RlbmVycygpOwotCQl9IGVsc2UgewotCQkJc3RhdHVzID0gZXhlY3V0ZShjb21tYW5kICsgIigpOyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gcmljaCB0ZXh0IGNvbW1hbmQgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIuIFRoZQotCSAqIHN1cHBvcnRlZCBjb21tYW5kIHN0cmluZ3MgYXJlIGRlZmluZWQgaW4gPGNvZGU+UmljaFRleHRDb21tYW5kPGNvZGU+LgotCSAqIAotCSAqIEBwYXJhbQljb21tYW5kCQlhIHJpY2ggdGV4dCBjb21tYW5kIHN0cmluZwotCSAqIEBwYXJhbQlwYXJhbQkJYSBwYXJhbWV0ZXIgZm9yIHRoZSBjb21tYW5kIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybglhIHN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IHRoZSBleGVjdXRlZCBjb21tYW5kCi0JICovCi0JcHVibGljIGludCBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCwgU3RyaW5nIHBhcmFtKSB7Ci0JCWlmIChwYXJhbSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCk7Ci0JCX0KLQkJcmV0dXJuIGV4ZWN1dGUoY29tbWFuZCArICIoJyIgKyBmb3JtYXRUZXh0KHBhcmFtKSArICInKTsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIHJpY2ggdGV4dCBjb21tYW5kIHdpdGggYW4gYXJyYXkgb2YgcGFyYW1ldGVycy4gVGhlCi0JICogc3VwcG9ydGVkIGNvbW1hbmQgc3RyaW5ncyBhcmUgZGVmaW5lZCBpbiA8Y29kZT5SaWNoVGV4dENvbW1hbmQ8Y29kZT4uCi0JICogCi0JICogQHBhcmFtCWNvbW1hbmQJCWEgcmljaCB0ZXh0IGNvbW1hbmQgc3RyaW5nCi0JICogQHBhcmFtCXBhcmFtcwkJYW4gYXJyYXkgb2YgcGFyYW1ldGVycyBmb3IgdGhlIGNvbW1hbmQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuCWEgc3RhdHVzIGNvZGUgcmV0dXJuZWQgYnkgdGhlIGV4ZWN1dGVkIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgaW50IGV4ZWN1dGVDb21tYW5kKFN0cmluZyBjb21tYW5kLCBTdHJpbmdbXSBwYXJhbXMpIHsKLQkJaWYgKHBhcmFtcyA9PSBudWxsIHx8IHBhcmFtcy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IHBhcmFtc0xlbmd0aCA9IHBhcmFtcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zTGVuZ3RoOyBpKyspIHsKLQkJCXNiLmFwcGVuZCgnXCcnKS5hcHBlbmQoZm9ybWF0VGV4dChwYXJhbXNbaV0pKS5hcHBlbmQoJ1wnJyk7Ci0JCQlpZiAoaSA8IHBhcmFtc0xlbmd0aCAtIDEpIHsKLQkJCQlzYi5hcHBlbmQoJywnKTsKLQkJCX0KLQkJfQotCQlTdHJpbmcgcGFyYW0gPSBzYi50b1N0cmluZygpOwotCQlyZXR1cm4gZXhlY3V0ZShjb21tYW5kICsgIigiICsgcGFyYW0gKyAiKTsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgdGhlIG9wZXJhdGluZyBzeXN0ZW0gcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGUgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoY29udGV4dE1lbnUgIT0gbnVsbCAmJiAhY29udGV4dE1lbnUuaXNEaXNwb3NlZCgpKSB7Ci0JCQljb250ZXh0TWVudS5kaXNwb3NlKCk7Ci0JCQljb250ZXh0TWVudSA9IG51bGw7Ci0JCX0KLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlsaXN0ZW5lcnMuY2xlYXIoKTsKLQkJCWxpc3RlbmVycyA9IG51bGw7Ci0JCX0KLQkJaWYgKG1vZGlmeUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQltb2RpZnlMaXN0ZW5lcnMuY2xlYXIoKTsKLQkJCW1vZGlmeUxpc3RlbmVycyA9IG51bGw7Ci0JCX0KLQkJaWYgKGh0bWxGb3JtYXR0ZXIgIT0gbnVsbCkgewotCQkJaHRtbEZvcm1hdHRlciA9IG51bGw7Ci0JCX0KLQkJaWYgKHRoaXMuZmluZFJlcGxhY2VBY3Rpb24gIT0gbnVsbCkgewotCQkJdGhpcy5maW5kUmVwbGFjZUFjdGlvbi5kaXNwb3NlKCk7Ci0JCQl0aGlzLmZpbmRSZXBsYWNlQWN0aW9uID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgY29udHJvbCBoYXMgYmVlbiBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY29udHJvbCBpcyBkaXNwb3NlZCBzdWNjZXNzZnVsbHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc3Bvc2VkKCkgewotCQlyZXR1cm4gZWRpdG9yLmlzRGlzcG9zZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2RpZnkgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIGZvciByZXRyaWV2aW5nIHRoZSBtb2RpZnkgbGlzdGVuZXJzCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPE1vZGlmeUxpc3RlbmVyPiBnZXRNb2RpZnlMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBtb2RpZnlMaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkIHdoZW4KLQkgKiBrZXlzIGFyZSBwcmVzc2VkIGFuZCByZWxlYXNlZCB3aXRoaW4gdGhpcyBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEtleUxpc3RlbmVyKEtleUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLmFkZEtleUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4ga2V5cyBhcmUgcHJlc3NlZCBhbmQgcmVsZWFzZWQgd2l0aGluIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlS2V5TGlzdGVuZXIoS2V5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3IucmVtb3ZlS2V5TGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZCB3aGVuCi0JICogdGhlIGNvbnRlbnQgb2YgdGhpcyBjb250cm9sIGlzIG1vZGlmaWVkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCAmJiBsaXN0ZW5lciAhPSBudWxsCi0JCQkJJiYgIW1vZGlmeUxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCW1vZGlmeUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkCi0JICogd2hlbiB0aGUgY29udGVudCBvZiB0aGlzIGNvbnRyb2wgaXMgbW9kaWZpZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCAmJiBsaXN0ZW5lciAhPSBudWxsCi0JCQkJJiYgbW9kaWZ5TGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJbW9kaWZ5TGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZlZCB3aGVuCi0JICogdGhpcyBjb250cm9sIGlzIGRpc3Bvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3IuYWRkRGlzcG9zZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4gdGhpcyBjb250cm9sIGlzIGRpc3Bvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVEaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkIHdoZW4KLQkgKiBoZWxwIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGZvciB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkSGVscExpc3RlbmVyKEhlbHBMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5hZGRIZWxwTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkCi0JICogd2hlbiBoZWxwIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGZvciB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUhlbHBMaXN0ZW5lcihIZWxwTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3IucmVtb3ZlSGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmVkIHdoZW4KLQkgKiBhbiBldmVudCBvZiB0aGUgZ2l2ZW4gdHlwZSBvY2N1cnMgd2l0aGluIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGV2ZW50IG9jY3VycwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKGludCBldmVudFR5cGUsIExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCAmJiAhbGlzdGVuZXJzLmNvbnRhaW5zS2V5KGxpc3RlbmVyKSkgewotCQkJaWYgKGV2ZW50VHlwZSAhPSBTV1QuU0VMRUNURUQpIHsKLQkJCQlpZiAoZWRpdG9yQ29udHJvbCA9PSBudWxsCi0JCQkJCQl8fCAoZXZlbnRUeXBlICE9IFNXVC5BY3RpdmF0ZQotCQkJCQkJCQkmJiBldmVudFR5cGUgIT0gU1dULkRlYWN0aXZhdGUKLQkJCQkJCQkJJiYgZXZlbnRUeXBlICE9IFNXVC5Gb2N1c0luICYmIGV2ZW50VHlwZSAhPSBTV1QuRm9jdXNPdXQpKSB7Ci0JCQkJCWVkaXRvci5hZGRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTsKLQkJCQl9Ci0JCQl9Ci0JCQlsaXN0ZW5lcnMucHV0KGxpc3RlbmVyLCBuZXcgUmljaFRleHRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmVkCi0JICogd2hlbiBhbiBldmVudCBvZiB0aGUgZ2l2ZW4gdHlwZSBvY2N1cnMgd2l0aGluIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZCB3aGVuIHRoZSBldmVudAotCSAqICAgICAgICAgICAgb2NjdXJzCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoaW50IGV2ZW50VHlwZSwgTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsICYmIGxpc3RlbmVycy5jb250YWluc0tleShsaXN0ZW5lcikpIHsKLQkJCWlmIChlZGl0b3JDb250cm9sID09IG51bGwKLQkJCQkJfHwgKGV2ZW50VHlwZSAhPSBTV1QuQWN0aXZhdGUKLQkJCQkJCQkmJiBldmVudFR5cGUgIT0gU1dULkRlYWN0aXZhdGUKLQkJCQkJCQkmJiBldmVudFR5cGUgIT0gU1dULkZvY3VzSW4gJiYgZXZlbnRUeXBlICE9IFNXVC5Gb2N1c091dCkpIHsKLQkJCQllZGl0b3IucmVtb3ZlTGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7Ci0JCQl9Ci0JCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV2ZW50IGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiBhbiBpdGVyYXRvciBmb3IgcmV0cmlldmluZyB0aGUgZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMKLQkgKiAgICAgICAgIGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8UmljaFRleHRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gbGlzdGVuZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbGlzdGVuZXIgdG8gbW9uaXRvciBldmVudHMgYW5kIHN0YXR1cyBzZW50IGJ5IHRoZSB1bmRlcmx5aW5nCi0JICogREhUTUwgZWRpdG9yLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQkJZWRpdG9yLmFkZFN0YXR1c1RleHRMaXN0ZW5lcihuZXcgU3RhdHVzVGV4dExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChTdGF0dXNUZXh0RXZlbnQgZXZlbnQpIHsKLQkJCQlTdHJpbmcgZXZlbnRUZXh0ID0gZXZlbnQudGV4dDsKLQkJCQlpbnQgZXZlbnRUZXh0TGVuZ3RoID0gZXZlbnRUZXh0Lmxlbmd0aCgpOwotCQkJCWlmIChldmVudFRleHQuc3RhcnRzV2l0aChTVEFUVVNfUFJFRklYKQotCQkJCQkJJiYgZXZlbnRUZXh0TGVuZ3RoID4gU1RBVFVTX1BSRUZJWF9MRU5HVEgpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXByb2Nlc3NpbmdKU0V2ZW50ID0gdHJ1ZTsKLQkJCQkJCWludCBlbmRTdGF0dXNJbmRleCA9IFNUQVRVU19QUkVGSVhfTEVOR1RIICsgMTsKLQkJCQkJCWlmIChldmVudFRleHQubGVuZ3RoKCkgPiBTVEFUVVNfUFJFRklYX0xFTkdUSCArIDEKLQkJCQkJCQkJJiYgQ2hhcmFjdGVyLmlzRGlnaXQoZXZlbnRUZXh0Ci0JCQkJCQkJCQkJLmNoYXJBdChlbmRTdGF0dXNJbmRleCkpKSB7Ci0JCQkJCQkJZW5kU3RhdHVzSW5kZXgrKzsKLQkJCQkJCX0KLQkJCQkJCWludCBzdGF0dXNUeXBlID0gSW50ZWdlci5wYXJzZUludChldmVudFRleHQuc3Vic3RyaW5nKAotCQkJCQkJCQlTVEFUVVNfUFJFRklYX0xFTkdUSCwgZW5kU3RhdHVzSW5kZXgpKTsKLQkJCQkJCXN3aXRjaCAoc3RhdHVzVHlwZSkgewotCQkJCQkJY2FzZSBTVEFUVVNfTk9QOgotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTVEFUVVNfSU5JVElBTElaRUQ6Ci0JCQkJCQkJaWYgKCFpbml0aWFsaXplZCkgewotCQkJCQkJCQlpbml0aWFsaXplZCA9IHRydWU7Ci0JCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoCi0JCQkJCQkJCQkJCSJzdGF0dXNUZXh0TGlzdGVuZXIiLCAiU1RBVFVTX0lOSVRJQUxJWkVEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmICghUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoIndpbjMyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJLy8gV29ya2Fyb3VuZCBNb3ppbGxhJ2EgSUZSQU1FCi0JCQkJCQkJCQkvLyBoZWlnaHQgaXNzdWUuCi0JCQkJCQkJCQlleGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU0VUX0hFSUdIVCwKLQkJCQkJCQkJCQkJIiIgKyBlZGl0b3IuZ2V0Qm91bmRzKCkuaGVpZ2h0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfVEVYVCwKLQkJCQkJCQkJCQljdXJyZW50VGV4dCk7Ci0JCQkJCQkJCWlmIChpbml0aWFsaXplZFdpdGhGb2N1cykgewotCQkJCQkJCQkJc2V0Rm9jdXMoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAoIWVkaXRhYmxlKSB7Ci0JCQkJCQkJCQlleGVjdXRlQ29tbWFuZCgKLQkJCQkJCQkJCQkJUmljaFRleHRDb21tYW5kLlNFVF9FRElUQUJMRSwKLQkJCQkJCQkJCQkJIiIgKyBlZGl0YWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX01PRElGSUVEOgotCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCQkJCQkic3RhdHVzVGV4dExpc3RlbmVyIiwgIlNUQVRVU19NT0RJRklFRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl9Ci0JCQkJCQkJY2hlY2tNb2RpZnkoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX0dFVF9URVhUOgotCQkJCQkJCWlmIChldmVudFRleHRMZW5ndGggPj0gU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAyKSB7Ci0JCQkJCQkJCWN1cnJlbnRUZXh0ID0gZXZlbnRUZXh0Ci0JCQkJCQkJCQkJLnN1YnN0cmluZyhTVEFUVVNfUFJFRklYX0xFTkdUSCArIDIpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWN1cnJlbnRUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJCQkJCSJzdGF0dXNUZXh0TGlzdGVuZXIiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJIlNUQVRVU19HRVRfVEVYVCwgY3VycmVudFRleHQ9IiwgY3VycmVudFRleHQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTVEFUVVNfS0VZX0RPV046Ci0JCQkJCQkJaWYgKGV2ZW50VGV4dExlbmd0aCA+PSBTVEFUVVNfUFJFRklYX0xFTkdUSCArIDIpIHsKLQkJCQkJCQkJU3RyaW5nIGNtZCA9IGV2ZW50VGV4dAotCQkJCQkJCQkJCS5zdWJzdHJpbmcoU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAyKTsKLQkJCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgic3RhdHVzVGV4dExpc3RlbmVyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkiU1RBVFVTX0tFWV9ET1dOLCBjbWQ9IiArIGNtZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAoY21kLmVxdWFscyhSaWNoVGV4dENvbW1hbmQuQ09QWSkpIHsKLQkJCQkJCQkJCXNldENvcHlVUkwoKTsKLQkJCQkJCQkJfSBlbHNlIGlmIChjbWQuZXF1YWxzKFJpY2hUZXh0Q29tbWFuZC5DVVQpKSB7Ci0JCQkJCQkJCQlzZXRDb3B5VVJMKCk7Ci0JCQkJCQkJCQlDdXRBY3Rpb24gYWN0aW9uID0gbmV3IEN1dEFjdGlvbigKLQkJCQkJCQkJCQkJUmljaFRleHQudGhpcyk7Ci0JCQkJCQkJCQlhY3Rpb24uZXhlY3V0ZShSaWNoVGV4dC50aGlzKTsKLQkJCQkJCQkJfSBlbHNlIGlmIChjbWQKLQkJCQkJCQkJCQkuZXF1YWxzKFJpY2hUZXh0Q29tbWFuZC5GSU5EX1RFWFQpKSB7Ci0JCQkJCQkJCQlnZXRGaW5kUmVwbGFjZUFjdGlvbigpLmV4ZWN1dGUoCi0JCQkJCQkJCQkJCVJpY2hUZXh0LnRoaXMpOwotCQkJCQkJCQl9IGVsc2UgaWYgKGNtZC5lcXVhbHMoUmljaFRleHRDb21tYW5kLlBBU1RFKSkgewotCQkJCQkJCQkJUGFzdGVBY3Rpb24gYWN0aW9uID0gbmV3IFBhc3RlQWN0aW9uKAotCQkJCQkJCQkJCQlSaWNoVGV4dC50aGlzKTsKLQkJCQkJCQkJCWFjdGlvbi5leGVjdXRlKFJpY2hUZXh0LnRoaXMpOwotCQkJCQkJCQl9IGVsc2UgaWYgKGNtZC5lcXVhbHMoUmljaFRleHRDb21tYW5kLlNBVkUpKSB7Ci0JCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpCi0JCQkJCQkJCQkJCS5kb1NhdmUobnVsbCk7Ci0JCQkJCQkJCX0gZWxzZSBpZiAoY21kLmVxdWFscyhSaWNoVGV4dENvbW1hbmQuU0FWRV9BTEwpKSB7Ci0JCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlUGFnZSgpLnNhdmVBbGxFZGl0b3JzKAotCQkJCQkJCQkJCQkJCWZhbHNlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX0tFWV9VUDoKLQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoInN0YXR1c1RleHRMaXN0ZW5lciIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkiU1RBVFVTX0tFWV9VUCwgbW9kaWZpZWQ9IiArIG1vZGlmaWVkKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQljaGVja01vZGlmeSgpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTVEFUVVNfU0VMRUNUX1RFWFQ6Ci0JCQkJCQkJaWYgKGV2ZW50VGV4dExlbmd0aCA+PSBTVEFUVVNfUFJFRklYX0xFTkdUSCArIDIpIHsKLQkJCQkJCQkJU3RyaW5nW10gc3RyaW5ncyA9IGV2ZW50VGV4dC5zdWJzdHJpbmcoCi0JCQkJCQkJCQkJU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAyKS5zcGxpdCgKLQkJCQkJCQkJCQkiXFwkIiwgNSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCXJpY2hUZXh0U2VsZWN0aW9uLnNldEZvbnROYW1lKHN0cmluZ3NbMF0pOwotCQkJCQkJCQkJcmljaFRleHRTZWxlY3Rpb24uc2V0Rm9udFNpemUoc3RyaW5nc1sxXSk7Ci0JCQkJCQkJCQlyaWNoVGV4dFNlbGVjdGlvbi5zZXRCbG9ja1N0eWxlKHN0cmluZ3NbMl0pOwotCQkJCQkJCQkJcmljaFRleHRTZWxlY3Rpb24uc2V0RmxhZ3MoSW50ZWdlcgotCQkJCQkJCQkJCQkucGFyc2VJbnQoc3RyaW5nc1szXSkpOwotCQkJCQkJCQkJcmljaFRleHRTZWxlY3Rpb24uc2V0VGV4dChzdHJpbmdzWzRdKTsKLQkJCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJCQkJCQkic2VsZWN0aW9uU3RhdHVzTGlzdGVuZXIiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSJjdXJyZW50IHNlbGVjdGlvbiBpcz0iICsgcmljaFRleHRTZWxlY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQotCQkJCQkJCQloYXNTZWxlY3Rpb24gPSB0cnVlOwotCQkJCQkJCQlpZiAoaGFzRm9jdXMoKSkgewotCQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKFNXVC5TRUxFQ1RFRCwgbmV3IEV2ZW50KCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcmljaFRleHRTZWxlY3Rpb24uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJaGFzU2VsZWN0aW9uID0gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCQkJCQkic3RhdHVzVGV4dExpc3RlbmVyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSJTVEFUVVNfU0VMRUNUX1RFWFQsIHNlbGVjdGVkVGV4dD0iLCByaWNoVGV4dFNlbGVjdGlvbi5nZXRUZXh0KCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTVEFUVVNfU0VMRUNUX0NPTlRST0w6Ci0JCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCXByaW50RGVidWdNZXNzYWdlKCJzdGF0dXNUZXh0TGlzdGVuZXIiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJIlNUQVRVU19TRUxFQ1RfQ09OVFJPTCwgY29udHJvbCBzZWxlY3RlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWhhc1NlbGVjdGlvbiA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFNUQVRVU19TRUxFQ1RfTk9ORToKLQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoInN0YXR1c1RleHRMaXN0ZW5lciIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkiU1RBVFVTX1NFTEVDVF9OT05FLCBubyBzZWxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQloYXNTZWxlY3Rpb24gPSBmYWxzZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX0VYRUNfQ01EOgotCQkJCQkJCWlmIChldmVudFRleHRMZW5ndGggPj0gU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAzKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlzdGF0dXMgPSBJbnRlZ2VyLnBhcnNlSW50KGV2ZW50VGV4dAotCQkJCQkJCQkJCQkuc3Vic3RyaW5nKAotCQkJCQkJCQkJCQkJCVNUQVRVU19QUkVGSVhfTEVOR1RIICsgMiwKLQkJCQkJCQkJCQkJCQlTVEFUVVNfUFJFRklYX0xFTkdUSCArIDMpKTsKLQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCXN0YXR1cyA9IC0xOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChkZWJ1ZyAmJiBzdGF0dXMgIT0gMSkgewotCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgic3RhdHVzVGV4dExpc3RlbmVyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSJTVEFUVVNfRVhFQ19DTUQsIHN0YXR1cz0iICsgc3RhdHVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX1JFRk9STUFUX0xJTktTOgotCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCQkJCQkic3RhdHVzVGV4dExpc3RlbmVyIiwgIlNUQVRVU19SRUZPUk1BVF9MSU5LUyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKFBsYXRmb3JtLmdldE9TKCkuZXF1YWxzKCJ3aW4zMiIpKSB7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkJCS8vIFdvcmthcm91bmQgdGhlIGRyYWcgYW5kIGRyb3AgaXNzdWUgd2l0aCBEQkNTCi0JCQkJCQkJCS8vIGNoYXJhY3RlcnMuCi0JCQkJCQkJCWlmIChtb2RpZmllZCkgewotCQkJCQkJCQkJc2V0VGV4dChnZXRUZXh0KCkpOwotCQkJCQkJCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWNoZWNrTW9kaWZ5KCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlwcm9jZXNzaW5nSlNFdmVudCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIEhUTUwgc291cmNlIGZvciB0aGUgZWRpdG9yLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIEhUTUwgc291cmNlIGZvciB0aGUgZWRpdG9yCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZW5lcmF0ZUVkaXRvckhUTUwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGVzY2FwZWRCYXNlUGF0aCA9IGJhc2VQYXRoOwotCQlpZiAoZXNjYXBlZEJhc2VQYXRoLnN0YXJ0c1dpdGgoRmlsZVV0aWwuVU5DX1BBVEhfUFJFRklYKSkKLQkJCWVzY2FwZWRCYXNlUGF0aCA9IGVzY2FwZWRCYXNlUGF0aC5yZXBsYWNlRmlyc3QoCi0JCQkJCSJeXFxcXFxcXFwiLCAiXFxcXFxcXFxcXFxcXFxcXCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZXNjYXBlZEJhc2VQYXRoID0gWE1MVXRpbAotCQkJCS5lc2NhcGUoImZpbGU6Ly8iICsgZXNjYXBlZEJhc2VQYXRoLnJlcGxhY2VBbGwoIiciLCAiXFxcXCciKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCVN0cmluZyBlc2NhcGVkUnRlVVRMID0gcnRlVVJMLnJlcGxhY2VBbGwoIiZhcG9zOyIsICIlMjciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJU3RyaW5nQnVmZmVyIHJ0ZVhNTCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJcnRlWE1MLmFwcGVuZCgiPHJ0ZSBpZD1cIiIpLmFwcGVuZCgicnRlIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJLmFwcGVuZCgiXCIgY3NzPVwiIikuYXBwZW5kKGVzY2FwZWRSdGVVVEwgKyAicnRlLmNzcyIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCS5hcHBlbmQoIlwiIGJhc2VVUkw9XCIiKS5hcHBlbmQoZXNjYXBlZEJhc2VQYXRoKSAvLyROT04tTkxTLTEkCi0JCQkJLmFwcGVuZCgiXCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWZvciAoaW50IGkgPSAwO2kgPCBzY3JpcHRFeHRlbnNpb25zLmxlbmd0aDtpKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBleHRlbnNpb24gPSBzY3JpcHRFeHRlbnNpb25zW2ldOwotCQkJZmluYWwgU3RyaW5nIHBhdGggPSBleHRlbnNpb24uZ2V0QXR0cmlidXRlKCJwYXRoIik7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJQnVuZGxlIGNvbnRyaWJ1dG9yID0gUGxhdGZvcm0uZ2V0QnVuZGxlKAotCQkJCQlleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpKTsKLQkJCVVSTCBzY3JpcHRVUkwgPSBGaWxlTG9jYXRvci5maW5kKGNvbnRyaWJ1dG9yLCBuZXcgUGF0aChwYXRoKSwgbnVsbCk7Ci0JCQlzY3JpcHRVUkwgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwoc2NyaXB0VVJMKTsKLQkJCXJ0ZVhNTC5hcHBlbmQoIjxydGVfanMiKTsgLy8kTk9OLU5MUy0xJAotCQkJcnRlWE1MLmFwcGVuZCgiIGpzPVwiIikuYXBwZW5kKHNjcmlwdFVSTC50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJcnRlWE1MLmFwcGVuZCgiXCIvPiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcnRlWE1MLmFwcGVuZCgiPC9ydGU+Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmdXcml0ZXIgcmVzdWx0ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlYU0xUUHJvY2Vzc29yLnRyYW5zZm9ybSgKLQkJCQlydGVGb2xkZXIgKyAicnRlLnhzbCIsIHJ0ZVhNTC50b1N0cmluZygpLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRKYXZhU2NyaXB0RXh0ZW5zaW9ucygpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihyaWNoVGV4dEphdmFTY3JpcHRFeHRlbnNpb25Qb2ludE5hbWUpOwotCQkKLQkJTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGV4dGVuc2lvbnNMaXN0ID0gQXJyYXlzLmFzTGlzdChleHRlbnNpb25zKTsKLQkJQ29sbGVjdGlvbnMuc29ydChleHRlbnNpb25zTGlzdCwgbmV3IENvbXBhcmF0b3I8SUNvbmZpZ3VyYXRpb25FbGVtZW50PigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgbzEsCi0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBvMikgewotCQkJCVN0cmluZyBvcmRlcjEgPSBvMS5nZXRBdHRyaWJ1dGUoIm9yZGVyIik7Ci0JCQkJaWYgKG9yZGVyMSA9PSBudWxsKSBvcmRlcjEgPSAiMCI7Ci0JCQkJU3RyaW5nIG9yZGVyMiA9IG8yLmdldEF0dHJpYnV0ZSgib3JkZXIiKTsKLQkJCQlpZiAob3JkZXIyID09IG51bGwpIG9yZGVyMiA9ICIwIjsKLQkJCQkKLQkJCQlyZXR1cm4gb3JkZXIxLmNvbXBhcmVUbyhvcmRlcjIpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGV4dGVuc2lvbnNMaXN0LnRvQXJyYXkoZXh0ZW5zaW9ucyk7Ci0JfQotCQotCi0JLyoqCi0JICogRmlsbHMgdGhlIGNvbnRleHQgbWVudSB3aXRoIG1lbnUgaXRlbXMuCi0JICogCi0JICogQHBhcmFtIGNvbnRleHRNZW51Ci0JICogICAgICAgICAgICBhIGNvbnRleHQgbWVudSBjb250YWluaW5nIHJpY2ggdGV4dCBhY3Rpb25zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51KE1lbnUgY29udGV4dE1lbnUpIHsKLQkJZmluYWwgTWVudUl0ZW0gY3V0SXRlbSA9IG5ldyBNZW51SXRlbShjb250ZXh0TWVudSwgU1dULlBVU0gpOwotCQljdXRJdGVtLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuY3V0QWN0aW9uX3RleHQpOwotCQljdXRJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDdXRBY3Rpb24gYWN0aW9uID0gbmV3IEN1dEFjdGlvbihSaWNoVGV4dC50aGlzKTsKLQkJCQlhY3Rpb24uZXhlY3V0ZShSaWNoVGV4dC50aGlzKTsKLQkJCX0KLQkJfSk7Ci0JCWZpbmFsIE1lbnVJdGVtIGNvcHlJdGVtID0gbmV3IE1lbnVJdGVtKGNvbnRleHRNZW51LCBTV1QuUFVTSCk7Ci0JCWNvcHlJdGVtLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuY29weUFjdGlvbl90ZXh0KTsKLQkJY29weUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvcHlBY3Rpb24gYWN0aW9uID0gbmV3IENvcHlBY3Rpb24oUmljaFRleHQudGhpcyk7Ci0JCQkJYWN0aW9uLmV4ZWN1dGUoUmljaFRleHQudGhpcyk7Ci0JCQl9Ci0JCX0pOwotCQlmaW5hbCBNZW51SXRlbSBwYXN0ZUl0ZW0gPSBuZXcgTWVudUl0ZW0oY29udGV4dE1lbnUsIFNXVC5QVVNIKTsKLQkJcGFzdGVJdGVtLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMucGFzdGVBY3Rpb25fdGV4dCk7Ci0JCXBhc3RlSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUGFzdGVBY3Rpb24gYWN0aW9uID0gbmV3IFBhc3RlQWN0aW9uKFJpY2hUZXh0LnRoaXMpOwotCQkJCWFjdGlvbi5leGVjdXRlKFJpY2hUZXh0LnRoaXMpOwotCQkJfQotCQl9KTsKLQotCQlmaW5hbCBNZW51SXRlbSBwYXN0ZVBsYWluVGV4dEl0ZW0gPSBuZXcgTWVudUl0ZW0oY29udGV4dE1lbnUsIFNXVC5QVVNIKTsKLQkJcGFzdGVQbGFpblRleHRJdGVtLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMucGFzdGVQbGFpblRleHRBY3Rpb25fdGV4dCk7Ci0JCXBhc3RlUGxhaW5UZXh0SXRlbS5zZXRJbWFnZShSaWNoVGV4dEltYWdlcy5JTUdfUEFTVEVfUExBSU5fVEVYVCk7Ci0JCXBhc3RlUGxhaW5UZXh0SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUGFzdGVQbGFpblRleHRBY3Rpb24gYWN0aW9uID0gbmV3IFBhc3RlUGxhaW5UZXh0QWN0aW9uKAotCQkJCQkJUmljaFRleHQudGhpcyk7Ci0JCQkJYWN0aW9uLmV4ZWN1dGUoUmljaFRleHQudGhpcyk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudUhpZGRlbihNZW51RXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCQlnZXRTZWxlY3RlZFRleHQoKTsKLQkJCQljdXRJdGVtLnNldEVuYWJsZWQoZWRpdGFibGUgJiYgaGFzU2VsZWN0aW9uKTsKLQkJCQljb3B5SXRlbS5zZXRFbmFibGVkKGhhc1NlbGVjdGlvbik7Ci0JCQkJcGFzdGVJdGVtLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJCXBhc3RlUGxhaW5UZXh0SXRlbS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBsaXN0ZW5lcnMgdG8gbWFuYWdlIHRoZSBhY3RpdmF0aW9uIGFuZCBmb2N1cyBldmVudHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQllZGl0b3JDb250cm9sID0gZ2V0Q29udHJvbFNpdGUoZWRpdG9yKTsKLQkJaWYgKGVkaXRvckNvbnRyb2wgIT0gbnVsbCkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoCi0JCQkJCQkiaW5pdCIsICJlZGl0b3JDb250cm9sPSIgKyBlZGl0b3JDb250cm9sLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQkKLQkJCS8vIG9ubHkgSUUgKHdpbjMyKSBoYXMgdGhlIGVkaXRvckNvbnRyb2wgIT0gbnVsbAotCQkJaXNJRSA9IHRydWU7Ci0JCQkKLQkJCWVkaXRvckNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlwcmludERlYnVnTWVzc2FnZSgiYWN0aXZhdGVMaXN0ZW5lciIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJc2V0Rm9jdXMoKTsKLQkJCQkJbm90aWZ5TGlzdGVuZXJzKFNXVC5BY3RpdmF0ZSwgZXZlbnQpOwotCQkJCX0KLQkJCX0pOwotCi0JCQllZGl0b3JDb250cm9sLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlwcmludERlYnVnTWVzc2FnZSgiZGVhY3RpdmF0ZUxpc3RlbmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlzZXRCbHVyKCk7Ci0JCQkJCW5vdGlmeUxpc3RlbmVycyhTV1QuRGVhY3RpdmF0ZSwgZXZlbnQpOwotCQkJCX0KLQkJCX0pOwotCi0JCQllZGl0b3JDb250cm9sLmFkZExpc3RlbmVyKFNXVC5Gb2N1c0luLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlwcmludERlYnVnTWVzc2FnZSgiZm9jdXNJbkxpc3RlbmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlleGVjdXRlQ29tbWFuZCgidXBkYXRlU2VsZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQJCQkJCQotCQkJCQlub3RpZnlMaXN0ZW5lcnMoU1dULkZvY3VzSW4sIGV2ZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJZWRpdG9yQ29udHJvbC5hZGRMaXN0ZW5lcihTV1QuS2V5VXAsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCQlpbnQga2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0JCQkJCWludCBzdGF0ZU1hc2sgPSBldmVudC5zdGF0ZU1hc2s7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoCi0JCQkJCQkJCSJrZXlVcExpc3RlbmVyIiwgImtleUNvZGU9IiArIGtleUNvZGUgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJKyAiLCBzdGF0ZU1hc2s9IiArIHN0YXRlTWFzayArICIsIGVkaXRhYmxlPSIgKyBlZGl0YWJsZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCWlmICgoc3RhdGVNYXNrICYgU1dULkNUUkwpID4gMAotCQkJCQkJCXx8IChzdGF0ZU1hc2sgJiBTV1QuQUxUKSA+IDAKLQkJCQkJCQl8fCAoKHN0YXRlTWFzayAmIFNXVC5TSElGVCkgPiAwICYmIGtleUNvZGUgPT0gc3RhdGVNYXNrKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWlmIChlZGl0YWJsZSkgewotCQkJCQkJc3dpdGNoIChldmVudC5rZXlDb2RlKSB7Ci0JCQkJCQljYXNlIFNXVC5BUlJPV19ET1dOOgotCQkJCQkJY2FzZSBTV1QuQVJST1dfTEVGVDoKLQkJCQkJCWNhc2UgU1dULkFSUk9XX1JJR0hUOgotCQkJCQkJY2FzZSBTV1QuQVJST1dfVVA6Ci0JCQkJCQljYXNlIFNXVC5FTkQ6Ci0JCQkJCQljYXNlIFNXVC5IT01FOgotCQkJCQkJY2FzZSBTV1QuUEFHRV9ET1dOOgotCQkJCQkJY2FzZSBTV1QuUEFHRV9VUDoKLQkJCQkJCWNhc2UgU1dULlRBQjoKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQlkZWZhdWx0OgotCQkJCQkJCWNoZWNrTW9kaWZ5KCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJZWRpdG9yLmFkZExvY2F0aW9uTGlzdGVuZXIobmV3IExvY2F0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCS8vIERlYWN0aXZhdGUgdGhlIGxpbmtzIGluIHRoZSBjb250ZW50IHBhZ2UgaW4gcmVhZG9ubHkKLQkJCQkJLy8gbW9kZS4KLQkJCQkJZXZlbnQuZG9pdCA9IGVkaXRhYmxlOwotCQkJCX0KLQkJCX0pOwotCQl9IGVsc2UgewotCQkJZWRpdG9yLmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImFjdGl2YXRlTGlzdGVuZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXNldEZvY3VzKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWVkaXRvci5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJCWlmIChlLmtleUNvZGUgPT0gU1dULlRBQikgewotCQkJCQkJaWYgKChlLnN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMCkgewotCQkJCQkJCWVkaXRvci50cmF2ZXJzZShTV1QuVFJBVkVSU0VfVEFCX1BSRVZJT1VTKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZWRpdG9yLnRyYXZlcnNlKFNXVC5UUkFWRVJTRV9UQUJfTkVYVCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJaWYgKCFlZGl0YWJsZSkgewotCQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCQkJCWlmICgoZS5zdGF0ZU1hc2sgJiBTV1QuQ1RSTCkgPiAwCi0JCQkJCQkJfHwgKGUuc3RhdGVNYXNrICYgU1dULkFMVCkgPiAwKQotCQkJCQkJcmV0dXJuOwotCQkJCQlpZiAoZWRpdGFibGUpIHsKLQkJCQkJCXN3aXRjaCAoZS5rZXlDb2RlKSB7Ci0JCQkJCQljYXNlIFNXVC5BUlJPV19ET1dOOgotCQkJCQkJY2FzZSBTV1QuQVJST1dfTEVGVDoKLQkJCQkJCWNhc2UgU1dULkFSUk9XX1JJR0hUOgotCQkJCQkJY2FzZSBTV1QuQVJST1dfVVA6Ci0JCQkJCQljYXNlIFNXVC5FTkQ6Ci0JCQkJCQljYXNlIFNXVC5IT01FOgotCQkJCQkJY2FzZSBTV1QuUEFHRV9ET1dOOgotCQkJCQkJY2FzZSBTV1QuUEFHRV9VUDoKLQkJCQkJCWNhc2UgU1dULlNISUZUOgotCQkJCQkJY2FzZSBTV1QuVEFCOgotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQljaGVja01vZGlmeSgpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQllZGl0b3IuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlwcmludERlYnVnTWVzc2FnZSgiZGlzcG9zZUxpc3RlbmVyIik7IC8vJE5PTi1OTFMtMSQJCQkJCQkKLQkJCQl9Ci0JCQkJZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQotCQlsaXN0ZW5lcnMgPSBuZXcgSGFzaHRhYmxlPExpc3RlbmVyLCBSaWNoVGV4dExpc3RlbmVyPigpOwotCQltb2RpZnlMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PE1vZGlmeUxpc3RlbmVyPigpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSByaWNoIHRleHQgZXZlbnQgbGlzdGVuZXJzLgotCSAqIAotCSAqIEBwYXJhbSBldmVudFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBldmVudCB0eXBlCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICB0aGUgU1dUIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGludCBldmVudFR5cGUsIEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChub3RpZnlpbmdNb2RpZnlMaXN0ZW5lcnMpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZXZlbnQuZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQkJZXZlbnQud2lkZ2V0ID0gZWRpdG9yOwotCi0JCQlmb3IgKEl0ZXJhdG9yPFJpY2hUZXh0TGlzdGVuZXI+IGkgPSBsaXN0ZW5lcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaQotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSBpLm5leHQoKTsKLQkJCQlpZiAobGlzdGVuZXIuZ2V0RXZlbnRUeXBlKCkgPT0gZXZlbnRUeXBlKSB7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoCi0JCQkJCQkJCSJub3RpZnlMaXN0ZW5lcnMiLCAibm90aWZ5aW5nIGxpc3RlbmVyLCAiICsgbGlzdGVuZXIgKyAiLCBldmVudFR5cGU9IiArIGV2ZW50VHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkvLyROT04tTkxTLTMkCQotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLmdldExpc3RlbmVyKCkuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJCQkibm90aWZ5TGlzdGVuZXJzIiwgIm5vdGlmaWVkIGxpc3RlbmVyLCAiICsgbGlzdGVuZXIgKyAiLCBldmVudFR5cGU9IiArIGV2ZW50VHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkvLyROT04tTkxTLTMkCQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIG1vZGlmeSBsaXN0ZW5lcnMgdGhhdCB0aGUgcmljaCB0ZXh0IGVkaXRvciBjb250ZW50IGhhcwotCSAqIGNoYW5nZWQuCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5TW9kaWZ5TGlzdGVuZXJzKCkgewotCQlub3RpZnlpbmdNb2RpZnlMaXN0ZW5lcnMgPSB0cnVlOwotCi0JCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCWV2ZW50LmRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJZXZlbnQud2lkZ2V0ID0gZWRpdG9yOwotCi0JCWZvciAoSXRlcmF0b3I8TW9kaWZ5TGlzdGVuZXI+IGkgPSBtb2RpZnlMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaQotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lciA9IGkubmV4dCgpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoCi0JCQkJCQkibm90aWZ5TW9kaWZ5TGlzdGVuZXJzIiwgIm5vdGlmeWluZyBsaXN0ZW5lciwgIiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQotCQkJfQotCQkJbGlzdGVuZXIubW9kaWZ5VGV4dChuZXcgTW9kaWZ5RXZlbnQoZXZlbnQpKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJIm5vdGlmeU1vZGlmeUxpc3RlbmVycyIsICJub3RpZmllZCBsaXN0ZW5lciwgIiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQotCQkJfQotCQl9Ci0KLQkJbm90aWZ5aW5nTW9kaWZ5TGlzdGVuZXJzID0gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0I2NoZWNrTW9kaWZ5KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja01vZGlmeSgpIHsKLQkJdHJ5IHsKLQkJCWlmICghY2hlY2tpbmdNb2RpZnlFdmVudCkgewotCQkJCWNoZWNraW5nTW9kaWZ5RXZlbnQgPSB0cnVlOwotCQkJCWlmIChtb2RpZmllZCkgewotCQkJCQlub3RpZnlNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoIWlzSUUgJiYgcHJvY2Vzc2luZ0pTRXZlbnQpIHsKLQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlpZiAoIWdldFRleHQoKS5lcXVhbHMoaW5pdGlhbFRleHQpKSB7Ci0JCQkJCQkJCQltb2RpZmllZCA9IHRydWU7Ci0JCQkJCQkJCQlub3RpZnlNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKCFnZXRUZXh0KCkuZXF1YWxzKGluaXRpYWxUZXh0KSkgewotCQkJCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQkJCQlub3RpZnlNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImNoZWNrTW9kaWZ5IiwgIm1vZGlmaWVkPSIgKyBtb2RpZmllZCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQljaGVja2luZ01vZGlmeUV2ZW50ID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHByb3ZpZGVzIGFuIG9wcG9ydHVuaXR5IGZvciBhIHN1YiBjbGFzcyB0byB0aWR5IHVwIHRoZSByaWNoIHRleHQuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHJpY2ggdGV4dCBlbmNvZGVkIGluIEhUTUwgZm9ybWF0Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0aWR5VGV4dChTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXRzIHRoZSB0ZXh0IGZvciBjb25zdW1wdGlvbiBieSB0aGUgSmF2YVNjcmlwdC9ESFRNTCBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHJpY2ggdGV4dCBlbmNvZGVkIGluIEhUTUwgZm9ybWF0Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmb3JtYXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gdGV4dDsKLQkJfQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgdGV4dFNpemUgPSB0ZXh0Lmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRleHRTaXplOyBpKyspIHsKLQkJCWNoYXIgY2ggPSB0ZXh0LmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJ1xyJzoKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1x0JzoKLQkJCQlyZXN1bHQuYXBwZW5kKCcgJyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcbic6Ci0JCQkJcmVzdWx0LmFwcGVuZChFTkNPREVEX05FV0xJTkUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXCcnOgotCQkJCXJlc3VsdC5hcHBlbmQoRU5DT0RFRF9TSU5HTEVfUVVPVEUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXFwnOgotCQkJCXJlc3VsdC5hcHBlbmQoIlxcXFwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyZXN1bHQuYXBwZW5kKGNoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hpbGQgPGNvZGU+T2xlQ29udHJvbFNpdGU8L2NvZGU+IGNvbnRhaW5lZCB3aXRoaW4gdGhlCi0JICogZ2l2ZW4gPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogICAgICAgICAgICBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gb2JqZWN0LCBwcmVzdW1hYmx5IGEKLQkgKiAgICAgICAgICAgIDxjb2RlPkJyb3dzZXI8L2NvZGU+Ci0JICogQHJldHVybiBhbiA8Y29kZT5PbGVDb250cm9sU2l0ZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgZ2V0Q29udHJvbFNpdGUoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpZiAoUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoIndpbjMyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJQ29udHJvbFtdIGNvbnRyb2xzID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIGNvbnRyb2xDbGFzcyA9IGNvbnRyb2xzW2ldLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCWlmIChjb250cm9sQ2xhc3MuZXF1YWxzKCJvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5XZWJTaXRlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gY29udHJvbHNbaV07Ci0JCQkJfSBlbHNlIGlmIChjb250cm9sc1tpXSBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgewotCQkJCQlyZXR1cm4gZ2V0Q29udHJvbFNpdGUoKENvbXBvc2l0ZSkgY29udHJvbHNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZGVidWcgbWVzc2FnZSB0byB0aGUgY29uc29sZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludERlYnVnTWVzc2FnZShTdHJpbmcgbWV0aG9kLCBTdHJpbmcgbXNnLCBTdHJpbmcgdGV4dCkgewotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzdHJCdWYuYXBwZW5kKCJSaWNoVGV4dFsiKS5hcHBlbmQoZWRpdG9yLmhhbmRsZSkuYXBwZW5kKCddJykgLy8kTk9OLU5MUy0xJAotCQkJCS5hcHBlbmQoJy4nKS5hcHBlbmQobWV0aG9kKTsKLQkJaWYgKG1zZyAhPSBudWxsICYmIG1zZy5sZW5ndGgoKSA+IDApIHsKLQkJCXN0ckJ1Zi5hcHBlbmQoIjogIikuYXBwZW5kKG1zZyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzdHJCdWYuYXBwZW5kKCdcbicpLmFwcGVuZCh0ZXh0KTsKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RyQnVmKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZGVidWcgbWVzc2FnZSB0byB0aGUgY29uc29sZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludERlYnVnTWVzc2FnZShTdHJpbmcgbWV0aG9kLCBTdHJpbmcgbXNnKSB7Ci0JCXByaW50RGVidWdNZXNzYWdlKG1ldGhvZCwgbXNnLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZGVidWcgbWVzc2FnZSB0byB0aGUgY29uc29sZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludERlYnVnTWVzc2FnZShTdHJpbmcgbWV0aG9kKSB7Ci0JCXByaW50RGVidWdNZXNzYWdlKG1ldGhvZCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEZpbmRSZXBsYWNlQWN0aW9uIGdldEZpbmRSZXBsYWNlQWN0aW9uKCkgewotCQlyZXR1cm4gZmluZFJlcGxhY2VBY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmluZFJlcGxhY2VBY3Rpb24oRmluZFJlcGxhY2VBY3Rpb24gZmluZFJlcGxhY2VBY3Rpb24pIHsKLQkJaWYgKGZpbmRSZXBsYWNlQWN0aW9uICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLmZpbmRSZXBsYWNlQWN0aW9uICE9IG51bGwKLQkJCQkJJiYgdGhpcy5maW5kUmVwbGFjZUFjdGlvbiAhPSBmaW5kUmVwbGFjZUFjdGlvbikgewotCQkJCXRoaXMuZmluZFJlcGxhY2VBY3Rpb24uZGlzcG9zZSgpOwotCQkJfQotCQkJdGhpcy5maW5kUmVwbGFjZUFjdGlvbiA9IGZpbmRSZXBsYWNlQWN0aW9uOwotCQkJdGhpcy5maW5kUmVwbGFjZUFjdGlvbi5zZXRSaWNoVGV4dCh0aGlzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldFRleHQodGV4dCk7Ci0JCWluaXRpYWxUZXh0ID0gdGV4dCA9PSBudWxsID8gIiIgOiB0ZXh0OyAvLyROT04tTkxTLTEkCi0JCW1vZGlmaWVkID0gZmFsc2U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5ZjdmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgZWRpdGluZyBjb21tYW5kcyBzdXBwb3J0ZWQgYnkgdGhlIGRlZmF1bHQgcmljaCB0ZXh0IGNvbnRyb2wgYW5kCi0gKiBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRDb21tYW5kIHsKLQotCS8qKgotCSAqIEFkZHMgYSBIVE1MIGZyYWdtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9IVE1MID0gImFkZEhUTUwiOyAvLyROT04tTkxTLTEkCQotCi0JLyoqCi0JICogQWRkcyBhbiBpbWFnZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfSU1BR0UgPSAiYWRkSW1hZ2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBZGRzIGEgaG9yaXpvbnRhbCBsaW5lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9MSU5FID0gImFkZExpbmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBZGRzIGEgbGluay4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfTElOSyA9ICJhZGRMaW5rIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5zZXJ0cyB0ZXh0IG92ZXIgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0VSVF9URVhUID0gImluc2VydFRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBZGRzIGFuIG9yZGVyZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfT1JERVJFRF9MSVNUID0gImFkZE9yZGVyZWRMaXN0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQWRkcyBhIHRhYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9UQUJMRSA9ICJhZGRUYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFkZHMgYW4gdW5vcmRlcmVkIGxpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX1VOT1JERVJFRF9MSVNUID0gImFkZFVub3JkZXJlZExpc3QiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tHUk9VTkRfQ09MT1IgPSAiYmFja0NvbG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgJ2JvbGQnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT0xEID0gImJvbGQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIHJpY2ggdGV4dCBjb250ZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSX0NPTlRFTlQgPSAiY2xlYXJDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29waWVzIHRoZSBzZWxlY3RlZCB0ZXh0IHRvIHRoZSBjbGlwYm9hcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWSA9ICJjb3B5IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3V0cyB0aGUgc2VsZWN0ZWQgdGV4dCB0byB0aGUgY2xpcGJvYXJkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVVCA9ICJjdXQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBEZWxldGVzIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURSA9ICJkZWxldGVUZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRmluZHMgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5EX1RFWFQgPSAiZmluZFRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBHZXRzIHRoZSBIVE1MIHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfVEVYVCA9ICJnZXRUZXh0IjsgLy8kTk9OLU5MUy0xJAkKLQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SR1JPVU5EX0NPTE9SID0gImZvcmVDb2xvciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEZvcm1hdHMgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX0JMT0NLID0gImZvcm1hdEJsb2NrIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfU0VMRUNURURfVEVYVCA9ICJnZXRTZWxlY3RlZFRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRlbnRzIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVCA9ICJpbmRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUb2dnbGVzIHRoZSAnaXRhbGljJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVRBTElDID0gIml0YWxpYyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENlbnRlciBqdXN0aWZpZXMgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlVTVElGWV9DRU5URVIgPSAianVzdGlmeUNlbnRlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEZ1bGx5IGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKVVNUSUZZX0ZVTEwgPSAianVzdGlmeUZ1bGwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBMZWZ0IGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKVVNUSUZZX0xFRlQgPSAianVzdGlmeUxlZnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSaWdodCBqdXN0aWZpZXMgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlVTVElGWV9SSUdIVCA9ICJqdXN0aWZ5UmlnaHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBPdXRkZW50cyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRERU5UID0gIm91dGRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQYXN0ZXMgdGV4dCBmcm9tIHRoZSBjbGlwYm9hcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTVEUgPSAicGFzdGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXBsYWNlcyBhbGwgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBMQUNFX0FMTF9URVhUID0gInJlcGxhY2VBbGxUZXh0IjsgLy8kTk9OLU5MUy0xJAkJCi0KLQkvKioKLQkgKiBSZXBsYWNlcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBMQUNFX1RFWFQgPSAicmVwbGFjZVRleHQiOyAvLyROT04tTkxTLTEkCQkKLQotCS8qKgotCSAqIFJlZG9lcyB0aGUgcHJldmlvdXMgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRURPID0gInJlZG8iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBjdXJyZW50IGZvcm1hdHRpbmcgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFX0ZPUk1BVCA9ICJyZW1vdmVGb3JtYXQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTYXZlcyB0aGUgZWRpdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRSA9ICJzYXZlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2F2ZXMgYWxsIGVkaXRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0FMTCA9ICJzYXZlQWxsIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2VsZWN0cyBhbGwgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfQUxMID0gInNlbGVjdEFsbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNldHMgdGhlIGZvbnQgbmFtZSBmb3IgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX0ZPTlRfTkFNRSA9ICJzZXRGb250TmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNldHMgdGhlIGZvbnQgc2l6ZSBmb3IgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX0ZPTlRfU0laRSA9ICJzZXRGb250U2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNldHMgdGhlIGZvbnQgc3R5bGUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9GT05UX1NUWUxFID0gInNldEZvbnRTdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNldHMgd2hldGhlciB0aGUgY29udGVudCBjYW4gYmUgZWRpdGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9FRElUQUJMRSA9ICJzZXRFZGl0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNldHMgZm9jdXMgdG8gdGhpcyBjb250cm9sLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9GT0NVUyA9ICJzZXRGb2N1cyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNldHMgdGhlIGhlaWdodCBvZiB0aGlzIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX0hFSUdIVCA9ICJzZXRIZWlnaHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZXRzIHRoZSBIVE1MIHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfVEVYVCA9ICJzZXRUZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgJ3N0cmlrZS10aHJvdWdoJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSUtFX1RIUk9VR0ggPSAic3RyaWtlVGhyb3VnaCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRvZ2dsZXMgdGhlIHN1YnNjcmlwdCBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCU0NSSVBUID0gInN1YnNjcmlwdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRvZ2dsZXMgdGhlIHN1cGVyc2NyaXB0IGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUlNDUklQVCA9ICJzdXBlcnNjcmlwdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRvZ2dsZXMgdGhlIHVuZGVybGluZSBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ERVJMSU5FID0gInVuZGVybGluZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFVuZG9lcyB0aGUgcHJldmlvdXMgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRPID0gInVuZG8iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIGxpbmsgdG8gbm9ybWFsIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5MSU5LID0gInVubGluayI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRFZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNmRlY2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLlBhcmFtZXRlcml6ZWRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQ29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5DdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRmluZFJlcGxhY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuUGFzdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuUGFzdGVQbGFpblRleHRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5U2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlTdHJva2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5TV1RLZXlTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyRXh0ZW5zaW9uNjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklVbmRvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklVbmRvTWFuYWdlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0Vmlld2VyVW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WZXJpZnlLZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlZpZXdGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkhUTUxUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRleHRUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuSGVscExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JS2V5QmluZGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkua2V5cy5JQmluZGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkub3BlcmF0aW9ucy5PcGVyYXRpb25IaXN0b3J5QWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5vcGVyYXRpb25zLlJlZG9BY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm9wZXJhdGlvbnMuVW5kb0FjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JQWJzdHJhY3RUZXh0RWRpdG9ySGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JUmVhZE9ubHlEZXBlbmRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JV29ya2JlbmNoQWN0aW9uRGVmaW5pdGlvbklkczsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCByaWNoIHRleHQgZWRpdG9yIGltcGxlbWVudGF0aW9uLgotICogPHA+Ci0gKiBUaGUgZGVmYXVsdCByaWNoIHRleHQgZWRpdG9yIHVzZXMgWEhUTUwgYXMgdGhlIHVuZGVybHlpbmcgbWFya3VwIGxhbmd1YWdlIGZvcgotICogdGhlIHJpY2ggdGV4dCBjb250ZW50LiBJdCBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIDxjb2RlPlZpZXdGb3JtPC9jb2RlPgotICogY29udHJvbCB3aXRoIGEgdG9vbCBiYXIgYXQgdGhlIHRvcCwgYSB0YWIgZm9sZGVyIHRoYXQgY29udGFpbnMgYQotICogPGNvZGU+UmljaFRleHQ8L2NvZGU+IGNvbnRyb2wgZm9yIGVudGVyaW5nIHRoZSByaWNoIHRleHQgY29udGVudCwgYW5kIGEgdGFiCi0gKiBmb2xlciB0aGF0IGNvbnRhaW5zIGEgPGNvZGU+U3R5bGVUZXh0PC9jb2RlPiBjb250cm9sIGZvciB2aWV3aW5nIGFuZAotICogbW9kaWZ5aW5nIHRoZSBYSFRNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmljaCB0ZXh0IGNvbnRlbnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dEVkaXRvciBpbXBsZW1lbnRzIElSaWNoVGV4dEVkaXRvciB7Ci0KLQkvLyBUaGUgSFRNTCB0YWIgbmFtZS4KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1RBQl9OQU1FID0gUmljaFRleHRSZXNvdXJjZXMuaHRtbFRhYl90ZXh0OwotCi0JLy8gSWYgdHJ1ZSwgbG9nIGRlYnVnZ2luZyBpbmZvLgotCXByb3RlY3RlZCBib29sZWFuIGRlYnVnOwotCi0JLy8gVGhlIHBsdWctaW4gbG9nZ2VyLgotCXByb3RlY3RlZCBMb2dnZXIgbG9nZ2VyOwotCi0JLy8gVGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgbGlua3MgKDxocmVmPiwgPGltZz4sIGV0Yy4pLgotCXByb3RlY3RlZCBTdHJpbmcgYmFzZVBhdGg7Ci0KLQkvLyBUaGUgZWRpdG9yIGZvcm0uCi0JcHJvdGVjdGVkIFZpZXdGb3JtIGZvcm07Ci0KLQkvLyBUaGUgZWRpdG9yIHRvb2wgYmFyLgotCXByb3RlY3RlZCBJUmljaFRleHRUb29sQmFyIHRvb2xCYXI7Ci0KLQkvLyBUaGUgZWRpdG9yIGNvbnRlbnQuCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjb250ZW50OwotCi0JLy8gVGhlIGVkaXRvciB0YWIgZm9sZGVyLgotCXByb3RlY3RlZCBDVGFiRm9sZGVyIHRhYkZvbGRlcjsKLQotCS8vIFRoZSByaWNoIHRleHQgdGFiCi0JcHJvdGVjdGVkIENUYWJJdGVtIHJpY2hUZXh0VGFiOwotCi0JLy8gVGhlIEhUTUwgc291cmNlIHRhYgotCXByb3RlY3RlZCBDVGFiSXRlbSBodG1sVGFiOwotCi0JLy8gVGhlIGVtYmVkZGVkIHJpY2ggdGV4dCBjb250cm9sLgotCXByb3RlY3RlZCBJUmljaFRleHQgcmljaFRleHQ7Ci0KLQkvLyBUaGUgdW5kZXJseWluZyBIVE1MIHRleHQgZWRpdG9yLgotCXByb3RlY3RlZCBUZXh0Vmlld2VyIHNvdXJjZVZpZXdlcjsKLQkKLQlwcm90ZWN0ZWQgSURvY3VtZW50IGN1cnJlbnREb2M7Ci0JCi0JLy8gRHJvcCBzdXBwb3J0Ci0JcHJvdGVjdGVkIERyb3BUYXJnZXQgc291cmNlRWRpdERyb3BUYXJnZXQ7Ci0KLQkvLyBIVE1MIGVkaXRvcidzIGNvbnRleHQgbWVudQotCXByb3RlY3RlZCBNZW51IGNvbnRleHRNZW51OwotCi0JLy8gSGFzIHRoZSBIVE1MIHNvdXJjZSBiZWVuIG1vZGlmaWVkPwotCXByb3RlY3RlZCBib29sZWFuIHNvdXJjZU1vZGlmaWVkID0gZmFsc2U7Ci0KLQkvLyBUaGUgZWRpdG9yJ3MgZWRpdGFibGUgZmxhZy4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlZGl0YWJsZSA9IHRydWU7Ci0JCi0JcHJvdGVjdGVkIE9wZXJhdGlvbkhpc3RvcnlBY3Rpb25IYW5kbGVyIHVuZG9BY3Rpb247Ci0JCi0JcHJvdGVjdGVkIE9wZXJhdGlvbkhpc3RvcnlBY3Rpb25IYW5kbGVyIHJlZG9BY3Rpb247Ci0JCi0JcHJvdGVjdGVkIElFZGl0b3JTaXRlIGVkaXRvclNpdGU7Ci0KLQkvKiogVGhlIGFjdGlvbnMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBlZGl0b3IuICovCi0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIElBY3Rpb24+IGZBY3Rpb25zPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElBY3Rpb24+KDEwKTsKLQkKLQkvKiogVGhlIHZlcmlmeSBrZXkgbGlzdGVuZXIgZm9yIGFjdGl2YXRpb24gY29kZSB0cmlnZ2VyaW5nLiAqLwotCXByb3RlY3RlZCBBY3RpdmF0aW9uQ29kZVRyaWdnZXIgZkFjdGl2YXRpb25Db2RlVHJpZ2dlcj0gbmV3IEFjdGl2YXRpb25Db2RlVHJpZ2dlcigpOwotCQotCS8qKiBUaGUgZWRpdG9yJ3MgYWN0aW9uIGFjdGl2YXRpb24gY29kZXMuICovCi0JcHJvdGVjdGVkIExpc3QgZkFjdGl2YXRpb25Db2Rlcz0gbmV3IEFycmF5TGlzdCgyKTsKLQkKLQlmaW5hbCBJVW5kb01hbmFnZXIgdW5kb01hbmFnZXI9IG5ldyBUZXh0Vmlld2VyVW5kb01hbmFnZXIoMTApOwotCQotCS8qKgotCSAqIFRoZSBrZXkgYmluZGluZyBzY29wZXMgb2YgdGhpcyBlZGl0b3IuCi0JICogQHNpbmNlIDIuMQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBmS2V5QmluZGluZ1Njb3BlczsKLQotCQotCXByb3RlY3RlZCBJRG9jdW1lbnRMaXN0ZW5lciBzb3VyY2VFZGl0RG9jdW1lbnRMaXN0ZW5lcj0gbmV3IElEb2N1bWVudExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlzb3VyY2VNb2RpZmllZCA9IHRydWU7Ci0JCQlpZiAocmljaFRleHQgIT0gbnVsbCAmJiByaWNoVGV4dCBpbnN0YW5jZW9mIFJpY2hUZXh0KSB7Ci0JCQkJcmljaFRleHQubm90aWZ5TW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0KLQkvLyBUaGUgZGVhY3RpdmF0ZSBsaXN0ZW5lciBmb3IgdGhlIHNvdXJjZUVkaXQgY29udHJvbC4KLQlwcm90ZWN0ZWQgTGlzdGVuZXIgc291cmNlRWRpdERlYWN0aXZhdGVMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChzb3VyY2VNb2RpZmllZCkgewotCQkJCXVwZGF0ZVJpY2hUZXh0KHNvdXJjZVZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuZ2V0VGV4dCgpKTsKLQkJCQlzZXRNb2RpZmllZCh0cnVlKTsKLQkJCQlzb3VyY2VNb2RpZmllZCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfTsKLQotCS8vIFRoZSBrZXkgbGlzdGVuZXIgZm9yIHRoZSBzb3VyY2VFZGl0IGNvbnRyb2wuCi0JcHJvdGVjdGVkIEtleUxpc3RlbmVyIHNvdXJjZUVkaXRLZXlMaXN0ZW5lciA9IG5ldyBLZXlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWRhcHRlcigKLQkJCQkJSUJpbmRpbmdTZXJ2aWNlLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlciBpbnN0YW5jZW9mIElCaW5kaW5nU2VydmljZSkgewotCQkJCWludCBhY2NlbCA9IFNXVEtleVN1cHBvcnQKLQkJCQkJCS5jb252ZXJ0RXZlbnRUb1VubW9kaWZpZWRBY2NlbGVyYXRvcihlKTsKLQkJCQlLZXlTdHJva2Ugc3Ryb2tlID0gU1dUS2V5U3VwcG9ydAotCQkJCQkJLmNvbnZlcnRBY2NlbGVyYXRvclRvS2V5U3Ryb2tlKGFjY2VsKTsKLQkJCQlLZXlTZXF1ZW5jZSBzZXEgPSBLZXlTZXF1ZW5jZS5nZXRJbnN0YW5jZShzdHJva2UpOwotCQkJCUJpbmRpbmcgYmluZCA9ICgoSUJpbmRpbmdTZXJ2aWNlKSBhZGFwdGVyKS5nZXRQZXJmZWN0TWF0Y2goc2VxKTsKLQkJCQlpZiAoYmluZCAhPSBudWxsKSB7Ci0JCQkJCVBhcmFtZXRlcml6ZWRDb21tYW5kIGNvbW1hbmQgPSBiaW5kCi0JCQkJCQkJLmdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCk7Ci0JCQkJCWlmIChjb21tYW5kICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBjbWRJZCA9IGNvbW1hbmQuZ2V0SWQoKTsKLQkJCQkJCWlmIChjbWRJZCAhPSBudWxsCi0JCQkJCQkJCSYmIGNtZElkCi0JCQkJCQkJCQkJLmVxdWFscygib3JnLmVjbGlwc2UudWkuZWRpdC5maW5kUmVwbGFjZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlyaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpLmV4ZWN1dGUoUmljaFRleHRFZGl0b3IudGhpcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4gIE11c3QgY2FsbCBpbml0KC4uKSBiZWZvcmUgdXNpbmcgdGhpcyB3aWRnZXQuCi0JICovCi0JcHVibGljIFJpY2hUZXh0RWRpdG9yKCkgewotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgZWRpdG9yIHN0eWxlCi0JICovCi0JcHVibGljIFJpY2hUZXh0RWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgSUVkaXRvclNpdGUgZWRpdG9yU2l0ZSkgewotCQl0aGlzKHBhcmVudCwgc3R5bGUsIG51bGwsIGVkaXRvclNpdGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBlZGl0b3Igc3R5bGUKLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGxpbmtzCi0JICovCi0JcHVibGljIFJpY2hUZXh0RWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgU3RyaW5nIGJhc2VQYXRoLAotCQkJSUVkaXRvclNpdGUgZWRpdG9yU2l0ZSkgewotCQlpbml0KHBhcmVudCwgc3R5bGUsIGJhc2VQYXRoLCBlZGl0b3JTaXRlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgU3RyaW5nIGJhc2VQYXRoLAotCQkJSUVkaXRvclNpdGUgZWRpdG9yU2l0ZSkgewotCQl0aGlzLmJhc2VQYXRoID0gYmFzZVBhdGg7Ci0JCXRoaXMuZWRpdG9yU2l0ZSA9IGVkaXRvclNpdGU7Ci0JCWRlYnVnID0gUmljaFRleHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JCWxvZ2dlciA9IFJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKTsKLQkJaW5pdENvbnRyb2wocGFyZW50LCBzdHlsZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBTdHJpbmcgYmFzZVBhdGgpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmluaXQocGFyZW50LCBzdHlsZSwgYmFzZVBhdGgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBlZGl0b3Igc3R5bGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJdHJ5IHsKLQkJCWZvcm0gPSBuZXcgVmlld0Zvcm0ocGFyZW50LCBzdHlsZSk7Ci0JCQlmb3JtLm1hcmdpbkhlaWdodCA9IDA7Ci0JCQlmb3JtLm1hcmdpbldpZHRoID0gMDsKLQotCQkJdG9vbEJhciA9IG5ldyBSaWNoVGV4dFRvb2xCYXIoZm9ybSwgU1dULkZMQVQsIHRoaXMpOwotCi0JCQljb250ZW50ID0gbmV3IENvbXBvc2l0ZShmb3JtLCBTV1QuRkxBVCk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQljb250ZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCQl0YWJGb2xkZXIgPSBjcmVhdGVFZGl0b3JUYWJGb2xkZXIoY29udGVudCwgc3R5bGUpOwotCi0JCQlmb3JtLnNldFRvcENlbnRlcigoKFJpY2hUZXh0VG9vbEJhcil0b29sQmFyKS5nZXRUb29sYmFyTWdyKCkuZ2V0Q29udHJvbCgpKTsKLQkJCWZvcm0uc2V0VG9wTGVmdCgoKFJpY2hUZXh0VG9vbEJhcil0b29sQmFyKS5nZXRUb29sYmFyTWdyQ29tYm8oKS5nZXRDb250cm9sKCkpOwotCQkJZm9ybS5zZXRDb250ZW50KGNvbnRlbnQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZm9ybSBjb250cm9sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZvcm0gY29udHJvbAotCSAqLwotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBmb3JtOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJpY2ggdGV4dCBjb250cm9sIGVtYmVkZGVkIHdpdGhpbiB0aGlzIGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgSVJpY2hUZXh0IGdldFJpY2hUZXh0Q29udHJvbCgpIHsKLQkJcmV0dXJuIHJpY2hUZXh0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxheW91dCBkYXRhLgotCSAqIAotCSAqIEBwYXJhbSBsYXlvdXREYXRhCi0JICogICAgICAgICAgICB0aGUgbGF5b3V0IGRhdGEgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGF5b3V0RGF0YShPYmplY3QgbGF5b3V0RGF0YSkgewotCQlpZiAoZm9ybSAhPSBudWxsKSB7Ci0JCQlmb3JtLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXlvdXQgZGF0YS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlZGl0b3IncyBsYXlvdXQgZGF0YQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TGF5b3V0RGF0YSgpIHsKLQkJaWYgKGZvcm0gIT0gbnVsbCkgewotCQkJcmV0dXJuIGZvcm0uZ2V0TGF5b3V0RGF0YSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldHMgZm9jdXMgdG8gdGhpcyBlZGl0b3IuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRGb2N1cygpOwotCQl9Ci0JCXNldFNlbGVjdGlvbigwKTsKLQkJaWYgKHRvb2xCYXIgIT0gbnVsbCAmJiB0YWJGb2xkZXIgIT0gbnVsbCkgewotCQkJdG9vbEJhci51cGRhdGVUb29sQmFyKGVkaXRhYmxlKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGVsbHMgdGhlIGNvbnRyb2wgaXQgZG9lcyBub3QgaGF2ZSBmb2N1cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCbHVyKCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0Qmx1cigpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgZWRpdG9yIGhhcyBmb2N1cy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgZWRpdG9yIGhhcyB0aGUgdXNlci1pbnRlcmZhY2UgZm9jdXMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNGb2N1cygpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJldHVybiByaWNoVGV4dC5oYXNGb2N1cygpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3RzIHRoZSBSaWNoIFRleHQgb3IgSFRNTCB0YWIuCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICA8Y29kZT4wPC9jb2RlPiBmb3IgdGhlIFJpY2ggVGV4dCB0YWIsIDxjb2RlPjE8L2NvZGU+IGZvcgotCSAqICAgICAgICAgICAgdGhlIEhUTUwgdGFiLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihpbnQgaW5kZXgpIHsKLQkJaWYgKHRhYkZvbGRlciAhPSBudWxsKSB7Ci0JCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKGluZGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgdGV4dCBhbmQgaW1hZ2UgbGlua3MuCi0JICogCi0JICogQHJldHVybiB0aGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBsaW5rcyBzcGVjaWZpZWQgd2l0aCA8aHJlZj4sCi0JICogICAgICAgICA8aW1nPiwgZXRjLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZVBhdGgoKSB7Ci0JCXJldHVybiBiYXNlUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBiYXNlIFVSTCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgd2hvc2UgY29udGVudCB3YXMgbGFzdAotCSAqIGNvcGllZCB0byB0aGUgY2xpcGJvYXJkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJhc2UgVVJMIG9mIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgVVJMIGdldENvcHlVUkwoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmljaFRleHQuZ2V0Q29weVVSTCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhc2UgVVJMIG9mIHRoZSByaWNoIHRleHQgY29udHJvbCB3aG9zZSBjb250ZW50IHdhcyBsYXN0IGNvcGllZAotCSAqIHRvIHRoZSBjbGlwYm9hcmQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weVVSTCgpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldENvcHlVUkwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVkaXRhYmxlIHN0YXRlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRlbnQgY2FuIGJlIGVkaXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEVkaXRhYmxlKCkgewotCQlyZXR1cm4gZWRpdGFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZWRpdGFibGUgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIGVkaXRhYmxlCi0JICogICAgICAgICAgICB0aGUgZWRpdGFibGUgc3RhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKSB7Ci0JCXRoaXMuZWRpdGFibGUgPSBlZGl0YWJsZTsKLQkJaWYgKHRvb2xCYXIgIT0gbnVsbCAmJiB0YWJGb2xkZXIgIT0gbnVsbCkgewotCQkJdG9vbEJhci51cGRhdGVUb29sQmFyKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJc291cmNlVmlld2VyLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBjb250ZW50IGhhcyBiZWVuIG1vZGlmaWVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRlbnQgaGFzIGJlZW4gbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRNb2RpZmllZCgpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJldHVybiByaWNoVGV4dC5nZXRNb2RpZmllZCgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2RpZmllZCBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kaWZpZWQKLQkgKiAgICAgICAgICAgIHRoZSBtb2RpZmllZCBzdGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVkKGJvb2xlYW4gbW9kaWZpZWQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldE1vZGlmaWVkKG1vZGlmaWVkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJpY2ggdGV4dCBjb250ZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJpY2ggdGV4dCBjb250ZW50IGZvcm1hdHRlZCBpbiBYSFRNTAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJaWYgKHNvdXJjZU1vZGlmaWVkKSB7Ci0JCQlzZXRUZXh0KGdldFNvdXJjZUVkaXQoKS5nZXRUZXh0KCkpOwotCQkJc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQlzb3VyY2VNb2RpZmllZCA9IGZhbHNlOwotCQl9Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmljaFRleHQuZ2V0VGV4dCgpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJpY2ggdGV4dCBjb250ZW50LgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgcmljaCB0ZXh0IGNvbnRlbnQgaW4gWEhUTUwgZm9ybWF0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCQlzb3VyY2VNb2RpZmllZCA9IGZhbHNlOwotCQlpZiAodGFiRm9sZGVyICE9IG51bGwpIHsKLQkJCWlmICh0b29sQmFyICE9IG51bGwpIHsKLQkJCQl0b29sQmFyLnVwZGF0ZVRvb2xCYXIoZWRpdGFibGUpOwotCQkJfQotCQkJaWYgKGdldFNvdXJjZUVkaXQoKSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCQkJY3VycmVudERvYy5zZXQodGV4dCk7Ci0JCQkJYWRkTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTW9kaWZ5TGlzdGVuZXJzKCkgewotCQlpZiAoY3VycmVudERvYyAhPSBudWxsKSB7Ci0JCQljdXJyZW50RG9jLmFkZERvY3VtZW50TGlzdGVuZXIoc291cmNlRWRpdERvY3VtZW50TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTW9kaWZ5TGlzdGVuZXJzKCkgewotCQlpZiAoY3VycmVudERvYyAhPSBudWxsKSB7Ci0JCQljdXJyZW50RG9jLnJlbW92ZURvY3VtZW50TGlzdGVuZXIoc291cmNlRWRpdERvY3VtZW50TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0I2NoZWNrTW9kaWZ5KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja01vZGlmeSgpIHsKLQkJcmljaFRleHQuY2hlY2tNb2RpZnkoKTsKLQkJaWYgKHNvdXJjZU1vZGlmaWVkKSB7Ci0JCQlub3RpZnlNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJfQotCQlpZiAoZGVidWcpIHsKLQkJCXByaW50RGVidWdNZXNzYWdlKCJjaGVja01vZGlmeSIsICJtb2RpZmllZD0iICsgc291cmNlTW9kaWZpZWQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlcyB0aGUgcmljaCB0ZXh0IGNvbnRlbnQgYmFjayB0byB0aGUgaW5pdGlhbCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0b3JlVGV4dCgpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnJlc3RvcmVUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQjZ2V0U2VsZWN0ZWQoKQotCSAqLwotCXB1YmxpYyBSaWNoVGV4dFNlbGVjdGlvbiBnZXRTZWxlY3RlZCgpIHsKLQkJaWYgKHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSA9PSBodG1sVGFiKSB7Ci0JCQlTdHJpbmcgSFRNTHNvdXJjZSA9IGdldFNvdXJjZUVkaXQoKS5nZXRUZXh0KCk7Ci0JCQlQb2ludCBzZWwgPSBzb3VyY2VWaWV3ZXIuZ2V0U2VsZWN0ZWRSYW5nZSgpOwotCQkJaW50IHNlbFN0YXJ0SW5kZXggPSBzZWwueDsKLQkJCWludCBzZWxFbmRJbmRleCA9IHNlbC54ICsgc2VsLnkgLSAxOwotCQkJcmljaFRleHQuZ2V0U2VsZWN0ZWQoKS5jbGVhcigpOwotCQkJcmljaFRleHQuZ2V0U2VsZWN0ZWQoKS5zZXRUZXh0KEhUTUxzb3VyY2Uuc3Vic3RyaW5nKHNlbFN0YXJ0SW5kZXgsIHNlbEVuZEluZGV4ICsgMSkpOwotCQl9Ci0JCXJldHVybiByaWNoVGV4dC5nZXRTZWxlY3RlZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXBwbGljYXRpb24gc3BlY2lmaWMgcHJvcGVydHkgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGhhcyBub3QKLQkgKiAgICAgICAgIGJlZW4gc2V0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXREYXRhKFN0cmluZyBrZXkpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmdldERhdGEoa2V5KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGFuIGFwcGxpY2F0aW9uIHNwZWNpZmljIHByb3BlcnR5IG5hbWUgYW5kIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldERhdGEoa2V5LCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gcmljaCB0ZXh0IGNvbW1hbmQuIFRoZSBzdXBwb3J0ZWQgY29tbWFuZCBzdHJpbmdzIGFyZQotCSAqIGRlZmluZWQgaW4gPGNvZGU+UmljaFRleHRDb21tYW5kPGNvZGU+LgotCSAqIAotCSAqIEBwYXJhbQljb21tYW5kCQlhIHJpY2ggdGV4dCBjb21tYW5kIHN0cmluZwotCSAqIEByZXR1cm4JYSBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgZXhlY3V0ZWQgY29tbWFuZAotCSAqLwotCXB1YmxpYyBpbnQgZXhlY3V0ZUNvbW1hbmQoU3RyaW5nIGNvbW1hbmQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJldHVybiByaWNoVGV4dC5leGVjdXRlQ29tbWFuZChjb21tYW5kKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gcmljaCB0ZXh0IGNvbW1hbmQgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIuIFRoZQotCSAqIHN1cHBvcnRlZCBjb21tYW5kIHN0cmluZ3MgYXJlIGRlZmluZWQgaW4gPGNvZGU+UmljaFRleHRDb21tYW5kPGNvZGU+LgotCSAqIAotCSAqIEBwYXJhbQljb21tYW5kCQlhIHJpY2ggdGV4dCBjb21tYW5kIHN0cmluZwotCSAqIEBwYXJhbQlwYXJhbQkJYSBwYXJhbWV0ZXIgZm9yIHRoZSBjb21tYW5kIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybglhIHN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IHRoZSBleGVjdXRlZCBjb21tYW5kCi0JICovCi0JcHVibGljIGludCBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCwgU3RyaW5nIHBhcmFtKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCwgcGFyYW0pOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiByaWNoIHRleHQgY29tbWFuZCB3aXRoIGFuIGFycmF5IG9mIHBhcmFtZXRlcnMuIFRoZQotCSAqIHN1cHBvcnRlZCBjb21tYW5kIHN0cmluZ3MgYXJlIGRlZmluZWQgaW4gPGNvZGU+UmljaFRleHRDb21tYW5kPGNvZGU+LgotCSAqIAotCSAqIEBwYXJhbQljb21tYW5kCQlhIHJpY2ggdGV4dCBjb21tYW5kIHN0cmluZwotCSAqIEBwYXJhbQlwYXJhbXMJCWFuIGFycmF5IG9mIHBhcmFtZXRlcnMgZm9yIHRoZSBjb21tYW5kIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybglhIHN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IHRoZSBleGVjdXRlZCBjb21tYW5kCi0JICovCi0JcHVibGljIGludCBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCwgU3RyaW5nW10gcGFyYW1zKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCwgcGFyYW1zKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyB0aGUgb3BlcmF0aW5nIHN5c3RlbSByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgZWRpdG9yLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChjb250ZXh0TWVudSAhPSBudWxsICYmICFjb250ZXh0TWVudS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWNvbnRleHRNZW51LmRpc3Bvc2UoKTsKLQkJCWNvbnRleHRNZW51ID0gbnVsbDsKLQkJfQotCQlpZiAoc291cmNlRWRpdERyb3BUYXJnZXQgIT0gbnVsbCkgewotCQkJc291cmNlRWRpdERyb3BUYXJnZXQuZGlzcG9zZSgpOwotCQkJc291cmNlRWRpdERyb3BUYXJnZXQgPSBudWxsOwotCQl9Ci0JCWlmIChmQWN0aXZhdGlvbkNvZGVUcmlnZ2VyICE9IG51bGwpIHsKLQkJCWZBY3RpdmF0aW9uQ29kZVRyaWdnZXIudW5pbnN0YWxsKCk7Ci0JCQlmQWN0aXZhdGlvbkNvZGVUcmlnZ2VyPSBudWxsOwotCQl9Ci0JCXJlbW92ZU1vZGlmeUxpc3RlbmVycygpOwotCQlpZiAoZ2V0U291cmNlRWRpdCgpICE9IG51bGwpIHsKLQkJCWdldFNvdXJjZUVkaXQoKS5yZW1vdmVMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwKLQkJCQkJc291cmNlRWRpdERlYWN0aXZhdGVMaXN0ZW5lcik7Ci0JCQlnZXRTb3VyY2VFZGl0KCkucmVtb3ZlS2V5TGlzdGVuZXIoc291cmNlRWRpdEtleUxpc3RlbmVyKTsKLQkJCXNvdXJjZUVkaXREZWFjdGl2YXRlTGlzdGVuZXIgPSBudWxsOwotCQkJc291cmNlRWRpdEtleUxpc3RlbmVyID0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKHNvdXJjZVZpZXdlciAhPSBudWxsKSB7Ci0JCQlzb3VyY2VWaWV3ZXI9IG51bGw7Ci0JCX0KLQotCQlpZiAoZkFjdGlvbnMgIT0gbnVsbCkgewotCQkJZkFjdGlvbnMuY2xlYXIoKTsKLQkJCWZBY3Rpb25zPSBudWxsOwotCQl9Ci0JCWlmIChmQWN0aXZhdGlvbkNvZGVzICE9IG51bGwpIHsKLQkJCWZBY3RpdmF0aW9uQ29kZXMuY2xlYXIoKTsKLQkJCWZBY3RpdmF0aW9uQ29kZXM9IG51bGw7Ci0JCX0KLQotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZGlzcG9zZSgpOwotCQkJcmljaFRleHQgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBjb250cm9sIGhhcyBiZWVuIGRpc3Bvc2VkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjb250cm9sIGlzIGRpc3Bvc2VkIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmljaFRleHQuaXNEaXNwb3NlZCgpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGlmeSBsaXN0ZW5lcnMgYXR0YWNoZWQgdG8gdGhpcyBlZGl0b3IuCi0JICogCi0JICogQHJldHVybiBhbiBpdGVyYXRvciBmb3IgcmV0cmlldmluZyB0aGUgbW9kaWZ5IGxpc3RlbmVycwotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxNb2RpZnlMaXN0ZW5lcj4gZ2V0TW9kaWZ5TGlzdGVuZXJzKCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZ2V0TW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZCB3aGVuCi0JICoga2V5cyBhcmUgcHJlc3NlZCBhbmQgcmVsZWFzZWQgd2l0aGluIHRoaXMgZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEtleUxpc3RlbmVyKEtleUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5hZGRLZXlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIGtleXMgYXJlIHByZXNzZWQgYW5kIHJlbGVhc2VkIHdpdGhpbiB0aGlzIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlS2V5TGlzdGVuZXIoS2V5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnJlbW92ZUtleUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQgd2hlbgotCSAqIHRoZSBjb250ZW50IG9mIHRoaXMgZWRpdG9yIGlzIG1vZGlmaWVkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIHRoZSBjb250ZW50IG9mIHRoaXMgZWRpdG9yIGlzIG1vZGlmaWVkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmZWQgd2hlbgotCSAqIHRoaXMgZWRpdG9yIGlzIGRpc3Bvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmFkZERpc3Bvc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIHRoaXMgZWRpdG9yIGlzIGRpc3Bvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVEaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5yZW1vdmVEaXNwb3NlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZCB3aGVuCi0JICogaGVscCBldmVudHMgYXJlIGdlbmVyYXRlZCBmb3IgdGhpcyBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkSGVscExpc3RlbmVyKEhlbHBMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuYWRkSGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4gaGVscCBldmVudHMgYXJlIGdlbmVyYXRlZCBmb3IgdGhpcyBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUhlbHBMaXN0ZW5lcihIZWxwTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnJlbW92ZUhlbHBMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZlZCB3aGVuCi0JICogYW4gZXZlbnQgb2YgdGhlIGdpdmVuIHR5cGUgb2NjdXJzIHdpdGhpbiB0aGlzIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGV2ZW50IG9jY3VycwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKGludCBldmVudFR5cGUsIExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5hZGRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmZWQKLQkgKiB3aGVuIGFuIGV2ZW50IG9mIHRoZSBnaXZlbiB0eXBlIG9jY3VycyB3aXRoaW4gdGhpcyBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIGV2ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgZXZlbnQgdG8gbGlzdGVuIGZvcgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQgd2hlbiB0aGUgZXZlbnQKLQkgKiAgICAgICAgICAgIG9jY3VycwotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKGludCBldmVudFR5cGUsIExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5yZW1vdmVMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV2ZW50IGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGlzIGVkaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIGZvciByZXRyaWV2aW5nIHRoZSBldmVudCBsaXN0ZW5lcnMgYXR0YWNoZWQgdG8gdGhpcwotCSAqICAgICAgICAgZWRpdG9yCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPFJpY2hUZXh0TGlzdGVuZXI+IGdldExpc3RlbmVycygpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJldHVybiByaWNoVGV4dC5nZXRMaXN0ZW5lcnMoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgbW9kaWZ5IGxpc3RlbmVycyB0aGF0IHRoZSByaWNoIHRleHQgZWRpdG9yIGNvbnRlbnQgaGFzCi0JICogY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlNb2RpZnlMaXN0ZW5lcnMoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotCQkJZXZlbnQuZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQkJZXZlbnQud2lkZ2V0ID0gcmljaFRleHQuZ2V0Q29udHJvbCgpOwotCi0JCQlmb3IgKEl0ZXJhdG9yPE1vZGlmeUxpc3RlbmVyPiBpID0gZ2V0TW9kaWZ5TGlzdGVuZXJzKCk7IGkgIT0gbnVsbCAmJiBpLmhhc05leHQoKTspIHsKLQkJCQlNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lciA9IGkubmV4dCgpOwotCQkJCWxpc3RlbmVyLm1vZGlmeVRleHQobmV3IE1vZGlmeUV2ZW50KGV2ZW50KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaWxscyB0aGUgdG9vbCBiYXIgd2l0aCBhY3Rpb24gaXRlbXMuCi0JICogCi0JICogQHBhcmFtIHRvb2xCYXIKLQkgKiAgICAgICAgICAgIGEgdG9vbCBiYXIgY29udGFpbiByaWNoIHRleHQgYWN0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxUb29sQmFyKElSaWNoVGV4dFRvb2xCYXIgdG9vbEJhcikgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHVuZGVybHlpbmcgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBzdHlsZSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBsaW5rcwotCSAqLwotCXByb3RlY3RlZCBJUmljaFRleHQgY3JlYXRlUmljaFRleHRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwKLQkJCVN0cmluZyBiYXNlUGF0aCkgewotCQlyZXR1cm4gbmV3IFJpY2hUZXh0KHBhcmVudCwgc3R5bGUsIGJhc2VQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBlZGl0b3IgdGFiIGZvbGRlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBzdHlsZSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgbmV3IGVkaXRvciB0b29sYmFyCi0JICovCi0JcHJvdGVjdGVkIENUYWJGb2xkZXIgY3JlYXRlRWRpdG9yVGFiRm9sZGVyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlDVGFiRm9sZGVyIGZvbGRlciA9IG5ldyBDVGFiRm9sZGVyKHBhcmVudCwgU1dULkZMQVQgfCBTV1QuQk9UVE9NKTsKLQkJZm9sZGVyLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCB0cnVlKSk7Ci0JCWZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlDb21wb3NpdGUgcmljaFRleHRDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGZvbGRlciwgU1dULkZMQVQpOwotCQlHcmlkTGF5b3V0IHJpY2hUZXh0Q29tcG9zaXRlTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQlyaWNoVGV4dENvbXBvc2l0ZUxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlyaWNoVGV4dENvbXBvc2l0ZUxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXJpY2hUZXh0Q29tcG9zaXRlLnNldExheW91dChyaWNoVGV4dENvbXBvc2l0ZUxheW91dCk7Ci0JCXJpY2hUZXh0Q29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCXJpY2hUZXh0ID0gY3JlYXRlUmljaFRleHRDb250cm9sKHJpY2hUZXh0Q29tcG9zaXRlLCBzdHlsZSwgYmFzZVBhdGgpOwotCQlyaWNoVGV4dC5zZXREYXRhKFBST1BFUlRZX05BTUUsIHRoaXMpOwotCQlyaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpLnNldFJpY2hUZXh0KHRoaXMpOwotCi0JCXJpY2hUZXh0VGFiID0gbmV3IENUYWJJdGVtKGZvbGRlciwgU1dULkZMQVQpOwotCQlyaWNoVGV4dFRhYi5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnJpY2hUZXh0VGFiX3RleHQpOwotCQlyaWNoVGV4dFRhYi5zZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5yaWNoVGV4dFRhYl90b29sVGlwVGV4dCk7Ci0JCXJpY2hUZXh0VGFiLnNldENvbnRyb2wocmljaFRleHRDb21wb3NpdGUpOwotCi0JCUNvbXBvc2l0ZSBodG1sQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShmb2xkZXIsIFNXVC5GTEFUKTsKLQkJaHRtbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0KLQkJc291cmNlVmlld2VyID0gbmV3IFRleHRWaWV3ZXIoaHRtbENvbXBvc2l0ZSwgU1dULkZMQVQgfCBTV1QuTVVMVEkKLQkJCQl8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMKTsKLQkJc291cmNlVmlld2VyLnNldFVuZG9NYW5hZ2VyKHVuZG9NYW5hZ2VyKTsKLQkJc2V0RG9jdW1lbnQobnVsbCk7Ci0JCWFkZE1vZGlmeUxpc3RlbmVycygpOwotCQlnZXRTb3VyY2VFZGl0KCkuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIHNvdXJjZUVkaXREZWFjdGl2YXRlTGlzdGVuZXIpOwotCQlnZXRTb3VyY2VFZGl0KCkuYWRkS2V5TGlzdGVuZXIoc291cmNlRWRpdEtleUxpc3RlbmVyKTsKLQkJY29udGV4dE1lbnUgPSBuZXcgTWVudShwYXJlbnQuZ2V0U2hlbGwoKSwgU1dULlBPUF9VUCk7Ci0JCWdldFNvdXJjZUVkaXQoKS5zZXRNZW51KGNvbnRleHRNZW51KTsKLQkJLy8gRklYTUUhIFRoaXMgb3BlbnMgdXAgYSBjYW4gb2Ygd29ybXMsIGVzcGVjaWFsbHkgd2l0aCBEQkNTIGNoYXJhY3RlcnMuCi0JCS8vIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc5NDMyLiAKLQkJLy9hZGREcm9wU3VwcG9ydFRvU3R5bGVkVGV4dCgpOwotCQlmaWxsQ29udGV4dE1lbnUoY29udGV4dE1lbnUpOwotCQkKLQkJY3JlYXRlSFRNTFRhYihmb2xkZXIsIGh0bWxDb21wb3NpdGUpOwotCi0JCWZvbGRlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ1RhYkl0ZW0gaXRlbSA9IChDVGFiSXRlbSkgZXZlbnQuaXRlbTsKLQkJCQlpZiAoaXRlbS5nZXRUZXh0KCkuZXF1YWxzKEhUTUxfVEFCX05BTUUpKSB7Ci0JCQkJCXJlbW92ZU1vZGlmeUxpc3RlbmVycygpOwotCQkJCQljdXJyZW50RG9jLnNldChnZXRUZXh0KCkpOwotCQkJCQlzb3VyY2VNb2RpZmllZCA9IGZhbHNlOwotCQkJCQlhZGRNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHRvb2xCYXIgIT0gbnVsbCkgewotCQkJCQkJdG9vbEJhci51cGRhdGVUb29sQmFyKGVkaXRhYmxlKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXVwZGF0ZVJpY2hUZXh0KGdldFNvdXJjZUVkaXQoKS5nZXRUZXh0KCkpOwotCQkJCQlzZXRNb2RpZmllZCh0cnVlKTsKLQkJCQkJaWYgKHRvb2xCYXIgIT0gbnVsbCkgewotCQkJCQkJdG9vbEJhci51cGRhdGVUb29sQmFyKGVkaXRhYmxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWZpbGxUb29sQmFyKHRvb2xCYXIpOwotCQkKLQkJaW5pdGlhbGl6ZUFjdGl2YXRpb25Db2RlVHJpZ2dlcigpOwotCQljcmVhdGVBY3Rpb25zKCk7Ci0JCQotCQlmb2xkZXIuc2V0U2VsZWN0aW9uKDApOwotCi0JCXJldHVybiBmb2xkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlSFRNTFRhYihDVGFiRm9sZGVyIGZvbGRlciwgQ29tcG9zaXRlIGh0bWxDb21wb3NpdGUpIHsKLQkJaHRtbFRhYiA9IG5ldyBDVGFiSXRlbShmb2xkZXIsIFNXVC5OT05FKTsKLQkJaHRtbFRhYi5zZXRUZXh0KEhUTUxfVEFCX05BTUUpOwotCQlodG1sVGFiLnNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmh0bWxUYWJfdG9vbFRpcFRleHQpOyAKLQkJaHRtbFRhYi5zZXRDb250cm9sKGh0bWxDb21wb3NpdGUpOwotCX0KLQotCQotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2MpIHsKLQkJaWYgKGRvYyA9PSBudWxsKSB7Ci0JCQlkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLQkJfQotCQkvLyBjbGVhbiB1cCBvbGQgZG9jCi0JCXVuZG9NYW5hZ2VyLmRpc2Nvbm5lY3QoKTsKLQkJSURvY3VtZW50IG9sZERvYyA9IHNvdXJjZVZpZXdlci5nZXREb2N1bWVudCgpOwotCQlpZiAob2xkRG9jICE9IG51bGwpIHsKLQkJCW9sZERvYy5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHNvdXJjZUVkaXREb2N1bWVudExpc3RlbmVyKTsKLQkJfQotCi0JCS8vIGhvb2sgdXAgbmV3IGRvYwotCQljdXJyZW50RG9jID0gZG9jOwotCQlzb3VyY2VWaWV3ZXIuc2V0RG9jdW1lbnQoY3VycmVudERvYyk7Ci0JCWN1cnJlbnREb2MuYWRkRG9jdW1lbnRMaXN0ZW5lcihzb3VyY2VFZGl0RG9jdW1lbnRMaXN0ZW5lcik7Ci0JCXVuZG9NYW5hZ2VyLmNvbm5lY3Qoc291cmNlVmlld2VyKTsKLQkJaWYgKHVuZG9BY3Rpb24gIT0gbnVsbCkgewotCQkJdW5kb0FjdGlvbi5zZXRDb250ZXh0KGdldFVuZG9Db250ZXh0KCkpOwotCQl9Ci0JCWlmIChyZWRvQWN0aW9uICE9IG51bGwpIHsKLQkJCXJlZG9BY3Rpb24uc2V0Q29udGV4dChnZXRVbmRvQ29udGV4dCgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBIVE1MIHNvdXJjZSBlZGl0IGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPlN0eWxlVGV4dDwvY29kZT4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBTdHlsZWRUZXh0IGdldFNvdXJjZUVkaXQoKSB7Ci0JCWlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHNvdXJjZVZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0cyB0ZXh0IGF0IHRoZSBzZWxlY3Rpb24gKG92ZXJ3cml0aW5nIHRoZSBzZWxlY3Rpb24pLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEhUTUwoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIAotCQkJcmV0dXJuOwotCQlpZiAodGFiRm9sZGVyLmdldFNlbGVjdGlvbigpID09IHJpY2hUZXh0VGFiKSB7Ci0JCQlleGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX0hUTUwsIHRleHQpOwotCQl9IGVsc2UgaWYgKGlzSFRNTFRhYlNlbGVjdGVkKCkpIHsKLQkJCVN0cmluZyBvbGRIVE1MID0gZ2V0U291cmNlRWRpdCgpLmdldFRleHQoKTsKLQkJCVBvaW50IHNlbCA9IHNvdXJjZVZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCk7Ci0JCQlpbnQgc2VsU3RhcnRJbmRleCA9IHNlbC54OwotCQkJaW50IHNlbEVuZEluZGV4ID0gc2VsLnggKyBzZWwueSAtIDE7Ci0JCQlTdHJpbmcgbmV3SFRNTCA9IG9sZEhUTUwuc3Vic3RyaW5nKDAsIHNlbFN0YXJ0SW5kZXgpICsgdGV4dAotCQkJCQkrIG9sZEhUTUwuc3Vic3RyaW5nKHNlbEVuZEluZGV4ICsgMSk7Ci0JCQlyZW1vdmVNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCWN1cnJlbnREb2Muc2V0KG5ld0hUTUwpOwotCQkJYWRkTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCQl1cGRhdGVSaWNoVGV4dChuZXdIVE1MKTsKLQkJfQotCX0KLQotCQotCS8qKgotCSAqIEluc2VydHMgYW4gaW1hZ2UgYXQgdGhlIHNlbGVjdGlvbiAob3ZlcndyaXRpbmcgdGhlIHNlbGVjdGlvbikuCi0JICovCi0JcHVibGljIHZvaWQgYWRkSW1hZ2UoU3RyaW5nIGltYWdlVVJMLCBTdHJpbmcgaGVpZ2h0LCBTdHJpbmcgd2lkdGgsIFN0cmluZyBhbHRUYWcpIHsKLQkJaWYgKHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSA9PSByaWNoVGV4dFRhYikgewotCQkJZXhlY3V0ZUNvbW1hbmQoCi0JCQkJCVJpY2hUZXh0Q29tbWFuZC5BRERfSU1BR0UsCi0JCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJaW1hZ2VVUkwsCi0JCQkJCQkJaGVpZ2h0LCB3aWR0aCwgYWx0VGFnIH0pOwotCQl9IGVsc2UgaWYgKGlzSFRNTFRhYlNlbGVjdGVkKCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBpbWFnZUxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkvLyBvcmRlciBvZiB0aGVzZSBhdHRyaWJ1dGVzIGlzIHRoZSBzYW1lIGFzIEpUaWR5J2VkIEhUTUwKLQkJCWltYWdlTGluay5hcHBlbmQoIjxpbWciKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGhlaWdodC5sZW5ndGgoKSA+IDApIHsKLQkJCQlpbWFnZUxpbmsuYXBwZW5kKCIgaGVpZ2h0PVwiIiArIGhlaWdodCArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWlmIChhbHRUYWcubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJaW1hZ2VMaW5rLmFwcGVuZCgiIGFsdD1cIiIgKyBhbHRUYWcgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlpbWFnZUxpbmsuYXBwZW5kKCIgc3JjPVwiIiArIGltYWdlVVJMICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaWYgKHdpZHRoLmxlbmd0aCgpID4gMCkgewotCQkJCWltYWdlTGluay5hcHBlbmQoIiB3aWR0aD1cIiIgKyB3aWR0aCArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWltYWdlTGluay5hcHBlbmQoIiAvPiIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgb2xkSFRNTCA9IGdldFNvdXJjZUVkaXQoKS5nZXRUZXh0KCk7Ci0JCQlQb2ludCBzZWwgPSBzb3VyY2VWaWV3ZXIuZ2V0U2VsZWN0ZWRSYW5nZSgpOwotCQkJaW50IHNlbFN0YXJ0SW5kZXggPSBzZWwueDsKLQkJCWludCBzZWxFbmRJbmRleCA9IHNlbC54ICsgc2VsLnkgLSAxOwotCQkJU3RyaW5nIG5ld0hUTUwgPSBvbGRIVE1MLnN1YnN0cmluZygwLCBzZWxTdGFydEluZGV4KSArIGltYWdlTGluay50b1N0cmluZygpCi0JCQkJCSsgb2xkSFRNTC5zdWJzdHJpbmcoc2VsRW5kSW5kZXggKyAxKTsKLQkJCXJlbW92ZU1vZGlmeUxpc3RlbmVycygpOwotCQkJY3VycmVudERvYy5zZXQobmV3SFRNTCk7Ci0JCQlhZGRNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCXVwZGF0ZVJpY2hUZXh0KG5ld0hUTUwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIEhUTUwgdGFiIGlzIHNlbGVjdGVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEhUTUwgdGFiIGlzIHNlbGVjdGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSFRNTFRhYlNlbGVjdGVkKCkgewotCQlyZXR1cm4gKHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSA9PSBodG1sVGFiKTsKLQl9Ci0KLQkvKioKLQkgKiBGaWxscyB0aGUgY29udGV4dCBtZW51IHdpdGggbWVudSBpdGVtcy4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dE1lbnUKLQkgKiAgICAgICAgICAgIGEgY29udGV4dCBtZW51IGNvbnRhaW5pbmcgcmljaCB0ZXh0IGFjdGlvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoTWVudSBjb250ZXh0TWVudSkgewotCQlmaW5hbCBNZW51SXRlbSBjdXRJdGVtID0gbmV3IE1lbnVJdGVtKGNvbnRleHRNZW51LCBTV1QuUFVTSCk7Ci0JCWN1dEl0ZW0uc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5jdXRBY3Rpb25fdGV4dCk7Ci0JCWN1dEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUN1dEFjdGlvbiBhY3Rpb24gPSBuZXcgQ3V0QWN0aW9uKFJpY2hUZXh0RWRpdG9yLnRoaXMpOwotCQkJCWFjdGlvbi5leGVjdXRlKFJpY2hUZXh0RWRpdG9yLnRoaXMpOwotCQkJfQotCQl9KTsKLQkJZmluYWwgTWVudUl0ZW0gY29weUl0ZW0gPSBuZXcgTWVudUl0ZW0oY29udGV4dE1lbnUsIFNXVC5QVVNIKTsKLQkJY29weUl0ZW0uc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5jb3B5QWN0aW9uX3RleHQpOyAKLQkJY29weUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvcHlBY3Rpb24gYWN0aW9uID0gbmV3IENvcHlBY3Rpb24oUmljaFRleHRFZGl0b3IudGhpcyk7Ci0JCQkJYWN0aW9uLmV4ZWN1dGUoUmljaFRleHRFZGl0b3IudGhpcyk7Ci0JCQl9Ci0JCX0pOwotCQlmaW5hbCBNZW51SXRlbSBwYXN0ZUl0ZW0gPSBuZXcgTWVudUl0ZW0oY29udGV4dE1lbnUsIFNXVC5QVVNIKTsKLQkJcGFzdGVJdGVtLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMucGFzdGVBY3Rpb25fdGV4dCk7IAotCQlwYXN0ZUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCVBhc3RlQWN0aW9uIGFjdGlvbiA9IG5ldyBQYXN0ZUFjdGlvbihSaWNoVGV4dEVkaXRvci50aGlzKTsKLQkJCQlhY3Rpb24uZXhlY3V0ZShSaWNoVGV4dEVkaXRvci50aGlzKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlmaW5hbCBNZW51SXRlbSBwYXN0ZVBsYWluVGV4dEl0ZW0gPSBuZXcgTWVudUl0ZW0oY29udGV4dE1lbnUsIFNXVC5QVVNIKTsKLQkJcGFzdGVQbGFpblRleHRJdGVtLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMucGFzdGVQbGFpblRleHRBY3Rpb25fdGV4dCk7Ci0JCXBhc3RlUGxhaW5UZXh0SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUGFzdGVQbGFpblRleHRBY3Rpb24gYWN0aW9uID0gbmV3IFBhc3RlUGxhaW5UZXh0QWN0aW9uKFJpY2hUZXh0RWRpdG9yLnRoaXMpOwotCQkJCWFjdGlvbi5leGVjdXRlKFJpY2hUZXh0RWRpdG9yLnRoaXMpOwotCQkJfQotCQl9KTsKLQotCQljb250ZXh0TWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1lbnVIaWRkZW4oTWVudUV2ZW50IGUpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbWVudVNob3duKE1lbnVFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIHNlbGVjdGVkVGV4dCA9IGdldFNlbGVjdGVkKCkuZ2V0VGV4dCgpOwotCQkJCWJvb2xlYW4gc2VsZWN0aW9uID0gc2VsZWN0ZWRUZXh0Lmxlbmd0aCgpID4gMDsKLQkJCQljdXRJdGVtLnNldEVuYWJsZWQoZWRpdGFibGUgJiYgc2VsZWN0aW9uKTsKLQkJCQljb3B5SXRlbS5zZXRFbmFibGVkKHNlbGVjdGlvbik7Ci0JCQkJcGFzdGVJdGVtLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJCXBhc3RlUGxhaW5UZXh0SXRlbS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgY29udGVudCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgd2l0aG91dCB1cGRhdGluZyB0aGUgSFRNTAotCSAqIHNvdXJjZSBlZGl0b3IuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgSFRNTCBzb3VyY2UgZWRpdG9yIHRvIHN5bmMgdXAgaXRzCi0JICogY29udGVudCB3aXRoIHRoZSByaWNoIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHJpY2ggdGV4dCBjb250ZW50IGluIFhIVE1MIGZvcm1hdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVJpY2hUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRUZXh0KHRleHQpOwotCQkJcmljaFRleHQuY2hlY2tNb2RpZnkoKTsKLQkJfQotCQlzb3VyY2VNb2RpZmllZCA9IGZhbHNlOwotCQlpZiAodGFiRm9sZGVyICE9IG51bGwpIHsKLQkJCWlmICh0b29sQmFyICE9IG51bGwpIHsKLQkJCQl0b29sQmFyLnVwZGF0ZVRvb2xCYXIoZWRpdGFibGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZERyb3BTdXBwb3J0VG9TdHlsZWRUZXh0KCkgewotCQkvLyB0aGlzIGZ1bmN0aW9uIGJhc2VkIGhlYXZpbHkgb24gdGhlIGV4YW1wbGUgYXQ6Ci0JCS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYXJ0aWNsZXMvQXJ0aWNsZS1TV1QtRE5EL0RORC1pbi1TV1QuaHRtbAotCQkKLQkJIAkvLyBBbGxvdyBkYXRhIHRvIGJlIGNvcGllZCB0byB0aGUgZHJvcCB0YXJnZXQKLQkJCWludCBvcGVyYXRpb25zID0gRE5ELkRST1BfTU9WRSB8ICBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfREVGQVVMVDsKLQkJCXNvdXJjZUVkaXREcm9wVGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQoZ2V0U291cmNlRWRpdCgpLCBvcGVyYXRpb25zKTsKLQkJIAotCQkJLy8gUmVjZWl2ZSBkYXRhIGluIFRleHQgb3IgSFRNTCBmb3JtYXQKLQkJCWZpbmFsIFRleHRUcmFuc2ZlciB0ZXh0VHJhbnNmZXIgPSBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWZpbmFsIEhUTUxUcmFuc2ZlciBodG1sVHJhbnNmZXIgPSBIVE1MVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCVRyYW5zZmVyW10gdHlwZXMgPSBuZXcgVHJhbnNmZXJbXSB7aHRtbFRyYW5zZmVyLCB0ZXh0VHJhbnNmZXJ9OwotCQkJc291cmNlRWRpdERyb3BUYXJnZXQuc2V0VHJhbnNmZXIodHlwZXMpOwotCQkJIAotCQkJc291cmNlRWRpdERyb3BUYXJnZXQuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0TGlzdGVuZXIoKSB7Ci0JCQkgIHB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCSAgICAgaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSB7Ci0JCQkgICAgICAgICBpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9DT1BZKSAhPSAwKSB7Ci0JCQkgICAgICAgICAgICAgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJCSAgICAgICAgIH0gZWxzZSB7Ci0JCQkgICAgICAgICAgICAgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLQkJCSAgICAgICAgIH0KLQkJCSAgICAgfQotCQkJICAgICBpZiAoIWdldEVkaXRhYmxlKCkpIHsKLQkJICAgICAgICAgICAgIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQkgICAgIH0KLQkJCSAgICAgLy8gd2lsbCBhY2NlcHQgdGV4dCBidXQgcHJlZmVyIHRvIGhhdmUgSFRNTCBkcm9wcGVkCi0JCQkgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnQuZGF0YVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkgICAgICAgICBpZiAoaHRtbFRyYW5zZmVyLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZXNbaV0pKXsKLQkJCSAgICAgICAgICAgICBldmVudC5jdXJyZW50RGF0YVR5cGUgPSBldmVudC5kYXRhVHlwZXNbaV07Ci0JCQkgICAgICAgICAgICAgYnJlYWs7Ci0JCQkgICAgICAgICB9Ci0JCQkgICAgIH0KLQkJCSAgIH0KLQkJCSAgIHB1YmxpYyB2b2lkIGRyYWdPdmVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJICAgICAgICBldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19TRUxFQ1QgfCBETkQuRkVFREJBQ0tfSU5TRVJUX0FGVEVSIHwgRE5ELkZFRURCQUNLX1NDUk9MTDsKLQkJCSAgICB9Ci0JCQkgICAgcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkgICAgICAgIGlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgewotCQkJICAgICAgICAgICAgaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfQ09QWSkgIT0gMCkgewotCQkJICAgICAgICAgICAgICAgIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQkgICAgICAgICAgICB9IGVsc2UgewotCQkJICAgICAgICAgICAgICAgIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQkgICAgICAgICAgICB9Ci0JCQkgICAgICAgIH0KLQkJCSAgICB9Ci0JCQkgICAgcHVibGljIHZvaWQgZHJhZ0xlYXZlKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJICAgIH0KLQkJCSAgICBwdWJsaWMgdm9pZCBkcm9wQWNjZXB0KERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJICAgIH0KLQkJCSAgICBwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJICAgICAgICBpZiAodGV4dFRyYW5zZmVyLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpIHx8IAotCQkJICAgICAgICAJCWh0bWxUcmFuc2Zlci5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKSkgewotCQkJICAgICAgICAgICAgU3RyaW5nIHRleHQgPSAoU3RyaW5nKWV2ZW50LmRhdGE7Ci0JCQkgICAgICAgICAgICBhZGRIVE1MKHRleHQpOwotCQkJICAgICAgICB9Ci0JCQkgICAgfQotCQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBkZWJ1ZyBtZXNzYWdlIHRvIHRoZSBjb25zb2xlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50RGVidWdNZXNzYWdlKFN0cmluZyBtZXRob2QsIFN0cmluZyBtc2csIFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXN0ckJ1Zi5hcHBlbmQoIlJpY2hUZXh0RWRpdG9yWyIpLmFwcGVuZChyaWNoVGV4dC5nZXRDb250cm9sKCkuaGFuZGxlKS5hcHBlbmQoJ10nKSAvLyROT04tTkxTLTEkCi0JCQkJLmFwcGVuZCgnLicpLmFwcGVuZChtZXRob2QpOwotCQlpZiAobXNnICE9IG51bGwgJiYgbXNnLmxlbmd0aCgpID4gMCkgewotCQkJc3RyQnVmLmFwcGVuZCgiOiAiKS5hcHBlbmQobXNnKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCXN0ckJ1Zi5hcHBlbmQoJ1xuJykuYXBwZW5kKHRleHQpOwotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihzdHJCdWYpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBkZWJ1ZyBtZXNzYWdlIHRvIHRoZSBjb25zb2xlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50RGVidWdNZXNzYWdlKFN0cmluZyBtZXRob2QsIFN0cmluZyBtc2cpIHsKLQkJcHJpbnREZWJ1Z01lc3NhZ2UobWV0aG9kLCBtc2csIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgRmluZFJlcGxhY2VBY3Rpb24gZ2V0RmluZFJlcGxhY2VBY3Rpb24oKSB7Ci0JCXJldHVybiByaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbmRSZXBsYWNlQWN0aW9uKEZpbmRSZXBsYWNlQWN0aW9uIGZpbmRSZXBsYWNlQWN0aW9uKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRGaW5kUmVwbGFjZUFjdGlvbihmaW5kUmVwbGFjZUFjdGlvbik7Ci0JCQlyaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpLnNldFJpY2hUZXh0KHRoaXMpOwotCi0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldEluaXRpYWxUZXh0KHRleHQpOwotCQl9Ci0JCWlmIChnZXRTb3VyY2VFZGl0KCkgIT0gbnVsbCkgewotCQkJcmVtb3ZlTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCQlzZXREb2N1bWVudChuZXcgRG9jdW1lbnQodGV4dCkpOwotCQkJYWRkTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCX0KLQotCX0KLQkKLQkKLQkvKioKLQkgKiBmcm9tIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RUZXh0RWRpdG9yI2dldFVuZG9Db250ZXh0KCkKLQkgKiBSZXR1cm5zIHRoaXMgZWRpdG9yJ3Mgdmlld2VyJ3MgdW5kbyBtYW5hZ2VyIHVuZG8gY29udGV4dC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHVuZG8gY29udGV4dCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgYXZhaWxhYmxlCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByb3RlY3RlZCBJVW5kb0NvbnRleHQgZ2V0VW5kb0NvbnRleHQoKSB7Ci0JCWlmIChzb3VyY2VWaWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjYpIHsKLQkJCUlVbmRvTWFuYWdlciB1bmRvTWFuYWdlcj0gKChJVGV4dFZpZXdlckV4dGVuc2lvbjYpc291cmNlVmlld2VyKS5nZXRVbmRvTWFuYWdlcigpOwotCQkJaWYgKHVuZG9NYW5hZ2VyIGluc3RhbmNlb2YgSVVuZG9NYW5hZ2VyRXh0ZW5zaW9uKQotCQkJCXJldHVybiAoKElVbmRvTWFuYWdlckV4dGVuc2lvbil1bmRvTWFuYWdlcikuZ2V0VW5kb0NvbnRleHQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsKLQkJY3JlYXRlVW5kb1JlZG9BY3Rpb25zKCk7Ci0JCS8vIHNlbGVjdCBhbGwKLQkJQWN0aW9uIHNlbGVjdEFsbEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlnZXRTb3VyY2VFZGl0KCkuc2VsZWN0QWxsKCk7Ci0JCQl9Ci0JCX07Ci0JCXNlbGVjdEFsbEFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHMuU0VMRUNUX0FMTCk7Ci0JCXJlZ2lzdGVyQWN0aW9uKEFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5nZXRJZCgpLCBzZWxlY3RBbGxBY3Rpb24pOwotCX0KLQotCS8qCi0JICogZnJvbSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0VGV4dEVkaXRvciNjcmVhdGVVbmRvUmVkb0FjdGlvbnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVVuZG9SZWRvQWN0aW9ucygpIHsKLQkJSVVuZG9Db250ZXh0IHVuZG9Db250ZXh0PSBnZXRVbmRvQ29udGV4dCgpOwotCQlpZiAodW5kb0NvbnRleHQgIT0gbnVsbCkgewotCQkJLy8gVXNlIGFjdGlvbnMgcHJvdmlkZWQgYnkgZ2xvYmFsIHVuZG8vcmVkbwotCQkJCi0JCQkvLyBDcmVhdGUgdGhlIHVuZG8gYWN0aW9uCi0JCQl1bmRvQWN0aW9uPSBuZXcgVW5kb0FjdGlvbkhhbmRsZXIoZ2V0RWRpdG9yU2l0ZSgpLCB1bmRvQ29udGV4dCk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVuZG9BY3Rpb24sIElBYnN0cmFjdFRleHRFZGl0b3JIZWxwQ29udGV4dElkcy5VTkRPX0FDVElPTik7Ci0JCQl1bmRvQWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChJV29ya2JlbmNoQWN0aW9uRGVmaW5pdGlvbklkcy5VTkRPKTsKLQkJCXJlZ2lzdGVyQWN0aW9uKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVORE8sIHVuZG9BY3Rpb24pOwotCi0JCQkvLyBDcmVhdGUgdGhlIHJlZG8gYWN0aW9uLgotCQkJcmVkb0FjdGlvbj0gbmV3IFJlZG9BY3Rpb25IYW5kbGVyKGdldEVkaXRvclNpdGUoKSwgdW5kb0NvbnRleHQpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyZWRvQWN0aW9uLCBJQWJzdHJhY3RUZXh0RWRpdG9ySGVscENvbnRleHRJZHMuUkVET19BQ1RJT04pOwotCQkJcmVkb0FjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHMuUkVETyk7Ci0JCQlyZWdpc3RlckFjdGlvbihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5SRURPLCByZWRvQWN0aW9uKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgSUVkaXRvclNpdGUgZ2V0RWRpdG9yU2l0ZSgpIHsKLQkJcmV0dXJuIGVkaXRvclNpdGU7Ci0JfQotCi0KLQkvKioKLQkgKiBSZWdpc3RlcnMgdGhlIGdpdmVuIHVuZG8vcmVkbyBhY3Rpb24gdW5kZXIgdGhlIGdpdmVuIElEIGFuZAotCSAqIGVuc3VyZXMgdGhhdCBwcmV2aW91c2x5IGluc3RhbGxlZCBhY3Rpb25zIGdldCBkaXNwb3NlZC4gSXQKLQkgKiBhbHNvIHRha2VzIGNhcmUgb2YgcmUtcmVnaXN0ZXJpbmcgdGhlIG5ldyBhY3Rpb24gd2l0aCB0aGUKLQkgKiBnbG9iYWwgYWN0aW9uIGhhbmRsZXIuCi0JICogCi0JICogQHBhcmFtIGFjdGlvbklkCXRoZSBhY3Rpb24gaWQgdW5kZXIgd2hpY2ggdG8gcmVnaXN0ZXIgdGhlIGFjdGlvbgotCSAqIEBwYXJhbSBhY3Rpb24JdGhlIGFjdGlvbiB0byByZWdpc3RlcgotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckFjdGlvbihTdHJpbmcgYWN0aW9uSWQsIElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlBY3Rpb24gb2xkQWN0aW9uPSBnZXRBY3Rpb24oYWN0aW9uSWQpOwotCQlpZiAob2xkQWN0aW9uIGluc3RhbmNlb2YgT3BlcmF0aW9uSGlzdG9yeUFjdGlvbkhhbmRsZXIpCi0JCQkoKE9wZXJhdGlvbkhpc3RvcnlBY3Rpb25IYW5kbGVyKW9sZEFjdGlvbikuZGlzcG9zZSgpOwotCi0JCXNldEFjdGlvbihhY3Rpb25JZCwgYWN0aW9uKTsKLQkJCi0JCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnM9IGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCWlmIChhY3Rpb25CYXJzICE9IG51bGwpCi0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoYWN0aW9uSWQsIGFjdGlvbik7Ci0JfQotCi0JCi0JLyoKLQkgKiBAc2VlIElUZXh0RWRpdG9yI2dldEFjdGlvbihTdHJpbmcpCi0JICovCi0JcHVibGljIElBY3Rpb24gZ2V0QWN0aW9uKFN0cmluZyBhY3Rpb25JRCkgewotCQlhc3NlcnQgYWN0aW9uSUQgIT0gbnVsbDsKLQkJSUFjdGlvbiBhY3Rpb249IChJQWN0aW9uKSBmQWN0aW9ucy5nZXQoYWN0aW9uSUQpOwotCi0vLwkJaWYgKGFjdGlvbiA9PSBudWxsKSB7Ci0vLwkJCWFjdGlvbj0gZmluZENvbnRyaWJ1dGVkQWN0aW9uKGFjdGlvbklEKTsKLS8vCQkJaWYgKGFjdGlvbiAhPSBudWxsKQotLy8JCQkJc2V0QWN0aW9uKGFjdGlvbklELCBhY3Rpb24pOwotLy8JCX0KLQotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCS8qCi0JICogQHNlZSBJVGV4dEVkaXRvciNzZXRBY3Rpb24oU3RyaW5nLCBJQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGlvbihTdHJpbmcgYWN0aW9uSUQsIElBY3Rpb24gYWN0aW9uKSB7Ci0JCWFzc2VydCBhY3Rpb25JRCAhPSBudWxsOwotCQlpZiAoYWN0aW9uID09IG51bGwpIHsKLQkJCWFjdGlvbj0gKElBY3Rpb24pIGZBY3Rpb25zLnJlbW92ZShhY3Rpb25JRCk7Ci0JCQlpZiAoYWN0aW9uICE9IG51bGwpCi0JCQkJZkFjdGl2YXRpb25Db2RlVHJpZ2dlci51bnJlZ2lzdGVyQWN0aW9uRnJvbUtleUFjdGl2YXRpb24oYWN0aW9uKTsKLQkJfSBlbHNlIHsKLQkJCWZBY3Rpb25zLnB1dChhY3Rpb25JRCwgYWN0aW9uKTsKLQkJCWZBY3RpdmF0aW9uQ29kZVRyaWdnZXIucmVnaXN0ZXJBY3Rpb25Gb3JLZXlBY3RpdmF0aW9uKGFjdGlvbik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGFjdGl2YXRpb24gY29kZSB0cmlnZ2VyLgotCSAqCi0JICogQHNpbmNlIDIuMQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVBY3RpdmF0aW9uQ29kZVRyaWdnZXIoKSB7Ci0JCWZBY3RpdmF0aW9uQ29kZVRyaWdnZXIuaW5zdGFsbCgpOwotCQlmQWN0aXZhdGlvbkNvZGVUcmlnZ2VyLnNldFNjb3BlcyhmS2V5QmluZGluZ1Njb3Blcyk7Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwga2V5IHZlcmlmeSBsaXN0ZW5lciBmb3IgdHJpZ2dlcmluZyBhY3Rpb24gYWN0aXZhdGlvbiBjb2Rlcy4KLQkgKi8KLQljbGFzcyBBY3RpdmF0aW9uQ29kZVRyaWdnZXIgaW1wbGVtZW50cyBWZXJpZnlLZXlMaXN0ZW5lciB7Ci0KLQkJLyoqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdHJpZ2dlciBoYXMgYmVlbiBpbnN0YWxsZWQuICovCi0JCXByb3RlY3RlZCBib29sZWFuIGZJc0luc3RhbGxlZD0gZmFsc2U7Ci0JCS8qKgotCQkgKiBUaGUga2V5IGJpbmRpbmcgc2VydmljZSB0byB1c2UuCi0JCSAqIEBzaW5jZSAyLjAKLQkJICovCi0JCXByb3RlY3RlZCBJS2V5QmluZGluZ1NlcnZpY2UgZktleUJpbmRpbmdTZXJ2aWNlOwotCQkKLQkJLyoKLQkJICogQHNlZSBWZXJpZnlLZXlMaXN0ZW5lciN2ZXJpZnlLZXkob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHZlcmlmeUtleShWZXJpZnlFdmVudCBldmVudCkgewotCi0JCQlBY3Rpb25BY3RpdmF0aW9uQ29kZSBjb2RlPSBudWxsOwotCQkJaW50IHNpemU9IGZBY3RpdmF0aW9uQ29kZXMuc2l6ZSgpOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWNvZGU9IChBY3Rpb25BY3RpdmF0aW9uQ29kZSkgZkFjdGl2YXRpb25Db2Rlcy5nZXQoaSk7Ci0JCQkJaWYgKGNvZGUubWF0Y2hlcyhldmVudCkpIHsKLQkJCQkJSUFjdGlvbiBhY3Rpb249IGdldEFjdGlvbihjb2RlLmZBY3Rpb25JZCk7Ci0JCQkJCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCi0JCQkJCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgSVVwZGF0ZSkKLQkJCQkJCQkoKElVcGRhdGUpIGFjdGlvbikudXBkYXRlKCk7Ci0KLQkJCQkJCWlmICghYWN0aW9uLmlzRW5hYmxlZCgpICYmIGFjdGlvbiBpbnN0YW5jZW9mIElSZWFkT25seURlcGVuZGVudCkgewotCQkJCQkJCUlSZWFkT25seURlcGVuZGVudCBkZXBlbmRlbnQ9IChJUmVhZE9ubHlEZXBlbmRlbnQpIGFjdGlvbjsKLQkJCQkJCQlib29sZWFuIHdyaXRhYmxlPSBkZXBlbmRlbnQuaXNFbmFibGVkKHRydWUpOwotCQkJCQkJCWlmICh3cml0YWJsZSkgewotCQkJCQkJCQlldmVudC5kb2l0PSBmYWxzZTsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAoYWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQkJCQkJZXZlbnQuZG9pdD0gZmFsc2U7Ci0JCQkJCQkJYWN0aW9uLnJ1bigpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBJbnN0YWxscyB0aGlzIHRyaWdnZXIgb24gdGhlIGVkaXRvcidzIHRleHQgd2lkZ2V0LgotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnN0YWxsKCkgewotCQkJaWYgKCFmSXNJbnN0YWxsZWQpIHsKLQotCQkJCWlmIChzb3VyY2VWaWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbikgewotCQkJCQlJVGV4dFZpZXdlckV4dGVuc2lvbiBlPSAoSVRleHRWaWV3ZXJFeHRlbnNpb24pIHNvdXJjZVZpZXdlcjsKLQkJCQkJZS5wcmVwZW5kVmVyaWZ5S2V5TGlzdGVuZXIodGhpcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3R5bGVkVGV4dCB0ZXh0PSBzb3VyY2VWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQkJCQl0ZXh0LmFkZFZlcmlmeUtleUxpc3RlbmVyKHRoaXMpOwotCQkJCX0KLQotCQkJCWZLZXlCaW5kaW5nU2VydmljZT0gZ2V0RWRpdG9yU2l0ZSgpLmdldEtleUJpbmRpbmdTZXJ2aWNlKCk7Ci0JCQkJZklzSW5zdGFsbGVkPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFVuaW5zdGFsbHMgdGhpcyB0cmlnZ2VyIGZyb20gdGhlIGVkaXRvcidzIHRleHQgd2lkZ2V0LgotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCQlpZiAoZklzSW5zdGFsbGVkKSB7Ci0KLQkJCQlpZiAoc291cmNlVmlld2VyIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb24pIHsKLQkJCQkJSVRleHRWaWV3ZXJFeHRlbnNpb24gZT0gKElUZXh0Vmlld2VyRXh0ZW5zaW9uKSBzb3VyY2VWaWV3ZXI7Ci0JCQkJCWUucmVtb3ZlVmVyaWZ5S2V5TGlzdGVuZXIodGhpcyk7Ci0JCQkJfSBlbHNlIGlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJCQlTdHlsZWRUZXh0IHRleHQ9IHNvdXJjZVZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCQkJCWlmICh0ZXh0ICE9IG51bGwgJiYgIXRleHQuaXNEaXNwb3NlZCgpKQotCQkJCQkJdGV4dC5yZW1vdmVWZXJpZnlLZXlMaXN0ZW5lcihmQWN0aXZhdGlvbkNvZGVUcmlnZ2VyKTsKLQkJCQl9Ci0KLQkJCQlmSXNJbnN0YWxsZWQ9IGZhbHNlOwotCQkJCWZLZXlCaW5kaW5nU2VydmljZT0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZWdpc3RlcnMgdGhlIGdpdmVuIGFjdGlvbiBmb3Iga2V5IGFjdGl2YXRpb24uCi0JCSAqIEBwYXJhbSBhY3Rpb24gdGhlIGFjdGlvbiB0byBiZSByZWdpc3RlcmVkCi0JCSAqIEBzaW5jZSAyLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQWN0aW9uRm9yS2V5QWN0aXZhdGlvbihJQWN0aW9uIGFjdGlvbikgewotCQkJaWYgKGFjdGlvbi5nZXRBY3Rpb25EZWZpbml0aW9uSWQoKSAhPSBudWxsKQotCQkJCWZLZXlCaW5kaW5nU2VydmljZS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBnaXZlbiBhY3Rpb24gaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSBmb3Iga2V5IGFjdGl2YXRpb24KLQkJICogQHBhcmFtIGFjdGlvbiB0aGUgYWN0aW9uIHRvIGJlIHVucmVnaXN0ZXJlZAotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyQWN0aW9uRnJvbUtleUFjdGl2YXRpb24oSUFjdGlvbiBhY3Rpb24pIHsKLQkJCWlmIChhY3Rpb24uZ2V0QWN0aW9uRGVmaW5pdGlvbklkKCkgIT0gbnVsbCkKLQkJCQlmS2V5QmluZGluZ1NlcnZpY2UudW5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNldHMgdGhlIGtleSBiaW5kaW5nIHNjb3BlcyBmb3IgdGhpcyBlZGl0b3IuCi0JCSAqIEBwYXJhbSBrZXlCaW5kaW5nU2NvcGVzIHRoZSBrZXkgYmluZGluZyBzY29wZXMKLQkJICogQHNpbmNlIDIuMQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0U2NvcGVzKFN0cmluZ1tdIGtleUJpbmRpbmdTY29wZXMpIHsKLQkJCWlmIChrZXlCaW5kaW5nU2NvcGVzICE9IG51bGwgJiYga2V5QmluZGluZ1Njb3Blcy5sZW5ndGggPiAwKQotCQkJCWZLZXlCaW5kaW5nU2VydmljZS5zZXRTY29wZXMoa2V5QmluZGluZ1Njb3Blcyk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmVwcmVzZW50YXRpb24gb2YgYWN0aW9uIGFjdGl2YXRpb24gY29kZXMuCi0JICovCi0Jc3RhdGljIGNsYXNzIEFjdGlvbkFjdGl2YXRpb25Db2RlIHsKLQotCQkvKiogVGhlIGFjdGlvbiBpZC4gKi8KLQkJcHVibGljIFN0cmluZyBmQWN0aW9uSWQ7Ci0JCS8qKiBUaGUgY2hhcmFjdGVyLiAqLwotCQlwdWJsaWMgY2hhciBmQ2hhcmFjdGVyOwotCQkvKiogVGhlIGtleSBjb2RlLiAqLwotCQlwdWJsaWMgaW50IGZLZXlDb2RlPSAtMTsKLQkJLyoqIFRoZSBzdGF0ZSBtYXNrLiAqLwotCQlwdWJsaWMgaW50IGZTdGF0ZU1hc2s9IFNXVC5ERUZBVUxUOwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbiBhY3RpdmF0aW9uIGNvZGUgZm9yIHRoZSBnaXZlbiBhY3Rpb24gaWQuCi0JCSAqIEBwYXJhbSBhY3Rpb25JZCB0aGUgYWN0aW9uIGlkCi0JCSAqLwotCQlwdWJsaWMgQWN0aW9uQWN0aXZhdGlvbkNvZGUoU3RyaW5nIGFjdGlvbklkKSB7Ci0JCQlmQWN0aW9uSWQ9IGFjdGlvbklkOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3RpdmF0aW9uIGNvZGUgbWF0Y2hlcyB0aGUgZ2l2ZW4gdmVyaWZ5IGV2ZW50LgotCQkgKiBAcGFyYW0gZXZlbnQgdGhlIGV2ZW50IHRvIHRlc3QgZm9yIG1hdGNoaW5nCi0JCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGFjdGl2YXRpb24gY29kZSBtYXRjaGVzIDxjb2RlPmV2ZW50PC9jb2RlPgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhWZXJpZnlFdmVudCBldmVudCkgewotCQkJcmV0dXJuIChldmVudC5jaGFyYWN0ZXIgPT0gZkNoYXJhY3RlciAmJgotCQkJCQkJKGZLZXlDb2RlID09IC0xIHx8IGV2ZW50LmtleUNvZGUgPT0gZktleUNvZGUpICYmCi0JCQkJCQkoZlN0YXRlTWFzayA9PSBTV1QuREVGQVVMVCB8fCBldmVudC5zdGF0ZU1hc2sgPT0gZlN0YXRlTWFzaykpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dEVkaXRvckZvcm0uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0RWRpdG9yRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODUxYTM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0RWRpdG9yRm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WaWV3Rm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLQotLyoqCi0gKiBBIGNvbXBvc2l0ZSBmb3IgbGF5aW5nIG91dCB0aGUgZGVmYXVsdCByaWNoIHRleHQgZWRpdG9yIGluIGFuIEVjbGlwc2UgZm9ybS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dEVkaXRvckZvcm0gZXh0ZW5kcyBWaWV3Rm9ybSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHN0eWxlIGZvciB0aGlzIGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRFZGl0b3JGb3JtKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzI2dldERhdGEoU3RyaW5nIGtleSkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERhdGEoU3RyaW5nIGtleSkgewotCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5LmVxdWFscyhGb3JtVG9vbGtpdC5LRVlfRFJBV19CT1JERVIpKSB7Ci0JCQkvLyBSZXR1cm4gYSB0ZXh0IGJvcmRlciB0byBnZXQgdGhlIEZvcm1Ub29sa2l0J3MgQm9yZGVyUGFpbnRlciB0bwotCQkJLy8gcGFpbnQgYSBib3JkZXIgZm9yIHRoZSByaWNoIHRleHQgZWRpdG9yLgotCQkJcmV0dXJuIEZvcm1Ub29sa2l0LlRFWFRfQk9SREVSOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXREYXRhKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dEZvcm1Ub29sa2l0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dEZvcm1Ub29sa2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZGYwMDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRGb3JtVG9vbGtpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLS8qKgotICogQSBoZWxwZXIgdG9vbGtpdCBmb3IgY3JlYXRpbmcgYSByaWNoIHRleHQgY29udHJvbCBhbmQgZWRpdG9yIHRoYXQgY2FuIGJlCi0gKiBhZGRlZCB0byBhbiBFY2xpcHNlIGZvcm0uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRGb3JtVG9vbGtpdCB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmljaCB0ZXh0IGNvbnRyb2wgYW5kIGFkYXB0cyBpdCB0byBiZSB1c2VkIGluIGEgZm9ybS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgdGhlIGZvcm0gdG9vbGtpdAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgaW5pdGlhbCB0ZXh0IGZvciB0aGUgdmlld2VyCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgaW5pdGlhbCBzdHlsZSBmb3IgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgdGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgaHJlZnMKLQkgKiBAcmV0dXJuIGEgbmV3IDxjb2RlPklSaWNoVGV4dDwvY29kZT4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSaWNoVGV4dCBjcmVhdGVSaWNoVGV4dChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgewotCQlJUmljaFRleHQgcmljaFRleHQgPSBuZXcgUmljaFRleHQocGFyZW50LCB0b29sa2l0LmdldEJvcmRlclN0eWxlKCkKLQkJCQl8IHN0eWxlIHwgdG9vbGtpdC5nZXRPcmllbnRhdGlvbigpKTsKLQkJcmljaFRleHQuZ2V0Q29udHJvbCgpLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLAotCQkJCUZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCQlyZXR1cm4gcmljaFRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJpY2ggdGV4dCBlZGl0b3IgYW5kIGFkYXB0cyBpdCB0byBiZSB1c2VkIGluIGEgZm9ybS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgdGhlIGZvcm0gdG9vbGtpdAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgaW5pdGlhbCB0ZXh0IGZvciB0aGUgdmlld2VyCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgaW5pdGlhbCBzdHlsZSBmb3IgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgdGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgaHJlZnMKLQkgKiBAcmV0dXJuIGEgbmV3IDxjb2RlPklSaWNoVGV4dDwvY29kZT4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSaWNoVGV4dEVkaXRvciBjcmVhdGVSaWNoVGV4dEVkaXRvcihGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzdHlsZSwgSUVkaXRvclNpdGUgZWRpdG9yU2l0ZSkgewotCQlJUmljaFRleHRFZGl0b3IgcmljaFRleHRFZGl0b3IgPSBuZXcgUmljaFRleHRFZGl0b3IocGFyZW50LCB0b29sa2l0Ci0JCQkJLmdldEJvcmRlclN0eWxlKCkKLQkJCQl8IHN0eWxlIHwgdG9vbGtpdC5nZXRPcmllbnRhdGlvbigpLCBlZGl0b3JTaXRlKTsKLQkJcmljaFRleHRFZGl0b3IuZ2V0Q29udHJvbCgpLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLAotCQkJCUZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHRFZGl0b3Iuc2V0SW5pdGlhbFRleHQodGV4dCk7Ci0JCX0KLQkJcmV0dXJuIHJpY2hUZXh0RWRpdG9yOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRJbWFnZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0SW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZmVkNTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRJbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIFNoYXJlZCBpbWFnZXMgdXNlZCBieSB0aGUgZGVmYXVsdCByaWNoIHRleHQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0SW1hZ2VzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFVE9PTDE2ID0gImZ1bGwvZXRvb2wxNi8iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRPT0wxNiA9ICJmdWxsL2R0b29sMTYvIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJpY2hUZXh0UGx1Z2luIHJpY2hUZXh0UGx1Z2luID0gUmljaFRleHRQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9BRERfSU1BR0UgPSBFVE9PTDE2ICsgIkFkZEltYWdlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0FERF9MSU5FID0gRVRPT0wxNiArICJBZGRMaW5lLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0FERF9MSU5LID0gRVRPT0wxNiArICJBZGRMaW5rLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0FERF9PUkRFUkVEX0xJU1QgPSBFVE9PTDE2Ci0JCQkrICJBZGRPcmRlcmVkTGlzdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9BRERfVEFCTEUgPSBFVE9PTDE2ICsgIkFkZFRhYmxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0FERF9VTk9SREVSRURfTElTVCA9IEVUT09MMTYKLQkJCSsgIkFkZFVub3JkZXJlZExpc3QuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfQk9MRCA9IEVUT09MMTYgKyAiQm9sZC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9DTEVBUl9DT05URU5UID0gRVRPT0wxNgotCQkJKyAiQ2xlYXJDb250ZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9DT1BZID0gRVRPT0wxNiArICJDb3B5LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0NVVCA9IEVUT09MMTYgKyAiQ3V0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0ZJTkRfUkVQTEFDRSA9IEVUT09MMTYKLQkJCSsgIkZpbmRSZXBsYWNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0lOREVOVCA9IEVUT09MMTYgKyAiSW5kZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0lUQUxJQyA9IEVUT09MMTYgKyAiSXRhbGljLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0pVU1RJRllfQ0VOVEVSID0gRVRPT0wxNgotCQkJKyAiSnVzdGlmeUNlbnRlci5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9KVVNUSUZZX0ZVTEwgPSBFVE9PTDE2Ci0JCQkrICJKdXN0aWZ5RnVsbC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9KVVNUSUZZX0xFRlQgPSBFVE9PTDE2Ci0JCQkrICJKdXN0aWZ5TGVmdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9KVVNUSUZZX1JJR0hUID0gRVRPT0wxNgotCQkJKyAiSnVzdGlmeVJpZ2h0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX09VVERFTlQgPSBFVE9PTDE2ICsgIk91dGRlbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfUEFTVEUgPSBFVE9PTDE2ICsgIlBhc3RlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9QQVNURV9QTEFJTl9URVhUID0gRVRPT0wxNiArICJQYXN0ZVBsYWluVGV4dC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9TVFJJS0VfVEhST1VHSCA9IEVUT09MMTYKLQkJCSsgIlN0cmlrZVRocm91Z2guZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfU1VCU0NSSVBUID0gRVRPT0wxNiArICJTdWJzY3JpcHQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfU1VQRVJTQ1JJUFQgPSBFVE9PTDE2Ci0JCQkrICJTdXBlcnNjcmlwdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9VTkRFUkxJTkUgPSBFVE9PTDE2ICsgIlVuZGVybGluZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9USURZID0gRVRPT0wxNiArICJUaWR5SFRNTC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19BRERfSU1BR0UgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0FERF9JTUFHRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19BRERfTElORSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfQUREX0xJTkUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQUREX0xJTksgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0FERF9MSU5LKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0FERF9PUkRFUkVEX0xJU1QgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0FERF9PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQUREX1RBQkxFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9BRERfVEFCTEUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQUREX1VOT1JERVJFRF9MSVNUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9BRERfVU5PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQk9MRCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfQk9MRCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19DTEVBUl9DT05URU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9DTEVBUl9DT05URU5UKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0NPUFkgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0NPUFkpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQ1VUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9DVVQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfRklORF9SRVBMQUNFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9GSU5EX1JFUExBQ0UpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfSU5ERU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9JTkRFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfSVRBTElDID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9JVEFMSUMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfSlVTVElGWV9DRU5URVIgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0pVU1RJRllfQ0VOVEVSKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0pVU1RJRllfRlVMTCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfSlVTVElGWV9GVUxMKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0pVU1RJRllfTEVGVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfSlVTVElGWV9MRUZUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0pVU1RJRllfUklHSFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0pVU1RJRllfUklHSFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfT1VUREVOVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfT1VUREVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19QQVNURSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfUEFTVEUpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1BBU1RFX1BMQUlOX1RFWFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX1BBU1RFX1BMQUlOX1RFWFQpOwkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1NUUklLRV9USFJPVUdIID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9TVFJJS0VfVEhST1VHSCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19TVUJTQ1JJUFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX1NVQlNDUklQVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19TVVBFUlNDUklQVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfU1VQRVJTQ1JJUFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfVU5ERVJMSU5FID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9VTkRFUkxJTkUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1RJRFkgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX1RJRFkpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0FERF9JTUFHRSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0FERF9JTUFHRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19BRERfTElORSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0FERF9MSU5FKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0FERF9MSU5LID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQUREX0xJTkspOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfQUREX09SREVSRURfTElTVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0FERF9PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfQUREX1RBQkxFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQUREX1RBQkxFKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0FERF9VTk9SREVSRURfTElTVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0FERF9VTk9SREVSRURfTElTVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19CT0xEID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQk9MRCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19DTEVBUl9DT05URU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQ0xFQVJfQ09OVEVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19DT1BZID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQ09QWSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19DVVQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9DVVQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfRklORF9SRVBMQUNFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfRklORF9SRVBMQUNFKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0lOREVOVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0lOREVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19JVEFMSUMgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9JVEFMSUMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfSlVTVElGWV9DRU5URVIgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9KVVNUSUZZX0NFTlRFUik7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19KVVNUSUZZX0ZVTEwgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9KVVNUSUZZX0ZVTEwpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfSlVTVElGWV9MRUZUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfSlVTVElGWV9MRUZUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0pVU1RJRllfUklHSFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9KVVNUSUZZX1JJR0hUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX09VVERFTlQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9PVVRERU5UKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX1BBU1RFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfUEFTVEUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfUEFTVEVfUExBSU5fVEVYVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX1BBU1RFX1BMQUlOX1RFWFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfU1RSSUtFX1RIUk9VR0ggPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9TVFJJS0VfVEhST1VHSCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19TVUJTQ1JJUFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9TVUJTQ1JJUFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfU1VQRVJTQ1JJUFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9TVVBFUlNDUklQVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19VTkRFUkxJTkUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9VTkRFUkxJTkUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfVElEWSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX1RJRFkpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQUREX0lNQUdFID0gRFRPT0wxNgotCQkJKyAiQWRkSW1hZ2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQUREX0xJTkUgPSBEVE9PTDE2Ci0JCQkrICJBZGRMaW5lLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0FERF9MSU5LID0gRFRPT0wxNgotCQkJKyAiQWRkTGluay5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9BRERfT1JERVJFRF9MSVNUID0gRFRPT0wxNgotCQkJKyAiQWRkT3JkZXJlZExpc3QuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQUREX1RBQkxFID0gRFRPT0wxNgotCQkJKyAiQWRkVGFibGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQUREX1VOT1JERVJFRF9MSVNUID0gRFRPT0wxNgotCQkJKyAiQWRkVW5vcmRlcmVkTGlzdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9CT0xEID0gRFRPT0wxNiArICJCb2xkLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0NMRUFSX0NPTlRFTlQgPSBEVE9PTDE2Ci0JCQkrICJDbGVhckNvbnRlbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0NPUFkgPSBEVE9PTDE2ICsgIkNvcHkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQ1VUID0gRFRPT0wxNiArICJDdXQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfRklORF9SRVBMQUNFID0gRFRPT0wxNgotCQkJKyAiRmluZFJlcGxhY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfSU5ERU5UID0gRFRPT0wxNgotCQkJKyAiSW5kZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0lUQUxJQyA9IERUT09MMTYKLQkJCSsgIkl0YWxpYy5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9KVVNUSUZZX0NFTlRFUiA9IERUT09MMTYKLQkJCSsgIkp1c3RpZnlDZW50ZXIuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9GVUxMID0gRFRPT0wxNgotCQkJKyAiSnVzdGlmeUZ1bGwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9MRUZUID0gRFRPT0wxNgotCQkJKyAiSnVzdGlmeUxlZnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9SSUdIVCA9IERUT09MMTYKLQkJCSsgIkp1c3RpZnlSaWdodC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9PVVRERU5UID0gRFRPT0wxNgotCQkJKyAiT3V0ZGVudC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9QQVNURSA9IERUT09MMTYgKyAiUGFzdGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfUEFTVEVfUExBSU5fVEVYVCA9IERUT09MMTYgKyAiUGFzdGVQbGFpblRleHQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfU1RSSUtFX1RIUk9VR0ggPSBEVE9PTDE2Ci0JCQkrICJTdHJpa2VUaHJvdWdoLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX1NVQlNDUklQVCA9IERUT09MMTYKLQkJCSsgIlN1YnNjcmlwdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9TVVBFUlNDUklQVCA9IERUT09MMTYKLQkJCSsgIlN1cGVyc2NyaXB0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9USURZID0gRFRPT0wxNiArICJUaWR5SFRNTC5naWYiOyAvLyROT04tTkxTLTEkCi0JCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX1VOREVSTElORSA9IERUT09MMTYKLQkJCSsgIlVuZGVybGluZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19BRERfSU1BR0UgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0FERF9JTUFHRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19BRERfTElORSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfQUREX0xJTkUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQUREX0xJTksgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0FERF9MSU5LKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0FERF9PUkRFUkVEX0xJU1QgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0FERF9PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQUREX1RBQkxFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9BRERfVEFCTEUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQUREX1VOT1JERVJFRF9MSVNUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9BRERfVU5PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQk9MRCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfQk9MRCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19DTEVBUl9DT05URU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9DTEVBUl9DT05URU5UKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0NPUFkgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0NPUFkpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQ1VUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9DVVQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfRklORF9SRVBMQUNFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9GSU5EX1JFUExBQ0UpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfSU5ERU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9JTkRFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfSVRBTElDID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9JVEFMSUMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfSlVTVElGWV9DRU5URVIgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0pVU1RJRllfQ0VOVEVSKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0pVU1RJRllfRlVMTCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9GVUxMKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0pVU1RJRllfTEVGVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9MRUZUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0pVU1RJRllfUklHSFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0pVU1RJRllfUklHSFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfT1VUREVOVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfT1VUREVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19QQVNURSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfUEFTVEUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfU1RSSUtFX1RIUk9VR0ggPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX1NUUklLRV9USFJPVUdIKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX1NVQlNDUklQVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfU1VCU0NSSVBUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX1NVUEVSU0NSSVBUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9TVVBFUlNDUklQVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19VTkRFUkxJTkUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX1VOREVSTElORSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19BRERfSU1BR0UgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9BRERfSU1BR0UpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQUREX0xJTkUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9BRERfTElORSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19BRERfTElOSyA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0FERF9MSU5LKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0FERF9PUkRFUkVEX0xJU1QgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9BRERfT1JERVJFRF9MSVNUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0FERF9UQUJMRSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0FERF9UQUJMRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19BRERfVU5PUkRFUkVEX0xJU1QgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9BRERfVU5PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQk9MRCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0JPTEQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQ0xFQVJfQ09OVEVOVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0NMRUFSX0NPTlRFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQ09QWSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0NPUFkpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQ1VUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfQ1VUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0ZJTkRfUkVQTEFDRSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0ZJTkRfUkVQTEFDRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19JTkRFTlQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9JTkRFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfSVRBTElDID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfSVRBTElDKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0pVU1RJRllfQ0VOVEVSID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9DRU5URVIpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfSlVTVElGWV9GVUxMID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9GVUxMKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0pVU1RJRllfTEVGVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0pVU1RJRllfTEVGVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19KVVNUSUZZX1JJR0hUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9SSUdIVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19PVVRERU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfT1VUREVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19QQVNURSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX1BBU1RFKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX1BBU1RFX1BMQUlOX1RFWFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9QQVNURV9QTEFJTl9URVhUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX1NUUklLRV9USFJPVUdIID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfU1RSSUtFX1RIUk9VR0gpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfU1VCU0NSSVBUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfU1VCU0NSSVBUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX1NVUEVSU0NSSVBUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfU1VQRVJTQ1JJUFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfVU5ERVJMSU5FID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfVU5ERVJMSU5FKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX1RJRFkgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9USURZKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjIyMDQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIExpc3RlbnMgdG8gYSByaWNoIHRleHQgZWRpdGluZyBldmVudC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dExpc3RlbmVyIHsKLQotCXByaXZhdGUgaW50IGV2ZW50VHlwZTsKLQotCXByaXZhdGUgTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBldmVudFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBldmVudCB0eXBlCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgZXZlbnQgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRMaXN0ZW5lcihpbnQgZXZlbnRUeXBlLCBMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmV2ZW50VHlwZSA9IGV2ZW50VHlwZTsKLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV2ZW50IHR5cGUuCi0JICogCi0JICogQHJldHVybiB0aGUgZXZlbnQgdHlwZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkgewotCQlyZXR1cm4gZXZlbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV2ZW50IGxpc3RlbmVyLgotCSAqLwotCXB1YmxpYyBMaXN0ZW5lciBnZXRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIGxpc3RlbmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YTNjYWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgUmljaCBUZXh0IHBsdWctaW4gY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUmljaFRleHRQbHVnaW4gcGx1Z2luOwotCi0JLy8gVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGlzIHBsdWctaW4gd2FzIHN0YXJ0ZWQuCi0JcHJpdmF0ZSBEYXRlIHN0YXJ0VGltZTsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFJpY2hUZXh0UGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJc3RhcnRUaW1lID0gbmV3IERhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0b3AoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBSaWNoVGV4dFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGlzIHBsdWctaW4gd2FzIHN0YXJ0ZWQuCi0JICovCi0JcHVibGljIERhdGUgZ2V0U3RhcnRUaW1lKCkgewotCQlyZXR1cm4gc3RhcnRUaW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0UmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZjNlNTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBSaWNoVGV4dCByZXNvdXJjZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSaWNoVGV4dFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBSaWNoVGV4dFJlc291cmNlcy5jbGFzcwotCQkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSArICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgUmljaFRleHRSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZS4KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250TmFtZUFjdGlvbl9DU1NfRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250TmFtZUFjdGlvbl9DU1NfRGVmYXVsdF9Nb3ppbGxhOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnROYW1lQWN0aW9uX0RlZmF1bHRGb250TmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250U3R5bGVfbm9ybWFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnRTdHlsZV9zZWN0aW9uSGVhZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250U3R5bGVfc3Vic2VjdGlvbkhlYWRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udFN0eWxlX3N1YlN1YnNlY3Rpb25IZWFkaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnRTdHlsZV9xdW90ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250U3R5bGVfY29kZVNhbXBsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBibG9ja1RhZ19wYXJhZ3JhcGg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfaGVhZGluZzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfaGVhZGluZzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfaGVhZGluZzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfaGVhZGluZzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfaGVhZGluZzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfaGVhZGluZzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfYWRkcmVzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBibG9ja1RhZ19wcmVmb3JtYXR0ZWRUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnROYW1lX2RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udE5hbWVfYXJpYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udE5hbWVfY291cmllck5ldzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250TmFtZV90aW1lc05ld1JvbWFuOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnROYW1lX3ZlcmRhbmE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkSG9yaXpvbnRhbEJhckFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRJbWFnZUFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRMaW5lQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZExpbmtBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkT3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkVGFibGVBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkVW5vcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBib2xkQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsZWFyQ29udGVudEFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1dEFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaW5kUmVwbGFjZUFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmRlbnRBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaXRhbGljQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGp1c3RpZnlDZW50ZXJBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcganVzdGlmeUZ1bGxBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcganVzdGlmeUxlZnRBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcganVzdGlmeVJpZ2h0QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dGRlbnRBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFzdGVBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFzdGVQbGFpblRleHRBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3Vic2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1cGVyc2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZGVybGluZUFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250U3R5bGVBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udE5hbWVBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udFNpemVBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3V0QWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weUFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhc3RlQWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFzdGVQbGFpblRleHRBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByaWNoVGV4dFRhYl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJpY2hUZXh0VGFiX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGh0bWxUYWJfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBodG1sVGFiX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZEltYWdlRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZExpbmtEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkVGFibGVEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmluZFJlcGxhY2VEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXJsRGlzcGxheU5hbWVMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVybExhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VtbWFyeUxhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FwdGlvbkxhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm93c0xhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29sdW1uc0xhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2lkdGhMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhYmxlU3R5bGVMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhYmxlSGVhZGVyTm9uZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhYmxlSGVhZGVyQ29sc190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhYmxlSGVhZGVyUm93c190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhYmxlSGVhZGVyQm90aF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZUJ1dHRvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsZWFyQ29udGVudERpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGVhckNvbnRlbnREaWFsb2dfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaW5kTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcHRpb25zR3JvdXBfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aG9sZVdvcmRDaGVja2JveF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpcmVjdGlvbkdyb3VwX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9yd2FyZFJhZGlvQnV0dG9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFja3dhcmRSYWRpb0J1dHRvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbmRCdXR0b25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlQnV0dG9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZUZpbmRCdXR0b25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlYWxsQnV0dG9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmluZFJlcGxhY2VfU3RhdHVzX25vTWF0Y2hfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWF4Q2hhcnNQZXJMaW5lTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmRlbnRIVE1MQ2hlY2tib3hfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmRlbnRTaXplTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0aWR5X2NsZWFuX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGlkeV9jbGVhbmVyX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGlkeV9jbGVhbmVzdF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRpZHlfY2xlYW5fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGlkeV9jbGVhbmVyX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRpZHlfY2xlYW5lc3RfdG9vbFRpcFRleHQ7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBSaWNoVGV4dFJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0U2VsZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dFNlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGI3ZjRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0U2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi0vKioKLSAqIE1vZGVscyBhIHRleHQgc2VsZWN0aW9uIGluIGEgcmljaCB0ZXh0IGNvbnRyb2wgYW5kIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dFNlbGVjdGlvbiB7Ci0KLQkvLyBUaGUgY29udHJvbCdzIHRleHQgc2VsZWN0aW9uLgotCXByb3RlY3RlZCBTdHJpbmcgdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgY29udHJvbCdzIHRleHQgc2VsZWN0aW9uIG9mZnNldAotCXByb3RlY3RlZCBpbnQgb2Zmc2V0U3RhcnQgPSAwOwotCi0JLy8gVGhlIGNvbnRyb2wncyB0ZXh0IHNlbGVjdGlvbiBmb250Ci0JcHJvdGVjdGVkIFN0cmluZyBmb250TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgY29udHJvbCdzIHRleHQgc2VsZWN0aW9uIGZvbnQgc2l6ZQotCS8vIGNvdWxkIGJlIGluIHBvaW50IHNpemUgKDEycHQpLCBvciBIVE1MIHNpemUgKDEtNykKLQlwcm90ZWN0ZWQgU3RyaW5nIGZvbnRTaXplID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBjb250cm9sJ3MgdGV4dCBjdXJyZW50IHN0eWxlCi0JcHJvdGVjdGVkIFN0cmluZyBibG9ja1N0eWxlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBjb250cm9sJ3MgdGV4dCBjdXJyZW50IGZsYWdzCi0JcHJvdGVjdGVkIGludCBmbGFncyA9IDA7Ci0KLQkvLyBUZXh0IHN0YXR1cyBmbGFncwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPTEQgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVRBTElDID0gQk9MRCA8PCAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERVJMSU5FID0gSVRBTElDIDw8IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVUJTQ1JJUFQgPSBVTkRFUkxJTkUgPDwgMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVUEVSU0NSSVBUID0gU1VCU0NSSVBUIDw8IDE7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJsb2NrU3R5bGUoKSB7Ci0JCXJldHVybiBibG9ja1N0eWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJsb2NrU3R5bGUoU3RyaW5nIGJsb2NrU3R5bGUpIHsKLQkJdGhpcy5ibG9ja1N0eWxlID0gYmxvY2tTdHlsZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEZsYWdzKCkgewotCQlyZXR1cm4gZmxhZ3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmxhZ3MoaW50IGZsYWdzKSB7Ci0JCXRoaXMuZmxhZ3MgPSBmbGFnczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnROYW1lKCkgewotCQlyZXR1cm4gZm9udE5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9udE5hbWUoU3RyaW5nIGZvbnROYW1lKSB7Ci0JCXRoaXMuZm9udE5hbWUgPSBmb250TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnRTaXplKCkgewotCQlyZXR1cm4gZm9udFNpemU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9udFNpemUoU3RyaW5nIGZvbnRTaXplKSB7Ci0JCXRoaXMuZm9udFNpemUgPSBmb250U2l6ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9mZnNldFN0YXJ0KCkgewotCQlyZXR1cm4gb2Zmc2V0U3RhcnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2Zmc2V0U3RhcnQoaW50IG9mZnNldFN0YXJ0KSB7Ci0JCXRoaXMub2Zmc2V0U3RhcnQgPSBvZmZzZXRTdGFydDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJdGhpcy50ZXh0ID0gdGV4dDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0JvbGQoKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBCT0xEKSAhPSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSXRhbGljKCkgewotCQlyZXR1cm4gKGZsYWdzICYgSVRBTElDKSAhPSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVW5kZXJMaW5lKCkgewotCQlyZXR1cm4gKGZsYWdzICYgVU5ERVJMSU5FKSAhPSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3Vic2NyaXB0KCkgewotCQlyZXR1cm4gKGZsYWdzICYgU1VCU0NSSVBUKSAhPSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3VwZXJzY3JpcHQoKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBTVVBFUlNDUklQVCkgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIHNlbGVjdGlvbiBpbmZvCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlvZmZzZXRTdGFydCA9IDA7Ci0JCWZvbnROYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZm9udFNpemUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlibG9ja1N0eWxlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZmxhZ3MgPSAwOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyBzdHIgPSAiVGV4dDogIiArIHRleHQgKyAiXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc3RyICs9ICJmb250TmFtZTogIiArIGZvbnROYW1lICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXN0ciArPSAiZm9udFNpemU6ICIgKyBmb250U2l6ZSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzdHIgKz0gImJsb2NrU3R5bGU6ICIgKyBibG9ja1N0eWxlICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXN0ciArPSAiZmxhZ3M6ICIgKyBmbGFncyArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gc3RyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRUb29sQmFyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dFRvb2xCYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExNjJkMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dFRvb2xCYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLklSaWNoVGV4dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5SaWNoVGV4dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5SaWNoVGV4dENvbWJvQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IHJpY2ggdGV4dCB0b29sIGJhciBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogU3BsaXQgaW50byAyIHRvb2xiYXJzIChvbmUgZm9yIENDb21ib3MsIG9uZSBmb3IgYnV0dG9ucykgZm9yIHRhYmJpbmcgcHVycG9zZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dFRvb2xCYXIgaW1wbGVtZW50cyBJUmljaFRleHRUb29sQmFyIHsKLQotCS8vIFRoZSBwYXJlbnQgcmljaCB0ZXh0IGNvbnRyb2wuCi0JcHJpdmF0ZSBJUmljaFRleHQgcmljaFRleHQ7Ci0KLQkvLyBJZiB0cnVlLCBhZGQgYSBuZXcgdG9vbCBiYXIuCi0JcHJpdmF0ZSBib29sZWFuIGFkZFRvb2xCYXIgPSB0cnVlOwotCi0JLy8gVGhlIGN1cnJlbnQgdG9vbCBiYXIgbWFuYWdlciB1c2VkIHRvIHBvcHVsYXRlIHRoZSB0b29sIGFjdGlvbnMuCi0JcHJpdmF0ZSBUb29sQmFyTWFuYWdlciB0b29sYmFyTWdyOwotCQotCS8vIFRoZSBjdXJyZW50IHRvb2wgYmFyIG1hbmFnZXIgdXNlZCB0byBwb3B1bGF0ZSB0aGUgdG9vbCBhY3Rpb25zLgotCXByaXZhdGUgVG9vbEJhck1hbmFnZXIgdG9vbGJhck1nckNvbWJvOwotCi0JLy8gVGhlIGFjdGlvbiBpdGVtcyBpbiB0aGUgdG9vbCBiYXIocykuCi0JcHJpdmF0ZSBMaXN0PE9iamVjdD4gYWN0aW9uSXRlbXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQotCXByaXZhdGUgc3RhdGljIGludCBsYXN0V2lkdGggPSAtMTsKLQkKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSB0b29sIGJhciBzdHlsZQotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBSaWNoVGV4dFRvb2xCYXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBJUmljaFRleHQgcmljaFRleHQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMucmljaFRleHQgPSByaWNoVGV4dDsKLQotCQlhZGRUb29sQmFyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQWN0aW9uKGZpbmFsIElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQkJCXRvb2xiYXJNZ3IuYWRkKGl0ZW0pOwotCQkJdG9vbGJhck1nci51cGRhdGUodHJ1ZSk7Ci0JCQlhY3Rpb25JdGVtcy5hZGQoaXRlbSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgY29tYm8gYWN0aW9uIHRvIHRoZSB0b29sIGJhci4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uCi0JICogICAgICAgICAgICB0aGUgYWN0aW9uIHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFjdGlvbihmaW5hbCBSaWNoVGV4dENvbWJvQWN0aW9uIGl0ZW0pIHsKLQkJaWYgKGl0ZW0gIT0gbnVsbCkgewotCQkJaXRlbS5pbml0KCk7Ci0JCQl0b29sYmFyTWdyQ29tYm8uYWRkKGl0ZW0pOyAgICAgICAgICAgIAotCQkJdG9vbGJhck1nckNvbWJvLnVwZGF0ZSh0cnVlKTsKLQkJCWFjdGlvbkl0ZW1zLmFkZChpdGVtKTsgICAgICAgICAgIAotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHNlcGFyYXRvciB0byB0aGUgdG9vbCBiYXIuCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VwYXJhdG9yKCkgewotCQl0b29sYmFyTWdyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHRvb2xiYXIgc3RhdGUuCi0JICogPHA+Ci0JICogRW5hYmxlcy9kaXNhYmxlcyBhY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkCi0JICogUmljaFRleHRFZGl0b3IgdGFiIChSaWNoVGV4dCB2cy4gSFRNTCkKLQkgKiAKLQkgKiBAcGFyYW0gZWRpdGFibGUKLQkgKiAgICAgICAgICAgIHNwZWNpZmllcyB3aGV0aGVyIHRvIGVuYWJsZSBub24tUmVhZE9ubHkgY29tbWFuZHMKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVUb29sQmFyKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJYm9vbGVhbiByaWNoVGV4dE1vZGUgPSB0cnVlOwotCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBSaWNoVGV4dEVkaXRvcgotCQkJCSYmICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KS5pc0hUTUxUYWJTZWxlY3RlZCgpKSB7Ci0JCQlyaWNoVGV4dE1vZGUgPSBmYWxzZTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGkgPSBhY3Rpb25JdGVtcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBpdGVtID0gaS5uZXh0KCk7Ci0JCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFRvb2xJdGVtKSB7Ci0JCQkJYm9vbGVhbiBlbmFibGVkVG9vbEl0ZW0gPSB0cnVlOwotCQkJCVRvb2xJdGVtIHRvb2xJdGVtID0gKFRvb2xJdGVtKSBpdGVtOwotCQkJCUlSaWNoVGV4dEFjdGlvbiBhY3Rpb24gPSAoSVJpY2hUZXh0QWN0aW9uKSB0b29sSXRlbS5nZXREYXRhKCk7Ci0JCQkJaWYgKGFjdGlvbiAhPSBudWxsICYmICFlZGl0YWJsZQotCQkJCQkJJiYgYWN0aW9uLmRpc2FibGVJblJlYWRPbmx5TW9kZSgpKSB7Ci0JCQkJCWVuYWJsZWRUb29sSXRlbSA9IGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoYWN0aW9uICE9IG51bGwgJiYgIXJpY2hUZXh0TW9kZQotCQkJCQkJJiYgYWN0aW9uLmRpc2FibGVJblNvdXJjZU1vZGUoKSkgewotCQkJCQllbmFibGVkVG9vbEl0ZW0gPSBmYWxzZTsKLQkJCQl9Ci0JCQkJdG9vbEl0ZW0uc2V0RW5hYmxlZChlbmFibGVkVG9vbEl0ZW0pOwotCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29tYm8pIHsKLQkJCQlpZiAocmljaFRleHRNb2RlICYmIGVkaXRhYmxlKSB7Ci0JCQkJCSgoQ29tYm8pIGl0ZW0pLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJKChDb21ibykgaXRlbSkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgewotCQkJCWJvb2xlYW4gZW5hYmxlZFRvb2xJdGVtID0gdHJ1ZTsKLQkJCQlSaWNoVGV4dEFjdGlvbiBhY3Rpb24gPSAoUmljaFRleHRBY3Rpb24pICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgaXRlbSkKLQkJCQkJCS5nZXRBY3Rpb24oKTsKLQkJCQlpZiAoYWN0aW9uICE9IG51bGwgJiYgIWVkaXRhYmxlCi0JCQkJCQkmJiBhY3Rpb24uZGlzYWJsZUluUmVhZE9ubHlNb2RlKCkpIHsKLQkJCQkJZW5hYmxlZFRvb2xJdGVtID0gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChhY3Rpb24gIT0gbnVsbCAmJiAhcmljaFRleHRNb2RlCi0JCQkJCQkmJiBhY3Rpb24uZGlzYWJsZUluU291cmNlTW9kZSgpKSB7Ci0JCQkJCWVuYWJsZWRUb29sSXRlbSA9IGZhbHNlOwotCQkJCX0KLQkJCQlhY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkVG9vbEl0ZW0pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHRvb2wgYmFyLCBpZiBuZWNlc3NhcnksIHRvIGNvbnRhaW4gYSBidXR0b24gYWN0aW9uIG9yIHNlcGFyYXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb29sQmFyKCkgewotCQlpZiAoYWRkVG9vbEJhcikgewotCQkJdG9vbGJhck1nckNvbWJvID0gbmV3IFRvb2xCYXJNYW5hZ2VyKFNXVC5XUkFQIHwgU1dULkZMQVQgfCBwYXJlbnQuZ2V0U3R5bGUoKSk7Ci0JCQl0b29sYmFyTWdyQ29tYm8uY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQkJdG9vbGJhck1nciA9IG5ldyBUb29sQmFyTWFuYWdlcihTV1QuV1JBUCB8IFNXVC5GTEFUIHwgcGFyZW50LmdldFN0eWxlKCkpOwotCQkJdG9vbGJhck1nci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCQlhZGRUb29sQmFyID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVG9vbEJhck1hbmFnZXIgZ2V0VG9vbGJhck1ncigpIHsKLQkJcmV0dXJuIHRvb2xiYXJNZ3I7Ci0JfQotCi0JcHVibGljIFRvb2xCYXJNYW5hZ2VyIGdldFRvb2xiYXJNZ3JDb21ibygpIHsKLQkJcmV0dXJuIHRvb2xiYXJNZ3JDb21ibzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkSW1hZ2VBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkSW1hZ2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwMjkyMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZEltYWdlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLkFkZEltYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBBZGRzIGFuIGltYWdlIHRvIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkSW1hZ2VBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBZGRJbWFnZUFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX0lNQUdFKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfQUREX0lNQUdFKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuYWRkSW1hZ2VBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlBZGRJbWFnZURpYWxvZyBkaWFsb2cgPSBuZXcgQWRkSW1hZ2VEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJLmdldEFjdGl2ZVNoZWxsKCkpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJCVN0cmluZyBpbWFnZVVSTCA9IGRpYWxvZy5nZXRJbWFnZSgpLmdldFVSTCgpOwotCQkJCWlmIChpbWFnZVVSTC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJcmljaFRleHQKLQkJCQkJCQkuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkFERF9JTUFHRSwgaW1hZ2VVUkwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5Tb3VyY2VNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZExpbmVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkTGluZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2NhZGE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkTGluZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBBZGRzIGEgaG9yaXpvbnRhbCBiYXIgdG8gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRMaW5lQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQWRkTGluZUFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX0xJTkUpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5hZGRMaW5lQWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkFERF9MSU5FKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkTGlua0FjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRMaW5rQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNjhlYjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRMaW5rQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLkFkZExpbmtEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEFkZHMgYSBsaW5rIHRvIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkTGlua0FjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFkZExpbmtBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0FERF9MSU5LKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfQUREX0xJTkspOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5hZGRMaW5rQWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJQWRkTGlua0RpYWxvZyBkaWFsb2cgPSBuZXcgQWRkTGlua0RpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgcmljaFRleHQuZ2V0QmFzZVBhdGgoKSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJU3RyaW5nIGxpbmtVUkwgPSBkaWFsb2cuZ2V0TGluaygpLmdldFVSTCgpOwotCQkJCWlmIChsaW5rVVJMLmxlbmd0aCgpID4gMCkgewotCQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX0xJTkssIGxpbmtVUkwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5Tb3VyY2VNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRPcmRlcmVkTGlzdEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRPcmRlcmVkTGlzdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTQyYTAzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkT3JkZXJlZExpc3RBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogQWRkcyBhbiBvcmRlcmVkIGxpc3QgdG8gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRPcmRlcmVkTGlzdEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFkZE9yZGVyZWRMaXN0QWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19BRERfT1JERVJFRF9MSVNUKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfQUREX09SREVSRURfTElTVCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmFkZE9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX09SREVSRURfTElTVCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkVGFibGVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkVGFibGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2NzE2Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZFRhYmxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLkFkZFRhYmxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBBZGRzIGEgdGFibGUgdG8gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRUYWJsZUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFkZFRhYmxlQWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19BRERfVEFCTEUpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19BRERfVEFCTEUpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5hZGRUYWJsZUFjdGlvbl90b29sVGlwVGV4dCk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJQWRkVGFibGVEaWFsb2cgZGlhbG9nID0gbmV3IEFkZFRhYmxlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCS5nZXRBY3RpdmVTaGVsbCgpKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCQlUYWJsZSB0YWJsZSA9IGRpYWxvZy5nZXRUYWJsZSgpOwotCQkJCWludCByb3dzID0gdGFibGUuZ2V0Um93cygpOwotCQkJCWludCBjb2xzID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCQkJCVN0cmluZyB3aWR0aCA9IHRhYmxlLmdldFdpZHRoKCk7Ci0JCQkJaW50IHRhYmxlaGVhZGVycyA9IHRhYmxlLmdldFRhYmxlSGVhZGVycygpOwotCQkJCVN0cmluZyBzdW1tYXJ5ID0gdGFibGUuZ2V0U3VtbWFyeSgpOwotCQkJCVN0cmluZyBjYXB0aW9uID0gdGFibGUuZ2V0Q2FwdGlvbigpOwotCQkJCWlmIChyb3dzID4gMCAmJiBjb2xzID4gMCkgewotCQkJCQlyaWNoVGV4dAotCQkJCQkJCS5leGVjdXRlQ29tbWFuZCgKLQkJCQkJCQkJCVJpY2hUZXh0Q29tbWFuZC5BRERfVEFCTEUsCi0JCQkJCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJCQkJCQkiIiArIHJvd3MsICIiICsgY29scywgIiIgKyB3aWR0aCwgc3VtbWFyeSwgY2FwdGlvbiwgIiIgKyB0YWJsZWhlYWRlcnMgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZFVub3JkZXJlZExpc3RBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkVW5vcmRlcmVkTGlzdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmIwNTU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkVW5vcmRlcmVkTGlzdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBBZGRzIGFuIHVub3JkZXJlZCBsaXN0IHRvIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkVW5vcmRlcmVkTGlzdEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFkZFVub3JkZXJlZExpc3RBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0FERF9VTk9SREVSRURfTElTVCk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0FERF9VTk9SREVSRURfTElTVCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmFkZFVub3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5BRERfVU5PUkRFUkVEX0xJU1QpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0Jhc2VSaWNoVGV4dEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9CYXNlUmljaFRleHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVkNTczNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0Jhc2VSaWNoVGV4dEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCByaWNoIHRleHQgYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VSaWNoVGV4dEFjdGlvbiBpbXBsZW1lbnRzIElCYXNlUmljaFRleHRBY3Rpb24gewotCi0JcHJvdGVjdGVkIFN0cmluZyB0b29sVGlwVGV4dDsKLQotCXByb3RlY3RlZCBib29sZWFuIGVuYWJsZWQgPSB0cnVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgQmFzZVJpY2hUZXh0QWN0aW9uKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRvb2wgdGlwIGZvciB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRvb2wgdGlwIHRleHQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gdG9vbFRpcFRleHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCB0aXAgZm9yIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHRvb2xUaXBUZXh0Ci0JICogICAgICAgICAgICB0aGUgdG9vbCB0aXAgdGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvb2xUaXBUZXh0KFN0cmluZyB0b29sVGlwVGV4dCkgewotCQl0aGlzLnRvb2xUaXBUZXh0ID0gdG9vbFRpcFRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5hYmxlZCBzdGF0dXMgb2YgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGVuYWJsZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRFbmFibGVkKCkgewotCQlyZXR1cm4gZW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBlbmFibGUgdGhlIGFjdGlvbi4gaWYKLQkgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgZGlzYWJsZSBpdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQl0aGlzLmVuYWJsZWQgPSBlbmFibGVkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9CbG9ja1RhZ0FjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9CbG9ja1RhZ0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWI4ZmE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQmxvY2tUYWdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWwuQmxvY2tUYWc7Ci0KLS8qKgotICogU2V0cyB0aGUgZm9udCBuYW1lIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJsb2NrVGFnQWN0aW9uIGV4dGVuZHMgUmljaFRleHRDb21ib0FjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBCbG9ja1RhZ0FjdGlvbihmaW5hbCBJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5ibG9ja1RhZ0FjdGlvbl90b29sVGlwVGV4dCk7IAotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRJbnB1dCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCi0JCXJldHVybkxpc3QuYWRkKEJsb2NrVGFnLlBBUkFHUkFQSC5nZXROYW1lKCkpOwotCQlyZXR1cm5MaXN0LmFkZChCbG9ja1RhZy5IRUFESU5HXzEuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuTGlzdC5hZGQoQmxvY2tUYWcuSEVBRElOR18yLmdldE5hbWUoKSk7Ci0JCXJldHVybkxpc3QuYWRkKEJsb2NrVGFnLkhFQURJTkdfMy5nZXROYW1lKCkpOwotCQlyZXR1cm5MaXN0LmFkZChCbG9ja1RhZy5IRUFESU5HXzQuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuTGlzdC5hZGQoQmxvY2tUYWcuSEVBRElOR181LmdldE5hbWUoKSk7Ci0JCXJldHVybkxpc3QuYWRkKEJsb2NrVGFnLkhFQURJTkdfNi5nZXROYW1lKCkpOwotCQlyZXR1cm5MaXN0LmFkZChCbG9ja1RhZy5BRERSRVNTLmdldE5hbWUoKSk7Ci0JCXJldHVybkxpc3QuYWRkKEJsb2NrVGFnLlBSRUZPUk1BVFRFRF9URVhULmdldE5hbWUoKSk7Ci0KLQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JfQotCQotCQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc2VsZWN0ZWQgPSBnZXRDQ29tYm9TZWxlY3Rpb24oKTsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5GT1JNQVRfQkxPQ0ssIHNlbGVjdGVkKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQm9sZEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Cb2xkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YmM2NDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Cb2xkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogVG9nZ2xlcyB0aGUgJ2JvbGQnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJvbGRBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBCb2xkQWN0aW9uKGZpbmFsIElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19DSEVDS19CT1gpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQk9MRCk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0JPTEQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5ib2xkQWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JCS8vIGFkZCBsaXN0ZW5lcgotCQlyaWNoVGV4dC5hZGRMaXN0ZW5lcihTV1QuU0VMRUNURUQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0Q2hlY2tlZChyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmlzQm9sZCgpKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkJPTEQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9DbGVhckNvbnRlbnRBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ2xlYXJDb250ZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlODM1MDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9DbGVhckNvbnRlbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIENsZWFycyB0aGUgY29udGVudCBvZiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENsZWFyQ29udGVudEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENsZWFyQ29udGVudEFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQ0xFQVJfQ09OVEVOVCk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0NMRUFSX0NPTlRFTlQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5jbGVhckNvbnRlbnRBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgcyByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAoUmljaFRleHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlQcm9tcHQoCi0JCQkJCVJpY2hUZXh0UmVzb3VyY2VzLmNsZWFyQ29udGVudERpYWxvZ190aXRsZSwKLQkJCQkJUmljaFRleHRSZXNvdXJjZXMuY2xlYXJDb250ZW50RGlhbG9nX3RleHQpKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkNMRUFSX0NPTlRFTlQpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0NvcHlBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ29weUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmYyZjZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ29weUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotCi0vKioKLSAqIENvcGllcyB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sIHRvIHRoZSBjbGlwYm9hcmQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29weUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvcHlBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0NPUFkpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19DT1BZKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuY29weUFjdGlvbl90b29sVGlwVGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHJlYWRvbmx5IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluUmVhZE9ubHlNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlCi0JICogcmljaCB0ZXh0IGVkaXRvciBpcyBpbiBzb3VyY2UgZWRpdCBtb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBSaWNoVGV4dEVkaXRvcgotCQkJCQkmJiAoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkuaXNIVE1MVGFiU2VsZWN0ZWQoKSkgewotCQkJCVN0eWxlZFRleHQgc3R5bGVkVGV4dCA9ICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KS5nZXRTb3VyY2VFZGl0KCk7Ci0JCQkJc3R5bGVkVGV4dC5jb3B5KCk7Ci0JCQl9IGVsc2UgewotCQkJCXJpY2hUZXh0LnNldENvcHlVUkwoKTsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQ09QWSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ3V0QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0N1dEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODI4ODgzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ3V0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci0KLS8qKgotICogQ3V0cyB0aGUgc2VsZWN0ZWQgdGV4dCBpbiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgdG8gdGhlIGNsaXBib2FyZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXRBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDdXRBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0NVVCk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0NVVCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmN1dEFjdGlvbl90b29sVGlwVGV4dCk7IAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlCi0JICogcmljaCB0ZXh0IGVkaXRvciBpcyBpbiBzb3VyY2UgZWRpdCBtb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBSaWNoVGV4dEVkaXRvcgotCQkJCQkmJiAoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkuaXNIVE1MVGFiU2VsZWN0ZWQoKSkgewotCQkJCVN0eWxlZFRleHQgc3R5bGVkVGV4dCA9ICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KQotCQkJCQkJLmdldFNvdXJjZUVkaXQoKTsKLQkJCQlzdHlsZWRUZXh0LmN1dCgpOwotCQkJfSBlbHNlIHsKLQkJCQlyaWNoVGV4dC5zZXRDb3B5VVJMKCk7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkNVVCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0ZpbmRSZXBsYWNlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0ZpbmRSZXBsYWNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZTM1ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9GaW5kUmVwbGFjZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3MuRmluZFJlcGxhY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEZpbmRzIGFuZCByZXBsYWNlcyB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmluZFJlcGxhY2VBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBGaW5kcyB0ZXh0IHN1YiBhY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklORF9URVhUID0gMTsKLQotCS8qKgotCSAqIFJlcGxhY2VzIHRleHQgc3ViIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBMQUNFX1RFWFQgPSAyOwotCi0JLyoqCi0JICogUmVwbGFjZXMgYW5kIGZpbmRzIHRleHQgc3ViIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBMQUNFX0ZJTkRfVEVYVCA9IDM7Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyBhbGwgc3ViIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBMQUNFX0FMTF9URVhUID0gNDsKLQotCS8qKgotCSAqIEZpbmQgbWF0Y2ggaW4gYSBmb3J3YXJkIGRpcmVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JXQVJEX01BVENIID0gMTsKLQotCS8qKgotCSAqIEZpbmQgbWF0Y2ggaW4gYSBiYWNrd2FyZCBkaXJlY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFDS1dBUkRfTUFUQ0ggPSAtMTsKLQotCS8qKgotCSAqIFdob2xlIHdvcmQgbWF0Y2guCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0hPTEVfV09SRF9NQVRDSCA9IDI7Ci0KLQkvKioKLQkgKiBDYXNlIHNlbnNpdGl2ZSBtYXRjaC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNFX1NFTlNJVElWRV9NQVRDSCA9IDQ7Ci0KLQkvLyBFbmNvZGVkIHNpbmdsZSBxdW90ZS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RFRF9TSU5HTEVfUVVPVEUgPSAiJXNxJSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSVJpY2hUZXh0IHJpY2hUZXh0OwotCi0JcHJpdmF0ZSBTdHlsZWRUZXh0IHN0eWxlZFRleHQ7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmb3VuZE1hdGNoID0gZmFsc2U7Ci0JCi0JLy8gdGhlIGRpYWxvZyBpbnN0YW5jZQotCXByb3RlY3RlZCBGaW5kUmVwbGFjZURpYWxvZyBkaWFsb2c7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBGaW5kUmVwbGFjZUFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfRklORF9SRVBMQUNFKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfRklORF9SRVBMQUNFKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuZmluZFJlcGxhY2VBY3Rpb25fdG9vbFRpcFRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlCi0JICogcmljaCB0ZXh0IGVkaXRvciBpcyBpbiByZWFkb25seSBtb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblJlYWRPbmx5TW9kZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlCi0JICogcmljaCB0ZXh0IGVkaXRvciBpcyBpbiBzb3VyY2UgZWRpdCBtb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmICh0aGlzLnJpY2hUZXh0ID09IG51bGwpCi0JCQl0aGlzLnJpY2hUZXh0ID0gcmljaFRleHQ7Ci0JCWlmICh0aGlzLnJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGRpYWxvZyAhPSBudWxsKSB7Ci0JCQkJCWRpYWxvZy5zZXRGaW5kT25seSghdGhpcy5yaWNoVGV4dC5nZXRFZGl0YWJsZSgpKTsKLQkJCQkJZGlhbG9nLm9wZW4oKTsKLQkJCQl9IGVsc2UgewotCQkJCQlkaWFsb2cgPSBuZXcgRmluZFJlcGxhY2VEaWFsb2coRGlzcGxheQotCQkJCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgdGhpcywgIXRoaXMucmljaFRleHQKLQkJCQkJCQkuZ2V0RWRpdGFibGUoKSk7Ci0JCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgbWF0Y2ggaXMgZm91bmQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIG1hdGNoIGlzIGZvdW5kLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEZvdW5kTWF0Y2goKSB7Ci0JCXJldHVybiBmb3VuZE1hdGNoOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHN1YkFjdGlvbgotCSAqICAgICAgICAgICAgdGhlIHN1YiBhY3Rpb24gdG8gZXhlY3V0ZQotCSAqIEBwYXJhbSBmaW5kVGV4dAotCSAqICAgICAgICAgICAgdGhlIGZpbmQgdGV4dAotCSAqIEBwYXJhbSByZXBsYWNlVGV4dAotCSAqICAgICAgICAgICAgdGhlIHJlcGxhY2UgdGV4dAotCSAqIEBwYXJhbSBtYXRjaERpcgotCSAqICAgICAgICAgICAgdGhlIG1hdGNoIGRpcmVjdGlvbjsgdGhlIHZhbHVlIGNhbiBlaXRoZXIgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPkZJTkRfRk9SV0FSRDwvY29kZT4gb3IgPGNvZGU+RklORF9CQUNLV0FSRDwvY29kZT4uCi0JICogQHBhcmFtIG1hdGNoT3B0aW9ucwotCSAqICAgICAgICAgICAgdGhlIG1hdGNoIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oaW50IHN1YkFjdGlvbiwgU3RyaW5nIGZpbmRUZXh0LCBTdHJpbmcgcmVwbGFjZVRleHQsCi0JCQlpbnQgbWF0Y2hEaXIsIGludCBtYXRjaE9wdGlvbnMpIHsKLQkJc3R5bGVkVGV4dCA9IG51bGw7Ci0JCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIFJpY2hUZXh0RWRpdG9yCi0JCQkJJiYgKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpLmlzSFRNTFRhYlNlbGVjdGVkKCkpIHsKLQkJCXN0eWxlZFRleHQgPSAoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkuZ2V0U291cmNlRWRpdCgpOwotCQl9Ci0JCWlmIChzdHlsZWRUZXh0ID09IG51bGwpIHsKLQkJCWlmIChmaW5kVGV4dC5pbmRleE9mKCInIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWZpbmRUZXh0ID0gZmluZFRleHQucmVwbGFjZUFsbCgiJyIsIEVOQ09ERURfU0lOR0xFX1FVT1RFKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKHJlcGxhY2VUZXh0LmluZGV4T2YoIiciKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmVwbGFjZVRleHQgPSByZXBsYWNlVGV4dC5yZXBsYWNlQWxsKCInIiwgRU5DT0RFRF9TSU5HTEVfUVVPVEUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJdHJ5IHsKLQkJCWZvdW5kTWF0Y2ggPSBmYWxzZTsKLQkJCWludCBzdGF0dXMgPSAwOwotCQkJc3dpdGNoIChzdWJBY3Rpb24pIHsKLQkJCWNhc2UgRklORF9URVhUOgotCQkJCXN0YXR1cyA9IGZpbmRUZXh0KGZpbmRUZXh0LCBtYXRjaERpciwgbWF0Y2hPcHRpb25zKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVQTEFDRV9URVhUOgotCQkJCXN0YXR1cyA9IHJlcGxhY2VUZXh0KHJlcGxhY2VUZXh0LCBtYXRjaERpciwgbWF0Y2hPcHRpb25zKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVQTEFDRV9GSU5EX1RFWFQ6Ci0JCQkJc3RhdHVzID0gcmVwbGFjZUZpbmRUZXh0KGZpbmRUZXh0LCByZXBsYWNlVGV4dCwgbWF0Y2hEaXIsCi0JCQkJCQltYXRjaE9wdGlvbnMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRVBMQUNFX0FMTF9URVhUOgotCQkJCXJlcGxhY2VBbGwoZmluZFRleHQsIHJlcGxhY2VUZXh0LCBtYXRjaE9wdGlvbnMpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHN0YXR1cyA+IDApCi0JCQkJZm91bmRNYXRjaCA9IHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFc2NhcGVzIHRoZSBnaXZlbiB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0ZXh0IHRvIGJlIGVzY2FwZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyB0ZXh0KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IHRleHRTaXplID0gdGV4dC5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0U2l6ZTsgaSsrKSB7Ci0JCQljaGFyIGNoID0gdGV4dC5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICc8JzoKLQkJCQlzYi5hcHBlbmQoWE1MVXRpbC5YTUxfTFQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnPic6Ci0JCQkJc2IuYXBwZW5kKFhNTFV0aWwuWE1MX0dUKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJyYnOgotCQkJCXNiLmFwcGVuZChYTUxVdGlsLlhNTF9BTVApOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzYi5hcHBlbmQoY2gpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgaW50IGZpbmRUZXh0KFN0cmluZyBmaW5kVGV4dCwgaW50IG1hdGNoRGlyLCBpbnQgbWF0Y2hPcHRpb25zKSB7Ci0JCWludCBzdGF0dXMgPSAwOwotCQlpZiAoc3R5bGVkVGV4dCAhPSBudWxsKSB7Ci0JCQlzdGF0dXMgPSBzdHlsZWRUZXh0RmluZFRleHRBbmRTZWxlY3QoZmluZFRleHQsIG1hdGNoRGlyLAotCQkJCQltYXRjaE9wdGlvbnMpOwotCQl9IGVsc2UgewotCQkJc3RhdHVzID0gcmljaFRleHQKLQkJCQkJLmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5GSU5EX1RFWFQsIG5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJZmluZFRleHQsICIiICsgbWF0Y2hEaXIsICIiICsgbWF0Y2hPcHRpb25zIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkJCi0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcml2YXRlIGludCByZXBsYWNlVGV4dChTdHJpbmcgcmVwbGFjZVRleHQsIGludCBtYXRjaERpciwgaW50IG1hdGNoT3B0aW9ucykgewotCQlpbnQgc3RhdHVzID0gMDsKLQkJaWYgKHN0eWxlZFRleHQgIT0gbnVsbCkgewotCQkJc3RhdHVzID0gc3R5bGVkVGV4dFJlcGxhY2VUZXh0QW5kU2VsZWN0KHJlcGxhY2VUZXh0KTsKLQkJfSBlbHNlIHsKLQkJCXN0YXR1cyA9IHJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5SRVBMQUNFX1RFWFQsCi0JCQkJCW5ldyBTdHJpbmdbXSB7IHJlcGxhY2VUZXh0LAotCQkJCQkJCSIiICsgbWF0Y2hEaXIsICIiICsgbWF0Y2hPcHRpb25zIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkJCQotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgcmVwbGFjZUZpbmRUZXh0KFN0cmluZyBmaW5kVGV4dCwgU3RyaW5nIHJlcGxhY2VUZXh0LAotCQkJaW50IG1hdGNoRGlyLCBpbnQgbWF0Y2hPcHRpb25zKSB7Ci0JCWludCBzdGF0dXMgPSAwOwotCQlpZiAoc3R5bGVkVGV4dCAhPSBudWxsKSB7Ci0JCQlzdHlsZWRUZXh0UmVwbGFjZVRleHRBbmRTZWxlY3QocmVwbGFjZVRleHQpOwotCQkJc3RhdHVzID0gc3R5bGVkVGV4dEZpbmRUZXh0QW5kU2VsZWN0KGZpbmRUZXh0LCBtYXRjaERpciwKLQkJCQkJbWF0Y2hPcHRpb25zKTsKLQkJfSBlbHNlIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5SRVBMQUNFX1RFWFQsIG5ldyBTdHJpbmdbXSB7Ci0JCQkJCXJlcGxhY2VUZXh0LCAiIiArIG1hdGNoRGlyLCAiIiArIG1hdGNoT3B0aW9ucyB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlzdGF0dXMgPSByaWNoVGV4dAotCQkJCQkuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkZJTkRfVEVYVCwgbmV3IFN0cmluZ1tdIHsKLQkJCQkJCQlmaW5kVGV4dCwgIiIgKyBtYXRjaERpciwgIiIgKyBtYXRjaE9wdGlvbnMgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlcGxhY2VBbGwoU3RyaW5nIGZpbmRUZXh0LCBTdHJpbmcgcmVwbGFjZVRleHQsCi0JCQlpbnQgbWF0Y2hPcHRpb25zKSB7Ci0JCWlmIChzdHlsZWRUZXh0ICE9IG51bGwpIHsKLQkJCXN0eWxlZFRleHRSZXBsYWNlQWxsKGZpbmRUZXh0LCByZXBsYWNlVGV4dCwgbWF0Y2hPcHRpb25zKTsKLQkJfSBlbHNlIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5SRVBMQUNFX0FMTF9URVhULAotCQkJCQluZXcgU3RyaW5nW10geyBlc2NhcGUoZmluZFRleHQpLCBlc2NhcGUocmVwbGFjZVRleHQpLAotCQkJCQkJCSIiICsgbWF0Y2hPcHRpb25zIH0pOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBzdHlsZWRUZXh0RmluZFRleHRBbmRTZWxlY3QoU3RyaW5nIGZpbmRUZXh0LCBpbnQgbWF0Y2hEaXIsCi0JCQlpbnQgbWF0Y2hPcHRpb25zKSB7Ci0JCVBvaW50IHNlbGVjdGlvbk9mZnNldCA9IHN0eWxlZFRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKLQkJaW50IGZpcnN0U2VsZWN0ZWRPZmZzZXQgPSBzZWxlY3Rpb25PZmZzZXQueDsKLQkJaW50IGxhc3RTZWxlY3RlZE9mZnNldCA9IHNlbGVjdGlvbk9mZnNldC54ICsgc2VsZWN0aW9uT2Zmc2V0LnkgLSAxOwotCQlTdHJpbmcgaHRtbFRleHQgPSBzdHlsZWRUZXh0LmdldFRleHQoKTsKLQkJaW50IGluZGV4T2ZNYXRjaCA9IC0xOwotCQlpZiAoKG1hdGNoT3B0aW9ucyAmIENBU0VfU0VOU0lUSVZFX01BVENIKSA9PSAwKSB7Ci0JCQkvLyBUT0RPOiB1c2UgdG9VcHBlckNhc2UoTG9jYWxlKSBvbmNlIGxpYnJhcnkgaGFzIGxvY2FsZSBhdHRyaWJ1dGUKLQkJCWh0bWxUZXh0ID0gaHRtbFRleHQudG9VcHBlckNhc2UoKTsKLQkJCWZpbmRUZXh0ID0gZmluZFRleHQudG9VcHBlckNhc2UoKTsKLQkJfQotCQlkbyB7Ci0JCQlpZiAoaW5kZXhPZk1hdGNoICE9IC0xKSB7Ci0JCQkJbGFzdFNlbGVjdGVkT2Zmc2V0ID0gaW5kZXhPZk1hdGNoICsgMTsKLQkJCQlmaXJzdFNlbGVjdGVkT2Zmc2V0ID0gaW5kZXhPZk1hdGNoIC0gMTsKLQkJCX0KLQkJCWlmIChtYXRjaERpciA9PSBGT1JXQVJEX01BVENIKSB7Ci0JCQkJaW5kZXhPZk1hdGNoID0gaHRtbFRleHQuaW5kZXhPZihmaW5kVGV4dCwKLQkJCQkJCWxhc3RTZWxlY3RlZE9mZnNldCArIDEpOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleE9mTWF0Y2ggPSBodG1sVGV4dC5sYXN0SW5kZXhPZihmaW5kVGV4dCwKLQkJCQkJCWZpcnN0U2VsZWN0ZWRPZmZzZXQgLSAxKTsKLQkJCX0KLQkJfSB3aGlsZSAoaW5kZXhPZk1hdGNoICE9IC0xCi0JCQkJJiYgKChtYXRjaE9wdGlvbnMgJiBXSE9MRV9XT1JEX01BVENIKSA9PSBXSE9MRV9XT1JEX01BVENIKQotCQkJCSYmIGlzUGFydE9mV29yZChodG1sVGV4dCwgaW5kZXhPZk1hdGNoLCBmaW5kVGV4dC5sZW5ndGgoKSkpOwotCQlpZiAoaW5kZXhPZk1hdGNoICE9IC0xKSB7Ci0JCQlzdHlsZWRUZXh0LnNldFNlbGVjdGlvblJhbmdlKGluZGV4T2ZNYXRjaCwgZmluZFRleHQubGVuZ3RoKCkpOwotCQkJc3R5bGVkVGV4dC5zaG93U2VsZWN0aW9uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgc2VsZWN0ZWRUZXh0ID0gc3R5bGVkVGV4dC5nZXRTZWxlY3Rpb25UZXh0KCk7Ci0JCQlpZiAoKG1hdGNoT3B0aW9ucyAmIENBU0VfU0VOU0lUSVZFX01BVENIKSA9PSAwKSB7Ci0JCQkJc2VsZWN0ZWRUZXh0ID0gc2VsZWN0ZWRUZXh0LnRvVXBwZXJDYXNlKCk7Ci0JCQl9Ci0JCQlpZiAoc2VsZWN0ZWRUZXh0LmVxdWFscyhmaW5kVGV4dCkpIHsKLQkJCQlpbmRleE9mTWF0Y2ggPSBzdHlsZWRUZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZXhPZk1hdGNoOwotCi0JfQotCi0JcHJpdmF0ZSBpbnQgc3R5bGVkVGV4dFJlcGxhY2VUZXh0QW5kU2VsZWN0KFN0cmluZyByZXBsYWNlVGV4dCkgewotCQlQb2ludCBzZWxlY3Rpb25PZmZzZXQgPSBzdHlsZWRUZXh0LmdldFNlbGVjdGlvblJhbmdlKCk7Ci0JCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZShzZWxlY3Rpb25PZmZzZXQueCwgc2VsZWN0aW9uT2Zmc2V0LnksCi0JCQkJcmVwbGFjZVRleHQpOwotCQlzdHlsZWRUZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvbk9mZnNldC54LCByZXBsYWNlVGV4dC5sZW5ndGgoKSk7Ci0KLQkJcmV0dXJuIDE7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0eWxlZFRleHRSZXBsYWNlQWxsKFN0cmluZyBmaW5kVGV4dCwgU3RyaW5nIHJlcGxhY2VUZXh0LAotCQkJaW50IG1hdGNoT3B0aW9ucykgewotCQlzdHlsZWRUZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIDApOwotCQl3aGlsZSAoc3R5bGVkVGV4dEZpbmRUZXh0QW5kU2VsZWN0KGZpbmRUZXh0LCBGT1JXQVJEX01BVENILAotCQkJCW1hdGNoT3B0aW9ucykgIT0gLTEpIHsKLQkJCXN0eWxlZFRleHRSZXBsYWNlVGV4dEFuZFNlbGVjdChyZXBsYWNlVGV4dCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNXb3JkQ2hhcihjaGFyIGMpIHsKLQkJaWYgKENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoYykpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1BhcnRPZldvcmQoU3RyaW5nIHRleHQsIGludCBpbmRleCwgaW50IGxlbmd0aCkgewotCQlpZiAoaW5kZXggPiAwKQotCQkJaWYgKGlzV29yZENoYXIodGV4dC5jaGFyQXQoaW5kZXggLSAxKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCWlmICh0ZXh0Lmxlbmd0aCgpID49IGluZGV4ICsgbGVuZ3RoKQotCQkJaWYgKGlzV29yZENoYXIodGV4dC5jaGFyQXQoaW5kZXggKyBsZW5ndGgpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJUmljaFRleHQgZ2V0UmljaFRleHQoKSB7Ci0JCXJldHVybiByaWNoVGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSaWNoVGV4dChJUmljaFRleHQgcmljaFRleHQpIHsKLQkJdGhpcy5yaWNoVGV4dCA9IHJpY2hUZXh0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZGlhbG9nICE9IG51bGwpIHsKLQkJCWRpYWxvZy5jbG9zZSgpOwotCQkJZGlhbG9nID0gbnVsbDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250TmFtZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250TmFtZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzFjNWFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvRm9udE5hbWVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogU2V0cyB0aGUgZm9udCBuYW1lIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRm9udE5hbWVBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dENvbWJvQWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEZvbnROYW1lQWN0aW9uKGZpbmFsIElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmZvbnROYW1lQWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQkJLy8gZ2V0IHN5c3RlbSBmb250cwotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBmb250U2V0ID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQlGb250RGF0YVtdIGZvbnRzID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Rm9udExpc3QobnVsbCwgdHJ1ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZm9udHMubGVuZ3RoOyBpKyspIHsKLQkJCWZvbnRTZXQuYWRkKCgoRm9udERhdGEpIGZvbnRzW2ldKS5nZXROYW1lKCkpOwotCQl9Ci0JCWlucHV0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWlucHV0LmFkZChSaWNoVGV4dFJlc291cmNlcy5mb250TmFtZUFjdGlvbl9EZWZhdWx0Rm9udE5hbWUpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGZvbnRTZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgZm9udE5hbWUgPSBpdGVyLm5leHQoKTsKLQkJCWlucHV0LmFkZChmb250TmFtZSk7Ci0JCX0KLQkJCi0JCS8vIGFkZCBsaXN0ZW5lcgotCQlyaWNoVGV4dC5hZGRMaXN0ZW5lcihTV1QuU0VMRUNURUQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3RyaW5nIGZvbnROYW1lID0gcmljaFRleHQuZ2V0U2VsZWN0ZWQoKS5nZXRGb250TmFtZSgpOwotCQkJCWlmIChmb250TmFtZQotCQkJCQkJLmVxdWFscyhSaWNoVGV4dFJlc291cmNlcy5mb250TmFtZUFjdGlvbl9DU1NfRGVmYXVsdCkKLQkJCQkJCXx8IGZvbnROYW1lCi0JCQkJCQkJCS5lcXVhbHMoUmljaFRleHRSZXNvdXJjZXMuZm9udE5hbWVBY3Rpb25fQ1NTX0RlZmF1bHRfTW96aWxsYSkKLQkJCQkJCXx8IGZvbnROYW1lLmVxdWFscygiZGVmYXVsdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZm9udE5hbWUgPSBSaWNoVGV4dFJlc291cmNlcy5mb250TmFtZUFjdGlvbl9EZWZhdWx0Rm9udE5hbWU7Ci0JCQkJfQotCQkJCWludCBpbmRleCA9IGZpbmRGb250TmFtZUluSXRlbXMoZm9udE5hbWUpOwotCQkJCXNldE5vdGlmeUxpc3RlbmVycyhmYWxzZSk7Ci0JCQkJZ2V0Q0NvbWJvKCkuc2VsZWN0KGluZGV4KTsKLQkJCQlzZXROb3RpZnlMaXN0ZW5lcnModHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgaW50IGZpbmRGb250TmFtZUluSXRlbXMoU3RyaW5nIGZvbnROYW1lKSB7Ci0JCWludCBpbmRleCA9IC0xOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGlucHV0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGZvbnQgPSBpdGVyLm5leHQoKTsKLQkJCWluZGV4Kys7Ci0JCQlpZiAoZm9udC5lcXVhbHNJZ25vcmVDYXNlKGZvbnROYW1lKSkgewotCQkJCXJldHVybiBpbmRleDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHNlbGVjdGVkID0gZ2V0Q0NvbWJvU2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0ZWQuZXF1YWxzKFJpY2hUZXh0UmVzb3VyY2VzLmZvbnROYW1lQWN0aW9uX0RlZmF1bHRGb250TmFtZSkpIHsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU0VUX0ZPTlRfTkFNRSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRk9OVF9OQU1FLCBzZWxlY3RlZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldElucHV0KCkgewotCQlyZXR1cm4gaW5wdXQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250U2l6ZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250U2l6ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYThmY2IxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvRm9udFNpemVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBTZXRzIHRoZSBmb250IHNpemUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGb250U2l6ZUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0Q29tYm9BY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRm9udFNpemVBY3Rpb24oZmluYWwgSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0KTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuZm9udFNpemVBY3Rpb25fdG9vbFRpcFRleHQpOwotCQlpbnB1dCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0JCWlucHV0LmFkZCgiRGVmYXVsdCIpOyAvLyROT04tTkxTLTEkCi0JCWlucHV0LmFkZCgiMSIpOyAvLyROT04tTkxTLTEkCi0JCWlucHV0LmFkZCgiMiIpOyAvLyROT04tTkxTLTEkCi0JCWlucHV0LmFkZCgiMyIpOyAvLyROT04tTkxTLTEkCi0JCWlucHV0LmFkZCgiNCIpOyAvLyROT04tTkxTLTEkCi0JCWlucHV0LmFkZCgiNSIpOyAvLyROT04tTkxTLTEkCi0JCWlucHV0LmFkZCgiNiIpOyAvLyROT04tTkxTLTEkCi0JCWlucHV0LmFkZCgiNyIpOyAvLyROT04tTkxTLTEkCQkKLQkJLy8gYWRkIGxpc3RlbmVyCi0JCXJpY2hUZXh0LmFkZExpc3RlbmVyKFNXVC5TRUxFQ1RFRCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkvLyBtb3ppbGxhIHJldHVybnMgImRlZmF1bHQiIGlmIG5vIHNpemUgaXMgYXBwbGllZAotCQkJCS8vIElFIHJldHVybnMgMiBpZiBubyBzaXplIGlzIGFwcGxpZWQKLQkJCQlTdHJpbmcgZm9udFNpemUgPSByaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmdldEZvbnRTaXplKCk7Ci0JCQkJaW50IGluZGV4ID0gLTE7Ci0JCQkJaWYgKGZvbnRTaXplLmVxdWFscygiZGVmYXVsdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaW5kZXggPSAwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbmRleCA9IEludGVnZXIucGFyc2VJbnQoZm9udFNpemUpOwotCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gbGVhdmUgaW5kZXggYXQgLTEgc28gbm90aGluZyBpcyBzZWxlY3RlZAotCQkJCQl9Ci0JCQkJfQotCQkJCXNldE5vdGlmeUxpc3RlbmVycyhmYWxzZSk7Ci0JCQkJZ2V0Q0NvbWJvKCkuc2VsZWN0KGluZGV4KTsKLQkJCQlzZXROb3RpZnlMaXN0ZW5lcnModHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHNlbGVjdGVkID0gZ2V0Q0NvbWJvU2VsZWN0aW9uKCk7Ci0JCQlpZiAoIkRlZmF1bHQiLmVxdWFscyhzZWxlY3RlZCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRk9OVF9TSVpFLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlNFVF9GT05UX1NJWkUsCi0JCQkJCQlzZWxlY3RlZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldElucHV0KCkgewotCQlyZXR1cm4gaW5wdXQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250U3R5bGVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvRm9udFN0eWxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YjVhZDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250U3R5bGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWwuRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogU2V0cyB0aGUgZm9udCBzdHlsZSBmb3IgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZvbnRTdHlsZUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0Q29tYm9BY3Rpb24gewotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEZvbnRTdHlsZUFjdGlvbihmaW5hbCBJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5mb250U3R5bGVBY3Rpb25fdG9vbFRpcFRleHQpOwotCQkKLQkJaW5wdXQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJaW5wdXQuYWRkKEZvbnRTdHlsZS5OT1JNQUwuZ2V0TmFtZSgpKTsKLQkJaW5wdXQuYWRkKEZvbnRTdHlsZS5TRUNUSU9OX0hFQURJTkcuZ2V0TmFtZSgpKTsKLQkJaW5wdXQuYWRkKEZvbnRTdHlsZS5TVUJTRUNUSU9OX0hFQURJTkcuZ2V0TmFtZSgpKTsKLQkJaW5wdXQuYWRkKEZvbnRTdHlsZS5TVUJfU1VCU0VDVElPTl9IRUFESU5HLmdldE5hbWUoKSk7Ci0JCWlucHV0LmFkZChGb250U3R5bGUuUVVPVEUuZ2V0TmFtZSgpKTsKLQkJaW5wdXQuYWRkKEZvbnRTdHlsZS5DT0RFX1NBTVBMRS5nZXROYW1lKCkpOwotCQkvLyBhZGQgbGlzdGVuZXIKLQkJcmljaFRleHQuYWRkTGlzdGVuZXIoU1dULlNFTEVDVEVELCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCVN0cmluZyBibG9ja1N0eWxlID0gcmljaFRleHQuZ2V0U2VsZWN0ZWQoKS5nZXRCbG9ja1N0eWxlKCk7Ci0JCQkJU3RyaW5nIG5hbWUgPSBGb250U3R5bGUuZ2V0Rm9udFN0eWxlTmFtZShibG9ja1N0eWxlKTsKLQkJCQkKLQkJCQlpbnQgaW5kZXggPSAoKExpc3Q8U3RyaW5nPilpbnB1dCkuaW5kZXhPZihuYW1lKTsKLQkJCQlzZXROb3RpZnlMaXN0ZW5lcnMoZmFsc2UpOwotCQkJCWdldENDb21ibygpLnNlbGVjdChpbmRleCk7Ci0JCQkJc2V0Tm90aWZ5TGlzdGVuZXJzKHRydWUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCVN0cmluZyBzZWxlY3RlZCA9IGdldENDb21ib1NlbGVjdGlvbigpOwotCQkJU3RyaW5nIHZhbHVlID0gRm9udFN0eWxlLmdldEZvbnRTdHlsZVZhbHVlKHNlbGVjdGVkKTsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRk9OVF9TVFlMRSwgdmFsdWUpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRJbnB1dCgpIHsKLQkJcmV0dXJuIGlucHV0OwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JQmFzZVJpY2hUZXh0QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0lCYXNlUmljaFRleHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTliYjA0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0lCYXNlUmljaFRleHRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi0vKioKLSAqIFRoZSBiYXNlIGludGVyZmFjZSBmb3IgYSByaWNoIHRleHQgYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQmFzZVJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRvb2wgdGlwIGZvciB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRvb2wgdGlwIHRleHQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sIHRpcCBmb3IgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFRpcFRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0b29sIHRpcCB0ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VG9vbFRpcFRleHQoU3RyaW5nIHRvb2xUaXBUZXh0KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuYWJsZWQgc3RhdHVzIG9mIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBlbmFibGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RW5hYmxlZCgpOwotCi0JLyoqCi0JICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlbmFibGVkCi0JICogICAgICAgICAgICBJZiA8Y29kZT50cnVlPC9jb2RlPiwgZW5hYmxlIHRoZSBhY3Rpb24uIGlmCi0JICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4sIGRpc2FibGUgaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSVJpY2hUZXh0QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0lSaWNoVGV4dEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzBhNTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSVJpY2hUZXh0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgcmljaCB0ZXh0IGJ1dHRvbiBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJpY2hUZXh0QWN0aW9uIGV4dGVuZHMgSUJhc2VSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBmb3IgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBmb3IgdGhlIGFjdGlvbgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1hZ2UgZm9yIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGltYWdlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgZm9yIHRoZSBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNhYmxlZCBpbWFnZSBmb3IgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkaXNhYmxlZCBpbWFnZSBmb3IgdGhlIGFjdGlvbgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXREaXNhYmxlZEltYWdlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkaXNhYmxlZCBpbWFnZSBmb3IgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiAgICAgICAgICAgIHRoZSBkaXNhYmxlZCBpbWFnZSBmb3IgdGhlIGFjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc2FibGVkSW1hZ2UoSW1hZ2UgaW1hZ2UpOwotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHJlYWRvbmx5IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluUmVhZE9ubHlNb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgYWN0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHRoZQotCSAqIHJpY2ggdGV4dCBlZGl0b3IgaXMgaW4gc291cmNlIGVkaXQgbW9kZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5Tb3VyY2VNb2RlKCk7Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBhY3Rpb24ncyBUb29sSXRlbQotCSAqIEBwYXJhbSB0b29sSXRlbQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvb2xJdGVtKFRvb2xJdGVtIHRvb2xJdGVtKTsKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBTV1QgVG9vbEl0ZW0gU3R5bGUgdG8gYmUgdXNlZCBmb3IgdGhpcyBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0eWxlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSVJpY2hUZXh0Q29tYm9BY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSVJpY2hUZXh0Q29tYm9BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNmZTVjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0lSaWNoVGV4dENvbWJvQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLmFjdGlvbnMuQ0NvbWJvQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSByaWNoIHRleHQgY29tYm8gYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICogCi0gKiBAZGVwcmVjYXRlZCB1bnVzZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmljaFRleHRDb21ib0FjdGlvbiBleHRlbmRzIElCYXNlUmljaFRleHRBY3Rpb24gewotCi0vLwkvKioKLS8vCSAqIEFkZHMgYW4gaXRlbS4KLS8vCSAqIAotLy8JICogQHBhcmFtIGl0ZW0KLS8vCSAqICAgICAgICAgICAgdGhlIGl0ZW0gdG8gYmUgYWRkZWQKLS8vCSAqLwotLy8JcHVibGljIHZvaWQgYWRkSXRlbShTdHJpbmcgaXRlbSk7Ci0vLwotLy8JLyoqCi0vLwkgKiBSZXR1cm5zIGFsbCBpdGVtcy4KLS8vCSAqIAotLy8JICogQHJldHVybiBhbiBhcnJheSBvZiBpdGVtcwotLy8JICovCi0vLwlwdWJsaWMgU3RyaW5nW10gZ2V0SXRlbXMoKTsKLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCwgaW50IGluZGV4KTsKLQotCXB1YmxpYyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoKTsKLQkKLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpOwotCQotCXB1YmxpYyBPYmplY3QgZ2V0SW5wdXQoKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBhY3Rpb24ncyBDb250cmlidXRpb25JdGVtCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udHJpYnV0aW9uSXRlbShDQ29tYm9Db250cmlidXRpb25JdGVtIGl0ZW0pOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0luZGVudEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JbmRlbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkNjRlNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0luZGVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBJbmRlbnRzIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW5kZW50QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSW5kZW50QWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19JTkRFTlQpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19JTkRFTlQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5pbmRlbnRBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuSU5ERU5UKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JdGFsaWNBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSXRhbGljQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ODdjNDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JdGFsaWNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBUb2dnbGVzIHRoZSAnaXRhbGljJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEl0YWxpY0FjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEl0YWxpY0FjdGlvbihmaW5hbCBJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0lUQUxJQyk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLml0YWxpY0FjdGlvbl90b29sVGlwVGV4dCk7Ci0JCS8vIGFkZCBsaXN0ZW5lcgotCQlyaWNoVGV4dC5hZGRMaXN0ZW5lcihTV1QuU0VMRUNURUQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0Q2hlY2tlZChyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmlzSXRhbGljKCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuSVRBTElDKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeUNlbnRlckFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5Q2VudGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MWI5NzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5Q2VudGVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIENlbnRlciBqdXN0aWZpZXMgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKdXN0aWZ5Q2VudGVyQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSnVzdGlmeUNlbnRlckFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfSlVTVElGWV9DRU5URVIpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5qdXN0aWZ5Q2VudGVyQWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkpVU1RJRllfQ0VOVEVSKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5RnVsbEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5RnVsbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTJiMTE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeUZ1bGxBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogRnVsbHkganVzdGlmaWVzIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSnVzdGlmeUZ1bGxBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBKdXN0aWZ5RnVsbEFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfSlVTVElGWV9GVUxMKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuanVzdGlmeUZ1bGxBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuSlVTVElGWV9GVUxMKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5TGVmdEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5TGVmdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDkxNTllLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeUxlZnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogTGVmdCBqdXN0aWZpZXMgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKdXN0aWZ5TGVmdEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEp1c3RpZnlMZWZ0QWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19KVVNUSUZZX0xFRlQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5qdXN0aWZ5TGVmdEFjdGlvbl90b29sVGlwVGV4dCk7IAotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5KVVNUSUZZX0xFRlQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0p1c3RpZnlSaWdodEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5UmlnaHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNlMDg1NjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5UmlnaHRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogUmlnaHQganVzdGlmaWVzIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSnVzdGlmeVJpZ2h0QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSnVzdGlmeVJpZ2h0QWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19KVVNUSUZZX1JJR0hUKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuanVzdGlmeVJpZ2h0QWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkpVU1RJRllfUklHSFQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL091dGRlbnRBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvT3V0ZGVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWE5NTczLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvT3V0ZGVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBJbmRlbnRzIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3V0ZGVudEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE91dGRlbnRBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX09VVERFTlQpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19PVVRERU5UKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMub3V0ZGVudEFjdGlvbl90b29sVGlwVGV4dCk7IAotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5PVVRERU5UKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9QYXN0ZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9QYXN0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTE4ZGZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUGFzdGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLkNsaXBib2FyZFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5IVE1MVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBQYXN0ZXMgdGV4dCBmcm9tIHRoZSBjbGlwYm9hcmQgb250byBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBhc3RlQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9VUkwgPSAiU291cmNlVVJMOiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1fRVhUID0gIi5odG0iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9FWFQgPSAiLmh0bWwiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIEhSRUZfUkVGRVJFTkNFUyA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiaHJlZlxccyo9XFxzKlwiKC4qPylcIiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfaW1hZ2VfcmVmID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSIoPChpbWd8aWZyYW1lKS4qP3NyY1xccyo9XFxzKlwiKSguKj8pKFwiKSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgc291cmNlVVJMU3RyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTG9nZ2VyIGxvZ2dlcjsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUkVTT1VSQ0VTID0gInJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFBhc3RlQWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19QQVNURSk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX1BBU1RFKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMucGFzdGVBY3Rpb25fdG9vbFRpcFRleHQpOwotCQlsb2dnZXIgPSBSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHNvdXJjZSBlZGl0IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluU291cmNlTW9kZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCWNvcHlMaW5rUmVzb3VyY2VzKHJpY2hUZXh0KTsKLQkJCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIFJpY2hUZXh0RWRpdG9yCi0JCQkJCSYmICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KS5pc0hUTUxUYWJTZWxlY3RlZCgpKSB7Ci0JCQkJU3R5bGVkVGV4dCBzdHlsZWRUZXh0ID0gKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpCi0JCQkJCQkuZ2V0U291cmNlRWRpdCgpOwotCQkJCXN0eWxlZFRleHQucGFzdGUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlBBU1RFLCBzb3VyY2VVUkxTdHIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIHRoZSBsaW5rIHJlc291cmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5TGlua1Jlc291cmNlcyhJUmljaFRleHQgcmljaFRleHQpIHsKLQkJdHJ5IHsKLQkJCXNvdXJjZVVSTFN0ciA9IENsaXBib2FyZFV0aWwuZ2V0SFRNTFNvdXJjZVVSTCgpOwotCQkJQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQkJU3RyaW5nIGh0bWwgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHMoSFRNTFRyYW5zZmVyCi0JCQkJCS5nZXRJbnN0YW5jZSgpKTsKLQkJCWlmIChodG1sICE9IG51bGwgJiYgaHRtbC5sZW5ndGgoKSA+IDApIHsKLQkJCQlTdHJpbmcgYmFzZVBhdGggPSByaWNoVGV4dC5nZXRCYXNlUGF0aCgpOwotCQkJCVVSTCBzb3VyY2VVUkwgPSBudWxsOwotCQkJCWlmIChzb3VyY2VVUkxTdHIgPT0gbnVsbCB8fCBzb3VyY2VVUkxTdHIubGVuZ3RoKCkgPT0gMAotCQkJCQkJfHwgc291cmNlVVJMU3RyLmVxdWFscygiYWJvdXQ6YmxhbmsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXNvdXJjZVVSTCA9IHJpY2hUZXh0LmdldENvcHlVUkwoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzb3VyY2VVUkwgPSBuZXcgVVJMKHNvdXJjZVVSTFN0cik7Ci0JCQkJfQotCi0JCQkJTWF0Y2hlciBtYXRjaGVyID0gSFJFRl9SRUZFUkVOQ0VTLm1hdGNoZXIoaHRtbCk7Ci0JCQkJd2hpbGUgKG1hdGNoZXIuZmluZCgpKSB7Ci0JCQkJCVN0cmluZyBocmVmID0gTmV0VXRpbC5kZWNvZGVVUkwobWF0Y2hlci5ncm91cCgxKSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlVUkwgaHJlZlVSTCA9IG5ldyBVUkwoc291cmNlVVJMLCBocmVmKTsKLQkJCQkJCVN0cmluZyBzY2hlbWUgPSBocmVmVVJMLmdldFByb3RvY29sKCk7Ci0JCQkJCQlpZiAoc2NoZW1lICE9IG51bGwKLQkJCQkJCQkJJiYgc2NoZW1lCi0JCQkJCQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoTmV0VXRpbC5GSUxFX1NDSEVNRSkpIHsKLQkJCQkJCQlTdHJpbmcgdXJsID0gaHJlZlVSTC5nZXRQYXRoKCk7Ci0JCQkJCQkJRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUoTmV0VXRpbC5kZWNvZGVVUkwodXJsKSk7Ci0JCQkJCQkJRmlsZSB0Z3RGaWxlID0gbnVsbDsKLQkJCQkJCQlGaWxlIHRndERpciA9IG51bGw7Ci0JCQkJCQkJaWYgKGhyZWYuc3RhcnRzV2l0aCgiIyIpIHx8IHNvdXJjZVVSTC5zYW1lRmlsZShocmVmVVJMKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0gZWxzZSBpZiAoaHJlZi5zdGFydHNXaXRoKFJFU09VUkNFUykgfHwgaHJlZi5zdGFydHNXaXRoKCIuLyIgKyBSRVNPVVJDRVMpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJdGd0RmlsZSA9IG5ldyBGaWxlKGJhc2VQYXRoLCBocmVmKTsKLQkJCQkJCQkJdGd0RGlyID0gdGd0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJU3RyaW5nIHJlc1BhdGggPSBnZXRTdWJkaXJlY3RvcnlPZlJlc291cmNlcyhocmVmKTsKLQkJCQkJCQkJdGd0RmlsZSA9IG5ldyBGaWxlKGJhc2VQYXRoICsgUkVTT1VSQ0VTLCByZXNQYXRoKTsKLQkJCQkJCQkJdGd0RGlyID0gdGd0RmlsZTsKLQkJCQkJCQl9Ci0JCQkJCQkJdGd0RGlyLm1rZGlycygpOwotCQkJCQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNyY0ZpbGUsIHRndERpcik7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQltYXRjaGVyID0gcF9pbWFnZV9yZWYubWF0Y2hlcihodG1sKTsKLQkJCQl3aGlsZSAobWF0Y2hlci5maW5kKCkpIHsKLQkJCQkJU3RyaW5nIHNyYyA9IE5ldFV0aWwuZGVjb2RlVVJMKG1hdGNoZXIuZ3JvdXAoMykpOwotCQkJCQl0cnkgewotCQkJCQkJVVJMIHNyY1VSTCA9IG5ldyBVUkwoc291cmNlVVJMLCBzcmMpOwotCQkJCQkJU3RyaW5nIHNjaGVtZSA9IHNyY1VSTC5nZXRQcm90b2NvbCgpOwotCQkJCQkJaWYgKHNjaGVtZSAhPSBudWxsCi0JCQkJCQkJCSYmIHNjaGVtZS5lcXVhbHNJZ25vcmVDYXNlKE5ldFV0aWwuRklMRV9TQ0hFTUUpKSB7Ci0JCQkJCQkJRmlsZSBzcmNGaWxlID0gbnVsbDsKLQkJCQkJCQlTdHJpbmcgYXV0aG9yaXR5ID0gc3JjVVJMLmdldEF1dGhvcml0eSgpOwotCQkJCQkJCWlmIChhdXRob3JpdHkgIT0gbnVsbCkgewotCQkJCQkJCQlzcmNGaWxlID0gbmV3IEZpbGUoTmV0VXRpbC5kZWNvZGVVUkwoYXV0aG9yaXR5ICsgc3JjVVJMLmdldFBhdGgoKSkpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXNyY0ZpbGUgPSBuZXcgRmlsZShOZXRVdGlsLmRlY29kZVVSTChzcmNVUkwuZ2V0UGF0aCgpKSk7Ci0JCQkJCQkJfQotCQkJCQkJCUZpbGUgdGd0RmlsZSA9IG51bGw7Ci0JCQkJCQkJRmlsZSB0Z3REaXIgPSBudWxsOwotCQkJCQkJCWlmIChzcmMuc3RhcnRzV2l0aChSRVNPVVJDRVMpIHx8IHNyYy5zdGFydHNXaXRoKCIuLyIgKyBSRVNPVVJDRVMpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJdGd0RmlsZSA9IG5ldyBGaWxlKGJhc2VQYXRoLCBzcmMpOwotCQkJCQkJCQl0Z3REaXIgPSB0Z3RGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlTdHJpbmcgcmVzUGF0aCA9IGdldFN1YmRpcmVjdG9yeU9mUmVzb3VyY2VzKHNyYyk7Ci0JCQkJCQkJCXRndEZpbGUgPSBuZXcgRmlsZShiYXNlUGF0aCArIFJFU09VUkNFUywgcmVzUGF0aCk7Ci0JCQkJCQkJCXRndERpciA9IHRndEZpbGU7Ci0JCQkJCQkJfQotCQkJCQkJCXRndERpci5ta2RpcnMoKTsKLQkJCQkJCQlGaWxlVXRpbC5jb3B5RmlsZShzcmNGaWxlLCB0Z3REaXIpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIHRoZSBnaXZlbiBIVE1MIGNvbnRlbnQgZnJvbSB0aGUgY2xpcGJvYXJkIGFuZCByZXR1cm5zIHRoZSBzb3VyY2UKLQkgKiBVUkwuCi0JICogCi0JICogQHBhcmFtIGh0bWxDb250ZW50Ci0JICogICAgICAgICAgICB0aGUgSFRNTCBjb250ZW50IGZyb20gdGhlIGNsaXBib2FyZAotCSAqIEByZXR1cm4gdGhlIHNvdXJjZSBVUkwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNvdXJjZVVSTChTdHJpbmcgaHRtbENvbnRlbnQpIHsKLQkJU3RyaW5nIHNvdXJjZVVSTCA9IG51bGw7Ci0JCWludCBzb3VyY2VVUkxJbmRleCA9IGh0bWxDb250ZW50LmluZGV4T2YoU09VUkNFX1VSTCk7Ci0JCWlmIChzb3VyY2VVUkxJbmRleCA+IDApIHsKLQkJCXNvdXJjZVVSTCA9IGh0bWxDb250ZW50LnN1YnN0cmluZyhzb3VyY2VVUkxJbmRleAotCQkJCQkrIFNPVVJDRV9VUkwubGVuZ3RoKCkpOwotCQkJc291cmNlVVJMID0gc291cmNlVVJMLnN1YnN0cmluZygwLCBzb3VyY2VVUkwKLQkJCQkJLmluZGV4T2YoRmlsZVV0aWwuTElORV9TRVApKTsKLQkJCWlmIChzb3VyY2VVUkwudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChIVE1fRVhUKQotCQkJCQl8fCBzb3VyY2VVUkwudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChIVE1MX0VYVCkpIHsKLQkJCQlzb3VyY2VVUkwgPSBzb3VyY2VVUkwuc3Vic3RyaW5nKDAsIHNvdXJjZVVSTC5pbmRleE9mKEZpbGVVdGlsCi0JCQkJCQkuZ2V0RmlsZU5hbWUoc291cmNlVVJMKSkgLSAxKTsKLQkJCQlzb3VyY2VVUkwgPSBzb3VyY2VVUkwucmVwbGFjZSgnXFwnLCAnLycpOwotCQkJfQotCQkJc291cmNlVVJMID0gRmlsZVV0aWwuYXBwZW5kU2VwYXJhdG9yKHNvdXJjZVVSTCwgIi8iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzb3VyY2VVUkw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdWJkaXJlY3RvcnlPZlJlc291cmNlcyhTdHJpbmcgcGF0aCkgewotCQlTdHJpbmcgcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IHJlc19pZHggPSBwYXRoLmluZGV4T2YoUkVTT1VSQ0VTKTsKLQkJaWYgKHJlc19pZHggIT0gLTEpIHsKLQkJCVN0YWNrPFN0cmluZz4gc3RhY2sgPSBuZXcgU3RhY2s8U3RyaW5nPigpOwotCQkJRmlsZSByZWxhdGl2ZSA9IG5ldyBGaWxlKHBhdGgpLmdldFBhcmVudEZpbGUoKTsKLQkJCXdoaWxlICghcmVsYXRpdmUuZ2V0TmFtZSgpLmVxdWFscyhSRVNPVVJDRVMpKSB7Ci0JCQkJc3RhY2sucHVzaChyZWxhdGl2ZS5nZXROYW1lKCkpOwotCQkJCXJlbGF0aXZlID0gcmVsYXRpdmUuZ2V0UGFyZW50RmlsZSgpOwotCQkJfQotCQkJd2hpbGUgKCFzdGFjay5pc0VtcHR5KCkpIHsKLQkJCQlyZXN1bHQgPSByZXN1bHQgKyAoU3RyaW5nKXN0YWNrLnBvcCgpICsgRmlsZS5zZXBhcmF0b3I7Ci0JCQl9Ci0JCX0gCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9QYXN0ZVBsYWluVGV4dEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9QYXN0ZVBsYWluVGV4dEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGM3MWNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUGFzdGVQbGFpblRleHRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLXB1YmxpYyBjbGFzcyBQYXN0ZVBsYWluVGV4dEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQYXN0ZVBsYWluVGV4dEFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfUEFTVEVfUExBSU5fVEVYVCk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX1BBU1RFX1BMQUlOX1RFWFQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5wYXN0ZVBsYWluVGV4dEFjdGlvbl90b29sVGlwVGV4dCk7Ci0JCXNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlCi0JICogcmljaCB0ZXh0IGVkaXRvciBpcyBpbiBzb3VyY2UgZWRpdCBtb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCS8vIGdldCB0ZXh0IGZyb20gY2xpcGJvYXJkCi0JCQlDbGlwYm9hcmQgY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZChEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0JCQlTdHJpbmcgdGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyhUZXh0VHJhbnNmZXIKLQkJCQkJLmdldEluc3RhbmNlKCkpOwotCQkJaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJCXRleHQgPSBTdHJVdGlsLmNvbnZlcnROZXdsaW5lc1RvSFRNTCh0ZXh0KTsKLQkJCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBSaWNoVGV4dEVkaXRvcikgewotCQkJCQkoKFJpY2hUZXh0RWRpdG9yKXJpY2hUZXh0KS5hZGRIVE1MKHRleHQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5BRERfSFRNTCwgdGV4dCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1JpY2hUZXh0QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1JpY2hUZXh0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNWZiYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9SaWNoVGV4dEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIGEgcmljaCB0ZXh0IGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJpY2hUZXh0QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQotCXByb3RlY3RlZCBJUmljaFRleHQgcmljaFRleHQ7Ci0JCi0JcHJvdGVjdGVkIFRvb2xJdGVtIHRvb2xJdGVtOwotCQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGZNZW51QWN0aW9ucyA9IG5ldyBMaW5rZWRIYXNoU2V0PElBY3Rpb24+KCk7Ci0JCi0gICAgcHJvdGVjdGVkIElNZW51Q3JlYXRvciBtZW51Q3JlYXRvciA9IG5ldyBJTWVudUNyZWF0b3IoKSB7Ci0KLSAgICAJcHJpdmF0ZSBNZW51TWFuYWdlciBkcm9wRG93bk1lbnVNZ3I7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgdGhlIG1lbnUgbWFuYWdlciBmb3IgdGhlIGRyb3AtZG93bi4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgdm9pZCBjcmVhdGVEcm9wRG93bk1lbnVNZ3IoKSB7Ci0gICAgICAgICAgICBpZiAoZHJvcERvd25NZW51TWdyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkcm9wRG93bk1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoKTsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPElBY3Rpb24+IGl0ZXIgPSBnZXRNZW51QWN0aW9ucygpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgCUlBY3Rpb24gaXRlbSA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBkcm9wRG93bk1lbnVNZ3IuYWRkKGl0ZW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yI2dldE1lbnUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNZW51IGdldE1lbnUoQ29udHJvbCBwYXJlbnQpIHsKLSAgICAgICAgICAgIGNyZWF0ZURyb3BEb3duTWVudU1ncigpOwotICAgICAgICAgICAgcmV0dXJuIGRyb3BEb3duTWVudU1nci5jcmVhdGVDb250ZXh0TWVudShwYXJlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3IjZ2V0TWVudShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51KQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1lbnUgZ2V0TWVudShNZW51IHBhcmVudCkgewotICAgICAgICAgICAgY3JlYXRlRHJvcERvd25NZW51TWdyKCk7Ci0gICAgICAgICAgICBNZW51IG1lbnUgPSBuZXcgTWVudShwYXJlbnQpOwotICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IGRyb3BEb3duTWVudU1nci5nZXRJdGVtcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElDb250cmlidXRpb25JdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLSAgICAgICAgICAgICAgICBJQ29udHJpYnV0aW9uSXRlbSBuZXdJdGVtID0gaXRlbTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3SXRlbSA9IG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgaXRlbSkuZ2V0QWN0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZXdJdGVtLmZpbGwobWVudSwgLTEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1lbnU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvciNkaXNwb3NlKCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgICAgICBpZiAoZHJvcERvd25NZW51TWdyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkcm9wRG93bk1lbnVNZ3IuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgIGRyb3BEb3duTWVudU1nciA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIobnVsbCwgc3R5bGUpOwotCQl0aGlzLnJpY2hUZXh0ID0gcmljaFRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHJlYWRvbmx5IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluUmVhZE9ubHlNb2RlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgYWN0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHRoZQotCSAqIHJpY2ggdGV4dCBlZGl0b3IgaXMgaW4gc291cmNlIGVkaXQgbW9kZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5Tb3VyY2VNb2RlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUb29sSXRlbShUb29sSXRlbSB0b29sSXRlbSkgewotCQl0aGlzLnRvb2xJdGVtID0gdG9vbEl0ZW07Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJZXhlY3V0ZShyaWNoVGV4dCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBnZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb248SUFjdGlvbj4gZ2V0TWVudUFjdGlvbnMoKSB7Ci0JCXJldHVybiBmTWVudUFjdGlvbnM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZEFjdGlvblRvTWVudShJQWN0aW9uIGFjdGlvbikgewotCQlmTWVudUFjdGlvbnMuYWRkKGFjdGlvbik7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUmljaFRleHRDb21ib0FjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9SaWNoVGV4dENvbWJvQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NmQxNzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9SaWNoVGV4dENvbWJvQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLmFjdGlvbnMuQ0NvbWJvQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiBhIHJpY2ggdGV4dCBjb21ibyBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSaWNoVGV4dENvbWJvQWN0aW9uIGV4dGVuZHMgQ0NvbWJvQ29udHJpYnV0aW9uSXRlbSB7Ci0JCi0JcHJvdGVjdGVkIElSaWNoVGV4dCByaWNoVGV4dDsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHRvb2xUaXBUZXh0OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gbm90aWZ5TGlzdGVuZXJzID0gZmFsc2U7Ci0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBSaWNoVGV4dENvbWJvQWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihTV1QuUkVBRF9PTkxZIHwgU1dULkZMQVQgfCBTV1QuQk9SREVSKTsKLQkJdGhpcy5yaWNoVGV4dCA9IHJpY2hUZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIFJpY2hUZXh0Q29tYm9BY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIoU1dULlJFQURfT05MWSB8IFNXVC5GTEFUIHwgU1dULkJPUkRFUiB8IHN0eWxlKTsKLQkJdGhpcy5yaWNoVGV4dCA9IHJpY2hUZXh0OwotCX0KLQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KTsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgQ29sbGVjdGlvbjxTdHJpbmc+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+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTY4YmY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLlNlYXJjaFVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LAotIG9yZy5lY2xpcHNlLnNlYXJjaCwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjFkYzZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RTZWFyY2guZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZFNlYXJjaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYzBmNDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZFNlYXJjaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmMTkzMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBTZWFyY2ggVUkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIE1ldGhvZCBTZWFyY2ggRGlhbG9nCi1tZXRob2RTZWFyY2hEaWFsb2dMYWJlbD1NZXRob2QgU2VhcmNoCi0KLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRkZWU0Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uuc2VhcmNoLnNlYXJjaFBhZ2VzIj4KLSAgICAgIDxwYWdlIGlkPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLk1ldGhvZFNlYXJjaFBhZ2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5NZXRob2RTZWFyY2hQYWdlIiAgICAgIAotICAgICAgICAgICAgbGFiZWw9IiVtZXRob2RTZWFyY2hEaWFsb2dMYWJlbCIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTWV0aG9kU2VhcmNoLmdpZiIKLSAgICAgICAgICAgIHNpemVIaW50PSIyNTAsMTYwIgotICAgICAgICAgICAgdGFiUG9zaXRpb249IjAiCi0gICAgICAgICAgICBleHRlbnNpb25zPSIqOjEiCi0gICAgICAgICAgICBzaG93U2NvcGVTZWN0aW9uPSJmYWxzZSIJCQotICAgICAgICAgICAgY2FuU2VhcmNoRW5jbG9zaW5nUHJvamVjdHM9ImZhbHNlIj4KLSAgICAgIDwvcGFnZT4gICAgCi0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Ik1ldGhvZFNlYXJjaFBhZ2UiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc2VhcmNoLnNlYXJjaFJlc3VsdFZpZXdQYWdlcyI+Ci0gICAgICA8dmlld1BhZ2UKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLk1ldGhvZFNlYXJjaFJlc3VsdFBhZ2UiCi0JCQlzZWFyY2hSZXN1bHRDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5NZXRob2RTZWFyY2hSZXN1bHQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5NZXRob2RTZWFyY2hSZXN1bHRQYWdlIj4KLSAgICAgIDwvdmlld1BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4gICAKLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL01ldGhvZFNlYXJjaFBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvTWV0aG9kU2VhcmNoUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjdlZDE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvTWV0aG9kU2VhcmNoUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLk1ldGhvZFNlYXJjaElucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWwuTWV0aG9kU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5NZXRob2RTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLk1ldGhvZFNlYXJjaFNjb3BlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkucHJlZmVyZW5jZXMuU2VhcmNoVUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFBhZ2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLk5ld1NlYXJjaFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLS8qKgotICogRGlzcGxheXMgdGhlIE1ldGhvZCBTZWFyY2ggcGFnZSBpbiB0aGUgU2VhcmNoIGRpYWxvZy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RTZWFyY2hQYWdlIGV4dGVuZHMgRGlhbG9nUGFnZSBpbXBsZW1lbnRzIElTZWFyY2hQYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQVJDSF9QQUdFX0lEID0gTWV0aG9kU2VhcmNoUGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgQ29tYm8gc2VhcmNoU3RyaW5nQ29tYm87Ci0KLQlwcml2YXRlIENvbWJvIG5hbWVQYXR0ZXJuQ29tYm87Ci0KLQlwcml2YXRlIEJ1dHRvbiBjYXNlU2Vuc2l0aXZlQ2hlY2tib3g7Ci0KLQlwcml2YXRlIE1ldGhvZFNlYXJjaFNjb3BlVmlld2VyIHNlYXJjaFNjb3BlVmlld2VyOwotCi0JcHJpdmF0ZSBJU2VhcmNoUGFnZUNvbnRhaW5lciBjb250YWluZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RTZWFyY2hQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAxMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgc2VhcmNoU3RyaW5nTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXNlYXJjaFN0cmluZ0xhYmVsLnNldFRleHQoU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoU3RyaW5nTGFiZWxfdGV4dCk7IAotCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQotCQlzZWFyY2hTdHJpbmdDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJc2VhcmNoU3RyaW5nQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCVN0cmluZyBzYXZlZFNlYXJjaFN0cmluZyA9IFNlYXJjaFVJUHJlZmVyZW5jZXMuZ2V0U2VhcmNoU3RyaW5nKCk7Ci0JCWlmIChzYXZlZFNlYXJjaFN0cmluZyAhPSBudWxsICYmIHNhdmVkU2VhcmNoU3RyaW5nLmxlbmd0aCgpID4gMCkgewotCQkJc2VhcmNoU3RyaW5nQ29tYm8uc2V0VGV4dChzYXZlZFNlYXJjaFN0cmluZyk7Ci0JCX0KLQotCQljYXNlU2Vuc2l0aXZlQ2hlY2tib3ggPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJY2FzZVNlbnNpdGl2ZUNoZWNrYm94LnNldFRleHQoU2VhcmNoVUlSZXNvdXJjZXMuY2FzZVNlbnNpdGl2ZUNoZWNrYm94X3RleHQpOyAKLQkJY2FzZVNlbnNpdGl2ZUNoZWNrYm94LnNldFNlbGVjdGlvbihTZWFyY2hVSVByZWZlcmVuY2VzCi0JCQkJLmdldENhc2VTZW5zaXRpdmUoKSk7Ci0KLQkJTGFiZWwgZWxlbWVudE5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZWxlbWVudE5hbWVMYWJlbC5zZXRUZXh0KFNlYXJjaFVJUmVzb3VyY2VzLmVsZW1lbnROYW1lTGFiZWxfdGV4dCk7IAotCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQotCQluYW1lUGF0dGVybkNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQluYW1lUGF0dGVybkNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlTdHJpbmcgc2F2ZWROYW1lUGF0dGVybiA9IFNlYXJjaFVJUHJlZmVyZW5jZXMuZ2V0TmFtZVBhdHRlcm4oKTsKLQkJaWYgKHNhdmVkTmFtZVBhdHRlcm4gIT0gbnVsbCAmJiBzYXZlZE5hbWVQYXR0ZXJuLmxlbmd0aCgpID4gMCkgewotCQkJbmFtZVBhdHRlcm5Db21iby5zZXRUZXh0KHNhdmVkTmFtZVBhdHRlcm4pOwotCQl9IGVsc2UgewotCQkJbmFtZVBhdHRlcm5Db21iby5zZXRUZXh0KCIqIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCW5hbWVQYXR0ZXJuQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY29udGFpbmVyLnNldFBlcmZvcm1BY3Rpb25FbmFibGVkKGdldFNlYXJjaEJ1dHRvbkVuYWJsZWQoKSk7Ci0JCQl9Ci0JCX0pOwotCQluYW1lUGF0dGVybkNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCQljb250YWluZXIuc2V0UGVyZm9ybUFjdGlvbkVuYWJsZWQoZ2V0U2VhcmNoQnV0dG9uRW5hYmxlZCgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0JCUdyb3VwIHNlYXJjaFNjb3BlR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXNlYXJjaFNjb3BlR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCUdyaWREYXRhIHNlYXJjaFNjb3BlR3JvdXBHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlzZWFyY2hTY29wZUdyb3VwR3JpZERhdGEuaGVpZ2h0SGludCA9IDIwMDsKLQkJc2VhcmNoU2NvcGVHcm91cC5zZXRMYXlvdXREYXRhKHNlYXJjaFNjb3BlR3JvdXBHcmlkRGF0YSk7Ci0JCXNlYXJjaFNjb3BlR3JvdXAuc2V0VGV4dChTZWFyY2hVSVJlc291cmNlcy5zY29wZUdyb3VwX3RleHQpOyAKLQotCQlzZWFyY2hTY29wZVZpZXdlciA9IG5ldyBNZXRob2RTZWFyY2hTY29wZVZpZXdlcihzZWFyY2hTY29wZUdyb3VwLAotCQkJCVNXVC5OT05FKTsKLQotCQljb250YWluZXIuc2V0UGVyZm9ybUFjdGlvbkVuYWJsZWQoZ2V0U2VhcmNoQnV0dG9uRW5hYmxlZCgpKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUGFnZSNwZXJmb3JtQWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQWN0aW9uKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwpIHsKLQkJCVNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCVNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaEVycm9yX3RpdGxlLCAKLQkJCQkJU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoRXJyb3JfbXNnLCAKLQkJCQkJU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoRXJyb3JfcmVhc29uKTsgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHNlYXJjaFN0cmluZyA9IHNlYXJjaFN0cmluZ0NvbWJvLmdldFRleHQoKTsKLQkJU3RyaW5nIG5hbWVQYXR0ZXJuID0gbmFtZVBhdHRlcm5Db21iby5nZXRUZXh0KCk7Ci0JCU1ldGhvZFNlYXJjaFNjb3BlIHNlYXJjaFNjb3BlID0gc2VhcmNoU2NvcGVWaWV3ZXIuZ2V0U2VhcmNoU2NvcGUoKTsKLQkJTWV0aG9kU2VhcmNoSW5wdXQgc2VhcmNoSW5wdXQgPSBuZXcgTWV0aG9kU2VhcmNoSW5wdXQoc2VhcmNoU3RyaW5nLAotCQkJCW5hbWVQYXR0ZXJuLCBjYXNlU2Vuc2l0aXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCksIGZhbHNlLAotCQkJCWZhbHNlLCBzZWFyY2hTY29wZSk7Ci0JCU1ldGhvZFNlYXJjaFF1ZXJ5IHNlYXJjaFF1ZXJ5ID0gbmV3IE1ldGhvZFNlYXJjaFF1ZXJ5KHNlYXJjaElucHV0KTsKLQkJTmV3U2VhcmNoVUkuYWN0aXZhdGVTZWFyY2hSZXN1bHRWaWV3KCk7Ci0JCU5ld1NlYXJjaFVJLnJ1blF1ZXJ5SW5CYWNrZ3JvdW5kKHNlYXJjaFF1ZXJ5KTsKLQkJU2VhcmNoVUlQcmVmZXJlbmNlcy5zZXRTZWFyY2hTdHJpbmcoc2VhcmNoU3RyaW5nQ29tYm8uZ2V0VGV4dCgpKTsKLQkJU2VhcmNoVUlQcmVmZXJlbmNlcy5zZXROYW1lUGF0dGVybihuYW1lUGF0dGVybkNvbWJvLmdldFRleHQoKSk7Ci0JCVNlYXJjaFVJUHJlZmVyZW5jZXMuc2V0Q2FzZVNlbnNpdGl2ZShjYXNlU2Vuc2l0aXZlQ2hlY2tib3gKLQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUGFnZSNzZXRDb250YWluZXIoSVNlYXJjaFBhZ2VDb250YWluZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKElTZWFyY2hQYWdlQ29udGFpbmVyIGNvbnRhaW5lcikgewotCQl0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JUmVwbGFjZVBhZ2UjcGVyZm9ybVJlcGxhY2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1SZXBsYWNlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZW5hYmxlZCBzdGF0dXMgb2YgdGhlIFNlYXJjaCBidXR0b24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPGNvZGU+IGlmIHRoZSBTZWFyY2ggYnV0dG9uIHNob3VsZCBiZSBlbmFibGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGdldFNlYXJjaEJ1dHRvbkVuYWJsZWQoKSB7Ci0JCXJldHVybiBuYW1lUGF0dGVybkNvbWJvLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9NZXRob2RTZWFyY2hSZXN1bHRQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL01ldGhvZFNlYXJjaFJlc3VsdFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNhYjUxZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9NZXRob2RTZWFyY2hSZXN1bHRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5Ccm93c2luZ1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29udGVudFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLlBlcnNwZWN0aXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWwuTWV0aG9kRWxlbWVudFZpZXdTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5TZWFyY2hSZXN1bHRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWwuU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5TZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5OZXdTZWFyY2hVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgTWV0aG9kIFNlYXJjaCByZXN1bHQgaW4gdGhlIFNlYXJjaCB2aWV3LiBUaGUgc2VhcmNoIHJlc3VsdAotICogY2FuIGJlIGRpc3BsYXllZCBpbiBhIGhpZXJhcmNoaWNhbCBvciBmbGF0IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2VhcmNoUmVzdWx0UGFnZSBleHRlbmRzIEFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlCi0JCWltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLQotCXByaXZhdGUgU2VhcmNoUmVzdWx0TGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kU2VhcmNoUmVzdWx0UGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJbGFiZWxQcm92aWRlciA9IG5ldyBTZWFyY2hSZXN1bHRMYWJlbFByb3ZpZGVyKCk7Ci0JCQotCQkvLyBDbGVhciB0aGUgc2VhcmNoIHJlc3VsdCB3aGVuIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IGlzIGNsb3NlZCBieSB0aGUgdXNlci4KLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcihuZXcgTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJTWV0aG9kU2VhcmNoUmVzdWx0UGFnZS50aGlzLmdldElucHV0KCkucmVtb3ZlQWxsKCk7Ci0JCQl9CQkJCi0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UjaXNMYXlvdXRTdXBwb3J0ZWQoaW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGF5b3V0U3VwcG9ydGVkKGludCBsYXlvdXQpIHsKLQkJcmV0dXJuICgobGF5b3V0ICYgRkxBR19MQVlPVVRfRkxBVCkgIT0gMCB8fCAobGF5b3V0ICYgRkxBR19MQVlPVVRfVFJFRSkgIT0gMCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSNjb25maWd1cmVUcmVlVmlld2VyKFRyZWVWaWV3ZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlVHJlZVZpZXdlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlcigpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQl2aWV3ZXIuc2V0U29ydGVyKG5ldyBNZXRob2RFbGVtZW50Vmlld1NvcnRlcigpKTsKLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlI2NvbmZpZ3VyZVRhYmxlVmlld2VyKFRhYmxlVmlld2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVRhYmxlVmlld2VyKFRhYmxlVmlld2VyIHZpZXdlcikgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIoKTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJdmlld2VyLnNldFNvcnRlcihuZXcgTWV0aG9kRWxlbWVudFZpZXdTb3J0ZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSNlbGVtZW50c0NoYW5nZWQoT2JqZWN0W10pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZWxlbWVudHNDaGFuZ2VkKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlpZiAoY29udGVudFByb3ZpZGVyIGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlcikgewotCQkJCSgoU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlcikgY29udGVudFByb3ZpZGVyKQotCQkJCQkJLmVsZW1lbnRzQ2hhbmdlZChvYmplY3RzKTsKLQkJCX0gZWxzZSBpZiAoY29udGVudFByb3ZpZGVyIGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIpIHsKLQkJCQkoKFNlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyKSBjb250ZW50UHJvdmlkZXIpCi0JCQkJCQkuZWxlbWVudHNDaGFuZ2VkKG9iamVjdHMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSNjbGVhcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXIoKSB7Ci0JCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJaWYgKGNvbnRlbnRQcm92aWRlciBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIpIHsKLQkJCQkoKFNlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIpIGNvbnRlbnRQcm92aWRlcikuY2xlYXIoKTsKLQkJCX0gZWxzZSBpZiAoY29udGVudFByb3ZpZGVyIGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIpIHsKLQkJCQkoKFNlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyKSBjb250ZW50UHJvdmlkZXIpLmNsZWFyKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlI3Nob3dNYXRjaChNYXRjaCwKLQkgKiAgICAgIGludCwgaW50LCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dNYXRjaChNYXRjaCBtYXRjaCwgaW50IGN1cnJlbnRPZmZzZXQsIGludCBjdXJyZW50TGVuZ3RoLAotCQkJYm9vbGVhbiBhY3RpdmF0ZSkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJaWYgKG1hdGNoLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgYWN0aXZhdGUpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBtYXRjaC5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoUGVyc3BlY3RpdmVVdGlsCi0JCQkJCS5pc0FjdGl2ZVBlcnNwZWN0aXZlKEJyb3dzaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpKSB7Ci0JCQkJUGVyc3BlY3RpdmVVdGlsCi0JCQkJCQkub3BlblBlcnNwZWN0aXZlKEF1dGhvcmluZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKTsKLQkJCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQkJCUlWaWV3UGFydCB2aWV3ID0gYWN0aXZlUGFnZQotCQkJCQkJCS5maW5kVmlldyhOZXdTZWFyY2hVSS5TRUFSQ0hfVklFV19JRCk7Ci0JCQkJCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCQkJCWFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoTmV3U2VhcmNoVUkuU0VBUkNIX1ZJRVdfSUQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZGlzcGxheUVkaXRvcihlbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBNZXRob2QgZWRpdG9yIGZvciB0aGUgc2VsZWN0ZWQgTWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcGxheUVkaXRvcihNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCkgewotCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLm9wZW5FZGl0b3IoCi0JCQkJCVVtYVV0aWwuZ2V0UHJvY2Vzc0NvbXBvbmVudChlbGVtZW50KSk7Ci0JCX0gZWxzZSB7Ci0JCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkub3BlbkVkaXRvcihlbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChQZXJzcGVjdGl2ZVV0aWwKLQkJCQkuaXNBY3RpdmVQZXJzcGVjdGl2ZShCcm93c2luZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKSkgewotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCU9iamVjdFtdIHNlbGVjdGVkRWxlbWVudHMgPSBzZWwudG9BcnJheSgpOwotCQkJCWlmIChzZWxlY3RlZEVsZW1lbnRzICE9IG51bGwgJiYgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQkJCWlmIChzZWxlY3RlZEVsZW1lbnRzWzBdIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlkaXNwbGF5SFRNTFBhZ2UoKE1ldGhvZEVsZW1lbnQpIHNlbGVjdGVkRWxlbWVudHNbMF0pOwotCQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIEhUTUwgY29udGVudCBwYWdlIGZvciB0aGUgc2VsZWN0ZWQgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIENvbnRlbnQgdmlldyBjYW5ub3QgYmUgZGlzcGxheWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcGxheUhUTUxQYWdlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkKLQkJCXRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luCi0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQlJVmlld1BhcnQgdmlldyA9IGFjdGl2ZVBhZ2UuZmluZFZpZXcoQ29udGVudFZpZXcuVklFV19JRCk7Ci0JCQlpZiAodmlldyA9PSBudWxsKSB7Ci0JCQkJdmlldyA9IGFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoQ29udGVudFZpZXcuVklFV19JRCk7Ci0JCQl9Ci0JCQlpZiAodmlldyAhPSBudWxsKSB7Ci0JCQkJKChDb250ZW50VmlldykgdmlldykuZGlzcGxheUhUTUxDb250ZW50UGFnZShlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNmY0NDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgTWV0aG9kIFNlYXJjaCBQYWdlCi1zZWFyY2hTdHJpbmdMYWJlbF90ZXh0PVRleHQgKCogPSBhbnkgc3RyaW5nLCA/ID0gYW55IGNoYXJhY3Rlcik6Ci1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1DYXNlIHNlbnNpdGl2ZQotZWxlbWVudE5hbWVMYWJlbF90ZXh0PU1ldGhvZCBlbGVtZW50IG5hbWUgb3IgcHJlc2VudGF0aW9uIG5hbWUgcGF0dGVybjoKLXNjb3BlR3JvdXBfdGV4dD1TY29wZQotcm9sZUNoZWNrYm94X3RleHQ9Um9sZQotdGFza0NoZWNrYm94X3RleHQ9VGFzawotd29ya1Byb2R1Y3RDaGVja2JveF90ZXh0PVdvcmsgUHJvZHVjdAotCi0jIE1ldGhvZCBTZWFyY2ggUXVlcnkKLXNlYXJjaFF1ZXJ5X3RleHQ9TWV0aG9kIFNlYXJjaAotCi0jIE1ldGhvZCBTZWFyY2ggUHJvZ3Jlc3MgRGlhbG9nCi1zY2FuTGlicmFyeVRhc2tfbmFtZT1TY2FubmluZyBtZXRob2QgbGlicmFyeS4uLgotc2NhbkVsZW1lbnRUYXNrX25hbWU9U2Nhbm5pbmcgbWV0aG9kIGVsZW1lbnQgJyd7MH0nJy4uLgotCi0jIE1ldGhvZCBTZWFyY2ggRXJyb3IgRGlhbG9nCi1zZWFyY2hFcnJvcl90aXRsZT1NZXRob2QgU2VhcmNoCi1zZWFyY2hFcnJvcl9tc2c9SVVQUzAxMDBFOiBTZWFyY2ggb3BlcmF0aW9uIGNhbm5vdCBwcm9jZWVkLgotc2VhcmNoRXJyb3JfcmVhc29uPU5vIG1ldGhvZCBsaWJyYXJ5IGlzIGN1cnJlbnRseSBvcGVuZWQuXG5cbk9wZW4gYSBtZXRob2QgbGlicmFyeSBhbmQgdHJ5IGFnYWluLgotCi0jIE1ldGhvZCBTZWFyY2ggUmVzdWx0Ci1zZWFyY2hSZXN1bHRfbWV0aG9kQ29udGVudD1NZXRob2QgQ29udGVudAotc2VhcmNoUmVzdWx0X2NvbnRlbnRQYWNrYWdlcz1Db250ZW50IFBhY2thZ2VzCi1zZWFyY2hSZXN1bHRfc3RhbmRhcmRDYXRlZ29yaWVzPVN0YW5kYXJkIENhdGVnb3JpZXMKLXNlYXJjaFJlc3VsdF9kaXNjaXBsaW5lcz1EaXNjaXBsaW5lcwotc2VhcmNoUmVzdWx0X2RvbWFpbnM9RG9tYWlucwotc2VhcmNoUmVzdWx0X3dvcmtQcm9kdWN0VHlwZXM9V29yayBQcm9kdWN0IFR5cGVzCi1zZWFyY2hSZXN1bHRfcm9sZVNldHM9Um9sZSBTZXRzCi1zZWFyY2hSZXN1bHRfdG9vbHM9VG9vbHMKLXNlYXJjaFJlc3VsdF9jdXN0b21DYXRlZ29yaWVzPUN1c3RvbSBDYXRlZ29yaWVzCi1zZWFyY2hSZXN1bHRfcHJvY2Vzc2VzPVByb2Nlc3Nlcwotc2VhcmNoUmVzdWx0X2NhcGFiaWxpdHlQYXR0ZXJucz1DYXBhYmlsaXR5IFBhdHRlcm5zCi1zZWFyY2hSZXN1bHRfZGVsaXZlcnlQcm9jZXNzZXM9RGVsaXZlcnkgUHJvY2Vzc2VzCi1zZWFyY2hSZXN1bHRfbWF0Y2g9Jyd7MH0nJyAtIDEgbWF0Y2gKLXNlYXJjaFJlc3VsdF9tYXRjaGVzPScnezB9JycgLSB7MX0gbWF0Y2hlcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9TZWFyY2hVSVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9TZWFyY2hVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzMzN2ZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvU2VhcmNoVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBTZWFyY2ggVUkgcGx1Zy1pbiBhY3RpdmF0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VhcmNoVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgU2VhcmNoVUlQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VhcmNoVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTZWFyY2hVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9TZWFyY2hVSVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9TZWFyY2hVSVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzBkMzJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvU2VhcmNoVUlSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBTZWFyY2ggVUkgcmVzb3VyY2UgYnVuZGxlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNlYXJjaFVJUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IFNlYXJjaFVJUmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFN0cmluZ0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnROYW1lTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNjb3BlR3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVDaGVja2JveF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0NoZWNrYm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdENoZWNrYm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hRdWVyeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2NhbkxpYnJhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzY2FuRWxlbWVudFRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaEVycm9yX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X21ldGhvZENvbnRlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfY29udGVudFBhY2thZ2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X3N0YW5kYXJkQ2F0ZWdvcmllczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9kaXNjaXBsaW5lczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9kb21haW5zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X3dvcmtQcm9kdWN0VHlwZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfcm9sZVNldHM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfdG9vbHM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfY3VzdG9tQ2F0ZWdvcmllczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9wcm9jZXNzZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfY2FwYWJpbGl0eVBhdHRlcm5zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X2RlbGl2ZXJ5UHJvY2Vzc2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X21hdGNoOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X21hdGNoZXM7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBTZWFyY2hVSVJlc291cmNlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBTZWFyY2hVSVJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlLgotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSU1ldGhvZFNlYXJjaFF1ZXJ5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lNZXRob2RTZWFyY2hRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzhlZGFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSU1ldGhvZFNlYXJjaFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeTsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIG1ldGhvZCBzZWFyY2ggcXVlcnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWV0aG9kU2VhcmNoUXVlcnkgZXh0ZW5kcyBJU2VhcmNoUXVlcnkgewotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JU2VhcmNoUmVzdWx0Q29sbGVjdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lTZWFyY2hSZXN1bHRDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwYjUwMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lTZWFyY2hSZXN1bHRDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBtZXRob2Qgc2VhcmNoIHJlc3VsdCBjb2xsZWN0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZWFyY2hSZXN1bHRDb2xsZWN0b3IgewotCi0JLyoqCi0JICogRXZhbHVhdGVzIHRoZSBnaXZlbiBvYmplY3QgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbWF0Y2ggaW4gdGhlIHNlYXJjaAotCSAqIGNyaXRlcmlhLgotCSAqIAotCSAqIEBwYXJhbSBtYXRjaAotCSAqICAgICAgICAgICAgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG1ldGhvZCBlbGVtZW50IHRvIG1hdGNoCi0JICovCi0Jdm9pZCBhY2NlcHQoT2JqZWN0IG1hdGNoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RFbGVtZW50Vmlld1NvcnRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RFbGVtZW50Vmlld1NvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmM0MWNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kRWxlbWVudFZpZXdTb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLQotLyoqCi0gKiBTb3J0cyB0aGUgbWV0aG9kIGVsZW1lbnRzIGluIGEgc3BlY2lmaWMgb3JkZXIgZm9yIGRpc3BsYXkgaW4gdGhlIFNlYXJjaAotICogdmlldy4KLSAqIDxwPgotICogVGhlIG1ldGhvZCBlbGVtZW50cyBhcmUgc29ydGVkIGJ5IHR5cGVzLiBXaXRoaW4gZWFjaCB0eXBlLCB0aGUgZWxlbWVudHMgYXJlCi0gKiBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkgYnkgbmFtZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudFZpZXdTb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudFZpZXdTb3J0ZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlciNjb21wYXJlKFZpZXdlciwgT2JqZWN0LAotCSAqICAgICAgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQlpZiAoZTEgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCWlmICghKGUyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQlpZiAoZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSBpZiAoIShlMiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCWlmIChlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBlMiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgaWYgKCEoZTIgaW5zdGFuY2VvZiBSb2xlKSkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCWlmIChlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBlMiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlCi0JCQkJCXx8IGUyIGluc3RhbmNlb2YgUm9sZSkgewotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmICghKGUyIGluc3RhbmNlb2YgVGFzaykpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJaWYgKGUyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGUyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UKLQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBSb2xlIHx8IGUyIGluc3RhbmNlb2YgVGFzaykgewotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmICghKGUyIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCWlmIChlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBlMiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlCi0JCQkJCXx8IGUyIGluc3RhbmNlb2YgUm9sZSB8fCBlMiBpbnN0YW5jZW9mIFRhc2sKLQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmIChlMiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJU3RyaW5nIG5hbWUxID0gZTEuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQkJU3RyaW5nIG5hbWUyID0gZTIuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQkJaWYgKCFuYW1lMS5lcXVhbHMobmFtZTIpKSB7Ci0JCQkJCXJldHVybiBjb2xsYXRvci5jb21wYXJlKG5hbWUxLCBuYW1lMik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJCWlmIChlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBlMiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlCi0JCQkJCXx8IGUyIGluc3RhbmNlb2YgUm9sZSB8fCBlMiBpbnN0YW5jZW9mIFRhc2sKLQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCB8fCBlMiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkKLQkJCQkJJiYgIShlMiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSkgewotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmICghKGUxIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpCi0JCQkJCSYmIGUyIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9IGVsc2UgaWYgKGUyIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQkJU3RyaW5nIG5hbWUxID0gZTEuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQkJU3RyaW5nIG5hbWUyID0gZTIuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQkJaWYgKCFuYW1lMS5lcXVhbHMobmFtZTIpKSB7Ci0JCQkJCXJldHVybiBjb2xsYXRvci5jb21wYXJlKG5hbWUxLCBuYW1lMik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQlpZiAoZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgZTIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZQotCQkJCQl8fCBlMiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgaWYgKGUyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UgJiYgIShlMiBpbnN0YW5jZW9mIFByb2Nlc3MpKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgaWYgKCEoZTIgaW5zdGFuY2VvZiBQcm9jZXNzKSkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlpZiAoZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgZTIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZQotCQkJCQl8fCBlMiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgaWYgKGUyIGluc3RhbmNlb2YgUHJvY2VzcyAmJiAhKGUxIGluc3RhbmNlb2YgUHJvY2VzcykpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9IGVsc2UgaWYgKCEoZTIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCkgewotCQkJaWYgKGUyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGUyIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZQotCQkJCQl8fCBlMiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50IHx8IGUyIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIFBoYXNlKSB7Ci0JCQkJaWYgKCEoZTIgaW5zdGFuY2VvZiBQaGFzZSkpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBJdGVyYXRpb24pIHsKLQkJCQlpZiAoZTIgaW5zdGFuY2VvZiBQaGFzZSkgewotCQkJCQlyZXR1cm4gMTsKLQkJCQl9Ci0JCQkJaWYgKCEoZTIgaW5zdGFuY2VvZiBJdGVyYXRpb24pKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlpZiAoZTIgaW5zdGFuY2VvZiBQaGFzZSB8fCBlMiBpbnN0YW5jZW9mIEl0ZXJhdGlvbikgewotCQkJCQlyZXR1cm4gMTsKLQkJCQl9Ci0JCQkJaWYgKCEoZTIgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCQlpZiAoZTIgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlyZXR1cm4gMTsKLQkJCQl9Ci0JCQkJaWYgKCEoZTIgaW5zdGFuY2VvZiBNaWxlc3RvbmUpKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQlpZiAoZTIgaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBlMiBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJCQlyZXR1cm4gMTsKLQkJCQl9Ci0JCQkJaWYgKCEoZTIgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCWlmIChlMiBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IGUyIGluc3RhbmNlb2YgTWlsZXN0b25lCi0JCQkJCQl8fCBlMiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCXJldHVybiAxOwotCQkJCX0KLQkJCQlpZiAoIShlMiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSkgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCWlmIChlMiBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IGUyIGluc3RhbmNlb2YgTWlsZXN0b25lCi0JCQkJCQl8fCBlMiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yCi0JCQkJCQl8fCBlMiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCXJldHVybiAxOwotCQkJCX0KLQkJCQlpZiAoIShlMiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIGUxLCBlMik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaElucHV0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaElucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNGQwNzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLS8qKgotICogRW5jYXBzdWxhdGVzIHRoZSBzZWFyY2ggc3RyaW5ncyBhbmQgb3B0aW9ucyB0aGF0IGFyZSB1c2VkIGFzIGlucHV0cyB0byBhCi0gKiBtZXRob2Qgc2VhcmNoLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFNlYXJjaElucHV0IHsKLQotCXByaXZhdGUgU3RyaW5nIHNlYXJjaFN0cmluZzsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWVQYXR0ZXJuOwotCi0JcHJpdmF0ZSBib29sZWFuIGNhc2VTZW5zaXRpdmU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gd2hvbGVXb3JkOwotCi0JcHJpdmF0ZSBib29sZWFuIHJlZ0V4cDsKLQotCXByaXZhdGUgTWV0aG9kU2VhcmNoU2NvcGUgc2VhcmNoU2NvcGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBzZWFyY2hTdHJpbmcKLQkgKiAgICAgICAgICAgIGEgc2VhcmNoIHN0cmluZwotCSAqIEBwYXJhbSBuYW1lUGF0dGVybgotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudCBuYW1lIHBhdHRlcm4KLQkgKiBAcGFyYW0gY2FzZVNlbnNpdGl2ZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIG1ha2UgdGhlIHNlYXJjaCBjYXNlIHNlbnNpdGl2ZQotCSAqIEBwYXJhbSB3aG9sZVdvcmQKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBzZWFyY2ggZm9yIHdob2xlIHdvcmQgb25seQotCSAqIEBwYXJhbSByZWdFeHAKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBzZWFyY2ggdXNpbmcgcmVndWxhciBleHByZXNzaW9uCi0JICogQHBhcmFtIHNlYXJjaFNjb3BlCi0JICogICAgICAgICAgICBhIHNlYXJjaCBzY29wZQotCSAqLwotCXB1YmxpYyBNZXRob2RTZWFyY2hJbnB1dChTdHJpbmcgc2VhcmNoU3RyaW5nLCBTdHJpbmcgbmFtZVBhdHRlcm4sCi0JCQlib29sZWFuIGNhc2VTZW5zaXRpdmUsIGJvb2xlYW4gd2hvbGVXb3JkLCBib29sZWFuIHJlZ0V4cCwKLQkJCU1ldGhvZFNlYXJjaFNjb3BlIHNlYXJjaFNjb3BlKSB7Ci0JCXRoaXMuc2VhcmNoU3RyaW5nID0gc2VhcmNoU3RyaW5nOwotCQl0aGlzLm5hbWVQYXR0ZXJuID0gbmFtZVBhdHRlcm47Ci0JCXRoaXMuY2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zaXRpdmU7Ci0JCXRoaXMud2hvbGVXb3JkID0gd2hvbGVXb3JkOwotCQl0aGlzLnJlZ0V4cCA9IHJlZ0V4cDsKLQkJdGhpcy5zZWFyY2hTY29wZSA9IHNlYXJjaFNjb3BlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlYXJjaCBzdHJpbmcuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VhcmNoIHN0cmluZyB0byBsb29rIGZvciB0aGUgTWV0aG9kIGVsZW1lbnQgY29udGVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VhcmNoU3RyaW5nKCkgewotCQlyZXR1cm4gc2VhcmNoU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgcGF0dGVybi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIHBhdHRlcm4gdXNlZCB0byBtYXRjaCB0aGUgTWV0aG9kIGVsZW1lbnQgbmFtZXMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVQYXR0ZXJuKCkgewotCQlyZXR1cm4gbmFtZVBhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2FzZSBzZW5zaXRpdml0eSBvZiB0aGUgc2VhcmNoLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlYXJjaCBpcyBjYXNlIHNlbnNpdGl2ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldENhc2VTZW5zaXRpdmUoKSB7Ci0JCXJldHVybiBjYXNlU2Vuc2l0aXZlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdob2xlIHdvcmQgb3B0aW9uIG9mIHRoZSBzZWFyY2guCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VhcmNoIGlzIGJhc2VkIG9uIHdob2xlIHdvcmQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRXaG9sZVdvcmQoKSB7Ci0JCXJldHVybiB3aG9sZVdvcmQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVndWxhciBleHByZXNzaW9uIG9wdGlvbiBvZiB0aGUgc2VhcmNoLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlYXJjaCBpcyBiYXNlZCBvbiByZWd1bGFyIGV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRSZWd1bGFyRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHJlZ0V4cDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWFyY2ggc2NvcGUuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VhcmNoIHNjb3BlCi0JICovCi0JcHVibGljIE1ldGhvZFNlYXJjaFNjb3BlIGdldFNlYXJjaFNjb3BlKCkgewotCQlyZXR1cm4gc2VhcmNoU2NvcGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaE9wZXJhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ4NTE3Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ueG1sLkFic3RyYWN0U0FYUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuU2VhcmNoVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5TZWFyY2hVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotLyoqCi0gKiBQZXJmb3JtcyBhIG1ldGhvZCBzZWFyY2ggYnkgaXRlcmF0aW5nIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IGFuZCBwYXJzaW5nCi0gKiB0aGUgY29udGVudCBlbGVtZW50IFhNSSBmaWxlcyB3aGVyZSBuZWNlc3NhcnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2VhcmNoT3BlcmF0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0FOX0xJQlJBUllfVEVYVCA9IFNlYXJjaFVJUmVzb3VyY2VzLnNjYW5MaWJyYXJ5VGFza19uYW1lOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0FOX0VMRU1FTlRfVEVYVCA9IFNlYXJjaFVJUmVzb3VyY2VzLnNjYW5FbGVtZW50VGFza19uYW1lOyAKLQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZzsKLQotCXByaXZhdGUgTWV0aG9kU2VhcmNoSW5wdXQgc2VhcmNoSW5wdXQ7Ci0KLQlwcml2YXRlIElTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0OwotCi0JcHJpdmF0ZSBTdHJpbmcgc2VhcmNoU3RyaW5nOwotCi0JcHJpdmF0ZSBib29sZWFuIGNhc2VTZW5zaXRpdmU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVnRXhwOwotCi0JcHJpdmF0ZSBQYXR0ZXJuIHNlYXJjaFN0cmluZ1BhdHRlcm47Ci0KLQlwcml2YXRlIFBhdHRlcm4gZWxlbWVudE5hbWVQYXR0ZXJuOwotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50U2Nhbm5lciBlbGVtZW50U2Nhbm5lcjsKLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHBhcnNlZEZpbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yOwotCi0JLy8gU2NhbnMgdGhlIGNvbnRlbnQgZWxlbWVudCBYTUkgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBNZXRob2QgZWxlbWVudCB0bwotCS8vIGxvb2sgZm9yIHRoZSBzZWFyY2ggc3RyaW5nLgotCXByaXZhdGUgY2xhc3MgTWV0aG9kRWxlbWVudFNjYW5uZXIgZXh0ZW5kcyBBYnN0cmFjdFNBWFBhcnNlciB7Ci0KLQkJcHJpdmF0ZSBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JCSAqLwotCQlwdWJsaWMgTWV0aG9kRWxlbWVudFNjYW5uZXIoKSB7Ci0JCQlzdXBlcihudWxsLCBmYWxzZSk7Ci0JCX0KLQotCQkvKioKLQkJICogUGFyc2VzIHRoZSBjb250ZW50IFhNSSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gTWV0aG9kIGVsZW1lbnQuCi0JCSAqIAotCQkgKiBAcGFyYW0gZWxlbWVudAotCQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHBhcnNlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJCVN0cmluZyBlbGVtZW50Q29udGVudFBhdGggPSBnZXRFbGVtZW50UGF0aChlbGVtZW50KTsKLQkJCVN0cmluZyBicmllZkRlc2NyaXB0aW9uID0gZWxlbWVudC5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoc2VhcmNoU3RyaW5nUGF0dGVybi5tYXRjaGVyKGJyaWVmRGVzY3JpcHRpb24pLmZpbmQoKSkgewotCQkJCXJlc3VsdC5hY2NlcHQoZWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAoZWxlbWVudENvbnRlbnRQYXRoICE9IG51bGwKLQkJCQkJJiYgIXBhcnNlZEZpbGVzLmNvbnRhaW5zKGVsZW1lbnRDb250ZW50UGF0aCkpIHsKLQkJCQlzdXBlci5wYXJzZShlbGVtZW50Q29udGVudFBhdGgpOwotCQkJCXBhcnNlZEZpbGVzLmFkZChlbGVtZW50Q29udGVudFBhdGgpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgQWJzdHJhY3RTQVhQYXJzZXIjc3RhcnRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcsCi0JCSAqICAgICAgQXR0cmlidXRlcykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJMLCBTdHJpbmcgbG9jYWxOYW1lLAotCQkJCVN0cmluZyBxbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gYXR0cmlidXRlcy5nZXRRTmFtZShpKTsKLQkJCQlpZiAoIW5hbWUuZXF1YWxzKCJicmllZkRlc2NyaXB0aW9uIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgdmFsdWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOwotCQkJCQlpZiAoc2VhcmNoU3RyaW5nUGF0dGVybi5tYXRjaGVyKHZhbHVlKS5maW5kKCkpIHsKLQkJCQkJCXJlc3VsdC5hY2NlcHQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBBYnN0cmFjdFNBWFBhcnNlciNlbmRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkwsIFN0cmluZyBsb2NhbE5hbWUsCi0JCQkJU3RyaW5nIHFuYW1lKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBzdHJCdWYudG9TdHJpbmcoKTsKLQkJCWlmIChzZWFyY2hTdHJpbmdQYXR0ZXJuLm1hdGNoZXIodmFsdWUpLmZpbmQoKSkgewotCQkJCXJlc3VsdC5hY2NlcHQoZWxlbWVudCk7Ci0JCQl9Ci0JCQlzdHJCdWYuc2V0TGVuZ3RoKDApOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBzZWFyY2hTdHJpbmcKLQkgKiAgICAgICAgICAgIGEgc2VhcmNoIHN0cmluZwotCSAqIEBwYXJhbSBuYW1lUGF0dGVybgotCSAqICAgICAgICAgICAgYSBuYW1lIHBhdHRlcm4KLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICogICAgICAgICAgICBhIHNlYXJjaCByZXN1bHQgY29sbGVjdG9yCi0JICovCi0JcHVibGljIE1ldGhvZFNlYXJjaE9wZXJhdGlvbihNZXRob2RTZWFyY2hJbnB1dCBzZWFyY2hJbnB1dCwKLQkJCUlTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0KSB7Ci0JCXRoaXMuc2VhcmNoSW5wdXQgPSBzZWFyY2hJbnB1dDsKLQkJdGhpcy5yZXN1bHQgPSByZXN1bHQ7Ci0KLQkJY2FzZVNlbnNpdGl2ZSA9IHNlYXJjaElucHV0LmdldENhc2VTZW5zaXRpdmUoKTsKLQkJcmVnRXhwID0gc2VhcmNoSW5wdXQuZ2V0UmVndWxhckV4cHJlc3Npb24oKTsKLQkJZWxlbWVudE5hbWVQYXR0ZXJuID0gTWV0aG9kU2VhcmNoUGF0dGVybi5jcmVhdGVQYXR0ZXJuKHNlYXJjaElucHV0Ci0JCQkJLmdldE5hbWVQYXR0ZXJuKCksIGZhbHNlLCBmYWxzZSk7Ci0KLQkJZGVidWcgPSBTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCQlzZWFyY2hTdHJpbmcgPSBzZWFyY2hJbnB1dC5nZXRTZWFyY2hTdHJpbmcoKTsKLQkJaWYgKHNlYXJjaFN0cmluZyA9PSBudWxsKQotCQkJc2VhcmNoU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNlYXJjaFN0cmluZy5sZW5ndGgoKSA+IDApIHsKLQkJCWVsZW1lbnRTY2FubmVyID0gbmV3IE1ldGhvZEVsZW1lbnRTY2FubmVyKCk7Ci0JCQlzZWFyY2hTdHJpbmdQYXR0ZXJuID0gTWV0aG9kU2VhcmNoUGF0dGVybi5jcmVhdGVQYXR0ZXJuKAotCQkJCQlzZWFyY2hTdHJpbmcsIGNhc2VTZW5zaXRpdmUsIHJlZ0V4cCk7Ci0JCX0KLQotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIk1ldGhvZFNlYXJjaE9wZXJhdGlvbiBjb25zdHJ1Y3Rvcjogc2VhcmNoU3RyaW5nPSIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgc2VhcmNoU3RyaW5nCi0JCQkJCQkJKyAiLCBlbGVtZW50TmFtZVBhdHRlcm49IiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBzZWFyY2hJbnB1dC5nZXROYW1lUGF0dGVybigpCi0JCQkJCQkJKyAiLCBjYXNlU2Vuc2l0aXZlPSIgKyBjYXNlU2Vuc2l0aXZlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIHNlYXJjaCBvcGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQl0aGlzLnByb2dyZXNzTW9uaXRvciA9IHByb2dyZXNzTW9uaXRvcjsKLQkJdGhpcy5wcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrKFNDQU5fTElCUkFSWV9URVhULCA3NTAwKTsKLQotCQkvLyBJdGVyYXRlIHRoZSBNZXRob2QgTGlicmFyeSB0byBsb29rIGZvciBlbGVtZW50cyB0aGF0IG1hdGNoIHRoZSBuYW1lCi0JCS8vIHBhdHRlcm4uCi0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJTGlzdCBtZXRob2RQbHVnaW5zID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2lucyhsaWJyYXJ5KTsKLQkJZm9yIChJdGVyYXRvciBpID0gbWV0aG9kUGx1Z2lucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKQotCQkJCSYmICFwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOykgewotCQkJTWV0aG9kUGx1Z2luIG1ldGhvZFBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGkubmV4dCgpOwotCQkJbWF0Y2hQYXR0ZXJuKG1ldGhvZFBsdWdpbik7Ci0KLQkJCU1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZTsKLQkJCWlmIChzZWFyY2hJbnB1dC5nZXRTZWFyY2hTY29wZSgpLmluY2x1ZGVDb3JlQ29udGVudCgpKSB7Ci0JCQkJbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLAotCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKG1ldGhvZFBhY2thZ2UpOwotCQkJfQotCi0JCQlpZiAoc2VhcmNoSW5wdXQuZ2V0U2VhcmNoU2NvcGUoKS5pbmNsdWRlKAotCQkJCQlNZXRob2RTZWFyY2hTY29wZS5TVEFOREFSRF9DQVRFR09SWSkpIHsKLQkJCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sCi0JCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0JCQkJc2VhcmNoTWV0aG9kUGFja2FnZXMobWV0aG9kUGFja2FnZSk7Ci0JCQkJbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLAotCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kb21haW5QYXRoKTsKLQkJCQlzZWFyY2hNZXRob2RQYWNrYWdlcyhtZXRob2RQYWNrYWdlKTsKLQkJCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sCi0JCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgpOwotCQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKG1ldGhvZFBhY2thZ2UpOwotCQkJCW1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwKLQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKG1ldGhvZFBhY2thZ2UpOwotCQkJCW1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwKLQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGgpOwotCQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKG1ldGhvZFBhY2thZ2UpOwotCQkJfQotCi0JCQlpZiAoc2VhcmNoSW5wdXQuZ2V0U2VhcmNoU2NvcGUoKS5pbmNsdWRlKAotCQkJCQlNZXRob2RTZWFyY2hTY29wZS5DVVNUT01fQ0FURUdPUlkpKSB7Ci0JCQkJbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLAotCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgpOwotCQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKG1ldGhvZFBhY2thZ2UpOwotCQkJfQotCi0JCQlpZiAoc2VhcmNoSW5wdXQuZ2V0U2VhcmNoU2NvcGUoKS5pbmNsdWRlKAotCQkJCQlNZXRob2RTZWFyY2hTY29wZS5DQVBBQklMSVRZX1BBVFRFUk4pKSB7Ci0JCQkJbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLAotCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGgpOwotCQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKG1ldGhvZFBhY2thZ2UpOwotCQkJfQotCi0JCQlpZiAoc2VhcmNoSW5wdXQuZ2V0U2VhcmNoU2NvcGUoKS5pbmNsdWRlKAotCQkJCQlNZXRob2RTZWFyY2hTY29wZS5ERUxJVkVSWV9QUk9DRVNTKSkgewotCQkJCW1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwKLQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aCk7Ci0JCQkJc2VhcmNoTWV0aG9kUGFja2FnZXMobWV0aG9kUGFja2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyBhIE1ldGhvZCBQYWNrYWdlLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RQYWNrYWdlCi0JICogICAgICAgICAgICBhIG1ldGhvZCBwYWNrYWdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2VhcmNoTWV0aG9kUGFja2FnZXMoTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlKSB7Ci0JCWlmIChtZXRob2RQYWNrYWdlID09IG51bGwKLQkJCQl8fCBtZXRob2RQYWNrYWdlLmdldE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlNb2RlbFN0cnVjdHVyZS5ISURERU5fUEFDS0FHRV9OQU1FKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJLy8gQWRkIHRoZSBhc3NvY2lhdGVkIENhcGFiaWxpdHlQYXR0ZXJuIG9yIERlbGl2ZXJ5UHJvY2VzcyB0byB0aGUKLQkJCS8vIHNlYXJjaCByZXN1bHQuCi0JCQlQcm9jZXNzQ29tcG9uZW50IHByb2Nlc3NDb21wb25lbnQgPSAoUHJvY2Vzc0NvbXBvbmVudCkgbWV0aG9kUGFja2FnZTsKLQkJCW1hdGNoUGF0dGVybihwcm9jZXNzQ29tcG9uZW50LmdldFByb2Nlc3MoKSk7Ci0JCX0gZWxzZSBpZiAoIWlzSW50ZXJuYWxQcm9jZXNzUGFja2FnZShtZXRob2RQYWNrYWdlKSkgewotCQkJbWF0Y2hQYXR0ZXJuKG1ldGhvZFBhY2thZ2UpOwotCQl9Ci0KLQkJTGlzdCBjaGlsZFBhY2thZ2VzID0gbWV0aG9kUGFja2FnZS5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGNoaWxkUGFja2FnZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCkKLQkJCQkmJiAhcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTspIHsKLQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKChNZXRob2RQYWNrYWdlKSBpLm5leHQoKSk7Ci0JCX0KLQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJQ29udGVudFBhY2thZ2UgY29udGVudFBhY2thZ2UgPSAoQ29udGVudFBhY2thZ2UpIG1ldGhvZFBhY2thZ2U7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IGNvbnRlbnRQYWNrYWdlLmdldENvbnRlbnRFbGVtZW50cygpOwotCQkJZm9yIChJdGVyYXRvciBqID0gY29udGVudEVsZW1lbnRzLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpCi0JCQkJCSYmICFwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOykgewotCQkJCUNvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBqLm5leHQoKTsKLQkJCQltYXRjaFBhdHRlcm4oY29udGVudEVsZW1lbnQpOwotCQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCXNlYXJjaENvbnRhaW5lZEFydGlmYWN0cygoQXJ0aWZhY3QpIGNvbnRlbnRFbGVtZW50KTsKLQkJCQl9IGVsc2UgaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJCQlzZWFyY2hTdWJEaXNjaXBsaW5lcygoRGlzY2lwbGluZSkgY29udGVudEVsZW1lbnQpOwotCQkJCX0gZWxzZSBpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBQcmFjdGljZSkgewotCQkJCQlzZWFyY2hTdWJQcmFjdGljZXMoKFByYWN0aWNlKSBjb250ZW50RWxlbWVudCk7Ci0JCQkJfSBlbHNlIGlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJCQlzZWFyY2hTdWJEb21haW5zKChEb21haW4pIGNvbnRlbnRFbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBwcm9jZXNzUGFja2FnZSA9IChQcm9jZXNzUGFja2FnZSkgbWV0aG9kUGFja2FnZTsKLQkJCUxpc3QgcHJvY2Vzc0VsZW1lbnRzID0gcHJvY2Vzc1BhY2thZ2UuZ2V0UHJvY2Vzc0VsZW1lbnRzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGogPSBwcm9jZXNzRWxlbWVudHMuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCkKLQkJCQkJJiYgIXByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk7KSB7Ci0JCQkJUHJvY2Vzc0VsZW1lbnQgcHJvY2Vzc0VsZW1lbnQgPSAoUHJvY2Vzc0VsZW1lbnQpIGoubmV4dCgpOwotCQkJCWlmICghKHByb2Nlc3NFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQkJCW1hdGNoUGF0dGVybihwcm9jZXNzRWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcGFja2FnZSBpcyBhbiBpbnRlcm5hbCBQcm9jZXNzCi0JICogUGFja2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kUGFja2FnZQotCSAqICAgICAgICAgICAgYSBtZXRob2Qgb3IgcHJvY2VzcyBwYWNrYWdlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcGFja2FnZSBpcyBhbiBpbnRlcm5hbCBwcm9jZXNzCi0JICogICAgICAgICBwYWNrYWdlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnRlcm5hbFByb2Nlc3NQYWNrYWdlKE1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSkgewotCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlpZiAoVW1hVXRpbC5nZXRQcm9jZXNzQ29tcG9uZW50KG1ldGhvZFBhY2thZ2UpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoZXMgdGhlIGNvbnRhaW5lZCBhcnRpZmFjdHMgb2YgYW4gYXJ0aWZhY3QuCi0JICogCi0JICogQHBhcmFtIGFydGlmYWN0Ci0JICogICAgICAgICAgICBhbiBhcnRpZmFjdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNlYXJjaENvbnRhaW5lZEFydGlmYWN0cyhBcnRpZmFjdCBhcnRpZmFjdCkgewotCQlpZiAoYXJ0aWZhY3QgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gYXJ0aWZhY3QuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkuaXRlcmF0b3IoKTsgaQotCQkJCQkuaGFzTmV4dCgpCi0JCQkJCSYmICFwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOykgewotCQkJCUFydGlmYWN0IGNvbnRhaW5lZEFydGlmYWN0ID0gKEFydGlmYWN0KSBpLm5leHQoKTsKLQkJCQltYXRjaFBhdHRlcm4oY29udGFpbmVkQXJ0aWZhY3QpOwotCQkJCXNlYXJjaENvbnRhaW5lZEFydGlmYWN0cyhjb250YWluZWRBcnRpZmFjdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyB0aGUgc3ViIGRpc2NpcGxpbmVzIG9mIGEgZGlzY2lwbGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzY2lwbGluZQotCSAqICAgICAgICAgICAgYSBkaXNjaXBsaW5lCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2VhcmNoU3ViRGlzY2lwbGluZXMoRGlzY2lwbGluZSBkaXNjaXBsaW5lKSB7Ci0JCWlmIChkaXNjaXBsaW5lICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGRpc2NpcGxpbmUuZ2V0U3ViZGlzY2lwbGluZSgpLml0ZXJhdG9yKCk7IGkKLQkJCQkJLmhhc05leHQoKQotCQkJCQkmJiAhcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTspIHsKLQkJCQlEaXNjaXBsaW5lIHN1YkRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgaS5uZXh0KCk7Ci0JCQkJbWF0Y2hQYXR0ZXJuKHN1YkRpc2NpcGxpbmUpOwotCQkJCXNlYXJjaFN1YkRpc2NpcGxpbmVzKHN1YkRpc2NpcGxpbmUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoZXMgdGhlIHN1YiBwcmFjdGljZXMgb2YgYSBwcmFjdGljZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJhY3RpY2UKLQkgKiAgICAgICAgICAgIGEgcHJhY3RpY2UKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZWFyY2hTdWJQcmFjdGljZXMoUHJhY3RpY2UgcHJhY3RpY2UpIHsKLQkJaWYgKHByYWN0aWNlICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHByYWN0aWNlLmdldFN1YlByYWN0aWNlcygpLml0ZXJhdG9yKCk7IGkKLQkJCQkJLmhhc05leHQoKQotCQkJCQkmJiAhcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTspIHsKLQkJCQlQcmFjdGljZSBzdWJQcmFjdGljZSA9IChQcmFjdGljZSkgaS5uZXh0KCk7Ci0JCQkJbWF0Y2hQYXR0ZXJuKHN1YlByYWN0aWNlKTsKLQkJCQlzZWFyY2hTdWJQcmFjdGljZXMoc3ViUHJhY3RpY2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoZXMgdGhlIHN1YiBkb21haW5zIG9mIGEgZG9tYWluLgotCSAqIAotCSAqIEBwYXJhbSBkb21haW4KLQkgKiAgICAgICAgICAgIGEgZG9tYWluCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2VhcmNoU3ViRG9tYWlucyhEb21haW4gZG9tYWluKSB7Ci0JCWlmIChkb21haW4gIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gZG9tYWluLmdldFN1YmRvbWFpbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKQotCQkJCQkmJiAhcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTspIHsKLQkJCQlEb21haW4gc3ViRG9tYWluID0gKERvbWFpbikgaS5uZXh0KCk7Ci0JCQkJbWF0Y2hQYXR0ZXJuKHN1YkRvbWFpbik7Ci0JCQkJc2VhcmNoU3ViRG9tYWlucyhzdWJEb21haW4pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgdG8gdGhlIHNlYXJjaCByZXN1bHQgY29sbGVjdGlvbiBpZiBpdHMgbmFtZQotCSAqIG9yIHByZXNlbnRhdGlvbiBuYW1lIG1hdGNoZXMgdGhlIG5hbWUgcGF0dGVybi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1hdGNoUGF0dGVybihNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJdHJ5IHsKLQkJCWlmIChzZWFyY2hJbnB1dC5nZXRTZWFyY2hTY29wZSgpLmluY2x1ZGUoZWxlbWVudCkpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyB0YXNrTmFtZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFNDQU5fRUxFTUVOVF9URVhULAotCQkJCQkJbmV3IE9iamVjdFtdIHsgbmFtZSB9KTsKLQkJCQlwcm9ncmVzc01vbml0b3Iuc2V0VGFza05hbWUodGFza05hbWUpOwotCQkJCWJvb2xlYW4gZm91bmRNYXRjaCA9IGZhbHNlOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJCVN0cmluZyBwcmVzZW50YXRpb25OYW1lID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIGVsZW1lbnQpCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQkJZm91bmRNYXRjaCA9IChuYW1lICE9IG51bGwgJiYgZWxlbWVudE5hbWVQYXR0ZXJuLm1hdGNoZXIoCi0JCQkJCQkJbmFtZSkubWF0Y2hlcygpKQotCQkJCQkJCXx8IChwcmVzZW50YXRpb25OYW1lICE9IG51bGwgJiYgZWxlbWVudE5hbWVQYXR0ZXJuCi0JCQkJCQkJCQkubWF0Y2hlcihwcmVzZW50YXRpb25OYW1lKS5tYXRjaGVzKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZvdW5kTWF0Y2ggPSAobmFtZSAhPSBudWxsICYmIGVsZW1lbnROYW1lUGF0dGVybi5tYXRjaGVyKAotCQkJCQkJCW5hbWUpLm1hdGNoZXMoKSk7Ci0JCQkJfQotCQkJCWlmIChmb3VuZE1hdGNoKSB7Ci0JCQkJCWlmIChzZWFyY2hTdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJcmVzdWx0LmFjY2VwdChlbGVtZW50KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZWxlbWVudFNjYW5uZXIucGFyc2UoZWxlbWVudCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGggb2YgdGhlIGNvbnRlbnQgWE1MIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGEgbWV0aG9kCi0JICogZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVsZW1lbnRQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZGVzY3JpYmFibGVFbGVtZW50ID0gKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudDsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBkZXNjcmliYWJsZUVsZW1lbnQKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXNvdXJjZSA9IGNvbnRlbnREZXNjcmlwdGlvbi5lUmVzb3VyY2UoKTsKLQkJfSBlbHNlIHsKLQkJCXJlc291cmNlID0gZWxlbWVudC5lUmVzb3VyY2UoKTsKLQkJfQotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJVVJJIHJlc291cmNlVVJJID0gcmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCQlpZiAocmVzb3VyY2VVUkkgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXNvdXJjZVVSSS50b0ZpbGVTdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFBhdHRlcm4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTc2MTExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVyblN5bnRheEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBQYXR0ZXJuIGNvbnRydWN0b3IgZm9yIGEgbWV0aG9kIHNlYXJjaC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RTZWFyY2hQYXR0ZXJuIHsKLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLiBBbGwKLQkgKiBtZXRob2RzIGluIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHN0YXRpYy4KLQkgKi8KLQlwcml2YXRlIE1ldGhvZFNlYXJjaFBhdHRlcm4oKSB7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhCi0JICogPGNvZGU+UGF0dGVybjxjb2RlPiBvYmplY3QgZnJvbSB0aGUgcGF0dGVybiBzdHJpbmcgdXNlZCBpbiBNZXRob2QgU2VhcmNoLgotCSAqIAotCSAqIEBwYXJhbSBwYXR0ZXJuCi0JICogICAgICAgICAgICBhIHNlYXJjaCBwYXR0ZXJuIHN0cmluZwotCSAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBjcmVhdGUgYSBjYXNlIGluc2Vuc2l0dmUgcGF0dGVybgotCSAqIEBwYXJhbSBpc1JlZ2V4U2VhcmNoCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgdHJlYXQgdGhlIHBhdHRlcm4gYXMgYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybgotCSAqIEByZXR1cm4gYSBuZXcgPGNvZGU+UGF0dGVybjxjb2RlPiBvYmplY3QKLQkgKiBAdGhyb3dzIDxjb2RlPlBhdHRlcm5TeW50YXhFeGNlcHRpb248L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgcGF0dGVybiBoYXMgYSBzeW50YXggZXJyb3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBhdHRlcm4gY3JlYXRlUGF0dGVybihTdHJpbmcgcGF0dGVybiwKLQkJCWJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlLCBib29sZWFuIGlzUmVnZXhTZWFyY2gpCi0JCQl0aHJvd3MgUGF0dGVyblN5bnRheEV4Y2VwdGlvbiB7Ci0JCWlmICghaXNSZWdleFNlYXJjaCkgewotCQkJcGF0dGVybiA9IHRvUmVnZXhQYXR0ZXJuKHBhdHRlcm4pOwotCQl9Ci0KLQkJaWYgKCFpc0Nhc2VTZW5zaXRpdmUpIHsKLQkJCXJldHVybiBQYXR0ZXJuLmNvbXBpbGUocGF0dGVybiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFCi0JCQkJCXwgUGF0dGVybi5VTklDT0RFX0NBU0UgfCBQYXR0ZXJuLk1VTFRJTElORSk7Ci0JCX0KLQotCQlyZXR1cm4gUGF0dGVybi5jb21waWxlKHBhdHRlcm4sIFBhdHRlcm4uTVVMVElMSU5FKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIHBhdHRlcm4gc3RyaW5nIHdpdGggJyonIGFuZCAnPycgaW50byBhIHJlZ3VsYXIgZXhwcmVzc2lvbgotCSAqIHBhdHRlcm4gc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBwYXR0ZXJuCi0JICogICAgICAgICAgICBhIHBhdHRlcm4gc3RyaW5nCi0JICogQHJldHVybiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHN0cmluZwotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0b1JlZ2V4UGF0dGVybihTdHJpbmcgcGF0dGVybikgewotCQlpbnQgcGF0dGVybkxlbmd0aCA9IHBhdHRlcm4ubGVuZ3RoKCk7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHBhdHRlcm5MZW5ndGgpOwotCi0JCWJvb2xlYW4gZXNjYXBlZCA9IGZhbHNlOwotCQlib29sZWFuIHF1b3RpbmcgPSBmYWxzZTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdHRlcm5MZW5ndGg7IGkrKykgewotCQkJY2hhciBjaCA9IHBhdHRlcm4uY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnKic6Ci0JCQkJaWYgKCFlc2NhcGVkKSB7Ci0JCQkJCWlmIChxdW90aW5nKSB7Ci0JCQkJCQlyZXN1bHQuYXBwZW5kKCJcXEUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcXVvdGluZyA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJlc3VsdC5hcHBlbmQoIi4qIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllc2NhcGVkID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICc/JzoKLQkJCQlpZiAoIWVzY2FwZWQpIHsKLQkJCQkJaWYgKHF1b3RpbmcpIHsKLQkJCQkJCXJlc3VsdC5hcHBlbmQoIlxcRSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlxdW90aW5nID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmVzdWx0LmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJZXNjYXBlZCA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXFwnOgotCQkJCWlmICghZXNjYXBlZCkgewotCQkJCQllc2NhcGVkID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQllc2NhcGVkID0gZmFsc2U7Ci0JCQkJCWlmIChxdW90aW5nKSB7Ci0JCQkJCQlyZXN1bHQuYXBwZW5kKCJcXEUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcXVvdGluZyA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCXJlc3VsdC5hcHBlbmQoIlxcXFwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKCFxdW90aW5nKSB7Ci0JCQkJCXJlc3VsdC5hcHBlbmQoIlxcUSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXF1b3RpbmcgPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAoZXNjYXBlZCAmJiBjaCAhPSAnKicgJiYgY2ggIT0gJz8nICYmIGNoICE9ICdcXCcpIHsKLQkJCQkJcmVzdWx0LmFwcGVuZCgnXFwnKTsKLQkJCQl9Ci0JCQkJcmVzdWx0LmFwcGVuZChjaCk7Ci0JCQkJZXNjYXBlZCA9IChjaCA9PSAnXFwnKTsKLQkJCX0KLQkJfQotCi0JCWlmIChxdW90aW5nKSB7Ci0JCQlyZXN1bHQuYXBwZW5kKCJcXEUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hRdWVyeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDEwMDQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLlNlYXJjaFVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoOwotCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyB0aGUgc2VhcmNoIHN0cmluZ3MgYW5kIG9wdGlvbnMgZm9yIGEgbWV0aG9kIHNlYXJjaC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RTZWFyY2hRdWVyeSBpbXBsZW1lbnRzIElTZWFyY2hRdWVyeSB7Ci0KLQlwcml2YXRlIE1ldGhvZFNlYXJjaElucHV0IHNlYXJjaElucHV0OwotCi0JcHJpdmF0ZSBNZXRob2RTZWFyY2hSZXN1bHQgc2VhcmNoUmVzdWx0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VhcmNoU3RyaW5nCi0JICogICAgICAgICAgICBhIHNlYXJjaCBzdHJpbmcKLQkgKiBAcGFyYW0gbmFtZVBhdHRlcm4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQgbmFtZSBwYXR0ZXJuCi0JICovCi0JcHVibGljIE1ldGhvZFNlYXJjaFF1ZXJ5KE1ldGhvZFNlYXJjaElucHV0IHNlYXJjaElucHV0KSB7Ci0JCXRoaXMuc2VhcmNoSW5wdXQgPSBzZWFyY2hJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjcnVuKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgcHJvY2Vzc01vbml0b3IpIHsKLQkJZmluYWwgTWV0aG9kU2VhcmNoUmVzdWx0IHNlYXJjaFJlc3VsdCA9IChNZXRob2RTZWFyY2hSZXN1bHQpIGdldFNlYXJjaFJlc3VsdCgpOwotCQlzZWFyY2hSZXN1bHQucmVtb3ZlQWxsKCk7Ci0JCUlTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0ID0gbmV3IElTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY2NlcHQoT2JqZWN0IG1hdGNoKSB7Ci0JCQkJaWYgKG1hdGNoIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJJiYgIVRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBtYXRjaCkpIHsKLQkJCQkJc2VhcmNoUmVzdWx0LmFkZE1hdGNoKG5ldyBNYXRjaChtYXRjaCwgTWF0Y2guVU5JVF9MSU5FLCAxLAotCQkJCQkJCTEpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCU1ldGhvZFNlYXJjaE9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgTWV0aG9kU2VhcmNoT3BlcmF0aW9uKAotCQkJCXNlYXJjaElucHV0LCByZXN1bHQpOwotCQlvcGVyYXRpb24uZXhlY3V0ZShwcm9jZXNzTW9uaXRvcik7Ci0JCXByb2Nlc3NNb25pdG9yLmRvbmUoKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2dldExhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUXVlcnlfdGV4dDsgCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2NhblJlcnVuKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXJ1bigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2NhblJ1bkluQmFja2dyb3VuZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUnVuSW5CYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjZ2V0U2VhcmNoUmVzdWx0KCkKLQkgKi8KLQlwdWJsaWMgSVNlYXJjaFJlc3VsdCBnZXRTZWFyY2hSZXN1bHQoKSB7Ci0JCWlmIChzZWFyY2hSZXN1bHQgPT0gbnVsbCkgewotCQkJc2VhcmNoUmVzdWx0ID0gbmV3IE1ldGhvZFNlYXJjaFJlc3VsdCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gc2VhcmNoUmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeSNnZXRTZWFyY2hSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBNZXRob2RTZWFyY2hJbnB1dCBnZXRTZWFyY2hJbnB1dCgpIHsKLQkJcmV0dXJuIHNlYXJjaElucHV0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hSZXN1bHQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMTYzMTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLlNlYXJjaFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuU2VhcmNoVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LklFZGl0b3JNYXRjaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUZpbGVNYXRjaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLS8qKgotICogVGhlIG1ldGhvZCBzZWFyY2ggcmVzdWx0LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFNlYXJjaFJlc3VsdCBleHRlbmRzIEFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCBpbXBsZW1lbnRzCi0JCUlFZGl0b3JNYXRjaEFkYXB0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BVENIX0xBQkVMID0gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUmVzdWx0X21hdGNoOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVRDSEVTX0xBQkVMID0gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUmVzdWx0X21hdGNoZXM7IAotCi0JLy8gVGhlIHNlYXJjaCBxdWVyeS4KLQlwcml2YXRlIE1ldGhvZFNlYXJjaFF1ZXJ5IHNlYXJjaFF1ZXJ5OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VhcmNoUXVlcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHNlYXJjaCBxdWVyeQotCSAqLwotCXB1YmxpYyBNZXRob2RTZWFyY2hSZXN1bHQoTWV0aG9kU2VhcmNoUXVlcnkgc2VhcmNoUXVlcnkpIHsKLQkJdGhpcy5zZWFyY2hRdWVyeSA9IHNlYXJjaFF1ZXJ5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hSZXN1bHQjZ2V0UXVlcnkoKQotCSAqLwotCXB1YmxpYyBJU2VhcmNoUXVlcnkgZ2V0UXVlcnkoKSB7Ci0JCXJldHVybiBzZWFyY2hRdWVyeTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUmVzdWx0I2dldEltYWdlRGVzY3JpcHRvcigpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL29iajE2L01ldGhvZFNlYXJjaC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hSZXN1bHQjZ2V0TGFiZWwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCS8vIFRPRE86IERpc3BsYXkgc2VhcmNoIHJlc3VsdCBpbiB0aGUgZm9ybToKLQkJLy8gICAgJ2NhbmRpZGF0ZScgLSA2IG1hdGNoZXMgaW4gNCBlbGVtZW50cy4KLQkJU3RyaW5nIHNlYXJjaFN0cmluZyA9IHNlYXJjaFF1ZXJ5LmdldFNlYXJjaElucHV0KCkuZ2V0U2VhcmNoU3RyaW5nKCk7Ci0JCWludCBtYXRjaENvdW50ID0gZ2V0TWF0Y2hDb3VudCgpOwotCQlpZiAobWF0Y2hDb3VudCA9PSAxKSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoTUFUQ0hfTEFCRUwsCi0JCQkJCW5ldyBPYmplY3RbXSB7IHNlYXJjaFN0cmluZyB9KTsJCQotCQl9IGVsc2UgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KE1BVENIRVNfTEFCRUwsIG5ldyBPYmplY3RbXSB7Ci0JCQkJCXNlYXJjaFN0cmluZywgIiIgKyBtYXRjaENvdW50IH0pOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUmVzdWx0I2dldFRvb2x0aXAoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbHRpcCgpIHsKLQkJcmV0dXJuIGdldExhYmVsKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQjZ2V0RWRpdG9yTWF0Y2hBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgSUVkaXRvck1hdGNoQWRhcHRlciBnZXRFZGl0b3JNYXRjaEFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0I2dldEZpbGVNYXRjaEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBJRmlsZU1hdGNoQWRhcHRlciBnZXRGaWxlTWF0Y2hBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LklFZGl0b3JNYXRjaEFkYXB0ZXIjaXNTaG93bkluRWRpdG9yKE1hdGNoLAotCSAqICAgICAgSUVkaXRvclBhcnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaG93bkluRWRpdG9yKE1hdGNoIG1hdGNoLCBJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUVkaXRvck1hdGNoQWRhcHRlciNjb21wdXRlQ29udGFpbmVkTWF0Y2hlcyhBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQsCi0JICogICAgICBJRWRpdG9yUGFydCkKLQkgKi8KLQlwdWJsaWMgTWF0Y2hbXSBjb21wdXRlQ29udGFpbmVkTWF0Y2hlcyhBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgcmVzdWx0LAotCQkJSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hTY29wZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hTY29wZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmVhZGNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoU2NvcGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXJ0aWZhY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNoZWNrbGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbmNlcHRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkN1c3RvbUNhdGVnb3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcmFibGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRG9tYWluSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRXhhbXBsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRhbmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGVsaW5lSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuSXRlcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWlsZXN0b25lSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuT3V0Y29tZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBoYXNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZXBvcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZXVzYWJsZUFzc2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9hZG1hcEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVTZXRHcm91cGluZ0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZW1wbGF0ZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlcm1EZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRvb2xNZW50b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5XaGl0ZXBhcGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RUeXBlSW1wbDsKLQotLyoqCi0gKiBUaGUgbWV0aG9kIHNlYXJjaCBzY29wZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RTZWFyY2hTY29wZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UID0gIlJvb3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfQ09OVEVOVCA9IExpYnJhcnlVSVRleHQuVEVYVF9NRVRIT0RfQ09OVEVOVDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEUgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfUk9MRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0sgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfVEFTSzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfUFJPRFVDVCA9IExpYnJhcnlVSVRleHQuVEVYVF9XT1JLX1BST0RVQ1Q7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlEQU5DRSA9IExpYnJhcnlVSVRleHQuVEVYVF9HVUlEQU5DRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLTElTVCA9IExpYnJhcnlVSVRleHQuVEVYVF9DSEVDS0xJU1Q7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05DRVBUID0gTGlicmFyeVVJVGV4dC5URVhUX0NPTkNFUFQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gTGlicmFyeVVJVGV4dC5URVhUX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWEFNUExFID0gTGlicmFyeVVJVGV4dC5URVhUX0VYQU1QTEU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlERUxJTkUgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfR1VJREVMSU5FOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJBQ1RJQ0UgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfUFJBQ1RJQ0U7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPUlQgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfUkVQT1JUOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVVU0FCTEVfQVNTRVQgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfUkVVU0FCTEVfQVNTRVQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0FETUFQID0gTGlicmFyeVVJVGV4dC5URVhUX1JPQURNQVA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBQT1JUSU5HX01BVEVSSUFMID0gTGlicmFyeVVJVGV4dC5URVhUX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURSA9IExpYnJhcnlVSVRleHQuVEVYVF9URU1QTEFURTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1fREVGSU5JVElPTiA9IExpYnJhcnlVSVRleHQuVEVYVF9URVJNX0RFRklOSVRJT047Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX01FTlRPUiA9IExpYnJhcnlVSVRleHQuVEVYVF9UT09MX01FTlRPUjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdISVRFUEFQRVIgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfV0hJVEVQQVBFUjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQU5EQVJEX0NBVEVHT1JZID0gTGlicmFyeVVJVGV4dC5URVhUX1NUQU5EQVJEX0NBVEVHT1JZOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NBVEVHT1JZID0gTGlicmFyeVVJVGV4dC5URVhUX0NVU1RPTV9DQVRFR09SWTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1MgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfUFJPQ0VTUzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfUEFUVEVSTiA9IExpYnJhcnlVSVRleHQuVEVYVF9DQVBBQklMSVRZX1BBVFRFUk47Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxJVkVSWV9QUk9DRVNTID0gTGlicmFyeVVJVGV4dC5URVhUX0RFTElWRVJZX1BST0NFU1M7Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXA8Q2xhc3MsIFN0cmluZz4gZWxlbWVudFNlYXJjaFNjb3BlID0gbmV3IEhhc2hNYXA8Q2xhc3MsIFN0cmluZz4oKTsKLQotCXN0YXRpYyB7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoTWV0aG9kUGx1Z2luSW1wbC5jbGFzcywgUk9PVCk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoQ29udGVudFBhY2thZ2VJbXBsLmNsYXNzLCBNRVRIT0RfQ09OVEVOVCk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoUm9sZUltcGwuY2xhc3MsIFJPTEUpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFRhc2tJbXBsLmNsYXNzLCBUQVNLKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChBcnRpZmFjdEltcGwuY2xhc3MsIFdPUktfUFJPRFVDVCk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoRGVsaXZlcmFibGVJbXBsLmNsYXNzLCBXT1JLX1BST0RVQ1QpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KE91dGNvbWVJbXBsLmNsYXNzLCBXT1JLX1BST0RVQ1QpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KEd1aWRhbmNlSW1wbC5jbGFzcywgR1VJREFOQ0UpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KENoZWNrbGlzdEltcGwuY2xhc3MsIENIRUNLTElTVCk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoQ29uY2VwdEltcGwuY2xhc3MsIENPTkNFUFQpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwuY2xhc3MsCi0JCQkJRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoRXhhbXBsZUltcGwuY2xhc3MsIEVYQU1QTEUpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KEd1aWRlbGluZUltcGwuY2xhc3MsIEdVSURFTElORSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoUHJhY3RpY2VJbXBsLmNsYXNzLCBQUkFDVElDRSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoUmVwb3J0SW1wbC5jbGFzcywgUkVQT1JUKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChSZXVzYWJsZUFzc2V0SW1wbC5jbGFzcywgUkVVU0FCTEVfQVNTRVQpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFJvYWRtYXBJbXBsLmNsYXNzLCBST0FETUFQKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChTdXBwb3J0aW5nTWF0ZXJpYWxJbXBsLmNsYXNzLAotCQkJCVNVUFBPUlRJTkdfTUFURVJJQUwpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFRlbXBsYXRlSW1wbC5jbGFzcywgVEVNUExBVEUpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFRlcm1EZWZpbml0aW9uSW1wbC5jbGFzcywgVEVSTV9ERUZJTklUSU9OKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChUb29sTWVudG9ySW1wbC5jbGFzcywgVE9PTF9NRU5UT1IpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFdoaXRlcGFwZXJJbXBsLmNsYXNzLCBXSElURVBBUEVSKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChDb250ZW50Q2F0ZWdvcnlJbXBsLmNsYXNzLCBTVEFOREFSRF9DQVRFR09SWSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoRGlzY2lwbGluZUltcGwuY2xhc3MsIFNUQU5EQVJEX0NBVEVHT1JZKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChEaXNjaXBsaW5lR3JvdXBpbmdJbXBsLmNsYXNzLCBTVEFOREFSRF9DQVRFR09SWSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoRG9tYWluSW1wbC5jbGFzcywgU1RBTkRBUkRfQ0FURUdPUlkpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFdvcmtQcm9kdWN0VHlwZUltcGwuY2xhc3MsIFNUQU5EQVJEX0NBVEVHT1JZKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChSb2xlU2V0SW1wbC5jbGFzcywgU1RBTkRBUkRfQ0FURUdPUlkpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFJvbGVTZXRHcm91cGluZ0ltcGwuY2xhc3MsIFNUQU5EQVJEX0NBVEVHT1JZKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChUb29sSW1wbC5jbGFzcywgU1RBTkRBUkRfQ0FURUdPUlkpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KEN1c3RvbUNhdGVnb3J5SW1wbC5jbGFzcywgQ1VTVE9NX0NBVEVHT1JZKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChQcm9jZXNzUGFja2FnZUltcGwuY2xhc3MsIFBST0NFU1MpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFByb2Nlc3NDb21wb25lbnRJbXBsLmNsYXNzLCBQUk9DRVNTKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChQaGFzZUltcGwuY2xhc3MsIFBST0NFU1MpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KEl0ZXJhdGlvbkltcGwuY2xhc3MsIFBST0NFU1MpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KE1pbGVzdG9uZUltcGwuY2xhc3MsIFBST0NFU1MpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KEFjdGl2aXR5SW1wbC5jbGFzcywgUFJPQ0VTUyk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoUm9sZURlc2NyaXB0b3JJbXBsLmNsYXNzLCBQUk9DRVNTKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChUYXNrRGVzY3JpcHRvckltcGwuY2xhc3MsIFBST0NFU1MpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFdvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwuY2xhc3MsIFBST0NFU1MpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KENhcGFiaWxpdHlQYXR0ZXJuSW1wbC5jbGFzcywgQ0FQQUJJTElUWV9QQVRURVJOKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChEZWxpdmVyeVByb2Nlc3NJbXBsLmNsYXNzLCBERUxJVkVSWV9QUk9DRVNTKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8T2JqZWN0PiBzZWFyY2hTY29wZSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kU2VhcmNoU2NvcGUoT2JqZWN0W10gZWxlbWVudFR5cGVzKSB7Ci0JCXNlYXJjaFNjb3BlLmFkZChST09UKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCBlbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlc1tpXTsKLQkJCXNlYXJjaFNjb3BlLmFkZChlbGVtZW50VHlwZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIGNvcmUgbWV0aG9kIGVsZW1lbnQgaXMgaW5jbHVkZWQgaW4gdGhlIHNlYXJjaCBzY29wZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgY29yZSBtZXRob2QgZWxlbWVudCBpcyBpbmNsdWRlZCBpbiB0aGUKLQkgKiAgICAgICAgIHNlYXJjaCBzY29wZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGluY2x1ZGVDb3JlQ29udGVudCgpIHsKLQkJcmV0dXJuIHNlYXJjaFNjb3BlLmNvbnRhaW5zKFJPTEUpIHx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKFRBU0spCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoV09SS19QUk9EVUNUKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKEdVSURBTkNFKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKENIRUNLTElTVCkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhDT05DRVBUKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKEVTVElNQVRJT05fQ09OU0lERVJBVElPTlMpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoRVhBTVBMRSkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhHVUlERUxJTkUpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoUFJBQ1RJQ0UpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoUkVQT1JUKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKFJFVVNBQkxFX0FTU0VUKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKFJPQURNQVApCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoU1VQUE9SVElOR19NQVRFUklBTCkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhURU1QTEFURSkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhURVJNX0RFRklOSVRJT04pCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoVE9PTF9NRU5UT1IpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoV0hJVEVQQVBFUik7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIE1ldGhvZCBlbGVtZW50IGlzIGluY2x1ZGVkIGluIHRoZSBzZWFyY2ggc2NvcGUuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgZWxlbWVudCBpcyBpbmNsdWRlZCBpbiB0aGUKLQkgKiAgICAgICAgIHNlYXJjaCBzY29wZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBzZWFyY2hTY29wZU5hbWUgPSAoU3RyaW5nKSBlbGVtZW50U2VhcmNoU2NvcGUuZ2V0KGVsZW1lbnQKLQkJCQkuZ2V0Q2xhc3MoKSk7Ci0JCXJldHVybiBzZWFyY2hTY29wZS5jb250YWlucyhzZWFyY2hTY29wZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCB0eXBlIGlzIGluY2x1ZGVkIGluIHRoZSBzZWFyY2gKLQkgKiBzY29wZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCB0eXBlIGlzIGluY2x1ZGVkCi0JICogICAgICAgICBpbiB0aGUgc2VhcmNoIHNjb3BlLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZShTdHJpbmcgc2VhcmNoU2NvcGVOYW1lKSB7Ci0JCXJldHVybiBzZWFyY2hTY29wZS5jb250YWlucyhzZWFyY2hTY29wZU5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hTY29wZVZpZXdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hTY29wZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTc4NjU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoU2NvcGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgc2VhcmNoYWJsZSBtZXRob2QgZWxlbWVudHMsIG9yZ2FuaXplZCBieSB0eXBlcywgaW4gYSB0cmVlIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2VhcmNoU2NvcGVWaWV3ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1QgPSBNZXRob2RTZWFyY2hTY29wZS5ST09UOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9DT05URU5UID0gTWV0aG9kU2VhcmNoU2NvcGUuTUVUSE9EX0NPTlRFTlQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRSA9IE1ldGhvZFNlYXJjaFNjb3BlLlJPTEU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTSyA9IE1ldGhvZFNlYXJjaFNjb3BlLlRBU0s7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19QUk9EVUNUID0gTWV0aG9kU2VhcmNoU2NvcGUuV09SS19QUk9EVUNUOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURBTkNFID0gTWV0aG9kU2VhcmNoU2NvcGUuR1VJREFOQ0U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tMSVNUID0gTWV0aG9kU2VhcmNoU2NvcGUuQ0hFQ0tMSVNUOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkNFUFQgPSBNZXRob2RTZWFyY2hTY29wZS5DT05DRVBUOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBNZXRob2RTZWFyY2hTY29wZS5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQU1QTEUgPSBNZXRob2RTZWFyY2hTY29wZS5FWEFNUExFOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURFTElORSA9IE1ldGhvZFNlYXJjaFNjb3BlLkdVSURFTElORTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkFDVElDRSA9IE1ldGhvZFNlYXJjaFNjb3BlLlBSQUNUSUNFOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9SVCA9IE1ldGhvZFNlYXJjaFNjb3BlLlJFUE9SVDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVVTQUJMRV9BU1NFVCA9IE1ldGhvZFNlYXJjaFNjb3BlLlJFVVNBQkxFX0FTU0VUOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPQURNQVAgPSBNZXRob2RTZWFyY2hTY29wZS5ST0FETUFQOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUFBPUlRJTkdfTUFURVJJQUwgPSBNZXRob2RTZWFyY2hTY29wZS5TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFID0gTWV0aG9kU2VhcmNoU2NvcGUuVEVNUExBVEU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVSTV9ERUZJTklUSU9OID0gTWV0aG9kU2VhcmNoU2NvcGUuVEVSTV9ERUZJTklUSU9OOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xfTUVOVE9SID0gTWV0aG9kU2VhcmNoU2NvcGUuVE9PTF9NRU5UT1I7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0hJVEVQQVBFUiA9IE1ldGhvZFNlYXJjaFNjb3BlLldISVRFUEFQRVI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBTkRBUkRfQ0FURUdPUlkgPSBNZXRob2RTZWFyY2hTY29wZS5TVEFOREFSRF9DQVRFR09SWTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ0FURUdPUlkgPSBNZXRob2RTZWFyY2hTY29wZS5DVVNUT01fQ0FURUdPUlk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTUyA9IE1ldGhvZFNlYXJjaFNjb3BlLlBST0NFU1M7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FQQUJJTElUWV9QQVRURVJOID0gTWV0aG9kU2VhcmNoU2NvcGUuQ0FQQUJJTElUWV9QQVRURVJOOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElWRVJZX1BST0NFU1MgPSBNZXRob2RTZWFyY2hTY29wZS5ERUxJVkVSWV9QUk9DRVNTOwotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IHJvb3RMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0Jc3RhdGljIHsKLQkJcm9vdExpc3QuYWRkKE1FVEhPRF9DT05URU5UKTsKLQkJcm9vdExpc3QuYWRkKFBST0NFU1MpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBtZXRob2RDb250ZW50TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCXN0YXRpYyB7Ci0JCW1ldGhvZENvbnRlbnRMaXN0LmFkZChST0xFKTsKLQkJbWV0aG9kQ29udGVudExpc3QuYWRkKFRBU0spOwotCQltZXRob2RDb250ZW50TGlzdC5hZGQoV09SS19QUk9EVUNUKTsKLQkJbWV0aG9kQ29udGVudExpc3QuYWRkKEdVSURBTkNFKTsKLQkJbWV0aG9kQ29udGVudExpc3QuYWRkKFNUQU5EQVJEX0NBVEVHT1JZKTsKLQkJbWV0aG9kQ29udGVudExpc3QuYWRkKENVU1RPTV9DQVRFR09SWSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGd1aWRhbmNlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCXN0YXRpYyB7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoQ0hFQ0tMSVNUKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChDT05DRVBUKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChFWEFNUExFKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChHVUlERUxJTkUpOwotCQlndWlkYW5jZUxpc3QuYWRkKFBSQUNUSUNFKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChSRVBPUlQpOwotCQlndWlkYW5jZUxpc3QuYWRkKFJFVVNBQkxFX0FTU0VUKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChST0FETUFQKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChTVVBQT1JUSU5HX01BVEVSSUFMKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChURU1QTEFURSk7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoVEVSTV9ERUZJTklUSU9OKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChUT09MX01FTlRPUik7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoV0hJVEVQQVBFUik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IHByb2Nlc3NMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0Jc3RhdGljIHsKLQkJcHJvY2Vzc0xpc3QuYWRkKENBUEFCSUxJVFlfUEFUVEVSTik7Ci0JCXByb2Nlc3NMaXN0LmFkZChERUxJVkVSWV9QUk9DRVNTKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gaGFzQ2hpbGRyZW5MaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0Jc3RhdGljIHsKLQkJaGFzQ2hpbGRyZW5MaXN0LmFkZChST09UKTsKLQkJaGFzQ2hpbGRyZW5MaXN0LmFkZChNRVRIT0RfQ09OVEVOVCk7Ci0JCWhhc0NoaWxkcmVuTGlzdC5hZGQoR1VJREFOQ0UpOwotCQloYXNDaGlsZHJlbkxpc3QuYWRkKFBST0NFU1MpOwotCX0KLQotCXByaXZhdGUgQ2hlY2tib3hUcmVlVmlld2VyIHZpZXdlcjsKLQotCS8qKgotCSAqIFRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgdmlld2VyLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZpZXdlckNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotCQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIEVNUFRZX0xJU1QgPSBuZXcgT2JqZWN0WzBdOwotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50KSB7Ci0JCQlpZiAocGFyZW50ID09IFJPT1QpIHsKLQkJCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oUk9PVCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCQlpZiAocGFyZW50ID09IFJPT1QpIHsKLQkJCQlyZXR1cm4gcm9vdExpc3QudG9BcnJheSgpOwotCQkJfSBlbHNlIGlmIChwYXJlbnQgPT0gTUVUSE9EX0NPTlRFTlQpIHsKLQkJCQlyZXR1cm4gbWV0aG9kQ29udGVudExpc3QudG9BcnJheSgpOwotCQkJfSBlbHNlIGlmIChwYXJlbnQgPT0gR1VJREFOQ0UpIHsKLQkJCQlyZXR1cm4gZ3VpZGFuY2VMaXN0LnRvQXJyYXkoKTsKLQkJCX0gZWxzZSBpZiAocGFyZW50ID09IFBST0NFU1MpIHsKLQkJCQlyZXR1cm4gcHJvY2Vzc0xpc3QudG9BcnJheSgpOwotCQkJfQotCQkJcmV0dXJuIEVNUFRZX0xJU1Q7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgY2hpbGQpIHsKLQkJCWlmIChyb290TGlzdC5jb250YWlucyhjaGlsZCkpIHsKLQkJCQlyZXR1cm4gUk9PVDsKLQkJCX0KLQkJCWlmIChtZXRob2RDb250ZW50TGlzdC5jb250YWlucyhjaGlsZCkpIHsKLQkJCQlyZXR1cm4gTUVUSE9EX0NPTlRFTlQ7Ci0JCQl9IGVsc2UgaWYgKGd1aWRhbmNlTGlzdC5jb250YWlucyhjaGlsZCkpIHsKLQkJCQlyZXR1cm4gR1VJREFOQ0U7Ci0JCQl9IGVsc2UgaWYgKHByb2Nlc3NMaXN0LmNvbnRhaW5zKGNoaWxkKSkgewotCQkJCXJldHVybiBQUk9DRVNTOwotCQkJfQotCQkJcmV0dXJuIEVNUFRZX0xJU1Q7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCQlyZXR1cm4gaGFzQ2hpbGRyZW5MaXN0LmNvbnRhaW5zKHBhcmVudCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGhlIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgdmlld2VyLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZpZXdlckxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iai50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kU2VhcmNoU2NvcGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXZpZXdlciA9IG5ldyBDaGVja2JveFRyZWVWaWV3ZXIocGFyZW50LCBzdHlsZSk7Ci0JCXZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCXZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFZpZXdlckNvbnRlbnRQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFZpZXdlckxhYmVsUHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5zZXRJbnB1dChST09UKTsKLQkJdmlld2VyLmV4cGFuZFRvTGV2ZWwoMik7Ci0JCXZpZXdlci5zZXRTdWJ0cmVlQ2hlY2tlZChNRVRIT0RfQ09OVEVOVCwgdHJ1ZSk7Ci0JCXZpZXdlci5zZXRTdWJ0cmVlQ2hlY2tlZChQUk9DRVNTLCB0cnVlKTsKLQkJdmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gZXZlbnQuZ2V0RWxlbWVudCgpOwotCQkJCXZpZXdlci5zZXRTdWJ0cmVlQ2hlY2tlZChzZWxlY3RlZEVsZW1lbnQsIGV2ZW50LmdldENoZWNrZWQoKSk7Ci0JCQkJaWYgKCFldmVudC5nZXRDaGVja2VkKCkpIHsKLQkJCQkJdmlld2VyLnNldFBhcmVudHNHcmF5ZWQoc2VsZWN0ZWRFbGVtZW50LCB0cnVlKTsKLQkJCQkJdmlld2VyLnNldEdyYXlDaGVja2VkKHNlbGVjdGVkRWxlbWVudCwgZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXZpZXdlci5zZXRQYXJlbnRzR3JheWVkKHNlbGVjdGVkRWxlbWVudCwgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgbWV0aG9kIGVsZW1lbnQgdHlwZXMuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBzZWxlY3RlZCBtZXRob2QgZWxlbWVudCB0eXBlcwotCSAqLwotCXB1YmxpYyBNZXRob2RTZWFyY2hTY29wZSBnZXRTZWFyY2hTY29wZSgpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RTZWFyY2hTY29wZSh2aWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9TZWFyY2hSZXN1bHRMYWJlbFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL1NlYXJjaFJlc3VsdExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRmYjJjZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL1NlYXJjaFJlc3VsdExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIFRoZSBsYWJlbCBwcm92aWRlciBmb3IgdGhlIG1ldGhvZCBzZWFyY2ggcmVzdWx0IHRyZWUgYW5kIHRhYmxlIHZpZXdlcnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VhcmNoUmVzdWx0TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQluZXcgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWFyY2hSZXN1bHRMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTGFiZWxQcm92aWRlciNnZXRUZXh0KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0VUlGb2xkZXIpIHsKLQkJCXJldHVybiAoKFNlYXJjaFJlc3VsdFVJRm9sZGVyKSBvYmopLmdldE5hbWUoKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbGFiZWxQcm92aWRlci5nZXRUZXh0KG9iaik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBMYWJlbFByb3ZpZGVyI2dldEltYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0VUlGb2xkZXIpIHsKLQkJCXJldHVybiAoKFNlYXJjaFJlc3VsdFVJRm9sZGVyKSBvYmopLmdldEltYWdlKCk7Ci0JCX0KLQkJcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uob2JqKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMxMDM0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL1NlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIFRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgbWV0aG9kIHNlYXJjaCByZXN1bHQgdGFibGUgdmlld2VyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMKLQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfTElTVCA9IG5ldyBPYmplY3RbMF07Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBNZXRob2RTZWFyY2hSZXN1bHQgc2VhcmNoUmVzdWx0OwotCi0JLyoqCi0JICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFNlYXJjaFJlc3VsdCkgewotCQkJcmV0dXJuICgoTWV0aG9kU2VhcmNoUmVzdWx0KSBpbnB1dEVsZW1lbnQpLmdldEVsZW1lbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIEVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWlmIChuZXdJbnB1dCAhPSBudWxsICYmIG5ld0lucHV0IGluc3RhbmNlb2YgTWV0aG9kU2VhcmNoUmVzdWx0KSB7Ci0JCQl0YWJsZVZpZXdlciA9IChUYWJsZVZpZXdlcikgdmlld2VyOwotCQkJc2VhcmNoUmVzdWx0ID0gKE1ldGhvZFNlYXJjaFJlc3VsdCkgbmV3SW5wdXQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbGVtZW50c0NoYW5nZWQoT2JqZWN0W10gdXBkYXRlZEVsZW1lbnRzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXBkYXRlZEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoc2VhcmNoUmVzdWx0LmdldE1hdGNoQ291bnQodXBkYXRlZEVsZW1lbnRzW2ldKSA+IDApIHsKLQkJCQlpZiAodGFibGVWaWV3ZXIudGVzdEZpbmRJdGVtKHVwZGF0ZWRFbGVtZW50c1tpXSkgIT0gbnVsbCkgewotCQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKHVwZGF0ZWRFbGVtZW50c1tpXSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGFibGVWaWV3ZXIuYWRkKHVwZGF0ZWRFbGVtZW50c1tpXSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl0YWJsZVZpZXdlci5yZW1vdmUodXBkYXRlZEVsZW1lbnRzW2ldKTsKLQkJCX0KLQkJfQotCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9TZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL1NlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIxMTBlNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL1NlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuU2VhcmNoVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogVGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBtZXRob2Qgc2VhcmNoIHJlc3VsdCB0cmVlIHZpZXdlci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLR19OQU1FX0NPTlRFTlQgPSAiQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRV9DT1JFX0NPTlRFTlQgPSAiQ29yZUNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfQ0FURUdPUklFUyA9ICJDYXRlZ29yaWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLR19OQU1FX0RJU0NJUExJTkVTID0gIkRpc2NpcGxpbmVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLR19OQU1FX0RPTUFJTlMgPSAiRG9tYWlucyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRV9XT1JLX1BST0RVQ1RfVFlQRVMgPSAiV1AgVHlwZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfUk9MRVNFVFMgPSAiUm9sZVNldHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfVE9PTFMgPSAiVG9vbHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfQ1VTVE9NX0NBVEVHT1JJRVMgPSAiQ3VzdG9tQ2F0ZWdvcmllcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRV9DQVBBQklMSVRZX1BBVFRFUk5TID0gIkNhcGFiaWxpdHlQYXR0ZXJucyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRV9ERUxJVkVSWV9QUk9DRVNTRVMgPSAiRGVsaXZlcnlQcm9jZXNzZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0NPTlRFTlQgPSBTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hSZXN1bHRfbWV0aG9kQ29udGVudDsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9QQUNLQUdFUyA9IFNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaFJlc3VsdF9jb250ZW50UGFja2FnZXM7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQU5EQVJEX0NBVEVHT1JJRVMgPSBTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hSZXN1bHRfc3RhbmRhcmRDYXRlZ29yaWVzOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDSVBMSU5FUyA9IFNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaFJlc3VsdF9kaXNjaXBsaW5lczsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9NQUlOUyA9IFNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaFJlc3VsdF9kb21haW5zOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX1BST0RVQ1RfVFlQRVMgPSBTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hSZXN1bHRfd29ya1Byb2R1Y3RUeXBlczsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRVNFVFMgPSBTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hSZXN1bHRfcm9sZVNldHM7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xTID0gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUmVzdWx0X3Rvb2xzOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ0FURUdPUklFUyA9IFNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaFJlc3VsdF9jdXN0b21DYXRlZ29yaWVzOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTRVMgPSBTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hSZXN1bHRfcHJvY2Vzc2VzOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBBQklMSVRZX1BBVFRFUk5TID0gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUmVzdWx0X2NhcGFiaWxpdHlQYXR0ZXJuczsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSVZFUllfUFJPQ0VTU0VTID0gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUmVzdWx0X2RlbGl2ZXJ5UHJvY2Vzc2VzOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX0xJU1QgPSBuZXcgT2JqZWN0WzBdOwotCi0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlwcml2YXRlIE1ldGhvZFNlYXJjaFJlc3VsdCBzZWFyY2hSZXN1bHQ7Ci0KLQlwcml2YXRlIE1hcDxPYmplY3QsIE9iamVjdD4gZWxlbWVudE1hcDsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFNlYXJjaFJlc3VsdCkgewotCQkJT2JqZWN0W10gZWxlbWVudHMgPSAoKE1ldGhvZFNlYXJjaFJlc3VsdCkgaW5wdXRFbGVtZW50KQotCQkJCQkuZ2V0RWxlbWVudHMoKTsKLQkJCWlmIChlbGVtZW50cy5sZW5ndGggPT0gMCkgewotCQkJCXJldHVybiBFTVBUWV9MSVNUOwotCQkJfQotCQkJZWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWluc2VydChlbGVtZW50c1tpXSwgZmFsc2UpOwotCQkJfQotCi0JCQlpbnNlcnRVSUZvbGRlcnMoaW5wdXRFbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKG5ld0lucHV0ICE9IG51bGwgJiYgbmV3SW5wdXQgaW5zdGFuY2VvZiBNZXRob2RTZWFyY2hSZXN1bHQpIHsKLQkJCXRyZWVWaWV3ZXIgPSAoVHJlZVZpZXdlcikgdmlld2VyOwotCQkJc2VhcmNoUmVzdWx0ID0gKE1ldGhvZFNlYXJjaFJlc3VsdCkgbmV3SW5wdXQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbGVtZW50c0NoYW5nZWQoT2JqZWN0W10gdXBkYXRlZEVsZW1lbnRzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXBkYXRlZEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoc2VhcmNoUmVzdWx0LmdldE1hdGNoQ291bnQodXBkYXRlZEVsZW1lbnRzW2ldKSA+IDApIHsKLQkJCQlpZiAodHJlZVZpZXdlci50ZXN0RmluZEl0ZW0odXBkYXRlZEVsZW1lbnRzW2ldKSAhPSBudWxsKSB7Ci0JCQkJCWluc2VydCh1cGRhdGVkRWxlbWVudHNbaV0sIHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlbW92ZSh1cGRhdGVkRWxlbWVudHNbaV0sIHRydWUpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdHJlZVZpZXdlci5yZW1vdmUodXBkYXRlZEVsZW1lbnRzW2ldKTsKLQkJCX0KLQkJfQotCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlpZiAoZWxlbWVudE1hcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRU1QVFlfTElTVDsKLQkJfQotCQlTZXQgY2hpbGRyZW4gPSAoU2V0KSBlbGVtZW50TWFwLmdldChwYXJlbnRFbGVtZW50KTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCXJldHVybiBFTVBUWV9MSVNUOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHRVSUZvbGRlcikgewotCQkJcmV0dXJuICgoU2VhcmNoUmVzdWx0VUlGb2xkZXIpIGVsZW1lbnQpLmdldFBhcmVudCgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJUHJvY2Vzc1BhY2thZ2UgcHJvY2Vzc1BhY2thZ2UgPSAoUHJvY2Vzc1BhY2thZ2UpIGVsZW1lbnQ7Ci0JCQlPYmplY3QgcGFyZW50ID0gcHJvY2Vzc1BhY2thZ2UuZUNvbnRhaW5lcigpOwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlQcm9jZXNzQ29tcG9uZW50IHByb2Nlc3NDb21wb25lbnQgPSAoUHJvY2Vzc0NvbXBvbmVudCkgcGFyZW50OwotCQkJCXJldHVybiBwcm9jZXNzQ29tcG9uZW50LmdldFByb2Nlc3MoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHBhcmVudDsKLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlID0gKE1ldGhvZFBhY2thZ2UpIGVsZW1lbnQ7Ci0JCQlPYmplY3QgcGFyZW50ID0gbWV0aG9kUGFja2FnZS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIHBhcmVudDsKLQkJCX0KLQkJCU1ldGhvZFBhY2thZ2UgcGFyZW50UGFja2FnZSA9IG1ldGhvZFBhY2thZ2UuZ2V0UGFyZW50UGFja2FnZSgpOwotCQkJcmV0dXJuIHBhcmVudFBhY2thZ2U7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgZWxlbWVudDsKLQkJCUFydGlmYWN0IGNvbnRhaW5lckFydGlmYWN0ID0gYXJ0aWZhY3QuZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKTsKLQkJCWlmIChjb250YWluZXJBcnRpZmFjdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGNvbnRhaW5lckFydGlmYWN0OwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gVW1hVXRpbC5nZXRDb250ZW50UGFja2FnZShhcnRpZmFjdCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQlQcmFjdGljZSBwcmFjdGljZSA9IChQcmFjdGljZSkgZWxlbWVudDsKLQkJCXJldHVybiBwcmFjdGljZS5nZXRDb250YWluZXIoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJRGlzY2lwbGluZSBkaXNjaXBsaW5lID0gKERpc2NpcGxpbmUpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gZGlzY2lwbGluZS5nZXRDb250YWluZXIoKTsJCQkKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQlEb21haW4gZG9tYWluID0gKERvbWFpbikgZWxlbWVudDsKLQkJCXJldHVybiBkb21haW4uZ2V0Q29udGFpbmVyKCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gVW1hVXRpbC5nZXRDb250ZW50UGFja2FnZSgoQ29udGVudEVsZW1lbnQpIGVsZW1lbnQpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQlQcm9jZXNzIHByb2Nlc3MgPSAoUHJvY2VzcykgZWxlbWVudDsKLQkJCVByb2Nlc3NQYWNrYWdlIHBhcmVudCA9IChQcm9jZXNzUGFja2FnZSkgcHJvY2Vzcy5lQ29udGFpbmVyKCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcGFyZW50LmVDb250YWluZXIoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCVByb2Nlc3NQYWNrYWdlIHByb2Nlc3NQYWNrYWdlID0gVW1hVXRpbAotCQkJCQkuZ2V0UHJvY2Vzc1BhY2thZ2UoKFByb2Nlc3NFbGVtZW50KSBlbGVtZW50KTsKLQkJCWlmIChwcm9jZXNzUGFja2FnZSAhPSBudWxsKSB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2UgcGFyZW50UGFja2FnZSA9IChQcm9jZXNzUGFja2FnZSkgcHJvY2Vzc1BhY2thZ2UKLQkJCQkJCS5nZXRQYXJlbnRQYWNrYWdlKCk7Ci0JCQkJaWYgKHBhcmVudFBhY2thZ2UgIT0gbnVsbCkgewotCQkJCQlpZiAocGFyZW50UGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KSBwYXJlbnRQYWNrYWdlOwotCQkJCQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnQuZ2V0UHJvY2VzcygpOwotCQkJCQl9Ci0JCQkJCUxpc3QgcHJvY2Vzc0VsZW1lbnRzID0gcGFyZW50UGFja2FnZS5nZXRQcm9jZXNzRWxlbWVudHMoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpID0gcHJvY2Vzc0VsZW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCQkJUHJvY2Vzc0VsZW1lbnQgcHJvY2Vzc0VsZW1lbnQgPSAoUHJvY2Vzc0VsZW1lbnQpIGkKLQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCWlmIChwcm9jZXNzRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkJCSYmIHByb2Nlc3NFbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoCi0JCQkJCQkJCQkJcGFyZW50UGFja2FnZS5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJcmV0dXJuIHByb2Nlc3NFbGVtZW50OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCkgewotCQkJUHJvY2Vzc1BhY2thZ2UgcHJvY2Vzc1BhY2thZ2UgPSBVbWFVdGlsCi0JCQkJCS5nZXRQcm9jZXNzUGFja2FnZSgoUHJvY2Vzc0VsZW1lbnQpIGVsZW1lbnQpOwotCQkJaWYgKHByb2Nlc3NQYWNrYWdlICE9IG51bGwpIHsKLQkJCQlpZiAocHJvY2Vzc1BhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KSBwcm9jZXNzUGFja2FnZTsKLQkJCQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnQuZ2V0UHJvY2VzcygpOwotCQkJCX0KLQkJCQlMaXN0IHByb2Nlc3NFbGVtZW50cyA9IHByb2Nlc3NQYWNrYWdlLmdldFByb2Nlc3NFbGVtZW50cygpOwotCQkJCWZvciAoSXRlcmF0b3IgaSA9IHByb2Nlc3NFbGVtZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJUHJvY2Vzc0VsZW1lbnQgcHJvY2Vzc0VsZW1lbnQgPSAoUHJvY2Vzc0VsZW1lbnQpIGkubmV4dCgpOwotCQkJCQlpZiAocHJvY2Vzc0VsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJCSYmIHByb2Nlc3NFbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoCi0JCQkJCQkJCQlwcm9jZXNzUGFja2FnZS5nZXROYW1lKCkpKSB7Ci0JCQkJCQlyZXR1cm4gcHJvY2Vzc0VsZW1lbnQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHByb2Nlc3NQYWNrYWdlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0KE9iamVjdCBjaGlsZCwgYm9vbGVhbiByZWZyZXNoVmlld2VyKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQoY2hpbGQpOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLQkJCWlmIChpbnNlcnRDaGlsZChwYXJlbnQsIGNoaWxkKSkgewotCQkJCWlmIChyZWZyZXNoVmlld2VyKSB7Ci0JCQkJCXRyZWVWaWV3ZXIuYWRkKHBhcmVudCwgY2hpbGQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHJlZnJlc2hWaWV3ZXIpIHsKLQkJCQkJdHJlZVZpZXdlci5yZWZyZXNoKHBhcmVudCk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCWNoaWxkID0gcGFyZW50OwotCQkJcGFyZW50ID0gZ2V0UGFyZW50KGNoaWxkKTsKLQkJfQotCQlpZiAoaW5zZXJ0Q2hpbGQoc2VhcmNoUmVzdWx0LCBjaGlsZCkpIHsKLQkJCWlmIChyZWZyZXNoVmlld2VyKSB7Ci0JCQkJdHJlZVZpZXdlci5hZGQoc2VhcmNoUmVzdWx0LCBjaGlsZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbnNlcnRDaGlsZChPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIHsKLQkJU2V0IGNoaWxkcmVuID0gKFNldCkgZWxlbWVudE1hcC5nZXQocGFyZW50KTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEhhc2hTZXQoKTsKLQkJCWVsZW1lbnRNYXAucHV0KHBhcmVudCwgY2hpbGRyZW4pOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbi5hZGQoY2hpbGQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2UoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkLCBPYmplY3QgbmV3Q2hpbGQpIHsKLQkJaW5zZXJ0KG5ld0NoaWxkLCBmYWxzZSk7Ci0JCWVsZW1lbnRNYXAucHV0KG5ld0NoaWxkLCAoU2V0KSBlbGVtZW50TWFwLmdldChjaGlsZCkpOwotCQllbGVtZW50TWFwLnJlbW92ZShjaGlsZCk7Ci0JCVNldCBjaGlsZHJlbiA9IChTZXQpIGVsZW1lbnRNYXAuZ2V0KHBhcmVudCk7Ci0JCWNoaWxkcmVuLnJlbW92ZShjaGlsZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKE9iamVjdCBlbGVtZW50LCBib29sZWFuIHJlZnJlc2hWaWV3ZXIpIHsKLQkJaWYgKGhhc0NoaWxkcmVuKGVsZW1lbnQpKSB7Ci0JCQlpZiAocmVmcmVzaFZpZXdlcikgewotCQkJCXRyZWVWaWV3ZXIucmVmcmVzaChlbGVtZW50KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChzZWFyY2hSZXN1bHQuZ2V0TWF0Y2hDb3VudChlbGVtZW50KSA9PSAwKSB7Ci0JCQkJZWxlbWVudE1hcC5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChlbGVtZW50KTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJcmVtb3ZlRnJvbVNpYmxpbmdzKGVsZW1lbnQsIHBhcmVudCk7Ci0JCQkJCXJlbW92ZShwYXJlbnQsIHJlZnJlc2hWaWV3ZXIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlbW92ZUZyb21TaWJsaW5ncyhlbGVtZW50LCBzZWFyY2hSZXN1bHQpOwotCQkJCQlpZiAocmVmcmVzaFZpZXdlcikgewotCQkJCQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChyZWZyZXNoVmlld2VyKSB7Ci0JCQkJCXRyZWVWaWV3ZXIucmVmcmVzaChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tU2libGluZ3MoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBwYXJlbnQpIHsKLQkJU2V0IHNpYmxpbmdzID0gKFNldCkgZWxlbWVudE1hcC5nZXQocGFyZW50KTsKLQkJaWYgKHNpYmxpbmdzICE9IG51bGwpIHsKLQkJCXNpYmxpbmdzLnJlbW92ZShlbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydHMgdGhlIFVJIGZvbGRlcnMgaW50byB0aGUgc2VhcmNoIHJlc3VsdCB0cmVlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluc2VydFVJRm9sZGVycyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzID0gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJU2VhcmNoUmVzdWx0VUlGb2xkZXIgbWV0aG9kQ29udGVudEZvbGRlciA9IG5ldyBTZWFyY2hSZXN1bHRVSUZvbGRlcigKLQkJCQkJCU1FVEhPRF9DT05URU5ULCBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ29udGVudCIpKSwgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTZWFyY2hSZXN1bHRVSUZvbGRlciBwcm9jZXNzZXNGb2xkZXIgPSBuZXcgU2VhcmNoUmVzdWx0VUlGb2xkZXIoCi0JCQkJCQlQUk9DRVNTRVMsIEV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Qcm9jZXNzZXMiKSksIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkJT2JqZWN0W10gbWV0aG9kUGFja2FnZXMgPSBnZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1ldGhvZFBhY2thZ2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCU9iamVjdCBtZXRob2RQYWNrYWdlID0gbWV0aG9kUGFja2FnZXNbal07Ci0JCQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UKLQkJCQkJCQkmJiAoKENvbnRlbnRQYWNrYWdlKSBtZXRob2RQYWNrYWdlKS5nZXROYW1lKCkKLQkJCQkJCQkJCS5lcXVhbHMoUEtHX05BTUVfQ09OVEVOVCkpIHsKLQkJCQkJCU9iamVjdFtdIHBhY2thZ2VzID0gZ2V0Q2hpbGRyZW4obWV0aG9kUGFja2FnZSk7Ci0JCQkJCQlmb3IgKGludCBrID0gMDsgayA8IHBhY2thZ2VzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQkJT2JqZWN0IHBrZyA9IHBhY2thZ2VzW2tdOwotCQkJCQkJCWlmIChwa2cgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCQkJCQlpZiAoKChDb250ZW50UGFja2FnZSkgcGtnKS5nZXROYW1lKCkuZXF1YWxzKAotCQkJCQkJCQkJCVBLR19OQU1FX0NPUkVfQ09OVEVOVCkpIHsKLQkJCQkJCQkJCXJlcGxhY2UoCi0JCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJCXBrZywKLQkJCQkJCQkJCQkJbmV3IFNlYXJjaFJlc3VsdFVJRm9sZGVyKAotCQkJCQkJCQkJCQkJCUNPTlRFTlRfUEFDS0FHRVMsCi0JCQkJCQkJCQkJCQkJRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlcyIpKSwgbWV0aG9kQ29udGVudEZvbGRlcikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0gZWxzZSBpZiAoKChDb250ZW50UGFja2FnZSkgcGtnKS5nZXROYW1lKCkKLQkJCQkJCQkJCQkuZXF1YWxzKFBLR19OQU1FX0NBVEVHT1JJRVMpKSB7Ci0JCQkJCQkJCQlTZWFyY2hSZXN1bHRVSUZvbGRlciBzdGFuZGFyZENhdGVnb3JpZXNGb2xkZXIgPSBuZXcgU2VhcmNoUmVzdWx0VUlGb2xkZXIoCi0JCQkJCQkJCQkJCVNUQU5EQVJEX0NBVEVHT1JJRVMsCi0JCQkJCQkJCQkJCUV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1N0YW5kYXJkQ2F0ZWdvcmllcyIpKSwgbWV0aG9kQ29udGVudEZvbGRlcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCVNlYXJjaFJlc3VsdFVJRm9sZGVyIGN1c3RvbUNhdGVnb3JpZXNGb2xkZXIgPSBuZXcgU2VhcmNoUmVzdWx0VUlGb2xkZXIoCi0JCQkJCQkJCQkJCUNVU1RPTV9DQVRFR09SSUVTLAotCQkJCQkJCQkJCQlFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yaWVzIikpLCBtZXRob2RDb250ZW50Rm9sZGVyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJT2JqZWN0W10gY29udGVudFBhY2thZ2VzID0gZ2V0Q2hpbGRyZW4ocGtnKTsKLQkJCQkJCQkJCWZvciAoaW50IGwgPSAwOyBsIDwgY29udGVudFBhY2thZ2VzLmxlbmd0aDsgbCsrKSB7Ci0JCQkJCQkJCQkJT2JqZWN0IGNvbnRlbnRQYWNrYWdlID0gY29udGVudFBhY2thZ2VzW2xdOwotCQkJCQkJCQkJCWlmIChjb250ZW50UGFja2FnZSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJCQkJCQkJCVN0cmluZyBwa2dOYW1lID0gKChDb250ZW50UGFja2FnZSkgY29udGVudFBhY2thZ2UpCi0JCQkJCQkJCQkJCQkJLmdldE5hbWUoKTsKLQkJCQkJCQkJCQkJaWYgKHBrZ05hbWUKLQkJCQkJCQkJCQkJCQkuZXF1YWxzKFBLR19OQU1FX0NVU1RPTV9DQVRFR09SSUVTKSkgewotCQkJCQkJCQkJCQkJaW5zZXJ0KGN1c3RvbUNhdGVnb3JpZXNGb2xkZXIsCi0JCQkJCQkJCQkJCQkJCWZhbHNlKTsKLQkJCQkJCQkJCQkJCWVsZW1lbnRNYXAKLQkJCQkJCQkJCQkJCQkJLnB1dCgKLQkJCQkJCQkJCQkJCQkJCQljdXN0b21DYXRlZ29yaWVzRm9sZGVyLAotCQkJCQkJCQkJCQkJCQkJCShTZXQpIGVsZW1lbnRNYXAKLQkJCQkJCQkJCQkJCQkJCQkJCS5nZXQoY29udGVudFBhY2thZ2UpKTsKLQkJCQkJCQkJCQkJfSBlbHNlIGlmIChwa2dOYW1lCi0JCQkJCQkJCQkJCQkJLmVxdWFscyhQS0dfTkFNRV9ESVNDSVBMSU5FUykpIHsKLQkJCQkJCQkJCQkJCWluc2VydCgKLQkJCQkJCQkJCQkJCQkJc3RhbmRhcmRDYXRlZ29yaWVzRm9sZGVyLAotCQkJCQkJCQkJCQkJCQlmYWxzZSk7Ci0JCQkJCQkJCQkJCQlyZXBsYWNlKAotCQkJCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQkJCQljb250ZW50UGFja2FnZSwKLQkJCQkJCQkJCQkJCQkJbmV3IFNlYXJjaFJlc3VsdFVJRm9sZGVyKAotCQkJCQkJCQkJCQkJCQkJCURJU0NJUExJTkVTLAotCQkJCQkJCQkJCQkJCQkJCUV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGlzY2lwbGluZXMiKSksIHN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlcikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCX0gZWxzZSBpZiAocGtnTmFtZQotCQkJCQkJCQkJCQkJCS5lcXVhbHMoUEtHX05BTUVfRE9NQUlOUykpIHsKLQkJCQkJCQkJCQkJCWluc2VydCgKLQkJCQkJCQkJCQkJCQkJc3RhbmRhcmRDYXRlZ29yaWVzRm9sZGVyLAotCQkJCQkJCQkJCQkJCQlmYWxzZSk7Ci0JCQkJCQkJCQkJCQlyZXBsYWNlKAotCQkJCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQkJCQljb250ZW50UGFja2FnZSwKLQkJCQkJCQkJCQkJCQkJbmV3IFNlYXJjaFJlc3VsdFVJRm9sZGVyKAotCQkJCQkJCQkJCQkJCQkJCURPTUFJTlMsCi0JCQkJCQkJCQkJCQkJCQkJRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Eb21haW5zIikpLCBzdGFuZGFyZENhdGVnb3JpZXNGb2xkZXIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQl9IGVsc2UgaWYgKHBrZ05hbWUKLQkJCQkJCQkJCQkJCQkuZXF1YWxzKFBLR19OQU1FX1dPUktfUFJPRFVDVF9UWVBFUykpIHsKLQkJCQkJCQkJCQkJCWluc2VydCgKLQkJCQkJCQkJCQkJCQkJc3RhbmRhcmRDYXRlZ29yaWVzRm9sZGVyLAotCQkJCQkJCQkJCQkJCQlmYWxzZSk7Ci0JCQkJCQkJCQkJCQlyZXBsYWNlKAotCQkJCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQkJCQljb250ZW50UGFja2FnZSwKLQkJCQkJCQkJCQkJCQkJbmV3IFNlYXJjaFJlc3VsdFVJRm9sZGVyKAotCQkJCQkJCQkJCQkJCQkJCVdPUktfUFJPRFVDVF9UWVBFUywKLQkJCQkJCQkJCQkJCQkJCQlFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1dvcmtQcm9kdWN0VHlwZXMiKSksIHN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlcikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCX0gZWxzZSBpZiAocGtnTmFtZQotCQkJCQkJCQkJCQkJCS5lcXVhbHMoUEtHX05BTUVfUk9MRVNFVFMpKSB7Ci0JCQkJCQkJCQkJCQlpbnNlcnQoCi0JCQkJCQkJCQkJCQkJCXN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlciwKLQkJCQkJCQkJCQkJCQkJZmFsc2UpOwotCQkJCQkJCQkJCQkJcmVwbGFjZSgKLQkJCQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJCQkJY29udGVudFBhY2thZ2UsCi0JCQkJCQkJCQkJCQkJCW5ldyBTZWFyY2hSZXN1bHRVSUZvbGRlcigKLQkJCQkJCQkJCQkJCQkJCQlST0xFU0VUUywKLQkJCQkJCQkJCQkJCQkJCQlFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1JvbGVzIikpLCBzdGFuZGFyZENhdGVnb3JpZXNGb2xkZXIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQl9IGVsc2UgaWYgKHBrZ05hbWUKLQkJCQkJCQkJCQkJCQkuZXF1YWxzKFBLR19OQU1FX1RPT0xTKSkgewotCQkJCQkJCQkJCQkJaW5zZXJ0KAotCQkJCQkJCQkJCQkJCQlzdGFuZGFyZENhdGVnb3JpZXNGb2xkZXIsCi0JCQkJCQkJCQkJCQkJCWZhbHNlKTsKLQkJCQkJCQkJCQkJCXJlcGxhY2UoCi0JCQkJCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJCQkJCWNvbnRlbnRQYWNrYWdlLAotCQkJCQkJCQkJCQkJCQluZXcgU2VhcmNoUmVzdWx0VUlGb2xkZXIoCi0JCQkJCQkJCQkJCQkJCQkJVE9PTFMsCi0JCQkJCQkJCQkJCQkJCQkJRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Ub29scyIpKSwgc3RhbmRhcmRDYXRlZ29yaWVzRm9sZGVyKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsZW1lbnRNYXAucmVtb3ZlKHBrZyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlCi0JCQkJCQkJCQkmJiAoKFByb2Nlc3NQYWNrYWdlKSBwa2cpLmdldE5hbWUoKS5lcXVhbHMoCi0JCQkJCQkJCQkJCVBLR19OQU1FX0NBUEFCSUxJVFlfUEFUVEVSTlMpKSB7Ci0JCQkJCQkJCXJlcGxhY2UoCi0JCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQlwa2csCi0JCQkJCQkJCQkJbmV3IFNlYXJjaFJlc3VsdFVJRm9sZGVyKAotCQkJCQkJCQkJCQkJQ0FQQUJJTElUWV9QQVRURVJOUywKLQkJCQkJCQkJCQkJCUV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybnMiKSksIHByb2Nlc3Nlc0ZvbGRlcikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJU2V0IGNoaWxkcmVuID0gKFNldCkgZWxlbWVudE1hcC5nZXQoZWxlbWVudCk7Ci0JCQkJCQljaGlsZHJlbi5yZW1vdmUobWV0aG9kUGFja2FnZSk7Ci0JCQkJCX0gZWxzZSBpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlCi0JCQkJCQkJJiYgKChQcm9jZXNzUGFja2FnZSkgbWV0aG9kUGFja2FnZSkuZ2V0TmFtZSgpCi0JCQkJCQkJCQkuZXF1YWxzKFBLR19OQU1FX0RFTElWRVJZX1BST0NFU1NFUykpIHsKLQkJCQkJCXJlcGxhY2UoCi0JCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCW1ldGhvZFBhY2thZ2UsCi0JCQkJCQkJCW5ldyBTZWFyY2hSZXN1bHRVSUZvbGRlcigKLQkJCQkJCQkJCQlERUxJVkVSWV9QUk9DRVNTRVMsCi0JCQkJCQkJCQkJRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3NlcyIpKSwgcHJvY2Vzc2VzRm9sZGVyKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0VUlGb2xkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0VUlGb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUxYjdkNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL1NlYXJjaFJlc3VsdFVJRm9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBNb2RlbHMgYSBVSSBmb2xkZXIgaW4gdGhlIG1ldGhvZCBzZWFyY2ggcmVzdWx0IHRyZWUgdmlldy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hSZXN1bHRVSUZvbGRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZSBERUZBVUxUX0lNQUdFID0gRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Gb2xkZXIiKSk7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQlwcml2YXRlIEltYWdlIGltYWdlOwotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgZm9yIHRoZSBmb2xkZXIuCi0JICovCi0JcHVibGljIFNlYXJjaFJlc3VsdFVJRm9sZGVyKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMobmFtZSwgREVGQVVMVF9JTUFHRSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgZm9sZGVyCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBvYmplY3QKLQkgKi8KLQlwdWJsaWMgU2VhcmNoUmVzdWx0VUlGb2xkZXIoU3RyaW5nIG5hbWUsIE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcyhuYW1lLCBERUZBVUxUX0lNQUdFLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIGZvbGRlcgotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgYW4gaW1hZ2UgZm9yIHRoZSBmb2xkZXIKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IG9iamVjdAotCSAqLwotCXB1YmxpYyBTZWFyY2hSZXN1bHRVSUZvbGRlcihTdHJpbmcgbmFtZSwgSW1hZ2UgaW1hZ2UsIE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5pbWFnZSA9IGltYWdlOwotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZvbGRlciBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBmb3IgYSBVSSBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBvYmplY3QgZm9yIHRoZSBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwYXJlbnQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgb2JqZWN0Ci0JICogQHJldHVybiB0aGUgZ2l2ZW4gcGFyZW50IG9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3Qgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmb2xkZXIgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZjYmMyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIHNlYXJjaGluZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNTYxMjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHNlYXJjaGluZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvcHJlZmVyZW5jZXMvU2VhcmNoVUlQcmVmZXJlbmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9wcmVmZXJlbmNlcy9TZWFyY2hVSVByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NTYxNDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9wcmVmZXJlbmNlcy9TZWFyY2hVSVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5TZWFyY2hVSVBsdWdpbjsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBTZWFyY2ggVUkgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VhcmNoVUlQcmVmZXJlbmNlcyB7Ci0KLQkvKioKLQkgKiBUaGUgU2VhcmNoIFVJIHByZWZlcmVuY2Uga2V5cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUFSQ0hfU1RSSU5HID0gInNlYXJjaFN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUEFUVEVSTiA9ICJuYW1lUGF0dGVybiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBU0VfU0VOU0lUSVZFID0gImNhc2VTZW5zaXRpdmUiOyAvLyROT04tTkxTLTEkCQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2F2ZWQgc2VhcmNoIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZWFyY2hTdHJpbmcoKSB7Ci0JCXJldHVybiBTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCVNFQVJDSF9TVFJJTkcpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBjdXJyZW50IHNlYXJjaCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNlYXJjaFN0cmluZyhTdHJpbmcgc2VhcmNoU3RyaW5nKSB7Ci0JCVNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQlTRUFSQ0hfU1RSSU5HLCBzZWFyY2hTdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNhdmVkIG5hbWUgcGF0dGVybiBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZVBhdHRlcm4oKSB7Ci0JCXJldHVybiBTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCU5BTUVfUEFUVEVSTik7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGN1cnJlbnQgbmFtZSBwYXR0ZXJuIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0TmFtZVBhdHRlcm4oU3RyaW5nIG5hbWVQYXR0ZXJuKSB7Ci0JCVNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShOQU1FX1BBVFRFUk4sCi0JCQkJbmFtZVBhdHRlcm4pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNhdmVkIGFzZSBzZW5zaXRpdmUgb3B0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRDYXNlU2Vuc2l0aXZlKCkgewotCQlyZXR1cm4gU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oCi0JCQkJQ0FTRV9TRU5TSVRJVkUpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBjdXJyZW50IGNhc2Ugc2Vuc2l0aXZlIG9wdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZShib29sZWFuIGNhc2VTZW5zaXRpdmUpIHsKLQkJU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKAotCQkJCUNBU0VfU0VOU0lUSVZFLCBjYXNlU2Vuc2l0aXZlKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTAzOWVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgcHJlZmVyZW5jZSBzdXBwb3J0IGZvciBzZWFyY2hpbmcgYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYTUzYWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5zZWFyY2g8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NTc5ZTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLlNlYXJjaFBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogY29tLmlibS5pY3UsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5hcGFjaGUubHVjZW5lO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLnNlYXJjaCwKLSBvcmcuZWNsaXBzZS5oZWxwLmJhc2UKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaCwKLSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmFuYWx5c2lzLAotIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZDZmNTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYzcwMzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgU2VhcmNoCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvR2VuZXJhdGVTZWFyY2hJbmRleEV4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9HZW5lcmF0ZVNlYXJjaEluZGV4RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNmU3YzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9HZW5lcmF0ZVNlYXJjaEluZGV4RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoOwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIHNlYXJjaCBpbmRleCBnZW5lcmF0aW9uIG9wZXJhdGlvbiBoYXMgZmFpbGVkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlU2VhcmNoSW5kZXhFeGNlcHRpb24gZXh0ZW5kcyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY1Mzc0MDUyMTE0NTExNzcxMTBMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgR2VuZXJhdGVTZWFyY2hJbmRleEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBHZW5lcmF0ZVNlYXJjaEluZGV4RXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIocm9vdENhdXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgR2VuZXJhdGVTZWFyY2hJbmRleEV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbiBhbmQgdGhlCi0JICogZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBHZW5lcmF0ZVNlYXJjaEluZGV4RXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UsIFN0cmluZyBlcnJvck1zZykgewotCQlzdXBlcihyb290Q2F1c2UsIGVycm9yTXNnKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL0lTZWFyY2hTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL0lTZWFyY2hTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOWEyMTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9JU2VhcmNoU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGl0RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25TZWFyY2hRdWVyeTsKLQotLyoqCi0gKiBUaGUgU2VhcmNoIFNlcnZpY2UgQVBJLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VhcmNoU2VydmljZSB7Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gc2VhcmNoUXVlcnkKLQkgKiAgICAgICAgICAgIGEgY29uZmlndXJhdGlvbiBzZWFyY2ggcXVlcnkKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIDxjb2RlPkNvbmZpZ3VyYXRpb25IaXRFbnRyeTwvY29kZT4gb2JqZWN0cwotCSAqIEB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uSGl0RW50cnlbXSBzZWFyY2hDb25maWd1cmF0aW9uKFN0cmluZyBwYXRoLAotCQkJQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5IHNlYXJjaFF1ZXJ5KSB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9JbmRleEJ1aWxkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvSW5kZXhCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNzkwNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9JbmRleEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLkFuYWx5emVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLmNqay5DSktBbmFseXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5GaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5JbmRleFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5GU0RpcmVjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmFuYWx5c2lzLlRleHRBbmFseXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnV0aWxzLkphckNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51dGlscy5MSFRNTFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnV0aWxzLlVOQ1V0aWw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0aGUgbWFpbiBjbGFzcyB0aGF0IGNyZWF0ZXMgdGhlIEluZGV4IGZyb20gdGhlIGZpbGUKLSAqIGFzc29jaWF0aW9ucyBpbiB0aGUgcHJvY2VzcyBsYXlvdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmRleEJ1aWxkZXIgewotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0ZJTEVfTkFNRSA9ICJ2ZXJzaW9uLnR4dCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fREVMSU1JVEVSID0gIioiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBEb2N1bWVudCBmaWVsZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJRUZfREVTQ1JJUFRJT05fRklFTEQgPSAiYnJpZWZEZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0ZJRUxEID0gImNvbnRlbnRzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0ZJRUxEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRElGSUVEX0ZJRUxEID0gIm1vZGlmaWVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRklFTEQgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX0ZJRUxEID0gInJvbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VNTUFSWV9GSUVMRCA9ICJzdW1tYXJ5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRklFTEQgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRklFTEQgPSAidXJsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFX0ZJRUxEID0gInRpdGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVNQV9FTEVNRU5UX1RZUEVfRklFTEQgPSAidW1hLnR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9DT05URU5UID0gImdlbmVyYWxfY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIExpc3Qgb2YgVU1BIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBzZWFyY2ggaW5kZXguCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBOT19TRUFSQ0hFQUJMRV9VTUFfRUxFTUVOVFMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0Jc3RhdGljIHsKLQkJTk9fU0VBUkNIRUFCTEVfVU1BX0VMRU1FTlRTLmFkZCgic3VtbWFyeSIpOyAvLyROT04tTkxTLTEkCi0JCU5PX1NFQVJDSEVBQkxFX1VNQV9FTEVNRU5UUy5hZGQoIndvcmtwcm9kdWN0ZGVzY3JpcHRvciIpOyAvLyROT04tTkxTLTEkCi0JCU5PX1NFQVJDSEVBQkxFX1VNQV9FTEVNRU5UUy5hZGQoInRhc2tkZXNjcmlwdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJTk9fU0VBUkNIRUFCTEVfVU1BX0VMRU1FTlRTLmFkZCgicm9sZWRlc2NyaXB0b3IiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIEEgbGlzdCBvZiB0b3AgbGV2ZWwgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUgc2VhcmNoCi0JLy8gaW5kZXguCi0JcHVibGljIHN0YXRpYyBMaXN0IGRpcnNUb1NraXAgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcERpcmVjdG9yeSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgaW5kZXhGb2xkZXIgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHByb2R1Y3ROYW1lID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZmlsZXNUb1NraXAgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgSW5kZXhCdWlsZGVyKFN0cmluZyBwdWJsaXNoRGlyKSB7Ci0JCWludCBhcHBsZXRJbmRleCA9IC0xOwotCQlpZiAocHVibGlzaERpciA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWFwcGxldEluZGV4ID0gcHVibGlzaERpci5pbmRleE9mKEZpbGUuc2VwYXJhdG9yICsgImFwcGxldCIpOyAvLyROT04tTkxTLTEkCi0KLQkJcERpcmVjdG9yeSA9IFVOQ1V0aWwuY29udmVydEZpbGVuYW1lKChhcHBsZXRJbmRleCA+IC0xKSA/IHB1Ymxpc2hEaXIKLQkJCQkuc3Vic3RyaW5nKDAsIGFwcGxldEluZGV4ICsgMSkgOiBwdWJsaXNoRGlyKTsKLQkJU3RyaW5nIHNpdGVOYW1lID0gcERpcmVjdG9yeS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLQkJaW50IGluZGV4ID0gc2l0ZU5hbWUubGVuZ3RoKCk7Ci0JCWlmIChzaXRlTmFtZS5lbmRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWluZGV4ID0gaW5kZXggLSAxOwotCQl9Ci0KLQkJaW50IGluZGV4MiA9IHNpdGVOYW1lLmxhc3RJbmRleE9mKCIvIiwgaW5kZXggLSAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCXByb2R1Y3ROYW1lID0gc2l0ZU5hbWUuc3Vic3RyaW5nKGluZGV4MiArIDEsIGluZGV4KTsKLQotCQkvLyBjcmVhdGUgdGhlIGluZGV4Ci0JCVN0cmluZ0J1ZmZlciBzZWFyY2hGb2xkZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHBEaXJlY3RvcnkpOwotCQlpZiAoIXNlYXJjaEZvbGRlci50b1N0cmluZygpLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgewotCQkJc2VhcmNoRm9sZGVyLmFwcGVuZChGaWxlLnNlcGFyYXRvcik7Ci0JCX0KLQkJc2VhcmNoRm9sZGVyLmFwcGVuZCgic2VhcmNoIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpbmRleEZvbGRlciA9IG5ldyBTdHJpbmdCdWZmZXIoc2VhcmNoRm9sZGVyLnRvU3RyaW5nKCkpOwotCQlpbmRleEZvbGRlci5hcHBlbmQoRmlsZS5zZXBhcmF0b3IpLmFwcGVuZCgiaW5kZXgiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAiYXBwbGV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJjc3MiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgImV4dF9oZWxwIik7IC8vJE5PTi1OTFMtMSQJCQotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgImljb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJpbWFnZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgImluZGV4Iik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJsb2dzIik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJtYW51YWxzIik7IC8vJE5PTi1OTFMtMSQJCQotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgIm5vYXBwbGV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJwYWdlc19ub3RfaW5zdGFsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJwcm9jZXNzIik7IC8vJE5PTi1OTFMtMSQJCQotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgInNjcmlwdHMiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgInN0eWxlc2hlZXRzIik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJ4bWwiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgInNlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0KLQkJZmlsZXNUb1NraXAuYWRkKCJfZGVzYy5odG0iKTsgIC8vJE5PTi1OTFMtMSQKLQkJZmlsZXNUb1NraXAuYWRkKCJfd2JzLmh0bSIpOyAvLyROT04tTkxTLTEkCi0JCWZpbGVzVG9Ta2lwLmFkZCgiX3Ricy5odG0iKTsgLy8kTk9OLU5MUy0xJAotCQlmaWxlc1RvU2tpcC5hZGQoIl93cGJzLmh0bSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGNyZWF0ZUluZGV4KGJvb2xlYW4gamFySXQpIHRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkIChJbmRleEJ1aWxkZXIuY2xhc3MpIHsKLQkJCQotCQkJaWYgKGluZGV4Rm9sZGVyID09IG51bGwgfHwgcERpcmVjdG9yeSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLQkJCQkJCSJJbnZhbGlkIGluZGV4Rm9sZGVyIG9yIHBEaXJlY3RvcnkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQkKLQkJCWJvb2xlYW4gamFrbyA9IGZhbHNlOwotCQkJTG9jYWxlIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0JCQlTdHJpbmcgbGFuZyA9IGxvY2FsZS5nZXRMYW5ndWFnZSgpOwotCQkJaWYgKGxhbmcuZXF1YWxzKExvY2FsZS5KQVBBTkVTRS5nZXRMYW5ndWFnZSgpKSB8fAotCQkJCWxhbmcuZXF1YWxzKExvY2FsZS5LT1JFQS5nZXRMYW5ndWFnZSgpKSkgewotCQkJCWpha28gPSB0cnVlOwotCQkJfQotCQkJQW5hbHl6ZXIgYW5hbHl6ZXIgPSBqYWtvID8gbmV3IENKS0FuYWx5emVyKCkgOiBuZXcgVGV4dEFuYWx5emVyKCk7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJLy8gUkFNRGlyZWN0b3J5IHJhbURpciA9IG5ldyBSQU1EaXJlY3RvcnkoKTsKLQkJCQlJbmRleFdyaXRlciBmc1dyaXRlciA9IG5ldyBJbmRleFdyaXRlcihGU0RpcmVjdG9yeQotCQkJCQkJLmdldERpcmVjdG9yeShpbmRleEZvbGRlci50b1N0cmluZygpLCB0cnVlKSwKLQkJCQkJCWFuYWx5emVyLCB0cnVlKTsKLQotCQkJCS8vIEluZGV4V3JpdGVyIHJhbVdyaXRlciA9IG5ldyBJbmRleFdyaXRlcihyYW1EaXIsCi0JCQkJLy8gbmV3IFRleHRBbmFseXplcigpLCB0cnVlKTsKLQotCQkJCWlmICgoZnNXcml0ZXIgIT0gbnVsbCkpIHsKLQkJCQkJLy8gZnNXcml0ZXIubWVyZ2VGYWN0b3IgPSAxMDAwOwotCQkJCQkvLyBmc1dyaXRlci5tYXhNZXJnZURvY3MgPSAxMDAwMDsKLQkJCQkJZnNXcml0ZXIuc2V0TWF4RmllbGRMZW5ndGgoMTAwMDAwMCk7Ci0KLQkJCQkJaW5kZXhEb2NzKG5ldyBGaWxlKHBEaXJlY3RvcnkpLCBmc1dyaXRlcik7Ci0KLQkJCQkJLy8gZnNXcml0ZXIuYWRkSW5kZXhlcyhuZXcgRGlyZWN0b3J5W10geyByYW1EaXIgfSk7Ci0JCQkJCWZzV3JpdGVyLm9wdGltaXplKCk7Ci0JCQkJCS8vIHJhbVdyaXRlci5jbG9zZSgpOwotCQkJCQlmc1dyaXRlci5jbG9zZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQkJLy8gY3JlYXRlIHRoZSB2ZXJzaW9uIGZpbGUuCi0JCQlEYXRlIHRvZGF5ID0gbmV3IERhdGUoKTsKLQkJCWxvbmcgbWlsbGlzZWNvbmRzID0gdG9kYXkuZ2V0VGltZSgpOwotCi0JCQlpZiAoIWphckl0KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRmlsZVdyaXRlciBmdyA9IG5ldyBGaWxlV3JpdGVyKGluZGV4Rm9sZGVyICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCQkrIFZFUlNJT05fRklMRV9OQU1FKTsKLQkJCQkJQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIoZncpOwotCQkJCQlidy53cml0ZShwcm9kdWN0TmFtZSArIFZFUlNJT05fREVMSU1JVEVSICsgbWlsbGlzZWNvbmRzCi0JCQkJCQkJKyAiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoYW5hbHl6ZXIgaW5zdGFuY2VvZiBDSktBbmFseXplcikgewotCQkJCQkJYncud3JpdGUoIkNKS0FuYWx5emVyIiArICJcbiIpOyAvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlidy5jbG9zZSgpOwotCQkJCQlmdy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCQl0aHJvdyBuZXcgU2VhcmNoU2VydmljZUV4Y2VwdGlvbigKLQkJCQkJCQlTZWFyY2hSZXNvdXJjZXMuY3JlYXRlU2VhcmNoSW5kZXhFcnJvcik7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8vIGphciB1cCB0aGUgY3JlYXRlZCBpbmRleC4KLQkJCUphckNyZWF0b3IuamFyRm9sZGVyKGluZGV4Rm9sZGVyLnRvU3RyaW5nKCkpOwotCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImluZGV4IEphcnJlZCBzdWNjZXNzZnVsbHkiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQl0cnkgewotCQkJCS8vIGRlbGV0ZSB0aGUgZmlsZXMgbm93IHRoYXQgdGhleSd2ZSBiZWVuIGphcnJlZC4KLQkJCQlGaWxlIGluZGV4RGlyID0gbmV3IEZpbGUoaW5kZXhGb2xkZXIudG9TdHJpbmcoKSk7Ci0JCQkJRmlsZVtdIGZpbGVzID0gaW5kZXhEaXIubGlzdEZpbGVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlGaWxlIHRlbXBGaWxlID0gZmlsZXNbaV07Ci0JCQkJCWlmICghdGVtcEZpbGUuZ2V0TmFtZSgpLmVxdWFscyhKYXJDcmVhdG9yLklOREVYX0pBUikpIHsKLQkJCQkJCXRlbXBGaWxlLmRlbGV0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gU3RyaW5nIHJ1cE5hbWUgPSBwdWJsaXNoRGlyLnN1YnN0cmluZyhpbmRleCk7Ci0JCQkJRmlsZSBuZXdJbmRleEphciA9IG5ldyBGaWxlKGluZGV4Rm9sZGVyICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCSsgSmFyQ3JlYXRvci5JTkRFWF9KQVIpOwotCQkJCWlmIChuZXdJbmRleEphci5leGlzdHMoKSkgewotCQkJCQlTdHJpbmcgZmlsZVNpemUgPSAiIiArIG5ld0luZGV4SmFyLmxlbmd0aCgpOyAvLyROT04tTkxTLTEkCi0JCQkJCUZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcihpbmRleEZvbGRlciArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkJKyBWRVJTSU9OX0ZJTEVfTkFNRSk7Ci0JCQkJCUJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKGZ3KTsKLQkJCQkJYncud3JpdGUocHJvZHVjdE5hbWUgKyBWRVJTSU9OX0RFTElNSVRFUiArIG1pbGxpc2Vjb25kcwotCQkJCQkJCSsgVkVSU0lPTl9ERUxJTUlURVIgKyBmaWxlU2l6ZSArICJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChhbmFseXplciBpbnN0YW5jZW9mIENKS0FuYWx5emVyKSB7Ci0JCQkJCQlidy53cml0ZSgiQ0pLQW5hbHl6ZXIiICsgIlxuIik7IC8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCWJ3LmNsb3NlKCk7Ci0JCQkJCWZ3LmNsb3NlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IFNlYXJjaFNlcnZpY2VFeGNlcHRpb24oCi0JCQkJCQkJU2VhcmNoUmVzb3VyY2VzLmNyZWF0ZVNlYXJjaEluZGV4RXJyb3IpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCXRocm93IG5ldyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uKAotCQkJCQkJU2VhcmNoUmVzb3VyY2VzLmNyZWF0ZVNlYXJjaEluZGV4RXJyb3IpOwotCQkJfQotCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluZGV4IHRoZSBhY3R1YWwgZG9jdW1lbnRzIHNwZWNpZmllZCBieSB0aGUgZmlsZXMgYW5kIHJlY3Vyc2l2ZWx5IGdldCBhbGwKLQkgKiBmaWxlIGluIHRoZSBzcGVjaWZpZWQgZm9sZGVyIGZpbGUKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5kZXhEb2NzKEZpbGUgZmlsZSwgSW5kZXhXcml0ZXIgd3JpdGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGRpcnNUb1NraXAuY29udGFpbnMoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZmlsZS5pc0ZpbGUoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmlsZXNUb1NraXAuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIGZpbGVUb1NraXAgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZmlsZS5nZXROYW1lKCkuaW5kZXhPZihmaWxlVG9Ta2lwKSA+IC0xKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlTdHJpbmdbXSBmaWxlcyA9IGZpbGUubGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWluZGV4RG9jcyhuZXcgRmlsZShmaWxlLCBmaWxlc1tpXSksIHdyaXRlcik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaXNIdG1sRG9jKGZpbGUpKSB7Ci0JCQlpZiAoc2hvdWxkQmVFeGNsdWRlZChmaWxlKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJCi0JCQkJRG9jdW1lbnQgZG9jID0gZ2V0SFRNTERvY3VtZW50KGZpbGUpOwkJCi0JCQkJCi0JCQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQkJCXdyaXRlci5hZGREb2N1bWVudChkb2MpOwkJCQkKLQkJCQl9Ci0JCQkJCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZmlsZS5nZXROYW1lKCkpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaW5kZXhEb2NzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBmaWxlIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZSBzZWFyY2ggaW5kZXguCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBmaWxlIHRvIGJlIHZlcmlmaWVkLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGZpbGUgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlCi0JICogICAgICAgICBzZWFyY2ggaW5kZXguCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZEJlRXhjbHVkZWQoRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBwYXRoID0gZmlsZS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCWlmIChwRGlyZWN0b3J5LnN0YXJ0c1dpdGgocGF0aCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNIdG1sRG9jKEZpbGUgZmlsZSkgewotCQlTdHJpbmcgcGF0aCA9IGZpbGUuZ2V0UGF0aCgpOwotCQlyZXR1cm4gcGF0aC5lbmRzV2l0aCgiLmh0bWwiKSB8fCBwYXRoLmVuZHNXaXRoKCIuaHRtIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc05vU2VhcmNoYWJsZURvY3VtZW50KFByb3BlcnRpZXMgbWV0YVRhZ3MpIHsKLQkJU3RyaW5nIHZhbHVlID0gbWV0YVRhZ3MuZ2V0UHJvcGVydHkoVU1BX0VMRU1FTlRfVFlQRV9GSUVMRCk7Ci0JCQotCQkvLyB2YWx1ZSA9PSBudWxsIGlzIHRyZWF0ZWQgYXMgZ2VuZXJhbCBkb2N1bWVudAotCQlyZXR1cm4gKHZhbHVlICE9IG51bGwpICYmIE5PX1NFQVJDSEVBQkxFX1VNQV9FTEVNRU5UUy5jb250YWlucyh2YWx1ZSk7Ci0JfQotCQotCWNoYXJbXSBjYnVmID0gbmV3IGNoYXJbMTAyNF07Ci0JaW50IHNraXBDb3VudCA9IDA7Ci0JCi0JcHJpdmF0ZSBEb2N1bWVudCBnZXRIVE1MRG9jdW1lbnQoRmlsZSBmaWxlKSB7Ci0JCURvY3VtZW50IGx1Y2VuZURvY3VtZW50ID0gbnVsbDsKLQkJSW5wdXRTdHJlYW1SZWFkZXIgaW5wdXQgPSBudWxsOwotCQlSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCQotCQkJaW5wdXQgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSwgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkJTEhUTUxQYXJzZXIgcGFyc2VyID0gbmV3IExIVE1MUGFyc2VyKGlucHV0KTsKLQotCQkJcmVhZGVyID0gcGFyc2VyLmdldFJlYWRlcigpOwotCQkJaWYgKCByZWFkZXIgPT0gbnVsbCApIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJUHJvcGVydGllcyBtZXRhVGFncyA9IHBhcnNlci5nZXRNZXRhVGFncygpOwotCQkJaWYgKCBpc05vU2VhcmNoYWJsZURvY3VtZW50KG1ldGFUYWdzKSApIHsKLQkJCQkKLQkJCQkvLyB0aGUgTEhUTUxQYXJzZXIgdGhyZWFkIHdpbGwgbm90IGVuZCBpZiB0aGUgcmVhZGVyIGlzIG5vdCBwcm9jZXNzZWQKLQkJCQkvLyBjYXVzaW5nIG1ham9yIHJlc291cmNlIGxlYWsKLQkJCQl3aGlsZSAoIHJlYWRlci5yZWFkKGNidWYpID4gMCApIHsKLQkJCQkJOwotCQkJCX0JCQkKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbiggKytza2lwQ291bnQgKyAiIGZpbGUgc2tpcHBlZDogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCXBhcnNlciA9IG51bGw7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCWx1Y2VuZURvY3VtZW50ID0gbmV3IERvY3VtZW50KCk7Ci0KLQkJCVN0cmluZyB1cmwgPSBmaWxlLmdldFBhdGgoKS5yZXBsYWNlKEZpbGUucGF0aFNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCQlsdWNlbmVEb2N1bWVudC5hZGQoRmllbGQuVW5JbmRleGVkKFVSTF9GSUVMRCwgdXJsKSk7Ci0JCQkKLQkJCWx1Y2VuZURvY3VtZW50LmFkZChGaWVsZC5UZXh0KENPTlRFTlRfRklFTEQsIHJlYWRlcikpOwotCQkJCi0JCQlTdHJpbmcgdGl0bGUgPSBwYXJzZXIuZ2V0VGl0bGUoKTsKLQkJCWlmICh0aXRsZSAhPSBudWxsICYmIHRpdGxlLmxlbmd0aCgpID4gMCkgewotCQkJCS8vIFdvcmthcm91bmQgYSBMaW51eCBzcGVjaWZpYyBpc3N1ZS4KLQkJCQl0aXRsZSA9IHRpdGxlLnJlcGxhY2VBbGwoIlxceGEwIiwgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbHVjZW5lRG9jdW1lbnQuYWRkKEZpZWxkLktleXdvcmQoVElUTEVfRklFTEQsIHRpdGxlKSk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlTdHJpbmcgc3VtbWFyeSA9IHBhcnNlci5nZXRTdW1tYXJ5KCk7Ci0JCQlpZiAoc3VtbWFyeS5zdGFydHNXaXRoKHRpdGxlKSAmJiBzdW1tYXJ5Lmxlbmd0aCgpID4gdGl0bGUubGVuZ3RoKCkpIHsKLQkJCQlsdWNlbmVEb2N1bWVudC5hZGQoRmllbGQuS2V5d29yZChTVU1NQVJZX0ZJRUxELCBzdW1tYXJ5Ci0JCQkJCQkuc3Vic3RyaW5nKHRpdGxlLmxlbmd0aCgpICsgMSkpKTsKLQkJCX0gZWxzZQotCQkJCWx1Y2VuZURvY3VtZW50LmFkZChGaWVsZC5LZXl3b3JkKFNVTU1BUllfRklFTEQsIHBhcnNlcgotCQkJCQkJLmdldFN1bW1hcnkoKSkpOwotCi0JCQlmb3IgKEVudW1lcmF0aW9uIG5hbWVzID0gbWV0YVRhZ3MucHJvcGVydHlOYW1lcygpOyBuYW1lcwotCQkJCQkuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJU3RyaW5nIHRhZ05hbWUgPSAoU3RyaW5nKSBuYW1lcy5uZXh0RWxlbWVudCgpOwotCQkJCWlmICh0YWdOYW1lICE9IG51bGwpIHsKLQkJCQkJaWYgKHRhZ05hbWUuZXF1YWxzKFJPTEVfRklFTEQpKSB7Ci0JCQkJCQlTdHJpbmcgcm9sZU5hbWUgPSBtZXRhVGFncy5nZXRQcm9wZXJ0eSh0YWdOYW1lKTsKLQkJCQkJCWlmIChyb2xlTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJbHVjZW5lRG9jdW1lbnQuYWRkKEZpZWxkLlRleHQodGFnTmFtZSwgcm9sZU5hbWUpKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZyB0YWdWYWx1ZSA9IG1ldGFUYWdzLmdldFByb3BlcnR5KHRhZ05hbWUpOwotCQkJCQkJaWYgKHRhZ1ZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQlsdWNlbmVEb2N1bWVudC5hZGQoRmllbGQuVGV4dCh0YWdOYW1lLCB0YWdWYWx1ZSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAobHVjZW5lRG9jdW1lbnQuZ2V0RmllbGQoUk9MRV9GSUVMRCkgPT0gbnVsbCkgewotCQkJCS8vIERlZmF1bHQgdG8gIm5hIiB0byBzdXBwb3J0IHNlYXJjaGluZyBmb3IgZmlsZXMgd2l0aG91dAotCQkJCS8vIHJvbGUgbWV0YSB0YWdzLgotCQkJCWx1Y2VuZURvY3VtZW50LmFkZChGaWVsZC5UZXh0KFJPTEVfRklFTEQsICJOT1JVUFJPTEUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJRmllbGQgdW1hVHlwZUZpZWxkID0gbHVjZW5lRG9jdW1lbnQKLQkJCQkJLmdldEZpZWxkKFVNQV9FTEVNRU5UX1RZUEVfRklFTEQpOwotCQkJaWYgKHVtYVR5cGVGaWVsZCA9PSBudWxsKSB7Ci0JCQkJLy8gRGVmYXVsdCB0byBnZW5lcmFsIGNvbnRlbnQuCi0JCQkJbHVjZW5lRG9jdW1lbnQuYWRkKEZpZWxkLlRleHQoVU1BX0VMRU1FTlRfVFlQRV9GSUVMRCwKLQkJCQkJCUdFTkVSQUxfQ09OVEVOVCkpOwotCQkJfSAKLQotCQkJcGFyc2VyID0gbnVsbDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWx1Y2VuZURvY3VtZW50ID0gbnVsbDsKLQkJCVNlYXJjaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbHVjZW5lRG9jdW1lbnQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0Mjg4MGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBJbmRleGluZyBwcm9ncmVzcyBtb25pdG9yCi1pbmRleENvbmZpZ0ZpbGVzVGFza19uYW1lPUluZGV4aW5nIGNvbmZpZ3VyYXRpb24gZmlsZXMuLi4KLQotIyBFcnJvciBEZXRhaWxzCi1jcmVhdGVTZWFyY2hJbmRleEVycm9yPVRoZSBzZWFyY2ggaW5kZXggZmlsZSB3YXMgbm90IGNyZWF0ZWQuCi0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hDb25maWd1cmF0aW9uRXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaENvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkyYTkxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaENvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2g7Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IGEgc2VhcmNoIGNvbmZpZ3VyYXRpb24gb3BlcmF0aW9uIGhhcyBmYWlsZWQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VhcmNoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjUzNzQwNTIxMTQ1MTE3NzExMEw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWFyY2hDb25maWd1cmF0aW9uRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIFNlYXJjaENvbmZpZ3VyYXRpb25FeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihyb290Q2F1c2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBTZWFyY2hDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZykgewotCQlzdXBlcihlcnJvck1zZyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uIGFuZCB0aGUKLQkgKiBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIFNlYXJjaENvbmZpZ3VyYXRpb25FeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSwgU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKHJvb3RDYXVzZSwgZXJyb3JNc2cpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzFkOWNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5BYnN0cmFjdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgU2VhcmNoIHBsdWctaW4gYWN0aXZhdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNlYXJjaFBsdWdpbiBleHRlbmRzIEFic3RyYWN0QWN0aXZhdG9yIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBTZWFyY2hQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VhcmNoUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VhcmNoUGx1Z2luIGdldERlZmF1bHQoKSB7CQotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYjdiNzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBTZWFyY2ggcmVzb3VyY2UgYnVuZGxlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNlYXJjaFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBTZWFyY2hSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5kZXhDb25maWdGaWxlc1Rhc2tfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVTZWFyY2hJbmRleEVycm9yOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgU2VhcmNoUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFNlYXJjaFJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ2ZmNiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuV2FyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhpdEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5jb25maWd1cmF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25TZWFyY2hTZXJ2aWNlOwotCi0vKioKLSAqIFRoZSBTZWFyY2ggU2VydmljZSBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hTZXJ2aWNlIGltcGxlbWVudHMgSVNlYXJjaFNlcnZpY2UgewotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBTZWFyY2hTZXJ2aWNlIGluc3RhbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlYXJjaFNlcnZpY2UgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKFNlYXJjaFNlcnZpY2UuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBTZWFyY2hTZXJ2aWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4KLQkgKi8KLQlwcml2YXRlIFNlYXJjaFNlcnZpY2UoKSB7Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoZXMgYSBwdWJsaXNoZWQgQ29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHNlYXJjaFF1ZXJ5Ci0JICogICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBzZWFyY2ggcXVlcnkKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIDxjb2RlPkNvbmZpZ3VyYXRpb25IaXRFbnRyeTwvY29kZT4gb2JqZWN0cwotCSAqIEB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uSGl0RW50cnlbXSBzZWFyY2hDb25maWd1cmF0aW9uKFN0cmluZyBwYXRoLAotCQkJQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5IHNlYXJjaFF1ZXJ5KSB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiB7Ci0JCUNvbmZpZ3VyYXRpb25TZWFyY2hTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQ29uZmlndXJhdGlvblNlYXJjaFNlcnZpY2UoCi0JCQkJcGF0aCk7Ci0JCXNlcnZpY2UuaW5kZXgoKTsKLQkJcmV0dXJuIHNlcnZpY2Uuc2VhcmNoKHNlYXJjaFF1ZXJ5KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjcmVhdGVJbmRleChTdHJpbmcgcHVibGlzaERpcikgdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24gewotCQlJbmRleEJ1aWxkZXIgc2VydmljZSA9IG5ldyBJbmRleEJ1aWxkZXIocHVibGlzaERpcik7Ci0JCXJldHVybiBzZXJ2aWNlLmNyZWF0ZUluZGV4KHRydWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNyZWF0ZUluZGV4KFN0cmluZyBwdWJsaXNoRGlyLCBib29sZWFuIGphckl0KQotCQkJdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24gewotCQlJbmRleEJ1aWxkZXIgc2VydmljZSA9IG5ldyBJbmRleEJ1aWxkZXIocHVibGlzaERpcik7Ci0JCXJldHVybiBzZXJ2aWNlLmNyZWF0ZUluZGV4KGphckl0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVXQVIoU3RyaW5nIHB1Ymxpc2hEaXIsIFN0cmluZyB3ZWJBcHBOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIHdhckZpbGUgPSBudWxsOwotCQkJaWYgKHdlYkFwcE5hbWUuZW5kc1dpdGgoIi53YXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJd2FyRmlsZSA9IG5ldyBGaWxlKHB1Ymxpc2hEaXIsIHdlYkFwcE5hbWUpOwotCQkJfSBlbHNlIHsKLQkJCQl3YXJGaWxlID0gbmV3IEZpbGUocHVibGlzaERpciwgd2ViQXBwTmFtZSArICIud2FyIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCVdhclV0aWwuYnVpbGRXYXJGaWxlKHdhckZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHB1Ymxpc2hEaXIsIG51bGwpOwotCQkJRmlsZSBsb2dzRGlyID0gbmV3IEZpbGUocHVibGlzaERpciwgImxvZ3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJRmlsZSBjc3NEaXIgPSBuZXcgRmlsZShwdWJsaXNoRGlyLCAiY3NzIik7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGUgc2NyaXB0c0RpciA9IG5ldyBGaWxlKHB1Ymxpc2hEaXIsICJzY3JpcHRzIik7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGUgaW1hZ2VzRGlyID0gbmV3IEZpbGUocHVibGlzaERpciwgImltYWdlcyIpOyAvLyROT04tTkxTLTEkCi0JCQlMaXN0PEZpbGU+IGZpbGVzTm90VG9EZWxldGUgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0JCQlmaWxlc05vdFRvRGVsZXRlLmFkZChsb2dzRGlyKTsKLQkJCWZpbGVzTm90VG9EZWxldGUuYWRkKGNzc0Rpcik7Ci0JCQlmaWxlc05vdFRvRGVsZXRlLmFkZChzY3JpcHRzRGlyKTsKLQkJCWZpbGVzTm90VG9EZWxldGUuYWRkKGltYWdlc0Rpcik7Ci0JCQlmaWxlc05vdFRvRGVsZXRlLmFkZCh3YXJGaWxlKTsKLQkJCUZpbGVVdGlsLmRlbGV0ZUFsbEZpbGVzKHB1Ymxpc2hEaXIsIGZpbGVzTm90VG9EZWxldGUpOwotCQkJZmlsZXNOb3RUb0RlbGV0ZS5jbGVhcigpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoU2VydmljZUV4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hTZXJ2aWNlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNWEyYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hTZXJ2aWNlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoOwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIFNlYXJjaCBTZXJ2aWNlIG9wZXJhdGlvbiBoYXMgZmFpbGVkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTkwNjMzMDIxODA4NjkxNTczMTZMOwotCi0JLyoqCi0JICogVGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgVGhyb3dhYmxlIHJvb3RDYXVzZTsKLQotCS8qKgotCSAqIFRoZSBlcnJvciBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXJyb3JNc2c7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQl0aGlzKHJvb3RDYXVzZSwgcm9vdENhdXNlLmdldE1lc3NhZ2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXRoaXMobnVsbCwgZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbiBhbmQgdGhlCi0JICogZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UsIFN0cmluZyBlcnJvck1zZykgewotCQlzdXBlcigpOwotCQl0aGlzLnJvb3RDYXVzZSA9IHJvb3RDYXVzZTsKLQkJdGhpcy5lcnJvck1zZyA9IGVycm9yTXNnOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgVGhyb3dhYmxlIGdldFJvb3RDYXVzZSgpIHsKLQkJcmV0dXJuIHJvb3RDYXVzZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1N0b3BXb3Jkcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAzMzUyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1N0b3BXb3Jkcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFNlYXJjaCBTdG9wIFdvcmRzCi1TZWFyY2guc3RvcFdvcmRzPVwKLWEsIGFib3V0LCBhbiwgYW5kLCBhcmUsIGFzLCBhdCwgYmUsIGJ1dCwgYnksIGZvciwgZnJvbSwgaG93LCBcCi1pLCBpZiwgaW4sIGludG8sIGlzLCBpdCwgbm8sIG5vdCwgb2YsIG9uLCBvciwgcywgc3VjaCwgXAotdCwgdGhhdCwgdGhlLCB0aGVpciwgdGhlbiwgdGhlcmUsIHRoZXNlLCB0aGV5LCB0aGlzLCB0bywgXAotd2FzLCB3aGF0LCB3aGVuLCB3aGVyZSwgd2hvLCB3aWxsLCB3aXRoCi0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9UZXh0QW5hbHl6ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvVGV4dEFuYWx5emVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlODAzZTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9UZXh0QW5hbHl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guYW5hbHlzaXM7Ci0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLkFuYWx5emVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuU3RyZWFtOwotCi0vKioKLSAqIEEgdGV4dCBhbmFseXplciB0aGF0IGhhbmRsZXMgVW5pY29kZSA0LjEgY2hhcmFjdGVycy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0QW5hbHl6ZXIgZXh0ZW5kcyBBbmFseXplciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUZXh0QW5hbHl6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5BbmFseXplciN0b2tlblN0cmVhbShTdHJpbmcsIFJlYWRlcikKLQkgKi8KLQlwdWJsaWMgZmluYWwgVG9rZW5TdHJlYW0gdG9rZW5TdHJlYW0oU3RyaW5nIGZpZWxkTmFtZSwgUmVhZGVyIHJlYWRlcikgewotCQlUb2tlblN0cmVhbSByZXN1bHQgPSBuZXcgVGV4dFRva2VuaXplcihyZWFkZXIpOwotCQlyZXR1cm4gbmV3IFRleHRGaWx0ZXIocmVzdWx0KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1RleHRGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvVGV4dEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTlkZGRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvVGV4dEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5hbmFseXNpczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5TdG9wQW5hbHl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuU3RvcEZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlbkZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlblN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci0KLS8qKgotICogQSB0ZXh0IGZpbHRlciB0aGF0IGhhbmRsZXMgVW5pY29kZSA0LjEgY2hhcmFjdGVycy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUZXh0RmlsdGVyIGV4dGVuZHMgVG9rZW5GaWx0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU2V0IHN0b3BXb3JkcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUZXh0RmlsdGVyKFRva2VuU3RyZWFtIGluKSB7Ci0JCXN1cGVyKGluKTsKLQkJaWYgKHN0b3BXb3JkcyA9PSBudWxsKSB7Ci0JCQlsb2FkU3RvcFdvcmRzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuU3RyZWFtI25leHQoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBUb2tlbiBuZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZm9yIChUb2tlbiB0b2tlbiA9IGlucHV0Lm5leHQoKTsgdG9rZW4gIT0gbnVsbDsgdG9rZW4gPSBpbnB1dC5uZXh0KCkpIHsKLQkJCVN0cmluZyB0b2tlblRleHQgPSB0b2tlbi50ZXJtVGV4dCgpOwotCQkJaWYgKCFzdG9wV29yZHMuY29udGFpbnModG9rZW5UZXh0KSkgewotCQkJCXJldHVybiB0b2tlbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgc3RvcCB3b3JkcyBkZWZpbmVkIGluIHRoZSBTdG9wV29yZHMucHJvcGVydGllcyBmaWxlLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkU3RvcFdvcmRzKCkgewotCQlTdHJpbmdbXSB3b3JkcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoVGV4dEZpbHRlci5jbGFzcwotCQkJCQkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKQotCQkJCQkrICIuU3RvcFdvcmRzIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQlTdHJpbmcgcHJvcGVydHkgPSBidW5kbGUuZ2V0U3RyaW5nKCJTZWFyY2guc3RvcFdvcmRzIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdvcmRzID0gU3RyVXRpbC5zcGxpdChwcm9wZXJ0eSwgIiAsIik7IC8vJE5PTi1OTFMtMSQJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJd29yZHMgPSBTdG9wQW5hbHl6ZXIuRU5HTElTSF9TVE9QX1dPUkRTOwotCQl9Ci0JCXN0b3BXb3JkcyA9IFN0b3BGaWx0ZXIubWFrZVN0b3BTZXQod29yZHMpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvVGV4dFRva2VuaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9UZXh0VG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZjMzNWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9UZXh0VG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmFuYWx5c2lzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuaXplcjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQnJlYWtJdGVyYXRvcjsKLQotLyoqCi0gKiBBIHRleHQgdG9rZW5pemVyIHRoYXQgdXNlcyBJQ1U0SiB0byBzZWdtZW50IHRleHQgaW50byB3b3Jkcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUZXh0VG9rZW5pemVyIGV4dGVuZHMgVG9rZW5pemVyIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBCVUZGRVJfU0laRSA9IDQwOTY7Ci0KLQlwcml2YXRlIFN0cmluZyB0ZXh0OwotCi0JcHJpdmF0ZSBCcmVha0l0ZXJhdG9yIGl0ZXJhdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVhZGVyCi0JICogICAgICAgICAgICB0aGUgdGV4dCBzb3VyY2UKLQkgKi8KLQlwdWJsaWMgVGV4dFRva2VuaXplcihSZWFkZXIgcmVhZGVyKSB7Ci0JCXN1cGVyKHJlYWRlcik7Ci0JCVN0cmluZ0J1ZmZlciB0ZXh0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihCVUZGRVJfU0laRSk7Ci0JCWNoYXJbXSBidWZmZXIgPSBuZXcgY2hhcltCVUZGRVJfU0laRV07Ci0JCWludCBjaGFyc1JlYWQ7Ci0JCXRyeSB7Ci0JCQl3aGlsZSAoKGNoYXJzUmVhZCA9IHJlYWRlci5yZWFkKGJ1ZmZlciwgMCwgQlVGRkVSX1NJWkUpKSA+IDApIHsKLQkJCQl0ZXh0QnVmZmVyLmFwcGVuZChidWZmZXIsIDAsIGNoYXJzUmVhZCk7Ci0JCQl9Ci0JCQl0ZXh0ID0gdGV4dEJ1ZmZlci50b1N0cmluZygpOwotCQkJaXRlcmF0b3IgPSBCcmVha0l0ZXJhdG9yLmdldFdvcmRJbnN0YW5jZSgpOwotCQkJaXRlcmF0b3Iuc2V0VGV4dCh0ZXh0KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJaXRlcmF0b3IgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlblN0cmVhbSNuZXh0KCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgVG9rZW4gbmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpdGVyYXRvciAhPSBudWxsKSB7Ci0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCWludCBzdGFydCA9IGl0ZXJhdG9yLmN1cnJlbnQoKTsKLQkJCQlpbnQgZW5kID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChlbmQgIT0gQnJlYWtJdGVyYXRvci5ET05FKSB7Ci0JCQkJCVN0cmluZyB0b2tlblRleHQgPSB0ZXh0LnN1YnN0cmluZyhzdGFydCwgZW5kKS50b0xvd2VyQ2FzZSgpOwotCQkJCQlpZiAoIXRva2VuVGV4dC5lcXVhbHMoIiAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAodG9rZW5UZXh0LmVuZHNXaXRoKCIncyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl0b2tlblRleHQgPSB0b2tlblRleHQuc3Vic3RyaW5nKDAsIHRva2VuVGV4dAotCQkJCQkJCQkJLmxlbmd0aCgpIC0gMik7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gbmV3IFRva2VuKHRva2VuVGV4dCwgMCwgdG9rZW5UZXh0Lmxlbmd0aCgpKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGY0MmY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIHRleHQgYW5hbHlzZXIsIHRva2VuaXplciBhbmQgZmlsdGVyIGZvciBpbmRleGluZyBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uSGl0RW50cnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uSGl0RW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc0ODE1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkhpdEVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5jb25maWd1cmF0aW9uOwotCi0vKioKLSAqIEEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gc2VhcmNoIGhpdCBlbnRyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uSGl0RW50cnkgewotCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLQotCXByaXZhdGUgU3RyaW5nIGJyaWVmRGVzYzsKLQotCXByaXZhdGUgU3RyaW5nIHVybDsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElELgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIElELgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgdGhlIGlkIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0eXBlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJyZWlmIGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJyaWVmIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCcmllZkRlc2MoKSB7Ci0JCXJldHVybiBicmllZkRlc2M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYnJpZWYgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHBhcmFtIGJyaWVmRGVzYwotCSAqICAgICAgICAgICAgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJyaWVmRGVzYyhTdHJpbmcgYnJpZWZEZXNjKSB7Ci0JCXRoaXMuYnJpZWZEZXNjID0gYnJpZWZEZXNjOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFVSTC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBVUkwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBVUkwuCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgdGhlIFVSTCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcmwoU3RyaW5nIHVybCkgewotCQl0aGlzLnVybCA9IHVybDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZmY0ZDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25TZWFyY2hRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLS8qKgotICogVGhlIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIHNlYXJjaCBxdWVyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uU2VhcmNoUXVlcnkgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENBVEVHT1JZX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDQVRFR09SWV9CUklFRl9ERVNDID0gImJyaWVmRGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FURUdPUllfRlVMTF9ERVNDID0gImZ1bGxEZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDQVRFR09SWV9UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEhhc2h0YWJsZSBxdWVyeTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25TZWFyY2hRdWVyeSgpIHsKLQkJcXVlcnkgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCXF1ZXJ5LmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VhcmNoIHF1ZXJ5IHN0cmluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZWFyY2ggcXVlcnkgc3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWVyeVN0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlFbnVtZXJhdGlvbiBrZXlzID0gcXVlcnkua2V5cygpOwotCi0JCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0RWxlbWVudCgpOwotCQkJc2IuYXBwZW5kKGtleSArICI6KCIgKyBxdWVyeS5nZXQoa2V5KSArICIpICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWlmIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJc2IuYXBwZW5kKCJBTkQgIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUZXJtKFN0cmluZyB0ZXJtLCBTdHJpbmcgY3JpdCkgewotCQlxdWVyeS5wdXQoY3JpdCwgdGVybSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQlzZXRUZXJtKHR5cGUsIENBVEVHT1JZX1RZUEUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc2V0VGVybShuYW1lLCBDQVRFR09SWV9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCcmllZkRlc2MoU3RyaW5nIGRlc2MpIHsKLQkJc2V0VGVybShkZXNjLCBDQVRFR09SWV9CUklFRl9ERVNDKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGdWxsRGVzYyhTdHJpbmcgZGVzYykgewotCQlzZXRUZXJtKGRlc2MsIENBVEVHT1JZX0ZVTExfREVTQyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL2ludGVybmFsL0NvbmZpZ3VyYXRpb25TZWFyY2hTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vaW50ZXJuYWwvQ29uZmlndXJhdGlvblNlYXJjaFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkMTFmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vaW50ZXJuYWwvQ29uZmlndXJhdGlvblNlYXJjaFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmNvbmZpZ3VyYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5EYXRlRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguSW5kZXhXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUucXVlcnlQYXJzZXIuUXVlcnlQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkhpdHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkluZGV4U2VhcmNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlF1ZXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5TZWFyY2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLmh0bWwuSFRNTFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLkdlbmVyYXRlU2VhcmNoSW5kZXhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5TZWFyY2hDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guU2VhcmNoUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guU2VhcmNoU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmFuYWx5c2lzLlRleHRBbmFseXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhpdEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uU2VhcmNoUXVlcnk7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHNlYXJjaGluZyBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25TZWFyY2hTZXJ2aWNlIHsKLQotCS8qKgotCSAqIERvY3VtZW50IGZpZWxkcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUklFRl9ERVNDUklQVElPTl9GSUVMRCA9ICJicmllZkRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9GSUVMRCA9ICJjb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRklFTEQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RJRklFRF9GSUVMRCA9ICJtb2RpZmllZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRklFTEQgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfRklFTEQgPSAicm9sZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVTU1BUllfRklFTEQgPSAic3VtbWFyeSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRklFTEQgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9GSUVMRCA9ICJ1cmwiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgSFRNTCBwYXJzZXIuCi0JcHJpdmF0ZSBIVE1MUGFyc2VyIHBhcnNlcjsKLQotCS8vIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZG9jdW1lbnRzIHRvIGJlIGluZGV4ZWQuCi0JcHJpdmF0ZSBTdHJpbmcgZG9jRGlyID0gbnVsbDsKLQotCS8vIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGluZGV4IGZpbGVzIHdpbGwgYmUgZ2VuZXJhdGVkLgotCXByaXZhdGUgU3RyaW5nIGluZGV4RGlyID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGRvY0RpcgotCSAqICAgICAgICAgICAgdGhlIGFic29sdXRlIHBhdGggdG8gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uU2VhcmNoU2VydmljZShTdHJpbmcgZG9jRGlyKSB7Ci0JCVN0cmluZyB1c2VySG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGhhc2hDb2RlID0gTWF0aC5hYnMoZG9jRGlyLmhhc2hDb2RlKCkpOwotCQlTdHJpbmcgaW5kZXhQYXRoID0gdXNlckhvbWUgKyBGaWxlLnNlcGFyYXRvcgotCQkJCSsgInJ1cCIgKyBGaWxlLnNlcGFyYXRvciArIGhhc2hDb2RlICsgRmlsZS5zZXBhcmF0b3IgKyAiaW5kZXgiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2V0RGlycyhkb2NEaXIsIGluZGV4UGF0aCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jRGlyCi0JICogICAgICAgICAgICB0aGUgYWJzb2x1dGUgcGF0aCB0byBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGluZGV4RGlyCi0JICogICAgICAgICAgICB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgaW5kZXhlcwotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uU2VhcmNoU2VydmljZShTdHJpbmcgZG9jRGlyLCBTdHJpbmcgaW5kZXhEaXIpIHsKLQkJc2V0RGlycyhkb2NEaXIsIGluZGV4RGlyKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBjb25maWd1cmF0aW9uIGFuZCBpbmRleCBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGRvY0RpcgotCSAqICAgICAgICAgICAgdGhlIGFic29sdXRlIHBhdGggdG8gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBpbmRleERpcgotCSAqICAgICAgICAgICAgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGluZGV4ZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXJzKFN0cmluZyBkb2NEaXIsIFN0cmluZyBpbmRleERpcikgewotCQl0aGlzLmRvY0RpciA9IGRvY0RpcjsKLQkJdGhpcy5pbmRleERpciA9IGluZGV4RGlyOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIGEgc2VhcmNoIGJhc2VkIG9uIHRoZSBnaXZlbiBzZWFyY2ggcXVlcnkuCi0JICogCi0JICogQHBhcmFtIHF1ZXJ5Ci0JICogICAgICAgICAgICB0aGUgc2VhcmNoIHF1ZXJ5IHN0cmluZwotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgPGNvZGU+Q29uZmlndXJhdGlvbkhpdEVudHJ5PC9jb2RlPiBvYmplY3RzCi0JICogQHRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25IaXRFbnRyeVtdIHNlYXJjaChDb25maWd1cmF0aW9uU2VhcmNoUXVlcnkgcXVlcnkpCi0JCQl0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzZWFyY2gocXVlcnkuZ2V0UXVlcnlTdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgYSBzZWFyY2ggb24gdGhlIGdpdmVuIHF1ZXJ5IHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcXN0cgotCSAqICAgICAgICAgICAgYSBMdWNlbmUgY29tcGF0aWJsZSBxdWVyeSBzdHJpbmcKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIDxjb2RlPkNvbmZpZ3VyYXRpb25IaXRFbnRyeTwvY29kZT4gb2JqZWN0cwotCSAqIEB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uSGl0RW50cnlbXSBzZWFyY2goU3RyaW5nIHFzdHIpCi0JCQl0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiB7Ci0JCVNlYXJjaGVyIHNlYXJjaGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNlYXJjaGVyID0gbmV3IEluZGV4U2VhcmNoZXIoaW5kZXhEaXIpOwotCQkJUXVlcnkgcXVlcnkgPSBRdWVyeVBhcnNlci5wYXJzZShxc3RyLCBDT05URU5UX0ZJRUxELAotCQkJCQluZXcgVGV4dEFuYWx5emVyKCkpOwotCi0JCQlIaXRzIGxoaXRzID0gc2VhcmNoZXIuc2VhcmNoKHF1ZXJ5KTsKLQkJCUNvbmZpZ3VyYXRpb25IaXRFbnRyeVtdIGhpdHMgPSBuZXcgQ29uZmlndXJhdGlvbkhpdEVudHJ5W2xoaXRzCi0JCQkJCS5sZW5ndGgoKV07Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaGl0cy5sZW5ndGg7IGkrKykgewotCQkJCURvY3VtZW50IGRvYyA9IGxoaXRzLmRvYyhpKTsKLQkJCQloaXRzW2ldID0gbmV3IENvbmZpZ3VyYXRpb25IaXRFbnRyeSgpOwotCQkJCWhpdHNbaV0uc2V0TmFtZShkb2MuZ2V0KE5BTUVfRklFTEQpKTsKLQkJCQloaXRzW2ldLnNldFVybChkb2MuZ2V0KFVSTF9GSUVMRCkpOwotCQkJCWhpdHNbaV0uc2V0QnJpZWZEZXNjKGRvYy5nZXQoQlJJRUZfREVTQ1JJUFRJT05fRklFTEQpKTsKLQkJCQloaXRzW2ldLnNldElkKGRvYy5nZXQoSURfRklFTEQpKTsKLQkJCQloaXRzW2ldLnNldFR5cGUoZG9jLmdldChUWVBFX0ZJRUxEKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gaGl0czsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBTZWFyY2hDb25maWd1cmF0aW9uRXhjZXB0aW9uKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHNlYXJjaGVyICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlzZWFyY2hlci5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgb2YgdGhlIGluZGV4IGRhdGFiYXNlIGFscmVhZHkgZXhpc3RzLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGluZGV4IGRhdGFiYXNlIGFscmVhZHkgZXhpc3RzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW5kZXhFeGlzdHMoKSB7Ci0JCUZpbGVbXSBmaWxlcyA9IG5ldyBGaWxlKGluZGV4RGlyKS5saXN0RmlsZXMoKTsKLQkJcmV0dXJuIChmaWxlcyAhPSBudWxsICYmIGZpbGVzLmxlbmd0aCAhPSAwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBzZWFyY2ggaW5kZXguCi0JICogCi0JICogQHRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgaW5kZXgoKSB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiB7Ci0JCWluZGV4KG51bGwsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBzZWFyY2ggaW5kZXguCi0JICogCi0JICogQHBhcmFtIHJlaW5kZXgKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwZXJmb3JtcyBhIHJlaW5kZXgKLQkgKiBAdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbmRleChib29sZWFuIHJlaW5kZXgpIHRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaW5kZXgobnVsbCwgcmVpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgaW5kZXggZGF0YWJhc2UuCi0JICogCi0JICogQHBhcmFtIHBtCi0JICogICAgICAgICAgICBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcGFyYW0gcmVpbmRleAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHBlcmZvcm1zIGEgcmVpbmRleAotCSAqIEB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGluZGV4KElQcm9ncmVzc01vbml0b3IgcG0sIGJvb2xlYW4gcmVpbmRleCkKLQkJCXRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkIChDb25maWd1cmF0aW9uU2VhcmNoU2VydmljZS5jbGFzcykgewotCQkJaWYgKGluZGV4RGlyID09IG51bGwgfHwgZG9jRGlyID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnZhbGlkIGluZGV4RGlyIG9yIGRvY0RpciIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmICghcmVpbmRleCAmJiBpbmRleEV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAocG0gIT0gbnVsbCkgewotCQkJCXBtLmJlZ2luVGFzayhTZWFyY2hSZXNvdXJjZXMuaW5kZXhDb25maWdGaWxlc1Rhc2tfbmFtZSwKLQkJCQkJCWdldFRvdGFsRG9jc1RvSW5kZXgoZG9jRGlyKSk7IAotCQkJfQotCi0JCQl0cnkgewotCQkJCWRlbGV0ZUFsbEluZGV4RGlycygpOwotCQkJCW5ldyBGaWxlKGluZGV4RGlyKS5ta2RpcnMoKTsKLQkJCQlJbmRleFdyaXRlciB3cml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoaW5kZXhEaXIsCi0JCQkJCQluZXcgVGV4dEFuYWx5emVyKCksIHRydWUpOwotCQkJCXdyaXRlci5tYXhGaWVsZExlbmd0aCA9IDEwMDAwMDA7Ci0JCQkJcGFyc2VyID0gbmV3IEhUTUxQYXJzZXIoKTsKLQkJCQlpbmRleERvY3MobmV3IEZpbGUoZG9jRGlyKSwgd3JpdGVyLCBwbSk7Ci0JCQkJd3JpdGVyLm9wdGltaXplKCk7Ci0JCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBHZW5lcmF0ZVNlYXJjaEluZGV4RXhjZXB0aW9uKGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAocG0gIT0gbnVsbCkgewotCQkJCQlwbS5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlcyBhbGwgZXhpc3RpbmcgaW5kZXggZGF0YWJhc2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZUFsbEluZGV4RGlycygpIHsKLQkJRmlsZSBwYXJlbnQgPSBuZXcgRmlsZShpbmRleERpcikuZ2V0UGFyZW50RmlsZSgpOwotCQlGaWxlW10gZmlsZXMgPSBwYXJlbnQubGlzdEZpbGVzKCk7Ci0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZpbGVzW2ldLmdldE5hbWUoKS5zdGFydHNXaXRoKCJpbmRleCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJRmlsZVtdIGZpbGUgPSBmaWxlc1tpXS5saXN0RmlsZXMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmaWxlLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlmaWxlW2pdLmRlbGV0ZSgpOwotCQkJCQl9Ci0JCQkJCWZpbGVzW2ldLmRlbGV0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBmaWxlcyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNlYXJjaCBpbmRleC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICB0aGUgZGlyZWN0b3J5IG5hbWUKLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZmlsZXMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBzZWFyY2ggaW5kZXgsCi0JICogICAgICAgICBpbmNsdWRpbmcgYWxsIHN1Yi1kaXJlY3RvcmllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFRvdGFsRG9jc1RvSW5kZXgoU3RyaW5nIGRpcikgewotCQlpbnQgdG90YWwgPSAwOwotCQlGaWxlIGRpckZpbGUgPSBuZXcgRmlsZShkaXIpOwotCQlGaWxlIGZpbGVzW10gPSBkaXJGaWxlLmxpc3RGaWxlcygpOwotCQlpZiAoZmlsZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRvdGFsOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpc1hNSURvYyhmaWxlc1tpXSkpIHsKLQkJCQl0b3RhbCsrOwotCQkJfSBlbHNlIGlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJdG90YWwgKz0gZ2V0VG90YWxEb2NzVG9JbmRleChmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRvdGFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBuZWVkcyB0byBiZSBpbmRleGVkLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICB0aGUgZmlsZSB0byBiZSB2ZXJpZmllZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbGUgbmVlZHMgdG8gYmUgaW5kZXhlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNYTUlEb2MoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBmaWxlLmdldFBhdGgoKS5lbmRzV2l0aCgiLnhtaSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIG5lZWRzIHRvIGJlIGluZGV4ZWQuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIGJlIHZlcmlmaWVkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmlsZSBuZWVkcyB0byBiZSBpbmRleGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0h0bWxPclRleHREb2MoRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBwYXRoID0gZmlsZS5nZXRQYXRoKCk7Ci0JCXJldHVybiBwYXRoLmVuZHNXaXRoKCIuaHRtbCIpIHx8IHBhdGguZW5kc1dpdGgoIi5odG0iKSB8fCBwYXRoLmVuZHNXaXRoKCIudHh0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCi0JLyoqCi0JICogQSByZWN1cnNpdmUgZnVuY3Rpb24gdG8gaW5kZXggZmlsZXMuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIGEgZGlyZWN0b3J5IG9yIGZpbGUgdG8gYmUgaW5kZXhlZAotCSAqIEBwYXJhbSB3cml0ZXIKLQkgKiAgICAgICAgICAgIHRoZSBpbmRleCB3cml0ZXIKLQkgKiBAcGFyYW0gcG0KLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluZGV4RG9jcyhGaWxlIGZpbGUsIEluZGV4V3JpdGVyIHdyaXRlciwgSVByb2dyZXNzTW9uaXRvciBwbSkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiYXBwbGV0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZ1tdIGZpbGVzID0gZmlsZS5saXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaW5kZXhEb2NzKG5ldyBGaWxlKGZpbGUsIGZpbGVzW2ldKSwgd3JpdGVyLCBwbSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaXNIdG1sT3JUZXh0RG9jKGZpbGUpKSB7Ci0JCQlpZiAocG0gIT0gbnVsbCkgewotCQkJCXBtLnN1YlRhc2soZmlsZS5nZXROYW1lKCkpOwotCQkJCXBtLndvcmtlZCgxKTsKLQkJCX0KLQkJCWlmIChzaG91bGRCZUV4Y2x1ZGVkKGZpbGUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJRG9jdW1lbnQgZG9jID0gZ2V0SFRNTERvY3VtZW50KGZpbGUpOwotCQkJd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxvY2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmaWxlIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIGluZGV4aW5nLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBhIGZpbGUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmaWxlIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIGluZGV4aW5nCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkQmVFeGNsdWRlZChGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIHAgPSBmaWxlLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJcmV0dXJuIGRvY0Rpci5zdGFydHNXaXRoKHApOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRvY3VtZW50IG9iamVjdCBvZiBhIEhUTUwgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgdGhlIEhUTUwgZmlsZSB0byBiZSBpbmRleGVkCi0JICogQHJldHVybiBhIGRvY3VtZW50IG9iamVjdAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHBhcnNpbmcgdGhlIEhUTUwgZmlsZQotCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgb3BlcmF0aW9uIGlzIGludGVycnVwdGVkIGJ5IGEgdXNlcgotCSAqLwotCXB1YmxpYyBEb2N1bWVudCBnZXRIVE1MRG9jdW1lbnQoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sCi0JCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCURvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwotCQlkb2MuYWRkKEZpZWxkLlVuSW5kZXhlZChVUkxfRklFTEQsIGZpbGUuZ2V0UGF0aCgpLnJlcGxhY2UoCi0JCQkJRmlsZS5wYXRoU2VwYXJhdG9yQ2hhciwgJy8nKSkpOwotCQlkb2MuYWRkKEZpZWxkLktleXdvcmQoTU9ESUZJRURfRklFTEQsIERhdGVGaWVsZC50aW1lVG9TdHJpbmcoZmlsZQotCQkJCS5sYXN0TW9kaWZpZWQoKSkpKTsKLQotCQl0cnkgewotCQkJcGFyc2VyLnBhcnNlKGZpbGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJZG9jLmFkZChGaWVsZC5UZXh0KENPTlRFTlRfRklFTEQsIHBhcnNlci5nZXRUZXh0KCkpKTsKLQkJZG9jLmFkZChGaWVsZC5VbkluZGV4ZWQoU1VNTUFSWV9GSUVMRCwgcGFyc2VyLmdldFN1bW1hcnkoKSkpOwotCi0JCVByb3BlcnRpZXMgbWV0YVRhZ3MgPSBwYXJzZXIuZ2V0TWV0YVRhZ3MoKTsKLQkJZm9yIChFbnVtZXJhdGlvbiBlID0gbWV0YVRhZ3MucHJvcGVydHlOYW1lcygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJU3RyaW5nIHRhZ05hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0JCQlkb2MuYWRkKEZpZWxkLlRleHQodGFnTmFtZSwgbWV0YVRhZ3MuZ2V0UHJvcGVydHkodGFnTmFtZSkpKTsKLQkJfQotCi0JCWlmIChkb2MuZ2V0RmllbGQoUk9MRV9GSUVMRCkgPT0gbnVsbCkgewotCQkJZG9jLmFkZChGaWVsZC5UZXh0KFJPTEVfRklFTEQsICJOT1JVUFJPTEUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBkb2M7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL2ludGVybmFsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMDdhYzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL2ludGVybmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3Igc2VhcmNoaW5nIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkN2M0YjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIHNlYXJjaGluZyBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZmNhOTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgdGhlIHNlYXJjaCBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdXRpbHMvSmFyQ3JlYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91dGlscy9KYXJDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMTU3ZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91dGlscy9KYXJDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIEphckNyZWF0b3IgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVhfSkFSID0gImluZGV4LmphciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJamFyRm9sZGVyKGFyZ3NbMF0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBqYXJGb2xkZXIoU3RyaW5nIGZvbGRlcm5hbWUpIHsKLQkJdHJ5IHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYXR0ZW1wdGluZyB0byBqYXIgc3R1ZmYiKTsgLy8kTk9OLU5MUy0xJAotCQkJRmlsZSBqYXJEaXIgPSBuZXcgRmlsZShmb2xkZXJuYW1lKTsKLQkJCUZpbGUgamFyRmlsZSA9IG5ldyBGaWxlKGZvbGRlcm5hbWUgKyBGaWxlLnNlcGFyYXRvciArIElOREVYX0pBUik7Ci0KLQkJCWphckZpbGVzKGphckRpciwgamFyRmlsZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gaW4gdGhlIGphciB0aGluZ3kiKTsgLy8kTk9OLU5MUy0xJAotCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBtZXRob2QgdG8gamFyIHRoZSBzcGVjaWZpZWQgZGlyIGludG8gYSBqYXIgZmlsZS4gbm9uLXN1Yi1mb2xkZXJzIHdpbGwgYmUKLQkgKiBqYXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gamFyRGlyCi0JICogQHBhcmFtIGphckZpbGUKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGphckZpbGVzKEZpbGUgamFyRGlyLCBGaWxlIGphckZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVbXSBmaWxlcyA9IGphckRpci5saXN0RmlsZXMoKTsKLQkJaWYgKGphckZpbGUuZXhpc3RzKCkpIHsKLQkJCWphckZpbGUuZGVsZXRlKCk7Ci0JCX0KLQkJQnVmZmVyZWRPdXRwdXRTdHJlYW0gYlN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgKLQkJCQlqYXJGaWxlKSk7Ci0JCVppcE91dHB1dFN0cmVhbSB6aXBwZXJTdHJlYW0gPSBuZXcgWmlwT3V0cHV0U3RyZWFtKGJTdHJlYW0pOwotCi0JCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzQwOTZdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGN1cnJlbnRGaWxlID0gZmlsZXNbaV07Ci0JCQlpZiAoY3VycmVudEZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJWmlwRW50cnkgY3VyckVudHJ5ID0gbmV3IFppcEVudHJ5KGN1cnJlbnRGaWxlLmdldE5hbWUoKSk7Ci0JCQl6aXBwZXJTdHJlYW0ucHV0TmV4dEVudHJ5KGN1cnJFbnRyeSk7Ci0JCQlCdWZmZXJlZElucHV0U3RyZWFtIGJpU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbSgKLQkJCQkJY3VycmVudEZpbGUpKTsKLQkJCXdoaWxlIChiaVN0cmVhbS5hdmFpbGFibGUoKSA+IDApIHsKLQkJCQlpbnQgbnVtID0gYmlTdHJlYW0ucmVhZChieXRlcyk7Ci0JCQkJemlwcGVyU3RyZWFtLndyaXRlKGJ5dGVzLCAwLCBudW0pOwotCQkJfQotCQkJYmlTdHJlYW0uY2xvc2UoKTsKLQkJCXppcHBlclN0cmVhbS5jbG9zZUVudHJ5KCk7Ci0JCX0KLQkJemlwcGVyU3RyZWFtLmNsb3NlKCk7Ci0JCWJTdHJlYW0uY2xvc2UoKTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91dGlscy9MSFRNTFBhcnNlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91dGlscy9MSFRNTFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjY5YjE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdXRpbHMvTEhUTUxQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL0NvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy9hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vL0NvbnRyaWJ1dG9yczoKLS8vSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLS8qKgotICogQSBIVE1MIHBhcnNlciB1c2VkIGZvciBleHRyYWN0aW5nIHRoZSBtZXRhIHRhZ3MgYW5kIHRleHQgZnJvbSBhIEhUTUwKLSAqIGRvY3VtZW50LgotICogCi0gKiBUT0RPOiBJbXBsZW1lbnQgb3VyIG93biBIVE1MIHBhcnNlci4KLSAqLwotcHVibGljIGNsYXNzIExIVE1MUGFyc2VyIGV4dGVuZHMgb3JnLmFwYWNoZS5sdWNlbmUuZGVtby5odG1sLkhUTUxQYXJzZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTEhUTUxQYXJzZXIoRmlsZSBmaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJc3VwZXIoZmlsZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTEhUTUxQYXJzZXIoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJc3VwZXIoc3RyZWFtKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMSFRNTFBhcnNlcihSZWFkZXIgc3RyZWFtKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJc3VwZXIoc3RyZWFtKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBIVE1MIG1ldGEgdGFncy4KLQkgKi8KLQlwdWJsaWMgUHJvcGVydGllcyBnZXRNZXRhVGFncygpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gc3VwZXIuZ2V0TWV0YVRhZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZWFkZXIgZm9yIHRoZSBIVE1MIGNvbnRlbnQuCi0JICovCi0JcHVibGljIFJlYWRlciBnZXRSZWFkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVhZGVyKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgSFRNTCB0aXRsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5nZXRUaXRsZSgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGEgc3VtbWFyeSBvZiB0aGUgSFRMIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3VtbWFyeSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gc3VwZXIuZ2V0U3VtbWFyeSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3V0aWxzL1VOQ1V0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdXRpbHMvVU5DVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjA1YzdmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdXRpbHMvVU5DVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL0NvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy9hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vL0NvbnRyaWJ1dG9yczoKLS8vSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLQotcHVibGljIGNsYXNzIFVOQ1V0aWwgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOQ19GSUxFX1BSRUZJWCA9ICJmaWxlOi8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxURVJOQVRFX1VOQ19GSUxFX1BSRUZJWCA9ICJmaWxlOi8vIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVFNDQVBFX1VOQ19GSUxFX1BSRUZJWCA9ICJmaWxlOi8vLyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkNfRklMRV9PTkxZID0gImZpbGU6IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOQ19TRVBBUkFUT1IgPSAiLyI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLyoqCi0JICogQWNjb3VudHMgZm9yIG5ldHNjYXBlIHVuYyBmaWxlIHByZWZpeC4gQ29udmVydHMgdG8gc3RhbmRhcmQgb25lLgotCSAqIElmIG5vdCBOZXRzY2FwZSwgbm90aGluZyBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGhhbmRsZU5ldHNjYXBlRmlsZVByZWZpeChTdHJpbmcgZmlsZW5hbWUpCi0JewotCQlTdHJpbmcgY29udmVydGVkTmFtZSA9IG51bGw7Ci0KLQkJaWYgKGZpbGVuYW1lLnN0YXJ0c1dpdGgoTkVUU0NBUEVfVU5DX0ZJTEVfUFJFRklYKSkKLQkJewotCQkJY29udmVydGVkTmFtZSA9Ci0JCQkJQUxURVJOQVRFX1VOQ19GSUxFX1BSRUZJWAotCQkJCQkrIGZpbGVuYW1lLnN1YnN0cmluZygKLQkJCQkJCU5FVFNDQVBFX1VOQ19GSUxFX1BSRUZJWC5sZW5ndGgoKSwKLQkJCQkJCWZpbGVuYW1lLmxlbmd0aCgpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWNvbnZlcnRlZE5hbWUgPSBmaWxlbmFtZTsKLQkJfQotCi0JCXJldHVybiAoY29udmVydGVkTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBVUkwgcGF0aHMgZm9yIE1vemlsbGEgKGFuZCBvdGhlciBicm93c2Vycykgb3ZlciBVTkMuCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkwgaGFuZGxlVVJMRm9yVU5DKFVSTCBvcmlnaW5hbFVybCkKLQl7Ci0JCS8vIGhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIE1vemlsbGEgb3ZlciBVTkMKLQkJVVJMIG5ld1VybCA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQlpZiAob3JpZ2luYWxVcmwudG9TdHJpbmcoKS5zdGFydHNXaXRoKCJmaWxlOi8vIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQkvLyBjaGFuZ2UgImZpbGU6Ly8iIHRvICJmaWxlOi8vLy8vIgotCQkJCVN0cmluZyBleHRyYWN0ZWRTdHJpbmcgPSBvcmlnaW5hbFVybC50b1N0cmluZygpLnN1YnN0cmluZyg1KTsKLQkJCQluZXdVcmwgPSBuZXcgVVJMKCJmaWxlIiwgIiIsICIvLy8iICsgZXh0cmFjdGVkU3RyaW5nKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQluZXdVcmwgPSBvcmlnaW5hbFVybDsKLQkJCX0KLQkJfQotCQljYXRjaCAoamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkKLQkJewotCQkJbmV3VXJsID0gb3JpZ2luYWxVcmw7Ci0JCX0KLQotCQlyZXR1cm4gKG5ld1VybCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgdGhlIFVOQyBmaWxlIHRvIGEgcmVndWxhciwgcGxhdGZvcm0tZGVwZW5kZW50IG9uZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0RmlsZW5hbWUoU3RyaW5nIGZpbGVuYW1lKQotCXsKLQkJU3RyaW5nIGNvbnZlcnRlZE5hbWUgPSBudWxsOwotCi0JCS8vIHJlbW92ZSBhbnkgVVJMIHByZWZpeGVzCi0JCVN0cmluZyB0ZW1wTmFtZSA9IG51bGw7Ci0JCWlmIChmaWxlbmFtZS5zdGFydHNXaXRoKFVOQ19GSUxFX1BSRUZJWCkpCi0JCXsKLQkJCXRlbXBOYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKFVOQ19GSUxFX1BSRUZJWC5sZW5ndGgoKSwgZmlsZW5hbWUubGVuZ3RoKCkpOwotCQkJaW50IGluZGV4ID0gdGVtcE5hbWUuaW5kZXhPZigiOiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW5kZXggPT0gLTEpCi0JCQl7Ci0JCQkJLy8gb24gVW5peCwgYWRkIHNlcGFyYXRvciBiYWNrIHRvIGZpcnN0IGNoYXJhY3RlcgotCQkJCXRlbXBOYW1lID0gVU5DX1NFUEFSQVRPUiArIHRlbXBOYW1lOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJdGVtcE5hbWUgPSBmaWxlbmFtZTsKLQkJfQotCi0JCS8vIGNvbnZlcnQgYW55IFVOQyBzZXBhcmF0b3JzIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBvbmUKLQkJY29udmVydGVkTmFtZSA9Ci0JCQl0ZW1wTmFtZS5yZXBsYWNlKFVOQ19TRVBBUkFUT1IuY2hhckF0KDApLCBGaWxlLnNlcGFyYXRvci5jaGFyQXQoMCkpOwotCi0JCXJldHVybiAoY29udmVydGVkTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgdGhlIGZpbGVuYW1lIHRvIGEgVU5DIGZpbGVuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRGaWxlbmFtZVRvVU5DKFN0cmluZyBmaWxlbmFtZSkKLQl7Ci0JCS8vIGNvbnZlcnQgYW55IFVOQyBzZXBhcmF0b3JzIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBvbmUKLQkJU3RyaW5nIGNvbnZlcnRlZE5hbWUgPQotCQkJZmlsZW5hbWUucmVwbGFjZShGaWxlLnNlcGFyYXRvci5jaGFyQXQoMCksIFVOQ19TRVBBUkFUT1IuY2hhckF0KDApKTsKLQkJU3RyaW5nIGZpbmFsTmFtZSA9IGNvbnZlcnRGaWxlU2VwYXJhdG9yKGNvbnZlcnRlZE5hbWUpOwotCQlyZXR1cm4gKGZpbmFsTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgdGhlIFVSTCB0byBvbmUgd2hpY2ggY2FuIHRoYXQgbWF0Y2hlcyBhIFVOQyBjb252ZW50aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1VOQyhTdHJpbmcgdXJsKQotCXsKLQkJU3RyaW5nIGNvbnZlcnRlZFVybCA9IG51bGw7Ci0JCWlmICh1cmwuc3RhcnRzV2l0aChBTFRFUk5BVEVfVU5DX0ZJTEVfUFJFRklYKSkKLQkJewotCQkJY29udmVydGVkVXJsID0KLQkJCQlVTkNfRklMRV9QUkVGSVgKLQkJCQkJKyB1cmwuc3Vic3RyaW5nKEFMVEVSTkFURV9VTkNfRklMRV9QUkVGSVgubGVuZ3RoKCksIHVybC5sZW5ndGgoKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQljb252ZXJ0ZWRVcmwgPSB1cmw7Ci0JCX0KLQkJcmV0dXJuIChjb252ZXJ0ZWRVcmwpOwotCi0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgIiUyMCIgdGhhdCBpcyB1c2VkIGJ5IHNvbWUgYnJvd3NlcnMgZm9yIHNwYWNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRGaWxlU3BhY2luZyhTdHJpbmcgZmlsZW5hbWUpCi0JewotCQkvLyBub3cgcmVtb3ZlIGFueSAiJTIwIgotCQlpbnQgc3RhcnQgPSAwOwotCQlTdHJpbmcgbmV3RmlsZW5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoc3RhcnQgPCBmaWxlbmFtZS5sZW5ndGgoKSkKLQkJewotCQkJaW50IGluZGV4ID0gZmlsZW5hbWUuaW5kZXhPZigiJTIwIiwgc3RhcnQpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW5kZXggPT0gLTEpCi0JCQl7Ci0JCQkJaW5kZXggPSBmaWxlbmFtZS5sZW5ndGgoKTsKLQkJCX0KLQkJCW5ld0ZpbGVuYW1lICs9IGZpbGVuYW1lLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpOwotCQkJbmV3RmlsZW5hbWUgKz0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQlzdGFydCA9IGluZGV4ICsgMzsKLQkJfQotCi0JCW5ld0ZpbGVuYW1lID0gbmV3RmlsZW5hbWUudHJpbSgpOwotCi0JCXJldHVybiAobmV3RmlsZW5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlICIlNUMiIHRoYXQgaXMgdXNlZCBieSBzb21lIGJyb3dzZXJzIGZvciBmaWxlIHNlcGFyYXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0RmlsZVNlcGFyYXRvcihTdHJpbmcgZmlsZW5hbWUpCi0JewotCQkvLyByZW1vdmUgYW55ICIlNUMiCi0JCWludCBzdGFydCA9IDA7Ci0JCVN0cmluZyBuZXdGaWxlbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChzdGFydCA8IGZpbGVuYW1lLmxlbmd0aCgpKQotCQl7Ci0JCQlpbnQgaW5kZXggPSBmaWxlbmFtZS5pbmRleE9mKCIlNUMiLCBzdGFydCk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbmRleCA9PSAtMSkKLQkJCXsKLQkJCQkvL2luZGV4ID0gZmlsZW5hbWUubGVuZ3RoKCk7Ci0JCQkJbmV3RmlsZW5hbWUgPSBmaWxlbmFtZS50cmltKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQluZXdGaWxlbmFtZSArPSBmaWxlbmFtZS5zdWJzdHJpbmcoc3RhcnQsIGluZGV4KTsKLQkJCW5ld0ZpbGVuYW1lICs9IFVOQ19TRVBBUkFUT1I7Ci0JCQlzdGFydCA9IGluZGV4ICsgMzsKLQkJfQotCi0JCW5ld0ZpbGVuYW1lID0gbmV3RmlsZW5hbWUudHJpbSgpOwotCi0JCS8vIGFsc28gaWYgZmlsZSBzZXBhcmF0b3IgZXF1YWxzIHVuYyBzZXBhcmF0b3IsIHJlbW92ZSBhbnkgV2luZG93cwotCQkvLyBzcGVjaWZpYyAiXCIKLQkJU3RyaW5nIHdpbmRvd3NGaWxlU2VwYXJhdG9yID0gIlxcIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIUZpbGUuc2VwYXJhdG9yLmVxdWFscyh3aW5kb3dzRmlsZVNlcGFyYXRvcikKLQkJCSYmIEZpbGUuc2VwYXJhdG9yLmVxdWFscyhVTkNfU0VQQVJBVE9SKSkKLQkJewotCQkJLy8gb24gVW5peAotCQkJbmV3RmlsZW5hbWUgPQotCQkJCW5ld0ZpbGVuYW1lLnJlcGxhY2UoCi0JCQkJCXdpbmRvd3NGaWxlU2VwYXJhdG9yLmNoYXJBdCgwKSwKLQkJCQkJVU5DX1NFUEFSQVRPUi5jaGFyQXQoMCkpOwotCQl9Ci0JCXJldHVybiAobmV3RmlsZW5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZmlsZSBuYW1lcyBmcm9tIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5Ci0JICogdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBzdWZmaXguICBBbiBleGFtcGxlIG9mIGEgCi0JICogc3VmZml4IGlzICIuZGF0Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlY3RvciBnZXRGaWxlTGlzdChTdHJpbmcgZGlyZWN0b3J5LCBTdHJpbmcgc3VmZml4KQotCXsKLQkJaWYgKGRpcmVjdG9yeS5zdGFydHNXaXRoKCJodHRwIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJLy8gcmVtb3RlIGRpcmVjdG9yeSwgdXNlIHRoaXMgaW5zdGVhZAotCQkJcmV0dXJuIChnZXRGaWxlTGlzdEZyb21SZW1vdGUoZGlyZWN0b3J5LCBzdWZmaXgpKTsKLQkJfQotCi0JCVN0cmluZyB0ZW1wRGlyID0gVU5DVXRpbC5jb252ZXJ0RmlsZW5hbWUoZGlyZWN0b3J5KTsKLQkJRmlsZSBkb2N1bWVudERpcmVjdG9yeSA9IG5ldyBGaWxlKFVOQ1V0aWwuY29udmVydEZpbGVTcGFjaW5nKHRlbXBEaXIpKTsKLQkJU3RyaW5nW10gZmlsZU5hbWVMaXN0ID0gZG9jdW1lbnREaXJlY3RvcnkubGlzdCgpOwotCi0JCS8vIG5vdyBwYXJzZSBhbmQgb25seSB0YWtlIHRob3NlIHRoYXQgZW5kIHdpdGggdGhlIHByb3BlciBzdWZmaXgKLQkJVmVjdG9yIGZpbmFsTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTmFtZUxpc3QubGVuZ3RoOyBpKyspCi0JCXsKLQkJCWlmIChmaWxlTmFtZUxpc3RbaV0uZW5kc1dpdGgoc3VmZml4KSkKLQkJCXsKLQkJCQlmaW5hbExpc3QuYWRkRWxlbWVudChmaWxlTmFtZUxpc3RbaV0pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChmaW5hbExpc3QpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgYXBwbGljYWJsZSBkZWZhdWx0IHJ1cCBmaWxlcyBmcm9tIHJlbW90ZSBkaXJlY3RvcnkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgVmVjdG9yIGdldEZpbGVMaXN0RnJvbVJlbW90ZShTdHJpbmcgZGlyZWN0b3J5LCBTdHJpbmcgc3VmZml4KQotCXsKLQkJVmVjdG9yIGZpbGVuYW1lcyA9IG5ldyBWZWN0b3IoKTsKLQkJdHJ5Ci0JCXsKLQkJCS8vIGdldCB0aGUgbGlzdGluZyB1c2luZyBhIFVSTAotCQkJVVJMIHJlbW90ZVVybCA9IG5ldyBVUkwoZGlyZWN0b3J5KTsKLQkJCUlucHV0U3RyZWFtIGluU3RyZWFtID0gcmVtb3RlVXJsLm9wZW5TdHJlYW0oKTsKLQkJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpbnQgYzsKLQkJCXdoaWxlICgoYyA9IGluU3RyZWFtLnJlYWQoKSkgIT0gLTEpCi0JCQl7Ci0JCQkJcmVzdWx0LmFwcGVuZCgoY2hhcikgYyk7Ci0JCQl9Ci0JCQlpblN0cmVhbS5jbG9zZSgpOwotCi0JCQkvLyBjb252ZXJ0IHN0cmluZyB0byB1cHBlciBjYXNlIHRvIGhhbmRsZSBtdWx0aXBsZSBzZXJ2ZXIgdHlwZXMgc3VjaCBhcyBBcGFjaGUKLQkJCVN0cmluZyBkaXJlY3RvcnlSZXN1bHQgPSByZXN1bHQudG9TdHJpbmcoKTsKLQkJCWRpcmVjdG9yeVJlc3VsdCA9IGRpcmVjdG9yeVJlc3VsdC5yZXBsYWNlQWxsKCJocmVmIiwgIkhSRUYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlkaXJlY3RvcnlSZXN1bHQgPSBkaXJlY3RvcnlSZXN1bHQucmVwbGFjZUFsbCgiPC9hIiwgIjwvQSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWRpcmVjdG9yeVJlc3VsdCA9IGRpcmVjdG9yeVJlc3VsdC5yZXBsYWNlQWxsKCI8dHQ+IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWRpcmVjdG9yeVJlc3VsdCA9IGRpcmVjdG9yeVJlc3VsdC5yZXBsYWNlQWxsKCI8L3R0PiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlkaXJlY3RvcnlSZXN1bHQgPSBkaXJlY3RvcnlSZXN1bHQucmVwbGFjZUFsbCgiPFRUPiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlkaXJlY3RvcnlSZXN1bHQgPSBkaXJlY3RvcnlSZXN1bHQucmVwbGFjZUFsbCgiPC9UVD4iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkvLyBwYXJzZSB0aGUgY29udGVudAotCQkJLy9TdHJpbmdUb2tlbml6ZXIgbGluZVRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoIHJlc3VsdC50b1N0cmluZygpICk7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgbGluZVRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZGlyZWN0b3J5UmVzdWx0KTsKLQkJCVZlY3RvciBsaW5lcyA9IG5ldyBWZWN0b3IoKTsKLQkJCXRyeQotCQkJewotCQkJCXdoaWxlICh0cnVlKQotCQkJCXsKLQkJCQkJbGluZVRva2VuaXplci5uZXh0VG9rZW4oIlJFRiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWxpbmVUb2tlbml6ZXIubmV4dFRva2VuKCJcIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBsaW5lID0gbGluZVRva2VuaXplci5uZXh0VG9rZW4oIlwiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkvLyBzdHJpcCBvdXQgIjwvQSI7IG5lZWRlZCB0aGlzIGJlY2F1c2UgU3RyaW5nVG9rZW5pemVyCi0JCQkJCS8vIGhhcyBwcm9ibGVtcyBwYXJzaW5nIGZpbGVuYW1lcyB0aGF0IGJlaW5nIHdpdGggIkEiCi0JCQkJCWludCBpbmRleCA9IGxpbmUuaW5kZXhPZigiPC9BIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGluZGV4ICE9IC0xICYmIGluZGV4ICE9IDApCi0JCQkJCXsKLQkJCQkJCVN0cmluZyBmaWxlbmFtZSA9IGxpbmUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJCWxpbmVzLmFkZEVsZW1lbnQoZmlsZW5hbWUpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJbGluZXMuYWRkRWxlbWVudChsaW5lKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5lKQotCQkJewotCQkJCS8vIGRvIG5vdGhpbmcsIGVuZCBvZiBjb250ZW50Ci0JCQl9Ci0KLQkJCS8vIHBhcnNlIGVhY2ggbGluZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lcy5zaXplKCk7IGkrKykKLQkJCXsKLQkJCQlTdHJpbmcgbGluZSA9IChTdHJpbmcpIGxpbmVzLmVsZW1lbnRBdChpKTsKLQotCQkJCWlmIChsaW5lLmVuZHNXaXRoKHN1ZmZpeCkpCi0JCQkJewotCQkJCQkvLyB3ZSB3YW50IHRoaXMKLQkJCQkJZmlsZW5hbWVzLmFkZEVsZW1lbnQobGluZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gKGZpbGVuYW1lcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNWI0MTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5jb20uaWJtLnNzZS5tb2RlbC5zdHJ1Y3R1cmVkYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwZDg4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgU2VydmljZXMgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLkFjdGl2YXRvcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5NTQxMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY4YmM1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICAgICBpZD0ic2VydmljZVByb3ZpZGVycyIKLSAgICAgICAgIG5hbWU9IkVQRiBTZXJ2aWNlcyIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL3NlcnZpY2VQcm92aWRlcnMuZXhzZCIvPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zY2hlbWEvc2VydmljZVByb3ZpZGVycy5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NjaGVtYS9zZXJ2aWNlUHJvdmlkZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyOGI2OTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NjaGVtYS9zZXJ2aWNlUHJvdmlkZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMiIGlkPSJzZXJ2aWNlUHJvdmlkZXJzIiBuYW1lPSJFUEYgU2VydmljZSBQcm92aWRlcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRXh0ZW5zaW9uIHBvaW50IGZvciBjb250cmlidXRpbmcgc2VydmljZXMgbGlrZSBhY2Nlc3MgY29udHJvbGxlciwgZmlsZSBtYW5hZ2VyLCBsaWJyYXJ5IHBlcnNpc3Rlci4uLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhY2Nlc3NDb250cm9sbGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJsaWJyYXJ5UGVyc2lzdGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZpbGVNYW5hZ2VyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJhY2Nlc3NDb250cm9sbGVyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJjbGFzcyIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JQWNjZXNzQ29udHJvbGxlciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImxpYnJhcnlQZXJzaXN0ZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9InR5cGUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQiIHR5cGU9ImJvb2xlYW4iIHVzZT0iZGVmYXVsdCIgdmFsdWU9ImZhbHNlIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmaWxlTWFuYWdlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUFjY2Vzc0NvbnRyb2xsZXIKLW9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZU1hbmFnZXIKLW9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VydmljZXMvQWN0aXZhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc3JjL29yZy9lY2xpcHNlL2VwZi9zZXJ2aWNlcy9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAzOTI5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc3JjL29yZy9lY2xpcHNlL2VwZi9zZXJ2aWNlcy9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZhdG9yIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQWN0aXZhdG9yKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbnMjc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL0lBY2Nlc3NDb250cm9sbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc3JjL29yZy9lY2xpcHNlL2VwZi9zZXJ2aWNlcy9JQWNjZXNzQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzU1ODE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL0lBY2Nlc3NDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotLyoqCi0gKiBDb250cm9scyBhY2Nlc3MgdG8gbGlicmFyeSBvYmplY3RzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCA5LCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFjY2Vzc0NvbnRyb2xsZXIgewotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgY2FsbGVyIGNhbiBtb2RpZnkgdGhlIGdpdmVuIEVPYmplY3RzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBjb2xsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlT2JqZWN0cyBjb2xsZWN0aW9uIG9mIHRoZSBFT2JqZWN0cyB0byBjaGVjawotCSAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IG9mIHRoZSBjYWxsZXIgCi0JICogQHJldHVybgotCSAqLwotCUlTdGF0dXMgY2hlY2tNb2RpZnkoQ29sbGVjdGlvbjxFT2JqZWN0PiBlT2JqZWN0cywgT2JqZWN0IGNvbnRleHQpOwotCQotCUlTdGF0dXMgY2hlY2tNb2RpZnkoUmVzb3VyY2VbXSByZXNvdXJjZXMsIE9iamVjdCBjb250ZXh0KTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL0lGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc3JjL29yZy9lY2xpcHNlL2VwZi9zZXJ2aWNlcy9JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODUxOWI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL0lGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIGZpbGUtYmFzZWQgTWV0aG9kIExpYnJhcnkgUGVyc2lzdGVyLgotICogPHA+Ci0gKiBBIE1ldGhvZCBMaWJyYXJ5IFBlcnNpc3RlciBpcyByZXNwb25zaWJsZSBmb3IgcGVyc2lzdGluZyB0aGUgbWV0aG9kIGxpYnJhcnkKLSAqIGNvbnRlbnQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgZXh0ZW5kcyBJTGlicmFyeVBlcnNpc3RlciB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXRoIG9mIGEgbWV0aG9kIGVsZW1lbnQncyBmb2xkZXIgcmVsYXRpdmUgdG8gaXRzIHBsdWctaW4gb3IKLQkgKiBsaWJyYXJ5IGZvbGRlci4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gYSByZWxhdGl2ZSBwYXRoIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvbGRlclJlbGF0aXZlUGF0aChNZXRob2RFbGVtZW50IGUpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgYWJzb2x1dGUgcGF0aCBvZiBhIG1ldGhvZCBlbGVtZW50J3MgZm9sZGVyLgotCSAqIAotCSAqIEBwYXJhbSBlIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb2xkZXJBYnNvbHV0ZVBhdGgoTWV0aG9kRWxlbWVudCBlKTsKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBmaWxlIGV4dGVuc2lvbiBvZiBhIG1ldGhvZCBlbGVtZW50J3MgcmVzb3VyY2UgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gYSBmaWxlIGV4dGVuc2lvbiBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKE9iamVjdCBlKTsKLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbWV0aG9kIGVsZW1lbnQgc3RvcmVzIGl0cyBjb250ZW50IGluIGEgZm9sZGVyIG5hbWVkCi0JICogYWZ0ZXIgaXQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgZWxlbWVudCBzdG9yZXMgaXRzIGNvbnRlbnQgaW4gYQotCSAqICAgICAgICAgZm9sZGVyIG5hbWVkIGFmdGVyIGl0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duRm9sZGVyKE9iamVjdCBlKTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGZvbGRlciBmb3IgdGhlIG1ldGhvZCBwbHVnaW4gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gdGhlIGdpdmVuIG1ldGhvZCBsaWJyYXJ5LgotCSAqICAKLQkgKiBAcGFyYW0gcGx1Z2luTmFtZSB0aGUgbmFtZSBvZiBtZXRob2QgcGx1Z2luCi0JICogQHBhcmFtIGxpYnJhcnkgdGhlIGxpYnJhcnkgd2hlcmUgdGhlIG1ldGhvZCBwbHVnaW4gZm9sZGVyIHdpbGwgYmUgY3JlYXRlZAotCSAqIEByZXR1cm4gdGhlIG1ldGhvZCBwbHVnaW4gZm9sZGVyCi0JICogQGV4Y2VwdGlvbiBSdW50aW1lRXhjZXB0aW9uIGlmIGZvbGRlciBjcmVhdGlvbiBmYWlsZWQKLQkgKi8KLQlwdWJsaWMgRmlsZSBjcmVhdGVNZXRob2RQbHVnaW5Gb2xkZXIoU3RyaW5nIHBsdWdpbk5hbWUsIE1ldGhvZExpYnJhcnkgbGlicmFyeSk7Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBmb2xkZXIgdG8gc3RvcmUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gdGhlIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeSB0aGUgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGZvbGRlciB0byBzdG9yZSBtZXRob2QgY29uZmlndXJhdGlvbiBvciBudWxsCi0JICogQGV4Y2VwdGlvbiBSdW50aW1lRXhjZXB0aW9uIGlmIGZhaWxlZAotCSAqLwotCXB1YmxpYyBGaWxlIGdldERlZmF1bHRNZXRob2RDb25maWd1cmF0aW9uRm9sZGVyKE1ldGhvZExpYnJhcnkgbGlicmFyeSk7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZGVmYXVsdCBmb2xkZXIgdG8gc3RvcmUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gdGhlIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeSB0aGUgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gZmlsZSB0aGUgZGVmYXVsdCBmb2xkZXIgdG8gc3RvcmUgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihNZXRob2RMaWJyYXJ5IGxpYnJhcnksIEZpbGUgZmlsZSk7Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcmVzb3VyY2UgZm9sZGVyIG9mIHRoZSBlbGVtZW50IGluIHRoZSBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBlbGVtZW50J3MgcmVzb3VyY2UgZm9sZGVyCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUZvbGRlclBhdGgoTWV0aG9kRWxlbWVudCBlKTsKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc3JjL29yZy9lY2xpcHNlL2VwZi9zZXJ2aWNlcy9JRmlsZU1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL0lGaWxlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzI1NzNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL0lGaWxlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBGaWxlIE1hbmFnZXIuCi0gKiA8cD4KLSAqIEEgRmlsZSBNYW5hZ2VyIGlzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgWE1JIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAqIG1ldGhvZCBlbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRmlsZU1hbmFnZXIgewotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50IHBhdGggY2FuIGJlIG1vZGlmaWVkLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsPC9jb2RlPiB0aGF0IGlzIHRvIGJlCi0JICogICAgICAgICAgICB1c2VkIHRvIHBhcmVudCBhbnkgZGlhbG9ncyB3aXRoIHRoZSB1c2VyLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm8gVUkgY29udGV4dCAoZGVjbGFyZWQgYXMgYW4gPGNvZGU+T2JqZWN0PC9jb2RlPgotCSAqICAgICAgICAgICAgdG8gYXZvaWQgYW55IGRpcmVjdCByZWZlcmVuY2VzIG9uIHRoZSBTV1QgY29tcG9uZW50KQotCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0Ci0JICovCi0JcHVibGljIElTdGF0dXMgY2hlY2tNb2RpZnkoU3RyaW5nIHBhdGgsIE9iamVjdCBjb250ZXh0KTsKLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCBwYXRoIGNhbiBiZSBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aHMKLQkgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIHBhdGggZnJhZ21lbnRzIHRoYXQgcG9pbnQgdG8gYSBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICB0aGUgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw8L2NvZGU+IHRoYXQgaXMgdG8gYmUKLQkgKiAgICAgICAgICAgIHVzZWQgdG8gcGFyZW50IGFueSBkaWFsb2dzIHdpdGggdGhlIHVzZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICAgICBpZiB0aGVyZSBpcyBubyBVSSBjb250ZXh0IChkZWNsYXJlZCBhcyBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+Ci0JICogICAgICAgICAgICB0byBhdm9pZCBhbnkgZGlyZWN0IHJlZmVyZW5jZXMgb24gdGhlIFNXVCBjb21wb25lbnQpCi0JICogQHJldHVybiBhIHN0YXR1cyBvYmplY3QKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjaGVja01vZGlmeShTdHJpbmdbXSBwYXRocywgT2JqZWN0IGNvbnRleHQpOwotCi0JLyoqCi0JICogRGVsZXRlcyB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGVsZXRpb24gaXMgc3VjY2Vzc2Z1bAotCSAqLwotCXB1YmxpYyBib29sZWFuIGRlbGV0ZShTdHJpbmcgcGF0aCk7Ci0KLQkvKioKLQkgKiBSZW5hbWVzIHRoZSBwYXRoIG9mIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIG9sZEZpbGUKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+RmlsZTwvY29kZT4gb2JqZWN0IHRoYXQgY29udGFpbnMgYSBtZXRob2QgZWxlbWVudCdzCi0JICogICAgICAgICAgICBvbGQgcGF0aAotCSAqIEBwYXJhbSBuZXdGaWxlCi0JICogICAgICAgICAgICBhIDxjb2RlPkZpbGU8L2NvZGU+IG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgbWV0aG9kIGVsZW1lbnQncwotCSAqICAgICAgICAgICAgbmV3IHBhdGgKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZW5hbWluZyBpcyBzdWNjZXNzZnVsCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVuYW1lKEZpbGUgb2xkRmlsZSwgRmlsZSBuZXdGaWxlKTsKLQotCS8qKgotCSAqIE1vdmVzIGEgbWV0aG9kIGVsZW1lbnQgdG8gYSBuZXcgbG9jYXRpb24uCi0JICogCi0JICogQHBhcmFtIG9sZFBhdGgKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQncyBvbGQgcGF0aAotCSAqIEBwYXJhbSBuZXdOYW1lCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50J3MgbmV3IHBhdGgKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtb3ZlIGlzIHN1Y2Nlc3NmdWwKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtb3ZlKFN0cmluZyBvbGRQYXRoLCBTdHJpbmcgbmV3UGF0aCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc3JjL29yZy9lY2xpcHNlL2VwZi9zZXJ2aWNlcy9JTGlicmFyeVBlcnNpc3Rlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VydmljZXMvSUxpYnJhcnlQZXJzaXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZmMmUzYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc3JjL29yZy9lY2xpcHNlL2VwZi9zZXJ2aWNlcy9JTGlicmFyeVBlcnNpc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgTWV0aG9kIExpYnJhcnkgUGVyc2lzdGVyLgotICogPHA+Ci0gKiBBIE1ldGhvZCBMaWJyYXJ5IFBlcnNpc3RlciBpcyByZXNwb25zaWJsZSBmb3IgcGVyc2lzdGluZyB0aGUgbWV0aG9kIGxpYnJhcnkKLSAqIGNvbnRlbnQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDksIDIwMDYKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeVBlcnNpc3RlciB7Ci0JLyoqCi0JICogU2F2ZXMgYW4gZXhpc3RpbmcgcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBhIHJlc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBTYXZlcyB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudCBpbiBpdHMgb3duIHJlc291cmNlLiBUaGUgc3BlY2lmaWVkIE1ldGhvZEVsZW1lbnQgbXVzdCBiZSBwYXJ0IG9mIGEgbGlicmFyeQotCSAqIGFuZCBpdCBpcyBhbGxvd2VkIHRvIGhhdmUgaXRzIG93biByZXNvdXJjZSwgdG8gd2hpY2ggbm8gb3RoZXIgcmVzb3VyY2UgcmVmZXJzLiBJbiBvdGhlciB3b3JkcywgY2FsbGluZyAKLQkgKiB7QGxpbmsgI2hhc093blJlc291cmNlV2l0aG91dFJlZmVycmVyKE9iamVjdCl9IG9uIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50IG11c3QgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZShNZXRob2RFbGVtZW50IGUpOwotCQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZShDb2xsZWN0aW9uPE1ldGhvZEVsZW1lbnQ+IGVsZW1zKTsKLQotCS8qKgotCSAqIEFkanVzdHMgdGhlIGxvY2F0aW9uIG9mIGEgcmVzb3VyY2UgYW5kIHNhdmVzIGFsbCB0aGUgcmVzb3VyY2VzIHRoYXQgaGF2ZQotCSAqIGJlZW4gY2hhbmdlZCBhcyB0aGUgcmVzdWx0IG9mIHRoaXMgYWRqdXN0bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIGEgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGp1c3RMb2NhdGlvbihSZXNvdXJjZSByZXNvdXJjZSk7Ci0KLQkvKioKLQkgKiBHZXRzIGEgbGlzdCBvZiB3YXJuaW5ncyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiA8Y29kZT5FeGNlcHRpb248L2NvZGU+IG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXYXJuaW5ncygpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBtZXRob2QgZWxlbWVudCBjYW4gaGF2ZSBpdHMgb3duIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGVsZW1lbnQgaXMgb3duZWQgYnkgYSByZXNvdXJjZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc093blJlc291cmNlKE9iamVjdCBlKTsKLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbWV0aG9kIGVsZW1lbnQgY2FuIGhhdmUgaXRzIG93biByZXNvdXJjZSwgd2hpY2ggbm8gb3RoZXIgcmVzb3VyY2UgcmVmZXJzIHRvLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc093blJlc291cmNlV2l0aG91dFJlZmVycmVyKE9iamVjdCBlKTsKLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgPGNvZGU+Y29udGFpbmVyUmVzb3VyY2U8L2NvZGU+IGNvbnRhaW5zIDxjb2RlPnJlc291cmNlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gY29udGFpbmVyUmVzb3VyY2UKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgaXMgY29udGFpbmVkIGJ5IDxjb2RlPmNvbnRhaW5lclJlc291cmNlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29udGFpbmVkQnkoUmVzb3VyY2UgcmVzb3VyY2UsIFJlc291cmNlIGNvbnRhaW5lclJlc291cmNlKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGZhaWwgc2FmZSBtZXRob2QgbGlicmFyeSBwZXJzaXN0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGlicmFyeQotCSAqIHBlcnNpc3Rlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgZmFpbCBzYWZlIG1ldGhvZCBsaWJyYXJ5IHBlcnNpc3RlcgotCSAqLwotCXB1YmxpYyBGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBleHRlbmRzCi0JCQlJTGlicmFyeVBlcnNpc3RlciB7Ci0JCS8qKgotCQkgKiBEaXJlY3QgcGVyc2lzdGVyIHRvIG92ZXJ3cml0ZSBkdXJpbmcgc2F2ZSB3aXRob3V0IGNoZWNraW5nIG9uIGNoYW5nZSBjb25mbGljdHMuCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05TX09WRVJXUklUQUJMRV9SRVNPVVJDRVMgPSAiT1ZFUldSSVRBQkxFX1JFU09VUkNFUyI7IC8vJE5PTi1OTFMtMSQKLQotCQkvKioKLQkJICogR2V0cyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBJRC4KLQkJICogCi0JCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gSUQKLQkJICovCi0JCVN0cmluZyBnZXRDdXJyZW50VHhJRCgpOwotCi0JCS8qKgotCQkgKiBBZGp1c3RzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIHNhdmUgYWxsIHRoZSByZXNvdXJjZXMKLQkJICogdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBhcyB0aGUgcmVzdWx0IG9mIHRoaXMgYWRqdXN0bWVudC4gVGhpcyBjYWxsCi0JCSAqIG5lZWRzIGEgbmV3IHRyYW5zYWN0aW9uIGFuZCB0aGUgdHJhbnNhY3Rpb24gd2lsbCBiZSBjb21taXR0ZWQgaW4gdGhpcwotCQkgKiBtZXRob2QuCi0JCSAqIAotCQkgKiBAcGFyYW0gcmVzb3VyY2VzCi0JCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlcyB3aG9zZSBsb2NhdGlvbnMgbmVlZCB0byBiZSBhZGp1c3RlZAotCQkgKi8KLQkJdm9pZCBhZGp1c3RMb2NhdGlvbihDb2xsZWN0aW9uIHJlc291cmNlcyk7Ci0KLQkJLyoqCi0JCSAqIENvbW1pdHMgdGhlIHRyYW5zYWN0aW9uLgotCQkgKi8KLQkJdm9pZCBjb21taXQoKTsKLQotCQkvKioKLQkJICogUm9sbCBiYWNrcyB0aGUgdHJhbnNhY3Rpb24uCi0JCSAqLwotCQl2b2lkIHJvbGxiYWNrKCk7Ci0JCQotCQkvKioKLQkJICogR2V0cyBzYXZlIG9wdGlvbnMuCi0JCSAqIAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlNYXAgZ2V0U2F2ZU9wdGlvbnMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL1NlcnZpY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc3JjL29yZy9lY2xpcHNlL2VwZi9zZXJ2aWNlcy9TZXJ2aWNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjg0NDNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL1NlcnZpY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGFjY2VzcyB0aGUgZXh0ZW5zaW9ucyBjb250cmlidXRlZCB0byBleHRlbnN0aW9uIHBvaW50Ci0gKiAib3JnLmVjbGlwc2UuZXBmLnVtYS5zZXJ2aWNlcyIuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTZXJ2aWNlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGVyc2lzdGVyRGVzY3JpcHRvciB7Ci0JCVN0cmluZyBwbHVnaW5JZDsKLQkJU3RyaW5nIHR5cGU7Ci0JCVN0cmluZyBjbGFzc05hbWU7Ci0JCWJvb2xlYW4gaXNEZWZhdWx0OwotCQlpbnQgdmVyc2lvbjsKLQkJSUxpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyOwotCX0KLQkKLQkvKioKLQkgKiBQZXJzaXN0ZW5jZSB0eXBlIGZvciBYTUktZmlsZS1iYXNlZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1JX1BFUlNJU1RFTkNFX1RZUEUgPSAieG1pIjsgLy8kTk9OLU5MUy0xJAotCQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbmFtZXNwYWNlID0gQWN0aXZhdG9yLlBMVUdJTl9JRDsgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGV4dGVuc2lvblBvaW50TmFtZSA9ICJzZXJ2aWNlUHJvdmlkZXJzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgSUFjY2Vzc0NvbnRyb2xsZXIgYWNjZXNzQ29udHJvbGxlcjsKLQlwcml2YXRlIHN0YXRpYyBJRmlsZU1hbmFnZXIgZmlsZU1hbmFnZXI7Ci0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxQZXJzaXN0ZXJEZXNjcmlwdG9yPiBwZXJzaXN0ZXJEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8UGVyc2lzdGVyRGVzY3JpcHRvcj4oKTsJCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgUGVyc2lzdGVyRGVzY3JpcHRvcj4gdHlwZVRvTGlicmFyeVBlcnNpc3RlckRlc2NyaXB0b3JNYXA7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFBlcnNpc3RlbmNlVHlwZTsKLQotCXByaXZhdGUgc3RhdGljIE9iamVjdCBnZXRTZXJ2aWNlKFN0cmluZyBzZXJ2aWNlTmFtZSkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChuYW1lc3BhY2UsIGV4dGVuc2lvblBvaW50TmFtZSk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBudWxsOwotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IG51bGw7Ci0JCQlpbnQgdmVyc2lvbiA9IC0xOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCWlmKHNlcnZpY2VOYW1lLmVxdWFscyhjb25maWdFbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCQkJCWludCBvdGhlclZlcnNpb24gPSBwYXJzZVZlcnNpb24oY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoInZlcnNpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmKG90aGVyVmVyc2lvbiA+IHZlcnNpb24pIHsKLQkJCQkJCQljbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJCQkJdmVyc2lvbiA9IG90aGVyVmVyc2lvbjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGludCBwYXJzZVZlcnNpb24oU3RyaW5nIHN0cikgewotCQl0cnkgewotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoc3RyKTsKLQkJfQotCQljYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIDA7Ci0JCX0JCQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBQZXJzaXN0ZXJEZXNjcmlwdG9yPiBnZXRUeXBlVG9MaWJyYXJ5UGVyc2lzdGVyRGVzY3JpcHRvck1hcCgpIHsKLQkJTWFwPFN0cmluZywgUGVyc2lzdGVyRGVzY3JpcHRvcj4gdHlwZVRvUGVyc2lzdGVyRGVzY3JpcHRvck1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUGVyc2lzdGVyRGVzY3JpcHRvcj4oKTsKLQkJU3RyaW5nIHNlcnZpY2VOYW1lID0gImxpYnJhcnlQZXJzaXN0ZXIiOyAvLyROT04tTkxTLTEkCi0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KG5hbWVzcGFjZSwgZXh0ZW5zaW9uUG9pbnROYW1lKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCWlmKHNlcnZpY2VOYW1lLmVxdWFscyhjb25maWdFbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJUGVyc2lzdGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IFBlcnNpc3RlckRlc2NyaXB0b3IoKTsKLQkJCQkJCQlkZXNjcmlwdG9yLnBsdWdpbklkID0gcGx1Z2luSWQ7Ci0JCQkJCQkJZGVzY3JpcHRvci50eXBlID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKTsgLy8kTk9OLU5MUy0xJAkJCQkJCQkKLQkJCQkJCQlkZXNjcmlwdG9yLmNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJZGVzY3JpcHRvci5pc0RlZmF1bHQgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGVmYXVsdCIpKTsgLy8kTk9OLU5MUy0xJAkJCQkJCQkKLQkJCQkJCQlkZXNjcmlwdG9yLnZlcnNpb24gPSBwYXJzZVZlcnNpb24oY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoInZlcnNpb24iKSk7IC8vJE5PTi1OTFMtMSQJCQkJCQkJCi0JCQkJCQkJcGVyc2lzdGVyRGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOwotCQkJCQkJCWlmKGRlc2NyaXB0b3IudHlwZSAhPSBudWxsKSB7Ci0JCQkJCQkJCVBlcnNpc3RlckRlc2NyaXB0b3IgZGVzYyA9IHR5cGVUb1BlcnNpc3RlckRlc2NyaXB0b3JNYXAuZ2V0KGRlc2NyaXB0b3IudHlwZSk7Ci0JCQkJCQkJCWlmKGRlc2MgIT0gbnVsbCkgewotCQkJCQkJCQkJaWYoZGVzYy52ZXJzaW9uIDwgZGVzY3JpcHRvci52ZXJzaW9uKSB7Ci0JCQkJCQkJCQkJdHlwZVRvUGVyc2lzdGVyRGVzY3JpcHRvck1hcC5wdXQoZGVzY3JpcHRvci50eXBlLCBkZXNjcmlwdG9yKTsKLQkJCQkJCQkJCQlpZihkZXNjcmlwdG9yLmlzRGVmYXVsdCkgewotCQkJCQkJCQkJCQlkZWZhdWx0UGVyc2lzdGVuY2VUeXBlID0gZGVzY3JpcHRvci50eXBlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQllbHNlIGlmKGRlc2MuaXNEZWZhdWx0KSB7Ci0JCQkJCQkJCQkJCWRlZmF1bHRQZXJzaXN0ZW5jZVR5cGUgPSBudWxsOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCXR5cGVUb1BlcnNpc3RlckRlc2NyaXB0b3JNYXAucHV0KGRlc2NyaXB0b3IudHlwZSwgZGVzY3JpcHRvcik7Ci0JCQkJCQkJCQlpZihkZXNjcmlwdG9yLmlzRGVmYXVsdCkgewotCQkJCQkJCQkJCWRlZmF1bHRQZXJzaXN0ZW5jZVR5cGUgPSBkZXNjcmlwdG9yLnR5cGU7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHR5cGVUb1BlcnNpc3RlckRlc2NyaXB0b3JNYXA7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUFjY2Vzc0NvbnRyb2xsZXIgZ2V0QWNjZXNzQ29udHJvbGxlcigpIHsKLQkJaWYoYWNjZXNzQ29udHJvbGxlciA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NDb250cm9sbGVyID0gKElBY2Nlc3NDb250cm9sbGVyKSBnZXRTZXJ2aWNlKCJhY2Nlc3NDb250cm9sbGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gYWNjZXNzQ29udHJvbGxlcjsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgbGlicmFyeSBwZXJzaXN0ZXIgb2YgdGhlIGdpdmVuIHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElMaWJyYXJ5UGVyc2lzdGVyIGdldExpYnJhcnlQZXJzaXN0ZXIoU3RyaW5nIHR5cGUpIHsKLQkJaWYodHlwZVRvTGlicmFyeVBlcnNpc3RlckRlc2NyaXB0b3JNYXAgPT0gbnVsbCkgewotCQkJdHlwZVRvTGlicmFyeVBlcnNpc3RlckRlc2NyaXB0b3JNYXAgPSBnZXRUeXBlVG9MaWJyYXJ5UGVyc2lzdGVyRGVzY3JpcHRvck1hcCgpOwotCQl9Ci0JCVBlcnNpc3RlckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IHR5cGVUb0xpYnJhcnlQZXJzaXN0ZXJEZXNjcmlwdG9yTWFwLmdldCh0eXBlKTsKLQkJaWYoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQlpZihkZXNjcmlwdG9yLnBlcnNpc3RlciA9PSBudWxsKSB7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShkZXNjcmlwdG9yLnBsdWdpbklkKTsKLQkJCQl0cnkgewotCQkJCQlkZXNjcmlwdG9yLnBlcnNpc3RlciA9IChJTGlicmFyeVBlcnNpc3RlcikgYnVuZGxlLmxvYWRDbGFzcyhkZXNjcmlwdG9yLmNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBkZXNjcmlwdG9yLnBlcnNpc3RlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJTGlicmFyeVBlcnNpc3RlciBnZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlcigpIHsKLQkJcmV0dXJuIGdldExpYnJhcnlQZXJzaXN0ZXIoZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZW5jZVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVuY2VUeXBlKCkgewotCQlpZihkZWZhdWx0UGVyc2lzdGVuY2VUeXBlID09IG51bGwpIHsKLQkJCWdldFR5cGVUb0xpYnJhcnlQZXJzaXN0ZXJEZXNjcmlwdG9yTWFwKCk7Ci0JCQlpZihkZWZhdWx0UGVyc2lzdGVuY2VUeXBlID09IG51bGwgJiYgZ2V0TGlicmFyeVBlcnNpc3RlcihYTUlfUEVSU0lTVEVOQ0VfVFlQRSkgIT0gbnVsbCkgewotCQkJCS8vIG5vIHBlcnNpc3RlciBpcyBzZXQgYXMgZGVmYXVsdCwgY2hvb3NlIFhNSSBhcyBkZWZhdWx0IHBlcnNpc3RlbmNlIHR5cGUKLQkJCQkvLwotCQkJCWRlZmF1bHRQZXJzaXN0ZW5jZVR5cGUgPSBYTUlfUEVSU0lTVEVOQ0VfVFlQRTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdFBlcnNpc3RlbmNlVHlwZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElGaWxlTWFuYWdlciBnZXRGaWxlTWFuYWdlcigpIHsKLQkJaWYoZmlsZU1hbmFnZXIgPT0gbnVsbCkgewotCQkJZmlsZU1hbmFnZXIgPSAoSUZpbGVNYW5hZ2VyKSBnZXRTZXJ2aWNlKCJmaWxlTWFuYWdlciIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGZpbGVNYW5hZ2VyOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDExMWU0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudWkuaW50cm88L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM2Njg3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jRnJpIERlYyAwMSAxNjowMjo0MSBQU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRkM2I4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS51aS5pbnRybwotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2ViODU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgY3NzLyxcCi0gICAgICAgICAgICAgICBoZWxwLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgaW50cm9Db250ZW50LnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHdlbGNvbWUueG1sCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2NvbmYuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9jb25mLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5MjVjYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2NvbmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9maXJzdHN0ZXBzL2ZpcnN0c3RlcHMuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9maXJzdHN0ZXBzL2ZpcnN0c3RlcHMuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTViNWI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZmlyc3RzdGVwcy9maXJzdHN0ZXBzLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotLyoKLSAqIGZpcnN0c3RlcHMuY3NzIGlzIGEgdGVtcGxhdGUgZm9yIHRoZSBncm91cCBzcGVjaWZpYyBjc3Mgc2V0dGluZ3MKLSAqLwotIAotLyoKLSAqIGJhY2tncm91bmQgd2F0ZXJtYXJrIC0gZ3JvdXAgc3BlY2lmaWMKLSAqLwotCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2NvbnRlbnRwYWdlL2ZpcnN0ZXBzX3d0ci5qcGcpOwotfQotCi0vKgotICogc2hvdyB0aGUgInNlbGVjdGVkIiBpbWFnZSBmb3IgdGhpcyBwYWdlIC0gVGhpcyBpcyBncm91cCBzcGVjaWZpYwotICovCi0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjc3RlcHMgaW1nLCAjbmF2aWdhdGlvbi1saW5rcyBhI3N0ZXBzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZmlyc3RlcHM0OHNlbC5naWYpOyB9Ci0KLS8qIAotICogU2V0IHVwIHRoZSBPdmVydmlldyBsaW5rcyB0byBiZSBkaXNwbGF5ZWQgaW4gdHdvIGNvbHVtbnMKLSAqIHRoYXQgYXJlIGNlbnRlcmVkIGluIHRoZSBtaWRkbGUgb2YgdGhlIHBhZ2UuCi0gKi8KLQotI3N0ZXBzLWxpbmtzIHsJdGV4dC1hbGlnbiA6IGxlZnQ7CXdpZHRoIDogNzYwcHg7CS8qIFRvIGNlbnRlciBpbiBNb3ogKGhhdmUgdG8gdXNlIHRleHQtYWxpZ24gZm9yIElFKSAqLwltYXJnaW4gOiAwcHggYXV0bzt9Ci0jc3RlcHMtbGlua3MgYSB7IAl3aWR0aCA6IDM3MHB4Owl0ZXh0LWFsaWduIDogbGVmdDsgCW1hcmdpbi1sZWZ0IDogNXB4OwltYXJnaW4tcmlnaHQgOiA1cHg7CW1hcmdpbi10b3AgOiA1cHg7CW1hcmdpbi1ib3R0b20gOiAtMjBweDsJdmVydGljYWwtYWxpZ24gOiB0b3A7fQotI3N0ZXBzLWxpbmtzID4gYSB7IHZlcnRpY2FsLWFsaWduIDogbWlkZGxlOyB9Ci0jc3RlcHMtbGlua3MgYSBpbWcgewloZWlnaHQgOiA1N3B4Owl3aWR0aCA6IDU3cHg7CXZlcnRpY2FsLWFsaWduIDogbWlkZGxlO30JCi0jc3RlcHMtbGlua3MgYSAubGluay1sYWJlbCB7CWRpc3BsYXkgOiBibG9jazsJd2lkdGggOiAzMDBweDsJcG9zaXRpb24gOiByZWxhdGl2ZTsJdG9wIDogLTUwcHg7CWxlZnQgOiA2MHB4O30KLSNzdGVwcy1saW5rcyBhIHAgLnRleHQgewlkaXNwbGF5IDogYmxvY2s7CXdpZHRoIDogMzAwcHg7CXBvc2l0aW9uIDogcmVsYXRpdmU7CXRvcCA6IC00NXB4OwlsZWZ0IDogNTNweDt9Ci0KLS8qIFNwZWNpYWwgY2FzZSBmb3IgTW96aWxsYSwgYmVjYXVzZSB0aGUgbGlua3MgYXJlIGRpc3BsYXllZAotICAgaW4gMSB2ZXJ0aWNhbCBjb2x1bW4gaW5zdGVhZCBvZiAyIGNlbnRlcmVkIGNvbHVtbnMgKi8KLSNzdGVwcy1saW5rcyA+IGEgeyAJd2lkdGggOiA3MDBweDsgfQotI3N0ZXBzLWxpbmtzIGEgPiAubGluay1sYWJlbCB7IHdpZHRoIDogNzAwcHg7IH0KLSNzdGVwcy1saW5rcyBhIHAgPiAudGV4dCB7IHdpZHRoIDogNzAwcHg7IH0KLQotI3N0ZXBzLWxpbmtzIGE6aG92ZXIgeyBib3JkZXItcmlnaHQgOiA1cHg7IH0KLQotYSNiYXNpY3MgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC93YmJhc2ljc19vYmouZ2lmKTsgfQotYSNiYXNpY3M6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC93YmJhc2ljc2hvdl9vYmouZ2lmKTsgfQotCi1hI3RlYW0gaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC90ZWFtc3VwX29iai5naWYpOyB9Ci1hI3RlYW06aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC90ZWFtc3VwaG92X29iai5naWYpOyB9CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2ZpcnN0c3RlcHMvZmlyc3RzdGVwcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9maXJzdHN0ZXBzL2ZpcnN0c3RlcHMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk3ZmYzMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2ZpcnN0c3RlcHMvZmlyc3RzdGVwcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RlcHMubGF5b3V0Lm5jb2x1bW5zID0gMgotc3RlcHMucGFnZS1jb250ZW50LmxheW91dC52c3BhY2luZyA9IDQwCi0KLXN0ZXBzLnBhZ2UtY29udGVudC5zdGVwcy1saW5rcy5sYXlvdXQubmNvbHVtbnMgPSAyCi1zdGVwcy5wYWdlLWNvbnRlbnQuc3RlcHMtbGlua3MubGF5b3V0LnZzcGFjaW5nID0gMzUKLQotc3RlcHMuc3VidGl0bGUtaWQgPSBzdGVwcy9wYWdlLWNvbnRlbnQvcGFnZS10aXRsZQotc3RlcHMuZGVzY3JpcHRpb24taWQgPSBzdGVwcy9wYWdlLWNvbnRlbnQvcGFnZS1kZXNjcmlwdGlvbgotCi1zdGVwcy5wYWdlLWNvbnRlbnQuc3RlcHMtbGlua3MuZXBmLXN0ZXBzLXR3by5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9maXJzdHN0ZXBzLmdpZgotc3RlcHMucGFnZS1jb250ZW50LnN0ZXBzLWxpbmtzLmVwZi1zdGVwcy1mb3VyLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHMuZ2lmCi1zdGVwcy5wYWdlLWNvbnRlbnQuc3RlcHMtbGlua3MuZXBmLXN0ZXBzLW9uZS5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9maXJzdHN0ZXBzLmdpZgotc3RlcHMucGFnZS1jb250ZW50LnN0ZXBzLWxpbmtzLmVwZi1zdGVwcy10aHJlZS5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9maXJzdHN0ZXBzLmdpZgotI25ld3MubmV3LWFuZC1ub3Rld29ydGh5LmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9uZXdfb2JqLmdpZgotI25ld3MubWlncmF0aW9uLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9taWdyYXRlX29iai5naWYKLSNuZXdzLnVwZGF0ZXMubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3VwZGF0ZXNfb2JqLmdpZgotI25ld3MuZWNsaXBzZS5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvY29tbXVuaXR5X29iai5naWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlLzF4MXRyYW5zLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvMXgxdHJhbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2FmNDM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvMXgxdHJhbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9iYWNrZ3JvdW5kLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvYmFja2dyb3VuZC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMWNhZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9iYWNrZ3JvdW5kLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvYmFja2dyb3VuZGN1cnZlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvYmFja2dyb3VuZGN1cnZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2NTdkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2JhY2tncm91bmRjdXJ2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2JhY2tncm91bmRjdXJ2ZTIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9iYWNrZ3JvdW5kY3VydmUyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE4YjBjZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2JhY2tncm91bmRjdXJ2ZTIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9icmFuZG1hcmsuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9icmFuZG1hcmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2JkOWQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvYnJhbmRtYXJrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvY29udGVudF9iYWNrZ3JvdW5kLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvY29udGVudF9iYWNrZ3JvdW5kLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAzYzZkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2NvbnRlbnRfYmFja2dyb3VuZC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2ZpcnN0ZXBzX3d0ci5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2ZpcnN0ZXBzX3d0ci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZDNkMjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9maXJzdGVwc193dHIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9oYW5kbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9oYW5kbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmE4ODkzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvaGFuZGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvbmV3X2JhY2tncm91bmRjdXJ2ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL25ld19iYWNrZ3JvdW5kY3VydmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQ0MGFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvbmV3X2JhY2tncm91bmRjdXJ2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL25ld19jb250ZW50X2JhY2tncm91bmQuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9uZXdfY29udGVudF9iYWNrZ3JvdW5kLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEzZTU3MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL25ld19jb250ZW50X2JhY2tncm91bmQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9vdmVydmlld193dHIuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9vdmVydmlld193dHIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzNlNDhjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvb3ZlcnZpZXdfd3RyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvcGFnZV93b3JkbWFyay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3BhZ2Vfd29yZG1hcmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhlNTQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvcGFnZV93b3JkbWFyay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3JhdGlvbmFsYWR2YW50YWdlLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvcmF0aW9uYWxhZHZhbnRhZ2UuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDMyNWRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvcmF0aW9uYWxhZHZhbnRhZ2UuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9yZXR1c2VyX3d0ci5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3JldHVzZXJfd3RyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJhNDJkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3JldHVzZXJfd3RyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvc2FtcGxlc193dHIuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9zYW1wbGVzX3d0ci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZTcwM2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9zYW1wbGVzX3d0ci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3NlY3Rpb24xLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvc2VjdGlvbjEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTQ3NTEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvc2VjdGlvbjEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9zZWN0aW9uMi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3NlY3Rpb24yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVlMTQ4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3NlY3Rpb24yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvc2VjdGlvbjMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9zZWN0aW9uMy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZDI0ZTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9zZWN0aW9uMy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3NlY3Rpb240LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvc2VjdGlvbjQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNThkNGE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvc2VjdGlvbjQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS90dXRvcmlhbHNfd3RyLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvdHV0b3JpYWxzX3d0ci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NGM3YzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS90dXRvcmlhbHNfd3RyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvd2VicnNyY193dHIuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS93ZWJyc3JjX3d0ci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMDJmMmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS93ZWJyc3JjX3d0ci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3doYXRzbmV3X3d0ci5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3doYXRzbmV3X3d0ci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYTQyZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS93aGF0c25ld193dHIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS93b3JkbWFyay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3dvcmRtYXJrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4ZTU0Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3dvcmRtYXJrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvYmFjay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2JhY2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzgxY2I2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvYmFjay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2ZpcnN0ZXBzNDguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9maXJzdGVwczQ4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNkYjYzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2ZpcnN0ZXBzNDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9maXJzdGVwczQ4c2VsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZmlyc3RlcHM0OHNlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZTU4YjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9maXJzdGVwczQ4c2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZmlyc3RlcHM3Mi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2ZpcnN0ZXBzNzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQ1MjllLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZmlyc3RlcHM3Mi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2ZvcndhcmQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9mb3J3YXJkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0YTRmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2ZvcndhcmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9ob21lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvaG9tZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNjBmOGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9ob21lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL292ZXJ2aWV3NDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWU1YzBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL292ZXJ2aWV3NDhzZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzQ4c2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1OWNlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL292ZXJ2aWV3NDhzZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzcyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc3Mi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMzlkZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvcHNwYnJ3c2UuamJmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9wc3BicndzZS5qYmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMTVhODQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9wc3BicndzZS5qYmYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3JldHVzZXI0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3JldHVzZXI0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNDM4MDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9yZXR1c2VyNDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9yZXR1c2VyNDhzZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9yZXR1c2VyNDhzZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjEyZTdhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvcmV0dXNlcjQ4c2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvcmV0dXNlcjcyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvcmV0dXNlcjcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVjYjMxZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3JldHVzZXI3Mi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3NhbXBsZXM0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3NhbXBsZXM0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZWQxZDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9zYW1wbGVzNDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9zYW1wbGVzNDhzZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9zYW1wbGVzNDhzZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzE5MTIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczQ4c2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczcyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5NmJiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3NhbXBsZXM3Mi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczQ4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MThkNjE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM0OHNlbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczQ4c2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYxYWQ3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczQ4c2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM3Mi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MWMyZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM3Mi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3diNDguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93YjQ4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQyYzZjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3diNDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93ZWJyc3JjNDguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93ZWJyc3JjNDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWM5NGM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2VicnNyYzQ4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2VicnNyYzQ4c2VsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2VicnNyYzQ4c2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc4NmVmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3dlYnJzcmM0OHNlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3dlYnJzcmM3Mi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3dlYnJzcmM3Mi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiY2ZjMjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93ZWJyc3JjNzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93aGF0c25ldzQ4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2hhdHNuZXc0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZmI5YmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93aGF0c25ldzQ4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2hhdHNuZXc0OHNlbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3doYXRzbmV3NDhzZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGE4NDNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2hhdHNuZXc0OHNlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3doYXRzbmV3NzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93aGF0c25ldzcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRiZjZmZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3doYXRzbmV3NzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC9iYWNrLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvYmFjay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZDA5MjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC9iYWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvZm9yd2FyZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL2ZvcndhcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmU1OGIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvZm9yd2FyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL292ZXJ2aWV3LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvb3ZlcnZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmM3YjBkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvb3ZlcnZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC9yZXN0b3JlX3dlbGNvbWUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC9yZXN0b3JlX3dlbGNvbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTk3YjIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvcmVzdG9yZV93ZWxjb21lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvc2FtcGxlcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL3NhbXBsZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2YzY2FlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvc2FtcGxlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL3R1dG9yaWFscy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL3R1dG9yaWFscy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzODI2YTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC90dXRvcmlhbHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC93aGF0c25ldy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL3doYXRzbmV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1NmM5OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL3doYXRzbmV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvYmFjay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2JhY2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGQwOTI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvYmFjay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2ZpcnN0ZXBzNDguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9maXJzdGVwczQ4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVhMWFkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2ZpcnN0ZXBzNDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9maXJzdGVwczQ4c2VsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZmlyc3RlcHM0OHNlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMmI0ZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9maXJzdGVwczQ4c2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZmlyc3RlcHM3Mi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2ZpcnN0ZXBzNzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTlhODFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZmlyc3RlcHM3Mi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2ZvcndhcmQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9mb3J3YXJkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJlNThiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2ZvcndhcmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9ob21lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvaG9tZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMDFkMTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9ob21lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZTYyOWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3NDguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldzQ4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODliZTc2Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3NDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldzQ4c2VsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXc0OHNlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZDIxZTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldzQ4c2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXc3Mi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3NzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGQ5YjQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXc3Mi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3Jlc3RvcmVfd2VsY29tZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3Jlc3RvcmVfd2VsY29tZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MzZiY2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9yZXN0b3JlX3dlbGNvbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9yZXR1c2VyNDguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9yZXR1c2VyNDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2VlMzZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvcmV0dXNlcjQ4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvcmV0dXNlcjQ4c2VsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvcmV0dXNlcjQ4c2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ4NTE1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3JldHVzZXI0OHNlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3JldHVzZXI3Mi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3JldHVzZXI3Mi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OGFiYWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9yZXR1c2VyNzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9zYW1wbGVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvc2FtcGxlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OTU4ODQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9zYW1wbGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvc2FtcGxlczQ4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvc2FtcGxlczQ4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDliNTkyNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXM0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXM0OHNlbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXM0OHNlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNzVkOTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9zYW1wbGVzNDhzZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9zYW1wbGVzNzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9zYW1wbGVzNzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmZmMzU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvc2FtcGxlczcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE4ZDdkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFscy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFsczQ4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzNDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGU2YzFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzNDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHM0OHNlbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFsczQ4c2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM1M2UwNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFsczQ4c2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzNzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHM3Mi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOWRiODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHM3Mi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3diNDguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93YjQ4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkyYzQ0NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3diNDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjMTYuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Zjg1MDA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2VicnNyYzE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2VicnNyYzQ4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2VicnNyYzQ4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY3MmE1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmM0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmM0OHNlbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmM0OHNlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwM2NjOTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjNDhzZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjNzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjNzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjk5N2RmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2VicnNyYzcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2hhdHNuZXcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93aGF0c25ldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMjIzMjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93aGF0c25ldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3doYXRzbmV3NDguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93aGF0c25ldzQ4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUwMGQ3YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3doYXRzbmV3NDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93aGF0c25ldzQ4c2VsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2hhdHNuZXc0OHNlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOWZhMGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93aGF0c25ldzQ4c2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2hhdHNuZXc3Mi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3doYXRzbmV3NzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTAwOTNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2hhdHNuZXc3Mi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2FkLXQtcG9ydGFsYXBwbGljYXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9hZC10LXBvcnRhbGFwcGxpY2F0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBjOTRhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2FkLXQtcG9ydGFsYXBwbGljYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9hZC10LXBvcnRhbGFwcGxpY2F0aW9uaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvYWQtdC1wb3J0YWxhcHBsaWNhdGlvbmhvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMDJkMjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9hZC10LXBvcnRhbGFwcGxpY2F0aW9uaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvY29tbXVuaXR5X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2NvbW11bml0eV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDEzMmE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvY29tbXVuaXR5X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2NvbW11bml0eWhvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9jb21tdW5pdHlob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNiMmE1OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2NvbW11bml0eWhvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtY29uZmlncHVibGlzaC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1jb25maWdwdWJsaXNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhNTZjMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1jb25maWdwdWJsaXNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LWNvbmZpZ3B1Ymxpc2hob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtY29uZmlncHVibGlzaGhvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMjg0MTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtY29uZmlncHVibGlzaGhvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1tZXRob2QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtbWV0aG9kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEzZGE0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1tZXRob2QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtbWV0aG9kaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LW1ldGhvZGhvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZDY5MWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtbWV0aG9kaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXByb2Nlc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYjY5OTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1wcm9jZXNzaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXByb2Nlc3Nob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTRjOWNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXByb2Nlc3Nob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcnVwb3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcnVwb3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjg1MWQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXJ1cG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXJ1cG92aG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXJ1cG92aG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAwODFiNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1ydXBvdmhvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi10b3VyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXRvdXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTk1YzdmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXRvdXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtdG91cmhvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi10b3VyaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcxOTcwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi10b3VyaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLXN0ZXBzLW9uZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1zdGVwcy1vbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmZlODI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLXN0ZXBzLW9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1zdGVwcy1vbmVob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtc3RlcHMtb25laG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgzNGY3Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1zdGVwcy1vbmVob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGZfcmVzb3VyY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGZfcmVzb3VyY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTBhOGQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmX3Jlc291cmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmX3Jlc291cmNlaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmX3Jlc291cmNlaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM5OGIzNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZl9yZXNvdXJjZWhvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZlYXR1cmVzX29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZlYXR1cmVzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NGZkNDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mZWF0dXJlc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mZWF0dXJlc2hvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mZWF0dXJlc2hvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmZkZjAzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZmVhdHVyZXNob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2FkdmFwcHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfYWR2YXBwcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYzMyOTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfYWR2YXBwcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9hZHZhcHBzaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2FkdmFwcHNob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjlkZWI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2FkdmFwcHNob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfZGV2d2ViLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2RldndlYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YTU2YzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfZGV2d2ViLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2RldndlYmhvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9kZXZ3ZWJob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTI4NDE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2RldndlYmhvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9maXJzdHN0ZXBzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2ZpcnN0c3RlcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2E1NmMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2ZpcnN0c3RlcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfZmlyc3RzdGVwc2hvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9maXJzdHN0ZXBzaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUyODQxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9maXJzdHN0ZXBzaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2hlbHAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfaGVscC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMWI4NTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfaGVscC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9oZWxwaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2hlbHBob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmJhMjhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2hlbHBob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfaW1wb3J0d2ViLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2ltcG9ydHdlYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MjU0M2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfaW1wb3J0d2ViLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2ltcG9ydHdlYmhvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9pbXBvcnR3ZWJob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2RkY2FmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2ltcG9ydHdlYmhvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9uZXd3ZWIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfbmV3d2ViLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhNTZjMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9uZXd3ZWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfbmV3d2ViaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX25ld3dlYmhvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMjg0MTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfbmV3d2ViaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX292ZXJ2aWV3LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX292ZXJ2aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ5MmY4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9vdmVydmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9vdmVydmlld2hvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9vdmVydmlld2hvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMDZiZDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfb3ZlcnZpZXdob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfcmljaHJlcG9ydHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfcmljaHJlcG9ydHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDZhNTRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3JpY2hyZXBvcnRzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3JpY2hyZXBvcnRzaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3JpY2hyZXBvcnRzaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZhNWFlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9yaWNocmVwb3J0c2hvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9zYW1wbGVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3NhbXBsZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTYwM2NkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3NhbXBsZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfc2FtcGxlc2hvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9zYW1wbGVzaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEwMzBiZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9zYW1wbGVzaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3R1dG9yaWFscy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl90dXRvcmlhbHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzI3ZDVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3R1dG9yaWFscy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl90dXRvcmlhbHNob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfdHV0b3JpYWxzaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM1NzFmOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl90dXRvcmlhbHNob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfd2ViLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3dlYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3N2ViOTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfd2ViLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3dlYmhvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl93ZWJob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mjg2ZGQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3dlYmhvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl93aGF0c25ldy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl93aGF0c25ldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyN2E4ZTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfd2hhdHNuZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfd2hhdHNuZXdob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfd2hhdHNuZXdob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmQ3MzE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3doYXRzbmV3aG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV9zYW1wbGVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV9zYW1wbGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdmNzYyZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2dhbGxlcnlfc2FtcGxlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2dhbGxlcnlfc2FtcGxlc2hvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2dhbGxlcnlfc2FtcGxlc2hvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MDk3YTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9nYWxsZXJ5X3NhbXBsZXNob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9nYWxsZXJ5X3R1dG9yaWFscy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2dhbGxlcnlfdHV0b3JpYWxzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmMDQ1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2dhbGxlcnlfdHV0b3JpYWxzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV90dXRvcmlhbHNob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9nYWxsZXJ5X3R1dG9yaWFsc2hvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmExZTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9nYWxsZXJ5X3R1dG9yaWFsc2hvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFhcHBfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWFwcF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTAwZDUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWFwcF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhYXBwaG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFhcHBob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVlOWY1OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFhcHBob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWFwcGxldF9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhYXBwbGV0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOWE5NTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhYXBwbGV0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFhcHBsZXRob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWFwcGxldGhvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGEzZGI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWFwcGxldGhvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhZGV2X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFkZXZfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY1MjZhMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFkZXZfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWRldmhvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhZGV2aG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YjQ3ZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhZGV2aG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L21pZ3JhdGVfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbWlncmF0ZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzJmZTg4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbWlncmF0ZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9taWdyYXRlaG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L21pZ3JhdGVob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzNGUyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L21pZ3JhdGVob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbmV3X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L25ld19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDZiODFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbmV3X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L25ld2hvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9uZXdob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkzZTYzYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L25ld2hvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWMwYjI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9maXJzdHN0ZXBzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9maXJzdHN0ZXBzaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9maXJzdHN0ZXBzaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThjMDU1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwc2hvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfaGVscC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfaGVscC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZmI0NjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2hlbHAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2hlbHBob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2hlbHBob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzI0ZjRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9oZWxwaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9tb3ZpZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfbW92aWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2Y5OTllLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9tb3ZpZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfbW92aWVob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX21vdmllaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlNTdlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfbW92aWVob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX292ZXJ2aWV3LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9vdmVydmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMWJiMTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX292ZXJ2aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9vdmVydmlld2hvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfb3ZlcnZpZXdob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjI3ODk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9vdmVydmlld2hvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfd2ViLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV93ZWIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzU5ODdhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV93ZWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX3dlYmhvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfd2ViaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkxOTdkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfd2ViaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV93aGF0c25ldy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfd2hhdHNuZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWJhZmI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV93aGF0c25ldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfd2hhdHNuZXdob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX3doYXRzbmV3aG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IwZTUxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfd2hhdHNuZXdob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wbHVnaW5fb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGx1Z2luX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MmQyYzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wbHVnaW5fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGx1Z2luaG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BsdWdpbmhvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGU4Y2NjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGx1Z2luaG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3JjcGFwcF9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9yY3BhcHBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMwYWI1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3JjcGFwcF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9yY3BhcHBob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcmNwYXBwaG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZDgwYTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9yY3BhcHBob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2FtcGxlcHVycF9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVwdXJwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZTU2ZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVwdXJwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXB1cnBob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2FtcGxlcHVycGhvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQ4MWUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2FtcGxlcHVycGhvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVyZWRfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2FtcGxlcmVkX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZDEwNGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVyZWRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2FtcGxlcmVkaG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXJlZGhvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODdkNmIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2FtcGxlcmVkaG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NjcmlwdF9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zY3JpcHRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ4YjdjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NjcmlwdF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zY3JpcHRob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2NyaXB0aG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NzIwM2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zY3JpcHRob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc3d0YXBwX29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3N3dGFwcF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmE5YTMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc3d0YXBwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3N3dGFwcGhvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zd3RhcHBob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRmYmI1ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3N3dGFwcGhvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X21ldGhjb250X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfbWV0aGNvbnRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU5YTkwMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfbWV0aGNvbnRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9tZXRoY29udGhvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X21ldGhjb250aG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZDEyMTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X21ldGhjb250aG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfbmF2dWlfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9uYXZ1aV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTM5YWIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9uYXZ1aV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X25hdnVpaG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfbmF2dWlob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYxMDFhNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfbmF2dWlob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9wdWJleHBfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9wdWJleHBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIyZmZjNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfcHViZXhwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfcHViZXhwaG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfcHViZXhwaG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MWIxYTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3B1YmV4cGhvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3JlbWV0aGNvbnRfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9yZW1ldGhjb250X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmN2QyOGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3JlbWV0aGNvbnRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9yZW1ldGhjb250aG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfcmVtZXRoY29udGhvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmQ1N2Q2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9yZW1ldGhjb250aG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3Rfd29ya3Byb2Nfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF93b3JrcHJvY19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDI2NzQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF93b3JrcHJvY19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3dvcmtwcm9jaG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3Rfd29ya3Byb2Nob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkxMDc4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3Rfd29ya3Byb2Nob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdGVhbXN1cF9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90ZWFtc3VwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YmQ3ZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90ZWFtc3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RlYW1zdXBob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdGVhbXN1cGhvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmRmODE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdGVhbXN1cGhvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC91cGRhdGVzX29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3VwZGF0ZXNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYwOGIzMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3VwZGF0ZXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdXBkYXRlc2hvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC91cGRhdGVzaG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYTBhY2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC91cGRhdGVzaG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3diYmFzaWNzX29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3diYmFzaWNzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiODI1NjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC93YmJhc2ljc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC93YmJhc2ljc2hvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC93YmJhc2ljc2hvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzBiZTljLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvd2JiYXNpY3Nob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvYmFja2dyb3VuZC5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL2JhY2tncm91bmQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjlmY2YzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvYmFja2dyb3VuZC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL2JhY2tncm91bmRfZWNsaXBzZS5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL2JhY2tncm91bmRfZWNsaXBzZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2OWZjZjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9iYWNrZ3JvdW5kX2VjbGlwc2UuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9iYWNrZ3JvdW5kX29sZC5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL2JhY2tncm91bmRfb2xkLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYwYWNlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL2JhY2tncm91bmRfb2xkLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvYnJhbmRtYXJrLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvYnJhbmRtYXJrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNmMjVmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL2JyYW5kbWFyay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL2JyYW5kbWFya19lY2xpcHNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvYnJhbmRtYXJrX2VjbGlwc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2YyNWY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvYnJhbmRtYXJrX2VjbGlwc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9kb3RzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvZG90cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5YjkzZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9kb3RzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2Uvc3RhbmRieV93b3JkbWFyay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL3N0YW5kYnlfd29yZG1hcmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODdiMTUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2Uvc3RhbmRieV93b3JkbWFyay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3N3dC9mb3JtX2Jhbm5lci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3N3dC9mb3JtX2Jhbm5lci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYmMwYjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9zd3QvZm9ybV9iYW5uZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9tYy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL21jLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlmMDQ1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL21jLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvbWNfdnNfcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL21jX3ZzX3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGNmMWMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvbWNfdnNfcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL21ldGhvZGF1dGhvcmluZy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9tZXRob2RhdXRob3JpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQwNjBkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL21ldGhvZGF1dGhvcmluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPGh0bWw+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxoZWFkPgotPHRpdGxlPk1ldGhvZCBDb250ZW50IEF1dGhvcmluZyBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMz5NZXRob2QgQ29udGVudCBBdXRob3JpbmcgT3ZlcnZpZXc8L2gzPgotPHA+TWV0aG9kIGNvbnRlbnQgZGVzY3JpYmVzIHJvbGVzLCB0aGUgdGFza3MgdGhhdCB0aGV5IHBlcmZvcm0sIHRoZSB3b3JrIHByb2R1Y3RzCi0gIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkIGJ5IHRob3NlIHRhc2tzLCBhbmQgc3VwcG9ydGluZyBndWlkYW5jZS48L3A+Ci08cD48aW1nIHNyYz0ibWMuZ2lmIj48L3A+Ci08cD5UaGUgZmlndXJlIGFib3ZlIGRlcGljdHMgdHlwaWNhbCBzb3VyY2VzIGZvciBtZXRob2QgY29udGVudCwgYXMgd2VsbCBhcyBob3cKLSAgdGhlIG1ldGhvZCBjb250ZW50IGlzIHJlcHJlc2VudGVkIGluIFJNQy4gTWFueSBkZXZlbG9wbWVudCBtZXRob2RzIGFyZSBkZXNjcmliZWQKLSAgaW4gcHVibGljYXRpb25zIHN1Y2ggYXMgYm9va3MsIGFydGljbGVzLCB0cmFpbmluZyBtYXRlcmlhbCwgc3RhbmRhcmRzIGFuZCByZWd1bGF0aW9ucywKLSAgYW5kIG90aGVyIGZvcm1zIG9mIGRvY3VtZW50YXRpb24uIFRoZXNlIHNvdXJjZXMgdXN1YWxseSBkb2N1bWVudCBtZXRob2RzIGJ5Ci0gIHByb3ZpZGluZyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIGZvciBhIHBhcnRpY3VsYXIgd2F5IG9mIGFjaGlldmluZyBhIHNwZWNpZmljCi0gIGRldmVsb3BtZW50IGdvYWwgdW5kZXIgZ2VuZXJhbCBjaXJjdW1zdGFuY2VzLiBTb21lIGV4YW1wbGVzIGFyZTogdHJhbnNmb3JtaW5nCi0gIGEgcmVxdWlyZW1lbnRzIGRvY3VtZW50IGludG8gYW4gYW5hbHlzaXMgbW9kZWw7IGRlZmluaW5nIGFuIGFyY2hpdGVjdHVyYWwgbWVjaGFuaXNtCi0gIGJhc2VkIG9uIGZ1bmN0aW9uYWwgYW5kIG5vbi1mdW5jdGlvbmFsIHJlcXVpcmVtZW50czsgY3JlYXRpbmcgYSBwcm9qZWN0IHBsYW4KLSAgZm9yIGEgZGV2ZWxvcG1lbnQgaXRlcmF0aW9uOyBkZWZpbmluZyBhIHF1YWxpdHkgYXNzdXJhbmNlIHBsYW4gZm9yIGZ1bmN0aW9uYWwKLSAgcmVxdWlyZW1lbnRzOyByZWRlc2lnbmluZyBhIGJ1c2luZXNzIG9yZ2FuaXphdGlvbiBiYXNlZCBvbiBhIG5ldyBzdHJhdGVnaWMgZGlyZWN0aW9uLAotICBhbmQgc28gb24uPC9wPgotPHA+Uk1DIHRha2VzIGNvbnRlbnQgc3VjaCBhcyB0aGF0IGRlc2NyaWJlZCBhYm92ZSwgYW5kIHN0cnVjdHVyZXMgaXQgaW4gYSBzcGVjaWZpYwotICBzY2hlbWEgb2Ygcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UuIFRoaXMgc2NoZW1hIHN1cHBvcnRzIHRoZQotICBvcmdhbml6YXRpb24gb2YgbGFyZ2UgYW1vdW50cyBvZiBkZXNjcmlwdGlvbnMgZm9yIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4KLSAgU3VjaCBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGRvIG5vdCBoYXZlIHRvIGJlIGxpbWl0ZWQgdG8gc29mdHdhcmUgZW5naW5lZXJpbmcsCi0gIGJ1dCBjYW4gYWxzbyBjb3ZlciBvdGhlciBkZXNpZ24gYW5kIGVuZ2luZWVyaW5nIGRpc2NpcGxpbmVzIHN1Y2ggYXMgbWVjaGFuaWNhbAotICBlbmdpbmVlcmluZywgYnVzaW5lc3MgdHJhbnNmb3JtYXRpb24sIHNhbGVzIGN5Y2xlcywgYW5kIHNvIG9uLjwvcD4KLTxwPiBUaGUgUk1DIHNjcmVlbiBjYXB0dXJlIGluIHRoZSBmaWd1cmUgYWJvdmUgc2hvd3MgaG93IHN1Y2ggbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMKLSAgYXJlIG9yZ2FuaXplZCBpbiB0cmVlIGJyb3dzZXJzIG9uIHRoZSBsZWZ0LiBUaGVzZSB0cmVlIGJyb3dzZXJzLCBzaW1pbGFyIHRvCi0gIGEgbGlicmFyeSwgcHJvdmlkZSBkaWZmZXJlbnQgaW5kZXhlcyBvZiB0aGUgYXZhaWxhYmxlIGVsZW1lbnRzIGZvciByYXBpZCBhY2Nlc3MuCi0gIFRoZSBzY3JlZW4gY2FwdHVyZSBzaG93cyBvbiB0aGUgcmlnaHQgYW4gZXhhbXBsZSBvZiBhIHRhc2sgcHJlc2VudGF0aW9uLiBUaGlzCi0gIHRhc2sgcHJlc2VudGF0aW9uIGRlZmluZXMgdGhlIHRhc2sgaW4gdGVybXMgb2Ygc3RlcHMgdGhhdCBuZWVkIHRvIGJlIHBlcmZvcm1lZAotICB0byBhY2hpZXZlIHRoZSB0YXNrJ3MgcHVycG9zZS4gWW91IGNhbiBzZWUgdGhhdCB0aGUgdGFzayBoYXMgdmFyaW91cyByZWxhdGlvbnNoaXBzLAotICBzdWNoIGFzIHJlbGF0aW9uc2hpcHMgdG8gcGVyZm9ybWluZyByb2xlcyBhcyB3ZWxsIGFzIHdvcmsgcHJvZHVjdHMgdGhhdCBzZXJ2ZQotICBhcyBpbnB1dHMgYW5kIG91dHB1dHMgdG8gdGhlIHRhc2suIEZpbmQgb3V0IG1vcmUgZGV0YWlscyBvbiB0YXNrcywgcm9sZSwgYW5kCi0gIHdvcmsgcHJvZHVjdHMgaW4gdGhlIG9ubGluZSBoZWxwIDxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2RhdXRob3JpbmdvdmVydmlldy5odG1sIj5oZXJlPC9hPi4KLSAgSW4gYWRkaXRpb24gdG8gcm9sZXMsIHRhc2tzLCBhbmQgd29yayBwcm9kdWN0cywgUk1DIHN1cHBvcnRzIHRoZSBhZGRpdGlvbiBvZgotICBndWlkYW5jZSBlbGVtZW50cy4gR3VpZGFuY2UgYXJlIHN1cHBsZW1lbnRhcnkgZnJlZS1mb3JtIGRvY3VtZW50YXRpb24gc3VjaCBhcwotICB3aGl0ZXBhcGVycywgY29uY2VwdCBkZXNjcmlwdGlvbnMsIGd1aWRlbGluZXMsIHRlbXBsYXRlcywgZXhhbXBsZXMsIGFuZCBzbyBvbi48L3A+Ci08cD5STUMgcHJvdmlkZXMgdmFyaW91cyBmb3JtLWJhc2VkIGVkaXRvcnMgdG8gY3JlYXRlIG5ldyBtZXRob2QgY29udGVudCBlbGVtZW50cy4KLSAgRG9jdW1lbnQgeW91ciB0YXNrLCByb2xlcywgd29yayBwcm9kdWN0cywgYW5kIGd1aWRhbmNlIGVsZW1lbnRzIHVzaW5nIGludHVpdGl2ZQotICByaWNoLXRleHQgZWRpdG9ycyB0aGF0IGFsbG93IHlvdSB0byBjb3B5IGFuZCBwYXN0ZSB0ZXh0IGZyb20gb3RoZXIgc291cmNlcyBzdWNoCi0gIGFzIHdlYiBwYWdlcyBvciBkb2N1bWVudHMuIFVzZSBzaW1wbGUgZGlhbG9ncyB0byBlc3RhYmxpc2ggcmVsYXRpb25zaGlwcyBiZXR3ZWVuCi0gIGNvbnRlbnQgZWxlbWVudHMuPC9wPgotPHA+Uk1DIG9yZ2FuaXplcyBjb250ZW50IGluIHBoeXNpY2FsIGNvbnRlbnQgcGFja2FnZXMgdGhhdCBhbGxvdyB5b3UgdG8gbWFuYWdlCi0gIHlvdXIgY29udGVudCBpbiBjb25maWd1cmFibGUgdW5pdHMuIFJNQyBhbHNvIGFsbG93cyB5b3UgdG8gY2F0ZWdvcml6ZSB5b3VyIGNvbnRlbnQKLSAgYmFzZWQgb24gYSBzZXQgb2YgcHJlZGVmaW5lZCBjYXRlZ29yaWVzIChmb3IgZXhhbXBsZSwgY2F0ZWdvcml6ZSB5b3VyIHRhc2tzCi0gIGludG8gZGV2ZWxvcG1lbnQgZGlzY2lwbGluZXMsIG9yIHlvdXIgd29yayBwcm9kdWN0cyBpbnRvIGRvbWFpbnMpIG9yIGNyZWF0ZQotICB5b3VyIG93biBjYXRlZ29yaXphdGlvbiBzY2hlbWVzIGZvciB5b3VyIGNvbnRlbnQgd2l0aCB5b3VyIG93biB1c2VyLWRlZmluZWQKLSAgY2F0ZWdvcmllcyB0aGF0IGFsbG93IHlvdSB0byBpbmRleCBjb250ZW50IGluIGFueSB3YXkgeW91IHdhbnQuPC9wPgotPHA+Rm9yIG1vcmUgZGV0YWlscyBvbiBtZXRob2QgY29udGVudCBhdXRob3Jpbmcgc2VlIHRoZSBvbmxpbmUgaGVscDo8L3A+Ci08ZGl2IGFsaWduPSJsZWZ0Ij4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2RhdXRob3JpbmdvdmVydmlldy5odG1sIj5NZXRob2QKLSAgICAgIEF1dGhvcmluZyBPdmVydmlldzwvYT48L2xpPgotPC91bD4KLTwvZGl2PgotPHA+Jm5ic3A7PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9vdmVydmlldy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9vdmVydmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2ZkYzllLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvb3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi08aHRtbD4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGhlYWQ+Ci08dGl0bGU+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMz5JbnRyb2R1Y3Rpb24gdG8gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayAoRVBGKSBDb21wb3NlcjwvaDM+Ci08cD5XZWxjb21lIHRvIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgKEVQRikgQ29tcG9zZXIuIEVQRiBDb21wb3NlciBpcyBhIHRvb2wgcGxhdGZvcm0gdGhhdCBlbmFibGVzCi0gIHByb2Nlc3MgZW5naW5lZXJzIGFuZCBtYW5hZ2VycyB0byBpbXBsZW1lbnQsIGRlcGxveSwgYW5kIG1haW50YWluIHByb2Nlc3NlcwotICBmb3Igb3JnYW5pemF0aW9ucyBvciBpbmRpdmlkdWFsIHByb2plY3RzLiBUeXBpY2FsbHksIHR3byBrZXkgcHJvYmxlbXMgbmVlZCB0bwotICBiZSBhZGRyZXNzZWQgdG8gc3VjY2Vzc2Z1bGx5IGRlcGxveSBuZXcgcHJvY2Vzc2VzLjwvcD4KLTxwPiBGaXJzdCwgZGV2ZWxvcG1lbnQgdGVhbXMgbmVlZCB0byBiZSBlZHVjYXRlZCBvbiB0aGUgbWV0aG9kcyBhcHBsaWNhYmxlIHRvCi0gIHRoZSByb2xlcyB0aGF0IHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gU29mdHdhcmUgZGV2ZWxvcGVycyB0eXBpY2FsbHkgbmVlZAotICB0bwotICBsZWFybgotICBob3cKLSAgdG8KLSAgZG8gYW5hbHlzaXMgYW5kIGRlc2lnbiwgdGVzdGVycyBuZWVkIHRvIGxlYXJuIGhvdyB0byB0ZXN0IGltcGxlbWVudGF0aW9ucyBhZ2FpbnN0Ci0gICByZXF1aXJlbWVudHMsIG1hbmFnZXJzIG5lZWQgdG8gbGVhcm4gaG93IHRvIG1hbmFnZSB0aGUgcHJvamVjdCBzY29wZSBhbmQgY2hhbmdlLAotCi0gIGFuZCBzbyBvbi4gU29tZSBvcmdhbml6YXRpb25zIGFzc3VtZSB0aGF0IGRldmVsb3BlcnMgaW1wbGljaXRseSBrbm93IGhvdyB0bwotICAgZG8gc3VjaCB3b3JrIHdpdGhvdXQgZG9jdW1lbnRpbmcgdGhlaXIgbWV0aG9kcywgYnV0IG1hbnkgb3JnYW5pemF0aW9ucyB3YW50Ci0KLSAgdG8gZXN0YWJsaXNoIGNvbW1vbiBhbmQgcmVndWxhdGVkIHByYWN0aWNlcywgdG8gZHJpdmUgc3BlY2lmaWMgaW1wcm92ZW1lbnQKLSAgb2JqZWN0aXZlcywgIGFuZCB0byBtZWV0IGNvbXBsaWFuY2Ugc3RhbmRhcmRzLjwvcD4KLTxwPiBTZWNvbmQsIGRldmVsb3BtZW50IHRlYW1zIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdG8gYXBwbHkgdGhlc2UgbWV0aG9kcyB0aHJvdWdob3V0Ci0gIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiBUaGF0IGlzLCB0aGV5IG5lZWQgdG8gZGVmaW5lIG9yIHNlbGVjdCBhIGRldmVsb3BtZW50Ci0gIHByb2Nlc3MuIEZvcgotCi0gIGV4YW1wbGUsIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50IG1ldGhvZHMgaGF2ZSB0byBiZSBhcHBsaWVkIGRpZmZlcmVudGx5IGluCi0gIGVhcmx5ICBwaGFzZXMgb2YgYSBwcm9qZWN0IHdoZXJlIHRoZSBmb2N1cyBpcyBvbiBlbGljaXRhdGlvbiBvZiBzdGFrZWhvbGRlcgotICBuZWVkcyBhbmQKLSAgcmVxdWlyZW1lbnRzIGFuZCBzY29waW5nIGEgdmlzaW9uLCB0aGFuIGluIGxhdGVyIHBoYXNlcyB3aGVyZSB0aGUgZm9jdXMgaXMKLSAgb24gIG1hbmFnaW5nIHJlcXVpcmVtZW50cyB1cGRhdGVzIGFuZCBjaGFuZ2VzIGFuZCBwZXJmb3JtaW5nIGltcGFjdCBhbmFseXNpcwotICBvZgotICB0aGVzZSByZXF1aXJlbWVudHMgY2hhbmdlcy4gVGVhbXMgYWxzbyBuZWVkIGNsZWFyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZQotICBkaWZmZXJlbnQgIHRhc2tzIG9mIHRoZSBtZXRob2RzIHJlbGF0ZSB0byBlYWNoIG90aGVyLCBmb3IgZXhhbXBsZSwgaG93IHRoZQotICBjaGFuZ2UgbWFuYWdlbWVudAotICBtZXRob2QgaW1wYWN0cyB0aGUgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQgbWV0aG9kIGFzIHdlbGwgYXMgcmVncmVzc2lvbiB0ZXN0aW5nCi0gICBtZXRob2QgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlLiBFdmVuIHNlbGYtb3JnYW5pemluZyB0ZWFtcyBuZWVkIHRvIGRlZmluZQotICBhCi0gIHByb2Nlc3MgdGhhdCBnaXZlcyBhdCBtaW5pbXVtIHNvbWUgZ3VpZGFuY2Ugb24gaG93IHRoZSBkZXZlbG9wbWVudCB3aWxsIGJlCi0gIHNjb3BlZCAgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlLCB3aGVuIG1pbGVzdG9uZXMgd2lsbCBiZSBhY2hpZXZlZCBhbmQgdmVyaWZpZWQsCi0gIGFuZAotICBzbyBvbi4gPC9wPgotPHA+VG8gdGhhdCBlbmQsIEVQRiBDb21wb3NlciBoYXMgdHdvIG1haW4gcHVycG9zZXM6IDwvcD4KLTxkaXYgYWxpZ249ImxlZnQiPjx1bD4KLSAgPGxpPlRvIHByb3ZpZGUgYSBrbm93bGVkZ2UgYmFzZSBvZiBpbnRlbGxlY3R1YWwgY2FwaXRhbCB3aGljaCB5b3UgY2FuIGJyb3dzZSwKLSAgICBtYW5hZ2UgYW5kIGRlcGxveS4gVGhpcyBjb250ZW50IGNhbiBpbmNsdWRlIGV4dGVybmFsbHkgZGV2ZWxvcGVkIGNvbnRlbnQsCi0gICAgYW5kLCBtb3JlIGltcG9ydGFudGx5LCBjYW4gaW5jbHVkZSB5b3VyIG93biBjb250ZW50IGluY2x1ZGluZyBvZiB3aGl0ZXBhcGVycywKLSAgICBndWlkZWxpbmVzLCB0ZW1wbGF0ZXMsIHByaW5jaXBsZXMsIGJlc3QgcHJhY3RpY2VzLCBpbnRlcm5hbCBwcm9jZWR1cmVzIGFuZAotICAgIHJlZ3VsYXRpb25zLCB0cmFpbmluZyBtYXRlcmlhbCwgYW5kIGFueSBvdGhlciBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB5b3VyCi0gICAgbWV0aG9kcy4gVGhpcyBrbm93bGVkZ2UgYmFzZSBjYW4gdXNlZCBmb3IgcmVmZXJlbmNlIGFuZCBlZHVjYXRpb24uIEl0IGFsc28KLSAgICBmb3JtcyB0aGUgYmFzaXMgZm9yIGRldmVsb3BpbmcgcHJvY2Vzc2VzICh0aGUgc2Vjb25kIHB1cnBvc2UpLiBFUEYgQ29tcG9zZXIgaXMgZGVzaWduZWQKLSAgICB0byBiZSBhIGNvbnRlbnQgbWFuYWdlbWVudCBzeXN0ZW0gdGhhdCBwcm92aWRlcyBhIGNvbW1vbiBtYW5hZ2VtZW50IHN0cnVjdHVyZQotICAgIGFuZCBsb29rIGFuZCBmZWVsIGZvciBhbGwgb2YgeW91ciBjb250ZW50LCByYXRoZXIgdGhhbiBiZWluZyBhIGRvY3VtZW50IG1hbmFnZW1lbnQKLSAgICBzeXN0ZW0gaW4gd2hpY2ggeW91IHdvdWxkIHN0b3JlIGFuZCBhY2Nlc3MgaGFyZCB0byBtYWludGFpbiBsZWdhY3kgZG9jdW1lbnRzCi0gICAgYWxsIGluIHRoZWlyIG93biBzaGFwZXMgYW5kIGZvcm1hdHMuIEFsbCBjb250ZW50IG1hbmFnZWQgaW4gRVBGIENvbXBvc2VyIGNhbiBiZSBwdWJsaXNoZWQKLSAgICB0byBodG1sIGFuZCBkZXBsb3llZCB0byBXZWIgc2VydmVycyBmb3IgZGlzdHJpYnV0ZWQgdXNhZ2UuPGJyPgotICA8L2xpPgotICA8bGk+VG8gcHJvdmlkZSBwcm9jZXNzIGVuZ2luZWVyaW5nIGNhcGFiaWxpdGllcyBieSBzdXBwb3J0aW5nIHByb2Nlc3MgZW5naW5lZXJzCi0gICAgYW5kIHByb2plY3QgbWFuYWdlcnMgaW4gc2VsZWN0aW5nLCB0YWlsb3JpbmcsIGFuZCByYXBpZGx5IGFzc2VtYmxpbmcgcHJvY2Vzc2VzCi0gICAgZm9yIHRoZWlyIGNvbmNyZXRlIGRldmVsb3BtZW50IHByb2plY3RzLiBFUEYgQ29tcG9zZXIgcHJvdmlkZXMgY2F0YWxvZ3Mgb2YgcHJlLWRlZmluZWQKLSAgICBwcm9jZXNzZXMgZm9yIHR5cGljYWwgcHJvamVjdCBzaXR1YXRpb25zIHRoYXQgY2FuIGJlIGFkYXB0ZWQgdG8gaW5kaXZpZHVhbAotICAgIG5lZWRzLiBJdCBhbHNvIHByb3ZpZGVzIHByb2Nlc3MgYnVpbGRpbmcgYmxvY2tzLCBjYWxsZWQgY2FwYWJpbGl0eSBwYXR0ZXJucywKLSAgICB0aGF0IHJlcHJlc2VudCBiZXN0IGRldmVsb3BtZW50IHByYWN0aWNlcyBmb3Igc3BlY2lmaWMgZGlzY2lwbGluZXMsIHRlY2hub2xvZ2llcywKLSAgICBvciBtYW5hZ2VtZW50IHN0eWxlcy4gVGhlc2UgYnVpbGRpbmcgYmxvY2tzIGZvcm0gYSB0b29sa2l0IGZvciBxdWljayBhc3NlbWJseQotICAgIG9mIHByb2Nlc3NlcyBiYXNlZCBvbiBwcm9qZWN0LXNwZWNpZmljIG5lZWRzLiBFUEYgQ29tcG9zZXIgYWxzbyBhbGxvd3MgeW91IHRvIHNldCB1cAotICAgIHlvdXIgb3duIG9yZ2FuaXphdGlvbi1zcGVjaWZpYyBjYXBhYmlsaXR5IHBhdHRlcm4gbGlicmFyaWVzLiBGaW5hbGx5LCB0aGUKLSAgICBwcm9jZXNzZXMgY3JlYXRlZCB3aXRoIEVQRiBDb21wb3NlciBjYW4gYmUgcHVibGlzaGVkIGFuZCBkZXBsb3llZCBhcyBXZWIgc2l0ZXMuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxoMz5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyJ3MgS2V5IENhcGFiaWxpdGllczwvaDM+Ci08cD5JQk0gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBwcm92aWRlcyB0aGUgZm9sbG93aW5nIG5ldyBrZXkgY2FwYWJpbGl0aWVzOjwvcD4KLSAgPGRpdiBhbGlnbj0ibGVmdCI+Ci08dWw+Ci0gIDxsaT4gUHJvdmlkZXMgY29tcGxldGVseSByZWRlc2lnbmVkIHRvb2xzIGZvciBhdXRob3JpbmcsIGNvbmZpZ3VyaW5nLCB2aWV3aW5nLAotICAgIGFuZCBwdWJsaXNoaW5nIGRldmVsb3BtZW50IHByb2Nlc3Nlcy48L2xpPgotICA8bGk+IFByb3ZpZGVzIGp1c3QtaW4tdGltZSBnZW5lcmF0aW9uIG9mIHB1YmxpY2F0aW9uIHByZXZpZXdzIGluIGRlZGljYXRlZCBicm93c2luZwotICAgIHBlcnNwZWN0aXZlIHRoYXQgYWxsb3dzIHJhcGlkIGNvbmZpZ3VyYXRpb24gc3dpdGNoaW5nLjwvbGk+Ci0gIDxsaT4gTWFuYWdlcyBtZXRob2QgY29udGVudCB1c2luZyBzaW1wbGUgZm9ybS1iYXNlZCB1c2VyIGludGVyZmFjZXMuIFRoZXJlZm9yZSwKLSAgICBVTUwgbW9kZWxpbmcgc2tpbGxzIGFyZSBubyBsb25nZXIgcmVxdWlyZWQuPC9saT4KLSAgPGxpPiBQcm92aWRlcyBpbnR1aXRpdmUgcmljaCB0ZXh0IGVkaXRvcnMgZm9yIGNyZWF0aW5nIGlsbHVzdHJhdGl2ZSBjb250ZW50Ci0gICAgZGVzY3JpcHRpb25zLiBFZGl0b3JzIGFsbG93IHVzZSBvZiBzdHlsZXMsIGltYWdlcywgdGFibGVzLCBoeXBlcmxpbmtzLCBhbmQKLSAgICBkaXJlY3QgaHRtbCBlZGl0aW5nLjwvbGk+Ci0gIDxsaT5BbGxvd3MgY3JlYXRpbmcgcHJvY2Vzc2VzIHdpdGggYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3JzIGFuZCB3b3JrZmxvdwotICAgIGRpYWdyYW1zIHRocm91Z2ggdXNlIG9mIG11bHRpLXByZXNlbnRhdGlvbiBwcm9jZXNzIGVkaXRvcnMuIEJyZWFrZG93biBzdHJ1Y3R1cmUKLSAgICBlZGl0b3Igc3VwcG9ydHMgZGlmZmVyZW50IHByb2Nlc3Mgdmlld3M6IHdvcmstYnJlYWtkb3duIHZpZXcsIHdvcmsgcHJvZHVjdAotICAgIHVzYWdlIHZpZXcsIGFuZCB0ZWFtIGFsbG9jYXRpb24gdmlldy4gRVBGIENvbXBvc2VyIGF1dG9tYXRpY2FsbHkgc3luY2hyb25pemVzIGFsbCBwcmVzZW50YXRpb25zCi0gICAgd2l0aCBwcm9jZXNzIGNoYW5nZXMuIDwvbGk+Ci0gIDxsaT5Qcm92aWRlcyBzdXBwb3J0IGZvciBtYW55IGFsdGVybmF0aXZlIGxpZmVjeWNsZQotICAgIG1vZGVscy4gRm9yIGV4YW1wbGUsIHdhdGVyZmFsbCwgaW5jcmVtZW50YWwsIG9yIGl0ZXJhdGl2ZSBtb2RlbHMgY2FuIGJlIGNyZWF0ZWQKLSAgICB3aXRoIHRoZSBzYW1lIG92ZXJsYXBwaW5nIG1ldGhvZCBjb250ZW50LjwvbGk+Ci0gIDxsaT5JbXByb3ZlZCByZXVzZSBhbmQgZXh0ZW5zaWJpbGl0eSBjYXBhYmlsaXRpZXMuIFRoZSBwbHVnLWluIG1lY2hhbmlzbXMgZnJvbQotICAgIHBhc3QgdmVyc2lvbnMgaGF2ZSBiZWVuIGV4dGVuZGVkIHRvIHN1cHBvcnQgZXh0ZW5zaW9ucyBmb3IgYnJlYWtkb3duIHN0cnVjdHVyZXMuPC9saT4KLSAgPGxpPlN1cHBvcnRzIHJldXNhYmxlIGR5bmFtaWNhbGx5LWxpbmtlZCBwcm9jZXNzIHBhdHRlcm5zIG9mIGJlc3QgcHJhY3RpY2VzCi0gICAgZm9yIHJhcGlkIHByb2Nlc3MgYXNzZW1ibHkgdmlhIGRyYWctYW5kLWRyb3AuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxoMz5LZXkgVGVybWlub2xvZ3kgYW5kIENvbmNlcHRzPC9oMz4KLTxwPlRvIGVmZmVjdGl2ZWx5IHdvcmsgd2l0aCBFUEYgQ29tcG9zZXIsIHlvdSBuZWVkIHRvIHVuZGVyc3RhbmQgYSBmZXcgY29uY2VwdHMKLSAgdGhhdCBhcmUgdXNlZCB0byBvcmdhbml6ZSB0aGUgY29udGVudC4gVGhlIHBhZ2VzIDxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2RhdXRob3JpbmdvdmVydmlldy5odG1sIj5NZXRob2QKLSAgQ29udGVudCBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+IGFuZCA8YSBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiPlByb2Nlc3MKLSAgQXV0aG9yaW5nIE92ZXJ2aWV3PC9hPiBjb250YWluIG1vcmUgZGV0YWlsIGFuZCBjb25jcmV0ZSBleGFtcGxlcyBvZiBob3cgdG8gd29yawotICBpbiB0aGUgdG9vbC4gVGhpcyBwYWdlIHByb3ZpZGVzIHlvdSB3aXRoIGEgZ2VuZXJhbCBvdmVydmlldyBvZiB0aGVzZSBjb25jZXB0cy48L3A+Ci08cD5UaGUgbW9zdCBmdW5kYW1lbnRhbCBwcmluY2lwbGUgaW4gRVBGIENvbXBvc2VyIGlzIHRoZSBzZXBhcmF0aW9uIG9mIHJldXNhYmxlIGNvcmUgbWV0aG9kCi0gIGNvbnRlbnQgZnJvbSBpdHMgYXBwbGljYXRpb24gaW4gcHJvY2Vzc2VzLiBUaGlzIGRpcmVjdGx5IHJlbGF0ZXMgYmFjayB0byB0aGUKLSAgdHdvIHB1cnBvc2VzIG9mIEVQRiBDb21wb3NlciBkZXNjcmliZWQgaW4gdGhlIGZpcnN0IHNlY3Rpb24uIEFsbW9zdCBhbGwgb2YgRVBGIENvbXBvc2VyJ3MgY29uY2VwdHMKLSAgYXJlIGNhdGVnb3JpemVkIGFsb25nIHRoaXMgc2VwYXJhdGlvbi4gTWV0aG9kIGNvbnRlbnQgZGVzY3JpYmVzIHdoYXQgaXMgdG8gYmUKLSAgcHJvZHVjZWQsIHRoZSBuZWNlc3Nhcnkgc2tpbGxzIHJlcXVpcmVkIGFuZCB0aGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBkZXNjcmliaW5nCi0gIGhvdyBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQuIFRoZXNlIG1ldGhvZCBjb250ZW50IGRlc2NyaXB0aW9ucwotICBhcmUgaW5kZXBlbmRlbnQgb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuIFByb2Nlc3NlcyBkZXNjcmliZSB0aGUgZGV2ZWxvcG1lbnQKLSAgbGlmZWN5Y2xlLiBQcm9jZXNzZXMgdGFrZSB0aGUgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkCi0gIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLjwvcD4KLTxwPjxpbWcgc3JjPSJ1bWFfaHVtcC5naWYiPjwvcD4KLTxwPlRoZSBmaWd1cmUgYWJvdmUgc2hvd3MgaG93IHRoaXMgc2VwYXJhdGlvbiBpcyBkZXBpY3RlZCBpbiBCYXNpYyBVbmlmaWVkCi0gIFByb2Nlc3MuIE1ldGhvZCBjb250ZW50LCBkZXNjcmliaW5nIGhvdyBkZXZlbG9wbWVudCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCwKLSAgaXMgY2F0ZWdvcml6ZWQgYnkgZGlzY2lwbGluZXMgYWxvbmcgdGhlIHktYXhpcyBvZiB0aGUgZGlhZ3JhbS4gVGhlIHdvcmsgZGVzY3JpYmVkCi0gIGluIGEgcHJvY2VzcyBpcyBzZWVuIGFsb25nIHRoZSB4LWF4aXMgcmVwcmVzZW50aW5nIHRoZSB0aW1lbGluZS4gVGhpcyBpcyB0aGUKLSAgbGlmZWN5Y2xlIG9mIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gSXQgZXhwcmVzc2VzIHdoZW4gd2hhdCB3b3JrIHdpbGwgYmUgcGVyZm9ybWVkLgotICBUaGUgZ3JhcGggaW4gdGhlIGlsbHVzdHJhdGlvbiByZXByZXNlbnRzIGFuIGVzdGltYXRlZCB3b3JrbG9hZCBmb3IgZWFjaCBkaXNjaXBsaW5lLgotICBBcyB5b3Ugc2VlLCBmb3IgZXhhbXBsZSwgb25lIG5ldmVyIHN0b3BzIHdvcmtpbmcgb24gcmVxdWlyZW1lbnRzIGluIFJVUCwgYnV0Ci0gIHRoZXJlIGFyZSBjZXJ0YWlubHkgcGVhayB0aW1lcyBpbiB3aGljaCBtb3N0IG9mIHRoZSByZXF1aXJlbWVudHMgZWxpY2l0YXRpb24KLSAgYW5kIGRlc2NyaXB0aW9uIHdvcmsgaXMgcGVyZm9ybWVkLiBUaGVyZSBhcmUgYWxzbyB0aW1lcyBhdCB3aGljaCBhIGRvd253YXJkCi0gIHRyZW5kIG5lZWRzIHRvIGJlIG9ic2VydmVkIHdoZXJlIGZld2VyIGFuZCBmZXdlciByZXF1aXJlbWVudHMgY2hhbmdlcyBoYXZlIHRvCi0gIGJlIHByb2Nlc3NlZCB0byBicmluZyB0aGUgcHJvamVjdCB0byBhIGNsb3NlLiBUaGlzIGF2b2lkcyB3aGF0IGlzIHJlZmVycmVkIHRvCi0gIGFzIGZlYXR1cmUgY3JlZXAgaW4gd2hpY2ggcmVxdWlyZW1lbnRzIHdvcmsgcmVtYWlucyBjb25zdGFudCBvciBldmVuIGluY3JlYXNlcy4KLSAgSGVuY2UsIGEgbGlmZWN5Y2xlIChwcm9jZXNzKSBleHByZXNzZXMgdGhlIHZhcmlhbmNlcyBvZiB3b3JrIHBlcmZvcm1lZCBpbiB0aGUKLSAgdmFyaW91cyBkaXNjaXBsaW5lcyAobWV0aG9kIGNvbnRlbnQpLjwvcD4KLTxwPjxpbWcgc3JjPSJtY192c19wLmdpZiI+PC9wPgotPHA+VGhlIHBpY3R1cmUgYWJvdmUgcHJvdmlkZXMgYSBzdW1tYXJ5IG9mIHRoZSBrZXkgZWxlbWVudHMgdXNlZCBpbiBFUEYgQ29tcG9zZXIgYW5kIGhvdwotICB0aGV5IHJlbGF0ZSB0byBtZXRob2QgY29udGVudCBvciBwcm9jZXNzLiBBcyB5b3Ugc2VlLCBtZXRob2QgY29udGVudCBpcyBwcmltYXJpbHkKLSAgZXhwcmVzc2VkIHVzaW5nIHdvcmsgcHJvZHVjdHMsIHJvbGVzLCB0YXNrcywgYW5kIGd1aWRhbmNlLiBHdWlkYW5jZSwgc3VjaCBhcwotICBjaGVja2xpc3RzLCBleGFtcGxlcywgb3Igcm9hZG1hcHMsIGNhbiBhbHNvIGJlIGRlZmluZWQgdG8gcHJvdmlkZSBleGVtcGxhcnkKLSAgd2Fsa3Rocm91Z2hzIG9mIGEgcHJvY2Vzcy4gT24gdGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgZGlhZ3JhbSwgeW91IHNlZSB0aGUKLSAgZWxlbWVudHMgdXNlZCB0byByZXByZXNlbnQgcHJvY2Vzc2VzIGluIEVQRiBDb21wb3Nlci4gVGhlIG1haW4gZWxlbWVudCBpcyB0aGUgYWN0aXZpdHkKLSAgdGhhdCBjYW4gYmUgbmVzdGVkIHRvIGRlZmluZSBicmVha2Rvd24gc3RydWN0dXJlcyBhcyB3ZWxsIGFzIHJlbGF0ZWQgdG8gZWFjaAotICBvdGhlciB0byBkZWZpbmUgYSBmbG93IG9mIHdvcmsuIEFjdGl2aXRpZXMgYWxzbyBjb250YWluIGRlc2NyaXB0b3JzIHRoYXQgcmVmZXJlbmNlCi0gIG1ldGhvZCBjb250ZW50LiBBY3Rpdml0aWVzIGFyZSB1c2VkIHRvIGRlZmluZSBwcm9jZXNzZXMgb2Ygd2hpY2ggRVBGIENvbXBvc2VyIHN1cHBvcnQKLSAgdHdvIG1haW4ga2luZHM6IGRlbGl2ZXJ5IHByb2Nlc3NlcyBhbmQgY2FwYWJpbGl0eSBwYXR0ZXJucy4gRGVsaXZlcnkgcHJvY2Vzc2VzCi0gIHJlcHJlc2VudCBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIHByb2Nlc3MgdGVtcGxhdGUgZm9yIHBlcmZvcm1pbmcgb25lIHNwZWNpZmljCi0gIHR5cGUgb2YgcHJvamVjdC4gVGhleSBkZXNjcmliZSBhIGNvbXBsZXRlIGVuZC10by1lbmQgcHJvamVjdCBsaWZlY3ljbGUgYW5kIGFyZQotICB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MuIENhcGFiaWxpdHkKLSAgcGF0dGVybnMgYXJlIHByb2Nlc3NlcyB0aGF0IGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhCi0gIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBkaXNjaXBsaW5lIG9yIGEgYmVzdCBwcmFjdGljZS4gVGhleSBhcmUgYWxzbwotICB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBkZWxpdmVyeSBwcm9jZXNzZXMgb3IgbGFyZ2VyIGNhcGFiaWxpdHkKLSAgcGF0dGVybnMuIFRoaXMgZW5zdXJlcyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGVpciBrZXkgYmVzdCBwcmFjdGljZXMKLSAgaW4gcHJvY2VzcyBhdXRob3JpbmcgYWN0aXZpdGllcyBpbiBFUEYgQ29tcG9zZXIuIDwvcD4KLQotPHA+Rm9yIG1vcmUgZGV0YWlscyBvbiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyLCBzZWUgdGhlIG9ubGluZSBoZWxwOjwvcD4KLTxkaXYgYWxpZ249ImxlZnQiPgotPHVsPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Fib3V0ZXBmY29tcG9zZXIuaHRtbCI+T3ZlcnZpZXc8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdGFuZGFyZG1ldGhvZGxpYnJhcnlvdmVydmlldy5odG1sIj5HZXR0aW5nCi0gICAgICBTdGFydGVkPC9hPjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08cD48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL292ZXJ2aWV3L292ZXJ2aWV3LmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvb3ZlcnZpZXcvb3ZlcnZpZXcuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTE1NTQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvb3ZlcnZpZXcvb3ZlcnZpZXcuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotYm9keSB7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9jb250ZW50cGFnZS9vdmVydmlld193dHIuanBnKTsKLX0KLQotLyogc2hvdyB0aGUgInNlbGVjdGVkIiBpbWFnZSBmb3IgdGhpcyBwYWdlICovCi0jbmF2aWdhdGlvbi1saW5rcyBhI292ZXJ2aWV3IGltZywgI25hdmlnYXRpb24tbGlua3MgYSNvdmVydmlldzpob3ZlciBpbWcgeyAKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL2N0b29sL292ZXJ2aWV3NDhzZWwuZ2lmKTsgCi0JfQotCi0KLWlmcmFtZSB7Ci0JcG9zaXRpb246cmVsYXRpdmU7Ci0JdG9wOjE2cHg7Ci0Jd2lkdGg6MTAwJTsKLQloZWlnaHQ6MTAwJTsKLQlwYWRkaW5nLWxlZnQ6MTBweDsKLQl9Ci0JCi0vKiBtb3ppbGxhIHNjcm9sbGJhciBhcHBlYXJpbmcgb2ZmIHBhZ2UgZml4ICovCi0jcGFnZS1jb250ZW50ID4gaWZyYW1lIHsKLQl3aWR0aDogOTglOwotCXBhZGRpbmctbGVmdDogMiU7Ci19CQotCi0KLS8qIAotICogU2V0IHVwIHRoZSBPdmVydmlldyBsaW5rcyB0byBiZSBkaXNwbGF5ZWQgaW4gdHdvIGNvbHVtbnMKLSAqIHRoYXQgYXJlIGNlbnRlcmVkIGluIHRoZSBtaWRkbGUgb2YgdGhlIHBhZ2UuCi0gKi8KLQotI292ZXJ2aWV3LWxpbmtzIHsKLQl0ZXh0LWFsaWduIDogbGVmdDsKLQl3aWR0aCA6IDc2MHB4OwotCS8qIFRvIGNlbnRlciBpbiBNb3ogKGhhdmUgdG8gdXNlIHRleHQtYWxpZ24gZm9yIElFKSAqLwotCW1hcmdpbiA6IDBweCBhdXRvOwotCi19Ci0KLSNvdmVydmlldy1saW5rcyBhIHsgCi0Jd2lkdGggOiAzNzBweDsKLQl0ZXh0LWFsaWduIDogbGVmdDsgCi0JbWFyZ2luLWxlZnQgOiA1cHg7Ci0JbWFyZ2luLXJpZ2h0IDogNXB4OwotCW1hcmdpbi10b3AgOiA1cHg7Ci0JbWFyZ2luLWJvdHRvbSA6IC0yMHB4OwotCXZlcnRpY2FsLWFsaWduIDogdG9wOwotfQotCi0jb3ZlcnZpZXctbGlua3MgPiBhIHsgdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7IH0KLQotI292ZXJ2aWV3LWxpbmtzIGEgaW1nIHsKLQloZWlnaHQgOiA1N3B4OwotCXdpZHRoIDogNTdweDsKLQl2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsKLQkJCi19CQotCi0jb3ZlcnZpZXctbGlua3MgYSAubGluay1sYWJlbCB7Ci0JZGlzcGxheSA6IGJsb2NrOwotCXdpZHRoIDogMzAwcHg7Ci0JcG9zaXRpb24gOiByZWxhdGl2ZTsKLQl0b3AgOiAtNTBweDsKLQlsZWZ0IDogNjBweDsKLX0KLQotI292ZXJ2aWV3LWxpbmtzIGEgPiAubGluay1sYWJlbCB7IGxlZnQ6IDY1cHg7IH0KLQotI292ZXJ2aWV3LWxpbmtzIGEgcCAudGV4dCB7Ci0JZGlzcGxheSA6IGJsb2NrOwotCXdpZHRoIDogMzAwcHg7Ci0JcG9zaXRpb24gOiByZWxhdGl2ZTsKLQl0b3AgOiAtNDVweDsKLQlsZWZ0IDogNTNweDsKLX0KLQotI292ZXJ2aWV3LWxpbmtzIGEgcCA+IC50ZXh0IHsgbGVmdDogNThweDsgfQotCi0vKiBTcGVjaWFsIGNhc2UgZm9yIE1vemlsbGEsIGJlY2F1c2UgdGhlIGxpbmtzIGFyZSBkaXNwbGF5ZWQKLSAgIGluIDEgdmVydGljYWwgY29sdW1uIGluc3RlYWQgb2YgMiBjZW50ZXJlZCBjb2x1bW5zICovCi0jb3ZlcnZpZXctbGlua3MgPiBhIHsgCXdpZHRoIDogNzAwcHg7IH0KLSNvdmVydmlldy1saW5rcyBhID4gLmxpbmstbGFiZWwgeyB3aWR0aCA6IDcwMHB4OyB9Ci0jb3ZlcnZpZXctbGlua3MgYSBwID4gLnRleHQgeyB3aWR0aCA6IDcwMHB4OyB9Ci0KLSNvdmVydmlldy1saW5rcyBhOmhvdmVyIHsgYm9yZGVyLXJpZ2h0IDogNXB4OyB9Ci0KLWEjYmFzaWNzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvd2JiYXNpY3Nfb2JqLmdpZik7IH0KLWEjYmFzaWNzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvd2JiYXNpY3Nob3Zfb2JqLmdpZik7IH0KLQotYSN0ZWFtIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdGVhbXN1cF9vYmouZ2lmKTsgfQotYSN0ZWFtOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdGVhbXN1cGhvdl9vYmouZ2lmKTsgfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL292ZXJ2aWV3L3N3dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9vdmVydmlldy9zd3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUxM2NlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL292ZXJ2aWV3L3N3dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1vdmVydmlldy5sYXlvdXQubmNvbHVtbnMgPSAyCi1vdmVydmlldy5wYWdlLWNvbnRlbnQub3ZlcnZpZXctbGlua3MubGF5b3V0LnZzcGFjaW5nID0gMzUKLW92ZXJ2aWV3LnBhZ2UtY29udGVudC5vdmVydmlldy1saW5rcy5sYXlvdXQubmNvbHVtbnMgPSAyCi0KLW92ZXJ2aWV3LnN1YnRpdGxlLWlkID0gb3ZlcnZpZXcvcGFnZS1jb250ZW50L3BhZ2UtdGl0bGUKLW92ZXJ2aWV3LmRlc2NyaXB0aW9uLWlkID0gb3ZlcnZpZXcvcGFnZS1jb250ZW50L3BhZ2UtZGVzY3JpcHRpb24KLQotb3ZlcnZpZXcucGFnZS1jb250ZW50Lm92ZXJ2aWV3LWxpbmtzLmVwZi1vdi1ydXBvdi5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXJ1cG92LmdpZgotb3ZlcnZpZXcucGFnZS1jb250ZW50Lm92ZXJ2aWV3LWxpbmtzLmVwZi1vdi1tZXRob2QubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1tZXRob2QuZ2lmCi1vdmVydmlldy5wYWdlLWNvbnRlbnQub3ZlcnZpZXctbGlua3MuZXBmLW92LXByb2Nlc3MubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1wcm9jZXNzLmdpZgotb3ZlcnZpZXcucGFnZS1jb250ZW50Lm92ZXJ2aWV3LWxpbmtzLmVwZi1vdi1jb25maWdwdWJsaXNoLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtY29uZmlncHVibGlzaC5naWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3AuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JmMmI3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9wcm9jZXNzYXV0aG9yaW5nLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3Byb2Nlc3NhdXRob3JpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIyNDJkZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3Byb2Nlc3NhdXRob3JpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTxodG1sPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08aGVhZD4KLTx0aXRsZT5Qcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMz5Qcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldzwvaDM+Ci08cD5BIGRldmVsb3BtZW50IHByb2Nlc3MgZGVmaW5lcyBzZXF1ZW5jZXMgb2YgdGFza3MgcGVyZm9ybWVkIGJ5IHJvbGVzIGFuZCB3b3JrCi0gIHByb2R1Y3RzIHByb2R1Y2VkIG92ZXIgdGltZS48L3A+Ci08cD48aW1nIHNyYz0icC5naWYiPjwvcD4KLTxwPlRoZSBmaWd1cmUgYWJvdmUgc2hvd3MgdGhhdCBwcm9jZXNzZXMgYXJlIHR5cGljYWxseSBleHByZXNzZWQgYXMgd29ya2Zsb3dzCi0gIG9yIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiBEZWZpbmluZyBhIHN0cmljdCBzZXF1ZW5jZSBhcyBpbiBhIHdhdGVyZmFsbCBtb2RlbAotICBpcyBhcyBtdWNoIGEgcHJvY2VzcyBhcyBkZWZpbmluZyBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIGluIGl0ZXJhdGlvbnMgb2YgcGFyYWxsZWwKLSAgd29yay4gVGhleSBqdXN0IHJlcHJlc2VudCBkaWZmZXJlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2hlcy4gSGVuY2UsIGZvciBkZWZpbmluZwotICBhIHByb2Nlc3MsIG9uZSBjYW4gdGFrZSBtZXRob2QgY29udGVudCBhbmQgY29tYmluZSBpdCBpbnRvIHN0cnVjdHVyZXMgdGhhdCBzcGVjaWZ5Ci0gIGhvdyB0aGUgd29yayBzaGFsbCBiZSBvcmdhbml6ZWQgb3ZlciB0aW1lLCB0byBtZWV0IHRoZSBuZWVkcyBvZiBhIHBhcnRpY3VsYXIKLSAgdHlwZSBvZiBkZXZlbG9wbWVudCBwcm9qZWN0IChzdWNoIGFzIHNvZnR3YXJlIGZvciBhIG9ubGluZSBzeXN0ZW0gdmVyc3VzIHNvZnR3YXJlCi0gIGFuZCBoYXJkd2FyZSBmb3IgYW4gZW1iZWRkZWQgc3lzdGVtKS4gUk1DIHN1cHBvcnRzIHByb2Nlc3NlcyBiYXNlZCBvbiBkaWZmZXJlbnQKLSAgZGV2ZWxvcG1lbnQgYXBwcm9hY2hlcyBhY3Jvc3MgbWFueSBkaWZmZXJlbnQgbGlmZWN5Y2xlIG1vZGVscywgaW5jbHVkaW5nIHdhdGVyZmFsbCwKLSAgaW5jcmVtZW50YWwsIGFuZCBpdGVyYXRpdmUgbGlmZWN5Y2xlcy4gUk1DIGFsc28gc3VwcG9ydHMgZGlmZmVyZW50IHByZXNlbnRhdGlvbnMKLSAgZm9yIHByb2Nlc3MsIHN1Y2ggYXMgd29yay1icmVha2Rvd24gc3RydWN0dXJlIG9yIHdvcmtmbG93IHByZXNlbnRhdGlvbnMuIFlvdQotICBjYW4gYWxzbyBkZWZpbmUgcHJvY2Vzc2VzIGluIFJNQyB0aGF0IHVzZSBhIG1pbmltYWwgc2V0IG9mIG1ldGhvZCBjb250ZW50IHRvCi0gIGRlZmluZSBwcm9jZXNzZXMgZm9yIGFnaWxlLCBzZWxmLW9yZ2FuaXppbmcgdGVhbXMuPC9wPgotPHA+IFRoZSBSTUMgc2NyZWVuIGNhcHR1cmUgYWJvdmUgc2hvd3MgYW4gZXhhbXBsZSBvZiBhIHByb2Nlc3MgcHJlc2VudGVkIGFzIGEKLSAgYnJlYWtkb3duIHN0cnVjdHVyZSBvZiBuZXN0ZWQgYWN0aXZpdGllcyBhcyB3ZWxsIGFzIGEgd29ya2Zsb3cgb3IgYWN0aXZpdHkgZGlhZ3JhbQotICBmb3Igb25lIHBhcnRpY3VsYXIgYWN0aXZpdHksIHRoZSBpbmNlcHRpb24gcGhhc2UuIEl0IGFsc28gaW5kaWNhdGVzIHdpdGggdGhlCi0gIHR3byBibHVlIGFycm93cyB0aGF0IHRoZSBwYXJ0aWN1bGFyIG1ldGhvZCBjb250ZW50IHRhc2sgJnF1b3Q7RGV0YWlsIGEgVXNlIENhc2UmcXVvdDsKLSAgaGFzIGJlZW4gYXBwbGllZCBpbiB0aGUgcHJvY2VzcyB0d2ljZTsgZmlyc3RseSBpbiB0aGUgaW5jZXB0aW9uIHBoYXNlIHVuZGVyCi0gIHRoZSBhY3Rpdml0eSAmcXVvdDtEZWZpbmUgdGhlIFN5c3RlbSwmcXVvdDsgYW5kIHNlY29uZGx5LCBpbiB0aGUgZWxhYm9yYXRpb24KLSAgcGhhc2UgaW4gdGhlIGFjdGl2aXR5ICZxdW90O1JlZmluZSB0aGUgc3lzdGVtIGRlZmluaXRpb24mcXVvdDsuIFlvdSBzZWUgYmVsb3cKLSAgZWFjaCBvZiB0aGVzZSB0YXNrIGFwcGxpY2F0aW9ucywgcmVmZXJyZWQgdG8gYXMgYSB0YXNrIGRlc2NyaXB0b3JzIGluIFJNQywgbGlzdHMKLSAgb2YgdGhlIHBlcmZvcm1pbmcgcm9sZXMgYXMgd2VsbCBhcyB0aGUgaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiBJZiB5b3UKLSAgbG9vayBjbG9zZWx5LCB5b3Ugc2VlIHRoYXQgdGhlc2UgbGlzdHMgYXJlIGRpZmZlcmVudCBmb3IgZWFjaCBvZiB0aGVzZSB0d28gdGFzawotICBkZXNjcmlwdG9ycywgZXhwcmVzc2luZyBkaWZmZXJlbmNlcyBpbiBwZXJmb3JtaW5nIHRoZSAmcXVvdDtEZXRhaWwgYSBVc2UgQ2FzZSZxdW90OwotICBtZXRob2QgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlLiBZb3Ugc2VlIGRpZmZlcmVudCByb2xlcyBpbnZvbHZlZCBhbmQgY2hhbmdlcwotICBpbiB0aGUgbGlzdCBvZiBpbnB1dHMgdG8gYmUgY29uc2lkZXJlZCBhbmQgb3V0cHV0cyB0byBiZSBwcm9kdWNlZCBvciB1cGRhdGVkLgotICBUaGVzZSBjaGFuZ2VzIHdlcmUgZGVmaW5lZCBieSB0aGUgYXV0aG9yIHRoYXQgY3JlYXRlZCB0aGlzIHByb2Nlc3MgdG8gZXhwcmVzcwotICB0aGUgZXhhY3QgZm9jdXMgb2YgdGhlIHRhc2sgcGVyZm9ybWFuY2UgZm9yIGVhY2ggb2NjdXJyZW5jZS4gSW4gYWRkaXRpb24gdG8KLSAgdXBkYXRpbmcgdGhlIHJvbGVzLCBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMgZm9yIGEgdGFzayBkZXNjcmlwdG9yLCB5b3UKLSAgY2FuIGFsc28gcHJvdmlkZSBhZGRpdGlvbmFsIHRleHR1YWwgZGVzY3JpcHRpb25zIGFzIHdlbGwgYXMgZGVmaW5lIHRoZSBleGFjdAotICBzdGVwcyBvZiB0aGUgdGFzayB0aGF0IHNob3VsZCBhbmQgc2hvdWxkIG5vdCBiZSBwZXJmb3JtZWQgZm9yIHRoaXMgcGFydGljdWxhcgotICBvY2N1cnJlbmNlIG9mIHRoZSB0YXNrLjwvcD4KLTxwPlJNQyBwcm92aWRlcyB5b3Ugd2l0aCBhIHByb2Nlc3MgZWRpdG9yIHRoYXQgc3VwcG9ydHMgZGlmZmVyZW50IGJyZWFrZG93biBzdHJ1Y3R1cmUKLSAgdmlld3MgYXMgd2VsbCBhcyBncmFwaGljYWwgcHJvY2VzcyBwcmVzZW50YXRpb25zLiBBcyBhIHByb2Nlc3MgYXV0aG9yLCB5b3UgdHlwaWNhbGx5Ci0gIHN0YXJ0IGJ5IGNyZWF0aW5nIGFuIGFjdGl2aXR5IGJyZWFrZG93biwgZGl2aWRpbmcgYW5kIGJyZWFraW5nIHlvdXIgcHJvY2VzcwotICBkb3duIGludG8gcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgaGlnaC1sZXZlbCBhY3Rpdml0aWVzLiBJbnN0ZWFkIG9mIGNyZWF0aW5nCi0gIHlvdXIgYWN0aXZpdGllcyBpbiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3IsIHlvdSBjYW4gYWx0ZXJuYXRpdmVseSB3b3JrCi0gIGluIGEgZ3JhcGhpY2FsIGFjdGl2aXR5IGRpYWdyYW0gZWRpdG9yIHRoYXQgYWxsb3dzIHlvdSB0byBncmFwaGljYWxseSBjcmVhdGUKLSAgYSB3b3JrZmxvdyBmb3IgeW91ciBhY3Rpdml0aWVzLiBUbyBhc3NpZ24gbWV0aG9kIGNvbnRlbnQgdG8geW91ciBwcm9jZXNzLCB5b3UKLSAgdGhlbiBoYXZlIHRoZSBjaG9pY2Ugb2Ygd29ya2luZyBpbiBkaWZmZXJlbnQgcHJvY2VzcyB2aWV3cyAod29yayBicmVha2Rvd24gc3RydWN0dXJlLAotICB3b3JrIHByb2R1Y3QgdXNhZ2UsIG9yIHRlYW0gYWxsb2NhdGlvbiB2aWV3KS4gRWFjaCB2aWV3IHN1cHBvcnRzIGEgZGlmZmVyZW50Ci0gIGFwcHJvYWNoIGZvciBjcmVhdGluZyBhIHByb2Nlc3MuIFlvdSBjYW4gZGVmaW5lIHRoZSB3b3JrIHRvIGJlIGRvbmUsIGRlZmluZQotICB0aGUgcmVzdWx0cyB0byBiZSBwcm9kdWNlZCwgb3IgZGVmaW5lIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdXIgcm9sZXMuIElmIHJlcXVlc3RlZCwKLSAgdGhlIGVkaXRvciB1cGRhdGVzIHRoZSBvdGhlciBwcm9jZXNzIHZpZXdzIHNlbWktYXV0b21hdGljYWxseSB1c2luZyB3aXphcmRzCi0gIHRoYXQgcHJvbXB0IHlvdSBmb3IgZGVjaXNpb25zIG9uIHNlbGVjdGluZyBtZXRob2QgY29udGVudCBlbGVtZW50cy48L3A+Ci08cD5Gb3IgbW9yZSBkZXRhaWxzIG9uIHByb2Nlc3MgYXV0aG9yaW5nIHNlZSB0aGUgb25saW5lIGhlbHA6PC9wPgotPGRpdiBhbGlnbj0ibGVmdCI+Ci08dWw+Ci0gIDxsaT48YSBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiPlByb2Nlc3MKLSAgQXV0aG9yaW5nIE92ZXJ2aWV3PC9hPjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08cD4mbmJzcDs8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3B1Yi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3B1Yi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxM2U4ZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9wdWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9wdWJsaXNoaW5nLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3B1Ymxpc2hpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVjMDgyYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3B1Ymxpc2hpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTxodG1sPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08aGVhZD4KLTx0aXRsZT5Db25maWd1cmF0aW9uIGFuZCBQdWJsaXNoaW5nPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgzPk1ldGhvZCBDb25maWd1cmF0aW9ucyBPdmVydmlldzwvaDM+Ci08cD5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIHNoaXBzIHdpdGggYSBsb3Qgb2YgY29udGVudCBvdXQgb2YgdGhlIGJveC4gSXQgaW5jbHVkZXMKLSAgdGhlIE9wZW4gVW5pZmllZCBQcm9jZXNzIChPcGVuVVApIGZyYW1ld29yayBhbmQgdmFyaW91cyBwbHVnLWlucyBleHRlbmRpbmcKLSAgT3BlblVQL0Jhc2ljLiBObyBvcmdhbml6YXRpb24gb3IgcHJvamVjdCByZXF1aXJlcyBhbGwgb2YgdGhpcwotICBkb2N1bWVudGF0aW9uIGFsbCBhdCBvbmNlLCBidXQgd291bGQgd29yayB3aXRoIGEgc2VsZWN0aW9uIG9mIHNwZWNpZmljIHN1YnNldHMuPC9wPgotPHA+IEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgKEVQRikgQ29tcG9zZXIgbWFuYWdlcyBmb3IgdGhhdCBwdXJwb3NlIHNvLWNhbGxlZCBtZXRob2QKLSAgY29uZmlndXJhdGlvbnMsIHdoaWNoIGFsbG93IHlvdSB0byBzcGVjaWZ5IHdvcmtpbmcgc2V0cyBvZiBjb250ZW50IGFuZCBwcm9jZXNzZXMKLSAgZm9yIGEgc3BlY2lmaWMgY29udGV4dCwgc3VjaCBhcyBhIHNwZWNpZmljIHZhcmlhbnQgb2YgdGhlIFJVUCBmcmFtZXdvcmsgdGhhdAotICB5b3Ugd2FudCB0byBwdWJsaXNoIGFuZCBkZXBsb3kgZm9yIGEgZ2l2ZW4gc29mdHdhcmUgcHJvamVjdCBvciBhcyBhIGZvdW5kYXRpb24KLSAgZm9yIGEgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uLiBBbGwgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIEVQRiBDb21wb3NlciBhcmUgb3JnYW5pemVkCi0gIGluIG1ldGhvZCBwbHVnLWlucywgd2hpY2ggYXJlIG9yZ2FuaXplZCBpbnRvIG1ldGhvZCBwYWNrYWdlcy4gQSBtZXRob2QgY29uZmlndXJhdGlvbgotICBpcyBzaW1wbHkgYSBzZWxlY3Rpb24gb2YgdGhlIG1ldGhvZCBwbHVnLWlucyBhbmQgcGFja2FnZXMuPC9wPgotPHA+PGltZyBzcmM9ImNzcy9jb25mLmdpZiI+PC9wPgotPHA+WW91IGNyZWF0ZSBhbmQgc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gdXNpbmcgdGhlIGNvbmZpZ3VyYXRpb24gZWRpdG9yIGRlcGljdGVkCi0gIGluIHRoZSBmaWd1cmUgYWJvdmUuIFlvdSBjb3VsZCBzdGFydCBjcmVhdGluZyB5b3VyIG93biBtZXRob2QgY29uZmlndXJhdGlvbgotICBieSBjb3B5aW5nIG9uZSBvZiB0aGUgY29uZmlndXJhdGlvbnMgdGhhdCBzaGlwIHdpdGggRVBGIENvbXBvc2VyIGFuZCBtb2RpZnkgaXQgdG8gZml0Ci0gIHlvdXIgc3BlY2lmaWMgbmVlZHMuIFlvdSBjYW4gYWRkIG9yIHJlbW92ZSB3aG9sZSBtZXRob2QgcGx1Zy1pbnMgYXMgd2VsbCBhcwotICBtYWtlIHNlbGVjdGlvbiB3aXRoIGVhY2ggcGx1Zy1pbiBieSBjaGVja2luZyBvciB1bi1jaGVja2luZyBwYWNrYWdlcy4gPC9wPgotPHA+IFlvdSBjYW4gdXNlIHRoZSByZXN1bHRpbmcgY29uZmlndXJhdGlvbiBhcyB5b3VyIHdvcmtpbmcgc2V0IGZvciB5b3VyIEVQRiBDb21wb3NlcgotICB3b3JrLiBUaGUgYWN0dWFsIGNvbnRlbnQgb2YgdGhlIGNvbmZpZ3VyYXRpb24sIGkuZS4gdGhlIGluY2x1ZGVkIG1ldGhvZCBjb250ZW50Ci0gIGFuZCBwcm9jZXNzIGVsZW1lbnRzIGFyZSBhbHdheXMgYWNjZXNzaWJsZSBpbiB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LiBVc2UgdGhlCi0gIGNvbWJvIGJveCBpbiB0aGUgdG9vbGJhciB0byBzZWxlY3QgdGhlIGN1cnJlbnRseSB1c2VkIG1ldGhvZCBjb25maWd1cmF0aW9uLjwvcD4KLTxoMz5QdWJsaXNoaW5nIE92ZXJ2aWV3PC9oMz4KLTxwPk1ldGhvZCBjb25maWd1cmF0aW9ucyBhcmUgdGhlIGJhc2lzIGZvciBwdWJsaXNoaW5nIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuCi0gIEEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gaXMgYW4gaHRtbCBXZWIgc2l0ZSB0aGF0IHByZXNlbnRzIGFsbCB0aGUgbWV0aG9kCi0gIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBvZiB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gYSBuYXZpZ2FibGUgYW5kIHNlYXJjaGFibGUKLSAgd2F5LiBJdCB1c2VzIHRoZSByZWxhdGlvbnNoaXBzIGVzdGFibGlzaGVkIGR1cmluZyBtZXRob2QgY29udGVudCBhbmQgcHJvY2VzcwotICBhdXRob3JpbmcgdG8gZ2VuZXJhdGUgaHlwZXJsaW5rcyBiZXR3ZWVuIGVsZW1lbnRzIGFzIHdlbGwgYXMgcHJvdmlkZXMgdHJlZQotICBicm93c2VycyBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3IGFuZCB1c2VyLWRlZmluZWQgY2F0ZWdvcml6YXRpb25zIG9mCi0gIHRoZSBjb250ZW50LiBUaGUgZmlndXJlIGJlbG93IHNob3dzIGFuIGV4YW1wbGUgb2YgdGhlIHB1Ymxpc2hlZCAnQ2xhc3NpYyBSVVAnCi0gIG1ldGhvZCBjb25maWd1cmF0aW9uLjwvcD4KLTxwPjxpbWcgc3JjPSJjc3MvcHViLmdpZiI+PC9wPgotPHA+Rm9yIHB1Ymxpc2hpbmcgc2ltcGx5IGNyZWF0ZSBhbmQgc2VsZWN0IGEgY29uZmlndXJhdGlvbi4gVGhlIHB1YmxpY2F0aW9uIHdpemFyZAotICB3aWxsIGRvIHRoZSByZXN0IGZvciB5b3UgYW5kIG9ubHkgcHVibGlzaCBjb250ZW50IHRoYXQgaXMgcGFydCBvZiB0aGUgbWV0aG9kCi0gIGNvbmZpZ3VyYXRpb24uIEl0IHdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IGFkb3B0IGNvbnRlbnQgdG8gdGhlIGNvbmZpZ3VyYXRpb24KLSAgc3VjaCBhcyByZW1vdmluZwotICByZWZlcmVuY2VzIG9mIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIHRvIGVsZW1lbnRzIG91dHNpZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24KLSAgb3IgcmVtb3ZpbmcgYWN0aXZpdGllcyBmcm9tIHlvdXIgcHJvY2Vzc2VzIHRoYXQgb25seSBjb250YWluIHdvcmsgZGVmaW5lZCBvdXRzaWRlCi0gIG9mIHRoZSBjb25maWd1cmF0aW9uIHNldC4gSGVuY2UsIHB1Ymxpc2hpbmcgd2lsbCBvbmx5IGluY2x1ZGUgdGhlIGNvbnRlbnQgdGhhdAotICB5b3UgcmVhbGx5IG5lZWQuIFlvdSBjYW4gYWx3YXlzIHByZXZpZXcgYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbiB1c2luZyBFUEYgQ29tcG9zZXIncwotYnJvd3NpbmcgcGVyc3BlY3RpdmUuPC9wPgotPHA+Jm5ic3A7PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9yb290LmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvcm9vdC5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMWQ0OGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9yb290LmNzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvcm9vdF9zd3QucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvcm9vdF9zd3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRlZDY5OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3Jvb3Rfc3d0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLm92ZXJ2aWV3LmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldzcyLmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Muc3RlcHMubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2ZpcnN0ZXBzNzIuZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy50dXRvcmlhbHMubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFsczcyLmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Mud2ViLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjNzIuZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5zYW1wbGVzLmxpbmstaWNvbj0gY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXM3Mi5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLm5ld3MubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3doYXRzbmV3NzIuZ2lmCi1yb290LmFjdGlvbi1saW5rcy53b3JrYmVuY2gubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3diNDguZ2lmCi0KLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLm92ZXJ2aWV3LmhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc3Mi5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLnN0ZXBzLmhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZmlyc3RlcHM3Mi5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLnR1dG9yaWFscy5ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczcyLmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Mud2ViLmhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2VicnNyYzcyLmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Muc2FtcGxlcy5ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3NhbXBsZXM3Mi5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLm5ld3MuaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93aGF0c25ldzcyLmdpZgotcm9vdC5hY3Rpb24tbGlua3Mud29ya2JlbmNoLmhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2I0OC5naWYKLQotCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5vdmVydmlldy5zbWFsbC1saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXc0OC5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLnN0ZXBzLnNtYWxsLWxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9maXJzdGVwczQ4LmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3MudHV0b3JpYWxzLnNtYWxsLWxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHM0OC5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLndlYi5zbWFsbC1saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2VicnNyYzQ4LmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Muc2FtcGxlcy5zbWFsbC1saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvc2FtcGxlczQ4LmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3MubmV3cy5zbWFsbC1saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2hhdHNuZXc0OC5naWYKLXJvb3QuYWN0aW9uLWxpbmtzLndvcmtiZW5jaC5zbWFsbC1saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2I0OC5naWYKLQotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Mub3ZlcnZpZXcuc21hbGwtaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzQ4LmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Muc3RlcHMuc21hbGwtaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9maXJzdGVwczQ4LmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3MudHV0b3JpYWxzLnNtYWxsLWhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNDguZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy53ZWIuc21hbGwtaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93ZWJyc3JjNDguZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5zYW1wbGVzLnNtYWxsLWhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczQ4LmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3MubmV3cy5zbWFsbC1ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3doYXRzbmV3NDguZ2lmCi1yb290LmFjdGlvbi1saW5rcy53b3JrYmVuY2guc21hbGwtaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93YjQ4LmdpZgotCi1yb290LmxheW91dC5uY29sdW1ucyA9IDEKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLmxheW91dC5oc3BhY2luZyA9IDQwCi1yb290LmxheW91dC52c3BhY2luZyA9IDM1CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3NhbXBsZXMvc2FtcGxlcy5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3NhbXBsZXMvc2FtcGxlcy5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMTI2NzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9zYW1wbGVzL3NhbXBsZXMuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotYm9keSB7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9jb250ZW50cGFnZS9zYW1wbGVzX3d0ci5qcGcpOwotfQotCi0ucGFnZSB7IG1pbi1oZWlnaHQgOiA3MDBweDsgfQotCi0vKiBzaG93IHRoZSAic2VsZWN0ZWQiIGltYWdlIGZvciB0aGlzIHBhZ2UgKi8KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjc2FtcGxlcyBpbWcsICNuYXZpZ2F0aW9uLWxpbmtzIGEjc2FtcGxlczpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL2N0b29sL3NhbXBsZXM0OHNlbC5naWYpOyB9Ci0KLS8qIExheSBvdXQgdGhlIHJlYWwgY29udGVudCBvZiB0aGUgc2FtcGxlcyBwYWdlOiAqLwotCi0uc2FtcGxlcy1ncm91cCB7Ci0Jd2lkdGggOiA3NTBweDsKLQkvKiBUbyBjZW50ZXIgaW4gTW96IChoYXZlIHRvIHVzZSB0ZXh0LWFsaWduIGZvciBJRSkgKi8JCi0JbWFyZ2luIDogMHB4IGF1dG87Ci0JbWFyZ2luLWJvdHRvbSA6IDEwcHg7Ci0JdGV4dC1hbGlnbiA6IGxlZnQ7Ci0JZmxvYXQgOiBub25lOwotCWNsZWFyIDogYm90aDsKLX0KLQotLnNhbXBsZXMtZ3JvdXAgSDQgeyBtYXJnaW4tdG9wIDogMTBweDsgfQotCi0uc2FtcGxlLWxpbmsgeyAKLQl3aWR0aCA6IDM2MHB4OwotCXRleHQtYWxpZ24gOiBsZWZ0OyAKLQltYXJnaW4tbGVmdCA6IDVweDsKLQltYXJnaW4tcmlnaHQgOiA1cHg7Ci0JbWFyZ2luLXRvcCA6IDEwcHg7Ci0JbWFyZ2luLWJvdHRvbSA6IC0zMHB4OwotCXZlcnRpY2FsLWFsaWduIDogdG9wOwotfQotCi0vKiBzcGVjaWFsaXplIHRoZSBzd3Qgc2FtcGxlcyBncm91cCB0byBiZSBzcHJlYWQgb3ZlciBvbmx5IDEgY29sdW1uICovCi0jc3d0IC5zYW1wbGUtbGluayB7IAotCXdpZHRoIDogNzIwcHg7Ci19Ci0KLS5zYW1wbGVzLWdyb3VwID4gLnNhbXBsZS1saW5rIHsKLQlmbG9hdCA6IGxlZnQ7Ci0JaGVpZ2h0IDogMTUwcHg7Ci0JdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7Ci19Ci0KLQotLnNhbXBsZS1saW5rIC5saW5rLWxhYmVsIHsKLQlkaXNwbGF5IDogYmxvY2s7Ci0Jd2lkdGggOiAzMDBweDsKLQlwb3NpdGlvbiA6IHJlbGF0aXZlOwotCXRvcCA6IC01MHB4OwotCWxlZnQgOiA2MHB4OwotfQotCi0jc3d0IC5zYW1wbGUtbGluayAubGluay1sYWJlbCB7Ci0Jd2lkdGggOiA2MDBweDsJCi19IAotCi0uc2FtcGxlLWxpbmsgcCAudGV4dCB7Ci0JZGlzcGxheSA6IGJsb2NrOwotCXdpZHRoIDogMzAwcHg7Ci0JcG9zaXRpb24gOiByZWxhdGl2ZTsKLQl0b3AgOiAtNDVweDsKLQlsZWZ0IDogNTNweDsKLX0KLQotI3N3dCAuc2FtcGxlLWxpbmsgLnRleHQgewotCXdpZHRoIDogNjIwcHg7CQotfSAKLQotLnNhbXBsZS1saW5rIGltZyB7Ci0JaGVpZ2h0IDogNTZweDsKLQl3aWR0aCA6IDU2cHg7Ci0JdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7Ci19Ci0KLS5zYW1wbGUtbGluazpob3ZlciB7IGJvcmRlci1yaWdodCA6IDBweDsgfQotCi0KLSNzd3QgLnNhbXBsZS1saW5rIGltZyB7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVyZWRfb2JqLmdpZik7Ci19Ci0KLSNzd3QgLnNhbXBsZS1saW5rOmhvdmVyIGltZyB7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVyZWRob3Zfb2JqLmdpZik7Ci19Ci0KLSN3b3JrYmVuY2ggLnNhbXBsZS1saW5rIGltZyB7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVwdXJwX29iai5naWYpOwotfQotCi0jd29ya2JlbmNoIC5zYW1wbGUtbGluazpob3ZlciBpbWcgewotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2FtcGxlcHVycGhvdl9vYmouZ2lmKTsKLX0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9zYW1wbGVzL3N3dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9zYW1wbGVzL3N3dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDQwMDIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc2FtcGxlcy9zd3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1zYW1wbGVzLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVwdXJwX29iai5naWYKLXNhbXBsZXMucGFnZS1jb250ZW50LnN3dC5zd3QtZXhhbXBsZXMubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXJlZF9vYmouZ2lmCi0KLXNhbXBsZXMucGFnZS1jb250ZW50LmxheW91dC52c3BhY2luZyA9IDQwCi1zYW1wbGVzLnBhZ2UtY29udGVudC5zd3QubGF5b3V0Lm5jb2x1bW5zID0gMgotc2FtcGxlcy5wYWdlLWNvbnRlbnQuc3d0LmxheW91dC52c3BhY2luZyA9IDMwCi1zYW1wbGVzLnBhZ2UtY29udGVudC5zd3QubGF5b3V0LmhzcGFjaW5nID0gMzAKLXNhbXBsZXMucGFnZS1jb250ZW50LndvcmtiZW5jaC5sYXlvdXQubmNvbHVtbnMgPSAyCi1zYW1wbGVzLnBhZ2UtY29udGVudC53b3JrYmVuY2gubGF5b3V0LnZzcGFjaW5nID0gMzAKLXNhbXBsZXMucGFnZS1jb250ZW50LndvcmtiZW5jaC5sYXlvdXQuaHNwYWNpbmcgPSAzMAotCi1kZXNjcmlwdGlvbi1zdHlsZS1pZCA9IGdyb3VwLWRlc2NyaXB0aW9uCi1zYW1wbGVzLnN1YnRpdGxlLWlkID0gc2FtcGxlcy9wYWdlLWNvbnRlbnQvcGFnZS10aXRsZQotc2FtcGxlcy5kZXNjcmlwdGlvbi1pZCA9IHNhbXBsZXMvcGFnZS1jb250ZW50L3BhZ2UtZGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3NoYXJlZC5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3NoYXJlZC5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlM2M2YTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9zaGFyZWQuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNTUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotLyogCi0gKiBTZXQgdXAgZ2VuZXJhbCBmb250cywgc2l6ZXMgYW5kIGNvbG9ycyAKLSAqLwotYm9keSB7IGZvbnQtZmFtaWx5IDogQXJpYWwsIHNhbnMtc2VyaWY7IH0KLQotSDEsIEgyLCBIMywgSDQsIHAsIGEgeyBjb2xvciA6ICM0RDRENEQ7IH0KLQotLmludHJvLWhlYWRlciBIMSB7Ci0JZm9udC1zaXplIDogMTZwdDsKLQlmb250LXdlaWdodCA6IG5vcm1hbDsKLQljb2xvciA6ICNFNUU1RTU7Ci19Ci0KLWgyIHsKLQlmb250LXNpemUgOiAxM3B0OwotCWZvbnQtd2VpZ2h0IDogbm9ybWFsOwotCWNvbG9yIDogIzdCODY5NDsKLX0KLQotLnBhZ2UtdGl0bGUgewotCWZvbnQtc2l6ZSA6IDE0cHQ7Ci0JZm9udC13ZWlnaHQgOiBub3JtYWw7Ci0JY29sb3IgOiAjOEM5NkEyOwotCWZsb2F0IDogbm9uZTsKLQljbGVhciA6IGJvdGg7Ci19Ci0KLS5wYWdlLWRlc2NyaXB0aW9uIHsgCi0JZm9udC1zaXplIDogMTBwdDsKLQlmbG9hdCA6IG5vbmU7Ci0JY2xlYXIgOiBib3RoOwotfQotCi1INCAuZGl2LWxhYmVsIHsKLQlmb250LXNpemUgOiAxMHB0OwotCWZvbnQtd2VpZ2h0IDogYm9sZDsKLX0KLQotYSB7Ci0JZm9udC13ZWlnaHQgOiBib2xkOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci0JY29sb3IgOiAjNEQ0RDREOwotfQotCi1hIC5saW5rLWxhYmVsIHsKLQlmb250LXNpemUgOiAxMHB0OwotCWZvbnQtd2VpZ2h0IDogbm9ybWFsOwotfQotCi0jbmF2aWdhdGlvbi1saW5rcyBhIC5saW5rLWxhYmVsIHsKLQlmb250LXNpemUgOiA5cHQ7Ci0JZm9udC13ZWlnaHQgOiBub3JtYWw7Ci0JY29sb3IgOiAjRTVFNUU1OwotfQotCi1hIC50ZXh0IHsKLQlmb250LXNpemUgOiA4cHQ7Ci0JZm9udC13ZWlnaHQgOiBub3JtYWw7Ci19Ci0KLXAgLmdyb3VwLWRlc2NyaXB0aW9uIHsKLQlmb250LXNpemUgOiAxMHB0OwotCWZvbnQtd2VpZ2h0IDogbm9ybWFsOwotfQotCi0KLS8qIAotICogU2V0IHVwIG90aGVyIGdlbmVyYWwgcHJvcGVydGllcyBsaWtlIHBhZGRpbmcvbWFyZ2lucwotICovCi1odG1sLCBib2R5IHsgd2lkdGggOiAxMDAlOyBoZWlnaHQgOiAxMDAlOyB9Ci0KLWh0bWwsIGJvZHksIGRpdiwgaDEsIGg0LCBwLCBhIHsgbWFyZ2luIDogMHB4OyBwYWRkaW5nIDogMHB4OyB9Ci0KLS5pbnRyby1oZWFkZXIgSDEgeyBwYWRkaW5nLXRvcCA6IDEwcHg7IG1hcmdpbi1sZWZ0IDogMTBweDsgfQotCi0vKiBGb3IgcmVndWxhciBkaXYgbGFiZWxzICovCi0jcGFnZS1jb250ZW50IGRpdiBINCB7Ci0JcGFkZGluZyA6IDEwcHg7Ci0JbWFyZ2luLWJvdHRvbSA6IDVweDsKLX0KLQotLyogRm9yIHRoZSBtYWluIHBhZ2UgY29udGVudCdzIGRpdiBsYWJlbCAqLwotI3BhZ2UtY29udGVudCAjY29udGVudC1oZWFkZXIgSDQgewotCXBhZGRpbmctYm90dG9tIDogMTBweDsKLQlwYWRkaW5nLXRvcCA6IDBweDsKLX0KLQotLyogc3BlY2lhbCBjYXNlIGZvciBNb3ppbGxhJ3MgbWFpbiBjb250ZW50LWhlYWRlciBsYWJlbC4KLSAgIE1vemlsbGEgMS40IG5lZWRzIG1vcmUgcm9vbSBhdCB0aGUgdG9wICovCi0jcGFnZS1jb250ZW50ID4gI2NvbnRlbnQtaGVhZGVyIEg0IHsgcGFkZGluZy10b3AgOiAxMHB4OyB9Ci0KLS8qIE5lZWRlZCBpbiBJRSB0byBnZXQgc2hpZnQrdGFiIHRvIHNob3cgdGhlIGFjdGl2ZSBpbWFnZSBwcm9wZXJseSAqLwotYTphY3RpdmUgewotCWJvcmRlciA6IHNvbGlkIDBweDsKLX0KLQotYSBpbWcgewotCWJvcmRlci13aWR0aCA6IDA7Ci0JYmFja2dyb3VuZC1yZXBlYXQgOiBuby1yZXBlYXQ7Ci19Ci0KLS8qCi0gKiB0byBnZXQgc2Nyb2xsYmFycyB3b3JraW5nIGluIGJvdGggSUUgYW5kIE1vemlsbGEKLSAqLwotaHRtbCxib2R5IHsgb3ZlcmZsb3c6IGF1dG87IH0KLWh0bWw+Ym9keSB7IG92ZXJmbG93OiB2aXNpYmxlOyB9Ci0KLS8qCi0gKiBTZXQgdXAgdGhlIGJvZHksIGRlY29yYXRpdmUgYmFja2dyb3VuZCwgYW5kIG5hdmlnYXRpb24gZm9yIHRoZSBjb250ZW50IAotICogcGFnZXMuIAotICogTm90ZTogdGhlIHJvb3QgcGFnZSBoYW5kbGVzIGl0cyBvd24gYmFja2dyb3VuZCBhbmQgbmF2aWdhdGlvbjsgdGhlc2UKLSAqIHNldHRpbmdzIHByaW1hcmlseSBhcHBseSB0byB0aGUgY29udGVudCBwYWdlcwotICovCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWNvbG9yIDogI0ZGRkZGRjsKLQliYWNrZ3JvdW5kLXJlcGVhdCA6IG5vLXJlcGVhdDsKLQliYWNrZ3JvdW5kLXBvc2l0aW9uIDogYm90dG9tIHJpZ2h0OwotCWJhY2tncm91bmQtYXR0YWNobWVudCA6IGZpeGVkOwotfQotCi0jYmFja2dyb3VuZC1pbWFnZSB7Ci0Jd2lkdGggOiAxMDAlOwotCWhlaWdodCA6IDE2NHB4OwotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvY29udGVudHBhZ2UvYmFja2dyb3VuZC5qcGcpOwotCWJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0OwotCWJhY2tncm91bmQtcG9zaXRpb24gOiB0b3AgbGVmdDsJCi0JcG9zaXRpb24gOiBhYnNvbHV0ZTsKLQl0b3AgOiAwcHg7Ci0Jei1pbmRleCA6IC0xMDA7Ci19Ci0KLSNjdXJ2ZS1pbWFnZSB7IAotCXdpZHRoIDogMTAwJTsKLQloZWlnaHQgOiAxNjRweDsKLQlwb3NpdGlvbiA6IGFic29sdXRlOwotCXRvcCA6IDBweDsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2NvbnRlbnRwYWdlL2JhY2tncm91bmQuZ2lmKTsKLQliYWNrZ3JvdW5kLXJlcGVhdCA6IG5vLXJlcGVhdDsKLQliYWNrZ3JvdW5kLXBvc2l0aW9uIDogdG9wIGNlbnRlcjsKLQltYXJnaW4gOiAwOwotCXBhZGRpbmcgOiAwOwotfQotCi0uaW50cm8taGVhZGVyIHsJYmFja2dyb3VuZC1jb2xvciA6IHRyYW5zcGFyZW50OyB6LWluZGV4IDogMTAwO30KLQotYm9keSwgLnBhZ2V7Ci0JbWluLXdpZHRoIDogNzcwcHg7Ci0JLyogc2luY2UgSUUgZG9lc24ndCBzdXBwb3J0IG1pbi13aWR0aCwgdHJ5IGV4cHJlc3Npb24gKi8KLQl3aWR0aDpleHByZXNzaW9uKGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggPCA3NzA/ICI3NzBweCI6ICJhdXRvIiApOwotCW1pbi1oZWlnaHQgOiA0MjVweDsKLQloZWlnaHQgOiAxMDAlOwotCWhlaWdodCA6IGV4cHJlc3Npb24oZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQgPCA0MjU/ICI0MjVweCI6ICIxMDAlIiApOwotfQotCi0ucGFnZSB7IAotCW1pbi1oZWlnaHQgOiA0NzVweDsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2NvbnRlbnRwYWdlL2JhY2tncm91bmQuanBnKTsKLQliYWNrZ3JvdW5kLXJlcGVhdCA6IHJlcGVhdC14OwotCWJhY2tncm91bmQtcG9zaXRpb24gOiB0b3AgbGVmdDsKLX0KLQotI3BhZ2UtY29udGVudCB7Ci0JYmFja2dyb3VuZC1yZXBlYXQgOiBuby1yZXBlYXQ7Ci0JYmFja2dyb3VuZC1wb3NpdGlvbiA6IGJvdHRvbSByaWdodDsKLQloZWlnaHQgOiA3MCU7Ci19Ci0KLS8qIAotICogTGF5IG91dCB0aGUgbmF2aWdhdGlvbiBsaW5rcyAKLSAqIChSb290IHBhZ2UgZG9lcyBzb21ldGhpbmcgc2ltaWxhciBmb3IgaXRzIG5hdmlnYXRpb24pCi0gKi8KLSNuYXZpZ2F0aW9uLWxpbmtzIHsKLQlwb3NpdGlvbiA6IHJlbGF0aXZlOwotCWxlZnQgOiAxMHB4OwotCXRvcCA6IDVweDsKLQloZWlnaHQgOiA2MDsKLQl3aWR0aCA6IDk4JTsKLX0KLQotCi0jbmF2aWdhdGlvbi1saW5rcyBhIHsKLQlwYWRkaW5nLWxlZnQgOiA1cHg7Ci0JcGFkZGluZy1yaWdodCA6IDVweDsKLQlmbG9hdCA6IGxlZnQ7Ci0JdGV4dC1hbGlnbiA6IGNlbnRlcjsKLX0KLQotI25hdmlnYXRpb24tbGlua3MgYSBpbWcgewotCWhlaWdodCA6IDUycHg7Ci0Jd2lkdGggOiA1MnB4OwotCXZlcnRpY2FsLWFsaWduIDogbWlkZGxlOwotfQotCi0jbmF2aWdhdGlvbi1saW5rcyBhIC5saW5rLWxhYmVsIHsgZGlzcGxheSA6IGJsb2NrOyBtYXJnaW4tdG9wIDogNXB4O30KLQotI25hdmlnYXRpb24tbGlua3MgYSAudGV4dCB7IGRpc3BsYXkgOiBub25lOyB9Ci0KLSNuYXZpZ2F0aW9uLWxpbmtzIGE6aG92ZXIsIAotI25hdmlnYXRpb24tbGlua3MgYTpmb2N1cyAKLSNuYXZpZ2F0aW9uLWxpbmtzIGE6YWN0aXZlIHsgYm9yZGVyLXJpZ2h0IDogMHB4O30KLQotLyogcHJvcGVydGllcyBmb3IgZWFjaCBvZiB0aGUgbmF2aWdhdGlvbi1saW5rcyAgKi8KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjb3ZlcnZpZXcgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldzQ4LmdpZik7IH0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjb3ZlcnZpZXc6aG92ZXIgaW1nLAotI25hdmlnYXRpb24tbGlua3MgYSNvdmVydmlldzpmb2N1cyBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI292ZXJ2aWV3OmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL292ZXJ2aWV3NDguZ2lmKTsgfQotLyojbmF2aWdhdGlvbi1saW5rcyBhI292ZXJ2aWV3OmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL292ZXJ2aWV3NDhzZWwuZ2lmKTsgfSovCi0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjdHV0b3JpYWxzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzNDguZ2lmKTsgfQotI25hdmlnYXRpb24tbGlua3MgYSN0dXRvcmlhbHM6aG92ZXIgaW1nLAotI25hdmlnYXRpb24tbGlua3MgYSN0dXRvcmlhbHM6YWN0aXZlIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjdHV0b3JpYWxzOmZvY3VzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNDguZ2lmKTsgfQotLyojbmF2aWdhdGlvbi1saW5rcyBhI3R1dG9yaWFsczphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM0OHNlbC5naWYpOyB9Ki8KLQotI25hdmlnYXRpb24tbGlua3MgYSNzYW1wbGVzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvc2FtcGxlczQ4LmdpZik7IH0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjc2FtcGxlczpob3ZlciBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI3NhbXBsZXM6YWN0aXZlIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjc2FtcGxlczpmb2N1cyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3NhbXBsZXM0OC5naWYpOyB9Ci0vKiNuYXZpZ2F0aW9uLWxpbmtzIGEjc2FtcGxlczphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9zYW1wbGVzNDhzZWwuZ2lmKTsgfSovCi0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjbmV3cyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL3JldHVzZXI0OC5naWYpOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI25ld3M6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9yZXR1c2VyNDguZ2lmKTsgfQotI25hdmlnYXRpb24tbGlua3MgYSNuZXdzOmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3JldHVzZXI0OHNlbC5naWYpOyB9Ci0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjd2ViIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2VicnNyYzQ4LmdpZik7IH0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjd2ViOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2VicnNyYzQ4LmdpZik7IH0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjd2ViOmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3dlYnJzcmM0OHNlbC5naWYpOyB9Ci0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjc3RlcHMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC9maXJzdGVwczQ4LmdpZik7IH0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjc3RlcHM6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9maXJzdGVwczQ4LmdpZik7IH0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjc3RlcHM6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZmlyc3RlcHM0OHNlbC5naWYpOyB9Ci0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjd29ya2JlbmNoIHsgcG9zaXRpb24gOiBhYnNvbHV0ZTsgIHJpZ2h0IDogMHB4OyB0b3AgOiAtMzVweDsgdGV4dC1hbGlnbiA6IHJpZ2h0O30KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjd29ya2JlbmNoIC5saW5rLWxhYmVsIHsgdmlzaWJpbGl0eSA6IGhpZGRlbjsgfQotI25hdmlnYXRpb24tbGlua3MgYSN3b3JrYmVuY2g6aG92ZXIgLmxpbmstbGFiZWwgeyB2aXNpYmlsaXR5IDogdmlzaWJsZTsgfQotI25hdmlnYXRpb24tbGlua3MgYSN3b3JrYmVuY2ggLnRleHQgeyBkaXNwbGF5IDogbm9uZTsgfQotI25hdmlnYXRpb24tbGlua3MgYSN3b3JrYmVuY2ggaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC93YjQ4LmdpZik7IHdpZHRoIDogNTNweDsgaGVpZ2h0IDogNTNweDt9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI3dvcmtiZW5jaDpob3ZlciBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI3dvcmtiZW5jaDpmb2N1cyBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI3dvcmtiZW5jaDphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC93YjQ4LmdpZik7IH0KLQotLyogCi0gKiBMYXkgb3V0IHRoZSBwYWdlIHRpdGxlIGFuZCBkZXNjcmlwdGlvbiAKLSAqLwotaDEsIHAgeyBtYXJnaW4tbGVmdCA6IDEwcHg7IH0gLyogcmVxdWlyZWQgaW4gbW96aWxsYSBzbyB0aGUgcGFnZSBkZXNjcmlwdGlvbiBpcyBwcm9wZXJseSBpbmRlbnRlZCAqLwotCi0vKiBwb3NpdGlvbiB0aGUgcGFnZSBjb250ZW50IHNvIHRoYXQgdGhlIHBhZ2UgdGl0bGUgb3ZlcmxheXMgdGhlIGJvdHRvbQotICogb2YgdGhlIGJhY2tncm91bmQgaW1hZ2UsIGJ1dCBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgYWx3YXlzIG9uIHRvcCAKLSAqICh1c2luZyB6LWluZGV4KSAqLwotI3BhZ2UtY29udGVudCB7Ci0JZmxvYXQgOiBub25lOwotCWNsZWFyIDogYm90aDsKLQl0ZXh0LWFsaWduIDogY2VudGVyOwotCW1hcmdpbi10b3AgOiAzNXB4OwotfQotCi0ucGFnZSA+ICNwYWdlLWNvbnRlbnQgeyBtYXJnaW4tdG9wIDogNTBweDsgfQotCi0jcGFnZS1jb250ZW50IHAgeyAKLQlwYWRkaW5nLWJvdHRvbSA6IDE1cHg7IAotCXRleHQtYWxpZ24gOiBsZWZ0OyAKLQlmbG9hdCA6IG5vbmU7Ci0JY2xlYXIgOiBib3RoOwotfQotCi0jcGFnZS1jb250ZW50ICNjb250ZW50LWhlYWRlciBINCwgLnBhZ2UtZGVzY3JpcHRpb24gewotCXRleHQtYWxpZ24gOiBsZWZ0OwotCW1hcmdpbi1yaWdodCA6IDEwcHg7Ci0JZmxvYXQgOiBub25lOwotCWNsZWFyIDogYm90aDsKLX0KLQotLnBhZ2UtZGVzY3JpcHRpb24gewotCXRleHQtYWxpZ24gOiBsZWZ0OwotCW1hcmdpbi1yaWdodCA6IDEwcHg7Ci0JZmxvYXQgOiBub25lOwotCWNsZWFyIDogYm90aDsKLX0KLQotLyoKLSAqIE5hdmlnYXRpb24gTGlua3MgKGJhY2ssIGZvcndhcmQgYW5kIGhvbWUpCi0gKi8KLQotI25hdi1saW5rcyB7Ci0Jd2lkdGggOiA5OCU7Ci0JcG9zaXRpb24gOiBhYnNvbHV0ZTsKLQlsZWZ0IDogMHB4OwotCXRvcCA6IDY1cHg7Ci19Ci0KLWEjYmFjayB7IAotCXBvc2l0aW9uIDogYWJzb2x1dGU7IAotCXRvcCA6IDY1cHg7Ci0JcmlnaHQgOiAyMHB4OwotCXRleHQtYWxpZ24gOiByaWdodDsgIAotfQotCi1hI2JhY2sgaW1nIHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL2JhY2suZ2lmKTsgCi0JaGVpZ2h0IDogNTZweDsKLQl3aWR0aCA6IDU2cHg7Ci0JdGV4dC1hbGlnbiA6IGNlbnRlcjsKLX0KLQotYSNiYWNrOmhvdmVyIGltZywKLWEjYmFjazpmb2N1cyBpbWcsCi1hI2JhY2s6YWN0aXZlIGltZyB7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9iYWNrLmdpZik7IAotCWhlaWdodCA6IDU2cHg7Ci0Jd2lkdGggOiA1NnB4OwotfQotCi1hI2ZvcndhcmQgeyAKLQlwb3NpdGlvbiA6IGFic29sdXRlOyAKLQl0b3AgOiA2NXB4OwotCXJpZ2h0IDogLThweDsKLQl0ZXh0LWFsaWduIDogcmlnaHQ7ICAKLX0KLQotYSNmb3J3YXJkIGltZyB7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC9mb3J3YXJkLmdpZik7IAotCWhlaWdodCA6IDU2cHg7Ci0Jd2lkdGggOiA1NnB4OwotCXRleHQtYWxpZ24gOiBjZW50ZXI7Ci19Ci0KLWEjZm9yd2FyZDpob3ZlciBpbWcsCi1hI2ZvcndhcmQ6Zm9jdXMgaW1nLAotYSNmb3J3YXJkOmFjdGl2ZSBpbWcgewotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZm9yd2FyZC5naWYpOyAKLQloZWlnaHQgOiA1NnB4OwotCXdpZHRoIDogNTZweDsKLX0KLQotYSNob21lIHsgCi0JcG9zaXRpb24gOiBhYnNvbHV0ZTsgCi0JdG9wIDogNjVweDsKLQlyaWdodCA6IDYwcHg7Ci0JdGV4dC1hbGlnbiA6IHJpZ2h0OyAgCi19Ci0KLWEjaG9tZSBpbWcgewotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvaG9tZS5naWYpOyAKLQloZWlnaHQgOiA1NnB4OwotCXdpZHRoIDogNTZweDsKLQl0ZXh0LWFsaWduIDogY2VudGVyOwotfQotCi1hI2hvbWU6aG92ZXIgaW1nLAotYSNob21lOmZvY3VzIGltZywKLWEjaG9tZTphY3RpdmUgaW1nIHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL2hvbWUuZ2lmKTsgCi0JaGVpZ2h0IDogNTZweDsKLQl3aWR0aCA6IDU2cHg7Ci19Ci0KLQotLyogaGlkZSB0aGUgbGluayBhbmQgZGVzY3JpcHRpb24gdW50aWwgdXNlcnMgaG92ZXIgb3ZlciB0aGUgbGluayAqLwotI25hdi1saW5rcyBhIHAgLnRleHQsICNuYXYtbGlua3MgYSAubGluay1sYWJlbCB7IGRpc3BsYXkgOiBub25lOyB9Ci0KLSNuYXYtbGlua3MgYTpob3ZlciAubGluay1sYWJlbCwKLSNuYXYtbGlua3MgYTpmb2N1cyAubGluay1sYWJlbCwKLSNuYXYtbGlua3MgYTphY3RpdmUgLmxpbmstbGFiZWwgeyBkaXNwbGF5IDogYmxvY2s7IHdpZHRoIDogMTZlbTsgfQotCi0jbmF2LWxpbmtzIGE6aG92ZXIgcCAudGV4dCwKLSNuYXYtbGlua3MgYTpmb2N1cyBwIC50ZXh0LAotI25hdi1saW5rcyBhOmFjdGl2ZSBwIC50ZXh0IHsJZGlzcGxheSA6IGJsb2NrOyB3aWR0aCA6IDE2ZW07IH0KLQotI25hdi1saW5rcyBhOmhvdmVyLAotI25hdi1saW5rcyBhOmZvY3VzLAotI25hdi1saW5rcyBhOmFjdGl2ZSB7IGJvcmRlci1yaWdodCA6IDBweDsgfQotCi0vKgotICogVHJhbnNpdGlvbiBwYWdlIGNzcyBzZXR0aW5ncwotICovCi0KLSN0LWxpbmtzIHsKLQl0ZXh0LWFsaWduIDogbGVmdDsKLQl3aWR0aCA6IDc2MHB4OwotCS8qIFRvIGNlbnRlciBpbiBNb3ogKGhhdmUgdG8gdXNlIHRleHQtYWxpZ24gZm9yIElFKSAqLwkKLQltYXJnaW46IDBweCBhdXRvOwotfQotCi0jdC1saW5rcyBhIHsgCi0Jd2lkdGggOiAzNzBweDsKLQl0ZXh0LWFsaWduIDogbGVmdDsgCi0JbWFyZ2luLWxlZnQgOiA1cHg7Ci0JbWFyZ2luLXJpZ2h0IDogNXB4OwotCW1hcmdpbi10b3AgOiA1cHg7Ci0JbWFyZ2luLWJvdHRvbSA6IC0yMHB4OwotCXZlcnRpY2FsLWFsaWduIDogdG9wOwotfQotCi0jdC1saW5rcyA+IGEgeyB2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsgfQotCi0jdC1saW5rcyBhIGltZyB7Ci0JaGVpZ2h0IDogNTdweDsKLQl3aWR0aCA6IDU3cHg7Ci0JdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7Ci19Ci0KLSN0LWxpbmtzIGEgLmxpbmstbGFiZWwgewotCWRpc3BsYXkgOiBibG9jazsKLQl3aWR0aCA6IDMwMHB4OwotCXBvc2l0aW9uIDogcmVsYXRpdmU7Ci0JdG9wIDogLTUwcHg7Ci0JbGVmdCA6IDYwcHg7Ci19Ci0KLSN0LWxpbmtzIGEgcCAudGV4dCB7Ci0JZGlzcGxheSA6IGJsb2NrOwotCXdpZHRoIDogMzAwcHg7Ci0JcG9zaXRpb24gOiByZWxhdGl2ZTsKLQl0b3AgOiAtNDVweDsKLQlsZWZ0IDogNTNweDsKLX0KLQotLyogCi0gKiBTcGVjaWFsIGNhc2UgZm9yIE1vemlsbGEsIGJlY2F1c2UgdGhlIGxpbmtzIGFyZSBkaXNwbGF5ZWQKLSAqIGluIDEgdmVydGljYWwgY29sdW1uIGluc3RlYWQgb2YgMiBjZW50ZXJlZCBjb2x1bW5zIAotICovCi0KLSN0LWxpbmtzID4gYSB7IAl3aWR0aCA6IDcwMHB4OyB9Ci0jdC1saW5rcyBhID4gLmxpbmstbGFiZWwgeyB3aWR0aCA6IDcwMHB4OyB9Ci0jdC1saW5rcyBhIHAgPiAudGV4dCB7IHdpZHRoIDogNzAwcHg7IH0KLQotI3QtbGlua3MgYTpob3ZlciB7IGJvcmRlci1yaWdodCA6IDVweDsgfQotCi0KLS8qKiogQmFja3VwIExpbmsgSW1hZ2UgKioqLwotCi1hI3QtbGlua3MgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9uZXdfb2JqLmdpZik7IH0KLWEjdC1saW5rczpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L25ld2hvdl9vYmouZ2lmKTsgfQotCi1hI2ZvbGRlcl9zdGVwcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9maXJzdHN0ZXBzLmdpZik7IH0KLWEjZm9sZGVyX3N0ZXBzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2ZpcnN0c3RlcHNob3YuZ2lmKTsgfQotCi1hI2ZvbGRlcl9uZXd3ZWIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfbmV3d2ViLmdpZik7IH0KLWEjZm9sZGVyX25ld3dlYjpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9uZXd3ZWJob3YuZ2lmKTsgfQotCi1hI2ZvbGRlcl9pbXBvcnR3ZWIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfaW1wb3J0d2ViLmdpZik7IH0KLWEjZm9sZGVyX2ltcG9ydHdlYjpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9pbXBvcnR3ZWJob3YuZ2lmKTsgfQotCi1hI2ZvbGRlcl9oZWxwIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2hlbHAuZ2lmKTsgfQotYSNmb2xkZXJfaGVscDpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9oZWxwaG92LmdpZik7IH0KLQotYSNmb2xkZXJfb3ZlcnZpZXcgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfb3ZlcnZpZXcuZ2lmKTsgfQotYSNmb2xkZXJfb3ZlcnZpZXc6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfb3ZlcnZpZXdob3YuZ2lmKTsgfQotCi1hI2ZvbGRlcl9hZHZhcHBzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2FkdmFwcHMuZ2lmKTsgfQotYSNmb2xkZXJfYWR2YXBwczpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9hZHZhcHBzaG92LmdpZik7IH0KLQotYSNmb2xkZXJfZGV2d2ViIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2RldndlYi5naWYpOyB9Ci1hI2ZvbGRlcl9kZXZ3ZWI6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfZGV2d2ViaG92LmdpZik7IH0KLQotYSNmb2xkZXJfc2FtcGxlcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9zYW1wbGVzLmdpZik7IH0KLWEjZm9sZGVyX3NhbXBsZXM6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfc2FtcGxlc2hvdi5naWYpOyB9Ci0KLWEjZm9sZGVyX3R1dG9yaWFscyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl90dXRvcmlhbHMuZ2lmKTsgfQotYSNmb2xkZXJfdHV0b3JpYWxzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3R1dG9yaWFsc2hvdi5naWYpOyB9Ci0KLWEjZm9sZGVyX3dlYiBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl93ZWIuZ2lmKTsgfQotYSNmb2xkZXJfd2ViOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3dlYmhvdi5naWYpOyB9Ci0KLWEjZm9sZGVyX3JpY2hyZXBvcnRzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3JpY2hyZXBvcnRzLmdpZik7IH0KLWEjZm9sZGVyX3JpY2hyZXBvcnRzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3JpY2hyZXBvcnRzaG92LmdpZik7IH0KLQotYSNmb2xkZXJfd2hhdHNuZXcgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfd2hhdHNuZXcuZ2lmKTsgfQotYSNmb2xkZXJfd2hhdHNuZXc6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfd2hhdHNuZXdob3YuZ2lmKTsgfQotCi1hI2dhbGxlcnlfc2FtcGxlcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2dhbGxlcnlfc2FtcGxlcy5naWYpOyB9Ci1hI2dhbGxlcnlfc2FtcGxlczpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2dhbGxlcnlfc2FtcGxlc2hvdi5naWYpOyB9Ci0KLWEjZ2FsbGVyeV90dXRvcmlhbHMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9nYWxsZXJ5X3R1dG9yaWFscy5naWYpOyB9Ci1hI2dhbGxlcnlfdHV0b3JpYWxzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV90dXRvcmlhbHNob3YuZ2lmKTsgfQotCi1hI3BhZ2Vfc3RlcHMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHMuZ2lmKTsgfQotYSNwYWdlX3N0ZXBzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9maXJzdHN0ZXBzaG92LmdpZik7IH0KLQotYSNwYWdlX2hlbHAgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2hlbHAuZ2lmKTsgfQotYSNwYWdlX2hlbHA6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2hlbHBob3YuZ2lmKTsgfQotCi1hI3BhZ2Vfb3ZlcnZpZXcgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX292ZXJ2aWV3LmdpZik7IH0KLWEjcGFnZV9vdmVydmlldzpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfb3ZlcnZpZXdob3YuZ2lmKTsgfQotCi1hI3BhZ2Vfd2ViIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV93ZWIuZ2lmKTsgfQotYSNwYWdlX3dlYjpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfd2ViaG92LmdpZik7IH0KLQotYSNwYWdlX3doYXRzbmV3IGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV93aGF0c25ldy5naWYpOyB9Ci1hI3BhZ2Vfd2hhdHNuZXc6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX3doYXRzbmV3aG92LmdpZik7IH0KLQotYSNlcGZfcmVzb3VyY2UgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9lcGZfcmVzb3VyY2UuZ2lmKTsgfQotYSNlcGZfcmVzb3VyY2U6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9lcGZfcmVzb3VyY2Vob3YuZ2lmKTsgfQotCi1hI2VwZi1vdi10b3VyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXRvdXIuZ2lmKTsgfQotYSNlcGYtb3YtdG91cjpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi10b3VyaG92LmdpZik7IH0KLQotYSNlcGYtb3YtcnVwb3YgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcnVwb3YuZ2lmKTsgfQotYSNlcGYtb3YtcnVwb3Y6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcnVwb3Zob3YuZ2lmKTsgfQotCi1hI2VwZi1vdi1tZXRob2QgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtbWV0aG9kLmdpZik7IH0KLWEjZXBmLW92LW1ldGhvZDpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1tZXRob2Rob3YuZ2lmKTsgfQotCi1hI2VwZi1vdi1wcm9jZXNzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXByb2Nlc3MuZ2lmKTsgfQotYSNlcGYtb3YtcHJvY2Vzczpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1wcm9jZXNzaG92LmdpZik7IH0KLQotYSNlcGYtb3YtY29uZmlncHVibGlzaCBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1jb25maWdwdWJsaXNoLmdpZik7IH0KLWEjZXBmLW92LWNvbmZpZ3B1Ymxpc2g6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtY29uZmlncHVibGlzaGhvdi5naWYpOyB9Ci0KLWEjZXBmLXN0ZXBzLW9uZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwcy5naWYpOyB9Ci1hI2VwZi1zdGVwcy1vbmU6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHNob3YuZ2lmKTsgfQotCi1hI2VwZi1zdGVwcy10d28gaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHMuZ2lmKTsgfQotYSNlcGYtc3RlcHMtdHdvOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9maXJzdHN0ZXBzaG92LmdpZik7IH0KLQotYSNlcGYtc3RlcHMtdGhyZWUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHMuZ2lmKTsgfQotYSNlcGYtc3RlcHMtdGhyZWU6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHNob3YuZ2lmKTsgfQotCi1hI2VwZi1zdGVwcy1mb3VyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9maXJzdHN0ZXBzLmdpZik7IH0KLWEjZXBmLXN0ZXBzLWZvdXI6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHNob3YuZ2lmKTsgfQotCi1hI2VwZi10dXQtZ2FsbGVyeSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2dhbGxlcnlfdHV0b3JpYWxzLmdpZik7IH0KLWEjZXBmLXR1dC1nYWxsZXJ5OmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV90dXRvcmlhbHNob3YuZ2lmKTsgfQotCi1hI2VwZi10dXQtZWxlbWVudCBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3RfbWV0aGNvbnRfb2JqLmdpZik7IH0KLWEjZXBmLXR1dC1lbGVtZW50OmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9tZXRoY29udGhvdl9vYmouZ2lmKTsgfQotCi1hI2VwZi10dXQtbmF2aWdhdGUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC90X25hdnVpX29iai5naWYpOyB9Ci1hI2VwZi10dXQtbmF2aWdhdGU6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC90X25hdnVpaG92X29iai5naWYpOyB9Ci0KLWEjZXBmLXR1dC1jb250ZW50IGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9yZW1ldGhjb250X29iai5naWYpOyB9Ci1hI2VwZi10dXQtY29udGVudDpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3RfcmVtZXRoY29udGhvdl9vYmouZ2lmKTsgfQotCi1hI2VwZi10dXQtcHJvY2VzcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3Rfd29ya3Byb2Nfb2JqLmdpZik7IH0KLWEjZXBmLXR1dC1wcm9jZXNzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF93b3JrcHJvY2hvdl9vYmouZ2lmKTsgfQotCi1hI2VwZi10dXQtcHViZXhwIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9wdWJleHBfb2JqLmdpZik7IH0KLWEjZXBmLXR1dC1wdWJleHA6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC90X3B1YmV4cGhvdl9vYmouZ2lmKTsgfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9zaGFyZWRfZWNsaXBzZS5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3NoYXJlZF9lY2xpcHNlLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE0NDRkNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3NoYXJlZF9lY2xpcHNlLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLS8qIAotICogU2V0IHVwIGdlbmVyYWwgZm9udHMsIHNpemVzIGFuZCBjb2xvcnMgCi0gKi8KLWJvZHkgeyBmb250LWZhbWlseSA6IEFyaWFsLCBzYW5zLXNlcmlmOyB9Ci0KLUgxLCBIMiwgSDMsIEg0LCBwLCBhIHsgY29sb3IgOiAjNEQ0RDREOyB9Ci0KLS5pbnRyby1oZWFkZXIgSDEgewotCWZvbnQtc2l6ZSA6IDE2cHQ7Ci0JZm9udC13ZWlnaHQgOiBub3JtYWw7Ci0JY29sb3IgOiAjRTVFNUU1OwotfQotCi1oMiB7Ci0JZm9udC1zaXplIDogMTNwdDsKLQlmb250LXdlaWdodCA6IG5vcm1hbDsKLQljb2xvciA6ICM3Qjg2OTQ7Ci19Ci0vKiBGb3IgcmVndWxhciBkaXYgbGFiZWxzICovCi1INCAuZGl2LWxhYmVsIHsKLQlmb250LXNpemUgOiAxMHB0OwotCWZvbnQtd2VpZ2h0IDogYm9sZDsKLX0KLQotLyogRm9yIHRoZSBtYWluIHBhZ2UgY29udGVudCdzIHRpdGxlICovCi0jY29udGVudC1oZWFkZXIgSDQgLmRpdi1sYWJlbCB7Ci0JZm9udC1zaXplIDogMTRwdDsKLQlmb250LXdlaWdodCA6IG5vcm1hbDsKLQljb2xvciA6ICM4Qzk2QTI7Ci0JZmxvYXQgOiBub25lOwotCWNsZWFyIDogYm90aDsKLX0KLQotLnBhZ2UtZGVzY3JpcHRpb24geyAKLQlmb250LXNpemUgOiAxMHB0OwotCWZsb2F0IDogbm9uZTsKLQljbGVhciA6IGJvdGg7Ci19Ci0KLWEgewotCWZvbnQtd2VpZ2h0IDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotCWNvbG9yIDogIzRENEQ0RDsKLX0KLQotYSAubGluay1sYWJlbCB7Ci0JZm9udC1zaXplIDogMTBwdDsKLQlmb250LXdlaWdodCA6IG5vcm1hbDsKLX0KLQotI25hdmlnYXRpb24tbGlua3MgYSAubGluay1sYWJlbCB7Ci0JZm9udC1zaXplIDogOXB0OwotCWZvbnQtd2VpZ2h0IDogbm9ybWFsOwotCWNvbG9yIDogI0U1RTVFNTsKLX0KLQotYSAudGV4dCB7Ci0JZm9udC1zaXplIDogOHB0OwotCWZvbnQtd2VpZ2h0IDogbm9ybWFsOwotfQotCi1wIC5ncm91cC1kZXNjcmlwdGlvbiB7Ci0JZm9udC1zaXplIDogMTBwdDsKLQlmb250LXdlaWdodCA6IG5vcm1hbDsKLX0KLQotCi0vKiAKLSAqIFNldCB1cCBvdGhlciBnZW5lcmFsIHByb3BlcnRpZXMgbGlrZSBwYWRkaW5nL21hcmdpbnMKLSAqLwotaHRtbCwgYm9keSB7IHdpZHRoIDogMTAwJTsgaGVpZ2h0IDogMTAwJTsgfQotCi1odG1sLCBib2R5LCBkaXYsIGgxLCBoNCwgcCwgYSB7IG1hcmdpbiA6IDBweDsgcGFkZGluZyA6IDBweDsgfQotCi0uaW50cm8taGVhZGVyIEgxIHsgcGFkZGluZy10b3AgOiAxMHB4OyBtYXJnaW4tbGVmdCA6IDEwcHg7IH0KLQotLyogRm9yIHJlZ3VsYXIgZGl2IGxhYmVscyAqLwotI3BhZ2UtY29udGVudCBkaXYgSDQgewotCXBhZGRpbmcgOiAxMHB4OwotCXBhZGRpbmctYm90dG9tIDogMHB4OwotfQotCi0vKiBGb3IgdGhlIG1haW4gcGFnZSBjb250ZW50J3MgZGl2IGxhYmVsICovCi0jcGFnZS1jb250ZW50ICNjb250ZW50LWhlYWRlciBINCB7Ci0JcGFkZGluZy1ib3R0b20gOiAxMHB4OwotCXBhZGRpbmctdG9wIDogMHB4OwotfQotCi0vKiBzcGVjaWFsIGNhc2UgZm9yIE1vemlsbGEncyBtYWluIGNvbnRlbnQtaGVhZGVyIGxhYmVsLgotICAgTW96aWxsYSAxLjQgbmVlZHMgbW9yZSByb29tIGF0IHRoZSB0b3AgKi8KLSNwYWdlLWNvbnRlbnQgPiAjY29udGVudC1oZWFkZXIgSDQgeyBwYWRkaW5nLXRvcCA6IDEwcHg7IH0KLQotLyogTmVlZGVkIGluIElFIHRvIGdldCBzaGlmdCt0YWIgdG8gc2hvdyB0aGUgYWN0aXZlIGltYWdlIHByb3Blcmx5ICovCi1hOmFjdGl2ZSB7Ci0JYm9yZGVyIDogc29saWQgMHB4OwotfQotCi1hIGltZyB7Ci0JYm9yZGVyLXdpZHRoIDogMDsKLQliYWNrZ3JvdW5kLXJlcGVhdCA6IG5vLXJlcGVhdDsKLX0KLQotLyoKLSAqIHRvIGdldCBzY3JvbGxiYXJzIHdvcmtpbmcgaW4gYm90aCBJRSBhbmQgTW96aWxsYQotICovCi1odG1sLGJvZHkgeyBvdmVyZmxvdzogYXV0bzsgfQotaHRtbD5ib2R5IHsgb3ZlcmZsb3c6IHZpc2libGU7IH0KLQotLyoKLSAqIFNldCB1cCB0aGUgYm9keSwgZGVjb3JhdGl2ZSBiYWNrZ3JvdW5kLCBhbmQgbmF2aWdhdGlvbiBmb3IgdGhlIGNvbnRlbnQgCi0gKiBwYWdlcy4gCi0gKiBOb3RlOiB0aGUgcm9vdCBwYWdlIGhhbmRsZXMgaXRzIG93biBiYWNrZ3JvdW5kIGFuZCBuYXZpZ2F0aW9uOyB0aGVzZQotICogc2V0dGluZ3MgcHJpbWFyaWx5IGFwcGx5IHRvIHRoZSBjb250ZW50IHBhZ2VzCi0gKi8KLWJvZHkgewotCWJhY2tncm91bmQtY29sb3IgOiAjRkZGRkZGOwotCWJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0OwotCWJhY2tncm91bmQtcG9zaXRpb24gOiBib3R0b20gcmlnaHQ7Ci19Ci0KLSNiYWNrZ3JvdW5kLWltYWdlIHsKLQl3aWR0aCA6IDEwMCU7Ci0JbWluLXdpZHRoIDogNzcwcHg7Ci0JaGVpZ2h0IDogMTY0cHg7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9jb250ZW50cGFnZS9iYWNrZ3JvdW5kLmpwZyk7Ci0JYmFja2dyb3VuZC1yZXBlYXQgOiBuby1yZXBlYXQ7Ci0JYmFja2dyb3VuZC1wb3NpdGlvbiA6IHRvcCBsZWZ0OwkKLQlwb3NpdGlvbiA6IGFic29sdXRlOwotCXRvcCA6IDBweDsKLQl6LWluZGV4IDogLTEwMDsKLX0KLQotI2N1cnZlLWltYWdlIHsgCi0Jd2lkdGggOiAxMDAlOwotCWhlaWdodCA6IDE2NHB4OwotCXBvc2l0aW9uIDogYWJzb2x1dGU7Ci0JdG9wIDogMHB4OwotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvY29udGVudHBhZ2UvYmFja2dyb3VuZC5naWYpOwotCWJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0OwotCWJhY2tncm91bmQtcG9zaXRpb24gOiB0b3AgY2VudGVyOwotCW1hcmdpbiA6IDA7Ci0JcGFkZGluZyA6IDA7Ci19Ci0KLS5pbnRyby1oZWFkZXIgewliYWNrZ3JvdW5kLWNvbG9yIDogdHJhbnNwYXJlbnQ7IHotaW5kZXggOiAxMDA7fQotCi1ib2R5LCAucGFnZXsKLQltaW4td2lkdGggOiA3NzBweDsKLQkvKiBzaW5jZSBJRSBkb2Vzbid0IHN1cHBvcnQgbWluLXdpZHRoLCB0cnkgZXhwcmVzc2lvbiAqLwotCXdpZHRoOmV4cHJlc3Npb24oZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCA8IDc3MD8gIjc3MHB4IjogImF1dG8iICk7Ci0JbWluLWhlaWdodCA6IDQyNXB4OwotCWhlaWdodCA6IDEwMCU7Ci0JaGVpZ2h0IDogZXhwcmVzc2lvbihkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCA8IDQyNT8gIjQyNXB4IjogIjEwMCUiICk7Ci19Ci0KLS5wYWdlIHsgCi0JYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9jb250ZW50cGFnZS93b3JkbWFyay5naWYpOwotCWJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0OwotCWJhY2tncm91bmQtcG9zaXRpb24gOiBib3R0b20gbGVmdDsKLQltaW4taGVpZ2h0IDogNDc1cHg7Ci19Ci0KLSNwYWdlLWNvbnRlbnQgewotCWJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0OwotCWJhY2tncm91bmQtcG9zaXRpb24gOiBib3R0b20gcmlnaHQ7Ci0JaGVpZ2h0IDogNzAlOwotfQotCi0vKiAKLSAqIExheSBvdXQgdGhlIG5hdmlnYXRpb24gbGlua3MgCi0gKiAoUm9vdCBwYWdlIGRvZXMgc29tZXRoaW5nIHNpbWlsYXIgZm9yIGl0cyBuYXZpZ2F0aW9uKQotICovCi0jbmF2aWdhdGlvbi1saW5rcyB7Ci0JcG9zaXRpb24gOiByZWxhdGl2ZTsKLQlsZWZ0IDogMTBweDsKLQl0b3AgOiA1cHg7Ci0JaGVpZ2h0IDogNjA7Ci0Jd2lkdGggOiA5OCU7Ci19Ci0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEgewotCXBhZGRpbmctbGVmdCA6IDVweDsKLQlwYWRkaW5nLXJpZ2h0IDogNXB4OwotCWZsb2F0IDogbGVmdDsKLQl0ZXh0LWFsaWduIDogY2VudGVyOwotfQotCi0jbmF2aWdhdGlvbi1saW5rcyBhIGltZyB7Ci0JaGVpZ2h0IDogNTJweDsKLQl3aWR0aCA6IDUycHg7Ci0JdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7Ci19Ci0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEgLmxpbmstbGFiZWwgeyBkaXNwbGF5IDogYmxvY2s7IG1hcmdpbi10b3AgOiA1cHg7fQotCi0jbmF2aWdhdGlvbi1saW5rcyBhIC50ZXh0IHsgZGlzcGxheSA6IG5vbmU7IH0KLQotI25hdmlnYXRpb24tbGlua3MgYTpob3ZlciwgCi0jbmF2aWdhdGlvbi1saW5rcyBhOmZvY3VzIAotI25hdmlnYXRpb24tbGlua3MgYTphY3RpdmUgeyBib3JkZXItcmlnaHQgOiAwcHg7fQotCi0vKiBwcm9wZXJ0aWVzIGZvciBlYWNoIG9mIHRoZSBuYXZpZ2F0aW9uLWxpbmtzICAqLwotI25hdmlnYXRpb24tbGlua3MgYSNvdmVydmlldyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3NDguZ2lmKTsgfQotI25hdmlnYXRpb24tbGlua3MgYSNvdmVydmlldzpob3ZlciBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI292ZXJ2aWV3OmZvY3VzIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjb3ZlcnZpZXc6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc0OC5naWYpOyB9Ci0vKiNuYXZpZ2F0aW9uLWxpbmtzIGEjb3ZlcnZpZXc6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc0OHNlbC5naWYpOyB9Ki8KLQotI25hdmlnYXRpb24tbGlua3MgYSN0dXRvcmlhbHMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHM0OC5naWYpOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI3R1dG9yaWFsczpob3ZlciBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI3R1dG9yaWFsczphY3RpdmUgaW1nLAotI25hdmlnYXRpb24tbGlua3MgYSN0dXRvcmlhbHM6Zm9jdXMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM0OC5naWYpOyB9Ci0vKiNuYXZpZ2F0aW9uLWxpbmtzIGEjdHV0b3JpYWxzOmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczQ4c2VsLmdpZik7IH0qLwotCi0jbmF2aWdhdGlvbi1saW5rcyBhI3NhbXBsZXMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC9zYW1wbGVzNDguZ2lmKTsgfQotI25hdmlnYXRpb24tbGlua3MgYSNzYW1wbGVzOmhvdmVyIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjc2FtcGxlczphY3RpdmUgaW1nLAotI25hdmlnYXRpb24tbGlua3MgYSNzYW1wbGVzOmZvY3VzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczQ4LmdpZik7IH0KLS8qI25hdmlnYXRpb24tbGlua3MgYSNzYW1wbGVzOmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3NhbXBsZXM0OHNlbC5naWYpOyB9Ki8KLQotI25hdmlnYXRpb24tbGlua3MgYSNuZXdzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2hhdHNuZXc0OC5naWYpOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI25ld3M6aG92ZXIgaW1nLAotI25hdmlnYXRpb24tbGlua3MgYSNuZXdzOmZvY3VzIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjbmV3czphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC93aGF0c25ldzQ4LmdpZik7IH0KLS8qI25hdmlnYXRpb24tbGlua3MgYSNuZXdzOmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3doYXRzbmV3NDhzZWwuZ2lmKTsgfSovCi0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjd29ya2JlbmNoIHsgcG9zaXRpb24gOiBhYnNvbHV0ZTsgIHJpZ2h0IDogMHB4OyB0b3AgOiAtMzVweDsgdGV4dC1hbGlnbiA6IHJpZ2h0O30KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjd29ya2JlbmNoIC50ZXh0IHsgZGlzcGxheSA6IG5vbmU7IH0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjd29ya2JlbmNoIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2I0OC5naWYpOyB3aWR0aCA6IDUzcHg7IGhlaWdodCA6IDUzcHg7fQotI25hdmlnYXRpb24tbGlua3MgYSN3b3JrYmVuY2g6aG92ZXIgaW1nLAotI25hdmlnYXRpb24tbGlua3MgYSN3b3JrYmVuY2g6Zm9jdXMgaW1nLAotI25hdmlnYXRpb24tbGlua3MgYSN3b3JrYmVuY2g6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2I0OC5naWYpOyB9Ci0KLS8qIAotICogTGF5IG91dCB0aGUgcGFnZSB0aXRsZSBhbmQgZGVzY3JpcHRpb24gCi0gKi8KLWgxLCBwIHsgbWFyZ2luLWxlZnQgOiAxMHB4OyB9IC8qIHJlcXVpcmVkIGluIG1vemlsbGEgc28gdGhlIHBhZ2UgZGVzY3JpcHRpb24gaXMgcHJvcGVybHkgaW5kZW50ZWQgKi8KLQotLyogcG9zaXRpb24gdGhlIHBhZ2UgY29udGVudCBzbyB0aGF0IHRoZSBwYWdlIHRpdGxlIG92ZXJsYXlzIHRoZSBib3R0b20KLSAqIG9mIHRoZSBiYWNrZ3JvdW5kIGltYWdlLCBidXQgbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGFsd2F5cyBvbiB0b3AgCi0gKiAodXNpbmcgei1pbmRleCkgKi8KLSNwYWdlLWNvbnRlbnQgewotCWZsb2F0IDogbm9uZTsKLQljbGVhciA6IGJvdGg7Ci0JdGV4dC1hbGlnbiA6IGNlbnRlcjsKLQltYXJnaW4tdG9wIDogMzVweDsKLX0KLQotLnBhZ2UgPiAjcGFnZS1jb250ZW50IHsgbWFyZ2luLXRvcCA6IDUwcHg7IH0KLQotI3BhZ2UtY29udGVudCBwIHsgCi0JcGFkZGluZy1ib3R0b20gOiAxNXB4OyAKLQl0ZXh0LWFsaWduIDogbGVmdDsgCi0JZmxvYXQgOiBub25lOwotCWNsZWFyIDogYm90aDsKLX0KLQotI3BhZ2UtY29udGVudCAjY29udGVudC1oZWFkZXIgSDQsIC5wYWdlLWRlc2NyaXB0aW9uIHsKLQl0ZXh0LWFsaWduIDogbGVmdDsKLQltYXJnaW4tcmlnaHQgOiAxMHB4OwotCWZsb2F0IDogbm9uZTsKLQljbGVhciA6IGJvdGg7Ci19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc3RhbmRieV9yb290LmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc3RhbmRieV9yb290LmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJkNTIxOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3N0YW5kYnlfcm9vdC5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi0vKiAKLSAqIFNldCB1cCBnZW5lcmFsIGZvbnQgY29sb3Vycywgc2l6ZXMsIGV0Yy4gIFNvbWUgb2YgdGhlc2Ugd2lsbCBvdmVycmlkZQotICogc2V0dGluZ3MgZnJvbSB0aGUgc2hhcmVkIENTUyAKLSAqLwotLmludHJvLWhlYWRlciBIMSB7Ci0JZm9udC1zaXplIDogMTVwdDsKLX0KLQotI3BhZ2UtbGlua3MgYSAubGluay1sYWJlbCwgI2FjdGlvbi1saW5rcyBhIC5saW5rLWxhYmVsIHsKLQlmb250LXNpemUgOiAxMHB0OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCWNvbG9yIDogI0U1RTVFNTsKLX0KLQotI3BhZ2UtbGlua3MgYSBwIC50ZXh0LCAjYWN0aW9uLWxpbmtzIGEgcCAudGV4dCB7Ci0JZm9udC1zaXplIDogMTBwdDsKLQlmb250LXdlaWdodCA6IDUwMDsKLQljb2xvciA6ICNFNUU1RTU7Ci19Ci0KLS8qCi0gKiBTZXQgdXAgdGhlIGNvbnRlbnQgZm9yIHRoZSBzdGFuZGJ5IHBhZ2UuCi0gKi8KLWJvZHkgewotCW1pbi13aWR0aCA6IDIzMHB4OwotCS8qIHNpbmNlIElFIGRvZXNuJ3Qgc3VwcG9ydCBtaW4td2lkdGgsIHVzZSBleHByZXNzaW9uICovCi0Jd2lkdGg6ZXhwcmVzc2lvbihkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIDwgMjMwPyAiMjMwcHgiOiAiYXV0byIgKTsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL3Jvb3RwYWdlL2JhY2tncm91bmQuanBnKTsKLQliYWNrZ3JvdW5kLXJlcGVhdCA6IG5vLXJlcGVhdDsKLQliYWNrZ3JvdW5kLXBvc2l0aW9uIDogdG9wIGxlZnQ7Ci0JYmFja2dyb3VuZC1jb2xvciA6ICM3MTY5RDE7Ci19Ci0KLS5wYWdlIHsgCi0JYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9yb290cGFnZS9icmFuZG1hcmsuZ2lmKTsKLQliYWNrZ3JvdW5kLXJlcGVhdCA6IG5vLXJlcGVhdDsKLQliYWNrZ3JvdW5kLXBvc2l0aW9uIDogYm90dG9tIGxlZnQ7Ci0JbWluLXdpZHRoIDogMjMwcHg7Ci0JLyogc2luY2UgSUUgZG9lc24ndCBzdXBwb3J0IG1pbi13aWR0aCwgdXNlIGV4cHJlc3Npb24gKi8KLQl3aWR0aDpleHByZXNzaW9uKGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggPCAyMzA/ICIyMzBweCI6ICJhdXRvIiApOwotIAltaW4taGVpZ2h0IDogNjEwcHg7Ci0JaGVpZ2h0IDogMTAwJTsKLQloZWlnaHQgOiBleHByZXNzaW9uKGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0IDwgNDUwPyAiNDUwcHgiOiAiMTAwJSIgKTsKLX0KLQotLyogCi0gKiBTZXQgdXAgdGhlIG5hdmlnYXRpb24gYmFyLiAgSXQgc2hvdWxkIGJlIGNlbnRlcmVkIGluIHRoZSBtaWRkbGUKLSAqIG9mIHRoZSBwYWdlCi0gKi8KLQotI2xpbmtzLWJhY2tncm91bmQgeyAKLQl3aWR0aCA6IDEwMCU7IAotIAltYXJnaW4tdG9wIDogMTAlOyAKLQltYXJnaW4tYm90dG9tIDogYXV0bzsKLQl0ZXh0LWFsaWduIDogY2VudGVyOwotfQotCi0jcGFnZS1saW5rcyBhIHsKLQlkaXNwbGF5IDogYmxvY2s7Ci0Jd2lkdGggOiAyMjBweDsKLQl0ZXh0LWFsaWduIDogbGVmdDsgCi0JbWFyZ2luLWxlZnQgOiBhdXRvOwotCW1hcmdpbi1yaWdodCA6IGF1dG87Ci0JbWFyZ2luLXRvcCA6IDBweDsKLQl2ZXJ0aWNhbC1hbGlnbiA6IHRvcDsKLX0KLSNwYWdlLWxpbmtzIGEgc3BhbiwgI3BhZ2UtbGlua3MgYSBwIHsKLQlkaXNwbGF5IDogYmxvY2s7Ci0Jd2lkdGggOiAxNjBweDsKLQltYXJnaW4gOiAwcHg7Ci0JcGFkZGluZyA6IDBweDsKLX0KLQotI3BhZ2UtbGlua3MgYSAubGluay1sYWJlbCB7Ci0JcG9zaXRpb24gOiByZWxhdGl2ZTsKLQlsZWZ0IDogNjBweDsKLQl0b3AgOiAtNTBweDsKLX0KLQotI3BhZ2UtbGlua3MgYSBwIC50ZXh0IHsKLQlwb3NpdGlvbiA6IHJlbGF0aXZlOwotCWxlZnQgOiA2MHB4OwotCXRvcCA6IC01MHB4OwotCi19Ci0KLSNwYWdlLWxpbmtzIGEgaW1nIHsKLQloZWlnaHQgOiA1MnB4OwotCXdpZHRoIDogNTJweDsKLQl2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsKLX0KLQotI3BhZ2UtbGlua3MgYTpob3ZlciwKLSNwYWdlLWxpbmtzIGE6Zm9jdXMsCi0jcGFnZS1saW5rcyBhOmFjdGl2ZSAgeyBib3JkZXIgOiAwcHg7IH0KLQotI3BhZ2UtbGlua3MgYTpob3ZlciBwLAotI3BhZ2UtbGlua3MgYTpmb2N1cyBwLAotI3BhZ2UtbGlua3MgYTphY3RpdmUgcCAgeyBtYXJnaW4gOiAwcHg7IHBhZGRpbmcgOiAwcHg7IH0KLQotLyogcHJvcGVydGllcyBmb3IgZWFjaCBvZiB0aGUgcGFnZS1saW5rcyAgKi8KLWEjb3ZlcnZpZXcgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldzQ4LmdpZik7IH0KLWEjb3ZlcnZpZXc6aG92ZXIgaW1nLAotYSNvdmVydmlldzpmb2N1cyBpbWcsCi1hI292ZXJ2aWV3OmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL292ZXJ2aWV3NDguZ2lmKTsgfQotYSNzdGVwcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL2ZpcnN0ZXBzNDguZ2lmKTsgfWEjc3RlcHM6aG92ZXIgaW1nLGEjc3RlcHM6Zm9jdXMgaW1nLGEjc3RlcHM6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZmlyc3RlcHM0OC5naWYpOyB9Ci1hI3R1dG9yaWFscyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFsczQ4LmdpZik7IH0KLWEjdHV0b3JpYWxzOmhvdmVyIGltZywKLWEjdHV0b3JpYWxzOmZvY3VzIGltZywKLWEjdHV0b3JpYWxzOmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczQ4LmdpZik7IH0KLWEjd2ViIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2VicnNyYzQ4LmdpZik7IH1hI3dlYjpob3ZlciBpbWcsYSN3ZWI6Zm9jdXMgaW1nLGEjd2ViOmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3dlYnJzcmM0OC5naWYpOyB9Ci1hI3NhbXBsZXMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC9zYW1wbGVzNDguZ2lmKTsgfQotYSNzYW1wbGVzOmhvdmVyIGltZywKLWEjc2FtcGxlczpmb2N1cyBpbWcsCi1hI3NhbXBsZXM6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczQ4LmdpZik7IH0KLQotYSNuZXdzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2hhdHNuZXc0OC5naWYpOyB9Ci1hI25ld3M6aG92ZXIgaW1nLAotYSNuZXdzOmZvY3VzIGltZywKLWEjbmV3czphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC93aGF0c25ldzQ4LmdpZik7IH0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9zdGFuZGJ5X3N3dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9zdGFuZGJ5X3N3dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzcyMzFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc3RhbmRieV9zd3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXN0YW5kYnkubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLm92ZXJ2aWV3LmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldzcyLmdpZgotc3RhbmRieS5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Muc3RlcHMubGluay1pY29uPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZmlyc3RlcHM3Mi5naWYKLXN0YW5kYnkubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLnR1dG9yaWFscy5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzNzIuZ2lmCi1zdGFuZGJ5LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy53ZWIubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmM3Mi5naWYKLQotCi1zdGFuZGJ5LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5vdmVydmlldy5ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL292ZXJ2aWV3NzIuZ2lmCi1zdGFuZGJ5LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5zdGVwcy5ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2ZpcnN0ZXBzNzIuZ2lmCi1zdGFuZGJ5LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy50dXRvcmlhbHMuaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM3Mi5naWYKLXN0YW5kYnkubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLndlYi5ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3dlYnJzcmM3Mi5naWYKLQotCi1zdGFuZGJ5LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5sYXlvdXQudnNwYWNpbmcgPSAzMAotc3RhbmRieS5sYXlvdXQudnNwYWNpbmcgPSAzNQotc3RhbmRieS5zaG93LWxpbmstZGVzY3JpcHRpb24gPSBmYWxzZQotc3RhbmRieS5zaG93LWhvbWUtcGFnZS1uYXZpZ2F0aW9uID0gZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3RvdXItcGxhY2Vob2xkZXIuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdG91ci1wbGFjZWhvbGRlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjQ0YmY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdG91ci1wbGFjZWhvbGRlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPGh0bWw+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxoZWFkPgotPHRpdGxlPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgVG91cjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMz5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIFRvdXI8L2gzPgotPGJyLz4KLTxoNT4gRmxhc2ggYmFzZWQgbXVsdGltZWRpYSBjb250ZW50LCB0byBiZSBwcm9kdWNlZDwvaDU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3RvdXItc3d0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3RvdXItc3d0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhY2ZlM2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy90b3VyLXN3dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1vdmVydmlldy5wYWdlLWNvbnRlbnQub3ZlcnZpZXctbGlua3MucGRlLmxpbmstaWNvbiA9IGNzcy9uZXdfZ3JhcGhpY3Mvb2JqXzQ4L3BsdWdpbl9vYmouZ2lmCi0KLXR1dG9yaWFscy5wYWdlLWNvbnRlbnQucGRlLmxheW91dC5uY29sdW1ucyA9IDIKLXR1dG9yaWFscy5wYWdlLWNvbnRlbnQucGRlLnJjcC5saW5rLWljb24gPSBjc3MvbmV3X2dyYXBoaWNzL29ial80OC9yY3BhcHBfb2JqLmdpZgotdHV0b3JpYWxzLnBhZ2UtY29udGVudC5wZGUucGRlLWhlbGxvLXdvcmxkLmxpbmstaWNvbiA9IGNzcy9uZXdfZ3JhcGhpY3Mvb2JqXzQ4L3BsdWdpbl9vYmouZ2lmCi10dXRvcmlhbHMucGFnZS1jb250ZW50LnBkZS5mZWF0dXJlcy5saW5rLWljb24gPSBjc3MvbmV3X2dyYXBoaWNzL29ial80OC9mZWF0dXJlc19vYmouZ2lmCi0KLW5ld3MubGF5b3V0Lm5jb2x1bW5zID0gMgotb3ZlcnZpZXcubGF5b3V0Lm5jb2x1bW5zID0gMgotb3ZlcnZpZXcubGF5b3V0LmxpbmstdnNwYWNpbmcgPSA0MAotZmlyc3RzdGVwcy5sYXlvdXQubmNvbHVtbnMgPSAxCi10dXRvcmlhbHMucGFnZS1jb250ZW50LmxheW91dC5uY29sdW1ucyA9IDIKLXNhbXBsZXMucGFnZS1jb250ZW50LmxheW91dC5uY29sdW1ucyA9IDIKLXdlYnJlcy5wYWdlLWNvbnRlbnQubGF5b3V0Lm5jb2x1bW5zID0gMQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3RvdXIuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy90b3VyLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFlYTY1ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3RvdXIuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2NvbnRlbnRwYWdlL292ZXJ2aWV3X3d0ci5qcGcpOwotfQotCi0ucGFnZSB7IG1pbi1oZWlnaHQgOiA3MDBweDsgfQotCi0vKiBzaG93IHRoZSAic2VsZWN0ZWQiIGltYWdlIGZvciB0aGlzIHBhZ2UgKi8KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjb3ZlcnZpZXcgaW1nLCAjbmF2aWdhdGlvbi1saW5rcyBhI292ZXJ2aWV3OmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc0OHNlbC5naWYpOyB9CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3RvdXIuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdG91ci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGNhZGM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdG91ci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08ZGl2IGlkPSJ3ZWxjb21lLWJhbm5lciI+Ci0gCTxPQkpFQ1QgY2xhc3NpZD0iY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIiBjb2RlYmFzZT0iaHR0cDovL2Rvd25sb2FkLm1hY3JvbWVkaWEuY29tL3B1Yi9zaG9ja3dhdmUvY2Ficy9mbGFzaC9zd2ZsYXNoLmNhYiN2ZXJzaW9uPTYsMCwwLDAiIFdJRFRIPSI3ODAiIEhFSUdIVD0iNDI1IiBpZD0idG91ciIgQUxJR049IiI+Ci0JPFBBUkFNIE5BTUU9bW92aWUgVkFMVUU9ImNzcy90b3VyL3RvdXIuc3dmIj4KLSAJPFBBUkFNIE5BTUU9cXVhbGl0eSBWQUxVRT1oaWdoPgotIAk8UEFSQU0gTkFNRT1iZ2NvbG9yIFZBTFVFPSNGRkZGRkY+Ci0gCTxQQVJBTSBOQU1FPUZsYXNoVmFycyBWQUxVRT0idG91cnBhdGg9Y3NzL3RvdXIiPgotIAk8RU1CRUQgc3JjPSJjc3MvdG91ci90b3VyLnN3ZiIgZmxhc2h2YXJzPSJ0b3VycGF0aD1jc3MvdG91ciIgcXVhbGl0eT1oaWdoIGJnY29sb3I9I0ZGRkZGRiAgV0lEVEg9Ijc4MCIgSEVJR0hUPSI0MjUiIE5BTUU9InRvdXIiIEFMSUdOPSIiIFRZUEU9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIiBQTFVHSU5TUEFHRT0iaHR0cDovL3d3dy5tYWNyb21lZGlhLmNvbS9nby9nZXRmbGFzaHBsYXllciI+PC9FTUJFRD4KLQk8L09CSkVDVD4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy90dXRvcmlhbHMvc3d0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3R1dG9yaWFscy9zd3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJiNzg3OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3R1dG9yaWFscy9zd3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXR1dG9yaWFscy5sYXlvdXQubmNvbHVtbnMgPSAyCi10dXRvcmlhbHMucGFnZS1jb250ZW50LmxheW91dC52c3BhY2luZyA9IDQwCi0KLXR1dG9yaWFscy5wYWdlLWNvbnRlbnQudHV0b3JpYWxzLWxpbmtzLmxheW91dC5uY29sdW1ucyA9IDIKLXR1dG9yaWFscy5wYWdlLWNvbnRlbnQudHV0b3JpYWxzLWxpbmtzLmxheW91dC52c3BhY2luZyA9IDM1Ci0KLXR1dG9yaWFscy5zdWJ0aXRsZS1pZCA9IHR1dG9yaWFscy9wYWdlLWNvbnRlbnQvcGFnZS10aXRsZQotdHV0b3JpYWxzLmRlc2NyaXB0aW9uLWlkID0gdHV0b3JpYWxzL3BhZ2UtY29udGVudC9wYWdlLWRlc2NyaXB0aW9uCi0KLXR1dG9yaWFscy5wYWdlLWNvbnRlbnQudHV0b3JpYWxzLWxpbmtzLmVwZi10dXQtbmF2aWdhdGUubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfbmF2dWlfb2JqLmdpZgotdHV0b3JpYWxzLnBhZ2UtY29udGVudC50dXRvcmlhbHMtbGlua3MuZXBmLXR1dC1wcm9jZXNzLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3dvcmtwcm9jX29iai5naWYKLXR1dG9yaWFscy5wYWdlLWNvbnRlbnQudHV0b3JpYWxzLWxpbmtzLmVwZi10dXQtZWxlbWVudC5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9tZXRoY29udF9vYmouZ2lmCi10dXRvcmlhbHMucGFnZS1jb250ZW50LnR1dG9yaWFscy1saW5rcy5lcGYtdHV0LXB1YmV4cC5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9wdWJleHBfb2JqLmdpZgotdHV0b3JpYWxzLnBhZ2UtY29udGVudC50dXRvcmlhbHMtbGlua3MuZXBmLXR1dC1jb250ZW50LmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3JlbWV0aGNvbnRfb2JqLmdpZgotI292ZXJ2aWV3LnBhZ2UtY29udGVudC5vdmVydmlldy1saW5rcy5iYXNpY3MubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3diYmFzaWNzX29iai5naWYKLSNvdmVydmlldy5wYWdlLWNvbnRlbnQub3ZlcnZpZXctbGlua3MudGVhbS5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdGVhbXN1cF9vYmouZ2lmCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3R1dG9yaWFscy90dXRvcmlhbHMuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy90dXRvcmlhbHMvdHV0b3JpYWxzLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhOTRiMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3R1dG9yaWFscy90dXRvcmlhbHMuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3R1dG9yaWFsc193dHIuanBnKTsKLX0KLQotLnBhZ2UgeyBtaW4taGVpZ2h0IDogNzAwcHg7IH0KLQotLyogc2hvdyB0aGUgInNlbGVjdGVkIiBpbWFnZSBmb3IgdGhpcyBwYWdlICovCi0jbmF2aWdhdGlvbi1saW5rcyBhI3R1dG9yaWFscyBpbWcsICNuYXZpZ2F0aW9uLWxpbmtzIGEjdHV0b3JpYWxzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNDhzZWwuZ2lmKTsgfQotCi0vKiAKLSAqIFNldCB1cCB0aGUgY29udGVudCBvZiB0aGUgdHV0b3JpYWxzIHBhZ2UgaW50byB0d28KLSAqIGNvbHVtbnMgdGhhdCBhcmUgY2VudGVyZWQgaW4gdGhlIHBhZ2UKLSAqLwotCi0KLSN0dXRvcmlhbHMtbGlua3Mgewl0ZXh0LWFsaWduIDogbGVmdDsJd2lkdGggOiA3NjBweDsJLyogVG8gY2VudGVyIGluIE1veiAoaGF2ZSB0byB1c2UgdGV4dC1hbGlnbiBmb3IgSUUpICovCW1hcmdpbiA6IDBweCBhdXRvO30jdHV0b3JpYWxzLWxpbmtzIGEgeyAJd2lkdGggOiAzNzBweDsJdGV4dC1hbGlnbiA6IGxlZnQ7IAltYXJnaW4tbGVmdCA6IDVweDsJbWFyZ2luLXJpZ2h0IDogNXB4OwltYXJnaW4tdG9wIDogNXB4OwltYXJnaW4tYm90dG9tIDogLTIwcHg7CXZlcnRpY2FsLWFsaWduIDogdG9wO30jdHV0b3JpYWxzLWxpbmtzID4gYSB7IHZlcnRpY2FsLWFsaWduIDogbWlkZGxlOyB9I3R1dG9yaWFscy1saW5rcyBhIGltZyB7CWhlaWdodCA6IDU3cHg7CXdpZHRoIDogNTdweDsJdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7fQkjdHV0b3JpYWxzLWxpbmtzIGEgLmxpbmstbGFiZWwgewlkaXNwbGF5IDogYmxvY2s7CXdpZHRoIDogMzAwcHg7CXBvc2l0aW9uIDogcmVsYXRpdmU7CXRvcCA6IC01MHB4OwlsZWZ0IDogNjBweDt9I3R1dG9yaWFscy1saW5rcyBhIHAgLnRleHQgewlkaXNwbGF5IDogYmxvY2s7CXdpZHRoIDogMzAwcHg7CXBvc2l0aW9uIDogcmVsYXRpdmU7CXRvcCA6IC00NXB4OwlsZWZ0IDogNTNweDt9LyogU3BlY2lhbCBjYXNlIGZvciBNb3ppbGxhLCBiZWNhdXNlIHRoZSBsaW5rcyBhcmUgZGlzcGxheWVkICAgaW4gMSB2ZXJ0aWNhbCBjb2x1bW4gaW5zdGVhZCBvZiAyIGNlbnRlcmVkIGNvbHVtbnMgKi8jdHV0b3JpYWxzLWxpbmtzID4gYSB7IAl3aWR0aCA6IDcwMHB4OyB9I3R1dG9yaWFscy1saW5rcyBhID4gLmxpbmstbGFiZWwgeyB3aWR0aCA6IDcwMHB4OyB9I3R1dG9yaWFscy1saW5rcyBhIHAgPiAudGV4dCB7IHdpZHRoIDogNzAwcHg7IH0jdHV0b3JpYWxzLWxpbmtzIGE6aG92ZXIgeyBib3JkZXItcmlnaHQgOiA1cHg7IH1hI2Jhc2ljcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3diYmFzaWNzX29iai5naWYpOyB9YSNiYXNpY3M6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC93YmJhc2ljc2hvdl9vYmouZ2lmKTsgfWEjdGVhbSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3RlYW1zdXBfb2JqLmdpZik7IH1hI3RlYW06aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC90ZWFtc3VwaG92X29iai5naWYpOyB9CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3VtYV9odW1wLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdW1hX2h1bXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTMwZmIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdW1hX2h1bXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy93ZWJyZXNvdXJjZXMvd2VicmVzb3VyY2VzLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvd2VicmVzb3VyY2VzL3dlYnJlc291cmNlcy5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyM2E3OTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy93ZWJyZXNvdXJjZXMvd2VicmVzb3VyY2VzLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotLyoKLSAqIHdlYnJlc291cmNlcy5jc3MgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhlIGdyb3VwIHNwZWNpZmljIGNzcyBzZXR0aW5ncwotICovCi0gCi0vKgotICogYmFja2dyb3VuZCB3YXRlcm1hcmsgLSBncm91cCBzcGVjaWZpYwotICovCi0KLWJvZHkgewotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvY29udGVudHBhZ2Uvd2VicnNyY193dHIuanBnKTsKLX0KLQotLnBhZ2UgeyBtaW4taGVpZ2h0IDogNzAwcHg7IH0KLQotLyoKLSAqIHNob3cgdGhlICJzZWxlY3RlZCIgaW1hZ2UgZm9yIHRoaXMgcGFnZSAtIFRoaXMgaXMgZ3JvdXAgc3BlY2lmaWMKLSAqLwotCi0jbmF2aWdhdGlvbi1saW5rcyBhI3dlYiBpbWcsICNuYXZpZ2F0aW9uLWxpbmtzIGEjd2ViOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2VicnNyYzQ4c2VsLmdpZik7IH0KLQotLyogCi0gKiBTZXQgdXAgdGhlIE92ZXJ2aWV3IGxpbmtzIHRvIGJlIGRpc3BsYXllZCBpbiB0d28gY29sdW1ucwotICogdGhhdCBhcmUgY2VudGVyZWQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcGFnZS4KLSAqLwotCi0jd2ViLWxpbmtzIHsJdGV4dC1hbGlnbiA6IGxlZnQ7CXdpZHRoIDogNzYwcHg7CS8qIFRvIGNlbnRlciBpbiBNb3ogKGhhdmUgdG8gdXNlIHRleHQtYWxpZ24gZm9yIElFKSAqLwltYXJnaW4gOiAwcHggYXV0bzt9Ci0jd2ViLWxpbmtzIGEgeyAJd2lkdGggOiAzNzBweDsJdGV4dC1hbGlnbiA6IGxlZnQ7IAltYXJnaW4tbGVmdCA6IDVweDsJbWFyZ2luLXJpZ2h0IDogNXB4OwltYXJnaW4tdG9wIDogNXB4OwltYXJnaW4tYm90dG9tIDogLTIwcHg7CXZlcnRpY2FsLWFsaWduIDogdG9wO30KLSN3ZWItbGlua3MgPiBhIHsgdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7IH0KLSN3ZWItbGlua3MgYSBpbWcgewloZWlnaHQgOiA1N3B4Owl3aWR0aCA6IDU3cHg7CXZlcnRpY2FsLWFsaWduIDogbWlkZGxlO30JCi0jd2ViLWxpbmtzIGEgLmxpbmstbGFiZWwgewlkaXNwbGF5IDogYmxvY2s7CXdpZHRoIDogMzAwcHg7CXBvc2l0aW9uIDogcmVsYXRpdmU7CXRvcCA6IC01MHB4OwlsZWZ0IDogNjBweDt9Ci0jd2ViLWxpbmtzIGEgcCAudGV4dCB7CWRpc3BsYXkgOiBibG9jazsJd2lkdGggOiAzMDBweDsJcG9zaXRpb24gOiByZWxhdGl2ZTsJdG9wIDogLTQ1cHg7CWxlZnQgOiA1M3B4O30KLQotLyogU3BlY2lhbCBjYXNlIGZvciBNb3ppbGxhLCBiZWNhdXNlIHRoZSBsaW5rcyBhcmUgZGlzcGxheWVkCi0gICBpbiAxIHZlcnRpY2FsIGNvbHVtbiBpbnN0ZWFkIG9mIDIgY2VudGVyZWQgY29sdW1ucyAqLwotI3dlYi1saW5rcyA+IGEgeyAJd2lkdGggOiA3MDBweDsgfQotI3dlYi1saW5rcyBhID4gLmxpbmstbGFiZWwgeyB3aWR0aCA6IDcwMHB4OyB9Ci0jd2ViLWxpbmtzIGEgcCA+IC50ZXh0IHsgd2lkdGggOiA3MDBweDsgfQotCi0jd2ViLWxpbmtzIGE6aG92ZXIgeyBib3JkZXItcmlnaHQgOiA1cHg7IH0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvd2VicmVzb3VyY2VzL3dlYnJlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy93ZWJyZXNvdXJjZXMvd2VicmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YWJiOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy93ZWJyZXNvdXJjZXMvd2VicmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXdlYi5sYXlvdXQubmNvbHVtbnMgPSAyCi13ZWIucGFnZS1jb250ZW50LmxheW91dC52c3BhY2luZyA9IDQwCi0KLXdlYi5wYWdlLWNvbnRlbnQud2ViLWxpbmtzLmxheW91dC5uY29sdW1ucyA9IDIKLXdlYi5wYWdlLWNvbnRlbnQud2ViLWxpbmtzLmxheW91dC52c3BhY2luZyA9IDM1Ci0KLXdlYi5zdWJ0aXRsZS1pZCA9IHdlYi9wYWdlLWNvbnRlbnQvcGFnZS10aXRsZQotd2ViLmRlc2NyaXB0aW9uLWlkID0gd2ViL3BhZ2UtY29udGVudC9wYWdlLWRlc2NyaXB0aW9uCi0KLXdlYi5wYWdlLWNvbnRlbnQud2ViLWxpbmtzLmVwZl9yZXNvdXJjZS5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmX3Jlc291cmNlLmdpZgotCi0jbmV3cy5uZXctYW5kLW5vdGV3b3J0aHkubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L25ld19vYmouZ2lmCi0jbmV3cy5taWdyYXRpb24ubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L21pZ3JhdGVfb2JqLmdpZgotI25ld3MudXBkYXRlcy5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdXBkYXRlc19vYmouZ2lmCi0jbmV3cy5lY2xpcHNlLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9jb21tdW5pdHlfb2JqLmdpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvd2hhdHNuZXcvc3d0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3doYXRzbmV3L3N3dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDZkZGI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvd2hhdHNuZXcvc3d0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5ld3MucGFnZS1jb250ZW50Lm5ld3MtbGlua3MubGF5b3V0Lm5jb2x1bW5zID0gMgotbmV3cy5wYWdlLWNvbnRlbnQubmV3cy1saW5rcy5sYXlvdXQudnNwYWNpbmcgPSAzMAotCi1uZXdzLnBhZ2UtY29udGVudC5uZXdzLWxpbmtzLm5ldy1hbmQtbm90ZXdvcnRoeS5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbmV3X29iai5naWYKLW5ld3MucGFnZS1jb250ZW50Lm5ld3MtbGlua3MubWlncmF0aW9uLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9taWdyYXRlX29iai5naWYKLW5ld3MucGFnZS1jb250ZW50Lm5ld3MtbGlua3MudXBkYXRlcy5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdXBkYXRlc19vYmouZ2lmCi1uZXdzLnBhZ2UtY29udGVudC5uZXdzLWxpbmtzLmVjbGlwc2UubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2NvbW11bml0eV9vYmouZ2lmCi0KLW5ld3MucGFnZS1jb250ZW50Lm5vdGV3b3J0aHktbGlua3MubGF5b3V0Lm5jb2x1bW5zID0gMgotbmV3cy5wYWdlLWNvbnRlbnQubm90ZXdvcnRoeS1saW5rcy5sYXlvdXQudnNwYWNpbmcgPSAxNSAKLW5ld3MucGFnZS1jb250ZW50Lm5ld3MtbGlua3MubGF5b3V0LnZzcGFjaW5nID0gMTUgCi1uZXdzLnBhZ2UtY29udGVudC5sYXlvdXQudnNwYWNpbmcgPSA0MCAKLQotbmV3cy5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbmV3X29iai5naWYKLQotbmV3cy5zdWJ0aXRsZS1pZCA9IG5ld3MvcGFnZS1jb250ZW50L3BhZ2UtdGl0bGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvd2hhdHNuZXcvd2hhdHNuZXcuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy93aGF0c25ldy93aGF0c25ldy5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNTM2MGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy93aGF0c25ldy93aGF0c25ldy5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3doYXRzbmV3X3d0ci5qcGcpOwotfQotCi0ucGFnZSB7IG1pbi1oZWlnaHQgOiA1MDBweDsgfQotCi0vKiBzaG93IHRoZSAic2VsZWN0ZWQiIGltYWdlIGZvciB0aGlzIHBhZ2UgKi8KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjbmV3cyBpbWcsICNuYXZpZ2F0aW9uLWxpbmtzIGEjbmV3czpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL2N0b29sL3doYXRzbmV3NDhzZWwuZ2lmKTsgfQotCi0vKiAKLSAqIFNldCB1cCB0aGUgY29udGVudCBvZiB0aGUgV2hhdHMgTmV3IHBhZ2UgdG8gYmUgZGlzcGxheWVkIGluIAotICogdHdvIGNvbHVtbnMgdGhhdCBhcmUgY2VudGVyZWQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcGFnZS4KLSAqLwotCi0jbm90ZXdvcnRoeS1saW5rcyB7Ci0JdGV4dC1hbGlnbiA6IGxlZnQ7Ci0Jd2lkdGggOiA3NjBweDsKLQkvKiBUbyBjZW50ZXIgaW4gTW96IChoYXZlIHRvIHVzZSB0ZXh0LWFsaWduIGZvciBJRSkgKi8JCi0JbWFyZ2luOiAwcHggYXV0bzsKLX0KLQotI25vdGV3b3J0aHktbGlua3MgYSB7IAotCXdpZHRoIDogMzcwcHg7Ci0JdGV4dC1hbGlnbiA6IGxlZnQ7IAotCW1hcmdpbi1sZWZ0IDogNXB4OwotCW1hcmdpbi1yaWdodCA6IDVweDsKLQltYXJnaW4tdG9wIDogNXB4OwotCW1hcmdpbi1ib3R0b20gOiAtMjBweDsKLQl2ZXJ0aWNhbC1hbGlnbiA6IHRvcDsKLX0KLQotI25vdGV3b3J0aHktbGlua3MgPiBhIHsgdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7IH0KLQotI25vdGV3b3J0aHktbGlua3MgYSBpbWcgewotCWhlaWdodCA6IDU3cHg7Ci0Jd2lkdGggOiA1N3B4OwotCXZlcnRpY2FsLWFsaWduIDogbWlkZGxlOwotfQotCi0jbm90ZXdvcnRoeS1saW5rcyBhIC5saW5rLWxhYmVsIHsKLQlkaXNwbGF5IDogYmxvY2s7Ci0Jd2lkdGggOiAzMDBweDsKLQlwb3NpdGlvbiA6IHJlbGF0aXZlOwotCXRvcCA6IC01MHB4OwotCWxlZnQgOiA2MHB4OwotfQotCi0jbm90ZXdvcnRoeS1saW5rcyBhIHAgLnRleHQgewotCWRpc3BsYXkgOiBibG9jazsKLQl3aWR0aCA6IDMwMHB4OwotCXBvc2l0aW9uIDogcmVsYXRpdmU7Ci0JdG9wIDogLTQ1cHg7Ci0JbGVmdCA6IDUzcHg7Ci19Ci0KLS8qIFNwZWNpYWwgY2FzZSBmb3IgTW96aWxsYSwgYmVjYXVzZSB0aGUgbGlua3MgYXJlIGRpc3BsYXllZAotICAgaW4gMSB2ZXJ0aWNhbCBjb2x1bW4gaW5zdGVhZCBvZiAyIGNlbnRlcmVkIGNvbHVtbnMgKi8KLSNub3Rld29ydGh5LWxpbmtzID4gYSB7IHdpZHRoIDogNzAwcHg7IH0KLSNub3Rld29ydGh5LWxpbmtzIGEgPiAubGluay1sYWJlbCB7IHdpZHRoIDogNzAwcHg7IH0KLSNub3Rld29ydGh5LWxpbmtzIGEgcCA+IC50ZXh0IHsgd2lkdGggOiA3MDBweDsgfQotCi0jbm90ZXdvcnRoeS1saW5rcyBhOmhvdmVyIHsgYm9yZGVyLXJpZ2h0IDogNXB4OyB9Ci0KLSNub3Rld29ydGh5LWxpbmtzIGEgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC9uZXdfb2JqLmdpZik7IH0KLSNub3Rld29ydGh5LWxpbmtzIGE6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC9uZXdob3Zfb2JqLmdpZik7IH0KLQotCi0jbmV3cy1saW5rcyB7Ci0JdGV4dC1hbGlnbiA6IGxlZnQ7Ci0Jd2lkdGggOiA3NjBweDsKLQkvKiBUbyBjZW50ZXIgaW4gTW96IChoYXZlIHRvIHVzZSB0ZXh0LWFsaWduIGZvciBJRSkgKi8JCi0JbWFyZ2luOiAwcHggYXV0bzsKLX0KLQotI25ld3MtbGlua3MgYSB7IAotCXdpZHRoIDogMzcwcHg7Ci0JdGV4dC1hbGlnbiA6IGxlZnQ7IAotCW1hcmdpbi1sZWZ0IDogNXB4OwotCW1hcmdpbi1yaWdodCA6IDVweDsKLQltYXJnaW4tdG9wIDogNXB4OwotCW1hcmdpbi1ib3R0b20gOiAtMjBweDsKLQl2ZXJ0aWNhbC1hbGlnbiA6IHRvcDsKLX0KLQotI25ld3MtbGlua3MgPiBhIHsgdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7IH0KLQotI25ld3MtbGlua3MgYSBpbWcgewotCWhlaWdodCA6IDU3cHg7Ci0Jd2lkdGggOiA1N3B4OwotCXZlcnRpY2FsLWFsaWduIDogbWlkZGxlOwotfQotCi0jbmV3cy1saW5rcyBhIC5saW5rLWxhYmVsIHsKLQlkaXNwbGF5IDogYmxvY2s7Ci0Jd2lkdGggOiAzMDBweDsKLQlwb3NpdGlvbiA6IHJlbGF0aXZlOwotCXRvcCA6IC01MHB4OwotCWxlZnQgOiA2MHB4OwotfQotCi0jbmV3cy1saW5rcyBhIHAgLnRleHQgewotCWRpc3BsYXkgOiBibG9jazsKLQl3aWR0aCA6IDMwMHB4OwotCXBvc2l0aW9uIDogcmVsYXRpdmU7Ci0JdG9wIDogLTQ1cHg7Ci0JbGVmdCA6IDUzcHg7Ci19Ci0KLS8qIFNwZWNpYWwgY2FzZSBmb3IgTW96aWxsYSwgYmVjYXVzZSB0aGUgbGlua3MgYXJlIGRpc3BsYXllZAotICAgaW4gMSB2ZXJ0aWNhbCBjb2x1bW4gaW5zdGVhZCBvZiAyIGNlbnRlcmVkIGNvbHVtbnMgKi8KLSNuZXdzLWxpbmtzID4gYSB7IAl3aWR0aCA6IDcwMHB4OyB9Ci0jbmV3cy1saW5rcyBhID4gLmxpbmstbGFiZWwgeyB3aWR0aCA6IDcwMHB4OyB9Ci0jbmV3cy1saW5rcyBhIHAgPiAudGV4dCB7IHdpZHRoIDogNzAwcHg7IH0KLQotI25ld3MtbGlua3MgYTpob3ZlciB7IGJvcmRlci1yaWdodCA6IDVweDsgfQotCi1hI25ldy1hbmQtbm90ZXdvcnRoeSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L25ld19vYmouZ2lmKTsgfQotYSNuZXctYW5kLW5vdGV3b3J0aHk6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC9uZXdob3Zfb2JqLmdpZik7IH0KLQotYSNtaWdyYXRpb24gaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC9taWdyYXRlX29iai5naWYpOyB9Ci1hI21pZ3JhdGlvbjpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L21pZ3JhdGVob3Zfb2JqLmdpZik7IH0KLQotYSN1cGRhdGVzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdXBkYXRlc19vYmouZ2lmKTsgfQotYSN1cGRhdGVzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdXBkYXRlc2hvdl9vYmouZ2lmKTsgfQotCi1hI2VjbGlwc2UgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC9jb21tdW5pdHlfb2JqLmdpZik7IH0KLWEjZWNsaXBzZTpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L2NvbW11bml0eWhvdl9vYmouZ2lmKTsgfQotCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9oZWxwL2Jvb2sueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2hlbHAvYm9vay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYWEwYTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2hlbHAvYm9vay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkVQRiBDb21wb3NlciBIZWxwIFBhZ2UiICB0b3BpYz0iaHRtbC9ib29rLmh0bWwiPgotCTx0b3BpYyBsYWJlbD0iRVBGIE92ZXJ2aWV3IiBocmVmPSJodG1sL292ZXJ2aWV3Lmh0bWwiLz4KLQk8dG9waWMgbGFiZWw9IkVQRiBUdXRvcmlhbCIgaHJlZj0iaHRtbC90dXRvcmlhbDMuaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vaWNvbnMvZnVsbC9vYmoxNi9wcm9kdWN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9pY29ucy9mdWxsL29iajE2L3Byb2R1Y3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGMyOTEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9pY29ucy9mdWxsL29iajE2L3Byb2R1Y3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2ludHJvQ29udGVudC54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vaW50cm9Db250ZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U2MjkxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vaW50cm9Db250ZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGludHJvQ29udGVudD4KLQotICAgIDxwYWdlIGFsdC1zdHlsZT0iY3NzL3Jvb3Rfc3d0LnByb3BlcnRpZXMiIHN0eWxlPSJjc3Mvcm9vdC5jc3MiIGlkPSJyb290IiBzdHlsZS1pZD0icGFnZSI+Ci0gICAgICAgIDx0aXRsZSBzdHlsZS1pZD0iaW50cm8taGVhZGVyIj5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyPC90aXRsZT4KLSAgICAgICAgPGdyb3VwIGlkPSJsaW5rcy1iYWNrZ3JvdW5kIj4KLSAgICAgICAgICAgIDxncm91cCBpZD0icGFnZS1saW5rcyI+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9Ik92ZXJ2aWV3IiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93UGFnZT9pZD1vdmVydmlldyIgaWQ9Im92ZXJ2aWV3IiBzdHlsZS1pZD0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkZpbmQgb3V0IHdoYXQgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBhbGwgYWJvdXQ8L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJUdXRvcmlhbHMiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dQYWdlP2lkPXR1dG9yaWFscyIgaWQ9InR1dG9yaWFscyIgc3R5bGUtaWQ9ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5MZXQgdXMgZ3VpZGUgeW91IHRocm91Z2ggRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciB0dXRvcmlhbHM8L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDwhLS0gRmlyc3QgU3RlcHMgLS0+Ci0JCQkJPGxpbmsgbGFiZWw9IkZpcnN0IFN0ZXBzIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93UGFnZT9pZD1zdGVwcyIgaWQ9InN0ZXBzIiBzdHlsZS1pZD0ibGVmdCI+Ci0JCQkJCTx0ZXh0PlN0YXJ0IHdvcmtpbmcgb24geW91ciBvd24gbWV0aG9kIHBsdWctaW4uPC90ZXh0PgotCQkJCTwvbGluaz4KLSAgICAgICAgICAgICAgICA8IS0tIFdlYiBSZXNvdXJjZXMgLS0+Ci0JCQkJPGxpbmsgbGFiZWw9IldlYiBSZXNvdXJjZXMiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dQYWdlP2lkPXdlYiIgaWQ9IndlYiIgc3R5bGUtaWQ9InJpZ2h0Ij4KLQkJCQkJPHRleHQ+RmluZCBpbmZvcm1hdGlvbiBvbiB0aGUgd2ViPC90ZXh0PgotCQkJCTwvbGluaz4gICAgICAgICAgICAgIAotICAgICAgICAgICAgPC9ncm91cD4KLSAgICAgICAgPC9ncm91cD4KLSAgICAgICAgPGdyb3VwIGlkPSJhY3Rpb24tbGlua3MiPgotICAgICAgICAgICAgPGxpbmsgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc3dpdGNoVG9MYXVuY2hCYXIiIGxhYmVsPSJXb3JrYmVuY2giIGlkPSJ3b3JrYmVuY2giPgotICAgICAgICAgICAgICAgIDx0ZXh0PkdvIHRvIHRoZSB3b3JrYmVuY2g8L3RleHQ+Ci0gICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgIDwvZ3JvdXA+Ci0gICAgPC9wYWdlPgotCi0gICAgPHBhZ2UgYWx0LXN0eWxlPSJjc3Mvc3RhbmRieV9zd3QucHJvcGVydGllcyIgc3R5bGU9ImNzcy9zdGFuZGJ5X3Jvb3QuY3NzIiBpZD0ic3RhbmRieSIgc3R5bGUtaWQ9InBhZ2UiPgotICAgICAgICA8dGl0bGUgc3R5bGUtaWQ9ImludHJvLWhlYWRlciI+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvdGl0bGU+Ci0gICAgICAgIDxncm91cCBpZD0ibGlua3MtYmFja2dyb3VuZCI+Ci0gICAgICAgICAgICA8Z3JvdXAgaWQ9InBhZ2UtbGlua3MiPgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJPdmVydmlldyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9b3ZlcnZpZXcmYW1wO3N0YW5kYnk9ZmFsc2UiIGlkPSJvdmVydmlldyIgc3R5bGUtaWQ9ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5GaW5kIG91dCB3aGF0IEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYWxsIGFib3V0PC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iVHV0b3JpYWxzIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93UGFnZT9pZD10dXRvcmlhbHMmYW1wO3N0YW5kYnk9ZmFsc2UiIGlkPSJ0dXRvcmlhbHMiIHN0eWxlLWlkPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+TGV0IHVzIGd1aWRlIHlvdSB0aHJvdWdoIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgdHV0b3JpYWxzPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLQkJCQk8bGluayBsYWJlbD0iRmlyc3QgU3RlcHMiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dQYWdlP2lkPXN0ZXBzJmFtcDtzdGFuZGJ5PWZhbHNlIiBpZD0ic3RlcHMiIHN0eWxlLWlkPSJsZWZ0Ij4KLQkJCQkJPHRleHQ+U3RhcnQgd29ya2luZyBvbiB5b3VyIG93biBtZXRob2QgcGx1Zy1pbjwvdGV4dD4KLQkJCQk8L2xpbms+Ci0JCQkJPGxpbmsgbGFiZWw9IldlYiBSZXNvdXJjZXMiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dQYWdlP2lkPXdlYiZhbXA7c3RhbmRieT1mYWxzZSIgaWQ9IndlYiIgc3R5bGUtaWQ9InJpZ2h0Ij4KLQkJCQkJPHRleHQ+RmluZCBpbmZvcm1hdGlvbiBvbiB0aGUgd2ViPC90ZXh0PgotCQkJCTwvbGluaz4KLSAgICAgICAgICAgIDwvZ3JvdXA+Ci0gICAgICAgIDwvZ3JvdXA+Ci0gICAgPC9wYWdlPgotCi0gICAgPHBhZ2Ugc3R5bGU9ImNzcy9vdmVydmlldy9vdmVydmlldy5jc3MiIGFsdC1zdHlsZT0iY3NzL292ZXJ2aWV3L3N3dC5wcm9wZXJ0aWVzIiBpZD0ib3ZlcnZpZXciIHN0eWxlLWlkPSJwYWdlIj4KLSAgICAgICAgPHRpdGxlIHN0eWxlLWlkPSJpbnRyby1oZWFkZXIiPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXI8L3RpdGxlPgotICAgICAgICA8Z3JvdXAgaWQ9ImJhY2tncm91bmQtaW1hZ2UiIGZpbHRlcmVkRnJvbT0ic3d0Ii8+Ci0gICAgICAgIDxncm91cCBpZD0iY3VydmUtaW1hZ2UiIGZpbHRlcmVkRnJvbT0ic3d0Ii8+Ci0gICAgICAgIDxncm91cCBpZD0ibmF2aWdhdGlvbi1saW5rcyIgZmlsdGVyZWRGcm9tPSJzd3QiPgotICAgICAgICAgICAgPGdyb3VwIGlkPSJwYWdlLWxpbmtzIj4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iT3ZlcnZpZXciIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dQYWdlP2lkPW92ZXJ2aWV3IiBpZD0ib3ZlcnZpZXciIHN0eWxlLWlkPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+RmluZCBvdXQgd2hhdCBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGFsbCBhYm91dDwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9IlR1dG9yaWFscyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9dHV0b3JpYWxzIiBpZD0idHV0b3JpYWxzIiBzdHlsZS1pZD0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkxldCB1cyBndWlkZSB5b3UgdGhyb3VnaCBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGVuZC10by1lbmQgdHV0b3JpYWxzPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iRmlyc3QgU3RlcHMiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dQYWdlP2lkPXN0ZXBzIiBpZD0ic3RlcHMiIHN0eWxlLWlkPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+U3RhcnQgd29ya2luZyBvbiB5b3VyIG93biBtZXRob2QgcGx1Zy1pbjwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9IldlYiBSZXNvdXJjZXMiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dQYWdlP2lkPXdlYiIgaWQ9IndlYiIgc3R5bGUtaWQ9ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5GaW5kIG91dCBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSB3ZWI8L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgPC9ncm91cD4KLSAgICAgICAgICAgIDxncm91cCBpZD0iYWN0aW9uLWxpbmtzIj4KLSAgICAgICAgICAgICAgICA8bGluayB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zd2l0Y2hUb0xhdW5jaEJhciIgbGFiZWw9IldvcmtiZW5jaCIgaWQ9IndvcmtiZW5jaCI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkdvIHRvIHRoZSB3b3JrYmVuY2g8L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgPC9ncm91cD4KLSAgICAgICAgPC9ncm91cD4KLSAgICAgICAgCi0gICAgICAgIDxncm91cCBpZD0icGFnZS1jb250ZW50Ij4KLSAgICAgICAgICAgIDx0ZXh0IHN0eWxlLWlkPSJwYWdlLXRpdGxlIiBpZD0icGFnZS10aXRsZSIgZmlsdGVyZWRGcm9tPSJzd3QiPk9WRVJWSUVXPC90ZXh0PgotICAgICAgICAgICAgPHRleHQgc3R5bGUtaWQ9InBhZ2UtdGl0bGUiIGlkPSJwYWdlLXRpdGxlIiBmaWx0ZXJlZEZyb209Imh0bWwiPk9WRVJWSUVXPC90ZXh0PgotICAgICAgICAgICAgPHRleHQgc3R5bGUtaWQ9InBhZ2UtZGVzY3JpcHRpb24iIGlkPSJwYWdlLWRlc2NyaXB0aW9uIj5XZWxjb21lISBUYWtlIGEgZmV3IG1pbnV0ZXMgdG8gYmVjb21lIGZhbWlsaWFyIHdpdGggRVBGIENvbXBvc2VyLjwvdGV4dD4KLSAgICAgICAgICAgIDxncm91cCBpZD0ib3ZlcnZpZXctbGlua3MiPgotICAgICAgICAgICAgICAgIDxhbmNob3IgaWQ9ImJlZ2luQW5jaG9yIi8+ICAgICAgIAotCQkJCTxsaW5rIAotCQkJCQlsYWJlbD0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBPdmVydmlldyIgCi0JCQkJCXVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL292ZXJ2aWV3L2FfcHJvZHVjdF9vdmVydmlldy5odG1sJmFtcDtlbWJlZFRhcmdldD1wYWdlLWNvbnRlbnQiICAgCi0JCQkJCWlkPSJlcGYtb3YtcnVwb3YiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5SZWFkIGFib3V0IEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIncyBwdXJwb3NlIGFuZCBpdHMga2V5IGNvbmNlcHRzLjwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGxpbmsgCi0gICAgICAgICAgICAgICAgCWxhYmVsPSJNZXRob2RzOiBUaGUgcmV1c2FibGUgYnVpbGRpbmcgYmxvY2tzIiAKLSAgICAgICAgICAgICAgICAJdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvb3ZlcnZpZXcvYV9tZXRob2RfY29udGVudF9hdXRob3Jpbmdfb3ZlcnZpZXcuaHRtbCZhbXA7ZW1iZWRUYXJnZXQ9cGFnZS1jb250ZW50IiAgIAotICAgICAgICAgICAgICAgIAlpZD0iZXBmLW92LW1ldGhvZCI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PlJlYWQgYWJvdXQgdGhlIHJvbGUgYW5kIHJlcHJlc2VudGF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGluIEVQRiBDb21wb3Nlci48L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPiAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDxsaW5rIAotICAgICAgICAgICAgICAgIAlsYWJlbD0iQXV0aG9yaW5nIFByb2Nlc3NlcyIKLSAgICAgICAgICAgICAgICAJdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvb3ZlcnZpZXcvYV9wcm9jZXNzX2F1dGhvcmluZ19vdmVydmlldy5odG1sJmFtcDtlbWJlZFRhcmdldD1wYWdlLWNvbnRlbnQiIAotICAgICAgICAgICAgICAgIAlpZD0iZXBmLW92LXByb2Nlc3MiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5SZWFkIGFib3V0IHRoZSByb2xlIGFuZCByZXByZXNlbnRhdGlvbiBvZiBwcm9jZXNzZXMgaW4gRVBGIENvbXBvc2VyLjwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGxpbmsgCi0gICAgICAgICAgICAgICAgCWxhYmVsPSJDb25maWd1cmF0aW9uIGFuZCBQdWJsaXNoaW5nIiAKLSAgICAgICAgICAgICAgCQl1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vdmVydmlldy9hX21ldGhvZF9jb25maWd1cmF0aW9uc19vdmVydmlldy5odG1sJmFtcDtlbWJlZFRhcmdldD1wYWdlLWNvbnRlbnQiICAKLSAgICAgICAgICAgICAgICAJaWQ9ImVwZi1vdi1jb25maWdwdWJsaXNoIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+UmVhZCBhYm91dCBjb25maWd1cmluZyBhbmQgcHVibGlzaGluZyBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIEVQRiBDb21wb3Nlci48L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxncm91cCBpZD0ic3RlcC1saW5rcyI+Ci0gICAgICAgICAgICAJCTxhbmNob3IgaWQ9ImJlZ2luQW5jaG9yIi8+Ci0gICAgICAgICAgICAJCTxhbmNob3IgaWQ9ImVuZEFuY2hvciIvPgotICAgICAgICAgICAgCTwvZ3JvdXA+Ci0gICAgICAgICAgICA8L2dyb3VwPgotICAgICAgICA8L2dyb3VwPgotICAgIDwvcGFnZT4KLSAgICAKLSAgICA8cGFnZSBzdHlsZT0iY3NzL3RvdXIuY3NzIiBhbHQtc3R5bGU9ImNzcy90b3VyLXN3dC5wcm9wZXJ0aWVzIiBpZD0iZXBmLXRvdXIiIHN0eWxlLWlkPSJwYWdlIj4KLQkJPHRpdGxlIHN0eWxlLWlkPSJpbnRyby1oZWFkZXIiPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXI8L3RpdGxlPgotCQk8Z3JvdXAgaWQ9ImJhY2tncm91bmQtaW1hZ2UiIGZpbHRlcmVkRnJvbT0ic3d0Ii8+Ci0JCTxpbmNsdWRlIHBhdGg9Im92ZXJ2aWV3L25hdmlnYXRpb24tbGlua3MiLz4KLQkJPGdyb3VwIGlkPSJwYWdlLWNvbnRlbnQiPgotCQkJPHRleHQgc3R5bGUtaWQ9InBhZ2UtdGl0bGUiIGlkPSJwYWdlLXRpdGxlIj5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIFRPVVI8L3RleHQ+Ci0JCQk8aHRtbCBpZD0iZXBmLXRvdXIiIHNyYz0iY3NzL3RvdXItcGxhY2Vob2xkZXIuaHRtbCIgdHlwZT0iaW5saW5lIj4KLQkJCTwvaHRtbD4JCi0JCTwvZ3JvdXA+Ci0JPC9wYWdlPgotCQotCTxwYWdlIHN0eWxlPSJjc3MvdG91ci5jc3MiIGFsdC1zdHlsZT0iY3NzL3RvdXItc3d0LnByb3BlcnRpZXMiIGlkPSJlcGYtb3ZlcnZpZXciIHN0eWxlLWlkPSJwYWdlIj4KLQkJPHRpdGxlIHN0eWxlLWlkPSJpbnRyby1oZWFkZXIiPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXI8L3RpdGxlPgotCQk8Z3JvdXAgaWQ9ImJhY2tncm91bmQtaW1hZ2UiIGZpbHRlcmVkRnJvbT0ic3d0Ii8+Ci0JCTxpbmNsdWRlIHBhdGg9Im92ZXJ2aWV3L25hdmlnYXRpb24tbGlua3MiLz4KLQkJPGdyb3VwIGlkPSJwYWdlLWNvbnRlbnQiPgotCQkJPHRleHQgc3R5bGUtaWQ9InBhZ2UtdGl0bGUiIGlkPSJwYWdlLXRpdGxlIj5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIE92ZXJ2aWV3PC90ZXh0PgotCQkJPGh0bWwgaWQ9ImVwZi1vdmVydmlldyIgc3JjPSJjc3MvcHJvZHVjdF9vdmVydmlldy5odG1sIiB0eXBlPSJpbmxpbmUiPgotCQkJPC9odG1sPgkKLQkJPC9ncm91cD4KLQk8L3BhZ2U+Ci0JCi0JPHBhZ2Ugc3R5bGU9ImNzcy90b3VyLmNzcyIgYWx0LXN0eWxlPSJjc3MvdG91ci1zd3QucHJvcGVydGllcyIgaWQ9ImVwZi1tZXRob2RzIiBzdHlsZS1pZD0icGFnZSI+Ci0JCTx0aXRsZSBzdHlsZS1pZD0iaW50cm8taGVhZGVyIj5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyPC90aXRsZT4KLQkJPGdyb3VwIGlkPSJiYWNrZ3JvdW5kLWltYWdlIiBmaWx0ZXJlZEZyb209InN3dCIvPgotCQk8aW5jbHVkZSBwYXRoPSJvdmVydmlldy9uYXZpZ2F0aW9uLWxpbmtzIi8+Ci0JCTxncm91cCBpZD0icGFnZS1jb250ZW50Ij4KLQkJCTx0ZXh0IHN0eWxlLWlkPSJwYWdlLXRpdGxlIiBpZD0icGFnZS10aXRsZSI+TWV0aG9kczogVGhlIHJldXNhYmxlIGJ1aWxkaW5nIGJsb2NrczwvdGV4dD4KLQkJCTxodG1sIGlkPSJlcGYtbWV0aG9kcyIgc3JjPSJjc3MvbWV0aG9kX2F1dGhvcmluZ19vdmVydmlldy5odG1sIiB0eXBlPSJpbmxpbmUiPgotCQkJPC9odG1sPgkKLQkJPC9ncm91cD4KLQk8L3BhZ2U+Ci0JCi0JPHBhZ2Ugc3R5bGU9ImNzcy90b3VyLmNzcyIgYWx0LXN0eWxlPSJjc3MvdG91ci1zd3QucHJvcGVydGllcyIgaWQ9ImVwZi1wcm9jZXNzZXMiIHN0eWxlLWlkPSJwYWdlIj4KLQkJPHRpdGxlIHN0eWxlLWlkPSJpbnRyby1oZWFkZXIiPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXI8L3RpdGxlPgotCQk8Z3JvdXAgaWQ9ImJhY2tncm91bmQtaW1hZ2UiIGZpbHRlcmVkRnJvbT0ic3d0Ii8+Ci0JCTxpbmNsdWRlIHBhdGg9Im92ZXJ2aWV3L25hdmlnYXRpb24tbGlua3MiLz4KLQkJPGdyb3VwIGlkPSJwYWdlLWNvbnRlbnQiPgotCQkJPHRleHQgc3R5bGUtaWQ9InBhZ2UtdGl0bGUiIGlkPSJwYWdlLXRpdGxlIj5BdXRob3JpbmcgUHJvY2Vzc2VzPC90ZXh0PgotCQkJPGh0bWwgaWQ9ImVwZi1wcm9jZXNzZXMiIHNyYz0iY3NzL3Byb2Nlc3NfYXV0aG9yaW5nX292ZXJpdmV3Lmh0bWwiIHR5cGU9ImlubGluZSI+Ci0JCQk8L2h0bWw+CQotCQk8L2dyb3VwPgotCTwvcGFnZT4KLQkKLQk8cGFnZSBzdHlsZT0iY3NzL3RvdXIuY3NzIiBhbHQtc3R5bGU9ImNzcy90b3VyLXN3dC5wcm9wZXJ0aWVzIiBpZD0iZXBmLWNvbmZpZ3B1Ymxpc2giIHN0eWxlLWlkPSJwYWdlIj4KLQkJPHRpdGxlIHN0eWxlLWlkPSJpbnRyby1oZWFkZXIiPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXI8L3RpdGxlPgotCQk8Z3JvdXAgaWQ9ImJhY2tncm91bmQtaW1hZ2UiIGZpbHRlcmVkRnJvbT0ic3d0Ii8+Ci0JCTxpbmNsdWRlIHBhdGg9Im92ZXJ2aWV3L25hdmlnYXRpb24tbGlua3MiLz4KLQkJPGdyb3VwIGlkPSJwYWdlLWNvbnRlbnQiPgotCQkJPHRleHQgc3R5bGUtaWQ9InBhZ2UtdGl0bGUiIGlkPSJwYWdlLXRpdGxlIj5Db25maWd1cmF0aW9uIGFuZCBQdWJsaXNoaW5nPC90ZXh0PgotCQkJPGh0bWwgaWQ9ImVwZi1wcm9jZXNzZXMiIHNyYz0iY3NzL3B1Ymxpc2hpbmcuaHRtbCIgdHlwZT0iaW5saW5lIj4KLQkJCTwvaHRtbD4JCi0JCTwvZ3JvdXA+Ci0JPC9wYWdlPgotCQotCTwhLS0gRklSU1QgU1RFUFMgU0NBRkZPTERJTkcgLS0+Ci0JPHBhZ2UgCi0JCXN0eWxlPSJjc3MvZmlyc3RzdGVwcy9maXJzdHN0ZXBzLmNzcyIgCi0JCWFsdC1zdHlsZT0iY3NzL2ZpcnN0c3RlcHMvZmlyc3RzdGVwcy5wcm9wZXJ0aWVzIiAKLQkJaWQ9InN0ZXBzIiAKLQkJc3R5bGUtaWQ9InBhZ2UiPgotCQk8dGl0bGUgc3R5bGUtaWQ9ImludHJvLWhlYWRlciI+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvdGl0bGU+Ci0JCTxncm91cCBpZD0iYmFja2dyb3VuZC1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLQkJPGdyb3VwIGlkPSJjdXJ2ZS1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLQkJPGluY2x1ZGUgcGF0aD0ib3ZlcnZpZXcvbmF2aWdhdGlvbi1saW5rcyIvPgotCQk8Z3JvdXAgaWQ9InBhZ2UtY29udGVudCI+Ci0JCQk8dGV4dCBzdHlsZS1pZD0icGFnZS10aXRsZSIgaWQ9InBhZ2UtdGl0bGUiPkZJUlNUIFNURVBTPC90ZXh0PgotCQkJPHRleHQgc3R5bGUtaWQ9InBhZ2UtZGVzY3JpcHRpb24iIGlkPSJwYWdlLWRlc2NyaXB0aW9uIj5TdGFydCB3b3JraW5nIG9uIHlvdXIgb3duIG1ldGhvZCBwbHVnLWluLjwvdGV4dD4KLQkJCTxncm91cCBpZD0ic3RlcHMtbGlua3MiPiAgICAgICAgICAgICAgIAotCQkJICAgIDxhbmNob3IgaWQ9ImJlZ2luQW5jaG9yIi8+Ci0JCQkgICAgPGxpbmsgbGFiZWw9IkNyZWF0ZSB5b3VyIG93biBNZXRob2QgUGx1Zy1pbiIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vb3BlbkNoZWF0c2hlZXRWaWV3P2lucHV0PW9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2hlYXRzaGVldHMuY3JlYXRlbWV0aG9kcGx1Z2luJmFtcDt0b2dnbGU9dHJ1ZSIgaWQ9ImVwZi1zdGVwcy10d28iPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5TdGFydCBidWlsZGluZyBhIG1ldGhvZCBwbHVnLWluIHVzaW5nIGEgd2l6YXJkLjwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9IkNyZWF0ZSB5b3VyIG93biBNZXRob2QgQ29uZmlndXJhdGlvbiIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vb3BlbkNoZWF0c2hlZXRWaWV3P2lucHV0PW9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2hlYXRzaGVldHMuY3JlYXRlbWV0aG9kY29uZmlndXJhdGlvbiZhbXA7dG9nZ2xlPXRydWUiIGlkPSJlcGYtc3RlcHMtZm91ciI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PlRoaXMgY2hlYXRzaGVldCBndWlkZXMgeW91IHRob3VnaCB0aGUgc3RlcHMgb2YgY3JlYXRpbmcgeW91ciBvd24gbWV0aG9kIGNvbmZpZ3VyYXRpb24uPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iQWRkIG5ldyBNZXRob2QgQ29udGVudCBzdWNoIGFzIFJvbGVzLCBUYXNrIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9vcGVuQ2hlYXRzaGVldFZpZXc/aW5wdXQ9b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jaGVhdHNoZWV0cy5hZGRuZXdtZXRob2Rjb250ZW50JmFtcDt0b2dnbGU9dHJ1ZSIgaWQ9ImVwZi1zdGVwcy1vbmUiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5UaGlzIGNoZWF0c2hlZXQgZ3VpZGVzIHlvdSB0aG91Z2ggdGhlIHN0ZXBzIG9mIGNyZWF0aW5nIHlvdXIgb3duIG1ldGhvZCBjb250ZW50LjwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9IkNyZWF0ZSBhIFByb2Nlc3MiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL29wZW5DaGVhdHNoZWV0Vmlldz9pbnB1dD1vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNoZWF0c2hlZXRzLmNyZWF0ZWFwcm9jZXNzJmFtcDt0b2dnbGU9dHJ1ZSIgaWQ9ImVwZi1zdGVwcy10aHJlZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PlRoaXMgY2hlYXRzaGVldCB0YWtlcyB5b3UgdGhyb3VnaCB0aGUgc3RlcHMgbmVjZXNzYXJ5IHRvIGNyZWF0ZSBhIHByb2Nlc3MuPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4gIAotCQkJCTxncm91cCBpZD0ic3RlcC1saW5rcyI+Ci0JCQkJCTxhbmNob3IgaWQ9ImJlZ2luQW5jaG9yIi8+Ci0gICAgICAgICAgICAJCTxhbmNob3IgaWQ9ImVuZEFuY2hvciIvPgotCQkJCTwvZ3JvdXA+Ci0JCSAgIAk8L2dyb3VwPgotCQk8L2dyb3VwPgotCTwvcGFnZT4KLQkKLSAgICA8cGFnZSBzdHlsZT0iY3NzL3R1dG9yaWFscy90dXRvcmlhbHMuY3NzIiBhbHQtc3R5bGU9ImNzcy90dXRvcmlhbHMvc3d0LnByb3BlcnRpZXMiIGlkPSJ0dXRvcmlhbHMiIHN0eWxlLWlkPSJwYWdlIj4KLSAgICAgICAgPHRpdGxlIHN0eWxlLWlkPSJpbnRyby1oZWFkZXIiPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXI8L3RpdGxlPgotICAgICAgICA8Z3JvdXAgaWQ9ImJhY2tncm91bmQtaW1hZ2UiIGZpbHRlcmVkRnJvbT0ic3d0Ii8+Ci0gICAgICAgIDxncm91cCBpZD0iY3VydmUtaW1hZ2UiIGZpbHRlcmVkRnJvbT0ic3d0Ii8+Ci0gICAgICAgIDxpbmNsdWRlIHBhdGg9Im92ZXJ2aWV3L25hdmlnYXRpb24tbGlua3MiLz4KLSAgICAgICAgPGdyb3VwIGlkPSJwYWdlLWNvbnRlbnQiPgotICAgICAgICAgICAgPHRleHQgc3R5bGUtaWQ9InBhZ2UtdGl0bGUiIGlkPSJwYWdlLXRpdGxlIj5UVVRPUklBTFM8L3RleHQ+Ci0gICAgICAgICAgICA8dGV4dCBzdHlsZS1pZD0icGFnZS1kZXNjcmlwdGlvbiIgaWQ9InBhZ2UtZGVzY3JpcHRpb24iPkxlYXJuIGhvdyB5b3UgY2FuIHVzZSBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIHRvIGRlbGl2ZXIgcHJhY3RpY2FsLCBjdXN0b21pemVkLCBhbmQgY29uc2lzdGVudCBwcm9jZXNzIGd1aWRhbmNlIHRvIHlvdXIgcHJvamVjdCB0ZWFtLjwvdGV4dD4KLQkJCTxncm91cCBpZD0idHV0b3JpYWxzLWxpbmtzIj4gICAgICAgICAgICAgICAKLQkJCSAgICA8YW5jaG9yIGlkPSJiZWdpbkFuY2hvciIvPgotCQkJCTxsaW5rIAotCQkJCQlsYWJlbD0iRXhwbG9yZSB0aGUgdXNlciBpbnRlcmZhY2UiIAotCQkJCQl1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0MV9pbnRyby5odG0mYW1wOyIgCi0JCQkJCWlkPSJlcGYtdHV0LW5hdmlnYXRlIgotCQkJCQljbGFzcy1pZD0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkxlYXJuIHRvIG5hdmlnYXRlIHRocm91Z2ggdGhlIHVzZXIgaW50ZXJmYWNlOiBwZXJzcGVjdGl2ZXMsIHZpZXdzLCBhbmQgc2VhcmNoLjwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGxpbmsgCi0gICAgICAgICAgICAgICAgCWxhYmVsPSJXb3JraW5nIHdpdGggcHJvY2Vzc2VzIiAKLSAgICAgICAgICAgICAgICAJdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dDVfaW50cm8uaHRtJmFtcDsiIAotICAgICAgICAgICAgICAgIAlpZD0iZXBmLXR1dC1wcm9jZXNzIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+TGVhcm4gaG93IHRvIGNyZWF0ZSBhbmQgcmV1c2UgY2FwYWJpbGl0eSBwYXR0ZXJucyBhbmQgZGVsaXZlcnkgcHJvY2Vzc2VzLjwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGxpbmsgCi0gICAgICAgICAgICAgICAgCWxhYmVsPSJDcmVhdGUgbWV0aG9kIGNvbnRlbnQgIiAKLSAgICAgICAgICAgICAgICAJdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dDJfaW50cm8uaHRtJmFtcDsiIAotICAgICAgICAgICAgICAgIAlpZD0iZXBmLXR1dC1lbGVtZW50IgotICAgICAgICAgICAgICAgIAljbGFzcy1pZD0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkxlYXJuIGhvdyB0byB1c2UgdGhlIGVkaXRvcnMgdG8gY3JlYXRlIHJvbGVzLCB0YXNrcywgd29yayBwcm9kdWN0cyBhbmQgZ3VpZGFuY2UuPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayAKLSAgICAgICAgICAgICAgICAJbGFiZWw9IlB1Ymxpc2hpbmcgYW5kIEV4cG9ydGluZyIgCi0gICAgICAgICAgICAgICAgCXVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXQ0X2ludHJvLmh0bSZhbXA7IiAKLSAgICAgICAgICAgICAgICAJaWQ9ImVwZi10dXQtcHViZXhwIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+TGVhcm4gaG93IHRvIHB1Ymxpc2ggY29uZmlndXJhdGlvbnMgdG8gYSB3ZWIgc2l0ZSBhbmQgaG93IHRvIGV4cG9ydCBwcm9jZXNzZXMgdG8gYSBwbGFubmluZyB0b29sLjwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPGxpbmsgCi0gICAgICAgICAgICAgICAgCWxhYmVsPSJSZXVzZSBtZXRob2QgY29udGVudCIgCi0gICAgICAgICAgICAgICAgCXVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXQzX2ludHJvLmh0bSZhbXA7IiAKLSAgICAgICAgICAgICAgICAJaWQ9ImVwZi10dXQtY29udGVudCIKLSAgICAgICAgICAgICAgICAJY2xhc3MtaWQ9ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5MZWFybiBob3cgdG8gZXh0ZW5kLCByZXBsYWNlLCBhbmQgY29udHJpYnV0ZSB0byBiYXNlIGNvbnRlbnQgZWxlbWVudHMuPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLQkJCQk8Z3JvdXAgaWQ9InN0ZXAtbGlua3MiPgotCQkJCQk8YW5jaG9yIGlkPSJiZWdpbkFuY2hvciIvPgotICAgICAgICAgICAgCQk8YW5jaG9yIGlkPSJlbmRBbmNob3IiLz4KLQkJCQk8L2dyb3VwPgotCQkgICAJPC9ncm91cD4gICAJCi0gICAgICAgIDwvZ3JvdXA+Ci0gICAgICAgIAotICAgIDwvcGFnZT4KLQotICAgIDwhLS0gV0VCIFJFU09VUkNFUyBTQ0FGRk9MRElORyAtLT4KLQk8cGFnZSAKLQkJc3R5bGU9ImNzcy93ZWJyZXNvdXJjZXMvd2VicmVzb3VyY2VzLmNzcyIgYWx0LXN0eWxlPSJjc3Mvd2VicmVzb3VyY2VzL3dlYnJlc291cmNlcy5wcm9wZXJ0aWVzIiBpZD0id2ViIiBzdHlsZS1pZD0icGFnZSI+Ci0JCTx0aXRsZSBzdHlsZS1pZD0iaW50cm8taGVhZGVyIj5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyPC90aXRsZT4KLQkJPGdyb3VwIGlkPSJiYWNrZ3JvdW5kLWltYWdlIiBmaWx0ZXJlZEZyb209InN3dCIvPgotCQk8Z3JvdXAgaWQ9ImN1cnZlLWltYWdlIiBmaWx0ZXJlZEZyb209InN3dCIvPgotCQk8aW5jbHVkZSBwYXRoPSJvdmVydmlldy9uYXZpZ2F0aW9uLWxpbmtzIi8+Ci0JCTxncm91cCBpZD0icGFnZS1jb250ZW50Ij4KLQkJCTx0ZXh0IHN0eWxlLWlkPSJwYWdlLXRpdGxlIiBpZD0icGFnZS10aXRsZSI+V0VCIFJFU09VUkNFUzwvdGV4dD4KLQkJCTx0ZXh0IHN0eWxlLWlkPSJwYWdlLWRlc2NyaXB0aW9uIiBpZD0icGFnZS1kZXNjcmlwdGlvbiI+SW4gYWRkaXRpb24gdG8gaW5mb3JtYXRpb24gaW4gdGhlIFdlbGNvbWUgYW5kIHRoZSBIZWxwLCB0aGUgV2ViIHByb3ZpZGVzIHlvdSB3aXRoIHRpcHMsIGFydGljbGVzLCB1cGRhdGVzLCBhbmQgcmVmZXJlbmNlcyB0byBpbmR1c3RyeSBzdGFuZGFyZHMuIDwvdGV4dD4KLQkJCTxncm91cCBpZD0id2ViLWxpbmtzIj4KLQkJCQkgICA8bGluawotCSAgICAgICAgICAgICAgICAgICAgIGxhYmVsPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIgotCSAgICAgICAgICAgICAgICAgICAgIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL29wZW5Ccm93c2VyP3VybD1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIKLQkgICAgICAgICAgICAgICAgICAgICBpZD0iZXBmX3Jlc291cmNlIj4KLQkgICAgICAgICAgICAgICAgICA8dGV4dD5DZW50cmFsIGxvY2F0aW9uIGZvciBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrPC90ZXh0PgotCSAgICAgICAgICAgICAgIDwvbGluaz4KLQkJCTwvZ3JvdXA+Ci0JCTwvZ3JvdXA+Ci0JPC9wYWdlPgotCQotICAgIDxwYWdlIHN0eWxlPSJjc3Mvc2FtcGxlcy9zYW1wbGVzLmNzcyIgYWx0LXN0eWxlPSJjc3Mvc2FtcGxlcy9zd3QucHJvcGVydGllcyIgaWQ9InNhbXBsZXMiIHN0eWxlLWlkPSJwYWdlIj4KLSAgICAgICAgPHRpdGxlIHN0eWxlLWlkPSJpbnRyby1oZWFkZXIiPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXI8L3RpdGxlPgotICAgICAgICA8Z3JvdXAgaWQ9ImJhY2tncm91bmQtaW1hZ2UiIGZpbHRlcmVkRnJvbT0ic3d0Ii8+Ci0gICAgICAgIDxncm91cCBpZD0iY3VydmUtaW1hZ2UiIGZpbHRlcmVkRnJvbT0ic3d0Ii8+Ci0gICAgICAgIDxpbmNsdWRlIHBhdGg9Im92ZXJ2aWV3L25hdmlnYXRpb24tbGlua3MiLz4KLSAgICAgICAgPGdyb3VwIGlkPSJwYWdlLWNvbnRlbnQiPgotICAgICAgICAgICAgPGdyb3VwIGlkPSJjb250ZW50LWhlYWRlciIgbGFiZWw9IlNBTVBMRVMiIGZpbHRlcmVkRnJvbT0ic3d0Ij4KLSAgICAgICAgICAgIDwvZ3JvdXA+Ci0gICAgICAgICAgICA8dGV4dCBzdHlsZS1pZD0icGFnZS10aXRsZSIgaWQ9InBhZ2UtdGl0bGUiIGZpbHRlcmVkRnJvbT0iaHRtbCI+U0FNUExFUzwvdGV4dD4KLSAgICAgICAgICAgIDx0ZXh0IHN0eWxlLWlkPSJwYWdlLWRlc2NyaXB0aW9uIiBpZD0icGFnZS1kZXNjcmlwdGlvbiI+RXhwbG9yZSBFY2xpcHNlIGJ5IGluc3RhbGxpbmcgcHJlZmFicmljYXRlZCBzYW1wbGVzIChtYXkgcmVxdWlyZSBJbnRlcm5ldCBjb25uZWN0aW9uKS48L3RleHQ+Ci0gICAgICAgICAgICA8YW5jaG9yIGlkPSJiZWdpbkFuY2hvciIvPgotICAgICAgICAgICAgPGdyb3VwIGxhYmVsPSJTV1QiIGlkPSJzd3QiIHN0eWxlLWlkPSJzYW1wbGVzLWdyb3VwIj4KLSAgICAgICAgICAgICAgICA8dGV4dCBzdHlsZS1pZD0iZ3JvdXAtZGVzY3JpcHRpb24iPlJ1biBTV1Qgc2FtcGxlcyB1c2luZyBlaXRoZXIgdGhlIHN0YW5kYWxvbmUgU1dUIGxhdW5jaGVyIG9yIGFzIGFuIGludGVncmF0ZWQgd29ya2JlbmNoIHZpZXcuPC90ZXh0PgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJXb3JrYmVuY2ggdmlld3MgYW5kIHN0YW5kYWxvbmUgYXBwbGljYXRpb25zIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9ydW5BY3Rpb24/cGx1Z2luSWQ9b3JnLmVjbGlwc2UucGRlLnVpJmFtcDtjbGFzcz1vcmcuZWNsaXBzZS5wZGUudWkuaW50ZXJuYWwuc2FtcGxlcy5TaG93U2FtcGxlQWN0aW9uJmFtcDtpZD1vcmcuZWNsaXBzZS5zZGsuc2FtcGxlcy5zd3QuZXhhbXBsZXMiIGlkPSJzd3QtZXhhbXBsZXMiIHN0eWxlLWlkPSJzYW1wbGUtbGluayI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PlRoZSBTV1QgRXhhbXBsZSBsYXVuY2hlciB3aWxsIGFsbG93IHlvdSB0byBsYXVuY2ggYSBjb2xsZWN0aW9uIG9mIFNXVCBleGFtcGxlcy4gIFNvbWUgb2YgdGhlIGV4YW1wbGVzIGNhbiBiZSBydW4gaW5kZXBlbmRlbnQgb2YgdGhlIGVjbGlwc2UgcGxhdGZvcm0gYW5kIG90aGVycyB3aWxsIGJlIGF2YWlsYWJsZSBhcyB2aWV3cyBpbnNpZGUgdGhlIHdvcmtiZW5jaC48L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxhbmNob3IgaWQ9InN3dEdyb3VwQW5jaG9yIi8+Ci0gICAgICAgICAgICA8L2dyb3VwPgotICAgICAgICAgICAgPGdyb3VwIGxhYmVsPSJXb3JrYmVuY2giIGlkPSJ3b3JrYmVuY2giIHN0eWxlLWlkPSJzYW1wbGVzLWdyb3VwIj4KLSAgICAgICAgICAgICAgICA8dGV4dCBzdHlsZS1pZD0iZ3JvdXAtZGVzY3JpcHRpb24iPlRoZSBmb2xsb3dpbmcgc2FtcGxlcyBkZW1vbnN0cmF0ZSBob3cgdG8gdGlnaHRseSBpbnRlZ3JhdGUgaW50byB0aGUgRWNsaXBzZSB3b3JrYmVuY2guPC90ZXh0PgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJNdWx0aS1wYWdlIGVkaXRvciIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vcnVuQWN0aW9uP3BsdWdpbklkPW9yZy5lY2xpcHNlLnBkZS51aSZhbXA7Y2xhc3M9b3JnLmVjbGlwc2UucGRlLnVpLmludGVybmFsLnNhbXBsZXMuU2hvd1NhbXBsZUFjdGlvbiZhbXA7aWQ9b3JnLmVjbGlwc2Uuc2RrLnNhbXBsZXMubXVsdGlwYWdlZWRpdG9yIiBpZD0ibXVsdGktcGFnZS1lZGl0b3IiIHN0eWxlLWlkPSJzYW1wbGUtbGluayI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PlNob3dzIGhvdyB0byBjcmVhdGUgYW4gZWRpdG9yIHdpdGggbXVsdGlwbGUgcGFnZXM8L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJQcm9wZXJ0eSBzaGVldCBhbmQgb3V0bGluZSIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vcnVuQWN0aW9uP3BsdWdpbklkPW9yZy5lY2xpcHNlLnBkZS51aSZhbXA7Y2xhc3M9b3JnLmVjbGlwc2UucGRlLnVpLmludGVybmFsLnNhbXBsZXMuU2hvd1NhbXBsZUFjdGlvbiZhbXA7aWQ9b3JnLmVjbGlwc2Uuc2RrLnNhbXBsZXMucHJvcGVydHlzaGVldCIgaWQ9InByb3BlcnR5LXNoZWV0IiBzdHlsZS1pZD0ic2FtcGxlLWxpbmsiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5EZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSBwcm9wZXJ0eSBzaGVldCBhbmQgb3V0bGluZSB2aWV3czwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9IlJlYWRtZSB0b29sIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9ydW5BY3Rpb24/cGx1Z2luSWQ9b3JnLmVjbGlwc2UucGRlLnVpJmFtcDtjbGFzcz1vcmcuZWNsaXBzZS5wZGUudWkuaW50ZXJuYWwuc2FtcGxlcy5TaG93U2FtcGxlQWN0aW9uJmFtcDtpZD1vcmcuZWNsaXBzZS5zZGsuc2FtcGxlcy5yZWFkbWV0b29sIiBpZD0icmVhZG1ldG9vbCIgc3R5bGUtaWQ9InNhbXBsZS1saW5rIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+U2hvd3MgaG93IHRvIGNyZWF0ZSB5b3VyIG93biBleHRlbnNpb24gcG9pbnRzPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8YW5jaG9yIGlkPSJqZHRBbmNob3IiLz4KLSAgICAgICAgICAgICAgICA8YW5jaG9yIGlkPSJ3b3JrYmVuY2hHcm91cEFuY2hvciIvPgotICAgICAgICAgICAgPC9ncm91cD4KLSAgICAgICAgICAgIDxhbmNob3IgaWQ9ImVuZEFuY2hvciIvPgotICAgICAgICA8L2dyb3VwPgotICAgIDwvcGFnZT4KLQotICAgIDxwYWdlIHN0eWxlPSJjc3Mvd2hhdHNuZXcvd2hhdHNuZXcuY3NzIiBhbHQtc3R5bGU9ImNzcy93aGF0c25ldy9zd3QucHJvcGVydGllcyIgaWQ9Im5ld3MiIHN0eWxlLWlkPSJwYWdlIj4KLSAgICAgICAgPHRpdGxlIHN0eWxlLWlkPSJpbnRyby1oZWFkZXIiPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXI8L3RpdGxlPgotICAgICAgICA8Z3JvdXAgaWQ9ImJhY2tncm91bmQtaW1hZ2UiIGZpbHRlcmVkRnJvbT0ic3d0Ii8+Ci0gICAgICAgIDxncm91cCBpZD0iY3VydmUtaW1hZ2UiIGZpbHRlcmVkRnJvbT0ic3d0Ii8+Ci0gICAgICAgIDxpbmNsdWRlIHBhdGg9Im92ZXJ2aWV3L25hdmlnYXRpb24tbGlua3MiLz4KLSAgICAgICAgPGdyb3VwIGlkPSJwYWdlLWNvbnRlbnQiPgotICAgICAgICAgICAgPGdyb3VwIGlkPSJjb250ZW50LWhlYWRlciIgbGFiZWw9IldIQVQnUyBORVciIGZpbHRlcmVkRnJvbT0ic3d0Ij4KLSAgICAgICAgICAgIDwvZ3JvdXA+Ci0gICAgICAgICAgICA8dGV4dCBzdHlsZS1pZD0icGFnZS10aXRsZSIgaWQ9InBhZ2UtdGl0bGUiIGZpbHRlcmVkRnJvbT0iaHRtbCI+V0hBVCdTIE5FVzwvdGV4dD4KLSAgICAgICAgICAgIDxhbmNob3IgaWQ9ImJlZ2luQW5jaG9yIi8+Ci0gICAgICAgICAgICA8Z3JvdXAgaWQ9Im5vdGV3b3J0aHktbGlua3MiIGxhYmVsPSJOZXcgYW5kIE5vdGV3b3J0aHkiPgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJFY2xpcHNlIFBsYXRmb3JtIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci93aGF0c05ldy9wbGF0Zm9ybV93aGF0c25ldy5odG1sIiBpZD0icGxhdGZvcm0tbm90ZXdvcnRoeSIgc3R5bGUtaWQ9Im5vdGV3b3J0aHktbGluayI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkZpbmQgb3V0IGFib3V0IHRoZSBtYWpvciBuZXcgZmVhdHVyZXMgaW4gdGhpcyByZWxlYXNlPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8YW5jaG9yIGlkPSJqZHRBbmNob3IiLz4KLSAgICAgICAgICAgICAgICA8YW5jaG9yIGlkPSJwZGVBbmNob3IiLz4KLSAgICAgICAgICAgICAgICA8YW5jaG9yIGlkPSJnZW5lcmFsQW5jaG9yIi8+Ci0gICAgICAgICAgICA8L2dyb3VwPgotICAgICAgICAgICAgPGdyb3VwIGlkPSJuZXdzLWxpbmtzIiBsYWJlbD0iR2VuZXJhbCI+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9Ik1pZ3JhdGlvbiBmcm9tIHRoZSBwcmV2aW91cyByZWxlYXNlIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MuaXN2L3BvcnRpbmcvZWNsaXBzZV8zXzBfcG9ydGluZ19ndWlkZS5odG1sIiBpZD0ibWlncmF0aW9uIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+TGVhcm4gd2hhdCB5b3UgbmVlZCB0byBkbyB0byBtYWtlIHlvdXIgb2xkIGNvZGUgd29yayBpbiBFY2xpcHNlIDMuMTwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9Ik5ldyBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9ydW5BY3Rpb24/cGx1Z2luSWQ9b3JnLmVjbGlwc2UudWkuaWRlJmFtcDtjbGFzcz1vcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUudXBkYXRlLkluc3RhbGxXaXphcmRBY3Rpb24iIGlkPSJ1cGRhdGVzIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+R2V0IHRoZSBsYXRlc3QgdXBkYXRlcyBmcm9tIEVjbGlwc2Uub3JnPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iRWNsaXBzZSBjb21tdW5pdHkiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIgaWQ9ImVjbGlwc2UiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5Kb2luIHRoZSBjb21tdW5pdHksIHJlYWQgYXJ0aWNsZXMgYW5kIG5ld3Mgb24gRWNsaXBzZS5vcmc8L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxhbmNob3IgaWQ9ImxpbmtzQW5jaG9yIi8+Ci0gICAgICAgICAgICA8L2dyb3VwPgotICAgICAgICAgICAgPGFuY2hvciBpZD0iZW5kQW5jaG9yIi8+Ci0gICAgICAgIDwvZ3JvdXA+Ci0gICAgPC9wYWdlPgotICAgIAotPC9pbnRyb0NvbnRlbnQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNDVmYzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBJbnRyb2R1Y3Rpb24KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzMmZkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaW50cm8iPgotICAgICAgPGludHJvCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50cm8uY29uZmlnLkN1c3RvbWl6YWJsZUludHJvUGFydCIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvcHJvZHVjdC5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnVpLmludHJvIi8+Ci0gICAgICAgICA8aW50cm9Qcm9kdWN0QmluZGluZwotICAgICAgICAgICAgICAgaW50cm9JZD0ib3JnLmVjbGlwc2UuZXBmLnVpLmludHJvIgotICAgICAgICAgICAgICAgcHJvZHVjdElkPSJvcmcuZWNsaXBzZS5lcGYucmNwLnVpLmNvbXBvc2VyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmludHJvLmNvbmZpZyI+Ci0gICAgICA8Y29uZmlnCi0gICAgICAgICAgICBjb250ZW50PSIkbmwkL2ludHJvQ29udGVudC54bWwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaW50cm8uY29uZmlnIgotICAgICAgICAgICAgaW50cm9JZD0ib3JnLmVjbGlwc2UuZXBmLnVpLmludHJvIj4KLSAgICAgICAgIDxwcmVzZW50YXRpb24gaG9tZS1wYWdlLWlkPSJyb290IiBzdGFuZGJ5LXBhZ2UtaWQ9InN0YW5kYnkiPgotICAgICAgICAgICAJPGltcGxlbWVudGF0aW9uCi0gICAgICAgICAgIAkgIAkgICB3cz0id2luMzIsZ3RrIgotICAgICAgICAgICAJICAJICAgc3R5bGU9ImNzcy9zaGFyZWQuY3NzIgotICAgICAgICAgICAJICAJICAga2luZD0iaHRtbCIKLSAgICAgICAgICAgCSAgCSAgIG9zPSJ3aW4zMixsaW51eCI+Ci0gICAgICAgICAgIAk8L2ltcGxlbWVudGF0aW9uPgotICAgICAgICAgICAgPGltcGxlbWVudGF0aW9uIGtpbmQ9InN3dCIvPgotICAgICAgICAgICAgICAgPGxhdW5jaEJhcgotICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb249InJpZ2h0IgotICAgICAgICAgICAgICAgICAgICAgYmc9IiNkZWRjZjUiPgotICAgICAgICAgICAgICAgPGhhbmRsZQotICAgICAgICAgICAgICAgICAgICAgY2xvc2U9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICBpbWFnZT0iY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2hhbmRsZS5naWYiLz4KLSAgICAgICAgICAgICAgIDxzaG9ydGN1dAotICAgICAgICAgICAgICAgICAgICAgaWNvbj0iY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3LmdpZiIKLSAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXA9IiVzaG9ydGN1dC5vdmVydmlldy50b29sdGlwIgotICAgICAgICAgICAgICAgICAgICAgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9b3ZlcnZpZXciLz4KLSAgICAgICAgICAgICAgIDxzaG9ydGN1dAotICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD0iJXNob3J0Y3V0LnR1dG9yaWFscy50b29sdGlwIgotICAgICAgICAgICAgICAgICAgICAgaWNvbj0iY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFscy5naWYiCi0gICAgICAgICAgICAgICAgICAgICB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93UGFnZT9pZD10dXRvcmlhbHMiLz4KLSAgICAgICAgICAgICAgIDxzaG9ydGN1dAotICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD0iJXNob3J0Y3V0LmZpcnN0c3RlcHMudG9vbHRpcCIKLSAgICAgICAgICAgICAgICAgICAgIGljb249ImNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9maXJzdGVwczQ4LmdpZiIKLSAgICAgICAgICAgICAgICAgICAgIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dQYWdlP2lkPXN0ZXBzIi8+Ci0gICAgICAgICAgICAgICA8c2hvcnRjdXQKLSAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXA9IiVzaG9ydGN1dC53ZWJyZXNvdXJjZXMudG9vbHRpcCIKLSAgICAgICAgICAgICAgICAgICAgIGljb249ImNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjMTYuZ2lmIgotICAgICAgICAgICAgICAgICAgICAgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9d2ViIi8+Ci0gICAgICAgICAgICA8L2xhdW5jaEJhcj4KLSAgICAgICAgIDwvcHJlc2VudGF0aW9uPgotICAgICAgPC9jb25maWc+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmludHJvLmNvbmZpZ0V4dGVuc2lvbiI+Ci0gICAgICA8YWN0aW9uCi0gICAgICAgICAgICBuYW1lPSJvcGVuQ2hlYXRzaGVldFZpZXciCi0gICAgICAgICAgICByZXBsYWNlcz0icnVuQWN0aW9uP2NsYXNzPW9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5PcGVuQ2hlYXRzaGVldFZpZXcmYW1wO3BsdWdpbklkPW9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiPgotICAgICAgPC9hY3Rpb24+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vd2VsY29tZS54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vd2VsY29tZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMzYyOGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL3dlbGNvbWUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx3ZWxjb21lUGFnZSAKLQl0aXRsZT0iRWNsaXBzZSBQbGF0Zm9ybSIKLQlmb3JtYXQ9Im5vd3JhcCI+Ci0JPGludHJvPlRoaXMgcGFnZSB3aWxsIGhlbHAgZmFtaWxpYXJpemUgeW91IHdpdGggdGhlIEVjbGlwc2UgV29ya2JlbmNoLgotVG8gZ2V0IHN0YXJ0ZWQsIHJlYWQgdGhlIHNlY3Rpb25zIGJlbG93IGFuZCBjbGljayBvbiB0aGUgcmVsYXRlZCBsaW5rcy4gPC9pbnRybz4KLQotPGl0ZW0+PGI+SW5zdGFsbGVkIEZlYXR1cmVzIDwvYj4KLVRvIGZpbmQgb3V0IG1vcmUgYWJvdXQgdGhlIGZlYXR1cmVzIGluc3RhbGxlZCBpbiB5b3VyIHdvcmtiZW5jaCwgY2hvb3NlIDxhY3Rpb24gcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnVpLmlkZSIgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlF1aWNrU3RhcnRBY3Rpb24iPkhlbHAgPiBXZWxjb21lLi4uPC9hY3Rpb24+Ci1hbmQgc2VsZWN0IHRoZSBmZWF0dXJlIHlvdSBhcmUgaW50ZXJlc3RlZCBpbi48L2l0ZW0+Ci0KLTxpdGVtPjxiPlBlcnNwZWN0aXZlcywgdmlld3MgYW5kIGVkaXRvcnMgPC9iPgotQSB3aW5kb3cgY29udGFpbnMgb25lIG9yIG1vcmUgcGVyc3BlY3RpdmVzLiBBIHBlcnNwZWN0aXZlIGNvbnNpc3RzIG9mIHZpZXdzIChlLmcuIE5hdmlnYXRvcikgCi1hbmQgZWRpdG9ycyBmb3Igd29ya2luZyB3aXRoIHlvdXIgcmVzb3VyY2VzLgotCi1UaGUgc2hvcnRjdXQgYmFyIGF0IHRoZSBmYXIgbGVmdCBvZiB0aGUgd2luZG93IGFsbG93cyB5b3UgdG8gb3BlbiBuZXcgcGVyc3BlY3RpdmVzIGFuZCBtb3ZlCi1iZXR3ZWVuIHBlcnNwZWN0aXZlcyB0aGF0IGFyZSBhbHJlYWR5IG9wZW4uIFRoZSBwZXJzcGVjdGl2ZSB5b3UgYXJlIGN1cnJlbnRseSB3b3JraW5nIHdpdGggCi1pcyBzaG93biBpbiB0aGUgdGl0bGUgb2YgdGhlIHdpbmRvdyBhbmQgaW4gdGhlIHNob3J0Y3V0IGJhciBhcyBhIHB1c2hlZC1pbiBpY29uLjwvaXRlbT4KLQotPGl0ZW0+PGI+Q29uZmlndXJpbmcgeW91ciBwZXJzcGVjdGl2ZXM8L2I+Ci1Zb3UgY2FuIG1vdmUgdmlld3MgYW5kIGVkaXRvcnMgYXJvdW5kIHRoZSB3b3JrYmVuY2ggYnkgZHJhZ2dpbmcgdGhlaXIgdGl0bGViYXJzLiBZb3UgY2FuCi1hbHNvIGFkZCBtb3JlIHZpZXdzIHRvIHlvdXIgY3VycmVudCBwZXJzcGVjdGl2ZSBieSB1c2luZyBXaW5kb3cgPiBTaG93IFZpZXcuIAotVG8gcmVzZXQgdGhlIHBlcnNwZWN0aXZlIHRvIGl0cyBvcmlnaW5hbCBzdGF0ZSwgY2hvb3NlIDxhY3Rpb24gcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnVpIiAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLlJlc2V0UGVyc3BlY3RpdmVBY3Rpb24iPldpbmRvdyA+IFJlc2V0IFBlcnNwZWN0aXZlPC9hY3Rpb24+LiAKLQotT25jZSB5b3UgaGF2ZSBhcnJhbmdlZCB5b3VyIHBlcnNwZWN0aXZlLCB5b3UgY2FuIHNhdmUgaXQgdXNpbmcgV2luZG93ID4gU2F2ZSBQZXJzcGVjdGl2ZSBBcy4uLi4gCi1Zb3UgY2FuIGN1c3RvbWl6ZSB0aGUgdmlld3MsIHBlcnNwZWN0aXZlcyBhbmQgTmV3IG1lbnUgb3BlcmF0aW9ucyB0aGF0IHNob3cgdXAgZm9yIAoteW91ciBwZXJzcGVjdGl2ZS4gVG8gZG8gdGhpcyBjaG9vc2UgPGFjdGlvbiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UudWkiICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuRWRpdEFjdGlvblNldHNBY3Rpb24iPldpbmRvdyA+IEN1c3RvbWl6ZSBQZXJzcGVjdGl2ZS4uLjwvYWN0aW9uPiAuICBBIHZpZXcgY2FuCi1hZGRpdGlvbmFsbHkgYmUgY29udmVydGVkIGludG8gYSBGYXN0IFZpZXcgYnkgZHJhZ2dpbmcgaXQgdG8gdGhlIHNob3J0Y3V0IGJhciAoYXQgdGhlIAotZmFyIGxlZnQgb2YgdGhlIHdpbmRvdykuIDwvaXRlbT4gCi0KLTxpdGVtPjxiPkpvaW4gYSBDVlMgdGVhbTwvYj4KLVRvIGpvaW4gYSBDVlMgZGV2ZWxvcG1lbnQgdGVhbSwgb3BlbiB0aGUgPGFjdGlvbiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMudWkiIGNsYXNzPSJvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMudWkuYWN0aW9ucy5TaG93Q1ZTUGVyc3BlY3RpdmVBY3Rpb24iPkNWUyBSZXBvc2l0b3J5IEV4cGxvcmluZyBwZXJzcGVjdGl2ZTwvYWN0aW9uPi4gTmV4dCwgc3BlY2lmeQotdGhlIGxvY2F0aW9uIG9mIHlvdXIgQ1ZTIHJlcG9zaXRvcnkuIFRvIGRvIHRoaXMsIGNob29zZSA8YWN0aW9uIHBsdWdpbklkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy51aSIgY2xhc3M9Im9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy51aS5yZXBvLk5ld0NWU1JlcG9zaXRvcnlBY3Rpb24iPk5ldyA+IFJlcG9zaXRvcnkgTG9jYXRpb24uLi48L2FjdGlvbj4gZnJvbSB0aGUKLUNWUyBSZXBvc2l0b3JpZXMgdmlldyBwb3B1cCBtZW51LiBXaGVuIHRoZSBsb2NhdGlvbiB3aXphcmQgb3BlbnMsIGZpbGwgaW4gdGhlIGRldGFpbHMgb2YgeW91cgotQ1ZTIHJlcG9zaXRvcnkgYW5kIGNsaWNrIEZpbmlzaC4gCi0KLUEgcmVwb3NpdG9yeSBsb2NhdGlvbiB3aWxsIGFwcGVhciBpbiB0aGUgQ1ZTIFJlcG9zaXRvcmllcyB2aWV3LiBFeHBhbmQgdGhlIGxvY2F0aW9uLCB0aGVuIGV4cGFuZAotdGhlIEhFQUQgYnJhbmNoLiBZb3Ugd2lsbCBzZWUgYSBsaXN0IG9mIHRoZSBtb2R1bGVzIGluIHRoYXQgcmVwb3NpdG9yeS4gU2VsZWN0IGEgbW9kdWxlIGFuZCBjaG9vc2UgCi08Yj5DaGVja291dCBhcyBQcm9qZWN0PC9iPiBmcm9tIHRoZSBjb250ZXh0IG1lbnUuIFRoaXMgd2lsbCBjaGVja291dCB0aGUgbW9kdWxlIGZyb20gdGhlIENWUyAKLXJlcG9zaXRvcnkgYW5kIGNyZWF0ZSBhIHByb2plY3QgYnkgdGhhdCBuYW1lIGluIHlvdXIgd29ya3NwYWNlLjwvaXRlbT4KLQotPGl0ZW0+PGI+UnVubmluZyBhbiBBbnQgQnVpbGRmaWxlPC9iPgotVG8gcnVuIGFuIEFudCBidWlsZGZpbGUsIGNsaWNrIG9uIFJ1biA+IEV4dGVybmFsIFRvb2xzID4gRXh0ZXJuYWwgVG9vbHMuLi4uIFNlbGVjdCBBbnQgQnVpbGQgYXMgdGhlIGxhdW5jaAotY29uZmlndXJhdGlvbiB0eXBlIGFuZCBjbGljayBOZXcuIElkZW50aWZ5IHRoZSBidWlsZGZpbGUgaW4gdGhlIExvY2F0aW9uIGZpZWxkIGFuZCB0aGVuIGNsaWNrIFJ1bi48L2l0ZW0+Ci0KLTxpdGVtPjxiPkxlYXJuIG1vcmUgPC9iPgotVG8gbGVhcm4gbW9yZSB5b3UgY2FuIGJyb3dzZSB0aGUgPHRvcGljIGlkPSIvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvdG9jLnhtbCI+V29ya2JlbmNoIFVzZXIgR3VpZGU8L3RvcGljPi4gQnJvd3NlIHRoZSA8dG9waWMgaHJlZj0iL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3JlZmVyZW5jZS9yZWYtYW50aWNvbnMuaHRtIj5FeHRlcm5hbCBUb29scyBhbmQgQW50IEljb25zPC90b3BpYz4KLXNlY3Rpb24gdG8gcmVjb2duaXplIHRoZSB2YXJpb3VzIEV4dGVybmFsIFRvb2xzIGFuZCBBbnQgZWxlbWVudHMuIDwvaXRlbT4KLQotPC93ZWxjb21lUGFnZT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYTExMDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJjMDFkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi51aS5FUEZVSVBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24sCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dCwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi51aSwKLSBvcmcuZWNsaXBzZS5lcGYudWkuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS5lcGYudWkuZGlhbG9ncywKLSBvcmcuZWNsaXBzZS5lcGYudWkuZWRpdG9ycywKLSBvcmcuZWNsaXBzZS5lcGYudWkucHJlZmVyZW5jZXMsCi0gb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhmZmUxMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTgwZWE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgVUkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIFZpZXdzCi12aWV3Q2F0ZWdvcnlOYW1lPU1ldGhvZCBBdXRob3JpbmcKLQotIyBXaXphcmRzCi13aXphcmRDYXRlZ29yeU5hbWU9TWV0aG9kIEF1dGhvcmluZwotCi0jIEFjdGlvbiBTZXQKLWFjdGlvblNldExhYmVsPU1ldGhvZCBBdXRob3JpbmcKLQotIyBQcmVmZXJlbmNlIFBhZ2VzCi1yb290UHJlZmVyZW5jZVBhZ2VOYW1lPU1ldGhvZAotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzgwYmE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudWkudmlld3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBuYW1lPSIldmlld0NhdGVnb3J5TmFtZSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZCA9ICJvcmcuZWNsaXBzZS5lcGYudWkubmV3V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIG5hbWU9IiV3aXphcmRDYXRlZ29yeU5hbWUiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIGlkID0gIm9yZy5lY2xpcHNlLmVwZi51aS5leHBvcnRXaXphcmRzLmNhdGVnb3J5IgotICAgICAgICAgICAgbmFtZT0iJXdpemFyZENhdGVnb3J5TmFtZSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pbXBvcnRXaXphcmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQgPSAib3JnLmVjbGlwc2UuZXBmLnVpLmltcG9ydFdpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBuYW1lPSIld2l6YXJkQ2F0ZWdvcnlOYW1lIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgICAgaWQ9ImV4cG9ydFdpemFyZHMiCi0gICAgICAgICBuYW1lPSJFUEYgRXhwb3J0IFdpemFyZHMiCi0gICAgICAgICBzY2hlbWE9InNjaGVtYS9FeHBvcnRXaXphcmRzLmV4c2QiLz4KLQotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgICAgaWQ9ImltcG9ydFdpemFyZHMiCi0gICAgICAgICBuYW1lPSJFUEYgSW1wb3J0IFdpemFyZHMiCi0gICAgICAgICBzY2hlbWE9InNjaGVtYS9JbXBvcnRXaXphcmRzLmV4c2QiLz4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnVpLnByZWZlcmVuY2VzLlJvb3RQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYudWkucHJlZmVyZW5jZXMuUm9vdFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgbmFtZT0iJXJvb3RQcmVmZXJlbmNlUGFnZU5hbWUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zY2hlbWEvRXhwb3J0V2l6YXJkcy5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NjaGVtYS9FeHBvcnRXaXphcmRzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4OTM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NjaGVtYS9FeHBvcnRXaXphcmRzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYudWkiIGlkPSJleHBvcnRXaXphcmRzIiBuYW1lPSJFUEYgRXhwb3J0IFdpemFyZHMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRW5hYmxlcyBhIHBsdWctaW4gdG8gY29udHJpYnV0ZSBhbiBleHBvcnQgd2l6YXJkIHRvIHRoZSBzdGFuZGFsb25lIFJDUC1iYXNlZCBFUEYgQ29tcG9zZXIgVUkuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpemFyZCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ3aXphcmQiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBob3cgdGhlIGV4dGVuc2lvbiBwb2ludCBjYW4gYmUgdXNlZDogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi51aS5leHBvcnRXaXphcmRzJnF1b3Q7Jmd0OwotICAgICAgJmx0O3dpemFyZCBpZD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS53aXphcmRzLkV4cG9ydE1TUFdpemFyZCZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NjaGVtYS9JbXBvcnRXaXphcmRzLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc2NoZW1hL0ltcG9ydFdpemFyZHMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwNzgzNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc2NoZW1hL0ltcG9ydFdpemFyZHMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi51aSIgaWQ9ImltcG9ydFdpemFyZHMiIG5hbWU9IkVQRiBJbXBvcnQgV2l6YXJkcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFbmFibGVzIGEgcGx1Zy1pbiB0byBjb250cmlidXRlIGFuIGltcG9ydCB3aXphcmQgdG8gdGhlIHN0YW5kYWxvbmUgUkNQLWJhc2VkIEVQRiBDb21wb3NlciBVSS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l6YXJkIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0aGUgZXh0ZW5zaW9uIHBvaW50IGNhbiBiZSB1c2VkOiAKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLnVpLmltcG9ydFdpemFyZHMmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7d2l6YXJkIGlkPSZxdW90O29yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLndpemFyZHMuSW1wb3J0WE1MV2l6YXJkJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9FUEZVSVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvRVBGVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdlMTgwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9FUEZVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgRVBGIFVJIHBsdWctaW4gY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRVBGVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgRVBGVUlQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRVBGVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVQRlVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvRVBGVUlSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL0VQRlVJUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZDgzMWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvRVBGVUlSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIEVQRiBVSSByZXNvdXJjZSBidW5kbGUuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVQRlVJUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IEVQRlVJUmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRVBGVUlSZXNvdXJjZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhbG9nX2ZpbGVOYW1lQ29uZmxpY3RfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfZmlsZU5hbWVDb25mbGljdF9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfZmlsZU5hbWVfc2VsZWN0QWN0aW9uX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhbG9nX2ZpbGVOYW1lX2Rlc3RpbmF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhbG9nX2ZpbGVOYW1lQ29uZmxpY3Rfbm90ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWxvZ19maWxlTmFtZV9yZXBsYWNlX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWxvZ19maWxlTmFtZV91bmlxdWVfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW50ZXJuYWxFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbml0aWFsaXplV2l6YXJkRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5pdGlhbGl6ZVdpemFyZFBhZ2VzRXJyb3JfcmVhc29uOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRVBGVUlSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY5MDMxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBGaWxlIE5hbWUgQ29uZmxpY3QgRGlhbG9nCi1EaWFsb2dfZmlsZU5hbWVDb25mbGljdF90aXRsZT1GaWxlIE5hbWUgQ29uZmxpY3QKLURpYWxvZ19maWxlTmFtZUNvbmZsaWN0X21zZz1JVVBVMDIwMFc6IFRoZSBmaWxlICcnezB9JycgYWxyZWFkeSBleGlzdHMgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5IHJlc291cmNlIGZvbGRlciAnJ3sxfScnLgotRGlhbG9nX2ZpbGVOYW1lQ29uZmxpY3Rfbm90ZT1Ob3RlOiBBbm90aGVyIG1ldGhvZCBlbGVtZW50IG1pZ2h0IHJlZmVyZW5jZSB0aGlzIGZpbGUuCi1EaWFsb2dfZmlsZU5hbWVfcmVwbGFjZV9tc2c9UmVwbGFjZSBleGlzdGluZyBmaWxlIHdpdGggbmV3IGZpbGUKLURpYWxvZ19maWxlTmFtZV91bmlxdWVfbXNnPVNwZWNpZnkgdW5pcXVlIG5hbWUgZm9yIHRoaXMgbmV3IGZpbGUKLURpYWxvZ19maWxlTmFtZV9zZWxlY3RBY3Rpb25fbGFiZWw9U2VsZWN0IGFjdGlvbjoKLQotIyBFcnJvciBNZXNzYWdlcwotaW50ZXJuYWxFcnJvcl9yZWFzb249QW4gaW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkLlxuXG5DbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotaW5pdGlhbGl6ZVdpemFyZEVycm9yX3JlYXNvbj1UaGUgd2l6YXJkIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCBjb3JyZWN0bHkuCi1pbml0aWFsaXplV2l6YXJkUGFnZXNFcnJvcl9yZWFzb249T25lIG9yIG1vcmUgd2l6YXJkIHBhZ2VzIGhhdmUgbm90IGJlZW4gaW5pdGlhbGl6ZWQgY29ycmVjdGx5LgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvYWN0aW9ucy9DQ29tYm9Db250cmlidXRpb25JdGVtLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9hY3Rpb25zL0NDb21ib0NvbnRyaWJ1dGlvbkl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI4MWYwNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9hY3Rpb25zL0NDb21ib0NvbnRyaWJ1dGlvbkl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29vbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLQotLyoqCi0gKiBXcmFwcyBhIENDb21ibyBpbiBhIENvbnRyaWJ1dGlvbkl0ZW0gZm9yIHVzZSBpbiBhIHRvb2xiYXIKLSAqIAotICogRG9lcyBub3QgdXNlIGEgQ29tYm9WaWV3ZXIgYmVjYXVzZSBvZiB0YWJiaW5nIGlzc3VlcyAtIHNlZSBidWcgNzg4ODUKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIENDb21ib0NvbnRyaWJ1dGlvbkl0ZW0gZXh0ZW5kcyBDb250cmlidXRpb25JdGVtIHsKLQotCXByb3RlY3RlZCBDQ29tYm8gQ0NvbWJvOwotCi0JcHJvdGVjdGVkIFRvb2xJdGVtIHRvb2xJdGVtOwotCi0JcHJvdGVjdGVkIENvb2xJdGVtIGNvb2xJdGVtOwotCQotCXByb3RlY3RlZCBpbnQgc3R5bGU7Ci0JCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248U3RyaW5nPiBpbnB1dDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENDb21ib0NvbnRyaWJ1dGlvbkl0ZW0oaW50IHN0eWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3R5bGUgPSBzdHlsZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGwoVG9vbEJhciBwYXJlbnQsIGludCBpbmRleCkgewotCQl0b29sSXRlbSA9IG5ldyBUb29sSXRlbShwYXJlbnQsIFNXVC5TRVBBUkFUT1IpOwotCQlDb250cm9sIGJveCA9IGNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJdG9vbEl0ZW0uc2V0Q29udHJvbChib3gpOwotCQlQb2ludCBwcmVmZXJyZWRTaXplID0gQ0NvbWJvLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSk7Ci0JCXRvb2xJdGVtLnNldFdpZHRoKHByZWZlcnJlZFNpemUueCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtI2ZpbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29vbEJhciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsKENvb2xCYXIgY29vbEJhciwgaW50IGluZGV4KSB7Ci0JCUNvbnRyb2wgYm94ID0gY3JlYXRlQ29udHJvbChjb29sQmFyKTsKLQotCQlpZiAoaW5kZXggPj0gMCkgewotCQkJY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgU1dULkRST1BfRE9XTiwgaW5kZXgpOwotCQl9IGVsc2UgewotCQkJY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgU1dULkRST1BfRE9XTik7Ci0JCX0KLQotCQkvLyBTZXQgdGhlIGJhY2sgcmVmZXJlbmNlLgotCQljb29sSXRlbS5zZXREYXRhKHRoaXMpOwotCi0JCS8vIEFkZCB0aGUgdG9vbGJhciB0byB0aGUgQ29vbEl0ZW0gd2lkZ2V0LgotCQljb29sSXRlbS5zZXRDb250cm9sKGJveCk7Ci0KLQkJLy8gSWYgdGhlIHRvb2xiYXIgaXRlbSBleGlzdHMgdGhlbiBhZGp1c3QgdGhlIHNpemUgb2YgdGhlIGNvb2wgaXRlbS4KLQkJUG9pbnQgdG9vbEJhclNpemUgPSBib3guY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQotCQkvLyBTZXQgdGhlIHByZWZlcnJlZCBzaXplIHRvIHRoZSBzaXplIG9mIHRoZSB0b29sYmFyIHBsdXMgdHJpbS4KLQkJY29vbEl0ZW0uc2V0TWluaW11bVNpemUodG9vbEJhclNpemUpOwotCQljb29sSXRlbS5zZXRQcmVmZXJyZWRTaXplKHRvb2xCYXJTaXplKTsKLQkJY29vbEl0ZW0uc2V0U2l6ZSh0b29sQmFyU2l6ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtI2ZpbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGwoQ29tcG9zaXRlIHBhcmVudCkgewotCQljcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250cm9sKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ0NvbWJvID0gbmV3IENDb21ibyhwYXJlbnQsIHN0eWxlKTsKLQkJQ0NvbWJvLnNldFZpc2libGVJdGVtQ291bnQoMTApOwotCQlDQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLQkJQ0NvbWJvLnNldEl0ZW1zKGlucHV0LnRvQXJyYXkobmV3IFN0cmluZ1swXSkpOwotCQlDQ29tYm8uYWRkRGlzcG9zZUxpc3RlbmVyKAotCQkJCW5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCQkJZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJQ0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCXBlcmZvcm1TZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlyZXR1cm4gQ0NvbWJvOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0U2VsZWN0aW9uSW5kZXgoKSB7Ci0JCXJldHVybiBDQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW5wdXQoQ29sbGVjdGlvbjxTdHJpbmc+IGlucHV0KSB7Ci0JCXRoaXMuaW5wdXQgPSBpbnB1dDsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1TZWxlY3Rpb25DaGFuZ2VkKCkgewotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIENDb21ibyBnZXRDQ29tYm8oKSB7Ci0JCXJldHVybiBDQ29tYm87Ci0JfQotCi0JcHVibGljIFRvb2xJdGVtIGdldFRvb2xJdGVtKCkgewotCQlyZXR1cm4gdG9vbEl0ZW07Ci0JfQotCi0JcHVibGljIENvb2xJdGVtIGdldENvb2xJdGVtKCkgewotCQlyZXR1cm4gY29vbEl0ZW07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvZGlhbG9ncy9SZW5hbWVGaWxlQ29uZmxpY3REaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL2RpYWxvZ3MvUmVuYW1lRmlsZUNvbmZsaWN0RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMTM2NTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvZGlhbG9ncy9SZW5hbWVGaWxlQ29uZmxpY3REaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS5FUEZVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIERpc3BsYXlzIGEgZGlhbG9nIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byByZW5hbWUgYSBmaWxlIHBhdGguCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUmVuYW1lRmlsZUNvbmZsaWN0RGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCS8qKgotCSAqIFRoZSBPSyBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLQotCS8qKgotCSAqIFRoZSBDYW5jZWwgYnV0dG9uLgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gY2FuY2VsQnV0dG9uOwotCi0JLyoqCi0JICogVGhlIG92ZXJ3cml0ZSBidXR0b24KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIG92ZXJXcml0ZUJ1dHRvbjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2ZpbGVOYW1lOwotCXByaXZhdGUgaW50IE9WRVJfV1JJVEVfSUQgPSAyMjsKLQlwcml2YXRlIFN0cmluZyBtZXNzYWdlU3RyOwotCXByaXZhdGUgU3RyaW5nIGZpbGVOYW1lOwotCXByaXZhdGUgQnV0dG9uIGJ1dHRvbl9yZXBsYWNlOwotCXByaXZhdGUgQnV0dG9uIGJ1dHRvbl91bmlxdWU7Ci0KLQlwcml2YXRlIFN0cmluZyBkZXN0aW5hdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIFJlbmFtZUZpbGVDb25mbGljdERpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIERpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpIGRpYWxvZ0FyZWEuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gKEdyaWREYXRhKSBkaWFsb2dBcmVhLmdldExheW91dERhdGEoKTsKLQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSAxMDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNDUwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0KLQkJLy8gQ3JlYXRlIG1lc3NhZ2UgYXJlYS4KLQotCQlJbWFnZSBpbWFnZSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1dBUk5JTkcpOwotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJTGFiZWwgaW1hZ2VMYWJlbCA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTlVMTCk7Ci0JCQlpbWFnZS5zZXRCYWNrZ3JvdW5kKGltYWdlTGFiZWwuZ2V0QmFja2dyb3VuZCgpKTsKLQkJCWltYWdlTGFiZWwuc2V0SW1hZ2UoaW1hZ2UpOwotCQkJaW1hZ2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgKLQkJCQkJR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIKLQkJCQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCQl9Ci0KLQkJTGFiZWwgbWVzc2FnZSA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuV1JBUCk7Ci0JCWlmIChtZXNzYWdlU3RyICE9IG51bGwpIHsKLQkJCW1lc3NhZ2Uuc2V0VGV4dChtZXNzYWdlU3RyKTsKLQkJfQotCQlHcmlkRGF0YSBkYXRhMSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhMS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCW1lc3NhZ2Uuc2V0TGF5b3V0RGF0YShkYXRhMSk7Ci0KLQkJTGFiZWwgZW1wdHkgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQllbXB0eS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlMYWJlbCBub3RlID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJbm90ZS5zZXRUZXh0KEVQRlVJUmVzb3VyY2VzLkRpYWxvZ19maWxlTmFtZUNvbmZsaWN0X25vdGUpOwotCQlHcmlkRGF0YSBkYXRhMiA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhMi5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCW5vdGUuc2V0TGF5b3V0RGF0YShkYXRhMik7Ci0KLQkJZW1wdHkgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQllbXB0eS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSBkYXRhMyA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhMy5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWRhdGEzLmhlaWdodEhpbnQgPSAxMDsKLQkJZW1wdHkuc2V0TGF5b3V0RGF0YShkYXRhMyk7Ci0KLQkJZW1wdHkgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQllbXB0eS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlMYWJlbCBzZWxlY3RBY3Rpb24gPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQlzZWxlY3RBY3Rpb24uc2V0VGV4dChFUEZVSVJlc291cmNlcy5EaWFsb2dfZmlsZU5hbWVfc2VsZWN0QWN0aW9uX2xhYmVsKTsKLQkJR3JpZERhdGEgZGF0YTQgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YTQuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlzZWxlY3RBY3Rpb24uc2V0TGF5b3V0RGF0YShkYXRhNCk7Ci0KLQkJZW1wdHkgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQllbXB0eS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQllbXB0eSA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWVtcHR5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWJ1dHRvbl9yZXBsYWNlID0gbmV3IEJ1dHRvbihkaWFsb2dBcmVhLCBTV1QuUkFESU8pOwotCQkvLyBMYWJlbCByZXBsYWNlX2xhYmVsID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJLy8gcmVwbGFjZV9sYWJlbC5zZXRUZXh0KEVQRlVJUmVzb3VyY2VzLkRpYWxvZ19maWxlTmFtZV9yZXBsYWNlX21zZyk7Ci0JCWJ1dHRvbl9yZXBsYWNlLnNldFRleHQoRVBGVUlSZXNvdXJjZXMuRGlhbG9nX2ZpbGVOYW1lX3JlcGxhY2VfbXNnKTsKLQkJYnV0dG9uX3JlcGxhY2Uuc2V0U2VsZWN0aW9uKHRydWUpOwotCi0JCWVtcHR5ID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJZW1wdHkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJZW1wdHkgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQllbXB0eS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlidXR0b25fdW5pcXVlID0gbmV3IEJ1dHRvbihkaWFsb2dBcmVhLCBTV1QuUkFESU8pOwotCQkvLyBMYWJlbCB1bmlxdWVMYWJlbCA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCS8vIHVuaXF1ZUxhYmVsLnNldFRleHQoRVBGVUlSZXNvdXJjZXMuRGlhbG9nX2ZpbGVOYW1lX3VuaXF1ZV9tc2cpOwotCQlidXR0b25fdW5pcXVlLnNldFRleHQoRVBGVUlSZXNvdXJjZXMuRGlhbG9nX2ZpbGVOYW1lX3VuaXF1ZV9tc2cpOwotCQlidXR0b25fdW5pcXVlLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGFyZWEuIC0tIFRPRE86IGZpbmQgZGlmZmVyZW50IHdheSBpbnN0ZWFkIG9mIGVtcHR5Ci0JCS8vIGxhYmVscy4KLQkJZW1wdHkgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQllbXB0eS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQllbXB0eSA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWVtcHR5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfZmlsZU5hbWUgPSBuZXcgVGV4dChkaWFsb2dBcmVhLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ3JpZERhdGExID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWdyaWREYXRhMS53aWR0aEhpbnQgPSAyMDA7Ci0JCWdyaWREYXRhMS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUjsKLQkJY3RybF9maWxlTmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhMSk7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0JCQljdHJsX2ZpbGVOYW1lLnNldFRleHQoZmlsZU5hbWUpOwotCQkJY3RybF9maWxlTmFtZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCQljdHJsX2ZpbGVOYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChva0J1dHRvbiAhPSBudWxsKSB7Ci0JCQkJCW9rQnV0dG9uCi0JCQkJCQkJLnNldEVuYWJsZWQoY3RybF9maWxlTmFtZS5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMCk7Ci0JCQkJfQotCQkJCWZpbGVOYW1lID0gY3RybF9maWxlTmFtZS5nZXRUZXh0KCk7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGVzdGluYXRpb24gKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lKTsKLQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJYnV0dG9uX3JlcGxhY2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQljdHJsX2ZpbGVOYW1lLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCWJ1dHRvbl91bmlxdWUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQljdHJsX2ZpbGVOYW1lLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZmlsZU5hbWUgPSBjdHJsX2ZpbGVOYW1lLmdldFRleHQoKTsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkZXN0aW5hdGlvbiArIEZpbGUuc2VwYXJhdG9yICsgZmlsZU5hbWUpOwotCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlzdXBlci5nZXRTaGVsbCgpLnNldFRleHQoRVBGVUlSZXNvdXJjZXMuRGlhbG9nX2ZpbGVOYW1lQ29uZmxpY3RfdGl0bGUpOyAKLQotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRpYWxvZyBidXR0b25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIE9LIGJ1dHRvbi4KLQkJLy8gY3JlYXRlQnV0dG9uKHBhcmVudCwgT1ZFUl9XUklURV9JRCwKLQkJLy8gRVBGVUlSZXNvdXJjZXMuRGlhbG9nX2ZpbGVOYW1lX292ZXJXcml0ZSwgdHJ1ZSk7Ci0KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLQkJCQl0cnVlKTsKLQotCQkvLyBDcmVhdGUgdGhlIENhbmNlbCBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0KLQkJLy8gU2V0IGhlbHAgY29udGV4dCBmb3IgdGhlIE9LIGJ1dHRvbi4KLQkJb2tCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCk7Ci0KLQkJLy8gU2V0IGhlbHAgY29udGV4dCBmb3IgdGhlIENhbmNlbCBidXR0b24uCi0JCWNhbmNlbEJ1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCk7Ci0KLQkJLy8gU2V0IGhlbHAgY29udGV4dCBmb3IgdGhlIG92ZXJ3cml0ZSBidXR0b24KLQkJLy8gb3ZlcldyaXRlQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKE9WRVJfV1JJVEVfSUQpOwotCi0JCS8vIG9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBGaWxlIE5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVQYXRoKCkgewotCQlyZXR1cm4gZmlsZU5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsZVBhdGgoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCXRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQnV0dG9uQmFyKHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IE9WRVJfV1JJVEVfSUQpIHsKLQkJCW92ZXJXcml0ZVByZXNzZWQoKTsKLQkJfQotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3ZlcldyaXRlUHJlc3NlZCgpIHsKLQkJc2V0UmV0dXJuQ29kZShPVkVSX1dSSVRFX0lEKTsKLQkJY2xvc2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkgewotCQlmaWxlTmFtZSA9IG51bGw7Ci0JCXN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VTdHIoKSB7Ci0JCXJldHVybiBtZXNzYWdlU3RyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VTdHIoU3RyaW5nIG1lc3NhZ2VTdHIpIHsKLQkJdGhpcy5tZXNzYWdlU3RyID0gbWVzc2FnZVN0cjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXN0aW5hdGlvbihTdHJpbmcgZGVzdGluYXRpb24pIHsKLQkJdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvZWRpdG9ycy9JTWV0aG9kRWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9lZGl0b3JzL0lNZXRob2RFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQyZmUyNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9lZGl0b3JzL0lNZXRob2RFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudWkuZWRpdG9yczsKLQotcHVibGljIGludGVyZmFjZSBJTWV0aG9kRWRpdG9yIHsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvcHJlZmVyZW5jZXMvQmFzZVByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9wcmVmZXJlbmNlcy9CYXNlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E1NDBjZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9wcmVmZXJlbmNlcy9CYXNlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIEVQRiBwcmVmZXJlbmNlIHBhZ2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEJhc2VQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQoSVdvcmtiZW5jaCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbXBvc2l0ZSB3aXRoIGEgZ3JpZCBsYXlvdXQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb21wb3NpdGUgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21wb3NpdGUgY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY2hpbGQgY29tcG9zaXRlIHdpdGggYSBncmlkIGxheW91dC4KLQkgKiA8cD4KLQkgKiBUaGUgY2hpbGQgY29tcG9zaXRlIHdpbGwgYmUgaW5kZW50ZWQgZnJvbSB0aGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbXBvc2l0ZSB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDaGlsZEdyaWRMYXlvdXRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlQ2hpbGRHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZ3JvdXAgd2l0aCBhIGdyaWQgbGF5b3V0LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgZ3JvdXAKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBncm91cCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+R3JvdXA8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgR3JvdXAgY3JlYXRlR3JpZExheW91dEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LAotCQkJaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVHcmlkTGF5b3V0R3JvdXAocGFyZW50LCB0ZXh0LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBncm91cCB3aXRoIGEgZ3JpZCBsYXlvdXQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBncm91cAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGdyb3VwIHdpbGwgdGFrZSB1cAotCSAqIEBwYXJhbSBlcXVhbENvbHVtbldpZHRoCi0JICogICAgICAgICAgICBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgY29sdW1uIGNlbGxzIHNob3VsZCBiZSBzYW1lIHdpZHRoIG9yCi0JICogICAgICAgICAgICBub3QKLQkgKiBAcmV0dXJuIGEgPGNvZGU+R3JvdXA8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgR3JvdXAgY3JlYXRlR3JpZExheW91dEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LAotCQkJaW50IGNvbHVtbiwgYm9vbGVhbiBlcXVhbENvbHVtbldpZHRoKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUdyaWRMYXlvdXRHcm91cChwYXJlbnQsIHRleHQsIGNvbHVtbiwKLQkJCQllcXVhbENvbHVtbldpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGxhYmVsIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5MYWJlbDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVMYWJlbChwYXJlbnQsIHRleHQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbAotCSAqIEByZXR1cm4gYSA8Y29kZT5MYWJlbDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVMYWJlbChwYXJlbnQsIHRleHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGhlaWdodEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgaGVpZ2h0IChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBkZWZhdWx0VGV4dCwgaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlRWRpdGFibGVUZXh0KHBhcmVudCwgZGVmYXVsdFRleHQsIHdpZHRoSGludCwKLQkJCQloZWlnaHRIaW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSByZWFkb25seSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgZGVmYXVsdFRleHQsCi0JCQlpbnQgd2lkdGhIaW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZVRleHQocGFyZW50LCBkZWZhdWx0VGV4dCwgd2lkdGhIaW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gcmVhZG9ubHkgdGV4dCBjb250cm9sIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBkZWZhdWx0VGV4dCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVUZXh0KHBhcmVudCwgZGVmYXVsdFRleHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGRlZmF1bHRUZXh0LCBpbnQgd2lkdGhIaW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQsIGRlZmF1bHRUZXh0LCB3aWR0aEhpbnQsCi0JCQkJY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVkaXRhYmxlIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBkZWZhdWx0VGV4dCwgaW50IHdpZHRoSGludCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVFZGl0YWJsZVRleHQocGFyZW50LCBkZWZhdWx0VGV4dCwgd2lkdGhIaW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVkaXRhYmxlIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVFZGl0YWJsZVRleHQocGFyZW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBkZWZhdWx0VGV4dCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVFZGl0YWJsZVRleHQocGFyZW50LCBkZWZhdWx0VGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlbXB0eSBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wgdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4KLQkgKiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlRWRpdGFibGVUZXh0KHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJlYWRvbmx5IG11bHRpLWxpbmUgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGhlaWdodEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgaGVpZ2h0IChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgZGVmYXVsdFRleHQsIGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZU11bHRpTGluZVRleHQocGFyZW50LCBkZWZhdWx0VGV4dCwgd2lkdGhIaW50LAotCQkJCWhlaWdodEhpbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBjb21ib2JveC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkNvbWJvPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENvbWJvIGNyZWF0ZUNvbWJvYm94KENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlQ29tYm9ib3gocGFyZW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gY29tYm9ib3ggdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gYSA8Y29kZT5Db21ibzwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21ibyBjcmVhdGVDb21ib2JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUNvbWJvYm94KHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGJ1dHRvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+QnV0dG9uPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlQnV0dG9uKHBhcmVudCwgdGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNoZWNrYm94LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsCi0JCQlpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUNoZWNrYm94KHBhcmVudCwgdGV4dCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY2hlY2tib3ggdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+QnV0dG9uPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEJ1dHRvbiBjcmVhdGVDaGVja2JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVDaGVja2JveChwYXJlbnQsIHRleHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gcmFkaW8gYnV0dG9uLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHBhcmFtIHNlbGVjdGVkCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgc2VsZWN0IHRoZSByYWRpbyBidXR0b24gYnkgZGVmYXVsdAotCSAqIEByZXR1cm4gYSA8Y29kZT5CdXR0b248L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LAotCQkJaW50IGNvbHVtbiwgYm9vbGVhbiBzZWxlY3RlZCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVSYWRpb0J1dHRvbihwYXJlbnQsIHRleHQsIGNvbHVtbiwgc2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gcmFkaW8gYnV0dG9uIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlUmFkaW9CdXR0b24ocGFyZW50LCB0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZG9ubHkgdGV4dCB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0Vmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHRWaWV3ZXIgY3JlYXRlVGV4dFZpZXdlcihDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlVGV4dFZpZXdlcihwYXJlbnQsIHdpZHRoSGludCwgaGVpZ2h0SGludCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZG9ubHkgdGV4dCB2aWV3ZXIgdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0Vmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHRWaWV3ZXIgY3JlYXRlVGV4dFZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZVRleHRWaWV3ZXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdGFibGUgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gaGVpZ2h0SGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBoZWlnaHQgKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGFibGVWaWV3ZXI8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGFibGVWaWV3ZXIgY3JlYXRlVGFibGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZVRhYmxlVmlld2VyKHBhcmVudCwgd2lkdGhIaW50LCBoZWlnaHRIaW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjaGVja2JveCB0YWJsZSB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5DaGVja2JveFRhYmxlVmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENoZWNrYm94VGFibGVWaWV3ZXIgY3JlYXRlQ2hlY2tib3hUYWJsZVZpZXdlcigKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUNoZWNrYm94VGFibGVWaWV3ZXIocGFyZW50LCB3aWR0aEhpbnQsIGhlaWdodEhpbnQsCi0JCQkJY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY2hlY2tib3ggdGFibGUgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q2hlY2tib3hUYWJsZVZpZXdlcjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDaGVja2JveFRhYmxlVmlld2VyIGNyZWF0ZUNoZWNrYm94VGFibGVWaWV3ZXIoCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUNoZWNrYm94VGFibGVWaWV3ZXIocGFyZW50LCAzNjAsIDE3NSwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGxpbmUgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkxhYmVsPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExhYmVsIGNyZWF0ZUxpbmUoQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVMaW5lKHBhcmVudCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIHRleHQgY29udHJvbCBoYXMgc29tZSB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sCi0JICogICAgICAgICAgICB0aGUgdGV4dCBjb250cm9sCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdGV4dCBjb250cm9sIGhhcyBzb21lIHRleHQsCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzTm9uRW1wdHlUZXh0KFRleHQgY29udHJvbCkgewotCQlyZXR1cm4gU1dUVXRpbC5pc05vbkVtcHR5VGV4dChjb250cm9sKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3ByZWZlcmVuY2VzL1Jvb3RQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvcHJlZmVyZW5jZXMvUm9vdFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1OTViM2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvcHJlZmVyZW5jZXMvUm9vdFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBUaGUgcm9vdCBwcmVmZXJlbmNlIHBhZ2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUm9vdFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQmFzZVByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIDMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtRGVmYXVsdHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3V0aWwvU1dUVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvdXRpbC9TV1RVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMDJiZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvdXRpbC9TV1RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBjcmVhdGUgU1dUIHdpZGdldHMgZm9yIHRoZSBFUEYgVUkuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaGVscHMgdG8gcHJvdmlkZSBhIGNvbW1vbiBsb29rIGFuZCBmZWVsIGZvciBhbGwgRVBGIGZvcm1zLAotICogZGlhbG9ncywgd2l6YXJkcyBhbmQgcHJlZmVyZW5jZSBwYWdlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBTV1RVdGlsIHsKLQotCS8qKgotCSAqIFByZXZlbnRzIGV4dGVybmFsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBjbGFzcy4gQWxsIG1ldGhvZHMgaW4gdGhpcyBjbGFzcwotCSAqIHNob3VsZCBiZSBkZWNsYXJlZCBzdGF0aWMuCi0JICovCi0JcHJpdmF0ZSBTV1RVdGlsKCkgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21wb3NpdGUgd2l0aCBhIGdyaWQgbGF5b3V0LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29tcG9zaXRlIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBjb2x1bW4pIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoY29sdW1uLCBmYWxzZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNoaWxkIGNvbXBvc2l0ZSB3aXRoIGEgZ3JpZCBsYXlvdXQuCi0JICogPHA+Ci0JICogVGhlIGNoaWxkIGNvbXBvc2l0ZSB3aWxsIGJlIGluZGVudGVkIGZyb20gdGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb21wb3NpdGUgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGUgY3JlYXRlQ2hpbGRHcmlkTGF5b3V0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgY29sdW1uKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KGNvbHVtbiwgZmFsc2UpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkoKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKSkubWFyZ2luVG9wID0gLTM7Ci0JCSgoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gMTM7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGdyb3VwIHdpdGggYSBncmlkIGxheW91dC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGdyb3VwCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgZ3JvdXAgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkdyb3VwPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEdyb3VwIGNyZWF0ZUdyaWRMYXlvdXRHcm91cChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwKLQkJCWludCBjb2x1bW4pIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dChjb2x1bW4sIGZhbHNlKSk7Ci0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlncm91cC5zZXRUZXh0KHRleHQpOwotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGdyb3VwIHdpdGggYSBncmlkIGxheW91dC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGdyb3VwCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgZ3JvdXAgd2lsbCB0YWtlIHVwCi0JICogQHBhcmFtIGVxdWFsQ29sdW1uV2lkdGgKLQkgKiAgICAgICAgICAgIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBjb2x1bW4gY2VsbHMgc2hvdWxkIGJlIHNhbWUgd2lkdGggb3IKLQkgKiAgICAgICAgICAgIG5vdAotCSAqIEByZXR1cm4gYSA8Y29kZT5Hcm91cDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBHcm91cCBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsCi0JCQlpbnQgY29sdW1uLCBib29sZWFuIGVxdWFsQ29sdW1uV2lkdGgpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dChjb2x1bW4sIGVxdWFsQ29sdW1uV2lkdGgpKTsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWdyb3VwLnNldFRleHQodGV4dCk7Ci0JCXJldHVybiBncm91cDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGxhYmVsIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5MYWJlbDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IGNvbHVtbikgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW47Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbAotCSAqIEByZXR1cm4gYSA8Y29kZT5MYWJlbDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdmVydGljYWxseSBhbGlnbmVkIGxhYmVsIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbAotCSAqIEByZXR1cm4gYSA8Y29kZT5MYWJlbDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVWZXJ0aWNhbGx5QWxpZ25lZExhYmVsKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZG9ubHkgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGRlZmF1bHRUZXh0LAotCQkJaW50IHdpZHRoSGludCwgaW50IGNvbHVtbikgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW47Ci0JCWdkLndpZHRoSGludCA9IHdpZHRoSGludDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiByZWFkb25seSB0ZXh0IGNvbnRyb2wgdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGRlZmF1bHRUZXh0KSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl0ZXh0LnNldFRleHQoZGVmYXVsdFRleHQpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVkaXRhYmxlIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBkZWZhdWx0VGV4dCwKLQkJCWludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5XUkFQCi0JCQkJfCBTV1QuVl9TQ1JPTEwpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbjsKLQkJZ2Qud2lkdGhIaW50ID0gd2lkdGhIaW50OwotCQlnZC5oZWlnaHRIaW50ID0gaGVpZ2h0SGludDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsCi0JCQlpbnQgaGVpZ2h0SGludCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gY3JlYXRlRWRpdGFibGVUZXh0KHBhcmVudCwgIiIsIHdpZHRoSGludCwgaGVpZ2h0SGludCwgY29sdW1uKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgZGVmYXVsdFRleHQsCi0JCQlpbnQgd2lkdGhIaW50LCBpbnQgY29sdW1uKSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uOwotCQlnZC53aWR0aEhpbnQgPSB3aWR0aEhpbnQ7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgZGVmYXVsdFRleHQsCi0JCQlpbnQgd2lkdGhIaW50KSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLndpZHRoSGludCA9IHdpZHRoSGludDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wgdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgZGVmYXVsdFRleHQpIHsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdGV4dC5zZXRUZXh0KGRlZmF1bHRUZXh0KTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIGNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQsICIiLCBTV1QuREVGQVVMVCwgY29sdW1uKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZW1wdHkgZWRpdGFibGUgdGV4dCBjb250cm9sIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uCi0JICogY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSByZWFkb25seSBtdWx0aS1saW5lIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlTXVsdGlMaW5lVGV4dChDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGRlZmF1bHRUZXh0LCBpbnQgd2lkdGhIaW50LCBpbnQgaGVpZ2h0SGludCwgaW50IGNvbHVtbikgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uOwotCQlnZC53aWR0aEhpbnQgPSB3aWR0aEhpbnQ7Ci0JCWdkLmhlaWdodEhpbnQgPSBoZWlnaHRIaW50OwotCQl0ZXh0LnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGNvbWJvYm94LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q29tYm88L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlQ29tYm9ib3goQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbikgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbjsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGNvbWJvYm94IHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q29tYm88L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlQ29tYm9ib3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlQ29tYm9ib3gocGFyZW50LCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgYnV0dG9uLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEByZXR1cm4gYSA8Y29kZT5CdXR0b248L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FKTsKLQkJYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNoZWNrYm94LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsCi0JCQlpbnQgY29sdW1uKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNoZWNrYm94IHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIGNyZWF0ZUNoZWNrYm94KHBhcmVudCwgdGV4dCwgMSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiByYWRpbyBidXR0b24uCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcGFyYW0gc2VsZWN0ZWQKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBzZWxlY3QgdGhlIHJhZGlvIGJ1dHRvbiBieSBkZWZhdWx0Ci0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsCi0JCQlpbnQgY29sdW1uLCBib29sZWFuIHNlbGVjdGVkKSB7Ci0JCUJ1dHRvbiByYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotCQlyYWRpb0J1dHRvbi5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbjsKLQkJcmFkaW9CdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihzZWxlY3RlZCk7Ci0JCXJldHVybiByYWRpb0J1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIHJhZGlvIGJ1dHRvbiB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEByZXR1cm4gYSA8Y29kZT5CdXR0b248L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBjcmVhdGVSYWRpb0J1dHRvbihwYXJlbnQsIHRleHQsIDEsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZG9ubHkgdGV4dCB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0Vmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRleHRWaWV3ZXIgY3JlYXRlVGV4dFZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGhIaW50LAotCQkJaW50IGhlaWdodEhpbnQsIGludCBjb2x1bW4pIHsKLQkJVGV4dFZpZXdlciB0ZXh0Vmlld2VyID0gbmV3IFRleHRWaWV3ZXIocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQkJU3R5bGVkVGV4dCB0ZXh0V2lkZ2V0ID0gdGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyB8IEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uOwotCQlnZC5oZWlnaHRIaW50ID0gaGVpZ2h0SGludDsKLQkJZ2Qud2lkdGhIaW50ID0gd2lkdGhIaW50OwotCQl0ZXh0V2lkZ2V0LnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gdGV4dFZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZG9ubHkgdGV4dCB2aWV3ZXIgdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0Vmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRleHRWaWV3ZXIgY3JlYXRlVGV4dFZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVUZXh0Vmlld2VyKHBhcmVudCwgU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRhYmxlIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGhlaWdodEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgaGVpZ2h0IChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRhYmxlVmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRhYmxlVmlld2VyIGNyZWF0ZVRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgd2lkdGhIaW50LCBpbnQgaGVpZ2h0SGludCwgaW50IGNvbHVtbikgewotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcgfCBHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbjsKLQkJZ2Qud2lkdGhIaW50ID0gd2lkdGhIaW50OwotCQlnZC5oZWlnaHRIaW50ID0gaGVpZ2h0SGludDsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCVRhYmxlVmlld2VyIHRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJcmV0dXJuIHRhYmxlVmlld2VyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjaGVja2JveCB0YWJsZSB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5DaGVja2JveFRhYmxlVmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENoZWNrYm94VGFibGVWaWV3ZXIgY3JlYXRlQ2hlY2tib3hUYWJsZVZpZXdlcigKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCUNoZWNrYm94VGFibGVWaWV3ZXIgY2hlY2tib3hUYWJsZVZpZXdlciA9IENoZWNrYm94VGFibGVWaWV3ZXIKLQkJCQkubmV3Q2hlY2tMaXN0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GSUxMIHwgU1dULkhPUklaT05UQUwpOwotCQlUYWJsZSB0YWJsZSA9IGNoZWNrYm94VGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW47Ci0JCWdkLndpZHRoSGludCA9IHdpZHRoSGludDsKLQkJZ2QuaGVpZ2h0SGludCA9IGhlaWdodEhpbnQ7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gY2hlY2tib3hUYWJsZVZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGxpbmUgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkxhYmVsPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUxpbmUoQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbikgewotCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMCi0JCQkJfCBTV1QuQk9MRCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uOwotCQlsaW5lLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gbGluZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIHRleHQgY29udHJvbCBoYXMgc29tZSB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sCi0JICogICAgICAgICAgICB0aGUgdGV4dCBjb250cm9sCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdGV4dCBjb250cm9sIGhhcyBzb21lIHRleHQsCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTm9uRW1wdHlUZXh0KFRleHQgY29udHJvbCkgewotCQlTdHJpbmcgdGV4dCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQlyZXR1cm4gdGV4dCAhPSBudWxsICYmIHRleHQudHJpbSgpLmxlbmd0aCgpID4gMDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvQmFzZVdpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvd2l6YXJkcy9CYXNlV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNGUzYzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvd2l6YXJkcy9CYXNlV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLkVQRlVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIGV4dGVuc2libGUgRVBGIHdpemFyZHMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIAotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVdpemFyZCBleHRlbmRzIFdpemFyZCB7Ci0KLQkvLyBUaGUgY3VycmVudCB3b3JrYmVuY2guCi0JcHJvdGVjdGVkIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCi0JLy8gVGhlIGN1cnJlbnQgb2JqZWN0IHNlbGVjdGlvbi4KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0JLy8gQW4gZXh0ZW5kZXIgb2YgdGhpcyB3aXphcmQuCi0JcHJvdGVjdGVkIElXaXphcmRFeHRlbmRlciB3aXphcmRFeHRlbmRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEJhc2VXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0KLQkJcHJvY2Vzc1dpemFyZEV4dGVuZGVyRXh0ZW5zaW9uUG9pbnQoKTsKLQotCQlpbml0aWFsaXplRXh0ZW5kZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRXh0ZW5kZXIoKSB7Ci0JCWlmICh3aXphcmRFeHRlbmRlciAhPSBudWxsKSB7Ci0JCQl3aXphcmRFeHRlbmRlci5pbml0KHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgd2l6YXJkIGV4dGVuZGVyIHNwZWNpZmljIGV4dGVuc2lvbiBwb2ludCBJRC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB3aXphcmQgZXh0ZW5kZXIgc3BlY2lmaWMgZXh0ZW5zaW9uIHBvaW50IElECi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRXaXphcmRFeHRlbmRlckV4dGVuc2lvblBvaW50SWQoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGV4dGVuZGVyIG9mIHRoaXMgd2l6YXJkLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5JV2l6YXJkRXh0ZW5kZXI8L2NvZGU+IG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqICAgICAgICAgdGhlcmUgaXMgbm8gZXh0ZW5kZXIKLQkgKi8KLQlwdWJsaWMgSVdpemFyZEV4dGVuZGVyIGdldFdpemFyZEV4dGVuZGVyKCkgewotCQlyZXR1cm4gd2l6YXJkRXh0ZW5kZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2dldE5leHRQYWdlKElXaXphcmRQYWdlKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCUlXaXphcmRQYWdlIG5leHRQYWdlID0gbnVsbDsKLQkJaWYgKHdpemFyZEV4dGVuZGVyICE9IG51bGwpIHsKLQkJCW5leHRQYWdlID0gd2l6YXJkRXh0ZW5kZXIuZ2V0TmV4dFBhZ2UocGFnZSk7Ci0JCX0KLQkJaWYgKG5leHRQYWdlID09IG51bGwpIHsKLQkJCW5leHRQYWdlID0gc3VwZXIuZ2V0TmV4dFBhZ2UocGFnZSk7Ci0JCX0KLQkJcmV0dXJuIG5leHRQYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCWlmICh3aXphcmRFeHRlbmRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gd2l6YXJkRXh0ZW5kZXIuY2FuRmluaXNoKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNhbkZpbmlzaCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlpZiAod2l6YXJkRXh0ZW5kZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHdpemFyZEV4dGVuZGVyLmRvRmluaXNoKCk7Ci0JCX0KLQkJcmV0dXJuIGRvRmluaXNoKCk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGZpbmlzaCBvcGVyYXRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmluaXNoIG9wZXJhdGlvbiBpcyBleGVjdXRlZAotCSAqICAgICAgICAgc3VjY2Vzc2Z1bGx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZG9GaW5pc2goKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIGFsbG93IG92ZXJyaWRlIHRoZSBleHRlbmRlci4gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgdG8gcmV0dXJuIHRoZQotCSAqIGRlZmF1bHRFeHRlbmRlcgotCSAqIAotCSAqIEBwYXJhbSBkZWZhdWx0RXh0ZW5kZXIKLQkgKiBAcmV0dXJuIElXaXphcmRFeHRlbmRlcgotCSAqLwotCXByb3RlY3RlZCBJV2l6YXJkRXh0ZW5kZXIgY3JlYXRlV2l6YXJkRXh0ZW5kZXIoCi0JCQlJV2l6YXJkRXh0ZW5kZXIgZGVmYXVsdEV4dGVuZGVyKSB7Ci0JCXJldHVybiBkZWZhdWx0RXh0ZW5kZXI7Ci0JfQotCi0JLyoqCi0JICogUHJvY2Vzc2VzIHRoZSB3aXphcmQgZXh0ZW5kZXIgc3BjaWZpYyBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1dpemFyZEV4dGVuZGVyRXh0ZW5zaW9uUG9pbnQoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0KLQkJU3RyaW5nIGV4dGVuc2lvblBvaW50SWQgPSBnZXRXaXphcmRFeHRlbmRlckV4dGVuc2lvblBvaW50SWQoKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50SWQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkKLQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoZXh0ZW5zaW9uUG9pbnRJZCk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQl0cnkgewotCQkJCQlJV2l6YXJkRXh0ZW5kZXIgZXh0ZW5kZXIgPSAoSVdpemFyZEV4dGVuZGVyKSBjb25maWdFbGVtZW50Ci0JCQkJCQkJLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKHdpemFyZEV4dGVuZGVyID09IG51bGwpIHsKLQkJCQkJCXdpemFyZEV4dGVuZGVyID0gY3JlYXRlV2l6YXJkRXh0ZW5kZXIoZXh0ZW5kZXIpOwotCi0JCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZENvbmZpZ0VsZW1lbnRzID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkuZ2V0Q2hpbGRyZW4oIndpemFyZFBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBjaGlsZENvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNoaWxkQ29uZmlnRWxlbWVudCA9IGNoaWxkQ29uZmlnRWxlbWVudHNba107Ci0JCQkJCQkJSVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IChJV2l6YXJkUGFnZSkgY2hpbGRDb25maWdFbGVtZW50Ci0JCQkJCQkJCQkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyB0eXBlID0gY2hpbGRDb25maWdFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJ0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgdGFyZ2V0ID0gY2hpbGRDb25maWdFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJ0YXJnZXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBpbnNlcnQgPSBjaGlsZENvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoImluc2VydCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKHdpemFyZFBhZ2UgIT0gbnVsbCAmJiB0eXBlICE9IG51bGwKLQkJCQkJCQkJCSYmIHR5cGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCWlmICh0eXBlLmVxdWFscygicmVwbGFjZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCXdpemFyZEV4dGVuZGVyCi0JCQkJCQkJCQkJCS5hZGRSZXBsYWNlV2l6YXJkUGFnZUNvbnRyaWJ1dGlvbihuZXcgUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb24oCi0JCQkJCQkJCQkJCQkJd2l6YXJkUGFnZSwgdGFyZ2V0KSk7Ci0JCQkJCQkJCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoIm5ldyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCWJvb2xlYW4gaW5zZXJ0QWZ0ZXIgPSB0cnVlOwotCQkJCQkJCQkJaWYgKGluc2VydCAhPSBudWxsCi0JCQkJCQkJCQkJCSYmIGluc2VydC5lcXVhbHMoImJlZm9yZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQlpbnNlcnRBZnRlciA9IGZhbHNlOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJd2l6YXJkRXh0ZW5kZXIKLQkJCQkJCQkJCQkJLmFkZE5ld1dpemFyZFBhZ2VDb250cmlidXRpb24obmV3IE5ld1dpemFyZFBhZ2VDb250cmlidXRpb24oCi0JCQkJCQkJCQkJCQkJd2l6YXJkUGFnZSwgdGFyZ2V0LAotCQkJCQkJCQkJCQkJCWluc2VydEFmdGVyKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUVQRlVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0aGUgbmV3IHdpemFyZCBwYWdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBnZXROZXdXaXphcmRQYWdlcyhMaXN0PElXaXphcmRQYWdlPiB3aXphcmRQYWdlcykgewotCQlMaXN0PElOZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uPiBjb250cmlidXRpb25zID0gd2l6YXJkRXh0ZW5kZXIKLQkJCQkuZ2V0TmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbnMoKTsKLQkJaWYgKGNvbnRyaWJ1dGlvbnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvcjxJTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbj4gaXQgPSBjb250cmlidXRpb25zCi0JCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbiBjb250cmlidXRpb24gPSAoTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbikgaXQKLQkJCQkJCS5uZXh0KCk7Ci0JCQkJSVdpemFyZFBhZ2UgbmV3V2l6YXJkUGFnZSA9IChJV2l6YXJkUGFnZSkgY29udHJpYnV0aW9uCi0JCQkJCQkuZ2V0V2l6YXJkUGFnZSgpOwotCQkJCVN0cmluZyB0YXJnZXRXaXphcmRQYWdlTmFtZSA9IGNvbnRyaWJ1dGlvbgotCQkJCQkJLmdldFRhcmdldFdpemFyZFBhZ2UoKTsKLQkJCQlpZiAodGFyZ2V0V2l6YXJkUGFnZU5hbWUgIT0gbnVsbCkgewotCQkJCQlpbnQgdG90YWxQYWdlcyA9IHdpemFyZFBhZ2VzLnNpemUoKTsKLQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJZm9yIChJdGVyYXRvcjxJV2l6YXJkUGFnZT4gaXRlciA9IHdpemFyZFBhZ2VzLml0ZXJhdG9yKCk7IHdpemFyZFBhZ2VzCi0JCQkJCQkJLnNpemUoKSA9PSB0b3RhbFBhZ2VzCi0JCQkJCQkJJiYgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlJV2l6YXJkUGFnZSBwYWdlID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAocGFnZS5nZXROYW1lKCkuZXF1YWxzKHRhcmdldFdpemFyZFBhZ2VOYW1lKSkgewotCQkJCQkJCWlmIChjb250cmlidXRpb24uZ2V0SW5zZXJ0QWZ0ZXIoKSkgewotCQkJCQkJCQl3aXphcmRQYWdlcy5hZGQoaW5kZXggKyAxLCBuZXdXaXphcmRQYWdlKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQl3aXphcmRQYWdlcy5hZGQoaW5kZXgsIG5ld1dpemFyZFBhZ2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWluZGV4Kys7Ci0JCQkJCX0KLQkJCQkJaWYgKHdpemFyZFBhZ2VzLnNpemUoKSA9PSB0b3RhbFBhZ2VzKSB7Ci0JCQkJCQl3aXphcmRQYWdlcy5hZGQobmV3V2l6YXJkUGFnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvQmFzZVdpemFyZFBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvQmFzZVdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FlY2VkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL0Jhc2VXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIEVQRiB3aXphcmQgcGFnZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSB3aXphcmQgcGFnZSBuYW1lCi0JICovCi0JcHJvdGVjdGVkIEJhc2VXaXphcmRQYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIHdpemFyZCBwYWdlIG5hbWUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSB3aXphcmQgcGFnZSB0aXRsZQotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgdGhlIHdpemFyZCBwYWdlIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIHRpdGxlSW1hZ2UKLQkgKiAgICAgICAgICAgIHRoZSB3aXphcmQgcGFnZSB0aXRsZSBpbWFnZQotCSAqLwotCXB1YmxpYyBCYXNlV2l6YXJkUGFnZShTdHJpbmcgcGFnZU5hbWUsIFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uLAotCQkJSW1hZ2VEZXNjcmlwdG9yIHRpdGxlSW1hZ2UpIHsKLQkJc3VwZXIocGFnZU5hbWUsIHRpdGxlLCB0aXRsZUltYWdlKTsKLQkJc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCW9uRW50ZXJQYWdlKG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBDYWxsZWQgd2hlbiBlbnRlcmluZyB0aGlzIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIGEgZGF0YSBpbml0aWFsaXphdGlvbiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlJV2l6YXJkUGFnZSBuZXh0UGFnZSA9IHN1cGVyLmdldE5leHRQYWdlKCk7Ci0JCWlmIChuZXh0UGFnZSAhPSBudWxsICYmIG5leHRQYWdlIGluc3RhbmNlb2YgQmFzZVdpemFyZFBhZ2UpIHsKLQkJCXRyeSB7Ci0JCQkJKChCYXNlV2l6YXJkUGFnZSkgbmV4dFBhZ2UpLm9uRW50ZXJQYWdlKGdldE5leHRQYWdlRGF0YSgpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5leHRQYWdlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRhdGEgaW5pdGlhbGl6YXRpb24gb2JqZWN0IGZvciB0aGUgbmV4dCB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIDxjb2RlPk9iamVjdDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE5leHRQYWdlRGF0YSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbXBvc2l0ZSB3aXRoIGEgZ3JpZCBsYXlvdXQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb21wb3NpdGUgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21wb3NpdGUgY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY2hpbGQgY29tcG9zaXRlIHdpdGggYSBncmlkIGxheW91dC4KLQkgKiA8cD4KLQkgKiBUaGUgY2hpbGQgY29tcG9zaXRlIHdpbGwgYmUgaW5kZW50ZWQgZnJvbSB0aGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbXBvc2l0ZSB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDaGlsZEdyaWRMYXlvdXRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlQ2hpbGRHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZ3JvdXAgd2l0aCBhIGdyaWQgbGF5b3V0LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgZ3JvdXAKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBncm91cCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+R3JvdXA8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgR3JvdXAgY3JlYXRlR3JpZExheW91dEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LAotCQkJaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVHcmlkTGF5b3V0R3JvdXAocGFyZW50LCB0ZXh0LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBncm91cCB3aXRoIGEgZ3JpZCBsYXlvdXQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBncm91cAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGdyb3VwIHdpbGwgdGFrZSB1cAotCSAqIEBwYXJhbSBlcXVhbENvbHVtbldpZHRoCi0JICogICAgICAgICAgICBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgY29sdW1uIGNlbGxzIHNob3VsZCBiZSBzYW1lIHdpZHRoIG9yCi0JICogICAgICAgICAgICBub3QKLQkgKiBAcmV0dXJuIGEgPGNvZGU+R3JvdXA8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgR3JvdXAgY3JlYXRlR3JpZExheW91dEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LAotCQkJaW50IGNvbHVtbiwgYm9vbGVhbiBlcXVhbENvbHVtbldpZHRoKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUdyaWRMYXlvdXRHcm91cChwYXJlbnQsIHRleHQsIGNvbHVtbiwKLQkJCQllcXVhbENvbHVtbldpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGxhYmVsIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5MYWJlbDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVMYWJlbChwYXJlbnQsIHRleHQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbAotCSAqIEByZXR1cm4gYSA8Y29kZT5MYWJlbDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVMYWJlbChwYXJlbnQsIHRleHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB2ZXJ0aWNhbGx5IGFsaWduZWQgbGFiZWwgdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGxhYmVsCi0JICogQHJldHVybiBhIDxjb2RlPkxhYmVsPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExhYmVsIGNyZWF0ZVZlcnRpY2FsbHlBbGlnbmVkTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZVZlcnRpY2FsbHlBbGlnbmVkTGFiZWwocGFyZW50LCB0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVkaXRhYmxlIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgZGVmYXVsdFRleHQsIGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQsIGRlZmF1bHRUZXh0LCB3aWR0aEhpbnQsCi0JCQkJaGVpZ2h0SGludCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVkaXRhYmxlIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGhlaWdodEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgaGVpZ2h0IChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHdpZHRoSGludCwKLQkJCWludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsCi0JCQkJLmNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQsIHdpZHRoSGludCwgaGVpZ2h0SGludCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZG9ubHkgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGRlZmF1bHRUZXh0LAotCQkJaW50IHdpZHRoSGludCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVUZXh0KHBhcmVudCwgZGVmYXVsdFRleHQsIHdpZHRoSGludCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIHJlYWRvbmx5IHRleHQgY29udHJvbCB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgZGVmYXVsdFRleHQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlVGV4dChwYXJlbnQsIGRlZmF1bHRUZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVkaXRhYmxlIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBkZWZhdWx0VGV4dCwgaW50IHdpZHRoSGludCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVFZGl0YWJsZVRleHQocGFyZW50LCBkZWZhdWx0VGV4dCwgd2lkdGhIaW50LAotCQkJCWNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgZGVmYXVsdFRleHQsIGludCB3aWR0aEhpbnQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlRWRpdGFibGVUZXh0KHBhcmVudCwgZGVmYXVsdFRleHQsIHdpZHRoSGludCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlRWRpdGFibGVUZXh0KHBhcmVudCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVkaXRhYmxlIHRleHQgY29udHJvbCB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgZGVmYXVsdFRleHQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlRWRpdGFibGVUZXh0KHBhcmVudCwgZGVmYXVsdFRleHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZW1wdHkgZWRpdGFibGUgdGV4dCBjb250cm9sIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uCi0JICogY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSByZWFkb25seSBtdWx0aS1saW5lIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlTXVsdGlMaW5lVGV4dChDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGRlZmF1bHRUZXh0LCBpbnQgd2lkdGhIaW50LCBpbnQgaGVpZ2h0SGludCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVNdWx0aUxpbmVUZXh0KHBhcmVudCwgZGVmYXVsdFRleHQsIHdpZHRoSGludCwKLQkJCQloZWlnaHRIaW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gY29tYm9ib3guCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5Db21ibzwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21ibyBjcmVhdGVDb21ib2JveChDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUNvbWJvYm94KHBhcmVudCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGNvbWJvYm94IHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIGEgPGNvZGU+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+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFmN2JlNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkbzt2aXNpYmlsaXR5Oj1yZWV4cG9ydAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLAotIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbCwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2Q5ODQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0ZjRjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBVTUEgRWNvcmUgRXh0ZW5zaW9uCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9JTW9kZWxPYmplY3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvSU1vZGVsT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYzgyZTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9JTW9kZWxPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5FRGF0YU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSBzdXBwb3J0ZWQgYnkgYWxsIFVNQSBtb2RlbCBvYmplY3RzLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBkeW5hbWljIGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyBzdXBwb3J0IGJldHdlZW4KLSAqIG1vZGVsIG9iamVjdHMgdGhyb3VnaCB0aGUgdXNlIG9mIG9wcG9zaXRlIGZlYXR1cmVzLiBJdCBhbHNvIGFsbG93cyB0aGUKLSAqIGRlZmF1bHQgdmFsdWUgb2YgYSBmZWF0dXJlLCBhcyBkZWZpbmVkIGluIGEgbWV0YWwgbW9kZWwsIHRvIGJlIG92ZXJ3cml0dGVuLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbE9iamVjdCBleHRlbmRzIEVEYXRhT2JqZWN0IHsKLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYSBmZWF0dXJlLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGEgd2F5IHRvIHF1ZXJ5IHRoZSBvdmVycmlkZW4gZGVmYXVsdCB2YWx1ZSBkZWZpbmVkIGluIHRoZQotCSAqIG1ldGEtbW9kZWwgZm9yIGEgVU1BIGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBhIGZlYXR1cmUKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhbiBvcHBvc2l0ZSBmZWF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBhbiBvcHBvc2l0ZSBmZWF0dXJlCi0JICogQHJldHVybiB0aGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgb3Bwb3NpdGUgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUpOwotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIG9wcG9zaXRlIGZlYXR1cmVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1vZGVsIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBvcHBvc2l0ZSBmZWF0dXJlcwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE9wcG9zaXRlRmVhdHVyZXMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9JUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYjA3ZjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9JUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmU7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBwcm94eSByZXNvbHV0aW9uIGxpc3RlbmVyIGF0dGFjaGVkIHRvIGEgVU1BIHJlc291cmNlIHNldC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIgewotCi0JLyoqCi0JICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIG9mIGFuIGV4Y2VwdGlvbiB0aGF0IGhhcyBvY2N1cnJlZCB3aGlsZSByZXNvbHZpbmcgYQotCSAqIHByb3h5IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbiB0aGF0IGhhcyBvY2N1cnJlZAotCSAqLwotCXZvaWQgbm90aWZ5RXhjZXB0aW9uKEV4Y2VwdGlvbiBlKTsKLQotCS8qKgotCSAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiB0aGF0IGEgcHJveHkgaGFzIGJlZW4gcmVzb2x2ZWQgc3VjY2Vzc2Z1bGx5LgotCSAqIAotCSAqIEBwYXJhbSBwcm94eQotCSAqICAgICAgICAgICAgYSBwcm94eSBvYmplY3QKLQkgKiBAcGFyYW0gcmVzb2x2ZWQKLQkgKiAgICAgICAgICAgIHRoZSByZXNvbHZlZCBvYmplY3QKLQkgKi8KLQl2b2lkIHByb3h5UmVzb2x2ZWQoT2JqZWN0IHByb3h5LCBPYmplY3QgcmVzb2x2ZWQpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL0lVbWFSZXNvdXJjZVNldC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9JVW1hUmVzb3VyY2VTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcwNzVhMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL0lVbWFSZXNvdXJjZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgVU1BIHJlc291cmNlIHNldC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVW1hUmVzb3VyY2VTZXQgZXh0ZW5kcyBSZXNvdXJjZVNldCB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtb2RlbCBvYmplY3QgcmVzb2x2ZWQgYnkgYSBVUkkuCi0JICogCi0JICogQHBhcmFtIHJlc29sdmVyCi0JICogICAgICAgICAgICB0aGUgcHJveHkgcmVzb2x2ZXIKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICB0aGUgVVJJIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJveHkKLQkgKiBAcGFyYW0gbG9hZE9uRGVtYW5kCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgY3JlYXRlIGFuZCBsb2FkIHRoZSByZXNvdXJjZSBpZiBpdAotCSAqICAgICAgICAgICAgZG9lcyBub3QgZXhpc3RzCi0JICogQHJldHVybiB0aGUgbW9kZWwgb2JqZWN0IHJlc29sdmVkIGJ5IHRoZSBVUkkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCNnZXRFT2JqZWN0KEVPYmplY3QsIFVSSSwgYm9vbGVhbikKLQkgKi8KLQlFT2JqZWN0IGdldEVPYmplY3QoRU9iamVjdCByZXNvbHZlciwgVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL1Jlc29sdmVFeGNlcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvUmVzb2x2ZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTA5YmUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvUmVzb2x2ZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IGFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSByZXNvbHZpbmcgYSBwcm94eSBvYmplY3QuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvbHZlRXhjZXB0aW9uIGV4dGVuZHMgV3JhcHBlZEV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU4NDEyODE1ODE0NjM2MDgxTDsKLQotCXByaXZhdGUgRU9iamVjdCBwcm94eTsKLQotCXByaXZhdGUgRU9iamVjdCByZXNvbHZlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHByb3h5Ci0JICogICAgICAgICAgICBhIHByb3h5IG9iamVjdAotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIGFuIGVycm9yIG1lc3NhZ2UKLQkgKiBAcGFyYW0gcmVzb2x2ZXIKLQkgKiAgICAgICAgICAgIHRoZSBwcm94eSByZXNvbHZlcgotCSAqLwotCXB1YmxpYyBSZXNvbHZlRXhjZXB0aW9uKEVPYmplY3QgcHJveHksIFN0cmluZyBtc2csIEVPYmplY3QgcmVzb2x2ZXIpIHsKLQkJc3VwZXIobXNnLCBudWxsKTsKLQkJdGhpcy5wcm94eSA9IHByb3h5OwotCQl0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJveHkKLQkgKiAgICAgICAgICAgIGEgcHJveHkgb2JqZWN0Ci0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbiB0aGF0IHdhcyB0aHJvd24KLQkgKi8KLQlwdWJsaWMgUmVzb2x2ZUV4Y2VwdGlvbihFT2JqZWN0IHByb3h5LCBFeGNlcHRpb24gZXhjZXB0aW9uLCBFT2JqZWN0IHJlc29sdmVyKSB7Ci0JCXN1cGVyKGV4Y2VwdGlvbik7Ci0JCXRoaXMucHJveHkgPSBwcm94eTsKLQkJdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb3h5IG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm94eSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRQcm94eSgpIHsKLQkJcmV0dXJuIHByb3h5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb3h5IHJlc29sdmVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb3h5IHJlc29sdmVyCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0UmVzb2x2ZXIoKSB7Ci0JCXJldHVybiByZXNvbHZlcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJlc29sdmVFeGNlcHRpb24pIHsKLQkJCVJlc29sdmVFeGNlcHRpb24gcmUgPSAoUmVzb2x2ZUV4Y2VwdGlvbikgb2JqOwotCQkJaWYgKChyZXNvbHZlciA9PSByZS5yZXNvbHZlcikgfHwgKHJlc29sdmVyID09IG51bGwgJiYgcmUucmVzb2x2ZXIgPT0gbnVsbCkpIHsKLQkJCQlpZiAocHJveHkgPT0gcmUucHJveHkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWlmIChwcm94eSBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkgewotCQkJCQlVUkkgdXJpID0gKChJbnRlcm5hbEVPYmplY3QpIHByb3h5KS5lUHJveHlVUkkoKTsKLQkJCQkJaWYgKHVyaSAhPSBudWxsICYmIHJlLnByb3h5IGluc3RhbmNlb2YgSW50ZXJuYWxFT2JqZWN0KSB7Ci0JCQkJCQlyZXR1cm4gdXJpLmVxdWFscygoKEludGVybmFsRU9iamVjdCkgcmUucHJveHkpCi0JCQkJCQkJCS5lUHJveHlVUkkoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpZiAocHJveHkgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpIHsKLQkJCWludCBoYyA9IHJlc29sdmVyID09IG51bGwgPyAwIDogcmVzb2x2ZXIuaGFzaENvZGUoKTsKLQkJCVVSSSB1cmkgPSAoKEludGVybmFsRU9iamVjdCkgcHJveHkpLmVQcm94eVVSSSgpOwotCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIChJbnRlZ2VyLnRvU3RyaW5nKGhjKSArIHVyaSkuaGFzaENvZGUoKTsKLQkJCX0KLQkJCXJldHVybiBoYzsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvaW1wbC9NdWx0aVJlc291cmNlRU9iamVjdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9pbXBsL011bHRpUmVzb3VyY2VFT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2N2Y4M2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9pbXBsL011bHRpUmVzb3VyY2VFT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5JbnRlcm5hbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmltcGwuRURhdGFPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSU1vZGVsT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSVVtYVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuUmVzb2x2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuRGVmYXVsdFZhbHVlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmVSZXNvbHZpbmdFTGlzdDsKLQotLyoqCi0gKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIFVNQSBtb2RlbCBvYmplY3RzLgotICogPHA+Ci0gKiBCeSBkZWZhdWx0LCBFTUYgc3RvcmVzIG1vZGVsIG9iamVjdHMgcmVsYXRlZCB2aWEgYSBjb250YWlubWVudCByZWxhdGlvbnNoaXAKLSAqIGluIGEgc2luZ2xlIFhNSSBmaWxlLiBUaGlzIGNsYXNzIGV4dGVuZHMgdGhlIGRlZmF1bHQgRU1GIHBlcnNpc3RlbmNlIGJlaGF2aW9yCi0gKiBieSBwcm92aWRpbmcgYSBtZWNoYW5pc20gZm9yIHRoZSBjb250YWluaW5nIGFuZCBjb250YWluZWQgb2JqZWN0cyB0byBiZQotICogc3RvcmVkIGluIHNlcGFyYXRlIFhNSSBmaWxlcy4gQ29udGFpbmVkIG9iamVjdHMgYXJlIGxhenkgbG9hZGVkLCB3aGVuCi0gKiByZXF1aXJlZCwgc2ltaWxhciB0byB0aGUgcHJveHkgb2JqZWN0IGJlaGF2aW9yIG9mIEVNRidzIHN0YW5kYXJkIHJlc291cmNlCi0gKiBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE11bHRpUmVzb3VyY2VFT2JqZWN0IGV4dGVuZHMgRURhdGFPYmplY3RJbXBsIGltcGxlbWVudHMKLQkJSU1vZGVsT2JqZWN0IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTgxMjY5NDcxNTMwOTcyNzNMOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlZmF1bHRWYWx1ZU1hbmFnZXIgZGVmYXVsdFZhbHVlTWFuYWdlciA9IERlZmF1bHRWYWx1ZU1hbmFnZXIuSU5TVEFOQ0U7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYSBmZWF0dXJlLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIGZvciBtaWdyYXRpb24gdXNlIG9ubHkuIERvIG5vdCBjYWxsIHRoaXMKLQkgKiBtZXRob2QgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYSBmZWF0dXJlIHNpbmNlIGl0IHdpbGwgc2xvdyBkb3duCi0JICogdGhlIGxvYWRpbmcgb2YgYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgYSBmZWF0dXJlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBmZWF0dXJlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNldERlZmF1bHRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCBkZWZhdWx0VmFsdWUpIHsJCQotCQlzZXREZWZhdWx0VmFsdWUoZmVhdHVyZS5nZXRFQ29udGFpbmluZ0NsYXNzKCksIGZlYXR1cmUsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgc3luY2hyb25pemVkIHZvaWQgc2V0RGVmYXVsdFZhbHVlKEVDbGFzcyB0eXBlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IGRlZmF1bHRWYWx1ZSkgewotCQlkZWZhdWx0VmFsdWVNYW5hZ2VyLnNldERlZmF1bHRWYWx1ZSh0eXBlLCBmZWF0dXJlLCBkZWZhdWx0VmFsdWUpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhIGZlYXR1cmUuCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZGVzaWduZWQgZm9yIG1pZ3JhdGlvbiB1c2Ugb25seS4gRG8gbm90IGNhbGwgdGhpcwotCSAqIG1ldGhvZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIGZlYXR1cmUgc2luY2UgaXQgd2lsbCBzbG93IGRvd24KLQkgKiB0aGUgbG9hZGluZyBvZiBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBhIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcmVtb3ZlRGVmYXVsdFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWRlZmF1bHRWYWx1ZU1hbmFnZXIucmVtb3ZlRGVmYXVsdFZhbHVlKGZlYXR1cmUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcmVtb3ZlRGVmYXVsdFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFQ2xhc3MgdHlwZSkgewotCQlkZWZhdWx0VmFsdWVNYW5hZ2VyLnJlbW92ZURlZmF1bHRWYWx1ZShmZWF0dXJlLCB0eXBlKTsKLQl9Ci0JCi0JLyoqCi0JICogQSBtYXAgb2YgZW50cmllcyBvZiBPcHBvc2l0ZUZlYXR1cmUgLyBPcHBvc2l0ZUZlYXR1cmUncyB2YWx1ZQotCSAqLwotCXByaXZhdGUgTWFwIG9wcG9zaXRlRmVhdHVyZU1hcDsKLQotCXByaXZhdGUgYm9vbGVhbiBoYXNPcHBvc2l0ZUZlYXR1cmUgPSB0cnVlOwotCi0JcHJpdmF0ZSBCb29sZWFuIG5vdGlmeU9wcG9zaXRlID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiB2YWxpZCA9IHRydWU7Ci0KLQkvKioKLQkgKiBDaGVja3MgdGhlIHZhbGlkaXR5IG9mIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBvYmplY3QgaXMgdmFsaWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gdmFsaWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgb3Bwb3NpdGVBZGQoT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSwgT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IGxpc3QgPSAoTGlzdCkgZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZ2V0KG9wcG9zaXRlRmVhdHVyZSk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCWxpc3QgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlUmVzb2x2aW5nRUxpc3QodGhpcywgb3Bwb3NpdGVGZWF0dXJlKTsKLQkJCWdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dChvcHBvc2l0ZUZlYXR1cmUsIGxpc3QpOwotCQl9Ci0JCWlmICghbGlzdC5jb250YWlucyhvYmplY3QpKSB7Ci0JCQlsaXN0LmFkZChvYmplY3QpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgb3Bwb3NpdGVSZW1vdmUoT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSwgT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IGxpc3QgPSAoTGlzdCkgZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZ2V0KG9wcG9zaXRlRmVhdHVyZSk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCWxpc3QgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlUmVzb2x2aW5nRUxpc3QodGhpcywgb3Bwb3NpdGVGZWF0dXJlKTsKLQkJCWdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dChvcHBvc2l0ZUZlYXR1cmUsIGxpc3QpOwotCQl9Ci0JCWxpc3QucmVtb3ZlKG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmVzb2x2ZXMgdGhlIGdpdmVuIHByb3h5IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICBhIHByb3h5IG9iamVjdCB0byByZXNvbHZlCi0JICogQHJldHVybiB0aGUgcmVzb2x2ZWQgb2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCByZXNvbHZlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdAotCQkJCSYmICgoSW50ZXJuYWxFT2JqZWN0KSBvYmplY3QpLmVJc1Byb3h5KCkpIHsKLQkJCXJldHVybiBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG9iamVjdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVwbGFjZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLAotCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWlmIChuZXdWYWx1ZSAhPSBudWxsICYmICFuZXdWYWx1ZS5lSXNQcm94eSgpICYmIG5ld1ZhbHVlICE9IG9sZFZhbHVlKSB7Ci0JCQlib29sZWFuIG5vdGlmeSA9IGVEZWxpdmVyKCk7Ci0JCQl0cnkgewotCQkJCWVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQlFY29yZVV0aWwucmVwbGFjZSh0aGlzLCBmZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aVJlc291cmNlRU9iamVjdC5yZXBsYWNlKCk6Iik7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIG9iamVjdDogIiArIHRoaXMpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICBmZWF0dXJlOiAiICsgZmVhdHVyZSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIHByb3h5OiAiICsgb2xkVmFsdWUpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICByZXNvbHZlZDogIiArIG5ld1ZhbHVlKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJZVNldERlbGl2ZXIobm90aWZ5KTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkJhc2ljTm90aWZpZXJJbXBsI2VOb3RpZnkob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVOb3RpZnkoTm90aWZpY2F0aW9uIG1zZykgewotCQkvKgotCQkgKiBpZighT3Bwb3NpdGVGZWF0dXJlLmlzRGVsaXZlck9uUmVzb2x2ZSgpICYmIG1zZy5nZXRFdmVudFR5cGUoKSA9PQotCQkgKiBOb3RpZmljYXRpb24uUkVTT0xWRSkgeyByZXR1cm47IH0KLQkJICovCi0KLQkJaWYgKG1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVTT0xWRSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlPYmplY3QgZiA9IG1zZy5nZXRGZWF0dXJlKCk7Ci0JCWlmIChmIGluc3RhbmNlb2YgRVN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGY7Ci0JCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gT3Bwb3NpdGVGZWF0dXJlCi0JCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmUoZmVhdHVyZSk7Ci0JCQlpZiAob3Bwb3NpdGVGZWF0dXJlICE9IG51bGwpIHsKLQkJCQlNdWx0aVJlc291cmNlRU9iamVjdCBvbGRPdGhlckVuZDsKLQkJCQlNdWx0aVJlc291cmNlRU9iamVjdCBvdGhlckVuZDsKLQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKLQkJCQkJCW9sZE90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUucmVzb2x2ZU93bmVyKCkpIHsKLQkJCQkJCQlvbGRPdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb2x2ZShvbGRPdGhlckVuZCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAob2xkT3RoZXJFbmQgIT0gbnVsbCkgewotCQkJCQkJCW9sZE90aGVyRW5kLm9wcG9zaXRlUmVtb3ZlKG9wcG9zaXRlRmVhdHVyZSwgbXNnCi0JCQkJCQkJCQkuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCQl9Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUucmVzb2x2ZU93bmVyKCkpIHsKLQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb2x2ZShvdGhlckVuZCk7Ci0JCQkJCQkJcmVwbGFjZShmZWF0dXJlLCBtc2cuZ2V0TmV3VmFsdWUoKSwgb3RoZXJFbmQpOwotCQkJCQkJfQotCQkJCQkJaWYgKG90aGVyRW5kICE9IG51bGwpIHsKLQkJCQkJCQlvdGhlckVuZC5vcHBvc2l0ZUFkZChvcHBvc2l0ZUZlYXR1cmUsIG1zZwotCQkJCQkJCQkJLmdldE5vdGlmaWVyKCkpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgb2JqOwotCQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUucmVzb2x2ZU93bmVyKCkpIHsKLQkJCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc29sdmUob3RoZXJFbmQpOwotCQkJCQkJCQlyZXBsYWNlKGZlYXR1cmUsIG9iaiwgb3RoZXJFbmQpOwotCQkJCQkJCX0KLQkJCQkJCQlvdGhlckVuZC5vcHBvc2l0ZUFkZChvcHBvc2l0ZUZlYXR1cmUsIG1zZwotCQkJCQkJCQkJLmdldE5vdGlmaWVyKCkpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUucmVzb2x2ZU93bmVyKCkpIHsKLQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb2x2ZShvdGhlckVuZCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAob3RoZXJFbmQgIT0gbnVsbCkKLQkJCQkJCQlvdGhlckVuZC5vcHBvc2l0ZVJlbW92ZShvcHBvc2l0ZUZlYXR1cmUsIG1zZwotCQkJCQkJCQkJLmdldE5vdGlmaWVyKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG90aGVyRW5kKTsKLQkJCQkJCQl9Ci0JCQkJCQkJb3RoZXJFbmQub3Bwb3NpdGVSZW1vdmUob3Bwb3NpdGVGZWF0dXJlLCBtc2cKLQkJCQkJCQkJCS5nZXROb3RpZmllcigpKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBvYmo7Ci0JCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb2x2ZShvdGhlckVuZCk7Ci0JCQkJCQkJCXJlcGxhY2UoZmVhdHVyZSwgb2JqLCBvdGhlckVuZCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChvdGhlckVuZCAhPSBudWxsKSB7Ci0JCQkJCQkJCUVPYmplY3Qgb2xkVmFsdWUgPSAoRU9iamVjdCkgb3RoZXJFbmQKLQkJCQkJCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZ2V0KAotCQkJCQkJCQkJCQkJb3Bwb3NpdGVGZWF0dXJlKTsKLQkJCQkJCQkJaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQkJCS8vIHJlbW92ZSBvdGhlckVuZCBmcm9tIHRhcmdldCBmZWF0dXJlIG9mCi0JCQkJCQkJCQkvLyBvbGRWYWx1ZQotCQkJCQkJCQkJKChDb2xsZWN0aW9uKSBvbGRWYWx1ZQotCQkJCQkJCQkJCQkuZUdldCgoRVN0cnVjdHVyYWxGZWF0dXJlKSBmKSkKLQkJCQkJCQkJCQkJLnJlbW92ZShvdGhlckVuZCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJb3RoZXJFbmQuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KAotCQkJCQkJCQkJCW9wcG9zaXRlRmVhdHVyZSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCkpCi0JCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb2x2ZShvdGhlckVuZCk7Ci0JCQkJCQkJfQotCQkJCQkJCW90aGVyRW5kLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dCgKLQkJCQkJCQkJCW9wcG9zaXRlRmVhdHVyZSwgbnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG90aGVyRW5kKTsKLQkJCQkJCQlyZXBsYWNlKGZlYXR1cmUsIG1zZy5nZXROZXdWYWx1ZSgpLCBvdGhlckVuZCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAob3RoZXJFbmQgIT0gbnVsbCkgewotCQkJCQkJCUVPYmplY3Qgb2xkVmFsdWUgPSAoRU9iamVjdCkgb3RoZXJFbmQKLQkJCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5nZXQoCi0JCQkJCQkJCQkJCW9wcG9zaXRlRmVhdHVyZSk7Ci0JCQkJCQkJaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQkJLy8gcmVtb3ZlIG90aGVyRW5kIGZyb20gdGFyZ2V0IGZlYXR1cmUgb2YKLQkJCQkJCQkJLy8gb2xkVmFsdWUKLQkJCQkJCQkJKChDb2xsZWN0aW9uKSBvbGRWYWx1ZQotCQkJCQkJCQkJCS5lR2V0KChFU3RydWN0dXJhbEZlYXR1cmUpIGYpKQotCQkJCQkJCQkJCS5yZW1vdmUob3RoZXJFbmQpOwotCQkJCQkJCX0KLQkJCQkJCQlvdGhlckVuZC5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5wdXQoCi0JCQkJCQkJCQlvcHBvc2l0ZUZlYXR1cmUsIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQ6Ci0JCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc29sdmUob3RoZXJFbmQpOwotCQkJCQkJCXJlcGxhY2UoZmVhdHVyZSwgbXNnLmdldE5ld1ZhbHVlKCksIG90aGVyRW5kKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChvdGhlckVuZCAhPSBudWxsKSB7Ci0JCQkJCQkJRU9iamVjdCBvbGRWYWx1ZSA9IChFT2JqZWN0KSBvdGhlckVuZAotCQkJCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmdldCgKLQkJCQkJCQkJCQkJb3Bwb3NpdGVGZWF0dXJlKTsKLQkJCQkJCQlpZiAob2xkVmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCQkvLyBzZXQgdGhlIHRhcmdldCBmZWF0dXJlIG9mIG9sZFZhbHVlIHRvIG51bGwKLQkJCQkJCQkJb2xkVmFsdWUuZVNldCgoRVN0cnVjdHVyYWxGZWF0dXJlKSBmLCBudWxsKTsKLQkJCQkJCQl9Ci0JCQkJCQkJb3RoZXJFbmQuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KAotCQkJCQkJCQkJb3Bwb3NpdGVGZWF0dXJlLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgdGFyZ2V0RmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGY7Ci0JCQkJCQkJaWYoIXRhcmdldEZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkJb2xkT3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJCQlpZihvbGRPdGhlckVuZCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlvbGRPdGhlckVuZC5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5wdXQob3Bwb3NpdGVGZWF0dXJlLCBudWxsKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5VTlNFVDoKLQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUucmVzb2x2ZU93bmVyKCkpIHsKLQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb2x2ZShvdGhlckVuZCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAob3RoZXJFbmQgIT0gbnVsbCkKLQkJCQkJCQlvdGhlckVuZC5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5wdXQoCi0JCQkJCQkJCQlvcHBvc2l0ZUZlYXR1cmUsIG51bGwpOwotCQkJCQkJYnJlYWs7Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXN1cGVyLmVOb3RpZnkobXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQmFzaWNOb3RpZmllckltcGwjZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSB7Ci0JCWlmICghZURlbGl2ZXIoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiAhcmVzb3VyY2UuZURlbGl2ZXIoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAobm90aWZ5T3Bwb3NpdGUgPT0gbnVsbCkgewotCQkJaWYgKE9wcG9zaXRlRmVhdHVyZS5mZWF0dXJlT3Bwb3NpdGVGZWF0dXJlTWFwLmlzRW1wdHkoKSkgewotCQkJCW5vdGlmeU9wcG9zaXRlID0gQm9vbGVhbi5GQUxTRTsKLQkJCX0gZWxzZSB7Ci0JCQkJQ29sbGVjdGlvbiBmZWF0dXJlcyA9IE9wcG9zaXRlRmVhdHVyZS5mZWF0dXJlT3Bwb3NpdGVGZWF0dXJlTWFwCi0JCQkJCQkua2V5U2V0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZUNsYXNzKCkuZ2V0RUFsbFJlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlpZiAoZmVhdHVyZXMuY29udGFpbnMoaXRlci5uZXh0KCkpKSB7Ci0JCQkJCQlub3RpZnlPcHBvc2l0ZSA9IEJvb2xlYW4uVFJVRTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChub3RpZnlPcHBvc2l0ZSA9PSBudWxsKSB7Ci0JCQkJCW5vdGlmeU9wcG9zaXRlID0gQm9vbGVhbi5GQUxTRTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG5vdGlmeU9wcG9zaXRlLmJvb2xlYW5WYWx1ZSgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBzdXBlci5lTm90aWZpY2F0aW9uUmVxdWlyZWQoKTsKLQl9Ci0KLQkvKgotCSAqIHByaXZhdGUgdm9pZCByZW1vdmVDaGlsZFJlc291cmNlcygpIHsgTGlzdCBjaGlsZHJlbiA9IGVDb250ZW50cygpOyBpbnQKLQkgKiBzaXplID0gY2hpbGRyZW4uc2l6ZSgpOyBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCSAqIE11bHRpUmVzb3VyY2VFT2JqZWN0IGNoaWxkID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBjaGlsZHJlbi5nZXQoaSk7Ci0JICogUmVzb3VyY2UgcmVzb3VyY2UgPSBjaGlsZC5lUmVzb3VyY2UoKTsgaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UgIT0KLQkgKiBlUmVzb3VyY2UoKSkgeyBjaGlsZC5yZW1vdmVDaGlsZFJlc291cmNlcygpOyB9ICgoSW50ZXJuYWxFTGlzdCkKLQkgKiByZXNvdXJjZS5nZXRDb250ZW50cygpKS5iYXNpY1JlbW92ZSh0aGlzLCBudWxsKTsKLQkgKiBjaGlsZC5lUHJvcGVydGllcygpLnNldEVSZXNvdXJjZShudWxsKTsgfSB9Ci0JKi8KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCNlQmFzaWNTZXRDb250YWluZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCwKLQkgKiAgICAgIGludCwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4pCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1NldENvbnRhaW5lcihJbnRlcm5hbEVPYmplY3QgbmV3Q29udGFpbmVyLAotCQkJaW50IG5ld0NvbnRhaW5lckZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlSZXNvdXJjZS5JbnRlcm5hbCBvbGRSZXNvdXJjZSA9IHRoaXMuZURpcmVjdFJlc291cmNlKCk7Ci0JCVJlc291cmNlLkludGVybmFsIG5ld1Jlc291cmNlID0gbmV3Q29udGFpbmVyID09IG51bGwgPyBudWxsCi0JCQkJOiBuZXdDb250YWluZXIuZUludGVybmFsUmVzb3VyY2UoKTsKLQkJLy8gaWYgKG9sZFJlc291cmNlICE9IG5ld1Jlc291cmNlICYmIG9sZFJlc291cmNlICE9IG51bGwpIHsKLQkJLy8gcmVtb3ZlQ2hpbGRSZXNvdXJjZXMoKTsKLQkJLy8gfQotCi0JCWludCBvbGRJbmRleCA9IC0xOwotCQlpbnQgb2xkU2l6ZSA9IC0xOwotCQlpZiAob2xkUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJb2xkSW5kZXggPSBvbGRSZXNvdXJjZS5nZXRDb250ZW50cygpLmluZGV4T2YodGhpcyk7Ci0JCQlvbGRTaXplID0gb2xkUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5zaXplKCk7Ci0JCX0KLQotCQlOb3RpZmljYXRpb25DaGFpbiBtZXNzYWdlcyA9IHN1cGVyLmVCYXNpY1NldENvbnRhaW5lcihuZXdDb250YWluZXIsCi0JCQkJbmV3Q29udGFpbmVyRmVhdHVyZUlELCBtc2dzKTsKLQkJaWYgKG9sZFJlc291cmNlICE9IG5ld1Jlc291cmNlICYmIG9sZFJlc291cmNlICE9IG51bGwpIHsKLQkJCS8vIHJlbW92ZSBhbnkgbmV3bHkgYWRkZWQgTW9kaWZpY2F0aW9uVHJhY2tpbmdBZGFwdGVycyBmcm9tIHRoaXMKLQkJCS8vIG9iamVjdCdzIGFkYXB0ZXIgbGlzdAotCQkJLy8KLQkJCWlmIChuZXdSZXNvdXJjZSAhPSBudWxsKQotCQkJCW5ld1Jlc291cmNlLmRldGFjaGVkKHRoaXMpOwotCi0JCQkvLyBPdmVycmlkZSB0aGUgZGVmYXVsdCBzZW1hbnRpYzogTXVsdGlSZXNvdXJjZUVPYmplY3QgaXMgYWxsb3dlZCB0bwotCQkJLy8gYmUgb3duZWQgYnkgYm90aCBjb250YWluZXIgYW5kIHJlc291cmNlLgotCQkJLy8gQWRkIHRoaXMgb2JqZWN0IGJhY2sgdG8gdGhlIG9sZCByZXNvdXJjZS4KLQkJCS8vCi0JCQlCYXNpY0VMaXN0IGNvbnRlbnRzID0gKChCYXNpY0VMaXN0KSBvbGRSZXNvdXJjZS5nZXRDb250ZW50cygpKTsKLQkJCWlmIChvbGRTaXplICE9IGNvbnRlbnRzLnNpemUoKSkgewotCQkJCS8vIHRoaXMgb2JqZWN0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcmVzb3VyY2UncyBjb250ZW50cwotCQkJCS8vIGFkZCBpdCBiYWNrCi0JCQkJLy8KLQkJCQlpZiAoY29udGVudHMuaXNFbXB0eSgpKSB7Ci0JCQkJCS8vIHRoaXMgd2lsbCBmbGFnIHJlc291cmNlIGFzIGxvYWRlZAotCQkJCQkvLwotCQkJCQljb250ZW50cy5jbGVhcigpOwotCQkJCQljb250ZW50cy5zZXREYXRhKDEsIG5ldyBPYmplY3RbXSB7IHRoaXMgfSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJT2JqZWN0W10gZGF0YSA9IGNvbnRlbnRzLnRvQXJyYXkoKTsKLQkJCQkJT2JqZWN0W10gbmV3RGF0YSA9IG5ldyBPYmplY3RbZGF0YS5sZW5ndGggKyAxXTsKLQkJCQkJaWYgKG9sZEluZGV4ID4gMCkgewotCQkJCQkJU3lzdGVtLmFycmF5Y29weShkYXRhLCAwLCBuZXdEYXRhLCAwLCBvbGRJbmRleCk7Ci0JCQkJCX0KLQkJCQkJbmV3RGF0YVtvbGRJbmRleF0gPSB0aGlzOwotCQkJCQlpZiAob2xkSW5kZXggPCBkYXRhLmxlbmd0aCkgewotCQkJCQkJU3lzdGVtLmFycmF5Y29weShkYXRhLCBvbGRJbmRleCwgbmV3RGF0YSwgb2xkSW5kZXggKyAxLAotCQkJCQkJCQlkYXRhLmxlbmd0aCAtIG9sZEluZGV4KTsKLQkJCQkJfQotCQkJCQljb250ZW50cy5zZXREYXRhKG5ld0RhdGEubGVuZ3RoLCBuZXdEYXRhKTsKLQkJCQl9Ci0JCQl9Ci0JCQllU2V0UmVzb3VyY2Uob2xkUmVzb3VyY2UpOwotCQkJLy8gZG9uJ3QgaGF2ZSB0byByZS1hdHRhY2ggdGhpcyBvYmplY3QgdG8gb2xkUmVzb3VyY2Ugc2luY2UgaXQgd2FzCi0JCQkvLyBub3QgZGV0dGFjaGVkIGluIHN1cGVyIG1ldGhvZAotCQkJLy8KLQkJCS8vIG9sZFJlc291cmNlLmF0dGFjaGVkKHRoaXMpOwotCi0JCQkvLyBpZihuZXdSZXNvdXJjZSAhPSBudWxsKSBuZXdSZXNvdXJjZS5hdHRhY2hlZCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZXM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29udGFpbmVyIGFuZCBjb250YWluZXIgZmVhdHVyZSBJRCBmb3IgdGhpcyBvYmplY3Qgb25seSBpZiBpdCBpcwotCSAqIG5vdCBjb250YWluZWQgYnkgYW55IGNvbnRhaW5lci4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkJhc2ljRU9iamVjdEltcGwjZUJhc2ljU2V0Q29udGFpbmVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgZVNldENvbnRhaW5lcihJbnRlcm5hbEVPYmplY3QgbmV3Q29udGFpbmVyLAotCQkJaW50IG5ld0NvbnRhaW5lckZlYXR1cmVJRCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9IGVJbnRlcm5hbENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyICE9IG51bGwgJiYgIWNvbnRhaW5lci5lSXNQcm94eSgpKQotCQkJcmV0dXJuOwotCQlzdXBlci5lQmFzaWNTZXRDb250YWluZXIobmV3Q29udGFpbmVyLCBuZXdDb250YWluZXJGZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuQmFzaWNFT2JqZWN0SW1wbCNlQmFzaWNTZXRDb250YWluZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlQmFzaWNTZXRDb250YWluZXIoSW50ZXJuYWxFT2JqZWN0IG5ld0NvbnRhaW5lciwKLQkJCWludCBuZXdDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJc3VwZXIuZUJhc2ljU2V0Q29udGFpbmVyKG5ld0NvbnRhaW5lciwgbmV3Q29udGFpbmVyRmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb250YWluaW5nIHJlc291cmNlIGZvciB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzCi0JICogICAgICAgICAgICBhIHJlc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgZVNldFJlc291cmNlKFJlc291cmNlLkludGVybmFsIHJlcykgewotCQllUHJvcGVydGllcygpLnNldEVSZXNvdXJjZShyZXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuQmFzaWNFT2JqZWN0SW1wbCNlRGlyZWN0UmVzb3VyY2UoKQotCSAqLwotCXB1YmxpYyBJbnRlcm5hbCBlRGlyZWN0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiBzdXBlci5lRGlyZWN0UmVzb3VyY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBvYmplY3QgcmVwcmVzZW50ZWQgYnkgcHJveHkuIFByb3h5IGNoYWlucyBhcmUKLQkgKiBmb2xsb3dlZC4gSWYgcmVzb3VyY2VTZXQgaXMgbnVsbCwgdGhlIGdsb2JhbCBwYWNrYWdlIHJlZ2lzdHJ5IGlzCi0JICogY29uc3VsdGVkIHRvIG9idGFpbiBhIHBhY2thZ2UgcmVnaXN0ZXJlZCBhZ2FpbnN0IHRoZSBwcm94eSBVUkksIGxlc3MgaXRzCi0JICogZnJhZ21lbnQsIGluIHRoZSBzYW1lIG1hbm5lciBhcyB0aGUgZGVmYXVsdCByZXNvdXJjZSBzZXQgaW1wbGVtZW50YXRpb24ncwotCSAqIGZhbGxiYWNrIGJlaGF2aW91ci4KLQkgKiAKLQkgKiBAcGFyYW0gcHJveHkKLQkgKiAgICAgICAgICAgIHRoZSBwcm94eSB0byBiZSByZXNvbHZlZC4KLQkgKiBAcGFyYW0gcmVzb3VyY2VTZXQKLQkgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZSBzZXQgaW4gd2hpY2ggdG8gcmVzb2x2ZS4KLQkgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCBvYmplY3QsIG9yIHRoZSBwcm94eSBpZiB1bmFibGUgdG8gcmVzb2x2ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbCNyZXNvbHZlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0KQotCSAqLwotCXByaXZhdGUgRU9iamVjdCByZXNvbHZlUHJveHkoRU9iamVjdCBwcm94eSkgewotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGVSZXNvdXJjZSgpICE9IG51bGwgPyBlUmVzb3VyY2UoKQotCQkJCS5nZXRSZXNvdXJjZVNldCgpIDogbnVsbDsKLQotCQlVUkkgcHJveHlVUkkgPSAoKEludGVybmFsRU9iamVjdCkgcHJveHkpLmVQcm94eVVSSSgpOwotCQlpZiAocHJveHlVUkkgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlFT2JqZWN0IHJlc29sdmVkT2JqZWN0ID0gbnVsbDsKLQotCQkJCWlmIChyZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0JCQkJCWlmIChyZXNvdXJjZVNldCBpbnN0YW5jZW9mIElVbWFSZXNvdXJjZVNldCkgewotCQkJCQkJcmVzb2x2ZWRPYmplY3QgPSAoKElVbWFSZXNvdXJjZVNldCkgcmVzb3VyY2VTZXQpCi0JCQkJCQkJCS5nZXRFT2JqZWN0KHRoaXMsIHByb3h5VVJJLCB0cnVlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJlc29sdmVkT2JqZWN0ID0gcmVzb3VyY2VTZXQuZ2V0RU9iamVjdChwcm94eVVSSSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlFUGFja2FnZSBlUGFja2FnZSA9IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFCi0JCQkJCQkJLmdldEVQYWNrYWdlKHByb3h5VVJJLnRyaW1GcmFnbWVudCgpLnRvU3RyaW5nKCkpOwotCQkJCQlpZiAoZVBhY2thZ2UgIT0gbnVsbCkgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlUGFja2FnZS5lUmVzb3VyY2UoKTsKLQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJcmVzb2x2ZWRPYmplY3QgPSByZXNvdXJjZS5nZXRFT2JqZWN0KHByb3h5VVJJCi0JCQkJCQkJCQkuZnJhZ21lbnQoKS50b1N0cmluZygpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChyZXNvbHZlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQkJCWlmKHJlc29sdmVkT2JqZWN0ICE9IHByb3h5KSB7Ci0vLwkJCQkJCXJldHVybiByZXNvbHZlUHJveHkocmVzb2x2ZWRPYmplY3QpOwotCQkJCQkJcmV0dXJuIHJlc29sdmVkT2JqZWN0OwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHJlc291cmNlU2V0IGluc3RhbmNlb2YgSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyKSB7Ci0JCQkJCQkoKElQcm94eVJlc29sdXRpb25MaXN0ZW5lcikgcmVzb3VyY2VTZXQpCi0JCQkJCQkJCS5ub3RpZnlFeGNlcHRpb24obmV3IFJlc29sdmVFeGNlcHRpb24ocHJveHksCi0JCQkJCQkJCQkJKFN0cmluZykgbnVsbCwgdGhpcykpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIpIHsKLQkJCQkJKChJUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIpIHJlc291cmNlU2V0KQotCQkJCQkJCS5ub3RpZnlFeGNlcHRpb24obmV3IFJlc29sdmVFeGNlcHRpb24ocHJveHksCi0JCQkJCQkJCQlleGNlcHRpb24sIHRoaXMpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb3h5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCNlUmVzb2x2ZVByb3h5KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QpCi0JICovCi0JcHVibGljIEVPYmplY3QgZVJlc29sdmVQcm94eShJbnRlcm5hbEVPYmplY3QgcHJveHkpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSBwcm94eS5lQ29udGFpbmVyKCk7Ci0JCWludCBmZWF0dXJlSUQgPSBwcm94eS5lQ29udGFpbmVyRmVhdHVyZUlEKCk7Ci0JCUVPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQotCQlyZXN1bHQgPSByZXNvbHZlUHJveHkocHJveHkpOwotCi0JCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQgaW5zdGFuY2VvZiBNdWx0aVJlc291cmNlRU9iamVjdCkgewotCQkJaWYgKHByb3h5LmVJc1Byb3h5KCkgJiYgcmVzdWx0ID09IHByb3h5KSB7Ci0JCQkJLy8gcHJveHkgY291bGQgbm90IGJlIHJlc29sdmVkCi0JCQkJLy8KLQkJCQkoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXN1bHQpLnZhbGlkID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCSgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc3VsdCkudmFsaWQgPSB0cnVlOwotCi0JCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCSgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc3VsdCkuZVNldENvbnRhaW5lcigKLQkJCQkJCQkoSW50ZXJuYWxFT2JqZWN0KSBjb250YWluZXIsIGZlYXR1cmVJRCk7Ci0JCQkJfQotCi0JCQkJLy8gbWVyZ2UgdGhlIG9wcG9zaXRlIGZlYXR1cmUgbWFwCi0JCQkJLy8KLQkJCQlpZiAocmVzdWx0ICE9IHByb3h5KSB7Ci0JCQkJCWlmKHByb3h5IGluc3RhbmNlb2YgTXVsdGlSZXNvdXJjZUVPYmplY3QpIHsKLQkJCQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IG15T2JqID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBwcm94eTsKLQotCQkJCQkJaWYgKG15T2JqLm9wcG9zaXRlRmVhdHVyZU1hcCAhPSBudWxsCi0JCQkJCQkJCSYmICFteU9iai5vcHBvc2l0ZUZlYXR1cmVNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJTWFwIG5ld01hcCA9ICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc3VsdCkKLQkJCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbXlPYmouZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkKLQkJCQkJCQkJCS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJCQkJaWYgKGVudHJ5LmdldFZhbHVlKCkgIT0gbnVsbCkgewotCQkJCQkJCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9IChPcHBvc2l0ZUZlYXR1cmUpIGVudHJ5Ci0JCQkJCQkJCQkuZ2V0S2V5KCk7Ci0JCQkJCQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJCQkJTGlzdCB2YWx1ZXMgPSAoTGlzdCkgbmV3TWFwCi0JCQkJCQkJCQkJLmdldChvcHBvc2l0ZUZlYXR1cmUpOwotCQkJCQkJCQkJCWlmICh2YWx1ZXMgPT0gbnVsbCkgewotCQkJCQkJCQkJCQluZXdNYXAucHV0KG9wcG9zaXRlRmVhdHVyZSwgZW50cnkKLQkJCQkJCQkJCQkJCQkuZ2V0VmFsdWUoKSk7Ci0JCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQkJdmFsdWVzLmFkZEFsbCgoQ29sbGVjdGlvbikgZW50cnkKLQkJCQkJCQkJCQkJCQkuZ2V0VmFsdWUoKSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQluZXdNYXAucHV0KG9wcG9zaXRlRmVhdHVyZSwgZW50cnkKLQkJCQkJCQkJCQkJCS5nZXRWYWx1ZSgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlteU9iai5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5jbGVhcigpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGVSZXNvdXJjZSgpICE9IG51bGwgPyBlUmVzb3VyY2UoKQotCQkJCQkJCS5nZXRSZXNvdXJjZVNldCgpIDogbnVsbDsKLQkJCQkJaWYgKHJlc291cmNlU2V0IGluc3RhbmNlb2YgSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyKSB7Ci0JCQkJCQkoKElQcm94eVJlc29sdXRpb25MaXN0ZW5lcikgcmVzb3VyY2VTZXQpLnByb3h5UmVzb2x2ZWQoCi0JCQkJCQkJCXByb3h5LCByZXN1bHQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTWFwIGNyZWF0ZU9wcG9zaXRlRmVhdHVyZU1hcCgpIHsKLQkJTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IE9wcG9zaXRlRmVhdHVyZS5jbGFzc09wcG9zaXRlRmVhdHVyZXNNYXAKLQkJCQkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJQ2xhc3MgY2xzID0gKENsYXNzKSBlbnRyeS5nZXRLZXkoKTsKLQkJCWlmIChjbHMuaXNJbnN0YW5jZSh0aGlzKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAoKENvbGxlY3Rpb24pIGVudHJ5LmdldFZhbHVlKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQltYXAucHV0KGl0ZXJhdG9yLm5leHQoKSwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChtYXAuaXNFbXB0eSgpKSB7Ci0JCQloYXNPcHBvc2l0ZUZlYXR1cmUgPSBmYWxzZTsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIG1hcC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIGNvbnRhaW5pbmcgdGhlIG9wcG9zaXRlIGZlYXR1cmVzIG1hcHBlZCB0byB0aGVpciB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgTWFwIGdldE9wcG9zaXRlRmVhdHVyZU1hcCgpIHsKLQkJaWYgKG9wcG9zaXRlRmVhdHVyZU1hcCA9PSBudWxsICYmIGhhc09wcG9zaXRlRmVhdHVyZSkgewotCQkJb3Bwb3NpdGVGZWF0dXJlTWFwID0gY3JlYXRlT3Bwb3NpdGVGZWF0dXJlTWFwKCk7Ci0JCX0KLQkJaWYob3Bwb3NpdGVGZWF0dXJlTWFwID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JCX0KLQkJcmV0dXJuIG9wcG9zaXRlRmVhdHVyZU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIG1hcC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIGNvbnRhaW5pbmcgdGhlIG9wcG9zaXRlIGZlYXR1cmVzIG1hcHBlZCB0byB0aGVpciB2YWx1ZXMgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgb2JqZWN0IGRvZXMgbm90IGhhdmUgYW55IG9wcG9zaXRlCi0JICogICAgICAgICBmZWF0dXJlIG9yIHRoZSBtYXAgaGFzIG5vdCBiZWVuIGNyZWF0ZWQKLQkgKi8KLQlwdWJsaWMgTWFwIGJhc2ljR2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkgewotCQlyZXR1cm4gb3Bwb3NpdGVGZWF0dXJlTWFwOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHZhbHVlIG9mIGFuIG9wcG9zaXRlIGZlYXR1cmUuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIGFuIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBmb3IgdGhlIG9wcG9zaXRlIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKE9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmdldChmZWF0dXJlKTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpUmVzb3VyY2VFT2JqZWN0LmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKCk6Iik7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGZlYXR1cmU6ICIgKyBmZWF0dXJlKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgdmFsdWU6ICIgKyB2YWx1ZSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIHRoaXM6ICIgKyB0aGlzKTsKLQotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCX0KLQotCQkJcmV0dXJuICgoT3Bwb3NpdGVGZWF0dXJlUmVzb2x2aW5nRUxpc3QpIHZhbHVlKQotCQkJCQkuZ2V0VW5tb2RpZmlhYmxlTGlzdCgpOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRU9iamVjdAotCQkJCSYmICgoRU9iamVjdCkgdmFsdWUpLmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCWdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dChmZWF0dXJlLCBudWxsKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZXJuYWxFT2JqZWN0Ci0JCQkJJiYgKChJbnRlcm5hbEVPYmplY3QpIHZhbHVlKS5lSXNQcm94eSgpKSB7Ci0JCQlFT2JqZWN0IHJlc29sdmVkID0gZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSB2YWx1ZSk7Ci0JCQlpZiAocmVzb2x2ZWQgIT0gdmFsdWUpIHsKLQkJCQlnZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5wdXQoZmVhdHVyZSwgcmVzb2x2ZWQpOwotCQkJCXZhbHVlID0gcmVzb2x2ZWQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJlc291cmNlIGF0IGEgZ2l2ZW4gbG9jYXRpb24uCi0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogICAgICAgICAgICB0aGUgcmVzb3VyY2UgbG9jYXRpb24KLQkgKiBAcmV0dXJuIGEgcmVzb3VyY2UgaW4gdGhlIHdvcmtzcGFjZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGdldFJlc291cmNlRm9yTG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgobG9jYXRpb24pOwotCQlJUmVzb3VyY2UgcmVzb3VyY2U7Ci0JCUZpbGUgZmlsZSA9ICBuZXcgRmlsZShsb2NhdGlvbik7Ci0JCWlmIChmaWxlLmlzRmlsZSgpKSB7Ci0JCQlyZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQkJaWYocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCUlSZXNvdXJjZSBwYXJlbnRSZXNvdXJjZSA9IGdldFJlc291cmNlRm9yTG9jYXRpb24oZmlsZQotCQkJCQkJLmdldFBhcmVudCgpKTsKLQkJCQlpZihwYXJlbnRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwYXJlbnRSZXNvdXJjZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJfQotCQkJCQlyZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRDb250YWluZXJGb3JMb2NhdGlvbihwYXRoKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0vLwkvKiAobm9uLUphdmFkb2MpCi0vLwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotLy8JICovCi0vLwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotLy8JCWlmKGFkYXB0ZXIgPT0gSVJlc291cmNlLmNsYXNzKSB7Ci0vLwkJCVJlc291cmNlIHJlc291cmNlID0gZVJlc291cmNlKCk7Ci0vLwkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLS8vCQkJCXJldHVybiBnZXRSZXNvdXJjZUZvckxvY2F0aW9uKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gbnVsbDsKLS8vCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIGFsbCBvcHBvc2l0ZSBmZWF0dXJlcyByZWdpc3RlcmVkIHdpdGggdGhlIHN5c3RlbS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVGcm9tQWxsT3Bwb3NpdGVGZWF0dXJlcygpIHsKLQkJLy8gZmluZCBhbGwgZmVhdHVyZXMgdGhhdCBoYXZlIG9wcG9zaXRlIGZlYXR1cmVzIGFuZCBjbGVhciB0aG9zZQotCQkvLyBmZWF0dXJlcy4gVGhpcyB3aWxsIHJlbW92ZSB0aGUgcmVmZXJlbmNlcyB0bwotCQkvLyB1bmxvYWRlZCBvYmplY3QgYnkgdGhvc2Ugb3Bwb3NpdGUgZmVhdHVyZXMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZUNsYXNzKCkuZ2V0RUFsbFJlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUVSZWZlcmVuY2UgcmVmID0gKEVSZWZlcmVuY2UpIGl0ZXIubmV4dCgpOwotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9IE9wcG9zaXRlRmVhdHVyZS5nZXRPcHBvc2l0ZUZlYXR1cmUocmVmKTsKLQkJCWlmKG9wcG9zaXRlRmVhdHVyZSAhPSBudWxsKSB7Ci0JCQkJaWYocmVmLmlzTWFueSgpKSB7Ci0JCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBlR2V0KHJlZiwgZmFsc2UpOwkJCQkJCi0JCQkJCWlmKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJaWYoIW9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCWxpc3QuY2xlYXIoKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYobGlzdCBpbnN0YW5jZW9mIEludGVybmFsRUxpc3QpIHsKLQkJCQkJCQlMaXN0IGJhc2ljTGlzdCA9ICgoSW50ZXJuYWxFTGlzdClsaXN0KS5iYXNpY0xpc3QoKTsKLQkJCQkJCQlmb3IoaW50IGkgPSBiYXNpY0xpc3Quc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQkJCQkJRU9iamVjdCBlID0gKEVPYmplY3QpIGJhc2ljTGlzdC5nZXQoaSk7Ci0JCQkJCQkJCWlmKCFlLmVJc1Byb3h5KCkpIHsKLQkJCQkJCQkJCWxpc3QucmVtb3ZlKGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlFT2JqZWN0IGUgPSAoRU9iamVjdCkgZUdldChyZWYsIGZhbHNlKTsKLQkJCQkJaWYoZSAhPSBudWxsICYmICFlLmVJc1Byb3h5KCkpIHsKLQkJCQkJCWVTZXQocmVmLCBudWxsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdCNnZXRPcHBvc2l0ZUZlYXR1cmVzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRPcHBvc2l0ZUZlYXR1cmVzKCkgewotCQlyZXR1cm4gZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkua2V5U2V0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdCNnZXREZWZhdWx0VmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlPYmplY3QgdmFsdWUgPSBnZXRGZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAoKS5nZXQoZmVhdHVyZSk7Ci0JCWlmKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gZmVhdHVyZS5nZXREZWZhdWx0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCQotCXByaXZhdGUgTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgT2JqZWN0PiBnZXRGZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAoKSB7Ci0JCXJldHVybiBkZWZhdWx0VmFsdWVNYW5hZ2VyLmdldEZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcChlQ2xhc3MoKSk7Ci0JfQotCQotCS8qKgotCSAqIFVucmVnaXN0ZXJzIGEgZmVhdHVyZSB3aG9zZSBkZWZhdWx0IHZhbHVlIGhhcyBiZWVuIG92ZXJyaWRlbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgYSBmZWF0dXJlCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlNYXAgZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwID0gZ2V0RmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwKCk7Ci0JCWlmKGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcC5yZW1vdmUoZmVhdHVyZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWFzc2lnbiBkZWZhdWx0IHZhbHVlcyB0aGF0IGFyZSBkZWZpbmVkIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgZm9yIHRoaXMgY2xhc3MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKSB7Ci0JCWRlZmF1bHRWYWx1ZU1hbmFnZXIuYXNzaWduRGVmYXVsdFZhbHVlcyh0aGlzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZSgKLQkJCWludCBmZWF0dXJlSUQpIHsKLQkJTWFwIGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCA9IGdldEZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCgpOwotCQlpZighZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwLmlzRW1wdHkoKSkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBlQ2xhc3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoCi0JCQkJCWZlYXR1cmVJRCk7Ci0JCQlpZihmZWF0dXJlICE9IG51bGwgJiYgZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwLmNvbnRhaW5zS2V5KGZlYXR1cmUpKSB7Ci0JCQkJcmV0dXJuIGZlYXR1cmU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlPYmplY3QgZGVmYXVsdFZhbHVlID0gZ2V0RGVmYXVsdFZhbHVlKGZlYXR1cmUpOwotCQlPYmplY3QgdmFsdWUgPSBlR2V0KGZlYXR1cmUsIGZhbHNlKTsKLQkJaWYoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgISgoQ29sbGVjdGlvbikgdmFsdWUpLmlzRW1wdHkoKQotCQkJJiYgdmFsdWUgIT0gZGVmYXVsdFZhbHVlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGRlZmF1bHRWYWx1ZSA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFkZWZhdWx0VmFsdWUKLQkJCQkJLmVxdWFscyh2YWx1ZSk7Ci0JCX0KLQkJCi0vLwkJLy8gQWx3YXlzIHJldHVybiB0cnVlIHNvIHRoZSBmZWF0dXJlICh3aXRoIGRlZmF1bHQgdmFsdWUgb3ZlcnJpZGVuKQotLy8JCS8vIHdpbGwgYmUgc2F2ZWQgcmVnYXJkbGVzcyB0aGF0IGl0cyB2YWx1ZSBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBvciBub3QuCi0vLwkJLy8KLS8vCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9pbXBsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvaW1wbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZTYyMjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9pbXBsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFVNQSBFY29yZSBleHRlbnNpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVjYTkwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciB0aGUgVU1BIEVjb3JlIGV4dGVuc2lvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvRGVmYXVsdFZhbHVlTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL0RlZmF1bHRWYWx1ZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJmZjY3Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvRGVmYXVsdFZhbHVlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmUgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsdWVNYW5hZ2VyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlZmF1bHRWYWx1ZU1hbmFnZXIgSU5TVEFOQ0UgPSBuZXcgRGVmYXVsdFZhbHVlTWFuYWdlcigpOwotCQotCXByaXZhdGUgZmluYWwgTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgTWFwPEVDbGFzcywgT2JqZWN0Pj4gZmVhdHVyZVRvVHlwZWREZWZhdWx0VmFsdWVzTWFwID0gCi0JCW5ldyBIYXNoTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgTWFwPEVDbGFzcywgT2JqZWN0Pj4oKTsKLQkKLQlwcml2YXRlIGZpbmFsIE1hcDxFQ2xhc3MsIE1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4+IHR5cGVUb0ZlYXR1cmVEZWZhdWx0VmFsdWVNYXAgPQotCQluZXcgSGFzaE1hcDxFQ2xhc3MsIE1hcDxFU3RydWN0dXJhbEZlYXR1cmUsT2JqZWN0Pj4oKTsKLQotCXByaXZhdGUgZmluYWwgTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgTWFwPEVDbGFzcywgT2JqZWN0Pj4gZmVhdHVyZVRvVHlwZWRTdGF0aWNEZWZhdWx0VmFsdWVzTWFwID0gCi0JCW5ldyBIYXNoTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgTWFwPEVDbGFzcywgT2JqZWN0Pj4oKTsKLQkKLQlwcml2YXRlIGZpbmFsIE1hcDxFQ2xhc3MsIE1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4+IHR5cGVUb0ZlYXR1cmVTdGF0aWNEZWZhdWx0VmFsdWVNYXAgPQotCQluZXcgSGFzaE1hcDxFQ2xhc3MsIE1hcDxFU3RydWN0dXJhbEZlYXR1cmUsT2JqZWN0Pj4oKTsKLQotCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiB1c2VTdGF0aWM7Ci0JCi0JcHJvdGVjdGVkIERlZmF1bHRWYWx1ZU1hbmFnZXIoKSB7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRVc2VTdGF0aWMoYm9vbGVhbiB1c2VTdGF0aWMpIHsKLQkJdGhpcy51c2VTdGF0aWMgPSB1c2VTdGF0aWM7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVXNlU3RhdGljKCkgewotCQlyZXR1cm4gdXNlU3RhdGljOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBPYmplY3Q+IGdldEZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcChFQ2xhc3MgdHlwZSwgCi0JCQlNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBNYXA8RUNsYXNzLCBPYmplY3Q+PiBmZWF0dXJlVG9UeXBlZERlZmF1bHRWYWx1ZXNNYXAsCi0JCQlNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBPYmplY3Q+IGZlYXR1cmVUb1N0YXRpY0RlZmF1bHRWYWx1ZU1hcCkgewotCQlNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBPYmplY3Q+IGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcDsKLQkJaWYoZmVhdHVyZVRvVHlwZWREZWZhdWx0VmFsdWVzTWFwLmlzRW1wdHkoKSkgewotCQkJZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotCQl9Ci0JCWVsc2UgewotCQkJZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwID0gbmV3IEhhc2hNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBPYmplY3Q+KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPE1hcC5FbnRyeTxFU3RydWN0dXJhbEZlYXR1cmUsIE1hcDxFQ2xhc3MsIE9iamVjdD4+PiBpdGVyID0gCi0JCQkJZmVhdHVyZVRvVHlwZWREZWZhdWx0VmFsdWVzTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5PEVTdHJ1Y3R1cmFsRmVhdHVyZSwgTWFwPEVDbGFzcywgT2JqZWN0Pj4gZW50cnkgPSBpdGVyLm5leHQoKTsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGVudHJ5LmdldEtleSgpOwotCQkJCWlmKHR5cGUuZ2V0RmVhdHVyZUlEKGZlYXR1cmUpICE9IC0xKSB7Ci0JCQkJCU9iamVjdCBkZWZhdWx0VmFsdWUgPSBudWxsOwotCQkJCQlFQ2xhc3Mgc2VsZWN0ZWRUeXBlID0gdHlwZTsKLQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQlmb3IgKEl0ZXJhdG9yPE1hcC5FbnRyeTxFQ2xhc3MsIE9iamVjdD4+IGl0ZXJhdG9yID0gZW50cnkuZ2V0VmFsdWUoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU1hcC5FbnRyeTxFQ2xhc3MsIE9iamVjdD4gZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJRUNsYXNzIGN1cnJlbnRUeXBlID0gZW50LmdldEtleSgpOwotCQkJCQkJaWYoY3VycmVudFR5cGUuaXNTdXBlclR5cGVPZih0eXBlKSAmJiAKLQkJCQkJCQkJKHNlbGVjdGVkVHlwZSA9PSBudWxsIHx8IHNlbGVjdGVkVHlwZS5pc1N1cGVyVHlwZU9mKGN1cnJlbnRUeXBlKSkpIHsKLQkJCQkJCQlzZWxlY3RlZFR5cGUgPSBjdXJyZW50VHlwZTsKLQkJCQkJCQlkZWZhdWx0VmFsdWUgPSBlbnQuZ2V0VmFsdWUoKTsKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYoZm91bmQpIHsKLQkJCQkJCU9iamVjdCBzdGF0aWNEZWZhdWx0VmFsdWUgPSBmZWF0dXJlVG9TdGF0aWNEZWZhdWx0VmFsdWVNYXAuZ2V0KGZlYXR1cmUpOwotCQkJCQkJaWYoc3RhdGljRGVmYXVsdFZhbHVlID09IG51bGwpIHsKLQkJCQkJCQlzdGF0aWNEZWZhdWx0VmFsdWUgPSBmZWF0dXJlLmdldERlZmF1bHRWYWx1ZSgpOwotCQkJCQkJfQotCQkJCQkJaWYoKGRlZmF1bHRWYWx1ZSA9PSBudWxsICYmICBzdGF0aWNEZWZhdWx0VmFsdWUgIT0gbnVsbCkKLQkJCQkJCQkJfHwgKGRlZmF1bHRWYWx1ZSAhPSBudWxsICYmICFkZWZhdWx0VmFsdWUuZXF1YWxzKHN0YXRpY0RlZmF1bHRWYWx1ZSkpKSB7Ci0JCQkJCQkJZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwLnB1dChmZWF0dXJlLCBkZWZhdWx0VmFsdWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYoZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwLmlzRW1wdHkoKSkgewotCQkJCWZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIE1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4gZ2V0RmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwKEVDbGFzcyB0eXBlKSB7Ci0JCWlmKHVzZVN0YXRpYykgewotCQkJcmV0dXJuIGdldEZlYXR1cmVUb1N0YXRpY0RlZmF1bHRWYWx1ZU1hcCh0eXBlKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBnZXRGZWF0dXJlVG9EeW5hbWljRGVmYXVsdFZhbHVlTWFwKHR5cGUpOwotCQl9CQkKLQl9Ci0JCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgT2JqZWN0PiBnZXRGZWF0dXJlVG9EeW5hbWljRGVmYXVsdFZhbHVlTWFwKEVDbGFzcyB0eXBlKSB7Ci0JCU1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4gZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwID0gdHlwZVRvRmVhdHVyZURlZmF1bHRWYWx1ZU1hcC5nZXQodHlwZSk7Ci0JCWlmKGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCA9PSBudWxsKSB7Ci0JCQlmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAgPSBnZXRGZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAodHlwZSwgZmVhdHVyZVRvVHlwZWREZWZhdWx0VmFsdWVzTWFwLAotCQkJCQlnZXRGZWF0dXJlVG9TdGF0aWNEZWZhdWx0VmFsdWVNYXAodHlwZSkpOwotCQkJdHlwZVRvRmVhdHVyZURlZmF1bHRWYWx1ZU1hcC5wdXQodHlwZSwgZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwKTsKLQkJfQotCQlyZXR1cm4gZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwOwotCX0JCi0JCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgT2JqZWN0PiBnZXRGZWF0dXJlVG9TdGF0aWNEZWZhdWx0VmFsdWVNYXAoRUNsYXNzIHR5cGUpIHsKLQkJTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgT2JqZWN0PiBmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAgPSB0eXBlVG9GZWF0dXJlU3RhdGljRGVmYXVsdFZhbHVlTWFwLmdldCh0eXBlKTsKLQkJaWYoZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwID09IG51bGwpIHsKLQkJCWZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCA9IGdldEZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCh0eXBlLCBmZWF0dXJlVG9UeXBlZFN0YXRpY0RlZmF1bHRWYWx1ZXNNYXAsCi0JCQkJCUNvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCQl0eXBlVG9GZWF0dXJlU3RhdGljRGVmYXVsdFZhbHVlTWFwLnB1dCh0eXBlLCBmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXApOwotCQl9Ci0JCXJldHVybiBmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXA7Ci0JfQotCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgc3luY2hyb25pemVkIHZvaWQgc2V0RGVmYXVsdFZhbHVlKEVDbGFzcyB0eXBlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IGRlZmF1bHRWYWx1ZSwKLQkJCU1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE1hcDxFQ2xhc3MsIE9iamVjdD4+IGZlYXR1cmVUb1R5cGVkRGVmYXVsdFZhbHVlc01hcCApIAotCXsKLQkJaWYoIWZlYXR1cmUuZ2V0RUNvbnRhaW5pbmdDbGFzcygpLmlzU3VwZXJUeXBlT2YodHlwZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlNYXA8RUNsYXNzLCBPYmplY3Q+IHR5cGVUb0RlZmF1bHRWYWx1ZU1hcCA9IGZlYXR1cmVUb1R5cGVkRGVmYXVsdFZhbHVlc01hcC5nZXQoZmVhdHVyZSk7Ci0JCWlmKHR5cGVUb0RlZmF1bHRWYWx1ZU1hcCA9PSBudWxsKSB7Ci0JCQkvLyB0aGlzIG1hcCBtdXN0IGJlIHNvcnRlZCBmcm9tIHN1YiB0eXBlIHRvIHN1cGVyIHR5cGUKLQkJCS8vCi0JCQl0eXBlVG9EZWZhdWx0VmFsdWVNYXAgPSBuZXcgSGFzaE1hcDxFQ2xhc3MsIE9iamVjdD4oKTsKLQkJCWZlYXR1cmVUb1R5cGVkRGVmYXVsdFZhbHVlc01hcC5wdXQoZmVhdHVyZSwgdHlwZVRvRGVmYXVsdFZhbHVlTWFwKTsKLQkJfQotCQl0eXBlVG9EZWZhdWx0VmFsdWVNYXAucHV0KHR5cGUsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBzeW5jaHJvbml6ZWQgdm9pZCBzZXREZWZhdWx0VmFsdWUoRUNsYXNzIHR5cGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7Ci0JCXNldERlZmF1bHRWYWx1ZSh0eXBlLCBmZWF0dXJlLCBkZWZhdWx0VmFsdWUsIGZlYXR1cmVUb1R5cGVkRGVmYXVsdFZhbHVlc01hcCk7Ci0JCQotCQkvLyBjbGVhciB0eXBlVG9GZWF0dXJlRGVmYXVsdFZhbHVlTWFwIHNvIHRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgcmVjYWxjdWxhdGVkIGZvciBlYWNoIGNsYXNzCi0JCS8vCi0JCXR5cGVUb0ZlYXR1cmVEZWZhdWx0VmFsdWVNYXAuY2xlYXIoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCB2b2lkIHNldFN0YXRpY0RlZmF1bHRWYWx1ZShFQ2xhc3MgdHlwZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBkZWZhdWx0VmFsdWUpIHsKLQkJc2V0RGVmYXVsdFZhbHVlKHR5cGUsIGZlYXR1cmUsIGRlZmF1bHRWYWx1ZSk7Ci0JCXNldERlZmF1bHRWYWx1ZSh0eXBlLCBmZWF0dXJlLCBkZWZhdWx0VmFsdWUsIGZlYXR1cmVUb1R5cGVkU3RhdGljRGVmYXVsdFZhbHVlc01hcCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZURlZmF1bHRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlmZWF0dXJlVG9UeXBlZERlZmF1bHRWYWx1ZXNNYXAucmVtb3ZlKGZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZURlZmF1bHRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRUNsYXNzIHR5cGUpIHsKLQkJYXNzZXJ0IGZlYXR1cmUuZ2V0RUNvbnRhaW5pbmdDbGFzcygpLmlzU3VwZXJUeXBlT2YodHlwZSk7Ci0JCU1hcDxFQ2xhc3MsIE9iamVjdD4gdHlwZVRvRGVmYXVsdFZhbHVlTWFwID0gZmVhdHVyZVRvVHlwZWREZWZhdWx0VmFsdWVzTWFwLmdldChmZWF0dXJlKTsKLQkJaWYodHlwZVRvRGVmYXVsdFZhbHVlTWFwICE9IG51bGwpIHsKLQkJCXR5cGVUb0RlZmF1bHRWYWx1ZU1hcC5yZW1vdmUodHlwZSk7Ci0JCX0KLQkJCi0JCS8vIGNsZWFyIHR5cGVUb0ZlYXR1cmVEZWZhdWx0VmFsdWVNYXAgc28gdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSByZWNhbGN1bGF0ZWQgZm9yIGVhY2ggY2xhc3MKLQkJLy8KLQkJdHlwZVRvRmVhdHVyZURlZmF1bHRWYWx1ZU1hcC5jbGVhcigpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2lnbkRlZmF1bHRWYWx1ZXMoRU9iamVjdCBlT2JqZWN0LCBNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBPYmplY3Q+IGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCkgewotCQlpZihmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PEVTdHJ1Y3R1cmFsRmVhdHVyZSwgT2JqZWN0Pj4gaXRlciA9IGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcAotCQkJCS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5PEVTdHJ1Y3R1cmFsRmVhdHVyZSwgT2JqZWN0PiBlbnRyeSA9IGl0ZXIubmV4dCgpOwotCQkJZU9iamVjdC5lU2V0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgYXNzaWduRGVmYXVsdFZhbHVlcyhFT2JqZWN0IGVPYmplY3QpIHsKLQkJRUNsYXNzIHR5cGUgPSBlT2JqZWN0LmVDbGFzcygpOwotCQlNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBPYmplY3Q+IGZlYXR1cmVUb1N0YXRpY0RlZmF1bHRWYWx1ZU1hcCA9IGdldEZlYXR1cmVUb1N0YXRpY0RlZmF1bHRWYWx1ZU1hcCh0eXBlKTsKLQkJYXNzaWduRGVmYXVsdFZhbHVlcyhlT2JqZWN0LCBmZWF0dXJlVG9TdGF0aWNEZWZhdWx0VmFsdWVNYXApOwotCQlNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBPYmplY3Q+IGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCA9IGdldEZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcChlT2JqZWN0LmVDbGFzcygpKTsKLQkJaWYoZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwICE9IGZlYXR1cmVUb1N0YXRpY0RlZmF1bHRWYWx1ZU1hcCkgewotCQkJYXNzaWduRGVmYXVsdFZhbHVlcyhlT2JqZWN0LCBmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXApOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL0V2ZW50VHlwZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9FdmVudFR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MjE1MzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL0V2ZW50VHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotLyoqCi0gKiBEZWZpbmVzIGFkZGl0aW9uYWwgbm90aWZpY2F0aW9uIGV2ZW50IHR5cGVzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEV2ZW50VHlwZXMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFLRV9QUk9YWSA9IE5vdGlmaWNhdGlvbi5FVkVOVF9UWVBFX0NPVU5UICsgMTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL09wcG9zaXRlRmVhdHVyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL09wcG9zaXRlRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTQ2MmE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9PcHBvc2l0ZUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIFN1cHBvcnRzIHRoZSByZXZlcnNlIHRyYXZlcnNhbCBvZiBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byBtb2RlbCBvYmplY3RzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcHBvc2l0ZUZlYXR1cmUgewotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIHRhcmdldEZlYXR1cmU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNNYW55OwotCi0JcHJpdmF0ZSBib29sZWFuIHJlc29sdmVPd25lciA9IHRydWU7Ci0KLQlwcml2YXRlIENsYXNzIG93bmVyQ2xhc3M7Ci0KLQkvL3ByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVsaXZlck9uUmVzb2x2ZTsKLQotCS8qKgotCSAqIE1hcHMgc291cmNlIG1vZGVsIG9iamVjdHMgdG8gT3Bwb3NpdGVGZWF0dXJlIG9iamVjdHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNYXAgY2xhc3NPcHBvc2l0ZUZlYXR1cmVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIE1hcHMgRVN0cnVjdHVyYWxGZWF0dXJlIG9iamVjdHMgdG8gT3Bwb3NpdGVGZWF0dXJlIG9iamVjdHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNYXAgZmVhdHVyZU9wcG9zaXRlRmVhdHVyZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBvd25lckNsYXNzCi0JICogICAgICAgICAgICB0aGUgbW9kZWwgY2xhc3MgdGhhdCBvd25zIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGlzIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiBAcGFyYW0gdGFyZ2V0RmVhdHVyZQotCSAqICAgICAgICAgICAgdGhlIGZlYXR1cmUgd2hpY2ggdGhpcyBvcHBvc2l0ZSBmZWF0dXJlIGlzIGJhc2VkIG9uCi0JICogQHBhcmFtIGlzTWFueQotCSAqICAgICAgICAgICAgaWYgPHRydWU+LCB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSBhc3NvY2lhdGlvbiBpcyB1bmJvdW5kZWQKLQkgKiBAcGFyYW0gcmVzb2x2ZU93bmVyCi0JICogICAgICAgICAgICBpZiA8dHJ1ZT4sIHJlc29sdmUgdGhlIG93bmVyIGNsYXNzIGlmIGl0IGlzIGEgcHJveHkKLQkgKi8KLQlwdWJsaWMgT3Bwb3NpdGVGZWF0dXJlKENsYXNzIG93bmVyQ2xhc3MsIFN0cmluZyBuYW1lLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHRhcmdldEZlYXR1cmUsIGJvb2xlYW4gaXNNYW55LAotCQkJYm9vbGVhbiByZXNvbHZlT3duZXIpIHsKLQkJdGhpcy5vd25lckNsYXNzID0gb3duZXJDbGFzczsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy50YXJnZXRGZWF0dXJlID0gdGFyZ2V0RmVhdHVyZTsKLQkJdGhpcy5pc01hbnkgPSBpc01hbnk7Ci0JCXRoaXMucmVzb2x2ZU93bmVyID0gcmVzb2x2ZU93bmVyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG93bmVyQ2xhc3MKLQkgKiAgICAgICAgICAgIHRoZSBtb2RlbCBjbGFzcyB0aGF0IG93bnMgdGhpcyBvcHBvc2l0ZSBmZWF0dXJlCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZQotCSAqIEBwYXJhbSB0YXJnZXRGZWF0dXJlCi0JICogICAgICAgICAgICB0aGUgZmVhdHVyZSB3aGljaCB0aGlzIG9wcG9zaXRlIGZlYXR1cmUgaXMgYmFzZWQgb24KLQkgKiBAcGFyYW0gaXNNYW55Ci0JICogICAgICAgICAgICBpZiA8dHJ1ZT4sIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIGFzc29jaWF0aW9uIGlzIHVuYm91bmRlZAotCSAqLwotCXB1YmxpYyBPcHBvc2l0ZUZlYXR1cmUoQ2xhc3Mgb3duZXJDbGFzcywgU3RyaW5nIG5hbWUsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgdGFyZ2V0RmVhdHVyZSwgYm9vbGVhbiBpc01hbnkpIHsKLQkJdGhpcyhvd25lckNsYXNzLCBuYW1lLCB0YXJnZXRGZWF0dXJlLCBpc01hbnksIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1vZGFsIGNsYXNzIHRoYXQgb3ducyB0aGlzIG9wcG9zaXRlIGZlYXR1cmUuCi0JICogCi0JICogQHJldHVybiB0aGUgbW9kYWwgY2xhc3MgdGhhdCBvd25zIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRPd25lckNsYXNzKCkgewotCQlyZXR1cm4gb3duZXJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgYXNzb2NpYXRpb24gaXMgdW5ib3VuZGVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFzc29jaWF0aW9uIGlzIHVuYm91bmRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWFueSgpIHsKLQkJcmV0dXJuIGlzTWFueTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuYW1lIG9mIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGZlYXR1cmUgd2hpY2ggdGhpcyBvcHBvc2l0ZSBmZWF0dXJlIGlzIGJhc2VkIG9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9yaWdpbmFsIGZlYXR1cmUgZ2VuZXJhdGVkIGJ5IEVNRgotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0VGFyZ2V0RmVhdHVyZSgpIHsKLQkJcmV0dXJuIHRhcmdldEZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgSUQgb2YgdGhpcyBvcHBvc2l0ZSBmZWF0dXJlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9wcG9zaXRlIGZlYXR1cmUgSUQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIC0xIC0gdGFyZ2V0RmVhdHVyZS5nZXRGZWF0dXJlSUQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgb3duZXIgY2xhc3Mgb2YgdGhpcyBvcHBvc2l0ZSBmZWF0dXJlLCBpZiBwcm94aWVkLAotCSAqIHNob3VsZCBiZSByZXNvbHZlZCB3aGVuIHRoZSB0YXJnZXQgZmVhdHVyZSBpcyBzZXQuCi0JICogCi0JICogQHJldHVybiA8dHJ1ZT4gaWYgdGhlIG93bmVyIGNsYXNzLCBpZiBwcm94aWVkLCBzaG91bGQgYmUgcmVzb2x2ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXNvbHZlT3duZXIoKSB7Ci0JCXJldHVybiByZXNvbHZlT3duZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9wcG9zaXRlIGZlYXR1cmUuCi0JICogCi0JICogQHJldHVybiBBIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUga2V5IGF0dHJpYnV0ZXMgb2YgdGhpcwotCSAqICAgICAgICAgb3Bwb3NpdGUgZmVhdHVyZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gbmFtZSArICJbdGFyZ2V0RmVhdHVyZT0iICsgdGFyZ2V0RmVhdHVyZSAvLyROT04tTkxTLTEkCi0JCQkJKyAiLCBpc01hbnk9IiArIGlzTWFueSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIHRoZSBnaXZlbiBvcHBvc2l0ZSBmZWF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBvcHBvc2l0ZUZlYXR1cmUKLQkgKiAgICAgICAgICAgIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIHRvIHJlZ2lzdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHJlZ2lzdGVyT3Bwb3NpdGVGZWF0dXJlKAotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSkgewotCQlDbGFzcyBjbHMgPSBvcHBvc2l0ZUZlYXR1cmUuZ2V0T3duZXJDbGFzcygpOwotCQlTZXQgZmVhdHVyZXMgPSAoU2V0KSBjbGFzc09wcG9zaXRlRmVhdHVyZXNNYXAuZ2V0KGNscyk7Ci0JCWlmIChmZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlmZWF0dXJlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQljbGFzc09wcG9zaXRlRmVhdHVyZXNNYXAucHV0KGNscywgZmVhdHVyZXMpOwotCQl9Ci0JCWZlYXR1cmVzLmFkZChvcHBvc2l0ZUZlYXR1cmUpOwotCi0JCWZlYXR1cmVPcHBvc2l0ZUZlYXR1cmVNYXAucHV0KG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCksCi0JCQkJb3Bwb3NpdGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIGEgcHJveHkgb3duZXIgY2xhc3MgaXMgcmVzb2x2ZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBub3RpZmljYXRpb24gaXMgYmVpbmcgc2VudCB3aGVuIGEgcHJveHkKLQkgKiAgICAgICAgIG93bmVyIGNsYXNzIGlzIHJlc29sdmVkCi0JICovCi0JLyoKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNEZWxpdmVyT25SZXNvbHZlKCkgewotCQlyZXR1cm4gZGVsaXZlck9uUmVzb2x2ZTsKLQl9Ci0JKi8KLQotCS8qKgotCSAqIEVuYWJsZXMgbm90aWZpY2F0aW9uIHdoZW4gYSBwcm94eSBvd25lciBjbGFzcyBpcyByZXNvbHZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZW5hYmxlTm90aWZpY2F0aW9uCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgc2VuZCBub3RpZmljYXRpb24gd2hlbiBhIHByb3h5IG93bmVyCi0JICogICAgICAgICAgICBjbGFzcyBpcyByZXNvbHZlZAotCSAqLwotCS8qCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNldERlbGl2ZXJPblJlc29sdmUoYm9vbGVhbiBlbmFibGVOb3RpZmljYXRpb24pIHsKLQkJZGVsaXZlck9uUmVzb2x2ZSA9IGVuYWJsZU5vdGlmaWNhdGlvbjsKLQl9Ci0JKi8KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wcG9zaXRlIGZlYXR1cmUgZm9yIHRoZSBnaXZlbiBmZWF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBhbiBFTUYgPGNvZGU+RVN0cnVjdHVyYWxGZWF0dXJlPC9jb2RlPiBmZWF0dXJlCi0JICogQHJldHVybiBhbiBvcHBvc2l0ZSBmZWF0dXJlIHRoYXQgaXMgYmFzZWQgb24gdGhlIGdpdmVuIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBnZXRPcHBvc2l0ZUZlYXR1cmUoCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gKE9wcG9zaXRlRmVhdHVyZSkgZmVhdHVyZU9wcG9zaXRlRmVhdHVyZU1hcC5nZXQoZmVhdHVyZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMjFiZTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL09wcG9zaXRlRmVhdHVyZU5vdGlmaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotCi0vKioKLSAqIE5vdGlmaWNhdGlvbiBhc3NvY2lhdGVkIHdpdGggYW4gb3Bwb3NpdGUgZmVhdHVyZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9wcG9zaXRlRmVhdHVyZU5vdGlmaWNhdGlvbiBleHRlbmRzIE5vdGlmaWNhdGlvbkltcGwgewotCi0JcHJpdmF0ZSBPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlOwotCi0JcHJpdmF0ZSBPYmplY3Qgbm90aWZpZXI7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBldmVudAotCSAqIEBwYXJhbSBvcHBvc2l0ZUZlYXR1cmUKLQkgKiAgICAgICAgICAgIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vdGlmaWNhdGlvbgotCSAqIEBwYXJhbSBvbGRWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIG9sZCB2YWx1ZQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZQotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIHBvc2l0aXRpb24gYXQgd2hpY2ggdGhlIGNoYW5nZSBvY2N1cnJlZAotCSAqIEBwYXJhbSB3YXNTZXQKLQkgKi8KLQlwdWJsaWMgT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uKE9iamVjdCBub3RpZmllciwgaW50IGV2ZW50VHlwZSwKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLAotCQkJaW50IHBvc2l0aW9uLCBib29sZWFuIHdhc1NldCkgewotCQlzdXBlcihldmVudFR5cGUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgcG9zaXRpb24sIHdhc1NldCk7Ci0JCXRoaXMubm90aWZpZXIgPSBub3RpZmllcjsKLQkJdGhpcy5vcHBvc2l0ZUZlYXR1cmUgPSBvcHBvc2l0ZUZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgb3Bwb3NpdGUgZmVhdHVyZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vdGlmaWNhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vdGlmaWNhdGlvbgotCSAqLwotCXB1YmxpYyBPcHBvc2l0ZUZlYXR1cmUgZ2V0T3Bwc2l0ZUZlYXR1cmUoKSB7Ci0JCXJldHVybiBvcHBvc2l0ZUZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGwjZ2V0Tm90aWZpZXIoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Tm90aWZpZXIoKSB7Ci0JCXJldHVybiBub3RpZmllcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9PcHBvc2l0ZUZlYXR1cmVSZXNvbHZpbmdFTGlzdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL09wcG9zaXRlRmVhdHVyZVJlc29sdmluZ0VMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNTM0ZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL09wcG9zaXRlRmVhdHVyZVJlc29sdmluZ0VMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZ5aW5nTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci0KLS8qKgotICogQSBsaXN0IGZvciByZXNvbHZpbmcgbXVsdGktdmFsdWVkIG9wcG9zaXRlIGZlYXR1cmVzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3Bwb3NpdGVGZWF0dXJlUmVzb2x2aW5nRUxpc3QgZXh0ZW5kcyBOb3RpZnlpbmdMaXN0SW1wbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzNjkwMTk4NzYzMDAwMDUxNzY4TDsKLQotCXByaXZhdGUgTXVsdGlSZXNvdXJjZUVPYmplY3Qgb3duZXI7Ci0KLQlwcml2YXRlIE9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqICAgICAgICAgICAgdGhlIG93bmVyIG9mIGFuIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiBAcGFyYW0gb3Bwb3NpdGVGZWF0dXJlCi0JICogICAgICAgICAgICBhbiBvcHBvc2l0ZSBmZWF0dXJlCi0JICovCi0JcHVibGljIE9wcG9zaXRlRmVhdHVyZVJlc29sdmluZ0VMaXN0KE11bHRpUmVzb3VyY2VFT2JqZWN0IG93bmVyLAotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSkgewotCQlzdXBlcigpOwotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCXRoaXMub3Bwb3NpdGVGZWF0dXJlID0gb3Bwb3NpdGVGZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZnlpbmdMaXN0SW1wbCNnZXROb3RpZmllcigpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXROb3RpZmllcigpIHsKLQkJcmV0dXJuIG93bmVyOwotCX0KLQotCXByb3RlY3RlZCBFT2JqZWN0IHJlc29sdmVQcm94eShFT2JqZWN0IGVPYmplY3QpIHsKLQkJcmV0dXJuIGVPYmplY3QuZUlzUHJveHkoKSA/IG93bmVyCi0JCQkJLmVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCkgZU9iamVjdCkgOiBlT2JqZWN0OwotCX0KLQotCXByb3RlY3RlZCBOb3RpZmljYXRpb25JbXBsIGNyZWF0ZU5vdGlmaWNhdGlvbihpbnQgZXZlbnRUeXBlLAotCQkJT2JqZWN0IG9sZE9iamVjdCwgT2JqZWN0IG5ld09iamVjdCwgaW50IGluZGV4LCBib29sZWFuIHdhc1NldCkgewotCQlyZXR1cm4gbmV3IE9wcG9zaXRlRmVhdHVyZU5vdGlmaWNhdGlvbihvd25lciwgZXZlbnRUeXBlLAotCQkJCW9wcG9zaXRlRmVhdHVyZSwgb2xkT2JqZWN0LCBuZXdPYmplY3QsIGluZGV4LCB3YXNTZXQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTm90aWZpY2F0aW9uUmVxdWlyZWQoKSB7Ci0JCXJldHVybiBvd25lci5lTm90aWZpY2F0aW9uUmVxdWlyZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlc29sdmUoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpKQotCQkJcmV0dXJuIG9iamVjdDsKLQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIG9iamVjdDsKLQkJRU9iamVjdCByZXNvbHZlZCA9IHJlc29sdmVQcm94eShlT2JqZWN0KTsKLQkJaWYgKHJlc29sdmVkICE9IGVPYmplY3QpIHsKLQkJCU9iamVjdCBvbGRPYmplY3QgPSBkYXRhW2luZGV4XTsKLQkJCWFzc2lnbihpbmRleCwgdmFsaWRhdGUoaW5kZXgsIHJlc29sdmVkKSk7Ci0KLQkJCWRpZFNldChpbmRleCwgcmVzb2x2ZWQsIG9sZE9iamVjdCk7Ci0KLQkJCS8vIGlmIChpc05vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkvLyB7Ci0JCQkvLyBvd25lci5lTm90aWZ5KGNyZWF0ZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24uUkVTT0xWRSwgZU9iamVjdCwKLQkJCS8vIHJlc29sdmVkLCBpbmRleCwgZmFsc2UpKTsKLQkJCS8vIH0KLQotCQkJcmV0dXJuIHJlc29sdmVkOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVPYmplY3Q7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVEYW5nbGluZ09iamVjdHMoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqLmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgbGlzdCB0aGF0IHN0b3JlcyB0aGUgb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZXMuCi0JICogCi0JICogQHJldHVybiBhbiB1bm1vZGlmaWFibGUgbGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFVubW9kaWZpYWJsZUxpc3QoKSB7Ci0JCXJlbW92ZURhbmdsaW5nT2JqZWN0cygpOwotCQlyZXR1cm4gbmV3IFVubW9kaWZpYWJsZUVMaXN0KHNpemUsIGRhdGEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZWZlNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIHRoZSBVTUEgRWNvcmUgZXh0ZW5zaW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzL0hlYWRlci5qYXZhamV0aW5jIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMvSGVhZGVyLmphdmFqZXRpbmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMDU2OWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMvSGVhZGVyLmphdmFqZXRpbmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMvbW9kZWwvQ2xhc3MuamF2YWpldCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzL21vZGVsL0NsYXNzLmphdmFqZXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZDZlNTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMvbW9kZWwvQ2xhc3MuamF2YWpldAorKysgL2Rldi9udWxsCkBAIC0xLDIwMTAgKzAsMCBAQAotPCVAIGpldCBwYWNrYWdlPSJvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5lY29yZS50ZW1wbGF0ZXMubW9kZWwiIGltcG9ydHM9ImphdmEudXRpbC4qIG9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLmVjb3JlLmdlbm1vZGVsLioiIGNsYXNzPSJDbGFzcyIgdmVyc2lvbj0iJElkOiBDbGFzcy5qYXZhamV0LHYgMS4yIDIwMDgvMDEvMjIgMDE6NTI6MzMgcGxlIEV4cCAkIiAlPgotPCUKLS8qKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICovCi0lPgotPCVmaW5hbCBHZW5DbGFzcyBnZW5DbGFzcyA9IChHZW5DbGFzcykoKE9iamVjdFtdKWFyZ3VtZW50KVswXTsgZmluYWwgR2VuUGFja2FnZSBnZW5QYWNrYWdlID0gZ2VuQ2xhc3MuZ2V0R2VuUGFja2FnZSgpOyBmaW5hbCBHZW5Nb2RlbCBnZW5Nb2RlbD1nZW5QYWNrYWdlLmdldEdlbk1vZGVsKCk7JT4KLTwlZmluYWwgYm9vbGVhbiBpc0ludGVyZmFjZSA9IEJvb2xlYW4uVFJVRS5lcXVhbHMoKChPYmplY3RbXSlhcmd1bWVudClbMV0pOyBmaW5hbCBib29sZWFuIGlzSW1wbGVtZW50YXRpb24gPSBCb29sZWFuLlRSVUUuZXF1YWxzKCgoT2JqZWN0W10pYXJndW1lbnQpWzJdKTslPgotPCVmaW5hbCBTdHJpbmcgcHVibGljU3RhdGljRmluYWxGbGFnID0gaXNJbXBsZW1lbnRhdGlvbiA/ICJwdWJsaWMgc3RhdGljIGZpbmFsICIgOiAiIjslPgotPCVmaW5hbCBTdHJpbmcgc2luZ2xlV2lsZGNhcmQgPSBnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwID8gIjw/PiIgOiAiIjslPgotPCVmaW5hbCBTdHJpbmcgbmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uID0gZ2VuQ2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiAtICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQobnVsbCkgOiAiIjslPgotPCVmaW5hbCBTdHJpbmcgcG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uID0gZ2VuQ2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQobnVsbCkgOiAiIjslPgotPCVAIGluY2x1ZGUgZmlsZT0iLi4vSGVhZGVyLmphdmFqZXRpbmMiJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLXBhY2thZ2UgPCU9Z2VuUGFja2FnZS5nZXRJbnRlcmZhY2VQYWNrYWdlTmFtZSgpJT47Ci08JX0gZWxzZSB7JT4KLXBhY2thZ2UgPCU9Z2VuUGFja2FnZS5nZXRDbGFzc1BhY2thZ2VOYW1lKCklPjsKLTwlfSU+Ci0KLTwlZ2VuTW9kZWwubWFya0ltcG9ydExvY2F0aW9uKHN0cmluZ0J1ZmZlciwgZ2VuUGFja2FnZSk7JT4KLQotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+PCU9Z2VuQ2xhc3MuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08JWlmIChnZW5DbGFzcy5oYXNEb2N1bWVudGF0aW9uKCkpIHslPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogPCU9Z2VuQ2xhc3MuZ2V0RG9jdW1lbnRhdGlvbihnZW5Nb2RlbC5nZXRJbmRlbnRhdGlvbihzdHJpbmdCdWZmZXIpKSU+Ci0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci08JX0lPgotICoKLTwlaWYgKCFnZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLTwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpKSB7JT4KLSAgPCVpZiAoIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkR2V0VmlzaWJpbGl0eSgpKSB7JT4KLSAqICAgPGxpPntAbGluayA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPiA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fTwvbGk+Ci0gIDwlfSU+Ci08JX0lPgotICogPC91bD4KLSAqIDwvcD4KLTwlfSU+Ci0gKgotPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNZXRhRGF0YSgpKSB7JT4KLSAqIEBzZWUgPCU9Z2VuUGFja2FnZS5nZXRRdWFsaWZpZWRQYWNrYWdlSW50ZXJmYWNlTmFtZSgpJT4jZ2V0PCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NpZmllckFjY2Vzc29yTmFtZSgpJT4oKQotPCV9JT4KLTwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTW9kZWxUYWdzKCkpIHsgYm9vbGVhbiBmaXJzdCA9IHRydWU7IGZvciAoU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZ2VuQ2xhc3MuZ2V0TW9kZWxJbmZvKCksICJcblxyIik7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgeyBTdHJpbmcgbW9kZWxJbmZvID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOyBpZiAoZmlyc3QpIHsgZmlyc3QgPSBmYWxzZTslPgotICogQG1vZGVsIDwlPW1vZGVsSW5mbyU+Ci08JX0gZWxzZSB7JT4KLSAqICAgICAgICA8JT1tb2RlbEluZm8lPgotPCV9fSBpZiAoZmlyc3QpIHslPgotICogQG1vZGVsCi08JX19JT4KLTwlaWYgKGdlbkNsYXNzLm5lZWRzUm9vdEV4dGVuZHNJbnRlcmZhY2VFeHRlbmRzVGFnKCkpIHslPgotICogQGV4dGVuZHMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKGdlbk1vZGVsLmdldFJvb3RFeHRlbmRzSW50ZXJmYWNlKCkpJT4KLTwlfSU+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLTwlfSBlbHNlIHslPgotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPjwlPWdlbkNsYXNzLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci08JWlmICghZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLTwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkpIHslPgotICogICA8bGk+e0BsaW5rIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZENsYXNzTmFtZSgpJT4jPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn08L2xpPgotPCV9JT4KLSAqIDwvdWw+Ci08JX0lPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24pIHslPgotcHVibGljPCVpZiAoZ2VuQ2xhc3MuaXNBYnN0cmFjdCgpKSB7JT4gYWJzdHJhY3Q8JX0lPiBjbGFzcyA8JT1nZW5DbGFzcy5nZXRDbGFzc05hbWUoKSU+PCU9Z2VuQ2xhc3MuZ2V0VHlwZVBhcmFtZXRlcnMoKS50cmltKCklPjwlPWdlbkNsYXNzLmdldENsYXNzRXh0ZW5kcygpJT48JT1nZW5DbGFzcy5nZXRDbGFzc0ltcGxlbWVudHMoKSU+Ci08JX0gZWxzZSB7JT4KLXB1YmxpYyBpbnRlcmZhY2UgPCU9Z2VuQ2xhc3MuZ2V0SW50ZXJmYWNlTmFtZSgpJT48JT1nZW5DbGFzcy5nZXRUeXBlUGFyYW1ldGVycygpLnRyaW0oKSU+PCU9Z2VuQ2xhc3MuZ2V0SW50ZXJmYWNlRXh0ZW5kcygpJT4KLTwlfSU+Ci17Ci08JWlmIChnZW5Nb2RlbC5oYXNDb3B5cmlnaHRGaWVsZCgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQk8JT1wdWJsaWNTdGF0aWNGaW5hbEZsYWclPjwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS5sYW5nLlN0cmluZyIpJT4gY29weXJpZ2h0ID0gPCU9Z2VuTW9kZWwuZ2V0Q29weXJpZ2h0RmllbGRMaXRlcmFsKCklPjs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbk1vZGVsLmdldERyaXZlck51bWJlcigpICE9IG51bGwpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLmxhbmcuU3RyaW5nIiklPiBtb2ZEcml2ZXJOdW1iZXIgPSAiPCU9Z2VuTW9kZWwuZ2V0RHJpdmVyTnVtYmVyKCklPiI7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5pc0phdmFJT1NlcmlhbGl6YWJsZSgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7IFN0cmluZyBlVmlydHVhbFZhbHVlc0ZpZWxkID0gZ2VuQ2xhc3MuZ2V0RVZpcnR1YWxWYWx1ZXNGaWVsZCgpOyU+Ci0gIDwlaWYgKGVWaXJ0dWFsVmFsdWVzRmllbGQgIT0gbnVsbCkgeyU+Ci0JLyoqCi0JICogQW4gYXJyYXkgb2Ygb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBvZiBub24tcHJpbWl0aXZlIGZlYXR1cmVzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3RbXSA8JT1lVmlydHVhbFZhbHVlc0ZpZWxkJT47Ci0KLSAgPCV9JT4KLSAgPCV7IExpc3Q8U3RyaW5nPiBlVmlydHVhbEluZGV4Qml0RmllbGRzID0gZ2VuQ2xhc3MuZ2V0RVZpcnR1YWxJbmRleEJpdEZpZWxkcyhuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7JT4KLSAgICA8JWlmICghZVZpcnR1YWxJbmRleEJpdEZpZWxkcy5pc0VtcHR5KCkpIHslPgotICAgICAgPCVmb3IgKFN0cmluZyBlVmlydHVhbEluZGV4Qml0RmllbGQgOiBlVmlydHVhbEluZGV4Qml0RmllbGRzKSB7JT4KLQkvKioKLQkgKiBBIGJpdCBmaWVsZCByZXByZXNlbnRpbmcgdGhlIGluZGljZXMgb2Ygbm9uLXByaW1pdGl2ZSBmZWF0dXJlIHZhbHVlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IDwlPWVWaXJ0dWFsSW5kZXhCaXRGaWVsZCU+OwotCi0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5pc01vZGVsUm9vdCgpICYmIGdlbk1vZGVsLmlzQm9vbGVhbkZsYWdzRW5hYmxlZCgpICYmIGdlbk1vZGVsLmdldEJvb2xlYW5GbGFnc1Jlc2VydmVkQml0cygpID09IC0xKSB7JT4KLQkvKioKLQkgKiBBIHNldCBvZiBiaXQgZmxhZ3MgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgb2YgYm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCB3aGV0aGVyIHVuc2V0dGFibGUgZmVhdHVyZXMgaGF2ZSBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgPCU9Z2VuTW9kZWwuZ2V0Qm9vbGVhbkZsYWdzRmllbGQoKSU+ID0gMDsKLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0gIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXREZWNsYXJlZEZpZWxkR2VuRmVhdHVyZXMoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9kZWNsYXJlZEZpZWxkR2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpIHx8IGdlbkZlYXR1cmUuaXNSZWZlcmVuY2VUeXBlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRJbnRlcm5hbFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0KLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC5pc0FycmF5QWNjZXNzb3JzKCkgJiYgZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpICYmICFnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7IFN0cmluZyByYXdMaXN0SXRlbVR5cGUgPSBnZW5GZWF0dXJlLmdldFJhd0xpc3RJdGVtVHlwZSgpOyBpbnQgaW5kZXggPSByYXdMaXN0SXRlbVR5cGUuaW5kZXhPZignWycpOyBTdHJpbmcgaGVhZCA9IHJhd0xpc3RJdGVtVHlwZTsgU3RyaW5nIHRhaWwgPSAiIjsgaWYgKGluZGV4ICE9IC0xKSB7IGhlYWQgPSByYXdMaXN0SXRlbVR5cGUuc3Vic3RyaW5nKDAsIGluZGV4KTsgdGFpbCA9IHJhd0xpc3RJdGVtVHlwZS5zdWJzdHJpbmcoaW5kZXgpOyB9ICU+Ci0JLyoqCi0JICogVGhlIGVtcHR5IHZhbHVlIGZvciB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBcnJheUFjY2Vzc29yKCklPigpIDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyBhcnJheSBhY2Nlc3Nvci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QXJyYXlBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmdldFF1YWxpZmllZExpc3RJdGVtVHlwZShnZW5DbGFzcykuY29udGFpbnMoIjwiKSkgeyU+Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIDwlfSU+Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCA8JT1yYXdMaXN0SXRlbVR5cGUlPltdIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRU1QVFlfQVJSQVkgPSBuZXcgPCU9aGVhZCU+IFswXTwlPXRhaWwlPjsKLQotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaGFzRURlZmF1bHQoKSAmJiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpIHx8ICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgKCFnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpIHx8ICFnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSkpIHsgU3RyaW5nIHN0YXRpY0RlZmF1bHRWYWx1ZSA9IGdlbkZlYXR1cmUuZ2V0U3RhdGljRGVmYXVsdFZhbHVlKCk7JT4KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgICAgIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkgJiYgZ2VuRmVhdHVyZS5pc0xpc3REYXRhVHlwZSgpICYmIGdlbkZlYXR1cmUuaXNTZXREZWZhdWx0VmFsdWUoKSkgeyU+Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIDwlfSU+Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCA8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjwlaWYgKCIiLmVxdWFscyhzdGF0aWNEZWZhdWx0VmFsdWUpKSB7JT47IC8vIFRPRE8gVGhlIGRlZmF1bHQgdmFsdWUgbGl0ZXJhbCAiPCU9Z2VuRmVhdHVyZS5nZXRFY29yZUZlYXR1cmUoKS5nZXREZWZhdWx0VmFsdWVMaXRlcmFsKCklPiIgaXMgbm90IHZhbGlkLjwlfSBlbHNlIHslPiA9IDwlPXN0YXRpY0RlZmF1bHRWYWx1ZSU+OzwlPWdlbk1vZGVsLmdldE5vbk5MUyhzdGF0aWNEZWZhdWx0VmFsdWUpJT48JX0lPgotCi0gICAgICA8JX0lPgotICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuZ2V0RmxhZ0luZGV4KGdlbkZlYXR1cmUpID4gMzEgJiYgZ2VuQ2xhc3MuZ2V0RmxhZ0luZGV4KGdlbkZlYXR1cmUpICUgMzIgPT0gMCkgeyU+Ci0JLyoqCi0JICogQW4gYWRkaXRpb25hbCBzZXQgb2YgYml0IGZsYWdzIHJlcHJlc2VudGluZyB0aGUgdmFsdWVzIG9mIGJvb2xlYW4gYXR0cmlidXRlcyBhbmQgd2hldGhlciB1bnNldHRhYmxlIGZlYXR1cmVzIGhhdmUgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiA9IDA7Ci0KLSAgICAgICAgICA8JX0lPgotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRyA9IDEgPCU9Ijw8ICIgKyBnZW5DbGFzcy5nZXRGbGFnSW5kZXgoZ2VuRmVhdHVyZSkgJSAzMiAlPjsKLQotICAgICAgICA8JX0gZWxzZSB7JT4KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpIDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT48JWlmIChnZW5GZWF0dXJlLmhhc0VEZWZhdWx0KCkpIHslPiA9IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+PCV9JT47Ci0KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5DbGFzcy5pc0VTZXRGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuZ2V0RVNldEZsYWdJbmRleChnZW5GZWF0dXJlKSA+IDMxICYmIGdlbkNsYXNzLmdldEVTZXRGbGFnSW5kZXgoZ2VuRmVhdHVyZSkgJSAzMiA9PSAwKSB7JT4KLQkvKioKLQkgKiBBbiBhZGRpdGlvbmFsIHNldCBvZiBiaXQgZmxhZ3MgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgb2YgYm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCB3aGV0aGVyIHVuc2V0dGFibGUgZmVhdHVyZXMgaGF2ZSBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiA9IDA7Ci0KLSAgICAgICAgPCV9JT4KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgd2hldGhlciB0aGUgPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPiA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcgPSAxIDwlPSI8PCAiICsgZ2VuQ2xhc3MuZ2V0RVNldEZsYWdJbmRleChnZW5GZWF0dXJlKSAlIDMyICU+OwotCi0gICAgICA8JX0gZWxzZSB7JT4KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIDwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4gaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLQotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZGVjbGFyZWRGaWVsZEdlbkZlYXR1cmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZGVjbGFyZWRGaWVsZEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgJiYgIWdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCA8JT1nZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQobnVsbCklPiA9IDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZENsYXNzaWZpZXJBY2Nlc3NvcigpJT4uZ2V0RmVhdHVyZUlEKDwlPWdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5nZXQoMCkuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPikgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmdldCgwKSklPjsKLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuQ2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkpIHslPgotICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpKSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTslPgotICAgIDwlaWYgKHJldmVyc2VGZWF0dXJlICE9IG51bGwgJiYgcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKS5oYXNPZmZzZXRDb3JyZWN0aW9uKCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCA8JT1nZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQoZ2VuRmVhdHVyZSklPiA9IDwlPXJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCkuZ2V0UXVhbGlmaWVkQ2xhc3NpZmllckFjY2Vzc29yKCklPi5nZXRGZWF0dXJlSUQoPCU9cmV2ZXJzZUZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPikgLSA8JT1yZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjsKLQotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JPCVpZiAoZ2VuTW9kZWwuaXNQdWJsaWNDb25zdHJ1Y3RvcnMoKSkgeyU+cHVibGljPCV9IGVsc2UgeyU+cHJvdGVjdGVkPCV9JT4gPCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NOYW1lKCklPigpCi0JewotCQlzdXBlcigpOwotICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RmxhZ0dlbkZlYXR1cmVzKCJ0cnVlIikpIHslPgotCQk8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOwotICA8JX0lPgotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwcm90ZWN0ZWQgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzIiklPiBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZENsYXNzaWZpZXJBY2Nlc3NvcigpJT47Ci0JfQotCi08JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvcmVmbGVjdGl2ZURlbGVnYXRpb24ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuTW9kZWwuZ2V0RmVhdHVyZURlbGVnYXRpb24oKSA9PSBHZW5EZWxlZ2F0aW9uS2luZC5SRUZMRUNUSVZFX0xJVEVSQUwgJiYgKGdlbkNsYXNzLmdldENsYXNzRXh0ZW5kc0dlbkNsYXNzKCkgPT0gbnVsbCB8fCBnZW5DbGFzcy5nZXRDbGFzc0V4dGVuZHNHZW5DbGFzcygpLmdldEdlbk1vZGVsKCkuZ2V0RmVhdHVyZURlbGVnYXRpb24oKSAhPSBHZW5EZWxlZ2F0aW9uS2luZC5SRUZMRUNUSVZFX0xJVEVSQUwpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHJvdGVjdGVkIGludCBlU3RhdGljRmVhdHVyZUNvdW50KCkKLQl7Ci0JCXJldHVybiA8JT1nZW5DbGFzcy5nZXRDbGFzc0V4dGVuZHNHZW5DbGFzcygpID09IG51bGwgPyAwIDogZ2VuQ2xhc3MuZ2V0Q2xhc3NFeHRlbmRzR2VuQ2xhc3MoKS5nZXRBbGxHZW5GZWF0dXJlcygpLnNpemUoKSU+OwotCX0KLQotPCV9JT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvcmVmbGVjdGl2ZURlbGVnYXRpb24ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JW5ldyBSdW5uYWJsZSgpIHsgcHVibGljIHZvaWQgcnVuKCkgeyU+Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogKGlzSW1wbGVtZW50YXRpb24gPyBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkgOiBnZW5DbGFzcy5nZXREZWNsYXJlZEdlbkZlYXR1cmVzKCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLSAgPCVpZiAoZ2VuTW9kZWwuaXNBcnJheUFjY2Vzc29ycygpICYmIGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCTwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+W10gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBcnJheUFjY2Vzc29yKCklPigpOwotCi0gICAgPCV9IGVsc2UgeyU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpKSB7JT4KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgIDwlfSU+Ci0JcHVibGljIDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+W10gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBcnJheUFjY2Vzc29yKCklPigpCi0JewotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0IiklPjwlPWdlbkZlYXR1cmUuZ2V0TGlzdFRlbXBsYXRlQXJndW1lbnRzKGdlbkNsYXNzKSU+IGxpc3QgPSAoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCIpJT48JT1nZW5GZWF0dXJlLmdldExpc3RUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotCQlpZiAobGlzdC5pc0VtcHR5KCkpIHJldHVybiA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpICYmICFnZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcykuY29udGFpbnMoIjwiKSAmJiAhZ2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUobnVsbCkuZXF1YWxzKGdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSkpIHslPig8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPltdKTwlfSU+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VFTVBUWV9BUlJBWTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPT0gbnVsbCB8fCA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPi5pc0VtcHR5KCkpIHJldHVybiA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpICYmICFnZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcykuY29udGFpbnMoIjwiKSAmJiAhZ2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUobnVsbCkuZXF1YWxzKGdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSkpIHslPig8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPltdKTwlfSU+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VFTVBUWV9BUlJBWTsKLQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCIpJT48JT1nZW5GZWF0dXJlLmdldExpc3RUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPiBsaXN0ID0gKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QiKSU+PCU9Z2VuRmVhdHVyZS5nZXRMaXN0VGVtcGxhdGVBcmd1bWVudHMoZ2VuQ2xhc3MpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICA8JX0lPgotCQlsaXN0LnNocmluaygpOwotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+W10pbGlzdC5kYXRhKCk7Ci0JfQotCi0gICAgPCV9JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICA8JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT4gZ2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KGludCBpbmRleCk7Ci0KLSAgICA8JX0gZWxzZSB7JT4KLQlwdWJsaWMgPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT4gZ2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KGludCBpbmRleCkKLQl7Ci0JCXJldHVybiA8JWlmICghZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+KDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+KTwlfSU+PCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5nZXQoaW5kZXgpOwotCX0KLQotICAgIDwlfSU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCWludCBnZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT5MZW5ndGgoKTsKLQotICAgIDwlfSBlbHNlIHslPgotCXB1YmxpYyBpbnQgZ2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+TGVuZ3RoKCkKLQl7Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLnNpemUoKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPT0gbnVsbCA/IDAgOiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPi5zaXplKCk7Ci0gICAgICA8JX0lPgotCX0KLQotICAgIDwlfSU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCXZvaWQgc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+W10gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPik7Ci0KLSAgICA8JX0gZWxzZSB7JT4KLQlwdWJsaWMgdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT5bXSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KQotCXsKLQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0IiklPjwlPWdlbkZlYXR1cmUuZ2V0TGlzdFRlbXBsYXRlQXJndW1lbnRzKGdlbkNsYXNzKSU+KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLnNldERhdGEobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5sZW5ndGgsIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pOwotCX0KLQotICAgIDwlfSU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCXZvaWQgc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KGludCBpbmRleCwgPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT4gZWxlbWVudCk7Ci0KLSAgICA8JX0gZWxzZSB7JT4KLQlwdWJsaWMgdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oaW50IGluZGV4LCA8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPiBlbGVtZW50KQotCXsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5zZXQoaW5kZXgsIGVsZW1lbnQpOwotCX0KLQotICAgIDwlfSU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNHZXQoKSAmJiAoaXNJbXBsZW1lbnRhdGlvbiB8fCAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRHZXRWaXNpYmlsaXR5KCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dldEdlbkZlYXR1cmUuamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2I+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHsgR2VuRmVhdHVyZSBrZXlGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRNYXBFbnRyeVR5cGVHZW5DbGFzcygpLmdldE1hcEVudHJ5S2V5RmVhdHVyZSgpOyBHZW5GZWF0dXJlIHZhbHVlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0TWFwRW50cnlUeXBlR2VuQ2xhc3MoKS5nZXRNYXBFbnRyeVZhbHVlRmVhdHVyZSgpOyAlPgotCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSA8JWlmIChrZXlGZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+bGlzdCBvZiB7QGxpbmsgPCU9a2V5RmVhdHVyZS5nZXRRdWFsaWZpZWRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT59PCV9IGVsc2UgeyU+e0BsaW5rIDwlPWtleUZlYXR1cmUuZ2V0VHlwZShnZW5DbGFzcyklPn08JX0lPiwKLQkgKiBhbmQgdGhlIHZhbHVlIGlzIG9mIHR5cGUgPCVpZiAodmFsdWVGZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+bGlzdCBvZiB7QGxpbmsgPCU9dmFsdWVGZWF0dXJlLmdldFF1YWxpZmllZExpc3RJdGVtVHlwZShnZW5DbGFzcyklPn08JX0gZWxzZSB7JT57QGxpbmsgPCU9dmFsdWVGZWF0dXJlLmdldFR5cGUoZ2VuQ2xhc3MpJT59PCV9JT4sCi0gICAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSAmJiAhKGdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNZXRhRGF0YSgpICYmICJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIuZXF1YWxzKGdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkTGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSkpKSB7Ci1TdHJpbmcgdHlwZU5hbWUgPSBnZW5GZWF0dXJlLmdldFF1YWxpZmllZExpc3RJdGVtVHlwZShnZW5DbGFzcyk7IFN0cmluZyBoZWFkID0gdHlwZU5hbWU7IFN0cmluZyB0YWlsID0gIiI7IGludCBpbmRleCA9IHR5cGVOYW1lLmluZGV4T2YoJzwnKTsgaWYgKGluZGV4ID09IC0xKSB7IGluZGV4ID0gdHlwZU5hbWUuaW5kZXhPZignWycpOyB9IAotaWYgKGluZGV4ICE9IC0xKSB7IGhlYWQgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOyB0YWlsID0gdHlwZU5hbWUuc3Vic3RyaW5nKGluZGV4KS5yZXBsYWNlQWxsKCI8IiwgIiZsdDsiKTsgfQotJT4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgPCU9aGVhZCU+fTwlPXRhaWwlPi4KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNTZXREZWZhdWx0VmFsdWUoKSkgeyU+Ci0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+PCU9Z2VuRmVhdHVyZS5nZXREZWZhdWx0VmFsdWUoKSU+PC9jb2RlPi4KLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKSAhPSBudWxsKSB7JT4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayA8JT1nZW5GZWF0dXJlLmdldFR5cGVHZW5FbnVtKCkuZ2V0UXVhbGlmaWVkTmFtZSgpJT59LgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSAmJiAhZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCkuZ2V0R2VuQ2xhc3MoKS5pc01hcEVudHJ5KCkpIHsgR2VuRmVhdHVyZSByZXZlcnNlR2VuRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyAlPgotICAgICAgPCVpZiAoIXJldmVyc2VHZW5GZWF0dXJlLmlzU3VwcHJlc3NlZEdldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgPCU9cmV2ZXJzZUdlbkZlYXR1cmUuZ2V0R2VuQ2xhc3MoKS5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1yZXZlcnNlR2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPXJldmVyc2VHZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59Jy4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dldEdlbkZlYXR1cmUuamF2YWRvYy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgPCVpZiAoIWdlbkZlYXR1cmUuaGFzRG9jdW1lbnRhdGlvbigpKSB7JT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0gICAgPCV9JT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmhhc0RvY3VtZW50YXRpb24oKSkgeyU+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogPCU9Z2VuRmVhdHVyZS5nZXREb2N1bWVudGF0aW9uKGdlbk1vZGVsLmdldEluZGVudGF0aW9uKHN0cmluZ0J1ZmZlcikpJT4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gICAgPCV9JT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotICAgIDwlaWYgKGdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKSAhPSBudWxsKSB7JT4KLQkgKiBAc2VlIDwlPWdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKS5nZXRRdWFsaWZpZWROYW1lKCklPgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRJc1NldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjaXNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDaGFuZ2VhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkVW5zZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3Vuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ2hhbmdlYWJsZSgpICYmICFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldFJhd0ltcG9ydGVkQm91bmRUeXBlKCklPikKLSAgICA8JX0lPgotICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTWV0YURhdGEoKSkgeyU+Ci0JICogQHNlZSA8JT1nZW5QYWNrYWdlLmdldFF1YWxpZmllZFBhY2thZ2VJbnRlcmZhY2VOYW1lKCklPiNnZXQ8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkgJiYgIWdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpLmdldEdlbkNsYXNzKCkuaXNNYXBFbnRyeSgpKSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUdlbkZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgJT4KLSAgICAgIDwlaWYgKCFyZXZlcnNlR2VuRmVhdHVyZS5pc1N1cHByZXNzZWRHZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgPCU9cmV2ZXJzZUdlbkZlYXR1cmUuZ2V0R2VuQ2xhc3MoKS5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1yZXZlcnNlR2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc0VNRk1vZGVsVGFncygpKSB7IGJvb2xlYW4gZmlyc3QgPSB0cnVlOyBmb3IgKFN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGdlbkZlYXR1cmUuZ2V0TW9kZWxJbmZvKCksICJcblxyIik7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgeyBTdHJpbmcgbW9kZWxJbmZvID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOyBpZiAoZmlyc3QpIHsgZmlyc3QgPSBmYWxzZTslPgotCSAqIEBtb2RlbCA8JT1tb2RlbEluZm8lPgotICAgIDwlfSBlbHNlIHslPgotCSAqICAgICAgICA8JT1tb2RlbEluZm8lPgotICAgIDwlfX0gaWYgKGZpcnN0KSB7JT4KLQkgKiBAbW9kZWwKLSAgICA8JX19JT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JUAgZW5kICU+PCUvL0NsYXNzL2dldEdlbkZlYXR1cmUuamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfSBlbHNlIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyAvL0NsYXNzL2dldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLTwlfSU+Ci08JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLQotPCV9IGVsc2UgeyU+Ci0gIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkgJiYgKChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkgfHwgZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkpICYmICFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkZlYXR1cmUuaXNVbmNoZWNrZWRDYXN0KCkgfHwgZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgKGdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSB8fCBnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHx8IGdlbkZlYXR1cmUuaXNMaXN0RGF0YVR5cGUoKSAmJiBnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSkgeyU+Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIDwlfSU+Ci0JcHVibGljIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLQl7Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZXRHZW5GZWF0dXJlLnByZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotICAgIDwlaWYgKGdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0JCXJldHVybiA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4oPCV9JT4oPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KWVHZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCB0cnVlKTwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPikuPCU9Z2VuRmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpPCV9JT47Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0lPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPT0gbnVsbCkKLQkJewotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJZVZpcnR1YWxTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBuZXcgPCU9Z2VuQ2xhc3MuZ2V0TGlzdENvbnN0cnVjdG9yKGdlbkZlYXR1cmUpJT4pOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbmV3IDwlPWdlbkNsYXNzLmdldExpc3RDb25zdHJ1Y3RvcihnZW5GZWF0dXJlKSU+OwotICAgICAgICA8JX0lPgotCQl9Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjwlPWdlbkZlYXR1cmUuaXNNYXBUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZVN1cHByZXNzRU1GVHlwZXMoKSA/ICIubWFwKCkiIDogIiIlPjsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkpIHslPgotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillQ29udGFpbmVyKCk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkpIHslPgotICAgICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT48JWlmIChnZW5GZWF0dXJlLmhhc0VEZWZhdWx0KCkpIHslPiwgPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT48JX0lPik7Ci0gICAgICAgICAgPCV9JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZUFzRU9iamVjdCgpJT4uZUlzUHJveHkoKSkKLQkJewotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0JCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0Tm9uRU9iamVjdEludGVybmFsVHlwZUNhc3QoZ2VuQ2xhc3MpJT5lUmVzb2x2ZVByb3h5KG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pOwotCQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pCi0JCQl7Ci0gICAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZUNvbnRhaW5zKCkpIHslPgotCQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9ICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpKSB7JT4KLQkJCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgPCV9IGVsc2UgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIHJldmVyc2VPZmZzZXRDb3JyZWN0aW9uID0gdGFyZ2V0Q2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQocmV2ZXJzZUZlYXR1cmUpIDogIiI7JT4KLQkJCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4uZUludmVyc2VSZW1vdmUodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbnVsbCk7Ci0gICAgICAgICAgPCV9JT4KLQkJCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKQotCQkJCXsKLSAgICAgICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSkgeyU+Ci0JCQkJCW1zZ3MgPSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBudWxsLCBtc2dzKTsKLSAgICAgICAgICA8JX0gZWxzZSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyBTdHJpbmcgcmV2ZXJzZU9mZnNldENvcnJlY3Rpb24gPSB0YXJnZXRDbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgPyAiICsgIiArIGdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChyZXZlcnNlRmVhdHVyZSkgOiAiIjslPgotCQkJCQltc2dzID0gIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4uZUludmVyc2VBZGQodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0gICAgICAgICAgPCV9JT4KLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotICAgICAgICAgIDwlfSBlbHNlIGlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCWVWaXJ0dWFsU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlJFU09MVkUsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLQkJCX0KLQkJfQotICAgICAgICA8JX0lPgotICAgICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkgJiYgZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+PCVpZiAoZ2VuRmVhdHVyZS5oYXNFRGVmYXVsdCgpKSB7JT4sIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+PCV9JT4pOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJcmV0dXJuICg8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcpICE9IDA7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHsvL3ZvbGF0aWxlJT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpICYmICFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gYmFzaWNHZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKTsKLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZUFzRU9iamVjdCgpJT4uZUlzUHJveHkoKSA/IDwlPWdlbkZlYXR1cmUuZ2V0Tm9uRU9iamVjdEludGVybmFsVHlwZUNhc3QoZ2VuQ2xhc3MpJT5lUmVzb2x2ZVByb3h5KCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KSA6IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLSAgICAgICAgPCVTdHJpbmcgZmVhdHVyZU1hcEVudHJ5VGVtcGxhdGVBcmd1bWVudCA9IGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTAgPyAiPCIgKyBnZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSArICIuRW50cnk+IiA6ICIiOyU+Ci0gICAgICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gbmV3IDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRFZmZlY3RpdmVGZWF0dXJlTWFwV3JhcHBlckNsYXNzKCklPigoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkuPCU9ZmVhdHVyZU1hcEVudHJ5VGVtcGxhdGVBcmd1bWVudCU+bGlzdCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pKTsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+KWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkuPCU9ZmVhdHVyZU1hcEVudHJ5VGVtcGxhdGVBcmd1bWVudCU+bGlzdCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpLmxpc3QoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkubGlzdCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJcmV0dXJuIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPig8JX0lPjwlaWYgKGdlbkZlYXR1cmUuZ2V0VHlwZUdlbkRhdGFUeXBlKCkgPT0gbnVsbCB8fCAhZ2VuRmVhdHVyZS5nZXRUeXBlR2VuRGF0YVR5cGUoKS5pc09iamVjdFR5cGUoKSkgeyU+KDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPik8JX0lPigoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKS5nZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCB0cnVlKTwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPikuPCU9Z2VuRmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpPCV9JT47Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4oPCV9JT48JWlmIChnZW5GZWF0dXJlLmdldFR5cGVHZW5EYXRhVHlwZSgpID09IG51bGwgfHwgIWdlbkZlYXR1cmUuZ2V0VHlwZUdlbkRhdGFUeXBlKCkuaXNPYmplY3RUeXBlKCkpIHslPig8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4pPCV9JT5nZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpLmdldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIHRydWUpPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KS48JT1nZW5GZWF0dXJlLmdldFByaW1pdGl2ZVZhbHVlRnVuY3Rpb24oKSU+KCk8JX0lPjsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+Ci0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLQkJLy8gVGhlIGxpc3QgaXMgZXhwZWN0ZWQgdG8gaW1wbGVtZW50IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QgYW5kIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZwotCQkvLyBzbyBpdCdzIGxpa2VseSB0aGF0IGFuIGFwcHJvcHJpYXRlIHN1YmNsYXNzIG9mIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLjwlaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHslPkVjb3JlRU1hcDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSkgeyU+QmFzaWNGZWF0dXJlTWFwPCV9IGVsc2UgeyU+RWNvcmVFTGlzdDwlfSU+IHNob3VsZCBiZSB1c2VkLgotICAgICAgICA8JX0lPgotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvZ2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZ2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkZlYXR1cmUuaXNCYXNpY0dldCgpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyAvL0NsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlfSU+Ci0JcHVibGljIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IGJhc2ljR2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLQl7Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUucHJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpKSB7JT4KLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZUludGVybmFsQ29udGFpbmVyKCk7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpLmdldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIGZhbHNlKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkuZ2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgZmFsc2UpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyAtPiBkbyBub3QgcGVyZm9ybSBwcm94eSByZXNvbHV0aW9uCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCVAIGVuZCAlPjwlLy9DbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5GZWF0dXJlLmlzQmFzaWNTZXQoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHsgLy9DbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JX0lPgotCXB1YmxpYyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkSW50ZXJuYWxUeXBlKGdlbkNsYXNzKSU+IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MpCi0JewotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDb250YWluZXIoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUucHJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbXNncyk7Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUucG9zdC5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCQlyZXR1cm4gbXNnczsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5wcmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCU9iamVjdCBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gZVZpcnR1YWxTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT47Ci0gICAgICA8JX0lPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gaXNTZXRDaGFuZ2UgPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID09IEVWSVJUVUFMX05PX1ZBTFVFOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiB8PSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IHRydWU7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+IG5vdGlmaWNhdGlvbiA9IG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlID8gbnVsbCA6IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2U8JX0gZWxzZSB7JT4hb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQ8JX0lPik7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4gbm90aWZpY2F0aW9uID0gbmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBFVklSVFVBTF9OT19WQUxVRSA/IG51bGwgOiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KTsKLSAgICAgICAgPCV9JT4KLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotICAgICAgPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5wb3N0Lmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JCXJldHVybiBtc2dzOwotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKSkuYmFzaWNBZGQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBtc2dzKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmJhc2ljQWRkKDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbXNncyk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgY29udGFpbmVkICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyAtPiB0aGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5IGludm9rZWQgdG8ga2VlcCB0aGUgY29udGFpbm1lbnQgcmVsYXRpb25zaGlwIGluIHN5bmNoCi0JCS8vIC0+IGRvIG5vdCBtb2RpZnkgb3RoZXIgZmVhdHVyZXMKLQkJLy8gLT4gcmV0dXJuIG1zZ3MsIGFmdGVyIGFkZGluZyBhbnkgZ2VuZXJhdGVkIE5vdGlmaWNhdGlvbiB0byBpdCAoaWYgaXQgaXMgbnVsbCwgYSBOb3RpZmljYXRpb25DaGFpbiBvYmplY3QgbXVzdCBiZSBjcmVhdGVkIGZpcnN0KQotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlQCBlbmQgJT48JS8vQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotICA8JWlmIChnZW5GZWF0dXJlLmlzU2V0KCkgJiYgKGlzSW1wbGVtZW50YXRpb24gfHwgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSgpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci08JWlmIChpc0ludGVyZmFjZSkgeyAlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkSW50ZXJmYWNlTmFtZSgpJT4jPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5qYXZhZG9jLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFbnVtVHlwZSgpKSB7JT4KLQkgKiBAc2VlIDwlPWdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKS5nZXRRdWFsaWZpZWROYW1lKCklPgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRJc1NldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjaXNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFVuc2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICN1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlQCBlbmQgJT48JS8vQ2xhc3Mvc2V0R2VuRmVhdHVyZS5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7IC8vQ2xhc3Mvc2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JX0lPgotPCV9JT4KLTwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7ICU+Ci0Jdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gdmFsdWUpOwotCi08JX0gZWxzZSB7JT4KLQlwdWJsaWMgdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikKLQl7Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLnByZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotICAgIDwlaWYgKGdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0JCWVTZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5uZXcgPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KDwlfSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPik8JX0lPik7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkpIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7IFN0cmluZyByZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiA9IHRhcmdldENsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSA/ICIgKyAiICsgZ2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKHJldmVyc2VGZWF0dXJlKSA6ICIiOyU+Ci0JCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4gJiYgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBudWxsKSkKLQkJewotCQkJaWYgKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsIiklPi5pc0FuY2VzdG9yKHRoaXMsIDwlPWdlbkZlYXR1cmUuZ2V0RU9iamVjdENhc3QoKSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikpCi0JCQkJdGhyb3cgbmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpJT4oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikuZUludmVyc2VBZGQodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbnRlcm5hbFR5cGVDYXN0KCklPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0gICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pKTsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpIHx8IGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVDb250YWlucygpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICAgIDwlfSU+Ci0JCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KQotCQl7Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gbnVsbDsKLQkJCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsKQotICAgICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSkgeyU+Ci0JCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gbnVsbCkKLQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KW5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBudWxsLCBtc2dzKTsKLSAgICAgICAgPCV9IGVsc2UgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIHJldmVyc2VPZmZzZXRDb3JyZWN0aW9uID0gdGFyZ2V0Q2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQocmV2ZXJzZUZlYXR1cmUpIDogIiI7JT4KLQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT48JT1yZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiluZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KS5lSW52ZXJzZUFkZCh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT48JT1yZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLSAgICAgICAgPCV9JT4KLQkJCW1zZ3MgPSBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEludGVybmFsVHlwZUNhc3QoKSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0JCWVsc2UKLQkJewotICAgICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gZVZpcnR1YWxJc1NldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgICAgIDwlfSU+Ci0JCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0gICAgICAgICAgICA8JX0lPgotCQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IHRydWU7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCAhb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQpKTsKLSAgICAgICAgICA8JX0lPgotCQl9Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pKTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSAoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwOwotICAgICAgICAgIDwlfSU+Ci0JCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KSA8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOyBlbHNlIDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOwotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpIHx8IGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRW51bVR5cGUoKSkgeyU+Ci0gICAgICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+IDogbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjsKLSAgICAgICAgICAgIDwlfSBlbHNlIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+IDogbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjsKLSAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0SW50ZXJuYWxUeXBlQ2FzdCgpJT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+OwotICAgICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRJbnRlcm5hbFR5cGVDYXN0KCklPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT47Ci0gICAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJT2JqZWN0IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSBlVmlydHVhbFNldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJYm9vbGVhbiBpc1NldENoYW5nZSA9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gRVZJUlRVQUxfTk9fVkFMVUU7Ci0gICAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgICAgIDwlfSU+Ci0JCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotICAgICAgICAgICAgPCV9JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IHRydWU7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5pc1NldENoYW5nZSA/IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+IDogb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+PCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT48JX0lPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5pc1NldENoYW5nZTwlfSBlbHNlIHslPiFvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldDwlfSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBFVklSVFVBTF9OT19WQUxVRSA/IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+IDogb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+PCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT48JX0lPikpOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5wb3N0Lmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkpLnNldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPm5ldyA8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4oPCV9JT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KTwlfSU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuc2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+bmV3IDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPig8JX0lPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4pPCV9JT4pOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3NldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4KLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL3NldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBlbmQgJT48JS8vQ2xhc3Mvc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkZlYXR1cmUuaXNCYXNpY1Vuc2V0KCkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNVbnNldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHsgLy9DbGFzcy9iYXNpY1Vuc2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1Vuc2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gYmFzaWNVbnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzKQotCXsKLSAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJT2JqZWN0IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSBlVmlydHVhbFVuc2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBudWxsOwotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gaXNTZXRDaGFuZ2UgPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IEVWSVJUVUFMX05PX1ZBTFVFOwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0JCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IGZhbHNlOwotICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4gbm90aWZpY2F0aW9uID0gbmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5VTlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5pc1NldENoYW5nZSA/IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gOiBudWxsPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCBudWxsLCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQ8JX0lPik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0gICAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1Vuc2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byB1bnNldCB0aGUgY29udGFpbmVkICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyAtPiB0aGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5IGludm9rZWQgdG8ga2VlcCB0aGUgY29udGFpbm1lbnQgcmVsYXRpb25zaGlwIGluIHN5bmNoCi0JCS8vIC0+IGRvIG5vdCBtb2RpZnkgb3RoZXIgZmVhdHVyZXMKLQkJLy8gLT4gcmV0dXJuIG1zZ3MsIGFmdGVyIGFkZGluZyBhbnkgZ2VuZXJhdGVkIE5vdGlmaWNhdGlvbiB0byBpdCAoaWYgaXQgaXMgbnVsbCwgYSBOb3RpZmljYXRpb25DaGFpbiBvYmplY3QgbXVzdCBiZSBjcmVhdGVkIGZpcnN0KQotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvYmFzaWNVbnNldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCVAIGVuZCAlPjwlLy9DbGFzcy5iYXNpY1Vuc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0KCkgJiYgKGlzSW1wbGVtZW50YXRpb24gfHwgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkVW5zZXRWaXNpYmlsaXR5KCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3Vuc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEludGVyZmFjZU5hbWUoKSU+IzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+IDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3Vuc2V0R2VuRmVhdHVyZS5qYXZhZG9jLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgPCVpZiAoIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkSXNTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI2lzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgPCV9JT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0gIDwlaWYgKCFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldFJhd0ltcG9ydGVkQm91bmRUeXBlKCklPikKLSAgPCV9JT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JUAgZW5kICU+PCUvL0NsYXNzL3Vuc2V0R2VuRmVhdHVyZS5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7IC8vQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jJT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3Vuc2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLTwlfSU+Ci08JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0Jdm9pZCB1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotCi08JX0gZWxzZSB7JT4KLQlwdWJsaWMgdm9pZCB1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0JewotICAgIDwlaWYgKGdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0JCWVVbnNldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgPCV9JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwpICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPi5VbnNldHRhYmxlPCU9c2luZ2xlV2lsZGNhcmQlPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikudW5zZXQoKTsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpIHx8IGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVDb250YWlucygpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICAgIDwlfSU+Ci0JCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsKQotCQl7Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gbnVsbDsKLSAgICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkpIHslPgotCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG51bGwsIG1zZ3MpOwotICAgICAgICA8JX0gZWxzZSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyBTdHJpbmcgcmV2ZXJzZU9mZnNldENvcnJlY3Rpb24gPSB0YXJnZXRDbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgPyAiICsgIiArIGdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChyZXZlcnNlRmVhdHVyZSkgOiAiIjslPgotCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0gICAgICAgIDwlfSU+Ci0JCQltc2dzID0gYmFzaWNVbnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlCi0JCXsKLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSBlVmlydHVhbElzU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0gICAgICAgICAgPCV9JT4KLQkJCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLSAgICAgICAgICA8JX0lPgotCQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IGZhbHNlOwotICAgICAgICA8JX0lPgotICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uVU5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG51bGwsIG51bGwsIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0KSk7Ci0gICAgICAgIDwlfSU+Ci0JCX0KLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMDsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJT2JqZWN0IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSBlVmlydHVhbFVuc2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCWJvb2xlYW4gaXNTZXRDaGFuZ2UgPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IEVWSVJUVUFMX05PX1ZBTFVFOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNSZWZlcmVuY2VUeXBlKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG51bGw7Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0gICAgICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSBmYWxzZTsKLSAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlVOU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlID8gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA6IG51bGw8JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIG51bGwsIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2U8JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldDwlfSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+KSA8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOyBlbHNlIDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOwotICAgICAgICAgIDwlfSBlbHNlIGlmICghZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpIHx8IGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+OwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSB8fCBnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLSAgICAgICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICY9IH48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IGZhbHNlOwotICAgICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uVU5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+aXNTZXRDaGFuZ2UgPyBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+IDogPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT48JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPmlzU2V0Q2hhbmdlPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQ8JX0lPikpOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpKS5jbGVhcig8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbClnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5jbGVhcig8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3Vuc2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byB1bnNldCB0aGUgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+Ci0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy91bnNldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotICA8JWlmIChnZW5GZWF0dXJlLmlzSXNTZXQoKSAmJiAoaXNJbXBsZW1lbnRhdGlvbiB8fCAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRJc1NldFZpc2liaWxpdHkoKSkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci08JWlmIChpc0ludGVyZmFjZSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pc1NldEdlbkZlYXR1cmUuamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkSW50ZXJmYWNlTmFtZSgpJT4jPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGlzIHNldC4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2lzU2V0R2VuRmVhdHVyZS5qYXZhZG9jLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4gaXMgc2V0LgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDaGFuZ2VhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkVW5zZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3Vuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICA8JX0lPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLSAgICA8JWlmICghZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0NoYW5nZWFibGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldFJhd0ltcG9ydGVkQm91bmRUeXBlKCklPikKLSAgICA8JX0lPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlQCBlbmQgJT48JS8vQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0gZWxzZSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHsgLy9DbGFzcy9pc1NldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JX0lPgotPCV9JT4KLTwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQlib29sZWFuIGlzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0KLTwlfSBlbHNlIHslPgotCXB1YmxpYyBib29sZWFuIGlzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLQl7Ci0gICAgPCVpZiAoZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpKSB7JT4KLQkJcmV0dXJuIGVJc1NldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgPCV9JT4KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSU+LlVuc2V0dGFibGU8JT1zaW5nbGVXaWxkY2FyZCU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5pc1NldCgpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXJldHVybiBlVmlydHVhbElzU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCXJldHVybiAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSkgeyBHZW5GZWF0dXJlIGRlbGVnYXRlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0RGVsZWdhdGVGZWF0dXJlKCk7JT4KLSAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJcmV0dXJuICEoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpKS5pc0VtcHR5KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuICEoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuaXNFbXB0eSg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2lzU2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gd2hldGhlciB0aGUgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGlzIHNldAotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL2lzU2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbkZlYXR1cmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZ2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfS8vZm9yJT4KLTwlfX0ucnVuKCk7JT4KLTwlZm9yIChHZW5PcGVyYXRpb24gZ2VuT3BlcmF0aW9uIDogKGlzSW1wbGVtZW50YXRpb24gPyBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbk9wZXJhdGlvbnMoKSA6IGdlbkNsYXNzLmdldERlY2xhcmVkR2VuT3BlcmF0aW9ucygpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZW5PcGVyYXRpb24ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbk9wZXJhdGlvbi5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZW5PcGVyYXRpb24uamF2YWRvYy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gIDwlaWYgKGdlbk9wZXJhdGlvbi5oYXNEb2N1bWVudGF0aW9uKCkgfHwgZ2VuT3BlcmF0aW9uLmhhc1BhcmFtZXRlckRvY3VtZW50YXRpb24oKSkgeyU+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gICAgPCVpZiAoZ2VuT3BlcmF0aW9uLmhhc0RvY3VtZW50YXRpb24oKSkgeyU+Ci0JICogPCU9Z2VuT3BlcmF0aW9uLmdldERvY3VtZW50YXRpb24oZ2VuTW9kZWwuZ2V0SW5kZW50YXRpb24oc3RyaW5nQnVmZmVyKSklPgotICAgIDwlfSU+Ci0gICAgPCVmb3IgKEdlblBhcmFtZXRlciBnZW5QYXJhbWV0ZXIgOiBnZW5PcGVyYXRpb24uZ2V0R2VuUGFyYW1ldGVycygpKSB7JT4KLSAgICAgIDwlaWYgKGdlblBhcmFtZXRlci5oYXNEb2N1bWVudGF0aW9uKCkpIHsgU3RyaW5nIGRvY3VtZW50YXRpb24gPSBnZW5QYXJhbWV0ZXIuZ2V0RG9jdW1lbnRhdGlvbigiIik7JT4KLSAgICAgICAgPCVpZiAoZG9jdW1lbnRhdGlvbi5jb250YWlucygiXG4iKSB8fCBkb2N1bWVudGF0aW9uLmNvbnRhaW5zKCJcciIpKSB7JT4KLQkgKiBAcGFyYW0gPCU9Z2VuUGFyYW1ldGVyLmdldE5hbWUoKSU+Ci0JICogICA8JT1nZW5QYXJhbWV0ZXIuZ2V0RG9jdW1lbnRhdGlvbihnZW5Nb2RlbC5nZXRJbmRlbnRhdGlvbihzdHJpbmdCdWZmZXIpKSU+Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCSAqIEBwYXJhbSA8JT1nZW5QYXJhbWV0ZXIuZ2V0TmFtZSgpJT4gPCU9Z2VuUGFyYW1ldGVyLmdldERvY3VtZW50YXRpb24oZ2VuTW9kZWwuZ2V0SW5kZW50YXRpb24oc3RyaW5nQnVmZmVyKSklPgotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAgPCV9JT4KLSAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNb2RlbFRhZ3MoKSkgeyBib29sZWFuIGZpcnN0ID0gdHJ1ZTsgZm9yIChTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihnZW5PcGVyYXRpb24uZ2V0TW9kZWxJbmZvKCksICJcblxyIik7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgeyBTdHJpbmcgbW9kZWxJbmZvID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOyBpZiAoZmlyc3QpIHsgZmlyc3QgPSBmYWxzZTslPgotCSAqIEBtb2RlbCA8JT1tb2RlbEluZm8lPgotICA8JX0gZWxzZSB7JT4KLQkgKiAgICAgICAgPCU9bW9kZWxJbmZvJT4KLSAgPCV9fSBpZiAoZmlyc3QpIHslPgotCSAqIEBtb2RlbAotICA8JX19JT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JUAgZW5kICU+PCUvL0NsYXNzL2dlbk9wZXJhdGlvbi5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7IC8vQ2xhc3MvZ2VuT3BlcmF0aW9uLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jJT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbk9wZXJhdGlvbi5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLTwlfSU+Ci08JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JPCU9Z2VuT3BlcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKGdlbkNsYXNzKSU+PCU9Z2VuT3BlcmF0aW9uLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5PcGVyYXRpb24uZ2V0TmFtZSgpJT4oPCU9Z2VuT3BlcmF0aW9uLmdldFBhcmFtZXRlcnMoZ2VuQ2xhc3MpJT4pPCU9Z2VuT3BlcmF0aW9uLmdldFRocm93cyhnZW5DbGFzcyklPjsKLQotPCV9IGVsc2UgeyU+Ci0JcHVibGljIDwlPWdlbk9wZXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycyhnZW5DbGFzcyklPjwlPWdlbk9wZXJhdGlvbi5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuT3BlcmF0aW9uLmdldE5hbWUoKSU+KDwlPWdlbk9wZXJhdGlvbi5nZXRQYXJhbWV0ZXJzKGdlbkNsYXNzKSU+KTwlPWdlbk9wZXJhdGlvbi5nZXRUaHJvd3MoZ2VuQ2xhc3MpJT4KLQl7Ci0gIDwlaWYgKGdlbk9wZXJhdGlvbi5oYXNCb2R5KCkpIHslPgotCQk8JT1nZW5PcGVyYXRpb24uZ2V0Qm9keShnZW5Nb2RlbC5nZXRJbmRlbnRhdGlvbihzdHJpbmdCdWZmZXIpKSU+Ci0gIDwlfSBlbHNlIGlmIChnZW5PcGVyYXRpb24uaXNJbnZhcmlhbnQoKSkge0dlbkNsYXNzIG9wQ2xhc3MgPSBnZW5PcGVyYXRpb24uZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIGRpYWdub3N0aWNzID0gZ2VuT3BlcmF0aW9uLmdldEdlblBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpOyBTdHJpbmcgY29udGV4dCA9IGdlbk9wZXJhdGlvbi5nZXRHZW5QYXJhbWV0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKTslPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJLy8gLT4gc3BlY2lmeSB0aGUgY29uZGl0aW9uIHRoYXQgdmlvbGF0ZXMgdGhlIGludmFyaWFudAotCQkvLyAtPiB2ZXJpZnkgdGhlIGRldGFpbHMgb2YgdGhlIGRpYWdub3N0aWMsIGluY2x1ZGluZyBzZXZlcml0eSBhbmQgbWVzc2FnZQotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQlpZiAoZmFsc2UpCi0JCXsKLQkJCWlmICg8JT1kaWFnbm9zdGljcyU+ICE9IG51bGwpCi0JCQl7Ci0JCQkJPCU9ZGlhZ25vc3RpY3MlPi5hZGQKLQkJCQkJKG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0RpYWdub3N0aWMiKSU+Ci0JCQkJCQkoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYyIpJT4uRVJST1IsCi0JCQkJCQkgPCU9b3BDbGFzcy5nZXRHZW5QYWNrYWdlKCkuZ2V0SW1wb3J0ZWRWYWxpZGF0b3JDbGFzc05hbWUoKSU+LkRJQUdOT1NUSUNfU09VUkNFLAotCQkJCQkJIDwlPW9wQ2xhc3MuZ2V0R2VuUGFja2FnZSgpLmdldEltcG9ydGVkVmFsaWRhdG9yQ2xhc3NOYW1lKCklPi48JT1vcENsYXNzLmdldE9wZXJhdGlvbklEKGdlbk9wZXJhdGlvbiklPiwKLQkJCQkJCSA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW4iKSU+LklOU1RBTkNFLmdldFN0cmluZygiX1VJX0dlbmVyaWNJbnZhcmlhbnRfZGlhZ25vc3RpYyIsIG5ldyBPYmplY3RbXSB7ICI8JT1nZW5PcGVyYXRpb24uZ2V0TmFtZSgpJT4iLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RWYWxpZGF0b3IiKSU+LmdldE9iamVjdExhYmVsKHRoaXMsIDwlPWNvbnRleHQlPikgfSksPCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPjwlPWdlbk1vZGVsLmdldE5vbk5MUygyKSU+Ci0JCQkJCQkgbmV3IE9iamVjdCBbXSB7IHRoaXMgfSkpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2ltcGxlbWVudGVkR2VuT3BlcmF0aW9uLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9pbXBsZW1lbnRlZEdlbk9wZXJhdGlvbi50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbk9wZXJhdGlvbi5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9pbXBsZW1lbnRlZEdlbk9wZXJhdGlvbi5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfS8vZm9yJT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVJbnZlcnNlQWRkR2VuRmVhdHVyZXMoKSkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpKSB7JT4KLSAgICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RUludmVyc2VBZGRHZW5GZWF0dXJlcygpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbmNoZWNrZWRDYXN0KCkpIHslPgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgPCVicmVhazsgfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IGVJbnZlcnNlQWRkKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4gb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQl7Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RUludmVyc2VBZGRHZW5GZWF0dXJlcygpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7IFN0cmluZyBjYXN0ID0gIigiICArIGdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpICsgKCFnZW5Nb2RlbC51c2VHZW5lcmljcygpID8gIikiIDogIjwiICsgZ2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IikgKyAiPikoIiArIGdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpICsgIjw/PikiKTslPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZVN1cHByZXNzRU1GVHlwZXMoKSkgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Y2FzdCU+KDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+LkludGVybmFsTWFwVmlldzwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRNYXBUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5lTWFwKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gKDwlPWNhc3QlPjwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLSAgICA8JX0lPgotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpKSB7JT4KLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0Jhc2ljU2V0KCkpIHslPgotCQkJCXJldHVybiBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pb3RoZXJFbmQsIG1zZ3MpOwotICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG1zZ3MpOwotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIHslPgotICAgIDwlaWYgKGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlaWYgKGdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpKSB7JT5iYXNpY0dldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPjwlfSBlbHNlIHslPjwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+PCV9JT4oKTsKLSAgICA8JX0lPgotCQkJCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsKQotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVDb250YWlucygpKSB7JT4KLQkJCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG51bGwsIG1zZ3MpOwotICAgIDwlfSBlbHNlIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7IFN0cmluZyByZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiA9IHRhcmdldENsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSA/ICIgKyAiICsgZ2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKHJldmVyc2VGZWF0dXJlKSA6ICIiOyU+Ci0JCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjwlPXJldmVyc2VPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotICAgIDwlfSU+Ci0JCQkJcmV0dXJuIGJhc2ljU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPilvdGhlckVuZCwgbXNncyk7Ci0gIDwlfSU+Ci08JX0lPgotCQl9Ci08JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci08JX0lPgotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVJbnZlcnNlUmVtb3ZlR2VuRmVhdHVyZXMoKSkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gZUludmVyc2VSZW1vdmUoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCXsKLTwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFSW52ZXJzZVJlbW92ZUdlbkZlYXR1cmVzKCkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZVN1cHByZXNzRU1GVHlwZXMoKSkgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPjwlPXNpbmdsZVdpbGRjYXJkJT4pKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwIiklPi5JbnRlcm5hbE1hcFZpZXc8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkTWFwVGVtcGxhdGVBcmd1bWVudHMoZ2VuQ2xhc3MpJT4pPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZU1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPjwlPXNpbmdsZVdpbGRjYXJkJT4pKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZmVhdHVyZU1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPjwlPXNpbmdsZVdpbGRjYXJkJT4pPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkgJiYgIWdlbkZlYXR1cmUuaXNCYXNpY1NldCgpKSB7JT4KLQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG1zZ3MpOwotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0JCQkJcmV0dXJuIGJhc2ljVW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4obXNncyk7Ci0gIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihudWxsLCBtc2dzKTsKLSAgPCV9JT4KLTwlfSU+Ci0JCX0KLTwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci08JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLTwlfSU+Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkNsYXNzLmltcGxlbWVudHNBbnkoZ2VuQ2xhc3MuZ2V0RUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckdlbkZlYXR1cmVzKCkpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MpCi0JewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQ8JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPikKLQkJewotPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVCYXNpY1JlbW92ZUZyb21Db250YWluZXJHZW5GZWF0dXJlcygpKSB7JT4KLSAgPCVHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIHJldmVyc2VPZmZzZXRDb3JyZWN0aW9uID0gdGFyZ2V0Q2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQocmV2ZXJzZUZlYXR1cmUpIDogIiI7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjwlPXJldmVyc2VPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLTwlfSBlbHNlIHslPgotCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci08JX0lPgotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVHZXRHZW5GZWF0dXJlcygpKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQl7Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RUdldEdlbkZlYXR1cmVzKCkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0Jvb2xlYW5UeXBlKCkpIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gbmV3IDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPig8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKTsKLSAgICA8JX0lPgotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkgJiYgIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzRWZmZWN0aXZlU3VwcHJlc3NFTUZUeXBlcygpKSB7JT4KLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+LkludGVybmFsTWFwVmlldzwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRNYXBUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5lTWFwKCk7Ci0JCQkJZWxzZSByZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotCQkJCWVsc2UgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkubWFwKCk7Ci0gICAgPCV9JT4KLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZmVhdHVyZU1hcCgpOwotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5nZXRXcmFwcGVyKCk7Ci0gIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotICA8JX0lPgotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBlRHluYW1pY0dldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLTwlfSU+Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkNsYXNzLmltcGxlbWVudHNBbnkoZ2VuQ2xhc3MuZ2V0RVNldEdlbkZlYXR1cmVzKCkpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+Ci0gICAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVTZXRHZW5GZWF0dXJlcygpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbmNoZWNrZWRDYXN0KCkgJiYgIWdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpICYmICFnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7JT4KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgIDwlYnJlYWs7IH0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQ8JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPikKLQkJewotICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RVNldEdlbkZlYXR1cmVzKCkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5mZWF0dXJlTWFwKCkpLnNldChuZXdWYWx1ZSk7Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5zZXQobmV3VmFsdWUpOwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRWZmZWN0aXZlU3VwcHJlc3NFTUZUeXBlcygpKSB7JT4KLQkJCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSIpJT4uU2V0dGluZykoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+LkludGVybmFsTWFwVmlldzwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRNYXBUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5lTWFwKCkpLnNldChuZXdWYWx1ZSk7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlIiklPi5TZXR0aW5nKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLnNldChuZXdWYWx1ZSk7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLmNsZWFyKCk7Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5hZGRBbGwoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS51dGlsLkNvbGxlY3Rpb24iKSU+PCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyU+PD8gZXh0ZW5kcyA8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPj48JX0lPiluZXdWYWx1ZSk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJCQlzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKCg8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4pbmV3VmFsdWUpLjwlPWdlbkZlYXR1cmUuZ2V0UHJpbWl0aXZlVmFsdWVGdW5jdGlvbigpJT4oKSk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlaWYgKGdlbkZlYXR1cmUuZ2V0VHlwZUdlbkRhdGFUeXBlKCkgPT0gbnVsbCB8fCAhZ2VuRmVhdHVyZS5nZXRUeXBlR2VuRGF0YVR5cGUoKS5pc09iamVjdFR5cGUoKSB8fCAhZ2VuRmVhdHVyZS5nZXRSYXdUeXBlKCkuZXF1YWxzKGdlbkZlYXR1cmUuZ2V0VHlwZShnZW5DbGFzcykpKSB7JT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pPCV9JT5uZXdWYWx1ZSk7Ci0gICAgPCV9JT4KLQkJCQlyZXR1cm47Ci0gIDwlfSU+Ci0JCX0KLSAgPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0gIDwlfSBlbHNlIHslPgotCQllRHluYW1pY1NldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLSAgPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFVW5zZXRHZW5GZWF0dXJlcygpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9lVW5zZXQub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQl7Ci0gIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFVW5zZXRHZW5GZWF0dXJlcygpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5mZWF0dXJlTWFwKCkuY2xlYXIoKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuY2xlYXIoKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotCQkJCXVuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmhhc0VEZWZhdWx0KCkpIHslPgotCQkJCXNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pbnVsbCk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+KTsKLSAgICA8JX0lPgotCQkJCXJldHVybjsKLSAgPCV9JT4KLQkJfQotICA8JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0gIDwlfSBlbHNlIHslPgotCQllRHluYW1pY1Vuc2V0KGZlYXR1cmVJRCk7Ci0gIDwlfSU+Ci0JfQotCi08JUAgZW5kICU+PCUvL0NsYXNzL2VVbnNldC5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFSXNTZXRHZW5GZWF0dXJlcygpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9lSXNTZXQub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+Ci0gICAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVJc1NldEdlbkZlYXR1cmVzKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSAmJiAhZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSAmJiBnZW5GZWF0dXJlLmlzRmllbGQoKSAmJiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgPCVicmVhazsgfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQl7Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RUlzU2V0R2VuRmVhdHVyZXMoKSkgeyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLQkJCQlyZXR1cm4gISgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmZlYXR1cmVNYXAoKS5pc0VtcHR5KCk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiAhPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uZmVhdHVyZU1hcCgpLmlzRW1wdHkoKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiAhPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uaXNFbXB0eSgpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgITwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+LmlzRW1wdHkoKTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuICE8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLmlzRW1wdHkoKTsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotCQkJCXJldHVybiBpc1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkpIHslPgotICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsOwotICAgIDwlfSBlbHNlIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0ZpZWxkKCkgJiYgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQlyZXR1cm4gZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPikgIT0gbnVsbDsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiBiYXNpY0dldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpICE9IG51bGw7Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5oYXNFRGVmYXVsdCgpKSB7JT4KLSAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbDsKLSAgICA8JX0gZWxzZSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJcmV0dXJuIGVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pICE9IG51bGw7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSAhPSBudWxsOwotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSB8fCBnZW5GZWF0dXJlLmlzRW51bVR5cGUoKSkgeyU+Ci0gICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQkJCXJldHVybiAoKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMCkgIT0gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT47Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT47Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VudW1UeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0ZpZWxkKCkgJiYgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQlyZXR1cm4gZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4pICE9IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+OwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgIT0gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT47Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIHsvL2RhdGF0eXBlJT4KLSAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4gPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgOiAhPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4uZXF1YWxzKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KTsKLSAgICA8JX0gZWxzZSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4pOwotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPiA9PSBudWxsID8gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCA6ICE8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPi5lcXVhbHMoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+ID09IG51bGwgPyA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpICE9IG51bGwgOiAhPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4uZXF1YWxzKDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpOwotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0lPgotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLTwlfSBlbHNlIHslPgotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChmZWF0dXJlSUQpOwotPCV9JT4KLQl9Ci0KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZUlzU2V0Lm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgKCFnZW5DbGFzcy5nZXRNaXhpbkdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpIHx8IGdlbkNsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSAmJiAhZ2VuQ2xhc3MuZ2V0R2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpKSB7JT4KLSAgPCVpZiAoIWdlbkNsYXNzLmdldE1peGluR2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICAgIDwlfSU+Ci0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPCU9c2luZ2xlV2lsZGNhcmQlPiBiYXNlQ2xhc3MpCi0JewotICAgIDwlZm9yIChHZW5DbGFzcyBtaXhpbkdlbkNsYXNzIDogZ2VuQ2xhc3MuZ2V0TWl4aW5HZW5DbGFzc2VzKCkpIHslPgotCQlpZiAoYmFzZUNsYXNzID09IDwlPW1peGluR2VuQ2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCQl7Ci0gICAgICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogbWl4aW5HZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpKSB7JT4KLQkJCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OiByZXR1cm4gPCU9bWl4aW5HZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjsKLSAgICAgIDwlfSU+Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0gICAgPCV9JT4KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLSAgPCV9JT4KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8JT1zaW5nbGVXaWxkY2FyZCU+IGJhc2VDbGFzcykKLQl7Ci0gIDwlZm9yIChHZW5DbGFzcyBtaXhpbkdlbkNsYXNzIDogZ2VuQ2xhc3MuZ2V0TWl4aW5HZW5DbGFzc2VzKCkpIHslPgotCQlpZiAoYmFzZUNsYXNzID09IDwlPW1peGluR2VuQ2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotICAgIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBtaXhpbkdlbkNsYXNzLmdldEdlbkZlYXR1cmVzKCkpIHslPgotCQkJCWNhc2UgPCU9bWl4aW5HZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjogcmV0dXJuIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT47Ci0gICAgPCV9JT4KLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuQ2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpICYmICFnZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0JCWlmIChiYXNlQ2xhc3MgPT0gPCU9Z2VuQ2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCQl7Ci0gICAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEdlbkZlYXR1cmVzKCkpIHslPgotCQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46IHJldHVybiA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+OwotICAgIDwlfSU+Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0gIDwlfSU+Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyBTdHJpbmcgZVZpcnR1YWxWYWx1ZXNGaWVsZCA9IGdlbkNsYXNzLmdldEVWaXJ0dWFsVmFsdWVzRmllbGQoKTslPgotICA8JWlmIChlVmlydHVhbFZhbHVlc0ZpZWxkICE9IG51bGwpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZVZpcnR1YWxWYWx1ZXMoKQotCXsKLQkJcmV0dXJuIDwlPWVWaXJ0dWFsVmFsdWVzRmllbGQlPjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHJvdGVjdGVkIHZvaWQgZVNldFZpcnR1YWxWYWx1ZXMoT2JqZWN0W10gbmV3VmFsdWVzKQotCXsKLQkJPCU9ZVZpcnR1YWxWYWx1ZXNGaWVsZCU+ID0gbmV3VmFsdWVzOwotCX0KLQotICA8JX0lPgotICA8JXsgTGlzdDxTdHJpbmc+IGVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMgPSBnZW5DbGFzcy5nZXRFVmlydHVhbEluZGV4Qml0RmllbGRzKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTslPgotICAgIDwlaWYgKCFlVmlydHVhbEluZGV4Qml0RmllbGRzLmlzRW1wdHkoKSkgeyBMaXN0PFN0cmluZz4gYWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcyA9IGdlbkNsYXNzLmdldEFsbEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXByb3RlY3RlZCBpbnQgZVZpcnR1YWxJbmRleEJpdHMoaW50IG9mZnNldCkKLQl7Ci0JCXN3aXRjaCAob2Zmc2V0KQotCQl7Ci0gICAgICA8JWZvciAoaW50IGkgPSAwOyBpIDwgYWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcy5zaXplKCk7IGkrKykgeyU+Ci0JCQljYXNlIDwlPWklPiA6Ci0JCQkJcmV0dXJuIDwlPWFsbEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMuZ2V0KGkpJT47Ci0gICAgICA8JX0lPgotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwcm90ZWN0ZWQgdm9pZCBlU2V0VmlydHVhbEluZGV4Qml0cyhpbnQgb2Zmc2V0LCBpbnQgbmV3SW5kZXhCaXRzKQotCXsKLQkJc3dpdGNoIChvZmZzZXQpCi0JCXsKLSAgICAgIDwlZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFVmlydHVhbEluZGV4Qml0RmllbGRzLnNpemUoKTsgaSsrKSB7JT4KLQkJCWNhc2UgPCU9aSU+IDoKLQkJCQk8JT1hbGxFVmlydHVhbEluZGV4Qml0RmllbGRzLmdldChpKSU+ID0gbmV3SW5kZXhCaXRzOwotCQkJCWJyZWFrOwotICAgICAgPCV9JT4KLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLSAgICA8JX0lPgotICA8JX0lPgotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiAhZ2VuQ2xhc3MuZ2V0VG9TdHJpbmdHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICA8JXsgYm9vbGVhbiBmaXJzdCA9IHRydWU7JT4KLSAgICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0VG9TdHJpbmdHZW5GZWF0dXJlcygpKSB7JT4KLSAgICAgIDwlaWYgKGZpcnN0KSB7IGZpcnN0ID0gZmFsc2U7JT4KLQkJcmVzdWx0LmFwcGVuZCgiICg8JT1nZW5GZWF0dXJlLmdldE5hbWUoKSU+OiAiKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmVzdWx0LmFwcGVuZCgiLCA8JT1nZW5GZWF0dXJlLmdldE5hbWUoKSU+OiAiKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0gICAgICA8JX0lPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSAmJiAhZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlpZiAoZVZpcnR1YWxJc1NldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KSkgcmVzdWx0LmFwcGVuZChlVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJaWYgKDwlaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPig8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwPCV9IGVsc2UgeyU+PCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDwlfSU+KSByZXN1bHQuYXBwZW5kKCg8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcpICE9IDApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCWlmICg8JWlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4oPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDwlfSBlbHNlIHslPjwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ8JX0lPikgcmVzdWx0LmFwcGVuZCg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXJlc3VsdC5hcHBlbmQoZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPjwlaWYgKCFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1JlZmVyZW5jZVR5cGUoKSl7JT4sIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+PCV9JT4pKTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJcmVzdWx0LmFwcGVuZCgoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwKTsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmVzdWx0LmFwcGVuZCg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5pc01hcEVudHJ5KCkpIHsgR2VuRmVhdHVyZSBrZXlGZWF0dXJlID0gZ2VuQ2xhc3MuZ2V0TWFwRW50cnlLZXlGZWF0dXJlKCk7IEdlbkZlYXR1cmUgdmFsdWVGZWF0dXJlID0gZ2VuQ2xhc3MuZ2V0TWFwRW50cnlWYWx1ZUZlYXR1cmUoKTslPgotPCVTdHJpbmcgb2JqZWN0VHlwZSA9IGdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS5sYW5nLk9iamVjdCIpOyU+Ci08JVN0cmluZyBrZXlUeXBlID0gZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCA/IGtleUZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcykgOiBvYmplY3RUeXBlOyU+Ci08JVN0cmluZyB2YWx1ZVR5cGUgPSBnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwID8gdmFsdWVGZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpIDogb2JqZWN0VHlwZTslPgotPCVTdHJpbmcgZU1hcFR5cGUgPSBnZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwIikgKyAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCA/ICI8IiArIGtleVR5cGUgKyAiLCAiICsgdmFsdWVUeXBlICsgIj4iIDogIiIpOyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGludCBoYXNoID0gLTE7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEhhc2goKQotCXsKLQkJaWYgKGhhc2ggPT0gLTEpCi0JCXsKLQkJCTwlPW9iamVjdFR5cGUlPiB0aGVLZXkgPSBnZXRLZXkoKTsKLQkJCWhhc2ggPSAodGhlS2V5ID09IG51bGwgPyAwIDogdGhlS2V5Lmhhc2hDb2RlKCkpOwotCQl9Ci0JCXJldHVybiBoYXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhc2goaW50IGhhc2gpCi0JewotCQl0aGlzLmhhc2ggPSBoYXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyA8JT1rZXlUeXBlJT4gZ2V0S2V5KCkKLQl7Ci0gIDwlaWYgKGtleUZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlyZXR1cm4gbmV3IDwlPWtleUZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPihnZXRUeXBlZEtleSgpKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBnZXRUeXBlZEtleSgpOwotICA8JX0lPgotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEtleSg8JT1rZXlUeXBlJT4ga2V5KQotCXsKLSAgPCVpZiAoa2V5RmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotCQlnZXRUeXBlZEtleSgpLmFkZEFsbCg8JWlmICghZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+KDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS51dGlsLkNvbGxlY3Rpb24iKSU+KTwlfSU+a2V5KTsKLSAgPCV9IGVsc2UgaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHslPgotCQlzZXRUeXBlZEtleShrZXkpOwotICA8JX0gZWxzZSBpZiAoa2V5RmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXNldFR5cGVkS2V5KCgoPCU9a2V5RmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KWtleSkuPCU9a2V5RmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCXNldFR5cGVkS2V5KCg8JT1rZXlGZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPilrZXkpOwotICA8JX0lPgotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyA8JT12YWx1ZVR5cGUlPiBnZXRWYWx1ZSgpCi0JewotICA8JWlmICh2YWx1ZUZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlyZXR1cm4gbmV3IDwlPXZhbHVlRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KGdldFR5cGVkVmFsdWUoKSk7Ci0gIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gZ2V0VHlwZWRWYWx1ZSgpOwotICA8JX0lPgotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyA8JT12YWx1ZVR5cGUlPiBzZXRWYWx1ZSg8JT12YWx1ZVR5cGUlPiB2YWx1ZSkKLQl7Ci0JCTwlPXZhbHVlVHlwZSU+IG9sZFZhbHVlID0gZ2V0VmFsdWUoKTsKLSAgPCVpZiAodmFsdWVGZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0JCWdldFR5cGVkVmFsdWUoKS5jbGVhcigpOwotCQlnZXRUeXBlZFZhbHVlKCkuYWRkQWxsKDwlaWYgKCFnZW5Nb2RlbC51c2VHZW5lcmljcygpKSB7JT4oPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpJT4pPCV9JT52YWx1ZSk7Ci0gIDwlfSBlbHNlIGlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7JT4KLQkJc2V0VHlwZWRWYWx1ZSh2YWx1ZSk7Ci0gIDwlfSBlbHNlIGlmICh2YWx1ZUZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlzZXRUeXBlZFZhbHVlKCgoPCU9dmFsdWVGZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4pdmFsdWUpLjwlPXZhbHVlRmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCXNldFR5cGVkVmFsdWUoKDwlPXZhbHVlRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pdmFsdWUpOwotICA8JX0lPgotCQlyZXR1cm4gb2xkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkpIHslPgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICA8JX0lPgotCXB1YmxpYyA8JT1lTWFwVHlwZSU+IGdldEVNYXAoKQotCXsKLQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIpJT4gY29udGFpbmVyID0gZUNvbnRhaW5lcigpOwotCQlyZXR1cm4gY29udGFpbmVyID09IG51bGwgPyBudWxsIDogKDwlPWVNYXBUeXBlJT4pY29udGFpbmVyLmVHZXQoZUNvbnRhaW5tZW50RmVhdHVyZSgpKTsKLQl9Ci0KLTwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotfSAvLzwlPWlzSW50ZXJmYWNlID8gIiAiICsgZ2VuQ2xhc3MuZ2V0SW50ZXJmYWNlTmFtZSgpIDogZ2VuQ2xhc3MuZ2V0Q2xhc3NOYW1lKCklPgotPCUvLyBUT0RPIGZpeCB0aGUgc3BhY2UgYWJvdmUlPgotPCVnZW5Nb2RlbC5lbWl0U29ydGVkSW1wb3J0cygpOyU+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3RlbXBsYXRlcy9tb2RlbC9DbGFzcy5qYXZhamV0Lm9yZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzL21vZGVsL0NsYXNzLmphdmFqZXQub3JnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDI2YTI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzL21vZGVsL0NsYXNzLmphdmFqZXQub3JnCisrKyAvZGV2L251bGwKQEAgLTEsMjAyMCArMCwwIEBACi08JUAgamV0IHBhY2thZ2U9Im9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLmVjb3JlLnRlbXBsYXRlcy5tb2RlbCIgaW1wb3J0cz0iamF2YS51dGlsLiogb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uZWNvcmUuZ2VubW9kZWwuKiIgY2xhc3M9IkNsYXNzIiB2ZXJzaW9uPSIkSWQ6IENsYXNzLmphdmFqZXQsdiAxLjcwIDIwMDcvMDYvMTggMTk6MzU6MjEgZW1lcmtzIEV4cCAkIiAlPgotPCUKLS8qKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICovCi0lPgotPCVmaW5hbCBHZW5DbGFzcyBnZW5DbGFzcyA9IChHZW5DbGFzcykoKE9iamVjdFtdKWFyZ3VtZW50KVswXTsgZmluYWwgR2VuUGFja2FnZSBnZW5QYWNrYWdlID0gZ2VuQ2xhc3MuZ2V0R2VuUGFja2FnZSgpOyBmaW5hbCBHZW5Nb2RlbCBnZW5Nb2RlbD1nZW5QYWNrYWdlLmdldEdlbk1vZGVsKCk7JT4KLTwlZmluYWwgYm9vbGVhbiBpc0ludGVyZmFjZSA9IEJvb2xlYW4uVFJVRS5lcXVhbHMoKChPYmplY3RbXSlhcmd1bWVudClbMV0pOyBmaW5hbCBib29sZWFuIGlzSW1wbGVtZW50YXRpb24gPSBCb29sZWFuLlRSVUUuZXF1YWxzKCgoT2JqZWN0W10pYXJndW1lbnQpWzJdKTslPgotPCVmaW5hbCBTdHJpbmcgcHVibGljU3RhdGljRmluYWxGbGFnID0gaXNJbXBsZW1lbnRhdGlvbiA/ICJwdWJsaWMgc3RhdGljIGZpbmFsICIgOiAiIjslPgotPCVmaW5hbCBTdHJpbmcgc2luZ2xlV2lsZGNhcmQgPSBnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwID8gIjw/PiIgOiAiIjslPgotPCVmaW5hbCBTdHJpbmcgbmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uID0gZ2VuQ2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiAtICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQobnVsbCkgOiAiIjslPgotPCVmaW5hbCBTdHJpbmcgcG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uID0gZ2VuQ2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQobnVsbCkgOiAiIjslPgotPCVAIGluY2x1ZGUgZmlsZT0iLi4vSGVhZGVyLmphdmFqZXRpbmMiJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLXBhY2thZ2UgPCU9Z2VuUGFja2FnZS5nZXRJbnRlcmZhY2VQYWNrYWdlTmFtZSgpJT47Ci08JX0gZWxzZSB7JT4KLXBhY2thZ2UgPCU9Z2VuUGFja2FnZS5nZXRDbGFzc1BhY2thZ2VOYW1lKCklPjsKLTwlfSU+Ci0KLTwlZ2VuTW9kZWwubWFya0ltcG9ydExvY2F0aW9uKHN0cmluZ0J1ZmZlciwgZ2VuUGFja2FnZSk7JT4KLQotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+PCU9Z2VuQ2xhc3MuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08JWlmIChnZW5DbGFzcy5oYXNEb2N1bWVudGF0aW9uKCkpIHslPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogPCU9Z2VuQ2xhc3MuZ2V0RG9jdW1lbnRhdGlvbihnZW5Nb2RlbC5nZXRJbmRlbnRhdGlvbihzdHJpbmdCdWZmZXIpKSU+Ci0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci08JX0lPgotICoKLTwlaWYgKCFnZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLTwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpKSB7JT4KLSAgPCVpZiAoIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkR2V0VmlzaWJpbGl0eSgpKSB7JT4KLSAqICAgPGxpPntAbGluayA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPiA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fTwvbGk+Ci0gIDwlfSU+Ci08JX0lPgotICogPC91bD4KLSAqIDwvcD4KLTwlfSU+Ci0gKgotPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNZXRhRGF0YSgpKSB7JT4KLSAqIEBzZWUgPCU9Z2VuUGFja2FnZS5nZXRRdWFsaWZpZWRQYWNrYWdlSW50ZXJmYWNlTmFtZSgpJT4jZ2V0PCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NpZmllckFjY2Vzc29yTmFtZSgpJT4oKQotPCV9JT4KLTwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTW9kZWxUYWdzKCkpIHsgYm9vbGVhbiBmaXJzdCA9IHRydWU7IGZvciAoU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZ2VuQ2xhc3MuZ2V0TW9kZWxJbmZvKCksICJcblxyIik7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgeyBTdHJpbmcgbW9kZWxJbmZvID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOyBpZiAoZmlyc3QpIHsgZmlyc3QgPSBmYWxzZTslPgotICogQG1vZGVsIDwlPW1vZGVsSW5mbyU+Ci08JX0gZWxzZSB7JT4KLSAqICAgICAgICA8JT1tb2RlbEluZm8lPgotPCV9fSBpZiAoZmlyc3QpIHslPgotICogQG1vZGVsCi08JX19JT4KLTwlaWYgKGdlbkNsYXNzLm5lZWRzUm9vdEV4dGVuZHNJbnRlcmZhY2VFeHRlbmRzVGFnKCkpIHslPgotICogQGV4dGVuZHMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKGdlbk1vZGVsLmdldFJvb3RFeHRlbmRzSW50ZXJmYWNlKCkpJT4KLTwlfSU+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLTwlfSBlbHNlIHslPgotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPjwlPWdlbkNsYXNzLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci08JWlmICghZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLTwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkpIHslPgotICogICA8bGk+e0BsaW5rIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZENsYXNzTmFtZSgpJT4jPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn08L2xpPgotPCV9JT4KLSAqIDwvdWw+Ci08JX0lPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24pIHslPgotcHVibGljPCVpZiAoZ2VuQ2xhc3MuaXNBYnN0cmFjdCgpKSB7JT4gYWJzdHJhY3Q8JX0lPiBjbGFzcyA8JT1nZW5DbGFzcy5nZXRDbGFzc05hbWUoKSU+PCU9Z2VuQ2xhc3MuZ2V0VHlwZVBhcmFtZXRlcnMoKS50cmltKCklPjwlPWdlbkNsYXNzLmdldENsYXNzRXh0ZW5kcygpJT48JT1nZW5DbGFzcy5nZXRDbGFzc0ltcGxlbWVudHMoKSU+Ci08JX0gZWxzZSB7JT4KLXB1YmxpYyBpbnRlcmZhY2UgPCU9Z2VuQ2xhc3MuZ2V0SW50ZXJmYWNlTmFtZSgpJT48JT1nZW5DbGFzcy5nZXRUeXBlUGFyYW1ldGVycygpLnRyaW0oKSU+PCU9Z2VuQ2xhc3MuZ2V0SW50ZXJmYWNlRXh0ZW5kcygpJT4KLTwlfSU+Ci17Ci08JWlmIChnZW5Nb2RlbC5oYXNDb3B5cmlnaHRGaWVsZCgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQk8JT1wdWJsaWNTdGF0aWNGaW5hbEZsYWclPjwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS5sYW5nLlN0cmluZyIpJT4gY29weXJpZ2h0ID0gPCU9Z2VuTW9kZWwuZ2V0Q29weXJpZ2h0RmllbGRMaXRlcmFsKCklPjs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbk1vZGVsLmdldERyaXZlck51bWJlcigpICE9IG51bGwpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLmxhbmcuU3RyaW5nIiklPiBtb2ZEcml2ZXJOdW1iZXIgPSAiPCU9Z2VuTW9kZWwuZ2V0RHJpdmVyTnVtYmVyKCklPiI7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5pc0phdmFJT1NlcmlhbGl6YWJsZSgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7IFN0cmluZyBlVmlydHVhbFZhbHVlc0ZpZWxkID0gZ2VuQ2xhc3MuZ2V0RVZpcnR1YWxWYWx1ZXNGaWVsZCgpOyU+Ci0gIDwlaWYgKGVWaXJ0dWFsVmFsdWVzRmllbGQgIT0gbnVsbCkgeyU+Ci0JLyoqCi0JICogQW4gYXJyYXkgb2Ygb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBvZiBub24tcHJpbWl0aXZlIGZlYXR1cmVzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3RbXSA8JT1lVmlydHVhbFZhbHVlc0ZpZWxkJT47Ci0KLSAgPCV9JT4KLSAgPCV7IExpc3Q8U3RyaW5nPiBlVmlydHVhbEluZGV4Qml0RmllbGRzID0gZ2VuQ2xhc3MuZ2V0RVZpcnR1YWxJbmRleEJpdEZpZWxkcyhuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7JT4KLSAgICA8JWlmICghZVZpcnR1YWxJbmRleEJpdEZpZWxkcy5pc0VtcHR5KCkpIHslPgotICAgICAgPCVmb3IgKFN0cmluZyBlVmlydHVhbEluZGV4Qml0RmllbGQgOiBlVmlydHVhbEluZGV4Qml0RmllbGRzKSB7JT4KLQkvKioKLQkgKiBBIGJpdCBmaWVsZCByZXByZXNlbnRpbmcgdGhlIGluZGljZXMgb2Ygbm9uLXByaW1pdGl2ZSBmZWF0dXJlIHZhbHVlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IDwlPWVWaXJ0dWFsSW5kZXhCaXRGaWVsZCU+OwotCi0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5pc01vZGVsUm9vdCgpICYmIGdlbk1vZGVsLmlzQm9vbGVhbkZsYWdzRW5hYmxlZCgpICYmIGdlbk1vZGVsLmdldEJvb2xlYW5GbGFnc1Jlc2VydmVkQml0cygpID09IC0xKSB7JT4KLQkvKioKLQkgKiBBIHNldCBvZiBiaXQgZmxhZ3MgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgb2YgYm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCB3aGV0aGVyIHVuc2V0dGFibGUgZmVhdHVyZXMgaGF2ZSBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgPCU9Z2VuTW9kZWwuZ2V0Qm9vbGVhbkZsYWdzRmllbGQoKSU+ID0gMDsKLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0gIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXREZWNsYXJlZEZpZWxkR2VuRmVhdHVyZXMoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9kZWNsYXJlZEZpZWxkR2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpIHx8IGdlbkZlYXR1cmUuaXNSZWZlcmVuY2VUeXBlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRJbnRlcm5hbFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0KLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC5pc0FycmF5QWNjZXNzb3JzKCkgJiYgZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpICYmICFnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7IFN0cmluZyByYXdMaXN0SXRlbVR5cGUgPSBnZW5GZWF0dXJlLmdldFJhd0xpc3RJdGVtVHlwZSgpOyBpbnQgaW5kZXggPSByYXdMaXN0SXRlbVR5cGUuaW5kZXhPZignWycpOyBTdHJpbmcgaGVhZCA9IHJhd0xpc3RJdGVtVHlwZTsgU3RyaW5nIHRhaWwgPSAiIjsgaWYgKGluZGV4ICE9IC0xKSB7IGhlYWQgPSByYXdMaXN0SXRlbVR5cGUuc3Vic3RyaW5nKDAsIGluZGV4KTsgdGFpbCA9IHJhd0xpc3RJdGVtVHlwZS5zdWJzdHJpbmcoaW5kZXgpOyB9ICU+Ci0JLyoqCi0JICogVGhlIGVtcHR5IHZhbHVlIGZvciB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBcnJheUFjY2Vzc29yKCklPigpIDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyBhcnJheSBhY2Nlc3Nvci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QXJyYXlBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmdldFF1YWxpZmllZExpc3RJdGVtVHlwZShnZW5DbGFzcykuY29udGFpbnMoIjwiKSkgeyU+Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIDwlfSU+Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCA8JT1yYXdMaXN0SXRlbVR5cGUlPltdIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRU1QVFlfQVJSQVkgPSBuZXcgPCU9aGVhZCU+IFswXTwlPXRhaWwlPjsKLQotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaGFzRURlZmF1bHQoKSAmJiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpIHx8ICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgKCFnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpIHx8ICFnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSkpIHsgU3RyaW5nIHN0YXRpY0RlZmF1bHRWYWx1ZSA9IGdlbkZlYXR1cmUuZ2V0U3RhdGljRGVmYXVsdFZhbHVlKCk7JT4KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgICAgIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkgJiYgZ2VuRmVhdHVyZS5pc0xpc3REYXRhVHlwZSgpICYmIGdlbkZlYXR1cmUuaXNTZXREZWZhdWx0VmFsdWUoKSkgeyU+Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIDwlfSU+Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCA8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjwlaWYgKCIiLmVxdWFscyhzdGF0aWNEZWZhdWx0VmFsdWUpKSB7JT47IC8vIFRPRE8gVGhlIGRlZmF1bHQgdmFsdWUgbGl0ZXJhbCAiPCU9Z2VuRmVhdHVyZS5nZXRFY29yZUZlYXR1cmUoKS5nZXREZWZhdWx0VmFsdWVMaXRlcmFsKCklPiIgaXMgbm90IHZhbGlkLjwlfSBlbHNlIHslPiA9IDwlPXN0YXRpY0RlZmF1bHRWYWx1ZSU+OzwlPWdlbk1vZGVsLmdldE5vbk5MUyhzdGF0aWNEZWZhdWx0VmFsdWUpJT48JX0lPgotCi0gICAgICA8JX0lPgotICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuZ2V0RmxhZ0luZGV4KGdlbkZlYXR1cmUpID4gMzEgJiYgZ2VuQ2xhc3MuZ2V0RmxhZ0luZGV4KGdlbkZlYXR1cmUpICUgMzIgPT0gMCkgeyU+Ci0JLyoqCi0JICogQW4gYWRkaXRpb25hbCBzZXQgb2YgYml0IGZsYWdzIHJlcHJlc2VudGluZyB0aGUgdmFsdWVzIG9mIGJvb2xlYW4gYXR0cmlidXRlcyBhbmQgd2hldGhlciB1bnNldHRhYmxlIGZlYXR1cmVzIGhhdmUgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiA9IDA7Ci0KLSAgICAgICAgICA8JX0lPgotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRyA9IDEgPCU9Ijw8ICIgKyBnZW5DbGFzcy5nZXRGbGFnSW5kZXgoZ2VuRmVhdHVyZSkgJSAzMiAlPjsKLQotICAgICAgICA8JX0gZWxzZSB7JT4KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpIDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT48JWlmIChnZW5GZWF0dXJlLmhhc0VEZWZhdWx0KCkpIHslPiA9IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+PCV9JT47Ci0KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5DbGFzcy5pc0VTZXRGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuZ2V0RVNldEZsYWdJbmRleChnZW5GZWF0dXJlKSA+IDMxICYmIGdlbkNsYXNzLmdldEVTZXRGbGFnSW5kZXgoZ2VuRmVhdHVyZSkgJSAzMiA9PSAwKSB7JT4KLQkvKioKLQkgKiBBbiBhZGRpdGlvbmFsIHNldCBvZiBiaXQgZmxhZ3MgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgb2YgYm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCB3aGV0aGVyIHVuc2V0dGFibGUgZmVhdHVyZXMgaGF2ZSBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiA9IDA7Ci0KLSAgICAgICAgPCV9JT4KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgd2hldGhlciB0aGUgPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPiA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcgPSAxIDwlPSI8PCAiICsgZ2VuQ2xhc3MuZ2V0RVNldEZsYWdJbmRleChnZW5GZWF0dXJlKSAlIDMyICU+OwotCi0gICAgICA8JX0gZWxzZSB7JT4KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIDwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4gaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLQotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZGVjbGFyZWRGaWVsZEdlbkZlYXR1cmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZGVjbGFyZWRGaWVsZEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgJiYgIWdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCA8JT1nZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQobnVsbCklPiA9IDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZENsYXNzaWZpZXJBY2Nlc3NvcigpJT4uZ2V0RmVhdHVyZUlEKDwlPWdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5nZXQoMCkuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPikgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmdldCgwKSklPjsKLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuQ2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkpIHslPgotICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpKSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTslPgotICAgIDwlaWYgKHJldmVyc2VGZWF0dXJlICE9IG51bGwgJiYgcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKS5oYXNPZmZzZXRDb3JyZWN0aW9uKCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCA8JT1nZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQoZ2VuRmVhdHVyZSklPiA9IDwlPXJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCkuZ2V0UXVhbGlmaWVkQ2xhc3NpZmllckFjY2Vzc29yKCklPi5nZXRGZWF0dXJlSUQoPCU9cmV2ZXJzZUZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPikgLSA8JT1yZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjsKLQotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JPCVpZiAoZ2VuTW9kZWwuaXNQdWJsaWNDb25zdHJ1Y3RvcnMoKSkgeyU+cHVibGljPCV9IGVsc2UgeyU+cHJvdGVjdGVkPCV9JT4gPCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NOYW1lKCklPigpCi0JewotCQlzdXBlcigpOwotICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RmxhZ0dlbkZlYXR1cmVzKCJ0cnVlIikpIHslPgotCQk8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOwotICA8JX0lPgotICAgIAotIC8vVU1BLS0+Ci0gCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLSAvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwcm90ZWN0ZWQgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzIiklPiBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZENsYXNzaWZpZXJBY2Nlc3NvcigpJT47Ci0JfQotCi08JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvcmVmbGVjdGl2ZURlbGVnYXRpb24ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuTW9kZWwuZ2V0RmVhdHVyZURlbGVnYXRpb24oKSA9PSBHZW5EZWxlZ2F0aW9uS2luZC5SRUZMRUNUSVZFX0xJVEVSQUwgJiYgKGdlbkNsYXNzLmdldENsYXNzRXh0ZW5kc0dlbkNsYXNzKCkgPT0gbnVsbCB8fCBnZW5DbGFzcy5nZXRDbGFzc0V4dGVuZHNHZW5DbGFzcygpLmdldEdlbk1vZGVsKCkuZ2V0RmVhdHVyZURlbGVnYXRpb24oKSAhPSBHZW5EZWxlZ2F0aW9uS2luZC5SRUZMRUNUSVZFX0xJVEVSQUwpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHJvdGVjdGVkIGludCBlU3RhdGljRmVhdHVyZUNvdW50KCkKLQl7Ci0JCXJldHVybiA8JT1nZW5DbGFzcy5nZXRDbGFzc0V4dGVuZHNHZW5DbGFzcygpID09IG51bGwgPyAwIDogZ2VuQ2xhc3MuZ2V0Q2xhc3NFeHRlbmRzR2VuQ2xhc3MoKS5nZXRBbGxHZW5GZWF0dXJlcygpLnNpemUoKSU+OwotCX0KLQotPCV9JT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvcmVmbGVjdGl2ZURlbGVnYXRpb24ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JW5ldyBSdW5uYWJsZSgpIHsgcHVibGljIHZvaWQgcnVuKCkgeyU+Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogKGlzSW1wbGVtZW50YXRpb24gPyBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkgOiBnZW5DbGFzcy5nZXREZWNsYXJlZEdlbkZlYXR1cmVzKCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLSAgPCVpZiAoZ2VuTW9kZWwuaXNBcnJheUFjY2Vzc29ycygpICYmIGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCTwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+W10gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBcnJheUFjY2Vzc29yKCklPigpOwotCi0gICAgPCV9IGVsc2UgeyU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpKSB7JT4KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgIDwlfSU+Ci0JcHVibGljIDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+W10gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBcnJheUFjY2Vzc29yKCklPigpCi0JewotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0IiklPjwlPWdlbkZlYXR1cmUuZ2V0TGlzdFRlbXBsYXRlQXJndW1lbnRzKGdlbkNsYXNzKSU+IGxpc3QgPSAoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCIpJT48JT1nZW5GZWF0dXJlLmdldExpc3RUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotCQlpZiAobGlzdC5pc0VtcHR5KCkpIHJldHVybiA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpICYmICFnZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcykuY29udGFpbnMoIjwiKSAmJiAhZ2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUobnVsbCkuZXF1YWxzKGdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSkpIHslPig8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPltdKTwlfSU+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VFTVBUWV9BUlJBWTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPT0gbnVsbCB8fCA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPi5pc0VtcHR5KCkpIHJldHVybiA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpICYmICFnZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcykuY29udGFpbnMoIjwiKSAmJiAhZ2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUobnVsbCkuZXF1YWxzKGdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSkpIHslPig8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPltdKTwlfSU+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VFTVBUWV9BUlJBWTsKLQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCIpJT48JT1nZW5GZWF0dXJlLmdldExpc3RUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPiBsaXN0ID0gKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QiKSU+PCU9Z2VuRmVhdHVyZS5nZXRMaXN0VGVtcGxhdGVBcmd1bWVudHMoZ2VuQ2xhc3MpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICA8JX0lPgotCQlsaXN0LnNocmluaygpOwotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+W10pbGlzdC5kYXRhKCk7Ci0JfQotCi0gICAgPCV9JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICA8JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT4gZ2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KGludCBpbmRleCk7Ci0KLSAgICA8JX0gZWxzZSB7JT4KLQlwdWJsaWMgPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT4gZ2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KGludCBpbmRleCkKLQl7Ci0JCXJldHVybiA8JWlmICghZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+KDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+KTwlfSU+PCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5nZXQoaW5kZXgpOwotCX0KLQotICAgIDwlfSU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCWludCBnZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT5MZW5ndGgoKTsKLQotICAgIDwlfSBlbHNlIHslPgotCXB1YmxpYyBpbnQgZ2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+TGVuZ3RoKCkKLQl7Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLnNpemUoKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPT0gbnVsbCA/IDAgOiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPi5zaXplKCk7Ci0gICAgICA8JX0lPgotCX0KLQotICAgIDwlfSU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCXZvaWQgc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+W10gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPik7Ci0KLSAgICA8JX0gZWxzZSB7JT4KLQlwdWJsaWMgdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT5bXSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KQotCXsKLQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0IiklPjwlPWdlbkZlYXR1cmUuZ2V0TGlzdFRlbXBsYXRlQXJndW1lbnRzKGdlbkNsYXNzKSU+KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLnNldERhdGEobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5sZW5ndGgsIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pOwotCX0KLQotICAgIDwlfSU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCXZvaWQgc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KGludCBpbmRleCwgPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT4gZWxlbWVudCk7Ci0KLSAgICA8JX0gZWxzZSB7JT4KLQlwdWJsaWMgdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oaW50IGluZGV4LCA8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPiBlbGVtZW50KQotCXsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5zZXQoaW5kZXgsIGVsZW1lbnQpOwotCX0KLQotICAgIDwlfSU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNHZXQoKSAmJiAoaXNJbXBsZW1lbnRhdGlvbiB8fCAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRHZXRWaXNpYmlsaXR5KCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dldEdlbkZlYXR1cmUuamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2I+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHsgR2VuRmVhdHVyZSBrZXlGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRNYXBFbnRyeVR5cGVHZW5DbGFzcygpLmdldE1hcEVudHJ5S2V5RmVhdHVyZSgpOyBHZW5GZWF0dXJlIHZhbHVlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0TWFwRW50cnlUeXBlR2VuQ2xhc3MoKS5nZXRNYXBFbnRyeVZhbHVlRmVhdHVyZSgpOyAlPgotCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSA8JWlmIChrZXlGZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+bGlzdCBvZiB7QGxpbmsgPCU9a2V5RmVhdHVyZS5nZXRRdWFsaWZpZWRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT59PCV9IGVsc2UgeyU+e0BsaW5rIDwlPWtleUZlYXR1cmUuZ2V0VHlwZShnZW5DbGFzcyklPn08JX0lPiwKLQkgKiBhbmQgdGhlIHZhbHVlIGlzIG9mIHR5cGUgPCVpZiAodmFsdWVGZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+bGlzdCBvZiB7QGxpbmsgPCU9dmFsdWVGZWF0dXJlLmdldFF1YWxpZmllZExpc3RJdGVtVHlwZShnZW5DbGFzcyklPn08JX0gZWxzZSB7JT57QGxpbmsgPCU9dmFsdWVGZWF0dXJlLmdldFR5cGUoZ2VuQ2xhc3MpJT59PCV9JT4sCi0gICAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSAmJiAhKGdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNZXRhRGF0YSgpICYmICJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIuZXF1YWxzKGdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkTGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSkpKSB7Ci1TdHJpbmcgdHlwZU5hbWUgPSBnZW5GZWF0dXJlLmdldFF1YWxpZmllZExpc3RJdGVtVHlwZShnZW5DbGFzcyk7IFN0cmluZyBoZWFkID0gdHlwZU5hbWU7IFN0cmluZyB0YWlsID0gIiI7IGludCBpbmRleCA9IHR5cGVOYW1lLmluZGV4T2YoJzwnKTsgaWYgKGluZGV4ID09IC0xKSB7IGluZGV4ID0gdHlwZU5hbWUuaW5kZXhPZignWycpOyB9IAotaWYgKGluZGV4ICE9IC0xKSB7IGhlYWQgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOyB0YWlsID0gdHlwZU5hbWUuc3Vic3RyaW5nKGluZGV4KS5yZXBsYWNlQWxsKCI8IiwgIiZsdDsiKTsgfQotJT4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgPCU9aGVhZCU+fTwlPXRhaWwlPi4KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNTZXREZWZhdWx0VmFsdWUoKSkgeyU+Ci0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+PCU9Z2VuRmVhdHVyZS5nZXREZWZhdWx0VmFsdWUoKSU+PC9jb2RlPi4KLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKSAhPSBudWxsKSB7JT4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayA8JT1nZW5GZWF0dXJlLmdldFR5cGVHZW5FbnVtKCkuZ2V0UXVhbGlmaWVkTmFtZSgpJT59LgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSAmJiAhZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCkuZ2V0R2VuQ2xhc3MoKS5pc01hcEVudHJ5KCkpIHsgR2VuRmVhdHVyZSByZXZlcnNlR2VuRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyAlPgotICAgICAgPCVpZiAoIXJldmVyc2VHZW5GZWF0dXJlLmlzU3VwcHJlc3NlZEdldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgPCU9cmV2ZXJzZUdlbkZlYXR1cmUuZ2V0R2VuQ2xhc3MoKS5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1yZXZlcnNlR2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPXJldmVyc2VHZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59Jy4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dldEdlbkZlYXR1cmUuamF2YWRvYy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgPCVpZiAoIWdlbkZlYXR1cmUuaGFzRG9jdW1lbnRhdGlvbigpKSB7JT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0gICAgPCV9JT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmhhc0RvY3VtZW50YXRpb24oKSkgeyU+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogPCU9Z2VuRmVhdHVyZS5nZXREb2N1bWVudGF0aW9uKGdlbk1vZGVsLmdldEluZGVudGF0aW9uKHN0cmluZ0J1ZmZlcikpJT4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gICAgPCV9JT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotICAgIDwlaWYgKGdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKSAhPSBudWxsKSB7JT4KLQkgKiBAc2VlIDwlPWdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKS5nZXRRdWFsaWZpZWROYW1lKCklPgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRJc1NldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjaXNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDaGFuZ2VhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkVW5zZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3Vuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ2hhbmdlYWJsZSgpICYmICFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldFJhd0ltcG9ydGVkQm91bmRUeXBlKCklPikKLSAgICA8JX0lPgotICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTWV0YURhdGEoKSkgeyU+Ci0JICogQHNlZSA8JT1nZW5QYWNrYWdlLmdldFF1YWxpZmllZFBhY2thZ2VJbnRlcmZhY2VOYW1lKCklPiNnZXQ8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkgJiYgIWdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpLmdldEdlbkNsYXNzKCkuaXNNYXBFbnRyeSgpKSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUdlbkZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgJT4KLSAgICAgIDwlaWYgKCFyZXZlcnNlR2VuRmVhdHVyZS5pc1N1cHByZXNzZWRHZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgPCU9cmV2ZXJzZUdlbkZlYXR1cmUuZ2V0R2VuQ2xhc3MoKS5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1yZXZlcnNlR2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc0VNRk1vZGVsVGFncygpKSB7IGJvb2xlYW4gZmlyc3QgPSB0cnVlOyBmb3IgKFN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGdlbkZlYXR1cmUuZ2V0TW9kZWxJbmZvKCksICJcblxyIik7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgeyBTdHJpbmcgbW9kZWxJbmZvID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOyBpZiAoZmlyc3QpIHsgZmlyc3QgPSBmYWxzZTslPgotCSAqIEBtb2RlbCA8JT1tb2RlbEluZm8lPgotICAgIDwlfSBlbHNlIHslPgotCSAqICAgICAgICA8JT1tb2RlbEluZm8lPgotICAgIDwlfX0gaWYgKGZpcnN0KSB7JT4KLQkgKiBAbW9kZWwKLSAgICA8JX19JT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JUAgZW5kICU+PCUvL0NsYXNzL2dldEdlbkZlYXR1cmUuamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfSBlbHNlIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyAvL0NsYXNzL2dldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLTwlfSU+Ci08JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLQotPCV9IGVsc2UgeyU+Ci0gIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkgJiYgKChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkgfHwgZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkpICYmICFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkZlYXR1cmUuaXNVbmNoZWNrZWRDYXN0KCkgfHwgZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgKGdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSB8fCBnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHx8IGdlbkZlYXR1cmUuaXNMaXN0RGF0YVR5cGUoKSAmJiBnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSkgeyU+Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIDwlfSU+Ci0JcHVibGljIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLQl7Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZXRHZW5GZWF0dXJlLnByZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotICAgIDwlaWYgKGdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0JCXJldHVybiA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4oPCV9JT4oPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KWVHZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCB0cnVlKTwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPikuPCU9Z2VuRmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpPCV9JT47Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0lPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPT0gbnVsbCkKLQkJewotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJZVZpcnR1YWxTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBuZXcgPCU9Z2VuQ2xhc3MuZ2V0TGlzdENvbnN0cnVjdG9yKGdlbkZlYXR1cmUpJT4pOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbmV3IDwlPWdlbkNsYXNzLmdldExpc3RDb25zdHJ1Y3RvcihnZW5GZWF0dXJlKSU+OwotICAgICAgICA8JX0lPgotCQl9Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjwlPWdlbkZlYXR1cmUuaXNNYXBUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZVN1cHByZXNzRU1GVHlwZXMoKSA/ICIubWFwKCkiIDogIiIlPjsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkpIHslPgotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillQ29udGFpbmVyKCk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkpIHslPgotICAgICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT48JWlmIChnZW5GZWF0dXJlLmhhc0VEZWZhdWx0KCkpIHslPiwgPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT48JX0lPik7Ci0gICAgICAgICAgPCV9JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZUFzRU9iamVjdCgpJT4uZUlzUHJveHkoKSkKLQkJewotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0JCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0Tm9uRU9iamVjdEludGVybmFsVHlwZUNhc3QoZ2VuQ2xhc3MpJT5lUmVzb2x2ZVByb3h5KG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pOwotCQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pCi0JCQl7Ci0gICAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZUNvbnRhaW5zKCkpIHslPgotCQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9ICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpKSB7JT4KLQkJCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgPCV9IGVsc2UgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIHJldmVyc2VPZmZzZXRDb3JyZWN0aW9uID0gdGFyZ2V0Q2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQocmV2ZXJzZUZlYXR1cmUpIDogIiI7JT4KLQkJCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4uZUludmVyc2VSZW1vdmUodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbnVsbCk7Ci0gICAgICAgICAgPCV9JT4KLQkJCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKQotCQkJCXsKLSAgICAgICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSkgeyU+Ci0JCQkJCW1zZ3MgPSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBudWxsLCBtc2dzKTsKLSAgICAgICAgICA8JX0gZWxzZSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyBTdHJpbmcgcmV2ZXJzZU9mZnNldENvcnJlY3Rpb24gPSB0YXJnZXRDbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgPyAiICsgIiArIGdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChyZXZlcnNlRmVhdHVyZSkgOiAiIjslPgotCQkJCQltc2dzID0gIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4uZUludmVyc2VBZGQodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0gICAgICAgICAgPCV9JT4KLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotICAgICAgICAgIDwlfSBlbHNlIGlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCWVWaXJ0dWFsU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlJFU09MVkUsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLQkJCX0KLQkJfQotICAgICAgICA8JX0lPgotICAgICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkgJiYgZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+PCVpZiAoZ2VuRmVhdHVyZS5oYXNFRGVmYXVsdCgpKSB7JT4sIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+PCV9JT4pOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJcmV0dXJuICg8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcpICE9IDA7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHsvL3ZvbGF0aWxlJT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpICYmICFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gYmFzaWNHZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKTsKLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZUFzRU9iamVjdCgpJT4uZUlzUHJveHkoKSA/IDwlPWdlbkZlYXR1cmUuZ2V0Tm9uRU9iamVjdEludGVybmFsVHlwZUNhc3QoZ2VuQ2xhc3MpJT5lUmVzb2x2ZVByb3h5KCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KSA6IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLSAgICAgICAgPCVTdHJpbmcgZmVhdHVyZU1hcEVudHJ5VGVtcGxhdGVBcmd1bWVudCA9IGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTAgPyAiPCIgKyBnZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSArICIuRW50cnk+IiA6ICIiOyU+Ci0gICAgICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gbmV3IDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRFZmZlY3RpdmVGZWF0dXJlTWFwV3JhcHBlckNsYXNzKCklPigoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkuPCU9ZmVhdHVyZU1hcEVudHJ5VGVtcGxhdGVBcmd1bWVudCU+bGlzdCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pKTsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+KWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkuPCU9ZmVhdHVyZU1hcEVudHJ5VGVtcGxhdGVBcmd1bWVudCU+bGlzdCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpLmxpc3QoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkubGlzdCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJcmV0dXJuIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPig8JX0lPjwlaWYgKGdlbkZlYXR1cmUuZ2V0VHlwZUdlbkRhdGFUeXBlKCkgPT0gbnVsbCB8fCAhZ2VuRmVhdHVyZS5nZXRUeXBlR2VuRGF0YVR5cGUoKS5pc09iamVjdFR5cGUoKSkgeyU+KDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPik8JX0lPigoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKS5nZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCB0cnVlKTwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPikuPCU9Z2VuRmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpPCV9JT47Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4oPCV9JT48JWlmIChnZW5GZWF0dXJlLmdldFR5cGVHZW5EYXRhVHlwZSgpID09IG51bGwgfHwgIWdlbkZlYXR1cmUuZ2V0VHlwZUdlbkRhdGFUeXBlKCkuaXNPYmplY3RUeXBlKCkpIHslPig8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4pPCV9JT5nZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpLmdldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIHRydWUpPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KS48JT1nZW5GZWF0dXJlLmdldFByaW1pdGl2ZVZhbHVlRnVuY3Rpb24oKSU+KCk8JX0lPjsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+Ci0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLQkJLy8gVGhlIGxpc3QgaXMgZXhwZWN0ZWQgdG8gaW1wbGVtZW50IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QgYW5kIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZwotCQkvLyBzbyBpdCdzIGxpa2VseSB0aGF0IGFuIGFwcHJvcHJpYXRlIHN1YmNsYXNzIG9mIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLjwlaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHslPkVjb3JlRU1hcDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSkgeyU+QmFzaWNGZWF0dXJlTWFwPCV9IGVsc2UgeyU+RWNvcmVFTGlzdDwlfSU+IHNob3VsZCBiZSB1c2VkLgotICAgICAgICA8JX0lPgotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvZ2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZ2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkZlYXR1cmUuaXNCYXNpY0dldCgpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyAvL0NsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlfSU+Ci0JcHVibGljIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IGJhc2ljR2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLQl7Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUucHJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpKSB7JT4KLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZUludGVybmFsQ29udGFpbmVyKCk7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpLmdldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIGZhbHNlKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkuZ2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgZmFsc2UpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyAtPiBkbyBub3QgcGVyZm9ybSBwcm94eSByZXNvbHV0aW9uCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCVAIGVuZCAlPjwlLy9DbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5GZWF0dXJlLmlzQmFzaWNTZXQoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHsgLy9DbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JX0lPgotCXB1YmxpYyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkSW50ZXJuYWxUeXBlKGdlbkNsYXNzKSU+IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MpCi0JewotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDb250YWluZXIoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUucHJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbXNncyk7Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUucG9zdC5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCQlyZXR1cm4gbXNnczsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5wcmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCU9iamVjdCBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gZVZpcnR1YWxTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT47Ci0gICAgICA8JX0lPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gaXNTZXRDaGFuZ2UgPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID09IEVWSVJUVUFMX05PX1ZBTFVFOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiB8PSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IHRydWU7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+IG5vdGlmaWNhdGlvbiA9IG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlID8gbnVsbCA6IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2U8JX0gZWxzZSB7JT4hb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQ8JX0lPik7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4gbm90aWZpY2F0aW9uID0gbmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBFVklSVFVBTF9OT19WQUxVRSA/IG51bGwgOiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KTsKLSAgICAgICAgPCV9JT4KLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotICAgICAgPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5wb3N0Lmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JCXJldHVybiBtc2dzOwotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKSkuYmFzaWNBZGQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBtc2dzKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmJhc2ljQWRkKDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbXNncyk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgY29udGFpbmVkICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyAtPiB0aGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5IGludm9rZWQgdG8ga2VlcCB0aGUgY29udGFpbm1lbnQgcmVsYXRpb25zaGlwIGluIHN5bmNoCi0JCS8vIC0+IGRvIG5vdCBtb2RpZnkgb3RoZXIgZmVhdHVyZXMKLQkJLy8gLT4gcmV0dXJuIG1zZ3MsIGFmdGVyIGFkZGluZyBhbnkgZ2VuZXJhdGVkIE5vdGlmaWNhdGlvbiB0byBpdCAoaWYgaXQgaXMgbnVsbCwgYSBOb3RpZmljYXRpb25DaGFpbiBvYmplY3QgbXVzdCBiZSBjcmVhdGVkIGZpcnN0KQotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlQCBlbmQgJT48JS8vQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotICA8JWlmIChnZW5GZWF0dXJlLmlzU2V0KCkgJiYgKGlzSW1wbGVtZW50YXRpb24gfHwgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSgpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci08JWlmIChpc0ludGVyZmFjZSkgeyAlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkSW50ZXJmYWNlTmFtZSgpJT4jPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5qYXZhZG9jLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFbnVtVHlwZSgpKSB7JT4KLQkgKiBAc2VlIDwlPWdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKS5nZXRRdWFsaWZpZWROYW1lKCklPgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRJc1NldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjaXNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFVuc2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICN1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlQCBlbmQgJT48JS8vQ2xhc3Mvc2V0R2VuRmVhdHVyZS5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7IC8vQ2xhc3Mvc2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JX0lPgotPCV9JT4KLTwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7ICU+Ci0Jdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gdmFsdWUpOwotCi08JX0gZWxzZSB7JT4KLQlwdWJsaWMgdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikKLQl7Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLnByZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotICAgIDwlaWYgKGdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0JCWVTZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5uZXcgPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KDwlfSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPik8JX0lPik7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkpIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7IFN0cmluZyByZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiA9IHRhcmdldENsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSA/ICIgKyAiICsgZ2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKHJldmVyc2VGZWF0dXJlKSA6ICIiOyU+Ci0JCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4gJiYgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBudWxsKSkKLQkJewotCQkJaWYgKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsIiklPi5pc0FuY2VzdG9yKHRoaXMsIDwlPWdlbkZlYXR1cmUuZ2V0RU9iamVjdENhc3QoKSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikpCi0JCQkJdGhyb3cgbmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpJT4oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikuZUludmVyc2VBZGQodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbnRlcm5hbFR5cGVDYXN0KCklPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0gICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pKTsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpIHx8IGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVDb250YWlucygpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICAgIDwlfSU+Ci0JCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KQotCQl7Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gbnVsbDsKLQkJCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsKQotICAgICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSkgeyU+Ci0JCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gbnVsbCkKLQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KW5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBudWxsLCBtc2dzKTsKLSAgICAgICAgPCV9IGVsc2UgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIHJldmVyc2VPZmZzZXRDb3JyZWN0aW9uID0gdGFyZ2V0Q2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQocmV2ZXJzZUZlYXR1cmUpIDogIiI7JT4KLQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT48JT1yZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiluZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KS5lSW52ZXJzZUFkZCh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT48JT1yZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLSAgICAgICAgPCV9JT4KLQkJCW1zZ3MgPSBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEludGVybmFsVHlwZUNhc3QoKSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0JCWVsc2UKLQkJewotICAgICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gZVZpcnR1YWxJc1NldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgICAgIDwlfSU+Ci0JCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0gICAgICAgICAgICA8JX0lPgotCQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IHRydWU7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCAhb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQpKTsKLSAgICAgICAgICA8JX0lPgotCQl9Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pKTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSAoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwOwotICAgICAgICAgIDwlfSU+Ci0JCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KSA8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOyBlbHNlIDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOwotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpIHx8IGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRW51bVR5cGUoKSkgeyU+Ci0gICAgICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+IDogbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjsKLSAgICAgICAgICAgIDwlfSBlbHNlIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+IDogbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjsKLSAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0SW50ZXJuYWxUeXBlQ2FzdCgpJT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+OwotICAgICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRJbnRlcm5hbFR5cGVDYXN0KCklPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT47Ci0gICAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJT2JqZWN0IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSBlVmlydHVhbFNldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJYm9vbGVhbiBpc1NldENoYW5nZSA9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gRVZJUlRVQUxfTk9fVkFMVUU7Ci0gICAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgICAgIDwlfSU+Ci0JCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotICAgICAgICAgICAgPCV9JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IHRydWU7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5pc1NldENoYW5nZSA/IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+IDogb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+PCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT48JX0lPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5pc1NldENoYW5nZTwlfSBlbHNlIHslPiFvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldDwlfSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBFVklSVFVBTF9OT19WQUxVRSA/IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+IDogb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+PCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT48JX0lPikpOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5wb3N0Lmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkpLnNldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPm5ldyA8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4oPCV9JT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KTwlfSU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuc2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+bmV3IDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPig8JX0lPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4pPCV9JT4pOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3NldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4KLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL3NldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBlbmQgJT48JS8vQ2xhc3Mvc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkZlYXR1cmUuaXNCYXNpY1Vuc2V0KCkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNVbnNldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHsgLy9DbGFzcy9iYXNpY1Vuc2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1Vuc2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gYmFzaWNVbnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzKQotCXsKLSAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJT2JqZWN0IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSBlVmlydHVhbFVuc2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBudWxsOwotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gaXNTZXRDaGFuZ2UgPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IEVWSVJUVUFMX05PX1ZBTFVFOwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0JCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IGZhbHNlOwotICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4gbm90aWZpY2F0aW9uID0gbmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5VTlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5pc1NldENoYW5nZSA/IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gOiBudWxsPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCBudWxsLCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQ8JX0lPik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0gICAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1Vuc2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byB1bnNldCB0aGUgY29udGFpbmVkICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyAtPiB0aGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5IGludm9rZWQgdG8ga2VlcCB0aGUgY29udGFpbm1lbnQgcmVsYXRpb25zaGlwIGluIHN5bmNoCi0JCS8vIC0+IGRvIG5vdCBtb2RpZnkgb3RoZXIgZmVhdHVyZXMKLQkJLy8gLT4gcmV0dXJuIG1zZ3MsIGFmdGVyIGFkZGluZyBhbnkgZ2VuZXJhdGVkIE5vdGlmaWNhdGlvbiB0byBpdCAoaWYgaXQgaXMgbnVsbCwgYSBOb3RpZmljYXRpb25DaGFpbiBvYmplY3QgbXVzdCBiZSBjcmVhdGVkIGZpcnN0KQotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvYmFzaWNVbnNldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCVAIGVuZCAlPjwlLy9DbGFzcy5iYXNpY1Vuc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0KCkgJiYgKGlzSW1wbGVtZW50YXRpb24gfHwgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkVW5zZXRWaXNpYmlsaXR5KCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3Vuc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEludGVyZmFjZU5hbWUoKSU+IzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+IDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3Vuc2V0R2VuRmVhdHVyZS5qYXZhZG9jLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgPCVpZiAoIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkSXNTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI2lzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgPCV9JT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0gIDwlaWYgKCFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldFJhd0ltcG9ydGVkQm91bmRUeXBlKCklPikKLSAgPCV9JT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JUAgZW5kICU+PCUvL0NsYXNzL3Vuc2V0R2VuRmVhdHVyZS5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7IC8vQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jJT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3Vuc2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLTwlfSU+Ci08JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0Jdm9pZCB1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotCi08JX0gZWxzZSB7JT4KLQlwdWJsaWMgdm9pZCB1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0JewotICAgIDwlaWYgKGdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0JCWVVbnNldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgPCV9JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwpICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPi5VbnNldHRhYmxlPCU9c2luZ2xlV2lsZGNhcmQlPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikudW5zZXQoKTsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpIHx8IGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVDb250YWlucygpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICAgIDwlfSU+Ci0JCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsKQotCQl7Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gbnVsbDsKLSAgICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkpIHslPgotCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG51bGwsIG1zZ3MpOwotICAgICAgICA8JX0gZWxzZSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyBTdHJpbmcgcmV2ZXJzZU9mZnNldENvcnJlY3Rpb24gPSB0YXJnZXRDbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgPyAiICsgIiArIGdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChyZXZlcnNlRmVhdHVyZSkgOiAiIjslPgotCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0gICAgICAgIDwlfSU+Ci0JCQltc2dzID0gYmFzaWNVbnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlCi0JCXsKLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSBlVmlydHVhbElzU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0gICAgICAgICAgPCV9JT4KLQkJCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLSAgICAgICAgICA8JX0lPgotCQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IGZhbHNlOwotICAgICAgICA8JX0lPgotICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uVU5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG51bGwsIG51bGwsIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0KSk7Ci0gICAgICAgIDwlfSU+Ci0JCX0KLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMDsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJT2JqZWN0IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSBlVmlydHVhbFVuc2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCWJvb2xlYW4gaXNTZXRDaGFuZ2UgPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IEVWSVJUVUFMX05PX1ZBTFVFOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNSZWZlcmVuY2VUeXBlKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG51bGw7Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0gICAgICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSBmYWxzZTsKLSAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlVOU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlID8gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA6IG51bGw8JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIG51bGwsIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2U8JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldDwlfSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+KSA8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOyBlbHNlIDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOwotICAgICAgICAgIDwlfSBlbHNlIGlmICghZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpIHx8IGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+OwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSB8fCBnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLSAgICAgICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICY9IH48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IGZhbHNlOwotICAgICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uVU5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+aXNTZXRDaGFuZ2UgPyBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+IDogPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT48JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPmlzU2V0Q2hhbmdlPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQ8JX0lPikpOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpKS5jbGVhcig8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbClnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5jbGVhcig8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3Vuc2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byB1bnNldCB0aGUgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+Ci0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy91bnNldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotICA8JWlmIChnZW5GZWF0dXJlLmlzSXNTZXQoKSAmJiAoaXNJbXBsZW1lbnRhdGlvbiB8fCAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRJc1NldFZpc2liaWxpdHkoKSkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci08JWlmIChpc0ludGVyZmFjZSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pc1NldEdlbkZlYXR1cmUuamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkSW50ZXJmYWNlTmFtZSgpJT4jPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGlzIHNldC4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2lzU2V0R2VuRmVhdHVyZS5qYXZhZG9jLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4gaXMgc2V0LgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDaGFuZ2VhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkVW5zZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3Vuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICA8JX0lPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLSAgICA8JWlmICghZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0NoYW5nZWFibGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldFJhd0ltcG9ydGVkQm91bmRUeXBlKCklPikKLSAgICA8JX0lPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlQCBlbmQgJT48JS8vQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0gZWxzZSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHsgLy9DbGFzcy9pc1NldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JX0lPgotPCV9JT4KLTwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQlib29sZWFuIGlzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0KLTwlfSBlbHNlIHslPgotCXB1YmxpYyBib29sZWFuIGlzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLQl7Ci0gICAgPCVpZiAoZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpKSB7JT4KLQkJcmV0dXJuIGVJc1NldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgPCV9JT4KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSU+LlVuc2V0dGFibGU8JT1zaW5nbGVXaWxkY2FyZCU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5pc1NldCgpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXJldHVybiBlVmlydHVhbElzU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCXJldHVybiAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSkgeyBHZW5GZWF0dXJlIGRlbGVnYXRlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0RGVsZWdhdGVGZWF0dXJlKCk7JT4KLSAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJcmV0dXJuICEoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpKS5pc0VtcHR5KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuICEoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuaXNFbXB0eSg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2lzU2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gd2hldGhlciB0aGUgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGlzIHNldAotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL2lzU2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbkZlYXR1cmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZ2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfS8vZm9yJT4KLTwlfX0ucnVuKCk7JT4KLTwlZm9yIChHZW5PcGVyYXRpb24gZ2VuT3BlcmF0aW9uIDogKGlzSW1wbGVtZW50YXRpb24gPyBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbk9wZXJhdGlvbnMoKSA6IGdlbkNsYXNzLmdldERlY2xhcmVkR2VuT3BlcmF0aW9ucygpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZW5PcGVyYXRpb24ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbk9wZXJhdGlvbi5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZW5PcGVyYXRpb24uamF2YWRvYy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gIDwlaWYgKGdlbk9wZXJhdGlvbi5oYXNEb2N1bWVudGF0aW9uKCkgfHwgZ2VuT3BlcmF0aW9uLmhhc1BhcmFtZXRlckRvY3VtZW50YXRpb24oKSkgeyU+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gICAgPCVpZiAoZ2VuT3BlcmF0aW9uLmhhc0RvY3VtZW50YXRpb24oKSkgeyU+Ci0JICogPCU9Z2VuT3BlcmF0aW9uLmdldERvY3VtZW50YXRpb24oZ2VuTW9kZWwuZ2V0SW5kZW50YXRpb24oc3RyaW5nQnVmZmVyKSklPgotICAgIDwlfSU+Ci0gICAgPCVmb3IgKEdlblBhcmFtZXRlciBnZW5QYXJhbWV0ZXIgOiBnZW5PcGVyYXRpb24uZ2V0R2VuUGFyYW1ldGVycygpKSB7JT4KLSAgICAgIDwlaWYgKGdlblBhcmFtZXRlci5oYXNEb2N1bWVudGF0aW9uKCkpIHsgU3RyaW5nIGRvY3VtZW50YXRpb24gPSBnZW5QYXJhbWV0ZXIuZ2V0RG9jdW1lbnRhdGlvbigiIik7JT4KLSAgICAgICAgPCVpZiAoZG9jdW1lbnRhdGlvbi5jb250YWlucygiXG4iKSB8fCBkb2N1bWVudGF0aW9uLmNvbnRhaW5zKCJcciIpKSB7JT4KLQkgKiBAcGFyYW0gPCU9Z2VuUGFyYW1ldGVyLmdldE5hbWUoKSU+Ci0JICogICA8JT1nZW5QYXJhbWV0ZXIuZ2V0RG9jdW1lbnRhdGlvbihnZW5Nb2RlbC5nZXRJbmRlbnRhdGlvbihzdHJpbmdCdWZmZXIpKSU+Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCSAqIEBwYXJhbSA8JT1nZW5QYXJhbWV0ZXIuZ2V0TmFtZSgpJT4gPCU9Z2VuUGFyYW1ldGVyLmdldERvY3VtZW50YXRpb24oZ2VuTW9kZWwuZ2V0SW5kZW50YXRpb24oc3RyaW5nQnVmZmVyKSklPgotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAgPCV9JT4KLSAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNb2RlbFRhZ3MoKSkgeyBib29sZWFuIGZpcnN0ID0gdHJ1ZTsgZm9yIChTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihnZW5PcGVyYXRpb24uZ2V0TW9kZWxJbmZvKCksICJcblxyIik7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgeyBTdHJpbmcgbW9kZWxJbmZvID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOyBpZiAoZmlyc3QpIHsgZmlyc3QgPSBmYWxzZTslPgotCSAqIEBtb2RlbCA8JT1tb2RlbEluZm8lPgotICA8JX0gZWxzZSB7JT4KLQkgKiAgICAgICAgPCU9bW9kZWxJbmZvJT4KLSAgPCV9fSBpZiAoZmlyc3QpIHslPgotCSAqIEBtb2RlbAotICA8JX19JT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JUAgZW5kICU+PCUvL0NsYXNzL2dlbk9wZXJhdGlvbi5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7IC8vQ2xhc3MvZ2VuT3BlcmF0aW9uLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jJT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbk9wZXJhdGlvbi5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLTwlfSU+Ci08JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JPCU9Z2VuT3BlcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKGdlbkNsYXNzKSU+PCU9Z2VuT3BlcmF0aW9uLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5PcGVyYXRpb24uZ2V0TmFtZSgpJT4oPCU9Z2VuT3BlcmF0aW9uLmdldFBhcmFtZXRlcnMoZ2VuQ2xhc3MpJT4pPCU9Z2VuT3BlcmF0aW9uLmdldFRocm93cyhnZW5DbGFzcyklPjsKLQotPCV9IGVsc2UgeyU+Ci0JcHVibGljIDwlPWdlbk9wZXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycyhnZW5DbGFzcyklPjwlPWdlbk9wZXJhdGlvbi5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuT3BlcmF0aW9uLmdldE5hbWUoKSU+KDwlPWdlbk9wZXJhdGlvbi5nZXRQYXJhbWV0ZXJzKGdlbkNsYXNzKSU+KTwlPWdlbk9wZXJhdGlvbi5nZXRUaHJvd3MoZ2VuQ2xhc3MpJT4KLQl7Ci0gIDwlaWYgKGdlbk9wZXJhdGlvbi5oYXNCb2R5KCkpIHslPgotCQk8JT1nZW5PcGVyYXRpb24uZ2V0Qm9keShnZW5Nb2RlbC5nZXRJbmRlbnRhdGlvbihzdHJpbmdCdWZmZXIpKSU+Ci0gIDwlfSBlbHNlIGlmIChnZW5PcGVyYXRpb24uaXNJbnZhcmlhbnQoKSkge0dlbkNsYXNzIG9wQ2xhc3MgPSBnZW5PcGVyYXRpb24uZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIGRpYWdub3N0aWNzID0gZ2VuT3BlcmF0aW9uLmdldEdlblBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpOyBTdHJpbmcgY29udGV4dCA9IGdlbk9wZXJhdGlvbi5nZXRHZW5QYXJhbWV0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKTslPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJLy8gLT4gc3BlY2lmeSB0aGUgY29uZGl0aW9uIHRoYXQgdmlvbGF0ZXMgdGhlIGludmFyaWFudAotCQkvLyAtPiB2ZXJpZnkgdGhlIGRldGFpbHMgb2YgdGhlIGRpYWdub3N0aWMsIGluY2x1ZGluZyBzZXZlcml0eSBhbmQgbWVzc2FnZQotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQlpZiAoZmFsc2UpCi0JCXsKLQkJCWlmICg8JT1kaWFnbm9zdGljcyU+ICE9IG51bGwpCi0JCQl7Ci0JCQkJPCU9ZGlhZ25vc3RpY3MlPi5hZGQKLQkJCQkJKG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0RpYWdub3N0aWMiKSU+Ci0JCQkJCQkoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYyIpJT4uRVJST1IsCi0JCQkJCQkgPCU9b3BDbGFzcy5nZXRHZW5QYWNrYWdlKCkuZ2V0SW1wb3J0ZWRWYWxpZGF0b3JDbGFzc05hbWUoKSU+LkRJQUdOT1NUSUNfU09VUkNFLAotCQkJCQkJIDwlPW9wQ2xhc3MuZ2V0R2VuUGFja2FnZSgpLmdldEltcG9ydGVkVmFsaWRhdG9yQ2xhc3NOYW1lKCklPi48JT1vcENsYXNzLmdldE9wZXJhdGlvbklEKGdlbk9wZXJhdGlvbiklPiwKLQkJCQkJCSA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW4iKSU+LklOU1RBTkNFLmdldFN0cmluZygiX1VJX0dlbmVyaWNJbnZhcmlhbnRfZGlhZ25vc3RpYyIsIG5ldyBPYmplY3RbXSB7ICI8JT1nZW5PcGVyYXRpb24uZ2V0TmFtZSgpJT4iLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RWYWxpZGF0b3IiKSU+LmdldE9iamVjdExhYmVsKHRoaXMsIDwlPWNvbnRleHQlPikgfSksPCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPjwlPWdlbk1vZGVsLmdldE5vbk5MUygyKSU+Ci0JCQkJCQkgbmV3IE9iamVjdCBbXSB7IHRoaXMgfSkpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2ltcGxlbWVudGVkR2VuT3BlcmF0aW9uLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9pbXBsZW1lbnRlZEdlbk9wZXJhdGlvbi50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbk9wZXJhdGlvbi5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9pbXBsZW1lbnRlZEdlbk9wZXJhdGlvbi5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfS8vZm9yJT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVJbnZlcnNlQWRkR2VuRmVhdHVyZXMoKSkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpKSB7JT4KLSAgICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RUludmVyc2VBZGRHZW5GZWF0dXJlcygpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbmNoZWNrZWRDYXN0KCkpIHslPgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgPCVicmVhazsgfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IGVJbnZlcnNlQWRkKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4gb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQl7Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RUludmVyc2VBZGRHZW5GZWF0dXJlcygpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7IFN0cmluZyBjYXN0ID0gIigiICArIGdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpICsgKCFnZW5Nb2RlbC51c2VHZW5lcmljcygpID8gIikiIDogIjwiICsgZ2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IikgKyAiPikoIiArIGdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpICsgIjw/PikiKTslPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZVN1cHByZXNzRU1GVHlwZXMoKSkgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Y2FzdCU+KDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+LkludGVybmFsTWFwVmlldzwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRNYXBUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5lTWFwKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gKDwlPWNhc3QlPjwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLSAgICA8JX0lPgotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpKSB7JT4KLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0Jhc2ljU2V0KCkpIHslPgotCQkJCXJldHVybiBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pb3RoZXJFbmQsIG1zZ3MpOwotICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG1zZ3MpOwotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIHslPgotICAgIDwlaWYgKGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlaWYgKGdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpKSB7JT5iYXNpY0dldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPjwlfSBlbHNlIHslPjwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+PCV9JT4oKTsKLSAgICA8JX0lPgotCQkJCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsKQotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVDb250YWlucygpKSB7JT4KLQkJCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG51bGwsIG1zZ3MpOwotICAgIDwlfSBlbHNlIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7IFN0cmluZyByZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiA9IHRhcmdldENsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSA/ICIgKyAiICsgZ2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKHJldmVyc2VGZWF0dXJlKSA6ICIiOyU+Ci0JCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjwlPXJldmVyc2VPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotICAgIDwlfSU+Ci0JCQkJcmV0dXJuIGJhc2ljU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPilvdGhlckVuZCwgbXNncyk7Ci0gIDwlfSU+Ci08JX0lPgotCQl9Ci08JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci08JX0lPgotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVJbnZlcnNlUmVtb3ZlR2VuRmVhdHVyZXMoKSkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gZUludmVyc2VSZW1vdmUoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCXsKLTwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFSW52ZXJzZVJlbW92ZUdlbkZlYXR1cmVzKCkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZVN1cHByZXNzRU1GVHlwZXMoKSkgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPjwlPXNpbmdsZVdpbGRjYXJkJT4pKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwIiklPi5JbnRlcm5hbE1hcFZpZXc8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkTWFwVGVtcGxhdGVBcmd1bWVudHMoZ2VuQ2xhc3MpJT4pPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZU1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPjwlPXNpbmdsZVdpbGRjYXJkJT4pKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZmVhdHVyZU1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPjwlPXNpbmdsZVdpbGRjYXJkJT4pPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkgJiYgIWdlbkZlYXR1cmUuaXNCYXNpY1NldCgpKSB7JT4KLQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG1zZ3MpOwotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0JCQkJcmV0dXJuIGJhc2ljVW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4obXNncyk7Ci0gIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihudWxsLCBtc2dzKTsKLSAgPCV9JT4KLTwlfSU+Ci0JCX0KLTwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci08JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLTwlfSU+Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkNsYXNzLmltcGxlbWVudHNBbnkoZ2VuQ2xhc3MuZ2V0RUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckdlbkZlYXR1cmVzKCkpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MpCi0JewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQ8JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPikKLQkJewotPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVCYXNpY1JlbW92ZUZyb21Db250YWluZXJHZW5GZWF0dXJlcygpKSB7JT4KLSAgPCVHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIHJldmVyc2VPZmZzZXRDb3JyZWN0aW9uID0gdGFyZ2V0Q2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQocmV2ZXJzZUZlYXR1cmUpIDogIiI7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjwlPXJldmVyc2VPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLTwlfSBlbHNlIHslPgotCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci08JX0lPgotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVHZXRHZW5GZWF0dXJlcygpKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQl7Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RUdldEdlbkZlYXR1cmVzKCkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0Jvb2xlYW5UeXBlKCkpIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gbmV3IDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPig8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKTsKLSAgICA8JX0lPgotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkgJiYgIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzRWZmZWN0aXZlU3VwcHJlc3NFTUZUeXBlcygpKSB7JT4KLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+LkludGVybmFsTWFwVmlldzwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRNYXBUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5lTWFwKCk7Ci0JCQkJZWxzZSByZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotCQkJCWVsc2UgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkubWFwKCk7Ci0gICAgPCV9JT4KLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZmVhdHVyZU1hcCgpOwotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5nZXRXcmFwcGVyKCk7Ci0gIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotICA8JX0lPgotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBlRHluYW1pY0dldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLTwlfSU+Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkNsYXNzLmltcGxlbWVudHNBbnkoZ2VuQ2xhc3MuZ2V0RVNldEdlbkZlYXR1cmVzKCkpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+Ci0gICAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVTZXRHZW5GZWF0dXJlcygpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbmNoZWNrZWRDYXN0KCkgJiYgIWdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpICYmICFnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7JT4KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgIDwlYnJlYWs7IH0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQ8JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPikKLQkJewotICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RVNldEdlbkZlYXR1cmVzKCkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5mZWF0dXJlTWFwKCkpLnNldChuZXdWYWx1ZSk7Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5zZXQobmV3VmFsdWUpOwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRWZmZWN0aXZlU3VwcHJlc3NFTUZUeXBlcygpKSB7JT4KLQkJCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSIpJT4uU2V0dGluZykoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+LkludGVybmFsTWFwVmlldzwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRNYXBUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5lTWFwKCkpLnNldChuZXdWYWx1ZSk7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlIiklPi5TZXR0aW5nKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLnNldChuZXdWYWx1ZSk7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLmNsZWFyKCk7Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5hZGRBbGwoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS51dGlsLkNvbGxlY3Rpb24iKSU+PCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyU+PD8gZXh0ZW5kcyA8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPj48JX0lPiluZXdWYWx1ZSk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJCQlzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKCg8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4pbmV3VmFsdWUpLjwlPWdlbkZlYXR1cmUuZ2V0UHJpbWl0aXZlVmFsdWVGdW5jdGlvbigpJT4oKSk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlaWYgKGdlbkZlYXR1cmUuZ2V0VHlwZUdlbkRhdGFUeXBlKCkgPT0gbnVsbCB8fCAhZ2VuRmVhdHVyZS5nZXRUeXBlR2VuRGF0YVR5cGUoKS5pc09iamVjdFR5cGUoKSB8fCAhZ2VuRmVhdHVyZS5nZXRSYXdUeXBlKCkuZXF1YWxzKGdlbkZlYXR1cmUuZ2V0VHlwZShnZW5DbGFzcykpKSB7JT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pPCV9JT5uZXdWYWx1ZSk7Ci0gICAgPCV9JT4KLQkJCQlyZXR1cm47Ci0gIDwlfSU+Ci0JCX0KLSAgPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0gIDwlfSBlbHNlIHslPgotCQllRHluYW1pY1NldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLSAgPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFVW5zZXRHZW5GZWF0dXJlcygpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9lVW5zZXQub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQl7Ci0gIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFVW5zZXRHZW5GZWF0dXJlcygpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5mZWF0dXJlTWFwKCkuY2xlYXIoKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuY2xlYXIoKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotCQkJCXVuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmhhc0VEZWZhdWx0KCkpIHslPgotCQkJCXNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pbnVsbCk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+KTsKLSAgICA8JX0lPgotCQkJCXJldHVybjsKLSAgPCV9JT4KLQkJfQotICA8JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0gIDwlfSBlbHNlIHslPgotCQllRHluYW1pY1Vuc2V0KGZlYXR1cmVJRCk7Ci0gIDwlfSU+Ci0JfQotCi08JUAgZW5kICU+PCUvL0NsYXNzL2VVbnNldC5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFSXNTZXRHZW5GZWF0dXJlcygpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9lSXNTZXQub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+Ci0gICAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVJc1NldEdlbkZlYXR1cmVzKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSAmJiAhZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSAmJiBnZW5GZWF0dXJlLmlzRmllbGQoKSAmJiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgPCVicmVhazsgfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotLy9VTUEtLT4KLQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlIiklPiBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQl7Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RUlzU2V0R2VuRmVhdHVyZXMoKSkgeyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLQkJCQlyZXR1cm4gISgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmZlYXR1cmVNYXAoKS5pc0VtcHR5KCk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiAhPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uZmVhdHVyZU1hcCgpLmlzRW1wdHkoKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiAhPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uaXNFbXB0eSgpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgITwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+LmlzRW1wdHkoKTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuICE8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLmlzRW1wdHkoKTsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotCQkJCXJldHVybiBpc1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkpIHslPgotICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsOwotICAgIDwlfSBlbHNlIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0ZpZWxkKCkgJiYgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQlyZXR1cm4gZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPikgIT0gbnVsbDsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiBiYXNpY0dldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpICE9IG51bGw7Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5oYXNFRGVmYXVsdCgpKSB7JT4KLSAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbDsKLSAgICA8JX0gZWxzZSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJcmV0dXJuIGVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pICE9IG51bGw7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSAhPSBudWxsOwotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSB8fCBnZW5GZWF0dXJlLmlzRW51bVR5cGUoKSkgeyU+Ci0gICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQkJCXJldHVybiAoKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMCkgIT0gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT47Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT47Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VudW1UeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0ZpZWxkKCkgJiYgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQlyZXR1cm4gZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4pICE9IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+OwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgIT0gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT47Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIHsvL2RhdGF0eXBlJT4KLSAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4gPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgOiAhPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4uZXF1YWxzKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KTsKLSAgICA8JX0gZWxzZSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4pOwotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPiA9PSBudWxsID8gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCA6ICE8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPi5lcXVhbHMoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+ID09IG51bGwgPyA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpICE9IG51bGwgOiAhPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4uZXF1YWxzKDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpOwotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0lPgotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLTwlfSBlbHNlIHslPgotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChmZWF0dXJlSUQpOwotPCV9JT4KLQl9Ci0KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZUlzU2V0Lm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgKCFnZW5DbGFzcy5nZXRNaXhpbkdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpIHx8IGdlbkNsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSAmJiAhZ2VuQ2xhc3MuZ2V0R2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpKSB7JT4KLSAgPCVpZiAoIWdlbkNsYXNzLmdldE1peGluR2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICAgIDwlfSU+Ci0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPCU9c2luZ2xlV2lsZGNhcmQlPiBiYXNlQ2xhc3MpCi0JewotICAgIDwlZm9yIChHZW5DbGFzcyBtaXhpbkdlbkNsYXNzIDogZ2VuQ2xhc3MuZ2V0TWl4aW5HZW5DbGFzc2VzKCkpIHslPgotCQlpZiAoYmFzZUNsYXNzID09IDwlPW1peGluR2VuQ2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCQl7Ci0gICAgICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogbWl4aW5HZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpKSB7JT4KLQkJCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OiByZXR1cm4gPCU9bWl4aW5HZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjsKLSAgICAgIDwlfSU+Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0gICAgPCV9JT4KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLSAgPCV9JT4KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8JT1zaW5nbGVXaWxkY2FyZCU+IGJhc2VDbGFzcykKLQl7Ci0gIDwlZm9yIChHZW5DbGFzcyBtaXhpbkdlbkNsYXNzIDogZ2VuQ2xhc3MuZ2V0TWl4aW5HZW5DbGFzc2VzKCkpIHslPgotCQlpZiAoYmFzZUNsYXNzID09IDwlPW1peGluR2VuQ2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotICAgIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBtaXhpbkdlbkNsYXNzLmdldEdlbkZlYXR1cmVzKCkpIHslPgotCQkJCWNhc2UgPCU9bWl4aW5HZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjogcmV0dXJuIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT47Ci0gICAgPCV9JT4KLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuQ2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpICYmICFnZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0JCWlmIChiYXNlQ2xhc3MgPT0gPCU9Z2VuQ2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCQl7Ci0gICAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEdlbkZlYXR1cmVzKCkpIHslPgotCQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46IHJldHVybiA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+OwotICAgIDwlfSU+Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0gIDwlfSU+Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyBTdHJpbmcgZVZpcnR1YWxWYWx1ZXNGaWVsZCA9IGdlbkNsYXNzLmdldEVWaXJ0dWFsVmFsdWVzRmllbGQoKTslPgotICA8JWlmIChlVmlydHVhbFZhbHVlc0ZpZWxkICE9IG51bGwpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZVZpcnR1YWxWYWx1ZXMoKQotCXsKLQkJcmV0dXJuIDwlPWVWaXJ0dWFsVmFsdWVzRmllbGQlPjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHJvdGVjdGVkIHZvaWQgZVNldFZpcnR1YWxWYWx1ZXMoT2JqZWN0W10gbmV3VmFsdWVzKQotCXsKLQkJPCU9ZVZpcnR1YWxWYWx1ZXNGaWVsZCU+ID0gbmV3VmFsdWVzOwotCX0KLQotICA8JX0lPgotICA8JXsgTGlzdDxTdHJpbmc+IGVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMgPSBnZW5DbGFzcy5nZXRFVmlydHVhbEluZGV4Qml0RmllbGRzKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTslPgotICAgIDwlaWYgKCFlVmlydHVhbEluZGV4Qml0RmllbGRzLmlzRW1wdHkoKSkgeyBMaXN0PFN0cmluZz4gYWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcyA9IGdlbkNsYXNzLmdldEFsbEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXByb3RlY3RlZCBpbnQgZVZpcnR1YWxJbmRleEJpdHMoaW50IG9mZnNldCkKLQl7Ci0JCXN3aXRjaCAob2Zmc2V0KQotCQl7Ci0gICAgICA8JWZvciAoaW50IGkgPSAwOyBpIDwgYWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcy5zaXplKCk7IGkrKykgeyU+Ci0JCQljYXNlIDwlPWklPiA6Ci0JCQkJcmV0dXJuIDwlPWFsbEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMuZ2V0KGkpJT47Ci0gICAgICA8JX0lPgotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwcm90ZWN0ZWQgdm9pZCBlU2V0VmlydHVhbEluZGV4Qml0cyhpbnQgb2Zmc2V0LCBpbnQgbmV3SW5kZXhCaXRzKQotCXsKLQkJc3dpdGNoIChvZmZzZXQpCi0JCXsKLSAgICAgIDwlZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFVmlydHVhbEluZGV4Qml0RmllbGRzLnNpemUoKTsgaSsrKSB7JT4KLQkJCWNhc2UgPCU9aSU+IDoKLQkJCQk8JT1hbGxFVmlydHVhbEluZGV4Qml0RmllbGRzLmdldChpKSU+ID0gbmV3SW5kZXhCaXRzOwotCQkJCWJyZWFrOwotICAgICAgPCV9JT4KLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLSAgICA8JX0lPgotICA8JX0lPgotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiAhZ2VuQ2xhc3MuZ2V0VG9TdHJpbmdHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICA8JXsgYm9vbGVhbiBmaXJzdCA9IHRydWU7JT4KLSAgICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0VG9TdHJpbmdHZW5GZWF0dXJlcygpKSB7JT4KLSAgICAgIDwlaWYgKGZpcnN0KSB7IGZpcnN0ID0gZmFsc2U7JT4KLQkJcmVzdWx0LmFwcGVuZCgiICg8JT1nZW5GZWF0dXJlLmdldE5hbWUoKSU+OiAiKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmVzdWx0LmFwcGVuZCgiLCA8JT1nZW5GZWF0dXJlLmdldE5hbWUoKSU+OiAiKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0gICAgICA8JX0lPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSAmJiAhZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlpZiAoZVZpcnR1YWxJc1NldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KSkgcmVzdWx0LmFwcGVuZChlVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJaWYgKDwlaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPig8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwPCV9IGVsc2UgeyU+PCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDwlfSU+KSByZXN1bHQuYXBwZW5kKCg8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcpICE9IDApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCWlmICg8JWlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4oPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDwlfSBlbHNlIHslPjwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ8JX0lPikgcmVzdWx0LmFwcGVuZCg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXJlc3VsdC5hcHBlbmQoZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPjwlaWYgKCFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1JlZmVyZW5jZVR5cGUoKSl7JT4sIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+PCV9JT4pKTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJcmVzdWx0LmFwcGVuZCgoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwKTsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmVzdWx0LmFwcGVuZCg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5pc01hcEVudHJ5KCkpIHsgR2VuRmVhdHVyZSBrZXlGZWF0dXJlID0gZ2VuQ2xhc3MuZ2V0TWFwRW50cnlLZXlGZWF0dXJlKCk7IEdlbkZlYXR1cmUgdmFsdWVGZWF0dXJlID0gZ2VuQ2xhc3MuZ2V0TWFwRW50cnlWYWx1ZUZlYXR1cmUoKTslPgotPCVTdHJpbmcgb2JqZWN0VHlwZSA9IGdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS5sYW5nLk9iamVjdCIpOyU+Ci08JVN0cmluZyBrZXlUeXBlID0gZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCA/IGtleUZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcykgOiBvYmplY3RUeXBlOyU+Ci08JVN0cmluZyB2YWx1ZVR5cGUgPSBnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwID8gdmFsdWVGZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpIDogb2JqZWN0VHlwZTslPgotPCVTdHJpbmcgZU1hcFR5cGUgPSBnZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwIikgKyAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCA/ICI8IiArIGtleVR5cGUgKyAiLCAiICsgdmFsdWVUeXBlICsgIj4iIDogIiIpOyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGludCBoYXNoID0gLTE7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEhhc2goKQotCXsKLQkJaWYgKGhhc2ggPT0gLTEpCi0JCXsKLQkJCTwlPW9iamVjdFR5cGUlPiB0aGVLZXkgPSBnZXRLZXkoKTsKLQkJCWhhc2ggPSAodGhlS2V5ID09IG51bGwgPyAwIDogdGhlS2V5Lmhhc2hDb2RlKCkpOwotCQl9Ci0JCXJldHVybiBoYXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhc2goaW50IGhhc2gpCi0JewotCQl0aGlzLmhhc2ggPSBoYXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyA8JT1rZXlUeXBlJT4gZ2V0S2V5KCkKLQl7Ci0gIDwlaWYgKGtleUZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlyZXR1cm4gbmV3IDwlPWtleUZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPihnZXRUeXBlZEtleSgpKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBnZXRUeXBlZEtleSgpOwotICA8JX0lPgotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEtleSg8JT1rZXlUeXBlJT4ga2V5KQotCXsKLSAgPCVpZiAoa2V5RmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotCQlnZXRUeXBlZEtleSgpLmFkZEFsbCg8JWlmICghZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+KDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS51dGlsLkNvbGxlY3Rpb24iKSU+KTwlfSU+a2V5KTsKLSAgPCV9IGVsc2UgaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHslPgotCQlzZXRUeXBlZEtleShrZXkpOwotICA8JX0gZWxzZSBpZiAoa2V5RmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXNldFR5cGVkS2V5KCgoPCU9a2V5RmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KWtleSkuPCU9a2V5RmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCXNldFR5cGVkS2V5KCg8JT1rZXlGZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPilrZXkpOwotICA8JX0lPgotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyA8JT12YWx1ZVR5cGUlPiBnZXRWYWx1ZSgpCi0JewotICA8JWlmICh2YWx1ZUZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlyZXR1cm4gbmV3IDwlPXZhbHVlRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KGdldFR5cGVkVmFsdWUoKSk7Ci0gIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gZ2V0VHlwZWRWYWx1ZSgpOwotICA8JX0lPgotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyA8JT12YWx1ZVR5cGUlPiBzZXRWYWx1ZSg8JT12YWx1ZVR5cGUlPiB2YWx1ZSkKLQl7Ci0JCTwlPXZhbHVlVHlwZSU+IG9sZFZhbHVlID0gZ2V0VmFsdWUoKTsKLSAgPCVpZiAodmFsdWVGZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0JCWdldFR5cGVkVmFsdWUoKS5jbGVhcigpOwotCQlnZXRUeXBlZFZhbHVlKCkuYWRkQWxsKDwlaWYgKCFnZW5Nb2RlbC51c2VHZW5lcmljcygpKSB7JT4oPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpJT4pPCV9JT52YWx1ZSk7Ci0gIDwlfSBlbHNlIGlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7JT4KLQkJc2V0VHlwZWRWYWx1ZSh2YWx1ZSk7Ci0gIDwlfSBlbHNlIGlmICh2YWx1ZUZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlzZXRUeXBlZFZhbHVlKCgoPCU9dmFsdWVGZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4pdmFsdWUpLjwlPXZhbHVlRmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCXNldFR5cGVkVmFsdWUoKDwlPXZhbHVlRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pdmFsdWUpOwotICA8JX0lPgotCQlyZXR1cm4gb2xkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkpIHslPgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICA8JX0lPgotCXB1YmxpYyA8JT1lTWFwVHlwZSU+IGdldEVNYXAoKQotCXsKLQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIpJT4gY29udGFpbmVyID0gZUNvbnRhaW5lcigpOwotCQlyZXR1cm4gY29udGFpbmVyID09IG51bGwgPyBudWxsIDogKDwlPWVNYXBUeXBlJT4pY29udGFpbmVyLmVHZXQoZUNvbnRhaW5tZW50RmVhdHVyZSgpKTsKLQl9Ci0KLTwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotfSAvLzwlPWlzSW50ZXJmYWNlID8gIiAiICsgZ2VuQ2xhc3MuZ2V0SW50ZXJmYWNlTmFtZSgpIDogZ2VuQ2xhc3MuZ2V0Q2xhc3NOYW1lKCklPgotPCUvLyBUT0RPIGZpeCB0aGUgc3BhY2UgYWJvdmUlPgotPCVnZW5Nb2RlbC5lbWl0U29ydGVkSW1wb3J0cygpOyU+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Ly5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjU5ZWZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NTViMGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdDtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1DbGFzc1BhdGg6IHVtYWVkaXQuamFyCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYTt2aXNpYmlsaXR5Oj1yZWV4cG9ydAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZCwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuZG9tYWluLAotIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbiRJbXBsZW1lbnRhdGlvbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjgyZTBhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zb3VyY2UudW1hZWRpdC5qYXIgPSBzcmMvCi1vdXRwdXQudW1hZWRpdC5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSB1bWFlZGl0LmphcixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUFydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0c19BcnRpZmFjdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUFydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0c19BcnRpZmFjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBcnRpZmFjdF9jb250YWluZWRBcnRpZmFjdHNfQXJ0aWZhY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVCcmVha2Rvd25FbGVtZW50X3BsYW5uaW5nRGF0YV9QbGFubmluZ0RhdGEuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVCcmVha2Rvd25FbGVtZW50X3BsYW5uaW5nRGF0YV9QbGFubmluZ0RhdGEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDI5ZTI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQnJlYWtkb3duRWxlbWVudF9wbGFubmluZ0RhdGFfUGxhbm5pbmdEYXRhLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudERlc2NyaXB0aW9uX3NlY3Rpb25zX1NlY3Rpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RGVzY3JpcHRpb25fc2VjdGlvbnNfU2VjdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMDZjMmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RGVzY3JpcHRpb25fc2VjdGlvbnNfU2VjdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19TdGVwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudERlc2NyaXB0aW9uX3NlY3Rpb25zX1N0ZXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzhjZDhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudERlc2NyaXB0aW9uX3NlY3Rpb25zX1N0ZXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9Db250ZW50RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fQ29udGVudERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA2YjBmZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9Db250ZW50RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ExMDU2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MDM2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9HdWlkYW5jZURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmY0NGY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fUHJhY3RpY2VEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9QcmFjdGljZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyMDljYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9QcmFjdGljZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX1JvbGVEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9Sb2xlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmU4ODk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX1JvbGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9UYXNrRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fVGFza0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzYjJiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9UYXNrRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0MGYzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRGlzY2lwbGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX0Rpc2NpcGxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWJkNDc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRGlzY2lwbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX0Rpc2NpcGxpbmVDYXRlZ29yeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX0Rpc2NpcGxpbmVDYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NTNjMWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19EaXNjaXBsaW5lQ2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19EaXNjaXBsaW5lR3JvdXBpbmcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19EaXNjaXBsaW5lR3JvdXBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTUzYzFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRGlzY2lwbGluZUdyb3VwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRG9tYWluLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRG9tYWluLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyODkyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX0RvbWFpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1JvbGVTZXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Sb2xlU2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5OWZlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1JvbGVTZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Sb2xlU2V0Q2F0ZWdvcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Sb2xlU2V0Q2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGEzZjY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfUm9sZVNldENhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfUm9sZVNldEdyb3VwaW5nLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfUm9sZVNldEdyb3VwaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhM2Y2Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1JvbGVTZXRHcm91cGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1Rvb2wuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Ub29sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxYjg1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1Rvb2wuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Vc2VyRGVmaW5lZENhdGVnb3J5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfVXNlckRlZmluZWRDYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOWU5ZjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Vc2VyRGVmaW5lZENhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfV29ya1Byb2R1Y3RUeXBlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfV29ya1Byb2R1Y3RUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlY2FjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1dvcmtQcm9kdWN0VHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19BY3Rpdml0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19BY3Rpdml0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQXJ0aWZhY3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQXJ0aWZhY3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDFkMjE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0FydGlmYWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0F0dGFjaG1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQXR0YWNobWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NTY4NWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQXR0YWNobWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19DYXBhYmlsaXR5UGF0dGVybi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19DYXBhYmlsaXR5UGF0dGVybi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZmZiYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ2hlY2tsaXN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0NoZWNrbGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNjVmMjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ2hlY2tsaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0NvbmNlcHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ29uY2VwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZjg0ZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ29uY2VwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19DdXN0b21DYXRlZ29yeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19DdXN0b21DYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNDc5ODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ3VzdG9tQ2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRGVsaXZlcmFibGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRGVsaXZlcmFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTEwNTYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0RlbGl2ZXJhYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19EZWxpdmVyeVByb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQwMzYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19EaXNjaXBsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0Rpc2NpcGxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWJkNDc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0Rpc2NpcGxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRGlzY2lwbGluZUdyb3VwaW5nLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0Rpc2NpcGxpbmVHcm91cGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NTNjMWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRGlzY2lwbGluZUdyb3VwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0RvbWFpbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Eb21haW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjI4OTI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0RvbWFpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNTU0YzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGluZ0NvbnNpZGVyYXRpb25zLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRpbmdDb25zaWRlcmF0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYjM0YzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGluZ0NvbnNpZGVyYXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRpbmdNZXRyaWMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGluZ01ldHJpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMWY4M2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGluZ01ldHJpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0aW5nTW9kZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGluZ01vZGVsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU4ZGFmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0aW5nTW9kZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzg0ZTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0V4YW1wbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXhhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOTQ0ZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXhhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19HdWlkZWxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfR3VpZGVsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmNDRmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19HdWlkZWxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfSXRlcmF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0l0ZXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMTFlNDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfSXRlcmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0tpbmQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfS2luZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZjcxNTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfS2luZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19PdXRjb21lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX091dGNvbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzAzNTE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX091dGNvbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUGhhc2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUGhhc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDYwYmQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1BoYXNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1ByYWN0aWNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1ByYWN0aWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyMDljYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19QcmFjdGljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjA5NWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzYzMjUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JlcG9ydC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19SZXBvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWYzZTBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JlcG9ydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19SZXVzYWJsZUFzc2V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JldXNhYmxlQXNzZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTJjZmZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JldXNhYmxlQXNzZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9hZG1hcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2FkbWFwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjExYmM1ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2FkbWFwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9sZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZTg4OTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9sZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2xlU2V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvbGVTZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDk5ZmVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvbGVTZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9sZVNldEdyb3VwaW5nLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvbGVTZXRHcm91cGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YTNmNjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9sZVNldEdyb3VwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1N0ZXAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfU3RlcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNDc2MjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfU3RlcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19TdXBwb3J0aW5nTWF0ZXJpYWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfU3VwcG9ydGluZ01hdGVyaWFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhMjFlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19TdXBwb3J0aW5nTWF0ZXJpYWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGFzay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UYXNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzYjJiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UYXNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1RlY2huaXF1ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UZWNobmlxdWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWRjNWI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1RlY2huaXF1ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UZW1wbGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NjMyNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGVybURlZmluaXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGVybURlZmluaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjFiZmUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rlcm1EZWZpbml0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rvb2wuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVG9vbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMWI4NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVG9vbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Ub29sTWVudG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rvb2xNZW50b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjFiODVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rvb2xNZW50b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVHJhaW5pbmdDbGFzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UcmFpbmluZ0NsYXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzMjk1My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UcmFpbmluZ0NsYXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1RyYWluaW5nTW9kdWxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1RyYWluaW5nTW9kdWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRmNzE1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UcmFpbmluZ01vZHVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Vc2VyRGVmaW5lZENhdGVnb3J5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1VzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQ3OTgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1VzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfV2hpdGVwYXBlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19XaGl0ZXBhcGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTViNDgwMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19XaGl0ZXBhcGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1dvcmtQcm9kdWN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1dvcmtQcm9kdWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhmNTIzMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Xb3JrUHJvZHVjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Xb3JrUHJvZHVjdEd1aWRlbGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Xb3JrUHJvZHVjdEd1aWRlbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZjQ0ZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfV29ya1Byb2R1Y3RHdWlkZWxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfV29ya1Byb2R1Y3RUeXBlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1dvcmtQcm9kdWN0VHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZWNhYzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfV29ya1Byb2R1Y3RUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19DdXN0b21DYXRlZ29yeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUN1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfQ3VzdG9tQ2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQ3OTgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19DdXN0b21DYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0FjdGl2aXR5RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDFkMjE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9BcnRpZmFjdERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMThlYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQ29udGVudERlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9Db250ZW50RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDZiMGZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9Db250ZW50RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTEwNTYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQwMzYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fRGVzY3JpcHRvckRlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9EZXNjcmlwdG9yRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWVkMmM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9EZXNjcmlwdG9yRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmY0NGY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9HdWlkYW5jZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9QcmFjdGljZURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9QcmFjdGljZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyMDljYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fUHJhY3RpY2VEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fUHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9Qcm9jZXNzRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9Qcm9jZXNzRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1JvbGVEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fUm9sZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlODg5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fUm9sZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9UYXNrRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1Rhc2tEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjM2IyYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1Rhc2tEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDBmM2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtRWxlbWVudF9wcm9wZXJ0eV9Qcm9wZXJ0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1FbGVtZW50X3Byb3BlcnR5X1Byb3BlcnR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMyYTdiNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1FbGVtZW50X3Byb3BlcnR5X1Byb3BlcnR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbUxpbmtfdmlld3BvcnRfUG9pbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtTGlua192aWV3cG9ydF9Qb2ludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNzM0YzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtTGlua192aWV3cG9ydF9Qb2ludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fbmFtZXNwYWNlX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV9uYW1lc3BhY2VfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDVlOWY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV9uYW1lc3BhY2VfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtX25hbWVzcGFjZV9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fbmFtZXNwYWNlX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgyZjIyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fbmFtZXNwYWNlX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV9uYW1lc3BhY2VfVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fbmFtZXNwYWNlX1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODlmM2FmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV9uYW1lc3BhY2VfVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fdmlld3BvaW50X1BvaW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV92aWV3cG9pbnRfUG9pbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGQ1OGUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV92aWV3cG9pbnRfUG9pbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaXNjaXBsaW5lX3N1YmRpc2NpcGxpbmVfRGlzY2lwbGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpc2NpcGxpbmVfc3ViZGlzY2lwbGluZV9EaXNjaXBsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI5YjMxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpc2NpcGxpbmVfc3ViZGlzY2lwbGluZV9EaXNjaXBsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRG9tYWluX3N1YmRvbWFpbl9Eb21haW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEb21haW5fc3ViZG9tYWluX0RvbWFpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjg5MjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEb21haW5fc3ViZG9tYWluX0RvbWFpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURvbWFpbl9zdWJkb21haW5zX0RvbWFpbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURvbWFpbl9zdWJkb21haW5zX0RvbWFpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjg5MjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEb21haW5fc3ViZG9tYWluc19Eb21haW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFbGxpcHNlX2NlbnRlcl9Qb2ludC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVsbGlwc2VfY2VudGVyX1BvaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0ZTlhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVsbGlwc2VfY2VudGVyX1BvaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfZXN0aW1hdGlvbkNvbmRlcmF0aW9uc19Fc3RpbWF0aW5nQ29uc2lkZXJhdGlvbnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV9lc3RpbWF0aW9uQ29uZGVyYXRpb25zX0VzdGltYXRpbmdDb25zaWRlcmF0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NTE2ODkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV9lc3RpbWF0aW9uQ29uZGVyYXRpb25zX0VzdGltYXRpbmdDb25zaWRlcmF0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX2VzdGltYXRpb25Db25kZXJhdGlvbnNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfZXN0aW1hdGlvbkNvbmRlcmF0aW9uc19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmM4NGU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfZXN0aW1hdGlvbkNvbmRlcmF0aW9uc19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV9lc3RpbWF0aW9uTWV0cmljX0VzdGltYXRpbmdNZXRyaWMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV9lc3RpbWF0aW9uTWV0cmljX0VzdGltYXRpbmdNZXRyaWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWQzMGJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfZXN0aW1hdGlvbk1ldHJpY19Fc3RpbWF0aW5nTWV0cmljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfdXNlZEVzdGltYXRpbmdQYXJhbWV0ZXJfU3VtbWl0RXN0aW1hdGluZ1BhcmFtZXRlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX3VzZWRFc3RpbWF0aW5nUGFyYW1ldGVyX1N1bW1pdEVzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTFkMGIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfdXNlZEVzdGltYXRpbmdQYXJhbWV0ZXJfU3VtbWl0RXN0aW1hdGluZ1BhcmFtZXRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlZE1ldGhvZEVsZW1lbnRfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZWRNZXRob2RFbGVtZW50X2VzdGltYXRlX0VzdGltYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg0NGJmOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlZE1ldGhvZEVsZW1lbnRfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0aW5nTW9kZWxfb3duZWRFc3RpbWF0aW5nUGFyYW1ldGVyX1N1bW1pdEVzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0aW5nTW9kZWxfb3duZWRFc3RpbWF0aW5nUGFyYW1ldGVyX1N1bW1pdEVzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTNiOTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGluZ01vZGVsX293bmVkRXN0aW1hdGluZ1BhcmFtZXRlcl9TdW1taXRFc3RpbWF0aW5nUGFyYW1ldGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGluZ1BhcmFtZXRlck93bmVyX293bmVkRXN0aW1hdGluZ1BhcmFtZXRlcl9Fc3RpbWF0aW5nUGFyYW1ldGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGluZ1BhcmFtZXRlck93bmVyX293bmVkRXN0aW1hdGluZ1BhcmFtZXRlcl9Fc3RpbWF0aW5nUGFyYW1ldGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3MjIwYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRpbmdQYXJhbWV0ZXJPd25lcl9vd25lZEVzdGltYXRpbmdQYXJhbWV0ZXJfRXN0aW1hdGluZ1BhcmFtZXRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoQ29ubmVjdG9yX3Bvc2l0aW9uX1BvaW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhDb25uZWN0b3JfcG9zaXRpb25fUG9pbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzczNjJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhDb25uZWN0b3JfcG9zaXRpb25fUG9pbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVkZ2Vfd2F5cG9pbnRzX1BvaW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFZGdlX3dheXBvaW50c19Qb2ludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNTRlNTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVkZ2Vfd2F5cG9pbnRzX1BvaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2FuY2hvcmFnZV9HcmFwaENvbm5lY3Rvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9hbmNob3JhZ2VfR3JhcGhDb25uZWN0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzAzNzYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2FuY2hvcmFnZV9HcmFwaENvbm5lY3Rvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZlNDBjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0RpYWdyYW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0RpYWdyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWNkODc4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9EaWFncmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9EaWFncmFtTGluay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfRGlhZ3JhbUxpbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjdlZTUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9EaWFncmFtTGluay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfRWxsaXBzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfRWxsaXBzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNmU2MjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0VsbGlwc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0dyYXBoQ29ubmVjdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9HcmFwaENvbm5lY3Rvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMDM3NjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0dyYXBoQ29ubmVjdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9HcmFwaEVkZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0dyYXBoRWRnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OTE4ODIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0dyYXBoRWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfR3JhcGhOb2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9HcmFwaE5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDY1MjAzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9HcmFwaE5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0ltYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9JbWFnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0Zjk5ZTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0ltYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9Qb2x5bGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfUG9seWxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGYxNWM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9Qb2x5bGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfUHJvcGVydHkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1Byb3BlcnR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMyYTdiNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfUHJvcGVydHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1JlZmVyZW5jZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfUmVmZXJlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMwMzc2MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfUmVmZXJlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDIwNjA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfVGV4dEVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1RleHRFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA2NTIwMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfVGV4dEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2YyN2IyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2xpbmtfRGlhZ3JhbUxpbmsuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfbGlua19EaWFncmFtTGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmN2VlNTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfbGlua19EaWFncmFtTGluay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9wb3NpdGlvbl9Qb2ludC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9wb3NpdGlvbl9Qb2ludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZDQwN2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfcG9zaXRpb25fUG9pbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfc2VtYW50aWNNb2RlbF9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZlNDBjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfc2VtYW50aWNNb2RlbF9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MjA2MDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfc2VtYW50aWNNb2RlbF9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfc2VtYW50aWNNb2RlbF9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNmMjdiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaE5vZGVfc2l6ZV9EaW1lbnNpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaE5vZGVfc2l6ZV9EaW1lbnNpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2Q5Mjg5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhOb2RlX3NpemVfRGltZW5zaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlS2luZF9hcHBsaWNhYmxlTWV0YUNsYXNzSW5mb19BcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUtpbmRfYXBwbGljYWJsZU1ldGFDbGFzc0luZm9fQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWIxZmJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlS2luZF9hcHBsaWNhYmxlTWV0YUNsYXNzSW5mb19BcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZEVsZW1lbnRfbWV0aG9kRWxlbWVudFByb3BlcnR5X01ldGhvZEVsZW1lbnRQcm9wZXJ0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZEVsZW1lbnRfbWV0aG9kRWxlbWVudFByb3BlcnR5X01ldGhvZEVsZW1lbnRQcm9wZXJ0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMmMzZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RFbGVtZW50X21ldGhvZEVsZW1lbnRQcm9wZXJ0eV9NZXRob2RFbGVtZW50UHJvcGVydHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RFbGVtZW50X293bmVkUnVsZXNfQ29uc3RyYWludC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZEVsZW1lbnRfb3duZWRSdWxlc19Db25zdHJhaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNkMzJmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZEVsZW1lbnRfb3duZWRSdWxlc19Db25zdHJhaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9tZXRob2RNb2RlbHNfTWV0aG9kTW9kZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X21ldGhvZE1vZGVsc19NZXRob2RNb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiODJjMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X21ldGhvZE1vZGVsc19NZXRob2RNb2RlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZExpYnJhcnlfbWV0aG9kUGx1Z2luc19NZXRob2RQbHVnaW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X21ldGhvZFBsdWdpbnNfTWV0aG9kUGx1Z2luLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4MmMzOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZExpYnJhcnlfbWV0aG9kUGx1Z2luc19NZXRob2RQbHVnaW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19NZXRob2RDb25maWd1cmF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnNfTWV0aG9kQ29uZmlndXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODk2MDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19NZXRob2RDb25maWd1cmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnNfUHJvY2Vzc0ZhbWlseS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZExpYnJhcnlfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zX1Byb2Nlc3NGYW1pbHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDY3ZDQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnNfUHJvY2Vzc0ZhbWlseS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZE1vZGVsX21ldGhvZFBhY2thZ2VzX0NvbnRlbnRQYWNrYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTW9kZWxfbWV0aG9kUGFja2FnZXNfQ29udGVudFBhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTW9kZWxfbWV0aG9kUGFja2FnZXNfQ29udGVudFBhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RNb2RlbF9tZXRob2RQYWNrYWdlc19Qcm9jZXNzQ29tcG9uZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTW9kZWxfbWV0aG9kUGFja2FnZXNfUHJvY2Vzc0NvbXBvbmVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RNb2RlbF9tZXRob2RQYWNrYWdlc19Qcm9jZXNzQ29tcG9uZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTW9kZWxfbWV0aG9kUGFja2FnZXNfUHJvY2Vzc1BhY2thZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RNb2RlbF9tZXRob2RQYWNrYWdlc19Qcm9jZXNzUGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZDhjMmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RNb2RlbF9tZXRob2RQYWNrYWdlc19Qcm9jZXNzUGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19Db250ZW50UGFja2FnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19Db250ZW50UGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfQ29udGVudFBhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfUHJvY2Vzc0NvbXBvbmVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19Qcm9jZXNzQ29tcG9uZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19Qcm9jZXNzQ29tcG9uZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX1Byb2Nlc3NQYWNrYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX1Byb2Nlc3NQYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkOGMyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19Qcm9jZXNzUGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19Db250ZW50UGFja2FnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19Db250ZW50UGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfQ29udGVudFBhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfUHJvY2Vzc0NvbXBvbmVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19Qcm9jZXNzQ29tcG9uZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19Qcm9jZXNzQ29tcG9uZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX1Byb2Nlc3NQYWNrYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX1Byb2Nlc3NQYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkOGMyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19Qcm9jZXNzUGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvbHlsaW5lX3dheXBvaW50c19Qb2ludC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvbHlsaW5lX3dheXBvaW50c19Qb2ludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNzAzZGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb2x5bGluZV93YXlwb2ludHNfUG9pbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmFjdGljZV9zdWJQcmFjdGljZV9QcmFjdGljZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByYWN0aWNlX3N1YlByYWN0aWNlX1ByYWN0aWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyMDljYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByYWN0aWNlX3N1YlByYWN0aWNlX1ByYWN0aWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJhY3RpY2Vfc3ViUHJhY3RpY2VzX1ByYWN0aWNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJhY3RpY2Vfc3ViUHJhY3RpY2VzX1ByYWN0aWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyMDljYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByYWN0aWNlX3N1YlByYWN0aWNlc19QcmFjdGljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlSU9fV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VJT19Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjE4MjI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VJT19Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZVNwZWNpZmljYXRpb25zX1Rhc2tEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uc19UYXNrRGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NGUyNmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZVNwZWNpZmljYXRpb25zX1Rhc2tEZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVmZmJiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19DYXBhYmlsaXR5UGF0dGVybi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19EZWxpdmVyeVByb2Nlc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfRGVsaXZlcnlQcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MDM2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19EZWxpdmVyeVByb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwOTVkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTljMWEwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0FjdGl2aXR5RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0FjdGl2aXR5RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9BcnRpZmFjdERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxZDIxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9BcnRpZmFjdERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0NvbnRlbnREZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9Db250ZW50RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmYyMzQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0NvbnRlbnREZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTEwNTYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQwMzYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZjQ0ZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9QcmFjdGljZURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1ByYWN0aWNlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzIwOWNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1ByYWN0aWNlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fUm9sZURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1JvbGVEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZTg4OTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fUm9sZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1Rhc2tEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9UYXNrRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzNiMmI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1Rhc2tEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTQwZjNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9PQlNfT0JTLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfT0JTX09CUy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZThhNjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9PQlNfT0JTLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfUEJTX1BCUy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX1BCU19QQlMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTNhYjRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfUEJTX1BCUy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX1dCU19XQlMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9XQlNfV0JTLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEyY2M1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX1dCU19XQlMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9Xb3JrT3JkZXJfV29ya09yZGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfV29ya09yZGVyX1dvcmtPcmRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZmFjMzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9Xb3JrT3JkZXJfV29ya09yZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfQWN0aXZpdHkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19BY3Rpdml0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19BY3Rpdml0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWZmYmIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19EZWxpdmVyeVByb2Nlc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19EZWxpdmVyeVByb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQwMzYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfRGVsaXZlcnlQcm9jZXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfSXRlcmF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfSXRlcmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxMWU0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX0l0ZXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX01pbGVzdG9uZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX01pbGVzdG9uZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NjE1ZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19NaWxlc3RvbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19NaWxlc3RvbmVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfTWlsZXN0b25lcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NjE1ZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19NaWxlc3RvbmVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUGhhc2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19QaGFzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjBiZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19QaGFzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjA5NWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjliNzhmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19SZXNvdXJjZURlZmluaXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19SZXNvdXJjZURlZmluaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2E4NmQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUmVzb3VyY2VEZWZpbml0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUm9sZURlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Sb2xlRGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2OGM3YjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Sb2xlRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Rhc2tEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfVGFza0Rlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTRlMjZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfVGFza0Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19UZWFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfVGVhbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOTlmZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19UZWFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfVGVhbVByb2ZpbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19UZWFtUHJvZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOTlmZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19UZWFtUHJvZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMTgyMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9kaWFncmFtc19EaWFncmFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfZGlhZ3JhbXNfRGlhZ3JhbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZDg1NTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9kaWFncmFtc19EaWFncmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0FjdGl2aXR5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19BY3Rpdml0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19DYXBhYmlsaXR5UGF0dGVybi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19DYXBhYmlsaXR5UGF0dGVybi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZmZiYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfQ29tcG9zaXRlUm9sZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Db21wb3NpdGVSb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YwMjkxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Db21wb3NpdGVSb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19EZWxpdmVyeVByb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQwMzYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19JdGVyYXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfSXRlcmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxMWU0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19JdGVyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfTWlsZXN0b25lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX01pbGVzdG9uZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NjE1ZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfTWlsZXN0b25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1BoYXNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1BoYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ2MGJkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19QaGFzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19QbGFubmluZ0RhdGEuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUGxhbm5pbmdEYXRhLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjZTI2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19QbGFubmluZ0RhdGEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjA5NWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWMxYTA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1JvbGVEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1JvbGVEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4YzdiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Sb2xlRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19UYXNrRGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19UYXNrRGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NGUyNmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfVGFza0Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfVGVhbVByb2ZpbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfVGVhbVByb2ZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDk5ZmVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1RlYW1Qcm9maWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1dvcmtPcmRlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Xb3JrT3JkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjQxZjNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1dvcmtPcmRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxODIyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19DYXBhYmlsaXR5UGF0dGVybi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZmZiYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19EZWxpdmVyeVByb2Nlc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNDAzNjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMDk1ZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX1Byb2Nlc3NQbGFuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19Qcm9jZXNzUGxhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZGE1NWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX1Byb2Nlc3NQbGFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjliNzhmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9UcmFuc2l0aW9uX1RyYW5zaXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZWdpb25fVHJhbnNpdGlvbl9UcmFuc2l0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQzMWM1OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9UcmFuc2l0aW9uX1RyYW5zaXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZWdpb25fVmVydGV4X1BzZXVkb1N0YXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1ZlcnRleF9Qc2V1ZG9TdGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNjhlNmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZWdpb25fVmVydGV4X1BzZXVkb1N0YXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1ZlcnRleF9TdGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9WZXJ0ZXhfU3RhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2Y1MDYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1ZlcnRleF9TdGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9WZXJ0ZXhfVmVydGV4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1ZlcnRleF9WZXJ0ZXguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2EzNzZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1ZlcnRleF9WZXJ0ZXguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZWN0aW9uX3N1YlNlY3Rpb25zX1NlY3Rpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZWN0aW9uX3N1YlNlY3Rpb25zX1NlY3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODNjZTkzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VjdGlvbl9zdWJTZWN0aW9uc19TZWN0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VjdGlvbl9zdWJTZWN0aW9uc19TdGVwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VjdGlvbl9zdWJTZWN0aW9uc19TdGVwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3ZWZjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlY3Rpb25fc3ViU2VjdGlvbnNfU3RlcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVN0YXRlTWFjaGluZV9SZWdpb25fUmVnaW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU3RhdGVNYWNoaW5lX1JlZ2lvbl9SZWdpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmFiN2VmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU3RhdGVNYWNoaW5lX1JlZ2lvbl9SZWdpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTdGF0ZV9SZWdpb25fUmVnaW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU3RhdGVfUmVnaW9uX1JlZ2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NzZkYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTdGF0ZV9SZWdpb25fUmVnaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVGFza19lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVRhc2tfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODQ0YmY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVGFza19lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVRhc2tfc3RlcHNfU3RlcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVRhc2tfc3RlcHNfU3RlcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYTQ5ZDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUYXNrX3N0ZXBzX1N0ZXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUZWFtUHJvZmlsZV9zdWJUZWFtX1RlYW1Qcm9maWxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVGVhbVByb2ZpbGVfc3ViVGVhbV9UZWFtUHJvZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOTlmZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUZWFtUHJvZmlsZV9zdWJUZWFtX1RlYW1Qcm9maWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVHJhaW5pbmdDbGFzc190cmFpbmluZ01vZHVsZXNfVHJhaW5pbmdNb2R1bGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUcmFpbmluZ0NsYXNzX3RyYWluaW5nTW9kdWxlc19UcmFpbmluZ01vZHVsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZjVlZmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUcmFpbmluZ0NsYXNzX3RyYWluaW5nTW9kdWxlc19UcmFpbmluZ01vZHVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdvcmtEZWZpbml0aW9uX3Bvc3Rjb25kaXRpb25fQ29uc3RyYWludC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdvcmtEZWZpbml0aW9uX3Bvc3Rjb25kaXRpb25fQ29uc3RyYWludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOTQ0ZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrRGVmaW5pdGlvbl9wb3N0Y29uZGl0aW9uX0NvbnN0cmFpbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrRGVmaW5pdGlvbl9wcmVjb25kaXRpb25fQ29uc3RyYWludC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdvcmtEZWZpbml0aW9uX3ByZWNvbmRpdGlvbl9Db25zdHJhaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5NDRkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdvcmtEZWZpbml0aW9uX3ByZWNvbmRpdGlvbl9Db25zdHJhaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya1Byb2R1Y3RfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrUHJvZHVjdF9lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NmViMWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrUHJvZHVjdF9lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FnZ3JlZ2F0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BZ2dyZWdhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2RjNWE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FnZ3JlZ2F0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMGFlZGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXJ0aWZhY3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXJ0aWZhY3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDFkMjE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FydGlmYWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BdHRhY2htZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0F0dGFjaG1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGE4YWY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0F0dGFjaG1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQnJlYWtkb3duRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9CcmVha2Rvd25FbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFkYWFiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9CcmVha2Rvd25FbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWVmODRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZmZiYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2hlY2tsaXN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NoZWNrbGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZjZkOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2hlY2tsaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NsYXNzaWZpZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2xhc3NpZmllci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExN2RjN2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2xhc3NpZmllci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db21wb3NpdGVSb2xlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbXBvc2l0ZVJvbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmU4ODk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbXBvc2l0ZVJvbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uY2VwdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25jZXB0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRmODRkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25jZXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnN0cmFpbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uc3RyYWludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNzQxNGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uc3RyYWludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50Q2F0ZWdvcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudENhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU3MzFmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50Q2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudERlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnREZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMjI0NjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnRFbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnRFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkxNTU5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50RWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50UGFja2FnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50UGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudFBhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29yZUVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29yZUVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzM3MGM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvcmVFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3ZGM3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNDc5ODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ3VzdG9tQ2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcmFibGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcmFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTEwNTYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJhYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMTA1NjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MDM2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQwMzYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rlc2NyaWJhYmxlRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZXNjcmliYWJsZUVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGFmOGFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rlc2NyaWJhYmxlRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzZlM2IyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVzY3JpcHRvckRlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNjkyNTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVzY3JpcHRvckRlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RpYWdyYW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YThhZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaWFncmFtRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaWFncmFtRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NzMxZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbUVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbUxpbmsuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbUxpbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjczYTUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RpYWdyYW1MaW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RpbWVuc2lvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaW1lbnNpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGQzYjc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RpbWVuc2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaXNjaXBsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rpc2NpcGxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWJkNDc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rpc2NpcGxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlzY2lwbGluZUdyb3VwaW5nLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rpc2NpcGxpbmVHcm91cGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NTNjMWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlzY2lwbGluZUdyb3VwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RvbWFpbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Eb21haW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjI4OTI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RvbWFpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODA0MWQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRWxsaXBzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FbGxpcHNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA2ODgxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FbGxpcHNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgyZDIxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0ZWRNZXRob2RFbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRlZE1ldGhvZEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGFmOGFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRlZE1ldGhvZEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ0NvbnNpZGVyYXRpb25zLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdDb25zaWRlcmF0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzg0ZTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ0NvbnNpZGVyYXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdNZXRyaWMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ01ldHJpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NDA5NzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ01ldHJpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nTW9kZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ01vZGVsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FmMjgwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nTW9kZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ1BhcmFtZXRlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nUGFyYW1ldGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjOTUzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nUGFyYW1ldGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdQYXJhbWV0ZXJPd25lci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nUGFyYW1ldGVyT3duZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTE1NTkxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdQYXJhbWV0ZXJPd25lci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjODRlNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXhhbXBsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FeGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI5NDRmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FeGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Z1bGZpbGxhYmxlRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9GdWxmaWxsYWJsZUVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWVmODRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Z1bGZpbGxhYmxlRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaENvbm5lY3Rvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaENvbm5lY3Rvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOWViYmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhDb25uZWN0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhFZGdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoRWRnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOWJjNzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhFZGdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzhmYjhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaE5vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhOb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0NTUxYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaE5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhpY1ByaW1pdGl2ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaGljUHJpbWl0aXZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkMjIyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaGljUHJpbWl0aXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRhbmNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRhbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmNDRmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HdWlkYW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HdWlkYW5jZURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmY0NGY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGVsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRlbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZjQ0ZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGVsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0ltYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0ltYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1NmMxNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9JbWFnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9JdGVyYXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvSXRlcmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxMWU0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9JdGVyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvS2luZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9LaW5kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1NmMxNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9LaW5kLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0xlYWZFbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0xlYWZFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA2ODgxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9MZWFmRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTg5NjAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRmYjMwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZEVsZW1lbnRQcm9wZXJ0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RFbGVtZW50UHJvcGVydHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDE0ZmU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZEVsZW1lbnRQcm9wZXJ0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGFja2FnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhMzExZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQbHVnaW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjgyYzM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQbHVnaW5fZ3JleS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQbHVnaW5fZ3JleS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNjNhZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGx1Z2luX2dyZXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kVW5pdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RVbml0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE5YmM3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RVbml0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NaWxlc3RvbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTYxNWViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NaWxlc3RvbmVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTYxNWViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTmFtZWRFbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L05hbWVkRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YWY4YWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTmFtZWRFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L05hbWVzcGFjZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9OYW1lc3BhY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTgzNjRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L05hbWVzcGFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9PQlMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvT0JTLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiODJlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9PQlMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvT3V0Y29tZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9PdXRjb21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwMzUxOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9PdXRjb21lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BCUy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QQlMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTgzNjRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BCUy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QYWNrYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDBhZWRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGFja2FnZWFibGVFbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BhY2thZ2VhYmxlRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNjg4MWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGFja2FnZWFibGVFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BoYXNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BoYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ2MGJkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QaGFzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QbGFubmluZ0RhdGEuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGxhbm5pbmdEYXRhLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjOTUzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QbGFubmluZ0RhdGEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUG9pbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUG9pbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzUwMGRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BvaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BvbHlsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BvbHlsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MyYWFhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qb2x5bGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QcmFjdGljZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QcmFjdGljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MjA5Y2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJhY3RpY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJhY3RpY2VEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QcmFjdGljZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyMDljYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QcmFjdGljZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29tcG9uZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29udGV4dC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29udGV4dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbnRleHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwOTVkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0VsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlseS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzRmFtaWx5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2OTI1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzRmFtaWx5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NQYWNrYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NQYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkOGMyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzUGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzUGxhbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzUGxhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZjhhZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc1BsYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzZlM2IyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb3BlcnR5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb3BlcnR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM2ZTNiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9wZXJ0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qc2V1ZG9TdGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qc2V1ZG9TdGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZmIzMGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHNldWRvU3RhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVmZXJlbmNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlZmVyZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOWViYmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVmZXJlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlZ2lvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZWdpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzY1OTYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlZ2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXBvcnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVwb3J0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyYzg1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXBvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVzb3VyY2VEZWZpbml0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Jlc291cmNlRGVmaW5pdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YjM1MWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVzb3VyY2VEZWZpbml0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JldXNhYmxlQXNzZXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmV1c2FibGVBc3NldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MmNmZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmV1c2FibGVBc3NldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2FkbWFwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvYWRtYXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTFiYzVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvYWRtYXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlODg5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmU4ODk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlRGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlRGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2OGM3YjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZURlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZVNldC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlU2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5OWZlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlU2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVTZXRDYXRlZ29yeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlU2V0Q2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGEzZjY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVTZXRDYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlU2V0R3JvdXBpbmcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZVNldEdyb3VwaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhM2Y2Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlU2V0R3JvdXBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2VjdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TZWN0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM5ZWJiZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TZWN0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1NlbWFudGljTW9kZWxCcmlkZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzODU0ZTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMTc1NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3RhdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3RhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjE3NTVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0YXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0YXRlTWFjaGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdGF0ZU1hY2hpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWRhYWIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0YXRlTWFjaGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdGVwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0ZXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWVmODRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0ZXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3VtbWl0RXN0aW1hdGluZ1BhcmFtZXRlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdW1taXRFc3RpbWF0aW5nUGFyYW1ldGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU3MzFmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdW1taXRFc3RpbWF0aW5nUGFyYW1ldGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N1cHBvcnRpbmdNYXRlcmlhbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdXBwb3J0aW5nTWF0ZXJpYWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWEyMWVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N1cHBvcnRpbmdNYXRlcmlhbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzNiMmI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjM2IyYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU0ZTI2ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDk5ZmVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVhbVByb2ZpbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVhbVByb2ZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDk5ZmVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlYW1Qcm9maWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlY2huaXF1ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWNobmlxdWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjg2NmQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlY2huaXF1ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZW1wbGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NjMyNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVtcGxhdGVEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZW1wbGF0ZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc2MzI1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZW1wbGF0ZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rlcm1EZWZpbml0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rlcm1EZWZpbml0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIxYmZlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZXJtRGVmaW5pdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZXh0RWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZXh0RWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNDU1MWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGV4dEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Ub29sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxYjg1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Ub29sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rvb2xNZW50b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbE1lbnRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMWI4NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbE1lbnRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UcmFpbmluZ0NsYXNzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RyYWluaW5nQ2xhc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGQxMGY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RyYWluaW5nQ2xhc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVHJhaW5pbmdNb2R1bGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVHJhaW5pbmdNb2R1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjU2YzE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RyYWluaW5nTW9kdWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RyYW5zaXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVHJhbnNpdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYWM0ZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVHJhbnNpdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UeXBlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1R5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWY4YWZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1R5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlhZDVkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1VzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVXNlckRlZmluZWRDYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNDc5ODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVXNlckRlZmluZWRDYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9WYXJpYWJpbGl0eUVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVmFyaWFiaWxpdHlFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI3NDE0ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9WYXJpYWJpbGl0eUVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVmVydGV4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1ZlcnRleC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNWM3MGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVmVydGV4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dCUy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9XQlMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjU2YzE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dCUy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9XaGl0ZXBhcGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1doaXRlcGFwZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWI0ODAwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1doaXRlcGFwZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya0JyZWFrZG93bkVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya0JyZWFrZG93bkVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmFjNGZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtCcmVha2Rvd25FbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtEZWZpbml0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtEZWZpbml0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEyNGYzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrRGVmaW5pdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrT3JkZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya09yZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFkYWFiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrT3JkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTQwZjNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDBmM2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxODIyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RHdWlkZWxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RHdWlkZWxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTdmYTY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0R3VpZGVsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0U2hhcGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RTaGFwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDBmM2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RTaGFwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFR5cGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlY2FjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWM1ZmQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ1NSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBFTUYgVU1BIEVkaXQgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLQotX1VJX0NyZWF0ZUNoaWxkX3RleHQgPSB7MH0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MiA9IHsxfSB7MH0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MyA9IHsxfQotX1VJX0NyZWF0ZUNoaWxkX3Rvb2x0aXAgPSBDcmVhdGUgTmV3IHswfSBVbmRlciB7MX0gRmVhdHVyZQotX1VJX0NyZWF0ZUNoaWxkX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IGNoaWxkIG9mIHR5cGUgezB9IGZvciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlIHNlbGVjdGVkIHsyfS4KLV9VSV9DcmVhdGVTaWJsaW5nX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IHNpYmxpbmcgb2YgdHlwZSB7MH0gZm9yIHRoZSBzZWxlY3RlZCB7Mn0sIHVuZGVyIHRoZSB7MX0gZmVhdHVyZSBvZiB0aGVpciBwYXJlbnQuCi0KLV9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24gPSBUaGUgezB9IG9mIHRoZSB7MX0KLQotX1VJX0NsYXNzaWZpZXJfdHlwZSA9IENsYXNzaWZpZXIKLV9VSV9UeXBlX3R5cGUgPSBUeXBlCi1fVUlfRWxlbWVudF90eXBlID0gRWxlbWVudAotX1VJX05hbWVkRWxlbWVudF90eXBlID0gTmFtZWQgRWxlbWVudAotX1VJX1BhY2thZ2VhYmxlRWxlbWVudF90eXBlID0gUGFja2FnZWFibGUgRWxlbWVudAotX1VJX1BhY2thZ2VfdHlwZSA9IFBhY2thZ2UKLV9VSV9OYW1lc3BhY2VfdHlwZSA9IE5hbWVzcGFjZQotX1VJX01ldGhvZEVsZW1lbnRfdHlwZSA9IE1ldGhvZCBFbGVtZW50Ci1fVUlfQ29uc3RyYWludF90eXBlID0gQ29uc3RyYWludAotX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUgPSBDb250ZW50IEVsZW1lbnQKLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSA9IERlc2NyaWJhYmxlIEVsZW1lbnQKLV9VSV9Db250ZW50RGVzY3JpcHRpb25fdHlwZSA9IENvbnRlbnQgRGVzY3JpcHRpb24KLV9VSV9TZWN0aW9uX3R5cGUgPSBTZWN0aW9uCi1fVUlfUm9sZV90eXBlID0gUm9sZQotX1VJX1dvcmtQcm9kdWN0X3R5cGUgPSBXb3JrIFByb2R1Y3QKLV9VSV9UYXNrX3R5cGUgPSBUYXNrCi1fVUlfV29ya0RlZmluaXRpb25fdHlwZSA9IFdvcmsgRGVmaW5pdGlvbgotX1VJX1N0ZXBfdHlwZSA9IFN0ZXAKLV9VSV9HdWlkYW5jZV90eXBlID0gR3VpZGFuY2UKLV9VSV9BcnRpZmFjdF90eXBlID0gQXJ0aWZhY3QKLV9VSV9EZWxpdmVyYWJsZV90eXBlID0gRGVsaXZlcmFibGUKLV9VSV9PdXRjb21lX3R5cGUgPSBPdXRjb21lCi1fVUlfTWV0aG9kUGFja2FnZV90eXBlID0gTWV0aG9kIFBhY2thZ2UKLV9VSV9Db250ZW50UGFja2FnZV90eXBlID0gQ29udGVudCBQYWNrYWdlCi1fVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl90eXBlID0gQXJ0aWZhY3QgRGVzY3JpcHRpb24KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3R5cGUgPSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3R5cGUgPSBEZWxpdmVyYWJsZSBEZXNjcmlwdGlvbgotX1VJX1JvbGVEZXNjcmlwdGlvbl90eXBlID0gUm9sZSBEZXNjcmlwdGlvbgotX1VJX1Rhc2tEZXNjcmlwdGlvbl90eXBlID0gVGFzayBEZXNjcmlwdGlvbgotX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fdHlwZSA9IEd1aWRhbmNlIERlc2NyaXB0aW9uCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl90eXBlID0gUHJhY3RpY2UgRGVzY3JpcHRpb24KLV9VSV9Qb2ludF90eXBlID0gUG9pbnQKLV9VSV9HcmFwaEVsZW1lbnRfdHlwZSA9IEdyYXBoIEVsZW1lbnQKLV9VSV9EaWFncmFtRWxlbWVudF90eXBlID0gRGlhZ3JhbSBFbGVtZW50Ci1fVUlfRGlhZ3JhbUxpbmtfdHlwZSA9IERpYWdyYW0gTGluawotX1VJX0dyYXBoQ29ubmVjdG9yX3R5cGUgPSBHcmFwaCBDb25uZWN0b3IKLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2UKLV9VSV9EaW1lbnNpb25fdHlwZSA9IERpbWVuc2lvbgotX1VJX1JlZmVyZW5jZV90eXBlID0gUmVmZXJlbmNlCi1fVUlfUHJvcGVydHlfdHlwZSA9IFByb3BlcnR5Ci1fVUlfR3JhcGhFZGdlX3R5cGUgPSBHcmFwaCBFZGdlCi1fVUlfRGlhZ3JhbV90eXBlID0gRGlhZ3JhbQotX1VJX0dyYXBoTm9kZV90eXBlID0gR3JhcGggTm9kZQotX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGUgPSBTaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudAotX1VJX1VNQVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSA9IFVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2UKLV9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gQ29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2UKLV9VSV9MZWFmRWxlbWVudF90eXBlID0gTGVhZiBFbGVtZW50Ci1fVUlfVGV4dEVsZW1lbnRfdHlwZSA9IFRleHQgRWxlbWVudAotX1VJX0ltYWdlX3R5cGUgPSBJbWFnZQotX1VJX0dyYXBoaWNQcmltaXRpdmVfdHlwZSA9IEdyYXBoaWMgUHJpbWl0aXZlCi1fVUlfUG9seWxpbmVfdHlwZSA9IFBvbHlsaW5lCi1fVUlfRWxsaXBzZV90eXBlID0gRWxsaXBzZQotX1VJX0FjdGl2aXR5X3R5cGUgPSBBY3Rpdml0eQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X3R5cGUgPSBXb3JrIEJyZWFrZG93biBFbGVtZW50Ci1fVUlfQnJlYWtkb3duRWxlbWVudF90eXBlID0gQnJlYWtkb3duIEVsZW1lbnQKLV9VSV9NaWxlc3RvbmVfdHlwZSA9IE1pbGVzdG9uZQotX1VJX0l0ZXJhdGlvbl90eXBlID0gSXRlcmF0aW9uCi1fVUlfUGhhc2VfdHlwZSA9IFBoYXNlCi1fVUlfVGVhbVByb2ZpbGVfdHlwZSA9IFRlYW0gUHJvZmlsZQotX1VJX1JvbGVEZXNjcmlwdG9yX3R5cGUgPSBSb2xlIERlc2NyaXB0b3IKLV9VSV9Xb3JrT3JkZXJfdHlwZSA9IFdvcmsgT3JkZXIKLV9VSV9Qcm9jZXNzRWxlbWVudF90eXBlID0gUHJvY2VzcyBFbGVtZW50Ci1fVUlfUGxhbm5pbmdEYXRhX3R5cGUgPSBQbGFubmluZyBEYXRhCi1fVUlfRGVzY3JpcHRvcl90eXBlID0gRGVzY3JpcHRvcgotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90eXBlID0gV29yayBQcm9kdWN0IERlc2NyaXB0b3IKLV9VSV9UYXNrRGVzY3JpcHRvcl90eXBlID0gVGFzayBEZXNjcmlwdG9yCi1fVUlfQ29tcG9zaXRlUm9sZV90eXBlID0gQ29tcG9zaXRlIFJvbGUKLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdHlwZSA9IEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl90eXBlID0gQWN0aXZpdHkgRGVzY3JpcHRpb24KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gRGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbgotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gUHJvY2VzcyBEZXNjcmlwdGlvbgotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpcHRvciBEZXNjcmlwdGlvbgotX1VJX0NvbmNlcHRfdHlwZSA9IENvbmNlcHQKLV9VSV9DaGVja2xpc3RfdHlwZSA9IENoZWNrbGlzdAotX1VJX0V4YW1wbGVfdHlwZSA9IEV4YW1wbGUKLV9VSV9HdWlkZWxpbmVfdHlwZSA9IEd1aWRlbGluZQotX1VJX1JlcG9ydF90eXBlID0gUmVwb3J0Ci1fVUlfVGVtcGxhdGVfdHlwZSA9IFRlbXBsYXRlCi1fVUlfU3VwcG9ydGluZ01hdGVyaWFsX3R5cGUgPSBTdXBwb3J0aW5nIE1hdGVyaWFsCi1fVUlfVG9vbE1lbnRvcl90eXBlID0gVG9vbCBNZW50b3IKLV9VSV9XaGl0ZXBhcGVyX3R5cGUgPSBXaGl0ZXBhcGVyCi1fVUlfVGVybURlZmluaXRpb25fdHlwZSA9IFRlcm0gRGVmaW5pdGlvbgotX1VJX1ByYWN0aWNlX3R5cGUgPSBQcmFjdGljZQotX1VJX0VzdGltYXRpb25Db25zaWRlcmF0aW9uc190eXBlID0gRXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucwotX1VJX1JldXNhYmxlQXNzZXRfdHlwZSA9IFJldXNhYmxlIEFzc2V0Ci1fVUlfU3RhdGVfdHlwZSA9IFN0YXRlCi1fVUlfVmVydGV4X3R5cGUgPSBWZXJ0ZXgKLV9VSV9SZWdpb25fdHlwZSA9IFJlZ2lvbgotX1VJX1N0YXRlTWFjaGluZV90eXBlID0gU3RhdGUgTWFjaGluZQotX1VJX1RyYW5zaXRpb25fdHlwZSA9IFRyYW5zaXRpb24KLV9VSV9Qc2V1ZG9TdGF0ZV90eXBlID0gUHNldWRvIFN0YXRlCi1fVUlfRGlzY2lwbGluZV90eXBlID0gRGlzY2lwbGluZQotX1VJX0NvbnRlbnRDYXRlZ29yeV90eXBlID0gQ29udGVudCBDYXRlZ29yeQotX1VJX1JvbGVTZXRfdHlwZSA9IFJvbGUgU2V0Ci1fVUlfRG9tYWluX3R5cGUgPSBEb21haW4KLV9VSV9Xb3JrUHJvZHVjdFR5cGVfdHlwZSA9IFdvcmsgUHJvZHVjdCBLaW5kCi1fVUlfRGlzY2lwbGluZUdyb3VwaW5nX3R5cGUgPSBEaXNjaXBsaW5lIEdyb3VwaW5nCi1fVUlfVG9vbF90eXBlID0gVG9vbAotX1VJX1JvbGVTZXRHcm91cGluZ190eXBlID0gUm9sZSBTZXQgR3JvdXBpbmcKLV9VSV9DdXN0b21DYXRlZ29yeV90eXBlID0gQ3VzdG9tIENhdGVnb3J5Ci1fVUlfRGVsaXZlcnlQcm9jZXNzX3R5cGUgPSBEZWxpdmVyeSBQcm9jZXNzCi1fVUlfUHJvY2Vzc190eXBlID0gUHJvY2VzcwotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuX3R5cGUgPSBDYXBhYmlsaXR5IFBhdHRlcm4KLV9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV90eXBlID0gUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZQotX1VJX1JvYWRtYXBfdHlwZSA9IFJvYWRtYXAKLV9VSV9Qcm9jZXNzQ29tcG9uZW50X3R5cGUgPSBQcm9jZXNzIENvbXBvbmVudAotX1VJX1Byb2Nlc3NQYWNrYWdlX3R5cGUgPSBQcm9jZXNzIFBhY2thZ2UKLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX3R5cGUgPSBQcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2UKLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl90eXBlID0gUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvcgotX1VJX01ldGhvZFBsdWdpbl90eXBlID0gTWV0aG9kIFBsdWctaW4KLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSA9IFZhcmlhYmlsaXR5IEVsZW1lbnQKLV9VSV9NZXRob2RVbml0X3R5cGUgPSBNZXRob2QgVW5pdAotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSA9IE1ldGhvZCBDb25maWd1cmF0aW9uCi1fVUlfUHJvY2Vzc0ZhbWlseV90eXBlID0gUHJvY2VzcyBGYW1pbHkKLV9VSV9NZXRob2RMaWJyYXJ5X3R5cGUgPSBNZXRob2QgTGlicmFyeQotX1VJX1Vua25vd25fdHlwZSA9IE9iamVjdAotCi1fVUlfVW5rbm93bl9kYXRhdHlwZT0gVmFsdWUKLQotX1VJX05hbWVkRWxlbWVudF9uYW1lX2ZlYXR1cmUgPSBOYW1lCi1fVUlfTWV0aG9kRWxlbWVudF9ndWlkX2ZlYXR1cmUgPSBHVUlECi1fVUlfTWV0aG9kRWxlbWVudF9icmllZkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBCcmllZiBEZXNjcmlwdGlvbgotX1VJX01ldGhvZEVsZW1lbnRfb3duZWRSdWxlc19mZWF0dXJlID0gT3duZWQgUnVsZXMKLV9VSV9NZXRob2RFbGVtZW50X3N1cHByZXNzZWRfZmVhdHVyZSA9IFN1cHByZXNzZWQKLV9VSV9NZXRob2RFbGVtZW50X29yZGVyaW5nR3VpZGVfZmVhdHVyZSA9IE9yZGVyaW5nIEd1aWRlCi1fVUlfQ29uc3RyYWludF9ib2R5X2ZlYXR1cmUgPSBCb2R5Ci1fVUlfQ29udGVudEVsZW1lbnRfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlID0gU3VwcG9ydGluZyBNYXRlcmlhbHMKLV9VSV9Db250ZW50RWxlbWVudF9jb25jZXB0c0FuZFBhcGVyc19mZWF0dXJlID0gQ29uY2VwdHMgQW5kIFBhcGVycwotX1VJX0NvbnRlbnRFbGVtZW50X2NoZWNrbGlzdHNfZmVhdHVyZSA9IENoZWNrbGlzdHMKLV9VSV9Db250ZW50RWxlbWVudF9ndWlkZWxpbmVzX2ZlYXR1cmUgPSBHdWlkZWxpbmVzCi1fVUlfQ29udGVudEVsZW1lbnRfZXhhbXBsZXNfZmVhdHVyZSA9IEV4YW1wbGVzCi1fVUlfQ29udGVudEVsZW1lbnRfYXNzZXRzX2ZlYXR1cmUgPSBBc3NldHMKLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uTmFtZV9mZWF0dXJlID0gUHJlc2VudGF0aW9uIE5hbWUKLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBQcmVzZW50YXRpb24KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfc2hhcGVpY29uX2ZlYXR1cmUgPSBTaGFwZWljb24KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfbm9kZWljb25fZmVhdHVyZSA9IE5vZGVpY29uCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX21haW5EZXNjcmlwdGlvbl9mZWF0dXJlID0gTWFpbiBEZXNjcmlwdGlvbgotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19mZWF0dXJlID0gU2VjdGlvbnMKLV9VSV9Db250ZW50RGVzY3JpcHRpb25fa2V5Q29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IEtleSBDb25zaWRlcmF0aW9ucwotX1VJX1NlY3Rpb25fc2VjdGlvbk5hbWVfZmVhdHVyZSA9IFNlY3Rpb24gTmFtZQotX1VJX1NlY3Rpb25fc2VjdGlvbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBTZWN0aW9uIERlc2NyaXB0aW9uCi1fVUlfU2VjdGlvbl9zdWJTZWN0aW9uc19mZWF0dXJlID0gU3ViIFNlY3Rpb25zCi1fVUlfU2VjdGlvbl9wcmVkZWNlc3Nvcl9mZWF0dXJlID0gUHJlZGVjZXNzb3IKLV9VSV9Sb2xlX21vZGlmaWVzX2ZlYXR1cmUgPSBNb2RpZmllcwotX1VJX1JvbGVfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFJlc3BvbnNpYmxlIEZvcgotX1VJX1dvcmtQcm9kdWN0X3JlcG9ydHNfZmVhdHVyZSA9IFJlcG9ydHMKLV9VSV9Xb3JrUHJvZHVjdF90ZW1wbGF0ZXNfZmVhdHVyZSA9IFRlbXBsYXRlcwotX1VJX1dvcmtQcm9kdWN0X3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBUb29sIE1lbnRvcnMKLV9VSV9Xb3JrUHJvZHVjdF9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IEVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMKLV9VSV9UYXNrX3BlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBQZXJmb3JtZWQgQnkKLV9VSV9UYXNrX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUgPSBNYW5kYXRvcnkgSW5wdXQKLV9VSV9UYXNrX291dHB1dF9mZWF0dXJlID0gT3V0cHV0Ci1fVUlfVGFza19hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeV9mZWF0dXJlID0gQWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeQotX1VJX1Rhc2tfb3B0aW9uYWxJbnB1dF9mZWF0dXJlID0gT3B0aW9uYWwgSW5wdXQKLV9VSV9UYXNrX3N0ZXBzX2ZlYXR1cmUgPSBTdGVwcwotX1VJX1Rhc2tfdG9vbE1lbnRvcnNfZmVhdHVyZSA9IFRvb2wgTWVudG9ycwotX1VJX1Rhc2tfZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBFc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zCi1fVUlfV29ya0RlZmluaXRpb25fcHJlY29uZGl0aW9uX2ZlYXR1cmUgPSBQcmVjb25kaXRpb24KLV9VSV9Xb3JrRGVmaW5pdGlvbl9wb3N0Y29uZGl0aW9uX2ZlYXR1cmUgPSBQb3N0Y29uZGl0aW9uCi1fVUlfQXJ0aWZhY3RfY29udGFpbmVyQXJ0aWZhY3RfZmVhdHVyZSA9IENvbnRhaW5lciBBcnRpZmFjdAotX1VJX0FydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0c19mZWF0dXJlID0gQ29udGFpbmVkIEFydGlmYWN0cwotX1VJX0RlbGl2ZXJhYmxlX2RlbGl2ZXJlZFdvcmtQcm9kdWN0c19mZWF0dXJlID0gRGVsaXZlcmVkIFdvcmsgUHJvZHVjdHMKLV9VSV9NZXRob2RQYWNrYWdlX2dsb2JhbF9mZWF0dXJlID0gR2xvYmFsCi1fVUlfTWV0aG9kUGFja2FnZV9yZXVzZWRQYWNrYWdlc19mZWF0dXJlID0gUmV1c2VkIFBhY2thZ2VzCi1fVUlfTWV0aG9kUGFja2FnZV9wYXJlbnRQYWNrYWdlX2ZlYXR1cmUgPSBQYXJlbnQgUGFja2FnZQotX1VJX01ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19mZWF0dXJlID0gQ2hpbGQgUGFja2FnZXMKLV9VSV9Db250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfZmVhdHVyZSA9IENvbnRlbnQgRWxlbWVudHMKLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX2JyaWVmT3V0bGluZV9mZWF0dXJlID0gQnJpZWYgT3V0bGluZQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fcmVwcmVzZW50YXRpb25PcHRpb25zX2ZlYXR1cmUgPSBSZXByZXNlbnRhdGlvbiBPcHRpb25zCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBFeHRlcm5hbCBJZAotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gUHVycG9zZQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25faW1wYWN0T2ZOb3RIYXZpbmdfZmVhdHVyZSA9IEltcGFjdCBPZiBOb3QgSGF2aW5nCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9yZWFzb25zRm9yTm90TmVlZGluZ19mZWF0dXJlID0gUmVhc29ucyBGb3IgTm90IE5lZWRpbmcKLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX2V4dGVybmFsRGVzY3JpcHRpb25fZmVhdHVyZSA9IEV4dGVybmFsIERlc2NyaXB0aW9uCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl9wYWNrYWdpbmdHdWlkYW5jZV9mZWF0dXJlID0gUGFja2FnaW5nIEd1aWRhbmNlCi1fVUlfUm9sZURlc2NyaXB0aW9uX3NraWxsc19mZWF0dXJlID0gU2tpbGxzCi1fVUlfUm9sZURlc2NyaXB0aW9uX2Fzc2lnbm1lbnRBcHByb2FjaGVzX2ZlYXR1cmUgPSBBc3NpZ25tZW50IEFwcHJvYWNoZXMKLV9VSV9Sb2xlRGVzY3JpcHRpb25fc3lub255bXNfZmVhdHVyZSA9IFN5bm9ueW1zCi1fVUlfVGFza0Rlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IFB1cnBvc2UKLV9VSV9UYXNrRGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUgPSBBbHRlcm5hdGl2ZXMKLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX2F0dGFjaG1lbnRzX2ZlYXR1cmUgPSBBdHRhY2htZW50cwotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYWRkaXRpb25hbEluZm9fZmVhdHVyZSA9IEFkZGl0aW9uYWwgSW5mbwotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fcHJvYmxlbV9mZWF0dXJlID0gUHJvYmxlbQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYmFja2dyb3VuZF9mZWF0dXJlID0gQmFja2dyb3VuZAotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fZ29hbHNfZmVhdHVyZSA9IEdvYWxzCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hcHBsaWNhdGlvbl9mZWF0dXJlID0gQXBwbGljYXRpb24KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2xldmVsc09mQWRvcHRpb25fZmVhdHVyZSA9IExldmVscyBPZiBBZG9wdGlvbgotX1VJX1BvaW50X3hfZmVhdHVyZSA9IFgKLV9VSV9Qb2ludF95X2ZlYXR1cmUgPSBZCi1fVUlfR3JhcGhFbGVtZW50X3Bvc2l0aW9uX2ZlYXR1cmUgPSBQb3NpdGlvbgotX1VJX0dyYXBoRWxlbWVudF9jb250YWluZWRfZmVhdHVyZSA9IENvbnRhaW5lZAotX1VJX0dyYXBoRWxlbWVudF9saW5rX2ZlYXR1cmUgPSBMaW5rCi1fVUlfR3JhcGhFbGVtZW50X2FuY2hvcmFnZV9mZWF0dXJlID0gQW5jaG9yYWdlCi1fVUlfR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfZmVhdHVyZSA9IFNlbWFudGljIE1vZGVsCi1fVUlfRGlhZ3JhbUVsZW1lbnRfaXNWaXNpYmxlX2ZlYXR1cmUgPSBJcyBWaXNpYmxlCi1fVUlfRGlhZ3JhbUVsZW1lbnRfY29udGFpbmVyX2ZlYXR1cmUgPSBDb250YWluZXIKLV9VSV9EaWFncmFtRWxlbWVudF9yZWZlcmVuY2VfZmVhdHVyZSA9IFJlZmVyZW5jZQotX1VJX0RpYWdyYW1FbGVtZW50X3Byb3BlcnR5X2ZlYXR1cmUgPSBQcm9wZXJ0eQotX1VJX0RpYWdyYW1MaW5rX3pvb21fZmVhdHVyZSA9IFpvb20KLV9VSV9EaWFncmFtTGlua192aWV3cG9ydF9mZWF0dXJlID0gVmlld3BvcnQKLV9VSV9EaWFncmFtTGlua19ncmFwaEVsZW1lbnRfZmVhdHVyZSA9IEdyYXBoIEVsZW1lbnQKLV9VSV9EaWFncmFtTGlua19kaWFncmFtX2ZlYXR1cmUgPSBEaWFncmFtCi1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBHcmFwaCBFbGVtZW50Ci1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFZGdlX2ZlYXR1cmUgPSBHcmFwaCBFZGdlCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9wcmVzZW50YXRpb25fZmVhdHVyZSA9IFByZXNlbnRhdGlvbgotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBHcmFwaCBFbGVtZW50Ci1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9kaWFncmFtX2ZlYXR1cmUgPSBEaWFncmFtCi1fVUlfRGltZW5zaW9uX3dpZHRoX2ZlYXR1cmUgPSBXaWR0aAotX1VJX0RpbWVuc2lvbl9oZWlnaHRfZmVhdHVyZSA9IEhlaWdodAotX1VJX1JlZmVyZW5jZV9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbl9mZWF0dXJlID0gSXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbgotX1VJX1JlZmVyZW5jZV9yZWZlcmVuY2VkX2ZlYXR1cmUgPSBSZWZlcmVuY2VkCi1fVUlfUHJvcGVydHlfa2V5X2ZlYXR1cmUgPSBLZXkKLV9VSV9Qcm9wZXJ0eV92YWx1ZV9mZWF0dXJlID0gVmFsdWUKLV9VSV9HcmFwaEVkZ2VfYW5jaG9yX2ZlYXR1cmUgPSBBbmNob3IKLV9VSV9HcmFwaEVkZ2Vfd2F5cG9pbnRzX2ZlYXR1cmUgPSBXYXlwb2ludHMKLV9VSV9EaWFncmFtX3pvb21fZmVhdHVyZSA9IFpvb20KLV9VSV9EaWFncmFtX3ZpZXdwb2ludF9mZWF0dXJlID0gVmlld3BvaW50Ci1fVUlfRGlhZ3JhbV9kaWFncmFtTGlua19mZWF0dXJlID0gRGlhZ3JhbSBMaW5rCi1fVUlfRGlhZ3JhbV9uYW1lc3BhY2VfZmVhdHVyZSA9IE5hbWVzcGFjZQotX1VJX0dyYXBoTm9kZV9zaXplX2ZlYXR1cmUgPSBTaXplCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZUluZm9fZmVhdHVyZSA9IFR5cGUgSW5mbwotX1VJX1VNQVNlbWFudGljTW9kZWxCcmlkZ2VfZWxlbWVudF9mZWF0dXJlID0gRWxlbWVudAotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IEVsZW1lbnQKLV9VSV9UZXh0RWxlbWVudF90ZXh0X2ZlYXR1cmUgPSBUZXh0Ci1fVUlfSW1hZ2VfdXJpX2ZlYXR1cmUgPSBVcmkKLV9VSV9JbWFnZV9taW1lVHlwZV9mZWF0dXJlID0gTWltZSBUeXBlCi1fVUlfUG9seWxpbmVfY2xvc2VkX2ZlYXR1cmUgPSBDbG9zZWQKLV9VSV9Qb2x5bGluZV93YXlwb2ludHNfZmVhdHVyZSA9IFdheXBvaW50cwotX1VJX0VsbGlwc2VfcmFkaXVzWF9mZWF0dXJlID0gUmFkaXVzIFgKLV9VSV9FbGxpcHNlX3JhZGl1c1lfZmVhdHVyZSA9IFJhZGl1cyBZCi1fVUlfRWxsaXBzZV9yb3RhdGlvbl9mZWF0dXJlID0gUm90YXRpb24KLV9VSV9FbGxpcHNlX3N0YXJ0QW5nbGVfZmVhdHVyZSA9IFN0YXJ0IEFuZ2xlCi1fVUlfRWxsaXBzZV9lbmRBbmdsZV9mZWF0dXJlID0gRW5kIEFuZ2xlCi1fVUlfRWxsaXBzZV9jZW50ZXJfZmVhdHVyZSA9IENlbnRlcgotX1VJX0FjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX2ZlYXR1cmUgPSBCcmVha2Rvd24gRWxlbWVudHMKLV9VSV9BY3Rpdml0eV9yb2FkbWFwc19mZWF0dXJlID0gUm9hZG1hcHMKLV9VSV9BY3Rpdml0eV9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUgPSBTdXBwb3J0aW5nIE1hdGVyaWFscwotX1VJX0FjdGl2aXR5X2NoZWNrbGlzdHNfZmVhdHVyZSA9IENoZWNrbGlzdHMKLV9VSV9BY3Rpdml0eV9jb25jZXB0c19mZWF0dXJlID0gQ29uY2VwdHMKLV9VSV9BY3Rpdml0eV9leGFtcGxlc19mZWF0dXJlID0gRXhhbXBsZXMKLV9VSV9BY3Rpdml0eV9ndWlkZWxpbmVzX2ZlYXR1cmUgPSBHdWlkZWxpbmVzCi1fVUlfQWN0aXZpdHlfcmV1c2FibGVBc3NldHNfZmVhdHVyZSA9IFJldXNhYmxlIEFzc2V0cwotX1VJX0FjdGl2aXR5X2lzRW5hY3RhYmxlX2ZlYXR1cmUgPSBJcyBFbmFjdGFibGUKLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc1JlcGVhdGFibGVfZmVhdHVyZSA9IElzIFJlcGVhdGFibGUKLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc09uZ29pbmdfZmVhdHVyZSA9IElzIE9uZ29pbmcKLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc0V2ZW50RHJpdmVuX2ZlYXR1cmUgPSBJcyBFdmVudCBEcml2ZW4KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9saW5rVG9QcmVkZWNlc3Nvcl9mZWF0dXJlID0gTGluayBUbyBQcmVkZWNlc3NvcgotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlZml4X2ZlYXR1cmUgPSBQcmVmaXgKLV9VSV9CcmVha2Rvd25FbGVtZW50X2lzUGxhbm5lZF9mZWF0dXJlID0gSXMgUGxhbm5lZAotX1VJX0JyZWFrZG93bkVsZW1lbnRfaGFzTXVsdGlwbGVPY2N1cnJlbmNlc19mZWF0dXJlID0gSGFzIE11bHRpcGxlIE9jY3VycmVuY2VzCi1fVUlfQnJlYWtkb3duRWxlbWVudF9pc09wdGlvbmFsX2ZlYXR1cmUgPSBJcyBPcHRpb25hbAotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQWZ0ZXJfZmVhdHVyZSA9IFByZXNlbnRlZCBBZnRlcgotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQmVmb3JlX2ZlYXR1cmUgPSBQcmVzZW50ZWQgQmVmb3JlCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wbGFubmluZ0RhdGFfZmVhdHVyZSA9IFBsYW5uaW5nIERhdGEKLV9VSV9CcmVha2Rvd25FbGVtZW50X3N1cGVyQWN0aXZpdGllc19mZWF0dXJlID0gU3VwZXIgQWN0aXZpdHkKLV9VSV9UZWFtUHJvZmlsZV90ZWFtUm9sZXNfZmVhdHVyZSA9IFRlYW0gUm9sZXMKLV9VSV9UZWFtUHJvZmlsZV9zdXBlclRlYW1fZmVhdHVyZSA9IFN1cGVyIFRlYW0KLV9VSV9UZWFtUHJvZmlsZV9zdWJUZWFtX2ZlYXR1cmUgPSBTdWIgVGVhbQotX1VJX1JvbGVEZXNjcmlwdG9yX1JvbGVfZmVhdHVyZSA9IFJvbGUKLV9VSV9Sb2xlRGVzY3JpcHRvcl9tb2RpZmllc19mZWF0dXJlID0gTW9kaWZpZXMKLV9VSV9Sb2xlRGVzY3JpcHRvcl9yZXNwb25zaWJsZUZvcl9mZWF0dXJlID0gUmVzcG9uc2libGUgRm9yCi1fVUlfV29ya09yZGVyX2xpbmtUeXBlX2ZlYXR1cmUgPSBMaW5rIFR5cGUKLV9VSV9Xb3JrT3JkZXJfcHJlZF9mZWF0dXJlID0gUHJlZAotX1VJX1BsYW5uaW5nRGF0YV9zdGFydERhdGVfZmVhdHVyZSA9IFN0YXJ0IERhdGUKLV9VSV9QbGFubmluZ0RhdGFfZmluaXNoRGF0ZV9mZWF0dXJlID0gRmluaXNoIERhdGUKLV9VSV9QbGFubmluZ0RhdGFfcmFua19mZWF0dXJlID0gUmFuawotX1VJX0Rlc2NyaXB0b3JfaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlX2ZlYXR1cmUgPSBJcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2UKLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFbnRyeVN0YXRlX2ZlYXR1cmUgPSBBY3Rpdml0eSBFbnRyeSBTdGF0ZQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9hY3Rpdml0eUV4aXRTdGF0ZV9mZWF0dXJlID0gQWN0aXZpdHkgRXhpdCBTdGF0ZQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdF9mZWF0dXJlID0gV29yayBQcm9kdWN0Ci1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2ltcGFjdGVkQnlfZmVhdHVyZSA9IEltcGFjdGVkIEJ5Ci1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2ltcGFjdHNfZmVhdHVyZSA9IEltcGFjdHMKLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfZGVsaXZlcmFibGVQYXJ0c19mZWF0dXJlID0gRGVsaXZlcmFibGUgUGFydHMKLV9VSV9UYXNrRGVzY3JpcHRvcl9UYXNrX2ZlYXR1cmUgPSBUYXNrCi1fVUlfVGFza0Rlc2NyaXB0b3JfYWRkaXRpb25hbGx5UGVyZm9ybWVkQnlfZmVhdHVyZSA9IFNlY29uZGFyeSBQZXJmb3JtZXIKLV9VSV9UYXNrRGVzY3JpcHRvcl9hc3Npc3RlZEJ5X2ZlYXR1cmUgPSBBc3Npc3RlZCBCeQotX1VJX1Rhc2tEZXNjcmlwdG9yX2V4dGVybmFsSW5wdXRfZmVhdHVyZSA9IEV4dGVybmFsIElucHV0Ci1fVUlfVGFza0Rlc2NyaXB0b3JfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSA9IE1hbmRhdG9yeSBJbnB1dAotX1VJX1Rhc2tEZXNjcmlwdG9yX29wdGlvbmFsSW5wdXRfZmVhdHVyZSA9IE9wdGlvbmFsIElucHV0Ci1fVUlfVGFza0Rlc2NyaXB0b3Jfb3V0cHV0X2ZlYXR1cmUgPSBPdXRwdXQKLV9VSV9UYXNrRGVzY3JpcHRvcl9wZXJmb3JtZWRQcmltYXJpbHlCeV9mZWF0dXJlID0gUHJpbWFyeSBQZXJmb3JtZXIKLV9VSV9UYXNrRGVzY3JpcHRvcl9zZWxlY3RlZFN0ZXBzX2ZlYXR1cmUgPSBTZWxlY3RlZCBTdGVwcwotX1VJX0NvbXBvc2l0ZVJvbGVfYWdncmVnYXRlZFJvbGVzX2ZlYXR1cmUgPSBBZ2dyZWdhdGVkIFJvbGVzCi1fVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3VzYWdlR3VpZGFuY2VfZmVhdHVyZSA9IFVzYWdlIEd1aWRhbmNlCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBQdXJwb3NlCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9hbHRlcm5hdGl2ZXNfZmVhdHVyZSA9IEFsdGVybmF0aXZlcwotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25faG93dG9TdGFmZl9mZWF0dXJlID0gSG93dG8gU3RhZmYKLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9zY2FsZV9mZWF0dXJlID0gU2NhbGUKLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzX2ZlYXR1cmUgPSBQcm9qZWN0IENoYXJhY3RlcmlzdGljcwotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Jpc2tMZXZlbF9mZWF0dXJlID0gUmlzayBMZXZlbAotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX2VzdGltYXRpbmdUZWNobmlxdWVfZmVhdHVyZSA9IEVzdGltYXRpbmcgVGVjaG5pcXVlCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdE1lbWJlckV4cGVydGlzZV9mZWF0dXJlID0gUHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZU9mQ29udHJhY3RfZmVhdHVyZSA9IFR5cGUgT2YgQ29udHJhY3QKLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlID0gRXh0ZXJuYWwgSWQKLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fc2NvcGVfZmVhdHVyZSA9IFNjb3BlCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3VzYWdlTm90ZXNfZmVhdHVyZSA9IFVzYWdlIE5vdGVzCi1fVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3JlZmluZWREZXNjcmlwdGlvbl9mZWF0dXJlID0gUmVmaW5lZCBEZXNjcmlwdGlvbgotX1VJX1ByYWN0aWNlX3N1YlByYWN0aWNlc19mZWF0dXJlID0gU3ViIFByYWN0aWNlcwotX1VJX1ByYWN0aWNlX2NvbnRlbnRSZWZlcmVuY2VzX2ZlYXR1cmUgPSBDb250ZW50IFJlZmVyZW5jZXMKLV9VSV9QcmFjdGljZV9hY3Rpdml0eVJlZmVyZW5jZXNfZmVhdHVyZSA9IEFjdGl2aXR5IFJlZmVyZW5jZXMKLV9VSV9TdGF0ZV9Xb3JrUHJvZHVjdF9mZWF0dXJlID0gV29yayBQcm9kdWN0Ci1fVUlfU3RhdGVfUmVnaW9uX2ZlYXR1cmUgPSBSZWdpb24KLV9VSV9TdGF0ZV9zdWJtYWNoaW5lX2ZlYXR1cmUgPSBTdWJtYWNoaW5lCi1fVUlfVmVydGV4X2NvbnRhaW5lcl9mZWF0dXJlID0gQ29udGFpbmVyCi1fVUlfVmVydGV4X291dGdvaW5nX2ZlYXR1cmUgPSBPdXRnb2luZwotX1VJX1ZlcnRleF9pbmNvbWluZ19mZWF0dXJlID0gSW5jb21pbmcKLV9VSV9SZWdpb25fVmVydGV4X2ZlYXR1cmUgPSBWZXJ0ZXgKLV9VSV9SZWdpb25fVHJhbnNpdGlvbl9mZWF0dXJlID0gVHJhbnNpdGlvbgotX1VJX1JlZ2lvbl9TdGF0ZV9mZWF0dXJlID0gU3RhdGUKLV9VSV9SZWdpb25fU3RhdGVNYWNoaW5lX2ZlYXR1cmUgPSBTdGF0ZSBNYWNoaW5lCi1fVUlfU3RhdGVNYWNoaW5lX1JlZ2lvbl9mZWF0dXJlID0gUmVnaW9uCi1fVUlfVHJhbnNpdGlvbl9Xb3JrRGVmaW5pdGlvbl9mZWF0dXJlID0gV29yayBEZWZpbml0aW9uCi1fVUlfVHJhbnNpdGlvbl9jb250YWluZXJfZmVhdHVyZSA9IENvbnRhaW5lcgotX1VJX1RyYW5zaXRpb25fc291cmNlX2ZlYXR1cmUgPSBTb3VyY2UKLV9VSV9UcmFuc2l0aW9uX3RhcmdldF9mZWF0dXJlID0gVGFyZ2V0Ci1fVUlfRGlzY2lwbGluZV90YXNrc19mZWF0dXJlID0gVGFza3MKLV9VSV9EaXNjaXBsaW5lX3N1YmRpc2NpcGxpbmVfZmVhdHVyZSA9IFN1YmRpc2NpcGxpbmUKLV9VSV9EaXNjaXBsaW5lX3JlZmVyZW5jZVdvcmtmbG93c19mZWF0dXJlID0gUmVmZXJlbmNlIFdvcmtmbG93cwotX1VJX1JvbGVTZXRfcm9sZXNfZmVhdHVyZSA9IFJvbGVzCi1fVUlfRG9tYWluX3dvcmtQcm9kdWN0c19mZWF0dXJlID0gV29yayBQcm9kdWN0cwotX1VJX0RvbWFpbl9zdWJkb21haW5zX2ZlYXR1cmUgPSBTdWJkb21haW5zCi1fVUlfV29ya1Byb2R1Y3RUeXBlX3dvcmtQcm9kdWN0c19mZWF0dXJlID0gV29yayBQcm9kdWN0cwotX1VJX0Rpc2NpcGxpbmVHcm91cGluZ19kaXNjaXBsaW5lc19mZWF0dXJlID0gRGlzY2lwbGluZXMKLV9VSV9Ub29sX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBUb29sIE1lbnRvcnMKLV9VSV9Sb2xlU2V0R3JvdXBpbmdfcm9sZVNldHNfZmVhdHVyZSA9IFJvbGUgU2V0cwotX1VJX0N1c3RvbUNhdGVnb3J5X2NhdGVnb3JpemVkRWxlbWVudHNfZmVhdHVyZSA9IENhdGVnb3JpemVkIEVsZW1lbnRzCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19mZWF0dXJlID0gU3ViIENhdGVnb3JpZXMKLV9VSV9EZWxpdmVyeVByb2Nlc3NfZWR1Y2F0aW9uTWF0ZXJpYWxzX2ZlYXR1cmUgPSBFZHVjYXRpb24gTWF0ZXJpYWxzCi1fVUlfRGVsaXZlcnlQcm9jZXNzX2NvbW11bmljYXRpb25zTWF0ZXJpYWxzX2ZlYXR1cmUgPSBDb21tdW5pY2F0aW9ucyBNYXRlcmlhbHMKLV9VSV9Qcm9jZXNzX2luY2x1ZGVzUGF0dGVybnNfZmVhdHVyZSA9IEluY2x1ZGVzIFBhdHRlcm5zCi1fVUlfUHJvY2Vzc19kZWZhdWx0Q29udGV4dF9mZWF0dXJlID0gRGVmYXVsdCBDb250ZXh0Ci1fVUlfUHJvY2Vzc192YWxpZENvbnRleHRfZmVhdHVyZSA9IFZhbGlkIENvbnRleHQKLV9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9iYXNlZE9uUHJvY2Vzc2VzX2ZlYXR1cmUgPSBCYXNlZCBPbiBQcm9jZXNzZXMKLV9VSV9Qcm9jZXNzQ29tcG9uZW50X2ludGVyZmFjZXNfZmVhdHVyZSA9IEludGVyZmFjZXMKLV9VSV9Qcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfZmVhdHVyZSA9IFByb2Nlc3MKLV9VSV9Qcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfZmVhdHVyZSA9IFByb2Nlc3MgRWxlbWVudHMKLV9VSV9Qcm9jZXNzUGFja2FnZV9kaWFncmFtc19mZWF0dXJlID0gRGlhZ3JhbXMKLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZVNwZWNpZmljYXRpb25zX2ZlYXR1cmUgPSBJbnRlcmZhY2UgU3BlY2lmaWNhdGlvbnMKLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZUlPX2ZlYXR1cmUgPSBJbnRlcmZhY2UgSU8KLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9Qcm9jZXNzQ29tcG9uZW50X2ZlYXR1cmUgPSBQcm9jZXNzIENvbXBvbmVudAotX1VJX01ldGhvZFBsdWdpbl91c2VyQ2hhbmdlYWJsZV9mZWF0dXJlID0gVXNlciBDaGFuZ2VhYmxlCi1fVUlfTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX2ZlYXR1cmUgPSBNZXRob2QgUGFja2FnZXMKLV9VSV9NZXRob2RQbHVnaW5fYmFzZXNfZmVhdHVyZSA9IEJhc2VzCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5VHlwZV9mZWF0dXJlID0gVmFyaWFiaWxpdHkgVHlwZQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUgPSBWYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50Ci1fVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUgPSBBdXRob3JzCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEYXRlX2ZlYXR1cmUgPSBDaGFuZ2UgRGF0ZQotX1VJX01ldGhvZFVuaXRfY2hhbmdlRGVzY3JpcHRpb25fZmVhdHVyZSA9IENoYW5nZSBEZXNjcmlwdGlvbgotX1VJX01ldGhvZFVuaXRfdmVyc2lvbl9mZWF0dXJlID0gVmVyc2lvbgotX1VJX01ldGhvZFVuaXRfY29weXJpZ2h0U3RhdGVtZW50X2ZlYXR1cmUgPSBDb3B5cmlnaHQgU3RhdGVtZW50Ci1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQbHVnaW5TZWxlY3Rpb25fZmVhdHVyZSA9IE1ldGhvZCBQbHVnLWluIFNlbGVjdGlvbgotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fbWV0aG9kUGFja2FnZVNlbGVjdGlvbl9mZWF0dXJlID0gTWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9wcm9jZXNzVmlld3NfZmVhdHVyZSA9IFByb2Nlc3MgVmlld3MKLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2RlZmF1bHRWaWV3X2ZlYXR1cmUgPSBEZWZhdWx0IFZpZXcKLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2Jhc2VDb25maWd1cmF0aW9uc19mZWF0dXJlID0gQmFzZSBDb25maWd1cmF0aW9ucwotX1VJX1Byb2Nlc3NGYW1pbHlfZGVsaXZlcnlQcm9jZXNzZXNfZmVhdHVyZSA9IERlbGl2ZXJ5IFByb2Nlc3NlcwotX1VJX01ldGhvZExpYnJhcnlfbWV0aG9kUGx1Z2luc19mZWF0dXJlID0gTWV0aG9kIFBsdWctaW5zCi1fVUlfTWV0aG9kTGlicmFyeV9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnNfZmVhdHVyZSA9IFByZWRlZmluZWQgQ29uZmlndXJhdGlvbnMKLV9VSV9Vbmtub3duX2ZlYXR1cmUgPSBVbnNwZWNpZmllZAotCi1fVUlfV29ya09yZGVyVHlwZV9maW5pc2hUb1N0YXJ0X2xpdGVyYWwgPSBmaW5pc2hUb1N0YXJ0Ci1fVUlfV29ya09yZGVyVHlwZV9maW5pc2hUb0ZpbmlzaF9saXRlcmFsID0gZmluaXNoVG9GaW5pc2gKLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9TdGFydF9saXRlcmFsID0gc3RhcnRUb1N0YXJ0Ci1fVUlfV29ya09yZGVyVHlwZV9zdGFydFRvRmluaXNoX2xpdGVyYWwgPSBzdGFydFRvRmluaXNoCi1fVUlfUHNldWRvU3RhdGVLaW5kX2luaXRpYWxfbGl0ZXJhbCA9IGluaXRpYWwKLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfam9pbl9saXRlcmFsID0gam9pbgotX1VJX1BzZXVkb1N0YXRlS2luZF9mb3JrX2xpdGVyYWwgPSBmb3JrCi1fVUlfUHNldWRvU3RhdGVLaW5kX2p1bmN0aW9uX2xpdGVyYWwgPSBqdW5jdGlvbgotX1VJX1BzZXVkb1N0YXRlS2luZF9jaG9pY2VfbGl0ZXJhbCA9IGNob2ljZQotX1VJX1BzZXVkb1N0YXRlS2luZF9lbnRyeVBvaW50X2xpdGVyYWwgPSBlbnRyeVBvaW50Ci1fVUlfUHNldWRvU3RhdGVLaW5kX2V4aXRQb2ludF9saXRlcmFsID0gZXhpdFBvaW50Ci1fVUlfUHNldWRvU3RhdGVLaW5kX3Rlcm1pbmF0ZV9saXRlcmFsID0gdGVybWluYXRlCi1fVUlfVmFyaWFiaWxpdHlUeXBlX25hX2xpdGVyYWwgPSBuYQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9jb250cmlidXRlc19saXRlcmFsID0gY29udHJpYnV0ZXMKLV9VSV9WYXJpYWJpbGl0eVR5cGVfZXh0ZW5kc19saXRlcmFsID0gZXh0ZW5kcwotX1VJX1ZhcmlhYmlsaXR5VHlwZV9yZXBsYWNlc19saXRlcmFsID0gcmVwbGFjZXMKLV9VSV9WYXJpYWJpbGl0eVR5cGVfbG9jYWxDb250cmlidXRpb25fbGl0ZXJhbCA9IGxvY2FsQ29udHJpYnV0aW9uCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsUmVwbGFjZW1lbnRfbGl0ZXJhbCA9IGxvY2FsUmVwbGFjZW1lbnQKLV9VSV9BcnRpZmFjdERlc2NyaXB0b3JfdHlwZSA9IEFydGlmYWN0IERlc2NyaXB0b3IKLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0b3JfdHlwZSA9IERlbGl2ZXJhYmxlIERlc2NyaXB0b3IKLV9VSV9PdXRjb21lRGVzY3JpcHRvcl90eXBlID0gT3V0Y29tZSBEZXNjcmlwdG9yCi1fVUlfTWV0aG9kRWxlbWVudFByb3BlcnR5X3R5cGUgPSBNZXRob2QgRWxlbWVudCBQcm9wZXJ0eQotX1VJX01ldGhvZEVsZW1lbnRfbWV0aG9kRWxlbWVudFByb3BlcnR5X2ZlYXR1cmUgPSBNZXRob2QgRWxlbWVudCBQcm9wZXJ0eQotX1VJX01ldGhvZEVsZW1lbnRQcm9wZXJ0eV92YWx1ZV9mZWF0dXJlID0gVmFsdWUKLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3N1YnRyYWN0ZWRDYXRlZ29yeV9mZWF0dXJlID0gU3VidHJhY3RlZCBDYXRlZ29yeQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fYWRkZWRDYXRlZ29yeV9mZWF0dXJlID0gQWRkZWQgQ2F0ZWdvcnkKLV9VSV9WYXJpYWJpbGl0eVR5cGVfZXh0ZW5kc1JlcGxhY2VzX2xpdGVyYWwgPSBleHRlbmRzUmVwbGFjZXMKLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3JlcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBSZXByZXNlbnRhdGlvbgotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fbm90YXRpb25fZmVhdHVyZSA9IE5vdGF0aW9uCi1fVUlfQ29udGVudEVsZW1lbnRfdGVybURlZmluaXRpb25fZmVhdHVyZSA9IFRlcm0gRGVmaW5pdGlvbgotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBFeHRlcm5hbCBJZAotX1VJX0tpbmRfdHlwZSA9IEtpbmQKLV9VSV9GdWxmaWxsYWJsZUVsZW1lbnRfdHlwZSA9IEZ1bGZpbGxhYmxlIEVsZW1lbnQKLV9VSV9DbGFzc2lmaWVyX2lzQWJzdHJhY3RfZmVhdHVyZSA9IElzIEFic3RyYWN0Ci1fVUlfTWV0aG9kRWxlbWVudF9wcmVzZW50YXRpb25OYW1lX2ZlYXR1cmUgPSBQcmVzZW50YXRpb24gTmFtZQotX1VJX01ldGhvZEVsZW1lbnRfa2luZF9mZWF0dXJlID0gS2luZAotX1VJX0tpbmRfYXBwbGljYWJsZU1ldGFDbGFzc19mZWF0dXJlID0gQXBwbGljYWJsZSBNZXRhIENsYXNzCi1fVUlfS2luZF9pc1ByaW1hcnlLaW5kX2ZlYXR1cmUgPSBJcyBQcmltYXJ5IEtpbmQKLV9VSV9Db250ZW50RWxlbWVudF90ZXJtZGVmaW5pdGlvbl9mZWF0dXJlID0gVGVybWRlZmluaXRpb24KLV9VSV9GdWxmaWxsYWJsZUVsZW1lbnRfZnVsZmlsbHNfZmVhdHVyZSA9IEZ1bGZpbGxzCi1fVUlfQnJlYWtkb3duRWxlbWVudF9jaGVja2xpc3RzX2ZlYXR1cmUgPSBDaGVja2xpc3RzCi1fVUlfQnJlYWtkb3duRWxlbWVudF9jb25jZXB0c19mZWF0dXJlID0gQ29uY2VwdHMKLV9VSV9CcmVha2Rvd25FbGVtZW50X2V4YW1wbGVzX2ZlYXR1cmUgPSBFeGFtcGxlcwotX1VJX0JyZWFrZG93bkVsZW1lbnRfZ3VpZGVsaW5lc19mZWF0dXJlID0gR3VpZGVsaW5lcwotX1VJX0JyZWFrZG93bkVsZW1lbnRfcmV1c2FibGVBc3NldHNfZmVhdHVyZSA9IFJldXNhYmxlIEFzc2V0cwotX1VJX0JyZWFrZG93bkVsZW1lbnRfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlID0gU3VwcG9ydGluZyBNYXRlcmlhbHMKLV9VSV9NaWxlc3RvbmVfcmVxdWlyZWRSZXN1bHRzX2ZlYXR1cmUgPSBSZXF1aXJlZCBSZXN1bHRzCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX3dvcmtQcm9kdWN0X2ZlYXR1cmUgPSBXb3JrIFByb2R1Y3QKLV9VSV9Sb2xlRGVzY3JpcHRvcl9yb2xlX2ZlYXR1cmUgPSBSb2xlCi1fVUlfVGFza0Rlc2NyaXB0b3JfdGFza19mZWF0dXJlID0gVGFzawotX1VJX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX19wcm9jZXNzQ29tcG9uZW50X2ZlYXR1cmUgPSBwcm9jZXNzIENvbXBvbmVudAotX1VJX0JyZWFrZG93bkVsZW1lbnRfdGVtcGxhdGVzX2ZlYXR1cmUgPSBUZW1wbGF0ZXMKLV9VSV9CcmVha2Rvd25FbGVtZW50X3JlcG9ydHNfZmVhdHVyZSA9IFJlcG9ydHMKLV9VSV9CcmVha2Rvd25FbGVtZW50X2VzdGltYXRpb25jb25zaWRlcmF0aW9uc19mZWF0dXJlID0gRXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zCi1fVUlfQnJlYWtkb3duRWxlbWVudF90b29sbWVudG9yX2ZlYXR1cmUgPSBUb29sbWVudG9yCi1fVUlfQXBwbGljYWJsZU1ldGFDbGFzc0luZm9fdHlwZSA9IEFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvCi1fVUlfS2luZF9hcHBsaWNhYmxlTWV0YUNsYXNzSW5mb19mZWF0dXJlID0gQXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm8KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fbG9uZ1ByZXNlbnRhdGlvbk5hbWVfZmVhdHVyZSA9IExvbmcgUHJlc2VudGF0aW9uIE5hbWUKLV9VSV9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb19pc1ByaW1hcnlFeHRlbnNpb25fZmVhdHVyZSA9IElzIFByaW1hcnkgRXh0ZW5zaW9uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDYyZjA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPCEtLQotIDxjb3B5cmlnaHQ+Ci0gPC9jb3B5cmlnaHQ+Ci0KLSAkSWQ6IHBsdWdpbi54bWwsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo1NCBqdGhhbSBFeHAgJAotLS0+Ci0KLTxwbHVnaW4+Ci0gICAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0Lml0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3JpZXMiPgotICAgIDxmYWN0b3J5IAotICAgICAgIHVyaSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlIiAKLSAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IiAKLSAgICAgICBzdXBwb3J0ZWRUeXBlcyA9IAotICAgICAgICAgIm9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyCi0gICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyCi0gICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyCi0gICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyCi0gICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZSIgLz4KLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ3OWVlMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbi5UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci0KLS8qKgotICogQSBjb21tYW5kIHRoYXQgY3JlYXRlcyBhbiB1bmluaXRpYWxpemVkIGNvcHkgb2YgYSBtZXRob2QgZWxlbWVudC4gVGhlCi0gKiBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24gd2lsbCBiZSBleGVjdXRlZCB1c2luZwotICoge0BsaW5rIE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmR9LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kIGV4dGVuZHMgQ3JlYXRlQ29weUNvbW1hbmQgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogICAgICAgICAgICB0aGUgZWRpdGluZyBkb21haW4KLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgYmVpbmcgY29waWVkCi0JICogQHBhcmFtIGNvcHlIZWxwZXIKLQkgKiAgICAgICAgICAgIGEgaGVscGVyIGNsYXNzIHRoYXQgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGNvcGllZCBvYmplY3RzCi0JICogICAgICAgICAgICBhbmQgdGhlaXIgYXNzb2NpYXRlZCBjb3BpZXMKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJSGVscGVyIGNvcHlIZWxwZXIpIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgY29weUhlbHBlcik7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVzdWx0IG9mIHRoZSBjb3B5IG9wZXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBjb250YWluaW5nIHRoZSBjb3BpZWQgbWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZG9HZXRSZXN1bHQoKSB7Ci0JCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IHN1cGVyLmRvR2V0UmVzdWx0KCk7Ci0KLQkJaWYgKGRvbWFpbiBpbnN0YW5jZW9mIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJKChUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGRvbWFpbikuYWRkQ29weUluZm8oCi0JCQkJCWNvbGxlY3Rpb24sIGNvcHlIZWxwZXIpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbGxlY3Rpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2NvbW1hbmQvTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWEzMjE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2NvbW1hbmQvTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuSW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBBIGNvbW1hbmQgdGhhdCB0YWtlcyBhbiB1bmluaXRpYWxpemVkIGNvcHkgb2YgYSBtZXRob2QgZWxlbWVudCBhbmQgc2V0cyBhIG5ldwotICogR1VJRC4gSWYgdGhlIG9yaWdpbmFsIGVsZW1lbnQgaXMgYSA8Y29kZT5Db250ZW50RWxlbWVudDwvY29kZT4gd2l0aCBhIHZhbGlkCi0gKiA8Y29kZT5Db250ZW50RGVzY3JpcHRpb248L2NvZGU+LCBhIGNvcHkgb2YgdGhlCi0gKiA8Y29kZT5Db250ZW50RGVzY3JpcHRpb248L2NvZGU+IGlzIGFsc28gY3JlYXRlZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQgZXh0ZW5kcyBJbml0aWFsaXplQ29weUNvbW1hbmQgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogICAgICAgICAgICB0aGUgZWRpdGluZyBkb21haW4KLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgYmVpbmcgY29waWVkCi0JICogQHBhcmFtIGNvcHlIZWxwZXIKLQkgKiAgICAgICAgICAgIGEgaGVscGVyIGNsYXNzIHRoYXQgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGNvcGllZCBvYmplY3RzCi0JICogICAgICAgICAgICBhbmQgdGhlaXIgYXNzb2NpYXRlZCBjb3BpZXMKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBjb3B5SGVscGVyKSB7Ci0JCXN1cGVyKGRvbWFpbiwgb3duZXIsIGNvcHlIZWxwZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Jbml0aWFsaXplQ29weUNvbW1hbmQjZG9FeGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCXN1cGVyLmRvRXhlY3V0ZSgpOwotCi0JCS8vIGdlbmVyYXRlIG5ldyBHVUlEIGZvciB0aGUgY29weQotCQkvLwotCQlpZiAoY29weSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9ICgoTWV0aG9kRWxlbWVudCkgY29weSk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJCUVPYmplY3QgZUNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOwotCQkJCWlmIChlQ29udGFpbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQllLnNldEd1aWQoVW1hVXRpbC5nZW5lcmF0ZUdVSUQoKChNZXRob2RFbGVtZW50KSBlQ29udGFpbmVyKQotCQkJCQkJCS5nZXRHdWlkKCkpKTsKLQkJCQl9IGVsc2UgewotCQkJCQllLnNldEd1aWQoVW1hVXRpbC5nZW5lcmF0ZUdVSUQoKSk7Ci0JCQkJCVVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkubG9nKCJNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOiBlQ29udGFpbmVyIG5vdCBpbml0aWFsaXplZCBmb3IgIiArIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQllLnNldEd1aWQoVW1hVXRpbC5nZW5lcmF0ZUdVSUQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJdGVyYXRlcyBvdmVyIHRoZSByZWZlcmVuY2VzIG9mIHRoZSBvd25lciBvYmplY3QgYW5kIHNldHMgdGhlbQotCSAqIGFjY29yZGluZ2x5IGluIHRoZSBjb3B5LiBJbmNsdWRlcyBjb3Bpbmcgb2Ygb3Bwb3NpdGUgZmVhdHVyZXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvQ29weVJlZmVyZW5jZXMoKSB7Ci0JCWlmIChvd25lciBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJc3VwZXIuY29weVJlZmVyZW5jZXMoKTsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIHJlZmVyZW5jZXMgPSBnZXRSZWZlcmVuY2VzVG9Db3B5KCkuaXRlcmF0b3IoKTsgcmVmZXJlbmNlcwotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlFUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChFUmVmZXJlbmNlKSByZWZlcmVuY2VzLm5leHQoKTsKLQkJCWlmICghcmVmZXJlbmNlLmlzQ2hhbmdlYWJsZSgpIHx8IHJlZmVyZW5jZS5pc0Rlcml2ZWQoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlFUmVmZXJlbmNlIHJldmVyc2VSZWZlcmVuY2UgPSByZWZlcmVuY2UuZ2V0RU9wcG9zaXRlKCk7Ci0KLQkJCU9iamVjdCB2YWx1ZSA9IG93bmVyLmVHZXQocmVmZXJlbmNlKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSBPcHBvc2l0ZUZlYXR1cmUKLQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZShyZWZlcmVuY2UpOwotCQkJYm9vbGVhbiBjb3BpZWRUYXJnZXRSZXF1aXJlZCA9IHJldmVyc2VSZWZlcmVuY2UgIT0gbnVsbAotCQkJCQl8fCByZWZlcmVuY2UuaXNDb250YWlubWVudCgpCi0JCQkJCXx8IChvcHBvc2l0ZUZlYXR1cmUgIT0gbnVsbCAmJiAhb3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKTsKLQkJCS8vICJtYW55IiBvcHBvc2l0ZSBmZWF0dXJlIGRvZXMgbm90IHJlcXVpcmUgY29waWVkIHRhcmdldCwgaXQgaXMKLQkJCS8vIHRyZWF0ZWQgYXMgYSByZWd1bGFyIG5vbi1jb250YWlubWVudCByZWZlcmVuY2UKLQkJCS8vIFRPRE86IGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyBhcmUgbm90IGF1dG9tYXRpY2FsbHkgY29waWVkIGluCi0JCQkvLyBFTUYgaW1wbGVtZW50YXRpb24KLQkJCWlmIChyZWZlcmVuY2UuaXNNYW55KCkpIHsKLQkJCQlMaXN0IHZhbHVlTGlzdCA9IChMaXN0KSB2YWx1ZTsKLQkJCQlpZiAoIXZhbHVlTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJRUxpc3QgY29weUxpc3QgPSAoRUxpc3QpIGNvcHkuZUdldChyZWZlcmVuY2UpOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlmb3IgKEl0ZXJhdG9yIHZhbHVlSXRlciA9IHZhbHVlTGlzdC5pdGVyYXRvcigpOyB2YWx1ZUl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOyArK2luZGV4KSB7Ci0JCQkJCQlFT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0JCQkJCQl0cnkgewotCQkJCQkJCW9iamVjdCA9IChFT2JqZWN0KSB2YWx1ZUl0ZXIubmV4dCgpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlVbWFFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCX0KLQkJCQkJCUVPYmplY3QgdGFyZ2V0ID0gY29weUhlbHBlci5nZXRDb3B5VGFyZ2V0KG9iamVjdCwKLQkJCQkJCQkJY29waWVkVGFyZ2V0UmVxdWlyZWQpOwotCQkJCQkJaWYgKHRhcmdldCA9PSBudWxsKQotCQkJCQkJCWJyZWFrOyAvLyBpZiBvbmUgaXMgbnVsbCwgdGhleSdsbCBhbGwgYmUgbnVsbAotCQkJCQkJaWYgKHJldmVyc2VSZWZlcmVuY2UgIT0gbnVsbCkgewotCQkJCQkJCWludCBwb3NpdGlvbiA9IGNvcHlMaXN0LmluZGV4T2YodGFyZ2V0KTsKLQkJCQkJCQlpZiAocG9zaXRpb24gPT0gLTEpIHsKLQkJCQkJCQkJY29weUxpc3QuYWRkKGluZGV4LCB0YXJnZXQpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWNvcHlMaXN0Lm1vdmUoaW5kZXgsIHRhcmdldCk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljb3B5TGlzdC5hZGQodGFyZ2V0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJRU9iamVjdCB0YXJnZXQgPSBjb3B5SGVscGVyLmdldENvcHlUYXJnZXQoKEVPYmplY3QpIHZhbHVlLAotCQkJCQkJY29waWVkVGFyZ2V0UmVxdWlyZWQpOwotCQkJCWlmICh0YXJnZXQgIT0gbnVsbCkgewotCQkJCQljb3B5LmVTZXQocmVmZXJlbmNlLCB0YXJnZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlSZWZlcmVuY2VzKCkgewotCQlkb0NvcHlSZWZlcmVuY2VzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9jb21tYW5kL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2NvbW1hbmQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDFlYjhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2NvbW1hbmQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgY29tbWFuZHMgZm9yIGNvcHlpbmcgdGhlIFVNQSBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2RvbWFpbi9UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2RvbWFpbi9UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMzZWM2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9kb21haW4vVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogQSB0cmFjZWFibGUgYWRhcHRlciBmYWN0b3J5IGVkaXRpbmcgZG9tYWluIHVzZWQgZm9yIGNvcHlpbmcgbWV0aG9kIGVsZW1lbnRzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGV4dGVuZHMKLQkJQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIHsKLQotCS8vIE1hcHMgY29waWVkIG1ldGhvZCBlbGVtZW50cyB0byB0aGVpciBvcmlnaW5hbCBjb3VudGVycGFydHMuCi0JLy8gTm90ZTogQ29waWVkIGVsZW1lbnRzIGFyZSBjb3BpZXMgb2YgdGhlIGNsaXBib2FyZCBjb3BpZXMuCi0JcHJpdmF0ZSBIYXNoTWFwIGNvcHlUb09yaWdpbmFsTWFwID0gbnVsbDsKLQotCS8vIE1hcHMgb3JpZ2luYWwgZWxlbWVudHMgdG8gdGhlaXIgY2xpcGJvYXJkIGNvcGllcy4KLQlwcml2YXRlIE1hcCBvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwID0gbnVsbDsKLQkKLQlwcml2YXRlIE1hcDxFT2JqZWN0LCBFT2JqZWN0PiBjbGlwYm9hcmRUb09yaWdpbmFsTWFwOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFuIGFkYXB0ZXIgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgYWRhcHRlciB0byB3aGljaCBjYWxscwotCSAqICAgICAgICAgICAgYXJlIGRlbGVnYXRlZAotCSAqIEBwYXJhbSBjb21tYW5kU3RhY2sKLQkgKiAgICAgICAgICAgIGEgY29tbWFuZCBzdGFjawotCSAqLwotCXB1YmxpYyBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjb21tYW5kU3RhY2spOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBhbiBhZGFwdGVyIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgdG8gd2hpY2ggY2FsbHMKLQkgKiAgICAgICAgICAgIGFyZSBkZWxlZ2F0ZWQKLQkgKiBAcGFyYW0gY29tbWFuZFN0YWNrCi0JICogICAgICAgICAgICBhIGNvbW1hbmQgc3RhY2sKLQkgKiBAcGFyYW0gcmVzb3VyY2VUb1JlYWRPbmx5TWFwCi0JICogICAgICAgICAgICBjb250cm9scyB3aGV0aGVyIHRoZSBkb21haW4gaXMgcmVhZCBvbmx5Ci0JICovCi0JcHVibGljIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIE1hcCByZXNvdXJjZVRvUmVhZE9ubHlNYXApIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjaywgcmVzb3VyY2VUb1JlYWRPbmx5TWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqICAgICAgICAgICAgYW4gYWRhcHRlciBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSBhZGFwdGVyIHRvIHdoaWNoIGNhbGxzCi0JICogICAgICAgICAgICBhcmUgZGVsZWdhdGVkCi0JICogQHBhcmFtIGNvbW1hbmRTdGFjawotCSAqICAgICAgICAgICAgYSBjb21tYW5kIHN0YWNrCi0JICogQHBhcmFtIHJlc291cmNlU2V0Ci0JICogICAgICAgICAgICBhIHJlc291cmNlIHNldAotCSAqLwotCXB1YmxpYyBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrLCByZXNvdXJjZVNldCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG1hcCBjb250YWluaW5nIHRoZSBjb3BpZWQgZWxlbWVudHMgbWFwcGVkIHRvIHRoZWlyIG9yaWdpbmFsCi0JICogY291bnRlcnBhcnRzLgotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgY29udGFpbmluZyB0aGUgY29waWVkIGVsZW1lbnRzIG1hcHBlZCB0byB0aGVpciBvcmlnaW5hbAotCSAqICAgICAgICAgY291bnRlcnBhcnRzCi0JICovCi0JcHVibGljIE1hcCBnZXRDb3B5VG9PcmlnaW5hbE1hcCgpIHsKLQkJaWYgKGNvcHlUb09yaWdpbmFsTWFwID09IG51bGwpIHsKLQkJCWNvcHlUb09yaWdpbmFsTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlyZXR1cm4gY29weVRvT3JpZ2luYWxNYXA7Ci0JfQotCQotCQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgZWxlbWVudHMgbWFwcGVkIHRvIHRoZWlyIGNvcGllZCAKLQkgKiBjb3VudGVycGFydHMgb24gY2xpcGJvYXJkCi0JICogCi0JICogQHJldHVybiBhIG1hcCBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBlbGVtZW50cyBtYXBwZWQgdG8gdGhlaXIgY29waWVkIAotCSAqICAgICAgICAgY291bnRlcnBhcnRzCi0JICovCi0JcHVibGljIE1hcCBnZXRPcmlnaW5hbFRvQ2xpcGJvYXJkTWFwKCkgewotCQlpZiAob3JpZ2luYWxUb0NsaXBib2FyZE1hcCA9PSBudWxsKSB7Ci0JCQlvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlyZXR1cm4gb3JpZ2luYWxUb0NsaXBib2FyZE1hcDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGJ5IHRoZSBDcmVhdGVDb3B5Q29tbWFuZC4gQWRkcyBpbmZvbWF0aW9uIHRvIGNvbnN0cnVjdCBtYXBzIHRoYXQKLQkgKiBrZWVwIHRyYWNrIG9mIHRoZSBvcmlnaW5hbCBtZXRob2QgZWxlbWVudHMgYW5kIHRoZWlyIGNvcGllcy4KLQkgKiAKLQkgKiBAcGFyYW0gYwotCSAqICAgICAgICAgICAgYSBjb2xsZWN0aW9uIHRvIHN0b3JlIHRoZSBtYXBwaW5nIGluZm8KLQkgKiBAcGFyYW0gY29weUhlbHBlcgotCSAqICAgICAgICAgICAgYSBoZWxwZXIgY2xhc3MgdGhhdCBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgY29waWVkIG9iamVjdHMKLQkgKiAgICAgICAgICAgIGFuZCB0aGVpciBhc3NvY2lhdGVkIGNvcGllcwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvcHlJbmZvKENvbGxlY3Rpb24gYywgSGVscGVyIGNvcHlIZWxwZXIpIHsKLQkJaWYgKGlzTmV3Q29weShjLCBjb3B5SGVscGVyKSkgewotCQkJYWRkTmV3Q29weShjLCBjb3B5SGVscGVyKTsKLQkJCXJldHVybjsKLQkJfSBlbHNlIHsKLQkJCWNoYWluQ29weShjLCBjb3B5SGVscGVyKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgZWxlbWVudCB0aGF0IGlzIGJlaW5nIGNvcGllZCB0byB0aGUgY2xpcGJvYXJkLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGROZXdDb3B5KENvbGxlY3Rpb24gYywgSGVscGVyIGNvcHlIZWxwZXIpIHsKLQkJLy8gdGhpcyBtZWFucyB3ZSBhcmUgY29weWluZyB0aGUgQ29sbGVjdGlvbiBjIHRvIHRoZSBjbGlwYm9hcmQKLQkJaWYgKG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgPT0gbnVsbCkKLQkJCW9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlpZihjbGlwYm9hcmRUb09yaWdpbmFsTWFwID09IG51bGwpIHsKLQkJCWNsaXBib2FyZFRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcDxFT2JqZWN0LCBFT2JqZWN0PigpOwotCQl9Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBjb3B5SGVscGVyLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJRU9iamVjdCBrZXkgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlFT2JqZWN0IHZhbHVlID0gKEVPYmplY3QpIGNvcHlIZWxwZXIuZ2V0KGtleSk7Ci0JCQlvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwLnB1dChrZXksIHZhbHVlKTsKLQkJCWNsaXBib2FyZFRvT3JpZ2luYWxNYXAucHV0KHZhbHVlLCBrZXkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG1hcCBmcm9tIHRoZSBjb3BpZWQgZWxlbWVudHMgdG8gdGhlaXIgb3JpZ2luYWwgY291bnRlcnBhcnRzLgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFpbkNvcHkoQ29sbGVjdGlvbiBjLCBIZWxwZXIgY29weUhlbHBlcikgewotCQkvLyBjaGFpbiB0aGUgbWFwcyAtIGNoYW5nZSB0aGUgY29weVRvT3JpZ2luYWxNYXAKLQkJaWYgKG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgIT0gbnVsbCkgewotCQkJaWYgKGNvcHlUb09yaWdpbmFsTWFwID09IG51bGwpCi0JCQkJY29weVRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJSXRlcmF0b3IgaXRlciA9IG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvMkNLZXkgPSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3QgbzJDVmFsdWUgPSBvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwLmdldChvMkNLZXkpOwotCQkJCU9iamVjdCBjb3B5VmFsdWUgPSBjb3B5SGVscGVyLmdldChvMkNWYWx1ZSk7Ci0JCQkJaWYgKGNvcHlWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCS8vIGVycm9yCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAobzJDS2V5IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkKLQkJCQkJY29weVRvT3JpZ2luYWxNYXAucHV0KGNvcHlWYWx1ZSwgbzJDS2V5KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc05ld0NvcHkoQ29sbGVjdGlvbiBjLCBIZWxwZXIgY29weUhlbHBlcikgewotCQkvLyBvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwIHdhcyBzZXQgdG8gbnVsbCBhdCBzdGFydCBvZiBjb3B5IGNvbW1hbmQKLQkJaWYgKG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8vIGl0ZXJhdGUgdGhyb3VnaCBjb3B5SGVscGVyIG1hcCwgc2VlIGlmIGFueSBjb3B5SGVscGVyIGtleXMgYXJlIG8yQwotCQkvLyB2YWx1ZXMsIHdoaWNoIG1lYW5zIHdlIGFyZSBjb3B5aW5nIGNsaXBib2FyZAotCQlJdGVyYXRvciBpdGVyID0gY29weUhlbHBlci5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBjbGlwS2V5ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIW9yaWdpbmFsVG9DbGlwYm9hcmRNYXAuY29udGFpbnNWYWx1ZShjbGlwS2V5KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgY29weSBtYXBzLiBJdCBzaG91bGQgYmUgY2FsbGVkIHdpdGhpbiB0aGUgY29weSBhY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXRDb3B5TWFwcygpIHsKLQkJaWYgKG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgIT0gbnVsbCkgewotCQkJb3JpZ2luYWxUb0NsaXBib2FyZE1hcC5jbGVhcigpOwotCQkJb3JpZ2luYWxUb0NsaXBib2FyZE1hcCA9IG51bGw7Ci0JCX0KLQkJaWYoY2xpcGJvYXJkVG9PcmlnaW5hbE1hcCAhPSBudWxsKSB7Ci0JCQljbGlwYm9hcmRUb09yaWdpbmFsTWFwLmNsZWFyKCk7Ci0JCQljbGlwYm9hcmRUb09yaWdpbmFsTWFwID0gbnVsbDsKLQkJfQotCQlpZiAoY29weVRvT3JpZ2luYWxNYXAgIT0gbnVsbCkgewotCQkJY29weVRvT3JpZ2luYWxNYXAuY2xlYXIoKTsKLQkJCWNvcHlUb09yaWdpbmFsTWFwID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBNYXA8RU9iamVjdCwgRU9iamVjdD4gZ2V0Q2xpcGJvYXJkVG9PcmlnaW5hbE1hcCgpIHsKLQkJcmV0dXJuIGNsaXBib2FyZFRvT3JpZ2luYWxNYXA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvZG9tYWluL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2RvbWFpbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOWVhNzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvZG9tYWluL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBkZWZhdWx0IGVkaXRpbmcgZG9tYWluIGZvciB0aGUgVU1BIG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FjdGl2aXR5RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMmFhMTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FjdGl2aXR5RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUHVycG9zZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQWx0ZXJuYXRpdmVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRIb3d0b1N0YWZmUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQdXJwb3NlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHVycG9zZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSIsICJfVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFsdGVybmF0aXZlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFsdGVybmF0aXZlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUiLCAiX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEhvd3RvIFN0YWZmIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSG93dG9TdGFmZlByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2hvd3RvU3RhZmZfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2hvd3RvU3RhZmZfZmVhdHVyZSIsICJfVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBBY3Rpdml0eURlc2NyaXB0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0FjdGl2aXR5RGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQWN0aXZpdHlEZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBY3Rpdml0eURlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNDc5NGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEZ1bGZpbGxzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRWYXJpYWJpbGl0eVR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEJyZWFrZG93bkVsZW1lbnRzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSb2FkbWFwc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRnVsZmlsbHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGdWxmaWxsc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9GdWxmaWxsYWJsZUVsZW1lbnRfZnVsZmlsbHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9GdWxmaWxsYWJsZUVsZW1lbnRfZnVsZmlsbHNfZmVhdHVyZSIsICJfVUlfRnVsZmlsbGFibGVFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFyaWFiaWxpdHlUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eVR5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUiLCAiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudF9mZWF0dXJlIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTik7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJyZWFrZG93bkVsZW1lbnRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0FjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfZmVhdHVyZSIsICJfVUlfQWN0aXZpdHlfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTLCB0cnVlLAotCQkJCQkJZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUm9hZG1hcHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSb2FkbWFwc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eV9yb2FkbWFwc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0FjdGl2aXR5X3JvYWRtYXBzX2ZlYXR1cmUiLCAiX1VJX0FjdGl2aXR5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX1JPQURNQVBTLCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQWN0aXZpdHkuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQWN0aXZpdHkiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQWN0aXZpdHkpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0FjdGl2aXR5X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBY3Rpdml0eS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04KLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGMwMDJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm99IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ2xhc3NpZmllckl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElzUHJpbWFyeUV4dGVuc2lvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgUHJpbWFyeSBFeHRlbnNpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc1ByaW1hcnlFeHRlbnNpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQXBwbGljYWJsZU1ldGFDbGFzc0luZm9faXNQcmltYXJ5RXh0ZW5zaW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXBwbGljYWJsZU1ldGFDbGFzc0luZm9faXNQcmltYXJ5RXh0ZW5zaW9uX2ZlYXR1cmUiLCAiX1VJX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19fSVNfUFJJTUFSWV9FWFRFTlNJT046Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BcnRpZmFjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZjYzYjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcnRpZmFjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEJyaWVmT3V0bGluZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmVwcmVzZW50YXRpb25PcHRpb25zUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSZXByZXNlbnRhdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTm90YXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEJyaWVmIE91dGxpbmUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRCcmllZk91dGxpbmVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9icmllZk91dGxpbmVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX2JyaWVmT3V0bGluZV9mZWF0dXJlIiwgIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVwcmVzZW50YXRpb24gT3B0aW9ucyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlcHJlc2VudGF0aW9uT3B0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3JlcHJlc2VudGF0aW9uT3B0aW9uc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fcmVwcmVzZW50YXRpb25PcHRpb25zX2ZlYXR1cmUiLCAiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZXByZXNlbnRhdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlcHJlc2VudGF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fcmVwcmVzZW50YXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3JlcHJlc2VudGF0aW9uX2ZlYXR1cmUiLCAiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTm90YXRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX25vdGF0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9ub3RhdGlvbl9mZWF0dXJlIiwgIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05PVEFUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEFydGlmYWN0RGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQXJ0aWZhY3REZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChBcnRpZmFjdERlc2NyaXB0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORToKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TOgotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OOgotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05PVEFUSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BcnRpZmFjdEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FydGlmYWN0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNmNkODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FydGlmYWN0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEl0ZW1Qcm92aWRlciBleHRlbmRzIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3RJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQXJ0aWZhY3QuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQXJ0aWZhY3QiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQXJ0aWZhY3QpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQXJ0aWZhY3RfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0FydGlmYWN0X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBcnRpZmFjdC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXJ0aWZhY3QoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiNTJlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVXNhZ2VHdWlkYW5jZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVXNhZ2UgR3VpZGFuY2UgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRVc2FnZUd1aWRhbmNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl91c2FnZUd1aWRhbmNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3VzYWdlR3VpZGFuY2VfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYmM5MjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIFByb2Nlc3NFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRQcmVmaXhQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZElzUGxhbm5lZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSGFzTXVsdGlwbGVPY2N1cnJlbmNlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSXNPcHRpb25hbFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUHJlc2VudGVkQWZ0ZXJQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFByZXNlbnRlZEJlZm9yZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3VwZXJBY3Rpdml0aWVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDaGVja2xpc3RzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDb25jZXB0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRXhhbXBsZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEd1aWRlbGluZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJldXNhYmxlQXNzZXRzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRUZW1wbGF0ZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlcG9ydHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEVzdGltYXRpb25jb25zaWRlcmF0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVG9vbG1lbnRvclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJlZml4IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJlZml4UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlZml4X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudF9wcmVmaXhfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVgsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgUGxhbm5lZCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElzUGxhbm5lZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X2lzUGxhbm5lZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNQbGFubmVkX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBIYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRIYXNNdWx0aXBsZU9jY3VycmVuY2VzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfaGFzTXVsdGlwbGVPY2N1cnJlbmNlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfaGFzTXVsdGlwbGVPY2N1cnJlbmNlc19mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJcyBPcHRpb25hbCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElzT3B0aW9uYWxQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF9pc09wdGlvbmFsX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudF9pc09wdGlvbmFsX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJlc2VudGVkIEFmdGVyIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJlc2VudGVkQWZ0ZXJQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRBZnRlcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQWZ0ZXJfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVIsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcmVzZW50ZWQgQmVmb3JlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJlc2VudGVkQmVmb3JlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQmVmb3JlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRCZWZvcmVfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3VwZXIgQWN0aXZpdGllcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1cGVyQWN0aXZpdGllc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X3N1cGVyQWN0aXZpdGllc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfc3VwZXJBY3Rpdml0aWVzX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENoZWNrbGlzdHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGVja2xpc3RzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfY2hlY2tsaXN0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfY2hlY2tsaXN0c19mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb25jZXB0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbmNlcHRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfY29uY2VwdHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X2NvbmNlcHRzX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVFMsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFeGFtcGxlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEV4YW1wbGVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfZXhhbXBsZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X2V4YW1wbGVzX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRVMsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBHdWlkZWxpbmVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkR3VpZGVsaW5lc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X2d1aWRlbGluZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X2d1aWRlbGluZXNfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkVTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmV1c2FibGUgQXNzZXRzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmV1c2FibGVBc3NldHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF9yZXVzYWJsZUFzc2V0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfcmV1c2FibGVBc3NldHNfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdXBwb3J0aW5nIE1hdGVyaWFscyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1cHBvcnRpbmdNYXRlcmlhbHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudF9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUZW1wbGF0ZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUZW1wbGF0ZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF90ZW1wbGF0ZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3RlbXBsYXRlc19mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1RFTVBMQVRFUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlcG9ydHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXBvcnRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfcmVwb3J0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfcmVwb3J0c19mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1JFUE9SVFMsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFc3RpbWF0aW9uY29uc2lkZXJhdGlvbnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF9lc3RpbWF0aW9uY29uc2lkZXJhdGlvbnNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X2VzdGltYXRpb25jb25zaWRlcmF0aW9uc19mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRvb2xtZW50b3IgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb29sbWVudG9yUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfdG9vbG1lbnRvcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdG9vbG1lbnRvcl9mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1RPT0xNRU5UT1IsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChCcmVha2Rvd25FbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEJyZWFrZG93bkVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOgotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOgotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGxhbm5pbmdEYXRhKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjVmMzUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciBleHRlbmRzIFByb2Nlc3NJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDYXBhYmlsaXR5UGF0dGVybi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDYXBhYmlsaXR5UGF0dGVybikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9DYXBhYmlsaXR5UGF0dGVybl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTgotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DaGVja2xpc3RJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DaGVja2xpc3RJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI5MmNhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2hlY2tsaXN0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGVja2xpc3RJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENoZWNrbGlzdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDaGVja2xpc3QuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQ2hlY2tsaXN0IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENoZWNrbGlzdCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9DaGVja2xpc3RfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0NoZWNrbGlzdF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2xhc3NpZmllckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NsYXNzaWZpZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3MjE3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2xhc3NpZmllckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc2lmaWVySXRlbVByb3ZpZGVyIGV4dGVuZHMgVHlwZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENsYXNzaWZpZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSXNBYnN0cmFjdFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgQWJzdHJhY3QgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc0Fic3RyYWN0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NsYXNzaWZpZXJfaXNBYnN0cmFjdF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NsYXNzaWZpZXJfaXNBYnN0cmFjdF9mZWF0dXJlIiwgIl9VSV9DbGFzc2lmaWVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ0xBU1NJRklFUl9fSVNfQUJTVFJBQ1QsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ2xhc3NpZmllcikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9DbGFzc2lmaWVyX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9DbGFzc2lmaWVyX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDbGFzc2lmaWVyLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuQ0xBU1NJRklFUl9fSVNfQUJTVFJBQ1Q6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZGU4NjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlciBleHRlbmRzIFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRBZ2dyZWdhdGVkUm9sZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFnZ3JlZ2F0ZWQgUm9sZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBZ2dyZWdhdGVkUm9sZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29tcG9zaXRlUm9sZV9hZ2dyZWdhdGVkUm9sZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db21wb3NpdGVSb2xlX2FnZ3JlZ2F0ZWRSb2xlc19mZWF0dXJlIiwgIl9VSV9Db21wb3NpdGVSb2xlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDb21wb3NpdGVSb2xlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0NvbXBvc2l0ZVJvbGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ29tcG9zaXRlUm9sZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Db21wb3NpdGVSb2xlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Db21wb3NpdGVSb2xlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db25jZXB0SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29uY2VwdEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzQxODNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db25jZXB0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbmNlcHRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbmNlcHRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ29uY2VwdC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Db25jZXB0IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENvbmNlcHQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ29uY2VwdF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ29uY2VwdF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnN0cmFpbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE1MGIyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zdHJhaW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQm9keVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQm9keSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJvZHlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29uc3RyYWludF9ib2R5X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29uc3RyYWludF9ib2R5X2ZlYXR1cmUiLCAiX1VJX0NvbnN0cmFpbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05TVFJBSU5UX19CT0RZLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENvbnN0cmFpbnQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQ29uc3RyYWludCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDb25zdHJhaW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0NvbnN0cmFpbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0NvbnN0cmFpbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKENvbnN0cmFpbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UX19CT0RZOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg0MGVkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50RWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDb250ZW50Q2F0ZWdvcnkpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ29udGVudENhdGVnb3J5X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50Q2F0ZWdvcnlfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODA1NDkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZFVuaXRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTWFpbkRlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFeHRlcm5hbElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRLZXlDb25zaWRlcmF0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTG9uZ1ByZXNlbnRhdGlvbk5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1haW4gRGVzY3JpcHRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYWluRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudERlc2NyaXB0aW9uX21haW5EZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9tYWluRGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFeHRlcm5hbCBJZCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEV4dGVybmFsSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudERlc2NyaXB0aW9uX2V4dGVybmFsSWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlIiwgIl9VSV9Db250ZW50RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBLZXkgQ29uc2lkZXJhdGlvbnMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRLZXlDb25zaWRlcmF0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RGVzY3JpcHRpb25fa2V5Q29uc2lkZXJhdGlvbnNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RGVzY3JpcHRpb25fa2V5Q29uc2lkZXJhdGlvbnNfZmVhdHVyZSIsICJfVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExvbmcgUHJlc2VudGF0aW9uIE5hbWUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMb25nUHJlc2VudGF0aW9uTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RGVzY3JpcHRpb25fbG9uZ1ByZXNlbnRhdGlvbk5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RGVzY3JpcHRpb25fbG9uZ1ByZXNlbnRhdGlvbk5hbWVfZmVhdHVyZSIsICJfVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDb250ZW50RGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQ29udGVudERlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENvbnRlbnREZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Db250ZW50RGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnREZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ29udGVudERlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOgotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlY3Rpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3RlcCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnRlbnRFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQxMDg1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIERlc2NyaWJhYmxlRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnRFbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFZhcmlhYmlsaXR5VHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3VwcG9ydGluZ01hdGVyaWFsc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ29uY2VwdHNBbmRQYXBlcnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENoZWNrbGlzdHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEd1aWRlbGluZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEV4YW1wbGVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRBc3NldHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFRlcm1kZWZpbml0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFyaWFiaWxpdHlUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eVR5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUiLCAiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudF9mZWF0dXJlIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29uY2VwdHMgQW5kIFBhcGVycyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbmNlcHRzQW5kUGFwZXJzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnRFbGVtZW50X2NvbmNlcHRzQW5kUGFwZXJzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29udGVudEVsZW1lbnRfY29uY2VwdHNBbmRQYXBlcnNfZmVhdHVyZSIsICJfVUlfQ29udGVudEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX0NPTkNFUFRTX0FORF9QQVBFUlMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDaGVja2xpc3RzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hlY2tsaXN0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RWxlbWVudF9jaGVja2xpc3RzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29udGVudEVsZW1lbnRfY2hlY2tsaXN0c19mZWF0dXJlIiwgIl9VSV9Db250ZW50RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEd1aWRlbGluZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRHdWlkZWxpbmVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnRFbGVtZW50X2d1aWRlbGluZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RWxlbWVudF9ndWlkZWxpbmVzX2ZlYXR1cmUiLCAiX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTLCB0cnVlLAotCQkJCQkJZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXhhbXBsZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeGFtcGxlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RWxlbWVudF9leGFtcGxlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbnRlbnRFbGVtZW50X2V4YW1wbGVzX2ZlYXR1cmUiLCAiX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFzc2V0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFzc2V0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RWxlbWVudF9hc3NldHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RWxlbWVudF9hc3NldHNfZmVhdHVyZSIsICJfVUlfQ29udGVudEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX0FTU0VUUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRlcm1kZWZpbml0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGVybWRlZmluaXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudEVsZW1lbnRfdGVybWRlZmluaXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RWxlbWVudF90ZXJtZGVmaW5pdGlvbl9mZWF0dXJlIiwgIl9VSV9Db250ZW50RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fVEVSTURFRklOSVRJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdXBwb3J0aW5nIE1hdGVyaWFscyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1cHBvcnRpbmdNYXRlcmlhbHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudEVsZW1lbnRfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbnRlbnRFbGVtZW50X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSIsICJfVUlfQ29udGVudEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ29udGVudEVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ29udGVudEVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDb250ZW50RWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWRhM2RkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXRob2RQYWNrYWdlSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENvbnRlbnRQYWNrYWdlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0NvbnRlbnRQYWNrYWdlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENvbnRlbnRQYWNrYWdlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0NvbnRlbnRQYWNrYWdlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50UGFja2FnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ29udGVudFBhY2thZ2UuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlS2luZCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25jZXB0KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDaGVja2xpc3QoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUd1aWRlbGluZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXhhbXBsZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmV1c2FibGVBc3NldCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVybURlZmluaXRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcnRpZmFjdCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVwb3J0KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZW1wbGF0ZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVG9vbE1lbnRvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyYWJsZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3V0Y29tZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2hpdGVwYXBlcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFzaygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZVNldCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRG9tYWluKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdFR5cGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzY2lwbGluZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9hZG1hcCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVG9vbCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZVNldEdyb3VwaW5nKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDdXN0b21DYXRlZ29yeSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJhY3RpY2UoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MGIxZTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRWxlbWVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VfZWxlbWVudF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSIsICJfVUlfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVCwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENvcmVTZW1hbnRpY01vZGVsQnJpZGdlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDQ0NmZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnl9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQ2F0ZWdvcml6ZWRFbGVtZW50c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3ViQ2F0ZWdvcmllc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ2F0ZWdvcml6ZWQgRWxlbWVudHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDYXRlZ29yaXplZEVsZW1lbnRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0N1c3RvbUNhdGVnb3J5X2NhdGVnb3JpemVkRWxlbWVudHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9DdXN0b21DYXRlZ29yeV9jYXRlZ29yaXplZEVsZW1lbnRzX2ZlYXR1cmUiLCAiX1VJX0N1c3RvbUNhdGVnb3J5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFN1YiBDYXRlZ29yaWVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3ViQ2F0ZWdvcmllc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9DdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19mZWF0dXJlIiwgIl9VSV9DdXN0b21DYXRlZ29yeV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JJRVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDdXN0b21DYXRlZ29yeS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yeSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDdXN0b21DYXRlZ29yeSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9DdXN0b21DYXRlZ29yeV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tQ2F0ZWdvcnlfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MjRhMGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcmFibGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEV4dGVybmFsRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFBhY2thZ2luZ0d1aWRhbmNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFeHRlcm5hbCBEZXNjcmlwdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEV4dGVybmFsRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl9leHRlcm5hbERlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl9leHRlcm5hbERlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUGFja2FnaW5nIEd1aWRhbmNlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFja2FnaW5nR3VpZGFuY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl9wYWNrYWdpbmdHdWlkYW5jZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fcGFja2FnaW5nR3VpZGFuY2VfZmVhdHVyZSIsICJfVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0UsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9EZWxpdmVyYWJsZURlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0U6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcmFibGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiMThlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcmFibGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyYWJsZUl0ZW1Qcm92aWRlciBleHRlbmRzIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcmFibGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRGVsaXZlcmVkV29ya1Byb2R1Y3RzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZWxpdmVyZWQgV29yayBQcm9kdWN0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlbGl2ZXJlZFdvcmtQcm9kdWN0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EZWxpdmVyYWJsZV9kZWxpdmVyZWRXb3JrUHJvZHVjdHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZWxpdmVyYWJsZV9kZWxpdmVyZWRXb3JrUHJvZHVjdHNfZmVhdHVyZSIsICJfVUlfRGVsaXZlcmFibGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEZWxpdmVyYWJsZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9EZWxpdmVyYWJsZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEZWxpdmVyYWJsZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EZWxpdmVyYWJsZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcmFibGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjNzBhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFNjYWxlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSaXNrTGV2ZWxQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEVzdGltYXRpbmdUZWNobmlxdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFByb2plY3RNZW1iZXJFeHBlcnRpc2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFR5cGVPZkNvbnRyYWN0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTY2FsZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNjYWxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3NjYWxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fc2NhbGVfZmVhdHVyZSIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcm9qZWN0IENoYXJhY3RlcmlzdGljcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFByb2plY3RDaGFyYWN0ZXJpc3RpY3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdENoYXJhY3RlcmlzdGljc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RDaGFyYWN0ZXJpc3RpY3NfZmVhdHVyZSIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSaXNrIExldmVsIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmlza0xldmVsUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Jpc2tMZXZlbF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Jpc2tMZXZlbF9mZWF0dXJlIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXN0aW1hdGluZyBUZWNobmlxdWUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFc3RpbWF0aW5nVGVjaG5pcXVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX2VzdGltYXRpbmdUZWNobmlxdWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9lc3RpbWF0aW5nVGVjaG5pcXVlX2ZlYXR1cmUiLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvamVjdE1lbWJlckV4cGVydGlzZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdE1lbWJlckV4cGVydGlzZV9mZWF0dXJlIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUeXBlIE9mIENvbnRyYWN0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHlwZU9mQ29udHJhY3RQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZU9mQ29udHJhY3RfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlT2ZDb250cmFjdF9mZWF0dXJlIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1QsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFOgotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1M6Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMOgotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0U6Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJmODhkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQcm9jZXNzSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEVkdWNhdGlvbk1hdGVyaWFsc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ29tbXVuaWNhdGlvbnNNYXRlcmlhbHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEVkdWNhdGlvbiBNYXRlcmlhbHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFZHVjYXRpb25NYXRlcmlhbHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzX2VkdWNhdGlvbk1hdGVyaWFsc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc19lZHVjYXRpb25NYXRlcmlhbHNfZmVhdHVyZSIsICJfVUlfRGVsaXZlcnlQcm9jZXNzX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvbW11bmljYXRpb25zIE1hdGVyaWFscyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbW11bmljYXRpb25zTWF0ZXJpYWxzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc19jb21tdW5pY2F0aW9uc01hdGVyaWFsc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc19jb21tdW5pY2F0aW9uc01hdGVyaWFsc19mZWF0dXJlIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEZWxpdmVyeVByb2Nlc3MuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERlbGl2ZXJ5UHJvY2Vzcykgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3NfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbjw/PiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rlc2NyaWJhYmxlRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rlc2NyaWJhYmxlRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDQxNWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaWJhYmxlRWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSXNBYnN0cmFjdFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU2hhcGVpY29uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGROb2RlaWNvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgQWJzdHJhY3QgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc0Fic3RyYWN0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NsYXNzaWZpZXJfaXNBYnN0cmFjdF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NsYXNzaWZpZXJfaXNBYnN0cmFjdF9mZWF0dXJlIiwgIl9VSV9DbGFzc2lmaWVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ0xBU1NJRklFUl9fSVNfQUJTVFJBQ1QsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2hhcGVpY29uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2hhcGVpY29uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9zaGFwZWljb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZXNjcmliYWJsZUVsZW1lbnRfc2hhcGVpY29uX2ZlYXR1cmUiLCAiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOb2RlaWNvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vZGVpY29uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9ub2RlaWNvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9ub2RlaWNvbl9mZWF0dXJlIiwgIl9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGVzY3JpYmFibGVFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDoKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50RGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza0Rlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmFjdGljZURlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzE0M2Y0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRSZWZpbmVkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlZmluZWQgRGVzY3JpcHRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWZpbmVkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3JlZmluZWREZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl9yZWZpbmVkRGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEZXNjcmlwdG9yRGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGVzY3JpcHRvckRlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERlc2NyaXB0b3JEZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGVzY3JpcHRvckRlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgxYWFjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2UgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVzY3JpcHRvcl9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZXNjcmlwdG9yX2lzU3luY2hyb25pemVkV2l0aFNvdXJjZV9mZWF0dXJlIiwgIl9VSV9EZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERlc2NyaXB0b3IpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGVzY3JpcHRvcl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGVzY3JpcHRvcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGVzY3JpcHRvci5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlhZ3JhbUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaWFncmFtRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTFmMjFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaWFncmFtRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1FbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElzVmlzaWJsZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmVmZXJlbmNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJcyBWaXNpYmxlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXNWaXNpYmxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1FbGVtZW50X2lzVmlzaWJsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RpYWdyYW1FbGVtZW50X2lzVmlzaWJsZV9mZWF0dXJlIiwgIl9VSV9EaWFncmFtRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRSwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZWZlcmVuY2UgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWZlcmVuY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbUVsZW1lbnRfcmVmZXJlbmNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlhZ3JhbUVsZW1lbnRfcmVmZXJlbmNlX2ZlYXR1cmUiLCAiX1VJX0RpYWdyYW1FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0UsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGlhZ3JhbUVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbUVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1FbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaWFncmFtRWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWSwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9wZXJ0eSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RpYWdyYW1JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaWFncmFtSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiY2RjZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RpYWdyYW1JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUl0ZW1Qcm92aWRlciBleHRlbmRzIEdyYXBoTm9kZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRGlhZ3JhbUxpbmtQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFpvb21Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZpZXdwb2ludFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgWm9vbSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFpvb21Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbV96b29tX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlhZ3JhbV96b29tX2ZlYXR1cmUiLCAiX1VJX0RpYWdyYW1fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19aT09NLCB0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmlld3BvaW50IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmlld3BvaW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1fdmlld3BvaW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlhZ3JhbV92aWV3cG9pbnRfZmVhdHVyZSIsICJfVUlfRGlhZ3JhbV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fX1ZJRVdQT0lOVCwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERpYWdyYW0gTGluayBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERpYWdyYW1MaW5rUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1fZGlhZ3JhbUxpbmtfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaWFncmFtX2RpYWdyYW1MaW5rX2ZlYXR1cmUiLCAiX1VJX0RpYWdyYW1fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19ESUFHUkFNX0xJTkssIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19OQU1FU1BBQ0UpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEaWFncmFtLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0RpYWdyYW0iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGlhZ3JhbSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EaWFncmFtX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9EaWFncmFtX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaWFncmFtLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fWk9PTToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0U6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19OQU1FU1BBQ0UsIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9fTkFNRVNQQUNFLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9fTkFNRVNQQUNFLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbjw/PiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFkKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19MSU5LCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19OQU1FU1BBQ0U7Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlhZ3JhbUxpbmtJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaWFncmFtTGlua0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjU0NjUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaWFncmFtTGlua0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmt9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1MaW5rSXRlbVByb3ZpZGVyIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtTGlua0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRab29tUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRWaWV3cG9ydFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRGlhZ3JhbVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgWm9vbSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFpvb21Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbUxpbmtfem9vbV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RpYWdyYW1MaW5rX3pvb21fZmVhdHVyZSIsICJfVUlfRGlhZ3JhbUxpbmtfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0xJTktfX1pPT00sIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmlld3BvcnQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWaWV3cG9ydFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EaWFncmFtTGlua192aWV3cG9ydF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RpYWdyYW1MaW5rX3ZpZXdwb3J0X2ZlYXR1cmUiLCAiX1VJX0RpYWdyYW1MaW5rX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9MSU5LX19WSUVXUE9SVCwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERpYWdyYW0gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREaWFncmFtUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1MaW5rX2RpYWdyYW1fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaWFncmFtTGlua19kaWFncmFtX2ZlYXR1cmUiLCAiX1VJX0RpYWdyYW1MaW5rX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9MSU5LX19ESUFHUkFNLCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGlhZ3JhbUxpbmsuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGlhZ3JhbUxpbmsiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGlhZ3JhbUxpbmspIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbUxpbmtfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1MaW5rX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaWFncmFtTGluay5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fWk9PTToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGltZW5zaW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGltZW5zaW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkY2Y0NTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RpbWVuc2lvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaW1lbnNpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGltZW5zaW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFdpZHRoUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRIZWlnaHRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdpZHRoIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV2lkdGhQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGltZW5zaW9uX3dpZHRoX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGltZW5zaW9uX3dpZHRoX2ZlYXR1cmUiLCAiX1VJX0RpbWVuc2lvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJTUVOU0lPTl9fV0lEVEgsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSGVpZ2h0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSGVpZ2h0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RpbWVuc2lvbl9oZWlnaHRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaW1lbnNpb25faGVpZ2h0X2ZlYXR1cmUiLCAiX1VJX0RpbWVuc2lvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJTUVOU0lPTl9fSEVJR0hULCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERpbWVuc2lvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9EaW1lbnNpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCURvdWJsZSBsYWJlbFZhbHVlID0gKChEaW1lbnNpb24pIG9iamVjdCkuZ2V0V2lkdGgoKTsKLQkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0RpbWVuc2lvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGltZW5zaW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaW1lbnNpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT05fX1dJRFRIOgotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OX19IRUlHSFQ6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTYxM2JkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmd9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGREaXNjaXBsaW5lc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGlzY2lwbGluZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREaXNjaXBsaW5lc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSIsICJfVUlfRGlzY2lwbGluZUdyb3VwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEaXNjaXBsaW5lR3JvdXBpbmcuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGlzY2lwbGluZUdyb3VwaW5nIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERpc2NpcGxpbmVHcm91cGluZykgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVHcm91cGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI5MjNiOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUl0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVGFza3NQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlZmVyZW5jZVdvcmtmbG93c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGFza3MgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYXNrc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lX3Rhc2tzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlzY2lwbGluZV90YXNrc19mZWF0dXJlIiwgIl9VSV9EaXNjaXBsaW5lX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9fVEFTS1MsIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZWZlcmVuY2UgV29ya2Zsb3dzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVmZXJlbmNlV29ya2Zsb3dzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVfcmVmZXJlbmNlV29ya2Zsb3dzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlzY2lwbGluZV9yZWZlcmVuY2VXb3JrZmxvd3NfZmVhdHVyZSIsICJfVUlfRGlzY2lwbGluZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1MsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGlzY2lwbGluZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9EaXNjaXBsaW5lIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERpc2NpcGxpbmUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGlzY2lwbGluZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQkRJU0NJUExJTkU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc2NpcGxpbmUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Eb21haW5JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Eb21haW5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM4NTE0MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRG9tYWluSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG9tYWluSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFdvcmtQcm9kdWN0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV29yayBQcm9kdWN0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdvcmtQcm9kdWN0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Eb21haW5fd29ya1Byb2R1Y3RzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRG9tYWluX3dvcmtQcm9kdWN0c19mZWF0dXJlIiwgIl9VSV9Eb21haW5fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ET01BSU5fX1dPUktfUFJPRFVDVFMsIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5ET01BSU5fX1NVQkRPTUFJTlMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEb21haW4uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRG9tYWluIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERvbWFpbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Eb21haW5fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0RvbWFpbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRG9tYWluLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19TVUJET01BSU5TOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9NQUlOX19TVUJET01BSU5TLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZURvbWFpbigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0VsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNWI2ZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0VsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0VsZW1lbnRfdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRWxsaXBzZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0VsbGlwc2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhNjg0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRWxsaXBzZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGxpcHNlSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3JhcGhpY1ByaW1pdGl2ZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVsbGlwc2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQ2VudGVyUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSYWRpdXNYUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSYWRpdXNZUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSb3RhdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3RhcnRBbmdsZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRW5kQW5nbGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENlbnRlciBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENlbnRlclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9FbGxpcHNlX2NlbnRlcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0VsbGlwc2VfY2VudGVyX2ZlYXR1cmUiLCAiX1VJX0VsbGlwc2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5FTExJUFNFX19DRU5URVIsIHRydWUsIGZhbHNlLCB0cnVlLAotCQkJCQkJbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSYWRpdXMgWCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJhZGl1c1hQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRWxsaXBzZV9yYWRpdXNYX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWxsaXBzZV9yYWRpdXNYX2ZlYXR1cmUiLCAiX1VJX0VsbGlwc2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5FTExJUFNFX19SQURJVVNfWCwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSYWRpdXMgWSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJhZGl1c1lQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRWxsaXBzZV9yYWRpdXNZX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWxsaXBzZV9yYWRpdXNZX2ZlYXR1cmUiLCAiX1VJX0VsbGlwc2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5FTExJUFNFX19SQURJVVNfWSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSb3RhdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJvdGF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0VsbGlwc2Vfcm90YXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FbGxpcHNlX3JvdGF0aW9uX2ZlYXR1cmUiLCAiX1VJX0VsbGlwc2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5FTExJUFNFX19ST1RBVElPTiwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdGFydCBBbmdsZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN0YXJ0QW5nbGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRWxsaXBzZV9zdGFydEFuZ2xlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWxsaXBzZV9zdGFydEFuZ2xlX2ZlYXR1cmUiLCAiX1VJX0VsbGlwc2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5FTExJUFNFX19TVEFSVF9BTkdMRSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFbmQgQW5nbGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbmRBbmdsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9FbGxpcHNlX2VuZEFuZ2xlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWxsaXBzZV9lbmRBbmdsZV9mZWF0dXJlIiwgIl9VSV9FbGxpcHNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRUxMSVBTRV9fRU5EX0FOR0xFLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEVsbGlwc2UuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRWxsaXBzZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChFbGxpcHNlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0VsbGlwc2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0VsbGlwc2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEVsbGlwc2UuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWDoKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19ZOgotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUk9UQVRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19TVEFSVF9BTkdMRToKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX0VORF9BTkdMRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYTUwZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc30gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3VpZGFuY2VJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0V4YW1wbGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9FeGFtcGxlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNDg1MGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0V4YW1wbGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXhhbXBsZUl0ZW1Qcm92aWRlciBleHRlbmRzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXhhbXBsZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBFeGFtcGxlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0V4YW1wbGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRXhhbXBsZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9FeGFtcGxlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9FeGFtcGxlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9GdWxmaWxsYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9GdWxmaWxsYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYzODA5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRnVsZmlsbGFibGVFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGdWxmaWxsYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlEZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGdWxmaWxsYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRnVsZmlsbHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEZ1bGZpbGxzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnVsZmlsbHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRnVsZmlsbGFibGVFbGVtZW50X2Z1bGZpbGxzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRnVsZmlsbGFibGVFbGVtZW50X2Z1bGZpbGxzX2ZlYXR1cmUiLCAiX1VJX0Z1bGZpbGxhYmxlRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkZVTEZJTExBQkxFX0VMRU1FTlRfX0ZVTEZJTExTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRnVsZmlsbGFibGVFbGVtZW50LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0Z1bGZpbGxhYmxlRWxlbWVudCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChGdWxmaWxsYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRnVsZmlsbGFibGVFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9GdWxmaWxsYWJsZUVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoQ29ubmVjdG9ySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM4MDQxNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlciBleHRlbmRzIEdyYXBoRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoQ29ubmVjdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEdyYXBoRWRnZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgR3JhcGggRWRnZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEdyYXBoRWRnZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9HcmFwaENvbm5lY3Rvcl9ncmFwaEVkZ2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9HcmFwaENvbm5lY3Rvcl9ncmFwaEVkZ2VfZmVhdHVyZSIsICJfVUlfR3JhcGhDb25uZWN0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VER0UsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBHcmFwaENvbm5lY3Rvci5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9HcmFwaENvbm5lY3RvciIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChHcmFwaENvbm5lY3Rvcikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9HcmFwaENvbm5lY3Rvcl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3JhcGhDb25uZWN0b3JfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVECi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fTElOSwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoRWRnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoRWRnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNThhNDlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaEVkZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaEVkZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHcmFwaEVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVkZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQW5jaG9yUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBbmNob3IgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbmNob3JQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfR3JhcGhFZGdlX2FuY2hvcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0dyYXBoRWRnZV9hbmNob3JfZmVhdHVyZSIsICJfVUlfR3JhcGhFZGdlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRURHRV9fQU5DSE9SLCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRURHRV9fV0FZUE9JTlRTKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgR3JhcGhFZGdlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0dyYXBoRWRnZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChHcmFwaEVkZ2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfR3JhcGhFZGdlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9HcmFwaEVkZ2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEdyYXBoRWRnZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX1dBWVBPSU5UUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VER0VfX1dBWVBPSU5UUywgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVQb2ludCgpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVECi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fTElOSwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDU4YTQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaEVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEaWFncmFtRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRQb3NpdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUG9zaXRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQb3NpdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9HcmFwaEVsZW1lbnRfcG9zaXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9HcmFwaEVsZW1lbnRfcG9zaXRpb25fZmVhdHVyZSIsICJfVUlfR3JhcGhFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fUE9TSVRJT04sIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19MSU5LKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoR3JhcGhFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0dyYXBoRWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3JhcGhFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChHcmFwaEVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19MSU5LOgotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFOgotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGhOb2RlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaWFncmFtKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZWZlcmVuY2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb3BlcnR5KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaWFncmFtTGluaygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGhDb25uZWN0b3IoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoRWRnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZXh0RWxlbWVudCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW1hZ2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvbHlsaW5lKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFbGxpcHNlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0xJTkssIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlRGlhZ3JhbUxpbmsoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoQ29ubmVjdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRAotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0xJTksKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0UKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaE5vZGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaE5vZGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU5NGEyMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhOb2RlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhOb2RlSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3JhcGhFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhOb2RlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFNpemVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNpemUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTaXplUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0dyYXBoTm9kZV9zaXplX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfR3JhcGhOb2RlX3NpemVfZmVhdHVyZSIsICJfVUlfR3JhcGhOb2RlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfTk9ERV9fU0laRSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEdyYXBoTm9kZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9HcmFwaE5vZGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoR3JhcGhOb2RlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0dyYXBoTm9kZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3JhcGhOb2RlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRAotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0xJTksKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0UKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaGljUHJpbWl0aXZlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhpY1ByaW1pdGl2ZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Zjk0Y2VhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaGljUHJpbWl0aXZlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoaWNQcmltaXRpdmU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoaWNQcmltaXRpdmV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoaWNQcmltaXRpdmVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBMZWFmRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoaWNQcmltaXRpdmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoR3JhcGhpY1ByaW1pdGl2ZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9HcmFwaGljUHJpbWl0aXZlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9HcmFwaGljUHJpbWl0aXZlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzNlZmQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHdWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEF0dGFjaG1lbnRzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBdHRhY2htZW50cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEF0dGFjaG1lbnRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fYXR0YWNobWVudHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX2F0dGFjaG1lbnRzX2ZlYXR1cmUiLCAiX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9HdWlkYW5jZURlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEd1aWRhbmNlRGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VEZXNjcmlwdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VEZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoR3VpZGFuY2VEZXNjcmlwdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3VpZGFuY2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkYW5jZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjA1OGM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkYW5jZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChHdWlkYW5jZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9HdWlkYW5jZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0d1aWRlbGluZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0d1aWRlbGluZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGNlYjY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkZWxpbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRlbGluZUl0ZW1Qcm92aWRlciBleHRlbmRzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3VpZGVsaW5lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEd1aWRlbGluZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9HdWlkZWxpbmUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoR3VpZGVsaW5lKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0d1aWRlbGluZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3VpZGVsaW5lX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9JbWFnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0ltYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYTNhZDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0ltYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBMZWFmRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEltYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFVyaVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTWltZVR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFVyaSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFVyaVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9JbWFnZV91cmlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JbWFnZV91cmlfZmVhdHVyZSIsICJfVUlfSW1hZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5JTUFHRV9fVVJJLCB0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWltZSBUeXBlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWltZVR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfSW1hZ2VfbWltZVR5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JbWFnZV9taW1lVHlwZV9mZWF0dXJlIiwgIl9VSV9JbWFnZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLklNQUdFX19NSU1FX1RZUEUsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSW1hZ2UuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvSW1hZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoSW1hZ2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfSW1hZ2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0ltYWdlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJbWFnZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFX19VUkk6Ci0JCWNhc2UgVW1hUGFja2FnZS5JTUFHRV9fTUlNRV9UWVBFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9JdGVyYXRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9JdGVyYXRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY3NWE0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvSXRlcmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSXRlcmF0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWN0aXZpdHlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJdGVyYXRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSXRlcmF0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0l0ZXJhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChJdGVyYXRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfSXRlcmF0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9JdGVyYXRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTgotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9LaW5kSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvS2luZEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzY2YWQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9LaW5kSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEtpbmRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50RWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEtpbmRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgS2luZC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9LaW5kIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEtpbmQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfS2luZF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfS2luZF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoS2luZC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9MZWFmRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0xlYWZFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYjRjZTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0xlYWZFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkxlYWZFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5MZWFmRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGVhZkVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEaWFncmFtRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExlYWZFbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKExlYWZFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0xlYWZFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9MZWFmRWxlbWVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVjNzQxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgTWV0aG9kVW5pdEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTWV0aG9kUGx1Z2luU2VsZWN0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRNZXRob2RQYWNrYWdlU2VsZWN0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQcm9jZXNzVmlld3NQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZERlZmF1bHRWaWV3UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRCYXNlQ29uZmlndXJhdGlvbnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFN1YnRyYWN0ZWRDYXRlZ29yeVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQWRkZWRDYXRlZ29yeVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWV0aG9kIFBsdWdpbiBTZWxlY3Rpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNZXRob2RQbHVnaW5TZWxlY3Rpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQbHVnaW5TZWxlY3Rpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBsdWdpblNlbGVjdGlvbl9mZWF0dXJlIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWV0aG9kUGFja2FnZVNlbGVjdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBhY2thZ2VTZWxlY3Rpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBhY2thZ2VTZWxlY3Rpb25fZmVhdHVyZSIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcm9jZXNzIFZpZXdzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvY2Vzc1ZpZXdzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fcHJvY2Vzc1ZpZXdzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9wcm9jZXNzVmlld3NfZmVhdHVyZSIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVdTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVmYXVsdCBWaWV3IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVmYXVsdFZpZXdQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9kZWZhdWx0Vmlld19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fZGVmYXVsdFZpZXdfZmVhdHVyZSIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVcsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBCYXNlIENvbmZpZ3VyYXRpb25zIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQmFzZUNvbmZpZ3VyYXRpb25zUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fYmFzZUNvbmZpZ3VyYXRpb25zX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9iYXNlQ29uZmlndXJhdGlvbnNfZmVhdHVyZSIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT05TLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3VidHJhY3RlZCBDYXRlZ29yeSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1YnRyYWN0ZWRDYXRlZ29yeVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3N1YnRyYWN0ZWRDYXRlZ29yeV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fc3VidHJhY3RlZENhdGVnb3J5X2ZlYXR1cmUiLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWSwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFkZGVkIENhdGVnb3J5IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWRkZWRDYXRlZ29yeVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX2FkZGVkQ2F0ZWdvcnlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX2FkZGVkQ2F0ZWdvcnlfZmVhdHVyZSIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWSwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIE1ldGhvZENvbmZpZ3VyYXRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChNZXRob2RDb25maWd1cmF0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOTQ2ZjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRHdWlkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQcmVzZW50YXRpb25OYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRCcmllZkRlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRLaW5kUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTdXBwcmVzc2VkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRPcmRlcmluZ0d1aWRlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBHdWlkIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkR3VpZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50X2d1aWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RFbGVtZW50X2d1aWRfZmVhdHVyZSIsICJfVUlfTWV0aG9kRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19HVUlELCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFByZXNlbnRhdGlvbiBOYW1lIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJlc2VudGF0aW9uTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50X3ByZXNlbnRhdGlvbk5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RFbGVtZW50X3ByZXNlbnRhdGlvbk5hbWVfZmVhdHVyZSIsICJfVUlfTWV0aG9kRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBCcmllZiBEZXNjcmlwdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJyaWVmRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kRWxlbWVudF9icmllZkRlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kRWxlbWVudF9icmllZkRlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX01ldGhvZEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgS2luZCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEtpbmRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kRWxlbWVudF9raW5kX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kRWxlbWVudF9raW5kX2ZlYXR1cmUiLCAiX1VJX01ldGhvZEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fS0lORCwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFN1cHByZXNzZWQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdXBwcmVzc2VkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZEVsZW1lbnRfc3VwcHJlc3NlZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZEVsZW1lbnRfc3VwcHJlc3NlZF9mZWF0dXJlIiwgIl9VSV9NZXRob2RFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgT3JkZXJpbmcgR3VpZGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRPcmRlcmluZ0d1aWRlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZEVsZW1lbnRfb3JkZXJpbmdHdWlkZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZEVsZW1lbnRfb3JkZXJpbmdHdWlkZV9mZWF0dXJlIiwgIl9VSV9NZXRob2RFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTWV0aG9kRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXRob2RFbGVtZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0dVSUQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDoKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM6Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFksCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQkvLyBTdGFydCBjdXN0b20gY29kZSAvLwotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUwZjdiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kRWxlbWVudFByb3BlcnR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlQYWNrYWdlYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZhbHVlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kRWxlbWVudFByb3BlcnR5X3ZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kRWxlbWVudFByb3BlcnR5X3ZhbHVlX2ZlYXR1cmUiLCAiX1VJX01ldGhvZEVsZW1lbnRQcm9wZXJ0eV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNZXRob2RFbGVtZW50UHJvcGVydHkuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvTWV0aG9kRWxlbWVudFByb3BlcnR5IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50UHJvcGVydHlfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX01ldGhvZEVsZW1lbnRQcm9wZXJ0eV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kRWxlbWVudFByb3BlcnR5LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzZmYjYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZFVuaXRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNZXRob2RMaWJyYXJ5LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L01ldGhvZExpYnJhcnkiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTWV0aG9kTGlicmFyeSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9NZXRob2RMaWJyYXJ5X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RMaWJyYXJ5X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXRob2RMaWJyYXJ5LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TOgotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0ZhbWlseSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYTY2ZjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGFja2FnZUl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEdsb2JhbFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmV1c2VkUGFja2FnZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEdsb2JhbCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEdsb2JhbFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RQYWNrYWdlX2dsb2JhbF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFBhY2thZ2VfZ2xvYmFsX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFBhY2thZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJldXNlZCBQYWNrYWdlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJldXNlZFBhY2thZ2VzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFBhY2thZ2VfcmV1c2VkUGFja2FnZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RQYWNrYWdlX3JldXNlZFBhY2thZ2VzX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFBhY2thZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE1ldGhvZFBhY2thZ2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGFja2FnZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGFja2FnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kUGFja2FnZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HTE9CQUw6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjI0MzFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW59IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZFVuaXRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVXNlckNoYW5nZWFibGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEJhc2VzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBVc2VyIENoYW5nZWFibGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRVc2VyQ2hhbmdlYWJsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RQbHVnaW5fdXNlckNoYW5nZWFibGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RQbHVnaW5fdXNlckNoYW5nZWFibGVfZmVhdHVyZSIsICJfVUlfTWV0aG9kUGx1Z2luX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEJhc2VzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQmFzZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFBsdWdpbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU5fX0JBU0VTLCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIE1ldGhvZFBsdWdpbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9NZXRob2RQbHVnaW4iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTWV0aG9kUGx1Z2luKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX01ldGhvZFBsdWdpbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGx1Z2luX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXRob2RQbHVnaW4uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFVuaXRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RVbml0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NmRkMGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFVuaXRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kVW5pdEl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+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+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWVjN2FkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnVtYTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi51bWEsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLAotIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYmFmZDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMi91bWEuZWNvcmUgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4yL3VtYS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE1ODA5OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4yL3VtYS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDEyMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0idW1hIgotICAgIG5zVVJJPSJodHRwOi8vd3d3LmlibS5jb20vdW1hLzEuMC4yL3VtYS5lY29yZSIgbnNQcmVmaXg9ImNvbS5pYm0udW1hIj4KLSAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IjAzIi8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRhdGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuRGF0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIG9mIHRoZSB0eXBlIERhdGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVyaSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubmV0LlVSSSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIHRoYXQgcG9pbnQgdG8gcmVzb3VyY2VzIHN1Y2ggYXMgZmlsZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVubGltaXRlZE5hdHVyYWwiIGluc3RhbmNlQ2xhc3NOYW1lPSJpbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTdHJpbmciIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU2V0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLlNldCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlNlcXVlbmNlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkxpc3QiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJJbnRlZ2VyIiBpbnN0YW5jZUNsYXNzTmFtZT0iaW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2xhc3NpZmllciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9UeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgQ2xhc3NpZmllci4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVHlwZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5hbWVkRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC4gIERlZmluZWQgdGhhdCBldmVyeSBlbGVtZW50IGhhcyBhIG5hbWUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQYWNrYWdlYWJsZUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL05hbWVkRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2FibGUgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVzcGFjZSAjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOYW1lc3BhY2UiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZXNwYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgY2xhc3MgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gaXMgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMgTWV0aG9kIEVsZW1lbnQgaXMgdGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgY2xhc3NlcyBhbmQgZGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgZXZlcnkgb3RoZXIgZWxlbWVudCB0eXBlIG9mIHRoaXMgbW9kZWwuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS4gIE1ldGhvZCBFbGVtZW50IGluaGVyaXRzIHRoZSBOYW1lIGF0dHJpYnV0ZSBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQncyBzdXBlciBjbGFzcy4gIEV2ZXJ5IGVsZW1lbnQgZGVmaW5lZCBhcyBhIFVNQSBpbnN0YW5jZSBpcyBkZXJpdmVkIGZyb20gTW9kZWwgRWxlbWVudC4gIEV2ZXJ5IE1ldGhvZCBFbGVtZW50IGluLXN0YW5jZSBpcyBhdCBsZWFzdCBkZWZpbmVkIGJ5IGEgdW5pcXVlIGlkLCBhIG5hbWUsIGFzIHdlbGwgYXMgYnJpZWYgZGVzY3JpcHRpb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imd1aWQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IGhhcyBhIGdsb2JhbCB1bmlxdWUgaWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im93bmVkUnVsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnN0cmFpbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cHByZXNzZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSBFeHRlbmRzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHRoZW4gdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgaW5oZXJpdGVkIE1ldGhvZCBFbGVtZW50cyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCwgd2hpY2ggY2FuIGJlIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIG9uIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0aGFuIGFuIGluaGVyaXRlZCBtZXRob2QgZWxlbWVudCB0aGVuIGl0IHdpbGwgbm90IGJlIHJlZ2FyZGVkIGFzIGluaGVyaXRlZCBhdCBhbGwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9yZGVyaW5nR3VpZGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnN0cmFpbnQiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbnN0cmFpbnQgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYm9keSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgc3RvcmVzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBjb25zdHJhaW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50RWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmliYWJsZUVsZW1lbnQgIy8vVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250ZW50IEVsZW1lbnQgaXMgYSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuJiN4RDsmI3hBO0NvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uY2VwdHNBbmRQYXBlcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbmNlcHQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hlY2tsaXN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2hlY2tsaXN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imd1aWRlbGluZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0d1aWRlbGluZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleGFtcGxlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRXhhbXBsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3NldHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JldXNhYmxlQXNzZXQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50ICMvL0NsYXNzaWZpZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJhYmxlIEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgTWV0aG9kIEVsZW1lbnRzIGZvciB3aGljaCBleHRlcm5hbCBwcmVzZW50YXRpb24gbmFtZXMgYXMgd2VsbCBhcyBjb250ZW50IGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCwgc3VjaCBhcyBSb2xlcyBvciBXb3JrIFByb2R1Y3RzLiAgUHJlc2VudGF0aW9uIE5hbWUgYW5kIENvbnRlbnQgRGVzY3JpcHRpb25zIGFyZSB0eXBpY2FsbHkgbG9jYWxpemVkIHVzaW5nIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIGl0cyBTdHJpbmcgdHlwZSBhdHRyaWJ1dGVzLiYjeEQ7JiN4QTtUaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UgKHNlZSBTZWN0aW9uIDQuMS40KS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZXNlbnRhdGlvbk5hbWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAmcXVvdDtydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50JnF1b3Q7IHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICZxdW90O2oyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQmcXVvdDsgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAmcXVvdDtBcmNoaXRlY3R1cmUgRG9jdW1lbnQmcXVvdDsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRhdGlvbiIgZVR5cGU9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2hhcGVpY29uIiBlVHlwZT0iIy8vVXJpIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub2RlaWNvbiIgZVR5cGU9IiMvL1VyaSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB0cmVlIGJyb3dzZXIgcHJlc2VudGF0aW9ucyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgRGVzY3JpcHRpb24gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQ29udGVudCBFbGVtZW50LiAgSXQgZGVmaW5lcyBzdGFuZGFyZCBhdHRyaWJ1dGVzIGFwcGxpY2FibGUgZm9yIGFsbCBDb250ZW50IEVsZW1lbnQgdHlwZXMuICBTcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgc3ViLXR5cGVzIGNhbiBkZWZpbmUgdGhlaXIgb3duIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gc3ViLXR5cGVzLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBzdG9yZSB0aGUgbWFpbiBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgQ29udGVudCBFbGVtZW50LiAgQWxsIHRleHQgdGhhdCBpcyBub3QgcGFydCBvZiBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgYXR0cmlidXRlcyBzaGFsbCBiZSBzdG9yZWQgaGVyZS4gIElmIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGlzIGRpdmlkZWQgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgU2VjdGlvbiBjbGFzcywgdGhlbiBvbmx5IHRoZSB0ZXh0IGZyb20gdGhlICdzdGFydCcgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gdG8gdGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBzdG9yZWQgaGVyZSAoc2ltaWxhciB0byBhIG5vcm1hbCBkb2N1bWVudCB3aGVyZSB5b3UgY2FuIHBsYWNlIHRleHQgYmV0d2VlbiBpdHMgYmVnaW5uaW5nIHRvIGl0cyBmaXJzdCBkaWN0aW9uIGhlYWRpbmcpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWN0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IktleSBDb25zaWRlcmF0aW9ucyBwcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VjdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1ZhcmlhYmlsaXR5RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBTZWN0aW9uIGlzIGEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWN0aW9uTmFtZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWN0aW9uRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlcyBzdG9yZSB0aGUgZGVzY3JpcHRpb24gdGV4dCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uJ3MgU2VjdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViU2VjdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlY2Vzc29yIiBlVHlwZT0iIy8vU2VjdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9sZSBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAmI3hEOyYjeEE7QSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBhIHNldCBvZiBpbmRpdmlkdWFscy4gIFJvbGVzIGFyZSBub3QgaW5kaXZpZHVhbHMgb3IgcmVzb3VyY2VzLiAgSW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gd2lsbCB3ZWFyIGRpZmZlcmVudCBoYXRzLCBvciBwZXJmb3JtIGRpZmZlcmVudCByb2xlcy4gVGhlIG1hcHBpbmcgZnJvbSBpbmRpdmlkdWFsIHRvIHJvbGUsIHBlcmZvcm1lZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYW5kIHN0YWZmaW5nIGZvciBhIHByb2plY3QsIGFsbG93cyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgdG8gYWN0IGFzIHNldmVyYWwgZGlmZmVyZW50IHJvbGVzLCBhbmQgZm9yIGEgcm9sZSB0byBiZSBwbGF5ZWQgYnkgc2V2ZXJhbCBpbmRpdmlkdWFscy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibW9kaWZpZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0IiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3QiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgUHJvZHVjdCBpcyBhbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4mI3hEOyYjeEE7QSB3b3JrIHByb2R1Y3QgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBhIHRhc2suIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVzdGltYXRlIiBlVHlwZT0iIy8vRXN0aW1hdGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlcG9ydHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JlcG9ydCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZW1wbGF0ZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RlbXBsYXRlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRvb2xNZW50b3JzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Ub29sTWVudG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2siIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCAjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUYXNrIGlzIGEgY29udGVudCBlbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdvcmsgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgSXQgZGVmaW5lcyBvbmUgZGVmYXVsdCBwZXJmb3JtaW5nIFJvbGUgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwgcGVyZm9ybWVycy4gIEEgVGFzayBpcyBhc3NvY2lhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gIElucHV0cyBhcmUgZGlmZmVyZW50aWF0ZWQgaW4gbWFuZGF0b3J5IHZlcnN1cyBvcHRpb25hbCBpbnB1dHMuICBUaGUgYXNzb2NpYXRpb25zIHRvIFdvcmsgUHJvZHVjdHMgYXJlIG5vdCBpbnN0YW50aWF0YWJsZS92YXJpYWJsZS1saWtlIHBhcmFtZXRlcnMuICBUaGV5IHJhdGhlciBleHByZXNzIChoeXBlci0pbGlua3MgdG8gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgd29yayBwcm9kdWN0cyB0eXBlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBUYXNrIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNhcHR1cmUgd2hpY2ggY29uY3JldGUgaW5zdGFuY2VzIHdpbGwgYmUgcGFzc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgbWV0aG9kIGluIGEgcHJvamVjdC4gIEFsbCBvZiB0aGUgVGFzaydzIGRlZmF1bHQgYXNzb2NpYXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGFjdHVhbCBwcm9jZXNzIGRlZmluaXRpb24uJiN4RDsmI3hBO0EgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuICYjeEQ7JiN4QTtBIFRhc2sgaGFzIGEgY2xlYXIgcHVycG9zZSBpbiB3aGljaCB0aGUgcGVyZm9ybWluZyByb2xlcyBhY2hpZXZlIGEgd2VsbCBkZWZpbmVkIGdvYWwuICBJdCBwcm92aWRlcyBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIG9mIGRvaW5nIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuICBUaGlzIGRlc2NyaXB0aW9uIGlzIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBvZiB3aGVuIGluIGEgcHJvY2VzcyBsaWZlY3ljbGUgdGhlIHdvcmsgd291bGQgYWN0dWFsbHkgYmUgZG9uZS4gIEl0IHRoZXJlZm9yZSBkb2VzIG5vdCBkZXNjcmliZSB3aGVuIHlvdSBkbyB3aGF0IHdvcmsgYXQgd2hhdCBwb2ludCBvZiB0aW1lLCBidXQgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IGdldHMgZG9uZSB0aHJvdWdob3V0IHRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgdGhhdCBjb250cmlidXRlcyB0byB0aGUgYWNoaWV2ZW1lbnQgb2YgdGhpcyBnb2FsLiAgV2hlbiB0aGUgVGFzayBpcyBiZWluZyBhcHBsaWVkIGluIGEgcHJvY2VzcyB0aGVuIHRoaXMgcHJvY2VzcyBhcHBsaWNhdGlvbiAoZGVmaW5lZCBhcyBUYXNrIERlc2NyaXB0b3IpIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvZiB3aGljaCBwaWVjZXMgb2YgdGhlIFRhc2sgd2lsbCBhY3R1YWxseSBiZSBwZXJmb3JtZWQgYXQgYW55IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFRhc2sgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIHByb2Nlc3Mgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgYnV0IGVhY2ggdGltZSB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVtcGhhc2lzIG9uIGRpZmZlcmVudCBzdGVwcyBvciBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0aW9uLiAmI3hEOyYjeEE7Rm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICZxdW90O0RldmVsb3AgVXNlIENhc2UgTW9kZWwmcXVvdDsgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gZGV2ZWxvcCBhIGNvbXBsZXRlIHVzZSBjYXNlIG1vZGVsLiBUaGlzIHdvdWxkIGNvbXByaXNlIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBhbmQgbmFtaW5nIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLCB0aGUgd3JpdGluZyBvZiBhIGJyaWVmIGRlc2NyaXB0aW9uLCB0aGUgbW9kZWxpbmcgb2YgdXNlIGNhc2VzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIGluIGRpYWdyYW1zLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYSBiYXNpYyBmbG93LCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYWx0ZXJuYXRpdmVzIGZsb3dzLCBwZXJmb3JtaW5nIG9mIHdhbGt0aHJvdWdocyB3b3Jrc2hvcHMgYW5kIHJldmlld3MsIGV0Yy4gIEFsbCBvZiB0aGVzZSBwYXJ0cyBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBnb2FsIG9mIGRldmVsb3BpbmcgdGhlIHVzZSBjYXNlIG1vZGVsLCBidXQgdGhlIHBhcnRzIHdpbGwgYmUgcGVyZm9ybWVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSBpbiBhIHByb2Nlc3MuICBJZGVudGlmaWNhdGlvbiwgbmFtaW5nLCBhbmQgYnJpZWYgZGVzY3JpcHRpb25zIHdvdWxkIGJlIHBlcmZvcm1lZCBlYXJseSBpbiBhIHR5cGljYWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyB2ZXJzdXMgdGhlIHdyaXRpbmcgb2YgZGV0YWlsZWQgYWx0ZXJuYXRpdmUgZmxvd3Mgd2hpY2ggd291bGQgYmUgcGVyZm9ybWVkIG11Y2ggbGF0ZXIuICBBbGwgdGhlc2UgcGFydHMgb3Igc3RlcHMgd2l0aGluIHRoZSBzYW1lIFRhc2sgZGVmaW5lIHRoZSAmcXVvdDttZXRob2QmcXVvdDsgb2YgRGV2ZWxvcGluZyBhIFVzZSBDYXNlIE1vZGVsLiAgQXBwbHlpbmcgc3VjaCBhIG1ldGhvZCBpbiBhIGxpZmVjeWNsZSAoaS5lLiBpbiBhIHByb2Nlc3MpIGlzIGRlZmluaW5nIHdoaWNoIHN0ZXBzIGFyZSBkb25lIHdoZW4gZ29pbmcgZnJvbSBvbmUgaXRlcmF0aW9uIHRvIHRoZSBuZXh0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJmb3JtZWRCeSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFuZGF0b3J5SW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dHB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3RlcHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N0ZXAiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIgotICAgICAgICBkZXJpdmVkPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRvb2xNZW50b3JzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Ub29sTWVudG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVzdGltYXRlIiBlVHlwZT0iIy8vRXN0aW1hdGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtEZWZpbml0aW9uIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgRGVmaW5pdGlvbiBpcyBhbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLiYjeEQ7JiN4QTtXb3JrIERlZmluaXRpb25zIHJlcHJlc2VudCBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgZG9pbmcgd29yay4gIFRoZXNlIGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGFyZSBub3QgYm91bmQgdG8gb25lIHNwZWNpZmljIGNsYXNzaWZpZXIsIGJ1dCByZXByZXNlbnQgYW4gYXJiaXRyYXJ5IGRlZmluaXRpb24gb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZCBieSBhIHNwZWNpZmljIFJvbGUgKGUuZy4gYSBSb2xlIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBUYXNrIG9yIFN0ZXBzIG9mIGEgVGFzayksIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjbG9zZSBjb2xsYWJvcmF0aW9uIChtYW55IFJvbGVzIGFsbCB3b3JraW5nIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIGludGVyZGlzY2lwbGluYXJ5IFRhc2spLCBvciBjb21wbGV4IHdvcmsgdGhhdCBpcyBwZXJmb3JtZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIChlLmcuIGEgcHJvY2VzcyBkZWZpbmluZyBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgZm9yIG9yZ2FuaXppbmcgbGFyZ2VyIGNvbXBvc2l0ZSB1bml0cyBvZiB3b3JrIHBlcmZvcm1lZCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY29sbGFib3JhdGlvbikuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWNvbmRpdGlvbiIgZVR5cGU9IiMvL0NvbnN0cmFpbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBvc3Rjb25kaXRpb24iIGVUeXBlPSIjLy9Db25zdHJhaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdGVwIiBlU3VwZXJUeXBlcz0iIy8vU2VjdGlvbiAjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBTdGVwIGlzIGEgU2VjdGlvbiBhbmQgV29yayBEZWZpbml0aW9uIHRoYXQgaXMgdXNlZCB0byBvcmdhbml6ZSBUYXNrcyBpbnRvIHBhcnRzIG9yIHN1YnVuaXRzIG9mIHdvcmsuICBTdGVwcyBpbmhlcml0IHRoZSBzdWJTZWN0aW9ucyBkZWNvbXBvc2l0aW9uIGZyb20gU2VjdGlvbiBhbmQgY2FuIHRoZXJlZm9yZSBkZXNjcmliZSBTdWItU3RlcHMgbmVzdGVkIGludG8gU3RlcHMuJiN4RDsmI3hBO0EgU3RlcCBkZXNjcmliZXMgYSBtZWFuaW5nZnVsIGFuZCBjb25zaXN0IHBhcnQgb2YgdGhlIG92ZXJhbGwgd29yayBkZXNjcmliZWQgZm9yIGEgVGFzay4gIFRoZSBjb2xsZWN0aW9uIG9mIFN0ZXBzIGRlZmluZWQgZm9yIGEgVGFzayByZXByZXNlbnRzIGFsbCB0aGUgd29yayB0aGF0IHNob3VsZCBiZSBkb25lIHRvIGFjaGlldmUgdGhlIG92ZXJhbGwgZGV2ZWxvcG1lbnQgZ29hbCBvZiB0aGUgVGFzay4gIE5vdCBhbGwgc3RlcHMgYXJlIG5lY2Vzc2FyaWx5IHBlcmZvcm1lZCBlYWNoIHRpbWUgYSBUYXNrIGlzIGludm9rZWQgaW4gYSBQcm9jZXNzIChzZWUgVGFzayBEZXNjcmlwdG9yKSwgc28gdGhleSBjYW4gYWxzbyBiZSBleHByZXNzZWQgaW4gdGhlIGZvcm0gb2YgYWx0ZXJuYXRlICdmbG93cycgb2Ygd29yay4gIERpZmZlcmVudCB3YXlzIG9mIGFjaGlldmluZyB0aGUgc2FtZSBkZXZlbG9wbWVudCBnb2FsIGNhbiB0aGVuIGJlICdhc3NlbWJsZWQnIGJ5IHNlbGVjdGluZyBkaWZmZXJlbnQgY29tYmluYXRpb25zIG9mIHN0ZXBzIHdoZW4gYXBwbHlpbmcgdGhlIFRhc2sgaW4gYSBQcm9jZXNzLiAgVHlwaWNhbCBraW5kcyBvZiBzdGVwcyBhIFRhc2sgYXV0aG9yIHNob3VsZCBjb25zaWRlciBhcmU6IFRoaW5raW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyB1bmRlcnN0YW5kIHRoZSBuYXR1cmUgb2YgdGhlIHRhc2ssIGdhdGhlcnMgYW5kIGV4YW1pbmVzIHRoZSBpbnB1dCBhcnRpZmFjdHMsIGFuZCBmb3JtdWxhdGVzIHRoZSBvdXRjb21lLiBQZXJmb3JtaW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyBjcmVhdGUgb3IgdXBkYXRlIHNvbWUgYXJ0aWZhY3RzLiBSZXZpZXdpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGluc3BlY3RzIHRoZSByZXN1bHRzIGFnYWluc3Qgc29tZSBjcml0ZXJpYS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGFuY2UiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcnRpZmFjdCIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBcnRpZmFjdCBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLiYjeEQ7JiN4QTtBcnRpZmFjdHMgYXJlIHRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBUYXNrcy4gIEl0IG1heSBzZXJ2ZSBhcyBhIGJhc2lzIGZvciBkZWZpbmluZyByZXVzYWJsZSBhc3NldHMuICBSb2xlcyB1c2UgQXJ0aWZhY3RzIHRvIHBlcmZvcm0gVGFza3MgYW5kIHByb2R1Y2UgQXJ0aWZhY3RzIGluIHRoZSBjb3Vyc2Ugb2YgcGVyZm9ybWluZyBUYXNrcy4gIEFydGlmYWN0cyBhcmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIFJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5IHRvIGlkZW50aWZ5IGFuZCB1bmRlcnN0YW5kLCBhbmQgcHJvbW90aW5nIHRoZSBpZGVhIHRoYXQgZXZlcnkgcGllY2Ugb2YgaW5mb3JtYXRpb24gcHJvZHVjZWQgaW4gdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25lIHJvbGUgbWlnaHQgJnF1b3Q7b3duJnF1b3Q7IGEgc3BlY2lmaWMgdHlwZSBvZiBBcnRpZmFjdHMsIG90aGVyIHJvbGVzIGNhbiBzdGlsbCB1c2UgdGhlIEFydGlmYWN0czsgcGVyaGFwcyBldmVuIHVwZGF0ZSB0aGVtIGlmIHRoZSBSb2xlIGhhcyBiZWVuIGdpdmVuIHBlcm1pc3Npb24gdG8gZG8gc28uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lckFydGlmYWN0IiBlVHlwZT0iIy8vQXJ0aWZhY3QiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9BcnRpZmFjdC9jb250YWluZWRBcnRpZmFjdHMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVkQXJ0aWZhY3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BcnRpZmFjdCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vQXJ0aWZhY3QvY29udGFpbmVyQXJ0aWZhY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcmFibGUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBkZWxpdmVyYWJsZSBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlbGl2ZXJlZFdvcmtQcm9kdWN0cyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0Y29tZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBvdXRjb21lIGRlc2NyaWJlcyBpbnRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgYSByZXN1bHQgb3Igc3RhdGUuIE91dGNvbWVzIG1heSBhbHNvIGJlIHVzZWQgdG8gZGVzY3JpYmUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBub3QgZm9ybWFsbHkgZGVmaW5lZC4gIEEga2V5IGRpZmZlcmVudGlhdG9yIGZvciBvdXRjb21lcyBhZ2FpbnN0IGFydGlmYWN0cyBpcyB0aGF0IG91dGNvbWVzIGFyZSBub3QgY2FuZGlkYXRlcyBmb3IgaGFydmVzdGluZyBhcyByZXVzYWJsZSBhc3NldHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFBhY2thZ2UiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCAjLy9QYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBQYWNrYWdlIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdsb2JhbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTWV0aG9kIFBhY2thZ2VzIGNhbiBoYXZlIGEgZ2xvYmFsIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGV2ZXJ5IGVsZW1lbnQgb2YgZXZlcnkgb3RoZXIgTWV0aG9kIFBhY2thZ2UgY2FuIHNlZSB0aGUgZ2xvYmFsIHBhY2thZ2UncyBjb250ZW50cy4gIEdsb2JhbCBNZXRob2QgUGFja2FnZXMgYXJlIHByaW1hcmlseSB1c2VkIHRvIHN0b3JlIGNvbW1vbmx5IHVzZWQgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgc3VjaCBhcyBmb3IgRGlzY2lwbGluZXMgb3IgRG9tYWlucywgd2hpY2ggYXJlIHVzZWQgYnkgbWFueSBUYXNrIGFuZCBXb3JrIFByb2R1Y3RzIHJlc3BlY3RpdmVseS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmV1c2VkUGFja2FnZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGFyZW50UGFja2FnZSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9NZXRob2RQYWNrYWdlL2NoaWxkUGFja2FnZXMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hpbGRQYWNrYWdlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vTWV0aG9kUGFja2FnZS9wYXJlbnRQYWNrYWdlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb250ZW50IFBhY2thZ2UgaXMgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMgYW5kIENvbnRlbnQgRWxlbWVudHMsIG9ubHkuICBFeGFtcGxlcyBmb3IgQ29udGVudCBFbGVtZW50IGFyZSBBcnRpZmFjdHMsIFRhc2tzLCBSb2xlcywgZXRjLiAgQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudEVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50RWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJicmllZk91dGxpbmUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlcHJlc2VudGF0aW9uT3B0aW9ucyIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxJZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGFydGlmYWN0LiBVc2VkIGxpa2UgYSBzeW5vbnltLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBhY3RPZk5vdEhhdmluZyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVhc29uc0Zvck5vdE5lZWRpbmciIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJza2lsbHMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXNzaWdubWVudEFwcHJvYWNoZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3lub255bXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdGVybmF0aXZlcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXR0YWNobWVudHMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFkZGl0aW9uYWxJbmZvIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvYmxlbSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGUgUHJhY3RpY2UgYWRkcmVzc2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiYWNrZ3JvdW5kIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdvYWxzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXBwbGljYXRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbHNPZkFkb3B0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb2ludCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IngiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3NpdGlvbiIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZWQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW1FbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtRWxlbWVudC9jb250YWluZXIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGluayIgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRGlhZ3JhbUxpbmsiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1MaW5rL2dyYXBoRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhbmNob3JhZ2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0dyYXBoQ29ubmVjdG9yIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VtYW50aWNNb2RlbCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZ3JhcGhFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW1FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1Zpc2libGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lciIgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9jb250YWluZWQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZWZlcmVuY2UiIGVPcHBvc2l0ZT0iIy8vUmVmZXJlbmNlL3JlZmVyZW5jZWQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvcGVydHkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtTGluayIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iem9vbSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2aWV3cG9ydCIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvbGluayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRGlhZ3JhbSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtL2RpYWdyYW1MaW5rIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoQ29ubmVjdG9yIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L2FuY2hvcmFnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVkZ2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0dyYXBoRWRnZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVkZ2UvYW5jaG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlbWFudGljTW9kZWxCcmlkZ2UiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlc2VudGF0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L3NlbWFudGljTW9kZWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbSIgZVR5cGU9IiMvL0RpYWdyYW0iCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtL25hbWVzcGFjZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaW1lbnNpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3aWR0aCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoZWlnaHQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVmZXJlbmNlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlZCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW1FbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1FbGVtZW50L3JlZmVyZW5jZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9wZXJ0eSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2V5IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaEVkZ2UiIGVTdXBlclR5cGVzPSIjLy9HcmFwaEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhbmNob3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIyIiB1cHBlckJvdW5kPSIyIiBlVHlwZT0iIy8vR3JhcGhDb25uZWN0b3IiIGVPcHBvc2l0ZT0iIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFZGdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndheXBvaW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjIiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUG9pbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW0iIGVTdXBlclR5cGVzPSIjLy9HcmFwaE5vZGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ6b29tIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZpZXdwb2ludCIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtTGluayIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlhZ3JhbUxpbmsiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUxpbmsvZGlhZ3JhbSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lc3BhY2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2RpYWdyYW0iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhOb2RlIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2l6ZSIgZVR5cGU9IiMvL0RpbWVuc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZUluZm8iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9FbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxlYWZFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGV4dEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRleHQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbWFnZSIgZVN1cGVyVHlwZXM9IiMvL0xlYWZFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJpIiBlVHlwZT0iIy8vVXJpIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbWVUeXBlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhpY1ByaW1pdGl2ZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvbHlsaW5lIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhpY1ByaW1pdGl2ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsb3NlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2F5cG9pbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMiIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qb2ludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRWxsaXBzZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoaWNQcmltaXRpdmUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYWRpdXNYIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhZGl1c1kiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm90YXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnRBbmdsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbmRBbmdsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjZW50ZXIiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWN0aXZpdHkiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCAjLy9WYXJpYWJpbGl0eUVsZW1lbnQgIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIEFjdGl2aXR5IGlzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4mI3hEOyYjeEE7QWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJyZWFrZG93bkVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0JyZWFrZG93bkVsZW1lbnQvc3VwZXJBY3Rpdml0aWVzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvYWRtYXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2FkbWFwIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGVja2xpc3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DaGVja2xpc3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uY2VwdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbmNlcHQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhhbXBsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0V4YW1wbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3VpZGVsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJldXNhYmxlQXNzZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtCcmVha2Rvd25FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaXMgYSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNSZXBlYXRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNPbmdvaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiB0aGUgaXNPbmdvaW5nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBpbnN0YW5jZSwgdGhlbiB0aGUgZWxlbWVudCBkZXNjcmliZXMgYW4gb25nb2luZyBwaWVjZSBvZiB3b3JrIHdpdGhvdXQgYSBmaXhlZCBkdXJhdGlvbiBvciBlbmQgc3RhdGUuICBGb3IgZXhhbXBsZSwgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIG9mIGFuIGFkbWluaXN0cmF0b3IgY29udGludW91c2x5IChlLmcuIDNoIGEgZGF5KSB3b3JraW5nIHRvIGVuc3VyZSB0aGF0IHN5c3RlbXMgYXJlIGtlcHQgaW4gYSBjZXJ0YWluIHN0YXRlLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHByb2dyYW0gbWFuYWdlbWVudCB3b3JrIG92ZXJzZWVpbmcgbWFueSBkaWZmZXJlbnQgcHJvamVjdHMgYmVpbmcgc2NoZWR1bGVkIGZvciBvbmUgcGFydGljdWxhciBwcm9qZWN0IGF0IHNwZWNpZmljIHJlb2NjdXJyaW5nIGludGVydmFscyBkdXJpbmcgdGhlIHdob2xlIGxpZmVjeWNsZSBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNFdmVudERyaXZlbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxpbmtUb1ByZWRlY2Vzc29yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrT3JkZXIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQnJlYWtkb3duRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQnJlYWtkb3duIEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVmaXgiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByZWZpeCByZXByZXNlbnRzIGFuIGFkZGl0aW9uYWwgbGFiZWwgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhIHByZWZpeCB0byBhbnkgQnJlYWtkb3duIEVsZW1lbnQgdG8gaW5kaWNhdGUgYSB1c2VyLWRlZmluZWQgc3ViLXR5cGUgZm9yIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHdvdWxkIGxpa2UgdG8gZGlzdGluZ3Vpc2ggaGlzIEFjdGl2aXRpZXMgYnkgJ01vZHVsZScgKGFzIGRvbmUgaW4gdGhlIElCTSBSYXRpb25hbCBTdW1taXQgQXNjZW5kYW50IE1ldGhvZCksIGhlIGNhbiBkZWZpbmUgYSBkaWZmZXJlbnQgcHJlZml4IGZvciBldmVyeSBtb2RlbCB0byBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIG5hbWluZyBBY3Rpdml0aWVzLCBlLmcuICZxdW90O1NSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzJnF1b3Q7IHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICZxdW90O1NvZnR3YXJlIFJlcXVpcmVtZW50cyBBbmFseXNpcyZxdW90OyBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAmcXVvdDtDdXN0b21lci5BcmNoaXRlY3QmcXVvdDsgd291bGQgZGVmaW5lIGEgJnF1b3Q7Q3VzdG9tZXImcXVvdDsgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICZxdW90O0FyY2hpdGVjdCZxdW90OyBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1BsYW5uZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LiYjeEQ7JiN4QTsmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhhc011bHRpcGxlT2NjdXJyZW5jZXMiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikp1c3QgYXMgdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgdGhlIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBhbiBpbXBhY3Qgb24gZ2VuZXJhdGluZyBwbGFucyBmcm9tIGEgUHJvY2Vzcy4gIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhlbiBpdCB3aWxsIHR5cGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gdGhlIHNhbWUgQWN0aXZpdHkuICBGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV0YWlsIFVzZSBDYXNlJnF1b3Q7IHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09wdGlvbmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaXNPcHRpb25hbCBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIEJyZWFrZG93biBFbGVtZW50IGRlc2NyaWJlcyB3b3JrLCBhIHdvcmsgcmVzdWx0LCBvciBldmVuIHdvcmsgcmVzb3VyY2VzLCB3aGljaCBpbmNsdXNpb24gaXMgbm90IG1hbmRhdG9yeSB3aGVuIHBlcmZvcm1pbmcgYSBwcm9qZWN0IHRoYXQgaXMgcGxhbm5lZCBiYXNlZCBvbiBhIHByb2Nlc3MgY29udGFpbmluZyB0aGlzIGVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRlZEFmdGVyIiBlVHlwZT0iIy8vQnJlYWtkb3duRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50ZWRCZWZvcmUiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBsYW5uaW5nRGF0YSIgZVR5cGU9IiMvL1BsYW5uaW5nRGF0YSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwZXJBY3Rpdml0aWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BY3Rpdml0eSIgZU9wcG9zaXRlPSIjLy9BY3Rpdml0eS9icmVha2Rvd25FbGVtZW50cyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNaWxlc3RvbmUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNaWxlc3RvbmUgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJdGVyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSXRlcmF0aW9uIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuJiN4RDsmI3hBO0l0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQaGFzZSIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQaGFzZSBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLiYjeEQ7JiN4QTtQaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVhbVByb2ZpbGUiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRlYW0gUHJvZmlsZSBpcyBhIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuJiN4RDsmI3hBO1dvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4mI3hEOyYjeEE7SGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZWFtUm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cGVyVGVhbSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1RlYW1Qcm9maWxlIiBlT3Bwb3NpdGU9IiMvL1RlYW1Qcm9maWxlL3N1YlRlYW0iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViVGVhbSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGVhbVByb2ZpbGUiIGVPcHBvc2l0ZT0iIy8vVGVhbVByb2ZpbGUvc3VwZXJUZWFtIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJSb2xlIiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJmb3Jtc0FkZGl0aW9uYWxseSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFza0Rlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vVGFza0Rlc2NyaXB0b3IvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzaXN0c0luIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9UYXNrRGVzY3JpcHRvci9hc3Npc3RlZEJ5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZGlmaWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci93b3JrZWRPbkJ5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBlcmZvcm1zQXNPd25lciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFza0Rlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vVGFza0Rlc2NyaXB0b3IvcGVyZm9ybWVkUHJpbWFyaWx5QnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzcG9uc2libGVGb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvcmVzcG9uc2libGVSb2xlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBPcmRlciByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEIpIGJlbG93KSBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEEpIGJlbG93KSBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9TdGFydCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9GaW5pc2giIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvU3RhcnQiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvRmluaXNoIiB2YWx1ZT0iMyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrT3JkZXIiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBPcmRlciBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgJiN4RDsmI3hBOyhOb3RlLCBXb3JrIE9yZGVyIGlzIG5vdCBtb2RlbGVkIGFzIGFuIEFzc29jaWF0aW9uIENsYXNzIHRvIHByb3ZpZGUgYSBzdHJhaWdodGZvcndhcmQgbWFwcGluZyAgdG8gWE1JIGFuZCBFTUYuKSYjeEQ7JiN4QTtUaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rVHlwZSIgZVR5cGU9IiMvL1dvcmtPcmRlclR5cGUiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZpbmlzaFRvU3RhcnQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZCIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvY2VzcyBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuJiN4RDsmI3hBO1Byb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGxhbm5pbmdEYXRhIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlBsYW5uaW5nIERhdGEgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4mI3hEOyYjeEE7UGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LiYjeEQ7JiN4QTsoTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydERhdGUiIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoRGF0ZSIgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFuayIgZVR5cGU9IiMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVzY3JpcHRvciBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuJiN4RDsmI3hBO0Rlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrRGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50ICMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGFzayBEZXNjcmlwdG9yIGlzIGEgRGVzY3JpcHRvciBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwcm94eSBmb3IgYSBUYXNrIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBUYXNrIERlc2NyaXB0b3JzIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gVGhlcmVmb3JlIG9uZSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiYjeEQ7JiN4QTtBIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0by4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlRhc2siIGVUeXBlPSIjLy9UYXNrIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Sb2xlRGVzY3JpcHRvci9wZXJmb3Jtc0FkZGl0aW9uYWxseSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3Npc3RlZEJ5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Sb2xlRGVzY3JpcHRvci9hc3Npc3RzSW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZXJuYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9leHRlcm5hbElucHV0VG8iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFuZGF0b3J5SW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvbWFuZGF0b3J5SW5wdXRUbyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvcHRpb25hbElucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL09wdGlvbmFsSW5wdXRUbyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRwdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3Ivb3V0cHV0RnJvbSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJmb3JtZWRQcmltYXJpbHlCeSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIgotICAgICAgICBlT3Bwb3NpdGU9IiMvL1JvbGVEZXNjcmlwdG9yL3BlcmZvcm1zQXNPd25lciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWxlY3RlZFN0ZXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TZWN0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFdvcmsgUHJvZHVjdCBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3Rpdml0eUVudHJ5U3RhdGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICAmI3hEOyYjeEE7Rm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3Rpdml0eUV4aXRTdGF0ZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuJiN4RDsmI3hBO0ZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iV29ya1Byb2R1Y3QiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlcm5hbElucHV0VG8iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1Rhc2tEZXNjcmlwdG9yL2V4dGVybmFsSW5wdXQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW1wYWN0ZWRCeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltcGFjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0ZWRCeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYW5kYXRvcnlJbnB1dFRvIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9UYXNrRGVzY3JpcHRvci9tYW5kYXRvcnlJbnB1dCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JrZWRPbkJ5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUm9sZURlc2NyaXB0b3IvbW9kaWZpZXMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iT3B0aW9uYWxJbnB1dFRvIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9UYXNrRGVzY3JpcHRvci9vcHRpb25hbElucHV0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dHB1dEZyb20iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1Rhc2tEZXNjcmlwdG9yL291dHB1dCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyYWJsZVBhcnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzcG9uc2libGVSb2xlIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiCi0gICAgICAgIGVPcHBvc2l0ZT0iIy8vUm9sZURlc2NyaXB0b3IvcmVzcG9uc2libGVGb3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29tcG9zaXRlUm9sZSIgZVN1cGVyVHlwZXM9IiMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbXBvc2l0ZSBSb2xlIGlzIGEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLiYjeEQ7JiN4QTtBIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWdncmVnYXRlZFJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlR3VpZGFuY2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWx0ZXJuYXRpdmVzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJob3d0b1N0YWZmIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjYWxlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3RDaGFyYWN0ZXJpc3RpY3MiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3MiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmlza0xldmVsIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyB0eXBpY2FsIHByb2plY3Qgcmlza3MgdGhhdCBhcmUgYWRkcmVzc2VkIHdpdGggdGhpcyBwcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0aW5nVGVjaG5pcXVlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZU9mQ29udHJhY3QiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsSWQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBkZWxpdmVyeSBwYXR0ZXJucyBhbmQgbW9kZWxzLiBJdCBpcyB1c2VkIGxpa2UgYSBzeW5vbnltLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY29wZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlTm90ZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFueSBhZGRpdGlvbmFsIG5vdGVzIG9uIGhvdyB0byBhcHBseSBhbmQgaW5zdGFudGlhdGUgdGhpcyBwcm9jZXNzIGZvciBhIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaXB0b3JEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZmluZWREZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZXNjcmlwdG9yIG1pZ2h0IGFkZCByZWZpbmVtZW50cyB0byB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0aGUgQ29udGVudCBFbGVtZW50IGl0IHJlZmVycyB0by4gIEZvciBleGFtcGxlLCBpdCBjb3VsZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBXb3JrIFByb2R1Y3QgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lIGluIHRoZSBwcm9jZXNzIHRoaXMgV29yayBQcm9kdWN0IHR5cGUgaXMgYmVpbmcgdXNlZC4gIEl0IGNvdWxkIGRlc2NyaWJlIGFkZGl0aW9uYWwgc2tpbGxzIG5lZWRlZCBmb3IgYSBSb2xlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIGEgcHJvY2VzcywgZXRjLiAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29uY2VwdCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbmNlcHQgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gR3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3Mgc2V2LWVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcy9hY3Rpdml0aWVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDaGVja2xpc3QiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDaGVja2xpc3QgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgaWRlbnRpZmllcyBhIHNlcmllcyBvZiBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmktZmllZC4gIENoZWNrbGlzdHMgYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4YW1wbGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gRXhhbXBsZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGVsaW5lIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgR3VpZGVsaW5lIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVzdGltYXRlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIEVzdGltYXRlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHByb3ZpZGVzIHNpemluZyBtZWFzdXJlcywgb3Igc3RhbmRhcmRzIGZvciBzaXppbmcgdGhlIHdvcmsgZWZmb3J0IGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIGEgcGFydGljdWxhciBwaWVjZSBvZiB3b3JrIGFuZCBpbnN0cnVjdGlvbnMgZm9yIHRoZWlyIHN1Y2Nlc3NmdWwgdXNlLiBJdCBtYXkgYmUgY29tcHJpc2VkIG9mIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbnMgYW5kIGVzdGltYXRpb24gbWV0cmljcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXN0aW1hdGlvbk1ldHJpYyIgZVR5cGU9IiMvL0VzdGltYXRpbmdNZXRyaWMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVzdGltYXRpb25Db25kZXJhdGlvbnMiCi0gICAgICAgIGVUeXBlPSIjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVzdGltYXRpbmdNZXRyaWMiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXN0aW1hdGlvbiBNZXRyaWMgZGVzY3JpYmVzIGEgbWV0cmljIG9yIG1lYXN1cmUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCBhbmQgd2hpY2ggaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHdvcmsgZWZmb3J0IGFzIHdlbGwgYXMgYSByYW5nZSBvZiBwb3RlbnRpYWwgbGFib3IuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zIHF1YWxpZnkgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVwb3J0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUmVwb3J0IGlzIGEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVtcGxhdGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUZW1wbGF0ZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN1cHBvcnRpbmcgTWF0ZXJpYWxzIGlzIGNhdGNoYWxsIGZvciBvdGhlciB0eXBlcyBvZiBndWlkYW5jZSBub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZCB0byBhbGwga2luZHMgb2YgQ29udGVudCBFbGVtZW50cywgaS5lLiBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRvb2xNZW50b3IiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUb29sIE1lbnRvciBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yayBhIFdvcmsgUHJvZHVjdCBlaXRoZXIgaW4gdGhlIGNvbnRleHQgb2Ygb3IgaW5kZXBlbmRlbnQgZnJvbSBhIFRhc2sgb3IgQWN0aXZpdHkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldoaXRlcGFwZXIiIGVTdXBlclR5cGVzPSIjLy9Db25jZXB0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGl0ZXBhcGVycyBhcmUgYSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVybURlZmluaXRpb24iIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGVybURlZmluaXRpb25zIGRlZmluZSBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUaGV5IGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcmFjdGljZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByYWN0aWNlIHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAmcXVvdDtNYW5hZ2UgUmlza3MmcXVvdDssICZxdW90O0NvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSZxdW90OywgJnF1b3Q7QXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCZxdW90OywgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJQcmFjdGljZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1ByYWN0aWNlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250ZW50UmVmZXJlbmNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWN0aXZpdHlSZWZlcmVuY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BY3Rpdml0eSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXVzYWJsZUFzc2V0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUmV1c2FibGUgQXNzZXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZyYjeEQ7JiN4QTtob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaXNjaXBsaW5lIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERpc2NpcGxpbmUgaXMgYSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuJiN4RDsmI3hBO0EgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFza3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2siLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlV29ya2Zsb3dzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BY3Rpdml0eSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgQ2F0ZWdvcnkgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVTZXQiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9sZSBTZXQgb3JnYW5pemVzIFJvbGVzIGludG8gY2F0ZWdvcmllcy4gIEl0IGlzIHVzZWQgdG8gZ3JvdXAgcm9sZXMgdG9nZXRoZXIgdGhhdCBoYXZlIGNlcnRhaW4gY29tbW9uYWxpdGllcy4gIEZvciBleGFtcGxlLCB0aGUgJnF1b3Q7QW5hbHlzdHMmcXVvdDsgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICZxdW90O0J1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCZxdW90OywgJnF1b3Q7U3lzdGVtIEFuYWx5c3QmcXVvdDssIGFzIHdlbGwgYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIFNwZWNpZmllciZxdW90OyByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRvbWFpbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRG9tYWluIGlzIGEgcmVmaW5lYWJsZSBoaWVyYXJjaHkgZ3JvdXBpbmcgcmVsYXRlZCB3b3JrIHByb2R1Y3RzLiAgSW4gb3RoZXIgd29yZHMsIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyB0byBiZSBjYXRlZ29yaXplZCBvbmx5IGF0IHRoZSBsZWFmLWxldmVsIG9mIHRoaXMgaGllcmFyY2h5LiYjeEQ7JiN4QTtEb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JrUHJvZHVjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YmRvbWFpbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RvbWFpbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIFByb2R1Y3QgVHlwZSBpcyBhIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgJnF1b3Q7Q2xhc3MgRGlhZ3JhbSZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICZxdW90O1NwZWNpZmljYXRpb24mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtQcm9kdWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzY2lwbGluZUdyb3VwaW5nIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEaXNjaXBsaW5lIEdyb3VwaW5ncyBhcmUgdXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAmcXVvdDtTb2Z0d2FyZSBEaXNjaXBsaW5lcyZxdW90OyB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICZxdW90O1JlcXVpcmVtZW50cyBNYW5hZ2VtZW50JnF1b3Q7IG9yICZxdW90O1Rlc3RpbmcmcXVvdDs7ICZxdW90O0lUIEluZnJhc3RydWN0dXJlIE1hbmFnZW1lbnQmcXVvdDsgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAmcXVvdDtJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyZxdW90OywgJnF1b3Q7SVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyZxdW90Oywgb3IgJnF1b3Q7SVQgRW5hYmxpbmcgU2VydmljZXMmcXVvdDsuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpc2NpcGxpbmVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaXNjaXBsaW5lIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRvb2wiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVG9vbCBpcyBhIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sTWVudG9ycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVG9vbE1lbnRvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlU2V0R3JvdXBpbmciIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9sZVNldHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVTZXQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcnkiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ3VzdG9tIENhdGVnb3J5IGlzIGEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAmcXVvdDtUZXN0aW5nJnF1b3Q7IGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhdGVnb3JpemVkRWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJDYXRlZ29yaWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZWxpdmVyeSBQcm9jZXNzZXMgaXMgYSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuJiN4RDsmI3hBO0EgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlZHVjYXRpb25NYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb21tdW5pY2F0aW9uc01hdGVyaWFscyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3MiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBpcyBhIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuJiN4RDsmI3hBO0NvcmUgTWV0aG9kIENvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgdmVyeSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVGh1cywgYSBwcm9jZXNzIGlzIGEgc2V0IG9mIHBhcnRpYWxseSBvcmRlcmVkIHdvcmsgZGVzY3JpcHRpb25zIGludGVuZGVkIHRvIHJlYWNoIGEgaGlnaGVyIGRldmVsb3BtZW50IGdvYWwsIHN1Y2ggYXMgdGhlIHJlbGVhc2Ugb2YgYSBzcGVjaWZpYyBzb2Z0d2FyZSBzeXN0ZW0uICBBIHByb2Nlc3MgYW5kIHRoZSBwcm9jZXNzIG1ldGEtbW9kZWwgc3RydWN0dXJlIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGZvY3VzZXMgb24gdGhlIGxpZmVjeWNsZSBhbmQgdGhlIHNlcXVlbmNpbmcgb2Ygd29yayBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRvIGFjaGlldmUgdGhpcyBpdCB1c2VzIHRoZSBEZXNjcmlwdG9yIGNvbmNlcHQgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIGFsbG93aW5nIGRlZmluaW5nIHRpbWUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMgb2YgdGhlIHJlZmVyZW5jZWQgY29udGVudCAoZS5nLiBkZWZpbmluZyBhIGZvY3VzIG9uIGRpZmZlcmVudCBzdGVwcyBvZiB0aGUgc2FtZSBUYXNrIGFuZCBwcm92aWRpbmcgaW5wdXQgV29yayBQcm9kdWN0cyBpbiBkaWZmZXJlbnQgc3RhdGVzIHdpdGhpbiB0aGUgZGlmZmVyZW50IFBoYXNlcyBvZiBhIHByb2Nlc3MgbGlmZWN5Y2xlIGluIHdoaWNoIHRoZSBzYW1lIFRhc2sgaXMgcGVyZm9ybWVkKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5jbHVkZXNQYXR0ZXJucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVmYXVsdENvbnRleHQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbGlkQ29udGV4dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4mI3hEOyYjeEE7QSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6JiN4RDsmI3hBOy0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuJiN4RDsmI3hBOy0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuJiN4RDsmI3hBOy0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4mI3hEOyYjeEE7QSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgZmluaXNoZWQgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgSXQgdXNlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFzIGFsbCBvdGhlciBQcm9jZXNzIFR5cGVzIHRvIHJlcHJlc2VudCB0ZW1wbGF0ZXMgZm9yIHByb2plY3QgcGxhbnMuICBIb3dldmVyLCBjZXJ0YWluIHBsYW5uaW5nIGRlY2lzaW9ucyBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kL29yIHJlZm9ybWF0dGVkIHRvIGJlIHJlYWR5IGZvciBleHBvcnQgdG8gYSBzcGVjaWZpYyBwbGFubmluZyB0b29sLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZGVjaXNpb25zIGFyZTogYSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJlcHJlc2VudCBhIHBsYW4gZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gaW4gYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IHByb2plY3QsIHdoaWNoIGZyIGV4YW1wbGUgZGlzdGluZ3Vpc2hlcyBlYXJseSBmcm9tIGxhdGUgaXRlcmF0aW9ucyBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2Ugb2YgYSBwcm9qZWN0OyBpZiB0aGUgdGFyZ2V0ZWQgcGxhbm5pbmcgdG9vbCBjYW5ub3QgcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgb2YgVGFzaywgdGhlbiB0aGVzZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmU7IGNlcnRhaW4gcmVwZXRpdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCwgZS5nLiBzdGF0aW5nIHRoYXQgYSBjeWNsZSBvZiBzcGVjaWZpYyBUYXNrIGdyb3VwZWQgaW4gYW4gQWN0aXZpdHkgaGF2ZSB0byBiZSByZXBlYXRlZCBuLXRpbWVzOyBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VkT25Qcm9jZXNzZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb2Nlc3MiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9hZG1hcCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvYWRtYXAgaXMgYSBzcGVjaWFsIEd1aWRhbmNlIFR5cGUgd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4mI3hEOyYjeEE7QW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50IiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc1BhY2thZ2UgIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBpcyBhIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuJiN4RDsmI3hBO1VNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAmcXVvdDtibGFjayBib3gmcXVvdDsuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICZxdW90O3JlYWxpemF0aW9uJnF1b3Q7IGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUHJvY2VzcyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RQYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm9jZXNzIFBhY2thZ2UgaXMgYSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4mI3hEOyYjeEE7QSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvY2Vzc0VsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9jZXNzRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW0iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZSBjb21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFza0Rlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZUlPIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBQcm9jZXNzIENvbXBvbmVudCBhcHBsaWNhdGlvbiBpbiBhIFByb2Nlc3MsIGkuZS4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIFByb2Nlc3MuICBUaGUgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciBpcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIHRoZSBkZXRhaWxzIG9mIHRoZSBjb21wb25lbnQgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCB0byBwcm92aWRlIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMgc3VjaCBhcyBpdCBvd24gcHJlZGVjZXNzb3JzIGFuZCBzdWNjZXNzb3JzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUHJvY2Vzc0NvbXBvbmVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RQbHVnaW4iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFBsdWdpbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4mI3hEOyYjeEE7TWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuJiN4RDsmI3hBO1NwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGFja2FnZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmFyaWFiaWxpdHlFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGNsYXNzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudCB0aGF0IHByb3ZpZGVzIG5ldyBjYXBhYmlsaXRpZXMgZm9yIGNvbnRlbnQgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gQ29udGVudCBFbGVtZW50cyBvciBhbnkgb3RoZXIgTWV0aG9kIEVsZW1lbnQgdGhhdCBkZXJpdmVzIGZyb20gaXQuICBJdCBoYXMgYmVlbiBwbGFjZWQgaW4tYmV0d2VlbiB0aGUgY2xhc3NlcyBNZXRob2QgRWxlbWVudCBhbmQgQ29udGVudCBFbGVtZW50IGluIHRoZSBvdmVyYWxsIFVNQSB0YXhvbm9teSBvZiBjbGFzc2VzIHVzaW5nIHRoZSBVTUwgMi4wIHBhY2thZ2UgbWVyZ2UgbWVjaGFuaXNtLiAgVGhlIGFzc29jaWF0aW9uIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHNoYWxsIG9ubHkgYmUgaW5zdGFudGlhdGVkIGJldHdlZW4gdHdvIHN1YmNsYXNzZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgc2FtZSB0eXBlLiAgVGhlIGVsZW1lbnQgb24gdmFyYWliaWxpdHlTcGVjaWFsRWxlbWVudCBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgZGVmaW5lcyBhIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZSBkZWZpbmluZyB0aGUgbmF0dXJlIG9mIHRoZSByZWxhdGlvbnNoaXAgdXNpbmcgYSBsaXRlcmFsIGZyb20gdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuJiN4RDsmI3hBO1ZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIG1ldGEtbW9kZWwgcGFja2FnZSBNZXRob2QgUGx1Z2lucyBhZGRzIHRoZSBjYXBhYmlsaXRpZXMgb2YgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gTWV0aG9kIEVsZW1lbnRzIHRoYXQgZGVyaXZlIGZyb20gaXQuICBCeSBkZWZhdWx0IGFsbCBDb250ZW50IEVsZW1lbnRzIHN1Y2ggYXMgUm9sZSwgVGFzaywgR3VpZGFuY2UgVHlwZXMsIG9yIEFjdGl2aXRpZXMgYXJlIGRlZmluZWQgdG8gYmUgVmFyaWFiaWxpdHkgRWxlbWVudHMuJiN4RDsmI3hBO1ZhcmlhYmlsaXR5IGFuZCBleHRlbnNpb24gcHJvdmlkZXMgdW5pcXVlIG1lY2hhbmlzbXMgZm9yIGN1c3RvbWl6aW5nIG1ldGhvZCBjb250ZW50IHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LCBidXQgYnkganVzdCBiZSBhYmxlIHRvIGRlc2NyaWJlIHdpdGggc2VwYXJhdGUgb2JqZWN0cyB0aGUgZGlmZmVyZW5jZXMgKGFkZGl0aW9ucywgY2hhbmdlcywgb21pc3Npb25zKSByZWxhdGl2ZSB0byB0aGUgb3JpZ2luYWwuICBUaGlzIHBsdWctaW4gY29uY2VwdCBhbGxvd3MgdXNlcnMgdG8gZmFjdG9yIHRoZWlyIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gaW50ZXJyZWxhdGVkIHVuaXRzIGFuZCBldmVuIHRvIGFyY2hpdGVjdCBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGxheWVycyB0aGF0IGV4dGVuZCBlYWNoIG90aGVyIHdpdGggbmV3IGNhcGFiaWxpdGllcy4gIFRoZSByZXN1bHRpbmcgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2lnbiBjYW4gYmUgZHluYW1pY2FsbHkgY29tYmluZWQgYW5kIGFwcGxpZWQgb24gZGVtYW5kIHVzaW5nIHRoZSBpbnRlcnByZXRhdGlvbiBydWxlcyBkZWZpbmVkIGZvciBWYXJpYWJpbGl0eSBFbGVtZW50IFNwZWNpYWxpemF0aW9ucyBhc3NlbWJsaW5nIHRvIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0aGUgbW9zdCBhY2N1cmF0ZSBtZXRob2QgYW5kIHByb2Nlc3MgZGVzY3JpcHRpb25zIHBvc3NpYmxlLiAgSXQgYWxzbyBhbGxvd3MgcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRvIGV4dGVuZHMgYW5kIHRhaWxvciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIHRoZXkgZG8gbm90IG93biBhbmQgdG8gZWFzaWx5IHVwZ3JhZGUgdG8gbmV3ZXIgdmVyc2lvbnMgYnkgc2ltcGx5IHJlYXBwbHkgdGhlaXIgcGVyc29uYWwgY2hhbmdlcyB0byB0aGVzZSB1cGdyYWRlcy4mI3hEOyYjeEE7VmFyaWFiaWxpdHkgRWxlbWVudCBkZWZpbmVzIHR3byB0eXBlcyBvZiB2YXJpYWJpbGl0eSBhbmQgb25lIHR5cGUgb2YgZXh0ZW5zaW9uIHdoaWNoIGFyZSBmb3JtYWxseSBkZWZpbmVkIGZvciB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiBlVHlwZT0iIy8vVmFyaWFiaWxpdHlUeXBlIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJuYSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIGluIGluc3RhbmNlIG9mIHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxpemF0aW9uIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIFZhcmlhYmlsaXR5IEVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUgZXhpc3RzLCB0aGVuIHRoZSB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHNwZWNpZmllcyBob3cgdGhlIGVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbEVsZW1lbnQgZW5kIG9mIHRoZSBhc3NvY2lhdGlvbiBjaGFuZ2VzIHRoZSBDb250ZW50IEVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgZW5kLiBTZWUgdGhlIFZhcmlhYmlsaXR5IFR5cGUgZW51bWVyYXRpb24gY2xhc3MgZm9yIGRlZmluaXRpb25zIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHZhcmlhYmlsaXR5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vVmFyaWFiaWxpdHlFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iVmFyaWFiaWxpdHlUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJWYXJpYWJpbGl0eSBUeXBlIGlzIGFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Im5hIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJjb250cmlidXRlcyIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImV4dGVuZHMiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJyZXBsYWNlcyIgdmFsdWU9IjMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBDb250cmlidXRpb24gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBleHRlcm5hbGx5IGRlZmluZXMgYWRkaXRpb25zIGFuZCBjaGFuZ2VzIHRvIGFuIGV4aXN0aW5nIFByb2Nlc3Mgd2l0aG91dCBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIGV4aXN0aW5nIFByb2Nlc3MuICBJdCBhY2hpZXZlcyB0aGlzIGJ5IGRlc2NyaWJpbmcgdGhlc2UgYWRkaXRpb25zIGFuZCBjaGFuZ2VzIGluIGEgc2VwYXJhdGUgUHJvY2VzcyBzdHJ1Y3R1cmUuICBUaGlzIHN0cnVjdHVyZSdzIGVsZW1lbnRzIHJlbGF0ZSB0byB0aGUgb3RoZXIgUHJvY2VzcycgZWxlbWVudHMgdXNpbmcgQ29udHJpYnV0ZXMgYW5kIFJlcGxhY2UgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb25zLiAgUHJvY2VzcyBDb250cmlidXRpb25zIGFyZSBub3JtYWxseSBwYWNrYWdlZCB3aXRoIE1ldGhvZCBQbHVnaW5zIHRoYXQgZXh0ZW5kIGV4aXN0aW5nIE1ldGhvZCBQbHVnaW4gd2l0aCBuZXcgY2FwYWJpbGl0aWVzLiYjeEQ7JiN4QTtBIFByb2Nlc3MgQ29udHJpYnV0aW9uIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgYXBwbGllcyB0aGUgc2VtYW50aWNzIG9mIHRoZSBDb250cmlidXRlcyBhbmQgUmVwbGFjZXMgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gb24gUHJvY2Vzc2VzLiAgQSBQcm9jZXNzIENvbnRyaWJ1dGlvbiBpcyBhIGtpbmQgb2YgJ3Byb2Nlc3MgcGx1Zy1pbicgdGhhdCAncGx1Z3MnIGFkZGl0aW9uYWwgYnJlYWtkb3duIHN0cnVjdHVyZXMgaW50byBhbiBleGl0aW5nIHByb2Nlc3MgYW5kIHRoZXJlZm9yZSB1cGRhdGVzIGl0IGEtcG9zdGVyaW9yaSB3aXRoIG5ldyBvciBjaGFuZ2VkIGNhcGFiaWxpdGllcy4gIFR5cGljYWwgYXBwbGljYXRpb25zIG9mIFByb2Nlc3MgQ29udHJpYnV0aW9ucyBhcmUgTWV0aG9kIFBsdWdpbnMgdGhhdCBhZGQgY29udGVudCBmcm9tIHNwZWNpZmljIGFyZWFzIHRvIGFuIGV4aXN0aW5nIGRvbWFpbi4gIEluIGFkZGl0aW9uIHRvIGp1c3QgY29udHJpYnV0aW5nIG5ldyBtZXRob2QgY29udGVudCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgVGFzayBhbmQgV29yayBQcm9kdWN0cywgUHJvY2VzcyBDb250cmlidXRpb25zIGNhbiBhbHNvIGRlZmluZSB3aGVyZSBpbiB0aGUgUHJvY2Vzc2VzIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgd2l0aCB0aGlzIG1ldGhvZCBjb250ZW50IHRob3NlIG5ldyBhZGRpdGlvbnMgc2hvdWxkIGJlIGFwcGxpZWQuICBNb3Jlb3ZlciwgaXQgYWxsb3dzIGRlZmluaW5nIHdob2xlIG5ldyBvciBjaGFuZ2VkIEFjdGl2aXRpZXMgd2l0aGluIHRoZXNlIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZVByb2Nlc3MiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9jZXNzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFVuaXQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgVW5pdCBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dGhvcnMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhbmdlRGF0ZSIgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29weXJpZ2h0U3RhdGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBDb25maWd1cmF0aW9uIGlzIGEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQbHVnaW5TZWxlY3Rpb24iCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQYWNrYWdlU2VsZWN0aW9uIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3NWaWV3cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlZmF1bHRWaWV3IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VDb25maWd1cmF0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRmFtaWx5IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZWxpdmVyeSBNb2RlbCBGYW1pbHkgaXMgYSBjb252ZW5pZW50IGdyb3VwaW5nIG9mIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyBvZiBpbnRlcmVzdCB0byBzb21lIHNwZWNpZmljIHVzZXIgY29tbXVuaXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyeVByb2Nlc3NlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGVsaXZlcnlQcm9jZXNzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZExpYnJhcnkiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQbHVnaW5zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlZmluZWRDb25maWd1cmF0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMi91bWEuZ2VubW9kZWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4yL3VtYS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E2OTA1OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4yL3VtYS5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgY29weXJpZ2h0VGV4dD0iSUJNIFJhdGlvbmFsIFNvZnR3YXJlIgotICAgIG1vZGVsRGlyZWN0b3J5PSIvY29tLmlibS51bWEvc3JjIiBlZGl0RGlyZWN0b3J5PSIvY29tLmlibS51bWEuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL2NvbS5pYm0udW1hLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0iY29tLmlibS51bWEiIHRlbXBsYXRlRGlyZWN0b3J5PSIvY29tLmlibS51bWEuZWNvcmUvdGVtcGxhdGVzIiBydW50aW1lSmFyPSJ0cnVlIgotICAgIGR5bmFtaWNUZW1wbGF0ZXM9InRydWUiIG1vZGVsTmFtZT0iVW1hIiBlZGl0UGx1Z2luQ2xhc3M9ImNvbS5pYm0udW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW4iCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9ImNvbS5pYm0udW1hLnByZXNlbnRhdGlvbi5VbWFFZGl0b3JQbHVnaW4iIG5vbk5MU01hcmtlcnM9InRydWUiCi0gICAgcm9vdEV4dGVuZHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3QiIHJvb3RFeHRlbmRzQ2xhc3M9ImNvbS5pYm0udW1hZi5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0IgotICAgIHJvb3RJbXBsZW1lbnRzSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkludGVybmFsRURhdGFPYmplY3QiIHN1cHByZXNzRU1GVHlwZXM9InRydWUiCi0gICAgZmVhdHVyZU1hcFdyYXBwZXJJbnRlcmZhY2U9ImNvbW1vbmouc2RvLlNlcXVlbmNlIiBmZWF0dXJlTWFwV3JhcHBlckludGVybmFsSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnV0aWwuRVNlcXVlbmNlIgotICAgIGZlYXR1cmVNYXBXcmFwcGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8udXRpbC5CYXNpY0VTZXF1ZW5jZSI+Ci0gIDxmb3JlaWduTW9kZWw+QzpcSG9tZVxwaFROR1xUTkdfZG9jc1xPT0FEXENvbnRlbnRBcmNoaXRlY3R1cmVcTW9kZWxzXFVNQTAyXFVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmUubWRsPC9mb3JlaWduTW9kZWw+Ci0gIDxzdGF0aWNQYWNrYWdlcz5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1NETzwvc3RhdGljUGFja2FnZXM+Ci0gIDxtb2RlbFBsdWdpblZhcmlhYmxlcz5FTUZfQ09NTU9OSl9TRE89b3JnLmVjbGlwc2UuZW1mLmNvbW1vbmouc2RvPC9tb2RlbFBsdWdpblZhcmlhYmxlcz4KLSAgPG1vZGVsUGx1Z2luVmFyaWFibGVzPkVNRl9FQ09SRV9TRE89b3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkbzwvbW9kZWxQbHVnaW5WYXJpYWJsZXM+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IlVtYSIgYmFzZVBhY2thZ2U9ImNvbS5pYm0iIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBlY29yZVBhY2thZ2U9InVtYS5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9maW5pc2hUb1N0YXJ0Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvZmluaXNoVG9GaW5pc2giLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvU3RhcnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvRmluaXNoIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbmEiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2NvbnRyaWJ1dGVzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9leHRlbmRzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9yZXBsYWNlcyIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9EYXRlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9VcmkiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1N0cmluZyIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU2V0Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9TZXF1ZW5jZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vSW50ZWdlciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NsYXNzaWZpZXIiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UeXBlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL05hbWVkRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGFja2FnZWFibGVFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGFja2FnZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL05hbWVzcGFjZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvZ3VpZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvYnJpZWZEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L293bmVkUnVsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L3N1cHByZXNzZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L29yZGVyaW5nR3VpZGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29uc3RyYWludCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29uc3RyYWludC9ib2R5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9zdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY29uY2VwdHNBbmRQYXBlcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9jaGVja2xpc3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvZ3VpZGVsaW5lcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2V4YW1wbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvYXNzZXRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3ByZXNlbnRhdGlvbk5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3ByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9zaGFwZWljb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvbm9kZWljb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vbWFpbkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9zZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9rZXlDb25zaWRlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TZWN0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3NlY3Rpb25OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2VjdGlvbi9zZWN0aW9uRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VjdGlvbi9zdWJTZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlY3Rpb24vcHJlZGVjZXNzb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlL21vZGlmaWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZS9yZXNwb25zaWJsZUZvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L2VzdGltYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QvcmVwb3J0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L3RlbXBsYXRlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L3Rvb2xNZW50b3JzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rhc2siPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svcGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL21hbmRhdG9yeUlucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9vdXRwdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9vcHRpb25hbElucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3N0ZXBzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay90b29sTWVudG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL2VzdGltYXRlIi8+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+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvY29uY2VwdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9leGFtcGxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2d1aWRlbGluZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9yZXVzYWJsZUFzc2V0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNSZXBlYXRhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNPbmdvaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNFdmVudERyaXZlbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2xpbmtUb1ByZWRlY2Vzc29yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlZml4Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9pc1BsYW5uZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2hhc011bHRpcGxlT2NjdXJyZW5jZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2lzT3B0aW9uYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZXNlbnRlZEFmdGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVzZW50ZWRCZWZvcmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wbGFubmluZ0RhdGEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3N1cGVyQWN0aXZpdGllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NaWxlc3RvbmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9JdGVyYXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QaGFzZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RlYW1Qcm9maWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS90ZWFtUm9sZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS9zdXBlclRlYW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS9zdWJUZWFtIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9Sb2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvcGVyZm9ybXNBZGRpdGlvbmFsbHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9hc3Npc3RzSW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL21vZGlmaWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvcGVyZm9ybXNBc093bmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya09yZGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrT3JkZXIvbGlua1R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrT3JkZXIvcHJlZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhL3N0YXJ0RGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YS9maW5pc2hEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhL3JhbmsiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpcHRvci9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL1Rhc2siLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2Fzc2lzdGVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9leHRlcm5hbElucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvbWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9vcHRpb25hbElucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivb3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvcGVyZm9ybWVkUHJpbWFyaWx5QnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9zZWxlY3RlZFN0ZXBzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2FjdGl2aXR5RW50cnlTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9hY3Rpdml0eUV4aXRTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9Xb3JrUHJvZHVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9leHRlcm5hbElucHV0VG8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0ZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL21hbmRhdG9yeUlucHV0VG8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci93b3JrZWRPbkJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL09wdGlvbmFsSW5wdXRUbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9vdXRwdXRGcm9tIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2RlbGl2ZXJhYmxlUGFydHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvcmVzcG9uc2libGVSb2xlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbXBvc2l0ZVJvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbXBvc2l0ZVJvbGUvYWdncmVnYXRlZFJvbGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uL3VzYWdlR3VpZGFuY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbi9hbHRlcm5hdGl2ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL2hvd3RvU3RhZmYiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3NjYWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcHJvamVjdENoYXJhY3RlcmlzdGljcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Jpc2tMZXZlbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL2VzdGltYXRpbmdUZWNobmlxdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vdHlwZU9mQ29udHJhY3QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vZXh0ZXJuYWxJZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi9zY29wZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi91c2FnZU5vdGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpcHRvckRlc2NyaXB0aW9uL3JlZmluZWREZXNjcmlwdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db25jZXB0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2hlY2tsaXN0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRXhhbXBsZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0d1aWRlbGluZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VzdGltYXRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRXN0aW1hdGUvZXN0aW1hdGlvbk1ldHJpYyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Fc3RpbWF0ZS9lc3RpbWF0aW9uQ29uZGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VzdGltYXRpbmdNZXRyaWMiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZXBvcnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZW1wbGF0ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rvb2xNZW50b3IiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9XaGl0ZXBhcGVyIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGVybURlZmluaXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QcmFjdGljZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ByYWN0aWNlL3N1YlByYWN0aWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ByYWN0aWNlL2NvbnRlbnRSZWZlcmVuY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJhY3RpY2UvYWN0aXZpdHlSZWZlcmVuY2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JldXNhYmxlQXNzZXQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaXNjaXBsaW5lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaXNjaXBsaW5lL3Rhc2tzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZS9yZWZlcmVuY2VXb3JrZmxvd3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZVNldCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZVNldC9yb2xlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Eb21haW4iPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RvbWFpbi93b3JrUHJvZHVjdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRG9tYWluL3N1YmRvbWFpbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdFR5cGUvd29ya1Byb2R1Y3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZUdyb3VwaW5nL2Rpc2NpcGxpbmVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rvb2wiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rvb2wvdG9vbE1lbnRvcnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZVNldEdyb3VwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlU2V0R3JvdXBpbmcvcm9sZVNldHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5L2NhdGVnb3JpemVkRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9zdWJDYXRlZ29yaWVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2VzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzL2VkdWNhdGlvbk1hdGVyaWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzcy9jb21tdW5pY2F0aW9uc01hdGVyaWFscyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzL2luY2x1ZGVzUGF0dGVybnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzL2RlZmF1bHRDb250ZXh0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy92YWxpZENvbnRleHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUvYmFzZWRPblByb2Nlc3NlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2FkbWFwIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9pbnRlcmZhY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQvcHJvY2VzcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NQYWNrYWdlL3Byb2Nlc3NFbGVtZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZS9kaWFncmFtcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9pbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlL2ludGVyZmFjZUlPIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci9Qcm9jZXNzQ29tcG9uZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFBsdWdpbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luL3VzZXJDaGFuZ2VhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBsdWdpbi9tZXRob2RQYWNrYWdlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBsdWdpbi9iYXNlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5RWxlbWVudC92YXJpYWJpbGl0eVR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29udHJpYnV0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29udHJpYnV0aW9uL2Jhc2VQcm9jZXNzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFVuaXQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvYXV0aG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY2hhbmdlRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY2hhbmdlRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L3ZlcnNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L2NvcHlyaWdodFN0YXRlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL21ldGhvZFBsdWdpblNlbGVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vbWV0aG9kUGFja2FnZVNlbGVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vcHJvY2Vzc1ZpZXdzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9kZWZhdWx0VmlldyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vYmFzZUNvbmZpZ3VyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NGYW1pbHkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NGYW1pbHkvZGVsaXZlcnlQcm9jZXNzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kTGlicmFyeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZExpYnJhcnkvbWV0aG9kUGx1Z2lucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L3ByZWRlZmluZWRDb25maWd1cmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4zL3Byb3BlcnRpZXMudHh0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMy9wcm9wZXJ0aWVzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZiM2Y5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4zL3Byb3BlcnRpZXMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1Ob24tTkxTIE1hcmtlcnM6CXRydWUKLUNvbnRhaW5tZW50IFByb3hpZXM6CXRydWUKLVN1cHByZXNzIEVNRiBNZXRhZGF0YToJZmFsc2UKLVJvb3QgRXh0ZW5kcyBDbGFzczoJb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0Ci1Sb290IEV4dGVuZHMgSW50ZXJmYWNlOglvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdAotQ29kZSBGb3JtYXR0aW5nOgl0cnVlCi1EeW5hbWljIFRlbXBsYXRlczoJdHJ1ZQotVGVtcGxhdGUgRGlyZWN0b3J5Ogkvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjMvdW1hLmVjb3JlIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMy91bWEuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYzU3NzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMy91bWEuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxMjI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InVtYSIKLSAgICBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zL3VtYS5lY29yZSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmVwZi51bWEiPgotICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iMDMiLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGF0ZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5EYXRlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEYXRhIHR5cGUgdXNlZCBmb3IgYXR0cmlidXRlcyBvZiBtZXRhLW1vZGVsIGNsYXNzZXMgb2YgdGhlIHR5cGUgRGF0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVXJpIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5uZXQuVVJJIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEYXRhIHR5cGUgdXNlZCBmb3IgYXR0cmlidXRlcyBvZiBtZXRhLW1vZGVsIGNsYXNzZXMgdGhhdCBwb2ludCB0byByZXNvdXJjZXMgc3VjaCBhcyBmaWxlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVW5saW1pdGVkTmF0dXJhbCIgaW5zdGFuY2VDbGFzc05hbWU9ImludCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN0cmluZyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTZXQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuU2V0Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU2VxdWVuY2UiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuTGlzdCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkludGVnZXIiIGluc3RhbmNlQ2xhc3NOYW1lPSJpbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJGbG9hdCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5GbG9hdCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNsYXNzaWZpZXIiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIENsYXNzaWZpZXIuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlR5cGUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOYW1lZEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuICBEZWZpbmVkIHRoYXQgZXZlcnkgZWxlbWVudCBoYXMgYSBuYW1lLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9OYW1lZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9OYW1lc3BhY2UgIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZXNwYWNlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVzcGFjZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IGNsYXNzIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGlzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzIE1ldGhvZCBFbGVtZW50IGlzIHRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIGNsYXNzZXMgYW5kIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGV2ZXJ5IG90aGVyIGVsZW1lbnQgdHlwZSBvZiB0aGlzIG1vZGVsLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuICBNZXRob2QgRWxlbWVudCBpbmhlcml0cyB0aGUgTmFtZSBhdHRyaWJ1dGUgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50J3Mgc3VwZXIgY2xhc3MuICBFdmVyeSBlbGVtZW50IGRlZmluZWQgYXMgYSBVTUEgaW5zdGFuY2UgaXMgZGVyaXZlZCBmcm9tIE1vZGVsIEVsZW1lbnQuICBFdmVyeSBNZXRob2QgRWxlbWVudCBpbi1zdGFuY2UgaXMgYXQgbGVhc3QgZGVmaW5lZCBieSBhIHVuaXF1ZSBpZCwgYSBuYW1lLCBhcyB3ZWxsIGFzIGJyaWVmIGRlc2NyaXB0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJndWlkIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvd25lZFJ1bGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25zdHJhaW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdXBwcmVzc2VkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgRXh0ZW5kcyBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiB0aGVuIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGluaGVyaXRlZCBNZXRob2QgRWxlbWVudHMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQsIHdoaWNoIGNhbiBiZSBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvbiBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdGhhbiBhbiBpbmhlcml0ZWQgbWV0aG9kIGVsZW1lbnQgdGhlbiBpdCB3aWxsIG5vdCBiZSByZWdhcmRlZCBhcyBpbmhlcml0ZWQgYXQgYWxsLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcmRlcmluZ0d1aWRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBDQVNFIHRvb2wgcmVhbGl6YXRpb25zIG9mIHRoaXMgbW9kZWwgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBsYXlvdXQgYW5kIG9yZGVyaW5nIG9mIHRoZSBtZXRob2QgZWxlbWVudCBhbmQgaXRzIHBhcnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25zdHJhaW50IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb25zdHJhaW50IGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgY29uZGl0aW9uIG9yIHJlc3RyaWN0aW9uIGV4cHJlc3NlZCBpbiBuYXR1cmFsIGxhbmd1YWdlIHRleHQgb3IgaW4gYSBtYWNoaW5lIHJlYWRhYmxlIGxhbmd1YWdlIGZvciB0aGUgcHVycG9zZSBvZiBkZWNsYXJpbmcgc29tZSBvZiB0aGUgc2VtYW50aWNzIG9mIGEgTWV0aG9kIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJvZHkiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIHN0b3JlcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpYmFibGVFbGVtZW50ICMvL1ZhcmlhYmlsaXR5RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGVudCBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LiYjeEQ7JiN4QTtDb250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbmNlcHRzQW5kUGFwZXJzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25jZXB0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNoZWNrbGlzdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NoZWNrbGlzdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJndWlkZWxpbmVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HdWlkZWxpbmUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhhbXBsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0V4YW1wbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCAjLy9DbGFzc2lmaWVyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliYWJsZSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4mI3hEOyYjeEE7VGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlIChzZWUgU2VjdGlvbiA0LjEuNCkuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gJnF1b3Q7cnVwX2FyY2hpdGVjdHVyZV9kb2N1bWVudCZxdW90OyB0byBkaWZmZXJlbnRpYXRlIGZyb20gYSAmcXVvdDtqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50JnF1b3Q7IHdoZXJlYXMgdGhlIGV4dGVybmFsIHByZXNlbnRhdGlvbiB3b3VsZCBhbHdheXMgYmUgJnF1b3Q7QXJjaGl0ZWN0dXJlIERvY3VtZW50JnF1b3Q7LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50YXRpb24iIGVUeXBlPSIjLy9Db250ZW50RGVzY3JpcHRpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNoYXBlaWNvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1VyaSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm9kZWljb24iIGVUeXBlPSIjLy9VcmkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250ZW50IERlc2NyaXB0aW9uIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgc3RvcmUgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+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+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxJZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGFydGlmYWN0LiBVc2VkIGxpa2UgYSBzeW5vbnltLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBhY3RPZk5vdEhhdmluZyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVhc29uc0Zvck5vdE5lZWRpbmciIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJza2lsbHMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXNzaWdubWVudEFwcHJvYWNoZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3lub255bXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdGVybmF0aXZlcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXR0YWNobWVudHMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFkZGl0aW9uYWxJbmZvIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvYmxlbSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGUgUHJhY3RpY2UgYWRkcmVzc2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiYWNrZ3JvdW5kIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdvYWxzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXBwbGljYXRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbHNPZkFkb3B0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb2ludCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IngiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3NpdGlvbiIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZWQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW1FbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtRWxlbWVudC9jb250YWluZXIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGluayIgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRGlhZ3JhbUxpbmsiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1MaW5rL2dyYXBoRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhbmNob3JhZ2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0dyYXBoQ29ubmVjdG9yIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VtYW50aWNNb2RlbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZ3JhcGhFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW1FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1Zpc2libGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lciIgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9jb250YWluZWQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZWZlcmVuY2UiIGVPcHBvc2l0ZT0iIy8vUmVmZXJlbmNlL3JlZmVyZW5jZWQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvcGVydHkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtTGluayIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iem9vbSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2aWV3cG9ydCIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvbGluayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRGlhZ3JhbSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtL2RpYWdyYW1MaW5rIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoQ29ubmVjdG9yIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L2FuY2hvcmFnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVkZ2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0dyYXBoRWRnZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVkZ2UvYW5jaG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlbWFudGljTW9kZWxCcmlkZ2UiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlc2VudGF0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L3NlbWFudGljTW9kZWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbSIgZVR5cGU9IiMvL0RpYWdyYW0iCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtL25hbWVzcGFjZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaW1lbnNpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3aWR0aCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoZWlnaHQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVmZXJlbmNlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlZCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW1FbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1FbGVtZW50L3JlZmVyZW5jZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9wZXJ0eSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2V5IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaEVkZ2UiIGVTdXBlclR5cGVzPSIjLy9HcmFwaEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhbmNob3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSIyIiBlVHlwZT0iIy8vR3JhcGhDb25uZWN0b3IiIGVPcHBvc2l0ZT0iIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFZGdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndheXBvaW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUG9pbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW0iIGVTdXBlclR5cGVzPSIjLy9HcmFwaE5vZGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ6b29tIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZpZXdwb2ludCIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtTGluayIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlhZ3JhbUxpbmsiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUxpbmsvZGlhZ3JhbSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lc3BhY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2RpYWdyYW0iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhOb2RlIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2l6ZSIgZVR5cGU9IiMvL0RpbWVuc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZUluZm8iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnQiIGVUeXBlPSIjLy9NZXRob2RFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9FbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxlYWZFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGV4dEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRleHQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbWFnZSIgZVN1cGVyVHlwZXM9IiMvL0xlYWZFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJpIiBlVHlwZT0iIy8vVXJpIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbWVUeXBlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhpY1ByaW1pdGl2ZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvbHlsaW5lIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhpY1ByaW1pdGl2ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsb3NlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2F5cG9pbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMiIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qb2ludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRWxsaXBzZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoaWNQcmltaXRpdmUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYWRpdXNYIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhZGl1c1kiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm90YXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnRBbmdsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbmRBbmdsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjZW50ZXIiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWN0aXZpdHkiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCAjLy9WYXJpYWJpbGl0eUVsZW1lbnQgIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIEFjdGl2aXR5IGlzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4mI3hEOyYjeEE7QWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJyZWFrZG93bkVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0JyZWFrZG93bkVsZW1lbnQvc3VwZXJBY3Rpdml0aWVzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvYWRtYXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2FkbWFwIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGVja2xpc3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DaGVja2xpc3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uY2VwdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbmNlcHQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhhbXBsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0V4YW1wbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3VpZGVsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJldXNhYmxlQXNzZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzRW5hY3RhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgV29yayBCcmVha2Rvd24gRWxlbWVudCBpcyBhIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1JlcGVhdGFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09uZ29pbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0V2ZW50RHJpdmVuIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGlua1RvUHJlZGVjZXNzb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtPcmRlciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJCcmVha2Rvd24gRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEl0IGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWZpeCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gJnF1b3Q7U1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMmcXVvdDsgd2l0aCBTUkEgaW5kaWNhdGluZyB0aGF0IHRoaXMgQWN0aXZpdHkgYmVsb25ncyB0byB0aGUgJnF1b3Q7U29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzJnF1b3Q7IG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICZxdW90O0N1c3RvbWVyLkFyY2hpdGVjdCZxdW90OyB3b3VsZCBkZWZpbmUgYSAmcXVvdDtDdXN0b21lciZxdW90OyBwcmVmaXggZm9yIHRoZSBSb2xlIERlc2NyaXB0b3IgJnF1b3Q7QXJjaGl0ZWN0JnF1b3Q7IGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzUGxhbm5lZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuJiN4RDsmI3hBOyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXRhaWwgVXNlIENhc2UmcXVvdDsgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzT3B0aW9uYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpc09wdGlvbmFsIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlc2VudGVkQWZ0ZXIiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRlZEJlZm9yZSIgZVR5cGU9IiMvL0JyZWFrZG93bkVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGxhbm5pbmdEYXRhIiBlVHlwZT0iIy8vUGxhbm5pbmdEYXRhIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBlckFjdGl2aXRpZXMiIGVUeXBlPSIjLy9BY3Rpdml0eSIKLSAgICAgICAgZU9wcG9zaXRlPSIjLy9BY3Rpdml0eS9icmVha2Rvd25FbGVtZW50cyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNaWxlc3RvbmUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNaWxlc3RvbmUgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJdGVyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSXRlcmF0aW9uIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuJiN4RDsmI3hBO0l0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQaGFzZSIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQaGFzZSBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLiYjeEQ7JiN4QTtQaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVhbVByb2ZpbGUiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRlYW0gUHJvZmlsZSBpcyBhIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuJiN4RDsmI3hBO1dvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4mI3hEOyYjeEE7SGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZWFtUm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cGVyVGVhbSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1RlYW1Qcm9maWxlIiBlT3Bwb3NpdGU9IiMvL1RlYW1Qcm9maWxlL3N1YlRlYW0iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViVGVhbSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGVhbVByb2ZpbGUiIGVPcHBvc2l0ZT0iIy8vVGVhbVByb2ZpbGUvc3VwZXJUZWFtIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJSb2xlIiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2RpZmllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBPcmRlciByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEIpIGJlbG93KSBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEEpIGJlbG93KSBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9TdGFydCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9GaW5pc2giIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvU3RhcnQiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvRmluaXNoIiB2YWx1ZT0iMyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrT3JkZXIiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBPcmRlciBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgJiN4RDsmI3hBOyhOb3RlLCBXb3JrIE9yZGVyIGlzIG5vdCBtb2RlbGVkIGFzIGFuIEFzc29jaWF0aW9uIENsYXNzIHRvIHByb3ZpZGUgYSBzdHJhaWdodGZvcndhcmQgbWFwcGluZyAgdG8gWE1JIGFuZCBFTUYuKSYjeEQ7JiN4QTtUaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rVHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtPcmRlclR5cGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZpbmlzaFRvU3RhcnQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZCIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvY2VzcyBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuJiN4RDsmI3hBO1Byb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGxhbm5pbmdEYXRhIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlBsYW5uaW5nIERhdGEgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4mI3hEOyYjeEE7UGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LiYjeEQ7JiN4QTsoTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFuayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVzY3JpcHRvciBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuJiN4RDsmI3hBO0Rlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZpdHlFbnRyeVN0YXRlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgJiN4RDsmI3hBO0ZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLiYjeEQ7JiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IldvcmtQcm9kdWN0IiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW1wYWN0ZWRCeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltcGFjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0ZWRCeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyYWJsZVBhcnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza0Rlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCAjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRhc2sgRGVzY3JpcHRvciBpcyBhIERlc2NyaXB0b3IgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4mI3hEOyYjeEE7QSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJUYXNrIiBlVHlwZT0iIy8vVGFzayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzaXN0ZWRCeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZXJuYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dHB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBlcmZvcm1lZFByaW1hcmlseUJ5IiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VsZWN0ZWRTdGVwcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb21wb3NpdGVSb2xlIiBlU3VwZXJUeXBlcz0iIy8vUm9sZURlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29tcG9zaXRlIFJvbGUgaXMgYSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuJiN4RDsmI3hBO0EgQ29tcG9zaXRlIFJvbGUgaXMgYSBncm91cGluZyBvZiBSb2xlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIEFjdGl2aXR5IG9yIFByb2Nlc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgUm9sZXMuICBBIHR5cGljYWwgYXBwbGljYXRpb24gd291bGQgYmUgYSBwcm9jZXNzIGZvciBhIHNtYWxsIHRlYW0gaW4gd2hpY2ggYSBzdGFuZGFyZCBzZXQgb2Ygcm9sZXMgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQgd291bGQgYmUgYWxsIHBlcmZvcm1lZCBieSBvbmUgb3IgbW9yZSByZXNvdXJjZS4gIEJ5IHVzaW5nIENvbXBvc2l0ZSBSb2xlIHRoZSBwcm9jZXNzIHdvdWxkIHN1Z2dlc3QgYSB0eXBpY2FsIGNsdXN0ZXJpbmcgb2YgUm9sZXMgdG8gUmVzb3VyY2VzLiAgQSBDb21wb3NpdGUgUm9sZSBjb3VsZCBwZXJmb3JtIGFsbCBUYXNrcyBkZWZpbmVkIGZvciB0aGUgUm9sZXMgaXQgcmVmZXJzIHRvLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZ2dyZWdhdGVkUm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+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+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVwb3J0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUmVwb3J0IGlzIGEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVtcGxhdGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUZW1wbGF0ZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN1cHBvcnRpbmcgTWF0ZXJpYWxzIGlzIGNhdGNoYWxsIGZvciBvdGhlciB0eXBlcyBvZiBndWlkYW5jZSBub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZCB0byBhbGwga2luZHMgb2YgQ29udGVudCBFbGVtZW50cywgaS5lLiBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRvb2xNZW50b3IiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUb29sIE1lbnRvciBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yayBhIFdvcmsgUHJvZHVjdCBlaXRoZXIgaW4gdGhlIGNvbnRleHQgb2Ygb3IgaW5kZXBlbmRlbnQgZnJvbSBhIFRhc2sgb3IgQWN0aXZpdHkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldoaXRlcGFwZXIiIGVTdXBlclR5cGVzPSIjLy9Db25jZXB0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGl0ZXBhcGVycyBhcmUgYSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVybURlZmluaXRpb24iIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGVybURlZmluaXRpb25zIGRlZmluZSBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUaGV5IGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcmFjdGljZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByYWN0aWNlIHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAmcXVvdDtNYW5hZ2UgUmlza3MmcXVvdDssICZxdW90O0NvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSZxdW90OywgJnF1b3Q7QXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCZxdW90OywgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJQcmFjdGljZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1ByYWN0aWNlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250ZW50UmVmZXJlbmNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWN0aXZpdHlSZWZlcmVuY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BY3Rpdml0eSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucyBxdWFsaWZ5IHRoZSB1c2FnZSBhbmQgYXBwbGljYXRpb24gb2YgZXN0aW1hdGlvbiBtZXRyaWNzIGluIHRoZSBkZXZlbG9wbWVudCBvZiBhbiBhY3R1YWwgZXN0aW1hdGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJldXNhYmxlQXNzZXQiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSZXVzYWJsZSBBc3NldCBwcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbSBmb3IgYSBnaXZlbiBjb250ZXh0LiBUaGUgYXNzZXQgbWF5IGhhdmUgYSB2YXJpYWJpbGl0eSBwb2ludCwgd2hpY2ggaXMgYSBsb2NhdGlvbiBpbiB0aGUgYXNzZXQgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIG9yIGN1c3RvbWl6ZWQgYnkgdGhlIGFzc2V0IGNvbnN1bWVyLiBUaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nJiN4RDsmI3hBO2hvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0YXRlIiBlU3VwZXJUeXBlcz0iIy8vVmVydGV4Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iV29ya1Byb2R1Y3QiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlJlZ2lvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVnaW9uIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9SZWdpb24vU3RhdGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VibWFjaGluZSIgZVR5cGU9IiMvL1N0YXRlTWFjaGluZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWZXJ0ZXgiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZXIiIGVUeXBlPSIjLy9SZWdpb24iCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9SZWdpb24vVmVydGV4Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGdvaW5nIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UcmFuc2l0aW9uIiBlT3Bwb3NpdGU9IiMvL1RyYW5zaXRpb24vc291cmNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluY29taW5nIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UcmFuc2l0aW9uIiBlT3Bwb3NpdGU9IiMvL1RyYW5zaXRpb24vdGFyZ2V0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlZ2lvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlZlcnRleCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVmVydGV4IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9WZXJ0ZXgvY29udGFpbmVyIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlRyYW5zaXRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RyYW5zaXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1RyYW5zaXRpb24vY29udGFpbmVyIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlN0YXRlIiBlVHlwZT0iIy8vU3RhdGUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TdGF0ZS9SZWdpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iU3RhdGVNYWNoaW5lIiBlVHlwZT0iIy8vU3RhdGVNYWNoaW5lIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU3RhdGVNYWNoaW5lL1JlZ2lvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdGF0ZU1hY2hpbmUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlJlZ2lvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVnaW9uIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9SZWdpb24vU3RhdGVNYWNoaW5lIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRyYW5zaXRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJXb3JrRGVmaW5pdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya0RlZmluaXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVyIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUmVnaW9uIiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUmVnaW9uL1RyYW5zaXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic291cmNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vVmVydGV4IiBlT3Bwb3NpdGU9IiMvL1ZlcnRleC9vdXRnb2luZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXJnZXQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9WZXJ0ZXgiIGVPcHBvc2l0ZT0iIy8vVmVydGV4L2luY29taW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBzZXVkb1N0YXRlIiBlU3VwZXJUeXBlcz0iIy8vVmVydGV4Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJQc2V1ZG9TdGF0ZUtpbmQiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iaW5pdGlhbCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iam9pbiIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZvcmsiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJqdW5jdGlvbiIgdmFsdWU9IjMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImNob2ljZSIgdmFsdWU9IjQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImVudHJ5UG9pbnQiIHZhbHVlPSI1Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJleGl0UG9pbnQiIHZhbHVlPSI2Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJ0ZXJtaW5hdGUiIHZhbHVlPSI3Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpc2NpcGxpbmUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGlzY2lwbGluZSBpcyBhIGNhdGVnb3JpemF0aW9uIG9mIHdvcmsgKGkuZS4gVGFza3MgZm9yIE1ldGhvZCBDb250ZW50KSwgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4mI3hEOyYjeEE7QSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXNrcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFzayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJkaXNjaXBsaW5lIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaXNjaXBsaW5lIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWZlcmVuY2VXb3JrZmxvd3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0FjdGl2aXR5Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRDYXRlZ29yeSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGVudCBDYXRlZ29yeSBpcyBhbiBhYnN0cmFjdCBjbGFzcyBnZW5lcmFsaXppbmcgY29udGVudCBjYXRlZ29yeSB0eXBlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZVNldCIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIFNldCBvcmdhbml6ZXMgUm9sZXMgaW50byBjYXRlZ29yaWVzLiAgSXQgaXMgdXNlZCB0byBncm91cCByb2xlcyB0b2dldGhlciB0aGF0IGhhdmUgY2VydGFpbiBjb21tb25hbGl0aWVzLiAgRm9yIGV4YW1wbGUsIHRoZSAmcXVvdDtBbmFseXN0cyZxdW90OyBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgJnF1b3Q7QnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0JnF1b3Q7LCAmcXVvdDtTeXN0ZW0gQW5hbHlzdCZxdW90OywgYXMgd2VsbCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgU3BlY2lmaWVyJnF1b3Q7IHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRG9tYWluIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEb21haW4gaXMgYSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuJiN4RDsmI3hBO0RvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtQcm9kdWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViZG9tYWlucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRG9tYWluIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdFR5cGUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgUHJvZHVjdCBUeXBlIGlzIGEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAmcXVvdDtDbGFzcyBEaWFncmFtJnF1b3Q7LCB3aGljaCBjYXRlZ29yaXplcyB0aGUgQXJ0aWZhY3RzIEFuYWx5c2lzIE1vZGVsLCBEZXNpZ24gTW9kZWwsIFVzZXIgRXhwZXJpZW5jZSBNb2RlbCwgb3IgJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb25zIHRoYXQgZGVmaW5lIGEgc3lzdGVtIHdpdGggYSB3ZWxsLWRlZmluZWQgc3lzdGVtIGJvdW5kYXJ5LCBzdWNoIGFzIHVzZSBjYXNlIG9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb24uICBBIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBjYW4gYmUgY2F0ZWdvcml6ZWQgYXMgYSBTcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgRGlhZ3JhbSBXb3JrIFByb2R1Y3QgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya1Byb2R1Y3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaXNjaXBsaW5lR3JvdXBpbmciIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRpc2NpcGxpbmUgR3JvdXBpbmdzIGFyZSB1c2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICZxdW90O1NvZnR3YXJlIERpc2NpcGxpbmVzJnF1b3Q7IHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQmcXVvdDsgb3IgJnF1b3Q7VGVzdGluZyZxdW90OzsgJnF1b3Q7SVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCZxdW90OyB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICZxdW90O0lUIE9wZXJhdGlvbmFsIFNlcnZpY2VzJnF1b3Q7LCAmcXVvdDtJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzJnF1b3Q7LCBvciAmcXVvdDtJVCBFbmFibGluZyBTZXJ2aWNlcyZxdW90Oy4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlzY2lwbGluZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0Rpc2NpcGxpbmUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVG9vbCIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUb29sIGlzIGEgY29udGFpbmVyL2FnZ3JlZ2F0ZSBmb3IgVG9vbE1lbnRvcnMuICBJdCBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHRoZSB0b29sIGFuZCBpdHMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRvb2xNZW50b3JzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Ub29sTWVudG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVTZXRHcm91cGluZyIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUm9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb2xlU2V0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZVNldCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDdXN0b21DYXRlZ29yeSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDdXN0b20gQ2F0ZWdvcnkgaXMgYSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICZxdW90O1Rlc3RpbmcmcXVvdDsgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2F0ZWdvcml6ZWRFbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGVzY3JpYmFibGVFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YkNhdGVnb3JpZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3MiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlbGl2ZXJ5IFByb2Nlc3NlcyBpcyBhIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4mI3hEOyYjeEE7QSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVkdWNhdGlvbk1hdGVyaWFscyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbW11bmljYXRpb25zTWF0ZXJpYWxzIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2VzcyIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4mI3hEOyYjeEE7Q29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmNsdWRlc1BhdHRlcm5zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DYXBhYmlsaXR5UGF0dGVybiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWZhdWx0Q29udGV4dCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsaWRDb250ZXh0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJuIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgUGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIERpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLiYjeEQ7JiN4QTtBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZTomI3hEOyYjeEE7LSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4mI3hEOyYjeEE7LSBUbyBzdXBwb3J0IGRpcmVjdCBleGVjdXRpb24gaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoYXQgZG9lcyBub3Qgd29yayBmb2xsb3dpbmcgYSB3ZWxsLWRlZmluZWQgcHJvY2VzcywgYnV0IHdvcmtzIGJhc2VkIG9uIGxvb3NlbHkgY29ubmVjdGVkIHByb2Nlc3MgZnJhZ21lbnRzIG9mIGJlc3QgcHJhY3RpY2VzIGluIGEgZmxleGlibGUgbWFubmVyIChlLmcuIEFnaWxlIERldmVsb3BtZW50KS4mI3hEOyYjeEE7LSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgaXMgcHJlcGFyZWQgZm9yIGluc3RhbnRpYXRpb24gYnkgYSBwcm9qZWN0IHBsYW5uaW5nIHRvb2wuICBUeXBpY2FsbHksIGl0IGlzIGNyZWF0ZWQgYmFzZWQgb24gYSBQcm9jZXNzIHN1Y2ggYXMgYSBEZWxpdmVyeSBQcm9jZXNzIGFzIGEgd2hvbGUgKGUuZy4gaW4gY2FzZSBvZiBhIHdhdGVyZmFsbC1iYXNlZCBkZXZlbG9wbWVudCBhcHByb2FjaCkgb3IgaW4gcGFydHMgKGUuZy4gaW4gY2FzZSBvZiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpLiYjeEQ7JiN4QTtBIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgcmVwcmVzZW50cyBhIHBhcnRpYWxseSBmaW5pc2hlZCBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBJdCB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXMgYWxsIG90aGVyIFByb2Nlc3MgVHlwZXMgdG8gcmVwcmVzZW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBwbGFucy4gIEhvd2V2ZXIsIGNlcnRhaW4gcGxhbm5pbmcgZGVjaXNpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlIHRlbXBsYXRlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQvb3IgcmVmb3JtYXR0ZWQgdG8gYmUgcmVhZHkgZm9yIGV4cG9ydCB0byBhIHNwZWNpZmljIHBsYW5uaW5nIHRvb2wuICBFeGFtcGxlcyBmb3Igc3VjaCBkZWNpc2lvbnMgYXJlOiBhIHRlbXBsYXRlIGhhcyBiZWVuIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgcGxhbiBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBpbiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgd2hpY2ggZnIgZXhhbXBsZSBkaXN0aW5ndWlzaGVzIGVhcmx5IGZyb20gbGF0ZSBpdGVyYXRpb25zIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBvZiBhIHByb2plY3Q7IGlmIHRoZSB0YXJnZXRlZCBwbGFubmluZyB0b29sIGNhbm5vdCByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBvZiBUYXNrLCB0aGVuIHRoZXNlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cnVjdHVyZTsgY2VydGFpbiByZXBldGl0aW9ucyBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkLCBlLmcuIHN0YXRpbmcgdGhhdCBhIGN5Y2xlIG9mIHNwZWNpZmljIFRhc2sgZ3JvdXBlZCBpbiBhbiBBY3Rpdml0eSBoYXZlIHRvIGJlIHJlcGVhdGVkIG4tdGltZXM7IGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZWRPblByb2Nlc3NlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvY2VzcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2FkbWFwIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9hZG1hcCBpcyBhIHNwZWNpYWwgR3VpZGFuY2UgVHlwZSB3aGljaCBpcyBvbmx5IHJlbGF0ZWQgdG8gQWN0aXZhdGVzIGFuZCB0aGVyZWZvcmUgaGFzIGJlZW4gYWRkZWQgYnkgdGhpcyBwYWNrYWdlIHRvIHRoZSBsaXN0IG9mIEd1aWRhbmNlIFR5cGVzIHJhdGhlciB0aGFuIGxpc3RlZCBpbiB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZS4gIEEgUm9hZG1hcCByZXByZXNlbnRzIGEgbGluZWFyIHdhbGt0aHJvdWdoIG9mIGFuIEFjdGl2aXR5LCB0eXBpY2FsbHkgYSBQcm9jZXNzLiYjeEQ7JiN4QTtBbiBpbnN0YW5jZSBvZiBhIFJvYWRtYXAgcmVwcmVzZW50cyBpbXBvcnRhbnQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEFjdGl2aXR5IG9yIFByb2Nlc3MgaXQgaXMgcmVsYXRlZCB0by4gIE9mdGVuIGEgY29tcGxleCBBY3Rpdml0eSBzdWNoIGFzIGEgUHJvY2VzcyBjYW4gYmUgbXVjaCBlYXNpZXIgdW5kZXJzdG9vZCBieSBwcm92aWRpbmcgYSB3YWxrdGhyb3VnaCB3aXRoIGEgbGluZWFyIHRocmVhZCBvZiBhIHR5cGljYWwgaW5zdGFudGlhdGlvbiBvZiB0aGlzIEFjdGl2aXR5LiAgSW4gYWRkaXRpb24gdG8gbWFraW5nIHRoZSBwcm9jZXNzIHByYWN0aXRpb25lciB1bmRlcnN0YW5kIGhvdyB3b3JrIGluIHRoZSBwcm9jZXNzIGlzIGJlaW5nIHBlcmZvcm1lZCwgYSBSb2FkbWFwIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IEFjdGl2aXRpZXMgYW5kIFRhc2tzIHJlbGF0ZSB0byBlYWNoIG90aGVyIG92ZXIgdGltZS4gIFJvYWRtYXBzIGFyZSBhbHNvIHVzZWQgdG8gc2hvdyBob3cgc3BlY2lmaWMgYXNwZWN0cyBhcmUgZGlzdHJpYnV0ZWQgb3ZlciBhIHdob2xlIHByb2Nlc3MgcHJvdmlkaW5nIGEga2luZCBvZiBmaWx0ZXIgb24gdGhlIHByb2Nlc3MgZm9yIHRoaXMgaW5mb3JtYXRpb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzUGFja2FnZSAjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29tcG9uZW50IGlzIGEgc3BlY2lhbCBQcm9jZXNzIFBhY2thZ2UgdGhhdCBhcHBsaWVzIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uICBBIFByb2Nlc3MgQ29tcG9uZW50IHJlYWxpemVzIG9uZSBvciBtb3JlIEludGVyZmFjZXMgd2hpY2ggc3BlY2lmeSBpbnB1dHMgYW5kIG91dHB1dHMgb2YgdGhlIGNvbXBvbmVudC4gVGhlcmUgbWlnaHQgYmUgbWFueSBjb21wb25lbnRzIHJlYWxpemluZyB0aGUgc2FtZSBpbnRlcmZhY2VzLCBidXQgdXNpbmcgZGlmZmVyZW50IHRlY2huaXF1ZXMgdG8gYWNoaWV2ZSBzaW1pbGFyIG91dHB1dHMgZm9yIHNpbWlsYXIgaW5wdXRzLiAgV2hlcmVhcyB0aGUgQ29tcG9uZW50IEludGVyZmFjZXMgcmVwcmVzZW50IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucyAoYmxhY2sgYm94IGRlc2NyaXB0aW9ucyBvZiB0aGUgY29tcG9uZW50KSwgZ29vZCBjYW5kaWRhdGVzIGZvciBjb21wb25lbnQgcmVhbGl6YXRpb25zIGNhbiBiZSBmb3VuZCBpbiBDYXBhYmlsaXR5IFBhdHRlcm5zICh3aGl0ZSBib3ggZGVzY3JpcHRpb25zIGZvciB0aGUgY29tcG9uZW50KS4mI3hEOyYjeEE7VU1BIHN1cHBvcnRzIHJlcGxhY2VhYmxlIGFuZCByZXVzYWJsZSBQcm9jZXNzIENvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uIENlcnRhaW4gc2l0dWF0aW9ucyBpbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgbWlnaHQgcmVxdWlyZSB0aGF0IGNvbmNyZXRlIHJlYWxpemF0aW9ucyBvZiBwYXJ0cyBvZiB0aGUgcHJvY2VzcyByZW1haW4gdW5kZWNpZGVkIG9yIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgZXhlY3V0aW5nIHRlYW0gaXRzZWxmIChlLmcuIGluIG91dHNvdXJjaW5nIHNpdHVhdGlvbnMpLiAgVU1BIHByb3ZpZGVzIGEgdW5pcXVlIGNvbXBvbmVudCBjb25jZXB0IGRlZmluaW5nIGludGVyZmFjZXMgZm9yIHdvcmsgcHJvZHVjdCBpbnB1dCBhbmQgb3V0cHV0LCBhbGxvd2luZyB0cmVhdGluZyB0aGUgYWN0dWFsIGRlZmluaXRpb24gb2YgdGhlIHdvcmsgdGhhdCBwcm9kdWNlcyB0aGUgb3V0cHV0cyBhcyBhICZxdW90O2JsYWNrIGJveCZxdW90Oy4gIEF0IGFueSBwb2ludCBkdXJpbmcgYSBwcm9qZWN0IHRoZSBjb21wb25lbnQgJnF1b3Q7cmVhbGl6YXRpb24mcXVvdDsgZGV0YWlsaW5nIHRoZSB3b3JrIGNhbiBiZSBhZGRlZCB0byB0aGUgcHJvY2Vzcy4gIFRoZSBjb21wb25lbnQgYXBwcm9hY2ggYWxzbyBhbGxvd3MgdGhhdCBkaWZmZXJlbnQgc3R5bGVzIG9yIHRlY2huaXF1ZXMgb2YgZG9pbmcgd29yayBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvbmUgYW5vdGhlci4gIEZvciBleGFtcGxlLCBhIHNvZnR3YXJlIGNvZGUgb3V0cHV0IG9mIGEgY29tcG9uZW50IGNvdWxkIGJlIHByb2R1Y2VkIHdpdGggYSBtb2RlbC1kcml2ZW4gZGV2ZWxvcG1lbnQgb3IgYSBjb2RlLWNlbnRyaWMgdGVjaG5pcXVlLiAgVGhlIGNvbXBvbmVudCBjb25jZXB0IGVuY2Fwc3VsYXRlcyB0aGUgYWN0dWFsIHdvcmsgYW5kIGxldHMgdGhlIGRldmVsb3BtZW50IHRlYW0gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSB0ZWNobmlxdWUgYW5kIGZpbGwgdGhlIGNvbXBvbmVudCdzIHJlYWxpemF0aW9uIHdpdGggdGhlaXIgY2hvaWNlIG9mIEFjdGl2aXRpZXMgdGhhdCBwcm9kdWNlIHRoZSByZXF1aXJlZCBvdXRwdXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3MiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9jZXNzIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzUGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFBhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb2Nlc3MgUGFja2FnZSBpcyBhIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LiYjeEQ7JiN4QTtBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzRWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb2Nlc3NFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlhZ3JhbSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlIGNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZVNwZWNpZmljYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlSU8iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFByb2Nlc3MgQ29tcG9uZW50IGFwcGxpY2F0aW9uIGluIGEgUHJvY2VzcywgaS5lLiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmluZyB0aGUgUHJvY2Vzcy4gIFRoZSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIGRldGFpbHMgb2YgdGhlIGNvbXBvbmVudCBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIHRvIHByb3ZpZGUgaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcyBzdWNoIGFzIGl0IG93biBwcmVkZWNlc3NvcnMgYW5kIHN1Y2Nlc3NvcnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9jZXNzQ29tcG9uZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFBsdWdpbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQgIy8vUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgUGx1Z2luIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLiYjeEQ7JiN4QTtNZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4mI3hEOyYjeEE7U3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNlckNoYW5nZWFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBhY2thZ2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGx1Z2luIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhcmlhYmlsaXR5RWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBjbGFzcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBuZXcgY2FwYWJpbGl0aWVzIGZvciBjb250ZW50IHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIENvbnRlbnQgRWxlbWVudHMgb3IgYW55IG90aGVyIE1ldGhvZCBFbGVtZW50IHRoYXQgZGVyaXZlcyBmcm9tIGl0LiAgSXQgaGFzIGJlZW4gcGxhY2VkIGluLWJldHdlZW4gdGhlIGNsYXNzZXMgTWV0aG9kIEVsZW1lbnQgYW5kIENvbnRlbnQgRWxlbWVudCBpbiB0aGUgb3ZlcmFsbCBVTUEgdGF4b25vbXkgb2YgY2xhc3NlcyB1c2luZyB0aGUgVU1MIDIuMCBwYWNrYWdlIG1lcmdlIG1lY2hhbmlzbS4gIFRoZSBhc3NvY2lhdGlvbiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiBzaGFsbCBvbmx5IGJlIGluc3RhbnRpYXRlZCBiZXR3ZWVuIHR3byBzdWJjbGFzc2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIHNhbWUgdHlwZS4gIFRoZSBlbGVtZW50IG9uIHZhcmFpYmlsaXR5U3BlY2lhbEVsZW1lbnQgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGRlZmluZXMgYSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUgZGVmaW5pbmcgdGhlIG5hdHVyZSBvZiB0aGUgcmVsYXRpb25zaGlwIHVzaW5nIGEgbGl0ZXJhbCBmcm9tIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLiYjeEQ7JiN4QTtWYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBtZXRhLW1vZGVsIHBhY2thZ2UgTWV0aG9kIFBsdWdpbnMgYWRkcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIE1ldGhvZCBFbGVtZW50cyB0aGF0IGRlcml2ZSBmcm9tIGl0LiAgQnkgZGVmYXVsdCBhbGwgQ29udGVudCBFbGVtZW50cyBzdWNoIGFzIFJvbGUsIFRhc2ssIEd1aWRhbmNlIFR5cGVzLCBvciBBY3Rpdml0aWVzIGFyZSBkZWZpbmVkIHRvIGJlIFZhcmlhYmlsaXR5IEVsZW1lbnRzLiYjeEQ7JiN4QTtWYXJpYWJpbGl0eSBhbmQgZXh0ZW5zaW9uIHByb3ZpZGVzIHVuaXF1ZSBtZWNoYW5pc21zIGZvciBjdXN0b21pemluZyBtZXRob2QgY29udGVudCB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudCwgYnV0IGJ5IGp1c3QgYmUgYWJsZSB0byBkZXNjcmliZSB3aXRoIHNlcGFyYXRlIG9iamVjdHMgdGhlIGRpZmZlcmVuY2VzIChhZGRpdGlvbnMsIGNoYW5nZXMsIG9taXNzaW9ucykgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsLiAgVGhpcyBwbHVnLWluIGNvbmNlcHQgYWxsb3dzIHVzZXJzIHRvIGZhY3RvciB0aGVpciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGludGVycmVsYXRlZCB1bml0cyBhbmQgZXZlbiB0byBhcmNoaXRlY3QgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBsYXllcnMgdGhhdCBleHRlbmQgZWFjaCBvdGhlciB3aXRoIG5ldyBjYXBhYmlsaXRpZXMuICBUaGUgcmVzdWx0aW5nIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNpZ24gY2FuIGJlIGR5bmFtaWNhbGx5IGNvbWJpbmVkIGFuZCBhcHBsaWVkIG9uIGRlbWFuZCB1c2luZyB0aGUgaW50ZXJwcmV0YXRpb24gcnVsZXMgZGVmaW5lZCBmb3IgVmFyaWFiaWxpdHkgRWxlbWVudCBTcGVjaWFsaXphdGlvbnMgYXNzZW1ibGluZyB0byBwcm9jZXNzIHByYWN0aXRpb25lcnMgdGhlIG1vc3QgYWNjdXJhdGUgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2NyaXB0aW9ucyBwb3NzaWJsZS4gIEl0IGFsc28gYWxsb3dzIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0byBleHRlbmRzIGFuZCB0YWlsb3IgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyB0aGV5IGRvIG5vdCBvd24gYW5kIHRvIGVhc2lseSB1cGdyYWRlIHRvIG5ld2VyIHZlcnNpb25zIGJ5IHNpbXBseSByZWFwcGx5IHRoZWlyIHBlcnNvbmFsIGNoYW5nZXMgdG8gdGhlc2UgdXBncmFkZXMuJiN4RDsmI3hBO1ZhcmlhYmlsaXR5IEVsZW1lbnQgZGVmaW5lcyB0d28gdHlwZXMgb2YgdmFyaWFiaWxpdHkgYW5kIG9uZSB0eXBlIG9mIGV4dGVuc2lvbiB3aGljaCBhcmUgZm9ybWFsbHkgZGVmaW5lZCBmb3IgdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1ZhcmlhYmlsaXR5VHlwZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0ibmEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBpbiBpbnN0YW5jZSBvZiB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsaXphdGlvbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byBWYXJpYWJpbGl0eSBFbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlIGV4aXN0cywgdGhlbiB0aGUgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgaG93IHRoZSBlbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxFbGVtZW50IGVuZCBvZiB0aGUgYXNzb2NpYXRpb24gY2hhbmdlcyB0aGUgQ29udGVudCBFbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IGVuZC4gU2VlIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGVudW1lcmF0aW9uIGNsYXNzIGZvciBkZWZpbml0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiB2YXJpYWJpbGl0eS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1ZhcmlhYmlsaXR5RWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlZhcmlhYmlsaXR5VHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVmFyaWFiaWxpdHkgVHlwZSBpcyBhbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJuYSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iY29udHJpYnV0ZXMiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJleHRlbmRzIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0icmVwbGFjZXMiIHZhbHVlPSIzIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJsb2NhbENvbnRyaWJ1dGlvbiIgdmFsdWU9IjQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImxvY2FsUmVwbGFjZW1lbnQiIHZhbHVlPSI1Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFVuaXQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgVW5pdCBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dGhvcnMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhbmdlRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29weXJpZ2h0U3RhdGVtZW50IiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBDb25maWd1cmF0aW9uIGlzIGEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQbHVnaW5TZWxlY3Rpb24iCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQYWNrYWdlU2VsZWN0aW9uIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3NWaWV3cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlZmF1bHRWaWV3IiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VDb25maWd1cmF0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRmFtaWx5IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZWxpdmVyeSBNb2RlbCBGYW1pbHkgaXMgYSBjb252ZW5pZW50IGdyb3VwaW5nIG9mIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyBvZiBpbnRlcmVzdCB0byBzb21lIHNwZWNpZmljIHVzZXIgY29tbXVuaXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyeVByb2Nlc3NlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGVsaXZlcnlQcm9jZXNzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZExpYnJhcnkiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQbHVnaW5zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlZmluZWRDb25maWd1cmF0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMy91bWEuZ2VubW9kZWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4zL3VtYS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk3MGU1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4zL3VtYS5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYyIgZWRpdG9yRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0b3Ivc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmVwZi51bWEiIHRlbXBsYXRlRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMiCi0gICAgcnVudGltZUphcj0idHJ1ZSIgZHluYW1pY1RlbXBsYXRlcz0idHJ1ZSIgbW9kZWxOYW1lPSJVbWEiIGVkaXRQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luIgotICAgIGVkaXRvclBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5lcGYudW1hLnByZXNlbnRhdGlvbi5VbWFFZGl0b3JQbHVnaW4iIG5vbk5MU01hcmtlcnM9InRydWUiCi0gICAgcm9vdEV4dGVuZHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSU1vZGVsT2JqZWN0IiByb290RXh0ZW5kc0NsYXNzPSJvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3QiCi0gICAgcm9vdEltcGxlbWVudHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uSW50ZXJuYWxFRGF0YU9iamVjdCIgc3VwcHJlc3NFTUZUeXBlcz0idHJ1ZSIKLSAgICBmZWF0dXJlTWFwV3JhcHBlckludGVyZmFjZT0iY29tbW9uai5zZG8uU2VxdWVuY2UiIGZlYXR1cmVNYXBXcmFwcGVySW50ZXJuYWxJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8udXRpbC5FU2VxdWVuY2UiCi0gICAgZmVhdHVyZU1hcFdyYXBwZXJDbGFzcz0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby51dGlsLkJhc2ljRVNlcXVlbmNlIiBjb2RlRm9ybWF0dGluZz0idHJ1ZSIKLSAgICBjb250YWlubWVudFByb3hpZXM9InRydWUiPgotICA8Zm9yZWlnbk1vZGVsPkM6XEhvbWVccGhUTkdcVE5HX2RvY3NcT09BRFxDb250ZW50QXJjaGl0ZWN0dXJlXE1vZGVsc1xVTUEwM1xVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlLm1kbDwvZm9yZWlnbk1vZGVsPgotICA8c3RhdGljUGFja2FnZXM+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9TRE88L3N0YXRpY1BhY2thZ2VzPgotICA8bW9kZWxQbHVnaW5WYXJpYWJsZXM+RU1GX0NPTU1PTkpfU0RPPW9yZy5lY2xpcHNlLmVtZi5jb21tb25qLnNkbzwvbW9kZWxQbHVnaW5WYXJpYWJsZXM+Ci0gIDxtb2RlbFBsdWdpblZhcmlhYmxlcz5FTUZfRUNPUkVfU0RPPW9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG88L21vZGVsUGx1Z2luVmFyaWFibGVzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJVbWEiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5lcGYiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBlY29yZVBhY2thZ2U9InVtYS5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9maW5pc2hUb1N0YXJ0Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvZmluaXNoVG9GaW5pc2giLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvU3RhcnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvRmluaXNoIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvaW5pdGlhbCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvam9pbiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvZm9yayIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvanVuY3Rpb24iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2Nob2ljZSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvZW50cnlQb2ludCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvZXhpdFBvaW50Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC90ZXJtaW5hdGUiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9uYSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvY29udHJpYnV0ZXMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2V4dGVuZHMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL3JlcGxhY2VzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9sb2NhbENvbnRyaWJ1dGlvbiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbG9jYWxSZXBsYWNlbWVudCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9EYXRlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9VcmkiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1N0cmluZyIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU2V0Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9TZXF1ZW5jZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vSW50ZWdlciIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vRmxvYXQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DbGFzc2lmaWVyIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVHlwZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9OYW1lZEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BhY2thZ2VhYmxlRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BhY2thZ2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9OYW1lc3BhY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2d1aWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2JyaWVmRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vd25lZFJ1bGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9zdXBwcmVzc2VkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vcmRlcmluZ0d1aWRlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnN0cmFpbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnN0cmFpbnQvYm9keSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvc3VwcG9ydGluZ01hdGVyaWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2NvbmNlcHRzQW5kUGFwZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY2hlY2tsaXN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2d1aWRlbGluZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9leGFtcGxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2Fzc2V0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9wcmVzZW50YXRpb25OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9wcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvc2hhcGVpY29uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L25vZGVpY29uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL21haW5EZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vc2VjdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24va2V5Q29uc2lkZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU2VjdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2VjdGlvbi9zZWN0aW9uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NlY3Rpb24vc2VjdGlvbkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlY3Rpb24vc3ViU2VjdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3ByZWRlY2Vzc29yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZS9tb2RpZmllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGUvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L3JlcG9ydHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90ZW1wbGF0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90b29sTWVudG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L2VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UYXNrIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3BlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9tYW5kYXRvcnlJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svb3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svb3B0aW9uYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9zdGVwcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svdG9vbE1lbnRvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL2VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtEZWZpbml0aW9uL3ByZWNvbmRpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbi9wb3N0Y29uZGl0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N0ZXAiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HdWlkYW5jZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FydGlmYWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQXJ0aWZhY3QvY29udGFpbmVyQXJ0aWZhY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQXJ0aWZhY3QvY29udGFpbmVkQXJ0aWZhY3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZS9kZWxpdmVyZWRXb3JrUHJvZHVjdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vT3V0Y29tZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvZ2xvYmFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9yZXVzZWRQYWNrYWdlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL3BhcmVudFBhY2thZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9jaGlsZFBhY2thZ2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnRQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudFBhY2thZ2UvY29udGVudEVsZW1lbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vYnJpZWZPdXRsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9yZXByZXNlbnRhdGlvbk9wdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9leHRlcm5hbElkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9pbXBhY3RPZk5vdEhhdmluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vcmVhc29uc0Zvck5vdE5lZWRpbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbi9leHRlcm5hbERlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbi9wYWNrYWdpbmdHdWlkYW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbi9za2lsbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vYXNzaWdubWVudEFwcHJvYWNoZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vc3lub255bXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbi9hbHRlcm5hdGl2ZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGFuY2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vR3VpZGFuY2VEZXNjcmlwdGlvbi9hdHRhY2htZW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2FkZGl0aW9uYWxJbmZvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9wcm9ibGVtIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9iYWNrZ3JvdW5kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9nb2FscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYXBwbGljYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2xldmVsc09mQWRvcHRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUG9pbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BvaW50L3giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qb2ludC95Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9wb3NpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvY29udGFpbmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9saW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9hbmNob3JhZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L3NlbWFudGljTW9kZWwiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L2lzVmlzaWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9jb250YWluZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9yZWZlcmVuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvcHJvcGVydHkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL3pvb20iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvdmlld3BvcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvZGlhZ3JhbSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaENvbm5lY3RvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWRnZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL3ByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2dyYXBoRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2RpYWdyYW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGltZW5zaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaW1lbnNpb24vd2lkdGgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaW1lbnNpb24vaGVpZ2h0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JlZmVyZW5jZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUmVmZXJlbmNlL2lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUmVmZXJlbmNlL3JlZmVyZW5jZWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvcGVydHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb3BlcnR5L2tleSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb3BlcnR5L3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoRWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFZGdlL2FuY2hvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVkZ2Uvd2F5cG9pbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RpYWdyYW0iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpYWdyYW0vem9vbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtL3ZpZXdwb2ludCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW0vZGlhZ3JhbUxpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbS9uYW1lc3BhY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhOb2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhOb2RlL3NpemUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50L3R5cGVJbmZvIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2UvZWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UvZWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9MZWFmRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RleHRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9UZXh0RWxlbWVudC90ZXh0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0ltYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9JbWFnZS91cmkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9JbWFnZS9taW1lVHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaGljUHJpbWl0aXZlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUG9seWxpbmUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BvbHlsaW5lL2Nsb3NlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qb2x5bGluZS93YXlwb2ludHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRWxsaXBzZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yYWRpdXNYIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yYWRpdXNZIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yb3RhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2Uvc3RhcnRBbmdsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2UvZW5kQW5nbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRWxsaXBzZS9jZW50ZXIiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQWN0aXZpdHkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2JyZWFrZG93bkVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvcm9hZG1hcHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9zdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvY2hlY2tsaXN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2NvbmNlcHRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvZXhhbXBsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9ndWlkZWxpbmVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvcmV1c2FibGVBc3NldHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9pc0VuYWN0YWJsZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNSZXBlYXRhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNPbmdvaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNFdmVudERyaXZlbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2xpbmtUb1ByZWRlY2Vzc29yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlZml4Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9pc1BsYW5uZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2hhc011bHRpcGxlT2NjdXJyZW5jZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2lzT3B0aW9uYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZXNlbnRlZEFmdGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVzZW50ZWRCZWZvcmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wbGFubmluZ0RhdGEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3N1cGVyQWN0aXZpdGllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NaWxlc3RvbmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9JdGVyYXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QaGFzZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RlYW1Qcm9maWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS90ZWFtUm9sZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS9zdXBlclRlYW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS9zdWJUZWFtIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9Sb2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9tb2RpZmllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL3Jlc3BvbnNpYmxlRm9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtPcmRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya09yZGVyL2xpbmtUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya09yZGVyL3ByZWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0VsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YS9zdGFydERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEvZmluaXNoRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YS9yYW5rIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaXB0b3IvaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2FjdGl2aXR5RW50cnlTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9hY3Rpdml0eUV4aXRTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9Xb3JrUHJvZHVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RlZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvZGVsaXZlcmFibGVQYXJ0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvVGFzayIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvYXNzaXN0ZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2V4dGVybmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9tYW5kYXRvcnlJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL29wdGlvbmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9vdXRwdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9wZXJmb3JtZWRQcmltYXJpbHlCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL3NlbGVjdGVkU3RlcHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29tcG9zaXRlUm9sZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29tcG9zaXRlUm9sZS9hZ2dyZWdhdGVkUm9sZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24vdXNhZ2VHdWlkYW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL2FsdGVybmF0aXZlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24vaG93dG9TdGFmZiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vc2NhbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcmlza0xldmVsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vZXN0aW1hdGluZ1RlY2huaXF1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Byb2plY3RNZW1iZXJFeHBlcnRpc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi90eXBlT2ZDb250cmFjdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi9leHRlcm5hbElkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uL3Njb3BlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uL3VzYWdlTm90ZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVzY3JpcHRvckRlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmlwdG9yRGVzY3JpcHRpb24vcmVmaW5lZERlc2NyaXB0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbmNlcHQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DaGVja2xpc3QiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9FeGFtcGxlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUmVwb3J0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGVtcGxhdGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Ub29sTWVudG9yIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV2hpdGVwYXBlciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rlcm1EZWZpbml0aW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJhY3RpY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9QcmFjdGljZS9zdWJQcmFjdGljZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9QcmFjdGljZS9jb250ZW50UmVmZXJlbmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ByYWN0aWNlL2FjdGl2aXR5UmVmZXJlbmNlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU3RhdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlL1dvcmtQcm9kdWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlL1JlZ2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlL3N1Ym1hY2hpbmUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVmVydGV4Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVmVydGV4L2NvbnRhaW5lciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ZlcnRleC9vdXRnb2luZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ZlcnRleC9pbmNvbWluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZWdpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9SZWdpb24vVmVydGV4Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JlZ2lvbi9UcmFuc2l0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JlZ2lvbi9TdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9SZWdpb24vU3RhdGVNYWNoaW5lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N0YXRlTWFjaGluZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlTWFjaGluZS9SZWdpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVHJhbnNpdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVHJhbnNpdGlvbi9Xb3JrRGVmaW5pdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UcmFuc2l0aW9uL2NvbnRhaW5lciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RyYW5zaXRpb24vc291cmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVHJhbnNpdGlvbi90YXJnZXQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaXNjaXBsaW5lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaXNjaXBsaW5lL3Rhc2tzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmUvc3ViZGlzY2lwbGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmUvcmVmZXJlbmNlV29ya2Zsb3dzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVTZXQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVTZXQvcm9sZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRG9tYWluIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Eb21haW4vd29ya1Byb2R1Y3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RvbWFpbi9zdWJkb21haW5zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0VHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlL3dvcmtQcm9kdWN0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaXNjaXBsaW5lR3JvdXBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZy9kaXNjaXBsaW5lcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Ub29sIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Ub29sL3Rvb2xNZW50b3JzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVTZXRHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZVNldEdyb3VwaW5nL3JvbGVTZXRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9jYXRlZ29yaXplZEVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkvc3ViQ2F0ZWdvcmllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzcy9lZHVjYXRpb25NYXRlcmlhbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MvY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2VzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy9pbmNsdWRlc1BhdHRlcm5zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy9kZWZhdWx0Q29udGV4dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3MvdmFsaWRDb250ZXh0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NhcGFiaWxpdHlQYXR0ZXJuIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlL2Jhc2VkT25Qcm9jZXNzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9hZG1hcCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQvaW50ZXJmYWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L3Byb2Nlc3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZS9wcm9jZXNzRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UvZGlhZ3JhbXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UvaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9pbnRlcmZhY2VJTyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IvUHJvY2Vzc0NvbXBvbmVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFBsdWdpbi91c2VyQ2hhbmdlYWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4vbWV0aG9kUGFja2FnZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4vYmFzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQvdmFyaWFiaWxpdHlUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlFbGVtZW50L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kVW5pdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9hdXRob3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jaGFuZ2VEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jaGFuZ2VEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvdmVyc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY29weXJpZ2h0U3RhdGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vbWV0aG9kUGx1Z2luU2VsZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9tZXRob2RQYWNrYWdlU2VsZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9wcm9jZXNzVmlld3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL2RlZmF1bHRWaWV3Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9iYXNlQ29uZmlndXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0ZhbWlseSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0ZhbWlseS9kZWxpdmVyeVByb2Nlc3NlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kTGlicmFyeS9tZXRob2RQbHVnaW5zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZExpYnJhcnkvcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZS5lbXggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC40L1VuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmUuZW14CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODZlNGQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZS5lbXgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLXh0b29sczJfdW5pdmVyc2FsX3R5cGVfbWFuYWdlci0tPgotPD9jb20uaWJtLnh0b29scy5lbWYuY29yZS5zaWduYXR1cmUgPHNpZ25hdHVyZSBpZD0iY29tLmlibS54dG9vbHMubW1pLnVpLnNpZ25hdHVyZXMuZGlhZ3JhbSIgdmVyc2lvbj0iNy4wLjAiPjxmZWF0dXJlIGRlc2NyaXB0aW9uPSIiIG5hbWU9IlJhdGlvbmFsIE1vZGVsaW5nIFBsYXRmb3JtIChjb20uaWJtLnh0b29scy5ybXApIiB1cmw9IiIgdmVyc2lvbj0iNy4wLjAiLz48L3NpZ25hdHVyZT4/PgotPD9jb20uaWJtLnh0b29scy5lbWYuY29yZS5zaWduYXR1cmUgPHNpZ25hdHVyZSBpZD0iY29tLmlibS54dG9vbHMudW1sLm1zbC5tb2RlbCIgdmVyc2lvbj0iNy4wLjAiPjxmZWF0dXJlIGRlc2NyaXB0aW9uPSIiIG5hbWU9ImNvbS5pYm0ueHRvb2xzLnJ1bWwuZmVhdHVyZSIgdXJsPSIiIHZlcnNpb249IjcuMC4wIi8+PC9zaWduYXR1cmU+Pz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6RGVmYXVsdD0iaHR0cDovLy9zY2hlbWFzL0RlZmF1bHQvMSIgeG1sbnM6RWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi9zY2hlbWFzL0Vjb3JlLzMiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiB4bWxuczpub3RhdGlvbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvcnVudGltZS8xLjAuMC9ub3RhdGlvbiIgeG1sbnM6dW1sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIiB4bWxuczp1bWxub3RhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tL3h0b29scy8xLjUuMi9VbWxub3RhdGlvbiIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vL3NjaGVtYXMvRGVmYXVsdC8xIHBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZWZhdWx0LmVweCNfSU44azhNbUJFZHFCY04xUjZFdldVdz9EZWZhdWx0L0RlZmF1bHQ/IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi9zY2hlbWFzL0Vjb3JlLzMgcGF0aG1hcDovL1VNTF9QUk9GSUxFUy9FY29yZS5wcm9maWxlLnVtbCNfdnktSFVZaW5FZHF0dmJuZkIyTF81dyI+Ci0gIDx1bWw6TW9kZWwgeG1pOmlkPSIzQURDN0I3NDAyMkQiIG5hbWU9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmUiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfQlROcUFPeGhFZHVIamUzcFBhaE40QSIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIi8+Ci0gICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9QNG9zWU9vZUVkdVZBN3Z0NXFiSUpRIiBhbm5vdGF0ZWRFbGVtZW50PSIzQURDN0I3NDAyMkQiPgotICAgICAgPGJvZHk+T3BlbiBJc3N1ZSBhbmQgVG9Eb3M6JiN4RDsKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0mI3hEOwotLSBJc3N1ZTogVU1MIDIuMCBuYW1pbmcgY29udmVudGlvbnMgZG9lcyBub3QgYWxsb3cgcGx1cmFsIHJvbGUgbmFtZXMmI3hEOwotLSBzeW5jIHVwIG5hbWVzIHRvIFVJIG5hbWVzOyBlLmcuIFBhY2thZ2luZyBJbnN0cnVjdGlvbnMmI3hEOwotLSBtYWtlIEFjdGl2aXR5IHRvIEJyZWFrZG93biBFbGVtZW50IGFnZ3JlZ2F0aW9uIGEgY29tcG9zaXRpb24mI3hEOwotLSBBZGQgSW5kZXgsIExpdGVyYXR1cmUgUmVmZXJlbmNlcyB0byBtZXRhLW1vZGVsJiN4RDsKLSYjeEQ7Ci1WZXJzaW9uIDIuMCBjaGFuZ2VzOiYjeEQ7Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSYjeEQ7Ci0tIG5vdCBzdGFydGVkLCB5ZXQmI3hEOwotJiN4RDsKLVZlcnNpb24gMS4wLjQgY2hhbmdlczomI3hEOwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSYjeEQ7Ci0tIE1vdmVkIGV4dGVybmFsSWQgdXAgZnJvbSBXb3JrIFByb2R1Y3QgYW5kIFByb2Nlc3MgZGVzY3JpcHRpb24gJiN4RDsKLSAgdG8gdGhlIGdlbmVyYWwgY29udGVudCBkZXNjcmlwdGlvbiYjeEQ7Ci0tIEFkZGVkIGFzc29jaWF0aW9uIGJldHdlZW4gY29udGVudCBlbGVtZW50IGFuZCB0ZXJtIGRlZmluaXRpb24gdG8gYWxsb3cgYXNzaWduaW5nJiN4RDsKLSAgZ2xvc3NheSB0ZXJtcyBhcyBndWlkYW5jZSYjeEQ7Ci0tIEFkZGVkIHR3byBuZXcgYXR0cmlidXRlcyBmb3IgQXJ0aWZhY3QgRGVzY3JpcHRpb246ICYjeEQ7Ci0gIHJlcHJlc2VudGF0aW9uIGFuZCBub3RhdGlvbiYjeEQ7Ci0tIEFkZGVkIGFkZGl0aW9uYWwgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIENvbmZpZ3VyYXRpb24gYW5kIENhdGVnb3JpZXMgdG8gJiN4RDsKLSAgbW9kZWwgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucyB3aXRoIGNhdGVnb3JpZXMgYW5kIG5lZ2F0aXZlIHNldHMmI3hEOwotLSBNYWRlIERvbWFpbiB0byBXb3JrIFByb2R1Y3QgYXNzb2NpYXRpb24gbWFueS10by1tYW55JiN4RDsKLS0gTWFkZSBNZXRob2QgUGFja2FnZSBuZXN0aW5nIGFzc29jaWF0aW9uIHVuaWRpcmVjdGlvbmFsJiN4RDsKLS0gQWRkZWQgTWV0aG9kRWxlbWVudFByb3BlcnR5IGZvciBkZWZpbmluZyBhcHBsaWNhdGlvbiBzcGVjaWZpYyBhdHRyaWJ1dGVzICYjeEQ7Ci0gIHN1Y2ggYXMgcHVibGljYXRpb24gZmxhZ3MgYW5kIGZsYWdnaW5nIHVzZXIgcGx1Zy1pbnMmI3hEOwotLSBDaGFuZ2VkIDEuLiogbXVsdGlwbGljaXRpZXMgZm9yIHN0YW5kYXJkIGNhdGVnb3JpZXMgdG8gKiYjeEQ7Ci0mI3hEOwotVmVyc2lvbiAxLjAuMyBjaGFuZ2VzOiYjeEQ7Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJiN4RDsKLTA3LzI2LzA2JiN4RDsKLS0gQ29ycmVjdGVkIGRlZmF1bHQgdmFsdWUgb2YgTWV0aG9kUGx1Z2luOjpVc2VyQ2hhbmdlYWJsZSB0byB0cnVlJiN4RDsKLTA3LzA2LzA2JiN4RDsKLS0gUmVtb3ZlZCBFc3RpbWF0ZSAgIGFuZCBFc3RpbWF0aW9uIE1ldHJpYyBHdWlkYW5jZSBlbGVtZW50czsgJiN4RDsKLSAgb25seSBrZXB0IEVzdGltYXRpb24gQ29uc2lkZXJhdGlvbiYjeEQ7Ci0wNi8yMC8wNiYjeEQ7Ci0tIENoYW5nZWQgbXVsdGlwbGljaXR5IGZyb20gZGlzY2lwbGluZSB0byBhY3Rpdml0eSB0byBtYW55IHRvIG1hbnkmI3hEOwotMDYvMTUvMDYmI3hEOwotLSBDaGFuZ2VkIG11bHRpcGxpY2l0eSBvZiByb2xlIGRlc2NyaXB0b3IgdG8gd29yayBwcm9kdWN0cyBkZXNjcmlwdG9yIHRvICYjeEQ7Ci0gIG1hbnkgdG8gbWFueSYjeEQ7Ci0wNi8xMy8wNiYjeEQ7Ci0tIEFkZGVkIGRpcmVjdGlvbnMgdG8gZGVzY3JpcHRvciBhc3NvY2lhdGlvbnMgdG8gYXZvaWQgdGhhdCBkZXNjcmlwdG9ycyYjeEQ7Ci0gIGFkZGVkIHRvIGFuIGFjdGl2aXR5IHZpYSBsb2NhbCBjb250cmlidXRpb24gbW9kaWZ5IGluaGVyaXRlZCBkZXNjcmlwdG9ycyYjeEQ7Ci0wNS8wMS8yMDA2JiN4RDsKLS0gTW92ZWQgVU1MMiBEaWFncmFtIEludGVyY2hhbmdlIHRvIHRvcC1sZXZlbCBwYWNrYWdlJiN4RDsKLS0gQ2hhbmdlZCBtdWx0aXBsaWNpdHkgb2YgYnJlYWtkb3duIGVsZW1lbnRzIHRvIGFjdGl2aXRpZXMgdG8gMSYjeEQ7Ci0tIE1hZGUgTWV0aG9kIENvbmZpZ3VyYXRpb24gYSBNZXRob2QgVW5pdCYjeEQ7Ci0tIENoYW5nZWQgbXVsdGlwbGljaXR5IGZvciBUYXNrIHRvIERpc2NpcGxpbmU6IGEgVGFzayBjYW4gbm93IGJlIGNhdGVnb3JpemVkJiN4RDsKLSAgYnkgbW9yZSB0aGFuIG9uZSBEaXNjaXBsaW5lIHRvIGFsbG93IG1vZGVsaW5nIHJlcGxhY2luZyBkaXNjaXBsaW5lcyYjeEQ7Ci0tIENoYW5nZWQgbXVsdGlwbGljaXR5IGZvciBSb2xlIHRvIFdQOiBhIFdQIGNhbiBoYXZlIG1vcmUgdGhhbiBvbmUgJiN4RDsKLSAgcmVzcG9uc2libGUgUm9sZSB0byBhbGxvdyBtb2RlbGluZyByZXBsYWNpbmcgcm9sZXMmI3hEOwotLSBOZXN0aW5nIG9mIGRpc2NpcGxpbmVzJiN4RDsKLS0gUmVtb3ZlZCAmcXVvdDt3b3JrZWRPbkJ5JnF1b3Q7IGRlcnJpdmVkIHByb3BlcnR5IGZvciBSb2xlRGVzY3JpcHRvciB0byBXUDsmI3hEOwotICBtb2RpZmllcyBwcm9wZXJ0eSBpcyBzdWZmaWNpZW50JiN4RDsKLS0gYWRkZWQgdHdvIG1vcmUgdmFyaWFiaWxpdHkgdHlwZXMgdXNlZCBieSBhY3Rpdml0aWVzOiBsb2NhbENvbnRyaWJ1dGlvbiYjeEQ7Ci0gIGFuZCBsb2NhbFJlcGxhY2VtZW50OyB0aGlzIGNoYW5nZSBpcyBvbmx5IHRlbXBvcmFyaWx5IHRvIG1pbmltaXplIG1pZ3JhdGlvbnMmI3hEOwotICBpc3N1ZXM6IGluIHRoZSBmdXR1cmUgdGhlc2UgbmVlZCB0byBiZSBtb2RlbGVkIGFzIGluIFNQRU0yIGFzIGEgc2VwZXJhdGUgJiN4RDsKLSAgQWN0aXZpdHlVc2UgY2xhc3MgYW5kIEFjdGl2aXR5VXNlVHlwZSBlbnVtZXJhdGlvbiYjeEQ7Ci0tIENyZWF0ZWQgQWN0aXZpdHkgc3BlY2lhbGl6YXRpb24gdGhhdCBhZGRzIGlzRW5hY3RhYmxlPWZhbHNlIGF0dHJpYnV0ZSBpbiYjeEQ7Ci0gIHRoZSBwYWNrYWdlIFByb2Nlc3MgLS0+IFdvcmtmbG93IHBhY2thZ2UmI3hEOwotLSBBZGRlZCBkaXJlY3QgYXNzb2NpYXRpb25zIGZyb20gV1AgYW5kIFRhc2sgdG8gRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zJiN4RDsKLSAgdW50aWwgRXN0aW1hdGUgaXMgdXNlZDsgYWxsb3dzIGxpbmtpbmcgb2YgY29uc2lkZXJhdG9ucyB0byB0aGVzZSBlbGVtZW50cyYjeEQ7Ci0tIFJlbW92ZWQgUHJvY2VzcyBDb250cmlidXRpb24gYXMgaXQgaXMgcmVkdW5kYW50IHdpdGggY3JlYXRpbmcgZXh0ZW5kcyAmI3hEOwotICBiZXR3ZWVuIFByb2Nlc3NlcyBkaXJlY3RseTwvYm9keT4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9Il9HaTNkeGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpNb2RlbCIgaHJlZj0icGF0aG1hcDovL1VNTF9MSUJSQVJJRVMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjXzAiLz4KLSAgICA8L3BhY2thZ2VJbXBvcnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTFGNjZCMDE1NSIgbmFtZT0iVU1MMkRpYWdyYW1JbnRlcmNoYW5nZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d6MmdIdWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxNTFGNzFFMDNFNyI+Ci0gICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MUY3MUUwM0U3IiB0eXBlPSJDbGFzcyIgbmFtZT0iRGlhZ3JhbXMiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYRU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBBMzcwMTFCIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOVlhGT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMDE0IiBoZWlnaHQ9IjExNTEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWEZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYR2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhHdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYRy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYSGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhIdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWEgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOVlhFZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITlZYRXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzc5NiIgeT0iOTgzOCIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhJT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUxRjc0RDAwOTEiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5WWEpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWEp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhLT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYS2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhLdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYSy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhMT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYTGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhMdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWEwtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOVlhJZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITlZYSXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzY2NSIgeT0iMTI4NjkiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYTU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5MEUwMEIwIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOVlhOT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI2MjMxIiBoZWlnaHQ9IjExNTEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWE5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYT2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhPdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYTy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhQT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYUGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhQdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWFAtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOVlhNZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITlZYTXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjMzNSIgeT0iMzEzMiIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhRT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDk4MjAzQkEiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5WWFJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI1NTYiIGhlaWdodD0iMTU3NCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhTZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhTLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhUZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYVC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5WWFFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOVlhRdWZYRWR1cUhvT0piVVJaUnciIHg9IjY3NDciIHk9IjQ2NDgiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYVU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBBMTIwMjQ1Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOVlhWT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMjAxIiBoZWlnaHQ9IjEwNjYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYV2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhXdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYVy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhYT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYWGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhYdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWFgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOVlhVZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITlZYVXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjY2NiIgeT0iMTAyODciLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYZy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MjE3QzEwM0JFIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOVlhoLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MzY4IiBoZWlnaHQ9IjExNjgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJRWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJRS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklGT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJRmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklGdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJRi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklHT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSUdlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOVlhoT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITlZYaGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjE0MSIgeT0iMjk3MSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDlGRDAxN0MiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5mSVpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5MTIiIGhlaWdodD0iMTA2NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklhZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklhLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZkliZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJYi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5mSVllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOZklZdWZYRWR1cUhvT0piVVJaUnciIHg9IjQzODUiIHk9IjEwMjM2Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWstZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTFGN0ZBMDI5NSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITmZJbC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjc2MCIgaGVpZ2h0PSIxMTUxIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkltT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSW11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSW0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSW5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJbmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSW51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJbi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSW9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJb2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklvdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITmZJbE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5mSWxlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMxNDgiIHk9IjY5NDIiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TTC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBBMjYwMkY4Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOb1NNLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODc4IiBoZWlnaHQ9IjE1NzQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU05PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TT09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NPZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TT3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NPLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TUE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NQZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU1B1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOb1NNT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITm9TTWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjIzMyIgeT0iNjY4MCIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NZdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTY2QTAyMDIiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5vU1p1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM4NDMiIGhlaWdodD0iMTE1MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NhLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2JPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NiZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2J1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NiLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2NPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TY2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5vU1ktZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOb1NaT2ZYRWR1cUhvT0piVVJaUnciIHg9IjExMTMzIiB5PSIxNTQyNiIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NsZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEUzNDAxNTYiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5vU21lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMwODEiIGhlaWdodD0iMTU3NCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TbXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU20tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NudWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU24tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NvT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU29lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NvdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU28tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TcE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5vU2x1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOb1NsLWZYRWR1cUhvT0piVVJaUnciIHg9IjE3NzYzIiB5PSIxMjQyMCIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURNLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMUQ2NDAzNDEiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeUROdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE55RE4tZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjUyMTUiIGhlaWdodD0iMTE1MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlET09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RE9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURQT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURQdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURRT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEUXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE55RE5PZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOeUROZWZYRWR1cUhvT0piVVJaUnciIHg9IjM1MzkiIHk9IjE3ODY0Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITnlEVU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjg0NCIgaGVpZ2h0PSIxMDY2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURVZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURWZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURWLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURXZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEVy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE55RFRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITnlEVHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzYyNyIgeT0iMjA4MDIiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEWE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzFENzEwMDBCIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEWC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOeURZT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NTIxIiBoZWlnaHQ9IjEwNjYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEWk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEWmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEWi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURhT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEYWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURhdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RGEtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOeURYZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITnlEWHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjc4OSIgeT0iMTgxMTAiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEbU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM0MkEwMUZBIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOeURuT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzg3IiBoZWlnaHQ9IjExNTEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RG5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEb2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEby1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEcGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RHAtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOeURtZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITnlEbXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjQ0MSIgeT0iMTA3MDEiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEcU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM0MzYwMjNEIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOeURyT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzM2IiBoZWlnaHQ9IjExNTEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RHJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEc2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON004T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdNOGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON004dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TTgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOeURxZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITnlEcXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjUwNyIgeT0iMTM5NDgiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdNOU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM0M0YwMDE5Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdNOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hON00tT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMzg2IiBoZWlnaHQ9IjE1NzQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TS1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON00tdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdNLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdNX09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdNX2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON01fdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdNXy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05BT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOQWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05BdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TkEtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hON005ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITjdNOXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNTM4MyIgeT0iMTM4NDMiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOQk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM0NDYwMDM3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hON05DT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyOTk3IiBoZWlnaHQ9IjExNTEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TkNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05DdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOQy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdORE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdORGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05EdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdORC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05FT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdORWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05FdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TkUtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hON05CZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITjdOQnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyODg3OSIgeT0iMTM4NTEiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdORk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM1MDkwMDM4Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdORi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hON05HT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNDU0IiBoZWlnaHQ9IjMzMDIiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TkdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05HdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdORy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOSGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05IdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOSC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05JT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOSWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05JdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TkktZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hON05GZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITjdORnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzMTM5NCIgeT0iMTc0NDkiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOSk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MUY3NEQwMDkxIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hON05LT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TktlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05LdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOTE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TkxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOTHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TkwtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOTU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43Tk1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOTXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05NLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITjdOSmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE43Tkp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjc1MjAiIHk9IjIwMTE4Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tk5PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNTAxMDE4MSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tk4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITjdOT09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDA4MCIgaGVpZ2h0PSIxMTUxIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05PZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tk8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TlBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOUHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TlAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOUU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TlFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOUXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05RLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITjdOTmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE43Tk51ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjcwNjciIHk9IjE3NDU4Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TmxPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TmwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITjdObU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNTA5NiIgaGVpZ2h0PSIxOTgxIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05tZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdObXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tm0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43Tm5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdObnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43Tm4tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43Tm9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05vLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITjdObGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hON05sdWZYRWR1cUhvT0piVVJaUnciIHg9IjExODUzIiB5PSI2NjAiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOcmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREU2NjgwMENFIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hON05zZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMTUwIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRTk4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0U5OGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0U5OHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FOTgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0U5OU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FOTllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0U5OXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FOTktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0U5LU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPRTktZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITjdOcnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE43TnItZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE4MjciIHk9IjIwODcwIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FOS11ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxRDgyMDI5QSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FOV9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IT0U5X3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDUyMSIgaGVpZ2h0PSIxMDY2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRTlfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FLUEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtQk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FLUJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtQnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FLUItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtQ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPRS1DZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IT0U5LS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE9FOV9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA2NDIiIHk9IjE4MjExIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d6MmdJT2ZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgdGhlIGFsbW9zdCBleGFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVU1MIDIuMCBEaWFncmFtIEludGVyY2hhbmdlIE1ldGEtTW9kZWwuICBTb21lIGV4dGVuc2lvbnMgaGFkIGJlZW4gYWRkZWQsIGUuZy4gZGVycml2aW5nIGFsbCBub24tdmFsdWUgY2xhc3NlcyBmcm9tIE1ldGhvZEVsZW1lbnQuIEFub3RoZXIgbWlub3IgZGlmZmVyZW5jZSB0byB0aGUgc3RhbmRhcmQgaXMgdGhhdCBSb3NlL0VNRiBkbyBub3Qgc3VwcG9ydCBhdHRyaWJ1dGUgYXJyYXlzLCB3aGljaCBoYXMgYmVlbiBtb2RlbGVkIGhlcmUgd2l0aCBhc3NvY2lhdGlvbnMuICBGb3IgZG9jdW1lbnRhdGlvbiBvZiB0aGUgaW5kaXZpZHVhbCBjbGFzc2VzIHNlZSB0aGUgc3RhbmRhcmQgZG9jdW1lbnQgYXQgd3d3LnVtbC5vcmcuIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITlZYWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE0ODUwMzk2IiBzb3VyY2U9Il9ITlZYVU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITlZYSU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5WWFpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE0ODYwMjZEIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5WWGFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjciIHk9Ii0yMjkiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE0ODYwMjZEIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOVlhhLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE0ODYwMjZCIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITlZYYnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTUwIiB5PSItNDQ5Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTQ4NjAyNkIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITlZYY2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzc4IiB5PSIxMzM3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTQ4NjAyNkQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYZHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5WWGRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTQ4NjAyNkIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYZXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5WWGVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNDg2MDI2RCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhmdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITlZYZk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTQ4NjAyNkIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITlZYZ09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOVlhZZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITlZYWXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTEwLCA1MjQsIC04LCAtMTk2NF0kWy0xMTAsIDIwNDgsIC04LCAtNDQwXSIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOZklHdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkzODAzNDYiIHNvdXJjZT0iX0hOVlhNT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOVlhnLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJSU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITmZJSHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkzOTAyMTMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJSXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzQ5IiB5PSIxODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkzOTAyMTMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSUplZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjc4IiB5PSItMjgwIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOTM5MDIxMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSUtPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDUwIiB5PSIxODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOTM5MDIxMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklLLWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NzMiIHk9Ii0yNDYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOTM5MDIxMyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklNT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJTHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOTM5MDIxMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklOT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJTXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5MzkwMjEzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSU9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklOdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSU9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOTM5MDIxMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSVBPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklPdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5mSUctZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOZklIT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zMTE1LCAyNjIsIDgwMDksIDQxNF0kWy04OTQwLCAyNjIsIDIxODQsIDQxNF0iLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITmZJUGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5QkMwMjQxIiBzb3VyY2U9Il9ITlZYZy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITlZYUU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5mSVFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5QkQwMTVFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSVJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgyIiB5PSItMjg4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklSLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOUJEMDE1RSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJU09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOUJEMDE1QyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSVMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ3MCIgeT0iMjIxIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDlCRDAxNUMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJVHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzc3IiB5PSItMjAzIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDlCRDAxNUUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJVS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSVVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDlCRDAxNUMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJVi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSVZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOUJEMDE1RSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklXLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJV2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDlCRDAxNUMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklYLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJWGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOZklQdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITmZJUC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjE4NCwgNDMxLCA0MTE0LCAtMTQ0N10kWy0zMTE1LCA0MzEsIDMxODMsIC0xNDQ3XSRbLTMxMTUsIDIwMzIsIDMxODMsIDE1Ml0kWy01MDIwLCAyMDMyLCAxMjc4LCAxNTJdIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5mSWNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRkYyMDM2MCIgc291cmNlPSJfSE5mSVlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5WWFVPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklkdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOZklkT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRkYzMDE2NCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZkllT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii00MjMiIHk9Ii0yMTkiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEZGMzAxNjQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSWUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTEwIiB5PSIzMzEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBGRjMwMTYyIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJZnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1MSIgeT0iLTIzNiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBGRjMwMTYyIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSWdlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ5OSIgeT0iMjk3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEZGMzAxNjQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJaHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSWhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEZGMzAxNjIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJaXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSWlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRkYzMDE2NCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklqdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJak9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEZGMzAxNjIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklrdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJa09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOZkljZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITmZJY3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNDU2LCAzMywgLTY0NjgsIC0xNl0kWzY4MjQsIDMzLCAtMTEwMCwgLTE2XSIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOZklvLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDc1ODAxMUYiIHNvdXJjZT0iX0hOZklrLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOVlhnLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJcWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITmZJcC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDc1OTAwNDQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJcS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyOTIiIHk9IjM5MCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwNzU5MDA0NCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJcnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNDMiIHk9Ii05NTciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA3NTkwMDNBIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJc2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MCIgeT0iLTM4OSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA3NTkwMDNBIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkl0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSXRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMwMyIgeT0iLTExNjUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwNzU5MDA0NCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZkl1ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJdC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkl1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwNzU5MDAzQSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZkl2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJdS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkl2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA3NTkwMDQ0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkl3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSXdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZkl2LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwNzU5MDAzQSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSXhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZkl3LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5mSXBPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOZklwZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy00NzQsIC01ODQsIC0yNzAsIDMzNzhdJFstNDc0LCAtMzM3OCwgLTI3MCwgNTg0XSIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOZkl4dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEUyOTAxNTAiIHNvdXJjZT0iX0hOVlhVT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOZklrLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkl5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TQU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITmZJeXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOZkl4LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOZkl5T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExMCwgLTU0MSwgLTY1MSwgMjc2MF0kWzYwOSwgLTI3MjYsIC0xNTIsIDU3NV0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITm9TQWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITm9TQXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITm9TQS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFMkIwMjFCIiBzb3VyY2U9Il9ITlZYRU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITmZJay1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0NlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5vU0ItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITm9TQk9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITm9TQmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTQ4LCAtNTg0LCAzODI2LCAyMzExXSRbLTM4MTAsIC0yMzE5LCA5NjUsIDU3NV0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITm9TQ3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITm9TQy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITm9TRE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFN0MwMEQ3IiBzb3VyY2U9Il9ITmZJay1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITmZJWU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TRC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0V1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5vU0VPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFN0UwMTdBIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU0ZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc3OSIgeT0iLTI3MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTdFMDE3QSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TRi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5NDkiIHk9Ii0zMzkiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFN0UwMTcwIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TR3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MTQiIHk9Ii00NTciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTdFMDE3MCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NIZWZYRWR1cUhvT0piVVJaUnciIHg9Ijg4OCIgeT0iMTE5NCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFN0UwMTdBIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU0l1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NJT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFN0UwMTcwIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU0p1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NKT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU3RTAxN0EiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TS3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU0tPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFN0UwMTcwIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TTHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU0xPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITm9TRGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5vU0R1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEzODAsIDMxMywgNzMwNiwgLTI5MzddJFstODIyOSwgMzEzLCA0NTcsIC0yOTM3XSRbLTgyMjksIDI3MTcsIDQ1NywgLTUzM10iLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITm9TUC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFNDUwMzlGIiBzb3VyY2U9Il9ITmZJay1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITm9TTC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1JlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5vU1EtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFNDYwMjlFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU1ItZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMyMiIgeT0iMjIwIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFNDYwMjlFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NTdWZYRWR1cUhvT0piVVJaUnciIHg9Ijk5OSIgeT0iLTI1NCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU0NjAyOUMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NUZWZYRWR1cUhvT0piVVJaUnciIHg9IjQ3NSIgeT0iMzEzIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU0NjAyOUMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TVU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyOTciIHk9Ii0zMzkiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1V1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTQ2MDI5RSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NWZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TVS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTQ2MDI5QyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NXZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TVi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFNDYwMjlFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU1hlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NXLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTQ2MDI5QyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU1llZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NYLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5vU1FPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOb1NRZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzODAsIC0xMTAsIC03NzYzLCAtNTldJFs3NzA0LCAtMTEwLCAtMTQzOSwgLTU5XSIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOb1NjdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTY5NzAzMDIiIHNvdXJjZT0iX0hOZklrLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOb1NZdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TZU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITm9TZHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTY5OTAwMDMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TZXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzEwMyIgeT0iLTI2MiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNjk5MDAwMyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TZmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjE4MCIgeT0iMjM4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNjk5MDAwMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU2dPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzUxOCIgeT0iMjQ2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTY5OTAwMDEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TZy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDYyIiB5PSItMzU1Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTY5OTAwMDMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TaU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU2h1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTY5OTAwMDEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9Tak9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU2l1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNjk5MDAwMyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9Tai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NrT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TanVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTY5OTAwMDEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2stZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NsT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9Ta3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOb1NjLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOb1NkT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMzgwLCAtNDA2LCA5MywgLTg4OTBdJFstMTA4NTQsIC00MDYsIC05MzgxLCAtODg5MF0kWy0xMDg1NCwgODA4NSwgLTkzODEsIC0zOTddJFstMzM5NSwgODA4NSwgLTE5MjEsIC0zOTddIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5vU3BlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTNBMDNDQiIgc291cmNlPSJfSE5vU2xlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5WWEVPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU3FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOb1NxZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5vU3B1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5vU3AtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTc5NSwgMCwgMTk5OF0kWzAsIC0yMjE4LCAwLCA1NzVdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5vU3JPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5vU3JlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5vU3J1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNURCMDMwMSIgc291cmNlPSJfSE5vU2xlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5vU0wtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU3NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1N0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOb1NzdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU3RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNUREMDA0NyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1N0dWZYRWR1cUhvT0piVVJaUnciIHg9Ii04MzMiIHk9IjMzOCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNUREMDA0NyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TdWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjkxIiB5PSItMjk3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1N1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNUREMDAzRCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU3ZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzY1IiB5PSI0NTciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU3Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNUREMDAzRCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9Td09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1N2LWZYRWR1cUhvT0piVVJaUnciIHg9Ijc2NSIgeT0iLTEzMTMiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNUREMDA0NyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURBLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlEQWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNUREMDAzRCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURCLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlEQmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE1REQwMDQ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55REMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURDZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RERPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNUREMDAzRCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlERHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55REQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeUREZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5vU3ItZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOb1NzT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE1NDAsIDAsIC0yODI3LCA1NzQwXSRbNDI4NCwgMCwgLTg0LCA1NzQwXSRbNDI4NCwgLTQ5NTMsIC04NCwgNzg3XSIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOeURFT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMUMxNzAxNEQiIHNvdXJjZT0iX0hOb1NsZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOb1NZdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlERmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlERnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITnlERk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMUMxODAxMDEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlER09mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTI5IiB5PSItNDQ4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzFDMTgwMTAxIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURHLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMTIiIHk9IjkxNiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlESGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMUMxODAwRkYiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURIdWZYRWR1cUhvT0piVVJaUnciIHg9IjU2OSIgeT0iLTI4OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlESU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzFDMTgwMEZGIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55REllZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU0OSIgeT0iMjc5Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMUMxODAxMDEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlESnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55REpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlESi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMUMxODAwRkYiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlES3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55REtPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlESy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxQzE4MDEwMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlETGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURMdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlETE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMUMxODAwRkYiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RE1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURNdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlETU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOeURFZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITnlERXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODQsIDc4NywgNjE2MywgLTIwMDZdJFstODQsIDI0MjksIDYxNjMsIC0zNjRdJFstNDMyNiwgMjQyOSwgMTkyMSwgLTM2NF0iLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITnlEUS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzFEQTAwMUI3IiBzb3VyY2U9Il9ITnlETS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITm9TWXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE55RFItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITnlEUk9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITnlEUmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjI1LCAtNTg0LCAtNTI4MywgMTg1NF0kWzUyNTcsIC0xODYyLCAtMTY1MSwgNTc1XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOeURTdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOeURTLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOeURiT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMURBMzAxODkiIHNvdXJjZT0iX0hOeURYT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOb1NZdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEY3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITnlEY09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOeURiZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOeURidWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMjEwLCAtNTQxLCA0NzgzLCAyMDk5XSRbLTQ2OTAsIC0yMDY1LCAxMzAzLCA1NzVdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE55RGMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE55RGRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE55RGRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMyRkUzMDEyMyIgc291cmNlPSJfSE55RFhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE55RFRPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURlLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOeURlZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMyRkUzMDM0MCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURmZWZYRWR1cUhvT0piVVJaUnciIHg9IjYxIiB5PSIzMTQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGRTMwMzQwIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURnT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGRTMwMzJDIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlEZy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjk4IiB5PSIyODgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMyRkUzMDMyQyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURodWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yOTgiIHk9Ii0xMTAwIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZFMzAzNDAiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEaS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55RGllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZFMzAzMkMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEai1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55RGplZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMyRkUzMDM0MCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURrLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlEa2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZFMzAzMkMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURsLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlEbGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOeURkdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOeURkLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIDUzMywgMCwgLTIxNTldJFswLCAyMTUwLCAwLCAtNTQxXSIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hON05ST2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzU4QjAxNjEiIHNvdXJjZT0iX0hON05OT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hON05KT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05SLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOU3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITjdOU09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05TLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzU4QjAzNzQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITjdOVE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI2NSIgeT0iLTI2MiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzU4QjAzNzQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE43TlQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOVWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzU4QjAzNkEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hON05VdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNzUiIHk9Ii00MTUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNThCMDM2QSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hON05WZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNzAiIHk9IjExNTIiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNThCMDM3NCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05XdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITjdOV09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05XLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNThCMDM2QSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05YdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITjdOWE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05YLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM1OEIwMzc0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05ZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43Tll1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hON05ZT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNThCMDM2QSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43Tlp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hON05aT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE43TlJlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE43TlJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgNTc1LCAwLCAtMjM3MF0kWzAsIDI0NDYsIDAsIC00OTldIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE43TlotZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNTFCMDNFMSIgc291cmNlPSJfSE43TkZPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE43TkJPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TmF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05iT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05iZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hON05hLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE43TmFPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE43TmFlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTk4MiwgLTE2NTksIDE3NjEsIDMwMTRdJFstMjQxMywgLTQwOTcsIDMzMCwgNTc1XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hON05idWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hON05iLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hON05jT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzUxODAzMjgiIHNvdXJjZT0iX0hON05OT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hON05CT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05jLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOZHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITjdOZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hON05jZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hON05jdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE4NiwgLTU4NCwgLTEwODMsIDMwMjJdJFsxMDQ5LCAtMzAzMSwgLTIyMCwgNTc1XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hON05kLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hON05lT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hON05lZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzY5RjAwOEMiIHNvdXJjZT0iX0hOeURxT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOeURtT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05mT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOZi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITjdOZmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hON05ldWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hON05lLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzYyNiwgLTU4NCwgLTI4NzgsIDI1NjVdJFsyODQ0LCAtMjU3MywgLTY2MCwgNTc1XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hON05nT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hON05nZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hON05ndWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzZBMTAyRDMiIHNvdXJjZT0iX0hON005T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOeURtT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05oZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOaU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITjdOaHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hON05nLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hON05oT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEyNywgLTc5NSwgLTQzMSwgMjU1Nl0kWzQ0OCwgLTI3NzcsIC0xMTAsIDU3NV0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITjdOaWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITjdOaXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITjdOaS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM2QTQwMjkyIiBzb3VyY2U9Il9ITjdOQk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITnlEbU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TmtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TmtlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE43TmotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITjdOak9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITjdOamVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTA4LCAtNTg0LCAyMjM1LCAyNTY1XSRbLTIyNDMsIC0yNTczLCA0OTksIDU3NV0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITjdOa3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITjdOay1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITjdOcE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMjEyN0EwMThEIiBzb3VyY2U9Il9ITmZJWU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITmZJay1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TnFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TnF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE43TnFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITjdOcGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITjdOcHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNDU2LCAtMzcyLCAtNzIzMCwgMjg3OF0kWzU3MDYsIC0xNDA1LCAtMjk4MCwgMTg0NV0kWzc3MzAsIC0yNjc1LCAtOTU2LCA1NzVdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE43TnEtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE43TnJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE9FLUN1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxREE1MDI2OCIgc291cmNlPSJfSE9FOS11ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5vU1l1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLURlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1ELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1FT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hPRS1EdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE9FLUMtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hPRS1ET2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2OSwgLTU0MSwgMTYsIDIyMDFdJFsxNjksIC0yMTY3LCAxNiwgNTc1XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hPRS1FZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hPRS1FdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hPRS1FLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZDNDAzMjciIHNvdXJjZT0iX0hPRTktdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hON05yZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1GdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtR2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IT0UtRi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1HdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZDNTAxQTMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IT0UtRy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDMiIHk9Ii0zODEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGQzUwMUEzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1ILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hPRS1IdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGQzUwMTk4Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1JdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IT0UtSWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjYiIHk9Ii0zNTUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMyRkM1MDE5OCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hPRS1KT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNTQiIHk9Ijk4MiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGQzUwMUEzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1LT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FLUtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hPRS1KLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGQzUwMTk4Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1MT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FLUxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hPRS1LLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZDNTAxQTMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLU1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT0UtTWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE9FLUwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGQzUwMTk4Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1OT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT0UtTmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE9FLU0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IT0UtRk9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IT0UtRmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCA1MzMsIDAsIC0yMTA4XSRbMCwgMjExNiwgMCwgLTUyNF0iLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IT0UtTnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFNDk0REQwMkM5IiBzb3VyY2U9Il9ITm9TWXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITlZYZy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLU8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLVBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE9FLU91ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IT0UtTi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE9FLU9PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE5MjEsIDE5NCwgLTMxOTEsIDEyNjQwXSRbLTEwMDQxLCAxOTQsIC0xMTMxMSwgMTI2NDBdJFstMTAwNDEsIC0xMjg4NiwgLTExMzExLCAtNDQwXSRbLTkxNCwgLTEyODg2LCAtMjE4NCwgLTQ0MF0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtUGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtUHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IT0UtUC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMjEyNDgwMDFGIiBzb3VyY2U9Il9ITlZYUU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITlZYZy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLVJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLVJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE9FLVEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IT0UtUU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE9FLVFlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTc1LCAtNzg3LCAtNTcyMywgMTA5Ml0kWzU3NSwgLTIwMzIsIC01NzIzLCAtMTUyXSRbNDExNCwgLTIwMzIsIC0yMTg0LCAtMTUyXSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hPRS1SdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hPRS1SLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hPRS1TT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUyMTIzNzAxOEUiIHNvdXJjZT0iX0hOVlhnLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hON05sT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1TLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IT0UtVE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hPRS1TZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IT0UtU3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTAxLCAtNTg0LCAtMTUyLCAxOTU1XSRbLTEwMSwgLTE1NDksIC0xNTIsIDk5MF0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtVC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtVU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IT0UtVWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5MzUwMDQ4IiBzb3VyY2U9Il9ITlZYTU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITlZYZy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLVZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLVYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE9FLVZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IT0UtVXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE9FLVUtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTMxMTUsIC00NjUsIDgwMDksIC0zMTNdJFstODk0MCwgLTQ2NSwgMjE4NCwgLTMxM10iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtV09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtV2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IT0UtV3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzY4REIwM0U0IiBzb3VyY2U9Il9ITmZJay1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITlZYZy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLVgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLVlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE9FLVh1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IT0UtVy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE9FLVhPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzIxLCAtNTc1LCA1MjQsIDMzODZdJFszMjEsIC0zMzc4LCA1MjQsIDU4NF0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtWWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtWXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IT0UtWS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMjJGRTYwMTExIiBzb3VyY2U9Il9ITm9TTC1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITlZYZy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE9FLVotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IT0UtWk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE9FLVplZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTkzLCAtNzg3LCA5MjU0LCAzMTI0XSRbLTkzLCAtMTQxMywgOTI1NCwgMjQ5N10kWy04MzU2LCAtMTQxMywgOTkwLCAyNDk3XSRbLTgzNTYsIC0zMzI3LCA5OTAsIDU4NF0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtYXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtYS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IT0UtYk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM0OUMwMTcxIiBzb3VyY2U9Il9ITnlEbU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITlZYZy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE9FLWNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IT0UtYmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE9FLWJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTM5NywgLTQ3NiwgMTM1OTksIDcyMjNdJFstMzk3LCAtNTcxNSwgMTM1OTksIDE5ODRdJFstMTM1MjAsIC01NzE1LCA0NzYsIDE5ODRdJFstMTM1MjAsIC03MTk3LCA0NzYsIDUwMl0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtYy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtZE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTIxNkU0MDFFMyIgdHlwZT0iQ2xhc3MiIG5hbWU9IlR5cGVzIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTFGNzREMDA5MSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IT0UtZWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTk2NCIgaGVpZ2h0PSIxOTY0Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1ldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FLWZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT0UtZ09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1nZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT0UtZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1nLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FLWhPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hPRS1kdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IT0UtZC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI3NDUiIHk9IjY0MyIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1oZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUyMEIxQzAyRTEiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1pT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE9FLWllZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3NjAiIGhlaWdodD0iMTk2NCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1qT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1qZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPRS1qdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FLWtPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0Uta2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9PdThPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT091OGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPT3U4dWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IT0UtaHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE9FLWgtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzI5MyIgeT0iNTkyIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d6MmdJdWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGVzZSB0d3AgZGF0YSB0eXBlIGFyZSBiZWluZyB1c2VkIGJ5IHRoZSBkaWFtZ3JhbSBpbnRlcmNoYW5nZS4gIFRoZXkgbWlnaHQgYmUgcmVwbGFjZWQgd2l0aCB0eXBlcyBvZiB0aGUgaW1wbGVtZW50YXRpb24gcGxhdGZvcm0gYXMgbG9uZyBhcyB0aGUgYWxsb3cgdGhlIHNhbWUgdHlwZSBvZiBzZXJpYWxpemF0aW9uIGZvciBwZXJzaXN0ZW5jeS4iLz4KLSAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgIDwvY29udGVudHM+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3g2bVlPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTFGNjZCMDE1NSI+Ci0gICAgICAgIDxib2R5PjAxPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUU1Nzc0MDAyM0QiIGltcG9ydGVkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxRERGODY5MDEyRSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3g2bVp1ZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIi8+Ci0gICAgICA8L3BhY2thZ2VJbXBvcnQ+Ci0gICAgICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9Il95a3c4d094WkVkdU9Ock1SZ216NDhBIiBpbXBvcnRlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNjIiLz4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MUY3NEQwMDkxIiBuYW1lPSJQb2ludCI+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzNzVGMzAyNUUiIG5hbWU9IngiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTM3NUZDMDJEOSIgbmFtZT0ieSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIvPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTFGN0ZBMDI5NSIgbmFtZT0iR3JhcGhFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTM2OERCMDNFNCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTIxN0MxMDNCRSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MjBCNkEwM0EzIiBuYW1lPSJwb3NpdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MUY3NEQwMDkxIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMDc1OTAwM0EiIG5hbWU9ImNvbnRhaW5lZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MjE3QzEwM0JFIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMwNzU4MDExRiI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pqbFN1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HempsU2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU0NjAyOUMiIG5hbWU9ImxpbmsiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTMwQTI2MDJGOCIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMEU0NTAzOUYiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6c3ZFLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pzdkV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzBFN0UwMTcwIiBuYW1lPSJhbmNob3JhZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTMwOUZEMDE3QyIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMEU3QzAwRDciPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6c3ZHdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pzdkdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzE2OTkwMDAxIiBuYW1lPSJzZW1hbnRpY01vZGVsIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUzMTY2QTAyMDIiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzE2OTcwMzAyIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HenN2TnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6c3ZOZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MjBCMUMwMkUxIiBuYW1lPSJEaW1lbnNpb24iPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1Mzc2MDUwMTU1IiBuYW1lPSJ3aWR0aCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1Mzc2MEUwMTZDIiBuYW1lPSJoZWlnaHQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUyMTdDMTAzQkUiIG5hbWU9IkRpYWdyYW1FbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTIxMjM3MDE4RSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA2OTgwMTg3IiBuYW1lPSJpc1Zpc2libGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9HelowTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5PgotICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA3NTkwMDQ0IiBuYW1lPSJjb250YWluZXIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTFGN0ZBMDI5NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMDc1ODAxMUYiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6amxUZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pqbFRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA5MzkwMjEzIiBuYW1lPSJyZWZlcmVuY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTMwOTBFMDBCMCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMDkzODAzNDYiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6amxWT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pqbFUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA5QkQwMTVDIiBuYW1lPSJwcm9wZXJ0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MzA5ODIwM0JBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMwOUJDMDI0MSI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pqbFdPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HempsVi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA5MEUwMEIwIiBuYW1lPSJSZWZlcmVuY2UiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA5MzUwMDQ4IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MjE3QzEwM0JFIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkxNjAwMjYiIG5hbWU9ImlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX3RLVUZjT3lKRWR1NS12VmpsZlZzZlEiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkzOTAyMTEiIG5hbWU9InJlZmVyZW5jZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTIxN0MxMDNCRSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMDkzODAzNDYiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6amxVZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pqbFVPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMDk4MjAzQkEiIG5hbWU9IlByb3BlcnR5Ij4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTIxMjQ4MDAxRiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTIxN0MxMDNCRSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA5QTkwMDgxIiBuYW1lPSJrZXkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdnNsVlFleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il92c2xWUU95R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3ZrUFJrT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwOUFEMDIzNSIgbmFtZT0idmFsdWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfRGZsVHdleUpFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9EZmxUd095SkVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0RXQzlRT3lKRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMDlGRDAxN0MiIG5hbWU9IkdyYXBoQ29ubmVjdG9yIj4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTIxMjdBMDE4RCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTFGN0ZBMDI5NSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzBFN0UwMTdBIiBuYW1lPSJncmFwaEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTFGN0ZBMDI5NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMEU3QzAwRDciPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6c3ZIZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pzdkhPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwRkYzMDE2MiIgbmFtZT0iZ3JhcGhFZGdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUzMEExMjAyNDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzBGRjIwMzYwIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HenN2SWVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6c3ZJT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMEExMjAyNDUiIG5hbWU9IkdyYXBoRWRnZSI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMEUyOTAxNTAiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MTUxRjdGQTAyOTUiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwRkYzMDE2NCIgbmFtZT0iYW5jaG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUzMDlGRDAxN0MiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzBGRjIwMzYwIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HenN2Sk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMiIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6c3ZJLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIyIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMTQ4NjAyNkIiIG5hbWU9IndheXBvaW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MUY3NEQwMDkxIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMxNDg1MDM5NiI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pzdktPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HenN2Si1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMiIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwQTI2MDJGOCIgbmFtZT0iRGlhZ3JhbUxpbmsiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMjJGRTYwMTExIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MjE3QzEwM0JFIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMUNEQjAxRjAiIG5hbWU9Inpvb20iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxQ0U0MDJEOSIgbmFtZT0idmlld3BvcnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTFGNzREMDA5MSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzBFNDYwMjlFIiBuYW1lPSJncmFwaEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTFGN0ZBMDI5NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMEU0NTAzOUYiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6c3ZGdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pzdkZlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxNUREMDA0NyIgbmFtZT0iZGlhZ3JhbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MzBFMzQwMTU2IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMxNURCMDMwMSI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pzdk11ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HenN2TWVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwQTM3MDExQiIgbmFtZT0iR3JhcGhOb2RlIj4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwRTJCMDIxQiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTFGN0ZBMDI5NSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzE1QUIwMEE5IiBuYW1lPSJzaXplIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUyMEIxQzAyRTEiLz4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMEUzNDAxNTYiIG5hbWU9IkRpYWdyYW0iPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzBFM0EwM0NCIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MzBBMzcwMTFCIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMTVDNTAwMTAiIG5hbWU9Inpvb20iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2Q0VUl3ZXlPRWR1RktKb3ZCTDY0WFEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfZDRVSXdPeU9FZHVGS0pvdkJMNjRYUSIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzE1Q0MwMjY5IiBuYW1lPSJ2aWV3cG9pbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTFGNzREMDA5MSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzE1REQwMDNEIiBuYW1lPSJkaWFncmFtTGluayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MzBBMjYwMkY4IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMxNURCMDMwMSI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pzdkwtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HenN2THVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMUMxODAwRkYiIG5hbWU9Im5hbWVzcGFjZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MzE2NkEwMjAyIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMxQzE3MDE0RCI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pzdlBlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HenN2UE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxNjZBMDIwMiIgbmFtZT0iU2VtYW50aWNNb2RlbEJyaWRnZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUU0OTRERDAyQzkiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MTUyMTdDMTAzQkUiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxRDNBMDBDQSIgbmFtZT0icHJlc2VudGF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX1BfMHpJZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfUF8weklPeUhFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9SUXZCWU95SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMTY5OTAwMDMiIG5hbWU9ImdyYXBoRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MUY3RkEwMjk1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMxNjk3MDMwMiI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pzdk9lZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HenN2T09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMUMxODAxMDEiIG5hbWU9ImRpYWdyYW0iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTMwRTM0MDE1NiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMUMxNzAxNEQiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6c3ZRT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pzdlAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxRDY0MDM0MSIgbmFtZT0iU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzFEQTAwMUI3IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MzE2NkEwMjAyIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMUQ5MzAzNTMiIG5hbWU9InR5cGVJbmZvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2JoYjFJZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfYmhiMUlPeUhFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9iUmZVb095SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzFENzEwMDBCIiBuYW1lPSJVTUFTZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxREEzMDE4OSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTMxNjZBMDIwMiIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzJGRTMwMzJDIiBuYW1lPSJlbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzJGRTMwMTIzIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HejJnRS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6MmdFdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzFEODIwMjlBIiBuYW1lPSJDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMURBNTAyNjgiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MTUzMTY2QTAyMDIiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMyRkM1MDE5OCIgbmFtZT0iZWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFEREU2NjgwMENFIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMyRkM0MDMyNyI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pzdlJPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HenN2US1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNDJBMDFGQSIgbmFtZT0iTGVhZkVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM0OUMwMTcxIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MjE3QzEwM0JFIi8+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM0MzYwMjNEIiBuYW1lPSJUZXh0RWxlbWVudCI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzY5RjAwOEMiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MTUzMzQyQTAxRkEiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNUNDMDM0NSIgbmFtZT0idGV4dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9IbGx4d2V5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0hsbHh3T3lIRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfSFdzYUlPeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNDNGMDAxOSIgbmFtZT0iSW1hZ2UiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM2QTEwMkQzIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MzM0MkEwMUZBIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzVEMzAxRTciIG5hbWU9InVyaSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDExM0VBMjkwMkZFIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95cVI3MGV5T0VkdUZLSm92Qkw2NFhRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lxUjcwT3lPRWR1RktKb3ZCTDY0WFEiLz4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeWdTNVlPeU9FZHVGS0pvdkJMNjRYUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxMTNFQTI5MDJGRSIgdmFsdWU9IiIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM2OEEwMTg2IiBuYW1lPSJtaW1lVHlwZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9abVVCc2V5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1ptVUJzT3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfWmVhcDhPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNDQ2MDAzNyIgbmFtZT0iR3JhcGhpY1ByaW1pdGl2ZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzZBNDAyOTIiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MTUzMzQyQTAxRkEiLz4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzUwMTAxODEiIG5hbWU9IlBvbHlsaW5lIj4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNTE4MDMyOCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTMzNDQ2MDAzNyIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM2RTkwM0RCIiBuYW1lPSJjbG9zZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9HempsUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5PgotICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM1OEIwMzZBIiBuYW1lPSJ3YXlwb2ludHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTFGNzREMDA5MSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMzU4QjAxNjEiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6MmdHdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3oyZ0dlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjIiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzUwOTAwMzgiIG5hbWU9IkVsbGlwc2UiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM1MUIwM0UxIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MzM0NDYwMDM3Ii8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzUyMzAwMjEiIG5hbWU9ImNlbnRlciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MUY3NEQwMDkxIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzUyOTAwODQiIG5hbWU9InJhZGl1c1giIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNTMxMDM1NiIgbmFtZT0icmFkaXVzWSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM1M0QwMzcyIiBuYW1lPSJyb3RhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM1NDcwMzRFIiBuYW1lPSJzdGFydEFuZ2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9BVXE4SU94M0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzU1NjAyRjUiIG5hbWU9ImVuZEFuZ2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9BVXE4SU94M0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA3NTgwMTFGIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTUzMDc1OTAwM0EgXzNBREM3Qjc0MDIyRDQxNTMwNzU5MDA0NCIvPgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkzODAzNDYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxNTMwOTM5MDIxMSBfM0FEQzdCNzQwMjJENDE1MzA5MzkwMjEzIi8+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwOUJDMDI0MSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE1MzA5QkQwMTVDIF8zQURDN0I3NDAyMkQ0MTUzMDlCRDAxNUUiPgotICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA5QkQwMTVFIiBuYW1lPSJfZGlhZ3JhbUVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTIxN0MxMDNCRSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMwOUJDMDI0MSI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pqbFctZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HempsV3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkRW5kPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwRTQ1MDM5RiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE1MzBFNDYwMjlDIF8zQURDN0I3NDAyMkQ0MTUzMEU0NjAyOUUiLz4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzBFN0MwMEQ3IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU3RTAxNzAgXzNBREM3Qjc0MDIyRDQxNTMwRTdFMDE3QSIvPgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMEZGMjAzNjAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxNTMwRkYzMDE2MiBfM0FEQzdCNzQwMjJENDE1MzBGRjMwMTY0Ii8+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxNDg1MDM5NiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE1MzE0ODYwMjZCIF8zQURDN0I3NDAyMkQ0MTUzMTQ4NjAyNkQiPgotICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzE0ODYwMjZEIiBuYW1lPSJfZ3JhcGhFZGdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUzMEExMjAyNDUiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMTQ4NTAzOTYiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6c3ZLLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pzdkt1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMTVEQjAzMDEiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxNTMxNUREMDAzRCBfM0FEQzdCNzQwMjJENDE1MzE1REQwMDQ3Ii8+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxNjk3MDMwMiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE1MzE2OTkwMDAxIF8zQURDN0I3NDAyMkQ0MTUzMTY5OTAwMDMiLz4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzFDMTcwMTREIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTUzMUMxODAwRkYgXzNBREM3Qjc0MDIyRDQxNTMxQzE4MDEwMSIvPgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZDNDAzMjciIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxNTMyRkM1MDE5OCBfM0FEQzdCNzQwMjJENDE1MzJGQzUwMUEzIj4KLSAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMyRkM1MDFBMyIgbmFtZT0iX2NvcmVTZW1hbnRpY01vZGVsQnJpZGdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUzMUQ4MjAyOUEiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMkZDNDAzMjciPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6c3ZSLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pzdlJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICA8L293bmVkRW5kPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMyRkUzMDEyMyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE1MzJGRTMwMzJDIF8zQURDN0I3NDAyMkQ0MTUzMkZFMzAzNDAiPgotICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzJGRTMwMzQwIiBuYW1lPSJfdU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MzFENzEwMDBCIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzJGRTMwMTIzIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HejJnRnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6MmdGZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzU4QjAxNjEiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxNTMzNThCMDM2QSBfM0FEQzdCNzQwMjJENDE1MzM1OEIwMzc0Ij4KLSAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNThCMDM3NCIgbmFtZT0iX3BvbHlsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUzMzUwMTAxODEiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMzU4QjAxNjEiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6MmdIZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3oyZ0hPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERTYyMDAxQ0YiIG5hbWU9IlVNTDJJbmZyYXN0cnVjdHVyZU1pbmkiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HeHcxYXVmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MURGMkM0MzAxNTEiPgotICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREYyQzQzMDE1MSIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjcy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY4NjkwMTJFIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOQ2N0LWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5MbUVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOTG1FZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkxtRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkxtRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkxtRk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITkNjdE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY3RlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzU1IiB5PSI4NjMiIHdpZHRoPSIyNTQwIiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkxtRmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE2MkIwMzZGIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkxtR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOTG1HZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5MbUd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOTG1HLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkxtSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkxtSGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkxtSHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITkxtRnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5MbUYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzA5OCIgeT0iODYzIiB3aWR0aD0iMzIyNyIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d4dzFiT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgIDwvY29udGVudHM+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3d1VG9PZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFNjIwMDFDRiI+Ci0gICAgICAgIDxib2R5PjAyPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUE2MkIwMzZGIiBuYW1lPSJQcmltaXRpdmVUeXBlcyI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3hkNmNPZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIi8+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3c0RWt1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNjJCMDM2RiI+Ci0gICAgICAgICAgPGJvZHk+MDA8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNDQ5OEQwMTg1IiBuYW1lPSJEYXRlIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d3NEVsZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY0NDk4RDAxODUiPgotICAgICAgICAgICAgPGJvZHk+RGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIG9mIHRoZSB0eXBlIERhdGUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTNFQTI5MDJGRSIgbmFtZT0iVXJpIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d4Qk9nZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTEzRUEyOTAyRkUiPgotICAgICAgICAgICAgPGJvZHk+RGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIHRoYXQgcG9pbnQgdG8gcmVzb3VyY2VzIHN1Y2ggYXMgZmlsZXMuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgbmFtZT0iU3RyaW5nIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX2k3RlRvT2lmRWR1UWJ1WTZVd01TUWciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgPGJvZHk+QSBzdHJpbmcgaXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGluIHNvbWUgc3VpdGFibGUgY2hhcmFjdGVyIHNldCB1c2VkIHRvIGRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1vZGVsLiBDaGFyYWN0ZXIgc2V0cyBtYXkgaW5jbHVkZSBub24tUm9tYW4gYWxwaGFiZXRzIGFuZCBjaGFyYWN0ZXJzLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQzRjA5ODlCOTAyOTAiIG5hbWU9IlNldCIvPgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJEM0YwOTg5OUMwMEVBIiBuYW1lPSJTZXF1ZW5jZSIvPgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJEM0NBMDEwQTQwMDdCIiBuYW1lPSJJbnRlZ2VyIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX2RVYzZvT29GRWR1T0JQUUEyaEtxVVEiIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQzQ0EwMTBBNDAwN0IiPgotICAgICAgICAgICAgPGJvZHk+QW4gaW50ZWdlciBpcyBhIHByaW1pdGl2ZSB0eXBlIHJlcHJlc2VudGluZyBpbnRlZ2VyIHZhbHVlcy48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyIgbmFtZT0iQm9vbGVhbiI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il81R2NZQWVpZUVkdVFidVk2VXdNU1FnIiBhbm5vdGF0ZWRFbGVtZW50PSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICA8Ym9keT5BIEJvb2xlYW4gdHlwZSBpcyB1c2VkIGZvciBsb2dpY2FsIGV4cHJlc3Npb24sIGNvbnNpc3Rpbmcgb2YgdGhlIHByZWRlZmluZWQgdmFsdWVzIHRydWUgYW5kIGZhbHNlLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il9BVXE4SU94M0VkdTUtdlZqbGZWc2ZRIiBuYW1lPSJEb3VibGUiLz4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERGODY5MDEyRSIgbmFtZT0iQ29uc3RydWN0cyI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3h3MVotZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDFEREU2MzYwMDA0Ij4KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERFNjM2MDAwNCIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJjdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTY2ODAwQ0UiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hNNHJkdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNjkzIiBoZWlnaHQ9IjEwODMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE00cmUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE00cmZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE00cmYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hNNHJnZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE00cmMtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE00cmRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTkzNyIgeT0iOTk2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJndWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERUNCNTAwOTgiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hNNHJodWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cml1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE00cmktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE00cmplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE00cmotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hNNHJrZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE00cmctZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE00cmhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTY1IiB5PSI2ODI0IiB3aWR0aD0iMTUyNCIgaGVpZ2h0PSI3NjUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmt1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFNjU4MDE1NyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRybGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE00cmx1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY0lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY0llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY0l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjSS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjSk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjSmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjSnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjSi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjS09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjS2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY0t1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITTRyay1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITTRybE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3OTUiIHk9IjkyMjAiIHdpZHRoPSIyMzY0IiBoZWlnaHQ9IjkwNyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjTk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREZBNDQwM0E4Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITkNjT09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NQT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NQZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NQdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NQLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NRT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NRZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NRdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjUS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOQ2NOZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2NOdWZYRWR1cUhvT0piVVJaUnciIHg9IjkyMjAiIHk9IjUzMDAiIHdpZHRoPSIzMTMyIiBoZWlnaHQ9IjcxMiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjUk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREUwNjIwMkQ1Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITkNjU09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY1RlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1R1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY1QtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY1VlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1V1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NVLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5DY1JlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY1J1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTI0OSIgeT0iMjY2NyIgd2lkdGg9IjMyODYiIGhlaWdodD0iMTEyNCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjYi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREU4MzMwMUE1Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITkNjYy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NkLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NlT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NlZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NldWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NlLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NmT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NmZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjZnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOQ2NjT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2NjZWZYRWR1cUhvT0piVVJaUnciIHg9IjQ3MTUiIHk9IjUzNTAiIHdpZHRoPSI0MTQxIiBoZWlnaHQ9IjY1OSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNja2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREZBMzYwMkMxIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITkNjbGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjbC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NtZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NtdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NuT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NuZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NudWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NuLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjb09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOQ2NrdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2NrLWZYRWR1cUhvT0piVVJaUnciIHg9Ijk0OTEiIHk9Ijg2NjEiIHdpZHRoPSIyMjIwIiBoZWlnaHQ9IjgyNyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3h3MWFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOQ2NLLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjhCRDAyOEYiIHNvdXJjZT0iX0hNNHJrdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hNNHJndWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY0x1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY01PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjTWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2NMLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOQ2NMT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5DY0xlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTU0MSwgMCwgMTg0NV0kWzAsIC0xODQ1LCAwLCA1NDFdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjTXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NNLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITkNjVk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREVDQUYwMjAyIiBzb3VyY2U9Il9ITkNjUk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITTRyY3VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1d1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjV09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITkNjVmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOQ2NWdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzgsIC03OTUsIC00MiwgMTQ5MF0kWzMzLCAtMTc0NCwgLTE2LCA1NDFdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjVy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NYT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITkNjWGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY5MTIwM0MwIiBzb3VyY2U9Il9ITTRyZ3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITkNjUk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1ktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjWWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITkNjWHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOQ2NYLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzY2OCwgLTU1MCwgLTQyNTgsIDMzNjFdJFszOTIwLCAtMzEyNCwgLTEwMDcsIDc4N10iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NaT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY1plZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOQ2NadWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkI0NTAzRDUiIHNvdXJjZT0iX0hOQ2NOT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOQ2NST2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2NhdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOQ2NaLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5DY2FPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg0NiwgLTU1MCwgMjg2MSwgMTgzN10kWy0yNDcyLCAtMTYwMCwgMTIzNiwgNzg3XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY2JlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjYnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5DY2YtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGOEQ0MDIxMSIgc291cmNlPSJfSE5DY2ItZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5DY1JPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NoZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY2ctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5DY2dPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITkNjZ2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTUwLCAwLCAxODg4XSRbMCwgLTE2NTEsIDAsIDc4N10iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NodWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY2gtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOQ2NpT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjcxQjAzQTgiIHNvdXJjZT0iX0hNNHJndWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOQ2NiLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjanVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2NqT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOQ2NpZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5DY2l1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzYyLCAtMjM3LCAtNDE2NSwgMTIzNl0kWzMwOTAsIC05MzEsIC0xODM3LCA1NDFdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjai1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NrT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITkNjb2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREZCQ0EwMEU5IiBzb3VyY2U9Il9ITkNja2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITkNjTk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY3AtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjcGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITkNjb3VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOQ2NvLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01NDEsIDAsIDI4MTBdJFswLCAtMjgxMCwgMCwgNTQxXSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY3FPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjcWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5DY3F1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGQkNGMDJBOSIgc291cmNlPSJfSE5DY2tlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5DY2ItZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY3J1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5DY3EtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITkNjck9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNjAxLCAtNTQxLCAzMTA3LCAyNzYwXSRbLTMwOTgsIC0yNzYwLCA2MDksIDU0MV0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NzZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY3N1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERFNjU4MDE1NyIgbmFtZT0iQ2xhc3NpZmllciIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HeGQ2ZHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREU2NTgwMTU3Ij4KLSAgICAgICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBDbGFzc2lmaWVyLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREY4QkQwMjhGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREVDQjUwMDk4Ii8+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERFNjY4MDBDRSIgbmFtZT0iRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HeG5yYy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREU2NjgwMENFIj4KLSAgICAgICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREUwNjIwMkQ1IiBuYW1lPSJOYW1lZEVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3hucmR1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFMDYyMDJENSI+Ci0gICAgICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC4gIERlZmluZWQgdGhhdCBldmVyeSBlbGVtZW50IGhhcyBhIG5hbWUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERUNBRjAyMDIiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTY2ODAwQ0UiLz4KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREZDOEUwMEI2IiBuYW1lPSJuYW1lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfRWdzeWdleUpFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0Vnc3lnT3lKRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9FWXBwd095SkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREU4MzMwMUE1IiBuYW1lPSJQYWNrYWdlYWJsZUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3hucmUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFODMzMDFBNSI+Ci0gICAgICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREY4RDQwMjExIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREUwNjIwMkQ1Ii8+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERFQ0I1MDA5OCIgbmFtZT0iVHlwZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HeG5yZi1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREVDQjUwMDk4Ij4KLSAgICAgICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBUeXBlLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREY3MUIwM0E4IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREU4MzMwMUE1Ii8+Ci0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERGOTEyMDNDMCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERFMDYyMDJENSIvPgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERkEzNjAyQzEiIG5hbWU9IlBhY2thZ2UiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3hucmhPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGQTM2MDJDMSI+Ci0gICAgICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnZS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERGQkNBMDBFOSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERGQTQ0MDNBOCIvPgotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERkJDRjAyQTkiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTgzMzAxQTUiLz4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREZBNDQwM0E4IiBuYW1lPSJOYW1lc3BhY2UiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3h3MVpPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGQTQ0MDNBOCI+Ci0gICAgICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgTmFtZXNwYWNlLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREZCNDUwM0Q1IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREUwNjIwMkQ1Ii8+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2RDA0MDBGMSIgbmFtZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d3dVRtdWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQwRjU2NEZBMDA5NSI+Ci0gICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNTY0RkEwMDk1IiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITEdpdC1mWEVkdXFIb09KYlVSWlJ3IiBmb250TmFtZT0iQXJpYWwiIGRlc2NyaXB0aW9uPSJEZWZpbmVzIGRpYWdyYW1zIGZvciBwcm9jZXNzIHZpc3VhbGl6YXRpb24gYmFzZWQgb24gdGhlIFVNTDIgZGlhZ3JhbSBpbnRlcmNoYW5nZSBzdGFuZGFyZC4gIENvbnRhaW5zIGRpYWdyYW1zIGZvciB3b3JrZmxvd3MsIHdvcmsgcHJvZHVjdCBkZXBlbmRlbmNpZXMsIGFuZCB0ZWFtIGJyZWFrZG93bnMuIiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMR2l1T2ZYRWR1cUhvT0piVVJaUnciIHg9IjIyNzA3IiB5PSI0NDYxIiB3aWR0aD0iNzUyNiIgaGVpZ2h0PSIyMDQ4Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0hMR2l2T2ZYRWR1cUhvT0piVVJaUnciIGZvbnROYW1lPSJBcmlhbCIgZGVzY3JpcHRpb249IkRlZmluZXMgaG93IGNvcmUgY29udGVudCBlbGVtZW50cyBjYW4gYmUgb3JnYW5pemVkIGZvciBpbnN0YW50aWF0aW9uIGluIHByb2Nlc3Nlcy4gIFByb2Nlc3NlcyBoYXZlIGxvY2FsIHNjaGVtZXMgZmFjaWxpdGF0aW5nIHJlZGVmaW5pdGlvbiBvZiByZWxhdGlvbnNoaXBzIGJldHdlZW4gUm9sZXMsIFRhc2tzLCBhbmQgV29ya1Byb2R1Y3RzLiBUaGVyZSBhcmUgdHdvIG1haW4gdmFyaWF0aW9ucyBvZiBwcm9jZXNzIGRlZmluZWQ6IERlbGl2ZXJ5IFByb2Nlc3Nlcywgd2hpY2ggZGVzY3JpYmVzIGVuZC10by1lbmQgd2F5cyBvZiBkb2luZyBhICZxdW90O3Byb2plY3QmcXVvdDsgYXMgd2VsbCBhcyBDYXBhYmlsaXR5IFBhdHRlcm5zLCB3aGljaCBwcm92aWRlIHJldXN1YWJsZSBwYXJ0cyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbXBvc2UgRGVsaXZlcnkgUHJvY2Vzc2VzLiYjeEE7IiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMR2l2ZWZYRWR1cUhvT0piVVJaUnciIHg9IjIyNzQ5IiB5PSI3Njg3IiB3aWR0aD0iNzAzNSIgaGVpZ2h0PSI0NTQ2Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0hMR2l3ZWZYRWR1cUhvT0piVVJaUnciIGZvbnROYW1lPSJBcmlhbCIgZGVzY3JpcHRpb249IkRlZmluZXMgYSBwbHVnaW4gbWVjaGFuaXNtIHdoaWNoIHJlbGllcyBvbiBwYWNrYWdpbmcgYXMgd2VsbCBhcyBuZXcgcmVsYXRpb25zaGlwIHR5cGVzIGZvciBjb250ZW50IGFuZCBwcm9jZXNzIGVsZW1lbnRzIHRoYXQgYWxsb3cgZGVjbGFyaW5nIGNoYW5nZSBkZWx0YXMgd2l0aG91dCBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIHNvdXJjZS4iIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSExHaXd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzE3IiB5PSIyODUzIiB3aWR0aD0iNjU0NCIgaGVpZ2h0PSIyMzExIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0hMR2l4dWZYRWR1cUhvT0piVVJaUnciIGZvbnROYW1lPSJBcmlhbCIgZGVzY3JpcHRpb249IkRlZmluZXMga2V5IGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgV29ya1Byb2R1Y3RzLCBUYXNrcywgdGhlaXIgYXR0cmlidXRlcywgYW5kIHRoZWlyIGRlZmF1bHQgcmVsYXRpb25zaGlwcy4gQWxzbyBkZWZpbmVzIGEgYmFzaWMgbWVjaGFuaXNtcyB0byBvcmdhbml6ZSBjb3JlIGNvbnRlbnQgaW4gcGFja2FnZXMuIiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMR2l4LWZYRWR1cUhvT0piVVJaUnciIHg9IjYzNCIgeT0iOTgyNyIgd2lkdGg9IjYyODIiIGhlaWdodD0iMjgwMiIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITEdpeS1mWEVkdXFIb09KYlVSWlJ3IiBmb250TmFtZT0iQXJpYWwiIGRlc2NyaXB0aW9uPSJEZWZpbmVzIGhvdyBwbHVnaW5zIGFyZSBmdXJ0aGVyIHBhY2thZ2VkIGluIGxpYnJhcmllcyBhcyB3ZWxsIGFzIGRlZmluZXMgdGhlIGNvbmNlcHQgb2YgY29uZmlndXJhdGlvbnMgZXh0ZW5kaW5nIHRoZSBwbHVnaW4gbWVjaGFtaXNtLiIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITEdpek9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjcwNyIgeT0iMTQ5MCIgd2lkdGg9IjYyOTkiIGhlaWdodD0iMTY5MyIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNZZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQkYiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNaT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSExQc1plZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc1otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNhZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hMUHNhdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hMUHNZdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITFBzWS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDkzNSIgeT0iODczNyIgd2lkdGg9IjM4NjAiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNhLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRkIiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSExQc2ItZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNjLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hMUHNkT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hMUHNiT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITFBzYmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4NDgzIiB5PSIyNzk0IiB3aWR0aD0iMzg2MCIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVGV4dCI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0hMUHNkdWZYRWR1cUhvT0piVVJaUnciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iMTIiIGJvbGQ9InRydWUiIGRlc2NyaXB0aW9uPSJJQk0gVW5pZmllZCBNZXRob2RzIEFyY2hpdGVjdHVyZSB2MS4wLjQ6IENvbmNlcHR1YWwgTWV0YS1Nb2RlbCIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITFBzZC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNTUiIHk9IjQ1NyIgd2lkdGg9IjEzOTE5IiBoZWlnaHQ9IjUyNCIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNmLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5OTRCRjAyODIiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSExQc2ctZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNoLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hMUHNpT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hMUHNnT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITFBzZ2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxODEwMSIgeT0iNDU3MiIgd2lkdGg9IjM3MjUiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNrLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxN0IiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSExQc2wtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc21lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hMUHNuT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hMUHNsT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITFBzbGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MTAyIiB5PSIxMDM0NiIgd2lkdGg9IjM2MTUiIGhlaWdodD0iMTcxMCIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNxLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwM0IiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSExQc3ItZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc3NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hMUHN0T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hMUHNyT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITFBzcmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTI4MiIgeT0iMTQxMyIgd2lkdGg9IjM0NzkiIGhlaWdodD0iMTcwMSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hd3VUbk9mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIFVNQSBNZXRhLU1vZGVsIGlzIHN0cnVjdHVyZWQgYXMgZGVwaWN0ZWQgaW4gdGhlIGRpYWdyYW0uICBUaGUgc3RydWN0dXJlIGRpdmlkZXMgdGhlIG1vZGVsIGluIGxvZ2ljYWwgdW5pdHMuICBFYWNoIHVuaXQgZXh0ZW5kcyB0aGUgdW5pdHMgaXQgZGVwZW5kcyB1cG9uIHByb3ZpZGluZyBhZGRpdGlvbmFsIHN0cnVjdHVyZXMgYW5kIGNhcGFiaWxpdGllcy4gIE92ZXJhbGwgdGhlIFVNTCAyLjAgcGFja2FnZSBtZXJnZSBtZWNoYW5pc20gYXBwbGllZCB0byB0aGUgcGFja2FnZXMgcmVhbGl6ZXMgYSBncmFkdWFsIGV4dGVuc2lvbiBvZiB0aGUgY2FwYWJpbGl0aWVzIG1vZGVsZWQgdW5pdCBieSB1bml0LiAgQXMgYSByZXN1bHQsIHVuaXRzIGRlZmluZWQgb24gYSBsb3dlciBsYXllciBjYW4gYmUgcmVhbGl6ZWQgYnkgYSBVTUEgc3Vic2V0LWltcGxlbWVudGF0aW9uIHdpdGhvdXQgdGhlIGhpZ2hlciBsZXZlbCB1bml0cy4gIEZvciBleGFtcGxlLCBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgY291bGQgYmUgYmFzZWQganVzdCBvbiB0aGUgTWV0aG9kIENvcmUgYW5kIE1ldGhvZCBQbHVnaW4gcGFja2FnZXMgd2l0aG91dCB1c2luZyB0aGUgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLiAgSG93ZXZlciwgaWYgdGhlIFByb2Nlc3MgcGFja2FnZSB3b3VsZCBiZSBpbmNsdWRlZCBhcyB3ZWxsIGZvciB0aGUgaW1wbGVtZW50YXRpb24gdGhlbiBhZGRpdGlvbmFsIGNhcGFiaWxpdGllcyBmcm9tIHRoZSBQcm9jZXNzIHBhY2thZ2Ugd291bGQgYmUgbWVyZ2VkIGludG8gdGhlIE1ldGhvZCBQbHVnaW4gcGFja2FnZS4iLz4KLSAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hMUHNldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9ITEdpdS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITFBzWWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITFBzZS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITFBzZk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzUyMiwgLTMyMSwgNTg3NSwgNTldJFstNzQ2NywgLTMyMSwgMTkzMCwgNTldIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSExQc2ZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSExQc2Z1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSExQc2llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0hMR2l0dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hMUHNmLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hMUHNpdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSExQc2ktZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTM3NjcsIDAsIDI3MzQsIDc2XSRbLTQ2MzksIDAsIDE4NjIsIDc2XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hMUHNqT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hMUHNqZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hMUHNqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9ITEdpd09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITFBzYS1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITFBzai1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITFBza09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszMjY4LCAtNjM1LCAtMzQzNywgLTQ1N10kWzQ3NjYsIC02MzUsIC0xOTM4LCAtNDU3XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hMUHNrZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hMUHNrdWZYRWR1cUhvT0piVVJaUnciIGlkPSIoMC4wODQ3MTUwMiwwLjgxMDg1OTIpIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSExQc3B1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0hMR2l4ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hMUHNrLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hMUHNwLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSExQc3FPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNDM4NSwgNjM1LCAtMTgxMSwgLTIwM10kWzMxNDEsIDQ1NywgLTMwNTYsIC0zODFdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSExQc3FlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSExQc3F1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSExQc3gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0hMR2l5dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hMUHNxLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hMUHN5T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hMUHN5ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03MTAzLCAtOTMsIDE3MzUsIC0xNl0kWy0zMTU4LCAtOTMsIDU2ODEsIC0xNl0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITFBzeXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITFBzeS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0doRXVBdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkQwNDAwRjEiPgotICAgICAgICA8Ym9keT4wMTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNCRiIgbmFtZT0iUHJvY2VzcyI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR29PZTZ1ZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDBGRDg1NkIwMjc2Ij4KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ4NTZCMDI3NiIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdwdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNDc4RTAwMEQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd3FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfVXdxdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd3J1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3ci1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19Vd3AtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd3FPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzM2MCIgeT0iMTE0NTYiIHdpZHRoPSIzMzk4IiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd3NPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ4NTQ2MDBEOCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX2VoUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR19laFFlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19laFF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19laFEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19laFJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX2VoUmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfZWhSdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX1V3c2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX1V3c3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNzg5IiB5PSI4MzM0IiB3aWR0aD0iMjU0MCIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhSLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZEODkxRjAyQ0QiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19laFN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfZWhTLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19laFQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX2VoVU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19laFNPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19laFNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzUxMSIgeT0iNTUwNSIgd2lkdGg9IjMwOTYiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX25yUXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEQwRUQwMTA0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX3hjTWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNOZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR194Y051ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfbnJRLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfbnJST2ZYRWR1cUhvT0piVVJaUnciIHg9IjMyOTkiIHk9Ii0zMTEiIHdpZHRoPSIzNTIwIiBoZWlnaHQ9IjE2ODQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y1NlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREYyQTFCMDJFNyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR194Y1RlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y1R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y1QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y1VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjVWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfeGNVdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX3hjU3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX3hjUy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyOTU0IiB5PSIyNDcwIiB3aWR0aD0iNDIwOSIgaGVpZ2h0PSIxNjg0Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hb09lN09mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0ifFVNQSBzZXBhcmF0ZXMgcmV1c2FibGUgY29yZSBtZXRob2QgY29udGVudCBmcm9tIGl0cyBhcHBsaWNhdGlvbiBpbiBwcm9jZXNzZXMuICBBIERldmVsb3BtZW50IFByb2Nlc3MgZGVmaW5lcyB0aGUgc3RydWN0dXJlZCB3b3JrIGRlZmluaXRpb25zIHRoYXQgbmVlZCB0byBiZSBwZXJmb3JtZWQgdG8gZGV2ZWxvcCBhIHN5c3RlbSwgZS5nLiBieSBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGZvbGxvd3MgdGhlIHByb2Nlc3MuICBTdWNoIHN0cnVjdHVyZWQgd29yayBkZWZpbml0aW9ucyBkZWxpbmVhdGUgdGhlIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFsb25nIGEgdGltZWxpbmUgb3IgbGlmZWN5Y2xlIGFuZCBvcmdhbml6ZSBpdCBpbiBzbyBjYWxsZWQgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUYXNrcyAoYXMgdGhleSBoYXZlIGJlZW4gaW50cm9kdWNlZCBhcyBwYXJ0IG9mIHRoZSBjb3JlIG1ldGhvZCBjb250ZW50KSBwcm92aWRlIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgZm9yIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBwZXJmb3JtZWQgdG8gYWNoaWV2ZSBhIHBhcnRpY3VsYXIgZGV2ZWxvcG1lbnQgZ29hbC4gIEEgVGFzayBkb2VzIG5vdCBsb29rIGF0IHRoZSAnYmlnIHBpY3R1cmUnIG9mIGhvdyB0aGUgd29yayBkZXNjcmliZWQgcmVsYXRlcyB0byBvdGhlciBUYXNrJ3Mgd29yay4gIFRoZXkgaGF2ZSBiZWVuIGRlZmluZWQgYXMgcmV1c2FibGUgY29yZSBtZXRob2QgY29udGVudCBpbmRlcGVuZGVudCBvZiB0aGVpciBwbGFjZW1lbnQgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiAgQWxsIHRoYXQgaXMgZGVmaW5lZCBmb3IgYSBUYXNrIGFyZSB0aGUgdHlwZXMgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cywgdGhlIGNvbmNyZXRlIHN0ZXBzIHRvIHBlcmZvcm0sIGFzIHdlbGwgYXMgd2hhdCBza2lsbHMgYXJlIHJlcXVpcmVkIHRvIHBlcmZvcm0gdGhlIHdvcmsgKHJvbGVzKS4gIFdoaWNoIFRhc2tzIGhhdmUgdG8gcHJlY2VkZSBhbmQgc3VjY2VlZCBhIFRhc2sgYXMgd2VsbCBhcyB3aGF0IHN0ZXBzIHRvIGZvY3VzIG9uIGF0IHdoYXQgcG9pbnQgb2YgdGltZSBpbiB0aGUgbGlmZWN5Y2xlIGFyZSBpbnRlbnRpb25hbGx5IG5vdCBkZWZpbmVkIGZvciBjb3JlIG1ldGhvZCBjb250ZW50LiAgVGhlIGdvYWwgaXMgcHJvdmlkZSBUYXNrcyB0aGF0IGNhbiBiZSByZXVzZWQgZm9yIG1hbnkgZGlmZmVyZW50IGRldmVsb3BtZW50IHNpdHVhdGlvbnMuJiN4QTt8VGhlIHNjb3BlIG9mIGEgcHJvY2VzcyBpcyB0byBwcm92aWRlIGV4dGVuZGVkIGFzIHdlbGwgYXMgY29uY3JldGUgd29yayBzdHJ1Y3R1cmVzIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHNpdHVhdGlvbi4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIHRha2VzIHJldXNhYmxlIGNvcmUgbWV0aG9kIGVsZW1lbnRzIHN1Y2ggYXMgVGFza3MgYW5kIFdvcmsgUHJvZHVjdHMgYW5kIHJlbGF0ZXMgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gIFRvIGRvIHNvLCBVTUEncyBQcm9jZXNzIFBhY2thZ2UgcHJvdmlkZXMgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgcmVmbGVjdCB0aGUgaW5kdXN0cmllcyBiZXN0IHByYWN0aWNlcy4gIFRoaXMgc2VjdGlvbiBkZWZpbmVzIEJyZWFrZG93biBzdHJ1Y3R1cmUgbWV0YS1tb2RlbHMgdGhhdCBjb21wcmlzZSBvZiBkaWZmZXJlbnQgdHlwZXMgb2YgYnJlYWtkb3duIGVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdGllcywgd2hpY2ggYXJlIGhpZ2hlciBsZXZlbCBncm91cGluZ3Mgb2Ygd29yayBjb21wcmlzaW5nIG9mIFRhc2tzIG9yIG90aGVyIEFjdGl2aXRpZXMgZGVmaW5pbmcgc2VxdWVuY2VzIGFuZCBjb25kaXRpb25zIG9uIFRhc2tzLiAgSW4gZmFjdCwgYSBwcm9jZXNzIGlzIGRlZmluZWQgYXMgYSBzcGVjaWFsIGtpbmQgb2YgQWN0aXZpdHkgaXRzZWxmLiAgVGhpcyBicmVha2Rvd24gc3RydWN0dXJlcyBtZXRhLW1vZGVsIGhhcyBiZWVuIGRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlIGNvbmNyZXRlIGxpZmVjeWNsZSBtb2RlbHMgdGhlIHByb2Nlc3MgZW5naW5lZXIgd2FudHMgdG8gZXhwcmVzcyB3aXRoIHRoZW0uICBJbiBvdGhlciB3b3JkcyB0aGUgbWV0YS1tb2RlbCBpcyBhYmxlIHRvIHJlcHJlc2VudCAnZGlmZmVyZW50IHR5cGVzIG9mJyB3YXRlcmZhbGwgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgaXRlcmF0aXZlIG9yIGluY3JlbWVudGFsIHByb2Nlc3MgbW9kZWxzLiAgRmluYWxseSwgVU1BIGVuYWJsZXMgZGlmZmVyZW50IHR5cGUgb2YgcHJlc2VudGF0aW9ucyBmb3IgYnJlYWtkb3duIHN0cnVjdHVyZXMsIGFzIGlsbHVzdHJhdGVkIHdpdGggZXhhbXBsZSBpbiB0aGUgc2VjdGlvbnMgYmVsb3csIHN1Y2ggYXMgcHJvamVjdCBwbGFuLWxpa2Ugc3RydWN0dXJlZCBsaXN0LCB3b3JrZmxvdyBvciBhY3Rpdml0eSBkaWFncmFtcywgYW5kIHN0YXRpYyBzdHJ1Y3R1cmUgZGlhZ3JhbXMgc2hvdyBpbnB1dHMvb3V0cHV0cyB0byB3b3JrIGFzIHdlbGwgYXMgcGVyZm9ybWluZyByb2xlcy4gIFVNQSdzIFByb2Nlc3MgcGFja2FnZSBleHRlbmRzIHRoZSBjb25jZXB0cyBkZWZpbmVkIGluIE1ldGhvZCBDb3JlIHRocm91Z2ggcGFja2FnZSBtZXJnZSBhcyBkZXBpY3RlZCBpbiB0aGUgZGlhZ3JhbS4gIEJyZWFrZG93biBtZXJnZXMgdGhlIHdob2xlIG9mIE1ldGhvZCBDb3JlIGJ5IG1lcmdpbmcgdGhlIE1ldGhvZCBQYWNrYWdlIHBhY2thZ2UuICBQcm9jZXNzIGlzIHNwZWNpZmllZCBpbiBVTUEgd2l0aCB0aGUgZm9sbG93aW5nIGZpdmUgcGFja2FnZXMuICBUaGUgQnJlYWtkb3duIHBhY2thZ2UgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgYnJlYWtkb3duIGVsZW1lbnRzIHRoYXQgZm9ybSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFByb2Nlc3MgVHlwZXMgZGVmaW5lIFByb2Nlc3NlcyBhcyBzcGVjaWFsIEFjdGl2aXRpZXMgKGRlZmluZWQgaW4gYnJlYWtkb3duIGVsZW1lbnRzKSBhbmQgaW50cm9kdWNlIGRpZmZlcmVudCB0eXBlcyBvZiBQcm9jZXNzZXMgc3VjaCBhcyBEZWxpdmVyeSBQcm9jZXNzIG9yIENhcGFiaWxpdHkgUGF0dGVybnMuICBQcm9jZXNzIFBhY2thZ2UgcmVmaW5lcyB0aGUgTWV0aG9kIFBhY2thZ2UgY29uY2VwdHMgZGVmaW5lZCBpbiBNZXRob2QgQ29yZSB3aXRoIG5ldyBwYWNrYWdlcyB0aGF0IG9yZ2FuaXplIHByb2Nlc3NlcyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBQcm9jZXNzIERlc2NyaXB0aW9ucyBwcm92aWRlcyBwcm9jZXNzIHNwZWNpZmljIGNvbnRlbnQgZGVzY3JpcHRpb25zIGV4dGVuZGluZyB0aGUgdGF4b25vbXkgYmFzZWQgb24gdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gY2xhc3MgZGVmaW5lZCBpbiBNZXRob2QgQ29yZS4gIEZpbmFsbHksIFdvcmtmbG93IGRlZmluZXMgaG93IHByb2Nlc3MgY2FuIGJlIGVuYWN0ZWQgYnkgcHJvdmlkaW5nIGV4dGVuZGVkIGRhdGEgc3RydWN0dXJlcyB0aGF0IGFsbG93IGNyZWF0aW5nIG1vZGVscyBmaXQgZm9yIGluc3RhbnRpYXRpb24gb24gdGhlIE0wIGxldmVsLiAgSW4gb3RoZXIgd29yZHMsIGl0IHByb3ZpZGVzIGEgbWV0YS1zY2hlbWEgZm9yIHdvcmtmbG93IG1vZGVscyB0aGF0IGNhbiBydW4gaW4gYSB3b3JrZmxvdyBzaW11bGF0b3Igc3VjaCBhcyBJQk0gV2Vic3BoZXJlIEJ1c2luZXNzIEludGVncmF0aW9uIE1vZGVsZXIuJiN4QTsiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9EeG55c094TUVkdU9Ock1SZ216NDhBIiBlbGVtZW50PSJfRHhMR3dPeE1FZHVPTnJNUmdtejQ4QSIgc291cmNlPSJfR19Vd3NPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR19Vd3B1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9EeG55cy14TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9EeG55dGV4TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0R4bnl0LXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRHhueXR1eE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0R4bnl0T3hNRWR1T05yTVJnbXo0OEEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0R4bnlzZXhNRWR1T05yTVJnbXo0OEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRHhueXN1eE1FZHVPTnJNUmdtejQ4QSIgcG9pbnRzPSJbMywgMzIsIC02LCAtODVdJFsxMSwgMTUwLCAyLCAzM10iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRm9QV0VleE1FZHVPTnJNUmdtejQ4QSIgZWxlbWVudD0iX0ZvUFdFT3hNRWR1T05yTVJnbXo0OEEiIHNvdXJjZT0iX0dfZWhSLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfVXdzT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRm9QV0ZPeE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRm9QV0Z1eE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Gb1BXR094TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZvUFdGLXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9Gb1BXRmV4TUVkdU9Ock1SZ216NDhBIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9Gb1BXRXV4TUVkdU9Ock1SZ216NDhBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ZvUFdFLXhNRWR1T05yTVJnbXo0OEEiIHBvaW50cz0iWzIsIDMyLCAtOCwgLTkxXSRbMTEsIDE1NSwgMSwgMzJdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ladF9NZXhNRWR1T05yTVJnbXo0OEEiIGVsZW1lbnQ9Il9JWnRfTU94TUVkdU9Ock1SZ216NDhBIiBzb3VyY2U9Il9HX3hjU2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HX2VoUi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ladF9OT3hNRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ladF9OdXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSVp0X09PeE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JWnRfTi14TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSVp0X05leE1FZHVPTnJNUmdtejQ4QSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSVp0X011eE1FZHVPTnJNUmdtejQ4QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9JWnRfTS14TUVkdU9Ock1SZ216NDhBIiBwb2ludHM9Ils4MSwgMTcsIC0xMjcsIC0xNF0kWzE1NywgNjMsIC01MSwgMzJdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX3IwVlJJZXhoRWR1SGplM3BQYWhONEEiIGVsZW1lbnQ9Il9yMFZSSU94aEVkdUhqZTNwUGFoTjRBIiBzb3VyY2U9Il9HX25yUXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HX3hjU2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3IwVlJKT3hoRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3IwVlJKdXhoRWR1SGplM3BQYWhONEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcjBWUktPeGhFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9yMFZSSi14aEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfcjBWUkpleGhFZHVIamUzcFBhaE40QSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfcjBWUkl1eGhFZHVIamUzcFBhaE40QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9yMFZSSS14aEVkdUhqZTNwUGFoTjRBIiBwb2ludHM9IlstNjgsIDMsIDM0MCwgLTIwXSRbLTMyOCwgMTgsIDgwLCAtNV0iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjVGNTA5MDIwNiIgdHlwZT0iQ2xhc3MiIG5hbWU9IlRheG9ub215Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjWmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX3hjYWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNiZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfeGNidWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNiLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfeGNjT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNjZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfeGNjdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNjLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX3hjZE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfeGNadWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfeGNaLWZYRWR1cUhvT0piVVJaUnciIHg9IjE1MjE2IiB5PSIzMTciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tk1PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA3NyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR183Tk5PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tk5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tk51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tk4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOT09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOT2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOT3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOTy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOUE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOUGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOUHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TlAtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HXzdOTWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HXzdOTXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4ODc2IiB5PSIxODA5NSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOUU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMERDIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05RLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HXzdOUk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05TT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05TZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05TdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05TLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05UT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05UZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05UdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOVC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfN05RZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfN05RdWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMTA3IiB5PSIxODAyNSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOVU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU1Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05VLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HXzdOVk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05XT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05XZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05XdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05XLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05YT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05YZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05YdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOWC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfN05VZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfN05VdWZYRWR1cUhvT0piVVJaUnciIHg9IjE1ODUwIiB5PSIxODA2OSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05ZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HXzdOWk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05hT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05hZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05hdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05hLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05iT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05iZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05idWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOYi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfN05ZZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfN05ZdWZYRWR1cUhvT0piVVJaUnciIHg9IjMzNjEiIHk9Ijg3NzEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA2MyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR183TmRPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOZU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOZWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOZXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOZS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOZk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOZmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOZnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmYtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HXzdOY2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HXzdOY3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI1OTAxIiB5PSI4Nzc5Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05nT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfN05oT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05oZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05odWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05oLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tml1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tmp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05qLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR183TmdlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR183Tmd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjM3IiB5PSIxMTA2NSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdObWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05uT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HXzdObmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdObnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdObi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05vZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05vdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05vLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05wT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05wZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05wdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05wLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOcU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfN05tdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfN05tLWZYRWR1cUhvT0piVVJaUnciIHg9IjMxMzIiIHk9IjExMDU3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05zdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0IiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfN050dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN050LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN051T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN051ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TnUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TnZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TnYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TndPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN053ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR183TnMtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR183TnRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTMwNCIgeT0iMTM0MDIiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tnd1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAzMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR183Tnh1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TngtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOeS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOemVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOei1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TjBlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HXzdOdy1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HXzdOeE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDMyMCIgeT0iMTEwNjUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWElPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFFWEpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWEplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWEp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWEotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYS09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYS2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYS3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYSy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYTE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYTGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYTHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWEwtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQUVYSWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYSXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTg0NCIgeT0iMTM0MDIiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWE1PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFFWE5PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWE5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWE51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWE4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYT09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYT2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYT3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYTy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYUE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYUGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYUHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWFAtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQUVYTWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYTXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3MzE1IiB5PSIxMTA2NSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYUU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQUVYUk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhTT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhTZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhTdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhTLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhUT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhUZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhUdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYVC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBRVhRZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVhRdWZYRWR1cUhvT0piVVJaUnciIHg9IjE0Mzc2IiB5PSIxNTY4MCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYYS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQUVYYi1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhjLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhkT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhkZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhkdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhkLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhlT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhlZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYZXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBRVhiT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVhiZWZYRWR1cUhvT0piVVJaUnciIHg9IjEzMDEzIiB5PSIxMTA2NSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYamVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQUVYa2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjY0MSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhsZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhsdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhsLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhtT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhtZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhtdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYbk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBRVhqdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVhqLWZYRWR1cUhvT0piVVJaUnciIHg9IjE0Mzc2IiB5PSIxMzQwMiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYci1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RTYwMkMxIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQUVYcy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjQ1NSIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYdE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVh1T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVh1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVh2T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYdnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBRVhzT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVhzZWZYRWR1cUhvT0piVVJaUnciIHg9IjEyNTg5IiB5PSI2NDM0Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh2LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWHd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBRVh3LWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWHgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWHlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSUlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSUllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSUl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSUktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSUpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lKZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEFFWHdPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWHdlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODkyMyIgeT0iNjQzNCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JT09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQU9JUE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjk0NiIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JUGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lRT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lRZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lRdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lRLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lST2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lSZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lSdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JUi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBT0lPZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0lPdWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMzQ0IiB5PSI0MTU3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lZLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBT0laLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSWJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSWJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSWNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0ljdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEFPSVpPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSVplZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYwMzUiIHk9Ijg3NzkiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFPSWdPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQyNjciIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JaE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JaGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JaHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JaC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JaU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JaWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JaXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSWktZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQU9JZmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JZnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4NDgzIiB5PSI4Nzc5Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lqT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA4MTg3OTAyODgiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBT0lrT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzE5IiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSWxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSWwtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSW1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSW1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSW11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0ltLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEFPSWplZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSWp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU0MDAiIHk9IjY0MzQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFPSXplZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM1ODkiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSTBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JMGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JMHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JMC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JMU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JMWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JMXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JMS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSTJPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQU9JeXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JeS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjAyMiIgeT0iMjE3NSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR29PZTd1ZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBwcm92aWRlcyB0aGUgdGF4b25vbXkgb2YgYWxsIHRoZSBtYWluIGNsYXNzZXMgb2YgdGhlIFByb2Nlc3MgcGFja2FnZS4iLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HXzdOa09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTYwIiBzb3VyY2U9Il9HXzdOZ09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HXzdOWU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05rLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05sZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tmx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HXzdObE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HXzdOa2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dfN05rdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzY2MCwgLTUyNCwgLTIyODYsIDE3NjFdJFsyMjUyLCAtMTc2MSwgLTY5NCwgNTI0XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR183TmwtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HXzdObU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR183TnFlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENiIgc291cmNlPSJfR183Tm1lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR183TllPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05yLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR183TnJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR183TnF1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HXzdOcS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTQzLCAtNTMzLCA0NjUsIDE3NTJdJFstNDc0LCAtMTc2MSwgMTM1LCA1MjRdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HXzdOc09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfN05zZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQUVYVU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTEwIiBzb3VyY2U9Il9HXzdOTU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQUVYUU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYVk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQUVYVWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBRVhVdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExNDMsIC01MjQsIC00MDg5LCAxODExXSRbNDAzOCwgLTE4MTEsIC0xMTkzLCA1MjRdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYVi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhXT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQUVYV2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhEIiBzb3VyY2U9Il9HXzdOUU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQUVYUU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYWGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQUVYV3VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBRVhXLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzQ0OCwgLTUyNCwgLTE1ODMsIDE4MTFdJFsxNTY2LCAtMTgxMSwgLTQ2NSwgNTI0XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFFWFlPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYWWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFFWFl1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RSIgc291cmNlPSJfR183TlVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFFWFFPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhhT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWFp1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFFWFktZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQUVYWk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNDU3LCAtNTI0LCAxNTc0LCAxODExXSRbLTE1NzQsIC0xODExLCA0NTcsIDUyNF0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhhZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFFWGF1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBRVhlLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyQTAiIHNvdXJjZT0iX0dfN05zdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBRVhhLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYZ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVhmLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBRVhmT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFFWGZlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbODEyLCAtNTI0LCAtMjg5NSwgMTgxMV0kWzI4NzAsIC0xODIwLCAtODM4LCA1MTZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYZ3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhnLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQUVYaE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjlGIiBzb3VyY2U9Il9IQUVYSU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQUVYYS1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYaU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQUVYaGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBRVhodWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI0NSwgLTUyNCwgLTkyMiwgMTgxMV0kWzg5NywgLTE4MjAsIC0yNzAsIDUxNl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhpLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFFWGpPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBRVhuZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkVENjAyQUUiIHNvdXJjZT0iX0hBRVhRT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBRVhqZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWG9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWG91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYby1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVhvZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBRVhudWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFFWG4tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUzMywgMCwgMTc1Ml0kWzAsIC0xNzY5LCAwLCA1MTZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYcE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhwZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9JSnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBzb3VyY2U9Il9HXzdOWU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQUVYdi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSUxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JS3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9JSi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0lLT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExNTksIC00NTcsIC00OTM2LCAxODc5XSRbNDcwNywgLTE4MTEsIC0xMzg4LCA1MjRdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JTGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lMdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9JTC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNFIiBzb3VyY2U9Il9HXzdOY09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQUVYdi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSU5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JTS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9JTU9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0lNZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzc3OCwgLTUyNCwgLTI3NzcsIDE4MTFdJFsyNzQzLCAtMTgxMSwgLTgxMiwgNTI0XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSU51ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JTi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFPSVNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFOTFGMDA2MSIgc291cmNlPSJfSEFFWHYtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFPSU9PZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lUdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSVRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFPSVNlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9JU3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3MjgsIC01MzMsIC0yNDcyLCAxNzUyXSRbMjQ0NiwgLTE3NjksIC03NTMsIDUxNl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lULWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSVVPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0lVZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUVGOTAwRTIiIHNvdXJjZT0iX0hBRVhyLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBT0lPT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JVi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0lWZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0lVdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFPSVUtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUzMywgMCwgMTc1Ml0kWzAsIC0xNzY5LCAwLCA1MTZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JV09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lXZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9JV3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzAzIiBzb3VyY2U9Il9IQUVYTU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HXzdOWU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JWHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9JVy1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0lYT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05MzksIC01MjQsIDMyMjUsIDE3NjFdJFstMzE5MSwgLTE3NjEsIDk3MywgNTI0XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSVllZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JWXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFPSWMtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzI5MDFGRCIgc291cmNlPSJfSEFFWGEtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFPSVktZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0llZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSWQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFPSWRPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9JZGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils4MjEsIC01MjQsIC0yODg3LCAxNzYxXSRbMjgzNiwgLTE3NjksIC04NzIsIDUxNl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lldWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSWUtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0luT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ2RDAwODgiIHNvdXJjZT0iX0hBT0lqT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBT0lPT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSW4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSW9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0lvT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0luZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFPSW51ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTYzNSwgLTUzMywgMjEwOCwgMTc1Ml0kWy0yMTI1LCAtMTc2OSwgNjE4LCA1MTZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9Jby1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lwT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9JcGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyODIwMzkyIiBzb3VyY2U9Il9IQUVYYS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQU9JZk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JcWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9JcHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0lwLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04MDQsIC01MjQsIDI3NTEsIDE3NjFdJFstMjc0MywgLTE3NjksIDgxMiwgNTE2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSXJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JcmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFPSXJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjNCMDAwMiIgc291cmNlPSJfSEFFWE1PZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFPSWZPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0l0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSXN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFPSXItZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9Jc09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils0MzEsIC01MjQsIC0xNDk4LCAxNzYxXSRbMTQ4MSwgLTE3NjksIC00NDgsIDUxNl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0l0ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSXR1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0l0LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyMzAxOUEiIHNvdXJjZT0iX0hBT0lmT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBRVh2LWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JdmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0l1LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0l1T2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFPSXVlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUyNCwgMCwgMTgxMV0kWzAsIC0xODExLCAwLCA1MjRdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JdnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0l2LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9Jd09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRjMwMjZFIiBzb3VyY2U9Il9IQU9JWS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HX3hjWmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0l3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0l4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JeE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9Jd2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0l3dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIxMiwgLTMxOCwgMTg1MywgODE3NV0kWzIxMiwgLTM4MzcsIDE4NTMsIDQ2NTZdJFstMTUwOCwgLTgxNzYsIDEzMywgMzE3XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSXgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9IigwLjg3MDAzMjU1LDAuNDY1NDA4OCkiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0l5T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQVg1SU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDQzEwMzFFIiBzb3VyY2U9Il9IQU9JT09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQU9JeWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBWDVJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBWDVKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFYNUp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQVg1Sk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQVg1SWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBWDVJdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MjQsIDAsIDE0NTZdJFswLCAtMTQ2NCwgMCwgNTE2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFYNUotZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQVg1S09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFYNUtlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzJCMDFDQSIgc291cmNlPSJfSEFPSXllZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR194Y1plZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQVg1TE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQVg1THVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBWDVMLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFYNUxlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFYNUt1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQVg1Sy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1MjQsIC01MjQsIC0xNDA1LCAxMzU0XSRbMTM4MCwgLTEzNTQsIC01NTAsIDUyNF0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBWDVNT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFYNU1lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBWDVNdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkIxRUMxQjAzNDkiIHNvdXJjZT0iX0dfN053dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBT0lmT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFYNU5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFYNU4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQVg1T09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBWDVOdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBWDVNLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFYNU5PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIwMywgLTUyNCwgNjYwLCAxNzYxXSRbLTY3NywgLTE3NjksIDE4NiwgNTE2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFYNU9lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQVg1T3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2hPZkF1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNCRiI+Ci0gICAgICAgICAgPGJvZHk+MDI8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDg1NDYwMEQ4IiBuYW1lPSJCcmVha2Rvd24iPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR2s5SWdPZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDFGMDVFQ0QwMzkwIj4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGMDVFQ0QwMzkwIiB0eXBlPSJDbGFzcyIgbmFtZT0iQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qNE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFNajQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzFNajVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIwODIiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFNajVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxTWo1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qNk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxTWo2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qNnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxTWo2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qN09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxTWo3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qN3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMU1qNy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMU1qNGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cxTWo0dWZYRWR1cUhvT0piVVJaUnciIHg9IjkyMjAiIHk9IjEwODc5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qOE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFNajgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzFNajlPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ0NzAiIGhlaWdodD0iMTExNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0MHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMVZ0MU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMVZ0MXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMVZ0Mk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFWdDJ1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzFNajhlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzFNajh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzgyMyIgeT0iMTU3OTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQyLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0M3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMVZ0My1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDAxMyIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0NE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQ0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQ0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFWdDVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQ1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFWdDV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQ1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFWdDZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQ2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxVnQ2dWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cxVnQzT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzFWdDNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzI5MSIgeT0iMTMzMTQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEswZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMThLMWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDE4MiIgaGVpZ2h0PSIxMTE3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEsyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLMmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEsydWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLMi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEszT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLM2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEszdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLMy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThLNE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMThLMHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMThLMC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNTQ3IiB5PSIxNTc5OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEs1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cxOEs1ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzI2IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEs1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThLNnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThLN09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThLN3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4SzhPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzE4SzR1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMThLNC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzODA0IiB5PSIxMzMxNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA2MyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlVzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyRlV0T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMjY5IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZVdWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZVdS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZVdmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVXYtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJGVXNlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMkZVc3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzY5OSIgeT0iMTA4NzkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV3T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMkZVeE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjY3NSIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVXllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVXktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV6T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVXplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlV6LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyRlV3ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJGVXd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI2ODAiIHk9IjEzMzE0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVX09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVV8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzJGVkFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQwMTMiIGhlaWdodD0iMTExNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZWQmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZWQi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZWQ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVkMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJGVV9lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJGVV91ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI0MjAiIHk9IjE1Nzk4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGdE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCNjUwMEU2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRnQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzJQRnVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3NDMiIGhlaWdodD0iOTkwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRnVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZ1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEZ2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEZ2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGd09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEZ3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGd3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBGdy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMlBGdGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyUEZ0dWZYRWR1cUhvT0piVVJaUnciIHg9IjE2NzY0IiB5PSIxNDI5MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEY4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyUEY5T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTc0IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEY5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRi1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBGLWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRi11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBGLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRl9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBGX2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRl91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQRl8tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJQRjhlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMlBGOHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2MDU1IiB5PSIxMDk4NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0FPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyUEdCT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdDT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQR0NlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdDdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQR0MtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdET2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQR0RlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdEdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEdELWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyUEdBZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJQR0F1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTc2MiIgeT0iNzIxMyIgd2lkdGg9IjM4NTkiIGhlaWdodD0iMTIxOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjFlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNEU2MDJDMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTIyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyWTIyZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNDM4IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTIydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlkyM3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlkyNE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlkyNHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJZMjVPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJZMjF1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMlkyMS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjI1NiIgeT0iNzUyNiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZM0VlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFOEExMDM0MSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTNGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyWTNGZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyOTQ2IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTNGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZM0YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkzR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQW9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMmlBb2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQW91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMmlBby1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMmlBcGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQXAtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJZM0V1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMlkzRS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDAwNyIgeT0iNTU0NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXV1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyaUF2dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODI3IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQXctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQXhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQXgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyaUF5ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyaUF1LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyaUF2T2ZYRWR1cUhvT0piVVJaUnciIHg9IjYyNTYiIHk9IjExNTkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF5dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMmlBenVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDI2NyIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUEwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQTBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUEwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQTAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUExT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQTFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUExdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQTEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUEyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyaUEyZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyaUF5LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJpQXpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTk4MSIgeT0iODI4OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQTJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgxODc5MDI4OCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUEzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyaUEzdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMTUwIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnhvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeG9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4b3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeG8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ4cE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ4cHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ4cU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeHF1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJpQTItZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMmlBM09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTUzMyIgeT0iNTcwNiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnh5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cycnh5dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4eS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnh6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnh6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeHotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycngwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeDBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycngwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeDAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycngxT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycngxZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cycnh4LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cycnh5T2ZYRWR1cUhvT0piVVJaUnciIHg9IjExMDAiIHk9IjI4MzYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycngtdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4X2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMnJ4X3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzU4OSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeF8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5QU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5QXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycnlBLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5Qk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycnlCZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5QnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycnlCLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5Q09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ5Q2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMnJ4LS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMnJ4X09mWEVkdXFIb09KYlVSWlJ3IiB4PSI5Nzg3IiB5PSIzMDM5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5SE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDMxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzJyeUlPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE4NjIiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5SXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5Sk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycnlKZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5SnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycnlKLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5S09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycnlLZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5S3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ5Sy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMnJ5SGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cycnlIdWZYRWR1cUhvT0piVVJaUnciIHg9IjIyMTgiIHk9IjEwMjE5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2s5SWd1ZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBCcmVha2Rvd24gcGFja2FnZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBicmVha2Rvd24gZWxlbWVudHMgdGhhdCBmb3JtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGhlIGRpYWdyYW0gc2hvd3MgdGhlIHRheG9ub215IG9mIHRoZSBtYWluIGNsYXNzZXMuICBJdCBwcmVzZW50IHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdHkgYW5kIERlc2NyaXB0b3IgYXMgd2VsbCBhcyB0aGVpciBrZXkgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cxVnQ2LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDYiIHNvdXJjZT0iX0cxVnQyLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cxTWo0T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0N3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQ4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0OGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzFWdDctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cxVnQ3T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzFWdDdlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTUyLCAtNDU3LCAwLCAyMDgyXSRbMTUyLCAtMjA5MSwgMCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMVZ0OHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzFWdDgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMXlad09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q3IiBzb3VyY2U9Il9HMU1qOE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMVZ0Mi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzF5WnctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMXlaeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzF5Wnh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cxeVp4T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMXlaeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMXlaeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMXlaeU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTAiIHk9IjQ1NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxeVp5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzF5WnpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxeVp5LWZYRWR1cUhvT0piVVJaUnciIHg9Ii03MCIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxeVp6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzF5WnotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMXlaenVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDYiIHk9IjIxMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxeVowT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMXlaMGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NCIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEt3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEt3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEt4T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxOEt3dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEt4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEt5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxOEt4dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4S3ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4S3pPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4S3l1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEt6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEt6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4SzBPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4S3p1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cxeVp3ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzF5Wnd1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTU1OCwgLTUwLCAxOTMwXSRbMCwgLTIwNDAsIC01MCwgNDQ4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzE4SzhlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRCIgc291cmNlPSJfRzE4SzBlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzE4SzRlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEs5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4Szl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEs5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMThLOWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4Sy1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4Sy11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4Sy1lZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ4IiB5PSI0NTAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLLS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEtfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMThLX09mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzIiIHk9Ii0zNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOExBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4S18tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc2IiB5PSIyMDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMQWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4TEEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4TEF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTkiIHk9Ii0zNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThMQi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMThMQmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4TENPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThMQy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMThMQ2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4TERPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOExEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOExELWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxOExEZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOExFLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxOExFZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMThLOHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cxOEs4LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzM3MiwgLTU1OCwgLTY0MywgMTkzMF0kWzM3MiwgLTIwNDgsIC02NDMsIDQ0MF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyRlUwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNjAiIHNvdXJjZT0iX0cyRlV3T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cxTWo0T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlUxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVMXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJGVTFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cyRlUwZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMkZVMHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTg0LCAtNDU3LCAyNzE3LCAyMDgyXSRbLTI3MTcsIC0yMDkxLCA1ODQsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJGVTEtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyRlUyT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJGVTJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRiIgc291cmNlPSJfRzJGVXdPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJGVXNPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlUzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlUzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMkZVM2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVTRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODQiIHk9Ii0xMzUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlU1T2ZYRWR1cUhvT0piVVJaUnciIHg9IjE4MyIgeT0iMTEwNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZVNS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzY4IiB5PSItMTM1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlU2dWZYRWR1cUhvT0piVVJaUnciIHg9IjcyIiB5PSItMzQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVTctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVTdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVTgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVThlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZVOS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZVOWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVS1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVS11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZVLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZVLWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJGVTJ1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMkZVMi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3MzYsIC00NDgsIC01MzMsIDIwOTFdJFs3MzYsIC0yMDkxLCAtNTMzLCA0NDhdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMkZWRE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZBIiBzb3VyY2U9Il9HMkZVX09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMkZVd09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWRWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyRlZFT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZWRk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjQiIHk9IjQwNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZGdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlZGLWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NCIgeT0iLTM0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZWR3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTciIHk9IjE5NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZWSGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1OSIgeT0iLTM0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlZJdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlZJT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlZKdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlZKT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVktlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVkt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVktPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQRnMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJQRnNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cyRlZEZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJGVkR1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI0NSwgLTU2NywgNjE4LCAxOTIxXSRbLTI0NSwgLTIwNDgsIDYxOCwgNDQwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJQRnhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJDMDMwRCIgc291cmNlPSJfRzJQRnRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJGVV9PZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZ4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRnllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZ5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMlBGeU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRnktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRnplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJQRnpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE3OSIgeT0iLTIzMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZ6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyUEZ6LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwREYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEYwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJQRjB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwOSIgeT0iNjciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlBGMWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTU4NyIgeT0iLTM1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEYxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEYyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEYydWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyUEYyT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwREYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEYzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEYzdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyUEYzT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQRjR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJQRjRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEY0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwREYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEY1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQRjV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJQRjVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cyUEZ4ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJQRnh1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTQzLCA0OTEsIDM4NTIsIC0xMDgzXSRbMTQzLCAxMjk1LCAzODUyLCAtMjc5XSRbLTE3MDEsIDEyOTUsIDIwMDYsIC0yNzldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMlBGNS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGOTRBQjkwMDE1IiBzb3VyY2U9Il9HMlBGdE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMkZVd09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyUEY2LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMlBGNk9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJQRjZlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEzODAsIC0yODcsIDMxOTEsIDYyNl0kWy0zMjM0LCAtNjYwLCAxMzM3LCAyNTRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyUEY3dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMlBGNy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyUEdFT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRUYiIHNvdXJjZT0iX0cyUEdBT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyUEY4T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMlBHRk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMzgiIHk9Ii03NzAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlBHR09mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTM4IiB5PSItMjQ1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlBHRy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5NDMiIHk9IjIzNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlBHSHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1MzkiIHk9Ii00NTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkyc2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NSIgeT0iLTEyNTMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkycy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkydGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlkydHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkydE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMnQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkydWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlkydXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkydU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMnUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyWTJ2dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyWTJ2T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkydi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyd2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyWTJ3dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyWTJ3T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMlBHRWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cyUEdFdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNzE4LCAzODEsIDE5MzgsIC0zMTI0XSRbLTQxMDYsIDM4MSwgLTQ0OCwgLTMxMjRdJFstNDEwNiwgMzA1NiwgLTQ0OCwgLTQ0OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyWTJ3LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0cxTWo0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyUEdBT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyeWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJZMngtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cyWTJ4T2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMlkyeGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNTIsIC00NTcsIC0xMDY2LCAzMDQ4XSRbOTk5LCAtMjg5NSwgLTIyMCwgNjA5XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMlkyeXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJZMnktZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMlkyek9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNFIiBzb3VyY2U9Il9HMkZVc09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMlBHQU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMnotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyWTIwT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMlkyemVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJZMnp1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTQ0MCwgLTQ1NywgMjkxMiwgMzA0OF0kWy0yNzY4LCAtMjg5NSwgNTg0LCA2MDldIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyWTIwLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMlkyMU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyWTI1ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRGODAyMEEiIHNvdXJjZT0iX0cyUEdBT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyWTIxZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTI2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyNi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJZMjZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTI3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RjkwMDczIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkyN2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyNy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRGOTAwNzMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTI4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkyOE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTUxIiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RjkwMDY5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyWTI4LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yODciIHk9Ii0yNDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RjkwMDY5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkyOXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItOTMwIiB5PSIzMTMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RjkwMDczIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlkyLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkyLWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMl9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RjkwMDY5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlkyXy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkyX2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZM0FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRGOTAwNzMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTNBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyWTNBLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyWTNBZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkzQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RjkwMDY5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkzQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyWTNCLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyWTNCZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMlkyNXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cyWTI1LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE3MTgsIDE1MiwgLTQyNzUsIDBdJFs0Nzc1LCAxNTIsIC0xMjE5LCAwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJZM0NPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgc291cmNlPSJfRzE4SzRlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzFNajRPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTNDLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZM0RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTNEdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMlkzRE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJZM0NlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cyWTNDdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzYxOCwgLTQ1NywgLTI5ODgsIDIwODJdJFsyOTQ2LCAtMjA5MSwgLTY2MCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMlkzRC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJZM0VPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMmlBcU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0U5MUYwMDYxIiBzb3VyY2U9Il9HMlBHQU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMlkzRWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyaUFyT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMmlBcWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJpQXF1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTYxOCwgMCwgMTIxMF0kWzAsIC0xMzgwLCAwLCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyaUFyLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMmlBc09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyaUFzZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUVGOTAwRTIiIHNvdXJjZT0iX0cyWTIxZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyWTNFZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBdE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBdC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJpQXRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cyaUFzdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMmlBcy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTIyNywgLTQyMywgNDc2NiwgMTU1N10kWy00NjIyLCAtMTUzMiwgMTM3MSwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMmlBdU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJpQXVlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMnJ4cS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VENkQwMDg4IiBzb3VyY2U9Il9HMmlBMnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMlkzRWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4c09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cycnhyLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMnJ4ck9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJyeHJlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEwODMsIC0xNTIsIDQ3NTgsIDYwOV0kWy00MzY4LCAtNTc1LCAxNDczLCAxODZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycnhzdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ4cy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cycnh0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTIzQjAwMDIiIHNvdXJjZT0iX0cxOEs0ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyaUF5dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4dC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnh1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4dXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJyeHVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cycnh0ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMnJ4dHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjM3LCAtNDU3LCAyMzAyLCA0NjczXSRbLTIzMjgsIC00NjgyLCAyMTEsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeHUtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycnh2T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJyeHZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzIzMDE5QSIgc291cmNlPSJfRzJpQXl1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJQR0FPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnh3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnh3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMnJ4d2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJyeHZ1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMnJ4di1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5MTQsIC00NDgsIC02NDUxLCA0NjVdJFs5MTQsIC0xMjc4LCAtNjQ1MSwgLTM2NF0kWzU2NDcsIC0xMjc4LCAtMTcxOCwgLTM2NF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeHhPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycnh4ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJyeDF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkYzMDI2RSIgc291cmNlPSJfRzJyeHh1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJpQXV1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycngyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeDItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycngzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMnJ4MnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJyeDEtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMnJ4Mk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNDIyLCAtNTI0LCAtMzMwMiwgMTE1MV0kWzMzMDIsIC0xMTg1LCAtMTQyMiwgNDkxXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ4M2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeDN1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMnJ4My1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyODIwMzkyIiBzb3VyY2U9Il9HMlBGOE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMmlBeXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeDR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4NU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeDVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cycng0LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMnJ4NE9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJyeDRlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTY0MywgLTQ1NywgMzA2NCwgMjEzM10kWy0zMDczLCAtMjE0MiwgNjM1LCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycng1dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ4NS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cycng2T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyOTAxRkQiIHNvdXJjZT0iX0cyUEY4T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cycnh4dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4Ni1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycng3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4N3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJyeDdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cycng2ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJyeDZ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTk1MiwgLTEzMiwgNDM5MiwgNzkxMV0kWy02NTM1LCAtMTMyLCAtMTE5MSwgNzkxMV0kWy02NTM1LCAtNzcyNSwgLTExOTEsIDMxOF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeDctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycng4T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJyeDhlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MzE4MDBCOCIgc291cmNlPSJfRzE4SzBlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJyeHh1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycng5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeDl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycng5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMnJ4OWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJyeDh1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMnJ4OC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjExNywgLTIxMiwgOTI2LCAxMjkzOF0kWy01MjEzLCAtMjEyLCAtMjE3MCwgMTI5MzhdJFstNTIxMywgLTEzMjU2LCAtMjE3MCwgLTEwNl0kWy00NTc4LCAtMTMyNTYsIC0xNTM1LCAtMTA2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ4LU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeC1lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMnJ5Q3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDQzEwMzFFIiBzb3VyY2U9Il9HMlkzRWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMnJ4LXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeURlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5RC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cycnlEdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMnJ5Qy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cycnlET2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NDgsIC0xMDEsIDE5ODldJFswLCAtMTkzMCwgLTEwMSwgNTA4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ5RWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeUV1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMnJ5RS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDMkIwMUNBIiBzb3VyY2U9Il9HMnJ4LXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMmlBdXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5R09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cycnlGLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMnJ5Rk9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cycnlGZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMDc1LCAtNTI0LCAyODM2LCAxMzU0XSRbLTI4MzYsIC0xMzYzLCAxMDc1LCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycnlHdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ5Ry1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cycnlMT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkIxRUMxQjAzNDkiIHNvdXJjZT0iX0cycnlIT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyaUF5dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWlvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpby1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzIxaW9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cycnlMZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMnJ5THVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMjAsIC00NTcsIC03NDUsIDE0NzNdJFs3MjgsIC0xNDgxLCAtMjM3LCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyMWlwT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMjFpcGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjVDNTEzMDIwMyIgdHlwZT0iQ2xhc3MiIG5hbWU9IldvcmtCcmVha2Rvd25TdHJ1Y3R1cmUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWlxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMjFpcC1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0ie0l0ZXJhdGlvbi5wcmVmaXggPSAmcXVvdDtJdGVyYXRpb24mcXVvdDt9JiN4QTsiIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMjFpcU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDkyMSIgeT0iMTM4NTkiIHdpZHRoPSIzMTc1IiBoZWlnaHQ9IjEyNDQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWlxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfRzIxaXJPZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IntQaGFzZS5wcmVmaXggPSAmcXVvdDtQaGFzZSZxdW90O30mI3hBOyIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyMWlyZWZYRWR1cUhvT0piVVJaUnciIHg9IjE3NzU0IiB5PSIxMzg1OSIgd2lkdGg9IjI4MDIiIGhlaWdodD0iMTI0NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWlzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyMWl0T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWl0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWl1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzIxaXVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWl1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzIxaXUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWl2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzIxaXZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWl2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyMWl2LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyMWlzZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzIxaXN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjE1ODEiIHk9IjEyMDU2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpd09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzIxaXhPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWl4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc2tPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1za2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc2t1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zay1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc2xPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zbGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc2x1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zbC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc21PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc21lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzIxaXdlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMjFpd3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTE1MSIgeT0iMTIxMDciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNtdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMi1zbnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc24tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXNvLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXNwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zcHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXNwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zcU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zcWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMi1zbS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyLXNuT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEzNzc1IiB5PSI4MTQ0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zcXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzItc3J1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3N1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3RPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zdGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3R1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zdC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc3VlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzItc3EtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMi1zck9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDE5MCIgeT0iMTM5MzQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN1dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMi1zdnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zd3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXN3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zeE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXN4ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zeHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXN4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zeU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zeWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMi1zdS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyLXN2T2ZYRWR1cUhvT0piVVJaUnciIHg9IjEzMzUxIiB5PSIxMTcwMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczdlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAzMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyLXM4ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItczl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItcy1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMtZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItcy11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXNfT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyLXM3dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzItczctZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE2NTgiIHk9IjcwMjciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNfZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA4MDA1NzAyNzYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM0lka09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HM0lka2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNJZGt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM0lkay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czSWRsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNJZGxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czSWRsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkVudW1lcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czSWRsLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM0lkbU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czSWRtZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM0lkbXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czSWRtLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyLXNfdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzItc18tZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTQ1OSIgeT0iMTIzNDciIHdpZHRoPSIzMjM0IiBoZWlnaHQ9IjI3MTYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5oLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HM1JuaS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbmpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5qdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Juai1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm5rT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Jua2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm5rdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Juay1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm5sT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JubGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1JubHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HM1JuaU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czUm5pZWZYRWR1cUhvT0piVVJaUnciIHg9IjE5MTI2IiB5PSI4MTM2IiB3aWR0aD0iMjc5NCIgaGVpZ2h0PSIyMTE2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JucWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzNSbnJlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Juc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm5zdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Jucy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm50T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JudGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm50dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JudC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1JudU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HM1JucXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgc2hvd0xpc3RTaWduYXR1cmU9InRydWUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM1JucS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjgxNCIgeT0iMTg4OCIgd2lkdGg9Ijc1MjYiIGhlaWdodD0iMjgyNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgxODc5MDI4OCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0czYll3ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZeHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZeU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZeXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWXpPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzNiWXZ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM2JZdi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI0MzYwIiB5PSIxMDM2MyIgd2lkdGg9IjcyMzAiIGhlaWdodD0iMTUyNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXplZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlkwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0czYlkwZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlkwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlkxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZMXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZMk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZMnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWTNPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzNiWXp1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIHNob3dMaXN0U2lnbmF0dXJlPSJ0cnVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNiWXotZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTY2NCIgeT0iMzc1MCIgd2lkdGg9IjU5NDMiIGhlaWdodD0iMjM1MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsR1NZZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgdGhlIHZpZXcgb24gQnJlYWtkb3duIEVsZW1lbnRzIGZyb20gYSB3b3JrIGJyZWFrZG93biBwZXJzcGVjdGl2ZSBjYWxsZWQgV0JTIChXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUpIHRoYXQgaW5jbHVkZXMgVGFza3MgYW5kIEFjdGl2aXRpZXMgKGJ1dCBhbHNvIHRoZSBub3Rpb24gb2YgTWlsZXN0b25lcyB0aGF0IGRvIG5vdCByZXByZXNlbnQgd29yaykuICBVTUEgYWxzbyBkZWZpbmVzIHR3byBtb3JlIHZpZXdzIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgYXMgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUgYW5kIFRlYW0gUHJvZmlsZSBCcmVha2Rvd24gU3RydWN0dXJlLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMi1zeXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBEIiBzb3VyY2U9Il9HMi1zcXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMi1zdXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyLXN6dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMi1zMHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNDQiIHk9IjQwNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMxT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyLXMxZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDMiIHk9Ii0zNDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzItczJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNSIgeT0iMjExIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyLXMyLWZYRWR1cUhvT0piVVJaUnciIHg9Ijk4IiB5PSItMzQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItczRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzItczN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItczVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzItczR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zNk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMi1zNXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zN09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMi1zNnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzItc3ktZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMi1zek9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzMsIC01NTgsIDE2LCAyNTkwXSRbLTMzLCAtMjY1OCwgMTYsIDQ5MV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czSWRuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9HMjFpcS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMjFpd09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNJZG5lZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czSWRudWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC02MjYsIDAsIDEyNTNdJFswLCAtMTM4OCwgMCwgNDkxXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM1JuZ09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNSbmdlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM1JuZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlQXR0YWNobWVudCIgc291cmNlPSJfRzIxaXB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzIxaXNPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czUm5nLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM1JuaE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjUsIC02MjYsIDI1LCAxMzAzXSRbLTQyLCAtMTQzOSwgOCwgNDkxXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM1JuaGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNSbmh1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM1JubC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMkEwIiBzb3VyY2U9Il9HMjFpc09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM1JuaC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbm11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Jubk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbm5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czUm5tLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM1JubU9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNSbm1lZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI4NywgLTQ5OSwgMTY0MiwgMjg1M10kWy0xMzI5LCAtMjI5NCwgNjAxLCAxMDU4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM1JubnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNSbm4tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM1Jub09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjlGIiBzb3VyY2U9Il9HMjFpd09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM1JuaC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbm8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JucGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czUm5wT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM1Jub2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNSbm91ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTg2LCAtNDk5LCAtMTE4NSwgMjkwNF0kWzkzOSwgLTIzNDUsIC00MzEsIDEwNThdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czUm5wLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM1JucU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czUm51ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjUiIHNvdXJjZT0iX0czUm5xZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czUm5xZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Judk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm52dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Judi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM1JudmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5NDgiIHk9Ii0yNzg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbndPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNSbndlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjI0IiB5PSItNTc5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JueGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNSbnhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ0OSIgeT0iLTUwNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm54dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM1JueC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTU2IiB5PSItMjQxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNSbnl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE0NSIgeT0iMzM0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNSbnotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNSbnplZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm4wT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbjB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNSbjAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNSbjBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm4xT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1JuMS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM1JuMWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbjJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbjJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1JuMi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM1JuMmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNSbnV1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM1JudS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszNzU3LCAtNjYyLCAzNzU3LCAtNjYyXSRbNjEzOCwgLTY2MiwgNjEzOCwgLTY2Ml0kWzYxMzgsIC0yMzI5LCA2MTM4LCAtMjMyOV0kWzUwMiwgLTIzMjksIDUwMiwgLTIzMjldJFs1MDIsIC0xNDI5LCA1MDIsIC0xNDI5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNSbjNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfRzItc211ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNSbnFlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm4zLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbjRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm40dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM1JuNE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNSbjNlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czUm4zdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzUxNiwgLTQ5OSwgLTUyNzQsIDQ4MzRdJFs0MjMzLCAtMzkyMCwgLTE1NTcsIDE0MTNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czUm40LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM1JuNU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czUm41ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRUYiIHNvdXJjZT0iX0czUm5xZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czUm5oLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm42dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM1JuNmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzYzIiB5PSI5MjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM1JuN2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTY4NCIgeT0iMzM1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZZ3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjI5IiB5PSItMjcwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYlloZWZYRWR1cUhvT0piVVJaUnciIHg9IjE0MTAiIHk9Ii0yNTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZaU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjMiIHk9IjI2MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYllqZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllpLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYllrZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllqLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWWxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWWstZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlltT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWW1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWWwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czUm41dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNSbjUtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzc1NywgODIwLCAzODEwLCAtNTA1NF0kWzY4MjYsIDgyMCwgNjg3OSwgLTUwNTRdJFs2ODI2LCA1Nzk0LCA2ODc5LCAtODBdJFsxMzQ5LCA1Nzk0LCAxNDAyLCAtODBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM2JZbXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEMwMjgxIiBzb3VyY2U9Il9HM1JucWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM1JucWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWW5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWW9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czYlludWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZb3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTQ5IiB5PSI1NDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZcGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllxT2ZYRWR1cUhvT0piVVJaUnciIHg9IjExNTMiIHk9IjUzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllxLWZYRWR1cUhvT0piVVJaUnciIHg9IjQyOCIgeT0iLTMyNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYllzT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllydWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYll0T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllzdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDI2NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWXVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWXR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWXZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWXV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czYlltLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNiWW5PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTM3NTcsIC03NjcsIC0zNzU3LCAtNzY3XSRbLTUxMDcsIC03NjcsIC01MTA3LCAtNzY3XSRbLTUxMDcsIC0yMzI5LCAtNTEwNywgLTIzMjldJFstODQ3LCAtMjMyOSwgLTg0NywgLTIzMjldJFstODQ3LCAtMTQyOSwgLTg0NywgLTE0MjldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM2JZM2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEEwIiBzb3VyY2U9Il9HM2JZdmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM2JZemVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czYlk0ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZNU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEEyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZNWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjY2IiB5PSIxNDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYlk2T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNTgiIHk9Ii0xNjI2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEExIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYlk2LWZYRWR1cUhvT0piVVJaUnciIHg9IjE3MCIgeT0iMjQ1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWTd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUzIiB5PSItNTA4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWThPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWTgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWThlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWTktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWTllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlktT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEEyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZLWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWV9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWV91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZXy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZX2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNiWTN1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM2JZMy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTE4NSwgLTc2MiwgLTE4NDUsIDU0MzVdJFstMTE4NSwgLTUwMjAsIC0xODQ1LCAxMTc2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNsSmdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRCIgc291cmNlPSJfRzNiWXZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNiWXplZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czbEpoT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc1MCIgeT0iMTAyNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEppZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czbEppT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNjgiIHk9Ii0xNzciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czbEppLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMzQiIHk9IjE3NzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0UiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNsSmp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTk0IiB5PSItMTU3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNsSmtlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY5IiB5PSI2MzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2xKbHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2xKbE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2xKbXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2xKbU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSm0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czbEpudWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czbEpuT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czbEpvdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czbEpvT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM2xKZ2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czbEpndWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzM5NywgLTc2MiwgLTI2MiwgNTQzNV0kWzM5NywgLTUwMjksIC0yNjIsIDExNjhdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM2xKby1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzAzIiBzb3VyY2U9Il9HMi1zdXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMi1zbXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czbEpwLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM2xKcE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czbEpwZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI1LCAtNDk5LCAtMjUsIDMwNTZdJFsyNSwgLTMwNzMsIC0yNSwgNDgyXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM2xKcXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNsSnEtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM2xKck9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyM0IwMDAyIiBzb3VyY2U9Il9HMi1zdXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM2JZemVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czbEpzT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM2xKcmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNsSnJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTQxNCwgLTQ5OSwgNTY4MSwgNjc2NF0kWy01MTA1LCAtNjA4NywgOTkwLCAxMTc2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM2xKcy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNsSnRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM2xKdGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyODIwMzkyIiBzb3VyY2U9Il9HM1JuaC1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM2JZemVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czbEp1ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM2xKdHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNsSnQtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE0MDUsIC01MTYsIDEwNDgxLCAzNzUwXSRbLTg5MTUsIC0zMjAwLCAyOTcxLCAxMDY2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM2xKdk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNsSnZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM2xKdnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjMwMTlBIiBzb3VyY2U9Il9HM2JZemVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM1JucWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSndlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czbEp3dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM2xKdi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNsSndPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjk3MSwgLTQwNiwgLTg5NjYsIDEyMTldJFs4MTcwLCAtMTExNywgLTM3NjcsIDUwOF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNsSnhlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czbEp4dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNsSngtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQjFFQzFCMDM0OSIgc291cmNlPSJfRzItczdlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNiWXplZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEp5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEp6ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM2xKeS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNsSnlPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czbEp5ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03NTMsIC00OTksIDMyMDgsIDIwOTFdJFstMjE1OSwgLTE0MTMsIDE4MDMsIDExNzZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czbEp6dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM2xKei1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjVGMUU4MDI4MyIgdHlwZT0iQ2xhc3MiIG5hbWU9IlRlYW1CcmVha2Rvd25TdHJ1Y3R1cmUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HM3VUY2VmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0ie1JvbGVEZXNjcmlwdG9yLm1vZGlmaWVzID0gUm9sZS5wZXJmb3Jtc0FzT3duZXIub3V0cHV0IHVuaW9uIFJvbGUucGVyZm9ybXNBZGRpdGlvbmFsbHkub3V0cHV0IHVuaW9uIFJvbGUuYXNzaXN0c0luLm91dHB1dH0iIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM3VUY3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDcyNiIgeT0iMTczNzAiIHdpZHRoPSI2MTQ3IiBoZWlnaHQ9IjE4NTIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRkZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HM3VUZWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUZmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVRmdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUZi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVRnT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUZ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVRndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUZy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUaE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HM3VUZHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czdVRkLWZYRWR1cUhvT0piVVJaUnciIHg9IjE0OTc3IiB5PSI4ODkwIiB3aWR0aD0iMjg2MSIgaGVpZ2h0PSIxNzM1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUaGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzN1VGllZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9Ijc1ODYiIGhlaWdodD0iMjY0MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVRqdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUai1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVRrT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUa2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVRrdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUay1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUbE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HM3VUaHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czdVRoLWZYRWR1cUhvT0piVVJaUnciIHg9Ijc5OTIiIHk9IjQwNjQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVpZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMzRFamVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFa2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RWt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVrLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RWxPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVsZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RWx1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVsLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVtT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0czNEVpdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzM0RWktZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU3MDUiIHk9IjEyOTU0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFb3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDYzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzM0RXB1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFcS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFcmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFci1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RXNlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzM0RW8tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMzRFcE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI2Njk3IiB5PSI4NTU5IiB3aWR0aD0iMjczMiIgaGVpZ2h0PSIyMTg0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxZWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzRCMWZlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxaE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxaHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMWlPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRCMWV1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNEIxZS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI1NzI2IiB5PSIxMzIxNiIgd2lkdGg9IjMxNDYiIGhlaWdodD0iMjQyOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMkFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QjY1MDBFNiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjJBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0QjJCT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIyQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjJCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMkItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjJDT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMkNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjJDdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMkMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19ZT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX1llZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19ZdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19ZLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0QjJBZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRCMkF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTEwMCIgeT0iMTU2MjkiIHdpZHRoPSIzNzkzIiBoZWlnaHQ9IjEwNTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19aT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNEtfYU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19hLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19iZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19iLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfY09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19jZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfY3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfYy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNEtfWmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0S19adWZYRWR1cUhvT0piVVJaUnciIHg9IjQxMzEiIHk9IjE3MzMxIiB3aWR0aD0iNDIzMyIgaGVpZ2h0PSIxMzAzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xHU1ktZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyB0aGUgdmlldyBvbiBhIHByb2Nlc3MgZnJvbSBhIFRlYW0gYW5kIFJvbGUgcGVyc3BlY3RpdmUgY2FsbGVkIFRCUyAoVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlKS4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzN1VGxlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNSIgc291cmNlPSJfRzN1VGhlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzN1VGhlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VG11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM3VUbWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VG5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VG51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzN1VG5lZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM3OCIgeT0iMzgwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VG4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzN1VG9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ5NSIgeT0iMzk5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VG91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czdVRvLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDUzIiB5PSIxOTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUcGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM3VUcHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjc1IiB5PSItMjc0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzN1VHEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzN1VHFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzN1VHItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzN1VHJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM3VUc2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUdC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM3VUdGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzN1VGx1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM3VUbC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjcyNSwgLTI2LCAtMjcyNSwgLTI2XSRbLTU2ODgsIC0yNiwgLTU2ODgsIC0yNl0kWy01Njg4LCAtMjkzNywgLTU2ODgsIC0yOTM3XSRbLTE1ODcsIC0yOTM3LCAtMTU4NywgLTI5MzddJFstMTU4NywgLTEwNTgsIC0xNTg3LCAtMTA1OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czdVR1T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0czdVRkZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czdVRoZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVR2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzN1VHZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czdVR1ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM3VUdXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTMxLCAtODcyLCAzNjkxLCAzNDk2XSRbLTMyMzQsIC0zMDQ4LCAxMzg4LCAxMzIwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM3VUdi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzN1VHdPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM3VUd2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEMwMjgxIiBzb3VyY2U9Il9HM3VUaGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM3VUaGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czdVR4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM3VUeWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDQ1IiB5PSItNDI3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RWNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE5MCIgeT0iMjg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEVkT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDU5IiB5PSItMjA3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RWQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc1IiB5PSIyMjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFZk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFZXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFZ09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFZnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVoT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEVndWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVpT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEVodWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM3VUd3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czdVR3LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI2OTksIC0yNiwgMjY5OSwgLTI2XSRbNTg3NCwgLTI2LCA1ODc0LCAtMjZdJFs1ODc0LCAtMjk2MywgNTg3NCwgLTI5NjNdJFsxNDAyLCAtMjk2MywgMTQwMiwgLTI5NjNdJFsxNDAyLCAtMTA1OCwgMTQwMiwgLTEwNThdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMzRFbWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q2IiBzb3VyY2U9Il9HMzRFaWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM3VUZGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RW5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RW4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czNEVuZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMzRFbXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czNEVtLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zMTMsIC04NzIsIDExMDksIDMxOTFdJFstMTEzNCwgLTMyMDAsIDI4NywgODYzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMzRFb09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzM0RW9lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMzRFc3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUyIiBzb3VyY2U9Il9HMzRFb3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMzRFb3VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czNEV0dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFdXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MzYiIHk9IjIzOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RXZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTcxNCIgeT0iLTMzMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFd09mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzYwIiB5PSIyNDIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFdy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MiIgeT0iLTI4OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEV5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEV4dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEV6T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEV5dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RTBPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RXp1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEUwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEUwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RTFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RTB1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czNEVzLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzM0RXRPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTExNzYsIDQyLCAtMTE3NiwgNDJdJFstMjU3MywgNDIsIC0yNTczLCA0Ml0kWy0yNTczLCAtMTc2MSwgLTI1NzMsIC0xNzYxXSRbLTUwLCAtMTc2MSwgLTUwLCAtMTc2MV0kWy01MCwgLTEwOTIsIC01MCwgLTEwOTJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNEIxY09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNFIiBzb3VyY2U9Il9HMzRFb3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM3VUaGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0QjFkT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNEIxY2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRCMWN1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOTk5LCAtMTEwMCwgLTI5MTIsIDMxNjZdJFsyNjgzLCAtMjk0NiwgLTEyMjcsIDEzMjBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0QjFkLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNEIxZU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0QjFpZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0UiIHNvdXJjZT0iX0c0QjFlZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czNEVpZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNEIxamVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5NyIgeT0iLTMyMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjFrZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NzIiIHk9Ii0xOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjFsT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQ3NyIgeT0iMjkzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjFsLWZYRWR1cUhvT0piVVJaUnciIHg9IjgyNCIgeT0iLTE4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjFtdWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NDYiIHk9IjMzOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjFuLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjFuZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjFvLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjFvZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMXAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMXBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMXEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMXFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0QjFpdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRCMWktZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTM5NywgLTk1NiwgLTg5NjYsIC0zNDddJFs4MjM4LCAtOTU2LCAtMjEyNSwgLTM0N10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0QjFyT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUMiIHNvdXJjZT0iX0c0QjFlZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czNEVpZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNEIxc09mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTM3IiB5PSItMTk1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMXRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg2OCIgeT0iLTM3NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjF0LWZYRWR1cUhvT0piVVJaUnciIHg9IjQ1MCIgeT0iLTM4MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxdXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjM4IiB5PSIxNTkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxdmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzM3IiB5PSItOTczIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMXd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMXdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMXh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMXhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxeXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxeU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxenVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxek9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRCMXJlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNEIxcnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5MywgMTIxMCwgLTEwMjcwLCAxODIwXSRbOTMsIDIwNTcsIC0xMDI3MCwgMjY2N10kWzkyNzksIDIwNTcsIC0xMDgzLCAyNjY3XSRbOTI3OSwgMjU0LCAtMTA4MywgODYzXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRCMXotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0czdVRjT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0QjFyT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNEIxME9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRCMTBlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg3MiwgLTExNTksIDEwMjQsIDEzNTRdJFstMTg5NiwgLTI1MTQsIDAsIDBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0QjEwdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNEIxMC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0QjExT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNjAiIHNvdXJjZT0iX0c0QjFlZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czdVRkZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjEyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxMnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRCMTJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0QjExZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNEIxMXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMDMyLCAtMTIxOSwgLTc5MDcsIDM0NTRdJFs0MDIxLCAtNDY1NiwgLTQ5MTksIDE2XSRbNzUwMSwgLTQ2NzMsIC0xNDM5LCAwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNEIxMi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRCMTNPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNEIxM2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNGIiBzb3VyY2U9Il9HNEIxZWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMzRFb3VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0QjE0ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxNU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxNWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjYiIHk9IjI3MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMTZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjgzIiB5PSItMTEwOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxNi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjkwIiB5PSIyNzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxN2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMTd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE2IiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMThPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMTgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMThlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMTktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMTllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjEtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxLWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMV9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMV91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxXy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxX2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRCMTN1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNEIxMy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5MywgLTEyMTAsIC0zMTMsIDM1NjRdJFs5MywgLTM2ODMsIC0zMTMsIDEwOTJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNEtfZE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZBIiBzb3VyY2U9Il9HNEtfWk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNEIxZWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2V1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0S19lT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfZk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMTAiIHk9Ii0zNzQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfZnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19nT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfZi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItODAiIHk9Ii0zNDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19nLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX2d1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE1MyIgeT0iLTM2MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19oT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfaGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4NCIgeT0iLTMzOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19oLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19pZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19pdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19pT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19qZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19qdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19qT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX2t1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX2tPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19rLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19sZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX2x1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX2xPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0S19kZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRLX2R1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjIwLCAtNjYwLCAtOTk5LCAyODk1XSRbNzg3LCAtMjM0NSwgLTQzMSwgMTIxMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0S19sLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCQzAzMEQiIHNvdXJjZT0iX0c0QjJBT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0S19aT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfbXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19uT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfbmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRLX20tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19udWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19vT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19uLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjQiIHk9Ii0yNzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfb2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19vLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfb3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjUiIHk9IjM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19wT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3B1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfcGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMzYiIHk9Ii0yODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfcU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTA5MyIgeT0iMzgxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX3JlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX3EtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX3NlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX3ItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19zdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfdE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfdGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfcy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfdWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfdC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRLX21PZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNEtfbWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTA4LCA1MjQsIC0zNzU5LCAtMTMwM10kWy01MDgsIDE5MTMsIC0zNzU5LCA4NF0kWzExMzQsIDE5MTMsIC0yMTE2LCA4NF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0S191dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUY5NEFCOTAwMTUiIHNvdXJjZT0iX0c0QjJBT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0QjFlZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S192LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfd09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRLX3Z1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0S191LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNEtfdk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMzQ2LCAtNTMzLCAtMzEyNCwgMTE5M10kWzMwNjQsIC0xMTkzLCAtMTQwNSwgNTMzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNEtfd2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRLX3d1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY1QzMwRjAwMjYiIHR5cGU9IkNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdEJyZWFrZG93blN0cnVjdHVyZSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3WU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd1ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzRVd1pPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd1p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3Wi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2FPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3YWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2F1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3YS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2JPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3YmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2J1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2ItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRVd1llZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNFV3WXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2MzY2IiB5PSI1OTIzIiBoZWlnaHQ9Ijk1NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2NPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0VXdkT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3ZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdlT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2VlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdldWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2UtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdmT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2ZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdmdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdmLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0VXdjZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRVd2N1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjE4OSIgeT0iMTM2OTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdnT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3Zy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNFV3aE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3aHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3aU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2llZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdpdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2ktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdqT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2plZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdqdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdqLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0VXdnZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRVd2d1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTE0MyIgeT0iMTAzMjkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZlZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2Zk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNGQ2ZmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2Zi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2Z2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2Zy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZoT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2aGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZodWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2aC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2aU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNGQ2ZXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0ZDZlLWZYRWR1cUhvT0piVVJaUnciIHg9IjE1MDg3IiB5PSIxMzE4MiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0ZDZ1ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI3MzY2IiBoZWlnaHQ9IjI0MzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2dXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2dnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2d09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNndlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2d3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNnhPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRkNnR1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNGQ2dC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNzMzIiB5PSIyMzg3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xRRFllZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyB0aGUgdmlldyBvbiBhIHByb2Nlc3MgZnJvbSBhIFdvcmsgUHJvZHVjdCBwZXJzcGVjdGl2ZSBjYWxsZWQgV1BCUyAoV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUpLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNFV3a09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBDIiBzb3VyY2U9Il9HNFV3Z09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNFV3Z09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2stZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3bGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2x1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRVd2xPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwODIiIHk9IjI0MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXdtT2ZYRWR1cUhvT0piVVJaUnciIHg9IjExOTgiIHk9Ii0yOTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3bXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd25PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXdtLWZYRWR1cUhvT0piVVJaUnciIHg9IjMxIiB5PSIyODEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3bmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXduLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd251ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU2MSIgeT0iLTk5OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXdvZWZYRWR1cUhvT0piVVJaUnciIHg9IjU5NyIgeT0iLTc2MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdwdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXdwT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3cC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdxdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXdxT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3cS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd3J1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd3JPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd3N1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd3NPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0VXdrZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRVd2t1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE4MjAsIC04NDYsIC0xODIwLCAtODQ2XSRbLTE4MjAsIC0xOTcyLCAtMTgyMCwgLTE5NzJdJFstNjE4OSwgLTE5NzIsIC02MTg5LCAtMTk3Ml0kWy02MTg5LCAwLCAtNjE4OSwgMF0kWy0yMTkyLCAwLCAtMjE5MiwgMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0VXdzLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjAiIHNvdXJjZT0iX0c0VXdnT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0VXdnT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3dHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3dWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNFV3dC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjk4IiB5PSIzMDIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3dXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3dk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3dS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjkxIiB5PSItMzA2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3dnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTA1IiB5PSIyOTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3d09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd3dlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE1MjgiIHk9IjI5MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXd4T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii03NjAiIHk9Ii0yNTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3eHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3eU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3eWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3eC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3ek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3emVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3eS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXcwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXcwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXd6LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3MHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3MU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXcxZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXcwLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNFV3dE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0VXd0ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIyMjIsIC0yMTEsIDIyMjIsIC0yMTFdJFs1OTgwLCAtMjExLCA1OTgwLCAtMjExXSRbNTk4MCwgLTIwODcsIDU5ODAsIC0yMDg3XSRbOTUyLCAtMjA4NywgOTUyLCAtMjA4N10kWzk1MiwgLTY4OCwgOTUyLCAtNjg4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRVdzF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENiIgc291cmNlPSJfRzRVd2dPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRVd1lPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNlV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZVLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNGQ2VWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRVdzEtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNFV3Mk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNjA5LCAtNjg4LCAtNzY4LCAzOTQyXSRbLTYwOSwgLTQxNTQsIC03NjgsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRkNlZPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0ZDZWZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRkNlZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENyIgc291cmNlPSJfRzRVd2NPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRVd2dPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNlctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZYT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNGQ2V3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNlhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNlgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNlh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY5IiB5PSItNDgyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNllPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2WXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNlllZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE1MyIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNlplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2Wk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTA0IiB5PSItMjgzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNlp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZaLWZYRWR1cUhvT0piVVJaUnciIHg9IjE2MSIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZiT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZhdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2YmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZjT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZidWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2Y2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNmRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNmN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNmVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNmR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0ZDZWLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNGQ2V09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTc1LCAwLCAzOTk2XSRbMCwgLTM3MjUsIDAsIDg0Nl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0ZDZpZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyM0QiIHNvdXJjZT0iX0c0VXdnT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0ZDZlZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2ak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2ai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNGQ2amVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzQ4IiB5PSItNDQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNmtlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQzIiB5PSItMjczIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2bE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzcxIiB5PSI1NTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2bHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNmwtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTU1IiB5PSIyOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2bWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2bS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2bXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDI3IiB5PSItMjk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNm51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNm4tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNm5lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNm91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNm8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNm9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2cHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2cC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2cGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2cS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2cWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRkNml1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0ZDZpLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE3OTQsIDg0NiwgLTcyNDcsIC0xNjQyXSRbNTI4MywgMjQ4MCwgLTM3NTksIC04XSRbNzY2MiwgMjQ4MCwgLTEzODAsIC04XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRkNnJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgc291cmNlPSJfRzRkNmVlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRVd1lPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNGQ2c09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRkNnJlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNGQ2cnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzksIC0zMTcsIDg5OTYsIDY0MzBdJFstNzksIC02NzczLCA4OTk2LCAtMjZdJFstNzkzOCwgLTY3NzMsIDExMzcsIC0yNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRkNnMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0ZDZ0T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRkNnhlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNSIgc291cmNlPSJfRzRkNnRlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRkNnRlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNGQ2eWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNnplZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI4MSIgeT0iNzYxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2MGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNjBPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI1MCIgeT0iNTA0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNjB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2MU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDYwLWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NTgiIHk9IjI4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDYxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDYxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDYxdWZYRWR1cUhvT0piVVJaUnciIHg9IjI4NCIgeT0iLTMzMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDYyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDYydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDYyLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDYyZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2M09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDYzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDYzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDYzZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2NE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNjR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNjQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNjRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDY1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDY1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNjUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNjVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0ZDZ4dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRkNngtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTM2ODMsIC00NzQsIC0zNjgzLCAtNDc0XSRbLTUxMTMsIC00NzQsIC01MTEzLCAtNDc0XSRbLTUxMTMsIC0yMTQyLCAtNTExMywgLTIxNDJdJFstMTc2MSwgLTIxNDIsIC0xNzYxLCAtMjE0Ml0kWy0xNzYxLCAtMTIxOSwgLTE3NjEsIC0xMjE5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRuclVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfRzRVd1lPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRkNnRlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRuclZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJWdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNG5yVk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRuclVlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNG5yVXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDk5LCAtNTAsIDMwMDVdJFswLCAtMjI4NiwgLTUwLCAxMjE5XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNG5yVi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRucldPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNG5yV2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEMwMjgxIiBzb3VyY2U9Il9HNGQ2dGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNGQ2dGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRuclhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRuclgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0bnJYZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yWXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNG5yWWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItOTkiIHk9Ii03MzUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yWS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNG5yWk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTE5IiB5PSI3MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNG5yWi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTM1IiB5PSItMjM0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRucmF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzQwIiB5PSIyODkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNG5yYi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNG5yYmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNG5yYy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNG5yY2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJkLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0bnJkZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJlLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0bnJlZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNG5yV3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0bnJXLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzM2ODMsIC0zMDQsIDM2ODMsIC0zMDRdJFs0NzMyLCAtMzA0LCA0NzMyLCAtMzA0XSRbNDczMiwgLTIxMDgsIDQ3MzIsIC0yMTA4XSRbMTI3MCwgLTIxMDgsIDEyNzAsIC0yMTA4XSRbMTI3MCwgLTEyMTksIDEyNzAsIC0xMjE5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExQzFDRTMwM0QzIiB0eXBlPSJDbGFzcyIgbmFtZT0iVGVhbUJyZWFrZG93blN0cnVjdHVyZSAoc2ltcGxpZmllZCkiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0bnJnT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJoT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucmhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJodWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucmgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJpT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucmllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJpdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJpLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0bnJmZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRucmZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE3MDkiIHk9IjY3NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmpPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0bnJrT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMDgyIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNG5ybGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNG5ybC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucm1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNG5ybWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucm11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucm0tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRucmplZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNG5yanVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2MTcyIiB5PSIxNzg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5ycGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDYzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucnFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzRucnFlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucnEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1VlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjVXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1UtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjVk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1ZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjVnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1YtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y1dPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRucnB1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNG5ycC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjI2OCIgeT0iMzY2NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2hlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0eGNpZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNqZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y2p1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNqLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y2tPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNrZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y2t1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNrLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGNsT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0eGNodWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzR4Y2gtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTkyNiIgeT0iMzY2NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3dlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QjY1MDBFNiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0eGN4ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzQzIiBoZWlnaHQ9Ijk5MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3llZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjeXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3ktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjek9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3plZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjenVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3otZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4YzBPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzR4Y3d1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNHhjdy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI1OTQzIiB5PSI2NzIyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjMnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzR4YzN1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQwMTMiIGhlaWdodD0iMTExNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGMzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjNGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjNC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjNWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjNS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4YzZlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzR4YzItZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNHhjM09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDkyIiB5PSI1MTMwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xRRFktZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBwcm92aWRlcyBhIHNpbXBsaWZpZWQgdmlldyBvbiB0aGUgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIG9ubHkgdGhlIGtleSBjbGFzc2VzIGFuZCByZWxhdGlvbnNoaXBzLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNG5ybk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBzb3VyY2U9Il9HNG5yak9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNG5yZk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucm4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucm91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0bnJvT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNG5ybmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRucm51ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTA0MSwgLTE4NiwgLTUxNTYsIDg4MF0kWzQ0ODcsIC03NzgsIC0xNzEwLCAyODddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0bnJvLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNG5ycE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0eGNXZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTIiIHNvdXJjZT0iX0c0bnJwZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0bnJwZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjWC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzR4Y1hlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNZZWZYRWR1cUhvT0piVVJaUnciIHg9IjgwNiIgeT0iMjgzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjWk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MTQiIHk9Ii05MzAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y1otZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc4NCIgeT0iMzExIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y2F1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU1IiB5PSItMzA5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y2ItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y2JlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y2MtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y2NlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjZC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjZGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2V1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjZS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjZWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzR4Y1d1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNHhjVy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTQzLCAwLCAxMTQzLCAwXSRbMjY0MSwgMCwgMjY0MSwgMF0kWzI2NDEsIDE5MTMsIDI2NDEsIDE5MTNdJFswLCAxOTEzLCAwLCAxOTEzXSRbMCwgNDQ4LCAwLCA0NDhdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNHhjZk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNFIiBzb3VyY2U9Il9HNG5ycGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNG5yZk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2d1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0eGNnT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNHhjZmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzR4Y2Z1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTQ1NywgMCwgMjQ4OV0kWzAsIC0yNDU1LCAwLCA0OTFdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0eGNnLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNHhjaE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0eGNsZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNjAiIHNvdXJjZT0iX0c0eGNoZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0bnJqT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjbS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzR4Y21lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0eGNsdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzR4Y2wtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUwLCAtNDQ4LCAwLCAxNDMwXSRbLTUwLCAtMTQzMCwgMCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNHhjbk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzR4Y25lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNHhjbnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNGIiBzb3VyY2U9Il9HNHhjaGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNG5ycGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y29lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3BPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0eGNvdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjcGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjcHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjkiIHk9IjIzNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y3FlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODIyIiB5PSItMjk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNyT2ZYRWR1cUhvT0piVVJaUnciIHg9IjIwNCIgeT0iLTE4OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjci1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjkiIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjdE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjc3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjdU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjdHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGN2T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGN1dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGN3T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGN2dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNHhjbi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzR4Y29PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTMzNywgMCwgLTQ4MDksIDBdJFs0OTk1LCAwLCAtMTE1MSwgMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0eGMwZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUY5NEFCOTAwMTUiIHNvdXJjZT0iX0c0eGN3ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0eGNoZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGMxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjMS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzR4YzFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0eGMwdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzR4YzAtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUwLCAtNDk5LCAwLCAyNTk5XSRbLTUwLCAtMjY1MCwgMCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNHhjMk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzR4YzJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNHhjNnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZBIiBzb3VyY2U9Il9HNHhjMnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNHhjaGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0Nm1RZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtUmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTM1IiB5PSI0MDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtUi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1TZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtU09mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjAyIiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1TLWZYRWR1cUhvT0piVVJaUnciIHg9IjM5MSIgeT0iMjk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1ULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1UdWZYRWR1cUhvT0piVVJaUnciIHg9IjIwNCIgeT0iLTM0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1VT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1VdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1VLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1VZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1WdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1WLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1WZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzQ2bVctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bVdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1YT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1YdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzQ2bVgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bVhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0eGM2LWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzR4YzdPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTMzLCAtMzE3LCAtNTUyOSwgMTEzOF0kWzEzMywgLTE2MTMsIC01NTI5LCAtMTU4XSRbNDEyOCwgLTE2MTMsIC0xNTM0LCAtMTU4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzQ2bVlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJDMDMwRCIgc291cmNlPSJfRzR4Y3dlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzR4YzJ1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1ZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1adWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNDZtWk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bWFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ2OCIgeT0iLTI0NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1hdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1hLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDYiIHk9IjM0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1iZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtYnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzIiB5PSItMTUzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bWNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODAiIHk9IjE0NzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZtZHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZtZXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtZU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1mZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1mdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1mT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1ndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1nT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNDZtWWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0Nm1ZdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNTM1LCAwLCA0MTU0LCAxNjE0XSRbLTU1NTYsIDAsIDEzMywgMTYxNF0kWy01NTU2LCAtMTI5NiwgMTMzLCAzMThdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTFDNDYxQzAyRjciIHR5cGU9IkNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdEJyZWFrZG93blN0cnVjdHVyZSAoc2ltcGxpZmllZCkiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1odWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0Nm1oLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1pZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1pLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzQ2bWpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1qZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzQ2bWp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1qLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzQ2bWtPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1rZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1rdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0Nm1oT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzQ2bWhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDcwNyIgeT0iOTczIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtay1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzQ2bWwtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1tT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYUWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYUS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYUmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYUi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWFNlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzQ2bWxPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNDZtbGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1NTk2IiB5PSIzMTE1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYVS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVFWFYtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhYT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYWGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhYdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYWC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhZT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYWWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYWXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNUVYVk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1RVhWZWZYRWR1cUhvT0piVVJaUnciIHg9IjQwOTciIHk9IjU0NjkiIHdpZHRoPSI0OTE5IiBoZWlnaHQ9IjIxNzUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhxZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNUVYcmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYc2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhzdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYcy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVh0T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYdGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVh0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYdC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYdU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNUVYcXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1RVhxLWZYRWR1cUhvT0piVVJaUnciIHg9IjUwNzEiIHk9IjExMTQyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xRRFplZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBwcm92aWRlcyBhIHNpbXBsaWZpZWQgdmlldyBvbiB0aGUgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUgb25seSB0aGUga2V5IGNsYXNzZXMgYW5kIHJlbGF0aW9uc2hpcHMuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1RVhTdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0c0Nm1rLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0Nm1nLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYVU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVFWFR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1RVhTLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNUVYVE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDk5LCAwLCAxNjM0XSRbMCwgLTE2MzQsIDAsIDQ5OV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVFWFVlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1RVhVdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVFWFktZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwQyIgc291cmNlPSJfRzVFWFUtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVFWFUtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1RVhaLWZYRWR1cUhvT0piVVJaUnciIHg9IjQxNyIgeT0iMTA2MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhhLWZYRWR1cUhvT0piVVJaUnciIHg9IjMwNyIgeT0iNjgzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYYnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTI2MSIgeT0iNzk5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhjZWZYRWR1cUhvT0piVVJaUnciIHg9Ii05MjciIHk9IjI5MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhkT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMzgiIHk9Ii0yODIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYZWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYZC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYZmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYZS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhnZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhmLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhoZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhnLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNUVYWk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1RVhaZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI0NjAsIC04MCwgMjQ2MCwgLTgwXSRbNDk3NCwgLTgwLCA0OTc0LCAtODBdJFs0OTc0LCAyNDA3LCA0OTc0LCAyNDA3XSRbMTU4NywgMjQwNywgMTU4NywgMjQwN10kWzE1ODcsIDEwODUsIDE1ODcsIDEwODVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNUVYaHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIwIiBzb3VyY2U9Il9HNUVYVS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNUVYVS1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVFWGl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzMzgiIHk9Ii0zMTMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYanVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NjkiIHk9IjI1OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWGtlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjI5IiB5PSItMzEyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhsT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii04MTMiIHk9IjE2NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhsLWZYRWR1cUhvT0piVVJaUnciIHg9IjM0MyIgeT0iNzM3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWG1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWG0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWG5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWG11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWG4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWG9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWG51ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYcE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYb3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYcU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYcHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVFWGgtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNUVYaU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTgzNywgMTA4MywgLTE4MzcsIDEwODNdJFstMTgzNywgMjM2MiwgLTE4MzcsIDIzNjJdJFstNDAyMSwgMjM2MiwgLTQwMjEsIDIzNjJdJFstNDAyMSwgLTIzNywgLTQwMjEsIC0yMzddJFstMjQ1NSwgLTIzNywgLTI0NTUsIC0yMzddIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNUVYdWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjNEIiBzb3VyY2U9Il9HNUVYVS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNUVYcWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVFWHZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjEiIHk9Ii02NDMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYd2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI3MiIgeT0iMTk5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYeE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzMiIHk9Ii03NDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWHgtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjA3IiB5PSItMjAyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWHl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTk4IiB5PSIxMjAzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWHotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWHplZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVgwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWDB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWDAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWDBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVgxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JUWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYMWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JUmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNU9JUS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVFWHV1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNUVYdS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjYyLCAxMDc1LCAtMTYwLCAtNDAwNF0kWy0yNjIsIDQ1ODgsIC0xNjAsIC00OTFdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNU9JUnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q2IiBzb3VyY2U9Il9HNUVYVS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNDZtay1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1T0lTdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNU9JUi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1T0lTT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy00MiwgLTEwOTIsIC05MywgMTg1NF0kWy00MiwgLTI0NTUsIC05MywgNDkxXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNU9JVGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVPSVR1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNU9JVC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzAzIiBzb3VyY2U9Il9HNUVYcWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNDZtay1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1T0lVLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNU9JVU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1T0lVZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzODAsIC0xNiwgMTIyNywgODAwOV0kWzcxMjgsIC0xNiwgNjk3NiwgODAwOV0kWzcxMjgsIC04MDg1LCA2OTc2LCAtNTldJFsxMTU5LCAtODA4NSwgMTAwNywgLTU5XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNU9JVnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVPSVYtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTFDNDk0NjAzMUUiIHR5cGU9IkNsYXNzIiBuYW1lPSJXb3JrQnJlYWtkb3duU3RydWN0dXJlIChzaW1wbGlmaWVkKSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JV09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVPSVhPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JWC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JWWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JWS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JWmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSVotZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVPSVdlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNU9JV3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI1OTk0IiB5PSI2NTYxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JYU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVPSWJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0liZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JY2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JYy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JZGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSWQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVPSWFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNU9JYXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1NTYyIiB5PSI0MzI2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JZU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVPSWZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JZ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JZy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JaGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSWgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVPSWVlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNU9JZXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDMwIiB5PSI2NjM4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JaU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVPSWpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE2NTkiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9Ja09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lrZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9Ja3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lrLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JbE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lsZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JbHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JbC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNU9JaWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1T0lpdWZYRWR1cUhvT0piVVJaUnciIHg9IjMyMDAiIHk9IjY2OTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0ltT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNU9Jbk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSW5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0luLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9Jb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lvZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9Jb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lvLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JcHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JcC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNU9JbWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1T0ltdWZYRWR1cUhvT0piVVJaUnciIHg9IjMzODYiIHk9IjE1MzIiIHdpZHRoPSI1OTI2IiBoZWlnaHQ9IjEwMDciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNPZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNVhTUGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjIxOCIgaGVpZ2h0PSI4NDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNRZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU1F1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU1JPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNSZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU1J1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNSLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNTT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1WFNPdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU08tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjQ5NyIgeT0iNDM1MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2JPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1WFNjT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MjY3IiBoZWlnaHQ9Ijk5MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2RPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTZGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2R1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTZC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTZWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2V1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU2UtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVYU2JlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTYnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1MjgzIiB5PSI4NjUyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTanVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDMxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVYU2t1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE4NjIiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2stZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTbHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNsLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTbU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNtZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTbXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNtLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTbk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTbmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNVhTai1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1WFNrT2ZYRWR1cUhvT0piVVJaUnciIHg9IjkxNjUiIHk9IjY1NjEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbFFEWi1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBpcyBhIHNpbXBsaWZpZWQgcmVwcmVzZW50YXRpb24gb2YgYSBXQlMgb25seSBzaG93aW5nIGtleSBlbGVtZW50cyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcy4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVYU01PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfRzVPSWFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVPSW1PZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU05lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNOdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTTk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVYU01lZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNVhTTXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDQ4LCAyNTQsIDIyOTRdJFswLCAtMjI0MywgMjU0LCA0OTldIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFNOLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTT09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1WFNTZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRUYiIHNvdXJjZT0iX0c1T0ltT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1WFNPZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTVGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMzAiIHk9Ijc5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1WFNVZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yODciIHk9Ii0yNjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTVS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNVhTVk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1WFNWLWZYRWR1cUhvT0piVVJaUnciIHg9Ii03NSIgeT0iLTE5NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNXZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNVhTV3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU1gtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVYU1hlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU1ktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVYU1llZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNaT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTWi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNVhTWmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTYS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNVhTYWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVYU1N1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNVhTUy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjk2MywgLTEwMSwgLTIyMCwgLTI4NDRdJFstMzU5OCwgLTEwMSwgLTg1NSwgLTI4NDRdJFstMzU5OCwgMjMxOSwgLTg1NSwgLTQyM10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1WFNmT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyQTAiIHNvdXJjZT0iX0c1T0lpT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1WFNPZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTZ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU2dPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1WFNmZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVYU2Z1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTM4MSwgLTQ0OCwgMjI4LCAxODM3XSRbLTM4MSwgLTE4NjIsIDIyOCwgNDIzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTZy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU2hPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNVhTaGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjlGIiBzb3VyY2U9Il9HNU9JZU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNVhTT2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2ktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1WFNpZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNVhTaHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1WFNoLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzU1NiwgLTMxOCwgLTY2MSwgMTk1OF0kWzU1NiwgLTE5NTgsIC02NjEsIDMxOF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU2pPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFNqZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVYU251ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQjFFQzFCMDM0OSIgc291cmNlPSJfRzVYU2p1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVYU2JPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU28tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTb3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVYU24tZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNVhTb09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzY0LCA0NDgsIDE5NzIsIC0xNjg0XSRbLTM2NCwgMTYzNCwgMTk3MiwgLTQ5OV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU3BlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFNwdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVYU3AtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzIzMDE5QSIgc291cmNlPSJfRzVYU2JPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVPSW1PZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNyZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTcS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVYU3FPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNVhTcWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNTM0LCAtMzE4LCAyNzc4LCA2NjQxXSRbMTUzNCwgLTY0ODIsIDI3NzgsIDQ3N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU3J1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFNyLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVYU3NPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjgyMDM5MiIgc291cmNlPSJfRzVYU09lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVYU2JPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFN0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTdE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVYU3NlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNVhTc3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5MjYsIDMxOCwgLTMyMDIsIC0zOTk1XSRbOTI2LCAxMzIzLCAtMzIwMiwgLTI5OTBdJFsyMzI4LCAxMzIzLCAtMTgwMCwgLTI5OTBdJFsyMzI4LCAzOTk1LCAtMTgwMCwgLTMxOF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU3QtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFN1T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVYU3VlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgc291cmNlPSJfRzVPSVdPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVPSWFPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFN2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFN2LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTdmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVYU3V1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNVhTdS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNDA2LCAtNDU3LCAzNTUsIDE3NzhdJFstNDA2LCAtMTc4NiwgMzU1LCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFN3T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTd2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1WFN3dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTIzQjAwMDIiIHNvdXJjZT0iX0c1T0lXT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1WFNiT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFN4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTeU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU3h1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1WFN3LWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVYU3hPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTMxNywgMzE3LCAtMzk3LCAtMTc3M10kWy0zMTcsIDE3NzIsIC0zOTcsIC0zMThdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFN5ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTeXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDE1ODBGMDBDNCIgdHlwZT0iQ2xhc3MiIG5hbWU9IkRlc2NyaXB0b3JSZWxhdGlvbnNoaXBzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhETS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRE5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVoRE1lZlhFZHVxSG9PSmJVUlpSdyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4IiBkZXNjcmlwdGlvbj0ie1JvbGVEZXNjcmlwdG9yLm1vZGlmaWVzID0gUm9sZS5wZXJmb3Jtc0FzT3duZXIub3V0cHV0IHVuaW9uIFJvbGUucGVyZm9ybXNBZGRpdGlvbmFsbHkub3V0cHV0IHVuaW9uIFJvbGUuYXNzaXN0c0luLm91dHB1dH0iIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNWhETXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzc3MSIgeT0iMjM3OSIgd2lkdGg9IjU1MDMiIGhlaWdodD0iMTc1MiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRE5lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1aERPZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhET3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRFBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERQZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVoRFB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERQLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVoRFFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERRZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVoRFF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1aERST2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1aEROdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVoRE4tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzMzMjQiIHk9IjU3NDAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERSZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNWhEU2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRFN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEVGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1aERUdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEVC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1aERVT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEVWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1aERVdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOSU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOSWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNWhEUnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1aERSLWZYRWR1cUhvT0piVVJaUnciIHg9IjE3MTcwIiB5PSIxNTEzOCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTkl1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5KZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1cU5KdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5LT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTktlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5LdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTkstZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5MT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTkxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5MdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTkwtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5NT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5NZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1cU5JLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVxTkpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjY5OTEiIHk9IjQ2MjIiIHdpZHRoPSI0NDQ1IiBoZWlnaHQ9IjM4NjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5WZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNXFOV2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTld1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5YT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOWGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5YdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOWC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5ZT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOWWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5ZdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOWS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOWk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNXFOVnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1cU5WLWZYRWR1cUhvT0piVVJaUnciIHg9IjE2ODgyIiB5PSI4NzIwIiB3aWR0aD0iNDQ0NSIgaGVpZ2h0PSI0ODE3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotVk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzV6LVdPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM3NTkiIGhlaWdodD0iMTExNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1XZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotWGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotWC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotWWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LVktZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzV6LVZlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNXotVnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjkyIiB5PSIxMDI2MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVpPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1aLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1ei1hT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1hdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1iT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotYmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotYi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotY2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LWMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzV6LVplZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNXotWnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MTc4IiB5PSI0MjkyIiB3aWR0aD0iNjUxMCIgaGVpZ2h0PSIzOTIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xRRGFlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBwcm92aWRlcyBhbiBvdmVydmlldyB0byBhbGwgRGVzY3JpcHRvciB0eXBlcyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UsIHRoZWlyIGF0dHJpYnV0ZXMgYW5kIGFzc29jaWF0aW9ucy4gIFdlIHNlZSB0aGF0IGVhY2ggRGVzY3JpcHRvciB0cmFjZXMgYmFjayB0byB0aGUgY29yZSBjb250ZW50IGVsZW1lbnQgdGhleSByZWZlciB0by4gIERlc2NyaXB0b3JzIGFsc28gZGVmaW5lIGFkZGl0aW9uYWwgYXNzb2NpYXRpb25zIHRoYW4gdGhlIGFzc29jaWF0aW9ucyBkZWZpbmVkIGFtb25nc3QgdGhlIGNvcmUgY29udGVudCBlbGVtZW50cy4gIEZvciBleGFtcGxlLCBFeHRlcm5hbCBJbnB1dHMgYmV0d2VlbiBUYXNrcyBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFyZSBub3QgZGVmaW5lZCBpbiBDb3JlIE1ldGhvZCBDb250ZW50LCBiZWNhdXNlIGl0IGV4cHJlc3NlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHNwZWNpZmljIHRvIGEgcHJvY2VzcyBhbmQgbm90IGF2YWlsYWJsZS9rbm93biBmb3IgbWV0aG9kIGNvbnRlbnQuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1cU5NdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkEiIHNvdXJjZT0iX0c1aEROZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1cU5JdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5OLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOT09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVxTk51ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5PZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5PLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5PdWZYRWR1cUhvT0piVVJaUnciIHg9IjQiIHk9IjI4MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5QT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTlBlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDY2IiB5PSItMjg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOUWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5RT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEwMCIgeT0iMTI4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5ST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5RLWZYRWR1cUhvT0piVVJaUnciIHg9IjgzIiB5PSIzNDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOU09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOUnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOVE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOU3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5ULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5VT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5UdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOVWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5WT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5VdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNXFOTS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1cU5OT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xODc5LCAtMjUsIDQxMTQsIC0yNzldJFstMzc3NiwgLTI1LCAyMjE4LCAtMjc5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVxTlplZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMSIgc291cmNlPSJfRzVxTlZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVxTkl1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5hT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5hLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1cU5hZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNTciIHk9Ii0yNjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzJCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOYmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItODk1IiB5PSItMTg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5jZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOY09mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MjIiIHk9IjI4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5jdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOYy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MzUiIHk9IjE5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5kZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5kLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5kdWZYRWR1cUhvT0piVVJaUnciIHg9IjgzNSIgeT0iLTIzMTAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzJCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOZS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOZWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOZi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOZmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5ndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5nLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5nZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5oLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5oZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNXFOWnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1cU5aLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIyMTgsIC0xNDIyLCAtNzg5MCwgMzE0OV0kWzg2NTIsIC0xNDIyLCAtMTQ1NiwgMzE0OV0kWzg2NTIsIC0yNjQxLCAtMTQ1NiwgMTkzMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1cU5pT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzM0YiIHNvdXJjZT0iX0c1cU5WZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1cU5JdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5qZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNXFOak9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTIxNSIgeT0iLTMyMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5qLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5rZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5rT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xOTIwIiB5PSItMjU0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5sT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOay1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTE1OCIgeT0iMjM3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFObC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5sdWZYRWR1cUhvT0piVVJaUnciIHg9IjE3ODMiIHk9Ii0xMzQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFObU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFObXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFObWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxODE3IiB5PSIxMjAzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTm0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTm5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTm51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTm5PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5uLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTm9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTm91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTm9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5vLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOcGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOcHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOcE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOcXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOcU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVxTmllZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNXFOaXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMjE4LCAxODk2LCAtNzg5MCwgNjQ2OF0kWzExNzE3LCAxODk2LCAxNjA4LCA2NDY4XSRbMTE3MTcsIC0yNjQxLCAxNjA4LCAxOTMwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVxTnEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1MyIgc291cmNlPSJfRzVxTlZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVxTkl1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5zZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1cU5yLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0yNjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOdE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOcy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTM2MyIgeT0iLTI4OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU50ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTnR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjEyIiB5PSIyNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU51dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTnVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIzNiIgeT0iNDMzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTnZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjI2IiB5PSIxMTEwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LUpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LUl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1KZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LUtPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LUp1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1LZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotTE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotS3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotTU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotTHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVxTnJPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNXFOcmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMjE4LCA1OSwgLTc4OTAsIDQ2MzFdJFs5Nzg3LCA1OSwgLTMyMSwgNDYzMV0kWzk3ODcsIC0yNjQxLCAtMzIxLCAxOTMwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzV6LU1lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRCIgc291cmNlPSJfRzVoRFJlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVxTlZlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1OT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LU51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1OLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNXotTmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LU9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LU91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LU9lZlhFZHVxSG9PSmJVUlpSdyIgeD0iODIiIHk9Ii00MDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1QT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE2MCIgeT0iNTc5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1QLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjciIHk9Ii0yMzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotUWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LVF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzYiIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotUi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotUmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotUy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotU2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1UdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1ULWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1UZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1VLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1VZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNXotTXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1ei1NLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzNSwgLTU1OCwgODQsIDQwMTNdJFsxMzUsIC0yMTY3LCA4NCwgMjQwNF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1ei1kT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjAiIHNvdXJjZT0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1lZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNXotZU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjA3MyIgeT0iMjU0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LWZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjE1IiB5PSIyNzUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1mLWZYRWR1cUhvT0piVVJaUnciIHg9IjE1MCIgeT0iLTg2NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1nZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotZ3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjE1NiIgeT0iLTM1OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1oT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1odWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1oZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NzEiIHk9Ii0xMTU3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LWl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LWlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1pLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LWp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LWpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1qLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXota2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXota3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXota09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotbHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotbE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzV6LWRlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNXotZHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNTE0LCAtMTk1NSwgMjUxNCwgLTE5NTVdJFsyNTE0LCAtMzUyMiwgMjUxNCwgLTM1MjJdJFstOTIyLCAtMzUyMiwgLTkyMiwgLTM1MjJdJFstOTIyLCAtMTk1NSwgLTkyMiwgLTE5NTVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNXotbC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBDIiBzb3VyY2U9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LW11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LW5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzV6LW0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc0OSIgeT0iLTgzMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1udWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1vT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1uLWZYRWR1cUhvT0piVVJaUnciIHg9Ii04MTkiIHk9Ii00NDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LW8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1vdWZYRWR1cUhvT0piVVJaUnciIHg9IjgzIiB5PSIzMDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1wdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LXBlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTk5IiB5PSItMjM3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LXFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTkxIiB5PSIzNDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotcmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotcS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotc2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotci1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei10T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei10ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1zLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2SU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2SXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZJLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZJZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNXotbU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1ei1tZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNzAwLCAtMTk1NSwgLTI3MDAsIC0xOTU1XSRbLTI3MDAsIC0yNjc1LCAtMjcwMCwgLTI2NzVdJFstNzM4MiwgLTI2NzUsIC03MzgyLCAtMjY3NV0kWy03MzgyLCAtODU1LCAtNzM4MiwgLTg1NV0kWy0zMjUxLCAtODU1LCAtMzI1MSwgLTg1NV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1OXZKT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0UiIHNvdXJjZT0iX0c1cU5JdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Si1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2S3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNTl2S09mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNjIiIHk9Ii0yODgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Sy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2TGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2TE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTQ4MiIgeT0iLTM1NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2TU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dkwtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDQwIiB5PSIyNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2TWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dk11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY0MCIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZOZWZYRWR1cUhvT0piVVJaUnciIHg9IjQ1NSIgeT0iMjM3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dk4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dk9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dk91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dk9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dlB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dlBPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2UWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2UXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2UU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2UnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2Uk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzU5dkplZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNTl2SnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjIxOCwgNDU3LCAxNTU2MSwgNzYyXSRbLTE0NTI4LCA0NTcsIDMyNTEsIDc2Ml0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1OXZSLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUMiIHNvdXJjZT0iX0c1cU5JdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2U3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2VGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNTl2Uy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4NzAiIHk9Ii0yNzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2VHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2VU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2VC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTQ4MiIgeT0iLTMyOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZVZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZVdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zODIiIHk9IjI2MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2VmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjMyIiB5PSItMjQ1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dldlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dldPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzc2IiB5PSIyODAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2V3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2WE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2WGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2Vy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2WU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2WWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2WC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dll1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZaT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZaZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZZLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2WnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2YU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZhZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZaLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNTl2U09mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1OXZTZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMjE4LCAtMTEwMCwgMTU1NjEsIC03OTVdJFstMTQ1MjgsIC0xMTAwLCAzMjUxLCAtNzk1XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzU5dmF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0c1aERNT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1OXZSLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNTl2YS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzU5dmJPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTEwLCA4NzIsIC0yMDMsIC0xMzI5XSRbMzEzLCAyMjAxLCAwLCAwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNTl2YmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzU5dmJ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNTl2Yi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjI5IiBzb3VyY2U9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXFOVmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2ZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzU5dmMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTI5IiB5PSItMzA0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dmQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ3NiIgeT0iMTk1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2ZXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDU5IiB5PSItMTE5NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2ZmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MTgiIHk9Ii0yOTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Zi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Z2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2Z09mWEVkdXFIb09KYlVSWlJ3IiB4PSItNjA3IiB5PSIyNjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Z3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2aE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2aGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2Zy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2aU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2aWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2aC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dml1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZqZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZpLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2anVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2a09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZrZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZqLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNTl2Y09mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1OXZjZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIyMTgsIDE5NTUsIC01NDUyLCAtMjkyMV0kWzIyMTgsIDM2OTksIC01NDUyLCAtMTE3Nl0kWzU0NTIsIDM2OTksIC0yMjE4LCAtMTE3Nl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1OXZrdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyM0QiIHNvdXJjZT0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1cU5WZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2bGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2bU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNTl2bHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2MjciIHk9Ii0yNzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2bWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2bS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2bXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTI5OSIgeT0iLTI0NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2bnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dm5lZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwMTkiIHk9IjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2bi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dm9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM5MyIgeT0iLTE5NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZvLWZYRWR1cUhvT0piVVJaUnciIHg9IjUwNCIgeT0iMjcxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dnBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dnAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dnFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dnB1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dnEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dnJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dnF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2ci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2c09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2cnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dnNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dnMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2dE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2c3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzU5dmstZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNTl2bE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjY0NiwgMTk1OCwgLTEwMzE4LCAtMjkxMF0kWy0yNjQ2LCA1ODIxLCAtMTAzMTgsIDk1M10kWzU0NTAsIDU4MjEsIC0yMjIyLCA5NTNdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNkc1RU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVCIiBzb3VyY2U9Il9HNXFOVmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1RmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZHNUZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkxMCIgeT0iMjU0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNUdPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE4MjMiIHk9IjI3OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1SE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNUctZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTUzNiIgeT0iLTMxNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1SHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjM3IiB5PSIyMDMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1SU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1SXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1SWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MyIgeT0iOTc0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZHNUp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNUpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZHNUt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNUtPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1TGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkc1THVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1TE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNU1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkc1TXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1TU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZHNUVlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNkc1RXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjIyMiwgMzE4LCA1NDUwLCA1MTg2XSRbLTkwNDgsIDMxOCwgLTEzNzYsIDUxODZdJFstOTA0OCwgLTI5MTAsIC0xMzc2LCAxOTU4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZHNU0tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFBMDA0QiIgc291cmNlPSJfRzVxTlZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzV6LVpPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNU9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2RzVOLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNDMiIHk9IjI3MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVPLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDYyIiB5PSIyNDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1UGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI5NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVQdWZYRWR1cUhvT0piVVJaUnciIHg9IjMyNyIgeT0iLTIyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI4MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1UWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDAzIiB5PSIxODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1US1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1UmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1Uk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI2NTYiIHk9IjEwMjQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1UnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjk1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1U09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkc1U2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1Ui1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1VE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkc1VGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1Uy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVVZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVULWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1VXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1Vk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVWZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVVLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNkc1Tk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2RzVOZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMjE4LCA4LCA1NDUyLCA0ODg1XSRbLTc5OTIsIDgsIC0zMjEsIDQ4ODVdJFstNzk5MiwgLTI5MjEsIC0zMjEsIDE5NTVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNkc1VnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q3IiBzb3VyY2U9Il9HNXotVk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1Vy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2RzVXdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1WGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1WC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1WHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjE3IiB5PSI0MjkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1WU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVZZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNjYiIHk9Ii0xMTcwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1WmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVaT2ZYRWR1cUhvT0piVVJaUnciIHg9IjUzNiIgeT0iNDU3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVaLWZYRWR1cUhvT0piVVJaUnciIHg9IjI2NCIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzViT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVhdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1YmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzViLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVjT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVidWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1Y2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZHNWRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNWN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZHNWVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNWR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2RzVWLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNkc1V09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTY3LCAtNjg1OCwgNDAwNF0kWzMzLCAtMjI5NCwgLTY4MjQsIDIyNzddJFszNTk4LCAtMzQ5NiwgLTMyNTksIDEwNzVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTFDNENDNTAyNjAiIHR5cGU9IkNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yUmVsYXRpb25zaGlwcyAoc2ltcGxpZmllZCkiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2UXFGT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFHT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcUdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFHdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcUctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcUhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFIdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFILWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2UXFFZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZRcUV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU3MDUiIHk9IjI0OTciIHdpZHRoPSIzMjM0IiBoZWlnaHQ9IjEyMDIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFJT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNlFxSk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxS09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFLZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxS3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFLLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxTE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFMZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxTHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxTC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNlFxSWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2UXFJdWZYRWR1cUhvT0piVVJaUnciIHg9IjYwMSIgeT0iMjM3MCIgd2lkdGg9IjQ3OTIiIGhlaWdodD0iMTc2MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2UXFldWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFmdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcWYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJFT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYkVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJFdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYkUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJGT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJGZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2UXFkLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZRcWVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODc3OSIgeT0iNjMyNCIgd2lkdGg9IjMzNjkiIGhlaWdodD0iMTc3OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsWk5VZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gcHJvdmlkZXMgYSBzaW1wbGlmaWVkIG92ZXJ2aWV3IG9mIHRoZSBkaWZmZXJlbnQgRGVzY3JpcHRvciB0eXBlcyBkZWZpbmVkIGluIHRoaXMgUHJvY2VzcyBwYWNrYWdlIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIG5vdCBzaG93aW5nIGNsYXNzIGF0dHJpYnV0ZXMgb3IgYXNzb2NpYXRpb24gcm9sZXMuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2UXFNT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0UiIHNvdXJjZT0iX0c2UXFFT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2UXFJT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNlFxTk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjciIHk9IjI1NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFPT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMTI0IiB5PSItMjg4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcU91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcU8tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFQZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxUHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjA5IiB5PSItNDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFRZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxUnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxUk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxU3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxU09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFUdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFUT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxVWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFVdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFVT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNlFxTWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2UXFNdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNjE3LCA5MywgMTI3MDgsIC01OV0kWy0xMTkyOSwgOTMsIDIzOTYsIC01OV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2UXFVLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUMiIHNvdXJjZT0iX0c2UXFFT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2UXFJT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNlFxVi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxODIiIHk9IjI3OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFXLWZYRWR1cUhvT0piVVJaUnciIHg9Ii02MjYiIHk9Ii01MjUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxWGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxWHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzk1IiB5PSIzNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcVllZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA1MCIgeT0iLTEwMDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxWS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcVpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFhZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFaLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFiZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFhLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcWNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcWItZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcWRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcWMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2UXFWT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZRcVZlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTQ2NSwgLTYwMSwgMTM4NTksIC03NTNdJFstNDY1LCAtMTkzMCwgMTM4NTksIC0yMDgyXSRbLTEzOTYxLCAtMTkzMCwgMzY0LCAtMjA4Ml0kWy0xMzk2MSwgLTcyOCwgMzY0LCAtODgwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZhYkZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMSIgc291cmNlPSJfRzZRcWR1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZRcUVPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2YWJHdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMTIyIiB5PSIyNjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiSGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzJCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiSHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItODI3IiB5PSI5MDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiSU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiSWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJKT2ZYRWR1cUhvT0piVVJaUnciIHg9IjcwOSIgeT0iMjEyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJKLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzJCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiTE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiS3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiTU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiTHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYk1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJOT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJNdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJPT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJOdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNmFiRi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2YWJHT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2ODQsIC04MjEsIC01MTczLCAzMjkzXSRbNTQ2OSwgLTgyMSwgLTEzODgsIDMyOTNdJFs1NDY5LCAtMzUxMywgLTEzODgsIDYwMV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2YWJPZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzM0YiIHNvdXJjZT0iX0c2UXFkdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2UXFFT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJQdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNmFiUGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MDAiIHk9IjI5NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJRZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNDI0IiB5PSIzNTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiUk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJSLWZYRWR1cUhvT0piVVJaUnciIHg9IjEzMTQiIHk9Ii0xNjgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiU2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYlN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJULWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJUZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJVLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJVZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYlYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYlZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYlctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYldlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2YWJPdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZhYk8tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTY4NCwgNjYwLCAtNTE3MywgNDc3NV0kWzgwODUsIDY2MCwgMTIyNywgNDc3NV0kWzgwODUsIC0zNTEzLCAxMjI3LCA2MDFdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNmFiWE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzUzIiBzb3VyY2U9Il9HNlFxZHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNlFxRU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiWWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYll1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZhYllPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg5NSIgeT0iMzg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYlpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExMzciIHk9Ii05NDAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiWnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiWi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJhdWZYRWR1cUhvT0piVVJaUnciIHg9Ijk4NSIgeT0iMzkxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJiZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiY3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiY09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiZHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJldWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJlT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJmdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJmT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNmFiWGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2YWJYdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2ODQsIC0xMTgsIC01MTczLCAzOTk2XSRbNTgzMywgLTExOCwgLTEwMjQsIDM5OTZdJFs2NTQ0LCAtNTksIC0zMTMsIDQwNTVdJFs2NTQ0LCAtMzUxMywgLTMxMywgNjAxXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZhYmYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyOSIgc291cmNlPSJfRzZRcUlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZRcWR1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2YWJnLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zOTgiIHk9Ii0yNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiaC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjk2IiB5PSItNjc3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYml1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiamVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MTMiIHk9Ii0yMTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiai1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYmtPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJsZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJrLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFibHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJtZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJsLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFibXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYm5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYm0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYm9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYm4tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2YWJnT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZhYmdlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTYzNCwgODgwLCAtNTgzMywgLTMwODFdJFsxNjM0LCAxODcxLCAtNTgzMywgLTIwOTFdJFs2NzIyLCAxODcxLCAtNzQ1LCAtMjA5MV0kWzY3MjIsIDMwNzMsIC03NDUsIC04ODldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNmFib3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjNEIiBzb3VyY2U9Il9HNlFxSU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNlFxZHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYnBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFicC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYnFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZhYnB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExNiIgeT0iLTI2MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJxdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMzE2IiB5PSItMTM1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsQmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTE5IiB5PSItMzEzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxDT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsRGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsQy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbER1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsRWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsRC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxGZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxFLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxHZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxGLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNmFiby1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2YWJwT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xOTQ3LCA4ODAsIC05NDE0LCAtMzA4MV0kWy0xOTQ3LCA0NDYxLCAtOTQxNCwgNDk5XSRbMTM1LCA0NDM2LCAtNzMzMiwgNDc0XSRbNTc4MiwgNDQzNiwgLTE2ODQsIDQ3NF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2amxHdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUIiIHNvdXJjZT0iX0c2UXFkdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2UXFJT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsSGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNmpsSHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjczIiB5PSIzMDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsSXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTIwMyIgeT0iMjcxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEplZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsS09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTUzIiB5PSIxODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsS3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbExPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEstZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxNT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxMdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxOT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxNdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbE4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbE9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbE51ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbFBPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbE91ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2amxHLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZqbEhPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE2ODQsIC0zMzgsIDU3ODIsIDM2MjNdJFstODM4MiwgLTMzOCwgLTkxNCwgMzYyM10kWy04MzgyLCAtMzA4MSwgLTkxNCwgODgwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZqbFBlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFBMDA0QiIgc291cmNlPSJfRzZRcWR1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZRcUlPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2amxRZWZYRWR1cUhvT0piVVJaUnciIHg9Ii00MDMiIHk9IjMwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxSZWZYRWR1cUhvT0piVVJaUnciIHg9Ii05NzUiIHk9Ii0yMTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsUi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsU09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxTLWZYRWR1cUhvT0piVVJaUnciIHg9IjgzMCIgeT0iMjExIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyODEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxUdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjk1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsVS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsVWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsVi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsVmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxXLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxXZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxYLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxYZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNmpsUHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2amxQLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNDczLCAtODg5LCA1OTk0LCAzMDczXSRbLTE0NzMsIC0xMjYxLCA1OTk0LCAyNzAwXSRbLTY5NTksIC0xMjYxLCA1MDgsIDI3MDBdJFstNjk1OSwgLTMwODEsIDUwOCwgODgwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFNzkwNTQwMjI1IiB0eXBlPSJDbGFzcyIgbmFtZT0iQWN0aXZpdHkiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2amxaT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI2ODkxIiBoZWlnaHQ9IjI0MjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsYWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbGF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsYS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbGJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsYmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0FPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V0FlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzZqbFllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNmpsWXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NzE0IiB5PSIxNTgzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXQXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzZ0V0J1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE1NzQiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXQ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdDLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXRE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdEZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXRHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdELWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXRU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXRWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNnRXQS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2dFdCT2ZYRWR1cUhvT0piVVJaUnciIHg9IjY2MjkiIHk9IjcyNzIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdOZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0IiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNnRXT2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTY1OSIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1BPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdQZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V1B1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdQLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V1FPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdRZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V1F1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdST2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2dFdOdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZ0V04tZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzgwNiIgeT0iOTEwMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1R1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdVZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2dFdVdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdWdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V1YtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdXT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V1dlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdXdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V1ctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdYT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdYZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2dFdULWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZ0V1VPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjE0NiIgeT0iOTEwMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1otZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2dFdhLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MjUwIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2ItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXY09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2NlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXY3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2MtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXZE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2RlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V2R1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzZ0V2FPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNnRXYWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxODE5IiB5PSI1MDM1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXaWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzZ0V2plZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2tlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXa3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2stZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXbE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2xlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXbHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2wtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V21PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzZ0V2l1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNnRXaS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI2Njg4IiB5PSI1MDcyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xaTlUtZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyBrZXkgYXR0cmlidXRlcyBhbmQgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciBBY3Rpdml0eSBpbiB0aGUgUHJvY2VzcyBCcmVha2Rvd24gcGFja2FnZS4gIE9uZSBjYW4gc2VlIHRoYXQgdGhlIGNvbmNlcHRzIG9mIFBoYXNlIGFuZCBJdGVyYXRpb24gaGF2ZSBiZWVuIGRlZmluZWQgYXMgc3BlY2lhbCBBY3Rpdml0aWVzLiAiLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZ0V0V1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBFRiIgc291cmNlPSJfRzZqbFlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZ0V0F1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2dFdGdWZYRWR1cUhvT0piVVJaUnciIHg9Ii03NDkiIHk9IjE1OTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNnRXR3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDc5IiB5PSItMjQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNnRXSGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTM5IiB5PSIxNjkyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2dFdJT2ZYRWR1cUhvT0piVVJaUnciIHg9IjUzNiIgeT0iMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZ0V0ktZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQxNCIgeT0iLTM0MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdLT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2dFdKdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdMT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2dFdLdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0wtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V01PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZ0V0x1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V05PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZ0V011ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2dFdFLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZ0V0ZPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTg1MiwgMTA1OCwgMzcwNCwgLTM4OTBdJFsxODUyLCA1MDAxLCAzNzA0LCA1M10kWy05MjYsIDUwMDEsIDkyNiwgNTNdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNnRXUmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMkEwIiBzb3VyY2U9Il9HNnRXTmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNnRXQXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1MtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2dFdTZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNnRXUnVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZ0V1ItZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTMwNCwgLTQ1NywgOTE0LCAxMzcxXSRbLTkyMiwgLTEzODAsIDI5NiwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNnRXVE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzZ0V1RlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNnRXWHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjlGIiBzb3VyY2U9Il9HNnRXVHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNnRXQXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1pPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2dFdZdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNnRXWC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZ0V1lPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzA0LCAtNDU3LCAtOTY1LCAxMzcxXSRbOTQ4LCAtMTM4MCwgLTMyMSwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNnRXWmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzZ0V1p1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNnRXZC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyODIwMzkyIiBzb3VyY2U9Il9HNnRXQXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNnRXWi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2V1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2ZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2dFdlLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNnRXZU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2dFdlZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05NTMsIDUzLCAyNTEzLCAyMjc2XSRbLTQ0NDUsIDUzLCAtOTc5LCAyMjc2XSRbLTQ0NDUsIC0xOTA1LCAtOTc5LCAzMThdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c2dFdmdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNnRXZi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2dFdnT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyMzAxOUEiIHNvdXJjZT0iX0c2dFdaLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2amxZT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXaHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZ0V2hPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2dFdnZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZ0V2d1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTI3LCAtNDQ4LCAtNTY2NCwgMjI5NF0kWzEyNywgLTI2MjQsIC01NjY0LCAxMThdJFsyMzQ1LCAtMjYyNCwgLTM0NDUsIDExOF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzZ0V2gtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c2dFdpT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZ0V21lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzI5MDFGRCIgc291cmNlPSJfRzZ0V0F1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZ0V2llZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFduT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V251ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFduLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNnRXbmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZ0V211ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNnRXbS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNSwgLTQ1NywgLTEwOTIsIDE3MjddJFsyNSwgLTE2NjcsIC0xMDkyLCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c2MmY4T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNjJmOGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5MkQ0MDA3RSIgdHlwZT0iQ2xhc3MiIG5hbWU9IldvcmtEZWZpbml0aW9uQW5kQnJlYWtkb3duIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmY4dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJmOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNjJmOXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNTE2NCIgaGVpZ2h0PSIyMDY1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZjktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJmLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmYtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJmLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZi0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmZfT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZl9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmZfdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZl8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdBT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdBZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2MmY4LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzYyZjlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU4MDciIHk9IjExODcwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnQXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzYyZ0J1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjczODIiIGhlaWdodD0iMTE4NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnQ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdDLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnRE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdEZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnRHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdELWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnRU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnRWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNjJnQS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2MmdCT2ZYRWR1cUhvT0piVVJaUnciIHg9IjUxOTgiIHk9IjExODUzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnRXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzYyZ0Z1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3MjYiIGhlaWdodD0iMTEwMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdHLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnSE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdIZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnSHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdILWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnSU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnSWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNjJnRS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2MmdGT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEyNjMwIiB5PSIxNTMyNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0l1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2MmdKdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MzE4IiBoZWlnaHQ9IjE2MjUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnSy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0xPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnTGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0x1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnTC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ01PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ01lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzYyZ0ktZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNjJnSk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI0Njk5IiB5PSIxNTI5MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ011ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2MmdOdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNjc1IiBoZWlnaHQ9IjExMDAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ09lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnTy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1BPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnUGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1B1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnUC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1FPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ1FlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzYyZ00tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNjJnTk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI5MzYyIiB5PSIxNTI5OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1F1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA2MyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2MmdSdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMjM1IiBoZWlnaHQ9IjExMDAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnUy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1RPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnVGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1R1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnVC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ1VlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzYyZ1EtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNjJnUk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTY4IiB5PSIxNTI5OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUThPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVE4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3QVE5T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTIyIiBoZWlnaHQ9IjE1MjQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FROWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVE5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUTktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVEtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FRLWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUS11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FRLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUV9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FRX2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUV91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUV8tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdBUThlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUTh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTczMzkiIHk9IjUwODAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJBT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN0FSQk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjg0NCIgaGVpZ2h0PSIxMDY2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSQ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJDZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSQ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJDLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSRE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJEZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSRHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSRC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN0FSQWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0FSQXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzM2MCIgeT0iOTM5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSR2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdBUkhlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5OTciIGhlaWdodD0iMTExNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJJdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSSS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJKT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSSmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJKdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSSi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSS09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN0FSR3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJHLWZYRWR1cUhvT0piVVJaUnciIHg9Ijc3NDciIHk9IjUzODQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJLZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN0FSTGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNjg3NCIgaGVpZ2h0PSIyNTA2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUk11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJNLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUk5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJOZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUk51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJOLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJPT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3QVJLdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUkstZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTc1NyIgeT0iNzg0MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUk9lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3QVJQZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTU3IiBoZWlnaHQ9IjExMTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSUXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSUk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSUnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUlNPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdBUk91ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0FSTy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxODkzMSIgeT0iODUzNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQjh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0I5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3S0I5dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NzA3IiBoZWlnaHQ9IjE1NTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tCOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0ItT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQi1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0ItdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tCLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQl9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tCX2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQl91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tCXy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0FPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdLQ0FlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdLQjgtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQjlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTY4NSIgeT0iMjkyOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0ZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAzMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3S0NHT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxOTMwIiBoZWlnaHQ9IjExMTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tDSGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0h1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tDSC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0lPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tDSWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdLQ0ktZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdLQ0ZlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tDRnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzAyNyIgeT0iMTUzNDIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbGktVWVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHByb3ZpZGUgYSBnZW5lcmFsIG92ZXJ2aWV3IHRvIHRoZSB0YXhvbm9teSBkZWZpbmVkIGluIFByb2Nlc3MgQnJlYWtkb3duIHByZXNlbnRpbmcgdGhlIHR3byBrZXkgYWJzdHJhY3Rpb25zIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGFuZCBCcmVha2Rvd24gRWxlbWVudCB3aXRoIHRoZWlyIG1vc3QgaW1wb3J0YW50IHN1Yi1jbGFzc2VzLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0FSRU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRjMwMjZFIiBzb3VyY2U9Il9HN0FROE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN0FSQU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJGT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0FSRWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3QVJFdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03NjIsIC03NzAsIDM1NTYsIDM1OThdJFstMzc5MywgLTM4MzUsIDUyNCwgNTMzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0FSRi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdBUkdPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0FSU2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEVGIiBzb3VyY2U9Il9HN0FSS2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN0FST2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUlRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY1IiB5PSIzNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN0FSVWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzU4IiB5PSIzMDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3QVJWT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijg3NiIgeT0iLTI0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUldPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN0FSVi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MjkiIHk9Ii0yNjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN0FSV3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItODgiIHk9IjM1NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJYLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3QVJYZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJZLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3QVJZZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSWk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUlotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdBUlplZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUmEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdBUmFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3QVJTdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0FSUy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszNDM3LCAwLCAtNzA3OCwgMF0kWzk3MjgsIDAsIC03ODcsIDBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0FSYk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyODIwMzkyIiBzb3VyY2U9Il9HN0FST2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNjJmOHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJjT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0FSYmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3QVJidWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMTgsIDU1MCwgMTIwMiwgLTMyNTldJFstMTE4LCAyNzY4LCAxMjAyLCAtMTA0MV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdBUmMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3QVJkT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdBUmRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzI5MDFGRCIgc291cmNlPSJfRzdBUk9lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdBUThPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJlLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0FSZWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdBUmR1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0FSZC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils4LCAtNTU4LCA2MTgsIDI2OTJdJFs4LCAtMjQ4OSwgNjE4LCA3NjJdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3QVJmT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0FSZmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3QVJmdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRTkxRjAwNjEiIHNvdXJjZT0iX0c3QVJLZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3QVJHZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSaE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUmd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3QVJmLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdBUmdPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTAsIC0xMjUzLCAwLCAxODk2XSRbNTAsIC0yNTkwLCAwLCA1NThdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3QVJoZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0FSaHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3QVJoLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTIzQjAwMDIiIHNvdXJjZT0iX0c2MmdFdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2MmY4dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSamVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUmktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3QVJpT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0FSaWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5MTQsIC01NTgsIC00MDY0LCAyMzg3XSRbMzIwMCwgLTE5MTMsIC0xNzc4LCAxMDMyXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0FSanVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdBUmotZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0FSa09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzAzIiBzb3VyY2U9Il9HNjJnRXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNjJnQXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJsT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0FSa2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3QVJrdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMTAwLCAtNTUwLCAzNDIwLCAyODUzXSRbLTExMDAsIC0yODE5LCAzNDIwLCA1ODRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0I4T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tCOGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3S0NBdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUNDMTAzMUUiIHNvdXJjZT0iX0c3QVJHZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3S0I4dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDQ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQ0J1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3S0NBLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0tDQk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2OTQsIC01NjcsIC0yMDk5LCAxNjY3XSRbMTgwMywgLTE0NTYsIC05OTAsIDc3OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ0NlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NDdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdLQ0MtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzJCMDFDQSIgc291cmNlPSJfRzdLQjh1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdBUkFPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NFZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tDRC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdLQ0RPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0tDRGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5NTYsIC03ODcsIC0xNzg2LCAxNDQ3XSRbMjA3NCwgLTE3MDEsIC02NjgsIDUzM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ0V1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NFLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdLQ0pPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQjFFQzFCMDM0OSIgc291cmNlPSJfRzdLQ0ZPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzYyZjh1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NLdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tDS09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdLQ0plZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3S0NKdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01NjcsIDAsIDIzNzldJFswLCAtMTkxMywgMCwgMTAzMl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ0stZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NMT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdLQ0xlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzIzMDE5QSIgc291cmNlPSJfRzYyZjh1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdBUktlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ011ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NNLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tDTWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdLQ0x1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3S0NMLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNDk3LCAtMTA0MSwgNjY5NywgMjc2OF0kWy02MTQ2LCAtMjU1NiwgMzA0OCwgMTI1M10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ05PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NOZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdLQ051ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfRzYyZ0F1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdBUktlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ08tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NQT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tDT3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdLQ04tZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0tDT09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTI3LCAtNTkyLCAtNDMxLCAyNzYwXSRbLTEyNywgLTIwOTksIC00MzEsIDEyNTNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NQZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDUHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3S0NQLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDYiIHNvdXJjZT0iX0c2MmdJdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2MmdBdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDUmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQ1EtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3S0NRT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdLQ1FlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTM1LCAtODEyLCAtMTg5NiwgMjg0NF0kWzEzNSwgLTMwNjQsIC0xODk2LCA1OTJdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NSdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDUi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3S0NTT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0UiIHNvdXJjZT0iX0c2MmdRdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3QVJLZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQ1RPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3S0NTZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0tDU3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjYsIC00NzcsIC01MTA2LCA2NDAyXSRbLTI2LCAtMzM2MSwgLTUxMDYsIDM1MThdJFszNTQ2LCAtNTgyMSwgLTE1MzQsIDEwNThdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NULWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDVU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3S0NVZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNjAiIHNvdXJjZT0iX0c2MmdNdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2MmdBdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDVi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQ1ZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3S0NVdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdLQ1UtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjcsIC01NTAsIDE2OTMsIDI4NTNdJFs2NywgLTI4MTksIDE2OTMsIDU4NF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ1dPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NXZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4M0U4QzgwMDU2IiB0eXBlPSJDbGFzcyIgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1d1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3S0NYdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNDAzIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDWWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tDWS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1pPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tDWmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1p1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tDWi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTDRlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdLQ1ctZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tDWE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4NjYxIiB5PSI3MTcxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMNHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdUTDV1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4MjciIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEw1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RMNi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RMN2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RMNy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTDhlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdUTDQtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdUTDVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODg5OCIgeT0iNDQ4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMOHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdUTDl1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMwMTQiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEwtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMLXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VEwtLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VExfZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMX3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VExfLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNQU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNQWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN1RMOC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3VEw5T2ZYRWR1cUhvT0piVVJaUnciIHg9Ijg4MDUiIHk9IjUyNDAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1DLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN1RNRC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzM4NiIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNRWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1FdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VE1GT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNRmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VE1GdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNRi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VE1HT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNR2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNR3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN1RNRE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN1RNRGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3OTUiIHk9IjI5ODgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1KT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN1RNS09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzU4OSIgaGVpZ2h0PSI5OTAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1LdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1MT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTUxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1MdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTUwtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1NT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTU1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1NdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VE1NLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3VE1KZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3VE1KdWZYRWR1cUhvT0piVVJaUnciIHg9Ijg1NjgiIHk9IjI5NjMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbGktVS1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHNob3dzIHRoZSBnZW5lcmFsIGRlZmluaXRpb24gb2YgUHJvY2VzcyBFbGVtZW50LiAgUHJvY2VzcyBFbGVtZW50IGlzIGRlcnJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQgZGVmaW5lIGluIENvcmUgTWV0aG9kIENvbnRlbnQuICBKdXN0IGxpa2UgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gZm9yIG1ldGhvZCBjb250ZW50IFByb2Nlc3MgRWxlbWVudCBjb250YWlucyBhIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBjYW4gY29tcHJvc2Ugb2YgYSBudW1iZXIgb2YgYXR0cmlidXRlcyBjb250YWluaW5nIHRleHR1YWwgZGVzY3JwdGlvbnMgZm9yIHRoZSBQcm9jZXNzIEVsZW1lbnQuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3VE1BdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRTkxRjAwNjEiIHNvdXJjZT0iX0c3S0NXdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3VEw4dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1CLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNQ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdUTUJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3VE1BLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdUTUJPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUwLCAtNDU3LCAwLCAxNDczXSRbLTUwLCAtMTQ4MSwgMCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN1RNQ2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdUTUN1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN1RNRy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwMDU4M0IwMUU2IiBzb3VyY2U9Il9HN1RNQy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN1RMNHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3VE1ILWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN1RNSE9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3VE1IZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MjQsIC03ODIzLCAyMDE1XSRbMCwgLTE0MzksIC03ODIzLCAxMTAwXSRbNjQwMCwgLTIzNDUsIC0xNDIyLCAxOTRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3VE1JdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN1RNSS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3VE1OT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkQiIHNvdXJjZT0iX0c3VE1DLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3VE1KT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1PZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNT3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdUTU9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1PLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1QZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3VE1QT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMyIgeT0iMjYyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1RT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN1RNUC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MDYiIHk9Ii0yODkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNUWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1RLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdUTVF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDAiIHk9IjI4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1ST2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN1RNUmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDkiIHk9Ii0zNDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNU3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN1RNU09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNVHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN1RNVE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1VZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VE1VdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3VE1VT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VE1WdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3VE1WT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN1RNTmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN1RNTnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjkzLCAtMjUsIC02MTgwLCAyNV0kWzYwNzksIC0yNSwgLTE3OTQsIDI1XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdUTVYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzJCMDFDQSIgc291cmNlPSJfRzdUTUpPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdUTDR1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1XdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1YZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN1RNVy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdUTVdPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdUTVdlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUwLCAtNDkxLCAwLCAxOTk4XSRbLTUwLCAtMTk3MiwgMCwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN1RNWHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdUTVgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN1RNWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDQzEwMzFFIiBzb3VyY2U9Il9HN1RMOHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN1RNSk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3VE1aT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN1RNWWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3VE1ZdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzgsIC00NDgsIC00MiwgMTc4Nl0kWzgsIC0xNzUyLCAtNDIsIDQ4Ml0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdUTVotZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3VE1hT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIzNzVFQTEwMjg1IiB0eXBlPSJDbGFzcyIgbmFtZT0iU2VsZWN0ZWRUYXNrU3RlcHMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1MzUxMDAxMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3Yzg1T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzOTc5IiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4NWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjODZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjODYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjODdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3Yzg3LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3Yzg0ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdjODR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzYwOCIgeT0iNTM4OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk3Rjc0MDM5MiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3Yzg5T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzOTc5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4OWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzgtT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOC1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzgtdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOC0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzhfT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOF9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzhfdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3YzhfLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3Yzg4ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdjODh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzUwOSIgeT0iMzY0OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3YzlEZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5RHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlFZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOUV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlFLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOUZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlGZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOUZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlGLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3YzlHT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3YzlDdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdjOUMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjUzNiIgeT0iNzYwOCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUdlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk0QTY2MDM2OCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3YzlIZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5SHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlJZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOUl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlJLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOUpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOUp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlKLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3YzlLT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3YzlHdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdjOUctZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM1NDYiIHk9Ijc1NjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQtdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210X2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN210X3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjg3OCIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdF8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211QU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211QXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVBLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Qk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVCZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211QnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVCLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Q09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211Q2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN210LS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3bXRfT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE0MDUiIHk9IjM5NTMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVFLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211RnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN211Ri1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjcyNiIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211R2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Ry1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVIT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211SGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVIdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211SC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVJT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211SWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211SXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN211Rk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3bXVGZWZYRWR1cUhvT0piVVJaUnciIHg9IjIwMjg4IiB5PSIxMjY4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211SS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdtdUotZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3OTQiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211S3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUstZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211TE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUxlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211THVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUwtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211TU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdU1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdU11ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdtdUpPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN211SmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzk0NCIgeT0iMTM1NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVgtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0QTk3MDEyMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3bXVZLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNDAzIiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Wk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVaLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdWFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVhZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdWF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVhLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdWJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXViZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVidWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3bXVZT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdtdVllZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzc5NyIgeT0iMTM1NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3djMzT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTg5IiBoZWlnaHQ9Ijk5MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3YzNGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3YzNC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3YzNWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2MzUtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzd2MzJlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN3YzMnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTAwIiB5PSIxMzg4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xpLVZlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IkEga2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24gZGVwaWN0ZWQgaW4gdGhlIGRpYWdyYW0uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvIChzZWUgQ29udHJpYnV0aW9uIGluIHBhY2thZ2UgUGx1Z2luIGZvciBkZXRhaWxzKS4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdjOUFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4NDlFMDAwMSIgc291cmNlPSJfRzdjODRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdjODhPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlCdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN2M5Qk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdjOUFlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3YzlBdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MzMsIDAsIDE3MDFdJFswLCAtMTcxOCwgMCwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN2M5Qi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdjOUNPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN2M5S2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDMwMDNGIiBzb3VyY2U9Il9HN2M5Q2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN2M5R2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5THVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUwtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3YzlMZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5TU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdjOU1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210NC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdDR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ0NiIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN210NWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MTMiIHk9IjI5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXQ2T2ZYRWR1cUhvT0piVVJaUnciIHg9IjQyMyIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXQ3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXQ2LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210N3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXQ4ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXQ3LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210OHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdDllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdDgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdC1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdDktZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3YzlLdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN2M5Sy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxODQ1LCAwLCAtMTA3MDEsIDBdJFsxMDY5MywgMCwgLTE4NTQsIDBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN211Q3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzJGIiBzb3VyY2U9Il9HN2M5Q2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN210LXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdURlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211RC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3bXVEdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN211Qy1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdtdURPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUyNCwgMCwgMzA4MV0kWzAsIC0zMDkwLCAwLCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3bXVFZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN211RXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3bXVNLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODMwRTAxNTAiIHNvdXJjZT0iX0c3YzlHZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3bXVJLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211TnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211T2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdtdU4tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3bXVOT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdtdU5lZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUwLCAtNTE2LCAwLCA1NjgxXSRbLTUwLCAtNTY3MiwgMCwgNTI0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN211T3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdtdU8tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN211UE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzNzVFMDQwMzkwIiBzb3VyY2U9Il9HN211RS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN211SS1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211UWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3bXVRT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211US1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzNzVFMDUwMTc1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211UmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211Uk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjMiIHk9Ijk0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzNzVFMDUwMTc1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211U09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdVItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211U3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMiIgeT0iMTM2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdVRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTczMiIgeT0iLTMwMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVVZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVVdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVVT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211VS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVWdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVWT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Vi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdVd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdVdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdVh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdVhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3bXVQZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdtdVB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEzNjMsIC03NiwgNDg4NSwgMjVdJFstNDg1MSwgLTc2LCAxMzk3LCAyNV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3bXVlT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBQzAxQTAiIHNvdXJjZT0iX0c3bXVYLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3bXVJLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211ZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211ZnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdtdWZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVnT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQ3OSIgeT0iLTE3NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVndWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVnLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMzEiIHk9IjM1NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211aHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzkiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211aU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211aXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211aWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjIxIiB5PSIyNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211aS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211amVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211anVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211ak9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211a2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211a3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211a09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djMwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3djMwZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djMxLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3djMxZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN211ZWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3bXVldWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE3MDEsIDI1LCAtNDE0MCwgMjVdJFs0NDQ1LCAyNSwgLTEzOTcsIDI1XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzd2MzZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzRBMDMwNiIgc291cmNlPSJfRzdtdC11ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzd2MzJPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djM2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djM3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN3YzN09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzd2MzZlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN3YzNnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTE2LCAtNTAsIDIwNzRdJFswLCAtMjEwOCwgLTUwLCA0ODJdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3djM3LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN3YzOE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3djM4ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkQiIHNvdXJjZT0iX0c3bXVYLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3djMyT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djM5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzOS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzd2MzllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3djMtZWZYRWR1cUhvT0piVVJaUnciIHg9IjE1MiIgeT0iMTUyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2My0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djNfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN3YzX09mWEVkdXFIb09KYlVSWlJ3IiB4PSI3ODciIHk9Ii0yMTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzd2M18tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE5OSIgeT0iMjQwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3djRBdWZYRWR1cUhvT0piVVJaUnciIHg9IjE0MyIgeT0iMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NEItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzd2NEJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NEMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzd2NENlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0RHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0RC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN3Y0RGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0RS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN3Y0RWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzd2Mzh1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3djM4LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNzEwLCAwLCA0ODkzLCAwXSRbLTQ4MDksIDAsIDE3OTQsIDBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkQzMTJGMjAzNTgiIHR5cGU9IkNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRGT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0Ri1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN3Y0R09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjA2NSIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0R2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NEhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRIdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NEgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NEllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRJdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djRJLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3djRGZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzd2NEZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTAyNSIgeT0iNDg4NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEpPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3djRLT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzI2IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0Sy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NExPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0TGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0TC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NE1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0TWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NE11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NE0tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzd2NEplZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN3Y0SnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1Mzk3IiB5PSI3Mzk5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0UGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NFFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzd2NFFlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQwMTMiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NFF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0US1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0UmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djRSdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3NW8wZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvMHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3NW8wLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvMU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNzVvMWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN3Y0UHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3djRQLWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMDM1IiB5PSI3MzQ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvMXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzc1bzJ1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI2NzUiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW8zZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3NW8zLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvNE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3NW80ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvNHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3NW80LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvNU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNzVvNWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNzVvMS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3NW8yT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijg3MjAiIHk9IjczNzQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3l5ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5ek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOEN5emVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzQwMyIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5enVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3l6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3kwZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhDeTB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3kwLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhDeTFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3kxZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhDeTF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3kxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4Q3kyT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4Q3l5dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhDeXktZlhFZHVxSG9PSmJVUlpSdyIgeD0iODM1NiIgeT0iMTQ4MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4Q3k1dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTc0IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5NmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOEN5Ni1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOEN5N2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOEN5Ny1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeThPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhDeThlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhDeTQtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOEN5NU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI2MTIxIiB5PSI0NTgwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhNajFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQyNjciIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWoxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qMk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4TWoyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qMnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4TWoyLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qM09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4TWozZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOE1qMy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOE1qMGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4TWowdWZYRWR1cUhvT0piVVJaUnciIHg9IjE0NzMiIHk9IjI0NDYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbGktVi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3djROT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMDMiIHNvdXJjZT0iX0c3djRKT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3djRGT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0Ti1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0T3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzd2NE9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3djROZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN3Y0TnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils0OTEsIC00NTcsIC0yMzAyLCAyMDMyXSRbMjI2MCwgLTIwNDAsIC01MzMsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzd2NE8tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3djRQT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzc1bzV1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2MCIgc291cmNlPSJfRzc1bzF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzd2NEZPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW82ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW83T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNzVvNnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzc1bzUtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3NW82T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NTcsIDAsIDIwMzJdJFswLCAtMjA0MCwgMCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNzVvN2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzc1bzd1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOEN5d09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q2IiBzb3VyY2U9Il9HN3Y0UGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN3Y0Rk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeXctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5eGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeXh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4Q3l4T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOEN5d2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhDeXd1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTYyNiwgLTQ1NywgMjgyNywgMjAzMl0kWy0yODE5LCAtMjA0MCwgNjM1LCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4Q3l4LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOEN5eU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4Q3kyZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0c3djRGT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4Q3l5ZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5M09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3kzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5My1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhDeTNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4Q3kydWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOEN5Mi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDU3LCAwLCAyOTQ2XSRbMCwgLTI5NTQsIDAsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhDeTRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4Q3k0ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhDeTh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBFRiIgc291cmNlPSJfRzhDeXllZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhDeTR1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3ktT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4Q3k5dWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NzciIHk9IjcwMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3ktZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3ktLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4Q3ktdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNTMiIHk9Ii0xNjkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5X09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3lfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOEN5X2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeV8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN6QWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4Q3pBT2ZYRWR1cUhvT0piVVJaUnciIHg9IjMxNiIgeT0iMzA2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDekF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3pCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4Q3pBLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOE1qdy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOE1qd2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNanhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOE1qeC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOE1qeGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNanlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWp5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4TWp5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4TWp5ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4TWp6LWZYRWR1cUhvT0piVVJaUnciIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhNanplZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDc3IiB5PSItMTI0MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4Q3k4LWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhDeTlPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTExNjQsIDMxNywgMTk4NCwgLTI3NzhdJFstMTE2NCwgMzE3NSwgMTk4NCwgODBdJFstMjIyMiwgMzE3NSwgOTI2LCA4MF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4TWo0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI4MjAzOTIiIHNvdXJjZT0iX0c4Q3k0dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4TWowT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWo1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qNXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhNajVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4TWo0ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOE1qNHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzAyLCAtNDU3LCAyNTk5LCAxNjc2XSRbLTI2MTYsIC0xNjg0LCA2ODUsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhNajUtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4TWo2T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhNajZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjNCMDAwMiIgc291cmNlPSJfRzd2NEpPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhNajBPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWo3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWo3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOE1qN2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhNajZ1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4TWo2LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zNDcsIC00NTcsIDMzMTAsIDQ0NzBdJFstMzMyNywgLTQ0NzgsIDMzMCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOE1qOE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhNajhlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOE1qOHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjMwMTlBIiBzb3VyY2U9Il9HOE1qME9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOEN5eWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNai1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4TWo5dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOE1qOC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhNajlPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjEzMywgLTMzMCwgLTQzMTgsIDYzNV0kWzQ3NDEsIC03MjgsIC0xNzEwLCAyMzddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4TWotZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOE1qLXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaGhaOU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDg1NDYwMEQ4Ij4KLSAgICAgICAgICAgIDxib2R5PjAxPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfRHhMR3dPeE1FZHVPTnJNUmdtejQ4QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxREU0NzhFMDAwRCIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIiBuYW1lPSJBY3Rpdml0eSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dockstdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiPgotICAgICAgICAgICAgICA8Ym9keT5BbiBBY3Rpdml0eSBpcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uCi1BY3Rpdml0eSByZXByZXNlbnRzIGEgZ3JvdXBpbmcgZWxlbWVudCBmb3Igb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4gIEl0IGlzIG5vdCBwZXItc2UgYSAnaGlnaC1sZXZlbCcgZ3JvdXBpbmcgb2Ygb25seSB3b3JrIGFzIGluIG90aGVyIG1ldGEtbW9kZWxzLCBidXQgZ3JvdXBzIGFueSBraW5kIG9mIEJyZWFrZG93biBFbGVtZW50cy4gIEZvciBleGFtcGxlLCBvbmUgY2FuIGRlZmluZSB2YWxpZCBBY3Rpdml0aWVzIHRoYXQgZ3JvdXAgb25seSBXb3JrIFByb2R1Y3RzIERlc2NyaXB0b3JzIHdpdGhvdXQgYW55IG1hdGNoaW5nIFRhc2sgRGVzY3JpcHRvcnMuICBBY3Rpdml0aWVzIGFsc28gaW5oZXJpdCBhbGwgcHJvcGVydGllcyBmcm9tIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIGluZGlyZWN0bHkgZnJvbSBQcm9jZXNzIEVsZW1lbnQ7IGkuZS4gQWN0aXZpdHkgaXMgcmVhZHkgdG8gaGF2ZSBhIGZ1bGwgY29udGVudCBkZXNjcmlwdGlvbiBhdHRhY2hlZCB0byBpdC4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5MjgyMDM5MiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyIvPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyOENEMzI5MDFGRCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSIgbmFtZT0iYnJlYWtkb3duRWxlbWVudHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRUYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbVNsUC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbVNsUHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDMxIiBuYW1lPSJNaWxlc3RvbmUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaDBVNU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDMxIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBNaWxlc3RvbmUgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyQjFFQzFCMDM0OSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NCIiBuYW1lPSJJdGVyYXRpb24iPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaDBVNk9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NCIj4KLSAgICAgICAgICAgICAgPGJvZHk+SXRlcmF0aW9uIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi1JdGVyYXRpb24gZ3JvdXBzIGEgc2V0IG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSXQgcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluIHJlcGV0aXRpdmUgY3ljbGVzLiAgVGhlIGNvbmNlcHQgb2YgSXRlcmF0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHJ1bGVzIGluIGRpZmZlcmVudCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIG1ldGhvZCBmcmFtZXdvcmsgKFJVUCkgZGVmaW5lcyBhIHJ1bGUgdGhhdCBJdGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzcGFuIGFjcm9zcyBQaGFzZXMuICBJbiBjb250cmFzdCBJQk0gR2xvYmFsIFNlcnZpY2VzIE1ldGhvZCAoR1NNZXRob2QpIGJhc2VkIG1ldGhvZCBmcmFtZXdvcmtzIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBhbmQgSXRlcmF0aW9uIGNhbiBiZSBkZWZpbmVkIHdoaWNoIG5lc3QgUGhhc2VzLiAgUnVsZXMgbGlrZSB0aGVzZSwgd2hpY2ggcGxheSBhbiBpbXBvcnRhbnQgcm9sZSBmb3IgZWFjaCBpbmRpdmlkdWFsIG1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgZW5mb3JjZWQgYnkgdGhpcyBtZXRhLW1vZGVsLiAgSW5zdGVhZCwgcHJvY2VzcyBhdXRob3JzIGFyZSBleHBlY3RlZCB0byBmb2xsb3cgYW5kIGNoZWNrIHRoZXNlIHJ1bGVzIG1hbnVhbGx5LiAgKE5vdGU6IEFueSBCcmVha2Rvd24gRWxlbWVudCBjYW4gYmUgcmVwZWF0ZWQ7IGhvd2V2ZXIsIEl0ZXJhdGlvbnMgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhIHNwZWNpYWwgbWV0YS1tb2RlbCBjb25jZXB0LCBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbnQgcm9sZSBmb3IgbWFueSBtZXRob2RzLikKLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDJBMCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NBIiBuYW1lPSJQaGFzZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0doLUY0LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0EiPgotICAgICAgICAgICAgICA8Ym9keT5QaGFzZSBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotUGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyOUYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA2MyIgbmFtZT0iVGVhbVByb2ZpbGUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaC1GNS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDYzIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBUZWFtIFByb2ZpbGUgaXMgYSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLgotV29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLgotSGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIiBuYW1lPSJ0ZWFtUm9sZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0YiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HajVfa3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HajVfa2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyIgbmFtZT0ic3VwZXJUZWFtIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNjMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUyIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tEd2stZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tEd2t1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1IiBuYW1lPSJzdWJUZWFtIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNjMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUyIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tEd2x1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tEd2xlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDgwMDU3MDI3NiIgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpSDI0LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA4MDA1NzAyNzYiPgotICAgICAgICAgICAgICA8Ym9keT5Xb3JrIE9yZGVyIHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnQgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50IChyZWZlcnJlZCB0byBhcyAoQikgYmVsb3cpIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50IChyZWZlcnJlZCB0byBhcyAoQSkgYmVsb3cpIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF2YWlsYWJsZSBpbiBVTUEgYW5kIGlzIHVzZWQgdG8gcHJvdmlkZSB2YWx1ZXMgZm9yIFdvcmsgT3JkZXIncyBsaW5rVHlwZSBhdHRyaWJ1dGUuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDgxOUVEMDFFRCIgbmFtZT0iZmluaXNoVG9TdGFydCI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2lIMjV1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgxOUVEMDFFRCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+QnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBzdGFydCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgZmluaXNoZXMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0d28gQnJlYWtkb3duIEVsZW1lbnRzLCAmcXVvdDtDb25zdHJ1Y3QgZmVuY2UmcXVvdDsgYW5kICZxdW90O1BhaW50IGZlbmNlLCZxdW90OyAmcXVvdDtQYWludCBmZW5jZSZxdW90OyBjYW4ndCBzdGFydCB1bnRpbCAmcXVvdDtDb25zdHJ1Y3QgZmVuY2UmcXVvdDsgZmluaXNoZXMuIFRoaXMgaXMgdGhlIG1vc3QgY29tbW9uIHR5cGUgb2YgZGVwZW5kZW5jeSBhbmQgdGhlIGRlZmF1bHQgZm9yIGEgbmV3IFdvcmsgT3JkZXIgaW5zdGFuY2UuCi08L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDgxQzcyMDNDNyIgbmFtZT0iZmluaXNoVG9GaW5pc2giPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpUkEwZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA4MUM3MjAzQzciPgotICAgICAgICAgICAgICAgIDxib2R5PkJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3QgZmluaXNoIHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBmaW5pc2hlcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBCcmVha2Rvd24gRWxlbWVudHMsICZxdW90O0FkZCB3aXJpbmcmcXVvdDsgYW5kICZxdW90O0luc3BlY3QgZWxlY3RyaWNhbCwmcXVvdDsgJnF1b3Q7SW5zcGVjdCBlbGVjdHJpY2FsJnF1b3Q7IGNhbid0IGZpbmlzaCB1bnRpbCAmcXVvdDtBZGQgd2lyaW5nJnF1b3Q7IGZpbmlzaGVzLgotPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA4MUJFODAyOTYiIG5hbWU9InN0YXJ0VG9TdGFydCI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2lSQTFPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgxQkU4MDI5NiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+QnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBzdGFydCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgc3RhcnRzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIEJyZWFrZG93biBFbGVtZW50cywgJnF1b3Q7UG91ciBmb3VuZGF0aW9uJnF1b3Q7IGFuZCAmcXVvdDtMZXZlbCBjb25jcmV0ZSwmcXVvdDsgJnF1b3Q7TGV2ZWwgY29uY3JldGUmcXVvdDsgY2FuJ3QgYmVnaW4gdW50aWwgJnF1b3Q7UG91ciBmb3VuZGF0aW9uJnF1b3Q7IGJlZ2lucy4KLTwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwODFDNTEwMTNDIiBuYW1lPSJzdGFydFRvRmluaXNoIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaVJBMS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwODFDNTEwMTNDIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5CcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IGZpbmlzaCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgc3RhcnRzLiBUaGlzIGRlcGVuZGVuY3kgdHlwZSBjYW4gYmUgdXNlZCBmb3IganVzdC1pbi10aW1lIHNjaGVkdWxpbmcgdXAgdG8gYSBtaWxlc3RvbmUgb3IgdGhlIHByb2plY3QgZmluaXNoIGRhdGUgdG8gbWluaW1pemUgdGhlIHJpc2sgb2YgYSBCcmVha2Rvd24gRWxlbWVudCBmaW5pc2hpbmcgbGF0ZSBpZiBpdHMgZGVwZW5kZW50IEJyZWFrZG93biBFbGVtZW50cyBzbGlwLiBJZiBhIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnQgbmVlZHMgdG8gZmluaXNoIGJlZm9yZSB0aGUgbWlsZXN0b25lIG9yIHByb2plY3QgZmluaXNoIGRhdGUsIGJ1dCBpdCBkb2Vzbid0IG1hdHRlciBleGFjdGx5IHdoZW4gYW5kIHlvdSBkb24ndCB3YW50IGEgbGF0ZSBmaW5pc2ggdG8gYWZmZWN0IHRoZSBqdXN0LWluLXRpbWUgQnJlYWtkb3duIEVsZW1lbnQsIHlvdSBjYW4gY3JlYXRlIGFuIFNGIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgQnJlYWtkb3duIEVsZW1lbnQgeW91IHdhbnQgc2NoZWR1bGVkIGp1c3QgaW4gdGltZSAodGhlIHByZWRlY2Vzc29yKSBhbmQgaXRzIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnQgKHRoZSBzdWNjZXNzb3IpLiBUaGVuIGlmIHlvdSB1cGRhdGUgcHJvZ3Jlc3Mgb24gdGhlIHN1Y2Nlc3NvciBCcmVha2Rvd24gRWxlbWVudCwgaXQgd29uJ3QgYWZmZWN0IHRoZSBzY2hlZHVsZWQgZGF0ZXMgb2YgdGhlIHByZWRlY2Vzc29yIEJyZWFrZG93biBFbGVtZW50LjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDgxODc5MDI4OCIgbmFtZT0iV29ya09yZGVyIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2lheDB1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgxODc5MDI4OCI+Ci0gICAgICAgICAgICAgIDxib2R5PldvcmsgT3JkZXIgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnRzIGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudHMgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gIAotKE5vdGUsIFdvcmsgT3JkZXIgaXMgbm90IG1vZGVsZWQgYXMgYW4gQXNzb2NpYXRpb24gQ2xhc3MgdG8gcHJvdmlkZSBhIHN0cmFpZ2h0Zm9yd2FyZCBtYXBwaW5nICB0byBYTUkgYW5kIEVNRi4pCi1UaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4M0VENkQwMDg4IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwODE4RUUwMDlGIiBuYW1lPSJsaW5rVHlwZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDEwODAwNTcwMjc2Ij4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaWF4MXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwODE4RUUwMDlGIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR2lheDJPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+ZmluaXNoVG9TdGFydDwvYm9keT4KLSAgICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMSIgbmFtZT0icHJlZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drOUljLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drOUljdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUE0RTYwMkMxIiBuYW1lPSJQbGFubmluZ0RhdGEiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaWF4MnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RTYwMkMxIj4KLSAgICAgICAgICAgICAgPGJvZHk+UGxhbm5pbmcgRGF0YSBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLgotUGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LgotKE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCkKLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODNFRUY5MDBFMiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyODNFOEExMDM0MSIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBNThEMDBEOSIgbmFtZT0ic3RhcnREYXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEY0NDk4RDAxODUiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpa2kwLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTU4RDAwRDkiPgotICAgICAgICAgICAgICAgIDxib2R5PlRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUE1OUEwMTI5IiBuYW1lPSJmaW5pc2hEYXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEY0NDk4RDAxODUiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpa2kxdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTU5QTAxMjkiPgotICAgICAgICAgICAgICAgIDxib2R5PlRoZSBkZWZhdWx0IGZpbmlzaCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBNzVDMDNEQiIgbmFtZT0icmFuayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQTQwMDdCIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaWtpMmVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE3NUMwM0RCIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2l0c3d1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+Ci0gICAgICAgICAgICAgIDxib2R5PkJyZWFrZG93biBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVDMzk4MDAzMjQiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTY1ODAxNTciLz4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgzRTkxRjAwNjEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MjgzRThBMTAzNDEiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQjYiIG5hbWU9InByZWZpeCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaXRzeC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0I2Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5QcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAmcXVvdDtTUkEuRXN0YWJsaXNoIFJlcXVpcmVtZW50cyZxdW90OyB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAmcXVvdDtTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMmcXVvdDsgbW9kdWxlLiAgQW5vdGhlciBjb21tb24gYXBwbGljYXRpb24gZm9yIHByZWZpeCBpcyB0byBxdWFsaWZ5IHJvbGVzIGluIFJvbGUgRGVzY3JpcHRvcnMuICBGb3IgZXhhbXBsZSwgJnF1b3Q7Q3VzdG9tZXIuQXJjaGl0ZWN0JnF1b3Q7IHdvdWxkIGRlZmluZSBhICZxdW90O0N1c3RvbWVyJnF1b3Q7IHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAmcXVvdDtBcmNoaXRlY3QmcXVvdDsgZXhwcmVzc2luZyB0aGF0IHRoaXMgaXMgYW4gYXJjaGl0ZWN0IG9uIHRoZSBjdXN0b21lciBzaWRlIGFuZCBub3QgdGhlIGRldmVsb3BtZW50IHRlYW0gc2lkZS4KLTwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3FXZTkwZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3FXZTkwT3lIRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3JIRUdNT3lIRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0NBIiBuYW1lPSJpc1BsYW5uZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpM2R3dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQ0EiPgotICAgICAgICAgICAgICAgIDxib2R5PkEga2V5IGFwcGxpY2F0aW9uIGZvciBEZXZlbG9wbWVudCBQcm9jZXNzZXMgZXhwcmVzc2VkIHdpdGggQnJlYWtkb3duIHN0cnVjdHVyZXMgaXMgdG8gZ2VuZXJhdGUgYSBwcm9qZWN0IHBsYW4gZnJvbSBpdC4gIEEgcHJvY2VzcyBhcyBkZWZpbmVkIGluIFVNQSAoY2YuIHdpdGggU2VjdGlvbnMgWFggYW5kIDUuMikgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBzdHJ1Y3R1cmUgZGVmaW5pbmcgd2hhdCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCBhdCB3aGF0IHRpbWUgYnkgd2hpY2ggcm9sZXMgdXNpbmcgd2hpY2ggaW5wdXQgYW5kIHByb2R1Y2luZyB3aGF0IG91dHB1dHMuICBBIHByb2plY3QgcGxhbiBhcyBpdCBpcyByZXByZXNlbnRlZCBpbiBwcm9qZWN0IHBsYW5uaW5nIHRvb2xzIHN1Y2ggYXMgSUJNIFJhdGlvbmFsIFBvcnRmb2xpbyBNYW5hZ2VyIG9yIE1pY3Jvc29mdCBQcm9qZWN0IG5vcm1hbGx5IGRvZXMgbm90IG5lZWQgYWxsIHRoaXMgaW5mb3JtYXRpb24gYW5kIGlzIG5vcm1hbGx5IGxpbWl0ZWQgdG8ganVzdCByZXByZXNlbnRpbmcgYSBzdWJzZXQuICBGb3IgZXhhbXBsZSwgYSB0eXBpY2FsIE1TIFByb2plY3QgcGxhbiBvbmx5IHJlcHJlc2VudHMgdGhlIHdvcmsgYnJlYWtkb3duIGNvbnNpc3Rpbmcgb2YgVGFza3MgYW5kIEFjdGl2aXRpZXMgKHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBzdW1tYXJ5IHRhc2tzKS4gIEl0IGRvZXMgbm90IHNob3cgdGhlIGlucHV0IGFuZCBvdXRwdXQgV29yayBQcm9kdWN0cyBmb3IgYSBUYXNrLCBidXQgaXQgY2FuIHNob3cgd2hpY2ggcm9sZXMgc2hhbGwgYmUgc3RhZmZlZCBmb3IgcGVyZm9ybWluZyB0aGUgVGFzay4gIEhvd2V2ZXIsIHN1Y2ggcm9sZSBhbGxvY2F0aW9uIG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCBjb25jcmV0ZSByZXNvdXJjZXMgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBTb21ldGltZXMgcHJvamVjdCBwbGFucyBjYW4gdGhlbiBhZ2FpbiBiZSBvcmdhbml6ZWQgZGlmZmVyZW50bHkgYnkgb3JnYW5pemluZyB3b3JrIGJ5IGRlbGl2ZXJhYmxlcyBpbiB3aGljaCBXb3JrIFByb2R1Y3RzIGFyZSBtYXBwZWQgdG8gdGhlIHBsYW4ncyBzdW1tYXJ5IHRhc2tzIGFuZCBUYXNrIHRoYXQgaGF2ZSB0aGVzZSB3b3JrIHByb2R1Y3RzIGFzIG91dHB1dCBtYXBwZWQgYmVsb3cgc3VjaCBhcyBzdW1tYXJ5IHRhc2suICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBjYW4gbWFrZSByZWNvbW1lbmRhdGlvbnMgYWJvdXQgd2hpY2ggZWxlbWVudHMgdG8gaW5jbHVkZSBhbmQgd2hpY2ggdG8gZXhjbHVkZSB3aGVuIGdlbmVyYXRpbmcgYSBwbGFuLiAgV2hlbiB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSBpcyBzZXQgdG8gRmFsc2UgZm9yIGFuIGluc3RhbmNlIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQsIHRoZW4gdGhpcyBlbGVtZW50IHNoYWxsIG5vdCBiZSBub3QgaW5jbHVkZWQgd2hlbiBhIGNvbmNyZXRlIHByb2plY3QgcGxhbiBpcyBiZWluZyBnZW5lcmF0ZWQgZnJvbSB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoaXMgZWxlbWVudC4KLQotCi08L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR2kzZHhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgICAgIDxib2R5PnRydWU8L2JvZHk+Ci0gICAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzRDQiIG5hbWU9Imhhc011bHRpcGxlT2NjdXJyZW5jZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpM2R4LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzRDQiPgotICAgICAgICAgICAgICAgIDxib2R5Pkp1c3QgYXMgdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgdGhlIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBhbiBpbXBhY3Qgb24gZ2VuZXJhdGluZyBwbGFucyBmcm9tIGEgUHJvY2Vzcy4gIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhlbiBpdCB3aWxsIHR5cGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gdGhlIHNhbWUgQWN0aXZpdHkuICBGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV0YWlsIFVzZSBDYXNlJnF1b3Q7IHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLgotPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0dpM2R5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4KLSAgICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDA2QTZCMDFGQiIgbmFtZT0iaXNPcHRpb25hbCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2kzZHktZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDA2QTZCMDFGQiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+VGhlIGlzT3B0aW9uYWwgYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBCcmVha2Rvd24gRWxlbWVudCBkZXNjcmliZXMgd29yaywgYSB3b3JrIHJlc3VsdCwgb3IgZXZlbiB3b3JrIHJlc291cmNlcywgd2hpY2ggaW5jbHVzaW9uIGlzIG5vdCBtYW5kYXRvcnkgd2hlbiBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGlzIHBsYW5uZWQgYmFzZWQgb24gYSBwcm9jZXNzIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9HaTNkemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+Ci0gICAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiIG5hbWU9InByZXNlbnRlZEFmdGVyIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tEd25PZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tEd20tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQiIG5hbWU9InByZXNlbnRlZEJlZm9yZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMUU4RjBDMDI4MSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drelhnLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drelhndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUE0RjkwMDY5IiBuYW1lPSJwbGFubmluZ0RhdGEiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxMTlBNEU2MDJDMSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTE5QTRGODAyMEEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbUpiUS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbUpiUXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCIgbmFtZT0ic3VwZXJBY3Rpdml0aWVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEVGIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21TbFBPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21TbE8tZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiIG5hbWU9IkRlc2NyaXB0b3IiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HakFuc2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBEZXNjcmlwdG9yIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlZmVyZW5jZXMgb25lIGNvbmNyZXRlIENvbnRlbnQgRWxlbWVudC4gIEEgZGVzY3JpcHRvciBwcm92aWRlcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHdpdGhpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uIHRvIGp1c3QgcmVmZXJlbmNpbmcgQ29udGVudCBFbGVtZW50cyBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgQ29udGVudCBFbGVtZW50cyBzdHJ1Y3R1cmFsIHJlbGF0aW9uc2hpcHMgYnkgZGVmaW5pbmcgaXRzIG93biBzZXRzIG9mIGFzc29jaWF0aW9ucy4KLURlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiAKLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODE0MkJCMDNCNSIgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0dqQW50ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5PgotICAgICAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiIG5hbWU9IlJvbGVEZXNjcmlwdG9yIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pBbnQtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUm9sZSBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBSb2xlIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBSb2xlIERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNjAiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiIG5hbWU9InJvbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha002ai1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha002anVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCIgbmFtZT0ibW9kaWZpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5QyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drZ2NqT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drZ2NpLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drelhjLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drelhjdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIG5hbWU9IlRhc2tEZXNjcmlwdG9yIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pBbnUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgVGFzayBEZXNjcmlwdG9yIGlzIGEgRGVzY3JpcHRvciBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwcm94eSBmb3IgYSBUYXNrIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBUYXNrIERlc2NyaXB0b3JzIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gVGhlcmVmb3JlIG9uZSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotQSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uCi0KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiIvPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5MjNCMDAwMiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCIgbmFtZT0idGFzayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drRHdxT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drRHdwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drTTZsZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drTTZsT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQwIiBuYW1lPSJhc3Npc3RlZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzNGIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tXcmctZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tXcmd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUMiIG5hbWU9ImV4dGVybmFsSW5wdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha1dyak9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha1dyaS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI4MSIgbmFtZT0ibWFuZGF0b3J5SW5wdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTZENzVBQTAwNEIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha2djZy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha2djZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQyIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyOSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drZ2NtT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drZ2NsLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4IiBuYW1lPSJvdXRwdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyM0QiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3BtZHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha3BtZGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NCIgbmFtZT0icGVyZm9ybWVkUHJpbWFyaWx5QnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTMiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3BtaGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha3BtaE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3MyIgbmFtZT0ic2VsZWN0ZWRTdGVwcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMzc1RTA0MDM5MCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dvT2U0LWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dvT2U0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvciI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqQW53T2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPgotICAgICAgICAgICAgICA8Ym9keT5BIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTJBNUY4NjAyRjYiIG5hbWU9ImFjdGl2aXR5RW50cnlTdGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaktZcy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEyQTVGODYwMkY2Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5HaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uCi08L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9LYzFad095SkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9LY3Jvd095SkVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9LVllHNE95SkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxM0VDMDE4MDM0MCIgbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pLWXR1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxM0VDMDE4MDM0MCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uCi08L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9ZdHNYb2V5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9ZdHNYb095R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9ZaEIwb095R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSIgbmFtZT0id29ya1Byb2R1Y3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDciPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha002aHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha002aGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSIgbmFtZT0iaW1wYWN0ZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drV3JsZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drV3JsT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIiBuYW1lPSJpbXBhY3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tXcm1PZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tXcmwtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiIG5hbWU9ImRlbGl2ZXJhYmxlUGFydHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEMiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3BtZi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha3BtZnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGMDZCNjUwMEU2IiBuYW1lPSJDb21wb3NpdGVSb2xlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pLWXVlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QjY1MDBFNiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgQ29tcG9zaXRlIFJvbGUgaXMgYSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuCi1BIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRjk0QUI5MDAxNSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiIgbmFtZT0iYWdncmVnYXRlZFJvbGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFGMDZCQkMwMzBEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2t6WGV1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2t6WGVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyIgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HalVKcy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGlzIGEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHByb3ZpZGVzIHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlcHJlc2VudCBvciByZWZlciB0byBXb3JrIERlZmluaXRpb25zLiAgRm9yIGV4YW1wbGUgaXRzIHN1YmNsYXNzIEFjdGl2aXR5IGRlZmluZXMgd29yayBhcyBpdCBpcyBhbHNvIGEgc3ViY2xhc3Mgb2YgV29yayBEZWZpbml0aW9uLiAgSXRzIHN1YmNsYXNzIFRhc2sgRGVzY3JpcHRvciBkb2VzIG5vdCBkZWZpbmUgd29yayBieSBpdHNlbGYsIGJ1dCByZWZlcnMgdG8gYSBXb3JrIERlZmluaXRpb24gYW5kIHRoZXJlZm9yZSBjYW4gaGF2ZSB0aGUgc2FtZSBjb21tb24gcHJvcGVydGllcyBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCBoYXMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4Q0QzMjMwMTlBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0MwIiBuYW1lPSJpc1JlcGVhdGFibGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqZFRvLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQzAiPgotICAgICAgICAgICAgICAgIDxib2R5PlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9HamRUcGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+Ci0gICAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzRDUiIG5hbWU9ImlzT25nb2luZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pkVHAtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNENSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+SWYgdGhlIGlzT25nb2luZyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gaW5zdGFuY2UsIHRoZW4gdGhlIGVsZW1lbnQgZGVzY3JpYmVzIGFuIG9uZ29pbmcgcGllY2Ugb2Ygd29yayB3aXRob3V0IGEgZml4ZWQgZHVyYXRpb24gb3IgZW5kIHN0YXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayBvZiBhbiBhZG1pbmlzdHJhdG9yIGNvbnRpbnVvdXNseSAoZS5nLiAzaCBhIGRheSkgd29ya2luZyB0byBlbnN1cmUgdGhhdCBzeXN0ZW1zIGFyZSBrZXB0IGluIGEgY2VydGFpbiBzdGF0ZS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBwcm9ncmFtIG1hbmFnZW1lbnQgd29yayBvdmVyc2VlaW5nIG1hbnkgZGlmZmVyZW50IHByb2plY3RzIGJlaW5nIHNjaGVkdWxlZCBmb3Igb25lIHBhcnRpY3VsYXIgcHJvamVjdCBhdCBzcGVjaWZpYyByZW9jY3VycmluZyBpbnRlcnZhbHMgZHVyaW5nIHRoZSB3aG9sZSBsaWZlY3ljbGUgb2YgdGhlIHByb2plY3QuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0dqZFRxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4KLSAgICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNERSIgbmFtZT0iaXNFdmVudERyaXZlbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pkVHEtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNERSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+VGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLgotCi0KLTwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9HamRUcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+Ci0gICAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0YiIG5hbWU9ImxpbmtUb1ByZWRlY2Vzc29yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTA4MTg3OTAyODgiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2s5SWYtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2s5SWZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODNFOEExMDM0MSIgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HamRUci1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIj4KLSAgICAgICAgICAgICAgPGJvZHk+UHJvY2VzcyBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuCi1Qcm9jZXNzIEVsZW1lbnRzIHJlcHJlc2VudHMgUHJvY2VzcyBzcGVjaWZpYyBlbGVtZW50cyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQgZnJvbSBDb250ZW50IEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4gCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUNDMTAzMUUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ham5Fby1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNGIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhZ2dyZWdhdGlvbiBhc3NvY2lhdGlvbiBzcGVjaWZpZXMgdGhlIHJvbGVzIG9mIHRlYW0gbWVtYmVycyB3aXRoIFJvbGUgRGVzY3JpcHRvcnMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIiBuYW1lPSJfdGVhbVByb2ZpbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA2MyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dqbkVwLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dqbkVwdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2o1X2xPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MiI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVsYXRlcyBhIFN1Yi1UZWFtIHRvIGl0cyBTdXBlci1UZWFtLCBpLmUuIHRoZSBUZWFtIHRoYXQgaXQgaXMgcGFydCBvZi48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2IF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjgiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha0R3bU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI1Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QnJlYWtkb3duIHN0cnVjdHVyZXMgYXJlIG5lc3RlZCBzdHJ1Y3R1cmVzIChzZWUgc3VwZXJBY3Rpdml0aWVzIGFzc29jaWF0aW9uKSBwcmVzZW50ZWQgbm9ybWFsbHkgYXMgaW5kZW50ZWQgbGlzdHMuICBXaXRoaW4gdGhpcyBuZXN0aW5nIGNoaWxkcmVuIG9uIHRoZSBzYW1lIGxldmVsIGFyZSBub3Qgc3BlY2lmaWNhbGx5IG9yZGVyZWQuICBIb3dldmVyLCBhIHVzZXIgb2YgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzIHdvdWxkIGV4cGVjdCB0byBvcmRlciBlbGVtZW50cyB3aXRoaW4gYSBsaXN0LiAgVGhpcyBhc3NvY2lhdGlvbiBpcyB1c2VkIHRvIHN0b3JlIHRoZSBwcmVzZW50YXRpb24gc2VxdWVuY2UgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGUgYXNzb2NpYXRpb24gcHJlc2VudGVkQWZ0ZXIgaXMgcmVkdW5kYW50IHRvIHRoZSBhc3NvY2lhdGlvbiBwcmVzZW50ZWRCZWZvcmUuICBUaGlzIHJlZHVuZGFuY3kgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBQcm9jZXNzIENvbnRyaWJ1dGlvbnMgKHNlZSBwbHVnaW5zKS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjgiIG5hbWU9Il9icmVha2Rvd25FbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha0R3bi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha0R3bnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBEIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUgXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drRHdvZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEQiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZSBkZXNjcmlwdG9yIHRvIHRoZSBjb3JlIGNvbnRlbnQgZWxlbWVudCBpdCByZWZlcnMgdG8uICBFdmVyeSBUYXNrIERlc2NyaXB0b3IgY2FuIHJlZmVyZW5jZSBvbmx5IG9uIFRhc2suICBIb3dldmVyLCBhIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycy4gIEluIHRoZSBVTUEgUHJvZmlsZSB0aGlzIGFzc29jaWF0aW9uIGlzIGluc3RhbnRpYXRlZCBieSBhIGRlcGVuZGVuY3kgcmVsYXRpb25zaGlwIHdpdGggYSB0cmFjZSBzdGVyZW90eXBlLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSIgbmFtZT0idGFza0Rlc2NyaXB0b3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEQiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha0R3cGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha0R3cE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q3IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDggXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drRHdxdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDciPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZSBkZXNjcmlwdG9yIHRvIHRoZSBjb3JlIGNvbnRlbnQgZWxlbWVudCBpdCByZWZlcnMgdG8uICBFdmVyeSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBjYW4gcmVmZXJlbmNlIG9ubHkgb25lIFdvcmsgUHJvZHVjdC4gIEhvd2V2ZXIsIGEgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIEluIHRoZSBVTUEgUHJvZmlsZSB0aGlzIGFzc29jaWF0aW9uIGlzIGluc3RhbnRpYXRlZCBieSBhIGRlcGVuZGVuY3kgcmVsYXRpb25zaGlwIHdpdGggYSB0cmFjZSBzdGVyZW90eXBlLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCIgbmFtZT0id29ya1Byb2R1Y3REZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q3Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tNNmctZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tNNmd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha002aU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZBIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZXByZXNlbnRzIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUgZGVzY3JpcHRvciB0byB0aGUgY29yZSBjb250ZW50IGVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRXZlcnkgUm9sZSBEZXNjcmlwdG9yIGNhbiByZWZlcmVuY2Ugb25seSBvbmUgUm9sZS4gIEhvd2V2ZXIsIGEgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzLiAgSW4gdGhlIFVNQSBQcm9maWxlIHRoaXMgYXNzb2NpYXRpb24gaXMgaW5zdGFudGlhdGVkIGJ5IGEgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXAgd2l0aCBhIHRyYWNlIHN0ZXJlb3R5cGUuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIiBuYW1lPSJyb2xlRGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drTTZqT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drTTZpLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjEiIG5hbWU9IkFkZGl0aW9uYWxseVBlcmZvcm1zIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjIgXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyQiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drTTZrZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjEiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIG1hcHMgdG8gdGhlIHJlc3BlY3RpdmUgYXNzb2NpYXRpb24gaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgc3BlY2lmaWVzIGRlc2NyaXB0b3JzIGZvciBhZGRpdGlvbmFsIHJvbGVzIG5lY2Vzc2FyeSB0byBjb21wbGV0ZSB0aGUgcmVmZXJyZWQgVGFzay4gIEluc3RhbmNlcyBvZiB0aGVzZSByb2xlcyB3b3VsZCBzaG93IHVwIGFzIHNjaGVkdWxlZCByZXNvdXJjZXMgb24gYSBjb3JyZXNwb25kaW5nIHByb2plY3QgcGxhbiBnZW5lcmF0ZWQgZnJvbSB0aGlzIHN0cnVjdHVyZS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMkIiIG5hbWU9InBlcmZvcm1zQWRkaXRpb25hbGx5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIxIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tNNm1PZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tNNmwtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMzRiIgbmFtZT0iQXNzaXN0cyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQwIF8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha002bXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzNGIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBpcyBzcGVjaWZpYyB0byBhIHByb2Nlc3MsIGkuZS4gbm8gZGVmYXVsdHMgaGF2ZSBiZWVuIGRlZmluZWQgaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgc3BlY2lmaWVzIGRlc2NyaXB0b3JzIGZvciBhZGRpdGlvbmFsIHJvbGVzIHRoYXQgbWF5IHByb3ZpZGUgaW5mb3JtYXRpb24gb3IgYXNzaXN0YW5jZSBoZWxwZnVsLCBidXQgbm90IG1hbmRhdG9yeSB0byB0aGUgY29tcGxldGlvbiBvZiB0aGUgVGFzay4gIEluc3RhbmNlcyBvZiB0aGVzZSByb2xlcyB3b3VsZCBub3Qgc2hvdyB1cCBhcyBzY2hlZHVsZWQgcmVzb3VyY2VzIG9uIHRoZSBjb3JyZXNwb25kaW5nIHByb2plY3QgcGxhbiBnZW5lcmF0ZWQgZnJvbSB0aGlzIHN0cnVjdHVyZS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiIG5hbWU9ImFzc2lzdHNJbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMzRiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drV3JodWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drV3JoZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUIiIG5hbWU9IkV4dGVybmFsSW5wdXQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVFIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2tXcmlPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QiI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gaXMgc3BlY2lmaWMgdG8gYSBwcm9jZXNzLCBpLmUuIG5vIGRlZmF1bHRzIHdpbGwgYmUgZGVmaW5lZCBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBzcGVjaWZpZXMgZGVzY3JpcHRvcnMgZm9yIFdvcmsgUHJvZHVjdHMgdXNlZCBhcyBpbnB1dHMgdGhhdCBhcmUgbm90IHByb2R1Y2VkIGJ5IFRhc2tzIHdpdGhpbiB0aGUgc2FtZSBQcm9jZXNzLCBidXQgYnkgYW5vdGhlciBleHRlcm5hbCBwcm9jZXNzIG9yIGFuIHVua25vd24gc291cmNlLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1RSIgbmFtZT0iZXh0ZXJuYWxJbnB1dFRvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tXcmotZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tXcmp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMCIgbmFtZT0iSW1wYWN0c0RlcGVuZGVuY3kiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2tXcmtlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMCI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gaXMgdXNlZCB0byBzZW1pLWZvcm1hbGx5IHNwZWNpZnkgdHJhY2VhYmlsaXR5IHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBXb3JrIFByb2R1Y3RzIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW4gQWN0aXZpdHkuICBBIGxpbmsgZnJvbSBvbmUgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgdG8gYW5vdGhlciBpbmRpY2F0ZXMgdGhhdCBvbmUgV29yayBQcm9kdWN0IGlzIHJlcXVpcmVkIGFzIGlucHV0IHRvIGEgVGFzayB0aGF0IHByb2R1Y2VzIHRoZSByZWxhdGVkIFdvcmsgUHJvZHVjdCAoJ2ltcGFjdHMnIHJvbGUgZW5kKS4gIEl0IHdvdWxkIGFsc28gbWVhbiB0aGF0IGEgY2hhbmdlIG9uIG9uZSBXb3JrIFByb2R1Y3QgaW5zdGFuY2UgbWF5IGFmZmVjdCBhIGNoYW5nZSBvbiB0aGUgcmVsYXRlZCBwcm9kdWN0LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE2RDc1QUEwMDRCIiBuYW1lPSJNYW5kYXRvcnlJbnB1dCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIF8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha1dybXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUEwMDRCIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSByZXNwZWN0aXZlIGFzc29jaWF0aW9uIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHBvaW50cyB0byBkZXNjcmlwdG9ycyBmb3IgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBtYW5kYXRvcnkgZm9yIHRoZSBUYXNrIHRvIGJlIHBlcmZvcm1lZC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiIG5hbWU9Im1hbmRhdG9yeUlucHV0VG8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTZENzVBQTAwNEIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha2djaHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha2djaGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlDIiBuYW1lPSJNb2RpZmllcyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiIGlzRGVyaXZlZD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drZ2NpT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUMiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGRlcml2ZWQgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgTW9kaWZpZXMgYXNzb2NpYXRpb24gZGVmaW5lZCBiZXR3ZWVuIFdvcmsgUHJvZHVjdHMgYW5kIFRhc2tzIGluIENvcmUgTWV0aG9kIENvbnRlbnQuICBUaGUgc2FtZSBkZXJpdmF0aW9uIHJ1bGUgYXMgZm9yIHRoZSBjb3JlIGNvbnRlbnQgZWxlbWVudHMgYXBwbGllcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiIG5hbWU9Il9yb2xlRGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlDIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tnY2otZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tnY2p1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyOSIgbmFtZT0iT3B0aW9uYWxJbnB1dCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJBIF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha2dja2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjI5Ij4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSByZXNwZWN0aXZlIGFzc29jaWF0aW9uIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHBvaW50cyB0byBkZXNjcmlwdG9ycyBmb3IgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBvcHRpb25hbCBmb3IgdGhlIFRhc2sgdG8gYmUgcGVyZm9ybWVkLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQSIgbmFtZT0iT3B0aW9uYWxJbnB1dFRvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjI5Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tnY2xlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tnY2xPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIzRCIgbmFtZT0iT3V0cHV0IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drZ2NtdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyM0QiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIG1hcHMgdG8gdGhlIHJlc3BlY3RpdmUgYXNzb2NpYXRpb24gaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgcG9pbnRzIHRvIGRlc2NyaXB0b3JzIGZvciBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIG91dHB1dHMgZm9yIHBlcmZvcm1pbmcgdGhlIHJlZmVycmVkIFRhc2suPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2IiBuYW1lPSJvdXRwdXRGcm9tIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjNEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2twbWMtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2twbWN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwQyIgbmFtZT0iUGFja2FnZWRXUCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha3BtZU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBDIj4KLSAgICAgICAgICAgICAgPGJvZHk+SWYgYSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciByZWZlcnMgYXQgdGhlICdkZWxpdmVyYWJsZScgcm9sZSBlbmQgdG8gYSBEZWxpdmVyYWJsZSBXb3JrIFByb2R1Y3QgdGhlbiB0aGlzIGFzc29jaWF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgRGVsaXZlcmFibGUncyBXb3JrIFByb2R1Y3QgcGFydHMuICBBcyBpbmRpY2F0ZWQgZm9yIERlbGl2ZXJhYmxlIGluIHRoZSBDb3JlIE1ldGhvZCBDb250ZW50IHBhY2thZ2UsIHRoaXMgYXNzb2NpYXRpb24gb3ZlcnJpZGVzIHRoZSAnZGVsaXZlcmVkV29ya1Byb2R1Y3RzJyBhc3NvY2lhdGlvbiBvZiB0aGUgV29yayBQcm9kdWN0LCB3aGljaCBzdG9yZXMgdGhlIHJlY29tbWVuZGVkIGRlbGl2ZXJhYmxlIHBhcnRzLCBidXQgY2FuIGJlIGN1c3RvbWl6ZWQgZm9yIGV2ZXJ5IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yLiA8L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiIG5hbWU9ImRlbGl2ZXJhYmxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBDIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2twbWZPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2twbWUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1MyIgbmFtZT0iUHJpbWFyeVBlcmZvcm1zIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTQgXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drcG1nZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTMiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIG1hcHMgdG8gdGhlIHJlc3BlY3RpdmUgYXNzb2NpYXRpb24gaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgcG9pbnRzIHRvIGEgZGVzY3JpcHRvciBmb3IgdGhlIG9uZSByb2xlIHJlc3BvbnNpYmxlIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgdGFzay4gIEFuIGluc3RhbmNlIG9mIHRoaXMgcm9sZSB3b3VsZCBzaG93IHVwIGFzIGEgc2NoZWR1bGVkIHJlc291cmNlIG9uIGEgY29ycmVzcG9uZGluZyBwcm9qZWN0IHBsYW4gZ2VuZXJhdGVkIGZyb20gdGhpcyBzdHJ1Y3R1cmUuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU2IiBuYW1lPSJwZXJmb3Jtc0FzT3duZXIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTMiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3BtaU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha3BtaC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdFIiBuYW1lPSJSZXNwb25zaWJsZSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha3BtaXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdFIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZXByZXNlbnRzIHJlc3BvbnNpYmlsaXR5IGZvciBXb3JrIFByb2R1Y3QgaW5zdGFuY2VzLiAgSXQgaW5kaWNhdGVzIG93bmVyc2hpcCBhbmQgZm9yIGV4YW1wbGUgd291bGQgZGVmaW5lIHRoZSBSb2xlIHRoYXQgYW5zd2VycyB0byBtYW5hZ2VtZW50IHF1ZXN0aW9ucyBhYm91dCB0aGUgcXVhbGl0eSB3b3JrIHByb2R1Y3QuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4IiBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0UiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3pYZHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha3pYZGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGMDZCQkMwMzBEIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwREYgXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5IiBuYW1lPSJfY29tcG9zaXRlUm9sZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFGMDZCNjUwMEU2IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFGMDZCQkMwMzBEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2t6WGZlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2t6WGZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBDMDI4MSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0IF8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha3pYZi1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEMwMjgxIj4KLSAgICAgICAgICAgICAgPGJvZHk+QnJlYWtkb3duIHN0cnVjdHVyZXMgYXJlIG5lc3RlZCBzdHJ1Y3R1cmVzIChzZWUgc3VwZXJBY3Rpdml0aWVzIGFzc29jaWF0aW9uKSBwcmVzZW50ZWQgbm9ybWFsbHkgYXMgaW5kZW50ZWQgbGlzdHMuICBXaXRoaW4gdGhpcyBuZXN0aW5nIGNoaWxkcmVuIG9uIHRoZSBzYW1lIGxldmVsIGFyZSBub3Qgc3BlY2lmaWNhbGx5IG9yZGVyZWQuICBIb3dldmVyLCBhIHVzZXIgb2YgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzIHdvdWxkIGV4cGVjdCB0byBvcmRlciBlbGVtZW50cyB3aXRoaW4gYSBsaXN0LiAgVGhpcyBhc3NvY2lhdGlvbiBpcyB1c2VkIHRvIHN0b3JlIHRoZSBwcmVzZW50YXRpb24gc2VxdWVuY2UgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGUgYXNzb2NpYXRpb24gcHJlc2VudGVkQmVmb3JlIGlzIHJlZHVuZGFudCB0byB0aGUgYXNzb2NpYXRpb24gcHJlc2VudGVkQWZ0ZXIuICBUaGlzIHJlZHVuZGFuY3kgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBQcm9jZXNzIENvbnRyaWJ1dGlvbnMgKHNlZSBwbHVnaW5zKS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiIG5hbWU9Il9icmVha2Rvd25FbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjFFOEYwQzAyODEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3pYaHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha3pYaGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEEwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTEgXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drelhpT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTAiPgotICAgICAgICAgICAgICA8Ym9keT5UaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBhc3NvY2lhdGlvbiBsaW5rcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdG8gaXRzIHN1Y2Nlc3NvciBXb3JrIEJyZWFrZG93biBFbGVtZW50LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMiIgbmFtZT0ibGlua1RvU3VjY2Vzc29yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTA4MTg3OTAyODgiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEEwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2s5SWR1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2s5SWRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENFIF8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0YiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HazlJZU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENEIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBsaW5rcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdG8gaXRzIHByZWRlY2Vzc29yLiAgRXZlcnkgV29yayBCcmVha2Rvd24gRWxlbWVudCBjYW4gaGF2ZSBwcmVkZWNlc3NvciBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHRvIGl0LiAgU3BlY2lmaWMgcHJlZGVjZXNzb3IgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MgV29yayBPcmRlciwgd2hpY2ggZGVmaW5lcyB0aGUga2luZCBvZiBwcmVkZWNlc3NvciBhbm90aGVyIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgcmVwcmVzZW50cyBmb3IgYW5vdGhlci48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0UiIG5hbWU9InN1Y2MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0QiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HazlJZk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HazlJZS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZEODkxRjAyQ0QiIG5hbWU9IlByb2Nlc3NUeXBlcyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HbWxnTi1mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MUUxMDA3QzAzMUYiPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUxMDA3QzAzMUYiIHR5cGU9IkNsYXNzIiBuYW1lPSJQcm9jZXNzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWotLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTkyOUU5OTAyOUMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNal8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0c4TWpfT2ZYRWR1cUhvT0piVVJaUnciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIgdW5kZXJsaW5lPSJ0cnVlIiBkZXNjcmlwdGlvbj0iQ2xhc3MgRGlhZ3JhbTogUHJvY2Vzc1R5cGVzIC8gUHJvY2Vzc0JyZWFrZG93biIgbGluZUNvbG9yPSI0MTk0MzY4Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhNal9lZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE3OSIgeT0iOTYyNiIgd2lkdGg9IjQ0NDUiIGhlaWdodD0iMTEwOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVXdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1V3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4V1V4T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTc0IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1V4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVXh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVXlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdVeWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVXl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdVeS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVXpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdVemVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVXp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVXotZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhXVXdlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOFdVd3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NjkwIiB5PSIxMDI3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDc3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVTAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhXVTFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5OTciIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVTFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1UxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVMk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1UyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVMnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1UyLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVM09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1UzZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdVMy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOFdVMGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4V1UwdWZYRWR1cUhvT0piVVJaUnciIHg9IjY0MjAiIHk9Ijc3NDciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1UtZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVX09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOFdVX2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDUyMSIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1VfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZBZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVkF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZBLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVkJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZCZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVkJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZCLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZDT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4V1UtdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhXVS0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI4OSIgeT0iNzc0NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4V1ZEZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZFZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVkV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZFLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVkZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZGZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVkZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZGLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZHT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4V1ZDdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhXVkMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjY1NyIgeT0iMjg1MyIgd2lkdGg9IjIxMTYiIGhlaWdodD0iMzI3NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBEQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4V1ZXLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMTE1IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWWU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWWXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWWk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVlp1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhXVldPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOFdWV2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjkxNCIgeT0iNzc5NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dtbGdPZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGUgUHJvY2VzcyBUeXBlcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIFByb2Nlc3MuICBBcyBkZXBpY3RlZCBpbiB0aGlzIGRpYWdyYW0sIGl0IGRpc3Rpbmd1aXNoZXMgZGlmZmVyZW50IHR5cGVzIG9mIHByb2Nlc3NlcyBuZWVkZWQgdG8gcmVwcmVzZW50IGJ1aWxkaW5nIGJsb2NrcyBmb3Igb3RoZXIgcHJvY2Vzc2VzIChDYXBhYmlsaXR5IFBhdHRlcm4pLCBjb21wbGV0ZSBlbmQtdG8tZW5kIHByb2Nlc3NlcyAoRGVsaXZlcnkgUHJvY2VzcyksIG9yIHByb2Nlc3NlcyB0aGF0IGhhdmUgYmVlbiByZWR1Y2VkIHRvIHRoZSBlc3NlbnRpYWwgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IGZvciBleHBvcnRpbmcgYW5kIHBsYW5uaW5nIGEgcHJvamVjdCB3aXRoIGEgdGhpcmQtcGFydHkgcGxhbm5pbmcgdG9vbCAoUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSkuICAoTm90ZSwgdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWctaW4gd2lsbCBwcm92aWRlIGFub3RoZXIgdHlwZSBvZiBQcm9jZXNzIGNhbGxlZCBQcm9jZXNzIENvbnRyaWJ1dGlvbi4pICBUaGUgUHJvY2VzcyBUeXBlcyBwYWNrYWdlIGFsc28gZGVmaW5lcyBwcm9jZXNzLXNwZWNpZmljIGV4dGVuc2lvbiB0byBHdWlkYW5jZSBUeXBlcyBhcyB3ZWxsIENhdGVnb3JpZXMuICBXaGVyZWFzIHRoZSBCcmVha2Rvd24gcGFja2FnZSBkZWZpbmVkIHRoZSBiYXNpYyBwaWVjZXMgZm9yIGRlc2NyaWJpbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMsIHRoaXMgcGFja2FnZSB0YWtlcyB0aGVzZSBwaWVjZXMgYW5kIHBsYWNlcyB0aGVtIGludG8gaGlnaGVyIG9yZ2FuaXphdGlvbiBzdHJ1Y3R1cmVzIGZvciBicmVha2Rvd246IFByb2Nlc3Nlcy4gIEEgcHJvY2VzcyBpcyBkZWZpbmVkIGFzIGEgc3BlY2lhbCBBY3Rpdml0eSBhbmQgdGhlcmVmb3JlIGNvbnN0aXR1dGVzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhIGJyZWFrZG93bi4gIEhvd2V2ZXIsIFByb2Nlc3MgY29udGFpbnMgc3BlY2lhbCBwcm9wZXJ0aWVzIGFuZCBleHRlbmRlZCBzZW1hbnRpY3MgdGhhbiBBY3Rpdml0eS4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhXVkdlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAwMDBFNiIgc291cmNlPSJfRzhXVS1lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhXVkNlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZILWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOFdWSGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVklPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAyQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhXVkllZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYyMyIgeT0iMjI4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0MDEwMDJCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhXVkpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ4NyIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAxNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVktPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOFdWSi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MTEiIHk9IjI3MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMTAwMTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4V1ZLdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNzEyIiB5PSItMjU0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAyQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVkwtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhXVkxlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAxNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVk11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVk0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhXVk1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0MDEwMDJCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWTi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOFdWTmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVk9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAxNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVk91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWTy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOFdWT2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhXVkd1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOFdWRy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODcyLCAtNDU3LCAtNTAzNywgMzI1MV0kWy04NzIsIC00NTIxLCAtNTAzNywgLTgxMl0kWzMxMDcsIC00NTIxLCAtMTA1OCwgLTgxMl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4V1ZQT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEUiIHNvdXJjZT0iX0c4V1UtZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4V1ZDZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWUXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhXVlFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4V1ZQZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhXVlB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOTMxLCAtNDQ4LCAtMzIzNCwgMzI1OV0kWzkzMSwgLTI2NTAsIC0zMjM0LCAxMDU4XSRbMzEwNywgLTI2NTAsIC0xMDU4LCAxMDU4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOFdWUS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhXVlJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOFdWUmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTEwIiBzb3VyY2U9Il9HOFdVME9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOFdWQ2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4V1ZTZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOFdWUnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4V1ZSLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xOTQsIC00NTcsIDgsIDMyNTFdJFstMTk0LCAtMjA3NCwgOCwgMTYzNF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhXVlRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4V1ZUZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhXVlR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRUQ2MDJBRSIgc291cmNlPSJfRzhXVkNlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhXVXdPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZVZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZWT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOFdWVXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhXVlQtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOFdWVU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTgsIC0xNjQyLCAtMzMsIDI0MjFdJFsxMTgsIC0zNjE1LCAtMzMsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhXVlZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4V1ZWdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhXVlotZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YyMDIzOCIgc291cmNlPSJfRzhXVkNlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhXVlYtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVmJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZiZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOFdWYS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhmZXNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM5OSIgeT0iMzIyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUEzRjMwMUVDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZldGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhmZXRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMzMSIgeT0iMzY0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUEzRjMwMUUyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZldU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ZmV0LWZYRWR1cUhvT0piVVJaUnciIHg9IjQ5MyIgeT0iLTE3NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ZmV1dWZYRWR1cUhvT0piVVJaUnciIHg9Ii02MjUiIHk9IjMxNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ZmV2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ZmV2ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZld09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ZmV3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ZmV3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZleE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhmZXgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhmZXhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhmZXktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhmZXllZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4V1ZhT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhXVmFlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTA1OCwgMTE4NSwgLTU2OTgsIC0yNTczXSRbMjc2OCwgMTE4NSwgLTM5ODcsIC0yNTczXSRbMjc2OCwgMzcxNiwgLTM5ODcsIC00Ml0kWzUxOTgsIDM3MTYsIC0xNTU3LCAtNDJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOGZlek9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhEIiBzb3VyY2U9Il9HOFdWVi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOFdWQ2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZlMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZTB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4ZmUwT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOGZlemVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4ZmV6dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMDMsIC00NDgsIDY1NTMsIDMzMTBdJFstMjAzLCAtMzI0MiwgNjU1MywgNTE2XSRbLTU2OTgsIC0zMjQyLCAxMDU4LCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4ZmUwLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOGZlMU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxOTI5RTk5MDI5QyIgdHlwZT0iQ2xhc3MiIG5hbWU9IlByb2Nlc3NCcmVha2Rvd24iPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFBzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4cFB0T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUHVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUHUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUHZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFB2LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4cFBzZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhwUHN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTIyMCIgeT0iMTE5NjMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB3T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMzEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOHBQeE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQeU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFB5ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFB5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFB6ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQei1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOHBQd2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4cFB3dWZYRWR1cUhvT0piVVJaUnciIHg9IjE2NDU5IiB5PSI0OTY5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhwUDFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE2NzYiIGhlaWdodD0iOTMxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFAxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQMk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFAyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQMnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFAyLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQM09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFAzZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQMy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOHBQMGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4cFAwdWZYRWR1cUhvT0piVVJaUnciIHg9IjEzMTMxIiB5PSI2MDEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFA0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOHBQNU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFA1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQNk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFA2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQNnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFA2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQN09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFA3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQN3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQNy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOHBQNGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4cFA0dWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMzQ0IiB5PSI4ODIyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQLWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUF9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhwUF9lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFBfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUF8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBRQXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBRQk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBRQnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUUNPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhwUC11ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHBQLS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjkwMyIgeT0iNTA3MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekF0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4ekF1T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNjI1IiBoZWlnaHQ9Ijg5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekF1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBdmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBdi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBd2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QXctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzh6QXRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHpBdHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjM4OSIgeT0iMjEzNiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekEyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4ekEydWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekEzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekEzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QTMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QTRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QTQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekE1ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4ekExLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzh6QTJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODY1MiIgeT0iMTUyMzEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE3LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOHpBOC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBOS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekEtT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBLWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekEtdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBLS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekFfT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBX2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBX3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOHpBOE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4ekE4ZWZYRWR1cUhvT0piVVJaUnciIHg9IjM1NjQiIHk9IjE1MjE0IiB3aWR0aD0iNDYzMSIgaGVpZ2h0PSIxMTc2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCSXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzh6Qkp1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QktPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qkt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCSy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCTGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qkx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCTC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qk1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6Qk1lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzh6QkktZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHpCSk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjQ4OCIgeT0iMTUxMjkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJNdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOHpCTnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qk4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCT3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJPLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCUE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJQZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCUHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJQLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCUU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCUWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOHpCTS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4ekJOT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE2MzU0IiB5PSIxMTk5NiIgd2lkdGg9IjI3MDkiIGhlaWdodD0iMjIzNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEs3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4OEs3dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MjUwIiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEs4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEs4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4SzgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEs5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4SzllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEs5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4SzktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEstT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OEstZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4OEs2LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzg4SzdPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE5NDYiIHk9IjY4NDEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExET2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0IiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMRC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HODhMRU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjM1MyIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMRk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OExGZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMRnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OExGLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMR09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OExHZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMR3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhMRy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HODhMRGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OExEdWZYRWR1cUhvT0piVVJaUnciIHg9Ijk3OTUiIHk9IjI5MjkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExKZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0EiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMS09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HODhMS2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjM1MyIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMTGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OExMdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMTC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OExNT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMTWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OExNdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMTS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhMTk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HODhMSnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OExKLWZYRWR1cUhvT0piVVJaUnciIHg9IjE1ODkxIiB5PSIyODI3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR212UkllZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyB0aGUgbWFpbiBzdHJ1Y3R1cmUgdXNlZCB0byByZXByZXNlbnQgYSBwcm9jZXNzLiAgQSBwcm9jZXNzIGlzIHJlcHJlc2VudGVkIGJ5IGEgYnJlYWtkb3duIG9mIEFjdGl2aXRpZXMsIHdoaWNoIGhhcyAiLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhwUDhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfRzhwUHNPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhwUDRPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFA4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFA5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHBQOU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhwUDhlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4cFA4dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzYwOSwgLTU0MSwgLTMwNDgsIDI2MDddJFszMDIyLCAtMjYyNCwgLTYzNSwgNTI0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOHBQOS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhwUC1PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOHBRQ2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEVGIiBzb3VyY2U9Il9HOHBQNE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHBQLWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUURPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhwUURlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjQiIHk9IjY2OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4cFFFZWZYRWR1cUhvT0piVVJaUnciIHg9Ii05ODEiIHk9IjI2MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhwUUZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzYyIiB5PSItMzE5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4cFFGLWZYRWR1cUhvT0piVVJaUnciIHg9IjExODUiIHk9IjIyOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4cFFHdWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NjQiIHk9Ii0yNjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBRSC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHBRSGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBRSS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHBRSWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFFKLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4cFFKZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekFzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekFzZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOHBRQ3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4cFFDLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xODc5LCAtMjM4LCAtMTUwOCwgMzUxOV0kWy00NDQ1LCAtMjM4LCAtNDA3NCwgMzUxOV0kWy00NDQ1LCAtMzY1MiwgLTQwNzQsIDEwNV0kWy0xMzIzLCAtMzY1MiwgLTk1MiwgMTA1XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzh6QXhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRUQ2MDJBRSIgc291cmNlPSJfRzhwUDBPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzh6QXRPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekF4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekF5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHpBeU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzh6QXhlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4ekF4dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIDQ2NSwgMCwgLTE4MjBdJFswLCAxODI4LCAwLCAtNDU3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOHpBeS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzh6QXpPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOHpBNXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzAzIiBzb3VyY2U9Il9HOHpBMXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHBQc09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4ekE2dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOHpBNS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4ekE2T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI5NiwgLTUyNCwgLTgsIDI3MjZdJFsyOTYsIC0yNzE3LCAtOCwgNTMzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOHpBN2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzh6QTd1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOHpBXy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBDIiBzb3VyY2U9Il9HOHpBNy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHpBNy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzh6QkEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg3NiIgeT0iMzkzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QkItZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyMiIgeT0iNjM2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJDLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCQ3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NjIiIHk9Ii0zNzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QkRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg2NyIgeT0iMTcxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QkVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgwMiIgeT0iLTExMTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCRk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCRmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCRS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCR2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCRi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qkd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJIZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJHLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJJZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJILWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOHpCQU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4ekJBZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE3NywgNTg0LCAxNzcsIDU4NF0kWzE3NywgMjQ0NiwgMTc3LCAyNDQ2XSRbLTM0NjIsIDI0NDYsIC0zNDYyLCAyNDQ2XSRbLTM0NjIsIDM5NywgLTM0NjIsIDM5N10kWy0xOTk4LCAzOTcsIC0xOTk4LCAzOTddIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOHpCUXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUyIiBzb3VyY2U9Il9HOHpCTXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHpCTXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4ekJSdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCU3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI2MjciIHk9IjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJUZWZYRWR1cUhvT0piVVJaUnciIHg9Ii01NDciIHk9IjI2MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCVU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItODA3IiB5PSItMjkwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QlUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE1MSIgeT0iMjQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QldPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QlZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEtvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S291ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4S28tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzg4S29lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEtwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLcC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLcGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLcS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLcWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzh6QlEtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOHpCUk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMzU0LCAwLCAxMzU0LCAwXSRbMzM5NSwgMCwgMzM5NSwgMF0kWzMzOTUsIC0xOTIxLCAzMzk1LCAtMTkyMV0kWzE4NiwgLTE5MjEsIDE4NiwgLTE5MjFdJFsxODYsIC0xMTE3LCAxODYsIC0xMTE3XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzg4S3JPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRSIgc291cmNlPSJfRzh6Qk11ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhwUDRPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEtyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEtzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HODhLc09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzg4S3JlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4OEtydWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMTI2LCAtMTEyNiwgMjQyOSwgMjQyOV0kWy0zMDMxLCAtMzAzMSwgNTI0LCA1MjRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OEtzLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhLdE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4OEt0ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0YiIHNvdXJjZT0iX0c4ekJJdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4ekJNdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HODhLdWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTczIiB5PSItNDk5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzg4S3ZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzMyIgeT0iLTI0NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLd2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzg4S3dPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTI3IiB5PSIzMzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzg4S3ctZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIiIHk9IjIxMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLeHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjciIHk9Ii0zNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLeS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLeWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLei1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLemVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEswdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OEswLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4OEswZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OEsxLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4OEsxZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HODhLdHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4OEt0LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE1MDgsIC0yNywgLTIxOTYsIDIzMDJdJFszNTQ1LCAtMjcsIC0xNTksIDIzMDJdJFszNTQ1LCAtMTIxNywgLTE1OSwgMTExMl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4OEsyT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNjAiIHNvdXJjZT0iX0c4ekJJdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4cFBzT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEszZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzg4SzNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4OEsyZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HODhLMnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTY3LCAtNTI0LCAyODg3LCAyNjI0XSRbLTI4NzAsIC0yNjE2LCA1ODQsIDUzM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4SzMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OEs0T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzg4SzRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENiIgc291cmNlPSJfRzh6QTctZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhwUHNPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEs1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEs1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HODhLNWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzg4SzR1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4OEs0LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzcyOCwgLTU5MiwgLTM0MzcsIDI3MDldJFszNDcxLCAtMjc2OCwgLTY5NCwgNTMzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhLNk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4SzZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HODhLLXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyODIwMzkyIiBzb3VyY2U9Il9HOHBQLWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HODhLNnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S19lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OEtfdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HODhLLS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4OEtfT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIDUxNiwgLTEwMSwgLTEyNjFdJFswLCAxMjUzLCAtMTAxLCAtNTI0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhMQWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4TEF1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HODhMQS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjMwMTlBIiBzb3VyY2U9Il9HODhLNnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHBQNE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TENlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OExCLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HODhMQk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4OExCZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMzgsIDMxOCwgLTIxMiwgLTE2NjddJFstMjM4LCAxNjY3LCAtMjEyLCAtMzE4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhMQ3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4TEMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HODhMSE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMkEwIiBzb3VyY2U9Il9HODhMRE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHBQLWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OExJT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HODhMSGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzg4TEh1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzI4LCA1MjQsIC0yMjY5LCAtMTYwOF0kWzIyNjAsIDE2MDgsIC03MzYsIC01MjRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OExJLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhMSk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4OExOZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyOUYiIHNvdXJjZT0iX0c4OExKZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4cFAtZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMTy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzg4TE9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4OExOdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HODhMTi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzUzLCA1MjQsIDIzNDUsIC0xNzEwXSRbLTIzODcsIDE3MTAsIDcxMSwgLTUyNF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4TFBPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OExQZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzg4TFB1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQjFFQzFCMDM0OSIgc291cmNlPSJfRzhwUHdPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzg4SzZ1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TFEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExST2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HODhMUXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzg4TFAtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4OExRT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05NjUsIDUxNiwgMjQ4OSwgLTEzNjNdJFstMjUwNiwgMTM0NiwgOTQ4LCAtNTMzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhMUmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4TFJ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY1RjY3ODAwNDUiIHR5cGU9IkNsYXNzIiBuYW1lPSJQcm9jZXNzR3VpZGFuY2UiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGN29PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjdvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5RjdwT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNjc2IiBoZWlnaHQ9IjkxNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjdwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGN3B1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3cC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGN3FPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOUY3cWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGN3F1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOUY3cS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGN3JPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOUY3cmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGN3J1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlGN3ItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlGN29lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOUY3b3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDQ3IiB5PSIxMzE1NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGNzBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA3NyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjcwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5RjcxT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3MWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjcxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGNzEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjcyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlGNzJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjcydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlGNzItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjczT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlGNzNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjczdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5RjczLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5RjcwZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlGNzB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iODEyIiB5PSIxNTExMyIgaGVpZ2h0PSIxNjY3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3NE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMyIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlQRmstZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRmwtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGbU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRm1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGbXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRm0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGbk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRm5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRm51ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlQRmtPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVBGa2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTM0NiIgeT0iMTAxNjEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZuLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUU4NjAxN0UiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOVBGby1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTY1OSIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZwLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRnFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZxZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRnF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRnJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZyZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEZydWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5UEZvT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlQRm9lZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTExNTkiIHk9Ijg2NDQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ1T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOVBGdk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGd09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEZ3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGd3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEZ3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGeE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEZ4ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGeHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGeC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOVBGdWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVBGdXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTE5MiIgeT0iMTE0ODAiIHdpZHRoPSI0MzM2IiBoZWlnaHQ9IjUzOTMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdEdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOUEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHRWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOVBHRXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjkyOSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHRk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHRnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdGLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHR09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdHZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHR3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdHLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHSE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHSGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOVBHRC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVBHRU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTE4NCIgeT0iMjUzMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0h1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5OSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5UEdJdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyOTI5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdKdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0otZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdLT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0tlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdLdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0stZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdMT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdMZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5UEdILWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5UEdJT2ZYRWR1cUhvT0piVVJaUnciIHg9IjExMTg0IiB5PSIzNzUwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHTHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUEzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR01lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlQR011ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5MjkiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR05PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR051ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHTi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR09PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHT2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMmtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkya2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMmt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMmstZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlQR0wtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlQR01PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTExODQiIHk9IjQ5NjkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJsT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTQiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkybC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOVkybU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjkyOSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMm1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkybXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkybk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJuZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkybnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJuLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJvZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkyby1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOVkybGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVkybHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTE4NCIgeT0iNjE4OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTEzMDJDNSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5WTJxT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyOTI5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkycWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMnJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMnItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMnNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJzLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5WTJwZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5WTJwdWZYRWR1cUhvT0piVVJaUnciIHg9IjExMTg0IiB5PSI3NDA4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkydE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlZMnVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkydS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkydmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkydi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMndPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkyd2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMnctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlZMnRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVkydHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTAwIiB5PSIyNTA2IiB3aWR0aD0iMjM3OSIgaGVpZ2h0PSI5NjI2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR212UkktZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBwcm92aWRlcyBhbiBvdmVydmlldyB0byB0aGUgZGlmZmVyZW50IFByb2Nlc3Mtc3BlY2lmaWMgR3VpZGFuY2UgVHlwZXMgYWRkZWQgdG8gdGhlIEd1aWRhbmNlIFR5cGVzIGFscmVhZHkgZGVmaW5lZCBpbiBDb3JlIE1ldGhvZCBDb250ZW50IGZvciBQcm9jZXNzZXMuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5UEZ5T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUEiIHNvdXJjZT0iX0c5UEZ1T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5RjcwT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlQRnpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEYwT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii03MzIiIHk9Ii00NTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEYwLWZYRWR1cUhvT0piVVJaUnciIHg9Ijk3OCIgeT0iMjg4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEYxdWZYRWR1cUhvT0piVVJaUnciIHg9Ijc0MiIgeT0iLTQ1NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGMnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGMmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNjEiIHk9IjM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEYzdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEYzT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEY0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEY0T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRjV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRjVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRjZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRjZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5UEZ5ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlQRnl1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE1MDcsIDI0MTMsIDg5MDYsIDU4NF0kWy04OTQwLCAyNDEzLCAxNDczLCA1ODRdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOVBGNi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTJFIiBzb3VyY2U9Il9HOVBGdU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOUY3ME9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5UEY3LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTMxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGOC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzMyIiB5PSItNDU3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMzEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGOXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjA2IiB5PSIzMzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRi1lZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzQyIiB5PSItNDU3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRi0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEZfT2ZYRWR1cUhvT0piVVJaUnciIHg9IjM2MSIgeT0iMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRl91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEzMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0FlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRl8tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEyRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0JlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQR0EtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTMxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHQ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBHQi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEyRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHRGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBHQy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlQRjdPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOVBGN2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjE3MCwgOTc5LCA4ODM3LCAtMjkxXSRbLTk0NDYsIDk3OSwgMTU2MSwgLTI5MV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5WTJ4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQTAzOTYiIHNvdXJjZT0iX0c5WTJ0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5Rjc0T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlZMnlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNzkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTJ6T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii05MTkiIHk9IjMwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDc5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMnotZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQwMyIgeT0iLTE5NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTIwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFDMDA2NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyMHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NjQiIHk9IjI4MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTIxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNjUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTIxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTIxZWZYRWR1cUhvT0piVVJaUnciIHg9IjU1IiB5PSItMjIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFDMDA3OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMjJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMjJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTIyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFDMDA2NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMjN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMjNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTIzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDc5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyNGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkyNHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyNE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFDMDA2NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkyNXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyNU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlZMnhlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOVkyeHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTg1LCAzMzM1LCAtODYxOSwgODRdJFs4ODIyLCAzMzM1LCAtOTgyLCA4NF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5WTI1LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRTAxQ0EiIHNvdXJjZT0iX0c5UEZuLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5WTJ0T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyNnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyN2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlZMjYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxQTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTI3LWZYRWR1cUhvT0piVVJaUnciIHg9Ii05NDIiIHk9Ii0yNDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyOGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxQTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyOHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlFRkYwMTlBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTI5ZWZYRWR1cUhvT0piVVJaUnciIHg9IjY4OSIgeT0iLTI0NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxOUEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTItZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTItT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii02ODMiIHk9IjE5NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTItdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxQTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJfZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTItLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxOUEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTNBZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTJfLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZGMDFBNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZM0JlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM0EtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxOUEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZM0NlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM0ItZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5WTI2T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlZMjZlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTgyOSwgMCwgODg3MywgMTc3OF0kWy04NTE3LCAwLCAxMTg1LCAxNzc4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlZM0N1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUwMDMyNSIgc291cmNlPSJfRzlZMnRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlQRnVPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNEZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNFT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVkzRHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUyMDA0NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM0V1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc3MCIgeT0iMzA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0ZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM0ZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUyMDA0MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzR09mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MTkiIHk9IjMwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNHLWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NTIiIHk9Ii0yNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzSGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkzSU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzSHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkzSk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzSXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTNLT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNKdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTNMT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNLdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOVkzQy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5WTNET2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExODUsIDQ2MzEsIC05MjI4LCAtMjIyNl0kWzg5MDYsIDQ2MzEsIC0xNTA3LCAtMjIyNl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5WTNMZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4QzAwQzUiIHNvdXJjZT0iX0c5WTJ0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5UEdEdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzTS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlZM01lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNOZWZYRWR1cUhvT0piVVJaUnciIHg9Ii04NTQiIHk9IjI5NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNOLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM09lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNPT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM08tZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzUyIiB5PSIyOTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzUGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDEzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzUHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzgiIHk9Ii0xODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDFEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlua09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWlua2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzUWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDEzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlubE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWlubGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluay1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbmx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5tT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW5tZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW5sLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlubXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDEzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlubk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW5uZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW5tLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOVkzTHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5WTNMLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExODUsIC00Mjc1LCAtOTE3NywgLThdJFs4ODk4LCAtNDI3NSwgLTE0NjQsIC04XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlpbm51ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkwMDI1MiIgc291cmNlPSJfRzlZMnRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlQR0h1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5vZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbm8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5wT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOWlub3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFCNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkzMCIgeT0iMjk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTEwMUI0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlucXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5xLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFBOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluck9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3NjAiIHk9IjI5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5zT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW5yLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMCIgeT0iLTI0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5zZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5zLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW50T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW5zdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWludGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW50LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW51T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW50dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWludWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFCNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbnZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW52ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW52LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbndPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5aW5uLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlpbm9PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE4NSwgLTMwNDgsIC05MTc3LCAwXSRbODg5OCwgLTMwNDgsIC0xNDY0LCAwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlpbndlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk0MDNCNyIgc291cmNlPSJfRzlZMnRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlQR0x1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW54T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW54LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOWlueGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk1MDMyQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnllZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkwNSIgeT0iMzEyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzJDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW56dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk1MDMyMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluei1mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MDEiIHk9IjI4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW4wZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW4wLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW4wdWZYRWR1cUhvT0piVVJaUnciIHg9IjEwOCIgeT0iLTI4MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW4xT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW4xdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW4xLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW4xZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW4ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW4yLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW4yZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk1MDMyQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbjMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbjNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW40T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW40dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbjQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbjRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5aW53dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlpbnctZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE4NSwgLTE4MjgsIC05MTc3LCAwXSRbODg5OCwgLTE4MjgsIC0xNDY0LCAwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlpbjVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk5MDM4MyIgc291cmNlPSJfRzlZMnRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlZMmxPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW41LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW42dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOWluNk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJFNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbjdPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg3OSIgeT0iMzYzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkU0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbjctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW44ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJEQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluOHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NzUiIHk9IjI2MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW45T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5QTAyREEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW45dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW45ZWZYRWR1cUhvT0piVVJaUnciIHg9IjEyNSIgeT0iLTM0MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW45LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5QTAyRTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW4tZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW4tdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW4tT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5QTAyREEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5fZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW5fdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW5fT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJFNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpb0F1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpb0FPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9BLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5QTAyREEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9CZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpb0J1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpb0JPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5aW41ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlpbjV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE4NSwgLTYwOSwgLTkxNzcsIDBdJFs4ODk4LCAtNjA5LCAtMTQ2NCwgMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5aW9CLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RTAxNzgiIHNvdXJjZT0iX0c5WTJ0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5WTJwT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9ET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvRGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlpb0MtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9EdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUYwMDhCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlvRC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvRWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwOEIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9FLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlvRXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUYwMDg5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW9GZWZYRWR1cUhvT0piVVJaUnciIHg9Ijc2MCIgeT0iMjYzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpb0dPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI5MCIgeT0iLTI4OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9HdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwOEIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9IT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW9IZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW9HLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwODkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9JT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW9JZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW9ILWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4QiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpb0plZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpb0ktZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9KdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwODkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9LT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpb0tlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpb0otZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5aW9DT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlpb0NlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE4NSwgNjA5LCAtOTE3NywgMF0kWzg4OTgsIDYwOSwgLTE0NjQsIDBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOWlvS3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFRDYwMkFFIiBzb3VyY2U9Il9HOUY3b09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOVkydE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb01PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5aW9MdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOWlvSy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5aW9MT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzg0LCAtNDY1LCA4NCwgNTgzM10kWzg0LCAtMTQ5OCwgODQsIDQ4MDBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c5aW9NZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOWlvTXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5aW9NLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMTAiIHNvdXJjZT0iX0c5RjcwT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5RjdvT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9PT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvT2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlpb04tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5aW9OT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlpb05lZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUzLCAtMzE4LCAtNTMsIDE2NDBdJFstNTMsIC0xNjQxLCAtNTMsIDMxN10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzlpb091ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c5aW9PLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxMjRCQ0QwMzFBIiB0eXBlPSJDbGFzcyIgbmFtZT0iUmVmZXJlbmNlV29ya2Zsb3dzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhrT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4ay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOXJ4bE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTcyNyIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4bGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeGwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhtT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeG1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhtdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeG0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhuT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeG5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhudWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnhuLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5cnhrZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlyeGt1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzYwOCIgeT0iMzQ4NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeG9PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5cnhwT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTc0IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4cC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4cWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4cS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4cmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeHItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlyeG9lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOXJ4b3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI3Njg0IiB5PSIxNjU4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4dWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRCRUUwMERDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlyeHZlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE4NjIiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4di1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnh3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4d2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnh3dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4dy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnh4T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4eGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnh4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4eC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4eU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOXJ4dXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5cnh1LWZYRWR1cUhvT0piVVJaUnciIHg9IjkzNiIgeT0iMTc2MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBEQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cngtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5cngtZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMTE1IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cngtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeC0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4X09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeF9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4X3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaWdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpZ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaWd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpZy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaWhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaWhlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlyeDl1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOXJ4OS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI2OTEzIiB5PSI1NjIxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR212UkplZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyBob3cgdGhlIGNhdGVnb3J5IGRpc2NpcGxpbmUgaGFzIGJlZW4gZXh0ZW5kZWQgaW4gdGhpcyBwYWNrYWdlIHdpdGggYW4gYWRkaXRvbmFsIGFzc29jYXRpb24gdG8gQWN0aXZpdHkgcHJvdmlkaW5nIHN0YW5kYXJkIG9yIHJlZmVyZW5jZSB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIGRlc2NyaWJlZCBieSB0aGUgRGlzY2lwbGluZS4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlyeHNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRUQ2MDJBRSIgc291cmNlPSJfRzlyeGtPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlyeG9PZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnh0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOXJ4dE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlyeHNlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5cnhzdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NTcsIDAsIDEzNzFdJFswLCAtMTM4MCwgMCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOXJ4dC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzlyeHVPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOXJ4MHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRDM0EwMjRFIiBzb3VyY2U9Il9HOXJ4dWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOXJ4b09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4MS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5cngxdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4MmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTM3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4Mi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOXJ4MnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NiIgeT0iMzA0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTM3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4M3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlyeDNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cngzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI0QzNCMDEwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOXJ4NE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMyIgeT0iMjk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI0QzNCMDEwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlyeDQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExNTUiIHk9Ii0yMjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4NWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTM3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4NS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4Nk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOXJ4NXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4Ni1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4N09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOXJ4NnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMzciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cng3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cng4T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5cng3dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4OGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4OC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cng5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5cng4dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOXJ4MC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5cngxT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzkzMSwgLTI1LCAtNTY3MiwgNzZdJFs1ODE2LCAtMjUsIC03ODcsIDc2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzkxaWh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RCIgc291cmNlPSJfRzlyeDllZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlyeGtPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaWktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlqT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOTFpaXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzkxaWgtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5MWlpT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NTcsIDAsIDE2NzZdJFswLCAtMTY4NCwgMCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOTFpamVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzkxaWp1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgzQ0U5RjAyOTEiIHR5cGU9IkNsYXNzIiBuYW1lPSJQcm9jZXNzV29ya0RlZmluaXRpb24iPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5MWlyT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MjY3IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaXNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaXMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaXRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWl0LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5MWlxZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzkxaXF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTEzMCIgeT0iMzM0NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5MWl2T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzE5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaXdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaXctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaXhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWl4LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5MWl1ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzkxaXV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjg1MyIgeT0iNzYwOCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5MWl6T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzE5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWkwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaTBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWkwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaTAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWkxT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaTFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWkxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWkxLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5MWl5ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzkxaXl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzE3IiB5PSI3NjA4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpMk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaTItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzkxaTNPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3MjYiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWkzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaTN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaTRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpNGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaTR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpNC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaTVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpNWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaTV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaTUtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzkxaTJlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOTFpMnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1OTAxIiB5PSI1NjMwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UaWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlfVGplZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Ua09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGtlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9Ua3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGstZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UbE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGxlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UbHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGwtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVG1PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlfVGl1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlfVGktZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjg1MyIgeT0iMTI2OCIgaGVpZ2h0PSIxMzc1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UbWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1N0IwMzMzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVG5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlfVG5lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3OTQiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVG4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Ub09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVG9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9Ub3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVG8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UcE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UcHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVHFPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlfVG11ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlfVG0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA3NzgiIHk9IjEyNjgiIGhlaWdodD0iMTMyMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5X1Q4LWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTkxIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9ULU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVC1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9ULXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVC0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UX09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVF9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVF91ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlfVDhPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOV9UOGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1Mzg5IiB5PSI2OTc0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UXy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMERDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlfVUEtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMxMTUiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VQi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1VDT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VQ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1VDdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VQy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1VET2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VRGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9VRHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOV9VQU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5X1VBZWZYRWR1cUhvT0piVVJaUnciIHg9Ijc5MjUiIHk9IjEwMTQ0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VRC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlfVUUtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE3MjciIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VRi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1VHT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VR2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1VHdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VRy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1VIT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VSGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9VSHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOV9VRU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5X1VFZWZYRWR1cUhvT0piVVJaUnciIHg9IjY2NTciIHk9Ijg1NTkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VLT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNzciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLUlkY2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjg0NCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRkZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZGR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRkLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZGVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRlZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZGV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRlLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWRmT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5X1VLZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlfVUt1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDA2NCIgeT0iMTAyMTkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRqLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlka3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLUlkay1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjMxOSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkbC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWRtT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkbWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWRtdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkbS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWRuT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkbmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkbnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLUlka09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWRrZWZYRWR1cUhvT0piVVJaUnciIHg9IjI1MzYiIHk9IjQ0MzgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRxT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLUlkck9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzM4NiIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkc09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWRzZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWRzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkdE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWR0ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkdHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkdC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLUlkcWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWRxdWZYRWR1cUhvT0piVVJaUnciIHg9IjEwNjUxIiB5PSIzMzQ0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkM09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDMxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1JZDRPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIzMTkiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQ0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkNWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkNS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkNmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZDYtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1JZDNlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlkM3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MTkzIiB5PSI1NjMwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR212UkotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOV9UZ09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyM0IwMDAyIiBzb3VyY2U9Il9HOTFpMk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOTFpcU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5X1RoT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOV9UZ2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlfVGd1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUyNCwgMCwgMTc2MV0kWzAsIC0xNzY5LCAwLCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c5X1RoLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOV9UaU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5X1RxZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAwNjEiIHNvdXJjZT0iX0c5X1RpZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5X1RtZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Uck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Uci1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlfVHJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkQ5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Uc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9Uc2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Ucy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyRDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UdE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjAyIiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkNGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1R0LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zOCIgeT0iMjU5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJDRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVHV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU3OCIgeT0iLTE3NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyRDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1R2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1R2ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Ud09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1R3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1R3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJEOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVHgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVHhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVHktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVHllZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5X1RxdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5X1RxLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIwOTAsIDYwOSwgLTUzNDUsIDYzNV0kWzU4MjEsIDYwOSwgLTE2MTQsIDYzNV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5X1R6T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAxMTAiIHNvdXJjZT0iX0c5X1RpZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5X1RtZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Uei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UMHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlfVDBPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QwLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkU4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UMU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UMXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyRTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UMS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjAyIiB5PSItMzQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkRFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1QydWZYRWR1cUhvT0piVVJaUnciIHg9Ii05MCIgeT0iMTU3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJERSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVDNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc4OCIgeT0iLTE3MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyRTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1Q0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1Q0T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyREUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1Q1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1Q1T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJFOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVDZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVDZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyREUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVDd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVDdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5X1R6ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5X1R6dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE4NDUsIC0zODksIC01NjIxLCAtMzg5XSRbNjA3MCwgLTM4OSwgLTEzOTcsIC0zODldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOV9VSC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFRDYwMkFFIiBzb3VyY2U9Il9HOV9VRC1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOV9UNy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5X1VJLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOV9VSU9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlfVUllZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTU1MCwgLTQ1NywgMjE0MiwgMTc3OF0kWy0yMTUwLCAtMTc4NiwgNTQxLCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c5X1VKdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOV9VSi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctSWRmZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMTAiIHNvdXJjZT0iX0c5X1VLT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5X1VELWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkZy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1JZGdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctSWRmdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLUlkZi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszMzAsIC00NTcsIC0xMzk3LCAxODI4XSRbMTM3MSwgLTE4MzcsIC0zNTUsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZGhPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWRoZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1JZGh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RCIgc291cmNlPSJfRzlfVF8tZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlfVUQtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRqT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlkaXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1JZGgtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctSWRpT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yODcsIC00NTcsIDExMzQsIDE4MjhdJFstMTE1MSwgLTE4MzcsIDI3MCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkamVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZGp1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLUlkbi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMkEwIiBzb3VyY2U9Il9HOTFpeU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLUlkai1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZG91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWRvLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLUlkb09mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1JZG9lZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTkyLCAtNTI0LCAtMjA5OSwgMTgxMV0kWzIwODIsIC0xODIwLCAtNjA5LCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWRwdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkcC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctSWR1T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyMzAxOUEiIHNvdXJjZT0iX0c5MWlxT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctSWRxT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWR2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1JZHZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctSWR1ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLUlkdXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMTMzLCAwLCAtMjk0NiwgMF0kWzMzNzgsIDAsIC0xNzAxLCAwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkdi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZHdPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLUlkd2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjlGIiBzb3VyY2U9Il9HOTFpdU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLUlkai1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWR4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLUlkd3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctSWR3LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMzUsIC01MTYsIC04NCwgMTgyMF0kWy0xMzUsIC0xODIwLCAtODQsIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZHlPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWR5ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1JZHl1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjgyMDM5MiIgc291cmNlPSJfRy1JZGotZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzkxaXFPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWR6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlkenVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1JZHktZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctSWR6T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzY2MCwgLTUyNCwgLTIyMzUsIDE3MTBdJFsyMjA5LCAtMTcxOCwgLTY4NSwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkMGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZDB1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLUlkMC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjkwMUZEIiBzb3VyY2U9Il9HLUlkai1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOV9UaWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWQxLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLUlkMU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctSWQxZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zMjEsIC01MTYsIC03MjgsIDM1NDddJFstMzIxLCAtMzU0NywgLTcyOCwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkMnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZDItZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLUlkN09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJCMUVDMUIwMzQ5IiBzb3VyY2U9Il9HLUlkM09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOTFpcU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkOGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWQ4T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLUlkN2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1JZDd1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTY0MywgLTUyNCwgMjE1MCwgMTc2MV0kWy0yMTY3LCAtMTc2OSwgNjI2LCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWQ4LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkOU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFOEYyMDEyNSIgdHlwZT0iQ2xhc3MiIG5hbWU9IldvcmtEZWZpbml0aW9uVGF4b25vbXkiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2NPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09jLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctU09kT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09kdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09lT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT2VlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09ldWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT2UtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09mT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT2ZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09mdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09mLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctU09jZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1TT2N1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iODgyMiIgeT0iMTAwNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2dPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09nLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctU09oT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzE5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09odWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09pT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT2llZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09pdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT2ktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09qT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT2plZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09qdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09qLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctU09nZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1TT2d1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjc1MSIgeT0iMjg4NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT21lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk0QTY2MDM2OCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09uT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctU09uZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09uLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT29PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09vZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT291ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09vLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT3BPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09wZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT3B1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09wLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09xT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctU09tdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1TT20tZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTAwNiIgeT0iNDc1NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3N1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU090ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctU090dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU091T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU091dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT3UtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU092T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT3ZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU092dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT3YtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU093T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU093ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctU09zLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1TT3RPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU0MjkiIHk9IjQ3NTUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU083dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPOGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLVNPOHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjcyNiIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU085ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPOXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU085LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPLU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU08tZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPLXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU08tLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPX2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLVNPNy1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctU084T2ZYRWR1cUhvT0piVVJaUnciIHg9IjE2MzAyIiB5PSI3MDc5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZZC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1iWWUtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE1NzQiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZZi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYllnT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZZ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYllndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZZy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYlloT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZaGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZaHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLWJZZU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctYlllZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02MzQiIHk9IjQ3NTUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllrT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLWJZbE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTcyNyIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlltT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWW1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlltdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWW0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlluT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWW5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlludWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYlluLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctYllrZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1iWWt1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU1NiIgeT0iNjY1NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXFlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctYllyZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzE5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllzZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWXN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWXRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll0ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWXR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYll1T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctYllxdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1iWXEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjc1MSIgeT0iNDc1NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXd1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctYll4dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzE5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWXktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll6T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWXplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWXotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlkwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYlkwZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctYll3LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1iWXhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTY5OCIgeT0iNDc1NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dtNUNJZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1TT2tPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzI5MDFGRCIgc291cmNlPSJfRy1TT2dPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1TT2NPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09rLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09sdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLVNPbE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1TT2tlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctU09rdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExNTksIC0zMzgsIC01NTk2LCAxNTQwXSRbNDkwMiwgLTEzNzEsIC0xODU0LCA1MDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctU09sLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLVNPbU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctU09xZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODMyMzAwRkUiIHNvdXJjZT0iX0ctU09tZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctU09jT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPci1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1TT3JlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctU09xdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLVNPcS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTI0LCAwLCAzMjM0XSRbMCwgLTMyNDIsIDAsIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1TT3NPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctU09zZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1TT3d1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MzE4MDBCOCIgc291cmNlPSJfRy1TT3N1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1TT2NPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU094ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU095T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLVNPeHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1TT3ctZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctU094T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03NDUsIC01MjQsIDQ3NDEsIDMyODVdJFstNDc0MSwgLTMyOTMsIDc0NSwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLVNPeWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1TT3l1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLVNPeS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDMwMDNGIiBzb3VyY2U9Il9HLVNPc3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLVNPbWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctU096LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPMHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1TTzAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1TTzF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgwIiB5PSIzNDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1TTzJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI3NiIgeT0iLTI5OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08yLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08zZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctU08zT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii01MTciIHk9IjIzNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08zdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU080T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU080ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctU08zLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU081T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU081ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctU080LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TTzZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1TTzUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU082dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU083T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TTzdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1TTzYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctU096T2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLVNPemVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTg1NCwgLTI1LCAzNjMyLCAyNV0kWy0zNjQwLCAtNDIsIDE4NDUsIDhdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLVNPX3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBEIiBzb3VyY2U9Il9HLVNPc3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLVNPN3VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TUEFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNQQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TUEJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctU1BBdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNQQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNQQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLVNQQnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjgiIHk9IjM5OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU1BDT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWVlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctU1BDZWZYRWR1cUhvT0piVVJaUnciIHg9Ii01MyIgeT0iLTM1NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWJZWXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTMiIHk9IjIyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllaT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWJZWmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzOCIgeT0iLTM1NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYllhdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctYllhT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlliZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYllidWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctYlliT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWWN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1iWWNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlljLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWWR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1iWWRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctU09fLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLVNQQU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCA1MTYsIDAsIC0xNjY3XSRbMCwgMTY1OSwgMCwgLTUyNF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctYllvT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkVENjAyQUUiIHNvdXJjZT0iX0ctYllrT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctYllkLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZcHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1iWXBPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctYllvZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLWJZb3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDU3LCAwLCAxNDIyXSRbMCwgLTE0MzAsIDAsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1iWXAtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctYllxT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1iWXVlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDJBMCIgc291cmNlPSJfRy1iWXFlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1TT2dPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll2LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWJZdmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1iWXV1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctYll1LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MjQsIDAsIDEzNTRdJFswLCAtMTM2MywgMCwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLWJZd09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1iWXdlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLWJZMHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjlGIiBzb3VyY2U9Il9HLWJZd3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLVNPZ09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWTFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWTJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctYlkxdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLWJZMC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1iWTFPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTgxMiwgLTUyNCwgMjEzMywgMTM1NF0kWy0yMTQyLCAtMTM2MywgODA0LCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctYlkyZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLWJZMnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbGktV2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDg5MUYwMkNEIj4KLSAgICAgICAgICAgIDxib2R5PjAyPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfRm9QV0VPeE1FZHVPTnJNUmdtejQ4QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQwRkQ4NTQ2MDBEOCIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDc3IiBuYW1lPSJEZWxpdmVyeVByb2Nlc3MiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbHN2Vi1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDc3Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBEZWxpdmVyeSBQcm9jZXNzZXMgaXMgYSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuCi1BIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYSBQcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIGZyb20gYmVnaW5uaW5nIHRvIGVuZC4gIEEgRGVsaXZlcnkgUHJvY2VzcyBzaGFsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIHBsYW5uaW5nIGFuZCBydW5uaW5nIGEgcHJvamVjdC4gIEl0IHByb3ZpZGVzIGEgY29tcGxldGUgbGlmZWN5Y2xlIG1vZGVsIHdpdGggcHJlZGVmaW5lZCBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIGRldGFpbGVkIGJ5IHNlcXVlbmNpbmcgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJdCBpcyBkZWZpbmVkIG9uIHRoZSBiYXNpcyBvZiBleHBlcmllbmNlIHdpdGggcGFzdCBwcm9qZWN0cyBvciBlbmdhZ2VtZW50cywgYW5kL29yIHRoZSBiZXN0IHByYWN0aWNlIHVzZSBvZiBhIGRldmVsb3BtZW50IG9yIGRlbGl2ZXJ5IGFwcHJvYWNoLiAgSXQgZGVmaW5lcyB3aGF0IGdldHMgcHJvZHVjZWQsIGhvdyB0aG9zZSBpdGVtcyBhcmUgcHJvZHVjZWQsIGFuZCB0aGUgcmVxdWlyZWQgc3RhZmZpbmcgaW4gdGhlIGZvcm0gb2YgaW50ZWdyYXRlZCBXb3JrLCBXb3JrIFByb2R1Y3QsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGUsIGEgcHJvY2VzcyBlbmdpbmVlciBjYW4gZGVmaW5lIGFsdGVybmF0aXZlIERlbGl2ZXJ5IFByb2Nlc3NlcyBmb3Igc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdHMgdGhhdCBkaWZmZXIgaW4gdGhlIHNjYWxlIG9mIHRoZSBlbmdhZ2VtZW50IGFuZCBzdGFmZmluZyBuZWNlc3NhcnksIHRoZSB0eXBlIG9mIHRoZSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiB0byBiZSBkZXZlbG9wZWQsIHRoZSBkZXZlbG9wbWVudCBtZXRob2RzIGFuZCB0ZWNobm9sb2dpZXMgdG8gYmUgdXNlZCwgZXRjLiAgQWx0aG91Z2gsIHRoZSBEZWxpdmVyeSBQcm9jZXNzIGFpbXMgdG8gY292ZXIgYSB3aG9sZSBwcm9qZWN0IGl0IGtlZXBzIGNlcnRhaW4gZGVjaXNpb24gdGhhdCBhcmUgdG9vIHByb2plY3Qgc3BlY2lmaWMgb3Blbi4gIEZvciBleGFtcGxlLCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmVzIHdoaWNoIEJyZWFrZG93biBFbGVtZW50cyBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9yIGlzIHJlcGVhdGFibGUgdmlhIGl0IHJlc3BlY3RpdmUgYXR0cmlidXRlcywgYnV0IGRvZXMgbm90IHNheSBob3cgbWFueSBvY2N1cnJlbmNlcyBhbmQgaG93IG1hbnkgcmVwZWF0cy9pdGVyYXRpb25zIGl0IHdpbGwgaGF2ZS4gIFRoZXNlIGRlY2lzaW9ucyBoYXZlIHRvIGJlIGRvbmUgYnkgYSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhIGNvbmNyZXRlIHByb2plY3QsIHByb2plY3QgcGhhc2UsIG9yIHByb2plY3QgaXRlcmF0aW9ucy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhbHdheXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiBhIHByb2Nlc3MgaW4gdGVybXMgb2YgY29tcGxldGVuZXNzIG9mIHRoZSBsaWZlY3ljbGUsIGFzIHdlbGwgYXMgaW4gdGVybXMgb2YgYWxsIHRocmVlIHZpZXdzIG9uIHRoZSBwcm9jZXNzIHdoaWNoIGFyZSB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBoYXZlIHRvIGJlIGZ1bGx5IGFuZCBjb25zaXN0ZW50bHkgcG9wdWxhdGVkLiAgQ29uc2lzdGVuY3kgb2YgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFjdHVhbGx5IGVuc3VyZWQgYnkgdGhlIGZhY3QgdGhhdCBhbGwgdGhyZWUgYnJlYWtkb3ducyBhcmUgcmVwcmVzZW50ZWQgYnkgb25lIHNpbmdsZSBkYXRhIHN0cnVjdHVyZSBhbmQgb25lIHBhcnRpY3VsYXIgYnJlYWtkb3duIHN1Y2ggYXMgVGVhbSBCcmVha2Rvd24gaXMganVzdCBhIHZpZXcgb24gdGhhdCBkYXRhIHN0cnVjdHVyZS4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExMCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExRCIgbmFtZT0iZWR1Y2F0aW9uTWF0ZXJpYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFBIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21KYlZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21KYlZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMzEiIG5hbWU9ImNvbW11bmljYXRpb25zTWF0ZXJpYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTJFIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21TbE51ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21TbE5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiIgbmFtZT0iUHJvY2VzcyIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dsc3ZXLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiPgotICAgICAgICAgICAgICA8Ym9keT5BIFByb2Nlc3MgaXMgYSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5LgotQ29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMEZFRDYwMkFFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUEzRjMwMUUyIiBuYW1lPSJpbmNsdWRlc1BhdHRlcm5zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwREMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDExOUEzRjIwMjM4Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2xfcVItZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2xfcVJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNSIgbmFtZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbHN2WC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU1Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgaXMgcHJlcGFyZWQgZm9yIGluc3RhbnRpYXRpb24gYnkgYSBwcm9qZWN0IHBsYW5uaW5nIHRvb2wuICBUeXBpY2FsbHksIGl0IGlzIGNyZWF0ZWQgYmFzZWQgb24gYSBQcm9jZXNzIHN1Y2ggYXMgYSBEZWxpdmVyeSBQcm9jZXNzIGFzIGEgd2hvbGUgKGUuZy4gaW4gY2FzZSBvZiBhIHdhdGVyZmFsbC1iYXNlZCBkZXZlbG9wbWVudCBhcHByb2FjaCkgb3IgaW4gcGFydHMgKGUuZy4gaW4gY2FzZSBvZiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpLgotQSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgZmluaXNoZWQgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgSXQgdXNlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFzIGFsbCBvdGhlciBQcm9jZXNzIFR5cGVzIHRvIHJlcHJlc2VudCB0ZW1wbGF0ZXMgZm9yIHByb2plY3QgcGxhbnMuICBIb3dldmVyLCBjZXJ0YWluIHBsYW5uaW5nIGRlY2lzaW9ucyBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kL29yIHJlZm9ybWF0dGVkIHRvIGJlIHJlYWR5IGZvciBleHBvcnQgdG8gYSBzcGVjaWZpYyBwbGFubmluZyB0b29sLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZGVjaXNpb25zIGFyZTogYSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJlcHJlc2VudCBhIHBsYW4gZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gaW4gYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IHByb2plY3QsIHdoaWNoIGZyIGV4YW1wbGUgZGlzdGluZ3Vpc2hlcyBlYXJseSBmcm9tIGxhdGUgaXRlcmF0aW9ucyBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2Ugb2YgYSBwcm9qZWN0OyBpZiB0aGUgdGFyZ2V0ZWQgcGxhbm5pbmcgdG9vbCBjYW5ub3QgcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgb2YgVGFzaywgdGhlbiB0aGVzZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmU7IGNlcnRhaW4gcmVwZXRpdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCwgZS5nLiBzdGF0aW5nIHRoYXQgYSBjeWNsZSBvZiBzcGVjaWZpYyBUYXNrIGdyb3VwZWQgaW4gYW4gQWN0aXZpdHkgaGF2ZSB0byBiZSByZXBlYXRlZCBuLXRpbWVzOyBldGMuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMTAwMTciIG5hbWU9ImJhc2VkT25Qcm9jZXNzZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTE5QTQwMDAwRTYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbF9xVU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbF9xVC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMyIiBuYW1lPSJSb2FkbWFwIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2xzdlktZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUm9hZG1hcCBpcyBhIHNwZWNpYWwgR3VpZGFuY2UgVHlwZSB3aGljaCBpcyBvbmx5IHJlbGF0ZWQgdG8gQWN0aXZhdGVzIGFuZCB0aGVyZWZvcmUgaGFzIGJlZW4gYWRkZWQgYnkgdGhpcyBwYWNrYWdlIHRvIHRoZSBsaXN0IG9mIEd1aWRhbmNlIFR5cGVzIHJhdGhlciB0aGFuIGxpc3RlZCBpbiB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZS4gIEEgUm9hZG1hcCByZXByZXNlbnRzIGEgbGluZWFyIHdhbGt0aHJvdWdoIG9mIGFuIEFjdGl2aXR5LCB0eXBpY2FsbHkgYSBQcm9jZXNzLgotQW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMTA1ODIwMzdDIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciIG5hbWU9IkFjdGl2aXR5Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2wxNVEtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgZGVmaW5pdGlvbiBvZiBBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IGludHJvZHVjZWQgaW4gdGhlIHBhY2thZ2UgQnJlYWtkb3duIHdpdGggbmV3IGNhcGFiaWxpdGllcyBhbmQgaXMgdGhlIGJhc2lzIGZvciB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY2xhc3MgUHJvY2Vzcy4KLUV4dGVuZHMgQWN0aXZpdHkgd2l0aCBhbiBhc3NvY2lhdGlvbiB0byBSb2FkbWFwLiAgVGhpcyBkZWZpbml0aW9uIG9mIEFjdGl2aXR5IGFsc28gcGFydGljaXBhdGVzIGluIHRoZSBleHRlbnNpb24gb2YgdGhlIERpc2NpcGxpbmUgY2F0ZWdvcnkuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNjUiIG5hbWU9InJvYWRtYXBzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzIiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGRDU2MUEwMzk2Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21KYlN1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21KYlNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDMiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBOUY1MDAzMjUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbWNXTS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbWNXTXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxMyIgbmFtZT0iY2hlY2tsaXN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTlBIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5RjhDMDBDNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtY1dQT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtY1dPLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOTEwMUE5IiBuYW1lPSJjb25jZXB0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTk5IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5RjkwMDI1MiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtY1dSZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtY1dST2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzIyIiBuYW1lPSJleGFtcGxlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUEzIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk0MDNCNyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtbGdJLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtbGdJdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkRBIiBuYW1lPSJndWlkZWxpbmVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGOTkwMzgzIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21sZ0xPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21sZ0stZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwODkiIG5hbWU9InJldXNhYmxlQXNzZXRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjEzQzkxMzAyQzUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGOUUwMTc4Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21sZ05lZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21sZ05PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMTI0QkVFMDBEQyIgbmFtZT0iRGlzY2lwbGluZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dsMTVSLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEJFRTAwREMiPgotICAgICAgICAgICAgICA8Ym9keT5EaXNjaXBsaW5lIGlzIGEgY2F0ZWdvcml6YXRpb24gb2YgVGFza3MgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4gIFRoaXMgaXMgdGhlIGV4dGVuc2lvbnMgb2YgRGlzY2lwbGluZSBkZWZpbmVkIGluIHRoZSBNZXRob2QgQ29yZSBwYWNrYWdlIGFkZGluZyBhbiBhZGRpdGlvbmFsIGFzc29jaWF0aW9uIHRvIEFjdGl2aXRpZXMsIHdoaWNoIHJlcHJlc2VudCB0eXBpY2FsIHN0YW5kYXJkIG9yIHJlZmVyZW5jZSB3YXlzIG9mIG1lYW5pbmdmdWwgZ3JvdXBpbmdzIG9mIHRoZSBEaXNjaXBsaW5lJ3MgVGFza3MgaW50byB3b3JrZmxvd3MuCi1UYXNrcyByZXByZXNlbnQgZGVzY3JpcHRpb25zIG9mIHdvcmssIHdoaWNoIGFyZSBjYXRlZ29yaXplZCBieSBEaXNjaXBsaW5lcy4gIFRoZSByZWFzb24gdGhhdCBzZXZlcmFsIFRhc2tzIGFyZSBhbGwgY2F0ZWdvcml6ZWQgYnkgdGhlIHNhbWUgRGlzY2lwbGluZSBpcyB0aGF0IHRoZXkgYWxsIHJlcHJlc2VudCBhIHBhcnQgaW4gYWNoaWV2aW5nIGEgaGlnaGVyIGdvYWwgb3IgcGVyZm9ybWluZyB3b3JrIHRoYXQgaXMgYWxsIHJlbGF0ZWQgdG8gZWFjaCBvdGhlci4gIEV2ZXJ5IERpc2NpcGxpbmUgZGVmaW5lcyBzdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIGl0IGNhdGVnb3JpemVzLiAgU3VjaCBzdGFuZGFyZCB3YXlzIGFyZSBleHByZXNzIGJ5IEFjdGl2aXRpZXMgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBkZWZpbmluZyBob3cgdGhlIFRhc2tzIGNhdGVnb3JpemVkIGJ5IHRoZSBEaXNjaXBsaW5lICd3b3JrIHRvZ2V0aGVyJyBpbiB0aGUgbW9zdCBnZW5lcmljIHdheS4gIFRoZXNlIHJlZmVyZW5jZSB3b3JrZmxvd3MgYXJlIG9mdGVuIHVzZWQgZm9yIGVkdWNhdGluZyBhbmQgdGVhY2hpbmcgcHJhY3RpdGlvbmVycy4gCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMEYiIG5hbWU9InJlZmVyZW5jZVdvcmtmbG93cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMTI0QzNBMDI0RSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtU2xSZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtU2xST2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUU4NjAxN0UiIG5hbWU9IlByYWN0aWNlIj4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxOUEiIG5hbWU9ImFjdGl2aXR5UmVmZXJlbmNlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5RUZFMDFDQSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtU2xUT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtU2xTLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwREMiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJuIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2wxNVRlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBEQyI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4KLUEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOgotLSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4KLS0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuCi0tIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUEzRjIwMjM4IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRTIgXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFQyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dsX3FRLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMjAyMzgiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIHRyYWNlYWJpbGl0eSBmb3IgYSBQcm9jZXNzIGRvY3VtZW50aW5nIHdoaWNoIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSBiZWVuIHVzZWQgZm9yIGRlZmluaW5nIHRoZSBwcm9jZXNzLiAgSXQgZG9jdW1lbnRzIGFwcGxpY2F0aW9ucyBvZiBhIHBhdHRlcm4gdGhyb3VnaCBjb3B5IGFzIHdlbGwgYXMgcGF0dGVybiBiaW5kaW5nLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFQyIgbmFtZT0iX3Byb2Nlc3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxMTlBM0YyMDIzOCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dsX3FTdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dsX3FTZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMDAwRTYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAxNyBfM0FEQzdCNzQwMjJENDExOUE0MDEwMDJCIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2xfcVRPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAwMDBFNiI+Ci0gICAgICAgICAgICAgIDxib2R5PklmIHRoZSBQbGFuIGhhcyBiZWVuIGNyZWF0ZWQgYmFzZWQgb24gb25lIG9yIG1vcmUgcHJvY2Vzc2VzIChpLmUuIG90aGVyIFBsYW5zLCBDYXBhYmlsaXR5IFBhdHRlcm5zLCBhIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIGFueSBjb21iaW5hdGlvbiBvZiB0aGVzZSksIHRoZW4gdGhpcyBhc3NvY2lhdGlvbiBjYXB0dXJlcyBhIHRyYWNlIGJhY2sgdG8gdGhlc2Ugc291cmNlcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMTAwMkIiIG5hbWU9Il9wcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU1IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDExOUE0MDAwMEU2Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2xfcVUtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2xfcVV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBNEY4MDIwQSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDExOUE0RjkwMDY5IF8zQURDN0I3NDAyMkQ0MTE5QTRGOTAwNzMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbF9xVmVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RjgwMjBBIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhlIFBsYW5uaW5nRGF0YSBjbGFzcyBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBNEY5MDA3MyIgbmFtZT0iX2JyZWFrZG93bkVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxMTlBNEY4MDIwQSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDU2MUEwMzk2IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNjUgXzNBREM3Qjc0MDIyRDQwRkQ1NjFDMDA3OSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtSmJSdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQTAzOTYiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGxpbmtzIGFuIEFjdGl2aXR5IHRvIHplcm8gb3IgbW9yZXMgaW5zdGFuY2VzIG9mIHRoZSBSb2FkbWFwIGd1aWRhbmNlIHR5cGUuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDc5IiBuYW1lPSJhY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFBMDM5NiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtSmJUZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtSmJUT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFBIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUIgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExRCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtSmJULWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUEiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIGd1aWRhbmNlIGRvY3VtZW50cyB0aGF0IHByb3ZpZGUgZWR1Y2F0aW9uIG1hdGVyaWFsIGZvciB0ZWFjaGluZyBzdGFrZWhvbGRlcnMgc3VjaCBhcyBwcm9qZWN0IG1hbmFnZXJzIG9uIGhvdyB0byBwZXJmb3JtIHByb2plY3RzIHRoYXQgZm9sbG93IHRoaXMgRGVsaXZlcnkgUHJvY2Vzcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUIiIG5hbWU9Il9kZWxpdmVyeVByb2Nlc3MiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNzciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbUpiVS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbUpiVXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTJFIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkYgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEzMSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtSmJXT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkUiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIGd1aWRhbmNlIGRvY3VtZW50cyB0aGF0IGhhdmUgYmVlbiByZWxhdGVkIHRvIGEgRGVsaXZlcnkgUHJvY2VzcyBpbnN0YW5jZSB0byBkZXNjcmliZSBhbmQgY2hhcmFjdGVyaXplIGl0cyBmZWF0dXJlcyBhbmQgY2FwYWJpbGl0aWVzLiBUaGVzZSBkb2N1bWVudHMgY2FuIGJlIHVzZWQgZm9yIHNldmVyYWwgcHVycG9zZXMgc3VjaCBhcyBpbnRlcm5hbCBtYXJrZXRpbmcgY29tbXVuaWNhdGlvbnMsIHNhbGVzIHRyYWluaW5nIGFuZCBnZW5lcmFsIG1ldGhvZCBlZHVjYXRpb24uICBFeGFtcGxlcyBmb3IgQ29tbXVuaWNhdGlvbnMgTWF0ZXJpYWwgYXJlIEhpZ2hsaWdodCBEb2N1bWVudCwgRmFjdCBTaGVldCwgYW5kIERlbGl2ZXJ5IFByb2Nlc3MgU3BlY2lmaWNhdGlvbiBPdmVydmlldy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkYiIG5hbWU9Il9kZWxpdmVyeVByb2Nlc3MiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNzciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbVNsTS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbVNsTXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEVGIiBuYW1lPSJCcmVha2Rvd25OZXN0aW5nIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAgXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtU2xPT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRUYiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGJpZGlyZWN0aW9uYWwgYXNzb2NpYXRpb24gcmVwcmVzZW50cyBicmVha2Rvd24gc3RydWN0dXJlIG5lc3RpbmcuICBJdCBkZWZpbmVzIGFuIG4tbGV2ZWwgaGllcmFyY2h5IG9mIEFjdGl2aXRpZXMgZ3JvdXBpbmcgdG9nZXRoZXIgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgb3RoZXIgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4KLVRoZSBzdXBlckFjdGl2aXRpZXMgcm9sZSBhbGxvd3MgbmF2aWdhdGlvbiBvZiBhIEJyZWFrZG93biBFbGVtZW50IHRvIGlzIHBhcmVudCBBY3Rpdml0eS4gVGhlIGJyZWFrZG93bkVsZW1lbnRzIHJvbGUgYWxsb3dzIG5hdmlnYXRpb24gZnJvbSBhbiBBY3Rpdml0eSB0byBpdHMgbmVzdGVkIEJyZWFrZG93biBFbGVtZW50cy4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxMjRDM0EwMjRFIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMEYgXzNBREM3Qjc0MDIyRDQyMTI0QzNCMDEzNyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtU2xRZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQTAyNEUiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIG9uZSBtb3JlIHJlZmVyZW5jZSB3b3JrZmxvd3MgZm9yIGEgRGlzY2lwbGluZS4gIFRoZSByZWZlcmVuY2Ugd29ya2Zsb3dzIGRlZmluZSB0aGUgbW9zdCB0eXBpY2FsIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgYSBEaXNjaXBsaW5lLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMTI0QzNCMDEzNyIgbmFtZT0iX2Rpc2NpcGxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyMTI0QkVFMDBEQyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMTI0QzNBMDI0RSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtU2xTT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtU2xSLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRTAxQ0EiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZGMDE5QSBfM0FEQzdCNzQwMjJENDI3QTlFRkYwMUE0Ij4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxQTQiIG5hbWU9Il9wcmFjdGljZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3QTlFODYwMTdFIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlFRkUwMUNBIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21TbFQtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21TbFR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUwMDMyNSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQzIF8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbVNsVWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGNTAwMzI1Ij4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBjYW4gYmUgdXNlZCB0byBsaW5rIGFsbCBraW5kcyBvZiBnZW5lcmFsIGd1aWRhbmNlIHRvIHRoZSBBY3Rpdml0eSB0aGF0IGlzIGJlaW5nIG1hbmFnZWQgYXMgZ2VuZXJhbCBTdXBwb3J0aW5nIE1hdGVyaWFsLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUyMDA0NSIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBOUY1MDAzMjUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbWNXTnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbWNXTmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOEMwMEM1IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMTMgXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxRCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtY1dPT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4QzAwQzUiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIEFjdGl2aXR5LSAob3IgUHJvY2Vzcy0pIHNwZWNpZmljIGNoZWNrIHBvaW50cy4gIFRoZXNlIGFyZSB0eXBpY2FsbHkgdXNlZCBpbiByZXZpZXdzIGFuZCBpbnNwZWN0aW9ucyBvbiB0aGUgd29yayBwZXJmb3JtZWQuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDFEIiBuYW1lPSJfYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5RjhDMDBDNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtY1dQLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtY1dQdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MDAyNTIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFBOSBfM0FEQzdCNzQwMjJENDI3QTlGOTEwMUI0Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR21jV1FlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkwMDI1MiI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVsYXRlcyBjb25jZXB0cyBvciB3aGl0ZXBhcGVycyB0byB0aGUgQWN0aXZpdHkgcHJvdmlkaW5nIGltcG9ydGFudCBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSBmb3IgZG9pbmcgdGhlIHdvcmsgZGVzY3JpYmVkIGJ5IHRoZSBBY3Rpdml0eS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQjQiIG5hbWU9Il9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGOTAwMjUyIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21jV1NPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21jV1ItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk0MDNCNyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzIyIF8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMkMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbWNXU3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTQwM0I3Ij4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBjYW4gcHJvdmlkZSByZWZlcmVuY2VzIHRvIGV4YW1wbGVzIHJlbGV2YW50IHRvIHRoaXMgc3BlY2lmaWMgQWN0aXZpdHkgKG9yIFByb2Nlc3MpLiAgPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzJDIiBuYW1lPSJfYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk0MDNCNyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtbGdKdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtbGdKZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5OTAzODMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJEQSBfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkU0Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR21sZ0tPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk5MDM4MyI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgQWN0aXZpdHktc3BlY2lmaWMgR3VpZGVsaW5lcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5QTAyRTQiIG5hbWU9Il9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGOTkwMzgzIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21sZ0wtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21sZ0x1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlFMDE3OCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QTlGOUYwMDg5IF8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwOEIiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbWxnTWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUUwMTc4Ij4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZWZlcnMgdG8gUmV1c2FibGUgQXNzZXRzIHNwZWNpZmljIHRvIHRoaXMgQWN0aXZpdHkgKG9yIFByb2Nlc3MpLiA8L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwOEIiIG5hbWU9Il9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGOUUwMTc4Ii8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMEQwRUQwMTA0IiBuYW1lPSJQcm9jZXNzUGFja2FnZSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HblZ1SHVmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MEY1N0RDODAxOTciPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY1N0RDODAxOTciIHR5cGU9IkNsYXNzIiBuYW1lPSJQcm9jZXNzUGFja2FnZSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSlktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1sSlpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSlp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEphZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEphLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEpiZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKYi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLWxKWWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWxKWXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTcyIiB5PSIxOTgxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKdHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTY3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1sSnV1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKdi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSndPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKd2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKdy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSnhlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1sSnQtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWxKdU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MjY2IiB5PSI1OTI4IiB3aWR0aD0iNDA0NyIgaGVpZ2h0PSIxMTE3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKeHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1sSnl1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMwMzEiIGhlaWdodD0iMTEzNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKei1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKMGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKMC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSjFlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1sSngtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWxKeU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNzUxIiB5PSI5MTM1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKMXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTUzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1sSjJ1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEoyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKMy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKNGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKNC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSjVlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1sSjEtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWxKMk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNTA2IiB5PSI2MTI5IiB3aWR0aD0iMzMxOCIgaGVpZ2h0PSIxNzY5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR25WdUlPZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyB0aGUgZGVmaW5pdGlvbiBvZiBQcm9jZXNzIFBhY2thZ2UgYW5kIHdoYXQgZWxlbWVudHMgaXQgY2FuIHN0b3JlLiAgVGhlIFByb2Nlc3MgUGFja2FnZSBwYWNrYWdlIGV4dGVuZHMgTWV0aG9kIFBhY2thZ2Ugd2l0aCB0aGUgbmV3IGNvbmNlcHQgb2YgUHJvY2VzcyBQYWNrYWdlLiAgV2hlcmVhcyB0aGUgc3BlY2lhbCBNZXRob2QgUGFja2FnZSBDb250ZW50IFBhY2thZ2VzIHN0b3JlcyBjb3JlIGNvbnRlbnQgZWxlbWVudHMsIHRoZSBQcm9jZXNzIHBhY2thZ2UgaXMgc3BlY2lhbGl6ZWQgaW4gc3RvcmluZyBQcm9jZXNzIEVsZW1lbnRzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCB2ZXJzdXMgUHJvY2VzcyBQYWNrYWdlcyBlbmZvcmNlcyB0aGUgc2VwYXJhdGlvbiBvZiBtZXRob2QgY29udGVudCB2ZXJzdXMgaXRzIGFwcGxpY2F0aW9uIGluIHByb2Nlc3Nlcy4gIE1ldGhvZCBjb250ZW50IGlzIGludGVuZGVkIGJlIHJldXNlZCBpbiBtYW55IHByb2Nlc3Nlcy4gIFRoZXJlZm9yZSwgc3RvcmluZyBtZXRob2QgY29udGVudCBhbmQgcHJvY2VzcyBlbGVtZW50cyBpbiB0aGUgc2FtZSBwYWNrYWdlIHdvdWxkIGVhc2lseSB2aW9sYXRlIHRoaXMgcHJpbmNpcGxlIGFuZCBwcm9jZXNzIG1vZGVscyB3b3VsZCBiZSBiZWNvbWUgdW5uZWNlc3NhcmlseSBjb2hlc2l2ZS4gIFRoZXJlZm9yZSwgVU1BIGVuZm9yY2VzIHRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgYW5kIFByb2Nlc3MgYnkgbm90IGFsbG93aW5nIHRvIHN0b3JlIHRoZW0gaW4gdGhlIHNhbWUgdHlwZSBvZiBwYWNrYWdlLiAiLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1sSmNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNSIgc291cmNlPSJfRy1sSllPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1sSllPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctbEpkT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii02MTAiIHk9Ii0zMTAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKZU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzE3IiB5PSItMzkxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKZS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MzgiIHk9Ii0zNTMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSmZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMyOCIgeT0iLTI5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpnT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKZ2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjM3IiB5PSItMjU0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSmh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSmhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSml1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSmlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEppLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKanVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKak9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKa3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKa09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1sSmNlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1sSmN1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbODQ3LCA1MDIsIDg0NywgNTAyXSRbODQ3LCAxODAyLCA4NDcsIDE4MDJdJFs2ODgwLCAxODAyLCA2ODgwLCAxODAyXSRbNjg4MCwgMjkxLCA2ODgwLCAyOTFdJFsxNjE0LCAyOTEsIDE2MTQsIDI5MV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctbEprLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNDkiIHNvdXJjZT0iX0ctbEpZT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctbEpZT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEptT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWxKbC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MzciIHk9Ii01MDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKbXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKbS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDczIiB5PSItODcxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSm5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKbnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjg2IiB5PSItMjc3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSm9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEpvZWZYRWR1cUhvT0piVVJaUnciIHg9IjcxMyIgeT0iLTMwOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEpwT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii03NzciIHk9Ii0zMzAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKcWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKcC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKcmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKcS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEpzZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEpyLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKdE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEp0ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEpzLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLWxKbE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLWxKbGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjE0LCA1MywgMTYxNCwgNTNdJFs2ODUzLCA1MywgNjg1MywgNTNdJFs2ODUzLCAtMTkwNSwgNjg1MywgLTE5MDVdJFsyMzksIC0xOTA1LCAyMzksIC0xOTA1XSRbMjM5LCAtNTMwLCAyMzksIC01MzBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLWxKNXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwMkU3IiBzb3VyY2U9Il9HLWxKMXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLWxKWU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctbEo2dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLWxKNS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctbEo2T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzY3LCAtODgwLCAxNiwgMzMzNV0kWzY3LCAtMzQwMywgMTYsIDgxMl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy11NllPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctdTZZZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy11Nll1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCOSIgc291cmNlPSJfRy1sSnR1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1sSjF1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NlotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZhT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLXU2WnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy11NlktZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLXU2Wk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjAzNywgODAsIDMyNTUsIC03OV0kWy0zNjI1LCA4MCwgMTY2NywgLTc5XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLXU2YWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy11NmF1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLXU2YS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzYyIiBzb3VyY2U9Il9HLWxKMXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLWxKeHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2Y09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctdTZiLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2Y3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy11NmMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzY0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2ZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy11NmR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLXU2ZWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTY4IiB5PSItMTg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy11NmZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIwNyIgeT0iMTUzMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZnZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctdTZmLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2Z3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZoZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctdTZnLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2aHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11NmllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy11NmgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11NmplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy11NmktZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctdTZiT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy11NmJlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbODQsIDg4MCwgLTE2LCAtMTgxMV0kWzg0LCAyMTI1LCAtMTYsIC01NjddIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTBBQjY2MDAzOUIiIHR5cGU9IkNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZqdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2a2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLXU2a3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2bE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2bHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZsLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2bU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZtZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2bXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZtLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2bk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2bmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLXU2ai1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctdTZrT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQwODkiIHk9Ijc0NzYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZudWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2b2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLXU2b3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11Nm8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2cE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2cHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2cU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZxZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2cXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZxLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2ck9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2cmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLXU2bi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctdTZvT2ZYRWR1cUhvT0piVVJaUnciIHg9IjM1MTMiIHk9IjQ1ODAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZ0LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNTMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2dXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLXU2dS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2dmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZ2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2di1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZ3T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2d2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZ3dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2dy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZ4T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2eGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2eHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLXU2dU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctdTZ1ZWZYRWR1cUhvT0piVVJaUnciIHg9IjE1MzkyIiB5PSIyMzUzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFVU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy00RVZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFV2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFVy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFWGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RVgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy00RVVlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFVXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NDY3IiB5PSIxMDMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWFlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEViT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctNEViZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEViLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVjZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RWN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVjLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RWRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVkZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RWR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVkLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVlT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctNEVhdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy00RWEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAzMTIiIHk9Ijc0NDIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVndWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNzEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLTRFaHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFaXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVpLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFak9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVqZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFanVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVqLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFa09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFa2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLTRFZy1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctNEVoT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE5NTU4IiB5PSI3MzkxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFNGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTgxRTMwMzQyIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy00RTVlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEU1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFNnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFN09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFN3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RThPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy00RTR1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFNC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTUxIiB5PSIxMDMzNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RS11ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctNEVfdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNjc1IiBoZWlnaHQ9IjExMDAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEZBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RkFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFVT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMVVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFVdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMVUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFWT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMVZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFWdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFWLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctNEUtLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy00RV9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjA2NTgiIHk9IjE1MzIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFXT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNjciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX0IxWE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMVhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxWU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFZZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxWXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFZLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxWk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFaZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxWnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxWi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX0IxV2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfQjFXdWZYRWR1cUhvT0piVVJaUnciIHg9IjIwMjA5IiB5PSI0MjkyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR25WdUl1ZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBwcm92aWRlcyBhbiBvdmVydmlldyB0byB0aGUgc3BlY2lmaWNhdGlvbiBvZiBQcm9jZXNzIENvbXBvbmVudHMuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctdTZydWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0ctdTZqdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctdTZudWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2c2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2dE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy11NnN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctdTZyLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLXU2c09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTU4LCAwLCAyMzM2XSRbMCwgLTIzNDUsIDAsIDU1MF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy11NnRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctdTZ0dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy00RVlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgc291cmNlPSJfRy00RVVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy11Nmp1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFWk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy00RVllZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctNEVZdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03MTEsIC01NTgsIDI4OTUsIDIyODZdJFstMjkxMiwgLTIyOTQsIDY5NCwgNTUwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLTRFWi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy00RWFPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLTRFZWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q2IiBzb3VyY2U9Il9HLTRFYWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLXU2anVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctNEVmZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLTRFZXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctNEVlLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMDMyLCA4LCA1MDgwLCAtNDJdJFstNTk2OSwgOCwgMTE0MywgLTQyXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLTRFZ09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy00RWdlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLTRFa3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0NEIiBzb3VyY2U9Il9HLTRFVU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLTRFZ3VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFbC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RW1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctNEVsdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0QwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFbXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTY4NCIgeT0iLTI5NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0QwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RW5lZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAyIiB5PSIzMTMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQ0UiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RW9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ1NyIgeT0iMjM3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RW91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQ0UiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEVvLWZYRWR1cUhvT0piVVJaUnciIHg9IjY5NSIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzRDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVxT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEVwdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQ0UiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVyT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEVxdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNEMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RXNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQ0UiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RXRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctNEVrLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy00RWxPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTM3MSwgLTkzLCAtMTE3MzQsIDI5MDRdJFsxMzA2NCwgLTkzLCAtNDIsIDI5MDRdJFsxMzA2NCwgLTI1MTQsIC00MiwgNDgyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy00RXRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFBMDMxRSIgc291cmNlPSJfRy00RWd1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy00RWFlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFdWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDIxOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI1MiIgeT0iLTI5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV2LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDIxOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEV3T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTAxNkIxQjAxRDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXctZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjM1IiB5PSIxOTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMTZCMUIwMUQzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFeHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjgxIiB5PSItMzA0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDIxOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RXktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDFEMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RXotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXplZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEUwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMTZCMUIwMjE5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFMC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFMGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDFEMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFMS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFMWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy00RXR1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLTRFdC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjM4NywgNTAsIDcyMTMsIC01MF0kWy03NTY5LCA1MCwgMjAzMiwgLTUwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy00RTJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDFCRDZBMDIzQiIgc291cmNlPSJfRy00RWd1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy11Nm51ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEUyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEUzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFM09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy00RTJlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLTRFMnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjA5MSwgLTQ4MiwgMTQ2MjEsIDIyNjBdJFstMjA5MSwgLTI0OTcsIDE0NjIxLCAyNDVdJFstMTQ5OTQsIC0yNDk3LCAxNzE4LCAyNDVdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctNEUzLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLTRFNE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctNEU4ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODIxQjAwODciIHNvdXJjZT0iX0ctNEU0ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctdTZqdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEU5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFOS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy00RTllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctNEU4dWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLTRFOC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNjIsIC00OTEsIC0xMzEyLCAyMzAyXSRbMTI0NCwgLTIyNDMsIC0zMzAsIDU1MF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy00RS1PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctNEUtZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR19CMWFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCOSIgc291cmNlPSJfR19CMVdPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy11NnQtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFidWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX0IxYk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR19CMWFlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dfQjFhdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMjUzLCAtNDkxLCAzNzI1LCAxNDM5XSRbLTM2OTksIC0xNDM5LCAxMjc4LCA0OTFdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfQjFiLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX0IxY09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0dfQjFjZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkEiIHNvdXJjZT0iX0ctNEVndWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfQjFXT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxZC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19CMWRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFlZWZYRWR1cUhvT0piVVJaUnciIHg9IjE5OSIgeT0iLTI5OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMWZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM3IiB5PSIxMDIzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFmLWZYRWR1cUhvT0piVVJaUnciIHg9IjYyIiB5PSItMTYwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMWd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzAiIHk9IjEwMTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxaC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxaGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxaS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxaWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFqLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFqZWZYRWR1cUhvT0piVVJaUnciIHg9Ijc5NCIgeT0iOTc4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0Ixay1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0Ixa2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR19CMWN1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dfQjFjLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00OTEsIDAsIDI2MDddJFswLCAtMjYxNiwgMCwgNDgyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR19CMWxPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUyMDA0RCIgc291cmNlPSJfRy00RTRlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR19CMVdPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMW1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFtdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX0IxbU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMW0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUzMDEzQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMW5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMW5PZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM4NzIiIHk9Ii03NzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxbnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxM0MiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0Ixbi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMW9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTg5RTMwMTE0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFvdWZYRWR1cUhvT0piVVJaUnciIHg9IjE3MzMiIHk9Ii0zMDAwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxMTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFwZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTg5RTMwMTNDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxcXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxcU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTg5RTMwMTE0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxcnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0Ixck9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxM0MiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFzdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFzT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTg5RTMwMTE0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjF0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjF0T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HX0IxbGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dfQjFsdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzMzOCwgNDgyLCAtMTc5NDksIDY1MjddJFszMzgsIDE2NDIsIC0xNzk0OSwgNzY4N10kWzIzNTU0LCAxNjQyLCA1MjY2LCA3Njg3XSRbMjM1NTQsIC02MjU2LCA1MjY2LCAtMjExXSRbMjAwMjMsIC02MjU2LCAxNzM1LCAtMjExXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR19CMXQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0JGNDM5MDFCQiIgc291cmNlPSJfR19CMVdPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy00RS11ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX0IxdS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0JGNDNBMDM5RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMXYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDE0IiB5PSIxOTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixd2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzOUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0Ixd3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjF4ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMzgiIHk9IjE4NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzMkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjF5T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDkiIHk9Ii03MzYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzlEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxemVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxeS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxMGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0Ixei1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMTB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzOUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjExT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjExZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjEwLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjEyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjExLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HX0IxdU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dfQjF1ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzUwLCAtNDgyLCAwLCAyMjA5XSRbNTAsIC0yMTQyLCAwLCA1NTBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR201Q0ktZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBEMEVEMDEwNCI+Ci0gICAgICAgICAgICA8Ym9keT4wMzwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX3IwVlJJT3hoRWR1SGplM3BQYWhONEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MURGMkExQjAyRTciLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE2NyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtNUNMZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNjciPgotICAgICAgICAgICAgICA8Ym9keT5BIFByb2Nlc3MgQ29tcG9uZW50IGlzIGEgc3BlY2lhbCBQcm9jZXNzIFBhY2thZ2UgdGhhdCBhcHBsaWVzIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uICBBIFByb2Nlc3MgQ29tcG9uZW50IHJlYWxpemVzIG9uZSBvciBtb3JlIEludGVyZmFjZXMgd2hpY2ggc3BlY2lmeSBpbnB1dHMgYW5kIG91dHB1dHMgb2YgdGhlIGNvbXBvbmVudC4gVGhlcmUgbWlnaHQgYmUgbWFueSBjb21wb25lbnRzIHJlYWxpemluZyB0aGUgc2FtZSBpbnRlcmZhY2VzLCBidXQgdXNpbmcgZGlmZmVyZW50IHRlY2huaXF1ZXMgdG8gYWNoaWV2ZSBzaW1pbGFyIG91dHB1dHMgZm9yIHNpbWlsYXIgaW5wdXRzLiAgV2hlcmVhcyB0aGUgQ29tcG9uZW50IEludGVyZmFjZXMgcmVwcmVzZW50IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucyAoYmxhY2sgYm94IGRlc2NyaXB0aW9ucyBvZiB0aGUgY29tcG9uZW50KSwgZ29vZCBjYW5kaWRhdGVzIGZvciBjb21wb25lbnQgcmVhbGl6YXRpb25zIGNhbiBiZSBmb3VuZCBpbiBDYXBhYmlsaXR5IFBhdHRlcm5zICh3aGl0ZSBib3ggZGVzY3JpcHRpb25zIGZvciB0aGUgY29tcG9uZW50KS4KLVVNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAmcXVvdDtibGFjayBib3gmcXVvdDsuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICZxdW90O3JlYWxpemF0aW9uJnF1b3Q7IGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCOSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE1MyI+Ci0gICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfb0NRcGNPLWRFZHU1T09lankwNjI0dyIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9vQ1FwY2UtZEVkdTVPT2VqeTA2MjR3IiBrZXk9ImV4dGVuZCIvPgotICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICAgIDwvZ2VuZXJhbGl6YXRpb24+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JEIiBuYW1lPSJpbnRlcmZhY2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNzEiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JBIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25DTUl1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25DTUllZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzJGIiBuYW1lPSJwcm9jZXNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QkY0MzkwMUJCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25WdUUtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25WdUV1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA1ODFFMzAzNDIiIG5hbWU9IlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR201Q01lZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4MUUzMDM0MiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgUHJvY2VzcyBDb21wb25lbnQgYXBwbGljYXRpb24gaW4gYSBQcm9jZXNzLCBpLmUuIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluaW5nIHRoZSBQcm9jZXNzLiAgVGhlIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgZGV0YWlscyBvZiB0aGUgY29tcG9uZW50IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgdG8gcHJvdmlkZSBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzIHN1Y2ggYXMgaXQgb3duIHByZWRlY2Vzc29ycyBhbmQgc3VjY2Vzc29ycy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA1ODIxQjAwODciIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxMTQiIG5hbWU9Il9wcm9jZXNzQ29tcG9uZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNjciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTA1ODlFMjAwNEQiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hbkw5SmVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hbkw5Sk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3MSIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duQ01FLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNzEiPgotICAgICAgICAgICAgICA8Ym9keT5BIFByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZSBjb21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDFCRDZBMDIzQiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNEMCIgbmFtZT0iaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQ0QiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hbkw5RnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hbkw5RmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDFEMyIgbmFtZT0iaW50ZXJmYWNlSU8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTAxNkIxQTAzMUUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hbkw5SE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hbkw5Ry1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTUzIiBuYW1lPSJQcm9jZXNzUGFja2FnZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duQ01GLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNTMiPgotICAgICAgICAgICAgICA8Ym9keT5Qcm9jZXNzIFBhY2thZ2UgaXMgYSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4KLUEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAyRTciIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjMiIG5hbWU9InByb2Nlc3NFbGVtZW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0duVnVIT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0duVnVHLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkEiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCQiBfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JEIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR25DTUctZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCQSI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVzY3JpYmVzIHRoZSByZWFsaXphdGlvbiByZWxhdGlvbnNoaXBzIGJldHdlZW4gYSBQcm9jZXNzIENvbXBvbmVudCBhbmQgYSBQcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2UuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JCIiBuYW1lPSJyZWFsaXplZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNjciIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JBIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25DTUgtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25DTUh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNDRCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0NFIF8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzRDAiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbkNNSk9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0NEIj4KLSAgICAgICAgICAgICAgPGJvZHk+SW5zdGFuY2VzIG9mIHRoaXMgYXNzb2NpYXRpb24gY29udGFpbiB0aGUgbGlzdCBvZiBUYXNrIERlc2NyaXB0b3JzIHRoYXQgcmVwcmVzZW50IGEgUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNDRSIgbmFtZT0iX3Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNzEiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQ0QiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hbkw5RS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hbkw5RXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFBMDMxRSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDEwMTZCMUIwMUQzIF8zQURDN0I3NDAyMkQ0MTAxNkIxQjAyMTkiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hbkw5R09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMTZCMUEwMzFFIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBjb250YWlucyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3QgdHlwZSBpbnN0YW5jZXMgdXNlZCBmb3IgdGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDIxOSIgbmFtZT0iX3Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3MSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxMDE2QjFBMDMxRSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0duTDlILWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0duTDlIdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwNTg5RTIwMDREIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxMTQgXzNBREM3Qjc0MDIyRDQxMDU4OUUzMDEzQyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duTDlJZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMjAwNEQiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZSBkZXNjcmlwdG9yIHRvIHRoZSBQcm9jZXNzIENvbXBvbmVudCBpdCByZWZlcnMgdG8uICBBIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgcmVwcmVzZW50cyBleGFjdGx5IG9uZSBQcm9jZXNzIENvbXBvbmVudC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxM0MiIG5hbWU9Il9wcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDEwNTgxRTMwMzQyIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDEwNTg5RTIwMDREIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25MOUtPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25MOUotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0JGNDM5MDFCQiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzJGIF8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzOUQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hbkw5S3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QkY0MzkwMUJCIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBQcm9jZXNzIENvbXBvbmVudCBjb250YWlucyBvbmx5IGV4YWN0bHkgb25lIFByb2Nlc3MuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzlEIiBuYW1lPSJfcHJvY2Vzc0NvbXBvbmVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTY3IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QkY0MzkwMUJCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25WdUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25WdUZlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MyBfM0FEQzdCNzQwMjJENDI4M0VEODkwMzY0Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR25WdUdPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUHJvY2VzcyBQYWNrYWdlIGNvbnRhaW5zIFByb2Nlc3MgRWxlbWVudHMgd2hpY2ggYXJlIHVzZWQgdG8gZGVmaW5lIEJyZWFrZG93biBhbmQgUHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVsZW1lbnQgaW5zdGFuY2UgY2FuIGJlIHBhcnQgb2Ygb25seSBvbmUgUHJvY2VzcyBQYWNrYWdlIGluc3RhbmNlLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2NCIgbmFtZT0iX3Byb2Nlc3NQYWNrYWdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNTMiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjIiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURGMkExQjAyRTciIG5hbWU9IlByb2Nlc3NEZXNjcmlwdGlvbnMiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR29PZTUtZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDFFRDY4MkIwMTcwIj4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFRDY4MkIwMTcwIiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtZHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMTA0MTEwMzg3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR19MbWV1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM0MzciIGhlaWdodD0iMTk5OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1lLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1mLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtZ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1nZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtZ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1nLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtaE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtaGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX0xtZC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfTG1lT2ZYRWR1cUhvT0piVVJaUnciIHg9IjUzOTMiIHk9Ijg4MDUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1odWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRDFCNjAwRDgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX0xtaXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNTE0NyIgaGVpZ2h0PSIxMTUxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1qZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbWotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1rT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbWtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1rdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbWstZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1sT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1sZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfTG1oLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19MbWlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjM1MyIgeT0iNjM4MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWx1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTEwNDU1MDIwOCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1tZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfTG1tdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI1NDM1IiBoZWlnaHQ9IjMyNjgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1uT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbW5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1udWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtbi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbW9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtb2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbW91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtby1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbXBlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19MbWwtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX0xtbU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI0NTUwIiB5PSIxNDU0OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXB1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTEwNDc0MDExQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1xZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfTG1xdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTM5IiBoZWlnaHQ9IjE5OTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1yT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtci1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtc2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbXRlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19MbXAtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX0xtcU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1MzQyIiB5PSIxMTk1NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1FPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUQ3QjQ5MDA4NiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfVXdST2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NDM2IiBoZWlnaHQ9IjExNTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3UmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3U2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1N1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3Uy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1RPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3VGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1R1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd1QtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19Vd1FlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX1V3UXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1NzUiIHk9Ijg4MjIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdVT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3VS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX1V3Vk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDE4MiIgaGVpZ2h0PSIxNTQwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3VnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3V09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd1dlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdXdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd1ctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdYT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd1hlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdYdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdYLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfVXdVZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd1V1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjc1NSIgeT0iMTM5NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2hPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk3Rjc0MDM5MiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfVXdpT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NTM4IiBoZWlnaHQ9IjE1NDAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3aWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3amVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2p1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3ai1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2tPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3a2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2t1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd2stZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19Vd2hlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX1V3aHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjU4IiB5PSIzNTk4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR29PZTZlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBkZWZpbml0aW9uIG9mIHRleHR1YWwgZGVzY3JpcHRpb24gYXR0cmlidXRlcyBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSBmb3IgUHJvY2Vzc2VzIHRoYW4gZm9yIE1ldGhvZCBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBUaGUgcmF0aW9uYWxlIGZvciB0aGlzIGNhbiBiZSBmb3VuZCBpbiBwYWNrYWdlIE1ldGhvZCBVbml0cyBpbiB3aGljaCB0aGUgZ3JhbnVsYXJpdHkgb2YgTWV0aG9kIFVuaXRzIGZvciB0aGVzZSBlbGVtZW50cyBoYXMgYmVlbiBkZWZpbmVkIGRpZmZlcmVudGx5LiAgV2hlcmVhcyBhIENvbnRlbnQgRGVzY3JpcHRpb24gTWV0aG9kIFVuaXQgaXMgY3JlYXRlZCBmb3IgZXZlcnkgQ29udGVudCBFbGVtZW50LCBQcm9jZXNzIGlzIG1haW50YWluZWQgYXMgYSB3aG9sZSBpbiBhIFByb2Nlc3MgQ29tcG9uZW50IE1ldGhvZCBVbml0LiAgVGhlcmVmb3JlIHRoZSBwYWNrYWdlIE1ldGhvZCBDb3JlIERlc2NyaXB0aW9uIGNvbnRhaW5zIGEgdGF4b25vbXkgb2Ygc3BlY2lhbCBDb250ZW50IERlc2NyaXB0aW9uIHNwZWNpYWxpemF0aW9uIGFuZCB0aGUgUHJvY2VzcyBEZXNjcmlwdGlvbnMgcGFja2FnZSBjb250YWlucyBleHRlbmRlZCB2ZXJzaW9uIG9mIGNsYXNzZXMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlIHdoaWNoIG1lcmdlIG5ldyBhdHRyaWJ1dGVzIGZvciBkZXNjcmlwdGlvbiBpbnRvIHRoZXNlIGNsYXNzZXMgdmlhIHBhY2thZ2UgbWVyZ2UuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0dfVXdZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5OEM4MDAzQkEiIHNvdXJjZT0iX0dfTG1wdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfTG1kdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3WS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3WnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd1pPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dfVXdZZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HX1V3WXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtMTAwNywgMCwgMjE0Ml0kWzAsIC0yMTUwLCAwLCA5OTldIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfVXdaLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX1V3YU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0dfVXdhZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5OENBNDAyRDEiIHNvdXJjZT0iX0dfTG1sdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfTG1wdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3Yk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3Yi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd2JlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dfVXdhdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR19Vd2EtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUwLCAtMTY0MiwgMCwgMjExNl0kWy01MCwgLTI3NjAsIDAsIDk5OV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR19Vd2NPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfVXdjZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR19Vd2N1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4Q0U5MDJDQSIgc291cmNlPSJfR19Vd1FPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR19MbWh1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdlT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX1V3ZHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR19Vd2MtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HX1V3ZE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils4NTUsIC01ODQsIC0xMjc4LCAxODU0XSRbODU1LCAtMTg2MiwgLTEyNzgsIDU3NV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR19Vd2VlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfVXdldWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR19Vd2UtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4QzZGMDE5NyIgc291cmNlPSJfR19MbWR1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR19MbWh1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdnZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX1V3Zi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR19Vd2ZPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HX1V3ZmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNDE0LCAtMTAwNywgMTc2OSwgMTgzN10kWy00MTQsIC0yMjc3LCAxNzY5LCA1NjddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfVXdndWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX1V3Zy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0dfVXduZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5OENDQzAzNkEiIHNvdXJjZT0iX0dfTG1odWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfVXdoT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3b09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3by1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd29lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dfVXdudWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR19Vd24tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTgsIC01NzUsIC04LCAyMDE1XSRbLTgsIC0xODIwLCAtOCwgNzcwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX1V3cE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR19Vd3BlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR25lNER1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREYyQTFCMDJFNyI+Ci0gICAgICAgICAgICA8Ym9keT4wNDwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX0ladF9NT3hNRWR1T05yTVJnbXo0OEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEZEODkxRjAyQ0QiLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBEMUI2MDBEOCIgbmFtZT0iQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5OENDQzAzNkEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0Mjc5N0Y3NDAzOTIiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTM3NjI3RDAwODQiIG5hbWU9InVzYWdlR3VpZGFuY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR25lNEctZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMzc2MjdEMDA4NCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+UHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfRllicndleUpFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfRllicndPeUpFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfRlFZakFPeUpFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTEwNDExMDM4NyIgbmFtZT0iQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OThDNkYwMTk3IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFFMEQxQjYwMEQ4Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkU0IiBuYW1lPSJwdXJwb3NlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dub3BCT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyRTQiPgotICAgICAgICAgICAgICAgIDxib2R5PlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfN0pFVXdleUlFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfN0pFVXdPeUlFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfNl9QRFVPeUlFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzNTIiIG5hbWU9ImFsdGVybmF0aXZlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hbnh5OHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzUyIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX1pibllJZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1pibllJT3lIRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX1pTLVpnT3lIRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEzNzYyODMwMTVBIiBuYW1lPSJob3d0b1N0YWZmIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dueHk5ZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTM3NjI4MzAxNUEiPgotICAgICAgICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGJhY2tncm91bmQgb24gd2hvIHNob3VsZCBiZSBpbnZvbHZlZCBpbiB0aGlzIGFjdGl2aXR5IHdoYXQgYXJlIHRoZSByZXF1aXJlZCBza2lsbHMsIGV4cGVyaWVuY2UsICBhbmQgcGVyaGFwcyBhdHRpdHVkZXMuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfWFRyM3dleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfWFRyM3dPeUdFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfWEtKaFFPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTEwNDU1MDIwOCIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk4Q0E0MDJEMSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRTEwNDc0MDExQSIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM3MSIgbmFtZT0ic2NhbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR254eS11ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM3MSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+T3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2NsTTBzZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2NsTTBzT3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2NhZUxZT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzdBIiBuYW1lPSJwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dueHlfZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzN0EiPgotICAgICAgICAgICAgICAgIDxib2R5PkNoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3M8L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il82TE96Z2V5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il82TE96Z095SUVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il82RExxd095SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM4NCIgbmFtZT0icmlza0xldmVsIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duN2o4dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzODQiPgotICAgICAgICAgICAgICAgIDxib2R5Pk91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfZ1Z2Um9leUhFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfZ1Z2Um9PeUhFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfZzZQczRPeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzODUiIG5hbWU9ImVzdGltYXRpbmdUZWNobmlxdWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR243ajllZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM4NSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+RGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9ZWndTZ2V5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9ZWndTZ095SEVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9ZUFVrSU95SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM4RSIgbmFtZT0icHJvamVjdE1lbWJlckV4cGVydGlzZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbjdqLU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzhFIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il8tazdDZ2V5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tazdDZ095R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYU1aTU95R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM5OCIgbmFtZT0idHlwZU9mQ29udHJhY3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR243ai0tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM5OCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+UHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udHJhY3RzIHRoYXQgbmVlZCB0byBiZSBlc3RhYmxpc2hlZCBiZXR3ZWVuIGEgcHJvamVjdCB0ZWFtIHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9jZXNzIGFuZCBhIGNsaWVudCAoZS5nLiBmb3IgYW4gSUdTIGVuZ2FnZW1lbnQpLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0lMMW5nZXlKRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0lMMW5nT3lKRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0lFaXNzT3lKRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUxMDQ3NDAxMUEiIG5hbWU9IlByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OThDODAwM0JBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFFMTA0MTEwMzg3Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0FDIiBuYW1lPSJzY29wZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb0ZVOC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0FDIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5EZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9lRW1WY2V5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9lRW1WY095SEVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9kN052OE95SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNBRCIgbmFtZT0idXNhZ2VOb3RlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb0ZVOXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0FEIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5BbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3UxQU5BZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3UxQU5BT3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3VyZDJnT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVEN0I0OTAwODYiIG5hbWU9IkRlc2NyaXB0b3JEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OThDRTkwMkNBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFFMEQxQjYwMEQ4Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFRDdCNjUwMzk0IiBuYW1lPSJyZWZpbmVkRGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29GVS0tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUQ3QjY1MDM5NCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+QSBEZXNjcmlwdG9yIG1pZ2h0IGFkZCByZWZpbmVtZW50cyB0byB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0aGUgQ29udGVudCBFbGVtZW50IGl0IHJlZmVycyB0by4gIEZvciBleGFtcGxlLCBpdCBjb3VsZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBXb3JrIFByb2R1Y3QgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lIGluIHRoZSBwcm9jZXNzIHRoaXMgV29yayBQcm9kdWN0IHR5cGUgaXMgYmVpbmcgdXNlZC4gIEl0IGNvdWxkIGRlc2NyaWJlIGFkZGl0aW9uYWwgc2tpbGxzIG5lZWRlZCBmb3IgYSBSb2xlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIGEgcHJvY2VzcywgZXRjLiA8L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9IU2VXa2V5SkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9IU2VXa095SkVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9IS2JOME95SkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIzNzVFMDQwMzkwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzMgXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3NSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvRlVfdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNDAzOTAiPgotICAgICAgICAgICAgICA8Ym9keT5MaXN0IHRoZSBzdGVwcyB0aGF0IGhhdmUgYmVlbiBzZWxlY3RlZCB0byBiZSBwZXJmb3JtZWQgZm9yIHRoZSBpbnN0YW5jZSBvZiB0aGUgVGFzayBEZXNjcmlwdG9yLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3NSIgbmFtZT0iX3Rhc2tEZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjM3NUUwNDAzOTAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hb09lNXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hb09lNWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBGQiIgbmFtZT0iTWV0aG9kUGx1Z2luIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HcEgyd09mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MEY1N0FDODAzNUUiPgotICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNTdBQzgwMzVFIiB0eXBlPSJDbGFzcyIgbmFtZT0iTWV0aG9kUGx1Z2luIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotQU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTA0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1BLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQXotQk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1DT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LUNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LUMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LURPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LURlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1ELWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEF6LUFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEF6LUF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM0OTUiIHk9IjM4NDMiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LU0tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEF6LU4tZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ1MDQiIGhlaWdodD0iMTYyNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LU9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LU9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LU91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1QT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1QZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1QdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1QLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1RT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1RZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotUXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBei1OT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBei1OZWZYRWR1cUhvT0piVVJaUnciIHg9IjQ1MDQiIHk9IjM3MDgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEF6LWplZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4MjciIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXota2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXota3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotay1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotbE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotbGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotbHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotbC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LW1PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQXotaXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQXotaS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDIxOSIgeT0iOTk5Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZELWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkEzNjAyQzEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBOXZFLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNTA2IiBoZWlnaHQ9IjExMzQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEE5dkdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEE5dkd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEE5dkhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBOXZIdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEE5dkVPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEE5dkVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAxNzYiIHk9IjY2NDYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dwSDJ3dWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW1zIHNob3dzIHRoZSBkZWZpbml0aW9uIG9mIE1ldGhvZCBQbHVnaW5zLiBNZXRob2QgUGx1Z2lucyBleHRlbmQgZWFjaCBvdGhlciBhbmQgYXJlIHRoZSBjb250YWluZXIgb2YgYWxsIE1ldGhvZCBQYWNrYWdlcy4iLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQXotRU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU3IiBzb3VyY2U9Il9IQXotQU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQXotQU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1FLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1GZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBei1GT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijk5OCIgeT0iMzE3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkVBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1HT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQ4MiIgeT0iNzY5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotR3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1IT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LUctZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM4NyIgeT0iNzc4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotSGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRTgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotSHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTM4MiIgeT0iMjcxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1JZWZYRWR1cUhvT0piVVJaUnciIHg9Ii03OTIiIHk9Ii0zMDMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1JLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRUEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LUp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotSk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRTgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LUt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotS09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1MZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotTHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1MT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1MLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRTgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotTXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1NT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBei1FZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBei1FdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI2MDcsIC0yNDUsIDI2MDcsIC0yNDVdJFs0ODE3LCAtMjQ1LCA0ODE3LCAtMjQ1XSRbNDgxNywgMTgzNywgNDgxNywgMTgzN10kWzU1MCwgMTgzNywgNTUwLCAxODM3XSRbNTUwLCA1NzUsIDU1MCwgNTc1XSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQXotUS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ1IiBzb3VyY2U9Il9IQXotTS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQXotQU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1SdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1TT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQXotUi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1TLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjMiIHk9IjM2NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1UdWZYRWR1cUhvT0piVVJaUnciIHg9IjExMzkiIHk9Ii0yODgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1VT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1VdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1VZWZYRWR1cUhvT0piVVJaUnciIHg9IjQzNiIgeT0iNDU3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotVS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1WZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotVk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjUiIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1WdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LVdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotVi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LVhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotVy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJEOCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1ZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotWWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1YLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1ZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotWk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotWmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1ZLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBei1ST2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBei1SZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIyNTIsIC0xMjcsIC03MDk1LCAtMjVdJFs2NzM5LCAtMTI3LCAtMjYwNywgLTI1XSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQXotWnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDQ5IiBzb3VyY2U9Il9IQXotTS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQXotTS1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1hZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1hLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQXotYXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1idWZYRWR1cUhvT0piVVJaUnciIHg9IjQ1MiIgeT0iLTg1NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1jZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjAwIiB5PSItODg3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotZE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTI3MSIgeT0iLTIzMyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1lT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotZC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjIxIiB5PSIzMjMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1lZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LWZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotZXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LWdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotZnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1nLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotaE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1ndWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1oZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotaU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1odWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBei1aLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBei1hT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMjUyLCA1MCwgLTIyNTIsIDUwXSRbLTQ0ODcsIDUwLCAtNDQ4NywgNTBdJFstNDQ4NywgMTg2MiwgLTQ0ODcsIDE4NjJdJFstMTIxOSwgMTg2MiwgLTEyMTksIDE4NjJdJFstMTIxOSwgODEyLCAtMTIxOSwgODEyXSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQXotbWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQUQ1RjgwMzhFIiBzb3VyY2U9Il9IQXotTS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQXotaWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQTl2QWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQXotbXVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBei1tLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzMTIsIC04MjEsIC0zNTY0LCAyMTc1XSRbNDAwNCwgLTI0NzIsIC04NzIsIDUyNF0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBOXZCT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEE5dkJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBOXZCdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZBREMwMTAyOEQiIHNvdXJjZT0iX0hBei1BT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBei1pZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2RE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBOXZDdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBOXZCLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEE5dkNPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg4OSwgLTU4NCwgMzU4MSwgMjMxMV0kWy0zNjQ5LCAtMjM3MCwgODIxLCA1MjRdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQTl2RGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBOXZEdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQTl2SC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMENDMEEwMUQ3IiBzb3VyY2U9Il9IQXotTS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQTl2RC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQTl2SS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQTl2SU9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBOXZJZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE0MTMsIDgxMiwgLTMyNTksIC0xODc5XSRbMzY5MSwgMjExNiwgLTk4MiwgLTU3NV0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBOXZKdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEE5dkotZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBOXZLT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjUxOEJENzAxRTMiIHNvdXJjZT0iX0hBei1BT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBOXZELWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2THVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBOXZMT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBOXZLZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEE5dkt1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTk5MCwgNTc1LCAzNjgzLCAtMjIxOF0kWy0zNzQyLCAyMjE4LCA5MzEsIC01NzVdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQTl2TC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBOXZNT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGOUM1RjAwMkUxIiB0eXBlPSJDbGFzcyIgbmFtZT0iVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2TWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2TmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQTl2TXVmWEVkdXFIb09KYlVSWlJ3IiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiIGRlc2NyaXB0aW9uPSJ7dmFyaWFiaWxpdHlTcGVjaWFsRWxlbWVudC50eXBlKCkgPT0gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudC50eXBlKCl9IDoge3ZhcmFiaWxpdHkgY2FuIG9ubHkgYmUgZGVmaW5lZCBiZXR3ZWVuIENvbnRlbnRFbGVtZW50cyBvZiB0aGUgc2FtZSBzdWJ0eXBlLCBlLmcuIFJvbGVzIHdpdGggUm9sZXMsIGJ1dCBub3QgUm9sZXMgYW5kIFRhc2tzfSIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEE5dk0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjcyMyIgeT0iNzc4OCIgd2lkdGg9Ijk1OTYiIGhlaWdodD0iMTYyNSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2TnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNkIwMDIwMkVDIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQTl2T3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjkxMiIgaGVpZ2h0PSI0MTY1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2Ty1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2UE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2UGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2UHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkVudW1lcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQTl2UU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2UWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQTl2UXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2US1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQTl2Uk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBOXZOLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBOXZPT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEzMTk1IiB5PSIyMjA1Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZSZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNDk1MDAxRjUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBOXZTZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0OTYxIiBoZWlnaHQ9IjE1NzQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQTl2VHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2VC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQTl2VU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnQU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQkhnQWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnQXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ0EtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQTl2UnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgc2hvd0xpc3RTaWduYXR1cmU9InRydWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEE5dlItZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjM4OSIgeT0iMTE1OSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnaWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTQ5NjIwMjBGIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQkhnamVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjg3OCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ2tlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ2t1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ2stZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ2xPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ2xlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ2x1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ2wtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCSGdtT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEJIZ2l1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEJIZ2ktZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA2MyIgeT0iOTczOCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnbWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTg4NjgwM0U1Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGduT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQkhnbmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ291ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ28tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ3BPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ3BlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ3B1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ3AtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCSGdxT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEJIZ211ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIHNob3dMaXN0U2lnbmF0dXJlPSJ0cnVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCSGdtLWZYRWR1cUhvT0piVVJaUnciIHg9IjE3NjYiIHk9IjQxOTQiIHdpZHRoPSI2OTg1IiBoZWlnaHQ9IjE1ODMiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FBMEFFMDM5RCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEJRcVNlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE1NzQiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFUZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFUdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFULWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFVT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFVZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFVdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFVLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxVk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hCUXFSdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCUXFSLWZYRWR1cUhvT0piVVJaUnciIHg9IjMwMzUiIHk9IjgyOTUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVotZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk1NTQ1MDEzNCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEJRcWEtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE1NzQiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFiLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFjT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFjZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFjdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFjLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFkT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFkZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxZHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hCUXFhT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCUXFhZWZYRWR1cUhvT0piVVJaUnciIHg9IjQ1MTciIHk9Ijk3MTQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dwSDJ4T2ZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgaG93IGNvbnRlbnQgZWxlbWVudHMgY2FuIGRlZmluZSB2YXJpYXRpb25zIG9mIG9uZSBhbmQgYW5vdGhlci4gICIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hCSGdxZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTAiIHNvdXJjZT0iX0hCSGdtZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hCSGdtZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ3JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ3J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEJIZ3JlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyMDMiIHk9Ii0zNDkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXA4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFwOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcDhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI4NyIgeT0iLTI2NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcDgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFwOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXA5T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii02MDQiIHk9IjIzNiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcDl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0ExIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcC1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcDktZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTcwNiIgeT0iLTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcC1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXAtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFwLXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5NDIiIHk9IjI4MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcF9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXBfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFwXy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXBfZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxQS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXFBZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0EyIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcUJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFCLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcUJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcUNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFDLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcUNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEJIZ3F1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEJIZ3EtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbODU1LCA3ODcsIDg1NSwgNzg3XSRbODU1LCAxNjUxLCA4NTUsIDE2NTFdJFs2NjgwLCAxNjUxLCA2NjgwLCAxNjUxXSRbNjY4MCwgLTUwLCA2NjgwLCAtNTBdJFszNDg4LCAtNTAsIDM0ODgsIC01MF0iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEJRcURPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0hBOXZNZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hCSGdxZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEJRcURlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEJRcUR1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEyNywgLTgyMSwgMTg2LCAxNDM5XSRbLTMxMywgLTIyNjAsIDAsIDBdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQlFxRC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hCUXFFT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQlFxSS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTU4QjYwMThCIiBzb3VyY2U9Il9IQkhnaWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQkhnbWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcUtlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQlFxSi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQlFxSk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQlFxSmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3OTUsIC00NDgsIC0xNzQ0LCA0NzgzXSRbNzk1LCAtNDQ1MywgLTE3NDQsIDc3OF0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hCUXFLdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEJRcUstZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hCUXFYdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQTBEMzAyNDUiIHNvdXJjZT0iX0hCUXFSZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hCSGdtZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxWk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCUXFZdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hCUXFYLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hCUXFZT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE1OSwgLTMxNywgLTE0NTUsIDMzMDddJFsxNTksIC0yODMxLCAtMTQ1NSwgNzkzXSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEJRcVplZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQlFxWnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEJRcWQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY1MDIxMyIgc291cmNlPSJfSEJRcVotZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEJRcVotZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFmZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEJRcWUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY3MDFCQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxZi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI0MzUiIHk9IjE5MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUJDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxZ3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzIwIiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NzAxQjEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxaGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzk0IiB5PSI0MDciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NzAxQjEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcWlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMyNSIgeT0iMzM5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUJDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFqZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcWktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUIxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFrZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcWotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NzAxQkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcWxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxay1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUIxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcW1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcW1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxbC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQlFxZU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQlFxZWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3ODcsIDIwMywgNzg3LCAyMDNdJFsxOTEzLCAyMDMsIDE5MTMsIDIwM10kWzE5MTMsIDEzNjMsIDE5MTMsIDEzNjNdJFs4LCAxMzYzLCA4LCAxMzYzXSRbOCwgNDQ4LCA4LCA0NDhdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hCYWE5T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NTU2MDAxNzAiIHNvdXJjZT0iX0hCUXFaLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hCSGdtZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJhYTktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJhYS1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQmFhLXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCYWEtT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hCYWE5ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hCYWE5dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NDgsIDUwLCA0NzMyXSRbMCwgLTQzOTQsIDUwLCA3ODddIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQmFhLS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hCYWFfT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9KeFBmNGV4WkVkdU9Ock1SZ216NDhBIiBlbGVtZW50PSJfSnhQZjRPeFpFZHVPTnJNUmdtejQ4QSIgc291cmNlPSJfSEJIZ21lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEE5dlJlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9KeFBmNU94WkVkdU9Ock1SZ216NDhBIiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9KeFBmNXV4WkVkdU9Ock1SZ216NDhBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0p4UGY1LXhaRWR1T05yTVJnbXo0OEEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9KeFBmNWV4WkVkdU9Ock1SZ216NDhBIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9KeFBmNHV4WkVkdU9Ock1SZ216NDhBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0p4UGY0LXhaRWR1T05yTVJnbXo0OEEiIHBvaW50cz0iWy0yMywgLTMwLCA4OCwgMTAzXSRbLTExNiwgLTE2MCwgLTUsIC0yN10iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTU3QjIwMDA4NyIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCYWFfZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRkIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJhYkFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hCYWJBZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCYWJBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCYWJBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCYWJCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJhYkJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQmFiQnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEJhYV91ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEJhYV8tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzAxMyIgeT0iNTIzIiB3aWR0aD0iMzE0OCIgaGVpZ2h0PSIxMDgzIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2s5T25zT3huRWR1d09ia0lBNngxZ0EiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRDBFRDAxMDQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfazlPbnMteG5FZHV3T2JrSUE2eDFnQSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2s5T250T3huRWR1d09ia0lBNngxZ0EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2s5T250ZXhuRWR1d09ia0lBNngxZ0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2s5T250dXhuRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2s5T250LXhuRWR1d09ia0lBNngxZ0EiIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfazlPbnVPeG5FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rOU9udWV4bkVkdXdPYmtJQTZ4MWdBIiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfazlPbnNleG5FZHV3T2JrSUE2eDFnQSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfazlPbnN1eG5FZHV3T2JrSUE2eDFnQSIgeD0iNjMyIiB5PSIzMjIzIiB3aWR0aD0iMzE0OCIgaGVpZ2h0PSIxMDgzIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3p6THZVT3huRWR1d09ia0lBNngxZ0EiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNDc4RTAwMEQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfenpMdlUteG5FZHV3T2JrSUE2eDFnQSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX3p6THZWT3huRWR1d09ia0lBNngxZ0EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3p6THZWZXhuRWR1d09ia0lBNngxZ0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3p6THZWdXhuRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3p6THZWLXhuRWR1d09ia0lBNngxZ0EiIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfenpMdldPeG5FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il96ekx2V2V4bkVkdXdPYmtJQTZ4MWdBIiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfenpMdlVleG5FZHV3T2JrSUE2eDFnQSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfenpMdlV1eG5FZHV3T2JrSUE2eDFnQSIgeD0iNTM5NiIgeT0iMzIyNSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3BIMnh1ZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249InxUaGUgTWV0aG9kLVBsdWdpbiBwYWNrYWdlIGRlZmluZXMgZXh0ZW5zaWJpbGl0eSBhbmQgdmFyaWFiaWxpdHkgbWVjaGFuaXNtcyBmb3IgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEl0IHByb3ZpZGVzIG1vcmUgZmxleGliaWxpdHkgaW4gZGVmaW5pbmcgZGlmZmVyZW50IHZhcmlhbnRzIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYnkgYWxsb3dpbmcgY29udGVudCBhbmQgcHJvY2VzcyBmcmFnbWVudHMgdG8gYmUgcGx1Z2dlZC1pbiBvbiBkZW1hbmQgY3JlYXRpbmcgdGFpbG9yZWQgb3Igc3BlY2lhbGl6ZWQgY29udGVudCBvbmx5IHdoZW4gaXQgaXMgcmVxdWlyZWQgYW5kIHdoaWNoIGNhbiBiZSBtYWludGFpbmVkIGFzIHNlcGFyYXRlIHVuaXRzIHdvcmtlZCBvbiBieSBkaXN0cmlidXRlZCB0ZWFtcy4mI3hBO3xNZXRob2RzIGFuZCBQcm9jZXNzZXMgYXJlIG5ldmVyIGRldmVsb3BlZCBpbiBpc29sYXRpb24uICBNYW55IGNvbmN1cnJlbnQgdGVhbXMgb2YgcHJvY2VzcyBlbmdpbmVlcnMgbWlnaHQgd29yayBvbiBkaWZmZXJlbnQgb3IgdGhlIHNhbWUgcGFydHMgb2YgYSBNZXRob2QgQ29udGVudCBvciBwYXJ0aWN1bGFyIFByb2Nlc3Nlcy4gIFRoZXkgaGF2ZSB0byBlaXRoZXIgY29vcmRpbmF0ZSB0aGVpciB3b3JrIG9yIHByZWZlcmFibHkgdG8gbW9kdWxhcml6ZSBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBkZWZpbml0aW9ucyB0aGF0IHRoZXkgY2FuIHdvcmsgb24gaW4gaXNvbGF0aW9uIHdpdGhvdXQgYW55IHNoYXJlZCByZXNvdXJjZSBwcm9ibGVtcy4mI3hBO3xNb3Jlb3Zlciwgd29yayBvbiBhIGRldmVsb3BtZW50IFByb2Nlc3MgaXMgbmV2ZXIgZmluYWwgYmVjYXVzZSB0aGV5IGhhdmUgdG8gYmUgdGFpbG9yZWQgZm9yIGV2ZXJ5IHNwZWNpZmljIHByb2plY3Qgc2l0dWF0aW9uLiAgVG8gYXZvaWQgZGV2ZWxvcGluZyBEZWxpdmVyeSBQcm9jZXNzZXMgZnJvbSBzY3JhdGNoIGZvciBldmVyeSBzcGVjaWZpYyBwcm9qZWN0IHNpdHVhdGlvbiBhIHRydWx5IHJldXNhYmxlIFByb2Nlc3MgYWxsb3dzIGRlZmluaW5nIG1hbnkgZGlmZmVyZW50IHZhcmlhdGlvbnMgb24gaXQuICBUaGVyZWZvcmUsIHRhaWxvcmluZyBhbmQgZXh0ZW5zaW9uIG9mIHByZS1kZWZpbmVkIHByb2Nlc3NlcyBpcyBhIGtleSByZXF1aXJlbWVudCBmb3Igb3JnYW5pemF0aW9ucyBhZG9wdGluZyBhbmQgaW1wbGVtZW50aW5nIHByb2Nlc3Nlcy4gICBGb3IgZXhhbXBsZSwgaW1hZ2UgYSBzY2VuYXJpbyBpbiB3aGljaCBhIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBwdXJjaGFzZXMgYSB0aGlyZC1wYXJ0eSBEZWxpdmVyeSBQcm9jZXNzIGZyb20gYSBtZXRob2QgdmVuZG9yIGFuZCBpdHMgdW5kZXJseWluZyBtZXRob2QgY29udGVudC4gIFdoaWxlIGltcGxlbWVudGluZyB0aGUgcHJvY2VzcyBpbiB0aGVpciBvcmdhbml6YXRpb24gdGhleSBtaWdodCBkaXNjb3ZlciB0aGF0IHRoZXkgd291bGQgbGlrZSB0byB0YWlsb3IgdGhlIHByb2Nlc3MgdG8gdGhlaXIgcGFydGljdWxhciBuZWVkcyBhbmQgb3JnYW5pemF0aW9uIHNwZWNpZmljIHZhcmlhdGlvbnMuICBJZiB0aGV5IHdvdWxkIGRpcmVjdGx5IG1vZGlmeSB0aGUgcHVyY2hhc2VkIHByb2Nlc3MgdGhleSB3b3VsZCBtaW5nbGUgdGhlaXIgYWRkaXRpb25zIGFuZCBjaGFuZ2VzIHdpdGggdGhlIG9yaWdpbmFsIHByb2Nlc3MuICBJZiBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbCBwcm9jZXNzIGlzIHJlbGVhc2VkIGJ5IHRoZSB2ZW5kb3IgaXQgd291bGQgYmUgdmVyeSBoYXJkIGZvciB0aGVtIHRvIGZpbmQgYW5kIHJlcHJvZHVjZSB0aGVzZSBjaGFuZ2VzIHRvIHRoZSBuZXcgcHJvY2VzcyB2ZXJzaW9uLiYjeEE7fFRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gYWRkcyB0aGUgY2FwYWJpbGl0aWVzIG9mIG1vZHVsYXJpemF0aW9uIGFuZCBleHRlbnNpYmlsaXR5IG9mIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMgdG8gVU1BLiAgSW4gb3RoZXIgd29yZHMsIGl0IHN1cHBvcnRzIHRhaWxvcmluZyBvZiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzIHdpdGhvdXQgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZW0sIGJ1dCBieSBkZXNjcmliaW5nIGNoYW5nZXMgZnJvbSBhIHNlcGFyYXRlIHVuaXQgY2FsbGVkIGEgTWV0aG9kIFBsdWctaW4uICBUaGlzIG5ldyBjYXBhYmlsaXR5IGlzIGFjaGlldmVkIGJ5IGFkZGluZyBuZXcgY29uY2VwdHMgdG8gdGhlIG1ldGEtbW9kZWw6ICYjeEE7fC0gQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQbHVnaW5zLiAgTWV0aG9kIFBsdWdpbnMgYXJlIGNvbnRhaW5lcnMgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEV2ZXJ5IE1ldGhvZCBFbGVtZW50IGlzIHBhcnQgb2YgZXhhY3RseSBvbmUgTWV0aG9kIFBsdWdpbiwgaS5lLiBNZXRob2QgUGx1Z2lucyBwYXJ0aXRpb24gdGhlIHNwYWNlIG9mIGFsbCBNZXRob2QgRWxlbWVudHMuICAmI3hBO3wtIE1ldGhvZCBQbHVnaW5zIGNhbiBkZWZpbmUgZXh0ZW5zaW9ucyB0byBvdGhlciBNZXRob2QgUGx1Z2lucy4gIE9uZSBNZXRob2QgUGx1Z2luIGNhbiBkZWZpbmUgZXh0ZW5zaW9ucyBmb3IgbWFueSBvdGhlciBQbHVnaW5zIGFuZCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBQbHVnaW5zLiYjeEE7fC0gVGhlIE1ldGhvZCBQbHVnaW4gbWV0YS1tb2RlbCBwYWNrYWdlIGFkZHMgYSBuZXcgc2V0IG9mIHJlbGF0aW9uc2hpcHMgYW5kIHNlbWFudGljcyB0byBzcGVjaWZpYyBNZXRob2QgRWxlbWVudHMgdGhhdCBkZWZpbmUgaG93IHRoZXNlIE1ldGhvZCBFbGVtZW50cyBjYW4gZXh0ZW5kIGVhY2ggb3RoZXIgYWNyb3NzIHRoZSBib3VuZGFyeSBvZiBNZXRob2QgUGx1Z2lucyBvciBNZXRob2QgUGFja2FnZXMgKHRvIGFsbG93IG1vZHVsYXJpemF0aW9uIGV2ZW4gd2l0aGluIG9uZSBNZXRob2QgUGx1Z2luKS4mI3hBO3xUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGRlZmluZSB0aGUgZGV0YWlsZWQgcnVsZXMgZm9yIHRoZXNlIGV4dGVuc2lvbnMgZm9yIHNwZWNpZmljIE1ldGhvZCBFbGVtZW50cy4mI3hBOyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX1JuSWVFZXhaRWR1T05yTVJnbXo0OEEiIGVsZW1lbnQ9Il9SbkllRU94WkVkdU9Ock1SZ216NDhBIiBzb3VyY2U9Il9IQmFhX2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9rOU9uc094bkVkdXdPYmtJQTZ4MWdBIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JuSWVGT3haRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JuSWVGdXhaRWR1T05yTVJnbXo0OEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUm5JZUdPeFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9SbkllRi14WkVkdU9Ock1SZ216NDhBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfUm5JZUZleFpFZHVPTnJNUmdtejQ4QSIgeD0iLTI3IiB5PSI4OTkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX1JuSWVFdXhaRWR1T05yTVJnbXo0OEEiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1JuSWVFLXhaRWR1T05yTVJnbXo0OEEiIHBvaW50cz0iWzAsIDU1NiwgMjM4MSwgLTIxNDNdJFstMjM4MSwgMjE0MywgMCwgLTU1Nl0iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfdzN2TnNleHVFZHVNMTR1bldhcVA1USIgZWxlbWVudD0iX3czdk5zT3h1RWR1TTE0dW5XYXFQNVEiIHNvdXJjZT0iX0hCYWFfZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX3p6THZVT3huRWR1d09ia0lBNngxZ0EiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdzN2TnRPeHVFZHVNMTR1bldhcVA1USIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdzN2TnR1eHVFZHVNMTR1bldhcVA1USIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il93M3ZOdU94dUVkdU0xNHVuV2FxUDVRIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3czdk50LXh1RWR1TTE0dW5XYXFQNVEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il93M3ZOdGV4dUVkdU0xNHVuV2FxUDVRIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il93M3ZOc3V4dUVkdU0xNHVuV2FxUDVRIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il93M3ZOcy14dUVkdU0xNHVuV2FxUDVRIiBwb2ludHM9Ils4LCAyMSwgLTgzLCAtODFdJFszNSwgMTIzLCAtNTYsIDIxXSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb1lQNE9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEZCIj4KLSAgICAgICAgICA8Ym9keT4wMzwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfUm5JZUVPeFpFZHVPTnJNUmdtejQ4QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxRTBEMEVEMDEwNCIvPgotICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX3czdk5zT3h1RWR1TTE0dW5XYXFQNVEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MURFNDc4RTAwMEQiLz4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMDQiIG5hbWU9Ik1ldGhvZFBsdWdpbiI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb1lQOHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTA0Ij4KLSAgICAgICAgICAgIDxib2R5PkEgTWV0aG9kIFBsdWdpbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLU1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4KLTwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGQURDMDEwMjhEIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+Ci0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNTE4QkQ3MDFFMyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERGQTM2MDJDMSIvPgotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUFFNzA3MzAzQjgiIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9Hb1lQOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgIDxib2R5PnRydWU8L2JvZHk+Ci0gICAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDgiIG5hbWU9Im1ldGhvZFBhY2thZ2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ1Ij4KLSAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dvLUZ3ZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hby1Gd09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFQSIgbmFtZT0iYmFzZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEwNCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRTciPgotICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR28tRnl1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dvLUZ5ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNDk2MjAyMEYiIG5hbWU9IkNvbnRlbnRFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvWVAtZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNDk2MjAyMEYiPgotICAgICAgICAgICAgPGJvZHk+Q29udGVudCBFbGVtZW50IGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBub3QgZGlyZWN0bHkgZnJvbSBNZXRob2QgRWxlbWVudCBhbnltb3JlLiAgVGhpcyBpcyBhY2hpZXZlZCB1c2luZyBVTUwgMi4wIHBhY2thZ2UgbWVyZ2Ugc2VtYW50aWNzLiAgT25seSBpZiBhbiBhZG9wdGVyIG9mIHRoaXMgbWV0YS1tb2RlbCBkZWNpZGVzIHRvIHJlYWxpemUgTWV0aG9kIFBsdWdpbnMsIGhlIHdvdWxkIGdldCB0aGUgdmFyaWFiaWxpdHkgYW5kIGV4dGVuc2lvbiBjYXBhYmlsaXRpZXMgZm9yIGFsbCBDb250ZW50IEVsZW1lbnRzLgotQ29udGVudCBFbGVtZW50IGluaGVyaXRzIHRoZSBzZW1hbnRpY3Mgb2YgVmFyaWFiaWxpdHkgRWxlbWVudC4KLTwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTU4QjYwMThCIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDIxRTg4NjgwM0U1Ii8+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU0OTUwMDFGNSIgbmFtZT0iTWV0aG9kRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb1lQX3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTQ5NTAwMUY1Ij4KLSAgICAgICAgICAgIDxib2R5Pk1ldGhvZCBFbGVtZW50IGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gYWRkcyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdmlhIHBhY2thZ2UgbWVyZ2UgdG8gTWV0aG9kIEVsZW1lbnQgZGVmaW5lZCBpbiBNZXRob2QgQ29yZSBuZWVkZWQgZm9yIHRoZSB2YXJpYWJpbGl0eSBhbmQgZXh0ZW5zaWJpbGl0eSBjYXBhYmlsaXRpZXMgaW50cm9kdWNlcyBpbiB0aGlzIHBhY2thZ2UuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MThBQ0EwQTAwRUIiIG5hbWU9InN1cHByZXNzZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb2lBNC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDE4QUNBMEEwMEVCIj4KLSAgICAgICAgICAgICAgPGJvZHk+SWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlIEV4dGVuZHMgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9Hb2lBNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5PgotICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIzOEU5NEQwMDNGIiBuYW1lPSJvcmRlcmluZ0d1aWRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb2lBNS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzOEU5NEQwMDNGIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgQ0FTRSB0b29sIHJlYWxpemF0aW9ucyBvZiB0aGlzIG1vZGVsIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgbGF5b3V0IGFuZCBvcmRlcmluZyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgYW5kIGl0cyBwYXJ0cy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzlyUVBrZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il85clFQa095R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfOWh0NUVPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjZCMDAyMDJFQyIgbmFtZT0iVmFyaWFiaWxpdHlUeXBlIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvaUE2dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY2QjAwMjAyRUMiPgotICAgICAgICAgICAgPGJvZHk+VmFyaWFiaWxpdHkgVHlwZSBpcyBhbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGOUM2QTMwMzM4IiBuYW1lPSJuYSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvaUE3ZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY5QzZBMzAzMzgiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGlzIHRoZSBkZWZhdWx0ICZxdW90O25vdCBhc3NpZ25lZCZxdW90OyB2YWx1ZSBvZiBhIFZhcmlhYmlsbGl0eSBFbGVtZW50J3MgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSB3aGljaCBpcyBzZXQgaW4gdGhlIGNhc2Ugbm8gdmFyaWFiaWxpdHkgYXNzb2NpYXRpb24gaXMgcHJlc2VudCBiZXR3ZWVuIHRoZSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBvdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50cy4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNkIwMUYwM0MwIiBuYW1lPSJjb250cmlidXRlcyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvckswdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY2QjAxRjAzQzAiPgotICAgICAgICAgICAgICA8Ym9keT5Db250cmlidXRlcyBwcm92aWRlcyBhIHdheSBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHRvIGNvbnRyaWJ1dGUgdGhlaXIgcHJvcGVydGllcyBpbnRvIHRoZWlyIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGFsdGVyaW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcywgaS5lLiBpbiBhbiBhZGRpdGl2ZSBmYXNoaW9uLiAgUHJvcGVydGllcyBjb250cmlidXRlZCBhcmU6IGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uIGluc3RhbmNlcy4gIFRoZSBlZmZlY3QgYWZ0ZXIgaW50ZXJwcmV0YXRpb24gb2YgY29udHJpYnV0aW9uIGlzIHRoYXQgdGhlIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBsb2dpY2FsbHkgcmVwbGFjZWQgd2l0aCBhbiBhdWdtZW50ZWQgdmFyaWFudCBvZiB0aGUgZWxlbWVudCB0aGF0IGNvbWJpbmVzIGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uIGluc3RhbmNlcy4gIFRoZSB3YXkgdGhpcyBjb21iaW5hdGlvbiBpcyByZWFsaXplZCBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUgb3IgYXNzb2NpYXRpb24uICBGb3IgZXhhbXBsZSwgU3RyaW5nIGF0dHJpYnV0ZXMgYXJlIGNvbmNhdGVuYXRlZCByZXNvbHZpbmcgZW1iZWRkZWQgY29tbWFuZHMgZm9yIGRlcGVuZGVudCB0ZXh0IG9yIG1lcmdpbmcgdGV4dCBmcmFnbWVudHMgKGUuZy4gZGVzY3JpcHRpb25zIGZvciBjb250ZW50IGVsZW1lbnRzKS4gIEFkZGl0aW9uYWwgZWxlbWVudHMgaW4gdG8tbWFueSBhc3NvY2lhdGlvbnMgYXJlIGFkZGVkIChlLmcuIGFkZGl0aW9uYWwgR3VpZGFuY2UgZWxlbWVudHMgb3IgVGFzayBEZXNjcmlwdG9ycyBvZiBhbiBBY3Rpdml0eSkuICBEaWZmZXJlbnQgZWxlbWVudHMgaW4gdG8tb25lIGFzc29jaWF0aW9ucyBhcmUgaWdub3JlZCAoZS5nLiB0aGUgb25lIFByaW1hcnkgUGVyZm9ybWVyIG9mIGEgVGFzaykuICBNdWx0aXBsZSBDb250ZW50IEVsZW1lbnRzIGNhbiBjb250cmlidXRlIHRvIHRoZSBzYW1lIGJhc2UgZWxlbWVudCBhbmQgYWxsIG9mIHRoZXNlIGNvbnRyaWJ1dGlvbnMgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gdGhlIGJhc2UgaW4gdGhlIHNhbWUgZmFzaGlvbi4gVGhlIGZvbGxvd2luZyB0YWJsZSBwcm92aWRlcyB0aGUgZGV0YWlsZWQgbGlzdCBvZiBpbnRlcnByZXRhdGlvbiBydWxlczoKLWF0dHJpYnV0ZSB2YWx1ZXM6CVN0cmluZyB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSBjb25jYXRlbmF0ZWQgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudC4gIE90aGVyIHZhbHVlcyBmcm9tIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgYW55IG90aGVyIHR5cGUgc3VjaCBhcyBJbnRlZ2VyLCBEYXRlIGFyZSBpZ25vcmVkLgotVGhlIGlkZW50aWZ5aW5nIGF0dHJpYnV0ZXMgZ3VpZCBhbmQgbmFtZSBvZiBNZXRob2QgRWxlbWVudCBhcmUgZXhlbXB0IGZyb20gdGhpcyBydWxlIGFuZCB3aWxsIG5vdCBiZSBtb2RpZmllZC4KLTAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOglUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGtlcHQgYW5kIGFueSBhc3NvY2lhdGlvbiBmcm9tIHRoZSBjb250cmlidXRpbmcgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGlnbm9yZWQuCi0wLi5uLWFzc29jaWF0aW9uIGluc3RhbmNlczoJQXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIGFkZGVkIHRvIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgYmFzZWQtb24gZWxlbWVudC4gIElmIGJvdGggVmFyaWFiaWxpdHkgRWxlbWVudHMgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0IHRoZW4gb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhlIGFzc29jaWF0aW9uIHdpbGwgcmVtYWluLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY2QjAxODAxRTAiIG5hbWU9ImV4dGVuZHMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb3JLMWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNkIwMTgwMUUwIj4KLSAgICAgICAgICAgICAgPGJvZHk+RXh0ZW5zaW9uIGFsbG93cyBNZXRob2QgUGx1Z2lucyB0byBlYXNpbHkgcmV1c2UgZWxlbWVudHMgZnJvbSBhIEJhc2UgUGx1Z2luIGJ5IHByb3ZpZGluZyBhIGtpbmQgb2YgaW5oZXJpdGFuY2UgZm9yIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBBdHRyaWJ1dGUgdmFsdWVzIGFuZCBBc3NvY2lhdGlvbiBpbnN0YW5jZXMgYXJlIGluaGVyaXRlZCBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IHRvIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBUaGUgcmVzdWx0IG9mIGludGVycHJldGF0aW9uIGlzIHRoYXQgdGhlIHNwZWNpYWwgZWxlbWVudCBoYXMgdGhlIHNhbWUgcHJvcGVydGllcyBhcyB0aGUgYmFzZWQtb24gaGFzLCBidXQgbWlnaHQgZGVmaW5lIGl0cyBvd24gYWRkaXRpb25zLiAgSGVuY2UgZXh0ZW5kcyBpcyBub3QgdXNlZCB0byBtb2RpZnkgY29udGVudCBvZiB0aGUgYmFzZSBQbHVnaW4sIGJ1dCB0byBwcm92aWRlIHRoZSBhYmlsaXR5IGZvciB0aGUgZXh0ZW5kaW5nIFBsdWdpbiB0byBkZWZpbmUgaXRzIG93biBjb250ZW50IHdoaWNoIGlzIGEgdmFyaWFudCBvZiBjb250ZW50IGFscmVhZHkgZGVmaW5lZCAoZS5nLiBhIHNwZWNpYWwgdmVyc2lvbiBvZiBhIGdlbmVyaWMgUmV2aWV3IFJlY29yZCBmb3IgYSBzcGVjaWZpYyB0eXBlIG9mIHJldmlldykuICBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB0aGUgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBhbnkgbnVtYmVyIG9mIGV4dGVuZGluZyBWYXJpYWJpbGl0eSBFbGVtZW50cyBjYW4gYmUgdXNlZCBzaWRlIGJ5IHNpZGUsIGJ1dCByZWZlciB0byBlYWNoIG90aGVyIHZpYSB0aGUgZXh0ZW5kcyByZWxhdGlvbnNoaXAuICBFeHRlbmRzIGFsc28gcHJvdmlkZXMgdGhlIGtleSBtZWNoYW5pc20gZm9yIGJpbmRpbmcgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0byBQcm9jZXNzZXM6IEEgcGF0dGVybiBpcyBhcHBsaWVkIGJ5IGRlZmluaW5nIGFuIGV4dGVuZHMgcmVsYXRpb25zaGlwcyBmcm9tIGFuIEFjdGl2aXR5IG9mIHRoZSBhcHBseWluZyBQcm9jZXNzZXMgdG8gdGhlIFBhdHRlcm4uICBUaGUgQWN0aXZpdHkgaW5oZXJpdHMgYXNzb2NpYXRpb25zIGluc3RhbmNlcyBmcm9tIHRoZSBwYXR0ZXJuIGFuZCB0aGUgcGF0dGVybiBhcHBlYXJzIHRvIGJlIHBhcnQgb2YgdGhlIHJlc3VsdGluZyBQcm9jZXNzIGFmdGVyIEludGVycHJldGF0aW9uLgotYXR0cmlidXRlIHZhbHVlczoJVmFsdWVzIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IGVsZW1lbnQgYXJlIGluaGVyaXRlZCBhbmQgdXNlZCB0byBwb3B1bGF0ZSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50cyBhdHRyaWJ1dGVzLiAgSWYgdGhlIHNwZWNpYWwgZWxlbWVudCBhdHRyaWJ1dGVzIGFyZSBhbHJlYWR5IHBvcHVsYXRlZCB0aGUgaW5oZXJpdGVkIHZhbHVlcyBhcmUgaWdub3JlZC4gIAotVGhlIGlkZW50aWZ5aW5nIGF0dHJpYnV0ZXMgZ3VpZCBhbmQgbmFtZSBvZiBNZXRob2QgRWxlbWVudCBhcmUgZXhlbXB0IGZyb20gdGhpcyBydWxlIGFuZCB3aWxsIG5vdCBiZSBtb2RpZmllZC4KLTAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOglUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGluaGVyaXRlZCB0byB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgSWYgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBkZWZpbmVzIGl0cyBvd24gYXNzb2NpYXRpb24gaW5zdGFuY2UgdGhlbiB0aGUgaW5oZXJpdGVkIG9uZSBpcyBpZ25vcmVkLgotMC4ubi1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CUFzc29jaWF0aW9uIGluc3RhbmNlcyBkZWZpbmVkIGZvciB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgaW5oZXJpdGVkIHRvIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBUaGUgc3BlY2lhbCBlbGVtZW50IGNhbiBhZGQgYWRkaXRpb25hbCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuCi0KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNkIwMUMwMjg2IiBuYW1lPSJyZXBsYWNlcyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvcksyT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY2QjAxQzAyODYiPgotICAgICAgICAgICAgICA8Ym9keT5SZXBsYWNlcyBwcm92aWRlcyBhIHdheSBmb3IgVmFyaWFiaWxpdHkgRWxlbWVudHMgdG8gcmVwbGFjZSBhIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGNoYW5naW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcy4gIFRoaXMgaXMgaW4gbW9zdCBjYXNlcyB1c2VkIGZvciBNZXRob2QgUGx1Z2lucyB0aGF0IGFpbSB0byByZXBsYWNlIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFzaywgb3IgQWN0aXZpdGllcyB3aXRoIGVpdGhlciBhIGNvbXBsZXRlIG5ldyB2YXJpYW50IG9yIHRvIGNoYW5nZSBmdW5kYW1lbnRhbCByZWxhdGlvbnNoaXBzIG9mIHRoZXNlIGVsZW1lbnRzIChlLmcuIFJvbGUtQXJ0aWZhY3QgcmVzcG9uc2liaWxpdHkpLiAgUHJvcGVydGllcyByZXBsYWNlZCBhcmUgYXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24gaW5zdGFuY2VzLiAgVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgdGhlIGJhc2UgQ29udGVudCBFbGVtZW50IGlzIGxvZ2ljYWxseSByZXBsYWNlZCB3aXRoIHRoaXMgbmV3IHZhcmlhbnQgb2YgdGhlIGVsZW1lbnQgdG8gd2hpY2ggYWxsIGluY29taW5nIGFzc29jaWF0aW9ucyBzdGlsbCBwb2ludCBhcyBiZWZvcmUsIGJ1dCB3aGljaCBoYXMgcG90ZW50aWFsbHkgbmV3IGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIG91dGdvaW5nIGFzc29jaWF0aW9uIHByb3BlcnRpZXMuICBUaGlzIHByb3ZpZGVzIGEgdmVyeSBwb3dlcmZ1bCBtZWNoYW5pc20gdG8gcmVwbGFjZSwgZm9yIGV4YW1wbGUsIHdob2xlIEFjdGl2aXRpZXMgaW4gYSBQcm9jZXNzIHdpdGggY29tcGxldGUgbmV3IHJlYWxpemF0aW9ucyBvZiB0aGUgQWN0aXZpdHkuICBGb3IgaW5zdGFuY2UsIHJlcGxhY2luZyBhbiBBY3Rpdml0eSBkb2luZyB1c2UgY2FzZS1iYXNlZCBkZXNpZ24gd2l0aCBhbiBhY3Rpdml0eSBkb2luZyBhZ2lsZSBjb2RlLWNlbnRyaWMgZGV2ZWxvcG1lbnQgZG9pbmcgdGhlIHNhbWUgd29yayB1c2luZyBhIGRpZmZlcmVudCBkZXZlbG9wbWVudCB0ZWNobmlxdWUgdXRpbGl6aW5nIGRpZmZlcmVudCBSb2xlcywgVGFza3MsIGV0Yy4gIEFub3RoZXIgZXhhbXBsZSwgd291bGQgYmUgdG8gcmVwbGFjZSBhbiBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBkYXRhYmFzZSBkZXNpZ24gZm9yIGFuIFJEQk1TIHdpdGggYW4gQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgZGF0YWJhc2UgZGVzaWduIGZvciBhbiBPT0RCTVMuICBBIFZhcmlhYmlsaXR5IEVsZW1lbnQgY2FuIG9ubHkgYmUgcmVwbGFjZWQgYnkgb25lIG90aGVyIGVsZW1lbnQgYXQgYSB0aW1lLiAgRm9yIGV4YW1wbGUsIGlmIHR3byBNZXRob2QgUGx1Z2lucyByZXBsYWNlIHRoZSBzYW1lIGVsZW1lbnQgb25seSBvbmUgTWV0aG9kIFBsdWdpbiBjYW4gYmUgdXNlZCBmb3IgaW50ZXJwcmV0YXRpb24gKHNlZSBjb25jZXB0IG9mIE1ldGhvZCBDb25maWd1cmF0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gaG93IHRvIHJlc29sdmUgc3VjaCBjb25mbGljdHMsIFNlY3Rpb24gNy4xLjIpLiAgVGhlIGZvbGxvd2luZyB0YWJsZSBwcm92aWRlcyB0aGUgZGV0YWlsZWQgbGlzdCBvZiBpbnRlcnByZXRhdGlvbiBydWxlczoKLWF0dHJpYnV0ZSB2YWx1ZXM6CVZhbHVlcyBmcm9tIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIHJlcGxhY2VkIHdpdGggdmFsdWVzIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaW5jbHVkaW5nIHVuYXNzaWduZWQgdmFsdWVzLgotVGhlIGlkZW50aWZ5aW5nIGF0dHJpYnV0ZXMgZ3VpZCBhbmQgbmFtZSBvZiBNZXRob2QgRWxlbWVudCBhcmUgZXhlbXB0IGZyb20gdGhpcyBydWxlIGFuZCB3aWxsIG5vdCBiZSBtb2RpZmllZC4KLTAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOglUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIHJlcGxhY2VkIHdpdGggdGhlIGFzc29jaWF0aW9uIGluc3RhbmNlIGZyb20gdGhlIHJlcGxhY2luZyBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBJZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRpb24gaW5zdGFuY2UgdGhlbiByZXN1bHRpbmcgZWxlbWVudCB3aWxsIGFsc28gbm90IGhhdmUgYW4gYXNzb2NpYXRpb24uCi0wLi5uLWFzc29jaWF0aW9uIGluc3RhbmNlczoJQXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgcmVwbGFjZSBhbGwgYXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LgotCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0NjI4RTRCMDEzMyIgbmFtZT0ibG9jYWxDb250cmlidXRpb24iLz4KLSAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0NjI4RTVFMDEzQiIgbmFtZT0ibG9jYWxSZXBsYWNlbWVudCIvPgotICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDVDOEQ2NzAwMkE5IiBuYW1lPSJleHRlbmRzUmVwbGFjZXMiLz4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRTg4NjgwM0U1IiBuYW1lPSJWYXJpYWJpbGl0eUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29ySzN1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4ODY4MDNFNSI+Ci0gICAgICAgICAgICA8Ym9keT5WYXJpYWJpbGl0eSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGNsYXNzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudCB0aGF0IHByb3ZpZGVzIG5ldyBjYXBhYmlsaXRpZXMgZm9yIGNvbnRlbnQgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gQ29udGVudCBFbGVtZW50cyBvciBhbnkgb3RoZXIgTWV0aG9kIEVsZW1lbnQgdGhhdCBkZXJpdmVzIGZyb20gaXQuICBJdCBoYXMgYmVlbiBwbGFjZWQgaW4tYmV0d2VlbiB0aGUgY2xhc3NlcyBNZXRob2QgRWxlbWVudCBhbmQgQ29udGVudCBFbGVtZW50IGluIHRoZSBvdmVyYWxsIFVNQSB0YXhvbm9teSBvZiBjbGFzc2VzIHVzaW5nIHRoZSBVTUwgMi4wIHBhY2thZ2UgbWVyZ2UgbWVjaGFuaXNtLiAgVGhlIGFzc29jaWF0aW9uIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHNoYWxsIG9ubHkgYmUgaW5zdGFudGlhdGVkIGJldHdlZW4gdHdvIHN1YmNsYXNzZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgc2FtZSB0eXBlLiAgVGhlIGVsZW1lbnQgb24gdmFyYWliaWxpdHlTcGVjaWFsRWxlbWVudCBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgZGVmaW5lcyBhIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZSBkZWZpbmluZyB0aGUgbmF0dXJlIG9mIHRoZSByZWxhdGlvbnNoaXAgdXNpbmcgYSBsaXRlcmFsIGZyb20gdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuCi1WYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBtZXRhLW1vZGVsIHBhY2thZ2UgTWV0aG9kIFBsdWdpbnMgYWRkcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIE1ldGhvZCBFbGVtZW50cyB0aGF0IGRlcml2ZSBmcm9tIGl0LiAgQnkgZGVmYXVsdCBhbGwgQ29udGVudCBFbGVtZW50cyBzdWNoIGFzIFJvbGUsIFRhc2ssIEd1aWRhbmNlIFR5cGVzLCBvciBBY3Rpdml0aWVzIGFyZSBkZWZpbmVkIHRvIGJlIFZhcmlhYmlsaXR5IEVsZW1lbnRzLgotVmFyaWFiaWxpdHkgYW5kIGV4dGVuc2lvbiBwcm92aWRlcyB1bmlxdWUgbWVjaGFuaXNtcyBmb3IgY3VzdG9taXppbmcgbWV0aG9kIGNvbnRlbnQgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQsIGJ1dCBieSBqdXN0IGJlIGFibGUgdG8gZGVzY3JpYmUgd2l0aCBzZXBhcmF0ZSBvYmplY3RzIHRoZSBkaWZmZXJlbmNlcyAoYWRkaXRpb25zLCBjaGFuZ2VzLCBvbWlzc2lvbnMpIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbC4gIFRoaXMgcGx1Zy1pbiBjb25jZXB0IGFsbG93cyB1c2VycyB0byBmYWN0b3IgdGhlaXIgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBpbnRlcnJlbGF0ZWQgdW5pdHMgYW5kIGV2ZW4gdG8gYXJjaGl0ZWN0IG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gbGF5ZXJzIHRoYXQgZXh0ZW5kIGVhY2ggb3RoZXIgd2l0aCBuZXcgY2FwYWJpbGl0aWVzLiAgVGhlIHJlc3VsdGluZyBtZXRob2QgYW5kIHByb2Nlc3MgZGVzaWduIGNhbiBiZSBkeW5hbWljYWxseSBjb21iaW5lZCBhbmQgYXBwbGllZCBvbiBkZW1hbmQgdXNpbmcgdGhlIGludGVycHJldGF0aW9uIHJ1bGVzIGRlZmluZWQgZm9yIFZhcmlhYmlsaXR5IEVsZW1lbnQgU3BlY2lhbGl6YXRpb25zIGFzc2VtYmxpbmcgdG8gcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRoZSBtb3N0IGFjY3VyYXRlIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNjcmlwdGlvbnMgcG9zc2libGUuICBJdCBhbHNvIGFsbG93cyBwcm9jZXNzIHByYWN0aXRpb25lcnMgdG8gZXh0ZW5kcyBhbmQgdGFpbG9yIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgdGhleSBkbyBub3Qgb3duIGFuZCB0byBlYXNpbHkgdXBncmFkZSB0byBuZXdlciB2ZXJzaW9ucyBieSBzaW1wbHkgcmVhcHBseSB0aGVpciBwZXJzb25hbCBjaGFuZ2VzIHRvIHRoZXNlIHVwZ3JhZGVzLgotVmFyaWFiaWxpdHkgRWxlbWVudCBkZWZpbmVzIHR3byB0eXBlcyBvZiB2YXJpYWJpbGl0eSBhbmQgb25lIHR5cGUgb2YgZXh0ZW5zaW9uIHdoaWNoIGFyZSBmb3JtYWxseSBkZWZpbmVkIGZvciB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4KLTwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfSnhQZjRPeFpFZHVPTnJNUmdtejQ4QSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxREU0OTUwMDFGNSIvPgotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY2QjBFNjAzQzciIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGNkIwMDIwMkVDIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29ySzR1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjZCMEU2MDNDNyI+Ci0gICAgICAgICAgICAgIDxib2R5PklmIGluIGluc3RhbmNlIG9mIHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxpemF0aW9uIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIFZhcmlhYmlsaXR5IEVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUgZXhpc3RzLCB0aGVuIHRoZSB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHNwZWNpZmllcyBob3cgdGhlIGVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbEVsZW1lbnQgZW5kIG9mIHRoZSBhc3NvY2lhdGlvbiBjaGFuZ2VzIHRoZSBDb250ZW50IEVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgZW5kLiBTZWUgdGhlIFZhcmlhYmlsaXR5IFR5cGUgZW51bWVyYXRpb24gY2xhc3MgZm9yIGRlZmluaXRpb25zIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHZhcmlhYmlsaXR5LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0dvMDcwZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Ym9keT5uYTwvYm9keT4KLSAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMiIgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDIxRTg4NjgwM0U1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMCI+Ci0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hby1GMC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR28tRjB1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5NTU0NTAxMzQiIG5hbWU9IlNlY3Rpb24iPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR28wNzAtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk1NTQ1MDEzNCI+Ci0gICAgICAgICAgICA8Ym9keT5TZWN0aW9uIGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBleHRlbmRzIFNlY3Rpb24gZGVmaW5lZCBpbiBNZXRob2QgQ29yZSA6OiBCYXNpYyBFbGVtZW50cyB3aXRoIG5ldyBjYXBhYmlsaXRpZXMgZm9yIHZhcmlhYmlsaXR5LiAKLUZvciBleGFtcGxlLCB3aGVuIGEgVGFzayBjb250cmlidXRlcyB0byBhbm90aGVyIFRhc2sgaXRzIFByZXNlbnRhdGlvbiBhc3NvY2lhdGlvbiBpcyBjb250cmlidXRlZCBpbmNsdWRpbmcgaXRzIFNlY3Rpb25zIChpLmUuIGl0cyBTdGVwcyksIHdoaWNoIGFyZSBtb2RlbGVkIGFzIHBhcnRzIG9mIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlLiAgU2VjdGlvbnMgY2FuIGJlIG5lc3RlZCBhbmQgdGhlcmVmb3JlIFRhc2sgRGVzY3JpcHRpb25zIGNhbiBiZSBmbGV4aWJseSBvcmdhbml6ZWQgaW4gU3RlcHMgd2l0aCBzdWItU3RlcHMuICBTZWN0aW9ucyBhcmUgVmFyaWFiaWxpdHkgRWxlbWVudHMgdGhlbXNlbHZlcywgc28gdGhleSBjYW4gY29udHJpYnV0ZSB0byBlYWNoIG90aGVyLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBtb2RlbCBhIFRhc2sgc3RlcCBhcyBhIFNlY3Rpb24gaW5zdGFuY2Ugd2l0aG91dCByZWxhdGluZyBpdCB0byBhIFRhc2sgRGVzY3JpcHRpb24gdGhhdCBkaXJlY3RseSBjb250cmlidXRlcyB0byAob3IgcmVwbGFjZXMpIGFub3RoZXIgU2VjdGlvbiB3aGljaCBpcyBwYXJ0IG9mIGEgVGFzayBEZXNjcmlwdGlvbi4gIFRoaXMgY29udHJpYnV0aW9uIChvciByZXBsYWNlbWVudCkgd291bGQgYWRkIG5ldyBkZXNjcmlwdGlvbiB0ZXh0IHRvIHRoZSBvcmlnaW5hbCBzdGVwIGRlc2NyaXB0aW9uIChvciByZXBsYWNlIHRoZSBvcmlnaW5hbCBzdGVwIGRlc2NyaXB0aW9uKS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSB0byBjb250cmlidXRlIG5ldyBDaGVjayBMaXN0IGl0ZW1zIG9yZ2FuaXplZCBhcyBTZWN0aW9ucyB0byBhbiBleGlzdGluZyBDaGVjayBMaXN0IChkZWZpbmVkIGFzIGd1aWRhbmNlKS4gIAotCi08L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk1NTYwMDE3MCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyMUU4ODY4MDNFNSIvPgotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NzAxQjEiIG5hbWU9InByZWRlY2Vzc29yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0Mjc5NTU0NTAxMzQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxRThFNjUwMjEzIj4KLSAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dvLUYyZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hby1GMk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QUEwQUUwMzlEIiBuYW1lPSJBY3Rpdml0eSI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbzA3Mk9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QUEwQUUwMzlEIj4KLSAgICAgICAgICAgIDxib2R5PkFjdGl2aXR5IGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IHRvIGV4dGVuZCBBY3Rpdml0eSB3aXRoIG5ldyBjYXBhYmlsaXRpZXMgZm9yIHZhcmlhYmlsaXR5LiYjeEQ7Ci1BY3Rpdml0eSBpbmhlcml0cyB0aGUgc2VtYW50aWNzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQgd2hpY2ggcHJvdmlkZXMga2V5IG1lY2hhbmlzbSB0byBlbmFibGUgZHluYW1pYyBiaW5kaW5nIG9mIENhcGFiaWxpdHkgUGF0dGVybnMgaW4gUHJvY2Vzc2VzIGFzIHdlbGwgYXMgUHJvY2VzcyBDb250cmlidXRpb25zLiAgVmFyaWFiaWxpdHkgaXMgdXNlZCBpbiB0aGUgZm9sbG93aW5nIHdheSBmb3IgQWN0aXZpdGllczomI3hEOwotLSBFeHRlbmQ6IFRvIGFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIGEgcHJvY2VzcyBvbmUgd291bGQgY3JlYXRlIGFuIEFjdGl2aXR5IHdoaWNoIGV4dGVuZHMgdGhlIHBhdHRlcm4ncyB0b3AtbGV2ZWwgYWN0aXZpdHkuICBUaHJvdWdoIGV4dGVuc2lvbiB0aGUgZXh0ZW5kaW5nIEFjdGl2aXR5IGluaGVyaXRzIHRoZSBwYXR0ZXJucyBCcmVha2Rvd24gRWxlbWVudHMuJiN4RDsKLS0gUmVwbGFjZTogVG8gcmVwbGFjZSBhbiBBY3Rpdml0eSBvZiBhbiBhcHBsaWVkIENhcGFiaWxpdHkgUGF0dGVybiBvciBhbiBleGlzdGluZyBwcm9jZXNzIGZvciB3aGljaCBvbmUgZGV2ZWxvcHMgYSBQcm9jZXNzIENvbnRyaWJ1dGlvbiAob3IgYSBjb21iaW5hdGlvbiBvZiBib3RoKSBvbmUgd291bGQgY3JlYXRlIGFuIEFjdGl2aXR5IGFuZCBzcGVjaWZ5IHRoZSByZXBsYWNlIHZhcmlhYmlsaXR5IHNwZWNpYWxpemF0aW9uIGJldHdlZW4gdGhlbS4mI3hEOwotLSBDb250cmlidXRlOiBUbyBjb250cmlidXRlIG5ldyBCcmVha2Rvd24gRWxlbWVudHMgdG8gYW4gZXhpc3RpbmcgQWN0aXZpdHkgb25lIHdvdWxkIGRlZmluZSBhbiBBY3Rpdml0eSB3aXRoIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlbGF0ZXMgdmlhIHRoZSBDb250cmlidXRlcyBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiB0byB0aGlzIGV4aXN0aW5nIEFjdGl2aXR5LiAgVGhlIGNvbnRyaWJ1dGluZyBBY3Rpdml0eSdzIEJyZWFrZG93biBFbGVtZW50cyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb250cmlidXRlZCBBY3Rpdml0eS4mI3hEOwotJiN4RDsKLTwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QUEwRDMwMjQ1IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDIxRTg4NjgwM0U1Ii8+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ2IF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDgiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR28wNzNlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGlzIGNvbXBvc2l0aW9uIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgdGhhdCBldmVyeSBNZXRob2QgUGFja2FnZSAoZWl0aGVyIENvbnRlbnQgUGFja2FnZSwgUHJvY2VzcyBQYWNrYWdlLCBvciBQcm9jZXNzIENvbXBvbmVudCkgaXMgcGFydCBvZiBleGFjdGx5IG9uZSBNZXRob2QgUGx1Z2luLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ2IiBuYW1lPSJfbWV0aG9kUGx1Z2luIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMDQiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDUiPgotICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR28wNzRlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dvMDc0T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU3IiBuYW1lPSJFeHRlbnNpb24iIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFOCBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkVBIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvLUZ3LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRTciPgotICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZWZpbmVzIGhvdyBNZXRob2QgUGx1Z2lucyBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucy4gIFRoZSBleHRlbmRpbmcgcGx1Zy1pbiBjb250YWlucyBuZXcgbWV0aG9kIGVsZW1lbnRzLCBleHRlbmRzIGV4aXN0aW5nIG1ldGhvZCBlbGVtZW50cyBhbmQgcHJvY2Vzc2VzIHVzaW5nIGNvbnRlbnQgZWxlbWVudCB2YXJpYWJpbGl0eSBtZWNoYW5pc21zIChlLmcuIGNvbnRyaWJ1dGlvbiwgcmVwbGFjZSwgZXRjLiksIHByb3ZpZGVzIGFkZGl0aW9uYWwgRGVsaXZlcnkgYW5kIENhcGFiaWxpdHkgUHJvY2Vzc2VzIGZvciBhIE1ldGhvZCBGcmFtZXdvcmssIGV0Yy48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFOCIgbmFtZT0icGx1Z2lucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTA0IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFNyI+Ci0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hby1GeC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR28tRnh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMCIgbmFtZT0idmFyaWFiaWxpdHlTcGVjaWFsaXphdGlvbiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0ExIF8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTIiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR28tRnpPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMCI+Ci0gICAgICAgICAgICA8Ym9keT5UaGlzIDEtdG8tbWFueSBhc3NvY2lhdGlvbiBkZWZpbmVzIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIHZhcmlhYmlsaXR5VHlwZSBhdHRyaWJ1dGUgdGhhdCBhIG51bWJlciBvZiBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUgcmVwcmVzZW50IGEgdmFyaWF0aW9uIG9mIGV4YWN0bHkgb25lIG90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBTZWUgdGhlIFZhcmlhYmlsaXR5IFR5cGUgZW51bWVyYXRpb24gY2xhc3MgZm9yIGRlZmluaXRpb25zIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHZhcmlhYmlsaXR5LjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0ExIiBuYW1lPSJ2YXJpYWJpbGl0eVNwZWNpYWxFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjFFODg2ODAzRTUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0EwIj4KLSAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dvLUYwT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hby1Gei1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRThFNjUwMjEzIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NzAxQjEgXzNBREM3Qjc0MDIyRDQyMUU4RTY3MDFCQyI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hby1GMWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThFNjUwMjEzIj4KLSAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVzY3JpYmVzIHRoZSBvcmRlciBpbiB3aGljaCBjb250cmlidXRlZCBTZWN0aW9ucyBzaGFsbCBiZSBpbnNlcnRlZCBpbnRvIGFuICBleGlzdGluZyBsaXN0IG9mIFNlY3Rpb25zIG1haW50YWluZWQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbi48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY3MDFCQyIgbmFtZT0iX3NlY3Rpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyNzk1NTQ1MDEzNCIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMUU4RTY1MDIxMyI+Ci0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hby1GM09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR28tRjItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTdCIiBuYW1lPSJNZXRob2RDb3JlIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HdlBGMHVmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MEY4N0I0RTAzNEEiPgotICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGODdCNEUwMzRBIiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjV1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2MiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElIZjZ1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmN3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJSGY3LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISUhmNS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISUhmNk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI5NjIzIiB5PSIxNDUxOCIgd2lkdGg9IjQ0MDIiIGhlaWdodD0iMTY4NCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmOE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISUhmOU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGYtT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElIZi1lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJSGY4ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJSGY4dWZYRWR1cUhvT0piVVJaUnciIHg9IjEwODM5IiB5PSIxMTQwMCIgd2lkdGg9IjQ0MzIiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmLXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTkwIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGZfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISUhmX3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnQWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdBdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElIZ0EtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJSGYtLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJSGZfT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc2MDgiIHk9IjgyNDIiIHdpZHRoPSI0NTM3IiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0JPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElIZ0NPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnRE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJSGdEZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISUhnQmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISUhnQnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NjA4IiB5PSI0OTQwIiB3aWR0aD0iNDUzNyIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdJT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNDc4RTAwMEQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJSGdKT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0tPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISUhnS2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElIZ0llZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElIZ0l1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzYwOCIgeT0iMjIxOSIgd2lkdGg9IjQxMTQiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnS3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTQ5RUEwMUUyIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISUhnTHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdNdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElIZ00tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJSGdLLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJSGdMT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEyNjgiIHk9IjY5NzQiIHdpZHRoPSI0NzIwIiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ1QtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFMjgwMDI1RCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElIZ1UtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ1ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ1ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ1Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnVi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJSGdXT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISUhnVU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISUhnVWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDM3OCIgeT0iODE3OCIgd2lkdGg9IjM4NDEiIGhlaWdodD0iMTY4NCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il94NEd1UU94ZEVkdUhqZTNwUGFoTjRBIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY4NjkwMTJFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3g0R3VRLXhkRWR1SGplM3BQYWhONEEiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il94NEd1Uk94ZEVkdUhqZTNwUGFoTjRBIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il94NEd1UmV4ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il94NEd1UnV4ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il94NEd1Ui14ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3g0UDRNT3hkRWR1SGplM3BQYWhONEEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfeDRQNE1leGRFZHVIamUzcFBhaE40QSIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX3g0R3VRZXhkRWR1SGplM3BQYWhONEEiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3g0R3VRdXhkRWR1SGplM3BQYWhONEEiIHg9Ijk2MjMiIHk9IjE3NDg3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1pDVEJrT3g1RWR1NS12VmpsZlZzZlEiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTYyQjAzNkYiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWkNUQmsteDVFZHU1LXZWamxmVnNmUSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX1pDVEJsT3g1RWR1NS12VmpsZlZzZlEiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1pDY3lrT3g1RWR1NS12VmpsZlZzZlEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1pDY3lrZXg1RWR1NS12VmpsZlZzZlEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1pDY3lrdXg1RWR1NS12VmpsZlZzZlEiIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWkNjeWsteDVFZHU1LXZWamxmVnNmUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9aQ2N5bE94NUVkdTUtdlZqbGZWc2ZRIiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfWkNUQmtleDVFZHU1LXZWamxmVnNmUSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfWkNUQmt1eDVFZHU1LXZWamxmVnNmUSIgeD0iMTQyNjUiIHk9IjE3NDg3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdlBGMU9mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIE1ldGhvZCBDb3JlIHBhY2thZ2UgZGVmaW5lcyB0aGUgZnVuZGFtZW50YWwgY29uY2VwdHMgZm9yIGRlc2NyaWJpbmcgYW5kIG9yZ2FuaXppbmcgbWV0aG9kIGNvbnRlbnQuICBUaGUgcGFja2FnZSBpdHNlbGYgcHJvdmlkZXMgbGF5ZXJzIGFzIGRlcGljdGVkIGluIGRpYWdyYW0gdGhhdCBncmFkdWFsbHkgZXh0ZW5kIHRoZSBjb3JlIGNvbmNlcHRzIHdpdGggbW9yZSBhbmQgbW9yZSBjYXBhYmlsaXRpZXMgKGkuZS4gc3VwcG9ydGluZyBjbGFzc2VzLCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMsIGFuZCByZWxhdGlvbnNoaXBzKS4gVGhlIEJhc2ljIEVsZW1lbnRzIHBhY2thZ2UgZGVmaW5lcyB0aGUgcm9vdCBlbGVtZW50IGZyb20gd2hpY2ggYWxsIGNsYXNzZXMgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGhhdmUgYmVlbiBkZXJpdmVkLiAgQ29yZSBDb250ZW50IEVsZW1lbnRzIGRlZmluZXMgdGhlIGNvcmUgZWxlbWVudHMgb2YgZXZlcnkgbWV0aG9kIHN1Y2ggYXMgcm9sZXMsIHRhc2tzLCBhbmQgd29yayBwcm9kdWN0cy4gIFRoZSBuZXh0IGxheWVyIGFkZHMgZGlmZmVyZW50IHR5cGVzIG9mIGd1aWRhbmNlIHRvIHRoZSBjb3JlIGVsZW1lbnRzIHN1Y2ggYXMgd29yayBwcm9kdWN0IHRlbS1wbGF0ZXMsIGd1aWRlbGluZXMsIG9yIGNoZWNrbGlzdHMuICBUaGUgQ2F0ZWdvcmllcyBwYWNrYWdlIHByb3ZpZGVzIHByZS1kZWZpbmVkIGFzIHdlbGwgYXMgdXNlci1kZWZpbmFibGUgY2F0ZWdvcml6YXRpb25zIG9mIGNvcmUgY29udGVudCBlbGVtZW50cyBhcyB3ZWxsIGFzIGd1aWRhbmNlIHR5cGVzLiAgVGhlIE1ldGhvZCBDb250ZW50IERlc2NyaXB0aW9ucyBhZGRzIHByb3BlcnRpZXMgZm9yIGRldGFpbGVkIGNvbnRlbnQgZGVzY3JpcHRpb25zIHRvIHRoZSBlbGVtZW50cyBkZWZpbmVkIGJlbG93LiAgVGhlc2UgZGVzY3JpcHRpb25zIGFyZSBvcHRpb25hbCBhZGRpdGlvbnMsIHdoaWNoIGFuIGltcGxlbWVudGVyIG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBmcmVlIHRvIGNob29zZSBmcm9tLiAgRmluYWxseSwgTWV0aG9kIFBhY2thZ2UgZGUtZmluZXMgaG93IHRoZSBlbGVtZW50cyBkZWZpbmVkIGluIGFsbCBmb3VyIGxheWVycyBiZWxvdyBjYW4gYmUgb3JnYW5pemVkIGluIHBhY2thZ2UgaGllcmFyY2hpZXMuIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfVVI5V3NPb1dFZHVPQlBRQTJoS3FVUSIgZWxlbWVudD0iX1VSemxzT29XRWR1T0JQUUEyaEtxVVEiIHNvdXJjZT0iX0hJSGdULWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJSGY4T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVVI5V3Mtb1dFZHVPQlBRQTJoS3FVUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVVI5V3Rlb1dFZHVPQlBRQTJoS3FVUSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9VUjlXdC1vV0VkdU9CUFFBMmhLcVVRIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1VSOVd0dW9XRWR1T0JQUUEyaEtxVVEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9VUjlXdE9vV0VkdU9CUFFBMmhLcVVRIiB4PSItNzc2IiB5PSItMTA2NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfVVI5V3Nlb1dFZHVPQlBRQTJoS3FVUSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9VUjlXc3VvV0VkdU9CUFFBMmhLcVVRIiBwb2ludHM9IlstMzQsIDMyLCAxNDksIC05MF0kWy0xMDksIDExOSwgNzQsIC0zXSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9OMTlsY2V4TUVkdU9Ock1SZ216NDhBIiBlbGVtZW50PSJfTjE5bGNPeE1FZHVPTnJNUmdtejQ4QSIgc291cmNlPSJfSElIZi11ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElIZjhPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9OMTlsZE94TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9OMTlsZHV4TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX04xOWxlT3hNRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTjE5bGQteE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX04xOWxkZXhNRWR1T05yTVJnbXo0OEEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX04xOWxjdXhNRWR1T05yTVJnbXo0OEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfTjE5bGMteE1FZHVPTnJNUmdtejQ4QSIgcG9pbnRzPSJbMiwgMzMsIDAsIC04NV0kWzIsIDE1MCwgMCwgMzJdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0NzRVFJT3hkRWR1SGplM3BQYWhONEEiIGVsZW1lbnQ9Il9DcjZmSU94ZEVkdUhqZTNwUGFoTjRBIiBzb3VyY2U9Il9ISUhmOE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISUhmNXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0NzRVFJLXhkRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0NzRVFKZXhkRWR1SGplM3BQYWhONEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQ3NFUUoteGRFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Dc0VRSnV4ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfQ3NFUUpPeGRFZHVIamUzcFBhaE40QSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfQ3NFUUlleGRFZHVIamUzcFBhaE40QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9Dc0VRSXV4ZEVkdUhqZTNwUGFoTjRBIiBwb2ludHM9IlstMTg1LCA4NzMsIC0yMTQzLCAtNTQyNF0kWy0xODUsIDM2NTEsIC0yMTQzLCAtMjY0Nl0kWzEyNDQsIDU0MjQsIC03MTQsIC04NzNdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oVjFsRU94NUVkdTUtdlZqbGZWc2ZRIiBpZD0iKDAuNDYxNjQyNiwwLjc3NTY1NjM0KSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9kZHR0c094ZEVkdUhqZTNwUGFoTjRBIiBlbGVtZW50PSJfZGRqOHNPeGRFZHVIamUzcFBhaE40QSIgc291cmNlPSJfSElIZ0JPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElIZi11ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9kZHR0cy14ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9kZHR0dGV4ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2RkdHR0LXhkRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZGR0dHR1eGRFZHVIamUzcFBhaE40QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2RkdHR0T3hkRWR1SGplM3BQYWhONEEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2RkdHRzZXhkRWR1SGplM3BQYWhONEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfZGR0dHN1eGRFZHVIamUzcFBhaE40QSIgcG9pbnRzPSJbMiwgMzIsIDIsIC05Ml0kWzE2LCAxNTcsIDE2LCAzM10iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfZWFXOElleGRFZHVIamUzcFBhaE40QSIgZWxlbWVudD0iX2VhVzhJT3hkRWR1SGplM3BQYWhONEEiIHNvdXJjZT0iX0hJSGdCT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJSGY4T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZWFXOEpPeGRFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZWFXOEp1eGRFZHVIamUzcFBhaE40QSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lYVc4S094ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VhVzhKLXhkRWR1SGplM3BQYWhONEEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9lYVc4SmV4ZEVkdUhqZTNwUGFoTjRBIiB4PSItMTQ4OCIgeT0iLTgxMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfZWFXOEl1eGRFZHVIamUzcFBhaE40QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9lYVc4SS14ZEVkdUhqZTNwUGFoTjRBIiBwb2ludHM9IlsxNTM1LCA4NDYsIC0xNjQwLCAtNTYxMF0kWzM0MTMsIDE4NzgsIDIzOCwgLTQ1NzhdJFszNDEzLCA1OTAwLCAyMzgsIC01NTZdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX1ZQUjNNT3hlRWR1SGplM3BQYWhONEEiIGVsZW1lbnQ9Il9WUElHTU94ZUVkdUhqZTNwUGFoTjRBIiBzb3VyY2U9Il9ISUhnS3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISUhmLXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1ZQUjNNLXhlRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1ZQUjNOZXhlRWR1SGplM3BQYWhONEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVlBSM04teGVFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9WUFIzTnV4ZUVkdUhqZTNwUGFoTjRBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfVlBSM05PeGVFZHVIamUzcFBhaE40QSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfVlBSM01leGVFZHVIamUzcFBhaE40QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9WUFIzTXV4ZUVkdUhqZTNwUGFoTjRBIiBwb2ludHM9IlstOTAsIDExLCAyMzksIC0xXSRbLTI0NSwgNDMsIDg0LCAzMV0iLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX1d0ZEZZT3hlRWR1SGplM3BQYWhONEEiIGlkPSIoMC43NzE2NTUyNiwwLjc0MzQzNjc1KSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9SS0VEWWV4Z0VkdUhqZTNwUGFoTjRBIiBlbGVtZW50PSJfUktFRFlPeGdFZHVIamUzcFBhaE40QSIgc291cmNlPSJfSElIZ0lPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElIZ0t1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9SS0VEWk94Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9SS0VEWnV4Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JLRURhT3hnRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUktFRFoteGdFZHVIamUzcFBhaE40QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1JLRURaZXhnRWR1SGplM3BQYWhONEEiIHg9Ii00ODEiIHk9Ii00ODciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX1JLRURZdXhnRWR1SGplM3BQYWhONEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfUktFRFkteGdFZHVIamUzcFBhaE40QSIgcG9pbnRzPSJbLTIwOTAsIDQ3NiwgMzk0MywgLTQyODddJFstNjA1OSwgMTQwMywgLTI2LCAtMzM2MF0kWy02MDU5LCA0MjA3LCAtMjYsIC01NTZdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX1JxR09VZXhnRWR1SGplM3BQYWhONEEiIGVsZW1lbnQ9Il9ScUdPVU94Z0VkdUhqZTNwUGFoTjRBIiBzb3VyY2U9Il9ISUhnSU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISUhnQk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxR09WT3hnRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxR09WdXhnRWR1SGplM3BQYWhONEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUnFHT1dPeGdFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ScUdPVi14Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfUnFHT1ZleGdFZHVIamUzcFBhaE40QSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfUnFHT1V1eGdFZHVIamUzcFBhaE40QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ScUdPVS14Z0VkdUhqZTNwUGFoTjRBIiBwb2ludHM9Ils2LCAzMywgLTIsIC03MF0kWzk1LCAxMTAsIDg3LCA3XSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9TTFZUSWV4Z0VkdUhqZTNwUGFoTjRBIiBlbGVtZW50PSJfU0xWVElPeGdFZHVIamUzcFBhaE40QSIgc291cmNlPSJfSElIZ0lPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElIZ1QtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TTFZUSk94Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TTFZUSnV4Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NMVlRLT3hnRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU0xWVEoteGdFZHVIamUzcFBhaE40QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1NMVlRKZXhnRWR1SGplM3BQYWhONEEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX1NMVlRJdXhnRWR1SGplM3BQYWhONEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfU0xWVEkteGdFZHVIamUzcFBhaE40QSIgcG9pbnRzPSJbMTkzMSwgODczLCAtNDcxMCwgLTUxMDddJFs2NjE0LCAyOTkwLCAtMjcsIC0yOTkwXSRbNjYxNCwgNTQyNCwgLTI3LCAtNTU2XSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ub3lUTWV4Z0VkdUhqZTNwUGFoTjRBIiBlbGVtZW50PSJfbm95VE1PeGdFZHVIamUzcFBhaE40QSIgc291cmNlPSJfSElIZjV1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfeDRHdVFPeGRFZHVIamUzcFBhaE40QSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ub3lUTk94Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ub3lUTnV4Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25veVRPT3hnRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbm95VE4teGdFZHVIamUzcFBhaE40QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX25veVROZXhnRWR1SGplM3BQYWhONEEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX25veVRNdXhnRWR1SGplM3BQYWhONEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfbm95VE0teGdFZHVIamUzcFBhaE40QSIgcG9pbnRzPSJbLTcsIDMzLCAtNiwgLTcwXSRbLTcsIDEzMSwgLTYsIDI4XSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9jNjJuZ094NUVkdTUtdlZqbGZWc2ZRIiBlbGVtZW50PSJfYzZ0ZGtPeDVFZHU1LXZWamxmVnNmUSIgc291cmNlPSJfSElIZjV1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfWkNUQmtPeDVFZHU1LXZWamxmVnNmUSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jNjJuZy14NUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jNjJuaGV4NUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2M2Mm5oLXg1RWR1NS12VmpsZlZzZlEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYzYybmh1eDVFZHU1LXZWamxmVnNmUSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2M2Mm5oT3g1RWR1NS12VmpsZlZzZlEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2M2Mm5nZXg1RWR1NS12VmpsZlZzZlEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfYzYybmd1eDVFZHU1LXZWamxmVnNmUSIgcG9pbnRzPSJbNDEsIDMzLCAtMTM0LCAtNzRdJFs5MSwgMTA4LCAtODQsIDFdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwQ0QzNzAxRUQiIHR5cGU9IkNsYXNzIiBuYW1lPSJUYXhvbm9teSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUTZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3RiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJRN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElSUTdlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ1MjEiIGhlaWdodD0iMTA4MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUTd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUTctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUThPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJROGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJROHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJROC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJROU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJROWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJROXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJROS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUS1PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISVJRNnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISVJRNi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjA1MCIgeT0iMTEwMTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUS1lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE4NSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJRX09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElSUV9lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM5OTYiIGhlaWdodD0iMTA4MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUV91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUV8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSQWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSQXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSQS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSQk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSQmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSQnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSQi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkNPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISVJRLXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISVJRLS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjc3OSIgeT0iMTEwMTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElSUkRlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM3MDgiIGhlaWdodD0iMTEzNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSRWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSRXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSRk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSRmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSRnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSRi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkdPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISVJSQ3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISVJSQy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MzA4IiB5PSI4MzQ4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJHZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOEYiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJUlJIZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNzA4IiBoZWlnaHQ9IjEwODMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJLT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElSUkd1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElSUkctZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjE1MTYiIHk9IjExMDE4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJLZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJUlJMZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MDEzIiBoZWlnaHQ9IjExMTciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUk1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUk11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUk0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUk5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUk5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUk51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUk4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJPT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElSUkt1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElSUkstZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIwNDIiIHk9IjgzNTYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUk9lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElSUlBlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ0NzAiIGhlaWdodD0iMTEzNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUlB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUlAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUlFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSUWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSUXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSUk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSUmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSUnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSUi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUlNPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISVJST3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISVJSTy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjc2NiIgeT0iODM0OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhNi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWE3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISWFhNy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDE4MiIgaGVpZ2h0PSIxMTE3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhOGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWE4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWE5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWE5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWE5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWE5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWEtT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWEtZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFhLXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJYWE3T2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJYWE3ZWZYRWR1cUhvT0piVVJaUnciIHg9IjIxNTA3IiB5PSI4MzU2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJQZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMkIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYlFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJYWJRZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMDY0IiBoZWlnaHQ9IjEwODMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYlJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYlJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYlItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYlNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYlNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYlN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYlMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJUT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElhYlB1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElhYlAtZlhFZHVxSG9PSmJVUlpSdyIgeD0iODUwNSIgeT0iNTY3MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiWnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1N0IwMzMzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISWFiYXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjc5NCIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJidWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJiLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJjT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJjZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJjdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJjLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJkT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiZGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJYWJaLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJYWJhT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEwMjAiIHk9IjMwMTAiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElhYmV1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMxMTUiIGhlaWdodD0iMTEzNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiZnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiZi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiZ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiZ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiZ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiZy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiaE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYmhlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISWFiZC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWFiZU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI5MTkzIiB5PSIzMTciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDAtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElrTDEtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4NzgiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMMi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtMM09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMM2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtMM3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMMy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtMNE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMNGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTDR1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISWtMMU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtMMWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjY2NiIgeT0iNTY2MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNRU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01FLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISWtNRk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzQzNyIgaGVpZ2h0PSIxMTE3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01HT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01HZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01HdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01HLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01IT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01IZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01IdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNSC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJa01FZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa01FdWZYRWR1cUhvT0piVVJaUnciIHg9IjQ3NjMiIHk9IjMwMDMiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUtlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElrTUxlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMwMTQiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTU1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNTWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNTXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNTS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNTk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNTmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNTnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNTi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTU9PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISWtNS3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNSy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4NTA0IiB5PSIzMDEwIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01TLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJa01ULWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTg5IiBoZWlnaHQ9Ijk5MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNVS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNVk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNVmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNVnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNVi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNV09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNV2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTVd1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISWtNVE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNVGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjQ0MyIgeT0iMjk5MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNWk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTRBOTcwMTIzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01aLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISWtNYU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01iT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01iZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01idWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01iLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01jT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01jZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01jdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNYy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJa01aZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa01adWZYRWR1cUhvT0piVVJaUnciIHg9IjE2NzEwIiB5PSIzMDA5IiB3aWR0aD0iNDQxNyIgaGVpZ2h0PSI5NzkiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhPMDRPb2xFZHVWQTd2dDVxYklKUSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lSE8wNC1vbEVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfZUhPMDVPb2xFZHVWQTd2dDVxYklKUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhPMDVlb2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhPMDV1b2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhPMDUtb2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lSE8wNk9vbEVkdVZBN3Z0NXFiSUpRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9lSE8wNmVvbEVkdVZBN3Z0NXFiSUpRIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lSE8wNnVvbEVkdVZBN3Z0NXFiSUpRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9lSE8wNi1vbEVkdVZBN3Z0NXFiSUpRIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lSE8wN09vbEVkdVZBN3Z0NXFiSUpRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9lSE8wN2VvbEVkdVZBN3Z0NXFiSUpRIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lSE8wN3VvbEVkdVZBN3Z0NXFiSUpRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfZUhPMDctb2xFZHVWQTd2dDVxYklKUSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9lSE8wNGVvbEVkdVZBN3Z0NXFiSUpRIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9lSE8wNHVvbEVkdVZBN3Z0NXFiSUpRIiB4PSIzMzE5IiB5PSI4MzU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdlBGMXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElhYTBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAwRiIgc291cmNlPSJfSElSUTZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElSUk9lZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWExdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElhYTFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElhYTBlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWFhMHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjYsIC01MDMsIC00Nzg5LCAyMTY5XSRbNDc1NSwgLTIxOTYsIC04LCA0NzZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWFhMS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJYWEyT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWFhMmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJDIiBzb3VyY2U9Il9ISVJRLWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISVJST2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWEzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWEzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWFhM2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWFhMnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJYWEyLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNywgLTUwMywgLTI3LCAyMTY5XSRbLTgsIC0yMTk2LCAtOCwgNDc2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElhYTRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWFhNGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElhYTR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA0QSIgc291cmNlPSJfSElSUkdlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElSUk9lZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWE2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElhYTV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElhYTQtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWFhNU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjYsIC01MDMsIDQ3MTAsIDIxNjldJFstNDc0NCwgLTIxOTYsIC04LCA0NzZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWFhNmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJYWE2dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWFiaHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1QUUwMkNFIiBzb3VyY2U9Il9ISWFiWnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISWFiZHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWFiaXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWFiaC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJYWJpT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNywgLTUwMiwgLTgxNDksIDIxNzBdJFs4MTM2LCAtMjE5NiwgMTQsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa0wwZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTDB1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJa0w0LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMUQiIHNvdXJjZT0iX0hJUlJDZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJa0wwLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMNmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa0w1LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJa0w1T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTDVlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI3LCAtNTAzLCAtNzExOCwgMjE2OV0kWzcwOTcsIC0yMTk2LCA2LCA0NzZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtMNnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa0w2LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWtMN09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA3IiBzb3VyY2U9Il9ISVJSS2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISWtMMC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0w3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0w4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtMOE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWtMN2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJa0w3dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNywgLTUwMywgLTIzODIsIDIxNjldJFsyMzYxLCAtMjE5NiwgNiwgNDc2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTDgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtMOU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElrTDllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNEOSIgc291cmNlPSJfSElSUk9lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElrTDAtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTC1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElrTDl1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWtMOS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjcsIC01MDMsIDIzNTQsIDIxNjldJFstMjM3NSwgLTIxOTYsIDYsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa0xfT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTF9lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJa0xfdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMkYiIHNvdXJjZT0iX0hJYWE2LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJa0wwLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNQk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa01BdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJa0xfLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTUFPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI2LCAtNTAzLCA3MDkxLCAyMTY5XSRbLTcxMTEsIC0yMTk2LCA2LCA0NzZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNQmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01CdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWtNSU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTU2MjQwMTdFIiBzb3VyY2U9Il9ISWtNRU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISWFiZHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01JLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01KZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNSk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWtNSWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJa01JdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNiwgLTUwMiwgLTQ0MTgsIDIxNzBdJFs0NDA2LCAtMjE5NiwgMTQsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01KLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTUtPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJa01PZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAzQUYiIHNvdXJjZT0iX0hJYWJQZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJa01LZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNUC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa01QZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJa01PdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJa01PLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMzgsIC01MDMsIC0yMzgsIDIxNzBdJFstMjM4LCAtMjE5NywgLTIzOCwgNDc2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTVFPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNUWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElrTVF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkFENUY4MDM4RSIgc291cmNlPSJfSElrTUtlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElhYmR1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01TT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTVJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElrTVEtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWtNUk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjcsIC01MDIsIC01ODIsIDIxNzBdJFs1NjksIC0yMTk2LCAxNCwgNDc2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTVNlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNU3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElrTVctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzRBMDMwNiIgc291cmNlPSJfSElrTDAtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElrTVMtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01ZZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTVgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElrTVhPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTVhlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEzMywgLTUwMywgLTEzMywgMjE3MF0kWy0xMzMsIC0yMTk3LCAtMTMzLCA0NzZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNWXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01ZLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWtNZE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDMkIwMUNBIiBzb3VyY2U9Il9ISWtNUy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISWFiZHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01kLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01lZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTWV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNZU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWtNZGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJa01kdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNywgLTUwMiwgMzUxOSwgMjE3MF0kWy0zNTMyLCAtMjE5NiwgMTQsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01lLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTWZPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJa01mZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjAwNTgzQjAxRTYiIHNvdXJjZT0iX0hJa01aT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJYWJkdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTWdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTWd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNZy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa01nZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJa01mdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTWYtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI3LCAtNTAyLCA4MTQ5LCAyMTcwXSRbLTgxNjIsIC0yMTk2LCAxNCwgNDc2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTWhPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNaGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfZUhZbDRPb2xFZHVWQTd2dDVxYklKUSIgZWxlbWVudD0iX0QzYjhvT29rRWR1VkE3dnQ1cWJJSlEiIHNvdXJjZT0iX2VITzA0T29sRWR1VkE3dnQ1cWJJSlEiIHRhcmdldD0iX0hJa0wwLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhZbDQtb2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhZbDVlb2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lSFlsNXVvbEVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfZUhZbDVPb2xFZHVWQTd2dDVxYklKUSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfZUhZbDRlb2xFZHVWQTd2dDVxYklKUSIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9lSFlsNHVvbEVkdVZBN3Z0NXFiSUpRIiBwb2ludHM9IlsxNzQ2LCAtMTU5LCAtODY3OSwgODQ2XSRbODc4NCwgLTg0NywgLTE2NDEsIDE1OF0iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BIMnlPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3QiI+Ci0gICAgICAgICAgPGJvZHk+MDE8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTkwIiBuYW1lPSJHdWlkYW5jZVR5cGVzIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0dxVUp0ZWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQwRjQ5RkYzMDAwRSI+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjQ5RkYzMDAwRSIgdHlwZT0iQ2xhc3MiIG5hbWU9IlN0cnVjdHVyZSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQjNHNE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUUwIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENBUTBlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVEwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FRMXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FRMk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FRMnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUTNPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEIzRzRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQjNHNHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxODAyNSIgeT0iMTgzODEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVEzZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ0FRNGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVE1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRNWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVE1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRNS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVE2T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRNmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVE2dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRNi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FRN09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ0FRM3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDQVEzLWZYRWR1cUhvT0piVVJaUnciIHg9IjEwNDYxIiB5PSIyMzE0MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUkhlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDQVJJZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUkpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUkp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJKLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUktPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJLZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUkt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJLLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJMT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDQVJIdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENBUkgtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ0NTIiIHk9IjE5Nzc4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSTGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTk5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUk1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENBUk1lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUk0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUk5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSTnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUk4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FST09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUk9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FST3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUk8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUlBPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENBUkx1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0FSTC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDk1MiIgeT0iMTc2NjkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJSdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTQiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ0FSU3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJULWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSVU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJVZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSVXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJVLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSVk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSVmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ0FSUi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDQVJTT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE0NTg4IiB5PSIxNTg0MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5QSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDQVJXdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJYdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUlgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJZT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUlllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJZdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUlktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJaT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJaZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDQVJWLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENBUldPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ1NzEiIHk9IjE0MTY0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSWnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUEzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENBUmF1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSYi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSY2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSYy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUmRlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENBUlotZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0FSYU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDUyOCIgeT0iMTI1ODkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJkdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkxMzAyQzUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ0FSZXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjgyNyIgaGVpZ2h0PSI5MzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJmdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUmYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJnT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUmdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJndWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUmctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0IwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0IwZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDQVJkLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENBUmVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM2NzMiIHk9IjEwNjA4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCMHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDRFQjQwMkJCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENLQjF1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0IxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tCMi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tCM2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tCMy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQjRlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENLQjAtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0tCMU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDM3NiIgeT0iMjEyNDIiIHdpZHRoPSIzNTY0IiBoZWlnaHQ9IjIxMTYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NCZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDFBNTAxQjYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ0tDQ2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDQy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDRGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NEdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDRC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NFT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDRWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NFdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDRk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ0tDQnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDS0NCLWZYRWR1cUhvT0piVVJaUnciIHg9IjE1NzQiIHk9IjEwMTkzIiB3aWR0aD0iMzQ1NCIgaGVpZ2h0PSIxMzc1OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFCNyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDVHpZT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6WWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpaT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUelplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUelotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHphT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUemFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHphdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHphLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDVHpYZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENUelh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUwODciIHk9IjQ4MTciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpiT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQjgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Yi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ1R6Y09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUemNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Y3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6ZE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpkZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6ZHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpkLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4d09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzh3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4d3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4dy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ1R6YmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDVHpidWZYRWR1cUhvT0piVVJaUnciIHg9IjE0MjE1IiB5PSIzNDQ1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4eE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUNCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOHgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENjOHlPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzh5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOHl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4eS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOHpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4emVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOHp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4ei1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4MGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjODAtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENjOHhlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ2M4eHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDM1MSIgeT0iNTk4NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RUUxMDExMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzgxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDYzgyT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4MmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzgydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzgzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjODNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzgzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjODMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzg0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjODRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzg0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzg0LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDYzgxZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENjODF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjQ5MjUiIHk9IjUyNzQiIHdpZHRoPSIyOTg4IiBoZWlnaHQ9IjM2NzQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlFT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ0NzAwRkIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5RS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ2M5Rk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5RnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5R09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlHZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5R3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlHLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5SE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlIZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5SHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5SC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ2M5RWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDYzlFdWZYRWR1cUhvT0piVVJaUnciIHg9IjE1NjYiIHk9IjI3OTQiIHdpZHRoPSIzNTczIiBoZWlnaHQ9IjY5MDgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRDUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210NC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ210NU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDMwMSIgaGVpZ2h0PSI5OTAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210NWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdDZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdDYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdDdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXQ3LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDbXQ0ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENtdDR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI5ODciIHk9Ijc5OTIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HcVVKdC1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHNob3dzIGFsbCBndWlkYW5jZSB0eXBlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyB0byBvdGhlciBjb250ZW50IGVsZW1lbnRzLiAgQXNzb2NpYXRpb25zIGFuZCBtdWx0aXBsaWNpdGllcyBoYXZlIGJlZW4gcHJlZGVmaW5lZCBvbiB0aGF0IGxldmVsIG9mIGRldGFpbCB0byBlbnN1cmUgdGhhdCBndWlkYW5jZSBpcyBvbmx5IHJlbGF0ZWQgdG8gYXBwcm9wcmlhdGUgY29udGVudCBlbGVtZW50cy4gIEZvciBleGFtcGxlLCBVTUEgZGVmaW5lcyB0aGF0IG9ubHkgb24gY2hlY2tsaXN0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggb25lIGNvbnRlbnQgZWxlbWVudCBhdCBhIHRpbWUuICBPdGhlciBwYWNrYWdlcyBhZGQgdmFyaWFiaWxpdHkgY2FwYWJpbGl0aWVzIHRvIGNoZWNrbGlzdHMgKGFuZCBvdGhlciBjb250ZW50IGVsZW1lbnRzKSB0aGF0IGFsbG93cyB0byBkeW5hbWljYWxseSBwcm92aWRlIGFkZGl0aW9uYWwgY2hlY2sgcG9pbnRzIG9yIGV2ZW4gY2hlY2sgcG9pbnQgZ3JvdXBpbmdzIHRvIGNoZWNrIGxpc3Qgc28gdGhhdCBhbiBhc3NvY2lhdGVkIGNoZWNrIGxpc3QgYWx3YXlzIGNvbnRhaW5zIHRoZSByaWdodCBjaGVjayBwb2ludHMgd2l0aGluIHRoZSBjb250ZXh0IG9mIGEgcGFydGljdWxhciBtZXRob2QgY29uZmlndXJhdGlvbiBvciBwcm9jZXNzLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ0FSUGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMEIwIiBzb3VyY2U9Il9IQjNHNE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ0FSTGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDQVJRZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ0FSUHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENBUlAtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEwODMsIC0yNDUsIDIyMTgsIDQ2NV0kWy0yNDU1LCAtNTMzLCA4NDYsIDE3N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSENBUlJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hDQVJSZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENLQjR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI0MDIzNiIgc291cmNlPSJfSENLQjB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENLQjB1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0tCNXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNTAzN0EiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0I2dWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0I3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNTAzNzAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQjhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM0MiIgeT0iNDU3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQjgtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjk1IiB5PSItNDcwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQi1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQjl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0ItZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQi0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQl9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQi11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0JfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzdBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDQU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tCX3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDQk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDQXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENLQjQtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ0tCNU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNzc4LCA4LCAxNzc4LCA4XSRbMzM3OCwgOCwgMzM3OCwgOF0kWzMzNzgsIDI1OTAsIDMzNzgsIDI1OTBdJFs4MDQsIDI1OTAsIDgwNCwgMjU5MF0kWzgwNCwgMTA1OCwgODA0LCAxMDU4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENLQ0ZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MCIgc291cmNlPSJfSENBUkhlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENLQ0JlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NHLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0tDR2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ0hlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgwNSIgeT0iLTI3OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjczIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ0lPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDgyIiB5PSIyNzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ0ktZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA0NiIgeT0iLTM3MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjcxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDSnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NjEiIHk9IjM0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NLLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NLZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NMLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NMZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ011ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ00tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ01lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ04tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ05lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDS0NGdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENLQ0YtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE4MDMsIC0xMDEsIDExMDQ5LCAzMDk4XSRbLTExMjM1LCAtMTAxLCAxNjE3LCAzMDk4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENLQ1FlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI4RSIgc291cmNlPSJfSENBUkxlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENLQ0JlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NSLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0tDUmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI5MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ1NlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwNDEiIHk9Ii0yODAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI5MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NUT2ZYRWR1cUhvT0piVVJaUnciIHg9IjYzNSIgeT0iMTY5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjhGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NULWZYRWR1cUhvT0piVVJaUnciIHg9Ijk3NSIgeT0iLTQ1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NVZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjhGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDVXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0OTIiIHk9IjM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NWLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NWZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NXLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NXZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI5MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ1gtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ1hlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ1ktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ1llZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDS0NRdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENLQ1EtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg0NiwgNTksIDExNTQ4LCAxMTI2XSRbLTEwNzc4LCA1OSwgMTYxNywgMTEyNl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDS0NaT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEMiIHNvdXJjZT0iX0hDQVJSdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDS0NCZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENLQ2FPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NiT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii05MzYiIHk9Ii0yNTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NiLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xOTkiIHk9IjE4NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDY3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MzciIHk9Ii00NTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDZE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ2RlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc5IiB5PSIzMTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTRFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDZXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDZU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDZnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDZk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NnT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NodWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NoT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ0tDWmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDS0NadWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05NTYsIDE2LCAxMTE4NCwgLTc0NV0kWy0xMDUyNCwgMTYsIDE2MTcsIC03NDVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ1R5ME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjBFIiBzb3VyY2U9Il9IQ0FSVnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ0tDQmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5MWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDVHkxT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5MS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5MmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R5Mk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItOTE0IiB5PSIxNjkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5MnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHkyLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xOTUiIHk9Ii0yOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5M2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHkzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUeTN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAzOSIgeT0iLTM0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHk0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5NHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R5NGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTM4IiB5PSIyNDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5NC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5NWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R5NXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R5NU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5NmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R5NnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R5Nk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHk3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHk3dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHk3T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5Ny1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5OGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHk4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHk4T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ1R5MGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDVHkwdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05MjIsIDMzLCAxMTE2NywgLTI0MDRdJFstMTA0NzMsIDMzLCAxNjE3LCAtMjQwNF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDVHk4LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzUiIHNvdXJjZT0iX0hDQVJadWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDS0NCZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5OXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHktT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5LWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENUeTktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHktdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHlfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHktLWZYRWR1cUhvT0piVVJaUnciIHg9Ii05NTEiIHk9Ii00NTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5X2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeV8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHlfdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDYiIHk9IjIyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6QWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTkyIiB5PSItMzM4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpCT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMjIiIHk9IjMwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpDZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpCLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Q3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpEZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpDLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6RHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUekVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUekZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDVHk5T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENUeTllZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTkxNCwgLTQyLCAxMTEyNSwgLTQwNTVdJFstMTA0MjIsIC00MiwgMTYxNywgLTQwNTVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ1R6RnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5M0QwMzIxIiBzb3VyY2U9Il9IQ0tDQmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ0FSZHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Ry1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDVHpHdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6SGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDk5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6SC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6SHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTA2MiIgeT0iMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeklPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDk5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6SXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTNGMDA0OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6Sk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4OTMiIHk9Ii0xMDIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6SnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDQ5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6S09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6Si1mWEVkdXFIb09KYlVSWlJ3IiB4PSI1MzciIHk9IjIxMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwOTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpMT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpLdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6TGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwNDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpNT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpMdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6TWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTNGMDA5OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUek0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUek5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUek11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwNDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUek9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUek51ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDVHpGLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENUekdPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTYxNywgLTYwMzYsIC0xMDA2NiwgLTQyXSRbMTAyNzAsIC02MDM2LCAtMTQxMywgLTQyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENUek9lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMCIgc291cmNlPSJfSENLQjB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENLQ0JlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpQLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ1R6UGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUelFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExMzIiIHk9IjEzNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpST2ZYRWR1cUhvT0piVVJaUnciIHg9Ii00MzgiIHk9Ii00MzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6UnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUelItZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjQ0IiB5PSIxOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6U2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0ExIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Uy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6U3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzc4IiB5PSItMjYxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUelQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUelRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUelUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUelVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0EyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6VnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6Vi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6VmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeldPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeld1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6Vy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6V2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENUek91ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ1R6Ty1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTc3OCwgLTUwLCAxMDk3MiwgNTE4MV0kWy0xMTEzMywgLTUwLCAxNjE3LCA1MTgxXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENjODdlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNCIgc291cmNlPSJfSENjOHhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENjODFPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzg4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzg4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ2M4OGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjODllZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTczMiIgeT0iLTIxMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzg5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4LWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOC1PZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjQiIHk9IjMwNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzgtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOF9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M4LS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5NzgiIHk9Ii0yNTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4X2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOF8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOF91ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzE2IiB5PSItMjYzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOUEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOUFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOUItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOUJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5Q3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5Qy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5Q2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOURPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5RC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5RGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENjODd1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ2M4Ny1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMDQxLCAtMTAxLCAtOTk4MiwgLTc2Ml0kWzk1MzMsIC0xMDEsIC0xNDkwLCAtNzYyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENjOUlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMSIgc291cmNlPSJfSENUelhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENjOUVPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlKdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ2M5Sk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOUtPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI1NSIgeT0iLTI3OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5TE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOUstZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzcyIiB5PSI0MTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5TGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOUx1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIyNCIgeT0iLTI3OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlNT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5TXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5TWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5OCIgeT0iMzMxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOU0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOU5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOU51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOU5PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOU9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOU91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOU9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5UGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5UHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5UE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5UXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5UU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENjOUllZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ2M5SXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzYyLCAtNjcsIDEwODcxLCAtMTAzMl0kWy05OTU2LCAtNjcsIDE2NzYsIC0xMDMyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENjOVEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDQyIgc291cmNlPSJfSENUemJPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENjOUVPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlTZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ2M5Ui1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOVMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkwNSIgeT0iLTMxMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5VC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOVR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyNiIgeT0iMjg4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5VXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlVZWZYRWR1cUhvT0piVVJaUnciIHg9IjEwOTQiIHk9IjI4OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlVLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5VmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5Vk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTQiIHk9Ii0zNzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5VnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5V09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5V2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5Vi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5WE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5WGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5Vy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0UiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlZZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlYLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5WXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5Wk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlaZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlZLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ2M5Uk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDYzlSZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05MjIsIC01OSwgMTA3NjEsIC0yMzk2XSRbLTEwMDA3LCAtNTksIDE2NzYsIC0yMzk2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENjOWItZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg4MDJEMCIgc291cmNlPSJfSENjOUVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENjOHhPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ210d2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdHhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTk5NSIgeT0iLTIxMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXR5T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210eXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0MiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdHktZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTAxIiB5PSItMTEwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdHp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjAiIHk9IjMyMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0UiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXQwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXQwZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210MU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0MiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXQxLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXQxZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210Mk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdDItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdDJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0MiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdDMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdDNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDYzljT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENjOWNlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTY3NiwgMjAzLCAtMTAyNjEsIDBdJFsxMDg5NiwgMjAzLCAtMTA0MSwgMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDbXQ4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjYiIHNvdXJjZT0iX0hDbXQ0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDYzgxT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210OC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210OXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENtdDlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXQtT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii02OTciIHk9Ii0yMzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210LXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdF9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXQtLWZYRWR1cUhvT0piVVJaUnciIHg9IjE0MzciIHk9IjI2MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXRfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdF8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ210X3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI4NDIiIHk9Ii0yMDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211QU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzg0IiB5PSIzNTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211QS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211QmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ211QnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211Qk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211Q2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ211Q3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211Q09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVEZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXVEdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVET2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211RC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211RWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXVFdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVFT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ210OGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDbXQ4dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIxNTAsIC0xNiwgLTkxMjcsIDEzNTRdJFs5Nzg3LCAtMTYsIC0xNDkwLCAxMzU0XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENtdUUtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNSIgc291cmNlPSJfSENtdDRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENjOUVPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVHZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ211Ri1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUctZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc4OSIgeT0iLTQ1NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211SC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM5NSIgeT0iMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211SXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVJZWZYRWR1cUhvT0piVVJaUnciIHg9Ijc4MyIgeT0iLTQ1NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVJLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211SmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211Sk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNzciIHk9IjM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXVLZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVKLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211S3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXVMZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVLLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211THVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdU1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdU1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdU5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdU0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDbXVGT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENtdUZlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIxNTAsIDAsIDk1MzMsIDIyMzVdJFstMTAwMDcsIDAsIDE2NzYsIDIyMzVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il8tZzdMc08wb0VkdXRDTEVDTjk2Qk53IiBlbGVtZW50PSJfLWQ4d01PMG9FZHV0Q0xFQ045NkJOdyIgc291cmNlPSJfSENLQ0JlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENBUTNlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0xzLTBvRWR1dENMRUNOOTZCTnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THRlMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0x0dTBvRWR1dENMRUNOOTZCTnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXy1nN0x0TzBvRWR1dENMRUNOOTZCTnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMdC0wb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfLWdCejB1MG9FZHV0Q0xFQ045NkJOdyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THVlMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfLWc3THVPMG9FZHV0Q0xFQ045NkJOdyIgeD0iLTQ3NyIgeT0iMjYzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THV1MG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8tZ0J6MHUwb0VkdXRDTEVDTjk2Qk53Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMdk8wb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfLWc3THUtMG9FZHV0Q0xFQ045NkJOdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0x2ZTBvRWR1dENMRUNOOTZCTnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXy1lMWhBTzBvRWR1dENMRUNOOTZCTnciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0x2LTBvRWR1dENMRUNOOTZCTnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfLWc3THZ1MG9FZHV0Q0xFQ045NkJOdyIgeD0iMzE3IiB5PSIyMzciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMd08wb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfLWUxaEFPMG9FZHV0Q0xFQ045NkJOdyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THd1MG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfLWc3THdlMG9FZHV0Q0xFQ045NkJOdyIgeD0iLTY2NyIgeT0iLTIwOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0x3LTBvRWR1dENMRUNOOTZCTnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8tZ0J6MHUwb0VkdXRDTEVDTjk2Qk53Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMeGUwb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8tZzdMeHUwb0VkdXRDTEVDTjk2Qk53Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8tZzdMeE8wb0VkdXRDTEVDTjk2Qk53IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWhFOHNPMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfLWUxaEFPMG9FZHV0Q0xFQ045NkJOdyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWhFOHN1MG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfLWhFOHMtMG9FZHV0Q0xFQ045NkJOdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfLWhFOHNlMG9FZHV0Q0xFQ045NkJOdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1oRTh0TzBvRWR1dENMRUNOOTZCTnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfLWdCejB1MG9FZHV0Q0xFQ045NkJOdyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWhFOHR1MG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfLWhFOHQtMG9FZHV0Q0xFQ045NkJOdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfLWhFOHRlMG9FZHV0Q0xFQ045NkJOdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1oRTh1TzBvRWR1dENMRUNOOTZCTnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8tZTFoQU8wb0VkdXRDTEVDTjk2Qk53Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8taEU4dXUwb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXy1oRTh1LTBvRWR1dENMRUNOOTZCTnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXy1oRTh1ZTBvRWR1dENMRUNOOTZCTnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il8tZzdMc2Uwb0VkdXRDTEVDTjk2Qk53IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iXy1nN0xzdTBvRWR1dENMRUNOOTZCTnciIHBvaW50cz0iWzY1LCA1NywgLTI2MiwgLTE4NF0kWzI3MCwgMjQ1LCAtNTcsIDRdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY0OUZFNzAzQzEiIHR5cGU9IkNsYXNzIiBuYW1lPSJUYXhvbm9teSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvc09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTlBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEM1b3RPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW90ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvdWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3V1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvdS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3ZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvdmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3Z1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1b3YtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEM1b3NlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQzVvc3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjkzNyIgeT0iMTAwMTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW93T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQzVveE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVveHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW94LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVveU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW95ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVveXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW95LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW96ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvei1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQzVvd2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDNW93dWZYRWR1cUhvT0piVVJaUnciIHg9IjI5MzU2IiB5PSIxMDAxMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW8wLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDNW8xT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW8xdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW8yT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1bzJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW8ydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1bzItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW8zT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1bzNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW8zdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW8zLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDNW8wZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEM1bzB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjIwNTYiIHk9IjEwMDExIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvNE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEM1bzVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW81ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvNmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvNi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvN2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1bzctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEM1bzRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQzVvNHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTkxNyIgeT0iMTAwMTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW84T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERac09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRERac2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERacy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERadGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFp0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERadC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFp1T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERadWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFp1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERadS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERadk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQzVvOGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDNW84dWZYRWR1cUhvT0piVVJaUnciIHg9IjQ5MSIgeT0iMTAwMTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp2ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTQiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERad09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRERad2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERady1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaeGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFp4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaeC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFp5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaeWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFp5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaeS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaek9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRERadnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hERFp2LWZYRWR1cUhvT0piVVJaUnciIHg9Ijk5MTciIHk9IjEwMDAyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaemVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEREWjBlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFowdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaMXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaMk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaMnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWjNPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEREWnp1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERaei1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNDQwMCIgeT0iMTAwMTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFozZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRERaNGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFo1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaNWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFo1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaNS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFo2T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaNmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFo2dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaNi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaN09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRERaM3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hERFozLWZYRWR1cUhvT0piVVJaUnciIHg9IjY2MTgiIHk9IjEwMDExIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaN2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUNCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEREWjhlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFo4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaOXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaLU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWi1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaLXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWi0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWl9PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEREWjd1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERaNy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjM3MyIgeT0iMTAwMTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFpfZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRTAiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRERhQWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhQmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFCdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhQi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFDT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhQ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFDdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhQy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERhRE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRERaX3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hERFpfLWZYRWR1cUhvT0piVVJaUnciIHg9IjI5MTY0IiB5PSIxMTcyOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ0RUI0MDJCQiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hERGFHdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFIdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREYUgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREYUllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFJdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREYUktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFKT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFKZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hERGFGLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEREYUdPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDMzMSIgeT0iMTAwMTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFKdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRERhS3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhTHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFMLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhTU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFNZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhTXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFNLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhTk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERhTmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRERhSi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERhS09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTgyNyIgeT0iNDgzNSIgd2lkdGg9IjM0NzkiIGhlaWdodD0iMTEwMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWozT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hETWozZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNzc2IiBoZWlnaHQ9IjExMzQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qM3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWozLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWo0ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNajR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWo0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNajVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWo1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNajV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWo1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hETWo2T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hETWoydWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWoyLWZYRWR1cUhvT0piVVJaUnciIHg9IjE1NTA4IiB5PSI3MzQ1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qLS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5MTMwMkM1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNal91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSERNal8tZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4MDIiIGhlaWdodD0iOTk5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rQWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rQS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hETWtCT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rQmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hETWtCdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rQi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hETWtDT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rQ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRE1rQ3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRE1qX09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWpfZWZYRWR1cUhvT0piVVJaUnciIHg9IjMxNzM5IiB5PSIxMDAyMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0ZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hETWtHT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTIyIiBoZWlnaHQ9IjEwNjYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNa0hlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtIdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNa0gtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNa0llZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtJdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hETWtJLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hETWtGZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWtGdWZYRWR1cUhvT0piVVJaUnciIHg9IjE1ODUwIiB5PSIyODUzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il84MjF3RU9vVkVkdU9CUFFBMmhLcVVRIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUQ1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0Utb1ZFZHVPQlBRQTJoS3FVUSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfODIxd0ZPb1ZFZHVPQlBRQTJoS3FVUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzgyMXdGZW9WRWR1T0JQUUEyaEtxVVEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0Z1b1ZFZHVPQlBRQTJoS3FVUSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il84MjF3Ri1vVkVkdU9CUFFBMmhLcVVRIiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0dPb1ZFZHVPQlBRQTJoS3FVUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il84MjF3R2VvVkVkdU9CUFFBMmhLcVVRIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0d1b1ZFZHVPQlBRQTJoS3FVUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il84MjF3Ry1vVkVkdU9CUFFBMmhLcVVRIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0hPb1ZFZHVPQlBRQTJoS3FVUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il84MjF3SGVvVkVkdU9CUFFBMmhLcVVRIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0h1b1ZFZHVPQlBRQTJoS3FVUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfODIxd0gtb1ZFZHVPQlBRQTJoS3FVUSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfODIxd0Vlb1ZFZHVPQlBRQTJoS3FVUSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il84MjF3RXVvVkVkdU9CUFFBMmhLcVVRIiB4PSIxNTE5NSIgeT0iMTAwMDkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HcWQ2a2VmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UgZGVmaW5lcyBhIG51bWJlciBvZiBwcmUtZGVmaW5lZCBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcyB0aGF0IGNhbiBiZSByZWxhdGVkIHRvIHNwZWNpZmljIGNvbnRlbnQgZWxlbWVudHMuICBHdWlkYW5jZSBpcyBhIGNvbnRlbnQgZWxlbWVudCBpdHNlbGYsIHNvIGl0IGlzIHBvc3NpYmxlIHRvIGFzc29jaWF0ZSBndWlkYW5jZSB0byBndWlkYW5jZS4gVGhpcyBkaWFncmFtIHNob3dzIHRoZSB0YXhvbm9teSBvZiBhbGwgZ3VpZGFuY2UgdHlwZXMuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hERGFEZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwQjAiIHNvdXJjZT0iX0hERFpfZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDNW93T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEREYUVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hERGFEdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEREYUQtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTMxOCwgMCwgMTc3M10kWzAsIC0xNzczLCAwLCAzMThdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hERGFGT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRERhRmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hERGFSdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDY2RjAxMTkiIHNvdXJjZT0iX0hDNW84T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhVE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEREYVN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hERGFSLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRERhU09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5NTIsIC0zMTcsIC0xMjAzOSwgNDAyMl0kWzExNTYyLCAtMzg2MiwgLTE0MjksIDQ3N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEREYVRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hERGFUdWZYRWR1cUhvT0piVVJaUnciIGlkPSIoMC4xOTM5NjI0NCwwLjM4NzEyOTcyKSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEREYVQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0NjczMDA1NSIgc291cmNlPSJfSEREYUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYVZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFWZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERhVS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEREYVVPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hERGFVZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzc0MCwgLTMxNywgLTkzMTQsIDQwMjJdJFs4OTQyLCAtMzg2MiwgLTExMTIsIDQ3N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEREYVZ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hERGFWLWZYRWR1cUhvT0piVVJaUnciIGlkPSIoMC4xNTYxNjgzLDAuNzkyNjQ1NikiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hERGFXT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY0RDJBQjAzQ0EiIHNvdXJjZT0iX0hERFozZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhWHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEREYVhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hERGFXZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRERhV3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1NTUsIC0zMTcsIC02OTU5LCA0MDIyXSRbNjY5MywgLTM4NjIsIC04MjEsIDQ3N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEREYVgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hERGFZT2ZYRWR1cUhvT0piVVJaUnciIGlkPSIoMC4yODIxNDg4LDAuNzY2MDg3ODMpIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRERhWWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQ2N0IwMjVEIiBzb3VyY2U9Il9IRERadmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYVpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNam9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hERGFaZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRERhWXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEREYVktZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzcwLCAtMzE3LCAtNDYzMSwgNDAyMl0kWzQ0NDUsIC0zODYyLCAtNTU2LCA0NzddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWpvZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERNam8tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA5QiIgc291cmNlPSJfSEREWjdlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWpwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWpxZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRE1qcC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERNanBPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hETWpwZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE4NSwgLTMxNywgLTIzODIsIDQwMjJdJFsyMjc2LCAtMzg2MiwgLTI5MSwgNDc3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qcXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hETWpyT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwOTAiIHNvdXJjZT0iX0hDNW80T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWpzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERNanNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hETWpyZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRE1qcnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjcsIC0zMTcsIDM3MCwgNDAyMl0kWy0zNDQsIC0zODYyLCA1MywgNDc3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qcy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNanRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9IigwLjQ3NzA2MjA1LDAuNzY2MDg3ODMpIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRE1qdGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDVGIiBzb3VyY2U9Il9IQzVvME9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWp1ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRE1qdHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERNanQtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEwNiwgLTMxNywgMTM0OSwgNDAyMl0kWy0xMjk3LCAtMzg2MiwgMTU4LCA0NzddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWp2T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qdmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuNTk2NjI0NywwLjc5MjY0NTYpIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRE1qdnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDkxIiBzb3VyY2U9Il9IRERaemVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNandlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWp3dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRE1qdi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERNandPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI2NSwgLTMxNywgMzQzOSwgNDAyMl0kWy0zMzA3LCAtMzg2MiwgMzk3LCA0NzddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWp4ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qeHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuNjkwNzUzNSwwLjc5MjY0NTYpIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRE1qeC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDVFIiBzb3VyY2U9Il9IQzVvc09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWp5LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRE1qeU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERNanllZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTQyMywgLTMxNywgNTQyNCwgNDAyMl0kWy01MjEyLCAtMzg2MiwgNjM1LCA0NzddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWp6dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qei1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuNzY2MzQxOCwwLjU3NzExOTUpIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRE1qME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDU2IiBzb3VyY2U9Il9IQzVvd09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWoxT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRE1qMGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERNajB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTU4MiwgLTMxNywgNzQ4NywgNDAyMl0kWy03MTcwLCAtMzg2MiwgODk5LCA0NzddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWoxLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qMk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuODY2ODg4NSwwLjc5MjY0NTYpIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRE1qNmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTFEIiBzb3VyY2U9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRERhSnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWo3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRE1qNnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRE1qNi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODAsIC01MDIsIDAsIDEzNTBdJFstODAsIC0xMjk2LCAwLCA1NTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWo4T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qOGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hETWtDLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjJGQTBDMzAwN0MiIHNvdXJjZT0iX0hETWotLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rRWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERNa0QtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hETWtET2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRE1rRGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzY4LCAtMzE4LCA5Nzg5LCAzOTk1XSRbLTkzOTMsIC0zODM2LCAxMTY0LCA0NzddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWtFdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1rRS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuODg1OTA0NDMsMC41NzcxMTk1KSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERNa0pPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzRBMDMwNiIgc291cmNlPSJfSEREYUp1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERNa0ZPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtLdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRE1rS09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERNa0plZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERNa0p1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI2LCAtNTU1LCAwLCAxNTg4XSRbLTI2LCAtMTgyNSwgMCwgMzE4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1rSy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNa0xPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il84MjF3SU9vVkVkdU9CUFFBMmhLcVVRIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNEExRDYwMjQ1IiBzb3VyY2U9Il84MjF3RU9vVkVkdU9CUFFBMmhLcVVRIiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0ktb1ZFZHVPQlBRQTJoS3FVUSIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il84MjF3SmVvVkVkdU9CUFFBMmhLcVVRIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0p1b1ZFZHVPQlBRQTJoS3FVUSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfODIxd0pPb1ZFZHVPQlBRQTJoS3FVUSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iXzgyMXdJZW9WRWR1T0JQUUEyaEtxVVEiIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il84MjF3SXVvVkVkdU9CUFFBMmhLcVVRIiBwb2ludHM9Ils3OSwgLTMxNywgLTEyNDQsIDUyMTNdJFsxMjE3LCAtNTA1MywgLTEwNiwgNDc3XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwSDJ5LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTAiPgotICAgICAgICAgICAgPGJvZHk+MDM8L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9OMTlsY094TUVkdU9Ock1SZ216NDhBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk0Ii8+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTkiIG5hbWU9IkNvbmNlcHQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcFJueHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTk5Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBDb25jZXB0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwNTYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5QSIgbmFtZT0iQ2hlY2tsaXN0Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BSbnl1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5QSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgQ2hlY2tsaXN0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuIDwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA1RSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUEzIiBuYW1lPSJFeGFtcGxlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BSbnp1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBMyI+Ci0gICAgICAgICAgICAgIDxib2R5PkFuIEV4YW1wbGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHR5cGljYWwsIHBhcnRpYWxseSBjb21wbGV0ZWQsIHNhbXBsZSBpbnN0YW5jZSBvZiBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIG9yIHNjZW5hcmlvIGxpa2UgZGVzY3JpcHRpb25zIG9mIGhvdyBUYXNrIG1heSBiZSBwZXJmb3JtZWQuIEV4YW1wbGVzIGNhbiBiZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdHMgYXMgd2VsbCBhcyBUYXNrcyB0aGF0IHByb2R1Y2UgdGhlbSBhcyB3ZWxsIGFzIGFueSBvdGhlciBDb250ZW50IEVsZW1lbnQuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDVGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTQiIG5hbWU9Ikd1aWRlbGluZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwUm4wdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTQiPgotICAgICAgICAgICAgICA8Ym9keT5BIEd1aWRlbGluZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCBvbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcyAoZS5nLiBncm91cGVkIHRvZ2V0aGVyIGFzIGFjdGl2aXRpZXMpIG9yIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuICBBbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZSB0aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkIGFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzIGFuZCBtYXR1cml0eSwgZXRjLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREY0NjdCMDI1RCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI3IiBuYW1lPSJSZXBvcnQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcGF4cy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI3Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBSZXBvcnQgaXMgYSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA5MCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI4IiBuYW1lPSJUZW1wbGF0ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwYXh0LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQjgiPgotICAgICAgICAgICAgICA8Ym9keT5BIFRlbXBsYXRlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGZvciBhIHdvcmsgcHJvZHVjdCBhIHByZS1kZWZpbmVkIHRhYmxlIG9mIGNvbnRlbnRzLCBzZWN0aW9ucywgcGFja2FnZXMsIGFuZC9vciBoZWFkaW5ncywgYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBob3cgdGhlIHNlY3Rpb25zIGFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2Fubm90IG9ubHkgYmUgcHJvdmlkZWQgZm9yIGRvY3VtZW50cywgYnV0IGFsc28gZm9yIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEgc3RvcmVzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA5MSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMxIiBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcGF4dS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMxIj4KLSAgICAgICAgICAgICAgPGJvZHk+U3VwcG9ydGluZyBNYXRlcmlhbHMgaXMgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURGNDY2RjAxMTkiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDQiIgbmFtZT0iVG9vbE1lbnRvciI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwYXh2LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQ0IiPgotICAgICAgICAgICAgICA8Ym9keT5BIFRvb2wgTWVudG9yIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrIGEgV29yayBQcm9kdWN0IGVpdGhlciBpbiB0aGUgY29udGV4dCBvZiBvciBpbmRlcGVuZGVudCBmcm9tIGEgVGFzayBvciBBY3Rpdml0eS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwOUIiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFFMCIgbmFtZT0iV2hpdGVwYXBlciI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwYXh3LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRTAiPgotICAgICAgICAgICAgICA8Ym9keT5XaGl0ZXBhcGVycyBhcmUgYSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwQjAiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTkiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFGMyIgbmFtZT0iVGVybURlZmluaXRpb24iPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcGtpcy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUYzIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGVybURlZmluaXRpb25zIGRlZmluZSBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUaGV5IGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjREMkFCMDNDQSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDRFQjQwMkJCIiBuYW1lPSJQcmFjdGljZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwa2l0LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENEVCNDAyQkIiPgotICAgICAgICAgICAgICA8Ym9keT5BIFByYWN0aWNlIHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAmcXVvdDtNYW5hZ2UgUmlza3MmcXVvdDssICZxdW90O0NvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSZxdW90OywgJnF1b3Q7QXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCZxdW90OywgZXRjLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjQ2NzMwMDU1IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzcwIiBuYW1lPSJzdWJQcmFjdGljZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRkQ0RUI0MDJCQiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEZENThCNDAyMzYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcUtZcGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcUtZcE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMSIgbmFtZT0iY29udGVudFJlZmVyZW5jZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcVVKay1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcVVKa3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVENDcwMEZCIiBuYW1lPSJXb3JrUHJvZHVjdCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwa2l1LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ0NzAwRkIiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGlzIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlJ3MgZXh0ZW5zaW9uIG9mIFdvcmsgUHJvZHVjdCAoZGVmaW5lZCBpbiBDb250ZW50IEVsZW1lbnRzKSBwcm92aWRpbmcgYWRkaXRvbmFsIGFzc29jaWF0aW9ucy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTMiIG5hbWU9InJlcG9ydHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFCNyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcUJPci1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcUJPcnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRSIgbmFtZT0idGVtcGxhdGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQjgiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNDIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FLWWx1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FLWWxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0MiIG5hbWU9InRvb2xNZW50b3JzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQ0IiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QUJDODgwMkQwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FVSm8tZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FVSm91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjciIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxVUp0T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxVUpzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUVFMTAxMTEiIG5hbWU9IlRhc2siPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcGtpdi1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFRTEwMTExIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBpcyB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZSdzIGV4dGVuc2lvbiBvZiBUYXNrIChkZWZpbmVkIGluIENvbnRlbnQgRWxlbWVudHMpIHByb3ZpZGluZyBhZGRpdGlvbmFsIGFzc29jaWF0aW9ucy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDYiIG5hbWU9InRvb2xNZW50b3JzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQ0IiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA0Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FLWW4tZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FLWW51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjgiIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyNiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxVUpyZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxVUpyT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURGNDFBNTAxQjYiIG5hbWU9IkNvbnRlbnRFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3B1VHMtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgaXMgdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UncyBleHRlbnNpb24gb2YgQ29udGVudCBFbGVtZW50IChkZWZpbmVkIGluIENvbnRlbnQgRWxlbWVudHMpIHByb3ZpZGluZyBhZGRpdG9uYWwgYXNzb2NpYXRpb25zLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MyIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMxIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dwM2RxT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dwM2RwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjkxIiBuYW1lPSJjb25jZXB0c0FuZFBhcGVycyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTk5IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI4RSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dwM2RzZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dwM2RzT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjEwIiBuYW1lPSJjaGVja2xpc3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOUEiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjBFIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3AzZHV1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3AzZHVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEUiIG5hbWU9Imd1aWRlbGluZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBNCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEMiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcUJPcHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcUJPcGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNyIgbmFtZT0iZXhhbXBsZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBMyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcUJPdU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcUJPdC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMTNDOTNGMDA0OSIgbmFtZT0iYXNzZXRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjEzQzkxMzAyQzUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxM0M5M0QwMzIxIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FVSm5PZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FVSm0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tZTFoQU8wb0VkdXRDTEVDTjk2Qk53IiBuYW1lPSJ0ZXJtRGVmaW5pdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUYzIiBhc3NvY2lhdGlvbj0iXy1kOHdNTzBvRWR1dENMRUNOOTZCTnciPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il8tZ0J6MGUwb0VkdXRDTEVDTjk2Qk53IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tZ0J6ME8wb0VkdXRDTEVDTjk2Qk53Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxM0M5MTMwMkM1IiBuYW1lPSJSZXVzYWJsZUFzc2V0Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3B1VHUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTEzMDJDNSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUmV1c2FibGUgQXNzZXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZwotaG93IHRoZSBhc3NldCBzaG91bGQgYmUgdXNlZC4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMkZBMEMzMDA3QyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUQ1IiBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcHVUdi1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUQ1Ij4KLSAgICAgICAgICAgICAgPGJvZHk+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucyBxdWFsaWZ5IHRoZSB1c2FnZSBhbmQgYXBwbGljYXRpb24gb2YgZXN0aW1hdGlvbiBtZXRyaWNzIGluIHRoZSBkZXZlbG9wbWVudCBvZiBhbiBhY3R1YWwgZXN0aW1hdGUuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNEExRDYwMjQ1IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MSBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjczIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3AzZG9lZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MCI+Ci0gICAgICAgICAgICAgIDxib2R5PkNvbnRlbnQgRWxlbWVudHMgY2FuIGJlIHJlbGF0ZWQgdG8gYW55IG51bWJlciBvZiBTdXBwb3J0aW5nIE1hdGVyaWFsIGd1aWRhbmNlIGVsZW1lbnRzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MSIgbmFtZT0iX2NvbnRlbnRFbGVtZW50IiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERjQxQTUwMUI2IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjcwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3AzZHBlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3AzZHBPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI4RSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjhGIF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOTEiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcDNkcXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjhFIj4KLSAgICAgICAgICAgICAgPGJvZHk+Q29udGVudCBFbGVtZW50cyBjYW4gcmVmZXIgdG8gYW55IG51bWJlciBvZiBDb25jZXB0IGd1aWRhbmNlLiA8L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOEYiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI4RSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dwM2RydWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dwM2RyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMEUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIwRiBfM0FEQzdCNzQwMjJENDFERTVENzMwMjEwIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3AzZHMtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIwRSI+Ci0gICAgICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGNoZWNrIHBvaW50cyByZWxhdGVkIHRvIGEgcGFydGljdWxhciBjb250ZW50IGVsZW1lbnRzLiAgVGhlc2UgYXJlIHR5cGljYWxseSB1c2VkIGluIHJldmlld3MgYW5kIGluc3BlY3Rpb25zIG9uIHdvcmsgcHJvZHVjdHMuCi0KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIwRiIgbmFtZT0iX2NvbnRlbnRFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURGNDFBNTAxQjYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMEUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcDNkdC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcDNkdHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTRDIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEQgXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwM2R2T2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEMiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIGFjY2VzcyB0byBkZXRhaWxlZCBHdWlkZWxpbmVzIHJlbGF0ZWQgdG8gdGhpcyBDb250ZW50IEVsZW1lbnQuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTREIiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0QyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxQk9vLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxQk9vdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTEiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMiBfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UzIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FCT3FPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUmVwb3J0IGV4dHJhY3RzIGluZm9ybWF0aW9uIGFib3V0IG9uZSBvciBtb3JlIFdvcmsgUHJvZHVjdDsgbm9ybWFsbHkgZGlyZWN0bHkgZnJvbSBhIHRvb2wgdGhhdCBtYWludGFpbnMgdGhlIFdvcmsgUHJvZHVjdHMuIEZvciBleGFtcGxlLCBhIFJlcG9ydCBjYW4gcHJlc2VudCBkZXRhaWxzIG9mIGFuIEFydGlmYWN0IG9yIGEgc2V0IG9mIEFydGlmYWN0cyBmb3IgdXNlIGluIGEgdGVjaG5pY2FsIHJldmlldy4gPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UyIiBuYW1lPSJfd29ya1Byb2R1Y3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREU1RDQ3MDBGQiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxQk9yT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxQk9xLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNiBfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM3Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FCT3NlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNSI+Ci0gICAgICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGEgc2FtcGxlIG9mIHdoYXQgdGhlIHdvcmsgcHJvZHVjdCBtYXkgbG9vayBsaWtlLCBhbiBhY3R1YWwgaW5zdGFuY2UuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM2IiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxQk90ZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxQk90T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0MiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRCBfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNFIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FCT3V1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDQyI+Ci0gICAgICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGRldGFpbGVkIGd1aWRhbmNlIG9uIGhvdyB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QgaW5kZXBlbmRlbnQgb2YgYSBzcGVjaWZpYyBzZXQgb2YgdGFza3Mgb3IgV0JTLiAgTWF5IGNvbnRhaW4gc3BlY2lmaWMgYWxnb3JpdGhtcyBvciBhbHRlcm5hdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaGVzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRCIgbmFtZT0iX3dvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURFNUQ0NzAwRkIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0MiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcUtZay1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcUtZa3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA0IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDUgXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxS1ltT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDQiPgotICAgICAgICAgICAgICA8Ym9keT5MaW5rcyBUYXNrcyB3aXRoIFRvb2wgTWVudG9ycyB3aGljaCBhcmUgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvdyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBwZXJmb3JtIHRoZSBUYXNrLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNSIgbmFtZT0iX3Rhc2siIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREU1RUUxMDExMSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxS1luT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxS1ltLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNDAyMzYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3MCBfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzdBIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FLWW9lZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI0MDIzNiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUHJhY3RpY2UgY2FuIGJlIGNvbXBvc2VkIG9mIG90aGVyIFByYWN0aWNlcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNTAzN0EiIG5hbWU9Il9wcmFjdGljZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGRDRFQjQwMkJCIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGRDU4QjQwMjM2Ii8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMSBfM0FEQzdCNzQwMjJENDFERjQxQzYwM0EyIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FLWXFPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMCI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUHJhY3RpY2UgY2FuIHJlZmVyZW5jZSBhbnkgQ29udGVudCBFbGVtZW50LiAgVGhlIGFzc29jaWF0aW9uIGV4cHJlc3NlcyB0aGF0IHRoaXMgQ29udGVudCBFbGVtZW50IGlzIHBhcnQgb2Ygb3IgYmVsb25ncyB0byB0aGlzIFByYWN0aWNlLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMiIgbmFtZT0iX3ByYWN0aWNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEZENEVCNDAyQkIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcVVKbHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcVVKbGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxM0M5M0QwMzIxIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwNDkgXzNBREM3Qjc0MDIyRDQyMTNDOTNGMDA5OSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxVUptT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRDAzMjEiPgotICAgICAgICAgICAgICA8Ym9keT5BIHdvcmsgcHJvZHVjdCBpcyByZWxhdGVkIHRvIG9uZSBvciBtb3JlIGFzc2V0cyB0byA8L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwOTkiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERjQxQTUwMUI2IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxM0M5M0QwMzIxIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FVSm4tZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FVSm51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg4MDJEMCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QUJDODkwMzdDIF8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0UiPgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3RSIgbmFtZT0iX3dvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURFNUQ0NzAwRkIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBQkM4ODAyRDAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcVVKcHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcVVKcGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI2IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjcgXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyOCI+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI3IiBuYW1lPSJfdGFzayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERTVFRTEwMTExIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI2Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FVSnF1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FVSnFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY2IF8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjciPgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNiIgbmFtZT0iX3dvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURFNUQ0NzAwRkIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcVVKc2VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcVVKc09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfLWQ4d01PMG9FZHV0Q0xFQ045NkJOdyIgbWVtYmVyRW5kPSJfLWUxaEFPMG9FZHV0Q0xFQ045NkJOdyBfLWdCejB1MG9FZHV0Q0xFQ045NkJOdyI+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfLWdCejB1MG9FZHV0Q0xFQ045NkJOdyIgbmFtZT0iIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERjQxQTUwMUI2IiBhc3NvY2lhdGlvbj0iXy1kOHdNTzBvRWR1dENMRUNOOTZCTnciPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il8tZ0J6MU8wb0VkdXRDTEVDTjk2Qk53IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tZ0J6MC0wb0VkdXRDTEVDTjk2Qk53Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNSIgbmFtZT0iQ2F0ZWdvcmllcyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HcmdjYy1mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MEY0OEZDRTAwNjAiPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY0OEZDRTAwNjAiIHR5cGU9IkNsYXNzIiBuYW1lPSJDYXRlZ29yaXphdGlvbnMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI1OSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1VzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEV1V0T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERXVXVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERXVXUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERXVXZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEV1V2LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEV1VzZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERXVXN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU2MTIiIHk9Ijk4ODAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V3T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRFdVeE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDAxMyIgaGVpZ2h0PSIxMTE3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVeU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEV1V5ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEV1V5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEV1V6ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRFdVei1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRFdVd2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRFdVd3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDI5NCIgeT0iMTM0MTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1UwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzAiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRGdGb2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRm91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0ZwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGcGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0ZwdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGcC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0ZxT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGcWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0ZxdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGcS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGck9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRFdVMGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEV1UwdWZYRWR1cUhvT0piVVJaUnciIHg9IjIxMTkyIiB5PSI5OTMxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGOC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjMxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSERnRjktZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRi1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRi0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGX09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRl9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGX3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRl8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdHQU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0FlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR0F1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSERnRjlPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRGdGOWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjI3MiIgeT0iOTkzMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0p1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEZ0dLdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NDcwIiBoZWlnaHQ9IjExMTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dMdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR0wtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dNT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR01lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dNdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR00tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dOT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dOZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEZ0dKLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEZ0dLT2ZYRWR1cUhvT0piVVJaUnciIHg9IjI3MTI3IiB5PSIxMzQxMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUGx1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEcFBtdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUG5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBudWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUG4tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBvT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUG9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUG8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFBwZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEcFBsLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERwUG1PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjk3NTEiIHk9Ijk5MzEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB5ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQ0IiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRHBQemVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFAwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQMGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFAwdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQMC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFAxT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQMWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFAxdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQMS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQMk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRHBQeXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHBQeS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNDQ1OSIgeT0iMTMyMzUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFAyZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNTgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRHBQM2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQNGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFA0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQNC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFA1T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQNWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFA1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQNS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQNk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRHBQMnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEcFAyLWZYRWR1cUhvT0piVVJaUnciIHg9IjM1NjYxIiB5PSI5OTMxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBbXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QW5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSER6QW51ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QW9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QW91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBby1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBcGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBcC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QXFlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSER6QW0tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHpBbk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjM3NCIgeT0iMzk0NSIgd2lkdGg9IjQyMzMiIGhlaWdodD0iMjE3NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEekE1T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTcyIiBoZWlnaHQ9IjExNjgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QTZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QTYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QTdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekE3LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEekE0ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEekE0dWZYRWR1cUhvT0piVVJaUnciIHg9IjM4ODU0IiB5PSIxMzMwMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QThPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkRFQkEyMDA5QyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEekE5T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMDE0IiBoZWlnaHQ9Ijg5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QS1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBLWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QS11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QV9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBX2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QV91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QV8tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSER6QThlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHpBOHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzODc3NyIgeT0iMTAwMTYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhsT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNEUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4bC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRDh4bU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eG1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4bXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4bk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHhuZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4bnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHhuLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4b09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHhvZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4b3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4by1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRDh4bGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEOHhsdWZYRWR1cUhvT0piVVJaUnciIHg9IjM0MDMiIHk9Ijk5MzEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhyZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4c09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRDh4c2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDE4MiIgaGVpZ2h0PSIxMTE3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4cy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4dGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHh0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4dC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHh1T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4dWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHh1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4dS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4dk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRDh4cnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRDh4ci1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5NDQ4IiB5PSIxMjY2NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEOHh3ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4d3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eHh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eHlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eHl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHh6T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEOHh2dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEQ4eHYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTEwMDYiIHk9Ijk5MTQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzl1Yi1FT29qRWR1VkE3dnQ1cWJJSlEiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dWxJQU9vakVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il85dWxJQWVvakVkdVZBN3Z0NXFiSUpRIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXVsSUF1b2pFZHVWQTd2dDVxYklKUSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dWxJQS1vakVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzl1bElCT29qRWR1VkE3dnQ1cWJJSlEiIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dWxJQmVvakVkdVZBN3Z0NXFiSUpRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzl1bElCdW9qRWR1VkE3dnQ1cWJJSlEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dWxJQi1vakVkdVZBN3Z0NXFiSUpRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzl1bElDT29qRWR1VkE3dnQ1cWJJSlEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dWxJQ2VvakVkdVZBN3Z0NXFiSUpRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzl1bElDdW9qRWR1VkE3dnQ1cWJJSlEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dWxJQy1vakVkdVZBN3Z0NXFiSUpRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il85dWxJRE9vakVkdVZBN3Z0NXFiSUpRIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il85dWItRWVvakVkdVZBN3Z0NXFiSUpRIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXzl1Yi1FdW9qRWR1VkE3dnQ1cWJJSlEiIHg9IjE2ODI3IiB5PSIyMDg5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3JnY2RlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249InxUaGUgQ2F0ZWdvcmllcyBwYWNrYWdlIGNvbnRhaW5zIGNsYXNzZXMgdGhhdCBwcm92aWRlIGRpZmZlcmVudCB3YXlzIHRvIGxvZ2ljYWxseSBjYXRlZ29yaXplIGNvbnRlbnQgZWxlbWVudHMuICBJbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBjYXRlZ29yaWVzIHRoYXQgaGF2ZSBiZWVuIHByZWRlZmluZWQgZm9yIG1vc3QgY29udGVudCBlbGVtZW50IHR5cGVzIGluIHRoaXMgbWV0YS1tb2RlbCwgaXQgcHJvdmlkZXMgdGhlIGNhcGFiaWxpdHkgZm9yIHVzZXJzIHRvIGRlZmluZSB0aGVpciBvd24gY3VzdG9tIGNhdGVnb3JpZXMgb24gY29udGVudCBlbGVtZW50cy4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICZxdW90O1Rlc3RpbmcmcXVvdDsgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC4gVGhpcyBkaWFncmFtIHNob3dzIHRoZSB0YXhvbm9teSBvZiBhbGwgcHJlLWRlZmluZWQvc3RhbmRhcmQgY2F0ZWdvcnkgbWV0YS1jbGFzc2VzIGFzIHdlbGwgYXMgdGhlIGRlZmluaXRpb24gZm9yIEN1c3RvbSBDYXRlZ29yeSBjbGFzc2VzLCB3aGljaCBjYW4gYmUgZGVmaW5lZCBieSB0aGUgdXNlciB0byBjYXRlZ29yaXplcyBhbnkgQ29udGVudCBFbGVtZW50IGFzIHdlbGwgYXMgY2FuIGJlIG5lc3RlZCB3aXRoIG90aGVyIENhdGVnb3JpZXMgKGkuZS4gb3RoZXIgY2F0ZWdvcmllcyBjYW4gYmUgZGVmaW5lZCB0byBiZSBhIHN1Yi1jYXRlZ29yeSBvZiBhbnkgY3VzdG9tIGNhdGVnb3J5KS4mI3hBO3wmI3hBOyIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRGdGcmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE2IiBzb3VyY2U9Il9IRFdVME9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRFdVc09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEZ0ZzZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGdE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGdGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMCIgeT0iLTI5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRnVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDA5IiB5PSIyNzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRnUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg4IiB5PSItMjcwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRnZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc0OCIgeT0iLTU5MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0Z3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0Z3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0Z4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0Z4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRnktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRnllZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRnotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRnplZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEZ0ZydWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERnRnItZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg1NSwgLTQyLCA0MDIxLCA4XSRbLTMzMTgsIC00MiwgMTU1NywgOF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEZ0YwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNTkiIHNvdXJjZT0iX0hEV1V3T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEV1UwT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGMXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERnRjFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0YyT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMCIgeT0iNDQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGMi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5OCIgeT0iLTYzNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGM3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTIzIiB5PSI0ODIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGNGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjQxIiB5PSItODA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRjV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRjVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Y1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRjZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRjZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Y2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGN3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGN09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGOHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGOE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERnRjBlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRGdGMHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjYyLCAtNTY3LCAtOCwgMjk4OF0kWy0yNjIsIC0zMDczLCAtOCwgNDgyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERnR0EtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NCIgc291cmNlPSJfSERnRjgtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERnRjgtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dDZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRGdHQi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR0MtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTk5IiB5PSItMjYyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHRHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTExOSIgeT0iMzE2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0V1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHRWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR0ZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExOCIgeT0iLTMyMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dHZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dGLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHR3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dIZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dHLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR0llZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR0gtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR0plZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR0ktZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEZ0dCT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERnR0JlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg1NSwgNzYsIC04NTUsIDc2XSRbLTMxODMsIDc2LCAtMzE4MywgNzZdJFstMzE4MywgMTQ2NCwgLTMxODMsIDE0NjRdJFstNDA2LCAxNDY0LCAtNDA2LCAxNDY0XSRbLTQwNiwgNDgyLCAtNDA2LCA0ODJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRGdHTnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc3IiBzb3VyY2U9Il9IRGdHSnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRGdGOC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR09lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1BPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEZ0dPdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHUGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTdBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHUHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTEiIHk9IjE1MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTdBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR1FlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzA0IiB5PSItMTA4MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHUk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMiIgeT0iLTI0MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dSLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zOTkiIHk9Ijc5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxN0EiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dUT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dTdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dVT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dUdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHVWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUGtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUGtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR1V1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUGxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUGstZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEZ0dOLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRGdHT09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzU1LCAtNTY3LCAxODc5LCAyOTg4XSRbLTE5MzAsIC0zMDczLCAzMDQsIDQ4Ml0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEcFBwdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQTkiIHNvdXJjZT0iX0hEZ0dKdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEcFBsdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQck9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERwUHF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFByZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFByLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFBydWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMSIgeT0iLTEzNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUHNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODUxIiB5PSIxMDcxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFB0T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii00IiB5PSItMzA2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUHQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAyNSIgeT0iMTM4NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFB2T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFB1dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFB3T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFB2dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQd2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUHhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUHd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUHlPZlhFZHVxSG9PSmJVUlpSdyIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBQeHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERwUHAtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEcFBxT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI5NiwgLTU2NywgLTE2ODQsIDI5ODhdJFsxNzAxLCAtMzA3MywgLTI3OSwgNDgyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERwUDZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGOSIgc291cmNlPSJfSERwUHllZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERwUDJlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHBQN2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUDhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQwIiB5PSItMzczIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBQOU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTciIHk9IjExNTkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFAtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUDktZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIyIiB5PSItMjIxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUC1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUC0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUC11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIiIHk9IjU3NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFBfLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFBfZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBRQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekFrZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFFBZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QWxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QWxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QWstZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QW1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QWwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEcFA2dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERwUDYtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTMwNCwgLTU1MCwgLTUwLCAzMTA3XSRbLTMwNCwgLTMxNzUsIC01MCwgNDgyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSER6QXF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjcxMjk1MDE3RiIgc291cmNlPSJfSERXVXNPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSER6QW11ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHpBcnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSER6QXEtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEekFyT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExMCwgLTQ5MSwgLTEyMTAsIDQ4NDJdJFsxMDMyLCAtNDI1MCwgLTI4NywgMTA4M10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSER6QXNlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekFzdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSER6QXZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1OCIgc291cmNlPSJfSERXVTBPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSER6QW11ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekF2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekF3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHpBd09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSER6QXZlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEekF2dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zMzAsIC00OTEsIDMyMjUsIDQ4OTNdJFstMjg1MywgLTQzMDEsIDcwMiwgMTA4M10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSER6QXctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekF4T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSER6QXhlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3NiIgc291cmNlPSJfSERnRjgtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSER6QW11ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekF5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekF5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHpBeWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSER6QXh1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEekF4LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03NzAsIC00OTEsIDc4NjUsIDQ4OTNdJFstNjg5MSwgLTQzMDEsIDE3NDQsIDEwODNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekF6T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRHpBemVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEekF6dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQTgiIHNvdXJjZT0iX0hEcFBsdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEekFtdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekEwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBMU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6QTB1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEekF6LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRHpBME9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTE0MywgLTQ5MSwgMTE3MDksIDQ4OTNdJFstMTA3MzUsIC00NTA0LCAyMTE2LCA4ODBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekExZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRHpBMXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEekExLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRjgiIHNvdXJjZT0iX0hEcFAyZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEekFtdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBMnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekEzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBM2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6QTItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEekEyT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRHpBMmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzcwLCAtMzU1LCAxNjM5OSwgNTAyOV0kWy01MDQ2LCAtMjMwMiwgMTIxMjQsIDMwODFdJFstMTUwNTMsIC00ODUxLCAyMTE2LCA1MzNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekEzdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRHpBMy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEekJBT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJBRTAyOTgiIHNvdXJjZT0iX0hEekE4T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEekFtdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCQnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6QkJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEekJBZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRHpCQXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTM5LCAtNDU3LCAyMDg1MywgNDk3OF0kWy04Mjg4LCAtMzkzNywgMTM1MDQsIDE0OThdJFstMTk2NzYsIC01MjA3LCAyMTE2LCAyMjhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekJCLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRHpCQ09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEekJDZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MDAzM0YiIHNvdXJjZT0iX0hEekE4T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEekFtdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCRC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6QkRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQjciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJFZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zMDU4IiB5PSIyNjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQjciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCRk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDM2NTIwM0FEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJGLWZYRWR1cUhvT0piVVJaUnciIHg9IjMxNzciIHk9IjkzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNBRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6Qkd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUyNiIgeT0iMjQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNCNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qkh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QkgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QkhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNBRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qkl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QkktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QkllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDM2NTIwM0I3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpCSi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCSmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QktPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNBRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qkt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpCSy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCS2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSER6QkN1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRHpCQy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszMywgLTQ0OCwgMjE4MjcsIDQ5ODZdJFszMywgLTU3NTcsIDIxODI3LCAtMzIxXSRbLTE5Njc2LCAtNTc1NywgMjExNiwgLTMyMV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEekJMT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERTAyM0QiIHNvdXJjZT0iX0hEekE4T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEekE0T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHpCTU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTAwIiB5PSItMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJOT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE3MiIgeT0iMzgwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qk51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCTi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzIiB5PSItMTYwOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRGMDM3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qk8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCT3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTAiIHk9IjQwNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJQdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJQZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02OSIgeT0iLTE4NDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCREYwM0NGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCUWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpCUXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCUU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QlEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCREYwMzdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpCUnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCUk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QlItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekJTdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJTT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4a09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCREYwMzdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4a3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHhrLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHhrZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRHpCTGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEekJMdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzUwLCA0NDAsIC0yNTQsIC0zMTY2XSRbNTAsIDMwMTQsIC0yNTQsIC01OTJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRDh4cE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU0IiBzb3VyY2U9Il9IRDh4bE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRHpBbXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4cWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEOHhxT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRDh4cGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEQ4eHB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE3NiwgLTQ5MSwgLTEyMjg1LCA0ODkzXSRbMTEzMzYsIC00NTQ2LCAtMjEyNSwgODM4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRDh4cS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEQ4eHJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRDh4emVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU1IiBzb3VyY2U9Il9IRDh4dmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRDh4bE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4MHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEOHgwZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4MU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4MXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4MWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItODQiIHk9Ii0zNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4MS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHgyT2ZYRWR1cUhvT0piVVJaUnciIHg9IjU1OSIgeT0iMzE5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4M09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHgyLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNjkiIHk9IjI4OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHgzdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDMyIiB5PSItMzgwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eDQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eDRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHg1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eDUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eDVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHg2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4NnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4Ni1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4NmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4Ny1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4N2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEQ4eHp1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRDh4ei1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTMxLCAtMTE4LCA1OTc3LCAtMTE4XSRbLTUyODMsIC0xMTgsIDE2MjUsIC0xMThdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRDh4OE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVCIiBzb3VyY2U9Il9IRDh4dmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRDh4cmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4OWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEOHg5T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4OS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4LWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4LU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI5OSIgeT0iLTE4MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4X09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eC0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTYiIHk9Ijg5OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eF8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4X3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjY5IiB5PSItMTg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eUFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM1OSIgeT0iNjcwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eUJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eUJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eUN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eUNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlDLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5RGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh5RHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh5RE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh5RXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh5RU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEQ4eDhlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRDh4OHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNjYyLCAzMTgsIDIzOCwgLTE5MzFdJFstNjYyLCAxOTMyLCAyMzgsIC0zMTddIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRDh5RS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTNCIiBzb3VyY2U9Il9IRDh4dmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRHpBbXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5R09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEOHlGLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRDh5Rk9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEQ4eUZlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjAxLCAtNTA4LCAtNTk1MiwgNDg3Nl0kWzUyMTUsIC00MzAxLCAtMTMzNywgMTA4M10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEQ4eUd1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEOHlHLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEQ4eUhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI1MDI2NiIgc291cmNlPSJfSEQ4eHZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEQ4eHZlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlJdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRDh5SU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlKT2ZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlKdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlKLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5S2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eUt1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM0NCIgeT0iLTIwNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlMZWZYRWR1cUhvT0piVVJaUnciIHg9IjU5NCIgeT0iLTk3MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHlNdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlNT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5TS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHlOdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlOT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5Ti1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eU9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eU91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eU9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlQZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eVB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eVBPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEOHlIZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEQ4eUh1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNDE0LCA0OTksIDQxNCwgNDk5XSRbNDE0LCAxNDMwLCA0MTQsIDE0MzBdJFsyMTUwLCAxNDMwLCAyMTUwLCAxNDMwXSRbMjE1MCwgLTQyLCAyMTUwLCAtNDJdJFs5MzEsIC00MiwgOTMxLCAtNDJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9EM2x0b09va0VkdVZBN3Z0NXFiSUpRIiBlbGVtZW50PSJfRDNiOG9Pb2tFZHVWQTd2dDVxYklKUSIgc291cmNlPSJfSER6QW11ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfOXViLUVPb2pFZHVWQTd2dDVxYklKUSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0QzbHRvLW9rRWR1VkE3dnQ1cWJJSlEiIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRDNsdHBlb2tFZHVWQTd2dDVxYklKUSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0QzbHRwdW9rRWR1VkE3dnQ1cWJJSlEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0QzbHRwT29rRWR1VkE3dnQ1cWJJSlEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9EM2x0b2Vva0VkdVZBN3Z0NXFiSUpRIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRDNsdG91b2tFZHVWQTd2dDVxYklKUSIgcG9pbnRzPSJbLTUsIC00MSwgLTQsIDU5XSRbLTYzLCAtMTA0LCAtNjIsIC00XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxZDZrLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjUiPgotICAgICAgICAgICAgPGJvZHk+MDQ8L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfZGRqOHNPeGRFZHVIamUzcFBhaE40QSIgaW1wb3J0ZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTkwIi8+Ci0gICAgICAgICAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfZWFXOElPeGRFZHVIamUzcFBhaE40QSIgaW1wb3J0ZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk0Ii8+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjciIG5hbWU9IkRpc2NpcGxpbmUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcW5FaC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjI3Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBEaXNjaXBsaW5lIGlzIGEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LgotQSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTNCIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVDIiBuYW1lPSJ0YXNrcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFQiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyZ2NhdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyZ2NhZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDQ1QTU5MjcwMzZEIiBuYW1lPSJzdWJkaXNjaXBsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjciIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDQ1QTU5MjUwMjY2Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JnY2NlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JnY2NPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzMCIgbmFtZT0iUm9sZVNldCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxbkVpLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzAiPgotICAgICAgICAgICAgICA8Ym9keT5BIFJvbGUgU2V0IG9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICZxdW90O0FuYWx5c3RzJnF1b3Q7IFJvbGUgU2V0IGNvdWxkIGdyb3VwIHRoZSAmcXVvdDtCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QmcXVvdDssICZxdW90O1N5c3RlbSBBbmFseXN0JnF1b3Q7LCBhcyB3ZWxsIGFzICZxdW90O1JlcXVpcmVtZW50cyBTcGVjaWZpZXImcXVvdDsgcm9sZXMuICBBbGwgb2YgdGhlc2Ugd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQgaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBhcmUgcmVxdWlyZWQgYXMgZGlzdGluY3Qgcm9sZXMgZm9yIGEgbWV0aG9kIChlLmcuIHRoZSBtZXRob2QgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgaXMgYmFzZWQgb24pLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTU4IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVDIiBuYW1lPSJyb2xlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1OSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxNm1pdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxNm1pZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzEiIG5hbWU9IkRvbWFpbiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxbkVqLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzEiPgotICAgICAgICAgICAgICA8Ym9keT5Eb21haW4gaXMgYSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuCi1Eb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc2IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTdBIiBuYW1lPSJ3b3JrUHJvZHVjdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzciPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcTZtay1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcTZta3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NyIgbmFtZT0ic3ViZG9tYWlucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjMxIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyRHdjT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxNm1tZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyM0EiIG5hbWU9IldvcmtQcm9kdWN0VHlwZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxbkVrLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyM0EiPgotICAgICAgICAgICAgICA8Ym9keT5Xb3JrIFByb2R1Y3QgVHlwZSBpcyBhIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgJnF1b3Q7Q2xhc3MgRGlhZ3JhbSZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICZxdW90O1NwZWNpZmljYXRpb24mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQTgiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUMiIG5hbWU9IndvcmtQcm9kdWN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBOSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyRHdlZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyRHdlT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiIG5hbWU9IkNvbnRlbnRDYXRlZ29yeSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxdzFnT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiPgotICAgICAgICAgICAgICA8Ym9keT5Db250ZW50IENhdGVnb3J5IGlzIGFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX0QzYjhvT29rRWR1VkE3dnQ1cWJJSlEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0RSIgbmFtZT0iRGlzY2lwbGluZUdyb3VwaW5nIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3F3MWhPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0RSI+Ci0gICAgICAgICAgICAgIDxib2R5PkRpc2NpcGxpbmUgR3JvdXBpbmdzIGFyZSB1c2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICZxdW90O1NvZnR3YXJlIERpc2NpcGxpbmVzJnF1b3Q7IHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQmcXVvdDsgb3IgJnF1b3Q7VGVzdGluZyZxdW90OzsgJnF1b3Q7SVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCZxdW90OyB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICZxdW90O0lUIE9wZXJhdGlvbmFsIFNlcnZpY2VzJnF1b3Q7LCAmcXVvdDtJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzJnF1b3Q7LCBvciAmcXVvdDtJVCBFbmFibGluZyBTZXJ2aWNlcyZxdW90Oy4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFNCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFOCIgbmFtZT0iZGlzY2lwbGluZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hck5oZHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hck5oZGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjU4IiBuYW1lPSJUb29sIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3F3MWlPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI1OCI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgVG9vbCBpcyBhIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGOCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQyIgbmFtZT0idG9vbE1lbnRvcnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDQiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRjkiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcldyWU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hck5oZnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjU5IiBuYW1lPSJSb2xlU2V0R3JvdXBpbmciPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcXcxak9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjU5Ij4KLSAgICAgICAgICAgICAgPGJvZHk+Um9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjcxMjk1MDE3RiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxOSIgbmFtZT0icm9sZVNldHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzMCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcldyYWVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcldyYU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFCREVCQTIwMDlDIiBuYW1lPSJDdXN0b21DYXRlZ29yeSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxdzFrT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJBMjAwOUMiPgotICAgICAgICAgICAgICA8Ym9keT5BIEN1c3RvbSBDYXRlZ29yeSBpcyBhIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgJnF1b3Q7VGVzdGluZyZxdW90OyBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFCREVCQUUwMjk4IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFCREVCREYwMzdGIiBuYW1lPSJjYXRlZ29yaXplZEVsZW1lbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFCREVCREUwMjNEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JXcmItZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JXcmJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQUQiIG5hbWU9InN1YkNhdGVnb3JpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjBEMzY1MDAzM0YiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcmdjWWVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcmdjWU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTU5IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUEgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxNm1nLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNTkiPgotICAgICAgICAgICAgICA8Ym9keT5BIFJvbGUgU2V0IGNhdGVnb3JpemVzIG1hbnkgUm9sZXMgYW5kIGEgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gbWF5IFJvbGUgU2V0cy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUEiIG5hbWU9InJvbGVTZXRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzAiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTU5Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3E2bWgtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3E2bWh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3NyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc4IF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxN0EiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcTZtak9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc3Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBEb21haW4gY2F0ZWdvcml6ZXMgbWFueSBXb3JrIFByb2R1Y3RzLiBBIFdvcmsgUHJvZHVjdCBiZWxvbmdzIGF0IG1vc3QgdG8gb25lIERvbWFpbi48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzgiIG5hbWU9ImRvbWFpbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjMxIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3NyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxNm1rT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxNm1qLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NSBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk3Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3E2bWxlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NCI+Ci0gICAgICAgICAgICAgIDxib2R5PkRvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIFN1YmRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIG9ubHkgdG8gYmUgY2F0ZWdvcml6ZWQgYXQgdGhlIGxlYWYtbGV2ZWwuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk1IiBuYW1lPSJfZG9tYWluIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzEiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTQiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBOSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFBIF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HckR3Y3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUE5Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIHplcm8gb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFBIiBuYW1lPSJ3b3JrUHJvZHVjdFR5cGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyM0EiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUE5Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JEd2R1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JEd2RlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFNSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU2IF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTgiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HckR3ZS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU1Ij4KLSAgICAgICAgICAgICAgPGJvZHk+RGlzY2lwbGluZSBHcm91cGluZ3MgZ3JvdXAgbWFueSBEaXNjaXBsaW5lcy4gIEEgRGlzY2lwbGluZSBjYW4gYmUgaW4gbWFueSBEaXNjaXBsaW5lIEdyb3Vwcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTYiIG5hbWU9ImRpc2NpcGxpbmVHcm91cHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0RSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hck5oYy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hck5oY3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUY5IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkEgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyTmhlT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRjkiPgotICAgICAgICAgICAgICA8Ym9keT5BIFRvb2wgTWVudG9yIGRlc2NyaWJlcyB3b3JrIHdpdGggZXhhY3RseSBvbmUgVG9vbC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkEiIG5hbWU9InRvb2wiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI1OCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRjkiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hck5oZk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hck5oZS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxNiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE3IF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTkiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcldyWXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE2Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBSb2xlIFNldCBHcm91cGluZyBjb250YWlucyBtYW55IFJvbGUgU2V0cy4gUm9sZSBTZXRzIGNhbiBiZSBpbiBtYW55IFJvbGUgU2V0IEdyb3VwaW5ncy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTciIG5hbWU9InJvbGVTZXRHcm91cHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI1OSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcldyWnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcldyWmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFCREVCREUwMjNEIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzN0YgXzNBREM3Qjc0MDIyRDQxQkRFQkRGMDNDRiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyV3JhLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERTAyM0QiPgotICAgICAgICAgICAgICA8Ym9keT5BIEN1c3RvbUNhdGVnb3J5IGdyb3VwcyB0b2dldGhlciBhbnkgbnVtYmVyIG9mIENvbnRlbnRFbGVtZW50cyBpbmNsdWRpbmcgb3RoZXIgQ29udGVudENhdGVnb3J5LiA8L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzQ0YiIG5hbWU9ImN1c3RvbUNhdGVnb3JpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxQkRFQkEyMDA5QyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUJERUJERTAyM0QiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcldyY3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcldyY2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIwRDM2NTAwMzNGIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQUQgXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNCNyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyV3JkT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MDAzM0YiPgotICAgICAgICAgICAgICA8Ym9keT5BIEN1c3RvbUNhdGVnb3J5IGNhbiBoYXZlIGFueSBudW1iZXIgb2YgQ29udGVudENhdGVnb3JpZXMgZGVmaW5lZCBhcyBuZXN0ZWQgc3ViQ2F0ZWdvcmllcy4gIFRoZXJlZm9yZSwgb25lIGNvdWxkIG5lc3QgQ3VzdG9tQ2F0ZWdvcmllcyBpbnRvIG4tbGV2ZWwgaGllcmFyY2hpZXMuIDwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNCNyIgbmFtZT0iX2N1c3RvbUNhdGVnb3J5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MUJERUJBMjAwOUMiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjBEMzY1MDAzM0YiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcmdjWk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcmdjWS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFQiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVDIF8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcmdjWnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVCIj4KLSAgICAgICAgICAgICAgPGJvZHk+RXZlcnkgVGFzayBzaG91bGQgYmUgcmVsYXRlZCB0byBleGFjdGx5IG9uZSBEaXNjaXBsaW5lLiAgRm9yIGxlZ2FjeSByZWFzb25zIHRoaXMgaXMgbm90IGVuZm9yY2VkIChlLmcuIEdTIE1ldGhvZCBkb2VzIG5vdCBkZWZpbmUgRGlzY2lwbGluZXMsIHlldCkuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVEIiBuYW1lPSJkaXNjaXBsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjciIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JnY2JlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JnY2JPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI1MDI2NiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDQ1QTU5MjcwMzZEIF8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkYiPgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RiIgbmFtZT0iX2Rpc2NpcGxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI1MDI2NiIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2MiIgbmFtZT0iQmFzaWNFbGVtZW50cyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9Hc1owU2VmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MEYzNkQ2NjAyRkIiPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkQ2NjAyRkIiIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3Zy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVGN2dlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlVNTDIgSW5mcmFzdHJ1Y3R1cmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRUY3Z3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NDE5IiB5PSI1MTYiIHdpZHRoPSI4ODM5IiBoZWlnaHQ9IjcwOTUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdoZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTY1ODAxNTciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3aU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRUY3aWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjU3MyIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3aS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3amVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFRjdqdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3ai1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFRjdrT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3a2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFRjdrdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3ay1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3bE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRUY3aHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFRjdoLWZYRWR1cUhvT0piVVJaUnciIHg9IjEwNDk4IiB5PSI2MzMzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3bGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREU4MzMwMUE1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN21PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVGN21lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQzNjgiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN20tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3bk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN25lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3bnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN24tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3b09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN29lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3b3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN28tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVGN3BPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVGN2x1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRUY3bC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI1Mzg0IiB5PSIzNTk4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3cGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREVDQjUwMDk4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN3FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVGN3FlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI1NzMiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN3EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3ck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN3JlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3cnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN3ItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3c09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN3NlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3c3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN3MtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVGN3RPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVGN3B1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRUY3cC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDQ5OCIgeT0iNDQxMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2plZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFMDYyMDJENSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFUHNrZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODEwIiBoZWlnaHQ9IjE1NDAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBza3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2xPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzbHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2wtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzbU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc21lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzbXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc20tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQc25PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVQc2p1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVBzai1mWEVkdXFIb09KYlVSWlJ3IiB4PSI2MjE0IiB5PSIxMTA5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzci1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVQc3MtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMzNTIiIGhlaWdodD0iMTA4MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHN1T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzdWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHN1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzdS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHN2T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzdmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzdnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRVBzc09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHNzZWZYRWR1cUhvT0piVVJaUnciIHg9IjkyOTYiIHk9IjEyMTU4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzdi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVQc3ctZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHN5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzeWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHN5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzeS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHN6T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzemVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzenVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRVBzd09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHN3ZWZYRWR1cUhvT0piVVJaUnciIHg9IjM5NzkiIHk9IjE2NDQyIiB3aWR0aD0iNDUzOCIgaGVpZ2h0PSIxNTU3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzOHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVQczl1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQxODIiIGhlaWdodD0iMTE1MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHM5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQcy1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQcy11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHMtLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHNfZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzX3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHNfLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0QU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVB0QWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRVBzOC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHM5T2ZYRWR1cUhvT0piVVJaUnciIHg9IjEwNTU3IiB5PSI5OTM5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0Qy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTRBOTcwMTIzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdER1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVQdEQtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0RXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHRGT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0RmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHRGdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0Ri1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHRHT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0R2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVB0R3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRVB0RE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHREZWZYRWR1cUhvT0piVVJaUnciIHg9Ijc2MjgiIHk9IjEzOTQ0IiB3aWR0aD0iNDU1NSIgaGVpZ2h0PSIxNDgxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyci1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1N0IwMzMzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVZMnMtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI0ODkiIGhlaWdodD0iMTE1MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkydHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJ1T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkydWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJ1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkydS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJ2T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkydmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkydnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRVkyc09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFWTJzZWZYRWR1cUhvT0piVVJaUnciIHg9IjQxOTEiIHk9IjExMjA5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkydi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1RTYyMDIwMzJBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVZMnctZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQwODAiIGhlaWdodD0iMTE1MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMngtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJ5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyeWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJ5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyeS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJ6T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyemVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyenVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRVkyd09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFWTJ3ZWZYRWR1cUhvT0piVVJaUnciIHg9IjEzMTIiIHk9IjEzNDQ1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyei1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVZMjAtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTIxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTIyT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyMmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTIydWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyMi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTIzT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyM2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyM3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRVkyME9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFWTIwZWZYRWR1cUhvT0piVVJaUnciIHg9IjU1MzciIHk9Ijc5NTgiIHdpZHRoPSI0MDY0IiBoZWlnaHQ9IjE1NTciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hc1owUy1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIGxvd2VzdCBsZXZlbCBwYWNrYWdlIGluIE1ldGhvZCBDb3JlIGRlZmluZXMgdGhlIGNsYXNzIE1ldGhvZCBFbGVtZW50IGZyb20gd2hpY2ggYWxsIG90aGVyIGNsYXNzZXMgZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWNhdGlvbiBhcmUgZGVyaXZlZCBmcm9tLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYS1zdHJ1Y3R1cmUgTGlicmFyeSBlbGVtZW50IFBhY2thZ2VhYmxlIEVsZW1lbnRzLiAgVGhpcyBwYWNrYWdlIGFsc28gZGVmaW5lcyBrZXkgYmFzaWMgZWxlbWVudHMgdXNlZCB0byBkZS1maW5lIGFuZCBzdHJ1Y3R1cmUgbWV0aG9kIGNvbnRlbnQgdHlwZXMuICBFdmVyeSBjbGFzcyBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcyBNZXRob2QgRWxlbWVudCBpcyB0aGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBjbGFzc2VzIGFuZCBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBldmVyeSBvdGhlciBlbGVtZW50IHR5cGUgb2YgdGhpcyBtb2RlbC4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLiAgTWV0aG9kIEVsZW1lbnQgaW5oZXJpdHMgdGhlIE5hbWUgYXR0cmlidXRlIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCdzIHN1cGVyIGNsYXNzLiBBIE1vZGVsIEVsZW1lbnQgaXMgcGFydCBvZiBhIG1ldGhvZCBtb2RlbCBhbmQgZXZlcnkgbWV0aG9kIG1vZGVsIHBhcnQgaXMgYSBNZXRob2QgRWxlbWVudC4gIEV2ZXJ5IE1ldGhvZCBFbGVtZW50IGlzIGF0IGxlYXN0IGRlZmluZWQgYnkgYSB1bmlxdWUgaWQgYXMgd2VsbCBhcyBicmllZiBkZXNjcmlwdGlvbi4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVGN3RlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGOEJEMDI4RiIgc291cmNlPSJfSEVGN2hlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVGN3BlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjd1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNnZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRUY3dWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVGN3R1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRUY3dC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTMzLCAwLCAxMzk3XSRbMCwgLTE0MTMsIDAsIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVQc2d1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFUHNnLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVQc2hPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGNzFCMDNBOCIgc291cmNlPSJfSEVGN3BlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVGN2xlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNpdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVBzaU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVQc2hlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFUHNodWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMjk1LCAtMjU0LCAyOTIxLCA1NThdJFstMjAzMiwgLTM5NywgMjE4NCwgNDE0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVBzaS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVQc2pPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVBzbmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY4RDQwMjExIiBzb3VyY2U9Il9IRUY3bGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVBzamVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc29PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc28tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHNvZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVBzbnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFUHNuLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzUwLCAtNTI0LCAwLCAxNzEwXSRbNTAsIC0xNDY0LCAwLCA3NzBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFUHNwT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVBzcGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFUHNwdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjkxMjAzQzAiIHNvdXJjZT0iX0hFRjdwZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFUHNqZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzck9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVQc3F1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFUHNwLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVBzcU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzExLCAtNTI0LCAzNDU0LCAyNTIzXSRbLTMxMTUsIC0yMjc3LCAxMDQ5LCA3NzBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFUHNyZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVBzcnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFUHN6LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzQjAzMTkiIHNvdXJjZT0iX0hFUHN2LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFUHN2LWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzMWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVQczAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFUHMxLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMiIgeT0iNjI2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVQczJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzciIHk9IjI4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVBzM2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDc5IiB5PSI1NjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzNGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVBzNE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTE1MCIgeT0iMzA2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQczVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVQczQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHM1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQczZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVQczUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHM2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzN2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVBzNi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzOGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVBzNy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVQczBPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVBzMGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODEyLCA3NzgsIC04MTIsIDc3OF0kWy04MTIsIDE3MTgsIC04MTIsIDE3MThdJFstMzYxNSwgMTcxOCwgLTM2MTUsIDE3MThdJFstMzYxNSwgODQsIC0zNjE1LCA4NF0kWy0yMjY5LCA4NCwgLTIyNjksIDg0XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVQdEF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzI3MDEwNiIgc291cmNlPSJfSEVQczh1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVGN2hlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRDT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVB0QnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVQdEEtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVB0Qk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTI0MywgLTUwMywgMCwgMzI4MF0kWy0xMjQzLCAtMzQ2NiwgMCwgMzE3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVB0Q2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVQdEN1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVB0Ry1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUMwMUEwIiBzb3VyY2U9Il9IRVB0Qy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVBzdi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0SU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHRILWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0SXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0Sk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVB0SS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNDIiIHk9IjM4OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFUHRKdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMTQiIHk9Ii0zNTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0S09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVQdEtlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ2IiB5PSIxNDMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkyY2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTIxIiB5PSItMjA0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMmR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMmRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMmV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMmVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyZnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkyZk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkyZ09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVQdEhPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVB0SGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils0NzYsIDcxNCwgNDEyNywgLTE4MjZdJFs0NzYsIDI2MTksIDQxMjcsIDc5XSRbLTE0MDIsIDI2MTksIDIyNDksIDc5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVZMmctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRCIgc291cmNlPSJfSEVQdEMtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVQczh1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJpZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVkyaC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMml1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMmktZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzNCIgeT0iLTI3OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMmp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzUyIiB5PSIxNzYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkya09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMmtlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM5IiB5PSItMTQ0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmstZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJsT2ZYRWR1cUhvT0piVVJaUnciIHg9IjI3NCIgeT0iLTM0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJtZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJsLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkybXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJuZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJtLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkybnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMm9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMm9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMm4tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMnBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMm8tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFWTJoT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVZMmhlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjI3NywgNTksIC00NjUsIDQyMjRdJFs0MzE4LCA1OSwgMTU3NCwgNDIyNF0kWzQzMTgsIC0zNTg5LCAxNTc0LCA1NzVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVkycHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNEEwMzA2IiBzb3VyY2U9Il9IRVBzci1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVBzOHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkycS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFWTJxdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVkycC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFWTJxT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzQ1NywgLTU1MCwgLTEyMTksIDE2MzRdJFs0NTcsIC0xNjA4LCAtMTIxOSwgNTc1XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVkycmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVZMnJ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVkyMy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFQzMzNEYwMTk4IiBzb3VyY2U9Il9IRVkyei1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRUY3bGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyNU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFWTI0LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVkyNE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFWTI0ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC03ODcsIDAsIDM4MzVdJFswLCAtNDEwNiwgMCwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVkyNXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVZMjUtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVkyNk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1RTcwMDUyIiBzb3VyY2U9Il9IRVkyei1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVkyci1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFWTI3T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyNy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMjhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDBBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMjgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTI5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkyOXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2IiB5PSItMTY4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMi1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMi11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMi1lZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI3IiB5PSIxMDkzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMi0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMl9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMl91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMl9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZM0FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZM0F1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZM0FPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTNBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDBBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkzQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkzQnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkzQk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZM0ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZM0NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkzQ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkzQ09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVZMjZlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVkyNnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjAzOCwgMTU5LCAxNTgsIC0yODA0XSRbLTI2OTksIDE1OSwgLTUwMywgLTI4MDRdJFstMjY5OSwgMjQ2MCwgLTUwMywgLTUwM10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFWTNDLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODVBRTAyQ0UiIHNvdXJjZT0iX0hFWTJyLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFWTJ6LWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkzRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTNFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkzRWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVZM0QtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFWTNET2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVZM0RlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTQxLCAtNTc1LCAtMTU5MSwgMjQ3Ml0kWzU0MSwgLTIyNzcsIC0xNTkxLCA3NzBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFWTNFdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVkzRS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFWTNGT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NTYyNDAxN0UiIHNvdXJjZT0iX0hFUHN2LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFWTJ6LWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkzRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTNHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkzR3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVZM0dPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFWTNGZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVZM0Z1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbODk5LCAtNzk0LCAtNDI0LCA3Njk5XSRbODk5LCAtNzcyNiwgLTQyNCwgNzY3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVkzRy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVZM0hPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVkzSGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDMkIwMUNBIiBzb3VyY2U9Il9IRVBzOHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVkyei1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFaW5jZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVkzSHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFWTNILWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMDkxLCA4NCwgMjk4OCwgMTg2Ml0kWy0zNDM3LCA4NCwgMTY0MiwgMTg2Ml0kWy0zNDM3LCAtOTk5LCAxNjQyLCA3NzhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFaW5kT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRWluZGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFaW5kdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjAwNTgzQjAxRTYiIHNvdXJjZT0iX0hFUHRDLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFWTJ6LWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5lLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluZk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVpbmV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFaW5kLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVpbmVPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE3MDEsIC03MzYsIDYzNSwgNTIwN10kWy0xNzAxLCAtNTE3MywgNjM1LCA3NzBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFaW5mZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRWluZnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFaW5mLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwQzAwQTYiIHNvdXJjZT0iX0hFWTJ6LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFWTJ2LWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5oT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluaGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVpbmctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5odWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1RTY1MEQwMDM3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRWluaC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluaWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMzciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5pLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRWluaXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1RTY1MEQwMDA1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFaW5qZWZYRWR1cUhvT0piVVJaUnciIHg9IjY4MiIgeT0iMTc5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBEMDAwNSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVpbmtPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjgyIiB5PSItMjAzMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5rdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMzciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5sT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFaW5sZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFaW5rLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlubHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5tT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFaW5tZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFaW5sLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlubXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBEMDAzNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVpbm5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVpbm0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5udWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5vT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVpbm9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVpbm4tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFaW5nT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVpbmdlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIwMzgsIC00NzYsIDE5MDUsIC01Njg4XSRbLTUxMDcsIC00NzYsIC0xMTY0LCAtNTY4OF0kWy01MTA3LCA0NzA5LCAtMTE2NCwgLTUwM10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFaW5vdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjY3QTAwRDkiIHNvdXJjZT0iX0hFWTJ2LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFRjdsZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlucGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5wLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlucU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVpbnB1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFaW5vLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVpbnBPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIzMjgsIC0xNTksIC02MDMyLCA5ODY5XSRbLTI2NzEsIC0xNTksIC02Mzc1LCA5ODY5XSRbLTI2NzEsIC0xMDEzMywgLTYzNzUsIC0xMDVdJFsxNzQ3LCAtMTAxMzMsIC0xOTU3LCAtMTA1XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRWlucWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVpbnF1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3JxTlllZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2MiI+Ci0gICAgICAgICAgICA8Ym9keT4wMTwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX25veVRNT3hnRWR1SGplM3BQYWhONEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MURERjg2OTAxMkUiLz4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX2M2dGRrT3g1RWR1NS12VmpsZlZzZlEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MTE5QTYyQjAzNkYiLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIgbmFtZT0iTWV0aG9kRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dycU5aLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPgotICAgICAgICAgICAgICA8Ym9keT5FdmVyeSBjbGFzcyBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcyBNZXRob2QgRWxlbWVudCBpcyB0aGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBjbGFzc2VzIGFuZCBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBldmVyeSBvdGhlciBlbGVtZW50IHR5cGUgb2YgdGhpcyBtb2RlbC4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLiAgTWV0aG9kIEVsZW1lbnQgaW5oZXJpdHMgdGhlIE5hbWUgYXR0cmlidXRlIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCdzIHN1cGVyIGNsYXNzLiAgRXZlcnkgZWxlbWVudCBkZWZpbmVkIGFzIGEgVU1BIGluc3RhbmNlIGlzIGRlcml2ZWQgZnJvbSBNb2RlbCBFbGVtZW50LiAgRXZlcnkgTWV0aG9kIEVsZW1lbnQgaW4tc3RhbmNlIGlzIGF0IGxlYXN0IGRlZmluZWQgYnkgYSB1bmlxdWUgaWQsIGEgbmFtZSwgYXMgd2VsbCBhcyBicmllZiBkZXNjcmlwdGlvbi48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVDMzM0RjAxOTgiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTgzMzAxQTUiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNTAiIG5hbWU9Imd1aWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3JxTmEtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA1MCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il82OUFXRWV5RkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il82OUFXRU95RkVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il84elVYY095RkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA0NyIgbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcnFOYnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDQ3Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX1I4SVpzZXlGRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1I4SVpzT3lGRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX1RHQ29FT3lGRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDA4IiBuYW1lPSJvd25lZFJ1bGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjdBODU3QjAzMzMiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTg1RTcwMDUyIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NRRFF1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NRRFFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMDUiIG5hbWU9Im1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDU1RTYyMDIwMzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBDMDBBNiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzWjBSLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzWjBSdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiIG5hbWU9IkNvbnRlbnRFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3J6WFV1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyI+Ci0gICAgICAgICAgICAgIDxib2R5PkNvbnRlbnQgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4KLUNvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI5NEVDNEEwMzA2IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyelhWdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiPgotICAgICAgICAgICAgICA8Ym9keT5Db250ZW50IERlc2NyaXB0aW9uIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDIwMDU4M0IwMUU2IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjMyMTkwMDI5IiBuYW1lPSJtYWluRGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3J6WFd1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREYzMjE5MDAyOSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGUgc3RvcmUgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il8zVTExTWV5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8zVTExTU95SUVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8zTnNFVU95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCIgbmFtZT0ic2VjdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjFFNERBQzAxQTAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc1FEU2VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc1FEU09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIiBuYW1lPSJTZWN0aW9uIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3J6WFhlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgU2VjdGlvbiBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5NTYyNDAxN0UiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjI1RDAyMzQiIG5hbWU9InNlY3Rpb25OYW1lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyOUlVLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjI1RDAyMzQiPgotICAgICAgICAgICAgICAgIDxib2R5PkV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9vMVZVSWV5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9vMVZVSU95SEVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9vdGI4WU95SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU0REYzMDAzQSIgbmFtZT0ic2VjdGlvbkRlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyOUlWdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERGMzAwM0EiPgotICAgICAgICAgICAgICAgIDxib2R5PlRoaXMgYXR0cmlidXRlcyBzdG9yZSB0aGUgZGVzY3JpcHRpb24gdGV4dCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uJ3MgU2VjdGlvbi48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il81UFZMOGV5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il81UFZMOE95SUVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il81SHV2SU95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiIgbmFtZT0ic3ViU2VjdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjFFNEUzQjAzMTkiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc1FEVXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc1FEVWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg1N0IwMzMzIiBuYW1lPSJDb25zdHJhaW50Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3I5SVdlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NTdCMDMzMyI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgQ29uc3RyYWludCBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4NUFFMDJDRSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4QTFGMDJGMyIgbmFtZT0iYm9keSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcjlJWGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QThBMUYwMkYzIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZSBzdG9yZXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfOHBpVDRleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfOHBpVDRPeUdFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfOGdjcFVPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyIgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NHNVV1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+Ci0gICAgICAgICAgICAgIDxib2R5PkRlc2NyaWJhYmxlIEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgTWV0aG9kIEVsZW1lbnRzIGZvciB3aGljaCBleHRlcm5hbCBwcmVzZW50YXRpb24gbmFtZXMgYXMgd2VsbCBhcyBjb250ZW50IGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCwgc3VjaCBhcyBSb2xlcyBvciBXb3JrIFByb2R1Y3RzLiAgUHJlc2VudGF0aW9uIE5hbWUgYW5kIENvbnRlbnQgRGVzY3JpcHRpb25zIGFyZSB0eXBpY2FsbHkgbG9jYWxpemVkIHVzaW5nIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIGl0cyBTdHJpbmcgdHlwZSBhdHRyaWJ1dGVzLgotVGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlIChzZWUgU2VjdGlvbiA0LjEuNCkuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI5NEVDMjcwMTA2IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREU2NTgwMTU3Ii8+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI5NEVDMkIwMUNBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGOUFCOTgwMkI5IiBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzRzVWLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY5QUI5ODAyQjkiPgotICAgICAgICAgICAgICAgIDxib2R5PkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAmcXVvdDtydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50JnF1b3Q7IHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICZxdW90O2oyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQmcXVvdDsgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAmcXVvdDtBcmNoaXRlY3R1cmUgRG9jdW1lbnQmcXVvdDsuCi08L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il80WHdMRWV5RkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il80WHdMRU95RkVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il81c1pDd095RkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiIgbmFtZT0icHJlc2VudGF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NaMFEtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NaMFF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1NUU2MjAyMDMyQSIgbmFtZT0iTWV0aG9kRWxlbWVudFByb3BlcnR5Ij4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTVFNjY3QTAwRDkiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTgzMzAxQTUiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTVFNjVDODAyMTgiIG5hbWU9InZhbHVlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9keXI3Z2V5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9keXI3Z095R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9kbnpoTU95R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg1RTcwMDUyIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFOTAwMDggXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwQSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzRzVYZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFNzAwNTIiPgotICAgICAgICAgICAgICA8Ym9keT5BIE1ldGhvZCBFbGVtZW50IGNhbiBvd24gbWFueSBDb25zdHJhaW50cyBkZWZpbmluZyBydWxlcyBmb3IgdGhpcyBlbGVtZW50LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwQSIgbmFtZT0iX21ldGhvZEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E4NUU3MDA1MiIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRTREQUMwMUEwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQgXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzUURSZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBQzAxQTAiPgotICAgICAgICAgICAgICA8Ym9keT5BIENvbnRlbnQgRGVzY3JpcHRpb24gY2FuIG9wdGlvbmFsbHkgYmUgc3RydWN0dXJlIGludG8gU2VjdGlvbnMuICBUaGlzIGFzc29jaWF0aW9uIGlzIHVzZSB0byBkZWNvbXBvc2VkIFNlY3Rpb24gaW50byBhIGhpZXJhcmNoeSBvZiBTZWN0aW9ucy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciIG5hbWU9Il9jb250ZW50RGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREU0QTk3MDEyMyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMUU0REFDMDFBMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzUURUT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzUURTLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzQjAzMTkiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiBfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NRRFR1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNCMDMxOSI+Ci0gICAgICAgICAgICAgIDxib2R5PlNlY3Rpb25zIGNhbiBiZSBmdXJ0aGVyIGRlY29tcG9zZWQgaW50byBuIGxldmVscyBvZiBzdWItc2VjdGlvbnMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0IiBuYW1lPSJfc2VjdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxRTRFM0IwMzE5Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NRRFZlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NRRFZPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSBfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NRRFYtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRCI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgRGVzY3JpYmFibGUgRWxlbWVudCBjYW4gY29udGFpbiBhIENvbnRlbnQgRGVzY3JpcHRpb24gZWxlbWVudCB0aGF0IHN0b3JlcyB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBmb3IgdGhpcyBDb250ZW50IEVsZW1lbnQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIGludGVuZGVkIHRvIGJlIHJlZmluZWQgd2l0aCBzdWItY2xhc3NlcyBhZGRpbmcgbW9yZSBkZXNjcmlwdGlvbiBhdHRyaWJ1dGVzLiAgQW55IG9mIHRoZXNlIHN1Yi10eXBlcyBjYW4gYmUgcmVsYXRlZCB0byBhIENvbnRlbnQgRWxlbWVudC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiIG5hbWU9Il9kZXNjcmliYWJsZUVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzWjBRT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzUURXdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1RTY1MEMwMEE2IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMDUgXzNBREM3Qjc0MDIyRDQ1NUU2NTBEMDAzNyI+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1RTY1MEQwMDM3IiBuYW1lPSJfbWV0aG9kRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDU1RTY1MEMwMEE2Ii8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk0IiBuYW1lPSJDb3JlQ29udGVudEVsZW1lbnRzIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d0VE1NLWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQwRjQ4RERDMDJDNyI+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjQ4RERDMDJDNyIgdHlwZT0iQ2xhc3MiIG5hbWU9IlRheG9ub215Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5xLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlucnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRWluci1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbnNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5zdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlucy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFaW50T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWludGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFaW50dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZY09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1ljZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZY3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZYy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRWluck9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFaW5yZWZYRWR1cUhvT0piVVJaUnciIHg9IjE3MjM5IiB5PSI4NTYxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZZE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVzWWVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4MjciIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1llZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZZmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZZi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZZ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWWctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVzWWRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNZZHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2MDg2IiB5PSI3ODUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1loT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxN0YiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRXNZaU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZak9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lqZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZanVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lqLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZa09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lrZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZa3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZay1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRXNZaGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1lodWZYRWR1cUhvT0piVVJaUnciIHg9IjU1ODgiIHk9IjExMTUyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZbE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMThGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVzWW1PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE4MjgiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWW1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZbXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1ltLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZbk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1luZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZbnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1luLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lvZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZby1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRXNZbGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1lsdWZYRWR1cUhvT0piVVJaUnciIHg9IjExNDQzIiB5PSIxMTE1MiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFc1lxT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWXJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWXItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWXNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lzLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFc1lwZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVzWXB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjMwNTAiIHk9Ijg1NTkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxODUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRXNZdU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjAzMiIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWXZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWXYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWXdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1l3LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFc1l0ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVzWXR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTcyMjYiIHk9IjExMTUyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZeE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVzWXlPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI0NTUiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1l6ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1l6LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1kwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZMHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZMC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRXNZeGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1l4dWZYRWR1cUhvT0piVVJaUnciIHg9IjExNDQ4IiB5PSI4NTYxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZMU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVzWTJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1kyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZM2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZMy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZNGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWTQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVzWTFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNZMXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1NTkxIiB5PSI4NTU5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZXy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVzWkEtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4NzgiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNaQ09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNaQ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNaRE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWkR1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVzWkFPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNaQWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTg4MiIgeT0iNTk3NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk0QTY2MDM2OCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFMWliLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWljZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWljLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaWRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlkZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaWR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlkLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaWVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWllZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWlldWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFMWliT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEUxaWJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjQxNSIgeT0iNTk2NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWUtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFMWlmLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzk0IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlnLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaWhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWloZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaWh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWloLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaWlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlpZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWlpdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFMWlmT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEUxaWZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzgzIiB5PSIzMzYzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpbE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEUxaW1PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI2NTgiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaW1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpbXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWltLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpbk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWluZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpbnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWluLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWlvZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpby1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRTFpbGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWlsdWZYRWR1cUhvT0piVVJaUnciIHg9IjU1OTMiIHk9IjMzODAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWl0dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRTFpdXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzYwNiIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWl2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWl2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpd09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWl3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpd3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWl3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpeE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpeGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRTFpdC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWl1T2ZYRWR1cUhvT0piVVJaUnciIHg9IjExNDM3IiB5PSIzMzY5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3RUTU5lZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBDb3JlIENvbnRlbnQgRWxlbWVudHMgcGFja2FnZSBkZWZpbmVzIHRoZSBjb3JlIGVsZW1lbnRzIG9mIGV2ZXJ5IG1ldGhvZCBzdWNoIGFzIHJvbGVzLCB0YXNrcywgYW5kIHdvcmsgcHJvZHVjdHMuICBUaGlzIGRpYWdyYW0gc2hvd3MgYSB0YXhvbm9teSBvZiB0aGUgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGlzIHBhY2thZ2UuICBBbGwgQ29yZSBDb250ZW50IEVsZW1lbnRzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgU3RlcCwgYXJlIGRlcml2ZWQgZnJvbSBDb250ZW50IEVsZW1lbnQuICBTdGVwIGlzIG5vdCBhIENvbnRlbnQgRWxlbWVudCwgYmVjYXVzZSBpdCBpcyBkZWZpbmVkIGFzIGEgc3BlY2lhbCBTZWN0aW9uIHdoaWNoIHdhcyBkZWZpbmVkIGluIHRoZSBsYXN0IFNlY3Rpb24gYXMgYSBwYXJ0IG9mIENvbnRlbnQgRGVzY3JpcHRpb24uICBJbiBvdGhlciB3b3JkcywgU3RlcCBhbHJlYWR5IGlzIGEgZGVzY3JpcHRpb24gZm9yIGNvbnRlbnQgYW5kIHRoZXJlIGRvZXMgbm90IHJlcXVpcmUgYmVpbmcgYSBDb250ZW50IEVsZW1lbnQgd2l0aCBpdHMgb3duIENvbnRlbnQgRGVzY3JpcHRpb24gcGFydC4gIFN0ZXAgYW5kIFRhc2sgYXJlIGRlcml2ZWQgZnJvbSBhIG5ldyBhYnN0cmFjdGlvbiBpbnRyb2R1Y2VkIGluIHRoaXMgcGFja2FnZSBjYWxsIFdvcmsgRGVmaW5pdGlvbiwgd2hpY2ggcmVwcmVzZW50cyBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgdW5pdHMgb2Ygd29yay4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVzWTVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAwRiIgc291cmNlPSJfSEVzWWhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVzWXhPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1k1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1k2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNZNk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVzWTVlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFc1k1dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xLCAtNTAzLCAtNTgyMiwgMjA5MF0kWzU4MjAsIC0yMDkxLCAtMSwgNTAyXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRXNZNi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVzWTdPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRXNZN2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDRBIiBzb3VyY2U9Il9IRXNZbE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRXNZeE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWThPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1k4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRXNZN3VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVzWTctZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEsIC01MDMsIC0xLCAyMDkwXSRbLTEsIC0yMDkxLCAtMSwgNTAyXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRXNZOU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVzWTllZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRXNZOXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJDIiBzb3VyY2U9Il9IRXNZdE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRXNZeE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWS1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWV9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1ktdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRXNZOS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVzWS1PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUwMywgNTgyMCwgMjA5MF0kWy01ODIxLCAtMjA5MSwgLTEsIDUwMl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVzWV9lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFc1lfdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVzWkQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDExRCIgc291cmNlPSJfSEVpbnEtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVzWV8tZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pGZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNaRS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVzWkVPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFc1pFZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MDMsIDU4MDcsIDIwOTBdJFstNTgyMSwgLTIwOTAsIC0xNCwgNTAzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRXNaRnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVzWkYtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRXNaR09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA3IiBzb3VyY2U9Il9IRXNZcE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRXNZXy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaSGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1pIT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRXNaR2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVzWkd1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUwMywgMTE2MjgsIDIwOTBdJFstMTE2NDIsIC0yMDkwLCAtMTQsIDUwM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVzWkgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFc1pJT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVzWkllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMyRiIgc291cmNlPSJfSEVzWTFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVzWV8tZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pKLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNaSmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVzWkl1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFc1pJLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xLCAtNTAzLCAtNTgzNSwgMjA5MF0kWzU4MjAsIC0yMDkwLCAtMTQsIDUwM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaVlPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWlZZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEUxaVl1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNEOSIgc291cmNlPSJfSEVzWXhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVzWV8tZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaVotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlhT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRTFpWnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEUxaVktZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFMWlaT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xLCAtNTAzLCAtMTQsIDIwOTBdJFstMSwgLTIwOTAsIC0xNCwgNTAzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpYWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaWF1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRTFpaS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTgzMEUwMTUwIiBzb3VyY2U9Il9IRTFpYS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRTFpZS1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWtlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWlqLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRTFpak9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEUxaWplZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEsIC01MDMsIDIxNDMsIDIwOTBdJFstMjE0NCwgLTIwOTAsIDAsIDUwM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaWt1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWlrLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEUxaXBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MzE4MDBCOCIgc291cmNlPSJfSEVzWTFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEUxaWxPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRTFpcU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEUxaXBlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFMWlwdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xLCAtNTAzLCAtMSwgNDY4M10kWy0xLCAtNDY4MywgLTEsIDUwM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaXEtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWlyT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEUxaXJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MzIzMDBGRSIgc291cmNlPSJfSEUxaWEtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEUxaWxPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRTFpc2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEUxaXJ1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFMWlyLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xLCAtNTAzLCAtMzE3NiwgMjA5MF0kWzMxNzQsIC0yMDkwLCAtMSwgNTAzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpdE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaXRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRTFpeHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNEEwMzA2IiBzb3VyY2U9Il9IRXNZXy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRTFpdHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWl5dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRTFpeC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEUxaXlPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE0LCAtNTAzLCAyMjQsIDIwOTBdJFstMjUyLCAtMjA5MCwgLTE0LCA1MDNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWl6ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpenVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFMWl6LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJGMzAyNkUiIHNvdXJjZT0iX0hFMWlsT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFc1lkT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWkxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpMWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEUxaTAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFMWkwT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRTFpMGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMSwgLTUwMywgMCwgMjA5MF0kWy0xLCAtMjA5MCwgMCwgNTAzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpMXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaTEtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRTFpMk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTU2MjQwMTdFIiBzb3VyY2U9Il9IRTFpZS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRXNZZE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaTItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaTN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWkzT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRTFpMmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEUxaTJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUwMywgLTUzMTgsIDIwOTBdJFs1MzE4LCAtMjA5MCwgMCwgNTAzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpMy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaTRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRTFpNGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDMkIwMUNBIiBzb3VyY2U9Il9IRTFpdHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRXNZZE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaTVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaTUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWk1ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRTFpNHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFMWk0LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNCwgLTUwMywgNTU4MywgMjA5MF0kWy01NTk3LCAtMjA5MCwgMCwgNTAzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpNk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaTZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNzBBMzAxNTIiIHR5cGU9IkNsYXNzIiBuYW1lPSJTdHJ1Y3R1cmUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVFlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjQ4RERDMDJDNyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UWk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVfVFllZlhFZHVxSG9PSmJVUlpSdyIgdW5kZXJsaW5lPSJ0cnVlIiBkZXNjcmlwdGlvbj0iQ2xhc3MgRGlhZ3JhbTogQ29yZUNvbnRlbnRFbGVtZW50cyAvIFRheG9ub215IiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRV9UWXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDE2IiB5PSIxMzYwNSIgd2lkdGg9IjQzMDgiIGhlaWdodD0iMTEzNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVFplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMkVEMjEzMDMyQiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UYWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVfVFp1ZlhFZHVxSG9PSmJVUlpSdyIgdW5kZXJsaW5lPSJ0cnVlIiBkZXNjcmlwdGlvbj0iQ2xhc3MgRGlhZ3JhbTogQ29yZUNvbnRlbnRFbGVtZW50cyAvIFdvcmtQcm9kdWN0cyIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVfVFotZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA0OSIgeT0iMTIwOTAiIHdpZHRoPSI0MTUzIiBoZWlnaHQ9IjExMjYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVfVGEtZlhFZHVxSG9PSmJVUlpSdyIgZm9udE5hbWU9IkFyaWFsIiBkZXNjcmlwdGlvbj0ie1JvbGUubW9kaWZpZXMgPSBSb2xlLnBlcmZvcm1zLm91dHB1dH0mI3hBO2tlcHQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBSVVAmI3hBOyIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFX1RiT2ZYRWR1cUhvT0piVVJaUnciIHg9IjUwMjkiIHk9IjEwNTE1IiB3aWR0aD0iNjkwOCIgaGVpZ2h0PSIxMTI2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UYi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVfVGMtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UZU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UZXVmWEVkdXFIb09KYlVSWlJ3IiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UZS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1RmT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UZmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UZnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRV9UY09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFX1RjZWZYRWR1cUhvT0piVVJaUnciIHg9IjIyMTgiIHk9Ijk2NSIgd2lkdGg9IjMzOTUiIGhlaWdodD0iMjY1MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFX1RnLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RoLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVGlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RpZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVGl1ZlhFZHVxSG9PSmJVUlpSdyIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9Uak9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVGp1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVfVGdPZlhFZHVxSG9PSmJVUlpSdyIgaXRhbGljPSJ0cnVlIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFX1RnZWZYRWR1cUhvT0piVVJaUnciIHg9IjE3NzU0IiB5PSI4MDc3IiB3aWR0aD0iMzcwOCIgaGVpZ2h0PSIyMDQwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTRBNjYwMzY4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEZKRVpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFYWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFYS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFYmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRWItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEZKRVllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRkpFWXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNDA1MyIgeT0iMTM4MCIgd2lkdGg9IjIxODQiIGhlaWdodD0iMTYxNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGSkVkT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVlT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRWVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVldWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRWUtZlhFZHVxSG9PSmJVUlpSdyIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFZmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRWYtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEZKRWNlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRkpFY3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzg0NyIgeT0iMTA2NiIgd2lkdGg9IjMzMTgiIGhlaWdodD0iMjM0NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d0Y1dFZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJ8TWV0aG9kIGNvbnRlbnQgaXMgZnVuZGFtZW50YWxseSBkZXNjcmliZWQgYnkgZGVmaW5pbmcgVGFza3MgZGVzY3JpYmVkIHdpdGggU3RlcHMgdGhhdCBoYXZlIFdvcmsgUHJvZHVjdHMgYXMgaW5wdXQgYW5kIG91dHB1dCBhbmQgd2hpY2ggYXJlIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIFRoZSBkaWFncmFtIGRlcGljdHMgdGhlc2UgY29yZSBlbGVtZW50cyB3aXRoIHRoZWlyIHJlbGF0aW9uc2hpcHMuICBUaGUgcmVsYXRpb25zaGlwcyBhcmUgbGFiZWxlZCB3aXRoIGEgJnF1b3Q7RGVmYXVsdF8mcXVvdDsgcHJlZml4LCBiZWNhdXNlIHRoZXkgZGVzY3JpYmUgdGhlICdzdGFuZGFyZCcgb3IgJ25vcm1hbCcgd2F5IG9mIHBlcmZvcm1pbmcgdGhlIG1ldGhvZCBkZXNjcmliZWQ7IGkuZS4gZG9pbmcgdGhlIHdvcmsgdW5kZXIgJ25vcm1hbCcgY2lyY3Vtc3RhbmNlcywgd2l0aCAnbm9ybWFsJyBiZWluZyB3aGF0IHRoZSBtZXRob2QgYXV0aG9yIHBlcmNlaXZlcyBhcyB0aGUgbW9zdCBnZW5lcmFsIGNhc2UuICBIb3dldmVyLCBkaWZmZXJlbnQgcHJvY2Vzc2VzIHdvdWxkIGFwcGx5IHRoZXNlIGVsZW1lbnRzIGluIGRpZmZlcmVudCBwYXJ0cyBvZiBhIGxpZmVjeWNsZSBkaWZmZXJlbnRseSBhbmQgdGhlbiBuZWVkIHRvIGRlZmluZSBjaGFuZ2VzIG9uIHRoZXNlIHJlbGF0aW9uc2hpcHMuICBGb3IgZXhhbXBsZSwgaWYgYSBUYXNrIGlzIHBlcmZvcm1lZCBpbiBtb3JlIHRoZW4gb25lIGl0ZXJhdGlvbiBvZiBhbiBpdGVyYXRpdmUgbGlmZWN5Y2xlIG1vZGVsIGRpZmZlcmVudCBSb2xlcyBjb3VsZCBiZSBhZGRlZCB0byAob3IgcmVtb3ZlZCBmcm9tKSBwZXJmb3JtaW5nIHRoZSBUYXNrIGFzIHdlbGwgYXMgZGlmZmVyZW50IGlucHV0cyBtaWdodCBiZSBjb25zaWRlcmVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZS4gIFN1Y2ggY2hhbmdlcyB3b3VsZCBiZSBkZWZpbmVkIG9uIHByb2Nlc3Mgc3BlY2lmaWMgRGVzY3JpcHRvcnMgdGhhdCByZWZlcmVuY2UgYW5kIGhhdmUgYmVlbiBkZWZpbmVkIGJhc2VkIG9uIHRoZXNlIGNvcmUgY29udGVudCBlbGVtZW50cyAoc2VlIFByb2Nlc3MgZm9yIG1vcmUgZGV0YWlscykuJiN4QTsiLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVfVGotZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNSIgc291cmNlPSJfSEVfVGYtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVfVGItZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFX1RrLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNTIiIHk9IjMwNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1RsLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNzYxIiB5PSIyNzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVG0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1RtdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xODM5IiB5PSItMzE0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVG5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1RuZWZYRWR1cUhvT0piVVJaUnciIHg9IjI1MjUiIHk9IjI3OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1RvT2ZYRWR1cUhvT0piVVJaUnciIHg9IjI1NjgiIHk9Ii0xMjQ1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVG91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVHBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVG8tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVHFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVHAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9Uck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UcmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9UcS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9Uc2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9Uci1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVfVGtPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRV9Ua2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTg1NCwgNjUxLCAxMzg0MywgNzQ1OV0kWy0xNjI2NCwgNjUxLCAtNTY3LCA3NDU5XSRbLTE2MjY0LCAtNTQ4NiwgLTU2NywgMTMyMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFX1RzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9IRV9UYXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRV9Uai1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVfVHMtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFX1R0T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy00MjMsIC01NjcsIDU4NCwgNzYyXSRbLTEwMDcsIC0xMzI5LCAwLCAwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRV9UdGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVfVHR1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRV9UdC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTA5IiBzb3VyY2U9Il9IRV9UZi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRV9UYi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9Udk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVfVHUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMzOSIgeT0iMjgwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVHYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI0MzciIHk9IjI4MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9Udy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVHd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY5MyIgeT0iLTMwNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9UeGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMTUwIiB5PSItMzIyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVHlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjIxOCIgeT0iMTc5NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1R6ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1R5LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1QwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1QwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1R6LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVDFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVDFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVDAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1QxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1QyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVDJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVDEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFX1R1T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVfVHVlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE4NTQsIC0yMTEsIDEzODQzLCA2NTk1XSRbLTE0NzkxLCAtMjExLCA5MDUsIDY1OTVdJFstMTQ3OTEsIC01NDg2LCA5MDUsIDEzMjBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRkpFZ09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA4IiBzb3VyY2U9Il9IRkpFY09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRV9UYi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZKRWhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjYiIHk9IjI2MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMEIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVpT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNDM4IiB5PSIyNzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVpLWZYRWR1cUhvT0piVVJaUnciIHg9Ii03ODIiIHk9Ii0yNjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRWp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIyMSIgeT0iMjg4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRWtlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzM1IiB5PSItMzIyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRWx1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRWxPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRW1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRW11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRW1PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzBCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFbnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFbk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRW4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRW9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFb3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFb09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZKRWdlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRkpFZ3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTY1OSwgNjYwLCAxMzkzNiwgNjA5XSRbLTEzOTAyLCA2NjAsIDE2OTMsIDYwOV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGSkVvLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1QzAxQ0MiIHNvdXJjZT0iX0hFX1RiLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGSkVjT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRkpFcC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTQ4IiB5PSItMjcyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDM1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRXEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzMTIiIHk9Ii0yNjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDM1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVydWZYRWR1cUhvT0piVVJaUnciIHg9IjE1NDEiIHk9IjMxMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDJGRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFc2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDU3IiB5PSItMTk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDJGRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRXRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzIyIiB5PSIzMTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMzU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFdWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFdC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMkZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFdmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFdS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAzNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkV3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkV2LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMkZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkV4ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkV3LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRkpFcE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGSkVwZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2OTMsIC03NzAsIC0xMzkwMiwgLTcxOV0kWzEzOTM2LCAtNzcwLCAtMTY1OSwgLTcxOV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGSkV4dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUQiIHNvdXJjZT0iX0hFX1RmLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGSkVjT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRkpFeXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjc1IiB5PSIyMTExIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNBOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRXp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYzNyIgeT0iLTI4MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0E4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRTBlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM4MCIgeT0iMTUyMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFMU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1NjkiIHk9Ii0yODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFMS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTA3OSIgeT0iMTY0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkUzT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkUydWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkU0T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkUzdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFNGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNBOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRTVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRTR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRTZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRTV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGSkV4LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRkpFeU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2MjYsIC0xMDI0LCA3MjgsIDU4MzNdJFsyMjg2LCAtMzY5OSwgMjM4NywgMzE1OF0kWzc3OCwgLTU2ODksIDg4MCwgMTE2OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGSkU2ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkIiIHNvdXJjZT0iX0hFX1RmLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGSkVjT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRkpFN2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTcxIiB5PSItMTQ2MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkU4ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NzMiIHk9IjI3OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRTlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTc2IiB5PSItNzczIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkU5LWZYRWR1cUhvT0piVVJaUnciIHg9IjY3MiIgeT0iMzA5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRS1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRS0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRS11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc4NSIgeT0iLTEwNjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFX09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFXy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFX2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRkFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpGQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpGQS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpGQWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRkJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkZCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkZCLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkZCZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpGQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpGQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkZDLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkZDZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRkpFNnVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZKRTYtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg3MiwgLTEwMjQsIC03NzAsIDU4MzNdJFstMzExNSwgLTM2OTksIC0zMDE0LCAzMTU4XSRbLTEyMzYsIC01Njg5LCAtMTEzNCwgMTE2OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGU09VT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0OTAxMzEiIHNvdXJjZT0iX0hGSkVjT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFX1RmLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09WZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRlNPVk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDciIHk9Ii0xMjYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjcyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPV09mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjk2IiB5PSItMjc4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNzIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09YT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPVy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyODAiIHk9Ii0yNTMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09YLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT1h1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDU2IiB5PSItMzQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT1llZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU2MCIgeT0iLTE2OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09ZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNzIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09aZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09adWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09aT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09hZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09hdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09hT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI3MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZTT2J1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT2JPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09iLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09jZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZTT2N1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT2NPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGU09VZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZTT1V1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg0LCAxMTY4LCAtMTg2LCAtNTY4OV0kWy04NCwgNTgzMywgLTE4NiwgLTEwMjRdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRlNPYy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDMwMDNGIiBzb3VyY2U9Il9IRkpFY09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRkpFWU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2VlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGU09kLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPZXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT2UtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2ZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT2Z1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09nT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPZ2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjYiIHk9IjMyMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09nLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09oZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09oT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNzEiIHk9Ii0zMDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPaWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPaC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPamVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPaS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09rT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09rZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09qLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09sZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09rLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRlNPZE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGU09kZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2NTksIC01MCwgLTM5NzksIDBdJFs0NTQ2LCAtNTAsIC0xMDkyLCAwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwQUVFQzYwMENBIiB0eXBlPSJDbGFzcyIgbmFtZT0iU3RydWN0dXJlIChzaW1wbGlmaWVkKSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPbHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT21lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEZTT211ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09tLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT25PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT251ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPbi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT29PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPb2VmWEVkdXFIb09KYlVSWlJ3IiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09vLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPcGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRlNPbC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGU09tT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE1MTUiIHk9IjkxNCIgd2lkdGg9IjMxNzUiIGhlaWdodD0iMjY0MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1VPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9VLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGYl9WT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9WdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9XT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX1dlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9XdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX1ctZlhFZHVxSG9PSmJVUlpSdyIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1hPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfWGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1h1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX1gtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEZiX1VlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRmJfVXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTQ3MiIgeT0iOTE0IiB3aWR0aD0iNTkwOSIgaGVpZ2h0PSIyNjQxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfcHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEZiX3F1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9xLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3J1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfci1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3NPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfc2VmWEVkdXFIb09KYlVSWlJ3IiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9zLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfdE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfdGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRmJfcC1mWEVkdXFIb09KYlVSWlJ3IiBpdGFsaWM9InRydWUiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZiX3FPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE0NzIiIHk9IjU0MTAiIHdpZHRoPSI1OTA5IiBoZWlnaHQ9IjI1OTAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdGNXRS1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHByb3ZpZGVzIGEgc2ltcGxpZmllZCBvdmVydmlldyB0byB0aGUgY29yZSBjb250ZW50IHN0cnVjdHVyZSBub3Qgc2hvd2luZyBhdHRyaWJ1dGVzIGFuZCBvbmx5IHRoZSBtb3N0IGltcG9ydGFudCBhc3NvY2lhdGlvbnMgYXMgd2VsbCBhcyBvbWl0dGluZyBhc3NvY2lhdGlvbiByb2xlIG5hbWVzLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRmJfWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA4IiBzb3VyY2U9Il9IRmJfVU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRlNPbHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZiX1pPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM3IiB5PSIyNzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzBCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfYU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzgxIiB5PSIyMjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMEIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9iT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfYS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9idWZYRWR1cUhvT0piVVJaUnciIHg9IjU0NyIgeT0iMjI5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2NPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9jdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9jZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzBCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfZHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfZXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfZU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMEIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9mZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9mdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9mT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9ndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9nT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRmJfWWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGYl9ZdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yOTU0LCAtNjc3LCA4MzczLCAtNjc3XSRbLTk3NDUsIC02NzcsIDE1ODMsIC02NzddIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRmJfZy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUMwMUNDIiBzb3VyY2U9Il9IRlNPbHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRmJfVU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZiX2gtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzI2IiB5PSItMzE0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDM1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2ktZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYwNCIgeT0iLTIyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9qZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDM1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9qdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAyRkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9rdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2tlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODI1IiB5PSItMTcwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2stZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAyRkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9sZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9sT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMzU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfbWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfbC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX211ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMkZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfbmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfbS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX251ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAzNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9vT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9vZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9uLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMkZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9wZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9vLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRmJfaE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGYl9oZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE1ODMsIDM4MSwgLTk3NDUsIDM4MV0kWzgzNzMsIDM4MSwgLTI5NTQsIDM4MV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGYl90dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMDkiIHNvdXJjZT0iX0hGYl9wdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGU09sdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl91LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRmJfdXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTE5NyIgeT0iLTM4MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl92ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl92LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl92dWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNTgxIiB5PSItMjQ1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3dPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX3dlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl93LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfeE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzQ2IiB5PSItMzk4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3h1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl95T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl94LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfek9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfeXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfME9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfenVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl8wLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl8xT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl8wdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl8yT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl8xdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRmJfdC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGYl91T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yOTU0LCAtOCwgODM3MywgNDQ2MV0kWy0xMjI4NSwgLTgsIC05NTYsIDQ0NjFdJFstMTIyODUsIC0zMTQ5LCAtOTU2LCAxMzIwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZiXzJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RCIgc291cmNlPSJfSEZiX3B1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZiX1VPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl8zT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl8zLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGYl8zZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xODMiIHk9Ijg0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl80T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl80dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl80ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNjgiIHk9Ii0yMzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfNC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl81ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfNU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl81LWZYRWR1cUhvT0piVVJaUnciIHg9IjgzIiB5PSItMTM2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl82LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl82dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0E4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfNy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfN2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfOC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfOGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl85dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl85LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl85ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl8tLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl8tZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRmJfMnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGYl8yLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy02NywgLTEyOTUsIC02NywgMzE3NV0kWy02NywgLTMxNDksIC02NywgMTMyMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGbEpRT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkIiIHNvdXJjZT0iX0hGYl9wdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGYl9VT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRmxKUk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MiIgeT0iLTE1NjgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKU09mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTU0IiB5PSIxNDMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKU3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKUy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpUdWZYRWR1cUhvT0piVVJaUnciIHg9IjUzIiB5PSIxOTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKVU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSlVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpWdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpWT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpXdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpXT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSlh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSlhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSll1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSllPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGbEpRZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZsSlF1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIxNzUsIC0xMjk1LCAtMjE3NSwgMzE3NV0kWy0yMTc1LCAtMzE1OCwgLTIxNzUsIDEzMTJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRmxKWS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NDkwMTMxIiBzb3VyY2U9Il9IRmJfVU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRmJfcHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZsSlotZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU2NCIgeT0iLTIyNDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjcyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKYS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDQiIHk9IjEzNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpiZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI3MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpidWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSmNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ1IiB5PSIxMTAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKYy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSmRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNzIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEplT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEplZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpkLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpmZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEplLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI3MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSmdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSmYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSmhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSmctZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGbEpaT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZsSlplZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTk0NywgMTMxMiwgMTk0NywgLTMxNThdJFsxOTQ3LCAzMTc1LCAxOTQ3LCAtMTI5NV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMkVEMjEzMDMyQiIgdHlwZT0iQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0cyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKaHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMThGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEZsSml1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEppLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKai1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKa2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKay1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSmxlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEZsSmgtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRmxKaU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MTI4IiB5PSIzOTIwIiB3aWR0aD0iMzg2MCIgaGVpZ2h0PSIyMDE1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKbHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSm1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEZsSm11ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEptLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSm51ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKbi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSm9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKb2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSm91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKby1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSnBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSnBlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEZsSmwtZlhFZHVxSG9PSmJVUlpSdyIgaXRhbGljPSJ0cnVlIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGbEptT2ZYRWR1cUhvT0piVVJaUnciIHg9IjgxMjgiIHk9IjgyMSIgd2lkdGg9IjM4NjAiIGhlaWdodD0iMjAxNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSnItZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE4NSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGbEpzLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKdE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEp0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZRZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NlF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NlJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZSZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NlJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZSLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZTT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGbEpzT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZsSnNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI1OTgiIHk9IjM5MjAiIHdpZHRoPSIzODYwIiBoZWlnaHQ9IjIwMTUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZkZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxN0YiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2ZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRnU2ZWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2ZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2ZmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZmdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2Zi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZnT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2Z2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2Zy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2aE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRnU2ZHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGdTZkLWZYRWR1cUhvT0piVVJaUnciIHg9IjM3MDgiIHk9IjM5MjAiIHdpZHRoPSIzODYwIiBoZWlnaHQ9IjIwMTUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdGNXRmVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iQSBzaW1wbGlmaWVkIG92ZXJ2aWV3IHRvIFdvcmsgUHJvZHVjdHMuIFdvcmsgUHJvZHVjdCBpcyBhbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciBBcnRpZmFjdHMsIE91dGNvbWVzLCBhbmQgRGVsaXZlcmFibGVzLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRmxKcHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDRBIiBzb3VyY2U9Il9IRmxKaHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRmxKbHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSnFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSnJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGbEpxdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRmxKcC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZsSnFPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTEwMTYsIDAsIDIwODJdJFswLCAtMjA5MSwgMCwgMTAwN10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEZsSnJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hGbEpydWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZ1NlNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRCIgc291cmNlPSJfSEZsSmx1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZsSnItZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGdTZUZWZYRWR1cUhvT0piVVJaUnciIHg9IjE2MzMiIHk9IjEwNTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2VU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDMwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2VXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2VWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTk5IiB5PSIyMzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2VS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAzMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZWT2ZYRWR1cUhvT0piVVJaUnciIHg9IjIwNTMiIHk9Ii0yODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2VnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NlYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzc3IiB5PSItNDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NldlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZXdWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMyIgeT0iMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAzMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nlh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NlgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NlhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nll1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NlktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NlllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZaT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDMwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2WnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2Wi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2WmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2YS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2YWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZ1NlN1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRnU2Uy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxOTMwLCA0MiwgLTI1NDAsIC0zMDU2XSRbNDA4OSwgNDIsIC0zODEsIC0zMDU2XSRbNDA4OSwgMjA5MSwgLTM4MSwgLTEwMDddIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRnU2Yk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJDIiBzb3VyY2U9Il9IRmxKci1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRmxKbHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2Y2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGdTZjT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRnU2YmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZ1NmJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE0NTYsIC0xMDE2LCAzMDE0LCAyMDgyXSRbLTMwMDUsIC0yMDkxLCAxNDY0LCAxMDA3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRnU2Yy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEZ1NmRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRnU2aGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEwIiBzb3VyY2U9Il9IRnU2ZGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRnU2ZGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2aXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZ1NmllZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY4IiB5PSItMjc5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nmp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NmplZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM1OSIgeT0iMjgyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2a09mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTkiIHk9Ii0zMTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2a3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NmstZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQwMSIgeT0iNzY4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1Nmx1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQxMyIgeT0iNzM4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nm1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nm11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1Nm0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1Nm1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nm51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1Nm4tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1Nm5lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2b3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2by1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2b2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NnBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NnB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2cC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2cGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZ1Nmh1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRnU2aC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2NjAsIDEwMDcsIDY2MCwgMTAwN10kWzY2MCwgMjU1NiwgNjYwLCAyNTU2XSRbLTM4NjksIDI1NTYsIC0zODY5LCAyNTU2XSRbLTM4NjksIDIyMCwgLTM4NjksIDIyMF0kWy0xOTMwLCAyMjAsIC0xOTMwLCAyMjBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRnU2cU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDBGIiBzb3VyY2U9Il9IRnU2ZGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRmxKbHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NnEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2cmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NnJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGdTZyT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRnU2cWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZ1NnF1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTQyMiwgLTEwMTYsIC0yOTk3LCAyMDgyXSRbMjk2MywgLTIwOTEsIC0xNDU2LCAxMDA3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRnU2ci1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEZ1NnNPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODYyNzAxQTYiIHR5cGU9IkNsYXNzIiBuYW1lPSJUYXNrc0FuZFN0ZXBzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJRT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRjRyUk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyU09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJTZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyU3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJTLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyVE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJUZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyVC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRjRyUWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGNHJRdWZYRWR1cUhvT0piVVJaUnciIHg9IjI1OTAiIHk9IjUxOTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJVT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NEE2NjAzNjgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRjRyVk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyV09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJXZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyV3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJXLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyWE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJYZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyWHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyWC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRjRyVWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGNHJVdWZYRWR1cUhvT0piVVJaUnciIHg9IjEzOTcwIiB5PSI1MTU2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyZy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEY0cmgtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4NzgiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyak9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyanVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRya09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmtlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cmt1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEY0cmhPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRjRyaGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTUxIiB5PSIyOTgwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyay1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEY0cmwtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI2NTgiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cm1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRybWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRybS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJuT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRybmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJudWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRybi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJvT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyb2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyb3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRjRybE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGNHJsZWZYRWR1cUhvT0piVVJaUnciIHg9IjcxNTQiIHk9IjY3NjQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJvLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNENGMzAxQUUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRycHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRjRycC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjc5NCIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRycWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRycS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJyT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRycmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJydWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyci1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJzT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyc2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyc3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRjRycE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGNHJwZWZYRWR1cUhvT0piVVJaUnciIHg9IjEzNDg3IiB5PSI3NDUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHIxdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IR0IxTWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzQwMyIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMU11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxTmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFOdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxTi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFPT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxT2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFPdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxTy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxUE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRjRyMS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGNHIyT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc0NDIiIHk9Ijc0NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHQjFaT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTg5IiBoZWlnaHQ9Ijk5MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxYWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxYS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxYmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMWItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEdCMVllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR0IxWXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NDUiIHk9Ijg4MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d0Y1dGLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEY0cllPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQzMDAzRiIgc291cmNlPSJfSEY0clFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEY0clVPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRjRyWk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJhT2ZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJhdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJhLWZYRWR1cUhvT0piVVJaUnciIHg9IjQxIiB5PSItMzQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJidWZYRWR1cUhvT0piVVJaUnciIHg9IjQ2MCIgeT0iMjc5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cmNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgxIiB5PSItMjg4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cmR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cmRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cmV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cmVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyZnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyZk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyZ09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEY0clllZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRjRyWXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3NjIsIC02NywgLTEwNjE3LCAtMTZdJFsxMDYxNywgLTY3LCAtNzYyLCAtMTZdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRjRycy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0IwMzE5IiBzb3VyY2U9Il9IRjRyby1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRjRyby1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRydU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGNHJ0LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRydXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRydk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRydS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDYyIiB5PSIyNTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRydmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRydnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzYwIiB5PSItMzM5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cndPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJ3ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMTIiIHk9IjQ1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJ4T2ZYRWR1cUhvT0piVVJaUnciIHg9IjQ3NiIgeT0iLTMzMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJ5ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJ4LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJ6ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJ5LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cjBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cjBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cnotZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHIwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHIxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cjFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cjAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGNHJ0T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEY0cnRlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTM5NywgMTY5LCAxMzk3LCAxNjldJFsyNTczLCAxNjksIDI1NzMsIDE2OV0kWzI1NzMsIDE0ODEsIDI1NzMsIDE0ODFdJFs1NDEsIDE0ODEsIDU0MSwgMTQ4MV0kWzU0MSwgNTI0LCA1NDEsIDUyNF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHQjFQZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBQzAxQTAiIHNvdXJjZT0iX0hGNHIxdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGNHJvLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdCMVFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFSZWZYRWR1cUhvT0piVVJaUnciIHg9IjQwMCIgeT0iLTE5NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFSLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFTT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjUiIHk9Ii0zNDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMVMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIiIHk9Ii0xNDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxVHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjI1IiB5PSIyMjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxVS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxVWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxVi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxVmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFXLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFXZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFYLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFYZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR0IxUHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHQjFQLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE5MDUsIDEwNiwgLTMxNDksIDEwNl0kWzQxMjgsIDEwNiwgLTkyNiwgMTA2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdCMWNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRCIgc291cmNlPSJfSEY0cjF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEdCMVlPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFkdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR0IxZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMWVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjA1IiB5PSIxOTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFlLWZYRWR1cUhvT0piVVJaUnciIHg9Ijc3MiIgeT0iLTI0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxZnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTYxIiB5PSIxOTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxZ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMWdlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ0IiB5PSIzNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxaHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxaE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxaXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxaU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFqdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFqT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0Ixai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0Ixa2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFrdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFrT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR0IxY2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHQjFjdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNzAxLCA1MCwgNDkwMiwgLTUwXSRbLTQ4MDksIDUwLCAxNzk0LCAtNTBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR0Ixay1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzJGIiBzb3VyY2U9Il9IRjRyUU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRjRyZy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMW1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHQjFsLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR0IxbE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHQjFsZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNSwgLTQ5MSwgLTI1LCAxNjkzXSRbLTI1LCAtMTY1OSwgLTI1LCA1MjRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHQjFtdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR0IxbS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHQjFuT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODMxODAwQjgiIHNvdXJjZT0iX0hGNHJRT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGNHJrLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0Ixbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0Ixb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdCMW9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHQjFuZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR0IxbnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3NjIsIDE4NiwgLTUxMzAsIC0xMzM3XSRbNDU1NSwgMTE2OCwgLTEzMzcsIC0zNTVdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHQjFvLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR0IxcE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHQjFwZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM0QTAzMDYiIHNvdXJjZT0iX0hGNHJnLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHQjFZT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxcS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdCMXFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHQjFwdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdCMXAtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjUsIC01MjQsIDc2LCAxNjA4XSRbMjUsIC0xNjQyLCA3NiwgNDkxXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR0Ixck9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdCMXJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR0IxcnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTgzMEUwMTUwIiBzb3VyY2U9Il9IRjRyVU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRjRyby1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMXNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0Ixcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMXRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHQjFzdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR0Ixci1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHQjFzT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIxMSwgLTQ4MiwgLTcwMiwgMzg4Nl0kWzIxMSwgLTM4NDMsIC03MDIsIDUyNF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdCMXRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHQjF0dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdCMXQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MzIzMDBGRSIgc291cmNlPSJfSEY0clVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEY0cmstZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjF1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMXZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjF2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR0IxdS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdCMXVPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHQjF1ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03NzAsIDIwMywgNDcxNSwgLTEzNzFdJFstNDE1NywgMTE3NiwgMTMyOSwgLTM5N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdCMXZ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHQjF2LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg1NEQwMkJGIiB0eXBlPSJDbGFzcyIgbmFtZT0iV29ya0RlZmluaXRpb24iPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbU1PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NTdCMDMzMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1NLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHTG1OT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1OdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbU4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1PT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0xtT2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbU91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0xtTy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbVBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0xtUGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbVB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdMbVAtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEdMbU1lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR0xtTXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDk3MiIgeT0iOTQ4IiB3aWR0aD0iMjg1MyIgaGVpZ2h0PSIyMjY5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtUU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbVEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEdMbVJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1SZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbVJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbVNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHTG1TZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtU3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHTG1TLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtVE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHTG1UZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0xtVC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IR0xtUWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHTG1RdWZYRWR1cUhvT0piVVJaUnciIHg9IjI4NDEiIHk9Ijg5NyIgd2lkdGg9IjMzNjQiIGhlaWdodD0iMjI2OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFktZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHZWhaLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhhLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaGJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhiZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaGJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhiLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaGNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhjZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHZWhjdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHZWhaT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdlaFplZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTkwMiIgeT0iNDc1NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk0QTY2MDM2OCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHZWhnT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU0llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NJdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU0ktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NKT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU0plZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NKdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU0otZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NLT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NLZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHZWhmZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdlaGZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTcwNiIgeT0iNDc1NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d0bUhFZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdMbVVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDA2MSIgc291cmNlPSJfSEdMbVFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEdMbU1PZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaEl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhJLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR2VoSWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaEpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyRDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhKZWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhKLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJEOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaEtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhLT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoS3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaEstZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU3IiB5PSIyNzAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkNGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoTHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItODI2IiB5PSItMjU1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaE1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJEOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaE11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaE0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaE1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJDRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaE51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaE4tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaE5lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkQ5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoTy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoT2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJDRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoUC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoUGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdMbVVlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR0xtVXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNDMwLCAtNTc1LCAtNjE4OSwgLTYyNl0kWzYxOTcsIC01NzUsIC0xNDIyLCAtNjI2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdlaFFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDExMCIgc291cmNlPSJfSEdMbVFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEdMbU1PZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhSdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR2VoUk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyRTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhTT2ZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhTdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJFOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhTLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyREUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaFR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTgyIiB5PSIzMDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkRFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoVWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItODc2IiB5PSItMjIxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJFOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaFZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaFZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJERSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaFd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaFdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkU4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoWHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoWE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJERSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoWXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoWU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdlaFFlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR2VoUXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjY3LCA2MDksIC02MTkxLCA1NTZdJFs2NDI5LCA2MDksIC0xNDI5LCA1NTZdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR2VoYy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgzMTgwMEI4IiBzb3VyY2U9Il9IR2VoWS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IR0xtUU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHZWhkLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR2VoZE9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdlaGRlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjYyLCAtNDU3LCAtMTkyMSwgMzI1MV0kWzE1MDcsIC0yNTczLCAtNjc3LCAxMTM0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR2VoZXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdlaGUtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR29TS3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDMwMDNGIiBzb3VyY2U9Il9IR2VoWS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IR2VoZk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU0xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU01PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHb1NMdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TTWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU00tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU011ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU05PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU05lZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDYzIiB5PSItMjk0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU04tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NPT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMTAiIHk9IjI1NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NPLWZYRWR1cUhvT0piVVJaUnciIHg9Ii01NzciIHk9Ii0yODUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TUGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TUU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TUHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TUk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TUXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NTT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NSdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NUT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NTdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR29TSy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHb1NMT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzY2MSwgNTMsIC0zMTc1LCA1M10kWzMxMjIsIDUzLCAtNzE0LCA1M10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHb1NUZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODMyMzAwRkUiIHNvdXJjZT0iX0hHZWhmT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHTG1RT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TVS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdvU1VlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHb1NUdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR29TVC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjYyLCAtNDU3LCAxODIwLCAzMjUxXSRbLTE0NDcsIC0yNTczLCA2MzUsIDExMzRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHb1NWT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR29TVmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc1owVGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk0Ij4KLSAgICAgICAgICAgIDxib2R5PjAyPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfQ3I2ZklPeGRFZHVIamUzcFBhaE40QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2MiIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2IiBuYW1lPSJSb2xlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NaMFZPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUm9sZSBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAKLUEgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDciIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjgiIG5hbWU9Im1vZGlmaWVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc19xS09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc19xSi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQyIgbmFtZT0icmVzcG9uc2libGVGb3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMDkiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc19xTWVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc19xTU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIiBuYW1lPSJUYXNrIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NpLU0tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgVGFzayBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLgotQSBUYXNrIGRlc2NyaWJlcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gc3BlY2lmaWMgUm9sZXMuICBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzLiAgSXQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMuIEEgVGFzayBpcyB1c2VkIGFzIGFuIGVsZW1lbnQgb2YgZGVmaW5pbmcgYSBwcm9jZXNzLiBUYXNrcyBhcmUgZnVydGhlciB1c2VkIGZvciBwbGFubmluZyBhbmQgdHJhY2tpbmcgcHJvZ3Jlc3M7IHRoZXJlZm9yZSwgaWYgdGhleSBhcmUgZGVmaW5lZCB0b28gZmluZS1ncmFpbmVkLCB0aGV5IHdpbGwgYmUgbmVnbGVjdGVkLCBhbmQgaWYgdGhleSBhcmUgdG9vIGxhcmdlLCBwcm9ncmVzcyB3b3VsZCBoYXZlIHRvIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIFRhc2sncyBwYXJ0cyAoZS5nLiBTdGVwcywgd2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4gCi1BIFRhc2sgaGFzIGEgY2xlYXIgcHVycG9zZSBpbiB3aGljaCB0aGUgcGVyZm9ybWluZyByb2xlcyBhY2hpZXZlIGEgd2VsbCBkZWZpbmVkIGdvYWwuICBJdCBwcm92aWRlcyBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIG9mIGRvaW5nIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuICBUaGlzIGRlc2NyaXB0aW9uIGlzIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBvZiB3aGVuIGluIGEgcHJvY2VzcyBsaWZlY3ljbGUgdGhlIHdvcmsgd291bGQgYWN0dWFsbHkgYmUgZG9uZS4gIEl0IHRoZXJlZm9yZSBkb2VzIG5vdCBkZXNjcmliZSB3aGVuIHlvdSBkbyB3aGF0IHdvcmsgYXQgd2hhdCBwb2ludCBvZiB0aW1lLCBidXQgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IGdldHMgZG9uZSB0aHJvdWdob3V0IHRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgdGhhdCBjb250cmlidXRlcyB0byB0aGUgYWNoaWV2ZW1lbnQgb2YgdGhpcyBnb2FsLiAgV2hlbiB0aGUgVGFzayBpcyBiZWluZyBhcHBsaWVkIGluIGEgcHJvY2VzcyB0aGVuIHRoaXMgcHJvY2VzcyBhcHBsaWNhdGlvbiAoZGVmaW5lZCBhcyBUYXNrIERlc2NyaXB0b3IpIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvZiB3aGljaCBwaWVjZXMgb2YgdGhlIFRhc2sgd2lsbCBhY3R1YWxseSBiZSBwZXJmb3JtZWQgYXQgYW55IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFRhc2sgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIHByb2Nlc3Mgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgYnV0IGVhY2ggdGltZSB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVtcGhhc2lzIG9uIGRpZmZlcmVudCBzdGVwcyBvciBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0aW9uLiAKLUZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXZlbG9wIFVzZSBDYXNlIE1vZGVsJnF1b3Q7IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgJnF1b3Q7bWV0aG9kJnF1b3Q7IG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMyRiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyIvPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4MzE4MDBCOCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOSIgbmFtZT0icGVyZm9ybWVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDgiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HczJnTi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HczJnTnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNBOCIgbmFtZT0ibWFuZGF0b3J5SW5wdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUQiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HczJnUS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HczJnUXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCRSIgbmFtZT0ib3V0cHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3MyZ1RPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3MyZ1MtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAzNTciIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDExN0NGNUMwMUNDIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NfcU91ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NfcU9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNUUiIG5hbWU9Im9wdGlvbmFsSW5wdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTc3Rjg0OTAxMzEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdEpiTnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdEpiTmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyIgbmFtZT0ic3RlcHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyNzk0QTY2MDM2OCIgaXNEZXJpdmVkPSJ0cnVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyNzk2MkQzMDAzRiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0VE1JLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0VE1JdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiIG5hbWU9IldvcmtQcm9kdWN0IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NpLU9PZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+Ci0gICAgICAgICAgICAgIDxib2R5PldvcmsgUHJvZHVjdCBpcyBhbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4KLUEgd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0Q5IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiIG5hbWU9Ikd1aWRhbmNlIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NpLVBPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSI+Ci0gICAgICAgICAgICAgIDxib2R5Pkd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDExRCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTdGIiBuYW1lPSJBcnRpZmFjdCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzaS1RT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxN0YiPgotICAgICAgICAgICAgICA8Ym9keT5BcnRpZmFjdCBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLgotQXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICZxdW90O293biZxdW90OyBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDBGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDExIiBuYW1lPSJjb250YWluZXJBcnRpZmFjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTdGIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0SmJKT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0SmJJLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEzIiBuYW1lPSJjb250YWluZWRBcnRpZmFjdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3RiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdEpiSi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdEpiSnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTg1IiBuYW1lPSJEZWxpdmVyYWJsZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzc3ZNLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxODUiPgotICAgICAgICAgICAgICA8Ym9keT5BIGRlbGl2ZXJhYmxlIGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiA8L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkMiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMzAiIG5hbWU9ImRlbGl2ZXJlZFdvcmtQcm9kdWN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0SmJNT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0SmJMLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOEYiIG5hbWU9Ik91dGNvbWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc3N2Ti1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMThGIj4KLSAgICAgICAgICAgICAgPGJvZHk+QW4gb3V0Y29tZSBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA0QSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTRBNjYwMzY4IiBuYW1lPSJTdGVwIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3Nzdk8tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk0QTY2MDM2OCI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgU3RlcCBpcyBhIFNlY3Rpb24gYW5kIFdvcmsgRGVmaW5pdGlvbiB0aGF0IGlzIHVzZWQgdG8gb3JnYW5pemUgVGFza3MgaW50byBwYXJ0cyBvciBzdWJ1bml0cyBvZiB3b3JrLiAgU3RlcHMgaW5oZXJpdCB0aGUgc3ViU2VjdGlvbnMgZGVjb21wb3NpdGlvbiBmcm9tIFNlY3Rpb24gYW5kIGNhbiB0aGVyZWZvcmUgZGVzY3JpYmUgU3ViLVN0ZXBzIG5lc3RlZCBpbnRvIFN0ZXBzLgotQSBTdGVwIGRlc2NyaWJlcyBhIG1lYW5pbmdmdWwgYW5kIGNvbnNpc3QgcGFydCBvZiB0aGUgb3ZlcmFsbCB3b3JrIGRlc2NyaWJlZCBmb3IgYSBUYXNrLiAgVGhlIGNvbGxlY3Rpb24gb2YgU3RlcHMgZGVmaW5lZCBmb3IgYSBUYXNrIHJlcHJlc2VudHMgYWxsIHRoZSB3b3JrIHRoYXQgc2hvdWxkIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGUgb3ZlcmFsbCBkZXZlbG9wbWVudCBnb2FsIG9mIHRoZSBUYXNrLiAgTm90IGFsbCBzdGVwcyBhcmUgbmVjZXNzYXJpbHkgcGVyZm9ybWVkIGVhY2ggdGltZSBhIFRhc2sgaXMgaW52b2tlZCBpbiBhIFByb2Nlc3MgKHNlZSBUYXNrIERlc2NyaXB0b3IpLCBzbyB0aGV5IGNhbiBhbHNvIGJlIGV4cHJlc3NlZCBpbiB0aGUgZm9ybSBvZiBhbHRlcm5hdGUgJ2Zsb3dzJyBvZiB3b3JrLiAgRGlmZmVyZW50IHdheXMgb2YgYWNoaWV2aW5nIHRoZSBzYW1lIGRldmVsb3BtZW50IGdvYWwgY2FuIHRoZW4gYmUgJ2Fzc2VtYmxlZCcgYnkgc2VsZWN0aW5nIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2Ygc3RlcHMgd2hlbiBhcHBseWluZyB0aGUgVGFzayBpbiBhIFByb2Nlc3MuICBUeXBpY2FsIGtpbmRzIG9mIHN0ZXBzIGEgVGFzayBhdXRob3Igc2hvdWxkIGNvbnNpZGVyIGFyZTogVGhpbmtpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIHVuZGVyc3RhbmQgdGhlIG5hdHVyZSBvZiB0aGUgdGFzaywgZ2F0aGVycyBhbmQgZXhhbWluZXMgdGhlIGlucHV0IGFydGlmYWN0cywgYW5kIGZvcm11bGF0ZXMgdGhlIG91dGNvbWUuIFBlcmZvcm1pbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGNyZWF0ZSBvciB1cGRhdGUgc29tZSBhcnRpZmFjdHMuIFJldmlld2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgaW5zcGVjdHMgdGhlIHJlc3VsdHMgYWdhaW5zdCBzb21lIGNyaXRlcmlhLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTgzMEUwMTUwIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIi8+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTgzMjMwMEZFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiIG5hbWU9IldvcmtEZWZpbml0aW9uIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NzdlFPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiI+Ci0gICAgICAgICAgICAgIDxib2R5PldvcmsgRGVmaW5pdGlvbiBpcyBhbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLgotV29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTgyRjMwMjZFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkNGIiBuYW1lPSJwcmVjb25kaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyN0E4NTdCMDMzMyIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAwNjEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdFRNS3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdFRNS2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJERSIgbmFtZT0icG9zdGNvbmRpdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3QTg1N0IwMzMzIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDExMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0VE1NZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0VE1NT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDgiIG5hbWU9IkRlZmF1bHRfUHJpbWFyeVBlcmZvcm1lciIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA5IF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMEIiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HczJnTS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA4Ij4KLSAgICAgICAgICAgICAgPGJvZHk+Um9sZXMgY2FuIGJlIGRlZmluZWQgdG8gcGVyZm9ybSBtYW55IFRhc2tzLCBidXQgZXZlcnkgVGFzayBtYXkgaGF2ZSBvbmx5IG9uZSBSb2xlIHRoYXQgaXMgYnkgZGVmYXVsdCB0aGUgcHJpbWFyeSBwZXJmb3JtZXIgb2YgdGhpcyBUYXNrLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwQiIgbmFtZT0icGVyZm9ybXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDgiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HczJnT3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HczJnT2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlEIiBuYW1lPSJEZWZhdWx0X01hbmRhdG9yeUlucHV0cyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlFIF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQTgiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HczJnUE9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlEIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBsaW5rcyB0byB6ZXJvIG9yIG1hbnkgZGVmaW5pdGlvbnMgb2YgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBkZWZpbmVkIGFzIG1hbmRhdG9yeSBpbnB1dHMgZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RSIgbmFtZT0ibWFuZGF0b3J5SW5wdXRUbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzMmdRT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzMmdQLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkIiIG5hbWU9IkRlZmF1bHRfT3V0cHV0cyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JDIF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HczJnUmVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JCIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBsaW5rcyB0byB6ZXJvIG9yIG1hbnkgZGVmaW5pdGlvbnMgb2YgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBkZWZpbmVkIGFzIG91dHB1dHMgb2YgdGhpcyBUYXNrLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQyIgbmFtZT0ib3V0cHV0RnJvbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzMmdTZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzMmdTT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjUiIG5hbWU9IkRlZmF1bHRfTW9kaWZpZXMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNiBfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY4IiBpc0Rlcml2ZWQ9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc19xSWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY1Ij4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBpcyBkZXJpdmVkIGZyb20gdGhlIGZhY3QgdGhhdCBSb2xlcyBwZXJmb3JtIFRhc2tzIHRoYXQgaGF2ZSBXb3JrIFByb2R1Y3RzIG9mIHRoYXQgcGFydGljdWxhciB0eXBlIGFzIG91dHB1dHMuICAvbW9kaWZpZXMgcHJvdmlkZXMgYWxsIHRoZSB0eXBlcyBvZiBXb3JrIFByb2R1Y3RzIHRoYXQgdGhlIFJvbGUgcHJvZHVjZXMgb3IgbW9kaWZpZXMgdmlhIG9uZSBvZiB0aGUgVGFza3MgZGVmaW5lZCB0byBiZSBwZXJmb3JtZWQgYnkgdGhlIFJvbGUsIGVpdGhlciBhcyBwcmltYXJ5IG9yIGFkZGl0aW9uYWwgcGVyZm9ybWVyLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNiIgbmFtZT0ibW9kaWZpZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2IiBpc0Rlcml2ZWQ9InRydWUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NfcUplZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NfcUpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwOSIgbmFtZT0iRGVmYXVsdF9SZXNwb25zaWJsZSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBBIF8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc19xS3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTA5Ij4KLSAgICAgICAgICAgICAgPGJvZHk+UmVzcG9uc2liaWxpdHkgZm9yIGEgd29yayBwcm9kdWN0IGluZGljYXRlcyB0aGUgcm9sZSdzIG93bmVyc2hpcCBvZiBhbGwgaW5zdGFuY2VzIG9mIHRoaXMgd29yayBwcm9kdWN0IHR5cGUuICBGb3IgZXhhbXBsZSwgdGhlIHJvbGUgcmVzcG9uc2libGUgZm9yIGEgd29yayBwcm9kdWN0IGFuc3dlcnMgdG8gbWFuYWdlbWVudCBhYm91dCBpdHMgcXVhbGl0eSBzdGF0ZS4gIEJlaW5nIHJlc3BvbnNpYmxlIGZvciB0aGUgd29yayBwcm9kdWN0IGRvZXMgbm90IG1lYW4gdGhhdCB0aGUgcm9sZSBpcyB0aGUgb25seSBvbmUgbW9kaWZ5aW5nIGl0LCBidXQgbWFrZXMgdWx0aW1hdGUgZGVjaXNpb25zIGFib3V0IGFjY2VwdGluZyBvciByZWplY3RpbmcgdGhlc2UgbW9kaWZpY2F0aW9ucyB3aGVuIHJldmlld2luZyB0aGVzZSBtb2RpZmljYXRpb25zLiAgRXZlcnkgd29yayBwcm9kdWN0IGhhcyBub25lIG9yIG9uZSByb2xlIHJlc3BvbnNpYmxlIHJvbGUuIDwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQSIgbmFtZT0icmVzcG9uc2libGVSb2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTA5Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NfcUx1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NfcUxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVDMDFDQyIgbmFtZT0iRGVmYXVsdF9BZGRpdGlvbmFsUGVyZm9ybWVyIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAyRkQgXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDM1NyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzX3FNLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1QzAxQ0MiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlZmluZXMgYWRkaXRpb25hbCByb2xlcyB0aGF0IGJ5IGRlZmF1bHQgY2FuIGJlIGFzc2lnbmVkIHRvIGhlbHAgY29tcGxldGluZyBhIFRhc2suPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMkZEIiBuYW1lPSJoZWxwc1BlcmZvcm1pbmciIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1QzAxQ0MiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc19xTi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc19xTnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEwIiBuYW1lPSJDb21wb3NpdGlvbiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDExIF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdEpiSU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEwIj4KLSAgICAgICAgICAgICAgPGJvZHk+QXJ0aWZhY3QgdHlwZXMgY2FuIGJlIGRlZmluZWQgdG8gYmUgcGh5c2ljYWxseSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBpcyBjb21wb3NlZCBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRCIgbmFtZT0iRGVmYXVsdERlbGl2ZXJlZFdQIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkUgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAzMCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0SmJLZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkQiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlZmluZXMgdGhlIGRlZmF1bHQgcGFydHMgb2YgYSBkZWxpdmVyYWJsZSwgaS5lLiB0aGUgdHlwZXMgb2Ygd29yayBwcm9kdWN0cyBhIERlbGl2ZXJhYmxlIGNvbXByaXNlcyBvZi4gIFRoaXMgYWdncmVnYXRpb24gY2FuIGJlIG92ZXJyaWRkZW4gaW4gYSBQcm9jZXNzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRSIgbmFtZT0iX2RlbGl2ZXJhYmxlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTg1IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3RKYkxlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3RKYkxPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNzdGODQ5MDEzMSIgbmFtZT0iRGVmYXVsdF9PcHRpb25hbElucHV0cyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjVFIF8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNzIiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdEpiTXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NDkwMTMxIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBsaW5rcyB0byB6ZXJvIG9yIG1hbnkgZGVmaW5pdGlvbnMgb2YgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBkZWZpbmVkIGFzIG9wdGlvbmFsIGlucHV0cyBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2suPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjcyIiBuYW1lPSJvcHRpb25hbElucHV0VG8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTc3Rjg0OTAxMzEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdEpiT2VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdEpiT09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTYyRDMwMDNGIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMgXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSIgaXNEZXJpdmVkPSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3RKYk8tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQzMDAzRiI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgZGVyaXZlZCBhc3NvY2lhdGlvbiBpcyBhIHNob3J0Y3V0IGZvciBuYXZpZ2F0aW9uIGFsb25nIHRoZSBhc3NvY2lhdGlvbiBwcm9wZXJ0aWVzIENvbnRlbnRFbGVtZW50LnByZXNlbnRhdGlvbi5zZWN0aW9ucy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiIG5hbWU9Il90YXNrIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0Mjc5NjJEMzAwM0YiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDA2MSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkNGIF8zQURDN0I3NDAyMkQ0MjdBODdFOTAyRDkiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdFRNSnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMDYxIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBjb21wb3NpdGlvbiBhc3NvY2lhdGlvbiBhZGRzIGFuIG9wdGlvbmFsIHByZS1jb25kaXRpb24gdG8gYSBXb3JrIERlZmluaXRpb24uICBBIHByZS1jb25kaXRpb24gZGVmaW5lcyBhbnkga2luZCBvZiBjb25zdHJhaW50IHRoYXQgbXVzdCBldmFsdWF0ZSB0byB0cnVlIGJlZm9yZSB0aGUgd29yayBkZXNjcmliZWQgZm9yIHRoZSBXb3JrIERlZmluaXRpb24gY2FuIHN0YXJ0LiBGb3IgZXhhbXBsZSwgYSBwcmUtY29uZGl0aW9uIGZvciBhIFRhc2sgY291bGQgZGVmaW5lIHRoYXQgYW4gaW5wdXQgV29yayBQcm9kdWN0IG5lZWRzIHRvIGJlIGluIGEgc3BlY2lmaWMgc3RhdGUgb3IgdGhhdCBvdGhlciByZWxhdGVkIHdvcmsgbXVzdCBiZSBpbiBhIGNlcnRhaW4gc3RhdGUgKGUuZy4gJ0lucHV0IGRvY3VtZW50IFggaGFzIGJlZW4gcmV2aWV3ZWQgYW5kIHNpZ25lZCBieSBjdXN0b21lciBBTkQgVGFzayAmcXVvdDtNYW5hZ2VtZW50IFJldmlldyZxdW90OyBpcyBjb21wbGV0ZScpIGJlZm9yZSB0aGUgVGFzayBjYW4gYmVnaW4uCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyRDkiIG5hbWU9Il93b3JrRGVmaW5pdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMDYxIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAxMTAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJERSBfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkU4Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3RUTUxlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDExMCI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgY29tcG9zaXRpb24gYXNzb2NpYXRpb24gYWRkcyBhbiBvcHRpb25hbCBwb3N0LWNvbmRpdGlvbiB0byBhIFdvcmsgRGVmaW5pdGlvbi4gIEEgcG9zdC1jb25kaXRpb24gZGVmaW5lcyBhbnkga2luZCBvZiBjb25zdHJhaW50IHRoYXQgbXVzdCBldmFsdWF0ZSB0byB0cnVlIGJlZm9yZSB0aGUgd29yayBkZXNjcmliZWQgZm9yIHRoZSBXb3JrIERlZmluaXRpb24gY2FuIGJlIGRlY2xhcmVkIGNvbXBsZXRlZCBvciBmaW5pc2hlZCBhbmQgd2hpY2ggb3RoZXIgV29yayBEZWZpbml0aW9ucyBtaWdodCBkZXBlbmQgdXBvbiAoZS5nLiBmb3IgdGhlaXIgcHJlLWNvbmRpdGlvbnMpLiAgRm9yIGV4YW1wbGUsIGEgcG9zdC1jb25kaXRpb24gZm9yIGEgVGFzayBjb3VsZCBkZWZpbmUgdGhhdCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIHRvIGJlIHRoZSBvdXRwdXQgbXVzdCBiZSBpbiBhIHNwZWNpZmljIHN0YXRlIGJlZm9yZSB0aGUgVGFzayBjYW4gZW5kIChlLmcuICdVc2UgQ2FzZSBtdXN0IGJlIGluIHN0YXRlIGZ1bGx5IGRlc2NyaWJlZCBhbmQgcmV2aWV3ZWQgYnkgU3lzdGVtIEFuYWx5c3QnKS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyRTgiIG5hbWU9Il93b3JrRGVmaW5pdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMTEwIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTQ3OEUwMDBEIiBuYW1lPSJNZXRob2RQYWNrYWdlIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d0NUNCLWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxRTA5OUI4MDAwOSI+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTA5OUI4MDAwOSIgdHlwZT0iQ2xhc3MiIG5hbWU9IlN0cnVjdHVyZSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TVnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEdvU1d1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NYLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TWU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NZZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TWXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NZLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TWk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TWmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IR29TVi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHb1NXT2ZYRWR1cUhvT0piVVJaUnciIHg9IjY0MyIgeT0iMTcxOCIgd2lkdGg9IjQ3MTUiIGhlaWdodD0iMjk2MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y05lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEyQiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHeGNPZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1BPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNQZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y1B1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNQLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y1FPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNRZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y1F1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNST2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHeGNOdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEd4Y04tZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTE1IiB5PSI3NDQyIiB3aWR0aD0iMzU5NiIgaGVpZ2h0PSIyNDMxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjVHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEd4Y1V1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMzNTIiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1Z1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjVi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1dPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjV2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1d1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjVy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1hPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y1hlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEd4Y1QtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR3hjVU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3OTc1IiB5PSI3ODUwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3Q1Q0NlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249Ik1ldGhvZCBQYWNrYWdlIGlzIGRlZmluZWQgYXMgYW4gYWJzdHJhY3QgY2xhc3MuICBJdHMgc3BlY2lhbGl6YXRpb24sIENvbnRlbnQgUGFja2FnZSwgZGVmaW5lcyB0aGUgcmVkZWZpbml0aW9uIG9mIHRoZSBVTUwgcGFja2FnZSB0byBjb250YWluIG9ubHkgQ29udGVudCBFbGVtZW50cy4gIE1ldGhvZCBQYWNrYWdlcyBjYW4gYmUgZGVmaW5lZCBhcyBnbG9iYWwgKGkuZS4gYW55IGVsZW1lbnQgaW4gYW55IG90aGVyIHBhY2thZ2UgY2FuIGFjY2VzcyBpdHMgY29udGVudHMpLiAgVGhleSBjYW4gYmUgbmVzdGVkIGFzIHdlbGwgYXMgZGVmaW5lIGRlcGVuZGVuY2llcyB0byBvdGhlciBwYWNrYWdlcyAodmlhIHRoZSByZXVzZWRQYWNrYWdlcyBhc3NvY2lhdGlvbikuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHb1NadWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNDkiIHNvdXJjZT0iX0hHb1NWdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHb1NWdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdvU2F1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NidWZYRWR1cUhvT0piVVJaUnciIHg9IjExNTUiIHk9Ii0zMTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NjZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NDgiIHk9Ii0zMjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU2RPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE0NzIiIHk9IjIxMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NkLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zMTQiIHk9Ii0zOTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TZk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TZXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TZ09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TZnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NoT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NndWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNFZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NodWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR29TWi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHb1NhT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIzNTMsIC01NjcsIDIzNTMsIC01NjddJFs2MjE0LCAtNTY3LCA2MjE0LCAtNTY3XSRbNjIxNCwgLTIzMjgsIDYyMTQsIC0yMzI4XSRbMTMxMiwgLTIzMjgsIDEzMTIsIC0yMzI4XSRbMTMxMiwgLTE0ODEsIDEzMTIsIC0xNDgxXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEd4Y0V1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNSIgc291cmNlPSJfSEdvU1Z1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEdvU1Z1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHeGNGdWZYRWR1cUhvT0piVVJaUnciIHg9IjI5NyIgeT0iMTUwMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNHdWZYRWR1cUhvT0piVVJaUnciIHg9IjY5NyIgeT0iNjI3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjSGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzI1IiB5PSIzNTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y0lPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkxNyIgeT0iMjgwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNJLWZYRWR1cUhvT0piVVJaUnciIHg9IjE0MCIgeT0iMTM4OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNLT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNKdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNMT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNLdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0wtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y01PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y0x1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y05PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y011ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHeGNFLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEd4Y0ZPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjM1MywgNjA5LCAyMzUzLCA2MDldJFs2MTgwLCA2MDksIDYxODAsIDYwOV0kWzYxODAsIDI4MDIsIDYxODAsIDI4MDJdJFsxNDczLCAyODAyLCAxNDczLCAyODAyXSRbMTQ3MywgMTQ4MSwgMTQ3MywgMTQ4MV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHeGNSZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAzQUYiIHNvdXJjZT0iX0hHeGNOZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHb1NWdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjUy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEd4Y1NlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHeGNSdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEd4Y1ItZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE0MywgLTEzOTcsIC0yNDUsIDQyNDFdJFstMTQzLCAtNDE1NywgLTI0NSwgMTQ4MV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEd4Y1RPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHeGNUZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEd4Y1h1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwQiIgc291cmNlPSJfSEd4Y05lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEd4Y1R1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNaT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR3hjWXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y1p1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjI4IiB5PSIzMjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjYU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjYWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTY2IiB5PSItMzQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNiT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii04IiB5PSIyOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjYi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItOTUxIiB5PSItMjU1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y2RPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y2N1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y2VPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y2R1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjZk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjZXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjZ09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjZnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEd4Y1gtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR3hjWU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjA4LCAtMTM1LCAtNTE0NywgLTMzXSRbNTA4MCwgLTEzNSwgLTE2NzYsIC0zM10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMzYwRTcyMDAzNyIgdHlwZT0iQ2xhc3MiIG5hbWU9IlRheG9ub215Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSEd4Y2d1ZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlVNTDIgSW5mcmFzdHJ1Y3R1cmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR3hjZy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDE1IiB5PSI2MDEiIHdpZHRoPSI3MDQ0IiBoZWlnaHQ9IjgxNDQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNodWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTA2MjAyRDUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IR3hjaXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjgyNyIgaGVpZ2h0PSIxNTQwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdORWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05FdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdORS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TkZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05GZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TkZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05GLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TkdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05HZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05HdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHeGNoLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEd4Y2lPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzM2MSIgeT0iMTM2MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGQTM2MDJDMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05IdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHN05ILWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNTczIiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05JZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tkl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05JLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TkpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05KZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3Tkp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05KLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TktPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05LZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05LdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHN05IT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEc3TkhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTU5NCIgeT0iNjExOCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkstZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFODMzMDFBNSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05MdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHN05MLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MzY4IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05NZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tk11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05NLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3Tk5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05OZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3Tk51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05OLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3Tk9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05PZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05PdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHN05MT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEc3TkxlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjY5MiIgeT0iNDM2MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tk8tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05QdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHN05QLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMzAyIiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05RZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05RLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TlJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05SZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TlJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05SLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TlNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05TZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05TdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHN05QT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEc3TlBlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjE1OSIgeT0iOTIyOCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tlp1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05hZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHN05hdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTIyIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05hLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOYi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOY2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOYy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TmRlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEc3TlotZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRzdOYU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIzOTc5IiB5PSIxMTU0MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEyQiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05pLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHN05qT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNDU0IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05qZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tmp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOa2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tmt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOay1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdObGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tmx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TmwtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEc3TmllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRzdOaXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MDEzIiB5PSIxMzQ3MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d0NUNDLWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGUgTWV0aG9kIFBhY2thZ2UgcGFja2FnZSBkZWZpbmVzIGhvdyB0aGUgbWV0aG9kIGVsZW1lbnRzIGNhbiBiZSBwaHlzaWNhbGx5IG9yZ2FuaXplZCBpbiBwYWNrYWdlIGhpZXJhcmNoaWVzLiAgSXQgcmV1c2VkIHRoZSBwYWNrYWdlIGNvbmNlcHQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZSBMaWJyYXJ5LCBidXQgcmVkZWZpbmVzIGl0IHRvIHJlc3RyaWN0IENvbnRlbnQgUGFja2FnZXMgdG8gb25seSBjb250YWluIENvbnRlbnQgRWxlbWVudHMgYW5kIG5vdCBhbnkgUGFja2FnZWFibGUgRWxlbWVudHMgKFRCRDogdXBkYXRlIGRpYWdyYW0gd2l0aCB7cmVkZWZpbmVzfSBjb25zdHJhaW50ISkuIFRoZSBkaWFncmFtIHNob3dzIHRoZSBvdmVyYWxsIHRheG9ub215IGlzIHdoaWNoIE1ldGhvZCBQYWNrYWdlIGlzIGRlZmluZWQgYXMgYW4gYWJzdHJhY3QgY2xhc3MuICIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRzdOUy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREZCQ0YwMkE5IiBzb3VyY2U9Il9IRzdORy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRzdOSy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHN05ULWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRzdOVE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHN05UZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05NzksIC03OSwgOTc5LCAxOTU4XSRbLTE5ODUsIC03OSwgLTI3LCAxOTU4XSRbLTE5ODUsIC0xNzE5LCAtMjcsIDMxOF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3TlV1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHN05VLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEc3TlZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGOEQ0MDIxMSIgc291cmNlPSJfSEc3TkstZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEd4Y2h1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05WLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TldlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05XdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRzdOV09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEc3TlZlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRzdOVnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODQsIC01MTYsIDE2LCAyMjI2XSRbLTg0LCAtMTk3MiwgMTYsIDc3MF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3TlctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHN05YT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEc3TlhlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUMzMzRGMDE5OCIgc291cmNlPSJfSEc3Tk8tZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEc3TkstZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05ZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tll1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05ZLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRzdOWWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEc3Tlh1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRzdOWC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1MCwgLTUyNCwgLTEwMTYsIDQzNTFdJFs1MCwgLTQzNjAsIC0xMDE2LCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHN05aT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRzdOWmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHN05kdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwQ0MwQTAxRDciIHNvdXJjZT0iX0hHN05adWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHN05HLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05lLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOZk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEc3TmV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHN05kLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEc3TmVPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzc4LCAtNDQ4LCAtMzg5LCA0NjMxXSRbNzc4LCAtNDU2MywgLTM4OSwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRzdOZmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3TmZ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRzdOZi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQUQ1RjgwMzhFIiBzb3VyY2U9Il9IRzdOWnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRzdOTy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tmd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHN05nLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRzdOZ09mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHN05nZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMDA3LCAtNDQ4LCA5MjIsIDE3ODZdJFstMTAwNywgLTE3MTgsIDkyMiwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRzdOaHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3TmgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRzdObU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwM0FGIiBzb3VyY2U9Il9IRzdOaU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRzdOWnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tm0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdObmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tm51ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHN05uT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRzdObWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHN05tdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NDgsIDAsIDE0ODFdJFswLCAtMTQ4MSwgMCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRzdObi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3Tm9PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3RtSEUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0NzhFMDAwRCI+Ci0gICAgICAgICAgICA8Ym9keT4wNTwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX1JLRURZT3hnRWR1SGplM3BQYWhONEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MURFNDlFQTAxRTIiLz4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX1JxR09VT3hnRWR1SGplM3BQYWhONEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjUiLz4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX1NMVlRJT3hnRWR1SGplM3BQYWhONEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MkRERTI4MDAyNUQiLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiIgbmFtZT0iTWV0aG9kUGFja2FnZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0bUhHLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiPgotICAgICAgICAgICAgICA8Ym9keT5BIE1ldGhvZCBQYWNrYWdlIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMENDMEEwMUQ3IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREZBMzYwMkMxIi8+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGQUQ1RjgwMzhFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEyRkE4NTQwMzBFIiBuYW1lPSJnbG9iYWwiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0bUhJT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTJGQTg1NDAzMEUiPgotICAgICAgICAgICAgICAgIDxib2R5Pk1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0d0bUhJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4KLSAgICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyIgbmFtZT0icmV1c2VkUGFja2FnZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNDkiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdHZSRS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdHZSRXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzOCIgbmFtZT0iY2hpbGRQYWNrYWdlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0NUNCdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0NUNCZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMkIiIG5hbWU9IkNvbnRlbnRQYWNrYWdlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3RtSEpPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEyQiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgQ29udGVudCBQYWNrYWdlIGlzIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwM0FGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBDIiBuYW1lPSJjb250ZW50RWxlbWVudHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdHZSQi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdHZSQnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBCIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEMgXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwRCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0dlJBLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEIiPgotICAgICAgICAgICAgICA8Ym9keT5BIENvbnRlbnQgUGFja2FnZSBjb250YWlucyBDb250ZW50IEVsZW1lbnRzLiAgQSBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2UgY2FuIGJlIHBhcnQgb2Ygb25seSBvbmUgcGFja2FnZSBpbnN0YW5jZS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEQiIG5hbWU9Il9jb250ZW50UGFja2FnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTJCIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3R2UkN1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3R2UkNlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNDkiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSBfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3R2UkRPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0OSI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVzY3JpYmVzIGEgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSB0d28gcGFja2FnZXMgaXQgY29ubmVjdHMuICBUaGUgcGFja2FnZSBhdCB0aGUgdXNpbmdQYWNrYWdlIGVuZCBkZXBlbmRzIG9uIHRoZSBwYWNrYWdlIGF0IHRoZSByZXVzZWRQYWNrYWdlIGVuZC4gIEZvciBleGFtcGxlLCBhbiBlbGVtZW50IGluIHRoZSBmb3JtZXIgcGFja2FnZSBpcyB1c2luZyBhbiBlbGVtZW50IGluIHRoZSBsYXRlciBpbiBhIHJlbGF0aW9uc2hpcCBzdWNoIGFzIGEgVGFzayBpcyB1c2luZyBhIFdvcmsgUHJvZHVjdHMgYXMgYW4gaW5wdXQuICBSZWZsZXhpdmUgcmV1c2VkUGFja2FnZSBsaW5rcyAoaS5lLiBhIHBhY2thZ2UgdGhhdCBkZXBlbmRzIG9uIGl0c2VsZikgYXJlIG5vdCBhbGxvd2VkLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSIgbmFtZT0idXNpbmdQYWNrYWdlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0OSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0dlJFT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0dlJELWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzUiIG5hbWU9IlBhY2thZ2VOZXN0aW5nIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzYgXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzOCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0dlJGZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzUiPgotICAgICAgICAgICAgICA8Ym9keT5NZXRob2QgUGFja2FnZXMgY2FuIGJlIG5lc3RlZCwgaS5lLiBhIHBhY2thZ2UgY2FuIGJlIHBhcnQgb2YgYW5vdGhlciBwYWNrYWdlLiAgTmVzdGVkIHBhY2thZ2VzIGRvIG5vdCBuZWVkIHRvIGJlIG9mIHRoZSBzYW1lIHR5cGUsIGUuZy4gYSBDb250ZW50IFBhY2thZ2UgY2FuIGJlIGRlZmluZWQgaW5zaWRlIGEgUHJvY2VzcyBQYWNrYWdlIChkZWZpbmUgZm9yIHRoZSBQcm9jZXNzIHBhcnQgb2YgdGhpcyBtb2RlbCkuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM2IiBuYW1lPSJfbWV0aG9kUGFja2FnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3Q1Q0EtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3Q1Q0F1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNDlFQTAxRTIiIG5hbWU9Ik1ldGhvZENvcmVEZXNjcmlwdGlvbnMiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3V5WjRlZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDFERTRBQjQwMDk4Ij4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTRBQjQwMDk4IiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtRU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTUyMjEwMUQyIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhFLUZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ3NTgiIGhlaWdodD0iMjQyMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1GZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1HZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtR3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1HLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtSE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1IZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtSHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtSC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISEUtRWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIRS1FdWZYRWR1cUhvT0piVVJaUnciIHg9IjY0NjAiIHk9IjE2MzE1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtSU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTUyNUMwMTM3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhFLUpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ0MDIiIGhlaWdodD0iMTU3NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1KZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1LZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtS3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1LLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtTE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1MZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtTHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtTC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISEUtSWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIRS1JdWZYRWR1cUhvT0piVVJaUnciIHg9IjE4NjIiIHk9IjE2MjgxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtTU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjM2MzYwMTA5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLU0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhFLU5PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM5MjgiIGhlaWdodD0iMzI2OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1OZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLU51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLU9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1PZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtT3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1PLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtUE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1QZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtUHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtUC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISEUtTWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIRS1NdWZYRWR1cUhvT0piVVJaUnciIHg9IjIyMTY1IiB5PSIxMjk0NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1MzE5MDM1MCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1RLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIRS1ST2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0OTk1IiBoZWlnaHQ9IjE5OTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1SdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1TT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtU2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtUy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtVGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLVQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhFLVFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISEUtUXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjI4NSIgeT0iMTI5MjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1VT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTM1MTAwMTMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISEUtVk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzExNSIgaGVpZ2h0PSIxNTc0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1WLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLVdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1XdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLVctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1YT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLVhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1YdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1YLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIRS1VZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhFLVV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iODc1NCIgeT0iMTI5MjgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1ZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGMzYyMDAwOUEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISEUtWk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzYwNiIgaGVpZ2h0PSIxMTUxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1aLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLWFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1hdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLWEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1iT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLWJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1idWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1iLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIRS1ZZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhFLVl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTc5NTciIHk9IjEyOTM3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtY09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTUzNkEwMEQ4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhFLWRPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ4NzYiIGhlaWdodD0iMjQyMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lCT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JQmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lCdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JQi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lDT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JQ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JQ3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISEUtY2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIRS1jdWZYRWR1cUhvT0piVVJaUnciIHg9IjM0NTQiIHk9IjEyOTExIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JQy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhPSUQtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4MjciIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JRk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JRnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JR09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSUd1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhPSURPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSURlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMwNjQiIHk9Ijk5OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk3Rjc0MDM5MiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIT0lILWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NTU1IiBoZWlnaHQ9IjExNTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JSk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JSnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JS09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUtlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSUt1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhPSUhPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISE9JSGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTk0NiIgeT0iODU2OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0liZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIT0lidWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0ljT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0ljdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JYy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JZGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JZC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSWVlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhPSWEtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSWJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTk1MzIiIHk9IjM1MTMiIHdpZHRoPSI1MTMwIiBoZWlnaHQ9IjIyMTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lwdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISE9JcXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDE4MiIgaGVpZ2h0PSIxNTQwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSXEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9Jck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSXItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSXNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSXMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0l0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0l0ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIT0lwLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0lxT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEyNDM3IiB5PSI0MDA0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1TXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNU5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhYNU51ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ0ODciIGhlaWdodD0iMTU0MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNU9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1T2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNU91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVPLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1UE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVQZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1UHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVQLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1UU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1UWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISFg1TS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISFg1Tk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI0NzE1IiB5PSI0MDA0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1YnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRURFNEMwMzg0Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhYNWN1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM1ODkiIGhlaWdodD0iMTU3NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1ZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVkLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1ZU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVlZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1ZXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVlLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Zk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1ZmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISFg1Yi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIWDVjT2ZYRWR1cUhvT0piVVJaUnciIHg9IjUxNjQiIHk9IjgzMDUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdXlaNC1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIE1ldGhvZCBDb3JlIERlc2NyaXB0aW9ucyBwYWNrYWdlIGRlZmluZXMgdGhlIGV4YWN0IG5hdHVyZSBvZiB0ZXh0dWFsIGRlc2NyaXB0aW9ucyB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgZm9yIENvbnRlbnQgRWxlbWVudHMuICBUaGUgZGVjbGFyYXRpb25zIGZvciB0aGVzZSBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGZhY3RvcmVkIGludG8gdGhpcyBzZXBhcmF0ZSBwYWNrYWdlLCBiZWNhdXNlIGV2ZXJ5IGltcGxlbWVudGVyIG9mIHRoaXMgbWV0YS1tb2RlbCBtaWdodCBkZWNpZGUgdG8gZGVmaW5lIGEgZGlmZmVyZW50IHNldCBvZiBkZXNjcmlwdGlvbiBhdHRyaWJ1dGVzIGZvciB0aGVpciBDb250ZW50IEVsZW1lbnRzLiAgSG93ZXZlciwgb25seSB0aGUgZGVzY3JpcHRpb24gYXR0cmlidXRlcyBkZWZpbmVkIGluIHRoaXMgcGFja2FnZSBhcmUgdGhlIHN0YW5kYXJkaXplZCBzZXQgZm9yIElCTSdzIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZSBhbmQgYXJlIHN1cHBvcnRlZCBmb3IgbWV0aG9kIGNvbnRlbnQgaW50ZXJjaGFuZ2UgKGkuZS4gaW1wb3J0L2V4cG9ydCBzY2VuYXJpb3MgZm9yIGRpZmZlcmVudCBjb250ZW50IHNvdXJjZXMpLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISE9JSy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQUUwODUwMzgzIiBzb3VyY2U9Il9ISEUtUU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISE9JRy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSU1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0lMLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISE9JTE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIT0lMZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMDMsIC05OTksIDM1NSwgMzc3Nl0kWy0yMDMsIC00MTk5LCAzNTUsIDU3NV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSU11ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lNLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhPSU5PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkFFMDc1MDNDNyIgc291cmNlPSJfSEhFLWNPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhPSUctZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSU9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lPdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISE9JT09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhPSU5lZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIT0lOdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC0xMjE5LCAtODMzMSwgMzc1OV0kWzgsIC0yODk1LCAtODMyMiwgMjA4Ml0kWzYwNDUsIC00NDE5LCAtMjI4NiwgNTU4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JTy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSVBPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISE9JUGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg0OUUwMDAxIiBzb3VyY2U9Il9ISEUtVU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISE9JRy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0lRZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISE9JUHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhPSVAtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTc5NSwgLTM5MTEsIDM3NzZdJFs4LCAtMTc2OSwgLTM5MDMsIDI4MDJdJFszMDczLCAtMzk5NiwgLTgzOCwgNTc1XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JUk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSVJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISE9JUnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQUUwODgwMTNGIiBzb3VyY2U9Il9ISEUtWU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISE9JRy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0lTdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISE9JUi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhPSVNPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTgsIC01ODQsIDU1MjgsIDM3ODRdJFstMTYsIC0xNjc2LCA1NTIwLCAyNjkyXSRbLTQzNTEsIC0zNzkzLCAxMTg1LCA1NzVdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lUZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JVHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIT0lULWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA3QjAxQUMiIHNvdXJjZT0iX0hIRS1JT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIRS1jT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JVmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSVUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIT0lVT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISE9JVWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils0ODIsIC03OTUsIC0xMzQ2LCAyMTUwXSRbMTA2NiwgLTE3MzUsIC03NjIsIDEyMTBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lWdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JVi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIT0lXT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA3RDAzNjQiIHNvdXJjZT0iX0hIRS1FT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIRS1jT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JWHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSVhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIT0lXZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISE9JV3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTA1OCwgLTEyMTksIDE4ODgsIDIxODRdJFstMTg5NiwgLTIxOTIsIDEwNDksIDEyMTBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lYLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JWU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIT0lZZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA4QjAwQUEiIHNvdXJjZT0iX0hIRS1NT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIT0lHLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JWk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0ladWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JWi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSVplZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIT0lZdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISE9JWS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOCwgLTE2NDIsIDk4OTcsIDM3OTNdJFstMTYsIC0zODAxLCA5ODg5LCAxNjM0XSRbLTc2MjgsIC01MDYzLCAyMjc3LCAzNzJdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lhT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JYWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIT0lldWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzQjAzMTkiIHNvdXJjZT0iX0hIT0lhdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIT0lhdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JZ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSWZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIT0lndWZYRWR1cUhvT0piVVJaUnciIHg9IjI1IiB5PSItMTY2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhPSWhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0loLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISE9JaU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyODIiIHk9IjM2MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIT0lpLWZYRWR1cUhvT0piVVJaUnciIHg9IjE2MjEiIHk9IjQwOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lrT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIT0lqdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9Ja2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lsT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIT0lrdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSW1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhPSWx1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0ltZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0ltLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSW5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhPSW11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIT0llLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIT0lmT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI1NjUsIDU5MiwgMjU2NSwgNTkyXSRbMzE0OSwgNTkyLCAzMTQ5LCA1OTJdJFszMTQ5LCAxODg4LCAzMTQ5LCAxODg4XSRbMTE5MywgMTg4OCwgMTE5MywgMTg4OF0kWzExOTMsIDExMDksIDExOTMsIDExMDldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISE9JbmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTU2MjQwMTdFIiBzb3VyY2U9Il9ISE9JYXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISE9JQy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSW9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9Jb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSW8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0lvZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISE9JbnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISE9Jbi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTc3LCAtMTEwOSwgNzQ0MiwgMTk4OV0kWy0xNzcsIC0zMTQ5LCA3NDQyLCAtNTBdJFstNjIwNiwgLTMxNDksIDE0MTMsIC01MF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSXBPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lwZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhPSXR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFDMDFBMCIgc291cmNlPSJfSEhPSXB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhPSWF1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVBLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISFg1QWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNUJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjQ5IiB5PSIyNzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Qi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1Q09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1RE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVDLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zIiB5PSIzMDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1RGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1RC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1RHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjgwIiB5PSItMjIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNUUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNUVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNUYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNUZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1R3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1Ry1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1R2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1SC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1SGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhPSXQtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhPSXVPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjA5MSwgOTMsIC01NDc3LCAyNDVdJFs1MDAzLCA5MywgLTI1NjUsIDI0NV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIWDVJT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjAwNTgzQjAxRTYiIHNvdXJjZT0iX0hIT0lwdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIT0lDLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1SS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1SnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhYNUpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIWDVJZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIWDVJdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01MCwgLTc3MCwgMCwgMjQ4MF0kWy01MCwgLTI3MjYsIDAsIDUyNF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhYNUotZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIWDVLT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhYNVF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRCIgc291cmNlPSJfSEhPSXB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhYNU11ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVTT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISFg1UnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNVN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA4IiB5PSIyMjkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1VE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVUZWZYRWR1cUhvT0piVVJaUnciIHg9IjgyOCIgeT0iLTI2MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1VU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItOTIiIHk9IjE3OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVVdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Vk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1VS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjIiIHk9Ii0zNTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1VmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Vi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1V09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1VnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Vy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1WE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1V3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVZT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVYdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1WWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1WS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVaT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVZdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISFg1US1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIWDVST2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMDk5LCAwLCA1NDY5LCAwXSRbLTUzMjUsIDAsIDIyNDMsIDBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISFg1WmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDMkIwMUNBIiBzb3VyY2U9Il9ISFg1TXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISE9JQy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1YXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIWDVhZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISFg1WnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISFg1Wi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNSwgLTc3MCwgLTc0OTMsIDI0ODBdJFsyNSwgLTMyNTEsIC03NDkzLCAwXSRbNjEwNCwgLTMyNTEsIC0xNDEzLCAwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISFg1Yk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhYNWJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3Q1Q0RlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0OUVBMDFFMiI+Ci0gICAgICAgICAgICA8Ym9keT4wNjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX1ZQSUdNT3hlRWR1SGplM3BQYWhONEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTAiLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1MjIxMDFEMiIgbmFtZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGQUUwN0QwMzY0IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFERTUzNkEwMEQ4Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDBBIiBuYW1lPSJicmllZk91dGxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3Q1Q0dPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDAwQSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+UHJvdmlkZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhpcyBhcnRpZmFjdC4gRm9yIGV4YW1wbGUsIGRpc2N1c3NlcyB0aGUgY29udGVudHMgZm9yIGtleSBjaGFwdGVycyBvZiBhIGRvY3VtZW50IGFydGlmYWN0IG9yIHRoZSBrZXkgcGFja2FnZXMgYW5kIG1vZHVsZXMgb2YgYSBtb2RlbCBhcnRpZmFjdC48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbmRWa2V5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbmRWa095SEVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9HZmo5ME95SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDAwQiIgbmFtZT0icmVwcmVzZW50YXRpb25PcHRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1Q3pBZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwMEIiPgotICAgICAgICAgICAgICAgIDxib2R5PkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9uc25Za2V5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9uc25Za095SEVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9uaVZiTU95SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ2MTFEQjJGMDIwRCIgbmFtZT0icmVwcmVzZW50YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzJFRXc0ZXlJRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzJFRXc0T3lJRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzE4TFpJT3lJRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDYxMURCNEQwMjQ4IiBuYW1lPSJub3RhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfUEJpbDhleUhFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfUEJpbDhPeUhFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfTzRjVVVPeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1MjVDMDEzNyIgbmFtZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGQUUwN0IwMUFDIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFERTUzNkEwMEQ4Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDE0IiBuYW1lPSJleHRlcm5hbERlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1Q3pDT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwMTQiPgotICAgICAgICAgICAgICAgIDxib2R5PlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzZwcjhBZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzZwcjhBT3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzZiclZNT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDFFIiBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdUN6Qy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDFFIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfZXVsakVleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfZXVsakVPeUdFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfZWt3Um9PeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1MzE5MDM1MCIgbmFtZT0iUm9sZURlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA4NTAzODMiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0Mjc5N0Y3NDAzOTIiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNzgiIG5hbWU9InNraWxscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdUN6RU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDc4Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5MaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfLU9YUndleUlFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLU9YUndPeUlFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLURlM2NPeUlFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwODIiIG5hbWU9ImFzc2lnbm1lbnRBcHByb2FjaGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1Q3pFLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwODIiPgotICAgICAgICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9wdFhJVWV5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9wdFhJVU95SEVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9wbDUxY095SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNEIzNzdEMDI3MiIgbmFtZT0ic3lub255bXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VMODh1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNEIzNzdEMDI3MiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+TGlzdHMgc3lub255bXMsIGkuZS4gb3RoZXIgbmFtZXMgdGhlIFJvbGUgbWlnaHQgYmUgcmVmZXJyZWQgYnkuICBUb29sIHN1cHBvcnQgZm9yIHRoZSBtZXRhLW1vZGVsIG1pZ2h0IHN1cHBvcnQgdGhhdCBhIFJvbGUgbmFtZSBjYW4gYmUgY29uc2lzdGVudGx5IGJlIHJlcGxhY2VkIHdpdGggb25lIG9mIGl0cyBzeW5vbnltcyB0aHJvdWdodCBhIFByb2Nlc3MuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfN3FXdTBleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfN3FXdTBPeUdFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfN2cwWVVPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1MzUxMDAxMyIgbmFtZT0iVGFza0Rlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODQ5RTAwMDEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0Mjc5N0Y3NDAzOTIiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwOEQiIG5hbWU9InB1cnBvc2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VMODktZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA4RCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0JHX3pJZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0JHX3pJT3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0NLZjNnT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDk2IiBuYW1lPSJhbHRlcm5hdGl2ZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VMOC11ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA5NiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0FBemZ3ZXlKRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0FBemZ3T3lKRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX180NklBT3lJRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNTM2QTAwRDgiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkFFMDc1MDNDNyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyNzk3Rjc0MDM5MiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDBCNCIgbmFtZT0icHVycG9zZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdVZ0OHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMEI0Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5EZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2FrbTE4ZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2FrbTE4T3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2FjczNJT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMEJFIiBuYW1lPSJpbXBhY3RPZk5vdEhhdmluZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdVZ0OWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMEJFIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5EZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2JaOGlnZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2JaOGlnT3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2JSbWUwT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMEJGIiBuYW1lPSJyZWFzb25zRm9yTm90TmVlZGluZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdVZ0LU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMEJGIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5EZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9CQUkxMGV5SkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9CQUkxME95SkVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9BMzc4RU95SkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjM2MjAwMDlBIiBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA4ODAxM0YiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0Mjc5N0Y3NDAzOTIiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUJFMjUxODAwRDIiIG5hbWU9ImF0dGFjaG1lbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1VnRfZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJFMjUxODAwRDIiPgotICAgICAgICAgICAgICAgIDxib2R5PlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il83OFZrd2V5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il83OFZrd095SUVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il83MUx6NE95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjM2MzYwMTA5IiBuYW1lPSJQcmFjdGljZURlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA4QjAwQUEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0Mjc5N0Y3NDAzOTIiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZENEYwNjAxMzgiIG5hbWU9ImFkZGl0aW9uYWxJbmZvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1VnVBdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENEYwNjAxMzgiPgotICAgICAgICAgICAgICAgIDxib2R5PkFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dac1VjT3lKRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0daaktnT3lKRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0dTMkZrT3lKRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDRFRjAwMjdGIiBuYW1lPSJwcm9ibGVtIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1ZmU4dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENEVGMDAyN0YiPgotICAgICAgICAgICAgICAgIDxib2R5PkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il80V18xd2V5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il80V18xd095SUVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il80T1czSU95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ0RUY4MDE5MiIgbmFtZT0iYmFja2dyb3VuZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdWZlOWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDRFRjgwMTkyIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5FbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfQ2MtQU1leUpFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfQ2MtQU1PeUpFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfQ1NQVzRPeUpFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZENUQ1MzAxMUQiIG5hbWU9ImdvYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1ZmUtT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENUQ1MzAxMUQiPgotICAgICAgICAgICAgICAgIDxib2R5PkEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzBVVURjZXlJRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzBVVURjT3lJRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzBMWUo0T3lJRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDRGMDEwMjA2IiBuYW1lPSJhcHBsaWNhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdWZlLS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDRGMDEwMjA2Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5EZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il84MHFUNGV5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il84MHFUNE95SUVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il84dHpkOE95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ1RDNFMDMyNSIgbmFtZT0ibGV2ZWxzT2ZBZG9wdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdW9vNE9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDVEM0UwMzI1Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5PdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKTwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RlNEhrZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RlNEhrT3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3VFYkVvT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZFREU0QzAzODQiIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1b280LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFREU0QzAzODQiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGRlZmluaXRpb24gb2YgQ29udGVudCBFbGVtZW50IGV4dGVuZHMgdGhlIENvbnRlbnQgRWxlbWVudCBkZWZpbml0aW9uIHZpYSBwYWNrYWdlIG1lcmdlIHdpdGggcmVmZXJlbmNlcyB0byBpY29ucyB0aGF0IGFyZSB1c2VkIGZvciBwcmVzZW50aW5nIENvbnRlbnQgRWxlbWVudHMgaW4gYSBVTUEtYmFzZWQgbW9kZWxpbmcgZW52aXJvbm1lbnQgYXMgd2VsbCBhcyB3aGVuIHB1Ymxpc2hpbmcgQ29udGVudCBFbGVtZW50cyBpbnRvIGRvY3VtZW50YXRpb24gcHJlc2VudGF0aW9uIChlLmcuIGRvY3VtZW50IG9yIGh0bWwgcGFnZXMpLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTQ5NTM3MDM0MyIgbmFtZT0ic2hhcGVpY29uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTEzRUEyOTAyRkUiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1b281LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUU0OTUzNzAzNDMiPgotICAgICAgICAgICAgICAgIDxib2R5PkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9KWkhyUWV5UEVkdUZLSm92Qkw2NFhRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9KWkhyUU95UEVkdUZLSm92Qkw2NFhRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9KT2lMNE95UEVkdUZLSm92Qkw2NFhRIiB0eXBlPSJfM0FEQzdCNzQwMjJENDExM0VBMjkwMkZFIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTQ5NTNDMDMxOSIgbmFtZT0ibm9kZWljb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxMTNFQTI5MDJGRSI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VvbzZ1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTQ5NTNDMDMxOSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9GajFid2V5UEVkdUZLSm92Qkw2NFhRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9GajFid095UEVkdUZLSm92Qkw2NFhRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9HUmxTa095UEVkdUZLSm92Qkw2NFhRIiB0eXBlPSJfM0FEQzdCNzQwMjJENDExM0VBMjkwMkZFIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTdGNzQwMzkyIiBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDBBQSIgbmFtZT0iZXh0ZXJuYWxJZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdUw4Xy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMEFBIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5BbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgYXJ0aWZhY3QuIFVzZWQgbGlrZSBhIHN5bm9ueW0uPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaG80VWdleUhFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaG80VWdPeUhFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfaGZWLUFPeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTc3RTcxNjAzN0YiIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1b283LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3RTcxNjAzN0YiPgotICAgICAgICAgICAgICAgIDxib2R5PktleSBDb25zaWRlcmF0aW9ucyBwcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il8xTU10c2V5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8xTU10c095SUVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8xRFotRU95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFMjgwMDI1RCIgbmFtZT0iV29ya1Byb2R1Y3RTdGF0ZXMiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3ZGVS1PZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDJEREU5RkUwMDNBIj4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREU5RkUwMDNBIiB0eXBlPSJDbGFzcyIgbmFtZT0iTWV0aG9kTGluayI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxQU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhocUJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxQ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxQy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocURPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxRGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocUQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhocUFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISGhxQXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTAyIiB5PSI1Mzg5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxRU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVBMDUwMDA4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhocUZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxR2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxRy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxSGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocUgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhocUVlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISGhxRXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNDIwIiB5PSIzMzgyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxUS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhocVItZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxVE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxVHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxVU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocVV1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhocVJPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISGhxUmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MTk3IiB5PSIxMTgwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxVS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVBQzMwMUE1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhocVYtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE4NzkiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxVy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFYT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxWGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFYdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxWC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFZT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxWWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxWXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISGhxVk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIaHFWZWZYRWR1cUhvT0piVVJaUnciIHg9IjUyMDciIHk9IjMzNjEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdkZVLXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIaHFJT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMTAyRDUiIHNvdXJjZT0iX0hIaHFFT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIaHFBT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxSnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhocUpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFKLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMThDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISGhxS09mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxS3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxOEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISGhxSy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMTgyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIaHFMdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zMTQiIHk9Ii0zOTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxTU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocU11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhocU1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxOEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFOdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIaHFOT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxODIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFPdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIaHFPT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocVB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhocVBPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxODIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocVF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhocVFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIaHFJZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISGhxSXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszNDcsIDQ0OCwgLTEyNzgsIC0xNjM0XSRbMTIxMCwgMTU1NywgLTQxNCwgLTUyNF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIaHFZLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAwM0MiIHNvdXJjZT0iX0hIaHFVLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIaHFRLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxYWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhocVotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFhdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISGhxYS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxYmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAyNDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISGhxYnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjNCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIaHFjZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zMDQiIHk9IjUxOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFjLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjNCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISGhxZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDI0NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocWVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhocWQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDIzQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocWZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhocWUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxZ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISGhxZi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDIzQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxaGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISGhxZy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhocVpPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIaHFaZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zNDcsIC00NTcsIDEyMjcsIDE2NzZdJFstMTIwMiwgLTE2MTcsIDM3MiwgNTE2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVDM0YwMDM5IiB0eXBlPSJDbGFzcyIgbmFtZT0iU3RhdGVNYWNoaW5lIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcXo4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUM4MTAzMjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHF6OC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISHF6OU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjM3MCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHF6OWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcXo5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxejktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcXotT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxei1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcXotdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxei0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcXpfT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxel9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcXpfdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcXpfLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIcXo4ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhxejh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTY4NSIgeT0iMTMyNjciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBBT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUREQzAzMTgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISHEwQk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzE2NiIgaGVpZ2h0PSI0NTg4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMENPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkVudW1lcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcTBDdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwQy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxMERPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBEZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxMER1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhxMEFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISHEwQXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMTI1IiB5PSI2NzQ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwRC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhxMEUtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHEwR09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHEwR3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHEwSE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxMEh1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhxMEVPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISHEwRWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDgzMyIgeT0iMjM2NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEgtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQUMzMDFBNSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIcTBJLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBKLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxMEtPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBLZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxMEt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBLLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxMExPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBMZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcTBMdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIcTBJT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhxMEllZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ2MjMiIHk9IjEwNjQ4IiB3aWR0aD0iMjM3MyIgaGVpZ2h0PSIxNTc0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwVXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDN0MwMTA5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhxMFZ1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHEwVy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwazhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBrOGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwazh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBrOC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwazlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwazllZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhxMFUtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISHEwVk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4ODMxIiB5PSIxMDQ5MCIgd2lkdGg9IjE3NjkiIGhlaWdodD0iMTU3NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIMGxTZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxUZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbFR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxULWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbFVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxVZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbFV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxVLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxWT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIMGxSdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEgwbFItZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUwNyIgeT0iMTMxOTkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxWZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUM0RTAwQjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISDBsV2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsWGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxYdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsWC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxZT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsWWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxZdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsWS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsWk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISDBsVnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIMGxWLWZYRWR1cUhvT0piVVJaUnciIHg9IjExMjI2IiB5PSI1MDQ2IiB3aWR0aD0iMzA5NSIgaGVpZ2h0PSIxOTA1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsYnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxQzQwMzMzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEgwbGN1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsZC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsZWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsZS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbGZlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEgwbGItZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISDBsY09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTY3NSIgeT0iODMzMSIgd2lkdGg9IjE4MjciIGhlaWdodD0iMTIxOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkktZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQTA1MDAwOCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIOXZKLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMDE1IiBoZWlnaHQ9Ijg5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dktlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2S3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkstZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2TE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkxlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2THVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkwtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2TU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dk1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dk11ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEg5dkpPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISDl2SmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3MTIwIiB5PSIxMzI2NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d2UEYwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhxMEwtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDAzQyIgc291cmNlPSJfSEhxMEgtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhxMEQtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxME5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBOZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISHEwTS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxME51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDI0NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxME9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhxME4tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM5NiIgeT0iMzQzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxME9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAyNDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISHEwT3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItOTg0IiB5PSI5NzUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAyM0IiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBQdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhxMFBlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjgwIiB5PSItMzA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDIzQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhxMFFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE4IiB5PSIyMjciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHEwUmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISHEwUS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjNCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHEwU2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISHEwUi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAyNDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcTBUZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIcTBTLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjNCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcTBVZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIcTBULWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISHEwTU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIcTBNZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzY3NywgLTc5NSwgMzYyMywgNzI4MV0kWzY3NywgLTgyMjEsIDM2MjMsIC0xNDNdJFstMTEwMCwgLTgyMjEsIDE4NDUsIC0xNDNdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISDBrOXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRTEwMzhDIiBzb3VyY2U9Il9ISHF6OE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISHEwVXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgway1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBrLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwa19PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIMGstdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISDBrOS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEgway1PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIwMywgLTQ1NywgODYzLCAxOTgxXSRbLTcyOCwgLTE2NTEsIDMzOCwgNzg3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISDBrX2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEgwa191ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISDBrXy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOEIwMTlCIiBzb3VyY2U9Il9ISHEwVXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISHEwSC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIMGxBLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOEMwMTREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsQi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDQ1IiB5PSItMjA0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbENlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUY4QzAxNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxDLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsQ3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxODIiIHk9IjIxMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRjhDMDE0MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbER1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsRGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MDMiIHk9Ii0xNzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsRC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOEMwMTQzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsRWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsRU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTU2IiB5PSIyMTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOEMwMTREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsRk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsRmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsRS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOEMwMTQzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsR2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsRi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUY4QzAxNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxIZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxHLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOEMwMTQzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxJZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxILWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISDBsQU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIMGxBZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzc4NywgLTU1OCwgLTQ5MDIsIC01NThdJFs0NzY2LCAtNTU4LCAtOTIyLCAtNTU4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEgwbEl1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRjk0MDNCQiIgc291cmNlPSJfSEhxMFV1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhxMEgtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxLT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISDBsSnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRjk1MDM1QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbEt1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM5NCIgeT0iMjQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbExPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUY5NTAzNUEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsTGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MCIgeT0iLTIyOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRjk1MDM1OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbE1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsTU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNjkiIHk9IjI3MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUY5NTAzNTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxNLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMTUiIHk9Ii0yMjgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOTUwMzVBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsT09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsTnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbE9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOTUwMzU4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsUE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsT3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUY5NTAzNUEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxRT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxQdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsUWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOTUwMzU4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxST2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxRdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISDBsSS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIMGxKT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzc5NCwgNTU1LCAtNDg5NSwgNTU1XSRbNDc2MywgNTU1LCAtOTI2LCA1NTVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISDBsWmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDNjgwMDkyIiBzb3VyY2U9Il9ISDBsVmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISHEwRC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIMGxhZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISDBsWnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIMGxaLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC05NDgsIC01MCwgMTg0NV0kWzAsIC0yMjg2LCAtNTAsIDUwOF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEgwbGJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIMGxiZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEgwbGZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUYxMDA3OCIgc291cmNlPSJfSEgwbGJ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhxMEgtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxoT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISDBsZ3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUYxMDJGQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbGh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjE4IiB5PSIyOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUYxMDJGQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxpZWZYRWR1cUhvT0piVVJaUnciIHg9IjY1OCIgeT0iLTI5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUYxMDJGOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsak9mWEVkdXFIb09KYlVSWlJ3IiB4PSI2MiIgeT0iLTE1MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUVGMTAyRjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxqLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwMDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsa2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRjEwMkZBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsbE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsa3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRjEwMkY4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsbC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsbU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsbHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbG1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUVGMTAyRkEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxuT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxtdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRjEwMkY4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxvT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxudWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISDBsZi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIMGxnT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzgyMSwgNTksIC0yMTc1LCAtMjI3N10kWzI4NTMsIDU5LCAtMTQzLCAtMjI3N10kWzI4NTMsIDE1NDksIC0xNDMsIC03ODddIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISDBsb2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRUUwMTY0IiBzb3VyY2U9Il9ISDBsYnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISHEwVXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dTRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1NHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dTQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIOXU0ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1NU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRUUwMzk2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1NXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl1NWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjUiIHk9Ii0zMDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1NS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUVFMDM5NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dTZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXU2T2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc4NSIgeT0iMjE5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dTZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRUUwMzk0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1N09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXU2LWZYRWR1cUhvT0piVVJaUnciIHg9IjIwMCIgeT0iMTM1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dTdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUVFMDM5NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dTctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dTd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMyIiB5PSItNzE0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dThPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUVFMDM5NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dTh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dTgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dThlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXU5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUVFMDM5NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dTl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dTktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dTllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXUtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRUUwMzk2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1LXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl1LS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl1LWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dV9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUVFMDM5NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dV91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl1Xy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl1X2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEgwbG91ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISDBsby1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTI2LCAyMTIsIDE4NzksIC0yMTQzXSRbLTMwNjksIDIxMiwgLTI2NCwgLTIxNDNdJFstMzA2OSwgMTU2MSwgLTI2NCwgLTc5NF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIOXZBT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjFGRDAxMDAiIHNvdXJjZT0iX0hIMGxWZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIMGxidWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2QS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2QnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEg5dkJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjFGRTAwRTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZDT2ZYRWR1cUhvT0piVVJaUnciIHg9IjM3NiIgeT0iMzgxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjFGRTAwRTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2Qy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjQiIHk9Ii0xMTM3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxRkUwMEU1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2RC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZEdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMCIgeT0iMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMUZFMDBFNSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dkVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTUzIiB5PSItNzY3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMUZFMDBFNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dkZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dkZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMUZFMDBFNSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dkd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dkdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxRkUwMEU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2SGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2SHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2SE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMUZFMDBFNSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2SXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2SU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEg5dkFlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISDl2QXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMTIsIDk1MywgMTA2LCAtMTk4NF0kWzIxMiwgMjMyOCwgMTA2LCAtNjA5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEg5dk0tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRURGMDExMiIgc291cmNlPSJfSEg5dkktZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhxMFV1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dk9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZPZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISDl2Ti1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEg5dk5PZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIOXZOZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzMwNCwgLTQ1NywgLTEzNzEsIDE5ODFdJFsxMTE3LCAtMTY1MSwgLTU1OCwgNzg3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISDl2T3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEg5dk8tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISDl2UE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjEwMkQ1IiBzb3VyY2U9Il9ISDl2SS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISDBsUmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2UWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIOXZRT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2US1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMThDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2UmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2Uk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2UnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZSLWZYRWR1cUhvT0piVVJaUnciIHg9IjgzIiB5PSItMjg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMTgyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2Uy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZTdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMzUiIHk9Ii0yOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2VE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMTgyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2VHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2VGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzExIiB5PSI1OTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2VC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMThDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2VWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2VXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2VU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMTgyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2VmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2VnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2Vk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxOEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXZXdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZXT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2Vy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMTgyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2WGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXZYdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZYT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISDl2UGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEg5dlB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEwMTYsIDAsIDM3NTksIDBdJFstMjkyOSwgMCwgMTg0NSwgMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIOXZYLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjEzOTAxODYiIHNvdXJjZT0iX0hIOXZJLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIMGxWZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2WXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZaT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2WmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEg5dlktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjEzQTAzNjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZaLWZYRWR1cUhvT0piVVJaUnciIHg9Ii05MzMiIHk9Ii0yODMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2YWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMTNBMDM2MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZhdWZYRWR1cUhvT0piVVJaUnciIHg9Ii00MjMiIHk9Ii0xNjQxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxM0EwMzVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2YnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZiZWZYRWR1cUhvT0piVVJaUnciIHg9IjExMzYiIHk9IjMzMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjEzQTAzNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZjT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQzMyIgeT0iLTI0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjEzQTAzNjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXZkZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZjLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2ZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjEzQTAzNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXZlZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZkLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2ZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMTNBMDM2MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dmZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dmUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjEzQTAzNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dmdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dmYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIOXZZT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEg5dlllZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTQ3NiwgLTMxOCwgLTUzNzEsIDcyNzZdJFstNDc2LCAtODQ2NywgLTUzNzEsIC04NzNdJFszMzM0LCAtODQ2NywgLTE1NjEsIC04NzNdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISDl2Z3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYwRDgwMTQwIiBzb3VyY2U9Il9ISDl2SS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISDBsYnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2aC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIOXZodWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2aWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYwRDkwM0Q2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2aS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2aXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2ak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMEQ5MDNENiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZqZWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NDkiIHk9IjQ3NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMEQ5MDNDQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2a09mWEVkdXFIb09KYlVSWlJ3IiB4PSI3ODgiIHk9IjI1MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjBEOTAzQ0MiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZrLWZYRWR1cUhvT0piVVJaUnciIHg9Ii04IiB5PSItMjQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMEQ5MDNENiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dm1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dmx1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMEQ5MDNDQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dm0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dm5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dm11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYwRDkwM0Q2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISUhmNGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2bnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMEQ5MDNDQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISUhmNWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISUhmNC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEg5dmctZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISDl2aE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTU5LCAtMzE4LCAtNDg2OSwgNDMzOV0kWy0xNTksIC01NjA5LCAtNDg2OSwgLTk1Ml0kWzQyNjAsIC01NjA5LCAtNDUwLCAtOTUyXSRbNDI2MCwgLTUyNjYsIC00NTAsIC02MDldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il9DblE1a094bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJDbGFzcyIgbmFtZT0iVGF4b25vbXkiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRTcwOU1PeG1FZHV3T2JrSUE2eDFnQSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0U3MDlNLXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0U3MDlOT3htRWR1d09ia0lBNngxZ0EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9FNzA5TmV4bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0U3MDlOdXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRTcwOU4teG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0U3MDlPT3htRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRTcwOU9leG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0U3MDlPdXhtRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRTcwOU8teG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0U3MDlQT3htRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRTcwOVBleG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0U3MDlQdXhtRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0U3MDlQLXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0U3MDlNZXhtRWR1d09ia0lBNngxZ0EiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRTcwOU11eG1FZHV3T2JrSUE2eDFnQSIgeD0iODQxMiIgeT0iNzE0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQUZQZ094bUVkdXdPYmtJQTZ4MWdBIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDNEUwMEIzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0FGUGcteG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR0FGUGhPeG1FZHV3T2JrSUE2eDFnQSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dBRlBoZXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0FGUGh1eG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQUZQaC14bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0FGUGlPeG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HQUZQaWV4bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0FGUGl1eG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HQUZQaS14bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0FGUGpPeG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HQUZQamV4bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0FGUGp1eG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR0FGUGoteG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR0FGUGdleG1FZHV3T2JrSUE2eDFnQSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HQUZQZ3V4bUVkdXdPYmtJQTZ4MWdBIiB4PSI0NTc2IiB5PSI1NzQxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JdGh0TU94bUVkdXdPYmtJQTZ4MWdBIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSXRodE0teG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSXRodE5PeG1FZHV3T2JrSUE2eDFnQSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0l0aHROZXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSXRodE51eG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JdGh0Ti14bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSXRodE9PeG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9JdGh0T2V4bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSXRodE91eG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9JdGh0Ty14bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSXRodFBPeG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9JdGh0UGV4bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSXRodFB1eG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSXRodFAteG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSXRodE1leG1FZHV3T2JrSUE2eDFnQSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JdGh0TXV4bUVkdXdPYmtJQTZ4MWdBIiB4PSI0NDY5IiB5PSIzMzg1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MZVFJWU94bUVkdXdPYmtJQTZ4MWdBIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxQzQwMzMzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTGVRSVkteG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfTGVRSVpPeG1FZHV3T2JrSUE2eDFnQSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xlUUlaZXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTGVRSVp1eG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MZVFJWi14bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTGVRSWFPeG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9MZVFJYWV4bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTGVRSWF1eG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9MZVFJYS14bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTGVRSWJPeG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9MZVFJYmV4bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTGVRSWJ1eG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfTGVRSWIteG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfTGVRSVlleG1FZHV3T2JrSUE2eDFnQSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9MZVFJWXV4bUVkdXdPYmtJQTZ4MWdBIiB4PSIxMDg3MiIgeT0iMzM4NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUnF4OEVPeG1FZHV3T2JrSUE2eDFnQSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQUMzMDFBNSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxeDhFLXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX1JxeDhGT3htRWR1d09ia0lBNngxZ0EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ScXg4RmV4bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxeDhGdXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUnF4OEYteG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxeDhHT3htRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfUnF4OEdleG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxeDhHdXhtRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfUnF4OEcteG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxeDhIT3htRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfUnF4OEhleG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxeDhIdXhtRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1JxeDhILXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX1JxeDhFZXhtRWR1d09ia0lBNngxZ0EiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfUnF4OEV1eG1FZHV3T2JrSUE2eDFnQSIgeD0iODA5NiIgeT0iMzM2MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVFFzeEFPeG1FZHV3T2JrSUE2eDFnQSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzdDMDEwOSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1RRc3hBLXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX1RRc3hCT3htRWR1d09ia0lBNngxZ0EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9UUXN4QmV4bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1RRc3hCdXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVFFzeEIteG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1RRc3hDT3htRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfVFFzeENleG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1RRc3hDdXhtRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfVFFzeEMteG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1RRc3hET3htRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfVFFzeERleG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1RRc3hEdXhtRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1RRc3hELXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX1RRc3hBZXhtRWR1d09ia0lBNngxZ0EiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfVFFzeEF1eG1FZHV3T2JrSUE2eDFnQSIgeD0iMTMxNDgiIHk9IjMzODUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9DblE1a2V4bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0l0aHRRT3htRWR1d09ia0lBNngxZ0EiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJGMzAyNkUiIHNvdXJjZT0iX0l0aHRNT3htRWR1d09ia0lBNngxZ0EiIHRhcmdldD0iX0U3MDlNT3htRWR1d09ia0lBNngxZ0EiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JdGh0US14bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0l0cmVNT3htRWR1d09ia0lBNngxZ0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JdHJlTWV4bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JdGh0Uk94bUVkdXdPYmtJQTZ4MWdBIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSXRodFFleG1FZHV3T2JrSUE2eDFnQSIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0l0aHRRdXhtRWR1d09ia0lBNngxZ0EiIHBvaW50cz0iWzI5MSwgLTMxOCwgLTE1MzUsIDE2MTRdJFsxMzc2LCAtMTQ1NiwgLTQ1MCwgNDc2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSXRyZU11eG1FZHV3T2JrSUE2eDFnQSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzY4MDA5MiIgc291cmNlPSJfR0FGUGdPeG1FZHV3T2JrSUE2eDFnQSIgdGFyZ2V0PSJfSXRodE1PeG1FZHV3T2JrSUE2eDFnQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0l0cmVOZXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSXRyZU4teG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0l0cmVPT3htRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0l0cmVOdXhtRWR1d09ia0lBNngxZ0EiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9JdHJlTS14bUVkdXdPYmtJQTZ4MWdBIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0l0cmVOT3htRWR1d09ia0lBNngxZ0EiIHBvaW50cz0iWzUzLCAtMzQzLCA1MywgMjAzOF0kWzUzLCAtMjA2MywgNTMsIDMxOF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX09PUGp3ZXhtRWR1d09ia0lBNngxZ0EiIGVsZW1lbnQ9Il9PT1Bqd094bUVkdXdPYmtJQTZ4MWdBIiBzb3VyY2U9Il9MZVFJWU94bUVkdXdPYmtJQTZ4MWdBIiB0YXJnZXQ9Il9FNzA5TU94bUVkdXdPYmtJQTZ4MWdBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfT09QanhPeG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9PT1BqeHV4bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfT09QangteG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfT09QanhleG1FZHV3T2JrSUE2eDFnQSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX09PUGp3dXhtRWR1d09ia0lBNngxZ0EiIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9PT1Bqdy14bUVkdXdPYmtJQTZ4MWdBIiBwb2ludHM9IlstNDIzLCAtMzQ0LCAyNTQwLCAyMDExXSRbLTIzNTUsIC0xODc5LCA2MDgsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX1dFSFQwZXhtRWR1d09ia0lBNngxZ0EiIGVsZW1lbnQ9Il9XRUhUME94bUVkdXdPYmtJQTZ4MWdBIiBzb3VyY2U9Il9ScXg4RU94bUVkdXdPYmtJQTZ4MWdBIiB0YXJnZXQ9Il9FNzA5TU94bUVkdXdPYmtJQTZ4MWdBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfV0VIVDFPeG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9XRUhUMXV4bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfV0VIVDEteG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfV0VIVDFleG1FZHV3T2JrSUE2eDFnQSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX1dFSFQwdXhtRWR1d09ia0lBNngxZ0EiIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9XRUhUMC14bUVkdXdPYmtJQTZ4MWdBIiBwb2ludHM9IlstNzksIC0zMTcsIDEwODUsIDM4OTBdJFstMTAzMiwgLTM3MzEsIDEzMiwgNDc2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfV2VWeHNleG1FZHV3T2JrSUE2eDFnQSIgZWxlbWVudD0iX1dlVnhzT3htRWR1d09ia0lBNngxZ0EiIHNvdXJjZT0iX1RRc3hBT3htRWR1d09ia0lBNngxZ0EiIHRhcmdldD0iX0U3MDlNT3htRWR1d09ia0lBNngxZ0EiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9XZVZ4dE94bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1dlVnh0dXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9XZVZ4dC14bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9XZVZ4dGV4bUVkdXdPYmtJQTZ4MWdBIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfV2VWeHN1eG1FZHV3T2JrSUE2eDFnQSIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1dlVnhzLXhtRWR1d09ia0lBNngxZ0EiIHBvaW50cz0iWy0zNDQsIC0zNDQsIDM5OTUsIDM5NjldJFstMzg2MywgLTM4MzcsIDQ3NiwgNDc2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9Il9VUnpsc09vV0VkdU9CUFFBMmhLcVVRIiBpbXBvcnRlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTQiLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFQTA1MDAwOCIgbmFtZT0iU3RhdGUiPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRURGMDExMiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyRERFQzdDMDEwOSIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4MiIgbmFtZT0id29ya1Byb2R1Y3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERUMyMTAyRDUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdXlaX2VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdXlaX09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERjBEOTAzQ0MiIG5hbWU9InJlZ2lvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREYxQzQwMzMzIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERGMEQ4MDE0MCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2RlU2T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2RlU1LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREYxM0EwMzVFIiBuYW1lPSJzdWJtYWNoaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MkRERUM0RTAwQjMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJEREYxMzkwMTg2Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZGVTdlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZGVTdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFQUMzMDFBNSIgbmFtZT0iVHJhbnNpdGlvbiI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfV0VIVDBPeG1FZHV3T2JrSUE2eDFnQSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDIzQiIgbmFtZT0id29ya0RlZmluaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAwM0MiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdTdqMHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdTdqMGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUVGMTAyRkEiIG5hbWU9ImNvbnRhaW5lciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREYxQzQwMzMzIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERFRUYxMDA3OCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2RlUxdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2RlUxZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRjhDMDE0RCIgbmFtZT0ic291cmNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MkRERUM3QzAxMDkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJEREVGOEIwMTlCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZGVTNlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZGVTNPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVGOTUwMzVBIiBuYW1lPSJ0YXJnZXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyRERFQzdDMDEwOSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERUY5NDAzQkIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdkZVNU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdkZVNC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFQzRFMDBCMyIgbmFtZT0iU3RhdGVNYWNoaW5lIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUM2ODAwOTIiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERjFGRTAwRTUiIG5hbWU9InJlZ2lvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREYxQzQwMzMzIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERGMUZEMDEwMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2RlU5T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2RlU4LWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVDN0MwMTA5IiBuYW1lPSJWZXJ0ZXgiPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX1dlVnhzT3htRWR1d09ia0lBNngxZ0EiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUVFRTAzOTYiIG5hbWU9ImNvbnRhaW5lciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREYxQzQwMzMzIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERFRUVFMDE2NCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d1N2oydWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d1N2oyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVGOEMwMTQzIiBuYW1lPSJvdXRnb2luZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREVBQzMwMUE1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERFRjhCMDE5QiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2RlUydWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2RlUyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVGOTUwMzU4IiBuYW1lPSJpbmNvbWluZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREVBQzMwMUE1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERFRjk0MDNCQiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2RlU0ZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2RlU0T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUM4MTAzMjMiIG5hbWU9IlBzZXVkb1N0YXRlIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUVFMTAzOEMiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MkRERUM3QzAxMDkiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRERDMDMxOCIgbmFtZT0iUHNldWRvU3RhdGVLaW5kIj4KLSAgICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVERjYwMkVFIiBuYW1lPSJpbml0aWFsIi8+Ci0gICAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRTM0MDI4OSIgbmFtZT0iam9pbiIvPgotICAgICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUUzOTAyQ0MiIG5hbWU9ImZvcmsiLz4KLSAgICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVFM0UwMTFBIiBuYW1lPSJqdW5jdGlvbiIvPgotICAgICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUU0NDAxRUIiIG5hbWU9ImNob2ljZSIvPgotICAgICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUU0OTAxM0UiIG5hbWU9ImVudHJ5UG9pbnQiLz4KLSAgICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVFNTAwMjkzIiBuYW1lPSJleGl0UG9pbnQiLz4KLSAgICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVFNTYwMDg5IiBuYW1lPSJ0ZXJtaW5hdGUiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERGMUM0MDMzMyIgbmFtZT0iUmVnaW9uIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9PT1Bqd094bUVkdXdPYmtJQTZ4MWdBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVFRUUwMzk0IiBuYW1lPSJ2ZXJ0ZXgiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyRERFQzdDMDEwOSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERUVFRTAxNjQiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdTdqMS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdTdqMXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRUYxMDJGOCIgbmFtZT0idHJhbnNpdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREVBQzMwMUE1IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERFRUYxMDA3OCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2RlUwLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2RlUwdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREYwRDkwM0Q2IiBuYW1lPSJzdGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREVBMDUwMDA4IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERGMEQ4MDE0MCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERGMUZFMDBFNyIgbmFtZT0ic3RhdGVNYWNoaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MkRERUM0RTAwQjMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJEREYxRkQwMTAwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZGVTktZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZGVTl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFQzIxMDJENSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMTgyIF8zQURDN0I3NDAyMkQ0MkRERUMyMjAxOEMiPgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4QyIgbmFtZT0ic3RhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyRERFQTA1MDAwOCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERUMyMTAyRDUiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDAzQyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjNCIF8zQURDN0I3NDAyMkQ0MkRERUMyNTAyNDUiPgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDI0NSIgbmFtZT0idHJhbnNpdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREVBQzMwMUE1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDAzQyIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVFRUUwMTY0IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MkRERUVFRTAzOTQgXzNBREM3Qjc0MDIyRDQyRERFRUVFMDM5NiIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVFRjEwMDc4IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MkRERUVGMTAyRjggXzNBREM3Qjc0MDIyRDQyRERFRUYxMDJGQSIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVGOEIwMTlCIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MkRERUY4QzAxNDMgXzNBREM3Qjc0MDIyRDQyRERFRjhDMDE0RCIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVGOTQwM0JCIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MkRERUY5NTAzNTggXzNBREM3Qjc0MDIyRDQyRERFRjk1MDM1QSIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREYwRDgwMTQwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MkRERjBEOTAzQ0MgXzNBREM3Qjc0MDIyRDQyRERGMEQ5MDNENiIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREYxMzkwMTg2IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MkRERjEzQTAzNUUgXzNBREM3Qjc0MDIyRDQyRERGMTNBMDM2MCI+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREYxM0EwMzYwIiBuYW1lPSJzdWJNYWNoaW5lU3RhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyRERFQTA1MDAwOCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERjEzOTAxODYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdkZVOE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdkZVNy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREYxRkQwMTAwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MkRERjFGRTAwRTUgXzNBREM3Qjc0MDIyRDQyRERGMUZFMDBFNyIvPgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDAzQiIgbmFtZT0iTWV0aG9kTGlicmFyeSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3diWXB1ZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDFGRkRBMjUwMEZEIj4KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkZEQTI1MDBGRCIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFprT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFRERCNjAzMDYiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWmstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLRFpsT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWm1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RabWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEtEWmtlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtEWmt1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDM4MSIgeT0iNDc0OSIgd2lkdGg9IjQyODQiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RabXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRURCMzgwMTFFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IS0RabnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Rabi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Rab09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Rab2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWm8tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLRFptLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLRFpuT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQzODEiIHk9IjE0NTEiIHdpZHRoPSI0Mjg0IiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLV9UNmNPeHdFZHVNMTR1bldhcVA1USIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTFFOTk2MDA5RCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tX1Q2Yy14d0VkdU0xNHVuV2FxUDVRIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfLV9UNmRPeHdFZHVNMTR1bldhcVA1USIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLV9UNmRleHdFZHVNMTR1bldhcVA1USIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLV9UNmR1eHdFZHVNMTR1bldhcVA1USIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLV9UNmQteHdFZHVNMTR1bldhcVA1USIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tX1Q2ZU94d0VkdU0xNHVuV2FxUDVRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXy1fVDZlZXh3RWR1TTE0dW5XYXFQNVEiIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il8tX1Q2Y2V4d0VkdU0xNHVuV2FxUDVRIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il8tX1Q2Y3V4d0VkdU0xNHVuV2FxUDVRIiB4PSIxNDUzIiB5PSI4MDQxIiB3aWR0aD0iNDI4NCIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xBcXpnT3h4RWR1TTE0dW5XYXFQNVEiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRkIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTEFxemcteHhFZHVNMTR1bldhcVA1USIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0xBcXpoT3h4RWR1TTE0dW5XYXFQNVEiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xBcXpoZXh4RWR1TTE0dW5XYXFQNVEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xBcXpodXh4RWR1TTE0dW5XYXFQNVEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xBcXpoLXh4RWR1TTE0dW5XYXFQNVEiIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTEFxemlPeHhFZHVNMTR1bldhcVA1USIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9MQXF6aWV4eEVkdU0xNHVuV2FxUDVRIiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfTEFxemdleHhFZHVNMTR1bldhcVA1USIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfTEFxemd1eHhFZHVNMTR1bldhcVA1USIgeD0iNzM1NCIgeT0iODA0MCIgd2lkdGg9IjQyODQiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3diWXFPZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBNZXRob2QgTGlicmFyeSBwYWNrYWdlIGRlZmluZXMgY2FwYWJpbGl0aWVzIGFyb3VuZCBtYW5hZ2luZyB3aG9sZSBsaWJyYXJpZXMgb2YgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4gIEl0IGFkZHJlc3NlcyByZXF1aXJlbWVudHMgYXJvdW5kIHBoeXNpY2FsbHkgc2VwYXJhdGluZyBkZXNjcmlwdGlvbnMgb2YgQ29udGVudCBFbGVtZW50cyBmcm9tIHRoZWlyIG1vZGVsZWQgcmVsYXRpb25zaGlwcyBkZWZpbmluZyBzZXBhcmF0ZSB1bml0cyBvZiBjb250cm9sLiAgSXQgYWxzbyBhZGRyZXNzZXMgdGhlIGNvbmNlcm4gb2Ygc2NhbGluZyB0byBsYXJnZSBNZXRob2QgTGlicmFyaWVzIGJ5IGRlZmluaW5nIE1ldGhvZCBDb25maWd1cmF0aW9ucyB0aGF0IGRlZmluZSB2aXNpYmlsaXR5IHNwYWNlcyBvciB3b3JraW5nIHNldHMgZm9yIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGFsbG93aW5nIGEgUHJvY2VzcyBFbmdpbmVlciB0byBmb2N1cyBvbiByZWxldmFudCBwYXJ0cyBvZiBMaWJyYXJ5IGluc3RlYWQgb2Ygc2VlaW5nIHRoZSB3aG9sZSBsaWJyYXJ5IGFsbCBhdCBvbmNlLiAgQnkgZGVmaW5pbmcgQ29uZmlndXJhdGlvbnMgYXMgc3Vic2V0cyBvZiBQbHVnaW5zIGFuZCBNZXRob2QgUGFja2FnZXMgdGhhdCBzaGFsbCBiZSBjb25zaWRlcmVkIGZvciBwcm9jZXNzIGF1dGhvcmluZyBvbmx5LCBDb25maWd1cmF0aW9ucyBhbHNvIGRlZmluZSB0aGUgc3BhY2Ugb2YgdmFyaWFiaWxpdHkgaW50ZXJwcmV0YXRpb24gdG8gYXZvaWQgY29uZmxpY3RzIGFtb25nc3QgJ2NvbXBldGluZycgY29udGVudCAoZS5nLiBjb250ZW50IHRoYXQgcmVwbGFjZXMgdGhlIHNhbWUgZWxlbWVudHMpLiIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0FfX19vZXhNRWR1T05yTVJnbXo0OEEiIGVsZW1lbnQ9Il9BX19fb094TUVkdU9Ock1SZ216NDhBIiBzb3VyY2U9Il9IS0RabXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IS0Raa09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0FfX19wT3hNRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0FfX19wdXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQV9fX3FPeE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9BX19fcC14TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfQV9fX3BleE1FZHVPTnJNUmdtejQ4QSIgeT0iLTUzMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfQV9fX291eE1FZHVPTnJNUmdtejQ4QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9BX19fby14TUVkdU9Ock1SZ216NDhBIiBwb2ludHM9IlstMTQsIDg2MCwgLTE0LCAtMjQzNV0kWy0xNCwgMjQ0OCwgLTE0LCAtODQ3XSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9MQXF6a2V4eEVkdU0xNHVuV2FxUDVRIiBlbGVtZW50PSJfR05rQjhPeFNFZHVPTnJNUmdtejQ4QSIgc291cmNlPSJfSEtEWmtPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfTEFxemdPeHhFZHVNMTR1bldhcVA1USI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MQXF6bE94eEVkdU0xNHVuV2FxUDVRIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MQXF6bHV4eEVkdU0xNHVuV2FxUDVRIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xBcXptT3h4RWR1TTE0dW5XYXFQNVEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTEFxemwteHhFZHVNMTR1bldhcVA1USIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0xBcXpsZXh4RWR1TTE0dW5XYXFQNVEiIHg9IjQyNCIgeT0iLTY0NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfTEFxemt1eHhFZHVNMTR1bldhcVA1USIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9MQXF6ay14eEVkdU0xNHVuV2FxUDVRIiBwb2ludHM9IlstMTQsIDg0NiwgLTI5NzcsIC0yNDQ3XSRbMjk1MCwgMjQzMywgLTEzLCAtODYwXSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9SY3FmTWV4MEVkdTUtdlZqbGZWc2ZRIiBlbGVtZW50PSJfUmNxZk1PeDBFZHU1LXZWamxmVnNmUSIgc291cmNlPSJfSEtEWmtPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfLV9UNmNPeHdFZHVNMTR1bldhcVA1USI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9SY3pwSU94MEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9SY3pwSXV4MEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JjenBKT3gwRWR1NS12VmpsZlZzZlEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUmN6cEkteDBFZHU1LXZWamxmVnNmUSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1JjenBJZXgwRWR1NS12VmpsZlZzZlEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX1JjcWZNdXgwRWR1NS12VmpsZlZzZlEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfUmNxZk0teDBFZHU1LXZWamxmVnNmUSIgcG9pbnRzPSJbLTIzLCAzMiwgODgsIC05Ml0kWy04NywgMTU3LCAyNCwgMzNdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZERDU1MTAzN0MiIHR5cGU9IkNsYXNzIiBuYW1lPSJUYXhvbm9teSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Rac09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEtEWnNlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMxMTUiIGhlaWdodD0iMTExNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RadGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RadHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RadC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RadU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RadWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RadXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RadS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWnZPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IS0RacnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS0Raci1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjkyMCIgeT0iMTAxNiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RadmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRUQ4ODEwMUI1Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IS0Rad2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjQ3MiIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Rad3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Rady1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFp4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFp5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFp5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0Raek9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLRFp2dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLRFp2LWZYRWR1cUhvT0piVVJaUnciIHg9IjMwODEiIHk9IjM0MzciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNBQiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEtEWjJ1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2MDYiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RaMy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaNE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RaNGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaNHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RaNC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaNU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWjVlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IS0RaMS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS0RaMk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzc1NCIgeT0iNTc4MiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaNXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRURFNzUwMDRFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFo2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IS0RaNnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjU3MyIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFo3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFo3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFo4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFo4ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFo4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFo4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFo5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RaOWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLRFo1LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLRFo2T2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc2MDMiIHk9Ijc5NjciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS2tPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVERTgwMDI1MiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Lay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEtOS2xPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM0MzciIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS2xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS2x1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS2wtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LbU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LbWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LbXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LbS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Lbk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LbmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LbnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS24tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IS05La2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS05La3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNTk5IiB5PSI1NzgyIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktxZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkEzNjAyQzEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLTktyZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMjE4IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3NlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS3N1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3MtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS3RPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3RlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS3R1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3QtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTkt1T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEtOS3F1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtOS3EtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA4MjgiIHk9IjM0NDUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3VlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Ldk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEtOS3ZlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2MDYiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Ld2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05Ld3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Ldy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LeE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LeGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LeHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LeC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS3lPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IS05LdXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS05LdS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzAzOSIgeT0iMzQ3MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LMHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0I1Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTksxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IS05LMXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzYwNiIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTksydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTksyLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkszT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTkszZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkszdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTkszLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTks0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LNGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLTkswLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLTksxT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc1OTQiIHk9IjU3ODIiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEwNCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEtOSy1PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3NDMiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSy1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSy11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSy0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LX2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LX3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LXy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05MQU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05MQWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05MQXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOTEEtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IS05LOWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS05LOXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzEwNiIgeT0iNTc4MiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3diWXF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hLRFp6ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFRDg5MTAzQUQiIHNvdXJjZT0iX0hLRFp2ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hLRFpyZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaMC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLRFowZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hLRFp6dWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEtEWnotZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTIzNiwgLTMwNCwgLTg5MjMsIDIwODJdJFs4NTkzLCAtMjAzMiwgLTE1NjYsIDM1NV0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLRFoxT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtEWjFlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hLRFo5dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFRTBDNTAzQTEiIHNvdXJjZT0iX0hLRFo1dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hLRFp2ZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWi1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWi0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLRFotdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hLRFo5LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEtEWi1PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUzMywgLTUyNCwgNDAzOCwgMzk5Nl0kWy00MDM4LCAtMzk5NiwgNTMzLCA1MjRdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS0RaX2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLRFpfdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IS05Lb09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRUUwQzkwMTk0IiBzb3VyY2U9Il9IS05La09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IS0RadmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3B1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS05LcE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IS05Lb2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hLTktvdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MjQsIDAsIDE4MTFdJFswLCAtMTgxMSwgMCwgNTI0XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtOS3AtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS05LcU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEtOS3llZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2MyIgc291cmNlPSJfSEtEWjF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEtOS3VlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Lek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkt6LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtOS3plZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEtOS3l1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IS05LeS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTI0LCAwLCAxODExXSRbMCwgLTE4MjAsIDAsIDUxNl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLTkswT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtOSzBlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hLTks0dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZGREY4MjAxNjYiIHNvdXJjZT0iX0hLTkswdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hLRFp2ZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LNk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLTks1dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hLTks0LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEtOSzVPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTExMjYsIC01MjQsIDM5NTMsIDE4MTFdJFstMzkzNywgLTE4MTEsIDExNDMsIDUyNF0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLTks2ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtOSzZ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hLTks2LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjUxOEM5MzAwOEYiIHNvdXJjZT0iX0hLTkswdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hLTktxZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LOGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLTks3LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hLTks3T2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEtOSzdlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTU4LCAtNTI0LCAtMTk4MSwgMTgxMV0kWzE5NjQsIC0xODIwLCAtNTc1LCA1MTZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS05LOHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLTks4LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IS05MRGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQURDMDEwMjhEIiBzb3VyY2U9Il9IS05LOU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IS0RacmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkxFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkxFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOTEUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS05MRWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IS05MRHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hLTkxELWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MjQsIDAsIDQxOTldJFswLCAtNDE2NSwgMCwgNTU4XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtOTEZPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS05MRmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEtOTEZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNTE4QkQ3MDFFMyIgc291cmNlPSJfSEtOSzlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEtOS3FlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05MR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05MRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkxIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtOTEd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEtOTEYtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IS05MR09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTY3LCAtNTI0LCAxOTcyLCAxODExXSRbLTE5ODEsIC0xODIwLCA1NTgsIDUxNl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLTkxIZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtOTEh1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2UEYydWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwM0IiPgotICAgICAgICAgIDxib2R5PjA0PC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkVEQjM4MDExRSIgbmFtZT0iTGlicmFyeUNvbmZpZ3VyYXRpb25zIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d2LXN4dWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQwRjM2RDdCMDMwNSI+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2RDdCMDMwNSIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1ldGhvZExpYnJhcnlBbmRDb25maWd1cmF0aW9ucyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzd09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTA0Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBM3ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEpBM3hPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTN4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBM3h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBM3lPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzeWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBM3l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzeS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBM3pPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzemVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBM3p1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBM3otZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEpBM3dlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISkEzd3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDgzIiB5PSIzODEwIiB3aWR0aD0iMzcyNSIgaGVpZ2h0PSIyMzM2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEpBMzFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTMxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzMmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzMi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzM2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBMzMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEpBMzBlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISkEzMHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDM5IiB5PSI5MTI3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0QS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0I1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEpBNEItZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNENlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0Q3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0RE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNERlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0RHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0RU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNEV1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEpBNEJPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISkE0QmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1MDA1IiB5PSI5OSIgd2lkdGg9IjUxMzAiIGhlaWdodD0iMjIyNiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNE51ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTU4MDE1MiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKQTRPdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTg5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0Ty1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRQdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNFAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRRT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNFFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRRdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNFEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRST2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRSZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKQTROLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpBNE9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU5ODUiIHk9Ijc0NTkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRSdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0U2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISkE0U3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0VE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0VHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRULWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0VU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRVZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0VXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRVLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0Vk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0VmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISkE0Ui1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKQTRTT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijk0NzQiIHk9IjEwOTMwIiB3aWR0aD0iNDEyMyIgaGVpZ2h0PSIxMTA5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0VnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEpBNFd1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0WGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0WC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktCc2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktCcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQnRlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEpBNFYtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISkE0V09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDMzNiIgeT0iMzgxMCIgd2lkdGg9IjQ0NjYiIGhlaWdodD0iMjMzNiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d2LXN5T2ZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGUgTGlicmFyeSBDb25maWd1cmF0aW9ucyBwYWNrYWdlIGFkZHMgYWRkaXRpb25hbCBjYXBhYmlsaXRpZXMgZm9yIHBhY2thZ2luZyBNZXRob2QgUGx1Z2lucyBhbmQgc2NhbGluZyBtZXRob2QgYW5kIHByb2Nlc3MgYXV0aG9yaW5nIHdvcmsuICBJdCBkZWZpbmVzIHRoZSBrZXkgY29uY2VwdCBvZiBMaWJyYXJ5IHdoaWNoIGNvbXByaXNlcyBvZiBNZXRob2QgUGx1Z2lucyBhcyB3ZWxsIGFzIE1ldGhvZCBDb25maWd1cmF0aW9ucy4gIEEgTGlicmFyeSByZXByZXNlbnRzIHRoZSBvdmVyYWxsIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgYWxsIE1ldGhvZCBFbGVtZW50cy4gIExpYnJhcmllcyByZXByZXNlbnQgYSBzZXBhcmF0ZSBNZXRob2QgJ3VuaXZlcnNlJywgaS5lLiBhIE1ldGhvZCBMaWJyYXJ5IGNhbm5vdCByZWZlcmVuY2UgZWxlbWVudHMgZnJvbSBhbm90aGVyIE1ldGhvZCBMaWJyYXJ5LiAgQSBDb25maWd1cmF0aW9uIGlzIGEgc3Vic2V0IG9mIFBsdWdpbnMgYW5kIE1ldGhvZCBQYWNrYWdlcywgaS5lLiBzZWxlY3Rpb25zIG9mIE1ldGhvZCBQbHVnaW5zIHdpdGggYSBzZWxlY3RlZCBzdWJzZXQgb2YgTWV0aG9kIFBhY2thZ2VzLiAgVGhleSBhcmUgdXNlZCB0byBkZWZpbmUgd29ya2luZyBzZXRzIGZvciBwcm9jZXNzIGF1dGhvcmluZyBwcm92aWRpbmcgYSBwcm9jZXNzIGVuZ2luZWVyIG9ubHkgd2l0aCBsaXN0cyBvZiBlbGVtZW50cyB0byBiZSB1c2VkIGZvciBjcmVhdGluZyBwcm9jZXNzIHdpdGhpbiBzdWNoIGEgQ29uZmlndXJhdGlvbi4gIENvbmZpZ3VyYXRpb25zIGFsc28gZGVmaW5lIHRoZSBzcGFjZSBvZiB2YXJpYWJpbGl0eSBpbnRlcnByZXRhdGlvbiB0byBhdm9pZCBjb25mbGljdHMgYW1vbmdzdCAnY29tcGV0aW5nJyBjb250ZW50IChlLmcuIGNvbnRlbnQgdGhhdCByZXBsYWNlcyB0aGUgc2FtZSBlbGVtZW50cykgYXMgd2VsbCBhcyBkZWZpbmUgc2V0cyBvZiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzIGZvciBleHBvcnQgYW5kIGRpc3RyaWJ1dGlvbi4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpBMzRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENSIgc291cmNlPSJfSEpBMzBPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBM3dPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISkEzNU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJEOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBMzZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODQiIHk9Ii0zOTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzNnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJEOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTM2LWZYRWR1cUhvT0piVVJaUnciIHg9IjE2MCIgeT0iMTYyNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkEzN3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjc4IiB5PSItMjc5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTM4ZWZYRWR1cUhvT0piVVJaUnciIHg9IjE0NiIgeT0iMzU2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJEOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBMzl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBMzlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMy1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBMy11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBMy1PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTMtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzX2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzX3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkEzX09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBM18tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0QXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkE0QU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpBMzRlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISkEzNHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1OSwgLTU3NSwgNTksIDQxNDhdJFs1OSwgLTM1NjQsIDU5LCAxMTU5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpBNEUtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4MiIgc291cmNlPSJfSEpBM3dPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNEEtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRHZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISkE0Ri1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBNEctZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIwNCIgeT0iLTE2OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjg1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0SC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBNEh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE3MCIgeT0iMTM4MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBNEllZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTRKT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEyNyIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRLZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTRKLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0S3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRMZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTRLLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0THVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNE1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNE1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBNEwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTROT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNE5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBNE0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKQTRGT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpBNEZlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOTMsIC0xMTY4LCAtNDQ3OCwgMjMzNl0kWzkzLCAtMzM3OCwgLTQ0NzgsIDEyN10kWzIwMDYsIC0zMzc4LCAtMjU2NSwgMTI3XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpLQnR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxNSIgc291cmNlPSJfSEpBM3dPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISktCdXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQnZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE4NSIgeT0iLTI1NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjFEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQndlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM5MCIgeT0iMjM3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjE2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0J4T2ZYRWR1cUhvT0piVVJaUnciIHg9IjI5NiIgeT0iLTExOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjE2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCeC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyOTYiIHk9IjM1NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0J6T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0J5dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0IwT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0J6dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQjFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQjB1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0IxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0IxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQjJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQjF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKS0J0LWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpLQnVPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTg2MiwgNjAxLCAtNzg0MCwgNjAxXSRbNzg0MCwgNjAxLCAtMTg2MiwgNjAxXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpLQjJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0NSIgc291cmNlPSJfSEpBMzBPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0IzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0IzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISktCM2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQjRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg0MCIgeT0iMjc5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCNU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4NTMiIHk9Ii0yMDMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQjUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE2MSIgeT0iLTE2MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCNnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1MDEiIHk9IjM1NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0I3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0I3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0I4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0I4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQjktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQjllZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0ItT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0ItdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQi0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQi1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKS0IydWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpLQjItZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTUwNywgLTE1MiwgLTgxOTUsIDQ1NzJdJFs4MDUxLCAtMTUyLCAtMTY1MSwgNDU3Ml0kWzgwNTEsIC0zNTU2LCAtMTY1MSwgMTE2OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKS0JfT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNjAxMjYiIHNvdXJjZT0iX0hKQTRBLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKQTRWdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDQXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpLQ0FPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NBLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGODdCRjcwMDkzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDQk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDQnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDQi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGODdCRjcwMDkxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDQy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NDdWZYRWR1cUhvT0piVVJaUnciIHg9IjE1NyIgeT0iMTY5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0RlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjI1IiB5PSItMjIzNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NFZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NFdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NFT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NGdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NGT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQ0d1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0dPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQ0h1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0hPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKS0JfZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpLQl91ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjU2NSwgMTAxLCAtMjU2NSwgLTM0MDNdJFs1MDQ2LCAxMDEsIC04NCwgLTM0MDNdJFs1MDQ2LCAyMzM2LCAtODQsIC0xMTY4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpLQ0gtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMCIgc291cmNlPSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNE51ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISktDSS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0tPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0otZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIwOCIgeT0iMjI4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDS3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjA4IiB5PSItMTM1NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0x1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDTGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MjAiIHk9Ii0xNjkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDTC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ01lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ01PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjY4IiB5PSIzNTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTEyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDTmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDTS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ051ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTExIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDT2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDTi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ091ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NQZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NPLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTExIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NRZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NQLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISktDSU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKS0NJZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEyNDQsIDExNjQsIC0zMDk1LCAtMTYxNF0kWzEyNDQsIDI2NDYsIC0zMDk1LCAtMTMyXSRbMzQxMywgMjY0NiwgLTkyNiwgLTEzMl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKS0NRdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxN0UiIHNvdXJjZT0iX0hKQTRWdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKQTROdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDU09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpLQ1J1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxODAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NTdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNjUiIHk9IjI2MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTgwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ1RlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzk1IiB5PSItMjI5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDVWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NVT2ZYRWR1cUhvT0piVVJaUnciIHg9IjYyMSIgeT0iMTUyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1V1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NVLWZYRWR1cUhvT0piVVJaUnciIHg9IjI2NSIgeT0iMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE4MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQ1dPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ1Z1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQ1hPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ1d1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTgwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDWC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDWU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDWHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDWk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDWXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpLQ1EtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISktDUk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxODYyLCAzNjQsIC0zMjY4LCAtMjYzM10kWzUwNzEsIDM2NCwgLTU5LCAtMjYzM10kWzUwNzEsIDI0ODAsIC01OSwgLTUxNl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKS0NaZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1MjAzQjAiIHNvdXJjZT0iX0hKQTRWdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKQTRWdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5c09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHlzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5cy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpUeXNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHl0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1NjAyQTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHl0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHl0ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zMiIgeT0iLTI2MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHl0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzZDRTU2MDJBOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeXVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHl1T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5dXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1NjAyQTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHl2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeXUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI3OSIgeT0iLTE4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHl2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1NjAyQTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHl2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHl2dWZYRWR1cUhvT0piVVJaUnciIHg9IjIzNCIgeT0iLTE0OTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5d09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3NkNFNTYwMkE5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5d3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR5dy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5d2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeXhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3NkNFNTYwMkE3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5eHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR5eC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5eGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeXlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1NjAyQTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHl5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHl5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHl5ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5ek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3NkNFNTYwMkE3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5enVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHl6LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHl6ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISktDWnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKS0NaLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNDA1LCAtMTE2OCwgLTE0MDUsIC0xMTY4XSRbLTE0MDUsIC0xOTg5LCAtMTQwNSwgLTE5ODldJFstMzQ5NiwgLTE5ODksIC0zNDk2LCAtMTk4OV0kWy0zNDk2LCAtMzg5LCAtMzQ5NiwgLTM4OV0kWy0xODYyLCAtMzg5LCAtMTg2MiwgLTM4OV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKVHkwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTYiIHNvdXJjZT0iX0hKQTRSdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKQTRWdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5MC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHkxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5MXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpUeTFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHkxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHkyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHkyT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE2MyIgeT0iMTcwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHkzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5Mi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjY5IiB5PSIxMjU0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5My1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHkzdWZYRWR1cUhvT0piVVJaUnciIHg9IjM1NyIgeT0iLTE0MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHk0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5NHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5NGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMzAiIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5NC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5NWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR5NXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5NU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5NmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR5NnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5Nk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHk3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHk3dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHk3T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5Ny1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5OGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHk4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHk4T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISlR5MGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKVHkwdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzQyMywgLTU1OCwgLTY5NCwgNTk0M10kWzQyMywgLTUzNDIsIC02OTQsIDExNTldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISlR5OC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjkxQ0QwMThCIiBzb3VyY2U9Il9ISkE0VnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISkE0UnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5LU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeS1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKVHk5LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5LXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDU5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5X09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5LS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzU1IiB5PSIxNDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5X2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHlfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5X3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6QXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpBZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNDQiIHk9IjE5NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpCT2ZYRWR1cUhvT0piVVJaUnciIHg9IjIyMCIgeT0iOTk5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI5MUQwMDA1OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUekNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUekItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI5MUQwMDA0NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUekRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUekMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDU5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6RU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6RWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6RC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI5MUQwMDA0NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6RmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6RS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpUeTlPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISlR5OWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTE0MywgMTE1OSwgLTI1LCAtNTM0Ml0kWy0xMTQzLCA1OTQzLCAtMjUsIC01NThdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISlR6RnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OEVGN0MwMzUzIiBzb3VyY2U9Il9ISkE0VnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISkE0UnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6Ry1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKVHpHdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6SGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OEVGN0UwMDU2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6SC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6SHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItOTI0IiB5PSItMjAzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeklPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OEVGN0UwMDU2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6SXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUekllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6Sk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3OTYiIHk9IjkzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUektPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUekotZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA5MCIgeT0iLTU4OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHpMT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpLdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6TGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHpNT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpMdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6TWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA1NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUek0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUek5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUek11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUek9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUek51ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKVHpGLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpUekdPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNDIsIDExNjgsIDExNTksIC01MzM0XSRbNDIsIDUwODAsIDExNTksIC0xNDIyXSRbMjIxOCwgNTA4MCwgMzMzNSwgLTE0MjJdJFsyMjE4LCA2MTgwLCAzMzM1LCAtMzIxXSRbOTM5LCA2MTgwLCAyMDU3LCAtMzIxXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpUek9lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZBMDMxNyIgc291cmNlPSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNFJ1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpQLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISlR6UGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyN0EiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpRZWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpST2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6UnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyNzAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUelItZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI2MSIgeT0iMTQ0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUelN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDc0IiB5PSIyNjU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUelQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUelRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUelUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUelVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OTAwNkIwMjdBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6VnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6Vi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6VmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeldPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeld1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6Vy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6V2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpUek91ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISlR6Ty1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3MTEsIDExNjgsIDE4MjgsIC01MzM0XSRbNzExLCA0MzM0LCAxODI4LCAtMjE2N10kWzM4NTIsIDQzMzQsIDQ5NjksIC0yMTY3XSRbMzg1MiwgNjczOSwgNDk2OSwgMjM3XSRbOTM5LCA2NzM5LCAyMDU3LCAyMzddIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTc2QTNFQzAwMjciIHR5cGU9IkNsYXNzIiBuYW1lPSJQcm9jZXNzRmFtaWx5Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGpzT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISmRqdE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqdU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGp1ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqdXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGp1LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGp2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqdi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISmRqc2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKZGpzdWZYRWR1cUhvT0piVVJaUnciIHg9IjY2OCIgeT0iOTE0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqd09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDc3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEpkanhPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqeWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqeS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqemVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkanotZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEpkandlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISmRqd3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MTEwIiB5PSIzNzc2IiB3aWR0aD0iMzI4MiIgaGVpZ2h0PSIxMDgzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0FCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEpkajFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGoxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqMmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqMi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqM2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkajMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEpkajBlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISmRqMHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDI0IiB5PSIzODYwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3dIMm9lZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyBob3cgcHJvY2Vzc2VzIGFyZSBwYWNrYWdlZCBpbiBtZXRob2RsaWJyYXJ5IGFuZCByZWxhdGVkIHRvIGNvbmZpZ3VyYXRpb25zLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISmRqNE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY0IiBzb3VyY2U9Il9ISmRqd09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISmRqME9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpkajVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY5OSIgeT0iLTMzMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKZGo2T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii01NSIgeT0iMjA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISmRqNi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDQ5IiB5PSItMjI5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKZGo3dWZYRWR1cUhvT0piVVJaUnciIHg9IjMzOSIgeT0iLTI4OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKZGo4ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NjkiIHk9IjIzMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGo5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKZGo5T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGotZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGotdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKZGotT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkal9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkal91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpkal9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGpfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGtBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpka0F1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpka0FPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKZGo0ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpkajR1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE0NTYsIDMzLCA2NjcxLCAzM10kWy02NzE0LCAzMywgMTQxMywgMzNdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISmRrQS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjYzIiBzb3VyY2U9Il9ISmRqME9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISmRqc09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpka0J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRrQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpka0NlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKZGtCLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISmRrQk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKZGtCZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NTcsIC01MCwgMjQ4OV0kWzAsIC0yNDg5LCAtNTAsIDQ1N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEpka0N1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKZGtDLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2WVB5LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFREIzODAxMUUiPgotICAgICAgICAgICAgPGJvZHk+MDI8L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9BX19fb094TUVkdU9Ock1SZ216NDhBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDFGRUREQjYwMzA2Ii8+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdllQM09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBNZXRob2QgQ29uZmlndXJhdGlvbiBpcyBhIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NDU2NUJCMTAxNUYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MUZFRDg4MTAxQjUiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMUQiIG5hbWU9Im1ldGhvZFBsdWdpblNlbGVjdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTA0IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2aUExT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2aUEwLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0OCIgbmFtZT0ibWV0aG9kUGFja2FnZVNlbGVjdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0NSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2cnh4dWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2cnh4ZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5OCIgbmFtZT0icHJvY2Vzc1ZpZXdzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk2Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3YwN3plZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3YwN3pPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNDUiIG5hbWU9ImRlZmF1bHRWaWV3IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxMjkxQ0QwMThCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3YwNzBlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3YwNzBPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3NkNFNTYwMkE3IiBuYW1lPSJiYXNlQ29uZmlndXJhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1MjAzQjAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hdi1zdHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hdi1zdGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA0MiIgbmFtZT0ic3VidHJhY3RlZENhdGVnb3J5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDU1OEVGN0MwMzUzIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3Ytc3ZlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3Ytc3ZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyNzAiIG5hbWU9ImFkZGVkQ2F0ZWdvcnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0NTU5MDA2QTAzMTciPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hdi1zeE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hdi1zdy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0FCIiBuYW1lPSJQcm9jZXNzRmFtaWx5Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3ZZUDRPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNBQiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgRGVsaXZlcnkgTW9kZWwgRmFtaWx5IGlzIGEgY29udmVuaWVudCBncm91cGluZyBvZiBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgb2YgaW50ZXJlc3QgdG8gc29tZSBzcGVjaWZpYyB1c2VyIGNvbW11bml0eS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjMiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjciIG5hbWU9ImRlbGl2ZXJ5UHJvY2Vzc2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNzciIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY0Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZyeHotZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZyeHp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRUYwOTU4MDE1MiIgbmFtZT0iUHJvY2VzcyIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2aUF3LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk1ODAxNTIiPgotICAgICAgICAgICAgICA8Ym9keT5Qcm9jZXNzIGluIHRoZSBwYWNrYWdlIExpYnJhcnkgQ29uZmlndXJhdGlvbiBleHRlbmRzIHRoZSBjbGFzcyBQcm9jZXNzIHdpdGggYXNzb2NpYXRpb24gcmVsYXRpbmcgYSBQcm9jZXNzIHRvIG9uZSBkZWZhdWx0IGFuZCBtYW55IG9wdGlvbmFsIHZhbGlkIENvbmZpZ3VyYXRpb25zLgotVGhlc2UgY29uZmlndXJhdGlvbnMgZGVzY3JpYmUgdmFsaWQgY29udGV4dHMgZm9yIHRoZSBQcm9jZXNzIHdpdGhpbiBhIE1ldGhvZCBMaWJyYXJ5IGluZGljYXRpbmcgdW5kZXIgd2hpY2ggQ29uZmlndXJhdGlvbnMgYSBQcm9jZXNzIGlzIHdlbGwgZGVmaW5lZC4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMiIgbmFtZT0iZGVmYXVsdENvbnRleHQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdjA3dmVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdjA3dk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxODAiIG5hbWU9InZhbGlkQ29udGV4dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE3RSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2MDd4dWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2MDd4ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQjUiIG5hbWU9Ik1ldGhvZExpYnJhcnkiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdmlBeC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0I1Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGRkRGODIwMTY2IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFGRUQ4ODEwMUI1Ii8+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDIwMDYwQ0UwMzM3IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI1MThDOTMwMDhGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREZBMzYwMkMxIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjg1IiBuYW1lPSJtZXRob2RQbHVnaW5zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMDQiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjgyIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZyeDF1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZyeDFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTEiIG5hbWU9InByZWRlZmluZWRDb25maWd1cmF0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjg3QkY2MDEyNiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2MDdzLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2MDdzdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxNiBfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjFEIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3ZpQXplZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxNSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgc2VsZWN0aW9uIG9mIHBhY2thZ2VzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBjb25maWd1cmF0aW9uLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxNiIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdmlBMGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdmlBME9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ1IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDYgXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0OCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2aUExdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDUiPgotICAgICAgICAgICAgICA8Ym9keT5BIHNlbGVjdGlvbiBvZiBwYWNrYWdlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgY29uZmlndXJhdGlvbi48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDYiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZyeHctZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZyeHd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY1IF8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjciPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdnJ4eU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY0Ij4KLSAgICAgICAgICAgICAgPGJvZHk+RGVsaXZlcnkgUHJvY2VzcyBjYW4gYmUgb3JnYW5pemVkIGluIG1hbnkgUHJvY2VzcyBGYW1pbGllcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjUiIG5hbWU9InByb2Nlc3NGYW1pbGllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0FCIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2cnh6T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2cnh5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4MyBfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjg1Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3ZyeDBlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4MiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgTWV0aG9kIExpYnJhcnkgcGh5c2ljYWxseSBjb21wcmlzZXMgb2YgTWV0aG9kIFBsdWdpbnMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjgzIiBuYW1lPSJfbWV0aG9kTGlicmFyeSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNCNSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4MiIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGODdCRjYwMTI2IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTEgXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2cngyT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNjAxMjYiPgotICAgICAgICAgICAgICA8Ym9keT5BIE1ldGhvZCBMaWJyYXJ5IHN0b3JlcyBhIHNldCBvZiBwcmVkZWZpbmVkIE1ldGhvZCBDb25maWd1cmF0aW9ucyB0aGF0IGFyZSByZWd1bGFybHkgdXNlZCBieSB0aGUgbGlicmFyeSBhdXRob3JzIChlLmcuIHRoZSBjb25maWd1cmF0aW9ucyB0aGF0IHRoZXkgc2hpcCB0byB0aGVpciB1c2VycykuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGODdCRjcwMDkzIiBuYW1lPSJfbWV0aG9kTGlicmFyeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0I1IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGODdCRjYwMTI2Ii8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMSBfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTEyIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3YwN3R1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMCI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUHJvY2VzcyBoYXMgZXhhY3RseSBvbiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uICBUaGlzIGlzIGluIG1vc3QgY2FzZXMgdGhlIGNvbmZpZ3VyYXRpb24gaW4gd2hpY2ggdGhlIHByb2Nlc3MgaGFzIGJlZW4gY3JlYXRlZC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTEiIG5hbWU9Il9wcm9jZXNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MUVGMDk1ODAxNTIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdjA3dXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdjA3dWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdFIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxN0YgXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE4MCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2MDd2LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxN0UiPgotICAgICAgICAgICAgICA8Ym9keT5BIFByb2Nlc3MgY2FuIGhhdmUgbWFueSBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25zIHRoYXQgaGF2ZSBiZWVuIHZlcmlmaWVkIHRvIGFsc28gcHJvZHVjZSB2YWxpZCByZXN1bHRzLiAgUHJvY2VzcyBFbGVtZW50cyAoZS5nLiBEZXNjcmlwdG9ycykgdGhhdCByZWZlciB0byBjb250ZW50IHBhY2thZ2VzIHRoYXQgYXJlIGRlZmluZWQgb3V0c2lkZSB0aGUgc2NvcGUgb2Ygc3VjaCBhIGNvbmZpZ3VyYXRpb24gd291bGQgbm90IGJlIHNob3duIGluIHRoZSBwcm9jZXNzIHdoZW4gcHVibGlzaGVkIG9yIHVzZWQgdW5kZXIgc3VjaCBhIGNvbmZpZ3VyYXRpb24uICBUaGlzIGFsbG93cyB0byBlYXNpbHkgcmVtb3ZlIGNvbnRlbnQgZnJvbSBhIHByb2Nlc3MgYnkgcmVtb3ZpbmcgY29udGVudCBwYWNrYWdlcyB0byBmcm9tIHRoZSByZWxhdGVkIGNvbmZpZ3VyYXRpb24uPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdGIiBuYW1lPSJfcHJvY2VzcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFFRjA5NTgwMTUyIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdFIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3YwN3ctZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3YwN3d1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5NiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk3IF8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTgiPgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5NyIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5NiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2MDd5dWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2MDd5ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFDRDAxOEIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyMTI5MUQwMDA0NSBfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDU5Ij4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNTkiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjEyOTFDRDAxOEIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hdi1zc09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdjA3MC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3NkNFNTIwM0IwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1NjAyQTcgXzNBREM3Qjc0MDIyRDQyNzZDRTU2MDJBOSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2LXNzdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1MjAzQjAiPgotICAgICAgICAgICAgICA8Ym9keT5UaGUgZGVmaW5pdGlvbiBvZiBhIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGJhc2VkIG9uIHRoZSBkZWZpbml0aW9ucyBvZiBvdGhlciBjb25maWd1cmF0aW9ucy4gIEZvciBleGFtcGxlLCBhIGNvbmZpZ3VyYXRpb24gQSBjb3VsZCBiZSBkZWZpbmVkIGFzIHRoZSBzdXBlcnNldCBvZiBjb25maWd1cmF0aW9ucyBCLCBDLCBhbmQgRCBwbHVzIGFkZCBtb3JlIHNlbGVjdGVkIFBsdWdpbnMgYW5kIFBhY2thZ2VzLiAgSW4gc3VjaCBhIGNhc2UgQSB3b3VsZCBsaXN0IEIsIEMsIGFuZCBEIGFzIGl0cyBiYXNlQ29uZmlndXJhdGlvbnMuICBJZiBhbnkgb2YgdGhlc2UgYmFzZSBjb25maWd1cmF0aW9ucyBjaGFuZ2VzIGFsbCB1cGRhdGVzIHdvdWxkIGJlIGF1dG9tYXRpY2FsbHkgdmFsaWQgZm9yIEEgYXMgd2VsbCByZWR1Y2luZyBtYWludGFpbmFiaWxpdHkgb3ZlcmhlYWQgZm9yIG92ZXJsYXBwaW5nL2RlcGVuZGVudCBjb25maWd1cmF0aW9ucy4gPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3NkNFNTYwMkE5IiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3NkNFNTIwM0IwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3Ytc3VlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3Ytc3VPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdDMDM1MyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDU1OEVGN0UwMDQyIF8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNTYiPgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA1NiIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQ1NThFRjdDMDM1MyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2LXN3T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2LXN2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QTAzMTciIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3MCBfM0FEQzdCNzQwMjJENDU1OTAwNkIwMjdBIj4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyN0EiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0NTU5MDA2QTAzMTciLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZFRERCNjAzMDYiIG5hbWU9Ik1ldGhvZFVuaXRzIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d3YllvLWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxRkVERTA5MDNCMCI+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkVERTA5MDNCMCIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZW9PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVERTc1MDA0RSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKd2VwT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNTczIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndlcWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndlcS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndlcmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZXItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEp3ZW9lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISndlb3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI1ODg3IiB5PSI2MDA0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlc09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRURFODAwMjUyIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEp3ZXRPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM0NTQiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndldHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2V0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndldU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2V1ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndldXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2V1LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndldk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2V2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndldnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndldi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISndlc2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKd2VzdWZYRWR1cUhvT0piVVJaUnciIHg9IjkwMjIiIHk9IjYwMDQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2U2ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISndlN2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjgyNyIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZTd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2U4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlOGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2U4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlOC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2U5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlOWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2U5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlOS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndlLU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISndlNnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKd2U2LWZYRWR1cUhvT0piVVJaUnciIHg9Ijc5ODQiIHk9IjE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZS1lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk0N0U1MDE3OCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKd2VfZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMzg2IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZV8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndmQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndmQXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndmQk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndmQnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZkNPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEp3ZS11ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISndlLS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTExIiB5PSI2MDA0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndmRXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEp3ZkZ1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMzMTgiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2ZGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndmR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3Zkd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndmRy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UG9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZQb2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UG91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZQby1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UHBlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEp3ZkUtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISndmRk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjAiIHk9IjI5ODgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlBwdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFRDg4MTAxQjUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISjZQcXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDUzOCIgaGVpZ2h0PSIyNDIxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlByZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UHItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlBzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UHNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlBzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UHMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlB0ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKNlBwLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEo2UHFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzE3OSIgeT0iMjM0NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UUZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNCNSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKNlFHdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjA2IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UUhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFIdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UUgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UUllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFJdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UUktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFKT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlFKZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKNlFGLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEo2UUdPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMwMzAiIHk9IjU5MzUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFMLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISjZRTS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzYwNiIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UU5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRTi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlFPT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRT2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlFPdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRTy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlFQT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRUGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZRUHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISjZRTU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKNlFNZWZYRWR1cUhvT0piVVJaUnciIHg9IjE2ODQwIiB5PSI1OTM1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3diWXBlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249InxNZXRob2QgYW5kIFByb2Nlc3MgQXV0aG9yaW5nIGlzIG5vdCBkb25lIGluIGlzb2xhdGlvbiBieSBhIHNpbmdsZSBwcm9jZXNzIGVuZ2luZWVyLiAgRXNwZWNpYWxseSwgd2hlbiBsYXJnZSBzY2FsZSBNZXRob2QgTGlicmFyaWVzIHNoYWxsIGJlIG1haW50YWluZWQgaXQgaXMgaW1wb3J0YW50IHRvIGRlZmluZSB0aGUgcmlnaHQgbW9kdWxhcml6YXRpb24gcHJpbmNpcGxlcyB0aGF0IGFsbG93IGNvbmN1cnJlbnQgZGV2ZWxvcG1lbnQgb2YgbGFyZ2Ugc2NhbGUgcHJvY2VzcyBlbmdpbmVlcmluZyB0ZWFtcy4gIE1ldGhvZCBQbHVnaW5zIHdlcmUgYSBmaXJzdCBzdGVwIG9mIG1vZHVsYXJpemF0aW9uLiAgSG93ZXZlciwgZXZlbiB3b3JraW5nIHdpdGggTWV0aG9kIFBsdWdpbnMgY2FuIG9ubHkgc2NhbGUgaW4gbGltaXRlZCB3YXlzIHN1cHBvcnRpbmcgb25seSB2ZXJ5IHNtYWxsIGF1dGhvcmluZyB0ZWFtcy4gIEZvciBsYXJnZXIgc2NhbGUgbWV0aG9kIGxpYnJhcmllcyBjb25jdXJyZW50IGFjY2VzcyBhbmQgd29ya2luZyBldmVuIHdpdGhpbiBhIE1ldGhvZCBQbHVnaW4gaXMgcmVxdWlyZWQuICBUbyBhZGRyZXNzIHRoZXNlIHJlcXVpcmVtZW50cyB0aGUgTWV0aG9kIFVuaXRzIHBhY2thZ2UgZXh0ZW5kcyBNZXRob2QgRWxlbWVudHMgdmlhIHBhY2thZ2UgbWVyZ2Ugd2l0aCBhIG5ldyBjYXBhYmlsaXR5IGRlZmluZWQgYXMgTWV0aG9kIFVuaXQuICBBIE1ldGhvZCBVbml0IGlzIGEgdW5pdCBvZiBjb250cm9sIHRoYXQgY2FuIGJlIHdvcmtlZCBvbiBieSBvbmUgcHJvY2VzcyBlbmdpbmVlciBhbmQgY2FuIHNlcnZlIGFzIG9uZSB1bml0IG9mIHZlcnNpb24gY29udHJvbC4mI3hBO3xUaGUgZGlhZ3JhbSBzaG93cyB0aGF0IGZvdXIgdHlwZXMgb2YgTWV0aG9kIFVuaXRzIGhhdmUgYmVlbiBkZWZpbmVkLiAgQ29udGVudCBEZXNjcmlwdGlvbiByZXByZXNlbnRpbmcgYWxsIG1ham9yIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrLCBBcnRpZmFjdCwgR3VpZGVsaW5lLCBvciBXaGl0ZXBhcGVyIHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuICBXaGVyZWFzIGV2ZXJ5IENvbnRlbnQgRWxlbWVudCdzIENvbnRlbnQgRGVzY3JpcHRpb24gY2FuIGJlIHNlZW4gYXMgYW4gZWxlbWVudCB0aGF0IGNhbiBiZSBtYWludGFpbmVkIGluIGlzb2xhdGlvbiwgUHJvY2Vzc2VzIGFyZSBrZXB0IGFuZCBtYW5hZ2VkIGFzIGEgd2hvbGUuICBJZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgbmVlZHMgdG8gYmUgc3BsaXQgYW5kIGhhbmRsZWQgYXMgc2VwYXJhdGUgdW5pdHMgb2YgY29udHJvbCB0aGVuIG5ldyBwcm9jZXNzZXMgc3VjaCBhcyBDYXBhYmlsaXR5IFBhdHRlcm5zIHdpbGwgYmUgY3JlYXRlZCBmb3Igc3VjaCBhIHJlZmFjdG9yaW5nLiAgSGVuY2UsIGV4YWN0bHkgb25lIGluc3RhbmNlIG9mIFByb2Nlc3Mgc2hhbGwgYmUgc3RvcmVkIGluIGFuIGluc3RhbmNlIG9mIFByb2Nlc3MgQ29tcG9uZW50LCB3aGljaCBpcyBkZWZpbmVkIHRvIGJlIHRoZSBjb250YWluZXIgZm9yIGEgUHJvY2VzcyBhbmQgdGhlcmVmb3JlIGl0cyBNZXRob2QgVW5pdC4gIEZpbmFsbHksIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgTGlicmFyaWVzIGFyZSBkZWZpbmVkIGFzIE1ldGhvZCBVbml0cy4gIFdoZXJlYXMsIHRoZSBmb3JtZXIgc3RvcmVzIGFsbCAnbW9kZWxlZCcgZWxlbWVudHMgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyBzdWNoIGFzIGFsbCBDb250ZW50IEVsZW1lbnRzIChvbmx5IHRoZSBkZXNjcmlwdGlvbiBjbGFzc2VzIGFyZSBtYWludGFpbmVkIGFzIHNlcGFyYXRlIHVuaXRzKSwgdGhlIGxhdGVyIGRlZmluZXMgYSBNZXRob2QgVW5pdCB0byBzdG9yZSByZWZlcmVuY2VzIHRvIHRoZSBNZXRob2QgUGx1Z2lucyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBMaWJyYXJ5IGFzIHdlbGwgYXMgTWV0aG9kIENvbmZpZ3VyYXRpb25zLiYjeEE7Ii8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKNlB0dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFRTBDNTAzQTEiIHNvdXJjZT0iX0hKd2VvT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKNlBwdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEo2UHV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKNlB0LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISjZQdU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMDMsIC00NTcsIC0xMTE3LCAyMzg3XSRbNzQ1LCAtMTYzNCwgLTU3NSwgMTIxMF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEo2UHZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlB2dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEo2UHYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVFMEM5MDE5NCIgc291cmNlPSJfSEp3ZXNPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEo2UHB1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISjZQdy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEo2UHdPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKNlB3ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yOTYsIC00NTcsIDE0ODEsIDIzODddJFstMTAzMiwgLTE2MzQsIDc0NSwgMTIxMF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEo2UHh1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlB4LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEo2UHlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVEODkxMDNBRCIgc291cmNlPSJfSEo2UHB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEp3ZTZlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISjZQek9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEo2UHllZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKNlB5dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNSwgLTEyMTksIDI1LCAxNjI1XSRbLTUwLCAtMjMxOSwgMCwgNTI0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZQei1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEo2UDBPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISjZQMGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTQ4MDAwMUFFIiBzb3VyY2U9Il9ISndlLWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISjZQcHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKNlAxZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISjZQMHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEo2UDAtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzAyLCAtNDU3LCAtMzc2NywgMjM4N10kWzI1NTYsIC0xNjM0LCAtMTkxMywgMTIxMF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEo2UDJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlAyZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEo2UDJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQTdENTJGMDI0MyIgc291cmNlPSJfSEo2UHB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEp3ZkV1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlAzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISjZQM3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQTdENTMwMDIwOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEo2UDR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI2NCIgeT0iLTIxMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQTdENTMwMDIwOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKNlA1ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUzMDAxRTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEo2UDZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ0IiB5PSItMjg5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQTdENTMwMDFFMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEo2UDYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzMDAiIHk9IjIyMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUzMDAyMDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlA4T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKNlA3dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQOGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUzMDAxRTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlA5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKNlA4dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQTdENTMwMDIwOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UC1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEo2UDl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlAtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUzMDAxRTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlAtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UF9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEo2UC11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKNlAyLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEo2UDNPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIyNjksIC01MCwgNTMwMCwgMF0kWy01OTA5LCAtNTAsIDE2NTksIDBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISjZRSnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRkRGODIwMTY2IiBzb3VyY2U9Il9ISjZRRnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISjZQcHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UUxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKNlFLdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISjZRSi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEo2UUtPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTk1NiwgLTUyNCwgNDQyOCwgMjM3MF0kWy0zMTE1LCAtMTY4NCwgMjI2OSwgMTIxMF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEo2UUxlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlFMdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEo2UVAtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0NTY1QkIxMDE1RiIgc291cmNlPSJfSEo2UUwtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEo2UHB1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UVJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFSZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISjZRUS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEo2UVFPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKNlFRZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNjE3LCAtNTI0LCA3NTc3LCAyMzcwXSRbLTY5MjUsIC0yMTg0LCAyMjY5LCA3MTFdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlFSdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZRUi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hd0gycGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRUREQjYwMzA2Ij4KLSAgICAgICAgICAgIDxib2R5PjAxPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfR05rQjhPeFNFZHVPTnJNUmdtejQ4QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBGQiIvPgotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfUmNxZk1PeDBFZHU1LXZWamxmVnNmUSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxNTFFOTk2MDA5RCIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGRURFNzUwMDRFIiBuYW1lPSJNZXRob2RQbHVnaW4iPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkVFMEM1MDNBMSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRkVEODgxMDFCNSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGRURFODAwMjUyIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50Ij4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZFRTBDOTAxOTQiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MUZFRDg4MTAxQjUiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkVEODgxMDFCNSIgbmFtZT0iTWV0aG9kVW5pdCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d3SDJzLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFRDg4MTAxQjUiPgotICAgICAgICAgICAgICA8Ym9keT5BIE1ldGhvZCBVbml0IGlzIGEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZFRDg5MTAzQUQiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNUIiIG5hbWU9ImF1dGhvcnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3dIMnQtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA1QiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+RXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzVkR05FZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzVkR05FT3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzVVVGRjT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDY0IiBuYW1lPSJjaGFuZ2VEYXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEY0NDk4RDAxODUiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d3Um5vdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNjQiPgotICAgICAgICAgICAgICAgIDxib2R5PlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfVVotUThleU1FZHVGS0pvdkJMNjRYUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfVVotUThPeU1FZHVGS0pvdkJMNjRYUSIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNkUiIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d3Um5wZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNkUiPgotICAgICAgICAgICAgICAgIDxib2R5PlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9OR2U1WWV5RkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9OR2U1WU95RkVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9POVpYc095RkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA2RiIgbmFtZT0idmVyc2lvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hd1JucU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDZGIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5FdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9zV1RWOGV5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9zV1RWOE95R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9zTVU2a095R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyQTdENTMwMDFFMSIgbmFtZT0iY29weXJpZ2h0U3RhdGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJBN0Q1MkYwMjQzIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3diWW9lZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3diWW9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk0N0U1MDE3OCIgbmFtZT0iQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5NDgwMDAxQUUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MUZFRDg4MTAxQjUiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyQTdENTJGMDI0MyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDJBN0Q1MzAwMUUxIF8zQURDN0I3NDAyMkQ0MkE3RDUzMDAyMDkiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hd1JucnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDJBN0Q1MkYwMjQzIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBNZXRob2QgVW5pdCBjYW4gaGF2ZSBleGFjdGx5IG9uZSBDb3B5cmlnaHQgU3RhdGVtZW50IHNlY3VyaW5nIHRoZSBpbnRlbGxlY3R1YWwgY2FwaXRhbCBpdCByZXByZXNlbnRzLiAgSXQgd2lsbCBiZSBwdWJsaXNoZWQgd2l0aCB0aGUgcmVzcGVjdGl2ZSBjb25jcmV0ZSBFbGVtZW50LiAgTm90ZSwgdGhhdCBDb3B5cmlnaHQgU3RhdGVtZW50cyBmb3IgTWV0aG9kIExpYnJhcmllcyBhbmQgTWV0aG9kIFBsdWdpbnMgZGVmaW5lIHRoZSBkZWZhdWx0IHN0YXRlbWVudCBmb3IgaXRzIGNvbnRhaW5lZCBlbGVtZW50cywgd2hpY2ggY2FuIGJlICdvdmVyd3JpdHRlbicgd2l0aCByZXZpc2VkIHN0YXRlbWVudHMgZm9yIGV2ZXJ5IENvbnRlbnQgRGVzY3JpcHRpb24gb3IgUHJvY2VzcyBDb21wb25lbnQuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJBN0Q1MzAwMjA5IiBuYW1lPSJfbWV0aG9kVW5pdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFGRUQ4ODEwMUI1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyQTdENTJGMDI0MyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX25yRjhVZXlNRWR1RktKb3ZCTDY0WFEiIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX25yRjhVT3lNRWR1RktKb3ZCTDY0WFEiLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOTk0QkYwMjgyIiBuYW1lPSJQcm9jZXNzRGlhZ3JhbXMiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d3dVRsLWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxNTMzNjEyMDE1MSI+Ci0gICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzYxMjAxNTEiIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4d3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MUY2NkIwMTU1Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHh4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISzh4eHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4eC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4eU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4eWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHh5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs4eHktZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLOHh3LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLOHh4T2ZYRWR1cUhvT0piVVJaUnciIHg9IjE4MjAiIHk9IjM4NTIiIHdpZHRoPSI0OTU0IiBoZWlnaHQ9IjE3OTQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHpPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2MiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4ei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEs4eDBPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eDBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eDB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eDAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4MU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLOHgxZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISzh4emVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISzh4enVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjQxIiB5PSI3MzY2IiB3aWR0aD0iMzE0OSIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHgxdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUxRTk5NjAwOUQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eDJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLOHgydWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHgyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHgzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHgzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eDN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISzh4My1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEs4eDEtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEs4eDJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjU1NiIgeT0iNjY4IiB3aWR0aD0iMzUzMCIgaGVpZ2h0PSIxODYyIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHg0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRDBFRDAxMDQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaWNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hMR2ljZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2ljdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2ljLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2lkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaWRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITEdpZHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEs4eDRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEs4eDR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTQ1NyIgeT0iMjAzMiIgd2lkdGg9IjMzMzUiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpZC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY4NjkwMTJFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2lldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITEdpZS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2lmLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSExHaWdPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hMR2llT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMR2llZWZYRWR1cUhvT0piVVJaUnciIHg9IjQxMTQiIHk9IjEwODIwIiB3aWR0aD0iNDg3NiIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hd3VUbWVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHNob3dzIGhvdyB1bWEgZGlhZ3JhbXMgYXJlIGJhc2VkIG9uIHRoZSB1bWwyIGRpYWdyYW0gaW50ZXJjaGFuZ2UuICBUaGUgbWV0aG9kIG1vZGVsIHBhY2thZ2UgYWNjZXNzZXMgdGhlc2UgZGlhZ3JhbXMsIGJlY2F1c2UgdGhlIHByb2Nlc3MgcGFja2FnZXMgZGVmaW5lZCBpbiBtZXRob2QgbW9kZWxzIHBhY2thZ2UvY29udGFpbiB0aGUgZGlhZ3JhbXMuIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSExHaWl1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTU3NzQwMDIzRCIgc291cmNlPSJfSEs4eHd1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSExHaWQtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2lrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaWtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMR2lqdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hMR2lpLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSExHaWpPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOTQ4LCA4OTcsIC0xNDM5LCAtNjAxMV0kWzIzNjIsIDIxMjUsIC0yNSwgLTQ3ODNdJFsyMzcwLCA1NzU3LCAtMTYsIC0xMTUxXSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSExHaWt1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITEdpay1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfU2F2WWtlb2xFZHVWQTd2dDVxYklKUSIgZWxlbWVudD0iX1NhdllrT29sRWR1VkE3dnQ1cWJJSlEiIHNvdXJjZT0iX0hLOHgxdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hLOHg0T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU2F2WWxPb2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU2F2WWx1b2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TYXZZbU9vbEVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NhdllsLW9sRWR1VkE3dnQ1cWJJSlEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9TYXZZbGVvbEVkdVZBN3Z0NXFiSUpRIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9TYXZZa3VvbEVkdVZBN3Z0NXFiSUpRIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1NhdllrLW9sRWR1VkE3dnQ1cWJJSlEiIHBvaW50cz0iWzY4LCAxOCwgLTE4OSwgLTMwXSRbMjIyLCA4MSwgLTM1LCAzM10iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfeWxEM3NPeFpFZHVPTnJNUmdtejQ4QSIgZWxlbWVudD0iX3lrdzh3T3haRWR1T05yTVJnbXo0OEEiIHNvdXJjZT0iX0hLOHh3dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hLOHh6T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfeWxEM3MteFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfeWxEM3RleFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il95bEQzdC14WkVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3lsRDN0dXhaRWR1T05yTVJnbXo0OEEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il95bEQzdE94WkVkdU9Ock1SZ216NDhBIiB5PSIxMzQ5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il95bEQzc2V4WkVkdU9Ock1SZ216NDhBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3lsRDNzdXhaRWR1T05yTVJnbXo0OEEiIHBvaW50cz0iWzIsIDM1LCA1LCAtOTZdJFsxOCwgMTYzLCAyMSwgMzJdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iXzJEMXJzZXhaRWR1T05yTVJnbXo0OEEiIGVsZW1lbnQ9Il8yRDFyc094WkVkdU9Ock1SZ216NDhBIiBzb3VyY2U9Il9ISzh4MXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISzh4d3VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJEMXJ0T3haRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJEMXJ0dXhaRWR1T05yTVJnbXo0OEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMkQxcnVPeFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yRDFydC14WkVkdU9Ock1SZ216NDhBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfMkQxcnRleFpFZHVPTnJNUmdtejQ4QSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfMkQxcnN1eFpFZHVPTnJNUmdtejQ4QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il8yRDFycy14WkVkdU9Ock1SZ216NDhBIiBwb2ludHM9Ils3LCAzNiwgOCwgLTgzXSRbOTMsIDExNiwgOTQsIC0zXSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hd2JZcnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOTk0QkYwMjgyIj4KLSAgICAgICAgICA8Ym9keT4wNTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUxRTk5NjAwOUQiIG5hbWU9IlVNQURpYWdyYW1zIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d3dVRsT2ZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxNTFFOUUzMDFCOCI+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTFFOUUzMDFCOCIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTM0MDE1NiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLOHhldWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MjUwIiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4ZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhmdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs4eGYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhnT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs4eGdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhndWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs4eGctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhoT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLOHhoZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLOHhkLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEs4eGVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjIxOSIgeT0iMzgwNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTFGQUYxMDM3NiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLOHhpdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMDY0IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4amVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISzh4ai1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISzh4a2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISzh4ay1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs4eGxlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEs4eGgtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISzh4aU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTg1IiB5PSI5NTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hd3VUbHVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVU1BIHN1cHBvcnRzIHRocmVlIHR5cGVzIG9mIGRpYWdyYW1zLiBIb3dldmVyLCB0aGlzIHNwZWNpZmljYXRpb24gZG9lcyBub3QgZGVmaW5lIHRoZSBzeW50YXggb2YgdGhlc2UgZGlhZ3JhbXMsIGJ1dCByYXRoZXIgcmVsaWVzIG9uIGEgdG9vbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGV4YWN0IHByZXNlbnRhdGlvbiBvZiB0aGUgdGhyZWUgZGlhZ3JhbXMuICBVdGlsemluZyB0aGUgVU1MMiBEaWFncmFtIEludGVyY2hhbmdlIHNwZWNpZmljYXRpb24gdGhpcyBzcGVjaWZpY2F0aW9uIHByb3ZpZGVzIGFsbCBzdHJ1Y3R1cmVzIHRvIHJlcHJlc2VudCBhbmQgcGVyc2lzdCB0aGVzZSBkaWFncmFtcy4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEs4eGx1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDFFQSIgc291cmNlPSJfSEs4eGh1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEs4eGR1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eG0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhuT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISzh4bXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eG5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDNBRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eG4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEs4eG51ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTg3IiB5PSItMzM5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eG9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzNERTcwM0FEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4b3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEs4eG9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDNBMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISzh4cE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjI5IiB5PSItMjU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDNBMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEs4eHAtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI0MCIgeT0iOTAzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDNBRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs4eHJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEs4eHF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDNBMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs4eHNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEs4eHJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzNERTcwM0FEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4cy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISzh4dE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISzh4c3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDNBMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISzh4dU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISzh4dHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEs4eGwtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hLOHhtT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIDQ0OCwgMCwgLTMxMDddJFswLCAzMDIyLCAwLCAtNTMzXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d3YllzdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUxRTk5NjAwOUQiPgotICAgICAgICAgICAgPGJvZHk+MDI8L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9TYXZZa09vbEVkdVZBN3Z0NXFiSUpRIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDFFMEQwRUQwMTA0Ii8+Ci0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il8yRDFyc094WkVkdU9Ock1SZ216NDhBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDE1MUY2NkIwMTU1Ii8+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUxRkFGMTAzNzYiIG5hbWU9IlByb2Nlc3NQYWNrYWdlIj4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzM0RFNzAzQTMiIG5hbWU9ImRpYWdyYW1zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUzMEUzNDAxNTYiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzNERTcwMUVBIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3d1VGtPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3draW4tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDFFQSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE1MzNERTcwM0EzIF8zQURDN0I3NDAyMkQ0MTUzM0RFNzAzQUQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hd2tpbk9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzNERTcwMUVBIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBpcyB0aGUgb25seSBtZW1iZXIgb2YgdGhlIHVtYWRpYWdyYW1zIHBhY2thZ2UuICBJdCBkZWZpbmVzIHRoYXQgRGlhZ3JhbXMgY2FuIGJlIHBhY2thZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzNERTcwM0FEIiBuYW1lPSJfcHJvY2Vzc1BhY2thZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRTFGQUYxMDM3NiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDFFQSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d3dVRrLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d3dVRrdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfR2RwbWtlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0dkelhrT2ZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0icGF0aG1hcDovL1VNTF9QUk9GSUxFUy9TdGFuZGFyZC5wcm9maWxlLnVtbCNfeXpVNThZaW5FZHF0dmJuZkIyTF81dyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8YXBwbGllZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTF9QUk9GSUxFUy9TdGFuZGFyZC5wcm9maWxlLnVtbCNfMCIvPgotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPgotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfR2R6WGtlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0dkelhrdWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19JTjhrOE1tQkVkcUJjTjFSNkV2V1V3P0RlZmF1bHQvRGVmYXVsdD8iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGFwcGxpZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZWZhdWx0LmVweCNfYV9TM3dOV0xFZGl5NElxUDh3aGpGQT9EZWZhdWx0PyIvPgotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPgotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfR2R6WGstZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0dkelhsT2ZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlcGxveW1lbnQuZXB4I19JcmRBVU1tQkVkcUJjTjFSNkV2V1V3P0RlcGxveW1lbnQvRGVwbG95bWVudD8iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGFwcGxpZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZXBsb3ltZW50LmVweCNfdmpidXdPdkhFZGlEWDViamkwaVZTQT9EZXBsb3ltZW50PyIvPgotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPgotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfZ3FPUW9BQjJFZHVlcS1WaUxZaWV5USI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX2dxT1FvUUIyRWR1ZXEtVmlMWWlleVEiIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0icGF0aG1hcDovL1VNTF9QUk9GSUxFUy9FY29yZS5wcm9maWxlLnVtbCNfdnktSFVZaW5FZHF0dmJuZkIyTF81dyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8YXBwbGllZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTF9QUk9GSUxFUy9FY29yZS5wcm9maWxlLnVtbCNfMCIvPgotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPgotICA8L3VtbDpNb2RlbD4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaE9mQU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaEV1QXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2hZUUFPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2hPZkF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0docks4T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0doaFo5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaDBVNE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaHJLLXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2gwVTVlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2gwVTVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0doLUY0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0doMFU2T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaC1GNU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaC1GNC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2lIMjRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2gtRjUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpSDI1T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpSDI0LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaUgyNS1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaUgyNXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2lSQTB1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2lSQTBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpUkExZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpUkExT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaWF4ME9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaVJBMS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2lheDAtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2lheDB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpYXgxLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpYXgxdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaWtpME9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaWF4MnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2lraTFPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2lraTAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpa2kxLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpa2kxdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaXRzd09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaWtpMmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2l0c3ctZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2l0c3d1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpM2R3T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpdHN4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaTNkdy1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaTNkd3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2kzZHlPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2kzZHgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpM2R6T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpM2R5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HakFuc3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HakFuc2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2pBbnVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pBbnQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqQW52T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqQW51LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaktZc09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HakFud09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2pLWXRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pLWXMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqS1l0LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqS1l0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HalVKc09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaktZdWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2pkVG9PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pVSnMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqZFRwT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqZFRvLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HamRUcU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HamRUcC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2pkVHJPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pkVHEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqbkVvT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqZFRyLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ham5FcE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ham5Fby1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tEd2tPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2o1X2xPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drRHdtZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drRHdtT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha0R3b3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha0R3b2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tNNmdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tEd3F1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drTTZpZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drTTZpT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha002a3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha002a2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tXcmdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tNNm11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drV3JpZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drV3JpT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha1dya3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha1dya2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tnY2dPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tXcm11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drZ2NpZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drZ2NpT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha2dja3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha2dja2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2twbWNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tnY211ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drcG1lZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drcG1lT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha3BtZ3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha3BtZ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2t6WGNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2twbWl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drelhnT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drelhmLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HazlJY09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha3pYaU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2s5SWVlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2s5SWVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dsc3ZVT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dsaS1XZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbHN2V09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbHN2Vi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2xzdlhPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2xzdlctZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dsc3ZZT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dsc3ZYLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbDE1UU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbHN2WS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2wxNVJPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2wxNVEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dsMTVTT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dsMTVSLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbF9xUU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbDE1VGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2xfcVJPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2xfcVEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dsX3FUZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dsX3FUT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbUpiUU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbF9xVmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21KYlItZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR21KYlJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtSmJVT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtSmJULWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbVNsTU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbUpiV09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21TbE9lZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR21TbE9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtU2xRdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtU2xRZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbWNXTU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbVNsVWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21jV09lZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR21jV09PZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtY1dRdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtY1dRZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbWxnSU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbWNXU3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21sZ0tlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR21sZ0tPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtbGdNdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtbGdNZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbTVDSk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbTVDSS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR201Q0x1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR201Q0xlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duQ01FT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtNUNNZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbkNNRk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbkNNRS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR25DTUdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR25DTUYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duQ01IT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duQ01HLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hbkw5RU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbkNNSk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR25MOUdlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR25MOUdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duTDlJdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duTDlJZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HblZ1RU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hbkw5S3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR25WdUdlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR25WdUdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duZTRELWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duZTREdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hbm9wQU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbmU0Ry1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR254eThPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR25vcEJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dueHk4LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dueHk4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hbnh5OXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hbnh5OWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR254eS0tZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR254eS11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duN2o4T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dueHlfZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbjdqOC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbjdqOHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR243ajl1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR243ajllZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duN2otZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duN2otT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbjdqX09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbjdqLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29GVTlPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29GVTgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvRlU5LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvRlU5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb0ZVX09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb0ZVLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29PZTRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29GVV91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvWVA0ZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvWVA0T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb1lQOC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb1lQOHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29ZUC11ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29ZUC1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvaUE0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvWVBfdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb2lBNU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb2lBNC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29pQTZPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29pQTUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvaUE2LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvaUE2dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb3JLME9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb2lBN2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29ySzAtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29ySzB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvcksxdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvcksxZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb3JLMmVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb3JLMk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29ySzMtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29ySzN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvMDcwT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvcks0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbzA3MU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbzA3MC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR28wNzJlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR28wNzJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvMDczdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvMDczZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hby1GeE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hby1Gdy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR28tRnplZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR28tRnpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvLUYxdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvLUYxZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcEgyeWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcEgyeU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BSbndPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BIMnktZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwUm54LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwUm54dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcFJueS1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcFJueXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BSbnotZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BSbnp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwYXhzT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwUm4wdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcGF4dE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcGF4cy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BheHVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BheHQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwYXh2T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwYXh1LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcGF4d09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcGF4di1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BraXNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BheHctZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwa2l0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwa2lzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcGtpdU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcGtpdC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BraXZPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BraXUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwdVRzT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwa2l2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcHVUdE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcHVUcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3B1VHZPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3B1VHUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwdVR3T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwdVR2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcDNkb3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcDNkb2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3AzZHEtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3AzZHF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwM2R0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwM2RzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcUJPb09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcDNkdk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FCT3FlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FCT3FPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxQk9zdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxQk9zZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcUtZa09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcUJPdXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FLWW1lZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FLWW1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxS1lvdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxS1lvZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcVVKa09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcUtZcU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FVSm1lZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FVSm1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxbkVnT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxZDZrLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcW5FaU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcW5FaC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FuRWpPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FuRWktZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxbkVrT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxbkVqLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcW5FbE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcW5Fay1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3F3MWdlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3F3MWdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxdzFoZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxdzFoT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcXcxaWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcXcxaU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3F3MWplZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3F3MWpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxNm1nT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxdzFrT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcTZtaE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcTZtZy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3E2bWplZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3E2bWpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxNm1sdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxNm1sZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HckR3Yy1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HckR3Y3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3JOaGNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3JEd2UtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyTmhlZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyTmhlT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcldyWS1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcldyWXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3JXcmJPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3JXcmEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyV3JkZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyV3JkT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcmdjWi1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcmdjWnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3JxTll1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3JxTlllZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dycU5hT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dycU5aLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcnFOYk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcnFOYS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3J6WFVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3JxTmJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyelhVLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyelhVdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcnpYVi1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcnpYVnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3J6WFctZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3J6WFd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyOUlVT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyelhYZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcjlJVk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcjlJVS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3I5SVYtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3I5SVZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyOUlXdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyOUlXZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc0c1VU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcjlJWGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NHNVUtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NHNVV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzRzVXT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzRzVWLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc0c1WHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc0c1WGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NRRFJ1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NRRFJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzUURULWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzUURUdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc1FEV09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc1FEVi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NaMFR1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NaMFRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzaS1NT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzWjBWT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc2ktTk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc2ktTS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NpLU9lZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NpLU9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzaS1QZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzaS1QT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc3N2TU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc2ktUU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3Nzdk5PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3Nzdk0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzc3ZPT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzc3ZOLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc3N2UE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc3N2Ty1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3MyZ01PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NzdlFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzMmdOT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzMmdNLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HczJnUGVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HczJnUE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3MyZ1J1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3MyZ1JlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzX3FJdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzX3FJZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc19xSy1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc19xS3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NfcU5PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NfcU0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0SmJJZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0SmJJT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdEpiS3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdEpiS2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3RKYk0tZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3RKYk11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0VE1JT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0SmJPLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdFRNSi1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdFRNSnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3RUTUx1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3RUTUxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0bUhGT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0bUhFLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdG1ISE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdG1IRy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3RtSEllZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3RtSElPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0dlJBT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0bUhKT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdHZSQk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdHZSQS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3R2UkRlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3R2UkRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0NUNBT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0dlJGZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdDVDRHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdDVDRGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3Q1Q0dlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3Q1Q0dPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1Q3pBdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1Q3pBZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdUN6Q2VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdUN6Q09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VDekRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VDekMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1Q3pFZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1Q3pFT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdUw4OE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdUN6RS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VMODgtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VMODh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1TDgtT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1TDg5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdUw4LS1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdUw4LXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VWdDhPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VMOF8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1VnQ4LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1VnQ4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdVZ0OXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdVZ0OWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VWdC1lZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VWdC1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1VnRfdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1VnRfZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdWZlOE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdVZ1QXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VmZTgtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VmZTh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1ZmU5dWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1ZmU5ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdWZlLWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdWZlLU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VmZV9PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VmZS0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1b280ZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1b280T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdW9vNU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdW9vNC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VvbzZPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VvbzUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1b282LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1b282dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdXlaNE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdW9vNy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3ZZUHdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3ZQRjJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2WVB6T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2WVB5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdllQM2VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdllQM09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3ZpQXdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3ZZUDRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2aUF4T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2aUF3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdmlBeU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdmlBeC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3ZpQXp1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3ZpQXplZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2cnh3T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2aUExdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdnJ4eWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdnJ4eU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3ZyeDB1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3ZyeDBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2MDdzT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2cngyT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdjA3dC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdjA3dHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3YwN3dPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3YwN3YtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2LXNzLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2LXNzdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hd0gycHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hd0gycGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3dIMnRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3dIMnMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d3Um5vT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d3SDJ0LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hd1Juby1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hd1Jub3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3dSbnB1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3dSbnBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d3Um5xZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d3Um5xT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hd1Juci1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hd1JucnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3diWXItZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3diWXJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d3a2lrT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d3YllzdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hd2tpbmVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hd2tpbk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3c0RWtPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3d1VG9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d3NEVrLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d3NEVrdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdzRFbHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdzRFbGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3hCT2d1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3hCT2dlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d4bnJjT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d4ZDZkdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HeG5yZE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HeG5yYy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3hucmQtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3hucmR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d4bnJmT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d4bnJlLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HeG5yZ09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HeG5yZi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3h3MVlPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3hucmhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d4dzFaZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d4dzFaT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HeDZtWWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HeDZtWU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfNUdjWUNlaWVFZHVRYnVZNlV3TVNRZyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5Cb29sZWFuIiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfNUdjWURlaWVFZHVRYnVZNlV3TVNRZyIgYmFzZV9Db21tZW50PSJfNUdjWUFlaWVFZHVRYnVZNlV3TVNRZyIvPgotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX0Jhc3RNT2lmRWR1UWJ1WTZVd01TUWciIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9pN0ZUb2VpZkVkdVFidVk2VXdNU1FnIiBiYXNlX0NvbW1lbnQ9Il9pN0ZUb09pZkVkdVFidVk2VXdNU1FnIi8+Ci0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfV2UtUWtPb0ZFZHVPQlBRQTJoS3FVUSIgaW5zdGFuY2VDbGFzc05hbWU9ImludCIgYmFzZV9QcmltaXRpdmVUeXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQTQwMDdCIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfZFVjNm9lb0ZFZHVPQlBRQTJoS3FVUSIgYmFzZV9Db21tZW50PSJfZFVjNm9Pb0ZFZHVPQlBRQTJoS3FVUSIvPgotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX3YxbklzT29GRWR1T0JQUUEyaEtxVVEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuRGF0ZSIgYmFzZV9QcmltaXRpdmVUeXBlPSJfM0FEQzdCNzQwMjJENDBGNDQ5OEQwMTg1Ii8+Ci0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfN2dIQThPb0ZFZHVPQlBRQTJoS3FVUSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5MaXN0IiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il8zQURDN0I3NDAyMkQzRjA5ODk5QzAwRUEiLz4KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il9BR19GY09vR0VkdU9CUFFBMmhLcVVRIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLlNldCIgYmFzZV9QcmltaXRpdmVUeXBlPSJfM0FEQzdCNzQwMjJEM0YwOTg5QjkwMjkwIi8+Ci0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfRUlkVzBPb0dFZHVPQlBRQTJoS3FVUSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubmV0LlVSSSIgYmFzZV9QcmltaXRpdmVUeXBlPSJfM0FEQzdCNzQwMjJENDExM0VBMjkwMkZFIi8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX29naUdvT29IRWR1T0JQUUEyaEtxVVEiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA1MCIgaXNJRD0idHJ1ZSIvPgotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il81MlRmb09vSEVkdU9CUFFBMmhLcVVRIiBpc1Vuc2V0dGFibGU9InRydWUiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNDciLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfSkFJQm9Pb01FZHVPQlBRQTJoS3FVUSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfM0FEQzdCNzQwMjJENDI3QThBMUYwMkYzIi8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX0xSYUh3T29NRWR1T0JQUUEyaEtxVVEiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjlBQjk4MDJCOSIvPgotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il9OY2JOME9vTUVkdU9CUFFBMmhLcVVRIiBpc1Vuc2V0dGFibGU9InRydWUiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0NTVFNjVDODAyMTgiLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfUEZuWk1Pb01FZHVPQlBRQTJoS3FVUSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfM0FEQzdCNzQwMjJENDFERjMyMTkwMDI5Ii8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX1JXVENZT29NRWR1T0JQUUEyaEtxVVEiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQyNzk2MjVEMDIzNCIvPgotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il9VRFMwSU9vTUVkdU9CUFFBMmhLcVVRIiBpc1Vuc2V0dGFibGU9InRydWUiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MjFFNERGMzAwM0EiLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfcHd2WUFPb01FZHVPQlBRQTJoS3FVUSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfM0FEQzdCNzQwMjJENDFEREZDOEUwMEI2Ii8+Ci0gIDxFY29yZTpFUmVmZXJlbmNlIHhtaTppZD0iX3A2eDJFT29TRWR1T0JQUUEyaEtxVVEiIGlzVHJhbnNpZW50PSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIi8+Ci0gIDxFY29yZTpFUmVmZXJlbmNlIHhtaTppZD0iXzFxWHBzT29TRWR1T0JQUUEyaEtxVVEiIGlzVHJhbnNpZW50PSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY2Ii8+Ci0gIDxFY29yZTpFUmVmZXJlbmNlIHhtaTppZD0iXzRaLURnT29TRWR1T0JQUUEyaEtxVVEiIGlzVHJhbnNpZW50PSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY4Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfUDRvc1llb2VFZHVWQTd2dDVxYklKUSIgYmFzZV9Db21tZW50PSJfUDRvc1lPb2VFZHVWQTd2dDVxYklKUSIvPgotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX0NFSUhrT3gzRWR1NS12VmpsZlZzZlEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuRG91YmxlIiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il9BVXE4SU94M0VkdTUtdlZqbGZWc2ZRIi8+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC40L3VtYS5lY29yZSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvdW1hLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGI4MzY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvdW1hLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTIzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJ1bWEiCi0gICAgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5lcGYudW1hIj4KLSAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IjAzIi8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRhdGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuRGF0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIG9mIHRoZSB0eXBlIERhdGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVyaSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubmV0LlVSSSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIHRoYXQgcG9pbnQgdG8gcmVzb3VyY2VzIHN1Y2ggYXMgZmlsZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVubGltaXRlZE5hdHVyYWwiIGluc3RhbmNlQ2xhc3NOYW1lPSJpbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTdHJpbmciIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU2V0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLlNldCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlNlcXVlbmNlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkxpc3QiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJJbnRlZ2VyIiBpbnN0YW5jZUNsYXNzTmFtZT0iaW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRmxvYXQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuRmxvYXQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDbGFzc2lmaWVyIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1R5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBDbGFzc2lmaWVyLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUeXBlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZWRFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lZCBFbGVtZW50LiAgRGVmaW5lZCB0aGF0IGV2ZXJ5IGVsZW1lbnQgaGFzIGEgbmFtZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhY2thZ2VhYmxlRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTmFtZWRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZXNwYWNlICMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5hbWVzcGFjZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9OYW1lZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lc3BhY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBjbGFzcyBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcyBNZXRob2QgRWxlbWVudCBpcyB0aGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBjbGFzc2VzIGFuZCBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBldmVyeSBvdGhlciBlbGVtZW50IHR5cGUgb2YgdGhpcyBtb2RlbC4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLiAgTWV0aG9kIEVsZW1lbnQgaW5oZXJpdHMgdGhlIE5hbWUgYXR0cmlidXRlIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCdzIHN1cGVyIGNsYXNzLiAgRXZlcnkgZWxlbWVudCBkZWZpbmVkIGFzIGEgVU1BIGluc3RhbmNlIGlzIGRlcml2ZWQgZnJvbSBNb2RlbCBFbGVtZW50LiAgRXZlcnkgTWV0aG9kIEVsZW1lbnQgaW4tc3RhbmNlIGlzIGF0IGxlYXN0IGRlZmluZWQgYnkgYSB1bmlxdWUgaWQsIGEgbmFtZSwgYXMgd2VsbCBhcyBicmllZiBkZXNjcmlwdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3VpZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3duZWRSdWxlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29uc3RyYWludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kRWxlbWVudFByb3BlcnR5IgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RFbGVtZW50UHJvcGVydHkiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cHByZXNzZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSBFeHRlbmRzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHRoZW4gdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgaW5oZXJpdGVkIE1ldGhvZCBFbGVtZW50cyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCwgd2hpY2ggY2FuIGJlIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIG9uIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0aGFuIGFuIGluaGVyaXRlZCBtZXRob2QgZWxlbWVudCB0aGVuIGl0IHdpbGwgbm90IGJlIHJlZ2FyZGVkIGFzIGluaGVyaXRlZCBhdCBhbGwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9yZGVyaW5nR3VpZGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnN0cmFpbnQiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbnN0cmFpbnQgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYm9keSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgc3RvcmVzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBjb25zdHJhaW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RFbGVtZW50UHJvcGVydHkiIGVTdXBlclR5cGVzPSIjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCAjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4mI3hEOyYjeEE7Q29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb25jZXB0c0FuZFBhcGVycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29uY2VwdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGVja2xpc3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DaGVja2xpc3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3VpZGVsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4YW1wbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9FeGFtcGxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2V0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmV1c2FibGVBc3NldCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZXJtRGVmaW5pdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGVybURlZmluaXRpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50ICMvL0NsYXNzaWZpZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJhYmxlIEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgTWV0aG9kIEVsZW1lbnRzIGZvciB3aGljaCBleHRlcm5hbCBwcmVzZW50YXRpb24gbmFtZXMgYXMgd2VsbCBhcyBjb250ZW50IGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCwgc3VjaCBhcyBSb2xlcyBvciBXb3JrIFByb2R1Y3RzLiAgUHJlc2VudGF0aW9uIE5hbWUgYW5kIENvbnRlbnQgRGVzY3JpcHRpb25zIGFyZSB0eXBpY2FsbHkgbG9jYWxpemVkIHVzaW5nIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIGl0cyBTdHJpbmcgdHlwZSBhdHRyaWJ1dGVzLiYjeEQ7JiN4QTtUaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UgKHNlZSBTZWN0aW9uIDQuMS40KS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZXNlbnRhdGlvbk5hbWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAmcXVvdDtydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50JnF1b3Q7IHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICZxdW90O2oyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQmcXVvdDsgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAmcXVvdDtBcmNoaXRlY3R1cmUgRG9jdW1lbnQmcXVvdDsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRhdGlvbiIgZVR5cGU9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2hhcGVpY29uIiBlVHlwZT0iIy8vVXJpIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub2RlaWNvbiIgZVR5cGU9IiMvL1VyaSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB0cmVlIGJyb3dzZXIgcHJlc2VudGF0aW9ucyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgRGVzY3JpcHRpb24gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQ29udGVudCBFbGVtZW50LiAgSXQgZGVmaW5lcyBzdGFuZGFyZCBhdHRyaWJ1dGVzIGFwcGxpY2FibGUgZm9yIGFsbCBDb250ZW50IEVsZW1lbnQgdHlwZXMuICBTcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgc3ViLXR5cGVzIGNhbiBkZWZpbmUgdGhlaXIgb3duIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gc3ViLXR5cGVzLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBzdG9yZSB0aGUgbWFpbiBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgQ29udGVudCBFbGVtZW50LiAgQWxsIHRleHQgdGhhdCBpcyBub3QgcGFydCBvZiBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgYXR0cmlidXRlcyBzaGFsbCBiZSBzdG9yZWQgaGVyZS4gIElmIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGlzIGRpdmlkZWQgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgU2VjdGlvbiBjbGFzcywgdGhlbiBvbmx5IHRoZSB0ZXh0IGZyb20gdGhlICdzdGFydCcgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gdG8gdGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBzdG9yZWQgaGVyZSAoc2ltaWxhciB0byBhIG5vcm1hbCBkb2N1bWVudCB3aGVyZSB5b3UgY2FuIHBsYWNlIHRleHQgYmV0d2VlbiBpdHMgYmVnaW5uaW5nIHRvIGl0cyBmaXJzdCBkaWN0aW9uIGhlYWRpbmcpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWN0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxJZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGFydGlmYWN0LiBVc2VkIGxpa2UgYSBzeW5vbnltLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJrZXlDb25zaWRlcmF0aW9ucyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iS2V5IENvbnNpZGVyYXRpb25zIHByb3ZpZGVzIGFkdmlzZSBhbmQgZ3VpZGFuY2Ugb2YgYSBjcml0aWNhbCBuYXR1cmUgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbCBhcyB3YXJuaW5ncywgY2F1dGlvbnMsIHBpdGZhbGxzLCBkYW5nZXJzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZWN0aW9uIiBlU3VwZXJUeXBlcz0iIy8vVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFNlY3Rpb24gaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlY3Rpb25OYW1lIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlY3Rpb25EZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJTZWN0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZGVjZXNzb3IiIGVUeXBlPSIjLy9TZWN0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIGlzIGEgY29udGVudCBlbGVtZW50IHRoYXQgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcy4gIFJvbGVzIGFyZSB1c2VkIGJ5IFRhc2tzIHRvIGRlZmluZSB3aG8gcGVyZm9ybXMgdGhlbSBhcyB3ZWxsIGFzIGRlZmluZSBhIHNldCBvZiB3b3JrIHByb2R1Y3RzIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gICYjeEQ7JiN4QTtBIFJvbGUgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcyBvZiBhbiBpbmRpdmlkdWFsIG9yIGEgc2V0IG9mIGluZGl2aWR1YWxzLiAgUm9sZXMgYXJlIG5vdCBpbmRpdmlkdWFscyBvciByZXNvdXJjZXMuICBJbmRpdmlkdWFsIG1lbWJlcnMgb2YgdGhlIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiB3aWxsIHdlYXIgZGlmZmVyZW50IGhhdHMsIG9yIHBlcmZvcm0gZGlmZmVyZW50IHJvbGVzLiBUaGUgbWFwcGluZyBmcm9tIGluZGl2aWR1YWwgdG8gcm9sZSwgcGVyZm9ybWVkIGJ5IHRoZSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhbmQgc3RhZmZpbmcgZm9yIGEgcHJvamVjdCwgYWxsb3dzIGRpZmZlcmVudCBpbmRpdmlkdWFscyB0byBhY3QgYXMgc2V2ZXJhbCBkaWZmZXJlbnQgcm9sZXMsIGFuZCBmb3IgYSByb2xlIHRvIGJlIHBsYXllZCBieSBzZXZlcmFsIGluZGl2aWR1YWxzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2RpZmllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc3BvbnNpYmxlRm9yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBQcm9kdWN0IGlzIGFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLiYjeEQ7JiN4QTtBIHdvcmsgcHJvZHVjdCBpcyBhbiBhYnN0cmFjdGlvbiBmb3IgZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IGEgdGFzay4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVwb3J0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVwb3J0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRlbXBsYXRlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGVtcGxhdGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idG9vbE1lbnRvcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rvb2xNZW50b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFzayIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50ICMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRhc2sgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd29yayBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBJdCBkZWZpbmVzIG9uZSBkZWZhdWx0IHBlcmZvcm1pbmcgUm9sZSBhcyB3ZWxsIGFzIG1hbnkgYWRkaXRpb25hbCBwZXJmb3JtZXJzLiAgQSBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiAgSW5wdXRzIGFyZSBkaWZmZXJlbnRpYXRlZCBpbiBtYW5kYXRvcnkgdmVyc3VzIG9wdGlvbmFsIGlucHV0cy4gIFRoZSBhc3NvY2lhdGlvbnMgdG8gV29yayBQcm9kdWN0cyBhcmUgbm90IGluc3RhbnRpYXRhYmxlL3ZhcmlhYmxlLWxpa2UgcGFyYW1ldGVycy4gIFRoZXkgcmF0aGVyIGV4cHJlc3MgKGh5cGVyLSlsaW5rcyB0byB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSB3b3JrIHByb2R1Y3RzIHR5cGVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIFRhc2sgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiAgSW4gb3RoZXIgd29yZHMsIHRoZXNlIGFzc29jaWF0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY2FwdHVyZSB3aGljaCBjb25jcmV0ZSBpbnN0YW5jZXMgd2lsbCBiZSBwYXNzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBtZXRob2QgaW4gYSBwcm9qZWN0LiAgQWxsIG9mIHRoZSBUYXNrJ3MgZGVmYXVsdCBhc3NvY2lhdGlvbnMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYW4gYWN0dWFsIHByb2Nlc3MgZGVmaW5pdGlvbi4mI3hEOyYjeEE7QSBUYXNrIGRlc2NyaWJlcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gc3BlY2lmaWMgUm9sZXMuICBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzLiAgSXQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMuIEEgVGFzayBpcyB1c2VkIGFzIGFuIGVsZW1lbnQgb2YgZGVmaW5pbmcgYSBwcm9jZXNzLiBUYXNrcyBhcmUgZnVydGhlciB1c2VkIGZvciBwbGFubmluZyBhbmQgdHJhY2tpbmcgcHJvZ3Jlc3M7IHRoZXJlZm9yZSwgaWYgdGhleSBhcmUgZGVmaW5lZCB0b28gZmluZS1ncmFpbmVkLCB0aGV5IHdpbGwgYmUgbmVnbGVjdGVkLCBhbmQgaWYgdGhleSBhcmUgdG9vIGxhcmdlLCBwcm9ncmVzcyB3b3VsZCBoYXZlIHRvIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIFRhc2sncyBwYXJ0cyAoZS5nLiBTdGVwcywgd2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4gJiN4RDsmI3hBO0EgVGFzayBoYXMgYSBjbGVhciBwdXJwb3NlIGluIHdoaWNoIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFjaGlldmUgYSB3ZWxsIGRlZmluZWQgZ29hbC4gIEl0IHByb3ZpZGVzIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgb2YgZG9pbmcgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBhY2hpZXZlIHRoaXMgZ29hbC4gIFRoaXMgZGVzY3JpcHRpb24gaXMgY29tcGxldGUsIGluZGVwZW5kZW50IG9mIHdoZW4gaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSB0aGUgd29yayB3b3VsZCBhY3R1YWxseSBiZSBkb25lLiAgSXQgdGhlcmVmb3JlIGRvZXMgbm90IGRlc2NyaWJlIHdoZW4geW91IGRvIHdoYXQgd29yayBhdCB3aGF0IHBvaW50IG9mIHRpbWUsIGJ1dCBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgZ2V0cyBkb25lIHRocm91Z2hvdXQgdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZSB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBhY2hpZXZlbWVudCBvZiB0aGlzIGdvYWwuICBXaGVuIHRoZSBUYXNrIGlzIGJlaW5nIGFwcGxpZWQgaW4gYSBwcm9jZXNzIHRoZW4gdGhpcyBwcm9jZXNzIGFwcGxpY2F0aW9uIChkZWZpbmVkIGFzIFRhc2sgRGVzY3JpcHRvcikgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHdoaWNoIHBpZWNlcyBvZiB0aGUgVGFzayB3aWxsIGFjdHVhbGx5IGJlIHBlcmZvcm1lZCBhdCBhbnkgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgVGFzayB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgcHJvY2VzcyBvdmVyIGFuZCBvdmVyIGFnYWluLCBidXQgZWFjaCB0aW1lIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgZW1waGFzaXMgb24gZGlmZmVyZW50IHN0ZXBzIG9yIGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRpb24uICYjeEQ7JiN4QTtGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV2ZWxvcCBVc2UgQ2FzZSBNb2RlbCZxdW90OyBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICZxdW90O21ldGhvZCZxdW90OyBvZiBEZXZlbG9waW5nIGEgVXNlIENhc2UgTW9kZWwuICBBcHBseWluZyBzdWNoIGEgbWV0aG9kIGluIGEgbGlmZWN5Y2xlIChpLmUuIGluIGEgcHJvY2VzcykgaXMgZGVmaW5pbmcgd2hpY2ggc3RlcHMgYXJlIGRvbmUgd2hlbiBnb2luZyBmcm9tIG9uZSBpdGVyYXRpb24gdG8gdGhlIG5leHQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBlcmZvcm1lZEJ5IiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0cHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvcHRpb25hbElucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdGVwcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3RlcCIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiCi0gICAgICAgIGRlcml2ZWQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idG9vbE1lbnRvcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rvb2xNZW50b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0RlZmluaXRpb24iIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBEZWZpbml0aW9uIGlzIGFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuJiN4RDsmI3hBO1dvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlY29uZGl0aW9uIiBlVHlwZT0iIy8vQ29uc3RyYWludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9zdGNvbmRpdGlvbiIgZVR5cGU9IiMvL0NvbnN0cmFpbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0ZXAiIGVTdXBlclR5cGVzPSIjLy9TZWN0aW9uICMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFN0ZXAgaXMgYSBTZWN0aW9uIGFuZCBXb3JrIERlZmluaXRpb24gdGhhdCBpcyB1c2VkIHRvIG9yZ2FuaXplIFRhc2tzIGludG8gcGFydHMgb3Igc3VidW5pdHMgb2Ygd29yay4gIFN0ZXBzIGluaGVyaXQgdGhlIHN1YlNlY3Rpb25zIGRlY29tcG9zaXRpb24gZnJvbSBTZWN0aW9uIGFuZCBjYW4gdGhlcmVmb3JlIGRlc2NyaWJlIFN1Yi1TdGVwcyBuZXN0ZWQgaW50byBTdGVwcy4mI3hEOyYjeEE7QSBTdGVwIGRlc2NyaWJlcyBhIG1lYW5pbmdmdWwgYW5kIGNvbnNpc3QgcGFydCBvZiB0aGUgb3ZlcmFsbCB3b3JrIGRlc2NyaWJlZCBmb3IgYSBUYXNrLiAgVGhlIGNvbGxlY3Rpb24gb2YgU3RlcHMgZGVmaW5lZCBmb3IgYSBUYXNrIHJlcHJlc2VudHMgYWxsIHRoZSB3b3JrIHRoYXQgc2hvdWxkIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGUgb3ZlcmFsbCBkZXZlbG9wbWVudCBnb2FsIG9mIHRoZSBUYXNrLiAgTm90IGFsbCBzdGVwcyBhcmUgbmVjZXNzYXJpbHkgcGVyZm9ybWVkIGVhY2ggdGltZSBhIFRhc2sgaXMgaW52b2tlZCBpbiBhIFByb2Nlc3MgKHNlZSBUYXNrIERlc2NyaXB0b3IpLCBzbyB0aGV5IGNhbiBhbHNvIGJlIGV4cHJlc3NlZCBpbiB0aGUgZm9ybSBvZiBhbHRlcm5hdGUgJ2Zsb3dzJyBvZiB3b3JrLiAgRGlmZmVyZW50IHdheXMgb2YgYWNoaWV2aW5nIHRoZSBzYW1lIGRldmVsb3BtZW50IGdvYWwgY2FuIHRoZW4gYmUgJ2Fzc2VtYmxlZCcgYnkgc2VsZWN0aW5nIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2Ygc3RlcHMgd2hlbiBhcHBseWluZyB0aGUgVGFzayBpbiBhIFByb2Nlc3MuICBUeXBpY2FsIGtpbmRzIG9mIHN0ZXBzIGEgVGFzayBhdXRob3Igc2hvdWxkIGNvbnNpZGVyIGFyZTogVGhpbmtpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIHVuZGVyc3RhbmQgdGhlIG5hdHVyZSBvZiB0aGUgdGFzaywgZ2F0aGVycyBhbmQgZXhhbWluZXMgdGhlIGlucHV0IGFydGlmYWN0cywgYW5kIGZvcm11bGF0ZXMgdGhlIG91dGNvbWUuIFBlcmZvcm1pbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGNyZWF0ZSBvciB1cGRhdGUgc29tZSBhcnRpZmFjdHMuIFJldmlld2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgaW5zcGVjdHMgdGhlIHJlc3VsdHMgYWdhaW5zdCBzb21lIGNyaXRlcmlhLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkYW5jZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR3VpZGFuY2UgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFza3MsIGFuZCBXb3JrIFByb2R1Y3RzLiAgRXhhbXBsZXMgZm9yIEd1aWRhbmNlIGFyZSBHdWlkZWxpbmVzLCBUZW1wbGF0ZXMsIENoZWNrbGlzdHMsIFRvb2wgTWVudG9ycywgRXN0aW1hdGVzLCBTdXBwb3J0aW5nIE1hdGVyaWFscywgUmVwb3J0cywgQ29uY2VwdHMsIGV0Yy4gIFRoaXMgcGFja2FnZSBvbmx5IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhYnN0cmFjdCBHdWlkYW5jZSBjbGFzcy4gIFRoZSBwYWNrYWdlIEd1aWRhbmNlIFR5cGVzIGRlZmluZXMgY29uY3JldGUgZ3VpZGFuY2UgdHlwZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFydGlmYWN0IiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFydGlmYWN0IGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgdGFuZ2libGUgd29yayBwcm9kdWN0IHR5cGVzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwgYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuJiN4RDsmI3hBO0FydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAmcXVvdDtvd24mcXVvdDsgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVyQXJ0aWZhY3QiIGVUeXBlPSIjLy9BcnRpZmFjdCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0FydGlmYWN0L2NvbnRhaW5lZEFydGlmYWN0cyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZWRBcnRpZmFjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0FydGlmYWN0IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9BcnRpZmFjdC9jb250YWluZXJBcnRpZmFjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyYWJsZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGRlbGl2ZXJhYmxlIGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVsaXZlcmVkV29ya1Byb2R1Y3RzIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRjb21lIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIG91dGNvbWUgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kUGFja2FnZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFBhY2thZ2UgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2xvYmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJNZXRob2QgUGFja2FnZXMgY2FuIGhhdmUgYSBnbG9iYWwgc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZWxlbWVudCBvZiBldmVyeSBvdGhlciBNZXRob2QgUGFja2FnZSBjYW4gc2VlIHRoZSBnbG9iYWwgcGFja2FnZSdzIGNvbnRlbnRzLiAgR2xvYmFsIE1ldGhvZCBQYWNrYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gc3RvcmUgY29tbW9ubHkgdXNlZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBzdWNoIGFzIGZvciBEaXNjaXBsaW5lcyBvciBEb21haW5zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMgcmVzcGVjdGl2ZWx5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXVzZWRQYWNrYWdlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGlsZFBhY2thZ2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50UGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFBhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29udGVudCBQYWNrYWdlIGlzIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRlbnRFbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudEVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFydGlmYWN0RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYnJpZWZPdXRsaW5lIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXByZXNlbnRhdGlvbk9wdGlvbnMiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVwcmVzZW50YXRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub3RhdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBhY3RPZk5vdEhhdmluZyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVhc29uc0Zvck5vdE5lZWRpbmciIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJza2lsbHMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXNzaWdubWVudEFwcHJvYWNoZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3lub255bXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdGVybmF0aXZlcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXR0YWNobWVudHMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFkZGl0aW9uYWxJbmZvIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvYmxlbSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGUgUHJhY3RpY2UgYWRkcmVzc2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiYWNrZ3JvdW5kIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdvYWxzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXBwbGljYXRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbHNPZkFkb3B0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb2ludCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IngiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3NpdGlvbiIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZWQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW1FbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtRWxlbWVudC9jb250YWluZXIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGluayIgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRGlhZ3JhbUxpbmsiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1MaW5rL2dyYXBoRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhbmNob3JhZ2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0dyYXBoQ29ubmVjdG9yIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VtYW50aWNNb2RlbCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZ3JhcGhFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW1FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1Zpc2libGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lciIgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9jb250YWluZWQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZWZlcmVuY2UiIGVPcHBvc2l0ZT0iIy8vUmVmZXJlbmNlL3JlZmVyZW5jZWQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvcGVydHkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtTGluayIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iem9vbSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2aWV3cG9ydCIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvbGluayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRGlhZ3JhbSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtL2RpYWdyYW1MaW5rIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoQ29ubmVjdG9yIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L2FuY2hvcmFnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVkZ2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0dyYXBoRWRnZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVkZ2UvYW5jaG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlbWFudGljTW9kZWxCcmlkZ2UiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlc2VudGF0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L3NlbWFudGljTW9kZWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbSIgZVR5cGU9IiMvL0RpYWdyYW0iCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtL25hbWVzcGFjZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaW1lbnNpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3aWR0aCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoZWlnaHQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVmZXJlbmNlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlZCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW1FbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1FbGVtZW50L3JlZmVyZW5jZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9wZXJ0eSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2V5IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaEVkZ2UiIGVTdXBlclR5cGVzPSIjLy9HcmFwaEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhbmNob3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIyIiB1cHBlckJvdW5kPSIyIiBlVHlwZT0iIy8vR3JhcGhDb25uZWN0b3IiIGVPcHBvc2l0ZT0iIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFZGdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndheXBvaW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjIiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUG9pbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW0iIGVTdXBlclR5cGVzPSIjLy9HcmFwaE5vZGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ6b29tIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZpZXdwb2ludCIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtTGluayIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlhZ3JhbUxpbmsiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUxpbmsvZGlhZ3JhbSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lc3BhY2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2RpYWdyYW0iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhOb2RlIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2l6ZSIgZVR5cGU9IiMvL0RpbWVuc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZUluZm8iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9FbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxlYWZFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGV4dEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRleHQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbWFnZSIgZVN1cGVyVHlwZXM9IiMvL0xlYWZFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJpIiBlVHlwZT0iIy8vVXJpIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbWVUeXBlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhpY1ByaW1pdGl2ZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvbHlsaW5lIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhpY1ByaW1pdGl2ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsb3NlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2F5cG9pbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMiIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qb2ludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRWxsaXBzZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoaWNQcmltaXRpdmUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYWRpdXNYIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhZGl1c1kiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm90YXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnRBbmdsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbmRBbmdsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjZW50ZXIiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWN0aXZpdHkiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCAjLy9WYXJpYWJpbGl0eUVsZW1lbnQgIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIEFjdGl2aXR5IGlzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4mI3hEOyYjeEE7QWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJyZWFrZG93bkVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0JyZWFrZG93bkVsZW1lbnQvc3VwZXJBY3Rpdml0aWVzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvYWRtYXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2FkbWFwIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGVja2xpc3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DaGVja2xpc3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uY2VwdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbmNlcHQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhhbXBsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0V4YW1wbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3VpZGVsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJldXNhYmxlQXNzZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzRW5hY3RhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgV29yayBCcmVha2Rvd24gRWxlbWVudCBpcyBhIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1JlcGVhdGFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09uZ29pbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0V2ZW50RHJpdmVuIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGlua1RvUHJlZGVjZXNzb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtPcmRlciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJCcmVha2Rvd24gRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEl0IGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWZpeCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gJnF1b3Q7U1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMmcXVvdDsgd2l0aCBTUkEgaW5kaWNhdGluZyB0aGF0IHRoaXMgQWN0aXZpdHkgYmVsb25ncyB0byB0aGUgJnF1b3Q7U29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzJnF1b3Q7IG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICZxdW90O0N1c3RvbWVyLkFyY2hpdGVjdCZxdW90OyB3b3VsZCBkZWZpbmUgYSAmcXVvdDtDdXN0b21lciZxdW90OyBwcmVmaXggZm9yIHRoZSBSb2xlIERlc2NyaXB0b3IgJnF1b3Q7QXJjaGl0ZWN0JnF1b3Q7IGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzUGxhbm5lZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuJiN4RDsmI3hBOyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXRhaWwgVXNlIENhc2UmcXVvdDsgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzT3B0aW9uYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpc09wdGlvbmFsIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlc2VudGVkQWZ0ZXIiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRlZEJlZm9yZSIgZVR5cGU9IiMvL0JyZWFrZG93bkVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGxhbm5pbmdEYXRhIiBlVHlwZT0iIy8vUGxhbm5pbmdEYXRhIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBlckFjdGl2aXRpZXMiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9BY3Rpdml0eSIgZU9wcG9zaXRlPSIjLy9BY3Rpdml0eS9icmVha2Rvd25FbGVtZW50cyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNaWxlc3RvbmUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNaWxlc3RvbmUgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJdGVyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSXRlcmF0aW9uIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuJiN4RDsmI3hBO0l0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQaGFzZSIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQaGFzZSBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLiYjeEQ7JiN4QTtQaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVhbVByb2ZpbGUiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRlYW0gUHJvZmlsZSBpcyBhIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuJiN4RDsmI3hBO1dvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4mI3hEOyYjeEE7SGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZWFtUm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cGVyVGVhbSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1RlYW1Qcm9maWxlIiBlT3Bwb3NpdGU9IiMvL1RlYW1Qcm9maWxlL3N1YlRlYW0iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViVGVhbSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGVhbVByb2ZpbGUiIGVPcHBvc2l0ZT0iIy8vVGVhbVByb2ZpbGUvc3VwZXJUZWFtIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJSb2xlIiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2RpZmllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBPcmRlciByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEIpIGJlbG93KSBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEEpIGJlbG93KSBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9TdGFydCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9GaW5pc2giIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvU3RhcnQiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvRmluaXNoIiB2YWx1ZT0iMyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrT3JkZXIiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBPcmRlciBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgJiN4RDsmI3hBOyhOb3RlLCBXb3JrIE9yZGVyIGlzIG5vdCBtb2RlbGVkIGFzIGFuIEFzc29jaWF0aW9uIENsYXNzIHRvIHByb3ZpZGUgYSBzdHJhaWdodGZvcndhcmQgbWFwcGluZyAgdG8gWE1JIGFuZCBFTUYuKSYjeEQ7JiN4QTtUaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rVHlwZSIgZVR5cGU9IiMvL1dvcmtPcmRlclR5cGUiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZpbmlzaFRvU3RhcnQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZCIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvY2VzcyBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuJiN4RDsmI3hBO1Byb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGxhbm5pbmdEYXRhIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlBsYW5uaW5nIERhdGEgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4mI3hEOyYjeEE7UGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LiYjeEQ7JiN4QTsoTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydERhdGUiIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoRGF0ZSIgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFuayIgZVR5cGU9IiMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVzY3JpcHRvciBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuJiN4RDsmI3hBO0Rlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZpdHlFbnRyeVN0YXRlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgJiN4RDsmI3hBO0ZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLiYjeEQ7JiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IldvcmtQcm9kdWN0IiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW1wYWN0ZWRCeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltcGFjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0ZWRCeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyYWJsZVBhcnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza0Rlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCAjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRhc2sgRGVzY3JpcHRvciBpcyBhIERlc2NyaXB0b3IgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4mI3hEOyYjeEE7QSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJUYXNrIiBlVHlwZT0iIy8vVGFzayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzaXN0ZWRCeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZXJuYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dHB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBlcmZvcm1lZFByaW1hcmlseUJ5IiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VsZWN0ZWRTdGVwcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb21wb3NpdGVSb2xlIiBlU3VwZXJUeXBlcz0iIy8vUm9sZURlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29tcG9zaXRlIFJvbGUgaXMgYSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuJiN4RDsmI3hBO0EgQ29tcG9zaXRlIFJvbGUgaXMgYSBncm91cGluZyBvZiBSb2xlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIEFjdGl2aXR5IG9yIFByb2Nlc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgUm9sZXMuICBBIHR5cGljYWwgYXBwbGljYXRpb24gd291bGQgYmUgYSBwcm9jZXNzIGZvciBhIHNtYWxsIHRlYW0gaW4gd2hpY2ggYSBzdGFuZGFyZCBzZXQgb2Ygcm9sZXMgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQgd291bGQgYmUgYWxsIHBlcmZvcm1lZCBieSBvbmUgb3IgbW9yZSByZXNvdXJjZS4gIEJ5IHVzaW5nIENvbXBvc2l0ZSBSb2xlIHRoZSBwcm9jZXNzIHdvdWxkIHN1Z2dlc3QgYSB0eXBpY2FsIGNsdXN0ZXJpbmcgb2YgUm9sZXMgdG8gUmVzb3VyY2VzLiAgQSBDb21wb3NpdGUgUm9sZSBjb3VsZCBwZXJmb3JtIGFsbCBUYXNrcyBkZWZpbmVkIGZvciB0aGUgUm9sZXMgaXQgcmVmZXJzIHRvLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZ2dyZWdhdGVkUm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+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+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NvcGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+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+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvY2VzcyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1Byb2Nlc3MiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvY2VzcyBQYWNrYWdlIGlzIGEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIFByb2Nlc3MgRWxlbWVudHMsIG9ubHkuJiN4RDsmI3hBO0Ega2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3NFbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvY2Vzc0VsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpYWdyYW1zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaWFncmFtIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2UgY29tcHJpc2VzIG9mIGEgbGlzdCBvZiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgKHNpbWlsYXIgdG8gb3BlcmF0aW9uIGRlY2xhcmF0aW9ucykgdGhhdCBleHByZXNzIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudC4gIFRoZXNlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyBhcmUgZXhwcmVzc2VkIHVzaW5nIFRhc2sgRGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBhIFJvbGUgRGVzY3JpcHRvci4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VJTyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgUHJvY2VzcyBDb21wb25lbnQgYXBwbGljYXRpb24gaW4gYSBQcm9jZXNzLCBpLmUuIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluaW5nIHRoZSBQcm9jZXNzLiAgVGhlIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgZGV0YWlscyBvZiB0aGUgY29tcG9uZW50IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgdG8gcHJvdmlkZSBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzIHN1Y2ggYXMgaXQgb3duIHByZWRlY2Vzc29ycyBhbmQgc3VjY2Vzc29ycy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1Byb2Nlc3NDb21wb25lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kUGx1Z2luIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCAjLy9QYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBQbHVnaW4gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuJiN4RDsmI3hBO01ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLiYjeEQ7JiN4QTtTcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2VyQ2hhbmdlYWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGFja2FnZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmFyaWFiaWxpdHlFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGNsYXNzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudCB0aGF0IHByb3ZpZGVzIG5ldyBjYXBhYmlsaXRpZXMgZm9yIGNvbnRlbnQgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gQ29udGVudCBFbGVtZW50cyBvciBhbnkgb3RoZXIgTWV0aG9kIEVsZW1lbnQgdGhhdCBkZXJpdmVzIGZyb20gaXQuICBJdCBoYXMgYmVlbiBwbGFjZWQgaW4tYmV0d2VlbiB0aGUgY2xhc3NlcyBNZXRob2QgRWxlbWVudCBhbmQgQ29udGVudCBFbGVtZW50IGluIHRoZSBvdmVyYWxsIFVNQSB0YXhvbm9teSBvZiBjbGFzc2VzIHVzaW5nIHRoZSBVTUwgMi4wIHBhY2thZ2UgbWVyZ2UgbWVjaGFuaXNtLiAgVGhlIGFzc29jaWF0aW9uIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHNoYWxsIG9ubHkgYmUgaW5zdGFudGlhdGVkIGJldHdlZW4gdHdvIHN1YmNsYXNzZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgc2FtZSB0eXBlLiAgVGhlIGVsZW1lbnQgb24gdmFyYWliaWxpdHlTcGVjaWFsRWxlbWVudCBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgZGVmaW5lcyBhIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZSBkZWZpbmluZyB0aGUgbmF0dXJlIG9mIHRoZSByZWxhdGlvbnNoaXAgdXNpbmcgYSBsaXRlcmFsIGZyb20gdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuJiN4RDsmI3hBO1ZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIG1ldGEtbW9kZWwgcGFja2FnZSBNZXRob2QgUGx1Z2lucyBhZGRzIHRoZSBjYXBhYmlsaXRpZXMgb2YgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gTWV0aG9kIEVsZW1lbnRzIHRoYXQgZGVyaXZlIGZyb20gaXQuICBCeSBkZWZhdWx0IGFsbCBDb250ZW50IEVsZW1lbnRzIHN1Y2ggYXMgUm9sZSwgVGFzaywgR3VpZGFuY2UgVHlwZXMsIG9yIEFjdGl2aXRpZXMgYXJlIGRlZmluZWQgdG8gYmUgVmFyaWFiaWxpdHkgRWxlbWVudHMuJiN4RDsmI3hBO1ZhcmlhYmlsaXR5IGFuZCBleHRlbnNpb24gcHJvdmlkZXMgdW5pcXVlIG1lY2hhbmlzbXMgZm9yIGN1c3RvbWl6aW5nIG1ldGhvZCBjb250ZW50IHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LCBidXQgYnkganVzdCBiZSBhYmxlIHRvIGRlc2NyaWJlIHdpdGggc2VwYXJhdGUgb2JqZWN0cyB0aGUgZGlmZmVyZW5jZXMgKGFkZGl0aW9ucywgY2hhbmdlcywgb21pc3Npb25zKSByZWxhdGl2ZSB0byB0aGUgb3JpZ2luYWwuICBUaGlzIHBsdWctaW4gY29uY2VwdCBhbGxvd3MgdXNlcnMgdG8gZmFjdG9yIHRoZWlyIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gaW50ZXJyZWxhdGVkIHVuaXRzIGFuZCBldmVuIHRvIGFyY2hpdGVjdCBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGxheWVycyB0aGF0IGV4dGVuZCBlYWNoIG90aGVyIHdpdGggbmV3IGNhcGFiaWxpdGllcy4gIFRoZSByZXN1bHRpbmcgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2lnbiBjYW4gYmUgZHluYW1pY2FsbHkgY29tYmluZWQgYW5kIGFwcGxpZWQgb24gZGVtYW5kIHVzaW5nIHRoZSBpbnRlcnByZXRhdGlvbiBydWxlcyBkZWZpbmVkIGZvciBWYXJpYWJpbGl0eSBFbGVtZW50IFNwZWNpYWxpemF0aW9ucyBhc3NlbWJsaW5nIHRvIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0aGUgbW9zdCBhY2N1cmF0ZSBtZXRob2QgYW5kIHByb2Nlc3MgZGVzY3JpcHRpb25zIHBvc3NpYmxlLiAgSXQgYWxzbyBhbGxvd3MgcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRvIGV4dGVuZHMgYW5kIHRhaWxvciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIHRoZXkgZG8gbm90IG93biBhbmQgdG8gZWFzaWx5IHVwZ3JhZGUgdG8gbmV3ZXIgdmVyc2lvbnMgYnkgc2ltcGx5IHJlYXBwbHkgdGhlaXIgcGVyc29uYWwgY2hhbmdlcyB0byB0aGVzZSB1cGdyYWRlcy4mI3hEOyYjeEE7VmFyaWFiaWxpdHkgRWxlbWVudCBkZWZpbmVzIHR3byB0eXBlcyBvZiB2YXJpYWJpbGl0eSBhbmQgb25lIHR5cGUgb2YgZXh0ZW5zaW9uIHdoaWNoIGFyZSBmb3JtYWxseSBkZWZpbmVkIGZvciB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiBlVHlwZT0iIy8vVmFyaWFiaWxpdHlUeXBlIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJuYSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIGluIGluc3RhbmNlIG9mIHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxpemF0aW9uIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIFZhcmlhYmlsaXR5IEVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUgZXhpc3RzLCB0aGVuIHRoZSB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHNwZWNpZmllcyBob3cgdGhlIGVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbEVsZW1lbnQgZW5kIG9mIHRoZSBhc3NvY2lhdGlvbiBjaGFuZ2VzIHRoZSBDb250ZW50IEVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgZW5kLiBTZWUgdGhlIFZhcmlhYmlsaXR5IFR5cGUgZW51bWVyYXRpb24gY2xhc3MgZm9yIGRlZmluaXRpb25zIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHZhcmlhYmlsaXR5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vVmFyaWFiaWxpdHlFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iVmFyaWFiaWxpdHlUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJWYXJpYWJpbGl0eSBUeXBlIGlzIGFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Im5hIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJjb250cmlidXRlcyIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImV4dGVuZHMiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJyZXBsYWNlcyIgdmFsdWU9IjMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImxvY2FsQ29udHJpYnV0aW9uIiB2YWx1ZT0iNCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibG9jYWxSZXBsYWNlbWVudCIgdmFsdWU9IjUiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImV4dGVuZHNSZXBsYWNlcyIgdmFsdWU9IjYiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kVW5pdCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBVbml0IGlzIGEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0aG9ycyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEYXRlIiBlVHlwZT0iIy8vRGF0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcnNpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb3B5cmlnaHRTdGF0ZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIENvbmZpZ3VyYXRpb24gaXMgYSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBsdWdpblNlbGVjdGlvbiIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGx1Z2luIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvY2Vzc1ZpZXdzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVmYXVsdFZpZXciIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZUNvbmZpZ3VyYXRpb25zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YnRyYWN0ZWRDYXRlZ29yeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFkZGVkQ2F0ZWdvcnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRmFtaWx5IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZWxpdmVyeSBNb2RlbCBGYW1pbHkgaXMgYSBjb252ZW5pZW50IGdyb3VwaW5nIG9mIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyBvZiBpbnRlcmVzdCB0byBzb21lIHNwZWNpZmljIHVzZXIgY29tbXVuaXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyeVByb2Nlc3NlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGVsaXZlcnlQcm9jZXNzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZExpYnJhcnkiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQbHVnaW5zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlZmluZWRDb25maWd1cmF0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNC91bWEuZW14IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNC91bWEuZW14CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjc2OTMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvdW1hLmVteAorKysgL2Rldi9udWxsCkBAIC0xLDMzMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS14dG9vbHMyX3VuaXZlcnNhbF90eXBlX21hbmFnZXItLT4KLTw/Y29tLmlibS54dG9vbHMuZW1mLmNvcmUuc2lnbmF0dXJlIDxzaWduYXR1cmUgaWQ9ImNvbS5pYm0ueHRvb2xzLnVtbC5tc2wubW9kZWwiIHZlcnNpb249IjcuMC4wIj48ZmVhdHVyZSBkZXNjcmlwdGlvbj0iIiBuYW1lPSJjb20uaWJtLnh0b29scy5ydW1sLmZlYXR1cmUiIHVybD0iIiB2ZXJzaW9uPSI3LjAuMCIvPjwvc2lnbmF0dXJlPj8+Ci08P2NvbS5pYm0ueHRvb2xzLmVtZi5jb3JlLnNpZ25hdHVyZSA8c2lnbmF0dXJlIGlkPSJjb20uaWJtLnh0b29scy5tbWkudWkuc2lnbmF0dXJlcy5kaWFncmFtIiB2ZXJzaW9uPSI3LjAuMCI+PGZlYXR1cmUgZGVzY3JpcHRpb249IiIgbmFtZT0iUmF0aW9uYWwgTW9kZWxpbmcgUGxhdGZvcm0gKGNvbS5pYm0ueHRvb2xzLnJtcCkiIHVybD0iIiB2ZXJzaW9uPSI3LjAuMCIvPjwvc2lnbmF0dXJlPj8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOkRlZmF1bHQ9Imh0dHA6Ly8vc2NoZW1hcy9EZWZhdWx0LzEiIHhtbG5zOkVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvc2NoZW1hcy9FY29yZS8zIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgeG1sbnM6dW1sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly8vc2NoZW1hcy9EZWZhdWx0LzEgcGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19JTjhrOE1tQkVkcUJjTjFSNkV2V1V3P0RlZmF1bHQvRGVmYXVsdD8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyL3NjaGVtYXMvRWNvcmUvMyBwYXRobWFwOi8vVU1MX1BST0ZJTEVTL0Vjb3JlLnByb2ZpbGUudW1sI192eS1IVVlpbkVkcXR2Ym5mQjJMXzV3Ij4KLSAgPHVtbDpNb2RlbCB4bWk6aWQ9Il9KN3RHME95Q0VkdTUtdlZqbGZWc2ZRIiBuYW1lPSJ1bWEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfSjd0RzBleUNFZHU1LXZWamxmVnNmUSIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIi8+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VGwxOE8tc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VGwxOGUtc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVNTDJJbmZyYXN0cnVjdHVyZU1pbmk6OkNvbnN0cnVjdHMiIHJlZmVyZW5jZXM9Il95eEtmQ3Utc0VkdUg1OUtTSFY4dmdBIF95eEtmRGUtc0VkdUg1OUtTSFY4dmdBIF95eEtmRXUtc0VkdUg1OUtTSFY4dmdBIF95eEtmRC0tc0VkdUg1OUtTSFY4dmdBIF95eEtmRnUtc0VkdUg1OUtTSFY4dmdBIF95eFVQVU8tc0VkdUg1OUtTSFY4dmdBIF95eFVQVk8tc0VkdUg1OUtTSFY4dmdBIF95eFVQV08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUbDE4dS1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VU1MMkluZnJhc3RydWN0dXJlTWluaTo6UHJpbWl0aXZlVHlwZXMiIHJlZmVyZW5jZXM9Il95eFVQWk8tc0VkdUg1OUtTSFY4dmdBIF95eFVQWnUtc0VkdUg1OUtTSFY4dmdBIF95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIF95eFVQYXUtc0VkdUg1OUtTSFY4dmdBIF95eFVQYS0tc0VkdUg1OUtTSFY4dmdBIF95eFVQYk8tc0VkdUg1OUtTSFY4dmdBIF95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIF95eFVQY08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUbDE4LS1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6TWV0aG9kQ29yZTo6QmFzaWNFbGVtZW50cyIgcmVmZXJlbmNlcz0iX3l4dzdSTy1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdTZS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdUdS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdVZS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdXdS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdYLS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdWLS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdaZS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdhdS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdiLS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdZdS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdkZS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdjdS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdmdS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdnLS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdldS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdpTy1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdodS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdqdS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdqTy1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdrZS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdqLS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdsdS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdsTy1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdtLS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdtZS1zRWR1SDU5S1NIVjh2Z0EgX3l4NkZNZS1zRWR1SDU5S1NIVjh2Z0EgX3l4NkZNTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfelRsMTlPLXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpNZXRob2RQbHVnaW4iIHJlZmVyZW5jZXM9Il95eHc3UWUtc0VkdUg1OUtTSFY4dmdBIF95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIF95eHc3WXUtc0VkdUg1OUtTSFY4dmdBIF95N21Nc08tc0VkdUg1OUtTSFY4dmdBIF96R0xGQk8tc0VkdUg1OUtTSFY4dmdBIF96R0xGQnUtc0VkdUg1OUtTSFY4dmdBIF96R0xGQ2Utc0VkdUg1OUtTSFY4dmdBIF96R0xGQU8tc0VkdUg1OUtTSFY4dmdBIF96R0xGRC0tc0VkdUg1OUtTSFY4dmdBIF96R0xGRXUtc0VkdUg1OUtTSFY4dmdBIF96R0xGRi0tc0VkdUg1OUtTSFY4dmdBIF96R0xGSi0tc0VkdUg1OUtTSFY4dmdBIF96R0xGS3Utc0VkdUg1OUtTSFY4dmdBIF96R0xGSk8tc0VkdUg1OUtTSFY4dmdBIF96R0xGTC0tc0VkdUg1OUtTSFY4dmdBIF96R1UyQXUtc0VkdUg1OUtTSFY4dmdBIF96R1UyQU8tc0VkdUg1OUtTSFY4dmdBIF96R1UyQi0tc0VkdUg1OUtTSFY4dmdBIF96R1UyQmUtc0VkdUg1OUtTSFY4dmdBIF96R1UyRE8tc0VkdUg1OUtTSFY4dmdBIF96R1UyQ3Utc0VkdUg1OUtTSFY4dmdBIF96R1UyRWUtc0VkdUg1OUtTSFY4dmdBIF96R1UyRC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUbDE5ZS1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6TWV0aG9kQ29yZTo6R3VpZGFuY2VUeXBlcyIgcmVmZXJlbmNlcz0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EgX3l5emRHdS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EgX3l6MS00ZS1zRWR1SDU5S1NIVjh2Z0EgX3l6MS01Ty1zRWR1SDU5S1NIVjh2Z0EgX3l6MS01LS1zRWR1SDU5S1NIVjh2Z0EgX3l6MS02dS1zRWR1SDU5S1NIVjh2Z0EgX3l6MS03ZS1zRWR1SDU5S1NIVjh2Z0EgX3l6MS04Ty1zRWR1SDU5S1NIVjh2Z0EgX3l6MS04LS1zRWR1SDU5S1NIVjh2Z0EgX3l6MS05dS1zRWR1SDU5S1NIVjh2Z0EgX3l6MS0tZS1zRWR1SDU5S1NIVjh2Z0EgX3l6MS1fTy1zRWR1SDU5S1NIVjh2Z0EgX3l6MV9BdS1zRWR1SDU5S1NIVjh2Z0EgX3l6MV9CZS1zRWR1SDU5S1NIVjh2Z0EgX3l6MS1fLS1zRWR1SDU5S1NIVjh2Z0EgX3l6MV9DZS1zRWR1SDU5S1NIVjh2Z0EgX3l6MV9ETy1zRWR1SDU5S1NIVjh2Z0EgX3l6MV9ELS1zRWR1SDU5S1NIVjh2Z0EgX3l6MV9FdS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y0Ty1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y0LS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y1LS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y2dS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y3ZS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y4Ty1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y4LS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y5dS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3YtZS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3ZfTy1zRWR1SDU5S1NIVjh2Z0EgX3l6X3ZfLS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dCTy1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dBdS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dDZS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dCLS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dEdS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dETy1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dFLS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dFZS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dHTy1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dGdS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dIZS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dHLS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dJdS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dJTy1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dKLS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dKZS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dMTy1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dLdS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc0dS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc0Ty1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc1LS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc1ZS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc2LS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc2dS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc3LS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc3dS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc4LS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc4dS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc5LS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc5dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfelRsMTl1LXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpNZXRob2RDb3JlOjpNZXRob2RDb3JlRGVzY3JpcHRpb25zIiByZWZlcmVuY2VzPSJfeXh3N1YtLXNFZHVINTlLU0hWOHZnQSBfeXh3N2V1LXNFZHVINTlLU0hWOHZnQSBfeTFNQ3N1LXNFZHVINTlLU0hWOHZnQSBfeTFNQ3QtLXNFZHVINTlLU0hWOHZnQSBfeTFNQ3ZPLXNFZHVINTlLU0hWOHZnQSBfeTFNQ3dPLXNFZHVINTlLU0hWOHZnQSBfeTFNQ3NPLXNFZHVINTlLU0hWOHZnQSBfeTFNQ3h1LXNFZHVINTlLU0hWOHZnQSBfeTFNQ3ktLXNFZHVINTlLU0hWOHZnQSBfeTFNQ3hPLXNFZHVINTlLU0hWOHZnQSBfeTFNQzB1LXNFZHVINTlLU0hWOHZnQSBfeTFNQzEtLXNFZHVINTlLU0hWOHZnQSBfeTFNQzNPLXNFZHVINTlLU0hWOHZnQSBfeTFNQzBPLXNFZHVINTlLU0hWOHZnQSBfeTFNQzQtLXNFZHVINTlLU0hWOHZnQSBfeTFNQzZPLXNFZHVINTlLU0hWOHZnQSBfeTFNQzRlLXNFZHVINTlLU0hWOHZnQSBfeTFNQzctLXNFZHVINTlLU0hWOHZnQSBfeTFNQzlPLXNFZHVINTlLU0hWOHZnQSBfeTFNQy1lLXNFZHVINTlLU0hWOHZnQSBfeTFNQzdlLXNFZHVINTlLU0hWOHZnQSBfeTFNREFPLXNFZHVINTlLU0hWOHZnQSBfeTFNQ191LXNFZHVINTlLU0hWOHZnQSBfeTFNREItLXNFZHVINTlLU0hWOHZnQSBfeTFNRERPLXNFZHVINTlLU0hWOHZnQSBfeTFNREVlLXNFZHVINTlLU0hWOHZnQSBfeTFNREZ1LXNFZHVINTlLU0hWOHZnQSBfeTFNREctLXNFZHVINTlLU0hWOHZnQSBfeTFNRElPLXNFZHVINTlLU0hWOHZnQSBfeTFNREJlLXNFZHVINTlLU0hWOHZnQSBfeTFNREp1LXNFZHVINTlLU0hWOHZnQSBfeTFNREstLXNFZHVINTlLU0hWOHZnQSBfeTFNRE1PLXNFZHVINTlLU0hWOHZnQSBfeTFNRE5lLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VGwxOS0tc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6Ok1ldGhvZExpYnJhcnk6Ok1ldGhvZFVuaXRzIiByZWZlcmVuY2VzPSJfeXh3N1YtLXNFZHVINTlLU0hWOHZnQSBfekRwVmNPLXNFZHVINTlLU0hWOHZnQSBfekdMRkFPLXNFZHVINTlLU0hWOHZnQSBfek43UzFlLXNFZHVINTlLU0hWOHZnQSBfek43UzJ1LXNFZHVINTlLU0hWOHZnQSBfek43UzN1LXNFZHVINTlLU0hWOHZnQSBfek43UzQtLXNFZHVINTlLU0hWOHZnQSBfek43UzZPLXNFZHVINTlLU0hWOHZnQSBfek43UzB1LXNFZHVINTlLU0hWOHZnQSBfek9FY3ctLXNFZHVINTlLU0hWOHZnQSBfek9FY3dlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VGwxLU8tc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6Ok1ldGhvZENvcmU6OkNvcmVDb250ZW50RWxlbWVudHMiIHJlZmVyZW5jZXM9Il95eXpkRk8tc0VkdUg1OUtTSFY4dmdBIF95eXpkRi0tc0VkdUg1OUtTSFY4dmdBIF95eXpkRWUtc0VkdUg1OUtTSFY4dmdBIF95eXpkSHUtc0VkdUg1OUtTSFY4dmdBIF95eXpkSWUtc0VkdUg1OUtTSFY4dmdBIF95eXpkSk8tc0VkdUg1OUtTSFY4dmdBIF95eXpkSi0tc0VkdUg1OUtTSFY4dmdBIF95eXpkS3Utc0VkdUg1OUtTSFY4dmdBIF95eXpkTGUtc0VkdUg1OUtTSFY4dmdBIF95eXpkR3Utc0VkdUg1OUtTSFY4dmdBIF95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIF95eXpkTS0tc0VkdUg1OUtTSFY4dmdBIF95eXpkT2Utc0VkdUg1OUtTSFY4dmdBIF95eXpkUE8tc0VkdUg1OUtTSFY4dmdBIF95eXpkTnUtc0VkdUg1OUtTSFY4dmdBIF95eXpkUXUtc0VkdUg1OUtTSFY4dmdBIF95eXpkUC0tc0VkdUg1OUtTSFY4dmdBIF95eXpkUmUtc0VkdUg1OUtTSFY4dmdBIF95eXpkU08tc0VkdUg1OUtTSFY4dmdBIF95eXpkVC0tc0VkdUg1OUtTSFY4dmdBIF95eXpkVXUtc0VkdUg1OUtTSFY4dmdBIF95eXpkVE8tc0VkdUg1OUtTSFY4dmdBIF95eXpkVi0tc0VkdUg1OUtTSFY4dmdBIF95eXpkVmUtc0VkdUg1OUtTSFY4dmdBIF95eXpkWE8tc0VkdUg1OUtTSFY4dmdBIF95eXpkV3Utc0VkdUg1OUtTSFY4dmdBIF95eXpkWWUtc0VkdUg1OUtTSFY4dmdBIF95eXpkWC0tc0VkdUg1OUtTSFY4dmdBIF95eXpkWnUtc0VkdUg1OUtTSFY4dmdBIF95eXpkWk8tc0VkdUg1OUtTSFY4dmdBIF95eXpkYS0tc0VkdUg1OUtTSFY4dmdBIF95eXpkYWUtc0VkdUg1OUtTSFY4dmdBIF95eTlPRXUtc0VkdUg1OUtTSFY4dmdBIF95eTlPRU8tc0VkdUg1OUtTSFY4dmdBIF95eTlPRmUtc0VkdUg1OUtTSFY4dmdBIF95eTlPR2Utc0VkdUg1OUtTSFY4dmdBIF95eTlPRi0tc0VkdUg1OUtTSFY4dmdBIF95eTlPSHUtc0VkdUg1OUtTSFY4dmdBIF95eTlPSE8tc0VkdUg1OUtTSFY4dmdBIF95eTlPSS0tc0VkdUg1OUtTSFY4dmdBIF95eTlPSWUtc0VkdUg1OUtTSFY4dmdBIF95eTlPSnUtc0VkdUg1OUtTSFY4dmdBIF95eTlPSk8tc0VkdUg1OUtTSFY4dmdBIF95eTlPS2Utc0VkdUg1OUtTSFY4dmdBIF95eTlPSi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUbDEtZS1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6UHJvY2Vzczo6UHJvY2Vzc1R5cGVzIiByZWZlcmVuY2VzPSJfeXoxLV8tLXNFZHVINTlLU0hWOHZnQSBfeTJPa2dPLXNFZHVINTlLU0hWOHZnQSBfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSBfeS00S00tLXNFZHVINTlLU0hWOHZnQSBfeS00S051LXNFZHVINTlLU0hWOHZnQSBfeS00S01PLXNFZHVINTlLU0hWOHZnQSBfeS00S1BPLXNFZHVINTlLU0hWOHZnQSBfeS00S09lLXNFZHVINTlLU0hWOHZnQSBfeS00S1F1LXNFZHVINTlLU0hWOHZnQSBfeS00S1AtLXNFZHVINTlLU0hWOHZnQSBfeS00S1JlLXNFZHVINTlLU0hWOHZnQSBfeS00S1NlLXNFZHVINTlLU0hWOHZnQSBfeS00S1RPLXNFZHVINTlLU0hWOHZnQSBfeS00S1QtLXNFZHVINTlLU0hWOHZnQSBfeS00S1V1LXNFZHVINTlLU0hWOHZnQSBfeS00S1ZlLXNFZHVINTlLU0hWOHZnQSBfeS00S1dPLXNFZHVINTlLU0hWOHZnQSBfeS00S1ctLXNFZHVINTlLU0hWOHZnQSBfeV9CVUllLXNFZHVINTlLU0hWOHZnQSBfeV9CVUpPLXNFZHVINTlLU0hWOHZnQSBfeV9CVUotLXNFZHVINTlLU0hWOHZnQSBfeV9CVUxPLXNFZHVINTlLU0hWOHZnQSBfeV9CVUt1LXNFZHVINTlLU0hWOHZnQSBfeV9CVU1lLXNFZHVINTlLU0hWOHZnQSBfeV9CVUwtLXNFZHVINTlLU0hWOHZnQSBfeV9CVU51LXNFZHVINTlLU0hWOHZnQSBfeV9CVU5PLXNFZHVINTlLU0hWOHZnQSBfeV9CVU9lLXNFZHVINTlLU0hWOHZnQSBfeV9CVU4tLXNFZHVINTlLU0hWOHZnQSBfeV9CVVB1LXNFZHVINTlLU0hWOHZnQSBfeV9CVVBPLXNFZHVINTlLU0hWOHZnQSBfeV9CVVEtLXNFZHVINTlLU0hWOHZnQSBfeV9CVVFlLXNFZHVINTlLU0hWOHZnQSBfeV9CVVJ1LXNFZHVINTlLU0hWOHZnQSBfeV9CVVN1LXNFZHVINTlLU0hWOHZnQSBfeV9CVVNPLXNFZHVINTlLU0hWOHZnQSBfeV9CVVR1LXNFZHVINTlLU0hWOHZnQSBfeV9CVVRlLXNFZHVINTlLU0hWOHZnQSBfeV9CVVUtLXNFZHVINTlLU0hWOHZnQSBfeV9CVVVlLXNFZHVINTlLU0hWOHZnQSBfeV9CVVdPLXNFZHVINTlLU0hWOHZnQSBfeV9CVVZ1LXNFZHVINTlLU0hWOHZnQSBfeV9CVVhlLXNFZHVINTlLU0hWOHZnQSBfeV9CVVctLXNFZHVINTlLU0hWOHZnQSBfeV9CVVl1LXNFZHVINTlLU0hWOHZnQSBfeV9CVVlPLXNFZHVINTlLU0hWOHZnQSBfeV9CVVotLXNFZHVINTlLU0hWOHZnQSBfeV9CVVplLXNFZHVINTlLU0hWOHZnQSBfeV9CVWJPLXNFZHVINTlLU0hWOHZnQSBfeV9CVWF1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VGwxLXUtc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6Ok1ldGhvZENvcmU6OkNhdGVnb3JpZXMiIHJlZmVyZW5jZXM9Il95Mk9rZy0tc0VkdUg1OUtTSFY4dmdBIF95Mk9raHUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rZ08tc0VkdUg1OUtTSFY4dmdBIF95Mk9rak8tc0VkdUg1OUtTSFY4dmdBIF95Mk9raWUtc0VkdUg1OUtTSFY4dmdBIF95Mk9ra3Utc0VkdUg1OUtTSFY4dmdBIF95Mk9rbGUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rai0tc0VkdUg1OUtTSFY4dmdBIF95Mk9rbS0tc0VkdUg1OUtTSFY4dmdBIF95Mk9rbU8tc0VkdUg1OUtTSFY4dmdBIF95Mk9rbnUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rcE8tc0VkdUg1OUtTSFY4dmdBIF95Mk9rb2Utc0VkdUg1OUtTSFY4dmdBIF95Mk9rcXUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rcC0tc0VkdUg1OUtTSFY4dmdBIF95Mk9rc08tc0VkdUg1OUtTSFY4dmdBIF95Mk9rcmUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rdHUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rdWUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rcy0tc0VkdUg1OUtTSFY4dmdBIF95Mk9rdnUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rdk8tc0VkdUg1OUtTSFY4dmdBIF95Mk9rdy0tc0VkdUg1OUtTSFY4dmdBIF95Mk9rd2Utc0VkdUg1OUtTSFY4dmdBIF95Mk9reU8tc0VkdUg1OUtTSFY4dmdBIF95Mk9reHUtc0VkdUg1OUtTSFY4dmdBIF95Mk9reS0tc0VkdUg1OUtTSFY4dmdBIF95Mk9reWUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rME8tc0VkdUg1OUtTSFY4dmdBIF95Mk9renUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rMWUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rMC0tc0VkdUg1OUtTSFY4dmdBIF95Mk9rMnUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rMk8tc0VkdUg1OUtTSFY4dmdBIF95Mk9rMy0tc0VkdUg1OUtTSFY4dmdBIF95Mk9rM2Utc0VkdUg1OUtTSFY4dmdBIF95Mk9rNU8tc0VkdUg1OUtTSFY4dmdBIF95Mk9rNHUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rNmUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rNS0tc0VkdUg1OUtTSFY4dmdBIF95Mk9rN2Utc0VkdUg1OUtTSFY4dmdBIF95Mk9rN08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUdV80Ty1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6TWV0aG9kQ29yZTo6V29ya1Byb2R1Y3RTdGF0ZXMiIHJlZmVyZW5jZXM9Il95M1J0WXUtc0VkdUg1OUtTSFY4dmdBIF95M1J0WmUtc0VkdUg1OUtTSFY4dmdBIF95M1J0YU8tc0VkdUg1OUtTSFY4dmdBIF95M1J0WU8tc0VkdUg1OUtTSFY4dmdBIF95M2EzVXUtc0VkdUg1OUtTSFY4dmdBIF95M2EzVmUtc0VkdUg1OUtTSFY4dmdBIF95M2EzV08tc0VkdUg1OUtTSFY4dmdBIF95M2EzVy0tc0VkdUg1OUtTSFY4dmdBIF95M2EzVU8tc0VkdUg1OUtTSFY4dmdBIF95M2EzWU8tc0VkdUg1OUtTSFY4dmdBIF95M2EzWHUtc0VkdUg1OUtTSFY4dmdBIF95M2EzWmUtc0VkdUg1OUtTSFY4dmdBIF95M2EzYU8tc0VkdUg1OUtTSFY4dmdBIF95M2EzYS0tc0VkdUg1OUtTSFY4dmdBIF95M2EzWS0tc0VkdUg1OUtTSFY4dmdBIF95M2EzYnUtc0VkdUg1OUtTSFY4dmdBIF95M2EzY08tc0VkdUg1OUtTSFY4dmdBIF95M2EzZS0tc0VkdUg1OUtTSFY4dmdBIF95M2EzZnUtc0VkdUg1OUtTSFY4dmdBIF95M2EzZ2Utc0VkdUg1OUtTSFY4dmdBIF95M2EzZ3Utc0VkdUg1OUtTSFY4dmdBIF95M2EzZWUtc0VkdUg1OUtTSFY4dmdBIF95M2EzaHUtc0VkdUg1OUtTSFY4dmdBIF95M2EzaGUtc0VkdUg1OUtTSFY4dmdBIF95M2EzaU8tc0VkdUg1OUtTSFY4dmdBIF95M2EzaC0tc0VkdUg1OUtTSFY4dmdBIF95M2EzaWUtc0VkdUg1OUtTSFY4dmdBIF95M2EzaXUtc0VkdUg1OUtTSFY4dmdBIF95M2EzaS0tc0VkdUg1OUtTSFY4dmdBIF95M2Ezak8tc0VkdUg1OUtTSFY4dmdBIF95M2EzamUtc0VkdUg1OUtTSFY4dmdBIF95M2Ezai0tc0VkdUg1OUtTSFY4dmdBIF95M2EzanUtc0VkdUg1OUtTSFY4dmdBIF95M2Eza3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUdV80ZS1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6TWV0aG9kQ29yZTo6TWV0aG9kUGFja2FnZSIgcmVmZXJlbmNlcz0iX3k0ZUFOZS1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFPTy1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFPLS1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFNZS1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFRZS1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFQdS1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFSdS1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFSTy1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFTLS1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFTZS1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFVTy1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFUdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfelR1XzR1LXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpQcm9jZXNzOjpCcmVha2Rvd24iIHJlZmVyZW5jZXM9Il95N21NdE8tc0VkdUg1OUtTSFY4dmdBIF95N21Nc08tc0VkdUg1OUtTSFY4dmdBIF95N21NdC0tc0VkdUg1OUtTSFY4dmdBIF95N21NdXUtc0VkdUg1OUtTSFY4dmdBIF95N21NdmUtc0VkdUg1OUtTSFY4dmdBIF95N21Ndy0tc0VkdUg1OUtTSFY4dmdBIF95N21NeHUtc0VkdUg1OUtTSFY4dmdBIF95N21NeWUtc0VkdUg1OUtTSFY4dmdBIF95N21Nd08tc0VkdUg1OUtTSFY4dmdBIF95N3ZXb08tc0VkdUg1OUtTSFY4dmdBIF95N3ZXcmUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXc08tc0VkdUg1OUtTSFY4dmdBIF95N3ZXcXUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXdHUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXdU8tc0VkdUg1OUtTSFY4dmdBIF95N3ZXdXUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXcy0tc0VkdUg1OUtTSFY4dmdBIF95N3ZXd08tc0VkdUg1OUtTSFY4dmdBIF95N3ZXeGUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXeU8tc0VkdUg1OUtTSFY4dmdBIF95N3ZXeS0tc0VkdUg1OUtTSFY4dmdBIF95N3ZXenUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXMGUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXMU8tc0VkdUg1OUtTSFY4dmdBIF95N3ZXMS0tc0VkdUg1OUtTSFY4dmdBIF95N3ZXdk8tc0VkdUg1OUtTSFY4dmdBIF95N3ZXM2Utc0VkdUg1OUtTSFY4dmdBIF95N3ZXMnUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXNHUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXNWUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXNk8tc0VkdUg1OUtTSFY4dmdBIF95N3ZXMy0tc0VkdUg1OUtTSFY4dmdBIF95N3ZXNy0tc0VkdUg1OUtTSFY4dmdBIF95N3ZXOHUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXOWUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXLU8tc0VkdUg1OUtTSFY4dmdBIF95N3ZXLS0tc0VkdUg1OUtTSFY4dmdBIF95N3ZXX3Utc0VkdUg1OUtTSFY4dmdBIF95N3ZYQWUtc0VkdUg1OUtTSFY4dmdBIF95N3ZYQk8tc0VkdUg1OUtTSFY4dmdBIF95N3ZYQi0tc0VkdUg1OUtTSFY4dmdBIF95N3ZXNi0tc0VkdUg1OUtTSFY4dmdBIF95N3ZYRGUtc0VkdUg1OUtTSFY4dmdBIF95N3ZYRXUtc0VkdUg1OUtTSFY4dmdBIF95N3ZYRi0tc0VkdUg1OUtTSFY4dmdBIF95N3ZYR3Utc0VkdUg1OUtTSFY4dmdBIF95N3ZYSGUtc0VkdUg1OUtTSFY4dmdBIF95N3ZYSU8tc0VkdUg1OUtTSFY4dmdBIF95N3ZYQ3Utc0VkdUg1OUtTSFY4dmdBIF95N3ZYSnUtc0VkdUg1OUtTSFY4dmdBIF95N3ZYSS0tc0VkdUg1OUtTSFY4dmdBIF95N3ZYTE8tc0VkdUg1OUtTSFY4dmdBIF95N3ZYTC0tc0VkdUg1OUtTSFY4dmdBIF95N3ZYTXUtc0VkdUg1OUtTSFY4dmdBIF95N3ZYTmUtc0VkdUg1OUtTSFY4dmdBIF95N3ZYS2Utc0VkdUg1OUtTSFY4dmdBIF95N3ZYT08tc0VkdUg1OUtTSFY4dmdBIF95N3ZYUGUtc0VkdUg1OUtTSFY4dmdBIF95N3ZYTy0tc0VkdUg1OUtTSFY4dmdBIF95NzVIb08tc0VkdUg1OUtTSFY4dmdBIF95NzVIcE8tc0VkdUg1OUtTSFY4dmdBIF95NzVIb3Utc0VkdUg1OUtTSFY4dmdBIF95NzVIcWUtc0VkdUg1OUtTSFY4dmdBIF95NzVIcC0tc0VkdUg1OUtTSFY4dmdBIF95NzVIcnUtc0VkdUg1OUtTSFY4dmdBIF95NzVIck8tc0VkdUg1OUtTSFY4dmdBIF95NzVIcy0tc0VkdUg1OUtTSFY4dmdBIF95NzVIc2Utc0VkdUg1OUtTSFY4dmdBIF95NzVIdU8tc0VkdUg1OUtTSFY4dmdBIF95NzVIdHUtc0VkdUg1OUtTSFY4dmdBIF95NzVIdmUtc0VkdUg1OUtTSFY4dmdBIF95NzVIdS0tc0VkdUg1OUtTSFY4dmdBIF95NzVId3Utc0VkdUg1OUtTSFY4dmdBIF95NzVId08tc0VkdUg1OUtTSFY4dmdBIF95NzVIeGUtc0VkdUg1OUtTSFY4dmdBIF95NzVIeWUtc0VkdUg1OUtTSFY4dmdBIF95NzVIeC0tc0VkdUg1OUtTSFY4dmdBIF95NzVIenUtc0VkdUg1OUtTSFY4dmdBIF95NzVIek8tc0VkdUg1OUtTSFY4dmdBIF95NzVIMC0tc0VkdUg1OUtTSFY4dmdBIF95NzVIMGUtc0VkdUg1OUtTSFY4dmdBIF95NzVIMk8tc0VkdUg1OUtTSFY4dmdBIF95NzVIMXUtc0VkdUg1OUtTSFY4dmdBIF95NzVIM2Utc0VkdUg1OUtTSFY4dmdBIF95NzVIMi0tc0VkdUg1OUtTSFY4dmdBIF95NzVINHUtc0VkdUg1OUtTSFY4dmdBIF95NzVINE8tc0VkdUg1OUtTSFY4dmdBIF95NzVINS0tc0VkdUg1OUtTSFY4dmdBIF95NzVINWUtc0VkdUg1OUtTSFY4dmdBIF95NzVINi0tc0VkdUg1OUtTSFY4dmdBIF95NzVINnUtc0VkdUg1OUtTSFY4dmdBIF95NzVIOE8tc0VkdUg1OUtTSFY4dmdBIF95NzVIN3Utc0VkdUg1OUtTSFY4dmdBIF95NzVIOWUtc0VkdUg1OUtTSFY4dmdBIF95NzVIOC0tc0VkdUg1OUtTSFY4dmdBIF95NzVILXUtc0VkdUg1OUtTSFY4dmdBIF95NzVILU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUdV80LS1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6TWV0aG9kTGlicmFyeTo6TGlicmFyeUNvbmZpZ3VyYXRpb25zIiByZWZlcmVuY2VzPSJfeS00S09lLXNFZHVINTlLU0hWOHZnQSBfelFkQ1ktLXNFZHVINTlLU0hWOHZnQSBfelFkQ1p1LXNFZHVINTlLU0hWOHZnQSBfelFkQ2FlLXNFZHVINTlLU0hWOHZnQSBfelFkQ2JPLXNFZHVINTlLU0hWOHZnQSBfelFkQ2ItLXNFZHVINTlLU0hWOHZnQSBfelFkQ2N1LXNFZHVINTlLU0hWOHZnQSBfelFkQ2RlLXNFZHVINTlLU0hWOHZnQSBfelFkQ1lPLXNFZHVINTlLU0hWOHZnQSBfelFkQ2UtLXNFZHVINTlLU0hWOHZnQSBfelFkQ2VPLXNFZHVINTlLU0hWOHZnQSBfelFkQ2YtLXNFZHVINTlLU0hWOHZnQSBfelFtellPLXNFZHVINTlLU0hWOHZnQSBfelFtemFPLXNFZHVINTlLU0hWOHZnQSBfelFtemEtLXNFZHVINTlLU0hWOHZnQSBfelFtelktLXNFZHVINTlLU0hWOHZnQSBfelFtemNPLXNFZHVINTlLU0hWOHZnQSBfelFtemJ1LXNFZHVINTlLU0hWOHZnQSBfelFtemRlLXNFZHVINTlLU0hWOHZnQSBfelFtemMtLXNFZHVINTlLU0hWOHZnQSBfelFtemV1LXNFZHVINTlLU0hWOHZnQSBfelFtemVPLXNFZHVINTlLU0hWOHZnQSBfelFtemYtLXNFZHVINTlLU0hWOHZnQSBfelFtemZlLXNFZHVINTlLU0hWOHZnQSBfelFtemd1LXNFZHVINTlLU0hWOHZnQSBfelFtemdPLXNFZHVINTlLU0hWOHZnQSBfelFtemhlLXNFZHVINTlLU0hWOHZnQSBfelFtemctLXNFZHVINTlLU0hWOHZnQSBfelFteml1LXNFZHVINTlLU0hWOHZnQSBfelFtemlPLXNFZHVINTlLU0hWOHZnQSBfelFtemp1LXNFZHVINTlLU0hWOHZnQSBfelFtemplLXNFZHVINTlLU0hWOHZnQSBfelFtemt1LXNFZHVINTlLU0hWOHZnQSBfelFtemtlLXNFZHVINTlLU0hWOHZnQSBfelFtemwtLXNFZHVINTlLU0hWOHZnQSBfelFtemxlLXNFZHVINTlLU0hWOHZnQSBfelFtem0tLXNFZHVINTlLU0hWOHZnQSBfelFtem11LXNFZHVINTlLU0hWOHZnQSBfelFtem4tLXNFZHVINTlLU0hWOHZnQSBfelFtem51LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VHVfNU8tc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlByb2Nlc3M6OlByb2Nlc3NEZXNjcmlwdGlvbnMiIHJlZmVyZW5jZXM9Il96Qlo1d3Utc0VkdUg1OUtTSFY4dmdBIF96Qlo1d08tc0VkdUg1OUtTSFY4dmdBIF96Qlo1eWUtc0VkdUg1OUtTSFY4dmdBIF96Qlo1enUtc0VkdUg1OUtTSFY4dmdBIF96Qlo1MC0tc0VkdUg1OUtTSFY4dmdBIF96Qlo1eC0tc0VkdUg1OUtTSFY4dmdBIF96Qlo1MnUtc0VkdUg1OUtTSFY4dmdBIF96Qlo1My0tc0VkdUg1OUtTSFY4dmdBIF96Qlo1NU8tc0VkdUg1OUtTSFY4dmdBIF96Qlo1NmUtc0VkdUg1OUtTSFY4dmdBIF96Qlo1N3Utc0VkdUg1OUtTSFY4dmdBIF96Qlo1OC0tc0VkdUg1OUtTSFY4dmdBIF96Qlo1Mk8tc0VkdUg1OUtTSFY4dmdBIF96Qlo1LXUtc0VkdUg1OUtTSFY4dmdBIF96Qlo1Xy0tc0VkdUg1OUtTSFY4dmdBIF96Qlo1LU8tc0VkdUg1OUtTSFY4dmdBIF96Qlo2QnUtc0VkdUg1OUtTSFY4dmdBIF96Qlo2Qk8tc0VkdUg1OUtTSFY4dmdBIF96Qlo2RGUtc0VkdUg1OUtTSFY4dmdBIF96Qlo2Qy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUdV81ZS1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6UHJvY2Vzczo6UHJvY2Vzc1BhY2thZ2UiIHJlZmVyZW5jZXM9Il96RHBWZGUtc0VkdUg1OUtTSFY4dmdBIF96RHBWZU8tc0VkdUg1OUtTSFY4dmdBIF96RHBWY08tc0VkdUg1OUtTSFY4dmdBIF96RHBWZnUtc0VkdUg1OUtTSFY4dmdBIF96RHBWZS0tc0VkdUg1OUtTSFY4dmdBIF96RHBWaE8tc0VkdUg1OUtTSFY4dmdBIF96RHBWaC0tc0VkdUg1OUtTSFY4dmdBIF96RHBWZ2Utc0VkdUg1OUtTSFY4dmdBIF96RHBWamUtc0VkdUg1OUtTSFY4dmdBIF96RHBWaXUtc0VkdUg1OUtTSFY4dmdBIF96RHBWa3Utc0VkdUg1OUtTSFY4dmdBIF96RHBWa08tc0VkdUg1OUtTSFY4dmdBIF96RHBWbC0tc0VkdUg1OUtTSFY4dmdBIF96RHBWbGUtc0VkdUg1OUtTSFY4dmdBIF96RHBWbk8tc0VkdUg1OUtTSFY4dmdBIF96RHBWbXUtc0VkdUg1OUtTSFY4dmdBIF96RHBWb2Utc0VkdUg1OUtTSFY4dmdBIF96RHBWbi0tc0VkdUg1OUtTSFY4dmdBIF96RHBWcHUtc0VkdUg1OUtTSFY4dmdBIF96RHBWcE8tc0VkdUg1OUtTSFY4dmdBIF96RHBWcS0tc0VkdUg1OUtTSFY4dmdBIF96RHBWcWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUdV81dS1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6UHJvY2Vzc0RpYWdyYW1zOjpVTUFEaWFncmFtcyIgcmVmZXJlbmNlcz0iX3pEcFZpdS1zRWR1SDU5S1NIVjh2Z0EgX3pMaXRNTy1zRWR1SDU5S1NIVjh2Z0EgX3pMaXROZS1zRWR1SDU5S1NIVjh2Z0EgX3pMaXRNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfelQ0dzRPLXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVTUwyRGlhZ3JhbUludGVyY2hhbmdlIiByZWZlcmVuY2VzPSJfekpBV2tlLXNFZHVINTlLU0hWOHZnQSBfekpBV2t1LXNFZHVINTlLU0hWOHZnQSBfekpBV2tPLXNFZHVINTlLU0hWOHZnQSBfekpBV2xlLXNFZHVINTlLU0hWOHZnQSBfekpBV2x1LXNFZHVINTlLU0hWOHZnQSBfekpBV21lLXNFZHVINTlLU0hWOHZnQSBfekpBV25PLXNFZHVINTlLU0hWOHZnQSBfekpBV24tLXNFZHVINTlLU0hWOHZnQSBfekpBV2stLXNFZHVINTlLU0hWOHZnQSBfekpBV28tLXNFZHVINTlLU0hWOHZnQSBfekpBV3BPLXNFZHVINTlLU0hWOHZnQSBfekpBV291LXNFZHVINTlLU0hWOHZnQSBfekpBV3AtLXNFZHVINTlLU0hWOHZnQSBfekpBV3FlLXNFZHVINTlLU0hWOHZnQSBfekpBV3JPLXNFZHVINTlLU0hWOHZnQSBfekpBV3ItLXNFZHVINTlLU0hWOHZnQSBfekpBV3BlLXNFZHVINTlLU0hWOHZnQSBfekpBV3RPLXNFZHVINTlLU0hWOHZnQSBfekpBV3R1LXNFZHVINTlLU0hWOHZnQSBfekpBV3N1LXNFZHVINTlLU0hWOHZnQSBfekpBV3UtLXNFZHVINTlLU0hWOHZnQSBfekpBV3YtLXNFZHVINTlLU0hWOHZnQSBfekpBV3VlLXNFZHVINTlLU0hWOHZnQSBfekpBV3hlLXNFZHVINTlLU0hWOHZnQSBfekpBV3lPLXNFZHVINTlLU0hWOHZnQSBfekpBV3ctLXNFZHVINTlLU0hWOHZnQSBfekpBV3plLXNFZHVINTlLU0hWOHZnQSBfekpBVzBPLXNFZHVINTlLU0hWOHZnQSBfekpBV3ktLXNFZHVINTlLU0hWOHZnQSBfekpLSGt1LXNFZHVINTlLU0hWOHZnQSBfekpLSGstLXNFZHVINTlLU0hWOHZnQSBfekpLSGxPLXNFZHVINTlLU0hWOHZnQSBfekpLSGwtLXNFZHVINTlLU0hWOHZnQSBfekpLSGtPLXNFZHVINTlLU0hWOHZnQSBfekpLSG5PLXNFZHVINTlLU0hWOHZnQSBfekpLSG11LXNFZHVINTlLU0hWOHZnQSBfekpLSG4tLXNFZHVINTlLU0hWOHZnQSBfekpLSG91LXNFZHVINTlLU0hWOHZnQSBfekpLSG8tLXNFZHVINTlLU0hWOHZnQSBfekpLSHB1LXNFZHVINTlLU0hWOHZnQSBfekpLSG5lLXNFZHVINTlLU0hWOHZnQSBfekpLSHEtLXNFZHVINTlLU0hWOHZnQSBfekpLSHItLXNFZHVINTlLU0hWOHZnQSBfekpLSHN1LXNFZHVINTlLU0hWOHZnQSBfekpLSHFlLXNFZHVINTlLU0hWOHZnQSBfekpLSHQtLXNFZHVINTlLU0hWOHZnQSBfekpLSHRlLXNFZHVINTlLU0hWOHZnQSBfekpLSHZlLXNFZHVINTlLU0hWOHZnQSBfekpLSHUtLXNFZHVINTlLU0hWOHZnQSBfekpLSHd1LXNFZHVINTlLU0hWOHZnQSBfekpLSHdPLXNFZHVINTlLU0hWOHZnQSBfekpLSHhlLXNFZHVINTlLU0hWOHZnQSBfekpLSHllLXNFZHVINTlLU0hWOHZnQSBfekpLSHgtLXNFZHVINTlLU0hWOHZnQSBfekpLSHotLXNFZHVINTlLU0hWOHZnQSBfekpLSDAtLXNFZHVINTlLU0hWOHZnQSBfekpLSHplLXNFZHVINTlLU0hWOHZnQSBfekpLSDEtLXNFZHVINTlLU0hWOHZnQSBfekpLSDItLXNFZHVINTlLU0hWOHZnQSBfekpLSDNlLXNFZHVINTlLU0hWOHZnQSBfekpLSDJlLXNFZHVINTlLU0hWOHZnQSBfekpLSDR1LXNFZHVINTlLU0hWOHZnQSBfekpLSDQtLXNFZHVINTlLU0hWOHZnQSBfekpLSDVPLXNFZHVINTlLU0hWOHZnQSBfekpLSDVlLXNFZHVINTlLU0hWOHZnQSBfekpLSDV1LXNFZHVINTlLU0hWOHZnQSBfekpLSDUtLXNFZHVINTlLU0hWOHZnQSBfekpLSDRPLXNFZHVINTlLU0hWOHZnQSBfekpLSDZPLXNFZHVINTlLU0hWOHZnQSBfekpLSDZlLXNFZHVINTlLU0hWOHZnQSBfekpLSDYtLXNFZHVINTlLU0hWOHZnQSBfekpLSDZ1LXNFZHVINTlLU0hWOHZnQSBfekpLSDd1LXNFZHVINTlLU0hWOHZnQSBfekpLSDctLXNFZHVINTlLU0hWOHZnQSBfekpLSDhPLXNFZHVINTlLU0hWOHZnQSBfekpLSDh1LXNFZHVINTlLU0hWOHZnQSBfekpLSDhlLXNFZHVINTlLU0hWOHZnQSBfekpLSDllLXNFZHVINTlLU0hWOHZnQSBfekpLSDl1LXNFZHVINTlLU0hWOHZnQSBfekpUUmdPLXNFZHVINTlLU0hWOHZnQSBfekpUUmd1LXNFZHVINTlLU0hWOHZnQSBfekpUUmdlLXNFZHVINTlLU0hWOHZnQSBfekpUUmh1LXNFZHVINTlLU0hWOHZnQSBfekpUUmhlLXNFZHVINTlLU0hWOHZnQSBfekpUUml1LXNFZHVINTlLU0hWOHZnQSBfekpUUmllLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXhVUFktLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX0o3dEcwT3lDRWR1NS12VmpsZlZzZlEiPgotICAgICAgPGJvZHk+MDA8L2JvZHk+Ci0gICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MUNSc08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfSjd0RzBPeUNFZHU1LXZWamxmVnNmUSI+Ci0gICAgICA8Ym9keT4wNjwvYm9keT4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k0ZUFNTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il9KN3RHME95Q0VkdTUtdlZqbGZWc2ZRIj4KLSAgICAgIDxib2R5PjA1PC9ib2R5PgotICAgIDwvb3duZWRDb21tZW50PgotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJGYWtPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX0o3dEcwT3lDRWR1NS12VmpsZlZzZlEiPgotICAgICAgPGJvZHk+MDQ8L2JvZHk+Ci0gICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95ejEtNE8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfSjd0RzBPeUNFZHU1LXZWamxmVnNmUSI+Ci0gICAgICA8Ym9keT4wMzwvYm9keT4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4dzdRTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il9KN3RHME95Q0VkdTUtdlZqbGZWc2ZRIj4KLSAgICAgIDxib2R5PjAxPC9ib2R5PgotICAgIDwvb3duZWRDb21tZW50PgotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXl6ZEVPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX0o3dEcwT3lDRWR1NS12VmpsZlZzZlEiPgotICAgICAgPGJvZHk+MDI8L2JvZHk+Ci0gICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfSjd0RzFPeUNFZHU1LXZWamxmVnNmUSI+Ci0gICAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6TW9kZWwiIGhyZWY9InBhdGhtYXA6Ly9VTUxfTElCUkFSSUVTL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI18wIi8+Ci0gICAgPC9wYWNrYWdlSW1wb3J0PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXhLZkN1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQ2xhc3NpZmllciIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4S2ZDLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eEtmQ3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIENsYXNzaWZpZXIuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXhLZkRPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4VVBVTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l4S2ZEZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eEtmRHUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXhLZkRlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXhLZkQtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iTmFtZWRFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXhLZkVPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4S2ZELS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC4gIERlZmluZWQgdGhhdCBldmVyeSBlbGVtZW50IGhhcyBhIG5hbWUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXhLZkVlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4S2ZEZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eEtmRXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJuYW1lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXhLZkUtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXhLZkZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeXhLZkZlLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eEtmRnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQYWNrYWdlYWJsZUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eEtmRi0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXhLZkZ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXhLZkdPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4S2ZELS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l4VVBVTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlR5cGUiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eFVQVWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXhVUFVPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBUeXBlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l4VVBVdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eEtmRnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eFVQVk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQYWNrYWdlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXhVUFZlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4VVBWTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eFVQVnUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXhVUFdPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l4VVBWLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eEtmRnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eFVQV08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJOYW1lc3BhY2UiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eFVQV2Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXhVUFdPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lc3BhY2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXhVUFd1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4S2ZELS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfeXhVUFpPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGF0ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4VVBaZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eFVQWk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+RGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIG9mIHRoZSB0eXBlIERhdGUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iX3l4VVBadS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlVyaSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4VVBaLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eFVQWnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+RGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIHRoYXQgcG9pbnQgdG8gcmVzb3VyY2VzIHN1Y2ggYXMgZmlsZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlN0cmluZyI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4VVBhZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBzdHJpbmcgaXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGluIHNvbWUgc3VpdGFibGUgY2hhcmFjdGVyIHNldCB1c2VkIHRvIGRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1vZGVsLiBDaGFyYWN0ZXIgc2V0cyBtYXkgaW5jbHVkZSBub24tUm9tYW4gYWxwaGFiZXRzIGFuZCBjaGFyYWN0ZXJzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il95eFVQYXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJTZXQiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfeXhVUGEtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iU2VxdWVuY2UiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfeXhVUGJPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iSW50ZWdlciI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4VVBiZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eFVQYk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QW4gaW50ZWdlciBpcyBhIHByaW1pdGl2ZSB0eXBlIHJlcHJlc2VudGluZyBpbnRlZ2VyIHZhbHVlcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQm9vbGVhbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4VVBiLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBCb29sZWFuIHR5cGUgaXMgdXNlZCBmb3IgbG9naWNhbCBleHByZXNzaW9uLCBjb25zaXN0aW5nIG9mIHRoZSBwcmVkZWZpbmVkIHZhbHVlcyB0cnVlIGFuZCBmYWxzZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfeXhVUGNPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRG91YmxlIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eHc3Y3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJDb25zdHJhaW50Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N2MtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdjdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIENvbnN0cmFpbnQgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eHc3ZE8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l4dzdkZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImJvZHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4dzdkdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3ZGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZSBzdG9yZXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXh3N2QtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXh3N2VPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeXh3N2VlLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eHc3aHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJNZXRob2RFbGVtZW50UHJvcGVydHkiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l4dzdoLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eEtmRnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXh3N2lPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idmFsdWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eHc3aWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eHc3aXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95eHc3aS0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l4dzdqTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l4dzdUdS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdqdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3amUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N2pPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgTWV0aG9kIEVsZW1lbnQgY2FuIG93biBtYW55IENvbnN0cmFpbnRzIGRlZmluaW5nIHJ1bGVzIGZvciB0aGlzIGVsZW1lbnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXh3N2p1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX21ldGhvZEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95eHc3ak8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eHc3ai0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95eHc3WC0tc0VkdUg1OUtTSFY4dmdBIF95eHc3a2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N2tPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdqLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIENvbnRlbnQgRGVzY3JpcHRpb24gY2FuIG9wdGlvbmFsbHkgYmUgc3RydWN0dXJlIGludG8gU2VjdGlvbnMuICBUaGlzIGFzc29jaWF0aW9uIGlzIHVzZSB0byBkZWNvbXBvc2VkIFNlY3Rpb24gaW50byBhIGhpZXJhcmNoeSBvZiBTZWN0aW9ucy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eHc3a2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfY29udGVudERlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3Vi0tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXh3N2otLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l4dzdrdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l4dzdrLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eHc3bE8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95eHc3Yi0tc0VkdUg1OUtTSFY4dmdBIF95eHc3bHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N2xlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdsTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5TZWN0aW9ucyBjYW4gYmUgZnVydGhlciBkZWNvbXBvc2VkIGludG8gbiBsZXZlbHMgb2Ygc3ViLXNlY3Rpb25zLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l4dzdsdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9zZWN0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3WXUtc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXh3N2xPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l4dzdsLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l4dzdtTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXh3N21lLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXh3N20tLXNFZHVINTlLU0hWOHZnQSBfeXh3N2ctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4dzdtdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3bWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBEZXNjcmliYWJsZSBFbGVtZW50IGNhbiBjb250YWluIGEgQ29udGVudCBEZXNjcmlwdGlvbiBlbGVtZW50IHRoYXQgc3RvcmVzIHRleHR1YWwgZGVzY3JpcHRpb25zIGZvciB0aGlzIENvbnRlbnQgRWxlbWVudC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgaW50ZW5kZWQgdG8gYmUgcmVmaW5lZCB3aXRoIHN1Yi1jbGFzc2VzIGFkZGluZyBtb3JlIGRlc2NyaXB0aW9uIGF0dHJpYnV0ZXMuICBBbnkgb2YgdGhlc2Ugc3ViLXR5cGVzIGNhbiBiZSByZWxhdGVkIHRvIGEgQ29udGVudCBFbGVtZW50LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l4dzdtLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9kZXNjcmliYWJsZUVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdldS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95eHc3bWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXh3N25PLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXh3N25lLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eDZGTU8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95eHc3VWUtc0VkdUg1OUtTSFY4dmdBIF95eDZGTWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eDZGTWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfbWV0aG9kRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3l4NkZNTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l5emRFZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlJvbGUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eXpkRXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXl6ZEVlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUm9sZSBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAKLUEgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eXpkRS0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l5emRGTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im1vZGlmaWVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIiBpc0Rlcml2ZWQ9InRydWUiIGFzc29jaWF0aW9uPSJfeXl6ZFpPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRGZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRGdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXl6ZEYtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmVzcG9uc2libGVGb3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXl6ZGFlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRHTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRHZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eXpkTS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJHdWlkYW5jZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5emROTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eXpkTS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+R3VpZGFuY2UgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFza3MsIGFuZCBXb3JrIFByb2R1Y3RzLiAgRXhhbXBsZXMgZm9yIEd1aWRhbmNlIGFyZSBHdWlkZWxpbmVzLCBUZW1wbGF0ZXMsIENoZWNrbGlzdHMsIFRvb2wgTWVudG9ycywgRXN0aW1hdGVzLCBTdXBwb3J0aW5nIE1hdGVyaWFscywgUmVwb3J0cywgQ29uY2VwdHMsIGV0Yy4gIFRoaXMgcGFja2FnZSBvbmx5IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhYnN0cmFjdCBHdWlkYW5jZSBjbGFzcy4gIFRoZSBwYWNrYWdlIEd1aWRhbmNlIFR5cGVzIGRlZmluZXMgY29uY3JldGUgZ3VpZGFuY2UgdHlwZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXl6ZE5lLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l5emROdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkFydGlmYWN0Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXl6ZE4tLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5emROdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BcnRpZmFjdCBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLgotQXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICZxdW90O293biZxdW90OyBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXl6ZE9PLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eXpkT2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjb250YWluZXJBcnRpZmFjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZE51LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95eTlPRmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZE91LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZE8tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eXpkUE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjb250YWluZWRBcnRpZmFjdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emROdS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeXk5T0ZlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRQZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRQdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eXpkUC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEZWxpdmVyYWJsZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5emRRTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eXpkUC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBkZWxpdmVyYWJsZSBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXl6ZFFlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eXpkUXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJkZWxpdmVyZWRXb3JrUHJvZHVjdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXk5T0YtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRRLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRSTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eXpkUmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJPdXRjb21lIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXl6ZFJ1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5emRSZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BbiBvdXRjb21lIGRlc2NyaWJlcyBpbnRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgYSByZXN1bHQgb3Igc3RhdGUuIE91dGNvbWVzIG1heSBhbHNvIGJlIHVzZWQgdG8gZGVzY3JpYmUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBub3QgZm9ybWFsbHkgZGVmaW5lZC4gIEEga2V5IGRpZmZlcmVudGlhdG9yIGZvciBvdXRjb21lcyBhZ2FpbnN0IGFydGlmYWN0cyBpcyB0aGF0IG91dGNvbWVzIGFyZSBub3QgY2FuZGlkYXRlcyBmb3IgaGFydmVzdGluZyBhcyByZXVzYWJsZSBhc3NldHMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXl6ZFItLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l5emRTTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlN0ZXAiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eXpkU2Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXl6ZFNPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgU3RlcCBpcyBhIFNlY3Rpb24gYW5kIFdvcmsgRGVmaW5pdGlvbiB0aGF0IGlzIHVzZWQgdG8gb3JnYW5pemUgVGFza3MgaW50byBwYXJ0cyBvciBzdWJ1bml0cyBvZiB3b3JrLiAgU3RlcHMgaW5oZXJpdCB0aGUgc3ViU2VjdGlvbnMgZGVjb21wb3NpdGlvbiBmcm9tIFNlY3Rpb24gYW5kIGNhbiB0aGVyZWZvcmUgZGVzY3JpYmUgU3ViLVN0ZXBzIG5lc3RlZCBpbnRvIFN0ZXBzLgotQSBTdGVwIGRlc2NyaWJlcyBhIG1lYW5pbmdmdWwgYW5kIGNvbnNpc3QgcGFydCBvZiB0aGUgb3ZlcmFsbCB3b3JrIGRlc2NyaWJlZCBmb3IgYSBUYXNrLiAgVGhlIGNvbGxlY3Rpb24gb2YgU3RlcHMgZGVmaW5lZCBmb3IgYSBUYXNrIHJlcHJlc2VudHMgYWxsIHRoZSB3b3JrIHRoYXQgc2hvdWxkIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGUgb3ZlcmFsbCBkZXZlbG9wbWVudCBnb2FsIG9mIHRoZSBUYXNrLiAgTm90IGFsbCBzdGVwcyBhcmUgbmVjZXNzYXJpbHkgcGVyZm9ybWVkIGVhY2ggdGltZSBhIFRhc2sgaXMgaW52b2tlZCBpbiBhIFByb2Nlc3MgKHNlZSBUYXNrIERlc2NyaXB0b3IpLCBzbyB0aGV5IGNhbiBhbHNvIGJlIGV4cHJlc3NlZCBpbiB0aGUgZm9ybSBvZiBhbHRlcm5hdGUgJ2Zsb3dzJyBvZiB3b3JrLiAgRGlmZmVyZW50IHdheXMgb2YgYWNoaWV2aW5nIHRoZSBzYW1lIGRldmVsb3BtZW50IGdvYWwgY2FuIHRoZW4gYmUgJ2Fzc2VtYmxlZCcgYnkgc2VsZWN0aW5nIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2Ygc3RlcHMgd2hlbiBhcHBseWluZyB0aGUgVGFzayBpbiBhIFByb2Nlc3MuICBUeXBpY2FsIGtpbmRzIG9mIHN0ZXBzIGEgVGFzayBhdXRob3Igc2hvdWxkIGNvbnNpZGVyIGFyZTogVGhpbmtpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIHVuZGVyc3RhbmQgdGhlIG5hdHVyZSBvZiB0aGUgdGFzaywgZ2F0aGVycyBhbmQgZXhhbWluZXMgdGhlIGlucHV0IGFydGlmYWN0cywgYW5kIGZvcm11bGF0ZXMgdGhlIG91dGNvbWUuIFBlcmZvcm1pbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGNyZWF0ZSBvciB1cGRhdGUgc29tZSBhcnRpZmFjdHMuIFJldmlld2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgaW5zcGVjdHMgdGhlIHJlc3VsdHMgYWdhaW5zdCBzb21lIGNyaXRlcmlhLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXl6ZFN1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdZdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eXpkUy0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZFRPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXl6ZFRPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iV29ya0RlZmluaXRpb24iIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eXpkVGUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXl6ZFRPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PldvcmsgRGVmaW5pdGlvbiBpcyBhbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLgotV29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXl6ZFR1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eXpkVC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcmVjb25kaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdjdS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeXk5T0pPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRVTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRVZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXl6ZFV1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icG9zdGNvbmRpdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N2N1LXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95eTlPSi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZFUtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZFZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l5emRWZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRlZmF1bHRfUHJpbWFyeVBlcmZvcm1lciIgbWVtYmVyRW5kPSJfeXl6ZEh1LXNFZHVINTlLU0hWOHZnQSBfeXl6ZFYtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5emRWdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eXpkVmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+Um9sZXMgY2FuIGJlIGRlZmluZWQgdG8gcGVyZm9ybSBtYW55IFRhc2tzLCBidXQgZXZlcnkgVGFzayBtYXkgaGF2ZSBvbmx5IG9uZSBSb2xlIHRoYXQgaXMgYnkgZGVmYXVsdCB0aGUgcHJpbWFyeSBwZXJmb3JtZXIgb2YgdGhpcyBUYXNrLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l5emRWLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InBlcmZvcm1zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkR3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l5emRWZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eXpkV08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eXpkV2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXl6ZFd1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGVmYXVsdF9NYW5kYXRvcnlJbnB1dHMiIG1lbWJlckVuZD0iX3l5emRYTy1zRWR1SDU5S1NIVjh2Z0EgX3l5emRJZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eXpkVy0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXl6ZFd1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgbGlua3MgdG8gemVybyBvciBtYW55IGRlZmluaXRpb25zIG9mIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgZGVmaW5lZCBhcyBtYW5kYXRvcnkgaW5wdXRzIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzay48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eXpkWE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJtYW5kYXRvcnlJbnB1dFRvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkR3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l5emRXdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eXpkWGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eXpkWHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXl6ZFgtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGVmYXVsdF9PdXRwdXRzIiBtZW1iZXJFbmQ9Il95eXpkWWUtc0VkdUg1OUtTSFY4dmdBIF95eXpkSk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXl6ZFlPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5emRYLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIGxpbmtzIHRvIHplcm8gb3IgbWFueSBkZWZpbml0aW9ucyBvZiBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIGRlZmluZWQgYXMgb3V0cHV0cyBvZiB0aGlzIFRhc2suPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXl6ZFllLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ib3V0cHV0RnJvbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZEd1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95eXpkWC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZFl1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZFktLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l5emRaTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRlZmF1bHRfTW9kaWZpZXMiIG1lbWJlckVuZD0iX3l5emRadS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRGTy1zRWR1SDU5S1NIVjh2Z0EiIGlzRGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5emRaZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eXpkWk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBpcyBkZXJpdmVkIGZyb20gdGhlIGZhY3QgdGhhdCBSb2xlcyBwZXJmb3JtIFRhc2tzIHRoYXQgaGF2ZSBXb3JrIFByb2R1Y3RzIG9mIHRoYXQgcGFydGljdWxhciB0eXBlIGFzIG91dHB1dHMuICAvbW9kaWZpZXMgcHJvdmlkZXMgYWxsIHRoZSB0eXBlcyBvZiBXb3JrIFByb2R1Y3RzIHRoYXQgdGhlIFJvbGUgcHJvZHVjZXMgb3IgbW9kaWZpZXMgdmlhIG9uZSBvZiB0aGUgVGFza3MgZGVmaW5lZCB0byBiZSBwZXJmb3JtZWQgYnkgdGhlIFJvbGUsIGVpdGhlciBhcyBwcmltYXJ5IG9yIGFkZGl0aW9uYWwgcGVyZm9ybWVyLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l5emRadS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im1vZGlmaWVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRFZS1zRWR1SDU5S1NIVjh2Z0EiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249Il95eXpkWk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZFotLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZGFPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l5emRhZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRlZmF1bHRfUmVzcG9uc2libGUiIG1lbWJlckVuZD0iX3l5emRhLS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRGLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eXpkYXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXl6ZGFlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlJlc3BvbnNpYmlsaXR5IGZvciBhIHdvcmsgcHJvZHVjdCBpbmRpY2F0ZXMgdGhlIHJvbGUncyBvd25lcnNoaXAgb2YgYWxsIGluc3RhbmNlcyBvZiB0aGlzIHdvcmsgcHJvZHVjdCB0eXBlLiAgRm9yIGV4YW1wbGUsIHRoZSByb2xlIHJlc3BvbnNpYmxlIGZvciBhIHdvcmsgcHJvZHVjdCBhbnN3ZXJzIHRvIG1hbmFnZW1lbnQgYWJvdXQgaXRzIHF1YWxpdHkgc3RhdGUuICBCZWluZyByZXNwb25zaWJsZSBmb3IgdGhlIHdvcmsgcHJvZHVjdCBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlIHJvbGUgaXMgdGhlIG9ubHkgb25lIG1vZGlmeWluZyBpdCwgYnV0IG1ha2VzIHVsdGltYXRlIGRlY2lzaW9ucyBhYm91dCBhY2NlcHRpbmcgb3IgcmVqZWN0aW5nIHRoZXNlIG1vZGlmaWNhdGlvbnMgd2hlbiByZXZpZXdpbmcgdGhlc2UgbW9kaWZpY2F0aW9ucy4gIEV2ZXJ5IHdvcmsgcHJvZHVjdCBoYXMgbm9uZSBvciBvbmUgcm9sZSByZXNwb25zaWJsZSByb2xlLiA8L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eXpkYS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRFZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXl6ZGFlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRiTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRiZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eTlPRU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEZWZhdWx0X0FkZGl0aW9uYWxQZXJmb3JtZXIiIG1lbWJlckVuZD0iX3l5OU9FdS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRKLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eTlPRWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXk5T0VPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVmaW5lcyBhZGRpdGlvbmFsIHJvbGVzIHRoYXQgYnkgZGVmYXVsdCBjYW4gYmUgYXNzaWduZWQgdG8gaGVscCBjb21wbGV0aW5nIGEgVGFzay48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eTlPRXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJoZWxwc1BlcmZvcm1pbmciIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRHdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXk5T0VPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5OU9FLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5OU9GTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eTlPRmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJDb21wb3NpdGlvbiIgbWVtYmVyRW5kPSJfeXl6ZE9lLXNFZHVINTlLU0hWOHZnQSBfeXl6ZFBPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5OU9GdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eTlPRmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QXJ0aWZhY3QgdHlwZXMgY2FuIGJlIGRlZmluZWQgdG8gYmUgcGh5c2ljYWxseSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBpcyBjb21wb3NlZCBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l5OU9GLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRlZmF1bHREZWxpdmVyZWRXUCIgbWVtYmVyRW5kPSJfeXk5T0dlLXNFZHVINTlLU0hWOHZnQSBfeXl6ZFF1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5OU9HTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eTlPRi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZWZpbmVzIHRoZSBkZWZhdWx0IHBhcnRzIG9mIGEgZGVsaXZlcmFibGUsIGkuZS4gdGhlIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMgYSBEZWxpdmVyYWJsZSBjb21wcmlzZXMgb2YuICBUaGlzIGFnZ3JlZ2F0aW9uIGNhbiBiZSBvdmVycmlkZGVuIGluIGEgUHJvY2Vzcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eTlPR2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfZGVsaXZlcmFibGUiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il95eXpkUC0tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXk5T0YtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5OU9HdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5OU9HLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eTlPSE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEZWZhdWx0X09wdGlvbmFsSW5wdXRzIiBtZW1iZXJFbmQ9Il95eXpkS3Utc0VkdUg1OUtTSFY4dmdBIF95eTlPSHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXk5T0hlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5OU9ITy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIGxpbmtzIHRvIHplcm8gb3IgbWFueSBkZWZpbml0aW9ucyBvZiBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIGRlZmluZWQgYXMgb3B0aW9uYWwgaW5wdXRzIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzay48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eTlPSHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJvcHRpb25hbElucHV0VG8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRHdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXk5T0hPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5OU9ILS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5OU9JTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eTlPSWUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95eXpkTGUtc0VkdUg1OUtTSFY4dmdBIF95eTlPSS0tc0VkdUg1OUtTSFY4dmdBIiBpc0Rlcml2ZWQ9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eTlPSXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXk5T0llLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgZGVyaXZlZCBhc3NvY2lhdGlvbiBpcyBhIHNob3J0Y3V0IGZvciBuYXZpZ2F0aW9uIGFsb25nIHRoZSBhc3NvY2lhdGlvbiBwcm9wZXJ0aWVzIENvbnRlbnRFbGVtZW50LnByZXNlbnRhdGlvbi5zZWN0aW9ucy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eTlPSS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfdGFzayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZEd1LXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3l5OU9JZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l5OU9KTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l5emRULS1zRWR1SDU5S1NIVjh2Z0EgX3l5OU9KdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eTlPSmUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXk5T0pPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgY29tcG9zaXRpb24gYXNzb2NpYXRpb24gYWRkcyBhbiBvcHRpb25hbCBwcmUtY29uZGl0aW9uIHRvIGEgV29yayBEZWZpbml0aW9uLiAgQSBwcmUtY29uZGl0aW9uIGRlZmluZXMgYW55IGtpbmQgb2YgY29uc3RyYWludCB0aGF0IG11c3QgZXZhbHVhdGUgdG8gdHJ1ZSBiZWZvcmUgdGhlIHdvcmsgZGVzY3JpYmVkIGZvciB0aGUgV29yayBEZWZpbml0aW9uIGNhbiBzdGFydC4gRm9yIGV4YW1wbGUsIGEgcHJlLWNvbmRpdGlvbiBmb3IgYSBUYXNrIGNvdWxkIGRlZmluZSB0aGF0IGFuIGlucHV0IFdvcmsgUHJvZHVjdCBuZWVkcyB0byBiZSBpbiBhIHNwZWNpZmljIHN0YXRlIG9yIHRoYXQgb3RoZXIgcmVsYXRlZCB3b3JrIG11c3QgYmUgaW4gYSBjZXJ0YWluIHN0YXRlIChlLmcuICdJbnB1dCBkb2N1bWVudCBYIGhhcyBiZWVuIHJldmlld2VkIGFuZCBzaWduZWQgYnkgY3VzdG9tZXIgQU5EIFRhc2sgJnF1b3Q7TWFuYWdlbWVudCBSZXZpZXcmcXVvdDsgaXMgY29tcGxldGUnKSBiZWZvcmUgdGhlIFRhc2sgY2FuIGJlZ2luLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXk5T0p1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3dvcmtEZWZpbml0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkVE8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXk5T0pPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXk5T0otLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXl6ZFV1LXNFZHVINTlLU0hWOHZnQSBfeXk5T0tlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5OU9LTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eTlPSi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBjb21wb3NpdGlvbiBhc3NvY2lhdGlvbiBhZGRzIGFuIG9wdGlvbmFsIHBvc3QtY29uZGl0aW9uIHRvIGEgV29yayBEZWZpbml0aW9uLiAgQSBwb3N0LWNvbmRpdGlvbiBkZWZpbmVzIGFueSBraW5kIG9mIGNvbnN0cmFpbnQgdGhhdCBtdXN0IGV2YWx1YXRlIHRvIHRydWUgYmVmb3JlIHRoZSB3b3JrIGRlc2NyaWJlZCBmb3IgdGhlIFdvcmsgRGVmaW5pdGlvbiBjYW4gYmUgZGVjbGFyZWQgY29tcGxldGVkIG9yIGZpbmlzaGVkIGFuZCB3aGljaCBvdGhlciBXb3JrIERlZmluaXRpb25zIG1pZ2h0IGRlcGVuZCB1cG9uIChlLmcuIGZvciB0aGVpciBwcmUtY29uZGl0aW9ucykuICBGb3IgZXhhbXBsZSwgYSBwb3N0LWNvbmRpdGlvbiBmb3IgYSBUYXNrIGNvdWxkIGRlZmluZSB0aGF0IGEgd29yayBwcm9kdWN0IGRlZmluZWQgdG8gYmUgdGhlIG91dHB1dCBtdXN0IGJlIGluIGEgc3BlY2lmaWMgc3RhdGUgYmVmb3JlIHRoZSBUYXNrIGNhbiBlbmQgKGUuZy4gJ1VzZSBDYXNlIG11c3QgYmUgaW4gc3RhdGUgZnVsbHkgZGVzY3JpYmVkIGFuZCByZXZpZXdlZCBieSBTeXN0ZW0gQW5hbHlzdCcpLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l5OU9LZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il93b3JrRGVmaW5pdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZFRPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3l5OU9KLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l6MS00ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkNvbmNlcHQiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95ejEtNHUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXoxLTRlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgQ29uY2VwdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXoxLTQtLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l6MS01Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkNoZWNrbGlzdCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6MS01ZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95ejEtNU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBDaGVja2xpc3QgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgaWRlbnRpZmllcyBhIHNlcmllcyBvZiBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmktZmllZC4gIENoZWNrbGlzdHMgYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy4gPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXoxLTV1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l6MS01LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkV4YW1wbGUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95ejEtNk8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXoxLTUtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkFuIEV4YW1wbGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHR5cGljYWwsIHBhcnRpYWxseSBjb21wbGV0ZWQsIHNhbXBsZSBpbnN0YW5jZSBvZiBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIG9yIHNjZW5hcmlvIGxpa2UgZGVzY3JpcHRpb25zIG9mIGhvdyBUYXNrIG1heSBiZSBwZXJmb3JtZWQuIEV4YW1wbGVzIGNhbiBiZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdHMgYXMgd2VsbCBhcyBUYXNrcyB0aGF0IHByb2R1Y2UgdGhlbSBhcyB3ZWxsIGFzIGFueSBvdGhlciBDb250ZW50IEVsZW1lbnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXoxLTZlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l6MS02dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ikd1aWRlbGluZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6MS02LS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95ejEtNnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBHdWlkZWxpbmUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95ejEtN08tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZE0tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXoxLTdlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUmVwb3J0Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXoxLTd1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6MS03ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFJlcG9ydCBpcyBhIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGludG8gYSByZXBvcnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXoxLTctLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l6MS04Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlRlbXBsYXRlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXoxLThlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6MS04Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFRlbXBsYXRlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGZvciBhIHdvcmsgcHJvZHVjdCBhIHByZS1kZWZpbmVkIHRhYmxlIG9mIGNvbnRlbnRzLCBzZWN0aW9ucywgcGFja2FnZXMsIGFuZC9vciBoZWFkaW5ncywgYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBob3cgdGhlIHNlY3Rpb25zIGFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2Fubm90IG9ubHkgYmUgcHJvdmlkZWQgZm9yIGRvY3VtZW50cywgYnV0IGFsc28gZm9yIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEgc3RvcmVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l6MS04dS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkTS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95ejEtOC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95ejEtOU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXoxLTgtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlN1cHBvcnRpbmcgTWF0ZXJpYWxzIGlzIGNhdGNoYWxsIGZvciBvdGhlciB0eXBlcyBvZiBndWlkYW5jZSBub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZCB0byBhbGwga2luZHMgb2YgQ29udGVudCBFbGVtZW50cywgaS5lLiBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXoxLTllLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l6MS05dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlRvb2xNZW50b3IiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95ejEtOS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXoxLTl1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgVG9vbCBNZW50b3IgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l6MS0tTy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkTS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95ejEtLWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJXaGl0ZXBhcGVyIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXoxLS11LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6MS0tZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5XaGl0ZXBhcGVycyBhcmUgYSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95ejEtLS0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXoxLTRlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXoxLV9PLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iVGVybURlZmluaXRpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95ejEtX2Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXoxLV9PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRlcm1EZWZpbml0aW9ucyBkZWZpbmUgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGhleSBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gQ29udGVudEVsZW1lbnRzLCBidXQgdGhlaXIgcmVsYXRpb25zaGlwIGlzIGJlaW5nIGRlcml2ZWQgd2hlbiB0aGUgVGVybSBpcyB1c2VkIGluIHRoZSBDb250ZW50RWxlbWVudHMgZGVzY3JpcHRpb24gdGV4dC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95ejEtX3Utc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZE0tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iV29ya1Byb2R1Y3QiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eXpkTWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PldvcmsgUHJvZHVjdCBpcyBhbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4KLUEgd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6MV9DTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBpcyB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZSdzIGV4dGVuc2lvbiBvZiBXb3JrIFByb2R1Y3QgKGRlZmluZWQgaW4gQ29udGVudCBFbGVtZW50cykgcHJvdmlkaW5nIGFkZGl0b25hbCBhc3NvY2lhdGlvbnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXl6ZE11LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95ejFfQ2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZXBvcnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtN2Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l6X3dGdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95ejFfQ3Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95ejFfQy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l6MV9ETy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InRlbXBsYXRlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLThPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95el93SU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXoxX0RlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXoxX0R1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95ejFfRC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ0b29sTWVudG9ycyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLTl1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95MEpnNnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXoxX0VPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXoxX0VlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95ejFfRXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6X3ZfLS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTBKZzh1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6MV9FLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6MV9GTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eXpkR3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJUYXNrIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXl6ZEctLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5emRHdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFRhc2sgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd29yayBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBJdCBkZWZpbmVzIG9uZSBkZWZhdWx0IHBlcmZvcm1pbmcgUm9sZSBhcyB3ZWxsIGFzIG1hbnkgYWRkaXRpb25hbCBwZXJmb3JtZXJzLiAgQSBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiAgSW5wdXRzIGFyZSBkaWZmZXJlbnRpYXRlZCBpbiBtYW5kYXRvcnkgdmVyc3VzIG9wdGlvbmFsIGlucHV0cy4gIFRoZSBhc3NvY2lhdGlvbnMgdG8gV29yayBQcm9kdWN0cyBhcmUgbm90IGluc3RhbnRpYXRhYmxlL3ZhcmlhYmxlLWxpa2UgcGFyYW1ldGVycy4gIFRoZXkgcmF0aGVyIGV4cHJlc3MgKGh5cGVyLSlsaW5rcyB0byB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSB3b3JrIHByb2R1Y3RzIHR5cGVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIFRhc2sgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiAgSW4gb3RoZXIgd29yZHMsIHRoZXNlIGFzc29jaWF0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY2FwdHVyZSB3aGljaCBjb25jcmV0ZSBpbnN0YW5jZXMgd2lsbCBiZSBwYXNzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBtZXRob2QgaW4gYSBwcm9qZWN0LiAgQWxsIG9mIHRoZSBUYXNrJ3MgZGVmYXVsdCBhc3NvY2lhdGlvbnMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYW4gYWN0dWFsIHByb2Nlc3MgZGVmaW5pdGlvbi4KLUEgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuIAotQSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gCi1Gb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV2ZWxvcCBVc2UgQ2FzZSBNb2RlbCZxdW90OyBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICZxdW90O21ldGhvZCZxdW90OyBvZiBEZXZlbG9waW5nIGEgVXNlIENhc2UgTW9kZWwuICBBcHBseWluZyBzdWNoIGEgbWV0aG9kIGluIGEgbGlmZWN5Y2xlIChpLmUuIGluIGEgcHJvY2VzcykgaXMgZGVmaW5pbmcgd2hpY2ggc3RlcHMgYXJlIGRvbmUgd2hlbiBnb2luZyBmcm9tIG9uZSBpdGVyYXRpb24gdG8gdGhlIG5leHQuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXoxX0ZlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5emRHdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGlzIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlJ3MgZXh0ZW5zaW9uIG9mIFRhc2sgKGRlZmluZWQgaW4gQ29udGVudCBFbGVtZW50cykgcHJvdmlkaW5nIGFkZGl0aW9uYWwgYXNzb2NpYXRpb25zLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l5emRITy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXl6ZEhlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRUTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eXpkSHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwZXJmb3JtZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZEVlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95eXpkVmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZEgtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZElPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eXpkSWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95eXpkV3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZEl1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZEktLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eXpkSk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJvdXRwdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXl6ZFgtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRKZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRKdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXl6ZEotLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRFZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXk5T0VPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRLTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRLZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXl6ZEt1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95eTlPSE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZEstLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZExPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eXpkTGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdGVwcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZFNPLXNFZHVINTlLU0hWOHZnQSIgaXNEZXJpdmVkPSJ0cnVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3l5OU9JZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eXpkTHUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eXpkTC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l6X3Y0Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InRvb2xNZW50b3JzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtOXUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l6X3dKZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95el92NGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95el92NHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l6X3Y0LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXpfdl8tLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95MEpnN3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfdjVPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfdjVlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l6X3ZfTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlJldXNhYmxlQXNzZXQiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95el92X2Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXpfdl9PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUmV1c2FibGUgQXNzZXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZwotaG93IHRoZSBhc3NldCBzaG91bGQgYmUgdXNlZC4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l6X3ZfdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkTS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95el92Xy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95el93QU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXpfdl8tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMgcXVhbGlmeSB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l6X3dBZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkTS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95el93QXUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95el93Qk8tc0VkdUg1OUtTSFY4dmdBIF95el92NS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXpfd0EtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6X3dBdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Db250ZW50IEVsZW1lbnRzIGNhbiBiZSByZWxhdGVkIHRvIGFueSBudW1iZXIgb2YgU3VwcG9ydGluZyBNYXRlcmlhbCBndWlkYW5jZSBlbGVtZW50cy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95el93Qk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXpfd0F1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6X3dCZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6X3dCdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95el93Qi0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95el93Q2Utc0VkdUg1OUtTSFY4dmdBIF95el92NnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXpfd0NPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6X3dCLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Db250ZW50IEVsZW1lbnRzIGNhbiByZWZlciB0byBhbnkgbnVtYmVyIG9mIENvbmNlcHQgZ3VpZGFuY2UuIDwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l6X3dDZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95el93Qi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfd0N1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfd0MtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l6X3dETy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l6X3dEdS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y3ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95el93RGUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXpfd0RPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlByb3ZpZGVzIGNoZWNrIHBvaW50cyByZWxhdGVkIHRvIGEgcGFydGljdWxhciBjb250ZW50IGVsZW1lbnRzLiAgVGhlc2UgYXJlIHR5cGljYWxseSB1c2VkIGluIHJldmlld3MgYW5kIGluc3BlY3Rpb25zIG9uIHdvcmsgcHJvZHVjdHMuCi0KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l6X3dEdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3l6X3dETy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95el93RC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95el93RU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXpfd0VlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXpfd0UtLXNFZHVINTlLU0hWOHZnQSBfeXpfdjhPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6X3dFdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95el93RWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBhY2Nlc3MgdG8gZGV0YWlsZWQgR3VpZGVsaW5lcyByZWxhdGVkIHRvIHRoaXMgQ29udGVudCBFbGVtZW50LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l6X3dFLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3l6X3dFZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95el93Rk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95el93RmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXpfd0Z1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXpfd0dPLXNFZHVINTlLU0hWOHZnQSBfeXoxX0NlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6X3dGLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95el93RnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBSZXBvcnQgZXh0cmFjdHMgaW5mb3JtYXRpb24gYWJvdXQgb25lIG9yIG1vcmUgV29yayBQcm9kdWN0OyBub3JtYWxseSBkaXJlY3RseSBmcm9tIGEgdG9vbCB0aGF0IG1haW50YWlucyB0aGUgV29yayBQcm9kdWN0cy4gRm9yIGV4YW1wbGUsIGEgUmVwb3J0IGNhbiBwcmVzZW50IGRldGFpbHMgb2YgYW4gQXJ0aWZhY3Qgb3IgYSBzZXQgb2YgQXJ0aWZhY3RzIGZvciB1c2UgaW4gYSB0ZWNobmljYWwgcmV2aWV3LiA8L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95el93R08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfd29ya1Byb2R1Y3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95el93RnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfd0dlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfd0d1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l6X3dHLS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l6X3dIZS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y4LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95el93SE8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXpfd0ctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlByb3ZpZGVzIGEgc2FtcGxlIG9mIHdoYXQgdGhlIHdvcmsgcHJvZHVjdCBtYXkgbG9vayBsaWtlLCBhbiBhY3R1YWwgaW5zdGFuY2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXpfd0hlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2NvbnRlbnRFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXpfd0ctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6X3dIdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6X3dILS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95el93SU8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95el93SXUtc0VkdUg1OUtTSFY4dmdBIF95ejFfRE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXpfd0llLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6X3dJTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Qcm92aWRlcyBkZXRhaWxlZCBndWlkYW5jZSBvbiBob3cgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0IGluZGVwZW5kZW50IG9mIGEgc3BlY2lmaWMgc2V0IG9mIHRhc2tzIG9yIFdCUy4gIE1heSBjb250YWluIHNwZWNpZmljIGFsZ29yaXRobXMgb3IgYWx0ZXJuYXRpdmUgZGV2ZWxvcG1lbnQgYXBwcm9hY2hlcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95el93SXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfd29ya1Byb2R1Y3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95el93SU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfd0ktLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfd0pPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l6X3dKZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l6X3dKLS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y0Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95el93SnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXpfd0plLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkxpbmtzIFRhc2tzIHdpdGggVG9vbCBNZW50b3JzIHdoaWNoIGFyZSBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93IGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIHBlcmZvcm0gdGhlIFRhc2suPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXpfd0otLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3Rhc2siIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRHdS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95el93SmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfd0tPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfd0tlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l6X3dLdS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l6MV9BdS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dMTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95el93Sy0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXpfd0t1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUHJhY3RpY2UgY2FuIGJlIGNvbXBvc2VkIG9mIG90aGVyIFByYWN0aWNlcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95el93TE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfcHJhY3RpY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS1fLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95el93S3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95MEpnNE8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95ejFfQmUtc0VkdUg1OUtTSFY4dmdBIF95MEpnNHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTBKZzRlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kwSmc0Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFByYWN0aWNlIGNhbiByZWZlcmVuY2UgYW55IENvbnRlbnQgRWxlbWVudC4gIFRoZSBhc3NvY2lhdGlvbiBleHByZXNzZXMgdGhhdCB0aGlzIENvbnRlbnQgRWxlbWVudCBpcyBwYXJ0IG9mIG9yIGJlbG9uZ3MgdG8gdGhpcyBQcmFjdGljZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95MEpnNHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfcHJhY3RpY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS1fLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95MEpnNE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTBKZzQtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTBKZzVPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kwSmc1ZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l6X3Y5dS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc1LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MEpnNXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTBKZzVlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgd29yayBwcm9kdWN0IGlzIHJlbGF0ZWQgdG8gb25lIG9yIG1vcmUgYXNzZXRzIHRvIDwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kwSmc1LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3kwSmc1ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MEpnNk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MEpnNmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTBKZzZ1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXoxX0QtLXNFZHVINTlLU0hWOHZnQSBfeTBKZzYtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTBKZzYtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3dvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeTBKZzZ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kwSmc3Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kwSmc3ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95MEpnN3Utc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95MEpnNy0tc0VkdUg1OUtTSFY4dmdBIF95el92NC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95MEpnNy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfdGFzayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZEd1LXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3kwSmc3dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MEpnOE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MEpnOGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTBKZzh1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTBKZzgtLXNFZHVINTlLU0hWOHZnQSBfeXoxX0V1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTBKZzgtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3dvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeTBKZzh1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kwSmc5Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kwSmc5ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95MEpnOXUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95el92LWUtc0VkdUg1OUtTSFY4dmdBIF95MEpnOS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95MEpnOS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSIiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kwSmc5dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MEpnLU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MEpnLWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTFNQ3NPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTFNQ3NlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3kxTUM3ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1Dc3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJicmllZk91dGxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTUNzLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1Dc3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTUN0Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTUN0ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTUN0dS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTUN0LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJlcHJlc2VudGF0aW9uT3B0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNQ3VPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTUN0LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1DdWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1DdXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1DdS0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1Ddk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZXByZXNlbnRhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTUN2ZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTUN2dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTUN2LS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTUN3Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im5vdGF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNQ3dlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNQ3d1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNQ3ctLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95MU1DeE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95MU1DeGUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTFNQzdlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTUN4dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImV4dGVybmFsRGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTUN4LS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1DeHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1DeU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1DeWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1DeXUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1DeS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNQ3pPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTUN5LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGd1aWRhbmNlIG9uIGhvdyB0byBhc3NlbWJsZSB0aGUgZGVsaXZlcmFibGUgZnJvbSBhbGwgaXRzIHJlcXVpcmVkIGlucHV0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgY29tbW9uIGNvbnRlbnQgbWVkaXVtIGFuZCBmb3JtYXQuICBEaXN0cmlidXRpb24gb2YgdGhlIGRlbGl2ZXJhYmxlIGlzIGFkZHJlc3NlZCBpbiB0aGlzIHNlY3Rpb24sIGlmIG5lY2Vzc2FyeS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1DemUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1DenUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1Dei0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kxTUMwTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlJvbGVEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTFNQzBlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdWLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1DMHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJza2lsbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTUMwLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1DMHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5MaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNQzFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNQzFlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNQzF1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNQzEtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYXNzaWdubWVudEFwcHJvYWNoZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTUMyTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1DMS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBndWlkYW5jZSBvbiBmb3IgYXNzaWduaW5nIGluZGl2aWR1YWxzIHRvIHRoZSBSb2xlIGluIHRlcm1zIG9mIHdoYXQgb3RoZXIgcm9sZXMgdGhlc2UgaW5kaXZpZHVhbHMgY291bGQgcGVyZm9ybSBhbmQgd2hhdCByZXNwb25zaWJpbGl0eSBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgYXNzaWduZWQgdG8gdGhpcyByb2xlIG1pZ2h0IGhhdmUuICBUaGUgZ3VpZGFuY2UgY2FuIGFsc28gZGVzY3JpYmUgZGlmZmVyZW50IGFzc2lnbm1lbnQgYXBwcm9hY2hlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLCBlLmcuIGZvciBsYXJnZSB2ZXJzdXMgc21hbGwgdGVhbXMgd2hlcmUgaW5kaXZpZHVhbHMgY291bGQgYmUgYWxsb2NhdGVkIHRvIHJvbGVzIGZ1bGwgdGltZSB2ZXJzdXMgc2hhcmluZyByb2xlcyB3aXRoaW4gdGhlIHRlYW0uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNQzJlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNQzJ1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNQzItLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNQzNPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3lub255bXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTUMzZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1DM08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5MaXN0cyBzeW5vbnltcywgaS5lLiBvdGhlciBuYW1lcyB0aGUgUm9sZSBtaWdodCBiZSByZWZlcnJlZCBieS4gIFRvb2wgc3VwcG9ydCBmb3IgdGhlIG1ldGEtbW9kZWwgbWlnaHQgc3VwcG9ydCB0aGF0IGEgUm9sZSBuYW1lIGNhbiBiZSBjb25zaXN0ZW50bHkgYmUgcmVwbGFjZWQgd2l0aCBvbmUgb2YgaXRzIHN5bm9ueW1zIHRocm91Z2h0IGEgUHJvY2Vzcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1DM3Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1DMy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1DNE8tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kxTUM0ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlRhc2tEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTFNQzR1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdWLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1DNC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwdXJwb3NlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1DNU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNQzQtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTUM1ZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTUM1dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTUM1LS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTUM2Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFsdGVybmF0aXZlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNQzZlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTUM2Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1DNnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1DNi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1DN08tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kxTUM3ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kxTUM3dS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3Vi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNQzctLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHVycG9zZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNQzhPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTUM3LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkRlc2NyaWJlcyB3aHkgdGhlIHdvcmsgcHJvZHVjdCBpcyBwcm9kdWNlZCBhbmQgdG8gd2hhdCB1c2UgaXQgd2lsbCBiZSBwdXQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNQzhlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNQzh1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNQzgtLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNQzlPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaW1wYWN0T2ZOb3RIYXZpbmciIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTUM5ZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1DOU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5EZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTUM5dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTUM5LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTUMtTy1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTUMtZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJlYXNvbnNGb3JOb3ROZWVkaW5nIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1DLXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNQy1lLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+RGVzY3JpYmVzIHRoZSBjaXJjdW1zdGFuY2VzIGluIHdoaWNoIGl0IGlzIHJlYXNvbmFibGUgbm90IHRvIHByb2R1Y2UgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3Jpbmcgb2YgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNQy0tLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNQ19PLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNQ19lLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95MU1DX3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95MU1DXy0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1YtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTURBTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImF0dGFjaG1lbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1EQWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNREFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhpcyBmaWVsZCBpcyBwcmltYXJpbHkgdXNlZCBmb3IgYXR0YWNobWVudHMgYXVnbWVudGluZyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgZm9yIGd1aWRhbmNlLiAgSW4gcGFydGljdWxhciB0aGUgYXR0cmlidXRlIGlzIHVzZWQgZm9yIFRlbXBsYXRlcywgRXhhbXBsZXMsIGFuZCBSZXVzYWJsZSBBc3NldHMgdG8gY29udGFpbiB0aGUgYWN0dWFsIGF0dGFjaG1lbnQgZGVzY3JpYmVkIGluIHRoZSBtYWluRGVzY3JpcHRpb24uICBJdCBjYW4gYWRkaXRpb25hbGx5IGNvbnRhaW4gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBndWlkYW5jZSBpbiBqdXN0IGEgdGhpcmQgcGFydHkgZm9ybWF0LCBlLmcuIFBERiwgTVMgV29yZCwgb3IgV29yZCBQZXJmZWN0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTURBdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTURBLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTURCTy1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTFNREJlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTFNREJ1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdWLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1EQi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJhZGRpdGlvbmFsSW5mbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNRENPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTURCLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTURDZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTURDdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTURDLS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTURETy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InByb2JsZW0iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTUREZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1ERE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5BIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRoZSBQcmFjdGljZSBhZGRyZXNzZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNRER1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNREQtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNREVPLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNREVlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYmFja2dyb3VuZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNREV1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTURFZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkVsYWJvcmF0aW9uIG9uIHRoZSBiYWNrZ3JvdW5kIGFuZCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgcHJvYmxlbSBvY2N1cnMgYW5kIHdoZXJlIHRoZSBzb2x1dGlvbiBkZXNjcmliZWQgYnkgdGhpcyBQcmFjdGljZSB3aWxsIGZpdCBpbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1ERS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1ERk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1ERmUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1ERnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJnb2FscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNREYtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTURGdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTURHTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTURHZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTURHdS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTURHLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFwcGxpY2F0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1ESE8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNREctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+RGVzY3JpYmVzIGhvdyB0aGUgUHJhY3RpY2UgaXMgYmVpbmcgYXBwbGllZCBvciBpbnRyb2R1Y2VkIGludG8gdGhlIGNvbnRleHQgZGVzY3JpYmVkIGluIGJhY2tncm91bmQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNREhlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNREh1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNREgtLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNRElPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibGV2ZWxzT2ZBZG9wdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNREllLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTURJTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5Pk91dGxpbmVzIHRoZSBkaWZmZXJlbnQgZm9ybXMgb3IgdmFyaWFudHMgaW4gd2hpY2ggdGhlIHByYWN0aWNlIGNvdWxkIGJlIHJlYWxpemVkLiAoZS5nLiBmdWxsIGFkb3B0aW9uIHZlcnVzIGEgcGFydGlhbCBhZG9wdGlvbiBvZiB0aGUgUHJhY3RpY2UpPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNREl1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNREktLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNREpPLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eHc3ZXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEZXNjcmliYWJsZUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3ZS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N2V1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkRlc2NyaWJhYmxlIEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgTWV0aG9kIEVsZW1lbnRzIGZvciB3aGljaCBleHRlcm5hbCBwcmVzZW50YXRpb24gbmFtZXMgYXMgd2VsbCBhcyBjb250ZW50IGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCwgc3VjaCBhcyBSb2xlcyBvciBXb3JrIFByb2R1Y3RzLiAgUHJlc2VudGF0aW9uIE5hbWUgYW5kIENvbnRlbnQgRGVzY3JpcHRpb25zIGFyZSB0eXBpY2FsbHkgbG9jYWxpemVkIHVzaW5nIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIGl0cyBTdHJpbmcgdHlwZSBhdHRyaWJ1dGVzLgotVGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlIChzZWUgU2VjdGlvbiA0LjEuNCkuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTURKZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3ZXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBkZWZpbml0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBleHRlbmRzIHRoZSBDb250ZW50IEVsZW1lbnQgZGVmaW5pdGlvbiB2aWEgcGFja2FnZSBtZXJnZSB3aXRoIHJlZmVyZW5jZXMgdG8gaWNvbnMgdGhhdCBhcmUgdXNlZCBmb3IgcHJlc2VudGluZyBDb250ZW50IEVsZW1lbnRzIGluIGEgVU1BLWJhc2VkIG1vZGVsaW5nIGVudmlyb25tZW50IGFzIHdlbGwgYXMgd2hlbiBwdWJsaXNoaW5nIENvbnRlbnQgRWxlbWVudHMgaW50byBkb2N1bWVudGF0aW9uIHByZXNlbnRhdGlvbiAoZS5nLiBkb2N1bWVudCBvciBodG1sIHBhZ2VzKS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eHc3Zk8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXhLZkN1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l4dzdmZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3UWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXh3N2Z1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJlc2VudGF0aW9uTmFtZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N2YtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdmdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAmcXVvdDtydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50JnF1b3Q7IHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICZxdW90O2oyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQmcXVvdDsgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAmcXVvdDtBcmNoaXRlY3R1cmUgRG9jdW1lbnQmcXVvdDsuCi08L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eHc3Z08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eHc3Z2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95eHc3Z3Utc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eHc3Zy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcmVzZW50YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdWLS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeXh3N21lLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l4dzdoTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l4dzdoZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNREp1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic2hhcGVpY29uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQWnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1ESi0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNREp1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTURLTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTURLZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTURLdS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQWnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTURLLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im5vZGVpY29uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQWnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1ETE8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNREstLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1ETGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1ETHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1ETC0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUFp1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kyT2tpZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlJvbGVTZXQiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9raXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPa2llLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUm9sZSBTZXQgb3JnYW5pemVzIFJvbGVzIGludG8gY2F0ZWdvcmllcy4gIEl0IGlzIHVzZWQgdG8gZ3JvdXAgcm9sZXMgdG9nZXRoZXIgdGhhdCBoYXZlIGNlcnRhaW4gY29tbW9uYWxpdGllcy4gIEZvciBleGFtcGxlLCB0aGUgJnF1b3Q7QW5hbHlzdHMmcXVvdDsgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICZxdW90O0J1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCZxdW90OywgJnF1b3Q7U3lzdGVtIEFuYWx5c3QmcXVvdDssIGFzIHdlbGwgYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIFNwZWNpZmllciZxdW90OyByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95Mk9raS0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTJPa251LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kyT2tqTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJvbGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkRWUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2t2Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9ramUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9ranUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTJPa2otLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRG9tYWluIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPa2tPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2tqLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Eb21haW4gaXMgYSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuCi1Eb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTJPa2tlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3kyT2tudS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95Mk9ra3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ3b3JrUHJvZHVjdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTJPa3dlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2trLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2tsTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTJPa2xlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3ViZG9tYWlucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa2otLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95Mk9reHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPa2x1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPa2wtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kyT2ttTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IldvcmtQcm9kdWN0VHlwZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2ttZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9rbU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+V29yayBQcm9kdWN0IFR5cGUgaXMgYSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICZxdW90O0NsYXNzIERpYWdyYW0mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7LCB3aGljaCBjYXRlZ29yaXplcyByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbnMgdGhhdCBkZWZpbmUgYSBzeXN0ZW0gd2l0aCBhIHdlbGwtZGVmaW5lZCBzeXN0ZW0gYm91bmRhcnksIHN1Y2ggYXMgdXNlIGNhc2Ugb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbi4gIEEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGNhbiBiZSBjYXRlZ29yaXplZCBhcyBhIFNwZWNpZmljYXRpb24gYXMgd2VsbCBhcyBEaWFncmFtIFdvcmsgUHJvZHVjdCBUeXBlLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTJPa211LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3kyT2tudS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95Mk9rbS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ3b3JrUHJvZHVjdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTJPa3llLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2tuTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2tuZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95Mk9rbnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9rbi0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPa251LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkNvbnRlbnQgQ2F0ZWdvcnkgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTJPa29PLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kyT2tvZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRpc2NpcGxpbmVHcm91cGluZyI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2tvdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9rb2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+RGlzY2lwbGluZSBHcm91cGluZ3MgYXJlIHVzZWQgdG8gZ3JvdXAgRGlzY2lwbGluZXMuICBGb3IgZXhhbXBsZSwgdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgJnF1b3Q7U29mdHdhcmUgRGlzY2lwbGluZXMmcXVvdDsgd291bGQgYmUgdGhlIGdyb3VwIG9mIGFsbCBkaXNjaXBsaW5lcyByZWxhdGVkIHRvIGRldmVsb3Bpbmcgc29mdHdhcmUgc3VjaCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgTWFuYWdlbWVudCZxdW90OyBvciAmcXVvdDtUZXN0aW5nJnF1b3Q7OyAmcXVvdDtJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50JnF1b3Q7IHdvdWxkIGJlIGEgRGlzY2lwbGluZXMgR3JvdXBpbmcgZm9yIGRpc2NpcGxpbmVzIHN1Y2ggYXMgJnF1b3Q7SVQgT3BlcmF0aW9uYWwgU2VydmljZXMmcXVvdDssICZxdW90O0lUIEN1c3RvbWVyIFJlbGF0aW9uc2hpcHMmcXVvdDssIG9yICZxdW90O0lUIEVuYWJsaW5nIFNlcnZpY2VzJnF1b3Q7LiAgRGlzY2lwbGluZXMgY2FuIGJlIGFzc29jaWF0ZWQgdG8gbW9yZSB0aGFuIG9uZSBEaXNjaXBsaW5lIEdyb3VwaW5nLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTJPa28tLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3kyT2tudS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95Mk9rcE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJkaXNjaXBsaW5lcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa2dPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95Mk9renUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPa3BlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPa3B1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kyT2twLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlRvb2wiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9rcU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPa3AtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgVG9vbCBpcyBhIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kyT2txZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95Mk9rbnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTJPa3F1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idG9vbE1lbnRvcnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS05dS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTJPazAtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2txLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2tyTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95Mk9rcmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJSb2xlU2V0R3JvdXBpbmciPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9rcnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPa3JlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95Mk9rci0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTJPa251LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kyT2tzTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJvbGVTZXRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9raWUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2syTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9rc2Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9rc3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTJPa3MtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcnkiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9rdE8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPa3MtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgQ3VzdG9tIENhdGVnb3J5IGlzIGEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAmcXVvdDtUZXN0aW5nJnF1b3Q7IGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95Mk9rdGUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTJPa251LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kyT2t0dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNhdGVnb3JpemVkRWxlbWVudHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdldS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTJPazNlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2t0LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2t1Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTJPa3VlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3ViQ2F0ZWdvcmllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa251LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95Mk9rNHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPa3V1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPa3UtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kyT2t2Ty1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kyT2t2dS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2tqTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9rdmUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPa3ZPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUm9sZSBTZXQgY2F0ZWdvcml6ZXMgbWFueSBSb2xlcyBhbmQgYSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBpbiBtYXkgUm9sZSBTZXRzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kyT2t2dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJvbGVTZXRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9raWUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2t2Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9rdi0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9rd08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTJPa3dlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTJPa3ctLXNFZHVINTlLU0hWOHZnQSBfeTJPa2t1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2t3dS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9rd2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBEb21haW4gY2F0ZWdvcml6ZXMgbWFueSBXb3JrIFByb2R1Y3RzLiBBIFdvcmsgUHJvZHVjdCBiZWxvbmdzIGF0IG1vc3QgdG8gb25lIERvbWFpbi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95Mk9rdy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJkb21haW4iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tqLS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTJPa3dlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2t4Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2t4ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95Mk9reHUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95Mk9reU8tc0VkdUg1OUtTSFY4dmdBIF95Mk9rbGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPa3gtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2t4dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Eb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBTdWJkb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyBvbmx5IHRvIGJlIGNhdGVnb3JpemVkIGF0IHRoZSBsZWFmLWxldmVsLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kyT2t5Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9kb21haW4iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tqLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95Mk9reHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95Mk9reWUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95Mk9reS0tc0VkdUg1OUtTSFY4dmdBIF95Mk9rbS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPa3l1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2t5ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgemVybyBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95Mk9reS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ3b3JrUHJvZHVjdFR5cGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rbU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2t5ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9rek8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9remUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTJPa3p1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTJPazBPLXNFZHVINTlLU0hWOHZnQSBfeTJPa3BPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2t6LS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9renUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+RGlzY2lwbGluZSBHcm91cGluZ3MgZ3JvdXAgbWFueSBEaXNjaXBsaW5lcy4gIEEgRGlzY2lwbGluZSBjYW4gYmUgaW4gbWFueSBEaXNjaXBsaW5lIEdyb3Vwcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95Mk9rME8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJkaXNjaXBsaW5lR3JvdXBzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rb2Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2t6dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9rMGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9rMHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTJPazAtLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTJPazFlLXNFZHVINTlLU0hWOHZnQSBfeTJPa3F1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2sxTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9rMC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBUb29sIE1lbnRvciBkZXNjcmliZXMgd29yayB3aXRoIGV4YWN0bHkgb25lIFRvb2wuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTJPazFlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idG9vbCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa3AtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95Mk9rMC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPazF1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPazEtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95Mk9rMk8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95Mk9rMnUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rc08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPazJlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2syTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFJvbGUgU2V0IEdyb3VwaW5nIGNvbnRhaW5zIG1hbnkgUm9sZSBTZXRzLiBSb2xlIFNldHMgY2FuIGJlIGluIG1hbnkgUm9sZSBTZXQgR3JvdXBpbmdzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kyT2sydS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJvbGVTZXRHcm91cHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tyZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTJPazJPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2syLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2szTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95Mk9rM2Utc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95Mk9rdHUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rMy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPazN1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2szZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIEN1c3RvbUNhdGVnb3J5IGdyb3VwcyB0b2dldGhlciBhbnkgbnVtYmVyIG9mIENvbnRlbnRFbGVtZW50cyBpbmNsdWRpbmcgb3RoZXIgQ29udGVudENhdGVnb3J5LiA8L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95Mk9rMy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjdXN0b21DYXRlZ29yaWVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rcy0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2szZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9rNE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9rNGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTJPazR1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTJPa3VlLXNFZHVINTlLU0hWOHZnQSBfeTJPazVPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2s0LS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9rNHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBDdXN0b21DYXRlZ29yeSBjYW4gaGF2ZSBhbnkgbnVtYmVyIG9mIENvbnRlbnRDYXRlZ29yaWVzIGRlZmluZWQgYXMgbmVzdGVkIHN1YkNhdGVnb3JpZXMuICBUaGVyZWZvcmUsIG9uZSBjb3VsZCBuZXN0IEN1c3RvbUNhdGVnb3JpZXMgaW50byBuLWxldmVsIGhpZXJhcmNoaWVzLiA8L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95Mk9rNU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfY3VzdG9tQ2F0ZWdvcnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tzLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95Mk9rNHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPazVlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPazV1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95Mk9rNS0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95Mk9rZy0tc0VkdUg1OUtTSFY4dmdBIF95Mk9rNmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPazZPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2s1LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5FdmVyeSBUYXNrIHNob3VsZCBiZSByZWxhdGVkIHRvIGV4YWN0bHkgb25lIERpc2NpcGxpbmUuICBGb3IgbGVnYWN5IHJlYXNvbnMgdGhpcyBpcyBub3QgZW5mb3JjZWQgKGUuZy4gR1MgTWV0aG9kIGRvZXMgbm90IGRlZmluZSBEaXNjaXBsaW5lcywgeWV0KS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95Mk9rNmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJkaXNjaXBsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rZ08tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2s1LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9rNnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9rNi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTJPazdPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTJPa2h1LXNFZHVINTlLU0hWOHZnQSBfeTJPazdlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTJPazdlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2Rpc2NpcGxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tnTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95Mk9rN08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95M1J0WU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJTdGF0ZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTNSdFllLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3kzYTNZLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95M1J0WXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ3b3JrUHJvZHVjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95M2EzaGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTNSdFktLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTNSdFpPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTNSdFplLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmVnaW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95M2EzZWUtc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3kzYTNqZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95M1J0WnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95M1J0Wi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kzUnRhTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN1Ym1hY2hpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kzYTNYdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTNhM2p1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kzUnRhZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kzUnRhdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95M2EzVU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJUcmFuc2l0aW9uIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95M2EzVWUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kzYTNVdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IndvcmtEZWZpbml0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkVE8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kzYTNoLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95M2EzVS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95M2EzVk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95M2EzVmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjb250YWluZXIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kzYTNlZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTNhM2l1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kzYTNWdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kzYTNWLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kzYTNXTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InNvdXJjZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTNhM1ktLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95M2EzaS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTNhM1dlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTNhM1d1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTNhM1ctLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idGFyZ2V0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95M2EzWS0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kzYTNqTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95M2EzWE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95M2EzWGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kzYTNYdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlN0YXRlTWFjaGluZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTNhM1gtLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRUTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95M2EzWU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZWdpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kzYTNlZS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeTNhM2t1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kzYTNZZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kzYTNZdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTNhM1ktLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iVmVydGV4Ij4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95M2EzWk8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kzYTNaZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNvbnRhaW5lciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTNhM2VlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95M2EzaWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTNhM1p1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTNhM1otLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95M2EzYU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJvdXRnb2luZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTNhM1VPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95M2EzaS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTNhM2FlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTNhM2F1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95M2EzYS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJpbmNvbWluZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTNhM1VPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95M2Ezak8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTNhM2JPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTNhM2JlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kzYTNidS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlBzZXVkb1N0YXRlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95M2EzYi0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTNhM1ktLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfeTNhM2NPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUHNldWRvU3RhdGVLaW5kIj4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfeTNhM2NlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaW5pdGlhbCIvPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il95M2EzY3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJqb2luIi8+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3kzYTNjLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImZvcmsiLz4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfeTNhM2RPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ianVuY3Rpb24iLz4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfeTNhM2RlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY2hvaWNlIi8+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3kzYTNkdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImVudHJ5UG9pbnQiLz4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfeTNhM2QtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZXhpdFBvaW50Ii8+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3kzYTNlTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InRlcm1pbmF0ZSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTNhM2VlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUmVnaW9uIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95M2EzZXUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kzYTNlLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InZlcnRleCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTNhM1ktLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95M2EzaWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTNhM2ZPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTNhM2ZlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95M2EzZnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ0cmFuc2l0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95M2EzVU8tc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3kzYTNpdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95M2EzZi0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95M2EzZ08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kzYTNnZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN0YXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95M1J0WU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kzYTNqZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95M2EzZ3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdGF0ZU1hY2hpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kzYTNYdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTNhM2t1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kzYTNnLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kzYTNoTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95M2EzaGUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95M1J0WXUtc0VkdUg1OUtTSFY4dmdBIF95M2EzaHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95M2EzaHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTNSdFlPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95M2EzaGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95M2EzaC0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95M2EzVXUtc0VkdUg1OUtTSFY4dmdBIF95M2EzaU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95M2EzaU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ0cmFuc2l0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95M2EzVU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kzYTNoLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kzYTNpZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kzYTNlLS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNaZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kzYTNpdS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kzYTNmdS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNWZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kzYTNpLS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kzYTNhTy1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNXTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kzYTNqTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kzYTNhLS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNXLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kzYTNqZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kzUnRaZS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNnZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kzYTNqdS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kzUnRhTy1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNqLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kzYTNqLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN1Yk1hY2hpbmVTdGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTNSdFlPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95M2EzanUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTNhM2tPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTNhM2tlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kzYTNrdS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kzYTNZTy1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNndS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k0ZUFNZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ik1ldGhvZFBhY2thZ2UiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NGVBTXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTRlQU1lLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgTWV0aG9kIFBhY2thZ2UgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95NGVBTS0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXhVUFZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k0ZUFOTy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3UWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTRlQU5lLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZ2xvYmFsIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NGVBTnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTRlQU5lLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+TWV0aG9kIFBhY2thZ2VzIGNhbiBoYXZlIGEgZ2xvYmFsIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGV2ZXJ5IGVsZW1lbnQgb2YgZXZlcnkgb3RoZXIgTWV0aG9kIFBhY2thZ2UgY2FuIHNlZSB0aGUgZ2xvYmFsIHBhY2thZ2UncyBjb250ZW50cy4gIEdsb2JhbCBNZXRob2QgUGFja2FnZXMgYXJlIHByaW1hcmlseSB1c2VkIHRvIHN0b3JlIGNvbW1vbmx5IHVzZWQgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgc3VjaCBhcyBmb3IgRGlzY2lwbGluZXMgb3IgRG9tYWlucywgd2hpY2ggYXJlIHVzZWQgYnkgbWFueSBUYXNrIGFuZCBXb3JrIFByb2R1Y3RzIHJlc3BlY3RpdmVseS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfeTRlQU4tLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5PgotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTRlQU9PLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmV1c2VkUGFja2FnZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k0ZUFNZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTRlQVNlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k0ZUFPZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k0ZUFPdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTRlQU8tLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY2hpbGRQYWNrYWdlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTRlQU1lLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95NGVBVHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTRlQVBPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTRlQVBlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k0ZUFQdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkNvbnRlbnRQYWNrYWdlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTRlQVAtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k0ZUFQdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIENvbnRlbnQgUGFja2FnZSBpcyBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k0ZUFRTy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95NGVBTWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTRlQVFlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY29udGVudEVsZW1lbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3k0ZUFSTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NGVBUXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NGVBUS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTRlQVJPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTRlQVFlLXNFZHVINTlLU0hWOHZnQSBfeTRlQVJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k0ZUFSZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NGVBUk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBDb250ZW50IFBhY2thZ2UgY29udGFpbnMgQ29udGVudCBFbGVtZW50cy4gIEEgQ29udGVudCBFbGVtZW50IGluc3RhbmNlIGNhbiBiZSBwYXJ0IG9mIG9ubHkgb25lIHBhY2thZ2UgaW5zdGFuY2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTRlQVJ1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2NvbnRlbnRQYWNrYWdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95NGVBUHUtc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeTRlQVJPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k0ZUFSLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k0ZUFTTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTRlQVNlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTRlQVMtLXNFZHVINTlLU0hWOHZnQSBfeTRlQU9PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k0ZUFTdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NGVBU2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZXNjcmliZXMgYSBkZXBlbmRlbmN5IGJldHdlZW4gdGhlIHR3byBwYWNrYWdlcyBpdCBjb25uZWN0cy4gIFRoZSBwYWNrYWdlIGF0IHRoZSB1c2luZ1BhY2thZ2UgZW5kIGRlcGVuZHMgb24gdGhlIHBhY2thZ2UgYXQgdGhlIHJldXNlZFBhY2thZ2UgZW5kLiAgRm9yIGV4YW1wbGUsIGFuIGVsZW1lbnQgaW4gdGhlIGZvcm1lciBwYWNrYWdlIGlzIHVzaW5nIGFuIGVsZW1lbnQgaW4gdGhlIGxhdGVyIGluIGEgcmVsYXRpb25zaGlwIHN1Y2ggYXMgYSBUYXNrIGlzIHVzaW5nIGEgV29yayBQcm9kdWN0cyBhcyBhbiBpbnB1dC4gIFJlZmxleGl2ZSByZXVzZWRQYWNrYWdlIGxpbmtzIChpLmUuIGEgcGFja2FnZSB0aGF0IGRlcGVuZHMgb24gaXRzZWxmKSBhcmUgbm90IGFsbG93ZWQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTRlQVMtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idXNpbmdQYWNrYWdlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTRlQU1lLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NGVBU2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTRlQVRPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTRlQVRlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k0ZUFUdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlBhY2thZ2VOZXN0aW5nIiBtZW1iZXJFbmQ9Il95NGVBVU8tc0VkdUg1OUtTSFY4dmdBIF95NGVBTy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTRlQVQtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k0ZUFUdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5NZXRob2QgUGFja2FnZXMgY2FuIGJlIG5lc3RlZCwgaS5lLiBhIHBhY2thZ2UgY2FuIGJlIHBhcnQgb2YgYW5vdGhlciBwYWNrYWdlLiAgTmVzdGVkIHBhY2thZ2VzIGRvIG5vdCBuZWVkIHRvIGJlIG9mIHRoZSBzYW1lIHR5cGUsIGUuZy4gYSBDb250ZW50IFBhY2thZ2UgY2FuIGJlIGRlZmluZWQgaW5zaWRlIGEgUHJvY2VzcyBQYWNrYWdlIChkZWZpbmUgZm9yIHRoZSBQcm9jZXNzIHBhcnQgb2YgdGhpcyBtb2RlbCkuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTRlQVVPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX21ldGhvZFBhY2thZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k0ZUFNZS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95NGVBVHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTRlQVVlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTRlQVV1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k3bU10LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ik1pbGVzdG9uZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3bU11Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N21NdC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBNaWxlc3RvbmUgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3bU11ZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N3ZYS2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95N21NdXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJJdGVyYXRpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N21NdS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTdtTXV1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5Pkl0ZXJhdGlvbiBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotSXRlcmF0aW9uIGdyb3VwcyBhIHNldCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEl0IHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbiByZXBldGl0aXZlIGN5Y2xlcy4gIFRoZSBjb25jZXB0IG9mIEl0ZXJhdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCBydWxlcyBpbiBkaWZmZXJlbnQgbWV0aG9kcy4gIEZvciBleGFtcGxlLCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBtZXRob2QgZnJhbWV3b3JrIChSVVApIGRlZmluZXMgYSBydWxlIHRoYXQgSXRlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gc3BhbiBhY3Jvc3MgUGhhc2VzLiAgSW4gY29udHJhc3QgSUJNIEdsb2JhbCBTZXJ2aWNlcyBNZXRob2QgKEdTTWV0aG9kKSBiYXNlZCBtZXRob2QgZnJhbWV3b3JrcyB0aGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgYW5kIEl0ZXJhdGlvbiBjYW4gYmUgZGVmaW5lZCB3aGljaCBuZXN0IFBoYXNlcy4gIFJ1bGVzIGxpa2UgdGhlc2UsIHdoaWNoIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGVuZm9yY2VkIGJ5IHRoaXMgbWV0YS1tb2RlbC4gIEluc3RlYWQsIHByb2Nlc3MgYXV0aG9ycyBhcmUgZXhwZWN0ZWQgdG8gZm9sbG93IGFuZCBjaGVjayB0aGVzZSBydWxlcyBtYW51YWxseS4gIChOb3RlOiBBbnkgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGJlIHJlcGVhdGVkOyBob3dldmVyLCBJdGVyYXRpb25zIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYSBzcGVjaWFsIG1ldGEtbW9kZWwgY29uY2VwdCwgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW50IHJvbGUgZm9yIG1hbnkgbWV0aG9kcy4pCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95N21Ndk8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTdtTXZlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUGhhc2UiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N21NdnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTdtTXZlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlBoYXNlIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ1BoYXNlJykgYW5kIGlzUmVwZWF0YWJsZSAoJ0ZhbHNlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi1QaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3bU12LS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95N21Nd08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJUZWFtUHJvZmlsZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3bU13ZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N21Nd08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBUZWFtIFByb2ZpbGUgaXMgYSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLgotV29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLgotSGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTdtTXd1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k3dld2Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N21Ndy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ0ZWFtUm9sZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlczLS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTd2WE8tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3bU14Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3bU14ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTdtTXh1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3VwZXJUZWFtIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N21Nd08tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUhvTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N21NeC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N21NeU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N21NeWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdWJUZWFtIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N21Nd08tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUhvTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N21NeXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N21NeS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfeTd2V29PLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dldvZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXb08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+V29yayBPcmRlciByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEIpIGJlbG93KSBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEEpIGJlbG93KSBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il95N3ZXb3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJmaW5pc2hUb1N0YXJ0Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXby0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2V291LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+QnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBzdGFydCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgZmluaXNoZXMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0d28gQnJlYWtkb3duIEVsZW1lbnRzLCAmcXVvdDtDb25zdHJ1Y3QgZmVuY2UmcXVvdDsgYW5kICZxdW90O1BhaW50IGZlbmNlLCZxdW90OyAmcXVvdDtQYWludCBmZW5jZSZxdW90OyBjYW4ndCBzdGFydCB1bnRpbCAmcXVvdDtDb25zdHJ1Y3QgZmVuY2UmcXVvdDsgZmluaXNoZXMuIFRoaXMgaXMgdGhlIG1vc3QgY29tbW9uIHR5cGUgb2YgZGVwZW5kZW5jeSBhbmQgdGhlIGRlZmF1bHQgZm9yIGEgbmV3IFdvcmsgT3JkZXIgaW5zdGFuY2UuCi08L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3k3dldwTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImZpbmlzaFRvRmluaXNoIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXcGUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2V3BPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+QnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBmaW5pc2ggdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIGZpbmlzaGVzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIEJyZWFrZG93biBFbGVtZW50cywgJnF1b3Q7QWRkIHdpcmluZyZxdW90OyBhbmQgJnF1b3Q7SW5zcGVjdCBlbGVjdHJpY2FsLCZxdW90OyAmcXVvdDtJbnNwZWN0IGVsZWN0cmljYWwmcXVvdDsgY2FuJ3QgZmluaXNoIHVudGlsICZxdW90O0FkZCB3aXJpbmcmcXVvdDsgZmluaXNoZXMuCi08L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3k3dldwdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN0YXJ0VG9TdGFydCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2V3AtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dldwdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3Qgc3RhcnQgdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIHN0YXJ0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBCcmVha2Rvd24gRWxlbWVudHMsICZxdW90O1BvdXIgZm91bmRhdGlvbiZxdW90OyBhbmQgJnF1b3Q7TGV2ZWwgY29uY3JldGUsJnF1b3Q7ICZxdW90O0xldmVsIGNvbmNyZXRlJnF1b3Q7IGNhbid0IGJlZ2luIHVudGlsICZxdW90O1BvdXIgZm91bmRhdGlvbiZxdW90OyBiZWdpbnMuCi08L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3k3dldxTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN0YXJ0VG9GaW5pc2giPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dldxZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXcU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5CcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IGZpbmlzaCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgc3RhcnRzLiBUaGlzIGRlcGVuZGVuY3kgdHlwZSBjYW4gYmUgdXNlZCBmb3IganVzdC1pbi10aW1lIHNjaGVkdWxpbmcgdXAgdG8gYSBtaWxlc3RvbmUgb3IgdGhlIHByb2plY3QgZmluaXNoIGRhdGUgdG8gbWluaW1pemUgdGhlIHJpc2sgb2YgYSBCcmVha2Rvd24gRWxlbWVudCBmaW5pc2hpbmcgbGF0ZSBpZiBpdHMgZGVwZW5kZW50IEJyZWFrZG93biBFbGVtZW50cyBzbGlwLiBJZiBhIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnQgbmVlZHMgdG8gZmluaXNoIGJlZm9yZSB0aGUgbWlsZXN0b25lIG9yIHByb2plY3QgZmluaXNoIGRhdGUsIGJ1dCBpdCBkb2Vzbid0IG1hdHRlciBleGFjdGx5IHdoZW4gYW5kIHlvdSBkb24ndCB3YW50IGEgbGF0ZSBmaW5pc2ggdG8gYWZmZWN0IHRoZSBqdXN0LWluLXRpbWUgQnJlYWtkb3duIEVsZW1lbnQsIHlvdSBjYW4gY3JlYXRlIGFuIFNGIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgQnJlYWtkb3duIEVsZW1lbnQgeW91IHdhbnQgc2NoZWR1bGVkIGp1c3QgaW4gdGltZSAodGhlIHByZWRlY2Vzc29yKSBhbmQgaXRzIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnQgKHRoZSBzdWNjZXNzb3IpLiBUaGVuIGlmIHlvdSB1cGRhdGUgcHJvZ3Jlc3Mgb24gdGhlIHN1Y2Nlc3NvciBCcmVha2Rvd24gRWxlbWVudCwgaXQgd29uJ3QgYWZmZWN0IHRoZSBzY2hlZHVsZWQgZGF0ZXMgb2YgdGhlIHByZWRlY2Vzc29yIEJyZWFrZG93biBFbGVtZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k3dldxdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IldvcmtPcmRlciI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dldxLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXcXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+V29yayBPcmRlciBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgCi0oTm90ZSwgV29yayBPcmRlciBpcyBub3QgbW9kZWxlZCBhcyBhbiBBc3NvY2lhdGlvbiBDbGFzcyB0byBwcm92aWRlIGEgc3RyYWlnaHRmb3J3YXJkIG1hcHBpbmcgIHRvIFhNSSBhbmQgRU1GLikKLVRoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95N3ZXck8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTd2WE9PLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dldyZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImxpbmtUeXBlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXb08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXcnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2V3JlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGUgZXhwcmVzc2VzIHRoZSB0eXBlIG9mIHRoZSBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcCBieSBhc3NpZ25pbmcgYSB2YWx1ZSBmcm9tIHRoZSBXb3JrIE9yZGVyIFR5cGUgZW51bWVyYXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3k3dldyLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PmZpbmlzaFRvU3RhcnQ8L2JvZHk+Ci0gICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXc08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcmVkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZYS2Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUg4LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZXc2Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZXc3Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k3dldzLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlBsYW5uaW5nRGF0YSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dld0Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXcy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+UGxhbm5pbmcgRGF0YSBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLgotUGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LgotKE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCkKLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3dld0ZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N3ZYT08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2V3R1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3RhcnREYXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQWk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXdC0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2V3R1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXdU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJmaW5pc2hEYXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQWk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXdWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2V3VPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2V3V1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmFuayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGJPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2V3UtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dld1dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlRoZSBkZWZhdWx0IHJhbmsgZm9yIGEgcGxhbmVkIFRhc2suPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95N3ZXdk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2V3ZlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dld2Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5CcmVha2Rvd24gRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEl0IGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTd2V3YtLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k3dlhPTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXd08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcmVmaXgiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dld3ZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXd08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5QcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAmcXVvdDtTUkEuRXN0YWJsaXNoIFJlcXVpcmVtZW50cyZxdW90OyB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAmcXVvdDtTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMmcXVvdDsgbW9kdWxlLiAgQW5vdGhlciBjb21tb24gYXBwbGljYXRpb24gZm9yIHByZWZpeCBpcyB0byBxdWFsaWZ5IHJvbGVzIGluIFJvbGUgRGVzY3JpcHRvcnMuICBGb3IgZXhhbXBsZSwgJnF1b3Q7Q3VzdG9tZXIuQXJjaGl0ZWN0JnF1b3Q7IHdvdWxkIGRlZmluZSBhICZxdW90O0N1c3RvbWVyJnF1b3Q7IHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAmcXVvdDtBcmNoaXRlY3QmcXVvdDsgZXhwcmVzc2luZyB0aGF0IHRoaXMgaXMgYW4gYXJjaGl0ZWN0IG9uIHRoZSBjdXN0b21lciBzaWRlIGFuZCBub3QgdGhlIGRldmVsb3BtZW50IHRlYW0gc2lkZS4KLTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dld3dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dld3LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3k3dld4Ty1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dld4ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImlzUGxhbm5lZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2V3h1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dld4ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkEga2V5IGFwcGxpY2F0aW9uIGZvciBEZXZlbG9wbWVudCBQcm9jZXNzZXMgZXhwcmVzc2VkIHdpdGggQnJlYWtkb3duIHN0cnVjdHVyZXMgaXMgdG8gZ2VuZXJhdGUgYSBwcm9qZWN0IHBsYW4gZnJvbSBpdC4gIEEgcHJvY2VzcyBhcyBkZWZpbmVkIGluIFVNQSAoY2YuIHdpdGggU2VjdGlvbnMgWFggYW5kIDUuMikgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBzdHJ1Y3R1cmUgZGVmaW5pbmcgd2hhdCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCBhdCB3aGF0IHRpbWUgYnkgd2hpY2ggcm9sZXMgdXNpbmcgd2hpY2ggaW5wdXQgYW5kIHByb2R1Y2luZyB3aGF0IG91dHB1dHMuICBBIHByb2plY3QgcGxhbiBhcyBpdCBpcyByZXByZXNlbnRlZCBpbiBwcm9qZWN0IHBsYW5uaW5nIHRvb2xzIHN1Y2ggYXMgSUJNIFJhdGlvbmFsIFBvcnRmb2xpbyBNYW5hZ2VyIG9yIE1pY3Jvc29mdCBQcm9qZWN0IG5vcm1hbGx5IGRvZXMgbm90IG5lZWQgYWxsIHRoaXMgaW5mb3JtYXRpb24gYW5kIGlzIG5vcm1hbGx5IGxpbWl0ZWQgdG8ganVzdCByZXByZXNlbnRpbmcgYSBzdWJzZXQuICBGb3IgZXhhbXBsZSwgYSB0eXBpY2FsIE1TIFByb2plY3QgcGxhbiBvbmx5IHJlcHJlc2VudHMgdGhlIHdvcmsgYnJlYWtkb3duIGNvbnNpc3Rpbmcgb2YgVGFza3MgYW5kIEFjdGl2aXRpZXMgKHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBzdW1tYXJ5IHRhc2tzKS4gIEl0IGRvZXMgbm90IHNob3cgdGhlIGlucHV0IGFuZCBvdXRwdXQgV29yayBQcm9kdWN0cyBmb3IgYSBUYXNrLCBidXQgaXQgY2FuIHNob3cgd2hpY2ggcm9sZXMgc2hhbGwgYmUgc3RhZmZlZCBmb3IgcGVyZm9ybWluZyB0aGUgVGFzay4gIEhvd2V2ZXIsIHN1Y2ggcm9sZSBhbGxvY2F0aW9uIG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCBjb25jcmV0ZSByZXNvdXJjZXMgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBTb21ldGltZXMgcHJvamVjdCBwbGFucyBjYW4gdGhlbiBhZ2FpbiBiZSBvcmdhbml6ZWQgZGlmZmVyZW50bHkgYnkgb3JnYW5pemluZyB3b3JrIGJ5IGRlbGl2ZXJhYmxlcyBpbiB3aGljaCBXb3JrIFByb2R1Y3RzIGFyZSBtYXBwZWQgdG8gdGhlIHBsYW4ncyBzdW1tYXJ5IHRhc2tzIGFuZCBUYXNrIHRoYXQgaGF2ZSB0aGVzZSB3b3JrIHByb2R1Y3RzIGFzIG91dHB1dCBtYXBwZWQgYmVsb3cgc3VjaCBhcyBzdW1tYXJ5IHRhc2suICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBjYW4gbWFrZSByZWNvbW1lbmRhdGlvbnMgYWJvdXQgd2hpY2ggZWxlbWVudHMgdG8gaW5jbHVkZSBhbmQgd2hpY2ggdG8gZXhjbHVkZSB3aGVuIGdlbmVyYXRpbmcgYSBwbGFuLiAgV2hlbiB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSBpcyBzZXQgdG8gRmFsc2UgZm9yIGFuIGluc3RhbmNlIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQsIHRoZW4gdGhpcyBlbGVtZW50IHNoYWxsIG5vdCBiZSBub3QgaW5jbHVkZWQgd2hlbiBhIGNvbmNyZXRlIHByb2plY3QgcGxhbiBpcyBiZWluZyBnZW5lcmF0ZWQgZnJvbSB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoaXMgZWxlbWVudC4KLQotCi08L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfeTd2V3gtLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PnRydWU8L2JvZHk+Ci0gICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXeU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXeWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2V3lPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+SnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXRhaWwgVXNlIENhc2UmcXVvdDsgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuCi08L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfeTd2V3l1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5PgotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2V3ktLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaXNPcHRpb25hbCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2V3pPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dld5LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlRoZSBpc09wdGlvbmFsIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfeTd2V3plLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5PgotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2V3p1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJlc2VudGVkQWZ0ZXIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dld2Ty1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SG91LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dld6LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlcwTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2VzBlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJlc2VudGVkQmVmb3JlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXdk8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUg3dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZXMHUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZXMC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlcxTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InBsYW5uaW5nRGF0YSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2V3MtLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95X0JVTk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2VzFlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2VzF1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXMS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdXBlckFjdGl2aXRpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeV9CVVJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlcyTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlcyZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTd2VzJ1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGVzY3JpcHRvciIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dlcyLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXMnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBEZXNjcmlwdG9yIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlZmVyZW5jZXMgb25lIGNvbmNyZXRlIENvbnRlbnQgRWxlbWVudC4gIEEgZGVzY3JpcHRvciBwcm92aWRlcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHdpdGhpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uIHRvIGp1c3QgcmVmZXJlbmNpbmcgQ29udGVudCBFbGVtZW50cyBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgQ29udGVudCBFbGVtZW50cyBzdHJ1Y3R1cmFsIHJlbGF0aW9uc2hpcHMgYnkgZGVmaW5pbmcgaXRzIG93biBzZXRzIG9mIGFzc29jaWF0aW9ucy4KLURlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiAKLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3dlczTy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N3ZXdk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2VzNlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3k3dlczdS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5PgotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95N3ZXMy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJSb2xlRGVzY3JpcHRvciI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dlc0Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXMy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBSb2xlIERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3dlc0ZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N3ZXMnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2VzR1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icm9sZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZEVlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIc2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2VzQtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2VzVPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXNWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJtb2RpZmllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WEN1LXNFZHVINTlLU0hWOHZnQSIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iX3k3NUh6Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZXNXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZXNS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlc2Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJlc3BvbnNpYmxlRm9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZYQ3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUg1ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZXNmUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZXNnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTd2VzYtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iVGFza0Rlc2NyaXB0b3IiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXN08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2VzYtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgVGFzayBEZXNjcmlwdG9yIGlzIGEgRGVzY3JpcHRvciBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwcm94eSBmb3IgYSBUYXNrIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBUYXNrIERlc2NyaXB0b3JzIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gVGhlcmVmb3JlIG9uZSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotQSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uCi0KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3dlc3ZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N3ZXMnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTd2Vzd1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k3dlhLZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXNy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ0YXNrIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkR3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUhwLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZXOE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZXOGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlc4dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXMy0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUh0dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZXOC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZXOU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlc5ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFzc2lzdGVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlczLS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SHUtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlc5dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlc5LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2Vy1PLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZXh0ZXJuYWxJbnB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WEN1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVId08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2Vy1lLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2Vy11LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXLS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WEN1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIeC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2V19PLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2V19lLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXX3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJvcHRpb25hbElucHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZYQ3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUgwZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZXXy0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZYQU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlhBZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im91dHB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WEN1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIMXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2WEF1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2WEEtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZYQk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwZXJmb3JtZWRQcmltYXJpbHlCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2VzMtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVINE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2WEJlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2WEJ1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZYQi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzZWxlY3RlZFN0ZXBzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3WXUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pCWjZDLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZYQ08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZYQ2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTd2WEN1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2WEMtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dlhDdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95N3ZYRE8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTd2VzJ1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlhEZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFjdGl2aXR5RW50cnlTdGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2WER1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dlhEZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICAKLUZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4KLTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlhELS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlhFTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3k3dlhFZS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlhFdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZYRS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2WEV1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uCi08L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZYRk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZYRmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95N3ZYRnUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZYRi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ3b3JrUHJvZHVjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIck8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2WEdPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2WEdlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZYR3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJpbXBhY3RlZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZYQ3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUh4ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZYRy0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZYSE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlhIZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImltcGFjdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlhDdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SHhlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlhIdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlhILS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2WElPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZGVsaXZlcmFibGVQYXJ0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WEN1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIMi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2WEllLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2WEl1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k3dlhJLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkNvbXBvc2l0ZVJvbGUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZYSk8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2WEktLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgQ29tcG9zaXRlIFJvbGUgaXMgYSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuCi1BIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3dlhKZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N3ZXMy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2WEp1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYWdncmVnYXRlZFJvbGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkRWUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUg2dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZYSi0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZYS08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTd2WEtlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZYS3Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2WEtlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgV29yayBCcmVha2Rvd24gRWxlbWVudCBpcyBhIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3dlhLLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N3ZXdk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2WExPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaXNSZXBlYXRhYmxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZYTGUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2WExPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgcmVwZXRpdGlvbiBvZiB3b3JrLCBlLmcuIGl0ZXJhdGlvbnMuICBBIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIHdpdGggdGhpcyBhdHRyaWJ1dGUgc2V0IHRvIFRydWUgc2hhbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgc2V0IG9mIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBmb3IgYW4gaW5zdGFuY2Ugb2YgSXRlcmF0aW9uIChkZWZpbmVkIGFzIGEgc3BlY2lhbCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBiZWxvdykgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgYnkgZGVmYXVsdCBpbmRpY2F0aW5nIHRoYXQgZXZlcnkgc3ViLUFjdGl2aXR5IHdpbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBIb3dldmVyLCBhbnkgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY2FuIHNldCB0aGlzIGF0dHJpYnV0ZSB0byBUcnVlIHRvIGRlZmluZSBpdGVyYXRpb25zIChlLmcuIHRvIGl0ZXJhdGUgb25lIEFjdGl2aXR5IGNvbnNpc3Rpbmcgb2YgbWFueSBzdWItYWN0aXZpdGllcyBvciBldmVuIFBoYXNlcywgYnV0IHRvIGl0ZXJhdGUganVzdCBvbmUgVGFzaykuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3k3dlhMdS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlhMLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImlzT25nb2luZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2WE1PLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dlhMLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il95N3ZYTWUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+Ci0gICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZYTXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJpc0V2ZW50RHJpdmVuIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZYTS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2WE11LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLgotCi0KLTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il95N3ZYTk8tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+Ci0gICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZYTmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJsaW5rVG9QcmVkZWNlc3NvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2V3F1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVILU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2WE51LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2WE4tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k3dlhPTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlByb2Nlc3NFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2WE9lLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dlhPTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Qcm9jZXNzIEVsZW1lbnQgaXMgYSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4KLVByb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiAKLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3dlhPdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3ZXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95N3ZYTy0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95N3ZYUGUtc0VkdUg1OUtTSFY4dmdBIF95N21Ndy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2WFBPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dlhPLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFnZ3JlZ2F0aW9uIGFzc29jaWF0aW9uIHNwZWNpZmllcyB0aGUgcm9sZXMgb2YgdGVhbSBtZW1iZXJzIHdpdGggUm9sZSBEZXNjcmlwdG9ycy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95N3ZYUGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfdGVhbVByb2ZpbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3bU13Ty1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95N3ZYTy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2WFB1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2WFAtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUhvTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3k3bU14dS1zRWR1SDU5S1NIVjh2Z0EgX3k3bU15ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVIb2Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SG9PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVsYXRlcyBhIFN1Yi1UZWFtIHRvIGl0cyBTdXBlci1UZWFtLCBpLmUuIHRoZSBUZWFtIHRoYXQgaXQgaXMgcGFydCBvZi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUhvdS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3k3dld6dS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUhwTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVIby0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SG91LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkJyZWFrZG93biBzdHJ1Y3R1cmVzIGFyZSBuZXN0ZWQgc3RydWN0dXJlcyAoc2VlIHN1cGVyQWN0aXZpdGllcyBhc3NvY2lhdGlvbikgcHJlc2VudGVkIG5vcm1hbGx5IGFzIGluZGVudGVkIGxpc3RzLiAgV2l0aGluIHRoaXMgbmVzdGluZyBjaGlsZHJlbiBvbiB0aGUgc2FtZSBsZXZlbCBhcmUgbm90IHNwZWNpZmljYWxseSBvcmRlcmVkLiAgSG93ZXZlciwgYSB1c2VyIG9mIHRoZXNlIGRhdGEgc3RydWN0dXJlcyB3b3VsZCBleHBlY3QgdG8gb3JkZXIgZWxlbWVudHMgd2l0aGluIGEgbGlzdC4gIFRoaXMgYXNzb2NpYXRpb24gaXMgdXNlZCB0byBzdG9yZSB0aGUgcHJlc2VudGF0aW9uIHNlcXVlbmNlIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhlIGFzc29jaWF0aW9uIHByZXNlbnRlZEFmdGVyIGlzIHJlZHVuZGFudCB0byB0aGUgYXNzb2NpYXRpb24gcHJlc2VudGVkQmVmb3JlLiAgVGhpcyByZWR1bmRhbmN5IGlzIHJlcXVpcmVkIHRvIHN1cHBvcnQgUHJvY2VzcyBDb250cmlidXRpb25zIChzZWUgcGx1Z2lucykuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SHBPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2JyZWFrZG93bkVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dld2Ty1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95NzVIb3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTc1SHBlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTc1SHB1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUhwLS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3k3NUhxZS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlc3LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVIcU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SHAtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVwcmVzZW50cyB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGRlc2NyaXB0b3IgdG8gdGhlIGNvcmUgY29udGVudCBlbGVtZW50IGl0IHJlZmVycyB0by4gIEV2ZXJ5IFRhc2sgRGVzY3JpcHRvciBjYW4gcmVmZXJlbmNlIG9ubHkgb24gVGFzay4gIEhvd2V2ZXIsIGEgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzLiAgSW4gdGhlIFVNQSBQcm9maWxlIHRoaXMgYXNzb2NpYXRpb24gaXMgaW5zdGFudGlhdGVkIGJ5IGEgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXAgd2l0aCBhIHRyYWNlIHN0ZXJlb3R5cGUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SHFlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idGFza0Rlc2NyaXB0b3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlc2LS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SHAtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUhxdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUhxLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVIck8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95NzVIcnUtc0VkdUg1OUtTSFY4dmdBIF95N3ZYRi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTc1SHJlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3NUhyTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZSBkZXNjcmlwdG9yIHRvIHRoZSBjb3JlIGNvbnRlbnQgZWxlbWVudCBpdCByZWZlcnMgdG8uICBFdmVyeSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBjYW4gcmVmZXJlbmNlIG9ubHkgb25lIFdvcmsgUHJvZHVjdC4gIEhvd2V2ZXIsIGEgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIEluIHRoZSBVTUEgUHJvZmlsZSB0aGlzIGFzc29jaWF0aW9uIGlzIGluc3RhbnRpYXRlZCBieSBhIGRlcGVuZGVuY3kgcmVsYXRpb25zaGlwIHdpdGggYSB0cmFjZSBzdGVyZW90eXBlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k3NUhydS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IndvcmtQcm9kdWN0RGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WEN1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIck8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTc1SHItLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTc1SHNPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUhzZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3k3NUhzLS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlc0dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVIc3Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SHNlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVwcmVzZW50cyB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGRlc2NyaXB0b3IgdG8gdGhlIGNvcmUgY29udGVudCBlbGVtZW50IGl0IHJlZmVycyB0by4gIEV2ZXJ5IFJvbGUgRGVzY3JpcHRvciBjYW4gcmVmZXJlbmNlIG9ubHkgb25lIFJvbGUuICBIb3dldmVyLCBhIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycy4gIEluIHRoZSBVTUEgUHJvZmlsZSB0aGlzIGFzc29jaWF0aW9uIGlzIGluc3RhbnRpYXRlZCBieSBhIGRlcGVuZGVuY3kgcmVsYXRpb25zaGlwIHdpdGggYSB0cmFjZSBzdGVyZW90eXBlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k3NUhzLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJvbGVEZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXMy0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUhzZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVIdE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVIdGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SHR1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQWRkaXRpb25hbGx5UGVyZm9ybXMiIG1lbWJlckVuZD0iX3k3dlc4dS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUh1Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVIdC0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SHR1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgcmVzcGVjdGl2ZSBhc3NvY2lhdGlvbiBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBzcGVjaWZpZXMgZGVzY3JpcHRvcnMgZm9yIGFkZGl0aW9uYWwgcm9sZXMgbmVjZXNzYXJ5IHRvIGNvbXBsZXRlIHRoZSByZWZlcnJlZCBUYXNrLiAgSW5zdGFuY2VzIG9mIHRoZXNlIHJvbGVzIHdvdWxkIHNob3cgdXAgYXMgc2NoZWR1bGVkIHJlc291cmNlcyBvbiBhIGNvcnJlc3BvbmRpbmcgcHJvamVjdCBwbGFuIGdlbmVyYXRlZCBmcm9tIHRoaXMgc3RydWN0dXJlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k3NUh1Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InBlcmZvcm1zQWRkaXRpb25hbGx5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXNi0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUh0dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVIdWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVIdXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SHUtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQXNzaXN0cyIgbWVtYmVyRW5kPSJfeTd2VzllLXNFZHVINTlLU0hWOHZnQSBfeTc1SHZlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUh2Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVIdS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBpcyBzcGVjaWZpYyB0byBhIHByb2Nlc3MsIGkuZS4gbm8gZGVmYXVsdHMgaGF2ZSBiZWVuIGRlZmluZWQgaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgc3BlY2lmaWVzIGRlc2NyaXB0b3JzIGZvciBhZGRpdGlvbmFsIHJvbGVzIHRoYXQgbWF5IHByb3ZpZGUgaW5mb3JtYXRpb24gb3IgYXNzaXN0YW5jZSBoZWxwZnVsLCBidXQgbm90IG1hbmRhdG9yeSB0byB0aGUgY29tcGxldGlvbiBvZiB0aGUgVGFzay4gIEluc3RhbmNlcyBvZiB0aGVzZSByb2xlcyB3b3VsZCBub3Qgc2hvdyB1cCBhcyBzY2hlZHVsZWQgcmVzb3VyY2VzIG9uIHRoZSBjb3JyZXNwb25kaW5nIHByb2plY3QgcGxhbiBnZW5lcmF0ZWQgZnJvbSB0aGlzIHN0cnVjdHVyZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NzVIdmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJhc3Npc3RzSW4iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlc2LS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SHUtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUh2dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUh2LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVId08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJFeHRlcm5hbElucHV0IiBtZW1iZXJFbmQ9Il95N3ZXLU8tc0VkdUg1OUtTSFY4dmdBIF95NzVId3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTc1SHdlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3NUh3Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGlzIHNwZWNpZmljIHRvIGEgcHJvY2VzcywgaS5lLiBubyBkZWZhdWx0cyB3aWxsIGJlIGRlZmluZWQgaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgc3BlY2lmaWVzIGRlc2NyaXB0b3JzIGZvciBXb3JrIFByb2R1Y3RzIHVzZWQgYXMgaW5wdXRzIHRoYXQgYXJlIG5vdCBwcm9kdWNlZCBieSBUYXNrcyB3aXRoaW4gdGhlIHNhbWUgUHJvY2VzcywgYnV0IGJ5IGFub3RoZXIgZXh0ZXJuYWwgcHJvY2VzcyBvciBhbiB1bmtub3duIHNvdXJjZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NzVId3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJleHRlcm5hbElucHV0VG8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlc2LS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SHdPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUh3LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUh4Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVIeGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJJbXBhY3RzRGVwZW5kZW5jeSIgbWVtYmVyRW5kPSJfeTd2WEd1LXNFZHVINTlLU0hWOHZnQSBfeTd2WEhlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUh4dS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVIeGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBpcyB1c2VkIHRvIHNlbWktZm9ybWFsbHkgc3BlY2lmeSB0cmFjZWFiaWxpdHkgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIFdvcmsgUHJvZHVjdHMgd2l0aGluIHRoZSBzY29wZSBvZiBhbiBBY3Rpdml0eS4gIEEgbGluayBmcm9tIG9uZSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciB0byBhbm90aGVyIGluZGljYXRlcyB0aGF0IG9uZSBXb3JrIFByb2R1Y3QgaXMgcmVxdWlyZWQgYXMgaW5wdXQgdG8gYSBUYXNrIHRoYXQgcHJvZHVjZXMgdGhlIHJlbGF0ZWQgV29yayBQcm9kdWN0ICgnaW1wYWN0cycgcm9sZSBlbmQpLiAgSXQgd291bGQgYWxzbyBtZWFuIHRoYXQgYSBjaGFuZ2Ugb24gb25lIFdvcmsgUHJvZHVjdCBpbnN0YW5jZSBtYXkgYWZmZWN0IGEgY2hhbmdlIG9uIHRoZSByZWxhdGVkIHByb2R1Y3QuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVIeC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJNYW5kYXRvcnlJbnB1dCIgbWVtYmVyRW5kPSJfeTd2Vy0tLXNFZHVINTlLU0hWOHZnQSBfeTc1SHllLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUh5Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVIeC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSByZXNwZWN0aXZlIGFzc29jaWF0aW9uIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHBvaW50cyB0byBkZXNjcmlwdG9ycyBmb3IgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBtYW5kYXRvcnkgZm9yIHRoZSBUYXNrIHRvIGJlIHBlcmZvcm1lZC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NzVIeWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJtYW5kYXRvcnlJbnB1dFRvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXNi0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUh4LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVIeXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVIeS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SHpPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iTW9kaWZpZXMiIG1lbWJlckVuZD0iX3k3dlc1ZS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUh6dS1zRWR1SDU5S1NIVjh2Z0EiIGlzRGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUh6ZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVIek8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBkZXJpdmVkIGFzc29jaWF0aW9uIG1hcHMgdG8gdGhlIE1vZGlmaWVzIGFzc29jaWF0aW9uIGRlZmluZWQgYmV0d2VlbiBXb3JrIFByb2R1Y3RzIGFuZCBUYXNrcyBpbiBDb3JlIE1ldGhvZCBDb250ZW50LiAgVGhlIHNhbWUgZGVyaXZhdGlvbiBydWxlIGFzIGZvciB0aGUgY29yZSBjb250ZW50IGVsZW1lbnRzIGFwcGxpZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SHp1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3JvbGVEZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXMy0tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeTc1SHpPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUh6LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUgwTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVIMGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJPcHRpb25hbElucHV0IiBtZW1iZXJFbmQ9Il95NzVIMC0tc0VkdUg1OUtTSFY4dmdBIF95N3ZXX3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTc1SDB1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3NUgwZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIG1hcHMgdG8gdGhlIHJlc3BlY3RpdmUgYXNzb2NpYXRpb24gaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgcG9pbnRzIHRvIGRlc2NyaXB0b3JzIGZvciBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIG9wdGlvbmFsIGZvciB0aGUgVGFzayB0byBiZSBwZXJmb3JtZWQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SDAtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iT3B0aW9uYWxJbnB1dFRvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXNi0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUgwZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVIMU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVIMWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SDF1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iT3V0cHV0IiBtZW1iZXJFbmQ9Il95NzVIMk8tc0VkdUg1OUtTSFY4dmdBIF95N3ZYQWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTc1SDEtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3NUgxdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIG1hcHMgdG8gdGhlIHJlc3BlY3RpdmUgYXNzb2NpYXRpb24gaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgcG9pbnRzIHRvIGRlc2NyaXB0b3JzIGZvciBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIG91dHB1dHMgZm9yIHBlcmZvcm1pbmcgdGhlIHJlZmVycmVkIFRhc2suPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SDJPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ib3V0cHV0RnJvbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2VzYtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIMXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTc1SDJlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTc1SDJ1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUgyLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlBhY2thZ2VkV1AiIG1lbWJlckVuZD0iX3k3NUgzZS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhJTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVIM08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SDItLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PklmIGEgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgcmVmZXJzIGF0IHRoZSAnZGVsaXZlcmFibGUnIHJvbGUgZW5kIHRvIGEgRGVsaXZlcmFibGUgV29yayBQcm9kdWN0IHRoZW4gdGhpcyBhc3NvY2lhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIERlbGl2ZXJhYmxlJ3MgV29yayBQcm9kdWN0IHBhcnRzLiAgQXMgaW5kaWNhdGVkIGZvciBEZWxpdmVyYWJsZSBpbiB0aGUgQ29yZSBNZXRob2QgQ29udGVudCBwYWNrYWdlLCB0aGlzIGFzc29jaWF0aW9uIG92ZXJyaWRlcyB0aGUgJ2RlbGl2ZXJlZFdvcmtQcm9kdWN0cycgYXNzb2NpYXRpb24gb2YgdGhlIFdvcmsgUHJvZHVjdCwgd2hpY2ggc3RvcmVzIHRoZSByZWNvbW1lbmRlZCBkZWxpdmVyYWJsZSBwYXJ0cywgYnV0IGNhbiBiZSBjdXN0b21pemVkIGZvciBldmVyeSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvci4gPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SDNlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZGVsaXZlcmFibGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlhDdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SDItLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUgzdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUgzLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVINE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQcmltYXJ5UGVyZm9ybXMiIG1lbWJlckVuZD0iX3k3dlhCTy1zRWR1SDU5S1NIVjh2Z0EgX3k3NUg0dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVINGUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SDRPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgcmVzcGVjdGl2ZSBhc3NvY2lhdGlvbiBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBwb2ludHMgdG8gYSBkZXNjcmlwdG9yIGZvciB0aGUgb25lIHJvbGUgcmVzcG9uc2libGUgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSB0YXNrLiAgQW4gaW5zdGFuY2Ugb2YgdGhpcyByb2xlIHdvdWxkIHNob3cgdXAgYXMgYSBzY2hlZHVsZWQgcmVzb3VyY2Ugb24gYSBjb3JyZXNwb25kaW5nIHByb2plY3QgcGxhbiBnZW5lcmF0ZWQgZnJvbSB0aGlzIHN0cnVjdHVyZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NzVINHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwZXJmb3Jtc0FzT3duZXIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlc2LS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SDRPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUg0LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUg1Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVINWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJSZXNwb25zaWJsZSIgbWVtYmVyRW5kPSJfeTd2VzZPLXNFZHVINTlLU0hWOHZnQSBfeTc1SDUtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUg1dS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVINWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZXByZXNlbnRzIHJlc3BvbnNpYmlsaXR5IGZvciBXb3JrIFByb2R1Y3QgaW5zdGFuY2VzLiAgSXQgaW5kaWNhdGVzIG93bmVyc2hpcCBhbmQgZm9yIGV4YW1wbGUgd291bGQgZGVmaW5lIHRoZSBSb2xlIHRoYXQgYW5zd2VycyB0byBtYW5hZ2VtZW50IHF1ZXN0aW9ucyBhYm91dCB0aGUgcXVhbGl0eSB3b3JrIHByb2R1Y3QuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SDUtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmVzcG9uc2libGVSb2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXMy0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUg1ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVINk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVINmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SDZ1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTd2WEp1LXNFZHVINTlLU0hWOHZnQSBfeTc1SDYtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SDYtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2NvbXBvc2l0ZVJvbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlhJLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95NzVINnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTc1SDdPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTc1SDdlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUg3dS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3k3dlcwZS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUg4Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVINy0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SDd1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkJyZWFrZG93biBzdHJ1Y3R1cmVzIGFyZSBuZXN0ZWQgc3RydWN0dXJlcyAoc2VlIHN1cGVyQWN0aXZpdGllcyBhc3NvY2lhdGlvbikgcHJlc2VudGVkIG5vcm1hbGx5IGFzIGluZGVudGVkIGxpc3RzLiAgV2l0aGluIHRoaXMgbmVzdGluZyBjaGlsZHJlbiBvbiB0aGUgc2FtZSBsZXZlbCBhcmUgbm90IHNwZWNpZmljYWxseSBvcmRlcmVkLiAgSG93ZXZlciwgYSB1c2VyIG9mIHRoZXNlIGRhdGEgc3RydWN0dXJlcyB3b3VsZCBleHBlY3QgdG8gb3JkZXIgZWxlbWVudHMgd2l0aGluIGEgbGlzdC4gIFRoaXMgYXNzb2NpYXRpb24gaXMgdXNlZCB0byBzdG9yZSB0aGUgcHJlc2VudGF0aW9uIHNlcXVlbmNlIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhlIGFzc29jaWF0aW9uIHByZXNlbnRlZEJlZm9yZSBpcyByZWR1bmRhbnQgdG8gdGhlIGFzc29jaWF0aW9uIHByZXNlbnRlZEFmdGVyLiAgVGhpcyByZWR1bmRhbmN5IGlzIHJlcXVpcmVkIHRvIHN1cHBvcnQgUHJvY2VzcyBDb250cmlidXRpb25zIChzZWUgcGx1Z2lucykuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SDhPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2JyZWFrZG93bkVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dld2Ty1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95NzVIN3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTc1SDhlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTc1SDh1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUg4LS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3k3dldzTy1zRWR1SDU5S1NIVjh2Z0EgX3k3NUg5ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVIOU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SDgtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGFzc29jaWF0aW9uIGxpbmtzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCB0byBpdHMgc3VjY2Vzc29yIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SDllLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibGlua1RvU3VjY2Vzc29yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXcXUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUg4LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVIOXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVIOS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SC1PLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTc1SC11LXNFZHVINTlLU0hWOHZnQSBfeTd2WE5lLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUgtZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVILU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBsaW5rcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdG8gaXRzIHByZWRlY2Vzc29yLiAgRXZlcnkgV29yayBCcmVha2Rvd24gRWxlbWVudCBjYW4gaGF2ZSBwcmVkZWNlc3NvciBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHRvIGl0LiAgU3BlY2lmaWMgcHJlZGVjZXNzb3IgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MgV29yayBPcmRlciwgd2hpY2ggZGVmaW5lcyB0aGUga2luZCBvZiBwcmVkZWNlc3NvciBhbm90aGVyIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgcmVwcmVzZW50cyBmb3IgYW5vdGhlci48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NzVILXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdWNjIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZYS2Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUgtTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVILS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVIX08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3ktNEtNTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRlbGl2ZXJ5UHJvY2VzcyI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3ktNEtNZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95LTRLTU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBEZWxpdmVyeSBQcm9jZXNzZXMgaXMgYSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuCi1BIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYSBQcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIGZyb20gYmVnaW5uaW5nIHRvIGVuZC4gIEEgRGVsaXZlcnkgUHJvY2VzcyBzaGFsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIHBsYW5uaW5nIGFuZCBydW5uaW5nIGEgcHJvamVjdC4gIEl0IHByb3ZpZGVzIGEgY29tcGxldGUgbGlmZWN5Y2xlIG1vZGVsIHdpdGggcHJlZGVmaW5lZCBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIGRldGFpbGVkIGJ5IHNlcXVlbmNpbmcgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJdCBpcyBkZWZpbmVkIG9uIHRoZSBiYXNpcyBvZiBleHBlcmllbmNlIHdpdGggcGFzdCBwcm9qZWN0cyBvciBlbmdhZ2VtZW50cywgYW5kL29yIHRoZSBiZXN0IHByYWN0aWNlIHVzZSBvZiBhIGRldmVsb3BtZW50IG9yIGRlbGl2ZXJ5IGFwcHJvYWNoLiAgSXQgZGVmaW5lcyB3aGF0IGdldHMgcHJvZHVjZWQsIGhvdyB0aG9zZSBpdGVtcyBhcmUgcHJvZHVjZWQsIGFuZCB0aGUgcmVxdWlyZWQgc3RhZmZpbmcgaW4gdGhlIGZvcm0gb2YgaW50ZWdyYXRlZCBXb3JrLCBXb3JrIFByb2R1Y3QsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGUsIGEgcHJvY2VzcyBlbmdpbmVlciBjYW4gZGVmaW5lIGFsdGVybmF0aXZlIERlbGl2ZXJ5IFByb2Nlc3NlcyBmb3Igc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdHMgdGhhdCBkaWZmZXIgaW4gdGhlIHNjYWxlIG9mIHRoZSBlbmdhZ2VtZW50IGFuZCBzdGFmZmluZyBuZWNlc3NhcnksIHRoZSB0eXBlIG9mIHRoZSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiB0byBiZSBkZXZlbG9wZWQsIHRoZSBkZXZlbG9wbWVudCBtZXRob2RzIGFuZCB0ZWNobm9sb2dpZXMgdG8gYmUgdXNlZCwgZXRjLiAgQWx0aG91Z2gsIHRoZSBEZWxpdmVyeSBQcm9jZXNzIGFpbXMgdG8gY292ZXIgYSB3aG9sZSBwcm9qZWN0IGl0IGtlZXBzIGNlcnRhaW4gZGVjaXNpb24gdGhhdCBhcmUgdG9vIHByb2plY3Qgc3BlY2lmaWMgb3Blbi4gIEZvciBleGFtcGxlLCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmVzIHdoaWNoIEJyZWFrZG93biBFbGVtZW50cyBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9yIGlzIHJlcGVhdGFibGUgdmlhIGl0IHJlc3BlY3RpdmUgYXR0cmlidXRlcywgYnV0IGRvZXMgbm90IHNheSBob3cgbWFueSBvY2N1cnJlbmNlcyBhbmQgaG93IG1hbnkgcmVwZWF0cy9pdGVyYXRpb25zIGl0IHdpbGwgaGF2ZS4gIFRoZXNlIGRlY2lzaW9ucyBoYXZlIHRvIGJlIGRvbmUgYnkgYSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhIGNvbmNyZXRlIHByb2plY3QsIHByb2plY3QgcGhhc2UsIG9yIHByb2plY3QgaXRlcmF0aW9ucy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhbHdheXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiBhIHByb2Nlc3MgaW4gdGVybXMgb2YgY29tcGxldGVuZXNzIG9mIHRoZSBsaWZlY3ljbGUsIGFzIHdlbGwgYXMgaW4gdGVybXMgb2YgYWxsIHRocmVlIHZpZXdzIG9uIHRoZSBwcm9jZXNzIHdoaWNoIGFyZSB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBoYXZlIHRvIGJlIGZ1bGx5IGFuZCBjb25zaXN0ZW50bHkgcG9wdWxhdGVkLiAgQ29uc2lzdGVuY3kgb2YgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFjdHVhbGx5IGVuc3VyZWQgYnkgdGhlIGZhY3QgdGhhdCBhbGwgdGhyZWUgYnJlYWtkb3ducyBhcmUgcmVwcmVzZW50ZWQgYnkgb25lIHNpbmdsZSBkYXRhIHN0cnVjdHVyZSBhbmQgb25lIHBhcnRpY3VsYXIgYnJlYWtkb3duIHN1Y2ggYXMgVGVhbSBCcmVha2Rvd24gaXMganVzdCBhIHZpZXcgb24gdGhhdCBkYXRhIHN0cnVjdHVyZS4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3ktNEtNdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95LTRLT2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeS00S00tLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZWR1Y2F0aW9uTWF0ZXJpYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtOC0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3lfQlVQTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95LTRLTk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95LTRLTmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3ktNEtOdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNvbW11bmljYXRpb25zTWF0ZXJpYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtOC0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3lfQlVRZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95LTRLTi0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95LTRLT08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeS00S1AtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95LTRLUU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeS00S1AtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4KLUEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeS00S1FlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3ktNEtPZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95LTRLUXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJiYXNlZE9uUHJvY2Vzc2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95LTRLT2Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3lfQlVMLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95LTRLUS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95LTRLUk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeS00S1JlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUm9hZG1hcCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3ktNEtSdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95LTRLUmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBSb2FkbWFwIGlzIGEgc3BlY2lhbCBHdWlkYW5jZSBUeXBlIHdoaWNoIGlzIG9ubHkgcmVsYXRlZCB0byBBY3RpdmF0ZXMgYW5kIHRoZXJlZm9yZSBoYXMgYmVlbiBhZGRlZCBieSB0aGlzIHBhY2thZ2UgdG8gdGhlIGxpc3Qgb2YgR3VpZGFuY2UgVHlwZXMgcmF0aGVyIHRoYW4gbGlzdGVkIGluIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlLiAgQSBSb2FkbWFwIHJlcHJlc2VudHMgYSBsaW5lYXIgd2Fsa3Rocm91Z2ggb2YgYW4gQWN0aXZpdHksIHR5cGljYWxseSBhIFByb2Nlc3MuCi1BbiBpbnN0YW5jZSBvZiBhIFJvYWRtYXAgcmVwcmVzZW50cyBpbXBvcnRhbnQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEFjdGl2aXR5IG9yIFByb2Nlc3MgaXQgaXMgcmVsYXRlZCB0by4gIE9mdGVuIGEgY29tcGxleCBBY3Rpdml0eSBzdWNoIGFzIGEgUHJvY2VzcyBjYW4gYmUgbXVjaCBlYXNpZXIgdW5kZXJzdG9vZCBieSBwcm92aWRpbmcgYSB3YWxrdGhyb3VnaCB3aXRoIGEgbGluZWFyIHRocmVhZCBvZiBhIHR5cGljYWwgaW5zdGFudGlhdGlvbiBvZiB0aGlzIEFjdGl2aXR5LiAgSW4gYWRkaXRpb24gdG8gbWFraW5nIHRoZSBwcm9jZXNzIHByYWN0aXRpb25lciB1bmRlcnN0YW5kIGhvdyB3b3JrIGluIHRoZSBwcm9jZXNzIGlzIGJlaW5nIHBlcmZvcm1lZCwgYSBSb2FkbWFwIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IEFjdGl2aXRpZXMgYW5kIFRhc2tzIHJlbGF0ZSB0byBlYWNoIG90aGVyIG92ZXIgdGltZS4gIFJvYWRtYXBzIGFyZSBhbHNvIHVzZWQgdG8gc2hvdyBob3cgc3BlY2lmaWMgYXNwZWN0cyBhcmUgZGlzdHJpYnV0ZWQgb3ZlciBhIHdob2xlIHByb2Nlc3MgcHJvdmlkaW5nIGEga2luZCBvZiBmaWx0ZXIgb24gdGhlIHByb2Nlc3MgZm9yIHRoaXMgaW5mb3JtYXRpb24uCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95LTRLUi0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZE0tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTJPa2dPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGlzY2lwbGluZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2tnZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9rZ08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBEaXNjaXBsaW5lIGlzIGEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LgotQSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3lfQlVJTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9rZ08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+RGlzY2lwbGluZSBpcyBhIGNhdGVnb3JpemF0aW9uIG9mIFRhc2tzIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuICBUaGlzIGlzIHRoZSBleHRlbnNpb25zIG9mIERpc2NpcGxpbmUgZGVmaW5lZCBpbiB0aGUgTWV0aG9kIENvcmUgcGFja2FnZSBhZGRpbmcgYW4gYWRkaXRpb25hbCBhc3NvY2lhdGlvbiB0byBBY3Rpdml0aWVzLCB3aGljaCByZXByZXNlbnQgdHlwaWNhbCBzdGFuZGFyZCBvciByZWZlcmVuY2Ugd2F5cyBvZiBtZWFuaW5nZnVsIGdyb3VwaW5ncyBvZiB0aGUgRGlzY2lwbGluZSdzIFRhc2tzIGludG8gd29ya2Zsb3dzLgotVGFza3MgcmVwcmVzZW50IGRlc2NyaXB0aW9ucyBvZiB3b3JrLCB3aGljaCBhcmUgY2F0ZWdvcml6ZWQgYnkgRGlzY2lwbGluZXMuICBUaGUgcmVhc29uIHRoYXQgc2V2ZXJhbCBUYXNrcyBhcmUgYWxsIGNhdGVnb3JpemVkIGJ5IHRoZSBzYW1lIERpc2NpcGxpbmUgaXMgdGhhdCB0aGV5IGFsbCByZXByZXNlbnQgYSBwYXJ0IGluIGFjaGlldmluZyBhIGhpZ2hlciBnb2FsIG9yIHBlcmZvcm1pbmcgd29yayB0aGF0IGlzIGFsbCByZWxhdGVkIHRvIGVhY2ggb3RoZXIuICBFdmVyeSBEaXNjaXBsaW5lIGRlZmluZXMgc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBpdCBjYXRlZ29yaXplcy4gIFN1Y2ggc3RhbmRhcmQgd2F5cyBhcmUgZXhwcmVzcyBieSBBY3Rpdml0aWVzIG9yIENhcGFiaWxpdHkgUGF0dGVybnMgZGVmaW5pbmcgaG93IHRoZSBUYXNrcyBjYXRlZ29yaXplZCBieSB0aGUgRGlzY2lwbGluZSAnd29yayB0b2dldGhlcicgaW4gdGhlIG1vc3QgZ2VuZXJpYyB3YXkuICBUaGVzZSByZWZlcmVuY2Ugd29ya2Zsb3dzIGFyZSBvZnRlbiB1c2VkIGZvciBlZHVjYXRpbmcgYW5kIHRlYWNoaW5nIHByYWN0aXRpb25lcnMuIAotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTJPa2d1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3kyT2tudS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95Mk9rZy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ0YXNrcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZEd1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95Mk9rNS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPa2hPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPa2hlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95Mk9raHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdWJkaXNjaXBsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rZ08tc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3kyT2s3Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9raC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9raU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3lfQlVJZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJlZmVyZW5jZVdvcmtmbG93cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95X0JVU08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeV9CVUl1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeV9CVUktLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l6MS1fLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlByYWN0aWNlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXoxX0FPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6MS1fLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFByYWN0aWNlIHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAmcXVvdDtNYW5hZ2UgUmlza3MmcXVvdDssICZxdW90O0NvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSZxdW90OywgJnF1b3Q7QXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCZxdW90OywgZXRjLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXoxX0FlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95ejFfQXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdWJQcmFjdGljZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS1fLS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeXpfd0t1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6MV9BLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6MV9CTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXoxX0JlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY29udGVudFJlZmVyZW5jZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTBKZzRPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6MV9CdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6MV9CLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeV9CVUpPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYWN0aXZpdHlSZWZlcmVuY2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3lfQlVUZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95X0JVSmUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95X0JVSnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeV9CVUotLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm4iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95X0JVS08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeV9CVUotLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4KLUEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOgotLSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4KLS0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuCi0tIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3lfQlVLZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95LTRLT2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVS3Utc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95LTRLUE8tc0VkdUg1OUtTSFY4dmdBIF95X0JVTE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVUstLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVLdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIHRyYWNlYWJpbGl0eSBmb3IgYSBQcm9jZXNzIGRvY3VtZW50aW5nIHdoaWNoIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSBiZWVuIHVzZWQgZm9yIGRlZmluaW5nIHRoZSBwcm9jZXNzLiAgSXQgZG9jdW1lbnRzIGFwcGxpY2F0aW9ucyBvZiBhIHBhdHRlcm4gdGhyb3VnaCBjb3B5IGFzIHdlbGwgYXMgcGF0dGVybiBiaW5kaW5nLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3lfQlVMTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9wcm9jZXNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95LTRLT2Utc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeV9CVUt1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3lfQlVMZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lfQlVMdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVTC0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95LTRLUXUtc0VkdUg1OUtTSFY4dmdBIF95X0JVTWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVU1PLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVMLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5JZiB0aGUgUGxhbiBoYXMgYmVlbiBjcmVhdGVkIGJhc2VkIG9uIG9uZSBvciBtb3JlIHByb2Nlc3NlcyAoaS5lLiBvdGhlciBQbGFucywgQ2FwYWJpbGl0eSBQYXR0ZXJucywgYSBEZWxpdmVyeSBQcm9jZXNzLCBvciBhbnkgY29tYmluYXRpb24gb2YgdGhlc2UpLCB0aGVuIHRoaXMgYXNzb2NpYXRpb24gY2FwdHVyZXMgYSB0cmFjZSBiYWNrIHRvIHRoZXNlIHNvdXJjZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeV9CVU1lLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95LTRLUC0tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeV9CVUwtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3lfQlVNdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lfQlVNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVTk8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95N3ZXMU8tc0VkdUg1OUtTSFY4dmdBIF95X0JVTnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVU5lLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVOTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGUgUGxhbm5pbmdEYXRhIGNsYXNzIGZhY3RvcnMgb3V0IHNwZWNpZmljIG9wdGlvbmFsIGRhdGEgbmVlZGVkIGZvciByZXByZXNlbnRpbmcgcGxhbm5pbmcgdGVtcGxhdGVzLiAgVGhpcyBhc3NvY2lhdGlvbiBhbGxvd3MgdG8gYWNjZXNzIHBsYW5uaW5nIGRhdGEgaWYgaXQgaXMgc3RvcmVkIGZvciB0aGUgQnJlYWtkb3duIEVsZW1lbnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeV9CVU51LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2JyZWFrZG93bkVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dld2Ty1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95X0JVTk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVTi0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95LTRLU2Utc0VkdUg1OUtTSFY4dmdBIF95X0JVT2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVU9PLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVOLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGxpbmtzIGFuIEFjdGl2aXR5IHRvIHplcm8gb3IgbW9yZXMgaW5zdGFuY2VzIG9mIHRoZSBSb2FkbWFwIGd1aWRhbmNlIHR5cGUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeV9CVU9lLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeV9CVU4tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3lfQlVPdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lfQlVPLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeV9CVVBPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeV9CVVB1LXNFZHVINTlLU0hWOHZnQSBfeS00S00tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3lfQlVQZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95X0JVUE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBndWlkYW5jZSBkb2N1bWVudHMgdGhhdCBwcm92aWRlIGVkdWNhdGlvbiBtYXRlcmlhbCBmb3IgdGVhY2hpbmcgc3Rha2Vob2xkZXJzIHN1Y2ggYXMgcHJvamVjdCBtYW5hZ2VycyBvbiBob3cgdG8gcGVyZm9ybSBwcm9qZWN0cyB0aGF0IGZvbGxvdyB0aGlzIERlbGl2ZXJ5IFByb2Nlc3MuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeV9CVVB1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2RlbGl2ZXJ5UHJvY2VzcyIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3ktNEtNTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95X0JVUE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeV9CVVAtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeV9CVVFPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3lfQlVRZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3lfQlVRLS1zRWR1SDU5S1NIVjh2Z0EgX3ktNEtOdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95X0JVUXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeV9CVVFlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgZ3VpZGFuY2UgZG9jdW1lbnRzIHRoYXQgaGF2ZSBiZWVuIHJlbGF0ZWQgdG8gYSBEZWxpdmVyeSBQcm9jZXNzIGluc3RhbmNlIHRvIGRlc2NyaWJlIGFuZCBjaGFyYWN0ZXJpemUgaXRzIGZlYXR1cmVzIGFuZCBjYXBhYmlsaXRpZXMuIFRoZXNlIGRvY3VtZW50cyBjYW4gYmUgdXNlZCBmb3Igc2V2ZXJhbCBwdXJwb3NlcyBzdWNoIGFzIGludGVybmFsIG1hcmtldGluZyBjb21tdW5pY2F0aW9ucywgc2FsZXMgdHJhaW5pbmcgYW5kIGdlbmVyYWwgbWV0aG9kIGVkdWNhdGlvbi4gIEV4YW1wbGVzIGZvciBDb21tdW5pY2F0aW9ucyBNYXRlcmlhbCBhcmUgSGlnaGxpZ2h0IERvY3VtZW50LCBGYWN0IFNoZWV0LCBhbmQgRGVsaXZlcnkgUHJvY2VzcyBTcGVjaWZpY2F0aW9uIE92ZXJ2aWV3LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3lfQlVRLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9kZWxpdmVyeVByb2Nlc3MiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il95LTRLTU8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeV9CVVFlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3lfQlVSTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lfQlVSZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVUnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJCcmVha2Rvd25OZXN0aW5nIiBtZW1iZXJFbmQ9Il95N3ZXMS0tc0VkdUg1OUtTSFY4dmdBIF95N21NdE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVVItLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVSdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGJpZGlyZWN0aW9uYWwgYXNzb2NpYXRpb24gcmVwcmVzZW50cyBicmVha2Rvd24gc3RydWN0dXJlIG5lc3RpbmcuICBJdCBkZWZpbmVzIGFuIG4tbGV2ZWwgaGllcmFyY2h5IG9mIEFjdGl2aXRpZXMgZ3JvdXBpbmcgdG9nZXRoZXIgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgb3RoZXIgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4KLVRoZSBzdXBlckFjdGl2aXRpZXMgcm9sZSBhbGxvd3MgbmF2aWdhdGlvbiBvZiBhIEJyZWFrZG93biBFbGVtZW50IHRvIGlzIHBhcmVudCBBY3Rpdml0eS4gVGhlIGJyZWFrZG93bkVsZW1lbnRzIHJvbGUgYWxsb3dzIG5hdmlnYXRpb24gZnJvbSBhbiBBY3Rpdml0eSB0byBpdHMgbmVzdGVkIEJyZWFrZG93biBFbGVtZW50cy4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeV9CVVNPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeV9CVUllLXNFZHVINTlLU0hWOHZnQSBfeV9CVVN1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3lfQlVTZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95X0JVU08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBvbmUgbW9yZSByZWZlcmVuY2Ugd29ya2Zsb3dzIGZvciBhIERpc2NpcGxpbmUuICBUaGUgcmVmZXJlbmNlIHdvcmtmbG93cyBkZWZpbmUgdGhlIG1vc3QgdHlwaWNhbCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIGEgRGlzY2lwbGluZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95X0JVU3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfZGlzY2lwbGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa2dPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3lfQlVTTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95X0JVUy0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95X0JVVE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeV9CVVRlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeV9CVUpPLXNFZHVINTlLU0hWOHZnQSBfeV9CVVR1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeV9CVVR1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3ByYWN0aWNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtXy0tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeV9CVVRlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3lfQlVULS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lfQlVVTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVVWUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95LTRLVE8tc0VkdUg1OUtTSFY4dmdBIF95X0JVVS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVVV1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVVZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGNhbiBiZSB1c2VkIHRvIGxpbmsgYWxsIGtpbmRzIG9mIGdlbmVyYWwgZ3VpZGFuY2UgdG8gdGhlIEFjdGl2aXR5IHRoYXQgaXMgYmVpbmcgbWFuYWdlZCBhcyBnZW5lcmFsIFN1cHBvcnRpbmcgTWF0ZXJpYWwuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeV9CVVUtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeV9CVVVlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3lfQlVWTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lfQlVWZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVVnUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95LTRLVC0tc0VkdUg1OUtTSFY4dmdBIF95X0JVV08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVVYtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVWdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIEFjdGl2aXR5LSAob3IgUHJvY2Vzcy0pIHNwZWNpZmljIGNoZWNrIHBvaW50cy4gIFRoZXNlIGFyZSB0eXBpY2FsbHkgdXNlZCBpbiByZXZpZXdzIGFuZCBpbnNwZWN0aW9ucyBvbiB0aGUgd29yayBwZXJmb3JtZWQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeV9CVVdPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeV9CVVZ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3lfQlVXZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lfQlVXdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVVy0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95LTRLVXUtc0VkdUg1OUtTSFY4dmdBIF95X0JVWGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVVhPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVXLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlbGF0ZXMgY29uY2VwdHMgb3Igd2hpdGVwYXBlcnMgdG8gdGhlIEFjdGl2aXR5IHByb3ZpZGluZyBpbXBvcnRhbnQgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIGRvaW5nIHRoZSB3b3JrIGRlc2NyaWJlZCBieSB0aGUgQWN0aXZpdHkuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeV9CVVhlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeV9CVVctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3lfQlVYdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lfQlVYLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVWU8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95LTRLVmUtc0VkdUg1OUtTSFY4dmdBIF95X0JVWXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVVllLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVZTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGNhbiBwcm92aWRlIHJlZmVyZW5jZXMgdG8gZXhhbXBsZXMgcmVsZXZhbnQgdG8gdGhpcyBzcGVjaWZpYyBBY3Rpdml0eSAob3IgUHJvY2VzcykuICA8L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95X0JVWXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95X0JVWU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeV9CVVktLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeV9CVVpPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3lfQlVaZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3ktNEtXTy1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVaLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95X0JVWnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeV9CVVplLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgQWN0aXZpdHktc3BlY2lmaWMgR3VpZGVsaW5lcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95X0JVWi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95X0JVWmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeV9CVWFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeV9CVWFlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3lfQlVhdS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3ktNEtXLS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlViTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95X0JVYS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeV9CVWF1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVmZXJzIHRvIFJldXNhYmxlIEFzc2V0cyBzcGVjaWZpYyB0byB0aGlzIEFjdGl2aXR5IChvciBQcm9jZXNzKS4gPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeV9CVWJPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeV9CVWF1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekJaNXdPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96Qlo1d2Utc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1YtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pCWjV3dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InVzYWdlR3VpZGFuY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pCWjV3LS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96Qlo1d3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBpbmZvcm1hdGlvbiBhbmQgZ3VpZGFuY2Ugb24gdGhlIG1lYW5pbmcgb2YgdGhlIEJvb2xlYW4gZmxhZyB2YWx1ZXMgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyB0aGV5IHNob3VsZCBiZSBvdmVycmlkZGVuLiBGb3IgZXhhbXBsZSwgaXQgZGVzY3JpYmVzIHdoeSB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgb3B0aW9uYWwgb3IgY29uc2lkZXJhdGlvbnMgZm9yIHJlcGVhdGluZyBpdCBhbmQgZGlmZmVyZW5jZXMgaW4gdGhlIGluZGl2aWR1YWwgb2NjdXJyZW5jZXMgb2YgdGhpcyBCcmVha2Rvd24gRWxlbWVudCBhY3Jvc3MgdGhlIGxpZmVjeWNsZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96Qlo1eE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96Qlo1eGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96Qlo1eHUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pCWjV4LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pCWjV5Ty1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96Qlo1d08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekJaNXllLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHVycG9zZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekJaNXl1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pCWjV5ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekJaNXktLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekJaNXpPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekJaNXplLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekJaNXp1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYWx0ZXJuYXRpdmVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96Qlo1ei0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekJaNXp1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgdGhpcyBBY3Rpdml0eSBub3QgY292ZXJlZCBieSB0aGUgQWN0aXZpdHkncyBUYXNrcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96Qlo1ME8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96Qlo1MGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96Qlo1MHUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96Qlo1MC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJob3d0b1N0YWZmIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96Qlo1MU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekJaNTAtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+UHJvdmlkZXMgYmFja2dyb3VuZCBvbiB3aG8gc2hvdWxkIGJlIGludm9sdmVkIGluIHRoaXMgYWN0aXZpdHkgd2hhdCBhcmUgdGhlIHJlcXVpcmVkIHNraWxscywgZXhwZXJpZW5jZSwgIGFuZCBwZXJoYXBzIGF0dGl0dWRlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96Qlo1MWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96Qlo1MXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96Qlo1MS0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pCWjUyTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96Qlo1MmUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekJaNS1PLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pCWjUydS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InNjYWxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96Qlo1Mi0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekJaNTJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+T3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pCWjUzTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pCWjUzZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pCWjUzdS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pCWjUzLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InByb2plY3RDaGFyYWN0ZXJpc3RpY3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pCWjU0Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96Qlo1My0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5DaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekJaNTRlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekJaNTR1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekJaNTQtLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekJaNTVPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmlza0xldmVsIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96Qlo1NWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekJaNTVPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+T3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96Qlo1NXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96Qlo1NS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96Qlo1Nk8tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96Qlo1NmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJlc3RpbWF0aW5nVGVjaG5pcXVlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96Qlo1NnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekJaNTZlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+RGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96Qlo1Ni0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96Qlo1N08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96Qlo1N2Utc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96Qlo1N3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96Qlo1Ny0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekJaNTd1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+UHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekJaNThPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekJaNThlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekJaNTh1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekJaNTgtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idHlwZU9mQ29udHJhY3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pCWjU5Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96Qlo1OC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekJaNTllLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekJaNTl1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekJaNTktLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96Qlo1LU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pCWjUtZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96Qlo1eC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekJaNS11LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic2NvcGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pCWjUtLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96Qlo1LXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5EZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96Qlo1X08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96Qlo1X2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96Qlo1X3Utc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96Qlo1Xy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ1c2FnZU5vdGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96Qlo2QU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekJaNV8tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+QW55IGFkZGl0aW9uYWwgbm90ZXMgb24gaG93IHRvIGFwcGx5IGFuZCBpbnN0YW50aWF0ZSB0aGlzIHByb2Nlc3MgZm9yIGEgcHJvamVjdC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96Qlo2QWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96Qlo2QXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96Qlo2QS0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pCWjZCTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRlc2NyaXB0b3JEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekJaNkJlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pCWjV3Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96Qlo2QnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZWZpbmVkRGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pCWjZCLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96Qlo2QnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5BIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuIDwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pCWjZDTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pCWjZDZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pCWjZDdS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekJaNkMtLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTd2WEItLXNFZHVINTlLU0hWOHZnQSBfekJaNkRlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pCWjZETy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96Qlo2Qy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+TGlzdCB0aGUgc3RlcHMgdGhhdCBoYXZlIGJlZW4gc2VsZWN0ZWQgdG8gYmUgcGVyZm9ybWVkIGZvciB0aGUgaW5zdGFuY2Ugb2YgdGhlIFRhc2sgRGVzY3JpcHRvci48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96Qlo2RGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfdGFza0Rlc2NyaXB0b3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlc2LS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96Qlo2Qy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekJaNkR1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekJaNkQtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pEcFZlLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekRwVmZPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pEcFZlLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFByb2Nlc3MgQ29tcG9uZW50IGFwcGxpY2F0aW9uIGluIGEgUHJvY2VzcywgaS5lLiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmluZyB0aGUgUHJvY2Vzcy4gIFRoZSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIGRldGFpbHMgb2YgdGhlIGNvbXBvbmVudCBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIHRvIHByb3ZpZGUgaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcyBzdWNoIGFzIGl0IG93biBwcmVkZWNlc3NvcnMgYW5kIHN1Y2Nlc3NvcnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekRwVmZlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k3dlcydS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96RHBWZnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfcHJvY2Vzc0NvbXBvbmVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekRwVmNPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pEcFZuLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96RHBWZi0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96RHBWZ08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pEcFZnZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96RHBWZ3Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekRwVmdlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlIGNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekRwVmctLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k3dld2Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96RHBWaE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJpbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2VzYtLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il96RHBWbGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekRwVmhlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekRwVmh1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96RHBWaC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJpbnRlcmZhY2VJTyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WEN1LXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il96RHBWbXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekRwVmlPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekRwVmllLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pEcFZrTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pEcFZrdS1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZkZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96RHBWa2Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekRwVmtPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVzY3JpYmVzIHRoZSByZWFsaXphdGlvbiByZWxhdGlvbnNoaXBzIGJldHdlZW4gYSBQcm9jZXNzIENvbXBvbmVudCBhbmQgYSBQcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekRwVmt1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmVhbGl6ZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekRwVmNPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96RHBWa08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekRwVmstLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekRwVmxPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pEcFZsZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pEcFZsLS1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZoTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96RHBWbHUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekRwVmxlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5Pkluc3RhbmNlcyBvZiB0aGlzIGFzc29jaWF0aW9uIGNvbnRhaW4gdGhlIGxpc3Qgb2YgVGFzayBEZXNjcmlwdG9ycyB0aGF0IHJlcHJlc2VudCBhIFByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96RHBWbC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3pEcFZnZS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96RHBWbGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekRwVm1PLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekRwVm1lLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96RHBWbXUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96RHBWaC0tc0VkdUg1OUtTSFY4dmdBIF96RHBWbk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekRwVm0tLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pEcFZtdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGNvbnRhaW5zIHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdCB0eXBlIGluc3RhbmNlcyB1c2VkIGZvciB0aGUgaW50ZXJmYWNlIHNwZWNpZmljYXRpb24uPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekRwVm5PLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pEcFZnZS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96RHBWbXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekRwVm5lLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekRwVm51LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96RHBWbi0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96RHBWZnUtc0VkdUg1OUtTSFY4dmdBIF96RHBWb2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekRwVm9PLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pEcFZuLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZSBkZXNjcmlwdG9yIHRvIHRoZSBQcm9jZXNzIENvbXBvbmVudCBpdCByZWZlcnMgdG8uICBBIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgcmVwcmVzZW50cyBleGFjdGx5IG9uZSBQcm9jZXNzIENvbXBvbmVudC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96RHBWb2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pEcFZlLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96RHBWbi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekRwVm91LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekRwVm8tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pEcFZwTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pEcFZlTy1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZwdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96RHBWcGUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekRwVnBPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUHJvY2VzcyBDb21wb25lbnQgY29udGFpbnMgb25seSBleGFjdGx5IG9uZSBQcm9jZXNzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pEcFZwdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9wcm9jZXNzQ29tcG9uZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96RHBWY08tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfekRwVnBPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pEcFZwLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pEcFZxTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekRwVnFlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekRwVmplLXNFZHVINTlLU0hWOHZnQSBfekRwVnEtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pEcFZxdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96RHBWcWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBQcm9jZXNzIFBhY2thZ2UgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cyB3aGljaCBhcmUgdXNlZCB0byBkZWZpbmUgQnJlYWtkb3duIGFuZCBQcm9jZXNzZXMuICBBIFByb2Nlc3MgRWxlbWVudCBpbnN0YW5jZSBjYW4gYmUgcGFydCBvZiBvbmx5IG9uZSBQcm9jZXNzIFBhY2thZ2UgaW5zdGFuY2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekRwVnEtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3Byb2Nlc3NQYWNrYWdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96RHBWaXUtc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfekRwVnFlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQ29udGVudEVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3VmUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkNvbnRlbnQgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4KLUNvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6X3Y1dS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBpcyB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZSdzIGV4dGVuc2lvbiBvZiBDb250ZW50IEVsZW1lbnQgKGRlZmluZWQgaW4gQ29udGVudCBFbGVtZW50cykgcHJvdmlkaW5nIGFkZGl0b25hbCBhc3NvY2lhdGlvbnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHTEZETy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+Q29udGVudCBFbGVtZW50IGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBub3QgZGlyZWN0bHkgZnJvbSBNZXRob2QgRWxlbWVudCBhbnltb3JlLiAgVGhpcyBpcyBhY2hpZXZlZCB1c2luZyBVTUwgMi4wIHBhY2thZ2UgbWVyZ2Ugc2VtYW50aWNzLiAgT25seSBpZiBhbiBhZG9wdGVyIG9mIHRoaXMgbWV0YS1tb2RlbCBkZWNpZGVzIHRvIHJlYWxpemUgTWV0aG9kIFBsdWdpbnMsIGhlIHdvdWxkIGdldCB0aGUgdmFyaWFiaWxpdHkgYW5kIGV4dGVuc2lvbiBjYXBhYmlsaXRpZXMgZm9yIGFsbCBDb250ZW50IEVsZW1lbnRzLgotQ29udGVudCBFbGVtZW50IGluaGVyaXRzIHRoZSBzZW1hbnRpY3Mgb2YgVmFyaWFiaWxpdHkgRWxlbWVudC4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l4dzdWdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3ZXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekdMRkRlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pHTEZKTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95el92NS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtOC0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l6X3dBdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95el92Nk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95el92NmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l6X3Y2dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNvbmNlcHRzQW5kUGFwZXJzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtNGUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l6X3dCLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95el92Ni0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95el92N08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l6X3Y3ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNoZWNrbGlzdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS01Ty1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXpfd0RPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6X3Y3dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6X3Y3LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXpfdjhPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZ3VpZGVsaW5lcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLTZ1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95el93RWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfdjhlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfdjh1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95el92OC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJleGFtcGxlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLTUtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95el93Ry0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfdjlPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfdjllLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95el92OXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJhc3NldHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6X3ZfTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTBKZzVlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6X3Y5LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6X3YtTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXpfdi1lLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idGVybURlZmluaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS1fTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTBKZzl1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6X3YtdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6X3YtLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eHc3UWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJNZXRob2RFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N1F1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5FdmVyeSBjbGFzcyBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcyBNZXRob2QgRWxlbWVudCBpcyB0aGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBjbGFzc2VzIGFuZCBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBldmVyeSBvdGhlciBlbGVtZW50IHR5cGUgb2YgdGhpcyBtb2RlbC4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLiAgTWV0aG9kIEVsZW1lbnQgaW5oZXJpdHMgdGhlIE5hbWUgYXR0cmlidXRlIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCdzIHN1cGVyIGNsYXNzLiAgRXZlcnkgZWxlbWVudCBkZWZpbmVkIGFzIGEgVU1BIGluc3RhbmNlIGlzIGRlcml2ZWQgZnJvbSBNb2RlbCBFbGVtZW50LiAgRXZlcnkgTWV0aG9kIEVsZW1lbnQgaW4tc3RhbmNlIGlzIGF0IGxlYXN0IGRlZmluZWQgYnkgYSB1bmlxdWUgaWQsIGEgbmFtZSwgYXMgd2VsbCBhcyBicmllZiBkZXNjcmlwdGlvbi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekdMRkR1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5NZXRob2QgRWxlbWVudCBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGFkZHMgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHZpYSBwYWNrYWdlIG1lcmdlIHRvIE1ldGhvZCBFbGVtZW50IGRlZmluZWQgaW4gTWV0aG9kIENvcmUgbmVlZGVkIGZvciB0aGUgdmFyaWFiaWxpdHkgYW5kIGV4dGVuc2liaWxpdHkgY2FwYWJpbGl0aWVzIGludHJvZHVjZXMgaW4gdGhpcyBwYWNrYWdlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l4dzdRLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eEtmRnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXh3N1JPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZ3VpZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N1JlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdSTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IGhhcyBhIGdsb2JhbCB1bmlxdWUgaWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXh3N1J1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXh3N1ItLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeXh3N1NPLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXh3N1NlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N1N1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdTZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXh3N1MtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXh3N1RPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeXh3N1RlLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXh3N1R1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ib3duZWRSdWxlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N2N1LXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95eHc3ak8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXh3N1QtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXh3N1VPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eHc3VWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJtZXRob2RFbGVtZW50UHJvcGVydHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdodS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeXg2Rk1PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l4dzdVdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l4dzdVLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekdMRkQtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3VwcHJlc3NlZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekdMRkVPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pHTEZELS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PklmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSBFeHRlbmRzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHRoZW4gdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgaW5oZXJpdGVkIE1ldGhvZCBFbGVtZW50cyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCwgd2hpY2ggY2FuIGJlIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIG9uIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0aGFuIGFuIGluaGVyaXRlZCBtZXRob2QgZWxlbWVudCB0aGVuIGl0IHdpbGwgbm90IGJlIHJlZ2FyZGVkIGFzIGluaGVyaXRlZCBhdCBhbGwuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3pHTEZFZS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pHTEZFdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im9yZGVyaW5nR3VpZGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHTEZFLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96R0xGRXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBDQVNFIHRvb2wgcmVhbGl6YXRpb25zIG9mIHRoaXMgbW9kZWwgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBsYXlvdXQgYW5kIG9yZGVyaW5nIG9mIHRoZSBtZXRob2QgZWxlbWVudCBhbmQgaXRzIHBhcnRzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pHTEZGTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pHTEZGZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pHTEZGdS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfekdMRkYtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iVmFyaWFiaWxpdHlUeXBlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekdMRkdPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pHTEZGLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5WYXJpYWJpbGl0eSBUeXBlIGlzIGFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfekdMRkdlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibmEiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHTEZHdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96R0xGR2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5UaGlzIGlzIHRoZSBkZWZhdWx0ICZxdW90O25vdCBhc3NpZ25lZCZxdW90OyB2YWx1ZSBvZiBhIFZhcmlhYmlsbGl0eSBFbGVtZW50J3MgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSB3aGljaCBpcyBzZXQgaW4gdGhlIGNhc2Ugbm8gdmFyaWFiaWxpdHkgYXNzb2NpYXRpb24gaXMgcHJlc2VudCBiZXR3ZWVuIHRoZSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBvdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50cy4KLTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfekdMRkctLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY29udHJpYnV0ZXMiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHTEZITy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96R0xGRy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5Db250cmlidXRlcyBwcm92aWRlcyBhIHdheSBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHRvIGNvbnRyaWJ1dGUgdGhlaXIgcHJvcGVydGllcyBpbnRvIHRoZWlyIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGFsdGVyaW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcywgaS5lLiBpbiBhbiBhZGRpdGl2ZSBmYXNoaW9uLiAgUHJvcGVydGllcyBjb250cmlidXRlZCBhcmU6IGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uIGluc3RhbmNlcy4gIFRoZSBlZmZlY3QgYWZ0ZXIgaW50ZXJwcmV0YXRpb24gb2YgY29udHJpYnV0aW9uIGlzIHRoYXQgdGhlIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBsb2dpY2FsbHkgcmVwbGFjZWQgd2l0aCBhbiBhdWdtZW50ZWQgdmFyaWFudCBvZiB0aGUgZWxlbWVudCB0aGF0IGNvbWJpbmVzIGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uIGluc3RhbmNlcy4gIFRoZSB3YXkgdGhpcyBjb21iaW5hdGlvbiBpcyByZWFsaXplZCBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUgb3IgYXNzb2NpYXRpb24uICBGb3IgZXhhbXBsZSwgU3RyaW5nIGF0dHJpYnV0ZXMgYXJlIGNvbmNhdGVuYXRlZCByZXNvbHZpbmcgZW1iZWRkZWQgY29tbWFuZHMgZm9yIGRlcGVuZGVudCB0ZXh0IG9yIG1lcmdpbmcgdGV4dCBmcmFnbWVudHMgKGUuZy4gZGVzY3JpcHRpb25zIGZvciBjb250ZW50IGVsZW1lbnRzKS4gIEFkZGl0aW9uYWwgZWxlbWVudHMgaW4gdG8tbWFueSBhc3NvY2lhdGlvbnMgYXJlIGFkZGVkIChlLmcuIGFkZGl0aW9uYWwgR3VpZGFuY2UgZWxlbWVudHMgb3IgVGFzayBEZXNjcmlwdG9ycyBvZiBhbiBBY3Rpdml0eSkuICBEaWZmZXJlbnQgZWxlbWVudHMgaW4gdG8tb25lIGFzc29jaWF0aW9ucyBhcmUgaWdub3JlZCAoZS5nLiB0aGUgb25lIFByaW1hcnkgUGVyZm9ybWVyIG9mIGEgVGFzaykuICBNdWx0aXBsZSBDb250ZW50IEVsZW1lbnRzIGNhbiBjb250cmlidXRlIHRvIHRoZSBzYW1lIGJhc2UgZWxlbWVudCBhbmQgYWxsIG9mIHRoZXNlIGNvbnRyaWJ1dGlvbnMgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gdGhlIGJhc2UgaW4gdGhlIHNhbWUgZmFzaGlvbi4gVGhlIGZvbGxvd2luZyB0YWJsZSBwcm92aWRlcyB0aGUgZGV0YWlsZWQgbGlzdCBvZiBpbnRlcnByZXRhdGlvbiBydWxlczoKLWF0dHJpYnV0ZSB2YWx1ZXM6CVN0cmluZyB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSBjb25jYXRlbmF0ZWQgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudC4gIE90aGVyIHZhbHVlcyBmcm9tIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgYW55IG90aGVyIHR5cGUgc3VjaCBhcyBJbnRlZ2VyLCBEYXRlIGFyZSBpZ25vcmVkLgotVGhlIGlkZW50aWZ5aW5nIGF0dHJpYnV0ZXMgZ3VpZCBhbmQgbmFtZSBvZiBNZXRob2QgRWxlbWVudCBhcmUgZXhlbXB0IGZyb20gdGhpcyBydWxlIGFuZCB3aWxsIG5vdCBiZSBtb2RpZmllZC4KLTAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOglUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGtlcHQgYW5kIGFueSBhc3NvY2lhdGlvbiBmcm9tIHRoZSBjb250cmlidXRpbmcgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGlnbm9yZWQuCi0wLi5uLWFzc29jaWF0aW9uIGluc3RhbmNlczoJQXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIGFkZGVkIHRvIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgYmFzZWQtb24gZWxlbWVudC4gIElmIGJvdGggVmFyaWFiaWxpdHkgRWxlbWVudHMgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0IHRoZW4gb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhlIGFzc29jaWF0aW9uIHdpbGwgcmVtYWluLgotPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il96R0xGSGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJleHRlbmRzIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96R0xGSHUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekdMRkhlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+RXh0ZW5zaW9uIGFsbG93cyBNZXRob2QgUGx1Z2lucyB0byBlYXNpbHkgcmV1c2UgZWxlbWVudHMgZnJvbSBhIEJhc2UgUGx1Z2luIGJ5IHByb3ZpZGluZyBhIGtpbmQgb2YgaW5oZXJpdGFuY2UgZm9yIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBBdHRyaWJ1dGUgdmFsdWVzIGFuZCBBc3NvY2lhdGlvbiBpbnN0YW5jZXMgYXJlIGluaGVyaXRlZCBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IHRvIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBUaGUgcmVzdWx0IG9mIGludGVycHJldGF0aW9uIGlzIHRoYXQgdGhlIHNwZWNpYWwgZWxlbWVudCBoYXMgdGhlIHNhbWUgcHJvcGVydGllcyBhcyB0aGUgYmFzZWQtb24gaGFzLCBidXQgbWlnaHQgZGVmaW5lIGl0cyBvd24gYWRkaXRpb25zLiAgSGVuY2UgZXh0ZW5kcyBpcyBub3QgdXNlZCB0byBtb2RpZnkgY29udGVudCBvZiB0aGUgYmFzZSBQbHVnaW4sIGJ1dCB0byBwcm92aWRlIHRoZSBhYmlsaXR5IGZvciB0aGUgZXh0ZW5kaW5nIFBsdWdpbiB0byBkZWZpbmUgaXRzIG93biBjb250ZW50IHdoaWNoIGlzIGEgdmFyaWFudCBvZiBjb250ZW50IGFscmVhZHkgZGVmaW5lZCAoZS5nLiBhIHNwZWNpYWwgdmVyc2lvbiBvZiBhIGdlbmVyaWMgUmV2aWV3IFJlY29yZCBmb3IgYSBzcGVjaWZpYyB0eXBlIG9mIHJldmlldykuICBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB0aGUgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBhbnkgbnVtYmVyIG9mIGV4dGVuZGluZyBWYXJpYWJpbGl0eSBFbGVtZW50cyBjYW4gYmUgdXNlZCBzaWRlIGJ5IHNpZGUsIGJ1dCByZWZlciB0byBlYWNoIG90aGVyIHZpYSB0aGUgZXh0ZW5kcyByZWxhdGlvbnNoaXAuICBFeHRlbmRzIGFsc28gcHJvdmlkZXMgdGhlIGtleSBtZWNoYW5pc20gZm9yIGJpbmRpbmcgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0byBQcm9jZXNzZXM6IEEgcGF0dGVybiBpcyBhcHBsaWVkIGJ5IGRlZmluaW5nIGFuIGV4dGVuZHMgcmVsYXRpb25zaGlwcyBmcm9tIGFuIEFjdGl2aXR5IG9mIHRoZSBhcHBseWluZyBQcm9jZXNzZXMgdG8gdGhlIFBhdHRlcm4uICBUaGUgQWN0aXZpdHkgaW5oZXJpdHMgYXNzb2NpYXRpb25zIGluc3RhbmNlcyBmcm9tIHRoZSBwYXR0ZXJuIGFuZCB0aGUgcGF0dGVybiBhcHBlYXJzIHRvIGJlIHBhcnQgb2YgdGhlIHJlc3VsdGluZyBQcm9jZXNzIGFmdGVyIEludGVycHJldGF0aW9uLgotYXR0cmlidXRlIHZhbHVlczoJVmFsdWVzIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IGVsZW1lbnQgYXJlIGluaGVyaXRlZCBhbmQgdXNlZCB0byBwb3B1bGF0ZSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50cyBhdHRyaWJ1dGVzLiAgSWYgdGhlIHNwZWNpYWwgZWxlbWVudCBhdHRyaWJ1dGVzIGFyZSBhbHJlYWR5IHBvcHVsYXRlZCB0aGUgaW5oZXJpdGVkIHZhbHVlcyBhcmUgaWdub3JlZC4gIAotVGhlIGlkZW50aWZ5aW5nIGF0dHJpYnV0ZXMgZ3VpZCBhbmQgbmFtZSBvZiBNZXRob2QgRWxlbWVudCBhcmUgZXhlbXB0IGZyb20gdGhpcyBydWxlIGFuZCB3aWxsIG5vdCBiZSBtb2RpZmllZC4KLTAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOglUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGluaGVyaXRlZCB0byB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgSWYgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBkZWZpbmVzIGl0cyBvd24gYXNzb2NpYXRpb24gaW5zdGFuY2UgdGhlbiB0aGUgaW5oZXJpdGVkIG9uZSBpcyBpZ25vcmVkLgotMC4ubi1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CUFzc29jaWF0aW9uIGluc3RhbmNlcyBkZWZpbmVkIGZvciB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgaW5oZXJpdGVkIHRvIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBUaGUgc3BlY2lhbCBlbGVtZW50IGNhbiBhZGQgYWRkaXRpb25hbCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuCi0KLTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfekdMRkgtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmVwbGFjZXMiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHTEZJTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96R0xGSC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5SZXBsYWNlcyBwcm92aWRlcyBhIHdheSBmb3IgVmFyaWFiaWxpdHkgRWxlbWVudHMgdG8gcmVwbGFjZSBhIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGNoYW5naW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcy4gIFRoaXMgaXMgaW4gbW9zdCBjYXNlcyB1c2VkIGZvciBNZXRob2QgUGx1Z2lucyB0aGF0IGFpbSB0byByZXBsYWNlIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFzaywgb3IgQWN0aXZpdGllcyB3aXRoIGVpdGhlciBhIGNvbXBsZXRlIG5ldyB2YXJpYW50IG9yIHRvIGNoYW5nZSBmdW5kYW1lbnRhbCByZWxhdGlvbnNoaXBzIG9mIHRoZXNlIGVsZW1lbnRzIChlLmcuIFJvbGUtQXJ0aWZhY3QgcmVzcG9uc2liaWxpdHkpLiAgUHJvcGVydGllcyByZXBsYWNlZCBhcmUgYXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24gaW5zdGFuY2VzLiAgVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgdGhlIGJhc2UgQ29udGVudCBFbGVtZW50IGlzIGxvZ2ljYWxseSByZXBsYWNlZCB3aXRoIHRoaXMgbmV3IHZhcmlhbnQgb2YgdGhlIGVsZW1lbnQgdG8gd2hpY2ggYWxsIGluY29taW5nIGFzc29jaWF0aW9ucyBzdGlsbCBwb2ludCBhcyBiZWZvcmUsIGJ1dCB3aGljaCBoYXMgcG90ZW50aWFsbHkgbmV3IGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIG91dGdvaW5nIGFzc29jaWF0aW9uIHByb3BlcnRpZXMuICBUaGlzIHByb3ZpZGVzIGEgdmVyeSBwb3dlcmZ1bCBtZWNoYW5pc20gdG8gcmVwbGFjZSwgZm9yIGV4YW1wbGUsIHdob2xlIEFjdGl2aXRpZXMgaW4gYSBQcm9jZXNzIHdpdGggY29tcGxldGUgbmV3IHJlYWxpemF0aW9ucyBvZiB0aGUgQWN0aXZpdHkuICBGb3IgaW5zdGFuY2UsIHJlcGxhY2luZyBhbiBBY3Rpdml0eSBkb2luZyB1c2UgY2FzZS1iYXNlZCBkZXNpZ24gd2l0aCBhbiBhY3Rpdml0eSBkb2luZyBhZ2lsZSBjb2RlLWNlbnRyaWMgZGV2ZWxvcG1lbnQgZG9pbmcgdGhlIHNhbWUgd29yayB1c2luZyBhIGRpZmZlcmVudCBkZXZlbG9wbWVudCB0ZWNobmlxdWUgdXRpbGl6aW5nIGRpZmZlcmVudCBSb2xlcywgVGFza3MsIGV0Yy4gIEFub3RoZXIgZXhhbXBsZSwgd291bGQgYmUgdG8gcmVwbGFjZSBhbiBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBkYXRhYmFzZSBkZXNpZ24gZm9yIGFuIFJEQk1TIHdpdGggYW4gQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgZGF0YWJhc2UgZGVzaWduIGZvciBhbiBPT0RCTVMuICBBIFZhcmlhYmlsaXR5IEVsZW1lbnQgY2FuIG9ubHkgYmUgcmVwbGFjZWQgYnkgb25lIG90aGVyIGVsZW1lbnQgYXQgYSB0aW1lLiAgRm9yIGV4YW1wbGUsIGlmIHR3byBNZXRob2QgUGx1Z2lucyByZXBsYWNlIHRoZSBzYW1lIGVsZW1lbnQgb25seSBvbmUgTWV0aG9kIFBsdWdpbiBjYW4gYmUgdXNlZCBmb3IgaW50ZXJwcmV0YXRpb24gKHNlZSBjb25jZXB0IG9mIE1ldGhvZCBDb25maWd1cmF0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gaG93IHRvIHJlc29sdmUgc3VjaCBjb25mbGljdHMsIFNlY3Rpb24gNy4xLjIpLiAgVGhlIGZvbGxvd2luZyB0YWJsZSBwcm92aWRlcyB0aGUgZGV0YWlsZWQgbGlzdCBvZiBpbnRlcnByZXRhdGlvbiBydWxlczoKLWF0dHJpYnV0ZSB2YWx1ZXM6CVZhbHVlcyBmcm9tIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIHJlcGxhY2VkIHdpdGggdmFsdWVzIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaW5jbHVkaW5nIHVuYXNzaWduZWQgdmFsdWVzLgotVGhlIGlkZW50aWZ5aW5nIGF0dHJpYnV0ZXMgZ3VpZCBhbmQgbmFtZSBvZiBNZXRob2QgRWxlbWVudCBhcmUgZXhlbXB0IGZyb20gdGhpcyBydWxlIGFuZCB3aWxsIG5vdCBiZSBtb2RpZmllZC4KLTAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOglUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIHJlcGxhY2VkIHdpdGggdGhlIGFzc29jaWF0aW9uIGluc3RhbmNlIGZyb20gdGhlIHJlcGxhY2luZyBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBJZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRpb24gaW5zdGFuY2UgdGhlbiByZXN1bHRpbmcgZWxlbWVudCB3aWxsIGFsc28gbm90IGhhdmUgYW4gYXNzb2NpYXRpb24uCi0wLi5uLWFzc29jaWF0aW9uIGluc3RhbmNlczoJQXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgcmVwbGFjZSBhbGwgYXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LgotCi08L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3pHTEZJZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImxvY2FsQ29udHJpYnV0aW9uIi8+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3pHTEZJdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImxvY2FsUmVwbGFjZW1lbnQiLz4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfekdMRkktLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZXh0ZW5kc1JlcGxhY2VzIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96R0xGSk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJWYXJpYWJpbGl0eUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96R0xGSmUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekdMRkpPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50IHRoYXQgcHJvdmlkZXMgbmV3IGNhcGFiaWxpdGllcyBmb3IgY29udGVudCB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBDb250ZW50IEVsZW1lbnRzIG9yIGFueSBvdGhlciBNZXRob2QgRWxlbWVudCB0aGF0IGRlcml2ZXMgZnJvbSBpdC4gIEl0IGhhcyBiZWVuIHBsYWNlZCBpbi1iZXR3ZWVuIHRoZSBjbGFzc2VzIE1ldGhvZCBFbGVtZW50IGFuZCBDb250ZW50IEVsZW1lbnQgaW4gdGhlIG92ZXJhbGwgVU1BIHRheG9ub215IG9mIGNsYXNzZXMgdXNpbmcgdGhlIFVNTCAyLjAgcGFja2FnZSBtZXJnZSBtZWNoYW5pc20uICBUaGUgYXNzb2NpYXRpb24gVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gc2hhbGwgb25seSBiZSBpbnN0YW50aWF0ZWQgYmV0d2VlbiB0d28gc3ViY2xhc3NlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBzYW1lIHR5cGUuICBUaGUgZWxlbWVudCBvbiB2YXJhaWJpbGl0eVNwZWNpYWxFbGVtZW50IHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBkZWZpbmVzIGEgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlIGRlZmluaW5nIHRoZSBuYXR1cmUgb2YgdGhlIHJlbGF0aW9uc2hpcCB1c2luZyBhIGxpdGVyYWwgZnJvbSB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4KLVZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIG1ldGEtbW9kZWwgcGFja2FnZSBNZXRob2QgUGx1Z2lucyBhZGRzIHRoZSBjYXBhYmlsaXRpZXMgb2YgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gTWV0aG9kIEVsZW1lbnRzIHRoYXQgZGVyaXZlIGZyb20gaXQuICBCeSBkZWZhdWx0IGFsbCBDb250ZW50IEVsZW1lbnRzIHN1Y2ggYXMgUm9sZSwgVGFzaywgR3VpZGFuY2UgVHlwZXMsIG9yIEFjdGl2aXRpZXMgYXJlIGRlZmluZWQgdG8gYmUgVmFyaWFiaWxpdHkgRWxlbWVudHMuCi1WYXJpYWJpbGl0eSBhbmQgZXh0ZW5zaW9uIHByb3ZpZGVzIHVuaXF1ZSBtZWNoYW5pc21zIGZvciBjdXN0b21pemluZyBtZXRob2QgY29udGVudCB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudCwgYnV0IGJ5IGp1c3QgYmUgYWJsZSB0byBkZXNjcmliZSB3aXRoIHNlcGFyYXRlIG9iamVjdHMgdGhlIGRpZmZlcmVuY2VzIChhZGRpdGlvbnMsIGNoYW5nZXMsIG9taXNzaW9ucykgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsLiAgVGhpcyBwbHVnLWluIGNvbmNlcHQgYWxsb3dzIHVzZXJzIHRvIGZhY3RvciB0aGVpciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGludGVycmVsYXRlZCB1bml0cyBhbmQgZXZlbiB0byBhcmNoaXRlY3QgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBsYXllcnMgdGhhdCBleHRlbmQgZWFjaCBvdGhlciB3aXRoIG5ldyBjYXBhYmlsaXRpZXMuICBUaGUgcmVzdWx0aW5nIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNpZ24gY2FuIGJlIGR5bmFtaWNhbGx5IGNvbWJpbmVkIGFuZCBhcHBsaWVkIG9uIGRlbWFuZCB1c2luZyB0aGUgaW50ZXJwcmV0YXRpb24gcnVsZXMgZGVmaW5lZCBmb3IgVmFyaWFiaWxpdHkgRWxlbWVudCBTcGVjaWFsaXphdGlvbnMgYXNzZW1ibGluZyB0byBwcm9jZXNzIHByYWN0aXRpb25lcnMgdGhlIG1vc3QgYWNjdXJhdGUgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2NyaXB0aW9ucyBwb3NzaWJsZS4gIEl0IGFsc28gYWxsb3dzIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0byBleHRlbmRzIGFuZCB0YWlsb3IgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyB0aGV5IGRvIG5vdCBvd24gYW5kIHRvIGVhc2lseSB1cGdyYWRlIHRvIG5ld2VyIHZlcnNpb25zIGJ5IHNpbXBseSByZWFwcGx5IHRoZWlyIHBlcnNvbmFsIGNoYW5nZXMgdG8gdGhlc2UgdXBncmFkZXMuCi1WYXJpYWJpbGl0eSBFbGVtZW50IGRlZmluZXMgdHdvIHR5cGVzIG9mIHZhcmlhYmlsaXR5IGFuZCBvbmUgdHlwZSBvZiBleHRlbnNpb24gd2hpY2ggYXJlIGZvcm1hbGx5IGRlZmluZWQgZm9yIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekdMRkp1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96R0xGSi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pHTEZGLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHTEZLTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96R0xGSi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5JZiBpbiBpbnN0YW5jZSBvZiB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsaXphdGlvbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byBWYXJpYWJpbGl0eSBFbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlIGV4aXN0cywgdGhlbiB0aGUgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgaG93IHRoZSBlbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxFbGVtZW50IGVuZCBvZiB0aGUgYXNzb2NpYXRpb24gY2hhbmdlcyB0aGUgQ29udGVudCBFbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IGVuZC4gU2VlIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGVudW1lcmF0aW9uIGNsYXNzIGZvciBkZWZpbml0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiB2YXJpYWJpbGl0eS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfekdMRktlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+bmE8L2JvZHk+Ci0gICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96R0xGS3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96R0xGSk8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pHVTJDdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96R0xGSy0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96R0xGTE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l4dzdZdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlNlY3Rpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3WS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N1l1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgU2VjdGlvbiBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekdMRkxlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdZdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5TZWN0aW9uIGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBleHRlbmRzIFNlY3Rpb24gZGVmaW5lZCBpbiBNZXRob2QgQ29yZSA6OiBCYXNpYyBFbGVtZW50cyB3aXRoIG5ldyBjYXBhYmlsaXRpZXMgZm9yIHZhcmlhYmlsaXR5LiAKLUZvciBleGFtcGxlLCB3aGVuIGEgVGFzayBjb250cmlidXRlcyB0byBhbm90aGVyIFRhc2sgaXRzIFByZXNlbnRhdGlvbiBhc3NvY2lhdGlvbiBpcyBjb250cmlidXRlZCBpbmNsdWRpbmcgaXRzIFNlY3Rpb25zIChpLmUuIGl0cyBTdGVwcyksIHdoaWNoIGFyZSBtb2RlbGVkIGFzIHBhcnRzIG9mIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlLiAgU2VjdGlvbnMgY2FuIGJlIG5lc3RlZCBhbmQgdGhlcmVmb3JlIFRhc2sgRGVzY3JpcHRpb25zIGNhbiBiZSBmbGV4aWJseSBvcmdhbml6ZWQgaW4gU3RlcHMgd2l0aCBzdWItU3RlcHMuICBTZWN0aW9ucyBhcmUgVmFyaWFiaWxpdHkgRWxlbWVudHMgdGhlbXNlbHZlcywgc28gdGhleSBjYW4gY29udHJpYnV0ZSB0byBlYWNoIG90aGVyLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBtb2RlbCBhIFRhc2sgc3RlcCBhcyBhIFNlY3Rpb24gaW5zdGFuY2Ugd2l0aG91dCByZWxhdGluZyBpdCB0byBhIFRhc2sgRGVzY3JpcHRpb24gdGhhdCBkaXJlY3RseSBjb250cmlidXRlcyB0byAob3IgcmVwbGFjZXMpIGFub3RoZXIgU2VjdGlvbiB3aGljaCBpcyBwYXJ0IG9mIGEgVGFzayBEZXNjcmlwdGlvbi4gIFRoaXMgY29udHJpYnV0aW9uIChvciByZXBsYWNlbWVudCkgd291bGQgYWRkIG5ldyBkZXNjcmlwdGlvbiB0ZXh0IHRvIHRoZSBvcmlnaW5hbCBzdGVwIGRlc2NyaXB0aW9uIChvciByZXBsYWNlIHRoZSBvcmlnaW5hbCBzdGVwIGRlc2NyaXB0aW9uKS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSB0byBjb250cmlidXRlIG5ldyBDaGVjayBMaXN0IGl0ZW1zIG9yZ2FuaXplZCBhcyBTZWN0aW9ucyB0byBhbiBleGlzdGluZyBDaGVjayBMaXN0IChkZWZpbmVkIGFzIGd1aWRhbmNlKS4gIAotCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96R0xGTHUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekdMRkpPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l4dzdaZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InNlY3Rpb25OYW1lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3WnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N1plLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+RXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l4dzdaLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l4dzdhTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3l4dzdhZS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l4dzdhdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InNlY3Rpb25EZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N2EtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdhdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlRoaXMgYXR0cmlidXRlcyBzdG9yZSB0aGUgZGVzY3JpcHRpb24gdGV4dCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uJ3MgU2VjdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eHc3Yk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eHc3YmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95eHc3YnUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eHc3Yi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdWJTZWN0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N1l1LXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95eHc3bE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXh3N2NPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXh3N2NlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96R0xGTC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcmVkZWNlc3NvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N1l1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96R1UyRC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekdMRk1PLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekdMRk1lLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkFjdGl2aXR5Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTdtTXNlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BbiBBY3Rpdml0eSBpcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uCi1BY3Rpdml0eSByZXByZXNlbnRzIGEgZ3JvdXBpbmcgZWxlbWVudCBmb3Igb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4gIEl0IGlzIG5vdCBwZXItc2UgYSAnaGlnaC1sZXZlbCcgZ3JvdXBpbmcgb2Ygb25seSB3b3JrIGFzIGluIG90aGVyIG1ldGEtbW9kZWxzLCBidXQgZ3JvdXBzIGFueSBraW5kIG9mIEJyZWFrZG93biBFbGVtZW50cy4gIEZvciBleGFtcGxlLCBvbmUgY2FuIGRlZmluZSB2YWxpZCBBY3Rpdml0aWVzIHRoYXQgZ3JvdXAgb25seSBXb3JrIFByb2R1Y3RzIERlc2NyaXB0b3JzIHdpdGhvdXQgYW55IG1hdGNoaW5nIFRhc2sgRGVzY3JpcHRvcnMuICBBY3Rpdml0aWVzIGFsc28gaW5oZXJpdCBhbGwgcHJvcGVydGllcyBmcm9tIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIGluZGlyZWN0bHkgZnJvbSBQcm9jZXNzIEVsZW1lbnQ7IGkuZS4gQWN0aXZpdHkgaXMgcmVhZHkgdG8gaGF2ZSBhIGZ1bGwgY29udGVudCBkZXNjcmlwdGlvbiBhdHRhY2hlZCB0byBpdC4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95LTRLU08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgZGVmaW5pdGlvbiBvZiBBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IGludHJvZHVjZWQgaW4gdGhlIHBhY2thZ2UgQnJlYWtkb3duIHdpdGggbmV3IGNhcGFiaWxpdGllcyBhbmQgaXMgdGhlIGJhc2lzIGZvciB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY2xhc3MgUHJvY2Vzcy4KLUV4dGVuZHMgQWN0aXZpdHkgd2l0aCBhbiBhc3NvY2lhdGlvbiB0byBSb2FkbWFwLiAgVGhpcyBkZWZpbml0aW9uIG9mIEFjdGl2aXR5IGFsc28gcGFydGljaXBhdGVzIGluIHRoZSBleHRlbnNpb24gb2YgdGhlIERpc2NpcGxpbmUgY2F0ZWdvcnkuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekdMRk11LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BY3Rpdml0eSBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGluaGVyaXRzIGZyb20gVmFyaWFiaWxpdHkgRWxlbWVudCB0byBleHRlbmQgQWN0aXZpdHkgd2l0aCBuZXcgY2FwYWJpbGl0aWVzIGZvciB2YXJpYWJpbGl0eS4mI3hEOwotQWN0aXZpdHkgaW5oZXJpdHMgdGhlIHNlbWFudGljcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50IHdoaWNoIHByb3ZpZGVzIGtleSBtZWNoYW5pc20gdG8gZW5hYmxlIGR5bmFtaWMgYmluZGluZyBvZiBDYXBhYmlsaXR5IFBhdHRlcm5zIGluIFByb2Nlc3NlcyBhcyB3ZWxsIGFzIFByb2Nlc3MgQ29udHJpYnV0aW9ucy4gIFZhcmlhYmlsaXR5IGlzIHVzZWQgaW4gdGhlIGZvbGxvd2luZyB3YXkgZm9yIEFjdGl2aXRpZXM6JiN4RDsKLS0gRXh0ZW5kOiBUbyBhcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBhIHByb2Nlc3Mgb25lIHdvdWxkIGNyZWF0ZSBhbiBBY3Rpdml0eSB3aGljaCBleHRlbmRzIHRoZSBwYXR0ZXJuJ3MgdG9wLWxldmVsIGFjdGl2aXR5LiAgVGhyb3VnaCBleHRlbnNpb24gdGhlIGV4dGVuZGluZyBBY3Rpdml0eSBpbmhlcml0cyB0aGUgcGF0dGVybnMgQnJlYWtkb3duIEVsZW1lbnRzLiYjeEQ7Ci0tIFJlcGxhY2U6IFRvIHJlcGxhY2UgYW4gQWN0aXZpdHkgb2YgYW4gYXBwbGllZCBDYXBhYmlsaXR5IFBhdHRlcm4gb3IgYW4gZXhpc3RpbmcgcHJvY2VzcyBmb3Igd2hpY2ggb25lIGRldmVsb3BzIGEgUHJvY2VzcyBDb250cmlidXRpb24gKG9yIGEgY29tYmluYXRpb24gb2YgYm90aCkgb25lIHdvdWxkIGNyZWF0ZSBhbiBBY3Rpdml0eSBhbmQgc3BlY2lmeSB0aGUgcmVwbGFjZSB2YXJpYWJpbGl0eSBzcGVjaWFsaXphdGlvbiBiZXR3ZWVuIHRoZW0uJiN4RDsKLS0gQ29udHJpYnV0ZTogVG8gY29udHJpYnV0ZSBuZXcgQnJlYWtkb3duIEVsZW1lbnRzIHRvIGFuIGV4aXN0aW5nIEFjdGl2aXR5IG9uZSB3b3VsZCBkZWZpbmUgYW4gQWN0aXZpdHkgd2l0aCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWxhdGVzIHZpYSB0aGUgQ29udHJpYnV0ZXMgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gdG8gdGhpcyBleGlzdGluZyBBY3Rpdml0eS4gIFRoZSBjb250cmlidXRpbmcgQWN0aXZpdHkncyBCcmVha2Rvd24gRWxlbWVudHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgY29udHJpYnV0ZWQgQWN0aXZpdHkuJiN4RDsKLSYjeEQ7Ci08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95N21Nc3Utc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTd2WEtlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3bU1zLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkVE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekdMRk0tLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pHTEZKTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N21NdE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJicmVha2Rvd25FbGVtZW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2V3ZPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95X0JVUnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTdtTXRlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTdtTXR1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95LTRLU2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyb2FkbWFwcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeS00S1JlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95X0JVTi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeS00S1N1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeS00S1MtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95LTRLVE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtOC0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3lfQlVVZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95LTRLVGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95LTRLVHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3ktNEtULS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNoZWNrbGlzdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS01Ty1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeV9CVVZ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3ktNEtVTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3ktNEtVZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeS00S1V1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY29uY2VwdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS00ZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeV9CVVctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3ktNEtVLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3ktNEtWTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeS00S1ZlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZXhhbXBsZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS01LS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeV9CVVlPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3ktNEtWdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3ktNEtWLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeS00S1dPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZ3VpZGVsaW5lcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLTZ1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95X0JVWmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeS00S1dlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeS00S1d1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95LTRLVy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXpfdl9PLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95X0JVYXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeS00S1hPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeS00S1hlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pHVTJBTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pHVTJBdS1zRWR1SDU5S1NIVjh2Z0EgX3pHTEZCdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96R1UyQWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekdVMkFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgY29tcG9zaXRpb24gYXNzb2NpYXRpb24gcmVwcmVzZW50cyB0aGF0IGV2ZXJ5IE1ldGhvZCBQYWNrYWdlIChlaXRoZXIgQ29udGVudCBQYWNrYWdlLCBQcm9jZXNzIFBhY2thZ2UsIG9yIFByb2Nlc3MgQ29tcG9uZW50KSBpcyBwYXJ0IG9mIGV4YWN0bHkgb25lIE1ldGhvZCBQbHVnaW4uPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekdVMkF1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX21ldGhvZFBsdWdpbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekdMRkFPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pHVTJBTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96R1UyQS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96R1UyQk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pHVTJCZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkV4dGVuc2lvbiIgbWVtYmVyRW5kPSJfekdVMkItLXNFZHVINTlLU0hWOHZnQSBfekdMRkNlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHVTJCdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96R1UyQmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZWZpbmVzIGhvdyBNZXRob2QgUGx1Z2lucyBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucy4gIFRoZSBleHRlbmRpbmcgcGx1Zy1pbiBjb250YWlucyBuZXcgbWV0aG9kIGVsZW1lbnRzLCBleHRlbmRzIGV4aXN0aW5nIG1ldGhvZCBlbGVtZW50cyBhbmQgcHJvY2Vzc2VzIHVzaW5nIGNvbnRlbnQgZWxlbWVudCB2YXJpYWJpbGl0eSBtZWNoYW5pc21zIChlLmcuIGNvbnRyaWJ1dGlvbiwgcmVwbGFjZSwgZXRjLiksIHByb3ZpZGVzIGFkZGl0aW9uYWwgRGVsaXZlcnkgYW5kIENhcGFiaWxpdHkgUHJvY2Vzc2VzIGZvciBhIE1ldGhvZCBGcmFtZXdvcmssIGV0Yy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96R1UyQi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwbHVnaW5zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96R0xGQU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pHVTJCZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96R1UyQ08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96R1UyQ2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekdVMkN1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idmFyaWFiaWxpdHlTcGVjaWFsaXphdGlvbiIgbWVtYmVyRW5kPSJfekdVMkRPLXNFZHVINTlLU0hWOHZnQSBfekdMRkt1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHVTJDLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96R1UyQ3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyAxLXRvLW1hbnkgYXNzb2NpYXRpb24gZGVmaW5lcyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHRoYXQgYSBudW1iZXIgb2Ygc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlIHJlcHJlc2VudCBhIHZhcmlhdGlvbiBvZiBleGFjdGx5IG9uZSBvdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiAgU2VlIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGVudW1lcmF0aW9uIGNsYXNzIGZvciBkZWZpbml0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiB2YXJpYWJpbGl0eS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96R1UyRE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ2YXJpYWJpbGl0eVNwZWNpYWxFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96R0xGSk8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pHVTJDdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96R1UyRGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96R1UyRHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekdVMkQtLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekdMRkwtLXNFZHVINTlLU0hWOHZnQSBfekdVMkVlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHVTJFTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96R1UyRC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZXNjcmliZXMgdGhlIG9yZGVyIGluIHdoaWNoIGNvbnRyaWJ1dGVkIFNlY3Rpb25zIHNoYWxsIGJlIGluc2VydGVkIGludG8gYW4gIGV4aXN0aW5nIGxpc3Qgb2YgU2VjdGlvbnMgbWFpbnRhaW5lZCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pHVTJFZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9zZWN0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3WXUtc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfekdVMkQtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pHVTJFdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pHVTJFLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SkFXa08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQb2ludCI+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV2tlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ieCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGNPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVdrdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBjTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKQVdrLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkdyYXBoRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekpBV2xPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pKQVdwZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXbGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwb3NpdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV2tPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVdsdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNvbnRhaW5lZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV3BlLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il96SktINk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpBV2wtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpBV21PLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXbWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJsaW5rIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SktIa08tc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3pKS0g3dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SkFXbXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SkFXbS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVduTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFuY2hvcmFnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV3ctLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il96SktINy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpBV25lLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpBV251LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXbi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzZW1hbnRpY01vZGVsIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SktIcWUtc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3pKS0g5dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SkFXb08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SkFXb2Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKQVdvdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRpbWVuc2lvbiI+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV28tLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0id2lkdGgiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBjTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXcE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJoZWlnaHQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBjTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKQVdwZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRpYWdyYW1FbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SkFXcHUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVdwLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImlzVmlzaWJsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il96SkFXcU8tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+dHJ1ZTwvYm9keT4KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVdxZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNvbnRhaW5lciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV2stLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96SktINk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpBV3F1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpBV3EtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXck8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZWZlcmVuY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVdzdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekpLSDZlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKQVdyZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKQVdydS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV3ItLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJvcGVydHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVd1ZS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfekpLSDZ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKQVdzTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKQVdzZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SkFXc3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJSZWZlcmVuY2UiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKQVdzLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SkFXcGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV3RPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX3pKQVd0ZS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVd0dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJlZmVyZW5jZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVdwZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekpLSDZlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKQVd0LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKQVd1Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpBV3VlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUHJvcGVydHkiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKQVd1dS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SkFXcGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV3UtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ia2V5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpBV3ZPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpBV3ZlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekpBV3Z1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV3YtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idmFsdWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SkFXd08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SkFXd2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96SkFXd3Utc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKQVd3LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkdyYXBoQ29ubmVjdG9yIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SkFXeE8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpBV2stLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVd4ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImdyYXBoRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV2stLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96SktINy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpBV3h1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpBV3gtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV3lPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZ3JhcGhFZGdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXeS0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pKS0g4Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SkFXeWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SkFXeXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpBV3ktLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iR3JhcGhFZGdlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SkFXek8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpBV2stLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVd6ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFuY2hvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV3ctLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96SktIOE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpBV3p1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjIiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpBV3otLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBVzBPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0id2F5cG9pbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXa08tc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3pKS0g4ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SkFXMGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SkFXMHUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKS0hrTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRpYWdyYW1MaW5rIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SktIa2Utc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpBV3BlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0hrdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Inpvb20iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBjTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIay0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ2aWV3cG9ydCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV2tPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0hsTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImdyYXBoRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV2stLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96SktIN3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSGxlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSGx1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSGwtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZGlhZ3JhbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpLSG5lLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96SktIOWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSG1PLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSG1lLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SktIbXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJHcmFwaE5vZGUiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKS0htLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SkFXay0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSG5PLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic2l6ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV291LXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpLSG5lLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGlhZ3JhbSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekpLSG51LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pKS0htdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIbi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ6b29tIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQY08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSG9PLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSG9lLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIb3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ2aWV3cG9pbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVdrTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIby0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJkaWFncmFtTGluayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpLSGtPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96SktIOWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSHBPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSHBlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIcHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJuYW1lc3BhY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKS0hxZS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfekpUUmdPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKS0hwLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKS0hxTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpLSHFlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iU2VtYW50aWNNb2RlbEJyaWRnZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekpLSHF1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pKQVdwZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIcS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcmVzZW50YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SktIck8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SktIcmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96SktIcnUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIci0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJncmFwaEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVdrLS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekpLSDl1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKS0hzTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKS0hzZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSHN1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZGlhZ3JhbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpLSG5lLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96SlRSZ08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSHMtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSHRPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKS0h0ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50Ij4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SktIdHUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpLSHFlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0h0LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InR5cGVJbmZvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSHVPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSHVlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekpLSHV1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SktIdS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJVTUFTZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SktIdk8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpLSHFlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0h2ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekpUUmhlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKS0h2dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKS0h2LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpLSHdPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKS0h3ZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SktIcWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSHd1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhLZkRlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96SlRSZ2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSHctLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSHhPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SktIeGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJMZWFmRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekpLSHh1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pKQVdwZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKS0h4LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlRleHRFbGVtZW50Ij4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SktIeU8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpLSHhlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0h5ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InRleHQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SktIeXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SktIeS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96SktIek8tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKS0h6ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkltYWdlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SktIenUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpLSHhlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0h6LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InVyaSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUFp1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKS0gwTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKS0gwZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pKS0gwdS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQWnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0gwLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im1pbWVUeXBlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSDFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSDFlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekpLSDF1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SktIMS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJHcmFwaGljUHJpbWl0aXZlIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SktIMk8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpLSHhlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpLSDJlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUG9seWxpbmUiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKS0gydS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SktIMS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSDItLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY2xvc2VkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3pKS0gzTy1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5PgotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSDNlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0id2F5cG9pbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXa08tc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3pKVFJpZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SktIM3Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SktIMy0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKS0g0Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkVsbGlwc2UiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKS0g0ZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SktIMS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSDR1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY2VudGVyIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXa08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSDQtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmFkaXVzWCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGNPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0g1Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJhZGl1c1kiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBjTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktINWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyb3RhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGNPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0g1dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN0YXJ0QW5nbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBjTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktINS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJlbmRBbmdsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGNPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekpLSDZPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekpBV2x1LXNFZHVINTlLU0hWOHZnQSBfekpBV3FlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekpLSDZlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekpBV3R1LXNFZHVINTlLU0hWOHZnQSBfekpBV3JPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekpLSDZ1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekpBV3ItLXNFZHVINTlLU0hWOHZnQSBfekpLSDYtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekpLSDYtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2RpYWdyYW1FbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXcGUtc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfekpLSDZ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKS0g3Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKS0g3ZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekpLSDd1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekpBV21lLXNFZHVINTlLU0hWOHZnQSBfekpLSGxPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekpLSDctLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekpBV25PLXNFZHVINTlLU0hWOHZnQSBfekpBV3hlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekpLSDhPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekpBV3lPLXNFZHVINTlLU0hWOHZnQSBfekpBV3plLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekpLSDhlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekpBVzBPLXNFZHVINTlLU0hWOHZnQSBfekpLSDh1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekpLSDh1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2dyYXBoRWRnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV3ktLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pKS0g4ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SktIOC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SktIOU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pKS0g5ZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pKS0hvLS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0hsLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pKS0g5dS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pKQVduLS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0hyLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pKVFJnTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pKS0hwdS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0hzdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pKVFJnZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pKS0h3dS1zRWR1SDU5S1NIVjh2Z0EgX3pKVFJndS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pKVFJndS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9jb3JlU2VtYW50aWNNb2RlbEJyaWRnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpLSHdPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pKVFJnZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SlRSZy0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SlRSaE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekpUUmhlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekpLSHZlLXNFZHVINTlLU0hWOHZnQSBfekpUUmh1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekpUUmh1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3VNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKS0h1LS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96SlRSaGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpUUmgtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpUUmlPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pKVFJpZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pKS0gzZS1zRWR1SDU5S1NIVjh2Z0EgX3pKVFJpdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pKVFJpdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9wb2x5bGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpLSDJlLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pKVFJpZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SlRSaS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SlRSak8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pEcFZpdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlByb2Nlc3NQYWNrYWdlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekRwVmktLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pEcFZpdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Qcm9jZXNzIFBhY2thZ2UgaXMgYSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4KLUEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96RHBWak8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTRlQU1lLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pEcFZqZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InByb2Nlc3NFbGVtZW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WE9PLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il96RHBWcWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekRwVmp1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekRwVmotLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96TGl0TU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJkaWFncmFtcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpLSG5lLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il96TGl0TS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekxpdE1lLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekxpdE11LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pMaXRNLS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pMaXRNTy1zRWR1SDU5S1NIVjh2Z0EgX3pMaXROZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96TGl0Tk8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekxpdE0tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gaXMgdGhlIG9ubHkgbWVtYmVyIG9mIHRoZSB1bWFkaWFncmFtcyBwYWNrYWdlLiAgSXQgZGVmaW5lcyB0aGF0IERpYWdyYW1zIGNhbiBiZSBwYWNrYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pMaXROZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9wcm9jZXNzUGFja2FnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekRwVml1LXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pMaXRNLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96TGl0TnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96TGl0Ti0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pHTEZBTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ik1ldGhvZFBsdWdpbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHTEZBZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96R0xGQU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBNZXRob2QgUGx1Z2luIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLgotTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuCi1TcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekdMRkEtLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4VVBWTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96TjdTME8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfek43UzB1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pHTEZCTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3pHTEZCZS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5PgotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekdMRkJ1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibWV0aG9kUGFja2FnZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k0ZUFNZS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfekdVMkFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pHTEZCLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pHTEZDTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pHTEZDZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImJhc2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96R0xGQU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pHVTJCZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96R0xGQ3Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96R0xGQy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekRwVmNPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pEcFZjZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96RHBWY08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBQcm9jZXNzIENvbXBvbmVudCBpcyBhIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuCi1VTUEgc3VwcG9ydHMgcmVwbGFjZWFibGUgYW5kIHJldXNhYmxlIFByb2Nlc3MgQ29tcG9uZW50cyByZWFsaXppbmcgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gQ2VydGFpbiBzaXR1YXRpb25zIGluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCBtaWdodCByZXF1aXJlIHRoYXQgY29uY3JldGUgcmVhbGl6YXRpb25zIG9mIHBhcnRzIG9mIHRoZSBwcm9jZXNzIHJlbWFpbiB1bmRlY2lkZWQgb3Igd2lsbCBiZSBkZWNpZGVkIGJ5IHRoZSBleGVjdXRpbmcgdGVhbSBpdHNlbGYgKGUuZy4gaW4gb3V0c291cmNpbmcgc2l0dWF0aW9ucykuICBVTUEgcHJvdmlkZXMgYSB1bmlxdWUgY29tcG9uZW50IGNvbmNlcHQgZGVmaW5pbmcgaW50ZXJmYWNlcyBmb3Igd29yayBwcm9kdWN0IGlucHV0IGFuZCBvdXRwdXQsIGFsbG93aW5nIHRyZWF0aW5nIHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBvZiB0aGUgd29yayB0aGF0IHByb2R1Y2VzIHRoZSBvdXRwdXRzIGFzIGEgJnF1b3Q7YmxhY2sgYm94JnF1b3Q7LiAgQXQgYW55IHBvaW50IGR1cmluZyBhIHByb2plY3QgdGhlIGNvbXBvbmVudCAmcXVvdDtyZWFsaXphdGlvbiZxdW90OyBkZXRhaWxpbmcgdGhlIHdvcmsgY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGNvbXBvbmVudCBhcHByb2FjaCBhbHNvIGFsbG93cyB0aGF0IGRpZmZlcmVudCBzdHlsZXMgb3IgdGVjaG5pcXVlcyBvZiBkb2luZyB3b3JrIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgY29kZSBvdXRwdXQgb2YgYSBjb21wb25lbnQgY291bGQgYmUgcHJvZHVjZWQgd2l0aCBhIG1vZGVsLWRyaXZlbiBkZXZlbG9wbWVudCBvciBhIGNvZGUtY2VudHJpYyB0ZWNobmlxdWUuICBUaGUgY29tcG9uZW50IGNvbmNlcHQgZW5jYXBzdWxhdGVzIHRoZSBhY3R1YWwgd29yayBhbmQgbGV0cyB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRlY2huaXF1ZSBhbmQgZmlsbCB0aGUgY29tcG9uZW50J3MgcmVhbGl6YXRpb24gd2l0aCB0aGVpciBjaG9pY2Ugb2YgQWN0aXZpdGllcyB0aGF0IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dHMuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96RHBWY3Utc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekRwVml1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfekRwVmMtLXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il96RHBWZE8tc0VkdUg1OUtTSFY4dmdBIiBrZXk9ImV4dGVuZCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZ2VuZXJhbGl6YXRpb24+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfek43UzBlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pON1MwdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96RHBWZGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJpbnRlcmZhY2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96RHBWZ2Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pEcFZrTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96RHBWZHUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96RHBWZC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96RHBWZU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcm9jZXNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95LTRLT2Utc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3pEcFZwTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96RHBWZWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96RHBWZXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pON1MwdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ik1ldGhvZFVuaXQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96TjdTMC0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfek43UzB1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgTWV0aG9kIFVuaXQgaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIE1ldGhvZCBMaWJyYXJ5IGFzIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pON1MxTy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3UWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfek43UzFlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYXV0aG9ycyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfek43UzF1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pON1MxZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96TjdTMS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96TjdTMk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96TjdTMmUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96TjdTMnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjaGFuZ2VEYXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQWk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96TjdTMi0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfek43UzJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96TjdTM08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96TjdTM2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pON1MzdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96TjdTMy0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfek43UzN1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pON1M0Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pON1M0ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pON1M0dS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pON1M0LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InZlcnNpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pON1M1Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96TjdTNC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5FdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96TjdTNWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96TjdTNXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96TjdTNS0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96TjdTNk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjb3B5cmlnaHRTdGF0ZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS04LS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfek9FY3dlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pON1M2ZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pON1M2dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eHc3Vi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3V08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N1YtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkNvbnRlbnQgRGVzY3JpcHRpb24gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQ29udGVudCBFbGVtZW50LiAgSXQgZGVmaW5lcyBzdGFuZGFyZCBhdHRyaWJ1dGVzIGFwcGxpY2FibGUgZm9yIGFsbCBDb250ZW50IEVsZW1lbnQgdHlwZXMuICBTcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgc3ViLXR5cGVzIGNhbiBkZWZpbmUgdGhlaXIgb3duIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gc3ViLXR5cGVzLiA8L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96T0Vjd08tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfek43UzB1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l4dzdXdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N1ctLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdXdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlRoaXMgYXR0cmlidXRlIHN0b3JlIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXh3N1hPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXh3N1hlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeXh3N1h1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXh3N1gtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic2VjdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdZdS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeXh3N2otLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l4dzdZTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l4dzdZZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNRE1PLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZXh0ZXJuYWxJZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNRE1lLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTURNTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhcnRpZmFjdC4gVXNlZCBsaWtlIGEgc3lub255bS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1ETXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1ETS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1ETk8tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1ETmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJrZXlDb25zaWRlcmF0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNRE51LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTUROZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PktleSBDb25zaWRlcmF0aW9ucyBwcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1ETi0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1ET08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1ET2Utc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pPRWN3ZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pON1M2Ty1zRWR1SDU5S1NIVjh2Z0EgX3pPRWN3LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96T0Vjd3Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfek9FY3dlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgTWV0aG9kIFVuaXQgY2FuIGhhdmUgZXhhY3RseSBvbmUgQ29weXJpZ2h0IFN0YXRlbWVudCBzZWN1cmluZyB0aGUgaW50ZWxsZWN0dWFsIGNhcGl0YWwgaXQgcmVwcmVzZW50cy4gIEl0IHdpbGwgYmUgcHVibGlzaGVkIHdpdGggdGhlIHJlc3BlY3RpdmUgY29uY3JldGUgRWxlbWVudC4gIE5vdGUsIHRoYXQgQ29weXJpZ2h0IFN0YXRlbWVudHMgZm9yIE1ldGhvZCBMaWJyYXJpZXMgYW5kIE1ldGhvZCBQbHVnaW5zIGRlZmluZSB0aGUgZGVmYXVsdCBzdGF0ZW1lbnQgZm9yIGl0cyBjb250YWluZWQgZWxlbWVudHMsIHdoaWNoIGNhbiBiZSAnb3ZlcndyaXR0ZW4nIHdpdGggcmV2aXNlZCBzdGF0ZW1lbnRzIGZvciBldmVyeSBDb250ZW50IERlc2NyaXB0aW9uIG9yIFByb2Nlc3MgQ29tcG9uZW50LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pPRWN3LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9tZXRob2RVbml0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96TjdTMHUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pPRWN3ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96T0VjeE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96T0VjeGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfelFkQ1lPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pRZENZZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96UWRDWU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBNZXRob2QgQ29uZmlndXJhdGlvbiBpcyBhIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96UWRDWXUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfek43UzB1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pRZENZLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im1ldGhvZFBsdWdpblNlbGVjdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekdMRkFPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96UW16YnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFkQ1pPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFkQ1plLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfelFkQ1p1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibWV0aG9kUGFja2FnZVNlbGVjdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTRlQU1lLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96UW16Yy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFkQ1otLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFkQ2FPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfelFkQ2FlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJvY2Vzc1ZpZXdzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rbnUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pRbXpqZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UWRDYXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UWRDYS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pRZENiTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImRlZmF1bHRWaWV3IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rbnUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pRbXprZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UWRDYmUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UWRDYnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96UWRDYi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJiYXNlQ29uZmlndXJhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pRZENZTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfelFtemxlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRZENjTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRZENjZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfelFkQ2N1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3VidHJhY3RlZENhdGVnb3J5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rbnUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pRbXptdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UWRDYy0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UWRDZE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pRZENkZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFkZGVkQ2F0ZWdvcnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tudS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfelFtem51LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRZENkdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRZENkLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96UWRDZU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQcm9jZXNzRmFtaWx5Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfelFkQ2VlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pRZENlTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIERlbGl2ZXJ5IE1vZGVsIEZhbWlseSBpcyBhIGNvbnZlbmllbnQgZ3JvdXBpbmcgb2YgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIG9mIGludGVyZXN0IHRvIHNvbWUgc3BlY2lmaWMgdXNlciBjb21tdW5pdHkuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfelFkQ2V1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pRZENZTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96UWRDZS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJkZWxpdmVyeVByb2Nlc3NlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeS00S01PLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96UW16ZU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFkQ2ZPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFkQ2ZlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3ktNEtPZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlByb2Nlc3MiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95LTRLT3Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeS00S09lLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUHJvY2VzcyBpcyBhIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuCi1Db3JlIE1ldGhvZCBDb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcgaG93IHZlcnkgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiAgUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gIFRodXMsIGEgcHJvY2VzcyBpcyBhIHNldCBvZiBwYXJ0aWFsbHkgb3JkZXJlZCB3b3JrIGRlc2NyaXB0aW9ucyBpbnRlbmRlZCB0byByZWFjaCBhIGhpZ2hlciBkZXZlbG9wbWVudCBnb2FsLCBzdWNoIGFzIHRoZSByZWxlYXNlIG9mIGEgc3BlY2lmaWMgc29mdHdhcmUgc3lzdGVtLiAgQSBwcm9jZXNzIGFuZCB0aGUgcHJvY2VzcyBtZXRhLW1vZGVsIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBmb2N1c2VzIG9uIHRoZSBsaWZlY3ljbGUgYW5kIHRoZSBzZXF1ZW5jaW5nIG9mIHdvcmsgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUbyBhY2hpZXZlIHRoaXMgaXQgdXNlcyB0aGUgRGVzY3JpcHRvciBjb25jZXB0IHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGFuZCBhbGxvd2luZyBkZWZpbmluZyB0aW1lLXNwZWNpZmljIGN1c3RvbWl6YXRpb25zIG9mIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgKGUuZy4gZGVmaW5pbmcgYSBmb2N1cyBvbiBkaWZmZXJlbnQgc3RlcHMgb2YgdGhlIHNhbWUgVGFzayBhbmQgcHJvdmlkaW5nIGlucHV0IFdvcmsgUHJvZHVjdHMgaW4gZGlmZmVyZW50IHN0YXRlcyB3aXRoaW4gdGhlIGRpZmZlcmVudCBQaGFzZXMgb2YgYSBwcm9jZXNzIGxpZmVjeWNsZSBpbiB3aGljaCB0aGUgc2FtZSBUYXNrIGlzIHBlcmZvcm1lZCkuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfelFkQ2Z1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3ktNEtPZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Qcm9jZXNzIGluIHRoZSBwYWNrYWdlIExpYnJhcnkgQ29uZmlndXJhdGlvbiBleHRlbmRzIHRoZSBjbGFzcyBQcm9jZXNzIHdpdGggYXNzb2NpYXRpb24gcmVsYXRpbmcgYSBQcm9jZXNzIHRvIG9uZSBkZWZhdWx0IGFuZCBtYW55IG9wdGlvbmFsIHZhbGlkIENvbmZpZ3VyYXRpb25zLgotVGhlc2UgY29uZmlndXJhdGlvbnMgZGVzY3JpYmUgdmFsaWQgY29udGV4dHMgZm9yIHRoZSBQcm9jZXNzIHdpdGhpbiBhIE1ldGhvZCBMaWJyYXJ5IGluZGljYXRpbmcgdW5kZXIgd2hpY2ggQ29uZmlndXJhdGlvbnMgYSBQcm9jZXNzIGlzIHdlbGwgZGVmaW5lZC4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3ktNEtPLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeS00S1BPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaW5jbHVkZXNQYXR0ZXJucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeV9CVUotLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95X0JVS3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeS00S1BlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeS00S1B1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96UWRDZi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJkZWZhdWx0Q29udGV4dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfelFkQ1lPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96UW16Zy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFkQ2dPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFkQ2dlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfelFtellPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idmFsaWRDb250ZXh0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96UWRDWU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pRbXppTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UW16WWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UW16WXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfelFtelktLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iTWV0aG9kTGlicmFyeSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pRbXpaTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96UW16WS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfelFtelplLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pON1MwdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96UW16Wi0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXhVUFZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pRbXphTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im1ldGhvZFBsdWdpbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pHTEZBTy1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfelFtemZlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRbXphZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRbXphdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfelFtemEtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96UWRDWU8tc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3pRbXpnTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UW16Yk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UW16YmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfelFtemJ1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfelFtemNPLXNFZHVINTlLU0hWOHZnQSBfelFkQ1ktLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pRbXpiLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96UW16YnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBzZWxlY3Rpb24gb2YgcGFja2FnZXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfelFtemNPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il96UWRDWU8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfelFtemJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRbXpjZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRbXpjdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96UW16Yy0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96UW16ZGUtc0VkdUg1OUtTSFY4dmdBIF96UWRDWnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfelFtemRPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pRbXpjLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIHNlbGVjdGlvbiBvZiBwYWNrYWdlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgY29uZmlndXJhdGlvbi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96UW16ZGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3pRZENZTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96UW16Yy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFtemR1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFtemQtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pRbXplTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pRbXpldS1zRWR1SDU5S1NIVjh2Z0EgX3pRZENlLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96UW16ZWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfelFtemVPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkRlbGl2ZXJ5IFByb2Nlc3MgY2FuIGJlIG9yZ2FuaXplZCBpbiBtYW55IFByb2Nlc3MgRmFtaWxpZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfelFtemV1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJvY2Vzc0ZhbWlsaWVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96UWRDZU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pRbXplTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UW16ZS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UW16Zk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfelFtemZlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfelFtemYtLXNFZHVINTlLU0hWOHZnQSBfelFtemFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pRbXpmdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96UW16ZmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBNZXRob2QgTGlicmFyeSBwaHlzaWNhbGx5IGNvbXByaXNlcyBvZiBNZXRob2QgUGx1Z2lucy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96UW16Zi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfbWV0aG9kTGlicmFyeSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3pRbXpZLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96UW16ZmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96UW16Z08tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96UW16YS0tc0VkdUg1OUtTSFY4dmdBIF96UW16Z3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfelFtemdlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pRbXpnTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIE1ldGhvZCBMaWJyYXJ5IHN0b3JlcyBhIHNldCBvZiBwcmVkZWZpbmVkIE1ldGhvZCBDb25maWd1cmF0aW9ucyB0aGF0IGFyZSByZWd1bGFybHkgdXNlZCBieSB0aGUgbGlicmFyeSBhdXRob3JzIChlLmcuIHRoZSBjb25maWd1cmF0aW9ucyB0aGF0IHRoZXkgc2hpcCB0byB0aGVpciB1c2VycykuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfelFtemd1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX21ldGhvZExpYnJhcnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pRbXpZLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96UW16Z08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96UW16Zy0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96UW16aGUtc0VkdUg1OUtTSFY4dmdBIF96UWRDZi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfelFtemhPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pRbXpnLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFByb2Nlc3MgaGFzIGV4YWN0bHkgb24gZGVmYXVsdCBjb25maWd1cmF0aW9uLiAgVGhpcyBpcyBpbiBtb3N0IGNhc2VzIHRoZSBjb25maWd1cmF0aW9uIGluIHdoaWNoIHRoZSBwcm9jZXNzIGhhcyBiZWVuIGNyZWF0ZWQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfelFtemhlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3Byb2Nlc3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3ktNEtPZS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96UW16Zy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFtemh1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFtemgtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pRbXppTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pRbXppdS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpZTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96UW16aWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfelFtemlPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUHJvY2VzcyBjYW4gaGF2ZSBtYW55IGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbnMgdGhhdCBoYXZlIGJlZW4gdmVyaWZpZWQgdG8gYWxzbyBwcm9kdWNlIHZhbGlkIHJlc3VsdHMuICBQcm9jZXNzIEVsZW1lbnRzIChlLmcuIERlc2NyaXB0b3JzKSB0aGF0IHJlZmVyIHRvIGNvbnRlbnQgcGFja2FnZXMgdGhhdCBhcmUgZGVmaW5lZCBvdXRzaWRlIHRoZSBzY29wZSBvZiBzdWNoIGEgY29uZmlndXJhdGlvbiB3b3VsZCBub3QgYmUgc2hvd24gaW4gdGhlIHByb2Nlc3Mgd2hlbiBwdWJsaXNoZWQgb3IgdXNlZCB1bmRlciBzdWNoIGEgY29uZmlndXJhdGlvbi4gIFRoaXMgYWxsb3dzIHRvIGVhc2lseSByZW1vdmUgY29udGVudCBmcm9tIGEgcHJvY2VzcyBieSByZW1vdmluZyBjb250ZW50IHBhY2thZ2VzIHRvIGZyb20gdGhlIHJlbGF0ZWQgY29uZmlndXJhdGlvbi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96UW16aXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfcHJvY2VzcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeS00S09lLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pRbXppTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UW16aS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UW16ak8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfelFtemplLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfelFtemp1LXNFZHVINTlLU0hWOHZnQSBfelFkQ2FlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfelFtemp1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pRZENZTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96UW16amUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFtemotLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFtemtPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pRbXprZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pRZENiTy1zRWR1SDU5S1NIVjh2Z0EgX3pRbXprdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pRbXprdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96UWRDWU8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfelFtemtlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRbXprLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRbXpsTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96UW16bGUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96UWRDYi0tc0VkdUg1OUtTSFY4dmdBIF96UW16bC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfelFtemx1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pRbXpsZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGUgZGVmaW5pdGlvbiBvZiBhIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGJhc2VkIG9uIHRoZSBkZWZpbml0aW9ucyBvZiBvdGhlciBjb25maWd1cmF0aW9ucy4gIEZvciBleGFtcGxlLCBhIGNvbmZpZ3VyYXRpb24gQSBjb3VsZCBiZSBkZWZpbmVkIGFzIHRoZSBzdXBlcnNldCBvZiBjb25maWd1cmF0aW9ucyBCLCBDLCBhbmQgRCBwbHVzIGFkZCBtb3JlIHNlbGVjdGVkIFBsdWdpbnMgYW5kIFBhY2thZ2VzLiAgSW4gc3VjaCBhIGNhc2UgQSB3b3VsZCBsaXN0IEIsIEMsIGFuZCBEIGFzIGl0cyBiYXNlQ29uZmlndXJhdGlvbnMuICBJZiBhbnkgb2YgdGhlc2UgYmFzZSBjb25maWd1cmF0aW9ucyBjaGFuZ2VzIGFsbCB1cGRhdGVzIHdvdWxkIGJlIGF1dG9tYXRpY2FsbHkgdmFsaWQgZm9yIEEgYXMgd2VsbCByZWR1Y2luZyBtYWludGFpbmFiaWxpdHkgb3ZlcmhlYWQgZm9yIG92ZXJsYXBwaW5nL2RlcGVuZGVudCBjb25maWd1cmF0aW9ucy4gPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfelFtemwtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pRZENZTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96UW16bGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFtem1PLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFtem1lLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pRbXptdS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pRZENjdS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXptLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pRbXptLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96UWRDWU8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfelFtem11LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRbXpuTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRbXpuZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96UW16bnUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96UWRDZGUtc0VkdUg1OUtTSFY4dmdBIF96UW16bi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96UW16bi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfelFkQ1lPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pRbXpudS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTppZD0iX0o3dEcxZXlDRWR1NS12VmpsZlZzZlEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9KN3RHMXV5Q0VkdTUtdlZqbGZWc2ZRIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICA8cmVmZXJlbmNlcyB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIGhyZWY9InBhdGhtYXA6Ly9VTUxfUFJPRklMRVMvU3RhbmRhcmQucHJvZmlsZS51bWwjX3l6VTU4WWluRWRxdHZibmZCMkxfNXciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGFwcGxpZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUxfUFJPRklMRVMvU3RhbmRhcmQucHJvZmlsZS51bWwjXzAiLz4KLSAgICA8L3Byb2ZpbGVBcHBsaWNhdGlvbj4KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTppZD0iX0o3dEcxLXlDRWR1NS12VmpsZlZzZlEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9KN3RHMk95Q0VkdTUtdlZqbGZWc2ZRIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICA8cmVmZXJlbmNlcyB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZWZhdWx0LmVweCNfSU44azhNbUJFZHFCY04xUjZFdldVdz9EZWZhdWx0L0RlZmF1bHQ/Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxhcHBsaWVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVmYXVsdC5lcHgjX2FfUzN3TldMRWRpeTRJcVA4d2hqRkE/RGVmYXVsdD8iLz4KLSAgICA8L3Byb2ZpbGVBcHBsaWNhdGlvbj4KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTppZD0iX0o3dEcyZXlDRWR1NS12VmpsZlZzZlEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9KN3RHMnV5Q0VkdTUtdlZqbGZWc2ZRIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICA8cmVmZXJlbmNlcyB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZXBsb3ltZW50LmVweCNfSXJkQVVNbUJFZHFCY04xUjZFdldVdz9EZXBsb3ltZW50L0RlcGxveW1lbnQ/Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxhcHBsaWVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVwbG95bWVudC5lcHgjX3ZqYnV3T3ZIRWRpRFg1YmppMGlWU0E/RGVwbG95bWVudD8iLz4KLSAgICA8L3Byb2ZpbGVBcHBsaWNhdGlvbj4KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTppZD0iX1RfY2NvT3lDRWR1NS12VmpsZlZzZlEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9UX2Njb2V5Q0VkdTUtdlZqbGZWc2ZRIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICA8cmVmZXJlbmNlcyB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIGhyZWY9InBhdGhtYXA6Ly9VTUxfUFJPRklMRVMvRWNvcmUucHJvZmlsZS51bWwjX3Z5LUhVWWluRWRxdHZibmZCMkxfNXciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGFwcGxpZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUxfUFJPRklMRVMvRWNvcmUucHJvZmlsZS51bWwjXzAiLz4KLSAgICA8L3Byb2ZpbGVBcHBsaWNhdGlvbj4KLSAgPC91bWw6TW9kZWw+Ci0gIDxFY29yZTpFUGFja2FnZSB4bWk6aWQ9Il9VOUl6OE95Q0VkdTUtdlZqbGZWc2ZRIiBiYXNlX1BhY2thZ2U9Il9KN3RHME95Q0VkdTUtdlZqbGZWc2ZRIiBwYWNrYWdlTmFtZT0idW1hIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuZXBmLnVtYSIgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5lcGYiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eFVQVy0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eEtmQy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXhVUFhPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXhLZkR1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4VVBYZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4S2ZFTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfeXhVUFh1LXNFZHVINTlLU0hWOHZnQSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfeXhLZkV1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4VVBYLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4S2ZGLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eFVQWU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eFVQVWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXhVUFllLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXhVUFZlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4VVBZdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4VVBXZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eFVQY2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eFVQWS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfeXhVUGN1LXNFZHVINTlLU0hWOHZnQSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5EYXRlIiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il95eFVQWk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXhVUGMtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXhVUFplLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX3l4VVBkTy1zRWR1SDU5S1NIVjh2Z0EiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm5ldC5VUkkiIGJhc2VfUHJpbWl0aXZlVHlwZT0iX3l4VVBadS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eFVQZGUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eFVQWi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfeXhVUGR1LXNFZHVINTlLU0hWOHZnQSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciIGJhc2VfUHJpbWl0aXZlVHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eFVQZC0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eFVQYWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfeXhVUGVPLXNFZHVINTlLU0hWOHZnQSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5TZXQiIGJhc2VfUHJpbWl0aXZlVHlwZT0iX3l4VVBhdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il95eFVQZWUtc0VkdUg1OUtTSFY4dmdBIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkxpc3QiIGJhc2VfUHJpbWl0aXZlVHlwZT0iX3l4VVBhLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il95eGRaUU8tc0VkdUg1OUtTSFY4dmdBIiBpbnN0YW5jZUNsYXNzTmFtZT0iaW50IiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il95eFVQYk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXhkWlFlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXhVUGJlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX3l4ZFpRdS1zRWR1SDU5S1NIVjh2Z0EiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuQm9vbGVhbiIgYmFzZV9QcmltaXRpdmVUeXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4ZFpRLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4VVBiLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il95eGRaUk8tc0VkdUg1OUtTSFY4dmdBIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLkRvdWJsZSIgYmFzZV9QcmltaXRpdmVUeXBlPSJfeXhVUGNPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZNdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdRTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGTS0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3UXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3l4NkZOTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iX3l4dzdSTy1zRWR1SDU5S1NIVjh2Z0EiIGlzSUQ9InRydWUiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGTmUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3UmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3l4NkZOdS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iX3l4dzdTZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGTi0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3U3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXg2Rk9PLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXh3N1ZlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZPZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdXTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfeXg2Rk91LXNFZHVINTlLU0hWOHZnQSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfeXh3N1d1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZPLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdXLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGUE8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3WS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3l4NkZQZS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iX3l4dzdaZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGUHUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3WnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3l4NkZQLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iX3l4dzdhdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGUU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3YS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXg2RlFlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXh3N2MtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il95eDZGUXUtc0VkdUg1OUtTSFY4dmdBIiBpc1Vuc2V0dGFibGU9InRydWUiIGJhc2VfUHJvcGVydHk9Il95eHc3ZGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXg2RlEtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXh3N2R1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZSTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdlLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfeXg2RlJlLXNFZHVINTlLU0hWOHZnQSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfeXh3N2Z1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZSdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdmLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfeXg2RlItLXNFZHVINTlLU0hWOHZnQSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfeXh3N2lPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZTTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdqZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGU2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3a08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXg2RlN1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXh3N2xlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZTLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdtdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPS3Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eXpkRU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T0stLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXl6ZEV1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RVJlZmVyZW5jZSB4bWk6aWQ9Il95eTlPTE8tc0VkdUg1OUtTSFY4dmdBIiBpc1RyYW5zaWVudD0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iX3l5emRGTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPTGUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eXpkRy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFUmVmZXJlbmNlIHhtaTppZD0iX3l5OU9MdS1zRWR1SDU5S1NIVjh2Z0EiIGlzVHJhbnNpZW50PSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfeXl6ZExlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9MLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5emRNZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPTU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eXpkTk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T01lLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXl6ZE4tLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9NdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5emRRTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPTS0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eXpkUnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T05PLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXl6ZFNlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9OZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5emRUZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPTnUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eXpkVnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T04tLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXl6ZFctLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9PTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5emRZTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPT2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eXpkWmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFUmVmZXJlbmNlIHhtaTppZD0iX3l5OU9PdS1zRWR1SDU5S1NIVjh2Z0EiIGlzVHJhbnNpZW50PSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfeXl6ZFp1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9PLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5emRhdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPUE8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eTlPRWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T1BlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXk5T0Z1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9QdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5OU9HTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPUC0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eTlPSGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T1FPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXk5T0l1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9RZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5OU9KZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPUXUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eTlPS08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKZy11LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXoxLTRPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmctLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6MS00dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpnX08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95ejEtNWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKZ19lLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXoxLTZPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmdfdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6MS02LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpnXy0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95ejEtN3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaEFPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXoxLThlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhBZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6MS05Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoQXUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95ejEtOS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaEEtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXoxLS11LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhCTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6MS1fZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoQmUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95ejFfQU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaEJ1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXoxX0NPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhCLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6MV9GZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoQ08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95el92NXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaENlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXpfdl9lLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhDdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6X3dBTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoQy0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95el93QS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaERPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXpfd0NPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhEZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6X3dEZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoRHUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95el93RXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaEQtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXpfd0YtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhFTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6X3dITy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoRWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95el93SWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaEV1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXpfd0p1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhFLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6X3dLLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoRk8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MEpnNGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaEZlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTBKZzV1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnpzTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxQ1JzTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6c2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1Dcy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenN1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNQ3VPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnpzLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTUN4LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6dE8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1Dek8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenRlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNQzAtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp0dS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTUMyTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6dC0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1DM2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenVPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNQzVPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp1ZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTUM2ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6dXUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1DOE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenUtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNQzllLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp2Ty1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTUMtdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6dmUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1EQWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenZ1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNRENPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp2LS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTUREZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6d08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1ERXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWendlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNREYtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp3dS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTURITy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6dy0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1ESWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenhPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNREplLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp4ZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTURKLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6eHUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1ETE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWengtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNRE1lLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp5Ty1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTUROdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWZ08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MkZha08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmdlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPa2dlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZndS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2tpdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWZy0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9ra08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmhPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPa21lLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZoZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2tuLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWaHUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9rb3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmgtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPa3FPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZpTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2tydS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWaWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9rdE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVml1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPa3ZlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZpLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2t3dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWak8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9reC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmplLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPa3l1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZqdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2t6LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWai0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9rMU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmtPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPazJlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZrZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2szdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWa3Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9rNC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmstLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPazZPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k0ZUFVLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k0ZUFNTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95NGVBVk8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NGVBTXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTRlQVZlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTRlQU51LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k0ZUFWdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k0ZUFQLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95NGVBVi0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NGVBUmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTRlQVdPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTRlQVN1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k0ZUFXZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k0ZUFULS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0b08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N21Nc2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNG9lLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTdtTXVPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRvdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3bU11LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0by0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N21NdnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHBPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTdtTXdlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRwZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dldvZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0cHUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXby0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHAtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2V3BlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRxTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dldwLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0cWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXcWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHF1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2V3EtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRxLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dldydS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0ck8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXdE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHJlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2V3QtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRydS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dld1ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0ci0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXdS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHNPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2V3ZlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRzZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dld3ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0c3Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXeHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHMtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2V3llLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR0Ty1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dld6Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0dGUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXMi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHR1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2VzRPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR0LS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dlc3Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0dU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZYQy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHVlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2WER1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR1dS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dlhFLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0dS0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZYSk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHZPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2WEt1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR2ZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dlhMZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0dnUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZYTU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHYtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2WE0tLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR3Ty1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dlhPZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0d2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZYUE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHd1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SG9lLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR3LS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUhvLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0eE8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVIcU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHhlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SHJlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR4dS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUhzdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0eC0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVIdC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHlPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SHZPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR5ZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUh3ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0eXUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVIeHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHktLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SHlPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR6Ty1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUh6ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0emUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVIMHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHp1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SDEtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR6LS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUgzTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0ME8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVINGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNDBlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SDV1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzQwdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUg3LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0MC0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVIOU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNDFPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SC1lLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZJTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3ktNEtNZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGSWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95LTRLT3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRkl1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeS00S1FPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZJLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3ktNEtSdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGSk8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95LTRLU08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRkplLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeV9CVUlPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZKdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3lfQlVLTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGSi0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95X0JVSy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRktPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeV9CVU1PLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZLZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3lfQlVOZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGS3Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95X0JVT08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRkstLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeV9CVVBlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZMTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3lfQlVRdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGTGUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95X0JVUi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRkx1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeV9CVVNlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZMLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3lfQlVVdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGTU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95X0JVVi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRk1lLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeV9CVVhPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZNdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3lfQlVZZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGTS0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95X0JVWnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRk5PLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeV9CVWEtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pCWjZFTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pCWjV3LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96Qlo2RWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96Qlo1eXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekJaNkV1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekJaNXotLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pCWjZFLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pCWjUxTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96Qlo2Rk8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96Qlo1Mi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekJaNkZlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekJaNTRPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pCWjZGdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pCWjU1ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96Qlo2Ri0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96Qlo1NnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekJaNkdPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekJaNTctLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pCWjZHZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pCWjU5Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96Qlo2R3Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96Qlo1LS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekJaNkctLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekJaNkFPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pCWjZITy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pCWjZCLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96Qlo2SGUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96Qlo2RE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekRwVnJPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekRwVmNlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pEcFZyZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pEcFZmTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96RHBWcnUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96RHBWZ3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekRwVnItLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekRwVmktLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pEcFZzTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pEcFZrZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96RHBWc2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96RHBWbHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekRwVnN1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekRwVm0tLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pEcFZzLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pEcFZvTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96RHBWdE8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96RHBWcGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekRwVnRlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekRwVnF1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJGTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHTEZBZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UyRmUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R0xGRE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMkZ1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdMRkR1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJGLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHTEZFTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UyR08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R0xGRS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMkdlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdMRkdPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJHdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHTEZHdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UyRy0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R0xGSE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMkhPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdMRkh1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJIZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHTEZJTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UySHUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R0xGSmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMkgtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdMRktPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJJTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHTEZMZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UySWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R0xGTXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMkl1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdVMkFlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJJLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHVTJCdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UySk8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R1UyQy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMkplLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdVMkVPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pMaXRPTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pMaXROTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96T0VjeHUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96TjdTMC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfek9FY3gtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfek43UzF1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pPRWN5Ty1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pON1MyLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96T0VjeWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96TjdTMy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfek9FY3l1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfek43UzVPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pPRWN5LS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pPRWN3dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96UW16b08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96UWRDWWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfelFtem9lLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfelFkQ2VlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pRbXpvdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pRZENmdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96UW16by0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96UW16Wk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfelFtenBPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfelFtemItLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pRbXpwZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pRbXpkTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96UW16cHUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96UW16ZWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfelFtenAtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfelFtemZ1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pRbXpxTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pRbXpnZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96UW16cWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96UW16aE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfelFtenF1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfelFtemllLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pRbXpxLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pRbXpsdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvdW1hLmdlbm1vZGVsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNC91bWEuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkY2Q5NjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNC91bWEuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMiCi0gICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdG9yL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSJvcmcuZWNsaXBzZS5lcGYudW1hIiB0ZW1wbGF0ZURpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzIgotICAgIHJ1bnRpbWVKYXI9InRydWUiIGR5bmFtaWNUZW1wbGF0ZXM9InRydWUiIG1vZGVsTmFtZT0iVW1hIiBlZGl0UGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnVtYS5wcmVzZW50YXRpb24uVW1hRWRpdG9yUGx1Z2luIiBub25OTFNNYXJrZXJzPSJ0cnVlIgotICAgIHJvb3RFeHRlbmRzSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdCIgcm9vdEV4dGVuZHNDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0IgotICAgIHJvb3RJbXBsZW1lbnRzSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkludGVybmFsRURhdGFPYmplY3QiIHN1cHByZXNzRU1GVHlwZXM9InRydWUiCi0gICAgZmVhdHVyZU1hcFdyYXBwZXJJbnRlcmZhY2U9ImNvbW1vbmouc2RvLlNlcXVlbmNlIiBmZWF0dXJlTWFwV3JhcHBlckludGVybmFsSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnV0aWwuRVNlcXVlbmNlIgotICAgIGZlYXR1cmVNYXBXcmFwcGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8udXRpbC5CYXNpY0VTZXF1ZW5jZSIgY29kZUZvcm1hdHRpbmc9InRydWUiCi0gICAgY29udGFpbm1lbnRQcm94aWVzPSJ0cnVlIj4KLSAgPGZvcmVpZ25Nb2RlbD5DOlxIb21lXHBoVE5HXFROR19kb2NzXE9PQURcQ29udGVudEFyY2hpdGVjdHVyZVxNb2RlbHNcVU1BMDRcVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZS5tZGw8L2ZvcmVpZ25Nb2RlbD4KLSAgPHN0YXRpY1BhY2thZ2VzPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvU0RPPC9zdGF0aWNQYWNrYWdlcz4KLSAgPG1vZGVsUGx1Z2luVmFyaWFibGVzPkVNRl9DT01NT05KX1NETz1vcmcuZWNsaXBzZS5lbWYuY29tbW9uai5zZG88L21vZGVsUGx1Z2luVmFyaWFibGVzPgotICA8bW9kZWxQbHVnaW5WYXJpYWJsZXM+RU1GX0VDT1JFX1NETz1vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvPC9tb2RlbFBsdWdpblZhcmlhYmxlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iVW1hIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuZXBmIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgZWNvcmVQYWNrYWdlPSJ1bWEuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvZmluaXNoVG9TdGFydCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL2ZpbmlzaFRvRmluaXNoIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvc3RhcnRUb1N0YXJ0Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvc3RhcnRUb0ZpbmlzaCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2luaXRpYWwiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2pvaW4iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2ZvcmsiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2p1bmN0aW9uIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC9jaG9pY2UiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2VudHJ5UG9pbnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2V4aXRQb2ludCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvdGVybWluYXRlIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbmEiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2NvbnRyaWJ1dGVzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9leHRlbmRzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9yZXBsYWNlcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbG9jYWxDb250cmlidXRpb24iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2xvY2FsUmVwbGFjZW1lbnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2V4dGVuZHNSZXBsYWNlcyIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9EYXRlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9VcmkiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1N0cmluZyIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU2V0Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9TZXF1ZW5jZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vSW50ZWdlciIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vRmxvYXQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DbGFzc2lmaWVyIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVHlwZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9OYW1lZEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BhY2thZ2VhYmxlRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BhY2thZ2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9OYW1lc3BhY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2d1aWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2JyaWVmRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vd25lZFJ1bGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvbWV0aG9kRWxlbWVudFByb3BlcnR5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9zdXBwcmVzc2VkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vcmRlcmluZ0d1aWRlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnN0cmFpbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnN0cmFpbnQvYm9keSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50UHJvcGVydHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnRQcm9wZXJ0eS92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvc3VwcG9ydGluZ01hdGVyaWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2NvbmNlcHRzQW5kUGFwZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY2hlY2tsaXN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2d1aWRlbGluZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9leGFtcGxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2Fzc2V0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L3Rlcm1EZWZpbml0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3ByZXNlbnRhdGlvbk5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3ByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9zaGFwZWljb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvbm9kZWljb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vbWFpbkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9zZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9leHRlcm5hbElkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL2tleUNvbnNpZGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1NlY3Rpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NlY3Rpb24vc2VjdGlvbk5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3NlY3Rpb25EZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3N1YlNlY3Rpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VjdGlvbi9wcmVkZWNlc3NvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGUvbW9kaWZpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlL3Jlc3BvbnNpYmxlRm9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC9yZXBvcnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QvdGVtcGxhdGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QvdG9vbE1lbnRvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGFzayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9wZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svbWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL291dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL29wdGlvbmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svc3RlcHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3Rvb2xNZW50b3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya0RlZmluaXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbi9wcmVjb25kaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya0RlZmluaXRpb24vcG9zdGNvbmRpdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdGVwIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGFuY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BcnRpZmFjdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FydGlmYWN0L2NvbnRhaW5lckFydGlmYWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FydGlmYWN0L2NvbnRhaW5lZEFydGlmYWN0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVsaXZlcmFibGUvZGVsaXZlcmVkV29ya1Byb2R1Y3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL091dGNvbWUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL2dsb2JhbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvcmV1c2VkUGFja2FnZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9jaGlsZFBhY2thZ2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnRQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudFBhY2thZ2UvY29udGVudEVsZW1lbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vYnJpZWZPdXRsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9yZXByZXNlbnRhdGlvbk9wdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL3JlcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9ub3RhdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL2ltcGFjdE9mTm90SGF2aW5nIi8+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+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uL3Njb3BlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uL3VzYWdlTm90ZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVzY3JpcHRvckRlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmlwdG9yRGVzY3JpcHRpb24vcmVmaW5lZERlc2NyaXB0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbmNlcHQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DaGVja2xpc3QiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9FeGFtcGxlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUmVwb3J0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGVtcGxhdGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Ub29sTWVudG9yIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV2hpdGVwYXBlciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rlcm1EZWZpbml0aW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJhY3RpY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9QcmFjdGljZS9zdWJQcmFjdGljZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9QcmFjdGljZS9jb250ZW50UmVmZXJlbmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ByYWN0aWNlL2FjdGl2aXR5UmVmZXJlbmNlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU3RhdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlL1dvcmtQcm9kdWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlL1JlZ2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlL3N1Ym1hY2hpbmUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVmVydGV4Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVmVydGV4L2NvbnRhaW5lciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ZlcnRleC9vdXRnb2luZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ZlcnRleC9pbmNvbWluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZWdpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9SZWdpb24vVmVydGV4Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JlZ2lvbi9UcmFuc2l0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JlZ2lvbi9TdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9SZWdpb24vU3RhdGVNYWNoaW5lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N0YXRlTWFjaGluZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlTWFjaGluZS9SZWdpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVHJhbnNpdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVHJhbnNpdGlvbi9Xb3JrRGVmaW5pdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UcmFuc2l0aW9uL2NvbnRhaW5lciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RyYW5zaXRpb24vc291cmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVHJhbnNpdGlvbi90YXJnZXQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaXNjaXBsaW5lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaXNjaXBsaW5lL3Rhc2tzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmUvc3ViZGlzY2lwbGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmUvcmVmZXJlbmNlV29ya2Zsb3dzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVTZXQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVTZXQvcm9sZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRG9tYWluIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Eb21haW4vd29ya1Byb2R1Y3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RvbWFpbi9zdWJkb21haW5zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0VHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlL3dvcmtQcm9kdWN0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaXNjaXBsaW5lR3JvdXBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZy9kaXNjaXBsaW5lcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Ub29sIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Ub29sL3Rvb2xNZW50b3JzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVTZXRHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZVNldEdyb3VwaW5nL3JvbGVTZXRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9jYXRlZ29yaXplZEVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkvc3ViQ2F0ZWdvcmllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzcy9lZHVjYXRpb25NYXRlcmlhbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MvY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2VzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy9pbmNsdWRlc1BhdHRlcm5zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy9kZWZhdWx0Q29udGV4dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3MvdmFsaWRDb250ZXh0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NhcGFiaWxpdHlQYXR0ZXJuIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlL2Jhc2VkT25Qcm9jZXNzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9hZG1hcCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQvaW50ZXJmYWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L3Byb2Nlc3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZS9wcm9jZXNzRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UvZGlhZ3JhbXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UvaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9pbnRlcmZhY2VJTyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IvUHJvY2Vzc0NvbXBvbmVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFBsdWdpbi91c2VyQ2hhbmdlYWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4vbWV0aG9kUGFja2FnZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4vYmFzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQvdmFyaWFiaWxpdHlUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlFbGVtZW50L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kVW5pdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9hdXRob3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jaGFuZ2VEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jaGFuZ2VEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvdmVyc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY29weXJpZ2h0U3RhdGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vbWV0aG9kUGx1Z2luU2VsZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9tZXRob2RQYWNrYWdlU2VsZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9wcm9jZXNzVmlld3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL2RlZmF1bHRWaWV3Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9iYXNlQ29uZmlndXJhdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL3N1YnRyYWN0ZWRDYXRlZ29yeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vYWRkZWRDYXRlZ29yeSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzRmFtaWx5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzRmFtaWx5L2RlbGl2ZXJ5UHJvY2Vzc2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZExpYnJhcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L21ldGhvZFBsdWdpbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kTGlicmFyeS9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNS9wcm9wZXJ0aWVzLnR4dCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjUvcHJvcGVydGllcy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYWU4MzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNS9wcm9wZXJ0aWVzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLU1vZGVsCi09PT09PQotTm9uLU5MUyBNYXJrZXJzOgl0cnVlCi1Db250YWlubWVudCBQcm94aWVzOgl0cnVlCi1TdXBwcmVzcyBFTUYgTWV0YWRhdGE6CWZhbHNlCi1Sb290IEV4dGVuZHMgQ2xhc3M6CW9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdAotUm9vdCBFeHRlbmRzIEludGVyZmFjZToJb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JTW9kZWxPYmplY3QKLUNvZGUgRm9ybWF0dGluZzoJdHJ1ZQotRHluYW1pYyBUZW1wbGF0ZXM6CXRydWUKLVRlbXBsYXRlIERpcmVjdG9yeToJL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzCi0KLVBhY2thZ2UgKFVtYSkKLT09PT09PT09PT09PT0KLUJhc2UgUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNS91bWEuZWNvcmUgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC41L3VtYS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcwYWJlOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC41L3VtYS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDEyNzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0idW1hIgotICAgIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjUvdW1hLmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuZXBmLnVtYSI+Ci0gIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIwNiYjeEQ7JiN4QTswNSYjeEQ7JiN4QTswNCYjeEQ7JiN4QTswMyYjeEQ7JiN4QTswMSYjeEQ7JiN4QTswMiIvPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDbGFzc2lmaWVyIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1R5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBDbGFzc2lmaWVyLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0Fic3RyYWN0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0Jvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlR5cGUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9OYW1lZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5hbWVkRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC4gIERlZmluZWQgdGhhdCBldmVyeSBlbGVtZW50IGhhcyBhIG5hbWUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIG9yZGVyZWQ9ImZhbHNlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTdHJpbmciIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHN0cmluZyBpcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgaW4gc29tZSBzdWl0YWJsZSBjaGFyYWN0ZXIgc2V0IHVzZWQgdG8gZGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbW9kZWwuIENoYXJhY3RlciBzZXRzIG1heSBpbmNsdWRlIG5vbi1Sb21hbiBhbHBoYWJldHMgYW5kIGNoYXJhY3RlcnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkJvb2xlYW4iIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuQm9vbGVhbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBCb29sZWFuIHR5cGUgaXMgdXNlZCBmb3IgbG9naWNhbCBleHByZXNzaW9uLCBjb25zaXN0aW5nIG9mIHRoZSBwcmVkZWZpbmVkIHZhbHVlcyB0cnVlIGFuZCBmYWxzZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVzcGFjZSAjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOYW1lc3BhY2UiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZXNwYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEYXRlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkRhdGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRhdGEgdHlwZSB1c2VkIGZvciBhdHRyaWJ1dGVzIG9mIG1ldGEtbW9kZWwgY2xhc3NlcyBvZiB0aGUgdHlwZSBEYXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVcmkiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm5ldC5VUkkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRhdGEgdHlwZSB1c2VkIGZvciBhdHRyaWJ1dGVzIG9mIG1ldGEtbW9kZWwgY2xhc3NlcyB0aGF0IHBvaW50IHRvIHJlc291cmNlcyBzdWNoIGFzIGZpbGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTZXQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuU2V0Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU2VxdWVuY2UiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuTGlzdCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkludGVnZXIiIGluc3RhbmNlQ2xhc3NOYW1lPSJpbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGludGVnZXIgaXMgYSBwcmltaXRpdmUgdHlwZSByZXByZXNlbnRpbmcgaW50ZWdlciB2YWx1ZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRvdWJsZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5Eb3VibGUiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25zdHJhaW50IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb25zdHJhaW50IGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgY29uZGl0aW9uIG9yIHJlc3RyaWN0aW9uIGV4cHJlc3NlZCBpbiBuYXR1cmFsIGxhbmd1YWdlIHRleHQgb3IgaW4gYSBtYWNoaW5lIHJlYWRhYmxlIGxhbmd1YWdlIGZvciB0aGUgcHVycG9zZSBvZiBkZWNsYXJpbmcgc29tZSBvZiB0aGUgc2VtYW50aWNzIG9mIGEgTWV0aG9kIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJvZHkiIG9yZGVyZWQ9ImZhbHNlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBzdG9yZXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBjbGFzcyBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcyBNZXRob2QgRWxlbWVudCBpcyB0aGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBjbGFzc2VzIGFuZCBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBldmVyeSBvdGhlciBlbGVtZW50IHR5cGUgb2YgdGhpcyBtb2RlbC4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLiAgTWV0aG9kIEVsZW1lbnQgaW5oZXJpdHMgdGhlIE5hbWUgYXR0cmlidXRlIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCdzIHN1cGVyIGNsYXNzLiAgRXZlcnkgZWxlbWVudCBkZWZpbmVkIGFzIGEgVU1BIGluc3RhbmNlIGlzIGRlcml2ZWQgZnJvbSBNb2RlbCBFbGVtZW50LiAgRXZlcnkgTWV0aG9kIEVsZW1lbnQgaW4tc3RhbmNlIGlzIGF0IGxlYXN0IGRlZmluZWQgYnkgYSB1bmlxdWUgaWQsIGEgbmFtZSwgYXMgd2VsbCBhcyBicmllZiBkZXNjcmlwdGlvbi4mI3hEOyYjeEE7TWV0aG9kIEVsZW1lbnQgaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBhZGRzIGFkZGl0aW9uYWwgcHJvcGVydGllcyB2aWEgcGFja2FnZSBtZXJnZSB0byBNZXRob2QgRWxlbWVudCBkZWZpbmVkIGluIE1ldGhvZCBDb3JlIG5lZWRlZCBmb3IgdGhlIHZhcmlhYmlsaXR5IGFuZCBleHRlbnNpYmlsaXR5IGNhcGFiaWxpdGllcyBpbnRyb2R1Y2VzIGluIHRoaXMgcGFja2FnZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3VpZCIgb3JkZXJlZD0iZmFsc2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIgaUQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgRGVzY3JpYmFibGUgRWxlbWVudCBoYXMgYSBwcmVzZW50YXRpb24gbmFtZSwgd2hpY2ggaXMgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIG5hbWUgKHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbikgbWlnaHQgYmUgc2V0IHRvICZxdW90O3J1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQmcXVvdDsgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgJnF1b3Q7ajJlZV9hcmNoaXRjdHVyZV9kb2N1bWVudCZxdW90OyB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICZxdW90O0FyY2hpdGVjdHVyZSBEb2N1bWVudCZxdW90Oy4mI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3duZWRSdWxlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29uc3RyYWludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kRWxlbWVudFByb3BlcnR5IgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RFbGVtZW50UHJvcGVydHkiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImtpbmQiIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0tpbmQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3VwcHJlc3NlZCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Cb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSBFeHRlbmRzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHRoZW4gdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgaW5oZXJpdGVkIE1ldGhvZCBFbGVtZW50cyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCwgd2hpY2ggY2FuIGJlIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIG9uIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0aGFuIGFuIGluaGVyaXRlZCBtZXRob2QgZWxlbWVudCB0aGVuIGl0IHdpbGwgbm90IGJlIHJlZ2FyZGVkIGFzIGluaGVyaXRlZCBhdCBhbGwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9yZGVyaW5nR3VpZGUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBDQVNFIHRvb2wgcmVhbGl6YXRpb25zIG9mIHRoaXMgbW9kZWwgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBsYXlvdXQgYW5kIG9yZGVyaW5nIG9mIHRoZSBtZXRob2QgZWxlbWVudCBhbmQgaXRzIHBhcnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RFbGVtZW50UHJvcGVydHkiIGVTdXBlclR5cGVzPSIjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJLaW5kIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQXBwbGljYWJsZU1ldGFDbGFzc0luZm8iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCAjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4mI3hBO0NvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiYjeEE7JiN4RDsmI3hBO1RoaXMgaXMgdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UncyBleHRlbnNpb24gb2YgQ29udGVudCBFbGVtZW50IChkZWZpbmVkIGluIENvbnRlbnQgRWxlbWVudHMpIHByb3ZpZGluZyBhZGRpdG9uYWwgYXNzb2NpYXRpb25zLiYjeEQ7JiN4QTtDb250ZW50IEVsZW1lbnQgaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBpbmhlcml0cyBmcm9tIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIG5vdCBkaXJlY3RseSBmcm9tIE1ldGhvZCBFbGVtZW50IGFueW1vcmUuICBUaGlzIGlzIGFjaGlldmVkIHVzaW5nIFVNTCAyLjAgcGFja2FnZSBtZXJnZSBzZW1hbnRpY3MuICBPbmx5IGlmIGFuIGFkb3B0ZXIgb2YgdGhpcyBtZXRhLW1vZGVsIGRlY2lkZXMgdG8gcmVhbGl6ZSBNZXRob2QgUGx1Z2lucywgaGUgd291bGQgZ2V0IHRoZSB2YXJpYWJpbGl0eSBhbmQgZXh0ZW5zaW9uIGNhcGFiaWxpdGllcyBmb3IgYWxsIENvbnRlbnQgRWxlbWVudHMuJiN4QTtDb250ZW50IEVsZW1lbnQgaW5oZXJpdHMgdGhlIHNlbWFudGljcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50LiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb25jZXB0c0FuZFBhcGVycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29uY2VwdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGVja2xpc3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DaGVja2xpc3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3VpZGVsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4YW1wbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9FeGFtcGxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2V0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmV1c2FibGVBc3NldCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZXJtZGVmaW5pdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGVybURlZmluaXRpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50ICMvL0NsYXNzaWZpZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJhYmxlIEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgTWV0aG9kIEVsZW1lbnRzIGZvciB3aGljaCBleHRlcm5hbCBwcmVzZW50YXRpb24gbmFtZXMgYXMgd2VsbCBhcyBjb250ZW50IGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCwgc3VjaCBhcyBSb2xlcyBvciBXb3JrIFByb2R1Y3RzLiAgUHJlc2VudGF0aW9uIE5hbWUgYW5kIENvbnRlbnQgRGVzY3JpcHRpb25zIGFyZSB0eXBpY2FsbHkgbG9jYWxpemVkIHVzaW5nIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIGl0cyBTdHJpbmcgdHlwZSBhdHRyaWJ1dGVzLiYjeEE7VGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlIChzZWUgU2VjdGlvbiA0LjEuNCkuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLiYjeEE7JiN4RDsmI3hBO1RoaXMgZGVmaW5pdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZXh0ZW5kcyB0aGUgQ29udGVudCBFbGVtZW50IGRlZmluaXRpb24gdmlhIHBhY2thZ2UgbWVyZ2Ugd2l0aCByZWZlcmVuY2VzIHRvIGljb25zIHRoYXQgYXJlIHVzZWQgZm9yIHByZXNlbnRpbmcgQ29udGVudCBFbGVtZW50cyBpbiBhIFVNQS1iYXNlZCBtb2RlbGluZyBlbnZpcm9ubWVudCBhcyB3ZWxsIGFzIHdoZW4gcHVibGlzaGluZyBDb250ZW50IEVsZW1lbnRzIGludG8gZG9jdW1lbnRhdGlvbiBwcmVzZW50YXRpb24gKGUuZy4gZG9jdW1lbnQgb3IgaHRtbCBwYWdlcykuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRhdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Db250ZW50RGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNoYXBlaWNvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9VcmkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vZGVpY29uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1VyaSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB0cmVlIGJyb3dzZXIgcHJlc2VudGF0aW9ucyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgRGVzY3JpcHRpb24gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQ29udGVudCBFbGVtZW50LiAgSXQgZGVmaW5lcyBzdGFuZGFyZCBhdHRyaWJ1dGVzIGFwcGxpY2FibGUgZm9yIGFsbCBDb250ZW50IEVsZW1lbnQgdHlwZXMuICBTcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgc3ViLXR5cGVzIGNhbiBkZWZpbmUgdGhlaXIgb3duIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gc3ViLXR5cGVzLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgc3RvcmUgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsSWQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciBvciBsYWJlbCB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgZWxlbWVudC4gVXNlZCBsaWtlIGEgc3lub255bSB0byB0aGUgbmFtZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJLZXkgQ29uc2lkZXJhdGlvbnMgcHJvdmlkZXMgYWR2aXNlIGFuZCBndWlkYW5jZSBvZiBhIGNyaXRpY2FsIG5hdHVyZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsIGFzIHdhcm5pbmdzLCBjYXV0aW9ucywgcGl0ZmFsbHMsIGRhbmdlcnMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvbmdQcmVzZW50YXRpb25OYW1lIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RVbml0IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFVuaXQgaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIE1ldGhvZCBMaWJyYXJ5IGFzIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRob3JzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEYXRlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyc2lvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb3B5cmlnaHRTdGF0ZW1lbnQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdXBwb3J0aW5nIE1hdGVyaWFscyBpcyBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkYW5jZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR3VpZGFuY2UgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFza3MsIGFuZCBXb3JrIFByb2R1Y3RzLiAgRXhhbXBsZXMgZm9yIEd1aWRhbmNlIGFyZSBHdWlkZWxpbmVzLCBUZW1wbGF0ZXMsIENoZWNrbGlzdHMsIFRvb2wgTWVudG9ycywgRXN0aW1hdGVzLCBTdXBwb3J0aW5nIE1hdGVyaWFscywgUmVwb3J0cywgQ29uY2VwdHMsIGV0Yy4gIFRoaXMgcGFja2FnZSBvbmx5IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhYnN0cmFjdCBHdWlkYW5jZSBjbGFzcy4gIFRoZSBwYWNrYWdlIEd1aWRhbmNlIFR5cGVzIGRlZmluZXMgY29uY3JldGUgZ3VpZGFuY2UgdHlwZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlY3Rpb24iIGVTdXBlclR5cGVzPSIjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgU2VjdGlvbiBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy4mI3hEOyYjeEE7U2VjdGlvbiBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGluaGVyaXRzIGZyb20gVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgZXh0ZW5kcyBTZWN0aW9uIGRlZmluZWQgaW4gTWV0aG9kIENvcmUgOjogQmFzaWMgRWxlbWVudHMgd2l0aCBuZXcgY2FwYWJpbGl0aWVzIGZvciB2YXJpYWJpbGl0eS4gJiN4QTtGb3IgZXhhbXBsZSwgd2hlbiBhIFRhc2sgY29udHJpYnV0ZXMgdG8gYW5vdGhlciBUYXNrIGl0cyBQcmVzZW50YXRpb24gYXNzb2NpYXRpb24gaXMgY29udHJpYnV0ZWQgaW5jbHVkaW5nIGl0cyBTZWN0aW9ucyAoaS5lLiBpdHMgU3RlcHMpLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBwYXJ0cyBvZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZS4gIFNlY3Rpb25zIGNhbiBiZSBuZXN0ZWQgYW5kIHRoZXJlZm9yZSBUYXNrIERlc2NyaXB0aW9ucyBjYW4gYmUgZmxleGlibHkgb3JnYW5pemVkIGluIFN0ZXBzIHdpdGggc3ViLVN0ZXBzLiAgU2VjdGlvbnMgYXJlIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIHNvIHRoZXkgY2FuIGNvbnRyaWJ1dGUgdG8gZWFjaCBvdGhlci4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgbW9kZWwgYSBUYXNrIHN0ZXAgYXMgYSBTZWN0aW9uIGluc3RhbmNlIHdpdGhvdXQgcmVsYXRpbmcgaXQgdG8gYSBUYXNrIERlc2NyaXB0aW9uIHRoYXQgZGlyZWN0bHkgY29udHJpYnV0ZXMgdG8gKG9yIHJlcGxhY2VzKSBhbm90aGVyIFNlY3Rpb24gd2hpY2ggaXMgcGFydCBvZiBhIFRhc2sgRGVzY3JpcHRpb24uICBUaGlzIGNvbnRyaWJ1dGlvbiAob3IgcmVwbGFjZW1lbnQpIHdvdWxkIGFkZCBuZXcgZGVzY3JpcHRpb24gdGV4dCB0byB0aGUgb3JpZ2luYWwgc3RlcCBkZXNjcmlwdGlvbiAob3IgcmVwbGFjZSB0aGUgb3JpZ2luYWwgc3RlcCBkZXNjcmlwdGlvbikuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgdG8gY29udHJpYnV0ZSBuZXcgQ2hlY2sgTGlzdCBpdGVtcyBvcmdhbml6ZWQgYXMgU2VjdGlvbnMgdG8gYW4gZXhpc3RpbmcgQ2hlY2sgTGlzdCAoZGVmaW5lZCBhcyBndWlkYW5jZSkuICAmI3hBOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlY3Rpb25OYW1lIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWN0aW9uRGVzY3JpcHRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlNlY3Rpb25zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TZWN0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkZWNlc3NvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TZWN0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhcmlhYmlsaXR5RWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBjbGFzcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBuZXcgY2FwYWJpbGl0aWVzIGZvciBjb250ZW50IHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIENvbnRlbnQgRWxlbWVudHMgb3IgYW55IG90aGVyIE1ldGhvZCBFbGVtZW50IHRoYXQgZGVyaXZlcyBmcm9tIGl0LiAgSXQgaGFzIGJlZW4gcGxhY2VkIGluLWJldHdlZW4gdGhlIGNsYXNzZXMgTWV0aG9kIEVsZW1lbnQgYW5kIENvbnRlbnQgRWxlbWVudCBpbiB0aGUgb3ZlcmFsbCBVTUEgdGF4b25vbXkgb2YgY2xhc3NlcyB1c2luZyB0aGUgVU1MIDIuMCBwYWNrYWdlIG1lcmdlIG1lY2hhbmlzbS4gIFRoZSBhc3NvY2lhdGlvbiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiBzaGFsbCBvbmx5IGJlIGluc3RhbnRpYXRlZCBiZXR3ZWVuIHR3byBzdWJjbGFzc2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIHNhbWUgdHlwZS4gIFRoZSBlbGVtZW50IG9uIHZhcmFpYmlsaXR5U3BlY2lhbEVsZW1lbnQgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGRlZmluZXMgYSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUgZGVmaW5pbmcgdGhlIG5hdHVyZSBvZiB0aGUgcmVsYXRpb25zaGlwIHVzaW5nIGEgbGl0ZXJhbCBmcm9tIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLiYjeEE7VmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgbWV0YS1tb2RlbCBwYWNrYWdlIE1ldGhvZCBQbHVnaW5zIGFkZHMgdGhlIGNhcGFiaWxpdGllcyBvZiB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBNZXRob2QgRWxlbWVudHMgdGhhdCBkZXJpdmUgZnJvbSBpdC4gIEJ5IGRlZmF1bHQgYWxsIENvbnRlbnQgRWxlbWVudHMgc3VjaCBhcyBSb2xlLCBUYXNrLCBHdWlkYW5jZSBUeXBlcywgb3IgQWN0aXZpdGllcyBhcmUgZGVmaW5lZCB0byBiZSBWYXJpYWJpbGl0eSBFbGVtZW50cy4mI3hBO1ZhcmlhYmlsaXR5IGFuZCBleHRlbnNpb24gcHJvdmlkZXMgdW5pcXVlIG1lY2hhbmlzbXMgZm9yIGN1c3RvbWl6aW5nIG1ldGhvZCBjb250ZW50IHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LCBidXQgYnkganVzdCBiZSBhYmxlIHRvIGRlc2NyaWJlIHdpdGggc2VwYXJhdGUgb2JqZWN0cyB0aGUgZGlmZmVyZW5jZXMgKGFkZGl0aW9ucywgY2hhbmdlcywgb21pc3Npb25zKSByZWxhdGl2ZSB0byB0aGUgb3JpZ2luYWwuICBUaGlzIHBsdWctaW4gY29uY2VwdCBhbGxvd3MgdXNlcnMgdG8gZmFjdG9yIHRoZWlyIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gaW50ZXJyZWxhdGVkIHVuaXRzIGFuZCBldmVuIHRvIGFyY2hpdGVjdCBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGxheWVycyB0aGF0IGV4dGVuZCBlYWNoIG90aGVyIHdpdGggbmV3IGNhcGFiaWxpdGllcy4gIFRoZSByZXN1bHRpbmcgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2lnbiBjYW4gYmUgZHluYW1pY2FsbHkgY29tYmluZWQgYW5kIGFwcGxpZWQgb24gZGVtYW5kIHVzaW5nIHRoZSBpbnRlcnByZXRhdGlvbiBydWxlcyBkZWZpbmVkIGZvciBWYXJpYWJpbGl0eSBFbGVtZW50IFNwZWNpYWxpemF0aW9ucyBhc3NlbWJsaW5nIHRvIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0aGUgbW9zdCBhY2N1cmF0ZSBtZXRob2QgYW5kIHByb2Nlc3MgZGVzY3JpcHRpb25zIHBvc3NpYmxlLiAgSXQgYWxzbyBhbGxvd3MgcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRvIGV4dGVuZHMgYW5kIHRhaWxvciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIHRoZXkgZG8gbm90IG93biBhbmQgdG8gZWFzaWx5IHVwZ3JhZGUgdG8gbmV3ZXIgdmVyc2lvbnMgYnkgc2ltcGx5IHJlYXBwbHkgdGhlaXIgcGVyc29uYWwgY2hhbmdlcyB0byB0aGVzZSB1cGdyYWRlcy4mI3hBO1ZhcmlhYmlsaXR5IEVsZW1lbnQgZGVmaW5lcyB0d28gdHlwZXMgb2YgdmFyaWFiaWxpdHkgYW5kIG9uZSB0eXBlIG9mIGV4dGVuc2lvbiB3aGljaCBhcmUgZm9ybWFsbHkgZGVmaW5lZCBmb3IgdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1ZhcmlhYmlsaXR5VHlwZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0ibmEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBpbiBpbnN0YW5jZSBvZiB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsaXphdGlvbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byBWYXJpYWJpbGl0eSBFbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlIGV4aXN0cywgdGhlbiB0aGUgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgaG93IHRoZSBlbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxFbGVtZW50IGVuZCBvZiB0aGUgYXNzb2NpYXRpb24gY2hhbmdlcyB0aGUgQ29udGVudCBFbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IGVuZC4gU2VlIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGVudW1lcmF0aW9uIGNsYXNzIGZvciBkZWZpbml0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiB2YXJpYWJpbGl0eS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9WYXJpYWJpbGl0eUVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlZhcmlhYmlsaXR5IFR5cGUgaXMgYW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibmEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIHRoZSBkZWZhdWx0ICZxdW90O25vdCBhc3NpZ25lZCZxdW90OyB2YWx1ZSBvZiBhIFZhcmlhYmlsbGl0eSBFbGVtZW50J3MgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSB3aGljaCBpcyBzZXQgaW4gdGhlIGNhc2Ugbm8gdmFyaWFiaWxpdHkgYXNzb2NpYXRpb24gaXMgcHJlc2VudCBiZXR3ZWVuIHRoZSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBvdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50cy4mI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJjb250cmlidXRlcyIgdmFsdWU9IjEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250cmlidXRlcyBwcm92aWRlcyBhIHdheSBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHRvIGNvbnRyaWJ1dGUgdGhlaXIgcHJvcGVydGllcyBpbnRvIHRoZWlyIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGFsdGVyaW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcywgaS5lLiBpbiBhbiBhZGRpdGl2ZSBmYXNoaW9uLiAgUHJvcGVydGllcyBjb250cmlidXRlZCBhcmU6IGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uIGluc3RhbmNlcy4gIFRoZSBlZmZlY3QgYWZ0ZXIgaW50ZXJwcmV0YXRpb24gb2YgY29udHJpYnV0aW9uIGlzIHRoYXQgdGhlIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBsb2dpY2FsbHkgcmVwbGFjZWQgd2l0aCBhbiBhdWdtZW50ZWQgdmFyaWFudCBvZiB0aGUgZWxlbWVudCB0aGF0IGNvbWJpbmVzIGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uIGluc3RhbmNlcy4gIFRoZSB3YXkgdGhpcyBjb21iaW5hdGlvbiBpcyByZWFsaXplZCBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUgb3IgYXNzb2NpYXRpb24uICBGb3IgZXhhbXBsZSwgU3RyaW5nIGF0dHJpYnV0ZXMgYXJlIGNvbmNhdGVuYXRlZCByZXNvbHZpbmcgZW1iZWRkZWQgY29tbWFuZHMgZm9yIGRlcGVuZGVudCB0ZXh0IG9yIG1lcmdpbmcgdGV4dCBmcmFnbWVudHMgKGUuZy4gZGVzY3JpcHRpb25zIGZvciBjb250ZW50IGVsZW1lbnRzKS4gIEFkZGl0aW9uYWwgZWxlbWVudHMgaW4gdG8tbWFueSBhc3NvY2lhdGlvbnMgYXJlIGFkZGVkIChlLmcuIGFkZGl0aW9uYWwgR3VpZGFuY2UgZWxlbWVudHMgb3IgVGFzayBEZXNjcmlwdG9ycyBvZiBhbiBBY3Rpdml0eSkuICBEaWZmZXJlbnQgZWxlbWVudHMgaW4gdG8tb25lIGFzc29jaWF0aW9ucyBhcmUgaWdub3JlZCAoZS5nLiB0aGUgb25lIFByaW1hcnkgUGVyZm9ybWVyIG9mIGEgVGFzaykuICBNdWx0aXBsZSBDb250ZW50IEVsZW1lbnRzIGNhbiBjb250cmlidXRlIHRvIHRoZSBzYW1lIGJhc2UgZWxlbWVudCBhbmQgYWxsIG9mIHRoZXNlIGNvbnRyaWJ1dGlvbnMgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gdGhlIGJhc2UgaW4gdGhlIHNhbWUgZmFzaGlvbi4gVGhlIGZvbGxvd2luZyB0YWJsZSBwcm92aWRlcyB0aGUgZGV0YWlsZWQgbGlzdCBvZiBpbnRlcnByZXRhdGlvbiBydWxlczomI3hBO2F0dHJpYnV0ZSB2YWx1ZXM6JiN4OTtTdHJpbmcgdmFsdWVzIGZyb20gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgY29uY2F0ZW5hdGVkIHdpdGggdmFsdWVzIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBPdGhlciB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IG9mIGFueSBvdGhlciB0eXBlIHN1Y2ggYXMgSW50ZWdlciwgRGF0ZSBhcmUgaWdub3JlZC4mI3hBO1RoZSBpZGVudGlmeWluZyBhdHRyaWJ1dGVzIGd1aWQgYW5kIG5hbWUgb2YgTWV0aG9kIEVsZW1lbnQgYXJlIGV4ZW1wdCBmcm9tIHRoaXMgcnVsZSBhbmQgd2lsbCBub3QgYmUgbW9kaWZpZWQuJiN4QTswLi4xLWFzc29jaWF0aW9uIGluc3RhbmNlczomI3g5O1RoZSBvbmUgYXNzb2NpYXRpb24gaW5zdGFuY2Ugb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMga2VwdCBhbmQgYW55IGFzc29jaWF0aW9uIGZyb20gdGhlIGNvbnRyaWJ1dGluZyBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgaWdub3JlZC4mI3hBOzAuLm4tYXNzb2NpYXRpb24gaW5zdGFuY2VzOiYjeDk7QXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIGFkZGVkIHRvIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgYmFzZWQtb24gZWxlbWVudC4gIElmIGJvdGggVmFyaWFiaWxpdHkgRWxlbWVudHMgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0IHRoZW4gb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhlIGFzc29jaWF0aW9uIHdpbGwgcmVtYWluLiYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImV4dGVuZHMiIHZhbHVlPSIyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXh0ZW5zaW9uIGFsbG93cyBNZXRob2QgUGx1Z2lucyB0byBlYXNpbHkgcmV1c2UgZWxlbWVudHMgZnJvbSBhIEJhc2UgUGx1Z2luIGJ5IHByb3ZpZGluZyBhIGtpbmQgb2YgaW5oZXJpdGFuY2UgZm9yIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBBdHRyaWJ1dGUgdmFsdWVzIGFuZCBBc3NvY2lhdGlvbiBpbnN0YW5jZXMgYXJlIGluaGVyaXRlZCBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IHRvIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBUaGUgcmVzdWx0IG9mIGludGVycHJldGF0aW9uIGlzIHRoYXQgdGhlIHNwZWNpYWwgZWxlbWVudCBoYXMgdGhlIHNhbWUgcHJvcGVydGllcyBhcyB0aGUgYmFzZWQtb24gaGFzLCBidXQgbWlnaHQgZGVmaW5lIGl0cyBvd24gYWRkaXRpb25zLiAgSGVuY2UgZXh0ZW5kcyBpcyBub3QgdXNlZCB0byBtb2RpZnkgY29udGVudCBvZiB0aGUgYmFzZSBQbHVnaW4sIGJ1dCB0byBwcm92aWRlIHRoZSBhYmlsaXR5IGZvciB0aGUgZXh0ZW5kaW5nIFBsdWdpbiB0byBkZWZpbmUgaXRzIG93biBjb250ZW50IHdoaWNoIGlzIGEgdmFyaWFudCBvZiBjb250ZW50IGFscmVhZHkgZGVmaW5lZCAoZS5nLiBhIHNwZWNpYWwgdmVyc2lvbiBvZiBhIGdlbmVyaWMgUmV2aWV3IFJlY29yZCBmb3IgYSBzcGVjaWZpYyB0eXBlIG9mIHJldmlldykuICBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB0aGUgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBhbnkgbnVtYmVyIG9mIGV4dGVuZGluZyBWYXJpYWJpbGl0eSBFbGVtZW50cyBjYW4gYmUgdXNlZCBzaWRlIGJ5IHNpZGUsIGJ1dCByZWZlciB0byBlYWNoIG90aGVyIHZpYSB0aGUgZXh0ZW5kcyByZWxhdGlvbnNoaXAuICBFeHRlbmRzIGFsc28gcHJvdmlkZXMgdGhlIGtleSBtZWNoYW5pc20gZm9yIGJpbmRpbmcgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0byBQcm9jZXNzZXM6IEEgcGF0dGVybiBpcyBhcHBsaWVkIGJ5IGRlZmluaW5nIGFuIGV4dGVuZHMgcmVsYXRpb25zaGlwcyBmcm9tIGFuIEFjdGl2aXR5IG9mIHRoZSBhcHBseWluZyBQcm9jZXNzZXMgdG8gdGhlIFBhdHRlcm4uICBUaGUgQWN0aXZpdHkgaW5oZXJpdHMgYXNzb2NpYXRpb25zIGluc3RhbmNlcyBmcm9tIHRoZSBwYXR0ZXJuIGFuZCB0aGUgcGF0dGVybiBhcHBlYXJzIHRvIGJlIHBhcnQgb2YgdGhlIHJlc3VsdGluZyBQcm9jZXNzIGFmdGVyIEludGVycHJldGF0aW9uLiYjeEE7YXR0cmlidXRlIHZhbHVlczomI3g5O1ZhbHVlcyBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBlbGVtZW50IGFyZSBpbmhlcml0ZWQgYW5kIHVzZWQgdG8gcG9wdWxhdGUgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudHMgYXR0cmlidXRlcy4gIElmIHRoZSBzcGVjaWFsIGVsZW1lbnQgYXR0cmlidXRlcyBhcmUgYWxyZWFkeSBwb3B1bGF0ZWQgdGhlIGluaGVyaXRlZCB2YWx1ZXMgYXJlIGlnbm9yZWQuICAmI3hBO1RoZSBpZGVudGlmeWluZyBhdHRyaWJ1dGVzIGd1aWQgYW5kIG5hbWUgb2YgTWV0aG9kIEVsZW1lbnQgYXJlIGV4ZW1wdCBmcm9tIHRoaXMgcnVsZSBhbmQgd2lsbCBub3QgYmUgbW9kaWZpZWQuJiN4QTswLi4xLWFzc29jaWF0aW9uIGluc3RhbmNlczomI3g5O1RoZSBvbmUgYXNzb2NpYXRpb24gaW5zdGFuY2Ugb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgaW5oZXJpdGVkIHRvIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBJZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGRlZmluZXMgaXRzIG93biBhc3NvY2lhdGlvbiBpbnN0YW5jZSB0aGVuIHRoZSBpbmhlcml0ZWQgb25lIGlzIGlnbm9yZWQuJiN4QTswLi5uLWFzc29jaWF0aW9uIGluc3RhbmNlczomI3g5O0Fzc29jaWF0aW9uIGluc3RhbmNlcyBkZWZpbmVkIGZvciB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgaW5oZXJpdGVkIHRvIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBUaGUgc3BlY2lhbCBlbGVtZW50IGNhbiBhZGQgYWRkaXRpb25hbCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuJiN4QTsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJyZXBsYWNlcyIgdmFsdWU9IjMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXBsYWNlcyBwcm92aWRlcyBhIHdheSBmb3IgVmFyaWFiaWxpdHkgRWxlbWVudHMgdG8gcmVwbGFjZSBhIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGNoYW5naW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcy4gIFRoaXMgaXMgaW4gbW9zdCBjYXNlcyB1c2VkIGZvciBNZXRob2QgUGx1Z2lucyB0aGF0IGFpbSB0byByZXBsYWNlIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFzaywgb3IgQWN0aXZpdGllcyB3aXRoIGVpdGhlciBhIGNvbXBsZXRlIG5ldyB2YXJpYW50IG9yIHRvIGNoYW5nZSBmdW5kYW1lbnRhbCByZWxhdGlvbnNoaXBzIG9mIHRoZXNlIGVsZW1lbnRzIChlLmcuIFJvbGUtQXJ0aWZhY3QgcmVzcG9uc2liaWxpdHkpLiAgUHJvcGVydGllcyByZXBsYWNlZCBhcmUgYXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24gaW5zdGFuY2VzLiAgVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgdGhlIGJhc2UgQ29udGVudCBFbGVtZW50IGlzIGxvZ2ljYWxseSByZXBsYWNlZCB3aXRoIHRoaXMgbmV3IHZhcmlhbnQgb2YgdGhlIGVsZW1lbnQgdG8gd2hpY2ggYWxsIGluY29taW5nIGFzc29jaWF0aW9ucyBzdGlsbCBwb2ludCBhcyBiZWZvcmUsIGJ1dCB3aGljaCBoYXMgcG90ZW50aWFsbHkgbmV3IGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIG91dGdvaW5nIGFzc29jaWF0aW9uIHByb3BlcnRpZXMuICBUaGlzIHByb3ZpZGVzIGEgdmVyeSBwb3dlcmZ1bCBtZWNoYW5pc20gdG8gcmVwbGFjZSwgZm9yIGV4YW1wbGUsIHdob2xlIEFjdGl2aXRpZXMgaW4gYSBQcm9jZXNzIHdpdGggY29tcGxldGUgbmV3IHJlYWxpemF0aW9ucyBvZiB0aGUgQWN0aXZpdHkuICBGb3IgaW5zdGFuY2UsIHJlcGxhY2luZyBhbiBBY3Rpdml0eSBkb2luZyB1c2UgY2FzZS1iYXNlZCBkZXNpZ24gd2l0aCBhbiBhY3Rpdml0eSBkb2luZyBhZ2lsZSBjb2RlLWNlbnRyaWMgZGV2ZWxvcG1lbnQgZG9pbmcgdGhlIHNhbWUgd29yayB1c2luZyBhIGRpZmZlcmVudCBkZXZlbG9wbWVudCB0ZWNobmlxdWUgdXRpbGl6aW5nIGRpZmZlcmVudCBSb2xlcywgVGFza3MsIGV0Yy4gIEFub3RoZXIgZXhhbXBsZSwgd291bGQgYmUgdG8gcmVwbGFjZSBhbiBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBkYXRhYmFzZSBkZXNpZ24gZm9yIGFuIFJEQk1TIHdpdGggYW4gQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgZGF0YWJhc2UgZGVzaWduIGZvciBhbiBPT0RCTVMuICBBIFZhcmlhYmlsaXR5IEVsZW1lbnQgY2FuIG9ubHkgYmUgcmVwbGFjZWQgYnkgb25lIG90aGVyIGVsZW1lbnQgYXQgYSB0aW1lLiAgRm9yIGV4YW1wbGUsIGlmIHR3byBNZXRob2QgUGx1Z2lucyByZXBsYWNlIHRoZSBzYW1lIGVsZW1lbnQgb25seSBvbmUgTWV0aG9kIFBsdWdpbiBjYW4gYmUgdXNlZCBmb3IgaW50ZXJwcmV0YXRpb24gKHNlZSBjb25jZXB0IG9mIE1ldGhvZCBDb25maWd1cmF0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gaG93IHRvIHJlc29sdmUgc3VjaCBjb25mbGljdHMsIFNlY3Rpb24gNy4xLjIpLiAgVGhlIGZvbGxvd2luZyB0YWJsZSBwcm92aWRlcyB0aGUgZGV0YWlsZWQgbGlzdCBvZiBpbnRlcnByZXRhdGlvbiBydWxlczomI3hBO2F0dHJpYnV0ZSB2YWx1ZXM6JiN4OTtWYWx1ZXMgZnJvbSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSByZXBsYWNlZCB3aXRoIHZhbHVlcyBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGluY2x1ZGluZyB1bmFzc2lnbmVkIHZhbHVlcy4mI3hBO1RoZSBpZGVudGlmeWluZyBhdHRyaWJ1dGVzIGd1aWQgYW5kIG5hbWUgb2YgTWV0aG9kIEVsZW1lbnQgYXJlIGV4ZW1wdCBmcm9tIHRoaXMgcnVsZSBhbmQgd2lsbCBub3QgYmUgbW9kaWZpZWQuJiN4QTswLi4xLWFzc29jaWF0aW9uIGluc3RhbmNlczomI3g5O1RoZSBvbmUgYXNzb2NpYXRpb24gaW5zdGFuY2Ugb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgYXNzb2NpYXRpb24gaW5zdGFuY2UgZnJvbSB0aGUgcmVwbGFjaW5nIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIElmIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGlvbiBpbnN0YW5jZSB0aGVuIHJlc3VsdGluZyBlbGVtZW50IHdpbGwgYWxzbyBub3QgaGF2ZSBhbiBhc3NvY2lhdGlvbi4mI3hBOzAuLm4tYXNzb2NpYXRpb24gaW5zdGFuY2VzOiYjeDk7QXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgcmVwbGFjZSBhbGwgYXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LiYjeEE7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibG9jYWxDb250cmlidXRpb24iIHZhbHVlPSI0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJsb2NhbFJlcGxhY2VtZW50IiB2YWx1ZT0iNSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZXh0ZW5kc1JlcGxhY2VzIiB2YWx1ZT0iNiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25jZXB0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29uY2VwdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNoZWNrbGlzdCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENoZWNrbGlzdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGVsaW5lIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgR3VpZGVsaW5lIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4YW1wbGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gRXhhbXBsZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmV1c2FibGVBc3NldCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJldXNhYmxlIEFzc2V0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcmI3hBO2hvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVybURlZmluaXRpb24iIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGVybURlZmluaXRpb25zIGRlZmluZSBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUaGV5IGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIgZVN1cGVyVHlwZXM9IiMvL0NsYXNzaWZpZXIiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1ByaW1hcnlFeHRlbnNpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vQm9vbGVhbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcnRpZmFjdCIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBcnRpZmFjdCBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLiYjeEE7QXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICZxdW90O293biZxdW90OyBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lckFydGlmYWN0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0FydGlmYWN0IiBlT3Bwb3NpdGU9IiMvL0FydGlmYWN0L2NvbnRhaW5lZEFydGlmYWN0cyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZWRBcnRpZmFjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0FydGlmYWN0IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9BcnRpZmFjdC9jb250YWluZXJBcnRpZmFjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdCIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50ICMvL0Z1bGZpbGxhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBQcm9kdWN0IGlzIGFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLiYjeEE7QSB3b3JrIHByb2R1Y3QgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBhIHRhc2suJiN4QTsmI3hEOyYjeEE7VGhpcyBpcyB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZSdzIGV4dGVuc2lvbiBvZiBXb3JrIFByb2R1Y3QgKGRlZmluZWQgaW4gQ29udGVudCBFbGVtZW50cykgcHJvdmlkaW5nIGFkZGl0b25hbCBhc3NvY2lhdGlvbnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlcG9ydHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JlcG9ydCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZW1wbGF0ZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RlbXBsYXRlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRvb2xNZW50b3JzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Ub29sTWVudG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkZ1bGZpbGxhYmxlRWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImZ1bGZpbGxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9GdWxmaWxsYWJsZUVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVwb3J0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUmVwb3J0IGlzIGEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVtcGxhdGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUZW1wbGF0ZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVG9vbE1lbnRvciIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRvb2wgTWVudG9yIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrIGEgV29yayBQcm9kdWN0IGVpdGhlciBpbiB0aGUgY29udGV4dCBvZiBvciBpbmRlcGVuZGVudCBmcm9tIGEgVGFzayBvciBBY3Rpdml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMgcXVhbGlmeSB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyYWJsZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGRlbGl2ZXJhYmxlIGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVsaXZlcmVkV29ya1Byb2R1Y3RzIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRjb21lIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIG91dGNvbWUgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RlcCIgZVN1cGVyVHlwZXM9IiMvL1NlY3Rpb24gIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgU3RlcCBpcyBhIFNlY3Rpb24gYW5kIFdvcmsgRGVmaW5pdGlvbiB0aGF0IGlzIHVzZWQgdG8gb3JnYW5pemUgVGFza3MgaW50byBwYXJ0cyBvciBzdWJ1bml0cyBvZiB3b3JrLiAgU3RlcHMgaW5oZXJpdCB0aGUgc3ViU2VjdGlvbnMgZGVjb21wb3NpdGlvbiBmcm9tIFNlY3Rpb24gYW5kIGNhbiB0aGVyZWZvcmUgZGVzY3JpYmUgU3ViLVN0ZXBzIG5lc3RlZCBpbnRvIFN0ZXBzLiYjeEE7QSBTdGVwIGRlc2NyaWJlcyBhIG1lYW5pbmdmdWwgYW5kIGNvbnNpc3QgcGFydCBvZiB0aGUgb3ZlcmFsbCB3b3JrIGRlc2NyaWJlZCBmb3IgYSBUYXNrLiAgVGhlIGNvbGxlY3Rpb24gb2YgU3RlcHMgZGVmaW5lZCBmb3IgYSBUYXNrIHJlcHJlc2VudHMgYWxsIHRoZSB3b3JrIHRoYXQgc2hvdWxkIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGUgb3ZlcmFsbCBkZXZlbG9wbWVudCBnb2FsIG9mIHRoZSBUYXNrLiAgTm90IGFsbCBzdGVwcyBhcmUgbmVjZXNzYXJpbHkgcGVyZm9ybWVkIGVhY2ggdGltZSBhIFRhc2sgaXMgaW52b2tlZCBpbiBhIFByb2Nlc3MgKHNlZSBUYXNrIERlc2NyaXB0b3IpLCBzbyB0aGV5IGNhbiBhbHNvIGJlIGV4cHJlc3NlZCBpbiB0aGUgZm9ybSBvZiBhbHRlcm5hdGUgJ2Zsb3dzJyBvZiB3b3JrLiAgRGlmZmVyZW50IHdheXMgb2YgYWNoaWV2aW5nIHRoZSBzYW1lIGRldmVsb3BtZW50IGdvYWwgY2FuIHRoZW4gYmUgJ2Fzc2VtYmxlZCcgYnkgc2VsZWN0aW5nIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2Ygc3RlcHMgd2hlbiBhcHBseWluZyB0aGUgVGFzayBpbiBhIFByb2Nlc3MuICBUeXBpY2FsIGtpbmRzIG9mIHN0ZXBzIGEgVGFzayBhdXRob3Igc2hvdWxkIGNvbnNpZGVyIGFyZTogVGhpbmtpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIHVuZGVyc3RhbmQgdGhlIG5hdHVyZSBvZiB0aGUgdGFzaywgZ2F0aGVycyBhbmQgZXhhbWluZXMgdGhlIGlucHV0IGFydGlmYWN0cywgYW5kIGZvcm11bGF0ZXMgdGhlIG91dGNvbWUuIFBlcmZvcm1pbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGNyZWF0ZSBvciB1cGRhdGUgc29tZSBhcnRpZmFjdHMuIFJldmlld2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgaW5zcGVjdHMgdGhlIHJlc3VsdHMgYWdhaW5zdCBzb21lIGNyaXRlcmlhLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtEZWZpbml0aW9uIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgRGVmaW5pdGlvbiBpcyBhbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLiYjeEE7V29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWNvbmRpdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Db25zdHJhaW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3N0Y29uZGl0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnN0cmFpbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldoaXRlcGFwZXIiIGVTdXBlclR5cGVzPSIjLy9Db25jZXB0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGl0ZXBhcGVycyBhcmUgYSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFzayIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50ICMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRhc2sgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd29yayBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBJdCBkZWZpbmVzIG9uZSBkZWZhdWx0IHBlcmZvcm1pbmcgUm9sZSBhcyB3ZWxsIGFzIG1hbnkgYWRkaXRpb25hbCBwZXJmb3JtZXJzLiAgQSBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiAgSW5wdXRzIGFyZSBkaWZmZXJlbnRpYXRlZCBpbiBtYW5kYXRvcnkgdmVyc3VzIG9wdGlvbmFsIGlucHV0cy4gIFRoZSBhc3NvY2lhdGlvbnMgdG8gV29yayBQcm9kdWN0cyBhcmUgbm90IGluc3RhbnRpYXRhYmxlL3ZhcmlhYmxlLWxpa2UgcGFyYW1ldGVycy4gIFRoZXkgcmF0aGVyIGV4cHJlc3MgKGh5cGVyLSlsaW5rcyB0byB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSB3b3JrIHByb2R1Y3RzIHR5cGVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIFRhc2sgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiAgSW4gb3RoZXIgd29yZHMsIHRoZXNlIGFzc29jaWF0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY2FwdHVyZSB3aGljaCBjb25jcmV0ZSBpbnN0YW5jZXMgd2lsbCBiZSBwYXNzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBtZXRob2QgaW4gYSBwcm9qZWN0LiAgQWxsIG9mIHRoZSBUYXNrJ3MgZGVmYXVsdCBhc3NvY2lhdGlvbnMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYW4gYWN0dWFsIHByb2Nlc3MgZGVmaW5pdGlvbi4mI3hBO0EgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuICYjeEE7QSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gJiN4QTtGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV2ZWxvcCBVc2UgQ2FzZSBNb2RlbCZxdW90OyBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICZxdW90O21ldGhvZCZxdW90OyBvZiBEZXZlbG9waW5nIGEgVXNlIENhc2UgTW9kZWwuICBBcHBseWluZyBzdWNoIGEgbWV0aG9kIGluIGEgbGlmZWN5Y2xlIChpLmUuIGluIGEgcHJvY2VzcykgaXMgZGVmaW5pbmcgd2hpY2ggc3RlcHMgYXJlIGRvbmUgd2hlbiBnb2luZyBmcm9tIG9uZSBpdGVyYXRpb24gdG8gdGhlIG5leHQuJiN4QTsmI3hEOyYjeEE7VGhpcyBpcyB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZSdzIGV4dGVuc2lvbiBvZiBUYXNrIChkZWZpbmVkIGluIENvbnRlbnQgRWxlbWVudHMpIHByb3ZpZGluZyBhZGRpdGlvbmFsIGFzc29jaWF0aW9ucy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyZm9ybWVkQnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFuZGF0b3J5SW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dHB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3RlcHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N0ZXAiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idG9vbE1lbnRvcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rvb2xNZW50b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50ICMvL0Z1bGZpbGxhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIGlzIGEgY29udGVudCBlbGVtZW50IHRoYXQgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcy4gIFJvbGVzIGFyZSB1c2VkIGJ5IFRhc2tzIHRvIGRlZmluZSB3aG8gcGVyZm9ybXMgdGhlbSBhcyB3ZWxsIGFzIGRlZmluZSBhIHNldCBvZiB3b3JrIHByb2R1Y3RzIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gICYjeEE7QSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBhIHNldCBvZiBpbmRpdmlkdWFscy4gIFJvbGVzIGFyZSBub3QgaW5kaXZpZHVhbHMgb3IgcmVzb3VyY2VzLiAgSW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gd2lsbCB3ZWFyIGRpZmZlcmVudCBoYXRzLCBvciBwZXJmb3JtIGRpZmZlcmVudCByb2xlcy4gVGhlIG1hcHBpbmcgZnJvbSBpbmRpdmlkdWFsIHRvIHJvbGUsIHBlcmZvcm1lZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYW5kIHN0YWZmaW5nIGZvciBhIHByb2plY3QsIGFsbG93cyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgdG8gYWN0IGFzIHNldmVyYWwgZGlmZmVyZW50IHJvbGVzLCBhbmQgZm9yIGEgcm9sZSB0byBiZSBwbGF5ZWQgYnkgc2V2ZXJhbCBpbmRpdmlkdWFscy4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2RpZmllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzcG9uc2libGVGb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFydGlmYWN0RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYnJpZWZPdXRsaW5lIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhpcyBhcnRpZmFjdC4gRm9yIGV4YW1wbGUsIGRpc2N1c3NlcyB0aGUgY29udGVudHMgZm9yIGtleSBjaGFwdGVycyBvZiBhIGRvY3VtZW50IGFydGlmYWN0IG9yIHRoZSBrZXkgcGFja2FnZXMgYW5kIG1vZHVsZXMgb2YgYSBtb2RlbCBhcnRpZmFjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVwcmVzZW50YXRpb25PcHRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXByZXNlbnRhdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub3RhdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB3aHkgdGhlIHdvcmsgcHJvZHVjdCBpcyBwcm9kdWNlZCBhbmQgdG8gd2hhdCB1c2UgaXQgd2lsbCBiZSBwdXQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcGFjdE9mTm90SGF2aW5nIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVhc29uc0Zvck5vdE5lZWRpbmciIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbERlc2NyaXB0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhY2thZ2luZ0d1aWRhbmNlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJza2lsbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJMaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFzc2lnbm1lbnRBcHByb2FjaGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgZ3VpZGFuY2Ugb24gZm9yIGFzc2lnbmluZyBpbmRpdmlkdWFscyB0byB0aGUgUm9sZSBpbiB0ZXJtcyBvZiB3aGF0IG90aGVyIHJvbGVzIHRoZXNlIGluZGl2aWR1YWxzIGNvdWxkIHBlcmZvcm0gYW5kIHdoYXQgcmVzcG9uc2liaWxpdHkgZGlmZmVyZW50IGluZGl2aWR1YWxzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZSBtaWdodCBoYXZlLiAgVGhlIGd1aWRhbmNlIGNhbiBhbHNvIGRlc2NyaWJlIGRpZmZlcmVudCBhc3NpZ25tZW50IGFwcHJvYWNoZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cywgZS5nLiBmb3IgbGFyZ2UgdmVyc3VzIHNtYWxsIHRlYW1zIHdoZXJlIGluZGl2aWR1YWxzIGNvdWxkIGJlIGFsbG9jYXRlZCB0byByb2xlcyBmdWxsIHRpbWUgdmVyc3VzIHNoYXJpbmcgcm9sZXMgd2l0aGluIHRoZSB0ZWFtLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzeW5vbnltcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbHRlcm5hdGl2ZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBhY2hpZXZpbmcgdGhpcyBUYXNrJ3MgZGV2ZWxvcG1lbnQgZ29hbHMgdGhhdCB3ZXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBUYXNrJ3MgU3RlcHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRhbmNlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdHRhY2htZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFkZGl0aW9uYWxJbmZvIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW55IGFkZGl0aW9uYWwgSW5mb3JtYXRpb24gbm90IGNvdmVyZWQgYnkgdGhlIG90aGVyIGF0dHJpYnV0ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2JsZW0iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRoZSBQcmFjdGljZSBhZGRyZXNzZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJhY2tncm91bmQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdvYWxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFwcGxpY2F0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIGhvdyB0aGUgUHJhY3RpY2UgaXMgYmVpbmcgYXBwbGllZCBvciBpbnRyb2R1Y2VkIGludG8gdGhlIGNvbnRleHQgZGVzY3JpYmVkIGluIGJhY2tncm91bmQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsc09mQWRvcHRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlU2V0IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvbGUgU2V0IG9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICZxdW90O0FuYWx5c3RzJnF1b3Q7IFJvbGUgU2V0IGNvdWxkIGdyb3VwIHRoZSAmcXVvdDtCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QmcXVvdDssICZxdW90O1N5c3RlbSBBbmFseXN0JnF1b3Q7LCBhcyB3ZWxsIGFzICZxdW90O1JlcXVpcmVtZW50cyBTcGVjaWZpZXImcXVvdDsgcm9sZXMuICBBbGwgb2YgdGhlc2Ugd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQgaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBhcmUgcmVxdWlyZWQgYXMgZGlzdGluY3Qgcm9sZXMgZm9yIGEgbWV0aG9kIChlLmcuIHRoZSBtZXRob2QgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgaXMgYmFzZWQgb24pLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRDYXRlZ29yeSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGVudCBDYXRlZ29yeSBpcyBhbiBhYnN0cmFjdCBjbGFzcyBnZW5lcmFsaXppbmcgY29udGVudCBjYXRlZ29yeSB0eXBlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRG9tYWluIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEb21haW4gaXMgYSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuJiN4QTtEb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtQcm9kdWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViZG9tYWlucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRG9tYWluIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdFR5cGUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgUHJvZHVjdCBUeXBlIGlzIGEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAmcXVvdDtDbGFzcyBEaWFncmFtJnF1b3Q7LCB3aGljaCBjYXRlZ29yaXplcyB0aGUgQXJ0aWZhY3RzIEFuYWx5c2lzIE1vZGVsLCBEZXNpZ24gTW9kZWwsIFVzZXIgRXhwZXJpZW5jZSBNb2RlbCwgb3IgJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb25zIHRoYXQgZGVmaW5lIGEgc3lzdGVtIHdpdGggYSB3ZWxsLWRlZmluZWQgc3lzdGVtIGJvdW5kYXJ5LCBzdWNoIGFzIHVzZSBjYXNlIG9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb24uICBBIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBjYW4gYmUgY2F0ZWdvcml6ZWQgYXMgYSBTcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgRGlhZ3JhbSBXb3JrIFByb2R1Y3QgVHlwZS4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JrUHJvZHVjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpc2NpcGxpbmVHcm91cGluZyIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGlzY2lwbGluZSBHcm91cGluZ3MgYXJlIHVzZWQgdG8gZ3JvdXAgRGlzY2lwbGluZXMuICBGb3IgZXhhbXBsZSwgdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgJnF1b3Q7U29mdHdhcmUgRGlzY2lwbGluZXMmcXVvdDsgd291bGQgYmUgdGhlIGdyb3VwIG9mIGFsbCBkaXNjaXBsaW5lcyByZWxhdGVkIHRvIGRldmVsb3Bpbmcgc29mdHdhcmUgc3VjaCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgTWFuYWdlbWVudCZxdW90OyBvciAmcXVvdDtUZXN0aW5nJnF1b3Q7OyAmcXVvdDtJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50JnF1b3Q7IHdvdWxkIGJlIGEgRGlzY2lwbGluZXMgR3JvdXBpbmcgZm9yIGRpc2NpcGxpbmVzIHN1Y2ggYXMgJnF1b3Q7SVQgT3BlcmF0aW9uYWwgU2VydmljZXMmcXVvdDssICZxdW90O0lUIEN1c3RvbWVyIFJlbGF0aW9uc2hpcHMmcXVvdDssIG9yICZxdW90O0lUIEVuYWJsaW5nIFNlcnZpY2VzJnF1b3Q7LiAgRGlzY2lwbGluZXMgY2FuIGJlIGFzc29jaWF0ZWQgdG8gbW9yZSB0aGFuIG9uZSBEaXNjaXBsaW5lIEdyb3VwaW5nLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpc2NpcGxpbmVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaXNjaXBsaW5lIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpc2NpcGxpbmUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGlzY2lwbGluZSBpcyBhIGNhdGVnb3JpemF0aW9uIG9mIHdvcmsgKGkuZS4gVGFza3MgZm9yIE1ldGhvZCBDb250ZW50KSwgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4mI3hBO0EgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC4mI3hBOyYjeEQ7JiN4QTtEaXNjaXBsaW5lIGlzIGEgY2F0ZWdvcml6YXRpb24gb2YgVGFza3MgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4gIFRoaXMgaXMgdGhlIGV4dGVuc2lvbnMgb2YgRGlzY2lwbGluZSBkZWZpbmVkIGluIHRoZSBNZXRob2QgQ29yZSBwYWNrYWdlIGFkZGluZyBhbiBhZGRpdGlvbmFsIGFzc29jaWF0aW9uIHRvIEFjdGl2aXRpZXMsIHdoaWNoIHJlcHJlc2VudCB0eXBpY2FsIHN0YW5kYXJkIG9yIHJlZmVyZW5jZSB3YXlzIG9mIG1lYW5pbmdmdWwgZ3JvdXBpbmdzIG9mIHRoZSBEaXNjaXBsaW5lJ3MgVGFza3MgaW50byB3b3JrZmxvd3MuJiN4QTtUYXNrcyByZXByZXNlbnQgZGVzY3JpcHRpb25zIG9mIHdvcmssIHdoaWNoIGFyZSBjYXRlZ29yaXplZCBieSBEaXNjaXBsaW5lcy4gIFRoZSByZWFzb24gdGhhdCBzZXZlcmFsIFRhc2tzIGFyZSBhbGwgY2F0ZWdvcml6ZWQgYnkgdGhlIHNhbWUgRGlzY2lwbGluZSBpcyB0aGF0IHRoZXkgYWxsIHJlcHJlc2VudCBhIHBhcnQgaW4gYWNoaWV2aW5nIGEgaGlnaGVyIGdvYWwgb3IgcGVyZm9ybWluZyB3b3JrIHRoYXQgaXMgYWxsIHJlbGF0ZWQgdG8gZWFjaCBvdGhlci4gIEV2ZXJ5IERpc2NpcGxpbmUgZGVmaW5lcyBzdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIGl0IGNhdGVnb3JpemVzLiAgU3VjaCBzdGFuZGFyZCB3YXlzIGFyZSBleHByZXNzIGJ5IEFjdGl2aXRpZXMgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBkZWZpbmluZyBob3cgdGhlIFRhc2tzIGNhdGVnb3JpemVkIGJ5IHRoZSBEaXNjaXBsaW5lICd3b3JrIHRvZ2V0aGVyJyBpbiB0aGUgbW9zdCBnZW5lcmljIHdheS4gIFRoZXNlIHJlZmVyZW5jZSB3b3JrZmxvd3MgYXJlIG9mdGVuIHVzZWQgZm9yIGVkdWNhdGluZyBhbmQgdGVhY2hpbmcgcHJhY3RpdGlvbmVycy4gJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFza3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2siLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViZGlzY2lwbGluZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlzY2lwbGluZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlV29ya2Zsb3dzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BY3Rpdml0eSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50ICMvL0Z1bGZpbGxhYmxlRWxlbWVudCAjLy9WYXJpYWJpbGl0eUVsZW1lbnQgIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIEFjdGl2aXR5IGlzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4mI3hBO0FjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LiYjeEE7JiN4RDsmI3hBO1RoaXMgZGVmaW5pdGlvbiBvZiBBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IGludHJvZHVjZWQgaW4gdGhlIHBhY2thZ2UgQnJlYWtkb3duIHdpdGggbmV3IGNhcGFiaWxpdGllcyBhbmQgaXMgdGhlIGJhc2lzIGZvciB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY2xhc3MgUHJvY2Vzcy4mI3hBO0V4dGVuZHMgQWN0aXZpdHkgd2l0aCBhbiBhc3NvY2lhdGlvbiB0byBSb2FkbWFwLiAgVGhpcyBkZWZpbml0aW9uIG9mIEFjdGl2aXR5IGFsc28gcGFydGljaXBhdGVzIGluIHRoZSBleHRlbnNpb24gb2YgdGhlIERpc2NpcGxpbmUgY2F0ZWdvcnkuJiN4QTsmI3hEOyYjeEE7QWN0aXZpdHkgaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBpbmhlcml0cyBmcm9tIFZhcmlhYmlsaXR5IEVsZW1lbnQgdG8gZXh0ZW5kIEFjdGl2aXR5IHdpdGggbmV3IGNhcGFiaWxpdGllcyBmb3IgdmFyaWFiaWxpdHkuJiN4RDsmI3hBO0FjdGl2aXR5IGluaGVyaXRzIHRoZSBzZW1hbnRpY3Mgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCB3aGljaCBwcm92aWRlcyBrZXkgbWVjaGFuaXNtIHRvIGVuYWJsZSBkeW5hbWljIGJpbmRpbmcgb2YgQ2FwYWJpbGl0eSBQYXR0ZXJucyBpbiBQcm9jZXNzZXMgYXMgd2VsbCBhcyBQcm9jZXNzIENvbnRyaWJ1dGlvbnMuICBWYXJpYWJpbGl0eSBpcyB1c2VkIGluIHRoZSBmb2xsb3dpbmcgd2F5IGZvciBBY3Rpdml0aWVzOiYjeEQ7JiN4QTstIEV4dGVuZDogVG8gYXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gYSBwcm9jZXNzIG9uZSB3b3VsZCBjcmVhdGUgYW4gQWN0aXZpdHkgd2hpY2ggZXh0ZW5kcyB0aGUgcGF0dGVybidzIHRvcC1sZXZlbCBhY3Rpdml0eS4gIFRocm91Z2ggZXh0ZW5zaW9uIHRoZSBleHRlbmRpbmcgQWN0aXZpdHkgaW5oZXJpdHMgdGhlIHBhdHRlcm5zIEJyZWFrZG93biBFbGVtZW50cy4mI3hEOyYjeEE7LSBSZXBsYWNlOiBUbyByZXBsYWNlIGFuIEFjdGl2aXR5IG9mIGFuIGFwcGxpZWQgQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIGFuIGV4aXN0aW5nIHByb2Nlc3MgZm9yIHdoaWNoIG9uZSBkZXZlbG9wcyBhIFByb2Nlc3MgQ29udHJpYnV0aW9uIChvciBhIGNvbWJpbmF0aW9uIG9mIGJvdGgpIG9uZSB3b3VsZCBjcmVhdGUgYW4gQWN0aXZpdHkgYW5kIHNwZWNpZnkgdGhlIHJlcGxhY2UgdmFyaWFiaWxpdHkgc3BlY2lhbGl6YXRpb24gYmV0d2VlbiB0aGVtLiYjeEQ7JiN4QTstIENvbnRyaWJ1dGU6IFRvIGNvbnRyaWJ1dGUgbmV3IEJyZWFrZG93biBFbGVtZW50cyB0byBhbiBleGlzdGluZyBBY3Rpdml0eSBvbmUgd291bGQgZGVmaW5lIGFuIEFjdGl2aXR5IHdpdGggQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVsYXRlcyB2aWEgdGhlIENvbnRyaWJ1dGVzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHRvIHRoaXMgZXhpc3RpbmcgQWN0aXZpdHkuICBUaGUgY29udHJpYnV0aW5nIEFjdGl2aXR5J3MgQnJlYWtkb3duIEVsZW1lbnRzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbnRyaWJ1dGVkIEFjdGl2aXR5LiYjeEQ7JiN4QTsmI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJyZWFrZG93bkVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0JyZWFrZG93bkVsZW1lbnQvc3VwZXJBY3Rpdml0aWVzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvYWRtYXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2FkbWFwIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtCcmVha2Rvd25FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaXMgYSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNSZXBlYXRhYmxlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0Jvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgcmVwZXRpdGlvbiBvZiB3b3JrLCBlLmcuIGl0ZXJhdGlvbnMuICBBIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIHdpdGggdGhpcyBhdHRyaWJ1dGUgc2V0IHRvIFRydWUgc2hhbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgc2V0IG9mIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBmb3IgYW4gaW5zdGFuY2Ugb2YgSXRlcmF0aW9uIChkZWZpbmVkIGFzIGEgc3BlY2lhbCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBiZWxvdykgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgYnkgZGVmYXVsdCBpbmRpY2F0aW5nIHRoYXQgZXZlcnkgc3ViLUFjdGl2aXR5IHdpbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBIb3dldmVyLCBhbnkgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY2FuIHNldCB0aGlzIGF0dHJpYnV0ZSB0byBUcnVlIHRvIGRlZmluZSBpdGVyYXRpb25zIChlLmcuIHRvIGl0ZXJhdGUgb25lIEFjdGl2aXR5IGNvbnNpc3Rpbmcgb2YgbWFueSBzdWItYWN0aXZpdGllcyBvciBldmVuIFBoYXNlcywgYnV0IHRvIGl0ZXJhdGUganVzdCBvbmUgVGFzaykuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzT25nb2luZyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Cb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0V2ZW50RHJpdmVuIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0Jvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLiYjeEE7JiN4QTsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsaW5rVG9QcmVkZWNlc3NvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya09yZGVyIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkJyZWFrZG93biBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlZml4IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gJnF1b3Q7U1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMmcXVvdDsgd2l0aCBTUkEgaW5kaWNhdGluZyB0aGF0IHRoaXMgQWN0aXZpdHkgYmVsb25ncyB0byB0aGUgJnF1b3Q7U29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzJnF1b3Q7IG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICZxdW90O0N1c3RvbWVyLkFyY2hpdGVjdCZxdW90OyB3b3VsZCBkZWZpbmUgYSAmcXVvdDtDdXN0b21lciZxdW90OyBwcmVmaXggZm9yIHRoZSBSb2xlIERlc2NyaXB0b3IgJnF1b3Q7QXJjaGl0ZWN0JnF1b3Q7IGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuJiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNQbGFubmVkIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0Jvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuJiN4QTsmI3hBOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhhc011bHRpcGxlT2NjdXJyZW5jZXMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJKdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICZxdW90O0RldGFpbCBVc2UgQ2FzZSZxdW90OyB3b3VsZCBiZSBwZXJmb3JtZWQgZm9yIGV2ZXJ5IHVzZSBjYXNlIGlkZW50aWZpZWQgZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gb3IgQWN0aXZpdHkuICBHZW5lcmF0aW5nIGEgcGxhbiB3b3VsZCBsaXN0IG9uZSBUYXNrIGluc3RhbmNlIHBlciB1c2UgY2FzZS4mI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09wdGlvbmFsIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0Jvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGlzT3B0aW9uYWwgYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBCcmVha2Rvd24gRWxlbWVudCBkZXNjcmliZXMgd29yaywgYSB3b3JrIHJlc3VsdCwgb3IgZXZlbiB3b3JrIHJlc291cmNlcywgd2hpY2ggaW5jbHVzaW9uIGlzIG5vdCBtYW5kYXRvcnkgd2hlbiBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGlzIHBsYW5uZWQgYmFzZWQgb24gYSBwcm9jZXNzIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50ZWRBZnRlciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRlZEJlZm9yZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBsYW5uaW5nRGF0YSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9QbGFubmluZ0RhdGEiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cGVyQWN0aXZpdGllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9BY3Rpdml0eSIgZU9wcG9zaXRlPSIjLy9BY3Rpdml0eS9icmVha2Rvd25FbGVtZW50cyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGVja2xpc3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DaGVja2xpc3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uY2VwdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbmNlcHQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhhbXBsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0V4YW1wbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3VpZGVsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJldXNhYmxlQXNzZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZW1wbGF0ZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RlbXBsYXRlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlcG9ydHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JlcG9ydCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sbWVudG9yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Ub29sTWVudG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvY2VzcyBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuJiN4QTtQcm9jZXNzIEVsZW1lbnRzIHJlcHJlc2VudHMgUHJvY2VzcyBzcGVjaWZpYyBlbGVtZW50cyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQgZnJvbSBDb250ZW50IEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4gJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGxhbm5pbmdEYXRhIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlBsYW5uaW5nIERhdGEgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4mI3hBO1BsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4mI3hBOyhOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnREYXRlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBzdGFydCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2hEYXRlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFuayIgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya09yZGVyIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgT3JkZXIgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnRzIGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudHMgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gICYjeEE7KE5vdGUsIFdvcmsgT3JkZXIgaXMgbm90IG1vZGVsZWQgYXMgYW4gQXNzb2NpYXRpb24gQ2xhc3MgdG8gcHJvdmlkZSBhIHN0cmFpZ2h0Zm9yd2FyZCBtYXBwaW5nICB0byBYTUkgYW5kIEVNRi4pJiN4QTtUaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxpbmtUeXBlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1dvcmtPcmRlclR5cGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZpbmlzaFRvU3RhcnQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZCIgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IldvcmtPcmRlclR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgT3JkZXIgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChCKSBiZWxvdykgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChBKSBiZWxvdykgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZpbmlzaFRvU3RhcnQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJCcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IHN0YXJ0IHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBmaW5pc2hlcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBCcmVha2Rvd24gRWxlbWVudHMsICZxdW90O0NvbnN0cnVjdCBmZW5jZSZxdW90OyBhbmQgJnF1b3Q7UGFpbnQgZmVuY2UsJnF1b3Q7ICZxdW90O1BhaW50IGZlbmNlJnF1b3Q7IGNhbid0IHN0YXJ0IHVudGlsICZxdW90O0NvbnN0cnVjdCBmZW5jZSZxdW90OyBmaW5pc2hlcy4gVGhpcyBpcyB0aGUgbW9zdCBjb21tb24gdHlwZSBvZiBkZXBlbmRlbmN5IGFuZCB0aGUgZGVmYXVsdCBmb3IgYSBuZXcgV29yayBPcmRlciBpbnN0YW5jZS4mI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJmaW5pc2hUb0ZpbmlzaCIgdmFsdWU9IjEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJCcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IGZpbmlzaCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgZmluaXNoZXMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0d28gQnJlYWtkb3duIEVsZW1lbnRzLCAmcXVvdDtBZGQgd2lyaW5nJnF1b3Q7IGFuZCAmcXVvdDtJbnNwZWN0IGVsZWN0cmljYWwsJnF1b3Q7ICZxdW90O0luc3BlY3QgZWxlY3RyaWNhbCZxdW90OyBjYW4ndCBmaW5pc2ggdW50aWwgJnF1b3Q7QWRkIHdpcmluZyZxdW90OyBmaW5pc2hlcy4mI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvU3RhcnQiIHZhbHVlPSIyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBzdGFydCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgc3RhcnRzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIEJyZWFrZG93biBFbGVtZW50cywgJnF1b3Q7UG91ciBmb3VuZGF0aW9uJnF1b3Q7IGFuZCAmcXVvdDtMZXZlbCBjb25jcmV0ZSwmcXVvdDsgJnF1b3Q7TGV2ZWwgY29uY3JldGUmcXVvdDsgY2FuJ3QgYmVnaW4gdW50aWwgJnF1b3Q7UG91ciBmb3VuZGF0aW9uJnF1b3Q7IGJlZ2lucy4mI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvRmluaXNoIiB2YWx1ZT0iMyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3QgZmluaXNoIHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBzdGFydHMuIFRoaXMgZGVwZW5kZW5jeSB0eXBlIGNhbiBiZSB1c2VkIGZvciBqdXN0LWluLXRpbWUgc2NoZWR1bGluZyB1cCB0byBhIG1pbGVzdG9uZSBvciB0aGUgcHJvamVjdCBmaW5pc2ggZGF0ZSB0byBtaW5pbWl6ZSB0aGUgcmlzayBvZiBhIEJyZWFrZG93biBFbGVtZW50IGZpbmlzaGluZyBsYXRlIGlmIGl0cyBkZXBlbmRlbnQgQnJlYWtkb3duIEVsZW1lbnRzIHNsaXAuIElmIGEgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudCBuZWVkcyB0byBmaW5pc2ggYmVmb3JlIHRoZSBtaWxlc3RvbmUgb3IgcHJvamVjdCBmaW5pc2ggZGF0ZSwgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyIGV4YWN0bHkgd2hlbiBhbmQgeW91IGRvbid0IHdhbnQgYSBsYXRlIGZpbmlzaCB0byBhZmZlY3QgdGhlIGp1c3QtaW4tdGltZSBCcmVha2Rvd24gRWxlbWVudCwgeW91IGNhbiBjcmVhdGUgYW4gU0YgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSBCcmVha2Rvd24gRWxlbWVudCB5b3Ugd2FudCBzY2hlZHVsZWQganVzdCBpbiB0aW1lICh0aGUgcHJlZGVjZXNzb3IpIGFuZCBpdHMgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudCAodGhlIHN1Y2Nlc3NvcikuIFRoZW4gaWYgeW91IHVwZGF0ZSBwcm9ncmVzcyBvbiB0aGUgc3VjY2Vzc29yIEJyZWFrZG93biBFbGVtZW50LCBpdCB3b24ndCBhZmZlY3QgdGhlIHNjaGVkdWxlZCBkYXRlcyBvZiB0aGUgcHJlZGVjZXNzb3IgQnJlYWtkb3duIEVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9hZG1hcCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvYWRtYXAgaXMgYSBzcGVjaWFsIEd1aWRhbmNlIFR5cGUgd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4mI3hBO0FuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUb29sIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRvb2wgaXMgYSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idG9vbE1lbnRvcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rvb2xNZW50b3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZVNldEdyb3VwaW5nIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSb2xlIFNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gUm9sZSBTZXQgR3JvdXBpbmdzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBtZXRob2RzIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cywgd2hpY2ggaG93ZXZlciBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiAgVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLCBmb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIFNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBPcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvbGVTZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlU2V0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkN1c3RvbUNhdGVnb3J5IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIEN1c3RvbSBDYXRlZ29yeSBpcyBhIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgJnF1b3Q7VGVzdGluZyZxdW90OyBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhdGVnb3JpemVkRWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJDYXRlZ29yaWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kUGFja2FnZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFBhY2thZ2UgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2xvYmFsIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0Jvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTWV0aG9kIFBhY2thZ2VzIGNhbiBoYXZlIGEgZ2xvYmFsIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGV2ZXJ5IGVsZW1lbnQgb2YgZXZlcnkgb3RoZXIgTWV0aG9kIFBhY2thZ2UgY2FuIHNlZSB0aGUgZ2xvYmFsIHBhY2thZ2UncyBjb250ZW50cy4gIEdsb2JhbCBNZXRob2QgUGFja2FnZXMgYXJlIHByaW1hcmlseSB1c2VkIHRvIHN0b3JlIGNvbW1vbmx5IHVzZWQgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgc3VjaCBhcyBmb3IgRGlzY2lwbGluZXMgb3IgRG9tYWlucywgd2hpY2ggYXJlIHVzZWQgYnkgbWFueSBUYXNrIGFuZCBXb3JrIFByb2R1Y3RzIHJlc3BlY3RpdmVseS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmV1c2VkUGFja2FnZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hpbGRQYWNrYWdlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudFBhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RQYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbnRlbnQgUGFja2FnZSBpcyBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250ZW50RWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNaWxlc3RvbmUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNaWxlc3RvbmUgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXF1aXJlZFJlc3VsdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZpdHlFbnRyeVN0YXRlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gICYjeEE7Rm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLiYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuJiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uJiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iV29ya1Byb2R1Y3QiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW1wYWN0ZWRCeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltcGFjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0ZWRCeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyYWJsZVBhcnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpcHRvciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlc2NyaXB0b3IgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLiYjeEE7RGVzY3JpcHRvcnMgYXJlIHRoZSBrZXkgY29uY2VwdCBmb3IgcmVhbGl6aW5nIHRoZSBzZXBhcmF0aW9uIG9mIHByb2Nlc3NlcyBmcm9tIG1ldGhvZCBjb250ZW50LiAgQSBEZXNjcmlwdG9yIGNhbiBiZSBjaGFyYWN0ZXJpemVkIGFzIGEgcmVmZXJlbmNlIG9iamVjdCBmb3Igb25lIHBhcnRpY3VsYXIgQ29udGVudCBFbGVtZW50LCB3aGljaCBoYXMgaXRzIG93biByZWxhdGlvbnNoaXBzIGFuZCBwcm9wZXJ0aWVzLiAgV2hlbiBhIERlc2NyaXB0b3IgaXMgY3JlYXRlZCBpdCBzaGFsbCBiZSBwcm92aWRlZCB3aXRoIGNvbmdydWVudCBjb3BpZXMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBmb3IgdGhlIHJlZmVyZW5jZWQgY29udGVudCBlbGVtZW50LiAgSG93ZXZlciwgYSB1c2VyIGNhbiBtb2RpZnkgdGhlc2UgcmVsYXRpb25zaGlwcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBzaXR1YXRpb24gZm9yIHdoaWNoIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQuICYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Cb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikl0ZXJhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJdGVyYXRpb24gaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4mI3hBO0l0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKSYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBoYXNlIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlBoYXNlIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ1BoYXNlJykgYW5kIGlzUmVwZWF0YWJsZSAoJ0ZhbHNlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuJiN4QTtQaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUZWFtUHJvZmlsZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGVhbSBQcm9maWxlIGlzIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBncm91cHMgUm9sZSBEZXNjcmlwdG9ycyBvciBSZXNvdXJjZSBEZWZpbml0aW9ucyBkZWZpbmluZyBhIG5lc3RlZCBoaWVyYXJjaHkgb2YgdGVhbXMgYW5kIHRlYW0gbWVtYmVycy4mI3hBO1dvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4mI3hBO0hlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZWFtUm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cGVyVGVhbSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9UZWFtUHJvZmlsZSIgZU9wcG9zaXRlPSIjLy9UZWFtUHJvZmlsZS9zdWJUZWFtIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlRlYW0iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RlYW1Qcm9maWxlIiBlT3Bwb3NpdGU9IiMvL1RlYW1Qcm9maWxlL3N1cGVyVGVhbSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9sZSBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBSb2xlIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBSb2xlIERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iUm9sZSIgb3JkZXJlZD0iZmFsc2UiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZGlmaWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc3BvbnNpYmxlRm9yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza0Rlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCAjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRhc2sgRGVzY3JpcHRvciBpcyBhIERlc2NyaXB0b3IgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4mI3hBO0Ega2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLiYjeEE7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iVGFzayIgb3JkZXJlZD0iZmFsc2UiIGVUeXBlPSIjLy9UYXNrIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3Npc3RlZEJ5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlcm5hbElucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFuZGF0b3J5SW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvcHRpb25hbElucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0cHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyZm9ybWVkUHJpbWFyaWx5QnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlbGVjdGVkU3RlcHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29tcG9zaXRlUm9sZSIgZVN1cGVyVHlwZXM9IiMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbXBvc2l0ZSBSb2xlIGlzIGEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLiYjeEE7QSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWdncmVnYXRlZFJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJ5UHJvY2VzcyIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVsaXZlcnkgUHJvY2Vzc2VzIGlzIGEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLiYjeEE7QSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWR1Y2F0aW9uTWF0ZXJpYWxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgaXMgYSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5LiYjeEE7Q29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLiYjeEE7JiN4RDsmI3hBO1Byb2Nlc3MgaW4gdGhlIHBhY2thZ2UgTGlicmFyeSBDb25maWd1cmF0aW9uIGV4dGVuZHMgdGhlIGNsYXNzIFByb2Nlc3Mgd2l0aCBhc3NvY2lhdGlvbiByZWxhdGluZyBhIFByb2Nlc3MgdG8gb25lIGRlZmF1bHQgYW5kIG1hbnkgb3B0aW9uYWwgdmFsaWQgQ29uZmlndXJhdGlvbnMuJiN4QTtUaGVzZSBjb25maWd1cmF0aW9ucyBkZXNjcmliZSB2YWxpZCBjb250ZXh0cyBmb3IgdGhlIFByb2Nlc3Mgd2l0aGluIGEgTWV0aG9kIExpYnJhcnkgaW5kaWNhdGluZyB1bmRlciB3aGljaCBDb25maWd1cmF0aW9ucyBhIFByb2Nlc3MgaXMgd2VsbCBkZWZpbmVkLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluY2x1ZGVzUGF0dGVybnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NhcGFiaWxpdHlQYXR0ZXJuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlZmF1bHRDb250ZXh0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsaWRDb250ZXh0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJuIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgUGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIERpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLiYjeEE7QSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6JiN4QTstIFRvIHNlcnZlIGFzIGJ1aWxkaW5nIGJsb2NrcyBmb3IgYXNzZW1ibGluZyBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMuICBOb3JtYWxseSBkZXZlbG9waW5nIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBub3QgZG9uZSBmcm9tIHNjcmF0Y2ggYnV0IGJ5IHN5c3RlbWF0aWNhbGx5IGFwcGx5aW5nIGFuZCBiaW5kaW5nIHBhdHRlcm5zLiAgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIHBhdHRlcm4gYXBwbGljYXRpb24gb2YgJ2NvcHktYW5kLW1vZGlmeScsIHdoaWNoIGFsbG93cyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBpbmRpdmlkdWFsbHkgY3VzdG9taXplIHRoZSBwYXR0ZXJuJ3MgY29udGVudCB0byB0aGUgcGFydGljdWxhciBzaXR1YXRpb24gaXQgaXMgYXBwbGllZCBmb3IsIHRoZSBQbHVnaW4gbWV0YS1tb2RlbCBwYWNrYWdlIChTZWN0aW9uIDYuMSkgaW50cm9kdWNlcyBldmVuIG1vcmUgc29waGlzdGljYXRlZCBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIHRoYXQgc3VwcG9ydCBkeW5hbWljIGJpbmRpbmcgb2YgcGF0dGVybnMgKGkuZS4gdGhlIHBhdHRlcm4gaXMgcmVmZXJlbmNlZCBhbmQgbm90IGNvcGllZCkuICBUaGlzIHVuaXF1ZSBuZXcgd2F5IG9mIHJldXNpbmcgcHJvY2VzcyBrbm93bGVkZ2UgYWxsb3dzIHRvIGZhY3RvciBvdXQgY29tbW9ubHkgcmVvY2N1cnJpbmcgQWN0aXZpdGllcyBpbnRvIHBhdHRlcm5zIGFuZCB0byBhcHBseSB0aGVtIG92ZXIgYW5kIG92ZXIgYWdhaW4gZm9yIGEgcHJvY2Vzcy4gIFdoZW4gdGhlIHBhdHRlcm4gaXMgYmVpbmcgcmV2aXNlZCBvciB1cGRhdGVkLCBhbGwgY2hhbmdlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkIGluIGFsbCBwYXR0ZXJuIGFwcGxpY2F0aW9uIGluIGFsbCBwcm9jZXNzZXMgYmVjYXVzZSBvZiB0aGUgZHluYW1pYyBiaW5kaW5nLiYjeEE7LSBUbyBzdXBwb3J0IGRpcmVjdCBleGVjdXRpb24gaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoYXQgZG9lcyBub3Qgd29yayBmb2xsb3dpbmcgYSB3ZWxsLWRlZmluZWQgcHJvY2VzcywgYnV0IHdvcmtzIGJhc2VkIG9uIGxvb3NlbHkgY29ubmVjdGVkIHByb2Nlc3MgZnJhZ21lbnRzIG9mIGJlc3QgcHJhY3RpY2VzIGluIGEgZmxleGlibGUgbWFubmVyIChlLmcuIEFnaWxlIERldmVsb3BtZW50KS4mI3hBOy0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBDb25maWd1cmF0aW9uIGlzIGEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQbHVnaW5TZWxlY3Rpb24iCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQYWNrYWdlU2VsZWN0aW9uIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3NWaWV3cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlZmF1bHRWaWV3IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlQ29uZmlndXJhdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VidHJhY3RlZENhdGVnb3J5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWRkZWRDYXRlZ29yeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFBsdWdpbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQgIy8vUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgUGx1Z2luIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLiYjeEE7TWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuJiN4QTtTcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0Jvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGFja2FnZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuJiN4QTtBIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgcmVwcmVzZW50cyBhIHBhcnRpYWxseSBmaW5pc2hlZCBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBJdCB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXMgYWxsIG90aGVyIFByb2Nlc3MgVHlwZXMgdG8gcmVwcmVzZW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBwbGFucy4gIEhvd2V2ZXIsIGNlcnRhaW4gcGxhbm5pbmcgZGVjaXNpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlIHRlbXBsYXRlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQvb3IgcmVmb3JtYXR0ZWQgdG8gYmUgcmVhZHkgZm9yIGV4cG9ydCB0byBhIHNwZWNpZmljIHBsYW5uaW5nIHRvb2wuICBFeGFtcGxlcyBmb3Igc3VjaCBkZWNpc2lvbnMgYXJlOiBhIHRlbXBsYXRlIGhhcyBiZWVuIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgcGxhbiBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBpbiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgd2hpY2ggZnIgZXhhbXBsZSBkaXN0aW5ndWlzaGVzIGVhcmx5IGZyb20gbGF0ZSBpdGVyYXRpb25zIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBvZiBhIHByb2plY3Q7IGlmIHRoZSB0YXJnZXRlZCBwbGFubmluZyB0b29sIGNhbm5vdCByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBvZiBUYXNrLCB0aGVuIHRoZXNlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cnVjdHVyZTsgY2VydGFpbiByZXBldGl0aW9ucyBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkLCBlLmcuIHN0YXRpbmcgdGhhdCBhIGN5Y2xlIG9mIHNwZWNpZmljIFRhc2sgZ3JvdXBlZCBpbiBhbiBBY3Rpdml0eSBoYXZlIHRvIGJlIHJlcGVhdGVkIG4tdGltZXM7IGV0Yy4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlZE9uUHJvY2Vzc2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9jZXNzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByYWN0aWNlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJhY3RpY2UgcmVwcmVzZW50cyBhIHByb3ZlbiB3YXkgb3Igc3RyYXRlZ3kgb2YgZG9pbmcgd29yayB0byBhY2hpZXZlIGEgZ29hbCB0aGF0IGhhcyBhIHBvc2l0aXZlIGltcGFjdCBvbiB3b3JrIHByb2R1Y3Qgb3IgcHJvY2VzcyBxdWFsaXR5LiAgUHJhY3RpY2VzIGFyZSBkZWZpbmVkIG9ydGhvZ29uYWwgdG8gbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLiAgVGhleSBjb3VsZCBzdW1tYXJpemUgYXNwZWN0cyB0aGF0IGltcGFjdCBtYW55IGRpZmZlcmVudCBwYXJ0cyBvZiBhIG1ldGhvZCBvciBzcGVjaWZpYyBwcm9jZXNzZXMuICBFeGFtcGxlcyBmb3IgcHJhY3RpY2VzIHdvdWxkIGJlICZxdW90O01hbmFnZSBSaXNrcyZxdW90OywgJnF1b3Q7Q29udGludW91c2x5IHZlcmlmeSBxdWFsaXR5JnF1b3Q7LCAmcXVvdDtBcmNoaXRlY3R1cmUtY2VudHJpYyBhbmQgY29tcG9uZW50LWJhc2VkIGRldmVsb3BtZW50JnF1b3Q7LCBldGMuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViUHJhY3RpY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9QcmFjdGljZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudFJlZmVyZW5jZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFjdGl2aXR5UmVmZXJlbmNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQWN0aXZpdHkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNhZ2VHdWlkYW5jZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdGVybmF0aXZlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIHRoaXMgQWN0aXZpdHkgbm90IGNvdmVyZWQgYnkgdGhlIEFjdGl2aXR5J3MgVGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhvd3RvU3RhZmYiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjYWxlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyaXNrTGV2ZWwiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyB0eXBpY2FsIHByb2plY3Qgcmlza3MgdGhhdCBhcmUgYWRkcmVzc2VkIHdpdGggdGhpcyBwcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0aW5nVGVjaG5pcXVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvamVjdE1lbWJlckV4cGVydGlzZSIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGEgcHJvZmlsZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0ZWFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHJvbGVzLCBza2lsbHMgcmVxdWlyZWQgZm9yIGEgdGVhbSBwZXJmb3JtcyBhIHByb2plY3QgYmFzZWQgb24gdGhpcyBwcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlT2ZDb250cmFjdCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjb3BlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlTm90ZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWZpbmVkRGVzY3JpcHRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgUHJvY2VzcyBDb21wb25lbnQgYXBwbGljYXRpb24gaW4gYSBQcm9jZXNzLCBpLmUuIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluaW5nIHRoZSBQcm9jZXNzLiAgVGhlIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgZGV0YWlscyBvZiB0aGUgY29tcG9uZW50IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgdG8gcHJvdmlkZSBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzIHN1Y2ggYXMgaXQgb3duIHByZWRlY2Vzc29ycyBhbmQgc3VjY2Vzc29ycy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iX3Byb2Nlc3NDb21wb25lbnQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vUHJvY2Vzc0NvbXBvbmVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50IiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc1BhY2thZ2UgIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBpcyBhIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuJiN4QTtVTUEgc3VwcG9ydHMgcmVwbGFjZWFibGUgYW5kIHJldXNhYmxlIFByb2Nlc3MgQ29tcG9uZW50cyByZWFsaXppbmcgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gQ2VydGFpbiBzaXR1YXRpb25zIGluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCBtaWdodCByZXF1aXJlIHRoYXQgY29uY3JldGUgcmVhbGl6YXRpb25zIG9mIHBhcnRzIG9mIHRoZSBwcm9jZXNzIHJlbWFpbiB1bmRlY2lkZWQgb3Igd2lsbCBiZSBkZWNpZGVkIGJ5IHRoZSBleGVjdXRpbmcgdGVhbSBpdHNlbGYgKGUuZy4gaW4gb3V0c291cmNpbmcgc2l0dWF0aW9ucykuICBVTUEgcHJvdmlkZXMgYSB1bmlxdWUgY29tcG9uZW50IGNvbmNlcHQgZGVmaW5pbmcgaW50ZXJmYWNlcyBmb3Igd29yayBwcm9kdWN0IGlucHV0IGFuZCBvdXRwdXQsIGFsbG93aW5nIHRyZWF0aW5nIHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBvZiB0aGUgd29yayB0aGF0IHByb2R1Y2VzIHRoZSBvdXRwdXRzIGFzIGEgJnF1b3Q7YmxhY2sgYm94JnF1b3Q7LiAgQXQgYW55IHBvaW50IGR1cmluZyBhIHByb2plY3QgdGhlIGNvbXBvbmVudCAmcXVvdDtyZWFsaXphdGlvbiZxdW90OyBkZXRhaWxpbmcgdGhlIHdvcmsgY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGNvbXBvbmVudCBhcHByb2FjaCBhbHNvIGFsbG93cyB0aGF0IGRpZmZlcmVudCBzdHlsZXMgb3IgdGVjaG5pcXVlcyBvZiBkb2luZyB3b3JrIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgY29kZSBvdXRwdXQgb2YgYSBjb21wb25lbnQgY291bGQgYmUgcHJvZHVjZWQgd2l0aCBhIG1vZGVsLWRyaXZlbiBkZXZlbG9wbWVudCBvciBhIGNvZGUtY2VudHJpYyB0ZWNobmlxdWUuICBUaGUgY29tcG9uZW50IGNvbmNlcHQgZW5jYXBzdWxhdGVzIHRoZSBhY3R1YWwgd29yayBhbmQgbGV0cyB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRlY2huaXF1ZSBhbmQgZmlsbCB0aGUgY29tcG9uZW50J3MgcmVhbGl6YXRpb24gd2l0aCB0aGVpciBjaG9pY2Ugb2YgQWN0aXZpdGllcyB0aGF0IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dHMuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1Byb2Nlc3MiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvY2VzcyBQYWNrYWdlIGlzIGEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIFByb2Nlc3MgRWxlbWVudHMsIG9ubHkuJiN4QTtBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3NFbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvY2Vzc0VsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpYWdyYW1zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaWFncmFtIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhOb2RlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbUxpbmsiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW1MaW5rIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1MaW5rL2RpYWdyYW0iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibmFtZXNwYWNlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZGlhZ3JhbSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ6b29tIiBvcmRlcmVkPSJmYWxzZSIgZVR5cGU9IiMvL0RvdWJsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2aWV3cG9pbnQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vUG9pbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhOb2RlIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2l6ZSIgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9EaW1lbnNpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVkIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaWFncmFtRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUVsZW1lbnQvY29udGFpbmVyIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBvc2l0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1BvaW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxpbmsiIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW1MaW5rIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtTGluay9ncmFwaEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYW5jaG9yYWdlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HcmFwaENvbm5lY3RvciIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlbWFudGljTW9kZWwiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9ncmFwaEVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlhZ3JhbUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzVmlzaWJsZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Cb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L2NvbnRhaW5lZCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWZlcmVuY2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JlZmVyZW5jZSIgZU9wcG9zaXRlPSIjLy9SZWZlcmVuY2UvcmVmZXJlbmNlZCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9wZXJ0eSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvcGVydHkiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlZmVyZW5jZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24iCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlZCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9EaWFncmFtRWxlbWVudCIgZU9wcG9zaXRlPSIjLy9EaWFncmFtRWxlbWVudC9yZWZlcmVuY2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvcGVydHkiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImtleSIgb3JkZXJlZD0iZmFsc2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb2ludCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IngiIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRG91YmxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InkiIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRG91YmxlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW1MaW5rIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ6b29tIiBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0RvdWJsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2aWV3cG9ydCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Qb2ludCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0RpYWdyYW0iIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbS9kaWFncmFtTGluayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVsZW1lbnQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9saW5rIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoQ29ubmVjdG9yIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFZGdlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HcmFwaEVkZ2UiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFZGdlL2FuY2hvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVsZW1lbnQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9hbmNob3JhZ2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhFZGdlIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2F5cG9pbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMiIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qb2ludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYW5jaG9yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMiIgdXBwZXJCb3VuZD0iMiIgZVR5cGU9IiMvL0dyYXBoQ29ubmVjdG9yIiBlT3Bwb3NpdGU9IiMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWRnZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZW1hbnRpY01vZGVsQnJpZGdlIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZXNlbnRhdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW0iIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbS9uYW1lc3BhY2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvc2VtYW50aWNNb2RlbCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaW1lbnNpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3aWR0aCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Eb3VibGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGVpZ2h0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0RvdWJsZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2UgY29tcHJpc2VzIG9mIGEgbGlzdCBvZiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgKHNpbWlsYXIgdG8gb3BlcmF0aW9uIGRlY2xhcmF0aW9ucykgdGhhdCBleHByZXNzIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudC4gIFRoZXNlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyBhcmUgZXhwcmVzc2VkIHVzaW5nIFRhc2sgRGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBhIFJvbGUgRGVzY3JpcHRvci4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VJTyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlSW5mbyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vTWV0aG9kRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSIgZVN1cGVyVHlwZXM9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbGVtZW50IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0VsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTGVhZkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUZXh0RWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL0xlYWZFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGV4dCIgb3JkZXJlZD0iZmFsc2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbWFnZSIgZVN1cGVyVHlwZXM9IiMvL0xlYWZFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJpIiBvcmRlcmVkPSJmYWxzZSIgZVR5cGU9IiMvL1VyaSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaW1lVHlwZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaGljUHJpbWl0aXZlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0xlYWZFbGVtZW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUG9seWxpbmUiIGVTdXBlclR5cGVzPSIjLy9HcmFwaGljUHJpbWl0aXZlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2xvc2VkIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0Jvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2F5cG9pbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMiIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qb2ludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRWxsaXBzZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoaWNQcmltaXRpdmUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjZW50ZXIiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vUG9pbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFkaXVzWCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Eb3VibGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFkaXVzWSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Eb3VibGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm90YXRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vRG91YmxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0QW5nbGUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vRG91YmxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVuZEFuZ2xlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0RvdWJsZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRmFtaWx5IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZWxpdmVyeSBNb2RlbCBGYW1pbHkgaXMgYSBjb252ZW5pZW50IGdyb3VwaW5nIG9mIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyBvZiBpbnRlcmVzdCB0byBzb21lIHNwZWNpZmljIHVzZXIgY29tbXVuaXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyeVByb2Nlc3NlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGVsaXZlcnlQcm9jZXNzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZExpYnJhcnkiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQbHVnaW5zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlZmluZWRDb25maWd1cmF0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNS91bWEuZ2VubW9kZWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC41L3VtYS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3YTBhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC41L3VtYS5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSJvcmcuZWNsaXBzZS51bWEiIHRlbXBsYXRlRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMiCi0gICAgcnVudGltZUphcj0idHJ1ZSIgZHluYW1pY1RlbXBsYXRlcz0idHJ1ZSIgbW9kZWxOYW1lPSJVbWEiIG1vZGVsUGx1Z2luQ2xhc3M9IiIKLSAgICBub25OTFNNYXJrZXJzPSJ0cnVlIiByb290RXh0ZW5kc0ludGVyZmFjZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JTW9kZWxPYmplY3QiCi0gICAgcm9vdEV4dGVuZHNDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0IiByb290SW1wbGVtZW50c0ludGVyZmFjZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5JbnRlcm5hbEVEYXRhT2JqZWN0IgotICAgIHN1cHByZXNzRU1GVHlwZXM9InRydWUiIGZlYXR1cmVNYXBXcmFwcGVySW50ZXJmYWNlPSJjb21tb25qLnNkby5TZXF1ZW5jZSIgZmVhdHVyZU1hcFdyYXBwZXJJbnRlcm5hbEludGVyZmFjZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby51dGlsLkVTZXF1ZW5jZSIKLSAgICBmZWF0dXJlTWFwV3JhcHBlckNsYXNzPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnV0aWwuQmFzaWNFU2VxdWVuY2UiIGNvZGVGb3JtYXR0aW5nPSJ0cnVlIgotICAgIGltcG9ydGVySUQ9ImNvbS5pYm0ueHRvb2xzLm1vZGVsZXIudWkud2l6YXJkcy5pbnRlcm5hbC5lY29yZS5pbXBvcnRlci5FbXhJbXBvcnRlcldpemFyZCIKLSAgICBjb250YWlubWVudFByb3hpZXM9InRydWUiIGNvbXBsaWFuY2VMZXZlbD0iNS4wIj4KLSAgPGdlbkFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbC9pbXBvcnRlci9jb20uaWJtLnh0b29scy5tb2RlbGVyLnVpLndpemFyZHMuaW50ZXJuYWwuZWNvcmUuaW1wb3J0ZXIuRW14SW1wb3J0ZXJXaXphcmQiPgotICAgIDxkZXRhaWxzIGtleT0iU1VQRVJfQ0xBU1NfT1JERVIiIHZhbHVlPSJQUk9DRVNTIi8+Ci0gICAgPGRldGFpbHMga2V5PSJPUEVSQVRJT05fQk9ESUVTIiB2YWx1ZT0iSUdOT1JFIi8+Ci0gICAgPGRldGFpbHMga2V5PSJERVJJVkVEX0ZFQVRVUkVTIiB2YWx1ZT0iUFJPQ0VTUyIvPgotICAgIDxkZXRhaWxzIGtleT0iRFVQTElDQVRFX09QRVJBVElPTl9JTkhFUklUQU5DRSIgdmFsdWU9IkRJU0NBUkQiLz4KLSAgICA8ZGV0YWlscyBrZXk9IlJFREVGSU5JTkdfT1BFUkFUSU9OUyIgdmFsdWU9IlJFUE9SVCIvPgotICAgIDxkZXRhaWxzIGtleT0iQU5OT1RBVElPTl9ERVRBSUxTIiB2YWx1ZT0iUFJPQ0VTUyIvPgotICAgIDxkZXRhaWxzIGtleT0iUkVERUZJTklOR19QUk9QRVJUSUVTIiB2YWx1ZT0iUkVQT1JUIi8+Ci0gICAgPGRldGFpbHMga2V5PSJJTlZBUklBTlRfQ09OU1RSQUlOVFMiIHZhbHVlPSJQUk9DRVNTIi8+Ci0gICAgPGRldGFpbHMga2V5PSJEVVBMSUNBVEVfRkVBVFVSRV9JTkhFUklUQU5DRSIgdmFsdWU9IkRJU0NBUkQiLz4KLSAgICA8ZGV0YWlscyBrZXk9IkRVUExJQ0FURV9PUEVSQVRJT05TIiB2YWx1ZT0iRElTQ0FSRCIvPgotICAgIDxkZXRhaWxzIGtleT0iQ09NTUVOVFMiIHZhbHVlPSJQUk9DRVNTIi8+Ci0gICAgPGRldGFpbHMga2V5PSJEVVBMSUNBVEVfRkVBVFVSRVMiIHZhbHVlPSJESVNDQVJEIi8+Ci0gICAgPGRldGFpbHMga2V5PSJTVUJTRVRUSU5HX1BST1BFUlRJRVMiIHZhbHVlPSJSRVBPUlQiLz4KLSAgICA8ZGV0YWlscyBrZXk9IkVDT1JFX1RBR0dFRF9WQUxVRVMiIHZhbHVlPSJQUk9DRVNTIi8+Ci0gICAgPGRldGFpbHMga2V5PSJVTklPTl9QUk9QRVJUSUVTIiB2YWx1ZT0iUkVQT1JUIi8+Ci0gIDwvZ2VuQW5ub3RhdGlvbnM+Ci0gIDxmb3JlaWduTW9kZWw+Li4vLi4vVU1BJTIwMS4wLjUlMjAoUlNNKS91bWEuZW14PC9mb3JlaWduTW9kZWw+Ci0gIDxzdGF0aWNQYWNrYWdlcz5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1NETzwvc3RhdGljUGFja2FnZXM+Ci0gIDxtb2RlbFBsdWdpblZhcmlhYmxlcz5FTUZfQ09NTU9OSl9TRE89b3JnLmVjbGlwc2UuZW1mLmNvbW1vbmouc2RvPC9tb2RlbFBsdWdpblZhcmlhYmxlcz4KLSAgPG1vZGVsUGx1Z2luVmFyaWFibGVzPkVNRl9FQ09SRV9TRE89b3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkbzwvbW9kZWxQbHVnaW5WYXJpYWJsZXM+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IlVtYSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmVwZiIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGVjb3JlUGFja2FnZT0idW1hLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbmEiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2NvbnRyaWJ1dGVzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9leHRlbmRzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9yZXBsYWNlcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbG9jYWxDb250cmlidXRpb24iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2xvY2FsUmVwbGFjZW1lbnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2V4dGVuZHNSZXBsYWNlcyIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL2ZpbmlzaFRvU3RhcnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9maW5pc2hUb0ZpbmlzaCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL3N0YXJ0VG9TdGFydCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL3N0YXJ0VG9GaW5pc2giLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU3RyaW5nIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9Cb29sZWFuIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9EYXRlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9VcmkiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1NldCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU2VxdWVuY2UiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL0ludGVnZXIiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL0RvdWJsZSIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2xhc3NpZmllciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ2xhc3NpZmllci9pc0Fic3RyYWN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVHlwZSIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGFja2FnZWFibGVFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9OYW1lZEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BhY2thZ2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL05hbWVzcGFjZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnN0cmFpbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnN0cmFpbnQvYm9keSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvZ3VpZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvcHJlc2VudGF0aW9uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvYnJpZWZEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L293bmVkUnVsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9tZXRob2RFbGVtZW50UHJvcGVydHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2tpbmQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L3N1cHByZXNzZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L29yZGVyaW5nR3VpZGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudFByb3BlcnR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50UHJvcGVydHkvdmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vS2luZCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0tpbmQvYXBwbGljYWJsZU1ldGFDbGFzc0luZm8iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvc3VwcG9ydGluZ01hdGVyaWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2NvbmNlcHRzQW5kUGFwZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY2hlY2tsaXN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2d1aWRlbGluZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9leGFtcGxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2Fzc2V0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L3Rlcm1kZWZpbml0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3ByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9zaGFwZWljb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvbm9kZWljb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vbWFpbkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9zZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9leHRlcm5hbElkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL2tleUNvbnNpZGVyYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL2xvbmdQcmVzZW50YXRpb25OYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kVW5pdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9hdXRob3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jaGFuZ2VEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jaGFuZ2VEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvdmVyc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY29weXJpZ2h0U3RhdGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGFuY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TZWN0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3NlY3Rpb25OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2VjdGlvbi9zZWN0aW9uRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VjdGlvbi9zdWJTZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlY3Rpb24vcHJlZGVjZXNzb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5RWxlbWVudC92YXJpYWJpbGl0eVR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db25jZXB0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2hlY2tsaXN0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRXhhbXBsZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JldXNhYmxlQXNzZXQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZXJtRGVmaW5pdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mby9pc1ByaW1hcnlFeHRlbnNpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQXJ0aWZhY3QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BcnRpZmFjdC9jb250YWluZXJBcnRpZmFjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BcnRpZmFjdC9jb250YWluZWRBcnRpZmFjdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L3JlcG9ydHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90ZW1wbGF0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90b29sTWVudG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L2VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9GdWxmaWxsYWJsZUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Z1bGZpbGxhYmxlRWxlbWVudC9mdWxmaWxscyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZXBvcnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZW1wbGF0ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rvb2xNZW50b3IiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVsaXZlcmFibGUvZGVsaXZlcmVkV29ya1Byb2R1Y3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL091dGNvbWUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdGVwIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtEZWZpbml0aW9uL3ByZWNvbmRpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbi9wb3N0Y29uZGl0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1doaXRlcGFwZXIiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UYXNrIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3BlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9tYW5kYXRvcnlJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svb3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svb3B0aW9uYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svc3RlcHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3Rvb2xNZW50b3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZS9tb2RpZmllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGUvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9icmllZk91dGxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL3JlcHJlc2VudGF0aW9uT3B0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vcmVwcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL25vdGF0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vaW1wYWN0T2ZOb3RIYXZpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL3JlYXNvbnNGb3JOb3ROZWVkaW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24vZXh0ZXJuYWxEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24vcGFja2FnaW5nR3VpZGFuY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vc2tpbGxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL2Fzc2lnbm1lbnRBcHByb2FjaGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL3N5bm9ueW1zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24vYWx0ZXJuYXRpdmVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0d1aWRhbmNlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0d1aWRhbmNlRGVzY3JpcHRpb24vYXR0YWNobWVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9hZGRpdGlvbmFsSW5mbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vcHJvYmxlbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYmFja2dyb3VuZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vZ29hbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2FwcGxpY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9sZXZlbHNPZkFkb3B0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVTZXQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVTZXQvcm9sZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Eb21haW4iPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RvbWFpbi93b3JrUHJvZHVjdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRG9tYWluL3N1YmRvbWFpbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdFR5cGUvd29ya1Byb2R1Y3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZUdyb3VwaW5nL2Rpc2NpcGxpbmVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rpc2NpcGxpbmUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmUvdGFza3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZS9zdWJkaXNjaXBsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZS9yZWZlcmVuY2VXb3JrZmxvd3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQWN0aXZpdHkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2JyZWFrZG93bkVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvcm9hZG1hcHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNSZXBlYXRhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNPbmdvaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNFdmVudERyaXZlbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2xpbmtUb1ByZWRlY2Vzc29yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVmaXgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2lzUGxhbm5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaXNPcHRpb25hbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlc2VudGVkQWZ0ZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZXNlbnRlZEJlZm9yZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3BsYW5uaW5nRGF0YSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvc3VwZXJBY3Rpdml0aWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9jaGVja2xpc3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9jb25jZXB0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvZXhhbXBsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2d1aWRlbGluZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3JldXNhYmxlQXNzZXRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9zdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC90ZW1wbGF0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3JlcG9ydHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2VzdGltYXRpb25jb25zaWRlcmF0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvdG9vbG1lbnRvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEvc3RhcnREYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhL2ZpbmlzaERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEvcmFuayIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtPcmRlci9saW5rVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtPcmRlci9wcmVkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvYWRtYXAiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Ub29sIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Ub29sL3Rvb2xNZW50b3JzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVTZXRHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZVNldEdyb3VwaW5nL3JvbGVTZXRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9jYXRlZ29yaXplZEVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkvc3ViQ2F0ZWdvcmllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvZ2xvYmFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9yZXVzZWRQYWNrYWdlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL2NoaWxkUGFja2FnZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudFBhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50UGFja2FnZS9jb250ZW50RWxlbWVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWlsZXN0b25lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NaWxlc3RvbmUvcmVxdWlyZWRSZXN1bHRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2FjdGl2aXR5RW50cnlTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9hY3Rpdml0eUV4aXRTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9Xb3JrUHJvZHVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RlZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvZGVsaXZlcmFibGVQYXJ0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaXB0b3IvaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0l0ZXJhdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BoYXNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGVhbVByb2ZpbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RlYW1Qcm9maWxlL3RlYW1Sb2xlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RlYW1Qcm9maWxlL3N1cGVyVGVhbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RlYW1Qcm9maWxlL3N1YlRlYW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL1JvbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9tb2RpZmllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL3Jlc3BvbnNpYmxlRm9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9UYXNrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9hc3Npc3RlZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvZXh0ZXJuYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL21hbmRhdG9yeUlucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivb3B0aW9uYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL291dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL3BlcmZvcm1lZFByaW1hcmlseUJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivc2VsZWN0ZWRTdGVwcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db21wb3NpdGVSb2xlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db21wb3NpdGVSb2xlL2FnZ3JlZ2F0ZWRSb2xlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzcy9lZHVjYXRpb25NYXRlcmlhbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MvY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzL2luY2x1ZGVzUGF0dGVybnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzL2RlZmF1bHRDb250ZXh0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy92YWxpZENvbnRleHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL21ldGhvZFBsdWdpblNlbGVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vbWV0aG9kUGFja2FnZVNlbGVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vcHJvY2Vzc1ZpZXdzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9kZWZhdWx0VmlldyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vYmFzZUNvbmZpZ3VyYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9zdWJ0cmFjdGVkQ2F0ZWdvcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL2FkZGVkQ2F0ZWdvcnkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4vdXNlckNoYW5nZWFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luL21ldGhvZFBhY2thZ2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luL2Jhc2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS9iYXNlZE9uUHJvY2Vzc2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1ByYWN0aWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJhY3RpY2Uvc3ViUHJhY3RpY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJhY3RpY2UvY29udGVudFJlZmVyZW5jZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9QcmFjdGljZS9hY3Rpdml0eVJlZmVyZW5jZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24vdXNhZ2VHdWlkYW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL2FsdGVybmF0aXZlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24vaG93dG9TdGFmZiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vc2NhbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcmlza0xldmVsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vZXN0aW1hdGluZ1RlY2huaXF1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Byb2plY3RNZW1iZXJFeHBlcnRpc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi90eXBlT2ZDb250cmFjdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi9zY29wZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi91c2FnZU5vdGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpcHRvckRlc2NyaXB0aW9uL3JlZmluZWREZXNjcmlwdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IvX3Byb2Nlc3NDb21wb25lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9pbnRlcmZhY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQvcHJvY2VzcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NQYWNrYWdlL3Byb2Nlc3NFbGVtZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZS9kaWFncmFtcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaWFncmFtIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtL2RpYWdyYW1MaW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW0vbmFtZXNwYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGlhZ3JhbS96b29tIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbS92aWV3cG9pbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhOb2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaE5vZGUvc2l6ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9jb250YWluZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvcG9zaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L2xpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L2FuY2hvcmFnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvc2VtYW50aWNNb2RlbCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9pc1Zpc2libGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvY29udGFpbmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvcmVmZXJlbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L3Byb3BlcnR5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JlZmVyZW5jZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUmVmZXJlbmNlL2lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUmVmZXJlbmNlL3JlZmVyZW5jZWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvcGVydHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb3BlcnR5L2tleSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb3BlcnR5L3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BvaW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qb2ludC94Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUG9pbnQveSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaWFncmFtTGluayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvem9vbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL3ZpZXdwb3J0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvZGlhZ3JhbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtTGluay9ncmFwaEVsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhDb25uZWN0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWRnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhFZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFZGdlL3dheXBvaW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWRnZS9hbmNob3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL3ByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2RpYWdyYW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9ncmFwaEVsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGltZW5zaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaW1lbnNpb24vd2lkdGgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaW1lbnNpb24vaGVpZ2h0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlL2ludGVyZmFjZVNwZWNpZmljYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UvaW50ZXJmYWNlSU8iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50L3R5cGVJbmZvIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2UvZWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UvZWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0xlYWZFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGV4dEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1RleHRFbGVtZW50L3RleHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vSW1hZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0ltYWdlL3VyaSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0ltYWdlL21pbWVUeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhpY1ByaW1pdGl2ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BvbHlsaW5lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qb2x5bGluZS9jbG9zZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUG9seWxpbmUvd2F5cG9pbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VsbGlwc2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0VsbGlwc2UvY2VudGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yYWRpdXNYIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yYWRpdXNZIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yb3RhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2Uvc3RhcnRBbmdsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2UvZW5kQW5nbGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0ZhbWlseSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0ZhbWlseS9kZWxpdmVyeVByb2Nlc3NlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kTGlicmFyeS9tZXRob2RQbHVnaW5zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZExpYnJhcnkvcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTE2NDg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIFVNQQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjlkYWNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZSAKLSAgICAgICAgICAgIHVyaSA9ICJodHRwOi8vd3d3LmlibS5jb20vdW1hLzEuMC4yL3VtYS5lY29yZSIgCi0gICAgICAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UiIC8+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSIKLSAgICAgICAgICAgIHVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zL3VtYS5lY29yZSIvPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UiCi0gICAgICAgICAgICB1cmk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiLz4gICAgICAgICAgICAKLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FjdGl2aXR5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ODYyM2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9BY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3Rpdml0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIEFjdGl2aXR5IGlzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4KLSAqIEFjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LgotICogCi0gKiBUaGlzIGRlZmluaXRpb24gb2YgQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSBpbnRyb2R1Y2VkIGluIHRoZSBwYWNrYWdlIEJyZWFrZG93biB3aXRoIG5ldyBjYXBhYmlsaXRpZXMgYW5kIGlzIHRoZSBiYXNpcyBmb3IgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNsYXNzIFByb2Nlc3MuCi0gKiBFeHRlbmRzIEFjdGl2aXR5IHdpdGggYW4gYXNzb2NpYXRpb24gdG8gUm9hZG1hcC4gIFRoaXMgZGVmaW5pdGlvbiBvZiBBY3Rpdml0eSBhbHNvIHBhcnRpY2lwYXRlcyBpbiB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBEaXNjaXBsaW5lIGNhdGVnb3J5LgotICogCi0gKiBBY3Rpdml0eSBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGluaGVyaXRzIGZyb20gVmFyaWFiaWxpdHkgRWxlbWVudCB0byBleHRlbmQgQWN0aXZpdHkgd2l0aCBuZXcgY2FwYWJpbGl0aWVzIGZvciB2YXJpYWJpbGl0eS4KLSAqIEFjdGl2aXR5IGluaGVyaXRzIHRoZSBzZW1hbnRpY3Mgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCB3aGljaCBwcm92aWRlcyBrZXkgbWVjaGFuaXNtIHRvIGVuYWJsZSBkeW5hbWljIGJpbmRpbmcgb2YgQ2FwYWJpbGl0eSBQYXR0ZXJucyBpbiBQcm9jZXNzZXMgYXMgd2VsbCBhcyBQcm9jZXNzIENvbnRyaWJ1dGlvbnMuICBWYXJpYWJpbGl0eSBpcyB1c2VkIGluIHRoZSBmb2xsb3dpbmcgd2F5IGZvciBBY3Rpdml0aWVzOgotICogLSBFeHRlbmQ6IFRvIGFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIGEgcHJvY2VzcyBvbmUgd291bGQgY3JlYXRlIGFuIEFjdGl2aXR5IHdoaWNoIGV4dGVuZHMgdGhlIHBhdHRlcm4ncyB0b3AtbGV2ZWwgYWN0aXZpdHkuICBUaHJvdWdoIGV4dGVuc2lvbiB0aGUgZXh0ZW5kaW5nIEFjdGl2aXR5IGluaGVyaXRzIHRoZSBwYXR0ZXJucyBCcmVha2Rvd24gRWxlbWVudHMuCi0gKiAtIFJlcGxhY2U6IFRvIHJlcGxhY2UgYW4gQWN0aXZpdHkgb2YgYW4gYXBwbGllZCBDYXBhYmlsaXR5IFBhdHRlcm4gb3IgYW4gZXhpc3RpbmcgcHJvY2VzcyBmb3Igd2hpY2ggb25lIGRldmVsb3BzIGEgUHJvY2VzcyBDb250cmlidXRpb24gKG9yIGEgY29tYmluYXRpb24gb2YgYm90aCkgb25lIHdvdWxkIGNyZWF0ZSBhbiBBY3Rpdml0eSBhbmQgc3BlY2lmeSB0aGUgcmVwbGFjZSB2YXJpYWJpbGl0eSBzcGVjaWFsaXphdGlvbiBiZXR3ZWVuIHRoZW0uCi0gKiAtIENvbnRyaWJ1dGU6IFRvIGNvbnRyaWJ1dGUgbmV3IEJyZWFrZG93biBFbGVtZW50cyB0byBhbiBleGlzdGluZyBBY3Rpdml0eSBvbmUgd291bGQgZGVmaW5lIGFuIEFjdGl2aXR5IHdpdGggQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVsYXRlcyB2aWEgdGhlIENvbnRyaWJ1dGVzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHRvIHRoaXMgZXhpc3RpbmcgQWN0aXZpdHkuICBUaGUgY29udHJpYnV0aW5nIEFjdGl2aXR5J3MgQnJlYWtkb3duIEVsZW1lbnRzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbnRyaWJ1dGVkIEFjdGl2aXR5LgotICogCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldEJyZWFrZG93bkVsZW1lbnRzIDxlbT5CcmVha2Rvd24gRWxlbWVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0Um9hZG1hcHMgPGVtPlJvYWRtYXBzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHkoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aXZpdHkgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudCwgRnVsZmlsbGFibGVFbGVtZW50LAotCQlWYXJpYWJpbGl0eUVsZW1lbnQsIFdvcmtEZWZpbml0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnR9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXRpZXMgPGVtPlN1cGVyIEFjdGl2aXRpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QnJlYWtkb3duIEVsZW1lbnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QnJlYWtkb3duIEVsZW1lbnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXRpZXMKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9InN1cGVyQWN0aXZpdGllcyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8QnJlYWtkb3duRWxlbWVudD4gZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvYWRtYXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvYWRtYXBzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9hZG1hcHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfUm9hZG1hcHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxSb2FkbWFwPiBnZXRSb2FkbWFwcygpOwotCi19IC8vIEFjdGl2aXR5CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FjdGl2aXR5RGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQWN0aXZpdHlEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjExMzhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQWN0aXZpdHlEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRIb3d0b1N0YWZmIDxlbT5Ib3d0byBTdGFmZjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aXZpdHlEZXNjcmlwdGlvbiBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFB1cnBvc2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFB1cnBvc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QdXJwb3NlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQdXJwb3NlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsdGVybmF0aXZlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBbHRlcm5hdGl2ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SG93dG8gU3RhZmY8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ib3d0byBTdGFmZjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SG93dG9TdGFmZihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3d0b1N0YWZmKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SG93dG9TdGFmZigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEhvd3RvU3RhZmYgPGVtPkhvd3RvIFN0YWZmPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ib3d0byBTdGFmZjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SG93dG9TdGFmZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SG93dG9TdGFmZihTdHJpbmcgdmFsdWUpOwotCi19IC8vIEFjdGl2aXR5RGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmZmIwYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvI2dldElzUHJpbWFyeUV4dGVuc2lvbiA8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyBleHRlbmRzIENsYXNzaWZpZXIgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm9fSXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldElzUHJpbWFyeUV4dGVuc2lvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyNnZXRJc1ByaW1hcnlFeHRlbnNpb24gPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1ByaW1hcnlFeHRlbnNpb24oQm9vbGVhbiB2YWx1ZSk7Ci0KLX0gLy8gQXBwbGljYWJsZU1ldGFDbGFzc0luZm8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQXJ0aWZhY3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQXJ0aWZhY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhNGM4Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FydGlmYWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFydGlmYWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQXJ0aWZhY3QgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdHlwZXMuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbCBhcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4KLSAqIEFydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAib3duIiBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZXJBcnRpZmFjdCA8ZW0+Q29udGFpbmVyIEFydGlmYWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0I2dldENvbnRhaW5lZEFydGlmYWN0cyA8ZW0+Q29udGFpbmVkIEFydGlmYWN0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFydGlmYWN0IGV4dGVuZHMgV29ya1Byb2R1Y3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRhaW5lciBBcnRpZmFjdDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0I2dldENvbnRhaW5lZEFydGlmYWN0cyA8ZW0+Q29udGFpbmVkIEFydGlmYWN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250YWluZXIgQXJ0aWZhY3Q8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhaW5lciBBcnRpZmFjdDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbnRhaW5lckFydGlmYWN0KEFydGlmYWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0X0NvbnRhaW5lckFydGlmYWN0KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVkQXJ0aWZhY3RzCi0JICogQG1vZGVsIG9wcG9zaXRlPSJjb250YWluZWRBcnRpZmFjdHMiIHRyYW5zaWVudD0iZmFsc2UiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcnRpZmFjdCBnZXRDb250YWluZXJBcnRpZmFjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZXJBcnRpZmFjdCA8ZW0+Q29udGFpbmVyIEFydGlmYWN0PC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGFpbmVyIEFydGlmYWN0PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbnRhaW5lckFydGlmYWN0KEFydGlmYWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0fS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0I2dldENvbnRhaW5lckFydGlmYWN0IDxlbT5Db250YWluZXIgQXJ0aWZhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGFpbmVkIEFydGlmYWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVyQXJ0aWZhY3QKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImNvbnRhaW5lckFydGlmYWN0IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PEFydGlmYWN0PiBnZXRDb250YWluZWRBcnRpZmFjdHMoKTsKLQotfSAvLyBBcnRpZmFjdApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9BcnRpZmFjdERlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FydGlmYWN0RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA5ZGU2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FydGlmYWN0RGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0QnJpZWZPdXRsaW5lIDxlbT5CcmllZiBPdXRsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zIDxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb24gPGVtPlJlcHJlc2VudGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0Tm90YXRpb24gPGVtPk5vdGF0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcnRpZmFjdERlc2NyaXB0aW9uIGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QnJpZWYgT3V0bGluZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJyaWVmIE91dGxpbmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJyaWVmT3V0bGluZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRCcmllZk91dGxpbmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRCcmllZk91dGxpbmUgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJyaWVmIE91dGxpbmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJyaWVmT3V0bGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QnJpZWZPdXRsaW5lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zIDxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlcHJlc2VudGF0aW9uT3B0aW9ucyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVwcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXByZXNlbnRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXByZXNlbnRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVwcmVzZW50YXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZXByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uIDxlbT5SZXByZXNlbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVwcmVzZW50YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXByZXNlbnRhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Tm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ob3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm90YXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0RGVzY3JpcHRpb25fTm90YXRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROb3RhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldE5vdGF0aW9uIDxlbT5Ob3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm90YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5vdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROb3RhdGlvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIEFydGlmYWN0RGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQnJlYWtkb3duRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9CcmVha2Rvd25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NWM1OWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9CcmVha2Rvd25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEJyZWFrZG93biBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRJc1BsYW5uZWQgPGVtPklzIFBsYW5uZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEFmdGVyIDxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRCZWZvcmUgPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXRpZXMgPGVtPlN1cGVyIEFjdGl2aXRpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRDaGVja2xpc3RzIDxlbT5DaGVja2xpc3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0Q29uY2VwdHMgPGVtPkNvbmNlcHRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0RXhhbXBsZXMgPGVtPkV4YW1wbGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0R3VpZGVsaW5lcyA8ZW0+R3VpZGVsaW5lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFJldXNhYmxlQXNzZXRzIDxlbT5SZXVzYWJsZSBBc3NldHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFRlbXBsYXRlcyA8ZW0+VGVtcGxhdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UmVwb3J0cyA8ZW0+UmVwb3J0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEVzdGltYXRpb25jb25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0VG9vbG1lbnRvciA8ZW0+VG9vbG1lbnRvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJyZWFrZG93bkVsZW1lbnQgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gIlNSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzIiB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAiU29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzIiBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAiQ3VzdG9tZXIuQXJjaGl0ZWN0IiB3b3VsZCBkZWZpbmUgYSAiQ3VzdG9tZXIiIHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAiQXJjaGl0ZWN0IiBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLgotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZWZpeChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVmaXgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWZpeChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuCi0JICogCi0JICogCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFBsYW5uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzUGxhbm5lZChCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldElzUGxhbm5lZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldElzUGxhbm5lZCA8ZW0+SXMgUGxhbm5lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgUGxhbm5lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SXNQbGFubmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1BsYW5uZWQoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEp1c3QgYXMgdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgdGhlIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBhbiBpbXBhY3Qgb24gZ2VuZXJhdGluZyBwbGFucyBmcm9tIGEgUHJvY2Vzcy4gIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhlbiBpdCB3aWxsIHR5cGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gdGhlIHNhbWUgQWN0aXZpdHkuICBGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgIkRldGFpbCBVc2UgQ2FzZSIgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcyhCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Cb29sZWFuIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBpc09wdGlvbmFsIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzT3B0aW9uYWwoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldElzT3B0aW9uYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElzT3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzT3B0aW9uYWwoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByZXNlbnRlZEFmdGVyKEJyZWFrZG93bkVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCcmVha2Rvd25FbGVtZW50IGdldFByZXNlbnRlZEFmdGVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQWZ0ZXIgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRBZnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlc2VudGVkQWZ0ZXIoQnJlYWtkb3duRWxlbWVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByZXNlbnRlZEJlZm9yZShCcmVha2Rvd25FbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJyZWFrZG93bkVsZW1lbnQgZ2V0UHJlc2VudGVkQmVmb3JlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQmVmb3JlIDxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRCZWZvcmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRlZEJlZm9yZShCcmVha2Rvd25FbGVtZW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UGxhbm5pbmdEYXRhKFBsYW5uaW5nRGF0YSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBsYW5uaW5nRGF0YSBnZXRQbGFubmluZ0RhdGEoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGxhbm5pbmdEYXRhKFBsYW5uaW5nRGF0YSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRCcmVha2Rvd25FbGVtZW50cyA8ZW0+QnJlYWtkb3duIEVsZW1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1cGVyIEFjdGl2aXRpZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBlciBBY3Rpdml0aWVzPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTdXBlckFjdGl2aXRpZXMoQWN0aXZpdHkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXRpZXMoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRCcmVha2Rvd25FbGVtZW50cwotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iYnJlYWtkb3duRWxlbWVudHMiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZpdHkgZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwZXJBY3Rpdml0aWVzIDxlbT5TdXBlciBBY3Rpdml0aWVzPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBlciBBY3Rpdml0aWVzPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTdXBlckFjdGl2aXRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1cGVyQWN0aXZpdGllcyhBY3Rpdml0eSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2hlY2tsaXN0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoZWNrbGlzdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3RzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8Q2hlY2tsaXN0PiBnZXRDaGVja2xpc3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db25jZXB0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmNlcHRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfQ29uY2VwdHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxDb25jZXB0PiBnZXRDb25jZXB0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhhbXBsZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGFtcGxlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0V4YW1wbGVzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RXhhbXBsZT4gZ2V0RXhhbXBsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HdWlkZWxpbmVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3VpZGVsaW5lczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZXMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxHdWlkZWxpbmU+IGdldEd1aWRlbGluZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXVzYWJsZSBBc3NldHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXVzYWJsZSBBc3NldHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0cygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFJldXNhYmxlQXNzZXQ+IGdldFJldXNhYmxlQXNzZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8U3VwcG9ydGluZ01hdGVyaWFsPiBnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRlbXBsYXRlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRlbXBsYXRlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1RlbXBsYXRlcygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFRlbXBsYXRlPiBnZXRUZW1wbGF0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXBvcnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwb3J0czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1JlcG9ydHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxSZXBvcnQ+IGdldFJlcG9ydHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0VzdGltYXRpb25jb25zaWRlcmF0aW9ucygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PEVzdGltYXRpb25Db25zaWRlcmF0aW9ucz4gZ2V0RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRvb2xtZW50b3I8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sbWVudG9yPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfVG9vbG1lbnRvcigpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFRvb2xNZW50b3I+IGdldFRvb2xtZW50b3IoKTsKLQotfSAvLyBCcmVha2Rvd25FbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM0Y2QwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24jZ2V0VXNhZ2VHdWlkYW5jZSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VXNhZ2VHdWlkYW5jZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRVc2FnZUd1aWRhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiNnZXRVc2FnZUd1aWRhbmNlIDxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVzYWdlR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVzYWdlR3VpZGFuY2UoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ2FwYWJpbGl0eVBhdHRlcm4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ2FwYWJpbGl0eVBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJkMzcwZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NhcGFiaWxpdHlQYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYXBhYmlsaXR5IFBhdHRlcm48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gIENhcGFiaWxpdGllcyBQYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgRGlzY2lwbGluZSBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgYnkgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuCi0gKiBBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZToKLSAqIC0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuCi0gKiAtIFRvIHN1cHBvcnQgZGlyZWN0IGV4ZWN1dGlvbiBpbiBhIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkb2VzIG5vdCB3b3JrIGZvbGxvd2luZyBhIHdlbGwtZGVmaW5lZCBwcm9jZXNzLCBidXQgd29ya3MgYmFzZWQgb24gbG9vc2VseSBjb25uZWN0ZWQgcHJvY2VzcyBmcmFnbWVudHMgb2YgYmVzdCBwcmFjdGljZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIgKGUuZy4gQWdpbGUgRGV2ZWxvcG1lbnQpLgotICogLSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2FwYWJpbGl0eVBhdHRlcm4gZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgewotfSAvLyBDYXBhYmlsaXR5UGF0dGVybgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9DaGVja2xpc3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ2hlY2tsaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZjhlMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9DaGVja2xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ2hlY2tsaXN0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDaGVja2xpc3QoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2hlY2tsaXN0IGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBDaGVja2xpc3QKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ2xhc3NpZmllci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9DbGFzc2lmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyN2E4NGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9DbGFzc2lmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DbGFzc2lmaWVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVU1MIDIuMCBtZXRhLWNsYXNzIENsYXNzaWZpZXIuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyI2dldElzQWJzdHJhY3QgPGVtPklzIEFic3RyYWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q2xhc3NpZmllcigpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2xhc3NpZmllciBleHRlbmRzIFR5cGUgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklzIEFic3RyYWN0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEFic3RyYWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJc0Fic3RyYWN0KEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q2xhc3NpZmllcl9Jc0Fic3RyYWN0KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkJvb2xlYW4iIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJc0Fic3RyYWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXIjZ2V0SXNBYnN0cmFjdCA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIEFic3RyYWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJc0Fic3RyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0Fic3RyYWN0KEJvb2xlYW4gdmFsdWUpOwotfSAvLyBDbGFzc2lmaWVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbXBvc2l0ZVJvbGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29tcG9zaXRlUm9sZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTg5MWMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29tcG9zaXRlUm9sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db21wb3NpdGUgUm9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ29tcG9zaXRlIFJvbGUgaXMgYSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuCi0gKiBBIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZSNnZXRBZ2dyZWdhdGVkUm9sZXMgPGVtPkFnZ3JlZ2F0ZWQgUm9sZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb21wb3NpdGVSb2xlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvc2l0ZVJvbGUgZXh0ZW5kcyBSb2xlRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWdncmVnYXRlZCBSb2xlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZ2dyZWdhdGVkIFJvbGVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWdncmVnYXRlZCBSb2xlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlcygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFJvbGU+IGdldEFnZ3JlZ2F0ZWRSb2xlcygpOwotCi19IC8vIENvbXBvc2l0ZVJvbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29uY2VwdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db25jZXB0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwOTIxMzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db25jZXB0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBDb25jZXB0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29uY2VwdCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25jZXB0IGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBDb25jZXB0CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnN0cmFpbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGU5ZWFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uc3RyYWludDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ29uc3RyYWludCBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludCNnZXRCb2R5IDxlbT5Cb2R5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29uc3RyYWludCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25zdHJhaW50IGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Qm9keTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlIHN0b3JlcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Qm9keTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Qm9keShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29uc3RyYWludF9Cb2R5KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Qm9keSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50I2dldEJvZHkgPGVtPkJvZHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJvZHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJvZHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJvZHkoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBDb25zdHJhaW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRDYXRlZ29yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db250ZW50Q2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViMTNhMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRDYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBDYXRlZ29yeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIENvbnRlbnQgQ2F0ZWdvcnkgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRDYXRlZ29yeSgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudENhdGVnb3J5IGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotfSAvLyBDb250ZW50Q2F0ZWdvcnkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29udGVudERlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnREZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmQ1OGU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29udGVudERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQ29udGVudCBEZXNjcmlwdGlvbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0U2VjdGlvbnMgPGVtPlNlY3Rpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0S2V5Q29uc2lkZXJhdGlvbnMgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWUgPGVtPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudERlc2NyaXB0aW9uIGV4dGVuZHMgTWV0aG9kVW5pdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlIHN0b3JlIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1haW5EZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1haW5EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1haW5EZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VjdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFNlY3Rpb24+IGdldFNlY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIG9yIGxhYmVsIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBlbGVtZW50LiBVc2VkIGxpa2UgYSBzeW5vbnltIHRvIHRoZSBuYW1lLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBJZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXh0ZXJuYWxJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFeHRlcm5hbElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgSWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEV4dGVybmFsSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4dGVybmFsSWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEtleSBDb25zaWRlcmF0aW9ucyBwcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRLZXlDb25zaWRlcmF0aW9ucyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEtleUNvbnNpZGVyYXRpb25zIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEtleUNvbnNpZGVyYXRpb25zKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvbmdQcmVzZW50YXRpb25OYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RGVzY3JpcHRpb25fTG9uZ1ByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExvbmdQcmVzZW50YXRpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRMb25nUHJlc2VudGF0aW9uTmFtZSA8ZW0+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExvbmdQcmVzZW50YXRpb25OYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQ29udGVudERlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRFbGVtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYzM0YTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db250ZW50RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQ29udGVudCBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LgotICogQ29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuCi0gKiAKLSAqIFRoaXMgaXMgdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UncyBleHRlbnNpb24gb2YgQ29udGVudCBFbGVtZW50IChkZWZpbmVkIGluIENvbnRlbnQgRWxlbWVudHMpIHByb3ZpZGluZyBhZGRpdG9uYWwgYXNzb2NpYXRpb25zLgotICogQ29udGVudCBFbGVtZW50IGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBub3QgZGlyZWN0bHkgZnJvbSBNZXRob2QgRWxlbWVudCBhbnltb3JlLiAgVGhpcyBpcyBhY2hpZXZlZCB1c2luZyBVTUwgMi4wIHBhY2thZ2UgbWVyZ2Ugc2VtYW50aWNzLiAgT25seSBpZiBhbiBhZG9wdGVyIG9mIHRoaXMgbWV0YS1tb2RlbCBkZWNpZGVzIHRvIHJlYWxpemUgTWV0aG9kIFBsdWdpbnMsIGhlIHdvdWxkIGdldCB0aGUgdmFyaWFiaWxpdHkgYW5kIGV4dGVuc2lvbiBjYXBhYmlsaXRpZXMgZm9yIGFsbCBDb250ZW50IEVsZW1lbnRzLgotICogQ29udGVudCBFbGVtZW50IGluaGVyaXRzIHRoZSBzZW1hbnRpY3Mgb2YgVmFyaWFiaWxpdHkgRWxlbWVudC4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0U3VwcG9ydGluZ01hdGVyaWFscyA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q29uY2VwdHNBbmRQYXBlcnMgPGVtPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q2hlY2tsaXN0cyA8ZW0+Q2hlY2tsaXN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRHdWlkZWxpbmVzIDxlbT5HdWlkZWxpbmVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldEV4YW1wbGVzIDxlbT5FeGFtcGxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRBc3NldHMgPGVtPkFzc2V0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRUZXJtZGVmaW5pdGlvbiA8ZW0+VGVybWRlZmluaXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudEVsZW1lbnQgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnQsIFZhcmlhYmlsaXR5RWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxTdXBwb3J0aW5nTWF0ZXJpYWw+IGdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29uY2VwdHMgQW5kIFBhcGVyczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxDb25jZXB0PiBnZXRDb25jZXB0c0FuZFBhcGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoZWNrbGlzdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGVja2xpc3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxDaGVja2xpc3Q+IGdldENoZWNrbGlzdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HdWlkZWxpbmVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3VpZGVsaW5lczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8R3VpZGVsaW5lPiBnZXRHdWlkZWxpbmVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGFtcGxlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4YW1wbGVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RXhhbXBsZT4gZ2V0RXhhbXBsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Bc3NldHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3NldHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8UmV1c2FibGVBc3NldD4gZ2V0QXNzZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGVybWRlZmluaXRpb248L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZXJtZGVmaW5pdGlvbjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9UZXJtZGVmaW5pdGlvbigpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFRlcm1EZWZpbml0aW9uPiBnZXRUZXJtZGVmaW5pdGlvbigpOwotCi19IC8vIENvbnRlbnRFbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRQYWNrYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYmFhNGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db250ZW50UGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIENvbnRlbnQgUGFja2FnZSBpcyBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRzIDxlbT5Db250ZW50IEVsZW1lbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudFBhY2thZ2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudFBhY2thZ2UgZXh0ZW5kcyBNZXRob2RQYWNrYWdlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250ZW50IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250ZW50IEVsZW1lbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudCBFbGVtZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PENvbnRlbnRFbGVtZW50PiBnZXRDb250ZW50RWxlbWVudHMoKTsKLQotfSAvLyBDb250ZW50UGFja2FnZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGI5YjVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvcmVTZW1hbnRpY01vZGVsQnJpZGdlIGV4dGVuZHMgU2VtYW50aWNNb2RlbEJyaWRnZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFbGVtZW50KEVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRWxlbWVudCBnZXRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlI2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVsZW1lbnQoRWxlbWVudCB2YWx1ZSk7Ci0KLX0gLy8gQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ3VzdG9tQ2F0ZWdvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ3VzdG9tQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMzMzk4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0N1c3RvbUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkN1c3RvbSBDYXRlZ29yeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ3VzdG9tIENhdGVnb3J5IGlzIGEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAiVGVzdGluZyIgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cyA8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0U3ViQ2F0ZWdvcmllcyA8ZW0+U3ViIENhdGVnb3JpZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDdXN0b21DYXRlZ29yeSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDdXN0b21DYXRlZ29yeSBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXRlZ29yaXplZCBFbGVtZW50czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhdGVnb3JpemVkIEVsZW1lbnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxEZXNjcmliYWJsZUVsZW1lbnQ+IGdldENhdGVnb3JpemVkRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YiBDYXRlZ29yaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIENhdGVnb3JpZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWIgQ2F0ZWdvcmllczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yaWVzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8Q29udGVudENhdGVnb3J5PiBnZXRTdWJDYXRlZ29yaWVzKCk7Ci0KLX0gLy8gQ3VzdG9tQ2F0ZWdvcnkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcmFibGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNjNTgzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RlbGl2ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJhYmxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBkZWxpdmVyYWJsZSBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZSNnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMgPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcmFibGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsaXZlcmFibGUgZXh0ZW5kcyBXb3JrUHJvZHVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3Q+IGdldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpOwotCi19IC8vIERlbGl2ZXJhYmxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmQ5M2M0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldEV4dGVybmFsRGVzY3JpcHRpb24gPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0UGFja2FnaW5nR3VpZGFuY2UgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVybmFsIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeHRlcm5hbERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbiA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeHRlcm5hbERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYWNrYWdpbmcgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFja2FnaW5nR3VpZGFuY2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQYWNrYWdpbmdHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldFBhY2thZ2luZ0d1aWRhbmNlIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhY2thZ2luZ0d1aWRhbmNlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRGVsaXZlcmFibGVEZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZWxpdmVyeVByb2Nlc3MuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcnlQcm9jZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNTdlYmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZWxpdmVyeVByb2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2VzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgRGVsaXZlcnkgUHJvY2Vzc2VzIGlzIGEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLgotICogQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRFZHVjYXRpb25NYXRlcmlhbHMgPGVtPkVkdWNhdGlvbiBNYXRlcmlhbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzI2dldENvbW11bmljYXRpb25zTWF0ZXJpYWxzIDxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3MoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsaXZlcnlQcm9jZXNzIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FZHVjYXRpb24gTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWx9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVkdWNhdGlvbiBNYXRlcmlhbHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFscygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFN1cHBvcnRpbmdNYXRlcmlhbD4gZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWxzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8U3VwcG9ydGluZ01hdGVyaWFsPiBnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpOwotCi19IC8vIERlbGl2ZXJ5UHJvY2VzcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTRhYzFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NhbGUgPGVtPlNjYWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFJpc2tMZXZlbCA8ZW0+UmlzayBMZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0VHlwZU9mQ29udHJhY3QgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBleHRlbmRzIFByb2Nlc3NEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBPdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTY2FsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fU2NhbGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTY2FsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY2FsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2NhbGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQ2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzcwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SaXNrIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogT3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmlzayBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Umlza0xldmVsKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSaXNrTGV2ZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0Umlza0xldmVsIDxlbT5SaXNrIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SaXNrIExldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSaXNrTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJpc2tMZXZlbChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXN0aW1hdGluZyBUZWNobmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXN0aW1hdGluZ1RlY2huaXF1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVzdGltYXRpbmdUZWNobmlxdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFc3RpbWF0aW5nVGVjaG5pcXVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvamVjdE1lbWJlckV4cGVydGlzZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBPZiBDb250cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZU9mQ29udHJhY3QoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZU9mQ29udHJhY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0VHlwZU9mQ29udHJhY3QgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGVPZkNvbnRyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlT2ZDb250cmFjdChTdHJpbmcgdmFsdWUpOwotCi19IC8vIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rlc2NyaWJhYmxlRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZXNjcmliYWJsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmOGRmNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rlc2NyaWJhYmxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBEZXNjcmliYWJsZSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4KLSAqIFRoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZSAoc2VlIFNlY3Rpb24gNC4xLjQpLiAgRGVzY3JpYmFibGUgRWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGJlIHB1Ymxpc2hlZCBpbiBtZXRob2Qgb3IgcHJvY2VzcyBwdWJsaWNhdGlvbnMgKHNpbWlsYXIgdG8gdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3Mgd2ViKS4gIERlc2NyaWJhYmxlIEVsZW1lbnQgZGVmaW5lcyB0aGF0IHRoZSBlbGVtZW50IGl0IHJlcHJlc2VudHMgd2lsbCBoYXZlIGNvbnRlbnQgJ2F0dGFjaGVkJyB0byBpdC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgdGhlIGFic3RyYWN0aW9uIGZvciB0aGUgYWN0dWFsIHBsYWNlcyBpbiB3aGljaCB0aGUgY29udGVudCBpcyBiZWluZyByZXByZXNlbnRlZC4gIFRoaXMgc2VwYXJhdGlvbiBhbGxvd3MgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGNvcmUgbWV0aG9kIG1vZGVsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwgZnJvbSB0aGUgYWN0dWFsIGRlc2NyaXB0aW9uIGNvbnRhaW5lciBwcm92aWRpbmcsIGZvciBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29udGVudCBlbGVtZW50IGluIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMgbGFuZ3VhZ2VzLCBhdWRpZW5jZXMsIGxpY2Vuc2luZyBsZXZlbHMsIGV0Yy4KLSAqIAotICogVGhpcyBkZWZpbml0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBleHRlbmRzIHRoZSBDb250ZW50IEVsZW1lbnQgZGVmaW5pdGlvbiB2aWEgcGFja2FnZSBtZXJnZSB3aXRoIHJlZmVyZW5jZXMgdG8gaWNvbnMgdGhhdCBhcmUgdXNlZCBmb3IgcHJlc2VudGluZyBDb250ZW50IEVsZW1lbnRzIGluIGEgVU1BLWJhc2VkIG1vZGVsaW5nIGVudmlyb25tZW50IGFzIHdlbGwgYXMgd2hlbiBwdWJsaXNoaW5nIENvbnRlbnQgRWxlbWVudHMgaW50byBkb2N1bWVudGF0aW9uIHByZXNlbnRhdGlvbiAoZS5nLiBkb2N1bWVudCBvciBodG1sIHBhZ2VzKS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0U2hhcGVpY29uIDxlbT5TaGFwZWljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldE5vZGVpY29uIDxlbT5Ob2RlaWNvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVzY3JpYmFibGVFbGVtZW50IGV4dGVuZHMgTWV0aG9kRWxlbWVudCwgQ2xhc3NpZmllciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmVzZW50YXRpb24oQ29udGVudERlc2NyaXB0aW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250ZW50RGVzY3JpcHRpb24gZ2V0UHJlc2VudGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRhdGlvbihDb250ZW50RGVzY3JpcHRpb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNoYXBlaWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2hhcGVpY29uKFVSSSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVXJpIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVVJJIGdldFNoYXBlaWNvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0U2hhcGVpY29uIDxlbT5TaGFwZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNoYXBlaWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2hhcGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTaGFwZWljb24oVVJJIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob2RlaWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm9kZWljb24oVVJJKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlVyaSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVSSSBnZXROb2RlaWNvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0Tm9kZWljb24gPGVtPk5vZGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob2RlaWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Tm9kZWljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5vZGVpY29uKFVSSSB2YWx1ZSk7Ci0KLX0gLy8gRGVzY3JpYmFibGVFbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjY4MTZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgRGVzY3JpcHRvciBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuCi0gKiBEZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IjZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZXNjcmlwdG9yKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZXNjcmlwdG9yIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKEJvb2xlYW4gdmFsdWUpOwotCi19IC8vIERlc2NyaXB0b3IKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVzY3JpcHRvckRlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTBjYTFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVzY3JpcHRvckRlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uI2dldFJlZmluZWREZXNjcmlwdGlvbiA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZXNjcmlwdG9yRGVzY3JpcHRpb24gZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmluZWQgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWZpbmVkRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZWZpbmVkRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uI2dldFJlZmluZWREZXNjcmlwdGlvbiA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWZpbmVkRGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEZXNjcmlwdG9yRGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlhZ3JhbS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaWFncmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2M2VmOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaWFncmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaWFncmFtPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXREaWFncmFtTGluayA8ZW0+RGlhZ3JhbSBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXRab29tIDxlbT5ab29tPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0Vmlld3BvaW50IDxlbT5WaWV3cG9pbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpYWdyYW0gZXh0ZW5kcyBHcmFwaE5vZGUgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlpvb208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlpvb208L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Wm9vbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Wm9vbShEb3VibGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbV9ab29tKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRG91YmxlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFpvb20oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXRab29tIDxlbT5ab29tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5ab29tPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRab29tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRab29tKERvdWJsZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WaWV3cG9pbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZpZXdwb2ludDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WaWV3cG9pbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFZpZXdwb2ludChQb2ludCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtX1ZpZXdwb2ludCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUG9pbnQgZ2V0Vmlld3BvaW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0Vmlld3BvaW50IDxlbT5WaWV3cG9pbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZpZXdwb2ludDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Vmlld3BvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWaWV3cG9pbnQoUG9pbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlhZ3JhbSBMaW5rPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGlua30uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXREaWFncmFtIDxlbT5EaWFncmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpYWdyYW0gTGluazwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpYWdyYW0gTGluazwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtX0RpYWdyYW1MaW5rKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0RGlhZ3JhbQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iZGlhZ3JhbSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RGlhZ3JhbUxpbms+IGdldERpYWdyYW1MaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lc3BhY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lc3BhY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZXNwYWNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXROYW1lc3BhY2UoU2VtYW50aWNNb2RlbEJyaWRnZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtX05hbWVzcGFjZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RGlhZ3JhbQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iZGlhZ3JhbSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlbWFudGljTW9kZWxCcmlkZ2UgZ2V0TmFtZXNwYWNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TmFtZXNwYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lc3BhY2UoU2VtYW50aWNNb2RlbEJyaWRnZSB2YWx1ZSk7Ci0KLX0gLy8gRGlhZ3JhbQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaWFncmFtRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaWFncmFtRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTdkZGZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlhZ3JhbUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpYWdyYW0gRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldElzVmlzaWJsZSA8ZW0+SXMgVmlzaWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRDb250YWluZXJfIDxlbT5Db250YWluZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0UmVmZXJlbmNlIDxlbT5SZWZlcmVuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0UHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbUVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpYWdyYW1FbGVtZW50IGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBWaXNpYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFZpc2libGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzVmlzaWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpYWdyYW1FbGVtZW50X0lzVmlzaWJsZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkJvb2xlYW4iIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJc1Zpc2libGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0SXNWaXNpYmxlIDxlbT5JcyBWaXNpYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBWaXNpYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJc1Zpc2libGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzVmlzaWJsZShCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRDb250YWluZWQgPGVtPkNvbnRhaW5lZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250YWluZXI8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhaW5lcjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbnRhaW5lcihHcmFwaEVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbUVsZW1lbnRfQ29udGFpbmVyKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldENvbnRhaW5lZAotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iY29udGFpbmVkIiB0cmFuc2llbnQ9ImZhbHNlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JR3JhcGhFbGVtZW50IGdldENvbnRhaW5lcl8oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0Q29udGFpbmVyXyA8ZW0+Q29udGFpbmVyPC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGFpbmVyPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29udGFpbmVyXygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29udGFpbmVyKEdyYXBoRWxlbWVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZX0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UjZ2V0UmVmZXJlbmNlZCA8ZW0+UmVmZXJlbmNlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWZlcmVuY2U8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2U8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbUVsZW1lbnRfUmVmZXJlbmNlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlI2dldFJlZmVyZW5jZWQKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9InJlZmVyZW5jZWQiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFJlZmVyZW5jZT4gZ2V0UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydHk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtRWxlbWVudF9Qcm9wZXJ0eSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8UHJvcGVydHk+IGdldFByb3BlcnR5KCk7Ci0KLX0gLy8gRGlhZ3JhbUVsZW1lbnQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlhZ3JhbUxpbmsuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlhZ3JhbUxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFhY2JlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RpYWdyYW1MaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlhZ3JhbSBMaW5rPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Wm9vbSA8ZW0+Wm9vbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRWaWV3cG9ydCA8ZW0+Vmlld3BvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtTGluaygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEaWFncmFtTGluayBleHRlbmRzIERpYWdyYW1FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5ab29tPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5ab29tPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlpvb208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFpvb20oRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpYWdyYW1MaW5rX1pvb20oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Eb3VibGUiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFpvb20oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Wm9vbSA8ZW0+Wm9vbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Wm9vbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Wm9vbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Wm9vbShEb3VibGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Vmlld3BvcnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZpZXdwb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZpZXdwb3J0PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRWaWV3cG9ydChQb2ludCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtTGlua19WaWV3cG9ydCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUG9pbnQgZ2V0Vmlld3BvcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Vmlld3BvcnQgPGVtPlZpZXdwb3J0PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WaWV3cG9ydDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Vmlld3BvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZpZXdwb3J0KFBvaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0TGluayA8ZW0+TGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0R3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtTGlua19HcmFwaEVsZW1lbnQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0TGluawotCSAqIEBtb2RlbCBvcHBvc2l0ZT0ibGluayIgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0iZmFsc2UiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlHcmFwaEVsZW1lbnQgZ2V0R3JhcGhFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXREaWFncmFtTGluayA8ZW0+RGlhZ3JhbSBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpYWdyYW08L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlhZ3JhbTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RGlhZ3JhbShEaWFncmFtKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpYWdyYW1MaW5rX0RpYWdyYW0oKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldERpYWdyYW1MaW5rCi0JICogQG1vZGVsIG9wcG9zaXRlPSJkaWFncmFtTGluayIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaWFncmFtIGdldERpYWdyYW0oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlhZ3JhbTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGlhZ3JhbShEaWFncmFtIHZhbHVlKTsKLQotfSAvLyBEaWFncmFtTGluawpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaW1lbnNpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGltZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNTUzMjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaW1lbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGltZW5zaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uI2dldFdpZHRoIDxlbT5XaWR0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24jZ2V0SGVpZ2h0IDxlbT5IZWlnaHQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaW1lbnNpb24oKQotICogQG1vZGVsCi0gKiBAZXh0ZW5kcyBJTW9kZWxPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEaW1lbnNpb24gZXh0ZW5kcyBJTW9kZWxPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5XaWR0aDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XaWR0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V2lkdGgoRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpbWVuc2lvbl9XaWR0aCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRvdWJsZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb3VibGUgZ2V0V2lkdGgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uI2dldFdpZHRoIDxlbT5XaWR0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V2lkdGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdpZHRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXaWR0aChEb3VibGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IZWlnaHQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGVpZ2h0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIZWlnaHQoRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpbWVuc2lvbl9IZWlnaHQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Eb3VibGUiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldEhlaWdodCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24jZ2V0SGVpZ2h0IDxlbT5IZWlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhlaWdodDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SGVpZ2h0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIZWlnaHQoRG91YmxlIHZhbHVlKTsKLQotfSAvLyBEaW1lbnNpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlzY2lwbGluZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaXNjaXBsaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOTA2MTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaXNjaXBsaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc2NpcGxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIERpc2NpcGxpbmUgaXMgYSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuCi0gKiBBIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciAnYXJlYSBvZiBjb25jZXJuJyB3aXRoaW4gdGhlIG92ZXJhbGwgcHJvamVjdC4gVGhlIGdyb3VwaW5nIG9mIFRhc2tzIGludG8gZGlzY2lwbGluZXMgaXMgbWFpbmx5IGFuIGFpZCB0byB1bmRlcnN0YW5kaW5nIHRoZSBwcm9qZWN0IGZyb20gYSAndHJhZGl0aW9uYWwnIHdhdGVyZmFsbCBwZXJzcGVjdGl2ZS4gSG93ZXZlciwgdHlwaWNhbGx5LCBmb3IgZXhhbXBsZSwgaXQgaXMgbW9yZSBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyBhY3Rpdml0aWVzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gYWN0aXZpdGllcy4gU2VwYXJhdGluZyB0aGVzZSBhY3Rpdml0aWVzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIGFjdGl2aXRpZXMgZWFzaWVyIHRvIGNvbXByZWhlbmQuCi0gKiAKLSAqIERpc2NpcGxpbmUgaXMgYSBjYXRlZ29yaXphdGlvbiBvZiBUYXNrcyBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LiAgVGhpcyBpcyB0aGUgZXh0ZW5zaW9ucyBvZiBEaXNjaXBsaW5lIGRlZmluZWQgaW4gdGhlIE1ldGhvZCBDb3JlIHBhY2thZ2UgYWRkaW5nIGFuIGFkZGl0aW9uYWwgYXNzb2NpYXRpb24gdG8gQWN0aXZpdGllcywgd2hpY2ggcmVwcmVzZW50IHR5cGljYWwgc3RhbmRhcmQgb3IgcmVmZXJlbmNlIHdheXMgb2YgbWVhbmluZ2Z1bCBncm91cGluZ3Mgb2YgdGhlIERpc2NpcGxpbmUncyBUYXNrcyBpbnRvIHdvcmtmbG93cy4KLSAqIFRhc2tzIHJlcHJlc2VudCBkZXNjcmlwdGlvbnMgb2Ygd29yaywgd2hpY2ggYXJlIGNhdGVnb3JpemVkIGJ5IERpc2NpcGxpbmVzLiAgVGhlIHJlYXNvbiB0aGF0IHNldmVyYWwgVGFza3MgYXJlIGFsbCBjYXRlZ29yaXplZCBieSB0aGUgc2FtZSBEaXNjaXBsaW5lIGlzIHRoYXQgdGhleSBhbGwgcmVwcmVzZW50IGEgcGFydCBpbiBhY2hpZXZpbmcgYSBoaWdoZXIgZ29hbCBvciBwZXJmb3JtaW5nIHdvcmsgdGhhdCBpcyBhbGwgcmVsYXRlZCB0byBlYWNoIG90aGVyLiAgRXZlcnkgRGlzY2lwbGluZSBkZWZpbmVzIHN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgaXQgY2F0ZWdvcml6ZXMuICBTdWNoIHN0YW5kYXJkIHdheXMgYXJlIGV4cHJlc3MgYnkgQWN0aXZpdGllcyBvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGRlZmluaW5nIGhvdyB0aGUgVGFza3MgY2F0ZWdvcml6ZWQgYnkgdGhlIERpc2NpcGxpbmUgJ3dvcmsgdG9nZXRoZXInIGluIHRoZSBtb3N0IGdlbmVyaWMgd2F5LiAgVGhlc2UgcmVmZXJlbmNlIHdvcmtmbG93cyBhcmUgb2Z0ZW4gdXNlZCBmb3IgZWR1Y2F0aW5nIGFuZCB0ZWFjaGluZyBwcmFjdGl0aW9uZXJzLiAKLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSNnZXRUYXNrcyA8ZW0+VGFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSNnZXRTdWJkaXNjaXBsaW5lIDxlbT5TdWJkaXNjaXBsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUjZ2V0UmVmZXJlbmNlV29ya2Zsb3dzIDxlbT5SZWZlcmVuY2UgV29ya2Zsb3dzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEaXNjaXBsaW5lIGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXNrczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYXNrczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhc2tzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVfVGFza3MoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxUYXNrPiBnZXRUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViZGlzY2lwbGluZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWJkaXNjaXBsaW5lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViZGlzY2lwbGluZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lX1N1YmRpc2NpcGxpbmUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PERpc2NpcGxpbmU+IGdldFN1YmRpc2NpcGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBXb3JrZmxvd3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZmVyZW5jZSBXb3JrZmxvd3M8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2UgV29ya2Zsb3dzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8QWN0aXZpdHk+IGdldFJlZmVyZW5jZVdvcmtmbG93cygpOwotCi19IC8vIERpc2NpcGxpbmUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlzY2lwbGluZUdyb3VwaW5nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rpc2NpcGxpbmVHcm91cGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDhjZjNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlzY2lwbGluZUdyb3VwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBEaXNjaXBsaW5lIEdyb3VwaW5ncyBhcmUgdXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAiU29mdHdhcmUgRGlzY2lwbGluZXMiIHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgIlJlcXVpcmVtZW50cyBNYW5hZ2VtZW50IiBvciAiVGVzdGluZyI7ICJJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50IiB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICJJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyIsICJJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzIiwgb3IgIklUIEVuYWJsaW5nIFNlcnZpY2VzIi4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nI2dldERpc2NpcGxpbmVzIDxlbT5EaXNjaXBsaW5lczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVHcm91cGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEaXNjaXBsaW5lR3JvdXBpbmcgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc2NpcGxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc2NpcGxpbmVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzY2lwbGluZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RGlzY2lwbGluZT4gZ2V0RGlzY2lwbGluZXMoKTsKLQotfSAvLyBEaXNjaXBsaW5lR3JvdXBpbmcKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRG9tYWluLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RvbWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjVlMDZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRG9tYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvbWFpbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIERvbWFpbiBpcyBhIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4KLSAqIERvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbiNnZXRXb3JrUHJvZHVjdHMgPGVtPldvcmsgUHJvZHVjdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluI2dldFN1YmRvbWFpbnMgPGVtPlN1YmRvbWFpbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREb21haW4oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9tYWluIGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREb21haW5fV29ya1Byb2R1Y3RzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3Q+IGdldFdvcmtQcm9kdWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViZG9tYWluczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWlufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YmRvbWFpbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWJkb21haW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERvbWFpbl9TdWJkb21haW5zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxEb21haW4+IGdldFN1YmRvbWFpbnMoKTsKLQotfSAvLyBEb21haW4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MTRhZjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JTW9kZWxPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBJTW9kZWxPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFbGVtZW50IGV4dGVuZHMgSU1vZGVsT2JqZWN0IHsKLX0gLy8gRWxlbWVudApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9FbGxpcHNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0VsbGlwc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3ZTVlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0VsbGlwc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGxpcHNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRDZW50ZXIgPGVtPkNlbnRlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFJhZGl1c1ggPGVtPlJhZGl1cyBYPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0UmFkaXVzWSA8ZW0+UmFkaXVzIFk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRSb3RhdGlvbiA8ZW0+Um90YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRTdGFydEFuZ2xlIDxlbT5TdGFydCBBbmdsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldEVuZEFuZ2xlIDxlbT5FbmQgQW5nbGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRFbGxpcHNlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVsbGlwc2UgZXh0ZW5kcyBHcmFwaGljUHJpbWl0aXZlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYWRpdXMgWDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmFkaXVzIFg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmFkaXVzIFg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJhZGl1c1goRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEVsbGlwc2VfUmFkaXVzWCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRvdWJsZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb3VibGUgZ2V0UmFkaXVzWCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFJhZGl1c1ggPGVtPlJhZGl1cyBYPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SYWRpdXMgWDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmFkaXVzWCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmFkaXVzWChEb3VibGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmFkaXVzIFk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJhZGl1cyBZPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJhZGl1cyBZPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSYWRpdXNZKERvdWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRFbGxpcHNlX1JhZGl1c1koKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Eb3VibGUiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFJhZGl1c1koKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRSYWRpdXNZIDxlbT5SYWRpdXMgWTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmFkaXVzIFk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJhZGl1c1koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJhZGl1c1koRG91YmxlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Um90YXRpb24oRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEVsbGlwc2VfUm90YXRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Eb3VibGUiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFJvdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0Um90YXRpb24gPGVtPlJvdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Um90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJvdGF0aW9uKERvdWJsZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydCBBbmdsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RhcnQgQW5nbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgQW5nbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0QW5nbGUoRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEVsbGlwc2VfU3RhcnRBbmdsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRvdWJsZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb3VibGUgZ2V0U3RhcnRBbmdsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFN0YXJ0QW5nbGUgPGVtPlN0YXJ0IEFuZ2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBBbmdsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnRBbmdsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnRBbmdsZShEb3VibGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW5kIEFuZ2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbmQgQW5nbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW5kIEFuZ2xlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFbmRBbmdsZShEb3VibGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RWxsaXBzZV9FbmRBbmdsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRvdWJsZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb3VibGUgZ2V0RW5kQW5nbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRFbmRBbmdsZSA8ZW0+RW5kIEFuZ2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbmQgQW5nbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVuZEFuZ2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbmRBbmdsZShEb3VibGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2VudGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DZW50ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2VudGVyPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDZW50ZXIoUG9pbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RWxsaXBzZV9DZW50ZXIoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBvaW50IGdldENlbnRlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldENlbnRlciA8ZW0+Q2VudGVyPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DZW50ZXI8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENlbnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2VudGVyKFBvaW50IHZhbHVlKTsKLQotfSAvLyBFbGxpcHNlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyMTVkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMgcXVhbGlmeSB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRXhhbXBsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9FeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2Yjg3NGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9FeGFtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gRXhhbXBsZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RXhhbXBsZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFeGFtcGxlIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBFeGFtcGxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Z1bGZpbGxhYmxlRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9GdWxmaWxsYWJsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRjOGU1My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Z1bGZpbGxhYmxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GdWxmaWxsYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50I2dldEZ1bGZpbGxzIDxlbT5GdWxmaWxsczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEZ1bGZpbGxhYmxlRWxlbWVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBGdWxmaWxsYWJsZUVsZW1lbnQgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZ1bGZpbGxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RnVsZmlsbHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GdWxmaWxsczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IGdldEZ1bGZpbGxzKCk7Ci0KLX0gLy8gRnVsZmlsbGFibGVFbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoQ29ubmVjdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoQ29ubmVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZTBjZTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaENvbm5lY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HcmFwaCBDb25uZWN0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciNnZXRHcmFwaEVkZ2UgPGVtPkdyYXBoIEVkZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhDb25uZWN0b3IoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3JhcGhDb25uZWN0b3IgZXh0ZW5kcyBHcmFwaEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0QW5jaG9yYWdlIDxlbT5BbmNob3JhZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhDb25uZWN0b3JfR3JhcGhFbGVtZW50KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldEFuY2hvcmFnZQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iYW5jaG9yYWdlIiByZXF1aXJlZD0idHJ1ZSIgdHJhbnNpZW50PSJmYWxzZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUdyYXBoRWxlbWVudCBnZXRHcmFwaEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEdyYXBoRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HcmFwaCBFZGdlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2V9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlI2dldEFuY2hvciA8ZW0+QW5jaG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyYXBoIEVkZ2U8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HcmFwaCBFZGdlPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWRnZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZSNnZXRBbmNob3IKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImFuY2hvciIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8R3JhcGhFZGdlPiBnZXRHcmFwaEVkZ2UoKTsKLQotfSAvLyBHcmFwaENvbm5lY3RvcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaEVkZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhFZGdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmODUzYjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaEVkZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGggRWRnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZSNnZXRXYXlwb2ludHMgPGVtPldheXBvaW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UjZ2V0QW5jaG9yIDxlbT5BbmNob3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaEVkZ2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3JhcGhFZGdlIGV4dGVuZHMgR3JhcGhFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbmNob3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yfS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yI2dldEdyYXBoRWRnZSA8ZW0+R3JhcGggRWRnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BbmNob3I8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbmNob3I8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhFZGdlX0FuY2hvcigpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yI2dldEdyYXBoRWRnZQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iZ3JhcGhFZGdlIiBsb3dlcj0iMiIgdXBwZXI9IjIiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PEdyYXBoQ29ubmVjdG9yPiBnZXRBbmNob3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldheXBvaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V2F5cG9pbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2F5cG9pbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoRWRnZV9XYXlwb2ludHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIGxvd2VyPSIyIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxQb2ludD4gZ2V0V2F5cG9pbnRzKCk7Ci0KLX0gLy8gR3JhcGhFZGdlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIzMzU2Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRDb250YWluZWQgPGVtPkNvbnRhaW5lZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0UG9zaXRpb24gPGVtPlBvc2l0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRMaW5rIDxlbT5MaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRBbmNob3JhZ2UgPGVtPkFuY2hvcmFnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0U2VtYW50aWNNb2RlbCA8ZW0+U2VtYW50aWMgTW9kZWw8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaEVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdyYXBoRWxlbWVudCBleHRlbmRzIERpYWdyYW1FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3NpdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zaXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zaXRpb248L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBvc2l0aW9uKFBvaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoRWxlbWVudF9Qb3NpdGlvbigpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUG9pbnQgZ2V0UG9zaXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldFBvc2l0aW9uIDxlbT5Qb3NpdGlvbjwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9zaXRpb248L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBvc2l0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQb3NpdGlvbihQb2ludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250YWluZWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50fS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldENvbnRhaW5lcl8gPGVtPkNvbnRhaW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250YWluZWQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250YWluZWQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhFbGVtZW50X0NvbnRhaW5lZCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldENvbnRhaW5lcl8KLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImNvbnRhaW5lciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxEaWFncmFtRWxlbWVudD4gZ2V0Q29udGFpbmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGlua30uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGluazwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxpbms8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhFbGVtZW50X0xpbmsoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRHcmFwaEVsZW1lbnQKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImdyYXBoRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxEaWFncmFtTGluaz4gZ2V0TGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QW5jaG9yYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3Rvcn0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QW5jaG9yYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QW5jaG9yYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoRWxlbWVudF9BbmNob3JhZ2UoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciNnZXRHcmFwaEVsZW1lbnQKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImdyYXBoRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxHcmFwaENvbm5lY3Rvcj4gZ2V0QW5jaG9yYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZW1hbnRpYyBNb2RlbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VtYW50aWMgTW9kZWw8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VtYW50aWMgTW9kZWw8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFNlbWFudGljTW9kZWwoU2VtYW50aWNNb2RlbEJyaWRnZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaEVsZW1lbnRfU2VtYW50aWNNb2RlbCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0R3JhcGhFbGVtZW50Ci0JICogQG1vZGVsIG9wcG9zaXRlPSJncmFwaEVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZW1hbnRpY01vZGVsQnJpZGdlIGdldFNlbWFudGljTW9kZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldFNlbWFudGljTW9kZWwgPGVtPlNlbWFudGljIE1vZGVsPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZW1hbnRpYyBNb2RlbDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U2VtYW50aWNNb2RlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VtYW50aWNNb2RlbChTZW1hbnRpY01vZGVsQnJpZGdlIHZhbHVlKTsKLQotfSAvLyBHcmFwaEVsZW1lbnQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhOb2RlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzczN2RhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HcmFwaCBOb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlI2dldFNpemUgPGVtPlNpemU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaE5vZGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3JhcGhOb2RlIGV4dGVuZHMgR3JhcGhFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaXplPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TaXplPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNpemU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFNpemUoRGltZW5zaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoTm9kZV9TaXplKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaW1lbnNpb24gZ2V0U2l6ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGUjZ2V0U2l6ZSA8ZW0+U2l6ZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2l6ZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U2l6ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2l6ZShEaW1lbnNpb24gdmFsdWUpOwotCi19IC8vIEdyYXBoTm9kZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaGljUHJpbWl0aXZlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoaWNQcmltaXRpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwYzhjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoaWNQcmltaXRpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyYXBoaWMgUHJpbWl0aXZlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaGljUHJpbWl0aXZlKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBHcmFwaGljUHJpbWl0aXZlIGV4dGVuZHMgTGVhZkVsZW1lbnQgewotfSAvLyBHcmFwaGljUHJpbWl0aXZlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0d1aWRhbmNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0d1aWRhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmM0NjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HdWlkYW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGFuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBHdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3VpZGFuY2UoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEd1aWRhbmNlIGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotfSAvLyBHdWlkYW5jZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HdWlkYW5jZURlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0d1aWRhbmNlRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJhNmU2Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0d1aWRhbmNlRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiNnZXRBdHRhY2htZW50cyA8ZW0+QXR0YWNobWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEd1aWRhbmNlRGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dGFjaG1lbnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBmaWVsZCBpcyBwcmltYXJpbHkgdXNlZCBmb3IgYXR0YWNobWVudHMgYXVnbWVudGluZyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgZm9yIGd1aWRhbmNlLiAgSW4gcGFydGljdWxhciB0aGUgYXR0cmlidXRlIGlzIHVzZWQgZm9yIFRlbXBsYXRlcywgRXhhbXBsZXMsIGFuZCBSZXVzYWJsZSBBc3NldHMgdG8gY29udGFpbiB0aGUgYWN0dWFsIGF0dGFjaG1lbnQgZGVzY3JpYmVkIGluIHRoZSBtYWluRGVzY3JpcHRpb24uICBJdCBjYW4gYWRkaXRpb25hbGx5IGNvbnRhaW4gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBndWlkYW5jZSBpbiBqdXN0IGEgdGhpcmQgcGFydHkgZm9ybWF0LCBlLmcuIFBERiwgTVMgV29yZCwgb3IgV29yZCBQZXJmZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRhY2htZW50czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXR0YWNobWVudHMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBdHRhY2htZW50cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uI2dldEF0dGFjaG1lbnRzIDxlbT5BdHRhY2htZW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0YWNobWVudHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF0dGFjaG1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdHRhY2htZW50cyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIEd1aWRhbmNlRGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3VpZGVsaW5lLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0d1aWRlbGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGIxOGQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3VpZGVsaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIEd1aWRlbGluZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCBvbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcyAoZS5nLiBncm91cGVkIHRvZ2V0aGVyIGFzIGFjdGl2aXRpZXMpIG9yIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuICBBbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZSB0aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkIGFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzIGFuZCBtYXR1cml0eSwgZXRjLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHdWlkZWxpbmUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3VpZGVsaW5lIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBHdWlkZWxpbmUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvSW1hZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvSW1hZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNjNjFkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0ltYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbWFnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlI2dldFVyaSA8ZW0+VXJpPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlI2dldE1pbWVUeXBlIDxlbT5NaW1lIFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRJbWFnZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJbWFnZSBleHRlbmRzIExlYWZFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVyaTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vcmk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVyaShVUkkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0SW1hZ2VfVXJpKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVXJpIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVVJJIGdldFVyaSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZSNnZXRVcmkgPGVtPlVyaTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXJpPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVyaShVUkkgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWltZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWltZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbWUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWltZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEltYWdlX01pbWVUeXBlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWltZVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UjZ2V0TWltZVR5cGUgPGVtPk1pbWUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWltZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNaW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWltZVR5cGUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBJbWFnZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9JdGVyYXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvSXRlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MGRiMzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9JdGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkl0ZXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEl0ZXJhdGlvbiBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotICogSXRlcmF0aW9uIGdyb3VwcyBhIHNldCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEl0IHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbiByZXBldGl0aXZlIGN5Y2xlcy4gIFRoZSBjb25jZXB0IG9mIEl0ZXJhdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCBydWxlcyBpbiBkaWZmZXJlbnQgbWV0aG9kcy4gIEZvciBleGFtcGxlLCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBtZXRob2QgZnJhbWV3b3JrIChSVVApIGRlZmluZXMgYSBydWxlIHRoYXQgSXRlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gc3BhbiBhY3Jvc3MgUGhhc2VzLiAgSW4gY29udHJhc3QgSUJNIEdsb2JhbCBTZXJ2aWNlcyBNZXRob2QgKEdTTWV0aG9kKSBiYXNlZCBtZXRob2QgZnJhbWV3b3JrcyB0aGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgYW5kIEl0ZXJhdGlvbiBjYW4gYmUgZGVmaW5lZCB3aGljaCBuZXN0IFBoYXNlcy4gIFJ1bGVzIGxpa2UgdGhlc2UsIHdoaWNoIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGVuZm9yY2VkIGJ5IHRoaXMgbWV0YS1tb2RlbC4gIEluc3RlYWQsIHByb2Nlc3MgYXV0aG9ycyBhcmUgZXhwZWN0ZWQgdG8gZm9sbG93IGFuZCBjaGVjayB0aGVzZSBydWxlcyBtYW51YWxseS4gIChOb3RlOiBBbnkgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGJlIHJlcGVhdGVkOyBob3dldmVyLCBJdGVyYXRpb25zIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYSBzcGVjaWFsIG1ldGEtbW9kZWwgY29uY2VwdCwgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW50IHJvbGUgZm9yIG1hbnkgbWV0aG9kcy4pCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0SXRlcmF0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEl0ZXJhdGlvbiBleHRlbmRzIEFjdGl2aXR5IHsKLX0gLy8gSXRlcmF0aW9uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0tpbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvS2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzA0OWUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvS2luZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEtpbmQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgS2luZCBleHRlbmRzIENvbnRlbnRFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm99LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRLaW5kX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbz4gZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQotfSAvLyBLaW5kCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0xlYWZFbGVtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0xlYWZFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliOGY5ZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9MZWFmRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TGVhZiBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRMZWFmRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGVhZkVsZW1lbnQgZXh0ZW5kcyBEaWFncmFtRWxlbWVudCB7Ci19IC8vIExlYWZFbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZENvbmZpZ3VyYXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjBmMGFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIE1ldGhvZCBDb25maWd1cmF0aW9uIGlzIGEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24gPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0UHJvY2Vzc1ZpZXdzIDxlbT5Qcm9jZXNzIFZpZXdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0RGVmYXVsdFZpZXcgPGVtPkRlZmF1bHQgVmlldzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEJhc2VDb25maWd1cmF0aW9ucyA8ZW0+QmFzZSBDb25maWd1cmF0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldFN1YnRyYWN0ZWRDYXRlZ29yeSA8ZW0+U3VidHJhY3RlZCBDYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEFkZGVkQ2F0ZWdvcnkgPGVtPkFkZGVkIENhdGVnb3J5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RDb25maWd1cmF0aW9uIGV4dGVuZHMgTWV0aG9kVW5pdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PE1ldGhvZFBsdWdpbj4gZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxNZXRob2RQYWNrYWdlPiBnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9jZXNzIFZpZXdzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvY2VzcyBWaWV3czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2Nlc3MgVmlld3M8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlld3MoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxDb250ZW50Q2F0ZWdvcnk+IGdldFByb2Nlc3NWaWV3cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBWaWV3PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWZhdWx0IFZpZXc8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBWaWV3PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0VmlldyhDb250ZW50Q2F0ZWdvcnkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29udGVudENhdGVnb3J5IGdldERlZmF1bHRWaWV3KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0RGVmYXVsdFZpZXcgPGVtPkRlZmF1bHQgVmlldzwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBWaWV3PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0VmlldygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdFZpZXcoQ29udGVudENhdGVnb3J5IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgQ29uZmlndXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZSBDb25maWd1cmF0aW9uczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgQ29uZmlndXJhdGlvbnM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbnMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBnZXRCYXNlQ29uZmlndXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VidHJhY3RlZCBDYXRlZ29yeTwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PENvbnRlbnRDYXRlZ29yeT4gZ2V0U3VidHJhY3RlZENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRlZCBDYXRlZ29yeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFkZGVkIENhdGVnb3J5PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRkZWQgQ2F0ZWdvcnk8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8Q29udGVudENhdGVnb3J5PiBnZXRBZGRlZENhdGVnb3J5KCk7Ci0KLX0gLy8gTWV0aG9kQ29uZmlndXJhdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMzcwYjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEV2ZXJ5IGNsYXNzIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGlzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzIE1ldGhvZCBFbGVtZW50IGlzIHRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIGNsYXNzZXMgYW5kIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGV2ZXJ5IG90aGVyIGVsZW1lbnQgdHlwZSBvZiB0aGlzIG1vZGVsLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuICBNZXRob2QgRWxlbWVudCBpbmhlcml0cyB0aGUgTmFtZSBhdHRyaWJ1dGUgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50J3Mgc3VwZXIgY2xhc3MuICBFdmVyeSBlbGVtZW50IGRlZmluZWQgYXMgYSBVTUEgaW5zdGFuY2UgaXMgZGVyaXZlZCBmcm9tIE1vZGVsIEVsZW1lbnQuICBFdmVyeSBNZXRob2QgRWxlbWVudCBpbi1zdGFuY2UgaXMgYXQgbGVhc3QgZGVmaW5lZCBieSBhIHVuaXF1ZSBpZCwgYSBuYW1lLCBhcyB3ZWxsIGFzIGJyaWVmIGRlc2NyaXB0aW9uLgotICogTWV0aG9kIEVsZW1lbnQgaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBhZGRzIGFkZGl0aW9uYWwgcHJvcGVydGllcyB2aWEgcGFja2FnZSBtZXJnZSB0byBNZXRob2QgRWxlbWVudCBkZWZpbmVkIGluIE1ldGhvZCBDb3JlIG5lZWRlZCBmb3IgdGhlIHZhcmlhYmlsaXR5IGFuZCBleHRlbnNpYmlsaXR5IGNhcGFiaWxpdGllcyBpbnRyb2R1Y2VzIGluIHRoaXMgcGFja2FnZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0R3VpZCA8ZW0+R3VpZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0QnJpZWZEZXNjcmlwdGlvbiA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRPd25lZFJ1bGVzIDxlbT5Pd25lZCBSdWxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRLaW5kIDxlbT5LaW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0U3VwcHJlc3NlZCA8ZW0+U3VwcHJlc3NlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldE9yZGVyaW5nR3VpZGUgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kRWxlbWVudCBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IGhhcyBhIGdsb2JhbCB1bmlxdWUgaWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkd1aWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEd1aWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfR3VpZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgaWQ9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRHdWlkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0R3VpZCA8ZW0+R3VpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R3VpZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0R3VpZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R3VpZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gInJ1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQiIHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICJqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50IiB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICJBcmNoaXRlY3R1cmUgRG9jdW1lbnQiLgotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlc2VudGF0aW9uTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlc2VudGF0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlc2VudGF0aW9uTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QnJpZWZEZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldEJyaWVmRGVzY3JpcHRpb24gPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QnJpZWZEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QnJpZWZEZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3duZWQgUnVsZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Pd25lZCBSdWxlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X093bmVkUnVsZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PENvbnN0cmFpbnQ+IGdldE93bmVkUnVsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5PiBnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPktpbmQ8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9LaW5kKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8S2luZD4gZ2V0S2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlIEV4dGVuZHMgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwcHJlc3NlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3VwcHJlc3NlZChCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfU3VwcHJlc3NlZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Cb29sZWFuIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0U3VwcHJlc3NlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldFN1cHByZXNzZWQgPGVtPlN1cHByZXNzZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1cHByZXNzZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN1cHByZXNzZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1cHByZXNzZWQoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPcmRlcmluZ0d1aWRlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X09yZGVyaW5nR3VpZGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRPcmRlcmluZ0d1aWRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3JkZXJpbmdHdWlkZSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPcmRlcmluZ0d1aWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPcmRlcmluZ0d1aWRlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTWV0aG9kRWxlbWVudApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RFbGVtZW50UHJvcGVydHkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kRWxlbWVudFByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjY2IwMjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RFbGVtZW50UHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RFbGVtZW50UHJvcGVydHkgZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50UHJvcGVydHlfVmFsdWUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTWV0aG9kRWxlbWVudFByb3BlcnR5CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZExpYnJhcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDRlNThmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgTGlicmFyeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSNnZXRNZXRob2RQbHVnaW5zIDxlbT5NZXRob2QgUGx1Z2luczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5I2dldFByZWRlZmluZWRDb25maWd1cmF0aW9ucyA8ZW0+UHJlZGVmaW5lZCBDb25maWd1cmF0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZExpYnJhcnkoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kTGlicmFyeSBleHRlbmRzIE1ldGhvZFVuaXQsIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2lucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8TWV0aG9kUGx1Z2luPiBnZXRNZXRob2RQbHVnaW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZWRlZmluZWQgQ29uZmlndXJhdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZExpYnJhcnlfUHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQotfSAvLyBNZXRob2RMaWJyYXJ5CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFBhY2thZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDI0MTFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgTWV0aG9kIFBhY2thZ2UgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UjZ2V0R2xvYmFsIDxlbT5HbG9iYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRSZXVzZWRQYWNrYWdlcyA8ZW0+UmV1c2VkIFBhY2thZ2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UjZ2V0Q2hpbGRQYWNrYWdlcyA8ZW0+Q2hpbGQgUGFja2FnZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RQYWNrYWdlIGV4dGVuZHMgTWV0aG9kRWxlbWVudCwKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIE1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdsb2JhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0R2xvYmFsKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGFja2FnZV9HbG9iYWwoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldEdsb2JhbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlI2dldEdsb2JhbCA8ZW0+R2xvYmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HbG9iYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEdsb2JhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R2xvYmFsKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV1c2VkIFBhY2thZ2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJldXNlZCBQYWNrYWdlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJldXNlZCBQYWNrYWdlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlX1JldXNlZFBhY2thZ2VzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8TWV0aG9kUGFja2FnZT4gZ2V0UmV1c2VkUGFja2FnZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNoaWxkIFBhY2thZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoaWxkIFBhY2thZ2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hpbGQgUGFja2FnZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxNZXRob2RQYWNrYWdlPiBnZXRDaGlsZFBhY2thZ2VzKCk7Ci0KLQlNZXRob2RQYWNrYWdlIGdldFBhcmVudFBhY2thZ2UoKTsKLQotfSAvLyBNZXRob2RQYWNrYWdlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE0ZDhlZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFBsdWdpbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgTWV0aG9kIFBsdWdpbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLSAqIE1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotICogU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2dldFVzZXJDaGFuZ2VhYmxlIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2dldE1ldGhvZFBhY2thZ2VzIDxlbT5NZXRob2QgUGFja2FnZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2dldEJhc2VzIDxlbT5CYXNlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBsdWdpbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RQbHVnaW4gZXh0ZW5kcyBNZXRob2RVbml0LCBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVzZXIgQ2hhbmdlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVc2VyQ2hhbmdlYWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkJvb2xlYW4iIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRVc2VyQ2hhbmdlYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4jZ2V0VXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVc2VyQ2hhbmdlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXNlckNoYW5nZWFibGUoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PE1ldGhvZFBhY2thZ2U+IGdldE1ldGhvZFBhY2thZ2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2lufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2VzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8TWV0aG9kUGx1Z2luPiBnZXRCYXNlcygpOwotCi19IC8vIE1ldGhvZFBsdWdpbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RVbml0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFVuaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5NjAyMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFVuaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBVbml0PC9iPjwvZW0+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+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVbWFQYWNrYWdlIGdldFVtYVBhY2thZ2UoKTsKLQotfSAvL1VtYUZhY3RvcnkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVW1hUGFja2FnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9VbWFQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MjQ0ZWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9VbWFQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDk0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+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+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19CQVNFUyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX05BTUUgPSBQUk9DRVNTX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HVUlEID0gUFJPQ0VTU19fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRVNFTlRBVElPTl9OQU1FID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19PV05FRF9SVUxFUyA9IFBST0NFU1NfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBST0NFU1NfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0tJTkQgPSBQUk9DRVNTX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19TVVBQUkVTU0VEID0gUFJPQ0VTU19fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX09SREVSSU5HX0dVSURFID0gUFJPQ0VTU19fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19BQlNUUkFDVCA9IFBST0NFU1NfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRVNFTlRBVElPTiA9IFBST0NFU1NfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19TSEFQRUlDT04gPSBQUk9DRVNTX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19OT0RFSUNPTiA9IFBST0NFU1NfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRUZJWCA9IFBST0NFU1NfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSVNfUExBTk5FRCA9IFBST0NFU1NfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gUFJPQ0VTU19fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSVNfT1BUSU9OQUwgPSBQUk9DRVNTX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QUkVTRU5URURfQUZURVIgPSBQUk9DRVNTX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRVNFTlRFRF9CRUZPUkUgPSBQUk9DRVNTX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QTEFOTklOR19EQVRBID0gUFJPQ0VTU19fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fU1VQRVJfQUNUSVZJVElFUyA9IFBST0NFU1NfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQ0hFQ0tMSVNUUyA9IFBST0NFU1NfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0NPTkNFUFRTID0gUFJPQ0VTU19fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0VYQU1QTEVTID0gUFJPQ0VTU19fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1VJREVMSU5FUyA9IFBST0NFU1NfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19SRVVTQUJMRV9BU1NFVFMgPSBQUk9DRVNTX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gUFJPQ0VTU19fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19URU1QTEFURVMgPSBQUk9DRVNTX19URU1QTEFURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUkVQT1JUUyA9IFBST0NFU1NfX1JFUE9SVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlMgPSBQUk9DRVNTX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbG1lbnRvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fVE9PTE1FTlRPUiA9IFBST0NFU1NfX1RPT0xNRU5UT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lTX1JFUEVBVEFCTEUgPSBQUk9DRVNTX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19PTkdPSU5HID0gUFJPQ0VTU19fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19FVkVOVF9EUklWRU4gPSBQUk9DRVNTX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluayBUbyBQcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fTElOS19UT19QUkVERUNFU1NPUiA9IFBST0NFU1NfX0xJTktfVE9fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0ZVTEZJTExTID0gUFJPQ0VTU19fRlVMRklMTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1ZBUklBQklMSVRZX1RZUEUgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QUkVDT05ESVRJT04gPSBQUk9DRVNTX19QUkVDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BPU1RDT05ESVRJT04gPSBQUk9DRVNTX19QT1NUQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQlJFQUtET1dOX0VMRU1FTlRTID0gUFJPQ0VTU19fQlJFQUtET1dOX0VMRU1FTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19ST0FETUFQUyA9IFBST0NFU1NfX1JPQURNQVBTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm5zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JTkNMVURFU19QQVRURVJOUyA9IFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0RFRkFVTFRfQ09OVEVYVCA9IFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19WQUxJRF9DT05URVhUID0gUFJPQ0VTU19fVkFMSURfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlZCBPbiBQcm9jZXNzZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VEX09OX1BST0NFU1NFUyA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fR1VJRCA9IEdVSURBTkNFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fT1dORURfUlVMRVMgPSBHVUlEQU5DRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fS0lORCA9IEdVSURBTkNFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBHVUlEQU5DRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19HVUlERUxJTkVTID0gR1VJREFOQ0VfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19FWEFNUExFUyA9IEdVSURBTkNFX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fVEVSTURFRklOSVRJT04gPSBHVUlEQU5DRV9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIFByYWN0aWNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVMgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50IFJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRVMgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3Rpdml0eSBSZWZlcmVuY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFUyA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByYWN0aWNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fR1VJRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0tJTkQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fR1VJRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fS0lORCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQVVUSE9SUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fVkVSU0lPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fU0VDVElPTlMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhvd3RvIFN0YWZmPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19OQU1FID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0dVSUQgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19LSU5EID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19TRUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ib3d0byBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjb3BlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBOb3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fTkFNRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0dVSUQgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTID0gUFJPQ0VTU19ERVNDUklQVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fS0lORCA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQVVUSE9SUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVkVSU0lPTiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0VDVElPTlMgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19TRUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gUFJPQ0VTU19ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FID0gUFJPQ0VTU19ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19QVVJQT1NFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ib3d0byBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGID0gUFJPQ0VTU19ERVNDUklQVElPTl9fSE9XVE9fU1RBRkY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIE5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVMgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2FsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SaXNrIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTCA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGluZyBUZWNobmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIE9mIENvbnRyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVCA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX0dVSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19LSU5EID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmluZWQgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fTkFNRSA9IERFU0NSSVBUT1JfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX0dVSUQgPSBERVNDUklQVE9SX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX0JSSUVGX0RFU0NSSVBUSU9OID0gREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX09XTkVEX1JVTEVTID0gREVTQ1JJUFRPUl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fS0lORCA9IERFU0NSSVBUT1JfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1NVUFBSRVNTRUQgPSBERVNDUklQVE9SX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREUgPSBERVNDUklQVE9SX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX0lTX0FCU1RSQUNUID0gREVTQ1JJUFRPUl9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OID0gREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1NIQVBFSUNPTiA9IERFU0NSSVBUT1JfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX05PREVJQ09OID0gREVTQ1JJUFRPUl9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJFRklYID0gREVTQ1JJUFRPUl9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19JU19QTEFOTkVEID0gREVTQ1JJUFRPUl9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19JU19PUFRJT05BTCA9IERFU0NSSVBUT1JfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUiA9IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRSA9IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEEgPSBERVNDUklQVE9SX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUSUVTID0gREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19DSEVDS0xJU1RTID0gREVTQ1JJUFRPUl9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fQ09OQ0VQVFMgPSBERVNDUklQVE9SX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fRVhBTVBMRVMgPSBERVNDUklQVE9SX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19HVUlERUxJTkVTID0gREVTQ1JJUFRPUl9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1JFVVNBQkxFX0FTU0VUUyA9IERFU0NSSVBUT1JfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBERVNDUklQVE9SX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1RFTVBMQVRFUyA9IERFU0NSSVBUT1JfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19SRVBPUlRTID0gREVTQ1JJUFRPUl9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUyA9IERFU0NSSVBUT1JfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19UT09MTUVOVE9SID0gREVTQ1JJUFRPUl9fVE9PTE1FTlRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+cHJvY2VzcyBDb21wb25lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUk9DRVNTX0NPTVBPTkVOVCA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX05BTUUgPSBNRVRIT0RfUEFDS0FHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19HVUlEID0gTUVUSE9EX1BBQ0tBR0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19PV05FRF9SVUxFUyA9IE1FVEhPRF9QQUNLQUdFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX0tJTkQgPSBNRVRIT0RfUEFDS0FHRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19TVVBQUkVTU0VEID0gTUVUSE9EX1BBQ0tBR0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdsb2JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fR0xPQkFMID0gTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTID0gTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGlsZCBQYWNrYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19DSElMRF9QQUNLQUdFUyA9IE1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUyA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fTkFNRSA9IFBST0NFU1NfUEFDS0FHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0dVSUQgPSBQUk9DRVNTX1BBQ0tBR0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX09XTkVEX1JVTEVTID0gUFJPQ0VTU19QQUNLQUdFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fS0lORCA9IFBST0NFU1NfUEFDS0FHRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX1NVUFBSRVNTRUQgPSBQUk9DRVNTX1BBQ0tBR0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdsb2JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19HTE9CQUwgPSBQUk9DRVNTX1BBQ0tBR0VfX0dMT0JBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19SRVVTRURfUEFDS0FHRVMgPSBQUk9DRVNTX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGlsZCBQYWNrYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0NISUxEX1BBQ0tBR0VTID0gUFJPQ0VTU19QQUNLQUdFX19DSElMRF9QQUNLQUdFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTU19FTEVNRU5UUyA9IFBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0RJQUdSQU1TID0gUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlMgPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEUgPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTiA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT04gPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFRfU1RBVEVNRU5UID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0VTID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUyA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0ZhbWlseUltcGwgPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NGYW1pbHlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0ZhbWlseSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWSA9IDExMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsIDxlbT5NZXRob2QgTGlicmFyeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZExpYnJhcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUlkgPSAxMTI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2ludEltcGwgPGVtPlBvaW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvaW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBPSU5UID0gOTU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtRWxlbWVudEltcGwgPGVtPkRpYWdyYW0gRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaWFncmFtRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlQgPSA5MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fR1VJRCA9IE1FVEhPRF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fT1dORURfUlVMRVMgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX19LSU5EID0gTUVUSE9EX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlhZ3JhbSBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVsZW1lbnRJbXBsIDxlbT5HcmFwaCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVCA9IDkxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19OQU1FID0gRElBR1JBTV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19HVUlEID0gRElBR1JBTV9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBESUFHUkFNX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBESUFHUkFNX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19PV05FRF9SVUxFUyA9IERJQUdSQU1fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19LSU5EID0gRElBR1JBTV9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19TVVBQUkVTU0VEID0gRElBR1JBTV9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBESUFHUkFNX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19JU19WSVNJQkxFID0gRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19DT05UQUlORVIgPSBESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX1JFRkVSRU5DRSA9IERJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19QUk9QRVJUWSA9IERJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19DT05UQUlORUQgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19QT1NJVElPTiA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19MSU5LID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFuY2hvcmFnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlbWFudGljIE1vZGVsPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtTGlua0ltcGwgPGVtPkRpYWdyYW0gTGluazwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtTGlua0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaWFncmFtTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESUFHUkFNX0xJTksgPSA5NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoQ29ubmVjdG9ySW1wbCA8ZW0+R3JhcGggQ29ubmVjdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoQ29ubmVjdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEdyYXBoQ29ubmVjdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUiA9IDk3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VtYW50aWNNb2RlbEJyaWRnZUltcGwgPGVtPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZW1hbnRpY01vZGVsQnJpZGdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNlbWFudGljTW9kZWxCcmlkZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFID0gOTk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaW1lbnNpb25JbXBsIDxlbT5EaW1lbnNpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGltZW5zaW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpbWVuc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESU1FTlNJT04gPSAxMDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZWZlcmVuY2VJbXBsIDxlbT5SZWZlcmVuY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVmZXJlbmNlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRUZFUkVOQ0UgPSA5MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb3BlcnR5SW1wbCA8ZW0+UHJvcGVydHk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvcGVydHlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFkgPSA5NDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWRnZUltcGwgPGVtPkdyYXBoIEVkZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFZGdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEdyYXBoRWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBHUkFQSF9FREdFID0gOTg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaE5vZGVJbXBsIDxlbT5HcmFwaCBOb2RlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoTm9kZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERSA9IDkwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19OQU1FID0gR1JBUEhfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fR1VJRCA9IEdSQVBIX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19QUkVTRU5UQVRJT05fTkFNRSA9IEdSQVBIX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHUkFQSF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fT1dORURfUlVMRVMgPSBHUkFQSF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHUkFQSF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19LSU5EID0gR1JBUEhfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fU1VQUFJFU1NFRCA9IEdSQVBIX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19PUkRFUklOR19HVUlERSA9IEdSQVBIX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19JU19WSVNJQkxFID0gR1JBUEhfRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fQ09OVEFJTkVSID0gR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fUkVGRVJFTkNFID0gR1JBUEhfRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19QUk9QRVJUWSA9IEdSQVBIX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fQ09OVEFJTkVEID0gR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc2l0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fUE9TSVRJT04gPSBHUkFQSF9FTEVNRU5UX19QT1NJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19MSU5LID0gR1JBUEhfRUxFTUVOVF9fTElOSzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbmNob3JhZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX0FOQ0hPUkFHRSA9IEdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZW1hbnRpYyBNb2RlbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX1NFTUFOVElDX01PREVMID0gR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2l6ZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX1NJWkUgPSBHUkFQSF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkdyYXBoIE5vZGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9GRUFUVVJFX0NPVU5UID0gR1JBUEhfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1JbXBsIDxlbT5EaWFncmFtPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESUFHUkFNID0gODk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX05BTUUgPSBHUkFQSF9OT0RFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19HVUlEID0gR1JBUEhfTk9ERV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX1BSRVNFTlRBVElPTl9OQU1FID0gR1JBUEhfTk9ERV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19CUklFRl9ERVNDUklQVElPTiA9IEdSQVBIX05PREVfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19PV05FRF9SVUxFUyA9IEdSQVBIX05PREVfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdSQVBIX05PREVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0tJTkQgPSBHUkFQSF9OT0RFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19TVVBQUkVTU0VEID0gR1JBUEhfTk9ERV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX09SREVSSU5HX0dVSURFID0gR1JBUEhfTk9ERV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0lTX1ZJU0lCTEUgPSBHUkFQSF9OT0RFX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19DT05UQUlORVIgPSBHUkFQSF9OT0RFX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19SRUZFUkVOQ0UgPSBHUkFQSF9OT0RFX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX1BST1BFUlRZID0gR1JBUEhfTk9ERV9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19DT05UQUlORUQgPSBHUkFQSF9OT0RFX19DT05UQUlORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19QT1NJVElPTiA9IEdSQVBIX05PREVfX1BPU0lUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0xJTksgPSBHUkFQSF9OT0RFX19MSU5LOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFuY2hvcmFnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fQU5DSE9SQUdFID0gR1JBUEhfTk9ERV9fQU5DSE9SQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlbWFudGljIE1vZGVsPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fU0VNQU5USUNfTU9ERUwgPSBHUkFQSF9OT0RFX19TRU1BTlRJQ19NT0RFTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaXplPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fU0laRSA9IEdSQVBIX05PREVfX1NJWkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbSBMaW5rPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19ESUFHUkFNX0xJTksgPSBHUkFQSF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX05BTUVTUEFDRSA9IEdSQVBIX05PREVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Wm9vbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX1pPT00gPSBHUkFQSF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZpZXdwb2ludDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX1ZJRVdQT0lOVCA9IEdSQVBIX05PREVfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlhZ3JhbTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0ZFQVRVUkVfQ09VTlQgPSBHUkFQSF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX05BTUUgPSBESUFHUkFNX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fR1VJRCA9IERJQUdSQU1fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBESUFHUkFNX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19CUklFRl9ERVNDUklQVElPTiA9IERJQUdSQU1fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fT1dORURfUlVMRVMgPSBESUFHUkFNX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX0tJTkQgPSBESUFHUkFNX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fU1VQUFJFU1NFRCA9IERJQUdSQU1fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fT1JERVJJTkdfR1VJREUgPSBESUFHUkFNX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX0lTX1ZJU0lCTEUgPSBESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fQ09OVEFJTkVSID0gRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX1JFRkVSRU5DRSA9IERJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19JU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX1JFRkVSRU5DRUQgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVmZXJlbmNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9GRUFUVVJFX0NPVU5UID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fTkFNRSA9IERJQUdSQU1fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX0dVSUQgPSBESUFHUkFNX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fUFJFU0VOVEFUSU9OX05BTUUgPSBESUFHUkFNX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX0JSSUVGX0RFU0NSSVBUSU9OID0gRElBR1JBTV9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX09XTkVEX1JVTEVTID0gRElBR1JBTV9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fS0lORCA9IERJQUdSQU1fRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX1NVUFBSRVNTRUQgPSBESUFHUkFNX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fT1JERVJJTkdfR1VJREUgPSBESUFHUkFNX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fSVNfVklTSUJMRSA9IERJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX0NPTlRBSU5FUiA9IERJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX1JFRkVSRU5DRSA9IERJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fUFJPUEVSVFkgPSBESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19LRVkgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fVkFMVUUgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvcGVydHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfRkVBVFVSRV9DT1VOVCA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9JTlRfX1ggPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0lOVF9fWSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UG9pbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9JTlRfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fTkFNRSA9IERJQUdSQU1fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19HVUlEID0gRElBR1JBTV9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19QUkVTRU5UQVRJT05fTkFNRSA9IERJQUdSQU1fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX0JSSUVGX0RFU0NSSVBUSU9OID0gRElBR1JBTV9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19PV05FRF9SVUxFUyA9IERJQUdSQU1fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBESUFHUkFNX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fS0lORCA9IERJQUdSQU1fRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19TVVBQUkVTU0VEID0gRElBR1JBTV9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19PUkRFUklOR19HVUlERSA9IERJQUdSQU1fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fSVNfVklTSUJMRSA9IERJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19DT05UQUlORVIgPSBESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fUkVGRVJFTkNFID0gRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fUFJPUEVSVFkgPSBESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlpvb208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX1pPT00gPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Vmlld3BvcnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX1ZJRVdQT1JUID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW08L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX0RJQUdSQU0gPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlhZ3JhbSBMaW5rPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19GRUFUVVJFX0NPVU5UID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX05BTUUgPSBHUkFQSF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0dVSUQgPSBHUkFQSF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19QUkVTRU5UQVRJT05fTkFNRSA9IEdSQVBIX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19CUklFRl9ERVNDUklQVElPTiA9IEdSQVBIX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX09XTkVEX1JVTEVTID0gR1JBUEhfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHUkFQSF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0tJTkQgPSBHUkFQSF9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX1NVUFBSRVNTRUQgPSBHUkFQSF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19PUkRFUklOR19HVUlERSA9IEdSQVBIX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0lTX1ZJU0lCTEUgPSBHUkFQSF9FTEVNRU5UX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0NPTlRBSU5FUiA9IEdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fUkVGRVJFTkNFID0gR1JBUEhfRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX1BST1BFUlRZID0gR1JBUEhfRUxFTUVOVF9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0NPTlRBSU5FRCA9IEdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3NpdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fUE9TSVRJT04gPSBHUkFQSF9FTEVNRU5UX19QT1NJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0xJTksgPSBHUkFQSF9FTEVNRU5UX19MSU5LOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFuY2hvcmFnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19BTkNIT1JBR0UgPSBHUkFQSF9FTEVNRU5UX19BTkNIT1JBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VtYW50aWMgTW9kZWw8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX1NFTUFOVElDX01PREVMID0gR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRWRnZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFID0gR1JBUEhfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVCA9IEdSQVBIX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3JhcGggQ29ubmVjdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9GRUFUVVJFX0NPVU5UID0gR1JBUEhfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fTkFNRSA9IEdSQVBIX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX0dVSUQgPSBHUkFQSF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBHUkFQSF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1JBUEhfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX09XTkVEX1JVTEVTID0gR1JBUEhfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1JBUEhfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fS0lORCA9IEdSQVBIX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX1NVUFBSRVNTRUQgPSBHUkFQSF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fT1JERVJJTkdfR1VJREUgPSBHUkFQSF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fSVNfVklTSUJMRSA9IEdSQVBIX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX0NPTlRBSU5FUiA9IEdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX1JFRkVSRU5DRSA9IEdSQVBIX0VMRU1FTlRfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fUFJPUEVSVFkgPSBHUkFQSF9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX0NPTlRBSU5FRCA9IEdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3NpdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX1BPU0lUSU9OID0gR1JBUEhfRUxFTUVOVF9fUE9TSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fTElOSyA9IEdSQVBIX0VMRU1FTlRfX0xJTks7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QW5jaG9yYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19BTkNIT1JBR0UgPSBHUkFQSF9FTEVNRU5UX19BTkNIT1JBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VtYW50aWMgTW9kZWw8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19TRU1BTlRJQ19NT0RFTCA9IEdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldheXBvaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fV0FZUE9JTlRTID0gR1JBUEhfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbmNob3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX0FOQ0hPUiA9IEdSQVBIX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3JhcGggRWRnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX0ZFQVRVUkVfQ09VTlQgPSBHUkFQSF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX05BTUUgPSBESUFHUkFNX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fR1VJRCA9IERJQUdSQU1fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBESUFHUkFNX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19CUklFRl9ERVNDUklQVElPTiA9IERJQUdSQU1fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fT1dORURfUlVMRVMgPSBESUFHUkFNX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0tJTkQgPSBESUFHUkFNX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fU1VQUFJFU1NFRCA9IERJQUdSQU1fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fT1JERVJJTkdfR1VJREUgPSBESUFHUkFNX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0lTX1ZJU0lCTEUgPSBESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fQ09OVEFJTkVSID0gRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1JFRkVSRU5DRSA9IERJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTiA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX0ZFQVRVUkVfQ09VTlQgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESU1FTlNJT05fX1dJRFRIID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESU1FTlNJT05fX0hFSUdIVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGltZW5zaW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJTUVOU0lPTl9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1VJRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fT1dORURfUlVMRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19LSU5EID0gQlJFQUtET1dOX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19PUkRFUklOR19HVUlERSA9IEJSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSVNfQUJTVFJBQ1QgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVTRU5UQVRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fU0hBUEVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fTk9ERUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVGSVggPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lTX1BMQU5ORUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lTX09QVElPTkFMID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUFJFU0VOVEVEX0FGVEVSID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVTRU5URURfQkVGT1JFID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUExBTk5JTkdfREFUQSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1NVUEVSX0FDVElWSVRJRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0NIRUNLTElTVFMgPSBCUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19DT05DRVBUUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19FWEFNUExFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dVSURFTElORVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUkVVU0FCTEVfQVNTRVRTID0gQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fVEVNUExBVEVTID0gQlJFQUtET1dOX0VMRU1FTlRfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1JFUE9SVFMgPSBCUkVBS0RPV05fRUxFTUVOVF9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gQlJFQUtET1dOX0VMRU1FTlRfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1RPT0xNRU5UT1IgPSBCUkVBS0RPV05fRUxFTUVOVF9fVE9PTE1FTlRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIElPPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTyA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsIDxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVCA9IDEwMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX05BTUUgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19HVUlEID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19PV05FRF9SVUxFUyA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX0tJTkQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19TVVBQUkVTU0VEID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX0lTX1ZJU0lCTEUgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19DT05UQUlORVIgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19SRUZFUkVOQ0UgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1BST1BFUlRZID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fRElBR1JBTSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19HUkFQSF9FTEVNRU5UID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19UWVBFX0lORk8gPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsIDxlbT5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFID0gMTAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19OQU1FID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19HVUlEID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19PV05FRF9SVUxFUyA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19LSU5EID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19TVVBQUkVTU0VEID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fT1JERVJJTkdfR1VJREUgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19JU19WSVNJQkxFID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19DT05UQUlORVIgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX1JFRkVSRU5DRSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUk9QRVJUWSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfRkVBVFVSRV9DT1VOVCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCA8ZW0+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0UgPSAxMDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19OQU1FID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fR1VJRCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT05fTkFNRSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fT1dORURfUlVMRVMgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19LSU5EID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fU1VQUFJFU1NFRCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19PUkRFUklOR19HVUlERSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19JU19WSVNJQkxFID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fQ09OVEFJTkVSID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fUkVGRVJFTkNFID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUk9QRVJUWSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTiA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW08L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0gPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU07Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfRkVBVFVSRV9DT1VOVCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkxlYWZFbGVtZW50SW1wbCA8ZW0+TGVhZiBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkxlYWZFbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldExlYWZFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVCA9IDEwNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19OQU1FID0gRElBR1JBTV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX0dVSUQgPSBESUFHUkFNX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gRElBR1JBTV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBESUFHUkFNX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX09XTkVEX1JVTEVTID0gRElBR1JBTV9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERJQUdSQU1fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19LSU5EID0gRElBR1JBTV9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBESUFHUkFNX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gRElBR1JBTV9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19JU19WSVNJQkxFID0gRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX0NPTlRBSU5FUiA9IERJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19SRUZFUkVOQ0UgPSBESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19QUk9QRVJUWSA9IERJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TGVhZiBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGV4dEVsZW1lbnRJbXBsIDxlbT5UZXh0IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGV4dEVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGV4dEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UID0gMTA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX05BTUUgPSBMRUFGX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fR1VJRCA9IExFQUZfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBMRUFGX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IExFQUZfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fT1dORURfUlVMRVMgPSBMRUFGX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTEVBRl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX0tJTkQgPSBMRUFGX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IExFQUZfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBMRUFGX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX0lTX1ZJU0lCTEUgPSBMRUFGX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fQ09OVEFJTkVSID0gTEVBRl9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX1JFRkVSRU5DRSA9IExFQUZfRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX1BST1BFUlRZID0gTEVBRl9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX19URVhUID0gTEVBRl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRleHQgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IExFQUZfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkltYWdlSW1wbCA8ZW0+SW1hZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuSW1hZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0SW1hZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSU1BR0UgPSAxMDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19OQU1FID0gTEVBRl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fR1VJRCA9IExFQUZfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19QUkVTRU5UQVRJT05fTkFNRSA9IExFQUZfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBMRUFGX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fT1dORURfUlVMRVMgPSBMRUFGX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBMRUFGX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19LSU5EID0gTEVBRl9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fU1VQUFJFU1NFRCA9IExFQUZfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19PUkRFUklOR19HVUlERSA9IExFQUZfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19JU19WSVNJQkxFID0gTEVBRl9FTEVNRU5UX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fQ09OVEFJTkVSID0gTEVBRl9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fUkVGRVJFTkNFID0gTEVBRl9FTEVNRU5UX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19QUk9QRVJUWSA9IExFQUZfRUxFTUVOVF9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX1VSSSA9IExFQUZfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaW1lIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fTUlNRV9UWVBFID0gTEVBRl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkltYWdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX0ZFQVRVUkVfQ09VTlQgPSBMRUFGX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaGljUHJpbWl0aXZlSW1wbCA8ZW0+R3JhcGhpYyBQcmltaXRpdmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhpY1ByaW1pdGl2ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaGljUHJpbWl0aXZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdSQVBISUNfUFJJTUlUSVZFID0gMTA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fTkFNRSA9IExFQUZfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX0dVSUQgPSBMRUFGX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBMRUFGX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX0JSSUVGX0RFU0NSSVBUSU9OID0gTEVBRl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX09XTkVEX1JVTEVTID0gTEVBRl9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTEVBRl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fS0lORCA9IExFQUZfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX1NVUFBSRVNTRUQgPSBMRUFGX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fT1JERVJJTkdfR1VJREUgPSBMRUFGX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fSVNfVklTSUJMRSA9IExFQUZfRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX0NPTlRBSU5FUiA9IExFQUZfRUxFTUVOVF9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX1JFRkVSRU5DRSA9IExFQUZfRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fUFJPUEVSVFkgPSBMRUFGX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkdyYXBoaWMgUHJpbWl0aXZlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgPSBMRUFGX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2x5bGluZUltcGwgPGVtPlBvbHlsaW5lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvbHlsaW5lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBvbHlsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBPTFlMSU5FID0gMTA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fTkFNRSA9IEdSQVBISUNfUFJJTUlUSVZFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fR1VJRCA9IEdSQVBISUNfUFJJTUlUSVZFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX1BSRVNFTlRBVElPTl9OQU1FID0gR1JBUEhJQ19QUklNSVRJVkVfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1JBUEhJQ19QUklNSVRJVkVfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fT1dORURfUlVMRVMgPSBHUkFQSElDX1BSSU1JVElWRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdSQVBISUNfUFJJTUlUSVZFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fS0lORCA9IEdSQVBISUNfUFJJTUlUSVZFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fU1VQUFJFU1NFRCA9IEdSQVBISUNfUFJJTUlUSVZFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX09SREVSSU5HX0dVSURFID0gR1JBUEhJQ19QUklNSVRJVkVfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fSVNfVklTSUJMRSA9IEdSQVBISUNfUFJJTUlUSVZFX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fQ09OVEFJTkVSID0gR1JBUEhJQ19QUklNSVRJVkVfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19SRUZFUkVOQ0UgPSBHUkFQSElDX1BSSU1JVElWRV9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fUFJPUEVSVFkgPSBHUkFQSElDX1BSSU1JVElWRV9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xvc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX0NMT1NFRCA9IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldheXBvaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX1dBWVBPSU5UUyA9IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBvbHlsaW5lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX0ZFQVRVUkVfQ09VTlQgPSBHUkFQSElDX1BSSU1JVElWRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVsbGlwc2VJbXBsIDxlbT5FbGxpcHNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVsbGlwc2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RWxsaXBzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFTExJUFNFID0gMTEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19OQU1FID0gR1JBUEhJQ19QUklNSVRJVkVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX0dVSUQgPSBHUkFQSElDX1BSSU1JVElWRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX1BSRVNFTlRBVElPTl9OQU1FID0gR1JBUEhJQ19QUklNSVRJVkVfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHUkFQSElDX1BSSU1JVElWRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX09XTkVEX1JVTEVTID0gR1JBUEhJQ19QUklNSVRJVkVfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdSQVBISUNfUFJJTUlUSVZFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19LSU5EID0gR1JBUEhJQ19QUklNSVRJVkVfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX1NVUFBSRVNTRUQgPSBHUkFQSElDX1BSSU1JVElWRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX09SREVSSU5HX0dVSURFID0gR1JBUEhJQ19QUklNSVRJVkVfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19JU19WSVNJQkxFID0gR1JBUEhJQ19QUklNSVRJVkVfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX0NPTlRBSU5FUiA9IEdSQVBISUNfUFJJTUlUSVZFX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19SRUZFUkVOQ0UgPSBHUkFQSElDX1BSSU1JVElWRV9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19QUk9QRVJUWSA9IEdSQVBISUNfUFJJTUlUSVZFX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DZW50ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19DRU5URVIgPSBHUkFQSElDX1BSSU1JVElWRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYWRpdXMgWDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX1JBRElVU19YID0gR1JBUEhJQ19QUklNSVRJVkVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFkaXVzIFk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19SQURJVVNfWSA9IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fUk9UQVRJT04gPSBHUkFQSElDX1BSSU1JVElWRV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydCBBbmdsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX1NUQVJUX0FOR0xFID0gR1JBUEhJQ19QUklNSVRJVkVfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5kIEFuZ2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fRU5EX0FOR0xFID0gR1JBUEhJQ19QUklNSVRJVkVfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RWxsaXBzZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX0ZFQVRVUkVfQ09VTlQgPSBHUkFQSElDX1BSSU1JVElWRV9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX05BTUUgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX0dVSUQgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX09XTkVEX1JVTEVTID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX0tJTkQgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX1NVUFBSRVNTRUQgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX0FVVEhPUlMgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19DSEFOR0VfREFURSA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX1ZFUlNJT04gPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTiA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzcyBWaWV3czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX1BST0NFU1NfVklFV1MgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZpZXc8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fREVGQVVMVF9WSUVXID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlIENvbmZpZ3VyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fQkFTRV9DT05GSUdVUkFUSU9OUyA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19TVUJUUkFDVEVEX0NBVEVHT1JZID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkZWQgQ2F0ZWdvcnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19BRERFRF9DQVRFR09SWSA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyeSBQcm9jZXNzZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19ERUxJVkVSWV9QUk9DRVNTRVMgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIEZhbWlseTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19OQU1FID0gTUVUSE9EX1VOSVRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19HVUlEID0gTUVUSE9EX1VOSVRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfVU5JVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19PV05FRF9SVUxFUyA9IE1FVEhPRF9VTklUX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX1VOSVRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19LSU5EID0gTUVUSE9EX1VOSVRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19TVVBQUkVTU0VEID0gTUVUSE9EX1VOSVRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfVU5JVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19BVVRIT1JTID0gTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fQ0hBTkdFX0RBVEUgPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX0NIQU5HRV9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19WRVJTSU9OID0gTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19DT1BZUklHSFRfU1RBVEVNRU5UID0gTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlZmluZWQgQ29uZmlndXJhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGUgPGVtPldvcmsgT3JkZXIgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya09yZGVyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX09SREVSX1RZUEUgPSAxMTQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBWQVJJQUJJTElUWV9UWVBFID0gMTEzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EYXRlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS51dGlsLkRhdGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERBVEUgPSAxMTc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlVyaTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubmV0LlVSSQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFVyaSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBVUkkgPSAxMTg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlN0cmluZzwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTdHJpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU1RSSU5HID0gMTE1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Cb29sZWFuPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLkJvb2xlYW4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCb29sZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJPT0xFQU4gPSAxMTY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlNldDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEudXRpbC5TZXQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VUID0gMTE5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5TZXF1ZW5jZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2VxdWVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VRVUVOQ0UgPSAxMjA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkludGVnZXI8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0SW50ZWdlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJTlRFR0VSID0gMTIxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Eb3VibGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuRG91YmxlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RG91YmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERPVUJMRSA9IDEyMjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2xhc3NpZmllciA8ZW0+Q2xhc3NpZmllcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DbGFzc2lmaWVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDbGFzc2lmaWVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2xhc3NpZmllciNnZXRJc0Fic3RyYWN0IDxlbT5JcyBBYnN0cmFjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIEFic3RyYWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyI2dldElzQWJzdHJhY3QoKQotCSAqIEBzZWUgI2dldENsYXNzaWZpZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENsYXNzaWZpZXJfSXNBYnN0cmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudCA8ZW0+TmFtZWQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5OYW1lZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE5hbWVkRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50I2dldE5hbWUoKQotCSAqIEBzZWUgI2dldE5hbWVkRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TmFtZWRFbGVtZW50X05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZWFibGVFbGVtZW50IDxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2VhYmxlRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UGFja2FnZWFibGVFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UgPGVtPlBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lc3BhY2UgPGVtPk5hbWVzcGFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5OYW1lc3BhY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVzcGFjZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TmFtZXNwYWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQgPGVtPk1ldGhvZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRHdWlkIDxlbT5HdWlkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R3VpZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRHdWlkKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X0d1aWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uTmFtZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRCcmllZkRlc2NyaXB0aW9uIDxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldEJyaWVmRGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRPd25lZFJ1bGVzIDxlbT5Pd25lZCBSdWxlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+T3duZWQgUnVsZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3duZWRSdWxlcygpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+S2luZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRLaW5kKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RFbGVtZW50X0tpbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldFN1cHByZXNzZWQgPGVtPlN1cHByZXNzZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdXBwcmVzc2VkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldFN1cHByZXNzZWQoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfU3VwcHJlc3NlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3JkZXJpbmdHdWlkZSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PcmRlcmluZyBHdWlkZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRPcmRlcmluZ0d1aWRlKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X09yZGVyaW5nR3VpZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludCA8ZW0+Q29uc3RyYWludDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludCNnZXRCb2R5IDxlbT5Cb2R5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Qm9keTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludCNnZXRCb2R5KCkKLQkgKiBAc2VlICNnZXRDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb25zdHJhaW50X0JvZHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5IDxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50UHJvcGVydHlfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuS2luZCA8ZW0+S2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5LaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRLaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmQjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKQotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEtpbmRfQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQgPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb250ZW50RWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0U3VwcG9ydGluZ01hdGVyaWFscyA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q29uY2VwdHNBbmRQYXBlcnMgPGVtPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldENvbmNlcHRzQW5kUGFwZXJzKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldENoZWNrbGlzdHMgPGVtPkNoZWNrbGlzdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkNoZWNrbGlzdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldENoZWNrbGlzdHMoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRHdWlkZWxpbmVzIDxlbT5HdWlkZWxpbmVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5HdWlkZWxpbmVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRHdWlkZWxpbmVzKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0RXhhbXBsZXMgPGVtPkV4YW1wbGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5FeGFtcGxlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0RXhhbXBsZXMoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0QXNzZXRzIDxlbT5Bc3NldHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkFzc2V0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0QXNzZXRzKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRUZXJtZGVmaW5pdGlvbiA8ZW0+VGVybWRlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlRlcm1kZWZpbml0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRUZXJtZGVmaW5pdGlvbigpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X1Rlcm1kZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCA8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlc2NyaWJhYmxlRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByZXNlbnRhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFByZXNlbnRhdGlvbigpCi0JICogQHNlZSAjZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFNoYXBlaWNvbiA8ZW0+U2hhcGVpY29uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2hhcGVpY29uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0U2hhcGVpY29uKCkKLQkgKiBAc2VlICNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0Tm9kZWljb24gPGVtPk5vZGVpY29uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Tm9kZWljb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXROb2RlaWNvbigpCi0JICogQHNlZSAjZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfTm9kZWljb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uIDxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldFNlY3Rpb25zIDxlbT5TZWN0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VjdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRTZWN0aW9ucygpCi0JICogQHNlZSAjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxJZCA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHRlcm5hbCBJZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEV4dGVybmFsSWQoKQotCSAqIEBzZWUgI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0S2V5Q29uc2lkZXJhdGlvbnMgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEtleUNvbnNpZGVyYXRpb25zKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRMb25nUHJlc2VudGF0aW9uTmFtZSA8ZW0+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRMb25nUHJlc2VudGF0aW9uTmFtZSgpCi0JICogQHNlZSAjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fTG9uZ1ByZXNlbnRhdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiA8ZW0+U2VjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRTZWN0aW9uTmFtZSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VjdGlvbiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFNlY3Rpb25OYW1lKCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRTZWN0aW9uRGVzY3JpcHRpb24gPGVtPlNlY3Rpb24gRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZWN0aW9uIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9TZWN0aW9uRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0U3ViU2VjdGlvbnMgPGVtPlN1YiBTZWN0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3ViIFNlY3Rpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFN1YlNlY3Rpb25zKCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZWN0aW9uX1N1YlNlY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRQcmVkZWNlc3NvciA8ZW0+UHJlZGVjZXNzb3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5QcmVkZWNlc3NvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRQcmVkZWNlc3NvcigpCi0JICogQHNlZSAjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VjdGlvbl9QcmVkZWNlc3NvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlIDxlbT5Sb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUjZ2V0TW9kaWZpZXMgPGVtPk1vZGlmaWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Nb2RpZmllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZSNnZXRNb2RpZmllcygpCi0JICogQHNlZSAjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Um9sZV9Nb2RpZmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZSNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUjZ2V0UmVzcG9uc2libGVGb3IoKQotCSAqIEBzZWUgI2dldFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJvbGVfUmVzcG9uc2libGVGb3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QjZ2V0UmVwb3J0cyA8ZW0+UmVwb3J0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVwb3J0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QjZ2V0UmVwb3J0cygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldFRlbXBsYXRlcyA8ZW0+VGVtcGxhdGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5UZW1wbGF0ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldFRlbXBsYXRlcygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QjZ2V0VG9vbE1lbnRvcnMgPGVtPlRvb2wgTWVudG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+VG9vbCBNZW50b3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCNnZXRUb29sTWVudG9ycygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQgPGVtPkZ1bGZpbGxhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RnVsZmlsbGFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRGdWxmaWxsYWJsZUVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudCNnZXRGdWxmaWxscyA8ZW0+RnVsZmlsbHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkZ1bGZpbGxzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQjZ2V0RnVsZmlsbHMoKQotCSAqIEBzZWUgI2dldEZ1bGZpbGxhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RnVsZmlsbGFibGVFbGVtZW50X0Z1bGZpbGxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sgPGVtPlRhc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRQZXJmb3JtZWRCeSA8ZW0+UGVyZm9ybWVkIEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5QZXJmb3JtZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0UGVyZm9ybWVkQnkoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfUGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldE1hbmRhdG9yeUlucHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5PdXRwdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0T3V0cHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX091dHB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0T3B0aW9uYWxJbnB1dCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19PcHRpb25hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldFN0ZXBzIDxlbT5TdGVwczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3RlcHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0U3RlcHMoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfU3RlcHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0VG9vbE1lbnRvcnMgPGVtPlRvb2wgTWVudG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+VG9vbCBNZW50b3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldFRvb2xNZW50b3JzKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX1Rvb2xNZW50b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uIDxlbT5Xb3JrIERlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24jZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAc2VlICNnZXRXb3JrRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya0RlZmluaXRpb25fUHJlY29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24jZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBzZWUgI2dldFdvcmtEZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrRGVmaW5pdGlvbl9Qb3N0Y29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXAgPGVtPlN0ZXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U3RlcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0U3RlcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZSA8ZW0+R3VpZGFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3VpZGFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCA8ZW0+QXJ0aWZhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXJ0aWZhY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBcnRpZmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZXJBcnRpZmFjdCA8ZW0+Q29udGFpbmVyIEFydGlmYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkNvbnRhaW5lciBBcnRpZmFjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKQotCSAqIEBzZWUgI2dldEFydGlmYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcnRpZmFjdF9Db250YWluZXJBcnRpZmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVkQXJ0aWZhY3RzIDxlbT5Db250YWluZWQgQXJ0aWZhY3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db250YWluZWQgQXJ0aWZhY3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZWRBcnRpZmFjdHMoKQotCSAqIEBzZWUgI2dldEFydGlmYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGUgPGVtPkRlbGl2ZXJhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVsaXZlcmFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlI2dldERlbGl2ZXJlZFdvcmtQcm9kdWN0cyA8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZSNnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZSA8ZW0+T3V0Y29tZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PdXRjb21lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRPdXRjb21lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRHbG9iYWwgPGVtPkdsb2JhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdsb2JhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRHbG9iYWwoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFBhY2thZ2VfR2xvYmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlI2dldFJldXNlZFBhY2thZ2VzIDxlbT5SZXVzZWQgUGFja2FnZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJldXNlZCBQYWNrYWdlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRSZXVzZWRQYWNrYWdlcygpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRDaGlsZFBhY2thZ2VzIDxlbT5DaGlsZCBQYWNrYWdlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q2hpbGQgUGFja2FnZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UjZ2V0Q2hpbGRQYWNrYWdlcygpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlIDxlbT5Db250ZW50IFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29udGVudFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50cyA8ZW0+Q29udGVudCBFbGVtZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udGVudCBFbGVtZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRzKCkKLQkgKiBAc2VlICNnZXRDb250ZW50UGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24gPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRCcmllZk91dGxpbmUgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CcmllZiBPdXRsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldEJyaWVmT3V0bGluZSgpCi0JICogQHNlZSAjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucyA8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkKLQkgKiBAc2VlICNnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uT3B0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb24gPGVtPlJlcHJlc2VudGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVwcmVzZW50YXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb24oKQotCSAqIEBzZWUgI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldE5vdGF0aW9uIDxlbT5Ob3RhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vdGF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldE5vdGF0aW9uKCkKLQkgKiBAc2VlICNnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX05vdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24gPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdXJwb3NlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFB1cnBvc2UoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0SW1wYWN0T2ZOb3RIYXZpbmcgPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nIDxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24gPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRFeHRlcm5hbERlc2NyaXB0aW9uIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0UGFja2FnaW5nR3VpZGFuY2UgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24gPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U2tpbGxzIDxlbT5Ta2lsbHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ta2lsbHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTa2lsbHMoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcyA8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uI2dldFN5bm9ueW1zIDxlbT5TeW5vbnltczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN5bm9ueW1zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U3lub255bXMoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbiA8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhc2tEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHVycG9zZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uI2dldFB1cnBvc2UoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uIDxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24jZ2V0QXR0YWNobWVudHMgPGVtPkF0dGFjaG1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXR0YWNobWVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24jZ2V0QXR0YWNobWVudHMoKQotCSAqIEBzZWUgI2dldEd1aWRhbmNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiA8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByYWN0aWNlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFkZGl0aW9uYWxJbmZvIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BZGRpdGlvbmFsIEluZm88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QWRkaXRpb25hbEluZm8oKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldFByb2JsZW0gPGVtPlByb2JsZW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm9ibGVtPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldFByb2JsZW0oKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QmFja2dyb3VuZCA8ZW0+QmFja2dyb3VuZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJhY2tncm91bmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QmFja2dyb3VuZCgpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRHb2FscyA8ZW0+R29hbHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Hb2FsczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRHb2FscygpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QXBwbGljYXRpb24gPGVtPkFwcGxpY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXBwbGljYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QXBwbGljYXRpb24oKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldExldmVsc09mQWRvcHRpb24gPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRMZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkgPGVtPkFjdGl2aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFjdGl2aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QWN0aXZpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldEJyZWFrZG93bkVsZW1lbnRzIDxlbT5CcmVha2Rvd24gRWxlbWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkJyZWFrZG93biBFbGVtZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0QnJlYWtkb3duRWxlbWVudHMoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0Um9hZG1hcHMgPGVtPlJvYWRtYXBzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Sb2FkbWFwczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0Um9hZG1hcHMoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9Sb2FkbWFwcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBSZXBlYXRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc1JlcGVhdGFibGUoKQotCSAqIEBzZWUgI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc09uZ29pbmcgPGVtPklzIE9uZ29pbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBPbmdvaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc09uZ29pbmcoKQotCSAqIEBzZWUgI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc0V2ZW50RHJpdmVuIDxlbT5JcyBFdmVudCBEcml2ZW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBFdmVudCBEcml2ZW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzRXZlbnREcml2ZW4oKQotCSAqIEBzZWUgI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRMaW5rVG9QcmVkZWNlc3NvciA8ZW0+TGluayBUbyBQcmVkZWNlc3NvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+TGluayBUbyBQcmVkZWNlc3NvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0TGlua1RvUHJlZGVjZXNzb3IoKQotCSAqIEBzZWUgI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50IDxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QnJlYWtkb3duRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVmaXg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlZml4KCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0SXNQbGFubmVkIDxlbT5JcyBQbGFubmVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgUGxhbm5lZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRJc1BsYW5uZWQoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9IYXNNdWx0aXBsZU9jY3VycmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIE9wdGlvbmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldElzT3B0aW9uYWwoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQWZ0ZXIgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRBZnRlcigpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQmVmb3JlIDxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRCZWZvcmUoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFBsYW5uaW5nRGF0YSgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9QbGFubmluZ0RhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFN1cGVyQWN0aXZpdGllcyA8ZW0+U3VwZXIgQWN0aXZpdGllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlN1cGVyIEFjdGl2aXRpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwZXJBY3Rpdml0aWVzKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1N1cGVyQWN0aXZpdGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRDaGVja2xpc3RzIDxlbT5DaGVja2xpc3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5DaGVja2xpc3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldENoZWNrbGlzdHMoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRDb25jZXB0cyA8ZW0+Q29uY2VwdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbmNlcHRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldENvbmNlcHRzKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEV4YW1wbGVzIDxlbT5FeGFtcGxlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXhhbXBsZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0RXhhbXBsZXMoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfRXhhbXBsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0R3VpZGVsaW5lcyA8ZW0+R3VpZGVsaW5lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+R3VpZGVsaW5lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRHdWlkZWxpbmVzKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UmV1c2FibGVBc3NldHMgPGVtPlJldXNhYmxlIEFzc2V0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmV1c2FibGUgQXNzZXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFJldXNhYmxlQXNzZXRzKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1JldXNhYmxlQXNzZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFN1cHBvcnRpbmdNYXRlcmlhbHMgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0VGVtcGxhdGVzIDxlbT5UZW1wbGF0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlRlbXBsYXRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRUZW1wbGF0ZXMoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfVGVtcGxhdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFJlcG9ydHMgPGVtPlJlcG9ydHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJlcG9ydHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UmVwb3J0cygpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9SZXBvcnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEVzdGltYXRpb25jb25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X0VzdGltYXRpb25jb25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRUb29sbWVudG9yIDxlbT5Ub29sbWVudG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Ub29sbWVudG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFRvb2xtZW50b3IoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfVG9vbG1lbnRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NaWxlc3RvbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWlsZXN0b25lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmUjZ2V0UmVxdWlyZWRSZXN1bHRzIDxlbT5SZXF1aXJlZCBSZXN1bHRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXF1aXJlZCBSZXN1bHRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmUjZ2V0UmVxdWlyZWRSZXN1bHRzKCkKLQkgKiBAc2VlICNnZXRNaWxlc3RvbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1pbGVzdG9uZV9SZXF1aXJlZFJlc3VsdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uIDxlbT5JdGVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SXRlcmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEl0ZXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZSA8ZW0+UGhhc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGhhc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQaGFzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSA8ZW0+VGVhbSBQcm9maWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRlYW0gUHJvZmlsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRlYW1Qcm9maWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSNnZXRUZWFtUm9sZXMgPGVtPlRlYW0gUm9sZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlRlYW0gUm9sZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFRlYW1Sb2xlcygpCi0JICogQHNlZSAjZ2V0VGVhbVByb2ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFN1cGVyVGVhbSA8ZW0+U3VwZXIgVGVhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlN1cGVyIFRlYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFN1cGVyVGVhbSgpCi0JICogQHNlZSAjZ2V0VGVhbVByb2ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0U3ViVGVhbSA8ZW0+U3ViIFRlYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlN1YiBUZWFtPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSNnZXRTdWJUZWFtKCkKLQkgKiBAc2VlICNnZXRUZWFtUHJvZmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciA8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGVEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IjZ2V0Um9sZSA8ZW0+Um9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlJvbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJvbGUoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRNb2RpZmllcyA8ZW0+TW9kaWZpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPk1vZGlmaWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRNb2RpZmllcygpCi0JICogQHNlZSAjZ2V0Um9sZURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJvbGVEZXNjcmlwdG9yX01vZGlmaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJlc3BvbnNpYmxlRm9yKCkKLQkgKiBAc2VlICNnZXRSb2xlRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyIDxlbT5Xb3JrIE9yZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgT3JkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya09yZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyI2dldExpbmtUeXBlIDxlbT5MaW5rIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MaW5rIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlciNnZXRMaW5rVHlwZSgpCi0JICogQHNlZSAjZ2V0V29ya09yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrT3JkZXJfTGlua1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXIjZ2V0UHJlZCA8ZW0+UHJlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlByZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlciNnZXRQcmVkKCkKLQkgKiBAc2VlICNnZXRXb3JrT3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtPcmRlcl9QcmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50IDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc0VsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhIDxlbT5QbGFubmluZyBEYXRhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UGxhbm5pbmdEYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0IERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YSNnZXRTdGFydERhdGUoKQotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YSNnZXRGaW5pc2hEYXRlIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaCBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEjZ2V0RmluaXNoRGF0ZSgpCi0JICogQHNlZSAjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfRmluaXNoRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YSNnZXRSYW5rIDxlbT5SYW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmFuazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldFJhbmsoKQotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX1JhbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvciA8ZW0+RGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvciNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvciNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2dldERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yIDxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGFza0Rlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRUYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0VGFzaygpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX1Rhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBc3Npc3RlZEJ5IDxlbT5Bc3Npc3RlZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXNzaXN0ZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldEFzc2lzdGVkQnkoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRFeHRlcm5hbElucHV0IDxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXh0ZXJuYWwgSW5wdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldEV4dGVybmFsSW5wdXQoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldE1hbmRhdG9yeUlucHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0T3B0aW9uYWxJbnB1dCgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5PdXRwdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldE91dHB1dCgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkgPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldFNlbGVjdGVkU3RlcHMgPGVtPlNlbGVjdGVkIFN0ZXBzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZWxlY3RlZCBTdGVwczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0U2VsZWN0ZWRTdGVwcygpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFeGl0U3RhdGUgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRXb3JrUHJvZHVjdCgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RlZEJ5IDxlbT5JbXBhY3RlZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW1wYWN0ZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RlZEJ5KCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RlZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0cyA8ZW0+SW1wYWN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW1wYWN0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdHMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXREZWxpdmVyYWJsZVBhcnRzIDxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXREZWxpdmVyYWJsZVBhcnRzKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGUgPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb21wb3NpdGVSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlI2dldEFnZ3JlZ2F0ZWRSb2xlcyA8ZW0+QWdncmVnYXRlZCBSb2xlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QWdncmVnYXRlZCBSb2xlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZSNnZXRBZ2dyZWdhdGVkUm9sZXMoKQotCSAqIEBzZWUgI2dldENvbXBvc2l0ZVJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiA8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uI2dldFVzYWdlR3VpZGFuY2UgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiNnZXRVc2FnZUd1aWRhbmNlKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24gPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHVycG9zZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRQdXJwb3NlKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcygpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEhvd3RvU3RhZmYgPGVtPkhvd3RvIFN0YWZmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SG93dG8gU3RhZmY8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0SG93dG9TdGFmZigpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3d0b1N0YWZmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIDxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjYWxlIDxlbT5TY2FsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNjYWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY2FsZSgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRSaXNrTGV2ZWwgPGVtPlJpc2sgTGV2ZWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SaXNrIExldmVsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRSaXNrTGV2ZWwoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UgPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRUeXBlT2ZDb250cmFjdCA8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFR5cGVPZkNvbnRyYWN0KCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fVHlwZU9mQ29udHJhY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uIDxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjb3BlIDxlbT5TY29wZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNjb3BlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NvcGUoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFVzYWdlTm90ZXMgPGVtPlVzYWdlIE5vdGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNhZ2UgTm90ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRVc2FnZU5vdGVzKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiNnZXRSZWZpbmVkRGVzY3JpcHRpb24gPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24jZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdCA8ZW0+Q29uY2VwdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb25jZXB0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdCA8ZW0+Q2hlY2tsaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNoZWNrbGlzdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDaGVja2xpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZSA8ZW0+R3VpZGVsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRHdWlkZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9ucwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydCA8ZW0+UmVwb3J0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSZXBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGUgPGVtPlRlbXBsYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRlbXBsYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGVtcGxhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRvb2wgTWVudG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUb29sTWVudG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXIgPGVtPldoaXRlcGFwZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V2hpdGVwYXBlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V2hpdGVwYXBlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbiA8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRlcm1EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm8KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm8jZ2V0SXNQcmltYXJ5RXh0ZW5zaW9uIDxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyNnZXRJc1ByaW1hcnlFeHRlbnNpb24oKQotCSAqIEBzZWUgI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb19Jc1ByaW1hcnlFeHRlbnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UgPGVtPlByYWN0aWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByYWN0aWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJhY3RpY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlI2dldFN1YlByYWN0aWNlcyA8ZW0+U3ViIFByYWN0aWNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3ViIFByYWN0aWNlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UjZ2V0U3ViUHJhY3RpY2VzKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZSNnZXRDb250ZW50UmVmZXJlbmNlcyA8ZW0+Q29udGVudCBSZWZlcmVuY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db250ZW50IFJlZmVyZW5jZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlI2dldENvbnRlbnRSZWZlcmVuY2VzKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlI2dldEFjdGl2aXR5UmVmZXJlbmNlcyA8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UjZ2V0QWN0aXZpdHlSZWZlcmVuY2VzKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSZXVzYWJsZUFzc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUgPGVtPkRpc2NpcGxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGlzY2lwbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSNnZXRUYXNrcyA8ZW0+VGFza3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlRhc2tzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lI2dldFRhc2tzKCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaXNjaXBsaW5lX1Rhc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lI2dldFN1YmRpc2NpcGxpbmUgPGVtPlN1YmRpc2NpcGxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlN1YmRpc2NpcGxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUjZ2V0U3ViZGlzY2lwbGluZSgpCi0JICogQHNlZSAjZ2V0RGlzY2lwbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZV9TdWJkaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lI2dldFJlZmVyZW5jZVdvcmtmbG93cyA8ZW0+UmVmZXJlbmNlIFdvcmtmbG93czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVmZXJlbmNlIFdvcmtmbG93czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSNnZXRSZWZlcmVuY2VXb3JrZmxvd3MoKQotCSAqIEBzZWUgI2dldERpc2NpcGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeSA8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db250ZW50IENhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbnRlbnRDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0IDxlbT5Sb2xlIFNldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlIFNldDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9sZVNldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldCNnZXRSb2xlcyA8ZW0+Um9sZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJvbGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0I2dldFJvbGVzKCkKLQkgKiBAc2VlICNnZXRSb2xlU2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSb2xlU2V0X1JvbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbiA8ZW0+RG9tYWluPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRvbWFpbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREb21haW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbiNnZXRXb3JrUHJvZHVjdHMgPGVtPldvcmsgUHJvZHVjdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPldvcmsgUHJvZHVjdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbiNnZXRXb3JrUHJvZHVjdHMoKQotCSAqIEBzZWUgI2dldERvbWFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluI2dldFN1YmRvbWFpbnMgPGVtPlN1YmRvbWFpbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlN1YmRvbWFpbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbiNnZXRTdWJkb21haW5zKCkKLQkgKiBAc2VlICNnZXREb21haW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERvbWFpbl9TdWJkb21haW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZSA8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGUjZ2V0V29ya1Byb2R1Y3RzIDxlbT5Xb3JrIFByb2R1Y3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Xb3JrIFByb2R1Y3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGUjZ2V0V29ya1Byb2R1Y3RzKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nIDxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcjZ2V0RGlzY2lwbGluZXMgPGVtPkRpc2NpcGxpbmVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5EaXNjaXBsaW5lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nI2dldERpc2NpcGxpbmVzKCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lR3JvdXBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sIDxlbT5Ub29sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRvb2w8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2wKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRvb2woKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2wjZ2V0VG9vbE1lbnRvcnMgPGVtPlRvb2wgTWVudG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+VG9vbCBNZW50b3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sI2dldFRvb2xNZW50b3JzKCkKLQkgKiBAc2VlICNnZXRUb29sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUb29sX1Rvb2xNZW50b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZyA8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9sZVNldEdyb3VwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmcjZ2V0Um9sZVNldHMgPGVtPlJvbGUgU2V0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+Um9sZSBTZXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmcjZ2V0Um9sZVNldHMoKQotCSAqIEBzZWUgI2dldFJvbGVTZXRHcm91cGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5IDxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q3VzdG9tQ2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5I2dldENhdGVnb3JpemVkRWxlbWVudHMgPGVtPkNhdGVnb3JpemVkIEVsZW1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5DYXRlZ29yaXplZCBFbGVtZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JICogQHNlZSAjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5I2dldFN1YkNhdGVnb3JpZXMgPGVtPlN1YiBDYXRlZ29yaWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWIgQ2F0ZWdvcmllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0U3ViQ2F0ZWdvcmllcygpCi0JICogQHNlZSAjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3JpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzIDxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVsaXZlcnlQcm9jZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3MjZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzIDxlbT5FZHVjYXRpb24gTWF0ZXJpYWxzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5FZHVjYXRpb24gTWF0ZXJpYWxzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3MjZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscyA8ZW0+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWxzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzI2dldEluY2x1ZGVzUGF0dGVybnMgPGVtPkluY2x1ZGVzIFBhdHRlcm5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbmNsdWRlcyBQYXR0ZXJuczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyNnZXRJbmNsdWRlc1BhdHRlcm5zKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzI2dldERlZmF1bHRDb250ZXh0IDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MjZ2V0RGVmYXVsdENvbnRleHQoKQotCSAqIEBzZWUgI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NfRGVmYXVsdENvbnRleHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MjZ2V0VmFsaWRDb250ZXh0IDxlbT5WYWxpZCBDb250ZXh0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5WYWxpZCBDb250ZXh0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzI2dldFZhbGlkQ29udGV4dCgpCi0JICogQHNlZSAjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm4gPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDYXBhYmlsaXR5UGF0dGVybigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSA8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlI2dldEJhc2VkT25Qcm9jZXNzZXMgPGVtPkJhc2VkIE9uIFByb2Nlc3NlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QmFzZWQgT24gUHJvY2Vzc2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSNnZXRCYXNlZE9uUHJvY2Vzc2VzKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfQmFzZWRPblByb2Nlc3NlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwIDxlbT5Sb2FkbWFwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvYWRtYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudCA8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0SW50ZXJmYWNlcyA8ZW0+SW50ZXJmYWNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW50ZXJmYWNlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRJbnRlcmZhY2VzKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50X0ludGVyZmFjZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldFByb2Nlc3MgPGVtPlByb2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Qcm9jZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldFByb2Nlc3MoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRfUHJvY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSA8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXRQcm9jZXNzRWxlbWVudHMgPGVtPlByb2Nlc3MgRWxlbWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByb2Nlc3MgRWxlbWVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlI2dldFByb2Nlc3NFbGVtZW50cygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc1BhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UjZ2V0RGlhZ3JhbXMgPGVtPkRpYWdyYW1zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EaWFncmFtczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UjZ2V0RGlhZ3JhbXMoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzUGFja2FnZV9EaWFncmFtcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZVNwZWNpZmljYXRpb25zIDxlbT5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRJbnRlcmZhY2VJTyA8ZW0+SW50ZXJmYWNlIElPPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbnRlcmZhY2UgSU88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlSU8oKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IgPGVtPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IjZ2V0X3Byb2Nlc3NDb21wb25lbnQgPGVtPnByb2Nlc3MgQ29tcG9uZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+cHJvY2VzcyBDb21wb25lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yI2dldF9wcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfX3Byb2Nlc3NDb21wb25lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kUGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2dldFVzZXJDaGFuZ2VhYmxlIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiNnZXRVc2VyQ2hhbmdlYWJsZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiNnZXRNZXRob2RQYWNrYWdlcyA8ZW0+TWV0aG9kIFBhY2thZ2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXRob2QgUGFja2FnZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiNnZXRNZXRob2RQYWNrYWdlcygpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiNnZXRCYXNlcyA8ZW0+QmFzZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkJhc2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4jZ2V0QmFzZXMoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBsdWdpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5WYXJpYWJpbGl0eSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFZhcmlhYmlsaXR5RWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQgPGVtPk1ldGhvZCBVbml0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBVbml0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RVbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRBdXRob3JzIDxlbT5BdXRob3JzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXV0aG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRBdXRob3JzKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0F1dGhvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2hhbmdlIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldENvcHlyaWdodFN0YXRlbWVudCA8ZW0+Q29weXJpZ2h0IFN0YXRlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24gPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKQotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKQotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRQcm9jZXNzVmlld3MgPGVtPlByb2Nlc3MgVmlld3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlByb2Nlc3MgVmlld3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0UHJvY2Vzc1ZpZXdzKCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0RGVmYXVsdFZpZXcgPGVtPkRlZmF1bHQgVmlldzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkRlZmF1bHQgVmlldzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXREZWZhdWx0VmlldygpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRCYXNlQ29uZmlndXJhdGlvbnMgPGVtPkJhc2UgQ29uZmlndXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkJhc2UgQ29uZmlndXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0QmFzZUNvbmZpZ3VyYXRpb25zKCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkgPGVtPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRBZGRlZENhdGVnb3J5IDxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QWRkZWQgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0QWRkZWRDYXRlZ29yeSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHkgPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzRmFtaWx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5I2dldERlbGl2ZXJ5UHJvY2Vzc2VzIDxlbT5EZWxpdmVyeSBQcm9jZXNzZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3NlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseSNnZXREZWxpdmVyeVByb2Nlc3NlcygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0ZhbWlseSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0ZhbWlseV9EZWxpdmVyeVByb2Nlc3NlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5IDxlbT5NZXRob2QgTGlicmFyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSNnZXRNZXRob2RQbHVnaW5zIDxlbT5NZXRob2QgUGx1Z2luczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWV0aG9kIFBsdWdpbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkjZ2V0TWV0aG9kUGx1Z2lucygpCi0JICogQHNlZSAjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5I2dldFByZWRlZmluZWRDb25maWd1cmF0aW9ucyA8ZW0+UHJlZGVmaW5lZCBDb25maWd1cmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJlZGVmaW5lZCBDb25maWd1cmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSNnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKQotCSAqIEBzZWUgI2dldE1ldGhvZExpYnJhcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZExpYnJhcnlfUHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50IDxlbT5Qb2ludDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qb2ludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBvaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQjZ2V0WCA8ZW0+WDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50I2dldFgoKQotCSAqIEBzZWUgI2dldFBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQb2ludF9YKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQjZ2V0WSA8ZW0+WTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50I2dldFkoKQotCSAqIEBzZWUgI2dldFBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQb2ludF9ZKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEdyYXBoRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRQb3NpdGlvbiA8ZW0+UG9zaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5Qb3NpdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldFBvc2l0aW9uKCkKLQkgKiBAc2VlICNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEdyYXBoRWxlbWVudF9Qb3NpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldENvbnRhaW5lZCA8ZW0+Q29udGFpbmVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db250YWluZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRDb250YWluZWQoKQotCSAqIEBzZWUgI2dldEdyYXBoRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0R3JhcGhFbGVtZW50X0NvbnRhaW5lZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldExpbmsgPGVtPkxpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkxpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRMaW5rKCkKLQkgKiBAc2VlICNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEdyYXBoRWxlbWVudF9MaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0QW5jaG9yYWdlIDxlbT5BbmNob3JhZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkFuY2hvcmFnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldEFuY2hvcmFnZSgpCi0JICogQHNlZSAjZ2V0R3JhcGhFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfQW5jaG9yYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldFNlbWFudGljTW9kZWwgPGVtPlNlbWFudGljIE1vZGVsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+U2VtYW50aWMgTW9kZWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRTZW1hbnRpY01vZGVsKCkKLQkgKiBAc2VlICNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEdyYXBoRWxlbWVudF9TZW1hbnRpY01vZGVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50IDxlbT5EaWFncmFtIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGlhZ3JhbSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGlhZ3JhbUVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRJc1Zpc2libGUgPGVtPklzIFZpc2libGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBWaXNpYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRJc1Zpc2libGUoKQotCSAqIEBzZWUgI2dldERpYWdyYW1FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREaWFncmFtRWxlbWVudF9Jc1Zpc2libGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0Q29udGFpbmVyXyA8ZW0+Q29udGFpbmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkNvbnRhaW5lcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0Q29udGFpbmVyXygpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpYWdyYW1FbGVtZW50X0NvbnRhaW5lcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0UmVmZXJlbmNlIDxlbT5SZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0UmVmZXJlbmNlKCkKLQkgKiBAc2VlICNnZXREaWFncmFtRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUVsZW1lbnRfUmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRQcm9wZXJ0eSA8ZW0+UHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRQcm9wZXJ0eSgpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpYWdyYW1FbGVtZW50X1Byb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rIDxlbT5EaWFncmFtIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGlhZ3JhbSBMaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGlhZ3JhbUxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRab29tIDxlbT5ab29tPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Wm9vbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Wm9vbSgpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbUxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpYWdyYW1MaW5rX1pvb20oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRWaWV3cG9ydCA8ZW0+Vmlld3BvcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5WaWV3cG9ydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Vmlld3BvcnQoKQotCSAqIEBzZWUgI2dldERpYWdyYW1MaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaWFncmFtTGlua19WaWV3cG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0R3JhcGhFbGVtZW50KCkKLQkgKiBAc2VlICNnZXREaWFncmFtTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUxpbmtfR3JhcGhFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkRpYWdyYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldERpYWdyYW0oKQotCSAqIEBzZWUgI2dldERpYWdyYW1MaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaWFncmFtTGlua19EaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yIDxlbT5HcmFwaCBDb25uZWN0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3JhcGggQ29ubmVjdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3JhcGhDb25uZWN0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yI2dldEdyYXBoRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0R3JhcGhDb25uZWN0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFZGdlIDxlbT5HcmFwaCBFZGdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5HcmFwaCBFZGdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciNnZXRHcmFwaEVkZ2UoKQotCSAqIEBzZWUgI2dldEdyYXBoQ29ubmVjdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRHcmFwaENvbm5lY3Rvcl9HcmFwaEVkZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSA8ZW0+U2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVzZW50YXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0UHJlc2VudGF0aW9uKCkKLQkgKiBAc2VlICNnZXRTZW1hbnRpY01vZGVsQnJpZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZW1hbnRpY01vZGVsQnJpZGdlX1ByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldEdyYXBoRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9HcmFwaEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXREaWFncmFtIDxlbT5EaWFncmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkRpYWdyYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RGlhZ3JhbSgpCi0JICogQHNlZSAjZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9EaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbiA8ZW0+RGltZW5zaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpbWVuc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREaW1lbnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24jZ2V0V2lkdGggPGVtPldpZHRoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V2lkdGg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbiNnZXRXaWR0aCgpCi0JICogQHNlZSAjZ2V0RGltZW5zaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREaW1lbnNpb25fV2lkdGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24jZ2V0SGVpZ2h0IDxlbT5IZWlnaHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IZWlnaHQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbiNnZXRIZWlnaHQoKQotCSAqIEBzZWUgI2dldERpbWVuc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGltZW5zaW9uX0hlaWdodCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UgPGVtPlJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlI2dldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIDxlbT5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlI2dldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAc2VlICNnZXRSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlZmVyZW5jZV9Jc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSNnZXRSZWZlcmVuY2VkIDxlbT5SZWZlcmVuY2VkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UmVmZXJlbmNlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlI2dldFJlZmVyZW5jZWQoKQotCSAqIEBzZWUgI2dldFJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlX1JlZmVyZW5jZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eSNnZXRLZXkgPGVtPktleTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPktleTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHkjZ2V0S2V5KCkKLQkgKiBAc2VlICNnZXRQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfS2V5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5I2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlIDxlbT5HcmFwaCBFZGdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkdyYXBoIEVkZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3JhcGhFZGdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UjZ2V0QW5jaG9yIDxlbT5BbmNob3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkFuY2hvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlI2dldEFuY2hvcigpCi0JICogQHNlZSAjZ2V0R3JhcGhFZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRHcmFwaEVkZ2VfQW5jaG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UjZ2V0V2F5cG9pbnRzIDxlbT5XYXlwb2ludHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPldheXBvaW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlI2dldFdheXBvaW50cygpCi0JICogQHNlZSAjZ2V0R3JhcGhFZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRHcmFwaEVkZ2VfV2F5cG9pbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGlhZ3JhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0Wm9vbSA8ZW0+Wm9vbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlpvb208L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0Wm9vbSgpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGlhZ3JhbV9ab29tKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXRWaWV3cG9pbnQgPGVtPlZpZXdwb2ludDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlZpZXdwb2ludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXRWaWV3cG9pbnQoKQotCSAqIEBzZWUgI2dldERpYWdyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpYWdyYW1fVmlld3BvaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldERpYWdyYW1MaW5rIDxlbT5EaWFncmFtIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkRpYWdyYW0gTGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXREaWFncmFtTGluaygpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlhZ3JhbV9EaWFncmFtTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5OYW1lc3BhY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0TmFtZXNwYWNlKCkKLQkgKiBAc2VlICNnZXREaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaWFncmFtX05hbWVzcGFjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGUgPGVtPkdyYXBoIE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3JhcGggTm9kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRHcmFwaE5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGUjZ2V0U2l6ZSA8ZW0+U2l6ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNpemU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZSNnZXRTaXplKCkKLQkgKiBAc2VlICNnZXRHcmFwaE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEdyYXBoTm9kZV9TaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IDxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQjZ2V0VHlwZUluZm8gPGVtPlR5cGUgSW5mbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGUgSW5mbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQjZ2V0VHlwZUluZm8oKQotCSAqIEBzZWUgI2dldFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF9UeXBlSW5mbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlIDxlbT5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlI2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlI2dldEVsZW1lbnQoKQotCSAqIEBzZWUgI2dldFVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFVNQVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZSA8ZW0+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlI2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRFbGVtZW50KCkKLQkgKiBAc2VlICNnZXRDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5MZWFmRWxlbWVudCA8ZW0+TGVhZiBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkxlYWYgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTGVhZkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldExlYWZFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50IDxlbT5UZXh0IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGV4dCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGV4dEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudCNnZXRUZXh0IDxlbT5UZXh0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGV4dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnQjZ2V0VGV4dCgpCi0JICogQHNlZSAjZ2V0VGV4dEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRleHRFbGVtZW50X1RleHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UgPGVtPkltYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkltYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SW1hZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZSNnZXRVcmkgPGVtPlVyaTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVyaTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UjZ2V0VXJpKCkKLQkgKiBAc2VlICNnZXRJbWFnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SW1hZ2VfVXJpKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UjZ2V0TWltZVR5cGUgPGVtPk1pbWUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1pbWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UjZ2V0TWltZVR5cGUoKQotCSAqIEBzZWUgI2dldEltYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJbWFnZV9NaW1lVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaGljUHJpbWl0aXZlIDxlbT5HcmFwaGljIFByaW1pdGl2ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5HcmFwaGljIFByaW1pdGl2ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhpY1ByaW1pdGl2ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3JhcGhpY1ByaW1pdGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZSA8ZW0+UG9seWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UG9seWxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQb2x5bGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lI2dldENsb3NlZCA8ZW0+Q2xvc2VkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2xvc2VkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZSNnZXRDbG9zZWQoKQotCSAqIEBzZWUgI2dldFBvbHlsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQb2x5bGluZV9DbG9zZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lI2dldFdheXBvaW50cyA8ZW0+V2F5cG9pbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5XYXlwb2ludHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lI2dldFdheXBvaW50cygpCi0JICogQHNlZSAjZ2V0UG9seWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBvbHlsaW5lX1dheXBvaW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlIDxlbT5FbGxpcHNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVsbGlwc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEVsbGlwc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFJhZGl1c1ggPGVtPlJhZGl1cyBYPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmFkaXVzIFg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0UmFkaXVzWCgpCi0JICogQHNlZSAjZ2V0RWxsaXBzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWxsaXBzZV9SYWRpdXNYKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRSYWRpdXNZIDxlbT5SYWRpdXMgWTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJhZGl1cyBZPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFJhZGl1c1koKQotCSAqIEBzZWUgI2dldEVsbGlwc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVsbGlwc2VfUmFkaXVzWSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0Um90YXRpb24gPGVtPlJvdGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Um90YXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0Um90YXRpb24oKQotCSAqIEBzZWUgI2dldEVsbGlwc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVsbGlwc2VfUm90YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFN0YXJ0QW5nbGUgPGVtPlN0YXJ0IEFuZ2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQgQW5nbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0U3RhcnRBbmdsZSgpCi0JICogQHNlZSAjZ2V0RWxsaXBzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWxsaXBzZV9TdGFydEFuZ2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRFbmRBbmdsZSA8ZW0+RW5kIEFuZ2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RW5kIEFuZ2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldEVuZEFuZ2xlKCkKLQkgKiBAc2VlICNnZXRFbGxpcHNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbGxpcHNlX0VuZEFuZ2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRDZW50ZXIgPGVtPkNlbnRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkNlbnRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRDZW50ZXIoKQotCSAqIEBzZWUgI2dldEVsbGlwc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVsbGlwc2VfQ2VudGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZSA8ZW0+V29yayBPcmRlciBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+V29yayBPcmRlciBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFdvcmtPcmRlclR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS51dGlsLkRhdGUgPGVtPkRhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkRhdGU8L2VtPicuCi0JICogQHNlZSBqYXZhLnV0aWwuRGF0ZQotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLnV0aWwuRGF0ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm5ldC5VUkkgPGVtPlVyaTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VXJpPC9lbT4nLgotCSAqIEBzZWUgamF2YS5uZXQuVVJJCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubmV0LlVSSSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFVyaSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlN0cmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+U3RyaW5nPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0U3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLkJvb2xlYW4gPGVtPkJvb2xlYW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkJvb2xlYW48L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuQm9vbGVhbgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEJvb2xlYW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLnV0aWwuU2V0IDxlbT5TZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlNldDwvZW0+Jy4KLQkgKiBAc2VlIGphdmEudXRpbC5TZXQKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS51dGlsLlNldCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFNldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEudXRpbC5MaXN0IDxlbT5TZXF1ZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+U2VxdWVuY2U8L2VtPicuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdAotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLnV0aWwuTGlzdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFNlcXVlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SW50ZWdlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5JbnRlZ2VyPC9lbT4nLgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJpbnQiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRJbnRlZ2VyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLkRvdWJsZSA8ZW0+RG91YmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Eb3VibGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuRG91YmxlCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5Eb3VibGUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREb3VibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVtYUZhY3RvcnkgZ2V0VW1hRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2xhc3NpZmllckltcGwgPGVtPkNsYXNzaWZpZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2xhc3NpZmllckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q2xhc3NpZmllcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDTEFTU0lGSUVSID0gZUlOU1RBTkNFLmdldENsYXNzaWZpZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ0xBU1NJRklFUl9fSVNfQUJTVFJBQ1QgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q2xhc3NpZmllcl9Jc0Fic3RyYWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVHlwZUltcGwgPGVtPlR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUWVBFID0gZUlOU1RBTkNFLmdldFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGVtZW50SW1wbCA8ZW0+RWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0RWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwgPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTmFtZWRFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXROYW1lZEVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTkFNRURfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBOQU1FRF9FTEVNRU5UX19OQU1FID0gZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGFja2FnZWFibGVFbGVtZW50SW1wbCA8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QYWNrYWdlYWJsZUVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBhY2thZ2VhYmxlRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQQUNLQUdFQUJMRV9FTEVNRU5UID0gZUlOU1RBTkNFLmdldFBhY2thZ2VhYmxlRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBhY2thZ2VJbXBsIDxlbT5QYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBhY2thZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBhY2thZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTmFtZXNwYWNlSW1wbCA8ZW0+TmFtZXNwYWNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk5hbWVzcGFjZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TmFtZXNwYWNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE5BTUVTUEFDRSA9IGVJTlNUQU5DRS5nZXROYW1lc3BhY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCA8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfX0dVSUQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RFbGVtZW50X093bmVkUnVsZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9FTEVNRU5UX19LSU5EID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfS2luZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZEVsZW1lbnRfU3VwcHJlc3NlZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uc3RyYWludEltcGwgPGVtPkNvbnN0cmFpbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uc3RyYWludEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29uc3RyYWludCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05TVFJBSU5UID0gZUlOU1RBTkNFLmdldENvbnN0cmFpbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJvZHk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05TVFJBSU5UX19CT0RZID0gZUlOU1RBTkNFLmdldENvbnN0cmFpbnRfQm9keSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuS2luZEltcGwgPGVtPktpbmQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuS2luZEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0S2luZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBLSU5EID0gZUlOU1RBTkNFLmdldEtpbmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBLSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTyA9IGVJTlNUQU5DRQotCQkJCS5nZXRLaW5kX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsIDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTlRFTlRfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfRUxFTUVOVF9fQVNTRVRTID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfRUxFTUVOVF9fVEVSTURFRklOSVRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfVGVybWRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsIDxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFU0NSSUJBQkxFX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OID0gZUlOU1RBTkNFCi0JCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCA8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05URU5UX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IGVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX0xvbmdQcmVzZW50YXRpb25OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwgPGVtPlNlY3Rpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2VjdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRUNUSU9OID0gZUlOU1RBTkNFLmdldFNlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1RJT05fX1NFQ1RJT05fTkFNRSA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVElPTl9fU0VDVElPTl9ERVNDUklQVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRTZWN0aW9uX1NlY3Rpb25EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViIFNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRUNUSU9OX19TVUJfU0VDVElPTlMgPSBlSU5TVEFOQ0UuZ2V0U2VjdGlvbl9TdWJTZWN0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRUNUSU9OX19QUkVERUNFU1NPUiA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZUltcGwgPGVtPlJvbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFID0gZUlOU1RBTkNFLmdldFJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1vZGlmaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBST0xFX19NT0RJRklFUyA9IGVJTlNUQU5DRS5nZXRSb2xlX01vZGlmaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJPTEVfX1JFU1BPTlNJQkxFX0ZPUiA9IGVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsIDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfUFJPRFVDVCA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS19QUk9EVUNUX19SRVBPUlRTID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS19QUk9EVUNUX19URU1QTEFURVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRnVsZmlsbGFibGVFbGVtZW50SW1wbCA8ZW0+RnVsZmlsbGFibGUgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5GdWxmaWxsYWJsZUVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEZ1bGZpbGxhYmxlRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBGVUxGSUxMQUJMRV9FTEVNRU5UID0gZUlOU1RBTkNFLmdldEZ1bGZpbGxhYmxlRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEZVTEZJTExBQkxFX0VMRU1FTlRfX0ZVTEZJTExTID0gZUlOU1RBTkNFCi0JCQkJLmdldEZ1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsIDxlbT5UYXNrPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRhc2soKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEFTSyA9IGVJTlNUQU5DRS5nZXRUYXNrKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgQnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfX1BFUkZPUk1FRF9CWSA9IGVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfX01BTkRBVE9SWV9JTlBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfX09VVFBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSA9IGVJTlNUQU5DRQotCQkJCS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19fT1BUSU9OQUxfSU5QVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdGVwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19fU1RFUFMgPSBlSU5TVEFOQ0UuZ2V0VGFza19TdGVwcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX19UT09MX01FTlRPUlMgPSBlSU5TVEFOQ0UuZ2V0VGFza19Ub29sTWVudG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbCA8ZW0+V29yayBEZWZpbml0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrRGVmaW5pdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX0RFRklOSVRJT04gPSBlSU5TVEFOQ0UuZ2V0V29ya0RlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtEZWZpbml0aW9uX1ByZWNvbmRpdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrRGVmaW5pdGlvbl9Qb3N0Y29uZGl0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3RlcEltcGwgPGVtPlN0ZXA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3RlcEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U3RlcCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTVEVQID0gZUlOU1RBTkNFLmdldFN0ZXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkYW5jZUltcGwgPGVtPkd1aWRhbmNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRhbmNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkYW5jZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBHVUlEQU5DRSA9IGVJTlNUQU5DRS5nZXRHdWlkYW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0SW1wbCA8ZW0+QXJ0aWZhY3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXJ0aWZhY3RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFydGlmYWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFSVElGQUNUID0gZUlOU1RBTkNFLmdldEFydGlmYWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXIgQXJ0aWZhY3Q8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVCA9IGVJTlNUQU5DRQotCQkJCS5nZXRBcnRpZmFjdF9Db250YWluZXJBcnRpZmFjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVkIEFydGlmYWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcmFibGVJbXBsIDxlbT5EZWxpdmVyYWJsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcmFibGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVMSVZFUkFCTEUgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuT3V0Y29tZUltcGwgPGVtPk91dGNvbWU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuT3V0Y29tZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0T3V0Y29tZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBPVVRDT01FID0gZUlOU1RBTkNFLmdldE91dGNvbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbCA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kUGFja2FnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfUEFDS0FHRV9fR0xPQkFMID0gZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2VfR2xvYmFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hpbGQgUGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwgPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudFBhY2thZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9QQUNLQUdFID0gZUlOU1RBTkNFLmdldENvbnRlbnRQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250ZW50IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwgPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVJUSUZBQ1RfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgT3V0bGluZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FID0gZUlOU1RBTkNFCi0JCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fQnJpZWZPdXRsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05PVEFUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fTm90YXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBhY3QgT2YgTm90IEhhdmluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCA8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERUxJVkVSQUJMRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhY2thZ2luZyBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwgPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNraWxsczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TeW5vbnltczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TID0gZUlOU1RBTkNFCi0JCQkJLmdldFJvbGVEZXNjcmlwdGlvbl9TeW5vbnltcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdGlvbkltcGwgPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEFTS19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRhbmNlRGVzY3JpcHRpb25JbXBsIDxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkYW5jZURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdVSURBTkNFX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF0dGFjaG1lbnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlRTID0gZUlOU1RBTkNFCi0JCQkJLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCA8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUkFDVElDRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsIEluZm88L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPID0gZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2JsZW08L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTSA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX1Byb2JsZW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORCA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdvYWxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTID0gZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxldmVscyBPZiBBZG9wdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsIDxlbT5BY3Rpdml0eTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QWN0aXZpdHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQUNUSVZJVFkgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFDVElWSVRZX19ST0FETUFQUyA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Sb2FkbWFwcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19CUkVBS0RPV05fRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORyA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaW5rIFRvIFByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwgPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQlJFQUtET1dOX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWCA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfUGxhbm5pbmdEYXRhKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXRpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1RTID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEVTID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfRXhhbXBsZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkVTID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfR3VpZGVsaW5lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVRTID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfUmV1c2FibGVBc3NldHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJSRUFLRE9XTl9FTEVNRU5UX19URU1QTEFURVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9UZW1wbGF0ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJSRUFLRE9XTl9FTEVNRU5UX19SRVBPUlRTID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfUmVwb3J0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfRXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fVE9PTE1FTlRPUiA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X1Rvb2xtZW50b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NaWxlc3RvbmVJbXBsIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWlsZXN0b25lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNaWxlc3RvbmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUlMRVNUT05FID0gZUlOU1RBTkNFLmdldE1pbGVzdG9uZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQgUmVzdWx0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFRTID0gZUlOU1RBTkNFCi0JCQkJLmdldE1pbGVzdG9uZV9SZXF1aXJlZFJlc3VsdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JdGVyYXRpb25JbXBsIDxlbT5JdGVyYXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuSXRlcmF0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRJdGVyYXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSVRFUkFUSU9OID0gZUlOU1RBTkNFLmdldEl0ZXJhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBoYXNlSW1wbCA8ZW0+UGhhc2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGhhc2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBoYXNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBIQVNFID0gZUlOU1RBTkNFLmdldFBoYXNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsIDxlbT5UZWFtIFByb2ZpbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRlYW1Qcm9maWxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRFQU1fUFJPRklMRSA9IGVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGVhbSBSb2xlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTID0gZUlOU1RBTkNFCi0JCQkJLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgVGVhbTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTSA9IGVJTlNUQU5DRQotCQkJCS5nZXRUZWFtUHJvZmlsZV9TdXBlclRlYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YiBUZWFtPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBURUFNX1BST0ZJTEVfX1NVQl9URUFNID0gZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwgPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZURlc2NyaXB0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUk9MRV9ERVNDUklQVE9SX19ST0xFID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1vZGlmaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBST0xFX0RFU0NSSVBUT1JfX01PRElGSUVTID0gZUlOU1RBTkNFCi0JCQkJLmdldFJvbGVEZXNjcmlwdG9yX01vZGlmaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SID0gZUlOU1RBTkNFCi0JCQkJLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya09yZGVySW1wbCA8ZW0+V29yayBPcmRlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtPcmRlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX09SREVSID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGluayBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19PUkRFUl9fTElOS19UWVBFID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlcl9MaW5rVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlZDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfT1JERVJfX1BSRUQgPSBlSU5TVEFOQ0UuZ2V0V29ya09yZGVyX1ByZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGwgPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0VsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19FTEVNRU5UID0gZUlOU1RBTkNFLmdldFByb2Nlc3NFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbCA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBsYW5uaW5nRGF0YSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQTEFOTklOR19EQVRBID0gZUlOU1RBTkNFLmdldFBsYW5uaW5nRGF0YSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQTEFOTklOR19EQVRBX19GSU5JU0hfREFURSA9IGVJTlNUQU5DRQotCQkJCS5nZXRQbGFubmluZ0RhdGFfRmluaXNoRGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmFuazwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBMQU5OSU5HX0RBVEFfX1JBTksgPSBlSU5TVEFOQ0UuZ2V0UGxhbm5pbmdEYXRhX1JhbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9ySW1wbCA8ZW0+RGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gZUlOU1RBTkNFCi0JCQkJLmdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsIDxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRBU0tfREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFzazwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfREVTQ1JJUFRPUl9fVEFTSyA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFzc2lzdGVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hbmRhdG9yeSBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19ERVNDUklQVE9SX19PVVRQVVQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlkgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlbGVjdGVkIFN0ZXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX1NFTEVDVEVEX1NURVBTID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURSA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBhY3RlZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RlZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBhY3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVsaXZlcmFibGUgUGFydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsIDxlbT5Db21wb3NpdGUgUm9sZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb21wb3NpdGVSb2xlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTVBPU0lURV9ST0xFID0gZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFnZ3JlZ2F0ZWQgUm9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsIDxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFDVElWSVRZX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhvd3RvIFN0YWZmPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGID0gZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93dG9TdGFmZigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCA8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRSA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUyA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SaXNrIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTCA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFID0gZUlOU1RBTkNFCi0JCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGUgT2YgQ29udHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUID0gZUlOU1RBTkNFCi0JCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCA8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIE5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1VzYWdlTm90ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsIDxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFU0NSSVBUT1JfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWZpbmVkIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uY2VwdEltcGwgPGVtPkNvbmNlcHQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uY2VwdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29uY2VwdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05DRVBUID0gZUlOU1RBTkNFLmdldENvbmNlcHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DaGVja2xpc3RJbXBsIDxlbT5DaGVja2xpc3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2hlY2tsaXN0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDaGVja2xpc3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ0hFQ0tMSVNUID0gZUlOU1RBTkNFLmdldENoZWNrbGlzdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkV4YW1wbGVJbXBsIDxlbT5FeGFtcGxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkV4YW1wbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEV4YW1wbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRVhBTVBMRSA9IGVJTlNUQU5DRS5nZXRFeGFtcGxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGVsaW5lSW1wbCA8ZW0+R3VpZGVsaW5lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRlbGluZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGVsaW5lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdVSURFTElORSA9IGVJTlNUQU5DRS5nZXRHdWlkZWxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVwb3J0SW1wbCA8ZW0+UmVwb3J0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlcG9ydEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UmVwb3J0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJFUE9SVCA9IGVJTlNUQU5DRS5nZXRSZXBvcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZW1wbGF0ZUltcGwgPGVtPlRlbXBsYXRlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlbXBsYXRlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZW1wbGF0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBURU1QTEFURSA9IGVJTlNUQU5DRS5nZXRUZW1wbGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN1cHBvcnRpbmdNYXRlcmlhbEltcGwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3VwcG9ydGluZ01hdGVyaWFsSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU1VQUE9SVElOR19NQVRFUklBTCA9IGVJTlNUQU5DRS5nZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Ub29sTWVudG9ySW1wbCA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbE1lbnRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VG9vbE1lbnRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUT09MX01FTlRPUiA9IGVJTlNUQU5DRS5nZXRUb29sTWVudG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV2hpdGVwYXBlckltcGwgPGVtPldoaXRlcGFwZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV2hpdGVwYXBlckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V2hpdGVwYXBlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXSElURVBBUEVSID0gZUlOU1RBTkNFLmdldFdoaXRlcGFwZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZXJtRGVmaW5pdGlvbkltcGwgPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZXJtRGVmaW5pdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVybURlZmluaXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEVSTV9ERUZJTklUSU9OID0gZUlOU1RBTkNFLmdldFRlcm1EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX0lzUHJpbWFyeUV4dGVuc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlSW1wbCA8ZW0+UHJhY3RpY2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByYWN0aWNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBSQUNUSUNFID0gZUlOU1RBTkNFLmdldFByYWN0aWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgUHJhY3RpY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUkFDVElDRV9fU1VCX1BSQUNUSUNFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZV9TdWJQcmFjdGljZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZpdHkgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmV1c2FibGVBc3NldEltcGwgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJldXNhYmxlQXNzZXRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJldXNhYmxlQXNzZXQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVVU0FCTEVfQVNTRVQgPSBlSU5TVEFOQ0UuZ2V0UmV1c2FibGVBc3NldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsIDxlbT5EaXNjaXBsaW5lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpc2NpcGxpbmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRElTQ0lQTElORSA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXNrczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElTQ0lQTElORV9fVEFTS1MgPSBlSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9UYXNrcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViZGlzY2lwbGluZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElTQ0lQTElORV9fU1VCRElTQ0lQTElORSA9IGVJTlNUQU5DRQotCQkJCS5nZXREaXNjaXBsaW5lX1N1YmRpc2NpcGxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBXb3JrZmxvd3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1MgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvd3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlJbXBsIDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRDYXRlZ29yeUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudENhdGVnb3J5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTlRFTlRfQ0FURUdPUlkgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudENhdGVnb3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEltcGwgPGVtPlJvbGUgU2V0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVTZXRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVTZXQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9TRVQgPSBlSU5TVEFOQ0UuZ2V0Um9sZVNldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJPTEVfU0VUX19ST0xFUyA9IGVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRG9tYWluSW1wbCA8ZW0+RG9tYWluPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRvbWFpbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RG9tYWluKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERPTUFJTiA9IGVJTlNUQU5DRS5nZXREb21haW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERPTUFJTl9fV09SS19QUk9EVUNUUyA9IGVJTlNUQU5DRS5nZXREb21haW5fV29ya1Byb2R1Y3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWJkb21haW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBET01BSU5fX1NVQkRPTUFJTlMgPSBlSU5TVEFOQ0UuZ2V0RG9tYWluX1N1YmRvbWFpbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0VHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1RfVFlQRSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1RTID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsIDxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVHcm91cGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERJU0NJUExJTkVfR1JPVVBJTkcgPSBlSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNjaXBsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbEltcGwgPGVtPlRvb2w8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VG9vbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUT09MID0gZUlOU1RBTkNFLmdldFRvb2woKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVE9PTF9fVE9PTF9NRU5UT1JTID0gZUlOU1RBTkNFLmdldFRvb2xfVG9vbE1lbnRvcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsIDxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVTZXRHcm91cGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFX1NFVF9HUk9VUElORyA9IGVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGUgU2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwgPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ1VTVE9NX0NBVEVHT1JZID0gZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXRlZ29yaXplZCBFbGVtZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgQ2F0ZWdvcmllczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUklFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbCA8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJ5UHJvY2VzcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERUxJVkVSWV9QUk9DRVNTID0gZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2VzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWR1Y2F0aW9uIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUyA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWxzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMUyA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzSW1wbCA8ZW0+UHJvY2VzczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1MgPSBlSU5TVEFOQ0UuZ2V0UHJvY2VzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZXMgUGF0dGVybnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NfSW5jbHVkZXNQYXR0ZXJucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBDb250ZXh0PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19fREVGQVVMVF9DT05URVhUID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NfRGVmYXVsdENvbnRleHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbGlkIENvbnRleHQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfX1ZBTElEX0NPTlRFWFQgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGwgPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ0FQQUJJTElUWV9QQVRURVJOID0gZUlOU1RBTkNFLmdldENhcGFiaWxpdHlQYXR0ZXJuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsIDxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXNlZCBPbiBQcm9jZXNzZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VEX09OX1BST0NFU1NFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlZE9uUHJvY2Vzc2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9hZG1hcEltcGwgPGVtPlJvYWRtYXA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9hZG1hcEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9hZG1hcCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0FETUFQID0gZUlOU1RBTkNFLmdldFJvYWRtYXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCA8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX0NPTVBPTkVOVCA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzQ29tcG9uZW50X0ludGVyZmFjZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwgPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc1BhY2thZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19QQUNLQUdFID0gZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzUGFja2FnZV9EaWFncmFtcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZVNwZWNpZmljYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgSU88L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwgPGVtPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPnByb2Nlc3MgQ29tcG9uZW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJPQ0VTU19DT01QT05FTlQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfX3Byb2Nlc3NDb21wb25lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kUGx1Z2luKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9QTFVHSU4gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vc2VyIENoYW5nZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfUExVR0lOX19CQVNFUyA9IGVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fQmFzZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5WYXJpYWJpbGl0eUVsZW1lbnRJbXBsIDxlbT5WYXJpYWJpbGl0eSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlZhcmlhYmlsaXR5RWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFZBUklBQklMSVRZX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IGVJTlNUQU5DRQotCQkJCS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsIDxlbT5NZXRob2QgVW5pdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RVbml0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RVbml0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9VTklUID0gZUlOU1RBTkNFLmdldE1ldGhvZFVuaXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfVU5JVF9fQVVUSE9SUyA9IGVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0F1dGhvcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1VOSVRfX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHRTdGF0ZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfQ09ORklHVVJBVElPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIFZpZXdzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWaWV3PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXNlIENvbmZpZ3VyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3VidHJhY3RlZCBDYXRlZ29yeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlkgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9TdWJ0cmFjdGVkQ2F0ZWdvcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFkZGVkIENhdGVnb3J5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlkgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0ZhbWlseUltcGwgPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NGYW1pbHlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NGYW1pbHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19GQU1JTFkgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0ZhbWlseSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2Vzc2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0ZBTUlMWV9fREVMSVZFUllfUFJPQ0VTU0VTID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NGYW1pbHlfRGVsaXZlcnlQcm9jZXNzZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbCA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kTGlicmFyeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfTElCUkFSWSA9IGVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2lucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVmaW5lZCBDb25maWd1cmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2ludEltcGwgPGVtPlBvaW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvaW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQb2ludCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQT0lOVCA9IGVJTlNUQU5DRS5nZXRQb2ludCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBPSU5UX19YID0gZUlOU1RBTkNFLmdldFBvaW50X1goKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQT0lOVF9fWSA9IGVJTlNUQU5DRS5nZXRQb2ludF9ZKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFbGVtZW50SW1wbCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEdyYXBoRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBHUkFQSF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldEdyYXBoRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBHUkFQSF9FTEVNRU5UX19QT1NJVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRHcmFwaEVsZW1lbnRfUG9zaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEID0gZUlOU1RBTkNFCi0JCQkJLmdldEdyYXBoRWxlbWVudF9Db250YWluZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEdSQVBIX0VMRU1FTlRfX0xJTksgPSBlSU5TVEFOQ0UuZ2V0R3JhcGhFbGVtZW50X0xpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFuY2hvcmFnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFID0gZUlOU1RBTkNFCi0JCQkJLmdldEdyYXBoRWxlbWVudF9BbmNob3JhZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlbWFudGljIE1vZGVsPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0R3JhcGhFbGVtZW50X1NlbWFudGljTW9kZWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtRWxlbWVudEltcGwgPGVtPkRpYWdyYW0gRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlhZ3JhbUVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRElBR1JBTV9FTEVNRU5UID0gZUlOU1RBTkNFLmdldERpYWdyYW1FbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFID0gZUlOU1RBTkNFCi0JCQkJLmdldERpYWdyYW1FbGVtZW50X0lzVmlzaWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSID0gZUlOU1RBTkNFCi0JCQkJLmdldERpYWdyYW1FbGVtZW50X0NvbnRhaW5lcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRSA9IGVJTlNUQU5DRQotCQkJCS5nZXREaWFncmFtRWxlbWVudF9SZWZlcmVuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZID0gZUlOU1RBTkNFCi0JCQkJLmdldERpYWdyYW1FbGVtZW50X1Byb3BlcnR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUxpbmtJbXBsIDxlbT5EaWFncmFtIExpbms8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUxpbmtJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpYWdyYW1MaW5rKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERJQUdSQU1fTElOSyA9IGVJTlNUQU5DRS5nZXREaWFncmFtTGluaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Wm9vbTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERJQUdSQU1fTElOS19fWk9PTSA9IGVJTlNUQU5DRS5nZXREaWFncmFtTGlua19ab29tKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WaWV3cG9ydDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJQUdSQU1fTElOS19fVklFV1BPUlQgPSBlSU5TVEFOQ0UuZ2V0RGlhZ3JhbUxpbmtfVmlld3BvcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UID0gZUlOU1RBTkNFCi0JCQkJLmdldERpYWdyYW1MaW5rX0dyYXBoRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJQUdSQU1fTElOS19fRElBR1JBTSA9IGVJTlNUQU5DRS5nZXREaWFncmFtTGlua19EaWFncmFtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhDb25uZWN0b3JJbXBsIDxlbT5HcmFwaCBDb25uZWN0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhDb25uZWN0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEdyYXBoQ29ubmVjdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdSQVBIX0NPTk5FQ1RPUiA9IGVJTlNUQU5DRS5nZXRHcmFwaENvbm5lY3RvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBHUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0R3JhcGhDb25uZWN0b3JfR3JhcGhFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBFZGdlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBHUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VER0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0R3JhcGhDb25uZWN0b3JfR3JhcGhFZGdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VtYW50aWNNb2RlbEJyaWRnZUltcGwgPGVtPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZW1hbnRpY01vZGVsQnJpZGdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTZW1hbnRpY01vZGVsQnJpZGdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFTUFOVElDX01PREVMX0JSSURHRSA9IGVJTlNUQU5DRS5nZXRTZW1hbnRpY01vZGVsQnJpZGdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRTZW1hbnRpY01vZGVsQnJpZGdlX1ByZXNlbnRhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9HcmFwaEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW08L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNID0gZUlOU1RBTkNFCi0JCQkJLmdldFNlbWFudGljTW9kZWxCcmlkZ2VfRGlhZ3JhbSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpbWVuc2lvbkltcGwgPGVtPkRpbWVuc2lvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaW1lbnNpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpbWVuc2lvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBESU1FTlNJT04gPSBlSU5TVEFOQ0UuZ2V0RGltZW5zaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERJTUVOU0lPTl9fV0lEVEggPSBlSU5TVEFOQ0UuZ2V0RGltZW5zaW9uX1dpZHRoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBESU1FTlNJT05fX0hFSUdIVCA9IGVJTlNUQU5DRS5nZXREaW1lbnNpb25fSGVpZ2h0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVmZXJlbmNlSW1wbCA8ZW0+UmVmZXJlbmNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlZmVyZW5jZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UmVmZXJlbmNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJFRkVSRU5DRSA9IGVJTlNUQU5DRS5nZXRSZWZlcmVuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRUZFUkVOQ0VfX0lTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UmVmZXJlbmNlX0lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVGRVJFTkNFX19SRUZFUkVOQ0VEID0gZUlOU1RBTkNFLmdldFJlZmVyZW5jZV9SZWZlcmVuY2VkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvcGVydHlJbXBsIDxlbT5Qcm9wZXJ0eTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9wZXJ0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvcGVydHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPktleTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST1BFUlRZX19LRVkgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHlfS2V5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST1BFUlRZX19WQUxVRSA9IGVJTlNUQU5DRS5nZXRQcm9wZXJ0eV9WYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWRnZUltcGwgPGVtPkdyYXBoIEVkZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFZGdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaEVkZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgR1JBUEhfRURHRSA9IGVJTlNUQU5DRS5nZXRHcmFwaEVkZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFuY2hvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfRURHRV9fQU5DSE9SID0gZUlOU1RBTkNFLmdldEdyYXBoRWRnZV9BbmNob3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldheXBvaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfRURHRV9fV0FZUE9JTlRTID0gZUlOU1RBTkNFLmdldEdyYXBoRWRnZV9XYXlwb2ludHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtSW1wbCA8ZW0+RGlhZ3JhbTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaWFncmFtKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERJQUdSQU0gPSBlSU5TVEFOQ0UuZ2V0RGlhZ3JhbSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Wm9vbTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERJQUdSQU1fX1pPT00gPSBlSU5TVEFOQ0UuZ2V0RGlhZ3JhbV9ab29tKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WaWV3cG9pbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESUFHUkFNX19WSUVXUE9JTlQgPSBlSU5TVEFOQ0UuZ2V0RGlhZ3JhbV9WaWV3cG9pbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW0gTGluazwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElBR1JBTV9fRElBR1JBTV9MSU5LID0gZUlOU1RBTkNFLmdldERpYWdyYW1fRGlhZ3JhbUxpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJQUdSQU1fX05BTUVTUEFDRSA9IGVJTlNUQU5DRS5nZXREaWFncmFtX05hbWVzcGFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoTm9kZUltcGwgPGVtPkdyYXBoIE5vZGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhOb2RlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaE5vZGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgR1JBUEhfTk9ERSA9IGVJTlNUQU5DRS5nZXRHcmFwaE5vZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNpemU8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBHUkFQSF9OT0RFX19TSVpFID0gZUlOU1RBTkNFLmdldEdyYXBoTm9kZV9TaXplKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsIDxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0U2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGUgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19UWVBFX0lORk8gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0U2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfVHlwZUluZm8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCA8ZW0+VU1BIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsIDxlbT5Db3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVCA9IGVJTlNUQU5DRQotCQkJCS5nZXRDb3JlU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTGVhZkVsZW1lbnRJbXBsIDxlbT5MZWFmIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTGVhZkVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldExlYWZFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIExFQUZfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRMZWFmRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRleHRFbGVtZW50SW1wbCA8ZW0+VGV4dCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRleHRFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZXh0RWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBURVhUX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0VGV4dEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBURVhUX0VMRU1FTlRfX1RFWFQgPSBlSU5TVEFOQ0UuZ2V0VGV4dEVsZW1lbnRfVGV4dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkltYWdlSW1wbCA8ZW0+SW1hZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuSW1hZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEltYWdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIElNQUdFID0gZUlOU1RBTkNFLmdldEltYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJTUFHRV9fVVJJID0gZUlOU1RBTkNFLmdldEltYWdlX1VyaSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWltZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSU1BR0VfX01JTUVfVFlQRSA9IGVJTlNUQU5DRS5nZXRJbWFnZV9NaW1lVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoaWNQcmltaXRpdmVJbXBsIDxlbT5HcmFwaGljIFByaW1pdGl2ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaGljUHJpbWl0aXZlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaGljUHJpbWl0aXZlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdSQVBISUNfUFJJTUlUSVZFID0gZUlOU1RBTkNFLmdldEdyYXBoaWNQcmltaXRpdmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2x5bGluZUltcGwgPGVtPlBvbHlsaW5lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvbHlsaW5lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQb2x5bGluZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQT0xZTElORSA9IGVJTlNUQU5DRS5nZXRQb2x5bGluZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2xvc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUE9MWUxJTkVfX0NMT1NFRCA9IGVJTlNUQU5DRS5nZXRQb2x5bGluZV9DbG9zZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldheXBvaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUE9MWUxJTkVfX1dBWVBPSU5UUyA9IGVJTlNUQU5DRS5nZXRQb2x5bGluZV9XYXlwb2ludHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGxpcHNlSW1wbCA8ZW0+RWxsaXBzZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGxpcHNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFbGxpcHNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVMTElQU0UgPSBlSU5TVEFOQ0UuZ2V0RWxsaXBzZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmFkaXVzIFg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTExJUFNFX19SQURJVVNfWCA9IGVJTlNUQU5DRS5nZXRFbGxpcHNlX1JhZGl1c1goKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJhZGl1cyBZPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUxMSVBTRV9fUkFESVVTX1kgPSBlSU5TVEFOQ0UuZ2V0RWxsaXBzZV9SYWRpdXNZKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVMTElQU0VfX1JPVEFUSU9OID0gZUlOU1RBTkNFLmdldEVsbGlwc2VfUm90YXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IEFuZ2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUxMSVBTRV9fU1RBUlRfQU5HTEUgPSBlSU5TVEFOQ0UuZ2V0RWxsaXBzZV9TdGFydEFuZ2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbmQgQW5nbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTExJUFNFX19FTkRfQU5HTEUgPSBlSU5TVEFOQ0UuZ2V0RWxsaXBzZV9FbmRBbmdsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2VudGVyPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUxMSVBTRV9fQ0VOVEVSID0gZUlOU1RBTkNFLmdldEVsbGlwc2VfQ2VudGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGUgPGVtPldvcmsgT3JkZXIgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtPcmRlclR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBXT1JLX09SREVSX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0V29ya09yZGVyVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFZBUklBQklMSVRZX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5EYXRlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS51dGlsLkRhdGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGF0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBEQVRFID0gZUlOU1RBTkNFLmdldERhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlVyaTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubmV0LlVSSQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRVcmkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgVVJJID0gZUlOU1RBTkNFLmdldFVyaSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+U3RyaW5nPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTdHJpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgU1RSSU5HID0gZUlOU1RBTkNFLmdldFN0cmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+Qm9vbGVhbjwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5Cb29sZWFuCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEJvb2xlYW4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgQk9PTEVBTiA9IGVJTlNUQU5DRS5nZXRCb29sZWFuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5TZXQ8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLnV0aWwuU2V0Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNldCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBTRVQgPSBlSU5TVEFOQ0UuZ2V0U2V0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5TZXF1ZW5jZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEudXRpbC5MaXN0Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNlcXVlbmNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFNFUVVFTkNFID0gZUlOU1RBTkNFLmdldFNlcXVlbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5JbnRlZ2VyPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEludGVnZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgSU5URUdFUiA9IGVJTlNUQU5DRS5nZXRJbnRlZ2VyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5Eb3VibGU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuRG91YmxlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERvdWJsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBET1VCTEUgPSBlSU5TVEFOQ0UuZ2V0RG91YmxlKCk7Ci0KLQl9Ci0KLX0gLy9VbWFQYWNrYWdlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9WYXJpYWJpbGl0eUVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVmFyaWFiaWxpdHlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMmI2N2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9WYXJpYWJpbGl0eUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlZhcmlhYmlsaXR5IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGNsYXNzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudCB0aGF0IHByb3ZpZGVzIG5ldyBjYXBhYmlsaXRpZXMgZm9yIGNvbnRlbnQgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gQ29udGVudCBFbGVtZW50cyBvciBhbnkgb3RoZXIgTWV0aG9kIEVsZW1lbnQgdGhhdCBkZXJpdmVzIGZyb20gaXQuICBJdCBoYXMgYmVlbiBwbGFjZWQgaW4tYmV0d2VlbiB0aGUgY2xhc3NlcyBNZXRob2QgRWxlbWVudCBhbmQgQ29udGVudCBFbGVtZW50IGluIHRoZSBvdmVyYWxsIFVNQSB0YXhvbm9teSBvZiBjbGFzc2VzIHVzaW5nIHRoZSBVTUwgMi4wIHBhY2thZ2UgbWVyZ2UgbWVjaGFuaXNtLiAgVGhlIGFzc29jaWF0aW9uIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHNoYWxsIG9ubHkgYmUgaW5zdGFudGlhdGVkIGJldHdlZW4gdHdvIHN1YmNsYXNzZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgc2FtZSB0eXBlLiAgVGhlIGVsZW1lbnQgb24gdmFyYWliaWxpdHlTcGVjaWFsRWxlbWVudCBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgZGVmaW5lcyBhIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZSBkZWZpbmluZyB0aGUgbmF0dXJlIG9mIHRoZSByZWxhdGlvbnNoaXAgdXNpbmcgYSBsaXRlcmFsIGZyb20gdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuCi0gKiBWYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBtZXRhLW1vZGVsIHBhY2thZ2UgTWV0aG9kIFBsdWdpbnMgYWRkcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIE1ldGhvZCBFbGVtZW50cyB0aGF0IGRlcml2ZSBmcm9tIGl0LiAgQnkgZGVmYXVsdCBhbGwgQ29udGVudCBFbGVtZW50cyBzdWNoIGFzIFJvbGUsIFRhc2ssIEd1aWRhbmNlIFR5cGVzLCBvciBBY3Rpdml0aWVzIGFyZSBkZWZpbmVkIHRvIGJlIFZhcmlhYmlsaXR5IEVsZW1lbnRzLgotICogVmFyaWFiaWxpdHkgYW5kIGV4dGVuc2lvbiBwcm92aWRlcyB1bmlxdWUgbWVjaGFuaXNtcyBmb3IgY3VzdG9taXppbmcgbWV0aG9kIGNvbnRlbnQgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQsIGJ1dCBieSBqdXN0IGJlIGFibGUgdG8gZGVzY3JpYmUgd2l0aCBzZXBhcmF0ZSBvYmplY3RzIHRoZSBkaWZmZXJlbmNlcyAoYWRkaXRpb25zLCBjaGFuZ2VzLCBvbWlzc2lvbnMpIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbC4gIFRoaXMgcGx1Zy1pbiBjb25jZXB0IGFsbG93cyB1c2VycyB0byBmYWN0b3IgdGhlaXIgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBpbnRlcnJlbGF0ZWQgdW5pdHMgYW5kIGV2ZW4gdG8gYXJjaGl0ZWN0IG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gbGF5ZXJzIHRoYXQgZXh0ZW5kIGVhY2ggb3RoZXIgd2l0aCBuZXcgY2FwYWJpbGl0aWVzLiAgVGhlIHJlc3VsdGluZyBtZXRob2QgYW5kIHByb2Nlc3MgZGVzaWduIGNhbiBiZSBkeW5hbWljYWxseSBjb21iaW5lZCBhbmQgYXBwbGllZCBvbiBkZW1hbmQgdXNpbmcgdGhlIGludGVycHJldGF0aW9uIHJ1bGVzIGRlZmluZWQgZm9yIFZhcmlhYmlsaXR5IEVsZW1lbnQgU3BlY2lhbGl6YXRpb25zIGFzc2VtYmxpbmcgdG8gcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRoZSBtb3N0IGFjY3VyYXRlIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNjcmlwdGlvbnMgcG9zc2libGUuICBJdCBhbHNvIGFsbG93cyBwcm9jZXNzIHByYWN0aXRpb25lcnMgdG8gZXh0ZW5kcyBhbmQgdGFpbG9yIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgdGhleSBkbyBub3Qgb3duIGFuZCB0byBlYXNpbHkgdXBncmFkZSB0byBuZXdlciB2ZXJzaW9ucyBieSBzaW1wbHkgcmVhcHBseSB0aGVpciBwZXJzb25hbCBjaGFuZ2VzIHRvIHRoZXNlIHVwZ3JhZGVzLgotICogVmFyaWFiaWxpdHkgRWxlbWVudCBkZWZpbmVzIHR3byB0eXBlcyBvZiB2YXJpYWJpbGl0eSBhbmQgb25lIHR5cGUgb2YgZXh0ZW5zaW9uIHdoaWNoIGFyZSBmb3JtYWxseSBkZWZpbmVkIGZvciB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50I2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFZhcmlhYmlsaXR5RWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmFyaWFiaWxpdHlFbGVtZW50IGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJuYSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIElmIGluIGluc3RhbmNlIG9mIHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxpemF0aW9uIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIFZhcmlhYmlsaXR5IEVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUgZXhpc3RzLCB0aGVuIHRoZSB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHNwZWNpZmllcyBob3cgdGhlIGVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbEVsZW1lbnQgZW5kIG9mIHRoZSBhc3NvY2lhdGlvbiBjaGFuZ2VzIHRoZSBDb250ZW50IEVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgZW5kLiBTZWUgdGhlIFZhcmlhYmlsaXR5IFR5cGUgZW51bWVyYXRpb24gY2xhc3MgZm9yIGRlZmluaXRpb25zIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHZhcmlhYmlsaXR5LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0ibmEiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChWYXJpYWJpbGl0eUVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVZhcmlhYmlsaXR5RWxlbWVudCBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCB2YWx1ZSk7Ci0KLX0gLy8gVmFyaWFiaWxpdHlFbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1ZhcmlhYmlsaXR5VHlwZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9WYXJpYWJpbGl0eVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJmMDdlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1ZhcmlhYmlsaXR5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFZhcmlhYmlsaXR5IFR5cGUgaXMgYW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBWYXJpYWJpbGl0eVR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OYTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOQV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCU5BKDAsICJuYSIsICJuYSIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnRyaWJ1dGVzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlRSSUJVVEVTX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JQ09OVFJJQlVURVMoMSwgImNvbnRyaWJ1dGVzIiwgImNvbnRyaWJ1dGVzIiksCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RXh0ZW5kczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWFRFTkRTX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JRVhURU5EUygyLCAiZXh0ZW5kcyIsICJleHRlbmRzIiksCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UmVwbGFjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVQTEFDRVNfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlSRVBMQUNFUygzLCAicmVwbGFjZXMiLCAicmVwbGFjZXMiKSwKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Mb2NhbCBDb250cmlidXRpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfQ09OVFJJQlVUSU9OX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JTE9DQUxfQ09OVFJJQlVUSU9OKDQsICJsb2NhbENvbnRyaWJ1dGlvbiIsICJsb2NhbENvbnRyaWJ1dGlvbiIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsIFJlcGxhY2VtZW50PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMX1JFUExBQ0VNRU5UX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JTE9DQUxfUkVQTEFDRU1FTlQoNSwgImxvY2FsUmVwbGFjZW1lbnQiLCAibG9jYWxSZXBsYWNlbWVudCIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkV4dGVuZHMgUmVwbGFjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVhURU5EU19SRVBMQUNFU19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUVYVEVORFNfUkVQTEFDRVMoNiwgImV4dGVuZHNSZXBsYWNlcyIsICJleHRlbmRzUmVwbGFjZXMiKTsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OYTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgIm5vdCBhc3NpZ25lZCIgdmFsdWUgb2YgYSBWYXJpYWJpbGxpdHkgRWxlbWVudCdzIHZhcmlhYmlsaXR5VHlwZSBhdHRyaWJ1dGUgd2hpY2ggaXMgc2V0IGluIHRoZSBjYXNlIG5vIHZhcmlhYmlsaXR5IGFzc29jaWF0aW9uIGlzIHByZXNlbnQgYmV0d2VlbiB0aGUgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgb3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudHMuCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI05BCi0JICogQG1vZGVsIG5hbWU9Im5hIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnRyaWJ1dGVzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQ29udHJpYnV0ZXMgcHJvdmlkZXMgYSB3YXkgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50cyB0byBjb250cmlidXRlIHRoZWlyIHByb3BlcnRpZXMgaW50byB0aGVpciBiYXNlIFZhcmlhYmlsaXR5IEVsZW1lbnQgd2l0aG91dCBkaXJlY3RseSBhbHRlcmluZyBhbnkgb2YgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMsIGkuZS4gaW4gYW4gYWRkaXRpdmUgZmFzaGlvbi4gIFByb3BlcnRpZXMgY29udHJpYnV0ZWQgYXJlOiBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuICBUaGUgZWZmZWN0IGFmdGVyIGludGVycHJldGF0aW9uIG9mIGNvbnRyaWJ1dGlvbiBpcyB0aGF0IHRoZSBiYXNlIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgbG9naWNhbGx5IHJlcGxhY2VkIHdpdGggYW4gYXVnbWVudGVkIHZhcmlhbnQgb2YgdGhlIGVsZW1lbnQgdGhhdCBjb21iaW5lcyBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuICBUaGUgd2F5IHRoaXMgY29tYmluYXRpb24gaXMgcmVhbGl6ZWQgZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlIG9yIGFzc29jaWF0aW9uLiAgRm9yIGV4YW1wbGUsIFN0cmluZyBhdHRyaWJ1dGVzIGFyZSBjb25jYXRlbmF0ZWQgcmVzb2x2aW5nIGVtYmVkZGVkIGNvbW1hbmRzIGZvciBkZXBlbmRlbnQgdGV4dCBvciBtZXJnaW5nIHRleHQgZnJhZ21lbnRzIChlLmcuIGRlc2NyaXB0aW9ucyBmb3IgY29udGVudCBlbGVtZW50cykuICBBZGRpdGlvbmFsIGVsZW1lbnRzIGluIHRvLW1hbnkgYXNzb2NpYXRpb25zIGFyZSBhZGRlZCAoZS5nLiBhZGRpdGlvbmFsIEd1aWRhbmNlIGVsZW1lbnRzIG9yIFRhc2sgRGVzY3JpcHRvcnMgb2YgYW4gQWN0aXZpdHkpLiAgRGlmZmVyZW50IGVsZW1lbnRzIGluIHRvLW9uZSBhc3NvY2lhdGlvbnMgYXJlIGlnbm9yZWQgKGUuZy4gdGhlIG9uZSBQcmltYXJ5IFBlcmZvcm1lciBvZiBhIFRhc2spLiAgTXVsdGlwbGUgQ29udGVudCBFbGVtZW50cyBjYW4gY29udHJpYnV0ZSB0byB0aGUgc2FtZSBiYXNlIGVsZW1lbnQgYW5kIGFsbCBvZiB0aGVzZSBjb250cmlidXRpb25zIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIHRoZSBiYXNlIGluIHRoZSBzYW1lIGZhc2hpb24uIFRoZSBmb2xsb3dpbmcgdGFibGUgcHJvdmlkZXMgdGhlIGRldGFpbGVkIGxpc3Qgb2YgaW50ZXJwcmV0YXRpb24gcnVsZXM6Ci0JICogYXR0cmlidXRlIHZhbHVlczoJU3RyaW5nIHZhbHVlcyBmcm9tIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIGNvbmNhdGVuYXRlZCB3aXRoIHZhbHVlcyBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LiAgT3RoZXIgdmFsdWVzIGZyb20gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBvZiBhbnkgb3RoZXIgdHlwZSBzdWNoIGFzIEludGVnZXIsIERhdGUgYXJlIGlnbm9yZWQuCi0JICogVGhlIGlkZW50aWZ5aW5nIGF0dHJpYnV0ZXMgZ3VpZCBhbmQgbmFtZSBvZiBNZXRob2QgRWxlbWVudCBhcmUgZXhlbXB0IGZyb20gdGhpcyBydWxlIGFuZCB3aWxsIG5vdCBiZSBtb2RpZmllZC4KLQkgKiAwLi4xLWFzc29jaWF0aW9uIGluc3RhbmNlczoJVGhlIG9uZSBhc3NvY2lhdGlvbiBpbnN0YW5jZSBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBrZXB0IGFuZCBhbnkgYXNzb2NpYXRpb24gZnJvbSB0aGUgY29udHJpYnV0aW5nIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBpZ25vcmVkLgotCSAqIDAuLm4tYXNzb2NpYXRpb24gaW5zdGFuY2VzOglBc3NvY2lhdGlvbiBpbnN0YW5jZXMgb2YgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgYWRkZWQgdG8gdGhlIGFscmVhZHkgZXhpc3RpbmcgYXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBiYXNlZC1vbiBlbGVtZW50LiAgSWYgYm90aCBWYXJpYWJpbGl0eSBFbGVtZW50cyByZWZlciB0byB0aGUgc2FtZSBvYmplY3QgdGhlbiBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgYXNzb2NpYXRpb24gd2lsbCByZW1haW4uCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI0NPTlRSSUJVVEVTCi0JICogQG1vZGVsIG5hbWU9ImNvbnRyaWJ1dGVzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRSSUJVVEVTX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkV4dGVuZHM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFeHRlbnNpb24gYWxsb3dzIE1ldGhvZCBQbHVnaW5zIHRvIGVhc2lseSByZXVzZSBlbGVtZW50cyBmcm9tIGEgQmFzZSBQbHVnaW4gYnkgcHJvdmlkaW5nIGEga2luZCBvZiBpbmhlcml0YW5jZSBmb3IgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIEF0dHJpYnV0ZSB2YWx1ZXMgYW5kIEFzc29jaWF0aW9uIGluc3RhbmNlcyBhcmUgaW5oZXJpdGVkIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgdG8gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIFRoZSByZXN1bHQgb2YgaW50ZXJwcmV0YXRpb24gaXMgdGhhdCB0aGUgc3BlY2lhbCBlbGVtZW50IGhhcyB0aGUgc2FtZSBwcm9wZXJ0aWVzIGFzIHRoZSBiYXNlZC1vbiBoYXMsIGJ1dCBtaWdodCBkZWZpbmUgaXRzIG93biBhZGRpdGlvbnMuICBIZW5jZSBleHRlbmRzIGlzIG5vdCB1c2VkIHRvIG1vZGlmeSBjb250ZW50IG9mIHRoZSBiYXNlIFBsdWdpbiwgYnV0IHRvIHByb3ZpZGUgdGhlIGFiaWxpdHkgZm9yIHRoZSBleHRlbmRpbmcgUGx1Z2luIHRvIGRlZmluZSBpdHMgb3duIGNvbnRlbnQgd2hpY2ggaXMgYSB2YXJpYW50IG9mIGNvbnRlbnQgYWxyZWFkeSBkZWZpbmVkIChlLmcuIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIGEgZ2VuZXJpYyBSZXZpZXcgUmVjb3JkIGZvciBhIHNwZWNpZmljIHR5cGUgb2YgcmV2aWV3KS4gIFRoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IHRoZSBiYXNlIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIGFueSBudW1iZXIgb2YgZXh0ZW5kaW5nIFZhcmlhYmlsaXR5IEVsZW1lbnRzIGNhbiBiZSB1c2VkIHNpZGUgYnkgc2lkZSwgYnV0IHJlZmVyIHRvIGVhY2ggb3RoZXIgdmlhIHRoZSBleHRlbmRzIHJlbGF0aW9uc2hpcC4gIEV4dGVuZHMgYWxzbyBwcm92aWRlcyB0aGUga2V5IG1lY2hhbmlzbSBmb3IgYmluZGluZyBDYXBhYmlsaXR5IFBhdHRlcm5zIHRvIFByb2Nlc3NlczogQSBwYXR0ZXJuIGlzIGFwcGxpZWQgYnkgZGVmaW5pbmcgYW4gZXh0ZW5kcyByZWxhdGlvbnNoaXBzIGZyb20gYW4gQWN0aXZpdHkgb2YgdGhlIGFwcGx5aW5nIFByb2Nlc3NlcyB0byB0aGUgUGF0dGVybi4gIFRoZSBBY3Rpdml0eSBpbmhlcml0cyBhc3NvY2lhdGlvbnMgaW5zdGFuY2VzIGZyb20gdGhlIHBhdHRlcm4gYW5kIHRoZSBwYXR0ZXJuIGFwcGVhcnMgdG8gYmUgcGFydCBvZiB0aGUgcmVzdWx0aW5nIFByb2Nlc3MgYWZ0ZXIgSW50ZXJwcmV0YXRpb24uCi0JICogYXR0cmlidXRlIHZhbHVlczoJVmFsdWVzIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IGVsZW1lbnQgYXJlIGluaGVyaXRlZCBhbmQgdXNlZCB0byBwb3B1bGF0ZSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50cyBhdHRyaWJ1dGVzLiAgSWYgdGhlIHNwZWNpYWwgZWxlbWVudCBhdHRyaWJ1dGVzIGFyZSBhbHJlYWR5IHBvcHVsYXRlZCB0aGUgaW5oZXJpdGVkIHZhbHVlcyBhcmUgaWdub3JlZC4gIAotCSAqIFRoZSBpZGVudGlmeWluZyBhdHRyaWJ1dGVzIGd1aWQgYW5kIG5hbWUgb2YgTWV0aG9kIEVsZW1lbnQgYXJlIGV4ZW1wdCBmcm9tIHRoaXMgcnVsZSBhbmQgd2lsbCBub3QgYmUgbW9kaWZpZWQuCi0JICogMC4uMS1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CVRoZSBvbmUgYXNzb2NpYXRpb24gaW5zdGFuY2Ugb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgaW5oZXJpdGVkIHRvIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBJZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGRlZmluZXMgaXRzIG93biBhc3NvY2lhdGlvbiBpbnN0YW5jZSB0aGVuIHRoZSBpbmhlcml0ZWQgb25lIGlzIGlnbm9yZWQuCi0JICogMC4ubi1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CUFzc29jaWF0aW9uIGluc3RhbmNlcyBkZWZpbmVkIGZvciB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgaW5oZXJpdGVkIHRvIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBUaGUgc3BlY2lhbCBlbGVtZW50IGNhbiBhZGQgYWRkaXRpb25hbCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuCi0JICogCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI0VYVEVORFMKLQkgKiBAbW9kZWwgbmFtZT0iZXh0ZW5kcyIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFRFTkRTX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJlcGxhY2VzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUmVwbGFjZXMgcHJvdmlkZXMgYSB3YXkgZm9yIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHRvIHJlcGxhY2UgYSBiYXNlIFZhcmlhYmlsaXR5IEVsZW1lbnQgd2l0aG91dCBkaXJlY3RseSBjaGFuZ2luZyBhbnkgb2YgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMuICBUaGlzIGlzIGluIG1vc3QgY2FzZXMgdXNlZCBmb3IgTWV0aG9kIFBsdWdpbnMgdGhhdCBhaW0gdG8gcmVwbGFjZSBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2ssIG9yIEFjdGl2aXRpZXMgd2l0aCBlaXRoZXIgYSBjb21wbGV0ZSBuZXcgdmFyaWFudCBvciB0byBjaGFuZ2UgZnVuZGFtZW50YWwgcmVsYXRpb25zaGlwcyBvZiB0aGVzZSBlbGVtZW50cyAoZS5nLiBSb2xlLUFydGlmYWN0IHJlc3BvbnNpYmlsaXR5KS4gIFByb3BlcnRpZXMgcmVwbGFjZWQgYXJlIGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uIGluc3RhbmNlcy4gIFRoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IHRoZSBiYXNlIENvbnRlbnQgRWxlbWVudCBpcyBsb2dpY2FsbHkgcmVwbGFjZWQgd2l0aCB0aGlzIG5ldyB2YXJpYW50IG9mIHRoZSBlbGVtZW50IHRvIHdoaWNoIGFsbCBpbmNvbWluZyBhc3NvY2lhdGlvbnMgc3RpbGwgcG9pbnQgYXMgYmVmb3JlLCBidXQgd2hpY2ggaGFzIHBvdGVudGlhbGx5IG5ldyBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBvdXRnb2luZyBhc3NvY2lhdGlvbiBwcm9wZXJ0aWVzLiAgVGhpcyBwcm92aWRlcyBhIHZlcnkgcG93ZXJmdWwgbWVjaGFuaXNtIHRvIHJlcGxhY2UsIGZvciBleGFtcGxlLCB3aG9sZSBBY3Rpdml0aWVzIGluIGEgUHJvY2VzcyB3aXRoIGNvbXBsZXRlIG5ldyByZWFsaXphdGlvbnMgb2YgdGhlIEFjdGl2aXR5LiAgRm9yIGluc3RhbmNlLCByZXBsYWNpbmcgYW4gQWN0aXZpdHkgZG9pbmcgdXNlIGNhc2UtYmFzZWQgZGVzaWduIHdpdGggYW4gYWN0aXZpdHkgZG9pbmcgYWdpbGUgY29kZS1jZW50cmljIGRldmVsb3BtZW50IGRvaW5nIHRoZSBzYW1lIHdvcmsgdXNpbmcgYSBkaWZmZXJlbnQgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIHV0aWxpemluZyBkaWZmZXJlbnQgUm9sZXMsIFRhc2tzLCBldGMuICBBbm90aGVyIGV4YW1wbGUsIHdvdWxkIGJlIHRvIHJlcGxhY2UgYW4gQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgZGF0YWJhc2UgZGVzaWduIGZvciBhbiBSREJNUyB3aXRoIGFuIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGRhdGFiYXNlIGRlc2lnbiBmb3IgYW4gT09EQk1TLiAgQSBWYXJpYWJpbGl0eSBFbGVtZW50IGNhbiBvbmx5IGJlIHJlcGxhY2VkIGJ5IG9uZSBvdGhlciBlbGVtZW50IGF0IGEgdGltZS4gIEZvciBleGFtcGxlLCBpZiB0d28gTWV0aG9kIFBsdWdpbnMgcmVwbGFjZSB0aGUgc2FtZSBlbGVtZW50IG9ubHkgb25lIE1ldGhvZCBQbHVnaW4gY2FuIGJlIHVzZWQgZm9yIGludGVycHJldGF0aW9uIChzZWUgY29uY2VwdCBvZiBNZXRob2QgQ29uZmlndXJhdGlvbiBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byByZXNvbHZlIHN1Y2ggY29uZmxpY3RzLCBTZWN0aW9uIDcuMS4yKS4gIFRoZSBmb2xsb3dpbmcgdGFibGUgcHJvdmlkZXMgdGhlIGRldGFpbGVkIGxpc3Qgb2YgaW50ZXJwcmV0YXRpb24gcnVsZXM6Ci0JICogYXR0cmlidXRlIHZhbHVlczoJVmFsdWVzIGZyb20gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgcmVwbGFjZWQgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBpbmNsdWRpbmcgdW5hc3NpZ25lZCB2YWx1ZXMuCi0JICogVGhlIGlkZW50aWZ5aW5nIGF0dHJpYnV0ZXMgZ3VpZCBhbmQgbmFtZSBvZiBNZXRob2QgRWxlbWVudCBhcmUgZXhlbXB0IGZyb20gdGhpcyBydWxlIGFuZCB3aWxsIG5vdCBiZSBtb2RpZmllZC4KLQkgKiAwLi4xLWFzc29jaWF0aW9uIGluc3RhbmNlczoJVGhlIG9uZSBhc3NvY2lhdGlvbiBpbnN0YW5jZSBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBpcyByZXBsYWNlZCB3aXRoIHRoZSBhc3NvY2lhdGlvbiBpbnN0YW5jZSBmcm9tIHRoZSByZXBsYWNpbmcgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgSWYgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0aW9uIGluc3RhbmNlIHRoZW4gcmVzdWx0aW5nIGVsZW1lbnQgd2lsbCBhbHNvIG5vdCBoYXZlIGFuIGFzc29jaWF0aW9uLgotCSAqIDAuLm4tYXNzb2NpYXRpb24gaW5zdGFuY2VzOglBc3NvY2lhdGlvbiBpbnN0YW5jZXMgb2YgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCByZXBsYWNlIGFsbCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQuCi0JICogCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI1JFUExBQ0VTCi0JICogQG1vZGVsIG5hbWU9InJlcGxhY2VzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUExBQ0VTX1ZBTFVFID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsIENvbnRyaWJ1dGlvbjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TG9jYWwgQ29udHJpYnV0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMX0NPTlRSSUJVVElPTgotCSAqIEBtb2RlbCBuYW1lPSJsb2NhbENvbnRyaWJ1dGlvbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTF9DT05UUklCVVRJT05fVkFMVUUgPSA0OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWwgUmVwbGFjZW1lbnQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkxvY2FsIFJlcGxhY2VtZW50PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMX1JFUExBQ0VNRU5UCi0JICogQG1vZGVsIG5hbWU9ImxvY2FsUmVwbGFjZW1lbnQiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxfUkVQTEFDRU1FTlRfVkFMVUUgPSA1OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RXh0ZW5kcyBSZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RXh0ZW5kcyBSZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWFRFTkRTX1JFUExBQ0VTCi0JICogQG1vZGVsIG5hbWU9ImV4dGVuZHNSZXBsYWNlcyIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFRFTkRTX1JFUExBQ0VTX1ZBTFVFID0gNjsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGVbXSBWQUxVRVNfQVJSQVkgPSBuZXcgVmFyaWFiaWxpdHlUeXBlW10gewotCQkJTkEsIENPTlRSSUJVVEVTLCBFWFRFTkRTLCBSRVBMQUNFUywgTE9DQUxfQ09OVFJJQlVUSU9OLAotCQkJTE9DQUxfUkVQTEFDRU1FTlQsIEVYVEVORFNfUkVQTEFDRVMsIH07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFZhcmlhYmlsaXR5VHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMKLQkJCS51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFyaWFiaWxpdHlUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJVmFyaWFiaWxpdHlUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFyaWFiaWxpdHlUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQljYXNlIE5BX1ZBTFVFOgotCQkJcmV0dXJuIE5BOwotCQljYXNlIENPTlRSSUJVVEVTX1ZBTFVFOgotCQkJcmV0dXJuIENPTlRSSUJVVEVTOwotCQljYXNlIEVYVEVORFNfVkFMVUU6Ci0JCQlyZXR1cm4gRVhURU5EUzsKLQkJY2FzZSBSRVBMQUNFU19WQUxVRToKLQkJCXJldHVybiBSRVBMQUNFUzsKLQkJY2FzZSBMT0NBTF9DT05UUklCVVRJT05fVkFMVUU6Ci0JCQlyZXR1cm4gTE9DQUxfQ09OVFJJQlVUSU9OOwotCQljYXNlIExPQ0FMX1JFUExBQ0VNRU5UX1ZBTFVFOgotCQkJcmV0dXJuIExPQ0FMX1JFUExBQ0VNRU5UOwotCQljYXNlIEVYVEVORFNfUkVQTEFDRVNfVkFMVUU6Ci0JCQlyZXR1cm4gRVhURU5EU19SRVBMQUNFUzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmFyaWFiaWxpdHlUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7Ci0JCXJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9XaGl0ZXBhcGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1doaXRlcGFwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFlNmQyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1doaXRlcGFwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBXaGl0ZXBhcGVycyBhcmUgYSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V2hpdGVwYXBlcigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXaGl0ZXBhcGVyIGV4dGVuZHMgQ29uY2VwdCB7Ci19IC8vIFdoaXRlcGFwZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya0JyZWFrZG93bkVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya0JyZWFrZG93bkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM0ZTFiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtCcmVha2Rvd25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGlzIGEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHByb3ZpZGVzIHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlcHJlc2VudCBvciByZWZlciB0byBXb3JrIERlZmluaXRpb25zLiAgRm9yIGV4YW1wbGUgaXRzIHN1YmNsYXNzIEFjdGl2aXR5IGRlZmluZXMgd29yayBhcyBpdCBpcyBhbHNvIGEgc3ViY2xhc3Mgb2YgV29yayBEZWZpbml0aW9uLiAgSXRzIHN1YmNsYXNzIFRhc2sgRGVzY3JpcHRvciBkb2VzIG5vdCBkZWZpbmUgd29yayBieSBpdHNlbGYsIGJ1dCByZWZlcnMgdG8gYSBXb3JrIERlZmluaXRpb24gYW5kIHRoZXJlZm9yZSBjYW4gaGF2ZSB0aGUgc2FtZSBjb21tb24gcHJvcGVydGllcyBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCBoYXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0SXNPbmdvaW5nIDxlbT5JcyBPbmdvaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzRXZlbnREcml2ZW4gPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRMaW5rVG9QcmVkZWNlc3NvciA8ZW0+TGluayBUbyBQcmVkZWNlc3NvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrQnJlYWtkb3duRWxlbWVudCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBSZXBlYXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJc1JlcGVhdGFibGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldElzUmVwZWF0YWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIFJlcGVhdGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElzUmVwZWF0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNSZXBlYXRhYmxlKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgdGhlIGlzT25nb2luZyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gaW5zdGFuY2UsIHRoZW4gdGhlIGVsZW1lbnQgZGVzY3JpYmVzIGFuIG9uZ29pbmcgcGllY2Ugb2Ygd29yayB3aXRob3V0IGEgZml4ZWQgZHVyYXRpb24gb3IgZW5kIHN0YXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayBvZiBhbiBhZG1pbmlzdHJhdG9yIGNvbnRpbnVvdXNseSAoZS5nLiAzaCBhIGRheSkgd29ya2luZyB0byBlbnN1cmUgdGhhdCBzeXN0ZW1zIGFyZSBrZXB0IGluIGEgY2VydGFpbiBzdGF0ZS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBwcm9ncmFtIG1hbmFnZW1lbnQgd29yayBvdmVyc2VlaW5nIG1hbnkgZGlmZmVyZW50IHByb2plY3RzIGJlaW5nIHNjaGVkdWxlZCBmb3Igb25lIHBhcnRpY3VsYXIgcHJvamVjdCBhdCBzcGVjaWZpYyByZW9jY3VycmluZyBpbnRlcnZhbHMgZHVyaW5nIHRoZSB3aG9sZSBsaWZlY3ljbGUgb2YgdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIE9uZ29pbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzT25nb2luZyhCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Cb29sZWFuIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0SXNPbmdvaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT25nb2luZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SXNPbmdvaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc09uZ29pbmcoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4KLQkgKiAKLQkgKiAKLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJc0V2ZW50RHJpdmVuKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Cb29sZWFuIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0SXNFdmVudERyaXZlbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc0V2ZW50RHJpdmVuIDxlbT5JcyBFdmVudCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SXNFdmVudERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNFdmVudERyaXZlbihCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MaW5rIFRvIFByZWRlY2Vzc29yPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGluayBUbyBQcmVkZWNlc3NvcjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFdvcmtPcmRlcj4gZ2V0TGlua1RvUHJlZGVjZXNzb3IoKTsKLQotfSAvLyBXb3JrQnJlYWtkb3duRWxlbWVudApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrRGVmaW5pdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTMwOTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgRGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFdvcmsgRGVmaW5pdGlvbiBpcyBhbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLgotICogV29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0RlZmluaXRpb24oKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtEZWZpbml0aW9uIGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmVjb25kaXRpb24oQ29uc3RyYWludCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb25zdHJhaW50IGdldFByZWNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWNvbmRpdGlvbihDb25zdHJhaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtEZWZpbml0aW9uX1Bvc3Rjb25kaXRpb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb25zdHJhaW50IGdldFBvc3Rjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24jZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50IHZhbHVlKTsKLQotfSAvLyBXb3JrRGVmaW5pdGlvbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrT3JkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya09yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZGY0YmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrT3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgT3JkZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBXb3JrIE9yZGVyIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50cyBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnRzIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50cyBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuICAKLSAqIChOb3RlLCBXb3JrIE9yZGVyIGlzIG5vdCBtb2RlbGVkIGFzIGFuIEFzc29jaWF0aW9uIENsYXNzIHRvIHByb3ZpZGUgYSBzdHJhaWdodGZvcndhcmQgbWFwcGluZyAgdG8gWE1JIGFuZCBFTUYuKQotICogVGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW4gcGFydGljdWxhciBjcml0aWNhbCBmb3IgcGxhbm5pbmcgYXBwbGljYXRpb25zLiAgU2VlIG1vcmUgZGV0YWlscyBvbiBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF0IFdvcmsgT3JkZXIgVHlwZS4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyI2dldExpbmtUeXBlIDxlbT5MaW5rIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyI2dldFByZWQgPGVtPlByZWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrT3JkZXIoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya09yZGVyIGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxpbmsgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmaW5pc2hUb1N0YXJ0IjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQHNlZSAjc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrT3JkZXJfTGlua1R5cGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmaW5pc2hUb1N0YXJ0IiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtPcmRlclR5cGUgZ2V0TGlua1R5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyI2dldExpbmtUeXBlIDxlbT5MaW5rIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxpbmsgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGUKLQkgKiBAc2VlICNnZXRMaW5rVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVkPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVkPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByZWQoV29ya0JyZWFrZG93bkVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya09yZGVyX1ByZWQoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtCcmVha2Rvd25FbGVtZW50IGdldFByZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyI2dldFByZWQgPGVtPlByZWQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWQoV29ya0JyZWFrZG93bkVsZW1lbnQgdmFsdWUpOwotCi19IC8vIFdvcmtPcmRlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrT3JkZXJUeXBlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtPcmRlclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhmNTMxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtPcmRlclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFdvcmsgT3JkZXIgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChCKSBiZWxvdykgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChBKSBiZWxvdykgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtPcmRlclR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIFdvcmtPcmRlclR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GaW5pc2ggVG8gU3RhcnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRklOSVNIX1RPX1NUQVJUX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JRklOSVNIX1RPX1NUQVJUKDAsICJmaW5pc2hUb1N0YXJ0IiwgImZpbmlzaFRvU3RhcnQiKSwKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GaW5pc2ggVG8gRmluaXNoPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0ZJTklTSF9UT19GSU5JU0hfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlGSU5JU0hfVE9fRklOSVNIKDEsICJmaW5pc2hUb0ZpbmlzaCIsICJmaW5pc2hUb0ZpbmlzaCIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0YXJ0IFRvIFN0YXJ0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUQVJUX1RPX1NUQVJUX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JU1RBUlRfVE9fU1RBUlQoMiwgInN0YXJ0VG9TdGFydCIsICJzdGFydFRvU3RhcnQiKSwKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGFydCBUbyBGaW5pc2g8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU1RBUlRfVE9fRklOSVNIX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JU1RBUlRfVE9fRklOSVNIKDMsICJzdGFydFRvRmluaXNoIiwgInN0YXJ0VG9GaW5pc2giKTsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GaW5pc2ggVG8gU3RhcnQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBCcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IHN0YXJ0IHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBmaW5pc2hlcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBCcmVha2Rvd24gRWxlbWVudHMsICJDb25zdHJ1Y3QgZmVuY2UiIGFuZCAiUGFpbnQgZmVuY2UsIiAiUGFpbnQgZmVuY2UiIGNhbid0IHN0YXJ0IHVudGlsICJDb25zdHJ1Y3QgZmVuY2UiIGZpbmlzaGVzLiBUaGlzIGlzIHRoZSBtb3N0IGNvbW1vbiB0eXBlIG9mIGRlcGVuZGVuY3kgYW5kIHRoZSBkZWZhdWx0IGZvciBhIG5ldyBXb3JrIE9yZGVyIGluc3RhbmNlLgotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNGSU5JU0hfVE9fU1RBUlQKLQkgKiBAbW9kZWwgbmFtZT0iZmluaXNoVG9TdGFydCIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSU5JU0hfVE9fU1RBUlRfVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RmluaXNoIFRvIEZpbmlzaDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3QgZmluaXNoIHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBmaW5pc2hlcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBCcmVha2Rvd24gRWxlbWVudHMsICJBZGQgd2lyaW5nIiBhbmQgIkluc3BlY3QgZWxlY3RyaWNhbCwiICJJbnNwZWN0IGVsZWN0cmljYWwiIGNhbid0IGZpbmlzaCB1bnRpbCAiQWRkIHdpcmluZyIgZmluaXNoZXMuCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI0ZJTklTSF9UT19GSU5JU0gKLQkgKiBAbW9kZWwgbmFtZT0iZmluaXNoVG9GaW5pc2giCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklOSVNIX1RPX0ZJTklTSF9WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGFydCBUbyBTdGFydDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3Qgc3RhcnQgdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIHN0YXJ0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBCcmVha2Rvd24gRWxlbWVudHMsICJQb3VyIGZvdW5kYXRpb24iIGFuZCAiTGV2ZWwgY29uY3JldGUsIiAiTGV2ZWwgY29uY3JldGUiIGNhbid0IGJlZ2luIHVudGlsICJQb3VyIGZvdW5kYXRpb24iIGJlZ2lucy4KLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjU1RBUlRfVE9fU1RBUlQKLQkgKiBAbW9kZWwgbmFtZT0ic3RhcnRUb1N0YXJ0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1RPX1NUQVJUX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0YXJ0IFRvIEZpbmlzaDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3QgZmluaXNoIHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBzdGFydHMuIFRoaXMgZGVwZW5kZW5jeSB0eXBlIGNhbiBiZSB1c2VkIGZvciBqdXN0LWluLXRpbWUgc2NoZWR1bGluZyB1cCB0byBhIG1pbGVzdG9uZSBvciB0aGUgcHJvamVjdCBmaW5pc2ggZGF0ZSB0byBtaW5pbWl6ZSB0aGUgcmlzayBvZiBhIEJyZWFrZG93biBFbGVtZW50IGZpbmlzaGluZyBsYXRlIGlmIGl0cyBkZXBlbmRlbnQgQnJlYWtkb3duIEVsZW1lbnRzIHNsaXAuIElmIGEgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudCBuZWVkcyB0byBmaW5pc2ggYmVmb3JlIHRoZSBtaWxlc3RvbmUgb3IgcHJvamVjdCBmaW5pc2ggZGF0ZSwgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyIGV4YWN0bHkgd2hlbiBhbmQgeW91IGRvbid0IHdhbnQgYSBsYXRlIGZpbmlzaCB0byBhZmZlY3QgdGhlIGp1c3QtaW4tdGltZSBCcmVha2Rvd24gRWxlbWVudCwgeW91IGNhbiBjcmVhdGUgYW4gU0YgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSBCcmVha2Rvd24gRWxlbWVudCB5b3Ugd2FudCBzY2hlZHVsZWQganVzdCBpbiB0aW1lICh0aGUgcHJlZGVjZXNzb3IpIGFuZCBpdHMgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudCAodGhlIHN1Y2Nlc3NvcikuIFRoZW4gaWYgeW91IHVwZGF0ZSBwcm9ncmVzcyBvbiB0aGUgc3VjY2Vzc29yIEJyZWFrZG93biBFbGVtZW50LCBpdCB3b24ndCBhZmZlY3QgdGhlIHNjaGVkdWxlZCBkYXRlcyBvZiB0aGUgcHJlZGVjZXNzb3IgQnJlYWtkb3duIEVsZW1lbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI1NUQVJUX1RPX0ZJTklTSAotCSAqIEBtb2RlbCBuYW1lPSJzdGFydFRvRmluaXNoIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1RPX0ZJTklTSF9WQUxVRSA9IDM7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBXb3JrT3JkZXJUeXBlW10gVkFMVUVTX0FSUkFZID0gbmV3IFdvcmtPcmRlclR5cGVbXSB7Ci0JCQlGSU5JU0hfVE9fU1RBUlQsIEZJTklTSF9UT19GSU5JU0gsIFNUQVJUX1RPX1NUQVJULCBTVEFSVF9UT19GSU5JU0gsIH07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8V29ya09yZGVyVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMKLQkJCS51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPldvcmsgT3JkZXIgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtPcmRlclR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlXb3JrT3JkZXJUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVdvcmtPcmRlclR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPldvcmsgT3JkZXIgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtPcmRlclR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCWNhc2UgRklOSVNIX1RPX1NUQVJUX1ZBTFVFOgotCQkJcmV0dXJuIEZJTklTSF9UT19TVEFSVDsKLQkJY2FzZSBGSU5JU0hfVE9fRklOSVNIX1ZBTFVFOgotCQkJcmV0dXJuIEZJTklTSF9UT19GSU5JU0g7Ci0JCWNhc2UgU1RBUlRfVE9fU1RBUlRfVkFMVUU6Ci0JCQlyZXR1cm4gU1RBUlRfVE9fU1RBUlQ7Ci0JCWNhc2UgU1RBUlRfVE9fRklOSVNIX1ZBTFVFOgotCQkJcmV0dXJuIFNUQVJUX1RPX0ZJTklTSDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgV29ya09yZGVyVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBsaXRlcmFsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya1Byb2R1Y3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya1Byb2R1Y3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA4OGVlZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBXb3JrIFByb2R1Y3QgaXMgYW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuCi0gKiBBIHdvcmsgcHJvZHVjdCBpcyBhbiBhYnN0cmFjdGlvbiBmb3IgZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IGEgdGFzay4KLSAqIAotICogVGhpcyBpcyB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZSdzIGV4dGVuc2lvbiBvZiBXb3JrIFByb2R1Y3QgKGRlZmluZWQgaW4gQ29udGVudCBFbGVtZW50cykgcHJvdmlkaW5nIGFkZGl0b25hbCBhc3NvY2lhdGlvbnMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCNnZXRSZXBvcnRzIDxlbT5SZXBvcnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldFRlbXBsYXRlcyA8ZW0+VGVtcGxhdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldFRvb2xNZW50b3JzIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3QoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3QgZXh0ZW5kcyBDb250ZW50RWxlbWVudCwgRnVsZmlsbGFibGVFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVwb3J0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcG9ydHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFJlcG9ydD4gZ2V0UmVwb3J0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGVtcGxhdGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZW1wbGF0ZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZW1wbGF0ZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGVzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8VGVtcGxhdGU+IGdldFRlbXBsYXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9ycygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFRvb2xNZW50b3I+IGdldFRvb2xNZW50b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPiBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotfSAvLyBXb3JrUHJvZHVjdApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThiMDRkYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRJbXBhY3RPZk5vdEhhdmluZyA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRSZWFzb25zRm9yTm90TmVlZGluZyA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QdXJwb3NlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQdXJwb3NlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHVycG9zZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW1wYWN0T2ZOb3RIYXZpbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJbXBhY3RPZk5vdEhhdmluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldEltcGFjdE9mTm90SGF2aW5nIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEltcGFjdE9mTm90SGF2aW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbXBhY3RPZk5vdEhhdmluZyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlYXNvbnNGb3JOb3ROZWVkaW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRSZWFzb25zRm9yTm90TmVlZGluZyA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWFzb25zRm9yTm90TmVlZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODllMTFkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUVudHJ5U3RhdGUgPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUV4aXRTdGF0ZSA8ZW0+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0ZWRCeSA8ZW0+SW1wYWN0ZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdHMgPGVtPkltcGFjdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldERlbGl2ZXJhYmxlUGFydHMgPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBleHRlbmRzIERlc2NyaXB0b3IgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gIAotCSAqIEZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4KLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdGl2aXR5RW50cnlTdGF0ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFjdGl2aXR5RW50cnlTdGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RW50cnlTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0aXZpdHlFbnRyeVN0YXRlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3Rpdml0eSBFeGl0IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuCi0JICogRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLgotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3Rpdml0eUV4aXRTdGF0ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RXhpdFN0YXRlIDxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0aXZpdHlFeGl0U3RhdGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0V29ya1Byb2R1Y3QoV29ya1Byb2R1Y3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtQcm9kdWN0IGdldFdvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrUHJvZHVjdChXb3JrUHJvZHVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbXBhY3RlZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RzIDxlbT5JbXBhY3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkltcGFjdGVkIEJ5PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW1wYWN0ZWQgQnk8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0cwotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iaW1wYWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXRJbXBhY3RlZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbXBhY3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3J9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdGVkQnkgPGVtPkltcGFjdGVkIEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkltcGFjdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBhY3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdGVkQnkKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImltcGFjdGVkQnkiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0SW1wYWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVsaXZlcmFibGUgUGFydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXREZWxpdmVyYWJsZVBhcnRzKCk7Ci0KLX0gLy8gV29ya1Byb2R1Y3REZXNjcmlwdG9yCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0VHlwZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwNzJhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFdvcmsgUHJvZHVjdCBUeXBlIGlzIGEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAiQ2xhc3MgRGlhZ3JhbSIsIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAiU3BlY2lmaWNhdGlvbiIsIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZSNnZXRXb3JrUHJvZHVjdHMgPGVtPldvcmsgUHJvZHVjdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdFR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3RUeXBlIGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3RzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3Q+IGdldFdvcmtQcm9kdWN0cygpOwotCi19IC8vIFdvcmtQcm9kdWN0VHlwZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FjdGl2aXR5RGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M0MDdjNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsI2dldEhvd3RvU3RhZmYgPGVtPkhvd3RvIFN0YWZmPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsCi0JCWltcGxlbWVudHMgQWN0aXZpdHlEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVycG9zZSgpIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQVVJQT1NFX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVycG9zZSA9IFBVUlBPU0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWx0ZXJuYXRpdmVzKCkgPGVtPkFsdGVybmF0aXZlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTFRFUk5BVElWRVNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdGVybmF0aXZlcygpIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhbHRlcm5hdGl2ZXMgPSBBTFRFUk5BVElWRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SG93dG9TdGFmZigpIDxlbT5Ib3d0byBTdGFmZjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SG93dG9TdGFmZigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9XVE9fU1RBRkZfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhvd3RvU3RhZmYoKSA8ZW0+SG93dG8gU3RhZmY8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhvd3RvU3RhZmYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaG93dG9TdGFmZiA9IEhPV1RPX1NUQUZGX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1cnBvc2UoKSB7Ci0JCXJldHVybiBwdXJwb3NlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1cnBvc2UoU3RyaW5nIG5ld1B1cnBvc2UpIHsKLQkJU3RyaW5nIG9sZFB1cnBvc2UgPSBwdXJwb3NlOwotCQlwdXJwb3NlID0gbmV3UHVycG9zZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRSwgb2xkUHVycG9zZSwKLQkJCQkJcHVycG9zZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWx0ZXJuYXRpdmVzKCkgewotCQlyZXR1cm4gYWx0ZXJuYXRpdmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgbmV3QWx0ZXJuYXRpdmVzKSB7Ci0JCVN0cmluZyBvbGRBbHRlcm5hdGl2ZXMgPSBhbHRlcm5hdGl2ZXM7Ci0JCWFsdGVybmF0aXZlcyA9IG5ld0FsdGVybmF0aXZlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTLAotCQkJCQlvbGRBbHRlcm5hdGl2ZXMsIGFsdGVybmF0aXZlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG93dG9TdGFmZigpIHsKLQkJcmV0dXJuIGhvd3RvU3RhZmY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG93dG9TdGFmZihTdHJpbmcgbmV3SG93dG9TdGFmZikgewotCQlTdHJpbmcgb2xkSG93dG9TdGFmZiA9IGhvd3RvU3RhZmY7Ci0JCWhvd3RvU3RhZmYgPSBuZXdIb3d0b1N0YWZmOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRiwKLQkJCQkJb2xkSG93dG9TdGFmZiwgaG93dG9TdGFmZikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJcmV0dXJuIGdldFB1cnBvc2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQlyZXR1cm4gZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XVE9fU1RBRkY6Ci0JCQlyZXR1cm4gZ2V0SG93dG9TdGFmZigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXNldFB1cnBvc2UoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCXNldEFsdGVybmF0aXZlcygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XVE9fU1RBRkY6Ci0JCQlzZXRIb3d0b1N0YWZmKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXNldFB1cnBvc2UoUFVSUE9TRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJc2V0QWx0ZXJuYXRpdmVzKEFMVEVSTkFUSVZFU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XVE9fU1RBRkY6Ci0JCQlzZXRIb3d0b1N0YWZmKEhPV1RPX1NUQUZGX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlyZXR1cm4gUFVSUE9TRV9FREVGQVVMVCA9PSBudWxsID8gcHVycG9zZSAhPSBudWxsCi0JCQkJCTogIVBVUlBPU0VfRURFRkFVTFQuZXF1YWxzKHB1cnBvc2UpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCXJldHVybiBBTFRFUk5BVElWRVNfRURFRkFVTFQgPT0gbnVsbCA/IGFsdGVybmF0aXZlcyAhPSBudWxsCi0JCQkJCTogIUFMVEVSTkFUSVZFU19FREVGQVVMVC5lcXVhbHMoYWx0ZXJuYXRpdmVzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRjoKLQkJCXJldHVybiBIT1dUT19TVEFGRl9FREVGQVVMVCA9PSBudWxsID8gaG93dG9TdGFmZiAhPSBudWxsCi0JCQkJCTogIUhPV1RPX1NUQUZGX0VERUZBVUxULmVxdWFscyhob3d0b1N0YWZmKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwdXJwb3NlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHB1cnBvc2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFsdGVybmF0aXZlczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhbHRlcm5hdGl2ZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGhvd3RvU3RhZmY6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaG93dG9TdGFmZik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FjdGl2aXR5RGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQWN0aXZpdHlJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQWN0aXZpdHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNTgyOGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FjdGl2aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZpdHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0RnVsZmlsbHMgPGVtPkZ1bGZpbGxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0QnJlYWtkb3duRWxlbWVudHMgPGVtPkJyZWFrZG93biBFbGVtZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRSb2FkbWFwcyA8ZW0+Um9hZG1hcHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUltcGwgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudEltcGwgaW1wbGVtZW50cyBBY3Rpdml0eSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGdWxmaWxscygpIDxlbT5GdWxmaWxsczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGdWxmaWxscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gZnVsZmlsbHM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGUgVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCA9IFZhcmlhYmlsaXR5VHlwZS5OQTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5VHlwZSgpIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhcmlhYmlsaXR5RWxlbWVudCB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY29uZGl0aW9uKCkgPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29uc3RyYWludCBwcmVjb25kaXRpb247Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Y29uZGl0aW9uKCkgPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJhaW50IHBvc3Rjb25kaXRpb247Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmVha2Rvd25FbGVtZW50cygpIDxlbT5CcmVha2Rvd24gRWxlbWVudHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxCcmVha2Rvd25FbGVtZW50PiBicmVha2Rvd25FbGVtZW50czsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvYWRtYXBzKCkgPGVtPlJvYWRtYXBzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvYWRtYXBzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Um9hZG1hcD4gcm9hZG1hcHM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IGdldEZ1bGZpbGxzKCkgewotCQlpZiAoZnVsZmlsbHMgPT0gbnVsbCkgewotCQkJZnVsZmlsbHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4oCi0JCQkJCUZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fRlVMRklMTFMpOwotCQl9Ci0JCXJldHVybiBmdWxmaWxsczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIG5ld1ZhcmlhYmlsaXR5VHlwZSkgewotCQlWYXJpYWJpbGl0eVR5cGUgb2xkVmFyaWFiaWxpdHlUeXBlID0gdmFyaWFiaWxpdHlUeXBlOwotCQl2YXJpYWJpbGl0eVR5cGUgPSBuZXdWYXJpYWJpbGl0eVR5cGUgPT0gbnVsbCA/IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQKLQkJCQk6IG5ld1ZhcmlhYmlsaXR5VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRSwgb2xkVmFyaWFiaWxpdHlUeXBlLAotCQkJCQl2YXJpYWJpbGl0eVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlFbGVtZW50IGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCWlmICh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG51bGwKLQkJCQkmJiAoKEVPYmplY3QpIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gKEludGVybmFsRU9iamVjdCkgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJCXZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlUmVzb2x2ZVByb3h5KG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpOwotCQkJaWYgKHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgIT0gb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwKLQkJCQkJCQlvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50LAotCQkJCQkJCXZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlFbGVtZW50IGJhc2ljR2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBuZXdWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSB7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQsCi0JCQkJCW9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQsIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBnZXRQcmVjb25kaXRpb24oKSB7Ci0JCWlmIChwcmVjb25kaXRpb24gIT0gbnVsbCAmJiAoKEVPYmplY3QpIHByZWNvbmRpdGlvbikuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFByZWNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbjsKLQkJCXByZWNvbmRpdGlvbiA9IChDb25zdHJhaW50KSBlUmVzb2x2ZVByb3h5KG9sZFByZWNvbmRpdGlvbik7Ci0JCQlpZiAocHJlY29uZGl0aW9uICE9IG9sZFByZWNvbmRpdGlvbikgewotCQkJCUludGVybmFsRU9iamVjdCBuZXdQcmVjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb247Ci0JCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFByZWNvbmRpdGlvbgotCQkJCQkJLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT04sIG51bGwsIG51bGwpOwotCQkJCWlmIChuZXdQcmVjb25kaXRpb24uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3UHJlY29uZGl0aW9uLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJLSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT04sIG51bGwsCi0JCQkJCQkJbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTiwgb2xkUHJlY29uZGl0aW9uLAotCQkJCQkJCXByZWNvbmRpdGlvbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcmVjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgYmFzaWNHZXRQcmVjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwcmVjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJlY29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UHJlY29uZGl0aW9uLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlDb25zdHJhaW50IG9sZFByZWNvbmRpdGlvbiA9IHByZWNvbmRpdGlvbjsKLQkJcHJlY29uZGl0aW9uID0gbmV3UHJlY29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT04sCi0JCQkJCW9sZFByZWNvbmRpdGlvbiwgbmV3UHJlY29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWNvbmRpdGlvbihDb25zdHJhaW50IG5ld1ByZWNvbmRpdGlvbikgewotCQlpZiAobmV3UHJlY29uZGl0aW9uICE9IHByZWNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb24pCi0JCQkJCQkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UHJlY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQcmVjb25kaXRpb24pCi0JCQkJCQkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcmVjb25kaXRpb24obmV3UHJlY29uZGl0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OLCBuZXdQcmVjb25kaXRpb24sCi0JCQkJCW5ld1ByZWNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFBvc3Rjb25kaXRpb24oKSB7Ci0JCWlmIChwb3N0Y29uZGl0aW9uICE9IG51bGwgJiYgKChFT2JqZWN0KSBwb3N0Y29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUG9zdGNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb247Ci0JCQlwb3N0Y29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUG9zdGNvbmRpdGlvbik7Ci0JCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBvbGRQb3N0Y29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1Bvc3Rjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwb3N0Y29uZGl0aW9uOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQb3N0Y29uZGl0aW9uLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTiwgbnVsbCwKLQkJCQkJCW51bGwpOwotCQkJCWlmIChuZXdQb3N0Y29uZGl0aW9uLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1Bvc3Rjb25kaXRpb24uZUludmVyc2VBZGQodGhpcywKLQkJCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCQktIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT04sIG51bGwsCi0JCQkJCQkJbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT04sCi0JCQkJCQkJb2xkUG9zdGNvbmRpdGlvbiwgcG9zdGNvbmRpdGlvbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHBvc3Rjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50IG5ld1Bvc3Rjb25kaXRpb24sCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnN0cmFpbnQgb2xkUG9zdGNvbmRpdGlvbiA9IHBvc3Rjb25kaXRpb247Ci0JCXBvc3Rjb25kaXRpb24gPSBuZXdQb3N0Y29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OLAotCQkJCQlvbGRQb3N0Y29uZGl0aW9uLCBuZXdQb3N0Y29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3Rjb25kaXRpb24oQ29uc3RyYWludCBuZXdQb3N0Y29uZGl0aW9uKSB7Ci0JCWlmIChuZXdQb3N0Y29uZGl0aW9uICE9IHBvc3Rjb25kaXRpb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBvc3Rjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTiwgbnVsbCwKLQkJCQkJCW1zZ3MpOwotCQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1Bvc3Rjb25kaXRpb24pLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTiwgbnVsbCwKLQkJCQkJCW1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UG9zdGNvbmRpdGlvbihuZXdQb3N0Y29uZGl0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTiwgbmV3UG9zdGNvbmRpdGlvbiwKLQkJCQkJbmV3UG9zdGNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEJyZWFrZG93bkVsZW1lbnQ+IGdldEJyZWFrZG93bkVsZW1lbnRzKCkgewotCQlpZiAoYnJlYWtkb3duRWxlbWVudHMgPT0gbnVsbCkgewotCQkJYnJlYWtkb3duRWxlbWVudHMgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q8QnJlYWtkb3duRWxlbWVudD4oCi0JCQkJCUJyZWFrZG93bkVsZW1lbnQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUywKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUyk7Ci0JCX0KLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFJvYWRtYXA+IGdldFJvYWRtYXBzKCkgewotCQlpZiAocm9hZG1hcHMgPT0gbnVsbCkgewotCQkJcm9hZG1hcHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFJvYWRtYXA+KFJvYWRtYXAuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX1JPQURNQVBTKTsKLQkJfQotCQlyZXR1cm4gcm9hZG1hcHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PEludGVybmFsRU9iamVjdD4pIChJbnRlcm5hbEVMaXN0PD8+KSBnZXRCcmVha2Rvd25FbGVtZW50cygpKQotCQkJCQkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFByZWNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJcmV0dXJuIGJhc2ljU2V0UG9zdGNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRCcmVha2Rvd25FbGVtZW50cygpKS5iYXNpY1JlbW92ZSgKLQkJCQkJb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fRlVMRklMTFM6Ci0JCQlyZXR1cm4gZ2V0RnVsZmlsbHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRQcmVjb25kaXRpb24oKTsKLQkJCXJldHVybiBiYXNpY0dldFByZWNvbmRpdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UG9zdGNvbmRpdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJCXJldHVybiBnZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JPQURNQVBTOgotCQkJcmV0dXJuIGdldFJvYWRtYXBzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19GVUxGSUxMUzoKLQkJCWdldEZ1bGZpbGxzKCkuY2xlYXIoKTsKLQkJCWdldEZ1bGZpbGxzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRnVsZmlsbGFibGVFbGVtZW50PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlzZXRWYXJpYWJpbGl0eVR5cGUoKFZhcmlhYmlsaXR5VHlwZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KChWYXJpYWJpbGl0eUVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQlzZXRQcmVjb25kaXRpb24oKENvbnN0cmFpbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJc2V0UG9zdGNvbmRpdGlvbigoQ29uc3RyYWludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJCWdldEJyZWFrZG93bkVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCWdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19ST0FETUFQUzoKLQkJCWdldFJvYWRtYXBzKCkuY2xlYXIoKTsKLQkJCWdldFJvYWRtYXBzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSb2FkbWFwPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19GVUxGSUxMUzoKLQkJCWdldEZ1bGZpbGxzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJc2V0VmFyaWFiaWxpdHlUeXBlKFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KChWYXJpYWJpbGl0eUVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjoKLQkJCXNldFByZWNvbmRpdGlvbigoQ29uc3RyYWludCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTjoKLQkJCXNldFBvc3Rjb25kaXRpb24oKENvbnN0cmFpbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJCWdldEJyZWFrZG93bkVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19ST0FETUFQUzoKLQkJCWdldFJvYWRtYXBzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0ZVTEZJTExTOgotCQkJcmV0dXJuIGZ1bGZpbGxzICE9IG51bGwgJiYgIWZ1bGZpbGxzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZSAhPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBwcmVjb25kaXRpb24gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJcmV0dXJuIHBvc3Rjb25kaXRpb24gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQlyZXR1cm4gYnJlYWtkb3duRWxlbWVudHMgIT0gbnVsbCAmJiAhYnJlYWtkb3duRWxlbWVudHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JPQURNQVBTOgotCQkJcmV0dXJuIHJvYWRtYXBzICE9IG51bGwgJiYgIXJvYWRtYXBzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IEZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0ZVTEZJTExTOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLkZVTEZJTExBQkxFX0VMRU1FTlRfX0ZVTEZJTExTOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBWYXJpYWJpbGl0eUVsZW1lbnQuY2xhc3MpIHsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gV29ya0RlZmluaXRpb24uY2xhc3MpIHsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT047Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBGdWxmaWxsYWJsZUVsZW1lbnQuY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkZVTEZJTExBQkxFX0VMRU1FTlRfX0ZVTEZJTExTOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLkFDVElWSVRZX19GVUxGSUxMUzsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOwotCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFdvcmtEZWZpbml0aW9uLmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTjsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZhcmlhYmlsaXR5VHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh2YXJpYWJpbGl0eVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BY3Rpdml0eUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJiODNjMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbCNnZXRJc1ByaW1hcnlFeHRlbnNpb24gPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsIGV4dGVuZHMgQ2xhc3NpZmllckltcGwgaW1wbGVtZW50cwotCQlBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCkgPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1ByaW1hcnlFeHRlbnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19QUklNQVJZX0VYVEVOU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1ByaW1hcnlFeHRlbnNpb24oKSA8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaXNQcmltYXJ5RXh0ZW5zaW9uID0gSVNfUFJJTUFSWV9FWFRFTlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc1ByaW1hcnlFeHRlbnNpb24oKSB7Ci0JCXJldHVybiBpc1ByaW1hcnlFeHRlbnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKEJvb2xlYW4gbmV3SXNQcmltYXJ5RXh0ZW5zaW9uKSB7Ci0JCUJvb2xlYW4gb2xkSXNQcmltYXJ5RXh0ZW5zaW9uID0gaXNQcmltYXJ5RXh0ZW5zaW9uOwotCQlpc1ByaW1hcnlFeHRlbnNpb24gPSBuZXdJc1ByaW1hcnlFeHRlbnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKAotCQkJCQl0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTiwKLQkJCQkJb2xkSXNQcmltYXJ5RXh0ZW5zaW9uLCBpc1ByaW1hcnlFeHRlbnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19fSVNfUFJJTUFSWV9FWFRFTlNJT046Ci0JCQlyZXR1cm4gZ2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTjoKLQkJCXNldElzUHJpbWFyeUV4dGVuc2lvbigoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTjoKLQkJCXNldElzUHJpbWFyeUV4dGVuc2lvbihJU19QUklNQVJZX0VYVEVOU0lPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTjoKLQkJCXJldHVybiBJU19QUklNQVJZX0VYVEVOU0lPTl9FREVGQVVMVCA9PSBudWxsID8gaXNQcmltYXJ5RXh0ZW5zaW9uICE9IG51bGwKLQkJCQkJOiAhSVNfUFJJTUFSWV9FWFRFTlNJT05fRURFRkFVTFQuZXF1YWxzKGlzUHJpbWFyeUV4dGVuc2lvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaXNQcmltYXJ5RXh0ZW5zaW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlzUHJpbWFyeUV4dGVuc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FydGlmYWN0RGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVlNjkzNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsI2dldEJyaWVmT3V0bGluZSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucyA8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsI2dldFJlcHJlc2VudGF0aW9uIDxlbT5SZXByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsI2dldE5vdGF0aW9uIDxlbT5Ob3RhdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFydGlmYWN0RGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwKLQkJaW1wbGVtZW50cyBBcnRpZmFjdERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmllZk91dGxpbmUoKSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QnJpZWZPdXRsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCUklFRl9PVVRMSU5FX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmllZk91dGxpbmUoKSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QnJpZWZPdXRsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJyaWVmT3V0bGluZSA9IEJSSUVGX09VVExJTkVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQUkVTRU5UQVRJT05fT1BUSU9OU19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXByZXNlbnRhdGlvbk9wdGlvbnMgPSBSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcHJlc2VudGF0aW9uKCkgPGVtPlJlcHJlc2VudGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQUkVTRU5UQVRJT05fRURFRkFVTFQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwcmVzZW50YXRpb24oKSA8ZW0+UmVwcmVzZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlcHJlc2VudGF0aW9uID0gUkVQUkVTRU5UQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90YXRpb24oKSA8ZW0+Tm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RBVElPTl9FREVGQVVMVCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb3RhdGlvbigpIDxlbT5Ob3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbm90YXRpb24gPSBOT1RBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBcnRpZmFjdERlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1RfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCcmllZk91dGxpbmUoKSB7Ci0JCXJldHVybiBicmllZk91dGxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QnJpZWZPdXRsaW5lKFN0cmluZyBuZXdCcmllZk91dGxpbmUpIHsKLQkJU3RyaW5nIG9sZEJyaWVmT3V0bGluZSA9IGJyaWVmT3V0bGluZTsKLQkJYnJpZWZPdXRsaW5lID0gbmV3QnJpZWZPdXRsaW5lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FLAotCQkJCQlvbGRCcmllZk91dGxpbmUsIGJyaWVmT3V0bGluZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkgewotCQlyZXR1cm4gcmVwcmVzZW50YXRpb25PcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcHJlc2VudGF0aW9uT3B0aW9ucyhTdHJpbmcgbmV3UmVwcmVzZW50YXRpb25PcHRpb25zKSB7Ci0JCVN0cmluZyBvbGRSZXByZXNlbnRhdGlvbk9wdGlvbnMgPSByZXByZXNlbnRhdGlvbk9wdGlvbnM7Ci0JCXJlcHJlc2VudGF0aW9uT3B0aW9ucyA9IG5ld1JlcHJlc2VudGF0aW9uT3B0aW9uczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUywKLQkJCQkJb2xkUmVwcmVzZW50YXRpb25PcHRpb25zLCByZXByZXNlbnRhdGlvbk9wdGlvbnMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlcHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gcmVwcmVzZW50YXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwcmVzZW50YXRpb24oU3RyaW5nIG5ld1JlcHJlc2VudGF0aW9uKSB7Ci0JCVN0cmluZyBvbGRSZXByZXNlbnRhdGlvbiA9IHJlcHJlc2VudGF0aW9uOwotCQlyZXByZXNlbnRhdGlvbiA9IG5ld1JlcHJlc2VudGF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTiwKLQkJCQkJb2xkUmVwcmVzZW50YXRpb24sIHJlcHJlc2VudGF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb3RhdGlvbigpIHsKLQkJcmV0dXJuIG5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGF0aW9uKFN0cmluZyBuZXdOb3RhdGlvbikgewotCQlTdHJpbmcgb2xkTm90YXRpb24gPSBub3RhdGlvbjsKLQkJbm90YXRpb24gPSBuZXdOb3RhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT04sIG9sZE5vdGF0aW9uLAotCQkJCQlub3RhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FOgotCQkJcmV0dXJuIGdldEJyaWVmT3V0bGluZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlM6Ci0JCQlyZXR1cm4gZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT046Ci0JCQlyZXR1cm4gZ2V0UmVwcmVzZW50YXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTjoKLQkJCXJldHVybiBnZXROb3RhdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORToKLQkJCXNldEJyaWVmT3V0bGluZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUzoKLQkJCXNldFJlcHJlc2VudGF0aW9uT3B0aW9ucygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT046Ci0JCQlzZXRSZXByZXNlbnRhdGlvbigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT046Ci0JCQlzZXROb3RhdGlvbigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkU6Ci0JCQlzZXRCcmllZk91dGxpbmUoQlJJRUZfT1VUTElORV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUzoKLQkJCXNldFJlcHJlc2VudGF0aW9uT3B0aW9ucyhSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTjoKLQkJCXNldFJlcHJlc2VudGF0aW9uKFJFUFJFU0VOVEFUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTjoKLQkJCXNldE5vdGF0aW9uKE5PVEFUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkU6Ci0JCQlyZXR1cm4gQlJJRUZfT1VUTElORV9FREVGQVVMVCA9PSBudWxsID8gYnJpZWZPdXRsaW5lICE9IG51bGwKLQkJCQkJOiAhQlJJRUZfT1VUTElORV9FREVGQVVMVC5lcXVhbHMoYnJpZWZPdXRsaW5lKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TOgotCQkJcmV0dXJuIFJFUFJFU0VOVEFUSU9OX09QVElPTlNfRURFRkFVTFQgPT0gbnVsbCA/IHJlcHJlc2VudGF0aW9uT3B0aW9ucyAhPSBudWxsCi0JCQkJCTogIVJFUFJFU0VOVEFUSU9OX09QVElPTlNfRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKHJlcHJlc2VudGF0aW9uT3B0aW9ucyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT046Ci0JCQlyZXR1cm4gUkVQUkVTRU5UQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHJlcHJlc2VudGF0aW9uICE9IG51bGwKLQkJCQkJOiAhUkVQUkVTRU5UQVRJT05fRURFRkFVTFQuZXF1YWxzKHJlcHJlc2VudGF0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTjoKLQkJCXJldHVybiBOT1RBVElPTl9FREVGQVVMVCA9PSBudWxsID8gbm90YXRpb24gIT0gbnVsbAotCQkJCQk6ICFOT1RBVElPTl9FREVGQVVMVC5lcXVhbHMobm90YXRpb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGJyaWVmT3V0bGluZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChicmllZk91dGxpbmUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlcHJlc2VudGF0aW9uT3B0aW9uczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyZXByZXNlbnRhdGlvbk9wdGlvbnMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlcHJlc2VudGF0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJlcHJlc2VudGF0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBub3RhdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChub3RhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FydGlmYWN0RGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQXJ0aWZhY3RJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQXJ0aWZhY3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZjcyNTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FydGlmYWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJ0aWZhY3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcnRpZmFjdEltcGwjZ2V0Q29udGFpbmVyQXJ0aWZhY3QgPGVtPkNvbnRhaW5lciBBcnRpZmFjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0SW1wbCNnZXRDb250YWluZWRBcnRpZmFjdHMgPGVtPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEltcGwgZXh0ZW5kcyBXb3JrUHJvZHVjdEltcGwgaW1wbGVtZW50cyBBcnRpZmFjdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250YWluZWRBcnRpZmFjdHMoKSA8ZW0+Q29udGFpbmVkIEFydGlmYWN0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb250YWluZWRBcnRpZmFjdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxBcnRpZmFjdD4gY29udGFpbmVkQXJ0aWZhY3RzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFydGlmYWN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFydGlmYWN0IGdldENvbnRhaW5lckFydGlmYWN0KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1QpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChBcnRpZmFjdCkgZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcnRpZmFjdCBiYXNpY0dldENvbnRhaW5lckFydGlmYWN0KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1QpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChBcnRpZmFjdCkgZUludGVybmFsQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29udGFpbmVyQXJ0aWZhY3QoCi0JCQlBcnRpZmFjdCBuZXdDb250YWluZXJBcnRpZmFjdCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0NvbnRhaW5lckFydGlmYWN0LAotCQkJCVVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lckFydGlmYWN0KEFydGlmYWN0IG5ld0NvbnRhaW5lckFydGlmYWN0KSB7Ci0JCWlmIChuZXdDb250YWluZXJBcnRpZmFjdCAhPSBlSW50ZXJuYWxDb250YWluZXIoKQotCQkJCXx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVCAmJiBuZXdDb250YWluZXJBcnRpZmFjdCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIChFT2JqZWN0KSBuZXdDb250YWluZXJBcnRpZmFjdCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdDb250YWluZXJBcnRpZmFjdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3Q29udGFpbmVyQXJ0aWZhY3QpLmVJbnZlcnNlQWRkKAotCQkJCQkJdGhpcywgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUywKLQkJCQkJCUFydGlmYWN0LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvbnRhaW5lckFydGlmYWN0KG5ld0NvbnRhaW5lckFydGlmYWN0LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNULAotCQkJCQluZXdDb250YWluZXJBcnRpZmFjdCwgbmV3Q29udGFpbmVyQXJ0aWZhY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxBcnRpZmFjdD4gZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkgewotCQlpZiAoY29udGFpbmVkQXJ0aWZhY3RzID09IG51bGwpIHsKLQkJCWNvbnRhaW5lZEFydGlmYWN0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0LlJlc29sdmluZzxBcnRpZmFjdD4oCi0JCQkJCUFydGlmYWN0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTLAotCQkJCQlVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1QpOwotCQl9Ci0JCXJldHVybiBjb250YWluZWRBcnRpZmFjdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1Q6Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldENvbnRhaW5lckFydGlmYWN0KChBcnRpZmFjdCkgb3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PEludGVybmFsRU9iamVjdD4pIChJbnRlcm5hbEVMaXN0PD8+KSBnZXRDb250YWluZWRBcnRpZmFjdHMoKSkKLQkJCQkJLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1Q6Ci0JCQlyZXR1cm4gYmFzaWNTZXRDb250YWluZXJBcnRpZmFjdChudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkpLmJhc2ljUmVtb3ZlKAotCQkJCQlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZSgKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUOgotCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFMsIEFydGlmYWN0LmNsYXNzLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRDb250YWluZXJBcnRpZmFjdCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0Q29udGFpbmVyQXJ0aWZhY3QoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTOgotCQkJcmV0dXJuIGdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUOgotCQkJc2V0Q29udGFpbmVyQXJ0aWZhY3QoKEFydGlmYWN0KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUzoKLQkJCWdldENvbnRhaW5lZEFydGlmYWN0cygpLmNsZWFyKCk7Ci0JCQlnZXRDb250YWluZWRBcnRpZmFjdHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBcnRpZmFjdD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUOgotCQkJc2V0Q29udGFpbmVyQXJ0aWZhY3QoKEFydGlmYWN0KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTOgotCQkJZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVDoKLQkJCXJldHVybiBiYXNpY0dldENvbnRhaW5lckFydGlmYWN0KCkgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTOgotCQkJcmV0dXJuIGNvbnRhaW5lZEFydGlmYWN0cyAhPSBudWxsICYmICFjb250YWluZWRBcnRpZmFjdHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9BcnRpZmFjdEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjI1YmEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwjZ2V0VXNhZ2VHdWlkYW5jZSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbAotCQlpbXBsZW1lbnRzIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNhZ2VHdWlkYW5jZSgpIDxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2VHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNBR0VfR1VJREFOQ0VfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzYWdlR3VpZGFuY2UoKSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVzYWdlR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXNhZ2VHdWlkYW5jZSA9IFVTQUdFX0dVSURBTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXNhZ2VHdWlkYW5jZSgpIHsKLQkJcmV0dXJuIHVzYWdlR3VpZGFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNhZ2VHdWlkYW5jZShTdHJpbmcgbmV3VXNhZ2VHdWlkYW5jZSkgewotCQlTdHJpbmcgb2xkVXNhZ2VHdWlkYW5jZSA9IHVzYWdlR3VpZGFuY2U7Ci0JCXVzYWdlR3VpZGFuY2UgPSBuZXdVc2FnZUd1aWRhbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSwKLQkJCQkJb2xkVXNhZ2VHdWlkYW5jZSwgdXNhZ2VHdWlkYW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRToKLQkJCXJldHVybiBnZXRVc2FnZUd1aWRhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRToKLQkJCXNldFVzYWdlR3VpZGFuY2UoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRToKLQkJCXNldFVzYWdlR3VpZGFuY2UoVVNBR0VfR1VJREFOQ0VfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U6Ci0JCQlyZXR1cm4gVVNBR0VfR1VJREFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHVzYWdlR3VpZGFuY2UgIT0gbnVsbAotCQkJCQk6ICFVU0FHRV9HVUlEQU5DRV9FREVGQVVMVC5lcXVhbHModXNhZ2VHdWlkYW5jZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodXNhZ2VHdWlkYW5jZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh1c2FnZUd1aWRhbmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFkNWFjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldElzUGxhbm5lZCA8ZW0+SXMgUGxhbm5lZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldElzT3B0aW9uYWwgPGVtPklzIE9wdGlvbmFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0UHJlc2VudGVkQWZ0ZXIgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFByZXNlbnRlZEJlZm9yZSA8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFBsYW5uaW5nRGF0YSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFN1cGVyQWN0aXZpdGllcyA8ZW0+U3VwZXIgQWN0aXZpdGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldENoZWNrbGlzdHMgPGVtPkNoZWNrbGlzdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRDb25jZXB0cyA8ZW0+Q29uY2VwdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRFeGFtcGxlcyA8ZW0+RXhhbXBsZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRHdWlkZWxpbmVzIDxlbT5HdWlkZWxpbmVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0UmV1c2FibGVBc3NldHMgPGVtPlJldXNhYmxlIEFzc2V0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFN1cHBvcnRpbmdNYXRlcmlhbHMgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0VGVtcGxhdGVzIDxlbT5UZW1wbGF0ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRSZXBvcnRzIDxlbT5SZXBvcnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRUb29sbWVudG9yIDxlbT5Ub29sbWVudG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQnJlYWtkb3duRWxlbWVudEltcGwgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVmaXgoKSA8ZW0+UHJlZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeCA9IFBSRUZJWF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1BsYW5uZWQoKSA8ZW0+SXMgUGxhbm5lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNQbGFubmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSVNfUExBTk5FRF9FREVGQVVMVCA9IEJvb2xlYW4uVFJVRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzUGxhbm5lZCgpIDxlbT5JcyBQbGFubmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1BsYW5uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzUGxhbm5lZCA9IElTX1BMQU5ORURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBIQVNfTVVMVElQTEVfT0NDVVJSRU5DRVNfRURFRkFVTFQgPSBCb29sZWFuLkZBTFNFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgPSBIQVNfTVVMVElQTEVfT0NDVVJSRU5DRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNPcHRpb25hbCgpIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNPcHRpb25hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX09QVElPTkFMX0VERUZBVUxUID0gQm9vbGVhbi5GQUxTRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzT3B0aW9uYWwoKSA8ZW0+SXMgT3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzT3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzT3B0aW9uYWwgPSBJU19PUFRJT05BTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRlZEFmdGVyKCkgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGVkQWZ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50IHByZXNlbnRlZEFmdGVyOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlc2VudGVkQmVmb3JlKCkgPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRlZEJlZm9yZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnQgcHJlc2VudGVkQmVmb3JlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGxhbm5pbmdEYXRhKCkgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBsYW5uaW5nRGF0YSBwbGFubmluZ0RhdGE7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdXBlckFjdGl2aXRpZXMoKSA8ZW0+U3VwZXIgQWN0aXZpdGllczwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3VwZXJBY3Rpdml0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHkgc3VwZXJBY3Rpdml0aWVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hlY2tsaXN0cygpIDxlbT5DaGVja2xpc3RzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoZWNrbGlzdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxDaGVja2xpc3Q+IGNoZWNrbGlzdHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25jZXB0cygpIDxlbT5Db25jZXB0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25jZXB0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PENvbmNlcHQ+IGNvbmNlcHRzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhhbXBsZXMoKSA8ZW0+RXhhbXBsZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhhbXBsZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxFeGFtcGxlPiBleGFtcGxlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEd1aWRlbGluZXMoKSA8ZW0+R3VpZGVsaW5lczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHdWlkZWxpbmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8R3VpZGVsaW5lPiBndWlkZWxpbmVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmV1c2FibGVBc3NldHMoKSA8ZW0+UmV1c2FibGUgQXNzZXRzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJldXNhYmxlQXNzZXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8UmV1c2FibGVBc3NldD4gcmV1c2FibGVBc3NldHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1cHBvcnRpbmdNYXRlcmlhbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdXBwb3J0aW5nTWF0ZXJpYWw+IHN1cHBvcnRpbmdNYXRlcmlhbHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZW1wbGF0ZXMoKSA8ZW0+VGVtcGxhdGVzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRlbXBsYXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFRlbXBsYXRlPiB0ZW1wbGF0ZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXBvcnRzKCkgPGVtPlJlcG9ydHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVwb3J0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFJlcG9ydD4gcmVwb3J0czsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVzdGltYXRpb25jb25zaWRlcmF0aW9ucygpIDxlbT5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPiBlc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb29sbWVudG9yKCkgPGVtPlRvb2xtZW50b3I8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9vbG1lbnRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFRvb2xNZW50b3I+IHRvb2xtZW50b3I7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+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+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOgotCQkJcmV0dXJuIFBSRUZJWF9FREVGQVVMVCA9PSBudWxsID8gcHJlZml4ICE9IG51bGwgOiAhUFJFRklYX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMocHJlZml4KTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOgotCQkJcmV0dXJuIElTX1BMQU5ORURfRURFRkFVTFQgPT0gbnVsbCA/IGlzUGxhbm5lZCAhPSBudWxsCi0JCQkJCTogIUlTX1BMQU5ORURfRURFRkFVTFQuZXF1YWxzKGlzUGxhbm5lZCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOgotCQkJcmV0dXJuIEhBU19NVUxUSVBMRV9PQ0NVUlJFTkNFU19FREVGQVVMVCA9PSBudWxsID8gaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyAhPSBudWxsCi0JCQkJCTogIUhBU19NVUxUSVBMRV9PQ0NVUlJFTkNFU19FREVGQVVMVAotCQkJCQkJCS5lcXVhbHMoaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw6Ci0JCQlyZXR1cm4gSVNfT1BUSU9OQUxfRURFRkFVTFQgPT0gbnVsbCA/IGlzT3B0aW9uYWwgIT0gbnVsbAotCQkJCQk6ICFJU19PUFRJT05BTF9FREVGQVVMVC5lcXVhbHMoaXNPcHRpb25hbCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOgotCQkJcmV0dXJuIHByZXNlbnRlZEFmdGVyICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRToKLQkJCXJldHVybiBwcmVzZW50ZWRCZWZvcmUgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJcmV0dXJuIHBsYW5uaW5nRGF0YSAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVM6Ci0JCQlyZXR1cm4gc3VwZXJBY3Rpdml0aWVzICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUUzoKLQkJCXJldHVybiBjaGVja2xpc3RzICE9IG51bGwgJiYgIWNoZWNrbGlzdHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFRTOgotCQkJcmV0dXJuIGNvbmNlcHRzICE9IG51bGwgJiYgIWNvbmNlcHRzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFUzoKLQkJCXJldHVybiBleGFtcGxlcyAhPSBudWxsICYmICFleGFtcGxlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FUzoKLQkJCXJldHVybiBndWlkZWxpbmVzICE9IG51bGwgJiYgIWd1aWRlbGluZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUUzoKLQkJCXJldHVybiByZXVzYWJsZUFzc2V0cyAhPSBudWxsICYmICFyZXVzYWJsZUFzc2V0cy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM6Ci0JCQlyZXR1cm4gc3VwcG9ydGluZ01hdGVyaWFscyAhPSBudWxsCi0JCQkJCSYmICFzdXBwb3J0aW5nTWF0ZXJpYWxzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19URU1QTEFURVM6Ci0JCQlyZXR1cm4gdGVtcGxhdGVzICE9IG51bGwgJiYgIXRlbXBsYXRlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUkVQT1JUUzoKLQkJCXJldHVybiByZXBvcnRzICE9IG51bGwgJiYgIXJlcG9ydHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzoKLQkJCXJldHVybiBlc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMgIT0gbnVsbAotCQkJCQkmJiAhZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19UT09MTUVOVE9SOgotCQkJcmV0dXJuIHRvb2xtZW50b3IgIT0gbnVsbCAmJiAhdG9vbG1lbnRvci5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHJlZml4OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHByZWZpeCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNQbGFubmVkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlzUGxhbm5lZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaGFzTXVsdGlwbGVPY2N1cnJlbmNlczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChoYXNNdWx0aXBsZU9jY3VycmVuY2VzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc09wdGlvbmFsOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlzT3B0aW9uYWwpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9CcmVha2Rvd25FbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NhcGFiaWxpdHlQYXR0ZXJuSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NhcGFiaWxpdHlQYXR0ZXJuSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTVlZWUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DYXBhYmlsaXR5UGF0dGVybkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYXBhYmlsaXR5IFBhdHRlcm48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXBhYmlsaXR5UGF0dGVybkltcGwgZXh0ZW5kcyBQcm9jZXNzSW1wbCBpbXBsZW1lbnRzCi0JCUNhcGFiaWxpdHlQYXR0ZXJuIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDYXBhYmlsaXR5UGF0dGVybkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNBUEFCSUxJVFlfUEFUVEVSTjsKLQl9Ci0KLX0gLy9DYXBhYmlsaXR5UGF0dGVybkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DaGVja2xpc3RJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ2hlY2tsaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDNkZGI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DaGVja2xpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENoZWNrbGlzdEltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBDaGVja2xpc3QgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENoZWNrbGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNIRUNLTElTVDsKLQl9Ci0KLX0gLy9DaGVja2xpc3RJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ2xhc3NpZmllckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DbGFzc2lmaWVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2Q3NDliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DbGFzc2lmaWVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DbGFzc2lmaWVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2xhc3NpZmllckltcGwjZ2V0SXNBYnN0cmFjdCA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGFzc2lmaWVySW1wbCBleHRlbmRzIFR5cGVJbXBsIGltcGxlbWVudHMgQ2xhc3NpZmllciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNBYnN0cmFjdCgpIDxlbT5JcyBBYnN0cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNBYnN0cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX0FCU1RSQUNUX0VERUZBVUxUID0gQm9vbGVhbi5GQUxTRTsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc0Fic3RyYWN0KCkgPGVtPklzIEFic3RyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc0Fic3RyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc0Fic3RyYWN0ID0gSVNfQUJTVFJBQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3NpZmllckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNMQVNTSUZJRVI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0SXNBYnN0cmFjdCgpIHsKLQkJcmV0dXJuIGlzQWJzdHJhY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNBYnN0cmFjdChCb29sZWFuIG5ld0lzQWJzdHJhY3QpIHsKLQkJQm9vbGVhbiBvbGRJc0Fic3RyYWN0ID0gaXNBYnN0cmFjdDsKLQkJaXNBYnN0cmFjdCA9IG5ld0lzQWJzdHJhY3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQ0xBU1NJRklFUl9fSVNfQUJTVFJBQ1QsIG9sZElzQWJzdHJhY3QsCi0JCQkJCWlzQWJzdHJhY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DTEFTU0lGSUVSX19JU19BQlNUUkFDVDoKLQkJCXJldHVybiBnZXRJc0Fic3RyYWN0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNMQVNTSUZJRVJfX0lTX0FCU1RSQUNUOgotCQkJc2V0SXNBYnN0cmFjdCgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNMQVNTSUZJRVJfX0lTX0FCU1RSQUNUOgotCQkJc2V0SXNBYnN0cmFjdChJU19BQlNUUkFDVF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNMQVNTSUZJRVJfX0lTX0FCU1RSQUNUOgotCQkJcmV0dXJuIElTX0FCU1RSQUNUX0VERUZBVUxUID09IG51bGwgPyBpc0Fic3RyYWN0ICE9IG51bGwKLQkJCQkJOiAhSVNfQUJTVFJBQ1RfRURFRkFVTFQuZXF1YWxzKGlzQWJzdHJhY3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzQWJzdHJhY3Q6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNBYnN0cmFjdCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NsYXNzaWZpZXJJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29tcG9zaXRlUm9sZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db21wb3NpdGVSb2xlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDg4MWUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db21wb3NpdGVSb2xlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db21wb3NpdGUgUm9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsI2dldEFnZ3JlZ2F0ZWRSb2xlcyA8ZW0+QWdncmVnYXRlZCBSb2xlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZVJvbGVJbXBsIGV4dGVuZHMgUm9sZURlc2NyaXB0b3JJbXBsIGltcGxlbWVudHMKLQkJQ29tcG9zaXRlUm9sZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZ2dyZWdhdGVkUm9sZXMoKSA8ZW0+QWdncmVnYXRlZCBSb2xlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZ2dyZWdhdGVkUm9sZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxSb2xlPiBhZ2dyZWdhdGVkUm9sZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlUm9sZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTVBPU0lURV9ST0xFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFJvbGU+IGdldEFnZ3JlZ2F0ZWRSb2xlcygpIHsKLQkJaWYgKGFnZ3JlZ2F0ZWRSb2xlcyA9PSBudWxsKSB7Ci0JCQlhZ2dyZWdhdGVkUm9sZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFJvbGU+KFJvbGUuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRVMpOwotCQl9Ci0JCXJldHVybiBhZ2dyZWdhdGVkUm9sZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRVM6Ci0JCQlyZXR1cm4gZ2V0QWdncmVnYXRlZFJvbGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTOgotCQkJZ2V0QWdncmVnYXRlZFJvbGVzKCkuY2xlYXIoKTsKLQkJCWdldEFnZ3JlZ2F0ZWRSb2xlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUm9sZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFUzoKLQkJCWdldEFnZ3JlZ2F0ZWRSb2xlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTOgotCQkJcmV0dXJuIGFnZ3JlZ2F0ZWRSb2xlcyAhPSBudWxsICYmICFhZ2dyZWdhdGVkUm9sZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Db21wb3NpdGVSb2xlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbmNlcHRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29uY2VwdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4NTU2NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29uY2VwdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25jZXB0SW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIENvbmNlcHQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbmNlcHRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05DRVBUOwotCX0KLQotfSAvL0NvbmNlcHRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29uc3RyYWludEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db25zdHJhaW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWM4NDc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db25zdHJhaW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnN0cmFpbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db25zdHJhaW50SW1wbCNnZXRCb2R5IDxlbT5Cb2R5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludEltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzIENvbnN0cmFpbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJvZHkoKSA8ZW0+Qm9keTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Qm9keSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9EWV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Qm9keSgpIDxlbT5Cb2R5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCb2R5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJvZHkgPSBCT0RZX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05TVFJBSU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9keSgpIHsKLQkJcmV0dXJuIGJvZHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9keShTdHJpbmcgbmV3Qm9keSkgewotCQlTdHJpbmcgb2xkQm9keSA9IGJvZHk7Ci0JCWJvZHkgPSBuZXdCb2R5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX0JPRFksIG9sZEJvZHksIGJvZHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UX19CT0RZOgotCQkJcmV0dXJuIGdldEJvZHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVF9fQk9EWToKLQkJCXNldEJvZHkoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX0JPRFk6Ci0JCQlzZXRCb2R5KEJPRFlfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UX19CT0RZOgotCQkJcmV0dXJuIEJPRFlfRURFRkFVTFQgPT0gbnVsbCA/IGJvZHkgIT0gbnVsbCA6ICFCT0RZX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoYm9keSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYm9keTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChib2R5KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ29uc3RyYWludEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50Q2F0ZWdvcnlJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudENhdGVnb3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWUyZjBkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50Q2F0ZWdvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgQ2F0ZWdvcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50Q2F0ZWdvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0NBVEVHT1JZOwotCX0KLQotfSAvL0NvbnRlbnRDYXRlZ29yeUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50RGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudERlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2UwZWQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50RGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsI2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwjZ2V0U2VjdGlvbnMgPGVtPlNlY3Rpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwjZ2V0S2V5Q29uc2lkZXJhdGlvbnMgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwjZ2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWUgPGVtPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgTWV0aG9kVW5pdEltcGwgaW1wbGVtZW50cwotCQlDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1haW5EZXNjcmlwdGlvbigpIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1haW5EZXNjcmlwdGlvbigpIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFpbkRlc2NyaXB0aW9uID0gTUFJTl9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3Rpb25zKCkgPGVtPlNlY3Rpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlY3Rpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U2VjdGlvbj4gc2VjdGlvbnM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxJZCgpIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfSURfRURFRkFVTFQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxJZCgpIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBleHRlcm5hbElkID0gRVhURVJOQUxfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKSA8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRLZXlDb25zaWRlcmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLZXlDb25zaWRlcmF0aW9ucygpIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEtleUNvbnNpZGVyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGtleUNvbnNpZGVyYXRpb25zID0gS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvbmdQcmVzZW50YXRpb25OYW1lKCkgPGVtPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvbmdQcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT05HX1BSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvbmdQcmVzZW50YXRpb25OYW1lKCkgPGVtPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvbmdQcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvbmdQcmVzZW50YXRpb25OYW1lID0gTE9OR19QUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50RGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFpbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gbWFpbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1haW5EZXNjcmlwdGlvbihTdHJpbmcgbmV3TWFpbkRlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRNYWluRGVzY3JpcHRpb24gPSBtYWluRGVzY3JpcHRpb247Ci0JCW1haW5EZXNjcmlwdGlvbiA9IG5ld01haW5EZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OLAotCQkJCQlvbGRNYWluRGVzY3JpcHRpb24sIG1haW5EZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFNlY3Rpb24+IGdldFNlY3Rpb25zKCkgewotCQlpZiAoc2VjdGlvbnMgPT0gbnVsbCkgewotCQkJc2VjdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPFNlY3Rpb24+KAotCQkJCQlTZWN0aW9uLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TKTsKLQkJfQotCQlyZXR1cm4gc2VjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlcm5hbElkKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxJZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbElkKFN0cmluZyBuZXdFeHRlcm5hbElkKSB7Ci0JCVN0cmluZyBvbGRFeHRlcm5hbElkID0gZXh0ZXJuYWxJZDsKLQkJZXh0ZXJuYWxJZCA9IG5ld0V4dGVybmFsSWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQsIG9sZEV4dGVybmFsSWQsCi0JCQkJCWV4dGVybmFsSWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEtleUNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4ga2V5Q29uc2lkZXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2V5Q29uc2lkZXJhdGlvbnMoU3RyaW5nIG5ld0tleUNvbnNpZGVyYXRpb25zKSB7Ci0JCVN0cmluZyBvbGRLZXlDb25zaWRlcmF0aW9ucyA9IGtleUNvbnNpZGVyYXRpb25zOwotCQlrZXlDb25zaWRlcmF0aW9ucyA9IG5ld0tleUNvbnNpZGVyYXRpb25zOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUywKLQkJCQkJb2xkS2V5Q29uc2lkZXJhdGlvbnMsIGtleUNvbnNpZGVyYXRpb25zKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb25nUHJlc2VudGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIGxvbmdQcmVzZW50YXRpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvbmdQcmVzZW50YXRpb25OYW1lKFN0cmluZyBuZXdMb25nUHJlc2VudGF0aW9uTmFtZSkgewotCQlTdHJpbmcgb2xkTG9uZ1ByZXNlbnRhdGlvbk5hbWUgPSBsb25nUHJlc2VudGF0aW9uTmFtZTsKLQkJbG9uZ1ByZXNlbnRhdGlvbk5hbWUgPSBuZXdMb25nUHJlc2VudGF0aW9uTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJCQlvbGRMb25nUHJlc2VudGF0aW9uTmFtZSwgbG9uZ1ByZXNlbnRhdGlvbk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRTZWN0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzoKLQkJCXJldHVybiBnZXRTZWN0aW9ucygpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0RXh0ZXJuYWxJZCgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOgotCQkJcmV0dXJuIGdldEtleUNvbnNpZGVyYXRpb25zKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJcmV0dXJuIGdldExvbmdQcmVzZW50YXRpb25OYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT046Ci0JCQlzZXRNYWluRGVzY3JpcHRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM6Ci0JCQlnZXRTZWN0aW9ucygpLmNsZWFyKCk7Ci0JCQlnZXRTZWN0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2VjdGlvbj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJc2V0RXh0ZXJuYWxJZCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM6Ci0JCQlzZXRLZXlDb25zaWRlcmF0aW9ucygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJc2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT046Ci0JCQlzZXRNYWluRGVzY3JpcHRpb24oTUFJTl9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzoKLQkJCWdldFNlY3Rpb25zKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJc2V0RXh0ZXJuYWxJZChFWFRFUk5BTF9JRF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM6Ci0JCQlzZXRLZXlDb25zaWRlcmF0aW9ucyhLRVlfQ09OU0lERVJBVElPTlNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRToKLQkJCXNldExvbmdQcmVzZW50YXRpb25OYW1lKExPTkdfUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IG1haW5EZXNjcmlwdGlvbiAhPSBudWxsCi0JCQkJCTogIU1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKG1haW5EZXNjcmlwdGlvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzoKLQkJCXJldHVybiBzZWN0aW9ucyAhPSBudWxsICYmICFzZWN0aW9ucy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJCXJldHVybiBFWFRFUk5BTF9JRF9FREVGQVVMVCA9PSBudWxsID8gZXh0ZXJuYWxJZCAhPSBudWxsCi0JCQkJCTogIUVYVEVSTkFMX0lEX0VERUZBVUxULmVxdWFscyhleHRlcm5hbElkKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzoKLQkJCXJldHVybiBLRVlfQ09OU0lERVJBVElPTlNfRURFRkFVTFQgPT0gbnVsbCA/IGtleUNvbnNpZGVyYXRpb25zICE9IG51bGwKLQkJCQkJOiAhS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxULmVxdWFscyhrZXlDb25zaWRlcmF0aW9ucyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJcmV0dXJuIExPTkdfUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGxvbmdQcmVzZW50YXRpb25OYW1lICE9IG51bGwKLQkJCQkJOiAhTE9OR19QUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVAotCQkJCQkJCS5lcXVhbHMobG9uZ1ByZXNlbnRhdGlvbk5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG1haW5EZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtYWluRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4dGVybmFsSWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZXh0ZXJuYWxJZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwga2V5Q29uc2lkZXJhdGlvbnM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoa2V5Q29uc2lkZXJhdGlvbnMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxvbmdQcmVzZW50YXRpb25OYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGxvbmdQcmVzZW50YXRpb25OYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ29udGVudERlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnRlbnRFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnRlbnRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU5MzIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0U3VwcG9ydGluZ01hdGVyaWFscyA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0Q29uY2VwdHNBbmRQYXBlcnMgPGVtPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0Q2hlY2tsaXN0cyA8ZW0+Q2hlY2tsaXN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRHdWlkZWxpbmVzIDxlbT5HdWlkZWxpbmVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldEV4YW1wbGVzIDxlbT5FeGFtcGxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRBc3NldHMgPGVtPkFzc2V0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRUZXJtZGVmaW5pdGlvbiA8ZW0+VGVybWRlZmluaXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250ZW50RWxlbWVudEltcGwgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnRJbXBsCi0JCWltcGxlbWVudHMgQ29udGVudEVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5VHlwZSgpIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVmFyaWFiaWxpdHlUeXBlIFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQgPSBWYXJpYWJpbGl0eVR5cGUuTkE7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJpbGl0eUVsZW1lbnQgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1cHBvcnRpbmdNYXRlcmlhbHMoKSA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFN1cHBvcnRpbmdNYXRlcmlhbD4gc3VwcG9ydGluZ01hdGVyaWFsczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbmNlcHRzQW5kUGFwZXJzKCkgPGVtPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29uY2VwdHNBbmRQYXBlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxDb25jZXB0PiBjb25jZXB0c0FuZFBhcGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoZWNrbGlzdHMoKSA8ZW0+Q2hlY2tsaXN0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGVja2xpc3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Q2hlY2tsaXN0PiBjaGVja2xpc3RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3VpZGVsaW5lcygpIDxlbT5HdWlkZWxpbmVzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEd1aWRlbGluZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxHdWlkZWxpbmU+IGd1aWRlbGluZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGFtcGxlcygpIDxlbT5FeGFtcGxlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGFtcGxlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEV4YW1wbGU+IGV4YW1wbGVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzZXRzKCkgPGVtPkFzc2V0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBc3NldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxSZXVzYWJsZUFzc2V0PiBhc3NldHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZXJtZGVmaW5pdGlvbigpIDxlbT5UZXJtZGVmaW5pdGlvbjwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUZXJtZGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFRlcm1EZWZpbml0aW9uPiB0ZXJtZGVmaW5pdGlvbjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50RWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIG5ld1ZhcmlhYmlsaXR5VHlwZSkgewotCQlWYXJpYWJpbGl0eVR5cGUgb2xkVmFyaWFiaWxpdHlUeXBlID0gdmFyaWFiaWxpdHlUeXBlOwotCQl2YXJpYWJpbGl0eVR5cGUgPSBuZXdWYXJpYWJpbGl0eVR5cGUgPT0gbnVsbCA/IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQKLQkJCQk6IG5ld1ZhcmlhYmlsaXR5VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUsCi0JCQkJCW9sZFZhcmlhYmlsaXR5VHlwZSwgdmFyaWFiaWxpdHlUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5RWxlbWVudCBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlpZiAodmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCAhPSBudWxsCi0JCQkJJiYgKChFT2JqZWN0KSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IChJbnRlcm5hbEVPYmplY3QpIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZVJlc29sdmVQcm94eShvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KTsKLQkJCWlmICh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQsCi0JCQkJCQkJb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCwKLQkJCQkJCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5RWxlbWVudCBiYXNpY0dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoCi0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkgewotCQlWYXJpYWJpbGl0eUVsZW1lbnQgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCXZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSBuZXdWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwKLQkJCQkJb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCwgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PENvbmNlcHQ+IGdldENvbmNlcHRzQW5kUGFwZXJzKCkgewotCQlpZiAoY29uY2VwdHNBbmRQYXBlcnMgPT0gbnVsbCkgewotCQkJY29uY2VwdHNBbmRQYXBlcnMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PENvbmNlcHQ+KAotCQkJCQlDb25jZXB0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbmNlcHRzQW5kUGFwZXJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PENoZWNrbGlzdD4gZ2V0Q2hlY2tsaXN0cygpIHsKLQkJaWYgKGNoZWNrbGlzdHMgPT0gbnVsbCkgewotCQkJY2hlY2tsaXN0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Q2hlY2tsaXN0PihDaGVja2xpc3QuY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTKTsKLQkJfQotCQlyZXR1cm4gY2hlY2tsaXN0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxHdWlkZWxpbmU+IGdldEd1aWRlbGluZXMoKSB7Ci0JCWlmIChndWlkZWxpbmVzID09IG51bGwpIHsKLQkJCWd1aWRlbGluZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEd1aWRlbGluZT4oR3VpZGVsaW5lLmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUyk7Ci0JCX0KLQkJcmV0dXJuIGd1aWRlbGluZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RXhhbXBsZT4gZ2V0RXhhbXBsZXMoKSB7Ci0JCWlmIChleGFtcGxlcyA9PSBudWxsKSB7Ci0JCQlleGFtcGxlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8RXhhbXBsZT4oRXhhbXBsZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTKTsKLQkJfQotCQlyZXR1cm4gZXhhbXBsZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8UmV1c2FibGVBc3NldD4gZ2V0QXNzZXRzKCkgewotCQlpZiAoYXNzZXRzID09IG51bGwpIHsKLQkJCWFzc2V0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8UmV1c2FibGVBc3NldD4oCi0JCQkJCVJldXNhYmxlQXNzZXQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19BU1NFVFMpOwotCQl9Ci0JCXJldHVybiBhc3NldHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8VGVybURlZmluaXRpb24+IGdldFRlcm1kZWZpbml0aW9uKCkgewotCQlpZiAodGVybWRlZmluaXRpb24gPT0gbnVsbCkgewotCQkJdGVybWRlZmluaXRpb24gPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFRlcm1EZWZpbml0aW9uPigKLQkJCQkJVGVybURlZmluaXRpb24uY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19URVJNREVGSU5JVElPTik7Ci0JCX0KLQkJcmV0dXJuIHRlcm1kZWZpbml0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOgotCQkJcmV0dXJuIGdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzoKLQkJCXJldHVybiBnZXRDb25jZXB0c0FuZFBhcGVycygpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTOgotCQkJcmV0dXJuIGdldENoZWNrbGlzdHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUzoKLQkJCXJldHVybiBnZXRHdWlkZWxpbmVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTOgotCQkJcmV0dXJuIGdldEV4YW1wbGVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0FTU0VUUzoKLQkJCXJldHVybiBnZXRBc3NldHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVEVSTURFRklOSVRJT046Ci0JCQlyZXR1cm4gZ2V0VGVybWRlZmluaXRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJc2V0VmFyaWFiaWxpdHlUeXBlKChWYXJpYWJpbGl0eVR5cGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKFZhcmlhYmlsaXR5RWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzoKLQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5jbGVhcigpOwotCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFN1cHBvcnRpbmdNYXRlcmlhbD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzoKLQkJCWdldENvbmNlcHRzQW5kUGFwZXJzKCkuY2xlYXIoKTsKLQkJCWdldENvbmNlcHRzQW5kUGFwZXJzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29uY2VwdD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUUzoKLQkJCWdldENoZWNrbGlzdHMoKS5jbGVhcigpOwotCQkJZ2V0Q2hlY2tsaXN0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ2hlY2tsaXN0PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTOgotCQkJZ2V0R3VpZGVsaW5lcygpLmNsZWFyKCk7Ci0JCQlnZXRHdWlkZWxpbmVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBHdWlkZWxpbmU+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTOgotCQkJZ2V0RXhhbXBsZXMoKS5jbGVhcigpOwotCQkJZ2V0RXhhbXBsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEV4YW1wbGU+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0FTU0VUUzoKLQkJCWdldEFzc2V0cygpLmNsZWFyKCk7Ci0JCQlnZXRBc3NldHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFJldXNhYmxlQXNzZXQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1RFUk1ERUZJTklUSU9OOgotCQkJZ2V0VGVybWRlZmluaXRpb24oKS5jbGVhcigpOwotCQkJZ2V0VGVybWRlZmluaXRpb24oKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUZXJtRGVmaW5pdGlvbj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlzZXRWYXJpYWJpbGl0eVR5cGUoVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KChWYXJpYWJpbGl0eUVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzoKLQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTOgotCQkJZ2V0Q29uY2VwdHNBbmRQYXBlcnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTOgotCQkJZ2V0Q2hlY2tsaXN0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dVSURFTElORVM6Ci0JCQlnZXRHdWlkZWxpbmVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRVM6Ci0JCQlnZXRFeGFtcGxlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0FTU0VUUzoKLQkJCWdldEFzc2V0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1RFUk1ERUZJTklUSU9OOgotCQkJZ2V0VGVybWRlZmluaXRpb24oKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlICE9IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQ7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzoKLQkJCXJldHVybiBzdXBwb3J0aW5nTWF0ZXJpYWxzICE9IG51bGwKLQkJCQkJJiYgIXN1cHBvcnRpbmdNYXRlcmlhbHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTOgotCQkJcmV0dXJuIGNvbmNlcHRzQW5kUGFwZXJzICE9IG51bGwgJiYgIWNvbmNlcHRzQW5kUGFwZXJzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUUzoKLQkJCXJldHVybiBjaGVja2xpc3RzICE9IG51bGwgJiYgIWNoZWNrbGlzdHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTOgotCQkJcmV0dXJuIGd1aWRlbGluZXMgIT0gbnVsbCAmJiAhZ3VpZGVsaW5lcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTOgotCQkJcmV0dXJuIGV4YW1wbGVzICE9IG51bGwgJiYgIWV4YW1wbGVzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQVNTRVRTOgotCQkJcmV0dXJuIGFzc2V0cyAhPSBudWxsICYmICFhc3NldHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19URVJNREVGSU5JVElPTjoKLQkJCXJldHVybiB0ZXJtZGVmaW5pdGlvbiAhPSBudWxsICYmICF0ZXJtZGVmaW5pdGlvbi5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFN1cHBvcnRpbmdNYXRlcmlhbD4gZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpIHsKLQkJaWYgKHN1cHBvcnRpbmdNYXRlcmlhbHMgPT0gbnVsbCkgewotCQkJc3VwcG9ydGluZ01hdGVyaWFscyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8U3VwcG9ydGluZ01hdGVyaWFsPigKLQkJCQkJU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFMpOwotCQl9Ci0JCXJldHVybiBzdXBwb3J0aW5nTWF0ZXJpYWxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBWYXJpYWJpbGl0eUVsZW1lbnQuY2xhc3MpIHsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBWYXJpYWJpbGl0eUVsZW1lbnQuY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmFyaWFiaWxpdHlUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHZhcmlhYmlsaXR5VHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8vCi0JLy8gU3RhcnQgY3VzdG9tIGNvZGUKLQkvLwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwjc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKHByZXNlbnRhdGlvbiA9PSBudWxsKSB7Ci0JCQlzdXBlci5zZXROYW1lKG5ld05hbWUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQlzdXBlci5zZXROYW1lKG5ld05hbWUpOwotCQlpZiAobmV3TmFtZSAhPSBudWxsICYmICFuZXdOYW1lLmVxdWFscyhvbGROYW1lKSkgewotCQkJcHJlc2VudGF0aW9uLnNldE5hbWUoVW1hVXRpbC5jcmVhdGVDb250ZW50RGVzY3JpcHRpb25OYW1lKHRoaXMpKTsKLQkJfQotCX0KLQotfSAvL0NvbnRlbnRFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnRlbnRQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnRlbnRQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjJhZmIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50UGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwjZ2V0Q29udGVudEVsZW1lbnRzIDxlbT5Db250ZW50IEVsZW1lbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFBhY2thZ2VJbXBsIGV4dGVuZHMgTWV0aG9kUGFja2FnZUltcGwgaW1wbGVtZW50cwotCQlDb250ZW50UGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250ZW50RWxlbWVudHMoKSA8ZW0+Q29udGVudCBFbGVtZW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxDb250ZW50RWxlbWVudD4gY29udGVudEVsZW1lbnRzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnRQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PENvbnRlbnRFbGVtZW50PiBnZXRDb250ZW50RWxlbWVudHMoKSB7Ci0JCWlmIChjb250ZW50RWxlbWVudHMgPT0gbnVsbCkgewotCQkJY29udGVudEVsZW1lbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxDb250ZW50RWxlbWVudD4oCi0JCQkJCUNvbnRlbnRFbGVtZW50LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRFbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0Q29udGVudEVsZW1lbnRzKCkpLmJhc2ljUmVtb3ZlKAotCQkJCQlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzoKLQkJCXJldHVybiBnZXRDb250ZW50RWxlbWVudHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTOgotCQkJZ2V0Q29udGVudEVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCWdldENvbnRlbnRFbGVtZW50cygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRlbnRFbGVtZW50PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzoKLQkJCWdldENvbnRlbnRFbGVtZW50cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzoKLQkJCXJldHVybiBjb250ZW50RWxlbWVudHMgIT0gbnVsbCAmJiAhY29udGVudEVsZW1lbnRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vQ29udGVudFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMThjYTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZUltcGwjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCBleHRlbmRzIFNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCi0JCWltcGxlbWVudHMgQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudCgpIDxlbT5FbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudCBlbGVtZW50OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiAoKEVPYmplY3QpIGVsZW1lbnQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRFbGVtZW50ID0gKEludGVybmFsRU9iamVjdCkgZWxlbWVudDsKLQkJCWVsZW1lbnQgPSAoRWxlbWVudCkgZVJlc29sdmVQcm94eShvbGRFbGVtZW50KTsKLQkJCWlmIChlbGVtZW50ICE9IG9sZEVsZW1lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQsCi0JCQkJCQkJb2xkRWxlbWVudCwgZWxlbWVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbGVtZW50IGJhc2ljR2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChFbGVtZW50IG5ld0VsZW1lbnQpIHsKLQkJRWxlbWVudCBvbGRFbGVtZW50ID0gZWxlbWVudDsKLQkJZWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQsIG9sZEVsZW1lbnQsCi0JCQkJCWVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UOgotCQkJc2V0RWxlbWVudCgoRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UOgotCQkJc2V0RWxlbWVudCgoRWxlbWVudCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UOgotCQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ3VzdG9tQ2F0ZWdvcnlJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ3VzdG9tQ2F0ZWdvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZTZkNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0N1c3RvbUNhdGVnb3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DdXN0b20gQ2F0ZWdvcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cyA8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwjZ2V0U3ViQ2F0ZWdvcmllcyA8ZW0+U3ViIENhdGVnb3JpZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yeUltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMKLQkJQ3VzdG9tQ2F0ZWdvcnkgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpIDxlbT5DYXRlZ29yaXplZCBFbGVtZW50czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RGVzY3JpYmFibGVFbGVtZW50PiBjYXRlZ29yaXplZEVsZW1lbnRzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3ViQ2F0ZWdvcmllcygpIDxlbT5TdWIgQ2F0ZWdvcmllczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJDYXRlZ29yaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Q29udGVudENhdGVnb3J5PiBzdWJDYXRlZ29yaWVzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEN1c3RvbUNhdGVnb3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PERlc2NyaWJhYmxlRWxlbWVudD4gZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpIHsKLQkJaWYgKGNhdGVnb3JpemVkRWxlbWVudHMgPT0gbnVsbCkgewotCQkJY2F0ZWdvcml6ZWRFbGVtZW50cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8RGVzY3JpYmFibGVFbGVtZW50PigKLQkJCQkJRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFMpOwotCQl9Ci0JCXJldHVybiBjYXRlZ29yaXplZEVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PENvbnRlbnRDYXRlZ29yeT4gZ2V0U3ViQ2F0ZWdvcmllcygpIHsKLQkJaWYgKHN1YkNhdGVnb3JpZXMgPT0gbnVsbCkgewotCQkJc3ViQ2F0ZWdvcmllcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Q29udGVudENhdGVnb3J5PigKLQkJCQkJQ29udGVudENhdGVnb3J5LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JJRVMpOwotCQl9Ci0JCXJldHVybiBzdWJDYXRlZ29yaWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFM6Ci0JCQlyZXR1cm4gZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUklFUzoKLQkJCXJldHVybiBnZXRTdWJDYXRlZ29yaWVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFM6Ci0JCQlnZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCWdldENhdGVnb3JpemVkRWxlbWVudHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SSUVTOgotCQkJZ2V0U3ViQ2F0ZWdvcmllcygpLmNsZWFyKCk7Ci0JCQlnZXRTdWJDYXRlZ29yaWVzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29udGVudENhdGVnb3J5PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFM6Ci0JCQlnZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JJRVM6Ci0JCQlnZXRTdWJDYXRlZ29yaWVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUzoKLQkJCXJldHVybiBjYXRlZ29yaXplZEVsZW1lbnRzICE9IG51bGwKLQkJCQkJJiYgIWNhdGVnb3JpemVkRWxlbWVudHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUklFUzoKLQkJCXJldHVybiBzdWJDYXRlZ29yaWVzICE9IG51bGwgJiYgIXN1YkNhdGVnb3JpZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9DdXN0b21DYXRlZ29yeUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYTIwYTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCNnZXRFeHRlcm5hbERlc2NyaXB0aW9uIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsI2dldFBhY2thZ2luZ0d1aWRhbmNlIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsCi0JCWltcGxlbWVudHMgRGVsaXZlcmFibGVEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfREVTQ1JJUFRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKSA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXh0ZXJuYWxEZXNjcmlwdGlvbiA9IEVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhY2thZ2luZ0d1aWRhbmNlKCkgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0lOR19HVUlEQU5DRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFja2FnaW5nR3VpZGFuY2UoKSA8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYWNrYWdpbmdHdWlkYW5jZSA9IFBBQ0tBR0lOR19HVUlEQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUkFCTEVfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbERlc2NyaXB0aW9uKFN0cmluZyBuZXdFeHRlcm5hbERlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRFeHRlcm5hbERlc2NyaXB0aW9uID0gZXh0ZXJuYWxEZXNjcmlwdGlvbjsKLQkJZXh0ZXJuYWxEZXNjcmlwdGlvbiA9IG5ld0V4dGVybmFsRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OLAotCQkJCQlvbGRFeHRlcm5hbERlc2NyaXB0aW9uLCBleHRlcm5hbERlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdpbmdHdWlkYW5jZSgpIHsKLQkJcmV0dXJuIHBhY2thZ2luZ0d1aWRhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhY2thZ2luZ0d1aWRhbmNlKFN0cmluZyBuZXdQYWNrYWdpbmdHdWlkYW5jZSkgewotCQlTdHJpbmcgb2xkUGFja2FnaW5nR3VpZGFuY2UgPSBwYWNrYWdpbmdHdWlkYW5jZTsKLQkJcGFja2FnaW5nR3VpZGFuY2UgPSBuZXdQYWNrYWdpbmdHdWlkYW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFLAotCQkJCQlvbGRQYWNrYWdpbmdHdWlkYW5jZSwgcGFja2FnaW5nR3VpZGFuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRToKLQkJCXJldHVybiBnZXRQYWNrYWdpbmdHdWlkYW5jZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT046Ci0JCQlzZXRFeHRlcm5hbERlc2NyaXB0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0U6Ci0JCQlzZXRQYWNrYWdpbmdHdWlkYW5jZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OOgotCQkJc2V0RXh0ZXJuYWxEZXNjcmlwdGlvbihFWFRFUk5BTF9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFOgotCQkJc2V0UGFja2FnaW5nR3VpZGFuY2UoUEFDS0FHSU5HX0dVSURBTkNFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIEVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBleHRlcm5hbERlc2NyaXB0aW9uICE9IG51bGwKLQkJCQkJOiAhRVhURVJOQUxfREVTQ1JJUFRJT05fRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKGV4dGVybmFsRGVzY3JpcHRpb24pOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRToKLQkJCXJldHVybiBQQUNLQUdJTkdfR1VJREFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHBhY2thZ2luZ0d1aWRhbmNlICE9IG51bGwKLQkJCQkJOiAhUEFDS0FHSU5HX0dVSURBTkNFX0VERUZBVUxULmVxdWFscyhwYWNrYWdpbmdHdWlkYW5jZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZXh0ZXJuYWxEZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChleHRlcm5hbERlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYWNrYWdpbmdHdWlkYW5jZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwYWNrYWdpbmdHdWlkYW5jZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVsaXZlcmFibGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVsaXZlcmFibGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNTIwYTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJhYmxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJhYmxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcmFibGVJbXBsI2dldERlbGl2ZXJlZFdvcmtQcm9kdWN0cyA8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyYWJsZUltcGwgZXh0ZW5kcyBXb3JrUHJvZHVjdEltcGwgaW1wbGVtZW50cyBEZWxpdmVyYWJsZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSA8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3Q+IGRlbGl2ZXJlZFdvcmtQcm9kdWN0czsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyYWJsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJBQkxFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFdvcmtQcm9kdWN0PiBnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSB7Ci0JCWlmIChkZWxpdmVyZWRXb3JrUHJvZHVjdHMgPT0gbnVsbCkgewotCQkJZGVsaXZlcmVkV29ya1Byb2R1Y3RzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxXb3JrUHJvZHVjdD4oCi0JCQkJCVdvcmtQcm9kdWN0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUUyk7Ci0JCX0KLQkJcmV0dXJuIGRlbGl2ZXJlZFdvcmtQcm9kdWN0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFM6Ci0JCQlyZXR1cm4gZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUUzoKLQkJCWdldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpLmNsZWFyKCk7Ci0JCQlnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFM6Ci0JCQlnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFM6Ci0JCQlyZXR1cm4gZGVsaXZlcmVkV29ya1Byb2R1Y3RzICE9IG51bGwKLQkJCQkJJiYgIWRlbGl2ZXJlZFdvcmtQcm9kdWN0cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0RlbGl2ZXJhYmxlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWE5MTJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0Umlza0xldmVsIDxlbT5SaXNrIExldmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldEVzdGltYXRpbmdUZWNobmlxdWUgPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UgPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRUeXBlT2ZDb250cmFjdCA8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCBleHRlbmRzIFByb2Nlc3NEZXNjcmlwdGlvbkltcGwKLQkJaW1wbGVtZW50cyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NhbGUoKSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0FMRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NhbGUoKSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNjYWxlID0gU0NBTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpIDxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1NfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvamVjdENoYXJhY3RlcmlzdGljcyA9IFBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJpc2tMZXZlbCgpIDxlbT5SaXNrIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSaXNrTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJJU0tfTEVWRUxfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJpc2tMZXZlbCgpIDxlbT5SaXNrIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSaXNrTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmlza0xldmVsID0gUklTS19MRVZFTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkgPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFU1RJTUFUSU5HX1RFQ0hOSVFVRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlc3RpbWF0aW5nVGVjaG5pcXVlID0gRVNUSU1BVElOR19URUNITklRVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvamVjdE1lbWJlckV4cGVydGlzZSA9IFBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlT2ZDb250cmFjdCgpIDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlT2ZDb250cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9PRl9DT05UUkFDVF9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZU9mQ29udHJhY3QoKSA8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZU9mQ29udHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZU9mQ29udHJhY3QgPSBUWVBFX09GX0NPTlRSQUNUX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNjYWxlKCkgewotCQlyZXR1cm4gc2NhbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NhbGUoU3RyaW5nIG5ld1NjYWxlKSB7Ci0JCVN0cmluZyBvbGRTY2FsZSA9IHNjYWxlOwotCQlzY2FsZSA9IG5ld1NjYWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFLCBvbGRTY2FsZSwKLQkJCQkJc2NhbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSB7Ci0JCXJldHVybiBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoU3RyaW5nIG5ld1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MpIHsKLQkJU3RyaW5nIG9sZFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPSBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzOwotCQlwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzID0gbmV3UHJvamVjdENoYXJhY3RlcmlzdGljczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCXRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1MsCi0JCQkJCW9sZFByb2plY3RDaGFyYWN0ZXJpc3RpY3MsIHByb2plY3RDaGFyYWN0ZXJpc3RpY3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJpc2tMZXZlbCgpIHsKLQkJcmV0dXJuIHJpc2tMZXZlbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSaXNrTGV2ZWwoU3RyaW5nIG5ld1Jpc2tMZXZlbCkgewotCQlTdHJpbmcgb2xkUmlza0xldmVsID0gcmlza0xldmVsOwotCQlyaXNrTGV2ZWwgPSBuZXdSaXNrTGV2ZWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTCwKLQkJCQkJb2xkUmlza0xldmVsLCByaXNrTGV2ZWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVzdGltYXRpbmdUZWNobmlxdWUoKSB7Ci0JCXJldHVybiBlc3RpbWF0aW5nVGVjaG5pcXVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVzdGltYXRpbmdUZWNobmlxdWUoU3RyaW5nIG5ld0VzdGltYXRpbmdUZWNobmlxdWUpIHsKLQkJU3RyaW5nIG9sZEVzdGltYXRpbmdUZWNobmlxdWUgPSBlc3RpbWF0aW5nVGVjaG5pcXVlOwotCQllc3RpbWF0aW5nVGVjaG5pcXVlID0gbmV3RXN0aW1hdGluZ1RlY2huaXF1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCXRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUsCi0JCQkJCW9sZEVzdGltYXRpbmdUZWNobmlxdWUsIGVzdGltYXRpbmdUZWNobmlxdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKSB7Ci0JCXJldHVybiBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoU3RyaW5nIG5ld1Byb2plY3RNZW1iZXJFeHBlcnRpc2UpIHsKLQkJU3RyaW5nIG9sZFByb2plY3RNZW1iZXJFeHBlcnRpc2UgPSBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlOwotCQlwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlID0gbmV3UHJvamVjdE1lbWJlckV4cGVydGlzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCXRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFLAotCQkJCQlvbGRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlLCBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlT2ZDb250cmFjdCgpIHsKLQkJcmV0dXJuIHR5cGVPZkNvbnRyYWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGVPZkNvbnRyYWN0KFN0cmluZyBuZXdUeXBlT2ZDb250cmFjdCkgewotCQlTdHJpbmcgb2xkVHlwZU9mQ29udHJhY3QgPSB0eXBlT2ZDb250cmFjdDsKLQkJdHlwZU9mQ29udHJhY3QgPSBuZXdUeXBlT2ZDb250cmFjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNULAotCQkJCQlvbGRUeXBlT2ZDb250cmFjdCwgdHlwZU9mQ29udHJhY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRToKLQkJCXJldHVybiBnZXRTY2FsZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1M6Ci0JCQlyZXR1cm4gZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTDoKLQkJCXJldHVybiBnZXRSaXNrTGV2ZWwoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFOgotCQkJcmV0dXJuIGdldEVzdGltYXRpbmdUZWNobmlxdWUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCXJldHVybiBnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUOgotCQkJcmV0dXJuIGdldFR5cGVPZkNvbnRyYWN0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFOgotCQkJc2V0U2NhbGUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1M6Ci0JCQlzZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUw6Ci0JCQlzZXRSaXNrTGV2ZWwoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCQlzZXRFc3RpbWF0aW5nVGVjaG5pcXVlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCXNldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVDoKLQkJCXNldFR5cGVPZkNvbnRyYWN0KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRToKLQkJCXNldFNjYWxlKFNDQUxFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTOgotCQkJc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyhQUk9KRUNUX0NIQVJBQ1RFUklTVElDU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMOgotCQkJc2V0Umlza0xldmVsKFJJU0tfTEVWRUxfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCQlzZXRFc3RpbWF0aW5nVGVjaG5pcXVlKEVTVElNQVRJTkdfVEVDSE5JUVVFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCXNldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1Q6Ci0JCQlzZXRUeXBlT2ZDb250cmFjdChUWVBFX09GX0NPTlRSQUNUX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEU6Ci0JCQlyZXR1cm4gU0NBTEVfRURFRkFVTFQgPT0gbnVsbCA/IHNjYWxlICE9IG51bGwgOiAhU0NBTEVfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhzY2FsZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUzoKLQkJCXJldHVybiBQUk9KRUNUX0NIQVJBQ1RFUklTVElDU19FREVGQVVMVCA9PSBudWxsID8gcHJvamVjdENoYXJhY3RlcmlzdGljcyAhPSBudWxsCi0JCQkJCTogIVBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUw6Ci0JCQlyZXR1cm4gUklTS19MRVZFTF9FREVGQVVMVCA9PSBudWxsID8gcmlza0xldmVsICE9IG51bGwKLQkJCQkJOiAhUklTS19MRVZFTF9FREVGQVVMVC5lcXVhbHMocmlza0xldmVsKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFOgotCQkJcmV0dXJuIEVTVElNQVRJTkdfVEVDSE5JUVVFX0VERUZBVUxUID09IG51bGwgPyBlc3RpbWF0aW5nVGVjaG5pcXVlICE9IG51bGwKLQkJCQkJOiAhRVNUSU1BVElOR19URUNITklRVUVfRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKGVzdGltYXRpbmdUZWNobmlxdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFOgotCQkJcmV0dXJuIFBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVCA9PSBudWxsID8gcHJvamVjdE1lbWJlckV4cGVydGlzZSAhPSBudWxsCi0JCQkJCTogIVBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVAotCQkJCQkJCS5lcXVhbHMocHJvamVjdE1lbWJlckV4cGVydGlzZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUOgotCQkJcmV0dXJuIFRZUEVfT0ZfQ09OVFJBQ1RfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGVPZkNvbnRyYWN0ICE9IG51bGwKLQkJCQkJOiAhVFlQRV9PRl9DT05UUkFDVF9FREVGQVVMVC5lcXVhbHModHlwZU9mQ29udHJhY3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNjYWxlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNjYWxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHByb2plY3RDaGFyYWN0ZXJpc3RpY3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJpc2tMZXZlbDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyaXNrTGV2ZWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVzdGltYXRpbmdUZWNobmlxdWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZXN0aW1hdGluZ1RlY2huaXF1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJvamVjdE1lbWJlckV4cGVydGlzZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0eXBlT2ZDb250cmFjdDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh0eXBlT2ZDb250cmFjdCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZTM4MGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJ5IFByb2Nlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsI2dldEVkdWNhdGlvbk1hdGVyaWFscyA8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwjZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMgPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJ5UHJvY2Vzc0ltcGwgZXh0ZW5kcyBQcm9jZXNzSW1wbCBpbXBsZW1lbnRzIERlbGl2ZXJ5UHJvY2VzcyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFZHVjYXRpb25NYXRlcmlhbHMoKSA8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFZHVjYXRpb25NYXRlcmlhbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdXBwb3J0aW5nTWF0ZXJpYWw+IGVkdWNhdGlvbk1hdGVyaWFsczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbW11bmljYXRpb25zTWF0ZXJpYWxzKCkgPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFN1cHBvcnRpbmdNYXRlcmlhbD4gY29tbXVuaWNhdGlvbnNNYXRlcmlhbHM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVsaXZlcnlQcm9jZXNzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxTdXBwb3J0aW5nTWF0ZXJpYWw+IGdldEVkdWNhdGlvbk1hdGVyaWFscygpIHsKLQkJaWYgKGVkdWNhdGlvbk1hdGVyaWFscyA9PSBudWxsKSB7Ci0JCQllZHVjYXRpb25NYXRlcmlhbHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFN1cHBvcnRpbmdNYXRlcmlhbD4oCi0JCQkJCVN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUxTKTsKLQkJfQotCQlyZXR1cm4gZWR1Y2F0aW9uTWF0ZXJpYWxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFN1cHBvcnRpbmdNYXRlcmlhbD4gZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKSB7Ci0JCWlmIChjb21tdW5pY2F0aW9uc01hdGVyaWFscyA9PSBudWxsKSB7Ci0JCQljb21tdW5pY2F0aW9uc01hdGVyaWFscyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8U3VwcG9ydGluZ01hdGVyaWFsPigKLQkJCQkJU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbW11bmljYXRpb25zTWF0ZXJpYWxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTFM6Ci0JCQlyZXR1cm4gZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFM6Ci0JCQlyZXR1cm4gZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUzoKLQkJCWdldEVkdWNhdGlvbk1hdGVyaWFscygpLmNsZWFyKCk7Ci0JCQlnZXRFZHVjYXRpb25NYXRlcmlhbHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdXBwb3J0aW5nTWF0ZXJpYWw+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFM6Ci0JCQlnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpLmNsZWFyKCk7Ci0JCQlnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFN1cHBvcnRpbmdNYXRlcmlhbD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUxTOgotCQkJZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMUzoKLQkJCWdldENvbW11bmljYXRpb25zTWF0ZXJpYWxzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUzoKLQkJCXJldHVybiBlZHVjYXRpb25NYXRlcmlhbHMgIT0gbnVsbCAmJiAhZWR1Y2F0aW9uTWF0ZXJpYWxzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMUzoKLQkJCXJldHVybiBjb21tdW5pY2F0aW9uc01hdGVyaWFscyAhPSBudWxsCi0JCQkJCSYmICFjb21tdW5pY2F0aW9uc01hdGVyaWFscy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0RlbGl2ZXJ5UHJvY2Vzc0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZXNjcmliYWJsZUVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVzY3JpYmFibGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDE1YTRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZXNjcmliYWJsZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmliYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCNnZXRJc0Fic3RyYWN0IDxlbT5JcyBBYnN0cmFjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsI2dldFNoYXBlaWNvbiA8ZW0+U2hhcGVpY29uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCNnZXROb2RlaWNvbiA8ZW0+Tm9kZWljb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZXNjcmliYWJsZUVsZW1lbnRJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwKLQkJaW1wbGVtZW50cyBEZXNjcmliYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzQWJzdHJhY3QoKSA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzQWJzdHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19BQlNUUkFDVF9FREVGQVVMVCA9IEJvb2xlYW4uRkFMU0U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc0Fic3RyYWN0KCkgPGVtPklzIEFic3RyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc0Fic3RyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc0Fic3RyYWN0ID0gSVNfQUJTVFJBQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50YXRpb24oKSA8ZW0+UHJlc2VudGF0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50RGVzY3JpcHRpb24gcHJlc2VudGF0aW9uOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNoYXBlaWNvbigpIDxlbT5TaGFwZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNoYXBlaWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVUkkgU0hBUEVJQ09OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNoYXBlaWNvbigpIDxlbT5TaGFwZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNoYXBlaWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFVSSSBzaGFwZWljb24gPSBTSEFQRUlDT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm9kZWljb24oKSA8ZW0+Tm9kZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vZGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFVSSSBOT0RFSUNPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb2RlaWNvbigpIDxlbT5Ob2RlaWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm9kZWljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBVUkkgbm9kZWljb24gPSBOT0RFSUNPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmliYWJsZUVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElzQWJzdHJhY3QoKSB7Ci0JCXJldHVybiBpc0Fic3RyYWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzQWJzdHJhY3QoQm9vbGVhbiBuZXdJc0Fic3RyYWN0KSB7Ci0JCUJvb2xlYW4gb2xkSXNBYnN0cmFjdCA9IGlzQWJzdHJhY3Q7Ci0JCWlzQWJzdHJhY3QgPSBuZXdJc0Fic3RyYWN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNULCBvbGRJc0Fic3RyYWN0LAotCQkJCQlpc0Fic3RyYWN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJlc2VudGF0aW9uKAotCQkJQ29udGVudERlc2NyaXB0aW9uIG5ld1ByZXNlbnRhdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlDb250ZW50RGVzY3JpcHRpb24gb2xkUHJlc2VudGF0aW9uID0gcHJlc2VudGF0aW9uOwotCQlwcmVzZW50YXRpb24gPSBuZXdQcmVzZW50YXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCQlvbGRQcmVzZW50YXRpb24sIG5ld1ByZXNlbnRhdGlvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVVJJIGdldFNoYXBlaWNvbigpIHsKLQkJcmV0dXJuIHNoYXBlaWNvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaGFwZWljb24oVVJJIG5ld1NoYXBlaWNvbikgewotCQlVUkkgb2xkU2hhcGVpY29uID0gc2hhcGVpY29uOwotCQlzaGFwZWljb24gPSBuZXdTaGFwZWljb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OLCBvbGRTaGFwZWljb24sCi0JCQkJCXNoYXBlaWNvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVUkkgZ2V0Tm9kZWljb24oKSB7Ci0JCXJldHVybiBub2RlaWNvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb2RlaWNvbihVUkkgbmV3Tm9kZWljb24pIHsKLQkJVVJJIG9sZE5vZGVpY29uID0gbm9kZWljb247Ci0JCW5vZGVpY29uID0gbmV3Tm9kZWljb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT04sIG9sZE5vZGVpY29uLAotCQkJCQlub2RlaWNvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQlyZXR1cm4gYmFzaWNTZXRQcmVzZW50YXRpb24obnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNUOgotCQkJcmV0dXJuIGdldElzQWJzdHJhY3QoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRQcmVzZW50YXRpb24oKTsKLQkJCXJldHVybiBiYXNpY0dldFByZXNlbnRhdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOgotCQkJcmV0dXJuIGdldFNoYXBlaWNvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT046Ci0JCQlyZXR1cm4gZ2V0Tm9kZWljb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q6Ci0JCQlzZXRJc0Fic3RyYWN0KChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQlzZXRQcmVzZW50YXRpb24oKENvbnRlbnREZXNjcmlwdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOgotCQkJc2V0U2hhcGVpY29uKChVUkkpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJc2V0Tm9kZWljb24oKFVSSSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNUOgotCQkJc2V0SXNBYnN0cmFjdChJU19BQlNUUkFDVF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQlzZXRQcmVzZW50YXRpb24oKENvbnRlbnREZXNjcmlwdGlvbikgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT046Ci0JCQlzZXRTaGFwZWljb24oU0hBUEVJQ09OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJc2V0Tm9kZWljb24oTk9ERUlDT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDoKLQkJCXJldHVybiBJU19BQlNUUkFDVF9FREVGQVVMVCA9PSBudWxsID8gaXNBYnN0cmFjdCAhPSBudWxsCi0JCQkJCTogIUlTX0FCU1RSQUNUX0VERUZBVUxULmVxdWFscyhpc0Fic3RyYWN0KTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCXJldHVybiBwcmVzZW50YXRpb24gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjoKLQkJCXJldHVybiBTSEFQRUlDT05fRURFRkFVTFQgPT0gbnVsbCA/IHNoYXBlaWNvbiAhPSBudWxsCi0JCQkJCTogIVNIQVBFSUNPTl9FREVGQVVMVC5lcXVhbHMoc2hhcGVpY29uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJcmV0dXJuIE5PREVJQ09OX0VERUZBVUxUID09IG51bGwgPyBub2RlaWNvbiAhPSBudWxsCi0JCQkJCTogIU5PREVJQ09OX0VERUZBVUxULmVxdWFscyhub2RlaWNvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBUeXBlLmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gQ2xhc3NpZmllci5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuQ0xBU1NJRklFUl9fSVNfQUJTVFJBQ1Q7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IFR5cGUuY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBDbGFzc2lmaWVyLmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DTEFTU0lGSUVSX19JU19BQlNUUkFDVDoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzQWJzdHJhY3Q6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNBYnN0cmFjdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2hhcGVpY29uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNoYXBlaWNvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbm9kZWljb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobm9kZWljb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLwotCS8vIFN0YXJ0IGN1c3RvbSBjb2RlCi0JLy8KLQotCXB1YmxpYyBDb250ZW50RGVzY3JpcHRpb24gYmFzaWNHZXRQcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiBwcmVzZW50YXRpb247Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwjZ2V0UHJlc2VudGF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgQ29udGVudERlc2NyaXB0aW9uIGdldFByZXNlbnRhdGlvbigpIHsKLQkJaWYgKHByZXNlbnRhdGlvbiBpbnN0YW5jZW9mIEVPYmplY3QKLQkJCQkmJiAoKEVPYmplY3QpIHByZXNlbnRhdGlvbikuZUlzUHJveHkoKSkgewotCQkJQ29udGVudERlc2NyaXB0aW9uIG9sZFByZXNlbnRhdGlvbiA9IHByZXNlbnRhdGlvbjsKLQkJCXByZXNlbnRhdGlvbiA9IChDb250ZW50RGVzY3JpcHRpb24pIGVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCkgcHJlc2VudGF0aW9uKTsKLQkJCWlmIChwcmVzZW50YXRpb24gIT0gb2xkUHJlc2VudGF0aW9uKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQkJCQlvbGRQcmVzZW50YXRpb24sIHByZXNlbnRhdGlvbikpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByZXNlbnRhdGlvbiA9PSBudWxsKSB7Ci0JCQkvLwkJCXNldFByZXNlbnRhdGlvbihDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbih0aGlzKSk7Ci0JCQlpZiAoZW1wdHlQcmVzZW50YXRpb24gPT0gbnVsbCkgewotCQkJCWVtcHR5UHJlc2VudGF0aW9uID0gQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotCQkJCQkJLmNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbih0aGlzKTsKLQkJCQllbXB0eVByZXNlbnRhdGlvbi5lQWRhcHRlcnMoKS5hZGQoY2hhbmdlTGlzdGVuZXIpOwotCQkJfQotCQkJcmV0dXJuIGVtcHR5UHJlc2VudGF0aW9uOwotCQl9Ci0KLQkJcmV0dXJuIHByZXNlbnRhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlbnRhdGlvbihDb250ZW50RGVzY3JpcHRpb24gbmV3UHJlc2VudGF0aW9uKSB7Ci0JCWlmIChuZXdQcmVzZW50YXRpb24gIT0gcHJlc2VudGF0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcmVzZW50YXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHByZXNlbnRhdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByZXNlbnRhdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3UHJlc2VudGF0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcmVzZW50YXRpb24obmV3UHJlc2VudGF0aW9uLCBtc2dzKTsKLQotCQkJLy8gY3VzdG9tIGNvZGUKLQkJCS8vCi0JCQllbXB0eVByZXNlbnRhdGlvbiA9IG51bGw7Ci0KLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJCW5ld1ByZXNlbnRhdGlvbiwgbmV3UHJlc2VudGF0aW9uKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb250ZW50RGVzY3JpcHRpb24gZW1wdHlQcmVzZW50YXRpb247Ci0KLQlwcml2YXRlIEFkYXB0ZXIgY2hhbmdlTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOgotCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgZ2V0VGFyZ2V0KCk7Ci0JCQkJY29udGVudC5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0KLQkJCQkvLyBlbXB0eVByZXNlbnRhdGlvbiBpcyBtb2RpZmllZCwgY29udmVydCBpdCB0byByZWFsIHByZXNlbnRhdGlvbiBpZiBubyBwcmVzZW50YXRpb24gaXMgc2V0IHlldCAKLQkJCQkvLyBmb3IgdGhlIFByb2Nlc3NFbGVtZW50Ci0JCQkJLy8KLQkJCQlpZiAocHJlc2VudGF0aW9uID09IG51bGwpIHsKLQkJCQkJc2V0UHJlc2VudGF0aW9uKGNvbnRlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci19IC8vRGVzY3JpYmFibGVFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmOGE2N2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsI2dldFJlZmluZWREZXNjcmlwdGlvbiA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsCi0JCWltcGxlbWVudHMgRGVzY3JpcHRvckRlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZpbmVkRGVzY3JpcHRpb24oKSA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZJTkVEX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZpbmVkRGVzY3JpcHRpb24oKSA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlZmluZWREZXNjcmlwdGlvbiA9IFJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJUFRPUl9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmluZWREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHJlZmluZWREZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZpbmVkRGVzY3JpcHRpb24oU3RyaW5nIG5ld1JlZmluZWREZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkUmVmaW5lZERlc2NyaXB0aW9uID0gcmVmaW5lZERlc2NyaXB0aW9uOwotCQlyZWZpbmVkRGVzY3JpcHRpb24gPSBuZXdSZWZpbmVkRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTiwKLQkJCQkJb2xkUmVmaW5lZERlc2NyaXB0aW9uLCByZWZpbmVkRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIGdldFJlZmluZWREZXNjcmlwdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OOgotCQkJc2V0UmVmaW5lZERlc2NyaXB0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OOgotCQkJc2V0UmVmaW5lZERlc2NyaXB0aW9uKFJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIFJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHJlZmluZWREZXNjcmlwdGlvbiAhPSBudWxsCi0JCQkJCTogIVJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKHJlZmluZWREZXNjcmlwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocmVmaW5lZERlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJlZmluZWREZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZXNjcmlwdG9ySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNGZhMmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaXB0b3JJbXBsI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVzY3JpcHRvckltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCURlc2NyaXB0b3IgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVCA9IEJvb2xlYW4uVFJVRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklQVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIHsKLQkJcmV0dXJuIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoQm9vbGVhbiBuZXdJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpIHsKLQkJQm9vbGVhbiBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JCWlzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IG5ld0lzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UsCi0JCQkJCW9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSwgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJcmV0dXJuIGdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQlzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQlzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJcmV0dXJuIElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVCA9PSBudWxsID8gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlICE9IG51bGwKLQkJCQkJOiAhSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZXNjcmlwdG9ySW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RpYWdyYW1FbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RpYWdyYW1FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGMxNmJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaWFncmFtRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlhZ3JhbSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUVsZW1lbnRJbXBsI2dldElzVmlzaWJsZSA8ZW0+SXMgVmlzaWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1FbGVtZW50SW1wbCNnZXRDb250YWluZXJfIDxlbT5Db250YWluZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtRWxlbWVudEltcGwjZ2V0UmVmZXJlbmNlIDxlbT5SZWZlcmVuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtRWxlbWVudEltcGwjZ2V0UHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlhZ3JhbUVsZW1lbnRJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlEaWFncmFtRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNWaXNpYmxlKCkgPGVtPklzIFZpc2libGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzVmlzaWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX1ZJU0lCTEVfRURFRkFVTFQgPSBCb29sZWFuLlRSVUU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1Zpc2libGUoKSA8ZW0+SXMgVmlzaWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNWaXNpYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc1Zpc2libGUgPSBJU19WSVNJQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmZXJlbmNlKCkgPGVtPlJlZmVyZW5jZTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxSZWZlcmVuY2U+IHJlZmVyZW5jZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnR5KCkgPGVtPlByb3BlcnR5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8UHJvcGVydHk+IHByb3BlcnR5OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1FbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElzVmlzaWJsZSgpIHsKLQkJcmV0dXJuIGlzVmlzaWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1Zpc2libGUoQm9vbGVhbiBuZXdJc1Zpc2libGUpIHsKLQkJQm9vbGVhbiBvbGRJc1Zpc2libGUgPSBpc1Zpc2libGU7Ci0JCWlzVmlzaWJsZSA9IG5ld0lzVmlzaWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEUsIG9sZElzVmlzaWJsZSwKLQkJCQkJaXNWaXNpYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWxlbWVudCBnZXRDb250YWluZXJfKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoR3JhcGhFbGVtZW50KSBlQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWxlbWVudCBiYXNpY0dldENvbnRhaW5lcigpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUikKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEdyYXBoRWxlbWVudCkgZUludGVybmFsQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29udGFpbmVyKEdyYXBoRWxlbWVudCBuZXdDb250YWluZXIsCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3Q29udGFpbmVyLAotCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVIsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoR3JhcGhFbGVtZW50IG5ld0NvbnRhaW5lcikgewotCQlpZiAobmV3Q29udGFpbmVyICE9IGVJbnRlcm5hbENvbnRhaW5lcigpCi0JCQkJfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUiAmJiBuZXdDb250YWluZXIgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCAoRU9iamVjdCkgbmV3Q29udGFpbmVyKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkJIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0NvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3Q29udGFpbmVyKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJCQlHcmFwaEVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29udGFpbmVyKG5ld0NvbnRhaW5lciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVIsIG5ld0NvbnRhaW5lciwKLQkJCQkJbmV3Q29udGFpbmVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8UmVmZXJlbmNlPiBnZXRSZWZlcmVuY2UoKSB7Ci0JCWlmIChyZWZlcmVuY2UgPT0gbnVsbCkgewotCQkJcmVmZXJlbmNlID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0PFJlZmVyZW5jZT4oCi0JCQkJCVJlZmVyZW5jZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRSwKLQkJCQkJVW1hUGFja2FnZS5SRUZFUkVOQ0VfX1JFRkVSRU5DRUQpOwotCQl9Ci0JCXJldHVybiByZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8UHJvcGVydHk+IGdldFByb3BlcnR5KCkgewotCQlpZiAocHJvcGVydHkgPT0gbnVsbCkgewotCQkJcHJvcGVydHkgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPFByb3BlcnR5PigKLQkJCQkJUHJvcGVydHkuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWSk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjoKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0Q29udGFpbmVyKChHcmFwaEVsZW1lbnQpIG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDxJbnRlcm5hbEVPYmplY3Q+KSAoSW50ZXJuYWxFTGlzdDw/PikgZ2V0UmVmZXJlbmNlKCkpCi0JCQkJCS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjoKLQkJCXJldHVybiBiYXNpY1NldENvbnRhaW5lcihudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0UmVmZXJlbmNlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFk6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRQcm9wZXJ0eSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZSgKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjoKLQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwgR3JhcGhFbGVtZW50LmNsYXNzLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFOgotCQkJcmV0dXJuIGdldElzVmlzaWJsZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyXygpOwotCQkJcmV0dXJuIGJhc2ljR2V0Q29udGFpbmVyKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRToKLQkJCXJldHVybiBnZXRSZWZlcmVuY2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFk6Ci0JCQlyZXR1cm4gZ2V0UHJvcGVydHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFOgotCQkJc2V0SXNWaXNpYmxlKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjoKLQkJCXNldENvbnRhaW5lcigoR3JhcGhFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRToKLQkJCWdldFJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQlnZXRSZWZlcmVuY2UoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFJlZmVyZW5jZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFk6Ci0JCQlnZXRQcm9wZXJ0eSgpLmNsZWFyKCk7Ci0JCQlnZXRQcm9wZXJ0eSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUHJvcGVydHk+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFOgotCQkJc2V0SXNWaXNpYmxlKElTX1ZJU0lCTEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI6Ci0JCQlzZXRDb250YWluZXIoKEdyYXBoRWxlbWVudCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRToKLQkJCWdldFJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOgotCQkJZ2V0UHJvcGVydHkoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU6Ci0JCQlyZXR1cm4gSVNfVklTSUJMRV9FREVGQVVMVCA9PSBudWxsID8gaXNWaXNpYmxlICE9IG51bGwKLQkJCQkJOiAhSVNfVklTSUJMRV9FREVGQVVMVC5lcXVhbHMoaXNWaXNpYmxlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSOgotCQkJcmV0dXJuIGJhc2ljR2V0Q29udGFpbmVyKCkgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOgotCQkJcmV0dXJuIHJlZmVyZW5jZSAhPSBudWxsICYmICFyZWZlcmVuY2UuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWToKLQkJCXJldHVybiBwcm9wZXJ0eSAhPSBudWxsICYmICFwcm9wZXJ0eS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaXNWaXNpYmxlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlzVmlzaWJsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RpYWdyYW1FbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RpYWdyYW1JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlhZ3JhbUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVjZmRhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlhZ3JhbUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpYWdyYW08L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtSW1wbCNnZXREaWFncmFtTGluayA8ZW0+RGlhZ3JhbSBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUltcGwjZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtSW1wbCNnZXRab29tIDxlbT5ab29tPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUltcGwjZ2V0Vmlld3BvaW50IDxlbT5WaWV3cG9pbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtSW1wbCBleHRlbmRzIEdyYXBoTm9kZUltcGwgaW1wbGVtZW50cyBEaWFncmFtIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpYWdyYW1MaW5rKCkgPGVtPkRpYWdyYW0gTGluazwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaWFncmFtTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PERpYWdyYW1MaW5rPiBkaWFncmFtTGluazsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZSgpIDxlbT5OYW1lc3BhY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWVzcGFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZXNwYWNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFpvb20oKSA8ZW0+Wm9vbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Wm9vbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgWk9PTV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRab29tKCkgPGVtPlpvb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFpvb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEb3VibGUgem9vbSA9IFpPT01fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWaWV3cG9pbnQoKSA8ZW0+Vmlld3BvaW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWaWV3cG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCB2aWV3cG9pbnQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ3JhbUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRab29tKCkgewotCQlyZXR1cm4gem9vbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRab29tKERvdWJsZSBuZXdab29tKSB7Ci0JCURvdWJsZSBvbGRab29tID0gem9vbTsKLQkJem9vbSA9IG5ld1pvb207Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9fWk9PTSwgb2xkWm9vbSwgem9vbSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRWaWV3cG9pbnQoKSB7Ci0JCWlmICh2aWV3cG9pbnQgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHZpZXdwb2ludCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFZpZXdwb2ludCA9IChJbnRlcm5hbEVPYmplY3QpIHZpZXdwb2ludDsKLQkJCXZpZXdwb2ludCA9IChQb2ludCkgZVJlc29sdmVQcm94eShvbGRWaWV3cG9pbnQpOwotCQkJaWYgKHZpZXdwb2ludCAhPSBvbGRWaWV3cG9pbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9fVklFV1BPSU5ULCBvbGRWaWV3cG9pbnQsCi0JCQkJCQkJdmlld3BvaW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZpZXdwb2ludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgYmFzaWNHZXRWaWV3cG9pbnQoKSB7Ci0JCXJldHVybiB2aWV3cG9pbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vmlld3BvaW50KFBvaW50IG5ld1ZpZXdwb2ludCkgewotCQlQb2ludCBvbGRWaWV3cG9pbnQgPSB2aWV3cG9pbnQ7Ci0JCXZpZXdwb2ludCA9IG5ld1ZpZXdwb2ludDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19WSUVXUE9JTlQsIG9sZFZpZXdwb2ludCwgdmlld3BvaW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RGlhZ3JhbUxpbms+IGdldERpYWdyYW1MaW5rKCkgewotCQlpZiAoZGlhZ3JhbUxpbmsgPT0gbnVsbCkgewotCQkJZGlhZ3JhbUxpbmsgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q8RGlhZ3JhbUxpbms+KAotCQkJCQlEaWFncmFtTGluay5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5ESUFHUkFNX19ESUFHUkFNX0xJTkssCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19ESUFHUkFNKTsKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbUxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlbWFudGljTW9kZWxCcmlkZ2UgZ2V0TmFtZXNwYWNlKCkgewotCQlpZiAobmFtZXNwYWNlICE9IG51bGwgJiYgKChFT2JqZWN0KSBuYW1lc3BhY2UpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGROYW1lc3BhY2UgPSAoSW50ZXJuYWxFT2JqZWN0KSBuYW1lc3BhY2U7Ci0JCQluYW1lc3BhY2UgPSAoU2VtYW50aWNNb2RlbEJyaWRnZSkgZVJlc29sdmVQcm94eShvbGROYW1lc3BhY2UpOwotCQkJaWYgKG5hbWVzcGFjZSAhPSBvbGROYW1lc3BhY2UpIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3TmFtZXNwYWNlID0gKEludGVybmFsRU9iamVjdCkgbmFtZXNwYWNlOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGROYW1lc3BhY2UuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNLAotCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgbnVsbCk7Ci0JCQkJaWYgKG5ld05hbWVzcGFjZS5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdOYW1lc3BhY2UuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCQlVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSwKLQkJCQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCBtc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0UsIG9sZE5hbWVzcGFjZSwKLQkJCQkJCQluYW1lc3BhY2UpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZW1hbnRpY01vZGVsQnJpZGdlIGJhc2ljR2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE5hbWVzcGFjZSgKLQkJCVNlbWFudGljTW9kZWxCcmlkZ2UgbmV3TmFtZXNwYWNlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVNlbWFudGljTW9kZWxCcmlkZ2Ugb2xkTmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQluYW1lc3BhY2UgPSBuZXdOYW1lc3BhY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFLAotCQkJCQlvbGROYW1lc3BhY2UsIG5ld05hbWVzcGFjZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU2VtYW50aWNNb2RlbEJyaWRnZSBuZXdOYW1lc3BhY2UpIHsKLQkJaWYgKG5ld05hbWVzcGFjZSAhPSBuYW1lc3BhY2UpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmFtZXNwYWNlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0sCi0JCQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdOYW1lc3BhY2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld05hbWVzcGFjZSkuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNLAotCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXROYW1lc3BhY2UobmV3TmFtZXNwYWNlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0UsIG5ld05hbWVzcGFjZSwgbmV3TmFtZXNwYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX0RJQUdSQU1fTElOSzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikgKEludGVybmFsRUxpc3Q8Pz4pIGdldERpYWdyYW1MaW5rKCkpCi0JCQkJCS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0U6Ci0JCQlpZiAobmFtZXNwYWNlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuYW1lc3BhY2UpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0UsCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldE5hbWVzcGFjZSgoU2VtYW50aWNNb2RlbEJyaWRnZSkgb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fRElBR1JBTV9MSU5LOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0RGlhZ3JhbUxpbmsoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFOgotCQkJcmV0dXJuIGJhc2ljU2V0TmFtZXNwYWNlKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19ESUFHUkFNX0xJTks6Ci0JCQlyZXR1cm4gZ2V0RGlhZ3JhbUxpbmsoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX05BTUVTUEFDRToKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXROYW1lc3BhY2UoKTsKLQkJCXJldHVybiBiYXNpY0dldE5hbWVzcGFjZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fWk9PTToKLQkJCXJldHVybiBnZXRab29tKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19WSUVXUE9JTlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0Vmlld3BvaW50KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRWaWV3cG9pbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fRElBR1JBTV9MSU5LOgotCQkJZ2V0RGlhZ3JhbUxpbmsoKS5jbGVhcigpOwotCQkJZ2V0RGlhZ3JhbUxpbmsoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEaWFncmFtTGluaz4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX05BTUVTUEFDRToKLQkJCXNldE5hbWVzcGFjZSgoU2VtYW50aWNNb2RlbEJyaWRnZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fWk9PTToKLQkJCXNldFpvb20oKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fVklFV1BPSU5UOgotCQkJc2V0Vmlld3BvaW50KChQb2ludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX0RJQUdSQU1fTElOSzoKLQkJCWdldERpYWdyYW1MaW5rKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX05BTUVTUEFDRToKLQkJCXNldE5hbWVzcGFjZSgoU2VtYW50aWNNb2RlbEJyaWRnZSkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19aT09NOgotCQkJc2V0Wm9vbShaT09NX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX1ZJRVdQT0lOVDoKLQkJCXNldFZpZXdwb2ludCgoUG9pbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19ESUFHUkFNX0xJTks6Ci0JCQlyZXR1cm4gZGlhZ3JhbUxpbmsgIT0gbnVsbCAmJiAhZGlhZ3JhbUxpbmsuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFOgotCQkJcmV0dXJuIG5hbWVzcGFjZSAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fWk9PTToKLQkJCXJldHVybiBaT09NX0VERUZBVUxUID09IG51bGwgPyB6b29tICE9IG51bGwgOiAhWk9PTV9FREVGQVVMVAotCQkJCQkuZXF1YWxzKHpvb20pOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fVklFV1BPSU5UOgotCQkJcmV0dXJuIHZpZXdwb2ludCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHpvb206ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoem9vbSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RpYWdyYW1JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlhZ3JhbUxpbmtJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlhZ3JhbUxpbmtJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMGZjOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RpYWdyYW1MaW5rSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaWFncmFtIExpbms8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtTGlua0ltcGwjZ2V0Wm9vbSA8ZW0+Wm9vbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1MaW5rSW1wbCNnZXRWaWV3cG9ydCA8ZW0+Vmlld3BvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtTGlua0ltcGwjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1MaW5rSW1wbCNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTGlua0ltcGwgZXh0ZW5kcyBEaWFncmFtRWxlbWVudEltcGwgaW1wbGVtZW50cyBEaWFncmFtTGluayB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Wm9vbSgpIDxlbT5ab29tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRab29tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvdWJsZSBaT09NX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFpvb20oKSA8ZW0+Wm9vbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Wm9vbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSB6b29tID0gWk9PTV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZpZXdwb3J0KCkgPGVtPlZpZXdwb3J0PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWaWV3cG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IHZpZXdwb3J0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlhZ3JhbSgpIDxlbT5EaWFncmFtPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ3JhbSBkaWFncmFtOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1MaW5rSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9MSU5LOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0Wm9vbSgpIHsKLQkJcmV0dXJuIHpvb207Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Wm9vbShEb3VibGUgbmV3Wm9vbSkgewotCQlEb3VibGUgb2xkWm9vbSA9IHpvb207Ci0JCXpvb20gPSBuZXdab29tOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fWk9PTSwgb2xkWm9vbSwgem9vbSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRWaWV3cG9ydCgpIHsKLQkJaWYgKHZpZXdwb3J0ICE9IG51bGwgJiYgKChFT2JqZWN0KSB2aWV3cG9ydCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFZpZXdwb3J0ID0gKEludGVybmFsRU9iamVjdCkgdmlld3BvcnQ7Ci0JCQl2aWV3cG9ydCA9IChQb2ludCkgZVJlc29sdmVQcm94eShvbGRWaWV3cG9ydCk7Ci0JCQlpZiAodmlld3BvcnQgIT0gb2xkVmlld3BvcnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19WSUVXUE9SVCwgb2xkVmlld3BvcnQsCi0JCQkJCQkJdmlld3BvcnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmlld3BvcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGJhc2ljR2V0Vmlld3BvcnQoKSB7Ci0JCXJldHVybiB2aWV3cG9ydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaWV3cG9ydChQb2ludCBuZXdWaWV3cG9ydCkgewotCQlQb2ludCBvbGRWaWV3cG9ydCA9IHZpZXdwb3J0OwotCQl2aWV3cG9ydCA9IG5ld1ZpZXdwb3J0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fVklFV1BPUlQsIG9sZFZpZXdwb3J0LCB2aWV3cG9ydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVsZW1lbnQgZ2V0R3JhcGhFbGVtZW50KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEdyYXBoRWxlbWVudCkgZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVsZW1lbnQgYmFzaWNHZXRHcmFwaEVsZW1lbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoR3JhcGhFbGVtZW50KSBlSW50ZXJuYWxDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IG5ld0dyYXBoRWxlbWVudCwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdHcmFwaEVsZW1lbnQsCi0JCQkJVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IG5ld0dyYXBoRWxlbWVudCkgewotCQlpZiAobmV3R3JhcGhFbGVtZW50ICE9IGVJbnRlcm5hbENvbnRhaW5lcigpCi0JCQkJfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQgJiYgbmV3R3JhcGhFbGVtZW50ICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgKEVPYmplY3QpIG5ld0dyYXBoRWxlbWVudCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdHcmFwaEVsZW1lbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0dyYXBoRWxlbWVudCkuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSywgR3JhcGhFbGVtZW50LmNsYXNzLAotCQkJCQkJbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRHcmFwaEVsZW1lbnQobmV3R3JhcGhFbGVtZW50LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQsIG5ld0dyYXBoRWxlbWVudCwKLQkJCQkJbmV3R3JhcGhFbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLQkJaWYgKGRpYWdyYW0gIT0gbnVsbCAmJiAoKEVPYmplY3QpIGRpYWdyYW0pLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGREaWFncmFtID0gKEludGVybmFsRU9iamVjdCkgZGlhZ3JhbTsKLQkJCWRpYWdyYW0gPSAoRGlhZ3JhbSkgZVJlc29sdmVQcm94eShvbGREaWFncmFtKTsKLQkJCWlmIChkaWFncmFtICE9IG9sZERpYWdyYW0pIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19ESUFHUkFNLCBvbGREaWFncmFtLAotCQkJCQkJCWRpYWdyYW0pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBiYXNpY0dldERpYWdyYW0oKSB7Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldERpYWdyYW0oRGlhZ3JhbSBuZXdEaWFncmFtLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEaWFncmFtIG9sZERpYWdyYW0gPSBkaWFncmFtOwotCQlkaWFncmFtID0gbmV3RGlhZ3JhbTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU0sCi0JCQkJCW9sZERpYWdyYW0sIG5ld0RpYWdyYW0pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlhZ3JhbShEaWFncmFtIG5ld0RpYWdyYW0pIHsKLQkJaWYgKG5ld0RpYWdyYW0gIT0gZGlhZ3JhbSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZGlhZ3JhbSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgZGlhZ3JhbSkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9fRElBR1JBTV9MSU5LLCBEaWFncmFtLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdEaWFncmFtICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdEaWFncmFtKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19ESUFHUkFNX0xJTkssIERpYWdyYW0uY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RGlhZ3JhbShuZXdEaWFncmFtLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU0sIG5ld0RpYWdyYW0sIG5ld0RpYWdyYW0pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19ESUFHUkFNOgotCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGRpYWdyYW0pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fX0RJQUdSQU1fTElOSywgRGlhZ3JhbS5jbGFzcywgbXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXREaWFncmFtKChEaWFncmFtKSBvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldEdyYXBoRWxlbWVudCgoR3JhcGhFbGVtZW50KSBvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU06Ci0JCQlyZXR1cm4gYmFzaWNTZXREaWFncmFtKG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UOgotCQkJcmV0dXJuIGJhc2ljU2V0R3JhcGhFbGVtZW50KG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UOgotCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSywgR3JhcGhFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19aT09NOgotCQkJcmV0dXJuIGdldFpvb20oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fVklFV1BPUlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0Vmlld3BvcnQoKTsKLQkJCXJldHVybiBiYXNpY0dldFZpZXdwb3J0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU06Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0RGlhZ3JhbSgpOwotCQkJcmV0dXJuIGJhc2ljR2V0RGlhZ3JhbSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldEdyYXBoRWxlbWVudCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0R3JhcGhFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fWk9PTToKLQkJCXNldFpvb20oKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19WSUVXUE9SVDoKLQkJCXNldFZpZXdwb3J0KChQb2ludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19ESUFHUkFNOgotCQkJc2V0RGlhZ3JhbSgoRGlhZ3JhbSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UOgotCQkJc2V0R3JhcGhFbGVtZW50KChHcmFwaEVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1pPT006Ci0JCQlzZXRab29tKFpPT01fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19WSUVXUE9SVDoKLQkJCXNldFZpZXdwb3J0KChQb2ludCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU06Ci0JCQlzZXREaWFncmFtKChEaWFncmFtKSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVDoKLQkJCXNldEdyYXBoRWxlbWVudCgoR3JhcGhFbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19aT09NOgotCQkJcmV0dXJuIFpPT01fRURFRkFVTFQgPT0gbnVsbCA/IHpvb20gIT0gbnVsbCA6ICFaT09NX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoem9vbSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1ZJRVdQT1JUOgotCQkJcmV0dXJuIHZpZXdwb3J0ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU06Ci0JCQlyZXR1cm4gZGlhZ3JhbSAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UOgotCQkJcmV0dXJuIGJhc2ljR2V0R3JhcGhFbGVtZW50KCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh6b29tOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHpvb20pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EaWFncmFtTGlua0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaW1lbnNpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGltZW5zaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjhhNDcwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaW1lbnNpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGltZW5zaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGltZW5zaW9uSW1wbCNnZXRXaWR0aCA8ZW0+V2lkdGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaW1lbnNpb25JbXBsI2dldEhlaWdodCA8ZW0+SGVpZ2h0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGltZW5zaW9uSW1wbCBleHRlbmRzIE11bHRpUmVzb3VyY2VFT2JqZWN0IGltcGxlbWVudHMgRGltZW5zaW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXaWR0aCgpIDxlbT5XaWR0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2lkdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRG91YmxlIFdJRFRIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdpZHRoKCkgPGVtPldpZHRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXaWR0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSB3aWR0aCA9IFdJRFRIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhlaWdodCgpIDxlbT5IZWlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhlaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgSEVJR0hUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhlaWdodCgpIDxlbT5IZWlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhlaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSBoZWlnaHQgPSBIRUlHSFRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElNRU5TSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0V2lkdGgoKSB7Ci0JCXJldHVybiB3aWR0aDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXaWR0aChEb3VibGUgbmV3V2lkdGgpIHsKLQkJRG91YmxlIG9sZFdpZHRoID0gd2lkdGg7Ci0JCXdpZHRoID0gbmV3V2lkdGg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRElNRU5TSU9OX19XSURUSCwgb2xkV2lkdGgsIHdpZHRoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRIZWlnaHQoKSB7Ci0JCXJldHVybiBoZWlnaHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGVpZ2h0KERvdWJsZSBuZXdIZWlnaHQpIHsKLQkJRG91YmxlIG9sZEhlaWdodCA9IGhlaWdodDsKLQkJaGVpZ2h0ID0gbmV3SGVpZ2h0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRJTUVOU0lPTl9fSEVJR0hULCBvbGRIZWlnaHQsIGhlaWdodCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTl9fV0lEVEg6Ci0JCQlyZXR1cm4gZ2V0V2lkdGgoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTl9fSEVJR0hUOgotCQkJcmV0dXJuIGdldEhlaWdodCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT05fX1dJRFRIOgotCQkJc2V0V2lkdGgoKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OX19IRUlHSFQ6Ci0JCQlzZXRIZWlnaHQoKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTl9fV0lEVEg6Ci0JCQlzZXRXaWR0aChXSURUSF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT05fX0hFSUdIVDoKLQkJCXNldEhlaWdodChIRUlHSFRfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT05fX1dJRFRIOgotCQkJcmV0dXJuIFdJRFRIX0VERUZBVUxUID09IG51bGwgPyB3aWR0aCAhPSBudWxsIDogIVdJRFRIX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMod2lkdGgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OX19IRUlHSFQ6Ci0JCQlyZXR1cm4gSEVJR0hUX0VERUZBVUxUID09IG51bGwgPyBoZWlnaHQgIT0gbnVsbCA6ICFIRUlHSFRfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhoZWlnaHQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHdpZHRoOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHdpZHRoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoZWlnaHQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaGVpZ2h0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGltZW5zaW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rpc2NpcGxpbmVHcm91cGluZ0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaXNjaXBsaW5lR3JvdXBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkODNmMDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rpc2NpcGxpbmVHcm91cGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNjaXBsaW5lIEdyb3VwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbCNnZXREaXNjaXBsaW5lcyA8ZW0+RGlzY2lwbGluZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lR3JvdXBpbmdJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzCi0JCURpc2NpcGxpbmVHcm91cGluZyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNjaXBsaW5lcygpIDxlbT5EaXNjaXBsaW5lczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PERpc2NpcGxpbmU+IGRpc2NpcGxpbmVzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpc2NpcGxpbmVHcm91cGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfR1JPVVBJTkc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RGlzY2lwbGluZT4gZ2V0RGlzY2lwbGluZXMoKSB7Ci0JCWlmIChkaXNjaXBsaW5lcyA9PSBudWxsKSB7Ci0JCQlkaXNjaXBsaW5lcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8RGlzY2lwbGluZT4oCi0JCQkJCURpc2NpcGxpbmUuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMpOwotCQl9Ci0JCXJldHVybiBkaXNjaXBsaW5lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUzoKLQkJCXJldHVybiBnZXREaXNjaXBsaW5lcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUzoKLQkJCWdldERpc2NpcGxpbmVzKCkuY2xlYXIoKTsKLQkJCWdldERpc2NpcGxpbmVzKCkKLQkJCQkJLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGlzY2lwbGluZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUzoKLQkJCWdldERpc2NpcGxpbmVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVM6Ci0JCQlyZXR1cm4gZGlzY2lwbGluZXMgIT0gbnVsbCAmJiAhZGlzY2lwbGluZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9EaXNjaXBsaW5lR3JvdXBpbmdJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlzY2lwbGluZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaXNjaXBsaW5lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGY5ZjU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaXNjaXBsaW5lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNjaXBsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUltcGwjZ2V0VGFza3MgPGVtPlRhc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUltcGwjZ2V0U3ViZGlzY2lwbGluZSA8ZW0+U3ViZGlzY2lwbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsI2dldFJlZmVyZW5jZVdvcmtmbG93cyA8ZW0+UmVmZXJlbmNlIFdvcmtmbG93czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzIERpc2NpcGxpbmUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFza3MoKSA8ZW0+VGFza3M8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxUYXNrPiB0YXNrczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YmRpc2NpcGxpbmUoKSA8ZW0+U3ViZGlzY2lwbGluZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJkaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RGlzY2lwbGluZT4gc3ViZGlzY2lwbGluZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZmVyZW5jZVdvcmtmbG93cygpIDxlbT5SZWZlcmVuY2UgV29ya2Zsb3dzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZmVyZW5jZVdvcmtmbG93cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEFjdGl2aXR5PiByZWZlcmVuY2VXb3JrZmxvd3M7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlzY2lwbGluZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8VGFzaz4gZ2V0VGFza3MoKSB7Ci0JCWlmICh0YXNrcyA9PSBudWxsKSB7Ci0JCQl0YXNrcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8VGFzaz4oVGFzay5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5ESVNDSVBMSU5FX19UQVNLUyk7Ci0JCX0KLQkJcmV0dXJuIHRhc2tzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PERpc2NpcGxpbmU+IGdldFN1YmRpc2NpcGxpbmUoKSB7Ci0JCWlmIChzdWJkaXNjaXBsaW5lID09IG51bGwpIHsKLQkJCXN1YmRpc2NpcGxpbmUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPERpc2NpcGxpbmU+KAotCQkJCQlEaXNjaXBsaW5lLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQkRJU0NJUExJTkUpOwotCQl9Ci0JCXJldHVybiBzdWJkaXNjaXBsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEFjdGl2aXR5PiBnZXRSZWZlcmVuY2VXb3JrZmxvd3MoKSB7Ci0JCWlmIChyZWZlcmVuY2VXb3JrZmxvd3MgPT0gbnVsbCkgewotCQkJcmVmZXJlbmNlV29ya2Zsb3dzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxBY3Rpdml0eT4oCi0JCQkJCUFjdGl2aXR5LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1MpOwotCQl9Ci0JCXJldHVybiByZWZlcmVuY2VXb3JrZmxvd3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQkRJU0NJUExJTkU6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRTdWJkaXNjaXBsaW5lKCkpLmJhc2ljUmVtb3ZlKAotCQkJCQlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0tTOgotCQkJcmV0dXJuIGdldFRhc2tzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FOgotCQkJcmV0dXJuIGdldFN1YmRpc2NpcGxpbmUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1M6Ci0JCQlyZXR1cm4gZ2V0UmVmZXJlbmNlV29ya2Zsb3dzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0tTOgotCQkJZ2V0VGFza3MoKS5jbGVhcigpOwotCQkJZ2V0VGFza3MoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFRhc2s+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FOgotCQkJZ2V0U3ViZGlzY2lwbGluZSgpLmNsZWFyKCk7Ci0JCQlnZXRTdWJkaXNjaXBsaW5lKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGlzY2lwbGluZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1M6Ci0JCQlnZXRSZWZlcmVuY2VXb3JrZmxvd3MoKS5jbGVhcigpOwotCQkJZ2V0UmVmZXJlbmNlV29ya2Zsb3dzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQWN0aXZpdHk+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fVEFTS1M6Ci0JCQlnZXRUYXNrcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FOgotCQkJZ2V0U3ViZGlzY2lwbGluZSgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1dTOgotCQkJZ2V0UmVmZXJlbmNlV29ya2Zsb3dzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fVEFTS1M6Ci0JCQlyZXR1cm4gdGFza3MgIT0gbnVsbCAmJiAhdGFza3MuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCRElTQ0lQTElORToKLQkJCXJldHVybiBzdWJkaXNjaXBsaW5lICE9IG51bGwgJiYgIXN1YmRpc2NpcGxpbmUuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XUzoKLQkJCXJldHVybiByZWZlcmVuY2VXb3JrZmxvd3MgIT0gbnVsbCAmJiAhcmVmZXJlbmNlV29ya2Zsb3dzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vRGlzY2lwbGluZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Eb21haW5JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRG9tYWluSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTdlMGQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Eb21haW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb21haW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Eb21haW5JbXBsI2dldFdvcmtQcm9kdWN0cyA8ZW0+V29yayBQcm9kdWN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRvbWFpbkltcGwjZ2V0U3ViZG9tYWlucyA8ZW0+U3ViZG9tYWluczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERvbWFpbkltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgRG9tYWluIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtQcm9kdWN0cygpIDxlbT5Xb3JrIFByb2R1Y3RzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFdvcmtQcm9kdWN0PiB3b3JrUHJvZHVjdHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJkb21haW5zKCkgPGVtPlN1YmRvbWFpbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViZG9tYWlucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PERvbWFpbj4gc3ViZG9tYWluczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEb21haW5JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ET01BSU47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3Q+IGdldFdvcmtQcm9kdWN0cygpIHsKLQkJaWYgKHdvcmtQcm9kdWN0cyA9PSBudWxsKSB7Ci0JCQl3b3JrUHJvZHVjdHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0PigKLQkJCQkJV29ya1Byb2R1Y3QuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuRE9NQUlOX19XT1JLX1BST0RVQ1RTKTsKLQkJfQotCQlyZXR1cm4gd29ya1Byb2R1Y3RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PERvbWFpbj4gZ2V0U3ViZG9tYWlucygpIHsKLQkJaWYgKHN1YmRvbWFpbnMgPT0gbnVsbCkgewotCQkJc3ViZG9tYWlucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmc8RG9tYWluPigKLQkJCQkJRG9tYWluLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOUyk7Ci0JCX0KLQkJcmV0dXJuIHN1YmRvbWFpbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldFN1YmRvbWFpbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1dPUktfUFJPRFVDVFM6Ci0JCQlyZXR1cm4gZ2V0V29ya1Byb2R1Y3RzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTlM6Ci0JCQlyZXR1cm4gZ2V0U3ViZG9tYWlucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1dPUktfUFJPRFVDVFM6Ci0JCQlnZXRXb3JrUHJvZHVjdHMoKS5jbGVhcigpOwotCQkJZ2V0V29ya1Byb2R1Y3RzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3Q+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTlM6Ci0JCQlnZXRTdWJkb21haW5zKCkuY2xlYXIoKTsKLQkJCWdldFN1YmRvbWFpbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERvbWFpbj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1dPUktfUFJPRFVDVFM6Ci0JCQlnZXRXb3JrUHJvZHVjdHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19TVUJET01BSU5TOgotCQkJZ2V0U3ViZG9tYWlucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fV09SS19QUk9EVUNUUzoKLQkJCXJldHVybiB3b3JrUHJvZHVjdHMgIT0gbnVsbCAmJiAhd29ya1Byb2R1Y3RzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOUzoKLQkJCXJldHVybiBzdWJkb21haW5zICE9IG51bGwgJiYgIXN1YmRvbWFpbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Eb21haW5JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzM3Y2FiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbGVtZW50SW1wbCBleHRlbmRzIE11bHRpUmVzb3VyY2VFT2JqZWN0IGltcGxlbWVudHMKLQkJRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkVMRU1FTlQ7Ci0JfQotCi19IC8vRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9FbGxpcHNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0VsbGlwc2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYmI2N2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0VsbGlwc2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsbGlwc2U8L2I+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+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFbGxpcHNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRUxMSVBTRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG91YmxlIGdldFJhZGl1c1goKSB7Ci0JCXJldHVybiByYWRpdXNYOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhZGl1c1goRG91YmxlIG5ld1JhZGl1c1gpIHsKLQkJRG91YmxlIG9sZFJhZGl1c1ggPSByYWRpdXNYOwotCQlyYWRpdXNYID0gbmV3UmFkaXVzWDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWCwgb2xkUmFkaXVzWCwgcmFkaXVzWCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0UmFkaXVzWSgpIHsKLQkJcmV0dXJuIHJhZGl1c1k7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmFkaXVzWShEb3VibGUgbmV3UmFkaXVzWSkgewotCQlEb3VibGUgb2xkUmFkaXVzWSA9IHJhZGl1c1k7Ci0JCXJhZGl1c1kgPSBuZXdSYWRpdXNZOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19ZLCBvbGRSYWRpdXNZLCByYWRpdXNZKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRSb3RhdGlvbigpIHsKLQkJcmV0dXJuIHJvdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvdGF0aW9uKERvdWJsZSBuZXdSb3RhdGlvbikgewotCQlEb3VibGUgb2xkUm90YXRpb24gPSByb3RhdGlvbjsKLQkJcm90YXRpb24gPSBuZXdSb3RhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5FTExJUFNFX19ST1RBVElPTiwgb2xkUm90YXRpb24sIHJvdGF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRTdGFydEFuZ2xlKCkgewotCQlyZXR1cm4gc3RhcnRBbmdsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydEFuZ2xlKERvdWJsZSBuZXdTdGFydEFuZ2xlKSB7Ci0JCURvdWJsZSBvbGRTdGFydEFuZ2xlID0gc3RhcnRBbmdsZTsKLQkJc3RhcnRBbmdsZSA9IG5ld1N0YXJ0QW5nbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRUxMSVBTRV9fU1RBUlRfQU5HTEUsIG9sZFN0YXJ0QW5nbGUsIHN0YXJ0QW5nbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG91YmxlIGdldEVuZEFuZ2xlKCkgewotCQlyZXR1cm4gZW5kQW5nbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kQW5nbGUoRG91YmxlIG5ld0VuZEFuZ2xlKSB7Ci0JCURvdWJsZSBvbGRFbmRBbmdsZSA9IGVuZEFuZ2xlOwotCQllbmRBbmdsZSA9IG5ld0VuZEFuZ2xlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkVMTElQU0VfX0VORF9BTkdMRSwgb2xkRW5kQW5nbGUsIGVuZEFuZ2xlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGdldENlbnRlcigpIHsKLQkJaWYgKGNlbnRlciAhPSBudWxsICYmICgoRU9iamVjdCkgY2VudGVyKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkQ2VudGVyID0gKEludGVybmFsRU9iamVjdCkgY2VudGVyOwotCQkJY2VudGVyID0gKFBvaW50KSBlUmVzb2x2ZVByb3h5KG9sZENlbnRlcik7Ci0JCQlpZiAoY2VudGVyICE9IG9sZENlbnRlcikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5FTExJUFNFX19DRU5URVIsIG9sZENlbnRlciwgY2VudGVyKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNlbnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgYmFzaWNHZXRDZW50ZXIoKSB7Ci0JCXJldHVybiBjZW50ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2VudGVyKFBvaW50IG5ld0NlbnRlcikgewotCQlQb2ludCBvbGRDZW50ZXIgPSBjZW50ZXI7Ci0JCWNlbnRlciA9IG5ld0NlbnRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5FTExJUFNFX19DRU5URVIsIG9sZENlbnRlciwgY2VudGVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fQ0VOVEVSOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldENlbnRlcigpOwotCQkJcmV0dXJuIGJhc2ljR2V0Q2VudGVyKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWDoKLQkJCXJldHVybiBnZXRSYWRpdXNYKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWToKLQkJCXJldHVybiBnZXRSYWRpdXNZKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19ST1RBVElPTjoKLQkJCXJldHVybiBnZXRSb3RhdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fU1RBUlRfQU5HTEU6Ci0JCQlyZXR1cm4gZ2V0U3RhcnRBbmdsZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fRU5EX0FOR0xFOgotCQkJcmV0dXJuIGdldEVuZEFuZ2xlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX0NFTlRFUjoKLQkJCXNldENlbnRlcigoUG9pbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19YOgotCQkJc2V0UmFkaXVzWCgoRG91YmxlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWToKLQkJCXNldFJhZGl1c1koKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUk9UQVRJT046Ci0JCQlzZXRSb3RhdGlvbigoRG91YmxlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19TVEFSVF9BTkdMRToKLQkJCXNldFN0YXJ0QW5nbGUoKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fRU5EX0FOR0xFOgotCQkJc2V0RW5kQW5nbGUoKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX0NFTlRFUjoKLQkJCXNldENlbnRlcigoUG9pbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUkFESVVTX1g6Ci0JCQlzZXRSYWRpdXNYKFJBRElVU19YX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19ZOgotCQkJc2V0UmFkaXVzWShSQURJVVNfWV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19ST1RBVElPTjoKLQkJCXNldFJvdGF0aW9uKFJPVEFUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1NUQVJUX0FOR0xFOgotCQkJc2V0U3RhcnRBbmdsZShTVEFSVF9BTkdMRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19FTkRfQU5HTEU6Ci0JCQlzZXRFbmRBbmdsZShFTkRfQU5HTEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19DRU5URVI6Ci0JCQlyZXR1cm4gY2VudGVyICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWDoKLQkJCXJldHVybiBSQURJVVNfWF9FREVGQVVMVCA9PSBudWxsID8gcmFkaXVzWCAhPSBudWxsCi0JCQkJCTogIVJBRElVU19YX0VERUZBVUxULmVxdWFscyhyYWRpdXNYKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19ZOgotCQkJcmV0dXJuIFJBRElVU19ZX0VERUZBVUxUID09IG51bGwgPyByYWRpdXNZICE9IG51bGwKLQkJCQkJOiAhUkFESVVTX1lfRURFRkFVTFQuZXF1YWxzKHJhZGl1c1kpOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUk9UQVRJT046Ci0JCQlyZXR1cm4gUk9UQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHJvdGF0aW9uICE9IG51bGwKLQkJCQkJOiAhUk9UQVRJT05fRURFRkFVTFQuZXF1YWxzKHJvdGF0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1NUQVJUX0FOR0xFOgotCQkJcmV0dXJuIFNUQVJUX0FOR0xFX0VERUZBVUxUID09IG51bGwgPyBzdGFydEFuZ2xlICE9IG51bGwKLQkJCQkJOiAhU1RBUlRfQU5HTEVfRURFRkFVTFQuZXF1YWxzKHN0YXJ0QW5nbGUpOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fRU5EX0FOR0xFOgotCQkJcmV0dXJuIEVORF9BTkdMRV9FREVGQVVMVCA9PSBudWxsID8gZW5kQW5nbGUgIT0gbnVsbAotCQkJCQk6ICFFTkRfQU5HTEVfRURFRkFVTFQuZXF1YWxzKGVuZEFuZ2xlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyYWRpdXNYOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJhZGl1c1gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJhZGl1c1k6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocmFkaXVzWSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcm90YXRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocm90YXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0QW5nbGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc3RhcnRBbmdsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZW5kQW5nbGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZW5kQW5nbGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FbGxpcHNlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMTk3NjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cwotCQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlM7Ci0JfQotCi19IC8vRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0V4YW1wbGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRXhhbXBsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEwZmNhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRXhhbXBsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGFtcGxlSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIEV4YW1wbGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEV4YW1wbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FWEFNUExFOwotCX0KLQotfSAvL0V4YW1wbGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRnVsZmlsbGFibGVFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Z1bGZpbGxhYmxlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBmZDNjYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRnVsZmlsbGFibGVFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZ1bGZpbGxhYmxlIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5GdWxmaWxsYWJsZUVsZW1lbnRJbXBsI2dldEZ1bGZpbGxzIDxlbT5GdWxmaWxsczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZ1bGZpbGxhYmxlRWxlbWVudEltcGwgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJRnVsZmlsbGFibGVFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZ1bGZpbGxzKCkgPGVtPkZ1bGZpbGxzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZ1bGZpbGxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RnVsZmlsbGFibGVFbGVtZW50PiBmdWxmaWxsczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBGdWxmaWxsYWJsZUVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5GVUxGSUxMQUJMRV9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gZ2V0RnVsZmlsbHMoKSB7Ci0JCWlmIChmdWxmaWxscyA9PSBudWxsKSB7Ci0JCQlmdWxmaWxscyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8RnVsZmlsbGFibGVFbGVtZW50PigKLQkJCQkJRnVsZmlsbGFibGVFbGVtZW50LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkZVTEZJTExBQkxFX0VMRU1FTlRfX0ZVTEZJTExTKTsKLQkJfQotCQlyZXR1cm4gZnVsZmlsbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFM6Ci0JCQlyZXR1cm4gZ2V0RnVsZmlsbHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFM6Ci0JCQlnZXRGdWxmaWxscygpLmNsZWFyKCk7Ci0JCQlnZXRGdWxmaWxscygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIEZ1bGZpbGxhYmxlRWxlbWVudD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5GVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUzoKLQkJCWdldEZ1bGZpbGxzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFM6Ci0JCQlyZXR1cm4gZnVsZmlsbHMgIT0gbnVsbCAmJiAhZnVsZmlsbHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9GdWxmaWxsYWJsZUVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhDb25uZWN0b3JJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhDb25uZWN0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNzRiZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoQ29ubmVjdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyYXBoIENvbm5lY3RvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoQ29ubmVjdG9ySW1wbCNnZXRHcmFwaEVkZ2UgPGVtPkdyYXBoIEVkZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaENvbm5lY3RvckltcGwjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhDb25uZWN0b3JJbXBsIGV4dGVuZHMgR3JhcGhFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUdyYXBoQ29ubmVjdG9yIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyYXBoRWRnZSgpIDxlbT5HcmFwaCBFZGdlPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyYXBoRWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEdyYXBoRWRnZT4gZ3JhcGhFZGdlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEdyYXBoQ29ubmVjdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfQ09OTkVDVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVsZW1lbnQgZ2V0R3JhcGhFbGVtZW50KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEdyYXBoRWxlbWVudCkgZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVsZW1lbnQgYmFzaWNHZXRHcmFwaEVsZW1lbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoR3JhcGhFbGVtZW50KSBlSW50ZXJuYWxDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IG5ld0dyYXBoRWxlbWVudCwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdHcmFwaEVsZW1lbnQsCi0JCQkJVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IG5ld0dyYXBoRWxlbWVudCkgewotCQlpZiAobmV3R3JhcGhFbGVtZW50ICE9IGVJbnRlcm5hbENvbnRhaW5lcigpCi0JCQkJfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQgJiYgbmV3R3JhcGhFbGVtZW50ICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgKEVPYmplY3QpIG5ld0dyYXBoRWxlbWVudCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdHcmFwaEVsZW1lbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0dyYXBoRWxlbWVudCkuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFLAotCQkJCQkJR3JhcGhFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEdyYXBoRWxlbWVudChuZXdHcmFwaEVsZW1lbnQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVCwgbmV3R3JhcGhFbGVtZW50LAotCQkJCQluZXdHcmFwaEVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxHcmFwaEVkZ2U+IGdldEdyYXBoRWRnZSgpIHsKLQkJaWYgKGdyYXBoRWRnZSA9PSBudWxsKSB7Ci0JCQlncmFwaEVkZ2UgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3QuTWFueUludmVyc2U8R3JhcGhFZGdlPigKLQkJCQkJR3JhcGhFZGdlLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRSwKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FREdFX19BTkNIT1IpOwotCQl9Ci0JCXJldHVybiBncmFwaEVkZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikgKEludGVybmFsRUxpc3Q8Pz4pIGdldEdyYXBoRWRnZSgpKQotCQkJCQkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UOgotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXRHcmFwaEVsZW1lbnQoKEdyYXBoRWxlbWVudCkgb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0R3JhcGhFZGdlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVDoKLQkJCXJldHVybiBiYXNpY1NldEdyYXBoRWxlbWVudChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVDoKLQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRSwgR3JhcGhFbGVtZW50LmNsYXNzLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFOgotCQkJcmV0dXJuIGdldEdyYXBoRWRnZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldEdyYXBoRWxlbWVudCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0R3JhcGhFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRToKLQkJCWdldEdyYXBoRWRnZSgpLmNsZWFyKCk7Ci0JCQlnZXRHcmFwaEVkZ2UoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEdyYXBoRWRnZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVDoKLQkJCXNldEdyYXBoRWxlbWVudCgoR3JhcGhFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFOgotCQkJZ2V0R3JhcGhFZGdlKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVDoKLQkJCXNldEdyYXBoRWxlbWVudCgoR3JhcGhFbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFOgotCQkJcmV0dXJuIGdyYXBoRWRnZSAhPSBudWxsICYmICFncmFwaEVkZ2UuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UOgotCQkJcmV0dXJuIGJhc2ljR2V0R3JhcGhFbGVtZW50KCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vR3JhcGhDb25uZWN0b3JJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhFZGdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoRWRnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I4ZTFlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhFZGdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyYXBoIEVkZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVkZ2VJbXBsI2dldFdheXBvaW50cyA8ZW0+V2F5cG9pbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFZGdlSW1wbCNnZXRBbmNob3IgPGVtPkFuY2hvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoRWRnZUltcGwgZXh0ZW5kcyBHcmFwaEVsZW1lbnRJbXBsIGltcGxlbWVudHMgR3JhcGhFZGdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdheXBvaW50cygpIDxlbT5XYXlwb2ludHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2F5cG9pbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8UG9pbnQ+IHdheXBvaW50czsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFuY2hvcigpIDxlbT5BbmNob3I8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QW5jaG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8R3JhcGhDb25uZWN0b3I+IGFuY2hvcjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBHcmFwaEVkZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FREdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEdyYXBoQ29ubmVjdG9yPiBnZXRBbmNob3IoKSB7Ci0JCWlmIChhbmNob3IgPT0gbnVsbCkgewotCQkJYW5jaG9yID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0Lk1hbnlJbnZlcnNlPEdyYXBoQ29ubmVjdG9yPigKLQkJCQkJR3JhcGhDb25uZWN0b3IuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fQU5DSE9SLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRSk7Ci0JCX0KLQkJcmV0dXJuIGFuY2hvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxQb2ludD4gZ2V0V2F5cG9pbnRzKCkgewotCQlpZiAod2F5cG9pbnRzID09IG51bGwpIHsKLQkJCXdheXBvaW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmc8UG9pbnQ+KAotCQkJCQlQb2ludC5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5HUkFQSF9FREdFX19XQVlQT0lOVFMpOwotCQl9Ci0JCXJldHVybiB3YXlwb2ludHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX0FOQ0hPUjoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikgKEludGVybmFsRUxpc3Q8Pz4pIGdldEFuY2hvcigpKQotCQkJCQkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fV0FZUE9JTlRTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0V2F5cG9pbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX0FOQ0hPUjoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldEFuY2hvcigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX1dBWVBPSU5UUzoKLQkJCXJldHVybiBnZXRXYXlwb2ludHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX0FOQ0hPUjoKLQkJCXJldHVybiBnZXRBbmNob3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fV0FZUE9JTlRTOgotCQkJZ2V0V2F5cG9pbnRzKCkuY2xlYXIoKTsKLQkJCWdldFdheXBvaW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUG9pbnQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFX19BTkNIT1I6Ci0JCQlnZXRBbmNob3IoKS5jbGVhcigpOwotCQkJZ2V0QW5jaG9yKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBHcmFwaENvbm5lY3Rvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFX19XQVlQT0lOVFM6Ci0JCQlnZXRXYXlwb2ludHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fQU5DSE9SOgotCQkJZ2V0QW5jaG9yKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fV0FZUE9JTlRTOgotCQkJcmV0dXJuIHdheXBvaW50cyAhPSBudWxsICYmICF3YXlwb2ludHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fQU5DSE9SOgotCQkJcmV0dXJuIGFuY2hvciAhPSBudWxsICYmICFhbmNob3IuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9HcmFwaEVkZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhM2VjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWxlbWVudEltcGwjZ2V0Q29udGFpbmVkIDxlbT5Db250YWluZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVsZW1lbnRJbXBsI2dldFBvc2l0aW9uIDxlbT5Qb3NpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWxlbWVudEltcGwjZ2V0TGluayA8ZW0+TGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWxlbWVudEltcGwjZ2V0QW5jaG9yYWdlIDxlbT5BbmNob3JhZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVsZW1lbnRJbXBsI2dldFNlbWFudGljTW9kZWwgPGVtPlNlbWFudGljIE1vZGVsPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR3JhcGhFbGVtZW50SW1wbCBleHRlbmRzIERpYWdyYW1FbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUdyYXBoRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250YWluZWQoKSA8ZW0+Q29udGFpbmVkPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnRhaW5lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PERpYWdyYW1FbGVtZW50PiBjb250YWluZWQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3NpdGlvbigpIDxlbT5Qb3NpdGlvbjwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCBwb3NpdGlvbjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmsoKSA8ZW0+TGluazwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RGlhZ3JhbUxpbms+IGxpbms7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbmNob3JhZ2UoKSA8ZW0+QW5jaG9yYWdlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFuY2hvcmFnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEdyYXBoQ29ubmVjdG9yPiBhbmNob3JhZ2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZW1hbnRpY01vZGVsKCkgPGVtPlNlbWFudGljIE1vZGVsPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZW1hbnRpY01vZGVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VtYW50aWNNb2RlbEJyaWRnZSBzZW1hbnRpY01vZGVsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEdyYXBoRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGdldFBvc2l0aW9uKCkgewotCQlpZiAocG9zaXRpb24gIT0gbnVsbCAmJiAoKEVPYmplY3QpIHBvc2l0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUG9zaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwb3NpdGlvbjsKLQkJCXBvc2l0aW9uID0gKFBvaW50KSBlUmVzb2x2ZVByb3h5KG9sZFBvc2l0aW9uKTsKLQkJCWlmIChwb3NpdGlvbiAhPSBvbGRQb3NpdGlvbikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19QT1NJVElPTiwgb2xkUG9zaXRpb24sCi0JCQkJCQkJcG9zaXRpb24pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGJhc2ljR2V0UG9zaXRpb24oKSB7Ci0JCXJldHVybiBwb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3NpdGlvbihQb2ludCBuZXdQb3NpdGlvbikgewotCQlQb2ludCBvbGRQb3NpdGlvbiA9IHBvc2l0aW9uOwotCQlwb3NpdGlvbiA9IG5ld1Bvc2l0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OLCBvbGRQb3NpdGlvbiwgcG9zaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxEaWFncmFtRWxlbWVudD4gZ2V0Q29udGFpbmVkKCkgewotCQlpZiAoY29udGFpbmVkID09IG51bGwpIHsKLQkJCWNvbnRhaW5lZCA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0LlJlc29sdmluZzxEaWFncmFtRWxlbWVudD4oCi0JCQkJCURpYWdyYW1FbGVtZW50LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUik7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxEaWFncmFtTGluaz4gZ2V0TGluaygpIHsKLQkJaWYgKGxpbmsgPT0gbnVsbCkgewotCQkJbGluayA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0LlJlc29sdmluZzxEaWFncmFtTGluaz4oCi0JCQkJCURpYWdyYW1MaW5rLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0xJTkssCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UKTsKLQkJfQotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxHcmFwaENvbm5lY3Rvcj4gZ2V0QW5jaG9yYWdlKCkgewotCQlpZiAoYW5jaG9yYWdlID09IG51bGwpIHsKLQkJCWFuY2hvcmFnZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0LlJlc29sdmluZzxHcmFwaENvbm5lY3Rvcj4oCi0JCQkJCUdyYXBoQ29ubmVjdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRSwKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQpOwotCQl9Ci0JCXJldHVybiBhbmNob3JhZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlbWFudGljTW9kZWxCcmlkZ2UgZ2V0U2VtYW50aWNNb2RlbCgpIHsKLQkJaWYgKHNlbWFudGljTW9kZWwgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHNlbWFudGljTW9kZWwpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRTZW1hbnRpY01vZGVsID0gKEludGVybmFsRU9iamVjdCkgc2VtYW50aWNNb2RlbDsKLQkJCXNlbWFudGljTW9kZWwgPSAoU2VtYW50aWNNb2RlbEJyaWRnZSkgZVJlc29sdmVQcm94eShvbGRTZW1hbnRpY01vZGVsKTsKLQkJCWlmIChzZW1hbnRpY01vZGVsICE9IG9sZFNlbWFudGljTW9kZWwpIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3U2VtYW50aWNNb2RlbCA9IChJbnRlcm5hbEVPYmplY3QpIHNlbWFudGljTW9kZWw7Ci0JCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFNlbWFudGljTW9kZWwuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5ULAotCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgbnVsbCk7Ci0JCQkJaWYgKG5ld1NlbWFudGljTW9kZWwuZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3U2VtYW50aWNNb2RlbC5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5ULAotCQkJCQkJCVNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsIG1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMLAotCQkJCQkJCW9sZFNlbWFudGljTW9kZWwsIHNlbWFudGljTW9kZWwpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VtYW50aWNNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VtYW50aWNNb2RlbEJyaWRnZSBiYXNpY0dldFNlbWFudGljTW9kZWwoKSB7Ci0JCXJldHVybiBzZW1hbnRpY01vZGVsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFNlbWFudGljTW9kZWwoCi0JCQlTZW1hbnRpY01vZGVsQnJpZGdlIG5ld1NlbWFudGljTW9kZWwsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJU2VtYW50aWNNb2RlbEJyaWRnZSBvbGRTZW1hbnRpY01vZGVsID0gc2VtYW50aWNNb2RlbDsKLQkJc2VtYW50aWNNb2RlbCA9IG5ld1NlbWFudGljTW9kZWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwsCi0JCQkJCW9sZFNlbWFudGljTW9kZWwsIG5ld1NlbWFudGljTW9kZWwpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VtYW50aWNNb2RlbChTZW1hbnRpY01vZGVsQnJpZGdlIG5ld1NlbWFudGljTW9kZWwpIHsKLQkJaWYgKG5ld1NlbWFudGljTW9kZWwgIT0gc2VtYW50aWNNb2RlbCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc2VtYW50aWNNb2RlbCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgc2VtYW50aWNNb2RlbCkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5ULAotCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3U2VtYW50aWNNb2RlbCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3U2VtYW50aWNNb2RlbCkuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5ULAotCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTZW1hbnRpY01vZGVsKG5ld1NlbWFudGljTW9kZWwsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMLCBuZXdTZW1hbnRpY01vZGVsLAotCQkJCQluZXdTZW1hbnRpY01vZGVsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRDoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikgKEludGVybmFsRUxpc3Q8Pz4pIGdldENvbnRhaW5lZCgpKQotCQkJCQkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikgKEludGVybmFsRUxpc3Q8Pz4pIGdldExpbmsoKSkKLQkJCQkJLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikgKEludGVybmFsRUxpc3Q8Pz4pIGdldEFuY2hvcmFnZSgpKQotCQkJCQkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw6Ci0JCQlpZiAoc2VtYW50aWNNb2RlbCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgc2VtYW50aWNNb2RlbCkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXRTZW1hbnRpY01vZGVsKChTZW1hbnRpY01vZGVsQnJpZGdlKSBvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQ6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRDb250YWluZWQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldExpbmsoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0QW5jaG9yYWdlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOgotCQkJcmV0dXJuIGJhc2ljU2V0U2VtYW50aWNNb2RlbChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEOgotCQkJcmV0dXJuIGdldENvbnRhaW5lZCgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fUE9TSVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UG9zaXRpb24oKTsKLQkJCXJldHVybiBiYXNpY0dldFBvc2l0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19MSU5LOgotCQkJcmV0dXJuIGdldExpbmsoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRToKLQkJCXJldHVybiBnZXRBbmNob3JhZ2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFNlbWFudGljTW9kZWwoKTsKLQkJCXJldHVybiBiYXNpY0dldFNlbWFudGljTW9kZWwoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEOgotCQkJZ2V0Q29udGFpbmVkKCkuY2xlYXIoKTsKLQkJCWdldENvbnRhaW5lZCgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIERpYWdyYW1FbGVtZW50PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fUE9TSVRJT046Ci0JCQlzZXRQb3NpdGlvbigoUG9pbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0xJTks6Ci0JCQlnZXRMaW5rKCkuY2xlYXIoKTsKLQkJCWdldExpbmsoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERpYWdyYW1MaW5rPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFOgotCQkJZ2V0QW5jaG9yYWdlKCkuY2xlYXIoKTsKLQkJCWdldEFuY2hvcmFnZSgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIEdyYXBoQ29ubmVjdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw6Ci0JCQlzZXRTZW1hbnRpY01vZGVsKChTZW1hbnRpY01vZGVsQnJpZGdlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEOgotCQkJZ2V0Q29udGFpbmVkKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OOgotCQkJc2V0UG9zaXRpb24oKFBvaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0xJTks6Ci0JCQlnZXRMaW5rKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRToKLQkJCWdldEFuY2hvcmFnZSgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDoKLQkJCXNldFNlbWFudGljTW9kZWwoKFNlbWFudGljTW9kZWxCcmlkZ2UpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQ6Ci0JCQlyZXR1cm4gY29udGFpbmVkICE9IG51bGwgJiYgIWNvbnRhaW5lZC5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19QT1NJVElPTjoKLQkJCXJldHVybiBwb3NpdGlvbiAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSzoKLQkJCXJldHVybiBsaW5rICE9IG51bGwgJiYgIWxpbmsuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFOgotCQkJcmV0dXJuIGFuY2hvcmFnZSAhPSBudWxsICYmICFhbmNob3JhZ2UuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw6Ci0JCQlyZXR1cm4gc2VtYW50aWNNb2RlbCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9HcmFwaEVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhOb2RlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFiODk2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhOb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HcmFwaCBOb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhOb2RlSW1wbCNnZXRTaXplIDxlbT5TaXplPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhOb2RlSW1wbCBleHRlbmRzIEdyYXBoRWxlbWVudEltcGwgaW1wbGVtZW50cyBHcmFwaE5vZGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2l6ZSgpIDxlbT5TaXplPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTaXplKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIHNpemU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3JhcGhOb2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGltZW5zaW9uIGdldFNpemUoKSB7Ci0JCWlmIChzaXplICE9IG51bGwgJiYgKChFT2JqZWN0KSBzaXplKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkU2l6ZSA9IChJbnRlcm5hbEVPYmplY3QpIHNpemU7Ci0JCQlzaXplID0gKERpbWVuc2lvbikgZVJlc29sdmVQcm94eShvbGRTaXplKTsKLQkJCWlmIChzaXplICE9IG9sZFNpemUpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fU0laRSwgb2xkU2l6ZSwgc2l6ZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzaXplOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaW1lbnNpb24gYmFzaWNHZXRTaXplKCkgewotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaXplKERpbWVuc2lvbiBuZXdTaXplKSB7Ci0JCURpbWVuc2lvbiBvbGRTaXplID0gc2l6ZTsKLQkJc2l6ZSA9IG5ld1NpemU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fU0laRSwgb2xkU2l6ZSwgc2l6ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX05PREVfX1NJWkU6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0U2l6ZSgpOwotCQkJcmV0dXJuIGJhc2ljR2V0U2l6ZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9OT0RFX19TSVpFOgotCQkJc2V0U2l6ZSgoRGltZW5zaW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fU0laRToKLQkJCXNldFNpemUoKERpbWVuc2lvbikgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX05PREVfX1NJWkU6Ci0JCQlyZXR1cm4gc2l6ZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9HcmFwaE5vZGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhpY1ByaW1pdGl2ZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaGljUHJpbWl0aXZlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTkwYzBkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaGljUHJpbWl0aXZlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoaWNQcmltaXRpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGhpYyBQcmltaXRpdmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHcmFwaGljUHJpbWl0aXZlSW1wbCBleHRlbmRzIExlYWZFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUdyYXBoaWNQcmltaXRpdmUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEdyYXBoaWNQcmltaXRpdmVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSElDX1BSSU1JVElWRTsKLQl9Ci0KLX0gLy9HcmFwaGljUHJpbWl0aXZlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0d1aWRhbmNlRGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0NWZkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRhbmNlRGVzY3JpcHRpb25JbXBsI2dldEF0dGFjaG1lbnRzIDxlbT5BdHRhY2htZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzCi0JCUd1aWRhbmNlRGVzY3JpcHRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dGFjaG1lbnRzKCkgPGVtPkF0dGFjaG1lbnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRhY2htZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUQUNITUVOVFNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dGFjaG1lbnRzKCkgPGVtPkF0dGFjaG1lbnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRhY2htZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdHRhY2htZW50cyA9IEFUVEFDSE1FTlRTX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEd1aWRhbmNlRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5HVUlEQU5DRV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dGFjaG1lbnRzKCkgewotCQlyZXR1cm4gYXR0YWNobWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0YWNobWVudHMoU3RyaW5nIG5ld0F0dGFjaG1lbnRzKSB7Ci0JCVN0cmluZyBvbGRBdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzOwotCQlhdHRhY2htZW50cyA9IG5ld0F0dGFjaG1lbnRzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UUywKLQkJCQkJb2xkQXR0YWNobWVudHMsIGF0dGFjaG1lbnRzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlRTOgotCQkJcmV0dXJuIGdldEF0dGFjaG1lbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UUzoKLQkJCXNldEF0dGFjaG1lbnRzKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVFM6Ci0JCQlzZXRBdHRhY2htZW50cyhBVFRBQ0hNRU5UU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UUzoKLQkJCXJldHVybiBBVFRBQ0hNRU5UU19FREVGQVVMVCA9PSBudWxsID8gYXR0YWNobWVudHMgIT0gbnVsbAotCQkJCQk6ICFBVFRBQ0hNRU5UU19FREVGQVVMVC5lcXVhbHMoYXR0YWNobWVudHMpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF0dGFjaG1lbnRzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGF0dGFjaG1lbnRzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HdWlkYW5jZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HdWlkYW5jZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0Y2YyYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3VpZGFuY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGFuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHdWlkYW5jZUltcGwgZXh0ZW5kcyBDb250ZW50RWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlHdWlkYW5jZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3VpZGFuY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5HVUlEQU5DRTsKLQl9Ci0KLX0gLy9HdWlkYW5jZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HdWlkZWxpbmVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3VpZGVsaW5lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTBlNzJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HdWlkZWxpbmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRlbGluZUltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBHdWlkZWxpbmUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEd1aWRlbGluZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkdVSURFTElORTsKLQl9Ci0KLX0gLy9HdWlkZWxpbmVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvSW1hZ2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvSW1hZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNjJjZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0ltYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW1hZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JbWFnZUltcGwjZ2V0VXJpIDxlbT5Vcmk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JbWFnZUltcGwjZ2V0TWltZVR5cGUgPGVtPk1pbWUgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEltYWdlSW1wbCBleHRlbmRzIExlYWZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEltYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmkoKSA8ZW0+VXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVVJJIFVSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmkoKSA8ZW0+VXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBVUkkgdXJpID0gVVJJX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbWVUeXBlKCkgPGVtPk1pbWUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWltZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfVFlQRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWltZVR5cGUoKSA8ZW0+TWltZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtaW1lVHlwZSA9IE1JTUVfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLklNQUdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVUkkgZ2V0VXJpKCkgewotCQlyZXR1cm4gdXJpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVyaShVUkkgbmV3VXJpKSB7Ci0JCVVSSSBvbGRVcmkgPSB1cmk7Ci0JCXVyaSA9IG5ld1VyaTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5JTUFHRV9fVVJJLCBvbGRVcmksIHVyaSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoKSB7Ci0JCXJldHVybiBtaW1lVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaW1lVHlwZShTdHJpbmcgbmV3TWltZVR5cGUpIHsKLQkJU3RyaW5nIG9sZE1pbWVUeXBlID0gbWltZVR5cGU7Ci0JCW1pbWVUeXBlID0gbmV3TWltZVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuSU1BR0VfX01JTUVfVFlQRSwgb2xkTWltZVR5cGUsIG1pbWVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuSU1BR0VfX1VSSToKLQkJCXJldHVybiBnZXRVcmkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFX19NSU1FX1RZUEU6Ci0JCQlyZXR1cm4gZ2V0TWltZVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuSU1BR0VfX1VSSToKLQkJCXNldFVyaSgoVVJJKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5JTUFHRV9fTUlNRV9UWVBFOgotCQkJc2V0TWltZVR5cGUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFX19VUkk6Ci0JCQlzZXRVcmkoVVJJX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFX19NSU1FX1RZUEU6Ci0JCQlzZXRNaW1lVHlwZShNSU1FX1RZUEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5JTUFHRV9fVVJJOgotCQkJcmV0dXJuIFVSSV9FREVGQVVMVCA9PSBudWxsID8gdXJpICE9IG51bGwgOiAhVVJJX0VERUZBVUxUCi0JCQkJCS5lcXVhbHModXJpKTsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFX19NSU1FX1RZUEU6Ci0JCQlyZXR1cm4gTUlNRV9UWVBFX0VERUZBVUxUID09IG51bGwgPyBtaW1lVHlwZSAhPSBudWxsCi0JCQkJCTogIU1JTUVfVFlQRV9FREVGQVVMVC5lcXVhbHMobWltZVR5cGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVyaTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh1cmkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1pbWVUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1pbWVUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vSW1hZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvSXRlcmF0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0l0ZXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkwZWU5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvSXRlcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JdGVyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVyYXRpb25JbXBsIGV4dGVuZHMgQWN0aXZpdHlJbXBsIGltcGxlbWVudHMgSXRlcmF0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5JVEVSQVRJT047Ci0JfQotCi19IC8vSXRlcmF0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0tpbmRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvS2luZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVhYWVkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvS2luZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+S2luZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLktpbmRJbXBsI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEtpbmRJbXBsIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJbXBsIGltcGxlbWVudHMgS2luZCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvPiBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBLaW5kSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuS0lORDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbz4gZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSB7Ci0JCWlmIChhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyA9PSBudWxsKSB7Ci0JCQlhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmc8QXBwbGljYWJsZU1ldGFDbGFzc0luZm8+KAotCQkJCQlBcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5LSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTyk7Ci0JCX0KLQkJcmV0dXJuIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5LSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkpCi0JCQkJCS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOgotCQkJcmV0dXJuIGdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOgotCQkJZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKS5jbGVhcigpOwotCQkJZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbz4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5LSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTzoKLQkJCWdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk86Ci0JCQlyZXR1cm4gYXBwbGljYWJsZU1ldGFDbGFzc0luZm8gIT0gbnVsbAotCQkJCQkmJiAhYXBwbGljYWJsZU1ldGFDbGFzc0luZm8uaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9LaW5kSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0xlYWZFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0xlYWZFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWEyMzg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9MZWFmRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5MZWFmRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5MZWFmIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMZWFmRWxlbWVudEltcGwgZXh0ZW5kcyBEaWFncmFtRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlMZWFmRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGVhZkVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5MRUFGX0VMRU1FTlQ7Ci0JfQotCi19IC8vTGVhZkVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kQ29uZmlndXJhdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RDb25maWd1cmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTQ1MzdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RDb25maWd1cmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgQ29uZmlndXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldE1ldGhvZFBsdWdpblNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uIDxlbT5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRQcm9jZXNzVmlld3MgPGVtPlByb2Nlc3MgVmlld3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXREZWZhdWx0VmlldyA8ZW0+RGVmYXVsdCBWaWV3PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0QmFzZUNvbmZpZ3VyYXRpb25zIDxlbT5CYXNlIENvbmZpZ3VyYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0U3VidHJhY3RlZENhdGVnb3J5IDxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0QWRkZWRDYXRlZ29yeSA8ZW0+QWRkZWQgQ2F0ZWdvcnk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RDb25maWd1cmF0aW9uSW1wbCBleHRlbmRzIE1ldGhvZFVuaXRJbXBsIGltcGxlbWVudHMKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSA8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kUGx1Z2luPiBtZXRob2RQbHVnaW5TZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkgPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kUGFja2FnZT4gbWV0aG9kUGFja2FnZVNlbGVjdGlvbjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2Nlc3NWaWV3cygpIDxlbT5Qcm9jZXNzIFZpZXdzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2Nlc3NWaWV3cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PENvbnRlbnRDYXRlZ29yeT4gcHJvY2Vzc1ZpZXdzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFZpZXcoKSA8ZW0+RGVmYXVsdCBWaWV3PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0VmlldygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnRDYXRlZ29yeSBkZWZhdWx0VmlldzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VDb25maWd1cmF0aW9ucygpIDxlbT5CYXNlIENvbmZpZ3VyYXRpb25zPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhc2VDb25maWd1cmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGJhc2VDb25maWd1cmF0aW9uczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YnRyYWN0ZWRDYXRlZ29yeSgpIDxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YnRyYWN0ZWRDYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PENvbnRlbnRDYXRlZ29yeT4gc3VidHJhY3RlZENhdGVnb3J5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkZWRDYXRlZ29yeSgpIDxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRlZENhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Q29udGVudENhdGVnb3J5PiBhZGRlZENhdGVnb3J5OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfQ09ORklHVVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxNZXRob2RQbHVnaW4+IGdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpIHsKLQkJaWYgKG1ldGhvZFBsdWdpblNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQltZXRob2RQbHVnaW5TZWxlY3Rpb24gPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PE1ldGhvZFBsdWdpbj4oCi0JCQkJCU1ldGhvZFBsdWdpbi5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT04pOwotCQl9Ci0JCXJldHVybiBtZXRob2RQbHVnaW5TZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8TWV0aG9kUGFja2FnZT4gZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpIHsKLQkJaWYgKG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJbWV0aG9kUGFja2FnZVNlbGVjdGlvbiA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8TWV0aG9kUGFja2FnZT4oCi0JCQkJCU1ldGhvZFBhY2thZ2UuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTik7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFBhY2thZ2VTZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8Q29udGVudENhdGVnb3J5PiBnZXRQcm9jZXNzVmlld3MoKSB7Ci0JCWlmIChwcm9jZXNzVmlld3MgPT0gbnVsbCkgewotCQkJcHJvY2Vzc1ZpZXdzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxDb250ZW50Q2F0ZWdvcnk+KAotCQkJCQlDb250ZW50Q2F0ZWdvcnkuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFV1MpOwotCQl9Ci0JCXJldHVybiBwcm9jZXNzVmlld3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnRDYXRlZ29yeSBnZXREZWZhdWx0VmlldygpIHsKLQkJaWYgKGRlZmF1bHRWaWV3ICE9IG51bGwgJiYgKChFT2JqZWN0KSBkZWZhdWx0VmlldykuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZERlZmF1bHRWaWV3ID0gKEludGVybmFsRU9iamVjdCkgZGVmYXVsdFZpZXc7Ci0JCQlkZWZhdWx0VmlldyA9IChDb250ZW50Q2F0ZWdvcnkpIGVSZXNvbHZlUHJveHkob2xkRGVmYXVsdFZpZXcpOwotCQkJaWYgKGRlZmF1bHRWaWV3ICE9IG9sZERlZmF1bHRWaWV3KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVcsCi0JCQkJCQkJb2xkRGVmYXVsdFZpZXcsIGRlZmF1bHRWaWV3KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRWaWV3OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50Q2F0ZWdvcnkgYmFzaWNHZXREZWZhdWx0VmlldygpIHsKLQkJcmV0dXJuIGRlZmF1bHRWaWV3OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRWaWV3KENvbnRlbnRDYXRlZ29yeSBuZXdEZWZhdWx0VmlldykgewotCQlDb250ZW50Q2F0ZWdvcnkgb2xkRGVmYXVsdFZpZXcgPSBkZWZhdWx0VmlldzsKLQkJZGVmYXVsdFZpZXcgPSBuZXdEZWZhdWx0VmlldzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXLAotCQkJCQlvbGREZWZhdWx0VmlldywgZGVmYXVsdFZpZXcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBnZXRCYXNlQ29uZmlndXJhdGlvbnMoKSB7Ci0JCWlmIChiYXNlQ29uZmlndXJhdGlvbnMgPT0gbnVsbCkgewotCQkJYmFzZUNvbmZpZ3VyYXRpb25zID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPigKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxDb250ZW50Q2F0ZWdvcnk+IGdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpIHsKLQkJaWYgKHN1YnRyYWN0ZWRDYXRlZ29yeSA9PSBudWxsKSB7Ci0JCQlzdWJ0cmFjdGVkQ2F0ZWdvcnkgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PENvbnRlbnRDYXRlZ29yeT4oCi0JCQkJCUNvbnRlbnRDYXRlZ29yeS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWSk7Ci0JCX0KLQkJcmV0dXJuIHN1YnRyYWN0ZWRDYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxDb250ZW50Q2F0ZWdvcnk+IGdldEFkZGVkQ2F0ZWdvcnkoKSB7Ci0JCWlmIChhZGRlZENhdGVnb3J5ID09IG51bGwpIHsKLQkJCWFkZGVkQ2F0ZWdvcnkgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PENvbnRlbnRDYXRlZ29yeT4oCi0JCQkJCUNvbnRlbnRDYXRlZ29yeS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlkpOwotCQl9Ci0JCXJldHVybiBhZGRlZENhdGVnb3J5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjoKLQkJCXJldHVybiBnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT046Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFV1M6Ci0JCQlyZXR1cm4gZ2V0UHJvY2Vzc1ZpZXdzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldERlZmF1bHRWaWV3KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXREZWZhdWx0VmlldygpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTlM6Ci0JCQlyZXR1cm4gZ2V0QmFzZUNvbmZpZ3VyYXRpb25zKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWToKLQkJCXJldHVybiBnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWToKLQkJCXJldHVybiBnZXRBZGRlZENhdGVnb3J5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjoKLQkJCWdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmNsZWFyKCk7Ci0JCQlnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RQbHVnaW4+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNsZWFyKCk7Ci0JCQlnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kUGFja2FnZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVdTOgotCQkJZ2V0UHJvY2Vzc1ZpZXdzKCkuY2xlYXIoKTsKLQkJCWdldFByb2Nlc3NWaWV3cygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRlbnRDYXRlZ29yeT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVc6Ci0JCQlzZXREZWZhdWx0VmlldygoQ29udGVudENhdGVnb3J5KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OUzoKLQkJCWdldEJhc2VDb25maWd1cmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlnZXRCYXNlQ29uZmlndXJhdGlvbnMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RDb25maWd1cmF0aW9uPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlk6Ci0JCQlnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKS5jbGVhcigpOwotCQkJZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29udGVudENhdGVnb3J5PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZOgotCQkJZ2V0QWRkZWRDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQlnZXRBZGRlZENhdGVnb3J5KCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29udGVudENhdGVnb3J5PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjoKLQkJCWdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXUzoKLQkJCWdldFByb2Nlc3NWaWV3cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXOgotCQkJc2V0RGVmYXVsdFZpZXcoKENvbnRlbnRDYXRlZ29yeSkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OUzoKLQkJCWdldEJhc2VDb25maWd1cmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWToKLQkJCWdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlk6Ci0JCQlnZXRBZGRlZENhdGVnb3J5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OOgotCQkJcmV0dXJuIG1ldGhvZFBsdWdpblNlbGVjdGlvbiAhPSBudWxsCi0JCQkJCSYmICFtZXRob2RQbHVnaW5TZWxlY3Rpb24uaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTjoKLQkJCXJldHVybiBtZXRob2RQYWNrYWdlU2VsZWN0aW9uICE9IG51bGwKLQkJCQkJJiYgIW1ldGhvZFBhY2thZ2VTZWxlY3Rpb24uaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFV1M6Ci0JCQlyZXR1cm4gcHJvY2Vzc1ZpZXdzICE9IG51bGwgJiYgIXByb2Nlc3NWaWV3cy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXOgotCQkJcmV0dXJuIGRlZmF1bHRWaWV3ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OUzoKLQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbnMgIT0gbnVsbCAmJiAhYmFzZUNvbmZpZ3VyYXRpb25zLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZOgotCQkJcmV0dXJuIHN1YnRyYWN0ZWRDYXRlZ29yeSAhPSBudWxsICYmICFzdWJ0cmFjdGVkQ2F0ZWdvcnkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZOgotCQkJcmV0dXJuIGFkZGVkQ2F0ZWdvcnkgIT0gbnVsbCAmJiAhYWRkZWRDYXRlZ29yeS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL01ldGhvZENvbmZpZ3VyYXRpb25JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kRWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjdmMjZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0R3VpZCA8ZW0+R3VpZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0QnJpZWZEZXNjcmlwdGlvbiA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRPd25lZFJ1bGVzIDxlbT5Pd25lZCBSdWxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRLaW5kIDxlbT5LaW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0U3VwcHJlc3NlZCA8ZW0+U3VwcHJlc3NlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldE9yZGVyaW5nR3VpZGUgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWV0aG9kRWxlbWVudEltcGwgZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnRJbXBsCi0JCWltcGxlbWVudHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3VpZCgpIDxlbT5HdWlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHdWlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlEX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEd1aWQoKSA8ZW0+R3VpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3VpZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBndWlkID0gR1VJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50YXRpb25OYW1lKCkgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50YXRpb25OYW1lKCkgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUgPSBQUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmllZkRlc2NyaXB0aW9uKCkgPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCUklFRl9ERVNDUklQVElPTl9FREVGQVVMVCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmllZkRlc2NyaXB0aW9uKCkgPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJyaWVmRGVzY3JpcHRpb24gPSBCUklFRl9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE93bmVkUnVsZXMoKSA8ZW0+T3duZWQgUnVsZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3duZWRSdWxlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PENvbnN0cmFpbnQ+IG93bmVkUnVsZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5PiBtZXRob2RFbGVtZW50UHJvcGVydHk7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLaW5kKCkgPGVtPktpbmQ8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEtpbmQ+IGtpbmQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3VwcHJlc3NlZCgpIDxlbT5TdXBwcmVzc2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdXBwcmVzc2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gU1VQUFJFU1NFRF9FREVGQVVMVCA9IEJvb2xlYW4uRkFMU0U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdXBwcmVzc2VkKCkgPGVtPlN1cHByZXNzZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1cHByZXNzZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIHN1cHByZXNzZWQgPSBTVVBQUkVTU0VEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yZGVyaW5nR3VpZGUoKSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9yZGVyaW5nR3VpZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9SREVSSU5HX0dVSURFX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yZGVyaW5nR3VpZGUoKSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9yZGVyaW5nR3VpZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgb3JkZXJpbmdHdWlkZSA9IE9SREVSSU5HX0dVSURFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R3VpZCgpIHsKLQkJaWYgKGd1aWQgPT0gbnVsbCB8fCBndWlkLmxlbmd0aCgpID09IDApIHsKLQkJCWd1aWQgPSBVbWFVdGlsLmdlbmVyYXRlR1VJRCgpOwotCQl9Ci0JCXJldHVybiBndWlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIHZvaWQgc2V0R3VpZChTdHJpbmcgbmV3R3VpZCkgewotCQlTdHJpbmcgb2xkR3VpZCA9IGd1aWQ7Ci0JCWd1aWQgPSBuZXdHdWlkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HVUlELCBvbGRHdWlkLCBndWlkKSk7Ci0KLQkJLy8gc3luY2ggdXAgdGhlIHJlc291cmNlJ3MgSURUb0VPYmplY3RNYXAgYW5kIEVPYmplY3RUb0lETWFwIHdpdGggbmV3R3VpZAotCQkvLwotCQlpZiAoZVJlc291cmNlKCkgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZSkgewotCQkJWE1MUmVzb3VyY2UgcmVzb3VyY2UgPSAoKFhNTFJlc291cmNlKSBlUmVzb3VyY2UoKSk7Ci0JCQlyZXNvdXJjZS5zZXRJRCh0aGlzLCBuZXdHdWlkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlc2VudGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHByZXNlbnRhdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlc2VudGF0aW9uTmFtZShTdHJpbmcgbmV3UHJlc2VudGF0aW9uTmFtZSkgewotCQlTdHJpbmcgb2xkUHJlc2VudGF0aW9uTmFtZSA9IHByZXNlbnRhdGlvbk5hbWU7Ci0JCXByZXNlbnRhdGlvbk5hbWUgPSBuZXdQcmVzZW50YXRpb25OYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSwKLQkJCQkJb2xkUHJlc2VudGF0aW9uTmFtZSwgcHJlc2VudGF0aW9uTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QnJpZWZEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGJyaWVmRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QnJpZWZEZXNjcmlwdGlvbihTdHJpbmcgbmV3QnJpZWZEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkQnJpZWZEZXNjcmlwdGlvbiA9IGJyaWVmRGVzY3JpcHRpb247Ci0JCWJyaWVmRGVzY3JpcHRpb24gPSBuZXdCcmllZkRlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiwKLQkJCQkJb2xkQnJpZWZEZXNjcmlwdGlvbiwgYnJpZWZEZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PENvbnN0cmFpbnQ+IGdldE93bmVkUnVsZXMoKSB7Ci0JCWlmIChvd25lZFJ1bGVzID09IG51bGwpIHsKLQkJCW93bmVkUnVsZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPENvbnN0cmFpbnQ+KAotCQkJCQlDb25zdHJhaW50LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUyk7Ci0JCX0KLQkJcmV0dXJuIG93bmVkUnVsZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5PiBnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKSB7Ci0JCWlmIChtZXRob2RFbGVtZW50UHJvcGVydHkgPT0gbnVsbCkgewotCQkJbWV0aG9kRWxlbWVudFByb3BlcnR5ID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxNZXRob2RFbGVtZW50UHJvcGVydHk+KAotCQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kRWxlbWVudFByb3BlcnR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEtpbmQ+IGdldEtpbmQoKSB7Ci0JCWlmIChraW5kID09IG51bGwpIHsKLQkJCWtpbmQgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEtpbmQ+KEtpbmQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0tJTkQpOwotCQl9Ci0JCXJldHVybiBraW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldFN1cHByZXNzZWQoKSB7Ci0JCXJldHVybiBzdXBwcmVzc2VkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1cHByZXNzZWQoQm9vbGVhbiBuZXdTdXBwcmVzc2VkKSB7Ci0JCUJvb2xlYW4gb2xkU3VwcHJlc3NlZCA9IHN1cHByZXNzZWQ7Ci0JCXN1cHByZXNzZWQgPSBuZXdTdXBwcmVzc2VkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VELCBvbGRTdXBwcmVzc2VkLAotCQkJCQlzdXBwcmVzc2VkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPcmRlcmluZ0d1aWRlKCkgewotCQlyZXR1cm4gb3JkZXJpbmdHdWlkZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPcmRlcmluZ0d1aWRlKFN0cmluZyBuZXdPcmRlcmluZ0d1aWRlKSB7Ci0JCVN0cmluZyBvbGRPcmRlcmluZ0d1aWRlID0gb3JkZXJpbmdHdWlkZTsKLQkJb3JkZXJpbmdHdWlkZSA9IG5ld09yZGVyaW5nR3VpZGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFLAotCQkJCQlvbGRPcmRlcmluZ0d1aWRlLCBvcmRlcmluZ0d1aWRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldE93bmVkUnVsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkpLmJhc2ljUmVtb3ZlKAotCQkJCQlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HVUlEOgotCQkJcmV0dXJuIGdldEd1aWQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCXJldHVybiBnZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOgotCQkJcmV0dXJuIGdldE93bmVkUnVsZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWToKLQkJCXJldHVybiBnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19LSU5EOgotCQkJcmV0dXJuIGdldEtpbmQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOgotCQkJcmV0dXJuIGdldFN1cHByZXNzZWQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERToKLQkJCXJldHVybiBnZXRPcmRlcmluZ0d1aWRlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HVUlEOgotCQkJc2V0R3VpZCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQlzZXRQcmVzZW50YXRpb25OYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjoKLQkJCXNldEJyaWVmRGVzY3JpcHRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOgotCQkJZ2V0T3duZWRSdWxlcygpLmNsZWFyKCk7Ci0JCQlnZXRPd25lZFJ1bGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb25zdHJhaW50PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkuY2xlYXIoKTsKLQkJCWdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19LSU5EOgotCQkJZ2V0S2luZCgpLmNsZWFyKCk7Ci0JCQlnZXRLaW5kKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBLaW5kPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ6Ci0JCQlzZXRTdXBwcmVzc2VkKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU6Ci0JCQlzZXRPcmRlcmluZ0d1aWRlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1VJRDoKLQkJCXNldEd1aWQoR1VJRF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQlzZXRQcmVzZW50YXRpb25OYW1lKFBSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjoKLQkJCXNldEJyaWVmRGVzY3JpcHRpb24oQlJJRUZfREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOgotCQkJZ2V0T3duZWRSdWxlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6Ci0JCQlnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0tJTkQ6Ci0JCQlnZXRLaW5kKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOgotCQkJc2V0U3VwcHJlc3NlZChTVVBQUkVTU0VEX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERToKLQkJCXNldE9yZGVyaW5nR3VpZGUoT1JERVJJTkdfR1VJREVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1VJRDoKLQkJCXJldHVybiBHVUlEX0VERUZBVUxUID09IG51bGwgPyBndWlkICE9IG51bGwgOiAhR1VJRF9FREVGQVVMVAotCQkJCQkuZXF1YWxzKGd1aWQpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJcmV0dXJuIFBSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwcmVzZW50YXRpb25OYW1lICE9IG51bGwKLQkJCQkJOiAhUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQuZXF1YWxzKHByZXNlbnRhdGlvbk5hbWUpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIEJSSUVGX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBicmllZkRlc2NyaXB0aW9uICE9IG51bGwKLQkJCQkJOiAhQlJJRUZfREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGJyaWVmRGVzY3JpcHRpb24pOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOgotCQkJcmV0dXJuIG93bmVkUnVsZXMgIT0gbnVsbCAmJiAhb3duZWRSdWxlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6Ci0JCQlyZXR1cm4gbWV0aG9kRWxlbWVudFByb3BlcnR5ICE9IG51bGwKLQkJCQkJJiYgIW1ldGhvZEVsZW1lbnRQcm9wZXJ0eS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fS0lORDoKLQkJCXJldHVybiBraW5kICE9IG51bGwgJiYgIWtpbmQuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ6Ci0JCQlyZXR1cm4gU1VQUFJFU1NFRF9FREVGQVVMVCA9PSBudWxsID8gc3VwcHJlc3NlZCAhPSBudWxsCi0JCQkJCTogIVNVUFBSRVNTRURfRURFRkFVTFQuZXF1YWxzKHN1cHByZXNzZWQpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOgotCQkJcmV0dXJuIE9SREVSSU5HX0dVSURFX0VERUZBVUxUID09IG51bGwgPyBvcmRlcmluZ0d1aWRlICE9IG51bGwKLQkJCQkJOiAhT1JERVJJTkdfR1VJREVfRURFRkFVTFQuZXF1YWxzKG9yZGVyaW5nR3VpZGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGd1aWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZ3VpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJlc2VudGF0aW9uTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwcmVzZW50YXRpb25OYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBicmllZkRlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGJyaWVmRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN1cHByZXNzZWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc3VwcHJlc3NlZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3JkZXJpbmdHdWlkZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChvcmRlcmluZ0d1aWRlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDEyZThlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbCBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlNZXRob2RFbGVtZW50UHJvcGVydHkgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRToKLQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQlzZXRWYWx1ZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFOgotCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQKLQkJCQkJLmVxdWFscyh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kTGlicmFyeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RMaWJyYXJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTI5ODJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RMaWJyYXJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgTGlicmFyeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsI2dldE1ldGhvZFBsdWdpbnMgPGVtPk1ldGhvZCBQbHVnaW5zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwjZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIDxlbT5QcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeUltcGwgZXh0ZW5kcyBNZXRob2RVbml0SW1wbCBpbXBsZW1lbnRzIE1ldGhvZExpYnJhcnkgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUGx1Z2lucygpIDxlbT5NZXRob2QgUGx1Z2luczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQbHVnaW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kUGx1Z2luPiBtZXRob2RQbHVnaW5zOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkgPGVtPlByZWRlZmluZWQgQ29uZmlndXJhdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZExpYnJhcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxNZXRob2RQbHVnaW4+IGdldE1ldGhvZFBsdWdpbnMoKSB7Ci0JCWlmIChtZXRob2RQbHVnaW5zID09IG51bGwpIHsKLQkJCW1ldGhvZFBsdWdpbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPE1ldGhvZFBsdWdpbj4oCi0JCQkJCU1ldGhvZFBsdWdpbi5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMpOwotCQl9Ci0JCXJldHVybiBtZXRob2RQbHVnaW5zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpIHsKLQkJaWYgKHByZWRlZmluZWRDb25maWd1cmF0aW9ucyA9PSBudWxsKSB7Ci0JCQlwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPE1ldGhvZENvbmZpZ3VyYXRpb24+KAotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRNZXRob2RQbHVnaW5zKCkpLmJhc2ljUmVtb3ZlKAotCQkJCQlvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpKQotCQkJCQkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlM6Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kUGx1Z2lucygpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlM6Ci0JCQlyZXR1cm4gZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUzoKLQkJCWdldE1ldGhvZFBsdWdpbnMoKS5jbGVhcigpOwotCQkJZ2V0TWV0aG9kUGx1Z2lucygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZFBsdWdpbj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TOgotCQkJZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkuY2xlYXIoKTsKLQkJCWdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZENvbmZpZ3VyYXRpb24+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TOgotCQkJZ2V0TWV0aG9kUGx1Z2lucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUzoKLQkJCWdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUzoKLQkJCXJldHVybiBtZXRob2RQbHVnaW5zICE9IG51bGwgJiYgIW1ldGhvZFBsdWdpbnMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlM6Ci0JCQlyZXR1cm4gcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zICE9IG51bGwKLQkJCQkJJiYgIXByZWRlZmluZWRDb25maWd1cmF0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL01ldGhvZExpYnJhcnlJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kUGFja2FnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjlkZWRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbCNnZXRHbG9iYWwgPGVtPkdsb2JhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsI2dldFJldXNlZFBhY2thZ2VzIDxlbT5SZXVzZWQgUGFja2FnZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbCNnZXRDaGlsZFBhY2thZ2VzIDxlbT5DaGlsZCBQYWNrYWdlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1ldGhvZFBhY2thZ2VJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlNZXRob2RQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHbG9iYWwoKSA8ZW0+R2xvYmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHbG9iYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBHTE9CQUxfRURFRkFVTFQgPSBCb29sZWFuLkZBTFNFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R2xvYmFsKCkgPGVtPkdsb2JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R2xvYmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBnbG9iYWwgPSBHTE9CQUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXVzZWRQYWNrYWdlcygpIDxlbT5SZXVzZWQgUGFja2FnZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmV1c2VkUGFja2FnZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxNZXRob2RQYWNrYWdlPiByZXVzZWRQYWNrYWdlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoaWxkUGFja2FnZXMoKSA8ZW0+Q2hpbGQgUGFja2FnZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hpbGRQYWNrYWdlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PE1ldGhvZFBhY2thZ2U+IGNoaWxkUGFja2FnZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldEdsb2JhbCgpIHsKLQkJcmV0dXJuIGdsb2JhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHbG9iYWwoQm9vbGVhbiBuZXdHbG9iYWwpIHsKLQkJQm9vbGVhbiBvbGRHbG9iYWwgPSBnbG9iYWw7Ci0JCWdsb2JhbCA9IG5ld0dsb2JhbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMLCBvbGRHbG9iYWwsIGdsb2JhbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PE1ldGhvZFBhY2thZ2U+IGdldFJldXNlZFBhY2thZ2VzKCkgewotCQlpZiAocmV1c2VkUGFja2FnZXMgPT0gbnVsbCkgewotCQkJcmV1c2VkUGFja2FnZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PE1ldGhvZFBhY2thZ2U+KAotCQkJCQlNZXRob2RQYWNrYWdlLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRVMpOwotCQl9Ci0JCXJldHVybiByZXVzZWRQYWNrYWdlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxNZXRob2RQYWNrYWdlPiBnZXRDaGlsZFBhY2thZ2VzKCkgewotCQlpZiAoY2hpbGRQYWNrYWdlcyA9PSBudWxsKSB7Ci0JCQljaGlsZFBhY2thZ2VzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxNZXRob2RQYWNrYWdlPigKLQkJCQkJTWV0aG9kUGFja2FnZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVMpOwotCQl9Ci0JCXJldHVybiBjaGlsZFBhY2thZ2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRDaGlsZFBhY2thZ2VzKCkpLmJhc2ljUmVtb3ZlKAotCQkJCQlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HTE9CQUw6Ci0JCQlyZXR1cm4gZ2V0R2xvYmFsKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTOgotCQkJcmV0dXJuIGdldFJldXNlZFBhY2thZ2VzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVM6Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMOgotCQkJc2V0R2xvYmFsKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTOgotCQkJZ2V0UmV1c2VkUGFja2FnZXMoKS5jbGVhcigpOwotCQkJZ2V0UmV1c2VkUGFja2FnZXMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RQYWNrYWdlPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOgotCQkJZ2V0Q2hpbGRQYWNrYWdlcygpLmNsZWFyKCk7Ci0JCQlnZXRDaGlsZFBhY2thZ2VzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kUGFja2FnZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMOgotCQkJc2V0R2xvYmFsKEdMT0JBTF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTOgotCQkJZ2V0UmV1c2VkUGFja2FnZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOgotCQkJZ2V0Q2hpbGRQYWNrYWdlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HTE9CQUw6Ci0JCQlyZXR1cm4gR0xPQkFMX0VERUZBVUxUID09IG51bGwgPyBnbG9iYWwgIT0gbnVsbCA6ICFHTE9CQUxfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhnbG9iYWwpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUzoKLQkJCXJldHVybiByZXVzZWRQYWNrYWdlcyAhPSBudWxsICYmICFyZXVzZWRQYWNrYWdlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVM6Ci0JCQlyZXR1cm4gY2hpbGRQYWNrYWdlcyAhPSBudWxsICYmICFjaGlsZFBhY2thZ2VzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChnbG9iYWw6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZ2xvYmFsKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlI2dldFBhcmVudFBhY2thZ2UoKQotCSAqLwotCXB1YmxpYyBNZXRob2RQYWNrYWdlIGdldFBhcmVudFBhY2thZ2UoKSB7Ci0JCUVPYmplY3QgcGFyZW50ID0gZUNvbnRhaW5lcigpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJcmV0dXJuIChNZXRob2RQYWNrYWdlKSBwYXJlbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vTWV0aG9kUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RQbHVnaW5JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kUGx1Z2luSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2M5OTcwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RQbHVnaW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgUGx1Z2luPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbCNnZXRVc2VyQ2hhbmdlYWJsZSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbCNnZXRNZXRob2RQYWNrYWdlcyA8ZW0+TWV0aG9kIFBhY2thZ2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbCNnZXRCYXNlcyA8ZW0+QmFzZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQbHVnaW5JbXBsIGV4dGVuZHMgTWV0aG9kVW5pdEltcGwgaW1wbGVtZW50cyBNZXRob2RQbHVnaW4gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzZXJDaGFuZ2VhYmxlKCkgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNlckNoYW5nZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBVU0VSX0NIQU5HRUFCTEVfRURFRkFVTFQgPSBCb29sZWFuLlRSVUU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2VyQ2hhbmdlYWJsZSgpIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiB1c2VyQ2hhbmdlYWJsZSA9IFVTRVJfQ0hBTkdFQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZFBhY2thZ2VzKCkgPGVtPk1ldGhvZCBQYWNrYWdlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQYWNrYWdlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PE1ldGhvZFBhY2thZ2U+IG1ldGhvZFBhY2thZ2VzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZXMoKSA8ZW0+QmFzZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxNZXRob2RQbHVnaW4+IGJhc2VzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZFBsdWdpbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0VXNlckNoYW5nZWFibGUoKSB7Ci0JCXJldHVybiB1c2VyQ2hhbmdlYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2VyQ2hhbmdlYWJsZShCb29sZWFuIG5ld1VzZXJDaGFuZ2VhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkVXNlckNoYW5nZWFibGUgPSB1c2VyQ2hhbmdlYWJsZTsKLQkJdXNlckNoYW5nZWFibGUgPSBuZXdVc2VyQ2hhbmdlYWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEUsCi0JCQkJCW9sZFVzZXJDaGFuZ2VhYmxlLCB1c2VyQ2hhbmdlYWJsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PE1ldGhvZFBhY2thZ2U+IGdldE1ldGhvZFBhY2thZ2VzKCkgewotCQlpZiAobWV0aG9kUGFja2FnZXMgPT0gbnVsbCkgewotCQkJbWV0aG9kUGFja2FnZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPE1ldGhvZFBhY2thZ2U+KAotCQkJCQlNZXRob2RQYWNrYWdlLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUyk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFBhY2thZ2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PE1ldGhvZFBsdWdpbj4gZ2V0QmFzZXMoKSB7Ci0JCWlmIChiYXNlcyA9PSBudWxsKSB7Ci0JCQliYXNlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8TWV0aG9kUGx1Z2luPihNZXRob2RQbHVnaW4uY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fQkFTRVMpOwotCQl9Ci0JCXJldHVybiBiYXNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0TWV0aG9kUGFja2FnZXMoKSkuYmFzaWNSZW1vdmUoCi0JCQkJCW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFOgotCQkJcmV0dXJuIGdldFVzZXJDaGFuZ2VhYmxlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVM6Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kUGFja2FnZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX0JBU0VTOgotCQkJcmV0dXJuIGdldEJhc2VzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJCXNldFVzZXJDaGFuZ2VhYmxlKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVM6Ci0JCQlnZXRNZXRob2RQYWNrYWdlcygpLmNsZWFyKCk7Ci0JCQlnZXRNZXRob2RQYWNrYWdlcygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZFBhY2thZ2U+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19CQVNFUzoKLQkJCWdldEJhc2VzKCkuY2xlYXIoKTsKLQkJCWdldEJhc2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RQbHVnaW4+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFOgotCQkJc2V0VXNlckNoYW5nZWFibGUoVVNFUl9DSEFOR0VBQkxFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUzoKLQkJCWdldE1ldGhvZFBhY2thZ2VzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX0JBU0VTOgotCQkJZ2V0QmFzZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEU6Ci0JCQlyZXR1cm4gVVNFUl9DSEFOR0VBQkxFX0VERUZBVUxUID09IG51bGwgPyB1c2VyQ2hhbmdlYWJsZSAhPSBudWxsCi0JCQkJCTogIVVTRVJfQ0hBTkdFQUJMRV9FREVGQVVMVC5lcXVhbHModXNlckNoYW5nZWFibGUpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTOgotCQkJcmV0dXJuIG1ldGhvZFBhY2thZ2VzICE9IG51bGwgJiYgIW1ldGhvZFBhY2thZ2VzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX0JBU0VTOgotCQkJcmV0dXJuIGJhc2VzICE9IG51bGwgJiYgIWJhc2VzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1c2VyQ2hhbmdlYWJsZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh1c2VyQ2hhbmdlYWJsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZFBsdWdpbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RVbml0SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZFVuaXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZDE4NDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZFVuaXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBVbml0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kVW5pdEltcGwjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsI2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kVW5pdEltcGwjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RVbml0SW1wbCNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQgPGVtPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXRob2RVbml0SW1wbCBleHRlbmRzIE1ldGhvZEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJTWV0aG9kVW5pdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9ycygpIDxlbT5BdXRob3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRob3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JTX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3JzKCkgPGVtPkF1dGhvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF1dGhvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXV0aG9ycyA9IEFVVEhPUlNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGF0ZSgpIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEYXRlIENIQU5HRV9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURhdGUoKSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEYXRlIGNoYW5nZURhdGUgPSBDSEFOR0VfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURlc2NyaXB0aW9uKCkgPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2hhbmdlRGVzY3JpcHRpb24gPSBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSA8ZW0+Q29weXJpZ2h0IFN0YXRlbWVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3VwcG9ydGluZ01hdGVyaWFsIGNvcHlyaWdodFN0YXRlbWVudDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RVbml0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1VOSVQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdXRob3JzKCkgewotCQlyZXR1cm4gYXV0aG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRob3JzKFN0cmluZyBuZXdBdXRob3JzKSB7Ci0JCVN0cmluZyBvbGRBdXRob3JzID0gYXV0aG9yczsKLQkJYXV0aG9ycyA9IG5ld0F1dGhvcnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlMsIG9sZEF1dGhvcnMsIGF1dGhvcnMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGF0ZSBnZXRDaGFuZ2VEYXRlKCkgewotCQlyZXR1cm4gY2hhbmdlRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VEYXRlKERhdGUgbmV3Q2hhbmdlRGF0ZSkgewotCQlEYXRlIG9sZENoYW5nZURhdGUgPSBjaGFuZ2VEYXRlOwotCQljaGFuZ2VEYXRlID0gbmV3Q2hhbmdlRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUsIG9sZENoYW5nZURhdGUsCi0JCQkJCWNoYW5nZURhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENoYW5nZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gY2hhbmdlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlRGVzY3JpcHRpb24oU3RyaW5nIG5ld0NoYW5nZURlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRDaGFuZ2VEZXNjcmlwdGlvbiA9IGNoYW5nZURlc2NyaXB0aW9uOwotCQljaGFuZ2VEZXNjcmlwdGlvbiA9IG5ld0NoYW5nZURlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04sCi0JCQkJCW9sZENoYW5nZURlc2NyaXB0aW9uLCBjaGFuZ2VEZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCXZlcnNpb24gPSBuZXdWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OLCBvbGRWZXJzaW9uLCB2ZXJzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN1cHBvcnRpbmdNYXRlcmlhbCBnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSB7Ci0JCWlmIChjb3B5cmlnaHRTdGF0ZW1lbnQgIT0gbnVsbAotCQkJCSYmICgoRU9iamVjdCkgY29weXJpZ2h0U3RhdGVtZW50KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkQ29weXJpZ2h0U3RhdGVtZW50ID0gKEludGVybmFsRU9iamVjdCkgY29weXJpZ2h0U3RhdGVtZW50OwotCQkJY29weXJpZ2h0U3RhdGVtZW50ID0gKFN1cHBvcnRpbmdNYXRlcmlhbCkgZVJlc29sdmVQcm94eShvbGRDb3B5cmlnaHRTdGF0ZW1lbnQpOwotCQkJaWYgKGNvcHlyaWdodFN0YXRlbWVudCAhPSBvbGRDb3B5cmlnaHRTdGF0ZW1lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQsCi0JCQkJCQkJb2xkQ29weXJpZ2h0U3RhdGVtZW50LCBjb3B5cmlnaHRTdGF0ZW1lbnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29weXJpZ2h0U3RhdGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgYmFzaWNHZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSB7Ci0JCXJldHVybiBjb3B5cmlnaHRTdGF0ZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weXJpZ2h0U3RhdGVtZW50KFN1cHBvcnRpbmdNYXRlcmlhbCBuZXdDb3B5cmlnaHRTdGF0ZW1lbnQpIHsKLQkJU3VwcG9ydGluZ01hdGVyaWFsIG9sZENvcHlyaWdodFN0YXRlbWVudCA9IGNvcHlyaWdodFN0YXRlbWVudDsKLQkJY29weXJpZ2h0U3RhdGVtZW50ID0gbmV3Q29weXJpZ2h0U3RhdGVtZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5ULAotCQkJCQlvbGRDb3B5cmlnaHRTdGF0ZW1lbnQsIGNvcHlyaWdodFN0YXRlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19BVVRIT1JTOgotCQkJcmV0dXJuIGdldEF1dGhvcnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURToKLQkJCXJldHVybiBnZXRDaGFuZ2VEYXRlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIGdldENoYW5nZURlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fVkVSU0lPTjoKLQkJCXJldHVybiBnZXRWZXJzaW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldENvcHlyaWdodFN0YXRlbWVudCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUzoKLQkJCXNldEF1dGhvcnMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOgotCQkJc2V0Q2hhbmdlRGF0ZSgoRGF0ZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCXNldENoYW5nZURlc2NyaXB0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJc2V0VmVyc2lvbigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCXNldENvcHlyaWdodFN0YXRlbWVudCgoU3VwcG9ydGluZ01hdGVyaWFsKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlM6Ci0JCQlzZXRBdXRob3JzKEFVVEhPUlNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOgotCQkJc2V0Q2hhbmdlRGF0ZShDSEFOR0VfREFURV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJc2V0Q2hhbmdlRGVzY3JpcHRpb24oQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJc2V0VmVyc2lvbihWRVJTSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJc2V0Q29weXJpZ2h0U3RhdGVtZW50KChTdXBwb3J0aW5nTWF0ZXJpYWwpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUzoKLQkJCXJldHVybiBBVVRIT1JTX0VERUZBVUxUID09IG51bGwgPyBhdXRob3JzICE9IG51bGwKLQkJCQkJOiAhQVVUSE9SU19FREVGQVVMVC5lcXVhbHMoYXV0aG9ycyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU6Ci0JCQlyZXR1cm4gQ0hBTkdFX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGNoYW5nZURhdGUgIT0gbnVsbAotCQkJCQk6ICFDSEFOR0VfREFURV9FREVGQVVMVC5lcXVhbHMoY2hhbmdlRGF0ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gY2hhbmdlRGVzY3JpcHRpb24gIT0gbnVsbAotCQkJCQk6ICFDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGNoYW5nZURlc2NyaXB0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJcmV0dXJuIFZFUlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IHZlcnNpb24gIT0gbnVsbAotCQkJCQk6ICFWRVJTSU9OX0VERUZBVUxULmVxdWFscyh2ZXJzaW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJcmV0dXJuIGNvcHlyaWdodFN0YXRlbWVudCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF1dGhvcnM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYXV0aG9ycyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2hhbmdlRGF0ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjaGFuZ2VEYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjaGFuZ2VEZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjaGFuZ2VEZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmVyc2lvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kVW5pdEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NaWxlc3RvbmVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWlsZXN0b25lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDE3N2NmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NaWxlc3RvbmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1pbGVzdG9uZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1pbGVzdG9uZUltcGwjZ2V0UmVxdWlyZWRSZXN1bHRzIDxlbT5SZXF1aXJlZCBSZXN1bHRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWlsZXN0b25lSW1wbCBleHRlbmRzIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCU1pbGVzdG9uZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXF1aXJlZFJlc3VsdHMoKSA8ZW0+UmVxdWlyZWQgUmVzdWx0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXF1aXJlZFJlc3VsdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IHJlcXVpcmVkUmVzdWx0czsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNaWxlc3RvbmVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NSUxFU1RPTkU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXRSZXF1aXJlZFJlc3VsdHMoKSB7Ci0JCWlmIChyZXF1aXJlZFJlc3VsdHMgPT0gbnVsbCkgewotCQkJcmVxdWlyZWRSZXN1bHRzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+KAotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFRTKTsKLQkJfQotCQlyZXR1cm4gcmVxdWlyZWRSZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1JTEVTVE9ORV9fUkVRVUlSRURfUkVTVUxUUzoKLQkJCXJldHVybiBnZXRSZXF1aXJlZFJlc3VsdHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFRTOgotCQkJZ2V0UmVxdWlyZWRSZXN1bHRzKCkuY2xlYXIoKTsKLQkJCWdldFJlcXVpcmVkUmVzdWx0cygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NSUxFU1RPTkVfX1JFUVVJUkVEX1JFU1VMVFM6Ci0JCQlnZXRSZXF1aXJlZFJlc3VsdHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NSUxFU1RPTkVfX1JFUVVJUkVEX1JFU1VMVFM6Ci0JCQlyZXR1cm4gcmVxdWlyZWRSZXN1bHRzICE9IG51bGwgJiYgIXJlcXVpcmVkUmVzdWx0cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL01pbGVzdG9uZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9OYW1lZEVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTmFtZWRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODkzMmEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9OYW1lZEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lZCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTmFtZWRFbGVtZW50SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmFtZWRFbGVtZW50SW1wbCBleHRlbmRzIEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJTmFtZWRFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOYW1lZEVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FOgotCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVF9fTkFNRToKLQkJCXNldE5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUU6Ci0JCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FOgotCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTmFtZWRFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL05hbWVzcGFjZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9OYW1lc3BhY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZWFjNjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL05hbWVzcGFjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFtZXNwYWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmFtZXNwYWNlSW1wbCBleHRlbmRzIE5hbWVkRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlOYW1lc3BhY2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5hbWVzcGFjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk5BTUVTUEFDRTsKLQl9Ci0KLX0gLy9OYW1lc3BhY2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvT3V0Y29tZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9PdXRjb21lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDMxMjUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9PdXRjb21lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0Y29tZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE91dGNvbWVJbXBsIGV4dGVuZHMgV29ya1Byb2R1Y3RJbXBsIGltcGxlbWVudHMgT3V0Y29tZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT3V0Y29tZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk9VVENPTUU7Ci0JfQotCi19IC8vT3V0Y29tZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZTdiOTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWNrYWdlSW1wbCBleHRlbmRzIE5hbWVzcGFjZUltcGwgaW1wbGVtZW50cwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QQUNLQUdFOwotCX0KLQotfSAvL1BhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUGFja2FnZWFibGVFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BhY2thZ2VhYmxlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJjNjRlZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUGFja2FnZWFibGVFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2VhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYWNrYWdlYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGFja2FnZWFibGVFbGVtZW50SW1wbCBleHRlbmRzIE5hbWVkRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlQYWNrYWdlYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBhY2thZ2VhYmxlRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBBQ0tBR0VBQkxFX0VMRU1FTlQ7Ci0JfQotCi19IC8vUGFja2FnZWFibGVFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BoYXNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BoYXNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTM2YzlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QaGFzZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QaGFzZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBoYXNlSW1wbCBleHRlbmRzIEFjdGl2aXR5SW1wbCBpbXBsZW1lbnRzIFBoYXNlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQaGFzZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBIQVNFOwotCX0KLQotfSAvL1BoYXNlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BsYW5uaW5nRGF0YUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QbGFubmluZ0RhdGFJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNDk0YzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BsYW5uaW5nRGF0YUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBsYW5uaW5nRGF0YUltcGwjZ2V0U3RhcnREYXRlIDxlbT5TdGFydCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbCNnZXRGaW5pc2hEYXRlIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBsYW5uaW5nRGF0YUltcGwjZ2V0UmFuayA8ZW0+UmFuazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBsYW5uaW5nRGF0YUltcGwgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlQbGFubmluZ0RhdGEgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0RGF0ZSgpIDxlbT5TdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGF0ZSBTVEFSVF9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0RGF0ZSgpIDxlbT5TdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEYXRlIHN0YXJ0RGF0ZSA9IFNUQVJUX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoRGF0ZSgpIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEYXRlIEZJTklTSF9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaERhdGUoKSA8ZW0+RmluaXNoIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEYXRlIGZpbmlzaERhdGUgPSBGSU5JU0hfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYW5rKCkgPGVtPlJhbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFJBTktfRURFRkFVTFQgPSAwOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFuaygpIDxlbT5SYW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHJhbmsgPSBSQU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBsYW5uaW5nRGF0YUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBMQU5OSU5HX0RBVEE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERhdGUgZ2V0U3RhcnREYXRlKCkgewotCQlyZXR1cm4gc3RhcnREYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0RGF0ZShEYXRlIG5ld1N0YXJ0RGF0ZSkgewotCQlEYXRlIG9sZFN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTsKLQkJc3RhcnREYXRlID0gbmV3U3RhcnREYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEUsIG9sZFN0YXJ0RGF0ZSwKLQkJCQkJc3RhcnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERhdGUgZ2V0RmluaXNoRGF0ZSgpIHsKLQkJcmV0dXJuIGZpbmlzaERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluaXNoRGF0ZShEYXRlIG5ld0ZpbmlzaERhdGUpIHsKLQkJRGF0ZSBvbGRGaW5pc2hEYXRlID0gZmluaXNoRGF0ZTsKLQkJZmluaXNoRGF0ZSA9IG5ld0ZpbmlzaERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEUsIG9sZEZpbmlzaERhdGUsCi0JCQkJCWZpbmlzaERhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJhbmsoKSB7Ci0JCXJldHVybiByYW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhbmsoaW50IG5ld1JhbmspIHsKLQkJaW50IG9sZFJhbmsgPSByYW5rOwotCQlyYW5rID0gbmV3UmFuazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LLCBvbGRSYW5rLCByYW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURToKLQkJCXJldHVybiBnZXRTdGFydERhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFOgotCQkJcmV0dXJuIGdldEZpbmlzaERhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTks6Ci0JCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0UmFuaygpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURToKLQkJCXNldFN0YXJ0RGF0ZSgoRGF0ZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEU6Ci0JCQlzZXRGaW5pc2hEYXRlKChEYXRlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LOgotCQkJc2V0UmFuaygoKEludGVnZXIpIG5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19TVEFSVF9EQVRFOgotCQkJc2V0U3RhcnREYXRlKFNUQVJUX0RBVEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEU6Ci0JCQlzZXRGaW5pc2hEYXRlKEZJTklTSF9EQVRFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTks6Ci0JCQlzZXRSYW5rKFJBTktfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19TVEFSVF9EQVRFOgotCQkJcmV0dXJuIFNUQVJUX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0RGF0ZSAhPSBudWxsCi0JCQkJCTogIVNUQVJUX0RBVEVfRURFRkFVTFQuZXF1YWxzKHN0YXJ0RGF0ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURToKLQkJCXJldHVybiBGSU5JU0hfREFURV9FREVGQVVMVCA9PSBudWxsID8gZmluaXNoRGF0ZSAhPSBudWxsCi0JCQkJCTogIUZJTklTSF9EQVRFX0VERUZBVUxULmVxdWFscyhmaW5pc2hEYXRlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTks6Ci0JCQlyZXR1cm4gcmFuayAhPSBSQU5LX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHN0YXJ0RGF0ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzdGFydERhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaERhdGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZmluaXNoRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmFuazogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyYW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUGxhbm5pbmdEYXRhSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BvaW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BvaW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjRlZDFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qb2ludEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvaW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUG9pbnRJbXBsI2dldFggPGVtPlg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2ludEltcGwjZ2V0WSA8ZW0+WTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvaW50SW1wbCBleHRlbmRzIE11bHRpUmVzb3VyY2VFT2JqZWN0IGltcGxlbWVudHMgUG9pbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFgoKSA8ZW0+WDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgWF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYKCkgPGVtPlg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEb3VibGUgeCA9IFhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WSgpIDxlbT5ZPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRZKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvdWJsZSBZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFkoKSA8ZW0+WTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSB5ID0gWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBPSU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0WCgpIHsKLQkJcmV0dXJuIHg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0WChEb3VibGUgbmV3WCkgewotCQlEb3VibGUgb2xkWCA9IHg7Ci0JCXggPSBuZXdYOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBPSU5UX19YLCBvbGRYLCB4KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRZKCkgewotCQlyZXR1cm4geTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRZKERvdWJsZSBuZXdZKSB7Ci0JCURvdWJsZSBvbGRZID0geTsKLQkJeSA9IG5ld1k7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUE9JTlRfX1ksIG9sZFksIHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0lOVF9fWDoKLQkJCXJldHVybiBnZXRYKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0lOVF9fWToKLQkJCXJldHVybiBnZXRZKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UX19YOgotCQkJc2V0WCgoRG91YmxlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0lOVF9fWToKLQkJCXNldFkoKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UX19YOgotCQkJc2V0WChYX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UX19ZOgotCQkJc2V0WShZX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUE9JTlRfX1g6Ci0JCQlyZXR1cm4gWF9FREVGQVVMVCA9PSBudWxsID8geCAhPSBudWxsIDogIVhfRURFRkFVTFQuZXF1YWxzKHgpOwotCQljYXNlIFVtYVBhY2thZ2UuUE9JTlRfX1k6Ci0JCQlyZXR1cm4gWV9FREVGQVVMVCA9PSBudWxsID8geSAhPSBudWxsIDogIVlfRURFRkFVTFQuZXF1YWxzKHkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHg6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoeCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgeTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh5KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUG9pbnRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUG9seWxpbmVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUG9seWxpbmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YTk1ZDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BvbHlsaW5lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb2x5bGluZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvbHlsaW5lSW1wbCNnZXRDbG9zZWQgPGVtPkNsb3NlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvbHlsaW5lSW1wbCNnZXRXYXlwb2ludHMgPGVtPldheXBvaW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvbHlsaW5lSW1wbCBleHRlbmRzIEdyYXBoaWNQcmltaXRpdmVJbXBsIGltcGxlbWVudHMgUG9seWxpbmUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsb3NlZCgpIDxlbT5DbG9zZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsb3NlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIENMT1NFRF9FREVGQVVMVCA9IEJvb2xlYW4uVFJVRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsb3NlZCgpIDxlbT5DbG9zZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsb3NlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gY2xvc2VkID0gQ0xPU0VEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2F5cG9pbnRzKCkgPGVtPldheXBvaW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXYXlwb2ludHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxQb2ludD4gd2F5cG9pbnRzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBvbHlsaW5lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUE9MWUxJTkU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0Q2xvc2VkKCkgewotCQlyZXR1cm4gY2xvc2VkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsb3NlZChCb29sZWFuIG5ld0Nsb3NlZCkgewotCQlCb29sZWFuIG9sZENsb3NlZCA9IGNsb3NlZDsKLQkJY2xvc2VkID0gbmV3Q2xvc2VkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBPTFlMSU5FX19DTE9TRUQsIG9sZENsb3NlZCwgY2xvc2VkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8UG9pbnQ+IGdldFdheXBvaW50cygpIHsKLQkJaWYgKHdheXBvaW50cyA9PSBudWxsKSB7Ci0JCQl3YXlwb2ludHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPFBvaW50PigKLQkJCQkJUG9pbnQuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuUE9MWUxJTkVfX1dBWVBPSU5UUyk7Ci0JCX0KLQkJcmV0dXJuIHdheXBvaW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkVfX1dBWVBPSU5UUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldFdheXBvaW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPTFlMSU5FX19DTE9TRUQ6Ci0JCQlyZXR1cm4gZ2V0Q2xvc2VkKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORV9fV0FZUE9JTlRTOgotCQkJcmV0dXJuIGdldFdheXBvaW50cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORV9fQ0xPU0VEOgotCQkJc2V0Q2xvc2VkKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORV9fV0FZUE9JTlRTOgotCQkJZ2V0V2F5cG9pbnRzKCkuY2xlYXIoKTsKLQkJCWdldFdheXBvaW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUG9pbnQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkVfX0NMT1NFRDoKLQkJCXNldENsb3NlZChDTE9TRURfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkVfX1dBWVBPSU5UUzoKLQkJCWdldFdheXBvaW50cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPTFlMSU5FX19DTE9TRUQ6Ci0JCQlyZXR1cm4gQ0xPU0VEX0VERUZBVUxUID09IG51bGwgPyBjbG9zZWQgIT0gbnVsbCA6ICFDTE9TRURfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhjbG9zZWQpOwotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkVfX1dBWVBPSU5UUzoKLQkJCXJldHVybiB3YXlwb2ludHMgIT0gbnVsbCAmJiAhd2F5cG9pbnRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjbG9zZWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoY2xvc2VkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUG9seWxpbmVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QcmFjdGljZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzNlOWMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QcmFjdGljZURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByYWN0aWNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0QWRkaXRpb25hbEluZm8gPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsI2dldFByb2JsZW0gPGVtPlByb2JsZW08L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCNnZXRCYWNrZ3JvdW5kIDxlbT5CYWNrZ3JvdW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0R29hbHMgPGVtPkdvYWxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0QXBwbGljYXRpb24gPGVtPkFwcGxpY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0TGV2ZWxzT2ZBZG9wdGlvbiA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMKLQkJUHJhY3RpY2VEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkaXRpb25hbEluZm8oKSA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRpdGlvbmFsSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURESVRJT05BTF9JTkZPX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZGRpdGlvbmFsSW5mbygpIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFkZGl0aW9uYWxJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFkZGl0aW9uYWxJbmZvID0gQURESVRJT05BTF9JTkZPX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2JsZW0oKSA8ZW0+UHJvYmxlbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvYmxlbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQkxFTV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvYmxlbSgpIDxlbT5Qcm9ibGVtPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9ibGVtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2JsZW0gPSBQUk9CTEVNX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhY2tncm91bmQoKSA8ZW0+QmFja2dyb3VuZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFja2dyb3VuZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS0dST1VORF9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFja2dyb3VuZCgpIDxlbT5CYWNrZ3JvdW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYWNrZ3JvdW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJhY2tncm91bmQgPSBCQUNLR1JPVU5EX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdvYWxzKCkgPGVtPkdvYWxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHb2FscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR09BTFNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdvYWxzKCkgPGVtPkdvYWxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHb2FscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnb2FscyA9IEdPQUxTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFwcGxpY2F0aW9uKCkgPGVtPkFwcGxpY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFwcGxpY2F0aW9uKCkgPGVtPkFwcGxpY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhcHBsaWNhdGlvbiA9IEFQUExJQ0FUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsc09mQWRvcHRpb24oKSA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMRVZFTFNfT0ZfQURPUFRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsc09mQWRvcHRpb24oKSA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxldmVsc09mQWRvcHRpb24gPSBMRVZFTFNfT0ZfQURPUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbEluZm8oKSB7Ci0JCXJldHVybiBhZGRpdGlvbmFsSW5mbzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsSW5mbyhTdHJpbmcgbmV3QWRkaXRpb25hbEluZm8pIHsKLQkJU3RyaW5nIG9sZEFkZGl0aW9uYWxJbmZvID0gYWRkaXRpb25hbEluZm87Ci0JCWFkZGl0aW9uYWxJbmZvID0gbmV3QWRkaXRpb25hbEluZm87Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTywKLQkJCQkJb2xkQWRkaXRpb25hbEluZm8sIGFkZGl0aW9uYWxJbmZvKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9ibGVtKCkgewotCQlyZXR1cm4gcHJvYmxlbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ibGVtKFN0cmluZyBuZXdQcm9ibGVtKSB7Ci0JCVN0cmluZyBvbGRQcm9ibGVtID0gcHJvYmxlbTsKLQkJcHJvYmxlbSA9IG5ld1Byb2JsZW07Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU0sIG9sZFByb2JsZW0sCi0JCQkJCXByb2JsZW0pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tncm91bmQoKSB7Ci0JCXJldHVybiBiYWNrZ3JvdW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmQoU3RyaW5nIG5ld0JhY2tncm91bmQpIHsKLQkJU3RyaW5nIG9sZEJhY2tncm91bmQgPSBiYWNrZ3JvdW5kOwotCQliYWNrZ3JvdW5kID0gbmV3QmFja2dyb3VuZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORCwgb2xkQmFja2dyb3VuZCwKLQkJCQkJYmFja2dyb3VuZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R29hbHMoKSB7Ci0JCXJldHVybiBnb2FsczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHb2FscyhTdHJpbmcgbmV3R29hbHMpIHsKLQkJU3RyaW5nIG9sZEdvYWxzID0gZ29hbHM7Ci0JCWdvYWxzID0gbmV3R29hbHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTLCBvbGRHb2FscywgZ29hbHMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFwcGxpY2F0aW9uKCkgewotCQlyZXR1cm4gYXBwbGljYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXBwbGljYXRpb24oU3RyaW5nIG5ld0FwcGxpY2F0aW9uKSB7Ci0JCVN0cmluZyBvbGRBcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOwotCQlhcHBsaWNhdGlvbiA9IG5ld0FwcGxpY2F0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTiwKLQkJCQkJb2xkQXBwbGljYXRpb24sIGFwcGxpY2F0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMZXZlbHNPZkFkb3B0aW9uKCkgewotCQlyZXR1cm4gbGV2ZWxzT2ZBZG9wdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbHNPZkFkb3B0aW9uKFN0cmluZyBuZXdMZXZlbHNPZkFkb3B0aW9uKSB7Ci0JCVN0cmluZyBvbGRMZXZlbHNPZkFkb3B0aW9uID0gbGV2ZWxzT2ZBZG9wdGlvbjsKLQkJbGV2ZWxzT2ZBZG9wdGlvbiA9IG5ld0xldmVsc09mQWRvcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTiwKLQkJCQkJb2xkTGV2ZWxzT2ZBZG9wdGlvbiwgbGV2ZWxzT2ZBZG9wdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk86Ci0JCQlyZXR1cm4gZ2V0QWRkaXRpb25hbEluZm8oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNOgotCQkJcmV0dXJuIGdldFByb2JsZW0oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EOgotCQkJcmV0dXJuIGdldEJhY2tncm91bmQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUzoKLQkJCXJldHVybiBnZXRHb2FscygpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJcmV0dXJuIGdldEFwcGxpY2F0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OOgotCQkJcmV0dXJuIGdldExldmVsc09mQWRvcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTzoKLQkJCXNldEFkZGl0aW9uYWxJbmZvKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNOgotCQkJc2V0UHJvYmxlbSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORDoKLQkJCXNldEJhY2tncm91bmQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTOgotCQkJc2V0R29hbHMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJc2V0QXBwbGljYXRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTjoKLQkJCXNldExldmVsc09mQWRvcHRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk86Ci0JCQlzZXRBZGRpdGlvbmFsSW5mbyhBRERJVElPTkFMX0lORk9fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU06Ci0JCQlzZXRQcm9ibGVtKFBST0JMRU1fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQ6Ci0JCQlzZXRCYWNrZ3JvdW5kKEJBQ0tHUk9VTkRfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTOgotCQkJc2V0R29hbHMoR09BTFNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJc2V0QXBwbGljYXRpb24oQVBQTElDQVRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTjoKLQkJCXNldExldmVsc09mQWRvcHRpb24oTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTzoKLQkJCXJldHVybiBBRERJVElPTkFMX0lORk9fRURFRkFVTFQgPT0gbnVsbCA/IGFkZGl0aW9uYWxJbmZvICE9IG51bGwKLQkJCQkJOiAhQURESVRJT05BTF9JTkZPX0VERUZBVUxULmVxdWFscyhhZGRpdGlvbmFsSW5mbyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTToKLQkJCXJldHVybiBQUk9CTEVNX0VERUZBVUxUID09IG51bGwgPyBwcm9ibGVtICE9IG51bGwKLQkJCQkJOiAhUFJPQkxFTV9FREVGQVVMVC5lcXVhbHMocHJvYmxlbSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORDoKLQkJCXJldHVybiBCQUNLR1JPVU5EX0VERUZBVUxUID09IG51bGwgPyBiYWNrZ3JvdW5kICE9IG51bGwKLQkJCQkJOiAhQkFDS0dST1VORF9FREVGQVVMVC5lcXVhbHMoYmFja2dyb3VuZCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFM6Ci0JCQlyZXR1cm4gR09BTFNfRURFRkFVTFQgPT0gbnVsbCA/IGdvYWxzICE9IG51bGwgOiAhR09BTFNfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhnb2Fscyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT046Ci0JCQlyZXR1cm4gQVBQTElDQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGFwcGxpY2F0aW9uICE9IG51bGwKLQkJCQkJOiAhQVBQTElDQVRJT05fRURFRkFVTFQuZXF1YWxzKGFwcGxpY2F0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT046Ci0JCQlyZXR1cm4gTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxUID09IG51bGwgPyBsZXZlbHNPZkFkb3B0aW9uICE9IG51bGwKLQkJCQkJOiAhTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxULmVxdWFscyhsZXZlbHNPZkFkb3B0aW9uKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhZGRpdGlvbmFsSW5mbzogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhZGRpdGlvbmFsSW5mbyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJvYmxlbTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwcm9ibGVtKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiYWNrZ3JvdW5kOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGJhY2tncm91bmQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdvYWxzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGdvYWxzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhcHBsaWNhdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhcHBsaWNhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGV2ZWxzT2ZBZG9wdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChsZXZlbHNPZkFkb3B0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QcmFjdGljZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QcmFjdGljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ4ZGJkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJhY3RpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJhY3RpY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZUltcGwjZ2V0U3ViUHJhY3RpY2VzIDxlbT5TdWIgUHJhY3RpY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VJbXBsI2dldENvbnRlbnRSZWZlcmVuY2VzIDxlbT5Db250ZW50IFJlZmVyZW5jZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZUltcGwjZ2V0QWN0aXZpdHlSZWZlcmVuY2VzIDxlbT5BY3Rpdml0eSBSZWZlcmVuY2VzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJhY3RpY2VJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgUHJhY3RpY2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3ViUHJhY3RpY2VzKCkgPGVtPlN1YiBQcmFjdGljZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViUHJhY3RpY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8UHJhY3RpY2U+IHN1YlByYWN0aWNlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRlbnRSZWZlcmVuY2VzKCkgPGVtPkNvbnRlbnQgUmVmZXJlbmNlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb250ZW50UmVmZXJlbmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PENvbnRlbnRFbGVtZW50PiBjb250ZW50UmVmZXJlbmNlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5UmVmZXJlbmNlcygpIDxlbT5BY3Rpdml0eSBSZWZlcmVuY2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2aXR5UmVmZXJlbmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEFjdGl2aXR5PiBhY3Rpdml0eVJlZmVyZW5jZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJhY3RpY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxQcmFjdGljZT4gZ2V0U3ViUHJhY3RpY2VzKCkgewotCQlpZiAoc3ViUHJhY3RpY2VzID09IG51bGwpIHsKLQkJCXN1YlByYWN0aWNlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmc8UHJhY3RpY2U+KAotCQkJCQlQcmFjdGljZS5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFUyk7Ci0JCX0KLQkJcmV0dXJuIHN1YlByYWN0aWNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxDb250ZW50RWxlbWVudD4gZ2V0Q29udGVudFJlZmVyZW5jZXMoKSB7Ci0JCWlmIChjb250ZW50UmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQljb250ZW50UmVmZXJlbmNlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Q29udGVudEVsZW1lbnQ+KAotCQkJCQlDb250ZW50RWxlbWVudC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0VTKTsKLQkJfQotCQlyZXR1cm4gY29udGVudFJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8QWN0aXZpdHk+IGdldEFjdGl2aXR5UmVmZXJlbmNlcygpIHsKLQkJaWYgKGFjdGl2aXR5UmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlhY3Rpdml0eVJlZmVyZW5jZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEFjdGl2aXR5PigKLQkJCQkJQWN0aXZpdHkuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVMpOwotCQl9Ci0JCXJldHVybiBhY3Rpdml0eVJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0VTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0U3ViUHJhY3RpY2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVM6Ci0JCQlyZXR1cm4gZ2V0U3ViUHJhY3RpY2VzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0VTOgotCQkJcmV0dXJuIGdldENvbnRlbnRSZWZlcmVuY2VzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFUzoKLQkJCXJldHVybiBnZXRBY3Rpdml0eVJlZmVyZW5jZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVM6Ci0JCQlnZXRTdWJQcmFjdGljZXMoKS5jbGVhcigpOwotCQkJZ2V0U3ViUHJhY3RpY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQcmFjdGljZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRVM6Ci0JCQlnZXRDb250ZW50UmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQlnZXRDb250ZW50UmVmZXJlbmNlcygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRlbnRFbGVtZW50PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVM6Ci0JCQlnZXRBY3Rpdml0eVJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJZ2V0QWN0aXZpdHlSZWZlcmVuY2VzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQWN0aXZpdHk+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVM6Ci0JCQlnZXRTdWJQcmFjdGljZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFUzoKLQkJCWdldENvbnRlbnRSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0VTOgotCQkJZ2V0QWN0aXZpdHlSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVM6Ci0JCQlyZXR1cm4gc3ViUHJhY3RpY2VzICE9IG51bGwgJiYgIXN1YlByYWN0aWNlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0VTOgotCQkJcmV0dXJuIGNvbnRlbnRSZWZlcmVuY2VzICE9IG51bGwgJiYgIWNvbnRlbnRSZWZlcmVuY2VzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0VTOgotCQkJcmV0dXJuIGFjdGl2aXR5UmVmZXJlbmNlcyAhPSBudWxsICYmICFhY3Rpdml0eVJlZmVyZW5jZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9QcmFjdGljZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIyMzEwNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwjZ2V0X3Byb2Nlc3NDb21wb25lbnQgPGVtPnByb2Nlc3MgQ29tcG9uZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsIGV4dGVuZHMgRGVzY3JpcHRvckltcGwgaW1wbGVtZW50cwotCQlQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRfcHJvY2Vzc0NvbXBvbmVudCgpIDxlbT5wcm9jZXNzIENvbXBvbmVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0X3Byb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50IF9wcm9jZXNzQ29tcG9uZW50OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudCBnZXRfcHJvY2Vzc0NvbXBvbmVudCgpIHsKLQkJaWYgKF9wcm9jZXNzQ29tcG9uZW50ICE9IG51bGwKLQkJCQkmJiAoKEVPYmplY3QpIF9wcm9jZXNzQ29tcG9uZW50KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkX3Byb2Nlc3NDb21wb25lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSBfcHJvY2Vzc0NvbXBvbmVudDsKLQkJCV9wcm9jZXNzQ29tcG9uZW50ID0gKFByb2Nlc3NDb21wb25lbnQpIGVSZXNvbHZlUHJveHkob2xkX3Byb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKF9wcm9jZXNzQ29tcG9uZW50ICE9IG9sZF9wcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLQkJCQkJCQl0aGlzLAotCQkJCQkJCU5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJPQ0VTU19DT01QT05FTlQsCi0JCQkJCQkJb2xkX3Byb2Nlc3NDb21wb25lbnQsIF9wcm9jZXNzQ29tcG9uZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIF9wcm9jZXNzQ29tcG9uZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50IGJhc2ljR2V0X3Byb2Nlc3NDb21wb25lbnQoKSB7Ci0JCXJldHVybiBfcHJvY2Vzc0NvbXBvbmVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRfcHJvY2Vzc0NvbXBvbmVudChQcm9jZXNzQ29tcG9uZW50IG5ld19wcm9jZXNzQ29tcG9uZW50KSB7Ci0JCVByb2Nlc3NDb21wb25lbnQgb2xkX3Byb2Nlc3NDb21wb25lbnQgPSBfcHJvY2Vzc0NvbXBvbmVudDsKLQkJX3Byb2Nlc3NDb21wb25lbnQgPSBuZXdfcHJvY2Vzc0NvbXBvbmVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUk9DRVNTX0NPTVBPTkVOVCwKLQkJCQkJb2xkX3Byb2Nlc3NDb21wb25lbnQsIF9wcm9jZXNzQ29tcG9uZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJPQ0VTU19DT01QT05FTlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0X3Byb2Nlc3NDb21wb25lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldF9wcm9jZXNzQ29tcG9uZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BST0NFU1NfQ09NUE9ORU5UOgotCQkJc2V0X3Byb2Nlc3NDb21wb25lbnQoKFByb2Nlc3NDb21wb25lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUk9DRVNTX0NPTVBPTkVOVDoKLQkJCXNldF9wcm9jZXNzQ29tcG9uZW50KChQcm9jZXNzQ29tcG9uZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJPQ0VTU19DT01QT05FTlQ6Ci0JCQlyZXR1cm4gX3Byb2Nlc3NDb21wb25lbnQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWRiNTlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBDb21wb25lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRBdXRob3JzIDxlbT5BdXRob3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsI2dldENvcHlyaWdodFN0YXRlbWVudCA8ZW0+Q29weXJpZ2h0IFN0YXRlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsI2dldEludGVyZmFjZXMgPGVtPkludGVyZmFjZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRQcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEltcGwgZXh0ZW5kcyBQcm9jZXNzUGFja2FnZUltcGwgaW1wbGVtZW50cwotCQlQcm9jZXNzQ29tcG9uZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3JzKCkgPGVtPkF1dGhvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF1dGhvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUlNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF1dGhvcnMoKSA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdXRob3JzID0gQVVUSE9SU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEYXRlKCkgPGVtPkNoYW5nZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERhdGUgQ0hBTkdFX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGF0ZSgpIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERhdGUgY2hhbmdlRGF0ZSA9IENIQU5HRV9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURlc2NyaXB0aW9uKCkgPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjaGFuZ2VEZXNjcmlwdGlvbiA9IENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvcHlyaWdodFN0YXRlbWVudCgpIDxlbT5Db3B5cmlnaHQgU3RhdGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdXBwb3J0aW5nTWF0ZXJpYWwgY29weXJpZ2h0U3RhdGVtZW50OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW50ZXJmYWNlcygpIDxlbT5JbnRlcmZhY2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVyZmFjZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRlcmZhY2VzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvY2VzcygpIDxlbT5Qcm9jZXNzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2Nlc3M7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0NvbXBvbmVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXV0aG9ycygpIHsKLQkJcmV0dXJuIGF1dGhvcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0aG9ycyhTdHJpbmcgbmV3QXV0aG9ycykgewotCQlTdHJpbmcgb2xkQXV0aG9ycyA9IGF1dGhvcnM7Ci0JCWF1dGhvcnMgPSBuZXdBdXRob3JzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTLCBvbGRBdXRob3JzLCBhdXRob3JzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERhdGUgZ2V0Q2hhbmdlRGF0ZSgpIHsKLQkJcmV0dXJuIGNoYW5nZURhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlRGF0ZShEYXRlIG5ld0NoYW5nZURhdGUpIHsKLQkJRGF0ZSBvbGRDaGFuZ2VEYXRlID0gY2hhbmdlRGF0ZTsKLQkJY2hhbmdlRGF0ZSA9IG5ld0NoYW5nZURhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFLCBvbGRDaGFuZ2VEYXRlLAotCQkJCQljaGFuZ2VEYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDaGFuZ2VEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGNoYW5nZURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoYW5nZURlc2NyaXB0aW9uKFN0cmluZyBuZXdDaGFuZ2VEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkQ2hhbmdlRGVzY3JpcHRpb24gPSBjaGFuZ2VEZXNjcmlwdGlvbjsKLQkJY2hhbmdlRGVzY3JpcHRpb24gPSBuZXdDaGFuZ2VEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OLAotCQkJCQlvbGRDaGFuZ2VEZXNjcmlwdGlvbiwgY2hhbmdlRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIG5ld1ZlcnNpb24pIHsKLQkJU3RyaW5nIG9sZFZlcnNpb24gPSB2ZXJzaW9uOwotCQl2ZXJzaW9uID0gbmV3VmVyc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCkgewotCQlpZiAoY29weXJpZ2h0U3RhdGVtZW50ICE9IG51bGwKLQkJCQkmJiAoKEVPYmplY3QpIGNvcHlyaWdodFN0YXRlbWVudCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZENvcHlyaWdodFN0YXRlbWVudCA9IChJbnRlcm5hbEVPYmplY3QpIGNvcHlyaWdodFN0YXRlbWVudDsKLQkJCWNvcHlyaWdodFN0YXRlbWVudCA9IChTdXBwb3J0aW5nTWF0ZXJpYWwpIGVSZXNvbHZlUHJveHkob2xkQ29weXJpZ2h0U3RhdGVtZW50KTsKLQkJCWlmIChjb3B5cmlnaHRTdGF0ZW1lbnQgIT0gb2xkQ29weXJpZ2h0U3RhdGVtZW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFRfU1RBVEVNRU5ULAotCQkJCQkJCW9sZENvcHlyaWdodFN0YXRlbWVudCwgY29weXJpZ2h0U3RhdGVtZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvcHlyaWdodFN0YXRlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsIGJhc2ljR2V0Q29weXJpZ2h0U3RhdGVtZW50KCkgewotCQlyZXR1cm4gY29weXJpZ2h0U3RhdGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvcHlyaWdodFN0YXRlbWVudChTdXBwb3J0aW5nTWF0ZXJpYWwgbmV3Q29weXJpZ2h0U3RhdGVtZW50KSB7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBvbGRDb3B5cmlnaHRTdGF0ZW1lbnQgPSBjb3B5cmlnaHRTdGF0ZW1lbnQ7Ci0JCWNvcHlyaWdodFN0YXRlbWVudCA9IG5ld0NvcHlyaWdodFN0YXRlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUX1NUQVRFTUVOVCwKLQkJCQkJb2xkQ29weXJpZ2h0U3RhdGVtZW50LCBjb3B5cmlnaHRTdGF0ZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlPiBnZXRJbnRlcmZhY2VzKCkgewotCQlpZiAoaW50ZXJmYWNlcyA9PSBudWxsKSB7Ci0JCQlpbnRlcmZhY2VzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlPigKLQkJCQkJUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUyk7Ci0JCX0KLQkJcmV0dXJuIGludGVyZmFjZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlpZiAocHJvY2VzcyAhPSBudWxsICYmICgoRU9iamVjdCkgcHJvY2VzcykuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFByb2Nlc3MgPSAoSW50ZXJuYWxFT2JqZWN0KSBwcm9jZXNzOwotCQkJcHJvY2VzcyA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIGVSZXNvbHZlUHJveHkob2xkUHJvY2Vzcyk7Ci0JCQlpZiAocHJvY2VzcyAhPSBvbGRQcm9jZXNzKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1Byb2Nlc3MgPSAoSW50ZXJuYWxFT2JqZWN0KSBwcm9jZXNzOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQcm9jZXNzLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgbnVsbCwKLQkJCQkJCW51bGwpOwotCQkJCWlmIChuZXdQcm9jZXNzLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1Byb2Nlc3MKLQkJCQkJCQkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJLSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTLAotCQkJCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsIG9sZFByb2Nlc3MsCi0JCQkJCQkJcHJvY2VzcykpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9jZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgYmFzaWNHZXRQcm9jZXNzKCkgewotCQlyZXR1cm4gcHJvY2VzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcm9jZXNzKAotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIG5ld1Byb2Nlc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIG9sZFByb2Nlc3MgPSBwcm9jZXNzOwotCQlwcm9jZXNzID0gbmV3UHJvY2VzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywKLQkJCQkJb2xkUHJvY2VzcywgbmV3UHJvY2Vzcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBuZXdQcm9jZXNzKSB7Ci0JCWlmIChuZXdQcm9jZXNzICE9IHByb2Nlc3MpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHByb2Nlc3MpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgbnVsbCwKLQkJCQkJCW1zZ3MpOwotCQkJaWYgKG5ld1Byb2Nlc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1Byb2Nlc3MpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgbnVsbCwKLQkJCQkJCW1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJvY2VzcyhuZXdQcm9jZXNzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgbmV3UHJvY2VzcywKLQkJCQkJbmV3UHJvY2VzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCXJldHVybiBiYXNpY1NldFByb2Nlc3MobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOgotCQkJcmV0dXJuIGdldEF1dGhvcnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJCXJldHVybiBnZXRDaGFuZ2VEYXRlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIGdldENoYW5nZURlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTjoKLQkJCXJldHVybiBnZXRWZXJzaW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldENvcHlyaWdodFN0YXRlbWVudCgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRVM6Ci0JCQlyZXR1cm4gZ2V0SW50ZXJmYWNlcygpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1M6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UHJvY2VzcygpOwotCQkJcmV0dXJuIGJhc2ljR2V0UHJvY2VzcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUzoKLQkJCXNldEF1dGhvcnMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFOgotCQkJc2V0Q2hhbmdlRGF0ZSgoRGF0ZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCXNldENoYW5nZURlc2NyaXB0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OOgotCQkJc2V0VmVyc2lvbigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCXNldENvcHlyaWdodFN0YXRlbWVudCgoU3VwcG9ydGluZ01hdGVyaWFsKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUzoKLQkJCWdldEludGVyZmFjZXMoKS5jbGVhcigpOwotCQkJZ2V0SW50ZXJmYWNlcygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCXNldFByb2Nlc3MoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOgotCQkJc2V0QXV0aG9ycyhBVVRIT1JTX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJCXNldENoYW5nZURhdGUoQ0hBTkdFX0RBVEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCXNldENoYW5nZURlc2NyaXB0aW9uKENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTjoKLQkJCXNldFZlcnNpb24oVkVSU0lPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCXNldENvcHlyaWdodFN0YXRlbWVudCgoU3VwcG9ydGluZ01hdGVyaWFsKSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0VTOgotCQkJZ2V0SW50ZXJmYWNlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCXNldFByb2Nlc3MoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOgotCQkJcmV0dXJuIEFVVEhPUlNfRURFRkFVTFQgPT0gbnVsbCA/IGF1dGhvcnMgIT0gbnVsbAotCQkJCQk6ICFBVVRIT1JTX0VERUZBVUxULmVxdWFscyhhdXRob3JzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJCXJldHVybiBDSEFOR0VfREFURV9FREVGQVVMVCA9PSBudWxsID8gY2hhbmdlRGF0ZSAhPSBudWxsCi0JCQkJCTogIUNIQU5HRV9EQVRFX0VERUZBVUxULmVxdWFscyhjaGFuZ2VEYXRlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBjaGFuZ2VEZXNjcmlwdGlvbiAhPSBudWxsCi0JCQkJCTogIUNIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoY2hhbmdlRGVzY3JpcHRpb24pOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT046Ci0JCQlyZXR1cm4gVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gdmVyc2lvbiAhPSBudWxsCi0JCQkJCTogIVZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHZlcnNpb24pOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVF9TVEFURU1FTlQ6Ci0JCQlyZXR1cm4gY29weXJpZ2h0U3RhdGVtZW50ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUzoKLQkJCXJldHVybiBpbnRlcmZhY2VzICE9IG51bGwgJiYgIWludGVyZmFjZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1M6Ci0JCQlyZXR1cm4gcHJvY2VzcyAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gTWV0aG9kVW5pdC5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlM6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT047Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVF9TVEFURU1FTlQ6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IE1ldGhvZFVuaXQuY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19BVVRIT1JTOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURToKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEU7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYXV0aG9yczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhdXRob3JzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjaGFuZ2VEYXRlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGNoYW5nZURhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNoYW5nZURlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGNoYW5nZURlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2ZXJzaW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHZlcnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzQ29tcG9uZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI2ZmFlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsI2dldEludGVyZmFjZVNwZWNpZmljYXRpb25zIDxlbT5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCNnZXRJbnRlcmZhY2VJTyA8ZW0+SW50ZXJmYWNlIElPPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SW1wbAotCQlpbXBsZW1lbnRzIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKSA8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVyZmFjZVNwZWNpZmljYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8VGFza0Rlc2NyaXB0b3I+IGludGVyZmFjZVNwZWNpZmljYXRpb25zOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW50ZXJmYWNlSU8oKSA8ZW0+SW50ZXJmYWNlIElPPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVyZmFjZUlPKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBpbnRlcmZhY2VJTzsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFRhc2tEZXNjcmlwdG9yPiBnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpIHsKLQkJaWYgKGludGVyZmFjZVNwZWNpZmljYXRpb25zID09IG51bGwpIHsKLQkJCWludGVyZmFjZVNwZWNpZmljYXRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxUYXNrRGVzY3JpcHRvcj4oCi0JCQkJCVRhc2tEZXNjcmlwdG9yLmNsYXNzLAotCQkJCQl0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXRJbnRlcmZhY2VJTygpIHsKLQkJaWYgKGludGVyZmFjZUlPID09IG51bGwpIHsKLQkJCWludGVyZmFjZUlPID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxXb3JrUHJvZHVjdERlc2NyaXB0b3I+KAotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU8pOwotCQl9Ci0JCXJldHVybiBpbnRlcmZhY2VJTzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTlM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpKQotCQkJCQkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU86Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRJbnRlcmZhY2VJTygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TOgotCQkJcmV0dXJuIGdldEludGVyZmFjZVNwZWNpZmljYXRpb25zKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTzoKLQkJCXJldHVybiBnZXRJbnRlcmZhY2VJTygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUzoKLQkJCWdldEludGVyZmFjZVNwZWNpZmljYXRpb25zKCkuY2xlYXIoKTsKLQkJCWdldEludGVyZmFjZVNwZWNpZmljYXRpb25zKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVGFza0Rlc2NyaXB0b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTzoKLQkJCWdldEludGVyZmFjZUlPKCkuY2xlYXIoKTsKLQkJCWdldEludGVyZmFjZUlPKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TOgotCQkJZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU86Ci0JCQlnZXRJbnRlcmZhY2VJTygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TOgotCQkJcmV0dXJuIGludGVyZmFjZVNwZWNpZmljYXRpb25zICE9IG51bGwKLQkJCQkJJiYgIWludGVyZmFjZVNwZWNpZmljYXRpb25zLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPOgotCQkJcmV0dXJuIGludGVyZmFjZUlPICE9IG51bGwgJiYgIWludGVyZmFjZUlPLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmE1NjM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFVzYWdlTm90ZXMgPGVtPlVzYWdlIE5vdGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCBleHRlbmRzIEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMKLQkJUHJvY2Vzc0Rlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY29wZSgpIDxlbT5TY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNDT1BFX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY29wZSgpIDxlbT5TY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2NvcGUgPSBTQ09QRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2FnZU5vdGVzKCkgPGVtPlVzYWdlIE5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVc2FnZU5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVU0FHRV9OT1RFU19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNhZ2VOb3RlcygpIDxlbT5Vc2FnZSBOb3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2VOb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1c2FnZU5vdGVzID0gVVNBR0VfTk9URVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNjb3BlKCkgewotCQlyZXR1cm4gc2NvcGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIG5ld1Njb3BlKSB7Ci0JCVN0cmluZyBvbGRTY29wZSA9IHNjb3BlOwotCQlzY29wZSA9IG5ld1Njb3BlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFLCBvbGRTY29wZSwgc2NvcGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVzYWdlTm90ZXMoKSB7Ci0JCXJldHVybiB1c2FnZU5vdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzYWdlTm90ZXMoU3RyaW5nIG5ld1VzYWdlTm90ZXMpIHsKLQkJU3RyaW5nIG9sZFVzYWdlTm90ZXMgPSB1c2FnZU5vdGVzOwotCQl1c2FnZU5vdGVzID0gbmV3VXNhZ2VOb3RlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUywgb2xkVXNhZ2VOb3RlcywKLQkJCQkJdXNhZ2VOb3RlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQkJcmV0dXJuIGdldFNjb3BlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUzoKLQkJCXJldHVybiBnZXRVc2FnZU5vdGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQkJc2V0U2NvcGUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVM6Ci0JCQlzZXRVc2FnZU5vdGVzKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRToKLQkJCXNldFNjb3BlKFNDT1BFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTOgotCQkJc2V0VXNhZ2VOb3RlcyhVU0FHRV9OT1RFU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQkJcmV0dXJuIFNDT1BFX0VERUZBVUxUID09IG51bGwgPyBzY29wZSAhPSBudWxsIDogIVNDT1BFX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoc2NvcGUpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVM6Ci0JCQlyZXR1cm4gVVNBR0VfTk9URVNfRURFRkFVTFQgPT0gbnVsbCA/IHVzYWdlTm90ZXMgIT0gbnVsbAotCQkJCQk6ICFVU0FHRV9OT1RFU19FREVGQVVMVC5lcXVhbHModXNhZ2VOb3Rlcyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc2NvcGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc2NvcGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVzYWdlTm90ZXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodXNhZ2VOb3Rlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb2Nlc3NEZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzRWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEzYmZiZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvY2Vzc0VsZW1lbnRJbXBsIGV4dGVuZHMgRGVzY3JpYmFibGVFbGVtZW50SW1wbAotCQlpbXBsZW1lbnRzIFByb2Nlc3NFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfRUxFTUVOVDsKLQl9Ci0KLX0gLy9Qcm9jZXNzRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzRmFtaWx5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NGYW1pbHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MWUxMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NGYW1pbHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBGYW1pbHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRmFtaWx5SW1wbCNnZXREZWxpdmVyeVByb2Nlc3NlcyA8ZW0+RGVsaXZlcnkgUHJvY2Vzc2VzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0ZhbWlseUltcGwgZXh0ZW5kcyBNZXRob2RDb25maWd1cmF0aW9uSW1wbCBpbXBsZW1lbnRzCi0JCVByb2Nlc3NGYW1pbHkgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKSA8ZW0+RGVsaXZlcnkgUHJvY2Vzc2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2Vzc2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RGVsaXZlcnlQcm9jZXNzPiBkZWxpdmVyeVByb2Nlc3NlczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzRmFtaWx5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19GQU1JTFk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RGVsaXZlcnlQcm9jZXNzPiBnZXREZWxpdmVyeVByb2Nlc3NlcygpIHsKLQkJaWYgKGRlbGl2ZXJ5UHJvY2Vzc2VzID09IG51bGwpIHsKLQkJCWRlbGl2ZXJ5UHJvY2Vzc2VzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxEZWxpdmVyeVByb2Nlc3M+KAotCQkJCQlEZWxpdmVyeVByb2Nlc3MuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19GQU1JTFlfX0RFTElWRVJZX1BST0NFU1NFUyk7Ci0JCX0KLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfRkFNSUxZX19ERUxJVkVSWV9QUk9DRVNTRVM6Ci0JCQlyZXR1cm4gZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19GQU1JTFlfX0RFTElWRVJZX1BST0NFU1NFUzoKLQkJCWdldERlbGl2ZXJ5UHJvY2Vzc2VzKCkuY2xlYXIoKTsKLQkJCWdldERlbGl2ZXJ5UHJvY2Vzc2VzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGVsaXZlcnlQcm9jZXNzPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfRkFNSUxZX19ERUxJVkVSWV9QUk9DRVNTRVM6Ci0JCQlnZXREZWxpdmVyeVByb2Nlc3NlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfRkFNSUxZX19ERUxJVkVSWV9QUk9DRVNTRVM6Ci0JCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzZXMgIT0gbnVsbCAmJiAhZGVsaXZlcnlQcm9jZXNzZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzRmFtaWx5SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkYmJhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzSW1wbCNnZXRJbmNsdWRlc1BhdHRlcm5zIDxlbT5JbmNsdWRlcyBQYXR0ZXJuczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NJbXBsI2dldERlZmF1bHRDb250ZXh0IDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzSW1wbCNnZXRWYWxpZENvbnRleHQgPGVtPlZhbGlkIENvbnRleHQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9jZXNzSW1wbCBleHRlbmRzIEFjdGl2aXR5SW1wbCBpbXBsZW1lbnRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmNsdWRlc1BhdHRlcm5zKCkgPGVtPkluY2x1ZGVzIFBhdHRlcm5zPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluY2x1ZGVzUGF0dGVybnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxDYXBhYmlsaXR5UGF0dGVybj4gaW5jbHVkZXNQYXR0ZXJuczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRDb250ZXh0KCkgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdENvbnRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb250ZXh0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsaWRDb250ZXh0KCkgPGVtPlZhbGlkIENvbnRleHQ8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsaWRDb250ZXh0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gdmFsaWRDb250ZXh0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PENhcGFiaWxpdHlQYXR0ZXJuPiBnZXRJbmNsdWRlc1BhdHRlcm5zKCkgewotCQlpZiAoaW5jbHVkZXNQYXR0ZXJucyA9PSBudWxsKSB7Ci0JCQlpbmNsdWRlc1BhdHRlcm5zID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxDYXBhYmlsaXR5UGF0dGVybj4oCi0JCQkJCUNhcGFiaWxpdHlQYXR0ZXJuLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TKTsKLQkJfQotCQlyZXR1cm4gaW5jbHVkZXNQYXR0ZXJuczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXREZWZhdWx0Q29udGV4dCgpIHsKLQkJaWYgKGRlZmF1bHRDb250ZXh0ICE9IG51bGwgJiYgKChFT2JqZWN0KSBkZWZhdWx0Q29udGV4dCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZERlZmF1bHRDb250ZXh0ID0gKEludGVybmFsRU9iamVjdCkgZGVmYXVsdENvbnRleHQ7Ci0JCQlkZWZhdWx0Q29udGV4dCA9IChNZXRob2RDb25maWd1cmF0aW9uKSBlUmVzb2x2ZVByb3h5KG9sZERlZmF1bHRDb250ZXh0KTsKLQkJCWlmIChkZWZhdWx0Q29udGV4dCAhPSBvbGREZWZhdWx0Q29udGV4dCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQsCi0JCQkJCQkJb2xkRGVmYXVsdENvbnRleHQsIGRlZmF1bHRDb250ZXh0KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGJhc2ljR2V0RGVmYXVsdENvbnRleHQoKSB7Ci0JCXJldHVybiBkZWZhdWx0Q29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0Q29udGV4dChNZXRob2RDb25maWd1cmF0aW9uIG5ld0RlZmF1bHRDb250ZXh0KSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gb2xkRGVmYXVsdENvbnRleHQgPSBkZWZhdWx0Q29udGV4dDsKLQkJZGVmYXVsdENvbnRleHQgPSBuZXdEZWZhdWx0Q29udGV4dDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQsIG9sZERlZmF1bHRDb250ZXh0LAotCQkJCQlkZWZhdWx0Q29udGV4dCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGdldFZhbGlkQ29udGV4dCgpIHsKLQkJaWYgKHZhbGlkQ29udGV4dCA9PSBudWxsKSB7Ci0JCQl2YWxpZENvbnRleHQgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+KAotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQpOwotCQl9Ci0JCXJldHVybiB2YWxpZENvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTlM6Ci0JCQlyZXR1cm4gZ2V0SW5jbHVkZXNQYXR0ZXJucygpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXREZWZhdWx0Q29udGV4dCgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fVkFMSURfQ09OVEVYVDoKLQkJCXJldHVybiBnZXRWYWxpZENvbnRleHQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTlM6Ci0JCQlnZXRJbmNsdWRlc1BhdHRlcm5zKCkuY2xlYXIoKTsKLQkJCWdldEluY2x1ZGVzUGF0dGVybnMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDYXBhYmlsaXR5UGF0dGVybj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDoKLQkJCXNldERlZmF1bHRDb250ZXh0KChNZXRob2RDb25maWd1cmF0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUOgotCQkJZ2V0VmFsaWRDb250ZXh0KCkuY2xlYXIoKTsKLQkJCWdldFZhbGlkQ29udGV4dCgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZENvbmZpZ3VyYXRpb24+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTlM6Ci0JCQlnZXRJbmNsdWRlc1BhdHRlcm5zKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDoKLQkJCXNldERlZmF1bHRDb250ZXh0KChNZXRob2RDb25maWd1cmF0aW9uKSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQ6Ci0JCQlnZXRWYWxpZENvbnRleHQoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOUzoKLQkJCXJldHVybiBpbmNsdWRlc1BhdHRlcm5zICE9IG51bGwgJiYgIWluY2x1ZGVzUGF0dGVybnMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOgotCQkJcmV0dXJuIGRlZmF1bHRDb250ZXh0ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUOgotCQkJcmV0dXJuIHZhbGlkQ29udGV4dCAhPSBudWxsICYmICF2YWxpZENvbnRleHQuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2ZmNWRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBQYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsI2dldFByb2Nlc3NFbGVtZW50cyA8ZW0+UHJvY2VzcyBFbGVtZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NQYWNrYWdlSW1wbCNnZXREaWFncmFtcyA8ZW0+RGlhZ3JhbXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUGFja2FnZUltcGwgZXh0ZW5kcyBNZXRob2RQYWNrYWdlSW1wbCBpbXBsZW1lbnRzCi0JCVByb2Nlc3NQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2Nlc3NFbGVtZW50cygpIDxlbT5Qcm9jZXNzIEVsZW1lbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2Nlc3NFbGVtZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFByb2Nlc3NFbGVtZW50PiBwcm9jZXNzRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaWFncmFtcygpIDxlbT5EaWFncmFtczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaWFncmFtcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PERpYWdyYW0+IGRpYWdyYW1zOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFByb2Nlc3NFbGVtZW50PiBnZXRQcm9jZXNzRWxlbWVudHMoKSB7Ci0JCWlmIChwcm9jZXNzRWxlbWVudHMgPT0gbnVsbCkgewotCQkJcHJvY2Vzc0VsZW1lbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxQcm9jZXNzRWxlbWVudD4oCi0JCQkJCVByb2Nlc3NFbGVtZW50LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUyk7Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3NFbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxEaWFncmFtPiBnZXREaWFncmFtcygpIHsKLQkJaWYgKGRpYWdyYW1zID09IG51bGwpIHsKLQkJCWRpYWdyYW1zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxEaWFncmFtPigKLQkJCQkJRGlhZ3JhbS5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0RJQUdSQU1TKTsKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldFByb2Nlc3NFbGVtZW50cygpKS5iYXNpY1JlbW92ZSgKLQkJCQkJb3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldERpYWdyYW1zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTOgotCQkJcmV0dXJuIGdldFByb2Nlc3NFbGVtZW50cygpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUzoKLQkJCXJldHVybiBnZXREaWFncmFtcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFM6Ci0JCQlnZXRQcm9jZXNzRWxlbWVudHMoKS5jbGVhcigpOwotCQkJZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0RJQUdSQU1TOgotCQkJZ2V0RGlhZ3JhbXMoKS5jbGVhcigpOwotCQkJZ2V0RGlhZ3JhbXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERpYWdyYW0+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTOgotCQkJZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVM6Ci0JCQlnZXREaWFncmFtcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUzoKLQkJCXJldHVybiBwcm9jZXNzRWxlbWVudHMgIT0gbnVsbCAmJiAhcHJvY2Vzc0VsZW1lbnRzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVM6Ci0JCQlyZXR1cm4gZGlhZ3JhbXMgIT0gbnVsbCAmJiAhZGlhZ3JhbXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5ODZkMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwjZ2V0QmFzZWRPblByb2Nlc3NlcyA8ZW0+QmFzZWQgT24gUHJvY2Vzc2VzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsIGV4dGVuZHMgUHJvY2Vzc0ltcGwgaW1wbGVtZW50cwotCQlQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlZE9uUHJvY2Vzc2VzKCkgPGVtPkJhc2VkIE9uIFByb2Nlc3NlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNlZE9uUHJvY2Vzc2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8b3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzPiBiYXNlZE9uUHJvY2Vzc2VzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M+IGdldEJhc2VkT25Qcm9jZXNzZXMoKSB7Ci0JCWlmIChiYXNlZE9uUHJvY2Vzc2VzID09IG51bGwpIHsKLQkJCWJhc2VkT25Qcm9jZXNzZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzcz4oCi0JCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzcy5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFRF9PTl9QUk9DRVNTRVMpOwotCQl9Ci0JCXJldHVybiBiYXNlZE9uUHJvY2Vzc2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VEX09OX1BST0NFU1NFUzoKLQkJCXJldHVybiBnZXRCYXNlZE9uUHJvY2Vzc2VzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VEX09OX1BST0NFU1NFUzoKLQkJCWdldEJhc2VkT25Qcm9jZXNzZXMoKS5jbGVhcigpOwotCQkJZ2V0QmFzZWRPblByb2Nlc3NlcygpCi0JCQkJCS5hZGRBbGwoCi0JCQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzcz4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFRF9PTl9QUk9DRVNTRVM6Ci0JCQlnZXRCYXNlZE9uUHJvY2Vzc2VzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRURfT05fUFJPQ0VTU0VTOgotCQkJcmV0dXJuIGJhc2VkT25Qcm9jZXNzZXMgIT0gbnVsbCAmJiAhYmFzZWRPblByb2Nlc3Nlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb3BlcnR5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb3BlcnR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTVmN2UyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9wZXJ0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9wZXJ0eUltcGwjZ2V0S2V5IDxlbT5LZXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9wZXJ0eUltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlJbXBsIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJbXBsIGltcGxlbWVudHMgUHJvcGVydHkgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtleSgpIDxlbT5LZXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLZXkoKSA8ZW0+S2V5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRLZXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcga2V5ID0gS0VZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPUEVSVFk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBrZXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBuZXdLZXkpIHsKLQkJU3RyaW5nIG9sZEtleSA9IGtleTsKLQkJa2V5ID0gbmV3S2V5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBST1BFUlRZX19LRVksIG9sZEtleSwga2V5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9QRVJUWV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST1BFUlRZX19LRVk6Ci0JCQlyZXR1cm4gZ2V0S2V5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWV9fVkFMVUU6Ci0JCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFlfX0tFWToKLQkJCXNldEtleSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWV9fVkFMVUU6Ci0JCQlzZXRWYWx1ZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFlfX0tFWToKLQkJCXNldEtleShLRVlfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFlfX1ZBTFVFOgotCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWV9fS0VZOgotCQkJcmV0dXJuIEtFWV9FREVGQVVMVCA9PSBudWxsID8ga2V5ICE9IG51bGwgOiAhS0VZX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoa2V5KTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST1BFUlRZX19WQUxVRToKLQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVAotCQkJCQkuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChrZXk6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoa2V5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb3BlcnR5SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JlZmVyZW5jZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9SZWZlcmVuY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViM2UyMGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JlZmVyZW5jZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZWZlcmVuY2VJbXBsI2dldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIDxlbT5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVmZXJlbmNlSW1wbCNnZXRSZWZlcmVuY2VkIDxlbT5SZWZlcmVuY2VkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlSW1wbCBleHRlbmRzIERpYWdyYW1FbGVtZW50SW1wbCBpbXBsZW1lbnRzIFJlZmVyZW5jZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKSA8ZW0+SXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OX0VERUZBVUxUID0gQm9vbGVhbi5GQUxTRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCkgPGVtPklzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiA9IElTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZlcmVuY2VkKCkgPGVtPlJlZmVyZW5jZWQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZmVyZW5jZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEaWFncmFtRWxlbWVudCByZWZlcmVuY2VkOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlZmVyZW5jZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJFRkVSRU5DRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpIHsKLQkJcmV0dXJuIGlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKAotCQkJQm9vbGVhbiBuZXdJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbikgewotCQlCb29sZWFuIG9sZElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uID0gaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb247Ci0JCWlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uID0gbmV3SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUkVGRVJFTkNFX19JU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OLAotCQkJCQlvbGRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiwgaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUVsZW1lbnQgZ2V0UmVmZXJlbmNlZCgpIHsKLQkJaWYgKHJlZmVyZW5jZWQgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHJlZmVyZW5jZWQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRSZWZlcmVuY2VkID0gKEludGVybmFsRU9iamVjdCkgcmVmZXJlbmNlZDsKLQkJCXJlZmVyZW5jZWQgPSAoRGlhZ3JhbUVsZW1lbnQpIGVSZXNvbHZlUHJveHkob2xkUmVmZXJlbmNlZCk7Ci0JCQlpZiAocmVmZXJlbmNlZCAhPSBvbGRSZWZlcmVuY2VkKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlJFRkVSRU5DRV9fUkVGRVJFTkNFRCwgb2xkUmVmZXJlbmNlZCwKLQkJCQkJCQlyZWZlcmVuY2VkKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlZmVyZW5jZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1FbGVtZW50IGJhc2ljR2V0UmVmZXJlbmNlZCgpIHsKLQkJcmV0dXJuIHJlZmVyZW5jZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVmZXJlbmNlZChEaWFncmFtRWxlbWVudCBuZXdSZWZlcmVuY2VkLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEaWFncmFtRWxlbWVudCBvbGRSZWZlcmVuY2VkID0gcmVmZXJlbmNlZDsKLQkJcmVmZXJlbmNlZCA9IG5ld1JlZmVyZW5jZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUkVGRVJFTkNFX19SRUZFUkVOQ0VELAotCQkJCQlvbGRSZWZlcmVuY2VkLCBuZXdSZWZlcmVuY2VkKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWQoRGlhZ3JhbUVsZW1lbnQgbmV3UmVmZXJlbmNlZCkgewotCQlpZiAobmV3UmVmZXJlbmNlZCAhPSByZWZlcmVuY2VkKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyZWZlcmVuY2VkICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSByZWZlcmVuY2VkKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRSwKLQkJCQkJCURpYWdyYW1FbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdSZWZlcmVuY2VkICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdSZWZlcmVuY2VkKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRSwKLQkJCQkJCURpYWdyYW1FbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJlZmVyZW5jZWQobmV3UmVmZXJlbmNlZCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUkVGRVJFTkNFX19SRUZFUkVOQ0VELCBuZXdSZWZlcmVuY2VkLAotCQkJCQluZXdSZWZlcmVuY2VkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fUkVGRVJFTkNFRDoKLQkJCWlmIChyZWZlcmVuY2VkICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSByZWZlcmVuY2VkKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRSwKLQkJCQkJCURpYWdyYW1FbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldFJlZmVyZW5jZWQoKERpYWdyYW1FbGVtZW50KSBvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX1JFRkVSRU5DRUQ6Ci0JCQlyZXR1cm4gYmFzaWNTZXRSZWZlcmVuY2VkKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX0lTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT046Ci0JCQlyZXR1cm4gZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fUkVGRVJFTkNFRDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRSZWZlcmVuY2VkKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRSZWZlcmVuY2VkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTjoKLQkJCXNldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX1JFRkVSRU5DRUQ6Ci0JCQlzZXRSZWZlcmVuY2VkKChEaWFncmFtRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTjoKLQkJCXNldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKElTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUkVGRVJFTkNFX19SRUZFUkVOQ0VEOgotCQkJc2V0UmVmZXJlbmNlZCgoRGlhZ3JhbUVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX0lTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT046Ci0JCQlyZXR1cm4gSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTl9FREVGQVVMVCA9PSBudWxsID8gaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24gIT0gbnVsbAotCQkJCQk6ICFJU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX1JFRkVSRU5DRUQ6Ci0JCQlyZXR1cm4gcmVmZXJlbmNlZCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUmVmZXJlbmNlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JlcG9ydEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9SZXBvcnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMGI1YTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JlcG9ydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVwb3J0SW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFJlcG9ydCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVwb3J0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVQT1JUOwotCX0KLQotfSAvL1JlcG9ydEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9SZXVzYWJsZUFzc2V0SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JldXNhYmxlQXNzZXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YTJiMTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JldXNhYmxlQXNzZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJldXNhYmxlQXNzZXRJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgUmV1c2FibGVBc3NldCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmV1c2FibGVBc3NldEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJFVVNBQkxFX0FTU0VUOwotCX0KLQotfSAvL1JldXNhYmxlQXNzZXRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9hZG1hcEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2FkbWFwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDViZjI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2FkbWFwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvYWRtYXBJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgUm9hZG1hcCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9hZG1hcEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJPQURNQVA7Ci0JfQotCi19IC8vUm9hZG1hcEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlRGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDg4OTA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbCNnZXRTa2lsbHMgPGVtPlNraWxsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwjZ2V0U3lub255bXMgPGVtPlN5bm9ueW1zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cwotCQlSb2xlRGVzY3JpcHRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNraWxscygpIDxlbT5Ta2lsbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNraWxscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJTExTX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTa2lsbHMoKSA8ZW0+U2tpbGxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTa2lsbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2tpbGxzID0gU0tJTExTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzKCkgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKSA8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhc3NpZ25tZW50QXBwcm9hY2hlcyA9IEFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTeW5vbnltcygpIDxlbT5TeW5vbnltczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3lub255bXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTk9OWU1TX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTeW5vbnltcygpIDxlbT5TeW5vbnltczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3lub255bXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc3lub255bXMgPSBTWU5PTllNU19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2tpbGxzKCkgewotCQlyZXR1cm4gc2tpbGxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNraWxscyhTdHJpbmcgbmV3U2tpbGxzKSB7Ci0JCVN0cmluZyBvbGRTa2lsbHMgPSBza2lsbHM7Ci0JCXNraWxscyA9IG5ld1NraWxsczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFMsIG9sZFNraWxscywgc2tpbGxzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpIHsKLQkJcmV0dXJuIGFzc2lnbm1lbnRBcHByb2FjaGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFzc2lnbm1lbnRBcHByb2FjaGVzKFN0cmluZyBuZXdBc3NpZ25tZW50QXBwcm9hY2hlcykgewotCQlTdHJpbmcgb2xkQXNzaWdubWVudEFwcHJvYWNoZXMgPSBhc3NpZ25tZW50QXBwcm9hY2hlczsKLQkJYXNzaWdubWVudEFwcHJvYWNoZXMgPSBuZXdBc3NpZ25tZW50QXBwcm9hY2hlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVMsCi0JCQkJCW9sZEFzc2lnbm1lbnRBcHByb2FjaGVzLCBhc3NpZ25tZW50QXBwcm9hY2hlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3lub255bXMoKSB7Ci0JCXJldHVybiBzeW5vbnltczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5vbnltcyhTdHJpbmcgbmV3U3lub255bXMpIHsKLQkJU3RyaW5nIG9sZFN5bm9ueW1zID0gc3lub255bXM7Ci0JCXN5bm9ueW1zID0gbmV3U3lub255bXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVMsIG9sZFN5bm9ueW1zLAotCQkJCQlzeW5vbnltcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUzoKLQkJCXJldHVybiBnZXRTa2lsbHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUzoKLQkJCXJldHVybiBnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVM6Ci0JCQlyZXR1cm4gZ2V0U3lub255bXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU0tJTExTOgotCQkJc2V0U2tpbGxzKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUzoKLQkJCXNldEFzc2lnbm1lbnRBcHByb2FjaGVzKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TOgotCQkJc2V0U3lub255bXMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUzoKLQkJCXNldFNraWxscyhTS0lMTFNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTOgotCQkJc2V0QXNzaWdubWVudEFwcHJvYWNoZXMoQVNTSUdOTUVOVF9BUFBST0FDSEVTX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TOgotCQkJc2V0U3lub255bXMoU1lOT05ZTVNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFM6Ci0JCQlyZXR1cm4gU0tJTExTX0VERUZBVUxUID09IG51bGwgPyBza2lsbHMgIT0gbnVsbCA6ICFTS0lMTFNfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhza2lsbHMpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTOgotCQkJcmV0dXJuIEFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVCA9PSBudWxsID8gYXNzaWdubWVudEFwcHJvYWNoZXMgIT0gbnVsbAotCQkJCQk6ICFBU1NJR05NRU5UX0FQUFJPQUNIRVNfRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKGFzc2lnbm1lbnRBcHByb2FjaGVzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TOgotCQkJcmV0dXJuIFNZTk9OWU1TX0VERUZBVUxUID09IG51bGwgPyBzeW5vbnltcyAhPSBudWxsCi0JCQkJCTogIVNZTk9OWU1TX0VERUZBVUxULmVxdWFscyhzeW5vbnltcyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc2tpbGxzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNraWxscyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXNzaWdubWVudEFwcHJvYWNoZXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYXNzaWdubWVudEFwcHJvYWNoZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN5bm9ueW1zOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHN5bm9ueW1zKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUm9sZURlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVEZXNjcmlwdG9ySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVEZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWRiNWIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlRGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwjZ2V0Um9sZSA8ZW0+Um9sZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbCNnZXRNb2RpZmllcyA8ZW0+TW9kaWZpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwjZ2V0UmVzcG9uc2libGVGb3IgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdG9ySW1wbCBleHRlbmRzIERlc2NyaXB0b3JJbXBsIGltcGxlbWVudHMKLQkJUm9sZURlc2NyaXB0b3IgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZSgpIDxlbT5Sb2xlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZSByb2xlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzcG9uc2libGVGb3IoKSA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3BvbnNpYmxlRm9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiByZXNwb25zaWJsZUZvcjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlRGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZSBnZXRSb2xlKCkgewotCQlpZiAocm9sZSAhPSBudWxsICYmICgoRU9iamVjdCkgcm9sZSkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFJvbGUgPSAoSW50ZXJuYWxFT2JqZWN0KSByb2xlOwotCQkJcm9sZSA9IChSb2xlKSBlUmVzb2x2ZVByb3h5KG9sZFJvbGUpOwotCQkJaWYgKHJvbGUgIT0gb2xkUm9sZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEUsIG9sZFJvbGUsIHJvbGUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcm9sZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZSBiYXNpY0dldFJvbGUoKSB7Ci0JCXJldHVybiByb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGUoUm9sZSBuZXdSb2xlKSB7Ci0JCVJvbGUgb2xkUm9sZSA9IHJvbGU7Ci0JCXJvbGUgPSBuZXdSb2xlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRSwgb2xkUm9sZSwgcm9sZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIExpc3QgZ2V0TW9kaWZpZXMoKSB7Ci0JCUxpc3QgcGVyZm9ybXMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHRoaXMpOwotCQlJbnRlcm5hbEVMaXN0IG1vZGlmaWVzID0gbmV3IEJhc2ljSW50ZXJuYWxFTGlzdCgKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MpOwotCQlpZiAocGVyZm9ybXMgIT0gbnVsbCAmJiBwZXJmb3Jtcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBwZXJmb3Jtcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgaS5uZXh0KCk7Ci0KLQkJCQkvLyBmb3IgZWFjaCB0YXNrLCBnZXQgb3V0cHV0IHdvcmsgcHJvZHVjdDsKLQkJCQlMaXN0IG91dHB1dFdQcyA9IHRkLmdldE91dHB1dCgpOwotCQkJCWlmIChvdXRwdXRXUHMgIT0gbnVsbCAmJiBvdXRwdXRXUHMuc2l6ZSgpID4gMCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gb3V0cHV0V1BzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdAotCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJaWYgKHdwZCAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKCFtb2RpZmllcy5jb250YWlucyh3cGQpKSB7Ci0JCQkJCQkJCW1vZGlmaWVzLmFkZCh3cGQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXRSZXNwb25zaWJsZUZvcigpIHsKLQkJaWYgKHJlc3BvbnNpYmxlRm9yID09IG51bGwpIHsKLQkJCXJlc3BvbnNpYmxlRm9yID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+KAotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1IpOwotCQl9Ci0JCXJldHVybiByZXNwb25zaWJsZUZvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEU6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0Um9sZSgpOwotCQkJcmV0dXJuIGJhc2ljR2V0Um9sZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19NT0RJRklFUzoKLQkJCXJldHVybiBnZXRNb2RpZmllcygpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQlyZXR1cm4gZ2V0UmVzcG9uc2libGVGb3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJc2V0Um9sZSgoUm9sZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19NT0RJRklFUzoKLQkJCWdldE1vZGlmaWVzKCkuY2xlYXIoKTsKLQkJCWdldE1vZGlmaWVzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQlnZXRSZXNwb25zaWJsZUZvcigpLmNsZWFyKCk7Ci0JCQlnZXRSZXNwb25zaWJsZUZvcigpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEU6Ci0JCQlzZXRSb2xlKChSb2xlKSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fTU9ESUZJRVM6Ci0JCQlnZXRNb2RpZmllcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJcmV0dXJuIHJvbGUgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fTU9ESUZJRVM6Ci0JCQlyZXR1cm4gIWdldE1vZGlmaWVzKCkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQlyZXR1cm4gcmVzcG9uc2libGVGb3IgIT0gbnVsbCAmJiAhcmVzcG9uc2libGVGb3IuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Sb2xlRGVzY3JpcHRvckltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYjJjMzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVJbXBsI2dldEZ1bGZpbGxzIDxlbT5GdWxmaWxsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVJbXBsI2dldE1vZGlmaWVzIDxlbT5Nb2RpZmllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVJbXBsI2dldFJlc3BvbnNpYmxlRm9yIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlSW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFJvbGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnVsZmlsbHMoKSA8ZW0+RnVsZmlsbHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnVsZmlsbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IGZ1bGZpbGxzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzcG9uc2libGVGb3IoKSA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3BvbnNpYmxlRm9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3Q+IHJlc3BvbnNpYmxlRm9yOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gZ2V0RnVsZmlsbHMoKSB7Ci0JCWlmIChmdWxmaWxscyA9PSBudWxsKSB7Ci0JCQlmdWxmaWxscyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8RnVsZmlsbGFibGVFbGVtZW50PigKLQkJCQkJRnVsZmlsbGFibGVFbGVtZW50LmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlJPTEVfX0ZVTEZJTExTKTsKLQkJfQotCQlyZXR1cm4gZnVsZmlsbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNb2RpZmllcygpIHsKLQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldE1vZGlmaWVkV29ya1Byb2R1Y3RzKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFdvcmtQcm9kdWN0PiBnZXRSZXNwb25zaWJsZUZvcigpIHsKLQkJaWYgKHJlc3BvbnNpYmxlRm9yID09IG51bGwpIHsKLQkJCXJlc3BvbnNpYmxlRm9yID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxXb3JrUHJvZHVjdD4oCi0JCQkJCVdvcmtQcm9kdWN0LmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlJPTEVfX1JFU1BPTlNJQkxFX0ZPUik7Ci0JCX0KLQkJcmV0dXJuIHJlc3BvbnNpYmxlRm9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX0ZVTEZJTExTOgotCQkJcmV0dXJuIGdldEZ1bGZpbGxzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX19NT0RJRklFUzoKLQkJCXJldHVybiBnZXRNb2RpZmllcygpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fUkVTUE9OU0lCTEVfRk9SOgotCQkJcmV0dXJuIGdldFJlc3BvbnNpYmxlRm9yKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX0ZVTEZJTExTOgotCQkJZ2V0RnVsZmlsbHMoKS5jbGVhcigpOwotCQkJZ2V0RnVsZmlsbHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBGdWxmaWxsYWJsZUVsZW1lbnQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX19NT0RJRklFUzoKLQkJCWdldE1vZGlmaWVzKCkuY2xlYXIoKTsKLQkJCWdldE1vZGlmaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3Q+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fRlVMRklMTFM6Ci0JCQlnZXRGdWxmaWxscygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX19NT0RJRklFUzoKLQkJCWdldE1vZGlmaWVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fRlVMRklMTFM6Ci0JCQlyZXR1cm4gZnVsZmlsbHMgIT0gbnVsbCAmJiAhZnVsZmlsbHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fTU9ESUZJRVM6Ci0JCQlyZXR1cm4gIWdldE1vZGlmaWVzKCkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fUkVTUE9OU0lCTEVfRk9SOgotCQkJcmV0dXJuIHJlc3BvbnNpYmxlRm9yICE9IG51bGwgJiYgIXJlc3BvbnNpYmxlRm9yLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IEZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fRlVMRklMTFM6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFM7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IEZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcykgewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFM6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuUk9MRV9fRlVMRklMTFM7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi19IC8vUm9sZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlU2V0R3JvdXBpbmdJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZVNldEdyb3VwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjg3YWNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlU2V0R3JvdXBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBTZXQgR3JvdXBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsI2dldFJvbGVTZXRzIDxlbT5Sb2xlIFNldHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0R3JvdXBpbmdJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzCi0JCVJvbGVTZXRHcm91cGluZyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlU2V0cygpIDxlbT5Sb2xlIFNldHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um9sZVNldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxSb2xlU2V0PiByb2xlU2V0czsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlU2V0R3JvdXBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVF9HUk9VUElORzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxSb2xlU2V0PiBnZXRSb2xlU2V0cygpIHsKLQkJaWYgKHJvbGVTZXRzID09IG51bGwpIHsKLQkJCXJvbGVTZXRzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxSb2xlU2V0PihSb2xlU2V0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFMpOwotCQl9Ci0JCXJldHVybiByb2xlU2V0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTOgotCQkJcmV0dXJuIGdldFJvbGVTZXRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFM6Ci0JCQlnZXRSb2xlU2V0cygpLmNsZWFyKCk7Ci0JCQlnZXRSb2xlU2V0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUm9sZVNldD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTOgotCQkJZ2V0Um9sZVNldHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTOgotCQkJcmV0dXJuIHJvbGVTZXRzICE9IG51bGwgJiYgIXJvbGVTZXRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vUm9sZVNldEdyb3VwaW5nSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVTZXRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZVNldEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQxOGE4OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZVNldEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBTZXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0SW1wbCNnZXRSb2xlcyA8ZW0+Um9sZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0SW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cyBSb2xlU2V0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvbGVzKCkgPGVtPlJvbGVzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Um9sZT4gcm9sZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZVNldEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfU0VUOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFJvbGU+IGdldFJvbGVzKCkgewotCQlpZiAocm9sZXMgPT0gbnVsbCkgewotCQkJcm9sZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFJvbGU+KFJvbGUuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEVTKTsKLQkJfQotCQlyZXR1cm4gcm9sZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEVTOgotCQkJcmV0dXJuIGdldFJvbGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19ST0xFUzoKLQkJCWdldFJvbGVzKCkuY2xlYXIoKTsKLQkJCWdldFJvbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSb2xlPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19ST0xFUzoKLQkJCWdldFJvbGVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEVTOgotCQkJcmV0dXJuIHJvbGVzICE9IG51bGwgJiYgIXJvbGVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vUm9sZVNldEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TZWN0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NlY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3N2RjNGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NlY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZWN0aW9uSW1wbCNnZXRTZWN0aW9uTmFtZSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uIDxlbT5TZWN0aW9uIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwjZ2V0U3ViU2VjdGlvbnMgPGVtPlN1YiBTZWN0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlY3Rpb25JbXBsI2dldFByZWRlY2Vzc29yIDxlbT5QcmVkZWNlc3NvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlY3Rpb25JbXBsIGV4dGVuZHMgVmFyaWFiaWxpdHlFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFNlY3Rpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3Rpb25OYW1lKCkgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ1RJT05fTkFNRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VjdGlvbk5hbWUoKSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWN0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzZWN0aW9uTmFtZSA9IFNFQ1RJT05fTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSA8ZW0+U2VjdGlvbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNUSU9OX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSA8ZW0+U2VjdGlvbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlY3Rpb25EZXNjcmlwdGlvbiA9IFNFQ1RJT05fREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJTZWN0aW9ucygpIDxlbT5TdWIgU2VjdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViU2VjdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTZWN0aW9uPiBzdWJTZWN0aW9uczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWRlY2Vzc29yKCkgPGVtPlByZWRlY2Vzc29yPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFNlY3Rpb24gcHJlZGVjZXNzb3I7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlNFQ1RJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHNlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlY3Rpb25OYW1lKFN0cmluZyBuZXdTZWN0aW9uTmFtZSkgewotCQlTdHJpbmcgb2xkU2VjdGlvbk5hbWUgPSBzZWN0aW9uTmFtZTsKLQkJc2VjdGlvbk5hbWUgPSBuZXdTZWN0aW9uTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX05BTUUsIG9sZFNlY3Rpb25OYW1lLAotCQkJCQlzZWN0aW9uTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlY3Rpb25EZXNjcmlwdGlvbihTdHJpbmcgbmV3U2VjdGlvbkRlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRTZWN0aW9uRGVzY3JpcHRpb24gPSBzZWN0aW9uRGVzY3JpcHRpb247Ci0JCXNlY3Rpb25EZXNjcmlwdGlvbiA9IG5ld1NlY3Rpb25EZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX0RFU0NSSVBUSU9OLAotCQkJCQlvbGRTZWN0aW9uRGVzY3JpcHRpb24sIHNlY3Rpb25EZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFNlY3Rpb24+IGdldFN1YlNlY3Rpb25zKCkgewotCQlpZiAoc3ViU2VjdGlvbnMgPT0gbnVsbCkgewotCQkJc3ViU2VjdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPFNlY3Rpb24+KAotCQkJCQlTZWN0aW9uLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIHN1YlNlY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZWN0aW9uIGdldFByZWRlY2Vzc29yKCkgewotCQlpZiAocHJlZGVjZXNzb3IgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHByZWRlY2Vzc29yKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJlZGVjZXNzb3IgPSAoSW50ZXJuYWxFT2JqZWN0KSBwcmVkZWNlc3NvcjsKLQkJCXByZWRlY2Vzc29yID0gKFNlY3Rpb24pIGVSZXNvbHZlUHJveHkob2xkUHJlZGVjZXNzb3IpOwotCQkJaWYgKHByZWRlY2Vzc29yICE9IG9sZFByZWRlY2Vzc29yKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlNFQ1RJT05fX1BSRURFQ0VTU09SLCBvbGRQcmVkZWNlc3NvciwKLQkJCQkJCQlwcmVkZWNlc3NvcikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcmVkZWNlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdGlvbiBiYXNpY0dldFByZWRlY2Vzc29yKCkgewotCQlyZXR1cm4gcHJlZGVjZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZGVjZXNzb3IoU2VjdGlvbiBuZXdQcmVkZWNlc3NvcikgewotCQlTZWN0aW9uIG9sZFByZWRlY2Vzc29yID0gcHJlZGVjZXNzb3I7Ci0JCXByZWRlY2Vzc29yID0gbmV3UHJlZGVjZXNzb3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuU0VDVElPTl9fUFJFREVDRVNTT1IsIG9sZFByZWRlY2Vzc29yLAotCQkJCQlwcmVkZWNlc3NvcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTlM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRTdWJTZWN0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fTkFNRToKLQkJCXJldHVybiBnZXRTZWN0aW9uTmFtZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9ERVNDUklQVElPTjoKLQkJCXJldHVybiBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OUzoKLQkJCXJldHVybiBnZXRTdWJTZWN0aW9ucygpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fUFJFREVDRVNTT1I6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UHJlZGVjZXNzb3IoKTsKLQkJCXJldHVybiBiYXNpY0dldFByZWRlY2Vzc29yKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fTkFNRToKLQkJCXNldFNlY3Rpb25OYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT046Ci0JCQlzZXRTZWN0aW9uRGVzY3JpcHRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT05TOgotCQkJZ2V0U3ViU2VjdGlvbnMoKS5jbGVhcigpOwotCQkJZ2V0U3ViU2VjdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFNlY3Rpb24+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19QUkVERUNFU1NPUjoKLQkJCXNldFByZWRlY2Vzc29yKChTZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FOgotCQkJc2V0U2VjdGlvbk5hbWUoU0VDVElPTl9OQU1FX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT046Ci0JCQlzZXRTZWN0aW9uRGVzY3JpcHRpb24oU0VDVElPTl9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTlM6Ci0JCQlnZXRTdWJTZWN0aW9ucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19QUkVERUNFU1NPUjoKLQkJCXNldFByZWRlY2Vzc29yKChTZWN0aW9uKSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FOgotCQkJcmV0dXJuIFNFQ1RJT05fTkFNRV9FREVGQVVMVCA9PSBudWxsID8gc2VjdGlvbk5hbWUgIT0gbnVsbAotCQkJCQk6ICFTRUNUSU9OX05BTUVfRURFRkFVTFQuZXF1YWxzKHNlY3Rpb25OYW1lKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gU0VDVElPTl9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gc2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwKLQkJCQkJOiAhU0VDVElPTl9ERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoc2VjdGlvbkRlc2NyaXB0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OUzoKLQkJCXJldHVybiBzdWJTZWN0aW9ucyAhPSBudWxsICYmICFzdWJTZWN0aW9ucy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19QUkVERUNFU1NPUjoKLQkJCXJldHVybiBwcmVkZWNlc3NvciAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNlY3Rpb25OYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNlY3Rpb25OYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZWN0aW9uRGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc2VjdGlvbkRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vU2VjdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TZW1hbnRpY01vZGVsQnJpZGdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NlbWFudGljTW9kZWxCcmlkZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYmM1YTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NlbWFudGljTW9kZWxCcmlkZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlbWFudGljTW9kZWxCcmlkZ2VJbXBsI2dldFByZXNlbnRhdGlvbiA8ZW0+UHJlc2VudGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VtYW50aWNNb2RlbEJyaWRnZUltcGwjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlbWFudGljTW9kZWxCcmlkZ2VJbXBsI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlbWFudGljTW9kZWxCcmlkZ2VJbXBsIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJbXBsCi0JCWltcGxlbWVudHMgU2VtYW50aWNNb2RlbEJyaWRnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlc2VudGF0aW9uKCkgPGVtPlByZXNlbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRU5UQVRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRhdGlvbigpIDxlbT5QcmVzZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVzZW50YXRpb24gPSBQUkVTRU5UQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VtYW50aWNNb2RlbEJyaWRnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlNFTUFOVElDX01PREVMX0JSSURHRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZXNlbnRhdGlvbigpIHsKLQkJcmV0dXJuIHByZXNlbnRhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZW50YXRpb24oU3RyaW5nIG5ld1ByZXNlbnRhdGlvbikgewotCQlTdHJpbmcgb2xkUHJlc2VudGF0aW9uID0gcHJlc2VudGF0aW9uOwotCQlwcmVzZW50YXRpb24gPSBuZXdQcmVzZW50YXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT04sCi0JCQkJCW9sZFByZXNlbnRhdGlvbiwgcHJlc2VudGF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWxlbWVudCBnZXRHcmFwaEVsZW1lbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoR3JhcGhFbGVtZW50KSBlQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWxlbWVudCBiYXNpY0dldEdyYXBoRWxlbWVudCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChHcmFwaEVsZW1lbnQpIGVJbnRlcm5hbENvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQgbmV3R3JhcGhFbGVtZW50LAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0dyYXBoRWxlbWVudCwKLQkJCQlVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQgbmV3R3JhcGhFbGVtZW50KSB7Ci0JCWlmIChuZXdHcmFwaEVsZW1lbnQgIT0gZUludGVybmFsQ29udGFpbmVyKCkKLQkJCQl8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCAmJiBuZXdHcmFwaEVsZW1lbnQgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCAoRU9iamVjdCkgbmV3R3JhcGhFbGVtZW50KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkJIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0dyYXBoRWxlbWVudCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3R3JhcGhFbGVtZW50KS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTCwKLQkJCQkJCUdyYXBoRWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRHcmFwaEVsZW1lbnQobmV3R3JhcGhFbGVtZW50LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQsCi0JCQkJCW5ld0dyYXBoRWxlbWVudCwgbmV3R3JhcGhFbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0pCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChEaWFncmFtKSBlQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW0gYmFzaWNHZXREaWFncmFtKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKERpYWdyYW0pIGVJbnRlcm5hbENvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldERpYWdyYW0oRGlhZ3JhbSBuZXdEaWFncmFtLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0RpYWdyYW0sCi0JCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0sIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaWFncmFtKERpYWdyYW0gbmV3RGlhZ3JhbSkgewotCQlpZiAobmV3RGlhZ3JhbSAhPSBlSW50ZXJuYWxDb250YWluZXIoKQotCQkJCXx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNICYmIG5ld0RpYWdyYW0gIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCAoRU9iamVjdCkgbmV3RGlhZ3JhbSkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdEaWFncmFtICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdEaWFncmFtKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0UsIERpYWdyYW0uY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RGlhZ3JhbShuZXdEaWFncmFtLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0sIG5ld0RpYWdyYW0sCi0JCQkJCW5ld0RpYWdyYW0pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOgotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXREaWFncmFtKChEaWFncmFtKSBvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldEdyYXBoRWxlbWVudCgoR3JhcGhFbGVtZW50KSBvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU06Ci0JCQlyZXR1cm4gYmFzaWNTZXREaWFncmFtKG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UOgotCQkJcmV0dXJuIGJhc2ljU2V0R3JhcGhFbGVtZW50KG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOgotCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFLCBEaWFncmFtLmNsYXNzLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVDoKLQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMLAotCQkJCQlHcmFwaEVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTjoKLQkJCXJldHVybiBnZXRQcmVzZW50YXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTToKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXREaWFncmFtKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXREaWFncmFtKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0R3JhcGhFbGVtZW50KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRHcmFwaEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT046Ci0JCQlzZXRQcmVzZW50YXRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOgotCQkJc2V0RGlhZ3JhbSgoRGlhZ3JhbSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UOgotCQkJc2V0R3JhcGhFbGVtZW50KChHcmFwaEVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTjoKLQkJCXNldFByZXNlbnRhdGlvbihQUkVTRU5UQVRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOgotCQkJc2V0RGlhZ3JhbSgoRGlhZ3JhbSkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlzZXRHcmFwaEVsZW1lbnQoKEdyYXBoRWxlbWVudCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OOgotCQkJcmV0dXJuIFBSRVNFTlRBVElPTl9FREVGQVVMVCA9PSBudWxsID8gcHJlc2VudGF0aW9uICE9IG51bGwKLQkJCQkJOiAhUFJFU0VOVEFUSU9OX0VERUZBVUxULmVxdWFscyhwcmVzZW50YXRpb24pOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOgotCQkJcmV0dXJuIGJhc2ljR2V0RGlhZ3JhbSgpICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gYmFzaWNHZXRHcmFwaEVsZW1lbnQoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHByZXNlbnRhdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwcmVzZW50YXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9TZW1hbnRpY01vZGVsQnJpZGdlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDYxZDZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEltcGwjZ2V0VHlwZUluZm8gPGVtPlR5cGUgSW5mbzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbCBleHRlbmRzIFNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCi0JCWltcGxlbWVudHMgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVJbmZvKCkgPGVtPlR5cGUgSW5mbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZUluZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfSU5GT19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZUluZm8oKSA8ZW0+VHlwZSBJbmZvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlSW5mbyA9IFRZUEVfSU5GT19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUluZm8oKSB7Ci0JCXJldHVybiB0eXBlSW5mbzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlSW5mbyhTdHJpbmcgbmV3VHlwZUluZm8pIHsKLQkJU3RyaW5nIG9sZFR5cGVJbmZvID0gdHlwZUluZm87Ci0JCXR5cGVJbmZvID0gbmV3VHlwZUluZm87Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1RZUEVfSU5GTywKLQkJCQkJb2xkVHlwZUluZm8sIHR5cGVJbmZvKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1RZUEVfSU5GTzoKLQkJCXJldHVybiBnZXRUeXBlSW5mbygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fVFlQRV9JTkZPOgotCQkJc2V0VHlwZUluZm8oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19UWVBFX0lORk86Ci0JCQlzZXRUeXBlSW5mbyhUWVBFX0lORk9fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fVFlQRV9JTkZPOgotCQkJcmV0dXJuIFRZUEVfSU5GT19FREVGQVVMVCA9PSBudWxsID8gdHlwZUluZm8gIT0gbnVsbAotCQkJCQk6ICFUWVBFX0lORk9fRURFRkFVTFQuZXF1YWxzKHR5cGVJbmZvKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0eXBlSW5mbzogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh0eXBlSW5mbyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1N0ZXBJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU3RlcEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlYTY2ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU3RlcEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN0ZXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdGVwSW1wbCNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0ZXBJbXBsI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGVwSW1wbCBleHRlbmRzIFNlY3Rpb25JbXBsIGltcGxlbWVudHMgU3RlcCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVjb25kaXRpb24oKSA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJhaW50IHByZWNvbmRpdGlvbjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3Rjb25kaXRpb24oKSA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnQgcG9zdGNvbmRpdGlvbjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdGVwSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuU1RFUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBnZXRQcmVjb25kaXRpb24oKSB7Ci0JCWlmIChwcmVjb25kaXRpb24gIT0gbnVsbCAmJiAoKEVPYmplY3QpIHByZWNvbmRpdGlvbikuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFByZWNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbjsKLQkJCXByZWNvbmRpdGlvbiA9IChDb25zdHJhaW50KSBlUmVzb2x2ZVByb3h5KG9sZFByZWNvbmRpdGlvbik7Ci0JCQlpZiAocHJlY29uZGl0aW9uICE9IG9sZFByZWNvbmRpdGlvbikgewotCQkJCUludGVybmFsRU9iamVjdCBuZXdQcmVjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb247Ci0JCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFByZWNvbmRpdGlvbi5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OLAotCQkJCQkJbnVsbCwgbnVsbCk7Ci0JCQkJaWYgKG5ld1ByZWNvbmRpdGlvbi5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdQcmVjb25kaXRpb24KLQkJCQkJCQkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJLSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTiwgbnVsbCwgbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OLCBvbGRQcmVjb25kaXRpb24sCi0JCQkJCQkJcHJlY29uZGl0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBiYXNpY0dldFByZWNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcmVjb25kaXRpb24oQ29uc3RyYWludCBuZXdQcmVjb25kaXRpb24sCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnN0cmFpbnQgb2xkUHJlY29uZGl0aW9uID0gcHJlY29uZGl0aW9uOwotCQlwcmVjb25kaXRpb24gPSBuZXdQcmVjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OLAotCQkJCQlvbGRQcmVjb25kaXRpb24sIG5ld1ByZWNvbmRpdGlvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVjb25kaXRpb24oQ29uc3RyYWludCBuZXdQcmVjb25kaXRpb24pIHsKLQkJaWYgKG5ld1ByZWNvbmRpdGlvbiAhPSBwcmVjb25kaXRpb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHByZWNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgcHJlY29uZGl0aW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UHJlY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQcmVjb25kaXRpb24pLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5TVEVQX19QUkVDT05ESVRJT04sCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFByZWNvbmRpdGlvbihuZXdQcmVjb25kaXRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTiwgbmV3UHJlY29uZGl0aW9uLAotCQkJCQluZXdQcmVjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBnZXRQb3N0Y29uZGl0aW9uKCkgewotCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBudWxsICYmICgoRU9iamVjdCkgcG9zdGNvbmRpdGlvbikuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFBvc3Rjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwb3N0Y29uZGl0aW9uOwotCQkJcG9zdGNvbmRpdGlvbiA9IChDb25zdHJhaW50KSBlUmVzb2x2ZVByb3h5KG9sZFBvc3Rjb25kaXRpb24pOwotCQkJaWYgKHBvc3Rjb25kaXRpb24gIT0gb2xkUG9zdGNvbmRpdGlvbikgewotCQkJCUludGVybmFsRU9iamVjdCBuZXdQb3N0Y29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcG9zdGNvbmRpdGlvbjsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkUG9zdGNvbmRpdGlvbgotCQkJCQkJLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT04sIG51bGwsIG51bGwpOwotCQkJCWlmIChuZXdQb3N0Y29uZGl0aW9uLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1Bvc3Rjb25kaXRpb24uZUludmVyc2VBZGQodGhpcywKLQkJCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCQktIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTiwgbnVsbCwKLQkJCQkJCQltc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OLCBvbGRQb3N0Y29uZGl0aW9uLAotCQkJCQkJCXBvc3Rjb25kaXRpb24pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcG9zdGNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBiYXNpY0dldFBvc3Rjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBvc3Rjb25kaXRpb24oQ29uc3RyYWludCBuZXdQb3N0Y29uZGl0aW9uLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlDb25zdHJhaW50IG9sZFBvc3Rjb25kaXRpb24gPSBwb3N0Y29uZGl0aW9uOwotCQlwb3N0Y29uZGl0aW9uID0gbmV3UG9zdGNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OLAotCQkJCQlvbGRQb3N0Y29uZGl0aW9uLCBuZXdQb3N0Y29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3Rjb25kaXRpb24oQ29uc3RyYWludCBuZXdQb3N0Y29uZGl0aW9uKSB7Ci0JCWlmIChuZXdQb3N0Y29uZGl0aW9uICE9IHBvc3Rjb25kaXRpb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBvc3Rjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb24pCi0JCQkJCQkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UG9zdGNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3UG9zdGNvbmRpdGlvbikKLQkJCQkJCS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBvc3Rjb25kaXRpb24obmV3UG9zdGNvbmRpdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTiwgbmV3UG9zdGNvbmRpdGlvbiwKLQkJCQkJbmV3UG9zdGNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEVQX19QUkVDT05ESVRJT046Ci0JCQlyZXR1cm4gYmFzaWNTZXRQcmVjb25kaXRpb24obnVsbCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OOgotCQkJcmV0dXJuIGJhc2ljU2V0UG9zdGNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFByZWNvbmRpdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UHJlY29uZGl0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFBvc3Rjb25kaXRpb24oKTsKLQkJCXJldHVybiBiYXNpY0dldFBvc3Rjb25kaXRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OOgotCQkJc2V0UHJlY29uZGl0aW9uKChDb25zdHJhaW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OOgotCQkJc2V0UG9zdGNvbmRpdGlvbigoQ29uc3RyYWludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTjoKLQkJCXNldFByZWNvbmRpdGlvbigoQ29uc3RyYWludCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OOgotCQkJc2V0UG9zdGNvbmRpdGlvbigoQ29uc3RyYWludCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBwcmVjb25kaXRpb24gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT046Ci0JCQlyZXR1cm4gcG9zdGNvbmRpdGlvbiAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gV29ya0RlZmluaXRpb24uY2xhc3MpIHsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gV29ya0RlZmluaXRpb24uY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTjsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLX0gLy9TdGVwSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1N1cHBvcnRpbmdNYXRlcmlhbEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmM2I3MTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1N1cHBvcnRpbmdNYXRlcmlhbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN1cHBvcnRpbmdNYXRlcmlhbEltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cwotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN1cHBvcnRpbmdNYXRlcmlhbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlNVUFBPUlRJTkdfTUFURVJJQUw7Ci0JfQotCi19IC8vU3VwcG9ydGluZ01hdGVyaWFsSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UYXNrRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3OTAxZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2sgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cwotCQlUYXNrRGVzY3JpcHRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1cnBvc2UoKSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVSUE9TRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVycG9zZSgpIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1cnBvc2UgPSBQVVJQT1NFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdGVybmF0aXZlcygpIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxURVJOQVRJVkVTX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbHRlcm5hdGl2ZXMoKSA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWx0ZXJuYXRpdmVzID0gQUxURVJOQVRJVkVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdXJwb3NlKCkgewotCQlyZXR1cm4gcHVycG9zZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdXJwb3NlKFN0cmluZyBuZXdQdXJwb3NlKSB7Ci0JCVN0cmluZyBvbGRQdXJwb3NlID0gcHVycG9zZTsKLQkJcHVycG9zZSA9IG5ld1B1cnBvc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSwgb2xkUHVycG9zZSwgcHVycG9zZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWx0ZXJuYXRpdmVzKCkgewotCQlyZXR1cm4gYWx0ZXJuYXRpdmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgbmV3QWx0ZXJuYXRpdmVzKSB7Ci0JCVN0cmluZyBvbGRBbHRlcm5hdGl2ZXMgPSBhbHRlcm5hdGl2ZXM7Ci0JCWFsdGVybmF0aXZlcyA9IG5ld0FsdGVybmF0aXZlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMsIG9sZEFsdGVybmF0aXZlcywKLQkJCQkJYWx0ZXJuYXRpdmVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXJldHVybiBnZXRQdXJwb3NlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQlyZXR1cm4gZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlzZXRQdXJwb3NlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCXNldEFsdGVybmF0aXZlcygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXNldFB1cnBvc2UoUFVSUE9TRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQlzZXRBbHRlcm5hdGl2ZXMoQUxURVJOQVRJVkVTX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXJldHVybiBQVVJQT1NFX0VERUZBVUxUID09IG51bGwgPyBwdXJwb3NlICE9IG51bGwKLQkJCQkJOiAhUFVSUE9TRV9FREVGQVVMVC5lcXVhbHMocHVycG9zZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQlyZXR1cm4gQUxURVJOQVRJVkVTX0VERUZBVUxUID09IG51bGwgPyBhbHRlcm5hdGl2ZXMgIT0gbnVsbAotCQkJCQk6ICFBTFRFUk5BVElWRVNfRURFRkFVTFQuZXF1YWxzKGFsdGVybmF0aXZlcyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHVycG9zZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwdXJwb3NlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhbHRlcm5hdGl2ZXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYWx0ZXJuYXRpdmVzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVGFza0Rlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdG9ySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTFmMDQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UYXNrRGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLkRlZmF1bHRWYWx1ZU1hbmFnZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrIERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0VGFzayA8ZW0+VGFzazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRBc3Npc3RlZEJ5IDxlbT5Bc3Npc3RlZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRFeHRlcm5hbElucHV0IDxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5IDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldFNlbGVjdGVkU3RlcHMgPGVtPlNlbGVjdGVkIFN0ZXBzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0b3JJbXBsIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJVGFza0Rlc2NyaXB0b3IgewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ0MTk0MTQ2NjQyNzM5MTA4NjNMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVCA9IEJvb2xlYW4uVFJVRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFzaygpIDxlbT5UYXNrPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFzayB0YXNrOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFJvbGVEZXNjcmlwdG9yPiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFzc2lzdGVkQnkoKSA8ZW0+QXNzaXN0ZWQgQnk8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXNzaXN0ZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFJvbGVEZXNjcmlwdG9yPiBhc3Npc3RlZEJ5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxJbnB1dCgpIDxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbElucHV0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBleHRlcm5hbElucHV0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFuZGF0b3J5SW5wdXQoKSA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hbmRhdG9yeUlucHV0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBtYW5kYXRvcnlJbnB1dDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9wdGlvbmFsSW5wdXQoKSA8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3B0aW9uYWxJbnB1dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gb3B0aW9uYWxJbnB1dDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dHB1dCgpIDxlbT5PdXRwdXQ8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3V0cHV0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBvdXRwdXQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpIDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Um9sZURlc2NyaXB0b3I+IHBlcmZvcm1lZFByaW1hcmlseUJ5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VsZWN0ZWRTdGVwcygpIDxlbT5TZWxlY3RlZCBTdGVwczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWxlY3RlZFN0ZXBzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U2VjdGlvbj4gc2VsZWN0ZWRTdGVwczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrRGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSB7Ci0JCXJldHVybiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKEJvb2xlYW4gbmV3SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKSB7Ci0JCUJvb2xlYW4gb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCQlpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBuZXdJc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UsCi0JCQkJCW9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSwgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2sgZ2V0VGFzaygpIHsKLQkJaWYgKHRhc2sgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHRhc2spLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRUYXNrID0gKEludGVybmFsRU9iamVjdCkgdGFzazsKLQkJCXRhc2sgPSAoVGFzaykgZVJlc29sdmVQcm94eShvbGRUYXNrKTsKLQkJCWlmICh0YXNrICE9IG9sZFRhc2spIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLLCBvbGRUYXNrLCB0YXNrKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2sgYmFzaWNHZXRUYXNrKCkgewotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXNrKFRhc2sgbmV3VGFzaykgewotCQlUYXNrIG9sZFRhc2sgPSB0YXNrOwotCQl0YXNrID0gbmV3VGFzazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0ssIG9sZFRhc2ssIHRhc2spKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxSb2xlRGVzY3JpcHRvcj4gZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSB7Ci0JCWlmIChhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA9PSBudWxsKSB7Ci0JCQlhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Um9sZURlc2NyaXB0b3I+KAotCQkJCQlSb2xlRGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkpOwotCQl9Ci0JCXJldHVybiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxSb2xlRGVzY3JpcHRvcj4gZ2V0QXNzaXN0ZWRCeSgpIHsKLQkJaWYgKGFzc2lzdGVkQnkgPT0gbnVsbCkgewotCQkJYXNzaXN0ZWRCeSA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Um9sZURlc2NyaXB0b3I+KAotCQkJCQlSb2xlRGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZKTsKLQkJfQotCQlyZXR1cm4gYXNzaXN0ZWRCeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldEV4dGVybmFsSW5wdXQoKSB7Ci0JCWlmIChleHRlcm5hbElucHV0ID09IG51bGwpIHsKLQkJCWV4dGVybmFsSW5wdXQgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4oCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUKTsKLQkJfQotCQlyZXR1cm4gZXh0ZXJuYWxJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldE1hbmRhdG9yeUlucHV0KCkgewotCQlpZiAobWFuZGF0b3J5SW5wdXQgPT0gbnVsbCkgewotCQkJbWFuZGF0b3J5SW5wdXQgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4oCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVCk7Ci0JCX0KLQkJcmV0dXJuIG1hbmRhdG9yeUlucHV0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0T3B0aW9uYWxJbnB1dCgpIHsKLQkJaWYgKG9wdGlvbmFsSW5wdXQgPT0gbnVsbCkgewotCQkJb3B0aW9uYWxJbnB1dCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPigKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQpOwotCQl9Ci0JCXJldHVybiBvcHRpb25hbElucHV0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0T3V0cHV0KCkgewotCQlpZiAob3V0cHV0ID09IG51bGwpIHsKLQkJCW91dHB1dCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPigKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUKTsKLQkJfQotCQlyZXR1cm4gb3V0cHV0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFJvbGVEZXNjcmlwdG9yPiBnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpIHsKLQkJaWYgKHBlcmZvcm1lZFByaW1hcmlseUJ5ID09IG51bGwpIHsKLQkJCXBlcmZvcm1lZFByaW1hcmlseUJ5ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxSb2xlRGVzY3JpcHRvcj4oCi0JCQkJCVJvbGVEZXNjcmlwdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSk7Ci0JCX0KLQkJcmV0dXJuIHBlcmZvcm1lZFByaW1hcmlseUJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFNlY3Rpb24+IGdldFNlbGVjdGVkU3RlcHMoKSB7Ci0JCWlmIChzZWxlY3RlZFN0ZXBzID09IG51bGwpIHsKLQkJCXNlbGVjdGVkU3RlcHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFNlY3Rpb24+KFNlY3Rpb24uY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TRUxFQ1RFRF9TVEVQUyk7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGVkU3RlcHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQlyZXR1cm4gZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0s6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0VGFzaygpOwotCQkJcmV0dXJuIGJhc2ljR2V0VGFzaygpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJcmV0dXJuIGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZOgotCQkJcmV0dXJuIGdldEFzc2lzdGVkQnkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQlyZXR1cm4gZ2V0RXh0ZXJuYWxJbnB1dCgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQlyZXR1cm4gZ2V0TWFuZGF0b3J5SW5wdXQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQ6Ci0JCQlyZXR1cm4gZ2V0T3B0aW9uYWxJbnB1dCgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQlyZXR1cm4gZ2V0T3V0cHV0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0JCQlyZXR1cm4gZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fU0VMRUNURURfU1RFUFM6Ci0JCQlyZXR1cm4gZ2V0U2VsZWN0ZWRTdGVwcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCXNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLOgotCQkJc2V0VGFzaygoVGFzaykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5jbGVhcigpOwotCQkJZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSb2xlRGVzY3JpcHRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQlnZXRBc3Npc3RlZEJ5KCkuY2xlYXIoKTsKLQkJCWdldEFzc2lzdGVkQnkoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSb2xlRGVzY3JpcHRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQlnZXRFeHRlcm5hbElucHV0KCkuY2xlYXIoKTsKLQkJCWdldEV4dGVybmFsSW5wdXQoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCWdldE1hbmRhdG9yeUlucHV0KCkuY2xlYXIoKTsKLQkJCWdldE1hbmRhdG9yeUlucHV0KCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJCWdldE9wdGlvbmFsSW5wdXQoKS5jbGVhcigpOwotCQkJZ2V0T3B0aW9uYWxJbnB1dCgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUOgotCQkJZ2V0T3V0cHV0KCkuY2xlYXIoKTsKLQkJCWdldE91dHB1dCgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWToKLQkJCWdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkuY2xlYXIoKTsKLQkJCWdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUm9sZURlc2NyaXB0b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1NFTEVDVEVEX1NURVBTOgotCQkJZ2V0U2VsZWN0ZWRTdGVwcygpLmNsZWFyKCk7Ci0JCQlnZXRTZWxlY3RlZFN0ZXBzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTZWN0aW9uPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0s6Ci0JCQlzZXRUYXNrKChUYXNrKSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQlnZXRBc3Npc3RlZEJ5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQlnZXRFeHRlcm5hbElucHV0KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJCWdldE9wdGlvbmFsSW5wdXQoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQlnZXRPdXRwdXQoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotCQkJZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TRUxFQ1RFRF9TVEVQUzoKLQkJCWdldFNlbGVjdGVkU3RlcHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCXJldHVybiBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSAhPSBudWxsCi0JCQkJCTogIUlTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVAotCQkJCQkJCS5lcXVhbHMoaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSzoKLQkJCXJldHVybiB0YXNrICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQlyZXR1cm4gYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgIT0gbnVsbAotCQkJCQkmJiAhYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWToKLQkJCXJldHVybiBhc3Npc3RlZEJ5ICE9IG51bGwgJiYgIWFzc2lzdGVkQnkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLQkJCXJldHVybiBleHRlcm5hbElucHV0ICE9IG51bGwgJiYgIWV4dGVybmFsSW5wdXQuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQlyZXR1cm4gbWFuZGF0b3J5SW5wdXQgIT0gbnVsbCAmJiAhbWFuZGF0b3J5SW5wdXQuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJCXJldHVybiBvcHRpb25hbElucHV0ICE9IG51bGwgJiYgIW9wdGlvbmFsSW5wdXQuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQlyZXR1cm4gb3V0cHV0ICE9IG51bGwgJiYgIW91dHB1dC5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0JCQlyZXR1cm4gcGVyZm9ybWVkUHJpbWFyaWx5QnkgIT0gbnVsbAotCQkJCQkmJiAhcGVyZm9ybWVkUHJpbWFyaWx5QnkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TRUxFQ1RFRF9TVEVQUzoKLQkJCXJldHVybiBzZWxlY3RlZFN0ZXBzICE9IG51bGwgJiYgIXNlbGVjdGVkU3RlcHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gRGVzY3JpcHRvci5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBEZXNjcmlwdG9yLmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8gQmVnaW4gb2YgY3VzdG9tIGNvZGUgCi0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQlzdGF0aWMgewotCQkvLyBvdmVycmlkZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBCcmVha2Rvd25FbGVtZW50LmlzUGxhbm5lZAotCQkvLwotCQlEZWZhdWx0VmFsdWVNYW5hZ2VyLklOU1RBTkNFLnNldFN0YXRpY0RlZmF1bHRWYWx1ZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRvcigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpLCBCb29sZWFuLkZBTFNFKTsKLQl9Ci19IC8vVGFza0Rlc2NyaXB0b3JJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGFza0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UYXNrSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmUzMWJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UYXNrSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwjZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsI2dldFBlcmZvcm1lZEJ5IDxlbT5QZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbCNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwjZ2V0T3V0cHV0IDxlbT5PdXRwdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbCNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwjZ2V0U3RlcHMgPGVtPlN0ZXBzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwjZ2V0VG9vbE1lbnRvcnMgPGVtPlRvb2wgTWVudG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tJbXBsIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJbXBsIGltcGxlbWVudHMgVGFzayB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVjb25kaXRpb24oKSA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJhaW50IHByZWNvbmRpdGlvbjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3Rjb25kaXRpb24oKSA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnQgcG9zdGNvbmRpdGlvbjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmZvcm1lZEJ5KCkgPGVtPlBlcmZvcm1lZCBCeTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJmb3JtZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFJvbGU+IHBlcmZvcm1lZEJ5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFuZGF0b3J5SW5wdXQoKSA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hbmRhdG9yeUlucHV0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3Q+IG1hbmRhdG9yeUlucHV0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3V0cHV0KCkgPGVtPk91dHB1dDwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRwdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxXb3JrUHJvZHVjdD4gb3V0cHV0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFJvbGU+IGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3B0aW9uYWxJbnB1dCgpIDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcHRpb25hbElucHV0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3Q+IG9wdGlvbmFsSW5wdXQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb29sTWVudG9ycygpIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9vbE1lbnRvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxUb29sTWVudG9yPiB0b29sTWVudG9yczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEVzdGltYXRpb25Db25zaWRlcmF0aW9ucz4gZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFByZWNvbmRpdGlvbigpIHsKLQkJaWYgKHByZWNvbmRpdGlvbiAhPSBudWxsICYmICgoRU9iamVjdCkgcHJlY29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJlY29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcHJlY29uZGl0aW9uOwotCQkJcHJlY29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUHJlY29uZGl0aW9uKTsKLQkJCWlmIChwcmVjb25kaXRpb24gIT0gb2xkUHJlY29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1ByZWNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbjsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkUHJlY29uZGl0aW9uLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT04sCi0JCQkJCQludWxsLCBudWxsKTsKLQkJCQlpZiAobmV3UHJlY29uZGl0aW9uLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1ByZWNvbmRpdGlvbgotCQkJCQkJCS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCQktIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OLCBudWxsLCBtc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT04sIG9sZFByZWNvbmRpdGlvbiwKLQkJCQkJCQlwcmVjb25kaXRpb24pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlY29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGJhc2ljR2V0UHJlY29uZGl0aW9uKCkgewotCQlyZXR1cm4gcHJlY29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByZWNvbmRpdGlvbihDb25zdHJhaW50IG5ld1ByZWNvbmRpdGlvbiwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ29uc3RyYWludCBvbGRQcmVjb25kaXRpb24gPSBwcmVjb25kaXRpb247Ci0JCXByZWNvbmRpdGlvbiA9IG5ld1ByZWNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT04sCi0JCQkJCW9sZFByZWNvbmRpdGlvbiwgbmV3UHJlY29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWNvbmRpdGlvbihDb25zdHJhaW50IG5ld1ByZWNvbmRpdGlvbikgewotCQlpZiAobmV3UHJlY29uZGl0aW9uICE9IHByZWNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT04sCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQcmVjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1ByZWNvbmRpdGlvbikuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJlY29uZGl0aW9uKG5ld1ByZWNvbmRpdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OLCBuZXdQcmVjb25kaXRpb24sCi0JCQkJCW5ld1ByZWNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFBvc3Rjb25kaXRpb24oKSB7Ci0JCWlmIChwb3N0Y29uZGl0aW9uICE9IG51bGwgJiYgKChFT2JqZWN0KSBwb3N0Y29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUG9zdGNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb247Ci0JCQlwb3N0Y29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUG9zdGNvbmRpdGlvbik7Ci0JCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBvbGRQb3N0Y29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1Bvc3Rjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwb3N0Y29uZGl0aW9uOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQb3N0Y29uZGl0aW9uCi0JCQkJCQkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTiwgbnVsbCwgbnVsbCk7Ci0JCQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3UG9zdGNvbmRpdGlvbi5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJCS0gVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OLCBudWxsLAotCQkJCQkJCW1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT04sIG9sZFBvc3Rjb25kaXRpb24sCi0JCQkJCQkJcG9zdGNvbmRpdGlvbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHBvc3Rjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50IG5ld1Bvc3Rjb25kaXRpb24sCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnN0cmFpbnQgb2xkUG9zdGNvbmRpdGlvbiA9IHBvc3Rjb25kaXRpb247Ci0JCXBvc3Rjb25kaXRpb24gPSBuZXdQb3N0Y29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT04sCi0JCQkJCW9sZFBvc3Rjb25kaXRpb24sIG5ld1Bvc3Rjb25kaXRpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50IG5ld1Bvc3Rjb25kaXRpb24pIHsKLQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24gIT0gcG9zdGNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgcG9zdGNvbmRpdGlvbikKLQkJCQkJCS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQb3N0Y29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQb3N0Y29uZGl0aW9uKQotCQkJCQkJLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT04sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UG9zdGNvbmRpdGlvbihuZXdQb3N0Y29uZGl0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OLCBuZXdQb3N0Y29uZGl0aW9uLAotCQkJCQluZXdQb3N0Y29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8Um9sZT4gZ2V0UGVyZm9ybWVkQnkoKSB7Ci0JCWlmIChwZXJmb3JtZWRCeSA9PSBudWxsKSB7Ci0JCQlwZXJmb3JtZWRCeSA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Um9sZT4oUm9sZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX19QRVJGT1JNRURfQlkpOwotCQl9Ci0JCXJldHVybiBwZXJmb3JtZWRCeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdD4gZ2V0TWFuZGF0b3J5SW5wdXQoKSB7Ci0JCWlmIChtYW5kYXRvcnlJbnB1dCA9PSBudWxsKSB7Ci0JCQltYW5kYXRvcnlJbnB1dCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8V29ya1Byb2R1Y3Q+KAotCQkJCQlXb3JrUHJvZHVjdC5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5UQVNLX19NQU5EQVRPUllfSU5QVVQpOwotCQl9Ci0JCXJldHVybiBtYW5kYXRvcnlJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdD4gZ2V0T3V0cHV0KCkgewotCQlpZiAob3V0cHV0ID09IG51bGwpIHsKLQkJCW91dHB1dCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8V29ya1Byb2R1Y3Q+KFdvcmtQcm9kdWN0LmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLlRBU0tfX09VVFBVVCk7Ci0JCX0KLQkJcmV0dXJuIG91dHB1dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxSb2xlPiBnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpIHsKLQkJaWYgKGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5ID09IG51bGwpIHsKLQkJCWFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxSb2xlPigKLQkJCQkJUm9sZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZKTsKLQkJfQotCQlyZXR1cm4gYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3Q+IGdldE9wdGlvbmFsSW5wdXQoKSB7Ci0JCWlmIChvcHRpb25hbElucHV0ID09IG51bGwpIHsKLQkJCW9wdGlvbmFsSW5wdXQgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0PigKLQkJCQkJV29ya1Byb2R1Y3QuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuVEFTS19fT1BUSU9OQUxfSU5QVVQpOwotCQl9Ci0JCXJldHVybiBvcHRpb25hbElucHV0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIExpc3QgZ2V0U3RlcHMoKSB7Ci0JCXJldHVybiBnZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFRvb2xNZW50b3I+IGdldFRvb2xNZW50b3JzKCkgewotCQlpZiAodG9vbE1lbnRvcnMgPT0gbnVsbCkgewotCQkJdG9vbE1lbnRvcnMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFRvb2xNZW50b3I+KAotCQkJCQlUb29sTWVudG9yLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlRBU0tfX1RPT0xfTUVOVE9SUyk7Ci0JCX0KLQkJcmV0dXJuIHRvb2xNZW50b3JzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEVzdGltYXRpb25Db25zaWRlcmF0aW9ucz4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlpZiAoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID09IG51bGwpIHsKLQkJCWVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPigKLQkJCQkJRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMpOwotCQl9Ci0JCXJldHVybiBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFByZWNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQlyZXR1cm4gYmFzaWNTZXRQb3N0Y29uZGl0aW9uKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UHJlY29uZGl0aW9uKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQcmVjb25kaXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UG9zdGNvbmRpdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUEVSRk9STUVEX0JZOgotCQkJcmV0dXJuIGdldFBlcmZvcm1lZEJ5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQlyZXR1cm4gZ2V0TWFuZGF0b3J5SW5wdXQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09VVFBVVDoKLQkJCXJldHVybiBnZXRPdXRwdXQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQlyZXR1cm4gZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09QVElPTkFMX0lOUFVUOgotCQkJcmV0dXJuIGdldE9wdGlvbmFsSW5wdXQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1NURVBTOgotCQkJcmV0dXJuIGdldFN0ZXBzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19UT09MX01FTlRPUlM6Ci0JCQlyZXR1cm4gZ2V0VG9vbE1lbnRvcnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQlyZXR1cm4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjoKLQkJCXNldFByZWNvbmRpdGlvbigoQ29uc3RyYWludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTjoKLQkJCXNldFBvc3Rjb25kaXRpb24oKENvbnN0cmFpbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BFUkZPUk1FRF9CWToKLQkJCWdldFBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCWdldFBlcmZvcm1lZEJ5KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSb2xlPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fTUFOREFUT1JZX0lOUFVUOgotCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5jbGVhcigpOwotCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09VVFBVVDoKLQkJCWdldE91dHB1dCgpLmNsZWFyKCk7Ci0JCQlnZXRPdXRwdXQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUm9sZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09QVElPTkFMX0lOUFVUOgotCQkJZ2V0T3B0aW9uYWxJbnB1dCgpLmNsZWFyKCk7Ci0JCQlnZXRPcHRpb25hbElucHV0KCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3Q+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19TVEVQUzoKLQkJCWdldFN0ZXBzKCkuY2xlYXIoKTsKLQkJCWdldFN0ZXBzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdGVwPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fVE9PTF9NRU5UT1JTOgotCQkJZ2V0VG9vbE1lbnRvcnMoKS5jbGVhcigpOwotCQkJZ2V0VG9vbE1lbnRvcnMoKQotCQkJCQkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUb29sTWVudG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OOgotCQkJc2V0UHJlY29uZGl0aW9uKChDb25zdHJhaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQlzZXRQb3N0Y29uZGl0aW9uKChDb25zdHJhaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BFUkZPUk1FRF9CWToKLQkJCWdldFBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX01BTkRBVE9SWV9JTlBVVDoKLQkJCWdldE1hbmRhdG9yeUlucHV0KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09VVFBVVDoKLQkJCWdldE91dHB1dCgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1BUSU9OQUxfSU5QVVQ6Ci0JCQlnZXRPcHRpb25hbElucHV0KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1NURVBTOgotCQkJZ2V0U3RlcHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fVE9PTF9NRU5UT1JTOgotCQkJZ2V0VG9vbE1lbnRvcnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBwcmVjb25kaXRpb24gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQlyZXR1cm4gcG9zdGNvbmRpdGlvbiAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUEVSRk9STUVEX0JZOgotCQkJcmV0dXJuIHBlcmZvcm1lZEJ5ICE9IG51bGwgJiYgIXBlcmZvcm1lZEJ5LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX01BTkRBVE9SWV9JTlBVVDoKLQkJCXJldHVybiBtYW5kYXRvcnlJbnB1dCAhPSBudWxsICYmICFtYW5kYXRvcnlJbnB1dC5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PVVRQVVQ6Ci0JCQlyZXR1cm4gb3V0cHV0ICE9IG51bGwgJiYgIW91dHB1dC5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJcmV0dXJuIGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5ICE9IG51bGwKLQkJCQkJJiYgIWFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09QVElPTkFMX0lOUFVUOgotCQkJcmV0dXJuIG9wdGlvbmFsSW5wdXQgIT0gbnVsbCAmJiAhb3B0aW9uYWxJbnB1dC5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19TVEVQUzoKLQkJCXJldHVybiAhZ2V0U3RlcHMoKS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19UT09MX01FTlRPUlM6Ci0JCQlyZXR1cm4gdG9vbE1lbnRvcnMgIT0gbnVsbCAmJiAhdG9vbE1lbnRvcnMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCXJldHVybiBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgIT0gbnVsbAotCQkJCQkmJiAhZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IFdvcmtEZWZpbml0aW9uLmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT047Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IFdvcmtEZWZpbml0aW9uLmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT047Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT047Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi19IC8vVGFza0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZWFtUHJvZmlsZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZWFtUHJvZmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE1ZGNmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGVhbVByb2ZpbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZWFtIFByb2ZpbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwjZ2V0VGVhbVJvbGVzIDxlbT5UZWFtIFJvbGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsI2dldFN1cGVyVGVhbSA8ZW0+U3VwZXIgVGVhbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbCNnZXRTdWJUZWFtIDxlbT5TdWIgVGVhbTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRlYW1Qcm9maWxlSW1wbCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJVGVhbVByb2ZpbGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGVhbVJvbGVzKCkgPGVtPlRlYW0gUm9sZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGVhbVJvbGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Um9sZURlc2NyaXB0b3I+IHRlYW1Sb2xlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1cGVyVGVhbSgpIDxlbT5TdXBlciBUZWFtPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdXBlclRlYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBUZWFtUHJvZmlsZSBzdXBlclRlYW07Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJUZWFtKCkgPGVtPlN1YiBUZWFtPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YlRlYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxUZWFtUHJvZmlsZT4gc3ViVGVhbTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUZWFtUHJvZmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRFQU1fUFJPRklMRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxSb2xlRGVzY3JpcHRvcj4gZ2V0VGVhbVJvbGVzKCkgewotCQlpZiAodGVhbVJvbGVzID09IG51bGwpIHsKLQkJCXRlYW1Sb2xlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Um9sZURlc2NyaXB0b3I+KAotCQkJCQlSb2xlRGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1RFQU1fUk9MRVMpOwotCQl9Ci0JCXJldHVybiB0ZWFtUm9sZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlYW1Qcm9maWxlIGdldFN1cGVyVGVhbSgpIHsKLQkJaWYgKHN1cGVyVGVhbSAhPSBudWxsICYmICgoRU9iamVjdCkgc3VwZXJUZWFtKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkU3VwZXJUZWFtID0gKEludGVybmFsRU9iamVjdCkgc3VwZXJUZWFtOwotCQkJc3VwZXJUZWFtID0gKFRlYW1Qcm9maWxlKSBlUmVzb2x2ZVByb3h5KG9sZFN1cGVyVGVhbSk7Ci0JCQlpZiAoc3VwZXJUZWFtICE9IG9sZFN1cGVyVGVhbSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0sIG9sZFN1cGVyVGVhbSwKLQkJCQkJCQlzdXBlclRlYW0pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXJUZWFtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZWFtUHJvZmlsZSBiYXNpY0dldFN1cGVyVGVhbSgpIHsKLQkJcmV0dXJuIHN1cGVyVGVhbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTdXBlclRlYW0oVGVhbVByb2ZpbGUgbmV3U3VwZXJUZWFtLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlUZWFtUHJvZmlsZSBvbGRTdXBlclRlYW0gPSBzdXBlclRlYW07Ci0JCXN1cGVyVGVhbSA9IG5ld1N1cGVyVGVhbTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0sCi0JCQkJCW9sZFN1cGVyVGVhbSwgbmV3U3VwZXJUZWFtKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1cGVyVGVhbShUZWFtUHJvZmlsZSBuZXdTdXBlclRlYW0pIHsKLQkJaWYgKG5ld1N1cGVyVGVhbSAhPSBzdXBlclRlYW0pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHN1cGVyVGVhbSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgc3VwZXJUZWFtKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNLCBUZWFtUHJvZmlsZS5jbGFzcywKLQkJCQkJCW1zZ3MpOwotCQkJaWYgKG5ld1N1cGVyVGVhbSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3U3VwZXJUZWFtKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNLCBUZWFtUHJvZmlsZS5jbGFzcywKLQkJCQkJCW1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U3VwZXJUZWFtKG5ld1N1cGVyVGVhbSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNLCBuZXdTdXBlclRlYW0sCi0JCQkJCW5ld1N1cGVyVGVhbSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFRlYW1Qcm9maWxlPiBnZXRTdWJUZWFtKCkgewotCQlpZiAoc3ViVGVhbSA9PSBudWxsKSB7Ci0JCQlzdWJUZWFtID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0PFRlYW1Qcm9maWxlPigKLQkJCQkJVGVhbVByb2ZpbGUuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTSwKLQkJCQkJVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0pOwotCQl9Ci0JCXJldHVybiBzdWJUZWFtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU06Ci0JCQlpZiAoc3VwZXJUZWFtICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBzdXBlclRlYW0pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU0sIFRlYW1Qcm9maWxlLmNsYXNzLAotCQkJCQkJbXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXRTdXBlclRlYW0oKFRlYW1Qcm9maWxlKSBvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDxJbnRlcm5hbEVPYmplY3Q+KSAoSW50ZXJuYWxFTGlzdDw/PikgZ2V0U3ViVGVhbSgpKQotCQkJCQkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJcmV0dXJuIGJhc2ljU2V0U3VwZXJUZWFtKG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldFN1YlRlYW0oKSkKLQkJCQkJLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTOgotCQkJcmV0dXJuIGdldFRlYW1Sb2xlcygpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFN1cGVyVGVhbSgpOwotCQkJcmV0dXJuIGJhc2ljR2V0U3VwZXJUZWFtKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNOgotCQkJcmV0dXJuIGdldFN1YlRlYW0oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTOgotCQkJZ2V0VGVhbVJvbGVzKCkuY2xlYXIoKTsKLQkJCWdldFRlYW1Sb2xlcygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFJvbGVEZXNjcmlwdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJc2V0U3VwZXJUZWFtKChUZWFtUHJvZmlsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTToKLQkJCWdldFN1YlRlYW0oKS5jbGVhcigpOwotCQkJZ2V0U3ViVGVhbSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVGVhbVByb2ZpbGU+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTOgotCQkJZ2V0VGVhbVJvbGVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTToKLQkJCXNldFN1cGVyVGVhbSgoVGVhbVByb2ZpbGUpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTToKLQkJCWdldFN1YlRlYW0oKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1RFQU1fUk9MRVM6Ci0JCQlyZXR1cm4gdGVhbVJvbGVzICE9IG51bGwgJiYgIXRlYW1Sb2xlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU06Ci0JCQlyZXR1cm4gc3VwZXJUZWFtICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNOgotCQkJcmV0dXJuIHN1YlRlYW0gIT0gbnVsbCAmJiAhc3ViVGVhbS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1RlYW1Qcm9maWxlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1RlbXBsYXRlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1RlbXBsYXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWI4YmVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZW1wbGF0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZW1wbGF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRlbXBsYXRlSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFRlbXBsYXRlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUZW1wbGF0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRFTVBMQVRFOwotCX0KLQotfSAvL1RlbXBsYXRlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rlcm1EZWZpbml0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rlcm1EZWZpbml0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWY2ODAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZXJtRGVmaW5pdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXJtIERlZmluaXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXJtRGVmaW5pdGlvbkltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBUZXJtRGVmaW5pdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGVybURlZmluaXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5URVJNX0RFRklOSVRJT047Ci0JfQotCi19IC8vVGVybURlZmluaXRpb25JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGV4dEVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGV4dEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NWE2YWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1RleHRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXh0IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZXh0RWxlbWVudEltcGwjZ2V0VGV4dCA8ZW0+VGV4dDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRleHRFbGVtZW50SW1wbCBleHRlbmRzIExlYWZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRleHRFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZXh0KCkgPGVtPlRleHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRleHQoKSA8ZW0+VGV4dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0ZXh0ID0gVEVYVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUZXh0RWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRFWFRfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIG5ld1RleHQpIHsKLQkJU3RyaW5nIG9sZFRleHQgPSB0ZXh0OwotCQl0ZXh0ID0gbmV3VGV4dDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5URVhUX0VMRU1FTlRfX1RFWFQsIG9sZFRleHQsIHRleHQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URVhUX0VMRU1FTlRfX1RFWFQ6Ci0JCQlyZXR1cm4gZ2V0VGV4dCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URVhUX0VMRU1FTlRfX1RFWFQ6Ci0JCQlzZXRUZXh0KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URVhUX0VMRU1FTlRfX1RFWFQ6Ci0JCQlzZXRUZXh0KFRFWFRfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URVhUX0VMRU1FTlRfX1RFWFQ6Ci0JCQlyZXR1cm4gVEVYVF9FREVGQVVMVCA9PSBudWxsID8gdGV4dCAhPSBudWxsIDogIVRFWFRfRURFRkFVTFQKLQkJCQkJLmVxdWFscyh0ZXh0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0ZXh0OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHRleHQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UZXh0RWxlbWVudEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Ub29sSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rvb2xJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNTRhOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rvb2xJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRvb2w8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Ub29sSW1wbCNnZXRUb29sTWVudG9ycyA8ZW0+VG9vbCBNZW50b3JzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVG9vbEltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgVG9vbCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb29sTWVudG9ycygpIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9vbE1lbnRvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxUb29sTWVudG9yPiB0b29sTWVudG9yczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUb29sSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVE9PTDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxUb29sTWVudG9yPiBnZXRUb29sTWVudG9ycygpIHsKLQkJaWYgKHRvb2xNZW50b3JzID09IG51bGwpIHsKLQkJCXRvb2xNZW50b3JzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxUb29sTWVudG9yPigKLQkJCQkJVG9vbE1lbnRvci5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5UT09MX19UT09MX01FTlRPUlMpOwotCQl9Ci0JCXJldHVybiB0b29sTWVudG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MX19UT09MX01FTlRPUlM6Ci0JCQlyZXR1cm4gZ2V0VG9vbE1lbnRvcnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fVE9PTF9NRU5UT1JTOgotCQkJZ2V0VG9vbE1lbnRvcnMoKS5jbGVhcigpOwotCQkJZ2V0VG9vbE1lbnRvcnMoKQotCQkJCQkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUb29sTWVudG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX1RPT0xfTUVOVE9SUzoKLQkJCWdldFRvb2xNZW50b3JzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fVE9PTF9NRU5UT1JTOgotCQkJcmV0dXJuIHRvb2xNZW50b3JzICE9IG51bGwgJiYgIXRvb2xNZW50b3JzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vVG9vbEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Ub29sTWVudG9ySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rvb2xNZW50b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4Nzc0ZTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rvb2xNZW50b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRvb2xNZW50b3JJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgVG9vbE1lbnRvciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVG9vbE1lbnRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRPT0xfTUVOVE9SOwotCX0KLQotfSAvL1Rvb2xNZW50b3JJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVHlwZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzgyODEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFR5cGVJbXBsIGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFR5cGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UWVBFOwotCX0KLQotfSAvL1R5cGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmRkOTQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1BU2VtYW50aWNNb2RlbEJyaWRnZUltcGwgZXh0ZW5kcyBTZW1hbnRpY01vZGVsQnJpZGdlSW1wbAotCQlpbXBsZW1lbnRzIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudCgpIDxlbT5FbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFVNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5VTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwgJiYgKChFT2JqZWN0KSBlbGVtZW50KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkRWxlbWVudCA9IChJbnRlcm5hbEVPYmplY3QpIGVsZW1lbnQ7Ci0JCQllbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGVSZXNvbHZlUHJveHkob2xkRWxlbWVudCk7Ci0JCQlpZiAoZWxlbWVudCAhPSBvbGRFbGVtZW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQsCi0JCQkJCQkJb2xkRWxlbWVudCwgZWxlbWVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGJhc2ljR2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChNZXRob2RFbGVtZW50IG5ld0VsZW1lbnQpIHsKLQkJTWV0aG9kRWxlbWVudCBvbGRFbGVtZW50ID0gZWxlbWVudDsKLQkJZWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVCwgb2xkRWxlbWVudCwKLQkJCQkJZWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5VTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UOgotCQkJc2V0RWxlbWVudCgoTWV0aG9kRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQ6Ci0JCQlzZXRFbGVtZW50KChNZXRob2RFbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVDoKLQkJCXJldHVybiBlbGVtZW50ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVW1hRmFjdG9yeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9VbWFGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmFiYWM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9VbWFGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW1hRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBVbWFGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBVbWFGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlVbWFGYWN0b3J5IHRoZVVtYUZhY3RvcnkgPSAoVW1hRmFjdG9yeSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UKLQkJCQkJLmdldEVGYWN0b3J5KCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjUvdW1hLmVjb3JlIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlpZiAodGhlVW1hRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZVVtYUZhY3Rvcnk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgVW1hRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUEFDS0FHRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUGFja2FnZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQ29uc3RyYWludCgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuS0lORDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlS2luZCgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVVBQT1JUSU5HX01BVEVSSUFMOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVNlY3Rpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTkNFUFQ6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUNvbmNlcHQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNIRUNLTElTVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQ2hlY2tsaXN0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlERUxJTkU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUd1aWRlbGluZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRVhBTVBMRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlRXhhbXBsZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUkVVU0FCTEVfQVNTRVQ6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVJldXNhYmxlQXNzZXQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFUk1fREVGSU5JVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVGVybURlZmluaXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1Q6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUFydGlmYWN0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1Q6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVdvcmtQcm9kdWN0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5GVUxGSUxMQUJMRV9FTEVNRU5UOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVGdWxmaWxsYWJsZUVsZW1lbnQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFUE9SVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUmVwb3J0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5URU1QTEFURToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVGVtcGxhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfTUVOVE9SOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVUb29sTWVudG9yKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEZWxpdmVyYWJsZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuT1VUQ09NRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlT3V0Y29tZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuU1RFUDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlU3RlcCgpOwotCQljYXNlIFVtYVBhY2thZ2UuV0hJVEVQQVBFUjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlV2hpdGVwYXBlcigpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTSzoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVGFzaygpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUm9sZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVJvbGVEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVGFza0Rlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVSb2xlU2V0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU46Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURvbWFpbigpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElORzoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEaXNjaXBsaW5lKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQWN0aXZpdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEE6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVBsYW5uaW5nRGF0YSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlV29ya09yZGVyKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0FETUFQOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVSb2FkbWFwKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVUb29sKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElORzoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUm9sZVNldEdyb3VwaW5nKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUlk6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUN1c3RvbUNhdGVnb3J5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUNvbnRlbnRQYWNrYWdlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NSUxFU1RPTkU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZU1pbGVzdG9uZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1I6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpOwotCQljYXNlIFVtYVBhY2thZ2UuSVRFUkFUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVJdGVyYXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBIQVNFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQaGFzZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVUZWFtUHJvZmlsZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVSb2xlRGVzY3JpcHRvcigpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVUYXNrRGVzY3JpcHRvcigpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUNvbXBvc2l0ZVJvbGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1M6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURlbGl2ZXJ5UHJvY2VzcygpOwotCQljYXNlIFVtYVBhY2thZ2UuQ0FQQUJJTElUWV9QQVRURVJOOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU46Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZU1ldGhvZFBsdWdpbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcmFjdGljZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcm9jZXNzQ29tcG9uZW50KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEaWFncmFtKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9OT0RFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVHcmFwaE5vZGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUmVmZXJlbmNlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUHJvcGVydHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQb2ludCgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEaWFncmFtTGluaygpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVHcmFwaENvbm5lY3RvcigpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlR3JhcGhFZGdlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURpbWVuc2lvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVYVF9FTEVNRU5UOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVUZXh0RWxlbWVudCgpOwotCQljYXNlIFVtYVBhY2thZ2UuSU1BR0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUltYWdlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUG9seWxpbmUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUVsbGlwc2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfRkFNSUxZOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcm9jZXNzRmFtaWx5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlTWV0aG9kTGlicmFyeSgpOwotCQlkZWZhdWx0OgotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX1RZUEU6Ci0JCQlyZXR1cm4gY3JlYXRlVmFyaWFiaWxpdHlUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX1RZUEU6Ci0JCQlyZXR1cm4gY3JlYXRlV29ya09yZGVyVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuU1RSSU5HOgotCQkJcmV0dXJuIGNyZWF0ZVN0cmluZ0Zyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuQk9PTEVBTjoKLQkJCXJldHVybiBjcmVhdGVCb29sZWFuRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5EQVRFOgotCQkJcmV0dXJuIGNyZWF0ZURhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlVSSToKLQkJCXJldHVybiBjcmVhdGVVcmlGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFVDoKLQkJCXJldHVybiBjcmVhdGVTZXRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFUVVFTkNFOgotCQkJcmV0dXJuIGNyZWF0ZVNlcXVlbmNlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5JTlRFR0VSOgotCQkJcmV0dXJuIGNyZWF0ZUludGVnZXJGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPVUJMRToKLQkJCXJldHVybiBjcmVhdGVEb3VibGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9UWVBFOgotCQkJcmV0dXJuIGNvbnZlcnRWYXJpYWJpbGl0eVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9UWVBFOgotCQkJcmV0dXJuIGNvbnZlcnRXb3JrT3JkZXJUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNUUklORzoKLQkJCXJldHVybiBjb252ZXJ0U3RyaW5nVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJPT0xFQU46Ci0JCQlyZXR1cm4gY29udmVydEJvb2xlYW5Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuREFURToKLQkJCXJldHVybiBjb252ZXJ0RGF0ZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5VUkk6Ci0JCQlyZXR1cm4gY29udmVydFVyaVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRVQ6Ci0JCQlyZXR1cm4gY29udmVydFNldFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRVFVRU5DRToKLQkJCXJldHVybiBjb252ZXJ0U2VxdWVuY2VUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuSU5URUdFUjoKLQkJCXJldHVybiBjb252ZXJ0SW50ZWdlclRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET1VCTEU6Ci0JCQlyZXR1cm4gY29udmVydERvdWJsZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWRlZmF1bHQ6Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlIGNyZWF0ZVBhY2thZ2UoKSB7Ci0JCVBhY2thZ2VJbXBsIHBhY2thZ2VfID0gbmV3IFBhY2thZ2VJbXBsKCk7Ci0JCXJldHVybiBwYWNrYWdlXzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBjcmVhdGVDb25zdHJhaW50KCkgewotCQlDb25zdHJhaW50SW1wbCBjb25zdHJhaW50ID0gbmV3IENvbnN0cmFpbnRJbXBsKCk7Ci0JCXJldHVybiBjb25zdHJhaW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50UHJvcGVydHkgY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5KCkgewotCQlNZXRob2RFbGVtZW50UHJvcGVydHlJbXBsIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA9IG5ldyBNZXRob2RFbGVtZW50UHJvcGVydHlJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50UHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEtpbmQgY3JlYXRlS2luZCgpIHsKLQkJS2luZEltcGwga2luZCA9IG5ldyBLaW5kSW1wbCgpOwotCQlyZXR1cm4ga2luZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudERlc2NyaXB0aW9uIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbigpIHsKLQkJQ29udGVudERlc2NyaXB0aW9uSW1wbCBjb250ZW50RGVzY3JpcHRpb24gPSBuZXcgQ29udGVudERlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gY29udGVudERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZWN0aW9uIGNyZWF0ZVNlY3Rpb24oKSB7Ci0JCVNlY3Rpb25JbXBsIHNlY3Rpb24gPSBuZXcgU2VjdGlvbkltcGwoKTsKLQkJcmV0dXJuIHNlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGUgY3JlYXRlUm9sZSgpIHsKLQkJUm9sZUltcGwgcm9sZSA9IG5ldyBSb2xlSW1wbCgpOwotCQlyZXR1cm4gcm9sZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFzayBjcmVhdGVUYXNrKCkgewotCQlUYXNrSW1wbCB0YXNrID0gbmV3IFRhc2tJbXBsKCk7Ci0JCXJldHVybiB0YXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdGVwIGNyZWF0ZVN0ZXAoKSB7Ci0JCVN0ZXBJbXBsIHN0ZXAgPSBuZXcgU3RlcEltcGwoKTsKLQkJcmV0dXJuIHN0ZXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFydGlmYWN0IGNyZWF0ZUFydGlmYWN0KCkgewotCQlBcnRpZmFjdEltcGwgYXJ0aWZhY3QgPSBuZXcgQXJ0aWZhY3RJbXBsKCk7Ci0JCXJldHVybiBhcnRpZmFjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3QgY3JlYXRlV29ya1Byb2R1Y3QoKSB7Ci0JCVdvcmtQcm9kdWN0SW1wbCB3b3JrUHJvZHVjdCA9IG5ldyBXb3JrUHJvZHVjdEltcGwoKTsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGdWxmaWxsYWJsZUVsZW1lbnQgY3JlYXRlRnVsZmlsbGFibGVFbGVtZW50KCkgewotCQlGdWxmaWxsYWJsZUVsZW1lbnRJbXBsIGZ1bGZpbGxhYmxlRWxlbWVudCA9IG5ldyBGdWxmaWxsYWJsZUVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBmdWxmaWxsYWJsZUVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJhYmxlIGNyZWF0ZURlbGl2ZXJhYmxlKCkgewotCQlEZWxpdmVyYWJsZUltcGwgZGVsaXZlcmFibGUgPSBuZXcgRGVsaXZlcmFibGVJbXBsKCk7Ci0JCXJldHVybiBkZWxpdmVyYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3V0Y29tZSBjcmVhdGVPdXRjb21lKCkgewotCQlPdXRjb21lSW1wbCBvdXRjb21lID0gbmV3IE91dGNvbWVJbXBsKCk7Ci0JCXJldHVybiBvdXRjb21lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50UGFja2FnZSBjcmVhdGVDb250ZW50UGFja2FnZSgpIHsKLQkJQ29udGVudFBhY2thZ2VJbXBsIGNvbnRlbnRQYWNrYWdlID0gbmV3IENvbnRlbnRQYWNrYWdlSW1wbCgpOwotCQlyZXR1cm4gY29udGVudFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFydGlmYWN0RGVzY3JpcHRpb24gY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbigpIHsKLQkJQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwgYXJ0aWZhY3REZXNjcmlwdGlvbiA9IG5ldyBBcnRpZmFjdERlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gYXJ0aWZhY3REZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbiBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCB3b3JrUHJvZHVjdERlc2NyaXB0aW9uID0gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uIGNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKSB7Ci0JCURlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24gPSBuZXcgRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdGlvbiBjcmVhdGVSb2xlRGVzY3JpcHRpb24oKSB7Ci0JCVJvbGVEZXNjcmlwdGlvbkltcGwgcm9sZURlc2NyaXB0aW9uID0gbmV3IFJvbGVEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHJvbGVEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFza0Rlc2NyaXB0aW9uIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbigpIHsKLQkJVGFza0Rlc2NyaXB0aW9uSW1wbCB0YXNrRGVzY3JpcHRpb24gPSBuZXcgVGFza0Rlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gdGFza0Rlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHdWlkYW5jZURlc2NyaXB0aW9uIGNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb24oKSB7Ci0JCUd1aWRhbmNlRGVzY3JpcHRpb25JbXBsIGd1aWRhbmNlRGVzY3JpcHRpb24gPSBuZXcgR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGd1aWRhbmNlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByYWN0aWNlRGVzY3JpcHRpb24gY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbigpIHsKLQkJUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwgcHJhY3RpY2VEZXNjcmlwdGlvbiA9IG5ldyBQcmFjdGljZURlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gcHJhY3RpY2VEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHkgY3JlYXRlQWN0aXZpdHkoKSB7Ci0JCUFjdGl2aXR5SW1wbCBhY3Rpdml0eSA9IG5ldyBBY3Rpdml0eUltcGwoKTsKLQkJcmV0dXJuIGFjdGl2aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNaWxlc3RvbmUgY3JlYXRlTWlsZXN0b25lKCkgewotCQlNaWxlc3RvbmVJbXBsIG1pbGVzdG9uZSA9IG5ldyBNaWxlc3RvbmVJbXBsKCk7Ci0JCXJldHVybiBtaWxlc3RvbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEl0ZXJhdGlvbiBjcmVhdGVJdGVyYXRpb24oKSB7Ci0JCUl0ZXJhdGlvbkltcGwgaXRlcmF0aW9uID0gbmV3IEl0ZXJhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGl0ZXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGhhc2UgY3JlYXRlUGhhc2UoKSB7Ci0JCVBoYXNlSW1wbCBwaGFzZSA9IG5ldyBQaGFzZUltcGwoKTsKLQkJcmV0dXJuIHBoYXNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZWFtUHJvZmlsZSBjcmVhdGVUZWFtUHJvZmlsZSgpIHsKLQkJVGVhbVByb2ZpbGVJbXBsIHRlYW1Qcm9maWxlID0gbmV3IFRlYW1Qcm9maWxlSW1wbCgpOwotCQlyZXR1cm4gdGVhbVByb2ZpbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdG9yIGNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkgewotCQlSb2xlRGVzY3JpcHRvckltcGwgcm9sZURlc2NyaXB0b3IgPSBuZXcgUm9sZURlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiByb2xlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVyIGNyZWF0ZVdvcmtPcmRlcigpIHsKLQkJV29ya09yZGVySW1wbCB3b3JrT3JkZXIgPSBuZXcgV29ya09yZGVySW1wbCgpOwotCQlyZXR1cm4gd29ya09yZGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQbGFubmluZ0RhdGEgY3JlYXRlUGxhbm5pbmdEYXRhKCkgewotCQlQbGFubmluZ0RhdGFJbXBsIHBsYW5uaW5nRGF0YSA9IG5ldyBQbGFubmluZ0RhdGFJbXBsKCk7Ci0JCXJldHVybiBwbGFubmluZ0RhdGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tEZXNjcmlwdG9yIGNyZWF0ZVRhc2tEZXNjcmlwdG9yKCkgewotCQlUYXNrRGVzY3JpcHRvckltcGwgdGFza0Rlc2NyaXB0b3IgPSBuZXcgVGFza0Rlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiB0YXNrRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCB3b3JrUHJvZHVjdERlc2NyaXB0b3IgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVSb2xlIGNyZWF0ZUNvbXBvc2l0ZVJvbGUoKSB7Ci0JCUNvbXBvc2l0ZVJvbGVJbXBsIGNvbXBvc2l0ZVJvbGUgPSBuZXcgQ29tcG9zaXRlUm9sZUltcGwoKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZVJvbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSB7Ci0JCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwgYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uID0gbmV3IEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEZXNjcmlwdGlvbiBjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uKCkgewotCQlBY3Rpdml0eURlc2NyaXB0aW9uSW1wbCBhY3Rpdml0eURlc2NyaXB0aW9uID0gbmV3IEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBhY3Rpdml0eURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpIHsKLQkJRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uID0gbmV3IERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NEZXNjcmlwdGlvbiBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgcHJvY2Vzc0Rlc2NyaXB0aW9uID0gbmV3IFByb2Nlc3NEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRvckRlc2NyaXB0aW9uIGNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbigpIHsKLQkJRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCBkZXNjcmlwdG9yRGVzY3JpcHRpb24gPSBuZXcgRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gZGVzY3JpcHRvckRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25jZXB0IGNyZWF0ZUNvbmNlcHQoKSB7Ci0JCUNvbmNlcHRJbXBsIGNvbmNlcHQgPSBuZXcgQ29uY2VwdEltcGwoKTsKLQkJcmV0dXJuIGNvbmNlcHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENoZWNrbGlzdCBjcmVhdGVDaGVja2xpc3QoKSB7Ci0JCUNoZWNrbGlzdEltcGwgY2hlY2tsaXN0ID0gbmV3IENoZWNrbGlzdEltcGwoKTsKLQkJcmV0dXJuIGNoZWNrbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXhhbXBsZSBjcmVhdGVFeGFtcGxlKCkgewotCQlFeGFtcGxlSW1wbCBleGFtcGxlID0gbmV3IEV4YW1wbGVJbXBsKCk7Ci0JCXJldHVybiBleGFtcGxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHdWlkZWxpbmUgY3JlYXRlR3VpZGVsaW5lKCkgewotCQlHdWlkZWxpbmVJbXBsIGd1aWRlbGluZSA9IG5ldyBHdWlkZWxpbmVJbXBsKCk7Ci0JCXJldHVybiBndWlkZWxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCUVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID0gbmV3IEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwoKTsKLQkJcmV0dXJuIGVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVwb3J0IGNyZWF0ZVJlcG9ydCgpIHsKLQkJUmVwb3J0SW1wbCByZXBvcnQgPSBuZXcgUmVwb3J0SW1wbCgpOwotCQlyZXR1cm4gcmVwb3J0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZSBjcmVhdGVUZW1wbGF0ZSgpIHsKLQkJVGVtcGxhdGVJbXBsIHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlSW1wbCgpOwotCQlyZXR1cm4gdGVtcGxhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN1cHBvcnRpbmdNYXRlcmlhbCBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwoKSB7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbEltcGwgc3VwcG9ydGluZ01hdGVyaWFsID0gbmV3IFN1cHBvcnRpbmdNYXRlcmlhbEltcGwoKTsKLQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVG9vbE1lbnRvciBjcmVhdGVUb29sTWVudG9yKCkgewotCQlUb29sTWVudG9ySW1wbCB0b29sTWVudG9yID0gbmV3IFRvb2xNZW50b3JJbXBsKCk7Ci0JCXJldHVybiB0b29sTWVudG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXaGl0ZXBhcGVyIGNyZWF0ZVdoaXRlcGFwZXIoKSB7Ci0JCVdoaXRlcGFwZXJJbXBsIHdoaXRlcGFwZXIgPSBuZXcgV2hpdGVwYXBlckltcGwoKTsKLQkJcmV0dXJuIHdoaXRlcGFwZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlcm1EZWZpbml0aW9uIGNyZWF0ZVRlcm1EZWZpbml0aW9uKCkgewotCQlUZXJtRGVmaW5pdGlvbkltcGwgdGVybURlZmluaXRpb24gPSBuZXcgVGVybURlZmluaXRpb25JbXBsKCk7Ci0JCXJldHVybiB0ZXJtRGVmaW5pdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gY3JlYXRlQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSB7Ci0JCUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbCBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyA9IG5ldyBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwoKTsKLQkJcmV0dXJuIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcmFjdGljZSBjcmVhdGVQcmFjdGljZSgpIHsKLQkJUHJhY3RpY2VJbXBsIHByYWN0aWNlID0gbmV3IFByYWN0aWNlSW1wbCgpOwotCQlyZXR1cm4gcHJhY3RpY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJldXNhYmxlQXNzZXQgY3JlYXRlUmV1c2FibGVBc3NldCgpIHsKLQkJUmV1c2FibGVBc3NldEltcGwgcmV1c2FibGVBc3NldCA9IG5ldyBSZXVzYWJsZUFzc2V0SW1wbCgpOwotCQlyZXR1cm4gcmV1c2FibGVBc3NldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZSBjcmVhdGVEaXNjaXBsaW5lKCkgewotCQlEaXNjaXBsaW5lSW1wbCBkaXNjaXBsaW5lID0gbmV3IERpc2NpcGxpbmVJbXBsKCk7Ci0JCXJldHVybiBkaXNjaXBsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlU2V0IGNyZWF0ZVJvbGVTZXQoKSB7Ci0JCVJvbGVTZXRJbXBsIHJvbGVTZXQgPSBuZXcgUm9sZVNldEltcGwoKTsKLQkJcmV0dXJuIHJvbGVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvbWFpbiBjcmVhdGVEb21haW4oKSB7Ci0JCURvbWFpbkltcGwgZG9tYWluID0gbmV3IERvbWFpbkltcGwoKTsKLQkJcmV0dXJuIGRvbWFpbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RUeXBlIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpIHsKLQkJV29ya1Byb2R1Y3RUeXBlSW1wbCB3b3JrUHJvZHVjdFR5cGUgPSBuZXcgV29ya1Byb2R1Y3RUeXBlSW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3RUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lR3JvdXBpbmcgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCkgewotCQlEaXNjaXBsaW5lR3JvdXBpbmdJbXBsIGRpc2NpcGxpbmVHcm91cGluZyA9IG5ldyBEaXNjaXBsaW5lR3JvdXBpbmdJbXBsKCk7Ci0JCXJldHVybiBkaXNjaXBsaW5lR3JvdXBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRvb2wgY3JlYXRlVG9vbCgpIHsKLQkJVG9vbEltcGwgdG9vbCA9IG5ldyBUb29sSW1wbCgpOwotCQlyZXR1cm4gdG9vbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZVNldEdyb3VwaW5nIGNyZWF0ZVJvbGVTZXRHcm91cGluZygpIHsKLQkJUm9sZVNldEdyb3VwaW5nSW1wbCByb2xlU2V0R3JvdXBpbmcgPSBuZXcgUm9sZVNldEdyb3VwaW5nSW1wbCgpOwotCQlyZXR1cm4gcm9sZVNldEdyb3VwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeSBjcmVhdGVDdXN0b21DYXRlZ29yeSgpIHsKLQkJQ3VzdG9tQ2F0ZWdvcnlJbXBsIGN1c3RvbUNhdGVnb3J5ID0gbmV3IEN1c3RvbUNhdGVnb3J5SW1wbCgpOwotCQlyZXR1cm4gY3VzdG9tQ2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJ5UHJvY2VzcyBjcmVhdGVEZWxpdmVyeVByb2Nlc3MoKSB7Ci0JCURlbGl2ZXJ5UHJvY2Vzc0ltcGwgZGVsaXZlcnlQcm9jZXNzID0gbmV3IERlbGl2ZXJ5UHJvY2Vzc0ltcGwoKTsKLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2VzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ2FwYWJpbGl0eVBhdHRlcm4gY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oKSB7Ci0JCUNhcGFiaWxpdHlQYXR0ZXJuSW1wbCBjYXBhYmlsaXR5UGF0dGVybiA9IG5ldyBDYXBhYmlsaXR5UGF0dGVybkltcGwoKTsKLQkJcmV0dXJuIGNhcGFiaWxpdHlQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpIHsKLQkJUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsIHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlID0gbmV3IFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvYWRtYXAgY3JlYXRlUm9hZG1hcCgpIHsKLQkJUm9hZG1hcEltcGwgcm9hZG1hcCA9IG5ldyBSb2FkbWFwSW1wbCgpOwotCQlyZXR1cm4gcm9hZG1hcDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudCBjcmVhdGVQcm9jZXNzQ29tcG9uZW50KCkgewotCQlQcm9jZXNzQ29tcG9uZW50SW1wbCBwcm9jZXNzQ29tcG9uZW50ID0gbmV3IFByb2Nlc3NDb21wb25lbnRJbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzUGFja2FnZSBjcmVhdGVQcm9jZXNzUGFja2FnZSgpIHsKLQkJUHJvY2Vzc1BhY2thZ2VJbXBsIHByb2Nlc3NQYWNrYWdlID0gbmV3IFByb2Nlc3NQYWNrYWdlSW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc1BhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpIHsKLQkJUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSA9IG5ldyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKSB7Ci0JCVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySW1wbCBwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciA9IG5ldyBQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW4gY3JlYXRlTWV0aG9kUGx1Z2luKCkgewotCQlNZXRob2RQbHVnaW5JbXBsIG1ldGhvZFBsdWdpbiA9IG5ldyBNZXRob2RQbHVnaW5JbXBsKCk7Ci0JCXJldHVybiBtZXRob2RQbHVnaW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbkltcGwgbWV0aG9kQ29uZmlndXJhdGlvbiA9IG5ldyBNZXRob2RDb25maWd1cmF0aW9uSW1wbCgpOwotCQlyZXR1cm4gbWV0aG9kQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0ZhbWlseSBjcmVhdGVQcm9jZXNzRmFtaWx5KCkgewotCQlQcm9jZXNzRmFtaWx5SW1wbCBwcm9jZXNzRmFtaWx5ID0gbmV3IFByb2Nlc3NGYW1pbHlJbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzRmFtaWx5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGNyZWF0ZU1ldGhvZExpYnJhcnkoKSB7Ci0JCU1ldGhvZExpYnJhcnlJbXBsIG1ldGhvZExpYnJhcnkgPSBuZXcgTWV0aG9kTGlicmFyeUltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZExpYnJhcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGNyZWF0ZVBvaW50KCkgewotCQlQb2ludEltcGwgcG9pbnQgPSBuZXcgUG9pbnRJbXBsKCk7Ci0JCXJldHVybiBwb2ludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUxpbmsgY3JlYXRlRGlhZ3JhbUxpbmsoKSB7Ci0JCURpYWdyYW1MaW5rSW1wbCBkaWFncmFtTGluayA9IG5ldyBEaWFncmFtTGlua0ltcGwoKTsKLQkJcmV0dXJuIGRpYWdyYW1MaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaENvbm5lY3RvciBjcmVhdGVHcmFwaENvbm5lY3RvcigpIHsKLQkJR3JhcGhDb25uZWN0b3JJbXBsIGdyYXBoQ29ubmVjdG9yID0gbmV3IEdyYXBoQ29ubmVjdG9ySW1wbCgpOwotCQlyZXR1cm4gZ3JhcGhDb25uZWN0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpbWVuc2lvbiBjcmVhdGVEaW1lbnNpb24oKSB7Ci0JCURpbWVuc2lvbkltcGwgZGltZW5zaW9uID0gbmV3IERpbWVuc2lvbkltcGwoKTsKLQkJcmV0dXJuIGRpbWVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVmZXJlbmNlIGNyZWF0ZVJlZmVyZW5jZSgpIHsKLQkJUmVmZXJlbmNlSW1wbCByZWZlcmVuY2UgPSBuZXcgUmVmZXJlbmNlSW1wbCgpOwotCQlyZXR1cm4gcmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eSBjcmVhdGVQcm9wZXJ0eSgpIHsKLQkJUHJvcGVydHlJbXBsIHByb3BlcnR5ID0gbmV3IFByb3BlcnR5SW1wbCgpOwotCQlyZXR1cm4gcHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWRnZSBjcmVhdGVHcmFwaEVkZ2UoKSB7Ci0JCUdyYXBoRWRnZUltcGwgZ3JhcGhFZGdlID0gbmV3IEdyYXBoRWRnZUltcGwoKTsKLQkJcmV0dXJuIGdyYXBoRWRnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBjcmVhdGVEaWFncmFtKCkgewotCQlEaWFncmFtSW1wbCBkaWFncmFtID0gbmV3IERpYWdyYW1JbXBsKCk7Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaE5vZGUgY3JlYXRlR3JhcGhOb2RlKCkgewotCQlHcmFwaE5vZGVJbXBsIGdyYXBoTm9kZSA9IG5ldyBHcmFwaE5vZGVJbXBsKCk7Ci0JCXJldHVybiBncmFwaE5vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IGNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCkgewotCQlTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEltcGwgc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQgPSBuZXcgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBjcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCkgewotCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCB1bWFTZW1hbnRpY01vZGVsQnJpZGdlID0gbmV3IFVNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsKCk7Ci0JCXJldHVybiB1bWFTZW1hbnRpY01vZGVsQnJpZGdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSBjcmVhdGVDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpIHsKLQkJQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsIGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlID0gbmV3IENvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCgpOwotCQlyZXR1cm4gY29yZVNlbWFudGljTW9kZWxCcmlkZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRleHRFbGVtZW50IGNyZWF0ZVRleHRFbGVtZW50KCkgewotCQlUZXh0RWxlbWVudEltcGwgdGV4dEVsZW1lbnQgPSBuZXcgVGV4dEVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiB0ZXh0RWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgY3JlYXRlSW1hZ2UoKSB7Ci0JCUltYWdlSW1wbCBpbWFnZSA9IG5ldyBJbWFnZUltcGwoKTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2x5bGluZSBjcmVhdGVQb2x5bGluZSgpIHsKLQkJUG9seWxpbmVJbXBsIHBvbHlsaW5lID0gbmV3IFBvbHlsaW5lSW1wbCgpOwotCQlyZXR1cm4gcG9seWxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVsbGlwc2UgY3JlYXRlRWxsaXBzZSgpIHsKLQkJRWxsaXBzZUltcGwgZWxsaXBzZSA9IG5ldyBFbGxpcHNlSW1wbCgpOwotCQlyZXR1cm4gZWxsaXBzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVyVHlwZSBjcmVhdGVXb3JrT3JkZXJUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlXb3JrT3JkZXJUeXBlIHJlc3VsdCA9IFdvcmtPcmRlclR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V29ya09yZGVyVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsCi0JCQlPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlIGNyZWF0ZVZhcmlhYmlsaXR5VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCVN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIHJlc3VsdCA9IFZhcmlhYmlsaXR5VHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYXJpYWJpbGl0eVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERhdGUgY3JlYXRlRGF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKERhdGUpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydERhdGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVSSSBjcmVhdGVVcmlGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChVUkkpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFVyaVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVN0cmluZ0Zyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCVN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFN0cmluZ1RvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsCi0JCQlPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gY3JlYXRlQm9vbGVhbkZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCVN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCb29sZWFuKSBzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRCb29sZWFuVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCU9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2V0IGNyZWF0ZVNldEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFNldCkgc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U2V0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGNyZWF0ZVNlcXVlbmNlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKExpc3QpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFNlcXVlbmNlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCU9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBjcmVhdGVJbnRlZ2VyRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEludGVnZXIpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEludGVnZXJUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgY3JlYXRlRG91YmxlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKERvdWJsZSkgc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RG91YmxlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCU9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hUGFja2FnZSBnZXRVbWFQYWNrYWdlKCkgewotCQlyZXR1cm4gKFVtYVBhY2thZ2UpIGdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgVW1hUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vVW1hRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9VbWFQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1VtYVBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0OWIxOTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1VtYVBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaGljUHJpbWl0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTGVhZkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLio7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW1hUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBVbWFQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjbGFzc2lmaWVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBuYW1lZEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcGFja2FnZWFibGVFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBhY2thZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbmFtZXNwYWNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29uc3RyYWludEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mga2luZEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50RWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29udGVudERlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlY3Rpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrUHJvZHVjdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBmdWxmaWxsYWJsZUVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFza0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrRGVmaW5pdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzdGVwRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGd1aWRhbmNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFydGlmYWN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlbGl2ZXJhYmxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG91dGNvbWVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kUGFja2FnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50UGFja2FnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFza0Rlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhY3Rpdml0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBicmVha2Rvd25FbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1pbGVzdG9uZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpdGVyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcGhhc2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGVhbVByb2ZpbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZURlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya09yZGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBsYW5uaW5nRGF0YUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZXNjcmlwdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRhc2tEZXNjcmlwdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb21wb3NpdGVSb2xlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29uY2VwdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjaGVja2xpc3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXhhbXBsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBndWlkZWxpbmVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlcG9ydEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0ZW1wbGF0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzdXBwb3J0aW5nTWF0ZXJpYWxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdG9vbE1lbnRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3aGl0ZXBhcGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRlcm1EZWZpbml0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByYWN0aWNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJldXNhYmxlQXNzZXRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGlzY2lwbGluZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50Q2F0ZWdvcnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZVNldEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkb21haW5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya1Byb2R1Y3RUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0b29sRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvbGVTZXRHcm91cGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjdXN0b21DYXRlZ29yeUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZWxpdmVyeVByb2Nlc3NFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjYXBhYmlsaXR5UGF0dGVybkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2FkbWFwRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NDb21wb25lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc1BhY2thZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RQbHVnaW5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdmFyaWFiaWxpdHlFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZFVuaXRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzRmFtaWx5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZExpYnJhcnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcG9pbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZ3JhcGhFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRpYWdyYW1FbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRpYWdyYW1MaW5rRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGdyYXBoQ29ubmVjdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGltZW5zaW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlZmVyZW5jZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9wZXJ0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBncmFwaEVkZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGlhZ3JhbUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBncmFwaE5vZGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdW1hU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb3JlU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsZWFmRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0ZXh0RWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpbWFnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBncmFwaGljUHJpbWl0aXZlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBvbHlsaW5lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVsbGlwc2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB3b3JrT3JkZXJUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB2YXJpYWJpbGl0eVR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBkYXRlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHVyaUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBzdHJpbmdFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgYm9vbGVhbkVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBzZXRFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgc2VxdWVuY2VFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaW50ZWdlckVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBkb3VibGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBVbWFQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBVbWFQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkKLQkJCXJldHVybiAoVW1hUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UKLQkJCQkJLmdldEVQYWNrYWdlKFVtYVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlVbWFQYWNrYWdlSW1wbCB0aGVVbWFQYWNrYWdlID0gKFVtYVBhY2thZ2VJbXBsKSAoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UKLQkJCQkuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBVbWFQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFCi0JCQkJLmdldEVQYWNrYWdlKGVOU19VUkkpCi0JCQkJOiBuZXcgVW1hUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZVVtYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVVbWFQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZVVtYVBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZVVtYVBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDbGFzc2lmaWVyKCkgewotCQlyZXR1cm4gY2xhc3NpZmllckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDbGFzc2lmaWVyX0lzQWJzdHJhY3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgY2xhc3NpZmllckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE5hbWVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIG5hbWVkRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXROYW1lZEVsZW1lbnRfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBuYW1lZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBhY2thZ2VhYmxlRWxlbWVudCgpIHsKLQkJcmV0dXJuIHBhY2thZ2VhYmxlRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBwYWNrYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudCgpIHsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIG1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9LaW5kKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfT3JkZXJpbmdHdWlkZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb25zdHJhaW50KCkgewotCQlyZXR1cm4gY29uc3RyYWludEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25zdHJhaW50X0JvZHkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgY29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudFByb3BlcnR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eV9WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEtpbmQoKSB7Ci0JCXJldHVybiBraW5kRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEtpbmRfQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkga2luZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBjb250ZW50RWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfVGVybWRlZmluaXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlc2NyaWJhYmxlRWxlbWVudCgpIHsKLQkJcmV0dXJuIGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29udGVudERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gY29udGVudERlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgY29udGVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fTG9uZ1ByZXNlbnRhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgY29udGVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZWN0aW9uKCkgewotCQlyZXR1cm4gc2VjdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHNlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1NlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdGlvbl9TdWJTZWN0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdGlvbl9QcmVkZWNlc3NvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlKCkgewotCQlyZXR1cm4gcm9sZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlX01vZGlmaWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHdvcmtQcm9kdWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHdvcmtQcm9kdWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRGdWxmaWxsYWJsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiBmdWxmaWxsYWJsZUVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RnVsZmlsbGFibGVFbGVtZW50X0Z1bGZpbGxzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGZ1bGZpbGxhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFzaygpIHsKLQkJcmV0dXJuIHRhc2tFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19QZXJmb3JtZWRCeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19PdXRwdXQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tfT3B0aW9uYWxJbnB1dCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19TdGVwcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19Ub29sTWVudG9ycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya0RlZmluaXRpb24oKSB7Ci0JCXJldHVybiB3b3JrRGVmaW5pdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya0RlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrRGVmaW5pdGlvbl9Qb3N0Y29uZGl0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHdvcmtEZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTdGVwKCkgewotCQlyZXR1cm4gc3RlcEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEd1aWRhbmNlKCkgewotCQlyZXR1cm4gZ3VpZGFuY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcnRpZmFjdCgpIHsKLQkJcmV0dXJuIGFydGlmYWN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFydGlmYWN0X0NvbnRhaW5lckFydGlmYWN0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGFydGlmYWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGFydGlmYWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZWxpdmVyYWJsZSgpIHsKLQkJcmV0dXJuIGRlbGl2ZXJhYmxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkZWxpdmVyYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0T3V0Y29tZSgpIHsKLQkJcmV0dXJuIG91dGNvbWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RQYWNrYWdlKCkgewotCQlyZXR1cm4gbWV0aG9kUGFja2FnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZFBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnRlbnRQYWNrYWdlKCkgewotCQlyZXR1cm4gY29udGVudFBhY2thZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnRQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fTm90YXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0ltcGFjdE9mTm90SGF2aW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiByb2xlRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSByb2xlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgKLQkJCQkwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fQXNzaWdubWVudEFwcHJvYWNoZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcm9sZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoCi0JCQkJMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHJvbGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KAotCQkJCTIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFza0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gdGFza0Rlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdGlvbl9QdXJwb3NlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHRhc2tEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KAotCQkJCTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgdGFza0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoCi0JCQkJMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByYWN0aWNlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWN0aXZpdHkoKSB7Ci0JCXJldHVybiBhY3Rpdml0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFjdGl2aXR5X1JvYWRtYXBzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpIHsKLQkJcmV0dXJuIHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzUmVwZWF0YWJsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QnJlYWtkb3duRWxlbWVudCgpIHsKLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfUGxhbm5pbmdEYXRhKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1N1cGVyQWN0aXZpdGllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X0V4YW1wbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9HdWlkZWxpbmVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMTIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfVGVtcGxhdGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9SZXBvcnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1Rvb2xtZW50b3IoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDE3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1pbGVzdG9uZSgpIHsKLQkJcmV0dXJuIG1pbGVzdG9uZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNaWxlc3RvbmVfUmVxdWlyZWRSZXN1bHRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1pbGVzdG9uZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SXRlcmF0aW9uKCkgewotCQlyZXR1cm4gaXRlcmF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UGhhc2UoKSB7Ci0JCXJldHVybiBwaGFzZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRlYW1Qcm9maWxlKCkgewotCQlyZXR1cm4gdGVhbVByb2ZpbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRlYW1Qcm9maWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGVhbVByb2ZpbGVfU3VwZXJUZWFtKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRlYW1Qcm9maWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0ZWFtUHJvZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiByb2xlRGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJvbGVEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZURlc2NyaXB0b3JfTW9kaWZpZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcm9sZURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSByb2xlRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya09yZGVyKCkgewotCQlyZXR1cm4gd29ya09yZGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtPcmRlcl9MaW5rVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB3b3JrT3JkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrT3JkZXJfUHJlZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB3b3JrT3JkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NFbGVtZW50KCkgewotCQlyZXR1cm4gcHJvY2Vzc0VsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQbGFubmluZ0RhdGEoKSB7Ci0JCXJldHVybiBwbGFubmluZ0RhdGFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfRmluaXNoRGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfUmFuaygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBkZXNjcmlwdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhc2tEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gdGFza0Rlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb21wb3NpdGVSb2xlKCkgewotCQlyZXR1cm4gY29tcG9zaXRlUm9sZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjb21wb3NpdGVSb2xlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdE1lbWJlckV4cGVydGlzZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb25jZXB0KCkgewotCQlyZXR1cm4gY29uY2VwdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENoZWNrbGlzdCgpIHsKLQkJcmV0dXJuIGNoZWNrbGlzdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEV4YW1wbGUoKSB7Ci0JCXJldHVybiBleGFtcGxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0R3VpZGVsaW5lKCkgewotCQlyZXR1cm4gZ3VpZGVsaW5lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVwb3J0KCkgewotCQlyZXR1cm4gcmVwb3J0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGVtcGxhdGUoKSB7Ci0JCXJldHVybiB0ZW1wbGF0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpIHsKLQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRvb2xNZW50b3IoKSB7Ci0JCXJldHVybiB0b29sTWVudG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V2hpdGVwYXBlcigpIHsKLQkJcmV0dXJuIHdoaXRlcGFwZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUZXJtRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHRlcm1EZWZpbml0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSB7Ci0JCXJldHVybiBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb19Jc1ByaW1hcnlFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYXBwbGljYWJsZU1ldGFDbGFzc0luZm9FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByYWN0aWNlKCkgewotCQlyZXR1cm4gcHJhY3RpY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByYWN0aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJhY3RpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJhY3RpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJldXNhYmxlQXNzZXQoKSB7Ci0JCXJldHVybiByZXVzYWJsZUFzc2V0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGlzY2lwbGluZSgpIHsKLQkJcmV0dXJuIGRpc2NpcGxpbmVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZV9UYXNrcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaXNjaXBsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZV9TdWJkaXNjaXBsaW5lKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpc2NpcGxpbmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaXNjaXBsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb250ZW50Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBjb250ZW50Q2F0ZWdvcnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlU2V0KCkgewotCQlyZXR1cm4gcm9sZVNldEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlU2V0X1JvbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJvbGVTZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERvbWFpbigpIHsKLQkJcmV0dXJuIGRvbWFpbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb21haW5fV29ya1Byb2R1Y3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRvbWFpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvbWFpbl9TdWJkb21haW5zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRvbWFpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3RUeXBlKCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3RUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3RUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoCi0JCQkJMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREaXNjaXBsaW5lR3JvdXBpbmcoKSB7Ci0JCXJldHVybiBkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VG9vbCgpIHsKLQkJcmV0dXJuIHRvb2xFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VG9vbF9Ub29sTWVudG9ycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0b29sRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlU2V0R3JvdXBpbmcoKSB7Ci0JCXJldHVybiByb2xlU2V0R3JvdXBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJvbGVTZXRHcm91cGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KAotCQkJCTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q3VzdG9tQ2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBjdXN0b21DYXRlZ29yeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGN1c3RvbUNhdGVnb3J5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcmllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjdXN0b21DYXRlZ29yeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVsaXZlcnlQcm9jZXNzKCkgewotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGVsaXZlcnlQcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoCi0JCQkJMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWxzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KAotCQkJCTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHByb2Nlc3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm5zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDYXBhYmlsaXR5UGF0dGVybigpIHsKLQkJcmV0dXJuIGNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSB7Ci0JCXJldHVybiBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlZE9uUHJvY2Vzc2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2FkbWFwKCkgewotCQlyZXR1cm4gcm9hZG1hcEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnQoKSB7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRfSW50ZXJmYWNlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcm9jZXNzQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NQYWNrYWdlKCkgewotCQlyZXR1cm4gcHJvY2Vzc1BhY2thZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc1BhY2thZ2VfRGlhZ3JhbXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJvY2Vzc1BhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9fcHJvY2Vzc0NvbXBvbmVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kUGx1Z2luKCkgewotCQlyZXR1cm4gbWV0aG9kUGx1Z2luRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RQbHVnaW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kUGx1Z2luRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZFBsdWdpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgdmFyaWFiaWxpdHlFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdmFyaWFiaWxpdHlFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RVbml0KCkgewotCQlyZXR1cm4gbWV0aG9kVW5pdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0F1dGhvcnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIG1ldGhvZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc0ZhbWlseSgpIHsKLQkJcmV0dXJuIHByb2Nlc3NGYW1pbHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0ZhbWlseV9EZWxpdmVyeVByb2Nlc3NlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcm9jZXNzRmFtaWx5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RMaWJyYXJ5KCkgewotCQlyZXR1cm4gbWV0aG9kTGlicmFyeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kTGlicmFyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZExpYnJhcnlfUHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZExpYnJhcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBvaW50KCkgewotCQlyZXR1cm4gcG9pbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9pbnRfWCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwb2ludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBvaW50X1koKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcG9pbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEdyYXBoRWxlbWVudCgpIHsKLQkJcmV0dXJuIGdyYXBoRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfUG9zaXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ3JhcGhFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0R3JhcGhFbGVtZW50X0NvbnRhaW5lZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBncmFwaEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfTGluaygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBncmFwaEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfQW5jaG9yYWdlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGdyYXBoRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoRWxlbWVudF9TZW1hbnRpY01vZGVsKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGdyYXBoRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGlhZ3JhbUVsZW1lbnQoKSB7Ci0JCXJldHVybiBkaWFncmFtRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaWFncmFtRWxlbWVudF9Jc1Zpc2libGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGlhZ3JhbUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtRWxlbWVudF9Db250YWluZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlhZ3JhbUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtRWxlbWVudF9SZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlhZ3JhbUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtRWxlbWVudF9Qcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaWFncmFtRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGlhZ3JhbUxpbmsoKSB7Ci0JCXJldHVybiBkaWFncmFtTGlua0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaWFncmFtTGlua19ab29tKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRpYWdyYW1MaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUxpbmtfVmlld3BvcnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlhZ3JhbUxpbmtFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtTGlua19HcmFwaEVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlhZ3JhbUxpbmtFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtTGlua19EaWFncmFtKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpYWdyYW1MaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHcmFwaENvbm5lY3RvcigpIHsKLQkJcmV0dXJuIGdyYXBoQ29ubmVjdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBncmFwaENvbm5lY3RvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWRnZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBncmFwaENvbm5lY3RvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpIHsKLQkJcmV0dXJuIHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9QcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgc2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlbWFudGljTW9kZWxCcmlkZ2VfR3JhcGhFbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZW1hbnRpY01vZGVsQnJpZGdlX0RpYWdyYW0oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgc2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGltZW5zaW9uKCkgewotCQlyZXR1cm4gZGltZW5zaW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERpbWVuc2lvbl9XaWR0aCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkaW1lbnNpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaW1lbnNpb25fSGVpZ2h0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRpbWVuc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlZmVyZW5jZV9Jc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSByZWZlcmVuY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2VfUmVmZXJlbmNlZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSByZWZlcmVuY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb3BlcnR5KCkgewotCQlyZXR1cm4gcHJvcGVydHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfS2V5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEdyYXBoRWRnZSgpIHsKLQkJcmV0dXJuIGdyYXBoRWRnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaEVkZ2VfQW5jaG9yKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGdyYXBoRWRnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoRWRnZV9XYXlwb2ludHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ3JhcGhFZGdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREaWFncmFtKCkgewotCQlyZXR1cm4gZGlhZ3JhbUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaWFncmFtX1pvb20oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGlhZ3JhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERpYWdyYW1fVmlld3BvaW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpYWdyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtX0RpYWdyYW1MaW5rKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpYWdyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtX05hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaWFncmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHcmFwaE5vZGUoKSB7Ci0JCXJldHVybiBncmFwaE5vZGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0R3JhcGhOb2RlX1NpemUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ3JhcGhOb2RlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpIHsKLQkJcmV0dXJuIHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X1R5cGVJbmZvKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50RUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCkgewotCQlyZXR1cm4gdW1hU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlX0VsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdW1hU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKSB7Ci0JCXJldHVybiBjb3JlU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb3JlU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRMZWFmRWxlbWVudCgpIHsKLQkJcmV0dXJuIGxlYWZFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGV4dEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0ZXh0RWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUZXh0RWxlbWVudF9UZXh0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHRleHRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGltYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEltYWdlX1VyaSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBpbWFnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEltYWdlX01pbWVUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGltYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHcmFwaGljUHJpbWl0aXZlKCkgewotCQlyZXR1cm4gZ3JhcGhpY1ByaW1pdGl2ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBvbHlsaW5lKCkgewotCQlyZXR1cm4gcG9seWxpbmVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9seWxpbmVfQ2xvc2VkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHBvbHlsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UG9seWxpbmVfV2F5cG9pbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHBvbHlsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFbGxpcHNlKCkgewotCQlyZXR1cm4gZWxsaXBzZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbGxpcHNlX1JhZGl1c1goKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZWxsaXBzZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVsbGlwc2VfUmFkaXVzWSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBlbGxpcHNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWxsaXBzZV9Sb3RhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBlbGxpcHNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWxsaXBzZV9TdGFydEFuZ2xlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGVsbGlwc2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbGxpcHNlX0VuZEFuZ2xlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGVsbGlwc2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbGxpcHNlX0NlbnRlcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBlbGxpcHNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFdvcmtPcmRlclR5cGUoKSB7Ci0JCXJldHVybiB3b3JrT3JkZXJUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RGF0ZSgpIHsKLQkJcmV0dXJuIGRhdGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRVcmkoKSB7Ci0JCXJldHVybiB1cmlFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRTdHJpbmcoKSB7Ci0JCXJldHVybiBzdHJpbmdFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRCb29sZWFuKCkgewotCQlyZXR1cm4gYm9vbGVhbkVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFNldCgpIHsKLQkJcmV0dXJuIHNldEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFNlcXVlbmNlKCkgewotCQlyZXR1cm4gc2VxdWVuY2VFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRJbnRlZ2VyKCkgewotCQlyZXR1cm4gaW50ZWdlckVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldERvdWJsZSgpIHsKLQkJcmV0dXJuIGRvdWJsZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hRmFjdG9yeSBnZXRVbWFGYWN0b3J5KCkgewotCQlyZXR1cm4gKFVtYUZhY3RvcnkpIGdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKQotCQkJcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQljbGFzc2lmaWVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKENMQVNTSUZJRVIpOwotCQljcmVhdGVFQXR0cmlidXRlKGNsYXNzaWZpZXJFQ2xhc3MsIENMQVNTSUZJRVJfX0lTX0FCU1RSQUNUKTsKLQotCQl0eXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRZUEUpOwotCi0JCXBhY2thZ2VhYmxlRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQQUNLQUdFQUJMRV9FTEVNRU5UKTsKLQotCQluYW1lZEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTkFNRURfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobmFtZWRFbGVtZW50RUNsYXNzLCBOQU1FRF9FTEVNRU5UX19OQU1FKTsKLQotCQllbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEVMRU1FTlQpOwotCi0JCXBhY2thZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEFDS0FHRSk7Ci0KLQkJbmFtZXNwYWNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKE5BTUVTUEFDRSk7Ci0KLQkJY29uc3RyYWludEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05TVFJBSU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb25zdHJhaW50RUNsYXNzLCBDT05TVFJBSU5UX19CT0RZKTsKLQotCQltZXRob2RFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fR1VJRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kRWxlbWVudEVDbGFzcywKLQkJCQlNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19LSU5EKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFKTsKLQotCQltZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzcywKLQkJCQlNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUUpOwotCi0JCWtpbmRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoS0lORCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoa2luZEVDbGFzcywgS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8pOwotCi0JCWNvbnRlbnRFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlRFTlRfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudEVsZW1lbnRFQ2xhc3MsCi0JCQkJQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudEVsZW1lbnRFQ2xhc3MsCi0JCQkJQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fQVNTRVRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19URVJNREVGSU5JVElPTik7Ci0KLQkJZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERFU0NSSUJBQkxFX0VMRU1FTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcywKLQkJCQlERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcywKLQkJCQlERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcywKLQkJCQlERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTik7Ci0KLQkJY29udGVudERlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlRFTlRfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUNPTlRFTlRfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUpOwotCi0JCW1ldGhvZFVuaXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX1VOSVQpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19BVVRIT1JTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RVbml0RUNsYXNzLCBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19WRVJTSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RVbml0RUNsYXNzLCBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVCk7Ci0KLQkJc3VwcG9ydGluZ01hdGVyaWFsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNVUFBPUlRJTkdfTUFURVJJQUwpOwotCi0JCWd1aWRhbmNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdVSURBTkNFKTsKLQotCQlzZWN0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFQ1RJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3Rpb25FQ2xhc3MsIFNFQ1RJT05fX1NFQ1RJT05fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdGlvbkVDbGFzcywgU0VDVElPTl9fU0VDVElPTl9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdGlvbkVDbGFzcywgU0VDVElPTl9fU1VCX1NFQ1RJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZWN0aW9uRUNsYXNzLCBTRUNUSU9OX19QUkVERUNFU1NPUik7Ci0KLQkJdmFyaWFiaWxpdHlFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFZBUklBQklMSVRZX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHZhcmlhYmlsaXR5RWxlbWVudEVDbGFzcywKLQkJCQlWQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh2YXJpYWJpbGl0eUVsZW1lbnRFQ2xhc3MsCi0JCQkJVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCk7Ci0KLQkJY29uY2VwdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05DRVBUKTsKLQotCQljaGVja2xpc3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0hFQ0tMSVNUKTsKLQotCQlndWlkZWxpbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR1VJREVMSU5FKTsKLQotCQlleGFtcGxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVYQU1QTEUpOwotCi0JCXJldXNhYmxlQXNzZXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVVU0FCTEVfQVNTRVQpOwotCi0JCXRlcm1EZWZpbml0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRFUk1fREVGSU5JVElPTik7Ci0KLQkJYXBwbGljYWJsZU1ldGFDbGFzc0luZm9FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8pOwotCQljcmVhdGVFQXR0cmlidXRlKGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvRUNsYXNzLAotCQkJCUFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTik7Ci0KLQkJYXJ0aWZhY3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVJUSUZBQ1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFydGlmYWN0RUNsYXNzLCBBUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcnRpZmFjdEVDbGFzcywgQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFMpOwotCi0JCXdvcmtQcm9kdWN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfUFJPRFVDVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya1Byb2R1Y3RFQ2xhc3MsIFdPUktfUFJPRFVDVF9fUkVQT1JUUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya1Byb2R1Y3RFQ2xhc3MsIFdPUktfUFJPRFVDVF9fVEVNUExBVEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrUHJvZHVjdEVDbGFzcywgV09SS19QUk9EVUNUX19UT09MX01FTlRPUlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtQcm9kdWN0RUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0KLQkJZnVsZmlsbGFibGVFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEZVTEZJTExBQkxFX0VMRU1FTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGZ1bGZpbGxhYmxlRWxlbWVudEVDbGFzcywKLQkJCQlGVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUyk7Ci0KLQkJcmVwb3J0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFUE9SVCk7Ci0KLQkJdGVtcGxhdGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEVNUExBVEUpOwotCi0JCXRvb2xNZW50b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVE9PTF9NRU5UT1IpOwotCi0JCWVzdGltYXRpb25Db25zaWRlcmF0aW9uc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQotCQlkZWxpdmVyYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERUxJVkVSQUJMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGVsaXZlcmFibGVFQ2xhc3MsCi0JCQkJREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1RTKTsKLQotCQlvdXRjb21lRUNsYXNzID0gY3JlYXRlRUNsYXNzKE9VVENPTUUpOwotCi0JCXN0ZXBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU1RFUCk7Ci0KLQkJd29ya0RlZmluaXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19ERUZJTklUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrRGVmaW5pdGlvbkVDbGFzcywgV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtEZWZpbml0aW9uRUNsYXNzLCBXT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04pOwotCi0JCXdoaXRlcGFwZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV0hJVEVQQVBFUik7Ci0KLQkJdGFza0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQVNLKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRUNsYXNzLCBUQVNLX19QRVJGT1JNRURfQlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tFQ2xhc3MsIFRBU0tfX01BTkRBVE9SWV9JTlBVVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0VDbGFzcywgVEFTS19fT1VUUFVUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRUNsYXNzLCBUQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRUNsYXNzLCBUQVNLX19PUFRJT05BTF9JTlBVVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0VDbGFzcywgVEFTS19fU1RFUFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tFQ2xhc3MsIFRBU0tfX1RPT0xfTUVOVE9SUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0VDbGFzcywgVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0KLQkJcm9sZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyb2xlRUNsYXNzLCBST0xFX19NT0RJRklFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZUVDbGFzcywgUk9MRV9fUkVTUE9OU0lCTEVfRk9SKTsKLQotCQlhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFSVElGQUNUX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlBUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT04pOwotCi0JCXdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcpOwotCi0JCWRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVMSVZFUkFCTEVfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0UpOwotCi0JCXJvbGVEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRGVzY3JpcHRpb25FQ2xhc3MsIFJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZURlc2NyaXB0aW9uRUNsYXNzLCBST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUyk7Ci0KLQkJdGFza0Rlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBU0tfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdGlvbkVDbGFzcywgVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0aW9uRUNsYXNzLCBUQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMpOwotCi0JCWd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR1VJREFOQ0VfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlRTKTsKLQotCQlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBSQUNUSUNFX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk8pOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU0pOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQpOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlQUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTik7Ci0KLQkJcm9sZVNldEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX1NFVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZVNldEVDbGFzcywgUk9MRV9TRVRfX1JPTEVTKTsKLQotCQljb250ZW50Q2F0ZWdvcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OVEVOVF9DQVRFR09SWSk7Ci0KLQkJZG9tYWluRUNsYXNzID0gY3JlYXRlRUNsYXNzKERPTUFJTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZG9tYWluRUNsYXNzLCBET01BSU5fX1dPUktfUFJPRFVDVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRvbWFpbkVDbGFzcywgRE9NQUlOX19TVUJET01BSU5TKTsKLQotCQl3b3JrUHJvZHVjdFR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtQcm9kdWN0VHlwZUVDbGFzcywKLQkJCQlXT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUUyk7Ci0KLQkJZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKERJU0NJUExJTkVfR1JPVVBJTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcywKLQkJCQlESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUyk7Ci0KLQkJZGlzY2lwbGluZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhESVNDSVBMSU5FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkaXNjaXBsaW5lRUNsYXNzLCBESVNDSVBMSU5FX19UQVNLUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlzY2lwbGluZUVDbGFzcywgRElTQ0lQTElORV9fU1VCRElTQ0lQTElORSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlzY2lwbGluZUVDbGFzcywgRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XUyk7Ci0KLQkJYWN0aXZpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUNUSVZJVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX1JPQURNQVBTKTsKLQotCQl3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX0JSRUFLRE9XTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4pOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCVdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1IpOwotCi0JCWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQlJFQUtET1dOX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVgpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsCi0JCQkJQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fVEVNUExBVEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fUkVQT1JUUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlCUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fVE9PTE1FTlRPUik7Ci0KLQkJcHJvY2Vzc0VsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19FTEVNRU5UKTsKLQotCQlwbGFubmluZ0RhdGFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUExBTk5JTkdfREFUQSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGxhbm5pbmdEYXRhRUNsYXNzLCBQTEFOTklOR19EQVRBX19TVEFSVF9EQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwbGFubmluZ0RhdGFFQ2xhc3MsIFBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwbGFubmluZ0RhdGFFQ2xhc3MsIFBMQU5OSU5HX0RBVEFfX1JBTkspOwotCi0JCXdvcmtPcmRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX09SREVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrT3JkZXJFQ2xhc3MsIFdPUktfT1JERVJfX0xJTktfVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya09yZGVyRUNsYXNzLCBXT1JLX09SREVSX19QUkVEKTsKLQotCQlyb2FkbWFwRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPQURNQVApOwotCi0JCXRvb2xFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVE9PTCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodG9vbEVDbGFzcywgVE9PTF9fVE9PTF9NRU5UT1JTKTsKLQotCQlyb2xlU2V0R3JvdXBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9TRVRfR1JPVVBJTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJvbGVTZXRHcm91cGluZ0VDbGFzcywgUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUyk7Ci0KLQkJY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ1VTVE9NX0NBVEVHT1JZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjdXN0b21DYXRlZ29yeUVDbGFzcywKLQkJCQlDVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjdXN0b21DYXRlZ29yeUVDbGFzcywgQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUklFUyk7Ci0KLQkJbWV0aG9kUGFja2FnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfUEFDS0FHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGFja2FnZUVDbGFzcywgTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kUGFja2FnZUVDbGFzcywgTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kUGFja2FnZUVDbGFzcywgTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTKTsKLQotCQljb250ZW50UGFja2FnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05URU5UX1BBQ0tBR0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRlbnRQYWNrYWdlRUNsYXNzLAotCQkJCUNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUyk7Ci0KLQkJbWlsZXN0b25lRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1JTEVTVE9ORSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWlsZXN0b25lRUNsYXNzLCBNSUxFU1RPTkVfX1JFUVVJUkVEX1JFU1VMVFMpOwotCi0JCXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsCi0JCQkJV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsCi0JCQkJV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTKTsKLQotCQlkZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFU0NSSVBUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlc2NyaXB0b3JFQ2xhc3MsCi0JCQkJREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFKTsKLQotCQlpdGVyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVRFUkFUSU9OKTsKLQotCQlwaGFzZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQSEFTRSk7Ci0KLQkJdGVhbVByb2ZpbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEVBTV9QUk9GSUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0ZWFtUHJvZmlsZUVDbGFzcywgVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0ZWFtUHJvZmlsZUVDbGFzcywgVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0ZWFtUHJvZmlsZUVDbGFzcywgVEVBTV9QUk9GSUxFX19TVUJfVEVBTSk7Ci0KLQkJcm9sZURlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9ERVNDUklQVE9SKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyb2xlRGVzY3JpcHRvckVDbGFzcywgUk9MRV9ERVNDUklQVE9SX19ST0xFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyb2xlRGVzY3JpcHRvckVDbGFzcywgUk9MRV9ERVNDUklQVE9SX19NT0RJRklFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZURlc2NyaXB0b3JFQ2xhc3MsIFJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SKTsKLQotCQl0YXNrRGVzY3JpcHRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQVNLX0RFU0NSSVBUT1IpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX1RBU0spOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLAotCQkJCVRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19PVVRQVVQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLAotCQkJCVRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fU0VMRUNURURfU1RFUFMpOwotCi0JCWNvbXBvc2l0ZVJvbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09NUE9TSVRFX1JPTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbXBvc2l0ZVJvbGVFQ2xhc3MsIENPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTKTsKLQotCQlkZWxpdmVyeVByb2Nlc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVMSVZFUllfUFJPQ0VTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGVsaXZlcnlQcm9jZXNzRUNsYXNzLAotCQkJCURFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcywKLQkJCQlERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFMpOwotCi0JCXByb2Nlc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0VDbGFzcywgUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NFQ2xhc3MsIFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0VDbGFzcywgUFJPQ0VTU19fVkFMSURfQ09OVEVYVCk7Ci0KLQkJY2FwYWJpbGl0eVBhdHRlcm5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0FQQUJJTElUWV9QQVRURVJOKTsKLQotCQltZXRob2RDb25maWd1cmF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9DT05GSUdVUkFUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLAotCQkJCU1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywKLQkJCQlNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLAotCQkJCU1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVdTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLAotCQkJCU1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVcpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsCi0JCQkJTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsCi0JCQkJTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsCi0JCQkJTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZKTsKLQotCQltZXRob2RQbHVnaW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX1BMVUdJTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGx1Z2luRUNsYXNzLCBNRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZFBsdWdpbkVDbGFzcywgTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RQbHVnaW5FQ2xhc3MsIE1FVEhPRF9QTFVHSU5fX0JBU0VTKTsKLQotCQlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcywKLQkJCQlQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFRF9PTl9QUk9DRVNTRVMpOwotCi0JCXByYWN0aWNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBSQUNUSUNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcmFjdGljZUVDbGFzcywgUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByYWN0aWNlRUNsYXNzLCBQUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcmFjdGljZUVDbGFzcywgUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVMpOwotCi0JCWJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSk7Ci0KLQkJYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQ1RJVklUWV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlBQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlBQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRik7Ci0KLQkJZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUKTsKLQotCQlwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBQUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTKTsKLQotCQlkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVTQ1JJUFRPUl9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT04pOwotCi0JCXByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1IpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yRUNsYXNzLAotCQkJCVBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BST0NFU1NfQ09NUE9ORU5UKTsKLQotCQlwcm9jZXNzQ29tcG9uZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfQ09NUE9ORU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzQ29tcG9uZW50RUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0NvbXBvbmVudEVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MpOwotCi0JCXByb2Nlc3NQYWNrYWdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfUEFDS0FHRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc1BhY2thZ2VFQ2xhc3MsCi0JCQkJUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzUGFja2FnZUVDbGFzcywgUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUyk7Ci0KLQkJZGlhZ3JhbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhESUFHUkFNKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkaWFncmFtRUNsYXNzLCBESUFHUkFNX19ESUFHUkFNX0xJTkspOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpYWdyYW1FQ2xhc3MsIERJQUdSQU1fX05BTUVTUEFDRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlhZ3JhbUVDbGFzcywgRElBR1JBTV9fWk9PTSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlhZ3JhbUVDbGFzcywgRElBR1JBTV9fVklFV1BPSU5UKTsKLQotCQlncmFwaE5vZGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR1JBUEhfTk9ERSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhOb2RlRUNsYXNzLCBHUkFQSF9OT0RFX19TSVpFKTsKLQotCQlncmFwaEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR1JBUEhfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhFbGVtZW50RUNsYXNzLCBHUkFQSF9FTEVNRU5UX19DT05UQUlORUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGdyYXBoRWxlbWVudEVDbGFzcywgR1JBUEhfRUxFTUVOVF9fUE9TSVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGdyYXBoRWxlbWVudEVDbGFzcywgR1JBUEhfRUxFTUVOVF9fTElOSyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhFbGVtZW50RUNsYXNzLCBHUkFQSF9FTEVNRU5UX19BTkNIT1JBR0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGdyYXBoRWxlbWVudEVDbGFzcywgR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwpOwotCi0JCWRpYWdyYW1FbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERJQUdSQU1fRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlhZ3JhbUVsZW1lbnRFQ2xhc3MsIERJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlhZ3JhbUVsZW1lbnRFQ2xhc3MsIERJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkaWFncmFtRWxlbWVudEVDbGFzcywgRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpYWdyYW1FbGVtZW50RUNsYXNzLCBESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZKTsKLQotCQlyZWZlcmVuY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVGRVJFTkNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZWZlcmVuY2VFQ2xhc3MsCi0JCQkJUkVGRVJFTkNFX19JU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZWZlcmVuY2VFQ2xhc3MsIFJFRkVSRU5DRV9fUkVGRVJFTkNFRCk7Ci0KLQkJcHJvcGVydHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPUEVSVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5RUNsYXNzLCBQUk9QRVJUWV9fS0VZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9wZXJ0eUVDbGFzcywgUFJPUEVSVFlfX1ZBTFVFKTsKLQotCQlwb2ludEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT0lOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9pbnRFQ2xhc3MsIFBPSU5UX19YKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb2ludEVDbGFzcywgUE9JTlRfX1kpOwotCi0JCWRpYWdyYW1MaW5rRUNsYXNzID0gY3JlYXRlRUNsYXNzKERJQUdSQU1fTElOSyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlhZ3JhbUxpbmtFQ2xhc3MsIERJQUdSQU1fTElOS19fWk9PTSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlhZ3JhbUxpbmtFQ2xhc3MsIERJQUdSQU1fTElOS19fVklFV1BPUlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpYWdyYW1MaW5rRUNsYXNzLCBESUFHUkFNX0xJTktfX0RJQUdSQU0pOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpYWdyYW1MaW5rRUNsYXNzLCBESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQpOwotCi0JCWdyYXBoQ29ubmVjdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdSQVBIX0NPTk5FQ1RPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhDb25uZWN0b3JFQ2xhc3MsIEdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhDb25uZWN0b3JFQ2xhc3MsIEdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVCk7Ci0KLQkJZ3JhcGhFZGdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdSQVBIX0VER0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGdyYXBoRWRnZUVDbGFzcywgR1JBUEhfRURHRV9fV0FZUE9JTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShncmFwaEVkZ2VFQ2xhc3MsIEdSQVBIX0VER0VfX0FOQ0hPUik7Ci0KLQkJc2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRU1BTlRJQ19NT0RFTF9CUklER0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MsCi0JCQkJU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MsCi0JCQkJU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzLAotCQkJCVNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCk7Ci0KLQkJZGltZW5zaW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKERJTUVOU0lPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGltZW5zaW9uRUNsYXNzLCBESU1FTlNJT05fX1dJRFRIKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaW1lbnNpb25FQ2xhc3MsIERJTUVOU0lPTl9fSEVJR0hUKTsKLQotCQlwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcywKLQkJCQlQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcywKLQkJCQlQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTyk7Ci0KLQkJc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50RUNsYXNzLAotCQkJCVNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19UWVBFX0lORk8pOwotCi0JCXVtYVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVU1BX1NFTUFOVElDX01PREVMX0JSSURHRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodW1hU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcywKLQkJCQlVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UKTsKLQotCQljb3JlU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29yZVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MsCi0JCQkJQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQpOwotCi0JCWxlYWZFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKExFQUZfRUxFTUVOVCk7Ci0KLQkJdGV4dEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEVYVF9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0ZXh0RWxlbWVudEVDbGFzcywgVEVYVF9FTEVNRU5UX19URVhUKTsKLQotCQlpbWFnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJTUFHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaW1hZ2VFQ2xhc3MsIElNQUdFX19VUkkpOwotCQljcmVhdGVFQXR0cmlidXRlKGltYWdlRUNsYXNzLCBJTUFHRV9fTUlNRV9UWVBFKTsKLQotCQlncmFwaGljUHJpbWl0aXZlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdSQVBISUNfUFJJTUlUSVZFKTsKLQotCQlwb2x5bGluZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT0xZTElORSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9seWxpbmVFQ2xhc3MsIFBPTFlMSU5FX19DTE9TRUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHBvbHlsaW5lRUNsYXNzLCBQT0xZTElORV9fV0FZUE9JTlRTKTsKLQotCQllbGxpcHNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVMTElQU0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVsbGlwc2VFQ2xhc3MsIEVMTElQU0VfX0NFTlRFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWxsaXBzZUVDbGFzcywgRUxMSVBTRV9fUkFESVVTX1gpOwotCQljcmVhdGVFQXR0cmlidXRlKGVsbGlwc2VFQ2xhc3MsIEVMTElQU0VfX1JBRElVU19ZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbGxpcHNlRUNsYXNzLCBFTExJUFNFX19ST1RBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWxsaXBzZUVDbGFzcywgRUxMSVBTRV9fU1RBUlRfQU5HTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVsbGlwc2VFQ2xhc3MsIEVMTElQU0VfX0VORF9BTkdMRSk7Ci0KLQkJcHJvY2Vzc0ZhbWlseUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX0ZBTUlMWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0ZhbWlseUVDbGFzcywKLQkJCQlQUk9DRVNTX0ZBTUlMWV9fREVMSVZFUllfUFJPQ0VTU0VTKTsKLQotCQltZXRob2RMaWJyYXJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9MSUJSQVJZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RMaWJyYXJ5RUNsYXNzLCBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZExpYnJhcnlFQ2xhc3MsCi0JCQkJTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlMpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQl2YXJpYWJpbGl0eVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFZBUklBQklMSVRZX1RZUEUpOwotCQl3b3JrT3JkZXJUeXBlRUVudW0gPSBjcmVhdGVFRW51bShXT1JLX09SREVSX1RZUEUpOwotCi0JCS8vIENyZWF0ZSBkYXRhIHR5cGVzCi0JCXN0cmluZ0VEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShTVFJJTkcpOwotCQlib29sZWFuRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEJPT0xFQU4pOwotCQlkYXRlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKERBVEUpOwotCQl1cmlFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoVVJJKTsKLQkJc2V0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFNFVCk7Ci0JCXNlcXVlbmNlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFNFUVVFTkNFKTsKLQkJaW50ZWdlckVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShJTlRFR0VSKTsKLQkJZG91YmxlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKERPVUJMRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkKLQkJCXJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycwotCi0JCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJY2xhc3NpZmllckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFR5cGUoKSk7Ci0JCXR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQYWNrYWdlYWJsZUVsZW1lbnQoKSk7Ci0JCXBhY2thZ2VhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5hbWVkRWxlbWVudCgpKTsKLQkJbmFtZWRFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RWxlbWVudCgpKTsKLQkJcGFja2FnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5hbWVzcGFjZSgpKTsKLQkJcGFja2FnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBhY2thZ2VhYmxlRWxlbWVudCgpKTsKLQkJbmFtZXNwYWNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TmFtZWRFbGVtZW50KCkpOwotCQljb25zdHJhaW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBhY2thZ2VhYmxlRWxlbWVudCgpKTsKLQkJbWV0aG9kRWxlbWVudFByb3BlcnR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0UGFja2FnZWFibGVFbGVtZW50KCkpOwotCQlraW5kRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkpOwotCQljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFZhcmlhYmlsaXR5RWxlbWVudCgpKTsKLQkJZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q2xhc3NpZmllcigpKTsKLQkJY29udGVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kVW5pdCgpKTsKLQkJbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCXN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlndWlkYW5jZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQlzZWN0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCkpOwotCQl2YXJpYWJpbGl0eUVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQljb25jZXB0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWNoZWNrbGlzdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlndWlkZWxpbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJZXhhbXBsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlyZXVzYWJsZUFzc2V0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXRlcm1EZWZpbml0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvRUNsYXNzLmdldEVTdXBlclR5cGVzKCkKLQkJCQkuYWRkKHRoaXMuZ2V0Q2xhc3NpZmllcigpKTsKLQkJYXJ0aWZhY3RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRGdWxmaWxsYWJsZUVsZW1lbnQoKSk7Ci0JCWZ1bGZpbGxhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldERlc2NyaWJhYmxlRWxlbWVudCgpKTsKLQkJcmVwb3J0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXRlbXBsYXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXRvb2xNZW50b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWRlbGl2ZXJhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCW91dGNvbWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJc3RlcEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNlY3Rpb24oKSk7Ci0JCXN0ZXBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrRGVmaW5pdGlvbigpKTsKLQkJd29ya0RlZmluaXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQl3aGl0ZXBhcGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29uY2VwdCgpKTsKLQkJdGFza0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQl0YXNrRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya0RlZmluaXRpb24oKSk7Ci0JCXJvbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJcm9sZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEZ1bGZpbGxhYmxlRWxlbWVudCgpKTsKLQkJYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSk7Ci0JCXdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCWRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkpOwotCQlyb2xlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKQotCQkJCS5hZGQodGhpcy5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCXRhc2tEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpCi0JCQkJLmFkZCh0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJcm9sZVNldEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJY29udGVudENhdGVnb3J5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCWRvbWFpbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJd29ya1Byb2R1Y3RUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQlkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKQotCQkJCS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWRpc2NpcGxpbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWFjdGl2aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCWFjdGl2aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RnVsZmlsbGFibGVFbGVtZW50KCkpOwotCQlhY3Rpdml0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFZhcmlhYmlsaXR5RWxlbWVudCgpKTsKLQkJYWN0aXZpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrRGVmaW5pdGlvbigpKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRCcmVha2Rvd25FbGVtZW50KCkpOwotCQlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2Vzc0VsZW1lbnQoKSk7Ci0JCXByb2Nlc3NFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkpOwotCQlwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzRWxlbWVudCgpKTsKLQkJd29ya09yZGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2Vzc0VsZW1lbnQoKSk7Ci0JCXJvYWRtYXBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJdG9vbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJcm9sZVNldEdyb3VwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQljdXN0b21DYXRlZ29yeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJbWV0aG9kUGFja2FnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCW1ldGhvZFBhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQYWNrYWdlKCkpOwotCQljb250ZW50UGFja2FnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZFBhY2thZ2UoKSk7Ci0JCW1pbGVzdG9uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtCcmVha2Rvd25FbGVtZW50KCkpOwotCQl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREZXNjcmlwdG9yKCkpOwotCQlkZXNjcmlwdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudCgpKTsKLQkJaXRlcmF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWN0aXZpdHkoKSk7Ci0JCXBoYXNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWN0aXZpdHkoKSk7Ci0JCXRlYW1Qcm9maWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudCgpKTsKLQkJcm9sZURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREZXNjcmlwdG9yKCkpOwotCQl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldFdvcmtCcmVha2Rvd25FbGVtZW50KCkpOwotCQl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERlc2NyaXB0b3IoKSk7Ci0JCWNvbXBvc2l0ZVJvbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRSb2xlRGVzY3JpcHRvcigpKTsKLQkJZGVsaXZlcnlQcm9jZXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2VzcygpKTsKLQkJcHJvY2Vzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFjdGl2aXR5KCkpOwotCQljYXBhYmlsaXR5UGF0dGVybkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3MoKSk7Ci0JCW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQltZXRob2RQbHVnaW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQltZXRob2RQbHVnaW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQYWNrYWdlKCkpOwotCQlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3MoKSk7Ci0JCXByYWN0aWNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpKTsKLQkJZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRQcm9jZXNzRGVzY3JpcHRpb24oKSk7Ci0JCXByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldEFjdGl2aXR5RGVzY3JpcHRpb24oKSk7Ci0JCWRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpKTsKLQkJcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXREZXNjcmlwdG9yKCkpOwotCQlwcm9jZXNzQ29tcG9uZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2Vzc1BhY2thZ2UoKSk7Ci0JCXByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQlwcm9jZXNzUGFja2FnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZFBhY2thZ2UoKSk7Ci0JCWRpYWdyYW1FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHcmFwaE5vZGUoKSk7Ci0JCWdyYXBoTm9kZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEdyYXBoRWxlbWVudCgpKTsKLQkJZ3JhcGhFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGlhZ3JhbUVsZW1lbnQoKSk7Ci0JCWRpYWdyYW1FbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJcmVmZXJlbmNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGlhZ3JhbUVsZW1lbnQoKSk7Ci0JCXByb3BlcnR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGlhZ3JhbUVsZW1lbnQoKSk7Ci0JCWRpYWdyYW1MaW5rRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGlhZ3JhbUVsZW1lbnQoKSk7Ci0JCWdyYXBoQ29ubmVjdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3JhcGhFbGVtZW50KCkpOwotCQlncmFwaEVkZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHcmFwaEVsZW1lbnQoKSk7Ci0JCXNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKQotCQkJCS5hZGQodGhpcy5nZXREaWFncmFtRWxlbWVudCgpKTsKLQkJcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCXNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpKTsKLQkJdW1hU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldFNlbWFudGljTW9kZWxCcmlkZ2UoKSk7Ci0JCWNvcmVTZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpKTsKLQkJbGVhZkVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREaWFncmFtRWxlbWVudCgpKTsKLQkJdGV4dEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRMZWFmRWxlbWVudCgpKTsKLQkJaW1hZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRMZWFmRWxlbWVudCgpKTsKLQkJZ3JhcGhpY1ByaW1pdGl2ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldExlYWZFbGVtZW50KCkpOwotCQlwb2x5bGluZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEdyYXBoaWNQcmltaXRpdmUoKSk7Ci0JCWVsbGlwc2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHcmFwaGljUHJpbWl0aXZlKCkpOwotCQlwcm9jZXNzRmFtaWx5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJbWV0aG9kTGlicmFyeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZFVuaXQoKSk7Ci0JCW1ldGhvZExpYnJhcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQYWNrYWdlKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoCi0JCQkJY2xhc3NpZmllckVDbGFzcywKLQkJCQlDbGFzc2lmaWVyLmNsYXNzLAotCQkJCSJDbGFzc2lmaWVyIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0Q2xhc3NpZmllcl9Jc0Fic3RyYWN0KCksCi0JCQkJdGhpcy5nZXRCb29sZWFuKCksCi0JCQkJImlzQWJzdHJhY3QiLCAiZmFsc2UiLCAxLCAxLCBDbGFzc2lmaWVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcyh0eXBlRUNsYXNzLCBUeXBlLmNsYXNzLAotCQkJCSJUeXBlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXBhY2thZ2VhYmxlRWxlbWVudEVDbGFzcywKLQkJCQlQYWNrYWdlYWJsZUVsZW1lbnQuY2xhc3MsCi0JCQkJIlBhY2thZ2VhYmxlRWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQluYW1lZEVsZW1lbnRFQ2xhc3MsCi0JCQkJTmFtZWRFbGVtZW50LmNsYXNzLAotCQkJCSJOYW1lZEVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJIm5hbWUiLCAiIiwgMCwgMSwgTmFtZWRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQllbGVtZW50RUNsYXNzLAotCQkJCUVsZW1lbnQuY2xhc3MsCi0JCQkJIkVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcGFja2FnZUVDbGFzcywKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UuY2xhc3MsCi0JCQkJIlBhY2thZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCW5hbWVzcGFjZUVDbGFzcywKLQkJCQlOYW1lc3BhY2UuY2xhc3MsCi0JCQkJIk5hbWVzcGFjZSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQljb25zdHJhaW50RUNsYXNzLAotCQkJCUNvbnN0cmFpbnQuY2xhc3MsCi0JCQkJIkNvbnN0cmFpbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0Q29uc3RyYWludF9Cb2R5KCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYm9keSIsICIiLCAwLCAxLCBDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQltZXRob2RFbGVtZW50RUNsYXNzLAotCQkJCU1ldGhvZEVsZW1lbnQuY2xhc3MsCi0JCQkJIk1ldGhvZEVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RFbGVtZW50X0d1aWQoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJndWlkIiwgIiIsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwcmVzZW50YXRpb25OYW1lIiwgIiIsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYnJpZWZEZXNjcmlwdGlvbiIsICIiLCAwLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZEVsZW1lbnRfT3duZWRSdWxlcygpLAotCQkJCXRoaXMuZ2V0Q29uc3RyYWludCgpLAotCQkJCW51bGwsCi0JCQkJIm93bmVkUnVsZXMiLCBudWxsLCAwLCAtMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLAotCQkJCXRoaXMuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCksCi0JCQkJbnVsbCwKLQkJCQkibWV0aG9kRWxlbWVudFByb3BlcnR5IiwgbnVsbCwgMCwgLTEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kRWxlbWVudF9LaW5kKCksCi0JCQkJdGhpcy5nZXRLaW5kKCksCi0JCQkJbnVsbCwKLQkJCQkia2luZCIsIG51bGwsIDAsIC0xLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKSwKLQkJCQl0aGlzLmdldEJvb2xlYW4oKSwKLQkJCQkic3VwcHJlc3NlZCIsICJmYWxzZSIsIDEsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkib3JkZXJpbmdHdWlkZSIsICIiLCAwLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQltZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MsCi0JCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5LmNsYXNzLAotCQkJCSJNZXRob2RFbGVtZW50UHJvcGVydHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkidmFsdWUiLCAiIiwgMCwgMSwgTWV0aG9kRWxlbWVudFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlraW5kRUNsYXNzLAotCQkJCUtpbmQuY2xhc3MsCi0JCQkJIktpbmQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0S2luZF9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpLAotCQkJCXRoaXMuZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSwKLQkJCQludWxsLAotCQkJCSJhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIsIG51bGwsIDAsIC0xLCBLaW5kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQljb250ZW50RWxlbWVudEVDbGFzcywKLQkJCQlDb250ZW50RWxlbWVudC5jbGFzcywKLQkJCQkiQ29udGVudEVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJdGhpcy5nZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSwKLQkJCQludWxsLAotCQkJCSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJCXRoaXMuZ2V0Q29uY2VwdCgpLAotCQkJCW51bGwsCi0JCQkJImNvbmNlcHRzQW5kUGFwZXJzIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJdGhpcy5nZXRDaGVja2xpc3QoKSwKLQkJCQludWxsLAotCQkJCSJjaGVja2xpc3RzIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJdGhpcy5nZXRHdWlkZWxpbmUoKSwKLQkJCQludWxsLAotCQkJCSJndWlkZWxpbmVzIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCXRoaXMuZ2V0RXhhbXBsZSgpLAotCQkJCW51bGwsCi0JCQkJImV4YW1wbGVzIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCQl0aGlzLmdldFJldXNhYmxlQXNzZXQoKSwKLQkJCQludWxsLAotCQkJCSJhc3NldHMiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvbnRlbnRFbGVtZW50X1Rlcm1kZWZpbml0aW9uKCksCi0JCQkJdGhpcy5nZXRUZXJtRGVmaW5pdGlvbigpLAotCQkJCW51bGwsCi0JCQkJInRlcm1kZWZpbml0aW9uIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLAotCQkJCURlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywKLQkJCQkiRGVzY3JpYmFibGVFbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpLAotCQkJCXRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCksCi0JCQkJbnVsbCwKLQkJCQkicHJlc2VudGF0aW9uIiwgbnVsbCwgMCwgMSwgRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKSwKLQkJCQl0aGlzLmdldFVyaSgpLAotCQkJCSJzaGFwZWljb24iLCBudWxsLCAwLCAxLCBEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpLAotCQkJCXRoaXMuZ2V0VXJpKCksCi0JCQkJIm5vZGVpY29uIiwgbnVsbCwgMCwgMSwgRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJY29udGVudERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUNvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiQ29udGVudERlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJtYWluRGVzY3JpcHRpb24iLCAiIiwgMCwgMSwgQ29udGVudERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpLAotCQkJCXRoaXMuZ2V0U2VjdGlvbigpLAotCQkJCW51bGwsCi0JCQkJInNlY3Rpb25zIiwgbnVsbCwgMCwgLTEsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRDb250ZW50RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImV4dGVybmFsSWQiLCAiIiwgMCwgMSwgQ29udGVudERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImtleUNvbnNpZGVyYXRpb25zIiwgIiIsIDAsIDEsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRDb250ZW50RGVzY3JpcHRpb25fTG9uZ1ByZXNlbnRhdGlvbk5hbWUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJsb25nUHJlc2VudGF0aW9uTmFtZSIsIG51bGwsIDEsIDEsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCW1ldGhvZFVuaXRFQ2xhc3MsCi0JCQkJTWV0aG9kVW5pdC5jbGFzcywKLQkJCQkiTWV0aG9kVW5pdCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE1ldGhvZFVuaXRfQXV0aG9ycygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImF1dGhvcnMiLCAiIiwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKSwKLQkJCQl0aGlzLmdldERhdGUoKSwKLQkJCQkiY2hhbmdlRGF0ZSIsIG51bGwsIDAsIDEsIE1ldGhvZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJjaGFuZ2VEZXNjcmlwdGlvbiIsICIiLCAwLCAxLCBNZXRob2RVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE1ldGhvZFVuaXRfVmVyc2lvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInZlcnNpb24iLCAiIiwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpLAotCQkJCXRoaXMuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCksCi0JCQkJbnVsbCwKLQkJCQkiY29weXJpZ2h0U3RhdGVtZW50IiwgbnVsbCwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzcywKLQkJCQlTdXBwb3J0aW5nTWF0ZXJpYWwuY2xhc3MsCi0JCQkJIlN1cHBvcnRpbmdNYXRlcmlhbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZ3VpZGFuY2VFQ2xhc3MsCi0JCQkJR3VpZGFuY2UuY2xhc3MsCi0JCQkJIkd1aWRhbmNlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXNlY3Rpb25FQ2xhc3MsCi0JCQkJU2VjdGlvbi5jbGFzcywKLQkJCQkiU2VjdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkic2VjdGlvbk5hbWUiLCAiIiwgMCwgMSwgU2VjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRTZWN0aW9uX1NlY3Rpb25EZXNjcmlwdGlvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInNlY3Rpb25EZXNjcmlwdGlvbiIsICIiLCAwLCAxLCBTZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFNlY3Rpb25fU3ViU2VjdGlvbnMoKSwKLQkJCQl0aGlzLmdldFNlY3Rpb24oKSwKLQkJCQludWxsLAotCQkJCSJzdWJTZWN0aW9ucyIsIG51bGwsIDAsIC0xLCBTZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFNlY3Rpb25fUHJlZGVjZXNzb3IoKSwKLQkJCQl0aGlzLmdldFNlY3Rpb24oKSwKLQkJCQludWxsLAotCQkJCSJwcmVkZWNlc3NvciIsIG51bGwsIDAsIDEsIFNlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl2YXJpYWJpbGl0eUVsZW1lbnRFQ2xhc3MsCi0JCQkJVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzLAotCQkJCSJWYXJpYWJpbGl0eUVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCksCi0JCQkJdGhpcy5nZXRWYXJpYWJpbGl0eVR5cGUoKSwKLQkJCQkidmFyaWFiaWxpdHlUeXBlIiwgIm5hIiwgMSwgMSwgVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksCi0JCQkJdGhpcy5nZXRWYXJpYWJpbGl0eUVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiwgbnVsbCwgMSwgMSwgVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJY29uY2VwdEVDbGFzcywKLQkJCQlDb25jZXB0LmNsYXNzLAotCQkJCSJDb25jZXB0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQljaGVja2xpc3RFQ2xhc3MsCi0JCQkJQ2hlY2tsaXN0LmNsYXNzLAotCQkJCSJDaGVja2xpc3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWd1aWRlbGluZUVDbGFzcywKLQkJCQlHdWlkZWxpbmUuY2xhc3MsCi0JCQkJIkd1aWRlbGluZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZXhhbXBsZUVDbGFzcywKLQkJCQlFeGFtcGxlLmNsYXNzLAotCQkJCSJFeGFtcGxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlyZXVzYWJsZUFzc2V0RUNsYXNzLAotCQkJCVJldXNhYmxlQXNzZXQuY2xhc3MsCi0JCQkJIlJldXNhYmxlQXNzZXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXRlcm1EZWZpbml0aW9uRUNsYXNzLAotCQkJCVRlcm1EZWZpbml0aW9uLmNsYXNzLAotCQkJCSJUZXJtRGVmaW5pdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJYXBwbGljYWJsZU1ldGFDbGFzc0luZm9FQ2xhc3MsCi0JCQkJQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uY2xhc3MsCi0JCQkJIkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX0lzUHJpbWFyeUV4dGVuc2lvbigpLAotCQkJCXRoaXMuZ2V0Qm9vbGVhbigpLAotCQkJCSJpc1ByaW1hcnlFeHRlbnNpb24iLCBudWxsLCAxLCAxLCBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWFydGlmYWN0RUNsYXNzLAotCQkJCUFydGlmYWN0LmNsYXNzLAotCQkJCSJBcnRpZmFjdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRBcnRpZmFjdF9Db250YWluZXJBcnRpZmFjdCgpLAotCQkJCXRoaXMuZ2V0QXJ0aWZhY3QoKSwKLQkJCQl0aGlzLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpLAotCQkJCSJjb250YWluZXJBcnRpZmFjdCIsIG51bGwsIDAsIDEsIEFydGlmYWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKSwKLQkJCQl0aGlzLmdldEFydGlmYWN0KCksCi0JCQkJdGhpcy5nZXRBcnRpZmFjdF9Db250YWluZXJBcnRpZmFjdCgpLAotCQkJCSJjb250YWluZWRBcnRpZmFjdHMiLCBudWxsLCAwLCAtMSwgQXJ0aWZhY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXdvcmtQcm9kdWN0RUNsYXNzLAotCQkJCVdvcmtQcm9kdWN0LmNsYXNzLAotCQkJCSJXb3JrUHJvZHVjdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdF9SZXBvcnRzKCksCi0JCQkJdGhpcy5nZXRSZXBvcnQoKSwKLQkJCQludWxsLAotCQkJCSJyZXBvcnRzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKSwKLQkJCQl0aGlzLmdldFRlbXBsYXRlKCksCi0JCQkJbnVsbCwKLQkJCQkidGVtcGxhdGVzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9ycygpLAotCQkJCXRoaXMuZ2V0VG9vbE1lbnRvcigpLAotCQkJCW51bGwsCi0JCQkJInRvb2xNZW50b3JzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwKLQkJCQl0aGlzLmdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLAotCQkJCW51bGwsCi0JCQkJImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWZ1bGZpbGxhYmxlRWxlbWVudEVDbGFzcywKLQkJCQlGdWxmaWxsYWJsZUVsZW1lbnQuY2xhc3MsCi0JCQkJIkZ1bGZpbGxhYmxlRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoKSwKLQkJCQl0aGlzLmdldEZ1bGZpbGxhYmxlRWxlbWVudCgpLAotCQkJCW51bGwsCi0JCQkJImZ1bGZpbGxzIiwgbnVsbCwgMCwgLTEsIEZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXJlcG9ydEVDbGFzcywKLQkJCQlSZXBvcnQuY2xhc3MsCi0JCQkJIlJlcG9ydCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJdGVtcGxhdGVFQ2xhc3MsCi0JCQkJVGVtcGxhdGUuY2xhc3MsCi0JCQkJIlRlbXBsYXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0b29sTWVudG9yRUNsYXNzLAotCQkJCVRvb2xNZW50b3IuY2xhc3MsCi0JCQkJIlRvb2xNZW50b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWVzdGltYXRpb25Db25zaWRlcmF0aW9uc0VDbGFzcywKLQkJCQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuY2xhc3MsCi0JCQkJIkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGVsaXZlcmFibGVFQ2xhc3MsCi0JCQkJRGVsaXZlcmFibGUuY2xhc3MsCi0JCQkJIkRlbGl2ZXJhYmxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3QoKSwKLQkJCQludWxsLAotCQkJCSJkZWxpdmVyZWRXb3JrUHJvZHVjdHMiLCBudWxsLCAwLCAtMSwgRGVsaXZlcmFibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlvdXRjb21lRUNsYXNzLAotCQkJCU91dGNvbWUuY2xhc3MsCi0JCQkJIk91dGNvbWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXN0ZXBFQ2xhc3MsCi0JCQkJU3RlcC5jbGFzcywKLQkJCQkiU3RlcCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJd29ya0RlZmluaXRpb25FQ2xhc3MsCi0JCQkJV29ya0RlZmluaXRpb24uY2xhc3MsCi0JCQkJIldvcmtEZWZpbml0aW9uIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0V29ya0RlZmluaXRpb25fUHJlY29uZGl0aW9uKCksCi0JCQkJdGhpcy5nZXRDb25zdHJhaW50KCksCi0JCQkJbnVsbCwKLQkJCQkicHJlY29uZGl0aW9uIiwgbnVsbCwgMCwgMSwgV29ya0RlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpLAotCQkJCXRoaXMuZ2V0Q29uc3RyYWludCgpLAotCQkJCW51bGwsCi0JCQkJInBvc3Rjb25kaXRpb24iLCBudWxsLCAwLCAxLCBXb3JrRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJd2hpdGVwYXBlckVDbGFzcywKLQkJCQlXaGl0ZXBhcGVyLmNsYXNzLAotCQkJCSJXaGl0ZXBhcGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0YXNrRUNsYXNzLAotCQkJCVRhc2suY2xhc3MsCi0JCQkJIlRhc2siLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza19QZXJmb3JtZWRCeSgpLAotCQkJCXRoaXMuZ2V0Um9sZSgpLAotCQkJCW51bGwsCi0JCQkJInBlcmZvcm1lZEJ5IiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0KCksCi0JCQkJbnVsbCwKLQkJCQkibWFuZGF0b3J5SW5wdXQiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza19PdXRwdXQoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0KCksCi0JCQkJbnVsbCwKLQkJCQkib3V0cHV0IiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwKLQkJCQl0aGlzLmdldFJvbGUoKSwKLQkJCQludWxsLAotCQkJCSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0KCksCi0JCQkJbnVsbCwKLQkJCQkib3B0aW9uYWxJbnB1dCIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrX1N0ZXBzKCksCi0JCQkJdGhpcy5nZXRTdGVwKCksCi0JCQkJbnVsbCwKLQkJCQkic3RlcHMiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza19Ub29sTWVudG9ycygpLAotCQkJCXRoaXMuZ2V0VG9vbE1lbnRvcigpLAotCQkJCW51bGwsCi0JCQkJInRvb2xNZW50b3JzIiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksCi0JCQkJdGhpcy5nZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwKLQkJCQludWxsLAotCQkJCSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXJvbGVFQ2xhc3MsCi0JCQkJUm9sZS5jbGFzcywKLQkJCQkiUm9sZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRSb2xlX01vZGlmaWVzKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdCgpLAotCQkJCW51bGwsCi0JCQkJIm1vZGlmaWVzIiwgbnVsbCwgMCwgLTEsIFJvbGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0KCksCi0JCQkJbnVsbCwKLQkJCQkicmVzcG9uc2libGVGb3IiLCBudWxsLCAwLCAtMSwgUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQXJ0aWZhY3REZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiQXJ0aWZhY3REZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImJyaWVmT3V0bGluZSIsICIiLCAwLCAxLCBBcnRpZmFjdERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicmVwcmVzZW50YXRpb25PcHRpb25zIiwgIiIsIDAsIDEsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInJlcHJlc2VudGF0aW9uIiwgIiIsIDAsIDEsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9Ob3RhdGlvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJIm5vdGF0aW9uIiwgIiIsIDAsIDEsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiV29ya1Byb2R1Y3REZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwdXJwb3NlIiwgIiIsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImltcGFjdE9mTm90SGF2aW5nIiwgIiIsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9SZWFzb25zRm9yTm90TmVlZGluZygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInJlYXNvbnNGb3JOb3ROZWVkaW5nIiwgIiIsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiRGVsaXZlcmFibGVEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJleHRlcm5hbERlc2NyaXB0aW9uIiwgIiIsIDAsIDEsIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInBhY2thZ2luZ0d1aWRhbmNlIiwgIiIsIDAsIDEsIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXJvbGVEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlSb2xlRGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIlJvbGVEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkic2tpbGxzIiwgIiIsIDAsIDEsIFJvbGVEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRSb2xlRGVzY3JpcHRpb25fQXNzaWdubWVudEFwcHJvYWNoZXMoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJhc3NpZ25tZW50QXBwcm9hY2hlcyIsICIiLCAwLCAxLCBSb2xlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkic3lub255bXMiLCAiIiwgMCwgMSwgUm9sZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0YXNrRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJVGFza0Rlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJUYXNrRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwdXJwb3NlIiwgIiIsIDAsIDEsIFRhc2tEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYWx0ZXJuYXRpdmVzIiwgIiIsIDAsIDEsIFRhc2tEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlHdWlkYW5jZURlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJHdWlkYW5jZURlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJhdHRhY2htZW50cyIsICIiLCAwLCAxLCBHdWlkYW5jZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIlByYWN0aWNlRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BZGRpdGlvbmFsSW5mbygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImFkZGl0aW9uYWxJbmZvIiwgIiIsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicHJvYmxlbSIsICIiLCAwLCAxLCBQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImJhY2tncm91bmQiLCAiIiwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiZ29hbHMiLCAiIiwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYXBwbGljYXRpb24iLCAiIiwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJsZXZlbHNPZkFkb3B0aW9uIiwgIiIsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXJvbGVTZXRFQ2xhc3MsCi0JCQkJUm9sZVNldC5jbGFzcywKLQkJCQkiUm9sZVNldCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRSb2xlU2V0X1JvbGVzKCksCi0JCQkJdGhpcy5nZXRSb2xlKCksCi0JCQkJbnVsbCwKLQkJCQkicm9sZXMiLCBudWxsLCAwLCAtMSwgUm9sZVNldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWNvbnRlbnRDYXRlZ29yeUVDbGFzcywKLQkJCQlDb250ZW50Q2F0ZWdvcnkuY2xhc3MsCi0JCQkJIkNvbnRlbnRDYXRlZ29yeSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkb21haW5FQ2xhc3MsCi0JCQkJRG9tYWluLmNsYXNzLAotCQkJCSJEb21haW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3QoKSwKLQkJCQludWxsLAotCQkJCSJ3b3JrUHJvZHVjdHMiLCBudWxsLCAwLCAtMSwgRG9tYWluLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREb21haW5fU3ViZG9tYWlucygpLAotCQkJCXRoaXMuZ2V0RG9tYWluKCksCi0JCQkJbnVsbCwKLQkJCQkic3ViZG9tYWlucyIsIG51bGwsIDAsIC0xLCBEb21haW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXdvcmtQcm9kdWN0VHlwZUVDbGFzcywKLQkJCQlXb3JrUHJvZHVjdFR5cGUuY2xhc3MsCi0JCQkJIldvcmtQcm9kdWN0VHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3RzKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdCgpLAotCQkJCW51bGwsCi0JCQkJIndvcmtQcm9kdWN0cyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MsCi0JCQkJRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzLAotCQkJCSJEaXNjaXBsaW5lR3JvdXBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCksCi0JCQkJdGhpcy5nZXREaXNjaXBsaW5lKCksCi0JCQkJbnVsbCwKLQkJCQkiZGlzY2lwbGluZXMiLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGlzY2lwbGluZUVDbGFzcywKLQkJCQlEaXNjaXBsaW5lLmNsYXNzLAotCQkJCSJEaXNjaXBsaW5lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpc2NpcGxpbmVfVGFza3MoKSwKLQkJCQl0aGlzLmdldFRhc2soKSwKLQkJCQludWxsLAotCQkJCSJ0YXNrcyIsIG51bGwsIDAsIC0xLCBEaXNjaXBsaW5lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaXNjaXBsaW5lX1N1YmRpc2NpcGxpbmUoKSwKLQkJCQl0aGlzLmdldERpc2NpcGxpbmUoKSwKLQkJCQludWxsLAotCQkJCSJzdWJkaXNjaXBsaW5lIiwgbnVsbCwgMCwgLTEsIERpc2NpcGxpbmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvd3MoKSwKLQkJCQl0aGlzLmdldEFjdGl2aXR5KCksCi0JCQkJbnVsbCwKLQkJCQkicmVmZXJlbmNlV29ya2Zsb3dzIiwgbnVsbCwgMCwgLTEsIERpc2NpcGxpbmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlhY3Rpdml0eUVDbGFzcywKLQkJCQlBY3Rpdml0eS5jbGFzcywKLQkJCQkiQWN0aXZpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0aWVzKCksCi0JCQkJImJyZWFrZG93bkVsZW1lbnRzIiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRBY3Rpdml0eV9Sb2FkbWFwcygpLAotCQkJCXRoaXMuZ2V0Um9hZG1hcCgpLAotCQkJCW51bGwsCi0JCQkJInJvYWRtYXBzIiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MsCi0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsCi0JCQkJIldvcmtCcmVha2Rvd25FbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCksCi0JCQkJdGhpcy5nZXRCb29sZWFuKCksCi0JCQkJImlzUmVwZWF0YWJsZSIsICJmYWxzZSIsIDEsIDEsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpLAotCQkJCXRoaXMuZ2V0Qm9vbGVhbigpLAotCQkJCSJpc09uZ29pbmciLCAiZmFsc2UiLCAxLCAxLCBXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCksCi0JCQkJdGhpcy5nZXRCb29sZWFuKCksCi0JCQkJImlzRXZlbnREcml2ZW4iLCAiZmFsc2UiLCAxLCAxLCBXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpLAotCQkJCXRoaXMuZ2V0V29ya09yZGVyKCksCi0JCQkJbnVsbCwKLQkJCQkibGlua1RvUHJlZGVjZXNzb3IiLCBudWxsLCAwLCAtMSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJyZWFrZG93bkVsZW1lbnQuY2xhc3MsCi0JCQkJIkJyZWFrZG93bkVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInByZWZpeCIsICIiLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCksCi0JCQkJdGhpcy5nZXRCb29sZWFuKCksCi0JCQkJImlzUGxhbm5lZCIsICJ0cnVlIiwgMSwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSwKLQkJCQl0aGlzLmdldEJvb2xlYW4oKSwKLQkJCQkiaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIsICJmYWxzZSIsIDEsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCksCi0JCQkJdGhpcy5nZXRCb29sZWFuKCksCi0JCQkJImlzT3B0aW9uYWwiLCAiZmFsc2UiLCAxLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKSwKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJwcmVzZW50ZWRBZnRlciIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCksCi0JCQkJdGhpcy5nZXRCcmVha2Rvd25FbGVtZW50KCksCi0JCQkJbnVsbCwKLQkJCQkicHJlc2VudGVkQmVmb3JlIiwgbnVsbCwgMCwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9QbGFubmluZ0RhdGEoKSwKLQkJCQl0aGlzLmdldFBsYW5uaW5nRGF0YSgpLAotCQkJCW51bGwsCi0JCQkJInBsYW5uaW5nRGF0YSIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXRpZXMoKSwKLQkJCQl0aGlzLmdldEFjdGl2aXR5KCksCi0JCQkJdGhpcy5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLAotCQkJCSJzdXBlckFjdGl2aXRpZXMiLCBudWxsLCAxLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQl0aGlzLmdldENoZWNrbGlzdCgpLAotCQkJCW51bGwsCi0JCQkJImNoZWNrbGlzdHMiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9Db25jZXB0cygpLAotCQkJCXRoaXMuZ2V0Q29uY2VwdCgpLAotCQkJCW51bGwsCi0JCQkJImNvbmNlcHRzIiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfRXhhbXBsZXMoKSwKLQkJCQl0aGlzLmdldEV4YW1wbGUoKSwKLQkJCQludWxsLAotCQkJCSJleGFtcGxlcyIsIG51bGwsIDAsIC0xLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCQl0aGlzLmdldEd1aWRlbGluZSgpLAotCQkJCW51bGwsCi0JCQkJImd1aWRlbGluZXMiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0cygpLAotCQkJCXRoaXMuZ2V0UmV1c2FibGVBc3NldCgpLAotCQkJCW51bGwsCi0JCQkJInJldXNhYmxlQXNzZXRzIiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLAotCQkJCXRoaXMuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCksCi0JCQkJbnVsbCwKLQkJCQkic3VwcG9ydGluZ01hdGVyaWFscyIsIG51bGwsIDAsIC0xLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X1RlbXBsYXRlcygpLAotCQkJCXRoaXMuZ2V0VGVtcGxhdGUoKSwKLQkJCQludWxsLAotCQkJCSJ0ZW1wbGF0ZXMiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9SZXBvcnRzKCksCi0JCQkJdGhpcy5nZXRSZXBvcnQoKSwKLQkJCQludWxsLAotCQkJCSJyZXBvcnRzIiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfRXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zKCksCi0JCQkJdGhpcy5nZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwKLQkJCQludWxsLAotCQkJCSJlc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9Ub29sbWVudG9yKCksCi0JCQkJdGhpcy5nZXRUb29sTWVudG9yKCksCi0JCQkJbnVsbCwKLQkJCQkidG9vbG1lbnRvciIsIG51bGwsIDAsIC0xLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJvY2Vzc0VsZW1lbnRFQ2xhc3MsCi0JCQkJUHJvY2Vzc0VsZW1lbnQuY2xhc3MsCi0JCQkJIlByb2Nlc3NFbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXBsYW5uaW5nRGF0YUVDbGFzcywKLQkJCQlQbGFubmluZ0RhdGEuY2xhc3MsCi0JCQkJIlBsYW5uaW5nRGF0YSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQbGFubmluZ0RhdGFfU3RhcnREYXRlKCksCi0JCQkJdGhpcy5nZXREYXRlKCksCi0JCQkJInN0YXJ0RGF0ZSIsIG51bGwsIDEsIDEsIFBsYW5uaW5nRGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKSwKLQkJCQl0aGlzLmdldERhdGUoKSwKLQkJCQkiZmluaXNoRGF0ZSIsIG51bGwsIDEsIDEsIFBsYW5uaW5nRGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UGxhbm5pbmdEYXRhX1JhbmsoKSwKLQkJCQl0aGlzLmdldEludGVnZXIoKSwKLQkJCQkicmFuayIsIG51bGwsIDEsIDEsIFBsYW5uaW5nRGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXdvcmtPcmRlckVDbGFzcywKLQkJCQlXb3JrT3JkZXIuY2xhc3MsCi0JCQkJIldvcmtPcmRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRXb3JrT3JkZXJfTGlua1R5cGUoKSwKLQkJCQl0aGlzLmdldFdvcmtPcmRlclR5cGUoKSwKLQkJCQkibGlua1R5cGUiLCAiZmluaXNoVG9TdGFydCIsIDEsIDEsIFdvcmtPcmRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrT3JkZXJfUHJlZCgpLAotCQkJCXRoaXMuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJwcmVkIiwgbnVsbCwgMSwgMSwgV29ya09yZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcm9hZG1hcEVDbGFzcywKLQkJCQlSb2FkbWFwLmNsYXNzLAotCQkJCSJSb2FkbWFwIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0b29sRUNsYXNzLAotCQkJCVRvb2wuY2xhc3MsCi0JCQkJIlRvb2wiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VG9vbF9Ub29sTWVudG9ycygpLAotCQkJCXRoaXMuZ2V0VG9vbE1lbnRvcigpLAotCQkJCW51bGwsCi0JCQkJInRvb2xNZW50b3JzIiwgbnVsbCwgMCwgLTEsIFRvb2wuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlyb2xlU2V0R3JvdXBpbmdFQ2xhc3MsCi0JCQkJUm9sZVNldEdyb3VwaW5nLmNsYXNzLAotCQkJCSJSb2xlU2V0R3JvdXBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCksCi0JCQkJdGhpcy5nZXRSb2xlU2V0KCksCi0JCQkJbnVsbCwKLQkJCQkicm9sZVNldHMiLCBudWxsLCAwLCAtMSwgUm9sZVNldEdyb3VwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MsCi0JCQkJQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsCi0JCQkJIkN1c3RvbUNhdGVnb3J5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKSwKLQkJCQl0aGlzLmdldERlc2NyaWJhYmxlRWxlbWVudCgpLAotCQkJCW51bGwsCi0JCQkJImNhdGVnb3JpemVkRWxlbWVudHMiLCBudWxsLCAwLCAtMSwgQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3JpZXMoKSwKLQkJCQl0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpLAotCQkJCW51bGwsCi0JCQkJInN1YkNhdGVnb3JpZXMiLCBudWxsLCAwLCAtMSwgQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQltZXRob2RQYWNrYWdlRUNsYXNzLAotCQkJCU1ldGhvZFBhY2thZ2UuY2xhc3MsCi0JCQkJIk1ldGhvZFBhY2thZ2UiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpLAotCQkJCXRoaXMuZ2V0Qm9vbGVhbigpLAotCQkJCSJnbG9iYWwiLCAiZmFsc2UiLCAxLCAxLCBNZXRob2RQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZFBhY2thZ2VfUmV1c2VkUGFja2FnZXMoKSwKLQkJCQl0aGlzLmdldE1ldGhvZFBhY2thZ2UoKSwKLQkJCQludWxsLAotCQkJCSJyZXVzZWRQYWNrYWdlcyIsIG51bGwsIDAsIC0xLCBNZXRob2RQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSwKLQkJCQl0aGlzLmdldE1ldGhvZFBhY2thZ2UoKSwKLQkJCQludWxsLAotCQkJCSJjaGlsZFBhY2thZ2VzIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWNvbnRlbnRQYWNrYWdlRUNsYXNzLAotCQkJCUNvbnRlbnRQYWNrYWdlLmNsYXNzLAotCQkJCSJDb250ZW50UGFja2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwKLQkJCQl0aGlzLmdldENvbnRlbnRFbGVtZW50KCksCi0JCQkJbnVsbCwKLQkJCQkiY29udGVudEVsZW1lbnRzIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQltaWxlc3RvbmVFQ2xhc3MsCi0JCQkJTWlsZXN0b25lLmNsYXNzLAotCQkJCSJNaWxlc3RvbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWlsZXN0b25lX1JlcXVpcmVkUmVzdWx0cygpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksCi0JCQkJbnVsbCwKLQkJCQkicmVxdWlyZWRSZXN1bHRzIiwgbnVsbCwgMCwgLTEsIE1pbGVzdG9uZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsCi0JCQkJIldvcmtQcm9kdWN0RGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYWN0aXZpdHlFbnRyeVN0YXRlIiwgIiIsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJhY3Rpdml0eUV4aXRTdGF0ZSIsICIiLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdCgpLAotCQkJCW51bGwsCi0JCQkJIldvcmtQcm9kdWN0IiwgbnVsbCwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpLAotCQkJCSJpbXBhY3RlZEJ5IiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKSwKLQkJCQkiaW1wYWN0cyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJkZWxpdmVyYWJsZVBhcnRzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRlc2NyaXB0b3JFQ2xhc3MsCi0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yLmNsYXNzLAotCQkJCSJEZXNjcmlwdG9yIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSwKLQkJCQl0aGlzLmdldEJvb2xlYW4oKSwKLQkJCQkiaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIiwgInRydWUiLCAxLCAxLCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCWl0ZXJhdGlvbkVDbGFzcywKLQkJCQlJdGVyYXRpb24uY2xhc3MsCi0JCQkJIkl0ZXJhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcGhhc2VFQ2xhc3MsCi0JCQkJUGhhc2UuY2xhc3MsCi0JCQkJIlBoYXNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0ZWFtUHJvZmlsZUVDbGFzcywKLQkJCQlUZWFtUHJvZmlsZS5jbGFzcywKLQkJCQkiVGVhbVByb2ZpbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJdGhpcy5nZXRSb2xlRGVzY3JpcHRvcigpLAotCQkJCW51bGwsCi0JCQkJInRlYW1Sb2xlcyIsIG51bGwsIDAsIC0xLCBUZWFtUHJvZmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGVhbVByb2ZpbGVfU3VwZXJUZWFtKCksCi0JCQkJdGhpcy5nZXRUZWFtUHJvZmlsZSgpLAotCQkJCXRoaXMuZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpLAotCQkJCSJzdXBlclRlYW0iLCBudWxsLCAxLCAxLCBUZWFtUHJvZmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpLAotCQkJCXRoaXMuZ2V0VGVhbVByb2ZpbGUoKSwKLQkJCQl0aGlzLmdldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpLAotCQkJCSJzdWJUZWFtIiwgbnVsbCwgMCwgLTEsIFRlYW1Qcm9maWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcm9sZURlc2NyaXB0b3JFQ2xhc3MsCi0JCQkJUm9sZURlc2NyaXB0b3IuY2xhc3MsCi0JCQkJIlJvbGVEZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKSwKLQkJCQl0aGlzLmdldFJvbGUoKSwKLQkJCQludWxsLAotCQkJCSJSb2xlIiwgbnVsbCwgMCwgMSwgUm9sZURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFJvbGVEZXNjcmlwdG9yX01vZGlmaWVzKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJtb2RpZmllcyIsIG51bGwsIDAsIC0xLCBSb2xlRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJyZXNwb25zaWJsZUZvciIsIG51bGwsIDAsIC0xLCBSb2xlRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXRhc2tEZXNjcmlwdG9yRUNsYXNzLAotCQkJCVRhc2tEZXNjcmlwdG9yLmNsYXNzLAotCQkJCSJUYXNrRGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCksCi0JCQkJdGhpcy5nZXRUYXNrKCksCi0JCQkJbnVsbCwKLQkJCQkiVGFzayIsIG51bGwsIDAsIDEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAotCQkJCXRoaXMuZ2V0Um9sZURlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpLAotCQkJCXRoaXMuZ2V0Um9sZURlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJhc3Npc3RlZEJ5IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJleHRlcm5hbElucHV0IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksCi0JCQkJbnVsbCwKLQkJCQkibWFuZGF0b3J5SW5wdXQiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpLAotCQkJCW51bGwsCi0JCQkJIm9wdGlvbmFsSW5wdXQiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksCi0JCQkJbnVsbCwKLQkJCQkib3V0cHV0IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLAotCQkJCXRoaXMuZ2V0Um9sZURlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJwZXJmb3JtZWRQcmltYXJpbHlCeSIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpLAotCQkJCXRoaXMuZ2V0U2VjdGlvbigpLAotCQkJCW51bGwsCi0JCQkJInNlbGVjdGVkU3RlcHMiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQljb21wb3NpdGVSb2xlRUNsYXNzLAotCQkJCUNvbXBvc2l0ZVJvbGUuY2xhc3MsCi0JCQkJIkNvbXBvc2l0ZVJvbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKSwKLQkJCQl0aGlzLmdldFJvbGUoKSwKLQkJCQludWxsLAotCQkJCSJhZ2dyZWdhdGVkUm9sZXMiLCBudWxsLCAwLCAtMSwgQ29tcG9zaXRlUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcywKLQkJCQlEZWxpdmVyeVByb2Nlc3MuY2xhc3MsCi0JCQkJIkRlbGl2ZXJ5UHJvY2VzcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWxzKCksCi0JCQkJdGhpcy5nZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSwKLQkJCQludWxsLAotCQkJCSJlZHVjYXRpb25NYXRlcmlhbHMiLCBudWxsLCAwLCAtMSwgRGVsaXZlcnlQcm9jZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKSwKLQkJCQl0aGlzLmdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLAotCQkJCW51bGwsCi0JCQkJImNvbW11bmljYXRpb25zTWF0ZXJpYWxzIiwgbnVsbCwgMCwgLTEsIERlbGl2ZXJ5UHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXByb2Nlc3NFQ2xhc3MsCi0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzLmNsYXNzLAotCQkJCSJQcm9jZXNzIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm5zKCksCi0JCQkJdGhpcy5nZXRDYXBhYmlsaXR5UGF0dGVybigpLAotCQkJCW51bGwsCi0JCQkJImluY2x1ZGVzUGF0dGVybnMiLCBudWxsLCAwLCAtMSwgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCksCi0JCQkJdGhpcy5nZXRNZXRob2RDb25maWd1cmF0aW9uKCksCi0JCQkJbnVsbCwKLQkJCQkiZGVmYXVsdENvbnRleHQiLCBudWxsLCAxLCAxLCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCksCi0JCQkJdGhpcy5nZXRNZXRob2RDb25maWd1cmF0aW9uKCksCi0JCQkJbnVsbCwKLQkJCQkidmFsaWRDb250ZXh0IiwgbnVsbCwgMCwgLTEsIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzLAotCQkJCUNhcGFiaWxpdHlQYXR0ZXJuLmNsYXNzLAotCQkJCSJDYXBhYmlsaXR5UGF0dGVybiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLAotCQkJCSJNZXRob2RDb25maWd1cmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCksCi0JCQkJdGhpcy5nZXRNZXRob2RQbHVnaW4oKSwKLQkJCQludWxsLAotCQkJCSJtZXRob2RQbHVnaW5TZWxlY3Rpb24iLCBudWxsLCAxLCAtMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksCi0JCQkJdGhpcy5nZXRNZXRob2RQYWNrYWdlKCksCi0JCQkJbnVsbCwKLQkJCQkibWV0aG9kUGFja2FnZVNlbGVjdGlvbiIsIG51bGwsIDEsIC0xLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpLAotCQkJCXRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCksCi0JCQkJbnVsbCwKLQkJCQkicHJvY2Vzc1ZpZXdzIiwgbnVsbCwgMCwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKSwKLQkJCQl0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpLAotCQkJCW51bGwsCi0JCQkJImRlZmF1bHRWaWV3IiwgbnVsbCwgMSwgMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbnMoKSwKLQkJCQl0aGlzLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSwKLQkJCQludWxsLAotCQkJCSJiYXNlQ29uZmlndXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9TdWJ0cmFjdGVkQ2F0ZWdvcnkoKSwKLQkJCQl0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpLAotCQkJCW51bGwsCi0JCQkJInN1YnRyYWN0ZWRDYXRlZ29yeSIsIG51bGwsIDAsIC0xLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKSwKLQkJCQl0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpLAotCQkJCW51bGwsCi0JCQkJImFkZGVkQ2F0ZWdvcnkiLCBudWxsLCAwLCAtMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCW1ldGhvZFBsdWdpbkVDbGFzcywKLQkJCQlNZXRob2RQbHVnaW4uY2xhc3MsCi0JCQkJIk1ldGhvZFBsdWdpbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKSwKLQkJCQl0aGlzLmdldEJvb2xlYW4oKSwKLQkJCQkidXNlckNoYW5nZWFibGUiLCAidHJ1ZSIsIDEsIDEsIE1ldGhvZFBsdWdpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZXMoKSwKLQkJCQl0aGlzLmdldE1ldGhvZFBhY2thZ2UoKSwKLQkJCQludWxsLAotCQkJCSJtZXRob2RQYWNrYWdlcyIsIG51bGwsIDEsIC0xLCBNZXRob2RQbHVnaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCksCi0JCQkJdGhpcy5nZXRNZXRob2RQbHVnaW4oKSwKLQkJCQludWxsLAotCQkJCSJiYXNlcyIsIG51bGwsIDAsIC0xLCBNZXRob2RQbHVnaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcywKLQkJCQlQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5jbGFzcywKLQkJCQkiUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfQmFzZWRPblByb2Nlc3NlcygpLAotCQkJCXRoaXMuZ2V0UHJvY2VzcygpLAotCQkJCW51bGwsCi0JCQkJImJhc2VkT25Qcm9jZXNzZXMiLCBudWxsLCAwLCAtMSwgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcmFjdGljZUVDbGFzcywKLQkJCQlQcmFjdGljZS5jbGFzcywKLQkJCQkiUHJhY3RpY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2VzKCksCi0JCQkJdGhpcy5nZXRQcmFjdGljZSgpLAotCQkJCW51bGwsCi0JCQkJInN1YlByYWN0aWNlcyIsIG51bGwsIDAsIC0xLCBQcmFjdGljZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpLAotCQkJCXRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJjb250ZW50UmVmZXJlbmNlcyIsIG51bGwsIDAsIC0xLCBQcmFjdGljZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2VzKCksCi0JCQkJdGhpcy5nZXRBY3Rpdml0eSgpLAotCQkJCW51bGwsCi0JCQkJImFjdGl2aXR5UmVmZXJlbmNlcyIsIG51bGwsIDAsIC0xLCBQcmFjdGljZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInVzYWdlR3VpZGFuY2UiLCAiIiwgMCwgMSwgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUFjdGl2aXR5RGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIkFjdGl2aXR5RGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicHVycG9zZSIsICIiLCAwLCAxLCBBY3Rpdml0eURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYWx0ZXJuYXRpdmVzIiwgIiIsIDAsIDEsIEFjdGl2aXR5RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3d0b1N0YWZmKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiaG93dG9TdGFmZiIsICIiLCAwLCAxLCBBY3Rpdml0eURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fU2NhbGUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJzY2FsZSIsICIiLCAwLCAxLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicHJvamVjdENoYXJhY3RlcmlzdGljcyIsICIiLCAwLCAxLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJyaXNrTGV2ZWwiLCAiIiwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImVzdGltYXRpbmdUZWNobmlxdWUiLCAiIiwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdE1lbWJlckV4cGVydGlzZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInByb2plY3RNZW1iZXJFeHBlcnRpc2UiLCAiIiwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fVHlwZU9mQ29udHJhY3QoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJ0eXBlT2ZDb250cmFjdCIsICIiLCAwLCAxLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiUHJvY2Vzc0Rlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInNjb3BlIiwgIiIsIDAsIDEsIFByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInVzYWdlTm90ZXMiLCAiIiwgMCwgMSwgUHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJRGVzY3JpcHRvckRlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInJlZmluZWREZXNjcmlwdGlvbiIsICIiLCAwLCAxLCBEZXNjcmlwdG9yRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yRUNsYXNzLAotCQkJCVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmNsYXNzLAotCQkJCSJQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9fcHJvY2Vzc0NvbXBvbmVudCgpLAotCQkJCXRoaXMuZ2V0UHJvY2Vzc0NvbXBvbmVudCgpLAotCQkJCW51bGwsCi0JCQkJIl9wcm9jZXNzQ29tcG9uZW50IiwgbnVsbCwgMSwgMSwgUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJvY2Vzc0NvbXBvbmVudEVDbGFzcywKLQkJCQlQcm9jZXNzQ29tcG9uZW50LmNsYXNzLAotCQkJCSJQcm9jZXNzQ29tcG9uZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NDb21wb25lbnRfSW50ZXJmYWNlcygpLAotCQkJCXRoaXMuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpLAotCQkJCW51bGwsCi0JCQkJImludGVyZmFjZXMiLCBudWxsLCAxLCAtMSwgUHJvY2Vzc0NvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCksCi0JCQkJdGhpcy5nZXRQcm9jZXNzKCksCi0JCQkJbnVsbCwKLQkJCQkicHJvY2VzcyIsIG51bGwsIDEsIDEsIFByb2Nlc3NDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXByb2Nlc3NQYWNrYWdlRUNsYXNzLAotCQkJCVByb2Nlc3NQYWNrYWdlLmNsYXNzLAotCQkJCSJQcm9jZXNzUGFja2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcm9jZXNzUGFja2FnZV9Qcm9jZXNzRWxlbWVudHMoKSwKLQkJCQl0aGlzLmdldFByb2Nlc3NFbGVtZW50KCksCi0JCQkJbnVsbCwKLQkJCQkicHJvY2Vzc0VsZW1lbnRzIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NQYWNrYWdlX0RpYWdyYW1zKCksCi0JCQkJdGhpcy5nZXREaWFncmFtKCksCi0JCQkJbnVsbCwKLQkJCQkiZGlhZ3JhbXMiLCBudWxsLCAwLCAtMSwgUHJvY2Vzc1BhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRpYWdyYW1FQ2xhc3MsCi0JCQkJRGlhZ3JhbS5jbGFzcywKLQkJCQkiRGlhZ3JhbSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaWFncmFtX0RpYWdyYW1MaW5rKCksCi0JCQkJdGhpcy5nZXREaWFncmFtTGluaygpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbUxpbmtfRGlhZ3JhbSgpLAotCQkJCSJkaWFncmFtTGluayIsIG51bGwsIDAsIC0xLCBEaWFncmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaWFncmFtX05hbWVzcGFjZSgpLAotCQkJCXRoaXMuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpLAotCQkJCXRoaXMuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9EaWFncmFtKCksCi0JCQkJIm5hbWVzcGFjZSIsIG51bGwsIDEsIDEsIERpYWdyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGlhZ3JhbV9ab29tKCksCi0JCQkJdGhpcy5nZXREb3VibGUoKSwKLQkJCQkiem9vbSIsIG51bGwsIDAsIDEsIERpYWdyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpYWdyYW1fVmlld3BvaW50KCksCi0JCQkJdGhpcy5nZXRQb2ludCgpLAotCQkJCW51bGwsCi0JCQkJInZpZXdwb2ludCIsIG51bGwsIDEsIDEsIERpYWdyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlncmFwaE5vZGVFQ2xhc3MsCi0JCQkJR3JhcGhOb2RlLmNsYXNzLAotCQkJCSJHcmFwaE5vZGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0R3JhcGhOb2RlX1NpemUoKSwKLQkJCQl0aGlzLmdldERpbWVuc2lvbigpLAotCQkJCW51bGwsCi0JCQkJInNpemUiLCBudWxsLCAxLCAxLCBHcmFwaE5vZGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlncmFwaEVsZW1lbnRFQ2xhc3MsCi0JCQkJR3JhcGhFbGVtZW50LmNsYXNzLAotCQkJCSJHcmFwaEVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRHcmFwaEVsZW1lbnRfQ29udGFpbmVkKCksCi0JCQkJdGhpcy5nZXREaWFncmFtRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbUVsZW1lbnRfQ29udGFpbmVyKCksCi0JCQkJImNvbnRhaW5lZCIsIG51bGwsIDAsIC0xLCBHcmFwaEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0R3JhcGhFbGVtZW50X1Bvc2l0aW9uKCksCi0JCQkJdGhpcy5nZXRQb2ludCgpLAotCQkJCW51bGwsCi0JCQkJInBvc2l0aW9uIiwgbnVsbCwgMSwgMSwgR3JhcGhFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRHcmFwaEVsZW1lbnRfTGluaygpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbUxpbmsoKSwKLQkJCQl0aGlzLmdldERpYWdyYW1MaW5rX0dyYXBoRWxlbWVudCgpLAotCQkJCSJsaW5rIiwgbnVsbCwgMCwgLTEsIEdyYXBoRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRHcmFwaEVsZW1lbnRfQW5jaG9yYWdlKCksCi0JCQkJdGhpcy5nZXRHcmFwaENvbm5lY3RvcigpLAotCQkJCXRoaXMuZ2V0R3JhcGhDb25uZWN0b3JfR3JhcGhFbGVtZW50KCksCi0JCQkJImFuY2hvcmFnZSIsIG51bGwsIDAsIC0xLCBHcmFwaEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0R3JhcGhFbGVtZW50X1NlbWFudGljTW9kZWwoKSwKLQkJCQl0aGlzLmdldFNlbWFudGljTW9kZWxCcmlkZ2UoKSwKLQkJCQl0aGlzLmdldFNlbWFudGljTW9kZWxCcmlkZ2VfR3JhcGhFbGVtZW50KCksCi0JCQkJInNlbWFudGljTW9kZWwiLCBudWxsLCAxLCAxLCBHcmFwaEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRpYWdyYW1FbGVtZW50RUNsYXNzLAotCQkJCURpYWdyYW1FbGVtZW50LmNsYXNzLAotCQkJCSJEaWFncmFtRWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERpYWdyYW1FbGVtZW50X0lzVmlzaWJsZSgpLAotCQkJCXRoaXMuZ2V0Qm9vbGVhbigpLAotCQkJCSJpc1Zpc2libGUiLCAidHJ1ZSIsIDEsIDEsIERpYWdyYW1FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpYWdyYW1FbGVtZW50X0NvbnRhaW5lcigpLAotCQkJCXRoaXMuZ2V0R3JhcGhFbGVtZW50KCksCi0JCQkJdGhpcy5nZXRHcmFwaEVsZW1lbnRfQ29udGFpbmVkKCksCi0JCQkJImNvbnRhaW5lciIsIG51bGwsIDAsIDEsIERpYWdyYW1FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaWFncmFtRWxlbWVudF9SZWZlcmVuY2UoKSwKLQkJCQl0aGlzLmdldFJlZmVyZW5jZSgpLAotCQkJCXRoaXMuZ2V0UmVmZXJlbmNlX1JlZmVyZW5jZWQoKSwKLQkJCQkicmVmZXJlbmNlIiwgbnVsbCwgMCwgLTEsIERpYWdyYW1FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaWFncmFtRWxlbWVudF9Qcm9wZXJ0eSgpLAotCQkJCXRoaXMuZ2V0UHJvcGVydHkoKSwKLQkJCQludWxsLAotCQkJCSJwcm9wZXJ0eSIsIG51bGwsIDAsIC0xLCBEaWFncmFtRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcmVmZXJlbmNlRUNsYXNzLAotCQkJCVJlZmVyZW5jZS5jbGFzcywKLQkJCQkiUmVmZXJlbmNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFJlZmVyZW5jZV9Jc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpLAotCQkJCXRoaXMuZ2V0Qm9vbGVhbigpLAotCQkJCSJpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiIsICJmYWxzZSIsIDEsIDEsIFJlZmVyZW5jZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRSZWZlcmVuY2VfUmVmZXJlbmNlZCgpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbUVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldERpYWdyYW1FbGVtZW50X1JlZmVyZW5jZSgpLAotCQkJCSJyZWZlcmVuY2VkIiwgbnVsbCwgMSwgMSwgUmVmZXJlbmNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJvcGVydHlFQ2xhc3MsCi0JCQkJUHJvcGVydHkuY2xhc3MsCi0JCQkJIlByb3BlcnR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFByb3BlcnR5X0tleSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImtleSIsICIiLCAwLCAxLCBQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcm9wZXJ0eV9WYWx1ZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInZhbHVlIiwgIiIsIDAsIDEsIFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwb2ludEVDbGFzcywKLQkJCQlQb2ludC5jbGFzcywKLQkJCQkiUG9pbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UG9pbnRfWCgpLAotCQkJCXRoaXMuZ2V0RG91YmxlKCksCi0JCQkJIngiLCBudWxsLCAxLCAxLCBQb2ludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UG9pbnRfWSgpLAotCQkJCXRoaXMuZ2V0RG91YmxlKCksCi0JCQkJInkiLCBudWxsLCAxLCAxLCBQb2ludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRpYWdyYW1MaW5rRUNsYXNzLAotCQkJCURpYWdyYW1MaW5rLmNsYXNzLAotCQkJCSJEaWFncmFtTGluayIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREaWFncmFtTGlua19ab29tKCksCi0JCQkJdGhpcy5nZXREb3VibGUoKSwKLQkJCQkiem9vbSIsIG51bGwsIDEsIDEsIERpYWdyYW1MaW5rLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaWFncmFtTGlua19WaWV3cG9ydCgpLAotCQkJCXRoaXMuZ2V0UG9pbnQoKSwKLQkJCQludWxsLAotCQkJCSJ2aWV3cG9ydCIsIG51bGwsIDEsIDEsIERpYWdyYW1MaW5rLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaWFncmFtTGlua19EaWFncmFtKCksCi0JCQkJdGhpcy5nZXREaWFncmFtKCksCi0JCQkJdGhpcy5nZXREaWFncmFtX0RpYWdyYW1MaW5rKCksCi0JCQkJImRpYWdyYW0iLCBudWxsLCAxLCAxLCBEaWFncmFtTGluay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlhZ3JhbUxpbmtfR3JhcGhFbGVtZW50KCksCi0JCQkJdGhpcy5nZXRHcmFwaEVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldEdyYXBoRWxlbWVudF9MaW5rKCksCi0JCQkJImdyYXBoRWxlbWVudCIsIG51bGwsIDEsIDEsIERpYWdyYW1MaW5rLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZ3JhcGhDb25uZWN0b3JFQ2xhc3MsCi0JCQkJR3JhcGhDb25uZWN0b3IuY2xhc3MsCi0JCQkJIkdyYXBoQ29ubmVjdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWRnZSgpLAotCQkJCXRoaXMuZ2V0R3JhcGhFZGdlKCksCi0JCQkJdGhpcy5nZXRHcmFwaEVkZ2VfQW5jaG9yKCksCi0JCQkJImdyYXBoRWRnZSIsIG51bGwsIDAsIC0xLCBHcmFwaENvbm5lY3Rvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0R3JhcGhDb25uZWN0b3JfR3JhcGhFbGVtZW50KCksCi0JCQkJdGhpcy5nZXRHcmFwaEVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldEdyYXBoRWxlbWVudF9BbmNob3JhZ2UoKSwKLQkJCQkiZ3JhcGhFbGVtZW50IiwgbnVsbCwgMSwgMSwgR3JhcGhDb25uZWN0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlncmFwaEVkZ2VFQ2xhc3MsCi0JCQkJR3JhcGhFZGdlLmNsYXNzLAotCQkJCSJHcmFwaEVkZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0R3JhcGhFZGdlX1dheXBvaW50cygpLAotCQkJCXRoaXMuZ2V0UG9pbnQoKSwKLQkJCQludWxsLAotCQkJCSJ3YXlwb2ludHMiLCBudWxsLCAyLCAtMSwgR3JhcGhFZGdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEdyYXBoRWRnZV9BbmNob3IoKSwKLQkJCQl0aGlzLmdldEdyYXBoQ29ubmVjdG9yKCksCi0JCQkJdGhpcy5nZXRHcmFwaENvbm5lY3Rvcl9HcmFwaEVkZ2UoKSwKLQkJCQkiYW5jaG9yIiwgbnVsbCwgMiwgMiwgR3JhcGhFZGdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJc2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcywKLQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLAotCQkJCSJTZW1hbnRpY01vZGVsQnJpZGdlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9QcmVzZW50YXRpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwcmVzZW50YXRpb24iLCAiIiwgMCwgMSwgU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRTZW1hbnRpY01vZGVsQnJpZGdlX0RpYWdyYW0oKSwKLQkJCQl0aGlzLmdldERpYWdyYW0oKSwKLQkJCQl0aGlzLmdldERpYWdyYW1fTmFtZXNwYWNlKCksCi0JCQkJImRpYWdyYW0iLCBudWxsLCAwLCAxLCBTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRTZW1hbnRpY01vZGVsQnJpZGdlX0dyYXBoRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0R3JhcGhFbGVtZW50KCksCi0JCQkJdGhpcy5nZXRHcmFwaEVsZW1lbnRfU2VtYW50aWNNb2RlbCgpLAotCQkJCSJncmFwaEVsZW1lbnQiLCBudWxsLCAwLCAxLCBTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGltZW5zaW9uRUNsYXNzLAotCQkJCURpbWVuc2lvbi5jbGFzcywKLQkJCQkiRGltZW5zaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERpbWVuc2lvbl9XaWR0aCgpLAotCQkJCXRoaXMuZ2V0RG91YmxlKCksCi0JCQkJIndpZHRoIiwgbnVsbCwgMSwgMSwgRGltZW5zaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREaW1lbnNpb25fSGVpZ2h0KCksCi0JCQkJdGhpcy5nZXREb3VibGUoKSwKLQkJCQkiaGVpZ2h0IiwgbnVsbCwgMSwgMSwgRGltZW5zaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcywKLQkJCQlQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmNsYXNzLAotCQkJCSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKSwKLQkJCQl0aGlzLmdldFRhc2tEZXNjcmlwdG9yKCksCi0JCQkJbnVsbCwKLQkJCQkiaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMiLCBudWxsLCAwLCAtMSwgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZUlPKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJpbnRlcmZhY2VJTyIsIG51bGwsIDAsIC0xLCBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEVDbGFzcywKLQkJCQlTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5jbGFzcywKLQkJCQkiU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0U2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfVHlwZUluZm8oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJ0eXBlSW5mbyIsICIiLCAwLCAxLCBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJdW1hU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcywKLQkJCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLAotCQkJCSJVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFVNQVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpLAotCQkJCW51bGwsCi0JCQkJImVsZW1lbnQiLCBudWxsLCAxLCAxLCBVTUFTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJY29yZVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MsCi0JCQkJQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsCi0JCQkJIkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvcmVTZW1hbnRpY01vZGVsQnJpZGdlX0VsZW1lbnQoKSwKLQkJCQl0aGlzLmdldEVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJlbGVtZW50IiwgbnVsbCwgMSwgMSwgQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlsZWFmRWxlbWVudEVDbGFzcywKLQkJCQlMZWFmRWxlbWVudC5jbGFzcywKLQkJCQkiTGVhZkVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJdGV4dEVsZW1lbnRFQ2xhc3MsCi0JCQkJVGV4dEVsZW1lbnQuY2xhc3MsCi0JCQkJIlRleHRFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFRleHRFbGVtZW50X1RleHQoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJ0ZXh0IiwgIiIsIDAsIDEsIFRleHRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlpbWFnZUVDbGFzcywKLQkJCQlJbWFnZS5jbGFzcywKLQkJCQkiSW1hZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0SW1hZ2VfVXJpKCksCi0JCQkJdGhpcy5nZXRVcmkoKSwKLQkJCQkidXJpIiwgbnVsbCwgMCwgMSwgSW1hZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEltYWdlX01pbWVUeXBlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkibWltZVR5cGUiLCAiIiwgMCwgMSwgSW1hZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCWdyYXBoaWNQcmltaXRpdmVFQ2xhc3MsCi0JCQkJR3JhcGhpY1ByaW1pdGl2ZS5jbGFzcywKLQkJCQkiR3JhcGhpY1ByaW1pdGl2ZSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwb2x5bGluZUVDbGFzcywKLQkJCQlQb2x5bGluZS5jbGFzcywKLQkJCQkiUG9seWxpbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UG9seWxpbmVfQ2xvc2VkKCksCi0JCQkJdGhpcy5nZXRCb29sZWFuKCksCi0JCQkJImNsb3NlZCIsICJ0cnVlIiwgMSwgMSwgUG9seWxpbmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UG9seWxpbmVfV2F5cG9pbnRzKCksCi0JCQkJdGhpcy5nZXRQb2ludCgpLAotCQkJCW51bGwsCi0JCQkJIndheXBvaW50cyIsIG51bGwsIDIsIC0xLCBQb2x5bGluZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZWxsaXBzZUVDbGFzcywKLQkJCQlFbGxpcHNlLmNsYXNzLAotCQkJCSJFbGxpcHNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEVsbGlwc2VfQ2VudGVyKCksCi0JCQkJdGhpcy5nZXRQb2ludCgpLAotCQkJCW51bGwsCi0JCQkJImNlbnRlciIsIG51bGwsIDEsIDEsIEVsbGlwc2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEVsbGlwc2VfUmFkaXVzWCgpLAotCQkJCXRoaXMuZ2V0RG91YmxlKCksCi0JCQkJInJhZGl1c1giLCBudWxsLCAxLCAxLCBFbGxpcHNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRFbGxpcHNlX1JhZGl1c1koKSwKLQkJCQl0aGlzLmdldERvdWJsZSgpLAotCQkJCSJyYWRpdXNZIiwgbnVsbCwgMSwgMSwgRWxsaXBzZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RWxsaXBzZV9Sb3RhdGlvbigpLAotCQkJCXRoaXMuZ2V0RG91YmxlKCksCi0JCQkJInJvdGF0aW9uIiwgbnVsbCwgMSwgMSwgRWxsaXBzZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RWxsaXBzZV9TdGFydEFuZ2xlKCksCi0JCQkJdGhpcy5nZXREb3VibGUoKSwKLQkJCQkic3RhcnRBbmdsZSIsIG51bGwsIDEsIDEsIEVsbGlwc2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEVsbGlwc2VfRW5kQW5nbGUoKSwKLQkJCQl0aGlzLmdldERvdWJsZSgpLAotCQkJCSJlbmRBbmdsZSIsIG51bGwsIDEsIDEsIEVsbGlwc2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcm9jZXNzRmFtaWx5RUNsYXNzLAotCQkJCVByb2Nlc3NGYW1pbHkuY2xhc3MsCi0JCQkJIlByb2Nlc3NGYW1pbHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc0ZhbWlseV9EZWxpdmVyeVByb2Nlc3NlcygpLAotCQkJCXRoaXMuZ2V0RGVsaXZlcnlQcm9jZXNzKCksCi0JCQkJbnVsbCwKLQkJCQkiZGVsaXZlcnlQcm9jZXNzZXMiLCBudWxsLCAwLCAtMSwgUHJvY2Vzc0ZhbWlseS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCW1ldGhvZExpYnJhcnlFQ2xhc3MsCi0JCQkJTWV0aG9kTGlicmFyeS5jbGFzcywKLQkJCQkiTWV0aG9kTGlicmFyeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbnMoKSwKLQkJCQl0aGlzLmdldE1ldGhvZFBsdWdpbigpLAotCQkJCW51bGwsCi0JCQkJIm1ldGhvZFBsdWdpbnMiLCBudWxsLCAwLCAtMSwgTWV0aG9kTGlicmFyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RMaWJyYXJ5X1ByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLAotCQkJCXRoaXMuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLAotCQkJCW51bGwsCi0JCQkJInByZWRlZmluZWRDb25maWd1cmF0aW9ucyIsIG51bGwsIDAsIC0xLCBNZXRob2RMaWJyYXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuY2xhc3MsCi0JCQkJIlZhcmlhYmlsaXR5VHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLk5BKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sCi0JCQkJVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTik7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19SRVBMQUNFUyk7Ci0KLQkJaW5pdEVFbnVtKHdvcmtPcmRlclR5cGVFRW51bSwgV29ya09yZGVyVHlwZS5jbGFzcywgIldvcmtPcmRlclR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwod29ya09yZGVyVHlwZUVFbnVtLCBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh3b3JrT3JkZXJUeXBlRUVudW0sIFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX0ZJTklTSCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh3b3JrT3JkZXJUeXBlRUVudW0sIFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fU1RBUlQpOwotCQlhZGRFRW51bUxpdGVyYWwod29ya09yZGVyVHlwZUVFbnVtLCBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX0ZJTklTSCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCi0JCWluaXRFRGF0YVR5cGUoc3RyaW5nRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsCi0JCQkJIlN0cmluZyIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShib29sZWFuRURhdGFUeXBlLCBCb29sZWFuLmNsYXNzLAotCQkJCSJCb29sZWFuIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGRhdGVFRGF0YVR5cGUsIERhdGUuY2xhc3MsCi0JCQkJIkRhdGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUodXJpRURhdGFUeXBlLCBqYXZhLm5ldC5VUkkuY2xhc3MsCi0JCQkJIlVyaSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShzZXRFRGF0YVR5cGUsIFNldC5jbGFzcywKLQkJCQkiU2V0IiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHNlcXVlbmNlRURhdGFUeXBlLCBMaXN0LmNsYXNzLAotCQkJCSJTZXF1ZW5jZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShpbnRlZ2VyRURhdGFUeXBlLCBpbnQuY2xhc3MsCi0JCQkJIkludGVnZXIiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoZG91YmxlRURhdGFUeXBlLCBEb3VibGUuY2xhc3MsCi0JCQkJIkRvdWJsZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19IC8vVW1hUGFja2FnZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVmFyaWFiaWxpdHlFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1ZhcmlhYmlsaXR5RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM5ZjJjOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVmFyaWFiaWxpdHlFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYXJpYWJpbGl0eSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVmFyaWFiaWxpdHlFbGVtZW50SW1wbCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5WYXJpYWJpbGl0eUVsZW1lbnRJbXBsI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYXJpYWJpbGl0eUVsZW1lbnRJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwKLQkJaW1wbGVtZW50cyBWYXJpYWJpbGl0eUVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5VHlwZSgpIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVmFyaWFiaWxpdHlUeXBlIFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQgPSBWYXJpYWJpbGl0eVR5cGUuTkE7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJpbGl0eUVsZW1lbnQgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJpbGl0eUVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUgbmV3VmFyaWFiaWxpdHlUeXBlKSB7Ci0JCVZhcmlhYmlsaXR5VHlwZSBvbGRWYXJpYWJpbGl0eVR5cGUgPSB2YXJpYWJpbGl0eVR5cGU7Ci0JCXZhcmlhYmlsaXR5VHlwZSA9IG5ld1ZhcmlhYmlsaXR5VHlwZSA9PSBudWxsID8gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVAotCQkJCTogbmV3VmFyaWFiaWxpdHlUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUsCi0JCQkJCW9sZFZhcmlhYmlsaXR5VHlwZSwgdmFyaWFiaWxpdHlUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5RWxlbWVudCBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlpZiAodmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCAhPSBudWxsCi0JCQkJJiYgKChFT2JqZWN0KSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IChJbnRlcm5hbEVPYmplY3QpIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZVJlc29sdmVQcm94eShvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KTsKLQkJCWlmICh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULAotCQkJCQkJCW9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQsCi0JCQkJCQkJdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eUVsZW1lbnQgYmFzaWNHZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpIHsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCXRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwKLQkJCQkJb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCwgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXNldFZhcmlhYmlsaXR5VHlwZSgoVmFyaWFiaWxpdHlUeXBlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgoVmFyaWFiaWxpdHlFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXNldFZhcmlhYmlsaXR5VHlwZShWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KChWYXJpYWJpbGl0eUVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZSAhPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmFyaWFiaWxpdHlUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHZhcmlhYmlsaXR5VHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1ZhcmlhYmlsaXR5RWxlbWVudEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9XaGl0ZXBhcGVySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1doaXRlcGFwZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Y2NiOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1doaXRlcGFwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2hpdGVwYXBlckltcGwgZXh0ZW5kcyBDb25jZXB0SW1wbCBpbXBsZW1lbnRzIFdoaXRlcGFwZXIgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdoaXRlcGFwZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XSElURVBBUEVSOwotCX0KLQotfSAvL1doaXRlcGFwZXJJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MmFlNGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtCcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBCcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCNnZXRJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0SXNPbmdvaW5nIDxlbT5JcyBPbmdvaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsI2dldElzRXZlbnREcml2ZW4gPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCNnZXRMaW5rVG9QcmVkZWNlc3NvciA8ZW0+TGluayBUbyBQcmVkZWNlc3NvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJbXBsCi0JCWltcGxlbWVudHMgV29ya0JyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzUmVwZWF0YWJsZSgpIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1JlcGVhdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19SRVBFQVRBQkxFX0VERUZBVUxUID0gQm9vbGVhbi5GQUxTRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzUmVwZWF0YWJsZSgpIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1JlcGVhdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzUmVwZWF0YWJsZSA9IElTX1JFUEVBVEFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNPbmdvaW5nKCkgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzT25nb2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX09OR09JTkdfRURFRkFVTFQgPSBCb29sZWFuLkZBTFNFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNPbmdvaW5nKCkgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzT25nb2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaXNPbmdvaW5nID0gSVNfT05HT0lOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc0V2ZW50RHJpdmVuKCkgPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNFdmVudERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX0VWRU5UX0RSSVZFTl9FREVGQVVMVCA9IEJvb2xlYW4uRkFMU0U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc0V2ZW50RHJpdmVuKCkgPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNFdmVudERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaXNFdmVudERyaXZlbiA9IElTX0VWRU5UX0RSSVZFTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtUb1ByZWRlY2Vzc29yKCkgPGVtPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlua1RvUHJlZGVjZXNzb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxXb3JrT3JkZXI+IGxpbmtUb1ByZWRlY2Vzc29yOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19CUkVBS0RPV05fRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc1JlcGVhdGFibGUoKSB7Ci0JCXJldHVybiBpc1JlcGVhdGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNSZXBlYXRhYmxlKEJvb2xlYW4gbmV3SXNSZXBlYXRhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkSXNSZXBlYXRhYmxlID0gaXNSZXBlYXRhYmxlOwotCQlpc1JlcGVhdGFibGUgPSBuZXdJc1JlcGVhdGFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRSwKLQkJCQkJb2xkSXNSZXBlYXRhYmxlLCBpc1JlcGVhdGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc09uZ29pbmcoKSB7Ci0JCXJldHVybiBpc09uZ29pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNPbmdvaW5nKEJvb2xlYW4gbmV3SXNPbmdvaW5nKSB7Ci0JCUJvb2xlYW4gb2xkSXNPbmdvaW5nID0gaXNPbmdvaW5nOwotCQlpc09uZ29pbmcgPSBuZXdJc09uZ29pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORywKLQkJCQkJb2xkSXNPbmdvaW5nLCBpc09uZ29pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc0V2ZW50RHJpdmVuKCkgewotCQlyZXR1cm4gaXNFdmVudERyaXZlbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0V2ZW50RHJpdmVuKEJvb2xlYW4gbmV3SXNFdmVudERyaXZlbikgewotCQlCb29sZWFuIG9sZElzRXZlbnREcml2ZW4gPSBpc0V2ZW50RHJpdmVuOwotCQlpc0V2ZW50RHJpdmVuID0gbmV3SXNFdmVudERyaXZlbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4sCi0JCQkJCW9sZElzRXZlbnREcml2ZW4sIGlzRXZlbnREcml2ZW4pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrT3JkZXI+IGdldExpbmtUb1ByZWRlY2Vzc29yKCkgewotCQlpZiAobGlua1RvUHJlZGVjZXNzb3IgPT0gbnVsbCkgewotCQkJbGlua1RvUHJlZGVjZXNzb3IgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtPcmRlcj4oCi0JCQkJCVdvcmtPcmRlci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SKTsKLQkJfQotCQlyZXR1cm4gbGlua1RvUHJlZGVjZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRToKLQkJCXJldHVybiBnZXRJc1JlcGVhdGFibGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc6Ci0JCQlyZXR1cm4gZ2V0SXNPbmdvaW5nKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQlyZXR1cm4gZ2V0SXNFdmVudERyaXZlbigpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUjoKLQkJCXJldHVybiBnZXRMaW5rVG9QcmVkZWNlc3NvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQkJc2V0SXNSZXBlYXRhYmxlKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQkJc2V0SXNPbmdvaW5nKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQlzZXRJc0V2ZW50RHJpdmVuKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SOgotCQkJZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5jbGVhcigpOwotCQkJZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrT3JkZXI+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRToKLQkJCXNldElzUmVwZWF0YWJsZShJU19SRVBFQVRBQkxFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc6Ci0JCQlzZXRJc09uZ29pbmcoSVNfT05HT0lOR19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQlzZXRJc0V2ZW50RHJpdmVuKElTX0VWRU5UX0RSSVZFTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SOgotCQkJZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQkJcmV0dXJuIElTX1JFUEVBVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IGlzUmVwZWF0YWJsZSAhPSBudWxsCi0JCQkJCTogIUlTX1JFUEVBVEFCTEVfRURFRkFVTFQuZXF1YWxzKGlzUmVwZWF0YWJsZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQkJcmV0dXJuIElTX09OR09JTkdfRURFRkFVTFQgPT0gbnVsbCA/IGlzT25nb2luZyAhPSBudWxsCi0JCQkJCTogIUlTX09OR09JTkdfRURFRkFVTFQuZXF1YWxzKGlzT25nb2luZyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQlyZXR1cm4gSVNfRVZFTlRfRFJJVkVOX0VERUZBVUxUID09IG51bGwgPyBpc0V2ZW50RHJpdmVuICE9IG51bGwKLQkJCQkJOiAhSVNfRVZFTlRfRFJJVkVOX0VERUZBVUxULmVxdWFscyhpc0V2ZW50RHJpdmVuKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1I6Ci0JCQlyZXR1cm4gbGlua1RvUHJlZGVjZXNzb3IgIT0gbnVsbCAmJiAhbGlua1RvUHJlZGVjZXNzb3IuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzUmVwZWF0YWJsZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpc1JlcGVhdGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzT25nb2luZzogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpc09uZ29pbmcpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzRXZlbnREcml2ZW46ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNFdmVudERyaXZlbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dvcmtCcmVha2Rvd25FbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtEZWZpbml0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtEZWZpbml0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2NjNjE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrRGVmaW5pdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBEZWZpbml0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXb3JrRGVmaW5pdGlvbkltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVdvcmtEZWZpbml0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNvbmRpdGlvbigpIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnQgcHJlY29uZGl0aW9uOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdGNvbmRpdGlvbigpIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29uc3RyYWludCBwb3N0Y29uZGl0aW9uOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtEZWZpbml0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFByZWNvbmRpdGlvbigpIHsKLQkJaWYgKHByZWNvbmRpdGlvbiAhPSBudWxsICYmICgoRU9iamVjdCkgcHJlY29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJlY29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcHJlY29uZGl0aW9uOwotCQkJcHJlY29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUHJlY29uZGl0aW9uKTsKLQkJCWlmIChwcmVjb25kaXRpb24gIT0gb2xkUHJlY29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1ByZWNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbjsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkUHJlY29uZGl0aW9uLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiwKLQkJCQkJCW51bGwsIG51bGwpOwotCQkJCWlmIChuZXdQcmVjb25kaXRpb24uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3UHJlY29uZGl0aW9uLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJLSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OLAotCQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OLAotCQkJCQkJCW9sZFByZWNvbmRpdGlvbiwgcHJlY29uZGl0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBiYXNpY0dldFByZWNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcmVjb25kaXRpb24oQ29uc3RyYWludCBuZXdQcmVjb25kaXRpb24sCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnN0cmFpbnQgb2xkUHJlY29uZGl0aW9uID0gcHJlY29uZGl0aW9uOwotCQlwcmVjb25kaXRpb24gPSBuZXdQcmVjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sCi0JCQkJCW9sZFByZWNvbmRpdGlvbiwgbmV3UHJlY29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWNvbmRpdGlvbihDb25zdHJhaW50IG5ld1ByZWNvbmRpdGlvbikgewotCQlpZiAobmV3UHJlY29uZGl0aW9uICE9IHByZWNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByZWNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3UHJlY29uZGl0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFByZWNvbmRpdGlvbihuZXdQcmVjb25kaXRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OLCBuZXdQcmVjb25kaXRpb24sCi0JCQkJCW5ld1ByZWNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFBvc3Rjb25kaXRpb24oKSB7Ci0JCWlmIChwb3N0Y29uZGl0aW9uICE9IG51bGwgJiYgKChFT2JqZWN0KSBwb3N0Y29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUG9zdGNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb247Ci0JCQlwb3N0Y29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUG9zdGNvbmRpdGlvbik7Ci0JCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBvbGRQb3N0Y29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1Bvc3Rjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwb3N0Y29uZGl0aW9uOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQb3N0Y29uZGl0aW9uLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04sCi0JCQkJCQludWxsLCBudWxsKTsKLQkJCQlpZiAobmV3UG9zdGNvbmRpdGlvbi5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdQb3N0Y29uZGl0aW9uCi0JCQkJCQkJLmVJbnZlcnNlQWRkKAotCQkJCQkJCQkJdGhpcywKLQkJCQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJCQkJLSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiwKLQkJCQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiwKLQkJCQkJCQlvbGRQb3N0Y29uZGl0aW9uLCBwb3N0Y29uZGl0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBvc3Rjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgYmFzaWNHZXRQb3N0Y29uZGl0aW9uKCkgewotCQlyZXR1cm4gcG9zdGNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQb3N0Y29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UG9zdGNvbmRpdGlvbiwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ29uc3RyYWludCBvbGRQb3N0Y29uZGl0aW9uID0gcG9zdGNvbmRpdGlvbjsKLQkJcG9zdGNvbmRpdGlvbiA9IG5ld1Bvc3Rjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLAotCQkJCQlvbGRQb3N0Y29uZGl0aW9uLCBuZXdQb3N0Y29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3Rjb25kaXRpb24oQ29uc3RyYWludCBuZXdQb3N0Y29uZGl0aW9uKSB7Ci0JCWlmIChuZXdQb3N0Y29uZGl0aW9uICE9IHBvc3Rjb25kaXRpb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBvc3Rjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04sCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQb3N0Y29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQb3N0Y29uZGl0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQb3N0Y29uZGl0aW9uKG5ld1Bvc3Rjb25kaXRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiwKLQkJCQkJbmV3UG9zdGNvbmRpdGlvbiwgbmV3UG9zdGNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFByZWNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFBvc3Rjb25kaXRpb24obnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFByZWNvbmRpdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UHJlY29uZGl0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UG9zdGNvbmRpdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjoKLQkJCXNldFByZWNvbmRpdGlvbigoQ29uc3RyYWludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJc2V0UG9zdGNvbmRpdGlvbigoQ29uc3RyYWludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJc2V0UHJlY29uZGl0aW9uKChDb25zdHJhaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCXNldFBvc3Rjb25kaXRpb24oKENvbnN0cmFpbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBwcmVjb25kaXRpb24gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCXJldHVybiBwb3N0Y29uZGl0aW9uICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1dvcmtEZWZpbml0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtPcmRlckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrT3JkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMmE1YjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtPcmRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBPcmRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtPcmRlckltcGwjZ2V0TGlua1R5cGUgPGVtPkxpbmsgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtPcmRlckltcGwjZ2V0UHJlZCA8ZW0+UHJlZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtPcmRlckltcGwgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEltcGwgaW1wbGVtZW50cyBXb3JrT3JkZXIgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtUeXBlKCkgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgV29ya09yZGVyVHlwZSBMSU5LX1RZUEVfRURFRkFVTFQgPSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtUeXBlKCkgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrT3JkZXJUeXBlIGxpbmtUeXBlID0gTElOS19UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZCgpIDxlbT5QcmVkPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrT3JkZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX09SREVSOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrT3JkZXJUeXBlIGdldExpbmtUeXBlKCkgewotCQlyZXR1cm4gbGlua1R5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZSBuZXdMaW5rVHlwZSkgewotCQlXb3JrT3JkZXJUeXBlIG9sZExpbmtUeXBlID0gbGlua1R5cGU7Ci0JCWxpbmtUeXBlID0gbmV3TGlua1R5cGUgPT0gbnVsbCA/IExJTktfVFlQRV9FREVGQVVMVCA6IG5ld0xpbmtUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRSwgb2xkTGlua1R5cGUsIGxpbmtUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtCcmVha2Rvd25FbGVtZW50IGdldFByZWQoKSB7Ci0JCWlmIChwcmVkICE9IG51bGwgJiYgKChFT2JqZWN0KSBwcmVkKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJlZCA9IChJbnRlcm5hbEVPYmplY3QpIHByZWQ7Ci0JCQlwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBlUmVzb2x2ZVByb3h5KG9sZFByZWQpOwotCQkJaWYgKHByZWQgIT0gb2xkUHJlZCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5XT1JLX09SREVSX19QUkVELCBvbGRQcmVkLCBwcmVkKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtCcmVha2Rvd25FbGVtZW50IGJhc2ljR2V0UHJlZCgpIHsKLQkJcmV0dXJuIHByZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZChXb3JrQnJlYWtkb3duRWxlbWVudCBuZXdQcmVkKSB7Ci0JCVdvcmtCcmVha2Rvd25FbGVtZW50IG9sZFByZWQgPSBwcmVkOwotCQlwcmVkID0gbmV3UHJlZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX09SREVSX19QUkVELCBvbGRQcmVkLCBwcmVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFOgotCQkJcmV0dXJuIGdldExpbmtUeXBlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19QUkVEOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFByZWQoKTsKLQkJCXJldHVybiBiYXNpY0dldFByZWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFOgotCQkJc2V0TGlua1R5cGUoKFdvcmtPcmRlclR5cGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX1BSRUQ6Ci0JCQlzZXRQcmVkKChXb3JrQnJlYWtkb3duRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRToKLQkJCXNldExpbmtUeXBlKExJTktfVFlQRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19QUkVEOgotCQkJc2V0UHJlZCgoV29ya0JyZWFrZG93bkVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19MSU5LX1RZUEU6Ci0JCQlyZXR1cm4gbGlua1R5cGUgIT0gTElOS19UWVBFX0VERUZBVUxUOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fUFJFRDoKLQkJCXJldHVybiBwcmVkICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobGlua1R5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobGlua1R5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrT3JkZXJJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDM2OTU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCNnZXRJbXBhY3RPZk5vdEhhdmluZyA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCNnZXRSZWFzb25zRm9yTm90TmVlZGluZyA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwKLQkJaW1wbGVtZW50cyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVUlBPU0VfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1cnBvc2UoKSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwdXJwb3NlID0gUFVSUE9TRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBhY3RPZk5vdEhhdmluZygpIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBhY3RPZk5vdEhhdmluZygpIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaW1wYWN0T2ZOb3RIYXZpbmcgPSBJTVBBQ1RfT0ZfTk9UX0hBVklOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWFzb25zRm9yTm90TmVlZGluZygpIDxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWFzb25zRm9yTm90TmVlZGluZygpIDxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVhc29uc0Zvck5vdE5lZWRpbmcgPSBSRUFTT05TX0ZPUl9OT1RfTkVFRElOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVycG9zZSgpIHsKLQkJcmV0dXJuIHB1cnBvc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVycG9zZShTdHJpbmcgbmV3UHVycG9zZSkgewotCQlTdHJpbmcgb2xkUHVycG9zZSA9IHB1cnBvc2U7Ci0JCXB1cnBvc2UgPSBuZXdQdXJwb3NlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRSwgb2xkUHVycG9zZSwKLQkJCQkJcHVycG9zZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKSB7Ci0JCXJldHVybiBpbXBhY3RPZk5vdEhhdmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbXBhY3RPZk5vdEhhdmluZyhTdHJpbmcgbmV3SW1wYWN0T2ZOb3RIYXZpbmcpIHsKLQkJU3RyaW5nIG9sZEltcGFjdE9mTm90SGF2aW5nID0gaW1wYWN0T2ZOb3RIYXZpbmc7Ci0JCWltcGFjdE9mTm90SGF2aW5nID0gbmV3SW1wYWN0T2ZOb3RIYXZpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORywKLQkJCQkJb2xkSW1wYWN0T2ZOb3RIYXZpbmcsIGltcGFjdE9mTm90SGF2aW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZWFzb25zRm9yTm90TmVlZGluZygpIHsKLQkJcmV0dXJuIHJlYXNvbnNGb3JOb3ROZWVkaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYXNvbnNGb3JOb3ROZWVkaW5nKFN0cmluZyBuZXdSZWFzb25zRm9yTm90TmVlZGluZykgewotCQlTdHJpbmcgb2xkUmVhc29uc0Zvck5vdE5lZWRpbmcgPSByZWFzb25zRm9yTm90TmVlZGluZzsKLQkJcmVhc29uc0Zvck5vdE5lZWRpbmcgPSBuZXdSZWFzb25zRm9yTm90TmVlZGluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCXRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORywKLQkJCQkJb2xkUmVhc29uc0Zvck5vdE5lZWRpbmcsIHJlYXNvbnNGb3JOb3ROZWVkaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJcmV0dXJuIGdldFB1cnBvc2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkc6Ci0JCQlyZXR1cm4gZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc6Ci0JCQlyZXR1cm4gZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJc2V0UHVycG9zZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOgotCQkJc2V0SW1wYWN0T2ZOb3RIYXZpbmcoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORzoKLQkJCXNldFJlYXNvbnNGb3JOb3ROZWVkaW5nKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlzZXRQdXJwb3NlKFBVUlBPU0VfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzoKLQkJCXNldEltcGFjdE9mTm90SGF2aW5nKElNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc6Ci0JCQlzZXRSZWFzb25zRm9yTm90TmVlZGluZyhSRUFTT05TX0ZPUl9OT1RfTkVFRElOR19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXJldHVybiBQVVJQT1NFX0VERUZBVUxUID09IG51bGwgPyBwdXJwb3NlICE9IG51bGwKLQkJCQkJOiAhUFVSUE9TRV9FREVGQVVMVC5lcXVhbHMocHVycG9zZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOgotCQkJcmV0dXJuIElNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxUID09IG51bGwgPyBpbXBhY3RPZk5vdEhhdmluZyAhPSBudWxsCi0JCQkJCTogIUlNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxULmVxdWFscyhpbXBhY3RPZk5vdEhhdmluZyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOgotCQkJcmV0dXJuIFJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxUID09IG51bGwgPyByZWFzb25zRm9yTm90TmVlZGluZyAhPSBudWxsCi0JCQkJCTogIVJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhyZWFzb25zRm9yTm90TmVlZGluZyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHVycG9zZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwdXJwb3NlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbXBhY3RPZk5vdEhhdmluZzogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpbXBhY3RPZk5vdEhhdmluZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVhc29uc0Zvck5vdE5lZWRpbmc6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocmVhc29uc0Zvck5vdE5lZWRpbmcpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ODExYWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0QWN0aXZpdHlFeGl0U3RhdGUgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldEltcGFjdGVkQnkgPGVtPkltcGFjdGVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXRJbXBhY3RzIDxlbT5JbXBhY3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXREZWxpdmVyYWJsZVBhcnRzIDxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwgZXh0ZW5kcyBEZXNjcmlwdG9ySW1wbCBpbXBsZW1lbnRzCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkgPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RW50cnlTdGF0ZSgpIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFjdGl2aXR5RW50cnlTdGF0ZSA9IEFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUWV9FWElUX1NUQVRFX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFjdGl2aXR5RXhpdFN0YXRlID0gQUNUSVZJVFlfRVhJVF9TVEFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtQcm9kdWN0KCkgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdCB3b3JrUHJvZHVjdDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltcGFjdGVkQnkoKSA8ZW0+SW1wYWN0ZWQgQnk8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW1wYWN0ZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gaW1wYWN0ZWRCeTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltcGFjdHMoKSA8ZW0+SW1wYWN0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbXBhY3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBpbXBhY3RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVsaXZlcmFibGVQYXJ0cygpIDxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWxpdmVyYWJsZVBhcnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBkZWxpdmVyYWJsZVBhcnRzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkgewotCQlyZXR1cm4gYWN0aXZpdHlFbnRyeVN0YXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2aXR5RW50cnlTdGF0ZShTdHJpbmcgbmV3QWN0aXZpdHlFbnRyeVN0YXRlKSB7Ci0JCVN0cmluZyBvbGRBY3Rpdml0eUVudHJ5U3RhdGUgPSBhY3Rpdml0eUVudHJ5U3RhdGU7Ci0JCWFjdGl2aXR5RW50cnlTdGF0ZSA9IG5ld0FjdGl2aXR5RW50cnlTdGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEUsCi0JCQkJCW9sZEFjdGl2aXR5RW50cnlTdGF0ZSwgYWN0aXZpdHlFbnRyeVN0YXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RXhpdFN0YXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2aXR5RXhpdFN0YXRlKFN0cmluZyBuZXdBY3Rpdml0eUV4aXRTdGF0ZSkgewotCQlTdHJpbmcgb2xkQWN0aXZpdHlFeGl0U3RhdGUgPSBhY3Rpdml0eUV4aXRTdGF0ZTsKLQkJYWN0aXZpdHlFeGl0U3RhdGUgPSBuZXdBY3Rpdml0eUV4aXRTdGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURSwKLQkJCQkJb2xkQWN0aXZpdHlFeGl0U3RhdGUsIGFjdGl2aXR5RXhpdFN0YXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0IGdldFdvcmtQcm9kdWN0KCkgewotCQlpZiAod29ya1Byb2R1Y3QgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHdvcmtQcm9kdWN0KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkV29ya1Byb2R1Y3QgPSAoSW50ZXJuYWxFT2JqZWN0KSB3b3JrUHJvZHVjdDsKLQkJCXdvcmtQcm9kdWN0ID0gKFdvcmtQcm9kdWN0KSBlUmVzb2x2ZVByb3h5KG9sZFdvcmtQcm9kdWN0KTsKLQkJCWlmICh3b3JrUHJvZHVjdCAhPSBvbGRXb3JrUHJvZHVjdCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNULAotCQkJCQkJCW9sZFdvcmtQcm9kdWN0LCB3b3JrUHJvZHVjdCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB3b3JrUHJvZHVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3QgYmFzaWNHZXRXb3JrUHJvZHVjdCgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtQcm9kdWN0KFdvcmtQcm9kdWN0IG5ld1dvcmtQcm9kdWN0KSB7Ci0JCVdvcmtQcm9kdWN0IG9sZFdvcmtQcm9kdWN0ID0gd29ya1Byb2R1Y3Q7Ci0JCXdvcmtQcm9kdWN0ID0gbmV3V29ya1Byb2R1Y3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVCwKLQkJCQkJb2xkV29ya1Byb2R1Y3QsIHdvcmtQcm9kdWN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXRJbXBhY3RlZEJ5KCkgewotCQlpZiAoaW1wYWN0ZWRCeSA9PSBudWxsKSB7Ci0JCQlpbXBhY3RlZEJ5ID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0Lk1hbnlJbnZlcnNlPFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4oCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlksCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFMpOwotCQl9Ci0JCXJldHVybiBpbXBhY3RlZEJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0SW1wYWN0cygpIHsKLQkJaWYgKGltcGFjdHMgPT0gbnVsbCkgewotCQkJaW1wYWN0cyA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdC5NYW55SW52ZXJzZTxXb3JrUHJvZHVjdERlc2NyaXB0b3I+KAotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFMsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZKTsKLQkJfQotCQlyZXR1cm4gaW1wYWN0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldERlbGl2ZXJhYmxlUGFydHMoKSB7Ci0JCWlmIChkZWxpdmVyYWJsZVBhcnRzID09IG51bGwpIHsKLQkJCWRlbGl2ZXJhYmxlUGFydHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4oCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFMpOwotCQl9Ci0JCXJldHVybiBkZWxpdmVyYWJsZVBhcnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PEludGVybmFsRU9iamVjdD4pIChJbnRlcm5hbEVMaXN0PD8+KSBnZXRJbXBhY3RlZEJ5KCkpCi0JCQkJCS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikgKEludGVybmFsRUxpc3Q8Pz4pIGdldEltcGFjdHMoKSkKLQkJCQkJLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldEltcGFjdGVkQnkoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRJbXBhY3RzKCkpCi0JCQkJCS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJCXJldHVybiBnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJcmV0dXJuIGdldEFjdGl2aXR5RXhpdFN0YXRlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFdvcmtQcm9kdWN0KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRXb3JrUHJvZHVjdCgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZOgotCQkJcmV0dXJuIGdldEltcGFjdGVkQnkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJcmV0dXJuIGdldEltcGFjdHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUzoKLQkJCXJldHVybiBnZXREZWxpdmVyYWJsZVBhcnRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJCXNldEFjdGl2aXR5RW50cnlTdGF0ZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURToKLQkJCXNldEFjdGl2aXR5RXhpdFN0YXRlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1Q6Ci0JCQlzZXRXb3JrUHJvZHVjdCgoV29ya1Byb2R1Y3QpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWToKLQkJCWdldEltcGFjdGVkQnkoKS5jbGVhcigpOwotCQkJZ2V0SW1wYWN0ZWRCeSgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJZ2V0SW1wYWN0cygpLmNsZWFyKCk7Ci0JCQlnZXRJbXBhY3RzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTOgotCQkJZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmNsZWFyKCk7Ci0JCQlnZXREZWxpdmVyYWJsZVBhcnRzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJCXNldEFjdGl2aXR5RW50cnlTdGF0ZShBQ1RJVklUWV9FTlRSWV9TVEFURV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURToKLQkJCXNldEFjdGl2aXR5RXhpdFN0YXRlKEFDVElWSVRZX0VYSVRfU1RBVEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVDoKLQkJCXNldFdvcmtQcm9kdWN0KChXb3JrUHJvZHVjdCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQlnZXRJbXBhY3RlZEJ5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJZ2V0SW1wYWN0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFM6Ci0JCQlnZXREZWxpdmVyYWJsZVBhcnRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQkJcmV0dXJuIEFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxUID09IG51bGwgPyBhY3Rpdml0eUVudHJ5U3RhdGUgIT0gbnVsbAotCQkJCQk6ICFBQ1RJVklUWV9FTlRSWV9TVEFURV9FREVGQVVMVC5lcXVhbHMoYWN0aXZpdHlFbnRyeVN0YXRlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJcmV0dXJuIEFDVElWSVRZX0VYSVRfU1RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGFjdGl2aXR5RXhpdFN0YXRlICE9IG51bGwKLQkJCQkJOiAhQUNUSVZJVFlfRVhJVF9TVEFURV9FREVGQVVMVC5lcXVhbHMoYWN0aXZpdHlFeGl0U3RhdGUpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVDoKLQkJCXJldHVybiB3b3JrUHJvZHVjdCAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZOgotCQkJcmV0dXJuIGltcGFjdGVkQnkgIT0gbnVsbCAmJiAhaW1wYWN0ZWRCeS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUzoKLQkJCXJldHVybiBpbXBhY3RzICE9IG51bGwgJiYgIWltcGFjdHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTOgotCQkJcmV0dXJuIGRlbGl2ZXJhYmxlUGFydHMgIT0gbnVsbCAmJiAhZGVsaXZlcmFibGVQYXJ0cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWN0aXZpdHlFbnRyeVN0YXRlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGFjdGl2aXR5RW50cnlTdGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0aXZpdHlFeGl0U3RhdGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYWN0aXZpdHlFeGl0U3RhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3RJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZjAwOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0RnVsZmlsbHMgPGVtPkZ1bGZpbGxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsI2dldFJlcG9ydHMgPGVtPlJlcG9ydHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0VGVtcGxhdGVzIDxlbT5UZW1wbGF0ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0VG9vbE1lbnRvcnMgPGVtPlRvb2wgTWVudG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdEltcGwgZXh0ZW5kcyBDb250ZW50RWxlbWVudEltcGwgaW1wbGVtZW50cyBXb3JrUHJvZHVjdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGdWxmaWxscygpIDxlbT5GdWxmaWxsczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGdWxmaWxscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gZnVsZmlsbHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXBvcnRzKCkgPGVtPlJlcG9ydHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVwb3J0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFJlcG9ydD4gcmVwb3J0czsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRlbXBsYXRlcygpIDxlbT5UZW1wbGF0ZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGVtcGxhdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8VGVtcGxhdGU+IHRlbXBsYXRlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvb2xNZW50b3JzKCkgPGVtPlRvb2wgTWVudG9yczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb29sTWVudG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFRvb2xNZW50b3I+IHRvb2xNZW50b3JzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPiBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RnVsZmlsbGFibGVFbGVtZW50PiBnZXRGdWxmaWxscygpIHsKLQkJaWYgKGZ1bGZpbGxzID09IG51bGwpIHsKLQkJCWZ1bGZpbGxzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+KAotCQkJCQlGdWxmaWxsYWJsZUVsZW1lbnQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19GVUxGSUxMUyk7Ci0JCX0KLQkJcmV0dXJuIGZ1bGZpbGxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFJlcG9ydD4gZ2V0UmVwb3J0cygpIHsKLQkJaWYgKHJlcG9ydHMgPT0gbnVsbCkgewotCQkJcmVwb3J0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8UmVwb3J0PihSZXBvcnQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlRTKTsKLQkJfQotCQlyZXR1cm4gcmVwb3J0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxUZW1wbGF0ZT4gZ2V0VGVtcGxhdGVzKCkgewotCQlpZiAodGVtcGxhdGVzID09IG51bGwpIHsKLQkJCXRlbXBsYXRlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8VGVtcGxhdGU+KFRlbXBsYXRlLmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVEVNUExBVEVTKTsKLQkJfQotCQlyZXR1cm4gdGVtcGxhdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFRvb2xNZW50b3I+IGdldFRvb2xNZW50b3JzKCkgewotCQlpZiAodG9vbE1lbnRvcnMgPT0gbnVsbCkgewotCQkJdG9vbE1lbnRvcnMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFRvb2xNZW50b3I+KAotCQkJCQlUb29sTWVudG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTKTsKLQkJfQotCQlyZXR1cm4gdG9vbE1lbnRvcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPiBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCWlmIChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPT0gbnVsbCkgewotCQkJZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM+KAotCQkJCQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRlVMRklMTFM6Ci0JCQlyZXR1cm4gZ2V0RnVsZmlsbHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fUkVQT1JUUzoKLQkJCXJldHVybiBnZXRSZXBvcnRzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RFTVBMQVRFUzoKLQkJCXJldHVybiBnZXRUZW1wbGF0ZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTOgotCQkJcmV0dXJuIGdldFRvb2xNZW50b3JzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQlyZXR1cm4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRlVMRklMTFM6Ci0JCQlnZXRGdWxmaWxscygpLmNsZWFyKCk7Ci0JCQlnZXRGdWxmaWxscygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIEZ1bGZpbGxhYmxlRWxlbWVudD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fUkVQT1JUUzoKLQkJCWdldFJlcG9ydHMoKS5jbGVhcigpOwotCQkJZ2V0UmVwb3J0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUmVwb3J0PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19URU1QTEFURVM6Ci0JCQlnZXRUZW1wbGF0ZXMoKS5jbGVhcigpOwotCQkJZ2V0VGVtcGxhdGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUZW1wbGF0ZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTOgotCQkJZ2V0VG9vbE1lbnRvcnMoKS5jbGVhcigpOwotCQkJZ2V0VG9vbE1lbnRvcnMoKQotCQkJCQkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUb29sTWVudG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucz4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0ZVTEZJTExTOgotCQkJZ2V0RnVsZmlsbHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlRTOgotCQkJZ2V0UmVwb3J0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RFTVBMQVRFUzoKLQkJCWdldFRlbXBsYXRlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SUzoKLQkJCWdldFRvb2xNZW50b3JzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRlVMRklMTFM6Ci0JCQlyZXR1cm4gZnVsZmlsbHMgIT0gbnVsbCAmJiAhZnVsZmlsbHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlRTOgotCQkJcmV0dXJuIHJlcG9ydHMgIT0gbnVsbCAmJiAhcmVwb3J0cy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RFTVBMQVRFUzoKLQkJCXJldHVybiB0ZW1wbGF0ZXMgIT0gbnVsbCAmJiAhdGVtcGxhdGVzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTOgotCQkJcmV0dXJuIHRvb2xNZW50b3JzICE9IG51bGwgJiYgIXRvb2xNZW50b3JzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCXJldHVybiBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgIT0gbnVsbAotCQkJCQkmJiAhZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IEZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19GVUxGSUxMUzoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5GVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUzsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gRnVsZmlsbGFibGVFbGVtZW50LmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5GVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUzoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0ZVTEZJTExTOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotfSAvL1dvcmtQcm9kdWN0SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0VHlwZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrUHJvZHVjdFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMTRmM2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsI2dldFdvcmtQcm9kdWN0cyA8ZW0+V29yayBQcm9kdWN0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0VHlwZUltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMKLQkJV29ya1Byb2R1Y3RUeXBlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtQcm9kdWN0cygpIDxlbT5Xb3JrIFByb2R1Y3RzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFdvcmtQcm9kdWN0PiB3b3JrUHJvZHVjdHM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3RUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3Q+IGdldFdvcmtQcm9kdWN0cygpIHsKLQkJaWYgKHdvcmtQcm9kdWN0cyA9PSBudWxsKSB7Ci0JCQl3b3JrUHJvZHVjdHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0PigKLQkJCQkJV29ya1Byb2R1Y3QuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFMpOwotCQl9Ci0JCXJldHVybiB3b3JrUHJvZHVjdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFM6Ci0JCQlyZXR1cm4gZ2V0V29ya1Byb2R1Y3RzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1RTOgotCQkJZ2V0V29ya1Byb2R1Y3RzKCkuY2xlYXIoKTsKLQkJCWdldFdvcmtQcm9kdWN0cygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1RTOgotCQkJZ2V0V29ya1Byb2R1Y3RzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFM6Ci0JCQlyZXR1cm4gd29ya1Byb2R1Y3RzICE9IG51bGwgJiYgIXdvcmtQcm9kdWN0cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1dvcmtQcm9kdWN0VHlwZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjBmYjc1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBVTUEgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzQ0Mzg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRoZSBVTUEgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvQXNzb2NpYXRpb25IZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9Bc3NvY2lhdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTEwNDExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9Bc3NvY2lhdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciBuYXZpZ2F0aW5nIGFuZCBxdWVyeWluZyBiaWRpcmVjdGlvbmFsIGFzc29jaWF0aW9ucyBhbW9uZwotICogdGhlIG1vZGVsIG9iamVjdHMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFzc29jaWF0aW9uSGVscGVyIHsKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgZGlzY2lwbGluZXMgd2hpY2ggYSB0YXNrIGlzCi0JICogY2F0ZWdvcml6ZWQgdW5kZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgVGFza19EaXNjaXBsaW5lcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlUYXNrLmNsYXNzLAotCQkJIlRhc2tfRGlzY2lwbGluZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1Rhc2tzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHRhc2sgZGVzY3JpcHRvcnMgd2hpY2ggYXJlCi0JICogY3JlYXRlZCBmcm9tIGEgc3BlY2lmaWMgdGFzay4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBUYXNrX1Rhc2tEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlUYXNrLmNsYXNzLAotCQkJIlRhc2tfVGFza0Rlc2NyaXB0b3JzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgZG9tYWlucyB3aGljaCBhIHdvcmsgcHJvZHVjdAotCSAqIGlzIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0X0RvbWFpbnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3QuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3RfRG9tYWlucyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFza3Mgd2hpY2ggcHJvZHVjZSBhIHdvcmsKLQkgKiBwcm9kdWN0IGFzIGFuIG91dHB1dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdF9PdXRwdXRGcm9tX1Rhc2tzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0LmNsYXNzLAotCQkJIldvcmtQcm9kdWN0X091dHB1dEZyb21fVGFza3MiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrcyB3aGljaCB1c2UgYSB3b3JrCi0JICogcHJvZHVjdCBhcyBhIG1hbmRhdG9yeSBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdF9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0LmNsYXNzLAotCQkJIldvcmtQcm9kdWN0X0lucHV0VG9fVGFza3MiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHdvcmsgcHJvZHVjdCB0eXBlcyB3aGljaCBhCi0JICogd29yayBwcm9kdWN0IGlzIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0X1dvcmtQcm9kdWN0VHlwZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3QuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3RfV29ya1Byb2R1Y3RUeXBlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgcmVzcG9uc2libGUgcm9sZXMgZm9yIGEgd29yawotCSAqIHByb2R1Y3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3RfUmVzcG9uc2libGVSb2xlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrUHJvZHVjdC5jbGFzcywKLQkJCSJXb3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGVzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBkZWxpdmVyYWJsZXMgd2hpY2ggYSB3b3JrCi0JICogcHJvZHVjdCBpcyBjb250YWluZWQgaW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3RfRGVsaXZlcmFibGVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0LmNsYXNzLAotCQkJIldvcmtQcm9kdWN0X0RlbGl2ZXJhYmxlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrcyB0aGF0IHVzZSBhIHdvcmsgcHJvZHVjdAotCSAqIGFzIGFuIG9wdGlvbmFsIGlucHV0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0X09wdGlvbmFsSW5wdXRUb19UYXNrcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrUHJvZHVjdC5jbGFzcywKLQkJCSJXb3JrUHJvZHVjdF9PcHRpb25hbElucHV0VG9fVGFza3MiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JICogd2hpY2ggYXJlIGNyZWF0ZWQgZnJvbSBhIHdvcmsgcHJvZHVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdF9Xb3JrUHJvZHVjdERlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0LmNsYXNzLAotCQkJIldvcmtQcm9kdWN0X1dvcmtQcm9kdWN0RGVzY3JpcHRvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKSwgdHJ1ZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHByaW1hcnkgdGFza3Mgb2YgYSByb2xlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJvbGVfUHJpbWFyeV9UYXNrcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlLmNsYXNzLAotCQkJIlJvbGVfUHJpbWFyeV9UYXNrcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgc2Vjb25kYXJ5IHRhc2tzIG9mIGEgcm9sZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSb2xlX1NlY29uZGFyeV9UYXNrcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlLmNsYXNzLAotCQkJIlJvbGVfU2Vjb25kYXJ5X1Rhc2tzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSByb2xlIHNldHMgd2hpY2ggYSByb2xlIGlzCi0JICogY2F0ZWdvcml6ZWQgdW5kZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUm9sZV9Sb2xlU2V0cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlLmNsYXNzLAotCQkJIlJvbGVfUm9sZVNldHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGNvbXBvc2l0ZSByb2xlcyB3aGljaAotCSAqIGluY2x1ZGVzIGEgcm9sZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSb2xlX0NvbXBvc2l0ZVJvbGVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvbGUuY2xhc3MsCi0JCQkiUm9sZV9Db21wb3NpdGVSb2xlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHJvbGUgZGVzY3JpcHRvcnMgd2hpY2ggYXJlCi0JICogY3JlYXRlZCBmcm9tIGEgcm9sZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSb2xlX1JvbGVEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlLmNsYXNzLAotCQkJIlJvbGVfUm9sZURlc2NyaXB0b3JzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUm9sZSgpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgY29udGVudCBlbGVtZW50cyB3aGljaCBhCi0JICogY2hlY2tsaXN0IGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBDaGVja2xpc3RfQ29udGVudEVsZW1lbnRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUNoZWNrbGlzdC5jbGFzcywKLQkJCSJDaGVja2xpc3RfQ29udGVudEVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBhY3Rpdml0aWVzIHdoaWNoIGEgY2hlY2tsaXN0IGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIENoZWNrbGlzdF9CcmVha2Rvd25FbGVtZW50cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlDaGVja2xpc3QuY2xhc3MsCi0JCQkiQ2hlY2tsaXN0X0JyZWFrZG93bkVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3RzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGFjdGl2aXRpZXMgd2hpY2ggYSBjb25jZXB0IGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIENvbmNlcHRfQnJlYWtkb3duRWxlbWVudHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJQ29uY2VwdC5jbGFzcywKLQkJCSJDb25jZXB0X0JyZWFrZG93bkVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9Db25jZXB0cygpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgYWN0aXZpdGllcyB3aGljaCBhbiBleGFtcGxlIGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIEV4YW1wbGVfQnJlYWtkb3duRWxlbWVudHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJQ29uY2VwdC5jbGFzcywKLQkJCSJFeGFtcGxlX0JyZWFrZG93bkVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9FeGFtcGxlcygpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgYWN0aXZpdGllcyB3aGljaCBhIFJldXNhYmxlQXNzZXQgaXMKLQkgKiBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUmV1c2FibGVBc3NldF9CcmVha2Rvd25FbGVtZW50cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlDb25jZXB0LmNsYXNzLAotCQkJIlJldXNhYmxlQXNzZXRfQnJlYWtkb3duRWxlbWVudHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1JldXNhYmxlQXNzZXRzKCksIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGNvbnRlbnQgZWxlbWVudHMgd2hpY2ggYQotCSAqIGNvbmNlcHQgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIENvbmNlcHRfQ29udGVudEVsZW1lbnRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUNvbmNlcHQuY2xhc3MsCi0JCQkiQ29uY2VwdF9Db250ZW50RWxlbWVudHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBjb250ZW50IGVsZW1lbnRzIHdoaWNoIGFuCi0JICogZXhhbXBsZSBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgRXhhbXBsZV9Db250ZW50RWxlbWVudHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJRXhhbXBsZS5jbGFzcywKLQkJCSJFeGFtcGxlX0NvbnRlbnRFbGVtZW50cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGNvbnRlbnQgZWxlbWVudHMgd2hpY2ggYQotCSAqIHJlcG9ydCBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUmVwb3J0X1dvcmtQcm9kdWN0cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSZXBvcnQuY2xhc3MsCi0JCQkiUmVwb3J0X1dvcmtQcm9kdWN0cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFza3Mgd2hpY2ggYQotCSAqIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX1Rhc2tzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJlcG9ydC5jbGFzcywKLQkJCSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfVGFza3MiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgd29yayBwcm9kdWN0cyB3aGljaCBhCi0JICogRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfV29ya1Byb2R1Y3RzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJlcG9ydC5jbGFzcywKLQkJCSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfV29ya1Byb2R1Y3RzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGNvbnRlbnQgZWxlbWVudHMgd2hpY2ggYQotCSAqIHJldXNhYmxlIGFzc2V0IGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSZXVzYWJsZUFzc2V0X0NvbnRlbnRFbGVtZW50cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSZXVzYWJsZUFzc2V0LmNsYXNzLAotCQkJIlJldXNhYmxlQXNzZXRfQ29udGVudEVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGFjdGl2aXRpZXMgd2hpY2ggYSByb2FkbWFwIGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJvYWRtYXBfQWN0aXZpdGVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvYWRtYXAuY2xhc3MsCi0JCQkiUm9hZG1hcF9BY3Rpdml0ZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Sb2FkbWFwcygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBhY3Rpdml0aWVzIHdoaWNoIGEgc3VwcG9ydGluZwotCSAqIG1hdGVyaWFsIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBTdXBwb3J0aW5nTWF0ZXJpYWxfQnJlYWtkb3duRWxlbWVudHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzLAotCQkJIlN1cHBvcnRpbmdNYXRlcmlhbF9CcmVha2Rvd25FbGVtZW50cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgY29udGVudCBlbGVtZW50cyB3aGljaCBhCi0JICogc3VwcG9ydGluZyBtYXRlcmlhbCBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgU3VwcG9ydGluZ01hdGVyaWFsX0NvbnRlbnRFbGVtZW50cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwuY2xhc3MsCi0JCQkiU3VwcG9ydGluZ01hdGVyaWFsX0NvbnRlbnRFbGVtZW50cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgZGVsaXZlcnkgcHJvY2Vzc2VzIHdoaWNoIGEKLQkgKiBjb21tdW5pY2F0aW9uIHN1cHBvcnRpbmcgbWF0ZXJpYWwgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFN1cHBvcnRpbmdNYXRlcmlhbF9Db21tdW5pY2F0aW9uc19EZWxpdmVyeVByb2Nlc3NlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwuY2xhc3MsCi0JCQkiU3VwcG9ydGluZ01hdGVyaWFsX0NvbW11bmljYXRpb25zX0RlbGl2ZXJ5UHJvY2Vzc2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWxzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGRlbGl2ZXJ5IHByb2Nlc3NlcyB3aGljaCBhbgotCSAqIGVkdWNhdGlvbiBzdXBwb3J0aW5nIG1hdGVyaWFsIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBTdXBwb3J0aW5nTWF0ZXJpYWxfRWR1Y2F0aW9uX0RlbGl2ZXJ5UHJvY2Vzc2VzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywKLQkJCSJTdXBwb3J0aW5nTWF0ZXJpYWxfRWR1Y2F0aW9uX0RlbGl2ZXJ5UHJvY2Vzc2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFscygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBtZXRob2QgdW5pdHMgd2hpY2ggYQotCSAqIGNvcHlyaWdodCBzdXBwb3J0aW5nIG1hdGVyaWFsIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBTdXBwb3J0aW5nTWF0ZXJpYWxfQ29weXJpZ2h0U3RhdGVtZW50X01ldGhvZFVuaXRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywKLQkJCSJTdXBwb3J0aW5nTWF0ZXJpYWxfQ29weXJpZ2h0U3RhdGVtZW50X01ldGhvZFBsdWdpbnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBjb250ZW50IGVsZW1lbnRzIHdoaWNoIGEKLQkgKiBndWlkZWxpbmUgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIEd1aWRlbGluZV9Db250ZW50RWxlbWVudHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJR3VpZGVsaW5lLmNsYXNzLAotCQkJIkd1aWRlbGluZV9Db250ZW50RWxlbWVudHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGFjdGl2aXRpZXMgd2hpY2ggYSBndWlkZWxpbmUKLQkgKiBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgR3VpZGVsaW5lX0JyZWFrZG93bkVsZW1lbnRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUd1aWRlbGluZS5jbGFzcywKLQkJCSJHdWlkZWxpbmVfQnJlYWtkb3duRWxlbWVudHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZXMoKSwgdHJ1ZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHdvcmsgcHJvZHVjdHMgd2hpY2ggYQotCSAqIHRlbXBsYXRlIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBUZW1wbGF0ZV9Xb3JrUHJvZHVjdHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJVGVtcGxhdGUuY2xhc3MsCi0JCQkiVGVtcGxhdGVfV29ya1Byb2R1Y3RzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHRvb2wgd2hpY2ggYSB0b29sIG1lbnRvciBpcwotCSAqIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFRvb2xNZW50b3JfVG9vbHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJVG9vbE1lbnRvci5jbGFzcywKLQkJCSJUb29sTWVudG9yX1Rvb2xzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbF9Ub29sTWVudG9ycygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrcyB3aGljaCBhIHRvb2wgbWVudG9yIGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFRvb2xNZW50b3JfVGFza3MgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJVG9vbE1lbnRvci5jbGFzcywKLQkJCSJUb29sTWVudG9yX1Rhc2tzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19Ub29sTWVudG9ycygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB3b3JrIHByb2R1Y3RzIHdoaWNoIGEgdG9vbAotCSAqIG1lbnRvciBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgVG9vbE1lbnRvcl9Xb3JrUHJvZHVjdHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJVGVtcGxhdGUuY2xhc3MsCi0JCQkiVG9vbE1lbnRvcl9Xb3JrUHJvZHVjdHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9ycygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAkKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgY3VzdG9tIGNhdGVnb3JpZXMgd2hpY2ggYQotCSAqIGRlc2NyaWJhYmxlIGVsZW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIERlc2NyaWJhYmxlRWxlbWVudF9DdXN0b21DYXRlZ29yaWVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCURlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywKLQkJCSJDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBwcmFjdGljZXMgcmVmZXJlbmNlZCBieSBhCi0JICogY29udGVudCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIENvbnRlbnRFbGVtZW50X1ByYWN0aWNlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlDb250ZW50RWxlbWVudC5jbGFzcywKLQkJCSJDb250ZW50RWxlbWVudF9QcmFjdGljZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBtZXRob2QgcGx1Zy1pbnMgcmVmZXJlbmNlZCBieQotCSAqIGEgbWV0aG9kIHBsdWctaW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgTWV0aG9kUGx1Z2luX0RpcmVjdEV4dGVuc2lvbnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJTWV0aG9kUGx1Z2luLmNsYXNzLAotCQkJIk1ldGhvZFBsdWdpbl9EaXJlY3RFeHRlbnNpb25zIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9ucyB3aGljaAotCSAqIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gYSBtZXRob2QgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBNZXRob2RQbHVnaW5fTWV0aG9kQ29uZmlndXJhdGlvbnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJTWV0aG9kUGx1Z2luLmNsYXNzLAotCQkJIk1ldGhvZFBsdWdpbl9NZXRob2RDb25maWd1cmF0aW9ucyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIG1ldGhvZCBwYWNrYWdlcwotCSAqIHVzZWQvcmVmZXJlbmNlZCBieSBhIG1ldGhvZCBwYWNrYWdlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIE1ldGhvZFBhY2thZ2VfVXNpbmdQYWNrYWdlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlNZXRob2RQYWNrYWdlLmNsYXNzLAotCQkJIk1ldGhvZFBhY2thZ2VfVXNpbmdQYWNrYWdlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2VfUmV1c2VkUGFja2FnZXMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIHdoaWNoCi0JICogY29udGFpbiBhIHJlZmVyZW5jZSB0byBhIG1ldGhvZCBwYWNrYWdlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIE1ldGhvZFBhY2thZ2VfTWV0aG9kQ29uZmlndXJhdGlvbnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJTWV0aG9kUGFja2FnZS5jbGFzcywKLQkJCSJNZXRob2RQYWNrYWdlX01ldGhvZENvbmZpZ3VyYXRpb25zIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9ucyB3aGljaAotCSAqIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gYSBDdXN0b21DYXRlZ29yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBDdXN0b21DYXRlZ29yeV9NZXRob2RDb25maWd1cmF0aW9ucyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlDdXN0b21DYXRlZ29yeS5jbGFzcywKLQkJCSJDdXN0b21DYXRlZ29yeV9NZXRob2RDb25maWd1cmF0aW9ucyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXdzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGRpc2NpcGxpbmUgZ3JvdXBpbmdzIHdoaWNoCi0JICogY29udGFpbiBhIHJlZmVyZW5jZSB0byBhIGRpc2NpcGxpbmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgRGlzY2lwbGluZV9EaXNjaXBsaW5lR3JvdXBpbmdzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCURpc2NpcGxpbmUuY2xhc3MsCi0JCQkiRGlzY2lwbGluZV9EaXNjaXBsaW5lR3JvdXBpbmdzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGRpc2NpcGxpbmVzIHdoaWNoCi0JICogY29udGFpbiBhIHJlZmVyZW5jZSB0byBhIGRpc2NpcGxpbmUgKGllLCBhIHN1YmRpc2NpcGxpbmUpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFN1YmRpc2NpcGxpbmVfRGlzY2lwbGluZSA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlEaXNjaXBsaW5lLmNsYXNzLAotCQkJIlN1YmRpc2NpcGxpbmVfRGlzY2lwbGluZSIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfU3ViZGlzY2lwbGluZSgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSByb2xlIHNldCBncm91cGluZ3Mgd2hpY2gKLQkgKiBjb250YWluIGEgcmVmZXJlbmNlIHRvIGEgcm9sZSBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUm9sZVNldF9Sb2xlU2V0R3JvdXBwaW5ncyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlU2V0LmNsYXNzLAotCQkJIlJvbGVTZXRfUm9sZVNldEdyb3VwcGluZ3MiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgc3VjY2Vzc29yIG9mIGEgd29yayBvcmRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrT3JkZXJfU3VjY2Vzc29yID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtPcmRlci5jbGFzcywKLQkJCSJXb3JrT3JkZXJfU3VjY2Vzc29yIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHN1Y2Nlc3NvciBsaW5rIG9mIGEgd29yawotCSAqIGJyZWFrZG93biBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1N1Y2Nlc3NvciA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcywKLQkJCSJXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9TdWNjZXNzb3IiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrT3JkZXJfUHJlZCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBpbW1lZGlhdGUgdmFyaWF0aWVzIG9mIGEKLQkgKiB2YXJpYWJpbGl0eSBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFZhcmlhYmlsaXR5RWxlbWVudF9JbW1lZGlhdGVWYXJpZXRpZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzLAotCQkJIlZhcmlhYmlsaXR5RWxlbWVudF9JbW1lZGlhdGVWYXJpZXRpZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBzdWNjZXNzb3JzIHRvIGEgc2VjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBTZWN0aW9uX1N1Y2Nlc3NvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJU2VjdGlvbi5jbGFzcywKLQkJCSJTZWN0aW9uX1N1Y2Nlc3NvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHRhc2sgZGVzY3JpcHRvcnMgd2hpY2ggYQotCSAqIHNlY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFNlY3Rpb25fVGFza0Rlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVNlY3Rpb24uY2xhc3MsCi0JCQkiU2VjdGlvbl9UYXNrRGVzY3JpcHRvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCksIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0ZWFtIHByb2ZpbGVzIHdoaWNoIGluY2x1ZGVzCi0JICogYSBzcGVjaWZpYyByb2xlIGRlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUm9sZURlc2NyaXB0b3JfVGVhbVByb2ZpbGVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvbGVEZXNjcmlwdG9yLmNsYXNzLAotCQkJIlJvbGVEZXNjcmlwdG9yX1RlYW1Qcm9maWxlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBwcmltYXJ5IHRhc2sgZGVzY3JpcHRvcnMKLQkgKiBwZXJmb3JtZWQgYnkgYSByb2xlIGRlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUm9sZURlc2NyaXB0b3JfUHJpbWFyeVRhc2tEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlRGVzY3JpcHRvci5jbGFzcywKLQkJCSJSb2xlRGVzY3JpcHRvcl9QcmltYXJ5VGFza0Rlc2NyaXB0b3JzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgYWRkaXRpb25hbCB0YXNrIGRlc2NyaXB0b3JzCi0JICogcGVyZm9ybWVkIGJ5IGEgcm9sZSBkZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJvbGVEZXNjcmlwdG9yX0FkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJUm9sZURlc2NyaXB0b3IuY2xhc3MsCi0JCQkiUm9sZURlc2NyaXB0b3JfQWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGFzc2lzdGluZyB0YXNrIGRlc2NyaXB0b3JzCi0JICogcGVyZm9ybWVkIGJ5IGEgcm9sZSBkZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJvbGVEZXNjcmlwdG9yX0Fzc2lzdHNJbl9UYXNrRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJUm9sZURlc2NyaXB0b3IuY2xhc3MsCi0JCQkiUm9sZURlc2NyaXB0b3JfQXNzaXN0c0luX1Rhc2tEZXNjcmlwdG9ycyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgZGVwZW5kZW50IHByb2Nlc3NlcwotCSAqIHJlZmVyZW5jZWQgaW4gYSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBNZXRob2RDb25maWd1cmF0aW9uX0RlcGVuZGVudFByb2Nlc3NlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLAotCQkJIk1ldGhvZENvbmZpZ3VyYXRpb25fRGVwZW5kZW50UHJvY2Vzc2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB2YWxpZCBwcm9jZXNzZXMgcmVmZXJlbmNlZCBpbgotCSAqIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgTWV0aG9kQ29uZmlndXJhdGlvbl9WYWxpZENvbnRleHRfUHJvY2Vzc2VzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsCi0JCQkiTWV0aG9kQ29uZmlndXJhdGlvbl9WYWxpZENvbnRleHRfUHJvY2Vzc2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaAotCSAqIHByb2R1Y2UgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBhcyBhbiBvdXRwdXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb21fVGFza0Rlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywKLQkJCSJXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbV9UYXNrRGVzY3JpcHRvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaCB1c2UgYQotCSAqIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGFzIGFuIG9wdGlvbmFsIGlucHV0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywKLQkJCSJXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaCB1c2UgYQotCSAqIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGFzIGFuIG1hbmRhdG9yeSBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXRUb19UYXNrRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLAotCQkJIldvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyIsIC8vJE5PTi1OTFMtMSQKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCksIHRydWUpOwotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrIGRlc2NyaXB0b3JzIHdoaWNoIHVzZSBhCi0JICogd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgYXMgYW4gZXh0ZXJuYWwgaW5wdXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLAotCQkJIldvcmtQcm9kdWN0RGVzY3JpcHRvcl9FeHRlcm5hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzIiwgLy8kTk9OLU5MUy0xJAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpLCB0cnVlKTsKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgcm9sZSBkZXNjcmlwdG9ycyB3aGljaCBhcmUKLQkgKiByZXNwb25zaWJsZSBmb3IgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JfUmVzcG9uc2libGVSb2xlRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLAotCQkJIldvcmtQcm9kdWN0RGVzY3JpcHRvcl9SZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9ycyIsIC8vJE5PTi1OTFMtMSQKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCksIHRydWUpOwotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBkZWxpdmVyYWJsZSBkZXNjcmlwdG9ycyB3aGljaAotCSAqIGNvbnRhaW4gYSBzcGVjaWZpYyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlRGVzY3JpcHRvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBkaXNjaXBsaW5lcyB3aGljaCBhbiBhY3Rpdml0eQotCSAqIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBBY3Rpdml0eV9EaXNjaXBsaW5lcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlBY3Rpdml0eS5jbGFzcywKLQkJCSJBY3Rpdml0eV9EaXNjaXBsaW5lcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHByYWN0aWNlcyB3aGljaCBhbiBhY3Rpdml0eQotCSAqIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBBY3Rpdml0eV9QcmF0aWNlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlBY3Rpdml0eS5jbGFzcywKLQkJCSJBY3Rpdml0eV9QcmF0aWNlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlcygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBwcm9jZXNzIHBsYW5uaW5nIHRlbXBsYXRlcwotCSAqIHdoaWNoIGEgcHJvY2VzcyBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUHJvY2Vzc19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJUHJvY2Vzcy5jbGFzcywKLQkJCSJQcm9jZXNzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0Jhc2VkT25Qcm9jZXNzZXMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgcHJvY2VzZXNzIHdoaWNoIHJlZmVyZW5jZXMgYQotCSAqIGNhcGFiaWxpdHkgcGF0dGVybi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBDYXBhYmlsaXR5UGF0dGVybl9Db25zdW1pbmdQcm9jZXNzZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJQ2FwYWJpbGl0eVBhdHRlcm4uY2xhc3MsCi0JCQkiQ2FwYWJpbGl0eVBhdHRlcm5fQ29uc3VtaW5nUHJvY2Vzc2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm5zKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGJyZWFrZG93biBlbGVtZW50IHdoaWNoIGlzCi0JICogZGlzcGxheWVkIGJlZm9yZSBhIGJyZWFrZG93biBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUJyZWFrZG93bkVsZW1lbnQuY2xhc3MsCi0JCQkiQnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUiLCAvLyROT04tTkxTLTEkCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEFmdGVyKCksIHRydWUsCi0JCQlmYWxzZSk7Ci0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGJyZWFrZG93biBlbGVtZW50IHdoaWNoIGlzCi0JICogZGlzcGxheWVkIGFmdGVyIGEgYnJlYWtkb3duIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgQnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlciA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlCcmVha2Rvd25FbGVtZW50LmNsYXNzLAotCQkJIkJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIiLCAvLyROT04tTkxTLTEkCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSgpLCB0cnVlLAotCQkJZmFsc2UpOwotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBVTUEgc2VtYXRpYyBtb2RlbCBicmlkZ2VzCi0JICogcmVmZXJlbmNlZCBieSBhIG1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIE1ldGhvZEVsZW1lbnRfVU1BU2VtYXRpY01vZGVsQnJpZGdlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlNZXRob2RFbGVtZW50LmNsYXNzLAotCQkJIk1ldGhvZEVsZW1lbnRfVU1BU2VtYXRpY01vZGVsQnJpZGdlcyIsIC8vJE5PTi1OTFMtMSQKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFVNQVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpLCB0cnVlLAotCQkJZmFsc2UpOwotCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IHByZWRlZmluZWRPcHBvc2l0ZUZlYXR1cmVzOwotCi0Jc3RhdGljIHsKLQkJcmVnaXN0ZXJQcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcygpOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyB0aGUgcHJlZGVmaW5lZCBvcHBvc2l0ZSBmZWF0dXJlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcmVnaXN0ZXJQcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcygpIHsKLQkJcHJlZGVmaW5lZE9wcG9zaXRlRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFzc29jaWF0aW9uSGVscGVyIG9iamVjdCA9IG5ldyBBc3NvY2lhdGlvbkhlbHBlcigpOwotCQlGaWVsZFtdIGZpZWxkcyA9IG9iamVjdC5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWVsZCBmaWVsZCA9IGZpZWxkc1tpXTsKLQkJCWludCBtb2QgPSBmaWVsZC5nZXRNb2RpZmllcnMoKTsKLQkJCWlmIChNb2RpZmllci5pc1B1YmxpYyhtb2QpICYmIE1vZGlmaWVyLmlzU3RhdGljKG1vZCkKLQkJCQkJJiYgTW9kaWZpZXIuaXNGaW5hbChtb2QpCi0JCQkJCSYmIGZpZWxkLmdldFR5cGUoKSA9PSBPcHBvc2l0ZUZlYXR1cmUuY2xhc3MpIHsKLQkJCQl0cnkgewotCQkJCQlwcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcy5hZGQoZmllbGQuZ2V0KG9iamVjdCkpOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogU3lzdGVtLm91dAotCQkgKiAucHJpbnRsbigiQXNzb2NpYXRpb25IZWxwZXIucmVnaXN0ZXJQcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcygpOgotCQkgKiBkZWZpbmVkIG9wcG9zaXRlIGZlYXR1cmVzOiAiICsgcHJlZGVmaW5lZE9wcG9zaXRlRmVhdHVyZXMuc2l6ZSgpKTsKLQkJICogLy8kTk9OLU5MUy0xJCBTeXN0ZW0ub3V0LnByaW50bG4ocHJlZGVmaW5lZE9wcG9zaXRlRmVhdHVyZXMpOwotCQkgKi8KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlID0gKE9wcG9zaXRlRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQlPcHBvc2l0ZUZlYXR1cmUucmVnaXN0ZXJPcHBvc2l0ZUZlYXR1cmUoZmVhdHVyZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwcmVkZWZpbmVkIG9wcG9zaXRlIGZlYXR1cmVzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZWRlZmluZWQgb3Bwb3NpdGUgZmVhdHVyZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0UHJlZGVmaW5lZE9wcG9zaXRlRmVhdHVyZXMoKSB7Ci0JCXJldHVybiBwcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWxpdmVyYWJsZSBkZXNjcmlwdG9ycyB3aGljaCBjb250YWluIHRoZSBnaXZlbiB3b3JrIHByb2R1Y3QKLQkgKiBkZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSB3cGQKLQkgKiAgICAgICAgICAgIGEgd29yayBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgZGVsaXZlcmFibGUgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdG9ycyhXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgd3BkKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVEZXNjcmlwdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaCB1c2UgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBhcyBhbgotCSAqIGV4dGVybmFsIGlucHV0LgotCSAqIAotCSAqIEBwYXJhbSB3cGQKLQkgKiAgICAgICAgICAgIGEgd29yayBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFzayBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRFeHRlcm5hbElucHV0VG8oV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHdwZCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRhc2sgZGVzY3JpcHRvcnMgd2hpY2ggdXNlIGEgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgYXMgYQotCSAqIG1hbmRhdG9yeSBpbnB1dC4KLQkgKiAKLQkgKiBAcGFyYW0gd3BkCi0JICogICAgICAgICAgICBhIHdvcmsgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2sgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TWFuZGF0b3J5SW5wdXRUbyhXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgd3BkKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdERlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXRUb19UYXNrRGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRhc2sgZGVzY3JpcHRvcnMgd2hpY2ggdXNlIGEgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgYXMgYW4KLQkgKiBvcHRpb25hbCBpbnB1dC4KLQkgKiAKLQkgKiBAcGFyYW0gd3BkCi0JICogICAgICAgICAgICBhIHdvcmsgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2sgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0T3B0aW9uYWxJbnB1dFRvKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB3cGQpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0YXNrIGRlc2NyaXB0b3JzIHdoaWNoIHdoaWNoIHByb2R1Y2UgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcgotCSAqIGFzIGFuIG91dHB1dC4KLQkgKiAKLQkgKiBAcGFyYW0gd3BkCi0JICogICAgICAgICAgICBhIHdvcmsgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2sgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0T3V0cHV0RnJvbShXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgd3BkKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbV9UYXNrRGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJvbGUgZGVzY3JpcHRvcnMgd2hpY2ggYXJlIHJlc3BvbnNpYmxlIGZvciBhIHdvcmsgcHJvZHVjdAotCSAqIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIHdwZAotCSAqICAgICAgICAgICAgYSB3b3JrIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiByb2xlIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFJlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQpIHsKLQkJcmV0dXJuIChMaXN0KSB3cGQKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3REZXNjcmlwdG9yX1Jlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0aGUgZGVwZW5kZW50IHByb2Nlc3NlcyByZWZlcmVuY2VkIGluIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9jZXNzZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RGVwZW5kZW50UHJvY2Vzc2VzKE1ldGhvZENvbmZpZ3VyYXRpb24gZSkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGUpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKE1ldGhvZENvbmZpZ3VyYXRpb25fRGVwZW5kZW50UHJvY2Vzc2VzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZWFtIHByb2ZpbGVzIHdoaWNoIGluY2x1ZGVzIGEgc3BlY2lmaWMgcm9sZSBkZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIHJvbGUgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRlYW0gcHJvZmlsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0VGVhbVByb2ZpbGVzKFJvbGVEZXNjcmlwdG9yIGUpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShSb2xlRGVzY3JpcHRvcl9UZWFtUHJvZmlsZXMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHByYWN0aWNlcyByZWZlcmVuY2VkIGJ5IGEgY29udGVudCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIGNvbnRlbnQgZWxlbWVudAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByYWN0aWNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRQcmFjdGljZXMoQ29udGVudEVsZW1lbnQgZSkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGUpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKENvbnRlbnRFbGVtZW50X1ByYWN0aWNlcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdG9vbCB3aGljaCBhIHRvb2wgbWVudG9yIGlzIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIHRvb2wgbWVudG9yCi0JICogQHJldHVybiBhIHRvb2wKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8PyBleHRlbmRzIFRvb2xNZW50b3I+IGdldFRvb2xzKFRvb2xNZW50b3IgdG9vbE1lbnRvcikgewotCQlyZXR1cm4gKExpc3Q8PyBleHRlbmRzIFRvb2xNZW50b3I+KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB0b29sTWVudG9yKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShUb29sTWVudG9yX1Rvb2xzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzdWNjZXNzb3JzIHRvIGEgc2VjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBzZWN0aW9uCi0JICogQHJldHVybiBhIGxpc3Qgb2Ygc2VjdGlvbnMgdGhhdCBhcmUgcG9zdGlvbmVkIGFmdGVyIHRoZSBnaXZlbiBzZWN0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFN1Y2Nlc3NvcnMoU2VjdGlvbiBzZWN0aW9uKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgc2VjdGlvbikKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoU2VjdGlvbl9TdWNjZXNzb3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbW1lZGlhdGUgdmFyaWF0aWVzIG9mIGEgdmFyaWFiaWxpdHkgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSB2YXJpYWJpbGl0eSBlbGVtZW50Ci0JICogQHJldHVybiBhIGxpc3Qgb2YgaW1tZWRpYXRlIHZhcmlhdGllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRJbW1lZGlhdGVWYXJpZXRpZXMoVmFyaWFiaWxpdHlFbGVtZW50IGUpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShWYXJpYWJpbGl0eUVsZW1lbnRfSW1tZWRpYXRlVmFyaWV0aWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwcmltYXJ5IHRhc2tzIG9mIGEgcm9sZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm9sZQotCSAqICAgICAgICAgICAgYSByb2xlCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFza3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0UHJpbWFyeVRhc2tzKFJvbGUgcm9sZSkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJvbGUpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFJvbGVfUHJpbWFyeV9UYXNrcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2Vjb25kYXJ5IHRhc2tzIG9mIGEgcm9sZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm9sZQotCSAqICAgICAgICAgICAgYSByb2xlCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFza3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0U2Vjb25kYXJ5VGFza3MoUm9sZSByb2xlKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgcm9sZSkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoUm9sZV9TZWNvbmRhcnlfVGFza3MpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHN1Y2Nlc3NvciBsaW5rIG9mIGEgd29yayBicmVha2Rvd24gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBicmVhayBkb3duIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBsaW5rcyB0byB3b3JrIGJyZWFrZG93biBlbGVtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRMaW5rVG9TdWNjZXNzb3IoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgZSkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvU3VjY2Vzc29yKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzdWNjZXNzb3Igb2YgYSB3b3JrIG9yZGVyLgotCSAqIAotCSAqIEBwYXJhbSB3b3JrT3JkZXIKLQkgKiAgICAgICAgICAgIGEgd29yayBvcmRlcgotCSAqIEByZXR1cm4gYSB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrQnJlYWtkb3duRWxlbWVudCBnZXRTdWNjZXNzb3IoV29ya09yZGVyIHdvcmtPcmRlcikgewotCQlyZXR1cm4gKFdvcmtCcmVha2Rvd25FbGVtZW50KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB3b3JrT3JkZXIpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFdvcmtPcmRlcl9TdWNjZXNzb3IpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRhc2tzIHdoaWNoIHByb2R1Y2UgYSB3b3JrIHByb2R1Y3QgYXMgYW4gb3V0cHV0LgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqICAgICAgICAgICAgYSB3b3JrIHByb2R1Y3QKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0YXNrcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRPdXRwdXR0aW5nVGFza3MoV29ya1Byb2R1Y3Qgd3ApIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB3cCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3RfT3V0cHV0RnJvbV9UYXNrcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGFza3Mgd2hpY2ggdXNlIGEgd29yayBwcm9kdWN0IGFzIGEgbWFuZGF0b3J5IGlucHV0LgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqICAgICAgICAgICAgYSB3b3JrIHByb2R1Y3QKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0YXNrcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRNYW5kYXRvcnlJbnB1dFRvVGFza3MoV29ya1Byb2R1Y3Qgd3ApIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB3cCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3RfTWFuZGF0b3J5SW5wdXRUb19UYXNrcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVzcG9uc2libGUgcm9sZXMgZm9yIGEgd29yayBwcm9kdWN0LgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqICAgICAgICAgICAgYSB3b3JrIHByb2R1Y3QKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiByb2xlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSZXNwb25zaWJsZVJvbGVzKFdvcmtQcm9kdWN0IHdwKSB7Ci0JCXJldHVybiAoTGlzdCkgd3AuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3RfUmVzcG9uc2libGVSb2xlcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgd29yayBwcm9kdWN0cyBtb2RpZmllZCBieSBhIHJvbGUuCi0JICogCi0JICogQHBhcmFtIHJvbGUKLQkgKiAgICAgICAgICAgIGEgcm9sZQotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHdvcmsgcHJvZHVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TW9kaWZpZWRXb3JrUHJvZHVjdHMoUm9sZSByb2xlKSB7Ci0JCUxpc3QgcGVyZm9ybXMgPSBnZXRQcmltYXJ5VGFza3Mocm9sZSk7Ci0JCUxpc3QgbW9kaWZpZXMgPSBuZXcgQmFzaWNFTGlzdCgpOwotCQlpZiAocGVyZm9ybXMgIT0gbnVsbCAmJiBwZXJmb3Jtcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBwZXJmb3Jtcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaS5uZXh0KCk7Ci0KLQkJCQkvLyBmb3IgZWFjaCB0YXNrLCBnZXQgb3V0cHV0IHdvcmsgcHJvZHVjdDsKLQkJCQlMaXN0IG91dHB1dFdQcyA9IHRhc2suZ2V0T3V0cHV0KCk7Ci0JCQkJaWYgKG91dHB1dFdQcyAhPSBudWxsICYmIG91dHB1dFdQcy5zaXplKCkgPiAwKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBvdXRwdXRXUHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIGl0Lm5leHQoKTsKLQkJCQkJCWlmICh3cCAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKCFtb2RpZmllcy5jb250YWlucyh3cCkpIHsKLQkJCQkJCQkJbW9kaWZpZXMuYWRkKHdwKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVzOwotCi0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcm9sZXMgdGhhdCBtb2RpZnkgYSB3b3JrIHByb2R1Y3QuCi0JICogCi0JICogQHBhcmFtIHdwCi0JICogICAgICAgICAgICBhIHdvcmsgcHJvZHVjdAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHJvbGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE1vZGlmaWVkQnkoV29ya1Byb2R1Y3Qgd3ApIHsKLQkJTGlzdCBvdXRwdXRGcm9tID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3V0cHV0dGluZ1Rhc2tzKHdwKTsKLQkJVW5pcXVlRUxpc3Q8Um9sZT4gbW9kaWZpZXMgPSBuZXcgVW5pcXVlRUxpc3Q8Um9sZT4oKTsKLQkJaWYgKG91dHB1dEZyb20gIT0gbnVsbCAmJiBvdXRwdXRGcm9tLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBvdXRwdXRGcm9tLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkvLwlmb3IgZWFjaCB0YXNrIGdldCwgZ2V0IHByaW1hcnkgcGVyZm9ybWVyIHJvbGUKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCW1vZGlmaWVzLmFkZEFsbCh0YXNrLmdldFBlcmZvcm1lZEJ5KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaXNjaXBsaW5lIGdyb3VwaW5ncyB3aGljaCBjb250YWluIGEgcmVmZXJlbmNlIHRvIGEgZGlzY2lwbGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzY2lwbGluZQotCSAqICAgICAgICAgICAgYSBkaXNjaXBsaW5lCi0JICogQHJldHVybiBhIGxpc3Qgb2YgZGlzY2lwbGluZSBncm91cGluZ3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RGlzY2lwbGluZUdyb3VwcyhEaXNjaXBsaW5lIGRpc2NpcGxpbmUpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBkaXNjaXBsaW5lKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShEaXNjaXBsaW5lX0Rpc2NpcGxpbmVHcm91cGluZ3MpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc2NpcGxpbmUgd2hpY2ggY29udGFpbiBhIHJlZmVyZW5jZSB0byBhIHN1YmRpc2NpcGxpbmUuCi0JICogCi0JICogQHBhcmFtIGRpc2NpcGxpbmUKLQkgKiAgICAgICAgICAgIGEgZGlzY2lwbGluZQotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGRpc2NpcGxpbmUgZ3JvdXBpbmdzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldERpc2NpcGxpbmUoRGlzY2lwbGluZSBzdWJkaXNjaXBsaW5lKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgc3ViZGlzY2lwbGluZSkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoU3ViZGlzY2lwbGluZV9EaXNjaXBsaW5lKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkb21haW5zIHdoaWNoIGEgd29yayBwcm9kdWN0IGlzIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqICAgICAgICAgICAgYSB3b3JrIHByb2R1Y3QKLQkgKiBAcmV0dXJuIGEgZG9tYWluCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldERvbWFpbnMoV29ya1Byb2R1Y3Qgd3ApIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB3cCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3RfRG9tYWlucyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcm9sZSBzZXQgZ3JvdXBpbmdzIHdoaWNoIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gYSByb2xlIHNldC4KLQkgKiAKLQkgKiBAcGFyYW0gcm9sZVNldAotCSAqICAgICAgICAgICAgYSByb2xlIHNldAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHJvbGUgc2V0IGdyb3VwaW5ncwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSb2xlU2V0R3JvdXBzKFJvbGVTZXQgcm9sZVNldCkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJvbGVTZXQpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFJvbGVTZXRfUm9sZVNldEdyb3VwcGluZ3MpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJvbGUgc2V0cyB3aGljaCBhIHJvbGUgaXMgY2F0ZWdvcml6ZWQgdW5kZXIuCi0JICogCi0JICogQHBhcmFtIHJvbGUKLQkgKiAgICAgICAgICAgIGEgcm9sZQotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHJvbGUgc2V0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSb2xlU2V0cyhSb2xlIHJvbGUpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByb2xlKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShSb2xlX1JvbGVTZXRzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0YXNrIGRlc2NyaXB0b3JzIHdoaWNoIGhhdmUgYmVlbiBjcmVhdGVkIGZyb20gYSB0YXNrLgotCSAqIAotCSAqIEBwYXJhbSB0YXNrCi0JICogICAgICAgICAgICBhIHRhc2sKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0YXNrIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFRhc2tEZXNjcmlwdG9ycyhUYXNrIHRhc2spIHsKLQkJcmV0dXJuIChMaXN0KSB0YXNrLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFRhc2tfVGFza0Rlc2NyaXB0b3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaXNjaXBsaW5lcyB3aGljaCBhIHRhc2sgaXMgY2F0ZWdvcml6ZWQgdW5kZXIuCi0JICogCi0JICogQHBhcmFtIHRhc2sKLQkgKiAgICAgICAgICAgIGEgdGFzawotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGRpc2NpcGxpbmVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldERpc2NpcGxpbmVzKFRhc2sgdGFzaykgewotCQlyZXR1cm4gKExpc3QpIHRhc2suZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoVGFza19EaXNjaXBsaW5lcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGlzY2lwbGluZXMgd2hpY2ggYW4gYWN0aXZpdHkgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqICAgICAgICAgICAgYW4gYWN0aXZpdHkKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBkaXNjaXBsaW5lcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXREaXNjaXBsaW5lcyhBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlyZXR1cm4gKExpc3QpIGFjdGl2aXR5LmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKEFjdGl2aXR5X0Rpc2NpcGxpbmVzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwcmltYXJ5IHRhc2sgZGVzY3JpcHRvcnMgcGVyZm9ybWVkIGJ5IGEgcm9sZSBkZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSByb2xlRGVzYwotCSAqICAgICAgICAgICAgYSByb2xlIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0YXNrIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMoUm9sZURlc2NyaXB0b3Igcm9sZURlc2MpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByb2xlRGVzYykKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoUm9sZURlc2NyaXB0b3JfUHJpbWFyeVRhc2tEZXNjcmlwdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYWRkaXRpb25hbCB0YXNrIGRlc2NyaXB0b3JzIHBlcmZvcm1lZCBieSBhIHJvbGUgZGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gcm9sZURlc2MKLQkgKiAgICAgICAgICAgIGEgcm9sZSBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFzayBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzKFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgcm9sZURlc2MpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFJvbGVEZXNjcmlwdG9yX0FkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFzc2lzdGluZyB0YXNrIGRlc2NyaXB0b3JzIHBlcmZvcm1lZCBieSBhIHJvbGUgZGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gcm9sZURlc2MKLQkgKiAgICAgICAgICAgIGEgcm9sZSBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFzayBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBc3Npc3RlZFRhc2tEZXNjcmlwdG9ycyhSb2xlRGVzY3JpcHRvciByb2xlRGVzYykgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJvbGVEZXNjKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShSb2xlRGVzY3JpcHRvcl9Bc3Npc3RzSW5fVGFza0Rlc2NyaXB0b3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB3b3JrIHByb2R1Y3QgdHlwZXMgd2hpY2ggYSB3b3JrIHByb2R1Y3QgaXMgY2F0ZWdvcml6ZWQgdW5kZXIuCi0JICogCi0JICogQHBhcmFtIHdwCi0JICogICAgICAgICAgICBhIHdvcmsgcHJvZHVjdAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHdvcmsgcHJvZHVjdCB0eXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRXb3JrUHJvZHVjdFR5cGVzKFdvcmtQcm9kdWN0IHdwKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgd3ApCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFdvcmtQcm9kdWN0X1dvcmtQcm9kdWN0VHlwZXMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGN1c3RvbSBjYXRlZ29yaWVzIHdoaWNoIGEgZGVzY3JpYmFibGUgZWxlbWVudCBpcyBhc3NvY2lhdGVkCi0JICogd2l0aC4KLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiAgICAgICAgICAgIGEgZGVzY3JpYmFibGUgZWxlbWVudAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGN1c3RvbSBjYXRlZ29yaWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEN1c3RvbUNhdGVnb3JpZXMoRGVzY3JpYmFibGVFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlbGVtZW50KQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShEZXNjcmliYWJsZUVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgRGVsaXZlcmFibGVzIHdoaWNoIGEgV29ya1Byb2R1Y3QgZWxlbWVudCBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICogCi0JICogQHBhcmFtIHdwCi0JICogICAgICAgICAgICBhIFdvcmtQcm9kdWN0IGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBEZWxpdmVyYWJsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RGVsaXZlcmFibGVzKFdvcmtQcm9kdWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlbGVtZW50KQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdF9EZWxpdmVyYWJsZXMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1ldGhvZCBwbHVnLWlucyByZWZlcmVuY2VkIGJ5IGEgbWV0aG9kIHBsdWctaW4uCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgYSBtZXRob2QgcGx1Zy1pbgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIG1ldGhvZCBwbHVnLWlucwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxNZXRob2RQbHVnaW4+IGdldFBsdWdpbkRpcmVjdEV4dGVuc2lvbnMoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlyZXR1cm4gKExpc3Q8TWV0aG9kUGx1Z2luPikgKChNdWx0aVJlc291cmNlRU9iamVjdCkgcGx1Z2luKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShNZXRob2RQbHVnaW5fRGlyZWN0RXh0ZW5zaW9ucyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIHJlZmVyZW5jZXMgdG8gYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIG1ldGhvZCBlbGVtZW50IHJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0UmVmZXJlbmNlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJU2V0IHJlZmVyZW5jZXMgPSBuZXcgSGFzaFNldCgpOwotCQlNdWx0aVJlc291cmNlRU9iamVjdCBlT2JqID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlbGVtZW50OwotCi0JCWlmIChlT2JqLmJhc2ljR2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkgPT0gbnVsbCkKLQkJCXJldHVybiByZWZlcmVuY2VzOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVPYmouZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9ICgoT3Bwb3NpdGVGZWF0dXJlKSBlbnRyeS5nZXRLZXkoKSk7Ci0JCQlvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCXJlZmVyZW5jZXMuYWRkQWxsKChDb2xsZWN0aW9uKSBlT2JqCi0JCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUob3Bwb3NpdGVGZWF0dXJlKSk7Ci0JCQl9IGVsc2UgewotCQkJCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpIGVPYmoKLQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShvcHBvc2l0ZUZlYXR1cmUpOwotCQkJCWlmIChvYmogIT0gbnVsbCkgewotCQkJCQlyZWZlcmVuY2VzLmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSByZWZlcmVuY2VzIHRvIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgbWFwIGNvbnRhaW5pbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwPEVPYmplY3QsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPj4gZ2V0UmVmZXJlbmNlTWFwKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlNYXA8RU9iamVjdCwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+PiBvYmplY3RUb0ZlYXR1cmVzTWFwID0gbmV3IEhhc2hNYXA8RU9iamVjdCwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+PigpOwotCi0JCU11bHRpUmVzb3VyY2VFT2JqZWN0IGVPYmogPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGVsZW1lbnQ7Ci0KLQkJaWYgKGVPYmouYmFzaWNHZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gb2JqZWN0VG9GZWF0dXJlc01hcDsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVPYmouZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9ICgoT3Bwb3NpdGVGZWF0dXJlKSBlbnRyeS5nZXRLZXkoKSk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCk7Ci0JCQlpZiAob3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoQ29sbGVjdGlvbikgZU9iagotCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKG9wcG9zaXRlRmVhdHVyZSkpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IG9iamVjdCA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCUNvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPiBmZWF0dXJlcyA9IG9iamVjdFRvRmVhdHVyZXNNYXAKLQkJCQkJCQkuZ2V0KG9iamVjdCk7Ci0JCQkJCWlmIChmZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQkJCQlmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPigpOwotCQkJCQkJb2JqZWN0VG9GZWF0dXJlc01hcC5wdXQob2JqZWN0LCBmZWF0dXJlcyk7Ci0JCQkJCX0KLQkJCQkJZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQkJCX0KLQkJCQk7Ci0JCQl9IGVsc2UgewotCQkJCUVPYmplY3Qgb2JqZWN0ID0gKEVPYmplY3QpIGVPYmoKLQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShvcHBvc2l0ZUZlYXR1cmUpOwotCQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCQlDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZmVhdHVyZXMgPSBvYmplY3RUb0ZlYXR1cmVzTWFwCi0JCQkJCQkJLmdldChvYmplY3QpOwotCQkJCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCkgewotCQkJCQkJZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4oKTsKLQkJCQkJCW9iamVjdFRvRmVhdHVyZXNNYXAucHV0KG9iamVjdCwgZmVhdHVyZXMpOwotCQkJCQl9Ci0JCQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gb2JqZWN0VG9GZWF0dXJlc01hcDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgaW5pdCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIHNldCBvZiBlbGVtZW50cywgcmV0dXJucyB0aGUgc2V0IG9mIHRob3NlIGVsZW1lbnRzIHBsdXMgYW55Ci0JICogdmFyaWFiaWxpdHkgZWxlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZW0uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRTZXQKLQkgKiAgICAgICAgICAgIGEgc2V0IG9mIG1ldGhvZCBlbGVtZW50cyBmb3Igd2hpY2ggdG8gcmV0cmlldmUgdGhlIHZhcmlhYmlsaXR5Ci0JICogICAgICAgICAgICBlbGVtZW50cwotCSAqIEBwYXJhbSBnZXRCYXNlcwotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHJlY3Vyc2UgaW50byB0aGUgdmFyaWFiaWxpdHkgYmFzZQotCSAqICAgICAgICAgICAgZWxlbWVudHMgKCJ1cCB0aGUgdHJlZSIpCi0JICogQHBhcmFtIGdldENoaWxkcmVuCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcmVjdXJzZSBpbnRvIHRoZSB2YXJpZXRpZXMgKCJkb3duIHRoZQotCSAqICAgICAgICAgICAgdHJlZSIpCi0JICogQHJldHVybiBhIGNvbGxlY3RpdmUgc2V0IG9mIG1ldGhvZCBlbGVtZW50cyBwbHVzIHRoZSBhc3NvY2lhdGVkCi0JICogICAgICAgICB2YXJpYWJpbGl0eSBlbGVtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2V0IGdldFZhcmlhYmlsaXR5RWxlbWVudHMoU2V0IGVsZW1lbnRTZXQsIGJvb2xlYW4gZ2V0QmFzZXMsCi0JCQlib29sZWFuIGdldENoaWxkcmVuKSB7Ci0JCWlmIChlbGVtZW50U2V0ICE9IG51bGwgJiYgIWVsZW1lbnRTZXQuaXNFbXB0eSgpKSB7Ci0JCQlTZXQgdmFyU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRTZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIG87Ci0JCQkJCWlmIChnZXRDaGlsZHJlbikKLQkJCQkJCXZhclNldC5hZGRBbGwoZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKGVsZW1lbnQpKTsKLQkJCQkJaWYgKGdldEJhc2VzCi0JCQkJCQkJJiYgZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkKLQkJCQkJCXZhclNldC5hZGQoZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmICh2YXJTZXQuaXNFbXB0eSgpKQotCQkJCXJldHVybiBlbGVtZW50U2V0OwotCQkJaWYgKGVsZW1lbnRTZXQuY29udGFpbnNBbGwodmFyU2V0KSkKLQkJCQlyZXR1cm4gZWxlbWVudFNldDsKLQkJCWVsZW1lbnRTZXQuYWRkQWxsKHZhclNldCk7Ci0JCQllbGVtZW50U2V0LmFkZEFsbChnZXRWYXJpYWJpbGl0eUVsZW1lbnRzKGVsZW1lbnRTZXQsIGdldEJhc2VzLAotCQkJCQlnZXRDaGlsZHJlbikpOwotCQl9Ci0JCXJldHVybiBlbGVtZW50U2V0OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjVlNzhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGw7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgY3JlYXRpb24gb2YgY29udGVudCBkZXNjcmlwdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5IHsKLQotCS8vIE1hcHMgQ29udGVudEVsZW1lbnQgaW1wbGVtZW50YXRpb24gQ2xhc3MgdG8gQ29udGVudERlc2NpcHRpb25JbmZvLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxFQ2xhc3MsIEVDbGFzcz4gY29udGVudERlc2NDbGFzc01hcCA9IG5ldyBIYXNoTWFwPEVDbGFzcywgRUNsYXNzPigpOwotCi0Jc3RhdGljIHsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJhY3RpY2UoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmFjdGljZURlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZW1wbGF0ZSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEV4YW1wbGUoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXVzYWJsZUFzc2V0KCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2hpdGVwYXBlcigpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0KCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGUoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRjb21lKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpKTsKLQotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcigpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9zaXRlUm9sZSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3IoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpKTsKLQotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNaWxlc3RvbmUoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpOwotCi0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SXRlcmF0aW9uKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGhhc2UoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXBhYmlsaXR5UGF0dGVybigpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NEZXNjcmlwdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVDbGFzcyBnZXRDb250ZW50RGVzY3JpcHRpb25UeXBlKEVDbGFzcyBkZXNjcmliYWJsZUVsZW1lbnRUeXBlKSB7Ci0JCUVDbGFzcyB0eXBlID0gKEVDbGFzcykgY29udGVudERlc2NDbGFzc01hcC5nZXQoZGVzY3JpYmFibGVFbGVtZW50VHlwZSk7Ci0JCWlmKHR5cGUgPT0gbnVsbCAmJiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnQoKS5pc1N1cGVyVHlwZU9mKGRlc2NyaWJhYmxlRWxlbWVudFR5cGUpKSB7Ci0JCQl0eXBlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb250ZW50RGVzY3JpcHRpb24gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKAotCQkJRGVzY3JpYmFibGVFbGVtZW50IGUpIHsKLQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpIGNvbnRlbnREZXNjQ2xhc3NNYXAuZ2V0KGUuZUNsYXNzKCkpOwotCQlpZiAoZUNsYXNzID09IG51bGwpIHsKLQkJCWVDbGFzcyA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQl9Ci0JCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlKGVDbGFzcyk7Ci0JCWNvbnRlbnQuc2V0TmFtZShVbWFVdGlsLmNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbk5hbWUoZSkpOwotCQljb250ZW50LnNldEd1aWQoVW1hVXRpbC5nZW5lcmF0ZUdVSUQoZS5nZXRHdWlkKCkpKTsKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBDb250ZW50RGVzY3JpcHRpb24gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gQ29udGVudEVsZW1lbnQgYW5kCi0JICogc2F2ZSBpdCB0byBhIGZpbGUKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKERlc2NyaWJhYmxlRWxlbWVudCBlKSBpbnN0ZWFkCi0JICovCi0JcHVibGljIHN0YXRpYyBDb250ZW50RGVzY3JpcHRpb24gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKENvbnRlbnRFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbihlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gc2F2ZUNvbnRlbnRPbmx5Ci0JICogQHJldHVybgotCSAqIEBkZXByZWNhdGVkIHVzZSBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oRGVzY3JpYmFibGVFbGVtZW50IGUpIGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnRlbnREZXNjcmlwdGlvbiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oCi0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZSwgYm9vbGVhbiBzYXZlQ29udGVudE9ubHkpIHsKLQkJLy8gaWYgKCBlIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpCi0JCS8vIHsKLQkJLy8gcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbigoQ29udGVudEVsZW1lbnQpZSwgc2F2ZUNvbnRlbnRPbmx5KTsKLQkJLy8gfQotCQkvLwkJCi0JCS8vIHJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oZSk7Ci0KLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbihlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbnRlbnREZXNjcmlwdGlvbiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oQ29udGVudEVsZW1lbnQgZSwKLQkJCWJvb2xlYW4gc2F2ZUNvbnRlbnRPbmx5KSB7Ci0JCUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbigoRGVzY3JpYmFibGVFbGVtZW50KSBlKTsKLQotCQkvLyBTZXQgZGVzY3JpcHRpb25zID0gKFNldCkKLQkJLy8gY29udGVudERlc2NyaXB0aW9uc01hcC5nZXQoZGVzY0luZm8ucGFja2FnZU5hbWUpOwotCQkvLyBpZihkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkvLyBkZXNjcmlwdGlvbnMgPSBuZXcgSGFzaFNldCgpOwotCQkvLyBjb250ZW50RGVzY3JpcHRpb25zTWFwLnB1dChkZXNjSW5mby5wYWNrYWdlTmFtZSwgZGVzY3JpcHRpb25zKTsKLQkJLy8gfQotCQkvLyBkZXNjcmlwdGlvbnMuYWRkKGRlc2NyaXB0aW9uKTsKLQotCQkvLyBzYXZpbmcgQ29udGVudERlc2NyaXB0aW9uIHJpZ2h0IGFmdGVyIGl0cyBjcmVhdGlvbiBpdCBubyBsb25nZXIKLQkJLy8gbmVlZGVkIHNpbmNlIENvbnRlbnREZXNjcmlwdGlvbiBpcwotCQkvLyBub3cgY29udGFpbmVkIGJ5IGEgRGVzY3JpYmFibGVFbGVtZW50Ci0JCS8vCi0JCS8vIGlmKGxpYlBlcnNpc3RlciAhPSBudWxsKSB7Ci0JCS8vIGxpYlBlcnNpc3Rlci5zYXZlKGUsIGRlc2NyaXB0aW9uLCBzYXZlQ29udGVudE9ubHkpOwotCQkvLyB9Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcCBnZXRDb250ZW50RGVzY3JpcHRpb25zTWFwKCkgewotCS8vIHJldHVybiBjb250ZW50RGVzY3JpcHRpb25zTWFwOwotCS8vIH0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNQcmVzZW50YXRpb24oTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnRJbXBsKSB7Ci0JCQlyZXR1cm4gKChDb250ZW50RWxlbWVudEltcGwpIGUpLmJhc2ljR2V0UHJlc2VudGF0aW9uKCkgIT0gbnVsbDsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnRJbXBsKSB7Ci0JCQlyZXR1cm4gKChQcm9jZXNzRWxlbWVudEltcGwpIGUpLmJhc2ljR2V0UHJlc2VudGF0aW9uKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFQ2xhc3MgZ2V0Q29udGVudERlc2NyaXB0aW9uRUNsYXNzKERlc2NyaWJhYmxlRWxlbWVudCBlKSB7Ci0JCXJldHVybiAoRUNsYXNzKSBjb250ZW50RGVzY0NsYXNzTWFwLmdldChlLmVDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gTWVzc2FnZURpZ2VzdCBtZDUgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJNRDUiKTsKLQkJU3RyaW5nIGlucHV0ID0gYXJnc1swXTsKLQkJLy8gYnl0ZVtdIGhhc2ggPSBtZDUuZGlnZXN0KGlucHV0LmdldEJ5dGVzKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImlucHV0OiAnIiArIGlucHV0ICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiSmF2YSdzIGhhc2ggY29kZTogIiArIGlucHV0Lmhhc2hDb2RlKCkpOyAvLyROT04tTkxTLTEkCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiaGFzaCBsZW5ndGg6ICIgKyBoYXNoLmxlbmd0aCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiYmFzZTY0IGVuY29kZWQ6ICIgKwotCQkvLyBEYXRhVmFsdWUuQmFzZTY0LmVuY29kZShoYXNoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigibmV3IEdVSUQ6ICIgKyBVbWFVdGlsLmdlbmVyYXRlR1VJRChpbnB1dCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL01lc3NhZ2VFeGNlcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9NZXNzYWdlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YTg4YmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL01lc3NhZ2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIG1ldGhvZCBsaWJyYXJ5IHBlcnNpc3RlbmNlIG9wZXJhdGlvbiBoYXMgZmFpbGVkLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUV4Y2VwdGlvbiBleHRlbmRzIFdyYXBwZWRFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhjZXB0aW9uIERVTU1ZX0VYQ0VQVElPTiA9IG5ldyBFeGNlcHRpb24oKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM5MDQ2ODI2NTY2ODMwMTM0MzNMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgYW4gZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBNZXNzYWdlRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKLQkJc3VwZXIobXNnLCBEVU1NWV9FWENFUFRJT04pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIGFuIGVycm9yIG1lc3NhZ2UKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBhbiBleGNlcHRpb24gb2JqZWN0Ci0JICovCi0JcHVibGljIE1lc3NhZ2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJc3VwZXIobWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MjYxYTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotY29weXJpZ2h0PUlCTSBDb3Jwb3JhdGlvbgotZXJyX2Nhbm5vdE1vZGlmeTA9Q2Fubm90IG1vZGlmeSAnJ3swfScnCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvVW1hQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWQxYmZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoaWNQcmltaXRpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5MZWFmRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2VhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLio7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFVtYVBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVW1hU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0gbmV3IFVtYVN3aXRjaDxBZGFwdGVyPigpIHsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VDbGFzc2lmaWVyKENsYXNzaWZpZXIgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ2xhc3NpZmllckFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlVHlwZShUeXBlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVR5cGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVBhY2thZ2VhYmxlRWxlbWVudChQYWNrYWdlYWJsZUVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUGFja2FnZWFibGVFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VOYW1lZEVsZW1lbnQoTmFtZWRFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU5hbWVkRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRWxlbWVudChFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVBhY2thZ2Uob3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVBhY2thZ2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZU5hbWVzcGFjZShOYW1lc3BhY2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTmFtZXNwYWNlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VDb25zdHJhaW50KENvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29uc3RyYWludEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlTWV0aG9kRWxlbWVudChNZXRob2RFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eShNZXRob2RFbGVtZW50UHJvcGVydHkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VLaW5kKEtpbmQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlS2luZEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQ29udGVudEVsZW1lbnQoQ29udGVudEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29udGVudEVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZURlc2NyaWJhYmxlRWxlbWVudChEZXNjcmliYWJsZUVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVzY3JpYmFibGVFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VDb250ZW50RGVzY3JpcHRpb24oQ29udGVudERlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlTWV0aG9kVW5pdChNZXRob2RVbml0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZFVuaXRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVN1cHBvcnRpbmdNYXRlcmlhbChTdXBwb3J0aW5nTWF0ZXJpYWwgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VHdWlkYW5jZShHdWlkYW5jZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlU2VjdGlvbihTZWN0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVNlY3Rpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVZhcmlhYmlsaXR5RWxlbWVudChWYXJpYWJpbGl0eUVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVmFyaWFiaWxpdHlFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VDb25jZXB0KENvbmNlcHQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29uY2VwdEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQ2hlY2tsaXN0KENoZWNrbGlzdCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDaGVja2xpc3RBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUd1aWRlbGluZShHdWlkZWxpbmUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlR3VpZGVsaW5lQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VFeGFtcGxlKEV4YW1wbGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRXhhbXBsZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUmV1c2FibGVBc3NldChSZXVzYWJsZUFzc2V0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJldXNhYmxlQXNzZXRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVRlcm1EZWZpbml0aW9uKFRlcm1EZWZpbml0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVRlcm1EZWZpbml0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygKLQkJCQlBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0FkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQXJ0aWZhY3QoQXJ0aWZhY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQXJ0aWZhY3RBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0KFdvcmtQcm9kdWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQoRnVsZmlsbGFibGVFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUZ1bGZpbGxhYmxlRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUmVwb3J0KFJlcG9ydCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSZXBvcnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVRlbXBsYXRlKFRlbXBsYXRlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVRlbXBsYXRlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VUb29sTWVudG9yKFRvb2xNZW50b3Igb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVG9vbE1lbnRvckFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKAotCQkJCUVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZURlbGl2ZXJhYmxlKERlbGl2ZXJhYmxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURlbGl2ZXJhYmxlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VPdXRjb21lKE91dGNvbWUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlT3V0Y29tZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlU3RlcChTdGVwIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVN0ZXBBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtEZWZpbml0aW9uKFdvcmtEZWZpbml0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdvcmtEZWZpbml0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VXaGl0ZXBhcGVyKFdoaXRlcGFwZXIgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlV2hpdGVwYXBlckFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFzayhUYXNrIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVRhc2tBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvbGUoUm9sZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSb2xlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VBcnRpZmFjdERlc2NyaXB0aW9uKEFydGlmYWN0RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdGlvbihXb3JrUHJvZHVjdERlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VSb2xlRGVzY3JpcHRpb24oUm9sZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJvbGVEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFza0Rlc2NyaXB0aW9uKFRhc2tEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUYXNrRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUd1aWRhbmNlRGVzY3JpcHRpb24oR3VpZGFuY2VEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQcmFjdGljZURlc2NyaXB0aW9uKFByYWN0aWNlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZVNldChSb2xlU2V0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJvbGVTZXRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUNvbnRlbnRDYXRlZ29yeShDb250ZW50Q2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29udGVudENhdGVnb3J5QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEb21haW4oRG9tYWluIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURvbWFpbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlV29ya1Byb2R1Y3RUeXBlKFdvcmtQcm9kdWN0VHlwZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdFR5cGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZURpc2NpcGxpbmVHcm91cGluZyhEaXNjaXBsaW5lR3JvdXBpbmcgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEaXNjaXBsaW5lKERpc2NpcGxpbmUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQWN0aXZpdHkoQWN0aXZpdHkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KFdvcmtCcmVha2Rvd25FbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VCcmVha2Rvd25FbGVtZW50KEJyZWFrZG93bkVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQnJlYWtkb3duRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUHJvY2Vzc0VsZW1lbnQoUHJvY2Vzc0VsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0VsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVBsYW5uaW5nRGF0YShQbGFubmluZ0RhdGEgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUGxhbm5pbmdEYXRhQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrT3JkZXIoV29ya09yZGVyIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdvcmtPcmRlckFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9hZG1hcChSb2FkbWFwIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJvYWRtYXBBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVRvb2woVG9vbCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUb29sQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VSb2xlU2V0R3JvdXBpbmcoUm9sZVNldEdyb3VwaW5nIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJvbGVTZXRHcm91cGluZ0FkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQ3VzdG9tQ2F0ZWdvcnkoQ3VzdG9tQ2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ3VzdG9tQ2F0ZWdvcnlBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZFBhY2thZ2UoTWV0aG9kUGFja2FnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNZXRob2RQYWNrYWdlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VDb250ZW50UGFja2FnZShDb250ZW50UGFja2FnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDb250ZW50UGFja2FnZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlTWlsZXN0b25lKE1pbGVzdG9uZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNaWxlc3RvbmVBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRvcihXb3JrUHJvZHVjdERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEZXNjcmlwdG9yKERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlSXRlcmF0aW9uKEl0ZXJhdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVBoYXNlKFBoYXNlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVBoYXNlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VUZWFtUHJvZmlsZShUZWFtUHJvZmlsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUZWFtUHJvZmlsZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZURlc2NyaXB0b3IoUm9sZURlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVRhc2tEZXNjcmlwdG9yKFRhc2tEZXNjcmlwdG9yIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VDb21wb3NpdGVSb2xlKENvbXBvc2l0ZVJvbGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29tcG9zaXRlUm9sZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRGVsaXZlcnlQcm9jZXNzKERlbGl2ZXJ5UHJvY2VzcyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUNhcGFiaWxpdHlQYXR0ZXJuKENhcGFiaWxpdHlQYXR0ZXJuIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlTWV0aG9kUGx1Z2luKE1ldGhvZFBsdWdpbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNZXRob2RQbHVnaW5BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKAotCQkJCVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQcmFjdGljZShQcmFjdGljZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQcmFjdGljZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKAotCQkJCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24oQWN0aXZpdHlEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigKLQkJCQlEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUHJvY2Vzc0Rlc2NyaXB0aW9uKFByb2Nlc3NEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZURlc2NyaXB0b3JEZXNjcmlwdGlvbihEZXNjcmlwdG9yRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcigKLQkJCQlQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUHJvY2Vzc0NvbXBvbmVudChQcm9jZXNzQ29tcG9uZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NQYWNrYWdlKFByb2Nlc3NQYWNrYWdlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NQYWNrYWdlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEaWFncmFtKERpYWdyYW0gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGlhZ3JhbUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlR3JhcGhOb2RlKEdyYXBoTm9kZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVHcmFwaE5vZGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlR3JhcGhFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEaWFncmFtRWxlbWVudChEaWFncmFtRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEaWFncmFtRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUmVmZXJlbmNlKFJlZmVyZW5jZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSZWZlcmVuY2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb3BlcnR5KFByb3BlcnR5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb3BlcnR5QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQb2ludChQb2ludCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQb2ludEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRGlhZ3JhbUxpbmsoRGlhZ3JhbUxpbmsgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGlhZ3JhbUxpbmtBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUdyYXBoQ29ubmVjdG9yKEdyYXBoQ29ubmVjdG9yIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUdyYXBoQ29ubmVjdG9yQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VHcmFwaEVkZ2UoR3JhcGhFZGdlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUdyYXBoRWRnZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlU2VtYW50aWNNb2RlbEJyaWRnZShTZW1hbnRpY01vZGVsQnJpZGdlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVNlbWFudGljTW9kZWxCcmlkZ2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZURpbWVuc2lvbihEaW1lbnNpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGltZW5zaW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKAotCQkJCVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoCi0JCQkJU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgKLQkJCQlDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDb3JlU2VtYW50aWNNb2RlbEJyaWRnZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlTGVhZkVsZW1lbnQoTGVhZkVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTGVhZkVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVRleHRFbGVtZW50KFRleHRFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVRleHRFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VJbWFnZShJbWFnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVJbWFnZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlR3JhcGhpY1ByaW1pdGl2ZShHcmFwaGljUHJpbWl0aXZlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUdyYXBoaWNQcmltaXRpdmVBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVBvbHlsaW5lKFBvbHlsaW5lIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVBvbHlsaW5lQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VFbGxpcHNlKEVsbGlwc2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRWxsaXBzZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUHJvY2Vzc0ZhbWlseShQcm9jZXNzRmFtaWx5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NGYW1pbHlBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNZXRob2RMaWJyYXJ5QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpIHRhcmdldCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXIgPGVtPkNsYXNzaWZpZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNsYXNzaWZpZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudCA8ZW0+TmFtZWQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVOYW1lZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZWFibGVFbGVtZW50IDxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZWFibGVFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhY2thZ2VhYmxlRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlIDxlbT5QYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQYWNrYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVzcGFjZSA8ZW0+TmFtZXNwYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZXNwYWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5hbWVzcGFjZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50IDxlbT5NZXRob2QgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50IDxlbT5Db25zdHJhaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25zdHJhaW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmQgPGVtPktpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUtpbmRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQgPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnRFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCA8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uIDxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uIDxlbT5TZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUgPGVtPlJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudCA8ZW0+RnVsZmlsbGFibGUgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVGdWxmaWxsYWJsZUVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayA8ZW0+VGFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbiA8ZW0+V29yayBEZWZpbml0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya0RlZmluaXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcCA8ZW0+U3RlcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RlcEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZSA8ZW0+R3VpZGFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCA8ZW0+QXJ0aWZhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcnRpZmFjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZSA8ZW0+RGVsaXZlcmFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyYWJsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lIDxlbT5PdXRjb21lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRjb21lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RQYWNrYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlIDxlbT5Db250ZW50IFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50UGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uIDxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiA8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uIDxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24gPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0Rlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24gPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24gPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcmFjdGljZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5IDxlbT5BY3Rpdml0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50IDxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbiA8ZW0+SXRlcmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZSA8ZW0+UGhhc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaGFzZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSA8ZW0+VGVhbSBQcm9maWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IgPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlciA8ZW0+V29yayBPcmRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrT3JkZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQgPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQbGFubmluZ0RhdGFBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvciA8ZW0+RGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciA8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZSA8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBvc2l0ZVJvbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIDxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiA8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24gPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdCA8ZW0+Q29uY2VwdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29uY2VwdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3QgPGVtPkNoZWNrbGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDaGVja2xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXhhbXBsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmUgPGVtPkd1aWRlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHdWlkZWxpbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9uc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQgPGVtPlJlcG9ydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXBvcnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGUgPGVtPlRlbXBsYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVtcGxhdGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yIDxlbT5Ub29sIE1lbnRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVG9vbE1lbnRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXaGl0ZXBhcGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uIDxlbT5UZXJtIERlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZXJtRGVmaW5pdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyA8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZSA8ZW0+UHJhY3RpY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcmFjdGljZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0IDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmV1c2FibGVBc3NldEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lIDxlbT5EaXNjaXBsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNjaXBsaW5lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeSA8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50Q2F0ZWdvcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldCA8ZW0+Um9sZSBTZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVTZXRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluIDxlbT5Eb21haW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRG9tYWluQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZSA8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3RUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZyA8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbCA8ZW0+VG9vbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2wKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVG9vbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmcgPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVTZXRHcm91cGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeSA8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ3VzdG9tQ2F0ZWdvcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzIDxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuIDxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSA8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXAgPGVtPlJvYWRtYXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvYWRtYXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudCA8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UgPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NQYWNrYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciA8ZW0+UHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RQbHVnaW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVZhcmlhYmlsaXR5RWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0IDxlbT5NZXRob2QgVW5pdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kVW5pdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5IDxlbT5Qcm9jZXNzIEZhbWlseTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0ZhbWlseUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5IDxlbT5NZXRob2QgTGlicmFyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kTGlicmFyeUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCA8ZW0+UG9pbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb2ludEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3JhcGhFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50IDxlbT5EaWFncmFtIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaWFncmFtRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayA8ZW0+RGlhZ3JhbSBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlhZ3JhbUxpbmtBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IgPGVtPkdyYXBoIENvbm5lY3RvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdyYXBoQ29ubmVjdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UgPGVtPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VtYW50aWNNb2RlbEJyaWRnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24gPGVtPkRpbWVuc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaW1lbnNpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlIDxlbT5SZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVmZXJlbmNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5IDxlbT5Qcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb3BlcnR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZSA8ZW0+R3JhcGggRWRnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHcmFwaEVkZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlhZ3JhbUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGUgPGVtPkdyYXBoIE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3JhcGhOb2RlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IDxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2UgPGVtPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UgPGVtPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTGVhZkVsZW1lbnQgPGVtPkxlYWYgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkxlYWZFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxlYWZFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50IDxlbT5UZXh0IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZXh0RWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZSA8ZW0+SW1hZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbWFnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaGljUHJpbWl0aXZlIDxlbT5HcmFwaGljIFByaW1pdGl2ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoaWNQcmltaXRpdmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3JhcGhpY1ByaW1pdGl2ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZSA8ZW0+UG9seWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb2x5bGluZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlIDxlbT5FbGxpcHNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFbGxpcHNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL1VtYUFkYXB0ZXJGYWN0b3J5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1VtYVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1VtYVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWZjODQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIFVNQSByZXNvdXJjZSBidW5kbGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVW1hUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IFVtYVJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFVtYVJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weXJpZ2h0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyX2Nhbm5vdE1vZGlmeTA7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBVbWFSZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvVW1hU3dpdGNoLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvVW1hU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzM2JmZTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1VtYVN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhpY1ByaW1pdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkxlYWZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZWFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuKjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYVN3aXRjaDxUPiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBVbWFQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFQgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0gZWxzZSB7Ci0JCQlMaXN0PEVDbGFzcz4gZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybiBlU3VwZXJUeXBlcy5pc0VtcHR5KCkgPyBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6IGRvU3dpdGNoKAotCQkJCQllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNMQVNTSUZJRVI6IHsKLQkJCUNsYXNzaWZpZXIgY2xhc3NpZmllciA9IChDbGFzc2lmaWVyKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihjbGFzc2lmaWVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShjbGFzc2lmaWVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNsYXNzaWZpZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY2xhc3NpZmllcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoY2xhc3NpZmllcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5UWVBFOiB7Ci0JCQlUeXBlIHR5cGUgPSAoVHlwZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVR5cGUodHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0eXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUEFDS0FHRUFCTEVfRUxFTUVOVDogewotCQkJUGFja2FnZWFibGVFbGVtZW50IHBhY2thZ2VhYmxlRWxlbWVudCA9IChQYWNrYWdlYWJsZUVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocGFja2FnZWFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHBhY2thZ2VhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocGFja2FnZWFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlQ6IHsKLQkJCU5hbWVkRWxlbWVudCBuYW1lZEVsZW1lbnQgPSAoTmFtZWRFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG5hbWVkRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQobmFtZWRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkVMRU1FTlQ6IHsKLQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlRWxlbWVudChlbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBBQ0tBR0U6IHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSBwYWNrYWdlXyA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VQYWNrYWdlKHBhY2thZ2VfKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZXNwYWNlKHBhY2thZ2VfKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHBhY2thZ2VfKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHBhY2thZ2VfKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwYWNrYWdlXyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5OQU1FU1BBQ0U6IHsKLQkJCU5hbWVzcGFjZSBuYW1lc3BhY2UgPSAoTmFtZXNwYWNlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlTmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChuYW1lc3BhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG5hbWVzcGFjZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UOiB7Ci0JCQlDb25zdHJhaW50IGNvbnN0cmFpbnQgPSAoQ29uc3RyYWludCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUNvbnN0cmFpbnQoY29uc3RyYWludCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29uc3RyYWludCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb25zdHJhaW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbnN0cmFpbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbnN0cmFpbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlQ6IHsKLQkJCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IChNZXRob2RFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQobWV0aG9kRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTogewotCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50UHJvcGVydHkobWV0aG9kRWxlbWVudFByb3BlcnR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RFbGVtZW50UHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5LSU5EOiB7Ci0JCQlLaW5kIGtpbmQgPSAoS2luZCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUtpbmQoa2luZCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGtpbmQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoa2luZCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChraW5kKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChraW5kKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihraW5kKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGtpbmQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGtpbmQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoa2luZCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoa2luZCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlQ6IHsKLQkJCUNvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihjb250ZW50RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoY29udGVudEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlQ6IHsKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBkZXNjcmliYWJsZUVsZW1lbnQgPSAoRGVzY3JpYmFibGVFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihkZXNjcmliYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShkZXNjcmliYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkZXNjcmliYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTjogewotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IChDb250ZW50RGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oY29udGVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChjb250ZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb250ZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjb250ZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVQ6IHsKLQkJCU1ldGhvZFVuaXQgbWV0aG9kVW5pdCA9IChNZXRob2RVbml0KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChtZXRob2RVbml0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RVbml0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZFVuaXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kVW5pdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQobWV0aG9kVW5pdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5TVVBQT1JUSU5HX01BVEVSSUFMOiB7Ci0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwgc3VwcG9ydGluZ01hdGVyaWFsID0gKFN1cHBvcnRpbmdNYXRlcmlhbCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVN1cHBvcnRpbmdNYXRlcmlhbChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZShzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0U6IHsKLQkJCUd1aWRhbmNlIGd1aWRhbmNlID0gKEd1aWRhbmNlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlR3VpZGFuY2UoZ3VpZGFuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChndWlkYW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChndWlkYW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChndWlkYW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGd1aWRhbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGd1aWRhbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShndWlkYW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChndWlkYW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTjogewotCQkJU2VjdGlvbiBzZWN0aW9uID0gKFNlY3Rpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VTZWN0aW9uKHNlY3Rpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoc2VjdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoc2VjdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChzZWN0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHNlY3Rpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHNlY3Rpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVDogewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZhcmlhYmlsaXR5RWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQodmFyaWFiaWxpdHlFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh2YXJpYWJpbGl0eUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodmFyaWFiaWxpdHlFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHZhcmlhYmlsaXR5RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQodmFyaWFiaWxpdHlFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkNPTkNFUFQ6IHsKLQkJCUNvbmNlcHQgY29uY2VwdCA9IChDb25jZXB0KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQ29uY2VwdChjb25jZXB0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3VpZGFuY2UoY29uY2VwdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGNvbmNlcHQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY29uY2VwdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChjb25jZXB0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb25jZXB0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihjb25jZXB0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbmNlcHQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGNvbmNlcHQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29uY2VwdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29uY2VwdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DSEVDS0xJU1Q6IHsKLQkJCUNoZWNrbGlzdCBjaGVja2xpc3QgPSAoQ2hlY2tsaXN0KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQ2hlY2tsaXN0KGNoZWNrbGlzdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGNoZWNrbGlzdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGNoZWNrbGlzdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGNoZWNrbGlzdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGNoZWNrbGlzdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGNoZWNrbGlzdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlERUxJTkU6IHsKLQkJCUd1aWRlbGluZSBndWlkZWxpbmUgPSAoR3VpZGVsaW5lKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlR3VpZGVsaW5lKGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoZ3VpZGVsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5FWEFNUExFOiB7Ci0JCQlFeGFtcGxlIGV4YW1wbGUgPSAoRXhhbXBsZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUV4YW1wbGUoZXhhbXBsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGV4YW1wbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChleGFtcGxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGV4YW1wbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoZXhhbXBsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZXhhbXBsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoZXhhbXBsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChleGFtcGxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShleGFtcGxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGV4YW1wbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGV4YW1wbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUkVVU0FCTEVfQVNTRVQ6IHsKLQkJCVJldXNhYmxlQXNzZXQgcmV1c2FibGVBc3NldCA9IChSZXVzYWJsZUFzc2V0KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUmV1c2FibGVBc3NldChyZXVzYWJsZUFzc2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3VpZGFuY2UocmV1c2FibGVBc3NldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihyZXVzYWJsZUFzc2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHJldXNhYmxlQXNzZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5URVJNX0RFRklOSVRJT046IHsKLQkJCVRlcm1EZWZpbml0aW9uIHRlcm1EZWZpbml0aW9uID0gKFRlcm1EZWZpbml0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlVGVybURlZmluaXRpb24odGVybURlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZSh0ZXJtRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIodGVybURlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGVybURlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTzogewotCQkJQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gYXBwbGljYWJsZU1ldGFDbGFzc0luZm8gPSAoQXBwbGljYWJsZU1ldGFDbGFzc0luZm8pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyhhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoYXBwbGljYWJsZU1ldGFDbGFzc0luZm8pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVDogewotCQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VBcnRpZmFjdChhcnRpZmFjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0KGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihhcnRpZmFjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhcnRpZmFjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVDogewotCQkJV29ya1Byb2R1Y3Qgd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdCh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRnVsZmlsbGFibGVFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIod29ya1Byb2R1Y3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya1Byb2R1Y3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5GVUxGSUxMQUJMRV9FTEVNRU5UOiB7Ci0JCQlGdWxmaWxsYWJsZUVsZW1lbnQgZnVsZmlsbGFibGVFbGVtZW50ID0gKEZ1bGZpbGxhYmxlRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUZ1bGZpbGxhYmxlRWxlbWVudChmdWxmaWxsYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZnVsZmlsbGFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChmdWxmaWxsYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGZ1bGZpbGxhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChmdWxmaWxsYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGZ1bGZpbGxhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChmdWxmaWxsYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGZ1bGZpbGxhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5SRVBPUlQ6IHsKLQkJCVJlcG9ydCByZXBvcnQgPSAoUmVwb3J0KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUmVwb3J0KHJlcG9ydCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHJlcG9ydCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJlcG9ydCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQocmVwb3J0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHJlcG9ydCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHJlcG9ydCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHJlcG9ydCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5URU1QTEFURTogewotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSAoVGVtcGxhdGUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih0ZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0ZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfTUVOVE9SOiB7Ci0JCQlUb29sTWVudG9yIHRvb2xNZW50b3IgPSAoVG9vbE1lbnRvcikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVRvb2xNZW50b3IodG9vbE1lbnRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHRvb2xNZW50b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh0b29sTWVudG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIodG9vbE1lbnRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0b29sTWVudG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh0b29sTWVudG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzogewotCQkJRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA9IChFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3VpZGFuY2UoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFOiB7Ci0JCQlEZWxpdmVyYWJsZSBkZWxpdmVyYWJsZSA9IChEZWxpdmVyYWJsZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZURlbGl2ZXJhYmxlKGRlbGl2ZXJhYmxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3QoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUZ1bGZpbGxhYmxlRWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGRlbGl2ZXJhYmxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuT1VUQ09NRTogewotCQkJT3V0Y29tZSBvdXRjb21lID0gKE91dGNvbWUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VPdXRjb21lKG91dGNvbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdChvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQob3V0Y29tZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUZ1bGZpbGxhYmxlRWxlbWVudChvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KG91dGNvbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQob3V0Y29tZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQob3V0Y29tZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIob3V0Y29tZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG91dGNvbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG91dGNvbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuU1RFUDogewotCQkJU3RlcCBzdGVwID0gKFN0ZXApIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VTdGVwKHN0ZXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VTZWN0aW9uKHN0ZXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbihzdGVwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHN0ZXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHN0ZXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoc3RlcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChzdGVwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChzdGVwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTjogewotCQkJV29ya0RlZmluaXRpb24gd29ya0RlZmluaXRpb24gPSAoV29ya0RlZmluaXRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbih3b3JrRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya0RlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya0RlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya0RlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtEZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLldISVRFUEFQRVI6IHsKLQkJCVdoaXRlcGFwZXIgd2hpdGVwYXBlciA9IChXaGl0ZXBhcGVyKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlV2hpdGVwYXBlcih3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29uY2VwdCh3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3VpZGFuY2Uod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudCh3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHdoaXRlcGFwZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLOiB7Ci0JCQlUYXNrIHRhc2sgPSAoVGFzaykgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVRhc2sodGFzayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHRhc2spOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbih0YXNrKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRhc2spOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQodGFzayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGFzayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIodGFzayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0YXNrKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh0YXNrKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRhc2spOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHRhc2spOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUk9MRTogewotCQkJUm9sZSByb2xlID0gKFJvbGUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VSb2xlKHJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChyb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRnVsZmlsbGFibGVFbGVtZW50KHJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChyb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihyb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTjogewotCQkJQXJ0aWZhY3REZXNjcmlwdGlvbiBhcnRpZmFjdERlc2NyaXB0aW9uID0gKEFydGlmYWN0RGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VBcnRpZmFjdERlc2NyaXB0aW9uKGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OOiB7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0aW9uIHdvcmtQcm9kdWN0RGVzY3JpcHRpb24gPSAoV29ya1Byb2R1Y3REZXNjcmlwdGlvbikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24od29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbih3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdCh3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTjogewotCQkJRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBkZWxpdmVyYWJsZURlc2NyaXB0aW9uID0gKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VEZWxpdmVyYWJsZURlc2NyaXB0aW9uKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTjogewotCQkJUm9sZURlc2NyaXB0aW9uIHJvbGVEZXNjcmlwdGlvbiA9IChSb2xlRGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VSb2xlRGVzY3JpcHRpb24ocm9sZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKHJvbGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQocm9sZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2xlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocm9sZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJvbGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9sZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT046IHsKLQkJCVRhc2tEZXNjcmlwdGlvbiB0YXNrRGVzY3JpcHRpb24gPSAoVGFza0Rlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlVGFza0Rlc2NyaXB0aW9uKHRhc2tEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbih0YXNrRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHRhc2tEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGFza0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRhc2tEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0YXNrRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHRhc2tEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTjogewotCQkJR3VpZGFuY2VEZXNjcmlwdGlvbiBndWlkYW5jZURlc2NyaXB0aW9uID0gKEd1aWRhbmNlRGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VHdWlkYW5jZURlc2NyaXB0aW9uKGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT046IHsKLQkJCVByYWN0aWNlRGVzY3JpcHRpb24gcHJhY3RpY2VEZXNjcmlwdGlvbiA9IChQcmFjdGljZURlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUHJhY3RpY2VEZXNjcmlwdGlvbihwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUOiB7Ci0JCQlSb2xlU2V0IHJvbGVTZXQgPSAoUm9sZVNldCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVJvbGVTZXQocm9sZVNldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShyb2xlU2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocm9sZVNldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyb2xlU2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHJvbGVTZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJvbGVTZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHJvbGVTZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocm9sZVNldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocm9sZVNldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2xlU2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChyb2xlU2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUlk6IHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBjb250ZW50Q2F0ZWdvcnkgPSAoQ29udGVudENhdGVnb3J5KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU46IHsKLQkJCURvbWFpbiBkb21haW4gPSAoRG9tYWluKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlRG9tYWluKGRvbWFpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShkb21haW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChkb21haW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGRvbWFpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihkb21haW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShkb21haW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkb21haW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEU6IHsKLQkJCVdvcmtQcm9kdWN0VHlwZSB3b3JrUHJvZHVjdFR5cGUgPSAoV29ya1Byb2R1Y3RUeXBlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3RUeXBlKHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeSh3b3JrUHJvZHVjdFR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh3b3JrUHJvZHVjdFR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih3b3JrUHJvZHVjdFR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh3b3JrUHJvZHVjdFR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrUHJvZHVjdFR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElORzogewotCQkJRGlzY2lwbGluZUdyb3VwaW5nIGRpc2NpcGxpbmVHcm91cGluZyA9IChEaXNjaXBsaW5lR3JvdXBpbmcpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VEaXNjaXBsaW5lR3JvdXBpbmcoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FOiB7Ci0JCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZURpc2NpcGxpbmUoZGlzY2lwbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShkaXNjaXBsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGRpc2NpcGxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoZGlzY2lwbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZOiB7Ci0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUFjdGl2aXR5KGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbihhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVDogewotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgd29ya0JyZWFrZG93bkVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlQ6IHsKLQkJCUJyZWFrZG93bkVsZW1lbnQgYnJlYWtkb3duRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihicmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGJyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0VMRU1FTlQ6IHsKLQkJCVByb2Nlc3NFbGVtZW50IHByb2Nlc3NFbGVtZW50ID0gKFByb2Nlc3NFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocHJvY2Vzc0VsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJvY2Vzc0VsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihwcm9jZXNzRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocHJvY2Vzc0VsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc0VsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEE6IHsKLQkJCVBsYW5uaW5nRGF0YSBwbGFubmluZ0RhdGEgPSAoUGxhbm5pbmdEYXRhKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUGxhbm5pbmdEYXRhKHBsYW5uaW5nRGF0YSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocGxhbm5pbmdEYXRhKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocGxhbm5pbmdEYXRhKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocGxhbm5pbmdEYXRhKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVI6IHsKLQkJCVdvcmtPcmRlciB3b3JrT3JkZXIgPSAoV29ya09yZGVyKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlV29ya09yZGVyKHdvcmtPcmRlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHdvcmtPcmRlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh3b3JrT3JkZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtPcmRlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIod29ya09yZGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtPcmRlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUod29ya09yZGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtPcmRlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQod29ya09yZGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlJPQURNQVA6IHsKLQkJCVJvYWRtYXAgcm9hZG1hcCA9IChSb2FkbWFwKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUm9hZG1hcChyb2FkbWFwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3VpZGFuY2Uocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJvYWRtYXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChyb2FkbWFwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2FkbWFwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihyb2FkbWFwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvYWRtYXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHJvYWRtYXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MOiB7Ci0JCQlUb29sIHRvb2wgPSAoVG9vbCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVRvb2wodG9vbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeSh0b29sKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQodG9vbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0b29sKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHRvb2wpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRvb2wpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHRvb2wpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodG9vbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUodG9vbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0b29sKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0b29sKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HOiB7Ci0JCQlSb2xlU2V0R3JvdXBpbmcgcm9sZVNldEdyb3VwaW5nID0gKFJvbGVTZXRHcm91cGluZykgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVJvbGVTZXRHcm91cGluZyhyb2xlU2V0R3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkocm9sZVNldEdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocm9sZVNldEdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocm9sZVNldEdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocm9sZVNldEdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9sZVNldEdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWTogewotCQkJQ3VzdG9tQ2F0ZWdvcnkgY3VzdG9tQ2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VDdXN0b21DYXRlZ29yeShjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGN1c3RvbUNhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRTogewotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlID0gKE1ldGhvZFBhY2thZ2UpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VNZXRob2RQYWNrYWdlKG1ldGhvZFBhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZFBhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlKG1ldGhvZFBhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWV0aG9kUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVzcGFjZShtZXRob2RQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZFBhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZFBhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFOiB7Ci0JCQlDb250ZW50UGFja2FnZSBjb250ZW50UGFja2FnZSA9IChDb250ZW50UGFja2FnZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUNvbnRlbnRQYWNrYWdlKGNvbnRlbnRQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kUGFja2FnZShjb250ZW50UGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29udGVudFBhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlKGNvbnRlbnRQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbnRlbnRQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZXNwYWNlKGNvbnRlbnRQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbnRlbnRQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjb250ZW50UGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5NSUxFU1RPTkU6IHsKLQkJCU1pbGVzdG9uZSBtaWxlc3RvbmUgPSAoTWlsZXN0b25lKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlTWlsZXN0b25lKG1pbGVzdG9uZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihtaWxlc3RvbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShtaWxlc3RvbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChtaWxlc3RvbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1I6IHsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3b3JrUHJvZHVjdERlc2NyaXB0b3IgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdG9yKHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaXB0b3Iod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SOiB7Ci0JCQlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoRGVzY3JpcHRvcikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoZGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShkZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuSVRFUkFUSU9OOiB7Ci0JCQlJdGVyYXRpb24gaXRlcmF0aW9uID0gKEl0ZXJhdGlvbikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUl0ZXJhdGlvbihpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VBY3Rpdml0eShpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtEZWZpbml0aW9uKGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUEhBU0U6IHsKLQkJCVBoYXNlIHBoYXNlID0gKFBoYXNlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUGhhc2UocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VBY3Rpdml0eShwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRnVsZmlsbGFibGVFbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0RlZmluaXRpb24ocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRTogewotCQkJVGVhbVByb2ZpbGUgdGVhbVByb2ZpbGUgPSAoVGVhbVByb2ZpbGUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VUZWFtUHJvZmlsZSh0ZWFtUHJvZmlsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHRlYW1Qcm9maWxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh0ZWFtUHJvZmlsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SOiB7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciA9IChSb2xlRGVzY3JpcHRvcikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVJvbGVEZXNjcmlwdG9yKHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpcHRvcihyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SOiB7Ci0JCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVRhc2tEZXNjcmlwdG9yKHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmlwdG9yKHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIodGFza0Rlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRTogewotCQkJQ29tcG9zaXRlUm9sZSBjb21wb3NpdGVSb2xlID0gKENvbXBvc2l0ZVJvbGUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VDb21wb3NpdGVSb2xlKGNvbXBvc2l0ZVJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VSb2xlRGVzY3JpcHRvcihjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpcHRvcihjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGNvbXBvc2l0ZVJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTOiB7Ci0JCQlEZWxpdmVyeVByb2Nlc3MgZGVsaXZlcnlQcm9jZXNzID0gKERlbGl2ZXJ5UHJvY2VzcykgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZURlbGl2ZXJ5UHJvY2VzcyhkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzKGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUFjdGl2aXR5KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUZ1bGZpbGxhYmxlRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0RlZmluaXRpb24oZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTOiB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvY2VzcyA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VQcm9jZXNzKHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VBY3Rpdml0eShwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUZ1bGZpbGxhYmxlRWxlbWVudChwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbihwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DQVBBQklMSVRZX1BBVFRFUk46IHsKLQkJCUNhcGFiaWxpdHlQYXR0ZXJuIGNhcGFiaWxpdHlQYXR0ZXJuID0gKENhcGFiaWxpdHlQYXR0ZXJuKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQ2FwYWJpbGl0eVBhdHRlcm4oY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzKGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQWN0aXZpdHkoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUZ1bGZpbGxhYmxlRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtEZWZpbml0aW9uKGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTjogewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWd1cmF0aW9uID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VNZXRob2RDb25maWd1cmF0aW9uKG1ldGhvZENvbmZpZ3VyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KG1ldGhvZENvbmZpZ3VyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZENvbmZpZ3VyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU46IHsKLQkJCU1ldGhvZFBsdWdpbiBtZXRob2RQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kUGx1Z2luKG1ldGhvZFBsdWdpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQobWV0aG9kUGx1Z2luKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZShtZXRob2RQbHVnaW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZFBsdWdpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVzcGFjZShtZXRob2RQbHVnaW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWV0aG9kUGx1Z2luKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZFBsdWdpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQobWV0aG9kUGx1Z2luKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEU6IHsKLQkJCVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlID0gKFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQWN0aXZpdHkocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUZ1bGZpbGxhYmxlRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtEZWZpbml0aW9uKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRTogewotCQkJUHJhY3RpY2UgcHJhY3RpY2UgPSAoUHJhY3RpY2UpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VQcmFjdGljZShwcmFjdGljZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocHJhY3RpY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJhY3RpY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQocHJhY3RpY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihwcmFjdGljZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcmFjdGljZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocHJhY3RpY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJhY3RpY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OOiB7Ci0JCQlCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uID0gKEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbihicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT046IHsKLQkJCUFjdGl2aXR5RGVzY3JpcHRpb24gYWN0aXZpdHlEZXNjcmlwdGlvbiA9IChBY3Rpdml0eURlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQWN0aXZpdHlEZXNjcmlwdGlvbihhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTjogewotCQkJRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gPSAoRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbihkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NEZXNjcmlwdGlvbihkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24oZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTjogewotCQkJUHJvY2Vzc0Rlc2NyaXB0aW9uIHByb2Nlc3NEZXNjcmlwdGlvbiA9IChQcm9jZXNzRGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VQcm9jZXNzRGVzY3JpcHRpb24ocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQWN0aXZpdHlEZXNjcmlwdGlvbihwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24ocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT046IHsKLQkJCURlc2NyaXB0b3JEZXNjcmlwdGlvbiBkZXNjcmlwdG9yRGVzY3JpcHRpb24gPSAoRGVzY3JpcHRvckRlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlRGVzY3JpcHRvckRlc2NyaXB0aW9uKGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbihkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUjogewotCQkJUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IgcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IgPSAoUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcihwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaXB0b3IocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UOiB7Ci0JCQlQcm9jZXNzQ29tcG9uZW50IHByb2Nlc3NDb21wb25lbnQgPSAoUHJvY2Vzc0NvbXBvbmVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVByb2Nlc3NDb21wb25lbnQocHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NQYWNrYWdlKHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RQYWNrYWdlKHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlKHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVzcGFjZShwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFOiB7Ci0JCQlQcm9jZXNzUGFja2FnZSBwcm9jZXNzUGFja2FnZSA9IChQcm9jZXNzUGFja2FnZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVByb2Nlc3NQYWNrYWdlKHByb2Nlc3NQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kUGFja2FnZShwcm9jZXNzUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc1BhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlKHByb2Nlc3NQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZXNwYWNlKHByb2Nlc3NQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNOiB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZURpYWdyYW0oZGlhZ3JhbSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUdyYXBoTm9kZShkaWFncmFtKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3JhcGhFbGVtZW50KGRpYWdyYW0pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChkaWFncmFtKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkaWFncmFtKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRpYWdyYW0pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGlhZ3JhbSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGlhZ3JhbSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9OT0RFOiB7Ci0JCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gKEdyYXBoTm9kZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUdyYXBoTm9kZShncmFwaE5vZGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHcmFwaEVsZW1lbnQoZ3JhcGhOb2RlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoZ3JhcGhOb2RlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChncmFwaE5vZGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZ3JhcGhOb2RlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGdyYXBoTm9kZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZ3JhcGhOb2RlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlQ6IHsKLQkJCUdyYXBoRWxlbWVudCBncmFwaEVsZW1lbnQgPSAoR3JhcGhFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlR3JhcGhFbGVtZW50KGdyYXBoRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KGdyYXBoRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3JhcGhFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGdyYXBoRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChncmFwaEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGdyYXBoRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlQ6IHsKLQkJCURpYWdyYW1FbGVtZW50IGRpYWdyYW1FbGVtZW50ID0gKERpYWdyYW1FbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoZGlhZ3JhbUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRpYWdyYW1FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRpYWdyYW1FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRpYWdyYW1FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkaWFncmFtRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0U6IHsKLQkJCVJlZmVyZW5jZSByZWZlcmVuY2UgPSAoUmVmZXJlbmNlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUmVmZXJlbmNlKHJlZmVyZW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KHJlZmVyZW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocmVmZXJlbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJlZmVyZW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyZWZlcmVuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHJlZmVyZW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWTogewotCQkJUHJvcGVydHkgcHJvcGVydHkgPSAoUHJvcGVydHkpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VQcm9wZXJ0eShwcm9wZXJ0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KHByb3BlcnR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9wZXJ0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9wZXJ0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9wZXJ0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUE9JTlQ6IHsKLQkJCVBvaW50IHBvaW50ID0gKFBvaW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUG9pbnQocG9pbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LOiB7Ci0JCQlEaWFncmFtTGluayBkaWFncmFtTGluayA9IChEaWFncmFtTGluaykgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZURpYWdyYW1MaW5rKGRpYWdyYW1MaW5rKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoZGlhZ3JhbUxpbmspOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRpYWdyYW1MaW5rKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRpYWdyYW1MaW5rKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRpYWdyYW1MaW5rKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkaWFncmFtTGluayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1I6IHsKLQkJCUdyYXBoQ29ubmVjdG9yIGdyYXBoQ29ubmVjdG9yID0gKEdyYXBoQ29ubmVjdG9yKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlR3JhcGhDb25uZWN0b3IoZ3JhcGhDb25uZWN0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHcmFwaEVsZW1lbnQoZ3JhcGhDb25uZWN0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChncmFwaENvbm5lY3Rvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3JhcGhDb25uZWN0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZ3JhcGhDb25uZWN0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZ3JhcGhDb25uZWN0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGdyYXBoQ29ubmVjdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0U6IHsKLQkJCUdyYXBoRWRnZSBncmFwaEVkZ2UgPSAoR3JhcGhFZGdlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlR3JhcGhFZGdlKGdyYXBoRWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUdyYXBoRWxlbWVudChncmFwaEVkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChncmFwaEVkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGdyYXBoRWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChncmFwaEVkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZ3JhcGhFZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChncmFwaEVkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFOiB7Ci0JCQlTZW1hbnRpY01vZGVsQnJpZGdlIHNlbWFudGljTW9kZWxCcmlkZ2UgPSAoU2VtYW50aWNNb2RlbEJyaWRnZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVNlbWFudGljTW9kZWxCcmlkZ2Uoc2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KHNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoc2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChzZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChzZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTjogewotCQkJRGltZW5zaW9uIGRpbWVuc2lvbiA9IChEaW1lbnNpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VEaW1lbnNpb24oZGltZW5zaW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRTogewotCQkJUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlID0gKFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UOiB7Ci0JCQlTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCBzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCA9IChTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlU2VtYW50aWNNb2RlbEJyaWRnZShzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVU1BX1NFTUFOVElDX01PREVMX0JSSURHRTogewotCQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSB1bWFTZW1hbnRpY01vZGVsQnJpZGdlID0gKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VVTUFTZW1hbnRpY01vZGVsQnJpZGdlKHVtYVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VTZW1hbnRpY01vZGVsQnJpZGdlKHVtYVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudCh1bWFTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh1bWFTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHVtYVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodW1hU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQodW1hU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DT1JFX1NFTUFOVElDX01PREVMX0JSSURHRTogewotCQkJQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UgY29yZVNlbWFudGljTW9kZWxCcmlkZ2UgPSAoQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VDb3JlU2VtYW50aWNNb2RlbEJyaWRnZShjb3JlU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVNlbWFudGljTW9kZWxCcmlkZ2UoY29yZVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChjb3JlU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29yZVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29yZVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29yZVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkxFQUZfRUxFTUVOVDogewotCQkJTGVhZkVsZW1lbnQgbGVhZkVsZW1lbnQgPSAoTGVhZkVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VMZWFmRWxlbWVudChsZWFmRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KGxlYWZFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChsZWFmRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChsZWFmRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChsZWFmRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQobGVhZkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVEVYVF9FTEVNRU5UOiB7Ci0JCQlUZXh0RWxlbWVudCB0ZXh0RWxlbWVudCA9IChUZXh0RWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVRleHRFbGVtZW50KHRleHRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTGVhZkVsZW1lbnQodGV4dEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudCh0ZXh0RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGV4dEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGV4dEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodGV4dEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHRleHRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFOiB7Ci0JCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUltYWdlKGltYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTGVhZkVsZW1lbnQoaW1hZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChpbWFnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoaW1hZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoaW1hZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoaW1hZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGltYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBISUNfUFJJTUlUSVZFOiB7Ci0JCQlHcmFwaGljUHJpbWl0aXZlIGdyYXBoaWNQcmltaXRpdmUgPSAoR3JhcGhpY1ByaW1pdGl2ZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUdyYXBoaWNQcmltaXRpdmUoZ3JhcGhpY1ByaW1pdGl2ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUxlYWZFbGVtZW50KGdyYXBoaWNQcmltaXRpdmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChncmFwaGljUHJpbWl0aXZlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChncmFwaGljUHJpbWl0aXZlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGdyYXBoaWNQcmltaXRpdmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZ3JhcGhpY1ByaW1pdGl2ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZ3JhcGhpY1ByaW1pdGl2ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORTogewotCQkJUG9seWxpbmUgcG9seWxpbmUgPSAoUG9seWxpbmUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VQb2x5bGluZShwb2x5bGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUdyYXBoaWNQcmltaXRpdmUocG9seWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VMZWFmRWxlbWVudChwb2x5bGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KHBvbHlsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwb2x5bGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwb2x5bGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwb2x5bGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocG9seWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRTogewotCQkJRWxsaXBzZSBlbGxpcHNlID0gKEVsbGlwc2UpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VFbGxpcHNlKGVsbGlwc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHcmFwaGljUHJpbWl0aXZlKGVsbGlwc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VMZWFmRWxlbWVudChlbGxpcHNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoZWxsaXBzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZWxsaXBzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChlbGxpcHNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGVsbGlwc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGVsbGlwc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19GQU1JTFk6IHsKLQkJCVByb2Nlc3NGYW1pbHkgcHJvY2Vzc0ZhbWlseSA9IChQcm9jZXNzRmFtaWx5KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzc0ZhbWlseShwcm9jZXNzRmFtaWx5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kQ29uZmlndXJhdGlvbihwcm9jZXNzRmFtaWx5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChwcm9jZXNzRmFtaWx5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzRmFtaWx5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NGYW1pbHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc0ZhbWlseSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc0ZhbWlseSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWTogewotCQkJTWV0aG9kTGlicmFyeSBtZXRob2RMaWJyYXJ5ID0gKE1ldGhvZExpYnJhcnkpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VNZXRob2RMaWJyYXJ5KG1ldGhvZExpYnJhcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KG1ldGhvZExpYnJhcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlKG1ldGhvZExpYnJhcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZExpYnJhcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lc3BhY2UobWV0aG9kTGlicmFyeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RMaWJyYXJ5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZExpYnJhcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZExpYnJhcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2xhc3NpZmllcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNsYXNzaWZpZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDbGFzc2lmaWVyKENsYXNzaWZpZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlVHlwZShUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUVsZW1lbnQoRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TmFtZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VOYW1lZEVsZW1lbnQoTmFtZWRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVBhY2thZ2VhYmxlRWxlbWVudChQYWNrYWdlYWJsZUVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUGFja2FnZShvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVzcGFjZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVzcGFjZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU5hbWVzcGFjZShOYW1lc3BhY2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RFbGVtZW50KE1ldGhvZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ29uc3RyYWludChDb25zdHJhaW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlTWV0aG9kRWxlbWVudFByb3BlcnR5KE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+S2luZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPktpbmQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VLaW5kKEtpbmQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbnRlbnRFbGVtZW50KENvbnRlbnRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURlc2NyaWJhYmxlRWxlbWVudChEZXNjcmliYWJsZUVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ29udGVudERlc2NyaXB0aW9uKENvbnRlbnREZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VTZWN0aW9uKFNlY3Rpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9sZShSb2xlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrUHJvZHVjdChXb3JrUHJvZHVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RnVsZmlsbGFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZ1bGZpbGxhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQoRnVsZmlsbGFibGVFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRhc2soVGFzayBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBEZWZpbml0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya0RlZmluaXRpb24oV29ya0RlZmluaXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0ZXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdGVwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlU3RlcChTdGVwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkYW5jZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRhbmNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlR3VpZGFuY2UoR3VpZGFuY2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFydGlmYWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJ0aWZhY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VBcnRpZmFjdChBcnRpZmFjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcmFibGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyYWJsZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURlbGl2ZXJhYmxlKERlbGl2ZXJhYmxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRjb21lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU91dGNvbWUoT3V0Y29tZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1ldGhvZFBhY2thZ2UoTWV0aG9kUGFja2FnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ29udGVudFBhY2thZ2UoQ29udGVudFBhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VBcnRpZmFjdERlc2NyaXB0aW9uKEFydGlmYWN0RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oV29ya1Byb2R1Y3REZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VSb2xlRGVzY3JpcHRpb24oUm9sZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRhc2tEZXNjcmlwdGlvbihUYXNrRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VHdWlkYW5jZURlc2NyaXB0aW9uKEd1aWRhbmNlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcmFjdGljZURlc2NyaXB0aW9uKFByYWN0aWNlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VBY3Rpdml0eShBY3Rpdml0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChXb3JrQnJlYWtkb3duRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUJyZWFrZG93bkVsZW1lbnQoQnJlYWtkb3duRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlTWlsZXN0b25lKE1pbGVzdG9uZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SXRlcmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SXRlcmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlSXRlcmF0aW9uKEl0ZXJhdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGhhc2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QaGFzZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVBoYXNlKFBoYXNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUZWFtUHJvZmlsZShUZWFtUHJvZmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9sZURlc2NyaXB0b3IoUm9sZURlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgT3JkZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIE9yZGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya09yZGVyKFdvcmtPcmRlciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJvY2Vzc0VsZW1lbnQoUHJvY2Vzc0VsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUGxhbm5pbmdEYXRhKFBsYW5uaW5nRGF0YSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEZXNjcmlwdG9yKERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRhc2tEZXNjcmlwdG9yKFRhc2tEZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdG9yKFdvcmtQcm9kdWN0RGVzY3JpcHRvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbXBvc2l0ZVJvbGUoQ29tcG9zaXRlUm9sZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbihCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VBY3Rpdml0eURlc2NyaXB0aW9uKEFjdGl2aXR5RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJvY2Vzc0Rlc2NyaXB0aW9uKFByb2Nlc3NEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEZXNjcmlwdG9yRGVzY3JpcHRpb24oRGVzY3JpcHRvckRlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbmNlcHQoQ29uY2VwdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ2hlY2tsaXN0KENoZWNrbGlzdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VFeGFtcGxlKEV4YW1wbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUd1aWRlbGluZShHdWlkZWxpbmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUmVwb3J0KFJlcG9ydCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVtcGxhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZW1wbGF0ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRlbXBsYXRlKFRlbXBsYXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVN1cHBvcnRpbmdNYXRlcmlhbChTdXBwb3J0aW5nTWF0ZXJpYWwgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRvb2wgTWVudG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUb29sTWVudG9yKFRvb2xNZW50b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV2hpdGVwYXBlcihXaGl0ZXBhcGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUZXJtRGVmaW5pdGlvbihUZXJtRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QcmFjdGljZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByYWN0aWNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJhY3RpY2UoUHJhY3RpY2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VSZXVzYWJsZUFzc2V0KFJldXNhYmxlQXNzZXQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2NpcGxpbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGlzY2lwbGluZShEaXNjaXBsaW5lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IENhdGVnb3J5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbnRlbnRDYXRlZ29yeShDb250ZW50Q2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgU2V0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBTZXQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VSb2xlU2V0KFJvbGVTZXQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvbWFpbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvbWFpbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURvbWFpbihEb21haW4gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrUHJvZHVjdFR5cGUoV29ya1Byb2R1Y3RUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURpc2NpcGxpbmVHcm91cGluZyhEaXNjaXBsaW5lR3JvdXBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRvb2w8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ub29sPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlVG9vbChUb29sIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9sZVNldEdyb3VwaW5nKFJvbGVTZXRHcm91cGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ3VzdG9tQ2F0ZWdvcnkoQ3VzdG9tQ2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGVsaXZlcnlQcm9jZXNzKERlbGl2ZXJ5UHJvY2VzcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3M8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ2FwYWJpbGl0eVBhdHRlcm4oQ2FwYWJpbGl0eVBhdHRlcm4gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2FkbWFwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9hZG1hcChSb2FkbWFwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJvY2Vzc0NvbXBvbmVudChQcm9jZXNzQ29tcG9uZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcm9jZXNzUGFja2FnZShQcm9jZXNzUGFja2FnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZShQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1ldGhvZFBsdWdpbihNZXRob2RQbHVnaW4gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlZhcmlhYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5WYXJpYWJpbGl0eSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFVuaXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgVW5pdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1ldGhvZFVuaXQoTWV0aG9kVW5pdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBGYW1pbHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIEZhbWlseTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3NGYW1pbHkoUHJvY2Vzc0ZhbWlseSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9pbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb2ludDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVBvaW50KFBvaW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpYWdyYW0gRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpYWdyYW0gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURpYWdyYW1FbGVtZW50KERpYWdyYW1FbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaWFncmFtIExpbms8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaWFncmFtIExpbms8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEaWFncmFtTGluayhEaWFncmFtTGluayBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGggQ29ubmVjdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGggQ29ubmVjdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlR3JhcGhDb25uZWN0b3IoR3JhcGhDb25uZWN0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVNlbWFudGljTW9kZWxCcmlkZ2UoU2VtYW50aWNNb2RlbEJyaWRnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGltZW5zaW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGltZW5zaW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGltZW5zaW9uKERpbWVuc2lvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVmZXJlbmNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUmVmZXJlbmNlKFJlZmVyZW5jZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvcGVydHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb3BlcnR5KFByb3BlcnR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HcmFwaCBFZGdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGggRWRnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUdyYXBoRWRnZShHcmFwaEVkZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpYWdyYW08L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGlhZ3JhbShEaWFncmFtIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HcmFwaCBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGggTm9kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUdyYXBoTm9kZShHcmFwaE5vZGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNpbXBsZSBTZW1hbnRpYyBNb2RlbCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudChTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VU1BIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VVTUFTZW1hbnRpY01vZGVsQnJpZGdlKFVNQVNlbWFudGljTW9kZWxCcmlkZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDb3JlU2VtYW50aWNNb2RlbEJyaWRnZShDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGVhZiBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGVhZiBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlTGVhZkVsZW1lbnQoTGVhZkVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRleHQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRleHQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRleHRFbGVtZW50KFRleHRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbWFnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkltYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlSW1hZ2UoSW1hZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyYXBoaWMgUHJpbWl0aXZlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGhpYyBQcmltaXRpdmU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VHcmFwaGljUHJpbWl0aXZlKEdyYXBoaWNQcmltaXRpdmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvbHlsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9seWxpbmU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQb2x5bGluZShQb2x5bGluZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWxsaXBzZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsbGlwc2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VFbGxpcHNlKEVsbGlwc2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vVW1hU3dpdGNoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1VtYVV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZGI0MTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1VtYVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50c0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGFjY2Vzc2luZyBhbmQgdXBkYXRpbmcgdGhlIFVNQSBtb2RlbCBvYmplY3RzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFVdGlsIHsKLQotCS8qKgotCSAqIFJlcGxhY2VzIHRoZSBmZWF0dXJlIHZhbHVlcyBvZiBhbiBvbGQgbWV0aG9kIGVsZW1lbnQgd2l0aCB0aGUKLQkgKiBjb3JyZXNwb25kaW5nIGZlYXR1cmUgdmFsdWVzIG9mIGEgbmV3IG1ldGhvZCBlbGVtZW50LgotCSAqIDxwPgotCSAqIE5vdGU6IEFsbCBmZWF0dXJlcyBhcmUgdXBkYXRlZCBleGNlcHQgZm9yIHRoZSBHVUlEIGZlYXR1cmUuCi0JICogCi0JICogQHBhcmFtIG9sZEVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBvbGQgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcGFyYW0gbmV3RWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIG5ldyBtZXRob2QgZWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXBsYWNlKE1ldGhvZEVsZW1lbnQgb2xkRWxlbWVudCwKLQkJCU1ldGhvZEVsZW1lbnQgbmV3RWxlbWVudCkgewotCQlMaXN0IGZlYXR1cmVzID0gb2xkRWxlbWVudC5lQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCWlmIChmZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGZlYXR1cmVzLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcwotCQkJCQkJLmdldChpKTsKLQkJCQlpZiAoZmVhdHVyZSAhPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0d1aWQoKSkgewotCQkJCQkvLyBkb24ndCByZXBsYWNlIEdVSUQKLQkJCQkJT2JqZWN0IG5ld1ZhbHVlID0gbmV3RWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQkJCQlvbGRFbGVtZW50LmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBtb2RlbCBvYmplY3QgaGFzIGEgZGlyZWN0IHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIG1vZGVsIG9iamVjdAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBtb2RlbCBvYmplY3QgaXMgY29udGFpbmVkIGJ5Ci0JICogICAgICAgICBhIHJlc291cmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0RpcmVjdFJlc291cmNlKEVPYmplY3QgZSkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGUuZVJlc291cmNlKCk7Ci0JCXJldHVybiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRDb250ZW50cygpLmNvbnRhaW5zKGUpKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBhbGwgcmVzb3VyY2VzIG93bmVkIGJ5IHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVzb3VyY2VzKEVPYmplY3QgZSkgewotCQlIYXNoU2V0PFJlc291cmNlPiByZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJZ2V0UmVzb3VyY2VzKGUsIHJlc291cmNlcyk7Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRSZXNvdXJjZXMoRU9iamVjdCBlLCBDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXMpIHsKLQkJaWYgKFVtYVV0aWwuaGFzRGlyZWN0UmVzb3VyY2UoZSkpIHsKLQkJCXJlc291cmNlcy5hZGQoZS5lUmVzb3VyY2UoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlLmVDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWdldFJlc291cmNlcygoRU9iamVjdCkgaXRlci5uZXh0KCksIHJlc291cmNlcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgc3BlY2lmaWMgdHlwZSBvZiBhZGFwdGVyIGFzc29jaWF0ZWQgd2l0aCBhIG5vdGlmaWVyLgotCSAqIAotCSAqIEBwYXJhbSBlT2JqCi0JICogICAgICAgICAgICBhIG5vdGlmaWVyCi0JICogQHBhcmFtIGNscwotCSAqICAgICAgICAgICAgdGhlIGFkYXB0ZXIgY2xhc3MKLQkgKiBAcmV0dXJuIGFuIDxjb2RlPkFkYXB0ZXI8Y29kZT4gb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QWRhcHRlcihFT2JqZWN0IGVPYmosIENsYXNzIGNscykgewotCQlmb3IgKEl0ZXJhdG9yIGFkYXB0ZXJzID0gZU9iai5lQWRhcHRlcnMoKS5pdGVyYXRvcigpOyBhZGFwdGVycwotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcikgYWRhcHRlcnMubmV4dCgpOwotCQkJaWYgKGNscy5pc0luc3RhbmNlKGFkYXB0ZXIpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIGFkYXB0ZXJzIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuLgotCSAqIAotCSAqIEBwYXJhbSBlT2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbEFkYXB0ZXJzKEVPYmplY3QgZU9iamVjdCkgewotCQlmb3IgKFRyZWVJdGVyYXRvcjxFT2JqZWN0PiBpdGVyID0gZU9iamVjdC5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCW8uZUFkYXB0ZXJzKCkuY2xlYXIoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1ldGhvZCBwYWNrYWdlIHdpdGggYSBzcGVjaWZpYyBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RQYWNrYWdlcwotCSAqICAgICAgICAgICAgYSBsaXN0IG9mIG1ldGhvZCBwYWNrYWdlcwotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG1ldGhvZCBwYWNrYWdlIG5hbWUKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIHBhY2thZ2Ugd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGFja2FnZSBmaW5kTWV0aG9kUGFja2FnZShMaXN0IG1ldGhvZFBhY2thZ2VzLAotCQkJU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IG1ldGhvZFBhY2thZ2VzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlPYmplY3Qgb2JqID0gbWV0aG9kUGFja2FnZXMuZ2V0KGkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQlNZXRob2RQYWNrYWdlIHBrZyA9IChNZXRob2RQYWNrYWdlKSBvYmo7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKHBrZy5nZXROYW1lKCkpKSB7Ci0JCQkJCXJldHVybiBwa2c7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1ldGhvZCBwYWNrYWdlIHdpdGggYSBzcGVjaWZpYyBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RQbHVnaW4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBsdWctaW4KLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYXJyYXkgb2YgbWV0aG9kIGVsZW1lbnQgcGF0aCBmcmFnbWVudHMKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIHBhY2thZ2Ugd2l0aCB0aGUgbWF0Y2hpbmcgcGF0aCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGFja2FnZSBmaW5kTWV0aG9kUGFja2FnZShNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luLAotCQkJU3RyaW5nW10gcGF0aCkgewotCQlNZXRob2RQYWNrYWdlIHBrZyA9IG51bGw7Ci0JCUxpc3QgbGlzdCA9IG1ldGhvZFBsdWdpbi5nZXRNZXRob2RQYWNrYWdlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKLQkJCXBrZyA9IGZpbmRNZXRob2RQYWNrYWdlKGxpc3QsIHBhdGhbaV0pOwotCQkJaWYgKHBrZyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlsaXN0ID0gcGtnLmdldENoaWxkUGFja2FnZXMoKTsKLQkJfQotCQlyZXR1cm4gcGtnOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHBhcmVudCBhY3Rpdml0eSBvZiBhIGJyZWFrZG93biBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIGJyZWFrZG93biBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgcGFyZW50IGFjdGl2aXR5IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eSBnZXRQYXJlbnRBY3Rpdml0eShCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJcmV0dXJuIGUuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IGFjdGl2aXR5IG9mIGEgd29yayBvcmRlci4KLQkgKiAKLQkgKiBAcGFyYW0gd29ya09yZGVyCi0JICogICAgICAgICAgICBhIHdvcmsgb3JkZXIKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgYWN0aXZpdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2aXR5IGdldE93bmluZ0FjdGl2aXR5KFdvcmtPcmRlciB3b3JrT3JkZXIpIHsKLQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSB3b3JrT3JkZXIuZUNvbnRhaW5lcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXJldHVybiAoQWN0aXZpdHkpIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGVudCBwYWNrYWdlIHdpdGggYSBzcGVjaWZpYyBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RQYWNrYWdlcwotCSAqICAgICAgICAgICAgYSBsaXN0IG9mIG1ldGhvZCBwYWNrYWdlcwotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIGNvbnRlbnQgcGFja2FnZSBuYW1lCi0JICogQHJldHVybiBhIGNvbnRlbnQgcGFja2FnZSB3aXRoIHRoZSBtYXRoY2luZyBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBDb250ZW50UGFja2FnZSBmaW5kQ29udGVudFBhY2thZ2UoTGlzdCBtZXRob2RQYWNrYWdlcywKLQkJCVN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSBtZXRob2RQYWNrYWdlcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJT2JqZWN0IG9iaiA9IG1ldGhvZFBhY2thZ2VzLmdldChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCUNvbnRlbnRQYWNrYWdlIHBrZyA9IChDb250ZW50UGFja2FnZSkgb2JqOwotCQkJCWlmIChuYW1lLmVxdWFscyhwa2cuZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm4gcGtnOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHBhY2thZ2Ugd2l0aCBhIHNwZWNpZmljIHBhdGguCi0JICogCi0JICogQHBhcmFtIG1ldGhvZFBsdWdpbgotCSAqICAgICAgICAgICAgYSBtZXRob2QgcGx1Zy1pbgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhbiBhcnJheSBvZiBtZXRob2QgZWxlbWVudCBwYXRoIGZyYWdtZW50cwotCSAqIEByZXR1cm4gYSBjb250ZW50IHBhY2thZ2Ugd2l0aCB0aGUgbWF0Y2hpbmcgcGF0aCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29udGVudFBhY2thZ2UgZmluZENvbnRlbnRQYWNrYWdlKE1ldGhvZFBsdWdpbiBtZXRob2RQbHVnaW4sCi0JCQlTdHJpbmdbXSBwYXRoKSB7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IG51bGw7Ci0JCUxpc3QgbGlzdCA9IG1ldGhvZFBsdWdpbi5nZXRNZXRob2RQYWNrYWdlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKLQkJCXBrZyA9IGZpbmRDb250ZW50UGFja2FnZShsaXN0LCBwYXRoW2ldKTsKLQkJCWlmIChwa2cgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJbGlzdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCX0KLQkJcmV0dXJuIHBrZzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgbWV0aG9kIHBsdWctaW4gb2YgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBNZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBtZXRob2QgcGx1Zy1pbiBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGx1Z2luIGdldE1ldGhvZFBsdWdpbihFT2JqZWN0IGVsZW1lbnQpIHsKLQkJZm9yIChFT2JqZWN0IG9iaiA9IGVsZW1lbnQ7IG9iaiAhPSBudWxsOyBvYmogPSBvYmouZUNvbnRhaW5lcigpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIChNZXRob2RQbHVnaW4pIG9iajsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgbWV0aG9kIGxpYnJhcnkgb2YgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBtZXRob2QgbGlicmFyeSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kTGlicmFyeSBnZXRNZXRob2RMaWJyYXJ5KEVPYmplY3QgZWxlbWVudCkgewotCQlmb3IgKEVPYmplY3Qgb2JqID0gZWxlbWVudDsgb2JqICE9IG51bGw7IG9iaiA9IG9iai5lQ29udGFpbmVyKCkpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJcmV0dXJuIChNZXRob2RMaWJyYXJ5KSBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRU9iamVjdCBnZXRUb3BDb250YWluZXIoRU9iamVjdCBlbGVtZW50KSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gbnVsbDsKLQkJZm9yIChFT2JqZWN0IG9iaiA9IGVsZW1lbnQuZUNvbnRhaW5lcigpOyBvYmogIT0gbnVsbDsgb2JqID0gb2JqLmVDb250YWluZXIoKSkgewotCQkJY29udGFpbmVyID0gb2JqOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7CQkKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgY29udGVudCBwYWNrYWdlIG9mIGEgY29udGVudCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIGNvbnRlbnQgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBjb250ZW50IHBhY2thZ2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnRlbnRQYWNrYWdlIGdldENvbnRlbnRQYWNrYWdlKEVPYmplY3QgZWxlbWVudCkgewotCQlmb3IgKEVPYmplY3Qgb2JqID0gZWxlbWVudDsgb2JqICE9IG51bGw7IG9iaiA9IG9iai5lQ29udGFpbmVyKCkpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCXJldHVybiAoQ29udGVudFBhY2thZ2UpIG9iajsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgcHJvY2VzcyBwYWNrYWdlIG9mIGEgcHJvY2VzcyBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIFByb2Nlc3MgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBwcm9jZXNzIHBhY2thZ2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb2Nlc3NQYWNrYWdlIGdldFByb2Nlc3NQYWNrYWdlKEVPYmplY3QgZWxlbWVudCkgewotCQlmb3IgKEVPYmplY3Qgb2JqID0gZWxlbWVudDsgb2JqICE9IG51bGw7IG9iaiA9IG9iai5lQ29udGFpbmVyKCkpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCXJldHVybiAoUHJvY2Vzc1BhY2thZ2UpIG9iajsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgZGlhZ3JhbSBvZiBhIGRpYWdyYW0gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBkaWFncmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgZGlhZ3JhbSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbSBnZXREaWFncmFtKEVPYmplY3QgZWxlbWVudCkgewotCQlmb3IgKEVPYmplY3Qgb2JqID0gZWxlbWVudDsgb2JqICE9IG51bGw7IG9iaiA9IG9iai5lQ29udGFpbmVyKCkpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJcmV0dXJuIChEaWFncmFtKSBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBtZXRob2QgZWxlbWVudCBpcyBjb250YWluZWQgYnkgYSBzcGVjaWZpYyBjb250ZW50Ci0JICogcGFja2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBjb250ZW50UGFja2FnZQotCSAqICAgICAgICAgICAgYSBjb250ZW50IHBhY2thZ2UKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgZWxlbWVudCBpcyBjb250YWluZWQgYnkgdGhlCi0JICogICAgICAgICBjb250ZW50IHBhY2thZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250YWluZWRCeUNvbnRlbnRQYWNrYWdlKEVPYmplY3QgZWxlbWVudCwKLQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQYWNrYWdlKSB7Ci0JCXJldHVybiBpc0NvbnRhaW5lZEJ5KGVsZW1lbnQsIGNvbnRlbnRQYWNrYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIG1vZGVsIG9iamVjdCBpcyBjb250YWluZWQgYnkgYSBzcGVjaWZpYyBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIGVPYmoKLQkgKiAgICAgICAgICAgIGEgbW9kZWwgb2JqZWN0Ci0JICogQHBhcmFtIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgYSBjb250YWluZXIKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtb2RlbCBvYmplY3QgaXMgY29udGFpbmVkIGJ5IHRoZQotCSAqICAgICAgICAgY29udGFpbmVyCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udGFpbmVkQnkoRU9iamVjdCBlT2JqLCBPYmplY3QgY29udGFpbmVyKSB7Ci0JCWlmIChlT2JqID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKEVPYmplY3Qgb2JqID0gZU9iai5lQ29udGFpbmVyKCk7IG9iaiAhPSBudWxsOyBvYmogPSBvYmoKLQkJCQkuZUNvbnRhaW5lcigpKSB7Ci0JCQlpZiAob2JqID09IGNvbnRhaW5lcikgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgYW5kIHJldHVybnMgYSB1bmlxdWUgSUQuCi0JICogCi0JICogQHJldHVybiBhIHVuaXF1ZSBJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlR1VJRCgpIHsKLQkJcmV0dXJuIEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIG5hbWUgb2YgYSBnaXZlbiBtZXRob2QKLQkgKiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBhIHN1aXRhYmxlIGNvbnRlbnQgZGVzY3JpcHRpb24gbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbk5hbWUoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBlLmdldE5hbWUoKSArICcsJyArIGUuZ2V0R3VpZCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRBbGxTdXBlcnMoTGlzdCBzdXBlcnMsIFZhcmlhYmlsaXR5RWxlbWVudCBlLAotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUpIHsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJaWYgKGJhc2UgIT0gbnVsbCAmJiBlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IHR5cGUKLQkJCQkmJiAhc3VwZXJzLmNvbnRhaW5zKGJhc2UpKSB7Ci0JCQlzdXBlcnMuYWRkKGJhc2UpOwotCQkJZ2V0QWxsU3VwZXJzKHN1cGVycywgYmFzZSwgdHlwZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0QWxsU3VwZXJzQm90aChMaXN0IHN1cGVycywgVmFyaWFiaWxpdHlFbGVtZW50IGUsCi0JCQlWYXJpYWJpbGl0eVR5cGUgdHlwZTEsIFZhcmlhYmlsaXR5VHlwZSB0eXBlMikgewotCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlpZiAoYmFzZSAhPSBudWxsCi0JCQkJJiYgKGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gdHlwZTEgfHwgZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSB0eXBlMikKLQkJCQkmJiAhc3VwZXJzLmNvbnRhaW5zKGJhc2UpKSB7Ci0JCQlzdXBlcnMuYWRkKGJhc2UpOwotCQkJZ2V0QWxsU3VwZXJzQm90aChzdXBlcnMsIGJhc2UsIHR5cGUxLCB0eXBlMik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjbGFzcyBvZiBhIGNvbnRlbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgY29udGVudCBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgY29udGVudCBlbGVtZW50IGNsYXNzCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzcyBnZXRDbGFzc09mQ29udGVudEVsZW1lbnQoQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQpIHsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUm9sZSkKLQkJCXJldHVybiBSb2xlLmNsYXNzOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrKQotCQkJcmV0dXJuIFRhc2suY2xhc3M7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KQotCQkJcmV0dXJuIFdvcmtQcm9kdWN0LmNsYXNzOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkYW5jZSkKLQkJCXJldHVybiBHdWlkYW5jZS5jbGFzczsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRG9tYWluKQotCQkJcmV0dXJuIERvbWFpbi5jbGFzczsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRGlzY2lwbGluZSkKLQkJCXJldHVybiBEaXNjaXBsaW5lLmNsYXNzOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpCi0JCQlyZXR1cm4gRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlU2V0KQotCQkJcmV0dXJuIFJvbGVTZXQuY2xhc3M7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykKLQkJCXJldHVybiBSb2xlU2V0R3JvdXBpbmcuY2xhc3M7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkKLQkJCXJldHVybiBXb3JrUHJvZHVjdFR5cGUuY2xhc3M7Ci0JCXJldHVybiBPYmplY3QuY2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRlZmF1bHQgd29yayBvcmRlciBmb3IgdHdvIHdvcmsgYnJlYWtkb3duIGVsZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQKLQkgKiBAcGFyYW0gcHJlZGVjZXNzb3IKLQkgKiAgICAgICAgICAgIHRoZSBwcmVkZWNlc3NvciB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCB3b3JrIG9yZGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXIgY3JlYXRlRGVmYXVsdFdvcmtPcmRlcihXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjLAotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCkgewotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFdvcmtPcmRlcihzdWNjLCBwcmVkLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXIgY3JlYXRlRGVmYXVsdFdvcmtPcmRlcihXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjLAotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCwgYm9vbGVhbiBsaW5rKSB7Ci0JCVdvcmtPcmRlciB3byA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtPcmRlcigpOwotCQl3by5zZXRQcmVkKHByZWQpOwotCQlpZihsaW5rKSB7Ci0JCQlzdWNjLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuYWRkKHdvKTsKLQkJfQotCQlyZXR1cm4gd287Ci0JfQkKLQotCS8qKgotCSAqIExvY2F0ZXMgdGhlIHdvcmsgb3JkZXIgYXNzb2NpYXRlZCB3aXRoIHR3byB3b3JrIGJyZWFrZG93biBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JICogQHBhcmFtIHByZWRlY2Vzc29yCi0JICogICAgICAgICAgICB0aGUgcHJlZGVjZXNzb3Igd29yayBicmVha2Rvd24gZWxlbWVudAotCSAqIEByZXR1cm4gYSB3b3JrIG9yZGVyIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXIgZmluZFdvcmtPcmRlcihXb3JrQnJlYWtkb3duRWxlbWVudCBlLAotCQkJT2JqZWN0IHByZWRlY2Vzc29yKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVdvcmtPcmRlciB3b3JrT3JkZXIgPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCWlmICh3b3JrT3JkZXIuZ2V0UHJlZCgpID09IHByZWRlY2Vzc29yKQotCQkJCXJldHVybiB3b3JrT3JkZXI7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogTG9jYXRlcyB0aGUgd29yayBvcmRlciBhc3NvY2lhdGVkIHdpdGggdHdvIHdvcmsgYnJlYWtkb3duIGVsZW1lbnRzLiBJZgotCSAqIGluY2x1ZGVCYXNlIGlzIHRydWUsIHdpbGwgY29sbGVjdCBXb3JrT3JkZXIgZm9yIGJhc2UgZWxlbWVudCBvZiB0aGUKLQkgKiBwcmVkZWNlc3NvciBhcyB3ZWxsLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIHByZWRlY2Vzc29yCi0JICogQHBhcmFtIGluY2x1ZGVCYXNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxXb3JrT3JkZXI+IGZpbmRXb3JrT3JkZXIoV29ya0JyZWFrZG93bkVsZW1lbnQgZSwgV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZGVjZXNzb3IsIGJvb2xlYW4gaW5jbHVkZUJhc2UpIHsKLQkJaWYoIWluY2x1ZGVCYXNlKSB7Ci0JCQlXb3JrT3JkZXIgd28gPSBmaW5kV29ya09yZGVyKGUsIHByZWRlY2Vzc29yKTsKLQkJCXJldHVybiAoQ29sbGVjdGlvbjxXb3JrT3JkZXI+KSAod28gPT0gbnVsbCA/IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpIDogQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh3bykpOwotCQl9Ci0JCUFycmF5TGlzdDxXb3JrT3JkZXI+IHdvcmtPcmRlcnMgPSBuZXcgQXJyYXlMaXN0PFdvcmtPcmRlcj4oKTsKLQkJY29sbGVjdFdvcmtPcmRlcnMod29ya09yZGVycywgZSwgcHJlZGVjZXNzb3IpOwotCQlyZXR1cm4gd29ya09yZGVyczsKLQl9Ci0JCi0JLyoqCi0JICogQ29sbGVjdHMgdGhlIFdvcmtPcmRlciBvYmplY3RzIGFzc29jaWF0ZWQgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHdvcmsKLQkgKiBicmVha2Rvd24gZWxlbWVudCA8Y29kZT5lPC9jb2RlPiBhbmQgdGhlIHByZWRlY2Vzc29yIG9yIGFueSBvZiBpdHMgYmFzZSBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gd29ya09yZGVycwotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIHByZWRlY2Vzc29yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbGxlY3RXb3JrT3JkZXJzKENvbGxlY3Rpb248V29ya09yZGVyPiB3b3JrT3JkZXJzLAotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZSwgT2JqZWN0IHByZWRlY2Vzc29yKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVdvcmtPcmRlciB3b3JrT3JkZXIgPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCWlmICh3b3JrT3JkZXIuZ2V0UHJlZCgpID09IHByZWRlY2Vzc29yKSB7Ci0JCQkJd29ya09yZGVycy5hZGQod29ya09yZGVyKTsKLQkJCX0KLQkJfQotCQlpZihwcmVkZWNlc3NvciBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKChWYXJpYWJpbGl0eUVsZW1lbnQpcHJlZGVjZXNzb3IpLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmKHZlICE9IG51bGwpIHsKLQkJCQljb2xsZWN0V29ya09yZGVycyh3b3JrT3JkZXJzLCBlLCB2ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSB3b3JrIG9yZGVyIGFzc29jaWF0ZWQgd2l0aCB0d28gd29yayBicmVha2Rvd24gZWxlbWVudHMuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgd29yayBicmVha2Rvd24gZWxlbWVudAotCSAqIEBwYXJhbSBwcmVkZWNlc3NvcgotCSAqICAgICAgICAgICAgdGhlIHByZWRlY2Vzc29yIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSByZW1vdmVkIHdvcmsgb3JkZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtPcmRlciByZW1vdmVXb3JrT3JkZXIoV29ya0JyZWFrZG93bkVsZW1lbnQgZSwKLQkJCU9iamVjdCBwcmVkZWNlc3NvcikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVdvcmtPcmRlciBvcmRlciA9IChXb3JrT3JkZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChvcmRlci5nZXRQcmVkKCkgPT0gcHJlZGVjZXNzb3IpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQlyZXR1cm4gb3JkZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IHByb2Nlc3MgY29tcG9uZW50IG9mIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQsIHR5cGljYWxseSBhIHByb2Nlc3MgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBwcm9jZXNzIGNvbXBvbmVudCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvY2Vzc0NvbXBvbmVudCBnZXRQcm9jZXNzQ29tcG9uZW50KE1ldGhvZEVsZW1lbnQgZSkgewotCQlFT2JqZWN0IGNvbnRhaW5lcjsKLQkJZm9yIChjb250YWluZXIgPSBlOyBjb250YWluZXIgIT0gbnVsbAotCQkJCSYmICEoY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCk7IGNvbnRhaW5lciA9IGNvbnRhaW5lcgotCQkJCS5lQ29udGFpbmVyKCkpCi0JCQk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0NvbXBvbmVudCkgY29udGFpbmVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgbWV0aG9kIHVuaXQgb2YgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBtZXRob2QgdW5pdCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kVW5pdCBnZXRNZXRob2RVbml0KE1ldGhvZEVsZW1lbnQgZSkgewotCQlFT2JqZWN0IGNvbnRhaW5lcjsKLQkJZm9yIChjb250YWluZXIgPSBlOyBjb250YWluZXIgIT0gbnVsbAotCQkJCSYmICEoY29udGFpbmVyIGluc3RhbmNlb2YgTWV0aG9kVW5pdCk7IGNvbnRhaW5lciA9IGNvbnRhaW5lcgotCQkJCS5lQ29udGFpbmVyKCkpCi0JCQk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuICgoTWV0aG9kVW5pdCkgY29udGFpbmVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbWV0aG9kIHBsdWctaW4gaGFzIG1ldGhvZCBlbGVtZW50cyB0aGF0IHJlZmVyZW5jZQotCSAqIGVsZW1lbnRzIGluIGEgYmFzZSBwbHVnLWluLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgaXMgYSBleHBlbnNpdmUgY2FsbCB0byBtYWtlIGZvciBhIGxhcmdlIG1ldGhvZCBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBsdWctaW4KLQkgKiBAcGFyYW0gYmFzZQotCSAqICAgICAgICAgICAgYSBiYXNlIG1ldGhvZCBwbHVnLWluCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIG1ldGhvZCBwbHVnLWluIGNvbnRhaW4KLQkgKiAgICAgICAgIG1ldGhvZCBlbGVtZW50cyB0aGF0IHJlZmVyZW5jZSBlbGVtZW50cyBpbiBhIGJhc2UgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUmVmZXJlbmNlKE1ldGhvZFBsdWdpbiBwbHVnaW4sIE1ldGhvZFBsdWdpbiBiYXNlKSB7Ci0JCWZvciAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yIGZlYXR1cmVJdGVyYXRvciA9IChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IpIHBsdWdpbgotCQkJCS5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgZmVhdHVyZUl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgcmVmID0gKEVPYmplY3QpIGZlYXR1cmVJdGVyYXRvci5uZXh0KCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IGZlYXR1cmVJdGVyYXRvci5mZWF0dXJlKCk7Ci0KLQkJCWlmIChmICE9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9CYXNlcygpCi0JCQkJCSYmIFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHJlZikgPT0gYmFzZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGx1Z2luLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQotCQkJLy8gaWdub3JlIFByb2Nlc3NFbGVtZW50IGIvYyBpdCBjYW4gcmVmZXJlbmNlcyBhbnl0aGluZwotCQkJLy8KLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCByZWYgPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChnZXRNZXRob2RQbHVnaW4ocmVmKSA9PSBiYXNlKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbGwgZWxlbWVudCByZWZlcmVuY2VzIGluIGEgbWV0aG9kIHBsdWctaW4gdGhhdCBwb2ludCB0byBlbGVtZW50cwotCSAqIGluIGEgYmFzZSBwbHVnLWluLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgaXMgYSBleHBlbnNpdmUgY2FsbCB0byBtYWtlIGZvciBhIGxhcmdlIG1ldGhvZCBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBsdWctaW4KLQkgKiBAcGFyYW0gYmFzZQotCSAqICAgICAgICAgICAgdGhlIGJhc2UgbWV0aG9kIHBsdWctaW4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVSZWZlcmVuY2VzKE1ldGhvZFBsdWdpbiBwbHVnaW4sCi0JCQlNZXRob2RQbHVnaW4gYmFzZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwbHVnaW4uZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCi0JCQkvLyBpZ25vcmUgUHJvY2Vzc0VsZW1lbnQgYi9jIGl0IGNhbiByZWZlcmVuY2VzIGFueXRoaW5nCi0JCQkvLwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlmb3IgKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvciBmZWF0dXJlSXRlcmF0b3IgPSAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yKSBlbGVtZW50Ci0JCQkJCS5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgZmVhdHVyZUl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IHJlZiA9IChFT2JqZWN0KSBmZWF0dXJlSXRlcmF0b3IubmV4dCgpOwotCi0JCQkJaWYgKGdldE1ldGhvZFBsdWdpbihyZWYpID09IGJhc2UpIHsKLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSBmZWF0dXJlSXRlcmF0b3IuZmVhdHVyZSgpOwotCQkJCQlpZiAoZi5pc01hbnkoKSkgewotCQkJCQkJKChDb2xsZWN0aW9uKSBlbGVtZW50LmVHZXQoZikpLnJlbW92ZShyZWYpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZWxlbWVudC5lU2V0KGYsIG51bGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoSVN0YXR1cyBzdGF0dXMpIHsKLQkJU3RyaW5nIG1zZyA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCWlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcihtc2cpOwotCQkJSVN0YXR1cyBzdGF0dXNlc1tdID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXR1c2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZCgnXG4nKS5hcHBlbmQoc3RhdHVzZXNbaV0uZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJCW1zZyA9IHN0ckJ1Zi50b1N0cmluZygpOwotCQl9Ci0JCWlmIChtc2cgIT0gbnVsbCAmJiBtc2cudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCW1zZyA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIG1zZzsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgYSBHVUlEIHVzaW5nIGEgYmFzZSBHVUlELgotCSAqIAotCSAqIEBwYXJhbSBiYXNlR1VJRAotCSAqICAgICAgICAgICAgYSBiYXNlIEdVSUQKLQkgKiBAcmV0dXJuIGEgdW5pcXVlIElECi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2VuZXJhdGVHVUlEKFN0cmluZyBiYXNlR1VJRCkgewotCQlyZXR1cm4gR1VJRC5nZW5lcmF0ZShiYXNlR1VJRCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgR1VJRCB7Ci0JCXByaXZhdGUgc3RhdGljIE1lc3NhZ2VEaWdlc3QgbWQ1ID0gbnVsbDsKLQotCQlwcml2YXRlIHN0YXRpYyBNZXNzYWdlRGlnZXN0IGdldE1ENSgpIHsKLQkJCWlmIChtZDUgPT0gbnVsbCkgewotCQkJCXN5bmNocm9uaXplZCAoR1VJRC5jbGFzcykgewotCQkJCQlpZiAobWQ1ID09IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbWQ1ID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiTUQ1Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBtZDU7Ci0JCX0KLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZW5lcmF0ZShTdHJpbmcgYmFzZUdVSUQpIHsKLQkJCU1lc3NhZ2VEaWdlc3QgbWQ1ID0gZ2V0TUQ1KCk7Ci0JCQltZDUudXBkYXRlKGJhc2VHVUlELmdldEJ5dGVzKCkpOwotCQkJYnl0ZVtdIGhhc2ggPSBtZDUuZGlnZXN0KCk7Ci0JCQljaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbMjNdOwotCQkJYnVmZmVyWzBdID0gJy0nOwotCi0JCQkvLyBEbyBhIGJhc2UgNjQgY29udmVyc2lvbiBieSB0dXJuaW5nIGV2ZXJ5IDMgYnl0ZXMgaW50byA0IGJhc2UgNjQKLQkJCS8vIGNoYXJhY3RlcnMKLQkJCS8vCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgewotCQkJCWJ1ZmZlcls0ICogaSArIDFdID0gQkFTRTY0X0RJR0lUU1soaGFzaFtpICogM10gPj4gMikgJiAweDNGXTsKLQkJCQlidWZmZXJbNCAqIGkgKyAyXSA9IEJBU0U2NF9ESUdJVFNbKChoYXNoW2kgKiAzXSA8PCA0KSAmIDB4MzApCi0JCQkJCQl8ICgoaGFzaFtpICogMyArIDFdID4+IDQpICYgMHhGKV07Ci0JCQkJYnVmZmVyWzQgKiBpICsgM10gPSBCQVNFNjRfRElHSVRTWygoaGFzaFtpICogMyArIDFdIDw8IDIpICYgMHgzQykKLQkJCQkJCXwgKChoYXNoW2kgKiAzICsgMl0gPj4gNikgJiAweDMpXTsKLQkJCQlidWZmZXJbNCAqIGkgKyA0XSA9IEJBU0U2NF9ESUdJVFNbaGFzaFtpICogMyArIDJdICYgMHgzRl07Ci0JCQl9Ci0KLQkJCS8vIEhhbmRsZSB0aGUgbGFzdCBieXRlIGF0IHRoZSBlbmQuCi0JCQkvLwotCQkJYnVmZmVyWzIxXSA9IEJBU0U2NF9ESUdJVFNbKGhhc2hbMTVdID4+IDIpICYgMHgzRl07Ci0JCQlidWZmZXJbMjJdID0gQkFTRTY0X0RJR0lUU1soaGFzaFsxNV0gPDwgNCkgJiAweDMwXTsKLQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyKTsKLQkJfQotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBCQVNFNjRfRElHSVRTID0geyAnQScsICdCJywgJ0MnLCAnRCcsICdFJywKLQkJCQknRicsICdHJywgJ0gnLCAnSScsICdKJywgJ0snLCAnTCcsICdNJywgJ04nLCAnTycsICdQJywgJ1EnLAotCQkJCSdSJywgJ1MnLCAnVCcsICdVJywgJ1YnLCAnVycsICdYJywgJ1knLCAnWicsICdhJywgJ2InLCAnYycsCi0JCQkJJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onLCAnaycsICdsJywgJ20nLCAnbicsICdvJywKLQkJCQkncCcsICdxJywgJ3InLCAncycsICd0JywgJ3UnLCAndicsICd3JywgJ3gnLCAneScsICd6JywgJzAnLAotCQkJCScxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICctJywgJ18nIH07Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKGdlbmVyYXRlR1VJRCgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNzc2ZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyB0aGUgVU1BIG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLy5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjODQyZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIENvbW1vbiBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmVlMmQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb248L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzE4ZTI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1RodSBGZWIgMDEgMTc6MDM6NDUgUFNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy8vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL1Jlc291cmNlcy5wcm9wZXJ0aWVzPTg4NTlfMQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjOWNlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLkFjdGl2YXRvcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi51bWEsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCwKLSBvcmcuZWNsaXBzZS51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbiwKLSBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5jb25zdHJhaW50cywKLSBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi51dGlsCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGMzNGY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWFjZDE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBWYWxpZGF0aW9uCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2E3ZmM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLmNvbnN0cmFpbnRQcm92aWRlcnMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24ubGlicmFyeS5jYXRlZ29yeSIKLSAgICAgICAgICAgIG5hbWU9Ik1ldGhvZCBMaWJyYXJ5IENvbnN0cmFpbnRzIi8+Ci0gICAgICA8Y29uc3RyYWludFByb3ZpZGVyCi0gICAgICAgICAgICBjYWNoZT0idHJ1ZSIKLSAgICAgICAgICAgID4KLSAgICAgICAgIDxwYWNrYWdlIG5hbWVzcGFjZVVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIvPgotICAgICAgICAgPGNvbnN0cmFpbnRzIGNhdGVnb3JpZXM9Im9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLmxpYnJhcnkuY2F0ZWdvcnkiPgotICAgICAgICAgICAgPGNvbnN0cmFpbnQKLSAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5jb25zdHJhaW50cy5OYW1lQ29uc3RyYWludCIKLSAgICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5jb25zdHJhaW50cy5OYW1lQ29uc3RyYWludCIKLSAgICAgICAgICAgICAgICAgIGxhbmc9IkphdmEiCi0gICAgICAgICAgICAgICAgICBtb2RlPSJCYXRjaCIKLSAgICAgICAgICAgICAgICAgIG5hbWU9Ik5hbWUgQ29uc3RyYWludCIKLSAgICAgICAgICAgICAgICAgIHNldmVyaXR5PSJFUlJPUiIKLSAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU9IjEiPgotICAgICAgICAgICAgICAgPG1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgICBBIHswfSBoYXMgYmVlbiBmb3VuZCB0byBoYXZlIGNoaWxkcmVuIHdpdGggaW52YWxpZCBuYW1lIG9yIHByZXNlbnRhdGlvbiBuYW1lCi0gICAgICAgICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgICAgICAgICA8Y29uc3RyYWludAotICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlJlbGF0aW9uc2hpcENvbnN0cmFpbnQiCi0gICAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uY29uc3RyYWludHMuUmVsYXRpb25zaGlwQ29uc3RyYWludCIKLSAgICAgICAgICAgICAgICAgIGxhbmc9IkphdmEiCi0gICAgICAgICAgICAgICAgICBtb2RlPSJCYXRjaCIKLSAgICAgICAgICAgICAgICAgIG5hbWU9IlJlbGF0aW9uc2hpcCBDb25zdHJhaW50IgotICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk9IkVSUk9SIgotICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZT0iMiI+Ci0gICAgICAgICAgICAgICA8bWVzc2FnZT4KLSAgICAgICAgICAgICAgICAgIEEgezB9IGhhcyBiZWVuIGZvdW5kIHRvIGhhdmUgaW52YWxpZCByZWxhdGlvbnNoaXAKLSAgICAgICAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgICAgIDwvY29uc3RyYWludD4KLSAgICAgICAgIDwvY29uc3RyYWludHM+Ci0gICAgICA8L2NvbnN0cmFpbnRQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uY29uc3RyYWludEJpbmRpbmdzIj4KLSAgICAgIDxjbGllbnRDb250ZXh0Ci0gICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLmxpYnJhcnkuZGVmYXVsdENsaWVudENvbnRleHQiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50Ii8+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L2NsaWVudENvbnRleHQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLnRyYXZlcnNhbCI+Ci0gICAgICA8dHJhdmVyc2FsU3RyYXRlZ3kKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5jb25zdHJhaW50cy5MaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3kiCi0gICAgICAgICAgICBuYW1lc3BhY2VVcmk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnN0YXJ0dXAiPgotICAgICAgPHN0YXJ0dXAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLnV0aWwuU3RhcnR1cCIvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL0FjdGl2YXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjYzM2I2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFjdGl2YXRvcigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW5zI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vTGlicmFyeUVWYWxpZGF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9MaWJyYXJ5RVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDg0MTM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9MaWJyYXJ5RVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuRXZhbHVhdGlvbk1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuSUNvbnN0cmFpbnRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uc2VydmljZS5JQmF0Y2hWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uc2VydmljZS5JQ29uc3RyYWludERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uc2VydmljZS5JQ29uc3RyYWludEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5zZXJ2aWNlLk1vZGVsVmFsaWRhdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkRlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lWYWxpZGF0aW9uTWdyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5jb25zdHJhaW50cy5MaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24udXRpbC5WYWxpZGF0aW9uU3RhdHVzOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBwbHVncyB0aGUgRU1GIE1vZGVsIFZhbGlkYXRpb24gU2VydmljZSBBUEkgaW50byB0aGUKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVZhbGlkYXRvcn0gQVBJLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeUVWYWxpZGF0b3IgZXh0ZW5kcyBFT2JqZWN0VmFsaWRhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBmZWF0dXJlVG9Qcm9wZXJ0eU1hcCA9IGNyZWF0ZUZlYXR1cmVUb0F0dHJpYnV0ZU1hcCgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1RYX0FEQVBURVJfRkFDVE9SWV9QUk9WSURFUiA9ICJDVFhfQURBUFRFUl9GQUNUT1JZX1BST1ZJREVSIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENUWF9ERVBFTkRFTkNZX1ZBTElEQVRJT05fTUdSID0gIkNUWF9ERVBFTkRFTkNZX1ZBTElEQVRJT05fTUdSIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENUWF9DT05TVFJBSU5UX0ZJTFRFUiA9ICJDVFhfQ09OU1RSQUlOVF9GSUxURVIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RSQUlOVF9DQVRFR09SWSA9ICJvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5saWJyYXJ5LmNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGNyZWF0ZUZlYXR1cmVUb0F0dHJpYnV0ZU1hcCgpIHsKLQkJTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCW1hcC5wdXQoVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FLCBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUpOwotCQltYXAucHV0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FLCBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FKTsKLQkJcmV0dXJuIG1hcDsKLQl9Ci0JCi0JLyoqCi0JICogTW9kZWwgVmFsaWRhdGlvbiBTZXJ2aWNlIGludGVyZmFjZSBmb3IgYmF0Y2ggdmFsaWRhdGlvbiBvZiBFTUYgZWxlbWVudHMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBJQmF0Y2hWYWxpZGF0b3IgYmF0Y2hWYWxpZGF0b3I7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBtZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeUVWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJYmF0Y2hWYWxpZGF0b3IgPSAoSUJhdGNoVmFsaWRhdG9yKSBNb2RlbFZhbGlkYXRpb25TZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkubmV3VmFsaWRhdG9yKEV2YWx1YXRpb25Nb2RlLkJBVENIKTsKLQkJYmF0Y2hWYWxpZGF0b3Iuc2V0SW5jbHVkZUxpdmVDb25zdHJhaW50cyh0cnVlKTsKLQkJYmF0Y2hWYWxpZGF0b3Iuc2V0UmVwb3J0U3VjY2Vzc2VzKGZhbHNlKTsKLQkJYmF0Y2hWYWxpZGF0b3IuYWRkQ29uc3RyYWludEZpbHRlcihuZXcgSUNvbnN0cmFpbnRGaWx0ZXIoKSB7Ci0KLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChJQ29uc3RyYWludERlc2NyaXB0b3IgY29uc3RyYWludCwKLQkJCQkJRU9iamVjdCB0YXJnZXQpIHsKLQkJCQlTZXQ8Q2F0ZWdvcnk+IGNhdGVnb3JpZXMgPSBjb25zdHJhaW50LmdldENhdGVnb3JpZXMoKTsKLQkJCQlpZihjYXRlZ29yaWVzICE9IG51bGwgJiYgIWNhdGVnb3JpZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3I8Q2F0ZWdvcnk+IGl0ZXJhdG9yID0gY2F0ZWdvcmllcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlDYXRlZ29yeSBjYXRlZ29yeSA9IChDYXRlZ29yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYoQ09OU1RSQUlOVF9DQVRFR09SWS5lcXVhbHMoY2F0ZWdvcnkuZ2V0SWQoKSkpIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoRU9iamVjdCBlT2JqZWN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsCi0JCQlNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGUoZU9iamVjdC5lQ2xhc3MoKSwgZU9iamVjdCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudHMgdmFsaWRhdGlvbiBieSBkZWxlZ2F0aW9uIHRvIHRoZSBFTUYgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoRUNsYXNzIGVDbGFzcywgRU9iamVjdCBlT2JqZWN0LAotCQkJRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQkvLyBmaXJzdCwgZG8gd2hhdGV2ZXIgdGhlIGJhc2ljIEVjb3JlVmFsaWRhdG9yIGRvZXMKLQkJLy8gc3VwZXIudmFsaWRhdGUoZUNsYXNzLCBlT2JqZWN0LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0JCWJvb2xlYW4gY2lyY3VsYXJDaGVja09rID0gdHJ1ZTsKLQkJRGVwZW5kZW5jeVZhbGlkYXRpb25NZ3IgbWdyID0gKERlcGVuZGVuY3lWYWxpZGF0aW9uTWdyKSBjb250ZXh0LmdldChDVFhfREVQRU5ERU5DWV9WQUxJREFUSU9OX01HUik7Ci0JCWlmIChEZXBlbmRlbmN5Q2hlY2tlci5uZXdDaGVjayAmJiBtZ3IgIT0gbnVsbCAmJiAKLQkJCQkoZU9iamVjdCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCB8fCBlT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkJc3RhdHVzID0gbWdyLmNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5KChNZXRob2RFbGVtZW50KSBlT2JqZWN0KTsKLQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJY2lyY3VsYXJDaGVja09rID0gZmFsc2U7Ci0JCQkJU3RyaW5nIG1zZyA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCQkJaWYoU3RyVXRpbC5pc0JsYW5rKG1zZykpIHsKLQkJCQkJLy9tc2cgPSBOTFMuYmluZChWYWxpZGF0aW9uUmVzb3VyY2VzLmNpcmN1bGFyRGVwZW5kZW5jeV9lcnJvciwgcmVmLmdldEVDb250YWluaW5nQ2xhc3MoKS5nZXROYW1lKCksIHJlZi5nZXROYW1lKCkpOwotCQkJCQltc2cgPSBWYWxpZGF0aW9uUmVzb3VyY2VzLmNpcmN1bGFyRGVwZW5kZW5jeV9lcnJvcjsKLQkJCQl9Ci0JCQkJYXBwZW5kRGlhZ25vc3RpY3Moc3RhdHVzLCBkaWFnbm9zdGljcyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIG5vIHBvaW50IGluIHZhbGlkYXRpbmcgaWYgd2UgY2FuJ3QgcmVwb3J0IHJlc3VsdHMKLQkJaWYgKGRpYWdub3N0aWNzICE9IG51bGwpIHsKLQkJCS8vIGlmIEVNRiBNb2RlIFZhbGlkYXRpb24gU2VydmljZSBhbHJlYWR5IGNvdmVyZWQgdGhlIHN1Yi10cmVlLAotCQkJLy8gd2hpY2ggaXQgZG9lcyBmb3IgZWZmaWNpZW50IGNvbXB1dGF0aW9uIGFuZCBlcnJvciByZXBvcnRpbmcsCi0JCQkvLyB0aGVuIGRvbid0IHJlcGVhdCAodGhlIERpYWdub3N0aWNpYW4gZG9lcyB0aGUgcmVjdXJzaW9uCi0JCQkvLyBleHRlcm5hbGx5KS4gSWYgdGhlcmUgaXMgbm8gY29udGV4dCBtYXAsIHRoZW4gd2UgY2FuJ3QKLQkJCS8vIGhlbHAgaXQKLQkJCWlmICghaGFzUHJvY2Vzc2VkKGVPYmplY3QsIGNvbnRleHQpKSB7Ci0JCQkJaWYgKGdldFRyYXZlcnNhbFR5cGUoY29udGV4dCkgPT0gTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5LkRFRVApIHsKLQkJCQkJYmF0Y2hWYWxpZGF0b3IKLQkJCQkJCQkuc2V0VHJhdmVyc2FsU3RyYXRlZ3koTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5LmRlZXBUcmF2ZXJzYWxTdHJhdGVneSk7Ci0JCQkJfQotCQkJCQotCQkJCUlDb25zdHJhaW50RmlsdGVyIGZpbHRlciA9IChJQ29uc3RyYWludEZpbHRlcikgY29udGV4dC5nZXQoQ1RYX0NPTlNUUkFJTlRfRklMVEVSKTsKLQkJCQlpZihmaWx0ZXIgIT0gbnVsbCkgewotCQkJCQliYXRjaFZhbGlkYXRvci5hZGRDb25zdHJhaW50RmlsdGVyKGZpbHRlcik7Ci0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCXN0YXR1cyA9IGJhdGNoVmFsaWRhdG9yLnZhbGlkYXRlKGVPYmplY3QsCi0JCQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQkJCQliYXRjaFZhbGlkYXRvci5yZW1vdmVDb25zdHJhaW50RmlsdGVyKGZpbHRlcik7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlwcm9jZXNzZWQoZU9iamVjdCwgY29udGV4dCwgc3RhdHVzKTsKLQotCQkJCWFwcGVuZERpYWdub3N0aWNzKHN0YXR1cywgZGlhZ25vc3RpY3MpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIGVPYmplY3QpLmdldFByb2Nlc3MoKTsKLQkJCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCQl2YWxpZGF0ZVByb2Nlc3MocHJvYywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNpcmN1bGFyQ2hlY2tPayAmJiBzdGF0dXMuaXNPSygpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcHJvYwotCSAqIEBwYXJhbSBkaWFnbm9zdGljcwotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVQcm9jZXNzKFByb2Nlc3MgcHJvYywgZmluYWwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLAotCQkJTWFwIGNvbnRleHQpIHsKLQkJT2JqZWN0IG8gPSBjb250ZXh0LmdldChDVFhfQURBUFRFUl9GQUNUT1JZX1BST1ZJREVSKTsKLQkJaWYgKCEobyBpbnN0YW5jZW9mIElBZGFwdGVyRmFjdG9yeVByb3ZpZGVyKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJY2xhc3MgRmlsdGVyZWRBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yIHsKLQkJCQotCQkJcHVibGljIEZpbHRlcmVkQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIE9iamVjdCBvYmplY3QpIHsKLQkJCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgb2JqZWN0KTsKLQkJCX0KLQkJCQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBjaGlsZCkgewotCQkJCXJldHVybiBjaGlsZCBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudDsKLQkJCX0KLQkJCQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwTDsKLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pIHsKLQkJCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3VwZXIuZ2V0Q2hpbGRyZW4obyk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJCXx8IChjaGlsZCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIKLQkJCQkJCQkmJiAhKChEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBjaGlsZCkuaXNSZWFkT25seSgpKSkgewotCQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkJCWNoaWxkID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQkJCQl9Ci0JCQkJCWlmIChhY2NlcHQoY2hpbGQpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUFycmF5TGlzdCBmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlmZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FKTsKLQkJCQkJCQlpZihjaGlsZCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJCQkJCQlmZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUpOwotCQkJCQkJCX0KLQkJCQkJCQlOYW1lZEVsZW1lbnQgZSA9IChOYW1lZEVsZW1lbnQpIGNoaWxkOwotCQkJCQkJCWlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJCQkvL2NvbnRpbnVlOwotCQkJCQkJCX0KLQkJCQkJCQlpZihERUJVRykgewotCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJLnByaW50bG4oIkZpbHRlcmVkQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IuZ2V0Q2hpbGRyZW4oKTogdmFsaWRhdGluZyAnIiArIGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJfQotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJCQkuY3JlYXRlVmFsaWRhdG9yKG8sIG51bGwsCi0JCQkJCQkJCQkJCQkoRU9iamVjdCkgY2hpbGQsIGZlYXR1cmUsCi0JCQkJCQkJCQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJCQkJCU9iamVjdCBpdGVtUHJvdmlkZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChjaGlsZCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCQkJU3RyaW5nIHByb3AgPSAoU3RyaW5nKSBmZWF0dXJlVG9Qcm9wZXJ0eU1hcC5nZXQoZmVhdHVyZSk7Ci0JCQkJCQkJCVN0cmluZyBuYW1lOwotCQkJCQkJCQlpZihpdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIgJiYgcHJvcCAhPSBudWxsKSB7Ci0JCQkJCQkJCQluYW1lID0gKChJQlNJdGVtUHJvdmlkZXIpaXRlbVByb3ZpZGVyKS5nZXRBdHRyaWJ1dGUoY2hpbGQsIHByb3ApOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJbmFtZSA9IChTdHJpbmcpIGUuZUdldChmZWF0dXJlKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlTdHJpbmcgbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQobmFtZSk7Ci0JCQkJCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQkJCQkJYXBwZW5kRGlhZ25vc3RpY3MobmV3IFZhbGlkYXRpb25TdGF0dXMoCi0JCQkJCQkJCQkJCUlTdGF0dXMuRVJST1IsIDAsIG1zZywgZSwgZmVhdHVyZSksCi0JCQkJCQkJCQkJCWRpYWdub3N0aWNzKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0JCQkJCi0JCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JCUlBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHByb3ZpZGVyID0gKElBZGFwdGVyRmFjdG9yeVByb3ZpZGVyKSBvOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBGaWx0ZXJlZEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKHByb3ZpZGVyCi0JCQkJLmdldFdCU0FkYXB0ZXJGYWN0b3J5KCksIHByb2MpOwotCQlmb3IgKDsgaXRlcmF0b3IuaGFzTmV4dCgpOyBpdGVyYXRvci5uZXh0KCkpCi0JCQk7Ci0JCQotCQlpdGVyYXRvciA9IG5ldyBGaWx0ZXJlZEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKHByb3ZpZGVyLmdldFRCU0FkYXB0ZXJGYWN0b3J5KCksIHByb2MpIHsKLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgI2FjY2VwdChqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IGNoaWxkKSB7Ci0JCQkJcmV0dXJuIGNoaWxkIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IgfHwgY2hpbGQgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZTsKLQkJCX0KLQkJfTsKLQkJZm9yICg7IGl0ZXJhdG9yLmhhc05leHQoKTsgaXRlcmF0b3IubmV4dCgpKQotCQkJOwotCQkKLQkJaXRlcmF0b3IgPSBuZXcgRmlsdGVyZWRBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihwcm92aWRlci5nZXRXUEJTQWRhcHRlckZhY3RvcnkoKSwgcHJvYykgewotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSAjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChPYmplY3QgY2hpbGQpIHsKLQkJCQlyZXR1cm4gY2hpbGQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0JCQl9Ci0JCX07Ci0JCWZvciAoOyBpdGVyYXRvci5oYXNOZXh0KCk7IGl0ZXJhdG9yLm5leHQoKSkKLQkJCTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VHJhdmVyc2FsVHlwZShNYXAgY29udGV4dCkgewotCQlPYmplY3QgdHlwZSA9IGNvbnRleHQuZ2V0KExpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneS5UUkFWRVJTQUxfVFlQRSk7Ci0JCXJldHVybiAodHlwZSBpbnN0YW5jZW9mIE51bWJlciAmJiAoKE51bWJlcikgdHlwZSkuaW50VmFsdWUoKSA9PSBMaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3kuREVFUCkgPyBMaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3kuREVFUAotCQkJCTogTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5LlNIQURPVzsKLQl9Ci0KLQkvKioKLQkgKiBEaXJlY3QgdmFsaWRhdGlvbiBvZiB7QGxpbmsgRURhdGFUeXBlfXMgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgRU1GCi0JICogdmFsaWRhdGlvbiBmcmFtZXdvcms7IHRoZXkgYXJlIHZhbGlkYXRlZCBpbmRpcmVjdGx5IHZpYSB0aGUKLQkgKiB7QGxpbmsgRU9iamVjdH1zIHRoYXQgaG9sZCB0aGVpciB2YWx1ZXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IHZhbHVlLAotCQkJRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUoZURhdGFUeXBlLCB2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIElmIHdlIGhhdmUgYSBjb250ZXh0IG1hcCwgcmVjb3JkIHRoaXMgb2JqZWN0J3MgPGNvZGU+c3RhdHVzPC9jb2RlPiBpbgotCSAqIGl0IHNvIHRoYXQgd2Ugd2lsbCBrbm93IGxhdGVyIHRoYXQgd2UgaGF2ZSBwcm9jZXNzZWQgaXQgYW5kIGl0cyBzdWItdHJlZS4KLQkgKiAKLQkgKiBAcGFyYW0gZU9iamVjdAotCSAqICAgICAgICAgICAgYW4gZWxlbWVudCB0aGF0IHdlIGhhdmUgdmFsaWRhdGVkCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IChtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4pCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQncyB2YWxpZGF0aW9uIHN0YXR1cwotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzZWQoRU9iamVjdCBlT2JqZWN0LCBNYXAgY29udGV4dCwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJY29udGV4dC5wdXQoZU9iamVjdCwgc3RhdHVzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB3ZSBoYXZlIHByb2Nlc3NlZCB0aGlzIDxjb2RlPmVPYmplY3Q8L2NvZGU+IGJlZm9yZSwKLQkgKiBieSBhdXRvbWF0aWMgcmVjdXJzaW9uIG9mIHRoZSBFTUYgTW9kZWwgVmFsaWRhdGlvbiBTZXJ2aWNlLiBUaGlzIGlzIG9ubHkKLQkgKiBwb3NzaWJsZSBpZiB3ZSBkbywgaW5kZWVkLCBoYXZlIGEgY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gZU9iamVjdAotCSAqICAgICAgICAgICAgYW4gZWxlbWVudCB0byBiZSB2YWxpZGF0ZWQgKHdlIGhvcGUgbm90KQotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICB0aGUgY29udGV4dCAobWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+KQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRleHQgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IGFuZAotCSAqICAgICAgICAgdGhlIDxjb2RlPmVPYmplY3Q8L2NvZGU+IG9yIG9uZSBvZiBpdHMgY29udGFpbmVycyBoYXMgYWxyZWFkeQotCSAqICAgICAgICAgYmVlbiB2YWxpZGF0ZWQ7IDxjb2RlPmZhbHNlPC9jb2RlPiwgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc1Byb2Nlc3NlZChFT2JqZWN0IGVPYmplY3QsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJLy8gdGhpcyBpcyBPKE5sb2dOKSBidXQgdGhlcmUncyBubyBoZWxwaW5nIGl0Ci0JCQl3aGlsZSAoZU9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKGNvbnRleHQuY29udGFpbnNLZXkoZU9iamVjdCkpIHsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJZU9iamVjdCA9IG51bGw7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZU9iamVjdCA9IGVPYmplY3QuZUNvbnRhaW5lcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgYSBzdGF0dXMgcmVzdWx0IGZyb20gdGhlIEVNRiB2YWxpZGF0aW9uIHNlcnZpY2UgdG8gZGlhZ25vc3RpY3MuCi0JICogCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgdGhlIEVNRiB2YWxpZGF0aW9uIHNlcnZpY2UncyBzdGF0dXMgcmVzdWx0Ci0JICogQHBhcmFtIGRpYWdub3N0aWNzCi0JICogICAgICAgICAgICBhIGRpYWdub3N0aWMgY2hhaW4gdG8gYWNjdW11bGF0ZSByZXN1bHRzIG9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZERpYWdub3N0aWNzKElTdGF0dXMgc3RhdHVzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MpIHsKLQkJaWYgKHN0YXR1cy5pc011bHRpU3RhdHVzKCkpIHsKLQkJCUlTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kRGlhZ25vc3RpY3MoY2hpbGRyZW5baV0sIGRpYWdub3N0aWNzKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChzdGF0dXMgaW5zdGFuY2VvZiBJQ29uc3RyYWludFN0YXR1cykgewotCQkJZGlhZ25vc3RpY3MuYWRkKG5ldyBCYXNpY0RpYWdub3N0aWMoc3RhdHVzLmdldFNldmVyaXR5KCksIHN0YXR1cwotCQkJCQkuZ2V0UGx1Z2luKCksIHN0YXR1cy5nZXRDb2RlKCksIHN0YXR1cy5nZXRNZXNzYWdlKCksCi0JCQkJCSgoSUNvbnN0cmFpbnRTdGF0dXMpIHN0YXR1cykuZ2V0UmVzdWx0TG9jdXMoKS50b0FycmF5KCkpKTsKLQkJfSBlbHNlIGlmIChzdGF0dXMgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXR1cykgewotCQkJZGlhZ25vc3RpY3MuYWRkKG5ldyBCYXNpY0RpYWdub3N0aWMoc3RhdHVzLmdldFNldmVyaXR5KCksIHN0YXR1cwotCQkJCQkuZ2V0UGx1Z2luKCksIHN0YXR1cy5nZXRDb2RlKCksIHN0YXR1cy5nZXRNZXNzYWdlKCksCi0JCQkJCW5ldyBPYmplY3RbXSB7ICgob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0dXMpIHN0YXR1cykKLQkJCQkJCQkuZ2V0Q2hlY2tlZE9iamVjdCgpIH0pKTsKLQkJfSBlbHNlIHsKLQkJCWRpYWdub3N0aWNzLmFkZChuZXcgQmFzaWNEaWFnbm9zdGljKHN0YXR1cy5nZXRTZXZlcml0eSgpLCBzdGF0dXMKLQkJCQkJLmdldFBsdWdpbigpLCBzdGF0dXMuZ2V0Q29kZSgpLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLAotCQkJCQludWxsKSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyYTQyNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1jaXJjdWxhckRlcGVuZGVuY3lfZXJyb3I9Q3ljbGVzIGZvdW5kIGluIHRoZSBkZXBlbmRlbmN5IGdyYXBoIG9mIHRoZSBhc3NvY2lhdGlvbiB7MH0uezF9CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNkNTQ0OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2lyY3VsYXJEZXBlbmRlbmN5X2Vycm9yOwotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFZhbGlkYXRpb25SZXNvdXJjZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgVmFsaWRhdGlvblJlc291cmNlcygpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vY29uc3RyYWludHMvTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vY29uc3RyYWludHMvTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMjM0NTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL2NvbnN0cmFpbnRzL0xpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsLkNvbnRlbnRUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uc2VydmljZS5BYnN0cmFjdFRyYXZlcnNhbFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLnNlcnZpY2UuSVRyYXZlcnNhbFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjEKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VHJhdmVyc2FsU3RyYXRlZ3kgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQVZFUlNBTF9UWVBFID0gIlRSQVZFUlNBTF9UWVBFIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRyYXZlcnNhbCBzdHJhdGVneSB0eXBlIGNvbnN0YW50IGZvciBzaGFkb3cgdHJhdmVyc2FsCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hBRE9XID0gMDsKLQkKLQkvKioKLQkgKiBUcmF2ZXJzYWwgc3RyYXRlZ3kgdHlwZSBjb25zdGFudCBmb3IgZGVlcCB0cmF2ZXJzYWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUVQID0gMTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElUcmF2ZXJzYWxTdHJhdGVneSBkZWVwVHJhdmVyc2FsU3RyYXRlZ3kgPSBuZXcgTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5KERFRVApOwotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTGlicmFyeUl0ZXJhdG9yIGV4dGVuZHMgQ29udGVudFRyZWVJdGVyYXRvciB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xMTc1NDI4MDI3NTAzNDQwOTcwTDsKLQkJcHJpdmF0ZSBpbnQgdHJhdmVyc2FsVHlwZSA9IERFRVA7Ci0JCQotCQlwcm90ZWN0ZWQgTGlicmFyeUl0ZXJhdG9yKENvbGxlY3Rpb24gZW1mT2JqZWN0cykgewotCQkJc3VwZXIoZW1mT2JqZWN0cyk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gb2JqZWN0Ci0JCSAqIEBwYXJhbSBpc1Jlc29sdmVQcm94aWVzCi0JCSAqLwotCQlwdWJsaWMgTGlicmFyeUl0ZXJhdG9yKENvbGxlY3Rpb24gZU9iamVjdHMsIGJvb2xlYW4gaXNSZXNvbHZlUHJveGllcywgaW50IHRyYXZlcnNhbFR5cGUsIGJvb2xlYW4gZGlzam9pbnQpIHsKLQkJCXN1cGVyKGRpc2pvaW50ID8gbWFrZVRhcmdldHNEaXNqb2ludChlT2JqZWN0cykgOiBlT2JqZWN0cywgaXNSZXNvbHZlUHJveGllcyk7Ci0JCQl0aGlzLnRyYXZlcnNhbFR5cGUgID0gdHJhdmVyc2FsVHlwZTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJdGVyYXRvcjw/PiBnZXRFT2JqZWN0Q2hpbGRyZW4oRU9iamVjdCBvYmplY3QpIHsKLQkJCWlmKHRyYXZlcnNhbFR5cGUgPT0gREVFUCkgewotCQkJCWlmKCEob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkKLQkJCQkJCXx8IChvYmplY3QgaW5zdGFuY2VvZiBDb25zdHJhaW50IHx8IG9iamVjdCBpbnN0YW5jZW9mIERpYWdyYW1FbGVtZW50KSkgCi0JCQkJewotCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0RU9iamVjdENoaWxkcmVuKG9iamVjdCk7Ci0JCQl9Ci0JCQkKLQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJcmV0dXJuIGdldEVPYmplY3RDaGlsZHJlbigoQ3VzdG9tQ2F0ZWdvcnkpb2JqZWN0LCBVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFMsCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJCXx8IG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkJCQkJfHwgb2JqZWN0IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQKLQkJCSkgewotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJTWV0aG9kUGFja2FnZSBwa2cgPSAoTWV0aG9kUGFja2FnZSkgb2JqZWN0OwotCQkJCWlmKFRuZ1V0aWwuaXNQcmVkZWZpbmVkKHBrZykgJiYgTW9kZWxTdHJ1Y3R1cmUuQ1VTVE9NX0NBVEVHT1JZX1BBQ0tBR0VfTkFNRS5lcXVhbHMocGtnLmdldE5hbWUoKSkpIHsKLQkJCQkJLy8gdGhpcyBpcyB0aGUgY29udGVudCBwYWNrYWdlIHRoYXQgY29udGFpbnMgYWxsIHRoZSBjdXN0b20gY2F0ZWdvcmllcwotCQkJCQkvLyByZXR1cm4gcm9vdCBjdXN0b20gY2F0ZWdvcnkgYXMgaXRzIG9ubHkgY2hpbGQKLQkJCQkJLy8KLQkJCQkJQ29udGVudFBhY2thZ2UgaGlkZGVuUGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGtnCi0JCQkJCQkJLmdldENoaWxkUGFja2FnZXMoKSwgTW9kZWxTdHJ1Y3R1cmUuSElEREVOX1BBQ0tBR0VfTkFNRSk7Ci0JCQkJCWlmIChoaWRkZW5Qa2cgIT0gbnVsbCAmJiAhaGlkZGVuUGtnLmdldENvbnRlbnRFbGVtZW50cygpLmlzRW1wdHkoKSkgewotCQkJCQkJcmV0dXJuIGhpZGRlblBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIGdldEVPYmplY3RDaGlsZHJlbihwa2csIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJcmV0dXJuIGdldEVPYmplY3RDaGlsZHJlbigKLQkJCQkJCShNZXRob2RMaWJyYXJ5KSBvYmplY3QsCi0JCQkJCQluZXcgRVN0cnVjdHVyYWxGZWF0dXJlW10gewotCQkJCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUywKLQkJCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUyB9KTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBnZXRFT2JqZWN0Q2hpbGRyZW4oKEVPYmplY3QpIG9iamVjdCwgVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVMsIG51bGwpOwotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0ID09IHRoaXMub2JqZWN0KSB7Ci0JCQkJcmV0dXJuICgoQ29sbGVjdGlvbilvYmplY3QpLml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgSXRlcmF0b3IgZ2V0RU9iamVjdENoaWxkcmVuKEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlW10gZmVhdHVyZXMpIHsKLQkJCUVDb250ZW50c0VMaXN0IGxpc3QgPSBuZXcgRUNvbnRlbnRzRUxpc3QoZU9iamVjdCwgZmVhdHVyZXMpOwotCQkJcmV0dXJuIGlzUmVzb2x2ZVByb3hpZXMoKSA/IGxpc3QuaXRlcmF0b3IoKSA6IGxpc3QuYmFzaWNJdGVyYXRvcigpOwotCQl9Ci0JCQotCQlwcml2YXRlIEl0ZXJhdG9yIGdldEVPYmplY3RDaGlsZHJlbihFT2JqZWN0IGVPYmplY3QsIEVSZWZlcmVuY2UgcmVmZXJlbmNlLCBFQ2xhc3MgZUNsYXNzKSB7Ci0JCQlJdGVyYXRvciBpdGVyOwotCQkJaWYocmVmZXJlbmNlLmlzTWFueSgpKSB7Ci0JCQkJYm9vbGVhbiByZXNvbHZlID0gaXNSZXNvbHZlUHJveGllcygpOwotCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBlT2JqZWN0LmVHZXQocmVmZXJlbmNlLCByZXNvbHZlKTsKLQkJCQlpdGVyID0gIXJlc29sdmUgJiYgKGxpc3QgaW5zdGFuY2VvZiBJbnRlcm5hbEVMaXN0KSA/ICgoSW50ZXJuYWxFTGlzdClsaXN0KS5iYXNpY0l0ZXJhdG9yKCkgOiBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlPYmplY3QgdmFsdWUgPSBlT2JqZWN0LmVHZXQocmVmZXJlbmNlLCBpc1Jlc29sdmVQcm94aWVzKCkpOwotCQkJCWl0ZXIgPSB2YWx1ZSAhPSBudWxsID8gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh2YWx1ZSkuaXRlcmF0b3IoKSA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCX0KLQkJCWlmKGVDbGFzcyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGl0ZXI7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotCQkJCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZihlQ2xhc3MuaXNJbnN0YW5jZShvKSkgewotCQkJCQkJbGlzdC5hZGQobyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYobGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgaW50IGNvdW50RWxlbWVudHMoQ29sbGVjdGlvbiB0cmF2ZXJzYWxSb290cywgaW50IHRyYXZlcnNhbFR5cGUpIHsKLQkJcmV0dXJuIGNvdW50RWxlbWVudHModHJhdmVyc2FsUm9vdHMsIHRydWUsIHRyYXZlcnNhbFR5cGUpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBpbnQgY291bnRFbGVtZW50cyhDb2xsZWN0aW9uIHRyYXZlcnNhbFJvb3RzLCBib29sZWFuIG1ha2VEaXNqb2ludCwgaW50IHRyYXZlcnNhbFR5cGUpIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgTGlicmFyeUl0ZXJhdG9yKHRyYXZlcnNhbFJvb3RzLCB0cnVlLCB0cmF2ZXJzYWxUeXBlLCBtYWtlRGlzam9pbnQpOyBpdGVyLmhhc05leHQoKTsgY291bnQrKykgewotCQkJaXRlci5uZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiByb290czsKLQlwcml2YXRlIGJvb2xlYW4gY29udGV4dENoYW5nZWQgPSB0cnVlOwotCi0JcHJpdmF0ZSBpbnQgdHlwZSA9IERFRVA7Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgbWUuCi0JICovCi0JcHVibGljIExpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIExpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneShpbnQgdHJhdmVyc2FsVHlwZSkgewotCQl0aGlzLnR5cGUgID0gdHJhdmVyc2FsVHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3RhcnRUcmF2ZXJzYWwoCi0JCQlDb2xsZWN0aW9uIHRyYXZlcnNhbFJvb3RzLAotCQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJCi0JCXJvb3RzID0gbWFrZVRhcmdldHNEaXNqb2ludCh0cmF2ZXJzYWxSb290cyk7Ci0JCQotCQlzdXBlci5zdGFydFRyYXZlcnNhbCh0cmF2ZXJzYWxSb290cywgcHJvZ3Jlc3NNb25pdG9yKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldFJvb3RzKCkgewotCQlyZXR1cm4gcm9vdHM7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBJbXBsZW1lbnRzIHRoZSBpbmhlcml0ZWQgbWV0aG9kLgotCSAqLwotCXByb3RlY3RlZCBpbnQgY291bnRFbGVtZW50cyhDb2xsZWN0aW9uIGlnbm9yZWQpIHsKLQkJcmV0dXJuIGNvdW50RWxlbWVudHMoZ2V0Um9vdHMoKSwgZmFsc2UsIHR5cGUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogSW1wbGVtZW50cyB0aGUgaW5oZXJpdGVkIG1ldGhvZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgY3JlYXRlSXRlcmF0b3IoQ29sbGVjdGlvbiBpZ25vcmVkKSB7Ci0JCXJldHVybiBuZXcgTGlicmFyeUl0ZXJhdG9yKGdldFJvb3RzKCksIHRydWUsIHR5cGUsIGZhbHNlKSB7Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTY1MzEzNDk4OTIzNTY2Mzk3M0w7Ci0KLQkJCXB1YmxpYyBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiA9PSBnZXRSb290cygpKSB7Ci0JCQkJCXJldHVybiBuZXcgSXRlcmF0b3IoKSB7Ci0JCQkJCQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yIGRlbGVnYXRlID0KLQkJCQkJCQlnZXRSb290cygpLml0ZXJhdG9yKCk7Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQkJCQkJcmV0dXJuIGRlbGVnYXRlLmhhc05leHQoKTsKLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJCQkJCS8vIGlmIEknbSBiZWluZyBhc2tlZCBmb3IgbXkgbmV4dCBlbGVtZW50LCB0aGVuCi0JCQkJCQkJLy8gICAgd2UgYXJlIHN0ZXBwaW5nIHRvIGFub3RoZXIgdHJhdmVyc2FsIHJvb3QKLQkJCQkJCQljb250ZXh0Q2hhbmdlZCA9IHRydWU7Ci0JCQkJCQkJCi0JCQkJCQkJcmV0dXJuIGRlbGVnYXRlLm5leHQoKTsKLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJCQkJCWRlbGVnYXRlLnJlbW92ZSgpOwotCQkJCQkJfX07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQkJLy8gdGhpcyB3aWxsIGJlIHNldCB0byB0cnVlIGFnYWluIHRoZSBuZXh0IHRpbWUgd2UgdGVzdCBoYXNOZXh0KCkgYXQKLQkJCQkvLyAgICB0aGUgdHJhdmVyc2FsIHJvb3QgbGV2ZWwKLQkJCQljb250ZXh0Q2hhbmdlZCA9IGZhbHNlOwotCQkJCQotCQkJCXJldHVybiBzdXBlci5uZXh0KCk7Ci0JCQl9fTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDbGllbnRDb250ZXh0Q2hhbmdlZCgpIHsKLQkJcmV0dXJuIGNvbnRleHRDaGFuZ2VkOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFNldCBtYWtlVGFyZ2V0c0Rpc2pvaW50KENvbGxlY3Rpb24gb2JqZWN0cykgewotCQlTZXQgcmVzdWx0ID0gbmV3IGphdmEudXRpbC5IYXNoU2V0KCk7Ci0JCQotCQkvLyBlbnN1cmUgdGhhdCBhbnkgY29udGFpbmVkIChkZXNjZW5kZW50KSBlbGVtZW50cyBvZiBvdGhlciBlbGVtZW50cwotCQkvLyAgICB0aGF0IHdlIGluY2x1ZGUgYXJlIG5vdCBpbmNsdWRlZCwgYmVjYXVzZSB0aGV5IHdpbGwgYmUKLQkJLy8gICAgdHJhdmVyc2VkIGJ5IHJlY3Vyc2lvbiwgYW55d2F5Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIG91dGVyID0gb2JqZWN0cy5pdGVyYXRvcigpOyBvdXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG91dGVyTmV4dCA9IChFT2JqZWN0KW91dGVyLm5leHQoKTsKLQkJCQotCQkJZm9yIChJdGVyYXRvciBpbm5lciA9IHJlc3VsdC5pdGVyYXRvcigpOyBpbm5lci5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBpbm5lck5leHQgPSAoRU9iamVjdClpbm5lci5uZXh0KCk7Ci0JCQkJCi0JCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKGlubmVyTmV4dCwgb3V0ZXJOZXh0KSkgewotCQkJCQlvdXRlck5leHQgPSBudWxsOyAgLy8gZm9yZ2V0IHRoaXMgb25lCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKG91dGVyTmV4dCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0LmFkZChvdXRlck5leHQpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vY29uc3RyYWludHMvTmFtZUNvbnN0cmFpbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9jb25zdHJhaW50cy9OYW1lQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTJmNmMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9jb25zdHJhaW50cy9OYW1lQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uQWJzdHJhY3RNb2RlbENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uRU1GRXZlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JGYWN0b3J5LlR5cGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi51dGlsLlZhbGlkYXRpb25TdGF0dXM7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGNsYXNzIE5hbWVDb25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RNb2RlbENvbnN0cmFpbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBFQ2xhc3NbXSBDT05URU5UX0VMRU1FTlRfVFlQRVMgPSBnZXRDb250ZW50RWxlbWVudFR5cGVzKCk7Ci0vLwotLy8JcHJpdmF0ZSBzdGF0aWMgRUNsYXNzW10gZ2V0Q29udGVudEVsZW1lbnRUeXBlcygpIHsKLS8vCQlBcnJheUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJZm9yIChJdGVyYXRvciBpdGVyID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUNsYXNzaWZpZXJzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCU9iamVjdCB0eXBlID0gaXRlci5uZXh0KCk7Ci0vLwkJCWlmKHR5cGUgaW5zdGFuY2VvZiBFQ2xhc3MgJiYgVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlQuaXNTdXBlclR5cGVPZigoRUNsYXNzKSB0eXBlKSkgewotLy8JCQkJdHlwZXMuYWRkKHR5cGUpOwotLy8JCQl9Ci0vLwkJfQotLy8JCUVDbGFzc1tdIGVDbGFzc2VzID0gbmV3IEVDbGFzc1t0eXBlcy5zaXplKCldOwotLy8JCXR5cGVzLnRvQXJyYXkoZUNsYXNzZXMpOwotLy8JCXJldHVybiBlQ2xhc3NlczsKLS8vCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY2FuQ2hlY2soT2JqZWN0IGVPYmopIHsKLQkJcmV0dXJuIGVPYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4KLQkJCQl8fCBlT2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbgotCQkJCXx8IGVPYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZQotCQkJCXx8IGVPYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJfHwgKChlT2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UgfHwgZU9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSAmJiBVbWFVdGlsCi0JCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudCgoTWV0aG9kRWxlbWVudCkgZU9iaikgPT0gbnVsbCk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uQWJzdHJhY3RNb2RlbENvbnN0cmFpbnQjdmFsaWRhdGUob3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBjdHgpIHsKLQkJRU9iamVjdCBlT2JqID0gY3R4LmdldFRhcmdldCgpOwotCQlFTUZFdmVudFR5cGUgZVR5cGUgPSBjdHguZ2V0RXZlbnRUeXBlKCk7Ci0KLQkJaWYoREVCVUcpIHsKLQkJCWlmKGVPYmogaW5zdGFuY2VvZiBOYW1lZEVsZW1lbnQpIHsKLQkJCQlOYW1lZEVsZW1lbnQgZSA9IChOYW1lZEVsZW1lbnQpIGVPYmo7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJOYW1lQ29uc3RyYWludC52YWxpZGF0ZSgpOiAiICsgVG5nVXRpbC5nZXRUeXBlVGV4dChlKSArICI6ICciICsgZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQkJaWYoZU9iaiBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQl9Ci0JCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKEFjdGl2YXRvci5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEluIHRoZSBjYXNlIG9mIGJhdGNoIG1vZGUuCi0JCWlmIChlVHlwZSA9PSBFTUZFdmVudFR5cGUuTlVMTCkgewotCQkJaWYoKGVPYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIFRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBlT2JqKSkpCi0JCQl7Ci0JCQkJLy8gc2tpcCB2YWxpZGF0aW5nIHByZWRlZmluZWQgbWV0aG9kIGVsZW1lbnRzLCBDb250ZW50RGVzY3JpcHRpb24KLQkJCQkvLwotCQkJCXJldHVybiBjdHguY3JlYXRlU3VjY2Vzc1N0YXR1cygpOwotCQkJfQotCQkJCi0JCQkvLyB2YWxpZGF0ZSBvYmplY3QncyBuYW1lCi0JCQkvLwotCQkJaWYoZU9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY2MgPSAoQ3VzdG9tQ2F0ZWdvcnkpZU9iajsKLQkJCQlMaXN0IGxpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKGNjKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlDdXN0b21DYXRlZ29yeSBwYXJlbnQgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0ZXIubmV4dCgpOwotCQkJCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZU5hbWVWYWxpZGF0b3IocGFyZW50LCBjYyk7Ci0JCQkJCVN0cmluZyBtc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChjYy5nZXROYW1lKCkpOwotCQkJCQlpZihtc2cgIT0gbnVsbCkgewotCQkJCQkJbXVsdGlTdGF0dXMuYWRkKG5ldyBWYWxpZGF0aW9uU3RhdHVzKElTdGF0dXMuRVJST1IsIDAsIG1zZywgY2MsIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRSkpOwotCQkJCQl9Ci0JCQkJCXZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZVByZXNlbnRhdGlvbk5hbWVWYWxpZGF0b3IocGFyZW50LCBjYyk7Ci0JCQkJCW1zZyA9IHZhbGlkYXRvci5pc1ZhbGlkKGNjLmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQkJCWlmKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQltdWx0aVN0YXR1cy5hZGQobmV3IFZhbGlkYXRpb25TdGF0dXMoSVN0YXR1cy5FUlJPUiwgMCwgbXNnLCBjYywgVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYoY2FuQ2hlY2soZU9iaikpIAotCQkJewotCQkJCU5hbWVkRWxlbWVudCBlID0gKE5hbWVkRWxlbWVudCllT2JqOwotCQkJCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlTmFtZVZhbGlkYXRvcihlT2JqLmVDb250YWluZXIoKSwgZSk7Ci0JCQkJU3RyaW5nIG1zZyA9IHZhbGlkYXRvci5pc1ZhbGlkKGUuZ2V0TmFtZSgpKTsKLQkJCQlpZihtc2cgIT0gbnVsbCkgewotCQkJCQltdWx0aVN0YXR1cy5hZGQobmV3IFZhbGlkYXRpb25TdGF0dXMoSVN0YXR1cy5FUlJPUiwgMCwgbXNnLCBlLCBVbWFQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX0VMRU1FTlRfX05BTUUpKTsKLQkJCQl9Ci0vKgkJCQlpZihlT2JqIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJCURlc2NyaWJhYmxlRWxlbWVudCBkZSA9IChEZXNjcmliYWJsZUVsZW1lbnQpIGVPYmo7Ci0JCQkJCXZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZVByZXNlbnRhdGlvbk5hbWVWYWxpZGF0b3IoZU9iai5lQ29udGFpbmVyKCksIGRlKTsKLQkJCQkJbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQoZGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJCQkJaWYobXNnICE9IG51bGwpIHsKLQkJCQkJCW11bHRpU3RhdHVzLmFkZChuZXcgVmFsaWRhdGlvblN0YXR1cyhJU3RhdHVzLkVSUk9SLCAwLCBtc2csIGUsIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FKSk7Ci0JCQkJCX0KLQkJCQl9Ki8KLQkJCX0KLQkJCQotLy8JCQkvLyB2YWxpZGF0ZSBuYW1lIG9mIHRoZSBjaGlsZHJlbgotLy8JCQkvLwotLy8JCQlpZihlT2JqIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotLy8JCQkJSVN0YXR1cyBzdGF0dXMgPSBjaGVja0NoaWxkcmVuKGVPYmosIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TLCAKLS8vCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOKTsKLS8vCQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0vLwkJCQkJbXVsdGlTdGF0dXMubWVyZ2Uoc3RhdHVzKTsKLS8vCQkJCX0KLS8vCQkJCXN0YXR1cyA9IGNoZWNrQ2hpbGRyZW4oZU9iaiwgVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUywgCi0vLwkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0NPTkZJR1VSQVRJT04pOwotLy8JCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLS8vCQkJCQltdWx0aVN0YXR1cy5tZXJnZShzdGF0dXMpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCWVsc2UgaWYoZU9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0vLwkJCQlDb250ZW50UGFja2FnZSBwa2cgPSAoQ29udGVudFBhY2thZ2UpIGVPYmo7Ci0vLwkJCQlib29sZWFuIGNoZWNrZWQgPSBmYWxzZTsKLS8vCQkJCWlmKFRuZ1V0aWwuaXNQcmVkZWZpbmVkKHBrZykpIHsKLS8vCQkJCQlTdHJpbmcgbmFtZSA9IHBrZy5nZXROYW1lKCk7Ci0vLwkJCQkJaWYoTW9kZWxTdHJ1Y3R1cmUuRElTQ0lQTElORV9QQUNLQUdFX05BTUUuZXF1YWxzKG5hbWUpKSB7Ci0vLwkJCQkJCUlTdGF0dXMgc3RhdHVzID0gY2hlY2tDaGlsZHJlbihlT2JqLCBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywgCi0vLwkJCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FKTsJCQkJCi0vLwkJCQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0vLwkJCQkJCQltdWx0aVN0YXR1cy5tZXJnZShzdGF0dXMpOwotLy8JCQkJCQl9Ci0vLwkJCQkJCWNoZWNrZWQgPSB0cnVlOwotLy8JCQkJCX0KLS8vCQkJCQllbHNlIGlmIChNb2RlbFN0cnVjdHVyZS5ST0xFX1NFVF9QQUNLQUdFX05BTUUuZXF1YWxzKG5hbWUpKSB7Ci0vLwkJCQkJCUlTdGF0dXMgc3RhdHVzID0gY2hlY2tDaGlsZHJlbihlT2JqLCBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywgCi0vLwkJCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVCk7CQkJCQotLy8JCQkJCQlpZighc3RhdHVzLmlzT0soKSkgewotLy8JCQkJCQkJbXVsdGlTdGF0dXMubWVyZ2Uoc3RhdHVzKTsKLS8vCQkJCQkJfQotLy8JCQkJCQljaGVja2VkID0gdHJ1ZTsKLS8vCQkJCQl9Ci0vLwkJCQkJZWxzZSBpZiAoIShNb2RlbFN0cnVjdHVyZS5DT1JFX0NPTlRFTlRfUEFDQUtHRV9OQU1FLmVxdWFscyhuYW1lKSkpIHsKLS8vCQkJCQkJY2hlY2tlZCA9IHRydWU7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQkJaWYoIWNoZWNrZWQpIHsKLS8vCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IENPTlRFTlRfRUxFTUVOVF9UWVBFUy5sZW5ndGg7IGkrKykgewotLy8JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IGNoZWNrQ2hpbGRyZW4oZU9iaiwgVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsIAotLy8JCQkJCQkJCUNPTlRFTlRfRUxFTUVOVF9UWVBFU1tpXSk7CQkJCQotLy8JCQkJCQlpZighc3RhdHVzLmlzT0soKSkgewotLy8JCQkJCQkJbXVsdGlTdGF0dXMubWVyZ2Uoc3RhdHVzKTsKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotLy8JCQllbHNlIGlmKGVPYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotLy8JCQkJSVN0YXR1cyBzdGF0dXMgPSBjaGVja0NoaWxkcmVuKGVPYmosIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTLCAKLS8vCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0UpOwotLy8JCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLS8vCQkJCQltdWx0aVN0YXR1cy5tZXJnZShzdGF0dXMpOwotLy8JCQkJfQotLy8JCQl9Ci0JCQkKLQkJCWlmKG11bHRpU3RhdHVzLmlzT0soKSkgewotCQkJCXJldHVybiBjdHguY3JlYXRlU3VjY2Vzc1N0YXR1cygpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIG11bHRpU3RhdHVzOwotCQkJfQotCQkJCi0JCS8vIEluIHRoZSBjYXNlIG9mIGxpdmUgbW9kZS4KLQkJfSBlbHNlIHsKLQkJCU9iamVjdCBuZXdWYWx1ZSA9IGN0eC5nZXRGZWF0dXJlTmV3VmFsdWUoKTsKLQkJCQotCQkJaWYgKG5ld1ZhbHVlID09IG51bGwgfHwgKChTdHJpbmcpbmV3VmFsdWUpLmxlbmd0aCgpID09IDApIHsKLQkJCQlyZXR1cm4gY3R4LmNyZWF0ZUZhaWx1cmVTdGF0dXMobmV3IE9iamVjdFtdIHtlT2JqLmVDbGFzcygpLmdldE5hbWUoKX0pOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gY3R4LmNyZWF0ZVN1Y2Nlc3NTdGF0dXMoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDaGlsZEZpbHRlciBleHRlbmRzIFR5cGVGaWx0ZXIgewotCi0JCXByaXZhdGUgU2V0IGNoZWNrZWRDaGlsZHJlbjsKLQotCQlwdWJsaWMgQ2hpbGRGaWx0ZXIoRUNsYXNzIGVDbGFzcywgU2V0IGNoZWNrZWRDaGlsZHJlbikgewotCQkJc3VwZXIoZUNsYXNzKTsKLQkJCXRoaXMuY2hlY2tlZENoaWxkcmVuID0gY2hlY2tlZENoaWxkcmVuOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCWlmIChjaGVja2VkQ2hpbGRyZW4uY29udGFpbnMob2JqKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5hY2NlcHQob2JqKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBjaGVja0NoaWxkcmVuKEVPYmplY3Qgb2JqZWN0LCBFUmVmZXJlbmNlIGNoaWxkRmVhdHVyZSwKLQkJCUVDbGFzcyBlQ2xhc3MpIHsKLQkJTGlzdCBzdGF0dXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIG9iamVjdC5lR2V0KGNoaWxkRmVhdHVyZSk7Ci0JCVNldCBjaGVja2VkQ2hpbGRyZW4gPSBuZXcgSGFzaFNldCgpOwotCQlJRmlsdGVyIGNoaWxkRmlsdGVyID0gbmV3IENoaWxkRmlsdGVyKGVDbGFzcywgY2hlY2tlZENoaWxkcmVuKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGNoaWxkID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7Ci0JCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmNyZWF0ZVZhbGlkYXRvcihvYmplY3QsIGNoaWxkRmVhdHVyZSwgY2hpbGRGaWx0ZXIsCi0JCQkJCQkJCWNoaWxkLCBVbWFQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX0VMRU1FTlRfX05BTUUpOwotCQkJCU5hbWVkRWxlbWVudCBlID0gKE5hbWVkRWxlbWVudCkgY2hpbGQ7Ci0JCQkJU3RyaW5nIG1zZyA9IHZhbGlkYXRvci5pc1ZhbGlkKGUuZ2V0TmFtZSgpKTsKLQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJc3RhdHVzTGlzdC5hZGQobmV3IFZhbGlkYXRpb25TdGF0dXMoSVN0YXR1cy5FUlJPUiwgMCwgbXNnLAotCQkJCQkJCWUsIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRSkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVWYWxpZGF0b3IoCi0JCQkJCQkJCW9iamVjdCwKLQkJCQkJCQkJY2hpbGRGZWF0dXJlLAotCQkJCQkJCQljaGlsZEZpbHRlciwKLQkJCQkJCQkJY2hpbGQsCi0JCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FKTsKLQkJCQlEZXNjcmliYWJsZUVsZW1lbnQgZSA9IChEZXNjcmliYWJsZUVsZW1lbnQpIGNoaWxkOwotCQkJCVN0cmluZyBtc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChlLmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCXN0YXR1c0xpc3QKLQkJCQkJCQkuYWRkKG5ldyBWYWxpZGF0aW9uU3RhdHVzKAotCQkJCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCTAsCi0JCQkJCQkJCQltc2csCi0JCQkJCQkJCQllLAotCQkJCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCFzdGF0dXNMaXN0LmlzRW1wdHkoKSkgewotCQkJaWYgKHN0YXR1c0xpc3Quc2l6ZSgpID09IDEpIHsKLQkJCQlyZXR1cm4gKElTdGF0dXMpIHN0YXR1c0xpc3QuZ2V0KDApOwotCQkJfSBlbHNlIHsKLQkJCQlJU3RhdHVzW10gbmV3Q2hpbGRyZW4gPSBuZXcgSVN0YXR1c1tzdGF0dXNMaXN0LnNpemUoKV07Ci0JCQkJc3RhdHVzTGlzdC50b0FycmF5KG5ld0NoaWxkcmVuKTsKLQkJCQlyZXR1cm4gbmV3IE11bHRpU3RhdHVzKEFjdGl2YXRvci5QTFVHSU5fSUQsIDAsIG5ld0NoaWxkcmVuLAotCQkJCQkJIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL2NvbnN0cmFpbnRzL1JlbGF0aW9uc2hpcENvbnN0cmFpbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9jb25zdHJhaW50cy9SZWxhdGlvbnNoaXBDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNWVjYTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL2NvbnN0cmFpbnRzL1JlbGF0aW9uc2hpcENvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5BYnN0cmFjdE1vZGVsQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5FTUZFdmVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLnV0aWwuVmFsaWRhdGlvblN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVsYXRpb25zaGlwQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0TW9kZWxDb25zdHJhaW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiByZWZlcmVuY2VzVG9DaGVja0ZvckNpcmN1bGFyRGVwZW5kZW5jeSA9IEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHsKLQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BMVUdJTl9fQkFTRVMKLQkJCSwgVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UCi0JCQksIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUwotCQkJLCBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUUwotCQkJLCBVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFMKLQl9KTsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLkFic3RyYWN0TW9kZWxDb25zdHJhaW50I3ZhbGlkYXRlKG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgY3R4KSB7Ci0JCWlmIChEZXBlbmRlbmN5Q2hlY2tlci5uZXdDaGVjaykgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJRU9iamVjdCBlT2JqID0gY3R4LmdldFRhcmdldCgpOwotCQlFTUZFdmVudFR5cGUgZVR5cGUgPSBjdHguZ2V0RXZlbnRUeXBlKCk7Ci0JCQotCQlpZihERUJVRykgewotCQkJaWYoZU9iaiBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotCQkJCU5hbWVkRWxlbWVudCBlID0gKE5hbWVkRWxlbWVudCkgZU9iajsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlbGF0aW9uc2hpcENvbnN0cmFpbnQudmFsaWRhdGUoKTogIiArIFRuZ1V0aWwuZ2V0VHlwZVRleHQoZSkgKyAiOiAnIiArIGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJfQotCi0JCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKEFjdGl2YXRvci5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEluIHRoZSBjYXNlIG9mIGJhdGNoIG1vZGUuCi0JCWlmIChlVHlwZSA9PSBFTUZFdmVudFR5cGUuTlVMTCkgewotCQkJQ29sbGVjdGlvbiBmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QocmVmZXJlbmNlc1RvQ2hlY2tGb3JDaXJjdWxhckRlcGVuZGVuY3kpOwotCQkJZmVhdHVyZXMucmV0YWluQWxsKGVPYmouZUNsYXNzKCkuZ2V0RUFsbFJlZmVyZW5jZXMoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFUmVmZXJlbmNlIHJlZiA9IChFUmVmZXJlbmNlKSBpdGVyLm5leHQoKTsKLQkJCQlpZihyZWYuaXNNYW55KCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoTGlzdCllT2JqLmVHZXQocmVmKSkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IG8gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KGVPYmosIHJlZiwgbyk7Ci0JCQkJCQlpZighc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCVN0cmluZyBtc2cgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQkJCQkJCWlmKFN0clV0aWwuaXNCbGFuayhtc2cpKSB7Ci0JCQkJCQkJCW1zZyA9IE5MUy5iaW5kKFZhbGlkYXRpb25SZXNvdXJjZXMuY2lyY3VsYXJEZXBlbmRlbmN5X2Vycm9yLCByZWYuZ2V0RUNvbnRhaW5pbmdDbGFzcygpLmdldE5hbWUoKSwgcmVmLmdldE5hbWUoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCW11bHRpU3RhdHVzLmFkZChuZXcgVmFsaWRhdGlvblN0YXR1cyhJU3RhdHVzLkVSUk9SLCAwLCBtc2csIGVPYmosIHJlZikpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlPYmplY3QgbyA9IGVPYmouZUdldChyZWYpOwotCQkJCQlpZihvICE9IG51bGwpIHsKLQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koZU9iaiwgcmVmLCBvKTsKLQkJCQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJU3RyaW5nIG1zZyA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCQkJCQkJaWYoU3RyVXRpbC5pc0JsYW5rKG1zZykpIHsKLQkJCQkJCQkJbXNnID0gTkxTLmJpbmQoVmFsaWRhdGlvblJlc291cmNlcy5jaXJjdWxhckRlcGVuZGVuY3lfZXJyb3IsIHJlZi5nZXRFQ29udGFpbmluZ0NsYXNzKCkuZ2V0TmFtZSgpLCByZWYuZ2V0TmFtZSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJbXVsdGlTdGF0dXMuYWRkKG5ldyBWYWxpZGF0aW9uU3RhdHVzKElTdGF0dXMuRVJST1IsIDAsIG1zZywgZU9iaiwgcmVmKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmKG11bHRpU3RhdHVzLmlzT0soKSkgewotCQkJCXJldHVybiBjdHguY3JlYXRlU3VjY2Vzc1N0YXR1cygpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIG11bHRpU3RhdHVzOwotCQkJfQkJCQotCQl9IAotCQkKLQkJcmV0dXJuIGN0eC5jcmVhdGVTdWNjZXNzU3RhdHVzKCk7Ci0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL3V0aWwvU3RhcnR1cC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL3V0aWwvU3RhcnR1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmMzMTc5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi91dGlsL1N0YXJ0dXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uTGlicmFyeUVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXA7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGFydHVwIGltcGxlbWVudHMgSVN0YXJ0dXAgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXAjZWFybHlTdGFydHVwKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlYXJseVN0YXJ0dXAoKSB7Ci0JCUVWYWxpZGF0b3IuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLAotCQkJCW5ldyBMaWJyYXJ5RVZhbGlkYXRvcigpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi91dGlsL1ZhbGlkYXRpb25TdGF0dXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi91dGlsL1ZhbGlkYXRpb25TdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkNDdjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vdXRpbC9WYWxpZGF0aW9uU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi51dGlsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uQWN0aXZhdG9yOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblN0YXR1cyBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdHVzIHsKLQotCXB1YmxpYyBWYWxpZGF0aW9uU3RhdHVzKGludCBzZXZlcml0eSwgaW50IGNvZGUsIFN0cmluZyBtZXNzYWdlLCBPYmplY3QgY2hlY2tlZE9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJc3VwZXIoQWN0aXZhdG9yLlBMVUdJTl9JRCwgc2V2ZXJpdHksIGNvZGUsIG1lc3NhZ2UsIGNoZWNrZWRPYmplY3QsIGZlYXR1cmUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjE2NGI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9InJ1bnRpbWUiLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvLmN2c2lnbm9yZSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNzZhN2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotcnVudGltZQotYmluCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzMyYTlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnhtbC51bWE8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjAwMWM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotI1RodSBNYXkgMDMgMTY6NTY6NTcgUERUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy8vc3JjL21vZGVsL0VQRl9TY2hlbWFfMjAwNjA5MDcxMzM0LnhzZD1VVEY4Ci1lbmNvZGluZy8vc3JjL21vZGVsL0VQRl9TY2hlbWFfMjAwNzA0MDMxNDI1LnhzZD1VVEY4Ci1lbmNvZGluZy8vc3JjL21vZGVsL1VNQS54c2Q9VVRGOApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRiNDFjMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYSwKLSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLAotIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWwKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkbwotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmZiMTZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIDxjb3B5cmlnaHQ+Ci0jIDwvY29weXJpZ2h0PgotIwotIyAkSWQ6IGJ1aWxkLnByb3BlcnRpZXMsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowNCBqdGhhbSBFeHAgJAotCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbAotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTgxNGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyA8Y29weXJpZ2h0PgotIyA8L2NvcHlyaWdodD4KLSMKLSMgJElkOiBwbHVnaW4ucHJvcGVydGllcyx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjA0IGp0aGFtIEV4cCAkCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLXBsdWdpbk5hbWUgPSBFUEYgWE1MIFVNQSBNb2RlbAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTM1YjFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08IS0tCi0gPGNvcHlyaWdodD4KLSA8L2NvcHlyaWdodD4KLQotICRJZDogcGx1Z2luLnhtbCx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjA0IGp0aGFtIEV4cCAkCi0tLT4KLQotPHBsdWdpbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgIDxwYWNrYWdlIAotICAgICAgIHVyaSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMiIAotICAgICAgIGNsYXNzID0gIm9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UiIC8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5leHRlbnNpb25fcGFyc2VyIj4KLSAgICA8cGFyc2VyIAotICAgICAgIHR5cGU9InVtYSIgCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWwuVW1hUmVzb3VyY2VGYWN0b3J5SW1wbCIgLz4KLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvRVBGX1NjaGVtYV8yMDA2MDgzMDA3MzYueHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL0VQRl9TY2hlbWFfMjAwNjA4MzAwNzM2LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiYzQ1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvRVBGX1NjaGVtYV8yMDA2MDgzMDA3MzYueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM5OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBFUEYgVU1BIFhNTCBEYXRhIEludGVyY2hhbmdlIFNjaGVtYSAtLT4KLTx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp1bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMyI+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IldvcmtPcmRlclR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOQ05hbWUiPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluaXNoVG9TdGFydCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluaXNoVG9GaW5pc2giLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0YXJ0VG9TdGFydCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RhcnRUb0ZpbmlzaCIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5DTmFtZSI+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuYSIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29udHJpYnV0ZXMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImV4dGVuZHMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJlcGxhY2VzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsb2NhbENvbnRyaWJ1dGlvbiIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibG9jYWxSZXBsYWNlbWVudCIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJOYW1lZEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYWNrYWdlYWJsZUVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TmFtZWRFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBEZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UGFja2FnZWFibGVFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik93bmVkUnVsZSIgdHlwZT0idW1hOkNvbnN0cmFpbnQiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBwYWNrYWdpbmcgcnVsZXMgZm9yIHRoaXMgTWV0aG9kIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IGhhcyBhIGdsb2JhbCB1bmlxdWUgaWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InN1cHByZXNzZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPklmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSAiZXh0ZW5kcyIgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24sIHRoZW4gdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgaW5oZXJpdGVkIE1ldGhvZCBFbGVtZW50cyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCwgd2hpY2ggY2FuIGJlIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIG9uIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0aGFuIGFuIGluaGVyaXRlZCBtZXRob2QgZWxlbWVudCB0aGVuIGl0IHdpbGwgbm90IGJlIHJlZ2FyZGVkIGFzIGluaGVyaXRlZCBhdCBhbGwuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JkZXJpbmdHdWlkZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VkIGZvciBDQVNFIHRvb2wgcmVhbGl6YXRpb25zIG9mIHRoaXMgbW9kZWwgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBsYXlvdXQgYW5kIG9yZGVyaW5nIG9mIHRoZSBtZXRob2QgZWxlbWVudCBhbmQgaXRzIHBhcnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnN0cmFpbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdG9yZXMgdGhlIG1haW4gZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTZWN0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YlNlY3Rpb24iIHR5cGU9InVtYTpTZWN0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWRlY2Vzc29yIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VjdGlvbk5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWRlY2Vzc29yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZFVuaXQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIE1ldGhvZCBMaWJyYXJ5IGFzIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvcHlyaWdodCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXV0aG9ycyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFpbkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdG9yZXMgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IktleUNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlNlY3Rpb24iIHR5cGU9InVtYTpTZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+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+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsSWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGFydGlmYWN0LiBVc2VkIGxpa2UgYSBzeW5vbnltLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFydGlmYWN0RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBcnRpZmFjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCcmllZk91dGxpbmUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXByZXNlbnRhdGlvbk9wdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+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+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsSWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGRlbGl2ZXJ5IHBhdHRlcm5zIGFuZCBtb2RlbHMuIEl0IGlzIHVzZWQgbGlrZSBhIHN5bm9ueW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+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+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+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBsdWdpbiIgdHlwZT0idW1hOk1ldGhvZFBsdWdpbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIgdHlwZT0idW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZExpYnJhcnkiIHR5cGU9InVtYTpNZXRob2RMaWJyYXJ5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDYwOTA3MTMzNC54c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvRVBGX1NjaGVtYV8yMDA2MDkwNzEzMzQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDNlNGZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDYwOTA3MTMzNC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIEVQRiBVTUEgWE1MIERhdGEgSW50ZXJjaGFuZ2UgU2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6dW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIj4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5DTmFtZSI+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5pc2hUb1N0YXJ0Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5pc2hUb0ZpbmlzaCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RhcnRUb1N0YXJ0Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdGFydFRvRmluaXNoIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlZhcmlhYmlsaXR5VHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6TkNOYW1lIj4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5hIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb250cmlidXRlcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXh0ZW5kcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmVwbGFjZXMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxvY2FsQ29udHJpYnV0aW9uIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsb2NhbFJlcGxhY2VtZW50Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJleHRlbmRzUmVwbGFjZXMiLz4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+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+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+QSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmFzZUNvbmZpZ3VyYXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBsdWdpblNlbGVjdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGFja2FnZVNlbGVjdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVmYXVsdFZpZXciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvY2Vzc1ZpZXciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIHR5cGU9InVtYTpNZXRob2RDb25maWd1cmF0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZExpYnJhcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGx1Z2luIiB0eXBlPSJ1bWE6TWV0aG9kUGx1Z2luIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiB0eXBlPSJ1bWE6TWV0aG9kQ29uZmlndXJhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InRvb2wiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIHRvb2wgdGhhdCBnZW5lcmF0ZWQgdGhlIFhNTCBmaWxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kTGlicmFyeSIgdHlwZT0idW1hOk1ldGhvZExpYnJhcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL0VQRl9TY2hlbWFfMjAwNzA0MDMxNDI1LnhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDcwNDAzMTQyNS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlN2IxNjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL0VQRl9TY2hlbWFfMjAwNzA0MDMxNDI1LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE0MTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gRVBGIFVNQSBYTUwgRGF0YSBJbnRlcmNoYW5nZSBTY2hlbWEgLS0+Ci08eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp1bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMyIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMiPgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJXb3JrT3JkZXJUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnQgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50IGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50IGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF2YWlsYWJsZSBpbiBVTUEgYW5kIGlzIHVzZWQgdG8gcHJvdmlkZSB2YWx1ZXMgZm9yIFdvcmsgT3JkZXIncyBsaW5rVHlwZSBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6TkNOYW1lIj4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmlzaFRvU3RhcnQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmlzaFRvRmluaXNoIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdGFydFRvU3RhcnQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0YXJ0VG9GaW5pc2giLz4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVmFyaWFiaWxpdHlUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOQ05hbWUiPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmEiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbnRyaWJ1dGVzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJleHRlbmRzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZXBsYWNlcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibG9jYWxDb250cmlidXRpb24iLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxvY2FsUmVwbGFjZW1lbnQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImV4dGVuZHNSZXBsYWNlcyIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJOYW1lZEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYWNrYWdlYWJsZUVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TmFtZWRFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBEZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UGFja2FnZWFibGVFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik93bmVkUnVsZSIgdHlwZT0idW1hOkNvbnN0cmFpbnQiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBwYWNrYWdpbmcgcnVsZXMgZm9yIHRoaXMgTWV0aG9kIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RFbGVtZW50UHJvcGVydHkiIHR5cGU9InVtYTpNZXRob2RFbGVtZW50UHJvcGVydHkiPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdXBwcmVzc2VkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgImV4dGVuZHMiIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uLCB0aGVuIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGluaGVyaXRlZCBNZXRob2QgRWxlbWVudHMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQsIHdoaWNoIGNhbiBiZSBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvbiBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdGhhbiBhbiBpbmhlcml0ZWQgbWV0aG9kIGVsZW1lbnQgdGhlbiBpdCB3aWxsIG5vdCBiZSByZWdhcmRlZCBhcyBpbmhlcml0ZWQgYXQgYWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9yZGVyaW5nR3VpZGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VXNlZCBmb3IgQ0FTRSB0b29sIHJlYWxpemF0aW9ucyBvZiB0aGlzIG1vZGVsIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgbGF5b3V0IGFuZCBvcmRlcmluZyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgYW5kIGl0cyBwYXJ0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb25zdHJhaW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgY29uZGl0aW9uIG9yIHJlc3RyaWN0aW9uIGV4cHJlc3NlZCBpbiBuYXR1cmFsIGxhbmd1YWdlIHRleHQgb3IgaW4gYSBtYWNoaW5lIHJlYWRhYmxlIGxhbmd1YWdlIGZvciB0aGUgcHVycG9zZSBvZiBkZWNsYXJpbmcgc29tZSBvZiB0aGUgc2VtYW50aWNzIG9mIGEgTWV0aG9kIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3RvcmVzIHRoZSBtYWluIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RFbGVtZW50UHJvcGVydHkiPgotCSAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotCSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQYWNrYWdlYWJsZUVsZW1lbnQiPgotCSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkgICAgICA8L3hzZDpleHRlbnNpb24+Ci0JICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAJPC94c2Q6Y29tcGxleFR5cGU+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+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgkJCQkKLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+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+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGFuIEFydGlmYWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJyaWVmT3V0bGluZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhpcyBhcnRpZmFjdC4gRm9yIGV4YW1wbGUsIGRpc2N1c3NlcyB0aGUgY29udGVudHMgZm9yIGtleSBjaGFwdGVycyBvZiBhIGRvY3VtZW50IGFydGlmYWN0IG9yIHRoZSBrZXkgcGFja2FnZXMgYW5kIG1vZHVsZXMgb2YgYSBtb2RlbCBhcnRpZmFjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcHJlc2VudGF0aW9uT3B0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVwcmVzZW50YXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJOb3RhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4JCQkJCQotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+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+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+Ci0JPC94c2Q6ZWxlbWVudD4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDgwMTI3MDk0Mi54c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvRVBGX1NjaGVtYV8yMDA4MDEyNzA5NDIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWU2NDBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDgwMTI3MDk0Mi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIEVQRiBVTUEgWE1MIERhdGEgSW50ZXJjaGFuZ2UgU2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6dW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC41Ij4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5DTmFtZSI+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5pc2hUb1N0YXJ0Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5pc2hUb0ZpbmlzaCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RhcnRUb1N0YXJ0Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdGFydFRvRmluaXNoIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlZhcmlhYmlsaXR5VHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6TkNOYW1lIj4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5hIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb250cmlidXRlcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXh0ZW5kcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmVwbGFjZXMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxvY2FsQ29udHJpYnV0aW9uIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsb2NhbFJlcGxhY2VtZW50Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJleHRlbmRzUmVwbGFjZXMiLz4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTmFtZWRFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2FibGUgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk5hbWVkRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQYWNrYWdlYWJsZUVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzUHJpbWFyeUV4dGVuc2lvbiIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIERlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGFsbCBVTUEgTWV0aG9kIEVsZW1lbnRzLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQYWNrYWdlYWJsZUVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3duZWRSdWxlIiB0eXBlPSJ1bWE6Q29uc3RyYWludCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHBhY2thZ2luZyBydWxlcyBmb3IgdGhpcyBNZXRob2QgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIgdHlwZT0idW1hOk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdXBwcmVzc2VkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgImV4dGVuZHMiIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uLCB0aGVuIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGluaGVyaXRlZCBNZXRob2QgRWxlbWVudHMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQsIHdoaWNoIGNhbiBiZSBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvbiBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdGhhbiBhbiBpbmhlcml0ZWQgbWV0aG9kIGVsZW1lbnQgdGhlbiBpdCB3aWxsIG5vdCBiZSByZWdhcmRlZCBhcyBpbmhlcml0ZWQgYXQgYWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9yZGVyaW5nR3VpZGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VXNlZCBmb3IgQ0FTRSB0b29sIHJlYWxpemF0aW9ucyBvZiB0aGlzIG1vZGVsIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgbGF5b3V0IGFuZCBvcmRlcmluZyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgYW5kIGl0cyBwYXJ0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAicnVwX2FyY2hpdGVjdHVyZV9kb2N1bWVudCIgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgImoyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQiIHdoZXJlYXMgdGhlIGV4dGVybmFsIHByZXNlbnRhdGlvbiB3b3VsZCBhbHdheXMgYmUgIkFyY2hpdGVjdHVyZSBEb2N1bWVudCIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29uc3RyYWludCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN0b3JlcyB0aGUgbWFpbiBkZWZpbml0aW9uIG9mIHRoZSBjb25zdHJhaW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZEVsZW1lbnRQcm9wZXJ0eSI+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UGFja2FnZWFibGVFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNlY3Rpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViU2VjdGlvbiIgdHlwZT0idW1hOlNlY3Rpb24iIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlZGVjZXNzb3IiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgYXR0cmlidXRlcyBzdG9yZSB0aGUgZGVzY3JpcHRpb24gdGV4dCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uJ3MgU2VjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWN0aW9uTmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZFVuaXQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIE1ldGhvZCBMaWJyYXJ5IGFzIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvcHlyaWdodCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXV0aG9ycyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFpbkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdG9yZXMgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IktleUNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlNlY3Rpb24iIHR5cGU9InVtYTpTZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXh0ZXJuYWxJZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgYXJ0aWZhY3QuIFVzZWQgbGlrZSBhIHN5bm9ueW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+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+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcHJlc2VudGF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik5vdGF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyYWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeHRlcm5hbERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2luZ0d1aWRhbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUm9sZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFzc2lnbm1lbnRBcHByb2FjaGVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBndWlkYW5jZSBvbiBmb3IgYXNzaWduaW5nIGluZGl2aWR1YWxzIHRvIHRoZSBSb2xlIGluIHRlcm1zIG9mIHdoYXQgb3RoZXIgcm9sZXMgdGhlc2UgaW5kaXZpZHVhbHMgY291bGQgcGVyZm9ybSBhbmQgd2hhdCByZXNwb25zaWJpbGl0eSBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgYXNzaWduZWQgdG8gdGhpcyByb2xlIG1pZ2h0IGhhdmUuICBUaGUgZ3VpZGFuY2UgY2FuIGFsc28gZGVzY3JpYmUgZGlmZmVyZW50IGFzc2lnbm1lbnQgYXBwcm9hY2hlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLCBlLmcuIGZvciBsYXJnZSB2ZXJzdXMgc21hbGwgdGVhbXMgd2hlcmUgaW5kaXZpZHVhbHMgY291bGQgYmUgYWxsb2NhdGVkIHRvIHJvbGVzIGZ1bGwgdGltZSB2ZXJzdXMgc2hhcmluZyByb2xlcyB3aXRoaW4gdGhlIHRlYW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTa2lsbHMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN5bm9ueW1zIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0cyBzeW5vbnltcywgaS5lLiBvdGhlciBuYW1lcyB0aGUgUm9sZSBtaWdodCBiZSByZWZlcnJlZCBieS4gIFRvb2wgc3VwcG9ydCBmb3IgdGhlIG1ldGEtbW9kZWwgbWlnaHQgc3VwcG9ydCB0aGF0IGEgUm9sZSBuYW1lIGNhbiBiZSBjb25zaXN0ZW50bHkgYmUgcmVwbGFjZWQgd2l0aCBvbmUgb2YgaXRzIHN5bm9ueW1zIHRocm91Z2h0IGEgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWx0ZXJuYXRpdmVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBhY2hpZXZpbmcgdGhpcyBUYXNrJ3MgZGV2ZWxvcG1lbnQgZ29hbHMgdGhhdCB3ZXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBUYXNrJ3MgU3RlcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4KLVRoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZXNlbnRhdGlvbiIgdHlwZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJGdWxmaWxsIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2hhcGVpY29uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJub2RlaWNvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzQWJzdHJhY3QiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuCi1Db250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaWJhYmxlRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2hlY2tsaXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29uY2VwdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4YW1wbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJHdWlkZWxpbmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzYWJsZUFzc2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV2hpdGVwYXBlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IktpbmQiPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXBwbGljYWJsZU1ldGFDbGFzc0luZm8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+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+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+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+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNoZWNrbGlzdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbmNlcHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeGFtcGxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR3VpZGVsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV1c2FibGVBc3NldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldoaXRlcGFwZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWZpeCIgdHlwZT0ieHNkOnN0cmluZyI+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+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWlsZXN0b25lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVxdWlyZWRSZXN1bHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBY3Rpdml0eSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uCi1BY3Rpdml0eSByZXByZXNlbnRzIGEgZ3JvdXBpbmcgZWxlbWVudCBmb3Igb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4gIEl0IGlzIG5vdCBwZXItc2UgYSAnaGlnaC1sZXZlbCcgZ3JvdXBpbmcgb2Ygb25seSB3b3JrIGFzIGluIG90aGVyIG1ldGEtbW9kZWxzLCBidXQgZ3JvdXBzIGFueSBraW5kIG9mIEJyZWFrZG93biBFbGVtZW50cy4gIEZvciBleGFtcGxlLCBvbmUgY2FuIGRlZmluZSB2YWxpZCBBY3Rpdml0aWVzIHRoYXQgZ3JvdXAgb25seSBXb3JrIFByb2R1Y3RzIERlc2NyaXB0b3JzIHdpdGhvdXQgYW55IG1hdGNoaW5nIFRhc2sgRGVzY3JpcHRvcnMuICBBY3Rpdml0aWVzIGFsc28gaW5oZXJpdCBhbGwgcHJvcGVydGllcyBmcm9tIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIGluZGlyZWN0bHkgZnJvbSBQcm9jZXNzIEVsZW1lbnQ7IGkuZS4gQWN0aXZpdHkgaXMgcmVhZHkgdG8gaGF2ZSBhIGZ1bGwgY29udGVudCBkZXNjcmlwdGlvbiBhdHRhY2hlZCB0byBpdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlY29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3Rjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCcmVha2Rvd25FbGVtZW50IiB0eXBlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvYWRtYXAiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJJc0VuYWN0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+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+QW55IGFkZGl0aW9uYWwgbm90ZXMgb24gaG93IHRvIGFwcGx5IGFuZCBpbnN0YW50aWF0ZSB0aGlzIHByb2Nlc3MgZm9yIGEgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+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+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJ0cmFjdGVkQ2F0ZWdvcnkiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGVkQ2F0ZWdvcnkiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIHR5cGU9InVtYTpNZXRob2RDb25maWd1cmF0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZExpYnJhcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGx1Z2luIiB0eXBlPSJ1bWE6TWV0aG9kUGx1Z2luIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiB0eXBlPSJ1bWE6TWV0aG9kQ29uZmlndXJhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InRvb2wiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIHRvb2wgdGhhdCBnZW5lcmF0ZWQgdGhlIFhNTCBmaWxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kTGlicmFyeSIgdHlwZT0idW1hOk1ldGhvZExpYnJhcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL1VNQS5lY29yZSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9VTUEuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MzM1OTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL1VNQS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDI4MzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0idW1hIgotICAgIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjUiIG5zUHJlZml4PSJ1bWEiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5IiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4mI3hEOyYjeEE7QWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3Rpdml0eSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlY29uZGl0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVjb25kaXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icG9zdGNvbmRpdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUG9zdGNvbmRpdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDozNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJicmVha2Rvd25FbGVtZW50IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0JyZWFrZG93bkVsZW1lbnQiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQnJlYWtkb3duRWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjM3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvYWRtYXAiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2FkbWFwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNFbmFjdGFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzRW5hY3RhYmxlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIGVUeXBlPSIjLy9WYXJpYWJpbGl0eVR5cGUiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Im5hIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idmFyaWFiaWxpdHlUeXBlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBY3Rpdml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdGVybmF0aXZlcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBbHRlcm5hdGl2ZXMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaG93VG9TdGFmZiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIb3dUb1N0YWZmIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1cnBvc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHVycG9zZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIgZVN1cGVyVHlwZXM9IiMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZW1wdHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNQcmltYXJ5RXh0ZW5zaW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpc1ByaW1hcnlFeHRlbnNpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJ0aWZhY3QiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdHlwZXMuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbCBhcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4mI3hEOyYjeEE7QXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICZxdW90O293biZxdW90OyBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXJ0aWZhY3QiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjMwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lZEFydGlmYWN0IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0FydGlmYWN0IiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnRhaW5lZEFydGlmYWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQXJ0aWZhY3QuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBcnRpZmFjdERlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJicmllZk91dGxpbmUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhpcyBhcnRpZmFjdC4gRm9yIGV4YW1wbGUsIGRpc2N1c3NlcyB0aGUgY29udGVudHMgZm9yIGtleSBjaGFwdGVycyBvZiBhIGRvY3VtZW50IGFydGlmYWN0IG9yIHRoZSBrZXkgcGFja2FnZXMgYW5kIG1vZHVsZXMgb2YgYSBtb2RlbCBhcnRpZmFjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQnJpZWZPdXRsaW5lIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlcHJlc2VudGF0aW9uT3B0aW9ucyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEaXNjdXNzZXMgZGlmZmVyZW50IHBvc3NpYmxlIGFsdGVybmF0aXZlIHJlcHJlc2VudGF0aW9ucyBmb3IgdGhlIGFydGlmYWN0LiBGb3IgZXhhbXBsZSBhIGRlc2lnbiBtb2RlbCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBVTUwgbW9kZWwgb3IgYW4gaW5mb3JtYWwgYmxvY2sgZGlhZ3JhbSBvciBieSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9ubHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlcHJlc2VudGF0aW9uT3B0aW9ucyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXByZXNlbnRhdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVwcmVzZW50YXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm90YXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5vdGF0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQnJlYWtkb3duRWxlbWVudCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlc2VudGVkQWZ0ZXIiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZXNlbnRlZEFmdGVyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZXNlbnRlZEJlZm9yZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlc2VudGVkQmVmb3JlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBsYW5uaW5nRGF0YSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGxhbm5pbmdEYXRhIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cGVyQWN0aXZpdHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1cGVyQWN0aXZpdHkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAxIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MTgiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hlY2tsaXN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2hlY2tsaXN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTgiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29uY2VwdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbmNlcHQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxOCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleGFtcGxlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXhhbXBsZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imd1aWRlbGluZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikd1aWRlbGluZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJldXNhYmxlQXNzZXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXVzYWJsZUFzc2V0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTgiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTgiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id2hpdGVwYXBlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldoaXRlcGFwZXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxOCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJKdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICZxdW90O0RldGFpbCBVc2UgQ2FzZSZxdW90OyB3b3VsZCBiZSBwZXJmb3JtZWQgZm9yIGV2ZXJ5IHVzZSBjYXNlIGlkZW50aWZpZWQgZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gb3IgQWN0aXZpdHkuICBHZW5lcmF0aW5nIGEgcGxhbiB3b3VsZCBsaXN0IG9uZSBUYXNrIGluc3RhbmNlIHBlciB1c2UgY2FzZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzT3B0aW9uYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkluZGljYXRlcyB0aGF0IHRoZSBCcmVha2Rvd24gRWxlbWVudCBkZXNjcmliZXMgd29yaywgYSB3b3JrIHJlc3VsdCwgb3IgZXZlbiB3b3JrIHJlc291cmNlcywgd2hpY2ggaW5jbHVzaW9uIGlzIG5vdCBtYW5kYXRvcnkgd2hlbiBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGlzIHBsYW5uZWQgYmFzZWQgb24gYSBwcm9jZXNzIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlzT3B0aW9uYWwiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNQbGFubmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlzUGxhbm5lZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVmaXgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gJnF1b3Q7U1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMmcXVvdDsgd2l0aCBTUkEgaW5kaWNhdGluZyB0aGF0IHRoaXMgQWN0aXZpdHkgYmVsb25ncyB0byB0aGUgJnF1b3Q7U29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzJnF1b3Q7IG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICZxdW90O0N1c3RvbWVyLkFyY2hpdGVjdCZxdW90OyB3b3VsZCBkZWZpbmUgYSAmcXVvdDtDdXN0b21lciZxdW90OyBwcmVmaXggZm9yIHRoZSBSb2xlIERlc2NyaXB0b3IgJnF1b3Q7QXJjaGl0ZWN0JnF1b3Q7IGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icHJlZml4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBCcmVha2Rvd24gRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNhZ2VHdWlkYW5jZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBpbmZvcm1hdGlvbiBhbmQgZ3VpZGFuY2Ugb24gdGhlIG1lYW5pbmcgb2YgdGhlIEJvb2xlYW4gZmxhZyB2YWx1ZXMgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyB0aGV5IHNob3VsZCBiZSBvdmVycmlkZGVuLiBGb3IgZXhhbXBsZSwgaXQgZGVzY3JpYmVzIHdoeSB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgb3B0aW9uYWwgb3IgY29uc2lkZXJhdGlvbnMgZm9yIHJlcGVhdGluZyBpdCBhbmQgZGlmZmVyZW5jZXMgaW4gdGhlIGluZGl2aWR1YWwgb2NjdXJyZW5jZXMgb2YgdGhpcyBCcmVha2Rvd24gRWxlbWVudCBhY3Jvc3MgdGhlIGxpZmVjeWNsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ1c2FnZUd1aWRhbmNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJuIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgUGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIERpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLiYjeEQ7JiN4QTtBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZTomI3hEOyYjeEE7LSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4mI3hEOyYjeEE7LSBUbyBzdXBwb3J0IGRpcmVjdCBleGVjdXRpb24gaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoYXQgZG9lcyBub3Qgd29yayBmb2xsb3dpbmcgYSB3ZWxsLWRlZmluZWQgcHJvY2VzcywgYnV0IHdvcmtzIGJhc2VkIG9uIGxvb3NlbHkgY29ubmVjdGVkIHByb2Nlc3MgZnJhZ21lbnRzIG9mIGJlc3QgcHJhY3RpY2VzIGluIGEgZmxleGlibGUgbWFubmVyIChlLmcuIEFnaWxlIERldmVsb3BtZW50KS4mI3hEOyYjeEE7LSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYXBhYmlsaXR5UGF0dGVybiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2hlY2tsaXN0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2hlY2tsaXN0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb21wb3NpdGVSb2xlIiBlU3VwZXJUeXBlcz0iIy8vUm9sZURlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLiYjeEQ7JiN4QTtBIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbXBvc2l0ZVJvbGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjMzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFnZ3JlZ2F0ZWRSb2xlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1JvbGUiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWdncmVnYXRlZFJvbGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25jZXB0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbmNlcHQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnN0cmFpbnQiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29uc3RyYWludCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN0b3JlcyB0aGUgbWFpbiBkZWZpbml0aW9uIG9mIHRoZSBjb25zdHJhaW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Im1haW5EZXNjcmlwdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250ZW50Q2F0ZWdvcnkiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RQYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBvbmx5IGNvbnRhaW5zIENvbnRlbnQgQ2F0ZWdvcnkgRWxlbWVudHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoxMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250ZW50Q2F0ZWdvcnkiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5IiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnRlbnRDYXRlZ29yeSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjEzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250ZW50RGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdG9yZXMgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFpbkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGFkdmlzZSBhbmQgZ3VpZGFuY2Ugb2YgYSBjcml0aWNhbCBuYXR1cmUgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbCBhcyB3YXJuaW5ncywgY2F1dGlvbnMsIHBpdGZhbGxzLCBkYW5nZXJzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJLZXlDb25zaWRlcmF0aW9ucyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWN0aW9uIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1NlY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2VjdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbElkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhcnRpZmFjdC4gVXNlZCBsaWtlIGEgc3lub255bS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJleHRlcm5hbElkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpYmFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4mI3hEOyYjeEE7Q29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250ZW50RWxlbWVudCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAxIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MTQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hlY2tsaXN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2hlY2tsaXN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29uY2VwdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbmNlcHQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleGFtcGxlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXhhbXBsZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imd1aWRlbGluZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikd1aWRlbGluZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJldXNhYmxlQXNzZXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXVzYWJsZUFzc2V0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id2hpdGVwYXBlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldoaXRlcGFwZXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiBlVHlwZT0iIy8vVmFyaWFiaWxpdHlUeXBlIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJuYSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InZhcmlhYmlsaXR5VHlwZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50UGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFBhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMgYW5kIENvbnRlbnQgRWxlbWVudHMsIG9ubHkuICBFeGFtcGxlcyBmb3IgQ29udGVudCBFbGVtZW50IGFyZSBBcnRpZmFjdHMsIFRhc2tzLCBSb2xlcywgZXRjLiAgQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnRlbnRQYWNrYWdlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoxMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250ZW50RWxlbWVudCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Db250ZW50RWxlbWVudCIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250ZW50RWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjEzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkN1c3RvbUNhdGVnb3J5IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgJnF1b3Q7VGVzdGluZyZxdW90OyBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3VzdG9tQ2F0ZWdvcnkiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhdGVnb3JpemVkRWxlbWVudCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhdGVnb3JpemVkRWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1YkNhdGVnb3J5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3ViQ2F0ZWdvcnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyYWJsZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWxpdmVyYWJsZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MzAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVsaXZlcmVkV29ya1Byb2R1Y3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWxpdmVyZWRXb3JrUHJvZHVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjMwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcmFibGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbERlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlcm5hbERlc2NyaXB0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhY2thZ2luZ0d1aWRhbmNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGd1aWRhbmNlIG9uIGhvdyB0byBhc3NlbWJsZSB0aGUgZGVsaXZlcmFibGUgZnJvbSBhbGwgaXRzIHJlcXVpcmVkIGlucHV0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgY29tbW9uIGNvbnRlbnQgbWVkaXVtIGFuZCBmb3JtYXQuICBEaXN0cmlidXRpb24gb2YgdGhlIGRlbGl2ZXJhYmxlIGlzIGFkZHJlc3NlZCBpbiB0aGlzIHNlY3Rpb24sIGlmIG5lY2Vzc2FyeS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGFja2FnaW5nR3VpZGFuY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuJiN4RDsmI3hBO0EgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVsaXZlcnlQcm9jZXNzIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDo0NyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb21tdW5pY2F0aW9uc01hdGVyaWFsIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29tbXVuaWNhdGlvbnNNYXRlcmlhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjQ3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVkdWNhdGlvbk1hdGVyaWFsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWR1Y2F0aW9uTWF0ZXJpYWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDo0NyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBnZW5lcmFsaXplZCBQcm9jZXNzIERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyeSBQcm9jZXNzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjYWxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik91dGxpbmVzIGNoYXJhY3RlcmlzdGljcyBhYm91dCB0aGUgc2l6ZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvamVjdCBleHByZXNzZWQgaW4gdGVhbSBzaXplLCBtYW4geWVhcnMsIGV0Yy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2NhbGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvamVjdENoYXJhY3RlcmlzdGljcyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2plY3RDaGFyYWN0ZXJpc3RpY3MiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmlza0xldmVsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJpc2tMZXZlbCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0aW5nVGVjaG5pcXVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgRXN0aW1hdGlvbiBUZWNobmlxdWVzIHByb3ZpZGVkIGZvciB0aGlzIFByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRpbmdUZWNobmlxdWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvamVjdE1lbWJlckV4cGVydGlzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvamVjdE1lbWJlckV4cGVydGlzZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlT2ZDb250cmFjdCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb0knbSBjaGFJJ20gbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZU9mQ29udHJhY3QiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgTWV0aG9kIEVsZW1lbnRzIGZvciB3aGljaCBleHRlcm5hbCBwcmVzZW50YXRpb24gbmFtZXMgYXMgd2VsbCBhcyBjb250ZW50IGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCwgc3VjaCBhcyBSb2xlcyBvciBXb3JrIFByb2R1Y3RzLiAgUHJlc2VudGF0aW9uIE5hbWUgYW5kIENvbnRlbnQgRGVzY3JpcHRpb25zIGFyZSB0eXBpY2FsbHkgbG9jYWxpemVkIHVzaW5nIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIGl0cyBTdHJpbmcgdHlwZSBhdHRyaWJ1dGVzLiYjeEQ7JiN4QTtUaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVzY3JpYmFibGVFbGVtZW50Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50YXRpb24iIGVUeXBlPSIjLy9Db250ZW50RGVzY3JpcHRpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlc2VudGF0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZ1bGZpbGwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGdWxmaWxsIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzQWJzdHJhY3QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlzQWJzdHJhY3QiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm9kZWljb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJub2RlaWNvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzaGFwZWljb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InNoYXBlaWNvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLiYjeEQ7JiN4QTtEZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZXNjcmlwdG9yIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlc2NyaXB0b3IuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZmluZWREZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWZpbmVkRGVzY3JpcHRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzY2lwbGluZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuJiN4RDsmI3hBO0EgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRpc2NpcGxpbmUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhc2siIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIgdm9sYXRpbGU9InRydWUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViRGlzY2lwbGluZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9EaXNjaXBsaW5lIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YkRpc2NpcGxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWZlcmVuY2VXb3JrZmxvdyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlZmVyZW5jZVdvcmtmbG93Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzY2lwbGluZUdyb3VwaW5nIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVc2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICZxdW90O1NvZnR3YXJlIERpc2NpcGxpbmVzJnF1b3Q7IHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQmcXVvdDsgb3IgJnF1b3Q7VGVzdGluZyZxdW90OzsgJnF1b3Q7SVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCZxdW90OyB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICZxdW90O0lUIE9wZXJhdGlvbmFsIFNlcnZpY2VzJnF1b3Q7LCAmcXVvdDtJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzJnF1b3Q7LCBvciAmcXVvdDtJVCBFbmFibGluZyBTZXJ2aWNlcyZxdW90Oy4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRpc2NpcGxpbmVHcm91cGluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGlzY2lwbGluZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRpc2NpcGxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEb2N1bWVudFJvb3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJtaXhlZCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaXhlZCIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRXaWxkY2FyZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSI6bWl4ZWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ieE1MTlNQcmVmaXhNYXAiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ieG1sbnM6cHJlZml4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InhTSVNjaGVtYUxvY2F0aW9uIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InhzaTpzY2hlbWFMb2NhdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RDb25maWd1cmF0aW9uIiB1cHBlckJvdW5kPSItMiIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZExpYnJhcnkiIHVwcGVyQm91bmQ9Ii0yIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kTGlicmFyeSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RMaWJyYXJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGx1Z2luIiB1cHBlckJvdW5kPSItMiIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBNZXRob2QgVW5pdCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuJiN4RDsmI3hBO01ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLiYjeEQ7JiN4QTtTcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RQbHVnaW4iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEb21haW4iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmaW5lYWJsZSBoaWVyYXJjaHkgZ3JvdXBpbmcgcmVsYXRlZCB3b3JrIHByb2R1Y3RzLiAgSW4gb3RoZXIgd29yZHMsIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyB0byBiZSBjYXRlZ29yaXplZCBvbmx5IGF0IHRoZSBsZWFmLWxldmVsIG9mIHRoaXMgaGllcmFyY2h5LiYjeEQ7JiN4QTtEb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRG9tYWluIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrUHJvZHVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtQcm9kdWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViZG9tYWluIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0RvbWFpbiIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJkb21haW4iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWxlbWVudCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZW1wdHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXN0aW1hdGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgc2l6aW5nIG1lYXN1cmVzLCBvciBzdGFuZGFyZHMgZm9yIHNpemluZyB0aGUgd29yayBlZmZvcnQgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgYSBwYXJ0aWN1bGFyIHBpZWNlIG9mIHdvcmsgYW5kIGluc3RydWN0aW9ucyBmb3IgdGhlaXIgc3VjY2Vzc2Z1bCB1c2UuIEl0IG1heSBiZSBjb21wcmlzZWQgb2YgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9ucyBhbmQgZXN0aW1hdGlvbiBtZXRyaWNzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRpb25NZXRyaWMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFc3RpbWF0aW9uTWV0cmljIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXN0aW1hdGluZ01ldHJpYyIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBkZXNjcmliZXMgYSBtZXRyaWMgb3IgbWVhc3VyZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IGFuZCB3aGljaCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgd29yayBlZmZvcnQgYXMgd2VsbCBhcyBhIHJhbmdlIG9mIHBvdGVudGlhbCBsYWJvci4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRpbmdNZXRyaWMiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBxdWFsaWZpZXMgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXhhbXBsZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4YW1wbGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRhbmNlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iR3VpZGFuY2UiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRhbmNlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgR3VpZGFuY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHdWlkYW5jZURlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdHRhY2htZW50IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXR0YWNobWVudCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkZWxpbmUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikd1aWRlbGluZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSXRlcmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4mI3hEOyYjeEE7SXRlcmF0aW9uIGdyb3VwcyBhIHNldCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEl0IHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbiByZXBldGl0aXZlIGN5Y2xlcy4gIFRoZSBjb25jZXB0IG9mIEl0ZXJhdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCBydWxlcyBpbiBkaWZmZXJlbnQgbWV0aG9kcy4gIEZvciBleGFtcGxlLCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBtZXRob2QgZnJhbWV3b3JrIChSVVApIGRlZmluZXMgYSBydWxlIHRoYXQgSXRlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gc3BhbiBhY3Jvc3MgUGhhc2VzLiAgSW4gY29udHJhc3QgSUJNIEdsb2JhbCBTZXJ2aWNlcyBNZXRob2QgKEdTTWV0aG9kKSBiYXNlZCBtZXRob2QgZnJhbWV3b3JrcyB0aGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgYW5kIEl0ZXJhdGlvbiBjYW4gYmUgZGVmaW5lZCB3aGljaCBuZXN0IFBoYXNlcy4gIFJ1bGVzIGxpa2UgdGhlc2UsIHdoaWNoIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGVuZm9yY2VkIGJ5IHRoaXMgbWV0YS1tb2RlbC4gIEluc3RlYWQsIHByb2Nlc3MgYXV0aG9ycyBhcmUgZXhwZWN0ZWQgdG8gZm9sbG93IGFuZCBjaGVjayB0aGVzZSBydWxlcyBtYW51YWxseS4gIChOb3RlOiBBbnkgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGJlIHJlcGVhdGVkOyBob3dldmVyLCBJdGVyYXRpb25zIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYSBzcGVjaWFsIG1ldGEtbW9kZWwgY29uY2VwdCwgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW50IHJvbGUgZm9yIG1hbnkgbWV0aG9kcy4pIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJdGVyYXRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IktpbmQiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJLaW5kIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJhc2VDb25maWd1cmF0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZUNvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWV0aG9kUGx1Z2luU2VsZWN0aW9uIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kUGx1Z2luU2VsZWN0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RQYWNrYWdlU2VsZWN0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRWaWV3IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0VmlldyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9jZXNzVmlldyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2Nlc3NWaWV3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1YnRyYWN0ZWRDYXRlZ29yeSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YnRyYWN0ZWRDYXRlZ29yeSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZGRlZENhdGVnb3J5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWRkZWRDYXRlZ29yeSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBEZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kRWxlbWVudCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAiIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im93bmVkUnVsZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Db25zdHJhaW50IiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgcGFja2FnaW5nIHJ1bGVzIGZvciB0aGlzIE1ldGhvZCBFbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPd25lZFJ1bGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RFbGVtZW50UHJvcGVydHkiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiCi0gICAgICAgIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kRWxlbWVudFByb3BlcnR5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iYnJpZWZEZXNjcmlwdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9yZGVyaW5nR3VpZGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVXNlZCBmb3IgQ0FTRSB0b29sIHJlYWxpemF0aW9ucyBvZiB0aGlzIG1vZGVsIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgbGF5b3V0IGFuZCBvcmRlcmluZyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgYW5kIGl0cyBwYXJ0cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJvcmRlcmluZ0d1aWRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZXNlbnRhdGlvbk5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgRGVzY3JpYmFibGUgRWxlbWVudCBoYXMgYSBwcmVzZW50YXRpb24gbmFtZSwgd2hpY2ggaXMgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIG5hbWUgKHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbikgbWlnaHQgYmUgc2V0IHRvICZxdW90O3J1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQmcXVvdDsgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgJnF1b3Q7ajJlZV9hcmNoaXRjdHVyZV9kb2N1bWVudCZxdW90OyB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICZxdW90O0FyY2hpdGVjdHVyZSBEb2N1bWVudCZxdW90Oy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJwcmVzZW50YXRpb25OYW1lIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cHByZXNzZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSAmcXVvdDtleHRlbmRzJnF1b3Q7IFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uLCB0aGVuIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGluaGVyaXRlZCBNZXRob2QgRWxlbWVudHMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQsIHdoaWNoIGNhbiBiZSBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvbiBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdGhhbiBhbiBpbmhlcml0ZWQgbWV0aG9kIGVsZW1lbnQgdGhlbiBpdCB3aWxsIG5vdCBiZSByZWdhcmRlZCBhcyBpbmhlcml0ZWQgYXQgYWxsLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InN1cHByZXNzZWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kRWxlbWVudFByb3BlcnR5IiBlU3VwZXJUeXBlcz0iIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZW1wdHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idmFsdWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kTGlicmFyeSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kTGlicmFyeSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGx1Z2luIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RQbHVnaW4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kQ29uZmlndXJhdGlvbiIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idG9vbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdG9vbCB0aGF0IGdlbmVyYXRlZCB0aGUgWE1MIGZpbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idG9vbCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZFBhY2thZ2UiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmV1c2VkUGFja2FnZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJldXNlZFBhY2thZ2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDo5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBhY2thZ2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RQYWNrYWdlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6OSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnbG9iYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ2xvYmFsIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFBsdWdpbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBNZXRob2QgVW5pdCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuJiN4RDsmI3hBO01ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLiYjeEQ7JiN4QTtTcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kUGx1Z2luIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWZlcmVuY2VkTWV0aG9kUGx1Z2luIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVmZXJlbmNlZE1ldGhvZFBsdWdpbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQYWNrYWdlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kUGFja2FnZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2VyQ2hhbmdlYWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idXNlckNoYW5nZWFibGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kVW5pdCIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZFVuaXQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvcHlyaWdodCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29weXJpZ2h0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dGhvcnMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImF1dGhvcnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhbmdlRGF0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iY2hhbmdlRGF0ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iY2hhbmdlRGVzY3JpcHRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyc2lvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ2ZXJzaW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1pbGVzdG9uZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBkZXNjcmliZXMgYSBzaWduaWZpY2FudCBldmVudCBpbiBhIGRldmVsb3BtZW50IHByb2plY3QsIHN1Y2ggYXMgYSBtYWpvciBkZWNpc2lvbiwgY29tcGxldGlvbiBvZiBhIGRlbGl2ZXJhYmxlLCBvciBtZWV0aW5nIG9mIGEgbWFqb3IgZGVwZW5kZW5jeSAobGlrZSBjb21wbGV0aW9uIG9mIGEgcHJvamVjdCBwaGFzZSkuICBCZWNhdXNlLCBNaWxlc3RvbmUgaXMgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byBib3RoIHRoZSBldmVudCBpdHNlbGYgYW5kIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRoZSBldmVudCBpcyBzY2hlZHVsZWQgdG8gaGFwcGVuLCBpdCBpcyBtb2RlbGVkIGFzIGEgQnJlYWtkb3duIEVsZW1lbnQgKGkuZS4gaXQgYXBwZWFycyBhcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZSkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNaWxlc3RvbmUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlcXVpcmVkUmVzdWx0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVxdWlyZWRSZXN1bHQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZWRFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWVkRWxlbWVudCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZW1wdHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJuYW1lIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGNvbWUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBXb3JrIFByb2R1Y3QgdGhhdCBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0Y29tZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vTmFtZWRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQYWNrYWdlYWJsZUVsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVtcHR5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBoYXNlIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4mI3hEOyYjeEE7UGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaGFzZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGxhbm5pbmdEYXRhIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLiYjeEQ7JiN4QTtQbGFubmluZyBEYXRhIGZhY3RvcnMgb3V0IHNwZWNpZmljIG9wdGlvbmFsIGRhdGEgbmVlZGVkIGZvciByZXByZXNlbnRpbmcgcGxhbm5pbmcgdGVtcGxhdGVzLiAgVGhpcyBhc3NvY2lhdGlvbiBhbGxvd3MgdG8gYWNjZXNzIHBsYW5uaW5nIGRhdGEgaWYgaXQgaXMgc3RvcmVkIGZvciB0aGUgQnJlYWtkb3duIEVsZW1lbnQuJiN4RDsmI3hBOyhOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQbGFubmluZ0RhdGEiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaERhdGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJmaW5pc2hEYXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhbmsiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJyYW5rIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0RGF0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ic3RhcnREYXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByYWN0aWNlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAmcXVvdDtNYW5hZ2UgUmlza3MmcXVvdDssICZxdW90O0NvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSZxdW90OywgJnF1b3Q7QXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCZxdW90OywgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJhY3RpY2UiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2aXR5UmVmZXJlbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0aXZpdHlSZWZlcmVuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb250ZW50UmVmZXJlbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGVudFJlZmVyZW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlByYWN0aWNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1ByYWN0aWNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YlByYWN0aWNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcmFjdGljZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByYWN0aWNlRGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFkZGl0aW9uYWxJbmZvIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBZGRpdGlvbmFsSW5mbyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhcHBsaWNhdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXBwbGljYXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmFja2dyb3VuZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhY2tncm91bmQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ29hbHMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkdvYWxzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsc09mQWRvcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxzT2ZBZG9wdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9ibGVtIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvYmxlbSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4mI3hEOyYjeEE7Q29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvY2VzcyIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5jbHVkZXNQYXR0ZXJuIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW5jbHVkZXNQYXR0ZXJuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRDb250ZXh0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0Q29udGV4dCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWxpZENvbnRleHQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWxpZENvbnRleHQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGlhZ3JhbVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgVVJJIG9mIHRoZSBkaWFncmFtIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImRpYWdyYW1VUkkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NQYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuJiN4RDsmI3hBO1VNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAmcXVvdDtibGFjayBib3gmcXVvdDsuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICZxdW90O3JlYWxpemF0aW9uJnF1b3Q7IGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2Nlc3NDb21wb25lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvcHlyaWdodCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29weXJpZ2h0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZSIgZVR5cGU9IiMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW50ZXJmYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3MiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9jZXNzIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2Nlc3MiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0aG9ycyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iYXV0aG9ycyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEYXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJjaGFuZ2VEYXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJjaGFuZ2VEZXNjcmlwdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InZlcnNpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDozMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VTcGVjaWZpY2F0aW9uIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIgotICAgICAgICBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkludGVyZmFjZVNwZWNpZmljYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VJTyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW50ZXJmYWNlSU8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIEFjdGl2aXR5IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcm9jZXNzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY29wZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2NvcGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNhZ2VOb3RlcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVc2FnZU5vdGVzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpYmFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLiYjeEQ7JiN4QTtQcm9jZXNzIEVsZW1lbnRzIHJlcHJlc2VudHMgUHJvY2VzcyBzcGVjaWZpYyBlbGVtZW50cyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQgZnJvbSBDb250ZW50IEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9jZXNzRWxlbWVudCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RQYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LiYjeEQ7JiN4QTtBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvY2Vzc1BhY2thZ2UiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjEzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3NFbGVtZW50IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1Byb2Nlc3NFbGVtZW50IiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2Nlc3NFbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4mI3hEOyYjeEE7QSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgZmluaXNoZWQgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgSXQgdXNlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFzIGFsbCBvdGhlciBQcm9jZXNzIFR5cGVzIHRvIHJlcHJlc2VudCB0ZW1wbGF0ZXMgZm9yIHByb2plY3QgcGxhbnMuICBIb3dldmVyLCBjZXJ0YWluIHBsYW5uaW5nIGRlY2lzaW9ucyBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kL29yIHJlZm9ybWF0dGVkIHRvIGJlIHJlYWR5IGZvciBleHBvcnQgdG8gYSBzcGVjaWZpYyBwbGFubmluZyB0b29sLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZGVjaXNpb25zIGFyZTogYSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJlcHJlc2VudCBhIHBsYW4gZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gaW4gYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IHByb2plY3QsIHdoaWNoIGZyIGV4YW1wbGUgZGlzdGluZ3Vpc2hlcyBlYXJseSBmcm9tIGxhdGUgaXRlcmF0aW9ucyBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2Ugb2YgYSBwcm9qZWN0OyBpZiB0aGUgdGFyZ2V0ZWQgcGxhbm5pbmcgdG9vbCBjYW5ub3QgcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgb2YgVGFzaywgdGhlbiB0aGVzZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmU7IGNlcnRhaW4gcmVwZXRpdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCwgZS5nLiBzdGF0aW5nIHRoYXQgYSBjeWNsZSBvZiBzcGVjaWZpYyBUYXNrIGdyb3VwZWQgaW4gYW4gQWN0aXZpdHkgaGF2ZSB0byBiZSByZXBlYXRlZCBuLXRpbWVzOyBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXA0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6NDciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmFzZVByb2Nlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlUHJvY2VzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjQ3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlcG9ydCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGludG8gYSByZXBvcnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXBvcnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJldXNhYmxlQXNzZXQiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZyYjeEQ7JiN4QTtob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmV1c2FibGVBc3NldCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9hZG1hcCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2Ugd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4mI3hEOyYjeEE7QW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUm9hZG1hcCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAmI3hEOyYjeEE7QSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBhIHNldCBvZiBpbmRpdmlkdWFscy4gIFJvbGVzIGFyZSBub3QgaW5kaXZpZHVhbHMgb3IgcmVzb3VyY2VzLiAgSW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gd2lsbCB3ZWFyIGRpZmZlcmVudCBoYXRzLCBvciBwZXJmb3JtIGRpZmZlcmVudCByb2xlcy4gVGhlIG1hcHBpbmcgZnJvbSBpbmRpdmlkdWFsIHRvIHJvbGUsIHBlcmZvcm1lZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYW5kIHN0YWZmaW5nIGZvciBhIHByb2plY3QsIGFsbG93cyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgdG8gYWN0IGFzIHNldmVyYWwgZGlmZmVyZW50IHJvbGVzLCBhbmQgZm9yIGEgcm9sZSB0byBiZSBwbGF5ZWQgYnkgc2V2ZXJhbCBpbmRpdmlkdWFscy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3BvbnNpYmxlRm9yIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzcG9uc2libGVGb3IiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUm9sZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGVEZXNjcmlwdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXNzaWdubWVudEFwcHJvYWNoZXMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgZ3VpZGFuY2Ugb24gZm9yIGFzc2lnbmluZyBpbmRpdmlkdWFscyB0byB0aGUgUm9sZSBpbiB0ZXJtcyBvZiB3aGF0IG90aGVyIHJvbGVzIHRoZXNlIGluZGl2aWR1YWxzIGNvdWxkIHBlcmZvcm0gYW5kIHdoYXQgcmVzcG9uc2liaWxpdHkgZGlmZmVyZW50IGluZGl2aWR1YWxzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZSBtaWdodCBoYXZlLiAgVGhlIGd1aWRhbmNlIGNhbiBhbHNvIGRlc2NyaWJlIGRpZmZlcmVudCBhc3NpZ25tZW50IGFwcHJvYWNoZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cywgZS5nLiBmb3IgbGFyZ2UgdmVyc3VzIHNtYWxsIHRlYW1zIHdoZXJlIGluZGl2aWR1YWxzIGNvdWxkIGJlIGFsbG9jYXRlZCB0byByb2xlcyBmdWxsIHRpbWUgdmVyc3VzIHNoYXJpbmcgcm9sZXMgd2l0aGluIHRoZSB0ZWFtLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBc3NpZ25tZW50QXBwcm9hY2hlcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJza2lsbHMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTGlzdHMgb2Ygc2V0IG9mIHJlcXVpcmVkIHNraWxscyBhIHBlcnNvbiBuZWVkcyB0byBwb3NzZXNzIHRvIGZ1bGZpbGwgdGhhdCBSb2xlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTa2lsbHMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3lub255bXMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTGlzdHMgc3lub255bXMsIGkuZS4gb3RoZXIgbmFtZXMgdGhlIFJvbGUgbWlnaHQgYmUgcmVmZXJyZWQgYnkuICBUb29sIHN1cHBvcnQgZm9yIHRoZSBtZXRhLW1vZGVsIG1pZ2h0IHN1cHBvcnQgdGhhdCBhIFJvbGUgbmFtZSBjYW4gYmUgY29uc2lzdGVudGx5IGJlIHJlcGxhY2VkIHdpdGggb25lIG9mIGl0cyBzeW5vbnltcyB0aHJvdWdodCBhIFByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN5bm9ueW1zIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgUm9sZSBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgUm9sZSBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xlRGVzY3JpcHRvciIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm9sZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUm9sZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3BvbnNpYmxlRm9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVTZXQiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICZxdW90O0FuYWx5c3RzJnF1b3Q7IFJvbGUgU2V0IGNvdWxkIGdyb3VwIHRoZSAmcXVvdDtCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QmcXVvdDssICZxdW90O1N5c3RlbSBBbmFseXN0JnF1b3Q7LCBhcyB3ZWxsIGFzICZxdW90O1JlcXVpcmVtZW50cyBTcGVjaWZpZXImcXVvdDsgcm9sZXMuICBBbGwgb2YgdGhlc2Ugd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQgaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBhcmUgcmVxdWlyZWQgYXMgZGlzdGluY3Qgcm9sZXMgZm9yIGEgbWV0aG9kIChlLmcuIHRoZSBtZXRob2QgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgaXMgYmFzZWQgb24pLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUm9sZVNldCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm9sZSIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIiB2b2xhdGlsZT0idHJ1ZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlU2V0R3JvdXBpbmciIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGVTZXRHcm91cGluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm9sZVNldCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGVTZXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZWN0aW9uIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTZWN0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJTZWN0aW9uIiBlVHlwZT0iIy8vU2VjdGlvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJTZWN0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWRlY2Vzc29yIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVkZWNlc3NvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlY3Rpb25OYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJzZWN0aW9uTmFtZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiBlVHlwZT0iIy8vVmFyaWFiaWxpdHlUeXBlIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJuYSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InZhcmlhYmlsaXR5VHlwZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29udGVudCBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdvcmsgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgSXQgZGVmaW5lcyBvbmUgZGVmYXVsdCBwZXJmb3JtaW5nIFJvbGUgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwgcGVyZm9ybWVycy4gIEEgVGFzayBpcyBhc3NvY2lhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gIElucHV0cyBhcmUgZGlmZmVyZW50aWF0ZWQgaW4gbWFuZGF0b3J5IHZlcnN1cyBvcHRpb25hbCBpbnB1dHMuICBUaGUgYXNzb2NpYXRpb25zIHRvIFdvcmsgUHJvZHVjdHMgYXJlIG5vdCBpbnN0YW50aWF0YWJsZS92YXJpYWJsZS1saWtlIHBhcmFtZXRlcnMuICBUaGV5IHJhdGhlciBleHByZXNzIChoeXBlci0pbGlua3MgdG8gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgd29yayBwcm9kdWN0cyB0eXBlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBUYXNrIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNhcHR1cmUgd2hpY2ggY29uY3JldGUgaW5zdGFuY2VzIHdpbGwgYmUgcGFzc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgbWV0aG9kIGluIGEgcHJvamVjdC4gIEFsbCBvZiB0aGUgVGFzaydzIGRlZmF1bHQgYXNzb2NpYXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGFjdHVhbCBwcm9jZXNzIGRlZmluaXRpb24uJiN4RDsmI3hBO0EgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuICYjeEQ7JiN4QTtBIFRhc2sgaGFzIGEgY2xlYXIgcHVycG9zZSBpbiB3aGljaCB0aGUgcGVyZm9ybWluZyByb2xlcyBhY2hpZXZlIGEgd2VsbCBkZWZpbmVkIGdvYWwuICBJdCBwcm92aWRlcyBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIG9mIGRvaW5nIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuICBUaGlzIGRlc2NyaXB0aW9uIGlzIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBvZiB3aGVuIGluIGEgcHJvY2VzcyBsaWZlY3ljbGUgdGhlIHdvcmsgd291bGQgYWN0dWFsbHkgYmUgZG9uZS4gIEl0IHRoZXJlZm9yZSBkb2VzIG5vdCBkZXNjcmliZSB3aGVuIHlvdSBkbyB3aGF0IHdvcmsgYXQgd2hhdCBwb2ludCBvZiB0aW1lLCBidXQgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IGdldHMgZG9uZSB0aHJvdWdob3V0IHRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgdGhhdCBjb250cmlidXRlcyB0byB0aGUgYWNoaWV2ZW1lbnQgb2YgdGhpcyBnb2FsLiAgV2hlbiB0aGUgVGFzayBpcyBiZWluZyBhcHBsaWVkIGluIGEgcHJvY2VzcyB0aGVuIHRoaXMgcHJvY2VzcyBhcHBsaWNhdGlvbiAoZGVmaW5lZCBhcyBUYXNrIERlc2NyaXB0b3IpIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvZiB3aGljaCBwaWVjZXMgb2YgdGhlIFRhc2sgd2lsbCBhY3R1YWxseSBiZSBwZXJmb3JtZWQgYXQgYW55IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFRhc2sgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIHByb2Nlc3Mgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgYnV0IGVhY2ggdGltZSB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVtcGhhc2lzIG9uIGRpZmZlcmVudCBzdGVwcyBvciBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0aW9uLiAmI3hEOyYjeEE7Rm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICZxdW90O0RldmVsb3AgVXNlIENhc2UgTW9kZWwmcXVvdDsgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gZGV2ZWxvcCBhIGNvbXBsZXRlIHVzZSBjYXNlIG1vZGVsLiBUaGlzIHdvdWxkIGNvbXByaXNlIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBhbmQgbmFtaW5nIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLCB0aGUgd3JpdGluZyBvZiBhIGJyaWVmIGRlc2NyaXB0aW9uLCB0aGUgbW9kZWxpbmcgb2YgdXNlIGNhc2VzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIGluIGRpYWdyYW1zLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYSBiYXNpYyBmbG93LCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYWx0ZXJuYXRpdmVzIGZsb3dzLCBwZXJmb3JtaW5nIG9mIHdhbGt0aHJvdWdocyB3b3Jrc2hvcHMgYW5kIHJldmlld3MsIGV0Yy4gIEFsbCBvZiB0aGVzZSBwYXJ0cyBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBnb2FsIG9mIGRldmVsb3BpbmcgdGhlIHVzZSBjYXNlIG1vZGVsLCBidXQgdGhlIHBhcnRzIHdpbGwgYmUgcGVyZm9ybWVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSBpbiBhIHByb2Nlc3MuICBJZGVudGlmaWNhdGlvbiwgbmFtaW5nLCBhbmQgYnJpZWYgZGVzY3JpcHRpb25zIHdvdWxkIGJlIHBlcmZvcm1lZCBlYXJseSBpbiBhIHR5cGljYWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyB2ZXJzdXMgdGhlIHdyaXRpbmcgb2YgZGV0YWlsZWQgYWx0ZXJuYXRpdmUgZmxvd3Mgd2hpY2ggd291bGQgYmUgcGVyZm9ybWVkIG11Y2ggbGF0ZXIuICBBbGwgdGhlc2UgcGFydHMgb3Igc3RlcHMgd2l0aGluIHRoZSBzYW1lIFRhc2sgZGVmaW5lIHRoZSAmcXVvdDttZXRob2QmcXVvdDsgb2YgRGV2ZWxvcGluZyBhIFVzZSBDYXNlIE1vZGVsLiAgQXBwbHlpbmcgc3VjaCBhIG1ldGhvZCBpbiBhIGxpZmVjeWNsZSAoaS5lLiBpbiBhIHByb2Nlc3MpIGlzIGRlZmluaW5nIHdoaWNoIHN0ZXBzIGFyZSBkb25lIHdoZW4gZ29pbmcgZnJvbSBvbmUgaXRlcmF0aW9uIHRvIHRoZSBuZXh0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFzayIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlY29uZGl0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVjb25kaXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icG9zdGNvbmRpdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUG9zdGNvbmRpdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZXJmb3JtZWRCeSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdXRwdXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRwdXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik9wdGlvbmFsSW5wdXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idG9vbE1lbnRvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvb2xNZW50b3IiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgVGFzay4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tEZXNjcmlwdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWx0ZXJuYXRpdmVzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWx0ZXJuYXRpdmVzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1cnBvc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQdXJwb3NlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2tEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuJiN4RDsmI3hBO0Ega2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tEZXNjcmlwdG9yIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXNrIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBlcmZvcm1lZFByaW1hcmlseUJ5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZXJmb3JtZWRQcmltYXJpbHlCeSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDozNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXNzaXN0ZWRCeSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFzc2lzdGVkQnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbElucHV0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZXJuYWxJbnB1dCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjM3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcHRpb25hbElucHV0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3B0aW9uYWxJbnB1dCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjM3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im91dHB1dCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dHB1dCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjM3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN0ZXAiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGVwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlYW1Qcm9maWxlIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLiYjeEQ7JiN4QTtXb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuJiN4RDsmI3hBO0hlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRlYW1Qcm9maWxlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDozMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb2xlIiB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciIHZvbGF0aWxlPSJ0cnVlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUm9sZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjMwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cGVyVGVhbSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1cGVyVGVhbSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjMwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1YlRlYW0iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJUZWFtIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVtcGxhdGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUZW1wbGF0ZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVybURlZmluaXRpb24iIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgZGVmaW5lcyBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUZXJtRGVmaW5pdGlvbnMgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIENvbnRlbnRFbGVtZW50cywgYnV0IHRoZWlyIHJlbGF0aW9uc2hpcCBpcyBiZWluZyBkZXJpdmVkIHdoZW4gdGhlIFRlcm0gaXMgdXNlZCBpbiB0aGUgQ29udGVudEVsZW1lbnRzIGRlc2NyaXB0aW9uIHRleHQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUZXJtRGVmaW5pdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVG9vbCIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvb2wiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvb2xNZW50b3IiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUb29sTWVudG9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVG9vbE1lbnRvciIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBICBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVG9vbE1lbnRvciIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhcmlhYmlsaXR5VHlwZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibmEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImNvbnRyaWJ1dGVzIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZXh0ZW5kcyIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InJlcGxhY2VzIiB2YWx1ZT0iMyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibG9jYWxDb250cmlidXRpb24iIHZhbHVlPSI0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJsb2NhbFJlcGxhY2VtZW50IiB2YWx1ZT0iNSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZXh0ZW5kc1JlcGxhY2VzIiB2YWx1ZT0iNiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJWYXJpYWJpbGl0eVR5cGVPYmplY3QiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYXJpYWJpbGl0eVR5cGU6T2JqZWN0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iVmFyaWFiaWxpdHlUeXBlIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldoaXRlcGFwZXIiIGVTdXBlclR5cGVzPSIjLy9Db25jZXB0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgQ29uY2VwdCBndWlkYW5jZSB0aGF0IGhhdmUgYmVlbiBleHRlcm5hbGx5IHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2hpdGVwYXBlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjMwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlY2Vzc29yIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtPcmRlciIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVkZWNlc3NvciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjMwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzRXZlbnREcml2ZW4iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iaXNFdmVudERyaXZlbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09uZ29pbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlzT25nb2luZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1JlcGVhdGFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlzUmVwZWF0YWJsZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrRGVmaW5pdGlvbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuJiN4RDsmI3hBO1dvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtEZWZpbml0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVjb25kaXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWNvbmRpdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwb3N0Y29uZGl0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQb3N0Y29uZGl0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtPcmRlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgJiN4RDsmI3hBO1RoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrT3JkZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9InNpbXBsZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IjowIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9InNpbXBsZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIGEgZ2xvYmFsIHVuaXF1ZSBpZCBmb3IgYSB3b3JrIG9yZGVyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxpbmtUeXBlIiBlVHlwZT0iIy8vV29ya09yZGVyVHlwZSIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmluaXNoVG9TdGFydCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImxpbmtUeXBlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtPcmRlclR5cGUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZpbmlzaFRvU3RhcnQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZpbmlzaFRvRmluaXNoIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ic3RhcnRUb1N0YXJ0IiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ic3RhcnRUb0ZpbmlzaCIgdmFsdWU9IjMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iV29ya09yZGVyVHlwZU9iamVjdCIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtPcmRlclR5cGU6T2JqZWN0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iV29ya09yZGVyVHlwZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdCIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4mI3hEOyYjeEE7QSB3b3JrIHByb2R1Y3QgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBhIHRhc2suIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrUHJvZHVjdCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFc3RpbWF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlcG9ydCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlcG9ydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRlbXBsYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGVtcGxhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0b29sTWVudG9yIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVG9vbE1lbnRvciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgV29yayBQcm9kdWN0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1Byb2R1Y3REZXNjcmlwdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW1wYWN0T2ZOb3RIYXZpbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW1wYWN0T2ZOb3RIYXZpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQdXJwb3NlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlYXNvbnNGb3JOb3ROZWVkaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWFzb25zRm9yTm90TmVlZGluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya1Byb2R1Y3QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtQcm9kdWN0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzcG9uc2libGVSb2xlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjMzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsSW5wdXRUbyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVybmFsSW5wdXRUbyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjMzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcGFjdGVkQnkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbXBhY3RlZEJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW1wYWN0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkltcGFjdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYW5kYXRvcnlJbnB1dFRvIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFuZGF0b3J5SW5wdXRUbyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjMzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9wdGlvbmFsSW5wdXRUbyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik9wdGlvbmFsSW5wdXRUbyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjMzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im91dHB1dEZyb20iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRwdXRGcm9tIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVsaXZlcmFibGVQYXJ0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlbGl2ZXJhYmxlUGFydHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3Rpdml0eUVudHJ5U3RhdGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gICYjeEQ7JiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iYWN0aXZpdHlFbnRyeVN0YXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLiYjeEQ7JiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iYWN0aXZpdHlFeGl0U3RhdGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgJnF1b3Q7Q2xhc3MgRGlhZ3JhbSZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICZxdW90O1NwZWNpZmljYXRpb24mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrUHJvZHVjdFR5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtQcm9kdWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1Byb2R1Y3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvVU1BLmdlbm1vZGVsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL1VNQS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJhZmUyZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvVU1BLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsNDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEiIHRlbXBsYXRlRGlyZWN0b3J5PSIiIG1vZGVsTmFtZT0iVU1BIiBlZGl0UGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmVkaXQuVU1BRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuZWRpdG9yLlVNQUVkaXRvclBsdWdpbiIgcm9vdEV4dGVuZHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3QiCi0gICAgcm9vdEV4dGVuZHNDbGFzcz0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5pbXBsLkVEYXRhT2JqZWN0SW1wbCIgcm9vdEltcGxlbWVudHNJbnRlcmZhY2U9IiIKLSAgICB0ZXN0U3VpdGVDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEudGVzdHMuVU1BQWxsVGVzdHMiIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLnhzZC5lY29yZS5pbXBvcnRlciIKLSAgICBjb21wbGlhbmNlTGV2ZWw9IjUuMCI+Ci0gIDxmb3JlaWduTW9kZWw+RVBGX1NjaGVtYV8yMDA4MDEyNzA5NDIueHNkPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IlVtYSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmVwZi54bWwiIHJlc291cmNlPSJYTUwiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBlY29yZVBhY2thZ2U9IlVNQS5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iVU1BLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL25hIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9jb250cmlidXRlcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJVTUEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvZXh0ZW5kcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJVTUEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvcmVwbGFjZXMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2xvY2FsQ29udHJpYnV0aW9uIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9sb2NhbFJlcGxhY2VtZW50Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9leHRlbmRzUmVwbGFjZXMiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJVTUEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vV29ya09yZGVyVHlwZS9maW5pc2hUb1N0YXJ0Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1dvcmtPcmRlclR5cGUvZmluaXNoVG9GaW5pc2giLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvU3RhcnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvRmluaXNoIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IlVNQS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZU9iamVjdCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iVU1BLmVjb3JlIy8vV29ya09yZGVyVHlwZU9iamVjdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0FjdGl2aXR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS9wcmVjb25kaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS9wb3N0Y29uZGl0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5L2dyb3VwMyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS9icmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQWN0aXZpdHkvcm9hZG1hcCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5L2lzRW5hY3RhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQWN0aXZpdHkvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5L3ZhcmlhYmlsaXR5VHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL2FsdGVybmF0aXZlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24vaG93VG9TdGFmZiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQXBwbGljYWJsZU1ldGFDbGFzc0luZm8vaXNQcmltYXJ5RXh0ZW5zaW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0FydGlmYWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQXJ0aWZhY3QvZ3JvdXAzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0FydGlmYWN0L2NvbnRhaW5lZEFydGlmYWN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vYnJpZWZPdXRsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9yZXByZXNlbnRhdGlvbk9wdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL3JlcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9ub3RhdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZXNlbnRlZEFmdGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVzZW50ZWRCZWZvcmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3BsYW5uaW5nRGF0YSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvc3VwZXJBY3Rpdml0eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2dyb3VwMSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvY2hlY2tsaXN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9jb25jZXB0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9leGFtcGxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9ndWlkZWxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3JldXNhYmxlQXNzZXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvd2hpdGVwYXBlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaXNPcHRpb25hbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaXNQbGFubmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVmaXgiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24vdXNhZ2VHdWlkYW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9DYXBhYmlsaXR5UGF0dGVybiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0NoZWNrbGlzdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0NvbXBvc2l0ZVJvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db21wb3NpdGVSb2xlL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Db21wb3NpdGVSb2xlL2FnZ3JlZ2F0ZWRSb2xlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0NvbmNlcHQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Db25zdHJhaW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db25zdHJhaW50L21haW5EZXNjcmlwdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Db250ZW50Q2F0ZWdvcnlQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudENhdGVnb3J5UGFja2FnZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vQ29udGVudENhdGVnb3J5UGFja2FnZS9jb250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vbWFpbkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL2tleUNvbnNpZGVyYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9zZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL2V4dGVybmFsSWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9ncm91cDEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9jaGVja2xpc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9jb25jZXB0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvZXhhbXBsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2d1aWRlbGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L3JldXNhYmxlQXNzZXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9zdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RWxlbWVudC93aGl0ZXBhcGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L3ZhcmlhYmlsaXR5VHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Db250ZW50UGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0NvbnRlbnRQYWNrYWdlL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Db250ZW50UGFja2FnZS9jb250ZW50RWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5L2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5L2NhdGVnb3JpemVkRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5L3N1YkNhdGVnb3J5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0RlbGl2ZXJhYmxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcmFibGUvZ3JvdXAzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcmFibGUvZGVsaXZlcmVkV29ya1Byb2R1Y3QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbi9leHRlcm5hbERlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbi9wYWNrYWdpbmdHdWlkYW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MvZ3JvdXA0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzL2NvbW11bmljYXRpb25zTWF0ZXJpYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MvZWR1Y2F0aW9uTWF0ZXJpYWwiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3NjYWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcHJvamVjdENoYXJhY3RlcmlzdGljcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Jpc2tMZXZlbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL2VzdGltYXRpbmdUZWNobmlxdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vdHlwZU9mQ29udHJhY3QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3ByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9mdWxmaWxsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L2lzQWJzdHJhY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvbm9kZWljb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvc2hhcGVpY29uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0Rlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0Rlc2NyaXB0b3IvaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVzY3JpcHRvckRlc2NyaXB0aW9uL3JlZmluZWREZXNjcmlwdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9EaXNjaXBsaW5lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGlzY2lwbGluZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EaXNjaXBsaW5lL3Rhc2siLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vRGlzY2lwbGluZS9zdWJEaXNjaXBsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGlzY2lwbGluZS9yZWZlcmVuY2VXb3JrZmxvdyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9EaXNjaXBsaW5lR3JvdXBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EaXNjaXBsaW5lR3JvdXBpbmcvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGlzY2lwbGluZUdyb3VwaW5nL2Rpc2NpcGxpbmUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRG9jdW1lbnRSb290Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRG9jdW1lbnRSb290L21peGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0RvY3VtZW50Um9vdC94TUxOU1ByZWZpeE1hcCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Eb2N1bWVudFJvb3QveFNJU2NoZW1hTG9jYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vRG9jdW1lbnRSb290L21ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vRG9jdW1lbnRSb290L21ldGhvZExpYnJhcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vRG9jdW1lbnRSb290L21ldGhvZFBsdWdpbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Eb21haW4iPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Eb21haW4vZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRG9tYWluL3dvcmtQcm9kdWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0RvbWFpbi9zdWJkb21haW4iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0VzdGltYXRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRXN0aW1hdGUvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRXN0aW1hdGUvZXN0aW1hdGlvbk1ldHJpYyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0VzdGltYXRlL2VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Fc3RpbWF0aW5nTWV0cmljIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRXhhbXBsZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0d1aWRhbmNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vR3VpZGFuY2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vR3VpZGFuY2VEZXNjcmlwdGlvbi9hdHRhY2htZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0d1aWRlbGluZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0l0ZXJhdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0tpbmQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0tpbmQvYXBwbGljYWJsZU1ldGFDbGFzc0luZm8iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9iYXNlQ29uZmlndXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vbWV0aG9kUGx1Z2luU2VsZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9tZXRob2RQYWNrYWdlU2VsZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9kZWZhdWx0VmlldyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vcHJvY2Vzc1ZpZXciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL3N1YnRyYWN0ZWRDYXRlZ29yeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vYWRkZWRDYXRlZ29yeSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9NZXRob2RFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9ncm91cCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9NZXRob2RFbGVtZW50L293bmVkUnVsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9NZXRob2RFbGVtZW50L21ldGhvZEVsZW1lbnRQcm9wZXJ0eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZEVsZW1lbnQvYnJpZWZEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZEVsZW1lbnQvaWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RFbGVtZW50L29yZGVyaW5nR3VpZGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RFbGVtZW50L3ByZXNlbnRhdGlvbk5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RFbGVtZW50L3N1cHByZXNzZWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudFByb3BlcnR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RFbGVtZW50UHJvcGVydHkvdmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWV0aG9kTGlicmFyeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL01ldGhvZExpYnJhcnkvbWV0aG9kUGx1Z2luIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL01ldGhvZExpYnJhcnkvbWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZExpYnJhcnkvdG9vbCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9NZXRob2RQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9ncm91cDEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL3JldXNlZFBhY2thZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9tZXRob2RQYWNrYWdlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9nbG9iYWwiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWV0aG9kUGx1Z2luIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RQbHVnaW4vcmVmZXJlbmNlZE1ldGhvZFBsdWdpbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9NZXRob2RQbHVnaW4vbWV0aG9kUGFja2FnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZFBsdWdpbi91c2VyQ2hhbmdlYWJsZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9NZXRob2RVbml0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RVbml0L2NvcHlyaWdodCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZFVuaXQvYXV0aG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZFVuaXQvY2hhbmdlRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZFVuaXQvY2hhbmdlRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RVbml0L3ZlcnNpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWlsZXN0b25lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NaWxlc3RvbmUvcmVxdWlyZWRSZXN1bHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTmFtZWRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9PdXRjb21lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUGFja2FnZWFibGVFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUGhhc2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9QbGFubmluZ0RhdGEiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1BsYW5uaW5nRGF0YS9maW5pc2hEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUGxhbm5pbmdEYXRhL3JhbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9QbGFubmluZ0RhdGEvc3RhcnREYXRlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1ByYWN0aWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJhY3RpY2UvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJhY3RpY2UvYWN0aXZpdHlSZWZlcmVuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9QcmFjdGljZS9jb250ZW50UmVmZXJlbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL1ByYWN0aWNlL3N1YlByYWN0aWNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYWRkaXRpb25hbEluZm8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2FwcGxpY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9iYWNrZ3JvdW5kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9nb2FscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vbGV2ZWxzT2ZBZG9wdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vcHJvYmxlbSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Qcm9jZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzL2luY2x1ZGVzUGF0dGVybiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Byb2Nlc3MvZGVmYXVsdENvbnRleHQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzL3ZhbGlkQ29udGV4dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Byb2Nlc3MvZGlhZ3JhbVVSSSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L2NvcHlyaWdodCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L2ludGVyZmFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L3Byb2Nlc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L2F1dGhvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L2NoYW5nZURhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L2NoYW5nZURlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC92ZXJzaW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlL2ludGVyZmFjZVNwZWNpZmljYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9pbnRlcmZhY2VJTyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi9zY29wZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi91c2FnZU5vdGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1Byb2Nlc3NFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UvcHJvY2Vzc0VsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS9ncm91cDQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS9iYXNlUHJvY2VzcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9SZXBvcnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUm9hZG1hcCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1JvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1JvbGUvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vYXNzaWdubWVudEFwcHJvYWNoZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vc2tpbGxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL3N5bm9ueW1zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9yb2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUm9sZVNldCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1JvbGVTZXQvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUm9sZVNldC9yb2xlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1JvbGVTZXRHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1JvbGVTZXRHcm91cGluZy9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlU2V0R3JvdXBpbmcvcm9sZVNldCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9TZWN0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vU2VjdGlvbi9zdWJTZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vU2VjdGlvbi9wcmVkZWNlc3NvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1NlY3Rpb24vZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9TZWN0aW9uL3NlY3Rpb25OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vU2VjdGlvbi92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vU2VjdGlvbi92YXJpYWJpbGl0eVR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vVGFzayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFzay9wcmVjb25kaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrL3Bvc3Rjb25kaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrL3BlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2svZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFzay9tYW5kYXRvcnlJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2svb3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFzay9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2svb3B0aW9uYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2svZXN0aW1hdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrL2VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2svdG9vbE1lbnRvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbi9hbHRlcm5hdGl2ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvdGFzayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL3BlcmZvcm1lZFByaW1hcmlseUJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2dyb3VwMyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvYXNzaXN0ZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2V4dGVybmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9tYW5kYXRvcnlJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL29wdGlvbmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9vdXRwdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivc3RlcCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2lzU3luY2hyb25pemVkV2l0aFNvdXJjZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9UZWFtUHJvZmlsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1RlYW1Qcm9maWxlL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1RlYW1Qcm9maWxlL3JvbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UZWFtUHJvZmlsZS9zdXBlclRlYW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UZWFtUHJvZmlsZS9zdWJUZWFtIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1RlbXBsYXRlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vVGVybURlZmluaXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Ub29sIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVG9vbC9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Ub29sL3Rvb2xNZW50b3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vVG9vbE1lbnRvciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1doaXRlcGFwZXIiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9wcmVkZWNlc3NvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzRXZlbnREcml2ZW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9pc09uZ29pbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9pc1JlcGVhdGFibGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vV29ya0RlZmluaXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtEZWZpbml0aW9uL3ByZWNvbmRpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtEZWZpbml0aW9uL3Bvc3Rjb25kaXRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vV29ya09yZGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrT3JkZXIvdmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrT3JkZXIvaWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrT3JkZXIvbGlua1R5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdC9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdC9lc3RpbWF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0L2VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0L3JlcG9ydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0L3RlbXBsYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3QvdG9vbE1lbnRvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL2ltcGFjdE9mTm90SGF2aW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9yZWFzb25zRm9yTm90TmVlZGluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci93b3JrUHJvZHVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9yZXNwb25zaWJsZVJvbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9leHRlcm5hbElucHV0VG8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0ZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL21hbmRhdG9yeUlucHV0VG8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3Ivb3B0aW9uYWxJbnB1dFRvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL291dHB1dEZyb20iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvZGVsaXZlcmFibGVQYXJ0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9hY3Rpdml0eUVudHJ5U3RhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvYWN0aXZpdHlFeGl0U3RhdGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0VHlwZS93b3JrUHJvZHVjdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvVU1BLnhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9VTUEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjhlODdlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9VTUEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM4NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBFUEYgVU1BIFhNTCBEYXRhIEludGVyY2hhbmdlIFNjaGVtYSAtLT4KLTx4c2Q6c2NoZW1hIHhtbG5zOnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMyI+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IldvcmtPcmRlclR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOQ05hbWUiPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluaXNoVG9TdGFydCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluaXNoVG9GaW5pc2giLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0YXJ0VG9TdGFydCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RhcnRUb0ZpbmlzaCIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5DTmFtZSI+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuYSIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29udHJpYnV0ZXMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImV4dGVuZHMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJlcGxhY2VzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsb2NhbENvbnRyaWJ1dGlvbiIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibG9jYWxSZXBsYWNlbWVudCIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJOYW1lZEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYWNrYWdlYWJsZUVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TmFtZWRFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBEZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UGFja2FnZWFibGVFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik93bmVkUnVsZSIgdHlwZT0idW1hOkNvbnN0cmFpbnQiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBwYWNrYWdpbmcgcnVsZXMgZm9yIHRoaXMgTWV0aG9kIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IGhhcyBhIGdsb2JhbCB1bmlxdWUgaWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InN1cHByZXNzZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPklmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSAiZXh0ZW5kcyIgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24sIHRoZW4gdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgaW5oZXJpdGVkIE1ldGhvZCBFbGVtZW50cyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCwgd2hpY2ggY2FuIGJlIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIG9uIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0aGFuIGFuIGluaGVyaXRlZCBtZXRob2QgZWxlbWVudCB0aGVuIGl0IHdpbGwgbm90IGJlIHJlZ2FyZGVkIGFzIGluaGVyaXRlZCBhdCBhbGwuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JkZXJpbmdHdWlkZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VkIGZvciBDQVNFIHRvb2wgcmVhbGl6YXRpb25zIG9mIHRoaXMgbW9kZWwgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBsYXlvdXQgYW5kIG9yZGVyaW5nIG9mIHRoZSBtZXRob2QgZWxlbWVudCBhbmQgaXRzIHBhcnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnN0cmFpbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdG9yZXMgdGhlIG1haW4gZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTZWN0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3ViU2VjdGlvbiIgdHlwZT0idW1hOlNlY3Rpb24iLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJlZGVjZXNzb3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VjdGlvbk5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RVbml0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvcHlyaWdodCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImF1dGhvcnMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTWFpbkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3RvcmVzIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IktleUNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYWR2aXNlIGFuZCBndWlkYW5jZSBvZiBhIGNyaXRpY2FsIG5hdHVyZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsIGFzIHdhcm5pbmdzLCBjYXV0aW9ucywgcGl0ZmFsbHMsIGRhbmdlcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJTZWN0aW9uIiB0eXBlPSJ1bWE6U2VjdGlvbiIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikd1aWRhbmNlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBHdWlkYW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkF0dGFjaG1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByYWN0aWNlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcmFjdGljZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQWRkaXRpb25hbEluZm8iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQXBwbGljYXRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQmFja2dyb3VuZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkVsYWJvcmF0aW9uIG9uIHRoZSBiYWNrZ3JvdW5kIGFuZCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgcHJvYmxlbSBvY2N1cnMgYW5kIHdoZXJlIHRoZSBzb2x1dGlvbiBkZXNjcmliZWQgYnkgdGhpcyBQcmFjdGljZSB3aWxsIGZpdCBpbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iR29hbHMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGV2ZWxzT2ZBZG9wdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIHRoZSBkaWZmZXJlbnQgZm9ybXMgb3IgdmFyaWFudHMgaW4gd2hpY2ggdGhlIHByYWN0aWNlIGNvdWxkIGJlIHJlYWxpemVkLiAoZS5nLiBmdWxsIGFkb3B0aW9uIHZlcnVzIGEgcGFydGlhbCBhZG9wdGlvbiBvZiB0aGUgUHJhY3RpY2UpPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByb2JsZW0iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRoZSBQcmFjdGljZSBhZGRyZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFdvcmsgUHJvZHVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSW1wYWN0T2ZOb3RIYXZpbmciIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVhc29uc0Zvck5vdE5lZWRpbmciIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleHRlcm5hbElkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhcnRpZmFjdC4gVXNlZCBsaWtlIGEgc3lub255bS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBcnRpZmFjdERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQXJ0aWZhY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJCcmllZk91dGxpbmUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXByZXNlbnRhdGlvbk9wdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EaXNjdXNzZXMgZGlmZmVyZW50IHBvc3NpYmxlIGFsdGVybmF0aXZlIHJlcHJlc2VudGF0aW9ucyBmb3IgdGhlIGFydGlmYWN0LiBGb3IgZXhhbXBsZSBhIGRlc2lnbiBtb2RlbCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBVTUwgbW9kZWwgb3IgYW4gaW5mb3JtYWwgYmxvY2sgZGlhZ3JhbSBvciBieSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9ubHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcmFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFeHRlcm5hbERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhY2thZ2luZ0d1aWRhbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFJvbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFzc2lnbm1lbnRBcHByb2FjaGVzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgZ3VpZGFuY2Ugb24gZm9yIGFzc2lnbmluZyBpbmRpdmlkdWFscyB0byB0aGUgUm9sZSBpbiB0ZXJtcyBvZiB3aGF0IG90aGVyIHJvbGVzIHRoZXNlIGluZGl2aWR1YWxzIGNvdWxkIHBlcmZvcm0gYW5kIHdoYXQgcmVzcG9uc2liaWxpdHkgZGlmZmVyZW50IGluZGl2aWR1YWxzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZSBtaWdodCBoYXZlLiAgVGhlIGd1aWRhbmNlIGNhbiBhbHNvIGRlc2NyaWJlIGRpZmZlcmVudCBhc3NpZ25tZW50IGFwcHJvYWNoZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cywgZS5nLiBmb3IgbGFyZ2UgdmVyc3VzIHNtYWxsIHRlYW1zIHdoZXJlIGluZGl2aWR1YWxzIGNvdWxkIGJlIGFsbG9jYXRlZCB0byByb2xlcyBmdWxsIHRpbWUgdmVyc3VzIHNoYXJpbmcgcm9sZXMgd2l0aGluIHRoZSB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTa2lsbHMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN5bm9ueW1zIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+TGlzdHMgc3lub255bXMsIGkuZS4gb3RoZXIgbmFtZXMgdGhlIFJvbGUgbWlnaHQgYmUgcmVmZXJyZWQgYnkuICBUb29sIHN1cHBvcnQgZm9yIHRoZSBtZXRhLW1vZGVsIG1pZ2h0IHN1cHBvcnQgdGhhdCBhIFJvbGUgbmFtZSBjYW4gYmUgY29uc2lzdGVudGx5IGJlIHJlcGxhY2VkIHdpdGggb25lIG9mIGl0cyBzeW5vbnltcyB0aHJvdWdodCBhIFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGFza0Rlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQWx0ZXJuYXRpdmVzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuCi1UaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZXNlbnRhdGlvbiIgdHlwZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAicnVwX2FyY2hpdGVjdHVyZV9kb2N1bWVudCIgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgImoyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQiIHdoZXJlYXMgdGhlIGV4dGVybmFsIHByZXNlbnRhdGlvbiB3b3VsZCBhbHdheXMgYmUgIkFyY2hpdGVjdHVyZSBEb2N1bWVudCIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2hhcGVpY29uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJub2RlaWNvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LgotQ29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmliYWJsZUVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNoZWNrbGlzdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbmNlcHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeGFtcGxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR3VpZGVsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV1c2FibGVBc3NldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldoaXRlcGFwZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJHdWlkYW5jZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5HdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29uY2VwdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNoZWNrbGlzdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXhhbXBsZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR3VpZGVsaW5lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVzdGltYXRlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHByb3ZpZGVzIHNpemluZyBtZWFzdXJlcywgb3Igc3RhbmRhcmRzIGZvciBzaXppbmcgdGhlIHdvcmsgZWZmb3J0IGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIGEgcGFydGljdWxhciBwaWVjZSBvZiB3b3JrIGFuZCBpbnN0cnVjdGlvbnMgZm9yIHRoZWlyIHN1Y2Nlc3NmdWwgdXNlLiBJdCBtYXkgYmUgY29tcHJpc2VkIG9mIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbnMgYW5kIGVzdGltYXRpb24gbWV0cmljcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIj4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25NZXRyaWMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+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+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBY3Rpdml0eVJlZmVyZW5jZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGVudFJlZmVyZW5jZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViUHJhY3RpY2UiIHR5cGU9InVtYTpQcmFjdGljZSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZXVzYWJsZUFzc2V0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcKLWhvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLgotQSB3b3JrIHByb2R1Y3QgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBhIHRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXBvcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUb29sTWVudG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFydGlmYWN0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgdGFuZ2libGUgd29yayBwcm9kdWN0IHR5cGVzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwgYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuCi1BcnRpZmFjdHMgYXJlIHRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBUYXNrcy4gIEl0IG1heSBzZXJ2ZSBhcyBhIGJhc2lzIGZvciBkZWZpbmluZyByZXVzYWJsZSBhc3NldHMuICBSb2xlcyB1c2UgQXJ0aWZhY3RzIHRvIHBlcmZvcm0gVGFza3MgYW5kIHByb2R1Y2UgQXJ0aWZhY3RzIGluIHRoZSBjb3Vyc2Ugb2YgcGVyZm9ybWluZyBUYXNrcy4gIEFydGlmYWN0cyBhcmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIFJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5IHRvIGlkZW50aWZ5IGFuZCB1bmRlcnN0YW5kLCBhbmQgcHJvbW90aW5nIHRoZSBpZGVhIHRoYXQgZXZlcnkgcGllY2Ugb2YgaW5mb3JtYXRpb24gcHJvZHVjZWQgaW4gdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25lIHJvbGUgbWlnaHQgIm93biIgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhaW5lZEFydGlmYWN0IiB0eXBlPSJ1bWE6QXJ0aWZhY3QiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcmFibGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3QiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVsaXZlcmVkV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3V0Y29tZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgUHJvZHVjdCB0aGF0IGRlc2NyaWJlcyBpbnRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgYSByZXN1bHQgb3Igc3RhdGUuIE91dGNvbWVzIG1heSBhbHNvIGJlIHVzZWQgdG8gZGVzY3JpYmUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBub3QgZm9ybWFsbHkgZGVmaW5lZC4gIEEga2V5IGRpZmZlcmVudGlhdG9yIGZvciBvdXRjb21lcyBhZ2FpbnN0IGFydGlmYWN0cyBpcyB0aGF0IG91dGNvbWVzIGFyZSBub3QgY2FuZGlkYXRlcyBmb3IgaGFydmVzdGluZyBhcyByZXVzYWJsZSBhc3NldHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBDb250ZW50IEVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgCi1BIFJvbGUgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcyBvZiBhbiBpbmRpdmlkdWFsIG9yIGEgc2V0IG9mIGluZGl2aWR1YWxzLiAgUm9sZXMgYXJlIG5vdCBpbmRpdmlkdWFscyBvciByZXNvdXJjZXMuICBJbmRpdmlkdWFsIG1lbWJlcnMgb2YgdGhlIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiB3aWxsIHdlYXIgZGlmZmVyZW50IGhhdHMsIG9yIHBlcmZvcm0gZGlmZmVyZW50IHJvbGVzLiBUaGUgbWFwcGluZyBmcm9tIGluZGl2aWR1YWwgdG8gcm9sZSwgcGVyZm9ybWVkIGJ5IHRoZSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhbmQgc3RhZmZpbmcgZm9yIGEgcHJvamVjdCwgYWxsb3dzIGRpZmZlcmVudCBpbmRpdmlkdWFscyB0byBhY3QgYXMgc2V2ZXJhbCBkaWZmZXJlbnQgcm9sZXMsIGFuZCBmb3IgYSByb2xlIHRvIGJlIHBsYXllZCBieSBzZXZlcmFsIGluZGl2aWR1YWxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2libGVGb3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGFzayI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLgotQSBUYXNrIGRlc2NyaWJlcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gc3BlY2lmaWMgUm9sZXMuICBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzLiAgSXQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMuIEEgVGFzayBpcyB1c2VkIGFzIGFuIGVsZW1lbnQgb2YgZGVmaW5pbmcgYSBwcm9jZXNzLiBUYXNrcyBhcmUgZnVydGhlciB1c2VkIGZvciBwbGFubmluZyBhbmQgdHJhY2tpbmcgcHJvZ3Jlc3M7IHRoZXJlZm9yZSwgaWYgdGhleSBhcmUgZGVmaW5lZCB0b28gZmluZS1ncmFpbmVkLCB0aGV5IHdpbGwgYmUgbmVnbGVjdGVkLCBhbmQgaWYgdGhleSBhcmUgdG9vIGxhcmdlLCBwcm9ncmVzcyB3b3VsZCBoYXZlIHRvIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIFRhc2sncyBwYXJ0cyAoZS5nLiBTdGVwcywgd2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4gCi1BIFRhc2sgaGFzIGEgY2xlYXIgcHVycG9zZSBpbiB3aGljaCB0aGUgcGVyZm9ybWluZyByb2xlcyBhY2hpZXZlIGEgd2VsbCBkZWZpbmVkIGdvYWwuICBJdCBwcm92aWRlcyBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIG9mIGRvaW5nIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuICBUaGlzIGRlc2NyaXB0aW9uIGlzIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBvZiB3aGVuIGluIGEgcHJvY2VzcyBsaWZlY3ljbGUgdGhlIHdvcmsgd291bGQgYWN0dWFsbHkgYmUgZG9uZS4gIEl0IHRoZXJlZm9yZSBkb2VzIG5vdCBkZXNjcmliZSB3aGVuIHlvdSBkbyB3aGF0IHdvcmsgYXQgd2hhdCBwb2ludCBvZiB0aW1lLCBidXQgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IGdldHMgZG9uZSB0aHJvdWdob3V0IHRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgdGhhdCBjb250cmlidXRlcyB0byB0aGUgYWNoaWV2ZW1lbnQgb2YgdGhpcyBnb2FsLiAgV2hlbiB0aGUgVGFzayBpcyBiZWluZyBhcHBsaWVkIGluIGEgcHJvY2VzcyB0aGVuIHRoaXMgcHJvY2VzcyBhcHBsaWNhdGlvbiAoZGVmaW5lZCBhcyBUYXNrIERlc2NyaXB0b3IpIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvZiB3aGljaCBwaWVjZXMgb2YgdGhlIFRhc2sgd2lsbCBhY3R1YWxseSBiZSBwZXJmb3JtZWQgYXQgYW55IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFRhc2sgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIHByb2Nlc3Mgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgYnV0IGVhY2ggdGltZSB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVtcGhhc2lzIG9uIGRpZmZlcmVudCBzdGVwcyBvciBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0aW9uLiAKLUZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAiRGV2ZWxvcCBVc2UgQ2FzZSBNb2RlbCIgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gZGV2ZWxvcCBhIGNvbXBsZXRlIHVzZSBjYXNlIG1vZGVsLiBUaGlzIHdvdWxkIGNvbXByaXNlIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBhbmQgbmFtaW5nIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLCB0aGUgd3JpdGluZyBvZiBhIGJyaWVmIGRlc2NyaXB0aW9uLCB0aGUgbW9kZWxpbmcgb2YgdXNlIGNhc2VzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIGluIGRpYWdyYW1zLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYSBiYXNpYyBmbG93LCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYWx0ZXJuYXRpdmVzIGZsb3dzLCBwZXJmb3JtaW5nIG9mIHdhbGt0aHJvdWdocyB3b3Jrc2hvcHMgYW5kIHJldmlld3MsIGV0Yy4gIEFsbCBvZiB0aGVzZSBwYXJ0cyBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBnb2FsIG9mIGRldmVsb3BpbmcgdGhlIHVzZSBjYXNlIG1vZGVsLCBidXQgdGhlIHBhcnRzIHdpbGwgYmUgcGVyZm9ybWVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSBpbiBhIHByb2Nlc3MuICBJZGVudGlmaWNhdGlvbiwgbmFtaW5nLCBhbmQgYnJpZWYgZGVzY3JpcHRpb25zIHdvdWxkIGJlIHBlcmZvcm1lZCBlYXJseSBpbiBhIHR5cGljYWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyB2ZXJzdXMgdGhlIHdyaXRpbmcgb2YgZGV0YWlsZWQgYWx0ZXJuYXRpdmUgZmxvd3Mgd2hpY2ggd291bGQgYmUgcGVyZm9ybWVkIG11Y2ggbGF0ZXIuICBBbGwgdGhlc2UgcGFydHMgb3Igc3RlcHMgd2l0aGluIHRoZSBzYW1lIFRhc2sgZGVmaW5lIHRoZSAibWV0aG9kIiBvZiBEZXZlbG9waW5nIGEgVXNlIENhc2UgTW9kZWwuICBBcHBseWluZyBzdWNoIGEgbWV0aG9kIGluIGEgbGlmZWN5Y2xlIChpLmUuIGluIGEgcHJvY2VzcykgaXMgZGVmaW5pbmcgd2hpY2ggc3RlcHMgYXJlIGRvbmUgd2hlbiBnb2luZyBmcm9tIG9uZSBpdGVyYXRpb24gdG8gdGhlIG5leHQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJlY29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBvc3Rjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGVyZm9ybWVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFuZGF0b3J5SW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPdXRwdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wdGlvbmFsSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRvb2xNZW50b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtEZWZpbml0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuCi1Xb3JrIERlZmluaXRpb25zIHJlcHJlc2VudCBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgZG9pbmcgd29yay4gIFRoZXNlIGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGFyZSBub3QgYm91bmQgdG8gb25lIHNwZWNpZmljIGNsYXNzaWZpZXIsIGJ1dCByZXByZXNlbnQgYW4gYXJiaXRyYXJ5IGRlZmluaXRpb24gb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZCBieSBhIHNwZWNpZmljIFJvbGUgKGUuZy4gYSBSb2xlIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBUYXNrIG9yIFN0ZXBzIG9mIGEgVGFzayksIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjbG9zZSBjb2xsYWJvcmF0aW9uIChtYW55IFJvbGVzIGFsbCB3b3JraW5nIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIGludGVyZGlzY2lwbGluYXJ5IFRhc2spLCBvciBjb21wbGV4IHdvcmsgdGhhdCBpcyBwZXJmb3JtZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIChlLmcuIGEgcHJvY2VzcyBkZWZpbmluZyBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgZm9yIG9yZ2FuaXppbmcgbGFyZ2VyIGNvbXBvc2l0ZSB1bml0cyBvZiB3b3JrIHBlcmZvcm1lZCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY29sbGFib3JhdGlvbikuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmVjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUG9zdGNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRDYXRlZ29yeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBjbGFzcyBnZW5lcmFsaXppbmcgY29udGVudCBjYXRlZ29yeSB0eXBlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGlzY2lwbGluZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNhdGVnb3JpemF0aW9uIG9mIHdvcmsgKGkuZS4gVGFza3MgZm9yIE1ldGhvZCBDb250ZW50KSwgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4KLUEgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUYXNrIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJEaXNjaXBsaW5lIiB0eXBlPSJ1bWE6RGlzY2lwbGluZSIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlV29ya2Zsb3ciIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGlzY2lwbGluZUdyb3VwaW5nIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlVzZWQgdG8gZ3JvdXAgRGlzY2lwbGluZXMuICBGb3IgZXhhbXBsZSwgdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgIlNvZnR3YXJlIERpc2NpcGxpbmVzIiB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICJSZXF1aXJlbWVudHMgTWFuYWdlbWVudCIgb3IgIlRlc3RpbmciOyAiSVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCIgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAiSVQgT3BlcmF0aW9uYWwgU2VydmljZXMiLCAiSVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyIsIG9yICJJVCBFbmFibGluZyBTZXJ2aWNlcyIuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGlzY2lwbGluZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEb21haW4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuCi1Eb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJkb21haW4iIHR5cGU9InVtYTpEb21haW4iLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZVNldCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Pcmdhbml6ZXMgUm9sZXMgaW50byBjYXRlZ29yaWVzLiAgSXQgaXMgdXNlZCB0byBncm91cCByb2xlcyB0b2dldGhlciB0aGF0IGhhdmUgY2VydGFpbiBjb21tb25hbGl0aWVzLiAgRm9yIGV4YW1wbGUsIHRoZSAiQW5hbHlzdHMiIFJvbGUgU2V0IGNvdWxkIGdyb3VwIHRoZSAiQnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0IiwgIlN5c3RlbSBBbmFseXN0IiwgYXMgd2VsbCBhcyAiUmVxdWlyZW1lbnRzIFNwZWNpZmllciIgcm9sZXMuICBBbGwgb2YgdGhlc2Ugd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQgaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBhcmUgcmVxdWlyZWQgYXMgZGlzdGluY3Qgcm9sZXMgZm9yIGEgbWV0aG9kIChlLmcuIHRoZSBtZXRob2QgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgaXMgYmFzZWQgb24pLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZVNldEdyb3VwaW5nIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlU2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRvb2wiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUb29sTWVudG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0VHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgIkNsYXNzIERpYWdyYW0iLCB3aGljaCBjYXRlZ29yaXplcyB0aGUgQXJ0aWZhY3RzIEFuYWx5c2lzIE1vZGVsLCBEZXNpZ24gTW9kZWwsIFVzZXIgRXhwZXJpZW5jZSBNb2RlbCwgb3IgIlNwZWNpZmljYXRpb24iLCB3aGljaCBjYXRlZ29yaXplcyByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbnMgdGhhdCBkZWZpbmUgYSBzeXN0ZW0gd2l0aCBhIHdlbGwtZGVmaW5lZCBzeXN0ZW0gYm91bmRhcnksIHN1Y2ggYXMgdXNlIGNhc2Ugb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbi4gIEEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGNhbiBiZSBjYXRlZ29yaXplZCBhcyBhIFNwZWNpZmljYXRpb24gYXMgd2VsbCBhcyBEaWFncmFtIFdvcmsgUHJvZHVjdCBUeXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkN1c3RvbUNhdGVnb3J5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAiVGVzdGluZyIgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDYXRlZ29yaXplZEVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YkNhdGVnb3J5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZFBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV1c2VkUGFja2FnZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGFja2FnZSIgdHlwZT0idW1hOk1ldGhvZFBhY2thZ2UiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2xvYmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgUGFja2FnZXMgY2FuIGhhdmUgYSBnbG9iYWwgc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZWxlbWVudCBvZiBldmVyeSBvdGhlciBNZXRob2QgUGFja2FnZSBjYW4gc2VlIHRoZSBnbG9iYWwgcGFja2FnZSdzIGNvbnRlbnRzLiAgR2xvYmFsIE1ldGhvZCBQYWNrYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gc3RvcmUgY29tbW9ubHkgdXNlZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBzdWNoIGFzIGZvciBEaXNjaXBsaW5lcyBvciBEb21haW5zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMgcmVzcGVjdGl2ZWx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMgYW5kIENvbnRlbnQgRWxlbWVudHMsIG9ubHkuICBFeGFtcGxlcyBmb3IgQ29udGVudCBFbGVtZW50IGFyZSBBcnRpZmFjdHMsIFRhc2tzLCBSb2xlcywgZXRjLiAgQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFBhY2thZ2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGVudEVsZW1lbnQiIHR5cGU9InVtYTpDb250ZW50RWxlbWVudCIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IG9ubHkgY29udGFpbnMgQ29udGVudCBDYXRlZ29yeSBFbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFBhY2thZ2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGVudENhdGVnb3J5IiB0eXBlPSJ1bWE6Q29udGVudENhdGVnb3J5Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuCi1Qcm9jZXNzIEVsZW1lbnRzIHJlcHJlc2VudHMgUHJvY2VzcyBzcGVjaWZpYyBlbGVtZW50cyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQgZnJvbSBDb250ZW50IEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmliYWJsZUVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQbGFubmluZ0RhdGEiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBQcm9jZXNzIEVsZW1lbnQgdGhhdCBhZGRzIHBsYW5uaW5nIGRhdGEgdG8gQnJlYWtkb3duIEVsZW1lbnRzIHdoZW4gaXQgaXMgdXNlZCBmb3IgYSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlLiAgRm9yIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0aGlzIGNsYXNzIGNhbiBlaXRoZXIgbm90IGJlIGluc3RhbnRpYXRlZCBvciBwb3B1bGF0ZWQgd2l0aCBkZWZhdWx0IGRhdGEuCi1QbGFubmluZyBEYXRhIGZhY3RvcnMgb3V0IHNwZWNpZmljIG9wdGlvbmFsIGRhdGEgbmVlZGVkIGZvciByZXByZXNlbnRpbmcgcGxhbm5pbmcgdGVtcGxhdGVzLiAgVGhpcyBhc3NvY2lhdGlvbiBhbGxvd3MgdG8gYWNjZXNzIHBsYW5uaW5nIGRhdGEgaWYgaXQgaXMgc3RvcmVkIGZvciB0aGUgQnJlYWtkb3duIEVsZW1lbnQuCi0oTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc0VsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InN0YXJ0RGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmluaXNoRGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZWZhdWx0IGZpbmlzaCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InJhbmsiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCcmVha2Rvd25FbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmVzZW50ZWRBZnRlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmVzZW50ZWRCZWZvcmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGxhbm5pbmdEYXRhIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBlckFjdGl2aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByZWZpeCByZXByZXNlbnRzIGFuIGFkZGl0aW9uYWwgbGFiZWwgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhIHByZWZpeCB0byBhbnkgQnJlYWtkb3duIEVsZW1lbnQgdG8gaW5kaWNhdGUgYSB1c2VyLWRlZmluZWQgc3ViLXR5cGUgZm9yIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHdvdWxkIGxpa2UgdG8gZGlzdGluZ3Vpc2ggaGlzIEFjdGl2aXRpZXMgYnkgJ01vZHVsZScgKGFzIGRvbmUgaW4gdGhlIElCTSBSYXRpb25hbCBTdW1taXQgQXNjZW5kYW50IE1ldGhvZCksIGhlIGNhbiBkZWZpbmUgYSBkaWZmZXJlbnQgcHJlZml4IGZvciBldmVyeSBtb2RlbCB0byBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIG5hbWluZyBBY3Rpdml0aWVzLCBlLmcuICJTUkEuRXN0YWJsaXNoIFJlcXVpcmVtZW50cyIgd2l0aCBTUkEgaW5kaWNhdGluZyB0aGF0IHRoaXMgQWN0aXZpdHkgYmVsb25ncyB0byB0aGUgIlNvZnR3YXJlIFJlcXVpcmVtZW50cyBBbmFseXNpcyIgbW9kdWxlLiAgQW5vdGhlciBjb21tb24gYXBwbGljYXRpb24gZm9yIHByZWZpeCBpcyB0byBxdWFsaWZ5IHJvbGVzIGluIFJvbGUgRGVzY3JpcHRvcnMuICBGb3IgZXhhbXBsZSwgIkN1c3RvbWVyLkFyY2hpdGVjdCIgd291bGQgZGVmaW5lIGEgIkN1c3RvbWVyIiBwcmVmaXggZm9yIHRoZSBSb2xlIERlc2NyaXB0b3IgIkFyY2hpdGVjdCIgZXhwcmVzc2luZyB0aGF0IHRoaXMgaXMgYW4gYXJjaGl0ZWN0IG9uIHRoZSBjdXN0b21lciBzaWRlIGFuZCBub3QgdGhlIGRldmVsb3BtZW50IHRlYW0gc2lkZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1BsYW5uZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEga2V5IGFwcGxpY2F0aW9uIGZvciBEZXZlbG9wbWVudCBQcm9jZXNzZXMgZXhwcmVzc2VkIHdpdGggQnJlYWtkb3duIHN0cnVjdHVyZXMgaXMgdG8gZ2VuZXJhdGUgYSBwcm9qZWN0IHBsYW4gZnJvbSBpdC4gIEEgcHJvY2VzcyBhcyBkZWZpbmVkIGluIFVNQSAoY2YuIHdpdGggU2VjdGlvbnMgWFggYW5kIDUuMikgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBzdHJ1Y3R1cmUgZGVmaW5pbmcgd2hhdCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCBhdCB3aGF0IHRpbWUgYnkgd2hpY2ggcm9sZXMgdXNpbmcgd2hpY2ggaW5wdXQgYW5kIHByb2R1Y2luZyB3aGF0IG91dHB1dHMuICBBIHByb2plY3QgcGxhbiBhcyBpdCBpcyByZXByZXNlbnRlZCBpbiBwcm9qZWN0IHBsYW5uaW5nIHRvb2xzIHN1Y2ggYXMgSUJNIFJhdGlvbmFsIFBvcnRmb2xpbyBNYW5hZ2VyIG9yIE1pY3Jvc29mdCBQcm9qZWN0IG5vcm1hbGx5IGRvZXMgbm90IG5lZWQgYWxsIHRoaXMgaW5mb3JtYXRpb24gYW5kIGlzIG5vcm1hbGx5IGxpbWl0ZWQgdG8ganVzdCByZXByZXNlbnRpbmcgYSBzdWJzZXQuICBGb3IgZXhhbXBsZSwgYSB0eXBpY2FsIE1TIFByb2plY3QgcGxhbiBvbmx5IHJlcHJlc2VudHMgdGhlIHdvcmsgYnJlYWtkb3duIGNvbnNpc3Rpbmcgb2YgVGFza3MgYW5kIEFjdGl2aXRpZXMgKHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBzdW1tYXJ5IHRhc2tzKS4gIEl0IGRvZXMgbm90IHNob3cgdGhlIGlucHV0IGFuZCBvdXRwdXQgV29yayBQcm9kdWN0cyBmb3IgYSBUYXNrLCBidXQgaXQgY2FuIHNob3cgd2hpY2ggcm9sZXMgc2hhbGwgYmUgc3RhZmZlZCBmb3IgcGVyZm9ybWluZyB0aGUgVGFzay4gIEhvd2V2ZXIsIHN1Y2ggcm9sZSBhbGxvY2F0aW9uIG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCBjb25jcmV0ZSByZXNvdXJjZXMgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBTb21ldGltZXMgcHJvamVjdCBwbGFucyBjYW4gdGhlbiBhZ2FpbiBiZSBvcmdhbml6ZWQgZGlmZmVyZW50bHkgYnkgb3JnYW5pemluZyB3b3JrIGJ5IGRlbGl2ZXJhYmxlcyBpbiB3aGljaCBXb3JrIFByb2R1Y3RzIGFyZSBtYXBwZWQgdG8gdGhlIHBsYW4ncyBzdW1tYXJ5IHRhc2tzIGFuZCBUYXNrIHRoYXQgaGF2ZSB0aGVzZSB3b3JrIHByb2R1Y3RzIGFzIG91dHB1dCBtYXBwZWQgYmVsb3cgc3VjaCBhcyBzdW1tYXJ5IHRhc2suICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBjYW4gbWFrZSByZWNvbW1lbmRhdGlvbnMgYWJvdXQgd2hpY2ggZWxlbWVudHMgdG8gaW5jbHVkZSBhbmQgd2hpY2ggdG8gZXhjbHVkZSB3aGVuIGdlbmVyYXRpbmcgYSBwbGFuLiAgV2hlbiB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSBpcyBzZXQgdG8gRmFsc2UgZm9yIGFuIGluc3RhbmNlIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQsIHRoZW4gdGhpcyBlbGVtZW50IHNoYWxsIG5vdCBiZSBub3QgaW5jbHVkZWQgd2hlbiBhIGNvbmNyZXRlIHByb2plY3QgcGxhbiBpcyBiZWluZyBnZW5lcmF0ZWQgZnJvbSB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoaXMgZWxlbWVudC4KLTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Imhhc011bHRpcGxlT2NjdXJyZW5jZXMiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkp1c3QgYXMgdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgdGhlIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBhbiBpbXBhY3Qgb24gZ2VuZXJhdGluZyBwbGFucyBmcm9tIGEgUHJvY2Vzcy4gIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhlbiBpdCB3aWxsIHR5cGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gdGhlIHNhbWUgQWN0aXZpdHkuICBGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgIkRldGFpbCBVc2UgQ2FzZSIgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNPcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHRoYXQgdGhlIEJyZWFrZG93biBFbGVtZW50IGRlc2NyaWJlcyB3b3JrLCBhIHdvcmsgcmVzdWx0LCBvciBldmVuIHdvcmsgcmVzb3VyY2VzLCB3aGljaCBpbmNsdXNpb24gaXMgbm90IG1hbmRhdG9yeSB3aGVuIHBlcmZvcm1pbmcgYSBwcm9qZWN0IHRoYXQgaXMgcGxhbm5lZCBiYXNlZCBvbiBhIHByb2Nlc3MgY29udGFpbmluZyB0aGlzIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya09yZGVyIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnRzIGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudHMgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gIAotVGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW4gcGFydGljdWxhciBjcml0aWNhbCBmb3IgcGxhbm5pbmcgYXBwbGljYXRpb25zLiAgU2VlIG1vcmUgZGV0YWlscyBvbiBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF0IFdvcmsgT3JkZXIgVHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsaW5rVHlwZSIgdHlwZT0idW1hOldvcmtPcmRlclR5cGUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBhdHRyaWJ1dGUgZXhwcmVzc2VzIHRoZSB0eXBlIG9mIHRoZSBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcCBieSBhc3NpZ25pbmcgYSB2YWx1ZSBmcm9tIHRoZSBXb3JrIE9yZGVyIFR5cGUgZW51bWVyYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVkZWNlc3NvciIgdHlwZT0idW1hOldvcmtPcmRlciIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1JlcGVhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzT25nb2luZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SWYgdGhlIGlzT25nb2luZyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gaW5zdGFuY2UsIHRoZW4gdGhlIGVsZW1lbnQgZGVzY3JpYmVzIGFuIG9uZ29pbmcgcGllY2Ugb2Ygd29yayB3aXRob3V0IGEgZml4ZWQgZHVyYXRpb24gb3IgZW5kIHN0YXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayBvZiBhbiBhZG1pbmlzdHJhdG9yIGNvbnRpbnVvdXNseSAoZS5nLiAzaCBhIGRheSkgd29ya2luZyB0byBlbnN1cmUgdGhhdCBzeXN0ZW1zIGFyZSBrZXB0IGluIGEgY2VydGFpbiBzdGF0ZS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBwcm9ncmFtIG1hbmFnZW1lbnQgd29yayBvdmVyc2VlaW5nIG1hbnkgZGlmZmVyZW50IHByb2plY3RzIGJlaW5nIHNjaGVkdWxlZCBmb3Igb25lIHBhcnRpY3VsYXIgcHJvamVjdCBhdCBzcGVjaWZpYyByZW9jY3VycmluZyBpbnRlcnZhbHMgZHVyaW5nIHRoZSB3aG9sZSBsaWZlY3ljbGUgb2YgdGhlIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNFdmVudERyaXZlbiIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWlsZXN0b25lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWN0aXZpdHkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBXb3JrIERlZmluaXRpb24gd2hpY2ggc3VwcG9ydHMgdGhlIG5lc3RpbmcgYW5kIGxvZ2ljYWwgZ3JvdXBpbmcgb2YgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudHMgZm9ybWluZyBicmVha2Rvd24gc3RydWN0dXJlcy4gIEFsdGhvdWdoIEFjdGl2aXR5IGlzIGEgY29uY3JldGUgbWV0YS1jbGFzcywgb3RoZXIgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVyaXZlIGZyb20gaXQ7IHN1Y2ggYXMgUGhhc2UsIEl0ZXJhdGlvbiwgRGVsaXZlcnkgUHJvY2Vzcywgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuLgotQWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJlY29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBvc3Rjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQnJlYWtkb3duRWxlbWVudCIgdHlwZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaGVja2xpc3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb25jZXB0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXhhbXBsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ikd1aWRlbGluZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvYWRtYXAiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzYWJsZUFzc2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV2hpdGVwYXBlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9IklzRW5hY3RhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBoYXNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLVBoYXNlIHJlcHJlc2VudCBhIHNpZ25pZmljYW50IHBlcmlvZCBpbiBhIHByb2plY3QsIGVuZGluZyB3aXRoIG1ham9yIG1hbmFnZW1lbnQgY2hlY2twb2ludCwgbWlsZXN0b25lIG9yIHNldCBvZiBEZWxpdmVyYWJsZXMuICBJdCBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kZWwgYXMgYSBwcmVkZWZpbmVkIHNwZWNpYWwgQWN0aXZpdHksIGJlY2F1c2Ugb2YgaXRzIHNpZ25pZmljYW5jZSBpbiBkZWZpbmluZyBicmVha2Rvd25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHkiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJdGVyYXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEFjdGl2aXR5IHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotSXRlcmF0aW9uIGdyb3VwcyBhIHNldCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEl0IHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbiByZXBldGl0aXZlIGN5Y2xlcy4gIFRoZSBjb25jZXB0IG9mIEl0ZXJhdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCBydWxlcyBpbiBkaWZmZXJlbnQgbWV0aG9kcy4gIEZvciBleGFtcGxlLCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBtZXRob2QgZnJhbWV3b3JrIChSVVApIGRlZmluZXMgYSBydWxlIHRoYXQgSXRlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gc3BhbiBhY3Jvc3MgUGhhc2VzLiAgSW4gY29udHJhc3QgSUJNIEdsb2JhbCBTZXJ2aWNlcyBNZXRob2QgKEdTTWV0aG9kKSBiYXNlZCBtZXRob2QgZnJhbWV3b3JrcyB0aGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgYW5kIEl0ZXJhdGlvbiBjYW4gYmUgZGVmaW5lZCB3aGljaCBuZXN0IFBoYXNlcy4gIFJ1bGVzIGxpa2UgdGhlc2UsIHdoaWNoIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGVuZm9yY2VkIGJ5IHRoaXMgbWV0YS1tb2RlbC4gIEluc3RlYWQsIHByb2Nlc3MgYXV0aG9ycyBhcmUgZXhwZWN0ZWQgdG8gZm9sbG93IGFuZCBjaGVjayB0aGVzZSBydWxlcyBtYW51YWxseS4gIChOb3RlOiBBbnkgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGJlIHJlcGVhdGVkOyBob3dldmVyLCBJdGVyYXRpb25zIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYSBzcGVjaWFsIG1ldGEtbW9kZWwgY29uY2VwdCwgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW50IHJvbGUgZm9yIG1hbnkgbWV0aG9kcy4pPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIEJyZWFrZG93biBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1c2FnZUd1aWRhbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBCcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGFuIEFjdGl2aXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBbHRlcm5hdGl2ZXMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIb3dUb1N0YWZmIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYmFja2dyb3VuZCBvbiB3aG8gc2hvdWxkIGJlIGludm9sdmVkIGluIHRoaXMgYWN0aXZpdHkgd2hhdCBhcmUgdGhlIHJlcXVpcmVkIHNraWxscywgZXhwZXJpZW5jZSwgIGFuZCBwZXJoYXBzIGF0dGl0dWRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpcHRvckRlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZpbmVkRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBBY3Rpdml0eSBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNjb3BlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlVzYWdlTm90ZXMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsSWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGRlbGl2ZXJ5IHBhdHRlcm5zIGFuZCBtb2RlbHMuIEl0IGlzIHVzZWQgbGlrZSBhIHN5bm9ueW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBQcm9jZXNzIERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyeSBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTY2FsZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIGNoYXJhY3RlcmlzdGljcyBhYm91dCB0aGUgc2l6ZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvamVjdCBleHByZXNzZWQgaW4gdGVhbSBzaXplLCBtYW4geWVhcnMsIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJvamVjdENoYXJhY3RlcmlzdGljcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3M8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmlza0xldmVsIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXN0aW1hdGluZ1RlY2huaXF1ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgRXN0aW1hdGlvbiBUZWNobmlxdWVzIHByb3ZpZGVkIGZvciB0aGlzIFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByb2plY3RNZW1iZXJFeHBlcnRpc2UiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHlwZU9mQ29udHJhY3QiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb0knbSBjaGFJJ20gbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlZmVyZW5jZXMgb25lIGNvbmNyZXRlIENvbnRlbnQgRWxlbWVudC4gIEEgZGVzY3JpcHRvciBwcm92aWRlcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHdpdGhpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uIHRvIGp1c3QgcmVmZXJlbmNpbmcgQ29udGVudCBFbGVtZW50cyBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgQ29udGVudCBFbGVtZW50cyBzdHJ1Y3R1cmFsIHJlbGF0aW9uc2hpcHMgYnkgZGVmaW5pbmcgaXRzIG93biBzZXRzIG9mIGFzc29jaWF0aW9ucy4KLURlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgV29yayBQcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmlwdG9yIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbXBhY3RlZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW1wYWN0cyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlbGl2ZXJhYmxlUGFydHMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjdGl2aXR5RW50cnlTdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5HaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZURlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgUm9sZSBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgUm9sZSBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmlwdG9yIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXNwb25zaWJsZUZvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRhc2tEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuCi1BIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0by4KLTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya0JyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRhc2siIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGVyZm9ybWVkUHJpbWFyaWx5QnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBc3Npc3RlZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1hbmRhdG9yeUlucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3B0aW9uYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik91dHB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJTdGVwIiB0eXBlPSJ1bWE6U2VjdGlvbiIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb21wb3NpdGVSb2xlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLgotQSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpSb2xlRGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZ2dyZWdhdGVkUm9sZSIgdHlwZT0idW1hOlJvbGUiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVhbVByb2ZpbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLgotV29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLgotSGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBlclRlYW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YlRlYW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2VzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuCi1Db3JlIE1ldGhvZCBDb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcgaG93IHZlcnkgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiAgUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gIFRodXMsIGEgcHJvY2VzcyBpcyBhIHNldCBvZiBwYXJ0aWFsbHkgb3JkZXJlZCB3b3JrIGRlc2NyaXB0aW9ucyBpbnRlbmRlZCB0byByZWFjaCBhIGhpZ2hlciBkZXZlbG9wbWVudCBnb2FsLCBzdWNoIGFzIHRoZSByZWxlYXNlIG9mIGEgc3BlY2lmaWMgc29mdHdhcmUgc3lzdGVtLiAgQSBwcm9jZXNzIGFuZCB0aGUgcHJvY2VzcyBtZXRhLW1vZGVsIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBmb2N1c2VzIG9uIHRoZSBsaWZlY3ljbGUgYW5kIHRoZSBzZXF1ZW5jaW5nIG9mIHdvcmsgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUbyBhY2hpZXZlIHRoaXMgaXQgdXNlcyB0aGUgRGVzY3JpcHRvciBjb25jZXB0IHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGFuZCBhbGxvd2luZyBkZWZpbmluZyB0aW1lLXNwZWNpZmljIGN1c3RvbWl6YXRpb25zIG9mIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgKGUuZy4gZGVmaW5pbmcgYSBmb2N1cyBvbiBkaWZmZXJlbnQgc3RlcHMgb2YgdGhlIHNhbWUgVGFzayBhbmQgcHJvdmlkaW5nIGlucHV0IFdvcmsgUHJvZHVjdHMgaW4gZGlmZmVyZW50IHN0YXRlcyB3aXRoaW4gdGhlIGRpZmZlcmVudCBQaGFzZXMgb2YgYSBwcm9jZXNzIGxpZmVjeWNsZSBpbiB3aGljaCB0aGUgc2FtZSBUYXNrIGlzIHBlcmZvcm1lZCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eSI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9IkluY2x1ZGVzUGF0dGVybiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEZWZhdWx0Q29udGV4dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iVmFsaWRDb250ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcnlQcm9jZXNzIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLgotQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzIj4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbW11bmljYXRpb25zTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVkdWNhdGlvbk1hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJuIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4KLUEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOgotLSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4KLS0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuCi0tIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3MiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4KLUEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2VzcyI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCYXNlUHJvY2VzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzUGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LgotQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFBhY2thZ2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiIHR5cGU9InVtYTpQcm9jZXNzRWxlbWVudCIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVyZmFjZVNwZWNpZmljYXRpb24iIHR5cGU9InVtYTpUYXNrRGVzY3JpcHRvciIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZXJmYWNlSU8iIHR5cGU9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuCi1VTUEgc3VwcG9ydHMgcmVwbGFjZWFibGUgYW5kIHJldXNhYmxlIFByb2Nlc3MgQ29tcG9uZW50cyByZWFsaXppbmcgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gQ2VydGFpbiBzaXR1YXRpb25zIGluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCBtaWdodCByZXF1aXJlIHRoYXQgY29uY3JldGUgcmVhbGl6YXRpb25zIG9mIHBhcnRzIG9mIHRoZSBwcm9jZXNzIHJlbWFpbiB1bmRlY2lkZWQgb3Igd2lsbCBiZSBkZWNpZGVkIGJ5IHRoZSBleGVjdXRpbmcgdGVhbSBpdHNlbGYgKGUuZy4gaW4gb3V0c291cmNpbmcgc2l0dWF0aW9ucykuICBVTUEgcHJvdmlkZXMgYSB1bmlxdWUgY29tcG9uZW50IGNvbmNlcHQgZGVmaW5pbmcgaW50ZXJmYWNlcyBmb3Igd29yayBwcm9kdWN0IGlucHV0IGFuZCBvdXRwdXQsIGFsbG93aW5nIHRyZWF0aW5nIHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBvZiB0aGUgd29yayB0aGF0IHByb2R1Y2VzIHRoZSBvdXRwdXRzIGFzIGEgImJsYWNrIGJveCIuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICJyZWFsaXphdGlvbiIgZGV0YWlsaW5nIHRoZSB3b3JrIGNhbiBiZSBhZGRlZCB0byB0aGUgcHJvY2Vzcy4gIFRoZSBjb21wb25lbnQgYXBwcm9hY2ggYWxzbyBhbGxvd3MgdGhhdCBkaWZmZXJlbnQgc3R5bGVzIG9yIHRlY2huaXF1ZXMgb2YgZG9pbmcgd29yayBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvbmUgYW5vdGhlci4gIEZvciBleGFtcGxlLCBhIHNvZnR3YXJlIGNvZGUgb3V0cHV0IG9mIGEgY29tcG9uZW50IGNvdWxkIGJlIHByb2R1Y2VkIHdpdGggYSBtb2RlbC1kcml2ZW4gZGV2ZWxvcG1lbnQgb3IgYSBjb2RlLWNlbnRyaWMgdGVjaG5pcXVlLiAgVGhlIGNvbXBvbmVudCBjb25jZXB0IGVuY2Fwc3VsYXRlcyB0aGUgYWN0dWFsIHdvcmsgYW5kIGxldHMgdGhlIGRldmVsb3BtZW50IHRlYW0gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSB0ZWNobmlxdWUgYW5kIGZpbGwgdGhlIGNvbXBvbmVudCdzIHJlYWxpemF0aW9uIHdpdGggdGhlaXIgY2hvaWNlIG9mIEFjdGl2aXRpZXMgdGhhdCBwcm9kdWNlIHRoZSByZXF1aXJlZCBvdXRwdXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc1BhY2thZ2UiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvcHlyaWdodCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJbnRlcmZhY2UiIHR5cGU9InVtYTpQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9jZXNzIiB0eXBlPSJ1bWE6UHJvY2VzcyIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImF1dGhvcnMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZFBsdWdpbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLgotTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuCi1TcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlZmVyZW5jZWRNZXRob2RQbHVnaW4iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1ldGhvZFBhY2thZ2UiIHR5cGU9InVtYTpNZXRob2RQYWNrYWdlIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idXNlckNoYW5nZWFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQbHVnaW4iIHR5cGU9InVtYTpNZXRob2RQbHVnaW4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBVbml0IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLU1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9IkJhc2VDb25maWd1cmF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJNZXRob2RQbHVnaW5TZWxlY3Rpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGVmYXVsdFZpZXciIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9IlByb2Nlc3NWaWV3IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiB0eXBlPSJ1bWE6TWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RMaWJyYXJ5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1ldGhvZFBsdWdpbiIgdHlwZT0idW1hOk1ldGhvZFBsdWdpbiIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIgdHlwZT0idW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZExpYnJhcnkiIHR5cGU9InVtYTpNZXRob2RMaWJyYXJ5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BY3Rpdml0eS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMGE1Y2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBY3Rpdml0eS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2aXR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBXb3JrIERlZmluaXRpb24gd2hpY2ggc3VwcG9ydHMgdGhlIG5lc3RpbmcgYW5kIGxvZ2ljYWwgZ3JvdXBpbmcgb2YgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudHMgZm9ybWluZyBicmVha2Rvd24gc3RydWN0dXJlcy4gIEFsdGhvdWdoIEFjdGl2aXR5IGlzIGEgY29uY3JldGUgbWV0YS1jbGFzcywgb3RoZXIgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVyaXZlIGZyb20gaXQ7IHN1Y2ggYXMgUGhhc2UsIEl0ZXJhdGlvbiwgRGVsaXZlcnkgUHJvY2Vzcywgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuLgotICogQWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRCcmVha2Rvd25FbGVtZW50IDxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0Um9hZG1hcCA8ZW0+Um9hZG1hcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjaXNJc0VuYWN0YWJsZSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHkoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0FjdGl2aXR5JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aXZpdHkgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVjb25kaXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9QcmVjb25kaXRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlY29uZGl0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByZWNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVjb25kaXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UG9zdGNvbmRpdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X1Bvc3Rjb25kaXRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUG9zdGNvbmRpdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQb3N0Y29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQb3N0Y29uZGl0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMzwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfR3JvdXAzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MzcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQnJlYWtkb3duRWxlbWVudCcgZ3JvdXA9JyNncm91cDozNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PEJyZWFrZG93bkVsZW1lbnQ+IGdldEJyZWFrZG93bkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvYWRtYXA8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2FkbWFwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9Sb2FkbWFwKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JvYWRtYXAnIGdyb3VwPScjZ3JvdXA6MzcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFJvYWRtYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SXMgRW5hY3RhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEVuYWN0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjdW5zZXRJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjc2V0SXNFbmFjdGFibGUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfSXNFbmFjdGFibGUoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nSXNFbmFjdGFibGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNFbmFjdGFibGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2lzSXNFbmFjdGFibGUgPGVtPklzIEVuYWN0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRW5hY3RhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICN1bnNldElzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICNpc0lzRW5hY3RhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0VuYWN0YWJsZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjaXNJc0VuYWN0YWJsZSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICNpc0lzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICNzZXRJc0VuYWN0YWJsZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNFbmFjdGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjaXNJc0VuYWN0YWJsZSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBFbmFjdGFibGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICNpc0lzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICNzZXRJc0VuYWN0YWJsZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNFbmFjdGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4ibmEiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgI2lzU2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICN1bnNldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfVmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0ibmEiIHVuc2V0dGFibGU9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ndmFyaWFiaWxpdHlUeXBlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgI2lzU2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICN1bnNldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotfSAvLyBBY3Rpdml0eQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BY3Rpdml0eURlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQWN0aXZpdHlEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWMzOTE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BY3Rpdml0eURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBY3Rpdml0eURlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZpdHkgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGdlbmVyYWxpemVkIEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQWN0aXZpdHkuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRIb3dUb1N0YWZmIDxlbT5Ib3cgVG8gU3RhZmY8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdBY3Rpdml0eURlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aXZpdHlEZXNjcmlwdGlvbiBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsdGVybmF0aXZlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FsdGVybmF0aXZlcyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBbHRlcm5hdGl2ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFsdGVybmF0aXZlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBbHRlcm5hdGl2ZXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhvdyBUbyBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgYmFja2dyb3VuZCBvbiB3aG8gc2hvdWxkIGJlIGludm9sdmVkIGluIHRoaXMgYWN0aXZpdHkgd2hhdCBhcmUgdGhlIHJlcXVpcmVkIHNraWxscywgZXhwZXJpZW5jZSwgIGFuZCBwZXJoYXBzIGF0dGl0dWRlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SG93IFRvIFN0YWZmPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIb3dUb1N0YWZmKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3dUb1N0YWZmKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0hvd1RvU3RhZmYnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SG93VG9TdGFmZigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRIb3dUb1N0YWZmIDxlbT5Ib3cgVG8gU3RhZmY8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhvdyBUbyBTdGFmZjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SG93VG9TdGFmZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SG93VG9TdGFmZihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHVycG9zZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQdXJwb3NlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFB1cnBvc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHVycG9zZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIEFjdGl2aXR5RGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODJiNTkzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5qYXZhLHYgMS4xIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvI2lzSXNQcmltYXJ5RXh0ZW5zaW9uIDxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXBwbGljYWJsZU1ldGFDbGFzc0luZm8nIGtpbmQ9J2VtcHR5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgUHJpbWFyeSBFeHRlbnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQHNlZSAjdW5zZXRJc1ByaW1hcnlFeHRlbnNpb24oKQotCSAqIEBzZWUgI3NldElzUHJpbWFyeUV4dGVuc2lvbihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb19Jc1ByaW1hcnlFeHRlbnNpb24oKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naXNQcmltYXJ5RXh0ZW5zaW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzUHJpbWFyeUV4dGVuc2lvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm8jaXNJc1ByaW1hcnlFeHRlbnNpb24gPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc1ByaW1hcnlFeHRlbnNpb24oKQotCSAqIEBzZWUgI3Vuc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAc2VlICNpc0lzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyNpc0lzUHJpbWFyeUV4dGVuc2lvbiA8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAc2VlICNpc0lzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQHNlZSAjc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc1ByaW1hcnlFeHRlbnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm8jaXNJc1ByaW1hcnlFeHRlbnNpb24gPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAc2VlICNpc0lzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQHNlZSAjc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc1ByaW1hcnlFeHRlbnNpb24oKTsKLQotfSAvLyBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FydGlmYWN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQXJ0aWZhY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkM2FlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQXJ0aWZhY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXJ0aWZhY3QuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnRpZmFjdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgdGFuZ2libGUgd29yayBwcm9kdWN0IHR5cGVzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwgYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuCi0gKiBBcnRpZmFjdHMgYXJlIHRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBUYXNrcy4gIEl0IG1heSBzZXJ2ZSBhcyBhIGJhc2lzIGZvciBkZWZpbmluZyByZXVzYWJsZSBhc3NldHMuICBSb2xlcyB1c2UgQXJ0aWZhY3RzIHRvIHBlcmZvcm0gVGFza3MgYW5kIHByb2R1Y2UgQXJ0aWZhY3RzIGluIHRoZSBjb3Vyc2Ugb2YgcGVyZm9ybWluZyBUYXNrcy4gIEFydGlmYWN0cyBhcmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIFJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5IHRvIGlkZW50aWZ5IGFuZCB1bmRlcnN0YW5kLCBhbmQgcHJvbW90aW5nIHRoZSBpZGVhIHRoYXQgZXZlcnkgcGllY2Ugb2YgaW5mb3JtYXRpb24gcHJvZHVjZWQgaW4gdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25lIHJvbGUgbWlnaHQgIm93biIgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdCNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVkQXJ0aWZhY3QgPGVtPkNvbnRhaW5lZCBBcnRpZmFjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBcnRpZmFjdCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXJ0aWZhY3QnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcnRpZmFjdCBleHRlbmRzIFdvcmtQcm9kdWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMzwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3RfR3JvdXAzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGFpbmVkIEFydGlmYWN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGFpbmVkIEFydGlmYWN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGFpbmVkIEFydGlmYWN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb250YWluZWRBcnRpZmFjdCcgZ3JvdXA9JyNncm91cDozMCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PEFydGlmYWN0PiBnZXRDb250YWluZWRBcnRpZmFjdCgpOwotCi19IC8vIEFydGlmYWN0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FydGlmYWN0RGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BcnRpZmFjdERlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4OTczNWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FydGlmYWN0RGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFydGlmYWN0RGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQXJ0aWZhY3QuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRCcmllZk91dGxpbmUgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zIDxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uIDxlbT5SZXByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXROb3RhdGlvbiA8ZW0+Tm90YXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXJ0aWZhY3REZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFydGlmYWN0RGVzY3JpcHRpb24gZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CcmllZiBPdXRsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CcmllZiBPdXRsaW5lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRCcmllZk91dGxpbmUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCcmllZk91dGxpbmUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QnJpZWZPdXRsaW5lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldEJyaWVmT3V0bGluZSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QnJpZWYgT3V0bGluZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QnJpZWZPdXRsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCcmllZk91dGxpbmUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVwcmVzZW50YXRpb25PcHRpb25zJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXByZXNlbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVwcmVzZW50YXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwcmVzZW50YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlcHJlc2VudGF0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXByZXNlbnRhdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZXByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbiA8ZW0+UmVwcmVzZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlcHJlc2VudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVwcmVzZW50YXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ob3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm90YXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBcnRpZmFjdERlc2NyaXB0aW9uX05vdGF0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J05vdGF0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5vdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldE5vdGF0aW9uIDxlbT5Ob3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm90YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5vdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROb3RhdGlvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIEFydGlmYWN0RGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQnJlYWtkb3duRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0JyZWFrZG93bkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYyZTZmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQnJlYWtkb3duRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQnJlYWtkb3duRWxlbWVudC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEl0IGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRBZnRlciA8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEJlZm9yZSA8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwZXJBY3Rpdml0eSA8ZW0+U3VwZXIgQWN0aXZpdHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0Q2hlY2tsaXN0IDxlbT5DaGVja2xpc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0Q29uY2VwdCA8ZW0+Q29uY2VwdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRFeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEd1aWRlbGluZSA8ZW0+R3VpZGVsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFJldXNhYmxlQXNzZXQgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFN1cHBvcnRpbmdNYXRlcmlhbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRXaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNPcHRpb25hbCA8ZW0+SXMgT3B0aW9uYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc1BsYW5uZWQgPGVtPklzIFBsYW5uZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQnJlYWtkb3duRWxlbWVudCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJyZWFrZG93bkVsZW1lbnQgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVzZW50ZWRBZnRlcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlc2VudGVkQWZ0ZXInIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlc2VudGVkQWZ0ZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQWZ0ZXIgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRBZnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlc2VudGVkQWZ0ZXIoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlc2VudGVkQmVmb3JlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlc2VudGVkQmVmb3JlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByZXNlbnRlZEJlZm9yZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRCZWZvcmUgPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZXNlbnRlZEJlZm9yZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlc2VudGVkQmVmb3JlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBsYW5uaW5nRGF0YShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfUGxhbm5pbmdEYXRhKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1BsYW5uaW5nRGF0YSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQbGFubmluZ0RhdGEoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UGxhbm5pbmdEYXRhIDxlbT5QbGFubmluZyBEYXRhPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBsYW5uaW5nRGF0YShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1cGVyIEFjdGl2aXR5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1cGVyIEFjdGl2aXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdXBlckFjdGl2aXR5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXR5KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1cGVyQWN0aXZpdHknIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U3VwZXJBY3Rpdml0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXR5IDxlbT5TdXBlciBBY3Rpdml0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3VwZXIgQWN0aXZpdHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN1cGVyQWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1cGVyQWN0aXZpdHkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAxPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAxPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0dyb3VwMSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjE4JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2hlY2tsaXN0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hlY2tsaXN0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0NoZWNrbGlzdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDaGVja2xpc3QnIGdyb3VwPScjZ3JvdXA6MTgnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldENoZWNrbGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29uY2VwdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmNlcHQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfQ29uY2VwdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb25jZXB0JyBncm91cD0nI2dyb3VwOjE4JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRDb25jZXB0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGFtcGxlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhhbXBsZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9FeGFtcGxlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4YW1wbGUnIGdyb3VwPScjZ3JvdXA6MTgnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEV4YW1wbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3VpZGVsaW5lPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3VpZGVsaW5lPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdHdWlkZWxpbmUnIGdyb3VwPScjZ3JvdXA6MTgnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEd1aWRlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfUmV1c2FibGVBc3NldCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXVzYWJsZUFzc2V0JyBncm91cD0nI2dyb3VwOjE4JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRSZXVzYWJsZUFzc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3VwcG9ydGluZ01hdGVyaWFsJyBncm91cD0nI2dyb3VwOjE4JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldoaXRlcGFwZXI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1doaXRlcGFwZXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV2hpdGVwYXBlcicgZ3JvdXA9JyNncm91cDoxOCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0V2hpdGVwYXBlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBKdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXRhaWwgVXNlIENhc2UiIHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQHNlZSAjdW5zZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICNzZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICN1bnNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBzZWUgI2lzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBzZWUgI3NldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBzZWUgI3NldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNPcHRpb25hbCgpCi0JICogQHNlZSAjdW5zZXRJc09wdGlvbmFsKCkKLQkgKiBAc2VlICNzZXRJc09wdGlvbmFsKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdpc09wdGlvbmFsJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzT3B0aW9uYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNPcHRpb25hbCgpCi0JICogQHNlZSAjdW5zZXRJc09wdGlvbmFsKCkKLQkgKiBAc2VlICNpc0lzT3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzT3B0aW9uYWwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc09wdGlvbmFsKCkKLQkgKiBAc2VlICNpc0lzT3B0aW9uYWwoKQotCSAqIEBzZWUgI3NldElzT3B0aW9uYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzT3B0aW9uYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0lzT3B0aW9uYWwgPGVtPklzIE9wdGlvbmFsPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBPcHRpb25hbDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNPcHRpb25hbCgpCi0JICogQHNlZSAjaXNJc09wdGlvbmFsKCkKLQkgKiBAc2VlICNzZXRJc09wdGlvbmFsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc09wdGlvbmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFBsYW5uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNQbGFubmVkKCkKLQkgKiBAc2VlICN1bnNldElzUGxhbm5lZCgpCi0JICogQHNlZSAjc2V0SXNQbGFubmVkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2lzUGxhbm5lZCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc1BsYW5uZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc1BsYW5uZWQgPGVtPklzIFBsYW5uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIFBsYW5uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNQbGFubmVkKCkKLQkgKiBAc2VlICN1bnNldElzUGxhbm5lZCgpCi0JICogQHNlZSAjaXNJc1BsYW5uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzUGxhbm5lZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0lzUGxhbm5lZCA8ZW0+SXMgUGxhbm5lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc1BsYW5uZWQoKQotCSAqIEBzZWUgI2lzSXNQbGFubmVkKCkKLQkgKiBAc2VlICNzZXRJc1BsYW5uZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzUGxhbm5lZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNQbGFubmVkIDxlbT5JcyBQbGFubmVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBQbGFubmVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc1BsYW5uZWQoKQotCSAqIEBzZWUgI2lzSXNQbGFubmVkKCkKLQkgKiBAc2VlICNzZXRJc1BsYW5uZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzUGxhbm5lZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAiU1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMiIHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICJTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMiIG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICJDdXN0b21lci5BcmNoaXRlY3QiIHdvdWxkIGRlZmluZSBhICJDdXN0b21lciIgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICJBcmNoaXRlY3QiIGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlZml4KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdwcmVmaXgnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlZml4KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZWZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlZml4KFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQnJlYWtkb3duRWxlbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkYzQ5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBCcmVha2Rvd24gRWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24jZ2V0VXNhZ2VHdWlkYW5jZSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVzYWdlIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBpbmZvcm1hdGlvbiBhbmQgZ3VpZGFuY2Ugb24gdGhlIG1lYW5pbmcgb2YgdGhlIEJvb2xlYW4gZmxhZyB2YWx1ZXMgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyB0aGV5IHNob3VsZCBiZSBvdmVycmlkZGVuLiBGb3IgZXhhbXBsZSwgaXQgZGVzY3JpYmVzIHdoeSB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgb3B0aW9uYWwgb3IgY29uc2lkZXJhdGlvbnMgZm9yIHJlcGVhdGluZyBpdCBhbmQgZGlmZmVyZW5jZXMgaW4gdGhlIGluZGl2aWR1YWwgb2NjdXJyZW5jZXMgb2YgdGhpcyBCcmVha2Rvd24gRWxlbWVudCBhY3Jvc3MgdGhlIGxpZmVjeWNsZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVzYWdlR3VpZGFuY2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3VzYWdlR3VpZGFuY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VXNhZ2VHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uI2dldFVzYWdlR3VpZGFuY2UgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VXNhZ2VHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXNhZ2VHdWlkYW5jZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9DYXBhYmlsaXR5UGF0dGVybi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NhcGFiaWxpdHlQYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZTcxZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NhcGFiaWxpdHlQYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENhcGFiaWxpdHlQYXR0ZXJuLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNhcGFiaWxpdHkgUGF0dGVybjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4KLSAqIEEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOgotICogLSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4KLSAqIC0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuCi0gKiAtIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENhcGFiaWxpdHlQYXR0ZXJuKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDYXBhYmlsaXR5UGF0dGVybicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENhcGFiaWxpdHlQYXR0ZXJuIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyB7Ci19IC8vIENhcGFiaWxpdHlQYXR0ZXJuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NoZWNrbGlzdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NoZWNrbGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWVkN2RmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9DaGVja2xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ2hlY2tsaXN0LmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q2hlY2tsaXN0KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDaGVja2xpc3QnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDaGVja2xpc3QgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIENoZWNrbGlzdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db21wb3NpdGVSb2xlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29tcG9zaXRlUm9sZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTMwNzQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db21wb3NpdGVSb2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbXBvc2l0ZVJvbGUuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db21wb3NpdGUgUm9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLgotICogQSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZSNnZXRBZ2dyZWdhdGVkUm9sZSA8ZW0+QWdncmVnYXRlZCBSb2xlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbXBvc2l0ZVJvbGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvbXBvc2l0ZVJvbGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21wb3NpdGVSb2xlIGV4dGVuZHMgUm9sZURlc2NyaXB0b3IgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb21wb3NpdGVSb2xlX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjMzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFnZ3JlZ2F0ZWQgUm9sZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWdncmVnYXRlZCBSb2xlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWdncmVnYXRlZCBSb2xlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FnZ3JlZ2F0ZWRSb2xlJyBncm91cD0nI2dyb3VwOjMzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8Um9sZT4gZ2V0QWdncmVnYXRlZFJvbGUoKTsKLQotfSAvLyBDb21wb3NpdGVSb2xlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbmNlcHQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db25jZXB0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYTMyMmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbmNlcHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29uY2VwdC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gR3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3Mgc2V2LWVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcy9hY3Rpdml0aWVzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29uY2VwdCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ29uY2VwdCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbmNlcHQgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIENvbmNlcHQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29uc3RyYWludC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc1NGVmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb25zdHJhaW50LmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uc3RyYWludDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgY29uZGl0aW9uIG9yIHJlc3RyaWN0aW9uIGV4cHJlc3NlZCBpbiBuYXR1cmFsIGxhbmd1YWdlIHRleHQgb3IgaW4gYSBtYWNoaW5lIHJlYWRhYmxlIGxhbmd1YWdlIGZvciB0aGUgcHVycG9zZSBvZiBkZWNsYXJpbmcgc29tZSBvZiB0aGUgc2VtYW50aWNzIG9mIGEgTWV0aG9kIEVsZW1lbnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludCNnZXRNYWluRGVzY3JpcHRpb24gPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29uc3RyYWludCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ29uc3RyYWludCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnN0cmFpbnQgZXh0ZW5kcyBNZXRob2RFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTdG9yZXMgdGhlIG1haW4gZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFpbkRlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29uc3RyYWludF9NYWluRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdtYWluRGVzY3JpcHRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25zdHJhaW50I2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYWluRGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBDb25zdHJhaW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRDYXRlZ29yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRDYXRlZ29yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWM3ODE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50Q2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudENhdGVnb3J5LmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgQ2F0ZWdvcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbiBhYnN0cmFjdCBjbGFzcyBnZW5lcmFsaXppbmcgY29udGVudCBjYXRlZ29yeSB0eXBlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRDYXRlZ29yeSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ29udGVudENhdGVnb3J5JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudENhdGVnb3J5IGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotfSAvLyBDb250ZW50Q2F0ZWdvcnkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudENhdGVnb3J5UGFja2FnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRDYXRlZ29yeVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JkNDQ1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudENhdGVnb3J5UGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgb25seSBjb250YWlucyBDb250ZW50IENhdGVnb3J5IEVsZW1lbnRzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UjZ2V0Q29udGVudENhdGVnb3J5IDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvbnRlbnRDYXRlZ29yeVBhY2thZ2UnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIGV4dGVuZHMgTWV0aG9kUGFja2FnZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MTMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGVudCBDYXRlZ29yeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250ZW50IENhdGVnb3J5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZV9Db250ZW50Q2F0ZWdvcnkoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29udGVudENhdGVnb3J5JyBncm91cD0nI2dyb3VwOjEzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8Q29udGVudENhdGVnb3J5PiBnZXRDb250ZW50Q2F0ZWdvcnkoKTsKLQotfSAvLyBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnREZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnREZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGY3NDRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50RGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnRlbnREZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQ29udGVudCBFbGVtZW50LiAgSXQgZGVmaW5lcyBzdGFuZGFyZCBhdHRyaWJ1dGVzIGFwcGxpY2FibGUgZm9yIGFsbCBDb250ZW50IEVsZW1lbnQgdHlwZXMuICBTcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgc3ViLXR5cGVzIGNhbiBkZWZpbmUgdGhlaXIgb3duIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gc3ViLXR5cGVzLiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0S2V5Q29uc2lkZXJhdGlvbnMgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldFNlY3Rpb24gPGVtPlNlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvbnRlbnREZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnREZXNjcmlwdGlvbiBleHRlbmRzIE1ldGhvZFVuaXQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFN0b3JlcyB0aGUgbWFpbiBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgQ29udGVudCBFbGVtZW50LiAgQWxsIHRleHQgdGhhdCBpcyBub3QgcGFydCBvZiBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgYXR0cmlidXRlcyBzaGFsbCBiZSBzdG9yZWQgaGVyZS4gIElmIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGlzIGRpdmlkZWQgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgU2VjdGlvbiBjbGFzcywgdGhlbiBvbmx5IHRoZSB0ZXh0IGZyb20gdGhlICdzdGFydCcgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gdG8gdGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBzdG9yZWQgaGVyZSAoc2ltaWxhciB0byBhIG5vcm1hbCBkb2N1bWVudCB3aGVyZSB5b3UgY2FuIHBsYWNlIHRleHQgYmV0d2VlbiBpdHMgYmVnaW5uaW5nIHRvIGl0cyBmaXJzdCBkaWN0aW9uIGhlYWRpbmcpLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYWluRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01haW5EZXNjcmlwdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYWluRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRNYWluRGVzY3JpcHRpb24gPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFpbkRlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGFkdmlzZSBhbmQgZ3VpZGFuY2Ugb2YgYSBjcml0aWNhbCBuYXR1cmUgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbCBhcyB3YXJuaW5ncywgY2F1dGlvbnMsIHBpdGZhbGxzLCBkYW5nZXJzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEtleUNvbnNpZGVyYXRpb25zKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0tleUNvbnNpZGVyYXRpb25zJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEtleUNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0S2V5Q29uc2lkZXJhdGlvbnMgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRLZXlDb25zaWRlcmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0S2V5Q29uc2lkZXJhdGlvbnMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlY3Rpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTZWN0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U2VjdGlvbj4gZ2V0U2VjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhcnRpZmFjdC4gVXNlZCBsaWtlIGEgc3lub255bS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgSWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEV4dGVybmFsSWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2V4dGVybmFsSWQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RXh0ZXJuYWxJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEV4dGVybmFsSWQgPGVtPkV4dGVybmFsIElkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBJZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXh0ZXJuYWxJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXh0ZXJuYWxJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIENvbnRlbnREZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50RWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMDYyOGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb250ZW50RWxlbWVudC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LgotICogQ29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldENoZWNrbGlzdCA8ZW0+Q2hlY2tsaXN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRDb25jZXB0IDxlbT5Db25jZXB0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRFeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRHdWlkZWxpbmUgPGVtPkd1aWRlbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0UmV1c2FibGVBc3NldCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFN1cHBvcnRpbmdNYXRlcmlhbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0V2hpdGVwYXBlciA8ZW0+V2hpdGVwYXBlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb250ZW50RWxlbWVudCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRFbGVtZW50IGV4dGVuZHMgRGVzY3JpYmFibGVFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfR3JvdXAxKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MTQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DaGVja2xpc3Q8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGVja2xpc3Q8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDaGVja2xpc3QnIGdyb3VwPScjZ3JvdXA6MTQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldENoZWNrbGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29uY2VwdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmNlcHQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0NvbmNlcHQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29uY2VwdCcgZ3JvdXA9JyNncm91cDoxNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0Q29uY2VwdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhhbXBsZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4YW1wbGU8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0V4YW1wbGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXhhbXBsZScgZ3JvdXA9JyNncm91cDoxNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0RXhhbXBsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HdWlkZWxpbmU8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HdWlkZWxpbmU8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdHdWlkZWxpbmUnIGdyb3VwPScjZ3JvdXA6MTQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEd1aWRlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X1JldXNhYmxlQXNzZXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmV1c2FibGVBc3NldCcgZ3JvdXA9JyNncm91cDoxNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0UmV1c2FibGVBc3NldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdXBwb3J0aW5nTWF0ZXJpYWwnIGdyb3VwPScjZ3JvdXA6MTQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V2hpdGVwYXBlcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldoaXRlcGFwZXI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X1doaXRlcGFwZXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV2hpdGVwYXBlcicgZ3JvdXA9JyNncm91cDoxNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0V2hpdGVwYXBlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJuYSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQHNlZSAjaXNTZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJuYSIgdW5zZXR0YWJsZT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2YXJpYWJpbGl0eVR5cGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlWYXJpYWJpbGl0eVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQHNlZSAjaXNTZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFZhcmlhYmlsaXR5VHlwZSgpOwotCi19IC8vIENvbnRlbnRFbGVtZW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRQYWNrYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhlZmFiNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudFBhY2thZ2UuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2UjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50IDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudFBhY2thZ2UoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvbnRlbnRQYWNrYWdlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudFBhY2thZ2UgZXh0ZW5kcyBNZXRob2RQYWNrYWdlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudFBhY2thZ2VfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MTMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGVudCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb250ZW50RWxlbWVudCcgZ3JvdXA9JyNncm91cDoxMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PENvbnRlbnRFbGVtZW50PiBnZXRDb250ZW50RWxlbWVudCgpOwotCi19IC8vIENvbnRlbnRQYWNrYWdlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0N1c3RvbUNhdGVnb3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ3VzdG9tQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEzOTg4NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ3VzdG9tQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ3VzdG9tQ2F0ZWdvcnkuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DdXN0b20gQ2F0ZWdvcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgIlRlc3RpbmciIGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5I2dldENhdGVnb3JpemVkRWxlbWVudCA8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0U3ViQ2F0ZWdvcnkgPGVtPlN1YiBDYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDdXN0b21DYXRlZ29yeSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ3VzdG9tQ2F0ZWdvcnknIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDdXN0b21DYXRlZ29yeSBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEN1c3RvbUNhdGVnb3J5X0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhdGVnb3JpemVkIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhdGVnb3JpemVkIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXRlZ29yaXplZCBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ2F0ZWdvcml6ZWRFbGVtZW50JyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRDYXRlZ29yaXplZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YiBDYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIENhdGVnb3J5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIENhdGVnb3J5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yeSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdWJDYXRlZ29yeScgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0U3ViQ2F0ZWdvcnkoKTsKLQotfSAvLyBDdXN0b21DYXRlZ29yeQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyYWJsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4Zjc3MjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlbGl2ZXJhYmxlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcmFibGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlI2dldERlbGl2ZXJlZFdvcmtQcm9kdWN0IDxlbT5EZWxpdmVyZWQgV29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEZWxpdmVyYWJsZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlbGl2ZXJhYmxlIGV4dGVuZHMgV29ya1Byb2R1Y3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyYWJsZV9Hcm91cDMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDozMCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWxpdmVyZWQgV29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWxpdmVyZWQgV29yayBQcm9kdWN0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVsaXZlcmVkV29ya1Byb2R1Y3QnIGdyb3VwPScjZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldERlbGl2ZXJlZFdvcmtQcm9kdWN0KCk7Ci0KLX0gLy8gRGVsaXZlcmFibGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc1NmM5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZWxpdmVyYWJsZURlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGdlbmVyYWxpemVkIFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcmFibGUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRFeHRlcm5hbERlc2NyaXB0aW9uIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRQYWNrYWdpbmdHdWlkYW5jZSA8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZWxpdmVyYWJsZURlc2NyaXB0aW9uIGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXh0ZXJuYWxEZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeHRlcm5hbERlc2NyaXB0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEV4dGVybmFsRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbiA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeHRlcm5hbERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYWNrYWdpbmcgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGd1aWRhbmNlIG9uIGhvdyB0byBhc3NlbWJsZSB0aGUgZGVsaXZlcmFibGUgZnJvbSBhbGwgaXRzIHJlcXVpcmVkIGlucHV0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgY29tbW9uIGNvbnRlbnQgbWVkaXVtIGFuZCBmb3JtYXQuICBEaXN0cmlidXRpb24gb2YgdGhlIGRlbGl2ZXJhYmxlIGlzIGFkZHJlc3NlZCBpbiB0aGlzIHNlY3Rpb24sIGlmIG5lY2Vzc2FyeS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYWNrYWdpbmdHdWlkYW5jZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGFja2FnaW5nR3VpZGFuY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGFja2FnaW5nR3VpZGFuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0UGFja2FnaW5nR3VpZGFuY2UgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFja2FnaW5nR3VpZGFuY2UoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJ5UHJvY2Vzcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJ5UHJvY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTQ0YzkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyeVByb2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVsaXZlcnlQcm9jZXNzLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2VzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLgotICogQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzI2dldEdyb3VwNCA8ZW0+R3JvdXA0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3MjZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbCA8ZW0+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRFZHVjYXRpb25NYXRlcmlhbCA8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2VzcygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGVsaXZlcnlQcm9jZXNzJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsaXZlcnlQcm9jZXNzIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc19Hcm91cDQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDo0NyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXA0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWw8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29tbXVuaWNhdGlvbnNNYXRlcmlhbCcgZ3JvdXA9JyNncm91cDo0NyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWR1Y2F0aW9uIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FZHVjYXRpb24gTWF0ZXJpYWw8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FZHVjYXRpb24gTWF0ZXJpYWw8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFZHVjYXRpb25NYXRlcmlhbCcgZ3JvdXA9JyNncm91cDo0NyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0RWR1Y2F0aW9uTWF0ZXJpYWwoKTsKLQotfSAvLyBEZWxpdmVyeVByb2Nlc3MKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTA2YzY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBQcm9jZXNzIERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyeSBQcm9jZXNzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjYWxlIDxlbT5TY2FsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFJpc2tMZXZlbCA8ZW0+UmlzayBMZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UgPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0VHlwZU9mQ29udHJhY3QgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gZXh0ZW5kcyBQcm9jZXNzRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBPdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTY2FsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NjYWxlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNjYWxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY2FsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2NhbGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBDaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmlzayBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogT3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmlzayBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Umlza0xldmVsKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jpc2tMZXZlbCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSaXNrTGV2ZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFJpc2tMZXZlbCA8ZW0+UmlzayBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmlzayBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Umlza0xldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSaXNrTGV2ZWwoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXN0aW1hdGluZ1RlY2huaXF1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGluZ1RlY2huaXF1ZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVzdGltYXRpbmdUZWNobmlxdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVzdGltYXRpbmdUZWNobmlxdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJvamVjdE1lbWJlckV4cGVydGlzZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJvamVjdE1lbWJlckV4cGVydGlzZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvamVjdE1lbWJlckV4cGVydGlzZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBPZiBDb250cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29JJ20gY2hhSSdtIG50cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGVPZkNvbnRyYWN0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fVHlwZU9mQ29udHJhY3QoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVHlwZU9mQ29udHJhY3QnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZU9mQ29udHJhY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFR5cGVPZkNvbnRyYWN0IDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlT2ZDb250cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZU9mQ29udHJhY3QoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZXNjcmliYWJsZUVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZXNjcmliYWJsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIzODlhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpYmFibGVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZXNjcmliYWJsZUVsZW1lbnQuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmliYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgTWV0aG9kIEVsZW1lbnRzIGZvciB3aGljaCBleHRlcm5hbCBwcmVzZW50YXRpb24gbmFtZXMgYXMgd2VsbCBhcyBjb250ZW50IGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCwgc3VjaCBhcyBSb2xlcyBvciBXb3JrIFByb2R1Y3RzLiAgUHJlc2VudGF0aW9uIE5hbWUgYW5kIENvbnRlbnQgRGVzY3JpcHRpb25zIGFyZSB0eXBpY2FsbHkgbG9jYWxpemVkIHVzaW5nIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIGl0cyBTdHJpbmcgdHlwZSBhdHRyaWJ1dGVzLgotICogVGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlLiAgRGVzY3JpYmFibGUgRWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGJlIHB1Ymxpc2hlZCBpbiBtZXRob2Qgb3IgcHJvY2VzcyBwdWJsaWNhdGlvbnMgKHNpbWlsYXIgdG8gdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3Mgd2ViKS4gIERlc2NyaWJhYmxlIEVsZW1lbnQgZGVmaW5lcyB0aGF0IHRoZSBlbGVtZW50IGl0IHJlcHJlc2VudHMgd2lsbCBoYXZlIGNvbnRlbnQgJ2F0dGFjaGVkJyB0byBpdC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgdGhlIGFic3RyYWN0aW9uIGZvciB0aGUgYWN0dWFsIHBsYWNlcyBpbiB3aGljaCB0aGUgY29udGVudCBpcyBiZWluZyByZXByZXNlbnRlZC4gIFRoaXMgc2VwYXJhdGlvbiBhbGxvd3MgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGNvcmUgbWV0aG9kIG1vZGVsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwgZnJvbSB0aGUgYWN0dWFsIGRlc2NyaXB0aW9uIGNvbnRhaW5lciBwcm92aWRpbmcsIGZvciBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29udGVudCBlbGVtZW50IGluIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMgbGFuZ3VhZ2VzLCBhdWRpZW5jZXMsIGxpY2Vuc2luZyBsZXZlbHMsIGV0Yy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRGdWxmaWxsIDxlbT5GdWxmaWxsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjaXNJc0Fic3RyYWN0IDxlbT5JcyBBYnN0cmFjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldE5vZGVpY29uIDxlbT5Ob2RlaWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFNoYXBlaWNvbiA8ZW0+U2hhcGVpY29uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGVzY3JpYmFibGVFbGVtZW50JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVzY3JpYmFibGVFbGVtZW50IGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmVzZW50YXRpb24oQ29udGVudERlc2NyaXB0aW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZXNlbnRhdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbnRlbnREZXNjcmlwdGlvbiBnZXRQcmVzZW50YXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRhdGlvbihDb250ZW50RGVzY3JpcHRpb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RnVsZmlsbDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZ1bGZpbGw8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaWJhYmxlRWxlbWVudF9GdWxmaWxsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Z1bGZpbGwnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEZ1bGZpbGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBBYnN0cmFjdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBBYnN0cmFjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0Fic3RyYWN0KCkKLQkgKiBAc2VlICN1bnNldElzQWJzdHJhY3QoKQotCSAqIEBzZWUgI3NldElzQWJzdHJhY3QoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVzY3JpYmFibGVFbGVtZW50X0lzQWJzdHJhY3QoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naXNBYnN0cmFjdCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc0Fic3RyYWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjaXNJc0Fic3RyYWN0IDxlbT5JcyBBYnN0cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgQWJzdHJhY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNBYnN0cmFjdCgpCi0JICogQHNlZSAjdW5zZXRJc0Fic3RyYWN0KCkKLQkgKiBAc2VlICNpc0lzQWJzdHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzQWJzdHJhY3QoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNpc0lzQWJzdHJhY3QgPGVtPklzIEFic3RyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzQWJzdHJhY3QoKQotCSAqIEBzZWUgI2lzSXNBYnN0cmFjdCgpCi0JICogQHNlZSAjc2V0SXNBYnN0cmFjdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNBYnN0cmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjaXNJc0Fic3RyYWN0IDxlbT5JcyBBYnN0cmFjdDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgQWJzdHJhY3Q8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzQWJzdHJhY3QoKQotCSAqIEBzZWUgI2lzSXNBYnN0cmFjdCgpCi0JICogQHNlZSAjc2V0SXNBYnN0cmFjdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNBYnN0cmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB0cmVlIGJyb3dzZXIgcHJlc2VudGF0aW9ucyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5vZGVpY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROb2RlaWNvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J25vZGVpY29uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5vZGVpY29uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0Tm9kZWljb24gPGVtPk5vZGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob2RlaWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Tm9kZWljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5vZGVpY29uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2hhcGVpY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTaGFwZWljb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nc2hhcGVpY29uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNoYXBlaWNvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFNoYXBlaWNvbiA8ZW0+U2hhcGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TaGFwZWljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNoYXBlaWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2hhcGVpY29uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRGVzY3JpYmFibGVFbGVtZW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MWZjYjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVzY3JpcHRvci5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuCi0gKiBEZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaXB0b3IoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Rlc2NyaXB0b3InIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZXNjcmlwdG9yIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI3NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI3Vuc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI3NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLX0gLy8gRGVzY3JpcHRvcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZXNjcmlwdG9yRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZXNjcmlwdG9yRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkZmE0Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpcHRvckRlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlc2NyaXB0b3JEZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGdlbmVyYWxpemVkIEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZXNjcmlwdG9yLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiNnZXRSZWZpbmVkRGVzY3JpcHRpb24gPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEZXNjcmlwdG9yRGVzY3JpcHRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZXNjcmlwdG9yRGVzY3JpcHRpb24gZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmluZWQgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgRGVzY3JpcHRvciBtaWdodCBhZGQgcmVmaW5lbWVudHMgdG8gdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgdGhlIENvbnRlbnQgRWxlbWVudCBpdCByZWZlcnMgdG8uICBGb3IgZXhhbXBsZSwgaXQgY291bGQgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgV29yayBQcm9kdWN0IHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWMgcG9pbnQgaW4gdGltZSBpbiB0aGUgcHJvY2VzcyB0aGlzIFdvcmsgUHJvZHVjdCB0eXBlIGlzIGJlaW5nIHVzZWQuICBJdCBjb3VsZCBkZXNjcmliZSBhZGRpdGlvbmFsIHNraWxscyBuZWVkZWQgZm9yIGEgUm9sZSBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiBhIHByb2Nlc3MsIGV0Yy4gCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlZmluZWREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVmaW5lZERlc2NyaXB0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlZmluZWREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uI2dldFJlZmluZWREZXNjcmlwdGlvbiA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWZpbmVkRGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEZXNjcmlwdG9yRGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGlzY2lwbGluZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rpc2NpcGxpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE2OGE4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGlzY2lwbGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGlzY2lwbGluZS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc2NpcGxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGNhdGVnb3JpemF0aW9uIG9mIHdvcmsgKGkuZS4gVGFza3MgZm9yIE1ldGhvZCBDb250ZW50KSwgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4KLSAqIEEgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFRhc2sgPGVtPlRhc2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmUjZ2V0U3ViRGlzY2lwbGluZSA8ZW0+U3ViIERpc2NpcGxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmUjZ2V0UmVmZXJlbmNlV29ya2Zsb3cgPGVtPlJlZmVyZW5jZSBXb3JrZmxvdzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEaXNjaXBsaW5lJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGlzY2lwbGluZSBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFzazwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFzazwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVfVGFzaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUYXNrJyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRUYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWIgRGlzY2lwbGluZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIERpc2NpcGxpbmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWIgRGlzY2lwbGluZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZV9TdWJEaXNjaXBsaW5lKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1YkRpc2NpcGxpbmUnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxEaXNjaXBsaW5lPiBnZXRTdWJEaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZlcmVuY2UgV29ya2Zsb3c8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZmVyZW5jZSBXb3JrZmxvdzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZSBXb3JrZmxvdzwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvdygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZWZlcmVuY2VXb3JrZmxvdycgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0UmVmZXJlbmNlV29ya2Zsb3coKTsKLQotfSAvLyBEaXNjaXBsaW5lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rpc2NpcGxpbmVHcm91cGluZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rpc2NpcGxpbmVHcm91cGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmFlYmNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EaXNjaXBsaW5lR3JvdXBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGlzY2lwbGluZUdyb3VwaW5nLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzY2lwbGluZSBHcm91cGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFVzZWQgdG8gZ3JvdXAgRGlzY2lwbGluZXMuICBGb3IgZXhhbXBsZSwgdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgIlNvZnR3YXJlIERpc2NpcGxpbmVzIiB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICJSZXF1aXJlbWVudHMgTWFuYWdlbWVudCIgb3IgIlRlc3RpbmciOyAiSVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCIgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAiSVQgT3BlcmF0aW9uYWwgU2VydmljZXMiLCAiSVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyIsIG9yICJJVCBFbmFibGluZyBTZXJ2aWNlcyIuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcjZ2V0RGlzY2lwbGluZSA8ZW0+RGlzY2lwbGluZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lR3JvdXBpbmcoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Rpc2NpcGxpbmVHcm91cGluZycga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpc2NpcGxpbmVHcm91cGluZyBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVHcm91cGluZ19Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNjaXBsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNjaXBsaW5lPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzY2lwbGluZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGlzY2lwbGluZScgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0RGlzY2lwbGluZSgpOwotCi19IC8vIERpc2NpcGxpbmVHcm91cGluZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Eb2N1bWVudFJvb3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Eb2N1bWVudFJvb3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg1NWMzYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRG9jdW1lbnRSb290LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEb2N1bWVudFJvb3QuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RG9jdW1lbnQgUm9vdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kTGlicmFyeSA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RQbHVnaW4gPGVtPk1ldGhvZCBQbHVnaW48L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RG9jdW1lbnRSb290KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPScnIGtpbmQ9J21peGVkJyIKLSAqIEBleHRlbmRzIEVEYXRhT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9jdW1lbnRSb290IGV4dGVuZHMgRURhdGFPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1peGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NaXhlZDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1peGVkPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb2N1bWVudFJvb3RfTWl4ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnRXaWxkY2FyZCcgbmFtZT0nOm1peGVkJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRNaXhlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwLgotCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicgbWFwIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+JyBtYXAuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERvY3VtZW50Um9vdF9YTUxOU1ByZWZpeE1hcCgpCi0JICogQG1vZGVsIG1hcFR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeTxvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJpbmc+IiB0cmFuc2llbnQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0neG1sbnM6cHJlZml4JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRU1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0WE1MTlNQcmVmaXhNYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcC4KLQkgKiBUaGUga2V5IGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIGFuZCB0aGUgdmFsdWUgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nIG1hcCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicgbWFwLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBtb2RlbCBtYXBUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnk8b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RyaW5nPiIgdHJhbnNpZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3hzaTpzY2hlbWFMb2NhdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFhTSVNjaGVtYUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgQ29uZmlndXJhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERvY3VtZW50Um9vdF9NZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHVwcGVyPSItMiIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kQ29uZmlndXJhdGlvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBMaWJyYXJ5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X01ldGhvZExpYnJhcnkoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdXBwZXI9Ii0yIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNZXRob2RMaWJyYXJ5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kTGlicmFyeSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kTGlicmFyeSA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRNZXRob2RMaWJyYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBzcGVjaWFsIE1ldGhvZCBVbml0IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLQkgKiBNZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4KLQkgKiBTcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRNZXRob2RQbHVnaW4oTWV0aG9kUGx1Z2luKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb2N1bWVudFJvb3RfTWV0aG9kUGx1Z2luKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHVwcGVyPSItMiIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kUGx1Z2luJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kUGx1Z2luIGdldE1ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZFBsdWdpbiA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXRob2RQbHVnaW4oTWV0aG9kUGx1Z2luIHZhbHVlKTsKLQotfSAvLyBEb2N1bWVudFJvb3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRG9tYWluLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRG9tYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZjU1MjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RvbWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEb21haW4uamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb21haW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4KLSAqIERvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4jZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluI2dldFN1YmRvbWFpbiA8ZW0+U3ViZG9tYWluPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERvbWFpbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRG9tYWluJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9tYWluIGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RG9tYWluX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb21haW5fV29ya1Byb2R1Y3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV29ya1Byb2R1Y3QnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFdvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWJkb21haW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViZG9tYWluPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViZG9tYWluPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb21haW5fU3ViZG9tYWluKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1YmRvbWFpbicgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PERvbWFpbj4gZ2V0U3ViZG9tYWluKCk7Ci0KLX0gLy8gRG9tYWluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2Njk5YjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRWxlbWVudC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RWxlbWVudCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRWxlbWVudCcga2luZD0nZW1wdHknIgotICogQGV4dGVuZHMgRURhdGFPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFbGVtZW50IGV4dGVuZHMgRURhdGFPYmplY3QgewotfSAvLyBFbGVtZW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VzdGltYXRlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXN0aW1hdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM4ZjAzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXN0aW1hdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXN0aW1hdGUuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHByb3ZpZGVzIHNpemluZyBtZWFzdXJlcywgb3Igc3RhbmRhcmRzIGZvciBzaXppbmcgdGhlIHdvcmsgZWZmb3J0IGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIGEgcGFydGljdWxhciBwaWVjZSBvZiB3b3JrIGFuZCBpbnN0cnVjdGlvbnMgZm9yIHRoZWlyIHN1Y2Nlc3NmdWwgdXNlLiBJdCBtYXkgYmUgY29tcHJpc2VkIG9mIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbnMgYW5kIGVzdGltYXRpb24gbWV0cmljcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGUjZ2V0RXN0aW1hdGlvbk1ldHJpYyA8ZW0+RXN0aW1hdGlvbiBNZXRyaWM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRFc3RpbWF0ZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXN0aW1hdGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFc3RpbWF0ZSBleHRlbmRzIEd1aWRhbmNlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RXN0aW1hdGVfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBNZXRyaWM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gTWV0cmljPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBNZXRyaWM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEVzdGltYXRlX0VzdGltYXRpb25NZXRyaWMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGlvbk1ldHJpYycgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0RXN0aW1hdGlvbk1ldHJpYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEVzdGltYXRlX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi19IC8vIEVzdGltYXRlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VzdGltYXRpbmdNZXRyaWMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Fc3RpbWF0aW5nTWV0cmljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNDlhOWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VzdGltYXRpbmdNZXRyaWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXN0aW1hdGluZ01ldHJpYy5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Fc3RpbWF0aW5nIE1ldHJpYzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IGRlc2NyaWJlcyBhIG1ldHJpYyBvciBtZWFzdXJlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGVsZW1lbnQgYW5kIHdoaWNoIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSB3b3JrIGVmZm9ydCBhcyB3ZWxsIGFzIGEgcmFuZ2Ugb2YgcG90ZW50aWFsIGxhYm9yLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RXN0aW1hdGluZ01ldHJpYygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXN0aW1hdGluZ01ldHJpYycga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVzdGltYXRpbmdNZXRyaWMgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIEVzdGltYXRpbmdNZXRyaWMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYmUyYmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHF1YWxpZmllcyB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9FeGFtcGxlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXhhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmIyMDRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9FeGFtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4YW1wbGUuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSB0eXBpY2FsLCBwYXJ0aWFsbHkgY29tcGxldGVkLCBzYW1wbGUgaW5zdGFuY2Ugb2Ygb25lIG9yIG1vcmUgd29yayBwcm9kdWN0cyBvciBzY2VuYXJpbyBsaWtlIGRlc2NyaXB0aW9ucyBvZiBob3cgVGFzayBtYXkgYmUgcGVyZm9ybWVkLiBFeGFtcGxlcyBjYW4gYmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3RzIGFzIHdlbGwgYXMgVGFza3MgdGhhdCBwcm9kdWNlIHRoZW0gYXMgd2VsbCBhcyBhbnkgb3RoZXIgQ29udGVudCBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RXhhbXBsZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXhhbXBsZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4YW1wbGUgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIEV4YW1wbGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvR3VpZGFuY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9HdWlkYW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTFkMDExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9HdWlkYW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBHdWlkYW5jZS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HdWlkYW5jZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0R3VpZGFuY2UoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0d1aWRhbmNlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3VpZGFuY2UgZXh0ZW5kcyBDb250ZW50RWxlbWVudCB7Ci19IC8vIEd1aWRhbmNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0d1aWRhbmNlRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9HdWlkYW5jZURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMDRkY2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0d1aWRhbmNlRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogR3VpZGFuY2VEZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBHdWlkYW5jZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uI2dldEF0dGFjaG1lbnQgPGVtPkF0dGFjaG1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nR3VpZGFuY2VEZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEd1aWRhbmNlRGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dGFjaG1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0YWNobWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXR0YWNobWVudChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdHRhY2htZW50JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEF0dGFjaG1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24jZ2V0QXR0YWNobWVudCA8ZW0+QXR0YWNobWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0YWNobWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0YWNobWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXR0YWNobWVudChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEd1aWRhbmNlRGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvR3VpZGVsaW5lLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvR3VpZGVsaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYjkwNjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0d1aWRlbGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBHdWlkZWxpbmUuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEd1aWRlbGluZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nR3VpZGVsaW5lJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3VpZGVsaW5lIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBHdWlkZWxpbmUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvSXRlcmF0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvSXRlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZDg1YjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0l0ZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBJdGVyYXRpb24uamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SXRlcmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIEFjdGl2aXR5IHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotICogSXRlcmF0aW9uIGdyb3VwcyBhIHNldCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEl0IHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbiByZXBldGl0aXZlIGN5Y2xlcy4gIFRoZSBjb25jZXB0IG9mIEl0ZXJhdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCBydWxlcyBpbiBkaWZmZXJlbnQgbWV0aG9kcy4gIEZvciBleGFtcGxlLCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBtZXRob2QgZnJhbWV3b3JrIChSVVApIGRlZmluZXMgYSBydWxlIHRoYXQgSXRlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gc3BhbiBhY3Jvc3MgUGhhc2VzLiAgSW4gY29udHJhc3QgSUJNIEdsb2JhbCBTZXJ2aWNlcyBNZXRob2QgKEdTTWV0aG9kKSBiYXNlZCBtZXRob2QgZnJhbWV3b3JrcyB0aGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgYW5kIEl0ZXJhdGlvbiBjYW4gYmUgZGVmaW5lZCB3aGljaCBuZXN0IFBoYXNlcy4gIFJ1bGVzIGxpa2UgdGhlc2UsIHdoaWNoIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGVuZm9yY2VkIGJ5IHRoaXMgbWV0YS1tb2RlbC4gIEluc3RlYWQsIHByb2Nlc3MgYXV0aG9ycyBhcmUgZXhwZWN0ZWQgdG8gZm9sbG93IGFuZCBjaGVjayB0aGVzZSBydWxlcyBtYW51YWxseS4gIChOb3RlOiBBbnkgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGJlIHJlcGVhdGVkOyBob3dldmVyLCBJdGVyYXRpb25zIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYSBzcGVjaWFsIG1ldGEtbW9kZWwgY29uY2VwdCwgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW50IHJvbGUgZm9yIG1hbnkgbWV0aG9kcy4pCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRJdGVyYXRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0l0ZXJhdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEl0ZXJhdGlvbiBleHRlbmRzIEFjdGl2aXR5IHsKLX0gLy8gSXRlcmF0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0tpbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9LaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNjk3NTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0tpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogS2luZC5qYXZhLHYgMS4xIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5LaW5kPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLktpbmQjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8gPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEtpbmQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0tpbmQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBLaW5kIGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRLaW5kX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpOwotCi19IC8vIEtpbmQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RDb25maWd1cmF0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGI5NzM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RDb25maWd1cmF0aW9uLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRCYXNlQ29uZmlndXJhdGlvbiA8ZW0+QmFzZSBDb25maWd1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBsdWdpblNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldERlZmF1bHRWaWV3IDxlbT5EZWZhdWx0IFZpZXc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0UHJvY2Vzc1ZpZXcgPGVtPlByb2Nlc3MgVmlldzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkgPGVtPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0QWRkZWRDYXRlZ29yeSA8ZW0+QWRkZWQgQ2F0ZWdvcnk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTWV0aG9kQ29uZmlndXJhdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBNZXRob2RVbml0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgQ29uZmlndXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgQ29uZmlndXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCYXNlQ29uZmlndXJhdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0QmFzZUNvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNZXRob2RQbHVnaW5TZWxlY3Rpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNZXRob2RQYWNrYWdlU2VsZWN0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IFZpZXc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlZmF1bHQgVmlldzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFZpZXc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlZmF1bHRWaWV3KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZWZhdWx0VmlldyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0VmlldygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXREZWZhdWx0VmlldyA8ZW0+RGVmYXVsdCBWaWV3PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFZpZXc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlZmF1bHRWaWV3KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0VmlldyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvY2VzcyBWaWV3PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9jZXNzIFZpZXc8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9jZXNzIFZpZXc8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXcoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJvY2Vzc1ZpZXcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFByb2Nlc3NWaWV3KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWJ0cmFjdGVkIENhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VidHJhY3RlZCBDYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9TdWJ0cmFjdGVkQ2F0ZWdvcnkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3VidHJhY3RlZENhdGVnb3J5JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkZGVkIENhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkZGVkIENhdGVnb3J5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWRkZWRDYXRlZ29yeSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0QWRkZWRDYXRlZ29yeSgpOwotCi19IC8vIE1ldGhvZENvbmZpZ3VyYXRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE4MWE2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kRWxlbWVudC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgTWV0aG9kIEVsZW1lbnRzLiAgRGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRPd25lZFJ1bGUgPGVtPk93bmVkIFJ1bGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5IDxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRCcmllZkRlc2NyaXB0aW9uIDxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3JkZXJpbmdHdWlkZSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uTmFtZSA8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjaXNTdXBwcmVzc2VkIDxlbT5TdXBwcmVzc2VkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01ldGhvZEVsZW1lbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RFbGVtZW50IGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9Hcm91cCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZWZpbmVzIHRoZSBwYWNrYWdpbmcgcnVsZXMgZm9yIHRoaXMgTWV0aG9kIEVsZW1lbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk93bmVkIFJ1bGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfT3duZWRSdWxlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J093bmVkUnVsZScgZ3JvdXA9JyNncm91cDoxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8Q29uc3RyYWludD4gZ2V0T3duZWRSdWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNZXRob2RFbGVtZW50UHJvcGVydHknIGdyb3VwPScjZ3JvdXA6MSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PE1ldGhvZEVsZW1lbnRQcm9wZXJ0eT4gZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJyaWVmRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdicmllZkRlc2NyaXB0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0QnJpZWZEZXNjcmlwdGlvbiA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRCcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCcmllZkRlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9JZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2lkJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPcmRlcmluZ0d1aWRlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nb3JkZXJpbmdHdWlkZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRPcmRlcmluZ0d1aWRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldE9yZGVyaW5nR3VpZGUgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlcmluZyBHdWlkZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3JkZXJpbmdHdWlkZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3JkZXJpbmdHdWlkZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAicnVwX2FyY2hpdGVjdHVyZV9kb2N1bWVudCIgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgImoyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQiIHdoZXJlYXMgdGhlIGV4dGVybmFsIHByZXNlbnRhdGlvbiB3b3VsZCBhbHdheXMgYmUgIkFyY2hpdGVjdHVyZSBEb2N1bWVudCIuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVzZW50YXRpb25OYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ncHJlc2VudGF0aW9uTmFtZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlc2VudGF0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlc2VudGF0aW9uTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlICJleHRlbmRzIiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiwgdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwcHJlc3NlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTdXBwcmVzc2VkKCkKLQkgKiBAc2VlICN1bnNldFN1cHByZXNzZWQoKQotCSAqIEBzZWUgI3NldFN1cHByZXNzZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9TdXBwcmVzc2VkKCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3N1cHByZXNzZWQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU3VwcHJlc3NlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNpc1N1cHByZXNzZWQgPGVtPlN1cHByZXNzZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1cHByZXNzZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U3VwcHJlc3NlZCgpCi0JICogQHNlZSAjdW5zZXRTdXBwcmVzc2VkKCkKLQkgKiBAc2VlICNpc1N1cHByZXNzZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1cHByZXNzZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjaXNTdXBwcmVzc2VkIDxlbT5TdXBwcmVzc2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFN1cHByZXNzZWQoKQotCSAqIEBzZWUgI2lzU3VwcHJlc3NlZCgpCi0JICogQHNlZSAjc2V0U3VwcHJlc3NlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U3VwcHJlc3NlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2lzU3VwcHJlc3NlZCA8ZW0+U3VwcHJlc3NlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwcHJlc3NlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0U3VwcHJlc3NlZCgpCi0JICogQHNlZSAjaXNTdXBwcmVzc2VkKCkKLQkgKiBAc2VlICNzZXRTdXBwcmVzc2VkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRTdXBwcmVzc2VkKCk7Ci0KLX0gLy8gTWV0aG9kRWxlbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RFbGVtZW50UHJvcGVydHkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RFbGVtZW50UHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM0MzIxNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kRWxlbWVudFByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZEVsZW1lbnRQcm9wZXJ0eS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNZXRob2RFbGVtZW50UHJvcGVydHknIGtpbmQ9J2VtcHR5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RFbGVtZW50UHJvcGVydHkgZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50UHJvcGVydHlfVmFsdWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2YWx1ZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RMaWJyYXJ5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2YwZjcwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZExpYnJhcnkuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIExpYnJhcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldE1ldGhvZFBsdWdpbiA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeSNnZXRNZXRob2RDb25maWd1cmF0aW9uIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeSNnZXRUb29sIDxlbT5Ub29sPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZExpYnJhcnkoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01ldGhvZExpYnJhcnknIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RMaWJyYXJ5IGV4dGVuZHMgTWV0aG9kVW5pdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW4oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kUGx1Z2luJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8TWV0aG9kUGx1Z2luPiBnZXRNZXRob2RQbHVnaW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RMaWJyYXJ5X01ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kQ29uZmlndXJhdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvb2w8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRvb2w8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRvb2wgdGhhdCBnZW5lcmF0ZWQgdGhlIFhNTCBmaWxlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUb29sKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kTGlicmFyeV9Ub29sKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ndG9vbCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUb29sKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldFRvb2wgPGVtPlRvb2w8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRvb2w8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRvb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRvb2woU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBNZXRob2RMaWJyYXJ5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZFBhY2thZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOWRlZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZFBhY2thZ2UuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRSZXVzZWRQYWNrYWdlIDxlbT5SZXVzZWQgUGFja2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNpc0dsb2JhbCA8ZW0+R2xvYmFsPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBhY2thZ2UoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01ldGhvZFBhY2thZ2UnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RQYWNrYWdlIGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBhY2thZ2VfR3JvdXAxKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6OSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmV1c2VkIFBhY2thZ2U8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXVzZWQgUGFja2FnZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JldXNlZFBhY2thZ2UnIGdyb3VwPScjZ3JvdXA6OSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0UmV1c2VkUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBhY2thZ2VfTWV0aG9kUGFja2FnZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNZXRob2RQYWNrYWdlJyBncm91cD0nI2dyb3VwOjknIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxNZXRob2RQYWNrYWdlPiBnZXRNZXRob2RQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIE1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdsb2JhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRHbG9iYWwoKQotCSAqIEBzZWUgI3Vuc2V0R2xvYmFsKCkKLQkgKiBAc2VlICNzZXRHbG9iYWwoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGFja2FnZV9HbG9iYWwoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nZ2xvYmFsJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0dsb2JhbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNpc0dsb2JhbCA8ZW0+R2xvYmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HbG9iYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0R2xvYmFsKCkKLQkgKiBAc2VlICN1bnNldEdsb2JhbCgpCi0JICogQHNlZSAjaXNHbG9iYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEdsb2JhbChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNpc0dsb2JhbCA8ZW0+R2xvYmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEdsb2JhbCgpCi0JICogQHNlZSAjaXNHbG9iYWwoKQotCSAqIEBzZWUgI3NldEdsb2JhbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0R2xvYmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjaXNHbG9iYWwgPGVtPkdsb2JhbDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R2xvYmFsPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRHbG9iYWwoKQotCSAqIEBzZWUgI2lzR2xvYmFsKCkKLQkgKiBAc2VlICNzZXRHbG9iYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEdsb2JhbCgpOwotCi19IC8vIE1ldGhvZFBhY2thZ2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZDQwNmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kUGx1Z2luLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBQbHVnaW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLgotICogTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuCi0gKiBTcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luIDxlbT5SZWZlcmVuY2VkIE1ldGhvZCBQbHVnaW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNnZXRNZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luI2lzVXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQbHVnaW4oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01ldGhvZFBsdWdpbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZFBsdWdpbiBleHRlbmRzIE1ldGhvZFVuaXQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgTWV0aG9kIFBsdWdpbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQbHVnaW5fUmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZWZlcmVuY2VkTWV0aG9kUGx1Z2luJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGx1Z2luX01ldGhvZFBhY2thZ2UoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kUGFja2FnZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PE1ldGhvZFBhY2thZ2U+IGdldE1ldGhvZFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVzZXIgQ2hhbmdlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRVc2VyQ2hhbmdlYWJsZSgpCi0JICogQHNlZSAjdW5zZXRVc2VyQ2hhbmdlYWJsZSgpCi0JICogQHNlZSAjc2V0VXNlckNoYW5nZWFibGUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3VzZXJDaGFuZ2VhYmxlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1VzZXJDaGFuZ2VhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jaXNVc2VyQ2hhbmdlYWJsZSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI3Vuc2V0VXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI2lzVXNlckNoYW5nZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVzZXJDaGFuZ2VhYmxlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jaXNVc2VyQ2hhbmdlYWJsZSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFVzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAc2VlICNpc1VzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAc2VlICNzZXRVc2VyQ2hhbmdlYWJsZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VXNlckNoYW5nZWFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luI2lzVXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRVc2VyQ2hhbmdlYWJsZSgpCi0JICogQHNlZSAjaXNVc2VyQ2hhbmdlYWJsZSgpCi0JICogQHNlZSAjc2V0VXNlckNoYW5nZWFibGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFVzZXJDaGFuZ2VhYmxlKCk7Ci0KLX0gLy8gTWV0aG9kUGx1Z2luClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZFVuaXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RVbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMTA1NjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZFVuaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZFVuaXQuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgVW5pdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENvcHlyaWdodCA8ZW0+Q29weXJpZ2h0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFVuaXQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01ldGhvZFVuaXQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RVbml0IGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db3B5cmlnaHQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29weXJpZ2h0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3B5cmlnaHQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X0NvcHlyaWdodCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3B5cmlnaHQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29weXJpZ2h0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENvcHlyaWdodCA8ZW0+Q29weXJpZ2h0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3B5cmlnaHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvcHlyaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29weXJpZ2h0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhvcnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF1dGhvcnMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X0F1dGhvcnMoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdhdXRob3JzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEF1dGhvcnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aG9yczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXV0aG9ycyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDaGFuZ2VEYXRlKFhNTEdyZWdvcmlhbkNhbGVuZGFyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2NoYW5nZURhdGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYTUxHcmVnb3JpYW5DYWxlbmRhciBnZXRDaGFuZ2VEYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2hhbmdlRGF0ZShYTUxHcmVnb3JpYW5DYWxlbmRhciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdjaGFuZ2VEZXNjcmlwdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X1ZlcnNpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2ZXJzaW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIE1ldGhvZFVuaXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWlsZXN0b25lLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWlsZXN0b25lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODBiODcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01pbGVzdG9uZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNaWxlc3RvbmUuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NaWxlc3RvbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBkZXNjcmliZXMgYSBzaWduaWZpY2FudCBldmVudCBpbiBhIGRldmVsb3BtZW50IHByb2plY3QsIHN1Y2ggYXMgYSBtYWpvciBkZWNpc2lvbiwgY29tcGxldGlvbiBvZiBhIGRlbGl2ZXJhYmxlLCBvciBtZWV0aW5nIG9mIGEgbWFqb3IgZGVwZW5kZW5jeSAobGlrZSBjb21wbGV0aW9uIG9mIGEgcHJvamVjdCBwaGFzZSkuICBCZWNhdXNlLCBNaWxlc3RvbmUgaXMgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byBib3RoIHRoZSBldmVudCBpdHNlbGYgYW5kIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRoZSBldmVudCBpcyBzY2hlZHVsZWQgdG8gaGFwcGVuLCBpdCBpcyBtb2RlbGVkIGFzIGEgQnJlYWtkb3duIEVsZW1lbnQgKGkuZS4gaXQgYXBwZWFycyBhcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZSkuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lI2dldFJlcXVpcmVkUmVzdWx0IDxlbT5SZXF1aXJlZCBSZXN1bHQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWlsZXN0b25lKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNaWxlc3RvbmUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNaWxlc3RvbmUgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXF1aXJlZCBSZXN1bHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcXVpcmVkIFJlc3VsdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcXVpcmVkIFJlc3VsdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWlsZXN0b25lX1JlcXVpcmVkUmVzdWx0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlcXVpcmVkUmVzdWx0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRSZXF1aXJlZFJlc3VsdCgpOwotfSAvLyBNaWxlc3RvbmUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTmFtZWRFbGVtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTmFtZWRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYWQ1ZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL05hbWVkRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBOYW1lZEVsZW1lbnQuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lZCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXROYW1lZEVsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J05hbWVkRWxlbWVudCcga2luZD0nZW1wdHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVkRWxlbWVudCBleHRlbmRzIEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE5hbWVkRWxlbWVudF9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nbmFtZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIE5hbWVkRWxlbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9PdXRjb21lLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvT3V0Y29tZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDE5ZDFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9PdXRjb21lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE91dGNvbWUuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0Y29tZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgV29yayBQcm9kdWN0IHRoYXQgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE91dGNvbWUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J091dGNvbWUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBPdXRjb21lIGV4dGVuZHMgV29ya1Byb2R1Y3QgewotfSAvLyBPdXRjb21lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1BhY2thZ2VhYmxlRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1BhY2thZ2VhYmxlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODg1N2FhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QYWNrYWdlYWJsZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUGFja2FnZWFibGVFbGVtZW50LmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowOCBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQYWNrYWdlYWJsZUVsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1BhY2thZ2VhYmxlRWxlbWVudCcga2luZD0nZW1wdHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBhY2thZ2VhYmxlRWxlbWVudCBleHRlbmRzIE5hbWVkRWxlbWVudCB7Ci19IC8vIFBhY2thZ2VhYmxlRWxlbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QaGFzZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1BoYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNTIyZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1BoYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFBoYXNlLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBoYXNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIEFjdGl2aXR5IHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotICogUGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQaGFzZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUGhhc2UnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQaGFzZSBleHRlbmRzIEFjdGl2aXR5IHsKLX0gLy8gUGhhc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUGxhbm5pbmdEYXRhLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUGxhbm5pbmdEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZjE0YzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1BsYW5uaW5nRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUGxhbm5pbmdEYXRhLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXI7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgUHJvY2VzcyBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLgotICogUGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LgotICogKE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCkKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0RmluaXNoRGF0ZSA8ZW0+RmluaXNoIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSNnZXRSYW5rIDxlbT5SYW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0U3RhcnREYXRlIDxlbT5TdGFydCBEYXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFBsYW5uaW5nRGF0YSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUGxhbm5pbmdEYXRhJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGxhbm5pbmdEYXRhIGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbmlzaCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaERhdGUoWE1MR3JlZ29yaWFuQ2FsZW5kYXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFBsYW5uaW5nRGF0YV9GaW5pc2hEYXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdmaW5pc2hEYXRlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWE1MR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0RmluaXNoRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmluaXNoRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoRGF0ZShYTUxHcmVnb3JpYW5DYWxlbmRhciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SYW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSYW5rKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UGxhbm5pbmdEYXRhX1JhbmsoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdyYW5rJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJhbmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSNnZXRSYW5rIDxlbT5SYW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SYW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSYW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSYW5rKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBzdGFydCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFydERhdGUoWE1MR3JlZ29yaWFuQ2FsZW5kYXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFBsYW5uaW5nRGF0YV9TdGFydERhdGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3N0YXJ0RGF0ZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhNTEdyZWdvcmlhbkNhbGVuZGFyIGdldFN0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydERhdGUoWE1MR3JlZ29yaWFuQ2FsZW5kYXIgdmFsdWUpOwotCi19IC8vIFBsYW5uaW5nRGF0YQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QcmFjdGljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1ByYWN0aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NDY5YzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1ByYWN0aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcmFjdGljZS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByYWN0aWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHByb3ZlbiB3YXkgb3Igc3RyYXRlZ3kgb2YgZG9pbmcgd29yayB0byBhY2hpZXZlIGEgZ29hbCB0aGF0IGhhcyBhIHBvc2l0aXZlIGltcGFjdCBvbiB3b3JrIHByb2R1Y3Qgb3IgcHJvY2VzcyBxdWFsaXR5LiAgUHJhY3RpY2VzIGFyZSBkZWZpbmVkIG9ydGhvZ29uYWwgdG8gbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLiAgVGhleSBjb3VsZCBzdW1tYXJpemUgYXNwZWN0cyB0aGF0IGltcGFjdCBtYW55IGRpZmZlcmVudCBwYXJ0cyBvZiBhIG1ldGhvZCBvciBzcGVjaWZpYyBwcm9jZXNzZXMuICBFeGFtcGxlcyBmb3IgcHJhY3RpY2VzIHdvdWxkIGJlICJNYW5hZ2UgUmlza3MiLCAiQ29udGludW91c2x5IHZlcmlmeSBxdWFsaXR5IiwgIkFyY2hpdGVjdHVyZS1jZW50cmljIGFuZCBjb21wb25lbnQtYmFzZWQgZGV2ZWxvcG1lbnQiLCBldGMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldEFjdGl2aXR5UmVmZXJlbmNlIDxlbT5BY3Rpdml0eSBSZWZlcmVuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldENvbnRlbnRSZWZlcmVuY2UgPGVtPkNvbnRlbnQgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRTdWJQcmFjdGljZSA8ZW0+U3ViIFByYWN0aWNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQcmFjdGljZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByYWN0aWNlIGV4dGVuZHMgR3VpZGFuY2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZV9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3Rpdml0eSBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjdGl2aXR5IFJlZmVyZW5jZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2aXR5IFJlZmVyZW5jZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0aXZpdHlSZWZlcmVuY2UnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEFjdGl2aXR5UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250ZW50IFJlZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGVudCBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZW50IFJlZmVyZW5jZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb250ZW50UmVmZXJlbmNlJyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRDb250ZW50UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWIgUHJhY3RpY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWIgUHJhY3RpY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWIgUHJhY3RpY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlX1N1YlByYWN0aWNlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1YlByYWN0aWNlJyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8UHJhY3RpY2U+IGdldFN1YlByYWN0aWNlKCk7Ci0KLX0gLy8gUHJhY3RpY2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJhY3RpY2VEZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1ByYWN0aWNlRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E4YjhlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJhY3RpY2VEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJhY3RpY2VEZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByYWN0aWNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcmFjdGljZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFkZGl0aW9uYWxJbmZvIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QXBwbGljYXRpb24gPGVtPkFwcGxpY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEJhY2tncm91bmQgPGVtPkJhY2tncm91bmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0R29hbHMgPGVtPkdvYWxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldExldmVsc09mQWRvcHRpb24gPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRQcm9ibGVtIDxlbT5Qcm9ibGVtPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ByYWN0aWNlRGVzY3JpcHRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcmFjdGljZURlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsIEluZm88L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsIEluZm88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFkZGl0aW9uYWxJbmZvKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BZGRpdGlvbmFsSW5mbygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBZGRpdGlvbmFsSW5mbyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBZGRpdGlvbmFsSW5mbygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBZGRpdGlvbmFsSW5mbyA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsIEluZm88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFkZGl0aW9uYWxJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBZGRpdGlvbmFsSW5mbyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXBwbGljYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BcHBsaWNhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXBwbGljYXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FwcGxpY2F0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFwcGxpY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFwcGxpY2F0aW9uIDxlbT5BcHBsaWNhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXBwbGljYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBcHBsaWNhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFja2dyb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYWNrZ3JvdW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRCYWNrZ3JvdW5kKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JhY2tncm91bmQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QmFja2dyb3VuZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRCYWNrZ3JvdW5kIDxlbT5CYWNrZ3JvdW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYWNrZ3JvdW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRCYWNrZ3JvdW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCYWNrZ3JvdW5kKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hb2FsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdvYWxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRHb2FscyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nR29hbHMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0R29hbHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0R29hbHMgPGVtPkdvYWxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Hb2FsczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0R29hbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEdvYWxzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZXZlbHMgT2YgQWRvcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIE91dGxpbmVzIHRoZSBkaWZmZXJlbnQgZm9ybXMgb3IgdmFyaWFudHMgaW4gd2hpY2ggdGhlIHByYWN0aWNlIGNvdWxkIGJlIHJlYWxpemVkLiAoZS5nLiBmdWxsIGFkb3B0aW9uIHZlcnVzIGEgcGFydGlhbCBhZG9wdGlvbiBvZiB0aGUgUHJhY3RpY2UpCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGV2ZWxzT2ZBZG9wdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fTGV2ZWxzT2ZBZG9wdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZXZlbHNPZkFkb3B0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExldmVsc09mQWRvcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0TGV2ZWxzT2ZBZG9wdGlvbiA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExldmVsc09mQWRvcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExldmVsc09mQWRvcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2JsZW08L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvYmxlbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJvYmxlbShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcm9ibGVtJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByb2JsZW0oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0UHJvYmxlbSA8ZW0+UHJvYmxlbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvYmxlbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJvYmxlbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvYmxlbShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFByYWN0aWNlRGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4NmMwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzcy5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5LgotICogQ29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0SW5jbHVkZXNQYXR0ZXJuIDxlbT5JbmNsdWRlcyBQYXR0ZXJuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldERlZmF1bHRDb250ZXh0IDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0VmFsaWRDb250ZXh0IDxlbT5WYWxpZCBDb250ZXh0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldERpYWdyYW1VUkkgPGVtPkRpYWdyYW0gVVJJPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3MoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Byb2Nlc3MnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzIGV4dGVuZHMgQWN0aXZpdHkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluY2x1ZGVzIFBhdHRlcm48L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmNsdWRlcyBQYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbmNsdWRlc1BhdHRlcm4nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEluY2x1ZGVzUGF0dGVybigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0Q29udGV4dChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NfRGVmYXVsdENvbnRleHQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVmYXVsdENvbnRleHQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdENvbnRleHQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0RGVmYXVsdENvbnRleHQgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0Q29udGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdENvbnRleHQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbGlkIENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbGlkIENvbnRleHQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWxpZCBDb250ZXh0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWxpZENvbnRleHQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFZhbGlkQ29udGV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlhZ3JhbSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBVUkkgb2YgdGhlIGRpYWdyYW0gZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2Nlc3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpYWdyYW0gVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREaWFncmFtVVJJKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc19EaWFncmFtVVJJKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nZGlhZ3JhbVVSSSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREaWFncmFtVVJJKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldERpYWdyYW1VUkkgPGVtPkRpYWdyYW0gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EaWFncmFtIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGlhZ3JhbVVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGlhZ3JhbVVSSShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFByb2Nlc3MKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0NvbXBvbmVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NDb21wb25lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg4ZDIyNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0NvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc0NvbXBvbmVudC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgQ29tcG9uZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIFByb2Nlc3MgUGFja2FnZSB0aGF0IGFwcGxpZXMgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gIEEgUHJvY2VzcyBDb21wb25lbnQgcmVhbGl6ZXMgb25lIG9yIG1vcmUgSW50ZXJmYWNlcyB3aGljaCBzcGVjaWZ5IGlucHV0cyBhbmQgb3V0cHV0cyBvZiB0aGUgY29tcG9uZW50LiBUaGVyZSBtaWdodCBiZSBtYW55IGNvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBzYW1lIGludGVyZmFjZXMsIGJ1dCB1c2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyB0byBhY2hpZXZlIHNpbWlsYXIgb3V0cHV0cyBmb3Igc2ltaWxhciBpbnB1dHMuICBXaGVyZWFzIHRoZSBDb21wb25lbnQgSW50ZXJmYWNlcyByZXByZXNlbnQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIChibGFjayBib3ggZGVzY3JpcHRpb25zIG9mIHRoZSBjb21wb25lbnQpLCBnb29kIGNhbmRpZGF0ZXMgZm9yIGNvbXBvbmVudCByZWFsaXphdGlvbnMgY2FuIGJlIGZvdW5kIGluIENhcGFiaWxpdHkgUGF0dGVybnMgKHdoaXRlIGJveCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBjb21wb25lbnQpLgotICogVU1BIHN1cHBvcnRzIHJlcGxhY2VhYmxlIGFuZCByZXVzYWJsZSBQcm9jZXNzIENvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uIENlcnRhaW4gc2l0dWF0aW9ucyBpbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgbWlnaHQgcmVxdWlyZSB0aGF0IGNvbmNyZXRlIHJlYWxpemF0aW9ucyBvZiBwYXJ0cyBvZiB0aGUgcHJvY2VzcyByZW1haW4gdW5kZWNpZGVkIG9yIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgZXhlY3V0aW5nIHRlYW0gaXRzZWxmIChlLmcuIGluIG91dHNvdXJjaW5nIHNpdHVhdGlvbnMpLiAgVU1BIHByb3ZpZGVzIGEgdW5pcXVlIGNvbXBvbmVudCBjb25jZXB0IGRlZmluaW5nIGludGVyZmFjZXMgZm9yIHdvcmsgcHJvZHVjdCBpbnB1dCBhbmQgb3V0cHV0LCBhbGxvd2luZyB0cmVhdGluZyB0aGUgYWN0dWFsIGRlZmluaXRpb24gb2YgdGhlIHdvcmsgdGhhdCBwcm9kdWNlcyB0aGUgb3V0cHV0cyBhcyBhICJibGFjayBib3giLiAgQXQgYW55IHBvaW50IGR1cmluZyBhIHByb2plY3QgdGhlIGNvbXBvbmVudCAicmVhbGl6YXRpb24iIGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldENvcHlyaWdodCA8ZW0+Q29weXJpZ2h0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldEludGVyZmFjZSA8ZW0+SW50ZXJmYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldFByb2Nlc3MgPGVtPlByb2Nlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDaGFuZ2VEYXRlIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJvY2Vzc0NvbXBvbmVudCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NDb21wb25lbnQgZXh0ZW5kcyBQcm9jZXNzUGFja2FnZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db3B5cmlnaHQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29weXJpZ2h0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3B5cmlnaHQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50X0NvcHlyaWdodCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3B5cmlnaHQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29weXJpZ2h0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldENvcHlyaWdodCA8ZW0+Q29weXJpZ2h0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3B5cmlnaHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvcHlyaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29weXJpZ2h0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnRlcmZhY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkludGVyZmFjZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmZhY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEludGVyZmFjZShQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50X0ludGVyZmFjZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbnRlcmZhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIGdldEludGVyZmFjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRJbnRlcmZhY2UgPGVtPkludGVyZmFjZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJmYWNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEludGVyZmFjZShQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2Nlc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb2Nlc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJvY2VzcyhvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Byb2Nlc3MnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIGdldFByb2Nlc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0UHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvY2VzcyhvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aG9yczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXV0aG9ycyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRfQXV0aG9ycygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2F1dGhvcnMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXV0aG9ycygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRBdXRob3JzIDxlbT5BdXRob3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRob3JzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdXRob3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdXRob3JzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENoYW5nZURhdGUoWE1MR3JlZ29yaWFuQ2FsZW5kYXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGF0ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nY2hhbmdlRGF0ZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhNTEdyZWdvcmlhbkNhbGVuZGFyIGdldENoYW5nZURhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDaGFuZ2VEYXRlKFhNTEdyZWdvcmlhbkNhbGVuZGFyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENoYW5nZURlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudF9DaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2NoYW5nZURlc2NyaXB0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENoYW5nZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldENoYW5nZURlc2NyaXB0aW9uIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENoYW5nZURlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmVyc2lvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRfVmVyc2lvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3ZlcnNpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmVyc2lvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUHJvY2Vzc0NvbXBvbmVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjIyNjJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBDb21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbiA8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlSU8gPGVtPkludGVyZmFjZSBJTzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjMwJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ludGVyZmFjZVNwZWNpZmljYXRpb24nIGdyb3VwPScjZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxUYXNrRGVzY3JpcHRvcj4gZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIElPPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkludGVyZmFjZSBJTzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkludGVyZmFjZSBJTzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VJTygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbnRlcmZhY2VJTycgZ3JvdXA9JyNncm91cDozMCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0SW50ZXJmYWNlSU8oKTsKLQotfSAvLyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NEZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzExZmQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgQWN0aXZpdHkgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFByb2Nlc3MuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjb3BlIDxlbT5TY29wZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFVzYWdlTm90ZXMgPGVtPlVzYWdlIE5vdGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJvY2Vzc0Rlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc0Rlc2NyaXB0aW9uIGV4dGVuZHMgQWN0aXZpdHlEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlZmluZXMgdGhlIHNjb3BlIG9mIHRoZSBQcm9jZXNzLCBpLmUuIHdoaWNoIHR5cGVzIG9mIHByb2plY3RzIGRvZXMgaXQgYWRkcmVzcyBhbmQgd2hpY2ggbm90LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY29wZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2NvcGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU2NvcGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2NvcGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjb3BlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY29wZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2NvcGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVzYWdlIE5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZSBOb3RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VXNhZ2VOb3RlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1VzYWdlTm90ZXMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VXNhZ2VOb3RlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFVzYWdlTm90ZXMgPGVtPlVzYWdlIE5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZSBOb3RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VXNhZ2VOb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXNhZ2VOb3RlcyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIFByb2Nlc3NEZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNWEzNmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NFbGVtZW50LmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuCi0gKiBQcm9jZXNzIEVsZW1lbnRzIHJlcHJlc2VudHMgUHJvY2VzcyBzcGVjaWZpYyBlbGVtZW50cyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQgZnJvbSBDb250ZW50IEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRWxlbWVudCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJvY2Vzc0VsZW1lbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzRWxlbWVudCBleHRlbmRzIERlc2NyaWJhYmxlRWxlbWVudCB7Ci19IC8vIFByb2Nlc3NFbGVtZW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NQYWNrYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc1BhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0ZjNkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc1BhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc1BhY2thZ2UuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LgotICogQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2UjZ2V0UHJvY2Vzc0VsZW1lbnQgPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGFja2FnZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJvY2Vzc1BhY2thZ2UnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzUGFja2FnZSBleHRlbmRzIE1ldGhvZFBhY2thZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGFja2FnZV9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoxMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRWxlbWVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Byb2Nlc3NFbGVtZW50JyBncm91cD0nI2dyb3VwOjEzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8UHJvY2Vzc0VsZW1lbnQ+IGdldFByb2Nlc3NFbGVtZW50KCk7Ci0KLX0gLy8gUHJvY2Vzc1BhY2thZ2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjY4YzEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4KLSAqIEEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlI2dldEdyb3VwNCA8ZW0+R3JvdXA0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSNnZXRCYXNlUHJvY2VzcyA8ZW0+QmFzZSBQcm9jZXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0dyb3VwNCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjQ3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgUHJvY2VzczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZSBQcm9jZXNzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBQcm9jZXNzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlUHJvY2VzcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCYXNlUHJvY2VzcycgZ3JvdXA9JyNncm91cDo0NyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0QmFzZVByb2Nlc3MoKTsKLQotfSAvLyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9SZXBvcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9SZXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI0ODg4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUmVwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJlcG9ydC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXBvcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGludG8gYSByZXBvcnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSZXBvcnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JlcG9ydCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlcG9ydCBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gUmVwb3J0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JldXNhYmxlQXNzZXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9SZXVzYWJsZUFzc2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NDk2MWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JldXNhYmxlQXNzZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmV1c2FibGVBc3NldC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcKLSAqIGhvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSZXVzYWJsZUFzc2V0KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdSZXVzYWJsZUFzc2V0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmV1c2FibGVBc3NldCBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gUmV1c2FibGVBc3NldApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2FkbWFwLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9hZG1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDA2Nzg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2FkbWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvYWRtYXAuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB3aGljaCBpcyBvbmx5IHJlbGF0ZWQgdG8gQWN0aXZhdGVzIGFuZCB0aGVyZWZvcmUgaGFzIGJlZW4gYWRkZWQgYnkgdGhpcyBwYWNrYWdlIHRvIHRoZSBsaXN0IG9mIEd1aWRhbmNlIFR5cGVzIHJhdGhlciB0aGFuIGxpc3RlZCBpbiB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZS4gIEEgUm9hZG1hcCByZXByZXNlbnRzIGEgbGluZWFyIHdhbGt0aHJvdWdoIG9mIGFuIEFjdGl2aXR5LCB0eXBpY2FsbHkgYSBQcm9jZXNzLgotICogQW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9hZG1hcCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUm9hZG1hcCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJvYWRtYXAgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFJvYWRtYXAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiYmExNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2xlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ29udGVudCBFbGVtZW50IHRoYXQgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcy4gIFJvbGVzIGFyZSB1c2VkIGJ5IFRhc2tzIHRvIGRlZmluZSB3aG8gcGVyZm9ybXMgdGhlbSBhcyB3ZWxsIGFzIGRlZmluZSBhIHNldCBvZiB3b3JrIHByb2R1Y3RzIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gIAotICogQSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBhIHNldCBvZiBpbmRpdmlkdWFscy4gIFJvbGVzIGFyZSBub3QgaW5kaXZpZHVhbHMgb3IgcmVzb3VyY2VzLiAgSW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gd2lsbCB3ZWFyIGRpZmZlcmVudCBoYXRzLCBvciBwZXJmb3JtIGRpZmZlcmVudCByb2xlcy4gVGhlIG1hcHBpbmcgZnJvbSBpbmRpdmlkdWFsIHRvIHJvbGUsIHBlcmZvcm1lZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYW5kIHN0YWZmaW5nIGZvciBhIHByb2plY3QsIGFsbG93cyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgdG8gYWN0IGFzIHNldmVyYWwgZGlmZmVyZW50IHJvbGVzLCBhbmQgZm9yIGEgcm9sZSB0byBiZSBwbGF5ZWQgYnkgc2V2ZXJhbCBpbmRpdmlkdWFscy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlI2dldFJlc3BvbnNpYmxlRm9yIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUm9sZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJvbGUgZXh0ZW5kcyBDb250ZW50RWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVfUmVzcG9uc2libGVGb3IoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVzcG9uc2libGVGb3InIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFJlc3BvbnNpYmxlRm9yKCk7Ci0KLX0gLy8gUm9sZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk4YjIyYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2xlRGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBSb2xlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcyA8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U2tpbGxzIDxlbT5Ta2lsbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTeW5vbnltcyA8ZW0+U3lub255bXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdSb2xlRGVzY3JpcHRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlRGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgZ3VpZGFuY2Ugb24gZm9yIGFzc2lnbmluZyBpbmRpdmlkdWFscyB0byB0aGUgUm9sZSBpbiB0ZXJtcyBvZiB3aGF0IG90aGVyIHJvbGVzIHRoZXNlIGluZGl2aWR1YWxzIGNvdWxkIHBlcmZvcm0gYW5kIHdoYXQgcmVzcG9uc2liaWxpdHkgZGlmZmVyZW50IGluZGl2aWR1YWxzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZSBtaWdodCBoYXZlLiAgVGhlIGd1aWRhbmNlIGNhbiBhbHNvIGRlc2NyaWJlIGRpZmZlcmVudCBhc3NpZ25tZW50IGFwcHJvYWNoZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cywgZS5nLiBmb3IgbGFyZ2UgdmVyc3VzIHNtYWxsIHRlYW1zIHdoZXJlIGluZGl2aWR1YWxzIGNvdWxkIGJlIGFsbG9jYXRlZCB0byByb2xlcyBmdWxsIHRpbWUgdmVyc3VzIHNoYXJpbmcgcm9sZXMgd2l0aGluIHRoZSB0ZWFtLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFzc2lnbm1lbnRBcHByb2FjaGVzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Fzc2lnbm1lbnRBcHByb2FjaGVzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFzc2lnbm1lbnRBcHByb2FjaGVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXNzaWdubWVudEFwcHJvYWNoZXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNraWxsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogTGlzdHMgb2Ygc2V0IG9mIHJlcXVpcmVkIHNraWxscyBhIHBlcnNvbiBuZWVkcyB0byBwb3NzZXNzIHRvIGZ1bGZpbGwgdGhhdCBSb2xlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ta2lsbHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNraWxscyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdGlvbl9Ta2lsbHMoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU2tpbGxzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNraWxscygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uI2dldFNraWxscyA8ZW0+U2tpbGxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ta2lsbHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNraWxscygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2tpbGxzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TeW5vbnltczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogTGlzdHMgc3lub255bXMsIGkuZS4gb3RoZXIgbmFtZXMgdGhlIFJvbGUgbWlnaHQgYmUgcmVmZXJyZWQgYnkuICBUb29sIHN1cHBvcnQgZm9yIHRoZSBtZXRhLW1vZGVsIG1pZ2h0IHN1cHBvcnQgdGhhdCBhIFJvbGUgbmFtZSBjYW4gYmUgY29uc2lzdGVudGx5IGJlIHJlcGxhY2VkIHdpdGggb25lIG9mIGl0cyBzeW5vbnltcyB0aHJvdWdodCBhIFByb2Nlc3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN5bm9ueW1zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTeW5vbnltcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdGlvbl9TeW5vbnltcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTeW5vbnltcyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTeW5vbnltcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uI2dldFN5bm9ueW1zIDxlbT5TeW5vbnltczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3lub255bXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN5bm9ueW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTeW5vbnltcyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIFJvbGVEZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlRGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMGZlNDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVEZXNjcmlwdG9yLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJvbGUgPGVtPlJvbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJlc3BvbnNpYmxlRm9yIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0b3IoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JvbGVEZXNjcmlwdG9yJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZURlc2NyaXB0b3IgZXh0ZW5kcyBEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJvbGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JvbGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Um9sZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3IjZ2V0Um9sZSA8ZW0+Um9sZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Um9sZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc3BvbnNpYmxlRm9yJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRSZXNwb25zaWJsZUZvcigpOwotCi19IC8vIFJvbGVEZXNjcmlwdG9yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGVTZXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNDgzYmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGVTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUm9sZVNldC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgU2V0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogT3JnYW5pemVzIFJvbGVzIGludG8gY2F0ZWdvcmllcy4gIEl0IGlzIHVzZWQgdG8gZ3JvdXAgcm9sZXMgdG9nZXRoZXIgdGhhdCBoYXZlIGNlcnRhaW4gY29tbW9uYWxpdGllcy4gIEZvciBleGFtcGxlLCB0aGUgIkFuYWx5c3RzIiBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgIkJ1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCIsICJTeXN0ZW0gQW5hbHlzdCIsIGFzIHdlbGwgYXMgIlJlcXVpcmVtZW50cyBTcGVjaWZpZXIiIHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0I2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0I2dldFJvbGUgPGVtPlJvbGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZVNldCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUm9sZVNldCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJvbGVTZXQgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlU2V0X0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvbGU8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlU2V0X1JvbGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUm9sZScgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0Um9sZSgpOwotCi19IC8vIFJvbGVTZXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZVNldEdyb3VwaW5nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZVNldEdyb3VwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MzRhYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGVTZXRHcm91cGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2xlU2V0R3JvdXBpbmcuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIFNldCBHcm91cGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0R3JvdXBpbmcjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZyNnZXRSb2xlU2V0IDxlbT5Sb2xlIFNldDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlU2V0R3JvdXBpbmcoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JvbGVTZXRHcm91cGluZycga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJvbGVTZXRHcm91cGluZyBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVTZXRHcm91cGluZ19Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlIFNldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um9sZSBTZXQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlIFNldDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUm9sZVNldCcgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0Um9sZVNldCgpOwotCi19IC8vIFJvbGVTZXRHcm91cGluZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9TZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDA2NzhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBTZWN0aW9uLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U3ViU2VjdGlvbiA8ZW0+U3ViIFNlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRTZWN0aW9uTmFtZSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFNlY3Rpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1NlY3Rpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZWN0aW9uIGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViIFNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YiBTZWN0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YiBTZWN0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTdWJTZWN0aW9uKFNlY3Rpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFNlY3Rpb25fU3ViU2VjdGlvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdWJTZWN0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2VjdGlvbiBnZXRTdWJTZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFN1YlNlY3Rpb24gPGVtPlN1YiBTZWN0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdWIgU2VjdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U3ViU2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3ViU2VjdGlvbihTZWN0aW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVkZWNlc3NvcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkZWNlc3NvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlZGVjZXNzb3IoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZWRlY2Vzc29yJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByZWRlY2Vzc29yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFByZWRlY2Vzc29yIDxlbT5QcmVkZWNlc3NvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZWRlY2Vzc29yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVkZWNlc3NvcihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlcyBzdG9yZSB0aGUgZGVzY3JpcHRpb24gdGV4dCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uJ3MgU2VjdGlvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbl9EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZXNjcmlwdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY3Rpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlY3Rpb25OYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbl9TZWN0aW9uTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3NlY3Rpb25OYW1lJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNlY3Rpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFNlY3Rpb25OYW1lIDxlbT5TZWN0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlY3Rpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2VjdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlY3Rpb25OYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRTZWN0aW9uX1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJuYSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQHNlZSAjaXNTZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRTZWN0aW9uX1ZhcmlhYmlsaXR5VHlwZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9Im5hIiB1bnNldHRhYmxlPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3ZhcmlhYmlsaXR5VHlwZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVZhcmlhYmlsaXR5VHlwZSBnZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgI2lzU2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICN1bnNldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLX0gLy8gU2VjdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9TdXBwb3J0aW5nTWF0ZXJpYWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9TdXBwb3J0aW5nTWF0ZXJpYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFiOTQyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvU3VwcG9ydGluZ01hdGVyaWFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFN1cHBvcnRpbmdNYXRlcmlhbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdTdXBwb3J0aW5nTWF0ZXJpYWwnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTdXBwb3J0aW5nTWF0ZXJpYWwgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFN1cHBvcnRpbmdNYXRlcmlhbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UYXNrLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGRkZTU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ29udGVudCBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdvcmsgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgSXQgZGVmaW5lcyBvbmUgZGVmYXVsdCBwZXJmb3JtaW5nIFJvbGUgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwgcGVyZm9ybWVycy4gIEEgVGFzayBpcyBhc3NvY2lhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gIElucHV0cyBhcmUgZGlmZmVyZW50aWF0ZWQgaW4gbWFuZGF0b3J5IHZlcnN1cyBvcHRpb25hbCBpbnB1dHMuICBUaGUgYXNzb2NpYXRpb25zIHRvIFdvcmsgUHJvZHVjdHMgYXJlIG5vdCBpbnN0YW50aWF0YWJsZS92YXJpYWJsZS1saWtlIHBhcmFtZXRlcnMuICBUaGV5IHJhdGhlciBleHByZXNzIChoeXBlci0pbGlua3MgdG8gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgd29yayBwcm9kdWN0cyB0eXBlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBUYXNrIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNhcHR1cmUgd2hpY2ggY29uY3JldGUgaW5zdGFuY2VzIHdpbGwgYmUgcGFzc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgbWV0aG9kIGluIGEgcHJvamVjdC4gIEFsbCBvZiB0aGUgVGFzaydzIGRlZmF1bHQgYXNzb2NpYXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGFjdHVhbCBwcm9jZXNzIGRlZmluaXRpb24uCi0gKiBBIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAKLSAqIEEgVGFzayBoYXMgYSBjbGVhciBwdXJwb3NlIGluIHdoaWNoIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFjaGlldmUgYSB3ZWxsIGRlZmluZWQgZ29hbC4gIEl0IHByb3ZpZGVzIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgb2YgZG9pbmcgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBhY2hpZXZlIHRoaXMgZ29hbC4gIFRoaXMgZGVzY3JpcHRpb24gaXMgY29tcGxldGUsIGluZGVwZW5kZW50IG9mIHdoZW4gaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSB0aGUgd29yayB3b3VsZCBhY3R1YWxseSBiZSBkb25lLiAgSXQgdGhlcmVmb3JlIGRvZXMgbm90IGRlc2NyaWJlIHdoZW4geW91IGRvIHdoYXQgd29yayBhdCB3aGF0IHBvaW50IG9mIHRpbWUsIGJ1dCBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgZ2V0cyBkb25lIHRocm91Z2hvdXQgdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZSB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBhY2hpZXZlbWVudCBvZiB0aGlzIGdvYWwuICBXaGVuIHRoZSBUYXNrIGlzIGJlaW5nIGFwcGxpZWQgaW4gYSBwcm9jZXNzIHRoZW4gdGhpcyBwcm9jZXNzIGFwcGxpY2F0aW9uIChkZWZpbmVkIGFzIFRhc2sgRGVzY3JpcHRvcikgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHdoaWNoIHBpZWNlcyBvZiB0aGUgVGFzayB3aWxsIGFjdHVhbGx5IGJlIHBlcmZvcm1lZCBhdCBhbnkgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgVGFzayB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgcHJvY2VzcyBvdmVyIGFuZCBvdmVyIGFnYWluLCBidXQgZWFjaCB0aW1lIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgZW1waGFzaXMgb24gZGlmZmVyZW50IHN0ZXBzIG9yIGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRpb24uIAotICogRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXZlbG9wIFVzZSBDYXNlIE1vZGVsIiBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICJtZXRob2QiIG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0UGVyZm9ybWVkQnkgPGVtPlBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldEVzdGltYXRlIDxlbT5Fc3RpbWF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0VG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFzaygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGFzaycga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2sgZXh0ZW5kcyBDb250ZW50RWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVjb25kaXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrX1ByZWNvbmRpdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmVjb25kaXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlY29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlY29uZGl0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBvc3Rjb25kaXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrX1Bvc3Rjb25kaXRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUG9zdGNvbmRpdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQb3N0Y29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBvc3Rjb25kaXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcmZvcm1lZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyZm9ybWVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcmZvcm1lZCBCeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19QZXJmb3JtZWRCeSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQZXJmb3JtZWRCeSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0UGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hbmRhdG9yeSBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrX01hbmRhdG9yeUlucHV0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01hbmRhdG9yeUlucHV0JyBncm91cD0nI2dyb3VwOjI3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRNYW5kYXRvcnlJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3V0cHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PdXRwdXQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRwdXQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfT3V0cHV0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J091dHB1dCcgZ3JvdXA9JyNncm91cDoyNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0T3V0cHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeScgZ3JvdXA9JyNncm91cDoyNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9wdGlvbmFsIElucHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrX09wdGlvbmFsSW5wdXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3B0aW9uYWxJbnB1dCcgZ3JvdXA9JyNncm91cDoyNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0T3B0aW9uYWxJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXN0aW1hdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVzdGltYXRlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGU8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfRXN0aW1hdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGUnIGdyb3VwPScjZ3JvdXA6MjcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEVzdGltYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zJyBncm91cD0nI2dyb3VwOjI3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrX1Rvb2xNZW50b3IoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVG9vbE1lbnRvcicgZ3JvdXA9JyNncm91cDoyNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0VG9vbE1lbnRvcigpOwotCi19IC8vIFRhc2sKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGFza0Rlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGFza0Rlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNGMyMGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2tEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrRGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBUYXNrLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUYXNrRGVzY3JpcHRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUYXNrRGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsdGVybmF0aXZlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWx0ZXJuYXRpdmVzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFsdGVybmF0aXZlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWx0ZXJuYXRpdmVzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFB1cnBvc2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQdXJwb3NlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFB1cnBvc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QdXJwb3NlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQdXJwb3NlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gVGFza0Rlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2tEZXNjcmlwdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGFza0Rlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDljY2RkNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGFza0Rlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRhc2tEZXNjcmlwdG9yLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzayBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4KLSAqIEEga2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0VGFzayA8ZW0+VGFzazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkgPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QXNzaXN0ZWRCeSA8ZW0+QXNzaXN0ZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEV4dGVybmFsSW5wdXQgPGVtPkV4dGVybmFsIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0T3V0cHV0IDxlbT5PdXRwdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFN0ZXAgPGVtPlN0ZXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3IoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Rhc2tEZXNjcmlwdG9yJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFza0Rlc2NyaXB0b3IgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFzazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFzazwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUYXNrKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUYXNrJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFRhc2soKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFRhc2sgPGVtPlRhc2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhc2soU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQZXJmb3JtZWRQcmltYXJpbHlCeSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkgPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZXJmb3JtZWRQcmltYXJpbHlCeShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX0dyb3VwMygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjM3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeScgZ3JvdXA9JyNncm91cDozNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFzc2lzdGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Bc3Npc3RlZCBCeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFzc2lzdGVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Fzc2lzdGVkQnknIGdyb3VwPScjZ3JvdXA6MzcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEFzc2lzdGVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVybmFsIElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIElucHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVybmFsSW5wdXQnIGdyb3VwPScjZ3JvdXA6MzcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEV4dGVybmFsSW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hbmRhdG9yeSBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNYW5kYXRvcnlJbnB1dCcgZ3JvdXA9JyNncm91cDozNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0TWFuZGF0b3J5SW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9wdGlvbmFsIElucHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J09wdGlvbmFsSW5wdXQnIGdyb3VwPScjZ3JvdXA6MzcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldE9wdGlvbmFsSW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3V0cHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3V0cHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3V0cHV0JyBncm91cD0nI2dyb3VwOjM3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRPdXRwdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0ZXA8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0ZXA8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGVwPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9TdGVwKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0ZXAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTZWN0aW9uPiBnZXRTdGVwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICN1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICN1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI3NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLX0gLy8gVGFza0Rlc2NyaXB0b3IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGVhbVByb2ZpbGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UZWFtUHJvZmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGUyNzU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UZWFtUHJvZmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGVhbVByb2ZpbGUuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZWFtIFByb2ZpbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuCi0gKiBXb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuCi0gKiBIZW5jZSwgaW4gYWRkaXRpb24gdG8gdGhlIHdvcmsgYnJlYWtkb3duIGFuZCB3b3JrIHByb2R1Y3QgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVmaW5lZCBzbyBmYXIsIFRlYW0gUHJvZmlsZXMgYXJlIHVzZWQgdG8gZGVmaW5lIGEgdGhpcmQgdHlwZSBvZiBicmVha2Rvd24gc3RydWN0dXJlOiB0ZWFtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGhlc2UgYXJlIGNyZWF0ZWQgYXMgYW4gQWN0aXZpdHkgc3BlY2lmaWMgaGllcmFyY2h5IG9mIFRlYW0gUHJvZmlsZXMgY29tcHJpc2luZyBvZiBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFRoZXNlIHN0cnVjdHVyZXMgY2FuIGJlIHByZXNlbnRlZCBhcyB3ZWxsLWtub3duIE9yZy1DaGFydHMuICBKdXN0IGFzIHdpdGggYW55IG90aGVyIEJyZWFrZG93biBFbGVtZW50IGFuZCBEZXNjcmlwdG9ycywgVGVhbSBQcm9maWxlcyBjYW4gYmUgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGFueSBBY3Rpdml0eSBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJbiBvdGhlciB3b3JkcyBldmVyeSBBY3Rpdml0eSBjYW4gZGVmaW5lIGl0cyBvd24gVGVhbSBQcm9maWxlcyBjb25zaXN0aW5nIG9mIEFjdGl2aXR5IHNwZWNpZmljIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVHlwaWNhbGx5LCBUZWFtIFByb2ZpbGVzIGFyZSBkZWZpbmVkIG9uIHRoZSBsZXZlbCBvZiBJdGVyYXRpb25zIG9yIFBoYXNlcyBvciBvdGhlciBoaWdoZXItbGV2ZWwgQWN0aXZpdHkuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFJvbGUgPGVtPlJvbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFN1cGVyVGVhbSA8ZW0+U3VwZXIgVGVhbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGUjZ2V0U3ViVGVhbSA8ZW0+U3ViIFRlYW08L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGVhbVByb2ZpbGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1RlYW1Qcm9maWxlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGVhbVByb2ZpbGUgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGVhbVByb2ZpbGVfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um9sZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvbGU8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlX1JvbGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUm9sZScgZ3JvdXA9JyNncm91cDozMCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0Um9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwZXIgVGVhbTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3VwZXIgVGVhbTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1cGVyIFRlYW08L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdXBlclRlYW0nIGdyb3VwPScjZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFN1cGVyVGVhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViIFRlYW08L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YiBUZWFtPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIFRlYW08L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlX1N1YlRlYW0oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3ViVGVhbScgZ3JvdXA9JyNncm91cDozMCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0U3ViVGVhbSgpOwotCi19IC8vIFRlYW1Qcm9maWxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1RlbXBsYXRlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGVtcGxhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNjZGFhYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGVtcGxhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGVtcGxhdGUuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVtcGxhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRlbXBsYXRlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUZW1wbGF0ZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlbXBsYXRlIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBUZW1wbGF0ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UZXJtRGVmaW5pdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rlcm1EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMmU1NmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rlcm1EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRlcm1EZWZpbml0aW9uLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlcm0gRGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGRlZmluZXMgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGVybURlZmluaXRpb25zIGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGVybURlZmluaXRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Rlcm1EZWZpbml0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGVybURlZmluaXRpb24gZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFRlcm1EZWZpbml0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rvb2wuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Ub29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwODlhMzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVG9vbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRvb2w8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2wjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2wjZ2V0VG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VG9vbCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVG9vbCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRvb2wgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUb29sX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUb29sX1Rvb2xNZW50b3IoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVG9vbE1lbnRvcicgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0VG9vbE1lbnRvcigpOwotCi19IC8vIFRvb2wKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVG9vbE1lbnRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rvb2xNZW50b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0Zjc5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVG9vbE1lbnRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUb29sTWVudG9yLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSAgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrIGEgV29yayBQcm9kdWN0IGVpdGhlciBpbiB0aGUgY29udGV4dCBvZiBvciBpbmRlcGVuZGVudCBmcm9tIGEgVGFzayBvciBBY3Rpdml0eS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRvb2xNZW50b3IoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Rvb2xNZW50b3InIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUb29sTWVudG9yIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBUb29sTWVudG9yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1VtYUZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9VbWFGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNWFkNWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1VtYUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVtYUZhY3RvcnkuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVW1hRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVVtYUZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFGYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3Rpdml0eTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZpdHkgY3JlYXRlQWN0aXZpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBY3Rpdml0eURlc2NyaXB0aW9uIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyBjcmVhdGVBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcnRpZmFjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXJ0aWZhY3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFydGlmYWN0IGNyZWF0ZUFydGlmYWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXJ0aWZhY3REZXNjcmlwdGlvbiBjcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQnJlYWtkb3duRWxlbWVudCBjcmVhdGVCcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ2FwYWJpbGl0eVBhdHRlcm4gY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNoZWNrbGlzdCBjcmVhdGVDaGVja2xpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb21wb3NpdGVSb2xlIGNyZWF0ZUNvbXBvc2l0ZVJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29uY2VwdCBjcmVhdGVDb25jZXB0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbnN0cmFpbnQgY3JlYXRlQ29uc3RyYWludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IENhdGVnb3J5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IENhdGVnb3J5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250ZW50Q2F0ZWdvcnkgY3JlYXRlQ29udGVudENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIGNyZWF0ZUNvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29udGVudERlc2NyaXB0aW9uIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29udGVudEVsZW1lbnQgY3JlYXRlQ29udGVudEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IFBhY2thZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbnRlbnRQYWNrYWdlIGNyZWF0ZUNvbnRlbnRQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDdXN0b21DYXRlZ29yeSBjcmVhdGVDdXN0b21DYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyYWJsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcmFibGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlbGl2ZXJhYmxlIGNyZWF0ZURlbGl2ZXJhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlbGl2ZXJ5UHJvY2VzcyBjcmVhdGVEZWxpdmVyeVByb2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVzY3JpYmFibGVFbGVtZW50IGNyZWF0ZURlc2NyaWJhYmxlRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZXNjcmlwdG9yIGNyZWF0ZURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVzY3JpcHRvckRlc2NyaXB0aW9uIGNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaXNjaXBsaW5lIGNyZWF0ZURpc2NpcGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGlzY2lwbGluZUdyb3VwaW5nIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb2N1bWVudFJvb3QgY3JlYXRlRG9jdW1lbnRSb290KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvbWFpbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RG9tYWluPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb21haW4gY3JlYXRlRG9tYWluKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVsZW1lbnQgY3JlYXRlRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Fc3RpbWF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXN0aW1hdGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVzdGltYXRlIGNyZWF0ZUVzdGltYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVzdGltYXRpbmcgTWV0cmljPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Fc3RpbWF0aW5nIE1ldHJpYzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXN0aW1hdGluZ01ldHJpYyBjcmVhdGVFc3RpbWF0aW5nTWV0cmljKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXhhbXBsZSBjcmVhdGVFeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkd1aWRhbmNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HdWlkYW5jZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JR3VpZGFuY2UgY3JlYXRlR3VpZGFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlHdWlkYW5jZURlc2NyaXB0aW9uIGNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HdWlkZWxpbmU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUd1aWRlbGluZSBjcmVhdGVHdWlkZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SXRlcmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JdGVyYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUl0ZXJhdGlvbiBjcmVhdGVJdGVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+S2luZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+S2luZDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JS2luZCBjcmVhdGVLaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kQ29uZmlndXJhdGlvbiBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kRWxlbWVudCBjcmVhdGVNZXRob2RFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kRWxlbWVudFByb3BlcnR5IGNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZExpYnJhcnkgY3JlYXRlTWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZFBhY2thZ2UgY3JlYXRlTWV0aG9kUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RQbHVnaW4gY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBVbml0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgVW5pdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kVW5pdCBjcmVhdGVNZXRob2RVbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNaWxlc3RvbmUgY3JlYXRlTWlsZXN0b25lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU5hbWVkRWxlbWVudCBjcmVhdGVOYW1lZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT3V0Y29tZSBjcmVhdGVPdXRjb21lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBhY2thZ2VhYmxlRWxlbWVudCBjcmVhdGVQYWNrYWdlYWJsZUVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGhhc2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBoYXNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQaGFzZSBjcmVhdGVQaGFzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQbGFubmluZ0RhdGEgY3JlYXRlUGxhbm5pbmdEYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByYWN0aWNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QcmFjdGljZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJhY3RpY2UgY3JlYXRlUHJhY3RpY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcmFjdGljZURlc2NyaXB0aW9uIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBjcmVhdGVQcm9jZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0NvbXBvbmVudCBjcmVhdGVQcm9jZXNzQ29tcG9uZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0Rlc2NyaXB0aW9uIGNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0VsZW1lbnQgY3JlYXRlUHJvY2Vzc0VsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NQYWNrYWdlIGNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIGNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXBvcnQgY3JlYXRlUmVwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmV1c2FibGVBc3NldCBjcmVhdGVSZXVzYWJsZUFzc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvYWRtYXAgY3JlYXRlUm9hZG1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlIGNyZWF0ZVJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZURlc2NyaXB0aW9uIGNyZWF0ZVJvbGVEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZURlc2NyaXB0b3IgY3JlYXRlUm9sZURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBTZXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgU2V0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlU2V0IGNyZWF0ZVJvbGVTZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlU2V0R3JvdXBpbmcgY3JlYXRlUm9sZVNldEdyb3VwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlY3Rpb24gY3JlYXRlU2VjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdXBwb3J0aW5nTWF0ZXJpYWwgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2s8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2s8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhc2sgY3JlYXRlVGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYXNrRGVzY3JpcHRpb24gY3JlYXRlVGFza0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYXNrRGVzY3JpcHRvciBjcmVhdGVUYXNrRGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlYW0gUHJvZmlsZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGVhbVByb2ZpbGUgY3JlYXRlVGVhbVByb2ZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVtcGxhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlbXBsYXRlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUZW1wbGF0ZSBjcmVhdGVUZW1wbGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGVybURlZmluaXRpb24gY3JlYXRlVGVybURlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVG9vbCBjcmVhdGVUb29sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRvb2wgTWVudG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Ub29sIE1lbnRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVG9vbE1lbnRvciBjcmVhdGVUb29sTWVudG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdoaXRlcGFwZXIgY3JlYXRlV2hpdGVwYXBlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrQnJlYWtkb3duRWxlbWVudCBjcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIERlZmluaXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya0RlZmluaXRpb24gY3JlYXRlV29ya0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBPcmRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBPcmRlcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya09yZGVyIGNyZWF0ZVdvcmtPcmRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya1Byb2R1Y3QgY3JlYXRlV29ya1Byb2R1Y3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtQcm9kdWN0RGVzY3JpcHRpb24gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdFR5cGUgY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVtYVBhY2thZ2UgZ2V0VW1hUGFja2FnZSgpOwotCi19IC8vVW1hRmFjdG9yeQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1VtYVBhY2thZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9VbWFQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2M2RmNTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1VtYVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MTg4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVW1hUGFja2FnZS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVW1hUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJ1bWEiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjUiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAidW1hIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVW1hUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5FbGVtZW50SW1wbCA8ZW0+RWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFTEVNRU5UID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwgPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TmFtZWRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5BTUVEX0VMRU1FTlQgPSA0NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTkFNRURfRUxFTUVOVF9fTkFNRSA9IEVMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TmFtZWQgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOQU1FRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBFTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlBhY2thZ2VhYmxlRWxlbWVudEltcGwgPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlBhY2thZ2VhYmxlRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UGFja2FnZWFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBBQ0tBR0VBQkxFX0VMRU1FTlQgPSA0OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFDS0FHRUFCTEVfRUxFTUVOVF9fTkFNRSA9IE5BTUVEX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBOQU1FRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsIDxlbT5NZXRob2QgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVCA9IDQwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fTkFNRSA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19HUk9VUCA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEUgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19JRCA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwgPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlQgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19HUk9VUCA9IE1FVEhPRF9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19PV05FRF9SVUxFID0gTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19JRCA9IE1FVEhPRF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19GVUxGSUxMID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NFbGVtZW50SW1wbCA8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0VsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UID0gNTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fTkFNRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fR1JPVVAgPSBERVNDUklCQUJMRV9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX09XTkVEX1JVTEUgPSBERVNDUklCQUJMRV9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX0lEID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19GVUxGSUxMID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fSVNfQUJTVFJBQ1QgPSBERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fTk9ERUlDT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX1NIQVBFSUNPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsIDxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19OQU1FID0gUFJPQ0VTU19FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAgPSBQUk9DRVNTX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFID0gUFJPQ0VTU19FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQUk9DRVNTX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19JRCA9IFBST0NFU1NfRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gUFJPQ0VTU19FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBQUk9DRVNTX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTiA9IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19GVUxGSUxMID0gUFJPQ0VTU19FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUID0gUFJPQ0VTU19FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTiA9IFBST0NFU1NfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTiA9IFBST0NFU1NfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVIgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDEgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fV0hJVEVQQVBFUiA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsIDxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVCA9IDgwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQID0gQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lEID0gQlJFQUtET1dOX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fRlVMRklMTCA9IEJSRUFLRE9XTl9FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfQUJTVFJBQ1QgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDEgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUID0gQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUID0gQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FID0gQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQgPSBCUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVIgPSBCUkVBS0RPV05fRUxFTUVOVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVggPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkcgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsIDxlbT5BY3Rpdml0eTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFDVElWSVRZID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX05BTUUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fR1JPVVAgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fT1dORURfUlVMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19PUkRFUklOR19HVUlERSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19TVVBQUkVTU0VEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19GVUxGSUxMID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19JU19BQlNUUkFDVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX05PREVJQ09OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1NIQVBFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFU0VOVEVEX0FGVEVSID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFU0VOVEVEX0JFRk9SRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QTEFOTklOR19EQVRBID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19TVVBFUl9BQ1RJVklUWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0dST1VQMSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19DSEVDS0xJU1QgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0NPTkNFUFQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19FWEFNUExFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19HVUlERUxJTkUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19SRVVTQUJMRV9BU1NFVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fV0hJVEVQQVBFUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19JU19PUFRJT05BTCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfUExBTk5FRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRUZJWCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19HUk9VUDIgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QUkVERUNFU1NPUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19JU19FVkVOVF9EUklWRU4gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19JU19PTkdPSU5HID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0lTX1JFUEVBVEFCTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QUkVDT05ESVRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUE9TVENPTkRJVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fR1JPVVAzID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUk9BRE1BUCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRW5hY3RhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0lTX0VOQUNUQUJMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFjdGl2aXR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsIDxlbT5NZXRob2QgVW5pdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kVW5pdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVCA9IDQ1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fR1JPVVAgPSBNRVRIT0RfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX09XTkVEX1JVTEUgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX0lEID0gTUVUSE9EX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19DT1BZUklHSFQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX0FVVEhPUlMgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19DSEFOR0VfREFURSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX1ZFUlNJT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgVW5pdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCA8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTiA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FID0gTUVUSE9EX1VOSVRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0dST1VQID0gTUVUSE9EX1VOSVRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBNRVRIT0RfVU5JVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfVU5JVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0lEID0gTUVUSE9EX1VOSVRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfVU5JVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9VTklUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IE1FVEhPRF9VTklUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVCA9IE1FVEhPRF9VTklUX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBNRVRIT0RfVU5JVF9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBNRVRIT0RfVU5JVF9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsIDxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT04gPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19HUk9VUCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsIDxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19HUk9VUCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NPUFlSSUdIVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fU0VDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SG93IFRvIFN0YWZmPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwgPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8gPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19fTkFNRSA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUHJpbWFyeSBFeHRlbnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19fSVNfUFJJTUFSWV9FWFRFTlNJT04gPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX0ZFQVRVUkVfQ09VTlQgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCA8ZW0+Q29udGVudCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fTkFNRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fR1JPVVAgPSBERVNDUklCQUJMRV9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEUgPSBERVNDUklCQUJMRV9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0lEID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19GVUxGSUxMID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fSVNfQUJTVFJBQ1QgPSBERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fR1JPVVAxID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0NPTkNFUFQgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVCA9IDgzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fR1JPVVAgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fT1dORURfUlVMRSA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fSUQgPSBDT05URU5UX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19GVUxGSUxMID0gQ09OVEVOVF9FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19JU19BQlNUUkFDVCA9IENPTlRFTlRfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX05PREVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1NIQVBFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19HUk9VUDEgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19DT05DRVBUID0gQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fRVhBTVBMRSA9IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fR1VJREVMSU5FID0gQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fUkVVU0FCTEVfQVNTRVQgPSBDT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1dISVRFUEFQRVIgPSBDT05URU5UX0VMRU1FTlRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19HUk9VUDIgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fRVNUSU1BVEUgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19SRVBPUlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fVEVNUExBVEUgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1IgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFydGlmYWN0SW1wbCA8ZW0+QXJ0aWZhY3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFydGlmYWN0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBcnRpZmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBUlRJRkFDVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19OQU1FID0gV09SS19QUk9EVUNUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fR1JPVVAgPSBXT1JLX1BST0RVQ1RfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19PV05FRF9SVUxFID0gV09SS19QUk9EVUNUX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBXT1JLX1BST0RVQ1RfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19JRCA9IFdPUktfUFJPRFVDVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fT1JERVJJTkdfR1VJREUgPSBXT1JLX1BST0RVQ1RfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1NVUFBSRVNTRUQgPSBXT1JLX1BST0RVQ1RfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1BSRVNFTlRBVElPTiA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19GVUxGSUxMID0gV09SS19QUk9EVUNUX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0lTX0FCU1RSQUNUID0gV09SS19QUk9EVUNUX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19OT0RFSUNPTiA9IFdPUktfUFJPRFVDVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1NIQVBFSUNPTiA9IFdPUktfUFJPRFVDVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0dST1VQMSA9IFdPUktfUFJPRFVDVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0NIRUNLTElTVCA9IFdPUktfUFJPRFVDVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19DT05DRVBUID0gV09SS19QUk9EVUNUX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19FWEFNUExFID0gV09SS19QUk9EVUNUX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0dVSURFTElORSA9IFdPUktfUFJPRFVDVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fUkVVU0FCTEVfQVNTRVQgPSBXT1JLX1BST0RVQ1RfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19TVVBQT1JUSU5HX01BVEVSSUFMID0gV09SS19QUk9EVUNUX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19XSElURVBBUEVSID0gV09SS19QUk9EVUNUX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1ZBUklBQklMSVRZX1RZUEUgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fR1JPVVAyID0gV09SS19QUk9EVUNUX19HUk9VUDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19FU1RJTUFURSA9IFdPUktfUFJPRFVDVF9fRVNUSU1BVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBXT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fUkVQT1JUID0gV09SS19QUk9EVUNUX19SRVBPUlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19URU1QTEFURSA9IFdPUktfUFJPRFVDVF9fVEVNUExBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19UT09MX01FTlRPUiA9IFdPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fR1JPVVAzID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lZCBBcnRpZmFjdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVCA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BcnRpZmFjdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9GRUFUVVJFX0NPVU5UID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OID0gODQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fR1JPVVAgPSBDT05URU5UX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQVVUSE9SUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fVkVSU0lPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBhY3QgT2YgTm90IEhhdmluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbCA8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT04gPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fTkFNRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0dST1VQID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fSUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fU0VDVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU0VDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fUFVSUE9TRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgT3V0bGluZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXByZXNlbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NJbXBsIDxlbT5Qcm9jZXNzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0NFU1MgPSA1NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fTkFNRSA9IEFDVElWSVRZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19HUk9VUCA9IEFDVElWSVRZX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19PV05FRF9SVUxFID0gQUNUSVZJVFlfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQUNUSVZJVFlfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fQlJJRUZfREVTQ1JJUFRJT04gPSBBQ1RJVklUWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JRCA9IEFDVElWSVRZX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX09SREVSSU5HX0dVSURFID0gQUNUSVZJVFlfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFU0VOVEFUSU9OX05BTUUgPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1NVUFBSRVNTRUQgPSBBQ1RJVklUWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QUkVTRU5UQVRJT04gPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0ZVTEZJTEwgPSBBQ1RJVklUWV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX0FCU1RSQUNUID0gQUNUSVZJVFlfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fTk9ERUlDT04gPSBBQ1RJVklUWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fU0hBUEVJQ09OID0gQUNUSVZJVFlfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QUkVTRU5URURfQUZURVIgPSBBQ1RJVklUWV9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QUkVTRU5URURfQkVGT1JFID0gQUNUSVZJVFlfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BMQU5OSU5HX0RBVEEgPSBBQ1RJVklUWV9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1NVUEVSX0FDVElWSVRZID0gQUNUSVZJVFlfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fR1JPVVAxID0gQUNUSVZJVFlfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0NIRUNLTElTVCA9IEFDVElWSVRZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fQ09OQ0VQVCA9IEFDVElWSVRZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0VYQU1QTEUgPSBBQ1RJVklUWV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0dVSURFTElORSA9IEFDVElWSVRZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1JFVVNBQkxFX0FTU0VUID0gQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBBQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19XSElURVBBUEVSID0gQUNUSVZJVFlfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQUNUSVZJVFlfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX09QVElPTkFMID0gQUNUSVZJVFlfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19QTEFOTkVEID0gQUNUSVZJVFlfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFRklYID0gQUNUSVZJVFlfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0dST1VQMiA9IEFDVElWSVRZX19HUk9VUDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRURFQ0VTU09SID0gQUNUSVZJVFlfX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX0VWRU5UX0RSSVZFTiA9IEFDVElWSVRZX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX09OR09JTkcgPSBBQ1RJVklUWV9fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSVNfUkVQRUFUQUJMRSA9IEFDVElWSVRZX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRUNPTkRJVElPTiA9IEFDVElWSVRZX19QUkVDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BPU1RDT05ESVRJT04gPSBBQ1RJVklUWV9fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0dST1VQMyA9IEFDVElWSVRZX19HUk9VUDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0JSRUFLRE9XTl9FTEVNRU5UID0gQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1JPQURNQVAgPSBBQ1RJVklUWV9fUk9BRE1BUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19FTkFDVEFCTEUgPSBBQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1ZBUklBQklMSVRZX1RZUEUgPSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fREVGQVVMVF9DT05URVhUID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fVkFMSURfQ09OVEVYVCA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW0gVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fRElBR1JBTV9VUkkgPSBBQ1RJVklUWV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkVBVFVSRV9DT1VOVCA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNhcGFiaWxpdHlQYXR0ZXJuSW1wbCA8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19OQU1FID0gUFJPQ0VTU19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19HUk9VUCA9IFBST0NFU1NfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fT1dORURfUlVMRSA9IFBST0NFU1NfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQUk9DRVNTX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSUQgPSBQUk9DRVNTX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19TVVBQUkVTU0VEID0gUFJPQ0VTU19fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRVNFTlRBVElPTiA9IFBST0NFU1NfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0ZVTEZJTEwgPSBQUk9DRVNTX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JU19BQlNUUkFDVCA9IFBST0NFU1NfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19OT0RFSUNPTiA9IFBST0NFU1NfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fU0hBUEVJQ09OID0gUFJPQ0VTU19fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUFJFU0VOVEVEX0FGVEVSID0gUFJPQ0VTU19fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRVNFTlRFRF9CRUZPUkUgPSBQUk9DRVNTX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BMQU5OSU5HX0RBVEEgPSBQUk9DRVNTX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19TVVBFUl9BQ1RJVklUWSA9IFBST0NFU1NfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19HUk9VUDEgPSBQUk9DRVNTX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0NIRUNLTElTVCA9IFBST0NFU1NfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0NPTkNFUFQgPSBQUk9DRVNTX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fRVhBTVBMRSA9IFBST0NFU1NfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0dVSURFTElORSA9IFBST0NFU1NfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19SRVVTQUJMRV9BU1NFVCA9IFBST0NFU1NfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fU1VQUE9SVElOR19NQVRFUklBTCA9IFBST0NFU1NfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19XSElURVBBUEVSID0gUFJPQ0VTU19fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFBST0NFU1NfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfT1BUSU9OQUwgPSBQUk9DRVNTX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JU19QTEFOTkVEID0gUFJPQ0VTU19fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRUZJWCA9IFBST0NFU1NfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fR1JPVVAyID0gUFJPQ0VTU19fR1JPVVAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRURFQ0VTU09SID0gUFJPQ0VTU19fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JU19FVkVOVF9EUklWRU4gPSBQUk9DRVNTX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfT05HT0lORyA9IFBST0NFU1NfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfUkVQRUFUQUJMRSA9IFBST0NFU1NfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QUkVDT05ESVRJT04gPSBQUk9DRVNTX19QUkVDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUE9TVENPTkRJVElPTiA9IFBST0NFU1NfX1BPU1RDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0dST1VQMyA9IFBST0NFU1NfX0dST1VQMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19CUkVBS0RPV05fRUxFTUVOVCA9IFBST0NFU1NfX0JSRUFLRE9XTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUk9BRE1BUCA9IFBST0NFU1NfX1JPQURNQVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRW5hY3RhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JU19FTkFDVEFCTEUgPSBQUk9DRVNTX19JU19FTkFDVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFBST0NFU1NfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fVkFSSUFCSUxJVFlfVFlQRSA9IFBST0NFU1NfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZXMgUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JTkNMVURFU19QQVRURVJOID0gUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0RFRkFVTFRfQ09OVEVYVCA9IFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1ZBTElEX0NPTlRFWFQgPSBQUk9DRVNTX19WQUxJRF9DT05URVhUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW0gVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19ESUFHUkFNX1VSSSA9IFBST0NFU1NfX0RJQUdSQU1fVVJJOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGFuY2VJbXBsIDxlbT5HdWlkYW5jZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGFuY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEd1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdVSURBTkNFID0gMzQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fR1JPVVAgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19PV05FRF9SVUxFID0gQ09OVEVOVF9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19JRCA9IENPTlRFTlRfRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1NVUFBSRVNTRUQgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19GVUxGSUxMID0gQ09OVEVOVF9FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19OT0RFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1NIQVBFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0dST1VQMSA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0NIRUNLTElTVCA9IENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19DT05DRVBUID0gQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19FWEFNUExFID0gQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0dVSURFTElORSA9IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQgPSBDT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19XSElURVBBUEVSID0gQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3VpZGFuY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DaGVja2xpc3RJbXBsIDxlbT5DaGVja2xpc3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNoZWNrbGlzdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q2hlY2tsaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENIRUNLTElTVCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2hlY2tsaXN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVzY3JpcHRvckltcGwgPGVtPkRlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUiA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0dST1VQID0gQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX09XTkVEX1JVTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0lEID0gQlJFQUtET1dOX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREUgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fRlVMRklMTCA9IEJSRUFLRE9XTl9FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fSVNfQUJTVFJBQ1QgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19OT0RFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19TSEFQRUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19HUk9VUDEgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fQ0hFQ0tMSVNUID0gQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19DT05DRVBUID0gQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fRVhBTVBMRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fR1VJREVMSU5FID0gQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fUkVVU0FCTEVfQVNTRVQgPSBCUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fU1VQUE9SVElOR19NQVRFUklBTCA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1dISVRFUEFQRVIgPSBCUkVBS0RPV05fRUxFTUVOVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0lTX1BMQU5ORUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QUkVGSVggPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsIDxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1IgPSA2NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19OQU1FID0gREVTQ1JJUFRPUl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19HUk9VUCA9IERFU0NSSVBUT1JfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fT1dORURfUlVMRSA9IERFU0NSSVBUT1JfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBERVNDUklQVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fSUQgPSBERVNDUklQVE9SX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREUgPSBERVNDUklQVE9SX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19TVVBQUkVTU0VEID0gREVTQ1JJUFRPUl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTiA9IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0ZVTEZJTEwgPSBERVNDUklQVE9SX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19JU19BQlNUUkFDVCA9IERFU0NSSVBUT1JfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19OT0RFSUNPTiA9IERFU0NSSVBUT1JfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fU0hBUEVJQ09OID0gREVTQ1JJUFRPUl9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSID0gREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkUgPSBERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEEgPSBERVNDUklQVE9SX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUWSA9IERFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19HUk9VUDEgPSBERVNDUklQVE9SX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0NIRUNLTElTVCA9IERFU0NSSVBUT1JfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0NPTkNFUFQgPSBERVNDUklQVE9SX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fRVhBTVBMRSA9IERFU0NSSVBUT1JfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0dVSURFTElORSA9IERFU0NSSVBUT1JfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19SRVVTQUJMRV9BU1NFVCA9IERFU0NSSVBUT1JfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fU1VQUE9SVElOR19NQVRFUklBTCA9IERFU0NSSVBUT1JfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19XSElURVBBUEVSID0gREVTQ1JJUFRPUl9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IERFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUwgPSBERVNDUklQVE9SX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19JU19QTEFOTkVEID0gREVTQ1JJUFRPUl9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BSRUZJWCA9IERFU0NSSVBUT1JfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IERFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19ST0xFID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsIDxlbT5Db21wb3NpdGUgUm9sZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29tcG9zaXRlUm9sZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29tcG9zaXRlUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19OQU1FID0gUk9MRV9ERVNDUklQVE9SX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fR1JPVVAgPSBST0xFX0RFU0NSSVBUT1JfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19PV05FRF9SVUxFID0gUk9MRV9ERVNDUklQVE9SX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBST0xFX0RFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gUk9MRV9ERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19JRCA9IFJPTEVfREVTQ1JJUFRPUl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fT1JERVJJTkdfR1VJREUgPSBST0xFX0RFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRVNFTlRBVElPTl9OQU1FID0gUk9MRV9ERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1NVUFBSRVNTRUQgPSBST0xFX0RFU0NSSVBUT1JfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRVNFTlRBVElPTiA9IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19GVUxGSUxMID0gUk9MRV9ERVNDUklQVE9SX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0lTX0FCU1RSQUNUID0gUk9MRV9ERVNDUklQVE9SX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19OT0RFSUNPTiA9IFJPTEVfREVTQ1JJUFRPUl9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1NIQVBFSUNPTiA9IFJPTEVfREVTQ1JJUFRPUl9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19QUkVTRU5URURfQUZURVIgPSBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRVNFTlRFRF9CRUZPUkUgPSBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19QTEFOTklOR19EQVRBID0gUk9MRV9ERVNDUklQVE9SX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1NVUEVSX0FDVElWSVRZID0gUk9MRV9ERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19HUk9VUDEgPSBST0xFX0RFU0NSSVBUT1JfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19DSEVDS0xJU1QgPSBST0xFX0RFU0NSSVBUT1JfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fQ09OQ0VQVCA9IFJPTEVfREVTQ1JJUFRPUl9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fRVhBTVBMRSA9IFJPTEVfREVTQ1JJUFRPUl9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19HVUlERUxJTkUgPSBST0xFX0RFU0NSSVBUT1JfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1JFVVNBQkxFX0FTU0VUID0gUk9MRV9ERVNDUklQVE9SX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fU1VQUE9SVElOR19NQVRFUklBTCA9IFJPTEVfREVTQ1JJUFRPUl9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fV0hJVEVQQVBFUiA9IFJPTEVfREVTQ1JJUFRPUl9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gUk9MRV9ERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSVNfT1BUSU9OQUwgPSBST0xFX0RFU0NSSVBUT1JfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSVNfUExBTk5FRCA9IFJPTEVfREVTQ1JJUFRPUl9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUFJFRklYID0gUk9MRV9ERVNDUklQVE9SX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IFJPTEVfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUk9MRSA9IFJPTEVfREVTQ1JJUFRPUl9fUk9MRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19SRVNQT05TSUJMRV9GT1IgPSBST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19HUk9VUDIgPSBST0xFX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWdncmVnYXRlZCBSb2xlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFID0gUk9MRV9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX0ZFQVRVUkVfQ09VTlQgPSBST0xFX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29uY2VwdEltcGwgPGVtPkNvbmNlcHQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbmNlcHRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbmNlcHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVCA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbmNlcHQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29uc3RyYWludEltcGwgPGVtPkNvbnN0cmFpbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnN0cmFpbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnN0cmFpbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVCA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX0dST1VQID0gTUVUSE9EX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX09XTkVEX1JVTEUgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX0lEID0gTUVUSE9EX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19NQUlOX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29uc3RyYWludDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlJbXBsIDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRDYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0dST1VQID0gQ09OVEVOVF9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFID0gQ09OVEVOVF9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19JRCA9IENPTlRFTlRfRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fRlVMRklMTCA9IENPTlRFTlRfRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT04gPSBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0dST1VQMSA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVCA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFID0gQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FID0gQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1dISVRFUEFQRVIgPSBDT05URU5UX0VMRU1FTlRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFID0gNDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19HUk9VUCA9IE1FVEhPRF9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fT1dORURfUlVMRSA9IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fSUQgPSBNRVRIT0RfRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19TVVBQUkVTU0VEID0gTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fR1JPVVAxID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2VkIFBhY2thZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0UgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fR0xPQkFMID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2VJbXBsIDxlbT5Db250ZW50IENhdGVnb3J5IFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fTkFNRSA9IE1FVEhPRF9QQUNLQUdFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0dST1VQID0gTUVUSE9EX1BBQ0tBR0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fT1dORURfUlVMRSA9IE1FVEhPRF9QQUNLQUdFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fSUQgPSBNRVRIT0RfUEFDS0FHRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9QQUNLQUdFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19TVVBQUkVTU0VEID0gTUVUSE9EX1BBQ0tBR0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0dST1VQMSA9IE1FVEhPRF9QQUNLQUdFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2VkIFBhY2thZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0UgPSBNRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0UgPSBNRVRIT0RfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HTE9CQUwgPSBNRVRIT0RfUEFDS0FHRV9fR0xPQkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDIgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50IENhdGVnb3J5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0NPTlRFTlRfQ0FURUdPUlkgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db250ZW50IENhdGVnb3J5IFBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwgPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRSA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX05BTUUgPSBNRVRIT0RfUEFDS0FHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19HUk9VUCA9IE1FVEhPRF9QQUNLQUdFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX09XTkVEX1JVTEUgPSBNRVRIT0RfUEFDS0FHRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0lEID0gTUVUSE9EX1BBQ0tBR0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9QQUNLQUdFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfUEFDS0FHRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fU1VQUFJFU1NFRCA9IE1FVEhPRF9QQUNLQUdFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19HUk9VUDEgPSBNRVRIT0RfUEFDS0FHRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFID0gTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFID0gTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdsb2JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fR0xPQkFMID0gTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fR1JPVVAyID0gTUVUSE9EX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVCA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkN1c3RvbUNhdGVnb3J5SW1wbCA8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fR1JPVVAgPSBDT05URU5UX0NBVEVHT1JZX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX09XTkVEX1JVTEUgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0lEID0gQ09OVEVOVF9DQVRFR09SWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19GVUxGSUxMID0gQ09OVEVOVF9DQVRFR09SWV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0NBVEVHT1JZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fR1JPVVAxID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19DSEVDS0xJU1QgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19DT05DRVBUID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0VYQU1QTEUgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19HVUlERUxJTkUgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fUkVVU0FCTEVfQVNTRVQgPSBDT05URU5UX0NBVEVHT1JZX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fV0hJVEVQQVBFUiA9IENPTlRFTlRfQ0FURUdPUllfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0dST1VQMiA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0ZWdvcml6ZWQgRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWIgQ2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JZID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbCA8ZW0+RGVsaXZlcmFibGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZWxpdmVyYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERUxJVkVSQUJMRSA9IDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fTkFNRSA9IFdPUktfUFJPRFVDVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0dST1VQID0gV09SS19QUk9EVUNUX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fT1dORURfUlVMRSA9IFdPUktfUFJPRFVDVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19QUk9EVUNUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fSUQgPSBXT1JLX1BST0RVQ1RfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19TVVBQUkVTU0VEID0gV09SS19QUk9EVUNUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19QUkVTRU5UQVRJT04gPSBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fRlVMRklMTCA9IFdPUktfUFJPRFVDVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19JU19BQlNUUkFDVCA9IFdPUktfUFJPRFVDVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fTk9ERUlDT04gPSBXT1JLX1BST0RVQ1RfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19TSEFQRUlDT04gPSBXT1JLX1BST0RVQ1RfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19HUk9VUDEgPSBXT1JLX1BST0RVQ1RfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19DSEVDS0xJU1QgPSBXT1JLX1BST0RVQ1RfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fQ09OQ0VQVCA9IFdPUktfUFJPRFVDVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fRVhBTVBMRSA9IFdPUktfUFJPRFVDVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19HVUlERUxJTkUgPSBXT1JLX1BST0RVQ1RfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1JFVVNBQkxFX0FTU0VUID0gV09SS19QUk9EVUNUX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fU1VQUE9SVElOR19NQVRFUklBTCA9IFdPUktfUFJPRFVDVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fV0hJVEVQQVBFUiA9IFdPUktfUFJPRFVDVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19WQVJJQUJJTElUWV9UWVBFID0gV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0dST1VQMiA9IFdPUktfUFJPRFVDVF9fR1JPVVAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fRVNUSU1BVEUgPSBXT1JLX1BST0RVQ1RfX0VTVElNQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1JFUE9SVCA9IFdPUktfUFJPRFVDVF9fUkVQT1JUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fVEVNUExBVEUgPSBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fVE9PTF9NRU5UT1IgPSBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0dST1VQMyA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyZWQgV29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVCA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZWxpdmVyYWJsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9GRUFUVVJFX0NPVU5UID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsIDxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTiA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fTkFNRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0dST1VQID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fSUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fU0VDVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU0VDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUFVSUE9TRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFja2FnaW5nIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwgPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1MgPSAyMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fTkFNRSA9IFBST0NFU1NfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0dST1VQID0gUFJPQ0VTU19fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fT1dORURfUlVMRSA9IFBST0NFU1NfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSUQgPSBQUk9DRVNTX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX09SREVSSU5HX0dVSURFID0gUFJPQ0VTU19fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVTRU5UQVRJT05fTkFNRSA9IFBST0NFU1NfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19TVVBQUkVTU0VEID0gUFJPQ0VTU19fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVTRU5UQVRJT04gPSBQUk9DRVNTX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fRlVMRklMTCA9IFBST0NFU1NfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19BQlNUUkFDVCA9IFBST0NFU1NfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fTk9ERUlDT04gPSBQUk9DRVNTX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19TSEFQRUlDT04gPSBQUk9DRVNTX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFU0VOVEVEX0FGVEVSID0gUFJPQ0VTU19fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVTRU5URURfQkVGT1JFID0gUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUExBTk5JTkdfREFUQSA9IFBST0NFU1NfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19TVVBFUl9BQ1RJVklUWSA9IFBST0NFU1NfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fR1JPVVAxID0gUFJPQ0VTU19fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fQ0hFQ0tMSVNUID0gUFJPQ0VTU19fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0NPTkNFUFQgPSBQUk9DRVNTX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0VYQU1QTEUgPSBQUk9DRVNTX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fR1VJREVMSU5FID0gUFJPQ0VTU19fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19SRVVTQUJMRV9BU1NFVCA9IFBST0NFU1NfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBQUk9DRVNTX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1dISVRFUEFQRVIgPSBQUk9DRVNTX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFBST0NFU1NfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0lTX09QVElPTkFMID0gUFJPQ0VTU19fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0lTX1BMQU5ORUQgPSBQUk9DRVNTX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BSRUZJWCA9IFBST0NFU1NfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0dST1VQMiA9IFBST0NFU1NfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFREVDRVNTT1IgPSBQUk9DRVNTX19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19FVkVOVF9EUklWRU4gPSBQUk9DRVNTX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0lTX09OR09JTkcgPSBQUk9DRVNTX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19SRVBFQVRBQkxFID0gUFJPQ0VTU19fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVDT05ESVRJT04gPSBQUk9DRVNTX19QUkVDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BPU1RDT05ESVRJT04gPSBQUk9DRVNTX19QT1NUQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fR1JPVVAzID0gUFJPQ0VTU19fR1JPVVAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19CUkVBS0RPV05fRUxFTUVOVCA9IFBST0NFU1NfX0JSRUFLRE9XTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1JPQURNQVAgPSBQUk9DRVNTX19ST0FETUFQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0lTX0VOQUNUQUJMRSA9IFBST0NFU1NfX0lTX0VOQUNUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFBST0NFU1NfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1ZBUklBQklMSVRZX1RZUEUgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk4gPSBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCA9IFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19WQUxJRF9DT05URVhUID0gUFJPQ0VTU19fVkFMSURfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0RJQUdSQU1fVVJJID0gUFJPQ0VTU19fRElBR1JBTV9VUkk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19HUk9VUDQgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbW11bmljYXRpb25zIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTCA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWR1Y2F0aW9uIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUwgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsIDxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OID0gNTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX05BTUUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fR1JPVVAgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fSUQgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQVVUSE9SUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fVkVSU0lPTiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SG93IFRvIFN0YWZmPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fUFVSUE9TRSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjb3BlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBOb3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OID0gMjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX05BTUUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19HUk9VUCA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0lEID0gUFJPQ0VTU19ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gUFJPQ0VTU19ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gUFJPQ0VTU19ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhvdyBUbyBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFVSUE9TRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1BVUlBPU0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIE5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVMgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2FsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SaXNrIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTCA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGluZyBUZWNobmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIE9mIENvbnRyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVCA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwgPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT04gPSAyNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19HUk9VUCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19JRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fU0VDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmaW5lZCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsIDxlbT5EaXNjaXBsaW5lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERJU0NJUExJTkUgPSAyNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0dST1VQID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fT1dORURfUlVMRSA9IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fSUQgPSBDT05URU5UX0NBVEVHT1JZX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19TVVBQUkVTU0VEID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fRlVMRklMTCA9IENPTlRFTlRfQ0FURUdPUllfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19JU19BQlNUUkFDVCA9IENPTlRFTlRfQ0FURUdPUllfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19HUk9VUDEgPSBDT05URU5UX0NBVEVHT1JZX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19DSEVDS0xJU1QgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fQ09OQ0VQVCA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fRVhBTVBMRSA9IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19HVUlERUxJTkUgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9DQVRFR09SWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fV0hJVEVQQVBFUiA9IENPTlRFTlRfQ0FURUdPUllfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0dST1VQMiA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFzazwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fVEFTSyA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIERpc2NpcGxpbmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1NVQl9ESVNDSVBMSU5FID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2UgV29ya2Zsb3c8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPVyA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlzY2lwbGluZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRpc2NpcGxpbmVHcm91cGluZ0ltcGwgPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRpc2NpcGxpbmVHcm91cGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkcgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0dST1VQID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fT1dORURfUlVMRSA9IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fSUQgPSBDT05URU5UX0NBVEVHT1JZX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19TVVBQUkVTU0VEID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fRlVMRklMTCA9IENPTlRFTlRfQ0FURUdPUllfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19JU19BQlNUUkFDVCA9IENPTlRFTlRfQ0FURUdPUllfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUDEgPSBDT05URU5UX0NBVEVHT1JZX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19DSEVDS0xJU1QgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fQ09OQ0VQVCA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fRVhBTVBMRSA9IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19HVUlERUxJTkUgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9DQVRFR09SWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fV0hJVEVQQVBFUiA9IENPTlRFTlRfQ0FURUdPUllfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0dST1VQMiA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzY2lwbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORSA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwgPGVtPkRvY3VtZW50IFJvb3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1QgPSAyNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fTUlYRUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIExpYnJhcnk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX01FVEhPRF9QTFVHSU4gPSA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9GRUFUVVJFX0NPVU5UID0gNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb21haW5JbXBsIDxlbT5Eb21haW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvbWFpbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RG9tYWluKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERPTUFJTiA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0dST1VQID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19PV05FRF9SVUxFID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19JRCA9IENPTlRFTlRfQ0FURUdPUllfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fRlVMRklMTCA9IENPTlRFTlRfQ0FURUdPUllfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0dST1VQMSA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fQ09OQ0VQVCA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19FWEFNUExFID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fR1VJREVMSU5FID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9DQVRFR09SWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1dISVRFUEFQRVIgPSBDT05URU5UX0NBVEVHT1JZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19HUk9VUDIgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19XT1JLX1BST0RVQ1QgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YmRvbWFpbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19TVUJET01BSU4gPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRvbWFpbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGVJbXBsIDxlbT5Fc3RpbWF0ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVzdGltYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVTVElNQVRFID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX0ZVTEZJTEwgPSBHVUlEQU5DRV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fR1JPVVAyID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBNZXRyaWM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19FU1RJTUFUSU9OX01FVFJJQyA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RXN0aW1hdGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRpbmdNZXRyaWNJbXBsIDxlbT5Fc3RpbWF0aW5nIE1ldHJpYzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGluZ01ldHJpY0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RXN0aW1hdGluZ01ldHJpYygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQyA9IDMxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19GVUxGSUxMID0gR1VJREFOQ0VfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVzdGltYXRpbmcgTWV0cmljPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gMzI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19GVUxGSUxMID0gR1VJREFOQ0VfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5FeGFtcGxlSW1wbCA8ZW0+RXhhbXBsZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXhhbXBsZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RXhhbXBsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWEFNUExFID0gMzM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19GVUxGSUxMID0gR1VJREFOQ0VfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RXhhbXBsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5HdWlkYW5jZURlc2NyaXB0aW9uSW1wbCA8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRhbmNlRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEd1aWRhbmNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT04gPSAzNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fR1JPVVAgPSBDT05URU5UX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fQVVUSE9SUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fVkVSU0lPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dGFjaG1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGVsaW5lSW1wbCA8ZW0+R3VpZGVsaW5lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5HdWlkZWxpbmVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEd1aWRlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBHVUlERUxJTkUgPSAzNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19GVUxGSUxMID0gR1VJREFOQ0VfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5HdWlkZWxpbmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5JdGVyYXRpb25JbXBsIDxlbT5JdGVyYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkl0ZXJhdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0SXRlcmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElURVJBVElPTiA9IDM3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX05BTUUgPSBBQ1RJVklUWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19HUk9VUCA9IEFDVElWSVRZX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX09XTkVEX1JVTEUgPSBBQ1RJVklUWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEFDVElWSVRZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBBQ1RJVklUWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0lEID0gQUNUSVZJVFlfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19PUkRFUklOR19HVUlERSA9IEFDVElWSVRZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fU1VQUFJFU1NFRCA9IEFDVElWSVRZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFU0VOVEFUSU9OID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0ZVTEZJTEwgPSBBQ1RJVklUWV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfQUJTVFJBQ1QgPSBBQ1RJVklUWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX05PREVJQ09OID0gQUNUSVZJVFlfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fU0hBUEVJQ09OID0gQUNUSVZJVFlfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRVNFTlRFRF9BRlRFUiA9IEFDVElWSVRZX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFU0VOVEVEX0JFRk9SRSA9IEFDVElWSVRZX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BMQU5OSU5HX0RBVEEgPSBBQ1RJVklUWV9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fU1VQRVJfQUNUSVZJVFkgPSBBQ1RJVklUWV9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0dST1VQMSA9IEFDVElWSVRZX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0NIRUNLTElTVCA9IEFDVElWSVRZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19DT05DRVBUID0gQUNUSVZJVFlfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19FWEFNUExFID0gQUNUSVZJVFlfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0dVSURFTElORSA9IEFDVElWSVRZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUkVVU0FCTEVfQVNTRVQgPSBBQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQUNUSVZJVFlfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19XSElURVBBUEVSID0gQUNUSVZJVFlfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBBQ1RJVklUWV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19PUFRJT05BTCA9IEFDVElWSVRZX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19QTEFOTkVEID0gQUNUSVZJVFlfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QUkVGSVggPSBBQ1RJVklUWV9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19HUk9VUDIgPSBBQ1RJVklUWV9fR1JPVVAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRURFQ0VTU09SID0gQUNUSVZJVFlfX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfRVZFTlRfRFJJVkVOID0gQUNUSVZJVFlfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19PTkdPSU5HID0gQUNUSVZJVFlfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfUkVQRUFUQUJMRSA9IEFDVElWSVRZX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFQ09ORElUSU9OID0gQUNUSVZJVFlfX1BSRUNPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QT1NUQ09ORElUSU9OID0gQUNUSVZJVFlfX1BPU1RDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0dST1VQMyA9IEFDVElWSVRZX19HUk9VUDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fQlJFQUtET1dOX0VMRU1FTlQgPSBBQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19ST0FETUFQID0gQUNUSVZJVFlfX1JPQURNQVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRW5hY3RhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19FTkFDVEFCTEUgPSBBQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19WQVJJQUJJTElUWV9UWVBFID0gQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SXRlcmF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9GRUFUVVJFX0NPVU5UID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuS2luZEltcGwgPGVtPktpbmQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLktpbmRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgS0lORCA9IDM4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19HUk9VUCA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fT1dORURfUlVMRSA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fSUQgPSBDT05URU5UX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX0ZVTEZJTEwgPSBDT05URU5UX0VMRU1FTlRfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19JU19BQlNUUkFDVCA9IENPTlRFTlRfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19OT0RFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fU0hBUEVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19HUk9VUDEgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX0NIRUNLTElTVCA9IENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX0NPTkNFUFQgPSBDT05URU5UX0VMRU1FTlRfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fRVhBTVBMRSA9IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX0dVSURFTElORSA9IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19XSElURVBBUEVSID0gQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5LaW5kPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT04gPSAzOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX05BTUUgPSBNRVRIT0RfVU5JVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0dST1VQID0gTUVUSE9EX1VOSVRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19PV05FRF9SVUxFID0gTUVUSE9EX1VOSVRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9VTklUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19JRCA9IE1FVEhPRF9VTklUX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9VTklUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9VTklUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVUFBSRVNTRUQgPSBNRVRIT0RfVU5JVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQ09QWVJJR0hUID0gTUVUSE9EX1VOSVRfX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FVVEhPUlMgPSBNRVRIT0RfVU5JVF9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19DSEFOR0VfREFURSA9IE1FVEhPRF9VTklUX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1ZFUlNJT04gPSBNRVRIT0RfVU5JVF9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT04gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWaWV3PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgVmlldzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFVyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkZWQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWSA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsIDxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSA0MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX05BTUUgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9GRUFUVVJFX0NPVU5UID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbCA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZExpYnJhcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUlkgPSA0MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX05BTUUgPSBNRVRIT0RfVU5JVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX0dST1VQID0gTUVUSE9EX1VOSVRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19PV05FRF9SVUxFID0gTUVUSE9EX1VOSVRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9VTklUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19JRCA9IE1FVEhPRF9VTklUX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9VTklUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9VTklUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX1NVUFBSRVNTRUQgPSBNRVRIT0RfVU5JVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fQ09QWVJJR0hUID0gTUVUSE9EX1VOSVRfX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX0FVVEhPUlMgPSBNRVRIT0RfVU5JVF9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19DSEFOR0VfREFURSA9IE1FVEhPRF9VTklUX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX1ZFUlNJT04gPSBNRVRIT0RfVU5JVF9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX0NPTkZJR1VSQVRJT04gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX1RPT0wgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbCA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTiA9IDQ0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19OQU1FID0gTUVUSE9EX1VOSVRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0dST1VQID0gTUVUSE9EX1VOSVRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX09XTkVEX1JVTEUgPSBNRVRIT0RfVU5JVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfVU5JVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0lEID0gTUVUSE9EX1VOSVRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfVU5JVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9VTklUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fU1VQUFJFU1NFRCA9IE1FVEhPRF9VTklUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0NPUFlSSUdIVCA9IE1FVEhPRF9VTklUX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0FVVEhPUlMgPSBNRVRIT0RfVU5JVF9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0NIQU5HRV9EQVRFID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0NIQU5HRV9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX1ZFUlNJT04gPSBNRVRIT0RfVU5JVF9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkIE1ldGhvZCBQbHVnaW48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX1JFRkVSRU5DRURfTUVUSE9EX1BMVUdJTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRSA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZXIgQ2hhbmdlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRSA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWlsZXN0b25lSW1wbCA8ZW0+TWlsZXN0b25lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NaWxlc3RvbmVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1pbGVzdG9uZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNSUxFU1RPTkUgPSA0NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19HUk9VUCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fT1dORURfUlVMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fT1JERVJJTkdfR1VJREUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fUFJFU0VOVEFUSU9OX05BTUUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19TVVBQUkVTU0VEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BSRVNFTlRBVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0ZVTEZJTEwgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19JU19BQlNUUkFDVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19OT0RFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fU0hBUEVJQ09OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fUFJFU0VOVEVEX0FGVEVSID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BSRVNFTlRFRF9CRUZPUkUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BMQU5OSU5HX0RBVEEgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19TVVBFUl9BQ1RJVklUWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19HUk9VUDEgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0NIRUNLTElTVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0NPTkNFUFQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fRVhBTVBMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0dVSURFTElORSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19SRVVTQUJMRV9BU1NFVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fU1VQUE9SVElOR19NQVRFUklBTCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19XSElURVBBUEVSID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfT1BUSU9OQUwgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19JU19QTEFOTkVEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BSRUZJWCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fR1JPVVAyID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BSRURFQ0VTU09SID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19JU19FVkVOVF9EUklWRU4gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfT05HT0lORyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfUkVQRUFUQUJMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQgUmVzdWx0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1JFUVVJUkVEX1JFU1VMVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWlsZXN0b25lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9GRUFUVVJFX0NPVU5UID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5PdXRjb21lSW1wbCA8ZW0+T3V0Y29tZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuT3V0Y29tZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0T3V0Y29tZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBPVVRDT01FID0gNDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX05BTUUgPSBXT1JLX1BST0RVQ1RfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0dST1VQID0gV09SS19QUk9EVUNUX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19PV05FRF9SVUxFID0gV09SS19QUk9EVUNUX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfUFJPRFVDVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19JRCA9IFdPUktfUFJPRFVDVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19PUkRFUklOR19HVUlERSA9IFdPUktfUFJPRFVDVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1NVUFBSRVNTRUQgPSBXT1JLX1BST0RVQ1RfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fUFJFU0VOVEFUSU9OID0gV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fRlVMRklMTCA9IFdPUktfUFJPRFVDVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0lTX0FCU1RSQUNUID0gV09SS19QUk9EVUNUX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX05PREVJQ09OID0gV09SS19QUk9EVUNUX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19TSEFQRUlDT04gPSBXT1JLX1BST0RVQ1RfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0dST1VQMSA9IFdPUktfUFJPRFVDVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fQ0hFQ0tMSVNUID0gV09SS19QUk9EVUNUX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fQ09OQ0VQVCA9IFdPUktfUFJPRFVDVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19FWEFNUExFID0gV09SS19QUk9EVUNUX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fR1VJREVMSU5FID0gV09SS19QUk9EVUNUX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1JFVVNBQkxFX0FTU0VUID0gV09SS19QUk9EVUNUX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19TVVBQT1JUSU5HX01BVEVSSUFMID0gV09SS19QUk9EVUNUX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1dISVRFUEFQRVIgPSBXT1JLX1BST0RVQ1RfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1ZBUklBQklMSVRZX1RZUEUgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19HUk9VUDIgPSBXT1JLX1BST0RVQ1RfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fRVNUSU1BVEUgPSBXT1JLX1BST0RVQ1RfX0VTVElNQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBXT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19SRVBPUlQgPSBXT1JLX1BST0RVQ1RfX1JFUE9SVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fVEVNUExBVEUgPSBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19UT09MX01FTlRPUiA9IFdPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1I7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+T3V0Y29tZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGhhc2VJbXBsIDxlbT5QaGFzZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGhhc2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBoYXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBIQVNFID0gNTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19OQU1FID0gQUNUSVZJVFlfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19HUk9VUCA9IEFDVElWSVRZX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fT1dORURfUlVMRSA9IEFDVElWSVRZX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBBQ1RJVklUWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBBQ1RJVklUWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSUQgPSBBQ1RJVklUWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fT1JERVJJTkdfR1VJREUgPSBBQ1RJVklUWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19TVVBQUkVTU0VEID0gQUNUSVZJVFlfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRVNFTlRBVElPTiA9IEFDVElWSVRZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0ZVTEZJTEwgPSBBQ1RJVklUWV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19JU19BQlNUUkFDVCA9IEFDVElWSVRZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19OT0RFSUNPTiA9IEFDVElWSVRZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fU0hBUEVJQ09OID0gQUNUSVZJVFlfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUFJFU0VOVEVEX0FGVEVSID0gQUNUSVZJVFlfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRVNFTlRFRF9CRUZPUkUgPSBBQ1RJVklUWV9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BMQU5OSU5HX0RBVEEgPSBBQ1RJVklUWV9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19TVVBFUl9BQ1RJVklUWSA9IEFDVElWSVRZX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19HUk9VUDEgPSBBQ1RJVklUWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0NIRUNLTElTVCA9IEFDVElWSVRZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0NPTkNFUFQgPSBBQ1RJVklUWV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fRVhBTVBMRSA9IEFDVElWSVRZX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0dVSURFTElORSA9IEFDVElWSVRZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19SRVVTQUJMRV9BU1NFVCA9IEFDVElWSVRZX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fU1VQUE9SVElOR19NQVRFUklBTCA9IEFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19XSElURVBBUEVSID0gQUNUSVZJVFlfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEFDVElWSVRZX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfT1BUSU9OQUwgPSBBQ1RJVklUWV9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19JU19QTEFOTkVEID0gQUNUSVZJVFlfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRUZJWCA9IEFDVElWSVRZX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fR1JPVVAyID0gQUNUSVZJVFlfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRURFQ0VTU09SID0gQUNUSVZJVFlfX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19JU19FVkVOVF9EUklWRU4gPSBBQ1RJVklUWV9fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfT05HT0lORyA9IEFDVElWSVRZX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfUkVQRUFUQUJMRSA9IEFDVElWSVRZX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVDT05ESVRJT04gPSBBQ1RJVklUWV9fUFJFQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUE9TVENPTkRJVElPTiA9IEFDVElWSVRZX19QT1NUQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0dST1VQMyA9IEFDVElWSVRZX19HUk9VUDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19CUkVBS0RPV05fRUxFTUVOVCA9IEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUk9BRE1BUCA9IEFDVElWSVRZX19ST0FETUFQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19JU19FTkFDVEFCTEUgPSBBQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fVkFSSUFCSUxJVFlfVFlQRSA9IEFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBoYXNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX0ZFQVRVUkVfQ09VTlQgPSBBQ1RJVklUWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsIDxlbT5QbGFubmluZyBEYXRhPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBID0gNTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX05BTUUgPSBQUk9DRVNTX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX0dST1VQID0gUFJPQ0VTU19FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19PV05FRF9SVUxFID0gUFJPQ0VTU19FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBST0NFU1NfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19JRCA9IFBST0NFU1NfRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19QUkVTRU5UQVRJT05fTkFNRSA9IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX1NVUFBSRVNTRUQgPSBQUk9DRVNTX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fUFJFU0VOVEFUSU9OID0gUFJPQ0VTU19FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fRlVMRklMTCA9IFBST0NFU1NfRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX0lTX0FCU1RSQUNUID0gUFJPQ0VTU19FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX05PREVJQ09OID0gUFJPQ0VTU19FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19TSEFQRUlDT04gPSBQUk9DRVNTX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pc2ggRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19SQU5LID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19TVEFSVF9EQVRFID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlSW1wbCA8ZW0+UHJhY3RpY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcmFjdGljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUkFDVElDRSA9IDUyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19GVUxGSUxMID0gR1VJREFOQ0VfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0dST1VQMiA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IFJlZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRSA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQgUmVmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0UgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWIgUHJhY3RpY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19TVUJfUFJBQ1RJQ0UgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QcmFjdGljZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwgPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OID0gNTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dST1VQID0gQ09OVEVOVF9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0NPUFlSSUdIVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fU0VDVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsIEluZm88L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hb2FsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGV2ZWxzIE9mIEFkb3B0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvYmxlbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwgPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRSA9IDU5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX05BTUUgPSBNRVRIT0RfUEFDS0FHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19HUk9VUCA9IE1FVEhPRF9QQUNLQUdFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX09XTkVEX1JVTEUgPSBNRVRIT0RfUEFDS0FHRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX0lEID0gTUVUSE9EX1BBQ0tBR0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9QQUNLQUdFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfUEFDS0FHRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fU1VQUFJFU1NFRCA9IE1FVEhPRF9QQUNLQUdFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19HUk9VUDEgPSBNRVRIT0RfUEFDS0FHRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFID0gTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFID0gTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdsb2JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fR0xPQkFMID0gTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fR1JPVVAyID0gTUVUSE9EX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzcyBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVCA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsIDxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVCA9IDU1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fTkFNRSA9IFBST0NFU1NfUEFDS0FHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0dST1VQID0gUFJPQ0VTU19QQUNLQUdFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fT1dORURfUlVMRSA9IFBST0NFU1NfUEFDS0FHRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fSUQgPSBQUk9DRVNTX1BBQ0tBR0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX09SREVSSU5HX0dVSURFID0gUFJPQ0VTU19QQUNLQUdFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IFBST0NFU1NfUEFDS0FHRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19TVVBQUkVTU0VEID0gUFJPQ0VTU19QQUNLQUdFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0dST1VQMSA9IFBST0NFU1NfUEFDS0FHRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fUkVVU0VEX1BBQ0tBR0UgPSBQUk9DRVNTX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fTUVUSE9EX1BBQ0tBR0UgPSBQUk9DRVNTX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdsb2JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19HTE9CQUwgPSBQUk9DRVNTX1BBQ0tBR0VfX0dMT0JBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19HUk9VUDIgPSBQUk9DRVNTX1BBQ0tBR0VfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTX0VMRU1FTlQgPSBQUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0UgPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUyA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURSA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTiA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFID0gNTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQID0gQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fT1dORURfUlVMRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19CUklFRl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19TVVBQUkVTU0VEID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVTRU5UQVRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fRlVMRklMTCA9IEJSRUFLRE9XTl9FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JU19BQlNUUkFDVCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fTk9ERUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19TSEFQRUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUFJFU0VOVEVEX0FGVEVSID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVTRU5URURfQkVGT1JFID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUExBTk5JTkdfREFUQSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19TVVBFUl9BQ1RJVklUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1JPVVAxID0gQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fQ0hFQ0tMSVNUID0gQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0NPTkNFUFQgPSBCUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0VYQU1QTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1VJREVMSU5FID0gQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19SRVVTQUJMRV9BU1NFVCA9IEJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1dISVRFUEFQRVIgPSBCUkVBS0RPV05fRUxFTUVOVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lTX09QVElPTkFMID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lTX1BMQU5ORUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1BSRUZJWCA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQMiA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIElPPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTyA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbCA8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEUgPSA2MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fTkFNRSA9IFBST0NFU1NfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQID0gUFJPQ0VTU19fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fT1dORURfUlVMRSA9IFBST0NFU1NfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSUQgPSBQUk9DRVNTX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX09SREVSSU5HX0dVSURFID0gUFJPQ0VTU19fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QUkVTRU5UQVRJT05fTkFNRSA9IFBST0NFU1NfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19TVVBQUkVTU0VEID0gUFJPQ0VTU19fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QUkVTRU5UQVRJT04gPSBQUk9DRVNTX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fRlVMRklMTCA9IFBST0NFU1NfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19BQlNUUkFDVCA9IFBST0NFU1NfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fTk9ERUlDT04gPSBQUk9DRVNTX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19TSEFQRUlDT04gPSBQUk9DRVNTX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFU0VOVEVEX0FGVEVSID0gUFJPQ0VTU19fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QUkVTRU5URURfQkVGT1JFID0gUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUExBTk5JTkdfREFUQSA9IFBST0NFU1NfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19TVVBFUl9BQ1RJVklUWSA9IFBST0NFU1NfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVAxID0gUFJPQ0VTU19fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQ0hFQ0tMSVNUID0gUFJPQ0VTU19fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0NPTkNFUFQgPSBQUk9DRVNTX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0VYQU1QTEUgPSBQUk9DRVNTX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1VJREVMSU5FID0gUFJPQ0VTU19fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19SRVVTQUJMRV9BU1NFVCA9IFBST0NFU1NfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBQUk9DRVNTX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1dISVRFUEFQRVIgPSBQUk9DRVNTX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFBST0NFU1NfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lTX09QVElPTkFMID0gUFJPQ0VTU19fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lTX1BMQU5ORUQgPSBQUk9DRVNTX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRUZJWCA9IFBST0NFU1NfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQMiA9IFBST0NFU1NfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFREVDRVNTT1IgPSBQUk9DRVNTX19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19FVkVOVF9EUklWRU4gPSBQUk9DRVNTX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lTX09OR09JTkcgPSBQUk9DRVNTX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19SRVBFQVRBQkxFID0gUFJPQ0VTU19fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QUkVDT05ESVRJT04gPSBQUk9DRVNTX19QUkVDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BPU1RDT05ESVRJT04gPSBQUk9DRVNTX19QT1NUQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVAzID0gUFJPQ0VTU19fR1JPVVAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CUkVBS0RPV05fRUxFTUVOVCA9IFBST0NFU1NfX0JSRUFLRE9XTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1JPQURNQVAgPSBQUk9DRVNTX19ST0FETUFQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lTX0VOQUNUQUJMRSA9IFBST0NFU1NfX0lTX0VOQUNUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFBST0NFU1NfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1ZBUklBQklMSVRZX1RZUEUgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lOQ0xVREVTX1BBVFRFUk4gPSBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0RFRkFVTFRfQ09OVEVYVCA9IFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19WQUxJRF9DT05URVhUID0gUFJPQ0VTU19fVkFMSURfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0RJQUdSQU1fVVJJID0gUFJPQ0VTU19fRElBR1JBTV9VUkk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUDQgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUHJvY2VzczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRV9QUk9DRVNTID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUmVwb3J0SW1wbCA8ZW0+UmVwb3J0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5SZXBvcnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJlcG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRVBPUlQgPSA2MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19GVUxGSUxMID0gR1VJREFOQ0VfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXBvcnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5SZXVzYWJsZUFzc2V0SW1wbCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJldXNhYmxlQXNzZXRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJldXNhYmxlQXNzZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVQgPSA2MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9hZG1hcEltcGwgPGVtPlJvYWRtYXA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvYWRtYXBJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvYWRtYXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9BRE1BUCA9IDYzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvYWRtYXA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZUltcGwgPGVtPlJvbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MRSA9IDY0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19HUk9VUCA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fT1dORURfUlVMRSA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fSUQgPSBDT05URU5UX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0ZVTEZJTEwgPSBDT05URU5UX0VMRU1FTlRfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19JU19BQlNUUkFDVCA9IENPTlRFTlRfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19OT0RFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fU0hBUEVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19HUk9VUDEgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0NIRUNLTElTVCA9IENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0NPTkNFUFQgPSBDT05URU5UX0VMRU1FTlRfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fRVhBTVBMRSA9IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0dVSURFTElORSA9IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19XSElURVBBUEVSID0gQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fR1JPVVAyID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIEZvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fUkVTUE9OU0lCTEVfRk9SID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwgPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT04gPSA2NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0dST1VQID0gQ09OVEVOVF9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fU0VDVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2tpbGxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fU0tJTExTID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TeW5vbnltczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZVNldEltcGwgPGVtPlJvbGUgU2V0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlU2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfU0VUID0gNjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0dST1VQID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX09XTkVEX1JVTEUgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0lEID0gQ09OVEVOVF9DQVRFR09SWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fRlVMRklMTCA9IENPTlRFTlRfQ0FURUdPUllfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0NBVEVHT1JZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fR1JPVVAxID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0NIRUNLTElTVCA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fQ09OQ0VQVCA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0VYQU1QTEUgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0dVSURFTElORSA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9DQVRFR09SWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19XSElURVBBUEVSID0gQ09OVEVOVF9DQVRFR09SWV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fR1JPVVAyID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fUk9MRSA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZSBTZXQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbCA8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRHcm91cGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZVNldEdyb3VwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HID0gNjg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0dST1VQID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX09XTkVEX1JVTEUgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0lEID0gQ09OVEVOVF9DQVRFR09SWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fRlVMRklMTCA9IENPTlRFTlRfQ0FURUdPUllfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0NBVEVHT1JZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fR1JPVVAxID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0NIRUNLTElTVCA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fQ09OQ0VQVCA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0VYQU1QTEUgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0dVSURFTElORSA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9DQVRFR09SWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19XSElURVBBUEVSID0gQ09OVEVOVF9DQVRFR09SWV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fR1JPVVAyID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2xlIFNldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5TZWN0aW9uSW1wbCA8ZW0+U2VjdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU2VjdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRUNUSU9OID0gNjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fR1JPVVAgPSBNRVRIT0RfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fT1dORURfUlVMRSA9IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fSUQgPSBNRVRIT0RfRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19TVVBQUkVTU0VEID0gTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIFNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19TVUJfU0VDVElPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fUFJFREVDRVNTT1IgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fU0VDVElPTl9OQU1FID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fVkFSSUFCSUxJVFlfVFlQRSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlY3Rpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU3VwcG9ydGluZ01hdGVyaWFsSW1wbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU3VwcG9ydGluZ01hdGVyaWFsSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTCA9IDcwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0ltcGwgPGVtPlRhc2s8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEFTSyA9IDcxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19HUk9VUCA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1dORURfUlVMRSA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fSUQgPSBDT05URU5UX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0ZVTEZJTEwgPSBDT05URU5UX0VMRU1FTlRfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19JU19BQlNUUkFDVCA9IENPTlRFTlRfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19OT0RFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU0hBUEVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19HUk9VUDEgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0NIRUNLTElTVCA9IENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0NPTkNFUFQgPSBDT05URU5UX0VMRU1FTlRfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRVhBTVBMRSA9IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0dVSURFTElORSA9IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19XSElURVBBUEVSID0gQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BSRUNPTkRJVElPTiA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUE9TVENPTkRJVElPTiA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BFUkZPUk1FRF9CWSA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0dST1VQMiA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX01BTkRBVE9SWV9JTlBVVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09VVFBVVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PUFRJT05BTF9JTlBVVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRVNUSU1BVEUgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fVE9PTF9NRU5UT1IgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRhc2tEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OID0gNzI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19HUk9VUCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsIDxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1IgPSA3MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19HUk9VUCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fT1dORURfUlVMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19TVVBQUkVTU0VEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0ZVTEZJTEwgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19BQlNUUkFDVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19OT0RFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fU0hBUEVJQ09OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEEgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19HUk9VUDEgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0NIRUNLTElTVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0NPTkNFUFQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fRVhBTVBMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0dVSURFTElORSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19SRVVTQUJMRV9BU1NFVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fU1VQUE9SVElOR19NQVRFUklBTCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19XSElURVBBUEVSID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUwgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19QTEFOTkVEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BSRUZJWCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fR1JPVVAyID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BSRURFQ0VTU09SID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19FVkVOVF9EUklWRU4gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfT05HT0lORyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfUkVQRUFUQUJMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFzazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fVEFTSyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0dST1VQMyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3Npc3RlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbmRhdG9yeSBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGVwPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1NURVAgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsIDxlbT5UZWFtIFByb2ZpbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZWFtUHJvZmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEUgPSA3NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fR1JPVVAgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19PV05FRF9SVUxFID0gQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19JRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fT1JERVJJTkdfR1VJREUgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1BSRVNFTlRBVElPTl9OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1BSRVNFTlRBVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19GVUxGSUxMID0gQlJFQUtET1dOX0VMRU1FTlRfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0lTX0FCU1RSQUNUID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19OT0RFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1NIQVBFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVTRU5URURfQUZURVIgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1BSRVNFTlRFRF9CRUZPUkUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QTEFOTklOR19EQVRBID0gQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1NVUEVSX0FDVElWSVRZID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19HUk9VUDEgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19DSEVDS0xJU1QgPSBCUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fQ09OQ0VQVCA9IEJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fRVhBTVBMRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19HVUlERUxJTkUgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1JFVVNBQkxFX0FTU0VUID0gQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fU1VQUE9SVElOR19NQVRFUklBTCA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fV0hJVEVQQVBFUiA9IEJSRUFLRE9XTl9FTEVNRU5UX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fSVNfT1BUSU9OQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fSVNfUExBTk5FRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUFJFRklYID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fR1JPVVAyID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19ST0xFID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgVGVhbTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIFRlYW08L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fU1VCX1RFQU0gPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX0ZFQVRVUkVfQ09VTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZW1wbGF0ZUltcGwgPGVtPlRlbXBsYXRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZW1wbGF0ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVtcGxhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEVNUExBVEUgPSA3NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UZW1wbGF0ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVybURlZmluaXRpb25JbXBsIDxlbT5UZXJtIERlZmluaXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlcm1EZWZpbml0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZXJtRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT04gPSA3NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19GVUxGSUxMID0gR1VJREFOQ0VfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Ub29sSW1wbCA8ZW0+VG9vbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVG9vbEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VG9vbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUT09MID0gNzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19HUk9VUCA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX09XTkVEX1JVTEUgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0lEID0gQ09OVEVOVF9DQVRFR09SWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0ZVTEZJTEwgPSBDT05URU5UX0NBVEVHT1JZX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0NBVEVHT1JZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fR1JPVVAxID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0NPTkNFUFQgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0VYQU1QTEUgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fR1VJREVMSU5FID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1dISVRFUEFQRVIgPSBDT05URU5UX0NBVEVHT1JZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19HUk9VUDIgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19UT09MX01FTlRPUiA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VG9vbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRvb2xNZW50b3JJbXBsIDxlbT5Ub29sIE1lbnRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVG9vbE1lbnRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VG9vbE1lbnRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUT09MX01FTlRPUiA9IDc4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19GVUxGSUxMID0gR1VJREFOQ0VfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5XaGl0ZXBhcGVySW1wbCA8ZW0+V2hpdGVwYXBlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV2hpdGVwYXBlckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V2hpdGVwYXBlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXSElURVBBUEVSID0gNzk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX05BTUUgPSBDT05DRVBUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19HUk9VUCA9IENPTkNFUFRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX09XTkVEX1JVTEUgPSBDT05DRVBUX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTkNFUFRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05DRVBUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0lEID0gQ09OQ0VQVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19PUkRFUklOR19HVUlERSA9IENPTkNFUFRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05DRVBUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fU1VQUFJFU1NFRCA9IENPTkNFUFRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fUFJFU0VOVEFUSU9OID0gQ09OQ0VQVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0ZVTEZJTEwgPSBDT05DRVBUX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fSVNfQUJTVFJBQ1QgPSBDT05DRVBUX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX05PREVJQ09OID0gQ09OQ0VQVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fU0hBUEVJQ09OID0gQ09OQ0VQVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fR1JPVVAxID0gQ09OQ0VQVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fQ0hFQ0tMSVNUID0gQ09OQ0VQVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0NPTkNFUFQgPSBDT05DRVBUX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0VYQU1QTEUgPSBDT05DRVBUX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fR1VJREVMSU5FID0gQ09OQ0VQVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19SRVVTQUJMRV9BU1NFVCA9IENPTkNFUFRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05DRVBUX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1dISVRFUEFQRVIgPSBDT05DRVBUX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OQ0VQVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTkNFUFRfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V2hpdGVwYXBlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX0ZFQVRVUkVfQ09VTlQgPSBDT05DRVBUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbCA8ZW0+V29yayBEZWZpbml0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrRGVmaW5pdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya0RlZmluaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OID0gODE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX0dST1VQID0gTUVUSE9EX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fT1dORURfUlVMRSA9IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fSUQgPSBNRVRIT0RfRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19TVVBQUkVTU0VEID0gTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBEZWZpbml0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya09yZGVySW1wbCA8ZW0+V29yayBPcmRlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya09yZGVySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrT3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUiA9IDgyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fSUQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX0xJTktfVFlQRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBPcmRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwgPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUiA9IDg1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTkFNRSA9IERFU0NSSVBUT1JfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HUk9VUCA9IERFU0NSSVBUT1JfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PV05FRF9SVUxFID0gREVTQ1JJUFRPUl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JRCA9IERFU0NSSVBUT1JfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFID0gREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1NVUFBSRVNTRUQgPSBERVNDUklQVE9SX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19QUkVTRU5UQVRJT04gPSBERVNDUklQVE9SX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0ZVTEZJTEwgPSBERVNDUklQVE9SX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lTX0FCU1RSQUNUID0gREVTQ1JJUFRPUl9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTk9ERUlDT04gPSBERVNDUklQVE9SX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fU0hBUEVJQ09OID0gREVTQ1JJUFRPUl9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19QUkVTRU5URURfQUZURVIgPSBERVNDUklQVE9SX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFID0gREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEEgPSBERVNDUklQVE9SX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRZID0gREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAxID0gREVTQ1JJUFRPUl9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0NIRUNLTElTVCA9IERFU0NSSVBUT1JfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQ09OQ0VQVCA9IERFU0NSSVBUT1JfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0VYQU1QTEUgPSBERVNDUklQVE9SX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dVSURFTElORSA9IERFU0NSSVBUT1JfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1JFVVNBQkxFX0FTU0VUID0gREVTQ1JJUFRPUl9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBERVNDUklQVE9SX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XSElURVBBUEVSID0gREVTQ1JJUFRPUl9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lTX09QVElPTkFMID0gREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JU19QTEFOTkVEID0gREVTQ1JJUFRPUl9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUFJFRklYID0gREVTQ1JJUFRPUl9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVCA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgUm9sZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9ST0xFID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HUk9VUDIgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElucHV0IFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVRfVE8gPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGFjdGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlkgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGFjdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQgVG88L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVRfVE8gPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0IFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVRfVE8gPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dHB1dCBGcm9tPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1VUUFVUX0ZST00gPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlbGl2ZXJhYmxlIFBhcnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFMgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDEyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGwgPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRSA9IDg2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19HUk9VUCA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19PV05FRF9SVUxFID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19JRCA9IENPTlRFTlRfQ0FURUdPUllfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0ZVTEZJTEwgPSBDT05URU5UX0NBVEVHT1JZX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0dST1VQMSA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19DSEVDS0xJU1QgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0NPTkNFUFQgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19FWEFNUExFID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19HVUlERUxJTkUgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fV0hJVEVQQVBFUiA9IENPTlRFTlRfQ0FURUdPUllfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0dST1VQMiA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX1RZUEUgPSA4NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZSA8ZW0+V29yayBPcmRlciBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtPcmRlclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9UWVBFID0gODg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFZhcmlhYmlsaXR5VHlwZU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBWQVJJQUJJTElUWV9UWVBFX09CSkVDVCA9IDg5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Xb3JrIE9yZGVyIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrT3JkZXJUeXBlT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfT1JERVJfVFlQRV9PQkpFQ1QgPSA5MDsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkgPGVtPkFjdGl2aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFjdGl2aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFjdGl2aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfUHJlY29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X1Bvc3Rjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0R3JvdXAzKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfR3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0QnJlYWtkb3duRWxlbWVudCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRSb2FkbWFwIDxlbT5Sb2FkbWFwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Sb2FkbWFwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0Um9hZG1hcCgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X1JvYWRtYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjaXNJc0VuYWN0YWJsZSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgRW5hY3RhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjaXNJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X0lzRW5hY3RhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiA8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcygpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRIb3dUb1N0YWZmIDxlbT5Ib3cgVG8gU3RhZmY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ib3cgVG8gU3RhZmY8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEhvd1RvU3RhZmYoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93VG9TdGFmZigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdXJwb3NlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRQdXJwb3NlKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyNpc0lzUHJpbWFyeUV4dGVuc2lvbiA8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvI2lzSXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm9fSXNQcmltYXJ5RXh0ZW5zaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdCA8ZW0+QXJ0aWZhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXJ0aWZhY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXJ0aWZhY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdCNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3QjZ2V0R3JvdXAzKCkKLQkgKiBAc2VlICNnZXRBcnRpZmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3RfR3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVkQXJ0aWZhY3QgPGVtPkNvbnRhaW5lZCBBcnRpZmFjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udGFpbmVkIEFydGlmYWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVkQXJ0aWZhY3QoKQotCSAqIEBzZWUgI2dldEFydGlmYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiA8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0QnJpZWZPdXRsaW5lIDxlbT5CcmllZiBPdXRsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QnJpZWYgT3V0bGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0QnJpZWZPdXRsaW5lKCkKLQkgKiBAc2VlICNnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucyA8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQHNlZSAjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbiA8ZW0+UmVwcmVzZW50YXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXByZXNlbnRhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb24oKQotCSAqIEBzZWUgI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXROb3RhdGlvbiA8ZW0+Tm90YXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ob3RhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0Tm90YXRpb24oKQotCSAqIEBzZWUgI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fTm90YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQgPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QnJlYWtkb3duRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEFmdGVyIDxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEFmdGVyKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEFmdGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQmVmb3JlIDxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQmVmb3JlKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFBsYW5uaW5nRGF0YSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFBsYW5uaW5nRGF0YSgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QbGFubmluZ0RhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXR5IDxlbT5TdXBlciBBY3Rpdml0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN1cGVyIEFjdGl2aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXR5KCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1N1cGVyQWN0aXZpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEdyb3VwMSgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9Hcm91cDEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldENoZWNrbGlzdCA8ZW0+Q2hlY2tsaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldENoZWNrbGlzdCgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldENvbmNlcHQgPGVtPkNvbmNlcHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkNvbmNlcHQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldENvbmNlcHQoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfQ29uY2VwdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0RXhhbXBsZSgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9FeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRHdWlkZWxpbmUgPGVtPkd1aWRlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRHdWlkZWxpbmUoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfR3VpZGVsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRSZXVzYWJsZUFzc2V0IDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFJldXNhYmxlQXNzZXQoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfUmV1c2FibGVBc3NldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwcG9ydGluZ01hdGVyaWFsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRXaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRXaGl0ZXBhcGVyKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1doaXRlcGFwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0lzT3B0aW9uYWwgPGVtPklzIE9wdGlvbmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgT3B0aW9uYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNPcHRpb25hbCgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc1BsYW5uZWQgPGVtPklzIFBsYW5uZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBQbGFubmVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0lzUGxhbm5lZCgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9Jc1BsYW5uZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByZWZpeDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlZml4KCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIDxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiNnZXRVc2FnZUd1aWRhbmNlIDxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uI2dldFVzYWdlR3VpZGFuY2UoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNhcGFiaWxpdHlQYXR0ZXJuIDxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2FwYWJpbGl0eVBhdHRlcm4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENhcGFiaWxpdHlQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3QgPGVtPkNoZWNrbGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENoZWNrbGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZSA8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb21wb3NpdGVSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldENvbXBvc2l0ZVJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbXBvc2l0ZVJvbGVfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZSNnZXRBZ2dyZWdhdGVkUm9sZSA8ZW0+QWdncmVnYXRlZCBSb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5BZ2dyZWdhdGVkIFJvbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlI2dldEFnZ3JlZ2F0ZWRSb2xlKCkKLQkgKiBAc2VlICNnZXRDb21wb3NpdGVSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25jZXB0IDxlbT5Db25jZXB0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbmNlcHQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25jZXB0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb25jZXB0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25zdHJhaW50IDxlbT5Db25zdHJhaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25zdHJhaW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQjZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQjZ2V0TWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb25zdHJhaW50X01haW5EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5IDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbnRlbnRDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZSA8ZW0+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlI2dldENvbnRlbnRDYXRlZ29yeSA8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UjZ2V0Q29udGVudENhdGVnb3J5KCkKLQkgKiBAc2VlICNnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0NvbnRlbnRDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uIDxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0S2V5Q29uc2lkZXJhdGlvbnMgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRLZXlDb25zaWRlcmF0aW9ucygpCi0JICogQHNlZSAjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0U2VjdGlvbiA8ZW0+U2VjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRTZWN0aW9uKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVybmFsIElkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEV4dGVybmFsSWQoKQotCSAqIEBzZWUgI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50IDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbnRlbnRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldEdyb3VwMSgpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X0dyb3VwMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldENoZWNrbGlzdCA8ZW0+Q2hlY2tsaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRDaGVja2xpc3QoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRDb25jZXB0IDxlbT5Db25jZXB0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q29uY2VwdCgpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X0NvbmNlcHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRFeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0RXhhbXBsZSgpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X0V4YW1wbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRHdWlkZWxpbmUgPGVtPkd1aWRlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0R3VpZGVsaW5lKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0UmV1c2FibGVBc3NldCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0UmV1c2FibGVBc3NldCgpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1JldXNhYmxlQXNzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRXaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0V2hpdGVwYXBlcigpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1doaXRlcGFwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZSA8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb250ZW50UGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldENvbnRlbnRQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50UGFja2FnZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZSNnZXRDb250ZW50RWxlbWVudCA8ZW0+Q29udGVudCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQHNlZSAjZ2V0Q29udGVudFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSA8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDdXN0b21DYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5I2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldEN1c3RvbUNhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDdXN0b21DYXRlZ29yeV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRDYXRlZ29yaXplZEVsZW1lbnQgPGVtPkNhdGVnb3JpemVkIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkNhdGVnb3JpemVkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRDYXRlZ29yaXplZEVsZW1lbnQoKQotCSAqIEBzZWUgI2dldEN1c3RvbUNhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRTdWJDYXRlZ29yeSA8ZW0+U3ViIENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5TdWIgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRTdWJDYXRlZ29yeSgpCi0JICogQHNlZSAjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZSA8ZW0+RGVsaXZlcmFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVsaXZlcmFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVsaXZlcmFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZSNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUjZ2V0R3JvdXAzKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVfR3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUjZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QgPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZSNnZXREZWxpdmVyZWRXb3JrUHJvZHVjdCgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcmFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uIDxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRFeHRlcm5hbERlc2NyaXB0aW9uIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRQYWNrYWdpbmdHdWlkYW5jZSA8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzIDxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlbGl2ZXJ5UHJvY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRHcm91cDQgPGVtPkdyb3VwNDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXA0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzI2dldEdyb3VwNCgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NfR3JvdXA0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzI2dldENvbW11bmljYXRpb25zTWF0ZXJpYWwgPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzI2dldEVkdWNhdGlvbk1hdGVyaWFsIDxlbT5FZHVjYXRpb24gTWF0ZXJpYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkVkdWNhdGlvbiBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRFZHVjYXRpb25NYXRlcmlhbCgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIDxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NhbGUgPGVtPlNjYWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NhbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY2FsZSgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRSaXNrTGV2ZWwgPGVtPlJpc2sgTGV2ZWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SaXNrIExldmVsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0Umlza0xldmVsKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldEVzdGltYXRpbmdUZWNobmlxdWUgPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdE1lbWJlckV4cGVydGlzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRUeXBlT2ZDb250cmFjdCA8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRUeXBlT2ZDb250cmFjdCgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQgPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVzY3JpYmFibGVFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByZXNlbnRhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBzZWUgI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRGdWxmaWxsIDxlbT5GdWxmaWxsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5GdWxmaWxsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldEZ1bGZpbGwoKQotCSAqIEBzZWUgI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X0Z1bGZpbGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2lzSXNBYnN0cmFjdCA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBBYnN0cmFjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNpc0lzQWJzdHJhY3QoKQotCSAqIEBzZWUgI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X0lzQWJzdHJhY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldE5vZGVpY29uIDxlbT5Ob2RlaWNvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vZGVpY29uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldE5vZGVpY29uKCkKLQkgKiBAc2VlICNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0U2hhcGVpY29uIDxlbT5TaGFwZWljb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TaGFwZWljb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0U2hhcGVpY29uKCkKLQkgKiBAc2VlICNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IgPGVtPkRlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uI2dldFJlZmluZWREZXNjcmlwdGlvbiA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24jZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmUgPGVtPkRpc2NpcGxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERpc2NpcGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0RGlzY2lwbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGlzY2lwbGluZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFRhc2sgPGVtPlRhc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlRhc2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFRhc2soKQotCSAqIEBzZWUgI2dldERpc2NpcGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpc2NpcGxpbmVfVGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmUjZ2V0U3ViRGlzY2lwbGluZSA8ZW0+U3ViIERpc2NpcGxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlN1YiBEaXNjaXBsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRTdWJEaXNjaXBsaW5lKCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaXNjaXBsaW5lX1N1YkRpc2NpcGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFJlZmVyZW5jZVdvcmtmbG93IDxlbT5SZWZlcmVuY2UgV29ya2Zsb3c8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJlZmVyZW5jZSBXb3JrZmxvdzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmUjZ2V0UmVmZXJlbmNlV29ya2Zsb3coKQotCSAqIEBzZWUgI2dldERpc2NpcGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3coKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZyA8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREaXNjaXBsaW5lR3JvdXBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZyNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldERpc2NpcGxpbmVHcm91cGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZyNnZXREaXNjaXBsaW5lIDxlbT5EaXNjaXBsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nI2dldERpc2NpcGxpbmUoKQotCSAqIEBzZWUgI2dldERpc2NpcGxpbmVHcm91cGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCA8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREb2N1bWVudFJvb3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NaXhlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNaXhlZCgpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREb2N1bWVudFJvb3RfTWl4ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRYTUxOU1ByZWZpeE1hcCgpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRYU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfTWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kTGlicmFyeSA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RMaWJyYXJ5KCkKLQkgKiBAc2VlICNnZXREb2N1bWVudFJvb3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9NZXRob2RMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RQbHVnaW4gPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZFBsdWdpbigpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfTWV0aG9kUGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4gPGVtPkRvbWFpbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Eb21haW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERvbWFpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbiNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0RG9tYWluKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREb21haW5fR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbiNnZXRXb3JrUHJvZHVjdCgpCi0JICogQHNlZSAjZ2V0RG9tYWluKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREb21haW5fV29ya1Byb2R1Y3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4jZ2V0U3ViZG9tYWluIDxlbT5TdWJkb21haW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlN1YmRvbWFpbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbiNnZXRTdWJkb21haW4oKQotCSAqIEBzZWUgI2dldERvbWFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9tYWluX1N1YmRvbWFpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGUgPGVtPkVzdGltYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVzdGltYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEVzdGltYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0RXN0aW1hdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVzdGltYXRlX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEVzdGltYXRpb25NZXRyaWMgPGVtPkVzdGltYXRpb24gTWV0cmljPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Fc3RpbWF0aW9uIE1ldHJpYzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEVzdGltYXRpb25NZXRyaWMoKQotCSAqIEBzZWUgI2dldEVzdGltYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uTWV0cmljKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGUjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGUjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAc2VlICNnZXRFc3RpbWF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXN0aW1hdGVfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljIDxlbT5Fc3RpbWF0aW5nIE1ldHJpYzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Fc3RpbWF0aW5nIE1ldHJpYzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpbmdNZXRyaWMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEVzdGltYXRpbmdNZXRyaWMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkV4YW1wbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEV4YW1wbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlIDxlbT5HdWlkYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5HdWlkYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiA8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24jZ2V0QXR0YWNobWVudCA8ZW0+QXR0YWNobWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF0dGFjaG1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uI2dldEF0dGFjaG1lbnQoKQotCSAqIEBzZWUgI2dldEd1aWRhbmNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGVsaW5lIDxlbT5HdWlkZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGVsaW5lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRHdWlkZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkl0ZXJhdGlvbiA8ZW0+SXRlcmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkl0ZXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkl0ZXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SXRlcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5LaW5kIDxlbT5LaW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPktpbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5LaW5kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRLaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuS2luZCNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyA8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuS2luZCNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0S2luZF9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRCYXNlQ29uZmlndXJhdGlvbiA8ZW0+QmFzZSBDb25maWd1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5CYXNlIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEJhc2VDb25maWd1cmF0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24gPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKQotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldERlZmF1bHRWaWV3IDxlbT5EZWZhdWx0IFZpZXc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IFZpZXc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldERlZmF1bHRWaWV3KCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRQcm9jZXNzVmlldyA8ZW0+UHJvY2VzcyBWaWV3PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Qcm9jZXNzIFZpZXc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldFByb2Nlc3NWaWV3KCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkgPGVtPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldFN1YnRyYWN0ZWRDYXRlZ29yeSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9TdWJ0cmFjdGVkQ2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEFkZGVkQ2F0ZWdvcnkgPGVtPkFkZGVkIENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0QWRkZWRDYXRlZ29yeSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50IDxlbT5NZXRob2QgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldEdyb3VwKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X0dyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRPd25lZFJ1bGUgPGVtPk93bmVkIFJ1bGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk93bmVkIFJ1bGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldE93bmVkUnVsZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZEVsZW1lbnRfTWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0QnJpZWZEZXNjcmlwdGlvbiA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0QnJpZWZEZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldElkKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3JkZXJpbmdHdWlkZSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PcmRlcmluZyBHdWlkZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3JkZXJpbmdHdWlkZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uTmFtZSA8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uTmFtZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjaXNTdXBwcmVzc2VkIDxlbT5TdXBwcmVzc2VkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3VwcHJlc3NlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjaXNTdXBwcmVzc2VkKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5IDxlbT5NZXRob2QgTGlicmFyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZExpYnJhcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldE1ldGhvZFBsdWdpbiA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAc2VlICNnZXRNZXRob2RMaWJyYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbiA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeSNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RMaWJyYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RMaWJyYXJ5X01ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeSNnZXRUb29sIDxlbT5Ub29sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkjZ2V0VG9vbCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kTGlicmFyeV9Ub29sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlI2dldEdyb3VwMSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGFja2FnZV9Hcm91cDEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlI2dldFJldXNlZFBhY2thZ2UgPGVtPlJldXNlZCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5SZXVzZWQgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjZ2V0UmV1c2VkUGFja2FnZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlI2dldE1ldGhvZFBhY2thZ2UoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFBhY2thZ2VfTWV0aG9kUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlI2lzR2xvYmFsIDxlbT5HbG9iYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HbG9iYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlI2lzR2xvYmFsKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luIDxlbT5SZWZlcmVuY2VkIE1ldGhvZCBQbHVnaW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJlZmVyZW5jZWQgTWV0aG9kIFBsdWdpbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFBsdWdpbl9SZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luI2dldE1ldGhvZFBhY2thZ2UgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNpc1VzZXJDaGFuZ2VhYmxlIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jaXNVc2VyQ2hhbmdlYWJsZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQgPGVtPk1ldGhvZCBVbml0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBVbml0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kVW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENvcHlyaWdodCA8ZW0+Q29weXJpZ2h0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29weXJpZ2h0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDb3B5cmlnaHQoKQotCSAqIEBzZWUgI2dldE1ldGhvZFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfQ29weXJpZ2h0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF1dGhvcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldEF1dGhvcnMoKQotCSAqIEBzZWUgI2dldE1ldGhvZFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfQXV0aG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2hhbmdlIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURhdGUoKQotCSAqIEBzZWUgI2dldE1ldGhvZFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURlc2NyaXB0aW9uIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldE1ldGhvZFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNaWxlc3RvbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NaWxlc3RvbmUjZ2V0UmVxdWlyZWRSZXN1bHQgPGVtPlJlcXVpcmVkIFJlc3VsdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+UmVxdWlyZWQgUmVzdWx0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lI2dldFJlcXVpcmVkUmVzdWx0KCkKLQkgKiBAc2VlICNnZXRNaWxlc3RvbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1pbGVzdG9uZV9SZXF1aXJlZFJlc3VsdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50IDxlbT5OYW1lZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE5hbWVkRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0TmFtZWRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXROYW1lZEVsZW1lbnRfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuT3V0Y29tZSA8ZW0+T3V0Y29tZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PdXRjb21lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuT3V0Y29tZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0T3V0Y29tZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGFja2FnZWFibGVFbGVtZW50IDxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBhY2thZ2VhYmxlRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGhhc2UgPGVtPlBoYXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBoYXNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGhhc2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBoYXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UGxhbm5pbmdEYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSNnZXRGaW5pc2hEYXRlIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaCBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldEZpbmlzaERhdGUoKQotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldFJhbmsgPGVtPlJhbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SYW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldFJhbmsoKQotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX1JhbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0IERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0U3RhcnREYXRlKCkKLQkgKiBAc2VlICNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBsYW5uaW5nRGF0YV9TdGFydERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlIDxlbT5QcmFjdGljZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QcmFjdGljZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcmFjdGljZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFByYWN0aWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRBY3Rpdml0eVJlZmVyZW5jZSA8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5BY3Rpdml0eSBSZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRBY3Rpdml0eVJlZmVyZW5jZSgpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UjZ2V0Q29udGVudFJlZmVyZW5jZSA8ZW0+Q29udGVudCBSZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkNvbnRlbnQgUmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UjZ2V0Q29udGVudFJlZmVyZW5jZSgpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRTdWJQcmFjdGljZSA8ZW0+U3ViIFByYWN0aWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWIgUHJhY3RpY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRTdWJQcmFjdGljZSgpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByYWN0aWNlX1N1YlByYWN0aWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uIDxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByYWN0aWNlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBZGRpdGlvbmFsSW5mbyA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBZGRpdGlvbmFsSW5mbygpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BZGRpdGlvbmFsSW5mbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFwcGxpY2F0aW9uIDxlbT5BcHBsaWNhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFwcGxpY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBcHBsaWNhdGlvbigpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BcHBsaWNhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEJhY2tncm91bmQgPGVtPkJhY2tncm91bmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CYWNrZ3JvdW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRCYWNrZ3JvdW5kKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRHb2FscyA8ZW0+R29hbHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Hb2FsczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0R29hbHMoKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRMZXZlbHNPZkFkb3B0aW9uIDxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldExldmVsc09mQWRvcHRpb24oKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fTGV2ZWxzT2ZBZG9wdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldFByb2JsZW0gPGVtPlByb2JsZW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm9ibGVtPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRQcm9ibGVtKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX1Byb2JsZW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgPGVtPlByb2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldEluY2x1ZGVzUGF0dGVybiA8ZW0+SW5jbHVkZXMgUGF0dGVybjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+SW5jbHVkZXMgUGF0dGVybjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0SW5jbHVkZXNQYXR0ZXJuKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldERlZmF1bHRDb250ZXh0IDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldERlZmF1bHRDb250ZXh0KCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyNnZXRWYWxpZENvbnRleHQgPGVtPlZhbGlkIENvbnRleHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlZhbGlkIENvbnRleHQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldFZhbGlkQ29udGV4dCgpCi0JICogQHNlZSAjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyNnZXREaWFncmFtVVJJIDxlbT5EaWFncmFtIFVSSTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRpYWdyYW0gVVJJPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyNnZXREaWFncmFtVVJJKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzX0RpYWdyYW1VUkkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQgPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc0NvbXBvbmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldENvcHlyaWdodCA8ZW0+Q29weXJpZ2h0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29weXJpZ2h0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDb3B5cmlnaHQoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRfQ29weXJpZ2h0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0SW50ZXJmYWNlIDxlbT5JbnRlcmZhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5JbnRlcmZhY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldEludGVyZmFjZSgpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudF9JbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRQcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0UHJvY2VzcygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF1dGhvcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldEF1dGhvcnMoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRfQXV0aG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2hhbmdlIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldENoYW5nZURhdGUoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldENoYW5nZURlc2NyaXB0aW9uIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzQ29tcG9uZW50X0NoYW5nZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRfVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSA8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZVNwZWNpZmljYXRpb24gPGVtPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRJbnRlcmZhY2VJTyA8ZW0+SW50ZXJmYWNlIElPPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbnRlcmZhY2UgSU88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZUlPKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZUlPKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24gPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TY29wZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY29wZSgpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFVzYWdlTm90ZXMgPGVtPlVzYWdlIE5vdGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNhZ2UgTm90ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0VXNhZ2VOb3RlcygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQgPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc0VsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlIDxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2UjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc1BhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NQYWNrYWdlX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlI2dldFByb2Nlc3NFbGVtZW50IDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlI2dldFByb2Nlc3NFbGVtZW50KCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIDxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSNnZXRHcm91cDQgPGVtPkdyb3VwNDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXA0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUjZ2V0R3JvdXA0KCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfR3JvdXA0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUjZ2V0QmFzZVByb2Nlc3MgPGVtPkJhc2UgUHJvY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QmFzZSBQcm9jZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUjZ2V0QmFzZVByb2Nlc3MoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlUHJvY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmVwb3J0IDxlbT5SZXBvcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmVwb3J0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSZXBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJldXNhYmxlQXNzZXQgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmV1c2FibGVBc3NldAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmV1c2FibGVBc3NldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9hZG1hcCA8ZW0+Um9hZG1hcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2FkbWFwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9hZG1hcAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9hZG1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZSA8ZW0+Um9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGUjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGUjZ2V0UmVzcG9uc2libGVGb3IgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZSNnZXRSZXNwb25zaWJsZUZvcigpCi0JICogQHNlZSAjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uIDxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGVEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQHNlZSAjZ2V0Um9sZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fQXNzaWdubWVudEFwcHJvYWNoZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uI2dldFNraWxscyA8ZW0+U2tpbGxzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2tpbGxzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uI2dldFNraWxscygpCi0JICogQHNlZSAjZ2V0Um9sZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTeW5vbnltcyA8ZW0+U3lub255bXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TeW5vbnltczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTeW5vbnltcygpCi0JICogQHNlZSAjZ2V0Um9sZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yIDxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGVEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJvbGUgPGVtPlJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3IjZ2V0Um9sZSgpCi0JICogQHNlZSAjZ2V0Um9sZURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSZXNwb25zaWJsZUZvcigpCi0JICogQHNlZSAjZ2V0Um9sZURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0IDxlbT5Sb2xlIFNldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlIFNldDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGVTZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0I2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0I2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0Um9sZVNldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZVNldF9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0I2dldFJvbGUgPGVtPlJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJvbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0I2dldFJvbGUoKQotCSAqIEBzZWUgI2dldFJvbGVTZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVTZXRfUm9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nIDxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9sZVNldEdyb3VwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0R3JvdXBpbmcjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRSb2xlU2V0R3JvdXBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVTZXRHcm91cGluZ19Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0R3JvdXBpbmcjZ2V0Um9sZVNldCA8ZW0+Um9sZSBTZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJvbGUgU2V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nI2dldFJvbGVTZXQoKQotCSAqIEBzZWUgI2dldFJvbGVTZXRHcm91cGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24gPGVtPlNlY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFNlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRTdWJTZWN0aW9uIDxlbT5TdWIgU2VjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlN1YiBTZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRTdWJTZWN0aW9uKCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZWN0aW9uX1N1YlNlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRQcmVkZWNlc3NvciA8ZW0+UHJlZGVjZXNzb3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVkZWNlc3NvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0UHJlZGVjZXNzb3IoKQotCSAqIEBzZWUgI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3Rpb25fUHJlZGVjZXNzb3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3Rpb25fRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRTZWN0aW9uTmFtZSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VjdGlvbiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRTZWN0aW9uTmFtZSgpCi0JICogQHNlZSAjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9TZWN0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3Rpb25fVmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlN1cHBvcnRpbmdNYXRlcmlhbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhc2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFByZWNvbmRpdGlvbigpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19QcmVjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Qb3N0Y29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRQZXJmb3JtZWRCeSA8ZW0+UGVyZm9ybWVkIEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5QZXJmb3JtZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFBlcmZvcm1lZEJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldE1hbmRhdG9yeUlucHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRPdXRwdXQgPGVtPk91dHB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+T3V0cHV0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRPdXRwdXQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfT3V0cHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0T3B0aW9uYWxJbnB1dCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19PcHRpb25hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRFc3RpbWF0ZSA8ZW0+RXN0aW1hdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkVzdGltYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRFc3RpbWF0ZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Fc3RpbWF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRUb29sTWVudG9yIDxlbT5Ub29sIE1lbnRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFRvb2xNZW50b3IoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfVG9vbE1lbnRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhc2tEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdXJwb3NlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uI2dldFB1cnBvc2UoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yIDxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhc2tEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFRhc2sgPGVtPlRhc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0VGFzaygpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX1Rhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkgPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRHcm91cDMoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9Hcm91cDMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBc3Npc3RlZEJ5IDxlbT5Bc3Npc3RlZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QXNzaXN0ZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBc3Npc3RlZEJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEV4dGVybmFsSW5wdXQgPGVtPkV4dGVybmFsIElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEV4dGVybmFsSW5wdXQoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXQoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldE9wdGlvbmFsSW5wdXQoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0T3V0cHV0IDxlbT5PdXRwdXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPk91dHB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldE91dHB1dCgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFN0ZXAgPGVtPlN0ZXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlN0ZXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRTdGVwKCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfU3RlcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlIDxlbT5UZWFtIFByb2ZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVhbSBQcm9maWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRlYW1Qcm9maWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0VGVhbVByb2ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRlYW1Qcm9maWxlX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFJvbGUgPGVtPlJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJvbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRSb2xlKCkKLQkgKiBAc2VlICNnZXRUZWFtUHJvZmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGVhbVByb2ZpbGVfUm9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFN1cGVyVGVhbSA8ZW0+U3VwZXIgVGVhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+U3VwZXIgVGVhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFN1cGVyVGVhbSgpCi0JICogQHNlZSAjZ2V0VGVhbVByb2ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFN1YlRlYW0gPGVtPlN1YiBUZWFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5TdWIgVGVhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFN1YlRlYW0oKQotCSAqIEBzZWUgI2dldFRlYW1Qcm9maWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZSA8ZW0+VGVtcGxhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVtcGxhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGVtcGxhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlcm1EZWZpbml0aW9uIDxlbT5UZXJtIERlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVybURlZmluaXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRlcm1EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sIDxlbT5Ub29sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRvb2w8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUb29sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbCNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFRvb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRvb2xfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbCNnZXRUb29sTWVudG9yIDxlbT5Ub29sIE1lbnRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sI2dldFRvb2xNZW50b3IoKQotCSAqIEBzZWUgI2dldFRvb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRvb2xfVG9vbE1lbnRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sTWVudG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUb29sTWVudG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXaGl0ZXBhcGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtCcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldFByZWRlY2Vzc29yIDxlbT5QcmVkZWNlc3NvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRQcmVkZWNlc3NvcigpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNFdmVudERyaXZlbiA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc0V2ZW50RHJpdmVuKCkKLQkgKiBAc2VlICNnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIE9uZ29pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzT25nb2luZygpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzUmVwZWF0YWJsZSA8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFJlcGVhdGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzUmVwZWF0YWJsZSgpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzUmVwZWF0YWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24gPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIERlZmluaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24jZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBzZWUgI2dldFdvcmtEZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24jZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAc2VlICNnZXRXb3JrRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyIDxlbT5Xb3JrIE9yZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgT3JkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtPcmRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldFdvcmtPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya09yZGVyX1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRJZCgpCi0JICogQHNlZSAjZ2V0V29ya09yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrT3JkZXJfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldExpbmtUeXBlIDxlbT5MaW5rIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MaW5rIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0TGlua1R5cGUoKQotCSAqIEBzZWUgI2dldFdvcmtPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya09yZGVyX0xpbmtUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRFc3RpbWF0ZSA8ZW0+RXN0aW1hdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkVzdGltYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0RXN0aW1hdGUoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0X0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldFJlcG9ydCA8ZW0+UmVwb3J0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5SZXBvcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRSZXBvcnQoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9SZXBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRUZW1wbGF0ZSA8ZW0+VGVtcGxhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlRlbXBsYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0VGVtcGxhdGUoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldFRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Ub29sIE1lbnRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldFRvb2xNZW50b3IoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldEltcGFjdE9mTm90SGF2aW5nIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRJbXBhY3RPZk5vdEhhdmluZygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdXJwb3NlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRQdXJwb3NlKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRSZWFzb25zRm9yTm90TmVlZGluZyA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRXb3JrUHJvZHVjdCgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldFJlc3BvbnNpYmxlUm9sZSA8ZW0+UmVzcG9uc2libGUgUm9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc3BvbnNpYmxlIFJvbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0UmVzcG9uc2libGVSb2xlKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9SZXNwb25zaWJsZVJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRFeHRlcm5hbElucHV0VG8gPGVtPkV4dGVybmFsIElucHV0IFRvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5FeHRlcm5hbCBJbnB1dCBUbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRFeHRlcm5hbElucHV0VG8oKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RlZEJ5IDxlbT5JbXBhY3RlZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+SW1wYWN0ZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0ZWRCeSgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RzIDxlbT5JbXBhY3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5JbXBhY3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdHMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXRUbyA8ZW0+TWFuZGF0b3J5IElucHV0IFRvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NYW5kYXRvcnkgSW5wdXQgVG88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXRUbygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXRUbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRPcHRpb25hbElucHV0VG8gPGVtPk9wdGlvbmFsIElucHV0IFRvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5PcHRpb25hbCBJbnB1dCBUbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRPcHRpb25hbElucHV0VG8oKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX09wdGlvbmFsSW5wdXRUbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRPdXRwdXRGcm9tIDxlbT5PdXRwdXQgRnJvbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+T3V0cHV0IEZyb208L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0T3V0cHV0RnJvbSgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXREZWxpdmVyYWJsZVBhcnRzIDxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0RGVsaXZlcmFibGVQYXJ0cygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RW50cnlTdGF0ZSgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUV4aXRTdGF0ZSA8ZW0+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGUgPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RUeXBlX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZSNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGUjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUgPGVtPldvcmsgT3JkZXIgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPldvcmsgT3JkZXIgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0V29ya09yZGVyVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVmFyaWFiaWxpdHlUeXBlOk9iamVjdCcgYmFzZVR5cGU9J1ZhcmlhYmlsaXR5VHlwZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRWYXJpYWJpbGl0eVR5cGVPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlIDxlbT5Xb3JrIE9yZGVyIFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Xb3JrIE9yZGVyIFR5cGUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZQotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrT3JkZXJUeXBlOk9iamVjdCcgYmFzZVR5cGU9J1dvcmtPcmRlclR5cGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0V29ya09yZGVyVHlwZU9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVW1hRmFjdG9yeSBnZXRVbWFGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCA8ZW0+QWN0aXZpdHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QWN0aXZpdHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQUNUSVZJVFkgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX19QUkVDT05ESVRJT04gPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfUHJlY29uZGl0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfX1BPU1RDT05ESVRJT04gPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfUG9zdGNvbmRpdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9fR1JPVVAzID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5X0dyb3VwMygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9fUk9BRE1BUCA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Sb2FkbWFwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9fSVNfRU5BQ1RBQkxFID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5X0lzRW5hY3RhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5VHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCA8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFDVElWSVRZX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhvdyBUbyBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dfVE9fU1RBRkYgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3dUb1N0YWZmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbCA8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8gPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OID0gZUlOU1RBTkNFLmdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX0lzUHJpbWFyeUV4dGVuc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdEltcGwgPGVtPkFydGlmYWN0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFydGlmYWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFSVElGQUNUID0gZUlOU1RBTkNFLmdldEFydGlmYWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFSVElGQUNUX19HUk9VUDMgPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfR3JvdXAzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250YWluZWQgQXJ0aWZhY3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1QgPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwgPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBUlRJRkFDVF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CcmllZiBPdXRsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkUgPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUyA9IGVJTlNUQU5DRS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uT3B0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVwcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT04gPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Tm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT04gPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9Ob3RhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEJSRUFLRE9XTl9FTEVNRU5UID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVIgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9QbGFubmluZ0RhdGEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfR3JvdXAxKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1QgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfQ29uY2VwdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEUgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9FeGFtcGxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkUgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9HdWlkZWxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IGVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVIgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9XaGl0ZXBhcGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9Jc1BsYW5uZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVggPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNhcGFiaWxpdHlQYXR0ZXJuSW1wbCA8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENhcGFiaWxpdHlQYXR0ZXJuKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENBUEFCSUxJVFlfUEFUVEVSTiA9IGVJTlNUQU5DRS5nZXRDYXBhYmlsaXR5UGF0dGVybigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DaGVja2xpc3RJbXBsIDxlbT5DaGVja2xpc3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNoZWNrbGlzdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENoZWNrbGlzdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDSEVDS0xJU1QgPSBlSU5TVEFOQ0UuZ2V0Q2hlY2tsaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsIDxlbT5Db21wb3NpdGUgUm9sZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29tcG9zaXRlUm9sZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbXBvc2l0ZVJvbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09NUE9TSVRFX1JPTEUgPSBlSU5TVEFOQ0UuZ2V0Q29tcG9zaXRlUm9sZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT01QT1NJVEVfUk9MRV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGVfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZ2dyZWdhdGVkIFJvbGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEUgPSBlSU5TVEFOQ0UuZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db25jZXB0SW1wbCA8ZW0+Q29uY2VwdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29uY2VwdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbmNlcHQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OQ0VQVCA9IGVJTlNUQU5DRS5nZXRDb25jZXB0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnN0cmFpbnRJbXBsIDxlbT5Db25zdHJhaW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db25zdHJhaW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29uc3RyYWludCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05TVFJBSU5UID0gZUlOU1RBTkNFLmdldENvbnN0cmFpbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05TVFJBSU5UX19NQUlOX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldENvbnN0cmFpbnRfTWFpbkRlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRDYXRlZ29yeUltcGwgPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRDYXRlZ29yeUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRDYXRlZ29yeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05URU5UX0NBVEVHT1JZID0gZUlOU1RBTkNFLmdldENvbnRlbnRDYXRlZ29yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbCA8ZW0+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudCBDYXRlZ29yeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19DT05URU5UX0NBVEVHT1JZID0gZUlOU1RBTkNFLmdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfQ29udGVudENhdGVnb3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwgPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05URU5UX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTiA9IGVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IGVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwgPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50RWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05URU5UX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9FTEVNRU5UX19HUk9VUDEgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfR3JvdXAxKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRSA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfUmV1c2FibGVBc3NldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X1doaXRlcGFwZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsIDxlbT5Db250ZW50IFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRQYWNrYWdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudFBhY2thZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9QQUNLQUdFID0gZUlOU1RBTkNFLmdldENvbnRlbnRQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfUEFDS0FHRV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldENvbnRlbnRQYWNrYWdlX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwgPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDdXN0b21DYXRlZ29yeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDVVNUT01fQ0FURUdPUlkgPSBlSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ1VTVE9NX0NBVEVHT1JZX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnlfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXRlZ29yaXplZCBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgQ2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JZID0gZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbCA8ZW0+RGVsaXZlcmFibGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcmFibGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVMSVZFUkFCTEUgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUkFCTEVfX0dST1VQMyA9IGVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZV9Hcm91cDMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUID0gZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsIDxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVMSVZFUkFCTEVfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYWNrYWdpbmcgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFID0gZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbCA8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFTElWRVJZX1BST0NFU1MgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfX0dST1VQNCA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NfR3JvdXA0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUwgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVkdWNhdGlvbiBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMID0gZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRSA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUyA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SaXNrIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTCA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFID0gZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGUgT2YgQ29udHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUID0gZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwgPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERVNDUklCQUJMRV9FTEVNRU5UID0gZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFU0NSSUJBQkxFX0VMRU1FTlRfX0ZVTEZJTEwgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50X0Z1bGZpbGwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1QgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50X0lzQWJzdHJhY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT04gPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT04gPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1NoYXBlaWNvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmlwdG9ySW1wbCA8ZW0+RGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVzY3JpcHRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaXB0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXREZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCA8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFU0NSSVBUT1JfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWZpbmVkIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsIDxlbT5EaXNjaXBsaW5lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlzY2lwbGluZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBESVNDSVBMSU5FID0gZUlOU1RBTkNFLmdldERpc2NpcGxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRElTQ0lQTElORV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXNrPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBESVNDSVBMSU5FX19UQVNLID0gZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfVGFzaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViIERpc2NpcGxpbmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJU0NJUExJTkVfX1NVQl9ESVNDSVBMSU5FID0gZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfU3ViRGlzY2lwbGluZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlIFdvcmtmbG93PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1cgPSBlSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvdygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsIDxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaXNjaXBsaW5lR3JvdXBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRElTQ0lQTElORV9HUk9VUElORyA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lR3JvdXBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRElTQ0lQTElORV9HUk9VUElOR19fR1JPVVAyID0gZUlOU1RBTkNFLmdldERpc2NpcGxpbmVHcm91cGluZ19Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc2NpcGxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkUgPSBlSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9jdW1lbnRSb290SW1wbCA8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9jdW1lbnRSb290SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RG9jdW1lbnRSb290KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERPQ1VNRU5UX1JPT1QgPSBlSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRE9DVU1FTlRfUk9PVF9fTUlYRUQgPSBlSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X01peGVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YTUxOUyBQcmVmaXggTWFwPC9iPjwvZW0+JyBtYXAgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUCA9IGVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OID0gZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9YU0lTY2hlbWFMb2NhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTiA9IGVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfTWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIExpYnJhcnk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWSA9IGVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfTWV0aG9kTGlicmFyeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERPQ1VNRU5UX1JPT1RfX01FVEhPRF9QTFVHSU4gPSBlSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X01ldGhvZFBsdWdpbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb21haW5JbXBsIDxlbT5Eb21haW48L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvbWFpbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERvbWFpbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBET01BSU4gPSBlSU5TVEFOQ0UuZ2V0RG9tYWluKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERPTUFJTl9fR1JPVVAyID0gZUlOU1RBTkNFLmdldERvbWFpbl9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRE9NQUlOX19XT1JLX1BST0RVQ1QgPSBlSU5TVEFOQ0UuZ2V0RG9tYWluX1dvcmtQcm9kdWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWJkb21haW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERPTUFJTl9fU1VCRE9NQUlOID0gZUlOU1RBTkNFLmdldERvbWFpbl9TdWJkb21haW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRWxlbWVudEltcGwgPGVtPkVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0RWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0ZUltcGwgPGVtPkVzdGltYXRlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0ZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVzdGltYXRlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVTVElNQVRFID0gZUlOU1RBTkNFLmdldEVzdGltYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVTVElNQVRFX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0RXN0aW1hdGVfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIE1ldHJpYzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRVNUSU1BVEVfX0VTVElNQVRJT05fTUVUUklDID0gZUlOU1RBTkNFLmdldEVzdGltYXRlX0VzdGltYXRpb25NZXRyaWMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVTVElNQVRFX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gZUlOU1RBTkNFLmdldEVzdGltYXRlX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0aW5nTWV0cmljSW1wbCA8ZW0+RXN0aW1hdGluZyBNZXRyaWM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRpbmdNZXRyaWNJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFc3RpbWF0aW5nTWV0cmljKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVTVElNQVRJTkdfTUVUUklDID0gZUlOU1RBTkNFLmdldEVzdGltYXRpbmdNZXRyaWMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbCA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBlSU5TVEFOQ0UuZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkV4YW1wbGVJbXBsIDxlbT5FeGFtcGxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5FeGFtcGxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RXhhbXBsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFWEFNUExFID0gZUlOU1RBTkNFLmdldEV4YW1wbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGFuY2VJbXBsIDxlbT5HdWlkYW5jZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGFuY2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkYW5jZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBHVUlEQU5DRSA9IGVJTlNUQU5DRS5nZXRHdWlkYW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5HdWlkYW5jZURlc2NyaXB0aW9uSW1wbCA8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRhbmNlRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdVSURBTkNFX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF0dGFjaG1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBHVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVCA9IGVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGVsaW5lSW1wbCA8ZW0+R3VpZGVsaW5lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5HdWlkZWxpbmVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkZWxpbmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgR1VJREVMSU5FID0gZUlOU1RBTkNFLmdldEd1aWRlbGluZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5JdGVyYXRpb25JbXBsIDxlbT5JdGVyYXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkl0ZXJhdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEl0ZXJhdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBJVEVSQVRJT04gPSBlSU5TVEFOQ0UuZ2V0SXRlcmF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLktpbmRJbXBsIDxlbT5LaW5kPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5LaW5kSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0S2luZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBLSU5EID0gZUlOU1RBTkNFLmdldEtpbmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBLSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTyA9IGVJTlNUQU5DRS5nZXRLaW5kX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVUSE9EX0NPTkZJR1VSQVRJT04gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBDb25maWd1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fQmFzZUNvbmZpZ3VyYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmlldzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVcgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzcyBWaWV3PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXID0gZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZID0gZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZGRlZCBDYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZID0gZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fQWRkZWRDYXRlZ29yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCA8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fR1JPVVAgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9Hcm91cCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEUgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fSUQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbCA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eV9WYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbCA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RMaWJyYXJ5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9MSUJSQVJZID0gZUlOU1RBTkNFLmdldE1ldGhvZExpYnJhcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOID0gZUlOU1RBTkNFLmdldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2luKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgQ29uZmlndXJhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0xJQlJBUllfX01FVEhPRF9DT05GSUdVUkFUSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZExpYnJhcnlfTWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VG9vbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9MSUJSQVJZX19UT09MID0gZUlOU1RBTkNFLmdldE1ldGhvZExpYnJhcnlfVG9vbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbCA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RQYWNrYWdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9QQUNLQUdFID0gZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1BBQ0tBR0VfX0dST1VQMSA9IGVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlX0dyb3VwMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmV1c2VkIFBhY2thZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlX1JldXNlZFBhY2thZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZV9NZXRob2RQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfUEFDS0FHRV9fR0xPQkFMID0gZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2VfR2xvYmFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwgPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZFBsdWdpbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfUExVR0lOID0gZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfUExVR0lOX19SRUZFUkVOQ0VEX01FVEhPRF9QTFVHSU4gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX1JlZmVyZW5jZWRNZXRob2RQbHVnaW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXNlciBDaGFuZ2VhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFID0gZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RVbml0SW1wbCA8ZW0+TWV0aG9kIFVuaXQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RVbml0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9VTklUID0gZUlOU1RBTkNFLmdldE1ldGhvZFVuaXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9VTklUX19DT1BZUklHSFQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfVU5JVF9fQVVUSE9SUyA9IGVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0F1dGhvcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFID0gZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1VOSVRfX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1pbGVzdG9uZUltcGwgPGVtPk1pbGVzdG9uZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWlsZXN0b25lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWlsZXN0b25lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1JTEVTVE9ORSA9IGVJTlNUQU5DRS5nZXRNaWxlc3RvbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkIFJlc3VsdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFQgPSBlSU5TVEFOQ0UuZ2V0TWlsZXN0b25lX1JlcXVpcmVkUmVzdWx0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwgPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE5hbWVkRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBOQU1FRF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE5BTUVEX0VMRU1FTlRfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuT3V0Y29tZUltcGwgPGVtPk91dGNvbWU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk91dGNvbWVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRPdXRjb21lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE9VVENPTUUgPSBlSU5TVEFOQ0UuZ2V0T3V0Y29tZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QYWNrYWdlYWJsZUVsZW1lbnRJbXBsIDxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QYWNrYWdlYWJsZUVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQYWNrYWdlYWJsZUVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUEFDS0FHRUFCTEVfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRQYWNrYWdlYWJsZUVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGhhc2VJbXBsIDxlbT5QaGFzZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGhhc2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQaGFzZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQSEFTRSA9IGVJTlNUQU5DRS5nZXRQaGFzZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsIDxlbT5QbGFubmluZyBEYXRhPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQbGFubmluZ0RhdGEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUExBTk5JTkdfREFUQSA9IGVJTlNUQU5DRS5nZXRQbGFubmluZ0RhdGEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEUgPSBlSU5TVEFOQ0UuZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJhbms8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQTEFOTklOR19EQVRBX19SQU5LID0gZUlOU1RBTkNFLmdldFBsYW5uaW5nRGF0YV9SYW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdGFydCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUExBTk5JTkdfREFUQV9fU1RBUlRfREFURSA9IGVJTlNUQU5DRS5nZXRQbGFubmluZ0RhdGFfU3RhcnREYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlSW1wbCA8ZW0+UHJhY3RpY2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJhY3RpY2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJBQ1RJQ0UgPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZV9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IFJlZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRSA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudCBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRSA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgUHJhY3RpY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBSQUNUSUNFX19TVUJfUFJBQ1RJQ0UgPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwgPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUkFDVElDRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsIEluZm88L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPID0gZUlOU1RBTkNFLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OID0gZUlOU1RBTkNFLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORCA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdvYWxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTID0gZUlOU1RBTkNFLmdldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxldmVscyBPZiBBZG9wdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT04gPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9ibGVtPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU0gPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NJbXBsIDxlbT5Qcm9jZXNzPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2VzcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTID0gZUlOU1RBTkNFLmdldFByb2Nlc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk4gPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX19WQUxJRF9DT05URVhUID0gZUlOU1RBTkNFLmdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtIFVSSTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfX0RJQUdSQU1fVVJJID0gZUlOU1RBTkNFLmdldFByb2Nlc3NfRGlhZ3JhbVVSSSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCA8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1NfQ09NUE9ORU5UID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFQgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudF9Db3B5cmlnaHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0UgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudF9JbnRlcmZhY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUyA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUyA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50X0F1dGhvcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50X0NoYW5nZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudF9WZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTiA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZVNwZWNpZmljYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZSBJTzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU8gPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VJTygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsIDxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNjb3BlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEUgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBOb3RlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTID0gZUlOU1RBTkNFLmdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NFbGVtZW50SW1wbCA8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1NfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwgPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzUGFja2FnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BhY2thZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19QQUNLQUdFX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BhY2thZ2VfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UID0gZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbCA8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFID0gZUlOU1RBTkNFLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQNCA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9Hcm91cDQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUHJvY2VzczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRV9QUk9DRVNTID0gZUlOU1RBTkNFLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0Jhc2VQcm9jZXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJlcG9ydEltcGwgPGVtPlJlcG9ydDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUmVwb3J0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UmVwb3J0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJFUE9SVCA9IGVJTlNUQU5DRS5nZXRSZXBvcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUmV1c2FibGVBc3NldEltcGwgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5SZXVzYWJsZUFzc2V0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UmV1c2FibGVBc3NldCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBSRVVTQUJMRV9BU1NFVCA9IGVJTlNUQU5DRS5nZXRSZXVzYWJsZUFzc2V0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvYWRtYXBJbXBsIDxlbT5Sb2FkbWFwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2FkbWFwSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9hZG1hcCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0FETUFQID0gZUlOU1RBTkNFLmdldFJvYWRtYXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZUltcGwgPGVtPlJvbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJPTEUgPSBlSU5TVEFOQ0UuZ2V0Um9sZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0Um9sZV9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIEZvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9fUkVTUE9OU0lCTEVfRk9SID0gZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbCA8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZURlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJPTEVfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVMgPSBlSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ta2lsbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX0RFU0NSSVBUSU9OX19TS0lMTFMgPSBlSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3lub255bXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUyA9IGVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsIDxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZURlc2NyaXB0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9ERVNDUklQVE9SX19ST0xFID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIEZvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1IgPSBlSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZVNldEltcGwgPGVtPlJvbGUgU2V0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZVNldCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFX1NFVCA9IGVJTlNUQU5DRS5nZXRSb2xlU2V0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfU0VUX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0Um9sZVNldF9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfU0VUX19ST0xFID0gZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsIDxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZVNldEdyb3VwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJPTEVfU0VUX0dST1VQSU5HID0gZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX1NFVF9HUk9VUElOR19fR1JPVVAyID0gZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZ19Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGUgU2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVQgPSBlSU5TVEFOQ0UuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU2VjdGlvbkltcGwgPGVtPlNlY3Rpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlNlY3Rpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTZWN0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0U2VjdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViIFNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRUNUSU9OX19TVUJfU0VDVElPTiA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uX1N1YlNlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVElPTl9fUFJFREVDRVNTT1IgPSBlSU5TVEFOQ0UuZ2V0U2VjdGlvbl9QcmVkZWNlc3NvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRUNUSU9OX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uX0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRUNUSU9OX19TRUNUSU9OX05BTUUgPSBlSU5TVEFOQ0UuZ2V0U2VjdGlvbl9TZWN0aW9uTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1RJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVElPTl9fVkFSSUFCSUxJVFlfVFlQRSA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uX1ZhcmlhYmlsaXR5VHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU1VQUE9SVElOR19NQVRFUklBTCA9IGVJTlNUQU5DRS5nZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0ltcGwgPGVtPlRhc2s8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRBU0sgPSBlSU5TVEFOQ0UuZ2V0VGFzaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fUFJFQ09ORElUSU9OID0gZUlOU1RBTkNFLmdldFRhc2tfUHJlY29uZGl0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fUE9TVENPTkRJVElPTiA9IGVJTlNUQU5DRS5nZXRUYXNrX1Bvc3Rjb25kaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBlcmZvcm1lZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fUEVSRk9STUVEX0JZID0gZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fR1JPVVAyID0gZUlOU1RBTkNFLmdldFRhc2tfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX01BTkRBVE9SWV9JTlBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX09VVFBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSA9IGVJTlNUQU5DRS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fT1BUSU9OQUxfSU5QVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fRVNUSU1BVEUgPSBlSU5TVEFOQ0UuZ2V0VGFza19Fc3RpbWF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IGVJTlNUQU5DRS5nZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX1RPT0xfTUVOVE9SID0gZUlOU1RBTkNFLmdldFRhc2tfVG9vbE1lbnRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEFTS19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwgPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUQVNLX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX1RBU0sgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX0dST1VQMyA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9Hcm91cDMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXNzaXN0ZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlkgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWwgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3V0cHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX09VVFBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0ZXA8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfREVTQ1JJUFRPUl9fU1RFUCA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9TdGVwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsIDxlbT5UZWFtIFByb2ZpbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVhbVByb2ZpbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEVBTV9QUk9GSUxFID0gZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRFQU1fUFJPRklMRV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEVBTV9QUk9GSUxFX19ST0xFID0gZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1JvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIFRlYW08L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTSA9IGVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9TdXBlclRlYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YiBUZWFtPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBURUFNX1BST0ZJTEVfX1NVQl9URUFNID0gZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVtcGxhdGVJbXBsIDxlbT5UZW1wbGF0ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVtcGxhdGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZW1wbGF0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBURU1QTEFURSA9IGVJTlNUQU5DRS5nZXRUZW1wbGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZXJtRGVmaW5pdGlvbkltcGwgPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVybURlZmluaXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZXJtRGVmaW5pdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBURVJNX0RFRklOSVRJT04gPSBlSU5TVEFOQ0UuZ2V0VGVybURlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVG9vbEltcGwgPGVtPlRvb2w8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRvb2xJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUb29sKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRPT0wgPSBlSU5TVEFOQ0UuZ2V0VG9vbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUT09MX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0VG9vbF9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUT09MX19UT09MX01FTlRPUiA9IGVJTlNUQU5DRS5nZXRUb29sX1Rvb2xNZW50b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVG9vbE1lbnRvckltcGwgPGVtPlRvb2wgTWVudG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Ub29sTWVudG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VG9vbE1lbnRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUT09MX01FTlRPUiA9IGVJTlNUQU5DRS5nZXRUb29sTWVudG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldoaXRlcGFwZXJJbXBsIDxlbT5XaGl0ZXBhcGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5XaGl0ZXBhcGVySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V2hpdGVwYXBlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXSElURVBBUEVSID0gZUlOU1RBTkNFLmdldFdoaXRlcGFwZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsIDxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfQlJFQUtET1dOX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyID0gZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SID0gZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4gPSBlSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkcgPSBlSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRSA9IGVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsIDxlbT5Xb3JrIERlZmluaXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya0RlZmluaXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19ERUZJTklUSU9OID0gZUlOU1RBTkNFLmdldFdvcmtEZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiA9IGVJTlNUQU5DRS5nZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04gPSBlSU5TVEFOQ0UuZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsIDxlbT5Xb3JrIE9yZGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrT3JkZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19PUkRFUiA9IGVJTlNUQU5DRS5nZXRXb3JrT3JkZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19PUkRFUl9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0V29ya09yZGVyX1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfT1JERVJfX0lEID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlcl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGluayBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19PUkRFUl9fTElOS19UWVBFID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlcl9MaW5rVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1QgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX19FU1RJTUFURSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfX1JFUE9SVCA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9SZXBvcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1RlbXBsYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX19UT09MX01FTlRPUiA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBhY3QgT2YgTm90IEhhdmluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORyA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwgPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19QUk9EVUNUX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgUm9sZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9ST0xFID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9SZXNwb25zaWJsZVJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJbnB1dCBUbzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUX1RPID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9FeHRlcm5hbElucHV0VG8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcGFjdGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlkgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcGFjdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQgVG88L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVRfVE8gPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0VG8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0IFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVRfVE8gPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX09wdGlvbmFsSW5wdXRUbygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3V0cHV0IEZyb208L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PVVRQVVRfRlJPTSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVsaXZlcmFibGUgUGFydHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUyA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEUgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3RUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfUFJPRFVDVF9UWVBFID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfVFlQRV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZV9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVCA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBWQVJJQUJJTElUWV9UWVBFID0gZUlOU1RBTkNFLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZSA8ZW0+V29yayBPcmRlciBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrT3JkZXJUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gV09SS19PUkRFUl9UWVBFID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlclR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRWYXJpYWJpbGl0eVR5cGVPYmplY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgVkFSSUFCSUxJVFlfVFlQRV9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0VmFyaWFiaWxpdHlUeXBlT2JqZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5Xb3JrIE9yZGVyIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya09yZGVyVHlwZU9iamVjdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBXT1JLX09SREVSX1RZUEVfT0JKRUNUID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlclR5cGVPYmplY3QoKTsKLQotCX0KLQotfSAvL1VtYVBhY2thZ2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9WYXJpYWJpbGl0eVR5cGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9WYXJpYWJpbGl0eVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMwN2ViMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVmFyaWFiaWxpdHlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBWYXJpYWJpbGl0eVR5cGUuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVmFyaWFiaWxpdHlUeXBlJyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gVmFyaWFiaWxpdHlUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5hPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05BX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JTkEoMCwgIm5hIiwgIm5hIiksCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29udHJpYnV0ZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OVFJJQlVURVNfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlDT05UUklCVVRFUygxLCAiY29udHJpYnV0ZXMiLCAiY29udHJpYnV0ZXMiKSwKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FeHRlbmRzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYVEVORFNfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlFWFRFTkRTKDIsICJleHRlbmRzIiwgImV4dGVuZHMiKSwKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRVBMQUNFU19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVJFUExBQ0VTKDMsICJyZXBsYWNlcyIsICJyZXBsYWNlcyIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsIENvbnRyaWJ1dGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNMT0NBTF9DT05UUklCVVRJT05fVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlMT0NBTF9DT05UUklCVVRJT04oNCwgImxvY2FsQ29udHJpYnV0aW9uIiwgImxvY2FsQ29udHJpYnV0aW9uIiksCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWwgUmVwbGFjZW1lbnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfUkVQTEFDRU1FTlRfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlMT0NBTF9SRVBMQUNFTUVOVCg1LCAibG9jYWxSZXBsYWNlbWVudCIsICJsb2NhbFJlcGxhY2VtZW50IiksCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RXh0ZW5kcyBSZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWFRFTkRTX1JFUExBQ0VTX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JRVhURU5EU19SRVBMQUNFUyg2LCAiZXh0ZW5kc1JlcGxhY2VzIiwgImV4dGVuZHNSZXBsYWNlcyIpOwotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5hPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OYTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOQQotCSAqIEBtb2RlbCBuYW1lPSJuYSIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQV9WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db250cmlidXRlczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q29udHJpYnV0ZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OVFJJQlVURVMKLQkgKiBAbW9kZWwgbmFtZT0iY29udHJpYnV0ZXMiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVFJJQlVURVNfVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RXh0ZW5kczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RXh0ZW5kczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWFRFTkRTCi0JICogQG1vZGVsIG5hbWU9ImV4dGVuZHMiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhURU5EU19WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UmVwbGFjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVQTEFDRVMKLQkgKiBAbW9kZWwgbmFtZT0icmVwbGFjZXMiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQTEFDRVNfVkFMVUUgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWwgQ29udHJpYnV0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Mb2NhbCBDb250cmlidXRpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfQ09OVFJJQlVUSU9OCi0JICogQG1vZGVsIG5hbWU9ImxvY2FsQ29udHJpYnV0aW9uIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMX0NPTlRSSUJVVElPTl9WQUxVRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Mb2NhbCBSZXBsYWNlbWVudDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TG9jYWwgUmVwbGFjZW1lbnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfUkVQTEFDRU1FTlQKLQkgKiBAbW9kZWwgbmFtZT0ibG9jYWxSZXBsYWNlbWVudCIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTF9SRVBMQUNFTUVOVF9WQUxVRSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FeHRlbmRzIFJlcGxhY2VzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FeHRlbmRzIFJlcGxhY2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYVEVORFNfUkVQTEFDRVMKLQkgKiBAbW9kZWwgbmFtZT0iZXh0ZW5kc1JlcGxhY2VzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYVEVORFNfUkVQTEFDRVNfVkFMVUUgPSA2OwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBWYXJpYWJpbGl0eVR5cGVbXSB7Ci0JCQlOQSwKLQkJCUNPTlRSSUJVVEVTLAotCQkJRVhURU5EUywKLQkJCVJFUExBQ0VTLAotCQkJTE9DQUxfQ09OVFJJQlVUSU9OLAotCQkJTE9DQUxfUkVQTEFDRU1FTlQsCi0JCQlFWFRFTkRTX1JFUExBQ0VTLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxWYXJpYWJpbGl0eVR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhcmlhYmlsaXR5VHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVZhcmlhYmlsaXR5VHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIE5BX1ZBTFVFOiByZXR1cm4gTkE7Ci0JCQljYXNlIENPTlRSSUJVVEVTX1ZBTFVFOiByZXR1cm4gQ09OVFJJQlVURVM7Ci0JCQljYXNlIEVYVEVORFNfVkFMVUU6IHJldHVybiBFWFRFTkRTOwotCQkJY2FzZSBSRVBMQUNFU19WQUxVRTogcmV0dXJuIFJFUExBQ0VTOwotCQkJY2FzZSBMT0NBTF9DT05UUklCVVRJT05fVkFMVUU6IHJldHVybiBMT0NBTF9DT05UUklCVVRJT047Ci0JCQljYXNlIExPQ0FMX1JFUExBQ0VNRU5UX1ZBTFVFOiByZXR1cm4gTE9DQUxfUkVQTEFDRU1FTlQ7Ci0JCQljYXNlIEVYVEVORFNfUkVQTEFDRVNfVkFMVUU6IHJldHVybiBFWFRFTkRTX1JFUExBQ0VTOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWYXJpYWJpbGl0eVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7Ci0JICByZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgewotCSAgcmV0dXJuIGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV2hpdGVwYXBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1doaXRlcGFwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAzZWE3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV2hpdGVwYXBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXaGl0ZXBhcGVyLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgQ29uY2VwdCBndWlkYW5jZSB0aGF0IGhhdmUgYmVlbiBleHRlcm5hbGx5IHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V2hpdGVwYXBlcigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV2hpdGVwYXBlcicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdoaXRlcGFwZXIgZXh0ZW5kcyBDb25jZXB0IHsKLX0gLy8gV2hpdGVwYXBlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrQnJlYWtkb3duRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtCcmVha2Rvd25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOGY4OGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtCcmVha2Rvd25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrQnJlYWtkb3duRWxlbWVudC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRQcmVkZWNlc3NvciA8ZW0+UHJlZGVjZXNzb3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNFdmVudERyaXZlbiA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtCcmVha2Rvd25FbGVtZW50JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya0JyZWFrZG93bkVsZW1lbnQgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkZWNlc3NvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3IoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlZGVjZXNzb3InIGdyb3VwPScjZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxXb3JrT3JkZXI+IGdldFByZWRlY2Vzc29yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4KLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzRXZlbnREcml2ZW4oKQotCSAqIEBzZWUgI3Vuc2V0SXNFdmVudERyaXZlbigpCi0JICogQHNlZSAjc2V0SXNFdmVudERyaXZlbihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2lzRXZlbnREcml2ZW4nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNFdmVudERyaXZlbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc0V2ZW50RHJpdmVuIDxlbT5JcyBFdmVudCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0V2ZW50RHJpdmVuKCkKLQkgKiBAc2VlICN1bnNldElzRXZlbnREcml2ZW4oKQotCSAqIEBzZWUgI2lzSXNFdmVudERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNFdmVudERyaXZlbihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc0V2ZW50RHJpdmVuIDxlbT5JcyBFdmVudCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNFdmVudERyaXZlbigpCi0JICogQHNlZSAjaXNJc0V2ZW50RHJpdmVuKCkKLQkgKiBAc2VlICNzZXRJc0V2ZW50RHJpdmVuKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc0V2ZW50RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNFdmVudERyaXZlbiA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBFdmVudCBEcml2ZW48L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzRXZlbnREcml2ZW4oKQotCSAqIEBzZWUgI2lzSXNFdmVudERyaXZlbigpCi0JICogQHNlZSAjc2V0SXNFdmVudERyaXZlbihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNFdmVudERyaXZlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgdGhlIGlzT25nb2luZyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gaW5zdGFuY2UsIHRoZW4gdGhlIGVsZW1lbnQgZGVzY3JpYmVzIGFuIG9uZ29pbmcgcGllY2Ugb2Ygd29yayB3aXRob3V0IGEgZml4ZWQgZHVyYXRpb24gb3IgZW5kIHN0YXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayBvZiBhbiBhZG1pbmlzdHJhdG9yIGNvbnRpbnVvdXNseSAoZS5nLiAzaCBhIGRheSkgd29ya2luZyB0byBlbnN1cmUgdGhhdCBzeXN0ZW1zIGFyZSBrZXB0IGluIGEgY2VydGFpbiBzdGF0ZS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBwcm9ncmFtIG1hbmFnZW1lbnQgd29yayBvdmVyc2VlaW5nIG1hbnkgZGlmZmVyZW50IHByb2plY3RzIGJlaW5nIHNjaGVkdWxlZCBmb3Igb25lIHBhcnRpY3VsYXIgcHJvamVjdCBhdCBzcGVjaWZpYyByZW9jY3VycmluZyBpbnRlcnZhbHMgZHVyaW5nIHRoZSB3aG9sZSBsaWZlY3ljbGUgb2YgdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIE9uZ29pbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNPbmdvaW5nKCkKLQkgKiBAc2VlICN1bnNldElzT25nb2luZygpCi0JICogQHNlZSAjc2V0SXNPbmdvaW5nKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdpc09uZ29pbmcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNPbmdvaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT25nb2luZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc09uZ29pbmcoKQotCSAqIEBzZWUgI3Vuc2V0SXNPbmdvaW5nKCkKLQkgKiBAc2VlICNpc0lzT25nb2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNPbmdvaW5nKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc09uZ29pbmcoKQotCSAqIEBzZWUgI2lzSXNPbmdvaW5nKCkKLQkgKiBAc2VlICNzZXRJc09uZ29pbmcoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzT25nb2luZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT25nb2luZzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNPbmdvaW5nKCkKLQkgKiBAc2VlICNpc0lzT25nb2luZygpCi0JICogQHNlZSAjc2V0SXNPbmdvaW5nKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc09uZ29pbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBSZXBlYXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzUmVwZWF0YWJsZSgpCi0JICogQHNlZSAjdW5zZXRJc1JlcGVhdGFibGUoKQotCSAqIEBzZWUgI3NldElzUmVwZWF0YWJsZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naXNSZXBlYXRhYmxlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzUmVwZWF0YWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIFJlcGVhdGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNSZXBlYXRhYmxlKCkKLQkgKiBAc2VlICN1bnNldElzUmVwZWF0YWJsZSgpCi0JICogQHNlZSAjaXNJc1JlcGVhdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzUmVwZWF0YWJsZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNSZXBlYXRhYmxlKCkKLQkgKiBAc2VlICNpc0lzUmVwZWF0YWJsZSgpCi0JICogQHNlZSAjc2V0SXNSZXBlYXRhYmxlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc1JlcGVhdGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFJlcGVhdGFibGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzUmVwZWF0YWJsZSgpCi0JICogQHNlZSAjaXNJc1JlcGVhdGFibGUoKQotCSAqIEBzZWUgI3NldElzUmVwZWF0YWJsZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNSZXBlYXRhYmxlKCk7Ci0KLX0gLy8gV29ya0JyZWFrZG93bkVsZW1lbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya0RlZmluaXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjkyYWFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrRGVmaW5pdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgRGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuCi0gKiBXb3JrIERlZmluaXRpb25zIHJlcHJlc2VudCBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgZG9pbmcgd29yay4gIFRoZXNlIGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGFyZSBub3QgYm91bmQgdG8gb25lIHNwZWNpZmljIGNsYXNzaWZpZXIsIGJ1dCByZXByZXNlbnQgYW4gYXJiaXRyYXJ5IGRlZmluaXRpb24gb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZCBieSBhIHNwZWNpZmljIFJvbGUgKGUuZy4gYSBSb2xlIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBUYXNrIG9yIFN0ZXBzIG9mIGEgVGFzayksIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjbG9zZSBjb2xsYWJvcmF0aW9uIChtYW55IFJvbGVzIGFsbCB3b3JraW5nIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIGludGVyZGlzY2lwbGluYXJ5IFRhc2spLCBvciBjb21wbGV4IHdvcmsgdGhhdCBpcyBwZXJmb3JtZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIChlLmcuIGEgcHJvY2VzcyBkZWZpbmluZyBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgZm9yIG9yZ2FuaXppbmcgbGFyZ2VyIGNvbXBvc2l0ZSB1bml0cyBvZiB3b3JrIHBlcmZvcm1lZCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY29sbGFib3JhdGlvbikuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24jZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0RlZmluaXRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtEZWZpbml0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya0RlZmluaXRpb24gZXh0ZW5kcyBNZXRob2RFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZWNvbmRpdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtEZWZpbml0aW9uX1ByZWNvbmRpdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmVjb25kaXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlY29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWNvbmRpdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQb3N0Y29uZGl0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQb3N0Y29uZGl0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBvc3Rjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBvc3Rjb25kaXRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBXb3JrRGVmaW5pdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrT3JkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrT3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFhNGI2ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya09yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrT3JkZXIuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgT3JkZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBSZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50cyBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnRzIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50cyBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuICAKLSAqIFRoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldExpbmtUeXBlIDxlbT5MaW5rIFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya09yZGVyKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrT3JkZXInIGtpbmQ9J3NpbXBsZSciCi0gKiBAZXh0ZW5kcyBFRGF0YU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtPcmRlciBleHRlbmRzIEVEYXRhT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya09yZGVyX1ZhbHVlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9JzowJyBraW5kPSdzaW1wbGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGEgZ2xvYmFsIHVuaXF1ZSBpZCBmb3IgYSB3b3JrIG9yZGVyLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrT3JkZXJfSWQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdpZCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGluayBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZpbmlzaFRvU3RhcnQiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZQotCSAqIEBzZWUgI2lzU2V0TGlua1R5cGUoKQotCSAqIEBzZWUgI3Vuc2V0TGlua1R5cGUoKQotCSAqIEBzZWUgI3NldExpbmtUeXBlKFdvcmtPcmRlclR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtPcmRlcl9MaW5rVHlwZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZpbmlzaFRvU3RhcnQiIHVuc2V0dGFibGU9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nbGlua1R5cGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrT3JkZXJUeXBlIGdldExpbmtUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0TGlua1R5cGUgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGluayBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUKLQkgKiBAc2VlICNpc1NldExpbmtUeXBlKCkKLQkgKiBAc2VlICN1bnNldExpbmtUeXBlKCkKLQkgKiBAc2VlICNnZXRMaW5rVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRMaW5rVHlwZSA8ZW0+TGluayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldExpbmtUeXBlKCkKLQkgKiBAc2VlICNnZXRMaW5rVHlwZSgpCi0JICogQHNlZSAjc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldExpbmtUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRMaW5rVHlwZSA8ZW0+TGluayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldExpbmtUeXBlKCkKLQkgKiBAc2VlICNnZXRMaW5rVHlwZSgpCi0JICogQHNlZSAjc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldExpbmtUeXBlKCk7Ci0KLX0gLy8gV29ya09yZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtPcmRlclR5cGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrT3JkZXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNTIzY2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtPcmRlclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtPcmRlclR5cGUuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPldvcmsgT3JkZXIgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBSZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtPcmRlclR5cGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtPcmRlclR5cGUnIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBXb3JrT3JkZXJUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZpbmlzaCBUbyBTdGFydDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGSU5JU0hfVE9fU1RBUlRfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlGSU5JU0hfVE9fU1RBUlQoMCwgImZpbmlzaFRvU3RhcnQiLCAiZmluaXNoVG9TdGFydCIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZpbmlzaCBUbyBGaW5pc2g8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRklOSVNIX1RPX0ZJTklTSF9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUZJTklTSF9UT19GSU5JU0goMSwgImZpbmlzaFRvRmluaXNoIiwgImZpbmlzaFRvRmluaXNoIiksCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U3RhcnQgVG8gU3RhcnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU1RBUlRfVE9fU1RBUlRfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlTVEFSVF9UT19TVEFSVCgyLCAic3RhcnRUb1N0YXJ0IiwgInN0YXJ0VG9TdGFydCIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0YXJ0IFRvIEZpbmlzaDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTVEFSVF9UT19GSU5JU0hfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlTVEFSVF9UT19GSU5JU0goMywgInN0YXJ0VG9GaW5pc2giLCAic3RhcnRUb0ZpbmlzaCIpOwotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZpbmlzaCBUbyBTdGFydDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RmluaXNoIFRvIFN0YXJ0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0ZJTklTSF9UT19TVEFSVAotCSAqIEBtb2RlbCBuYW1lPSJmaW5pc2hUb1N0YXJ0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTklTSF9UT19TVEFSVF9WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GaW5pc2ggVG8gRmluaXNoPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5GaW5pc2ggVG8gRmluaXNoPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0ZJTklTSF9UT19GSU5JU0gKLQkgKiBAbW9kZWwgbmFtZT0iZmluaXNoVG9GaW5pc2giCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklOSVNIX1RPX0ZJTklTSF9WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGFydCBUbyBTdGFydDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U3RhcnQgVG8gU3RhcnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU1RBUlRfVE9fU1RBUlQKLQkgKiBAbW9kZWwgbmFtZT0ic3RhcnRUb1N0YXJ0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1RPX1NUQVJUX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0YXJ0IFRvIEZpbmlzaDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U3RhcnQgVG8gRmluaXNoPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUQVJUX1RPX0ZJTklTSAotCSAqIEBtb2RlbCBuYW1lPSJzdGFydFRvRmluaXNoIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1RPX0ZJTklTSF9WQUxVRSA9IDM7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBXb3JrT3JkZXJUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFdvcmtPcmRlclR5cGVbXSB7Ci0JCQlGSU5JU0hfVE9fU1RBUlQsCi0JCQlGSU5JU0hfVE9fRklOSVNILAotCQkJU1RBUlRfVE9fU1RBUlQsCi0JCQlTVEFSVF9UT19GSU5JU0gsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8V29ya09yZGVyVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Xb3JrIE9yZGVyIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXJUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJV29ya09yZGVyVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPldvcmsgT3JkZXIgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtPcmRlclR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlXb3JrT3JkZXJUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Xb3JrIE9yZGVyIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXJUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBGSU5JU0hfVE9fU1RBUlRfVkFMVUU6IHJldHVybiBGSU5JU0hfVE9fU1RBUlQ7Ci0JCQljYXNlIEZJTklTSF9UT19GSU5JU0hfVkFMVUU6IHJldHVybiBGSU5JU0hfVE9fRklOSVNIOwotCQkJY2FzZSBTVEFSVF9UT19TVEFSVF9WQUxVRTogcmV0dXJuIFNUQVJUX1RPX1NUQVJUOwotCQkJY2FzZSBTVEFSVF9UT19GSU5JU0hfVkFMVUU6IHJldHVybiBTVEFSVF9UT19GSU5JU0g7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdvcmtPcmRlclR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7Ci0JICByZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgewotCSAgcmV0dXJuIGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrUHJvZHVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGRjYmZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrUHJvZHVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya1Byb2R1Y3QuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4KLSAqIEEgd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRFc3RpbWF0ZSA8ZW0+RXN0aW1hdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0UmVwb3J0IDxlbT5SZXBvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldFRlbXBsYXRlIDxlbT5UZW1wbGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0VG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3QoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtQcm9kdWN0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3QgZXh0ZW5kcyBDb250ZW50RWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0X0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Fc3RpbWF0ZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFc3RpbWF0ZScgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0RXN0aW1hdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zJyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVwb3J0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwb3J0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9SZXBvcnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVwb3J0JyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRSZXBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZW1wbGF0ZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRlbXBsYXRlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUZW1wbGF0ZScgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0VGVtcGxhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9yKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Rvb2xNZW50b3InIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFRvb2xNZW50b3IoKTsKLQotfSAvLyBXb3JrUHJvZHVjdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDY0YzAwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrUHJvZHVjdERlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBXb3JrIFByb2R1Y3QuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRJbXBhY3RPZk5vdEhhdmluZyA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRSZWFzb25zRm9yTm90TmVlZGluZyA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV29ya1Byb2R1Y3REZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW1wYWN0T2ZOb3RIYXZpbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0ltcGFjdE9mTm90SGF2aW5nKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ltcGFjdE9mTm90SGF2aW5nJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEltcGFjdE9mTm90SGF2aW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldEltcGFjdE9mTm90SGF2aW5nIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEltcGFjdE9mTm90SGF2aW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbXBhY3RPZk5vdEhhdmluZyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHVycG9zZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQdXJwb3NlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFB1cnBvc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHVycG9zZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlYXNvbnNGb3JOb3ROZWVkaW5nJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nIDxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWFzb25zRm9yTm90TmVlZGluZyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YTNkZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya1Byb2R1Y3REZXNjcmlwdG9yLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFdvcmsgUHJvZHVjdCBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0UmVzcG9uc2libGVSb2xlIDxlbT5SZXNwb25zaWJsZSBSb2xlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRFeHRlcm5hbElucHV0VG8gPGVtPkV4dGVybmFsIElucHV0IFRvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0ZWRCeSA8ZW0+SW1wYWN0ZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RzIDxlbT5JbXBhY3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXRUbyA8ZW0+TWFuZGF0b3J5IElucHV0IFRvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0T3B0aW9uYWxJbnB1dFRvIDxlbT5PcHRpb25hbCBJbnB1dCBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldE91dHB1dEZyb20gPGVtPk91dHB1dCBGcm9tPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0RGVsaXZlcmFibGVQYXJ0cyA8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUVudHJ5U3RhdGUgPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFeGl0U3RhdGUgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrUHJvZHVjdERlc2NyaXB0b3InIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdERlc2NyaXB0b3IgZXh0ZW5kcyBEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdvcmtQcm9kdWN0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmtQcm9kdWN0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFdvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29ya1Byb2R1Y3QoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIFJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc3BvbnNpYmxlIFJvbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzcG9uc2libGUgUm9sZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzcG9uc2libGVSb2xlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1Jlc3BvbnNpYmxlUm9sZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXNwb25zaWJsZVJvbGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UmVzcG9uc2libGVSb2xlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0UmVzcG9uc2libGVSb2xlIDxlbT5SZXNwb25zaWJsZSBSb2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNwb25zaWJsZSBSb2xlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXNwb25zaWJsZVJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc3BvbnNpYmxlUm9sZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDozMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJbnB1dCBUbzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgSW5wdXQgVG88L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBJbnB1dCBUbzwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUbygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeHRlcm5hbElucHV0VG8nIGdyb3VwPScjZ3JvdXA6MzMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEV4dGVybmFsSW5wdXRUbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW1wYWN0ZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkltcGFjdGVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW1wYWN0ZWQgQnk8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RlZEJ5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ltcGFjdGVkQnknIGdyb3VwPScjZ3JvdXA6MzMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEltcGFjdGVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkltcGFjdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkltcGFjdHM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBhY3RzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbXBhY3RzJyBncm91cD0nI2dyb3VwOjMzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRJbXBhY3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQgVG88L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dCBUbzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dCBUbzwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0VG8oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWFuZGF0b3J5SW5wdXRUbycgZ3JvdXA9JyNncm91cDozMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0TWFuZGF0b3J5SW5wdXRUbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3B0aW9uYWwgSW5wdXQgVG88L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9wdGlvbmFsIElucHV0IFRvPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW9uYWwgSW5wdXQgVG88L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG8oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3B0aW9uYWxJbnB1dFRvJyBncm91cD0nI2dyb3VwOjMzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRPcHRpb25hbElucHV0VG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dHB1dCBGcm9tPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PdXRwdXQgRnJvbTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dHB1dCBGcm9tPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdXRwdXRGcm9tJyBncm91cD0nI2dyb3VwOjMzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRPdXRwdXRGcm9tKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWxpdmVyYWJsZSBQYXJ0czwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVsaXZlcmFibGVQYXJ0cycgZ3JvdXA9JyNncm91cDozMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0RGVsaXZlcmFibGVQYXJ0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICAKLQkgKiBGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3Rpdml0eUVudHJ5U3RhdGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nYWN0aXZpdHlFbnRyeVN0YXRlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFjdGl2aXR5RW50cnlTdGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RW50cnlTdGF0ZSA8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdGl2aXR5RW50cnlTdGF0ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuCi0JICogRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3Rpdml0eUV4aXRTdGF0ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2FjdGl2aXR5RXhpdFN0YXRlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFjdGl2aXR5RXhpdFN0YXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFeGl0U3RhdGUgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3Rpdml0eUV4aXRTdGF0ZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrUHJvZHVjdFR5cGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrUHJvZHVjdFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA5ZGJhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3RUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtQcm9kdWN0VHlwZS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICJDbGFzcyBEaWFncmFtIiwgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICJTcGVjaWZpY2F0aW9uIiwgd2hpY2ggY2F0ZWdvcml6ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb25zIHRoYXQgZGVmaW5lIGEgc3lzdGVtIHdpdGggYSB3ZWxsLWRlZmluZWQgc3lzdGVtIGJvdW5kYXJ5LCBzdWNoIGFzIHVzZSBjYXNlIG9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb24uICBBIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBjYW4gYmUgY2F0ZWdvcml6ZWQgYXMgYSBTcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgRGlhZ3JhbSBXb3JrIFByb2R1Y3QgVHlwZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZSNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0VHlwZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV29ya1Byb2R1Y3RUeXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3RUeXBlIGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RUeXBlX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV29ya1Byb2R1Y3QnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFdvcmtQcm9kdWN0KCk7Ci0KLX0gLy8gV29ya1Byb2R1Y3RUeXBlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FjdGl2aXR5RGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMWY3OTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsI2dldEhvd1RvU3RhZmYgPGVtPkhvdyBUbyBTdGFmZjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgQWN0aXZpdHlEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdGVybmF0aXZlcygpIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxURVJOQVRJVkVTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdGVybmF0aXZlcygpIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhbHRlcm5hdGl2ZXMgPSBBTFRFUk5BVElWRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SG93VG9TdGFmZigpIDxlbT5Ib3cgVG8gU3RhZmY8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhvd1RvU3RhZmYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhPV19UT19TVEFGRl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIb3dUb1N0YWZmKCkgPGVtPkhvdyBUbyBTdGFmZjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SG93VG9TdGFmZigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBob3dUb1N0YWZmID0gSE9XX1RPX1NUQUZGX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1cnBvc2UoKSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVSUE9TRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVycG9zZSA9IFBVUlBPU0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWx0ZXJuYXRpdmVzKCkgewotCQlyZXR1cm4gYWx0ZXJuYXRpdmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgbmV3QWx0ZXJuYXRpdmVzKSB7Ci0JCVN0cmluZyBvbGRBbHRlcm5hdGl2ZXMgPSBhbHRlcm5hdGl2ZXM7Ci0JCWFsdGVybmF0aXZlcyA9IG5ld0FsdGVybmF0aXZlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTLCBvbGRBbHRlcm5hdGl2ZXMsIGFsdGVybmF0aXZlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG93VG9TdGFmZigpIHsKLQkJcmV0dXJuIGhvd1RvU3RhZmY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG93VG9TdGFmZihTdHJpbmcgbmV3SG93VG9TdGFmZikgewotCQlTdHJpbmcgb2xkSG93VG9TdGFmZiA9IGhvd1RvU3RhZmY7Ci0JCWhvd1RvU3RhZmYgPSBuZXdIb3dUb1N0YWZmOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dfVE9fU1RBRkYsIG9sZEhvd1RvU3RhZmYsIGhvd1RvU3RhZmYpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1cnBvc2UoKSB7Ci0JCXJldHVybiBwdXJwb3NlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1cnBvc2UoU3RyaW5nIG5ld1B1cnBvc2UpIHsKLQkJU3RyaW5nIG9sZFB1cnBvc2UgPSBwdXJwb3NlOwotCQlwdXJwb3NlID0gbmV3UHVycG9zZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRSwgb2xkUHVycG9zZSwgcHVycG9zZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJCXJldHVybiBnZXRBbHRlcm5hdGl2ZXMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGOgotCQkJCXJldHVybiBnZXRIb3dUb1N0YWZmKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQkJcmV0dXJuIGdldFB1cnBvc2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQkJc2V0QWx0ZXJuYXRpdmVzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGOgotCQkJCXNldEhvd1RvU3RhZmYoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXNldFB1cnBvc2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJCXNldEFsdGVybmF0aXZlcyhBTFRFUk5BVElWRVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGOgotCQkJCXNldEhvd1RvU3RhZmYoSE9XX1RPX1NUQUZGX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQkJc2V0UHVycG9zZShQVVJQT1NFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJCXJldHVybiBBTFRFUk5BVElWRVNfRURFRkFVTFQgPT0gbnVsbCA/IGFsdGVybmF0aXZlcyAhPSBudWxsIDogIUFMVEVSTkFUSVZFU19FREVGQVVMVC5lcXVhbHMoYWx0ZXJuYXRpdmVzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGOgotCQkJCXJldHVybiBIT1dfVE9fU1RBRkZfRURFRkFVTFQgPT0gbnVsbCA/IGhvd1RvU3RhZmYgIT0gbnVsbCA6ICFIT1dfVE9fU1RBRkZfRURFRkFVTFQuZXF1YWxzKGhvd1RvU3RhZmYpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXJldHVybiBQVVJQT1NFX0VERUZBVUxUID09IG51bGwgPyBwdXJwb3NlICE9IG51bGwgOiAhUFVSUE9TRV9FREVGQVVMVC5lcXVhbHMocHVycG9zZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhbHRlcm5hdGl2ZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFsdGVybmF0aXZlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaG93VG9TdGFmZjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaG93VG9TdGFmZik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHVycG9zZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHVycG9zZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FjdGl2aXR5RGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQWN0aXZpdHlJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BY3Rpdml0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzOTMxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BY3Rpdml0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFjdGl2aXR5SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2aXR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldEJyZWFrZG93bkVsZW1lbnQgPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRSb2FkbWFwIDxlbT5Sb2FkbWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNpc0lzRW5hY3RhYmxlIDxlbT5JcyBFbmFjdGFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5SW1wbCBleHRlbmRzIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzIEFjdGl2aXR5IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY29uZGl0aW9uKCkgPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVDT05ESVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY29uZGl0aW9uKCkgPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWNvbmRpdGlvbiA9IFBSRUNPTkRJVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Y29uZGl0aW9uKCkgPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU1RDT05ESVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdGNvbmRpdGlvbigpIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBvc3Rjb25kaXRpb24gPSBQT1NUQ09ORElUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAzKCkgPGVtPkdyb3VwMzwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMzsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzRW5hY3RhYmxlKCkgPGVtPklzIEVuYWN0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc0VuYWN0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0VOQUNUQUJMRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0VuYWN0YWJsZSgpIDxlbT5JcyBFbmFjdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNFbmFjdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRW5hY3RhYmxlID0gSVNfRU5BQ1RBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBFbmFjdGFibGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRW5hY3RhYmxlRVNldDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSBWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5VHlwZSgpIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVmFyaWFiaWxpdHlUeXBlIFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQgPSBWYXJpYWJpbGl0eVR5cGUuTkE7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFZhcmlhYmlsaXR5IFR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhcmlhYmlsaXR5VHlwZUVTZXQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVjb25kaXRpb24oU3RyaW5nIG5ld1ByZWNvbmRpdGlvbikgewotCQlTdHJpbmcgb2xkUHJlY29uZGl0aW9uID0gcHJlY29uZGl0aW9uOwotCQlwcmVjb25kaXRpb24gPSBuZXdQcmVjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTiwgb2xkUHJlY29uZGl0aW9uLCBwcmVjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvc3Rjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3Rjb25kaXRpb24oU3RyaW5nIG5ld1Bvc3Rjb25kaXRpb24pIHsKLQkJU3RyaW5nIG9sZFBvc3Rjb25kaXRpb24gPSBwb3N0Y29uZGl0aW9uOwotCQlwb3N0Y29uZGl0aW9uID0gbmV3UG9zdGNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTiwgb2xkUG9zdGNvbmRpdGlvbiwgcG9zdGNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMygpIHsKLQkJaWYgKGdyb3VwMyA9PSBudWxsKSB7Ci0JCQlncm91cDMgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0dST1VQMyk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8QnJlYWtkb3duRWxlbWVudD4gZ2V0QnJlYWtkb3duRWxlbWVudCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMygpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFJvYWRtYXAoKSB7Ci0JCXJldHVybiBnZXRHcm91cDMoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX1JPQURNQVApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNFbmFjdGFibGUoKSB7Ci0JCXJldHVybiBpc0VuYWN0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0VuYWN0YWJsZShib29sZWFuIG5ld0lzRW5hY3RhYmxlKSB7Ci0JCWJvb2xlYW4gb2xkSXNFbmFjdGFibGUgPSBpc0VuYWN0YWJsZTsKLQkJaXNFbmFjdGFibGUgPSBuZXdJc0VuYWN0YWJsZTsKLQkJYm9vbGVhbiBvbGRJc0VuYWN0YWJsZUVTZXQgPSBpc0VuYWN0YWJsZUVTZXQ7Ci0JCWlzRW5hY3RhYmxlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0lTX0VOQUNUQUJMRSwgb2xkSXNFbmFjdGFibGUsIGlzRW5hY3RhYmxlLCAhb2xkSXNFbmFjdGFibGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc0VuYWN0YWJsZSgpIHsKLQkJYm9vbGVhbiBvbGRJc0VuYWN0YWJsZSA9IGlzRW5hY3RhYmxlOwotCQlib29sZWFuIG9sZElzRW5hY3RhYmxlRVNldCA9IGlzRW5hY3RhYmxlRVNldDsKLQkJaXNFbmFjdGFibGUgPSBJU19FTkFDVEFCTEVfRURFRkFVTFQ7Ci0JCWlzRW5hY3RhYmxlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0lTX0VOQUNUQUJMRSwgb2xkSXNFbmFjdGFibGUsIElTX0VOQUNUQUJMRV9FREVGQVVMVCwgb2xkSXNFbmFjdGFibGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc0VuYWN0YWJsZSgpIHsKLQkJcmV0dXJuIGlzRW5hY3RhYmxlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoU3RyaW5nIG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpIHsKLQkJU3RyaW5nIG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCwgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUgbmV3VmFyaWFiaWxpdHlUeXBlKSB7Ci0JCVZhcmlhYmlsaXR5VHlwZSBvbGRWYXJpYWJpbGl0eVR5cGUgPSB2YXJpYWJpbGl0eVR5cGU7Ci0JCXZhcmlhYmlsaXR5VHlwZSA9IG5ld1ZhcmlhYmlsaXR5VHlwZSA9PSBudWxsID8gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCA6IG5ld1ZhcmlhYmlsaXR5VHlwZTsKLQkJYm9vbGVhbiBvbGRWYXJpYWJpbGl0eVR5cGVFU2V0ID0gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQkJdmFyaWFiaWxpdHlUeXBlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEUsIG9sZFZhcmlhYmlsaXR5VHlwZSwgdmFyaWFiaWxpdHlUeXBlLCAhb2xkVmFyaWFiaWxpdHlUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlWYXJpYWJpbGl0eVR5cGUgb2xkVmFyaWFiaWxpdHlUeXBlID0gdmFyaWFiaWxpdHlUeXBlOwotCQlib29sZWFuIG9sZFZhcmlhYmlsaXR5VHlwZUVTZXQgPSB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCQl2YXJpYWJpbGl0eVR5cGUgPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCQl2YXJpYWJpbGl0eVR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRSwgb2xkVmFyaWFiaWxpdHlUeXBlLCBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxULCBvbGRWYXJpYWJpbGl0eVR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRWYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fR1JPVVAzOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRCcmVha2Rvd25FbGVtZW50KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIGdldFByZWNvbmRpdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBnZXRQb3N0Y29uZGl0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0dST1VQMzoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDMoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMygpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRCcmVha2Rvd25FbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JPQURNQVA6Ci0JCQkJcmV0dXJuIGdldFJvYWRtYXAoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOgotCQkJCXJldHVybiBpc0lzRW5hY3RhYmxlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQkJc2V0UHJlY29uZGl0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTjoKLQkJCQlzZXRQb3N0Y29uZGl0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fR1JPVVAzOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDMoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UOgotCQkJCWdldEJyZWFrZG93bkVsZW1lbnQoKS5jbGVhcigpOwotCQkJCWdldEJyZWFrZG93bkVsZW1lbnQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnQ+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JPQURNQVA6Ci0JCQkJZ2V0Um9hZG1hcCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Um9hZG1hcCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19JU19FTkFDVEFCTEU6Ci0JCQkJc2V0SXNFbmFjdGFibGUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXNldFZhcmlhYmlsaXR5VHlwZSgoVmFyaWFiaWxpdHlUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQkJc2V0UHJlY29uZGl0aW9uKFBSRUNPTkRJVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJCXNldFBvc3Rjb25kaXRpb24oUE9TVENPTkRJVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19HUk9VUDM6Ci0JCQkJZ2V0R3JvdXAzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UOgotCQkJCWdldEJyZWFrZG93bkVsZW1lbnQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUk9BRE1BUDoKLQkJCQlnZXRSb2FkbWFwKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0lTX0VOQUNUQUJMRToKLQkJCQl1bnNldElzRW5hY3RhYmxlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXVuc2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjoKLQkJCQlyZXR1cm4gUFJFQ09ORElUSU9OX0VERUZBVUxUID09IG51bGwgPyBwcmVjb25kaXRpb24gIT0gbnVsbCA6ICFQUkVDT05ESVRJT05fRURFRkFVTFQuZXF1YWxzKHByZWNvbmRpdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIFBPU1RDT05ESVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHBvc3Rjb25kaXRpb24gIT0gbnVsbCA6ICFQT1NUQ09ORElUSU9OX0VERUZBVUxULmVxdWFscyhwb3N0Y29uZGl0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fR1JPVVAzOgotCQkJCXJldHVybiBncm91cDMgIT0gbnVsbCAmJiAhZ3JvdXAzLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuICFnZXRCcmVha2Rvd25FbGVtZW50KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19ST0FETUFQOgotCQkJCXJldHVybiAhZ2V0Um9hZG1hcCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOgotCQkJCXJldHVybiBpc1NldElzRW5hY3RhYmxlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIFZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgIT0gbnVsbCA6ICFWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQlyZXR1cm4gaXNTZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHByZWNvbmRpdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlY29uZGl0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwb3N0Y29uZGl0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwb3N0Y29uZGl0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBncm91cDM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNFbmFjdGFibGU6ICIpOwotCQlpZiAoaXNFbmFjdGFibGVFU2V0KSByZXN1bHQuYXBwZW5kKGlzRW5hY3RhYmxlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFyaWFiaWxpdHlUeXBlOiAiKTsKLQkJaWYgKHZhcmlhYmlsaXR5VHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQodmFyaWFiaWxpdHlUeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FjdGl2aXR5SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMTI5MGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbCNpc0lzUHJpbWFyeUV4dGVuc2lvbiA8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwgZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzUHJpbWFyeUV4dGVuc2lvbigpIDxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1ByaW1hcnlFeHRlbnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19QUklNQVJZX0VYVEVOU0lPTl9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1ByaW1hcnlFeHRlbnNpb24oKSA8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ByaW1hcnlFeHRlbnNpb24gPSBJU19QUklNQVJZX0VYVEVOU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgUHJpbWFyeSBFeHRlbnNpb24gYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUHJpbWFyeUV4dGVuc2lvbkVTZXQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzUHJpbWFyeUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIGlzUHJpbWFyeUV4dGVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1ByaW1hcnlFeHRlbnNpb24oYm9vbGVhbiBuZXdJc1ByaW1hcnlFeHRlbnNpb24pIHsKLQkJYm9vbGVhbiBvbGRJc1ByaW1hcnlFeHRlbnNpb24gPSBpc1ByaW1hcnlFeHRlbnNpb247Ci0JCWlzUHJpbWFyeUV4dGVuc2lvbiA9IG5ld0lzUHJpbWFyeUV4dGVuc2lvbjsKLQkJYm9vbGVhbiBvbGRJc1ByaW1hcnlFeHRlbnNpb25FU2V0ID0gaXNQcmltYXJ5RXh0ZW5zaW9uRVNldDsKLQkJaXNQcmltYXJ5RXh0ZW5zaW9uRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OLCBvbGRJc1ByaW1hcnlFeHRlbnNpb24sIGlzUHJpbWFyeUV4dGVuc2lvbiwgIW9sZElzUHJpbWFyeUV4dGVuc2lvbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzUHJpbWFyeUV4dGVuc2lvbigpIHsKLQkJYm9vbGVhbiBvbGRJc1ByaW1hcnlFeHRlbnNpb24gPSBpc1ByaW1hcnlFeHRlbnNpb247Ci0JCWJvb2xlYW4gb2xkSXNQcmltYXJ5RXh0ZW5zaW9uRVNldCA9IGlzUHJpbWFyeUV4dGVuc2lvbkVTZXQ7Ci0JCWlzUHJpbWFyeUV4dGVuc2lvbiA9IElTX1BSSU1BUllfRVhURU5TSU9OX0VERUZBVUxUOwotCQlpc1ByaW1hcnlFeHRlbnNpb25FU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19fSVNfUFJJTUFSWV9FWFRFTlNJT04sIG9sZElzUHJpbWFyeUV4dGVuc2lvbiwgSVNfUFJJTUFSWV9FWFRFTlNJT05fRURFRkFVTFQsIG9sZElzUHJpbWFyeUV4dGVuc2lvbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzUHJpbWFyeUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIGlzUHJpbWFyeUV4dGVuc2lvbkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTjoKLQkJCQlyZXR1cm4gaXNJc1ByaW1hcnlFeHRlbnNpb24oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19fSVNfUFJJTUFSWV9FWFRFTlNJT046Ci0JCQkJc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OOgotCQkJCXVuc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OOgotCQkJCXJldHVybiBpc1NldElzUHJpbWFyeUV4dGVuc2lvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaXNQcmltYXJ5RXh0ZW5zaW9uOiAiKTsKLQkJaWYgKGlzUHJpbWFyeUV4dGVuc2lvbkVTZXQpIHJlc3VsdC5hcHBlbmQoaXNQcmltYXJ5RXh0ZW5zaW9uKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FydGlmYWN0RGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYmE5YzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFydGlmYWN0RGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFydGlmYWN0IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsI2dldEJyaWVmT3V0bGluZSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbCNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwjZ2V0UmVwcmVzZW50YXRpb24gPGVtPlJlcHJlc2VudGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsI2dldE5vdGF0aW9uIDxlbT5Ob3RhdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFydGlmYWN0RGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBBcnRpZmFjdERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnJpZWZPdXRsaW5lKCkgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJyaWVmT3V0bGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJRUZfT1VUTElORV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmllZk91dGxpbmUoKSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QnJpZWZPdXRsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJyaWVmT3V0bGluZSA9IEJSSUVGX09VVExJTkVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQUkVTRU5UQVRJT05fT1BUSU9OU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKSA8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlcHJlc2VudGF0aW9uT3B0aW9ucyA9IFJFUFJFU0VOVEFUSU9OX09QVElPTlNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwcmVzZW50YXRpb24oKSA8ZW0+UmVwcmVzZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBSRVNFTlRBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXByZXNlbnRhdGlvbigpIDxlbT5SZXByZXNlbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVwcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVwcmVzZW50YXRpb24gPSBSRVBSRVNFTlRBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb3RhdGlvbigpIDxlbT5Ob3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vdGF0aW9uKCkgPGVtPk5vdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb3RhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBub3RhdGlvbiA9IE5PVEFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFydGlmYWN0RGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVF9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJyaWVmT3V0bGluZSgpIHsKLQkJcmV0dXJuIGJyaWVmT3V0bGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCcmllZk91dGxpbmUoU3RyaW5nIG5ld0JyaWVmT3V0bGluZSkgewotCQlTdHJpbmcgb2xkQnJpZWZPdXRsaW5lID0gYnJpZWZPdXRsaW5lOwotCQlicmllZk91dGxpbmUgPSBuZXdCcmllZk91dGxpbmU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkUsIG9sZEJyaWVmT3V0bGluZSwgYnJpZWZPdXRsaW5lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKSB7Ci0JCXJldHVybiByZXByZXNlbnRhdGlvbk9wdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKFN0cmluZyBuZXdSZXByZXNlbnRhdGlvbk9wdGlvbnMpIHsKLQkJU3RyaW5nIG9sZFJlcHJlc2VudGF0aW9uT3B0aW9ucyA9IHJlcHJlc2VudGF0aW9uT3B0aW9uczsKLQkJcmVwcmVzZW50YXRpb25PcHRpb25zID0gbmV3UmVwcmVzZW50YXRpb25PcHRpb25zOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TLCBvbGRSZXByZXNlbnRhdGlvbk9wdGlvbnMsIHJlcHJlc2VudGF0aW9uT3B0aW9ucykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVwcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiByZXByZXNlbnRhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXByZXNlbnRhdGlvbihTdHJpbmcgbmV3UmVwcmVzZW50YXRpb24pIHsKLQkJU3RyaW5nIG9sZFJlcHJlc2VudGF0aW9uID0gcmVwcmVzZW50YXRpb247Ci0JCXJlcHJlc2VudGF0aW9uID0gbmV3UmVwcmVzZW50YXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OLCBvbGRSZXByZXNlbnRhdGlvbiwgcmVwcmVzZW50YXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vdGF0aW9uKCkgewotCQlyZXR1cm4gbm90YXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm90YXRpb24oU3RyaW5nIG5ld05vdGF0aW9uKSB7Ci0JCVN0cmluZyBvbGROb3RhdGlvbiA9IG5vdGF0aW9uOwotCQlub3RhdGlvbiA9IG5ld05vdGF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTiwgb2xkTm90YXRpb24sIG5vdGF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FOgotCQkJCXJldHVybiBnZXRCcmllZk91dGxpbmUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OOgotCQkJCXJldHVybiBnZXRSZXByZXNlbnRhdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTjoKLQkJCQlyZXR1cm4gZ2V0Tm90YXRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FOgotCQkJCXNldEJyaWVmT3V0bGluZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlM6Ci0JCQkJc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT046Ci0JCQkJc2V0UmVwcmVzZW50YXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTjoKLQkJCQlzZXROb3RhdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FOgotCQkJCXNldEJyaWVmT3V0bGluZShCUklFRl9PVVRMSU5FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlM6Ci0JCQkJc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKFJFUFJFU0VOVEFUSU9OX09QVElPTlNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT046Ci0JCQkJc2V0UmVwcmVzZW50YXRpb24oUkVQUkVTRU5UQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT046Ci0JCQkJc2V0Tm90YXRpb24oTk9UQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FOgotCQkJCXJldHVybiBCUklFRl9PVVRMSU5FX0VERUZBVUxUID09IG51bGwgPyBicmllZk91dGxpbmUgIT0gbnVsbCA6ICFCUklFRl9PVVRMSU5FX0VERUZBVUxULmVxdWFscyhicmllZk91dGxpbmUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TOgotCQkJCXJldHVybiBSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxUID09IG51bGwgPyByZXByZXNlbnRhdGlvbk9wdGlvbnMgIT0gbnVsbCA6ICFSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxULmVxdWFscyhyZXByZXNlbnRhdGlvbk9wdGlvbnMpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTjoKLQkJCQlyZXR1cm4gUkVQUkVTRU5UQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHJlcHJlc2VudGF0aW9uICE9IG51bGwgOiAhUkVQUkVTRU5UQVRJT05fRURFRkFVTFQuZXF1YWxzKHJlcHJlc2VudGF0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT046Ci0JCQkJcmV0dXJuIE5PVEFUSU9OX0VERUZBVUxUID09IG51bGwgPyBub3RhdGlvbiAhPSBudWxsIDogIU5PVEFUSU9OX0VERUZBVUxULmVxdWFscyhub3RhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChicmllZk91dGxpbmU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGJyaWVmT3V0bGluZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVwcmVzZW50YXRpb25PcHRpb25zOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXByZXNlbnRhdGlvbk9wdGlvbnMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlcHJlc2VudGF0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXByZXNlbnRhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbm90YXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5vdGF0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BcnRpZmFjdEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FydGlmYWN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGRlY2E1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FydGlmYWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXJ0aWZhY3RJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnRpZmFjdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdEltcGwjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXJ0aWZhY3RJbXBsI2dldENvbnRhaW5lZEFydGlmYWN0IDxlbT5Db250YWluZWQgQXJ0aWZhY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEltcGwgZXh0ZW5kcyBXb3JrUHJvZHVjdEltcGwgaW1wbGVtZW50cyBBcnRpZmFjdCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAzKCkgPGVtPkdyb3VwMzwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMzsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBcnRpZmFjdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkFSVElGQUNUOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMygpIHsKLQkJaWYgKGdyb3VwMyA9PSBudWxsKSB7Ci0JCQlncm91cDMgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0dST1VQMyk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8QXJ0aWZhY3Q+IGdldENvbnRhaW5lZEFydGlmYWN0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAzKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1QpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fR1JPVVAzOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q29udGFpbmVkQXJ0aWZhY3QoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0dST1VQMzoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDMoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMygpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVDoKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVkQXJ0aWZhY3QoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fR1JPVVAzOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDMoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVDoKLQkJCQlnZXRDb250YWluZWRBcnRpZmFjdCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udGFpbmVkQXJ0aWZhY3QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEFydGlmYWN0PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fR1JPVVAzOgotCQkJCWdldEdyb3VwMygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1Q6Ci0JCQkJZ2V0Q29udGFpbmVkQXJ0aWZhY3QoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19HUk9VUDM6Ci0JCQkJcmV0dXJuIGdyb3VwMyAhPSBudWxsICYmICFncm91cDMuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1Q6Ci0JCQkJcmV0dXJuICFnZXRDb250YWluZWRBcnRpZmFjdCgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQXJ0aWZhY3RJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzUxNDI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsI2dldFVzYWdlR3VpZGFuY2UgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2FnZUd1aWRhbmNlKCkgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVc2FnZUd1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVU0FHRV9HVUlEQU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2FnZUd1aWRhbmNlKCkgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVc2FnZUd1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVzYWdlR3VpZGFuY2UgPSBVU0FHRV9HVUlEQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVzYWdlR3VpZGFuY2UoKSB7Ci0JCXJldHVybiB1c2FnZUd1aWRhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzYWdlR3VpZGFuY2UoU3RyaW5nIG5ld1VzYWdlR3VpZGFuY2UpIHsKLQkJU3RyaW5nIG9sZFVzYWdlR3VpZGFuY2UgPSB1c2FnZUd1aWRhbmNlOwotCQl1c2FnZUd1aWRhbmNlID0gbmV3VXNhZ2VHdWlkYW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UsIG9sZFVzYWdlR3VpZGFuY2UsIHVzYWdlR3VpZGFuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOgotCQkJCXJldHVybiBnZXRVc2FnZUd1aWRhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U6Ci0JCQkJc2V0VXNhZ2VHdWlkYW5jZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRToKLQkJCQlzZXRVc2FnZUd1aWRhbmNlKFVTQUdFX0dVSURBTkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U6Ci0JCQkJcmV0dXJuIFVTQUdFX0dVSURBTkNFX0VERUZBVUxUID09IG51bGwgPyB1c2FnZUd1aWRhbmNlICE9IG51bGwgOiAhVVNBR0VfR1VJREFOQ0VfRURFRkFVTFQuZXF1YWxzKHVzYWdlR3VpZGFuY2UpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodXNhZ2VHdWlkYW5jZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodXNhZ2VHdWlkYW5jZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9CcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2ZGUwYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9CcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQ4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQnJlYWtkb3duRWxlbWVudEltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRQcmVzZW50ZWRBZnRlciA8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFByZXNlbnRlZEJlZm9yZSA8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRQbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0U3VwZXJBY3Rpdml0eSA8ZW0+U3VwZXIgQWN0aXZpdHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0Q2hlY2tsaXN0IDxlbT5DaGVja2xpc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0Q29uY2VwdCA8ZW0+Q29uY2VwdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRFeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldEd1aWRlbGluZSA8ZW0+R3VpZGVsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFJldXNhYmxlQXNzZXQgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFN1cHBvcnRpbmdNYXRlcmlhbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRXaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2lzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2lzSXNPcHRpb25hbCA8ZW0+SXMgT3B0aW9uYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjaXNJc1BsYW5uZWQgPGVtPklzIFBsYW5uZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50SW1wbCBleHRlbmRzIFByb2Nlc3NFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEJyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50ZWRBZnRlcigpIDxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRlZEFmdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRU5URURfQUZURVJfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlc2VudGVkQWZ0ZXIoKSA8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRBZnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVzZW50ZWRBZnRlciA9IFBSRVNFTlRFRF9BRlRFUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50ZWRCZWZvcmUoKSA8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGVkQmVmb3JlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRU5URURfQkVGT1JFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRlZEJlZm9yZSgpIDxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRCZWZvcmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJlc2VudGVkQmVmb3JlID0gUFJFU0VOVEVEX0JFRk9SRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQbGFubmluZ0RhdGEoKSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFOTklOR19EQVRBX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBsYW5uaW5nRGF0YSgpIDxlbT5QbGFubmluZyBEYXRhPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGxhbm5pbmdEYXRhID0gUExBTk5JTkdfREFUQV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdXBlckFjdGl2aXR5KCkgPGVtPlN1cGVyIEFjdGl2aXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdXBlckFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUl9BQ1RJVklUWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdXBlckFjdGl2aXR5KCkgPGVtPlN1cGVyIEFjdGl2aXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdXBlckFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN1cGVyQWN0aXZpdHkgPSBTVVBFUl9BQ1RJVklUWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMSgpIDxlbT5Hcm91cDE8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAxKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDE7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSA8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgPSBIQVNfTVVMVElQTEVfT0NDVVJSRU5DRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc09wdGlvbmFsKCkgPGVtPklzIE9wdGlvbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzT3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19PUFRJT05BTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc09wdGlvbmFsKCkgPGVtPklzIE9wdGlvbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzT3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzT3B0aW9uYWwgPSBJU19PUFRJT05BTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgT3B0aW9uYWwgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzT3B0aW9uYWxFU2V0OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNQbGFubmVkKCkgPGVtPklzIFBsYW5uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNQbGFubmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfUExBTk5FRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1BsYW5uZWQoKSA8ZW0+SXMgUGxhbm5lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1BsYW5uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUGxhbm5lZCA9IElTX1BMQU5ORURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIFBsYW5uZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUGxhbm5lZEVTZXQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeCA9IFBSRUZJWF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVzZW50ZWRBZnRlcigpIHsKLQkJcmV0dXJuIHByZXNlbnRlZEFmdGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlbnRlZEFmdGVyKFN0cmluZyBuZXdQcmVzZW50ZWRBZnRlcikgewotCQlTdHJpbmcgb2xkUHJlc2VudGVkQWZ0ZXIgPSBwcmVzZW50ZWRBZnRlcjsKLQkJcHJlc2VudGVkQWZ0ZXIgPSBuZXdQcmVzZW50ZWRBZnRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSLCBvbGRQcmVzZW50ZWRBZnRlciwgcHJlc2VudGVkQWZ0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZXNlbnRlZEJlZm9yZSgpIHsKLQkJcmV0dXJuIHByZXNlbnRlZEJlZm9yZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZW50ZWRCZWZvcmUoU3RyaW5nIG5ld1ByZXNlbnRlZEJlZm9yZSkgewotCQlTdHJpbmcgb2xkUHJlc2VudGVkQmVmb3JlID0gcHJlc2VudGVkQmVmb3JlOwotCQlwcmVzZW50ZWRCZWZvcmUgPSBuZXdQcmVzZW50ZWRCZWZvcmU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkUsIG9sZFByZXNlbnRlZEJlZm9yZSwgcHJlc2VudGVkQmVmb3JlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbGFubmluZ0RhdGEoKSB7Ci0JCXJldHVybiBwbGFubmluZ0RhdGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGxhbm5pbmdEYXRhKFN0cmluZyBuZXdQbGFubmluZ0RhdGEpIHsKLQkJU3RyaW5nIG9sZFBsYW5uaW5nRGF0YSA9IHBsYW5uaW5nRGF0YTsKLQkJcGxhbm5pbmdEYXRhID0gbmV3UGxhbm5pbmdEYXRhOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBLCBvbGRQbGFubmluZ0RhdGEsIHBsYW5uaW5nRGF0YSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3VwZXJBY3Rpdml0eSgpIHsKLQkJcmV0dXJuIHN1cGVyQWN0aXZpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3VwZXJBY3Rpdml0eShTdHJpbmcgbmV3U3VwZXJBY3Rpdml0eSkgewotCQlTdHJpbmcgb2xkU3VwZXJBY3Rpdml0eSA9IHN1cGVyQWN0aXZpdHk7Ci0JCXN1cGVyQWN0aXZpdHkgPSBuZXdTdXBlckFjdGl2aXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWSwgb2xkU3VwZXJBY3Rpdml0eSwgc3VwZXJBY3Rpdml0eSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMSgpIHsKLQkJaWYgKGdyb3VwMSA9PSBudWxsKSB7Ci0JCQlncm91cDEgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMSk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRDaGVja2xpc3QoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0Q29uY2VwdCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMSgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0RXhhbXBsZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMSgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0R3VpZGVsaW5lKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFJldXNhYmxlQXNzZXQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUwpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFdoaXRlcGFwZXIoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpIHsKLQkJcmV0dXJuIGhhc011bHRpcGxlT2NjdXJyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcyhib29sZWFuIG5ld0hhc011bHRpcGxlT2NjdXJyZW5jZXMpIHsKLQkJYm9vbGVhbiBvbGRIYXNNdWx0aXBsZU9jY3VycmVuY2VzID0gaGFzTXVsdGlwbGVPY2N1cnJlbmNlczsKLQkJaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA9IG5ld0hhc011bHRpcGxlT2NjdXJyZW5jZXM7Ci0JCWJvb2xlYW4gb2xkSGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQgPSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzRVNldDsKLQkJaGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMsIG9sZEhhc011bHRpcGxlT2NjdXJyZW5jZXMsIGhhc011bHRpcGxlT2NjdXJyZW5jZXMsICFvbGRIYXNNdWx0aXBsZU9jY3VycmVuY2VzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpIHsKLQkJYm9vbGVhbiBvbGRIYXNNdWx0aXBsZU9jY3VycmVuY2VzID0gaGFzTXVsdGlwbGVPY2N1cnJlbmNlczsKLQkJYm9vbGVhbiBvbGRIYXNNdWx0aXBsZU9jY3VycmVuY2VzRVNldCA9IGhhc011bHRpcGxlT2NjdXJyZW5jZXNFU2V0OwotCQloYXNNdWx0aXBsZU9jY3VycmVuY2VzID0gSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTX0VERUZBVUxUOwotCQloYXNNdWx0aXBsZU9jY3VycmVuY2VzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywgb2xkSGFzTXVsdGlwbGVPY2N1cnJlbmNlcywgSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTX0VERUZBVUxULCBvbGRIYXNNdWx0aXBsZU9jY3VycmVuY2VzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpIHsKLQkJcmV0dXJuIGhhc011bHRpcGxlT2NjdXJyZW5jZXNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNPcHRpb25hbCgpIHsKLQkJcmV0dXJuIGlzT3B0aW9uYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNPcHRpb25hbChib29sZWFuIG5ld0lzT3B0aW9uYWwpIHsKLQkJYm9vbGVhbiBvbGRJc09wdGlvbmFsID0gaXNPcHRpb25hbDsKLQkJaXNPcHRpb25hbCA9IG5ld0lzT3B0aW9uYWw7Ci0JCWJvb2xlYW4gb2xkSXNPcHRpb25hbEVTZXQgPSBpc09wdGlvbmFsRVNldDsKLQkJaXNPcHRpb25hbEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTCwgb2xkSXNPcHRpb25hbCwgaXNPcHRpb25hbCwgIW9sZElzT3B0aW9uYWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc09wdGlvbmFsKCkgewotCQlib29sZWFuIG9sZElzT3B0aW9uYWwgPSBpc09wdGlvbmFsOwotCQlib29sZWFuIG9sZElzT3B0aW9uYWxFU2V0ID0gaXNPcHRpb25hbEVTZXQ7Ci0JCWlzT3B0aW9uYWwgPSBJU19PUFRJT05BTF9FREVGQVVMVDsKLQkJaXNPcHRpb25hbEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTCwgb2xkSXNPcHRpb25hbCwgSVNfT1BUSU9OQUxfRURFRkFVTFQsIG9sZElzT3B0aW9uYWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc09wdGlvbmFsKCkgewotCQlyZXR1cm4gaXNPcHRpb25hbEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc1BsYW5uZWQoKSB7Ci0JCXJldHVybiBpc1BsYW5uZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNQbGFubmVkKGJvb2xlYW4gbmV3SXNQbGFubmVkKSB7Ci0JCWJvb2xlYW4gb2xkSXNQbGFubmVkID0gaXNQbGFubmVkOwotCQlpc1BsYW5uZWQgPSBuZXdJc1BsYW5uZWQ7Ci0JCWJvb2xlYW4gb2xkSXNQbGFubmVkRVNldCA9IGlzUGxhbm5lZEVTZXQ7Ci0JCWlzUGxhbm5lZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVELCBvbGRJc1BsYW5uZWQsIGlzUGxhbm5lZCwgIW9sZElzUGxhbm5lZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzUGxhbm5lZCgpIHsKLQkJYm9vbGVhbiBvbGRJc1BsYW5uZWQgPSBpc1BsYW5uZWQ7Ci0JCWJvb2xlYW4gb2xkSXNQbGFubmVkRVNldCA9IGlzUGxhbm5lZEVTZXQ7Ci0JCWlzUGxhbm5lZCA9IElTX1BMQU5ORURfRURFRkFVTFQ7Ci0JCWlzUGxhbm5lZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVELCBvbGRJc1BsYW5uZWQsIElTX1BMQU5ORURfRURFRkFVTFQsIG9sZElzUGxhbm5lZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzUGxhbm5lZCgpIHsKLQkJcmV0dXJuIGlzUGxhbm5lZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiBwcmVmaXg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBuZXdQcmVmaXgpIHsKLQkJU3RyaW5nIG9sZFByZWZpeCA9IHByZWZpeDsKLQkJcHJlZml4ID0gbmV3UHJlZml4OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVgsIG9sZFByZWZpeCwgcHJlZml4KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDE6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDEoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjoKLQkJCQlyZXR1cm4gZ2V0UHJlc2VudGVkQWZ0ZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRToKLQkJCQlyZXR1cm4gZ2V0UHJlc2VudGVkQmVmb3JlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE6Ci0JCQkJcmV0dXJuIGdldFBsYW5uaW5nRGF0YSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWToKLQkJCQlyZXR1cm4gZ2V0U3VwZXJBY3Rpdml0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDE6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAxKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDEoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1Q6Ci0JCQkJcmV0dXJuIGdldENoZWNrbGlzdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUOgotCQkJCXJldHVybiBnZXRDb25jZXB0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEU6Ci0JCQkJcmV0dXJuIGdldEV4YW1wbGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FOgotCQkJCXJldHVybiBnZXRHdWlkZWxpbmUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ6Ci0JCQkJcmV0dXJuIGdldFJldXNhYmxlQXNzZXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDoKLQkJCQlyZXR1cm4gZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVI6Ci0JCQkJcmV0dXJuIGdldFdoaXRlcGFwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOgotCQkJCXJldHVybiBpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOgotCQkJCXJldHVybiBpc0lzT3B0aW9uYWwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ6Ci0JCQkJcmV0dXJuIGlzSXNQbGFubmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg6Ci0JCQkJcmV0dXJuIGdldFByZWZpeCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI6Ci0JCQkJc2V0UHJlc2VudGVkQWZ0ZXIoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOgotCQkJCXNldFByZXNlbnRlZEJlZm9yZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE6Ci0JCQkJc2V0UGxhbm5pbmdEYXRhKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFk6Ci0JCQkJc2V0U3VwZXJBY3Rpdml0eSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMToKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1Q6Ci0JCQkJZ2V0Q2hlY2tsaXN0KCkuY2xlYXIoKTsKLQkJCQlnZXRDaGVja2xpc3QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVDoKLQkJCQlnZXRDb25jZXB0KCkuY2xlYXIoKTsKLQkJCQlnZXRDb25jZXB0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEU6Ci0JCQkJZ2V0RXhhbXBsZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RXhhbXBsZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkU6Ci0JCQkJZ2V0R3VpZGVsaW5lKCkuY2xlYXIoKTsKLQkJCQlnZXRHdWlkZWxpbmUoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ6Ci0JCQkJZ2V0UmV1c2FibGVBc3NldCgpLmNsZWFyKCk7Ci0JCQkJZ2V0UmV1c2FibGVBc3NldCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOgotCQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLmNsZWFyKCk7Ci0JCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVI6Ci0JCQkJZ2V0V2hpdGVwYXBlcigpLmNsZWFyKCk7Ci0JCQkJZ2V0V2hpdGVwYXBlcigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM6Ci0JCQkJc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOgotCQkJCXNldElzT3B0aW9uYWwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOgotCQkJCXNldElzUGxhbm5lZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDoKLQkJCQlzZXRQcmVmaXgoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOgotCQkJCXNldFByZXNlbnRlZEFmdGVyKFBSRVNFTlRFRF9BRlRFUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOgotCQkJCXNldFByZXNlbnRlZEJlZm9yZShQUkVTRU5URURfQkVGT1JFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE6Ci0JCQkJc2V0UGxhbm5pbmdEYXRhKFBMQU5OSU5HX0RBVEFfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFk6Ci0JCQkJc2V0U3VwZXJBY3Rpdml0eShTVVBFUl9BQ1RJVklUWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDE6Ci0JCQkJZ2V0R3JvdXAxKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVDoKLQkJCQlnZXRDaGVja2xpc3QoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVDoKLQkJCQlnZXRDb25jZXB0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEU6Ci0JCQkJZ2V0RXhhbXBsZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkU6Ci0JCQkJZ2V0R3VpZGVsaW5lKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOgotCQkJCWdldFJldXNhYmxlQXNzZXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDoKLQkJCQlnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fV0hJVEVQQVBFUjoKLQkJCQlnZXRXaGl0ZXBhcGVyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzoKLQkJCQl1bnNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOgotCQkJCXVuc2V0SXNPcHRpb25hbCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDoKLQkJCQl1bnNldElzUGxhbm5lZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOgotCQkJCXNldFByZWZpeChQUkVGSVhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI6Ci0JCQkJcmV0dXJuIFBSRVNFTlRFRF9BRlRFUl9FREVGQVVMVCA9PSBudWxsID8gcHJlc2VudGVkQWZ0ZXIgIT0gbnVsbCA6ICFQUkVTRU5URURfQUZURVJfRURFRkFVTFQuZXF1YWxzKHByZXNlbnRlZEFmdGVyKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRToKLQkJCQlyZXR1cm4gUFJFU0VOVEVEX0JFRk9SRV9FREVGQVVMVCA9PSBudWxsID8gcHJlc2VudGVkQmVmb3JlICE9IG51bGwgOiAhUFJFU0VOVEVEX0JFRk9SRV9FREVGQVVMVC5lcXVhbHMocHJlc2VudGVkQmVmb3JlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQToKLQkJCQlyZXR1cm4gUExBTk5JTkdfREFUQV9FREVGQVVMVCA9PSBudWxsID8gcGxhbm5pbmdEYXRhICE9IG51bGwgOiAhUExBTk5JTkdfREFUQV9FREVGQVVMVC5lcXVhbHMocGxhbm5pbmdEYXRhKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFk6Ci0JCQkJcmV0dXJuIFNVUEVSX0FDVElWSVRZX0VERUZBVUxUID09IG51bGwgPyBzdXBlckFjdGl2aXR5ICE9IG51bGwgOiAhU1VQRVJfQUNUSVZJVFlfRURFRkFVTFQuZXF1YWxzKHN1cGVyQWN0aXZpdHkpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDE6Ci0JCQkJcmV0dXJuIGdyb3VwMSAhPSBudWxsICYmICFncm91cDEuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1Q6Ci0JCQkJcmV0dXJuICFnZXRDaGVja2xpc3QoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFQ6Ci0JCQkJcmV0dXJuICFnZXRDb25jZXB0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFOgotCQkJCXJldHVybiAhZ2V0RXhhbXBsZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FOgotCQkJCXJldHVybiAhZ2V0R3VpZGVsaW5lKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDoKLQkJCQlyZXR1cm4gIWdldFJldXNhYmxlQXNzZXQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQkJcmV0dXJuICFnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVI6Ci0JCQkJcmV0dXJuICFnZXRXaGl0ZXBhcGVyKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM6Ci0JCQkJcmV0dXJuIGlzU2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDoKLQkJCQlyZXR1cm4gaXNTZXRJc09wdGlvbmFsKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ6Ci0JCQkJcmV0dXJuIGlzU2V0SXNQbGFubmVkKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDoKLQkJCQlyZXR1cm4gUFJFRklYX0VERUZBVUxUID09IG51bGwgPyBwcmVmaXggIT0gbnVsbCA6ICFQUkVGSVhfRURFRkFVTFQuZXF1YWxzKHByZWZpeCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwcmVzZW50ZWRBZnRlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlc2VudGVkQWZ0ZXIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByZXNlbnRlZEJlZm9yZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlc2VudGVkQmVmb3JlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwbGFubmluZ0RhdGE6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBsYW5uaW5nRGF0YSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3VwZXJBY3Rpdml0eTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3VwZXJBY3Rpdml0eSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ3JvdXAxOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDEpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGhhc011bHRpcGxlT2NjdXJyZW5jZXM6ICIpOwotCQlpZiAoaGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQpIHJlc3VsdC5hcHBlbmQoaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzT3B0aW9uYWw6ICIpOwotCQlpZiAoaXNPcHRpb25hbEVTZXQpIHJlc3VsdC5hcHBlbmQoaXNPcHRpb25hbCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzUGxhbm5lZDogIik7Ci0JCWlmIChpc1BsYW5uZWRFU2V0KSByZXN1bHQuYXBwZW5kKGlzUGxhbm5lZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByZWZpeDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlZml4KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQnJlYWtkb3duRWxlbWVudEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9DYXBhYmlsaXR5UGF0dGVybkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NhcGFiaWxpdHlQYXR0ZXJuSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmNiZTk5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NhcGFiaWxpdHlQYXR0ZXJuSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDYXBhYmlsaXR5UGF0dGVybkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2FwYWJpbGl0eVBhdHRlcm5JbXBsIGV4dGVuZHMgUHJvY2Vzc0ltcGwgaW1wbGVtZW50cyBDYXBhYmlsaXR5UGF0dGVybiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENhcGFiaWxpdHlQYXR0ZXJuSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ0FQQUJJTElUWV9QQVRURVJOOwotCX0KLQotfSAvL0NhcGFiaWxpdHlQYXR0ZXJuSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NoZWNrbGlzdEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NoZWNrbGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyMTE1NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9DaGVja2xpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENoZWNrbGlzdEltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENoZWNrbGlzdEltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBDaGVja2xpc3QgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDaGVja2xpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DSEVDS0xJU1Q7Ci0JfQotCi19IC8vQ2hlY2tsaXN0SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbXBvc2l0ZVJvbGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db21wb3NpdGVSb2xlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjlhNDc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbXBvc2l0ZVJvbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb21wb3NpdGVSb2xlSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbXBvc2l0ZSBSb2xlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsI2dldEFnZ3JlZ2F0ZWRSb2xlIDxlbT5BZ2dyZWdhdGVkIFJvbGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVSb2xlSW1wbCBleHRlbmRzIFJvbGVEZXNjcmlwdG9ySW1wbCBpbXBsZW1lbnRzIENvbXBvc2l0ZVJvbGUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZVJvbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT01QT1NJVEVfUk9MRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFJvbGU+IGdldEFnZ3JlZ2F0ZWRSb2xlKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QWdncmVnYXRlZFJvbGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRToKLQkJCQlyZXR1cm4gZ2V0QWdncmVnYXRlZFJvbGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRToKLQkJCQlnZXRBZ2dyZWdhdGVkUm9sZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0QWdncmVnYXRlZFJvbGUoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFJvbGU+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRToKLQkJCQlnZXRBZ2dyZWdhdGVkUm9sZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRToKLQkJCQlyZXR1cm4gIWdldEFnZ3JlZ2F0ZWRSb2xlKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Db21wb3NpdGVSb2xlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbmNlcHRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db25jZXB0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTI2N2VkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbmNlcHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbmNlcHRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbmNlcHRJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgQ29uY2VwdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbmNlcHRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05DRVBUOwotCX0KLQotfSAvL0NvbmNlcHRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29uc3RyYWludEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnN0cmFpbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNDUyNDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29uc3RyYWludEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnN0cmFpbnRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnN0cmFpbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29uc3RyYWludEltcGwjZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludEltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzIENvbnN0cmFpbnQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYWluRGVzY3JpcHRpb24oKSA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1haW5EZXNjcmlwdGlvbigpIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFpbkRlc2NyaXB0aW9uID0gTUFJTl9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJhaW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OU1RSQUlOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1haW5EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIG1haW5EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYWluRGVzY3JpcHRpb24oU3RyaW5nIG5ld01haW5EZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkTWFpbkRlc2NyaXB0aW9uID0gbWFpbkRlc2NyaXB0aW9uOwotCQltYWluRGVzY3JpcHRpb24gPSBuZXdNYWluRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQ09OU1RSQUlOVF9fTUFJTl9ERVNDUklQVElPTiwgb2xkTWFpbkRlc2NyaXB0aW9uLCBtYWluRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVF9fTUFJTl9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJCXNldE1haW5EZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX01BSU5fREVTQ1JJUFRJT046Ci0JCQkJc2V0TWFpbkRlc2NyaXB0aW9uKE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX01BSU5fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IG1haW5EZXNjcmlwdGlvbiAhPSBudWxsIDogIU1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKG1haW5EZXNjcmlwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtYWluRGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1haW5EZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NvbnN0cmFpbnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudENhdGVnb3J5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudENhdGVnb3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjA2YzZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRDYXRlZ29yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudENhdGVnb3J5SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBDYXRlZ29yeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRDYXRlZ29yeUltcGwgZXh0ZW5kcyBDb250ZW50RWxlbWVudEltcGwgaW1wbGVtZW50cyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50Q2F0ZWdvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0NBVEVHT1JZOwotCX0KLQotfSAvL0NvbnRlbnRDYXRlZ29yeUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE0YWZmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbCNnZXRDb250ZW50Q2F0ZWdvcnkgPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbCBleHRlbmRzIE1ldGhvZFBhY2thZ2VJbXBsIGltcGxlbWVudHMgQ29udGVudENhdGVnb3J5UGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PENvbnRlbnRDYXRlZ29yeT4gZ2V0Q29udGVudENhdGVnb3J5KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fQ09OVEVOVF9DQVRFR09SWSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0NPTlRFTlRfQ0FURUdPUlk6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRDb250ZW50Q2F0ZWdvcnkoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fQ09OVEVOVF9DQVRFR09SWToKLQkJCQlyZXR1cm4gZ2V0Q29udGVudENhdGVnb3J5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0NPTlRFTlRfQ0FURUdPUlk6Ci0JCQkJZ2V0Q29udGVudENhdGVnb3J5KCkuY2xlYXIoKTsKLQkJCQlnZXRDb250ZW50Q2F0ZWdvcnkoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRlbnRDYXRlZ29yeT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19DT05URU5UX0NBVEVHT1JZOgotCQkJCWdldENvbnRlbnRDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fQ09OVEVOVF9DQVRFR09SWToKLQkJCQlyZXR1cm4gIWdldENvbnRlbnRDYXRlZ29yeSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50RGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50RGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNzgwNTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudERlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudERlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCNnZXRNYWluRGVzY3JpcHRpb24gPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCNnZXRLZXlDb25zaWRlcmF0aW9ucyA8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwjZ2V0U2VjdGlvbiA8ZW0+U2VjdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsI2dldEV4dGVybmFsSWQgPGVtPkV4dGVybmFsIElkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudERlc2NyaXB0aW9uSW1wbCBleHRlbmRzIE1ldGhvZFVuaXRJbXBsIGltcGxlbWVudHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkgPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFJTl9ERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYWluRGVzY3JpcHRpb24oKSA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1haW5EZXNjcmlwdGlvbiA9IE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKSA8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRLZXlDb25zaWRlcmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtleUNvbnNpZGVyYXRpb25zKCkgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcga2V5Q29uc2lkZXJhdGlvbnMgPSBLRVlfQ09OU0lERVJBVElPTlNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN0aW9uKCkgPGVtPlNlY3Rpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFNlY3Rpb24+IHNlY3Rpb247Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxJZCgpIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxJZCgpIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBleHRlcm5hbElkID0gRVhURVJOQUxfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudERlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1haW5EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIG1haW5EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYWluRGVzY3JpcHRpb24oU3RyaW5nIG5ld01haW5EZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkTWFpbkRlc2NyaXB0aW9uID0gbWFpbkRlc2NyaXB0aW9uOwotCQltYWluRGVzY3JpcHRpb24gPSBuZXdNYWluRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiwgb2xkTWFpbkRlc2NyaXB0aW9uLCBtYWluRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEtleUNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4ga2V5Q29uc2lkZXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2V5Q29uc2lkZXJhdGlvbnMoU3RyaW5nIG5ld0tleUNvbnNpZGVyYXRpb25zKSB7Ci0JCVN0cmluZyBvbGRLZXlDb25zaWRlcmF0aW9ucyA9IGtleUNvbnNpZGVyYXRpb25zOwotCQlrZXlDb25zaWRlcmF0aW9ucyA9IG5ld0tleUNvbnNpZGVyYXRpb25zOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUywgb2xkS2V5Q29uc2lkZXJhdGlvbnMsIGtleUNvbnNpZGVyYXRpb25zKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFNlY3Rpb24+IGdldFNlY3Rpb24oKSB7Ci0JCWlmIChzZWN0aW9uID09IG51bGwpIHsKLQkJCXNlY3Rpb24gPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8U2VjdGlvbj4oU2VjdGlvbi5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OKTsKLQkJfQotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVybmFsSWQoKSB7Ci0JCXJldHVybiBleHRlcm5hbElkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsSWQoU3RyaW5nIG5ld0V4dGVybmFsSWQpIHsKLQkJU3RyaW5nIG9sZEV4dGVybmFsSWQgPSBleHRlcm5hbElkOwotCQlleHRlcm5hbElkID0gbmV3RXh0ZXJuYWxJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCwgb2xkRXh0ZXJuYWxJZCwgZXh0ZXJuYWxJZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U2VjdGlvbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXRNYWluRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEtleUNvbnNpZGVyYXRpb25zKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTjoKLQkJCQlyZXR1cm4gZ2V0U2VjdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJCXJldHVybiBnZXRFeHRlcm5hbElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjoKLQkJCQlzZXRNYWluRGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzoKLQkJCQlzZXRLZXlDb25zaWRlcmF0aW9ucygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTjoKLQkJCQlnZXRTZWN0aW9uKCkuY2xlYXIoKTsKLQkJCQlnZXRTZWN0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTZWN0aW9uPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJCXNldEV4dGVybmFsSWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJCXNldE1haW5EZXNjcmlwdGlvbihNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOgotCQkJCXNldEtleUNvbnNpZGVyYXRpb25zKEtFWV9DT05TSURFUkFUSU9OU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT046Ci0JCQkJZ2V0U2VjdGlvbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJCXNldEV4dGVybmFsSWQoRVhURVJOQUxfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IG1haW5EZXNjcmlwdGlvbiAhPSBudWxsIDogIU1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKG1haW5EZXNjcmlwdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOgotCQkJCXJldHVybiBLRVlfQ09OU0lERVJBVElPTlNfRURFRkFVTFQgPT0gbnVsbCA/IGtleUNvbnNpZGVyYXRpb25zICE9IG51bGwgOiAhS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxULmVxdWFscyhrZXlDb25zaWRlcmF0aW9ucyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTjoKLQkJCQlyZXR1cm4gc2VjdGlvbiAhPSBudWxsICYmICFzZWN0aW9uLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJCQlyZXR1cm4gRVhURVJOQUxfSURfRURFRkFVTFQgPT0gbnVsbCA/IGV4dGVybmFsSWQgIT0gbnVsbCA6ICFFWFRFUk5BTF9JRF9FREVGQVVMVC5lcXVhbHMoZXh0ZXJuYWxJZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtYWluRGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1haW5EZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwga2V5Q29uc2lkZXJhdGlvbnM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGtleUNvbnNpZGVyYXRpb25zKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleHRlcm5hbElkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleHRlcm5hbElkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ29udGVudERlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMGIyNDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb250ZW50RWxlbWVudEltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0Q2hlY2tsaXN0IDxlbT5DaGVja2xpc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldENvbmNlcHQgPGVtPkNvbmNlcHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldEV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldEd1aWRlbGluZSA8ZW0+R3VpZGVsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRSZXVzYWJsZUFzc2V0IDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0U3VwcG9ydGluZ01hdGVyaWFsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRXaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RWxlbWVudEltcGwgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgQ29udGVudEVsZW1lbnQgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMSgpIDxlbT5Hcm91cDE8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAxKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDE7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUID0gVmFyaWFiaWxpdHlUeXBlLk5BOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnRFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMSgpIHsKLQkJaWYgKGdyb3VwMSA9PSBudWxsKSB7Ci0JCQlncm91cDEgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HUk9VUDEpOwotCQl9Ci0JCXJldHVybiBncm91cDE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0Q2hlY2tsaXN0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRDb25jZXB0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0RXhhbXBsZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMSgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX0VYQU1QTEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEd1aWRlbGluZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMSgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX0dVSURFTElORSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0UmV1c2FibGVBc3NldCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMSgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRXaGl0ZXBhcGVyKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFN0cmluZyBuZXdWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSB7Ci0JCVN0cmluZyBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULCBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50LCB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5VHlwZSBnZXRWYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSBuZXdWYXJpYWJpbGl0eVR5cGUpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIG9sZFZhcmlhYmlsaXR5VHlwZSA9IHZhcmlhYmlsaXR5VHlwZTsKLQkJdmFyaWFiaWxpdHlUeXBlID0gbmV3VmFyaWFiaWxpdHlUeXBlID09IG51bGwgPyBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUIDogbmV3VmFyaWFiaWxpdHlUeXBlOwotCQlib29sZWFuIG9sZFZhcmlhYmlsaXR5VHlwZUVTZXQgPSB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCQl2YXJpYWJpbGl0eVR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUsIG9sZFZhcmlhYmlsaXR5VHlwZSwgdmFyaWFiaWxpdHlUeXBlLCAhb2xkVmFyaWFiaWxpdHlUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlWYXJpYWJpbGl0eVR5cGUgb2xkVmFyaWFiaWxpdHlUeXBlID0gdmFyaWFiaWxpdHlUeXBlOwotCQlib29sZWFuIG9sZFZhcmlhYmlsaXR5VHlwZUVTZXQgPSB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCQl2YXJpYWJpbGl0eVR5cGUgPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCQl2YXJpYWJpbGl0eVR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUsIG9sZFZhcmlhYmlsaXR5VHlwZSwgVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCwgb2xkVmFyaWFiaWxpdHlUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HUk9VUDE6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDEoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HUk9VUDE6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAxKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDEoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOgotCQkJCXJldHVybiBnZXRDaGVja2xpc3QoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NPTkNFUFQ6Ci0JCQkJcmV0dXJuIGdldENvbmNlcHQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0VYQU1QTEU6Ci0JCQkJcmV0dXJuIGdldEV4YW1wbGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dVSURFTElORToKLQkJCQlyZXR1cm4gZ2V0R3VpZGVsaW5lKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDoKLQkJCQlyZXR1cm4gZ2V0UmV1c2FibGVBc3NldCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDoKLQkJCQlyZXR1cm4gZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOgotCQkJCXJldHVybiBnZXRXaGl0ZXBhcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dST1VQMToKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOgotCQkJCWdldENoZWNrbGlzdCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q2hlY2tsaXN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUOgotCQkJCWdldENvbmNlcHQoKS5jbGVhcigpOwotCQkJCWdldENvbmNlcHQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0VYQU1QTEU6Ci0JCQkJZ2V0RXhhbXBsZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RXhhbXBsZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FOgotCQkJCWdldEd1aWRlbGluZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0R3VpZGVsaW5lKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDoKLQkJCQlnZXRSZXVzYWJsZUFzc2V0KCkuY2xlYXIoKTsKLQkJCQlnZXRSZXVzYWJsZUFzc2V0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOgotCQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLmNsZWFyKCk7Ci0JCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOgotCQkJCWdldFdoaXRlcGFwZXIoKS5jbGVhcigpOwotCQkJCWdldFdoaXRlcGFwZXIoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXNldFZhcmlhYmlsaXR5VHlwZSgoVmFyaWFiaWxpdHlUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1JPVVAxOgotCQkJCWdldEdyb3VwMSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOgotCQkJCWdldENoZWNrbGlzdCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDoKLQkJCQlnZXRDb25jZXB0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFOgotCQkJCWdldEV4YW1wbGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dVSURFTElORToKLQkJCQlnZXRHdWlkZWxpbmUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOgotCQkJCWdldFJldXNhYmxlQXNzZXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOgotCQkJCWdldFdoaXRlcGFwZXIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXVuc2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HUk9VUDE6Ci0JCQkJcmV0dXJuIGdyb3VwMSAhPSBudWxsICYmICFncm91cDEuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOgotCQkJCXJldHVybiAhZ2V0Q2hlY2tsaXN0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDoKLQkJCQlyZXR1cm4gIWdldENvbmNlcHQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFOgotCQkJCXJldHVybiAhZ2V0RXhhbXBsZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dVSURFTElORToKLQkJCQlyZXR1cm4gIWdldEd1aWRlbGluZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOgotCQkJCXJldHVybiAhZ2V0UmV1c2FibGVBc3NldCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQkJcmV0dXJuICFnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOgotCQkJCXJldHVybiAhZ2V0V2hpdGVwYXBlcigpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIFZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgIT0gbnVsbCA6ICFWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDE6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFyaWFiaWxpdHlUeXBlOiAiKTsKLQkJaWYgKHZhcmlhYmlsaXR5VHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQodmFyaWFiaWxpdHlUeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NvbnRlbnRFbGVtZW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOGFiYjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb250ZW50UGFja2FnZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsI2dldENvbnRlbnRFbGVtZW50IDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50UGFja2FnZUltcGwgZXh0ZW5kcyBNZXRob2RQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIENvbnRlbnRQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnRQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PENvbnRlbnRFbGVtZW50PiBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbnRlbnRFbGVtZW50KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0Q29udGVudEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UOgotCQkJCWdldENvbnRlbnRFbGVtZW50KCkuY2xlYXIoKTsKLQkJCQlnZXRDb250ZW50RWxlbWVudCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29udGVudEVsZW1lbnQ+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UOgotCQkJCWdldENvbnRlbnRFbGVtZW50KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuICFnZXRDb250ZW50RWxlbWVudCgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ29udGVudFBhY2thZ2VJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ3VzdG9tQ2F0ZWdvcnlJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9DdXN0b21DYXRlZ29yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY3NjczOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9DdXN0b21DYXRlZ29yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEN1c3RvbUNhdGVnb3J5SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q3VzdG9tIENhdGVnb3J5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkN1c3RvbUNhdGVnb3J5SW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50IDxlbT5DYXRlZ29yaXplZCBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkN1c3RvbUNhdGVnb3J5SW1wbCNnZXRTdWJDYXRlZ29yeSA8ZW0+U3ViIENhdGVnb3J5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzIEN1c3RvbUNhdGVnb3J5IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEN1c3RvbUNhdGVnb3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0U3ViQ2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUlkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRDYXRlZ29yaXplZEVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SWToKLQkJCQlyZXR1cm4gZ2V0U3ViQ2F0ZWdvcnkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVDoKLQkJCQlnZXRDYXRlZ29yaXplZEVsZW1lbnQoKS5jbGVhcigpOwotCQkJCWdldENhdGVnb3JpemVkRWxlbWVudCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JZOgotCQkJCWdldFN1YkNhdGVnb3J5KCkuY2xlYXIoKTsKLQkJCQlnZXRTdWJDYXRlZ29yeSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlQ6Ci0JCQkJZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUlk6Ci0JCQkJZ2V0U3ViQ2F0ZWdvcnkoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuICFnZXRDYXRlZ29yaXplZEVsZW1lbnQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUlk6Ci0JCQkJcmV0dXJuICFnZXRTdWJDYXRlZ29yeSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ3VzdG9tQ2F0ZWdvcnlJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5M2NhNTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsI2dldEV4dGVybmFsRGVzY3JpcHRpb24gPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsI2dldFBhY2thZ2luZ0d1aWRhbmNlIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgRGVsaXZlcmFibGVEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKSA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKSA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXh0ZXJuYWxEZXNjcmlwdGlvbiA9IEVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhY2thZ2luZ0d1aWRhbmNlKCkgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0lOR19HVUlEQU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhY2thZ2luZ0d1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhY2thZ2luZ0d1aWRhbmNlID0gUEFDS0FHSU5HX0dVSURBTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSQUJMRV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVybmFsRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBleHRlcm5hbERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsRGVzY3JpcHRpb24oU3RyaW5nIG5ld0V4dGVybmFsRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZEV4dGVybmFsRGVzY3JpcHRpb24gPSBleHRlcm5hbERlc2NyaXB0aW9uOwotCQlleHRlcm5hbERlc2NyaXB0aW9uID0gbmV3RXh0ZXJuYWxEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT04sIG9sZEV4dGVybmFsRGVzY3JpcHRpb24sIGV4dGVybmFsRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2luZ0d1aWRhbmNlKCkgewotCQlyZXR1cm4gcGFja2FnaW5nR3VpZGFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFja2FnaW5nR3VpZGFuY2UoU3RyaW5nIG5ld1BhY2thZ2luZ0d1aWRhbmNlKSB7Ci0JCVN0cmluZyBvbGRQYWNrYWdpbmdHdWlkYW5jZSA9IHBhY2thZ2luZ0d1aWRhbmNlOwotCQlwYWNrYWdpbmdHdWlkYW5jZSA9IG5ld1BhY2thZ2luZ0d1aWRhbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0UsIG9sZFBhY2thZ2luZ0d1aWRhbmNlLCBwYWNrYWdpbmdHdWlkYW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldEV4dGVybmFsRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFOgotCQkJCXJldHVybiBnZXRQYWNrYWdpbmdHdWlkYW5jZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OOgotCQkJCXNldEV4dGVybmFsRGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0U6Ci0JCQkJc2V0UGFja2FnaW5nR3VpZGFuY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT046Ci0JCQkJc2V0RXh0ZXJuYWxEZXNjcmlwdGlvbihFWFRFUk5BTF9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0U6Ci0JCQkJc2V0UGFja2FnaW5nR3VpZGFuY2UoUEFDS0FHSU5HX0dVSURBTkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIEVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBleHRlcm5hbERlc2NyaXB0aW9uICE9IG51bGwgOiAhRVhURVJOQUxfREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGV4dGVybmFsRGVzY3JpcHRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0U6Ci0JCQkJcmV0dXJuIFBBQ0tBR0lOR19HVUlEQU5DRV9FREVGQVVMVCA9PSBudWxsID8gcGFja2FnaW5nR3VpZGFuY2UgIT0gbnVsbCA6ICFQQUNLQUdJTkdfR1VJREFOQ0VfRURFRkFVTFQuZXF1YWxzKHBhY2thZ2luZ0d1aWRhbmNlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGV4dGVybmFsRGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4dGVybmFsRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhY2thZ2luZ0d1aWRhbmNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYWNrYWdpbmdHdWlkYW5jZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVsaXZlcmFibGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyYWJsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJjYjQ1My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyYWJsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlbGl2ZXJhYmxlSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcmFibGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcmFibGVJbXBsI2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbCNnZXREZWxpdmVyZWRXb3JrUHJvZHVjdCA8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJhYmxlSW1wbCBleHRlbmRzIFdvcmtQcm9kdWN0SW1wbCBpbXBsZW1lbnRzIERlbGl2ZXJhYmxlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDMoKSA8ZW0+R3JvdXAzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlbGl2ZXJhYmxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUkFCTEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAzKCkgewotCQlpZiAoZ3JvdXAzID09IG51bGwpIHsKLQkJCWdyb3VwMyA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fR1JPVVAzKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldERlbGl2ZXJlZFdvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAzKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0dST1VQMzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fR1JPVVAzOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMygpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAzKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVDoKLQkJCQlyZXR1cm4gZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fR1JPVVAzOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDMoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1Q6Ci0JCQkJZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QoKS5jbGVhcigpOwotCQkJCWdldERlbGl2ZXJlZFdvcmtQcm9kdWN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19HUk9VUDM6Ci0JCQkJZ2V0R3JvdXAzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1Q6Ci0JCQkJZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19HUk9VUDM6Ci0JCQkJcmV0dXJuIGdyb3VwMyAhPSBudWxsICYmICFncm91cDMuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUOgotCQkJCXJldHVybiAhZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RlbGl2ZXJhYmxlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZmFiNTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFNjYWxlIDxlbT5TY2FsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFJpc2tMZXZlbCA8ZW0+UmlzayBMZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UgPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0VHlwZU9mQ29udHJhY3QgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBQcm9jZXNzRGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2FsZSgpIDxlbT5TY2FsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NhbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNDQUxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjYWxlKCkgPGVtPlNjYWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTY2FsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzY2FsZSA9IFNDQUxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvamVjdENoYXJhY3RlcmlzdGljcyA9IFBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJpc2tMZXZlbCgpIDxlbT5SaXNrIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSaXNrTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJJU0tfTEVWRUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Umlza0xldmVsKCkgPGVtPlJpc2sgTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJpc2tMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByaXNrTGV2ZWwgPSBSSVNLX0xFVkVMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVzdGltYXRpbmdUZWNobmlxdWUoKSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVzdGltYXRpbmdUZWNobmlxdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVTVElNQVRJTkdfVEVDSE5JUVVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVzdGltYXRpbmdUZWNobmlxdWUoKSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVzdGltYXRpbmdUZWNobmlxdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXN0aW1hdGluZ1RlY2huaXF1ZSA9IEVTVElNQVRJTkdfVEVDSE5JUVVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKSA8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX01FTUJFUl9FWFBFUlRJU0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvamVjdE1lbWJlckV4cGVydGlzZSA9IFBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlT2ZDb250cmFjdCgpIDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlT2ZDb250cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9PRl9DT05UUkFDVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlT2ZDb250cmFjdCgpIDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlT2ZDb250cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlT2ZDb250cmFjdCA9IFRZUEVfT0ZfQ09OVFJBQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2NhbGUoKSB7Ci0JCXJldHVybiBzY2FsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTY2FsZShTdHJpbmcgbmV3U2NhbGUpIHsKLQkJU3RyaW5nIG9sZFNjYWxlID0gc2NhbGU7Ci0JCXNjYWxlID0gbmV3U2NhbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEUsIG9sZFNjYWxlLCBzY2FsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpIHsKLQkJcmV0dXJuIHByb2plY3RDaGFyYWN0ZXJpc3RpY3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyhTdHJpbmcgbmV3UHJvamVjdENoYXJhY3RlcmlzdGljcykgewotCQlTdHJpbmcgb2xkUHJvamVjdENoYXJhY3RlcmlzdGljcyA9IHByb2plY3RDaGFyYWN0ZXJpc3RpY3M7Ci0JCXByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPSBuZXdQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTLCBvbGRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzLCBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSaXNrTGV2ZWwoKSB7Ci0JCXJldHVybiByaXNrTGV2ZWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Umlza0xldmVsKFN0cmluZyBuZXdSaXNrTGV2ZWwpIHsKLQkJU3RyaW5nIG9sZFJpc2tMZXZlbCA9IHJpc2tMZXZlbDsKLQkJcmlza0xldmVsID0gbmV3Umlza0xldmVsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwsIG9sZFJpc2tMZXZlbCwgcmlza0xldmVsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkgewotCQlyZXR1cm4gZXN0aW1hdGluZ1RlY2huaXF1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFc3RpbWF0aW5nVGVjaG5pcXVlKFN0cmluZyBuZXdFc3RpbWF0aW5nVGVjaG5pcXVlKSB7Ci0JCVN0cmluZyBvbGRFc3RpbWF0aW5nVGVjaG5pcXVlID0gZXN0aW1hdGluZ1RlY2huaXF1ZTsKLQkJZXN0aW1hdGluZ1RlY2huaXF1ZSA9IG5ld0VzdGltYXRpbmdUZWNobmlxdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUsIG9sZEVzdGltYXRpbmdUZWNobmlxdWUsIGVzdGltYXRpbmdUZWNobmlxdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKSB7Ci0JCXJldHVybiBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoU3RyaW5nIG5ld1Byb2plY3RNZW1iZXJFeHBlcnRpc2UpIHsKLQkJU3RyaW5nIG9sZFByb2plY3RNZW1iZXJFeHBlcnRpc2UgPSBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlOwotCQlwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlID0gbmV3UHJvamVjdE1lbWJlckV4cGVydGlzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0UsIG9sZFByb2plY3RNZW1iZXJFeHBlcnRpc2UsIHByb2plY3RNZW1iZXJFeHBlcnRpc2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVPZkNvbnRyYWN0KCkgewotCQlyZXR1cm4gdHlwZU9mQ29udHJhY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZU9mQ29udHJhY3QoU3RyaW5nIG5ld1R5cGVPZkNvbnRyYWN0KSB7Ci0JCVN0cmluZyBvbGRUeXBlT2ZDb250cmFjdCA9IHR5cGVPZkNvbnRyYWN0OwotCQl0eXBlT2ZDb250cmFjdCA9IG5ld1R5cGVPZkNvbnRyYWN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1QsIG9sZFR5cGVPZkNvbnRyYWN0LCB0eXBlT2ZDb250cmFjdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRToKLQkJCQlyZXR1cm4gZ2V0U2NhbGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUzoKLQkJCQlyZXR1cm4gZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUw6Ci0JCQkJcmV0dXJuIGdldFJpc2tMZXZlbCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFOgotCQkJCXJldHVybiBnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFOgotCQkJCXJldHVybiBnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVDoKLQkJCQlyZXR1cm4gZ2V0VHlwZU9mQ29udHJhY3QoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFOgotCQkJCXNldFNjYWxlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUzoKLQkJCQlzZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMOgotCQkJCXNldFJpc2tMZXZlbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCQkJc2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFOgotCQkJCXNldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1Q6Ci0JCQkJc2V0VHlwZU9mQ29udHJhY3QoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRToKLQkJCQlzZXRTY2FsZShTQ0FMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTOgotCQkJCXNldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMOgotCQkJCXNldFJpc2tMZXZlbChSSVNLX0xFVkVMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCQkJc2V0RXN0aW1hdGluZ1RlY2huaXF1ZShFU1RJTUFUSU5HX1RFQ0hOSVFVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCQlzZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKFBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1Q6Ci0JCQkJc2V0VHlwZU9mQ29udHJhY3QoVFlQRV9PRl9DT05UUkFDVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEU6Ci0JCQkJcmV0dXJuIFNDQUxFX0VERUZBVUxUID09IG51bGwgPyBzY2FsZSAhPSBudWxsIDogIVNDQUxFX0VERUZBVUxULmVxdWFscyhzY2FsZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1M6Ci0JCQkJcmV0dXJuIFBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxUID09IG51bGwgPyBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzICE9IG51bGwgOiAhUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1NfRURFRkFVTFQuZXF1YWxzKHByb2plY3RDaGFyYWN0ZXJpc3RpY3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUw6Ci0JCQkJcmV0dXJuIFJJU0tfTEVWRUxfRURFRkFVTFQgPT0gbnVsbCA/IHJpc2tMZXZlbCAhPSBudWxsIDogIVJJU0tfTEVWRUxfRURFRkFVTFQuZXF1YWxzKHJpc2tMZXZlbCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCQkJcmV0dXJuIEVTVElNQVRJTkdfVEVDSE5JUVVFX0VERUZBVUxUID09IG51bGwgPyBlc3RpbWF0aW5nVGVjaG5pcXVlICE9IG51bGwgOiAhRVNUSU1BVElOR19URUNITklRVUVfRURFRkFVTFQuZXF1YWxzKGVzdGltYXRpbmdUZWNobmlxdWUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCQlyZXR1cm4gUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFX0VERUZBVUxUID09IG51bGwgPyBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlICE9IG51bGwgOiAhUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFX0VERUZBVUxULmVxdWFscyhwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUOgotCQkJCXJldHVybiBUWVBFX09GX0NPTlRSQUNUX0VERUZBVUxUID09IG51bGwgPyB0eXBlT2ZDb250cmFjdCAhPSBudWxsIDogIVRZUEVfT0ZfQ09OVFJBQ1RfRURFRkFVTFQuZXF1YWxzKHR5cGVPZkNvbnRyYWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNjYWxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzY2FsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJvamVjdENoYXJhY3RlcmlzdGljczogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJvamVjdENoYXJhY3RlcmlzdGljcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmlza0xldmVsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyaXNrTGV2ZWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVzdGltYXRpbmdUZWNobmlxdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGVzdGltYXRpbmdUZWNobmlxdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByb2plY3RNZW1iZXJFeHBlcnRpc2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByb2plY3RNZW1iZXJFeHBlcnRpc2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGVPZkNvbnRyYWN0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0eXBlT2ZDb250cmFjdCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM1ZmYzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZWxpdmVyeVByb2Nlc3NJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2VzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsI2dldEdyb3VwNCA8ZW0+R3JvdXA0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwjZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbCA8ZW0+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbCNnZXRFZHVjYXRpb25NYXRlcmlhbCA8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcnlQcm9jZXNzSW1wbCBleHRlbmRzIFByb2Nlc3NJbXBsIGltcGxlbWVudHMgRGVsaXZlcnlQcm9jZXNzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDQoKSA8ZW0+R3JvdXA0PC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwNCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXA0OwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyeVByb2Nlc3NJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwNCgpIHsKLQkJaWYgKGdyb3VwNCA9PSBudWxsKSB7Ci0JCQlncm91cDQgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fR1JPVVA0KTsKLQkJfQotCQlyZXR1cm4gZ3JvdXA0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldENvbW11bmljYXRpb25zTWF0ZXJpYWwoKSB7Ci0JCXJldHVybiBnZXRHcm91cDQoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUwpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEVkdWNhdGlvbk1hdGVyaWFsKCkgewotCQlyZXR1cm4gZ2V0R3JvdXA0KCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0dST1VQNDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwNCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19HUk9VUDQ6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXA0KCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDQoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMOgotCQkJCXJldHVybiBnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMOgotCQkJCXJldHVybiBnZXRFZHVjYXRpb25NYXRlcmlhbCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0dST1VQNDoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXA0KCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMOgotCQkJCWdldENvbW11bmljYXRpb25zTWF0ZXJpYWwoKS5jbGVhcigpOwotCQkJCWdldENvbW11bmljYXRpb25zTWF0ZXJpYWwoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUw6Ci0JCQkJZ2V0RWR1Y2F0aW9uTWF0ZXJpYWwoKS5jbGVhcigpOwotCQkJCWdldEVkdWNhdGlvbk1hdGVyaWFsKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0dST1VQNDoKLQkJCQlnZXRHcm91cDQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTDoKLQkJCQlnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMOgotCQkJCWdldEVkdWNhdGlvbk1hdGVyaWFsKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19HUk9VUDQ6Ci0JCQkJcmV0dXJuIGdyb3VwNCAhPSBudWxsICYmICFncm91cDQuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMOgotCQkJCXJldHVybiAhZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUw6Ci0JCQkJcmV0dXJuICFnZXRFZHVjYXRpb25NYXRlcmlhbCgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwNDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXA0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGVsaXZlcnlQcm9jZXNzSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rlc2NyaWJhYmxlRWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rlc2NyaWJhYmxlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEzNzBjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZXNjcmliYWJsZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZXNjcmliYWJsZUVsZW1lbnRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsI2dldEZ1bGZpbGwgPGVtPkZ1bGZpbGw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCNpc0lzQWJzdHJhY3QgPGVtPklzIEFic3RyYWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwjZ2V0Tm9kZWljb24gPGVtPk5vZGVpY29uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwjZ2V0U2hhcGVpY29uIDxlbT5TaGFwZWljb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmliYWJsZUVsZW1lbnRJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cyBEZXNjcmliYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRhdGlvbigpIDxlbT5QcmVzZW50YXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnREZXNjcmlwdGlvbiBwcmVzZW50YXRpb247Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGdWxmaWxsKCkgPGVtPkZ1bGZpbGw8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnVsZmlsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gZnVsZmlsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzQWJzdHJhY3QoKSA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNBYnN0cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0FCU1RSQUNUX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzQWJzdHJhY3QoKSA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNBYnN0cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBYnN0cmFjdCA9IElTX0FCU1RSQUNUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBBYnN0cmFjdCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBYnN0cmFjdEVTZXQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm9kZWljb24oKSA8ZW0+Tm9kZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vZGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFSUNPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb2RlaWNvbigpIDxlbT5Ob2RlaWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm9kZWljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbm9kZWljb24gPSBOT0RFSUNPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaGFwZWljb24oKSA8ZW0+U2hhcGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTaGFwZWljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNIQVBFSUNPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaGFwZWljb24oKSA8ZW0+U2hhcGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTaGFwZWljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2hhcGVpY29uID0gU0hBUEVJQ09OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlc2NyaWJhYmxlRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnREZXNjcmlwdGlvbiBnZXRQcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiBwcmVzZW50YXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJlc2VudGF0aW9uKENvbnRlbnREZXNjcmlwdGlvbiBuZXdQcmVzZW50YXRpb24sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ29udGVudERlc2NyaXB0aW9uIG9sZFByZXNlbnRhdGlvbiA9IHByZXNlbnRhdGlvbjsKLQkJcHJlc2VudGF0aW9uID0gbmV3UHJlc2VudGF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwgb2xkUHJlc2VudGF0aW9uLCBuZXdQcmVzZW50YXRpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlbnRhdGlvbihDb250ZW50RGVzY3JpcHRpb24gbmV3UHJlc2VudGF0aW9uKSB7Ci0JCWlmIChuZXdQcmVzZW50YXRpb24gIT0gcHJlc2VudGF0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcmVzZW50YXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcHJlc2VudGF0aW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByZXNlbnRhdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQcmVzZW50YXRpb24pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcmVzZW50YXRpb24obmV3UHJlc2VudGF0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLCBuZXdQcmVzZW50YXRpb24sIG5ld1ByZXNlbnRhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEZ1bGZpbGwoKSB7Ci0JCWlmIChmdWxmaWxsID09IG51bGwpIHsKLQkJCWZ1bGZpbGwgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fRlVMRklMTCk7Ci0JCX0KLQkJcmV0dXJuIGZ1bGZpbGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc0Fic3RyYWN0KCkgewotCQlyZXR1cm4gaXNBYnN0cmFjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0Fic3RyYWN0KGJvb2xlYW4gbmV3SXNBYnN0cmFjdCkgewotCQlib29sZWFuIG9sZElzQWJzdHJhY3QgPSBpc0Fic3RyYWN0OwotCQlpc0Fic3RyYWN0ID0gbmV3SXNBYnN0cmFjdDsKLQkJYm9vbGVhbiBvbGRJc0Fic3RyYWN0RVNldCA9IGlzQWJzdHJhY3RFU2V0OwotCQlpc0Fic3RyYWN0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1QsIG9sZElzQWJzdHJhY3QsIGlzQWJzdHJhY3QsICFvbGRJc0Fic3RyYWN0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNBYnN0cmFjdCgpIHsKLQkJYm9vbGVhbiBvbGRJc0Fic3RyYWN0ID0gaXNBYnN0cmFjdDsKLQkJYm9vbGVhbiBvbGRJc0Fic3RyYWN0RVNldCA9IGlzQWJzdHJhY3RFU2V0OwotCQlpc0Fic3RyYWN0ID0gSVNfQUJTVFJBQ1RfRURFRkFVTFQ7Ci0JCWlzQWJzdHJhY3RFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVCwgb2xkSXNBYnN0cmFjdCwgSVNfQUJTVFJBQ1RfRURFRkFVTFQsIG9sZElzQWJzdHJhY3RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc0Fic3RyYWN0KCkgewotCQlyZXR1cm4gaXNBYnN0cmFjdEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlaWNvbigpIHsKLQkJcmV0dXJuIG5vZGVpY29uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vZGVpY29uKFN0cmluZyBuZXdOb2RlaWNvbikgewotCQlTdHJpbmcgb2xkTm9kZWljb24gPSBub2RlaWNvbjsKLQkJbm9kZWljb24gPSBuZXdOb2RlaWNvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTiwgb2xkTm9kZWljb24sIG5vZGVpY29uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaGFwZWljb24oKSB7Ci0JCXJldHVybiBzaGFwZWljb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2hhcGVpY29uKFN0cmluZyBuZXdTaGFwZWljb24pIHsKLQkJU3RyaW5nIG9sZFNoYXBlaWNvbiA9IHNoYXBlaWNvbjsKLQkJc2hhcGVpY29uID0gbmV3U2hhcGVpY29uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTiwgb2xkU2hhcGVpY29uLCBzaGFwZWljb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOgotCQkJCXJldHVybiBiYXNpY1NldFByZXNlbnRhdGlvbihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCQlyZXR1cm4gZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fRlVMRklMTDoKLQkJCQlyZXR1cm4gZ2V0RnVsZmlsbCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNUOgotCQkJCXJldHVybiBpc0lzQWJzdHJhY3QoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT046Ci0JCQkJcmV0dXJuIGdldE5vZGVpY29uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOgotCQkJCXJldHVybiBnZXRTaGFwZWljb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQkJc2V0UHJlc2VudGF0aW9uKChDb250ZW50RGVzY3JpcHRpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19GVUxGSUxMOgotCQkJCWdldEZ1bGZpbGwoKS5jbGVhcigpOwotCQkJCWdldEZ1bGZpbGwoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDoKLQkJCQlzZXRJc0Fic3RyYWN0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjoKLQkJCQlzZXROb2RlaWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOgotCQkJCXNldFNoYXBlaWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCQlzZXRQcmVzZW50YXRpb24oKENvbnRlbnREZXNjcmlwdGlvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fRlVMRklMTDoKLQkJCQlnZXRGdWxmaWxsKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q6Ci0JCQkJdW5zZXRJc0Fic3RyYWN0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJCXNldE5vZGVpY29uKE5PREVJQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOgotCQkJCXNldFNoYXBlaWNvbihTSEFQRUlDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCQlyZXR1cm4gcHJlc2VudGF0aW9uICE9IG51bGw7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fRlVMRklMTDoKLQkJCQlyZXR1cm4gZnVsZmlsbCAhPSBudWxsICYmICFmdWxmaWxsLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDoKLQkJCQlyZXR1cm4gaXNTZXRJc0Fic3RyYWN0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT046Ci0JCQkJcmV0dXJuIE5PREVJQ09OX0VERUZBVUxUID09IG51bGwgPyBub2RlaWNvbiAhPSBudWxsIDogIU5PREVJQ09OX0VERUZBVUxULmVxdWFscyhub2RlaWNvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOgotCQkJCXJldHVybiBTSEFQRUlDT05fRURFRkFVTFQgPT0gbnVsbCA/IHNoYXBlaWNvbiAhPSBudWxsIDogIVNIQVBFSUNPTl9FREVGQVVMVC5lcXVhbHMoc2hhcGVpY29uKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGZ1bGZpbGw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZ1bGZpbGwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzQWJzdHJhY3Q6ICIpOwotCQlpZiAoaXNBYnN0cmFjdEVTZXQpIHJlc3VsdC5hcHBlbmQoaXNBYnN0cmFjdCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vZGVpY29uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChub2RlaWNvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2hhcGVpY29uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzaGFwZWljb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZXNjcmliYWJsZUVsZW1lbnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDVlODMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwjZ2V0UmVmaW5lZERlc2NyaXB0aW9uIDxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBEZXNjcmlwdG9yRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZpbmVkRGVzY3JpcHRpb24oKSA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZJTkVEX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZmluZWREZXNjcmlwdGlvbigpIDxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWZpbmVkRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVmaW5lZERlc2NyaXB0aW9uID0gUkVGSU5FRF9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklQVE9SX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gcmVmaW5lZERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZmluZWREZXNjcmlwdGlvbihTdHJpbmcgbmV3UmVmaW5lZERlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRSZWZpbmVkRGVzY3JpcHRpb24gPSByZWZpbmVkRGVzY3JpcHRpb247Ci0JCXJlZmluZWREZXNjcmlwdGlvbiA9IG5ld1JlZmluZWREZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OLCBvbGRSZWZpbmVkRGVzY3JpcHRpb24sIHJlZmluZWREZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXRSZWZpbmVkRGVzY3JpcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT046Ci0JCQkJc2V0UmVmaW5lZERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTjoKLQkJCQlzZXRSZWZpbmVkRGVzY3JpcHRpb24oUkVGSU5FRF9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gUkVGSU5FRF9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gcmVmaW5lZERlc2NyaXB0aW9uICE9IG51bGwgOiAhUkVGSU5FRF9ERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMocmVmaW5lZERlc2NyaXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJlZmluZWREZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVmaW5lZERlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rlc2NyaXB0b3JJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGI0NzI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZXNjcmlwdG9ySW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JJbXBsI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9ySW1wbCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJbXBsIGltcGxlbWVudHMgRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgU3luY2hyb25pemVkIFdpdGggU291cmNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklQVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlyZXR1cm4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShib29sZWFuIG5ld0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSkgewotCQlib29sZWFuIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQkJaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gbmV3SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCQlib29sZWFuIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQgPSBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0OwotCQlpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UsIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSwgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlLCAhb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlib29sZWFuIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQkJYm9vbGVhbiBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0ID0gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldDsKLQkJaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUOwotCQlpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UsIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSwgSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxULCBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSB7Ci0JCXJldHVybiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJCXNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCQl1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCQlyZXR1cm4gaXNTZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTogIik7Ci0JCWlmIChpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0KSByZXN1bHQuYXBwZW5kKGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZXNjcmlwdG9ySW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rpc2NpcGxpbmVHcm91cGluZ0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rpc2NpcGxpbmVHcm91cGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ4ODVhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EaXNjaXBsaW5lR3JvdXBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEaXNjaXBsaW5lR3JvdXBpbmdJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzY2lwbGluZSBHcm91cGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRpc2NpcGxpbmVHcm91cGluZ0ltcGwjZ2V0RGlzY2lwbGluZSA8ZW0+RGlzY2lwbGluZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVHcm91cGluZ0ltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgRGlzY2lwbGluZUdyb3VwaW5nIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpc2NpcGxpbmVHcm91cGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfR1JPVVBJTkc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0RGlzY2lwbGluZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORToKLQkJCQlyZXR1cm4gZ2V0RGlzY2lwbGluZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkU6Ci0JCQkJZ2V0RGlzY2lwbGluZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzY2lwbGluZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORToKLQkJCQlnZXREaXNjaXBsaW5lKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkU6Ci0JCQkJcmV0dXJuICFnZXREaXNjaXBsaW5lKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EaXNjaXBsaW5lR3JvdXBpbmdJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGlzY2lwbGluZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rpc2NpcGxpbmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MzE2ODUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGlzY2lwbGluZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERpc2NpcGxpbmVJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc2NpcGxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUltcGwjZ2V0VGFzayA8ZW0+VGFzazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbCNnZXRTdWJEaXNjaXBsaW5lIDxlbT5TdWIgRGlzY2lwbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbCNnZXRSZWZlcmVuY2VXb3JrZmxvdyA8ZW0+UmVmZXJlbmNlIFdvcmtmbG93PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgRGlzY2lwbGluZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXNjaXBsaW5lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRUYXNrKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfX1RBU0spOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxEaXNjaXBsaW5lPiBnZXRTdWJEaXNjaXBsaW5lKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfX1NVQl9ESVNDSVBMSU5FKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRSZWZlcmVuY2VXb3JrZmxvdygpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1cpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQl9ESVNDSVBMSU5FOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U3ViRGlzY2lwbGluZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0s6Ci0JCQkJcmV0dXJuIGdldFRhc2soKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJfRElTQ0lQTElORToKLQkJCQlyZXR1cm4gZ2V0U3ViRGlzY2lwbGluZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPVzoKLQkJCQlyZXR1cm4gZ2V0UmVmZXJlbmNlV29ya2Zsb3coKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19UQVNLOgotCQkJCWdldFRhc2soKS5jbGVhcigpOwotCQkJCWdldFRhc2soKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJfRElTQ0lQTElORToKLQkJCQlnZXRTdWJEaXNjaXBsaW5lKCkuY2xlYXIoKTsKLQkJCQlnZXRTdWJEaXNjaXBsaW5lKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEaXNjaXBsaW5lPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPVzoKLQkJCQlnZXRSZWZlcmVuY2VXb3JrZmxvdygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVmZXJlbmNlV29ya2Zsb3coKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0s6Ci0JCQkJZ2V0VGFzaygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQl9ESVNDSVBMSU5FOgotCQkJCWdldFN1YkRpc2NpcGxpbmUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1c6Ci0JCQkJZ2V0UmVmZXJlbmNlV29ya2Zsb3coKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fVEFTSzoKLQkJCQlyZXR1cm4gIWdldFRhc2soKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCX0RJU0NJUExJTkU6Ci0JCQkJcmV0dXJuICFnZXRTdWJEaXNjaXBsaW5lKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPVzoKLQkJCQlyZXR1cm4gIWdldFJlZmVyZW5jZVdvcmtmbG93KCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EaXNjaXBsaW5lSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RvY3VtZW50Um9vdEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RvY3VtZW50Um9vdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ2MjFiNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Eb2N1bWVudFJvb3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEb2N1bWVudFJvb3RJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uaW1wbC5FRGF0YU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlRU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvY3VtZW50IFJvb3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRYTUxOU1ByZWZpeE1hcCA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb2N1bWVudFJvb3RJbXBsI2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbiA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRNZXRob2RMaWJyYXJ5IDxlbT5NZXRob2QgTGlicmFyeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb2N1bWVudFJvb3RJbXBsI2dldE1ldGhvZFBsdWdpbiA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50Um9vdEltcGwgZXh0ZW5kcyBFRGF0YU9iamVjdEltcGwgaW1wbGVtZW50cyBEb2N1bWVudFJvb3QgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1peGVkKCkgPGVtPk1peGVkPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1peGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBtaXhlZDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhNTE5TUHJlZml4TWFwKCkgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn0nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFhNTE5TUHJlZml4TWFwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU1hcDxTdHJpbmcsIFN0cmluZz4geE1MTlNQcmVmaXhNYXA7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYU0lTY2hlbWFMb2NhdGlvbigpIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRYU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVNYXA8U3RyaW5nLCBTdHJpbmc+IHhTSVNjaGVtYUxvY2F0aW9uOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50Um9vdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRPQ1VNRU5UX1JPT1Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0TWl4ZWQoKSB7Ci0JCWlmIChtaXhlZCA9PSBudWxsKSB7Ci0JCQltaXhlZCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRCk7Ci0JCX0KLQkJcmV0dXJuIG1peGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTWFwPFN0cmluZywgU3RyaW5nPiBnZXRYTUxOU1ByZWZpeE1hcCgpIHsKLQkJaWYgKHhNTE5TUHJlZml4TWFwID09IG51bGwpIHsKLQkJCXhNTE5TUHJlZml4TWFwID0gbmV3IEVjb3JlRU1hcDxTdHJpbmcsU3RyaW5nPihFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRVNUUklOR19UT19TVFJJTkdfTUFQX0VOVFJZLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUCk7Ci0JCX0KLQkJcmV0dXJuIHhNTE5TUHJlZml4TWFwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTWFwPFN0cmluZywgU3RyaW5nPiBnZXRYU0lTY2hlbWFMb2NhdGlvbigpIHsKLQkJaWYgKHhTSVNjaGVtYUxvY2F0aW9uID09IG51bGwpIHsKLQkJCXhTSVNjaGVtYUxvY2F0aW9uID0gbmV3IEVjb3JlRU1hcDxTdHJpbmcsU3RyaW5nPihFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRVNUUklOR19UT19TVFJJTkdfTUFQX0VOVFJZLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTik7Ci0JCX0KLQkJcmV0dXJuIHhTSVNjaGVtYUxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiAoTWV0aG9kQ29uZmlndXJhdGlvbilnZXRNaXhlZCgpLmdldChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9DT05GSUdVUkFUSU9OLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gbmV3TWV0aG9kQ29uZmlndXJhdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLmJhc2ljQWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0NPTkZJR1VSQVRJT04sIG5ld01ldGhvZENvbmZpZ3VyYXRpb24sIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBuZXdNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQoVW1hUGFja2FnZS5MaXRlcmFscy5ET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTiwgbmV3TWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0TWV0aG9kTGlicmFyeSgpIHsKLQkJcmV0dXJuIChNZXRob2RMaWJyYXJ5KWdldE1peGVkKCkuZ2V0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0xJQlJBUlksIHRydWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBuZXdNZXRob2RMaWJyYXJ5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuYmFzaWNBZGQoVW1hUGFja2FnZS5MaXRlcmFscy5ET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWSwgbmV3TWV0aG9kTGlicmFyeSwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IG5ld01ldGhvZExpYnJhcnkpIHsKLQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLnNldChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9MSUJSQVJZLCBuZXdNZXRob2RMaWJyYXJ5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGx1Z2luIGdldE1ldGhvZFBsdWdpbigpIHsKLQkJcmV0dXJuIChNZXRob2RQbHVnaW4pZ2V0TWl4ZWQoKS5nZXQoVW1hUGFja2FnZS5MaXRlcmFscy5ET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNZXRob2RQbHVnaW4oTWV0aG9kUGx1Z2luIG5ld01ldGhvZFBsdWdpbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLmJhc2ljQWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX1BMVUdJTiwgbmV3TWV0aG9kUGx1Z2luLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RQbHVnaW4oTWV0aG9kUGx1Z2luIG5ld01ldGhvZFBsdWdpbikgewotCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuc2V0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX1BMVUdJTiwgbmV3TWV0aG9kUGx1Z2luKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNaXhlZCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFhNTE5TUHJlZml4TWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9DT05GSUdVUkFUSU9OOgotCQkJCXJldHVybiBiYXNpY1NldE1ldGhvZENvbmZpZ3VyYXRpb24obnVsbCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0xJQlJBUlk6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0TWV0aG9kTGlicmFyeShudWxsLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOOgotCQkJCXJldHVybiBiYXNpY1NldE1ldGhvZFBsdWdpbihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldE1peGVkKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRYTUxOU1ByZWZpeE1hcCgpOwotCQkJCWVsc2UgcmV0dXJuIGdldFhNTE5TUHJlZml4TWFwKCkubWFwKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRYU0lTY2hlbWFMb2NhdGlvbigpOwotCQkJCWVsc2UgcmV0dXJuIGdldFhTSVNjaGVtYUxvY2F0aW9uKCkubWFwKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0NPTkZJR1VSQVRJT046Ci0JCQkJcmV0dXJuIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWToKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kTGlicmFyeSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9QTFVHSU46Ci0JCQkJcmV0dXJuIGdldE1ldGhvZFBsdWdpbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJKChFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZylnZXRYTUxOU1ByZWZpeE1hcCgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCSgoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcpZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0NPTkZJR1VSQVRJT046Ci0JCQkJc2V0TWV0aG9kQ29uZmlndXJhdGlvbigoTWV0aG9kQ29uZmlndXJhdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9MSUJSQVJZOgotCQkJCXNldE1ldGhvZExpYnJhcnkoKE1ldGhvZExpYnJhcnkpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOOgotCQkJCXNldE1ldGhvZFBsdWdpbigoTWV0aG9kUGx1Z2luKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCWdldE1peGVkKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlnZXRYTUxOU1ByZWZpeE1hcCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTjoKLQkJCQlzZXRNZXRob2RDb25maWd1cmF0aW9uKChNZXRob2RDb25maWd1cmF0aW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWToKLQkJCQlzZXRNZXRob2RMaWJyYXJ5KChNZXRob2RMaWJyYXJ5KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOOgotCQkJCXNldE1ldGhvZFBsdWdpbigoTWV0aG9kUGx1Z2luKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCXJldHVybiBtaXhlZCAhPSBudWxsICYmICFtaXhlZC5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlyZXR1cm4geE1MTlNQcmVmaXhNYXAgIT0gbnVsbCAmJiAheE1MTlNQcmVmaXhNYXAuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJcmV0dXJuIHhTSVNjaGVtYUxvY2F0aW9uICE9IG51bGwgJiYgIXhTSVNjaGVtYUxvY2F0aW9uLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTjoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpICE9IG51bGw7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0xJQlJBUlk6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZExpYnJhcnkoKSAhPSBudWxsOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9QTFVHSU46Ci0JCQkJcmV0dXJuIGdldE1ldGhvZFBsdWdpbigpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtaXhlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWl4ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Eb2N1bWVudFJvb3RJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRG9tYWluSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRG9tYWluSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmNmNjUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RvbWFpbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERvbWFpbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb21haW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9tYWluSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb21haW5JbXBsI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9tYWluSW1wbCNnZXRTdWJkb21haW4gPGVtPlN1YmRvbWFpbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERvbWFpbkltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgRG9tYWluIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERvbWFpbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRPTUFJTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkRPTUFJTl9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFdvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPTUFJTl9fV09SS19QUk9EVUNUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8RG9tYWluPiBnZXRTdWJkb21haW4oKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9NQUlOX19TVUJET01BSU4pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19TVUJET01BSU46Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTdWJkb21haW4oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fV09SS19QUk9EVUNUOgotCQkJCXJldHVybiBnZXRXb3JrUHJvZHVjdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOOgotCQkJCXJldHVybiBnZXRTdWJkb21haW4oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fV09SS19QUk9EVUNUOgotCQkJCWdldFdvcmtQcm9kdWN0KCkuY2xlYXIoKTsKLQkJCQlnZXRXb3JrUHJvZHVjdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOOgotCQkJCWdldFN1YmRvbWFpbigpLmNsZWFyKCk7Ci0JCQkJZ2V0U3ViZG9tYWluKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEb21haW4+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fV09SS19QUk9EVUNUOgotCQkJCWdldFdvcmtQcm9kdWN0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19TVUJET01BSU46Ci0JCQkJZ2V0U3ViZG9tYWluKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19XT1JLX1BST0RVQ1Q6Ci0JCQkJcmV0dXJuICFnZXRXb3JrUHJvZHVjdCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTjoKLQkJCQlyZXR1cm4gIWdldFN1YmRvbWFpbigpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRG9tYWluSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODM4YjM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEVsZW1lbnRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5pbXBsLkVEYXRhT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudEltcGwgZXh0ZW5kcyBFRGF0YU9iamVjdEltcGwgaW1wbGVtZW50cyBFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkVMRU1FTlQ7Ci0JfQotCi19IC8vRWxlbWVudEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Fc3RpbWF0ZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VzdGltYXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTJlYjhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VzdGltYXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXN0aW1hdGVJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0ZUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGVJbXBsI2dldEVzdGltYXRpb25NZXRyaWMgPGVtPkVzdGltYXRpb24gTWV0cmljPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRlSW1wbCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFc3RpbWF0ZUltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBFc3RpbWF0ZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFc3RpbWF0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkVTVElNQVRFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRFc3RpbWF0aW9uTWV0cmljKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkVTVElNQVRFX19FU1RJTUFUSU9OX01FVFJJQyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkVTVElNQVRFX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fRVNUSU1BVElPTl9NRVRSSUM6Ci0JCQkJcmV0dXJuIGdldEVzdGltYXRpb25NZXRyaWMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFX19FU1RJTUFUSU9OX01FVFJJQzoKLQkJCQlnZXRFc3RpbWF0aW9uTWV0cmljKCkuY2xlYXIoKTsKLQkJCQlnZXRFc3RpbWF0aW9uTWV0cmljKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fRVNUSU1BVElPTl9NRVRSSUM6Ci0JCQkJZ2V0RXN0aW1hdGlvbk1ldHJpYygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0VTVElNQVRJT05fTUVUUklDOgotCQkJCXJldHVybiAhZ2V0RXN0aW1hdGlvbk1ldHJpYygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCQlyZXR1cm4gIWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRXN0aW1hdGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRXN0aW1hdGluZ01ldHJpY0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VzdGltYXRpbmdNZXRyaWNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5N2NhY2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRXN0aW1hdGluZ01ldHJpY0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXN0aW1hdGluZ01ldHJpY0ltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Fc3RpbWF0aW5nIE1ldHJpYzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVzdGltYXRpbmdNZXRyaWNJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgRXN0aW1hdGluZ01ldHJpYyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVzdGltYXRpbmdNZXRyaWNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FU1RJTUFUSU5HX01FVFJJQzsKLQl9Ci0KLX0gLy9Fc3RpbWF0aW5nTWV0cmljSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY3OGUyNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzsKLQl9Ci0KLX0gLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRXhhbXBsZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0V4YW1wbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OWY1MGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRXhhbXBsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXhhbXBsZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXhhbXBsZUltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBFeGFtcGxlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXhhbXBsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkVYQU1QTEU7Ci0JfQotCi19IC8vRXhhbXBsZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9HdWlkYW5jZURlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk1ZDY3OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9HdWlkYW5jZURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGFuY2UgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwjZ2V0QXR0YWNobWVudCA8ZW0+QXR0YWNobWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIEd1aWRhbmNlRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRhY2htZW50KCkgPGVtPkF0dGFjaG1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dGFjaG1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVEFDSE1FTlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0YWNobWVudCgpIDxlbT5BdHRhY2htZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRhY2htZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dGFjaG1lbnQgPSBBVFRBQ0hNRU5UX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEd1aWRhbmNlRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5HVUlEQU5DRV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dGFjaG1lbnQoKSB7Ci0JCXJldHVybiBhdHRhY2htZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dGFjaG1lbnQoU3RyaW5nIG5ld0F0dGFjaG1lbnQpIHsKLQkJU3RyaW5nIG9sZEF0dGFjaG1lbnQgPSBhdHRhY2htZW50OwotCQlhdHRhY2htZW50ID0gbmV3QXR0YWNobWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVCwgb2xkQXR0YWNobWVudCwgYXR0YWNobWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVDoKLQkJCQlyZXR1cm4gZ2V0QXR0YWNobWVudCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlQ6Ci0JCQkJc2V0QXR0YWNobWVudCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UOgotCQkJCXNldEF0dGFjaG1lbnQoQVRUQUNITUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlQ6Ci0JCQkJcmV0dXJuIEFUVEFDSE1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGF0dGFjaG1lbnQgIT0gbnVsbCA6ICFBVFRBQ0hNRU5UX0VERUZBVUxULmVxdWFscyhhdHRhY2htZW50KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF0dGFjaG1lbnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF0dGFjaG1lbnQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9HdWlkYW5jZURlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0d1aWRhbmNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGFuY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZDQ4MzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGFuY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEd1aWRhbmNlSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HdWlkYW5jZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlSW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEd1aWRhbmNlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3VpZGFuY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5HVUlEQU5DRTsKLQl9Ci0KLX0gLy9HdWlkYW5jZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9HdWlkZWxpbmVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9HdWlkZWxpbmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMzA5YzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGVsaW5lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBHdWlkZWxpbmVJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkZWxpbmVJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgR3VpZGVsaW5lIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3VpZGVsaW5lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1VJREVMSU5FOwotCX0KLQotfSAvL0d1aWRlbGluZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9JdGVyYXRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9JdGVyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZjlkZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvSXRlcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBJdGVyYXRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JdGVyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVyYXRpb25JbXBsIGV4dGVuZHMgQWN0aXZpdHlJbXBsIGltcGxlbWVudHMgSXRlcmF0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuSVRFUkFUSU9OOwotCX0KLQotfSAvL0l0ZXJhdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9LaW5kSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvS2luZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUxODIwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9LaW5kSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogS2luZEltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5LaW5kPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLktpbmRJbXBsI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEtpbmRJbXBsIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJbXBsIGltcGxlbWVudHMgS2luZCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSA8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEtpbmRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5LSU5EOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkgewotCQlpZiAoYXBwbGljYWJsZU1ldGFDbGFzc0luZm8gPT0gbnVsbCkgewotCQkJYXBwbGljYWJsZU1ldGFDbGFzc0luZm8gPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8pOwotCQl9Ci0JCXJldHVybiBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk86Ci0JCQkJcmV0dXJuIGdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk86Ci0JCQkJZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKS5jbGVhcigpOwotCQkJCWdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOgotCQkJCWdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5LSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTzoKLQkJCQlyZXR1cm4gYXBwbGljYWJsZU1ldGFDbGFzc0luZm8gIT0gbnVsbCAmJiAhYXBwbGljYWJsZU1ldGFDbGFzc0luZm8uaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYXBwbGljYWJsZU1ldGFDbGFzc0luZm86ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vS2luZEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZENvbmZpZ3VyYXRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RDb25maWd1cmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmM4ODZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZENvbmZpZ3VyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RDb25maWd1cmF0aW9uSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0QmFzZUNvbmZpZ3VyYXRpb24gPGVtPkJhc2UgQ29uZmlndXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24gPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXREZWZhdWx0VmlldyA8ZW0+RGVmYXVsdCBWaWV3PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldFByb2Nlc3NWaWV3IDxlbT5Qcm9jZXNzIFZpZXc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0U3VidHJhY3RlZENhdGVnb3J5IDxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldEFkZGVkQ2F0ZWdvcnkgPGVtPkFkZGVkIENhdGVnb3J5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kQ29uZmlndXJhdGlvbkltcGwgZXh0ZW5kcyBNZXRob2RVbml0SW1wbCBpbXBsZW1lbnRzIE1ldGhvZENvbmZpZ3VyYXRpb24gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VDb25maWd1cmF0aW9uKCkgPGVtPkJhc2UgQ29uZmlndXJhdGlvbjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNlQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gYmFzZUNvbmZpZ3VyYXRpb247Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSA8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBtZXRob2RQbHVnaW5TZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkgPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBtZXRob2RQYWNrYWdlU2VsZWN0aW9uOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRWaWV3KCkgPGVtPkRlZmF1bHQgVmlldzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdFZpZXcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVklFV19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0VmlldygpIDxlbT5EZWZhdWx0IFZpZXc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRWaWV3KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWaWV3ID0gREVGQVVMVF9WSUVXX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvY2Vzc1ZpZXcoKSA8ZW0+UHJvY2VzcyBWaWV3PC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2Nlc3NWaWV3KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBwcm9jZXNzVmlldzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YnRyYWN0ZWRDYXRlZ29yeSgpIDxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YnRyYWN0ZWRDYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gc3VidHJhY3RlZENhdGVnb3J5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkZWRDYXRlZ29yeSgpIDxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRlZENhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBhZGRlZENhdGVnb3J5OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfQ09ORklHVVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRCYXNlQ29uZmlndXJhdGlvbigpIHsKLQkJaWYgKGJhc2VDb25maWd1cmF0aW9uID09IG51bGwpIHsKLQkJCWJhc2VDb25maWd1cmF0aW9uID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT04pOwotCQl9Ci0JCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSB7Ci0JCWlmIChtZXRob2RQbHVnaW5TZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJbWV0aG9kUGx1Z2luU2VsZWN0aW9uID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTik7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFBsdWdpblNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkgewotCQlpZiAobWV0aG9kUGFja2FnZVNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQltZXRob2RQYWNrYWdlU2VsZWN0aW9uID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT04pOwotCQl9Ci0JCXJldHVybiBtZXRob2RQYWNrYWdlU2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZpZXcoKSB7Ci0JCXJldHVybiBkZWZhdWx0VmlldzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmlldyhTdHJpbmcgbmV3RGVmYXVsdFZpZXcpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRWaWV3ID0gZGVmYXVsdFZpZXc7Ci0JCWRlZmF1bHRWaWV3ID0gbmV3RGVmYXVsdFZpZXc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVywgb2xkRGVmYXVsdFZpZXcsIGRlZmF1bHRWaWV3KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0UHJvY2Vzc1ZpZXcoKSB7Ci0JCWlmIChwcm9jZXNzVmlldyA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzVmlldyA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXKTsKLQkJfQotCQlyZXR1cm4gcHJvY2Vzc1ZpZXc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkgewotCQlpZiAoc3VidHJhY3RlZENhdGVnb3J5ID09IG51bGwpIHsKLQkJCXN1YnRyYWN0ZWRDYXRlZ29yeSA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWSk7Ci0JCX0KLQkJcmV0dXJuIHN1YnRyYWN0ZWRDYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRBZGRlZENhdGVnb3J5KCkgewotCQlpZiAoYWRkZWRDYXRlZ29yeSA9PSBudWxsKSB7Ci0JCQlhZGRlZENhdGVnb3J5ID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWSk7Ci0JCX0KLQkJcmV0dXJuIGFkZGVkQ2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT046Ci0JCQkJcmV0dXJuIGdldEJhc2VDb25maWd1cmF0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OOgotCQkJCXJldHVybiBnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJCXJldHVybiBnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVzoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZpZXcoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXOgotCQkJCXJldHVybiBnZXRQcm9jZXNzVmlldygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZOgotCQkJCXJldHVybiBnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIGdldEFkZGVkQ2F0ZWdvcnkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OOgotCQkJCWdldEJhc2VDb25maWd1cmF0aW9uKCkuY2xlYXIoKTsKLQkJCQlnZXRCYXNlQ29uZmlndXJhdGlvbigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjoKLQkJCQlnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT046Ci0JCQkJZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVc6Ci0JCQkJc2V0RGVmYXVsdFZpZXcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVc6Ci0JCQkJZ2V0UHJvY2Vzc1ZpZXcoKS5jbGVhcigpOwotCQkJCWdldFByb2Nlc3NWaWV3KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlk6Ci0JCQkJZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkuY2xlYXIoKTsKLQkJCQlnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlk6Ci0JCQkJZ2V0QWRkZWRDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQkJZ2V0QWRkZWRDYXRlZ29yeSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OOgotCQkJCWdldEJhc2VDb25maWd1cmF0aW9uKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OOgotCQkJCWdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT046Ci0JCQkJZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVc6Ci0JCQkJc2V0RGVmYXVsdFZpZXcoREVGQVVMVF9WSUVXX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFVzoKLQkJCQlnZXRQcm9jZXNzVmlldygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZOgotCQkJCWdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWToKLQkJCQlnZXRBZGRlZENhdGVnb3J5KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OOgotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbiAhPSBudWxsICYmICFiYXNlQ29uZmlndXJhdGlvbi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OOgotCQkJCXJldHVybiBtZXRob2RQbHVnaW5TZWxlY3Rpb24gIT0gbnVsbCAmJiAhbWV0aG9kUGx1Z2luU2VsZWN0aW9uLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJCXJldHVybiBtZXRob2RQYWNrYWdlU2VsZWN0aW9uICE9IG51bGwgJiYgIW1ldGhvZFBhY2thZ2VTZWxlY3Rpb24uaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVc6Ci0JCQkJcmV0dXJuIERFRkFVTFRfVklFV19FREVGQVVMVCA9PSBudWxsID8gZGVmYXVsdFZpZXcgIT0gbnVsbCA6ICFERUZBVUxUX1ZJRVdfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRWaWV3KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXOgotCQkJCXJldHVybiBwcm9jZXNzVmlldyAhPSBudWxsICYmICFwcm9jZXNzVmlldy5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIHN1YnRyYWN0ZWRDYXRlZ29yeSAhPSBudWxsICYmICFzdWJ0cmFjdGVkQ2F0ZWdvcnkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWToKLQkJCQlyZXR1cm4gYWRkZWRDYXRlZ29yeSAhPSBudWxsICYmICFhZGRlZENhdGVnb3J5LmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGJhc2VDb25maWd1cmF0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChiYXNlQ29uZmlndXJhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWV0aG9kUGx1Z2luU2VsZWN0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtZXRob2RQbHVnaW5TZWxlY3Rpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1ldGhvZFBhY2thZ2VTZWxlY3Rpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRWaWV3OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0Vmlldyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJvY2Vzc1ZpZXc6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByb2Nlc3NWaWV3KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdWJ0cmFjdGVkQ2F0ZWdvcnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN1YnRyYWN0ZWRDYXRlZ29yeSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWRkZWRDYXRlZ29yeTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWRkZWRDYXRlZ29yeSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZENvbmZpZ3VyYXRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kRWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MGQ0OGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZEVsZW1lbnRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0T3duZWRSdWxlIDxlbT5Pd25lZCBSdWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0QnJpZWZEZXNjcmlwdGlvbiA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldE9yZGVyaW5nR3VpZGUgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2lzU3VwcHJlc3NlZCA8ZW0+U3VwcHJlc3NlZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRJbXBsIGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIE1ldGhvZEVsZW1lbnQgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwKCkgPGVtPkdyb3VwPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmllZkRlc2NyaXB0aW9uKCkgPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCUklFRl9ERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmllZkRlc2NyaXB0aW9uKCkgPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJyaWVmRGVzY3JpcHRpb24gPSBCUklFRl9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yZGVyaW5nR3VpZGUoKSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9yZGVyaW5nR3VpZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9SREVSSU5HX0dVSURFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yZGVyaW5nR3VpZGUoKSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9yZGVyaW5nR3VpZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgb3JkZXJpbmdHdWlkZSA9IE9SREVSSU5HX0dVSURFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRhdGlvbk5hbWUoKSA8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRhdGlvbk5hbWUoKSA8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJlc2VudGF0aW9uTmFtZSA9IFBSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3VwcHJlc3NlZCgpIDxlbT5TdXBwcmVzc2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1N1cHByZXNzZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBTVVBQUkVTU0VEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N1cHByZXNzZWQoKSA8ZW0+U3VwcHJlc3NlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTdXBwcmVzc2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwcmVzc2VkID0gU1VQUFJFU1NFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU3VwcHJlc3NlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcHJlc3NlZEVTZXQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwKCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkgewotCQkJZ3JvdXAgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0dST1VQKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PENvbnN0cmFpbnQ+IGdldE93bmVkUnVsZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5PiBnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKSB7Ci0JCXJldHVybiBnZXRHcm91cCgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QnJpZWZEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGJyaWVmRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QnJpZWZEZXNjcmlwdGlvbihTdHJpbmcgbmV3QnJpZWZEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkQnJpZWZEZXNjcmlwdGlvbiA9IGJyaWVmRGVzY3JpcHRpb247Ci0JCWJyaWVmRGVzY3JpcHRpb24gPSBuZXdCcmllZkRlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiwgb2xkQnJpZWZEZXNjcmlwdGlvbiwgYnJpZWZEZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE9yZGVyaW5nR3VpZGUoKSB7Ci0JCXJldHVybiBvcmRlcmluZ0d1aWRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9yZGVyaW5nR3VpZGUoU3RyaW5nIG5ld09yZGVyaW5nR3VpZGUpIHsKLQkJU3RyaW5nIG9sZE9yZGVyaW5nR3VpZGUgPSBvcmRlcmluZ0d1aWRlOwotCQlvcmRlcmluZ0d1aWRlID0gbmV3T3JkZXJpbmdHdWlkZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUsIG9sZE9yZGVyaW5nR3VpZGUsIG9yZGVyaW5nR3VpZGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZXNlbnRhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBwcmVzZW50YXRpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlbnRhdGlvbk5hbWUoU3RyaW5nIG5ld1ByZXNlbnRhdGlvbk5hbWUpIHsKLQkJU3RyaW5nIG9sZFByZXNlbnRhdGlvbk5hbWUgPSBwcmVzZW50YXRpb25OYW1lOwotCQlwcmVzZW50YXRpb25OYW1lID0gbmV3UHJlc2VudGF0aW9uTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUsIG9sZFByZXNlbnRhdGlvbk5hbWUsIHByZXNlbnRhdGlvbk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHByZXNzZWQoKSB7Ci0JCXJldHVybiBzdXBwcmVzc2VkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1cHByZXNzZWQoYm9vbGVhbiBuZXdTdXBwcmVzc2VkKSB7Ci0JCWJvb2xlYW4gb2xkU3VwcHJlc3NlZCA9IHN1cHByZXNzZWQ7Ci0JCXN1cHByZXNzZWQgPSBuZXdTdXBwcmVzc2VkOwotCQlib29sZWFuIG9sZFN1cHByZXNzZWRFU2V0ID0gc3VwcHJlc3NlZEVTZXQ7Ci0JCXN1cHByZXNzZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRCwgb2xkU3VwcHJlc3NlZCwgc3VwcHJlc3NlZCwgIW9sZFN1cHByZXNzZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRTdXBwcmVzc2VkKCkgewotCQlib29sZWFuIG9sZFN1cHByZXNzZWQgPSBzdXBwcmVzc2VkOwotCQlib29sZWFuIG9sZFN1cHByZXNzZWRFU2V0ID0gc3VwcHJlc3NlZEVTZXQ7Ci0JCXN1cHByZXNzZWQgPSBTVVBQUkVTU0VEX0VERUZBVUxUOwotCQlzdXBwcmVzc2VkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQsIG9sZFN1cHByZXNzZWQsIFNVUFBSRVNTRURfRURFRkFVTFQsIG9sZFN1cHByZXNzZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTdXBwcmVzc2VkKCkgewotCQlyZXR1cm4gc3VwcHJlc3NlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HUk9VUDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE93bmVkUnVsZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HUk9VUDoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cCgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOgotCQkJCXJldHVybiBnZXRPd25lZFJ1bGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU6Ci0JCQkJcmV0dXJuIGdldE9yZGVyaW5nR3VpZGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkJcmV0dXJuIGdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDoKLQkJCQlyZXR1cm4gaXNTdXBwcmVzc2VkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HUk9VUDoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEU6Ci0JCQkJZ2V0T3duZWRSdWxlKCkuY2xlYXIoKTsKLQkJCQlnZXRPd25lZFJ1bGUoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIENvbnN0cmFpbnQ+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJCWdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RFbGVtZW50UHJvcGVydHk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOgotCQkJCXNldEJyaWVmRGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOgotCQkJCXNldE9yZGVyaW5nR3VpZGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCQlzZXRQcmVzZW50YXRpb25OYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDoKLQkJCQlzZXRTdXBwcmVzc2VkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0dST1VQOgotCQkJCWdldEdyb3VwKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEU6Ci0JCQkJZ2V0T3duZWRSdWxlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJCWdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjoKLQkJCQlzZXRCcmllZkRlc2NyaXB0aW9uKEJSSUVGX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOgotCQkJCXNldE9yZGVyaW5nR3VpZGUoT1JERVJJTkdfR1VJREVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkJc2V0UHJlc2VudGF0aW9uTmFtZShQUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOgotCQkJCXVuc2V0U3VwcHJlc3NlZCgpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HUk9VUDoKLQkJCQlyZXR1cm4gZ3JvdXAgIT0gbnVsbCAmJiAhZ3JvdXAuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOgotCQkJCXJldHVybiAhZ2V0T3duZWRSdWxlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWToKLQkJCQlyZXR1cm4gIWdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIEJSSUVGX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBicmllZkRlc2NyaXB0aW9uICE9IG51bGwgOiAhQlJJRUZfREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGJyaWVmRGVzY3JpcHRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU6Ci0JCQkJcmV0dXJuIE9SREVSSU5HX0dVSURFX0VERUZBVUxUID09IG51bGwgPyBvcmRlcmluZ0d1aWRlICE9IG51bGwgOiAhT1JERVJJTkdfR1VJREVfRURFRkFVTFQuZXF1YWxzKG9yZGVyaW5nR3VpZGUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCQlyZXR1cm4gUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHByZXNlbnRhdGlvbk5hbWUgIT0gbnVsbCA6ICFQUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVC5lcXVhbHMocHJlc2VudGF0aW9uTmFtZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0U3VwcHJlc3NlZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXA6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBicmllZkRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChicmllZkRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG9yZGVyaW5nR3VpZGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG9yZGVyaW5nR3VpZGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByZXNlbnRhdGlvbk5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZXNlbnRhdGlvbk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN1cHByZXNzZWQ6ICIpOwotCQlpZiAoc3VwcHJlc3NlZEVTZXQpIHJlc3VsdC5hcHBlbmQoc3VwcHJlc3NlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NZXRob2RFbGVtZW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU5NDBmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RFbGVtZW50UHJvcGVydHlJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50UHJvcGVydHlJbXBsIGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RMaWJyYXJ5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kTGlicmFyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ1NWI5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RMaWJyYXJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kTGlicmFyeUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIExpYnJhcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwjZ2V0TWV0aG9kUGx1Z2luIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsI2dldE1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsI2dldFRvb2wgPGVtPlRvb2w8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RMaWJyYXJ5SW1wbCBleHRlbmRzIE1ldGhvZFVuaXRJbXBsIGltcGxlbWVudHMgTWV0aG9kTGlicmFyeSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUGx1Z2luKCkgPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kUGx1Z2luPiBtZXRob2RQbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkgPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBtZXRob2RDb25maWd1cmF0aW9uOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvb2woKSA8ZW0+VG9vbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9vbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb29sKCkgPGVtPlRvb2w8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRvb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdG9vbCA9IFRPT0xfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kTGlicmFyeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxNZXRob2RQbHVnaW4+IGdldE1ldGhvZFBsdWdpbigpIHsKLQkJaWYgKG1ldGhvZFBsdWdpbiA9PSBudWxsKSB7Ci0JCQltZXRob2RQbHVnaW4gPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8TWV0aG9kUGx1Z2luPihNZXRob2RQbHVnaW4uY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU4pOwotCQl9Ci0JCXJldHVybiBtZXRob2RQbHVnaW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCWlmIChtZXRob2RDb25maWd1cmF0aW9uID09IG51bGwpIHsKLQkJCW1ldGhvZENvbmZpZ3VyYXRpb24gPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4oTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX0NPTkZJR1VSQVRJT04pOwotCQl9Ci0JCXJldHVybiBtZXRob2RDb25maWd1cmF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbCgpIHsKLQkJcmV0dXJuIHRvb2w7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9vbChTdHJpbmcgbmV3VG9vbCkgewotCQlTdHJpbmcgb2xkVG9vbCA9IHRvb2w7Ci0JCXRvb2wgPSBuZXdUb29sOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19UT09MLCBvbGRUb29sLCB0b29sKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWV0aG9kUGx1Z2luKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX0NPTkZJR1VSQVRJT046Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNZXRob2RDb25maWd1cmF0aW9uKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOOgotCQkJCXJldHVybiBnZXRNZXRob2RQbHVnaW4oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX0NPTkZJR1VSQVRJT046Ci0JCQkJcmV0dXJuIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fVE9PTDoKLQkJCQlyZXR1cm4gZ2V0VG9vbCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOOgotCQkJCWdldE1ldGhvZFBsdWdpbigpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kUGx1Z2luKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RQbHVnaW4+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9DT05GSUdVUkFUSU9OOgotCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb24oKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb24oKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZENvbmZpZ3VyYXRpb24+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1RPT0w6Ci0JCQkJc2V0VG9vbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOOgotCQkJCWdldE1ldGhvZFBsdWdpbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfQ09ORklHVVJBVElPTjoKLQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1RPT0w6Ci0JCQkJc2V0VG9vbChUT09MX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTjoKLQkJCQlyZXR1cm4gbWV0aG9kUGx1Z2luICE9IG51bGwgJiYgIW1ldGhvZFBsdWdpbi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9DT05GSUdVUkFUSU9OOgotCQkJCXJldHVybiBtZXRob2RDb25maWd1cmF0aW9uICE9IG51bGwgJiYgIW1ldGhvZENvbmZpZ3VyYXRpb24uaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19UT09MOgotCQkJCXJldHVybiBUT09MX0VERUZBVUxUID09IG51bGwgPyB0b29sICE9IG51bGwgOiAhVE9PTF9FREVGQVVMVC5lcXVhbHModG9vbCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0b29sOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0b29sKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kTGlicmFyeUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFlMTlkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kUGFja2FnZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsI2dldFJldXNlZFBhY2thZ2UgPGVtPlJldXNlZCBQYWNrYWdlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsI2dldE1ldGhvZFBhY2thZ2UgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsI2lzR2xvYmFsIDxlbT5HbG9iYWw8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQYWNrYWdlSW1wbCBleHRlbmRzIE1ldGhvZEVsZW1lbnRJbXBsIGltcGxlbWVudHMgTWV0aG9kUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAxKCkgPGVtPkdyb3VwMTwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dsb2JhbCgpIDxlbT5HbG9iYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzR2xvYmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gR0xPQkFMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dsb2JhbCgpIDxlbT5HbG9iYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzR2xvYmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnbG9iYWwgPSBHTE9CQUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEdsb2JhbCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2xvYmFsRVNldDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBQ0tBR0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAxKCkgewotCQlpZiAoZ3JvdXAxID09IG51bGwpIHsKLQkJCWdyb3VwMSA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR1JPVVAxKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAxOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFJldXNlZFBhY2thZ2UoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8TWV0aG9kUGFja2FnZT4gZ2V0TWV0aG9kUGFja2FnZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMSgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkgewotCQlyZXR1cm4gZ2xvYmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdsb2JhbChib29sZWFuIG5ld0dsb2JhbCkgewotCQlib29sZWFuIG9sZEdsb2JhbCA9IGdsb2JhbDsKLQkJZ2xvYmFsID0gbmV3R2xvYmFsOwotCQlib29sZWFuIG9sZEdsb2JhbEVTZXQgPSBnbG9iYWxFU2V0OwotCQlnbG9iYWxFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMLCBvbGRHbG9iYWwsIGdsb2JhbCwgIW9sZEdsb2JhbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEdsb2JhbCgpIHsKLQkJYm9vbGVhbiBvbGRHbG9iYWwgPSBnbG9iYWw7Ci0JCWJvb2xlYW4gb2xkR2xvYmFsRVNldCA9IGdsb2JhbEVTZXQ7Ci0JCWdsb2JhbCA9IEdMT0JBTF9FREVGQVVMVDsKLQkJZ2xvYmFsRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCwgb2xkR2xvYmFsLCBHTE9CQUxfRURFRkFVTFQsIG9sZEdsb2JhbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEdsb2JhbCgpIHsKLQkJcmV0dXJuIGdsb2JhbEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HUk9VUDE6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDEoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19NRVRIT0RfUEFDS0FHRToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1ldGhvZFBhY2thZ2UoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dST1VQMToKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDEoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMSgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFOgotCQkJCXJldHVybiBnZXRSZXVzZWRQYWNrYWdlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFOgotCQkJCXJldHVybiBnZXRNZXRob2RQYWNrYWdlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDoKLQkJCQlyZXR1cm4gaXNHbG9iYWwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dST1VQMToKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRToKLQkJCQlnZXRSZXVzZWRQYWNrYWdlKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXVzZWRQYWNrYWdlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFOgotCQkJCWdldE1ldGhvZFBhY2thZ2UoKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZFBhY2thZ2UoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZFBhY2thZ2U+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDoKLQkJCQlzZXRHbG9iYWwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR1JPVVAxOgotCQkJCWdldEdyb3VwMSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRToKLQkJCQlnZXRSZXVzZWRQYWNrYWdlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFOgotCQkJCWdldE1ldGhvZFBhY2thZ2UoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMOgotCQkJCXVuc2V0R2xvYmFsKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dST1VQMToKLQkJCQlyZXR1cm4gZ3JvdXAxICE9IG51bGwgJiYgIWdyb3VwMS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFOgotCQkJCXJldHVybiAhZ2V0UmV1c2VkUGFja2FnZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0U6Ci0JCQkJcmV0dXJuICFnZXRNZXRob2RQYWNrYWdlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HTE9CQUw6Ci0JCQkJcmV0dXJuIGlzU2V0R2xvYmFsKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDE6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ2xvYmFsOiAiKTsKLQkJaWYgKGdsb2JhbEVTZXQpIHJlc3VsdC5hcHBlbmQoZ2xvYmFsKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZFBhY2thZ2VJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kUGx1Z2luSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kUGx1Z2luSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzIzYjU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZFBsdWdpbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZFBsdWdpbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgUGx1Z2luPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwjZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbiA8ZW0+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwjZ2V0TWV0aG9kUGFja2FnZSA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbCNpc1VzZXJDaGFuZ2VhYmxlIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQbHVnaW5JbXBsIGV4dGVuZHMgTWV0aG9kVW5pdEltcGwgaW1wbGVtZW50cyBNZXRob2RQbHVnaW4gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZmVyZW5jZWRNZXRob2RQbHVnaW4oKSA8ZW0+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZmVyZW5jZWRNZXRob2RQbHVnaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IHJlZmVyZW5jZWRNZXRob2RQbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RQYWNrYWdlKCkgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxNZXRob2RQYWNrYWdlPiBtZXRob2RQYWNrYWdlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVXNlckNoYW5nZWFibGUoKSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1VzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVVNFUl9DSEFOR0VBQkxFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VzZXJDaGFuZ2VhYmxlKCkgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNVc2VyQ2hhbmdlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlckNoYW5nZWFibGUgPSBVU0VSX0NIQU5HRUFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFVzZXIgQ2hhbmdlYWJsZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlckNoYW5nZWFibGVFU2V0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZFBsdWdpbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpIHsKLQkJaWYgKHJlZmVyZW5jZWRNZXRob2RQbHVnaW4gPT0gbnVsbCkgewotCQkJcmVmZXJlbmNlZE1ldGhvZFBsdWdpbiA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19SRUZFUkVOQ0VEX01FVEhPRF9QTFVHSU4pOwotCQl9Ci0JCXJldHVybiByZWZlcmVuY2VkTWV0aG9kUGx1Z2luOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxNZXRob2RQYWNrYWdlPiBnZXRNZXRob2RQYWNrYWdlKCkgewotCQlpZiAobWV0aG9kUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltZXRob2RQYWNrYWdlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PE1ldGhvZFBhY2thZ2U+KE1ldGhvZFBhY2thZ2UuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0UpOwotCQl9Ci0JCXJldHVybiBtZXRob2RQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXNlckNoYW5nZWFibGUoKSB7Ci0JCXJldHVybiB1c2VyQ2hhbmdlYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2VyQ2hhbmdlYWJsZShib29sZWFuIG5ld1VzZXJDaGFuZ2VhYmxlKSB7Ci0JCWJvb2xlYW4gb2xkVXNlckNoYW5nZWFibGUgPSB1c2VyQ2hhbmdlYWJsZTsKLQkJdXNlckNoYW5nZWFibGUgPSBuZXdVc2VyQ2hhbmdlYWJsZTsKLQkJYm9vbGVhbiBvbGRVc2VyQ2hhbmdlYWJsZUVTZXQgPSB1c2VyQ2hhbmdlYWJsZUVTZXQ7Ci0JCXVzZXJDaGFuZ2VhYmxlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFLCBvbGRVc2VyQ2hhbmdlYWJsZSwgdXNlckNoYW5nZWFibGUsICFvbGRVc2VyQ2hhbmdlYWJsZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFVzZXJDaGFuZ2VhYmxlKCkgewotCQlib29sZWFuIG9sZFVzZXJDaGFuZ2VhYmxlID0gdXNlckNoYW5nZWFibGU7Ci0JCWJvb2xlYW4gb2xkVXNlckNoYW5nZWFibGVFU2V0ID0gdXNlckNoYW5nZWFibGVFU2V0OwotCQl1c2VyQ2hhbmdlYWJsZSA9IFVTRVJfQ0hBTkdFQUJMRV9FREVGQVVMVDsKLQkJdXNlckNoYW5nZWFibGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEUsIG9sZFVzZXJDaGFuZ2VhYmxlLCBVU0VSX0NIQU5HRUFCTEVfRURFRkFVTFQsIG9sZFVzZXJDaGFuZ2VhYmxlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VXNlckNoYW5nZWFibGUoKSB7Ci0JCXJldHVybiB1c2VyQ2hhbmdlYWJsZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWV0aG9kUGFja2FnZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19SRUZFUkVOQ0VEX01FVEhPRF9QTFVHSU46Ci0JCQkJcmV0dXJuIGdldFJlZmVyZW5jZWRNZXRob2RQbHVnaW4oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRToKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUGFja2FnZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJCQlyZXR1cm4gaXNVc2VyQ2hhbmdlYWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19SRUZFUkVOQ0VEX01FVEhPRF9QTFVHSU46Ci0JCQkJZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFOgotCQkJCWdldE1ldGhvZFBhY2thZ2UoKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZFBhY2thZ2UoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZFBhY2thZ2U+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFOgotCQkJCXNldFVzZXJDaGFuZ2VhYmxlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fUkVGRVJFTkNFRF9NRVRIT0RfUExVR0lOOgotCQkJCWdldFJlZmVyZW5jZWRNZXRob2RQbHVnaW4oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRToKLQkJCQlnZXRNZXRob2RQYWNrYWdlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFOgotCQkJCXVuc2V0VXNlckNoYW5nZWFibGUoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19SRUZFUkVOQ0VEX01FVEhPRF9QTFVHSU46Ci0JCQkJcmV0dXJuIHJlZmVyZW5jZWRNZXRob2RQbHVnaW4gIT0gbnVsbCAmJiAhcmVmZXJlbmNlZE1ldGhvZFBsdWdpbi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0U6Ci0JCQkJcmV0dXJuIG1ldGhvZFBhY2thZ2UgIT0gbnVsbCAmJiAhbWV0aG9kUGFja2FnZS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFOgotCQkJCXJldHVybiBpc1NldFVzZXJDaGFuZ2VhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyZWZlcmVuY2VkTWV0aG9kUGx1Z2luOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZWZlcmVuY2VkTWV0aG9kUGx1Z2luKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB1c2VyQ2hhbmdlYWJsZTogIik7Ci0JCWlmICh1c2VyQ2hhbmdlYWJsZUVTZXQpIHJlc3VsdC5hcHBlbmQodXNlckNoYW5nZWFibGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kUGx1Z2luSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZFVuaXRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RVbml0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTM1ZjliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZFVuaXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RVbml0SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFVuaXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kVW5pdEltcGwjZ2V0Q29weXJpZ2h0IDxlbT5Db3B5cmlnaHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kVW5pdEltcGwjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RVbml0SW1wbCNnZXRDaGFuZ2VEYXRlIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RVbml0SW1wbCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RVbml0SW1wbCBleHRlbmRzIE1ldGhvZEVsZW1lbnRJbXBsIGltcGxlbWVudHMgTWV0aG9kVW5pdCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvcHlyaWdodCgpIDxlbT5Db3B5cmlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvcHlyaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWVJJR0hUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvcHlyaWdodCgpIDxlbT5Db3B5cmlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvcHlyaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb3B5cmlnaHQgPSBDT1BZUklHSFRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9ycygpIDxlbT5BdXRob3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRob3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF1dGhvcnMoKSA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdXRob3JzID0gQVVUSE9SU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEYXRlKCkgPGVtPkNoYW5nZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFhNTEdyZWdvcmlhbkNhbGVuZGFyIENIQU5HRV9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURhdGUoKSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYTUxHcmVnb3JpYW5DYWxlbmRhciBjaGFuZ2VEYXRlID0gQ0hBTkdFX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURlc2NyaXB0aW9uKCkgPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2hhbmdlRGVzY3JpcHRpb24gPSBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RVbml0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1VOSVQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb3B5cmlnaHQoKSB7Ci0JCXJldHVybiBjb3B5cmlnaHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weXJpZ2h0KFN0cmluZyBuZXdDb3B5cmlnaHQpIHsKLQkJU3RyaW5nIG9sZENvcHlyaWdodCA9IGNvcHlyaWdodDsKLQkJY29weXJpZ2h0ID0gbmV3Q29weXJpZ2h0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFQsIG9sZENvcHlyaWdodCwgY29weXJpZ2h0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdXRob3JzKCkgewotCQlyZXR1cm4gYXV0aG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRob3JzKFN0cmluZyBuZXdBdXRob3JzKSB7Ci0JCVN0cmluZyBvbGRBdXRob3JzID0gYXV0aG9yczsKLQkJYXV0aG9ycyA9IG5ld0F1dGhvcnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlMsIG9sZEF1dGhvcnMsIGF1dGhvcnMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0Q2hhbmdlRGF0ZSgpIHsKLQkJcmV0dXJuIGNoYW5nZURhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlRGF0ZShYTUxHcmVnb3JpYW5DYWxlbmRhciBuZXdDaGFuZ2VEYXRlKSB7Ci0JCVhNTEdyZWdvcmlhbkNhbGVuZGFyIG9sZENoYW5nZURhdGUgPSBjaGFuZ2VEYXRlOwotCQljaGFuZ2VEYXRlID0gbmV3Q2hhbmdlRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUsIG9sZENoYW5nZURhdGUsIGNoYW5nZURhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENoYW5nZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gY2hhbmdlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlRGVzY3JpcHRpb24oU3RyaW5nIG5ld0NoYW5nZURlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRDaGFuZ2VEZXNjcmlwdGlvbiA9IGNoYW5nZURlc2NyaXB0aW9uOwotCQljaGFuZ2VEZXNjcmlwdGlvbiA9IG5ld0NoYW5nZURlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04sIG9sZENoYW5nZURlc2NyaXB0aW9uLCBjaGFuZ2VEZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCXZlcnNpb24gPSBuZXdWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OLCBvbGRWZXJzaW9uLCB2ZXJzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFQ6Ci0JCQkJcmV0dXJuIGdldENvcHlyaWdodCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19BVVRIT1JTOgotCQkJCXJldHVybiBnZXRBdXRob3JzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOgotCQkJCXJldHVybiBnZXRDaGFuZ2VEYXRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gZ2V0VmVyc2lvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVDoKLQkJCQlzZXRDb3B5cmlnaHQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19BVVRIT1JTOgotCQkJCXNldEF1dGhvcnMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURToKLQkJCQlzZXRDaGFuZ2VEYXRlKChYTUxHcmVnb3JpYW5DYWxlbmRhciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQkJc2V0Q2hhbmdlRGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUOgotCQkJCXNldENvcHlyaWdodChDT1BZUklHSFRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUzoKLQkJCQlzZXRBdXRob3JzKEFVVEhPUlNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU6Ci0JCQkJc2V0Q2hhbmdlRGF0ZShDSEFOR0VfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQkJc2V0Q2hhbmdlRGVzY3JpcHRpb24oQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbihWRVJTSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUOgotCQkJCXJldHVybiBDT1BZUklHSFRfRURFRkFVTFQgPT0gbnVsbCA/IGNvcHlyaWdodCAhPSBudWxsIDogIUNPUFlSSUdIVF9FREVGQVVMVC5lcXVhbHMoY29weXJpZ2h0KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUzoKLQkJCQlyZXR1cm4gQVVUSE9SU19FREVGQVVMVCA9PSBudWxsID8gYXV0aG9ycyAhPSBudWxsIDogIUFVVEhPUlNfRURFRkFVTFQuZXF1YWxzKGF1dGhvcnMpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURToKLQkJCQlyZXR1cm4gQ0hBTkdFX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGNoYW5nZURhdGUgIT0gbnVsbCA6ICFDSEFOR0VfREFURV9FREVGQVVMVC5lcXVhbHMoY2hhbmdlRGF0ZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBjaGFuZ2VEZXNjcmlwdGlvbiAhPSBudWxsIDogIUNIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoY2hhbmdlRGVzY3JpcHRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJCXJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwgOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb3B5cmlnaHQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvcHlyaWdodCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXV0aG9yczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXV0aG9ycyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2hhbmdlRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2hhbmdlRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2hhbmdlRGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNoYW5nZURlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2ZXJzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kVW5pdEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NaWxlc3RvbmVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NaWxlc3RvbmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NTdmZTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWlsZXN0b25lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWlsZXN0b25lSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1pbGVzdG9uZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NaWxlc3RvbmVJbXBsI2dldFJlcXVpcmVkUmVzdWx0IDxlbT5SZXF1aXJlZCBSZXN1bHQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWxlc3RvbmVJbXBsIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsIGltcGxlbWVudHMgTWlsZXN0b25lIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXF1aXJlZFJlc3VsdCgpIDxlbT5SZXF1aXJlZCBSZXN1bHQ8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVxdWlyZWRSZXN1bHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IHJlcXVpcmVkUmVzdWx0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1pbGVzdG9uZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1JTEVTVE9ORTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRSZXF1aXJlZFJlc3VsdCgpIHsKLQkJaWYgKHJlcXVpcmVkUmVzdWx0ID09IG51bGwpIHsKLQkJCXJlcXVpcmVkUmVzdWx0ID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLk1JTEVTVE9ORV9fUkVRVUlSRURfUkVTVUxUKTsKLQkJfQotCQlyZXR1cm4gcmVxdWlyZWRSZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1JTEVTVE9ORV9fUkVRVUlSRURfUkVTVUxUOgotCQkJCXJldHVybiBnZXRSZXF1aXJlZFJlc3VsdCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1JTEVTVE9ORV9fUkVRVUlSRURfUkVTVUxUOgotCQkJCWdldFJlcXVpcmVkUmVzdWx0KCkuY2xlYXIoKTsKLQkJCQlnZXRSZXF1aXJlZFJlc3VsdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NSUxFU1RPTkVfX1JFUVVJUkVEX1JFU1VMVDoKLQkJCQlnZXRSZXF1aXJlZFJlc3VsdCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFQ6Ci0JCQkJcmV0dXJuIHJlcXVpcmVkUmVzdWx0ICE9IG51bGwgJiYgIXJlcXVpcmVkUmVzdWx0LmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJlcXVpcmVkUmVzdWx0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXF1aXJlZFJlc3VsdCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01pbGVzdG9uZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9OYW1lZEVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9OYW1lZEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1Zjc5NGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTmFtZWRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTmFtZWRFbGVtZW50SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5hbWVkIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTmFtZWRFbGVtZW50SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTmFtZWRFbGVtZW50SW1wbCBleHRlbmRzIEVsZW1lbnRJbXBsIGltcGxlbWVudHMgTmFtZWRFbGVtZW50IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOYW1lZEVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVF9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVF9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVF9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9OYW1lZEVsZW1lbnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvT3V0Y29tZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL091dGNvbWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZmE0YWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvT3V0Y29tZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogT3V0Y29tZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRjb21lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3V0Y29tZUltcGwgZXh0ZW5kcyBXb3JrUHJvZHVjdEltcGwgaW1wbGVtZW50cyBPdXRjb21lIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT3V0Y29tZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk9VVENPTUU7Ci0JfQotCi19IC8vT3V0Y29tZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QYWNrYWdlYWJsZUVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QYWNrYWdlYWJsZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNDdiN2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUGFja2FnZWFibGVFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQYWNrYWdlYWJsZUVsZW1lbnRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGFja2FnZWFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYWNrYWdlYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZWFibGVFbGVtZW50SW1wbCBleHRlbmRzIE5hbWVkRWxlbWVudEltcGwgaW1wbGVtZW50cyBQYWNrYWdlYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQYWNrYWdlYWJsZUVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QQUNLQUdFQUJMRV9FTEVNRU5UOwotCX0KLQotfSAvL1BhY2thZ2VhYmxlRWxlbWVudEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QaGFzZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1BoYXNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmFhNzk5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1BoYXNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQaGFzZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGhhc2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQaGFzZUltcGwgZXh0ZW5kcyBBY3Rpdml0eUltcGwgaW1wbGVtZW50cyBQaGFzZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBoYXNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUEhBU0U7Ci0JfQotCi19IC8vUGhhc2VJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUGxhbm5pbmdEYXRhSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUGxhbm5pbmdEYXRhSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2Y4NTgyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1BsYW5uaW5nRGF0YUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFBsYW5uaW5nRGF0YUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsI2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlBsYW5uaW5nRGF0YUltcGwjZ2V0UmFuayA8ZW0+UmFuazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsI2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBsYW5uaW5nRGF0YUltcGwgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEltcGwgaW1wbGVtZW50cyBQbGFubmluZ0RhdGEgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hEYXRlKCkgPGVtPkZpbmlzaCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2hEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFhNTEdyZWdvcmlhbkNhbGVuZGFyIEZJTklTSF9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaERhdGUoKSA8ZW0+RmluaXNoIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYTUxHcmVnb3JpYW5DYWxlbmRhciBmaW5pc2hEYXRlID0gRklOSVNIX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFuaygpIDxlbT5SYW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5LX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhbmsoKSA8ZW0+UmFuazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFuaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByYW5rID0gUkFOS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydERhdGUoKSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFhNTEdyZWdvcmlhbkNhbGVuZGFyIFNUQVJUX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnREYXRlKCkgPGVtPlN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhNTEdyZWdvcmlhbkNhbGVuZGFyIHN0YXJ0RGF0ZSA9IFNUQVJUX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGxhbm5pbmdEYXRhSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUExBTk5JTkdfREFUQTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0RmluaXNoRGF0ZSgpIHsKLQkJcmV0dXJuIGZpbmlzaERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluaXNoRGF0ZShYTUxHcmVnb3JpYW5DYWxlbmRhciBuZXdGaW5pc2hEYXRlKSB7Ci0JCVhNTEdyZWdvcmlhbkNhbGVuZGFyIG9sZEZpbmlzaERhdGUgPSBmaW5pc2hEYXRlOwotCQlmaW5pc2hEYXRlID0gbmV3RmluaXNoRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURSwgb2xkRmluaXNoRGF0ZSwgZmluaXNoRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmFuaygpIHsKLQkJcmV0dXJuIHJhbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmFuayhTdHJpbmcgbmV3UmFuaykgewotCQlTdHJpbmcgb2xkUmFuayA9IHJhbms7Ci0JCXJhbmsgPSBuZXdSYW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTkssIG9sZFJhbmssIHJhbmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0U3RhcnREYXRlKCkgewotCQlyZXR1cm4gc3RhcnREYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0RGF0ZShYTUxHcmVnb3JpYW5DYWxlbmRhciBuZXdTdGFydERhdGUpIHsKLQkJWE1MR3JlZ29yaWFuQ2FsZW5kYXIgb2xkU3RhcnREYXRlID0gc3RhcnREYXRlOwotCQlzdGFydERhdGUgPSBuZXdTdGFydERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURSwgb2xkU3RhcnREYXRlLCBzdGFydERhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEU6Ci0JCQkJcmV0dXJuIGdldEZpbmlzaERhdGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LOgotCQkJCXJldHVybiBnZXRSYW5rKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURToKLQkJCQlyZXR1cm4gZ2V0U3RhcnREYXRlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURToKLQkJCQlzZXRGaW5pc2hEYXRlKChYTUxHcmVnb3JpYW5DYWxlbmRhciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTks6Ci0JCQkJc2V0UmFuaygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURToKLQkJCQlzZXRTdGFydERhdGUoKFhNTEdyZWdvcmlhbkNhbGVuZGFyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFOgotCQkJCXNldEZpbmlzaERhdGUoRklOSVNIX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LOgotCQkJCXNldFJhbmsoUkFOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEU6Ci0JCQkJc2V0U3RhcnREYXRlKFNUQVJUX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFOgotCQkJCXJldHVybiBGSU5JU0hfREFURV9FREVGQVVMVCA9PSBudWxsID8gZmluaXNoRGF0ZSAhPSBudWxsIDogIUZJTklTSF9EQVRFX0VERUZBVUxULmVxdWFscyhmaW5pc2hEYXRlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LOgotCQkJCXJldHVybiBSQU5LX0VERUZBVUxUID09IG51bGwgPyByYW5rICE9IG51bGwgOiAhUkFOS19FREVGQVVMVC5lcXVhbHMocmFuayk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURToKLQkJCQlyZXR1cm4gU1RBUlRfREFURV9FREVGQVVMVCA9PSBudWxsID8gc3RhcnREYXRlICE9IG51bGwgOiAhU1RBUlRfREFURV9FREVGQVVMVC5lcXVhbHMoc3RhcnREYXRlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGZpbmlzaERhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpbmlzaERhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJhbms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJhbmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0RGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhcnREYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUGxhbm5pbmdEYXRhSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1ByYWN0aWNlRGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QcmFjdGljZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWViNjVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1ByYWN0aWNlRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcmFjdGljZURlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmFjdGljZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCNnZXRBZGRpdGlvbmFsSW5mbyA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsI2dldEFwcGxpY2F0aW9uIDxlbT5BcHBsaWNhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCNnZXRCYWNrZ3JvdW5kIDxlbT5CYWNrZ3JvdW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsI2dldEdvYWxzIDxlbT5Hb2FsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCNnZXRMZXZlbHNPZkFkb3B0aW9uIDxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0UHJvYmxlbSA8ZW0+UHJvYmxlbTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByYWN0aWNlRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIFByYWN0aWNlRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZGRpdGlvbmFsSW5mbygpIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFkZGl0aW9uYWxJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBRERJVElPTkFMX0lORk9fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkaXRpb25hbEluZm8oKSA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRpdGlvbmFsSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IEFERElUSU9OQUxfSU5GT19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcHBsaWNhdGlvbigpIDxlbT5BcHBsaWNhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXBwbGljYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFwcGxpY2F0aW9uKCkgPGVtPkFwcGxpY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhcHBsaWNhdGlvbiA9IEFQUExJQ0FUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhY2tncm91bmQoKSA8ZW0+QmFja2dyb3VuZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFja2dyb3VuZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS0dST1VORF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYWNrZ3JvdW5kKCkgPGVtPkJhY2tncm91bmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhY2tncm91bmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYmFja2dyb3VuZCA9IEJBQ0tHUk9VTkRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R29hbHMoKSA8ZW0+R29hbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdvYWxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHT0FMU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHb2FscygpIDxlbT5Hb2FsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R29hbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ29hbHMgPSBHT0FMU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkgPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsc09mQWRvcHRpb24oKSA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxldmVsc09mQWRvcHRpb24gPSBMRVZFTFNfT0ZfQURPUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvYmxlbSgpIDxlbT5Qcm9ibGVtPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9ibGVtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9CTEVNX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2JsZW0oKSA8ZW0+UHJvYmxlbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvYmxlbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcm9ibGVtID0gUFJPQkxFTV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcmFjdGljZURlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsSW5mbygpIHsKLQkJcmV0dXJuIGFkZGl0aW9uYWxJbmZvOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkZGl0aW9uYWxJbmZvKFN0cmluZyBuZXdBZGRpdGlvbmFsSW5mbykgewotCQlTdHJpbmcgb2xkQWRkaXRpb25hbEluZm8gPSBhZGRpdGlvbmFsSW5mbzsKLQkJYWRkaXRpb25hbEluZm8gPSBuZXdBZGRpdGlvbmFsSW5mbzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPLCBvbGRBZGRpdGlvbmFsSW5mbywgYWRkaXRpb25hbEluZm8pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFwcGxpY2F0aW9uKCkgewotCQlyZXR1cm4gYXBwbGljYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXBwbGljYXRpb24oU3RyaW5nIG5ld0FwcGxpY2F0aW9uKSB7Ci0JCVN0cmluZyBvbGRBcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOwotCQlhcHBsaWNhdGlvbiA9IG5ld0FwcGxpY2F0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTiwgb2xkQXBwbGljYXRpb24sIGFwcGxpY2F0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gYmFja2dyb3VuZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kKFN0cmluZyBuZXdCYWNrZ3JvdW5kKSB7Ci0JCVN0cmluZyBvbGRCYWNrZ3JvdW5kID0gYmFja2dyb3VuZDsKLQkJYmFja2dyb3VuZCA9IG5ld0JhY2tncm91bmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQsIG9sZEJhY2tncm91bmQsIGJhY2tncm91bmQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEdvYWxzKCkgewotCQlyZXR1cm4gZ29hbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R29hbHMoU3RyaW5nIG5ld0dvYWxzKSB7Ci0JCVN0cmluZyBvbGRHb2FscyA9IGdvYWxzOwotCQlnb2FscyA9IG5ld0dvYWxzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUywgb2xkR29hbHMsIGdvYWxzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMZXZlbHNPZkFkb3B0aW9uKCkgewotCQlyZXR1cm4gbGV2ZWxzT2ZBZG9wdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbHNPZkFkb3B0aW9uKFN0cmluZyBuZXdMZXZlbHNPZkFkb3B0aW9uKSB7Ci0JCVN0cmluZyBvbGRMZXZlbHNPZkFkb3B0aW9uID0gbGV2ZWxzT2ZBZG9wdGlvbjsKLQkJbGV2ZWxzT2ZBZG9wdGlvbiA9IG5ld0xldmVsc09mQWRvcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTiwgb2xkTGV2ZWxzT2ZBZG9wdGlvbiwgbGV2ZWxzT2ZBZG9wdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvYmxlbSgpIHsKLQkJcmV0dXJuIHByb2JsZW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvYmxlbShTdHJpbmcgbmV3UHJvYmxlbSkgewotCQlTdHJpbmcgb2xkUHJvYmxlbSA9IHByb2JsZW07Ci0JCXByb2JsZW0gPSBuZXdQcm9ibGVtOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNLCBvbGRQcm9ibGVtLCBwcm9ibGVtKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk86Ci0JCQkJcmV0dXJuIGdldEFkZGl0aW9uYWxJbmZvKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJCXJldHVybiBnZXRBcHBsaWNhdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EOgotCQkJCXJldHVybiBnZXRCYWNrZ3JvdW5kKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTOgotCQkJCXJldHVybiBnZXRHb2FscygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT046Ci0JCQkJcmV0dXJuIGdldExldmVsc09mQWRvcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTToKLQkJCQlyZXR1cm4gZ2V0UHJvYmxlbSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTzoKLQkJCQlzZXRBZGRpdGlvbmFsSW5mbygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJCXNldEFwcGxpY2F0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORDoKLQkJCQlzZXRCYWNrZ3JvdW5kKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFM6Ci0JCQkJc2V0R29hbHMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT046Ci0JCQkJc2V0TGV2ZWxzT2ZBZG9wdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU06Ci0JCQkJc2V0UHJvYmxlbSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk86Ci0JCQkJc2V0QWRkaXRpb25hbEluZm8oQURESVRJT05BTF9JTkZPX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJCXNldEFwcGxpY2F0aW9uKEFQUExJQ0FUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQ6Ci0JCQkJc2V0QmFja2dyb3VuZChCQUNLR1JPVU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTOgotCQkJCXNldEdvYWxzKEdPQUxTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTjoKLQkJCQlzZXRMZXZlbHNPZkFkb3B0aW9uKExFVkVMU19PRl9BRE9QVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNOgotCQkJCXNldFByb2JsZW0oUFJPQkxFTV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTzoKLQkJCQlyZXR1cm4gQURESVRJT05BTF9JTkZPX0VERUZBVUxUID09IG51bGwgPyBhZGRpdGlvbmFsSW5mbyAhPSBudWxsIDogIUFERElUSU9OQUxfSU5GT19FREVGQVVMVC5lcXVhbHMoYWRkaXRpb25hbEluZm8pOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTjoKLQkJCQlyZXR1cm4gQVBQTElDQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGFwcGxpY2F0aW9uICE9IG51bGwgOiAhQVBQTElDQVRJT05fRURFRkFVTFQuZXF1YWxzKGFwcGxpY2F0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORDoKLQkJCQlyZXR1cm4gQkFDS0dST1VORF9FREVGQVVMVCA9PSBudWxsID8gYmFja2dyb3VuZCAhPSBudWxsIDogIUJBQ0tHUk9VTkRfRURFRkFVTFQuZXF1YWxzKGJhY2tncm91bmQpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUzoKLQkJCQlyZXR1cm4gR09BTFNfRURFRkFVTFQgPT0gbnVsbCA/IGdvYWxzICE9IG51bGwgOiAhR09BTFNfRURFRkFVTFQuZXF1YWxzKGdvYWxzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OOgotCQkJCXJldHVybiBMRVZFTFNfT0ZfQURPUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGxldmVsc09mQWRvcHRpb24gIT0gbnVsbCA6ICFMRVZFTFNfT0ZfQURPUFRJT05fRURFRkFVTFQuZXF1YWxzKGxldmVsc09mQWRvcHRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNOgotCQkJCXJldHVybiBQUk9CTEVNX0VERUZBVUxUID09IG51bGwgPyBwcm9ibGVtICE9IG51bGwgOiAhUFJPQkxFTV9FREVGQVVMVC5lcXVhbHMocHJvYmxlbSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhZGRpdGlvbmFsSW5mbzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWRkaXRpb25hbEluZm8pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFwcGxpY2F0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhcHBsaWNhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYmFja2dyb3VuZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYmFja2dyb3VuZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ29hbHM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdvYWxzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbHNPZkFkb3B0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbHNPZkFkb3B0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcm9ibGVtOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcm9ibGVtKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QcmFjdGljZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1ByYWN0aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWRiYWQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1ByYWN0aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJhY3RpY2VJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmFjdGljZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VJbXBsI2dldEFjdGl2aXR5UmVmZXJlbmNlIDxlbT5BY3Rpdml0eSBSZWZlcmVuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VJbXBsI2dldENvbnRlbnRSZWZlcmVuY2UgPGVtPkNvbnRlbnQgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlSW1wbCNnZXRTdWJQcmFjdGljZSA8ZW0+U3ViIFByYWN0aWNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJhY3RpY2VJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgUHJhY3RpY2UgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJhY3RpY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlBSQUNUSUNFX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0QWN0aXZpdHlSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0Q29udGVudFJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxQcmFjdGljZT4gZ2V0U3ViUHJhY3RpY2UoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0U6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTdWJQcmFjdGljZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFOgotCQkJCXJldHVybiBnZXRBY3Rpdml0eVJlZmVyZW5jZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRToKLQkJCQlyZXR1cm4gZ2V0Q29udGVudFJlZmVyZW5jZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0U6Ci0JCQkJcmV0dXJuIGdldFN1YlByYWN0aWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0U6Ci0JCQkJZ2V0QWN0aXZpdHlSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJCWdldEFjdGl2aXR5UmVmZXJlbmNlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFOgotCQkJCWdldENvbnRlbnRSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJCWdldENvbnRlbnRSZWZlcmVuY2UoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFOgotCQkJCWdldFN1YlByYWN0aWNlKCkuY2xlYXIoKTsKLQkJCQlnZXRTdWJQcmFjdGljZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUHJhY3RpY2U+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRToKLQkJCQlnZXRBY3Rpdml0eVJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRToKLQkJCQlnZXRDb250ZW50UmVmZXJlbmNlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRToKLQkJCQlnZXRTdWJQcmFjdGljZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRToKLQkJCQlyZXR1cm4gIWdldEFjdGl2aXR5UmVmZXJlbmNlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRToKLQkJCQlyZXR1cm4gIWdldENvbnRlbnRSZWZlcmVuY2UoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRToKLQkJCQlyZXR1cm4gIWdldFN1YlByYWN0aWNlKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9QcmFjdGljZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0ZDY0Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc0NvbXBvbmVudEltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIENvbXBvbmVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRDb3B5cmlnaHQgPGVtPkNvcHlyaWdodDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRJbnRlcmZhY2UgPGVtPkludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRQcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsI2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEltcGwgZXh0ZW5kcyBQcm9jZXNzUGFja2FnZUltcGwgaW1wbGVtZW50cyBQcm9jZXNzQ29tcG9uZW50IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29weXJpZ2h0KCkgPGVtPkNvcHlyaWdodDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29weXJpZ2h0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT1BZUklHSFRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29weXJpZ2h0KCkgPGVtPkNvcHlyaWdodDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29weXJpZ2h0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvcHlyaWdodCA9IENPUFlSSUdIVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEludGVyZmFjZSgpIDxlbT5JbnRlcmZhY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgaW50ZXJmYWNlXzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2Nlc3MoKSA8ZW0+UHJvY2VzczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgcHJvY2VzczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3JzKCkgPGVtPkF1dGhvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF1dGhvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUlNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9ycygpIDxlbT5BdXRob3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRob3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF1dGhvcnMgPSBBVVRIT1JTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURhdGUoKSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgQ0hBTkdFX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGF0ZSgpIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhNTEdyZWdvcmlhbkNhbGVuZGFyIGNoYW5nZURhdGUgPSBDSEFOR0VfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjaGFuZ2VEZXNjcmlwdGlvbiA9IENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NDb21wb25lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvcHlyaWdodCgpIHsKLQkJcmV0dXJuIGNvcHlyaWdodDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3B5cmlnaHQoU3RyaW5nIG5ld0NvcHlyaWdodCkgewotCQlTdHJpbmcgb2xkQ29weXJpZ2h0ID0gY29weXJpZ2h0OwotCQljb3B5cmlnaHQgPSBuZXdDb3B5cmlnaHQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVCwgb2xkQ29weXJpZ2h0LCBjb3B5cmlnaHQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBnZXRJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBpbnRlcmZhY2VfOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEludGVyZmFjZShQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIG5ld0ludGVyZmFjZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIG9sZEludGVyZmFjZSA9IGludGVyZmFjZV87Ci0JCWludGVyZmFjZV8gPSBuZXdJbnRlcmZhY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRSwgb2xkSW50ZXJmYWNlLCBuZXdJbnRlcmZhY2UpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEludGVyZmFjZShQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIG5ld0ludGVyZmFjZSkgewotCQlpZiAobmV3SW50ZXJmYWNlICE9IGludGVyZmFjZV8pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGludGVyZmFjZV8gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaW50ZXJmYWNlXykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SW50ZXJmYWNlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0ludGVyZmFjZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRJbnRlcmZhY2UobmV3SW50ZXJmYWNlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRSwgbmV3SW50ZXJmYWNlLCBuZXdJbnRlcmZhY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlyZXR1cm4gcHJvY2VzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgbmV3UHJvY2VzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIG9sZFByb2Nlc3MgPSBwcm9jZXNzOwotCQlwcm9jZXNzID0gbmV3UHJvY2VzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgb2xkUHJvY2VzcywgbmV3UHJvY2Vzcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvY2VzcyhvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIG5ld1Byb2Nlc3MpIHsKLQkJaWYgKG5ld1Byb2Nlc3MgIT0gcHJvY2VzcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJvY2VzcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwcm9jZXNzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UHJvY2VzcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQcm9jZXNzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcm9jZXNzKG5ld1Byb2Nlc3MsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgbmV3UHJvY2VzcywgbmV3UHJvY2VzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXV0aG9ycygpIHsKLQkJcmV0dXJuIGF1dGhvcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0aG9ycyhTdHJpbmcgbmV3QXV0aG9ycykgewotCQlTdHJpbmcgb2xkQXV0aG9ycyA9IGF1dGhvcnM7Ci0JCWF1dGhvcnMgPSBuZXdBdXRob3JzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTLCBvbGRBdXRob3JzLCBhdXRob3JzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhNTEdyZWdvcmlhbkNhbGVuZGFyIGdldENoYW5nZURhdGUoKSB7Ci0JCXJldHVybiBjaGFuZ2VEYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoYW5nZURhdGUoWE1MR3JlZ29yaWFuQ2FsZW5kYXIgbmV3Q2hhbmdlRGF0ZSkgewotCQlYTUxHcmVnb3JpYW5DYWxlbmRhciBvbGRDaGFuZ2VEYXRlID0gY2hhbmdlRGF0ZTsKLQkJY2hhbmdlRGF0ZSA9IG5ld0NoYW5nZURhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFLCBvbGRDaGFuZ2VEYXRlLCBjaGFuZ2VEYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDaGFuZ2VEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGNoYW5nZURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoYW5nZURlc2NyaXB0aW9uKFN0cmluZyBuZXdDaGFuZ2VEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkQ2hhbmdlRGVzY3JpcHRpb24gPSBjaGFuZ2VEZXNjcmlwdGlvbjsKLQkJY2hhbmdlRGVzY3JpcHRpb24gPSBuZXdDaGFuZ2VEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OLCBvbGRDaGFuZ2VEZXNjcmlwdGlvbiwgY2hhbmdlRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIG5ld1ZlcnNpb24pIHsKLQkJU3RyaW5nIG9sZFZlcnNpb24gPSB2ZXJzaW9uOwotCQl2ZXJzaW9uID0gbmV3VmVyc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFOgotCQkJCXJldHVybiBiYXNpY1NldEludGVyZmFjZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQcm9jZXNzKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVDoKLQkJCQlyZXR1cm4gZ2V0Q29weXJpZ2h0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gZ2V0SW50ZXJmYWNlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1M6Ci0JCQkJcmV0dXJuIGdldFByb2Nlc3MoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUzoKLQkJCQlyZXR1cm4gZ2V0QXV0aG9ycygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJCQlyZXR1cm4gZ2V0Q2hhbmdlRGF0ZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldENoYW5nZURlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFQ6Ci0JCQkJc2V0Q29weXJpZ2h0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFOgotCQkJCXNldEludGVyZmFjZSgoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTOgotCQkJCXNldFByb2Nlc3MoKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUzoKLQkJCQlzZXRBdXRob3JzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEU6Ci0JCQkJc2V0Q2hhbmdlRGF0ZSgoWE1MR3JlZ29yaWFuQ2FsZW5kYXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJCXNldENoYW5nZURlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVDoKLQkJCQlzZXRDb3B5cmlnaHQoQ09QWVJJR0hUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRToKLQkJCQlzZXRJbnRlcmZhY2UoKFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTOgotCQkJCXNldFByb2Nlc3MoKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOgotCQkJCXNldEF1dGhvcnMoQVVUSE9SU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJCQlzZXRDaGFuZ2VEYXRlKENIQU5HRV9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCQlzZXRDaGFuZ2VEZXNjcmlwdGlvbihDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKFZFUlNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFQ6Ci0JCQkJcmV0dXJuIENPUFlSSUdIVF9FREVGQVVMVCA9PSBudWxsID8gY29weXJpZ2h0ICE9IG51bGwgOiAhQ09QWVJJR0hUX0VERUZBVUxULmVxdWFscyhjb3B5cmlnaHQpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGludGVyZmFjZV8gIT0gbnVsbDsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCQlyZXR1cm4gcHJvY2VzcyAhPSBudWxsOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOgotCQkJCXJldHVybiBBVVRIT1JTX0VERUZBVUxUID09IG51bGwgPyBhdXRob3JzICE9IG51bGwgOiAhQVVUSE9SU19FREVGQVVMVC5lcXVhbHMoYXV0aG9ycyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFOgotCQkJCXJldHVybiBDSEFOR0VfREFURV9FREVGQVVMVCA9PSBudWxsID8gY2hhbmdlRGF0ZSAhPSBudWxsIDogIUNIQU5HRV9EQVRFX0VERUZBVUxULmVxdWFscyhjaGFuZ2VEYXRlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGNoYW5nZURlc2NyaXB0aW9uICE9IG51bGwgOiAhQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhjaGFuZ2VEZXNjcmlwdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIFZFUlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IHZlcnNpb24gIT0gbnVsbCA6ICFWRVJTSU9OX0VERUZBVUxULmVxdWFscyh2ZXJzaW9uKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNvcHlyaWdodDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29weXJpZ2h0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdXRob3JzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdXRob3JzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjaGFuZ2VEYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjaGFuZ2VEYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjaGFuZ2VEZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2hhbmdlRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZlcnNpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZlcnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzQ29tcG9uZW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWZjNzFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsI2dldEludGVyZmFjZVNwZWNpZmljYXRpb24gPGVtPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsI2dldEludGVyZmFjZUlPIDxlbT5JbnRlcmZhY2UgSU88L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJbXBsIGltcGxlbWVudHMgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxUYXNrRGVzY3JpcHRvcj4gZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXRJbnRlcmZhY2VJTygpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU86Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRJbnRlcmZhY2VJTygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTjoKLQkJCQlyZXR1cm4gZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPOgotCQkJCXJldHVybiBnZXRJbnRlcmZhY2VJTygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTjoKLQkJCQlnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCkuY2xlYXIoKTsKLQkJCQlnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUYXNrRGVzY3JpcHRvcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTzoKLQkJCQlnZXRJbnRlcmZhY2VJTygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW50ZXJmYWNlSU8oKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTjoKLQkJCQlnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU86Ci0JCQkJZ2V0SW50ZXJmYWNlSU8oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OOgotCQkJCXJldHVybiAhZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTzoKLQkJCQlyZXR1cm4gIWdldEludGVyZmFjZUlPKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJjMTNmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFNjb3BlIDxlbT5TY29wZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFVzYWdlTm90ZXMgPGVtPlVzYWdlIE5vdGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCBleHRlbmRzIEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgUHJvY2Vzc0Rlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NvcGUoKSA8ZW0+U2NvcGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTQ09QRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY29wZSgpIDxlbT5TY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2NvcGUgPSBTQ09QRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2FnZU5vdGVzKCkgPGVtPlVzYWdlIE5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVc2FnZU5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVU0FHRV9OT1RFU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2FnZU5vdGVzKCkgPGVtPlVzYWdlIE5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVc2FnZU5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVzYWdlTm90ZXMgPSBVU0FHRV9OT1RFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2NvcGUoKSB7Ci0JCXJldHVybiBzY29wZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTY29wZShTdHJpbmcgbmV3U2NvcGUpIHsKLQkJU3RyaW5nIG9sZFNjb3BlID0gc2NvcGU7Ci0JCXNjb3BlID0gbmV3U2NvcGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEUsIG9sZFNjb3BlLCBzY29wZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXNhZ2VOb3RlcygpIHsKLQkJcmV0dXJuIHVzYWdlTm90ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNhZ2VOb3RlcyhTdHJpbmcgbmV3VXNhZ2VOb3RlcykgewotCQlTdHJpbmcgb2xkVXNhZ2VOb3RlcyA9IHVzYWdlTm90ZXM7Ci0JCXVzYWdlTm90ZXMgPSBuZXdVc2FnZU5vdGVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTLCBvbGRVc2FnZU5vdGVzLCB1c2FnZU5vdGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQkJCXJldHVybiBnZXRTY29wZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTOgotCQkJCXJldHVybiBnZXRVc2FnZU5vdGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRToKLQkJCQlzZXRTY29wZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVM6Ci0JCQkJc2V0VXNhZ2VOb3RlcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQkJCXNldFNjb3BlKFNDT1BFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVM6Ci0JCQkJc2V0VXNhZ2VOb3RlcyhVU0FHRV9OT1RFU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEU6Ci0JCQkJcmV0dXJuIFNDT1BFX0VERUZBVUxUID09IG51bGwgPyBzY29wZSAhPSBudWxsIDogIVNDT1BFX0VERUZBVUxULmVxdWFscyhzY29wZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVM6Ci0JCQkJcmV0dXJuIFVTQUdFX05PVEVTX0VERUZBVUxUID09IG51bGwgPyB1c2FnZU5vdGVzICE9IG51bGwgOiAhVVNBR0VfTk9URVNfRURFRkFVTFQuZXF1YWxzKHVzYWdlTm90ZXMpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc2NvcGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNjb3BlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB1c2FnZU5vdGVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1c2FnZU5vdGVzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YmJjYTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NFbGVtZW50SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRWxlbWVudEltcGwgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgUHJvY2Vzc0VsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfRUxFTUVOVDsKLQl9Ci0KLX0gLy9Qcm9jZXNzRWxlbWVudEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDViNzM4MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc0ltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NJbXBsI2dldEluY2x1ZGVzUGF0dGVybiA8ZW0+SW5jbHVkZXMgUGF0dGVybjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzSW1wbCNnZXREZWZhdWx0Q29udGV4dCA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NJbXBsI2dldFZhbGlkQ29udGV4dCA8ZW0+VmFsaWQgQ29udGV4dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzSW1wbCNnZXREaWFncmFtVVJJIDxlbT5EaWFncmFtIFVSSTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NJbXBsIGV4dGVuZHMgQWN0aXZpdHlJbXBsIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5jbHVkZXNQYXR0ZXJuKCkgPGVtPkluY2x1ZGVzIFBhdHRlcm48L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5jbHVkZXNQYXR0ZXJuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBpbmNsdWRlc1BhdHRlcm47Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdENvbnRleHQoKSA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0Q29udGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT05URVhUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRDb250ZXh0KCkgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdENvbnRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENvbnRleHQgPSBERUZBVUxUX0NPTlRFWFRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWxpZENvbnRleHQoKSA8ZW0+VmFsaWQgQ29udGV4dDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWxpZENvbnRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IHZhbGlkQ29udGV4dDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaWFncmFtVVJJKCkgPGVtPkRpYWdyYW0gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaWFncmFtVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBESUFHUkFNX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaWFncmFtVVJJKCkgPGVtPkRpYWdyYW0gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaWFncmFtVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRpYWdyYW1VUkkgPSBESUFHUkFNX1VSSV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRJbmNsdWRlc1BhdHRlcm4oKSB7Ci0JCWlmIChpbmNsdWRlc1BhdHRlcm4gPT0gbnVsbCkgewotCQkJaW5jbHVkZXNQYXR0ZXJuID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk4pOwotCQl9Ci0JCXJldHVybiBpbmNsdWRlc1BhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRDb250ZXh0KFN0cmluZyBuZXdEZWZhdWx0Q29udGV4dCkgewotCQlTdHJpbmcgb2xkRGVmYXVsdENvbnRleHQgPSBkZWZhdWx0Q29udGV4dDsKLQkJZGVmYXVsdENvbnRleHQgPSBuZXdEZWZhdWx0Q29udGV4dDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQsIG9sZERlZmF1bHRDb250ZXh0LCBkZWZhdWx0Q29udGV4dCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFZhbGlkQ29udGV4dCgpIHsKLQkJaWYgKHZhbGlkQ29udGV4dCA9PSBudWxsKSB7Ci0JCQl2YWxpZENvbnRleHQgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuUFJPQ0VTU19fVkFMSURfQ09OVEVYVCk7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkQ29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpYWdyYW1VUkkoKSB7Ci0JCXJldHVybiBkaWFncmFtVVJJOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpYWdyYW1VUkkoU3RyaW5nIG5ld0RpYWdyYW1VUkkpIHsKLQkJU3RyaW5nIG9sZERpYWdyYW1VUkkgPSBkaWFncmFtVVJJOwotCQlkaWFncmFtVVJJID0gbmV3RGlhZ3JhbVVSSTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX19ESUFHUkFNX1VSSSwgb2xkRGlhZ3JhbVVSSSwgZGlhZ3JhbVVSSSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOOgotCQkJCXJldHVybiBnZXRJbmNsdWRlc1BhdHRlcm4oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fVkFMSURfQ09OVEVYVDoKLQkJCQlyZXR1cm4gZ2V0VmFsaWRDb250ZXh0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fRElBR1JBTV9VUkk6Ci0JCQkJcmV0dXJuIGdldERpYWdyYW1VUkkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOOgotCQkJCWdldEluY2x1ZGVzUGF0dGVybigpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5jbHVkZXNQYXR0ZXJuKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOgotCQkJCXNldERlZmF1bHRDb250ZXh0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUOgotCQkJCWdldFZhbGlkQ29udGV4dCgpLmNsZWFyKCk7Ci0JCQkJZ2V0VmFsaWRDb250ZXh0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fRElBR1JBTV9VUkk6Ci0JCQkJc2V0RGlhZ3JhbVVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk46Ci0JCQkJZ2V0SW5jbHVkZXNQYXR0ZXJuKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOgotCQkJCXNldERlZmF1bHRDb250ZXh0KERFRkFVTFRfQ09OVEVYVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQ6Ci0JCQkJZ2V0VmFsaWRDb250ZXh0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fRElBR1JBTV9VUkk6Ci0JCQkJc2V0RGlhZ3JhbVVSSShESUFHUkFNX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTjoKLQkJCQlyZXR1cm4gaW5jbHVkZXNQYXR0ZXJuICE9IG51bGwgJiYgIWluY2x1ZGVzUGF0dGVybi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOgotCQkJCXJldHVybiBERUZBVUxUX0NPTlRFWFRfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRDb250ZXh0ICE9IG51bGwgOiAhREVGQVVMVF9DT05URVhUX0VERUZBVUxULmVxdWFscyhkZWZhdWx0Q29udGV4dCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fVkFMSURfQ09OVEVYVDoKLQkJCQlyZXR1cm4gdmFsaWRDb250ZXh0ICE9IG51bGwgJiYgIXZhbGlkQ29udGV4dC5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fRElBR1JBTV9VUkk6Ci0JCQkJcmV0dXJuIERJQUdSQU1fVVJJX0VERUZBVUxUID09IG51bGwgPyBkaWFncmFtVVJJICE9IG51bGwgOiAhRElBR1JBTV9VUklfRURFRkFVTFQuZXF1YWxzKGRpYWdyYW1VUkkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaW5jbHVkZXNQYXR0ZXJuOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbmNsdWRlc1BhdHRlcm4pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRDb250ZXh0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0Q29udGV4dCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsaWRDb250ZXh0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWxpZENvbnRleHQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRpYWdyYW1VUkk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRpYWdyYW1VUkkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc1BhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZGZhOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc1BhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzUGFja2FnZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsI2dldFByb2Nlc3NFbGVtZW50IDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUGFja2FnZUltcGwgZXh0ZW5kcyBNZXRob2RQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFByb2Nlc3NQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFByb2Nlc3NFbGVtZW50PiBnZXRQcm9jZXNzRWxlbWVudCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb2Nlc3NFbGVtZW50KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0UHJvY2Vzc0VsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UOgotCQkJCWdldFByb2Nlc3NFbGVtZW50KCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9jZXNzRWxlbWVudCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnQ+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UOgotCQkJCWdldFByb2Nlc3NFbGVtZW50KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuICFnZXRQcm9jZXNzRWxlbWVudCgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJvY2Vzc1BhY2thZ2VJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE1OWNjNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwjZ2V0R3JvdXA0IDxlbT5Hcm91cDQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsI2dldEJhc2VQcm9jZXNzIDxlbT5CYXNlIFByb2Nlc3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwgZXh0ZW5kcyBQcm9jZXNzSW1wbCBpbXBsZW1lbnRzIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDQoKSA8ZW0+R3JvdXA0PC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwNCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXA0OwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXA0KCkgewotCQlpZiAoZ3JvdXA0ID09IG51bGwpIHsKLQkJCWdyb3VwNCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUDQpOwotCQl9Ci0JCXJldHVybiBncm91cDQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0QmFzZVByb2Nlc3MoKSB7Ci0JCXJldHVybiBnZXRHcm91cDQoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRV9QUk9DRVNTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVA0OgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXA0KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQNDoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDQoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwNCgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRV9QUk9DRVNTOgotCQkJCXJldHVybiBnZXRCYXNlUHJvY2VzcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQNDoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXA0KCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VfUFJPQ0VTUzoKLQkJCQlnZXRCYXNlUHJvY2VzcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QmFzZVByb2Nlc3MoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVA0OgotCQkJCWdldEdyb3VwNCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VfUFJPQ0VTUzoKLQkJCQlnZXRCYXNlUHJvY2VzcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVA0OgotCQkJCXJldHVybiBncm91cDQgIT0gbnVsbCAmJiAhZ3JvdXA0LmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFX1BST0NFU1M6Ci0JCQkJcmV0dXJuICFnZXRCYXNlUHJvY2VzcygpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwNDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXA0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUmVwb3J0SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUmVwb3J0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjBiNTUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JlcG9ydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmVwb3J0SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVwb3J0SW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFJlcG9ydCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlcG9ydEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJFUE9SVDsKLQl9Ci0KLX0gLy9SZXBvcnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUmV1c2FibGVBc3NldEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JldXNhYmxlQXNzZXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MzU3ZDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUmV1c2FibGVBc3NldEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmV1c2FibGVBc3NldEltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJldXNhYmxlQXNzZXRJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgUmV1c2FibGVBc3NldCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJldXNhYmxlQXNzZXRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5SRVVTQUJMRV9BU1NFVDsKLQl9Ci0KLX0gLy9SZXVzYWJsZUFzc2V0SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvYWRtYXBJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2FkbWFwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWUxOWRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvYWRtYXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvYWRtYXBJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvYWRtYXBJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgUm9hZG1hcCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvYWRtYXBJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0FETUFQOwotCX0KLQotfSAvL1JvYWRtYXBJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZURlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjgyY2ExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVEZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsI2dldFNraWxscyA8ZW0+U2tpbGxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwjZ2V0U3lub255bXMgPGVtPlN5bm9ueW1zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBSb2xlRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpIDxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NJR05NRU5UX0FQUFJPQUNIRVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKSA8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhc3NpZ25tZW50QXBwcm9hY2hlcyA9IEFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTa2lsbHMoKSA8ZW0+U2tpbGxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTa2lsbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSUxMU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTa2lsbHMoKSA8ZW0+U2tpbGxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTa2lsbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2tpbGxzID0gU0tJTExTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN5bm9ueW1zKCkgPGVtPlN5bm9ueW1zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTeW5vbnltcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOT05ZTVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3lub255bXMoKSA8ZW0+U3lub255bXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN5bm9ueW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN5bm9ueW1zID0gU1lOT05ZTVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZURlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFzc2lnbm1lbnRBcHByb2FjaGVzKCkgewotCQlyZXR1cm4gYXNzaWdubWVudEFwcHJvYWNoZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXNzaWdubWVudEFwcHJvYWNoZXMoU3RyaW5nIG5ld0Fzc2lnbm1lbnRBcHByb2FjaGVzKSB7Ci0JCVN0cmluZyBvbGRBc3NpZ25tZW50QXBwcm9hY2hlcyA9IGFzc2lnbm1lbnRBcHByb2FjaGVzOwotCQlhc3NpZ25tZW50QXBwcm9hY2hlcyA9IG5ld0Fzc2lnbm1lbnRBcHByb2FjaGVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUywgb2xkQXNzaWdubWVudEFwcHJvYWNoZXMsIGFzc2lnbm1lbnRBcHByb2FjaGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTa2lsbHMoKSB7Ci0JCXJldHVybiBza2lsbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2tpbGxzKFN0cmluZyBuZXdTa2lsbHMpIHsKLQkJU3RyaW5nIG9sZFNraWxscyA9IHNraWxsczsKLQkJc2tpbGxzID0gbmV3U2tpbGxzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUywgb2xkU2tpbGxzLCBza2lsbHMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5bm9ueW1zKCkgewotCQlyZXR1cm4gc3lub255bXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3lub255bXMoU3RyaW5nIG5ld1N5bm9ueW1zKSB7Ci0JCVN0cmluZyBvbGRTeW5vbnltcyA9IHN5bm9ueW1zOwotCQlzeW5vbnltcyA9IG5ld1N5bm9ueW1zOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TLCBvbGRTeW5vbnltcywgc3lub255bXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTOgotCQkJCXJldHVybiBnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUzoKLQkJCQlyZXR1cm4gZ2V0U2tpbGxzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVM6Ci0JCQkJcmV0dXJuIGdldFN5bm9ueW1zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVM6Ci0JCQkJc2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUzoKLQkJCQlzZXRTa2lsbHMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TOgotCQkJCXNldFN5bm9ueW1zKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTOgotCQkJCXNldEFzc2lnbm1lbnRBcHByb2FjaGVzKEFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUzoKLQkJCQlzZXRTa2lsbHMoU0tJTExTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVM6Ci0JCQkJc2V0U3lub255bXMoU1lOT05ZTVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUzoKLQkJCQlyZXR1cm4gQVNTSUdOTUVOVF9BUFBST0FDSEVTX0VERUZBVUxUID09IG51bGwgPyBhc3NpZ25tZW50QXBwcm9hY2hlcyAhPSBudWxsIDogIUFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVC5lcXVhbHMoYXNzaWdubWVudEFwcHJvYWNoZXMpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUzoKLQkJCQlyZXR1cm4gU0tJTExTX0VERUZBVUxUID09IG51bGwgPyBza2lsbHMgIT0gbnVsbCA6ICFTS0lMTFNfRURFRkFVTFQuZXF1YWxzKHNraWxscyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVM6Ci0JCQkJcmV0dXJuIFNZTk9OWU1TX0VERUZBVUxUID09IG51bGwgPyBzeW5vbnltcyAhPSBudWxsIDogIVNZTk9OWU1TX0VERUZBVUxULmVxdWFscyhzeW5vbnltcyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhc3NpZ25tZW50QXBwcm9hY2hlczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXNzaWdubWVudEFwcHJvYWNoZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNraWxsczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2tpbGxzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzeW5vbnltczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3lub255bXMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Sb2xlRGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZURlc2NyaXB0b3JJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2xlRGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA4ZWZmMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2xlRGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVEZXNjcmlwdG9ySW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbCNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbCNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0b3JJbXBsIGV4dGVuZHMgRGVzY3JpcHRvckltcGwgaW1wbGVtZW50cyBSb2xlRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvbGUoKSA8ZW0+Um9sZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlKCkgPGVtPlJvbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcm9sZSA9IFJPTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNwb25zaWJsZUZvcigpIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzcG9uc2libGVGb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IHJlc3BvbnNpYmxlRm9yOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVEZXNjcmlwdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9ERVNDUklQVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Um9sZSgpIHsKLQkJcmV0dXJuIHJvbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sZShTdHJpbmcgbmV3Um9sZSkgewotCQlTdHJpbmcgb2xkUm9sZSA9IHJvbGU7Ci0JCXJvbGUgPSBuZXdSb2xlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRSwgb2xkUm9sZSwgcm9sZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFJlc3BvbnNpYmxlRm9yKCkgewotCQlpZiAocmVzcG9uc2libGVGb3IgPT0gbnVsbCkgewotCQkJcmVzcG9uc2libGVGb3IgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1IpOwotCQl9Ci0JCXJldHVybiByZXNwb25zaWJsZUZvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJCXJldHVybiBnZXRSb2xlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJcmV0dXJuIGdldFJlc3BvbnNpYmxlRm9yKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJCXNldFJvbGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNwb25zaWJsZUZvcigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEU6Ci0JCQkJc2V0Um9sZShST0xFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJZ2V0UmVzcG9uc2libGVGb3IoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRToKLQkJCQlyZXR1cm4gUk9MRV9FREVGQVVMVCA9PSBudWxsID8gcm9sZSAhPSBudWxsIDogIVJPTEVfRURFRkFVTFQuZXF1YWxzKHJvbGUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJCXJldHVybiByZXNwb25zaWJsZUZvciAhPSBudWxsICYmICFyZXNwb25zaWJsZUZvci5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyb2xlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyb2xlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXNwb25zaWJsZUZvcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVzcG9uc2libGVGb3IpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Sb2xlRGVzY3JpcHRvckltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2xlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I3MTc3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2xlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUm9sZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlSW1wbCNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZUltcGwgZXh0ZW5kcyBDb250ZW50RWxlbWVudEltcGwgaW1wbGVtZW50cyBSb2xlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuUk9MRV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFJlc3BvbnNpYmxlRm9yKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfX1JFU1BPTlNJQkxFX0ZPUik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCQlyZXR1cm4gZ2V0UmVzcG9uc2libGVGb3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJZ2V0UmVzcG9uc2libGVGb3IoKS5jbGVhcigpOwotCQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJZ2V0UmVzcG9uc2libGVGb3IoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fUkVTUE9OU0lCTEVfRk9SOgotCQkJCXJldHVybiAhZ2V0UmVzcG9uc2libGVGb3IoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1JvbGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZVNldEdyb3VwaW5nSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZVNldEdyb3VwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjNkMDkyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVTZXRHcm91cGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVTZXRHcm91cGluZ0ltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIFNldCBHcm91cGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRHcm91cGluZ0ltcGwjZ2V0Um9sZVNldCA8ZW0+Um9sZSBTZXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0R3JvdXBpbmdJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzIFJvbGVTZXRHcm91cGluZyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlU2V0R3JvdXBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVF9HUk9VUElORzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0Um9sZVNldCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVDoKLQkJCQlyZXR1cm4gZ2V0Um9sZVNldCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVQ6Ci0JCQkJZ2V0Um9sZVNldCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Um9sZVNldCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVDoKLQkJCQlnZXRSb2xlU2V0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVQ6Ci0JCQkJcmV0dXJuICFnZXRSb2xlU2V0KCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Sb2xlU2V0R3JvdXBpbmdJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZVNldEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVTZXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NDU2ZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZVNldEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVTZXRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgU2V0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRJbXBsI2dldFJvbGUgPGVtPlJvbGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0SW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cyBSb2xlU2V0IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVTZXRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlJPTEVfU0VUX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0Um9sZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVF9fUk9MRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEU6Ci0JCQkJcmV0dXJuIGdldFJvbGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEU6Ci0JCQkJZ2V0Um9sZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0Um9sZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19ST0xFOgotCQkJCWdldFJvbGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19ST0xFOgotCQkJCXJldHVybiAhZ2V0Um9sZSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUm9sZVNldEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9TZWN0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvU2VjdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMyY2FlZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9TZWN0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogU2VjdGlvbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5TZWN0aW9uSW1wbCNnZXRTdWJTZWN0aW9uIDxlbT5TdWIgU2VjdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5TZWN0aW9uSW1wbCNnZXRQcmVkZWNlc3NvciA8ZW0+UHJlZGVjZXNzb3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU2VjdGlvbkltcGwjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlNlY3Rpb25JbXBsI2dldFNlY3Rpb25OYW1lIDxlbT5TZWN0aW9uIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU2VjdGlvbkltcGwjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5TZWN0aW9uSW1wbCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN0aW9uSW1wbCBleHRlbmRzIE1ldGhvZEVsZW1lbnRJbXBsIGltcGxlbWVudHMgU2VjdGlvbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3ViU2VjdGlvbigpIDxlbT5TdWIgU2VjdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViU2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFNlY3Rpb24gc3ViU2VjdGlvbjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVkZWNlc3NvcigpIDxlbT5QcmVkZWNlc3NvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRURFQ0VTU09SX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWRlY2Vzc29yKCkgPGVtPlByZWRlY2Vzc29yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVkZWNlc3NvciA9IFBSRURFQ0VTU09SX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VjdGlvbk5hbWUoKSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWN0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDVElPTl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3Rpb25OYW1lKCkgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2VjdGlvbk5hbWUgPSBTRUNUSU9OX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUID0gVmFyaWFiaWxpdHlUeXBlLk5BOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlY3Rpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5TRUNUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZWN0aW9uIGdldFN1YlNlY3Rpb24oKSB7Ci0JCXJldHVybiBzdWJTZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFN1YlNlY3Rpb24oU2VjdGlvbiBuZXdTdWJTZWN0aW9uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVNlY3Rpb24gb2xkU3ViU2VjdGlvbiA9IHN1YlNlY3Rpb247Ci0JCXN1YlNlY3Rpb24gPSBuZXdTdWJTZWN0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OLCBvbGRTdWJTZWN0aW9uLCBuZXdTdWJTZWN0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdWJTZWN0aW9uKFNlY3Rpb24gbmV3U3ViU2VjdGlvbikgewotCQlpZiAobmV3U3ViU2VjdGlvbiAhPSBzdWJTZWN0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChzdWJTZWN0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXN1YlNlY3Rpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdTdWJTZWN0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1N1YlNlY3Rpb24pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFN1YlNlY3Rpb24obmV3U3ViU2VjdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OLCBuZXdTdWJTZWN0aW9uLCBuZXdTdWJTZWN0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVkZWNlc3NvcigpIHsKLQkJcmV0dXJuIHByZWRlY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWRlY2Vzc29yKFN0cmluZyBuZXdQcmVkZWNlc3NvcikgewotCQlTdHJpbmcgb2xkUHJlZGVjZXNzb3IgPSBwcmVkZWNlc3NvcjsKLQkJcHJlZGVjZXNzb3IgPSBuZXdQcmVkZWNlc3NvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5TRUNUSU9OX19QUkVERUNFU1NPUiwgb2xkUHJlZGVjZXNzb3IsIHByZWRlY2Vzc29yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5TRUNUSU9OX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHNlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlY3Rpb25OYW1lKFN0cmluZyBuZXdTZWN0aW9uTmFtZSkgewotCQlTdHJpbmcgb2xkU2VjdGlvbk5hbWUgPSBzZWN0aW9uTmFtZTsKLQkJc2VjdGlvbk5hbWUgPSBuZXdTZWN0aW9uTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX05BTUUsIG9sZFNlY3Rpb25OYW1lLCBzZWN0aW9uTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChTdHJpbmcgbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkgewotCQlTdHJpbmcgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCXZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSBuZXdWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQsIG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQsIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIG5ld1ZhcmlhYmlsaXR5VHlwZSkgewotCQlWYXJpYWJpbGl0eVR5cGUgb2xkVmFyaWFiaWxpdHlUeXBlID0gdmFyaWFiaWxpdHlUeXBlOwotCQl2YXJpYWJpbGl0eVR5cGUgPSBuZXdWYXJpYWJpbGl0eVR5cGUgPT0gbnVsbCA/IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQgOiBuZXdWYXJpYWJpbGl0eVR5cGU7Ci0JCWJvb2xlYW4gb2xkVmFyaWFiaWxpdHlUeXBlRVNldCA9IHZhcmlhYmlsaXR5VHlwZUVTZXQ7Ci0JCXZhcmlhYmlsaXR5VHlwZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEUsIG9sZFZhcmlhYmlsaXR5VHlwZSwgdmFyaWFiaWxpdHlUeXBlLCAhb2xkVmFyaWFiaWxpdHlUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlWYXJpYWJpbGl0eVR5cGUgb2xkVmFyaWFiaWxpdHlUeXBlID0gdmFyaWFiaWxpdHlUeXBlOwotCQlib29sZWFuIG9sZFZhcmlhYmlsaXR5VHlwZUVTZXQgPSB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCQl2YXJpYWJpbGl0eVR5cGUgPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCQl2YXJpYWJpbGl0eVR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5TRUNUSU9OX19WQVJJQUJJTElUWV9UWVBFLCBvbGRWYXJpYWJpbGl0eVR5cGUsIFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQsIG9sZFZhcmlhYmlsaXR5VHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OOgotCQkJCXJldHVybiBiYXNpY1NldFN1YlNlY3Rpb24obnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTjoKLQkJCQlyZXR1cm4gZ2V0U3ViU2VjdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1BSRURFQ0VTU09SOgotCQkJCXJldHVybiBnZXRQcmVkZWNlc3NvcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fTkFNRToKLQkJCQlyZXR1cm4gZ2V0U2VjdGlvbk5hbWUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTjoKLQkJCQlzZXRTdWJTZWN0aW9uKChTZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fUFJFREVDRVNTT1I6Ci0JCQkJc2V0UHJlZGVjZXNzb3IoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX05BTUU6Ci0JCQkJc2V0U2VjdGlvbk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQlzZXRWYXJpYWJpbGl0eVR5cGUoKFZhcmlhYmlsaXR5VHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTjoKLQkJCQlzZXRTdWJTZWN0aW9uKChTZWN0aW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19QUkVERUNFU1NPUjoKLQkJCQlzZXRQcmVkZWNlc3NvcihQUkVERUNFU1NPUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FOgotCQkJCXNldFNlY3Rpb25OYW1lKFNFQ1RJT05fTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQl1bnNldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OOgotCQkJCXJldHVybiBzdWJTZWN0aW9uICE9IG51bGw7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fUFJFREVDRVNTT1I6Ci0JCQkJcmV0dXJuIFBSRURFQ0VTU09SX0VERUZBVUxUID09IG51bGwgPyBwcmVkZWNlc3NvciAhPSBudWxsIDogIVBSRURFQ0VTU09SX0VERUZBVUxULmVxdWFscyhwcmVkZWNlc3Nvcik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FOgotCQkJCXJldHVybiBTRUNUSU9OX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHNlY3Rpb25OYW1lICE9IG51bGwgOiAhU0VDVElPTl9OQU1FX0VERUZBVUxULmVxdWFscyhzZWN0aW9uTmFtZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCAhPSBudWxsIDogIVZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwcmVkZWNlc3NvcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlZGVjZXNzb3IpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2VjdGlvbk5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNlY3Rpb25OYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YXJpYWJpbGl0eVR5cGU6ICIpOwotCQlpZiAodmFyaWFiaWxpdHlUeXBlRVNldCkgcmVzdWx0LmFwcGVuZCh2YXJpYWJpbGl0eVR5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vU2VjdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYTQyZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvU3VwcG9ydGluZ01hdGVyaWFsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBTdXBwb3J0aW5nTWF0ZXJpYWxJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3VwcG9ydGluZ01hdGVyaWFsSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFN1cHBvcnRpbmdNYXRlcmlhbCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN1cHBvcnRpbmdNYXRlcmlhbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlNVUFBPUlRJTkdfTUFURVJJQUw7Ci0JfQotCi19IC8vU3VwcG9ydGluZ01hdGVyaWFsSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3NzJjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UYXNrRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrRGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzayBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdGlvbkltcGwjZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgVGFza0Rlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWx0ZXJuYXRpdmVzKCkgPGVtPkFsdGVybmF0aXZlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTFRFUk5BVElWRVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWx0ZXJuYXRpdmVzKCkgPGVtPkFsdGVybmF0aXZlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFsdGVybmF0aXZlcyA9IEFMVEVSTkFUSVZFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVUlBPU0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVycG9zZSgpIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1cnBvc2UgPSBQVVJQT1NFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbHRlcm5hdGl2ZXMoKSB7Ci0JCXJldHVybiBhbHRlcm5hdGl2ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWx0ZXJuYXRpdmVzKFN0cmluZyBuZXdBbHRlcm5hdGl2ZXMpIHsKLQkJU3RyaW5nIG9sZEFsdGVybmF0aXZlcyA9IGFsdGVybmF0aXZlczsKLQkJYWx0ZXJuYXRpdmVzID0gbmV3QWx0ZXJuYXRpdmVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUywgb2xkQWx0ZXJuYXRpdmVzLCBhbHRlcm5hdGl2ZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1cnBvc2UoKSB7Ci0JCXJldHVybiBwdXJwb3NlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1cnBvc2UoU3RyaW5nIG5ld1B1cnBvc2UpIHsKLQkJU3RyaW5nIG9sZFB1cnBvc2UgPSBwdXJwb3NlOwotCQlwdXJwb3NlID0gbmV3UHVycG9zZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFLCBvbGRQdXJwb3NlLCBwdXJwb3NlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCQlyZXR1cm4gZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlyZXR1cm4gZ2V0UHVycG9zZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJCXNldEFsdGVybmF0aXZlcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlzZXRQdXJwb3NlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJCXNldEFsdGVybmF0aXZlcyhBTFRFUk5BVElWRVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXNldFB1cnBvc2UoUFVSUE9TRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJCXJldHVybiBBTFRFUk5BVElWRVNfRURFRkFVTFQgPT0gbnVsbCA/IGFsdGVybmF0aXZlcyAhPSBudWxsIDogIUFMVEVSTkFUSVZFU19FREVGQVVMVC5lcXVhbHMoYWx0ZXJuYXRpdmVzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXJldHVybiBQVVJQT1NFX0VERUZBVUxUID09IG51bGwgPyBwdXJwb3NlICE9IG51bGwgOiAhUFVSUE9TRV9FREVGQVVMVC5lcXVhbHMocHVycG9zZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhbHRlcm5hdGl2ZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFsdGVybmF0aXZlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHVycG9zZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHVycG9zZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Rhc2tEZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UYXNrRGVzY3JpcHRvckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGYwMmQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGFza0Rlc2NyaXB0b3JJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrIERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldFRhc2sgPGVtPlRhc2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5IDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldEFzc2lzdGVkQnkgPGVtPkFzc2lzdGVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRFeHRlcm5hbElucHV0IDxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0T3B0aW9uYWxJbnB1dCA8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRTdGVwIDxlbT5TdGVwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0b3JJbXBsIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsIGltcGxlbWVudHMgVGFza0Rlc2NyaXB0b3IgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXNrKCkgPGVtPlRhc2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFzaygpIDxlbT5UYXNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhc2sgPSBUQVNLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkgPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJGT1JNRURfUFJJTUFSSUxZX0JZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkgPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBlcmZvcm1lZFByaW1hcmlseUJ5ID0gUEVSRk9STUVEX1BSSU1BUklMWV9CWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMygpIDxlbT5Hcm91cDM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGVwKCkgPGVtPlN0ZXA8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RlcCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFNlY3Rpb24+IHN0ZXA7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2UgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFza0Rlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXNrKCkgewotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXNrKFN0cmluZyBuZXdUYXNrKSB7Ci0JCVN0cmluZyBvbGRUYXNrID0gdGFzazsKLQkJdGFzayA9IG5ld1Rhc2s7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLLCBvbGRUYXNrLCB0YXNrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpIHsKLQkJcmV0dXJuIHBlcmZvcm1lZFByaW1hcmlseUJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBlcmZvcm1lZFByaW1hcmlseUJ5KFN0cmluZyBuZXdQZXJmb3JtZWRQcmltYXJpbHlCeSkgewotCQlTdHJpbmcgb2xkUGVyZm9ybWVkUHJpbWFyaWx5QnkgPSBwZXJmb3JtZWRQcmltYXJpbHlCeTsKLQkJcGVyZm9ybWVkUHJpbWFyaWx5QnkgPSBuZXdQZXJmb3JtZWRQcmltYXJpbHlCeTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlksIG9sZFBlcmZvcm1lZFByaW1hcmlseUJ5LCBwZXJmb3JtZWRQcmltYXJpbHlCeSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMygpIHsKLQkJaWYgKGdyb3VwMyA9PSBudWxsKSB7Ci0JCQlncm91cDMgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19HUk9VUDMpOwotCQl9Ci0JCXJldHVybiBncm91cDM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSB7Ci0JCXJldHVybiBnZXRHcm91cDMoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRBc3Npc3RlZEJ5KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAzKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEV4dGVybmFsSW5wdXQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDMoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0TWFuZGF0b3J5SW5wdXQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDMoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldE9wdGlvbmFsSW5wdXQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDMoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0T3V0cHV0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAzKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U2VjdGlvbj4gZ2V0U3RlcCgpIHsKLQkJaWYgKHN0ZXAgPT0gbnVsbCkgewotCQkJc3RlcCA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxTZWN0aW9uPihTZWN0aW9uLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fU1RFUCk7Ci0JCX0KLQkJcmV0dXJuIHN0ZXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSB7Ci0JCXJldHVybiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKGJvb2xlYW4gbmV3SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKSB7Ci0JCWJvb2xlYW4gb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCQlpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBuZXdJc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JCWJvb2xlYW4gb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCA9IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQ7Ci0JCWlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFLCBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UsIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSwgIW9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIHsKLQkJYm9vbGVhbiBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JCWJvb2xlYW4gb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCA9IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQ7Ci0JCWlzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVDsKLQkJaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UsIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSwgSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxULCBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSB7Ci0JCXJldHVybiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0dST1VQMzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TVEVQOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U3RlcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0s6Ci0JCQkJcmV0dXJuIGdldFRhc2soKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0JCQkJcmV0dXJuIGdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19HUk9VUDM6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAzKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDMoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQlyZXR1cm4gZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZOgotCQkJCXJldHVybiBnZXRBc3Npc3RlZEJ5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLQkJCQlyZXR1cm4gZ2V0RXh0ZXJuYWxJbnB1dCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJCXJldHVybiBnZXRNYW5kYXRvcnlJbnB1dCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQ6Ci0JCQkJcmV0dXJuIGdldE9wdGlvbmFsSW5wdXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCQlyZXR1cm4gZ2V0T3V0cHV0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TVEVQOgotCQkJCXJldHVybiBnZXRTdGVwKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSzoKLQkJCQlzZXRUYXNrKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0JCQkJc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fR1JPVVAzOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDMoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCQlnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQkJZ2V0QXNzaXN0ZWRCeSgpLmNsZWFyKCk7Ci0JCQkJZ2V0QXNzaXN0ZWRCeSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQkJZ2V0RXh0ZXJuYWxJbnB1dCgpLmNsZWFyKCk7Ci0JCQkJZ2V0RXh0ZXJuYWxJbnB1dCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJCWdldE1hbmRhdG9yeUlucHV0KCkuY2xlYXIoKTsKLQkJCQlnZXRNYW5kYXRvcnlJbnB1dCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQ6Ci0JCQkJZ2V0T3B0aW9uYWxJbnB1dCgpLmNsZWFyKCk7Ci0JCQkJZ2V0T3B0aW9uYWxJbnB1dCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUOgotCQkJCWdldE91dHB1dCgpLmNsZWFyKCk7Ci0JCQkJZ2V0T3V0cHV0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TVEVQOgotCQkJCWdldFN0ZXAoKS5jbGVhcigpOwotCQkJCWdldFN0ZXAoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFNlY3Rpb24+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQkJc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLOgotCQkJCXNldFRhc2soVEFTS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWToKLQkJCQlzZXRQZXJmb3JtZWRQcmltYXJpbHlCeShQRVJGT1JNRURfUFJJTUFSSUxZX0JZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19HUk9VUDM6Ci0JCQkJZ2V0R3JvdXAzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWToKLQkJCQlnZXRBc3Npc3RlZEJ5KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLQkJCQlnZXRFeHRlcm5hbElucHV0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJCWdldE9wdGlvbmFsSW5wdXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCQlnZXRPdXRwdXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1NURVA6Ci0JCQkJZ2V0U3RlcCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJCXVuc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLOgotCQkJCXJldHVybiBUQVNLX0VERUZBVUxUID09IG51bGwgPyB0YXNrICE9IG51bGwgOiAhVEFTS19FREVGQVVMVC5lcXVhbHModGFzayk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotCQkJCXJldHVybiBQRVJGT1JNRURfUFJJTUFSSUxZX0JZX0VERUZBVUxUID09IG51bGwgPyBwZXJmb3JtZWRQcmltYXJpbHlCeSAhPSBudWxsIDogIVBFUkZPUk1FRF9QUklNQVJJTFlfQllfRURFRkFVTFQuZXF1YWxzKHBlcmZvcm1lZFByaW1hcmlseUJ5KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0dST1VQMzoKLQkJCQlyZXR1cm4gZ3JvdXAzICE9IG51bGwgJiYgIWdyb3VwMy5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJCXJldHVybiAhZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWToKLQkJCQlyZXR1cm4gIWdldEFzc2lzdGVkQnkoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLQkJCQlyZXR1cm4gIWdldEV4dGVybmFsSW5wdXQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJcmV0dXJuICFnZXRNYW5kYXRvcnlJbnB1dCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJCXJldHVybiAhZ2V0T3B0aW9uYWxJbnB1dCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCQlyZXR1cm4gIWdldE91dHB1dCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1NURVA6Ci0JCQkJcmV0dXJuIHN0ZXAgIT0gbnVsbCAmJiAhc3RlcC5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0YXNrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0YXNrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwZXJmb3JtZWRQcmltYXJpbHlCeTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGVyZm9ybWVkUHJpbWFyaWx5QnkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdyb3VwMzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U6ICIpOwotCQlpZiAoaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCkgcmVzdWx0LmFwcGVuZChpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVGFza0Rlc2NyaXB0b3JJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGFza0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rhc2tJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYmQxMWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGFza0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRhc2tJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0ltcGwjZ2V0UGVyZm9ybWVkQnkgPGVtPlBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldEVzdGltYXRlIDxlbT5Fc3RpbWF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0ltcGwjZ2V0VG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrSW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRhc2sgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVjb25kaXRpb24oKSA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUNPTkRJVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVjb25kaXRpb24oKSA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJlY29uZGl0aW9uID0gUFJFQ09ORElUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3Rjb25kaXRpb24oKSA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9TVENPTkRJVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Y29uZGl0aW9uKCkgPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcG9zdGNvbmRpdGlvbiA9IFBPU1RDT05ESVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJmb3JtZWRCeSgpIDxlbT5QZXJmb3JtZWQgQnk8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyZm9ybWVkQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IHBlcmZvcm1lZEJ5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTSzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVjb25kaXRpb24oU3RyaW5nIG5ld1ByZWNvbmRpdGlvbikgewotCQlTdHJpbmcgb2xkUHJlY29uZGl0aW9uID0gcHJlY29uZGl0aW9uOwotCQlwcmVjb25kaXRpb24gPSBuZXdQcmVjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OLCBvbGRQcmVjb25kaXRpb24sIHByZWNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9zdGNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHBvc3Rjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdGNvbmRpdGlvbihTdHJpbmcgbmV3UG9zdGNvbmRpdGlvbikgewotCQlTdHJpbmcgb2xkUG9zdGNvbmRpdGlvbiA9IHBvc3Rjb25kaXRpb247Ci0JCXBvc3Rjb25kaXRpb24gPSBuZXdQb3N0Y29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT04sIG9sZFBvc3Rjb25kaXRpb24sIHBvc3Rjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRQZXJmb3JtZWRCeSgpIHsKLQkJaWYgKHBlcmZvcm1lZEJ5ID09IG51bGwpIHsKLQkJCXBlcmZvcm1lZEJ5ID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlRBU0tfX1BFUkZPUk1FRF9CWSk7Ci0JCX0KLQkJcmV0dXJuIHBlcmZvcm1lZEJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuVEFTS19fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldE1hbmRhdG9yeUlucHV0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX01BTkRBVE9SWV9JTlBVVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0T3V0cHV0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX09VVFBVVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0T3B0aW9uYWxJbnB1dCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19PUFRJT05BTF9JTlBVVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0RXN0aW1hdGUoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fRVNUSU1BVEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRUb29sTWVudG9yKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX1RPT0xfTUVOVE9SKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjoKLQkJCQlyZXR1cm4gZ2V0UHJlY29uZGl0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTjoKLQkJCQlyZXR1cm4gZ2V0UG9zdGNvbmRpdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BFUkZPUk1FRF9CWToKLQkJCQlyZXR1cm4gZ2V0UGVyZm9ybWVkQnkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQlyZXR1cm4gZ2V0TWFuZGF0b3J5SW5wdXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PVVRQVVQ6Ci0JCQkJcmV0dXJuIGdldE91dHB1dCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQkJcmV0dXJuIGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1BUSU9OQUxfSU5QVVQ6Ci0JCQkJcmV0dXJuIGdldE9wdGlvbmFsSW5wdXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFURToKLQkJCQlyZXR1cm4gZ2V0RXN0aW1hdGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCXJldHVybiBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19UT09MX01FTlRPUjoKLQkJCQlyZXR1cm4gZ2V0VG9vbE1lbnRvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjoKLQkJCQlzZXRQcmVjb25kaXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQkJc2V0UG9zdGNvbmRpdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUEVSRk9STUVEX0JZOgotCQkJCWdldFBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCQlnZXRQZXJmb3JtZWRCeSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQlnZXRNYW5kYXRvcnlJbnB1dCgpLmNsZWFyKCk7Ci0JCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PVVRQVVQ6Ci0JCQkJZ2V0T3V0cHV0KCkuY2xlYXIoKTsKLQkJCQlnZXRPdXRwdXQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCQlnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09QVElPTkFMX0lOUFVUOgotCQkJCWdldE9wdGlvbmFsSW5wdXQoKS5jbGVhcigpOwotCQkJCWdldE9wdGlvbmFsSW5wdXQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFURToKLQkJCQlnZXRFc3RpbWF0ZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RXN0aW1hdGUoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fVE9PTF9NRU5UT1I6Ci0JCQkJZ2V0VG9vbE1lbnRvcigpLmNsZWFyKCk7Ci0JCQkJZ2V0VG9vbE1lbnRvcigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQkJc2V0UHJlY29uZGl0aW9uKFBSRUNPTkRJVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQkJc2V0UG9zdGNvbmRpdGlvbihQT1NUQ09ORElUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUEVSRk9STUVEX0JZOgotCQkJCWdldFBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQlnZXRNYW5kYXRvcnlJbnB1dCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09VVFBVVDoKLQkJCQlnZXRPdXRwdXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1BUSU9OQUxfSU5QVVQ6Ci0JCQkJZ2V0T3B0aW9uYWxJbnB1dCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRFOgotCQkJCWdldEVzdGltYXRlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19UT09MX01FTlRPUjoKLQkJCQlnZXRUb29sTWVudG9yKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIFBSRUNPTkRJVElPTl9FREVGQVVMVCA9PSBudWxsID8gcHJlY29uZGl0aW9uICE9IG51bGwgOiAhUFJFQ09ORElUSU9OX0VERUZBVUxULmVxdWFscyhwcmVjb25kaXRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIFBPU1RDT05ESVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHBvc3Rjb25kaXRpb24gIT0gbnVsbCA6ICFQT1NUQ09ORElUSU9OX0VERUZBVUxULmVxdWFscyhwb3N0Y29uZGl0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QRVJGT1JNRURfQlk6Ci0JCQkJcmV0dXJuIHBlcmZvcm1lZEJ5ICE9IG51bGwgJiYgIXBlcmZvcm1lZEJ5LmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQlyZXR1cm4gIWdldE1hbmRhdG9yeUlucHV0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09VVFBVVDoKLQkJCQlyZXR1cm4gIWdldE91dHB1dCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJCXJldHVybiAhZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1BUSU9OQUxfSU5QVVQ6Ci0JCQkJcmV0dXJuICFnZXRPcHRpb25hbElucHV0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRFOgotCQkJCXJldHVybiAhZ2V0RXN0aW1hdGUoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCQlyZXR1cm4gIWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19UT09MX01FTlRPUjoKLQkJCQlyZXR1cm4gIWdldFRvb2xNZW50b3IoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwcmVjb25kaXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZWNvbmRpdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcG9zdGNvbmRpdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocG9zdGNvbmRpdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGVyZm9ybWVkQnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBlcmZvcm1lZEJ5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Rhc2tJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGVhbVByb2ZpbGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UZWFtUHJvZmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YyZjJhNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UZWFtUHJvZmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRlYW1Qcm9maWxlSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVhbSBQcm9maWxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwjZ2V0Um9sZSA8ZW0+Um9sZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwjZ2V0U3VwZXJUZWFtIDxlbT5TdXBlciBUZWFtPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbCNnZXRTdWJUZWFtIDxlbT5TdWIgVGVhbTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRlYW1Qcm9maWxlSW1wbCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJbXBsIGltcGxlbWVudHMgVGVhbVByb2ZpbGUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRlYW1Qcm9maWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVBTV9QUk9GSUxFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0Um9sZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5URUFNX1BST0ZJTEVfX1JPTEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFN1cGVyVGVhbSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFN1YlRlYW0oKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVBTV9QUk9GSUxFX19TVUJfVEVBTSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1JPTEU6Ci0JCQkJcmV0dXJuIGdldFJvbGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU06Ci0JCQkJcmV0dXJuIGdldFN1cGVyVGVhbSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU06Ci0JCQkJcmV0dXJuIGdldFN1YlRlYW0oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fUk9MRToKLQkJCQlnZXRSb2xlKCkuY2xlYXIoKTsKLQkJCQlnZXRSb2xlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJCWdldFN1cGVyVGVhbSgpLmNsZWFyKCk7Ci0JCQkJZ2V0U3VwZXJUZWFtKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTToKLQkJCQlnZXRTdWJUZWFtKCkuY2xlYXIoKTsKLQkJCQlnZXRTdWJUZWFtKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fUk9MRToKLQkJCQlnZXRSb2xlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJCWdldFN1cGVyVGVhbSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU06Ci0JCQkJZ2V0U3ViVGVhbSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fUk9MRToKLQkJCQlyZXR1cm4gIWdldFJvbGUoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJCXJldHVybiAhZ2V0U3VwZXJUZWFtKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU06Ci0JCQkJcmV0dXJuICFnZXRTdWJUZWFtKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UZWFtUHJvZmlsZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UZW1wbGF0ZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1RlbXBsYXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzMxMDZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1RlbXBsYXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUZW1wbGF0ZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVtcGxhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBUZW1wbGF0ZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRlbXBsYXRlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVNUExBVEU7Ci0JfQotCi19IC8vVGVtcGxhdGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGVybURlZmluaXRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UZXJtRGVmaW5pdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE1NDdhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UZXJtRGVmaW5pdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGVybURlZmluaXRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlcm0gRGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRlcm1EZWZpbml0aW9uSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFRlcm1EZWZpbml0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGVybURlZmluaXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5URVJNX0RFRklOSVRJT047Ci0JfQotCi19IC8vVGVybURlZmluaXRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVG9vbEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rvb2xJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NWI1YWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVG9vbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRvb2xJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRvb2w8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVG9vbEltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVG9vbEltcGwjZ2V0VG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sSW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cyBUb29sIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRvb2xJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UT09MOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuVE9PTF9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFRvb2xNZW50b3IoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVE9PTF9fVE9PTF9NRU5UT1IpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UT09MX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UT09MX19UT09MX01FTlRPUjoKLQkJCQlyZXR1cm4gZ2V0VG9vbE1lbnRvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX1RPT0xfTUVOVE9SOgotCQkJCWdldFRvb2xNZW50b3IoKS5jbGVhcigpOwotCQkJCWdldFRvb2xNZW50b3IoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX1RPT0xfTUVOVE9SOgotCQkJCWdldFRvb2xNZW50b3IoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fVE9PTF9NRU5UT1I6Ci0JCQkJcmV0dXJuICFnZXRUb29sTWVudG9yKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Ub29sSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rvb2xNZW50b3JJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Ub29sTWVudG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGZjM2YyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rvb2xNZW50b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRvb2xNZW50b3JJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VG9vbCBNZW50b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sTWVudG9ySW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFRvb2xNZW50b3IgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUb29sTWVudG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVE9PTF9NRU5UT1I7Ci0JfQotCi19IC8vVG9vbE1lbnRvckltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9VbWFGYWN0b3J5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVW1hRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3MjFlZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9VbWFGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVtYUZhY3RvcnlJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYUZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgVW1hRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVW1hRmFjdG9yeSBpbml0KCkgewotCQl0cnkgewotCQkJVW1hRmFjdG9yeSB0aGVVbWFGYWN0b3J5ID0gKFVtYUZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNSIpOyAKLQkJCWlmICh0aGVVbWFGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdGhlVW1hRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBVbWFGYWN0b3J5SW1wbCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFk6IHJldHVybiAoRU9iamVjdCljcmVhdGVBY3Rpdml0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUFydGlmYWN0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVCcmVha2Rvd25FbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DQVBBQklMSVRZX1BBVFRFUk46IHJldHVybiAoRU9iamVjdCljcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNIRUNLTElTVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNoZWNrbGlzdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ29tcG9zaXRlUm9sZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTkNFUFQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVDb25jZXB0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNvbnN0cmFpbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ29udGVudENhdGVnb3J5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ29udGVudENhdGVnb3J5UGFja2FnZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVDb250ZW50RWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNvbnRlbnRQYWNrYWdlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURlbGl2ZXJhYmxlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURlbGl2ZXJ5UHJvY2VzcygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVEZXNjcmliYWJsZUVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGVzY3JpcHRvcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGlzY2lwbGluZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkc6IHJldHVybiAoRU9iamVjdCljcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRG9jdW1lbnRSb290KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRG9tYWluKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRUxFTUVOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUVzdGltYXRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVElOR19NRVRSSUM6IHJldHVybiAoRU9iamVjdCljcmVhdGVFc3RpbWF0aW5nTWV0cmljKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVYQU1QTEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVFeGFtcGxlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0U6IHJldHVybiAoRU9iamVjdCljcmVhdGVHdWlkYW5jZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURFTElORTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUd1aWRlbGluZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLklURVJBVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUl0ZXJhdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLktJTkQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVLaW5kKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVNZXRob2RFbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6IHJldHVybiAoRU9iamVjdCljcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1ldGhvZExpYnJhcnkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1ldGhvZFBhY2thZ2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVNZXRob2RVbml0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUlMRVNUT05FOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTWlsZXN0b25lKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU5hbWVkRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk9VVENPTUU6IHJldHVybiAoRU9iamVjdCljcmVhdGVPdXRjb21lKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUEFDS0FHRUFCTEVfRUxFTUVOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVBhY2thZ2VhYmxlRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBIQVNFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUGhhc2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUGxhbm5pbmdEYXRhKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0U6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcmFjdGljZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1M6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcm9jZXNzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcm9jZXNzQ29tcG9uZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0VMRU1FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcm9jZXNzRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUkVQT1JUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUmVwb3J0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUkVVU0FCTEVfQVNTRVQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVSZXVzYWJsZUFzc2V0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9BRE1BUDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJvYWRtYXAoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUm9sZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVSb2xlRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVSb2xlRGVzY3JpcHRvcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUm9sZVNldCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUm9sZVNldEdyb3VwaW5nKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVNlY3Rpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5TVVBQT1JUSU5HX01BVEVSSUFMOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTSzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVRhc2soKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVGFza0Rlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVGFza0Rlc2NyaXB0b3IoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVUZWFtUHJvZmlsZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFTVBMQVRFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVGVtcGxhdGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5URVJNX0RFRklOSVRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVUZXJtRGVmaW5pdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0w6IHJldHVybiAoRU9iamVjdCljcmVhdGVUb29sKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9NRU5UT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVUb29sTWVudG9yKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV0hJVEVQQVBFUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdoaXRlcGFwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVXb3JrRGVmaW5pdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVI6IHJldHVybiAoRU9iamVjdCljcmVhdGVXb3JrT3JkZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1Q6IHJldHVybiAoRU9iamVjdCljcmVhdGVXb3JrUHJvZHVjdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVZhcmlhYmlsaXR5VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlV29ya09yZGVyVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjcmVhdGVWYXJpYWJpbGl0eVR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjcmVhdGVXb3JrT3JkZXJUeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRWYXJpYWJpbGl0eVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFdvcmtPcmRlclR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjb252ZXJ0VmFyaWFiaWxpdHlUeXBlT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjb252ZXJ0V29ya09yZGVyVHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHkgY3JlYXRlQWN0aXZpdHkoKSB7Ci0JCUFjdGl2aXR5SW1wbCBhY3Rpdml0eSA9IG5ldyBBY3Rpdml0eUltcGwoKTsKLQkJcmV0dXJuIGFjdGl2aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURlc2NyaXB0aW9uIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb24oKSB7Ci0JCUFjdGl2aXR5RGVzY3JpcHRpb25JbXBsIGFjdGl2aXR5RGVzY3JpcHRpb24gPSBuZXcgQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGFjdGl2aXR5RGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIGNyZWF0ZUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkgewotCQlBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwgYXBwbGljYWJsZU1ldGFDbGFzc0luZm8gPSBuZXcgQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsKCk7Ci0JCXJldHVybiBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3QgY3JlYXRlQXJ0aWZhY3QoKSB7Ci0JCUFydGlmYWN0SW1wbCBhcnRpZmFjdCA9IG5ldyBBcnRpZmFjdEltcGwoKTsKLQkJcmV0dXJuIGFydGlmYWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcnRpZmFjdERlc2NyaXB0aW9uIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb24oKSB7Ci0JCUFydGlmYWN0RGVzY3JpcHRpb25JbXBsIGFydGlmYWN0RGVzY3JpcHRpb24gPSBuZXcgQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGFydGlmYWN0RGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnQgY3JlYXRlQnJlYWtkb3duRWxlbWVudCgpIHsKLQkJQnJlYWtkb3duRWxlbWVudEltcGwgYnJlYWtkb3duRWxlbWVudCA9IG5ldyBCcmVha2Rvd25FbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gYnJlYWtkb3duRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpIHsKLQkJQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCBicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gPSBuZXcgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYXBhYmlsaXR5UGF0dGVybiBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpIHsKLQkJQ2FwYWJpbGl0eVBhdHRlcm5JbXBsIGNhcGFiaWxpdHlQYXR0ZXJuID0gbmV3IENhcGFiaWxpdHlQYXR0ZXJuSW1wbCgpOwotCQlyZXR1cm4gY2FwYWJpbGl0eVBhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENoZWNrbGlzdCBjcmVhdGVDaGVja2xpc3QoKSB7Ci0JCUNoZWNrbGlzdEltcGwgY2hlY2tsaXN0ID0gbmV3IENoZWNrbGlzdEltcGwoKTsKLQkJcmV0dXJuIGNoZWNrbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlUm9sZSBjcmVhdGVDb21wb3NpdGVSb2xlKCkgewotCQlDb21wb3NpdGVSb2xlSW1wbCBjb21wb3NpdGVSb2xlID0gbmV3IENvbXBvc2l0ZVJvbGVJbXBsKCk7Ci0JCXJldHVybiBjb21wb3NpdGVSb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25jZXB0IGNyZWF0ZUNvbmNlcHQoKSB7Ci0JCUNvbmNlcHRJbXBsIGNvbmNlcHQgPSBuZXcgQ29uY2VwdEltcGwoKTsKLQkJcmV0dXJuIGNvbmNlcHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgY3JlYXRlQ29uc3RyYWludCgpIHsKLQkJQ29uc3RyYWludEltcGwgY29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50SW1wbCgpOwotCQlyZXR1cm4gY29uc3RyYWludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudENhdGVnb3J5IGNyZWF0ZUNvbnRlbnRDYXRlZ29yeSgpIHsKLQkJQ29udGVudENhdGVnb3J5SW1wbCBjb250ZW50Q2F0ZWdvcnkgPSBuZXcgQ29udGVudENhdGVnb3J5SW1wbCgpOwotCQlyZXR1cm4gY29udGVudENhdGVnb3J5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIGNyZWF0ZUNvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKSB7Ci0JCUNvbnRlbnRDYXRlZ29yeVBhY2thZ2VJbXBsIGNvbnRlbnRDYXRlZ29yeVBhY2thZ2UgPSBuZXcgQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwoKTsKLQkJcmV0dXJuIGNvbnRlbnRDYXRlZ29yeVBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnREZXNjcmlwdGlvbiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oKSB7Ci0JCUNvbnRlbnREZXNjcmlwdGlvbkltcGwgY29udGVudERlc2NyaXB0aW9uID0gbmV3IENvbnRlbnREZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGNvbnRlbnREZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudEVsZW1lbnQgY3JlYXRlQ29udGVudEVsZW1lbnQoKSB7Ci0JCUNvbnRlbnRFbGVtZW50SW1wbCBjb250ZW50RWxlbWVudCA9IG5ldyBDb250ZW50RWxlbWVudEltcGwoKTsKLQkJcmV0dXJuIGNvbnRlbnRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50UGFja2FnZSBjcmVhdGVDb250ZW50UGFja2FnZSgpIHsKLQkJQ29udGVudFBhY2thZ2VJbXBsIGNvbnRlbnRQYWNrYWdlID0gbmV3IENvbnRlbnRQYWNrYWdlSW1wbCgpOwotCQlyZXR1cm4gY29udGVudFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEN1c3RvbUNhdGVnb3J5IGNyZWF0ZUN1c3RvbUNhdGVnb3J5KCkgewotCQlDdXN0b21DYXRlZ29yeUltcGwgY3VzdG9tQ2F0ZWdvcnkgPSBuZXcgQ3VzdG9tQ2F0ZWdvcnlJbXBsKCk7Ci0JCXJldHVybiBjdXN0b21DYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcmFibGUgY3JlYXRlRGVsaXZlcmFibGUoKSB7Ci0JCURlbGl2ZXJhYmxlSW1wbCBkZWxpdmVyYWJsZSA9IG5ldyBEZWxpdmVyYWJsZUltcGwoKTsKLQkJcmV0dXJuIGRlbGl2ZXJhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uIGNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKSB7Ci0JCURlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24gPSBuZXcgRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJ5UHJvY2VzcyBjcmVhdGVEZWxpdmVyeVByb2Nlc3MoKSB7Ci0JCURlbGl2ZXJ5UHJvY2Vzc0ltcGwgZGVsaXZlcnlQcm9jZXNzID0gbmV3IERlbGl2ZXJ5UHJvY2Vzc0ltcGwoKTsKLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2VzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiA9IG5ldyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmliYWJsZUVsZW1lbnQgY3JlYXRlRGVzY3JpYmFibGVFbGVtZW50KCkgewotCQlEZXNjcmliYWJsZUVsZW1lbnRJbXBsIGRlc2NyaWJhYmxlRWxlbWVudCA9IG5ldyBEZXNjcmliYWJsZUVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBkZXNjcmliYWJsZUVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaXB0b3IgY3JlYXRlRGVzY3JpcHRvcigpIHsKLQkJRGVzY3JpcHRvckltcGwgZGVzY3JpcHRvciA9IG5ldyBEZXNjcmlwdG9ySW1wbCgpOwotCQlyZXR1cm4gZGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRvckRlc2NyaXB0aW9uIGNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbigpIHsKLQkJRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCBkZXNjcmlwdG9yRGVzY3JpcHRpb24gPSBuZXcgRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gZGVzY3JpcHRvckRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lIGNyZWF0ZURpc2NpcGxpbmUoKSB7Ci0JCURpc2NpcGxpbmVJbXBsIGRpc2NpcGxpbmUgPSBuZXcgRGlzY2lwbGluZUltcGwoKTsKLQkJcmV0dXJuIGRpc2NpcGxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVHcm91cGluZyBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKSB7Ci0JCURpc2NpcGxpbmVHcm91cGluZ0ltcGwgZGlzY2lwbGluZUdyb3VwaW5nID0gbmV3IERpc2NpcGxpbmVHcm91cGluZ0ltcGwoKTsKLQkJcmV0dXJuIGRpc2NpcGxpbmVHcm91cGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRSb290IGNyZWF0ZURvY3VtZW50Um9vdCgpIHsKLQkJRG9jdW1lbnRSb290SW1wbCBkb2N1bWVudFJvb3QgPSBuZXcgRG9jdW1lbnRSb290SW1wbCgpOwotCQlyZXR1cm4gZG9jdW1lbnRSb290OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb21haW4gY3JlYXRlRG9tYWluKCkgewotCQlEb21haW5JbXBsIGRvbWFpbiA9IG5ldyBEb21haW5JbXBsKCk7Ci0JCXJldHVybiBkb21haW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpIHsKLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IG5ldyBFbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXN0aW1hdGUgY3JlYXRlRXN0aW1hdGUoKSB7Ci0JCUVzdGltYXRlSW1wbCBlc3RpbWF0ZSA9IG5ldyBFc3RpbWF0ZUltcGwoKTsKLQkJcmV0dXJuIGVzdGltYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFc3RpbWF0aW5nTWV0cmljIGNyZWF0ZUVzdGltYXRpbmdNZXRyaWMoKSB7Ci0JCUVzdGltYXRpbmdNZXRyaWNJbXBsIGVzdGltYXRpbmdNZXRyaWMgPSBuZXcgRXN0aW1hdGluZ01ldHJpY0ltcGwoKTsKLQkJcmV0dXJuIGVzdGltYXRpbmdNZXRyaWM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCUVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID0gbmV3IEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwoKTsKLQkJcmV0dXJuIGVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXhhbXBsZSBjcmVhdGVFeGFtcGxlKCkgewotCQlFeGFtcGxlSW1wbCBleGFtcGxlID0gbmV3IEV4YW1wbGVJbXBsKCk7Ci0JCXJldHVybiBleGFtcGxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHdWlkYW5jZSBjcmVhdGVHdWlkYW5jZSgpIHsKLQkJR3VpZGFuY2VJbXBsIGd1aWRhbmNlID0gbmV3IEd1aWRhbmNlSW1wbCgpOwotCQlyZXR1cm4gZ3VpZGFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEd1aWRhbmNlRGVzY3JpcHRpb24gY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbigpIHsKLQkJR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwgZ3VpZGFuY2VEZXNjcmlwdGlvbiA9IG5ldyBHdWlkYW5jZURlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gZ3VpZGFuY2VEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3VpZGVsaW5lIGNyZWF0ZUd1aWRlbGluZSgpIHsKLQkJR3VpZGVsaW5lSW1wbCBndWlkZWxpbmUgPSBuZXcgR3VpZGVsaW5lSW1wbCgpOwotCQlyZXR1cm4gZ3VpZGVsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJdGVyYXRpb24gY3JlYXRlSXRlcmF0aW9uKCkgewotCQlJdGVyYXRpb25JbXBsIGl0ZXJhdGlvbiA9IG5ldyBJdGVyYXRpb25JbXBsKCk7Ci0JCXJldHVybiBpdGVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEtpbmQgY3JlYXRlS2luZCgpIHsKLQkJS2luZEltcGwga2luZCA9IG5ldyBLaW5kSW1wbCgpOwotCQlyZXR1cm4ga2luZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uSW1wbCBtZXRob2RDb25maWd1cmF0aW9uID0gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25JbXBsKCk7Ci0JCXJldHVybiBtZXRob2RDb25maWd1cmF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGNyZWF0ZU1ldGhvZEVsZW1lbnQoKSB7Ci0JCU1ldGhvZEVsZW1lbnRJbXBsIG1ldGhvZEVsZW1lbnQgPSBuZXcgTWV0aG9kRWxlbWVudEltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBjcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHkoKSB7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwgbWV0aG9kRWxlbWVudFByb3BlcnR5ID0gbmV3IE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBjcmVhdGVNZXRob2RMaWJyYXJ5KCkgewotCQlNZXRob2RMaWJyYXJ5SW1wbCBtZXRob2RMaWJyYXJ5ID0gbmV3IE1ldGhvZExpYnJhcnlJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RMaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RQYWNrYWdlIGNyZWF0ZU1ldGhvZFBhY2thZ2UoKSB7Ci0JCU1ldGhvZFBhY2thZ2VJbXBsIG1ldGhvZFBhY2thZ2UgPSBuZXcgTWV0aG9kUGFja2FnZUltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZFBsdWdpbiBjcmVhdGVNZXRob2RQbHVnaW4oKSB7Ci0JCU1ldGhvZFBsdWdpbkltcGwgbWV0aG9kUGx1Z2luID0gbmV3IE1ldGhvZFBsdWdpbkltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZFBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kVW5pdCBjcmVhdGVNZXRob2RVbml0KCkgewotCQlNZXRob2RVbml0SW1wbCBtZXRob2RVbml0ID0gbmV3IE1ldGhvZFVuaXRJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RVbml0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNaWxlc3RvbmUgY3JlYXRlTWlsZXN0b25lKCkgewotCQlNaWxlc3RvbmVJbXBsIG1pbGVzdG9uZSA9IG5ldyBNaWxlc3RvbmVJbXBsKCk7Ci0JCXJldHVybiBtaWxlc3RvbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5hbWVkRWxlbWVudCBjcmVhdGVOYW1lZEVsZW1lbnQoKSB7Ci0JCU5hbWVkRWxlbWVudEltcGwgbmFtZWRFbGVtZW50ID0gbmV3IE5hbWVkRWxlbWVudEltcGwoKTsKLQkJcmV0dXJuIG5hbWVkRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3V0Y29tZSBjcmVhdGVPdXRjb21lKCkgewotCQlPdXRjb21lSW1wbCBvdXRjb21lID0gbmV3IE91dGNvbWVJbXBsKCk7Ci0JCXJldHVybiBvdXRjb21lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYWNrYWdlYWJsZUVsZW1lbnQgY3JlYXRlUGFja2FnZWFibGVFbGVtZW50KCkgewotCQlQYWNrYWdlYWJsZUVsZW1lbnRJbXBsIHBhY2thZ2VhYmxlRWxlbWVudCA9IG5ldyBQYWNrYWdlYWJsZUVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBwYWNrYWdlYWJsZUVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBoYXNlIGNyZWF0ZVBoYXNlKCkgewotCQlQaGFzZUltcGwgcGhhc2UgPSBuZXcgUGhhc2VJbXBsKCk7Ci0JCXJldHVybiBwaGFzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGxhbm5pbmdEYXRhIGNyZWF0ZVBsYW5uaW5nRGF0YSgpIHsKLQkJUGxhbm5pbmdEYXRhSW1wbCBwbGFubmluZ0RhdGEgPSBuZXcgUGxhbm5pbmdEYXRhSW1wbCgpOwotCQlyZXR1cm4gcGxhbm5pbmdEYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcmFjdGljZSBjcmVhdGVQcmFjdGljZSgpIHsKLQkJUHJhY3RpY2VJbXBsIHByYWN0aWNlID0gbmV3IFByYWN0aWNlSW1wbCgpOwotCQlyZXR1cm4gcHJhY3RpY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByYWN0aWNlRGVzY3JpcHRpb24gY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbigpIHsKLQkJUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwgcHJhY3RpY2VEZXNjcmlwdGlvbiA9IG5ldyBQcmFjdGljZURlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gcHJhY3RpY2VEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBjcmVhdGVQcm9jZXNzKCkgewotCQlQcm9jZXNzSW1wbCBwcm9jZXNzID0gbmV3IFByb2Nlc3NJbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50IGNyZWF0ZVByb2Nlc3NDb21wb25lbnQoKSB7Ci0JCVByb2Nlc3NDb21wb25lbnRJbXBsIHByb2Nlc3NDb21wb25lbnQgPSBuZXcgUHJvY2Vzc0NvbXBvbmVudEltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpIHsKLQkJUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSA9IG5ldyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0Rlc2NyaXB0aW9uIGNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbigpIHsKLQkJUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCBwcm9jZXNzRGVzY3JpcHRpb24gPSBuZXcgUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc0Rlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzRWxlbWVudCBjcmVhdGVQcm9jZXNzRWxlbWVudCgpIHsKLQkJUHJvY2Vzc0VsZW1lbnRJbXBsIHByb2Nlc3NFbGVtZW50ID0gbmV3IFByb2Nlc3NFbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc0VsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NQYWNrYWdlIGNyZWF0ZVByb2Nlc3NQYWNrYWdlKCkgewotCQlQcm9jZXNzUGFja2FnZUltcGwgcHJvY2Vzc1BhY2thZ2UgPSBuZXcgUHJvY2Vzc1BhY2thZ2VJbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSB7Ci0JCVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbCBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSA9IG5ldyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXBvcnQgY3JlYXRlUmVwb3J0KCkgewotCQlSZXBvcnRJbXBsIHJlcG9ydCA9IG5ldyBSZXBvcnRJbXBsKCk7Ci0JCXJldHVybiByZXBvcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJldXNhYmxlQXNzZXQgY3JlYXRlUmV1c2FibGVBc3NldCgpIHsKLQkJUmV1c2FibGVBc3NldEltcGwgcmV1c2FibGVBc3NldCA9IG5ldyBSZXVzYWJsZUFzc2V0SW1wbCgpOwotCQlyZXR1cm4gcmV1c2FibGVBc3NldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9hZG1hcCBjcmVhdGVSb2FkbWFwKCkgewotCQlSb2FkbWFwSW1wbCByb2FkbWFwID0gbmV3IFJvYWRtYXBJbXBsKCk7Ci0JCXJldHVybiByb2FkbWFwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlIGNyZWF0ZVJvbGUoKSB7Ci0JCVJvbGVJbXBsIHJvbGUgPSBuZXcgUm9sZUltcGwoKTsKLQkJcmV0dXJuIHJvbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdGlvbiBjcmVhdGVSb2xlRGVzY3JpcHRpb24oKSB7Ci0JCVJvbGVEZXNjcmlwdGlvbkltcGwgcm9sZURlc2NyaXB0aW9uID0gbmV3IFJvbGVEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHJvbGVEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZURlc2NyaXB0b3IgY3JlYXRlUm9sZURlc2NyaXB0b3IoKSB7Ci0JCVJvbGVEZXNjcmlwdG9ySW1wbCByb2xlRGVzY3JpcHRvciA9IG5ldyBSb2xlRGVzY3JpcHRvckltcGwoKTsKLQkJcmV0dXJuIHJvbGVEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlU2V0IGNyZWF0ZVJvbGVTZXQoKSB7Ci0JCVJvbGVTZXRJbXBsIHJvbGVTZXQgPSBuZXcgUm9sZVNldEltcGwoKTsKLQkJcmV0dXJuIHJvbGVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVTZXRHcm91cGluZyBjcmVhdGVSb2xlU2V0R3JvdXBpbmcoKSB7Ci0JCVJvbGVTZXRHcm91cGluZ0ltcGwgcm9sZVNldEdyb3VwaW5nID0gbmV3IFJvbGVTZXRHcm91cGluZ0ltcGwoKTsKLQkJcmV0dXJuIHJvbGVTZXRHcm91cGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdGlvbiBjcmVhdGVTZWN0aW9uKCkgewotCQlTZWN0aW9uSW1wbCBzZWN0aW9uID0gbmV3IFNlY3Rpb25JbXBsKCk7Ci0JCXJldHVybiBzZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCkgewotCQlTdXBwb3J0aW5nTWF0ZXJpYWxJbXBsIHN1cHBvcnRpbmdNYXRlcmlhbCA9IG5ldyBTdXBwb3J0aW5nTWF0ZXJpYWxJbXBsKCk7Ci0JCXJldHVybiBzdXBwb3J0aW5nTWF0ZXJpYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2sgY3JlYXRlVGFzaygpIHsKLQkJVGFza0ltcGwgdGFzayA9IG5ldyBUYXNrSW1wbCgpOwotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFza0Rlc2NyaXB0aW9uIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbigpIHsKLQkJVGFza0Rlc2NyaXB0aW9uSW1wbCB0YXNrRGVzY3JpcHRpb24gPSBuZXcgVGFza0Rlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gdGFza0Rlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrRGVzY3JpcHRvciBjcmVhdGVUYXNrRGVzY3JpcHRvcigpIHsKLQkJVGFza0Rlc2NyaXB0b3JJbXBsIHRhc2tEZXNjcmlwdG9yID0gbmV3IFRhc2tEZXNjcmlwdG9ySW1wbCgpOwotCQlyZXR1cm4gdGFza0Rlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlYW1Qcm9maWxlIGNyZWF0ZVRlYW1Qcm9maWxlKCkgewotCQlUZWFtUHJvZmlsZUltcGwgdGVhbVByb2ZpbGUgPSBuZXcgVGVhbVByb2ZpbGVJbXBsKCk7Ci0JCXJldHVybiB0ZWFtUHJvZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGVtcGxhdGUgY3JlYXRlVGVtcGxhdGUoKSB7Ci0JCVRlbXBsYXRlSW1wbCB0ZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZUltcGwoKTsKLQkJcmV0dXJuIHRlbXBsYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZXJtRGVmaW5pdGlvbiBjcmVhdGVUZXJtRGVmaW5pdGlvbigpIHsKLQkJVGVybURlZmluaXRpb25JbXBsIHRlcm1EZWZpbml0aW9uID0gbmV3IFRlcm1EZWZpbml0aW9uSW1wbCgpOwotCQlyZXR1cm4gdGVybURlZmluaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRvb2wgY3JlYXRlVG9vbCgpIHsKLQkJVG9vbEltcGwgdG9vbCA9IG5ldyBUb29sSW1wbCgpOwotCQlyZXR1cm4gdG9vbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVG9vbE1lbnRvciBjcmVhdGVUb29sTWVudG9yKCkgewotCQlUb29sTWVudG9ySW1wbCB0b29sTWVudG9yID0gbmV3IFRvb2xNZW50b3JJbXBsKCk7Ci0JCXJldHVybiB0b29sTWVudG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXaGl0ZXBhcGVyIGNyZWF0ZVdoaXRlcGFwZXIoKSB7Ci0JCVdoaXRlcGFwZXJJbXBsIHdoaXRlcGFwZXIgPSBuZXcgV2hpdGVwYXBlckltcGwoKTsKLQkJcmV0dXJuIHdoaXRlcGFwZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtCcmVha2Rvd25FbGVtZW50IGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50KCkgewotCQlXb3JrQnJlYWtkb3duRWxlbWVudEltcGwgd29ya0JyZWFrZG93bkVsZW1lbnQgPSBuZXcgV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiB3b3JrQnJlYWtkb3duRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya0RlZmluaXRpb24gY3JlYXRlV29ya0RlZmluaXRpb24oKSB7Ci0JCVdvcmtEZWZpbml0aW9uSW1wbCB3b3JrRGVmaW5pdGlvbiA9IG5ldyBXb3JrRGVmaW5pdGlvbkltcGwoKTsKLQkJcmV0dXJuIHdvcmtEZWZpbml0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrT3JkZXIgY3JlYXRlV29ya09yZGVyKCkgewotCQlXb3JrT3JkZXJJbXBsIHdvcmtPcmRlciA9IG5ldyBXb3JrT3JkZXJJbXBsKCk7Ci0JCXJldHVybiB3b3JrT3JkZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0IGNyZWF0ZVdvcmtQcm9kdWN0KCkgewotCQlXb3JrUHJvZHVjdEltcGwgd29ya1Byb2R1Y3QgPSBuZXcgV29ya1Byb2R1Y3RJbXBsKCk7Ci0JCXJldHVybiB3b3JrUHJvZHVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbiBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCB3b3JrUHJvZHVjdERlc2NyaXB0aW9uID0gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3IgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsIHdvcmtQcm9kdWN0RGVzY3JpcHRvciA9IG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0VHlwZSBjcmVhdGVXb3JrUHJvZHVjdFR5cGUoKSB7Ci0JCVdvcmtQcm9kdWN0VHlwZUltcGwgd29ya1Byb2R1Y3RUeXBlID0gbmV3IFdvcmtQcm9kdWN0VHlwZUltcGwoKTsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlIGNyZWF0ZVZhcmlhYmlsaXR5VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlWYXJpYWJpbGl0eVR5cGUgcmVzdWx0ID0gVmFyaWFiaWxpdHlUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYXJpYWJpbGl0eVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVyVHlwZSBjcmVhdGVXb3JrT3JkZXJUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCVdvcmtPcmRlclR5cGUgcmVzdWx0ID0gV29ya09yZGVyVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V29ya09yZGVyVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eVR5cGUgY3JlYXRlVmFyaWFiaWxpdHlUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiBjcmVhdGVWYXJpYWJpbGl0eVR5cGVGcm9tU3RyaW5nKFVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYXJpYWJpbGl0eVR5cGVPYmplY3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gY29udmVydFZhcmlhYmlsaXR5VHlwZVRvU3RyaW5nKFVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtPcmRlclR5cGUgY3JlYXRlV29ya09yZGVyVHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gY3JlYXRlV29ya09yZGVyVHlwZUZyb21TdHJpbmcoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX09SREVSX1RZUEUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V29ya09yZGVyVHlwZU9iamVjdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBjb252ZXJ0V29ya09yZGVyVHlwZVRvU3RyaW5nKFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19PUkRFUl9UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hUGFja2FnZSBnZXRVbWFQYWNrYWdlKCkgewotCQlyZXR1cm4gKFVtYVBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBVbWFQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9VbWFGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVW1hUGFja2FnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1VtYVBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NTc2NTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVW1hUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczMTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBVbWFQYWNrYWdlSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpbmdNZXRyaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBhY2thZ2VhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW1hUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBVbWFQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhY3Rpdml0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFydGlmYWN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYnJlYWtkb3duRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY2FwYWJpbGl0eVBhdHRlcm5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY2hlY2tsaXN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbXBvc2l0ZVJvbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29uY2VwdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb25zdHJhaW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbnRlbnRDYXRlZ29yeUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50Q2F0ZWdvcnlQYWNrYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50RWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50UGFja2FnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjdXN0b21DYXRlZ29yeUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZWxpdmVyYWJsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGlzY2lwbGluZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZG9jdW1lbnRSb290RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRvbWFpbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVzdGltYXRlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVzdGltYXRpbmdNZXRyaWNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGV4YW1wbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZ3VpZGFuY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBndWlkZWxpbmVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaXRlcmF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGtpbmRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RMaWJyYXJ5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZFBhY2thZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kUGx1Z2luRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZFVuaXRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWlsZXN0b25lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG5hbWVkRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBvdXRjb21lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBhY2thZ2VhYmxlRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwaGFzZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwbGFubmluZ0RhdGFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJhY3RpY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NDb21wb25lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0VsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc1BhY2thZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcmVwb3J0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJldXNhYmxlQXNzZXRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9hZG1hcEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvbGVEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlRGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlU2V0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvbGVTZXRHcm91cGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZWN0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0YXNrRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRhc2tEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0YXNrRGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0ZWFtUHJvZmlsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0ZW1wbGF0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0ZXJtRGVmaW5pdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0b29sRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRvb2xNZW50b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2hpdGVwYXBlckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrRGVmaW5pdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrT3JkZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya1Byb2R1Y3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya1Byb2R1Y3RUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gdmFyaWFiaWxpdHlUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB3b3JrT3JkZXJUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdmFyaWFiaWxpdHlUeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHdvcmtPcmRlclR5cGVPYmplY3RFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVW1hUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIFVtYUZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVW1hUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoVW1hUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShVbWFQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJVW1hUGFja2FnZUltcGwgdGhlVW1hUGFja2FnZSA9IChVbWFQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBVbWFQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IFVtYVBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZVVtYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVVbWFQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZVVtYVBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZVVtYVBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBY3Rpdml0eSgpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5X1ByZWNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfUG9zdGNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfR3JvdXAzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9Sb2FkbWFwKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9Jc0VuYWN0YWJsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfVmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFjdGl2aXR5RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93VG9TdGFmZigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpIHsKLQkJcmV0dXJuIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX0lzUHJpbWFyeUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcnRpZmFjdCgpIHsKLQkJcmV0dXJuIGFydGlmYWN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFydGlmYWN0X0dyb3VwMygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFydGlmYWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcnRpZmFjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX05vdGF0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QnJlYWtkb3duRWxlbWVudCgpIHsKLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1N1cGVyQWN0aXZpdHkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9Hcm91cDEoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9Db25jZXB0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfRXhhbXBsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1JldXNhYmxlQXNzZXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfV2hpdGVwYXBlcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9IYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENhcGFiaWxpdHlQYXR0ZXJuKCkgewotCQlyZXR1cm4gY2FwYWJpbGl0eVBhdHRlcm5FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDaGVja2xpc3QoKSB7Ci0JCXJldHVybiBjaGVja2xpc3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb21wb3NpdGVSb2xlKCkgewotCQlyZXR1cm4gY29tcG9zaXRlUm9sZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb21wb3NpdGVSb2xlX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbXBvc2l0ZVJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29tcG9zaXRlUm9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29uY2VwdCgpIHsKLQkJcmV0dXJuIGNvbmNlcHRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb25zdHJhaW50KCkgewotCQlyZXR1cm4gY29uc3RyYWludEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25zdHJhaW50X01haW5EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnRlbnRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIGNvbnRlbnRDYXRlZ29yeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKSB7Ci0JCXJldHVybiBjb250ZW50Q2F0ZWdvcnlQYWNrYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudENhdGVnb3J5UGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfQ29udGVudENhdGVnb3J5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29udGVudENhdGVnb3J5UGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29udGVudERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gY29udGVudERlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnRFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X0dyb3VwMSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9Db25jZXB0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1JldXNhYmxlQXNzZXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfV2hpdGVwYXBlcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnRlbnRQYWNrYWdlKCkgewotCQlyZXR1cm4gY29udGVudFBhY2thZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudFBhY2thZ2VfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudFBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbnRlbnRQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDdXN0b21DYXRlZ29yeSgpIHsKLQkJcmV0dXJuIGN1c3RvbUNhdGVnb3J5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEN1c3RvbUNhdGVnb3J5X0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWN1c3RvbUNhdGVnb3J5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWN1c3RvbUNhdGVnb3J5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZWxpdmVyYWJsZSgpIHsKLQkJcmV0dXJuIGRlbGl2ZXJhYmxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlX0dyb3VwMygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZWxpdmVyYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZWxpdmVyeVByb2Nlc3MoKSB7Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzX0dyb3VwNCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlc2NyaWJhYmxlRWxlbWVudCgpIHsKLQkJcmV0dXJuIGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X0Z1bGZpbGwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfSXNBYnN0cmFjdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBkZXNjcmlwdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERpc2NpcGxpbmUoKSB7Ci0JCXJldHVybiBkaXNjaXBsaW5lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERpc2NpcGxpbmVfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGlzY2lwbGluZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERpc2NpcGxpbmVfVGFzaygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRpc2NpcGxpbmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaXNjaXBsaW5lX1N1YkRpc2NpcGxpbmUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkaXNjaXBsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvdygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRpc2NpcGxpbmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERpc2NpcGxpbmVHcm91cGluZygpIHsKLQkJcmV0dXJuIGRpc2NpcGxpbmVHcm91cGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaXNjaXBsaW5lR3JvdXBpbmdfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERvY3VtZW50Um9vdCgpIHsKLQkJcmV0dXJuIGRvY3VtZW50Um9vdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREb2N1bWVudFJvb3RfTWl4ZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfTWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRvY3VtZW50Um9vdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9NZXRob2RMaWJyYXJ5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZG9jdW1lbnRSb290RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X01ldGhvZFBsdWdpbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRvY3VtZW50Um9vdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RG9tYWluKCkgewotCQlyZXR1cm4gZG9tYWluRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERvbWFpbl9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkb21haW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREb21haW5fV29ya1Byb2R1Y3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkb21haW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb21haW5fU3ViZG9tYWluKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZG9tYWluRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVzdGltYXRlKCkgewotCQlyZXR1cm4gZXN0aW1hdGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXN0aW1hdGVfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXN0aW1hdGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uTWV0cmljKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXN0aW1hdGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllc3RpbWF0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXN0aW1hdGluZ01ldHJpYygpIHsKLQkJcmV0dXJuIGVzdGltYXRpbmdNZXRyaWNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFeGFtcGxlKCkgewotCQlyZXR1cm4gZXhhbXBsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEd1aWRhbmNlKCkgewotCQlyZXR1cm4gZ3VpZGFuY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHdWlkZWxpbmUoKSB7Ci0JCXJldHVybiBndWlkZWxpbmVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJdGVyYXRpb24oKSB7Ci0JCXJldHVybiBpdGVyYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRLaW5kKCkgewotCQlyZXR1cm4ga2luZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRLaW5kX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpa2luZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fQWRkZWRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfR3JvdXAoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kRWxlbWVudFByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RMaWJyYXJ5KCkgewotCQlyZXR1cm4gbWV0aG9kTGlicmFyeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZExpYnJhcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RMaWJyYXJ5X01ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RMaWJyYXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kTGlicmFyeV9Ub29sKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kTGlicmFyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kUGFja2FnZSgpIHsKLQkJcmV0dXJuIG1ldGhvZFBhY2thZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGFja2FnZV9Hcm91cDEoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kUGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZFBhY2thZ2VfTWV0aG9kUGFja2FnZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZFBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZFBsdWdpbigpIHsKLQkJcmV0dXJuIG1ldGhvZFBsdWdpbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RQbHVnaW5fUmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFBsdWdpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kUGx1Z2luRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kUGx1Z2luRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RVbml0KCkgewotCQlyZXR1cm4gbWV0aG9kVW5pdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0NvcHlyaWdodCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0F1dGhvcnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEYXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWlsZXN0b25lKCkgewotCQlyZXR1cm4gbWlsZXN0b25lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1pbGVzdG9uZV9SZXF1aXJlZFJlc3VsdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1pbGVzdG9uZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TmFtZWRFbGVtZW50KCkgewotCQlyZXR1cm4gbmFtZWRFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE5hbWVkRWxlbWVudF9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbmFtZWRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRPdXRjb21lKCkgewotCQlyZXR1cm4gb3V0Y29tZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBhY2thZ2VhYmxlRWxlbWVudCgpIHsKLQkJcmV0dXJuIHBhY2thZ2VhYmxlRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBoYXNlKCkgewotCQlyZXR1cm4gcGhhc2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQbGFubmluZ0RhdGEoKSB7Ci0JCXJldHVybiBwbGFubmluZ0RhdGFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfUmFuaygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBsYW5uaW5nRGF0YUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBsYW5uaW5nRGF0YV9TdGFydERhdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByYWN0aWNlKCkgewotCQlyZXR1cm4gcHJhY3RpY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJhY3RpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByYWN0aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByYWN0aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwcmFjdGljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BZGRpdGlvbmFsSW5mbygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fTGV2ZWxzT2ZBZG9wdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX1Byb2JsZW0oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzKCkgewotCQlyZXR1cm4gcHJvY2Vzc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NfRGlhZ3JhbVVSSSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnQoKSB7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRfQ29weXJpZ2h0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRfSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRfUHJvY2VzcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzQ29tcG9uZW50X0F1dGhvcnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudF9DaGFuZ2VEYXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudF9WZXJzaW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpIHsKLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1VzYWdlTm90ZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NFbGVtZW50KCkgewotCQlyZXR1cm4gcHJvY2Vzc0VsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzUGFja2FnZSgpIHsKLQkJcmV0dXJuIHByb2Nlc3NQYWNrYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NQYWNrYWdlX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwcm9jZXNzUGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSB7Ci0JCXJldHVybiBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9Hcm91cDQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0Jhc2VQcm9jZXNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJlcG9ydCgpIHsKLQkJcmV0dXJuIHJlcG9ydEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJldXNhYmxlQXNzZXQoKSB7Ci0JCXJldHVybiByZXVzYWJsZUFzc2V0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9hZG1hcCgpIHsKLQkJcmV0dXJuIHJvYWRtYXBFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlKCkgewotCQlyZXR1cm4gcm9sZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gcm9sZURlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVEZXNjcmlwdGlvbl9Ta2lsbHMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvbGVEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gcm9sZURlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0b3JfUm9sZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZVNldCgpIHsKLQkJcmV0dXJuIHJvbGVTZXRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZVNldF9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlU2V0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZVNldF9Sb2xlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZVNldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZVNldEdyb3VwaW5nKCkgewotCQlyZXR1cm4gcm9sZVNldEdyb3VwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVTZXRHcm91cGluZ19Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlU2V0R3JvdXBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVTZXRHcm91cGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VjdGlvbigpIHsKLQkJcmV0dXJuIHNlY3Rpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdGlvbl9TdWJTZWN0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlY3Rpb25fUHJlZGVjZXNzb3IoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlY3Rpb25fVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1ZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpIHsKLQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhc2soKSB7Ci0JCXJldHVybiB0YXNrRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUHJlY29uZGl0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUG9zdGNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1BlcmZvcm1lZEJ5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19PdXRwdXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX09wdGlvbmFsSW5wdXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Fc3RpbWF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1Rvb2xNZW50b3IoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFza0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gdGFza0Rlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFza0Rlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiB0YXNrRGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfR3JvdXAzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfU3RlcCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUZWFtUHJvZmlsZSgpIHsKLQkJcmV0dXJuIHRlYW1Qcm9maWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRlYW1Qcm9maWxlX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRlYW1Qcm9maWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGVhbVByb2ZpbGVfUm9sZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRlYW1Qcm9maWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGVhbVByb2ZpbGVfU3VwZXJUZWFtKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGVhbVByb2ZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGVhbVByb2ZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRlbXBsYXRlKCkgewotCQlyZXR1cm4gdGVtcGxhdGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUZXJtRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHRlcm1EZWZpbml0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VG9vbCgpIHsKLQkJcmV0dXJuIHRvb2xFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VG9vbF9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0b29sRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VG9vbF9Ub29sTWVudG9yKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdG9vbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VG9vbE1lbnRvcigpIHsKLQkJcmV0dXJuIHRvb2xNZW50b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXaGl0ZXBhcGVyKCkgewotCQlyZXR1cm4gd2hpdGVwYXBlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtCcmVha2Rvd25FbGVtZW50KCkgewotCQlyZXR1cm4gd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9QcmVkZWNlc3NvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya0RlZmluaXRpb24oKSB7Ci0JCXJldHVybiB3b3JrRGVmaW5pdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrRGVmaW5pdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtEZWZpbml0aW9uX1Bvc3Rjb25kaXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrRGVmaW5pdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya09yZGVyKCkgewotCQlyZXR1cm4gd29ya09yZGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtPcmRlcl9WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtPcmRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtPcmRlcl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtPcmRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtPcmRlcl9MaW5rVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtPcmRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3QoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0X0VzdGltYXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0X1JlcG9ydCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3IoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9SZWFzb25zRm9yTm90TmVlZGluZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfUmVzcG9uc2libGVSb2xlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9FeHRlcm5hbElucHV0VG8oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0VG8oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dFRvKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb20oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3RUeXBlKCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3RUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0VHlwZV9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFdvcmtPcmRlclR5cGUoKSB7Ci0JCXJldHVybiB3b3JrT3JkZXJUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRWYXJpYWJpbGl0eVR5cGVPYmplY3QoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eVR5cGVPYmplY3RFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRXb3JrT3JkZXJUeXBlT2JqZWN0KCkgewotCQlyZXR1cm4gd29ya09yZGVyVHlwZU9iamVjdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hRmFjdG9yeSBnZXRVbWFGYWN0b3J5KCkgewotCQlyZXR1cm4gKFVtYUZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJYWN0aXZpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUNUSVZJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fUFJFQ09ORElUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX1BPU1RDT05ESVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fR1JPVVAzKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX1JPQURNQVApOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fSVNfRU5BQ1RBQkxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRSk7Ci0KLQkJYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQ1RJVklUWV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcywgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcywgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcywgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0UpOwotCi0JCWFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0VDbGFzcywgQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OKTsKLQotCQlhcnRpZmFjdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBUlRJRkFDVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJ0aWZhY3RFQ2xhc3MsIEFSVElGQUNUX19HUk9VUDMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFydGlmYWN0RUNsYXNzLCBBUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUKTsKLQotCQlhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFSVElGQUNUX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLCBBUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcywgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MsIEFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcywgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05PVEFUSU9OKTsKLQotCQlicmVha2Rvd25FbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEJSRUFLRE9XTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFQpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fV0hJVEVQQVBFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWCk7Ci0KLQkJYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSk7Ci0KLQkJY2FwYWJpbGl0eVBhdHRlcm5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0FQQUJJTElUWV9QQVRURVJOKTsKLQotCQljaGVja2xpc3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0hFQ0tMSVNUKTsKLQotCQljb21wb3NpdGVSb2xlRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTVBPU0lURV9ST0xFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb21wb3NpdGVSb2xlRUNsYXNzLCBDT01QT1NJVEVfUk9MRV9fR1JPVVAyKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb21wb3NpdGVSb2xlRUNsYXNzLCBDT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFKTsKLQotCQljb25jZXB0RUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTkNFUFQpOwotCi0JCWNvbnN0cmFpbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OU1RSQUlOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29uc3RyYWludEVDbGFzcywgQ09OU1RSQUlOVF9fTUFJTl9ERVNDUklQVElPTik7Ci0KLQkJY29udGVudENhdGVnb3J5RUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlRFTlRfQ0FURUdPUlkpOwotCi0JCWNvbnRlbnRDYXRlZ29yeVBhY2thZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50Q2F0ZWdvcnlQYWNrYWdlRUNsYXNzLCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0dST1VQMik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudENhdGVnb3J5UGFja2FnZUVDbGFzcywgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19DT05URU5UX0NBVEVHT1JZKTsKLQotCQljb250ZW50RGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OVEVOVF9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudERlc2NyaXB0aW9uRUNsYXNzLCBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MsIENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudERlc2NyaXB0aW9uRUNsYXNzLCBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MsIENPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEKTsKLQotCQljb250ZW50RWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05URU5UX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnRFbGVtZW50RUNsYXNzLCBDT05URU5UX0VMRU1FTlRfX0dST1VQMSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkUpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnRFbGVtZW50RUNsYXNzLCBDT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFKTsKLQotCQljb250ZW50UGFja2FnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05URU5UX1BBQ0tBR0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnRQYWNrYWdlRUNsYXNzLCBDT05URU5UX1BBQ0tBR0VfX0dST1VQMik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudFBhY2thZ2VFQ2xhc3MsIENPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UKTsKLQotCQljdXN0b21DYXRlZ29yeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDVVNUT01fQ0FURUdPUlkpOwotCQljcmVhdGVFQXR0cmlidXRlKGN1c3RvbUNhdGVnb3J5RUNsYXNzLCBDVVNUT01fQ0FURUdPUllfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MsIENVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MsIENVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JZKTsKLQotCQlkZWxpdmVyYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERUxJVkVSQUJMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcmFibGVFQ2xhc3MsIERFTElWRVJBQkxFX19HUk9VUDMpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJhYmxlRUNsYXNzLCBERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVCk7Ci0KLQkJZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERUxJVkVSQUJMRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcywgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzLCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFKTsKLQotCQlkZWxpdmVyeVByb2Nlc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVMSVZFUllfUFJPQ0VTUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRUNsYXNzLCBERUxJVkVSWV9QUk9DRVNTX19HUk9VUDQpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcywgREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUwpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcywgREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMKTsKLQotCQlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1QpOwotCi0JCWRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERVNDUklCQUJMRV9FTEVNRU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MsIERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLCBERVNDUklCQUJMRV9FTEVNRU5UX19GVUxGSUxMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MsIERFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MsIERFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MsIERFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTik7Ci0KLQkJZGVzY3JpcHRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERVNDUklQVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZXNjcmlwdG9yRUNsYXNzLCBERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UpOwotCi0JCWRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERVNDUklQVE9SX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MsIERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT04pOwotCi0JCWRpc2NpcGxpbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElTQ0lQTElORSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlzY2lwbGluZUVDbGFzcywgRElTQ0lQTElORV9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaXNjaXBsaW5lRUNsYXNzLCBESVNDSVBMSU5FX19UQVNLKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkaXNjaXBsaW5lRUNsYXNzLCBESVNDSVBMSU5FX19TVUJfRElTQ0lQTElORSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlzY2lwbGluZUVDbGFzcywgRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XKTsKLQotCQlkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElTQ0lQTElORV9HUk9VUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzLCBESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKGRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcywgRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORSk7Ci0KLQkJZG9jdW1lbnRSb290RUNsYXNzID0gY3JlYXRlRUNsYXNzKERPQ1VNRU5UX1JPT1QpOwotCQljcmVhdGVFQXR0cmlidXRlKGRvY3VtZW50Um9vdEVDbGFzcywgRE9DVU1FTlRfUk9PVF9fTUlYRUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRvY3VtZW50Um9vdEVDbGFzcywgRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZG9jdW1lbnRSb290RUNsYXNzLCBET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX01FVEhPRF9DT05GSUdVUkFUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX01FVEhPRF9MSUJSQVJZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX01FVEhPRF9QTFVHSU4pOwotCi0JCWRvbWFpbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhET01BSU4pOwotCQljcmVhdGVFQXR0cmlidXRlKGRvbWFpbkVDbGFzcywgRE9NQUlOX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKGRvbWFpbkVDbGFzcywgRE9NQUlOX19XT1JLX1BST0RVQ1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRvbWFpbkVDbGFzcywgRE9NQUlOX19TVUJET01BSU4pOwotCi0JCWVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRUxFTUVOVCk7Ci0KLQkJZXN0aW1hdGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVNUSU1BVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVzdGltYXRlRUNsYXNzLCBFU1RJTUFURV9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlc3RpbWF0ZUVDbGFzcywgRVNUSU1BVEVfX0VTVElNQVRJT05fTUVUUklDKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlc3RpbWF0ZUVDbGFzcywgRVNUSU1BVEVfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMpOwotCi0JCWVzdGltYXRpbmdNZXRyaWNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVNUSU1BVElOR19NRVRSSUMpOwotCi0JCWVzdGltYXRpb25Db25zaWRlcmF0aW9uc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQotCQlleGFtcGxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVYQU1QTEUpOwotCi0JCWd1aWRhbmNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdVSURBTkNFKTsKLQotCQlndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdVSURBTkNFX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzLCBHVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVCk7Ci0KLQkJZ3VpZGVsaW5lRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdVSURFTElORSk7Ci0KLQkJaXRlcmF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKElURVJBVElPTik7Ci0KLQkJa2luZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhLSU5EKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShraW5kRUNsYXNzLCBLSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTyk7Ci0KLQkJbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfQ09ORklHVVJBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLCBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLCBNRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLCBNRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLCBNRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZKTsKLQotCQltZXRob2RFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fR1JPVVApOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQpOwotCi0JCW1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudFByb3BlcnR5RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUUpOwotCi0JCW1ldGhvZExpYnJhcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX0xJQlJBUlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZExpYnJhcnlFQ2xhc3MsIE1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RMaWJyYXJ5RUNsYXNzLCBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX0NPTkZJR1VSQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZExpYnJhcnlFQ2xhc3MsIE1FVEhPRF9MSUJSQVJZX19UT09MKTsKLQotCQltZXRob2RQYWNrYWdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9QQUNLQUdFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RQYWNrYWdlRUNsYXNzLCBNRVRIT0RfUEFDS0FHRV9fR1JPVVAxKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RQYWNrYWdlRUNsYXNzLCBNRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZFBhY2thZ2VFQ2xhc3MsIE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfUEFDS0FHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGFja2FnZUVDbGFzcywgTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCk7Ci0KLQkJbWV0aG9kUGx1Z2luRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9QTFVHSU4pOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFBsdWdpbkVDbGFzcywgTUVUSE9EX1BMVUdJTl9fUkVGRVJFTkNFRF9NRVRIT0RfUExVR0lOKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RQbHVnaW5FQ2xhc3MsIE1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RQbHVnaW5FQ2xhc3MsIE1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRSk7Ci0KLQkJbWV0aG9kVW5pdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfVU5JVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kVW5pdEVDbGFzcywgTUVUSE9EX1VOSVRfX0NPUFlSSUdIVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kVW5pdEVDbGFzcywgTUVUSE9EX1VOSVRfX0FVVEhPUlMpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19DSEFOR0VfREFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kVW5pdEVDbGFzcywgTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kVW5pdEVDbGFzcywgTUVUSE9EX1VOSVRfX1ZFUlNJT04pOwotCi0JCW1pbGVzdG9uZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNSUxFU1RPTkUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1pbGVzdG9uZUVDbGFzcywgTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFQpOwotCi0JCW5hbWVkRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhOQU1FRF9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShuYW1lZEVsZW1lbnRFQ2xhc3MsIE5BTUVEX0VMRU1FTlRfX05BTUUpOwotCi0JCW91dGNvbWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoT1VUQ09NRSk7Ci0KLQkJcGFja2FnZWFibGVFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBBQ0tBR0VBQkxFX0VMRU1FTlQpOwotCi0JCXBoYXNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBIQVNFKTsKLQotCQlwbGFubmluZ0RhdGFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUExBTk5JTkdfREFUQSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGxhbm5pbmdEYXRhRUNsYXNzLCBQTEFOTklOR19EQVRBX19GSU5JU0hfREFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGxhbm5pbmdEYXRhRUNsYXNzLCBQTEFOTklOR19EQVRBX19SQU5LKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwbGFubmluZ0RhdGFFQ2xhc3MsIFBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEUpOwotCi0JCXByYWN0aWNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBSQUNUSUNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZUVDbGFzcywgUFJBQ1RJQ0VfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VFQ2xhc3MsIFBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRUNsYXNzLCBQUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByYWN0aWNlRUNsYXNzLCBQUkFDVElDRV9fU1VCX1BSQUNUSUNFKTsKLQotCQlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBSQUNUSUNFX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLCBQUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLCBQUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLCBQUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNKTsKLQotCQlwcm9jZXNzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NFQ2xhc3MsIFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk4pOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NFQ2xhc3MsIFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0VDbGFzcywgUFJPQ0VTU19fVkFMSURfQ09OVEVYVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0VDbGFzcywgUFJPQ0VTU19fRElBR1JBTV9VUkkpOwotCi0JCXByb2Nlc3NDb21wb25lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19DT01QT05FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NDb21wb25lbnRFQ2xhc3MsIFBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NDb21wb25lbnRFQ2xhc3MsIFBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NDb21wb25lbnRFQ2xhc3MsIFBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzQ29tcG9uZW50RUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0NvbXBvbmVudEVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzQ29tcG9uZW50RUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzQ29tcG9uZW50RUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTik7Ci0KLQkJcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MsIFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1JPVVAyKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTyk7Ci0KLQkJcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywgUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywgUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVMpOwotCi0JCXByb2Nlc3NFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfRUxFTUVOVCk7Ci0KLQkJcHJvY2Vzc1BhY2thZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19QQUNLQUdFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzUGFja2FnZUVDbGFzcywgUFJPQ0VTU19QQUNLQUdFX19HUk9VUDIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NQYWNrYWdlRUNsYXNzLCBQUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVCk7Ci0KLQkJcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19QTEFOTklOR19URU1QTEFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MsIFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQNCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MsIFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VfUFJPQ0VTUyk7Ci0KLQkJcmVwb3J0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFUE9SVCk7Ci0KLQkJcmV1c2FibGVBc3NldEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRVVTQUJMRV9BU1NFVCk7Ci0KLQkJcm9hZG1hcEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0FETUFQKTsKLQotCQlyb2xlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVFQ2xhc3MsIFJPTEVfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZUVDbGFzcywgUk9MRV9fUkVTUE9OU0lCTEVfRk9SKTsKLQotCQlyb2xlRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZURlc2NyaXB0aW9uRUNsYXNzLCBST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVEZXNjcmlwdGlvbkVDbGFzcywgUk9MRV9ERVNDUklQVElPTl9fU0tJTExTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRGVzY3JpcHRpb25FQ2xhc3MsIFJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TKTsKLQotCQlyb2xlRGVzY3JpcHRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX0RFU0NSSVBUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVEZXNjcmlwdG9yRUNsYXNzLCBST0xFX0RFU0NSSVBUT1JfX1JPTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVEZXNjcmlwdG9yRUNsYXNzLCBST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUik7Ci0KLQkJcm9sZVNldEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX1NFVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZVNldEVDbGFzcywgUk9MRV9TRVRfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZVNldEVDbGFzcywgUk9MRV9TRVRfX1JPTEUpOwotCi0JCXJvbGVTZXRHcm91cGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX1NFVF9HUk9VUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZVNldEdyb3VwaW5nRUNsYXNzLCBST0xFX1NFVF9HUk9VUElOR19fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlU2V0R3JvdXBpbmdFQ2xhc3MsIFJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVCk7Ci0KLQkJc2VjdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRUNUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZWN0aW9uRUNsYXNzLCBTRUNUSU9OX19TVUJfU0VDVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdGlvbkVDbGFzcywgU0VDVElPTl9fUFJFREVDRVNTT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3Rpb25FQ2xhc3MsIFNFQ1RJT05fX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN0aW9uRUNsYXNzLCBTRUNUSU9OX19TRUNUSU9OX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3Rpb25FQ2xhc3MsIFNFQ1RJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3Rpb25FQ2xhc3MsIFNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEUpOwotCi0JCXN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTVVBQT1JUSU5HX01BVEVSSUFMKTsKLQotCQl0YXNrRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBU0spOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tFQ2xhc3MsIFRBU0tfX1BSRUNPTkRJVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0VDbGFzcywgVEFTS19fUE9TVENPTkRJVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0VDbGFzcywgVEFTS19fUEVSRk9STUVEX0JZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRUNsYXNzLCBUQVNLX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tFQ2xhc3MsIFRBU0tfX01BTkRBVE9SWV9JTlBVVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0VDbGFzcywgVEFTS19fT1VUUFVUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRUNsYXNzLCBUQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRUNsYXNzLCBUQVNLX19PUFRJT05BTF9JTlBVVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0VDbGFzcywgVEFTS19fRVNUSU1BVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tFQ2xhc3MsIFRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tFQ2xhc3MsIFRBU0tfX1RPT0xfTUVOVE9SKTsKLQotCQl0YXNrRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEFTS19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0aW9uRUNsYXNzLCBUQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdGlvbkVDbGFzcywgVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSk7Ci0KLQkJdGFza0Rlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEFTS19ERVNDUklQVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19UQVNLKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19HUk9VUDMpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19TVEVQKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UpOwotCi0JCXRlYW1Qcm9maWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRFQU1fUFJPRklMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGVhbVByb2ZpbGVFQ2xhc3MsIFRFQU1fUFJPRklMRV9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0ZWFtUHJvZmlsZUVDbGFzcywgVEVBTV9QUk9GSUxFX19ST0xFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0ZWFtUHJvZmlsZUVDbGFzcywgVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0ZWFtUHJvZmlsZUVDbGFzcywgVEVBTV9QUk9GSUxFX19TVUJfVEVBTSk7Ci0KLQkJdGVtcGxhdGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEVNUExBVEUpOwotCi0JCXRlcm1EZWZpbml0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRFUk1fREVGSU5JVElPTik7Ci0KLQkJdG9vbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUT09MKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0b29sRUNsYXNzLCBUT09MX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKHRvb2xFQ2xhc3MsIFRPT0xfX1RPT0xfTUVOVE9SKTsKLQotCQl0b29sTWVudG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRPT0xfTUVOVE9SKTsKLQotCQl3aGl0ZXBhcGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdISVRFUEFQRVIpOwotCi0JCXdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfQlJFQUtET1dOX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFKTsKLQotCQl3b3JrRGVmaW5pdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX0RFRklOSVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtEZWZpbml0aW9uRUNsYXNzLCBXT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya0RlZmluaXRpb25FQ2xhc3MsIFdPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTik7Ci0KLQkJd29ya09yZGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfT1JERVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtPcmRlckVDbGFzcywgV09SS19PUkRFUl9fVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtPcmRlckVDbGFzcywgV09SS19PUkRFUl9fSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtPcmRlckVDbGFzcywgV09SS19PUkRFUl9fTElOS19UWVBFKTsKLQotCQl3b3JrUHJvZHVjdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX1BST0RVQ1QpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RUNsYXNzLCBXT1JLX1BST0RVQ1RfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3RFQ2xhc3MsIFdPUktfUFJPRFVDVF9fRVNUSU1BVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RUNsYXNzLCBXT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RUNsYXNzLCBXT1JLX1BST0RVQ1RfX1JFUE9SVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3RFQ2xhc3MsIFdPUktfUFJPRFVDVF9fVEVNUExBVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RUNsYXNzLCBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SKTsKLQotCQl3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfUFJPRFVDVF9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HKTsKLQotCQl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUX0RFU0NSSVBUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfUk9MRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVF9UTyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlkpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVF9UTyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVRfVE8pOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09VVFBVVF9GUk9NKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEUpOwotCi0JCXdvcmtQcm9kdWN0VHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX1BST0RVQ1RfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3RUeXBlRUNsYXNzLCBXT1JLX1BST0RVQ1RfVFlQRV9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdFR5cGVFQ2xhc3MsIFdPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1QpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQl2YXJpYWJpbGl0eVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFZBUklBQklMSVRZX1RZUEUpOwotCQl3b3JrT3JkZXJUeXBlRUVudW0gPSBjcmVhdGVFRW51bShXT1JLX09SREVSX1RZUEUpOwotCi0JCS8vIENyZWF0ZSBkYXRhIHR5cGVzCi0JCXZhcmlhYmlsaXR5VHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShWQVJJQUJJTElUWV9UWVBFX09CSkVDVCk7Ci0JCXdvcmtPcmRlclR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoV09SS19PUkRFUl9UWVBFX09CSkVDVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCVhNTFR5cGVQYWNrYWdlIHRoZVhNTFR5cGVQYWNrYWdlID0gKFhNTFR5cGVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTFR5cGVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKLQotCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWFjdGl2aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCWFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSk7Ci0JCWFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UGFja2FnZWFibGVFbGVtZW50KCkpOwotCQlhcnRpZmFjdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtQcm9kdWN0KCkpOwotCQlhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpKTsKLQkJYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3NFbGVtZW50KCkpOwotCQlicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCWNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2VzcygpKTsKLQkJY2hlY2tsaXN0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWNvbXBvc2l0ZVJvbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRSb2xlRGVzY3JpcHRvcigpKTsKLQkJY29uY2VwdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQljb25zdHJhaW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJY29udGVudENhdGVnb3J5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCWNvbnRlbnRDYXRlZ29yeVBhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RQYWNrYWdlKCkpOwotCQljb250ZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERlc2NyaWJhYmxlRWxlbWVudCgpKTsKLQkJY29udGVudFBhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RQYWNrYWdlKCkpOwotCQljdXN0b21DYXRlZ29yeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJZGVsaXZlcmFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSk7Ci0JCWRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3MoKSk7Ci0JCWRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkpOwotCQlkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQlkZXNjcmlwdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudCgpKTsKLQkJZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpOwotCQlkaXNjaXBsaW5lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQlkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWRvbWFpbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJZXN0aW1hdGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJZXN0aW1hdGluZ01ldHJpY0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQllc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJZXhhbXBsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlndWlkYW5jZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQlndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlndWlkZWxpbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJaXRlcmF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWN0aXZpdHkoKSk7Ci0JCWtpbmRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZFVuaXQoKSk7Ci0JCW1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQYWNrYWdlYWJsZUVsZW1lbnQoKSk7Ci0JCW1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBhY2thZ2VhYmxlRWxlbWVudCgpKTsKLQkJbWV0aG9kTGlicmFyeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZFVuaXQoKSk7Ci0JCW1ldGhvZFBhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQltZXRob2RQbHVnaW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQltZXRob2RVbml0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJbWlsZXN0b25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCW5hbWVkRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEVsZW1lbnQoKSk7Ci0JCW91dGNvbWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJcGFja2FnZWFibGVFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TmFtZWRFbGVtZW50KCkpOwotCQlwaGFzZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFjdGl2aXR5KCkpOwotCQlwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzRWxlbWVudCgpKTsKLQkJcHJhY3RpY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJcHJvY2Vzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFjdGl2aXR5KCkpOwotCQlwcm9jZXNzQ29tcG9uZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2Vzc1BhY2thZ2UoKSk7Ci0JCXByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRCcmVha2Rvd25FbGVtZW50KCkpOwotCQlwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkpOwotCQlwcm9jZXNzRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERlc2NyaWJhYmxlRWxlbWVudCgpKTsKLQkJcHJvY2Vzc1BhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RQYWNrYWdlKCkpOwotCQlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3MoKSk7Ci0JCXJlcG9ydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlyZXVzYWJsZUFzc2V0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXJvYWRtYXBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJcm9sZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQlyb2xlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCXJvbGVEZXNjcmlwdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGVzY3JpcHRvcigpKTsKLQkJcm9sZVNldEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJcm9sZVNldEdyb3VwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQlzZWN0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJc3VwcG9ydGluZ01hdGVyaWFsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXRhc2tFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJdGFza0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtCcmVha2Rvd25FbGVtZW50KCkpOwotCQl0ZWFtUHJvZmlsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCXRlbXBsYXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXRlcm1EZWZpbml0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXRvb2xFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCXRvb2xNZW50b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJd2hpdGVwYXBlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbmNlcHQoKSk7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudCgpKTsKLQkJd29ya0RlZmluaXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQl3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQl3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREZXNjcmlwdG9yKCkpOwotCQl3b3JrUHJvZHVjdFR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhhY3Rpdml0eUVDbGFzcywgQWN0aXZpdHkuY2xhc3MsICJBY3Rpdml0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlfUHJlY29uZGl0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJlY29uZGl0aW9uIiwgbnVsbCwgMCwgMSwgQWN0aXZpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5X1Bvc3Rjb25kaXRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwb3N0Y29uZGl0aW9uIiwgbnVsbCwgMCwgMSwgQWN0aXZpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5X0dyb3VwMygpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAzIiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudCgpLCB0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSwgbnVsbCwgImJyZWFrZG93bkVsZW1lbnQiLCBudWxsLCAwLCAtMSwgQWN0aXZpdHkuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5X1JvYWRtYXAoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyb2FkbWFwIiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlfSXNFbmFjdGFibGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiaXNFbmFjdGFibGUiLCBudWxsLCAwLCAxLCBBY3Rpdml0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3Rpdml0eV9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIsIG51bGwsIDAsIDEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3Rpdml0eV9WYXJpYWJpbGl0eVR5cGUoKSwgdGhpcy5nZXRWYXJpYWJpbGl0eVR5cGUoKSwgInZhcmlhYmlsaXR5VHlwZSIsICJuYSIsIDAsIDEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLCBBY3Rpdml0eURlc2NyaXB0aW9uLmNsYXNzLCAiQWN0aXZpdHlEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhbHRlcm5hdGl2ZXMiLCBudWxsLCAwLCAxLCBBY3Rpdml0eURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd1RvU3RhZmYoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJob3dUb1N0YWZmIiwgbnVsbCwgMCwgMSwgQWN0aXZpdHlEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHVycG9zZSIsIG51bGwsIDAsIDEsIEFjdGl2aXR5RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0VDbGFzcywgQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uY2xhc3MsICJBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm9fSXNQcmltYXJ5RXh0ZW5zaW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImlzUHJpbWFyeUV4dGVuc2lvbiIsIG51bGwsIDAsIDEsIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhhcnRpZmFjdEVDbGFzcywgQXJ0aWZhY3QuY2xhc3MsICJBcnRpZmFjdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXJ0aWZhY3RfR3JvdXAzKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDMiLCBudWxsLCAwLCAtMSwgQXJ0aWZhY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdCgpLCB0aGlzLmdldEFydGlmYWN0KCksIG51bGwsICJjb250YWluZWRBcnRpZmFjdCIsIG51bGwsIDAsIC0xLCBBcnRpZmFjdC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICJBcnRpZmFjdERlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImJyaWVmT3V0bGluZSIsIG51bGwsIDAsIDEsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVwcmVzZW50YXRpb25PcHRpb25zIiwgbnVsbCwgMCwgMSwgQXJ0aWZhY3REZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlcHJlc2VudGF0aW9uIiwgbnVsbCwgMCwgMSwgQXJ0aWZhY3REZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9Ob3RhdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5vdGF0aW9uIiwgbnVsbCwgMCwgMSwgQXJ0aWZhY3REZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICJCcmVha2Rvd25FbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEFmdGVyKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJlc2VudGVkQWZ0ZXIiLCBudWxsLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByZXNlbnRlZEJlZm9yZSIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnRfUGxhbm5pbmdEYXRhKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicGxhbm5pbmdEYXRhIiwgbnVsbCwgMCwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXR5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic3VwZXJBY3Rpdml0eSIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnRfR3JvdXAxKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDEiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY2hlY2tsaXN0IiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjb25jZXB0IiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X0V4YW1wbGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJleGFtcGxlIiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImd1aWRlbGluZSIsIG51bGwsIDAsIC0xLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmV1c2FibGVBc3NldCIsIG51bGwsIDAsIC0xLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzdXBwb3J0aW5nTWF0ZXJpYWwiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnRfV2hpdGVwYXBlcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIndoaXRlcGFwZXIiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIiwgbnVsbCwgMCwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiaXNPcHRpb25hbCIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9Jc1BsYW5uZWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiaXNQbGFubmVkIiwgbnVsbCwgMCwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByZWZpeCIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3MsIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5jbGFzcywgIkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ1c2FnZUd1aWRhbmNlIiwgbnVsbCwgMCwgMSwgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoY2FwYWJpbGl0eVBhdHRlcm5FQ2xhc3MsIENhcGFiaWxpdHlQYXR0ZXJuLmNsYXNzLCAiQ2FwYWJpbGl0eVBhdHRlcm4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhjaGVja2xpc3RFQ2xhc3MsIENoZWNrbGlzdC5jbGFzcywgIkNoZWNrbGlzdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGNvbXBvc2l0ZVJvbGVFQ2xhc3MsIENvbXBvc2l0ZVJvbGUuY2xhc3MsICJDb21wb3NpdGVSb2xlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb21wb3NpdGVSb2xlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIENvbXBvc2l0ZVJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlKCksIHRoaXMuZ2V0Um9sZSgpLCBudWxsLCAiYWdncmVnYXRlZFJvbGUiLCBudWxsLCAwLCAtMSwgQ29tcG9zaXRlUm9sZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbmNlcHRFQ2xhc3MsIENvbmNlcHQuY2xhc3MsICJDb25jZXB0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoY29uc3RyYWludEVDbGFzcywgQ29uc3RyYWludC5jbGFzcywgIkNvbnN0cmFpbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnN0cmFpbnRfTWFpbkRlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFpbkRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbnRlbnRDYXRlZ29yeUVDbGFzcywgQ29udGVudENhdGVnb3J5LmNsYXNzLCAiQ29udGVudENhdGVnb3J5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoY29udGVudENhdGVnb3J5UGFja2FnZUVDbGFzcywgQ29udGVudENhdGVnb3J5UGFja2FnZS5jbGFzcywgIkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgQ29udGVudENhdGVnb3J5UGFja2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfQ29udGVudENhdGVnb3J5KCksIHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCksIG51bGwsICJjb250ZW50Q2F0ZWdvcnkiLCBudWxsLCAwLCAtMSwgQ29udGVudENhdGVnb3J5UGFja2FnZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcywgQ29udGVudERlc2NyaXB0aW9uLmNsYXNzLCAiQ29udGVudERlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFpbkRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgQ29udGVudERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJrZXlDb25zaWRlcmF0aW9ucyIsIG51bGwsIDAsIDEsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb24oKSwgdGhpcy5nZXRTZWN0aW9uKCksIG51bGwsICJzZWN0aW9uIiwgbnVsbCwgMCwgLTEsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJleHRlcm5hbElkIiwgbnVsbCwgMCwgMSwgQ29udGVudERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoY29udGVudEVsZW1lbnRFQ2xhc3MsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAiQ29udGVudEVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRFbGVtZW50X0dyb3VwMSgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAxIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY2hlY2tsaXN0IiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNvbmNlcHQiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXhhbXBsZSIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImd1aWRlbGluZSIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRFbGVtZW50X1JldXNhYmxlQXNzZXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZXVzYWJsZUFzc2V0IiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic3VwcG9ydGluZ01hdGVyaWFsIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudEVsZW1lbnRfV2hpdGVwYXBlcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIndoaXRlcGFwZXIiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIsIG51bGwsIDAsIDEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKSwgdGhpcy5nZXRWYXJpYWJpbGl0eVR5cGUoKSwgInZhcmlhYmlsaXR5VHlwZSIsICJuYSIsIDAsIDEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjb250ZW50UGFja2FnZUVDbGFzcywgQ29udGVudFBhY2thZ2UuY2xhc3MsICJDb250ZW50UGFja2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudFBhY2thZ2VfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgQ29udGVudFBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudCgpLCB0aGlzLmdldENvbnRlbnRFbGVtZW50KCksIG51bGwsICJjb250ZW50RWxlbWVudCIsIG51bGwsIDAsIC0xLCBDb250ZW50UGFja2FnZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGN1c3RvbUNhdGVnb3J5RUNsYXNzLCBDdXN0b21DYXRlZ29yeS5jbGFzcywgIkN1c3RvbUNhdGVnb3J5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDdXN0b21DYXRlZ29yeV9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBDdXN0b21DYXRlZ29yeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNhdGVnb3JpemVkRWxlbWVudCIsIG51bGwsIDAsIC0xLCBDdXN0b21DYXRlZ29yeS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3J5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic3ViQ2F0ZWdvcnkiLCBudWxsLCAwLCAtMSwgQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZGVsaXZlcmFibGVFQ2xhc3MsIERlbGl2ZXJhYmxlLmNsYXNzLCAiRGVsaXZlcmFibGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJhYmxlX0dyb3VwMygpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAzIiwgbnVsbCwgMCwgLTEsIERlbGl2ZXJhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZWxpdmVyZWRXb3JrUHJvZHVjdCIsIG51bGwsIDAsIC0xLCBEZWxpdmVyYWJsZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzLCBEZWxpdmVyYWJsZURlc2NyaXB0aW9uLmNsYXNzLCAiRGVsaXZlcmFibGVEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXh0ZXJuYWxEZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwYWNrYWdpbmdHdWlkYW5jZSIsIG51bGwsIDAsIDEsIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkZWxpdmVyeVByb2Nlc3NFQ2xhc3MsIERlbGl2ZXJ5UHJvY2Vzcy5jbGFzcywgIkRlbGl2ZXJ5UHJvY2VzcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVsaXZlcnlQcm9jZXNzX0dyb3VwNCgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXA0IiwgbnVsbCwgMCwgLTEsIERlbGl2ZXJ5UHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY29tbXVuaWNhdGlvbnNNYXRlcmlhbCIsIG51bGwsIDAsIC0xLCBEZWxpdmVyeVByb2Nlc3MuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWwoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJlZHVjYXRpb25NYXRlcmlhbCIsIG51bGwsIDAsIC0xLCBEZWxpdmVyeVByb2Nlc3MuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAiRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2NhbGUiLCBudWxsLCAwLCAxLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByb2plY3RDaGFyYWN0ZXJpc3RpY3MiLCBudWxsLCAwLCAxLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmlza0xldmVsIiwgbnVsbCwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJlc3RpbWF0aW5nVGVjaG5pcXVlIiwgbnVsbCwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIiwgbnVsbCwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidHlwZU9mQ29udHJhY3QiLCBudWxsLCAwLCAxLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcywgRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCAiRGVzY3JpYmFibGVFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCksIHRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCksIG51bGwsICJwcmVzZW50YXRpb24iLCBudWxsLCAwLCAxLCBEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlc2NyaWJhYmxlRWxlbWVudF9GdWxmaWxsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZnVsZmlsbCIsIG51bGwsIDAsIC0xLCBEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmliYWJsZUVsZW1lbnRfSXNBYnN0cmFjdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJpc0Fic3RyYWN0IiwgbnVsbCwgMCwgMSwgRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5vZGVpY29uIiwgbnVsbCwgMCwgMSwgRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2hhcGVpY29uIiwgbnVsbCwgMCwgMSwgRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZGVzY3JpcHRvckVDbGFzcywgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvci5jbGFzcywgIkRlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIsIG51bGwsIDAsIDEsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzcywgRGVzY3JpcHRvckRlc2NyaXB0aW9uLmNsYXNzLCAiRGVzY3JpcHRvckRlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVmaW5lZERlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgRGVzY3JpcHRvckRlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZGlzY2lwbGluZUVDbGFzcywgRGlzY2lwbGluZS5jbGFzcywgIkRpc2NpcGxpbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERpc2NpcGxpbmVfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERpc2NpcGxpbmVfVGFzaygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInRhc2siLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldERpc2NpcGxpbmVfU3ViRGlzY2lwbGluZSgpLCB0aGlzLmdldERpc2NpcGxpbmUoKSwgbnVsbCwgInN1YkRpc2NpcGxpbmUiLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvdygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlZmVyZW5jZVdvcmtmbG93IiwgbnVsbCwgMCwgLTEsIERpc2NpcGxpbmUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzLCBEaXNjaXBsaW5lR3JvdXBpbmcuY2xhc3MsICJEaXNjaXBsaW5lR3JvdXBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERpc2NpcGxpbmVHcm91cGluZ19Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBEaXNjaXBsaW5lR3JvdXBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRpc2NpcGxpbmUiLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRvY3VtZW50Um9vdEVDbGFzcywgRG9jdW1lbnRSb290LmNsYXNzLCAiRG9jdW1lbnRSb290IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREb2N1bWVudFJvb3RfTWl4ZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgIm1peGVkIiwgbnVsbCwgMCwgLTEsIG51bGwsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5KCksIG51bGwsICJ4TUxOU1ByZWZpeE1hcCIsIG51bGwsIDAsIC0xLCBudWxsLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldERvY3VtZW50Um9vdF9YU0lTY2hlbWFMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhTSVNjaGVtYUxvY2F0aW9uIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RG9jdW1lbnRSb290X01ldGhvZENvbmZpZ3VyYXRpb24oKSwgdGhpcy5nZXRNZXRob2RDb25maWd1cmF0aW9uKCksIG51bGwsICJtZXRob2RDb25maWd1cmF0aW9uIiwgbnVsbCwgMCwgLTIsIG51bGwsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldERvY3VtZW50Um9vdF9NZXRob2RMaWJyYXJ5KCksIHRoaXMuZ2V0TWV0aG9kTGlicmFyeSgpLCBudWxsLCAibWV0aG9kTGlicmFyeSIsIG51bGwsIDAsIC0yLCBudWxsLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXREb2N1bWVudFJvb3RfTWV0aG9kUGx1Z2luKCksIHRoaXMuZ2V0TWV0aG9kUGx1Z2luKCksIG51bGwsICJtZXRob2RQbHVnaW4iLCBudWxsLCAwLCAtMiwgbnVsbCwgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRvbWFpbkVDbGFzcywgRG9tYWluLmNsYXNzLCAiRG9tYWluIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREb21haW5fR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgRG9tYWluLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RG9tYWluX1dvcmtQcm9kdWN0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAid29ya1Byb2R1Y3QiLCBudWxsLCAwLCAtMSwgRG9tYWluLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RG9tYWluX1N1YmRvbWFpbigpLCB0aGlzLmdldERvbWFpbigpLCBudWxsLCAic3ViZG9tYWluIiwgbnVsbCwgMCwgLTEsIERvbWFpbi5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGVsZW1lbnRFQ2xhc3MsIEVsZW1lbnQuY2xhc3MsICJFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoZXN0aW1hdGVFQ2xhc3MsIEVzdGltYXRlLmNsYXNzLCAiRXN0aW1hdGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVzdGltYXRlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIEVzdGltYXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXN0aW1hdGVfRXN0aW1hdGlvbk1ldHJpYygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImVzdGltYXRpb25NZXRyaWMiLCBudWxsLCAwLCAtMSwgRXN0aW1hdGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgRXN0aW1hdGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZXN0aW1hdGluZ01ldHJpY0VDbGFzcywgRXN0aW1hdGluZ01ldHJpYy5jbGFzcywgIkVzdGltYXRpbmdNZXRyaWMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNFQ2xhc3MsIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucy5jbGFzcywgIkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGV4YW1wbGVFQ2xhc3MsIEV4YW1wbGUuY2xhc3MsICJFeGFtcGxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoZ3VpZGFuY2VFQ2xhc3MsIEd1aWRhbmNlLmNsYXNzLCAiR3VpZGFuY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzLCBHdWlkYW5jZURlc2NyaXB0aW9uLmNsYXNzLCAiR3VpZGFuY2VEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYXR0YWNobWVudCIsIG51bGwsIDAsIDEsIEd1aWRhbmNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhndWlkZWxpbmVFQ2xhc3MsIEd1aWRlbGluZS5jbGFzcywgIkd1aWRlbGluZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGl0ZXJhdGlvbkVDbGFzcywgSXRlcmF0aW9uLmNsYXNzLCAiSXRlcmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Moa2luZEVDbGFzcywgS2luZC5jbGFzcywgIktpbmQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEtpbmRfQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIsIG51bGwsIDAsIC0xLCBLaW5kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICJNZXRob2RDb25maWd1cmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYmFzZUNvbmZpZ3VyYXRpb24iLCBudWxsLCAwLCAtMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWV0aG9kUGx1Z2luU2VsZWN0aW9uIiwgbnVsbCwgMCwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtZXRob2RQYWNrYWdlU2VsZWN0aW9uIiwgbnVsbCwgMCwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVmYXVsdFZpZXciLCBudWxsLCAwLCAxLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJvY2Vzc1ZpZXciLCBudWxsLCAwLCAtMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic3VidHJhY3RlZENhdGVnb3J5IiwgbnVsbCwgMCwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhZGRlZENhdGVnb3J5IiwgbnVsbCwgMCwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWV0aG9kRWxlbWVudEVDbGFzcywgTWV0aG9kRWxlbWVudC5jbGFzcywgIk1ldGhvZEVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZEVsZW1lbnRfR3JvdXAoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwIiwgbnVsbCwgMCwgLTEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RFbGVtZW50X093bmVkUnVsZSgpLCB0aGlzLmdldENvbnN0cmFpbnQoKSwgbnVsbCwgIm93bmVkUnVsZSIsIG51bGwsIDAsIC0xLCBNZXRob2RFbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLCB0aGlzLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLCBudWxsLCAibWV0aG9kRWxlbWVudFByb3BlcnR5IiwgbnVsbCwgMCwgLTEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImJyaWVmRGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X09yZGVyaW5nR3VpZGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJvcmRlcmluZ0d1aWRlIiwgbnVsbCwgMCwgMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJlc2VudGF0aW9uTmFtZSIsIG51bGwsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZEVsZW1lbnRfU3VwcHJlc3NlZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJzdXBwcmVzc2VkIiwgbnVsbCwgMCwgMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWV0aG9kRWxlbWVudFByb3BlcnR5RUNsYXNzLCBNZXRob2RFbGVtZW50UHJvcGVydHkuY2xhc3MsICJNZXRob2RFbGVtZW50UHJvcGVydHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eV9WYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgTWV0aG9kRWxlbWVudFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWV0aG9kTGlicmFyeUVDbGFzcywgTWV0aG9kTGlicmFyeS5jbGFzcywgIk1ldGhvZExpYnJhcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2luKCksIHRoaXMuZ2V0TWV0aG9kUGx1Z2luKCksIG51bGwsICJtZXRob2RQbHVnaW4iLCBudWxsLCAwLCAtMSwgTWV0aG9kTGlicmFyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RDb25maWd1cmF0aW9uKCksIHRoaXMuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLCBudWxsLCAibWV0aG9kQ29uZmlndXJhdGlvbiIsIG51bGwsIDAsIC0xLCBNZXRob2RMaWJyYXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RMaWJyYXJ5X1Rvb2woKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ0b29sIiwgbnVsbCwgMCwgMSwgTWV0aG9kTGlicmFyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZFBhY2thZ2VFQ2xhc3MsIE1ldGhvZFBhY2thZ2UuY2xhc3MsICJNZXRob2RQYWNrYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQYWNrYWdlX0dyb3VwMSgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAxIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQYWNrYWdlX1JldXNlZFBhY2thZ2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZXVzZWRQYWNrYWdlIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBhY2thZ2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RQYWNrYWdlX01ldGhvZFBhY2thZ2UoKSwgdGhpcy5nZXRNZXRob2RQYWNrYWdlKCksIG51bGwsICJtZXRob2RQYWNrYWdlIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBhY2thZ2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFBhY2thZ2VfR2xvYmFsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImdsb2JhbCIsIG51bGwsIDAsIDEsIE1ldGhvZFBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZFBsdWdpbkVDbGFzcywgTWV0aG9kUGx1Z2luLmNsYXNzLCAiTWV0aG9kUGx1Z2luIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQbHVnaW5fUmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlZmVyZW5jZWRNZXRob2RQbHVnaW4iLCBudWxsLCAwLCAtMSwgTWV0aG9kUGx1Z2luLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kUGx1Z2luX01ldGhvZFBhY2thZ2UoKSwgdGhpcy5nZXRNZXRob2RQYWNrYWdlKCksIG51bGwsICJtZXRob2RQYWNrYWdlIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBsdWdpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgInVzZXJDaGFuZ2VhYmxlIiwgbnVsbCwgMCwgMSwgTWV0aG9kUGx1Z2luLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXRob2RVbml0RUNsYXNzLCBNZXRob2RVbml0LmNsYXNzLCAiTWV0aG9kVW5pdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjb3B5cmlnaHQiLCBudWxsLCAwLCAxLCBNZXRob2RVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RVbml0X0F1dGhvcnMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhdXRob3JzIiwgbnVsbCwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEYXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldERhdGVUaW1lKCksICJjaGFuZ2VEYXRlIiwgbnVsbCwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNoYW5nZURlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmVyc2lvbiIsIG51bGwsIDAsIDEsIE1ldGhvZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtaWxlc3RvbmVFQ2xhc3MsIE1pbGVzdG9uZS5jbGFzcywgIk1pbGVzdG9uZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWlsZXN0b25lX1JlcXVpcmVkUmVzdWx0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVxdWlyZWRSZXN1bHQiLCBudWxsLCAwLCAtMSwgTWlsZXN0b25lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG5hbWVkRWxlbWVudEVDbGFzcywgTmFtZWRFbGVtZW50LmNsYXNzLCAiTmFtZWRFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXROYW1lZEVsZW1lbnRfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBOYW1lZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhvdXRjb21lRUNsYXNzLCBPdXRjb21lLmNsYXNzLCAiT3V0Y29tZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHBhY2thZ2VhYmxlRWxlbWVudEVDbGFzcywgUGFja2FnZWFibGVFbGVtZW50LmNsYXNzLCAiUGFja2FnZWFibGVFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MocGhhc2VFQ2xhc3MsIFBoYXNlLmNsYXNzLCAiUGhhc2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhwbGFubmluZ0RhdGFFQ2xhc3MsIFBsYW5uaW5nRGF0YS5jbGFzcywgIlBsYW5uaW5nRGF0YSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0RGF0ZVRpbWUoKSwgImZpbmlzaERhdGUiLCBudWxsLCAwLCAxLCBQbGFubmluZ0RhdGEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBsYW5uaW5nRGF0YV9SYW5rKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmFuayIsIG51bGwsIDAsIDEsIFBsYW5uaW5nRGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXREYXRlVGltZSgpLCAic3RhcnREYXRlIiwgbnVsbCwgMCwgMSwgUGxhbm5pbmdEYXRhLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHJhY3RpY2VFQ2xhc3MsIFByYWN0aWNlLmNsYXNzLCAiUHJhY3RpY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByYWN0aWNlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFByYWN0aWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhY3Rpdml0eVJlZmVyZW5jZSIsIG51bGwsIDAsIC0xLCBQcmFjdGljZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjb250ZW50UmVmZXJlbmNlIiwgbnVsbCwgMCwgLTEsIFByYWN0aWNlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2UoKSwgdGhpcy5nZXRQcmFjdGljZSgpLCBudWxsLCAic3ViUHJhY3RpY2UiLCBudWxsLCAwLCAtMSwgUHJhY3RpY2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLCBQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzLCAiUHJhY3RpY2VEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BZGRpdGlvbmFsSW5mbygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFkZGl0aW9uYWxJbmZvIiwgbnVsbCwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BcHBsaWNhdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFwcGxpY2F0aW9uIiwgbnVsbCwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYmFja2dyb3VuZCIsIG51bGwsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJnb2FscyIsIG51bGwsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByYWN0aWNlRGVzY3JpcHRpb25fTGV2ZWxzT2ZBZG9wdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImxldmVsc09mQWRvcHRpb24iLCBudWxsLCAwLCAxLCBQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcmFjdGljZURlc2NyaXB0aW9uX1Byb2JsZW0oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcm9ibGVtIiwgbnVsbCwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHByb2Nlc3NFQ2xhc3MsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MuY2xhc3MsICJQcm9jZXNzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImluY2x1ZGVzUGF0dGVybiIsIG51bGwsIDAsIC0xLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRlZmF1bHRDb250ZXh0IiwgbnVsbCwgMCwgMSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YWxpZENvbnRleHQiLCBudWxsLCAwLCAtMSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NfRGlhZ3JhbVVSSSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRpYWdyYW1VUkkiLCBudWxsLCAwLCAxLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHJvY2Vzc0NvbXBvbmVudEVDbGFzcywgUHJvY2Vzc0NvbXBvbmVudC5jbGFzcywgIlByb2Nlc3NDb21wb25lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NDb21wb25lbnRfQ29weXJpZ2h0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY29weXJpZ2h0IiwgbnVsbCwgMCwgMSwgUHJvY2Vzc0NvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UHJvY2Vzc0NvbXBvbmVudF9JbnRlcmZhY2UoKSwgdGhpcy5nZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCksIG51bGwsICJpbnRlcmZhY2UiLCBudWxsLCAwLCAxLCBQcm9jZXNzQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKSwgdGhpcy5nZXRQcm9jZXNzKCksIG51bGwsICJwcm9jZXNzIiwgbnVsbCwgMSwgMSwgUHJvY2Vzc0NvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc0NvbXBvbmVudF9BdXRob3JzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYXV0aG9ycyIsIG51bGwsIDAsIDEsIFByb2Nlc3NDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGF0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXREYXRlVGltZSgpLCAiY2hhbmdlRGF0ZSIsIG51bGwsIDAsIDEsIFByb2Nlc3NDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGVzY3JpcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjaGFuZ2VEZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFByb2Nlc3NDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NDb21wb25lbnRfVmVyc2lvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZlcnNpb24iLCBudWxsLCAwLCAxLCBQcm9jZXNzQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcywgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5jbGFzcywgIlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpLCB0aGlzLmdldFRhc2tEZXNjcmlwdG9yKCksIG51bGwsICJpbnRlcmZhY2VTcGVjaWZpY2F0aW9uIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKSwgdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwgbnVsbCwgImludGVyZmFjZUlPIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIFByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIlByb2Nlc3NEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2NvcGUiLCBudWxsLCAwLCAxLCBQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidXNhZ2VOb3RlcyIsIG51bGwsIDAsIDEsIFByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHByb2Nlc3NFbGVtZW50RUNsYXNzLCBQcm9jZXNzRWxlbWVudC5jbGFzcywgIlByb2Nlc3NFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MocHJvY2Vzc1BhY2thZ2VFQ2xhc3MsIFByb2Nlc3NQYWNrYWdlLmNsYXNzLCAiUHJvY2Vzc1BhY2thZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NQYWNrYWdlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnQoKSwgdGhpcy5nZXRQcm9jZXNzRWxlbWVudCgpLCBudWxsLCAicHJvY2Vzc0VsZW1lbnQiLCBudWxsLCAwLCAtMSwgUHJvY2Vzc1BhY2thZ2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcywgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuY2xhc3MsICJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfR3JvdXA0KCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDQiLCBudWxsLCAwLCAtMSwgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlUHJvY2VzcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImJhc2VQcm9jZXNzIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJlcG9ydEVDbGFzcywgUmVwb3J0LmNsYXNzLCAiUmVwb3J0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MocmV1c2FibGVBc3NldEVDbGFzcywgUmV1c2FibGVBc3NldC5jbGFzcywgIlJldXNhYmxlQXNzZXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhyb2FkbWFwRUNsYXNzLCBSb2FkbWFwLmNsYXNzLCAiUm9hZG1hcCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHJvbGVFQ2xhc3MsIFJvbGUuY2xhc3MsICJSb2xlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVzcG9uc2libGVGb3IiLCBudWxsLCAwLCAtMSwgUm9sZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhyb2xlRGVzY3JpcHRpb25FQ2xhc3MsIFJvbGVEZXNjcmlwdGlvbi5jbGFzcywgIlJvbGVEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYXNzaWdubWVudEFwcHJvYWNoZXMiLCBudWxsLCAwLCAxLCBSb2xlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVEZXNjcmlwdGlvbl9Ta2lsbHMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJza2lsbHMiLCBudWxsLCAwLCAxLCBSb2xlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVEZXNjcmlwdGlvbl9TeW5vbnltcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInN5bm9ueW1zIiwgbnVsbCwgMCwgMSwgUm9sZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mocm9sZURlc2NyaXB0b3JFQ2xhc3MsIFJvbGVEZXNjcmlwdG9yLmNsYXNzLCAiUm9sZURlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyb2xlIiwgbnVsbCwgMCwgMSwgUm9sZURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVzcG9uc2libGVGb3IiLCBudWxsLCAwLCAtMSwgUm9sZURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mocm9sZVNldEVDbGFzcywgUm9sZVNldC5jbGFzcywgIlJvbGVTZXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVTZXRfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgUm9sZVNldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVTZXRfUm9sZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJvbGUiLCBudWxsLCAwLCAtMSwgUm9sZVNldC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhyb2xlU2V0R3JvdXBpbmdFQ2xhc3MsIFJvbGVTZXRHcm91cGluZy5jbGFzcywgIlJvbGVTZXRHcm91cGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZVNldEdyb3VwaW5nX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFJvbGVTZXRHcm91cGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicm9sZVNldCIsIG51bGwsIDAsIC0xLCBSb2xlU2V0R3JvdXBpbmcuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Moc2VjdGlvbkVDbGFzcywgU2VjdGlvbi5jbGFzcywgIlNlY3Rpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlY3Rpb25fU3ViU2VjdGlvbigpLCB0aGlzLmdldFNlY3Rpb24oKSwgbnVsbCwgInN1YlNlY3Rpb24iLCBudWxsLCAwLCAxLCBTZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJlZGVjZXNzb3IiLCBudWxsLCAwLCAxLCBTZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN0aW9uX0Rlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBTZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2VjdGlvbk5hbWUiLCBudWxsLCAwLCAxLCBTZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN0aW9uX1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiwgbnVsbCwgMCwgMSwgU2VjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eVR5cGUoKSwgdGhpcy5nZXRWYXJpYWJpbGl0eVR5cGUoKSwgInZhcmlhYmlsaXR5VHlwZSIsICJuYSIsIDAsIDEsIFNlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzcywgU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzLCAiU3VwcG9ydGluZ01hdGVyaWFsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3ModGFza0VDbGFzcywgVGFzay5jbGFzcywgIlRhc2siLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfUHJlY29uZGl0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJlY29uZGl0aW9uIiwgbnVsbCwgMCwgMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza19Qb3N0Y29uZGl0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicG9zdGNvbmRpdGlvbiIsIG51bGwsIDAsIDEsIFRhc2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfUGVyZm9ybWVkQnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwZXJmb3JtZWRCeSIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza19Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hbmRhdG9yeUlucHV0IiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrX091dHB1dCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm91dHB1dCIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJvcHRpb25hbElucHV0IiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrX0VzdGltYXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXN0aW1hdGUiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrX1Rvb2xNZW50b3IoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ0b29sTWVudG9yIiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3ModGFza0Rlc2NyaXB0aW9uRUNsYXNzLCBUYXNrRGVzY3JpcHRpb24uY2xhc3MsICJUYXNrRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhbHRlcm5hdGl2ZXMiLCBudWxsLCAwLCAxLCBUYXNrRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tEZXNjcmlwdGlvbl9QdXJwb3NlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHVycG9zZSIsIG51bGwsIDAsIDEsIFRhc2tEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIlRhc2tEZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidGFzayIsIG51bGwsIDAsIDEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInBlcmZvcm1lZFByaW1hcmlseUJ5IiwgbnVsbCwgMCwgMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tEZXNjcmlwdG9yX0dyb3VwMygpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAzIiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhc3Npc3RlZEJ5IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImV4dGVybmFsSW5wdXQiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hbmRhdG9yeUlucHV0IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm9wdGlvbmFsSW5wdXQiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJvdXRwdXQiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRUYXNrRGVzY3JpcHRvcl9TdGVwKCksIHRoaXMuZ2V0U2VjdGlvbigpLCBudWxsLCAic3RlcCIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIsIG51bGwsIDAsIDEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh0ZWFtUHJvZmlsZUVDbGFzcywgVGVhbVByb2ZpbGUuY2xhc3MsICJUZWFtUHJvZmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGVhbVByb2ZpbGVfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgVGVhbVByb2ZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUZWFtUHJvZmlsZV9Sb2xlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicm9sZSIsIG51bGwsIDAsIC0xLCBUZWFtUHJvZmlsZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInN1cGVyVGVhbSIsIG51bGwsIDAsIC0xLCBUZWFtUHJvZmlsZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzdWJUZWFtIiwgbnVsbCwgMCwgLTEsIFRlYW1Qcm9maWxlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHRlbXBsYXRlRUNsYXNzLCBUZW1wbGF0ZS5jbGFzcywgIlRlbXBsYXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3ModGVybURlZmluaXRpb25FQ2xhc3MsIFRlcm1EZWZpbml0aW9uLmNsYXNzLCAiVGVybURlZmluaXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh0b29sRUNsYXNzLCBUb29sLmNsYXNzLCAiVG9vbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VG9vbF9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBUb29sLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VG9vbF9Ub29sTWVudG9yKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidG9vbE1lbnRvciIsIG51bGwsIDAsIC0xLCBUb29sLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHRvb2xNZW50b3JFQ2xhc3MsIFRvb2xNZW50b3IuY2xhc3MsICJUb29sTWVudG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Mod2hpdGVwYXBlckVDbGFzcywgV2hpdGVwYXBlci5jbGFzcywgIldoaXRlcGFwZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsICJXb3JrQnJlYWtkb3duRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9QcmVkZWNlc3NvcigpLCB0aGlzLmdldFdvcmtPcmRlcigpLCBudWxsLCAicHJlZGVjZXNzb3IiLCBudWxsLCAwLCAtMSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiaXNFdmVudERyaXZlbiIsIG51bGwsIDAsIDEsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJpc09uZ29pbmciLCBudWxsLCAwLCAxLCBXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiaXNSZXBlYXRhYmxlIiwgbnVsbCwgMCwgMSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdvcmtEZWZpbml0aW9uRUNsYXNzLCBXb3JrRGVmaW5pdGlvbi5jbGFzcywgIldvcmtEZWZpbml0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcmVjb25kaXRpb24iLCBudWxsLCAwLCAxLCBXb3JrRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInBvc3Rjb25kaXRpb24iLCBudWxsLCAwLCAxLCBXb3JrRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdvcmtPcmRlckVDbGFzcywgV29ya09yZGVyLmNsYXNzLCAiV29ya09yZGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrT3JkZXJfVmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIFdvcmtPcmRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya09yZGVyX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBXb3JrT3JkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtPcmRlcl9MaW5rVHlwZSgpLCB0aGlzLmdldFdvcmtPcmRlclR5cGUoKSwgImxpbmtUeXBlIiwgImZpbmlzaFRvU3RhcnQiLCAwLCAxLCBXb3JrT3JkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdvcmtQcm9kdWN0RUNsYXNzLCBXb3JrUHJvZHVjdC5jbGFzcywgIldvcmtQcm9kdWN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdF9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0X0VzdGltYXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXN0aW1hdGUiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3QuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3QuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdF9SZXBvcnQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZXBvcnQiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3QuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInRlbXBsYXRlIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInRvb2xNZW50b3IiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3QuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcywgV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5jbGFzcywgIldvcmtQcm9kdWN0RGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJpbXBhY3RPZk5vdEhhdmluZyIsIG51bGwsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInB1cnBvc2UiLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVhc29uc0Zvck5vdE5lZWRpbmciLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsICJXb3JrUHJvZHVjdERlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIndvcmtQcm9kdWN0IiwgbnVsbCwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfUmVzcG9uc2libGVSb2xlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVzcG9uc2libGVSb2xlIiwgbnVsbCwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUbygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImV4dGVybmFsSW5wdXRUbyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImltcGFjdGVkQnkiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJpbXBhY3RzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFuZGF0b3J5SW5wdXRUbyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dFRvKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAib3B0aW9uYWxJbnB1dFRvIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PdXRwdXRGcm9tKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAib3V0cHV0RnJvbSIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRlbGl2ZXJhYmxlUGFydHMiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFjdGl2aXR5RW50cnlTdGF0ZSIsIG51bGwsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYWN0aXZpdHlFeGl0U3RhdGUiLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3b3JrUHJvZHVjdFR5cGVFQ2xhc3MsIFdvcmtQcm9kdWN0VHlwZS5jbGFzcywgIldvcmtQcm9kdWN0VHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3RUeXBlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIndvcmtQcm9kdWN0IiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0VHlwZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuY2xhc3MsICJWYXJpYWJpbGl0eVR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuTkEpOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUyk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUyk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTik7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19SRVBMQUNFUyk7Ci0KLQkJaW5pdEVFbnVtKHdvcmtPcmRlclR5cGVFRW51bSwgV29ya09yZGVyVHlwZS5jbGFzcywgIldvcmtPcmRlclR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHdvcmtPcmRlclR5cGVFRW51bSwgV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fU1RBUlQpOwotCQlhZGRFRW51bUxpdGVyYWwod29ya09yZGVyVHlwZUVFbnVtLCBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0gpOwotCQlhZGRFRW51bUxpdGVyYWwod29ya09yZGVyVHlwZUVFbnVtLCBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX1NUQVJUKTsKLQkJYWRkRUVudW1MaXRlcmFsKHdvcmtPcmRlclR5cGVFRW51bSwgV29ya09yZGVyVHlwZS5TVEFSVF9UT19GSU5JU0gpOwotCi0JCS8vIEluaXRpYWxpemUgZGF0YSB0eXBlcwotCQlpbml0RURhdGFUeXBlKHZhcmlhYmlsaXR5VHlwZU9iamVjdEVEYXRhVHlwZSwgVmFyaWFiaWxpdHlUeXBlLmNsYXNzLCAiVmFyaWFiaWxpdHlUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RURhdGFUeXBlKHdvcmtPcmRlclR5cGVPYmplY3RFRGF0YVR5cGUsIFdvcmtPcmRlclR5cGUuY2xhc3MsICJXb3JrT3JkZXJUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQotCQkvLyBDcmVhdGUgYW5ub3RhdGlvbnMKLQkJLy8gaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhCi0JCWNyZWF0ZUV4dGVuZGVkTWV0YURhdGFBbm5vdGF0aW9ucygpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBhbm5vdGF0aW9ucyBmb3IgPGI+aHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhPC9iPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKSB7Ci0JCVN0cmluZyBzb3VyY2UgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIjsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChhY3Rpdml0eUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQWN0aXZpdHkiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X1ByZWNvbmRpdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcmVjb25kaXRpb24iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZpdHlfUG9zdGNvbmRpdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQb3N0Y29uZGl0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X0dyb3VwMygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MzciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJCcmVha2Rvd25FbGVtZW50IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjM3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X1JvYWRtYXAoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUm9hZG1hcCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozNyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eV9Jc0VuYWN0YWJsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgIklzRW5hY3RhYmxlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5VHlwZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInZhcmlhYmlsaXR5VHlwZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQWN0aXZpdHlEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFsdGVybmF0aXZlcyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3dUb1N0YWZmKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkhvd1RvU3RhZmYiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQdXJwb3NlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIsCi0JCQkgImtpbmQiLCAiZW1wdHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm9fSXNQcmltYXJ5RXh0ZW5zaW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaXNQcmltYXJ5RXh0ZW5zaW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChhcnRpZmFjdEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQXJ0aWZhY3QiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFydGlmYWN0X0dyb3VwMygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MzAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ29udGFpbmVkQXJ0aWZhY3QiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzAiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkFydGlmYWN0RGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJCcmllZk91dGxpbmUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJlcHJlc2VudGF0aW9uT3B0aW9ucyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJlcHJlc2VudGF0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFydGlmYWN0RGVzY3JpcHRpb25fTm90YXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTm90YXRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkJyZWFrZG93bkVsZW1lbnQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJlc2VudGVkQWZ0ZXIiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJlc2VudGVkQmVmb3JlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfUGxhbm5pbmdEYXRhKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlBsYW5uaW5nRGF0YSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X1N1cGVyQWN0aXZpdHkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3VwZXJBY3Rpdml0eSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X0dyb3VwMSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MTgiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ2hlY2tsaXN0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjE4IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfQ29uY2VwdCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJDb25jZXB0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjE4IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfRXhhbXBsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJFeGFtcGxlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjE4IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfR3VpZGVsaW5lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkd1aWRlbGluZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxOCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X1JldXNhYmxlQXNzZXQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmV1c2FibGVBc3NldCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxOCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTdXBwb3J0aW5nTWF0ZXJpYWwiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTgiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QnJlYWtkb3duRWxlbWVudF9XaGl0ZXBhcGVyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIldoaXRlcGFwZXIiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTgiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImhhc011bHRpcGxlT2NjdXJyZW5jZXMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlzT3B0aW9uYWwiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaXNQbGFubmVkIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInByZWZpeCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInVzYWdlR3VpZGFuY2UiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJDYXBhYmlsaXR5UGF0dGVybiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNoZWNrbGlzdEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ2hlY2tsaXN0IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoY29tcG9zaXRlUm9sZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ29tcG9zaXRlUm9sZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29tcG9zaXRlUm9sZV9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjMzIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQWdncmVnYXRlZFJvbGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNvbmNlcHRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkNvbmNlcHQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjb25zdHJhaW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJDb25zdHJhaW50IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29uc3RyYWludF9NYWluRGVzY3JpcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJtYWluRGVzY3JpcHRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNvbnRlbnRDYXRlZ29yeUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ29udGVudENhdGVnb3J5IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoY29udGVudENhdGVnb3J5UGFja2FnZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ29udGVudENhdGVnb3J5UGFja2FnZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZV9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjEzIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfQ29udGVudENhdGVnb3J5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkNvbnRlbnRDYXRlZ29yeSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxMyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoY29udGVudERlc2NyaXB0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJDb250ZW50RGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1haW5EZXNjcmlwdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIktleUNvbnNpZGVyYXRpb25zIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlNlY3Rpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiZXh0ZXJuYWxJZCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoY29udGVudEVsZW1lbnRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkNvbnRlbnRFbGVtZW50IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RWxlbWVudF9Hcm91cDEoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjE0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJDaGVja2xpc3QiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJDb25jZXB0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjE0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRFbGVtZW50X0V4YW1wbGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXhhbXBsZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiR3VpZGVsaW5lIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjE0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRFbGVtZW50X1JldXNhYmxlQXNzZXQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmV1c2FibGVBc3NldCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3VwcG9ydGluZ01hdGVyaWFsIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjE0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRFbGVtZW50X1doaXRlcGFwZXIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiV2hpdGVwYXBlciIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ2YXJpYWJpbGl0eVR5cGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNvbnRlbnRQYWNrYWdlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJDb250ZW50UGFja2FnZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudFBhY2thZ2VfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxMyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJDb250ZW50RWxlbWVudCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxMyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkN1c3RvbUNhdGVnb3J5IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDdXN0b21DYXRlZ29yeV9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJDYXRlZ29yaXplZEVsZW1lbnQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3ViQ2F0ZWdvcnkiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRlbGl2ZXJhYmxlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJEZWxpdmVyYWJsZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcmFibGVfR3JvdXAzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDozMCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJEZWxpdmVyZWRXb3JrUHJvZHVjdCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozMCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRGVsaXZlcmFibGVEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJFeHRlcm5hbERlc2NyaXB0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX1BhY2thZ2luZ0d1aWRhbmNlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlBhY2thZ2luZ0d1aWRhbmNlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkZWxpdmVyeVByb2Nlc3NFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkRlbGl2ZXJ5UHJvY2VzcyIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcnlQcm9jZXNzX0dyb3VwNCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6NDciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ29tbXVuaWNhdGlvbnNNYXRlcmlhbCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDo0NyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRWR1Y2F0aW9uTWF0ZXJpYWwiLAotCQkJICJncm91cCIsICIjZ3JvdXA6NDciCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlNjYWxlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByb2plY3RDaGFyYWN0ZXJpc3RpY3MiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Jpc2tMZXZlbCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSaXNrTGV2ZWwiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXN0aW1hdGluZ1RlY2huaXF1ZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdE1lbWJlckV4cGVydGlzZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJUeXBlT2ZDb250cmFjdCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJEZXNjcmliYWJsZUVsZW1lbnQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJlc2VudGF0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlc2NyaWJhYmxlRWxlbWVudF9GdWxmaWxsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkZ1bGZpbGwiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVzY3JpYmFibGVFbGVtZW50X0lzQWJzdHJhY3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJpc0Fic3RyYWN0IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZXNjcmliYWJsZUVsZW1lbnRfTm9kZWljb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJub2RlaWNvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVzY3JpYmFibGVFbGVtZW50X1NoYXBlaWNvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInNoYXBlaWNvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZGVzY3JpcHRvckVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRGVzY3JpcHRvciIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRGVzY3JpcHRvckRlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZWZpbmVkRGVzY3JpcHRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRpc2NpcGxpbmVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkRpc2NpcGxpbmUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERpc2NpcGxpbmVfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREaXNjaXBsaW5lX1Rhc2soKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiVGFzayIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREaXNjaXBsaW5lX1N1YkRpc2NpcGxpbmUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3ViRGlzY2lwbGluZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJlZmVyZW5jZVdvcmtmbG93IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkRpc2NpcGxpbmVHcm91cGluZyIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRGlzY2lwbGluZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkb2N1bWVudFJvb3RFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIiIsCi0JCQkgImtpbmQiLCAibWl4ZWQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RG9jdW1lbnRSb290X01peGVkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnRXaWxkY2FyZCIsCi0JCQkgIm5hbWUiLCAiOm1peGVkIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvY3VtZW50Um9vdF9YTUxOU1ByZWZpeE1hcCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInhtbG5zOnByZWZpeCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ4c2k6c2NoZW1hTG9jYXRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvY3VtZW50Um9vdF9NZXRob2RDb25maWd1cmF0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1ldGhvZENvbmZpZ3VyYXRpb24iLAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvY3VtZW50Um9vdF9NZXRob2RMaWJyYXJ5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1ldGhvZExpYnJhcnkiLAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvY3VtZW50Um9vdF9NZXRob2RQbHVnaW4oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTWV0aG9kUGx1Z2luIiwKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkb21haW5FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkRvbWFpbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RG9tYWluX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RG9tYWluX1dvcmtQcm9kdWN0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIldvcmtQcm9kdWN0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvbWFpbl9TdWJkb21haW4oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3ViZG9tYWluIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChlbGVtZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJFbGVtZW50IiwKLQkJCSAia2luZCIsICJlbXB0eSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZXN0aW1hdGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkVzdGltYXRlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFc3RpbWF0ZV9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVzdGltYXRlX0VzdGltYXRpb25NZXRyaWMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXN0aW1hdGlvbk1ldHJpYyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChlc3RpbWF0aW5nTWV0cmljRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJFc3RpbWF0aW5nTWV0cmljIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChleGFtcGxlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJFeGFtcGxlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ3VpZGFuY2VFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkd1aWRhbmNlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiR3VpZGFuY2VEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJBdHRhY2htZW50IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChndWlkZWxpbmVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkd1aWRlbGluZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGl0ZXJhdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiSXRlcmF0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChraW5kRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJLaW5kIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRLaW5kX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJNZXRob2RDb25maWd1cmF0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkJhc2VDb25maWd1cmF0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1ldGhvZFBsdWdpblNlbGVjdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTWV0aG9kUGFja2FnZVNlbGVjdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkRlZmF1bHRWaWV3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXcoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJvY2Vzc1ZpZXciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9TdWJ0cmFjdGVkQ2F0ZWdvcnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3VidHJhY3RlZENhdGVnb3J5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZENvbmZpZ3VyYXRpb25fQWRkZWRDYXRlZ29yeSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJBZGRlZENhdGVnb3J5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXRob2RFbGVtZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJNZXRob2RFbGVtZW50IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RFbGVtZW50X0dyb3VwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RFbGVtZW50X093bmVkUnVsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJPd25lZFJ1bGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNZXRob2RFbGVtZW50UHJvcGVydHkiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiYnJpZWZEZXNjcmlwdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudF9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlkIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RFbGVtZW50X09yZGVyaW5nR3VpZGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJvcmRlcmluZ0d1aWRlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJwcmVzZW50YXRpb25OYW1lIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJzdXBwcmVzc2VkIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTWV0aG9kRWxlbWVudFByb3BlcnR5IiwKLQkJCSAia2luZCIsICJlbXB0eSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RFbGVtZW50UHJvcGVydHlfVmFsdWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ2YWx1ZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWV0aG9kTGlicmFyeUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTWV0aG9kTGlicmFyeSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW4oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTWV0aG9kUGx1Z2luIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZExpYnJhcnlfTWV0aG9kQ29uZmlndXJhdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNZXRob2RDb25maWd1cmF0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RMaWJyYXJ5X1Rvb2woKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ0b29sIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXRob2RQYWNrYWdlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJNZXRob2RQYWNrYWdlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RQYWNrYWdlX0dyb3VwMSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6OSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RQYWNrYWdlX1JldXNlZFBhY2thZ2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmV1c2VkUGFja2FnZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDo5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFBhY2thZ2VfTWV0aG9kUGFja2FnZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNZXRob2RQYWNrYWdlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFBhY2thZ2VfR2xvYmFsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiZ2xvYmFsIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXRob2RQbHVnaW5FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIk1ldGhvZFBsdWdpbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kUGx1Z2luX1JlZmVyZW5jZWRNZXRob2RQbHVnaW4oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmVmZXJlbmNlZE1ldGhvZFBsdWdpbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNZXRob2RQYWNrYWdlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInVzZXJDaGFuZ2VhYmxlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXRob2RVbml0RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJNZXRob2RVbml0IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RVbml0X0NvcHlyaWdodCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJDb3B5cmlnaHQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFVuaXRfQXV0aG9ycygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImF1dGhvcnMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImNoYW5nZURhdGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJjaGFuZ2VEZXNjcmlwdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidmVyc2lvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWlsZXN0b25lRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJNaWxlc3RvbmUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1pbGVzdG9uZV9SZXF1aXJlZFJlc3VsdCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZXF1aXJlZFJlc3VsdCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobmFtZWRFbGVtZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJOYW1lZEVsZW1lbnQiLAotCQkJICJraW5kIiwgImVtcHR5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE5hbWVkRWxlbWVudF9OYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAibmFtZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAob3V0Y29tZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiT3V0Y29tZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHBhY2thZ2VhYmxlRWxlbWVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUGFja2FnZWFibGVFbGVtZW50IiwKLQkJCSAia2luZCIsICJlbXB0eSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocGhhc2VFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlBoYXNlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocGxhbm5pbmdEYXRhRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQbGFubmluZ0RhdGEiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQbGFubmluZ0RhdGFfRmluaXNoRGF0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImZpbmlzaERhdGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFBsYW5uaW5nRGF0YV9SYW5rKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAicmFuayIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInN0YXJ0RGF0ZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocHJhY3RpY2VFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlByYWN0aWNlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZV9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFjdGl2aXR5UmVmZXJlbmNlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ29udGVudFJlZmVyZW5jZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZV9TdWJQcmFjdGljZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTdWJQcmFjdGljZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUHJhY3RpY2VEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQWRkaXRpb25hbEluZm8iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQXBwbGljYXRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJCYWNrZ3JvdW5kIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkdvYWxzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTGV2ZWxzT2ZBZG9wdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByb2JsZW0iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByb2Nlc3NFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlByb2Nlc3MiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NfSW5jbHVkZXNQYXR0ZXJuKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkluY2x1ZGVzUGF0dGVybiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkRlZmF1bHRDb250ZXh0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlZhbGlkQ29udGV4dCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc19EaWFncmFtVVJJKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiZGlhZ3JhbVVSSSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocHJvY2Vzc0NvbXBvbmVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUHJvY2Vzc0NvbXBvbmVudCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0NvbXBvbmVudF9Db3B5cmlnaHQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ29weXJpZ2h0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NDb21wb25lbnRfSW50ZXJmYWNlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkludGVyZmFjZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJvY2VzcyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0NvbXBvbmVudF9BdXRob3JzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiYXV0aG9ycyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0NvbXBvbmVudF9DaGFuZ2VEYXRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiY2hhbmdlRGF0ZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0NvbXBvbmVudF9DaGFuZ2VEZXNjcmlwdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImNoYW5nZURlc2NyaXB0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzQ29tcG9uZW50X1ZlcnNpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ2ZXJzaW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MzAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkludGVyZmFjZVNwZWNpZmljYXRpb24iLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VJTygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJJbnRlcmZhY2VJTyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozMCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQcm9jZXNzRGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU2NvcGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlVzYWdlTm90ZXMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByb2Nlc3NFbGVtZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQcm9jZXNzRWxlbWVudCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByb2Nlc3NQYWNrYWdlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQcm9jZXNzUGFja2FnZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc1BhY2thZ2VfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxMyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzUGFja2FnZV9Qcm9jZXNzRWxlbWVudCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcm9jZXNzRWxlbWVudCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxMyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9Hcm91cDQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjQ3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0Jhc2VQcm9jZXNzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkJhc2VQcm9jZXNzIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjQ3IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyZXBvcnRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlJlcG9ydCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHJldXNhYmxlQXNzZXRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlJldXNhYmxlQXNzZXQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyb2FkbWFwRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJSb2FkbWFwIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocm9sZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUm9sZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZV9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmVzcG9uc2libGVGb3IiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHJvbGVEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUm9sZURlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFzc2lnbm1lbnRBcHByb2FjaGVzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlNraWxscyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN5bm9ueW1zIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyb2xlRGVzY3JpcHRvckVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUm9sZURlc2NyaXB0b3IiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUm9sZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZXNwb25zaWJsZUZvciIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocm9sZVNldEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUm9sZVNldCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZVNldF9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVTZXRfUm9sZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSb2xlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyb2xlU2V0R3JvdXBpbmdFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlJvbGVTZXRHcm91cGluZyIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZVNldEdyb3VwaW5nX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUm9sZVNldCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoc2VjdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiU2VjdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdGlvbl9TdWJTZWN0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN1YlNlY3Rpb24iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdGlvbl9QcmVkZWNlc3NvcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcmVkZWNlc3NvciIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdGlvbl9EZXNjcmlwdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJEZXNjcmlwdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdGlvbl9TZWN0aW9uTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInNlY3Rpb25OYW1lIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3Rpb25fVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eVR5cGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ2YXJpYWJpbGl0eVR5cGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiU3VwcG9ydGluZ01hdGVyaWFsIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodGFza0VDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVGFzayIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza19QcmVjb25kaXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJlY29uZGl0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfUG9zdGNvbmRpdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQb3N0Y29uZGl0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfUGVyZm9ybWVkQnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUGVyZm9ybWVkQnkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza19Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTWFuZGF0b3J5SW5wdXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza19PdXRwdXQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiT3V0cHV0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza19PcHRpb25hbElucHV0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk9wdGlvbmFsSW5wdXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza19Fc3RpbWF0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJFc3RpbWF0ZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza19Ub29sTWVudG9yKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlRvb2xNZW50b3IiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjciCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHRhc2tEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVGFza0Rlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJBbHRlcm5hdGl2ZXMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdGlvbl9QdXJwb3NlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlB1cnBvc2UiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJUYXNrRGVzY3JpcHRvciIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJUYXNrIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlBlcmZvcm1lZFByaW1hcmlseUJ5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX0dyb3VwMygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MzciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJBc3Npc3RlZEJ5IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjM3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXh0ZXJuYWxJbnB1dCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozNyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNYW5kYXRvcnlJbnB1dCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozNyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk9wdGlvbmFsSW5wdXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk91dHB1dCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozNyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrRGVzY3JpcHRvcl9TdGVwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN0ZXAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0ZWFtUHJvZmlsZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVGVhbVByb2ZpbGUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRlYW1Qcm9maWxlX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MzAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGVhbVByb2ZpbGVfUm9sZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSb2xlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjMwIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTdXBlclRlYW0iLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTdWJUZWFtIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjMwIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0ZW1wbGF0ZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVGVtcGxhdGUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0ZXJtRGVmaW5pdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVGVybURlZmluaXRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0b29sRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJUb29sIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUb29sX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VG9vbF9Ub29sTWVudG9yKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlRvb2xNZW50b3IiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHRvb2xNZW50b3JFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlRvb2xNZW50b3IiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh2YXJpYWJpbGl0eVR5cGVFRW51bSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVmFyaWFiaWxpdHlUeXBlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHZhcmlhYmlsaXR5VHlwZU9iamVjdEVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVmFyaWFiaWxpdHlUeXBlOk9iamVjdCIsCi0JCQkgImJhc2VUeXBlIiwgIlZhcmlhYmlsaXR5VHlwZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod2hpdGVwYXBlckVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV2hpdGVwYXBlciIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJXb3JrQnJlYWtkb3duRWxlbWVudCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDozMCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9QcmVkZWNlc3NvcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcmVkZWNlc3NvciIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozMCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlzRXZlbnREcml2ZW4iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlzT25nb2luZyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaXNSZXBlYXRhYmxlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3b3JrRGVmaW5pdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV29ya0RlZmluaXRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtEZWZpbml0aW9uX1ByZWNvbmRpdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcmVjb25kaXRpb24iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQb3N0Y29uZGl0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3b3JrT3JkZXJFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIldvcmtPcmRlciIsCi0JCQkgImtpbmQiLCAic2ltcGxlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtPcmRlcl9WYWx1ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICI6MCIsCi0JCQkgImtpbmQiLCAic2ltcGxlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrT3JkZXJfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJpZCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya09yZGVyX0xpbmtUeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAibGlua1R5cGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdvcmtPcmRlclR5cGVFRW51bSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV29ya09yZGVyVHlwZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3b3JrT3JkZXJUeXBlT2JqZWN0RURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJXb3JrT3JkZXJUeXBlOk9iamVjdCIsCi0JCQkgImJhc2VUeXBlIiwgIldvcmtPcmRlclR5cGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdvcmtQcm9kdWN0RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJXb3JrUHJvZHVjdCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3RfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJFc3RpbWF0ZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0X1JlcG9ydCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZXBvcnQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiVGVtcGxhdGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJUb29sTWVudG9yIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJJbXBhY3RPZk5vdEhhdmluZyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlB1cnBvc2UiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmVhc29uc0Zvck5vdE5lZWRpbmciCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV29ya1Byb2R1Y3REZXNjcmlwdG9yIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiV29ya1Byb2R1Y3QiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1Jlc3BvbnNpYmxlUm9sZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZXNwb25zaWJsZVJvbGUiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MzMiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUbygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJFeHRlcm5hbElucHV0VG8iLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzMiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiSW1wYWN0ZWRCeSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozMyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJJbXBhY3RzIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjMzIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1hbmRhdG9yeUlucHV0VG8iLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzMiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX09wdGlvbmFsSW5wdXRUbygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJPcHRpb25hbElucHV0VG8iLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzMiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb20oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiT3V0cHV0RnJvbSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozMyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJEZWxpdmVyYWJsZVBhcnRzIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjMzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiYWN0aXZpdHlFbnRyeVN0YXRlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJhY3Rpdml0eUV4aXRTdGF0ZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod29ya1Byb2R1Y3RUeXBlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJXb3JrUHJvZHVjdFR5cGUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0VHlwZV9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJXb3JrUHJvZHVjdCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7Ci0JfQotCi19IC8vVW1hUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1doaXRlcGFwZXJJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9XaGl0ZXBhcGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWUwNzM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1doaXRlcGFwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdoaXRlcGFwZXJJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdoaXRlcGFwZXJJbXBsIGV4dGVuZHMgQ29uY2VwdEltcGwgaW1wbGVtZW50cyBXaGl0ZXBhcGVyIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2hpdGVwYXBlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldISVRFUEFQRVI7Ci0JfQotCi19IC8vV2hpdGVwYXBlckltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtCcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDZlYWQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtCcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCNnZXRQcmVkZWNlc3NvciA8ZW0+UHJlZGVjZXNzb3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsI2lzSXNFdmVudERyaXZlbiA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCNpc0lzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwjaXNJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrQnJlYWtkb3duRWxlbWVudEltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzIFdvcmtCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNFdmVudERyaXZlbigpIDxlbT5JcyBFdmVudCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNFdmVudERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0VWRU5UX0RSSVZFTl9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0V2ZW50RHJpdmVuKCkgPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc0V2ZW50RHJpdmVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V2ZW50RHJpdmVuID0gSVNfRVZFTlRfRFJJVkVOX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBFdmVudCBEcml2ZW4gYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRXZlbnREcml2ZW5FU2V0OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNPbmdvaW5nKCkgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNPbmdvaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfT05HT0lOR19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc09uZ29pbmcoKSA8ZW0+SXMgT25nb2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc09uZ29pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzT25nb2luZyA9IElTX09OR09JTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIE9uZ29pbmcgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzT25nb2luZ0VTZXQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1JlcGVhdGFibGUoKSA8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1JlcGVhdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19SRVBFQVRBQkxFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzUmVwZWF0YWJsZSgpIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzUmVwZWF0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXBlYXRhYmxlID0gSVNfUkVQRUFUQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgUmVwZWF0YWJsZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXBlYXRhYmxlRVNldDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrQnJlYWtkb3duRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFdvcmtPcmRlcj4gZ2V0UHJlZGVjZXNzb3IoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFREVDRVNTT1IpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNFdmVudERyaXZlbigpIHsKLQkJcmV0dXJuIGlzRXZlbnREcml2ZW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNFdmVudERyaXZlbihib29sZWFuIG5ld0lzRXZlbnREcml2ZW4pIHsKLQkJYm9vbGVhbiBvbGRJc0V2ZW50RHJpdmVuID0gaXNFdmVudERyaXZlbjsKLQkJaXNFdmVudERyaXZlbiA9IG5ld0lzRXZlbnREcml2ZW47Ci0JCWJvb2xlYW4gb2xkSXNFdmVudERyaXZlbkVTZXQgPSBpc0V2ZW50RHJpdmVuRVNldDsKLQkJaXNFdmVudERyaXZlbkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTiwgb2xkSXNFdmVudERyaXZlbiwgaXNFdmVudERyaXZlbiwgIW9sZElzRXZlbnREcml2ZW5FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc0V2ZW50RHJpdmVuKCkgewotCQlib29sZWFuIG9sZElzRXZlbnREcml2ZW4gPSBpc0V2ZW50RHJpdmVuOwotCQlib29sZWFuIG9sZElzRXZlbnREcml2ZW5FU2V0ID0gaXNFdmVudERyaXZlbkVTZXQ7Ci0JCWlzRXZlbnREcml2ZW4gPSBJU19FVkVOVF9EUklWRU5fRURFRkFVTFQ7Ci0JCWlzRXZlbnREcml2ZW5FU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4sIG9sZElzRXZlbnREcml2ZW4sIElTX0VWRU5UX0RSSVZFTl9FREVGQVVMVCwgb2xkSXNFdmVudERyaXZlbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzRXZlbnREcml2ZW4oKSB7Ci0JCXJldHVybiBpc0V2ZW50RHJpdmVuRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzT25nb2luZygpIHsKLQkJcmV0dXJuIGlzT25nb2luZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc09uZ29pbmcoYm9vbGVhbiBuZXdJc09uZ29pbmcpIHsKLQkJYm9vbGVhbiBvbGRJc09uZ29pbmcgPSBpc09uZ29pbmc7Ci0JCWlzT25nb2luZyA9IG5ld0lzT25nb2luZzsKLQkJYm9vbGVhbiBvbGRJc09uZ29pbmdFU2V0ID0gaXNPbmdvaW5nRVNldDsKLQkJaXNPbmdvaW5nRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORywgb2xkSXNPbmdvaW5nLCBpc09uZ29pbmcsICFvbGRJc09uZ29pbmdFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc09uZ29pbmcoKSB7Ci0JCWJvb2xlYW4gb2xkSXNPbmdvaW5nID0gaXNPbmdvaW5nOwotCQlib29sZWFuIG9sZElzT25nb2luZ0VTZXQgPSBpc09uZ29pbmdFU2V0OwotCQlpc09uZ29pbmcgPSBJU19PTkdPSU5HX0VERUZBVUxUOwotCQlpc09uZ29pbmdFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HLCBvbGRJc09uZ29pbmcsIElTX09OR09JTkdfRURFRkFVTFQsIG9sZElzT25nb2luZ0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzT25nb2luZygpIHsKLQkJcmV0dXJuIGlzT25nb2luZ0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc1JlcGVhdGFibGUoKSB7Ci0JCXJldHVybiBpc1JlcGVhdGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNSZXBlYXRhYmxlKGJvb2xlYW4gbmV3SXNSZXBlYXRhYmxlKSB7Ci0JCWJvb2xlYW4gb2xkSXNSZXBlYXRhYmxlID0gaXNSZXBlYXRhYmxlOwotCQlpc1JlcGVhdGFibGUgPSBuZXdJc1JlcGVhdGFibGU7Ci0JCWJvb2xlYW4gb2xkSXNSZXBlYXRhYmxlRVNldCA9IGlzUmVwZWF0YWJsZUVTZXQ7Ci0JCWlzUmVwZWF0YWJsZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEUsIG9sZElzUmVwZWF0YWJsZSwgaXNSZXBlYXRhYmxlLCAhb2xkSXNSZXBlYXRhYmxlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNSZXBlYXRhYmxlKCkgewotCQlib29sZWFuIG9sZElzUmVwZWF0YWJsZSA9IGlzUmVwZWF0YWJsZTsKLQkJYm9vbGVhbiBvbGRJc1JlcGVhdGFibGVFU2V0ID0gaXNSZXBlYXRhYmxlRVNldDsKLQkJaXNSZXBlYXRhYmxlID0gSVNfUkVQRUFUQUJMRV9FREVGQVVMVDsKLQkJaXNSZXBlYXRhYmxlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRSwgb2xkSXNSZXBlYXRhYmxlLCBJU19SRVBFQVRBQkxFX0VERUZBVUxULCBvbGRJc1JlcGVhdGFibGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc1JlcGVhdGFibGUoKSB7Ci0JCXJldHVybiBpc1JlcGVhdGFibGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJlZGVjZXNzb3IoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUjoKLQkJCQlyZXR1cm4gZ2V0UHJlZGVjZXNzb3IoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQkJcmV0dXJuIGlzSXNFdmVudERyaXZlbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQkJCXJldHVybiBpc0lzT25nb2luZygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQkJCXJldHVybiBpc0lzUmVwZWF0YWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUjoKLQkJCQlnZXRQcmVkZWNlc3NvcigpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJlZGVjZXNzb3IoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtPcmRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQkJc2V0SXNFdmVudERyaXZlbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzoKLQkJCQlzZXRJc09uZ29pbmcoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU6Ci0JCQkJc2V0SXNSZXBlYXRhYmxlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SOgotCQkJCWdldFByZWRlY2Vzc29yKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOgotCQkJCXVuc2V0SXNFdmVudERyaXZlbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQkJCXVuc2V0SXNPbmdvaW5nKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU6Ci0JCQkJdW5zZXRJc1JlcGVhdGFibGUoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SOgotCQkJCXJldHVybiAhZ2V0UHJlZGVjZXNzb3IoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOgotCQkJCXJldHVybiBpc1NldElzRXZlbnREcml2ZW4oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQkJCXJldHVybiBpc1NldElzT25nb2luZygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU6Ci0JCQkJcmV0dXJuIGlzU2V0SXNSZXBlYXRhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNFdmVudERyaXZlbjogIik7Ci0JCWlmIChpc0V2ZW50RHJpdmVuRVNldCkgcmVzdWx0LmFwcGVuZChpc0V2ZW50RHJpdmVuKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNPbmdvaW5nOiAiKTsKLQkJaWYgKGlzT25nb2luZ0VTZXQpIHJlc3VsdC5hcHBlbmQoaXNPbmdvaW5nKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNSZXBlYXRhYmxlOiAiKTsKLQkJaWYgKGlzUmVwZWF0YWJsZUVTZXQpIHJlc3VsdC5hcHBlbmQoaXNSZXBlYXRhYmxlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dvcmtCcmVha2Rvd25FbGVtZW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtEZWZpbml0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya0RlZmluaXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmOGMxZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya0RlZmluaXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrRGVmaW5pdGlvbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgRGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrRGVmaW5pdGlvbkltcGwjZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrRGVmaW5pdGlvbkltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFdvcmtEZWZpbml0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY29uZGl0aW9uKCkgPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVDT05ESVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY29uZGl0aW9uKCkgPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWNvbmRpdGlvbiA9IFBSRUNPTkRJVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Y29uZGl0aW9uKCkgPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU1RDT05ESVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdGNvbmRpdGlvbigpIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBvc3Rjb25kaXRpb24gPSBQT1NUQ09ORElUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtEZWZpbml0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlY29uZGl0aW9uKCkgewotCQlyZXR1cm4gcHJlY29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWNvbmRpdGlvbihTdHJpbmcgbmV3UHJlY29uZGl0aW9uKSB7Ci0JCVN0cmluZyBvbGRQcmVjb25kaXRpb24gPSBwcmVjb25kaXRpb247Ci0JCXByZWNvbmRpdGlvbiA9IG5ld1ByZWNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiwgb2xkUHJlY29uZGl0aW9uLCBwcmVjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvc3Rjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3Rjb25kaXRpb24oU3RyaW5nIG5ld1Bvc3Rjb25kaXRpb24pIHsKLQkJU3RyaW5nIG9sZFBvc3Rjb25kaXRpb24gPSBwb3N0Y29uZGl0aW9uOwotCQlwb3N0Y29uZGl0aW9uID0gbmV3UG9zdGNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04sIG9sZFBvc3Rjb25kaXRpb24sIHBvc3Rjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIGdldFByZWNvbmRpdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCQlyZXR1cm4gZ2V0UG9zdGNvbmRpdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT046Ci0JCQkJc2V0UHJlY29uZGl0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQkJc2V0UG9zdGNvbmRpdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJCXNldFByZWNvbmRpdGlvbihQUkVDT05ESVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQkJc2V0UG9zdGNvbmRpdGlvbihQT1NUQ09ORElUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjoKLQkJCQlyZXR1cm4gUFJFQ09ORElUSU9OX0VERUZBVUxUID09IG51bGwgPyBwcmVjb25kaXRpb24gIT0gbnVsbCA6ICFQUkVDT05ESVRJT05fRURFRkFVTFQuZXF1YWxzKHByZWNvbmRpdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBQT1NUQ09ORElUSU9OX0VERUZBVUxUID09IG51bGwgPyBwb3N0Y29uZGl0aW9uICE9IG51bGwgOiAhUE9TVENPTkRJVElPTl9FREVGQVVMVC5lcXVhbHMocG9zdGNvbmRpdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwcmVjb25kaXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZWNvbmRpdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcG9zdGNvbmRpdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocG9zdGNvbmRpdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dvcmtEZWZpbml0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtPcmRlckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtPcmRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQwZTY2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrT3JkZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrT3JkZXJJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uaW1wbC5FRGF0YU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBPcmRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsI2dldExpbmtUeXBlIDxlbT5MaW5rIFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrT3JkZXJJbXBsIGV4dGVuZHMgRURhdGFPYmplY3RJbXBsIGltcGxlbWVudHMgV29ya09yZGVyIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtUeXBlKCkgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgV29ya09yZGVyVHlwZSBMSU5LX1RZUEVfRURFRkFVTFQgPSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtUeXBlKCkgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrT3JkZXJUeXBlIGxpbmtUeXBlID0gTElOS19UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBMaW5rIFR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGxpbmtUeXBlRVNldDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrT3JkZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX09SREVSOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrT3JkZXJUeXBlIGdldExpbmtUeXBlKCkgewotCQlyZXR1cm4gbGlua1R5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZSBuZXdMaW5rVHlwZSkgewotCQlXb3JrT3JkZXJUeXBlIG9sZExpbmtUeXBlID0gbGlua1R5cGU7Ci0JCWxpbmtUeXBlID0gbmV3TGlua1R5cGUgPT0gbnVsbCA/IExJTktfVFlQRV9FREVGQVVMVCA6IG5ld0xpbmtUeXBlOwotCQlib29sZWFuIG9sZExpbmtUeXBlRVNldCA9IGxpbmtUeXBlRVNldDsKLQkJbGlua1R5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX09SREVSX19MSU5LX1RZUEUsIG9sZExpbmtUeXBlLCBsaW5rVHlwZSwgIW9sZExpbmtUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TGlua1R5cGUoKSB7Ci0JCVdvcmtPcmRlclR5cGUgb2xkTGlua1R5cGUgPSBsaW5rVHlwZTsKLQkJYm9vbGVhbiBvbGRMaW5rVHlwZUVTZXQgPSBsaW5rVHlwZUVTZXQ7Ci0JCWxpbmtUeXBlID0gTElOS19UWVBFX0VERUZBVUxUOwotCQlsaW5rVHlwZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRSwgb2xkTGlua1R5cGUsIExJTktfVFlQRV9FREVGQVVMVCwgb2xkTGlua1R5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRMaW5rVHlwZSgpIHsKLQkJcmV0dXJuIGxpbmtUeXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFOgotCQkJCXJldHVybiBnZXRMaW5rVHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19MSU5LX1RZUEU6Ci0JCQkJc2V0TGlua1R5cGUoKFdvcmtPcmRlclR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRToKLQkJCQl1bnNldExpbmtUeXBlKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFOgotCQkJCXJldHVybiBpc1NldExpbmtUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGlua1R5cGU6ICIpOwotCQlpZiAobGlua1R5cGVFU2V0KSByZXN1bHQuYXBwZW5kKGxpbmtUeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dvcmtPcmRlckltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EzNGQyMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsI2dldEltcGFjdE9mTm90SGF2aW5nIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nIDxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBhY3RPZk5vdEhhdmluZygpIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltcGFjdE9mTm90SGF2aW5nKCkgPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbXBhY3RPZk5vdEhhdmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpbXBhY3RPZk5vdEhhdmluZyA9IElNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1cnBvc2UoKSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVSUE9TRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVycG9zZSA9IFBVUlBPU0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKSA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFTT05TX0ZPUl9OT1RfTkVFRElOR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWFzb25zRm9yTm90TmVlZGluZygpIDxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVhc29uc0Zvck5vdE5lZWRpbmcgPSBSRUFTT05TX0ZPUl9OT1RfTkVFRElOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKSB7Ci0JCXJldHVybiBpbXBhY3RPZk5vdEhhdmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbXBhY3RPZk5vdEhhdmluZyhTdHJpbmcgbmV3SW1wYWN0T2ZOb3RIYXZpbmcpIHsKLQkJU3RyaW5nIG9sZEltcGFjdE9mTm90SGF2aW5nID0gaW1wYWN0T2ZOb3RIYXZpbmc7Ci0JCWltcGFjdE9mTm90SGF2aW5nID0gbmV3SW1wYWN0T2ZOb3RIYXZpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORywgb2xkSW1wYWN0T2ZOb3RIYXZpbmcsIGltcGFjdE9mTm90SGF2aW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdXJwb3NlKCkgewotCQlyZXR1cm4gcHVycG9zZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdXJwb3NlKFN0cmluZyBuZXdQdXJwb3NlKSB7Ci0JCVN0cmluZyBvbGRQdXJwb3NlID0gcHVycG9zZTsKLQkJcHVycG9zZSA9IG5ld1B1cnBvc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFLCBvbGRQdXJwb3NlLCBwdXJwb3NlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZWFzb25zRm9yTm90TmVlZGluZygpIHsKLQkJcmV0dXJuIHJlYXNvbnNGb3JOb3ROZWVkaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYXNvbnNGb3JOb3ROZWVkaW5nKFN0cmluZyBuZXdSZWFzb25zRm9yTm90TmVlZGluZykgewotCQlTdHJpbmcgb2xkUmVhc29uc0Zvck5vdE5lZWRpbmcgPSByZWFzb25zRm9yTm90TmVlZGluZzsKLQkJcmVhc29uc0Zvck5vdE5lZWRpbmcgPSBuZXdSZWFzb25zRm9yTm90TmVlZGluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HLCBvbGRSZWFzb25zRm9yTm90TmVlZGluZywgcmVhc29uc0Zvck5vdE5lZWRpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzoKLQkJCQlyZXR1cm4gZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQkJcmV0dXJuIGdldFB1cnBvc2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOgotCQkJCXJldHVybiBnZXRSZWFzb25zRm9yTm90TmVlZGluZygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzoKLQkJCQlzZXRJbXBhY3RPZk5vdEhhdmluZygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXNldFB1cnBvc2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc6Ci0JCQkJc2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOgotCQkJCXNldEltcGFjdE9mTm90SGF2aW5nKElNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXNldFB1cnBvc2UoUFVSUE9TRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc6Ci0JCQkJc2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoUkVBU09OU19GT1JfTk9UX05FRURJTkdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkc6Ci0JCQkJcmV0dXJuIElNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxUID09IG51bGwgPyBpbXBhY3RPZk5vdEhhdmluZyAhPSBudWxsIDogIUlNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxULmVxdWFscyhpbXBhY3RPZk5vdEhhdmluZyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXJldHVybiBQVVJQT1NFX0VERUZBVUxUID09IG51bGwgPyBwdXJwb3NlICE9IG51bGwgOiAhUFVSUE9TRV9FREVGQVVMVC5lcXVhbHMocHVycG9zZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORzoKLQkJCQlyZXR1cm4gUkVBU09OU19GT1JfTk9UX05FRURJTkdfRURFRkFVTFQgPT0gbnVsbCA/IHJlYXNvbnNGb3JOb3ROZWVkaW5nICE9IG51bGwgOiAhUkVBU09OU19GT1JfTk9UX05FRURJTkdfRURFRkFVTFQuZXF1YWxzKHJlYXNvbnNGb3JOb3ROZWVkaW5nKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGltcGFjdE9mTm90SGF2aW5nOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbXBhY3RPZk5vdEhhdmluZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHVycG9zZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHVycG9zZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVhc29uc0Zvck5vdE5lZWRpbmc6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlYXNvbnNGb3JOb3ROZWVkaW5nKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNDE0YTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0UmVzcG9uc2libGVSb2xlIDxlbT5SZXNwb25zaWJsZSBSb2xlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXRFeHRlcm5hbElucHV0VG8gPGVtPkV4dGVybmFsIElucHV0IFRvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0SW1wYWN0ZWRCeSA8ZW0+SW1wYWN0ZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXRJbXBhY3RzIDxlbT5JbXBhY3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0TWFuZGF0b3J5SW5wdXRUbyA8ZW0+TWFuZGF0b3J5IElucHV0IFRvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0T3B0aW9uYWxJbnB1dFRvIDxlbT5PcHRpb25hbCBJbnB1dCBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldE91dHB1dEZyb20gPGVtPk91dHB1dCBGcm9tPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0RGVsaXZlcmFibGVQYXJ0cyA8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXRBY3Rpdml0eUVudHJ5U3RhdGUgPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0QWN0aXZpdHlFeGl0U3RhdGUgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsIGV4dGVuZHMgRGVzY3JpcHRvckltcGwgaW1wbGVtZW50cyBXb3JrUHJvZHVjdERlc2NyaXB0b3IgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrUHJvZHVjdCgpIDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX1BST0RVQ1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1Byb2R1Y3QoKSA8ZW0+V29yayBQcm9kdWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB3b3JrUHJvZHVjdCA9IFdPUktfUFJPRFVDVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNwb25zaWJsZVJvbGUoKSA8ZW0+UmVzcG9uc2libGUgUm9sZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzcG9uc2libGVSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TSUJMRV9ST0xFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3BvbnNpYmxlUm9sZSgpIDxlbT5SZXNwb25zaWJsZSBSb2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNwb25zaWJsZVJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVzcG9uc2libGVSb2xlID0gUkVTUE9OU0lCTEVfUk9MRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkgPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RW50cnlTdGF0ZSgpIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFjdGl2aXR5RW50cnlTdGF0ZSA9IEFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUWV9FWElUX1NUQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFjdGl2aXR5RXhpdFN0YXRlID0gQUNUSVZJVFlfRVhJVF9TVEFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29ya1Byb2R1Y3QoU3RyaW5nIG5ld1dvcmtQcm9kdWN0KSB7Ci0JCVN0cmluZyBvbGRXb3JrUHJvZHVjdCA9IHdvcmtQcm9kdWN0OwotCQl3b3JrUHJvZHVjdCA9IG5ld1dvcmtQcm9kdWN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QsIG9sZFdvcmtQcm9kdWN0LCB3b3JrUHJvZHVjdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzcG9uc2libGVSb2xlKCkgewotCQlyZXR1cm4gcmVzcG9uc2libGVSb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc3BvbnNpYmxlUm9sZShTdHJpbmcgbmV3UmVzcG9uc2libGVSb2xlKSB7Ci0JCVN0cmluZyBvbGRSZXNwb25zaWJsZVJvbGUgPSByZXNwb25zaWJsZVJvbGU7Ci0JCXJlc3BvbnNpYmxlUm9sZSA9IG5ld1Jlc3BvbnNpYmxlUm9sZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfUk9MRSwgb2xkUmVzcG9uc2libGVSb2xlLCByZXNwb25zaWJsZVJvbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0RXh0ZXJuYWxJbnB1dFRvKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVF9UTyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0SW1wYWN0ZWRCeSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEltcGFjdHMoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldE1hbmRhdG9yeUlucHV0VG8oKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVF9UTyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0T3B0aW9uYWxJbnB1dFRvKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVF9UTyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0T3V0cHV0RnJvbSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1VUUFVUX0ZST00pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldERlbGl2ZXJhYmxlUGFydHMoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFjdGl2aXR5RW50cnlTdGF0ZSgpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RW50cnlTdGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eUVudHJ5U3RhdGUoU3RyaW5nIG5ld0FjdGl2aXR5RW50cnlTdGF0ZSkgewotCQlTdHJpbmcgb2xkQWN0aXZpdHlFbnRyeVN0YXRlID0gYWN0aXZpdHlFbnRyeVN0YXRlOwotCQlhY3Rpdml0eUVudHJ5U3RhdGUgPSBuZXdBY3Rpdml0eUVudHJ5U3RhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFLCBvbGRBY3Rpdml0eUVudHJ5U3RhdGUsIGFjdGl2aXR5RW50cnlTdGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKSB7Ci0JCXJldHVybiBhY3Rpdml0eUV4aXRTdGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eUV4aXRTdGF0ZShTdHJpbmcgbmV3QWN0aXZpdHlFeGl0U3RhdGUpIHsKLQkJU3RyaW5nIG9sZEFjdGl2aXR5RXhpdFN0YXRlID0gYWN0aXZpdHlFeGl0U3RhdGU7Ci0JCWFjdGl2aXR5RXhpdFN0YXRlID0gbmV3QWN0aXZpdHlFeGl0U3RhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEUsIG9sZEFjdGl2aXR5RXhpdFN0YXRlLCBhY3Rpdml0eUV4aXRTdGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1Q6Ci0JCQkJcmV0dXJuIGdldFdvcmtQcm9kdWN0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX1JPTEU6Ci0JCQkJcmV0dXJuIGdldFJlc3BvbnNpYmxlUm9sZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVF9UTzoKLQkJCQlyZXR1cm4gZ2V0RXh0ZXJuYWxJbnB1dFRvKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZOgotCQkJCXJldHVybiBnZXRJbXBhY3RlZEJ5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFM6Ci0JCQkJcmV0dXJuIGdldEltcGFjdHMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUX1RPOgotCQkJCXJldHVybiBnZXRNYW5kYXRvcnlJbnB1dFRvKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUX1RPOgotCQkJCXJldHVybiBnZXRPcHRpb25hbElucHV0VG8oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1VUUFVUX0ZST006Ci0JCQkJcmV0dXJuIGdldE91dHB1dEZyb20oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFM6Ci0JCQkJcmV0dXJuIGdldERlbGl2ZXJhYmxlUGFydHMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEU6Ci0JCQkJcmV0dXJuIGdldEFjdGl2aXR5RW50cnlTdGF0ZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJCXJldHVybiBnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1Q6Ci0JCQkJc2V0V29ya1Byb2R1Y3QoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9ST0xFOgotCQkJCXNldFJlc3BvbnNpYmxlUm9sZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVF9UTzoKLQkJCQlnZXRFeHRlcm5hbElucHV0VG8oKS5jbGVhcigpOwotCQkJCWdldEV4dGVybmFsSW5wdXRUbygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWToKLQkJCQlnZXRJbXBhY3RlZEJ5KCkuY2xlYXIoKTsKLQkJCQlnZXRJbXBhY3RlZEJ5KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFM6Ci0JCQkJZ2V0SW1wYWN0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW1wYWN0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVRfVE86Ci0JCQkJZ2V0TWFuZGF0b3J5SW5wdXRUbygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWFuZGF0b3J5SW5wdXRUbygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVF9UTzoKLQkJCQlnZXRPcHRpb25hbElucHV0VG8oKS5jbGVhcigpOwotCQkJCWdldE9wdGlvbmFsSW5wdXRUbygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PVVRQVVRfRlJPTToKLQkJCQlnZXRPdXRwdXRGcm9tKCkuY2xlYXIoKTsKLQkJCQlnZXRPdXRwdXRGcm9tKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTOgotCQkJCWdldERlbGl2ZXJhYmxlUGFydHMoKS5jbGVhcigpOwotCQkJCWdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEU6Ci0JCQkJc2V0QWN0aXZpdHlFbnRyeVN0YXRlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURToKLQkJCQlzZXRBY3Rpdml0eUV4aXRTdGF0ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1Q6Ci0JCQkJc2V0V29ya1Byb2R1Y3QoV09SS19QUk9EVUNUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX1JPTEU6Ci0JCQkJc2V0UmVzcG9uc2libGVSb2xlKFJFU1BPTlNJQkxFX1JPTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVF9UTzoKLQkJCQlnZXRFeHRlcm5hbElucHV0VG8oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQkJZ2V0SW1wYWN0ZWRCeSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJCWdldEltcGFjdHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUX1RPOgotCQkJCWdldE1hbmRhdG9yeUlucHV0VG8oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVRfVE86Ci0JCQkJZ2V0T3B0aW9uYWxJbnB1dFRvKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09VVFBVVF9GUk9NOgotCQkJCWdldE91dHB1dEZyb20oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFM6Ci0JCQkJZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJCQlzZXRBY3Rpdml0eUVudHJ5U3RhdGUoQUNUSVZJVFlfRU5UUllfU1RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURToKLQkJCQlzZXRBY3Rpdml0eUV4aXRTdGF0ZShBQ1RJVklUWV9FWElUX1NUQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUOgotCQkJCXJldHVybiBXT1JLX1BST0RVQ1RfRURFRkFVTFQgPT0gbnVsbCA/IHdvcmtQcm9kdWN0ICE9IG51bGwgOiAhV09SS19QUk9EVUNUX0VERUZBVUxULmVxdWFscyh3b3JrUHJvZHVjdCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX1JPTEU6Ci0JCQkJcmV0dXJuIFJFU1BPTlNJQkxFX1JPTEVfRURFRkFVTFQgPT0gbnVsbCA/IHJlc3BvbnNpYmxlUm9sZSAhPSBudWxsIDogIVJFU1BPTlNJQkxFX1JPTEVfRURFRkFVTFQuZXF1YWxzKHJlc3BvbnNpYmxlUm9sZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUX1RPOgotCQkJCXJldHVybiAhZ2V0RXh0ZXJuYWxJbnB1dFRvKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWToKLQkJCQlyZXR1cm4gIWdldEltcGFjdGVkQnkoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFM6Ci0JCQkJcmV0dXJuICFnZXRJbXBhY3RzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVRfVE86Ci0JCQkJcmV0dXJuICFnZXRNYW5kYXRvcnlJbnB1dFRvKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVF9UTzoKLQkJCQlyZXR1cm4gIWdldE9wdGlvbmFsSW5wdXRUbygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1VUUFVUX0ZST006Ci0JCQkJcmV0dXJuICFnZXRPdXRwdXRGcm9tKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUzoKLQkJCQlyZXR1cm4gIWdldERlbGl2ZXJhYmxlUGFydHMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQkJCXJldHVybiBBQ1RJVklUWV9FTlRSWV9TVEFURV9FREVGQVVMVCA9PSBudWxsID8gYWN0aXZpdHlFbnRyeVN0YXRlICE9IG51bGwgOiAhQUNUSVZJVFlfRU5UUllfU1RBVEVfRURFRkFVTFQuZXF1YWxzKGFjdGl2aXR5RW50cnlTdGF0ZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEU6Ci0JCQkJcmV0dXJuIEFDVElWSVRZX0VYSVRfU1RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGFjdGl2aXR5RXhpdFN0YXRlICE9IG51bGwgOiAhQUNUSVZJVFlfRVhJVF9TVEFURV9FREVGQVVMVC5lcXVhbHMoYWN0aXZpdHlFeGl0U3RhdGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAod29ya1Byb2R1Y3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdvcmtQcm9kdWN0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXNwb25zaWJsZVJvbGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlc3BvbnNpYmxlUm9sZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdGl2aXR5RW50cnlTdGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0aXZpdHlFbnRyeVN0YXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3Rpdml0eUV4aXRTdGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0aXZpdHlFeGl0U3RhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3RJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrUHJvZHVjdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFiODYxYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrUHJvZHVjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtQcm9kdWN0SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0RXN0aW1hdGUgPGVtPkVzdGltYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsI2dldFJlcG9ydCA8ZW0+UmVwb3J0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRUZW1wbGF0ZSA8ZW0+VGVtcGxhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsI2dldFRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RJbXBsIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJbXBsIGltcGxlbWVudHMgV29ya1Byb2R1Y3QgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRFc3RpbWF0ZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfX0VTVElNQVRFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRSZXBvcnQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX19SRVBPUlQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFRlbXBsYXRlKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9fVEVNUExBVEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFRvb2xNZW50b3IoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX19UT09MX01FTlRPUik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRFOgotCQkJCXJldHVybiBnZXRFc3RpbWF0ZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlQ6Ci0JCQkJcmV0dXJuIGdldFJlcG9ydCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVEVNUExBVEU6Ci0JCQkJcmV0dXJuIGdldFRlbXBsYXRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19UT09MX01FTlRPUjoKLQkJCQlyZXR1cm4gZ2V0VG9vbE1lbnRvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFURToKLQkJCQlnZXRFc3RpbWF0ZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RXN0aW1hdGUoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1JFUE9SVDoKLQkJCQlnZXRSZXBvcnQoKS5jbGVhcigpOwotCQkJCWdldFJlcG9ydCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVEVNUExBVEU6Ci0JCQkJZ2V0VGVtcGxhdGUoKS5jbGVhcigpOwotCQkJCWdldFRlbXBsYXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19UT09MX01FTlRPUjoKLQkJCQlnZXRUb29sTWVudG9yKCkuY2xlYXIoKTsKLQkJCQlnZXRUb29sTWVudG9yKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVEU6Ci0JCQkJZ2V0RXN0aW1hdGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlQ6Ci0JCQkJZ2V0UmVwb3J0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19URU1QTEFURToKLQkJCQlnZXRUZW1wbGF0ZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1I6Ci0JCQkJZ2V0VG9vbE1lbnRvcigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVEU6Ci0JCQkJcmV0dXJuICFnZXRFc3RpbWF0ZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJcmV0dXJuICFnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlQ6Ci0JCQkJcmV0dXJuICFnZXRSZXBvcnQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19URU1QTEFURToKLQkJCQlyZXR1cm4gIWdldFRlbXBsYXRlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1I6Ci0JCQkJcmV0dXJuICFnZXRUb29sTWVudG9yKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrUHJvZHVjdEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrUHJvZHVjdFR5cGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrUHJvZHVjdFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMWFlMjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3RUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya1Byb2R1Y3RUeXBlSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RUeXBlSW1wbCNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RUeXBlSW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cyBXb3JrUHJvZHVjdFR5cGUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3RUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFdvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1QpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1Q6Ci0JCQkJcmV0dXJuIGdldFdvcmtQcm9kdWN0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1Q6Ci0JCQkJZ2V0V29ya1Byb2R1Y3QoKS5jbGVhcigpOwotCQkJCWdldFdvcmtQcm9kdWN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVDoKLQkJCQlnZXRXb3JrUHJvZHVjdCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVDoKLQkJCQlyZXR1cm4gIWdldFdvcmtQcm9kdWN0KCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrUHJvZHVjdFR5cGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWUyOGRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgWE1MIFVNQSBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDZhMTkyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgdGhlIFVNQSBYTUwgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI5Y2U2OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1NSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVtYUFkYXB0ZXJGYWN0b3J5LmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBVbWFQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVW1hU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0KLQkJbmV3IFVtYVN3aXRjaDxBZGFwdGVyPigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUFjdGl2aXR5KEFjdGl2aXR5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24oQWN0aXZpdHlEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0FkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUFydGlmYWN0KEFydGlmYWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBcnRpZmFjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUFydGlmYWN0RGVzY3JpcHRpb24oQXJ0aWZhY3REZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUJyZWFrZG93bkVsZW1lbnQoQnJlYWtkb3duRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQnJlYWtkb3duRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbihCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUNhcGFiaWxpdHlQYXR0ZXJuKENhcGFiaWxpdHlQYXR0ZXJuIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUNoZWNrbGlzdChDaGVja2xpc3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNoZWNrbGlzdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUNvbXBvc2l0ZVJvbGUoQ29tcG9zaXRlUm9sZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29tcG9zaXRlUm9sZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUNvbmNlcHQoQ29uY2VwdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29uY2VwdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUNvbnN0cmFpbnQoQ29uc3RyYWludCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29uc3RyYWludEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUNvbnRlbnRDYXRlZ29yeShDb250ZW50Q2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnRDYXRlZ29yeUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUNvbnRlbnRDYXRlZ29yeVBhY2thZ2UoQ29udGVudENhdGVnb3J5UGFja2FnZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29udGVudENhdGVnb3J5UGFja2FnZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUNvbnRlbnREZXNjcmlwdGlvbihDb250ZW50RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUNvbnRlbnRFbGVtZW50KENvbnRlbnRFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb250ZW50RWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUNvbnRlbnRQYWNrYWdlKENvbnRlbnRQYWNrYWdlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb250ZW50UGFja2FnZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDdXN0b21DYXRlZ29yeUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURlbGl2ZXJhYmxlKERlbGl2ZXJhYmxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZWxpdmVyYWJsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURlbGl2ZXJ5UHJvY2VzcyhEZWxpdmVyeVByb2Nlc3Mgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURlc2NyaWJhYmxlRWxlbWVudChEZXNjcmliYWJsZUVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc2NyaWJhYmxlRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURlc2NyaXB0b3IoRGVzY3JpcHRvciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURlc2NyaXB0b3JEZXNjcmlwdGlvbihEZXNjcmlwdG9yRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURpc2NpcGxpbmUoRGlzY2lwbGluZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURpc2NpcGxpbmVHcm91cGluZyhEaXNjaXBsaW5lR3JvdXBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURvY3VtZW50Um9vdChEb2N1bWVudFJvb3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURvY3VtZW50Um9vdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURvbWFpbihEb21haW4gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURvbWFpbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUVsZW1lbnQoRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUVzdGltYXRlKEVzdGltYXRlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFc3RpbWF0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUVzdGltYXRpbmdNZXRyaWMoRXN0aW1hdGluZ01ldHJpYyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXN0aW1hdGluZ01ldHJpY0FkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucyhFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9uc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUV4YW1wbGUoRXhhbXBsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXhhbXBsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUd1aWRhbmNlKEd1aWRhbmNlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUd1aWRhbmNlRGVzY3JpcHRpb24oR3VpZGFuY2VEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUd1aWRlbGluZShHdWlkZWxpbmUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUd1aWRlbGluZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUl0ZXJhdGlvbihJdGVyYXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUtpbmQoS2luZCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlS2luZEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eShNZXRob2RFbGVtZW50UHJvcGVydHkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWV0aG9kTGlicmFyeUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZFBhY2thZ2UoTWV0aG9kUGFja2FnZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWV0aG9kUGFja2FnZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZFBsdWdpbihNZXRob2RQbHVnaW4gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZFBsdWdpbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZFVuaXQoTWV0aG9kVW5pdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWV0aG9kVW5pdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1pbGVzdG9uZShNaWxlc3RvbmUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU5hbWVkRWxlbWVudChOYW1lZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU5hbWVkRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU91dGNvbWUoT3V0Y29tZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlT3V0Y29tZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVBhY2thZ2VhYmxlRWxlbWVudChQYWNrYWdlYWJsZUVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVBhY2thZ2VhYmxlRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVBoYXNlKFBoYXNlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQaGFzZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVBsYW5uaW5nRGF0YShQbGFubmluZ0RhdGEgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVBsYW5uaW5nRGF0YUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVByYWN0aWNlKFByYWN0aWNlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQcmFjdGljZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVByYWN0aWNlRGVzY3JpcHRpb24oUHJhY3RpY2VEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NDb21wb25lbnQoUHJvY2Vzc0NvbXBvbmVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NEZXNjcmlwdGlvbihQcm9jZXNzRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NFbGVtZW50KFByb2Nlc3NFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQcm9jZXNzRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NQYWNrYWdlKFByb2Nlc3NQYWNrYWdlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVJlcG9ydChSZXBvcnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlcG9ydEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVJldXNhYmxlQXNzZXQoUmV1c2FibGVBc3NldCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmV1c2FibGVBc3NldEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvYWRtYXAoUm9hZG1hcCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUm9hZG1hcEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvbGUoUm9sZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUm9sZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvbGVEZXNjcmlwdGlvbihSb2xlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGVEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvbGVEZXNjcmlwdG9yKFJvbGVEZXNjcmlwdG9yIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvbGVTZXQoUm9sZVNldCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUm9sZVNldEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvbGVTZXRHcm91cGluZyhSb2xlU2V0R3JvdXBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGVTZXRHcm91cGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVNlY3Rpb24oU2VjdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VjdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVN1cHBvcnRpbmdNYXRlcmlhbChTdXBwb3J0aW5nTWF0ZXJpYWwgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVRhc2soVGFzayBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGFza0FkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVRhc2tEZXNjcmlwdGlvbihUYXNrRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVRhc2tEZXNjcmlwdG9yKFRhc2tEZXNjcmlwdG9yIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVRlYW1Qcm9maWxlKFRlYW1Qcm9maWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUZWFtUHJvZmlsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVRlbXBsYXRlKFRlbXBsYXRlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUZW1wbGF0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVRlcm1EZWZpbml0aW9uKFRlcm1EZWZpbml0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUZXJtRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVRvb2woVG9vbCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVG9vbEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVRvb2xNZW50b3IoVG9vbE1lbnRvciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVG9vbE1lbnRvckFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdoaXRlcGFwZXIoV2hpdGVwYXBlciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2hpdGVwYXBlckFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KFdvcmtCcmVha2Rvd25FbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtEZWZpbml0aW9uKFdvcmtEZWZpbml0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtPcmRlcihXb3JrT3JkZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtPcmRlckFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0KFdvcmtQcm9kdWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oV29ya1Byb2R1Y3REZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRvcihXb3JrUHJvZHVjdERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0VHlwZShXb3JrUHJvZHVjdFR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSA8ZW0+QWN0aXZpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24gPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdCA8ZW0+QXJ0aWZhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJ0aWZhY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24gPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNhcGFiaWxpdHlQYXR0ZXJuIDxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2FwYWJpbGl0eVBhdHRlcm4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNoZWNrbGlzdCA8ZW0+Q2hlY2tsaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNoZWNrbGlzdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDaGVja2xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUgPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcG9zaXRlUm9sZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uY2VwdCA8ZW0+Q29uY2VwdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25jZXB0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbmNlcHRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQgPGVtPkNvbnN0cmFpbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25zdHJhaW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnkgPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnRDYXRlZ29yeUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZSA8ZW0+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGVudENhdGVnb3J5UGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uIDxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50IDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGVudEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlIDxlbT5Db250ZW50IFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGVudFBhY2thZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5IDxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ3VzdG9tQ2F0ZWdvcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlIDxlbT5EZWxpdmVyYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyYWJsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiA8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3MgPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCA8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpYmFibGVFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yIDxlbT5EZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmUgPGVtPkRpc2NpcGxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNjaXBsaW5lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcgPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290IDxlbT5Eb2N1bWVudCBSb290PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEb2N1bWVudFJvb3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbiA8ZW0+RG9tYWluPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEb21haW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZSA8ZW0+RXN0aW1hdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXN0aW1hdGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpbmdNZXRyaWMgPGVtPkVzdGltYXRpbmcgTWV0cmljPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpbmdNZXRyaWMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXN0aW1hdGluZ01ldHJpY0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9ucwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXhhbXBsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeGFtcGxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZSA8ZW0+R3VpZGFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24gPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGVsaW5lIDxlbT5HdWlkZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGVsaW5lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUd1aWRlbGluZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuSXRlcmF0aW9uIDxlbT5JdGVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuSXRlcmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuS2luZCA8ZW0+S2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5LaW5kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUtpbmRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCA8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkgPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kTGlicmFyeUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RQYWNrYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4gPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFBsdWdpbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCA8ZW0+TWV0aG9kIFVuaXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RVbml0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NaWxlc3RvbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQgPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5hbWVkRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuT3V0Y29tZSA8ZW0+T3V0Y29tZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5PdXRjb21lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU91dGNvbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBhY2thZ2VhYmxlRWxlbWVudCA8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFja2FnZWFibGVFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QaGFzZSA8ZW0+UGhhc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGhhc2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGhhc2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGxhbm5pbmdEYXRhQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSA8ZW0+UHJhY3RpY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJhY3RpY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24gPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQgPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSA8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uIDxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NFbGVtZW50IDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0VsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlIDxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc1BhY2thZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIDxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXBvcnQgPGVtPlJlcG9ydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXBvcnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVwb3J0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXVzYWJsZUFzc2V0IDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXVzYWJsZUFzc2V0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJldXNhYmxlQXNzZXRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvYWRtYXAgPGVtPlJvYWRtYXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9hZG1hcAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2FkbWFwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlIDxlbT5Sb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uIDxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yIDxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXQgPGVtPlJvbGUgU2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZVNldEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nIDxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0R3JvdXBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZVNldEdyb3VwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uIDxlbT5TZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU3VwcG9ydGluZ01hdGVyaWFsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlN1cHBvcnRpbmdNYXRlcmlhbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWxBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sgPGVtPlRhc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb24gPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IgPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGUgPGVtPlRlYW0gUHJvZmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZWFtUHJvZmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVtcGxhdGUgPGVtPlRlbXBsYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlbXBsYXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlbXBsYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZXJtRGVmaW5pdGlvbiA8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlcm1EZWZpbml0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlcm1EZWZpbml0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sIDxlbT5Ub29sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2wKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVG9vbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbE1lbnRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUb29sTWVudG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldoaXRlcGFwZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2hpdGVwYXBlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQgPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uIDxlbT5Xb3JrIERlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya0RlZmluaXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciA8ZW0+V29yayBPcmRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya09yZGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IgPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZSA8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9VbWFBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTdmZWNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVJlc291cmNlRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVW1hUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZSBGYWN0b3J5PC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEudXRpbC5VbWFSZXNvdXJjZUltcGwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYVJlc291cmNlRmFjdG9yeUltcGwgZXh0ZW5kcyBSZXNvdXJjZUZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFSZXNvdXJjZUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVhNTFJlc291cmNlIHJlc3VsdCA9IG5ldyBVbWFSZXNvdXJjZUltcGwodXJpKTsKLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fU0NIRU1BX0xPQ0FUSU9OLCBCb29sZWFuLlRSVUUpOwotCi0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwgQm9vbGVhbi5UUlVFKTsKLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0VOQ09ERURfQVRUUklCVVRFX1NUWUxFLCBCb29sZWFuLlRSVUUpOwotCi0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9MRVhJQ0FMX0hBTkRMRVIsIEJvb2xlYW4uVFJVRSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19IC8vVW1hUmVzb3VyY2VGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hUmVzb3VyY2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNkMmQ2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVW1hUmVzb3VyY2VJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxTYXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxIZWxwZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlJlc291cmNlIDwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWwuVW1hUmVzb3VyY2VGYWN0b3J5SW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW1hUmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1MUmVzb3VyY2VJbXBsIHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB1cmkgdGhlIFVSSSBvZiB0aGUgbmV3IHJlc291cmNlLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hUmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKLQkJc3VwZXIodXJpKTsKLQl9Ci0KLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvLyBjdXN0b21pemF0aW9uIGhlcmUsIEppbmh1YSBYaSAwNC8yOC8yMDA2Ci0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCi0JLyoKLQkgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzdXBlci5zYXZlKG9wdGlvbnMpOwotCX0KLQotCXByb3RlY3RlZCBYTUxTYXZlIGNyZWF0ZVhNTFNhdmUoKSB7Ci0JCS8vIHJldHVybiBzdXBlci5jcmVhdGVYTUxTYXZlKCk7Ci0JCXJldHVybiBuZXcgVW1hWE1MU2F2ZUltcGwoY3JlYXRlWE1MSGVscGVyKCkpOwotCX0KLQkJCi0JcHJvdGVjdGVkIFhNTEhlbHBlciBjcmVhdGVYTUxIZWxwZXIoKSB7Ci0JCVhNTEhlbHBlckltcGwgaGVscGVyID0gbmV3IFhNTEhlbHBlckltcGwodGhpcykgewotCQkJcHVibGljIHZvaWQgYWRkUHJlZml4KFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKLQkJCQlpZiAocHJlZml4LmVxdWFscygidW1hIikpIHsJCS8vJE5PTi1OTFMtMSQKLQkJCQkJdXJpID0gVW1hUGFja2FnZS5lTlNfVVJJOwotCQkJCX0KLQkJCQlzdXBlci5hZGRQcmVmaXgocHJlZml4LCB1cmkpOwotCQkJfQotCQl9OwotCQlyZXR1cm4gaGVscGVyOwotCX0KLQkKLX0gLy8gVW1hUmVzb3VyY2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFTd2l0Y2guamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDRjNWY2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVtYVN3aXRjaC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFTd2l0Y2g8VD4gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVW1hUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYVN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdDxFQ2xhc3M+IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKGVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZOiB7Ci0JCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VBY3Rpdml0eShhY3Rpdml0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoYWN0aXZpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoYWN0aXZpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGFjdGl2aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoYWN0aXZpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYWN0aXZpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhY3Rpdml0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGFjdGl2aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGFjdGl2aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT046IHsKLQkJCQlBY3Rpdml0eURlc2NyaXB0aW9uIGFjdGl2aXR5RGVzY3JpcHRpb24gPSAoQWN0aXZpdHlEZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24oYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTzogewotCQkJCUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvID0gKEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oYXBwbGljYWJsZU1ldGFDbGFzc0luZm8pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1Q6IHsKLQkJCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUFydGlmYWN0KGFydGlmYWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdChhcnRpZmFjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChhcnRpZmFjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChhcnRpZmFjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGFydGlmYWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTjogewotCQkJCUFydGlmYWN0RGVzY3JpcHRpb24gYXJ0aWZhY3REZXNjcmlwdGlvbiA9IChBcnRpZmFjdERlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQXJ0aWZhY3REZXNjcmlwdGlvbihhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVDogewotCQkJCUJyZWFrZG93bkVsZW1lbnQgYnJlYWtkb3duRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OOiB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiA9IChCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ0FQQUJJTElUWV9QQVRURVJOOiB7Ci0JCQkJQ2FwYWJpbGl0eVBhdHRlcm4gY2FwYWJpbGl0eVBhdHRlcm4gPSAoQ2FwYWJpbGl0eVBhdHRlcm4pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VDYXBhYmlsaXR5UGF0dGVybihjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2VzcyhjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWN0aXZpdHkoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNIRUNLTElTVDogewotCQkJCUNoZWNrbGlzdCBjaGVja2xpc3QgPSAoQ2hlY2tsaXN0KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQ2hlY2tsaXN0KGNoZWNrbGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UoY2hlY2tsaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjaGVja2xpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjaGVja2xpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGNoZWNrbGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFOiB7Ci0JCQkJQ29tcG9zaXRlUm9sZSBjb21wb3NpdGVSb2xlID0gKENvbXBvc2l0ZVJvbGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VDb21wb3NpdGVSb2xlKGNvbXBvc2l0ZVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJvbGVEZXNjcmlwdG9yKGNvbXBvc2l0ZVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0b3IoY29tcG9zaXRlUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTkNFUFQ6IHsKLQkJCQlDb25jZXB0IGNvbmNlcHQgPSAoQ29uY2VwdCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUNvbmNlcHQoY29uY2VwdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UoY29uY2VwdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoY29uY2VwdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGNvbmNlcHQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29uY2VwdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbmNlcHQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb25jZXB0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbmNlcHQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UOiB7Ci0JCQkJQ29uc3RyYWludCBjb25zdHJhaW50ID0gKENvbnN0cmFpbnQpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VDb25zdHJhaW50KGNvbnN0cmFpbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29uc3RyYWludCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbnN0cmFpbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb25zdHJhaW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbnN0cmFpbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZOiB7Ci0JCQkJQ29udGVudENhdGVnb3J5IGNvbnRlbnRDYXRlZ29yeSA9IChDb250ZW50Q2F0ZWdvcnkpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkoY29udGVudENhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRTogewotCQkJCUNvbnRlbnRDYXRlZ29yeVBhY2thZ2UgY29udGVudENhdGVnb3J5UGFja2FnZSA9IChDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5UGFja2FnZShjb250ZW50Q2F0ZWdvcnlQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RQYWNrYWdlKGNvbnRlbnRDYXRlZ29yeVBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29udGVudENhdGVnb3J5UGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbnRlbnRDYXRlZ29yeVBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb250ZW50Q2F0ZWdvcnlQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbnRlbnRDYXRlZ29yeVBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OOiB7Ci0JCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IChDb250ZW50RGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oY29udGVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb250ZW50RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb250ZW50RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb250ZW50RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UOiB7Ci0JCQkJQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQgPSAoQ29udGVudEVsZW1lbnQpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRTogewotCQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQYWNrYWdlID0gKENvbnRlbnRQYWNrYWdlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQ29udGVudFBhY2thZ2UoY29udGVudFBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFBhY2thZ2UoY29udGVudFBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29udGVudFBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb250ZW50UGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbnRlbnRQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbnRlbnRQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZOiB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY3VzdG9tQ2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VDdXN0b21DYXRlZ29yeShjdXN0b21DYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KGN1c3RvbUNhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFOiB7Ci0JCQkJRGVsaXZlcmFibGUgZGVsaXZlcmFibGUgPSAoRGVsaXZlcmFibGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VEZWxpdmVyYWJsZShkZWxpdmVyYWJsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3QoZGVsaXZlcmFibGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT046IHsKLQkJCQlEZWxpdmVyYWJsZURlc2NyaXB0aW9uIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24gPSAoRGVsaXZlcmFibGVEZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdGlvbihkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTUzogewotCQkJCURlbGl2ZXJ5UHJvY2VzcyBkZWxpdmVyeVByb2Nlc3MgPSAoRGVsaXZlcnlQcm9jZXNzKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlRGVsaXZlcnlQcm9jZXNzKGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2VzcyhkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFjdGl2aXR5KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OOiB7Ci0JCQkJRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gPSAoRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbihkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0Rlc2NyaXB0aW9uKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBY3Rpdml0eURlc2NyaXB0aW9uKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UOiB7Ci0JCQkJRGVzY3JpYmFibGVFbGVtZW50IGRlc2NyaWJhYmxlRWxlbWVudCA9IChEZXNjcmliYWJsZUVsZW1lbnQpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChkZXNjcmliYWJsZUVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SOiB7Ci0JCQkJRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKERlc2NyaXB0b3IpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OOiB7Ci0JCQkJRGVzY3JpcHRvckRlc2NyaXB0aW9uIGRlc2NyaXB0b3JEZXNjcmlwdGlvbiA9IChEZXNjcmlwdG9yRGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VEZXNjcmlwdG9yRGVzY3JpcHRpb24oZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORTogewotCQkJCURpc2NpcGxpbmUgZGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlRGlzY2lwbGluZShkaXNjaXBsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkoZGlzY2lwbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HOiB7Ci0JCQkJRGlzY2lwbGluZUdyb3VwaW5nIGRpc2NpcGxpbmVHcm91cGluZyA9IChEaXNjaXBsaW5lR3JvdXBpbmcpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VEaXNjaXBsaW5lR3JvdXBpbmcoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1Q6IHsKLQkJCQlEb2N1bWVudFJvb3QgZG9jdW1lbnRSb290ID0gKERvY3VtZW50Um9vdCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZURvY3VtZW50Um9vdChkb2N1bWVudFJvb3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU46IHsKLQkJCQlEb21haW4gZG9tYWluID0gKERvbWFpbil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZURvbWFpbihkb21haW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShkb21haW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGRvbWFpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRvbWFpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkb21haW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkb21haW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkb21haW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZG9tYWluKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuRUxFTUVOVDogewotCQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlRWxlbWVudChlbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEU6IHsKLQkJCQlFc3RpbWF0ZSBlc3RpbWF0ZSA9IChFc3RpbWF0ZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUVzdGltYXRlKGVzdGltYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShlc3RpbWF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZXN0aW1hdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChlc3RpbWF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChlc3RpbWF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGVzdGltYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZXN0aW1hdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZXN0aW1hdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFUSU5HX01FVFJJQzogewotCQkJCUVzdGltYXRpbmdNZXRyaWMgZXN0aW1hdGluZ01ldHJpYyA9IChFc3RpbWF0aW5nTWV0cmljKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlRXN0aW1hdGluZ01ldHJpYyhlc3RpbWF0aW5nTWV0cmljKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShlc3RpbWF0aW5nTWV0cmljKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChlc3RpbWF0aW5nTWV0cmljKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZXN0aW1hdGluZ01ldHJpYyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChlc3RpbWF0aW5nTWV0cmljKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZXN0aW1hdGluZ01ldHJpYyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGVzdGltYXRpbmdNZXRyaWMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZXN0aW1hdGluZ01ldHJpYyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlM6IHsKLQkJCQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID0gKEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucyhlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5FWEFNUExFOiB7Ci0JCQkJRXhhbXBsZSBleGFtcGxlID0gKEV4YW1wbGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VFeGFtcGxlKGV4YW1wbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGV4YW1wbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGV4YW1wbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChleGFtcGxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGV4YW1wbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChleGFtcGxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZXhhbXBsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChleGFtcGxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0U6IHsKLQkJCQlHdWlkYW5jZSBndWlkYW5jZSA9IChHdWlkYW5jZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGd1aWRhbmNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChndWlkYW5jZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGd1aWRhbmNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGd1aWRhbmNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChndWlkYW5jZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChndWlkYW5jZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OOiB7Ci0JCQkJR3VpZGFuY2VEZXNjcmlwdGlvbiBndWlkYW5jZURlc2NyaXB0aW9uID0gKEd1aWRhbmNlRGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VHdWlkYW5jZURlc2NyaXB0aW9uKGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5HVUlERUxJTkU6IHsKLQkJCQlHdWlkZWxpbmUgZ3VpZGVsaW5lID0gKEd1aWRlbGluZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUd1aWRlbGluZShndWlkZWxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGd1aWRlbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZ3VpZGVsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZ3VpZGVsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChndWlkZWxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5JVEVSQVRJT046IHsKLQkJCQlJdGVyYXRpb24gaXRlcmF0aW9uID0gKEl0ZXJhdGlvbil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUl0ZXJhdGlvbihpdGVyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFjdGl2aXR5KGl0ZXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChpdGVyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5LSU5EOiB7Ci0JCQkJS2luZCBraW5kID0gKEtpbmQpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VLaW5kKGtpbmQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGtpbmQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChraW5kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGtpbmQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChraW5kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoa2luZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChraW5kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT046IHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZ3VyYXRpb24gPSAoTWV0aG9kQ29uZmlndXJhdGlvbil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZU1ldGhvZENvbmZpZ3VyYXRpb24obWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZENvbmZpZ3VyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlQ6IHsKLQkJCQlNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWV0aG9kRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTogewotCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBtZXRob2RFbGVtZW50UHJvcGVydHkgPSAoTWV0aG9kRWxlbWVudFByb3BlcnR5KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudFByb3BlcnR5KG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RFbGVtZW50UHJvcGVydHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWTogewotCQkJCU1ldGhvZExpYnJhcnkgbWV0aG9kTGlicmFyeSA9IChNZXRob2RMaWJyYXJ5KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kTGlicmFyeShtZXRob2RMaWJyYXJ5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KG1ldGhvZExpYnJhcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWV0aG9kTGlicmFyeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZExpYnJhcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RMaWJyYXJ5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZExpYnJhcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRTogewotCQkJCU1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSA9IChNZXRob2RQYWNrYWdlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kUGFja2FnZShtZXRob2RQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZFBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTjogewotCQkJCU1ldGhvZFBsdWdpbiBtZXRob2RQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kUGx1Z2luKG1ldGhvZFBsdWdpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChtZXRob2RQbHVnaW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWV0aG9kUGx1Z2luKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWV0aG9kUGx1Z2luKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kUGx1Z2luKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZFBsdWdpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUOiB7Ci0JCQkJTWV0aG9kVW5pdCBtZXRob2RVbml0ID0gKE1ldGhvZFVuaXQpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KG1ldGhvZFVuaXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWV0aG9kVW5pdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZFVuaXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RVbml0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZFVuaXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5NSUxFU1RPTkU6IHsKLQkJCQlNaWxlc3RvbmUgbWlsZXN0b25lID0gKE1pbGVzdG9uZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZU1pbGVzdG9uZShtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQobWlsZXN0b25lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVDogewotCQkJCU5hbWVkRWxlbWVudCBuYW1lZEVsZW1lbnQgPSAoTmFtZWRFbGVtZW50KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG5hbWVkRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChuYW1lZEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5PVVRDT01FOiB7Ci0JCQkJT3V0Y29tZSBvdXRjb21lID0gKE91dGNvbWUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VPdXRjb21lKG91dGNvbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0KG91dGNvbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KG91dGNvbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChvdXRjb21lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG91dGNvbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChvdXRjb21lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQob3V0Y29tZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChvdXRjb21lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUEFDS0FHRUFCTEVfRUxFTUVOVDogewotCQkJCVBhY2thZ2VhYmxlRWxlbWVudCBwYWNrYWdlYWJsZUVsZW1lbnQgPSAoUGFja2FnZWFibGVFbGVtZW50KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHBhY2thZ2VhYmxlRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHBhY2thZ2VhYmxlRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChwYWNrYWdlYWJsZUVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QSEFTRTogewotCQkJCVBoYXNlIHBoYXNlID0gKFBoYXNlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUGhhc2UocGhhc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFjdGl2aXR5KHBoYXNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChwaGFzZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChwaGFzZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocGhhc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwaGFzZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwaGFzZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHBoYXNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocGhhc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocGhhc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBOiB7Ci0JCQkJUGxhbm5pbmdEYXRhIHBsYW5uaW5nRGF0YSA9IChQbGFubmluZ0RhdGEpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VQbGFubmluZ0RhdGEocGxhbm5pbmdEYXRhKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocGxhbm5pbmdEYXRhKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocGxhbm5pbmdEYXRhKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocGxhbm5pbmdEYXRhKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFOiB7Ci0JCQkJUHJhY3RpY2UgcHJhY3RpY2UgPSAoUHJhY3RpY2UpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VQcmFjdGljZShwcmFjdGljZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UocHJhY3RpY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHByYWN0aWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJhY3RpY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJhY3RpY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcmFjdGljZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByYWN0aWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHByYWN0aWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT046IHsKLQkJCQlQcmFjdGljZURlc2NyaXB0aW9uIHByYWN0aWNlRGVzY3JpcHRpb24gPSAoUHJhY3RpY2VEZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVByYWN0aWNlRGVzY3JpcHRpb24ocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1M6IHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIHByb2Nlc3MgPSAob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzcyl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVByb2Nlc3MocHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWN0aXZpdHkocHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQocHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChwcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UOiB7Ci0JCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jZXNzQ29tcG9uZW50ID0gKFByb2Nlc3NDb21wb25lbnQpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VQcm9jZXNzQ29tcG9uZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NQYWNrYWdlKHByb2Nlc3NDb21wb25lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFBhY2thZ2UocHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzQ29tcG9uZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRTogewotCQkJCVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSA9IChQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZShwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTjogewotCQkJCVByb2Nlc3NEZXNjcmlwdGlvbiBwcm9jZXNzRGVzY3JpcHRpb24gPSAoUHJvY2Vzc0Rlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzc0Rlc2NyaXB0aW9uKHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWN0aXZpdHlEZXNjcmlwdGlvbihwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbihwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0VMRU1FTlQ6IHsKLQkJCQlQcm9jZXNzRWxlbWVudCBwcm9jZXNzRWxlbWVudCA9IChQcm9jZXNzRWxlbWVudCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJvY2Vzc0VsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc0VsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFOiB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2UgcHJvY2Vzc1BhY2thZ2UgPSAoUHJvY2Vzc1BhY2thZ2UpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VQcm9jZXNzUGFja2FnZShwcm9jZXNzUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kUGFja2FnZShwcm9jZXNzUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc1BhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc1BhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFOiB7Ci0JCQkJUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgPSAoUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZShwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzcyhwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWN0aXZpdHkocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlJFUE9SVDogewotCQkJCVJlcG9ydCByZXBvcnQgPSAoUmVwb3J0KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUmVwb3J0KHJlcG9ydCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UocmVwb3J0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChyZXBvcnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyZXBvcnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocmVwb3J0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocmVwb3J0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocmVwb3J0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHJlcG9ydCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlJFVVNBQkxFX0FTU0VUOiB7Ci0JCQkJUmV1c2FibGVBc3NldCByZXVzYWJsZUFzc2V0ID0gKFJldXNhYmxlQXNzZXQpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VSZXVzYWJsZUFzc2V0KHJldXNhYmxlQXNzZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHJldXNhYmxlQXNzZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9BRE1BUDogewotCQkJCVJvYWRtYXAgcm9hZG1hcCA9IChSb2FkbWFwKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUm9hZG1hcChyb2FkbWFwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShyb2FkbWFwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChyb2FkbWFwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocm9hZG1hcCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2FkbWFwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocm9hZG1hcCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJvYWRtYXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9hZG1hcCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEU6IHsKLQkJCQlSb2xlIHJvbGUgPSAoUm9sZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVJvbGUocm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OOiB7Ci0JCQkJUm9sZURlc2NyaXB0aW9uIHJvbGVEZXNjcmlwdGlvbiA9IChSb2xlRGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VSb2xlRGVzY3JpcHRpb24ocm9sZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24ocm9sZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHJvbGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2xlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2xlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9sZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SOiB7Ci0JCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IgPSAoUm9sZURlc2NyaXB0b3IpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VSb2xlRGVzY3JpcHRvcihyb2xlRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRvcihyb2xlRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVDogewotCQkJCVJvbGVTZXQgcm9sZVNldCA9IChSb2xlU2V0KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUm9sZVNldChyb2xlU2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkocm9sZVNldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocm9sZVNldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJvbGVTZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9sZVNldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGVTZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2xlU2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHJvbGVTZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElORzogewotCQkJCVJvbGVTZXRHcm91cGluZyByb2xlU2V0R3JvdXBpbmcgPSAoUm9sZVNldEdyb3VwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUm9sZVNldEdyb3VwaW5nKHJvbGVTZXRHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KHJvbGVTZXRHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocm9sZVNldEdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocm9sZVNldEdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OOiB7Ci0JCQkJU2VjdGlvbiBzZWN0aW9uID0gKFNlY3Rpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VTZWN0aW9uKHNlY3Rpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoc2VjdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHNlY3Rpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChzZWN0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHNlY3Rpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5TVVBQT1JUSU5HX01BVEVSSUFMOiB7Ci0JCQkJU3VwcG9ydGluZ01hdGVyaWFsIHN1cHBvcnRpbmdNYXRlcmlhbCA9IChTdXBwb3J0aW5nTWF0ZXJpYWwpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VTdXBwb3J0aW5nTWF0ZXJpYWwoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTSzogewotCQkJCVRhc2sgdGFzayA9IChUYXNrKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlVGFzayh0YXNrKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh0YXNrKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodGFzayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0YXNrKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGFzayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRhc2spOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQodGFzayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT046IHsKLQkJCQlUYXNrRGVzY3JpcHRpb24gdGFza0Rlc2NyaXB0aW9uID0gKFRhc2tEZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVRhc2tEZXNjcmlwdGlvbih0YXNrRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbih0YXNrRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQodGFza0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRhc2tEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRhc2tEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRhc2tEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh0YXNrRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1I6IHsKLQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVRhc2tEZXNjcmlwdG9yKHRhc2tEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEU6IHsKLQkJCQlUZWFtUHJvZmlsZSB0ZWFtUHJvZmlsZSA9IChUZWFtUHJvZmlsZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVRlYW1Qcm9maWxlKHRlYW1Qcm9maWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlRFTVBMQVRFOiB7Ci0JCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSAoVGVtcGxhdGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UodGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHRlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0ZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHRlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OOiB7Ci0JCQkJVGVybURlZmluaXRpb24gdGVybURlZmluaXRpb24gPSAoVGVybURlZmluaXRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VUZXJtRGVmaW5pdGlvbih0ZXJtRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UodGVybURlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodGVybURlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGVybURlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTDogewotCQkJCVRvb2wgdG9vbCA9IChUb29sKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlVG9vbCh0b29sKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkodG9vbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQodG9vbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRvb2wpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodG9vbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRvb2wpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0b29sKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHRvb2wpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5UT09MX01FTlRPUjogewotCQkJCVRvb2xNZW50b3IgdG9vbE1lbnRvciA9IChUb29sTWVudG9yKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlVG9vbE1lbnRvcih0b29sTWVudG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZSh0b29sTWVudG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh0b29sTWVudG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0b29sTWVudG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLldISVRFUEFQRVI6IHsKLQkJCQlXaGl0ZXBhcGVyIHdoaXRlcGFwZXIgPSAoV2hpdGVwYXBlcil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVdoaXRlcGFwZXIod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29uY2VwdCh3aGl0ZXBhcGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZSh3aGl0ZXBhcGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh3aGl0ZXBhcGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3aGl0ZXBhcGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlQ6IHsKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCB3b3JrQnJlYWtkb3duRWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTjogewotCQkJCVdvcmtEZWZpbml0aW9uIHdvcmtEZWZpbml0aW9uID0gKFdvcmtEZWZpbml0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlV29ya0RlZmluaXRpb24od29ya0RlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya0RlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtEZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtEZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUjogewotCQkJCVdvcmtPcmRlciB3b3JrT3JkZXIgPSAoV29ya09yZGVyKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlV29ya09yZGVyKHdvcmtPcmRlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVDogewotCQkJCVdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0ID0gKFdvcmtQcm9kdWN0KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3Qod29ya1Byb2R1Y3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod29ya1Byb2R1Y3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya1Byb2R1Y3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OOiB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdGlvbiB3b3JrUHJvZHVjdERlc2NyaXB0aW9uID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbih3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUjogewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3b3JrUHJvZHVjdERlc2NyaXB0b3IgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdG9yKHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRvcih3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFOiB7Ci0JCQkJV29ya1Byb2R1Y3RUeXBlIHdvcmtQcm9kdWN0VHlwZSA9IChXb3JrUHJvZHVjdFR5cGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdFR5cGUod29ya1Byb2R1Y3RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkod29ya1Byb2R1Y3RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh3b3JrUHJvZHVjdFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh3b3JrUHJvZHVjdFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3Rpdml0eTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUFjdGl2aXR5KEFjdGl2aXR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQWN0aXZpdHlEZXNjcmlwdGlvbihBY3Rpdml0eURlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFydGlmYWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJ0aWZhY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VBcnRpZmFjdChBcnRpZmFjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUFydGlmYWN0RGVzY3JpcHRpb24oQXJ0aWZhY3REZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUJyZWFrZG93bkVsZW1lbnQoQnJlYWtkb3duRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbihCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNhcGFiaWxpdHlQYXR0ZXJuKENhcGFiaWxpdHlQYXR0ZXJuIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDaGVja2xpc3QoQ2hlY2tsaXN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ29tcG9zaXRlUm9sZShDb21wb3NpdGVSb2xlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbmNlcHQoQ29uY2VwdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uc3RyYWludDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDb25zdHJhaW50KENvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IENhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ29udGVudENhdGVnb3J5KENvbnRlbnRDYXRlZ29yeSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ29udGVudENhdGVnb3J5UGFja2FnZShDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbnRlbnREZXNjcmlwdGlvbihDb250ZW50RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbnRlbnRFbGVtZW50KENvbnRlbnRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IFBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDb250ZW50UGFja2FnZShDb250ZW50UGFja2FnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ3VzdG9tQ2F0ZWdvcnkoQ3VzdG9tQ2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcmFibGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEZWxpdmVyYWJsZShEZWxpdmVyYWJsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEZWxpdmVyeVByb2Nlc3MoRGVsaXZlcnlQcm9jZXNzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURlc2NyaWJhYmxlRWxlbWVudChEZXNjcmliYWJsZUVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGVzY3JpcHRvcihEZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURlc2NyaXB0b3JEZXNjcmlwdGlvbihEZXNjcmlwdG9yRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2NpcGxpbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGlzY2lwbGluZShEaXNjaXBsaW5lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURpc2NpcGxpbmVHcm91cGluZyhEaXNjaXBsaW5lR3JvdXBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRG9jdW1lbnRSb290KERvY3VtZW50Um9vdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RG9tYWluPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RG9tYWluPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRG9tYWluKERvbWFpbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VFbGVtZW50KEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVzdGltYXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXN0aW1hdGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VFc3RpbWF0ZShFc3RpbWF0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXN0aW1hdGluZyBNZXRyaWM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Fc3RpbWF0aW5nIE1ldHJpYzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUVzdGltYXRpbmdNZXRyaWMoRXN0aW1hdGluZ01ldHJpYyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUV4YW1wbGUoRXhhbXBsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3VpZGFuY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkYW5jZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUd1aWRhbmNlKEd1aWRhbmNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlR3VpZGFuY2VEZXNjcmlwdGlvbihHdWlkYW5jZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkZWxpbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkZWxpbmU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VHdWlkZWxpbmUoR3VpZGVsaW5lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JdGVyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JdGVyYXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VJdGVyYXRpb24oSXRlcmF0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5LaW5kPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+S2luZDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUtpbmQoS2luZCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1ldGhvZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eShNZXRob2RFbGVtZW50UHJvcGVydHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RQYWNrYWdlKE1ldGhvZFBhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlTWV0aG9kUGx1Z2luKE1ldGhvZFBsdWdpbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFVuaXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgVW5pdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1ldGhvZFVuaXQoTWV0aG9kVW5pdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlTWlsZXN0b25lKE1pbGVzdG9uZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TmFtZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VOYW1lZEVsZW1lbnQoTmFtZWRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRjb21lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU91dGNvbWUoT3V0Y29tZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoUGFja2FnZWFibGVFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QaGFzZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBoYXNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUGhhc2UoUGhhc2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUGxhbm5pbmdEYXRhKFBsYW5uaW5nRGF0YSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJhY3RpY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QcmFjdGljZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByYWN0aWNlKFByYWN0aWNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJhY3RpY2VEZXNjcmlwdGlvbihQcmFjdGljZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3NDb21wb25lbnQoUHJvY2Vzc0NvbXBvbmVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZShQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3NEZXNjcmlwdGlvbihQcm9jZXNzRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3NFbGVtZW50KFByb2Nlc3NFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcm9jZXNzUGFja2FnZShQcm9jZXNzUGFja2FnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZShQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUmVwb3J0KFJlcG9ydCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJldXNhYmxlQXNzZXQoUmV1c2FibGVBc3NldCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9hZG1hcDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VSb2FkbWFwKFJvYWRtYXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9sZShSb2xlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJvbGVEZXNjcmlwdGlvbihSb2xlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJvbGVEZXNjcmlwdG9yKFJvbGVEZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNldDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgU2V0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9sZVNldChSb2xlU2V0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9sZVNldEdyb3VwaW5nKFJvbGVTZXRHcm91cGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VTZWN0aW9uKFNlY3Rpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlU3VwcG9ydGluZ01hdGVyaWFsKFN1cHBvcnRpbmdNYXRlcmlhbCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2s8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUYXNrKFRhc2sgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlVGFza0Rlc2NyaXB0aW9uKFRhc2tEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlVGFza0Rlc2NyaXB0b3IoVGFza0Rlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlYW0gUHJvZmlsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlYW0gUHJvZmlsZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRlYW1Qcm9maWxlKFRlYW1Qcm9maWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZW1wbGF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlbXBsYXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlVGVtcGxhdGUoVGVtcGxhdGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRlcm1EZWZpbml0aW9uKFRlcm1EZWZpbml0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ub29sPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRvb2woVG9vbCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ub29sIE1lbnRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRvb2xNZW50b3IoVG9vbE1lbnRvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2hpdGVwYXBlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXaGl0ZXBhcGVyKFdoaXRlcGFwZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoV29ya0JyZWFrZG93bkVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtEZWZpbml0aW9uKFdvcmtEZWZpbml0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIE9yZGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBPcmRlcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtPcmRlcihXb3JrT3JkZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtQcm9kdWN0KFdvcmtQcm9kdWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0b3IoV29ya1Byb2R1Y3REZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya1Byb2R1Y3RUeXBlKFdvcmtQcm9kdWN0VHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9VbWFTd2l0Y2gKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVhNTFByb2Nlc3Nvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hWE1MUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNDA0ZmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hWE1MUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVtYVhNTFByb2Nlc3Nvci5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLnV0aWwuWE1MUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyBoZWxwZXIgbWV0aG9kcyB0byBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIFhNTCBkb2N1bWVudHMKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYVhNTFByb2Nlc3NvciBleHRlbmRzIFhNTFByb2Nlc3NvciB7Ci0JLyoqCi0JICogUHVibGljIGNvbnN0cnVjdG9yIHRvIGluc3RhbnRpYXRlIHRoZSBoZWxwZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYVhNTFByb2Nlc3NvcigpIHsKLQkJc3VwZXIoKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFKSk7Ci0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCX0KLQkKLQkvKioKLQkgKiBSZWdpc3RlciBmb3IgIioiIGFuZCAieG1sIiBmaWxlIGV4dGVuc2lvbnMgdGhlIFVtYVJlc291cmNlRmFjdG9yeUltcGwgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgUmVzb3VyY2UuRmFjdG9yeT4gZ2V0UmVnaXN0cmF0aW9ucygpIHsKLQkJaWYgKHJlZ2lzdHJhdGlvbnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UmVnaXN0cmF0aW9ucygpOwotCQkJcmVnaXN0cmF0aW9ucy5wdXQoWE1MX0VYVEVOU0lPTiwgbmV3IFVtYVJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0JCQlyZWdpc3RyYXRpb25zLnB1dChTVEFSX0VYVEVOU0lPTiwgbmV3IFVtYVJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlZ2lzdHJhdGlvbnM7Ci0JfQotCi19IC8vVW1hWE1MUHJvY2Vzc29yCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFYTUxTYXZlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hWE1MU2F2ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhYzZjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFYTUxTYXZlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFNhdmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuVmVyc2lvblV0aWw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjdXN0b21pemUgdGhlIFhNTFNhdmVJbXBsIHRvIHNhdmUgdGhlIHN0cmluZyB0YWdzIGFzIENEQVRBCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVW1hWE1MU2F2ZUltcGwgZXh0ZW5kcyBYTUxTYXZlSW1wbCB7Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgY2RhdGFGZWF0dXJlTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0Jc3RhdGljIHsKLQkJCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiYWx0ZXJuYXRpdmVzIik7Ci0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgibWFpbkRlc2NyaXB0aW9uIik7Ci0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiaG93VG9TdGFmZiIpOwotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImtleUNvbnNpZGVyYXRpb25zIik7Ci0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgicHVycG9zZSIpOwkKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJzY29wZSIpOwkJCQkJLy8gUHJvY2Vzc0Rlc2NyaXB0aW9uCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgidXNhZ2VOb3RlcyIpOwkJCS8vIFByb2Nlc3NEZXNjcmlwdGlvbgotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNDREFUQUZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGYsIGJvb2xlYW4gaXNBdHRyaWJ1dGUpIHsKLQkJCi0JCWlmICggaXNBdHRyaWJ1dGUgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0vLwkJaWYgKCBmID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpIAotLy8JCQl8fCBmID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKQotLy8JCQl8fCBmID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3Rpb25fRGVzY3JpcHRpb24oKQotLy8JCSkgewotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oInRlc3QiKTsKLS8vCQl9Ci0JCQotCQlyZXR1cm4gY2RhdGFGZWF0dXJlTmFtZXMuY29udGFpbnMoZi5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gaGVscGVyCi0JICovCi0JcHVibGljIFVtYVhNTFNhdmVJbXBsKFhNTEhlbHBlciBoZWxwZXIpIHsKLQkJc3VwZXIoaGVscGVyKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gb3B0aW9ucyBNYXAKLQkgKiBAcGFyYW0gaGVscGVyIFhNTEhlbHBlcgotCSAqIEBwYXJhbSBlbmNvZGluZyBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgVW1hWE1MU2F2ZUltcGwoTWFwIG9wdGlvbnMsIFhNTEhlbHBlciBoZWxwZXIsIFN0cmluZyBlbmNvZGluZykgewotCQlzdXBlcihvcHRpb25zLCBoZWxwZXIsIGVuY29kaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGF0eXBlVmFsdWUoT2JqZWN0IHZhbHVlLCBFU3RydWN0dXJhbEZlYXR1cmUgZiwKLQkJCWJvb2xlYW4gaXNBdHRyaWJ1dGUpIHsJCi0JCQotCQlpZiAoIHZhbHVlID09IG51bGwgfHwgdmFsdWUudG9TdHJpbmcoKS5lcXVhbHMoIiIpICkgewotCQkJcmV0dXJuICIiOwotCQl9CQkJCQotCQkKLQkJaWYgKCBpc0NEQVRBRmVhdHVyZShmLCBpc0F0dHJpYnV0ZSkgKSB7Ci0JCQlTdHJpbmcgc3RyID0gdmFsdWUudG9TdHJpbmcoKTsKLQkJCVN0cmluZyByZXBsYWNlZCA9ICJdXT4iOwkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5pbmRleE9mKHJlcGxhY2VkKSA+PSAwKSB7Ci0JCQkJc3RyID0gc3RyLnJlcGxhY2VBbGwocmVwbGFjZWQsICJdXV1dPjwhW0NEQVRBWz4iICk7CS8vJE5PTi1OTFMtMSQJLy8xNzUzOTUKLQkJCX0KLQkJCXJldHVybiAiPCFbQ0RBVEFbIiArIHN0ciArICJdXT4iOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuZ2V0RGF0YXR5cGVWYWx1ZSh2YWx1ZSwgZiwgaXNBdHRyaWJ1dGUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU1OWZjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBhY2Nlc3NpbmcgdGhlIFhNTCBVTUEgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nLy5wcm9qZWN0IGIvMS41L3JlbGVuZy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI5MDdlYS4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnJlbGVuZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9yZWxlbmcvYnVpbGQtc2NyaXB0cy9hbGxFbGVtZW50cy54bWwgYi8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvYWxsRWxlbWVudHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTAxYzQyLi4wMDAwMDAwCi0tLSBhLzEuNS9yZWxlbmcvYnVpbGQtc2NyaXB0cy9hbGxFbGVtZW50cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08cHJvamVjdCBuYW1lPSJhbGxFbGVtZW50cyBEZWxlZ2F0b3IiPgotCQotIAk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAJPCEtLSBSdW4gYSBnaXZlbiAke3RhcmdldH0gb24gYWxsIGVsZW1lbnRzIGJlaW5nIGJ1aWx0ICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gCTwhLS0gUmVwbGFjZSBlbGVtZW50LmlkIHdpdGggdGhlIGlkIG9mIHRoZSB0b3AgbGV2ZWwgZWxlbWVudCBiZWluZyBidWlsdC4gICAgLS0+Ci0JPCEtLSBJZiBlbGVtZW50LmlkIGRvZXMgbm90IGV4aXN0IGluICR7YnVpbGREaXJlY3Rvcnl9L2ZlYXR1cmVzL2VsZW1lbnQuaWQgICAtLT4KLQk8IS0tIG9yICR7YmFzZUxvY2F0aW9ufS9mZWF0dXJlcy9lbGVtZW50LmlkLCB0aGVuIHlvdSBtdXN0IHByb3ZpZGUgdGhlICAgICAgIC0tPgotCTwhLS0gbG9jYXRpb24gYnkgc2V0dGluZyB0aGUgcHJvcGVydHkgInBsdWdpblBhdGgiICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gCTwhLS0gQWRkIG9uIDxhbnQ+IHRhc2sgZm9yIGVhY2ggdG9wIGxldmVsIGVsZW1lbnQgYmVpbmcgYnVpbHQuICAgICAgICAgICAgIC0tPgotIAk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAJPHRhcmdldCBuYW1lPSJhbGxFbGVtZW50c0RlbGVnYXRvciI+Ci0gCQk8YW50IGFudGZpbGU9IiR7Z2VuZXJpY1RhcmdldHN9IiB0YXJnZXQ9IiR7dGFyZ2V0fSI+Ci0JIAkJPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJmZWF0dXJlIiAvPgotCSAJCTxwcm9wZXJ0eSBuYW1lPSJpZCIgdmFsdWU9Im9yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LmZlYXR1cmUiIC8+Ci0JCTwvYW50PgotCTwvdGFyZ2V0PgotIAotIAk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAJPCEtLSBUYXJnZXRzIHRvIGFzc2VtYmxlIHRoZSBidWlsdCBlbGVtZW50cyBmb3IgcGFydGljdWxhciBjb25maWd1cmF0aW9ucyAgLS0+Ci0gCTwhLS0gVGhlc2UgZ2VuZXJhbGx5IGNhbGwgdGhlIGdlbmVyYXRlZCBhc3NlbWJsZSBzY3JpcHRzIChuYW1lZCBpbiAgICAgICAgIC0tPgotIAk8IS0tICR7YXNzZW1ibGVTY3JpcHROYW1lfSkgYnV0IG1heSBhbHNvIGFkZCBwcmUgYW5kIHBvc3QgcHJvY2Vzc2luZyAgICAgICAtLT4KLSAJPCEtLSBBZGQgb25lIHRhcmdldCBmb3IgZWFjaCByb290IGVsZW1lbnQgYW5kIGVhY2ggY29uZmlndXJhdGlvbiAgICAgICAgICAgLS0+Ci0gCTwhLS0gUmVwbGFjZSBlbGVtZW50LmlkIHdpdGggdGhlIGlkIG9mIHRoZSB0b3AgbGV2ZWwgZWxlbWVudCBiZWluZyBidWlsdCAgIC0tPgotIAk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotIAk8dGFyZ2V0IG5hbWU9ImFzc2VtYmxlLm9yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LmZlYXR1cmUud2luMzIud2luMzIueDg2Ij4KLSAJCTxhbnQgYW50ZmlsZT0iJHthc3NlbWJsZVNjcmlwdE5hbWV9IiBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmNoaXZlTmFtZSIgdmFsdWU9IiR7YXJjaGl2ZU5hbWVQcmVmaXh9LSR7dGd0VmVyfS0ke2J1aWxkTGFiZWx9LXdpbjMyLnppcCIvPgotCQk8L2FudD4KLSAJPC90YXJnZXQ+Ci0KLSAJPHRhcmdldCBuYW1lPSJhc3NlbWJsZS5vcmcuZWNsaXBzZS5lcGYucHJvZHVjdC5mZWF0dXJlLmxpbnV4Lmd0ay54ODYiPgotIAkJPGFudCBhbnRmaWxlPSIke2Fzc2VtYmxlU2NyaXB0TmFtZX0iIGRpcj0iJHtidWlsZERpcmVjdG9yeX0iPgotCQkJPHByb3BlcnR5IG5hbWU9ImFyY2hpdmVOYW1lIiB2YWx1ZT0iJHthcmNoaXZlTmFtZVByZWZpeH0tJHt0Z3RWZXJ9LSR7YnVpbGRMYWJlbH0tbGludXguemlwIi8+Ci0JCTwvYW50PgotIAk8L3RhcmdldD4KLQotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvYnVpbGQucHJvcGVydGllcyBiLzEuNS9yZWxlbmcvYnVpbGQtc2NyaXB0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjk2MjRjLi4wMDAwMDAwCi0tLSBhLzEuNS9yZWxlbmcvYnVpbGQtc2NyaXB0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUGFyYW1ldGVycyBkZXNjcmliaW5nIGhvdyBhbmQgd2hlcmUgdG8gZXhlY3V0ZSB0aGUgYnVpbGQuCi0jIFR5cGljYWwgdXNlcnMgbmVlZCBvbmx5IHVwZGF0ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Ci0jICAgIGJhc2VMb2NhdGlvbiAtIHdoZXJlIHRoaW5ncyB5b3UgYXJlIGJ1aWxkaW5nIGFnYWluc3QgYXJlIGluc3RhbGxlZAotIyAgICBib290Y2xhc3NwYXRoIC0gVGhlIGJhc2UgamFycyB0byBjb21waWxlIGFnYWluc3QgKHR5cGljYWx5IHJ0LmphcikKLSMgICAgY29uZmlncyAtIHRoZSBsaXN0IG9mIHtvcywgd3MsIGFyY2h9IGNvbmZpZ3VyYXRpb25zIHRvIGJ1aWxkLiAgCi0jCi0jIE9mIGNvdXJzZSBhbnkgb2YgdGhlIHNldHRpbmdzIGhlcmUgY2FuIGJlIG92ZXJyaWRkZW4gYnkgc3BlYydpbmcgCi0jIHRoZW0gb24gdGhlIGNvbW1hbmQgbGluZSAoZS5nLiwgLURiYXNlTG9jYXRpb249ZDovZWNsaXBzZQotCi0jIyMjIyMjIyMjIyMjIFBST0RVQ1QvUEFDS0FHSU5HIENPTlRST0wgIyMjIyMjIyMjIyMjIwotI3Byb2R1Y3Q9L3BsdWdpbiBvciBmZWF0dXJlIGlkL3BhdGgvdG8vLnByb2R1Y3QKLXByb2R1Y3Q9b3JnLmVjbGlwc2UuZXBmLnJjcC51aS9jb21wb3Nlci5wcm9kdWN0Ci1ydW5QYWNrYWdlcj10cnVlCi0KLSNTZXQgdGhlIG5hbWUgb2YgdGhlIGFyY2hpdmUgdGhhdCB3aWxsIHJlc3VsdCBmcm9tIHRoZSBwcm9kdWN0IGJ1aWxkLgotYXJjaGl2ZU5hbWVQcmVmaXg9ZXBmLWNvbXBvc2VyCi0KLSMgVGhlIHByZWZpeCB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkIGFyY2hpdmUuCi1hcmNoaXZlUHJlZml4PWVwZi1jb21wb3NlcgotCi0jIFRoZSBsb2NhdGlvbiB1bmRlcndoaWNoIGFsbCBvZiB0aGUgYnVpbGQgb3V0cHV0IHdpbGwgYmUgY29sbGVjdGVkLgotY29sbGVjdGluZ0ZvbGRlcj0ke2FyY2hpdmVQcmVmaXh9Ci0KLSMgVGhlIGxpc3Qgb2Yge29zLCB3cywgYXJjaH0gY29uZmlndXJhdGlvbnMgdG8gYnVpbGQuICBUaGlzIAotIyB2YWx1ZSBpcyBhICcmJyBzZXBhcmF0ZWQgbGlzdCBvZiAnLCcgc2VwYXJhdGUgdHJpcGxlcy4gIEZvciBleGFtcGxlLCAKLSMgICAgIGNvbmZpZ3M9d2luMzIsd2luMzIseDg2ICYgbGludXgsbW90aWYseDg2Ci0jIEJ5IGRlZmF1bHQgdGhlIHZhbHVlIGlzICosKiwqCi0jY29uZmlncz13aW4zMiwgd2luMzIsIHg4NiAmIFwKLSMJbGludXgsIGd0aywgcHBjICZcCi0jIGxpbnV4LCBndGssIHg4NiAmIFwKLSMJbGludXgsIGd0aywgeDg2XzY0ICYgXAotIwlsaW51eCwgbW90aWYsIHg4NiAmIFwKLSMJc29sYXJpcywgbW90aWYsIHNwYXJjICYgXAotIwlzb2xhcmlzLCBndGssIHNwYXJjICYgXAotIwlhaXgsIG1vdGlmLCBwcGMgJiBcCi0jCWhwdXgsIG1vdGlmLCBQQV9SSVNDICYgXAotIwltYWNvc3gsIGNhcmJvbiwgcHBjCi0KLSNjb25maWdzPXdpbjMyLHdpbjMyLHg4NgotY29uZmlncz13aW4zMix3aW4zMix4ODYgJiBsaW51eCxndGsseDg2Ci0KLSMgQnkgZGVmYXVsdCBQREUgY3JlYXRlcyBvbmUgYXJjaGl2ZSAocmVzdWx0KSBwZXIgZW50cnkgbGlzdGVkIGluIHRoZSBjb25maWdzIHByb3BlcnR5LgotIyBTZXR0aW5nIHRoaXMgdmFsdWUgdG8gdHJ5IHdpbGwgY2F1c2UgUERFIHRvIG9ubHkgY3JlYXRlIG9uZSBvdXRwdXQgY29udGFpbmluZyBhbGwgCi0jIGFydGlmYWN0cyBmb3IgYWxsIHRoZSBwbGF0Zm9ybXMgbGlzdGVkIGluIHRoZSBjb25maWdzIHByb3BlcnR5LgotI2dyb3VwQ29uZmlndXJhdGlvbnM9dHJ1ZQotCi0jVGhlIGZvcm1hdCBvZiB0aGUgYXJjaGl2ZS4gQnkgZGVmYXVsdCBhIHppcCBpcyBjcmVhdGVkIHVzaW5nIGFudFppcC4KLSNUaGUgbGlzdCBjYW4gb25seSBjb250YWluIHRoZSBjb25maWd1cmF0aW9uIGZvciB3aGljaCB0aGUgZGVzaXJlZCBmb3JtYXQgaXMgZGlmZmVyZW50IHRoYW4gemlwLgotI2FyY2hpdmVzRm9ybWF0PXdpbjMyLCB3aW4zMiwgeDg2IC0gYW50WmlwJiBcCi0jCWxpbnV4LCBndGssIHBwYyAtIGFudFppcCAmXAotIyAgICBsaW51eCwgZ3RrLCB4ODYgLSBhbnRaaXAmIFwKLSMJbGludXgsIGd0aywgeDg2XzY0IC0gYW50WmlwJiBcCi0jIGxpbnV4LCBtb3RpZiwgeDg2IC0gYW50WmlwJiBcCi0jCXNvbGFyaXMsIG1vdGlmLCBzcGFyYyAtIGFudFppcCYgXAotIwlzb2xhcmlzLCBndGssIHNwYXJjIC0gYW50WmlwJiBcCi0jCWFpeCwgbW90aWYsIHBwYyAtIGFudFppcCYgXAotIwlocHV4LCBtb3RpZiwgUEFfUklTQyAtIGFudFppcCYgXAotIwltYWNvc3gsIGNhcmJvbiwgcHBjIC0gYW50WmlwCi0KLSNhcmNoaXZlc0Zvcm1hdD13aW4zMix3aW4zMix4ODYgLSBmb2xkZXImXAotIyAgICBsaW51eCwgZ3RrLCB4ODYgLSBmb2xkZXIKLWFyY2hpdmVzRm9ybWF0PXdpbjMyLHdpbjMyLHg4NiAtIGFudFppcCZcCi0gICAgbGludXgsIGd0aywgeDg2IC0gYW50WmlwCi0JCi0jU2V0IHRvIHRydWUgaWYgeW91IHdhbnQgdGhlIG91dHB1dCB0byBiZSByZWFkeSBmb3IgYW4gdXBkYXRlIGphciAobm8gc2l0ZS54bWwgZ2VuZXJhdGVkKQotI291dHB1dFVwZGF0ZUphcnMgPSBmYWxzZQotCi0jU2V0IHRvIHRydWUgZm9yIEpubHAgZ2VuZXJhdGlvbgotI2NvZGViYXNlIHNob3VsZCBiZSBhIFVSTCB0aGF0IHdpbGwgYmUgdXNlZCBhcyB0aGUgcm9vdCBvZiBhbGwgcmVsYXRpdmUgVVJMcyBpbiB0aGUgb3V0cHV0LgotI2dlbmVyYXRlSm5scD1mYWxzZQotI2pubHAuY29kZWJhc2U9PGNvZGViYXNlIHVybD4KLSNqbmxwLmoyc2U9PGoyc2UgdmVyc2lvbj4KLSNqbmxwLmxvY2FsZT08YSBsb2NhbGU+Ci0KLSNTZXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byBzaWduIGphcnMKLSNzaWduSmFycz1mYWxzZQotI3NpZ24uYWxpYXM9PGFsaWFzPgotI3NpZ24ua2V5c3RvcmU9PGtleXN0b3JlIGxvY2F0aW9uPgotI3NpZ24uc3RvcmVwYXNzPTxrZXlzdG9yZSBwYXNzd29yZD4KLQotI0FyZ3VtZW50cyB0byBzZW5kIHRvIHRoZSB6aXAgZXhlY3V0YWJsZQotemlwYXJncz0KLQotI0FyZ3VtZW50cyB0byBzZW5kIHRvIHRoZSB0YXIgZXhlY3V0YWJsZQotdGFyYXJncz0KLQotI0NvbnRyb2wgdGhlIGNyZWF0aW9uIG9mIGEgZmlsZSBjb250YWluaW5nIHRoZSB2ZXJzaW9uIGluY2x1ZGVkIGluIGVhY2ggY29uZmlndXJhdGlvbiAtIG9uIGJ5IGRlZmF1bHQgCi0jZ2VuZXJhdGVWZXJzaW9uc0xpc3RzPWZhbHNlCi0KLSMjIyMjIyMjIyMjIyMjIEJVSUxEIE5BTUlORyBDT05UUk9MICMjIyMjIyMjIyMjIyMjIyMKLSMgVGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBidWlsZCBlbGVtZW50cyBhcmUgZmV0Y2hlZCBhbmQgd2hlcmUKLSMgdGhlIGJ1aWxkIHRha2VzIHBsYWNlLgotYnVpbGREaXJlY3Rvcnk9JHtidWlsZGVyfS9idWlsZAotCi0jIFR5cGUgb2YgYnVpbGQuICBVc2VkIGluIG5hbWluZyB0aGUgYnVpbGQgb3V0cHV0LiAgVHlwaWNhbGx5IHRoaXMgdmFsdWUgaXMKLSMgb25lIG9mIEksIE4sIE0sIFMsIC4uLgotYnVpbGRUeXBlPU4KLQotI2J1aWxkSWQgaXMgc2V0IGluIHJ1bi5iYXQKLSMgSUQgb2YgdGhlIGJ1aWxkLiAgVXNlZCBpbiBuYW1pbmcgdGhlIGJ1aWxkIG91dHB1dC4KLSNidWlsZElkPTIwMDcwMjE1LTIxNTAKLXRndFZlcj0xLjIuMAotdGd0TWlsZXN0b25lPU0yCi0KLSMgTGFiZWwgZm9yIHRoZSBidWlsZC4gIFVzZWQgaW4gbmFtaW5nIHRoZSBidWlsZCBvdXRwdXQKLSMgQ3JlYXRlcyBhIGZvbGRlciBuYW1lZCBhcyAke2J1aWxMYWJlbH0gaW4gdGhlIG91dHB1dCBsb2NhdGlvbgotYnVpbGRMYWJlbD0ke2J1aWxkVHlwZX0uJHtidWlsZElkfQotCi0jIFRpbWVzdGFtcCBmb3IgdGhlIGJ1aWxkLiAgVXNlZCBpbiBuYW1pbmcgdGhlIGJ1aWxkIG91dHB1dAotdGltZXN0YW1wPTAwNwotCi0jVGhlIHZhbHVlIHRvIGJlIHVzZWQgZm9yIHRoZSBxdWFsaWZpZXIgb2YgYSBwbHVnaW4gb3IgZmVhdHVyZSB3aGVuIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSB2YWx1ZSBjb21wdXRlZCBieSBwZGUuCi0jVGhlIHZhbHVlIHdpbGwgb25seSBiZSBhcHBsaWVkIHRvIHBsdWdpbiBvciBmZWF0dXJlcyBpbmRpY2F0aW5nIGJ1aWxkLnByb3BlcnRpZXMsIHF1YWxpZmllciA9IGNvbnRleHQgCi0jZm9yY2VDb250ZXh0UXVhbGlmaWVyPTx0aGUgdmFsdWUgZm9yIHRoZSBxdWFsaWZpZXI+Ci0KLSNFbmFibGUgLyBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIGEgc3VmZml4IGZvciB0aGUgZmVhdHVyZXMgdGhhdCB1c2UgLnF1YWxpZmllci4gCi0jVGhlIGdlbmVyYXRlZCBzdWZmaXggaXMgY29tcHV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBjb250ZW50IG9mIHRoZSBmZWF0dXJlICAgCi0jZ2VuZXJhdGVGZWF0dXJlVmVyc2lvblN1ZmZpeD10cnVlCi0KLSMjIyMjIyMjIyMjIyMgQkFTRSBDT05UUk9MICMjIyMjIyMjIyMjIyMKLSMgU2V0dGluZ3MgZm9yIHRoZSBiYXNlIEVjbGlwc2UgY29tcG9uZW50cyBhbmQgSmF2YSBjbGFzcyBsaWJyYXJpZXMgCi0jIGFnYWluc3Qgd2hpY2ggeW91IGFyZSBidWlsZGluZy4KLSMgQmFzZSBsb2NhdGlvbiBmb3IgYW55dGhpbmcgdGhlIGJ1aWxkIG5lZWRzIHRvIGNvbXBpbGUgYWdhaW5zdC4gIEZvciBleGFtcGxlLAotIyBpbiBtb3N0IFJDUCBhcHAgb3IgYSBwbHVnLWluLCAgdGhlIGJhc2VMb2NhdGlvbiBzaG91bGQgYmUgdGhlIGxvY2F0aW9uIG9mIGEgcHJldmlvdXNseQotIyBpbnN0YWxsZWQgRWNsaXBzZSBhZ2FpbnN0IHdoaWNoIHRoZSBhcHBsaWNhdGlvbiBvciBwbHVnLWluIGNvZGUgd2lsbCBiZSBjb21waWxlZCBhbmQgdGhlIFJDUCBkZWx0YSBwYWNrLgotCi0jT3MvV3MvQXJjaC9ubCBvZiB0aGUgZWNsaXBzZSBzcGVjaWZpZWQgYnkgYmFzZUxvY2F0aW9uCi1iYXNlb3M9d2luMzIKLWJhc2V3cz13aW4zMgotYmFzZWFyY2g9eDg2Ci0KLSNwbHVnaW5QYXRoIGlzIGEgbGlzdCBvZiBsb2NhdGlvbnMgaW4gd2hpY2ggdG8gZmluZCBwbHVnaW5zIGFuZCBmZWF0dXJlcy4gIFRoaXMgbGlzdCBpcyBzZXBhcmF0ZWQgYnkgdGhlIHBsYXRmb3JtIGZpbGUgc2VwYXJhdG9yICg7IG9yIDopCi0jYSBsb2NhdGlvbiBpcyBvbmUgb2Y6ICAKLSMtIHRoZSBsb2NhdGlvbiBvZiB0aGUgamFyIG9yIGZvbGRlciB0aGF0IGlzIHRoZSBwbHVnaW4gb3IgZmVhdHVyZSA6IC9wYXRoL3RvL2Zvby5qYXIgb3IgL3BhdGgvdG8vZm9vCi0jLSBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGEgL3BsdWdpbnMgb3IgL2ZlYXR1cmVzIHN1YmRpcmVjdG9yeQotIy0gdGhlIGxvY2F0aW9uIG9mIGEgZmVhdHVyZS54bWwsIG9yIGZvciAyLjEgc3R5bGUgcGx1Z2lucywgdGhlIHBsdWdpbi54bWwgb3IgZnJhZ21lbnQueG1sCi0jcGx1Z2luUGF0aD0KLQotc2tpcEJhc2U9dHJ1ZQotZWNsaXBzZVVSTD08dXJsIGZvciBlY2xpcHNlIGRvd25sb2FkIHNpdGU+Ci1lY2xpcHNlQnVpbGRJZD08SWQgb2YgRWNsaXBzZSBidWlsZCB0byBnZXQ+Ci1lY2xpcHNlQmFzZVVSTD0ke2VjbGlwc2VVUkx9L2VjbGlwc2UtcGxhdGZvcm0tJHtlY2xpcHNlQnVpbGRJZH0td2luMzIuemlwCi0KLQotIyMjIyMjIyMjIyMjIyBNQVAgRklMRSBDT05UUk9MICMjIyMjIyMjIyMjIyMjIyMKLSMgVGhpcyBzZWN0aW9uIGRlZmluZXMgQ1ZTIHRhZ3MgdG8gdXNlIHdoZW4gZmV0Y2hpbmcgdGhlIG1hcCBmaWxlcyBmcm9tIHRoZSByZXBvc2l0b3J5LgotIyBJZiB5b3Ugd2FudCB0byBmZXRjaCB0aGUgbWFwIGZpbGUgZnJvbSByZXBvc2l0b3J5IC8gbG9jYXRpb24sIGNoYW5nZSB0aGUgZ2V0TWFwRmlsZXMgdGFyZ2V0IGluIHRoZSBjdXN0b21UYXJnZXRzLnhtbAotCi0jc2tpcE1hcHM9dHJ1ZQotI21hcHNSZXBvPTpwc2VydmVyOmFub255bW91c0BleGFtcGxlLmNvbS9wYXRoL3RvL3JlcG8KLW1hcHNSZXBvPSR7Y3ZzSW5mb31AZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3kKLSNtYXBzUm9vdD1wYXRoL3RvL21hcHMKLW1hcHNSb290PW9yZy5lY2xpcHNlLmVwZi9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yZWxlbmcvbWFwcwotbWFwc0NoZWNrb3V0VGFnPUhFQUQKLSNtYXBzQ2hlY2tvdXRUYWc9diR7YnVpbGRJZH0KLQotdGFnTWFwcz10cnVlCi1tYXBzVGFnVGFnPXYke2J1aWxkSWR9Ci0KLSMjIyMjIyMjIyMjIyMgVVBEQVRFIFNJVEUgRklMRSBDT05UUk9MICMjIyMjIyMjIyMjIyMjIyMKLXVwZGF0ZVNpdGVSZXBvPSR7Y3ZzSW5mb31AZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L29yZy5lY2xpcHNlCi11cGRhdGVTaXRlRmlsZT13d3cvZXBmL2Rvd25sb2Fkcy90b29sL3Rvb2xfZG93bmxvYWRzLnBocAotdXBkYXRlU2l0ZUNoZWNrb3V0VGFnPUhFQUQKLXVwZGF0ZVNpdGVEZXN0aW5hdGlvbj0KLQotCi0jIyMjIyMjIyMjIyMgUkVQT1NJVE9SWSBDT05UUk9MICMjIyMjIyMjIyMjIyMjIwotIyBUaGlzIHNlY3Rpb24gZGVmaW5lcyBwcm9wZXJ0aWVzIHBhcmFtZXRlcml6aW5nIHRoZSByZXBvc2l0b3JpZXMgd2hlcmUgcGx1Z2lucywgZnJhZ21lbnRzCi0jIGJ1bmRsZXMgYW5kIGZlYXR1cmVzIGFyZSBiZWluZyBvYnRhaW5lZCBmcm9tLiAKLQotIyBUaGUgdGFncyB0byB1c2Ugd2hlbiBmZXRjaGluZyBlbGVtZW50cyB0byBidWlsZC4KLSMgQnkgZGVmYXVsdCB0aGVidWlsZGVyIHdpbGwgdXNlIHdoYXRldmVyIGlzIGluIHRoZSBtYXBzLiAgCi0jIFRoaXMgdmFsdWUgdGFrZXMgdGhlIGZvcm0gb2YgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiByZXBvc2l0b3J5IGlkZW50aWZpZXIgKGxpa2UgdXNlZCBpbiB0aGUgbWFwIGZpbGVzKSBhbmQgdGhlIAotIyBvdmVycmlkaW5nIHZhbHVlCi0jIEZvciBleGFtcGxlIGZldGNoVGFnPUNWUz1IRUFELCBTVk49djIwMDUwMTAxCi0jZmV0Y2hUYWc9UjFfMF9CUkFOQ0gKLSNmZXRjaFRhZz1IRUFECi0jc2tpcEZldGNoPXRydWUKLQotCi0jIyMjIyMjIyMjIyMjIEpBVkEgQ09NUElMRVIgT1BUSU9OUyAjIyMjIyMjIyMjIyMjIwotIyBUaGUgbG9jYXRpb24gb2YgdGhlIEphdmEgamFycyB0byBjb21waWxlIGFnYWluc3QuICBUeXBpY2FsbHkgdGhlIHJ0LmphciBmb3IgeW91ciBKREsvSlJFCi1ib290Y2xhc3NwYXRoPSR7amF2YS5ob21lfS9saWIvY29yZS5qYXI7JHtqYXZhLmhvbWV9L2xpYi9jaGFyc2V0cy5qYXI7JHtqYXZhLmhvbWV9L2xpYi9CRC5qYXI7JHtqYXZhLmhvbWV9L2xpYi9kZXBsb3kuamFyOyR7amF2YS5ob21lfS9saWIvZ3JhcGhpY3MuamFyOyR7amF2YS5ob21lfS9saWIvaWJtY2VydHBhdGhwcm92aWRlci5qYXI7JHtqYXZhLmhvbWV9L2xpYi9pYm1jZncuamFyOyR7amF2YS5ob21lfS9saWIvaWJtamFhc2FjdGl2ZWxtLmphcjske2phdmEuaG9tZX0vbGliL2libWphYXNsbS5qYXI7JHtqYXZhLmhvbWV9L2xpYi9pYm1qY2Vmdy5qYXI7JHtqYXZhLmhvbWV9L2xpYi9pYm1qZ3NzcHJvdmlkZXIuamFyOyR7amF2YS5ob21lfS9saWIvaWJtanNzZXByb3ZpZGVyMi5qYXI7JHtqYXZhLmhvbWV9L2xpYi9pYm1vcmIuamFyOyR7amF2YS5ob21lfS9saWIvaWJtb3JiYXBpLmphcjske2phdmEuaG9tZX0vbGliL2libXBrY3MuamFyOyR7amF2YS5ob21lfS9saWIvamF2YXdzLmphcjske2phdmEuaG9tZX0vbGliL3BsdWdpbi5qYXI7JHtqYXZhLmhvbWV9L2xpYi9zZWN1cml0eS5qYXI7JHtqYXZhLmhvbWV9L2xpYi9zZXJ2ZXIuamFyOyR7amF2YS5ob21lfS9saWIvdm0uamFyOyR7amF2YS5ob21lfS9saWIveG1sLmphcjske2phdmEuaG9tZX0vbGliL3J0LmphcgotCi0jIHNwZWNpZmljIEpSRSBsb2NhdGlvbnMgdG8gY29tcGlsZSBhZ2FpbnN0LiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgdG8gY29tcGlsZSBidW5kbGVzIHNwZWNpZnlpbmcgYSAKLSMgQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQuIFVuY29tbWVudCBhbmQgc2V0IHZhbHVlcyBmb3IgZW52aXJvbm1lbnRzIHRoYXQgeW91IHN1cHBvcnQKLSNDREMtMS4wL0ZvdW5kYXRpb24tMS4wPSAvcGF0aC90by9ydC5qYXIKLSNDREMtMS4xL0ZvdW5kYXRpb24tMS4xPQotI09TR2kvTWluaW11bS0xLjA9Ci0jT1NHaS9NaW5pbXVtLTEuMT0KLSNKUkUtMS4xPQotI0oyU0UtMS4yPQotI0oyU0UtMS4zPQotI0oyU0UtMS40PQotI0oyU0UtMS41PQotI0phdmFTRS0xLjY9Ci0jUGVyc29uYWxKYXZhLTEuMT0KLSNQZXJzb25hbEphdmEtMS4yPQotI0NEQy0xLjAvUGVyc29uYWxCYXNpcy0xLjA9Ci0jQ0RDLTEuMC9QZXJzb25hbEphdmEtMS4wPQotI0NEQy0xLjEvUGVyc29uYWxCYXNpcy0xLjE9Ci0jQ0RDLTEuMS9QZXJzb25hbEphdmEtMS4xPQotCi0jIFNwZWNpZnkgdGhlIG91dHB1dCBmb3JtYXQgb2YgdGhlIGNvbXBpbGVyIGxvZyB3aGVuIGVjbGlwc2UgamR0IGlzIHVzZWQKLWxvZ0V4dGVuc2lvbj0ubG9nCi0KLSMgV2hldGhlciBvciBub3QgdG8gaW5jbHVkZSBkZWJ1ZyBpbmZvIGluIHRoZSBvdXRwdXQgamFycwotamF2YWNEZWJ1Z0luZm89dHJ1ZSAKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBmYWlsIHRoZSBidWlsZCBpZiB0aGVyZSBhcmUgY29tcGlsZXIgZXJyb3JzCi1qYXZhY0ZhaWxPbkVycm9yPXRydWUKLQotIyBFbmFibGUgb3IgZGlzYWJsZSB2ZXJib3NlIG1vZGUgb2YgdGhlIGNvbXBpbGVyCi0jamF2YWNWZXJib3NlPXRydWUKLQotIyBFeHRyYSBhcmd1bWVudHMgZm9yIHRoZSBjb21waWxlci4gVGhlc2UgYXJlIHNwZWNpZmljIHRvIHRoZSBqYXZhIGNvbXBpbGVyIGJlaW5nIHVzZWQuCi0jY29tcGlsZXJBcmc9LWcKLWNvbXBpbGVyQXJnPS1ub3dhcm4KLQotIyBEZWZhdWx0IHZhbHVlIGZvciB0aGUgdmVyc2lvbiBvZiB0aGUgc291cmNlIGNvZGUuIFRoaXMgdmFsdWUgaXMgdXNlZCB3aGVuIGNvbXBpbGluZyBwbHVnLWlucyB0aGF0IGRvIG5vdCBzZXQgdGhlIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50IG9yIHNldCBqYXZhY1NvdXJjZSBpbiBidWlsZC5wcm9wZXJ0aWVzCi1qYXZhY1NvdXJjZT0xLjUKLQotIyBEZWZhdWx0IHZhbHVlIGZvciB0aGUgdmVyc2lvbiBvZiB0aGUgYnl0ZSBjb2RlIHRhcmdldGVkLiBUaGlzIHZhbHVlIGlzIHVzZWQgd2hlbiBjb21waWxpbmcgcGx1Zy1pbnMgdGhhdCBkbyBub3Qgc2V0IHRoZSBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudCBvciBzZXQgamF2YWNUYXJnZXQgaW4gYnVpbGQucHJvcGVydGllcy4KLWphdmFjVGFyZ2V0PTEuNQotCi0KZGlmZiAtLWdpdCBhLzEuNS9yZWxlbmcvYnVpbGQtc2NyaXB0cy9jdXN0b21UYXJnZXRzLnhtbCBiLzEuNS9yZWxlbmcvYnVpbGQtc2NyaXB0cy9jdXN0b21UYXJnZXRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY1YTEzOC4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvY3VzdG9tVGFyZ2V0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iQnVpbGQgc3BlY2lmaWMgdGFyZ2V0cyBhbmQgcHJvcGVydGllcyIgZGVmYXVsdD0ibm9EZWZhdWx0Ij4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gUnVuIGEgZ2l2ZW4gJHt0YXJnZXR9IG9uIGFsbCBlbGVtZW50cyBiZWluZyBidWlsdCAtLT4KLQk8IS0tIEFkZCBvbiA8YW50PiB0YXNrIGZvciBlYWNoIHRvcCBsZXZlbCBlbGVtZW50IGJlaW5nIGJ1aWx0LiAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8cHJvcGVydHkgbmFtZT0iYWxsRWxlbWVudHNGaWxlIiB2YWx1ZT0iJHtidWlsZGVyfS9hbGxFbGVtZW50cy54bWwiLz4KLQk8aW1wb3J0IGZpbGU9IiR7YWxsRWxlbWVudHNGaWxlfSIvPgotCi0JPHRhcmdldCBuYW1lPSJhbGxFbGVtZW50cyI+Ci0JCTxhbnRjYWxsIHRhcmdldD0iYWxsRWxlbWVudHNEZWxlZ2F0b3IiLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9ImdldEJhc2VDb21wb25lbnRzIiBkZXBlbmRzPSJjaGVja0xvY2FsQmFzZSIgdW5sZXNzPSJza2lwQmFzZSI+Ci0JCTxnZXQgc3JjPSIke2VjbGlwc2VCYXNlVVJMfSIgZGVzdD0iJHtidWlsZERpcmVjdG9yeX0vLi4vdGVtcC1iYXNlLnppcCIvPgotCQk8dW56aXAgZGVzdD0iJHtiYXNlfSIgb3ZlcndyaXRlPSJ0cnVlIiBzcmM9IiR7YnVpbGREaXJlY3Rvcnl9Ly4uL3RlbXAtYmFzZS56aXAiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iY2hlY2tMb2NhbEJhc2UiPgotCQk8YXZhaWxhYmxlIGZpbGU9IiR7YmFzZX0iIHByb3BlcnR5PSJza2lwQmFzZSIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBDaGVjayBvdXQgbWFwIGZpbGVzIGZyb20gY29ycmVjdCByZXBvc2l0b3J5IC0tPgotCTwhLS0gUmVwbGFjZSB2YWx1ZXMgZm9yIG1hcHNDaGVja291dFRhZyBhcyBkZXNpcmVkLiAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9ImdldE1hcEZpbGVzIiBkZXBlbmRzPSJjaGVja0xvY2FsTWFwcyIgdW5sZXNzPSJza2lwTWFwcyI+Ci0JCTwhLS0gPHByb3BlcnR5IG5hbWU9Im1hcHNDaGVja291dFRhZyIgdmFsdWU9IkhFQUQiLz4gLS0+Ci0JCTxjdnMgY3ZzUm9vdD0iJHttYXBzUmVwb30iIHBhY2thZ2U9IiR7bWFwc1Jvb3R9IiBkZXN0PSIke2J1aWxkRGlyZWN0b3J5fS9tYXBzIiB0YWc9IiR7bWFwc0NoZWNrb3V0VGFnfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjaGVja0xvY2FsTWFwcyI+Ci0JCTxhdmFpbGFibGUgcHJvcGVydHk9InNraXBNYXBzIiBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9tYXBzIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InRhZ01hcEZpbGVzIiBpZj0idGFnTWFwcyI+Ci0JCTxjdnMgZGVzdD0iJHtidWlsZERpcmVjdG9yeX0vbWFwcy8ke21hcHNSb290fSIgY29tbWFuZD0idGFnICR7bWFwc1RhZ1RhZ30iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0JPHRhcmdldCBuYW1lPSJjbGVhbiIgdW5sZXNzPSJub2NsZWFuIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJhbGxFbGVtZW50cyI+Ci0JCQk8cGFyYW0gbmFtZT0idGFyZ2V0IiB2YWx1ZT0iY2xlYW5FbGVtZW50Ii8+Ci0JCTwvYW50Y2FsbD4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iY2xlYW5CdWlsZERpciI+Ci0JCTxkZWxldGUgaW5jbHVkZWVtcHR5ZGlycz0idHJ1ZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9IiAKLQkJCQlpbmNsdWRlcz0iKiovKiIKLQkJCQlkZWZhdWx0ZXhjbHVkZXM9Im5vIgotCQkJLz4KLQkJPC9kZWxldGU+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImdhdGhlckxvZ3MiPgotCQk8bWtkaXIgZGlyPSIke2J1aWxkRGlyZWN0b3J5fS8ke2J1aWxkTGFiZWx9L2NvbXBpbGVsb2dzIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iYWxsRWxlbWVudHMiPgotCQkJPHBhcmFtIG5hbWU9InRhcmdldCIgdmFsdWU9ImdhdGhlckxvZ3MiLz4KLQkJPC9hbnRjYWxsPgotCQk8dW56aXAgZGVzdD0iJHtidWlsZERpcmVjdG9yeX0vJHtidWlsZExhYmVsfS9jb21waWxlbG9ncyIgb3ZlcndyaXRlPSJ0cnVlIj4KLQkJCTxmaWxlc2V0IGRpcj0iJHtidWlsZERpcmVjdG9yeX0vZmVhdHVyZXMiPgotCQkJCTxpbmNsdWRlIG5hbWU9IioqLyoubG9nLnppcCIvPgotCQkJPC9maWxlc2V0PgotCQk8L3VuemlwPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZ2VuZXJhdGVBYm91dE1hcHBpbmdzIj4KLQkJPHJlcGxhY2UgZGlyPSIke2J1aWxkRGlyZWN0b3J5fS9wbHVnaW5zIiB2YWx1ZT0iJHtidWlsZElkfSIgdG9rZW49IkBidWlsZElkQCI+Ci0JCQk8aW5jbHVkZSBuYW1lPSIqKi9hYm91dC5tYXBwaW5ncyIgLz4KLQkJPC9yZXBsYWNlPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0idXBkYXRlUmNwSW5pRmlsZSI+Ci0JCTxyZXBsYWNlIGRpcj0iJHtidWlsZERpcmVjdG9yeX0iIHZhbHVlPSIke2J1aWxkSWR9IiB0b2tlbj0iQGJ1aWxkSWRAIj4KLQkJCTxpbmNsdWRlIG5hbWU9IioqL2VwZi5pbmkiIC8+Ci0JCTwvcmVwbGFjZT4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InVwZGF0ZUJ1aWxkU3RhdGUiPgotCQk8dHN0YW1wPgotCQkJPGZvcm1hdCBwcm9wZXJ0eT0iYnVpbGREYXRlIiBwYXR0ZXJuPSJ5eXl5LU1NLWQiLz4KLQkJPC90c3RhbXA+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjdXJyZW50QnVpbGRTdGF0ZUZpbGUiIHZhbHVlPSIke2J1aWxkU3RhdGVEaXJ9L3RhZy5jdXJyZW50LnByb3BlcnRpZXMiLz4KLQkJPHByb3BlcnR5IGZpbGU9IiR7Y3VycmVudEJ1aWxkU3RhdGVGaWxlfSIgcHJlZml4PSJwcmV2Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwcmV2LmJ1aWxkRGF0ZSIgdmFsdWU9IiR7YnVpbGREYXRlfSIvPgotCQk8cGF0aCBpZD0iYnVpbGREaXJUZW1wUGF0aCIgbG9jYXRpb249IiR7YnVpbGREaXJlY3Rvcnl9Ii8+Ci0JCTxwYXRoY29udmVydCBkaXJzZXA9Ii8iIHByb3BlcnR5PSJidWlsZERpcmVjdG9yeVBhdGgiIHJlZmlkPSJidWlsZERpclRlbXBQYXRoIi8+Ci0JCTxwcm9wZXJ0eWZpbGUKLQkJICAgIGZpbGU9IiR7Y3VycmVudEJ1aWxkU3RhdGVGaWxlfSIKLQkJICAgIGNvbW1lbnQ9Ikxhc3QgYnVpbGQgSUQgYW5kIGRhdGUiPgotCQkgIDxlbnRyeSBrZXk9ImJ1aWxkSWQiIHZhbHVlPSIke2J1aWxkSWR9Ii8+Ci0JCSAgPGVudHJ5IGtleT0iYnVpbGREYXRlIiB2YWx1ZT0iJHtidWlsZERhdGV9Ii8+Ci0JCSAgPGVudHJ5IGtleT0iYnVpbGREaXIiIHZhbHVlPSIke2J1aWxkRGlyZWN0b3J5UGF0aH0iLz4KLQkJPC9wcm9wZXJ0eWZpbGU+Ci0JCTxlY2hvIGZpbGU9IiR7YnVpbGRTdGF0ZURpcn0vLi4vJHtidWlsZElkfS5idWdzIj5odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9idWdsaXN0LmNnaT9xdWVyeV9mb3JtYXQ9YWR2YW5jZWQmYW1wO3Nob3J0X2Rlc2NfdHlwZT1hbGx3b3Jkc3N1YnN0ciZhbXA7c2hvcnRfZGVzYz0mYW1wO3Byb2R1Y3Q9RVBGJmFtcDtsb25nX2Rlc2NfdHlwZT1hbGx3b3Jkc3N1YnN0ciZhbXA7bG9uZ19kZXNjPSZhbXA7YnVnX2ZpbGVfbG9jX3R5cGU9YWxsd29yZHNzdWJzdHImYW1wO2J1Z19maWxlX2xvYz0mYW1wO3N0YXR1c193aGl0ZWJvYXJkX3R5cGU9YWxsd29yZHNzdWJzdHImYW1wO3N0YXR1c193aGl0ZWJvYXJkPSZhbXA7a2V5d29yZHNfdHlwZT1hbGx3b3JkcyZhbXA7a2V5d29yZHM9JmFtcDtlbWFpbHR5cGUxPXN1YnN0cmluZyZhbXA7ZW1haWwxPSZhbXA7ZW1haWx0eXBlMj1zdWJzdHJpbmcmYW1wO2VtYWlsMj0mYW1wO2J1Z2lkdHlwZT1pbmNsdWRlJmFtcDtidWdfaWQ9JmFtcDt2b3Rlcz0mYW1wO2NoZmllbGRmcm9tPSR7cHJldi5idWlsZERhdGV9JmFtcDtjaGZpZWxkdG89JHtidWlsZERhdGV9JmFtcDtjaGZpZWxkPXJlc29sdXRpb24mYW1wO2NoZmllbGR2YWx1ZT0mYW1wO2NtZHR5cGU9ZG9pdCZhbXA7b3JkZXI9UmV1c2Urc2FtZStzb3J0K2FzK2xhc3QrdGltZSZhbXA7ZmllbGQwLTAtMD1ub29wJmFtcDt0eXBlMC0wLTA9bm9vcCZhbXA7dmFsdWUwLTAtMD0KLTwvZWNobz4KLQk8L3RhcmdldD4KLQotCTwhLS0KLQk8dGFyZ2V0IG5hbWU9InB1c2gyU2l0ZSI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ1cFNjcmlwdEFyZ3MiIHZhbHVlPSIuLi4iLz4KLQkJPGV4ZWMgZGlyPSIke2J1aWxkZXJ9IiBleGVjdXRhYmxlPSIke3VwU2NyaXB0fSIgb3V0cHV0PSJlcGZfcHVzaDJzdnIub3V0cHV0LnR4dCI+Ci0JCQk8YXJnIGxpbmU9IiR7dXBTY3JpcHRBcmdzfSIvPgotCQk8L2V4ZWM+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNoZWNrb3V0RExQZyI+Ci0JCTxjdnMgY3ZzUm9vdD0iJHt1cGRhdGVTaXRlUmVwb30iIGRlc3Q9IiR7YnVpbGREaXJlY3Rvcnl9L2VwZlNpdGUiIHBhY2thZ2U9IiR7dXBkYXRlU2l0ZUZpbGV9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InVwZGF0ZURMUGciIGRlcGVuZHM9ImNoZWNrb3V0RExQZyI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjb21taXRNc2ciIHZhbHVlPSJOaWdodGx5X0J1aWxkcyIvPgotCQk8cHJvcGVydHkgbmFtZT0idXBkYXRlUGFnZUFyZ3MiIHZhbHVlPSIke3RndFZlcn0gJHt0Z3RNaWxlc3RvbmV9ICR7ZXBmLmJ1aWxkSWR9ICR7YnVpbGREaXJlY3Rvcnl9L2VwZlNpdGUvJHt1cGRhdGVTaXRlRmlsZX0iLz4KLQkJPGV4ZWMgZGlyPSIke2J1aWxkZXJ9IiBleGVjdXRhYmxlPSJzOi9iaW4vZXBmX2NoYW5nZXBhZ2UuY21kIiBvdXRwdXQ9ImVwZl9jaGFuZ2VwYWdlLm91dHB1dC50eHQiPgotCQkJPGFyZyBsaW5lPSIke3VwZGF0ZVBhZ2VBcmdzfSIvPgotCQk8L2V4ZWM+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNvbW1pdERMUGciIGRlcGVuZHM9InVwZGF0ZURMUGciIHVubGVzcz0ibm9ETFBnIj4KLQkJPGN2cyBjdnNSb290PSIke3VwZGF0ZVNpdGVSZXBvfSIgZGVzdD0iJHtidWlsZERpcmVjdG9yeX0vZXBmU2l0ZS8ke3VwZGF0ZVNpdGVGaWxlfSIgY29tbWFuZD0iY2hlY2tpbiAtbSAke2NvbW1pdE1zZ30gJHt1cGRhdGVTaXRlRmlsZX0iLz4KLQk8L3RhcmdldD4KLQktLT4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHNldHVwIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlU2V0dXAiPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImNsZWFuQnVpbGREaXIiLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgc2V0dXAgYnV0IGJlZm9yZSBzdGFydGluZyB0aGUgYnVpbGQgcHJvcGVyIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdFNldHVwIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJnZXRCYXNlQ29tcG9uZW50cyIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgZmV0Y2hpbmcgdGhlIGJ1aWxkIGVsZW1lbnRzIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlRmV0Y2giPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciBmZXRjaGluZyB0aGUgYnVpbGQgZWxlbWVudHMgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0RmV0Y2giPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ01hcEZpbGVzIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iZ2VuZXJhdGVBYm91dE1hcHBpbmdzIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0idXBkYXRlUmNwSW5pRmlsZSIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgZ2VuZXJhdGluZyB0aGUgYnVpbGQgc2NyaXB0cy4gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmVHZW5lcmF0ZSI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIGdlbmVyYXRpbmcgdGhlIGJ1aWxkIHNjcmlwdHMuIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdEdlbmVyYXRlIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJjbGVhbiIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgcnVubmluZyB0aGUgYnVpbGQueG1scyBmb3IgdGhlIGVsZW1lbnRzIGJlaW5nIGJ1aWx0LiAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZVByb2Nlc3MiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciBydW5uaW5nIHRoZSBidWlsZC54bWxzIGZvciB0aGUgZWxlbWVudHMgYmVpbmcgYnVpbHQuIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdFByb2Nlc3MiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgcnVubmluZyBhc3NlbWJsZS4gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmVBc3NlbWJsZSI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyICBydW5uaW5nIGFzc2VtYmxlLiAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3RBc3NlbWJsZSI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSBydW5uaW5nIHBhY2thZ2UuIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlUGFja2FnZSI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyICBydW5uaW5nIHBhY2thZ2UuIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdFBhY2thZ2UiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgYnVpbGQgaXMgZG9uZS4gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0QnVpbGQiPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImdhdGhlckxvZ3MiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ1cGRhdGVCdWlsZFN0YXRlIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIHRvIHRlc3QgdGhlIGJ1aWxkIHJlc3VsdHMgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJ0ZXN0Ij4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gdG8gcHVibGlzaCB0aGUgYnVpbGQgcmVzdWx0cyAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InB1Ymxpc2giPgotCQk8IS0tCi0JCTxhbnRjYWxsIHRhcmdldD0icHVzaDJTaXRlIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iY29tbWl0RExQZyIvPgotCQktLT4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gRGVmYXVsdCB0YXJnZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0ibm9EZWZhdWx0Ij4KLQkJPGVjaG8gbWVzc2FnZT0iWW91IG11c3Qgc3BlY2lmeSBhIHRhcmdldCB3aGVuIGludm9raW5nIHRoaXMgZmlsZSIvPgotCTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvcmVhZG1lLnR4dCBiLzEuNS9yZWxlbmcvYnVpbGQtc2NyaXB0cy9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmNlMTk3Li4wMDAwMDAwCi0tLSBhLzEuNS9yZWxlbmcvYnVpbGQtc2NyaXB0cy9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotcnVuLmJhdAkJCWJhdGNoIGZpbGUgdG8gcnVuIGhlYWRsZXNzIGJ1aWxkCi1idWlsZC5wcm9wZXJ0aWVzCWNvbnRhaW5zIGJ1aWxkIG9wdGlvbnMKLWFsbEVsZW1lbnRzLnhtbAkJYnVpbGQgc2NyaXB0Ci1jdXN0b21UYXJnZXRzLnhtbAlidWlsZCBzY3JpcHQKLXJlYWRtZS50eHQJCXRoaXMgZmlsZQotYnVpbGQvCQkJZGlyZWN0b3J5IGNvbnRhaW5pbmcgc291cmNlIHB1bGxlZCBmcm9tIENWUyBhbmQgYnVpbGQgb3V0cHV0IC0gdG8gYmUgY2xlYW5lZCB1cCBhZnRlciBldmVyeSBidWlsZAotdGVtcGxhdGVzLwkJZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGVtcGxhdGUgZmlsZXMgZnJvbSBlY2xpcHNlCi13b3Jrc3BhY2UvCQl3b3Jrc3BhY2UgY3JlYXRlZCBieSBFY2xpcHNlIElERSBhcyBtZW50aW9uZWQgaW4gMS42Ci0KLQotTW9yZSBEZXRhaWxlZCBJbnN0cnVjdGlvbnMKLQotMS4gU2V0IHVwIEhlYWRsZXNzIEJ1aWxkIEVudmlyb25tZW50Ci0KLSAgMS4xIEluc3RhbGwgSlNESyBpcyBvbiB0aGUgc3lzdGVtIGFuZCBtYWtlIHN1cmUgamF2YS5leGUgaXMgYXZhaWxhYmxlIG9uIHN5c3RlbSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLiBbSkFWQUVYRV0KLSAgMS4yIEluc3RhbGwgQXBhY2hlIEFOVCBvbiB0aGUgc3lzdGVtIGFuZCBtYWtlIHN1cmUgdGhlIEFudCBiaW5hcmllcyBhcmUgYWNjZXNzaWJsZSBvbiB0aGUgY29tbWFuZCBsaW5lLgotICAxLjMgSW5zdGFsbCBJRVMgb3IgT3Blbi1Tb3VyY2UgRWNsaXBzZSBTRFAgaXMgb24gdGhlIHN5c3RlbSBhbmQgbm90ZSB0aGUgaW5zdGFsbCBsb2NhdGlvbiBvZiBFY2xpcHNlIFtFQ0xJUFNFSE9NRV0KLSAgMS40IE9idGFpbiB0aGUgcGx1Z2lucyBvcmcuZWNsaXBzZS5wZGUuYnVpbGQgYW5kIGhhdmUgdGhpcyBwbHVnaW4gaW4gdGhlIEVjbGlwc2UgU0RQIFtTQ1JJUFRTSE9NRV0KLSAgMS41IE9idGFpbiB0aGUgSEVBRExFU1MgYnVpbGQgc2NyaXB0cyBhbmQgcHV0IHRoZW0gaXQgYSBkaXJlY3RvcnkgYnkgdGhlbXNlbHZlcyBbQlVJTERIT01FXQotICAxLjYgU3RhcnQgRWNsaXBzZSBTRFAgYW5kIGRlZmluZSBhIHdvcmtzcGFjZSBsb2NhdGlvbiBbV09SS1NQQUNFXS4gIEFsbG93IHRoZSBJREUgdG8gc3RhcnQgZnVsbHkgYW5kIHRoZW4gZXhpdC4gIE9ubHkgdGhlIHdvcmtzcGFjZSBpcyBuZWVkZWQuCi0KLQotMi4gQ3VzdG9taXplIHRoZSBIZWFkbGVzcyBCdWlsZCBTY3JpcHRzCi0KLSAgMi4xIE1vZGlmeSBydW4uYmF0IGZpbGUgdG8gc3VpdCB5b3VyIGVudmlyb25tZW50LgotICAyLjIgTW9kaWZ5IGJ1aWxkLnByb3BlcnRpZXMgbWFraW5nIHN1cmUgdGhhdCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIGFkZHJlc3NlZC4KLSAgICAgICAgcHJvZHVjdD0KLSAgICAgICAgYnVpbGREaXJlY3Rvcnk9Ci0gICAgICAgIGJhc2U9Ci0gICAgICAgIGJhc2VMb2NhdGlvbj0KLSAgICAgICAgbWFwc1JlcG89Ci0gICAgICAgIG1hcHNSb290PQotICAgICAgICBmZXRjaFRhZz0KLSAgMi4zIE1vZGlmeSBhbGxFbGVtZW50cy54bWwKLQlQcm92aWRlIHRoZSBjb3JyZWN0IHRvcCBsZXZlbCBmZWF0dXJlIGJlaW5nIGJ1aWx0LgotCVByb3ZpZGUgdGhlIGNvcnJlY3QgZWxlbWVudFBhdGggcHJvcGVydHkgaW4gdGhlIGFsbEVsZW1lbnRzRGVsZWdhdG9yIHRhcmdldC4KLQotICAyLjQgTWFrZSBzdXJlIHRoZSBtYXAgZmlsZXMgaW4gb3JnLmVjbGlwc2UuZXBmLnJlbGVuZy9tYXBzIGFyZSBhY2N1cmF0ZQotCi0KZGlmZiAtLWdpdCBhLzEuNS9yZWxlbmcvYnVpbGQtc2NyaXB0cy9ydW4uYmF0IGIvMS41L3JlbGVuZy9idWlsZC1zY3JpcHRzL3J1bi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NTEzZjIuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9idWlsZC1zY3JpcHRzL3J1bi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi1AZWNobyBvZmYKLXNldGxvY2FsCi0KLVJFTSBUaGUgbG9jYXRpb24gd2hlcmUgdGhlIGhlYWRsZXNzIGJ1aWxkIHNjcmlwdHMgJiByZXNvdXJjZSBmaWxlcyBsaXZlLgotc2V0IEJVSUxESE9NRT0lfmRwMAotCi1SRU0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU0gKiAgICAgICAgICBDSEFOR0UgVEhFU0UgU0VUVElOR1MgICAgICAgICAqCi1SRU0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLVJFTSBUaGUgSlJFIGphdmEuZXhlIHRvIGJlIHVzZWQKLXNldCBKQVZBRVhFPUM6XGJpblxqZGtcc3VuXGJpblxqYXZhLmV4ZQotCi1SRU0gdGhlIEVjbGlwc2UgdG8gdXNlCi1zZXQgRUNMSVBTRUhPTUU9QzpcYmluXHNkcFwzLjIuMlxlY2xpcHNlCi0KLVJFTSBDVlMgbG9naW4gaW5mbyAtIHByb3ZpZGUgQ1ZTIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQKLVJFTSA6ZXh0c3NoOjx1c2VybmFtZT46PHBhc3N3b3JkPgotUkVNIHB1dCAiIiBhcm91bmQgdGhlIHZhbHVlIGlmIGl0IGNvbnRhaW5zIG5vbi1hbHBoYW51bWVyaWMgY2hhcnMKLXNldCBDVlNJTkZPPTpwc2VydmVyOmFub255bW91cwotCi1SRU0gVGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRhZy5jdXJyZW50LnByb3BlcnRpZXMKLVNFVCBCVUlMRFNUQVRFRElSPVM6XHByb2plY3RzXGVwZlwxLjIuMFxzdGF0ZQotCi1SRU0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU0gKiAgICAgRE8gTk9UIENIQU5HRSBUSEVTRSBTRVRUSU5HUyAgICAgICAqCi1SRU0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLVJFTSBUaGUgRWNsaXBzZSBzdGFydHVwLmphcgotc2V0IFNUQVJUVVBKQVI9IiVFQ0xJUFNFSE9NRSVcc3RhcnR1cC5qYXIiCi0KLVJFTSBUaGUgc2NyaXB0cyBkaXJlY3RvcnkgaW4gdGhlIG9yZy5lY2xpcHNlLnBkZS5idWlsZCBFY2xpcHNlIHBsdWdpbi4KLXNldCBTQ1JJUFRTSE9NRT0iJUVDTElQU0VIT01FJVxwbHVnaW5zXG9yZy5lY2xpcHNlLnBkZS5idWlsZF8zLjIuMS5yMzIxX3YyMDA2MDgyM1xzY3JpcHRzIgotCi1SRU0gVGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBoZWFkbGVzcyBidWlsZCBzY3JpcHRzICYgcmVzb3VyY2UgZmlsZXMgbGl2ZS4KLVJFTSBzZXQgQlVJTERIT01FPUM6XGJ1aWxkc1xlcGZfMTEwXGhlYWRsZXNzCi1zZXQgQlVJTERIT01FPSV+ZHAwCi0KLVJFTSBUaGUgbG9jYXRpb24gb2YgdGhlIHRlbXBvcmFyeSBidWlsZCB3b3Jrc3BhY2UKLXNldCBXT1JLU1BBQ0U9JUJVSUxESE9NRSVcd29ya3NwYWNlCi0KLVJFTSBUaGUgYnVpbGRmaWxlIHRvIHVzZSBmb3IgdGhlIGJ1aWxkCi1zZXQgQlVJTERGSUxFPWJ1aWxkLnhtbAotCi1SRU0gVGhlIGJ1aWxkZXIgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYnVpbGQucHJvcGVydGllcwotUkVNIGJ1aWxkLnByb3BlcnRpZXMsIGFsbEVsZW1lbnRzLnhtbCBhbmQgY3VzdG9tVGFyZ2V0cy54bWwgbmVlZHMgdG8gYmUgaW4gdGhlIHNhbWUgcGxhY2UKLXNldCBCVUlMREVSRElSPSVCVUlMREhPTUUlCi0KLXNldCBIT1VSPSV0aW1lOn4wLDIlCi1pZiAiJUhPVVI6fjAsMSUiPT0iICIgc2V0IEhPVVI9MCV0aW1lOn4xLDElCi1zZXQgQlVJTERJRD0lZGF0ZTp+LTQlJWRhdGU6fjQsMiUlZGF0ZTp+NywyJS0lSE9VUiUldGltZTp+MywyJQotCi1SRU0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0KLWlmIG5vdCBleGlzdCAlSkFWQUVYRSUgZWNobyBFUlJPUjogaW5jb3JyZWN0IGphdmEuZXhlPSVKQVZBRVhFJSwgZWRpdCB0aGlzIGZpbGUgYW5kIGNvcnJlY3QgdGhlIEpBVkFFWEUgZW52YXIKLWlmIG5vdCBleGlzdCAlSkFWQUVYRSUgZ290byBkb25lCi0KLWlmIG5vdCBleGlzdCAlU1RBUlRVUEpBUiUgZWNobyBFUlJPUjogaW5jb3JyZWN0IHN0YXJ0dXAuamFyPSVTVEFSVFVQSkFSJSwgZWRpdCB0aGlzIGZpbGUgYW5kIGNvcnJlY3QgdGhlIFNUQVJUVVBKQVIgZW52YXIKLWlmIG5vdCBleGlzdCAlU1RBUlRVUEpBUiUgZ290byBkb25lCi0KLWlmIG5vdCBleGlzdCAlQlVJTERFUkRJUiUgZWNobyBFUlJPUjogaW5jb3JyZWN0IGJ1aWxkZXJkaXI9JUJVSUxERVJESVIlLCBlZGl0IHRoaXMgZmlsZSBhbmQgY29ycmVjdCB0aGUgQlVJTERFUkRJUiBlbnZhcgotaWYgbm90IGV4aXN0ICVCVUlMREVSRElSJSBnb3RvIGRvbmUKLQotaWYgbm90IGV4aXN0ICVCVUlMRFNUQVRFRElSJSBlY2hvIEVSUk9SOiBpbmNvcnJlY3QgYnVpbGRTdGF0ZURpcj0lQlVJTERTVEFURURJUiUsIGVkaXQgdGhpcyBmaWxlIGFuZCBjb3JyZWN0IHRoZSBCVUlMRFNUQVRFRElSIGVudmFyCi1pZiBub3QgZXhpc3QgJUJVSUxEU1RBVEVESVIlIGdvdG8gZG9uZQotCi0KLTpydW4KLQotcHVzaGQgJVNDUklQVFNIT01FJQotCi1pZiBub3QgZXhpc3QgJUJVSUxERklMRSUgZWNobyBFUlJPUjogaW5jb3JyZWN0IGJ1aWxkZmlsZT0lQlVJTERGSUxFJSwgZWRpdCB0aGlzIGZpbGUgYW5kIGNvcnJlY3QgdGhlIEJVSUxERklMRSBlbnZhcgotaWYgbm90IGV4aXN0ICVCVUlMREZJTEUlIGdvdG8gZG9uZQotCi1AZWNobyBvbgotCi1yZCAvcyAvcSAlV09SS1NQQUNFJQotCi0lSkFWQUVYRSUgLWNwICVTVEFSVFVQSkFSJSBvcmcuZWNsaXBzZS5jb3JlLmxhdW5jaGVyLk1haW4gLW5vdXBkYXRlIC1hcHBsaWNhdGlvbiBvcmcuZWNsaXBzZS5hbnQuY29yZS5hbnRSdW5uZXIgLWRhdGEgJVdPUktTUEFDRSUgLWJ1aWxkZmlsZSAlQlVJTERGSUxFJSAtRGJ1aWxkZXI9JUJVSUxERVJESVIlIC1EYnVpbGRJZD0lQlVJTERJRCUgLURidWlsZFN0YXRlRGlyPSVCVUlMRFNUQVRFRElSJSAtRGN2c0luZm89JUNWU0lORk8lIC1EYmFzZUxvY2F0aW9uPSVFQ0xJUFNFSE9NRSUgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkKLQotQGVjaG8gb2ZmCi1wb3BkCi0KLTpkb25lCi1SRU0gcGF1c2UKZGlmZiAtLWdpdCBhLzEuNS9yZWxlbmcvYnVpbGQtc2NyaXB0cy90ZW1wbGF0ZXMvYWxsRWxlbWVudHMueG1sIGIvMS41L3JlbGVuZy9idWlsZC1zY3JpcHRzL3RlbXBsYXRlcy9hbGxFbGVtZW50cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZWVjODQuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9idWlsZC1zY3JpcHRzL3RlbXBsYXRlcy9hbGxFbGVtZW50cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJhbGxFbGVtZW50cyBEZWxlZ2F0b3IiPgotCQotIAk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAJPCEtLSBSdW4gYSBnaXZlbiAke3RhcmdldH0gb24gYWxsIGVsZW1lbnRzIGJlaW5nIGJ1aWx0ICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gCTwhLS0gUmVwbGFjZSBlbGVtZW50LmlkIHdpdGggdGhlIGlkIG9mIHRoZSB0b3AgbGV2ZWwgZWxlbWVudCBiZWluZyBidWlsdC4gICAgLS0+Ci0JPCEtLSBJZiBlbGVtZW50LmlkIGRvZXMgbm90IGV4aXN0IGluICR7YnVpbGREaXJlY3Rvcnl9L2ZlYXR1cmVzL2VsZW1lbnQuaWQgICAtLT4KLQk8IS0tIG9yICR7YmFzZUxvY2F0aW9ufS9mZWF0dXJlcy9lbGVtZW50LmlkLCB0aGVuIHlvdSBtdXN0IHByb3ZpZGUgdGhlICAgICAgIC0tPgotCTwhLS0gbG9jYXRpb24gYnkgc2V0dGluZyB0aGUgcHJvcGVydHkgInBsdWdpblBhdGgiICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gCTwhLS0gQWRkIG9uIDxhbnQ+IHRhc2sgZm9yIGVhY2ggdG9wIGxldmVsIGVsZW1lbnQgYmVpbmcgYnVpbHQuICAgICAgICAgICAgIC0tPgotIAk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAJPHRhcmdldCBuYW1lPSJhbGxFbGVtZW50c0RlbGVnYXRvciI+Ci0gCQk8YW50IGFudGZpbGU9IiR7Z2VuZXJpY1RhcmdldHN9IiB0YXJnZXQ9IiR7dGFyZ2V0fSI+Ci0JIAkJPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJmZWF0dXJlIiAvPgotCSAJCTxwcm9wZXJ0eSBuYW1lPSJpZCIgdmFsdWU9ImVsZW1lbnQuaWQiIC8+Ci0gCQk8L2FudD4KLSAJPC90YXJnZXQ+Ci0gCi0gCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotIAk8IS0tIFRhcmdldHMgdG8gYXNzZW1ibGUgdGhlIGJ1aWx0IGVsZW1lbnRzIGZvciBwYXJ0aWN1bGFyIGNvbmZpZ3VyYXRpb25zICAtLT4KLSAJPCEtLSBUaGVzZSBnZW5lcmFsbHkgY2FsbCB0aGUgZ2VuZXJhdGVkIGFzc2VtYmxlIHNjcmlwdHMgKG5hbWVkIGluICAgICAgICAgLS0+Ci0gCTwhLS0gJHthc3NlbWJsZVNjcmlwdE5hbWV9KSBidXQgbWF5IGFsc28gYWRkIHByZSBhbmQgcG9zdCBwcm9jZXNzaW5nICAgICAgIC0tPgotIAk8IS0tIEFkZCBvbmUgdGFyZ2V0IGZvciBlYWNoIHJvb3QgZWxlbWVudCBhbmQgZWFjaCBjb25maWd1cmF0aW9uICAgICAgICAgICAtLT4KLSAJPCEtLSBSZXBsYWNlIGVsZW1lbnQuaWQgd2l0aCB0aGUgaWQgb2YgdGhlIHRvcCBsZXZlbCBlbGVtZW50IGJlaW5nIGJ1aWx0ICAgLS0+Ci0gCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotIAk8dGFyZ2V0IG5hbWU9ImFzc2VtYmxlLmVsZW1lbnQuaWRbLmNvbmZpZy5zcGVjXSI+Ci0gCQk8YW50IGFudGZpbGU9IiR7YXNzZW1ibGVTY3JpcHROYW1lfSIgZGlyPSIke2J1aWxkRGlyZWN0b3J5fSIvPgotIAk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzEuNS9yZWxlbmcvYnVpbGQtc2NyaXB0cy90ZW1wbGF0ZXMvYnVpbGQucHJvcGVydGllcyBiLzEuNS9yZWxlbmcvYnVpbGQtc2NyaXB0cy90ZW1wbGF0ZXMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI1OTU4NS4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvdGVtcGxhdGVzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQYXJhbWV0ZXJzIGRlc2NyaWJpbmcgaG93IGFuZCB3aGVyZSB0byBleGVjdXRlIHRoZSBidWlsZC4KLSMgVHlwaWNhbCB1c2VycyBuZWVkIG9ubHkgdXBkYXRlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKLSMgICAgYmFzZUxvY2F0aW9uIC0gd2hlcmUgdGhpbmdzIHlvdSBhcmUgYnVpbGRpbmcgYWdhaW5zdCBhcmUgaW5zdGFsbGVkCi0jICAgIGJvb3RjbGFzc3BhdGggLSBUaGUgYmFzZSBqYXJzIHRvIGNvbXBpbGUgYWdhaW5zdCAodHlwaWNhbHkgcnQuamFyKQotIyAgICBjb25maWdzIC0gdGhlIGxpc3Qgb2Yge29zLCB3cywgYXJjaH0gY29uZmlndXJhdGlvbnMgdG8gYnVpbGQuICAKLSMKLSMgT2YgY291cnNlIGFueSBvZiB0aGUgc2V0dGluZ3MgaGVyZSBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzcGVjJ2luZyAKLSMgdGhlbSBvbiB0aGUgY29tbWFuZCBsaW5lIChlLmcuLCAtRGJhc2VMb2NhdGlvbj1kOi9lY2xpcHNlCi0KLSMjIyMjIyMjIyMjIyMgUFJPRFVDVC9QQUNLQUdJTkcgQ09OVFJPTCAjIyMjIyMjIyMjIyMjCi1wcm9kdWN0PS9wbHVnaW4gb3IgZmVhdHVyZSBpZC9wYXRoL3RvLy5wcm9kdWN0Ci1ydW5QYWNrYWdlcj10cnVlCi0KLSNTZXQgdGhlIG5hbWUgb2YgdGhlIGFyY2hpdmUgdGhhdCB3aWxsIHJlc3VsdCBmcm9tIHRoZSBwcm9kdWN0IGJ1aWxkLgotI2FyY2hpdmVOYW1lUHJlZml4PQotCi0jIFRoZSBwcmVmaXggdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGdlbmVyYXRlZCBhcmNoaXZlLgotYXJjaGl2ZVByZWZpeD08b3V0cHV0IGFyY2hpdmUgcm9vdD4KLQotIyBUaGUgbG9jYXRpb24gdW5kZXJ3aGljaCBhbGwgb2YgdGhlIGJ1aWxkIG91dHB1dCB3aWxsIGJlIGNvbGxlY3RlZC4KLWNvbGxlY3RpbmdGb2xkZXI9JHthcmNoaXZlUHJlZml4fQotCi0jIFRoZSBsaXN0IG9mIHtvcywgd3MsIGFyY2h9IGNvbmZpZ3VyYXRpb25zIHRvIGJ1aWxkLiAgVGhpcyAKLSMgdmFsdWUgaXMgYSAnJicgc2VwYXJhdGVkIGxpc3Qgb2YgJywnIHNlcGFyYXRlIHRyaXBsZXMuICBGb3IgZXhhbXBsZSwgCi0jICAgICBjb25maWdzPXdpbjMyLHdpbjMyLHg4NiAmIGxpbnV4LG1vdGlmLHg4NgotIyBCeSBkZWZhdWx0IHRoZSB2YWx1ZSBpcyAqLCosKgotI2NvbmZpZ3M9d2luMzIsIHdpbjMyLCB4ODYgJiBcCi0jCWxpbnV4LCBndGssIHBwYyAmXAotIyBsaW51eCwgZ3RrLCB4ODYgJiBcCi0jCWxpbnV4LCBndGssIHg4Nl82NCAmIFwKLSMJbGludXgsIG1vdGlmLCB4ODYgJiBcCi0jCXNvbGFyaXMsIG1vdGlmLCBzcGFyYyAmIFwKLSMJc29sYXJpcywgZ3RrLCBzcGFyYyAmIFwKLSMJYWl4LCBtb3RpZiwgcHBjICYgXAotIwlocHV4LCBtb3RpZiwgUEFfUklTQyAmIFwKLSMJbWFjb3N4LCBjYXJib24sIHBwYwotCi0jIEJ5IGRlZmF1bHQgUERFIGNyZWF0ZXMgb25lIGFyY2hpdmUgKHJlc3VsdCkgcGVyIGVudHJ5IGxpc3RlZCBpbiB0aGUgY29uZmlncyBwcm9wZXJ0eS4KLSMgU2V0dGluZyB0aGlzIHZhbHVlIHRvIHRyeSB3aWxsIGNhdXNlIFBERSB0byBvbmx5IGNyZWF0ZSBvbmUgb3V0cHV0IGNvbnRhaW5pbmcgYWxsIAotIyBhcnRpZmFjdHMgZm9yIGFsbCB0aGUgcGxhdGZvcm1zIGxpc3RlZCBpbiB0aGUgY29uZmlncyBwcm9wZXJ0eS4KLSNncm91cENvbmZpZ3VyYXRpb25zPXRydWUKLQotI1RoZSBmb3JtYXQgb2YgdGhlIGFyY2hpdmUuIEJ5IGRlZmF1bHQgYSB6aXAgaXMgY3JlYXRlZCB1c2luZyBhbnRaaXAuCi0jVGhlIGxpc3QgY2FuIG9ubHkgY29udGFpbiB0aGUgY29uZmlndXJhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2lyZWQgZm9ybWF0IGlzIGRpZmZlcmVudCB0aGFuIHppcC4KLSNhcmNoaXZlc0Zvcm1hdD13aW4zMiwgd2luMzIsIHg4NiAtIGFudFppcCYgXAotIwlsaW51eCwgZ3RrLCBwcGMgLSBhbnRaaXAgJlwKLSMgICAgbGludXgsIGd0aywgeDg2IC0gYW50WmlwJiBcCi0jCWxpbnV4LCBndGssIHg4Nl82NCAtIGFudFppcCYgXAotIyBsaW51eCwgbW90aWYsIHg4NiAtIGFudFppcCYgXAotIwlzb2xhcmlzLCBtb3RpZiwgc3BhcmMgLSBhbnRaaXAmIFwKLSMJc29sYXJpcywgZ3RrLCBzcGFyYyAtIGFudFppcCYgXAotIwlhaXgsIG1vdGlmLCBwcGMgLSBhbnRaaXAmIFwKLSMJaHB1eCwgbW90aWYsIFBBX1JJU0MgLSBhbnRaaXAmIFwKLSMJbWFjb3N4LCBjYXJib24sIHBwYyAtIGFudFppcAotCQotI1NldCB0byB0cnVlIGlmIHlvdSB3YW50IHRoZSBvdXRwdXQgdG8gYmUgcmVhZHkgZm9yIGFuIHVwZGF0ZSBqYXIgKG5vIHNpdGUueG1sIGdlbmVyYXRlZCkKLSNvdXRwdXRVcGRhdGVKYXJzID0gZmFsc2UKLQotI1NldCB0byB0cnVlIGZvciBKbmxwIGdlbmVyYXRpb24KLSNjb2RlYmFzZSBzaG91bGQgYmUgYSBVUkwgdGhhdCB3aWxsIGJlIHVzZWQgYXMgdGhlIHJvb3Qgb2YgYWxsIHJlbGF0aXZlIFVSTHMgaW4gdGhlIG91dHB1dC4KLSNnZW5lcmF0ZUpubHA9ZmFsc2UKLSNqbmxwLmNvZGViYXNlPTxjb2RlYmFzZSB1cmw+Ci0jam5scC5qMnNlPTxqMnNlIHZlcnNpb24+Ci0jam5scC5sb2NhbGU9PGEgbG9jYWxlPgotCi0jU2V0IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gc2lnbiBqYXJzCi0jc2lnbkphcnM9ZmFsc2UKLSNzaWduLmFsaWFzPTxhbGlhcz4KLSNzaWduLmtleXN0b3JlPTxrZXlzdG9yZSBsb2NhdGlvbj4KLSNzaWduLnN0b3JlcGFzcz08a2V5c3RvcmUgcGFzc3dvcmQ+Ci0KLSNBcmd1bWVudHMgdG8gc2VuZCB0byB0aGUgemlwIGV4ZWN1dGFibGUKLXppcGFyZ3M9Ci0KLSNBcmd1bWVudHMgdG8gc2VuZCB0byB0aGUgdGFyIGV4ZWN1dGFibGUKLXRhcmFyZ3M9Ci0KLSNDb250cm9sIHRoZSBjcmVhdGlvbiBvZiBhIGZpbGUgY29udGFpbmluZyB0aGUgdmVyc2lvbiBpbmNsdWRlZCBpbiBlYWNoIGNvbmZpZ3VyYXRpb24gLSBvbiBieSBkZWZhdWx0IAotI2dlbmVyYXRlVmVyc2lvbnNMaXN0cz1mYWxzZQotCi0jIyMjIyMjIyMjIyMjIyBCVUlMRCBOQU1JTkcgQ09OVFJPTCAjIyMjIyMjIyMjIyMjIyMjCi0jIFRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgYnVpbGQgZWxlbWVudHMgYXJlIGZldGNoZWQgYW5kIHdoZXJlCi0jIHRoZSBidWlsZCB0YWtlcyBwbGFjZS4KLWJ1aWxkRGlyZWN0b3J5PSR7dXNlci5ob21lfS9lY2xpcHNlLmJ1aWxkCi0KLSMgVHlwZSBvZiBidWlsZC4gIFVzZWQgaW4gbmFtaW5nIHRoZSBidWlsZCBvdXRwdXQuICBUeXBpY2FsbHkgdGhpcyB2YWx1ZSBpcwotIyBvbmUgb2YgSSwgTiwgTSwgUywgLi4uCi1idWlsZFR5cGU9SQotCi0jIElEIG9mIHRoZSBidWlsZC4gIFVzZWQgaW4gbmFtaW5nIHRoZSBidWlsZCBvdXRwdXQuCi1idWlsZElkPVRlc3RCdWlsZAotCi0jIExhYmVsIGZvciB0aGUgYnVpbGQuICBVc2VkIGluIG5hbWluZyB0aGUgYnVpbGQgb3V0cHV0Ci1idWlsZExhYmVsPSR7YnVpbGRUeXBlfS4ke2J1aWxkSWR9Ci0KLSMgVGltZXN0YW1wIGZvciB0aGUgYnVpbGQuICBVc2VkIGluIG5hbWluZyB0aGUgYnVpbGQgb3V0cHV0Ci10aW1lc3RhbXA9MDA3Ci0KLSNUaGUgdmFsdWUgdG8gYmUgdXNlZCBmb3IgdGhlIHF1YWxpZmllciBvZiBhIHBsdWdpbiBvciBmZWF0dXJlIHdoZW4geW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIHZhbHVlIGNvbXB1dGVkIGJ5IHBkZS4KLSNUaGUgdmFsdWUgd2lsbCBvbmx5IGJlIGFwcGxpZWQgdG8gcGx1Z2luIG9yIGZlYXR1cmVzIGluZGljYXRpbmcgYnVpbGQucHJvcGVydGllcywgcXVhbGlmaWVyID0gY29udGV4dCAKLSNmb3JjZUNvbnRleHRRdWFsaWZpZXI9PHRoZSB2YWx1ZSBmb3IgdGhlIHF1YWxpZmllcj4KLQotI0VuYWJsZSAvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgYSBzdWZmaXggZm9yIHRoZSBmZWF0dXJlcyB0aGF0IHVzZSAucXVhbGlmaWVyLiAKLSNUaGUgZ2VuZXJhdGVkIHN1ZmZpeCBpcyBjb21wdXRlZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGZlYXR1cmUgICAKLSNnZW5lcmF0ZUZlYXR1cmVWZXJzaW9uU3VmZml4PXRydWUKLQotIyMjIyMjIyMjIyMjIyBCQVNFIENPTlRST0wgIyMjIyMjIyMjIyMjIwotIyBTZXR0aW5ncyBmb3IgdGhlIGJhc2UgRWNsaXBzZSBjb21wb25lbnRzIGFuZCBKYXZhIGNsYXNzIGxpYnJhcmllcyAKLSMgYWdhaW5zdCB3aGljaCB5b3UgYXJlIGJ1aWxkaW5nLgotIyBCYXNlIGxvY2F0aW9uIGZvciBhbnl0aGluZyB0aGUgYnVpbGQgbmVlZHMgdG8gY29tcGlsZSBhZ2FpbnN0LiAgRm9yIGV4YW1wbGUsCi0jIGluIG1vc3QgUkNQIGFwcCBvciBhIHBsdWctaW4sICB0aGUgYmFzZUxvY2F0aW9uIHNob3VsZCBiZSB0aGUgbG9jYXRpb24gb2YgYSBwcmV2aW91c2x5Ci0jIGluc3RhbGxlZCBFY2xpcHNlIGFnYWluc3Qgd2hpY2ggdGhlIGFwcGxpY2F0aW9uIG9yIHBsdWctaW4gY29kZSB3aWxsIGJlIGNvbXBpbGVkIGFuZCB0aGUgUkNQIGRlbHRhIHBhY2suCi0KLWJhc2U9PHBhdGgvdG8vcGFyZW50L29mL2VjbGlwc2U+Ci1iYXNlTG9jYXRpb249JHtiYXNlfS9lY2xpcHNlCi0jT3MvV3MvQXJjaC9ubCBvZiB0aGUgZWNsaXBzZSBzcGVjaWZpZWQgYnkgYmFzZUxvY2F0aW9uCi1iYXNlb3M9d2luMzIKLWJhc2V3cz13aW4zMgotYmFzZWFyY2g9eDg2Ci0KLSNwbHVnaW5QYXRoIGlzIGEgbGlzdCBvZiBsb2NhdGlvbnMgaW4gd2hpY2ggdG8gZmluZCBwbHVnaW5zIGFuZCBmZWF0dXJlcy4gIFRoaXMgbGlzdCBpcyBzZXBhcmF0ZWQgYnkgdGhlIHBsYXRmb3JtIGZpbGUgc2VwYXJhdG9yICg7IG9yIDopCi0jYSBsb2NhdGlvbiBpcyBvbmUgb2Y6ICAKLSMtIHRoZSBsb2NhdGlvbiBvZiB0aGUgamFyIG9yIGZvbGRlciB0aGF0IGlzIHRoZSBwbHVnaW4gb3IgZmVhdHVyZSA6IC9wYXRoL3RvL2Zvby5qYXIgb3IgL3BhdGgvdG8vZm9vCi0jLSBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGEgL3BsdWdpbnMgb3IgL2ZlYXR1cmVzIHN1YmRpcmVjdG9yeQotIy0gdGhlIGxvY2F0aW9uIG9mIGEgZmVhdHVyZS54bWwsIG9yIGZvciAyLjEgc3R5bGUgcGx1Z2lucywgdGhlIHBsdWdpbi54bWwgb3IgZnJhZ21lbnQueG1sCi0jcGx1Z2luUGF0aD0KLQotc2tpcEJhc2U9dHJ1ZQotZWNsaXBzZVVSTD08dXJsIGZvciBlY2xpcHNlIGRvd25sb2FkIHNpdGU+Ci1lY2xpcHNlQnVpbGRJZD08SWQgb2YgRWNsaXBzZSBidWlsZCB0byBnZXQ+Ci1lY2xpcHNlQmFzZVVSTD0ke2VjbGlwc2VVUkx9L2VjbGlwc2UtcGxhdGZvcm0tJHtlY2xpcHNlQnVpbGRJZH0td2luMzIuemlwCi0KLQotIyMjIyMjIyMjIyMjIyBNQVAgRklMRSBDT05UUk9MICMjIyMjIyMjIyMjIyMjIyMKLSMgVGhpcyBzZWN0aW9uIGRlZmluZXMgQ1ZTIHRhZ3MgdG8gdXNlIHdoZW4gZmV0Y2hpbmcgdGhlIG1hcCBmaWxlcyBmcm9tIHRoZSByZXBvc2l0b3J5LgotIyBJZiB5b3Ugd2FudCB0byBmZXRjaCB0aGUgbWFwIGZpbGUgZnJvbSByZXBvc2l0b3J5IC8gbG9jYXRpb24sIGNoYW5nZSB0aGUgZ2V0TWFwRmlsZXMgdGFyZ2V0IGluIHRoZSBjdXN0b21UYXJnZXRzLnhtbAotCi1za2lwTWFwcz10cnVlCi1tYXBzUmVwbz06cHNlcnZlcjphbm9ueW1vdXNAZXhhbXBsZS5jb20vcGF0aC90by9yZXBvCi1tYXBzUm9vdD1wYXRoL3RvL21hcHMKLW1hcHNDaGVja291dFRhZz1IRUFECi0KLSN0YWdNYXBzPXRydWUKLW1hcHNUYWdUYWc9diR7YnVpbGRJZH0KLQotCi0jIyMjIyMjIyMjIyMgUkVQT1NJVE9SWSBDT05UUk9MICMjIyMjIyMjIyMjIyMjIwotIyBUaGlzIHNlY3Rpb24gZGVmaW5lcyBwcm9wZXJ0aWVzIHBhcmFtZXRlcml6aW5nIHRoZSByZXBvc2l0b3JpZXMgd2hlcmUgcGx1Z2lucywgZnJhZ21lbnRzCi0jIGJ1bmRsZXMgYW5kIGZlYXR1cmVzIGFyZSBiZWluZyBvYnRhaW5lZCBmcm9tLiAKLQotIyBUaGUgdGFncyB0byB1c2Ugd2hlbiBmZXRjaGluZyBlbGVtZW50cyB0byBidWlsZC4KLSMgQnkgZGVmYXVsdCB0aGVidWlsZGVyIHdpbGwgdXNlIHdoYXRldmVyIGlzIGluIHRoZSBtYXBzLiAgCi0jIFRoaXMgdmFsdWUgdGFrZXMgdGhlIGZvcm0gb2YgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiByZXBvc2l0b3J5IGlkZW50aWZpZXIgKGxpa2UgdXNlZCBpbiB0aGUgbWFwIGZpbGVzKSBhbmQgdGhlIAotIyBvdmVycmlkaW5nIHZhbHVlCi0jIEZvciBleGFtcGxlIGZldGNoVGFnPUNWUz1IRUFELCBTVk49djIwMDUwMTAxCi0jIGZldGNoVGFnPUhFQUQKLXNraXBGZXRjaD10cnVlCi0KLQotIyMjIyMjIyMjIyMjIyBKQVZBIENPTVBJTEVSIE9QVElPTlMgIyMjIyMjIyMjIyMjIyMKLSMgVGhlIGxvY2F0aW9uIG9mIHRoZSBKYXZhIGphcnMgdG8gY29tcGlsZSBhZ2FpbnN0LiAgVHlwaWNhbGx5IHRoZSBydC5qYXIgZm9yIHlvdXIgSkRLL0pSRQotI2Jvb3RjbGFzc3BhdGg9JHtqYXZhLmhvbWV9L2xpYi9ydC5qYXIKLQotIyBzcGVjaWZpYyBKUkUgbG9jYXRpb25zIHRvIGNvbXBpbGUgYWdhaW5zdC4gVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHRvIGNvbXBpbGUgYnVuZGxlcyBzcGVjaWZ5aW5nIGEgCi0jIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50LiBVbmNvbW1lbnQgYW5kIHNldCB2YWx1ZXMgZm9yIGVudmlyb25tZW50cyB0aGF0IHlvdSBzdXBwb3J0Ci0jQ0RDLTEuMC9Gb3VuZGF0aW9uLTEuMD0gL3BhdGgvdG8vcnQuamFyCi0jQ0RDLTEuMS9Gb3VuZGF0aW9uLTEuMT0KLSNPU0dpL01pbmltdW0tMS4wPQotI09TR2kvTWluaW11bS0xLjE9Ci0jSlJFLTEuMT0KLSNKMlNFLTEuMj0KLSNKMlNFLTEuMz0KLSNKMlNFLTEuND0KLSNKMlNFLTEuNT0KLSNKYXZhU0UtMS42PQotI1BlcnNvbmFsSmF2YS0xLjE9Ci0jUGVyc29uYWxKYXZhLTEuMj0KLSNDREMtMS4wL1BlcnNvbmFsQmFzaXMtMS4wPQotI0NEQy0xLjAvUGVyc29uYWxKYXZhLTEuMD0KLSNDREMtMS4xL1BlcnNvbmFsQmFzaXMtMS4xPQotI0NEQy0xLjEvUGVyc29uYWxKYXZhLTEuMT0KLQotIyBTcGVjaWZ5IHRoZSBvdXRwdXQgZm9ybWF0IG9mIHRoZSBjb21waWxlciBsb2cgd2hlbiBlY2xpcHNlIGpkdCBpcyB1c2VkCi1sb2dFeHRlbnNpb249LmxvZwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgZGVidWcgaW5mbyBpbiB0aGUgb3V0cHV0IGphcnMKLWphdmFjRGVidWdJbmZvPWZhbHNlIAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGZhaWwgdGhlIGJ1aWxkIGlmIHRoZXJlIGFyZSBjb21waWxlciBlcnJvcnMKLWphdmFjRmFpbE9uRXJyb3I9dHJ1ZQotCi0jIEVuYWJsZSBvciBkaXNhYmxlIHZlcmJvc2UgbW9kZSBvZiB0aGUgY29tcGlsZXIKLWphdmFjVmVyYm9zZT10cnVlCi0KLSMgRXh0cmEgYXJndW1lbnRzIGZvciB0aGUgY29tcGlsZXIuIFRoZXNlIGFyZSBzcGVjaWZpYyB0byB0aGUgamF2YSBjb21waWxlciBiZWluZyB1c2VkLgotI2NvbXBpbGVyQXJnPQotCi0jIERlZmF1bHQgdmFsdWUgZm9yIHRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgY29kZS4gVGhpcyB2YWx1ZSBpcyB1c2VkIHdoZW4gY29tcGlsaW5nIHBsdWctaW5zIHRoYXQgZG8gbm90IHNldCB0aGUgQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQgb3Igc2V0IGphdmFjU291cmNlIGluIGJ1aWxkLnByb3BlcnRpZXMKLSNqYXZhY1NvdXJjZT0xLjMKLQotIyBEZWZhdWx0IHZhbHVlIGZvciB0aGUgdmVyc2lvbiBvZiB0aGUgYnl0ZSBjb2RlIHRhcmdldGVkLiBUaGlzIHZhbHVlIGlzIHVzZWQgd2hlbiBjb21waWxpbmcgcGx1Zy1pbnMgdGhhdCBkbyBub3Qgc2V0IHRoZSBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudCBvciBzZXQgamF2YWNUYXJnZXQgaW4gYnVpbGQucHJvcGVydGllcy4KLSNqYXZhY1RhcmdldD0xLjEKLQotCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvdGVtcGxhdGVzL2N1c3RvbVRhcmdldHMueG1sIGIvMS41L3JlbGVuZy9idWlsZC1zY3JpcHRzL3RlbXBsYXRlcy9jdXN0b21UYXJnZXRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE3MjU2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvdGVtcGxhdGVzL2N1c3RvbVRhcmdldHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IkJ1aWxkIHNwZWNpZmljIHRhcmdldHMgYW5kIHByb3BlcnRpZXMiIGRlZmF1bHQ9Im5vRGVmYXVsdCI+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFJ1biBhIGdpdmVuICR7dGFyZ2V0fSBvbiBhbGwgZWxlbWVudHMgYmVpbmcgYnVpbHQgLS0+Ci0JPCEtLSBBZGQgb24gPGFudD4gdGFzayBmb3IgZWFjaCB0b3AgbGV2ZWwgZWxlbWVudCBiZWluZyBidWlsdC4gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHByb3BlcnR5IG5hbWU9ImFsbEVsZW1lbnRzRmlsZSIgdmFsdWU9IiR7YnVpbGRlcn0vYWxsRWxlbWVudHMueG1sIi8+Ci0JPGltcG9ydCBmaWxlPSIke2FsbEVsZW1lbnRzRmlsZX0iLz4KLQk8dGFyZ2V0IG5hbWU9ImFsbEVsZW1lbnRzIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJhbGxFbGVtZW50c0RlbGVnYXRvciIvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0iZ2V0QmFzZUNvbXBvbmVudHMiIGRlcGVuZHM9ImNoZWNrTG9jYWxCYXNlIiB1bmxlc3M9InNraXBCYXNlIj4KLQkJPGdldCBzcmM9IiR7ZWNsaXBzZUJhc2VVUkx9IiBkZXN0PSIke2J1aWxkRGlyZWN0b3J5fS8uLi90ZW1wLWJhc2UuemlwIi8+Ci0JCTx1bnppcCBkZXN0PSIke2Jhc2V9IiBvdmVyd3JpdGU9InRydWUiIHNyYz0iJHtidWlsZERpcmVjdG9yeX0vLi4vdGVtcC1iYXNlLnppcCIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjaGVja0xvY2FsQmFzZSI+Ci0JCTxhdmFpbGFibGUgZmlsZT0iJHtiYXNlfSIgcHJvcGVydHk9InNraXBCYXNlIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIENoZWNrIG91dCBtYXAgZmlsZXMgZnJvbSBjb3JyZWN0IHJlcG9zaXRvcnkgLS0+Ci0JPCEtLSBSZXBsYWNlIHZhbHVlcyBmb3IgbWFwc0NoZWNrb3V0VGFnIGFzIGRlc2lyZWQuIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0iZ2V0TWFwRmlsZXMiIGRlcGVuZHM9ImNoZWNrTG9jYWxNYXBzIiB1bmxlc3M9InNraXBNYXBzIj4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcHNDaGVja291dFRhZyIgdmFsdWU9IkhFQUQiLz4KLQkJPGN2cyBjdnNSb290PSIke21hcHNSZXBvfSIgcGFja2FnZT0iJHttYXBzUm9vdH0iIGRlc3Q9IiR7YnVpbGREaXJlY3Rvcnl9L21hcHMiIHRhZz0iJHttYXBzQ2hlY2tvdXRUYWd9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNoZWNrTG9jYWxNYXBzIj4KLQkJPGF2YWlsYWJsZSBwcm9wZXJ0eT0ic2tpcE1hcHMiIGZpbGU9IiR7YnVpbGREaXJlY3Rvcnl9L21hcHMiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0idGFnTWFwRmlsZXMiIGlmPSJ0YWdNYXBzIj4KLQkJPGN2cyBkZXN0PSIke2J1aWxkRGlyZWN0b3J5fS9tYXBzLyR7bWFwc1Jvb3R9IiBjb21tYW5kPSJ0YWcgJHttYXBzVGFnVGFnfSIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNsZWFuIiB1bmxlc3M9Im5vY2xlYW4iPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImFsbEVsZW1lbnRzIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YXJnZXQiIHZhbHVlPSJjbGVhbkVsZW1lbnQiLz4KLQkJPC9hbnRjYWxsPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJnYXRoZXJMb2dzIj4KLQkJPG1rZGlyIGRpcj0iJHtidWlsZERpcmVjdG9yeX0vJHtidWlsZExhYmVsfS9jb21waWxlbG9ncyIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImFsbEVsZW1lbnRzIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YXJnZXQiIHZhbHVlPSJnYXRoZXJMb2dzIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPHVuemlwIGRlc3Q9IiR7YnVpbGREaXJlY3Rvcnl9LyR7YnVpbGRMYWJlbH0vY29tcGlsZWxvZ3MiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9L2ZlYXR1cmVzIj4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLmxvZy56aXAiLz4KLQkJCTwvZmlsZXNldD4KLQkJPC91bnppcD4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHNldHVwIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlU2V0dXAiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciBzZXR1cCBidXQgYmVmb3JlIHN0YXJ0aW5nIHRoZSBidWlsZCBwcm9wZXIgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0U2V0dXAiPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImdldEJhc2VDb21wb25lbnRzIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSBmZXRjaGluZyB0aGUgYnVpbGQgZWxlbWVudHMgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmVGZXRjaCI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIGZldGNoaW5nIHRoZSBidWlsZCBlbGVtZW50cyAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3RGZXRjaCI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSBnZW5lcmF0aW5nIHRoZSBidWlsZCBzY3JpcHRzLiAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZUdlbmVyYXRlIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgZ2VuZXJhdGluZyB0aGUgYnVpbGQgc2NyaXB0cy4gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0R2VuZXJhdGUiPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImNsZWFuIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSBydW5uaW5nIHRoZSBidWlsZC54bWxzIGZvciB0aGUgZWxlbWVudHMgYmVpbmcgYnVpbHQuIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlUHJvY2VzcyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHJ1bm5pbmcgdGhlIGJ1aWxkLnhtbHMgZm9yIHRoZSBlbGVtZW50cyBiZWluZyBidWlsdC4gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0UHJvY2VzcyI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSBydW5uaW5nIGFzc2VtYmxlLiAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZUFzc2VtYmxlIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgIHJ1bm5pbmcgYXNzZW1ibGUuIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdEFzc2VtYmxlIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHJ1bm5pbmcgcGFja2FnZS4gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmVQYWNrYWdlIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgIHJ1bm5pbmcgcGFja2FnZS4gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0UGFja2FnZSI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHRoZSBidWlsZCBpcyBkb25lLiAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3RCdWlsZCI+Ci0JCTxhbnRjYWxsIHRhcmdldD0iZ2F0aGVyTG9ncyIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyB0byB0ZXN0IHRoZSBidWlsZCByZXN1bHRzIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0idGVzdCI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIHRvIHB1Ymxpc2ggdGhlIGJ1aWxkIHJlc3VsdHMgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwdWJsaXNoIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gRGVmYXVsdCB0YXJnZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0ibm9EZWZhdWx0Ij4KLQkJPGVjaG8gbWVzc2FnZT0iWW91IG11c3Qgc3BlY2lmeSBhIHRhcmdldCB3aGVuIGludm9raW5nIHRoaXMgZmlsZSIvPgotCTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9tYXBzL2VwZl9lbi5tYXAgYi8xLjUvcmVsZW5nL21hcHMvZXBmX2VuLm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1NDBjNS4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL21hcHMvZXBmX2VuLm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLWZlYXR1cmVAb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZT12MjAwODAxMjQtMTYxMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZQotZmVhdHVyZUBvcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmU9djIwMDgwMTI0LTE2MTEsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZQotZmVhdHVyZUBvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZT12MjAwODAxMjQtMTYxMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUKLWZlYXR1cmVAb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUKLWZlYXR1cmVAb3JnLmVjbGlwc2UuZXBmLnByb2R1Y3QuZmVhdHVyZT12MjAwODAyMTEtMTgzOSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnByb2R1Y3QuZmVhdHVyZQotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk9djIwMDgwMjEyLTExMDMsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aQotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5iYXNlPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmNvbW1vbj12MjAwODAxMzEtMTA1Nyw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aT12MjAwODAxMzEtMTA1Nyw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODY9djIwMDgwMTI0LTE2MTEsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZD12MjAwODAyMDQtMTQyNiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZAotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZD12MjAwODAyMDQtMTQyNiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlPXYyMDA4MDIwNC0xNDI2LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0PXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbD12MjAwODAxMjQtMTYxMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbAotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZD12MjAwODAyMDQtMTQyNiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmRvYz12MjAwODAxMjQtMTYxMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmV4cG9ydD12MjAwODAxMjQtMTYxMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Ci1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A9djIwMDgwMTI0LTE2MTEsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aT12MjAwODAxMjQtMTYxMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aQotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sPXYyMDA4MDEyOS0xNjQ5LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYwotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQ9djIwMDgwMTI0LTE2MTEsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydAotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sPXYyMDA4MDEyOS0xNjQ5LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk9djIwMDgwMjEyLTE3MDgsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0PXYyMDA4MDIxMS0xOTM2LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZT12MjAwODAyMDctMTkyMyw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZQotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaQotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaT12MjAwODAxMjQtMTYxMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW09djIwMDgwMTI0LTE2MTEsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdD12MjAwODAxMjQtMTYxMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Ci1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybQotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nPXYyMDA4MDIxMi0xNzA4LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWk9djIwMDgwMTI0LTE2MTEsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYucmNwPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYucmNwLnVpPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ9djIwMDgwMTI0LTE2MTEsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Ci1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnNlYXJjaD12MjAwODAxMjQtMTYxMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aT12MjAwODAxMjQtMTYxMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcwotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi51aT12MjAwODAxMjQtMTYxMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYudWkuaW50cm89djIwMDgwMTI0LTE2MTEsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnVtYT12MjAwODAyMTEtMTgwMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZT12MjAwODAxMjQtMTYxMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0PXYyMDA4MDEyNy0xODA4LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdAotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnhtbC51bWE9djIwMDgwMTI5LTE2NDksOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL21hcHMvZXBmX25sczEubWFwIGIvMS41L3JlbGVuZy9tYXBzL2VwZl9ubHMxLm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVhNWQyOS4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL21hcHMvZXBmX25sczEubWFwCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotZmVhdHVyZUBvcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sczE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubHMxCi1mZWF0dXJlQG9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sczE9djIwMDcxMDE4LTE4NTksOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sczEKLWZlYXR1cmVAb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlLm5sczE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlLm5sczEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0ubmwxCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi51aS5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkubmwxCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYudW1hLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24ubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24ubmwxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9tYXBzL2VwZl9ubHMyLm1hcCBiLzEuNS9yZWxlbmcvbWFwcy9lcGZfbmxzMi5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOTg2N2UuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9tYXBzL2VwZl9ubHMyLm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLWZlYXR1cmVAb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubHMyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmxzMgotZmVhdHVyZUBvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubHMyPXYyMDA3MTAxOC0xODU5LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubHMyCi1mZWF0dXJlQG9yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS5ubHMyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS5ubHMyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0Lm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMgotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMgotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMgotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0ubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLm5sMgotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5yY3AudWkubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYudWkubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLm5sMgotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMgotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLm5sMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9yZWxlbmcvbWFwcy9lcGZfbmxzMmEubWFwIGIvMS41L3JlbGVuZy9tYXBzL2VwZl9ubHMyYS5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NDc2YjQuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9tYXBzL2VwZl9ubHMyYS5tYXAKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1mZWF0dXJlQG9yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmxzMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubHMyYQotZmVhdHVyZUBvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubHMyYT12MjAwNzEwMTgtMTg1OSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmxzMmEKLWZlYXR1cmVAb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlLm5sczJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS5ubHMyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0Lm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0Lm5sMmEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLm5sMmEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMmEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0ubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMmEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5yY3AudWkubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMmEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi51aS5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLm5sMmEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi51bWEubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24ubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLm5sMmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL21hcHMvZXBmX3Rlc3RzLm1hcCBiLzEuNS9yZWxlbmcvbWFwcy9lcGZfdGVzdHMubWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2ZkNjBlLi4wMDAwMDAwCi0tLSBhLzEuNS9yZWxlbmcvbWFwcy9lcGZfdGVzdHMubWFwCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1mZWF0dXJlQG9yZy5lY2xpcHNlLmVwZi50ZXN0cy5mZWF0dXJlPXYyMDA4MDIxMS0xODM5LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMuZmVhdHVyZQotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHM9djIwMDgwMjExLTE4MzksOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cz12MjAwODAyMTEtMTgzOSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cz12MjAwODAyMTItMTEzOCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHM9djIwMDgwMjExLTE4MzksOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cwotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi50ZXN0cz12MjAwODAyMTEtMTgzOSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzLmh0bWwgYi8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUyMzIwOS4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNzkgKzAsMCBAQAot77u/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+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMzMTZlOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21tb24gVGVzdHMgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5jb21tb24sCi0gb3JnLmp1bml0Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cwpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvYnVpbGQucHJvcGVydGllcyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZDJlNGQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9Db21tb25UZXN0cy5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvQ29tbW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc5OTcyMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9Db21tb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogSlVuaXQgdGVzdCBzdWl0ZSBmb3Igb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25UZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoQ29tbW9uVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCS8vJEpVbml0LUJFR0lOJAotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3RyVXRpbFRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWE1MVXRpbFRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVmVyc2lvblV0aWxUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVQRlZlcnNpb25zVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFUEZWZXJzaW9uVGVzdC5jbGFzcyk7Ci0JCS8vJEpVbml0LUVORCQKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvRVBGVmVyc2lvblRlc3QuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3Rlc3RzL0VQRlZlcnNpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NWU4ZDcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvRVBGVmVyc2lvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuRVBGVmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkVQRlZlcnNpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBFUEZWZXJzaW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFUEZWZXJzaW9uVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VG9vbFZlcnNpb24oKSB7Ci0JCUVQRlZlcnNpb24gdmVyc2lvbiA9IFZlcnNpb25VdGlsLmdldFZlcnNpb25zKEVQRlZlcnNpb25zLlRPT0xfSUQpLmdldEN1cnJlbnRWZXJzaW9uKCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgVmVyc2lvbigiMS4yIiksdmVyc2lvbi5nZXRUb29sVmVyc2lvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TGlicmFyeVZlcnNpb24oKSB7Ci0JCUVQRlZlcnNpb24gdmVyc2lvbiA9IFZlcnNpb25VdGlsLmdldFZlcnNpb25zKEVQRlZlcnNpb25zLlRPT0xfSUQpLmdldEN1cnJlbnRWZXJzaW9uKCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgVmVyc2lvbigiMS4wLjQuMSIpLHZlcnNpb24uZ2V0TGlicmFyeVZlcnNpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFhNTFNjaGVtYVZlcnNpb24oKSB7Ci0JCUVQRlZlcnNpb24gdmVyc2lvbiA9IFZlcnNpb25VdGlsLmdldFZlcnNpb25zKEVQRlZlcnNpb25zLlRPT0xfSUQpLmdldEN1cnJlbnRWZXJzaW9uKCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgVmVyc2lvbigiMS4wLjEiKSx2ZXJzaW9uLmdldFhNTFNjaGVtYVZlcnNpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXBhcmVUb29sVmVyc2lvblRvKCkgewotCQlFUEZWZXJzaW9uIHZlcnNpb24gPSBWZXJzaW9uVXRpbC5nZXRWZXJzaW9ucyhFUEZWZXJzaW9ucy5UT09MX0lEKS5nZXRDdXJyZW50VmVyc2lvbigpOwotCQlhc3NlcnRUcnVlKHZlcnNpb24uY29tcGFyZVRvb2xWZXJzaW9uVG8obmV3IFZlcnNpb24oIjEuMiIpKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uLmNvbXBhcmVUb29sVmVyc2lvblRvKG5ldyBWZXJzaW9uKCIxLjMiKSkgPCAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uLmNvbXBhcmVUb29sVmVyc2lvblRvKG5ldyBWZXJzaW9uKCIwLjkiKSkgPiAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZUxpYnJhcnlWZXJzaW9uVG8oKSB7Ci0JCUVQRlZlcnNpb24gdmVyc2lvbiA9IFZlcnNpb25VdGlsLmdldFZlcnNpb25zKEVQRlZlcnNpb25zLlRPT0xfSUQpLmdldEN1cnJlbnRWZXJzaW9uKCk7Ci0JCWFzc2VydFRydWUodmVyc2lvbi5jb21wYXJlTGlicmFyeVZlcnNpb25UbyhuZXcgVmVyc2lvbigiMS4wLjQuMSIpKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uLmNvbXBhcmVMaWJyYXJ5VmVyc2lvblRvKG5ldyBWZXJzaW9uKCIxLjAuNC4yIikpIDwgMCk7Ci0JCWFzc2VydFRydWUodmVyc2lvbi5jb21wYXJlTGlicmFyeVZlcnNpb25UbyhuZXcgVmVyc2lvbigiMS4wLjIuMCIpKSA+IDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wYXJlWE1MU2NoZW1hVmVyc2lvblRvKCkgewotCQlFUEZWZXJzaW9uIHZlcnNpb24gPSBWZXJzaW9uVXRpbC5nZXRWZXJzaW9ucyhFUEZWZXJzaW9ucy5UT09MX0lEKS5nZXRDdXJyZW50VmVyc2lvbigpOwotCQlhc3NlcnRUcnVlKHZlcnNpb24uY29tcGFyZVhNTFNjaGVtYVZlcnNpb25UbyhuZXcgVmVyc2lvbigiMS4wLjEiKSkgPT0gMCk7Ci0JCWFzc2VydFRydWUodmVyc2lvbi5jb21wYXJlWE1MU2NoZW1hVmVyc2lvblRvKG5ldyBWZXJzaW9uKCIxLjAuMiIpKSA8IDApOwotCQlhc3NlcnRUcnVlKHZlcnNpb24uY29tcGFyZVhNTFNjaGVtYVZlcnNpb25UbyhuZXcgVmVyc2lvbigiMC45LjkiKSkgPiAwKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3Rlc3RzL0VQRlZlcnNpb25zVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvRVBGVmVyc2lvbnNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZmFhMzQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvRVBGVmVyc2lvbnNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5FUEZWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuRVBGVmVyc2lvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5WZXJzaW9uVXRpbDsKLQotcHVibGljIGNsYXNzIEVQRlZlcnNpb25zVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFUEZWZXJzaW9uc1Rlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEN1cnJlbnRWZXJzaW9uKCkgewotCQlFUEZWZXJzaW9ucyB2ZXJzaW9ucyA9IChFUEZWZXJzaW9ucylWZXJzaW9uVXRpbC5nZXRWZXJzaW9ucyhFUEZWZXJzaW9ucy5UT09MX0lEKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBFUEZWZXJzaW9uKCIxLjIiLCIxLjAuNC4xIiwiMS4wLjEiKSwgdmVyc2lvbnMuZ2V0Q3VycmVudFZlcnNpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZlcnNpb24oKSB7Ci0JCUVQRlZlcnNpb25zIHZlcnNpb25zID0gKEVQRlZlcnNpb25zKVZlcnNpb25VdGlsLmdldFZlcnNpb25zKEVQRlZlcnNpb25zLlRPT0xfSUQpOwotCQlhc3NlcnRFcXVhbHMobmV3IEVQRlZlcnNpb24oIjEuMCIsIjEuMC4zLjAiLCIxLjAuMCIpLCB2ZXJzaW9ucy5nZXRWZXJzaW9uKCIxLjAiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFsbFZlcnNpb25zKCkgewotCQlFUEZWZXJzaW9ucyB2ZXJzaW9ucyA9IChFUEZWZXJzaW9ucylWZXJzaW9uVXRpbC5nZXRWZXJzaW9ucyhFUEZWZXJzaW9ucy5UT09MX0lEKTsKLQkJTGlzdCBleHBlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWV4cGVjdGVkTGlzdC5hZGQobmV3IEVQRlZlcnNpb24oIjEuMCIsIjEuMC4zLjAiLCIxLjAuMCIpKTsKLQkJZXhwZWN0ZWRMaXN0LmFkZChuZXcgRVBGVmVyc2lvbigiMS4xIiwiMS4wLjQuMCIsIjEuMC4wIikpOwotCQlleHBlY3RlZExpc3QuYWRkKG5ldyBFUEZWZXJzaW9uKCIxLjIiLCIxLjAuNC4xIiwiMS4wLjEiKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZExpc3QsIHZlcnNpb25zLmdldEFsbFZlcnNpb25zKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvU3RyVXRpbFRlc3QuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3Rlc3RzL1N0clV0aWxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MGE0NGQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvU3RyVXRpbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci0KLS8qKgotICogSlVuaXQgdGVzdHMgZm9yIHRoZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWwgY2xhc3Nlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJVdGlsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTdHJVdGlsVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB0aGUgU3RyVXRpbC5pc051bGwoKSBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdElzTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCSAgICBhc3NlcnRUcnVlKFN0clV0aWwuaXNOdWxsKG51bGwpKTsKLQkgICAgYXNzZXJ0VHJ1ZShTdHJVdGlsLmlzTnVsbCgiIikpOwotCSAgICBhc3NlcnRGYWxzZShTdHJVdGlsLmlzTnVsbCgiSGVsbG8iKSk7CSAgICAKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgdGhlIFN0clV0aWwuaXNCbGFuaygpIG1ldGhvZC4KLQkgKi8JCi0JcHVibGljIHZvaWQgdGVzdElzQmxhbmsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkgICAgYXNzZXJ0VHJ1ZShTdHJVdGlsLmlzQmxhbmsobnVsbCkpOwotCSAgICBhc3NlcnRUcnVlKFN0clV0aWwuaXNCbGFuaygiIikpOwotCSAgICBhc3NlcnRGYWxzZShTdHJVdGlsLmlzQmxhbmsoIkhlbGxvIikpOwkgICAgCi0JfQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3Rlc3RzL1ZlcnNpb25VdGlsVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvVmVyc2lvblV0aWxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZDEyZjcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvVmVyc2lvblV0aWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuRVBGVmVyc2lvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5WZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotCi1wdWJsaWMgY2xhc3MgVmVyc2lvblV0aWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFZlcnNpb25VdGlsVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsVG9vbElEcygpIHsKLQkJU2V0IHRvb2xJRHMgPSBWZXJzaW9uVXRpbC5nZXRBbGxUb29sSURzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRvb2xJRHMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyB0b29sSUQgPSAoU3RyaW5nKWl0ZXIubmV4dCgpOwotCQkJYXNzZXJ0VHJ1ZSh0b29sSUQuZXF1YWxzKCJlcGYiKSB8fCB0b29sSUQuZXF1YWxzKCJybWMiKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmVyc2lvbnMoKSB7Ci0JCUVQRlZlcnNpb25zIHZlcnNpb25zID0gVmVyc2lvblV0aWwuZ2V0VmVyc2lvbnMoRVBGVmVyc2lvbnMuVE9PTF9JRCk7Ci0JCWFzc2VydE5vdE51bGwodmVyc2lvbnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1ZlcnNpb25DaGVja2luZ0Rpc2FibGVkKCkgewotCQlhc3NlcnRGYWxzZShWZXJzaW9uVXRpbC5pc1ZlcnNpb25DaGVja2luZ0Rpc2FibGVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVhZFZlcnNpb25zRnJvbUZpbGUoKSB7Ci0JCS8vIHRlc3Qgbm8tdmVyc2lvbnMtaW4tZmlsZSBjYXNlCi0JCUZpbGUgeG1pRmlsZSA9IGNyZWF0ZVRlc3RYTUlGaWxlKCIiKTsKLQkJaWYgKHhtaUZpbGUgPT0gbnVsbCkgewotCQkJZmFpbCgpOwotCQl9Ci0JCU1hcCB2ZXJzaW9ucyA9IFZlcnNpb25VdGlsLnJlYWRWZXJzaW9uc0Zyb21GaWxlKHhtaUZpbGUpOwotCQlhc3NlcnROdWxsKHZlcnNpb25zKTsKLQkJeG1pRmlsZS5kZWxldGUoKTsKLQkKLQkJLy8gdGVzdCBlcGYtb25seSBjYXNlCi0JCXhtaUZpbGUgPSBjcmVhdGVUZXN0WE1JRmlsZSgiZXBmOnZlcnNpb249XCIxLjAuMFwiIik7Ci0JCWlmICh4bWlGaWxlID09IG51bGwpIHsKLQkJCWZhaWwoKTsKLQkJfQotCQl2ZXJzaW9ucyA9IFZlcnNpb25VdGlsLnJlYWRWZXJzaW9uc0Zyb21GaWxlKHhtaUZpbGUpOwotCQlTdHJpbmcgZXBmVmVyID0gKFN0cmluZyl2ZXJzaW9ucy5nZXQoImVwZiIpOwotCQlhc3NlcnRUcnVlKGVwZlZlci5lcXVhbHMoIjEuMC4wIikpOwotCQl4bWlGaWxlLmRlbGV0ZSgpOwotCQotCQkvLyB0ZXN0IG11bHRpcGxlIHZlcnNpb25zIGNhc2UKLQkJeG1pRmlsZSA9IGNyZWF0ZVRlc3RYTUlGaWxlKCJlcGY6dmVyc2lvbj1cIjEuMC4wXCIgcm1jOnZlcnNpb249XCI3LjEuMFwiIik7Ci0JCWlmICh4bWlGaWxlID09IG51bGwpIHsKLQkJCWZhaWwoKTsKLQkJfQotCQl2ZXJzaW9ucyA9IFZlcnNpb25VdGlsLnJlYWRWZXJzaW9uc0Zyb21GaWxlKHhtaUZpbGUpOwotCQllcGZWZXIgPSAoU3RyaW5nKXZlcnNpb25zLmdldCgiZXBmIik7Ci0JCVN0cmluZyBybWNWZXIgPSAoU3RyaW5nKXZlcnNpb25zLmdldCgicm1jIik7Ci0JCWFzc2VydFRydWUoZXBmVmVyLmVxdWFscygiMS4wLjAiKSk7Ci0JCWFzc2VydFRydWUocm1jVmVyLmVxdWFscygiNy4xLjAiKSk7Ci0JCXhtaUZpbGUuZGVsZXRlKCk7Ci0JCQotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQkvLyB0ZXN0IFhNTCBmaWxlCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCS8vIHRlc3Qgbm8tdmVyc2lvbnMtaW4tZmlsZSBjYXNlCi0JCUZpbGUgeG1sRmlsZSA9IGNyZWF0ZVRlc3RYTUxGaWxlKCIiKTsKLQkJaWYgKHhtbEZpbGUgPT0gbnVsbCkgewotCQkJZmFpbCgpOwotCQl9Ci0JCXZlcnNpb25zID0gVmVyc2lvblV0aWwucmVhZFZlcnNpb25zRnJvbUZpbGUoeG1sRmlsZSk7Ci0JCWFzc2VydE51bGwodmVyc2lvbnMpOwotCQl4bWxGaWxlLmRlbGV0ZSgpOwotCQotCQkvLyB0ZXN0IGVwZi1vbmx5IGNhc2UKLQkJeG1sRmlsZSA9IGNyZWF0ZVRlc3RYTUxGaWxlKCJ0b29sPVwiZXBmPTEuMC4wXCIiKTsKLQkJaWYgKHhtbEZpbGUgPT0gbnVsbCkgewotCQkJZmFpbCgpOwotCQl9Ci0JCXZlcnNpb25zID0gVmVyc2lvblV0aWwucmVhZFZlcnNpb25zRnJvbUZpbGUoeG1sRmlsZSk7Ci0JCWVwZlZlciA9IChTdHJpbmcpdmVyc2lvbnMuZ2V0KCJlcGYiKTsKLQkJYXNzZXJ0VHJ1ZShlcGZWZXIuZXF1YWxzKCIxLjAuMCIpKTsKLQkJeG1sRmlsZS5kZWxldGUoKTsKLQkKLQkJLy8gdGVzdCBtdWx0aXBsZSB2ZXJzaW9ucyBjYXNlCi0JCXhtbEZpbGUgPSBjcmVhdGVUZXN0WE1MRmlsZSgidG9vbD1cImVwZj0xLjAuMDtybWM9Ny4xLjBcIiIpOwotCQlpZiAoeG1sRmlsZSA9PSBudWxsKSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQkJdmVyc2lvbnMgPSBWZXJzaW9uVXRpbC5yZWFkVmVyc2lvbnNGcm9tRmlsZSh4bWxGaWxlKTsKLQkJZXBmVmVyID0gKFN0cmluZyl2ZXJzaW9ucy5nZXQoImVwZiIpOwotCQlybWNWZXIgPSAoU3RyaW5nKXZlcnNpb25zLmdldCgicm1jIik7Ci0JCWFzc2VydFRydWUoZXBmVmVyLmVxdWFscygiMS4wLjAiKSk7Ci0JCWFzc2VydFRydWUocm1jVmVyLmVxdWFscygiNy4xLjAiKSk7Ci0JCXhtbEZpbGUuZGVsZXRlKCk7Ci0JfQotCQotCXByaXZhdGUgRmlsZSBjcmVhdGVUZXN0WE1JRmlsZShTdHJpbmcgdmVyc2lvbkF0dHJpYnV0ZXMpIHsKLQkJdHJ5IHsKLQkJCUZpbGUgeG1pRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIkVQRl9KVU5JVF8iLCAiLnhtaSIpOwotCQkJU3RyaW5nIHhtaVRleHQgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IiArCi0JCQkgICAgIlxuPHhtaTpYTUkgeG1pOnZlcnNpb249XCIyLjBcIiB4bWxuczp4bWk9XCJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JXCIiICsKLQkJCSAgICAiIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCIiICsKLQkJCSAgICAiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9XCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlXCIiICsgCi0JCQkgICAgIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj1cImh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmVcIiAiICsgCi0JCQkgICAgdmVyc2lvbkF0dHJpYnV0ZXMgKyAiPlxuLi4uXG48L3htaTpYTUk+XG4iOwotCQkJRmlsZVV0aWwud3JpdGVVVEY4RmlsZSh4bWlGaWxlLmdldEFic29sdXRlUGF0aCgpLCB4bWlUZXh0KTsKLQkJCXJldHVybiB4bWlGaWxlOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEZpbGUgY3JlYXRlVGVzdFhNTEZpbGUoU3RyaW5nIHZlcnNpb25BdHRyaWJ1dGVzKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIHhtbEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJFUEZfSlVOSVRfIiwgIi54bWwiKTsKLQkJCVN0cmluZyB4bWxUZXh0ID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIgKwotCQkJCSJcbjx1bWE6TWV0aG9kTGlicmFyeSB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiIiArCi0JCQkJInhtbG5zOnVtYT1cImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuM1wiICIgKwotCQkJCXZlcnNpb25BdHRyaWJ1dGVzICsKLQkJCQkiIG5hbWU9XCJhXCIgYnJpZWZEZXNjcmlwdGlvbj1cIlwiIGlkPVwiX0hWbkc4REw1RWR1NDJOMFhTN29uVWdcIiIgKwotCQkJCSJvcmRlcmluZ0d1aWRlPVwiXCIgc3VwcHJlc3NlZD1cImZhbHNlXCIgYXV0aG9ycz1cIlwiIGNoYW5nZURlc2NyaXB0aW9uPVwiXCIgdmVyc2lvbj1cIlwiPiIgKwotCQkJCSJcbi4uLlxuPC91bWE6TWV0aG9kTGlicmFyeT4iOwotCQkJRmlsZVV0aWwud3JpdGVVVEY4RmlsZSh4bWxGaWxlLmdldEFic29sdXRlUGF0aCgpLCB4bWxUZXh0KTsKLQkJCXJldHVybiB4bWxGaWxlOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3Rlc3RzL1hNTFV0aWxUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9YTUxVdGlsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWNmMmMyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3Rlc3RzL1hNTFV0aWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlhNTFV0aWwuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1MVXRpbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgWE1MVXRpbFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRoZSBYTUxVdGlsLmVzY2FwZUF0dHIoKSBtZXRob2QuCi0JICovCQotCXB1YmxpYyB2b2lkIHRlc3RFc2NhcGVBdHRyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JICAgIFN0cmluZyByZXN1bHQgPSBYTUxVdGlsLmVzY2FwZSgiPGI+SGVsbG88L2I+Iik7Ci0JICAgIGFzc2VydFRydWUocmVzdWx0LmVxdWFscygiJmx0O2ImZ3Q7SGVsbG8mbHQ7L2ImZ3Q7IikpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzLy5jbGFzc3BhdGggYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cy8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJkYjg5Ni4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNzJmZDAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIERpYWdyYW0gVGVzdHMKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cy5EaWFncmFtVGVzdFBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5qdW5pdCwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLAotIG9yZy5lY2xpcHNlLmVwZi51bWEsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnksCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWksCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkMmU0ZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3Rlc3RzL0RpYWdyYW1UZXN0Q2FzZS5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM0NzFhMy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3Rlc3RzL0RpYWdyYW1UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuTGlicmFyeVRlc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBEaWFncmFtIEpVbml0IHRlc3QgY2FzZXMuCi0qIAotKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotKiBAc2luY2UgMS4yCi0qLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERpYWdyYW1UZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5IGxpYnJhcnk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWxldGVMaWJyYXJ5T25FeGl0ID0gZmFsc2U7Ci0KLQlwdWJsaWMgRGlhZ3JhbVRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRlc3RNZXRob2RMaWJyYXJ5KCk7Ci0JCQotCQkvLyBhY3RpdmF0ZSB0aGUgQXV0aG9yaW5nIHBsdWdpbnMgdG8gaW5pdGlhbGl6ZSBzb21ldGhpbmcKLQkJLy8gdGhlIHJlYXNvbiB0byBwdXQgaXQgYWZ0ZXIgdGhlIGxpYnJhcnkgaXMgY3JlYXRlZCBpcyB0byBhdm9pZCB0aGUgT3BlbiBMaWJyYXJ5IGRpYWxvZwotCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5jbG9zZUxpYnJhcnkoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdGVzdHMvRGlhZ3JhbVRlc3RQbHVnaW4uamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdGVzdHMvRGlhZ3JhbVRlc3RQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJkNDQ3Yy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3Rlc3RzL0RpYWdyYW1UZXN0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0qIFRoZSBUZXN0cyBwbHVnLWluIGNsYXNzLgotKiAKLSogQGF1dGhvcglTaGlscGEgVG9yYXNrYXIKLSogQHNpbmNlCTEuMgotKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtVGVzdFBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElELgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IERpYWdyYW1UZXN0UGx1Z2luLmNsYXNzLmdldE5hbWUoKTsKLQkKLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgRGlhZ3JhbVRlc3RQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIERpYWdyYW1UZXN0UGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbi4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuY29yZS5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5jb3JlLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpYWdyYW1UZXN0UGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3Rlc3RzL0RpYWdyYW1UZXN0cy5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk4MzhjYy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3Rlc3RzL0RpYWdyYW1UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIEpVbml0IHRlc3Qgc3VpdGUgZm9yIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShEaWFncmFtVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCS8vJEpVbml0LUJFR0lOJAotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRGlhZ3JhbVVJU2VydmljZVRlc3QuY2xhc3MpOwotCQkKLQkJLy8kSlVuaXQtRU5EJAotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3Rlc3RzL0RpYWdyYW1VSVNlcnZpY2VUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3Rlc3RzL0RpYWdyYW1VSVNlcnZpY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NGNlZWQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVUlTZXJ2aWNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2UuRGlhZ3JhbVVJU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLklEaWFncmFtVUlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLkxpYnJhcnlUZXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3IgdGhlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLkRpYWdyYW1VSVNlcnZpY2UgY2xhc3Nlcy4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1VSVNlcnZpY2VUZXN0IGV4dGVuZHMgRGlhZ3JhbVRlc3RDYXNlIHsKLQotCXByaXZhdGUgSURpYWdyYW1VSVNlcnZpY2UgZGlhZ3JhbVVJU2VydmljZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaWFncmFtVUlTZXJ2aWNlVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB0aGUgRGlhZ2FtVUlTZXJ2aWNlLmNyZWF0ZURpYWdyYW0gbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVEaWFncmFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy8gY3JlYXRlIG1ldGhvZCBwbHVnaW4KLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyCi0JCQkJLmNyZWF0ZU1ldGhvZFBsdWdpbigiVGVzdCBQbHVnaW4iKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCSJwMSIpOwotCi0JCS8vIGNyZWF0ZSBjb25maWd1cmF0aW9uCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIKLQkJCQkuY3JlYXRlQ29uZmlndXJhdGlvbigiVGVzdCBDb25maWciKTsKLQotCQkvLyBjcmVhdGUgcHJvY2VzcwotCQlDYXBhYmlsaXR5UGF0dGVybiBjcDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybigKLQkJCQlwbHVnaW4sICJjcDEiLCBjb25maWcpOwotCi0JCS8vIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbgotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKAotCQkJCShQcm9jZXNzQ29tcG9uZW50KSBjcDEuZUNvbnRhaW5lcigpKTsKLQotCQkvLyBjcmVhdGUgdGFzawotCQlUYXNrIHRhc2sxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJUYXNrMSIpOwotCQlUYXNrIHRhc2syID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJUYXNrMiIpOwotCQlUYXNrW10gdGFza3MgPSBuZXcgVGFza1tdIHsgdGFzazEsIHRhc2syIH07Ci0KLQkJQWN0aXZpdHkgYWN0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFjdGl2aXR5KHBsdWdpbiwgY3AxLCAiQTEiLAotCQkJCXRhc2tzKTsKLQkJQWN0aXZpdHkgYWN0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFjdGl2aXR5KHBsdWdpbiwgY3AxLCAiQTIiLAotCQkJCXRhc2tzKTsKLQotCQlkaWFncmFtVUlTZXJ2aWNlID0gbmV3IERpYWdyYW1VSVNlcnZpY2UoKTsKLQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UoY3AxLCB0aGlzKTsKLQkJRGlhZ3JhbSBkaWFncmFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVRyYW5zYWN0aW9uIHR4ID0gIG1nci5nZXRFZGl0aW5nRG9tYWluKCkuc3RhcnRUcmFuc2FjdGlvbihmYWxzZSwKLQkJCQkJQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCVJlc291cmNlIHJlc291cmNlID0gbWdyLmdldFJlc291cmNlKCk7Ci0JCi0JCQlkaWFncmFtID0gZGlhZ3JhbVVJU2VydmljZS5jcmVhdGVBY3Rpdml0eURpYWdyYW0oY3AxKTsKLQkKLQkJCU5vZGUgYWN0MU5vZGUgPSBkaWFncmFtVUlTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgIGFjdDEpOwotCQkJTm9kZSBpbml0aWFsTm9kZSA9IGRpYWdyYW1VSVNlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCBJRGlhZ3JhbVVJU2VydmljZS5JTklUSUFMX05PREUsICJpbml0aWFsIik7Ci0JCQlOb2RlIGFjdDJOb2RlID0gZGlhZ3JhbVVJU2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIGFjdDIpOwotCQkJTm9kZSBkZWNpc2lvbk5vZGUgPSBkaWFncmFtVUlTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgSURpYWdyYW1VSVNlcnZpY2UuREVDSVNJT05fTk9ERSwgImRlY2lzaW9uIik7Ci0JCQlOb2RlIGVuZE5vZGUgPSBkaWFncmFtVUlTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgSURpYWdyYW1VSVNlcnZpY2UuRklOQUxfTk9ERSwgImVuZCIpOwotCQkJCi0JCQlkaWFncmFtVUlTZXJ2aWNlLmNyZWF0ZUVkZ2UoZGlhZ3JhbSwgaW5pdGlhbE5vZGUsIGFjdDFOb2RlLCAibGluazEiKTsKLQkJCWRpYWdyYW1VSVNlcnZpY2UuY3JlYXRlRWRnZShkaWFncmFtLCBhY3QxTm9kZSwgZGVjaXNpb25Ob2RlLCAibGluazIiKTsKLQkJCWRpYWdyYW1VSVNlcnZpY2UuY3JlYXRlRWRnZShkaWFncmFtLCBkZWNpc2lvbk5vZGUsIGFjdDJOb2RlLCAibGluazMiKTsKLQkJCWRpYWdyYW1VSVNlcnZpY2UuY3JlYXRlRWRnZShkaWFncmFtLCBhY3QyTm9kZSwgZW5kTm9kZSwgImxpbms0Iik7Ci0JCQkJCQkKLQkJCUxpc3Qgbm9kZXMgPSBkaWFncmFtVUlTZXJ2aWNlLmdldE5vZGVzKGRpYWdyYW0sIGNwMSwgSURpYWdyYW1VSVNlcnZpY2UuQUNUSVZJVFlfTk9ERSk7Ci0JCQlpZiAoIW5vZGVzLmlzRW1wdHkoKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqIEFDVElWSVRZIE5vZGVzIC0gIik7Ci0JCQkJZm9yIChpbnQgaT0wOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihub2Rlcy5nZXQoaSkpOwotCQkJfQotCQkJCi0JCQlub2RlcyA9IGRpYWdyYW1VSVNlcnZpY2UuZ2V0Tm9kZXMoZGlhZ3JhbSwgY3AxLCBJRGlhZ3JhbVVJU2VydmljZS5JTklUSUFMX05PREUpOwotCQkJaWYgKCFub2Rlcy5pc0VtcHR5KCkpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKiBJbml0aWFsIE5vZGVzIC0gIik7Ci0JCQkJZm9yIChpbnQgaT0wOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihub2Rlcy5nZXQoaSkpOwotCQkJfQotCQkJCi0JCQlub2RlcyA9IGRpYWdyYW1VSVNlcnZpY2UuZ2V0Tm9kZXMoZGlhZ3JhbSwgY3AxLCBJRGlhZ3JhbVVJU2VydmljZS5ERUNJU0lPTl9OT0RFKTsKLQkJCWlmICghbm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKiogRGVjaXNpb24gTm9kZXMgLSAiKTsKLQkJCQlmb3IgKGludCBpPTA7IGkgPCBub2Rlcy5zaXplKCk7IGkrKykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKG5vZGVzLmdldChpKSk7Ci0JCQl9Ci0JCQkKLQkJCW5vZGVzID0gZGlhZ3JhbVVJU2VydmljZS5nZXRBbGxOb2RlcyhkaWFncmFtKTsKLQkJCWlmICghbm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKiogQUxMIE5vZGVzIC0gIik7Ci0JCQkJZm9yIChpbnQgaT0wOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihub2Rlcy5nZXQoaSkpOwotCQkJfQotCQkJCi0JCQlhc3NlcnRUcnVlKCFub2Rlcy5pc0VtcHR5KCkpOwotCQkJCi0JCQlMaXN0IGVkZ2VzID0gZGlhZ3JhbVVJU2VydmljZS5nZXRFZGdlcyhkaWFncmFtKTsKLQkJCWlmICghZWRnZXMuaXNFbXB0eSgpKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKiogQUxMIEVkZ2VzIC0gIik7Ci0JCQkJZm9yIChpbnQgaT0wOyBpIDwgZWRnZXMuc2l6ZSgpOyBpKyspCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlZGdlcy5nZXQoaSkpOwotCQkJfQotCQkJCi0JCQlhc3NlcnRUcnVlKCFlZGdlcy5pc0VtcHR5KCkpOwotCQkKLQkJCS8vIHNhdmUgZGlhZ3JhbQotCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7Ci0JCQl0eC5jb21taXQoKTsKLQkJCXJlc291cmNlLnNhdmUobnVsbCk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobWdyICE9IG51bGwpIHsKLQkJCQltZ3IucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLy5jbGFzc3BhdGggYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZmYzkwMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2Ny50YyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3LnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjkzNWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3LnRjCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdD4KLQkKLQk8Q29weUxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTQzODY3Z29sZGVuIj4KLQk8L0NvcHlMaWJyYXJ5PgkKLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTQzODY3Z29sZGVuIj4KLQk8L09wZW5MaWJyYXJ5PgotCi0JPENvcHlMaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE0Mzg2N20iPgotCTwvQ29weUxpYnJhcnk+CQotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNDM4NjdtIj4KLQk8L09wZW5MaWJyYXJ5PgotCQotCTxJbXBvcnRQbHVnaW5zIGltcG9ydEZvbGRlck5hbWU9IjE0Mzg2N2UiPgotCTwvSW1wb3J0UGx1Z2lucz4KLQkKLQk8Q29tcGFyZVRvTGlicmFyeSAKLQkJZ29sZGVuTGliRm9sZGVyTmFtZT0iMTQzODY3Z29sZGVuIiA+CQkKLQk8L0NvbXBhcmVUb0xpYnJhcnk+Ci0KLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdlL1BsdWdfQS9wbHVnaW4ueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdlL1BsdWdfQS9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGJiZGM5Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3ZS9QbHVnX0EvcGx1Z2luLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMy91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiBlcGY6dmVyc2lvbj0iMS4wLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX3pCTXNFVXppRWR1c1RMX0kzakpRdEEiIGd1aWQ9Il96Qk1zRVV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiB4bWk6aWQ9Il96QkdsY0V6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJQbHVnX0EiIGd1aWQ9Il96QkdsY0V6aUVkdXNUTF9JM2pKUXRBIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xjVXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il96QkdsY1V6aUVkdXNUTF9JM2pKUXRBIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsY2t6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfekJHbGNremlFZHVzVExfSTNqSlF0QSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsYzB6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJEb21haW5zIiBndWlkPSJfekJHbGMwemlFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGRFemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il96QkdsZEV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZFV6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJSb2xlU2V0cyIgZ3VpZD0iX3pCR2xkVXppRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xka3ppRWR1c1RMX0kzakpRdEEiIG5hbWU9IldQIFR5cGVzIiBndWlkPSJfekJHbGRremlFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGQwemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iVG9vbHMiIGd1aWQ9Il96QkdsZDB6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZUV6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il96QkdsZUV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZVV6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfekJHbGVVemlFZHVzVExfSTNqSlF0QSI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xla3ppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkhpZGRlbiIgZ3VpZD0iX3pCR2xla3ppRWR1c1RMX0kzakpRdEEiPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfekJHbGUwemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il96QkdsZTB6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGZFemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ29yZUNvbnRlbnQiIGd1aWQ9Il96QkdsZkV6aUVkdXNUTF9JM2pKUXRBIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzBIWmZJRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9Im5ld19jb250ZW50X3BhY2thZ2UiIGd1aWQ9Il8wSFpmSUV6aUVkdXNUTF9JM2pKUXRBIj4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGUiIHhtaTppZD0iXzBzS1pFRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9Im5ld19yb2xlIiBndWlkPSJfMHNLWkVFemlFZHVzVExfSTNqSlF0QSIgcHJlc2VudGF0aW9uTmFtZT0iTmV3IFJvbGUiLz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX3pCR2xmVXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgZ3VpZD0iX3pCR2xmVXppRWR1c1RMX0kzakpRdEEiLz4KLSAgICA8L21ldGhvZFBhY2thZ2VzPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfekJHbGZremlFZHVzVExfSTNqSlF0QSIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGd1aWQ9Il96QkdsZmt6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZjB6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgZ3VpZD0iX3pCR2xmMHppRWR1c1RMX0kzakpRdEEiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3ZS9jb25maWd1cmF0aW9ucy9Db25maWdfQS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2UvY29uZmlndXJhdGlvbnMvQ29uZmlnX0EueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2E0MTNiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3ZS9jb25maWd1cmF0aW9ucy9Db25maWdfQS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMy91bWEuZWNvcmUiIGVwZjp2ZXJzaW9uPSIxLjAuMCIgeG1pOmlkPSJfMm1PU0FFemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ29uZmlnX0EiIGd1aWQ9Il8ybU9TQUV6aUVkdXNUTF9JM2pKUXRBIj4KLSAgPG1ldGhvZFBsdWdpblNlbGVjdGlvbiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGNFemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xmRXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsY1V6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGRVemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xja3ppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZEV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGMwemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xkMHppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZlV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGZremlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xka3ppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZjB6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGVVemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xlRXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZWt6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfMEhaZklFemlFZHVzVExfSTNqSlF0QSIvPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2UvZXhwb3J0LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3ZS9leHBvcnQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTEzNDA4Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3ZS9leHBvcnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zL3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX3hLTXVNRXppRWR1c1RMX0kzakpRdEEiIGd1aWQ9Il94S011TUV6aUVkdXNUTF9JM2pKUXRBIj4KLTxzdWJNYW5hZ2VycyB4bWk6aWQ9Il96Qk1zRVV6aUVkdXNUTF9JM2pKUXRBIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJNc0VVemlFZHVzVExfSTNqSlF0QSI+Ci08L3N1Yk1hbmFnZXJzPgotPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfeEtTMDBFemlFZHVzVExfSTNqSlF0QSIgaWQ9Il94S0dua0V6aUVkdXNUTF9JM2pKUXRBIiB1cmk9IiI+Ci08L3Jlc291cmNlRGVzY3JpcHRvcnM+Ci08cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il96Qk1zRWt6aUVkdXNUTF9JM2pKUXRBIiBpZD0iX3pCTXNFVXppRWR1c1RMX0kzakpRdEEiIHVyaT0iUGx1Z19BL3BsdWdpbi54bWkiPgotPC9yZXNvdXJjZURlc2NyaXB0b3JzPgotPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfekJNc0UwemlFZHVzVExfSTNqSlF0QSIgaWQ9Il96QkdsY0V6aUVkdXNUTF9JM2pKUXRBIiB1cmk9IlBsdWdfQS9wbHVnaW4ueG1pIj4KLTwvcmVzb3VyY2VEZXNjcmlwdG9ycz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeSB4bWk6aWQ9Il94S0dua0V6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSIxNDM4NjdtIiBndWlkPSJfeEtHbmtFemlFZHVzVExfSTNqSlF0QSI+Ci08bWV0aG9kUGx1Z2lucyB4bWk6aWQ9Il96QkdsY0V6aUVkdXNUTF9JM2pKUXRBIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGNFemlFZHVzVExfSTNqSlF0QSI+Ci08L21ldGhvZFBsdWdpbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuLy5wcm9qZWN0IGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4Njdnb2xkZW4vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNjJlN2QuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4Njdnb2xkZW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT4xNDM4NjdtPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuL1BsdWdfQS9wbHVnaW4ueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4Njdnb2xkZW4vUGx1Z19BL3BsdWdpbi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZWIzY2QuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4Njdnb2xkZW4vUGx1Z19BL3BsdWdpbi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il96Qk1zRVV6aUVkdXNUTF9JM2pKUXRBIiBndWlkPSJfekJNc0VVemlFZHVzVExfSTNqSlF0QSIvPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4geG1pOmlkPSJfekJHbGNFemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iUGx1Z19BIiBndWlkPSJfekJHbGNFemlFZHVzVExfSTNqSlF0QSI+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsY1V6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDb250ZW50IiBndWlkPSJfekJHbGNVemlFZHVzVExfSTNqSlF0QSI+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGNremlFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ2F0ZWdvcmllcyIgZ3VpZD0iX3pCR2xja3ppRWR1c1RMX0kzakpRdEEiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGMwemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iRG9tYWlucyIgZ3VpZD0iX3pCR2xjMHppRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xkRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkRpc2NpcGxpbmVzIiBndWlkPSJfekJHbGRFemlFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGRVemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iUm9sZVNldHMiIGd1aWQ9Il96QkdsZFV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZGt6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJXUCBUeXBlcyIgZ3VpZD0iX3pCR2xka3ppRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xkMHppRWR1c1RMX0kzakpRdEEiIG5hbWU9IlRvb2xzIiBndWlkPSJfekJHbGQwemlFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGVFemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBndWlkPSJfekJHbGVFemlFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGVVemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcmllcyIgZ3VpZD0iX3pCR2xlVXppRWR1c1RMX0kzakpRdEEiPgotICAgICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZWt6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJIaWRkZW4iIGd1aWQ9Il96QkdsZWt6aUVkdXNUTF9JM2pKUXRBIj4KLSAgICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIHhtaTppZD0iX3pCR2xlMHppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkN1c3RvbSBDYXRlZ29yaWVzIiBndWlkPSJfekJHbGUwemlFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xmRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNvcmVDb250ZW50IiBndWlkPSJfekJHbGZFemlFZHVzVExfSTNqSlF0QSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8wSFpmSUV6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJuZXdfY29udGVudF9wYWNrYWdlIiBndWlkPSJfMEhaZklFemlFZHVzVExfSTNqSlF0QSI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlIiB4bWk6aWQ9Il8wc0taRUV6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJuZXdfcm9sZSIgZ3VpZD0iXzBzS1pFRXppRWR1c1RMX0kzakpRdEEiIHByZXNlbnRhdGlvbk5hbWU9Ik5ldyBSb2xlIi8+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZlV6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il96QkdsZlV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX3pCR2xma3ppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBndWlkPSJfekJHbGZremlFZHVzVExfSTNqSlF0QSIvPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfekJHbGYwemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGd1aWQ9Il96QkdsZjB6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi9QbHVnX0FfcmVuYW1lZC9wbHVnaW4ueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4Njdnb2xkZW4vUGx1Z19BX3JlbmFtZWQvcGx1Z2luLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzczOTQxOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi9QbHVnX0FfcmVuYW1lZC9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfQkk5UkFVempFZHVzVExfSTNqSlF0QSIgZ3VpZD0iX0JJOVJBVXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIHhtaTppZD0iX0JJOVE4RXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IlBsdWdfQV9yZW5hbWVkIiBndWlkPSJfQkk5UThFempFZHVzVExfSTNqSlF0QSI+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlROFV6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDb250ZW50IiBndWlkPSJfQkk5UThVempFZHVzVExfSTNqSlF0QSI+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5UThrempFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ2F0ZWdvcmllcyIgZ3VpZD0iX0JJOVE4a3pqRWR1c1RMX0kzakpRdEEiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5UTgwempFZHVzVExfSTNqSlF0QSIgbmFtZT0iRG9tYWlucyIgZ3VpZD0iX0JJOVE4MHpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVE5RXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkRpc2NpcGxpbmVzIiBndWlkPSJfQkk5UTlFempFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5UTlVempFZHVzVExfSTNqSlF0QSIgbmFtZT0iUm9sZVNldHMiIGd1aWQ9Il9CSTlROVV6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlROWt6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJXUCBUeXBlcyIgZ3VpZD0iX0JJOVE5a3pqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVE5MHpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IlRvb2xzIiBndWlkPSJfQkk5UTkwempFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5US1FempFZHVzVExfSTNqSlF0QSIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBndWlkPSJfQkk5US1FempFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5US1VempFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcmllcyIgZ3VpZD0iX0JJOVEtVXpqRWR1c1RMX0kzakpRdEEiPgotICAgICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlRLWt6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJIaWRkZW4iIGd1aWQ9Il9CSTlRLWt6akVkdXNUTF9JM2pKUXRBIj4KLSAgICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIHhtaTppZD0iX0JJOVEtMHpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkN1c3RvbSBDYXRlZ29yaWVzIiBndWlkPSJfQkk5US0wempFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVFfRXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNvcmVDb250ZW50IiBndWlkPSJfQkk5UV9FempFZHVzVExfSTNqSlF0QSIvPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX0JJOVFfVXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgZ3VpZD0iX0JJOVFfVXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICA8L21ldGhvZFBhY2thZ2VzPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfQkk5UV9rempFZHVzVExfSTNqSlF0QSIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGd1aWQ9Il9CSTlRX2t6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9CSTlRXzB6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgZ3VpZD0iX0JJOVFfMHpqRWR1c1RMX0kzakpRdEEiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ19BLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ19BLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBmN2Q5Ni4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi9jb25maWd1cmF0aW9ucy9Db25maWdfQS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSJfMm1PU0FFemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ29uZmlnX0EiIGd1aWQ9Il8ybU9TQUV6aUVkdXNUTF9JM2pKUXRBIj4KLSAgPG1ldGhvZFBsdWdpblNlbGVjdGlvbiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGNFemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xmRXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsY1V6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGRVemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xja3ppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZEV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGMwemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xkMHppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZlV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGZremlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xka3ppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZjB6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGVVemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xlRXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZWt6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfMEhaZklFemlFZHVzVExfSTNqSlF0QSIvPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi9jb25maWd1cmF0aW9ucy9Db25maWdfQV9yZW5hbWVkLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ19BX3JlbmFtZWQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTI4YTcwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ19BX3JlbmFtZWQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSJfREhzMWtFempFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ29uZmlnX0FfcmVuYW1lZCIgZ3VpZD0iX0RIczFrRXpqRWR1c1RMX0kzakpRdEEiLz4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuL2xpYnJhcnkueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4Njdnb2xkZW4vbGlicmFyeS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZDNiN2EuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4Njdnb2xkZW4vbGlicmFyeS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il94S011TUV6aUVkdXNUTF9JM2pKUXRBIiBndWlkPSJfeEtNdU1FemlFZHVzVExfSTNqSlF0QSI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX0JJOVJBVXpqRWR1c1RMX0kzakpRdEEiIGhyZWY9InVtYTovL19CSTlROEV6akVkdXNUTF9JM2pKUXRBI19CSTlSQVV6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX3pCTXNFVXppRWR1c1RMX0kzakpRdEEiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196Qk1zRVV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfeEtTMDBFemlFZHVzVExfSTNqSlF0QSIgaWQ9Il94S0dua0V6aUVkdXNUTF9JM2pKUXRBIiB1cmk9IiIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3pCTXNFa3ppRWR1c1RMX0kzakpRdEEiIGlkPSJfekJNc0VVemlFZHVzVExfSTNqSlF0QSIgdXJpPSJQbHVnX0EvcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0JJOVJBa3pqRWR1c1RMX0kzakpRdEEiIGlkPSJfQkk5UkFVempFZHVzVExfSTNqSlF0QSIgdXJpPSJQbHVnX0EvcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0JJOVJBMHpqRWR1c1RMX0kzakpRdEEiIGlkPSJfQkk5UThFempFZHVzVExfSTNqSlF0QSIgdXJpPSJQbHVnX0FfcmVuYW1lZC9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfenkzT3NMY19FZHVRMXZOZEplSmlGUSIgaWQ9Il96QkdsY0V6aUVkdXNUTF9JM2pKUXRBIiB1cmk9IlBsdWdfQS9wbHVnaW4ueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5IHhtaTppZD0iX3hLR25rRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IjE0Mzg2N20iIGd1aWQ9Il94S0dua0V6aUVkdXNUTF9JM2pKUXRBIj4KLSAgICA8bWV0aG9kUGx1Z2lucyB4bWk6aWQ9Il9CSTlROEV6akVkdXNUTF9JM2pKUXRBIiBocmVmPSJ1bWE6Ly9fQkk5UThFempFZHVzVExfSTNqSlF0QSNfQkk5UThFempFZHVzVExfSTNqSlF0QSIvPgotICAgIDxtZXRob2RQbHVnaW5zIHhtaTppZD0iX3pCR2xjRXppRWR1c1RMX0kzakpRdEEiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsY0V6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdtLy5wcm9qZWN0IGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdtLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjQwMjdkLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3bS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPjE0Mzg2N20gMjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N20vUGx1Z19BL3BsdWdpbi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N20vUGx1Z19BL3BsdWdpbi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YzI5MGYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdtL1BsdWdfQS9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfQkk5UkFVempFZHVzVExfSTNqSlF0QSIgZ3VpZD0iX0JJOVJBVXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIHhtaTppZD0iX0JJOVE4RXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IlBsdWdfQSIgZ3VpZD0iX0JJOVE4RXpqRWR1c1RMX0kzakpRdEEiPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5UThVempFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ29udGVudCIgZ3VpZD0iX0JJOVE4VXpqRWR1c1RMX0kzakpRdEEiPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVE4a3pqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il9CSTlROGt6akVkdXNUTF9JM2pKUXRBIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVE4MHpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il9CSTlRODB6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlROUV6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iX0JJOVE5RXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVE5VXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfQkk5UTlVempFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5UTlrempFZHVzVExfSTNqSlF0QSIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il9CSTlROWt6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlROTB6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJUb29scyIgZ3VpZD0iX0JJOVE5MHpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVEtRXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iX0JJOVEtRXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVEtVXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il9CSTlRLVV6akVkdXNUTF9JM2pKUXRBIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5US1rempFZHVzVExfSTNqSlF0QSIgbmFtZT0iSGlkZGVuIiBndWlkPSJfQkk5US1rempFZHVzVExfSTNqSlF0QSI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il9CSTlRLTB6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iX0JJOVEtMHpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlRX0V6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iX0JJOVFfRXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9CSTlRX1V6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il9CSTlRX1V6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX0JJOVFfa3pqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBndWlkPSJfQkk5UV9rempFZHVzVExfSTNqSlF0QSIvPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfQkk5UV8wempFZHVzVExfSTNqSlF0QSIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGd1aWQ9Il9CSTlRXzB6akVkdXNUTF9JM2pKUXRBIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N20vY29uZmlndXJhdGlvbnMvQ29uZmlnX0EueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdtL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ19BLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFlNGE3Zi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N20vY29uZmlndXJhdGlvbnMvQ29uZmlnX0EueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSJfREhzMWtFempFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ29uZmlnX0EiIGd1aWQ9Il9ESHMxa0V6akVkdXNUTF9JM2pKUXRBIi8+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N20vbGlicmFyeS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N20vbGlicmFyeS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YWU3ZjguLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdtL2xpYnJhcnkueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfeEtNdU1FemlFZHVzVExfSTNqSlF0QSIgZ3VpZD0iX3hLTXVNRXppRWR1c1RMX0kzakpRdEEiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il9CSTlSQVV6akVkdXNUTF9JM2pKUXRBIiBocmVmPSJ1bWE6Ly9fQkk5UThFempFZHVzVExfSTNqSlF0QSNfQkk5UkFVempFZHVzVExfSTNqSlF0QSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3hLUzAwRXppRWR1c1RMX0kzakpRdEEiIGlkPSJfeEtHbmtFemlFZHVzVExfSTNqSlF0QSIgdXJpPSIiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il96Qk1zRWt6aUVkdXNUTF9JM2pKUXRBIiBpZD0iX3pCTXNFVXppRWR1c1RMX0kzakpRdEEiIHVyaT0iUGx1Z19BL3BsdWdpbi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9CSTlSQWt6akVkdXNUTF9JM2pKUXRBIiBpZD0iX0JJOVJBVXpqRWR1c1RMX0kzakpRdEEiIHVyaT0iUGx1Z19BL3BsdWdpbi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9CSTlSQTB6akVkdXNUTF9JM2pKUXRBIiBpZD0iX0JJOVE4RXpqRWR1c1RMX0kzakpRdEEiIHVyaT0iUGx1Z19BL3BsdWdpbi54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnkgeG1pOmlkPSJfeEtHbmtFemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iMTQzODY3bSIgZ3VpZD0iX3hLR25rRXppRWR1c1RMX0kzakpRdEEiPgotICAgIDxtZXRob2RQbHVnaW5zIHhtaTppZD0iX0JJOVE4RXpqRWR1c1RMX0kzakpRdEEiIGhyZWY9InVtYTovL19CSTlROEV6akVkdXNUTF9JM2pKUXRBI19CSTlROEV6akVkdXNUTF9JM2pKUXRBIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDIudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMi50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI0NzNhOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMi50YworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08TWV0aG9kTGlicmFyeVRlc3Q+Ci0JCi0JPENvcHlMaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE1MDcwMmdvbGRlbiI+Ci0JPC9Db3B5TGlicmFyeT4JCi0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE1MDcwMmdvbGRlbiI+Ci0JPC9PcGVuTGlicmFyeT4KLQotCTxDb3B5TGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNTA3MDJtIj4KLQk8L0NvcHlMaWJyYXJ5PgkKLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTUwNzAybSI+Ci0JPC9PcGVuTGlicmFyeT4KLQkKLQk8SW1wb3J0Q29uZmlndXJhdGlvbiBpbXBvcnRGb2xkZXJOYW1lPSIxNTA3MDJlIj4KLQk8L0ltcG9ydENvbmZpZ3VyYXRpb24+Ci0JCi0JPENvbXBhcmVUb0xpYnJhcnkgCi0JCWdvbGRlbkxpYkZvbGRlck5hbWU9IjE1MDcwMmdvbGRlbiIgPgkJCi0JPC9Db21wYXJlVG9MaWJyYXJ5PgotCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzODY2NC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT4xNTA3MDJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9QbHVnQS9jYXBhYmlsaXR5cGF0dGVybnMvY3AvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzI0NzFhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9QbHVnQS9jYXBhYmlsaXR5cGF0dGVybnMvY3AvY29udGVudC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1pNU9ZQ0t5SXRlV1YyWEgxRHQycWFnIiBuYW1lPSJjcCxfSlJSVGNVMjFFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWciPgotICA8bWFpbkRlc2NyaXB0aW9uPjE8L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPjE8L2tleUNvbnNpZGVyYXRpb25zPgotICA8cHVycG9zZT4xPC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPjE8L2FsdGVybmF0aXZlcz4KLSAgPGhvd3RvU3RhZmY+MTwvaG93dG9TdGFmZj4KLSAgPGV4dGVybmFsSWQ+MTwvZXh0ZXJuYWxJZD4KLSAgPHNjb3BlPjE8L3Njb3BlPgotICA8dXNhZ2VOb3Rlcz4xPC91c2FnZU5vdGVzPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9QbHVnQS9jYXBhYmlsaXR5cGF0dGVybnMvY3AvbW9kZWwueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL1BsdWdBL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9tb2RlbC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyM2MzZGEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL1BsdWdBL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9tb2RlbC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9SV0RDTVUyMUVkdURBNkRuelN5Y0tRIiBndWlkPSJfUldEQ01VMjFFZHVEQTZEbnpTeWNLUSI+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUldEQ01rMjFFZHVEQTZEbnpTeWNLUSIgaWQ9Ii1pNU9ZQ0t5SXRlV1YyWEgxRHQycWFnIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IHhtaTppZD0iX0pSUlRjRTIxRWR1REE2RG56U3ljS1EiIG5hbWU9ImNwIiBndWlkPSJfSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSI+Ci0gICAgPHByb2Nlc3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIHhtaTppZD0iX0pSUlRjVTIxRWR1REE2RG56U3ljS1EiIG5hbWU9ImNwIiBndWlkPSJfSlJSVGNVMjFFZHVEQTZEbnpTeWNLUSIgYnJpZWZEZXNjcmlwdGlvbj0iMSIgcHJlc2VudGF0aW9uTmFtZT0iY3AiPgotICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1pNU9ZQ0t5SXRlV1YyWEgxRHQycWFnIiBocmVmPSJ1bWE6Ly8taTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyMtaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyIvPgotICAgICAgPGRlZmF1bHRDb250ZXh0IGhyZWY9InVtYTovL18zT25tVUUyMEVkdURBNkRuelN5Y0tRI184ZmQwNEUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICA8dmFsaWRDb250ZXh0IGhyZWY9InVtYTovL18zT25tVUUyMEVkdURBNkRuelN5Y0tRI184ZmQwNEUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgPC9wcm9jZXNzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudD4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9QbHVnQS9wbHVnaW4ueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL1BsdWdBL3BsdWdpbi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YWMxZDguLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL1BsdWdBL3BsdWdpbi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9SVjg3a2syMUVkdURBNkRuelN5Y0tRIiBndWlkPSJfUlY4N2trMjFFZHVEQTZEbnpTeWNLUSI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX1JXRENNVTIxRWR1REE2RG56U3ljS1EiIGhyZWY9InVtYTovL19KUlJUY0UyMUVkdURBNkRuelN5Y0tRI19SV0RDTVUyMUVkdURBNkRuelN5Y0tRIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUlY4N2xVMjFFZHVEQTZEbnpTeWNLUSIgaWQ9Ii1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIiB1cmk9InJvbGVzL25ld19yb2xlXzEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUlY4N2xrMjFFZHVEQTZEbnpTeWNLUSIgaWQ9Ii0xQ3J1cWdQaEQ2ZmptTWxuTkdxcS1RIiB1cmk9InRhc2tzL25ld190YXNrJTIwMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9SV0RDTUUyMUVkdURBNkRuelN5Y0tRIiBpZD0iX0pSUlRjRTIxRWR1REE2RG56U3ljS1EiIHVyaT0iY2FwYWJpbGl0eXBhdHRlcm5zL2NwL21vZGVsLnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIHhtaTppZD0iXzViUzVRRTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IlBsdWdBIiBndWlkPSJfNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UVUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDb250ZW50IiBndWlkPSJfNWJTNVFVMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVFrMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ2F0ZWdvcmllcyIgZ3VpZD0iXzViUzVRazIwRWR1REE2RG56U3ljS1EiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVEwMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iRG9tYWlucyIgZ3VpZD0iXzViUzVRMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVSRTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkRpc2NpcGxpbmVzIiBndWlkPSJfNWJTNVJFMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVJVMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iUm9sZVNldHMiIGd1aWQ9Il81YlM1UlUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UmsyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJXUCBUeXBlcyIgZ3VpZD0iXzViUzVSazIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVSMDIwRWR1REE2RG56U3ljS1EiIG5hbWU9IlRvb2xzIiBndWlkPSJfNWJTNVIwMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVNFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBndWlkPSJfNWJTNVNFMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVNVMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcmllcyIgZ3VpZD0iXzViUzVTVTIwRWR1REE2RG56U3ljS1EiPgotICAgICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1U2syMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJIaWRkZW4iIGd1aWQ9Il81YlM1U2syMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIHhtaTppZD0iXzViUzVTMDIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkN1c3RvbSBDYXRlZ29yaWVzIiBndWlkPSJfNWJTNVMwMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVURTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkNvcmVDb250ZW50IiBndWlkPSJfNWJTNVRFMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9fa1MzMEUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJjb250ZW50X3BhY2thZ2VfMSIgZ3VpZD0iX19rUzMwRTIwRWR1REE2RG56U3ljS1EiIGJyaWVmRGVzY3JpcHRpb249IjEiPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZSIgeG1pOmlkPSJfQklZZ3dFMjFFZHVEQTZEbnpTeWNLUSIgbmFtZT0ibmV3X3JvbGVfMSIgZ3VpZD0iX0JJWWd3RTIxRWR1REE2RG56U3ljS1EiIGJyaWVmRGVzY3JpcHRpb249IjEiIHByZXNlbnRhdGlvbk5hbWU9Ik5ldyBSb2xlIDEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIiBocmVmPSJ1bWE6Ly8tQlF2QWZ0OEtSbk91SzMyTkl0Wkc0USMtQlF2QWZ0OEtSbk91SzMyTkl0Wkc0USIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFzayIgeG1pOmlkPSJfR2VyUUFFMjFFZHVEQTZEbnpTeWNLUSIgbmFtZT0ibmV3X3Rhc2sgMSIgZ3VpZD0iX0dlclFBRTIxRWR1REE2RG56U3ljS1EiIGJyaWVmRGVzY3JpcHRpb249IjEiIHByZXNlbnRhdGlvbk5hbWU9Ik5ldyBUYXNrIDEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii0xQ3J1cWdQaEQ2ZmptTWxuTkdxcS1RIiBocmVmPSJ1bWE6Ly8tMUNydXFnUGhENmZqbU1sbk5HcXEtUSMtMUNydXFnUGhENmZqbU1sbk5HcXEtUSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfNWJTNVRVMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBndWlkPSJfNWJTNVRVMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIHhtaTppZD0iX0pSUlRjRTIxRWR1REE2RG56U3ljS1EiIGhyZWY9InVtYTovL19KUlJUY0UyMUVkdURBNkRuelN5Y0tRI19KUlJUY0UyMUVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXzViUzVUazIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBndWlkPSJfNWJTNVRrMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfNWJTNVQwMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGd1aWQ9Il81YlM1VDAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvUGx1Z0Evcm9sZXMvbmV3X3JvbGVfMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvUGx1Z0Evcm9sZXMvbmV3X3JvbGVfMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZmE0Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL1BsdWdBL3JvbGVzL25ld19yb2xlXzEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIiBuYW1lPSJuZXdfcm9sZSxfQklZZ3dFMjFFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEiIGF1dGhvcnM9IjEiIGNoYW5nZURhdGU9IjIwMDYtMDktMjZUMTY6MTY6NDEuNTgwLTA3MDAiIGNoYW5nZURlc2NyaXB0aW9uPSIxIj4KLSAgPG1haW5EZXNjcmlwdGlvbj4xPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxza2lsbHM+MTwvc2tpbGxzPgotICA8YXNzaWdubWVudEFwcHJvYWNoZXM+MTwvYXNzaWdubWVudEFwcHJvYWNoZXM+Ci0gIDxzeW5vbnltcz4xPC9zeW5vbnltcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvUGx1Z0EvdGFza3MvbmV3X3Rhc2sgMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvUGx1Z0EvdGFza3MvbmV3X3Rhc2sgMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMTk0ZjcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL1BsdWdBL3Rhc2tzL25ld190YXNrIDEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii0xQ3J1cWdQaEQ2ZmptTWxuTkdxcS1RIiBuYW1lPSIsX0dlclFBRTIxRWR1REE2RG56U3ljS1EiIGd1aWQ9Ii0xQ3J1cWdQaEQ2ZmptTWxuTkdxcS1RIiBjaGFuZ2VEYXRlPSIyMDA2LTA5LTI2VDE2OjE3OjAxLjk3OS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj4xPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz4xPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHB1cnBvc2U+MTwvcHVycG9zZT4KLSAgPGFsdGVybmF0aXZlcz4xPC9hbHRlcm5hdGl2ZXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ0EueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ0EueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmI5YmY1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9jb25maWd1cmF0aW9ucy9Db25maWdBLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Il84ZmQwNEUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDb25maWdBIiBndWlkPSJfOGZkMDRFMjBFZHVEQTZEbnpTeWNLUSI+Ci0gIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24gaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVRRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1VEUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVFVMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVSVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UWsyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVJFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVRMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UjAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVRVMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVUazIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UmsyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVQwMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVTVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1U0UyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVNrMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjX19rUzMwRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgaHJlZj0idW1hOi8vX0pSUlRjRTIxRWR1REE2RG56U3ljS1EjX0pSUlRjRTIxRWR1REE2RG56U3ljS1EiLz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL2xpYnJhcnkueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL2xpYnJhcnkueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDcyY2JhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9saWJyYXJ5LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX1JWODdrRTIxRWR1REE2RG56U3ljS1EiIGd1aWQ9Il9SVjg3a0UyMUVkdURBNkRuelN5Y0tRIj4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfUlY4N2trMjFFZHVEQTZEbnpTeWNLUSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjX1JWODdrazIxRWR1REE2RG56U3ljS1EiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9SVjg3a1UyMUVkdURBNkRuelN5Y0tRIiBpZD0iXzNPbm1VRTIwRWR1REE2RG56U3ljS1EiIHVyaT0iIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUlY4N2swMjFFZHVEQTZEbnpTeWNLUSIgaWQ9Il9SVjg3a2syMUVkdURBNkRuelN5Y0tRIiB1cmk9IlBsdWdBL3BsdWdpbi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9SVjg3bEUyMUVkdURBNkRuelN5Y0tRIiBpZD0iXzViUzVRRTIwRWR1REE2RG56U3ljS1EiIHVyaT0iUGx1Z0EvcGx1Z2luLnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeSB4bWk6aWQ9Il8zT25tVUUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSIxNTA3MDJtIiBndWlkPSJfM09ubVVFMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVRRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnk+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzkyZTU0Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+MTUwNzAybTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi9QbHVnQS9jYXBhYmlsaXR5cGF0dGVybnMvY3AvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi9QbHVnQS9jYXBhYmlsaXR5cGF0dGVybnMvY3AvY29udGVudC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMjQ3MWEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyIgbmFtZT0iY3AsX0pSUlRjVTIxRWR1REE2RG56U3ljS1EiIGd1aWQ9Ii1pNU9ZQ0t5SXRlV1YyWEgxRHQycWFnIj4KLSAgPG1haW5EZXNjcmlwdGlvbj4xPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz4xPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHB1cnBvc2U+MTwvcHVycG9zZT4KLSAgPGFsdGVybmF0aXZlcz4xPC9hbHRlcm5hdGl2ZXM+Ci0gIDxob3d0b1N0YWZmPjE8L2hvd3RvU3RhZmY+Ci0gIDxleHRlcm5hbElkPjE8L2V4dGVybmFsSWQ+Ci0gIDxzY29wZT4xPC9zY29wZT4KLSAgPHVzYWdlTm90ZXM+MTwvdXNhZ2VOb3Rlcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi9QbHVnQS9jYXBhYmlsaXR5cGF0dGVybnMvY3AvbW9kZWwueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL21vZGVsLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU2NTE4OS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi9QbHVnQS9jYXBhYmlsaXR5cGF0dGVybnMvY3AvbW9kZWwueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfSlNPVnNFMjFFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iX0pTT1ZzRTIxRWR1REE2RG56U3ljS1EiPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0pTT1ZzVTIxRWR1REE2RG56U3ljS1EiIGlkPSItaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyIgdXJpPSJjb250ZW50LnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCB4bWk6aWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJjcCIgZ3VpZD0iX0pSUlRjRTIxRWR1REE2RG56U3ljS1EiPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiB4bWk6aWQ9Il9KUlJUY1UyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJjcCIgZ3VpZD0iX0pSUlRjVTIxRWR1REE2RG56U3ljS1EiIGJyaWVmRGVzY3JpcHRpb249IjEiIHByZXNlbnRhdGlvbk5hbWU9ImNwIj4KLSAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyIgaHJlZj0idW1hOi8vLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWcjLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWciLz4KLSAgICAgIDxkZWZhdWx0Q29udGV4dCBocmVmPSJ1bWE6Ly9fM09ubVVFMjBFZHVEQTZEbnpTeWNLUSNfOGZkMDRFMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgPHZhbGlkQ29udGV4dCBocmVmPSJ1bWE6Ly9fM09ubVVFMjBFZHVEQTZEbnpTeWNLUSNfOGZkMDRFMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgIDwvcHJvY2Vzcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQ+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi9QbHVnQS9wbHVnaW4ueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvcGx1Z2luLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVlNzBhYi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi9QbHVnQS9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfNWJmR2dVMjBFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iXzViZkdnVTIwRWR1REE2RG56U3ljS1EiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il9KU09Wc0UyMUVkdURBNkRuelN5Y0tRIiBocmVmPSJ1bWE6Ly9fSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSNfSlNPVnNFMjFFZHVEQTZEbnpTeWNLUSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0Z3dkw4VTIxRWR1REE2RG56U3ljS1EiIGlkPSItQlF2QWZ0OEtSbk91SzMyTkl0Wkc0USIgdXJpPSJyb2xlcy9uZXdfcm9sZV8xLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0g0cFRvRTIxRWR1REE2RG56U3ljS1EiIGlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgdXJpPSJ0YXNrcy9uZXdfdGFzayUyMDEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSlJYYUVVMjFFZHVEQTZEbnpTeWNLUSIgaWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9jcC9tb2RlbC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiB4bWk6aWQ9Il81YlM1UUUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJQbHVnQSIgZ3VpZD0iXzViUzVRRTIwRWR1REE2RG56U3ljS1EiPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVFVMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ29udGVudCIgZ3VpZD0iXzViUzVRVTIwRWR1REE2RG56U3ljS1EiPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVRazIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il81YlM1UWsyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVRMDIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il81YlM1UTAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UkUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iXzViUzVSRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVSVTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfNWJTNVJVMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVJrMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il81YlM1UmsyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UjAyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJUb29scyIgZ3VpZD0iXzViUzVSMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVTRTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iXzViUzVTRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVTVTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il81YlM1U1UyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVNrMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iSGlkZGVuIiBndWlkPSJfNWJTNVNrMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il81YlM1UzAyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iXzViUzVTMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1VEUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iXzViUzVURTIwRWR1REE2RG56U3ljS1EiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfX2tTMzBFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iY29udGVudF9wYWNrYWdlXzEiIGd1aWQ9Il9fa1MzMEUyMEVkdURBNkRuelN5Y0tRIiBicmllZkRlc2NyaXB0aW9uPSIxIj4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGUiIHhtaTppZD0iX0JJWWd3RTIxRWR1REE2RG56U3ljS1EiIG5hbWU9Im5ld19yb2xlXzEiIGd1aWQ9Il9CSVlnd0UyMUVkdURBNkRuelN5Y0tRIiBicmllZkRlc2NyaXB0aW9uPSIxIiBwcmVzZW50YXRpb25OYW1lPSJOZXcgUm9sZSAxIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItQlF2QWZ0OEtSbk91SzMyTkl0Wkc0USIgaHJlZj0idW1hOi8vLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEjLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2siIHhtaTppZD0iX0dlclFBRTIxRWR1REE2RG56U3ljS1EiIG5hbWU9Im5ld190YXNrIDEiIGd1aWQ9Il9HZXJRQUUyMUVkdURBNkRuelN5Y0tRIiBicmllZkRlc2NyaXB0aW9uPSIxIiBwcmVzZW50YXRpb25OYW1lPSJOZXcgVGFzayAxIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgaHJlZj0idW1hOi8vLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEjLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXzViUzVUVTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgZ3VpZD0iXzViUzVUVTIwRWR1REE2RG56U3ljS1EiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIiBocmVmPSJ1bWE6Ly9fSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSNfSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il81YlM1VGsyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgZ3VpZD0iXzViUzVUazIwRWR1REE2RG56U3ljS1EiLz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXzViUzVUMDIwRWR1REE2RG56U3ljS1EiIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBndWlkPSJfNWJTNVQwMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0Evcm9sZXMvbmV3X3JvbGVfMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi9QbHVnQS9yb2xlcy9uZXdfcm9sZV8xLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE4YjMwYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi9QbHVnQS9yb2xlcy9uZXdfcm9sZV8xLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItQlF2QWZ0OEtSbk91SzMyTkl0Wkc0USIgbmFtZT0ibmV3X3JvbGVfMSxfQklZZ3dFMjFFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEiIGF1dGhvcnM9IjEiIGNoYW5nZURhdGU9IjIwMDYtMDktMjZUMTY6MTY6NDEuNTgwLTA3MDAiIGNoYW5nZURlc2NyaXB0aW9uPSIxIj4KLSAgPG1haW5EZXNjcmlwdGlvbj4xPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxza2lsbHM+MTwvc2tpbGxzPgotICA8YXNzaWdubWVudEFwcHJvYWNoZXM+MTwvYXNzaWdubWVudEFwcHJvYWNoZXM+Ci0gIDxzeW5vbnltcz4xPC9zeW5vbnltcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi9QbHVnQS90YXNrcy9uZXdfdGFzayAxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL1BsdWdBL3Rhc2tzL25ld190YXNrIDEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2EwMGExLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL1BsdWdBL3Rhc2tzL25ld190YXNrIDEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii0xQ3J1cWdQaEQ2ZmptTWxuTkdxcS1RIiBuYW1lPSJuZXdfdGFzayAxLF9HZXJRQUUyMUVkdURBNkRuelN5Y0tRIiBndWlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgY2hhbmdlRGF0ZT0iMjAwNi0wOS0yNlQxNjoxNzowMS45NzktMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+MTwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+MTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxwdXJwb3NlPjE8L3B1cnBvc2U+Ci0gIDxhbHRlcm5hdGl2ZXM+MTwvYWx0ZXJuYXRpdmVzPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ0EueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vY29uZmlndXJhdGlvbnMvQ29uZmlnQS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYjliZjUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vY29uZmlndXJhdGlvbnMvQ29uZmlnQS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSJfOGZkMDRFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ29uZmlnQSIgZ3VpZD0iXzhmZDA0RTIwRWR1REE2RG56U3ljS1EiPgotICA8bWV0aG9kUGx1Z2luU2VsZWN0aW9uIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UUUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVRFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVRVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UlUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVFrMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVSRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UTAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVIwMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVUVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1VGsyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVJrMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVUMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1U1UyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVNFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVTazIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI19fa1MzMEUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIGhyZWY9InVtYTovL19KUlJUY0UyMUVkdURBNkRuelN5Y0tRI19KUlJUY0UyMUVkdURBNkRuelN5Y0tRIi8+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL2xpYnJhcnkueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vbGlicmFyeS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlN2FiZjAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vbGlicmFyeS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il8zT3RzOEUyMEVkdURBNkRuelN5Y0tRIiBndWlkPSJfM090czhFMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iXzViZkdnVTIwRWR1REE2RG56U3ljS1EiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YmZHZ1UyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfM090czhVMjBFZHVEQTZEbnpTeWNLUSIgaWQ9Il8zT25tVUUyMEVkdURBNkRuelN5Y0tRIiB1cmk9IiIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzViZkdnazIwRWR1REE2RG56U3ljS1EiIGlkPSJfNWJmR2dVMjBFZHVEQTZEbnpTeWNLUSIgdXJpPSJQbHVnQS9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNWJsTklFMjBFZHVEQTZEbnpTeWNLUSIgaWQ9Il81YlM1UUUyMEVkdURBNkRuelN5Y0tRIiB1cmk9IlBsdWdBL3BsdWdpbi54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnkgeG1pOmlkPSJfM09ubVVFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iMTUwNzAybSIgZ3VpZD0iXzNPbm1VRTIwRWR1REE2RG56U3ljS1EiPgotICAgIDxtZXRob2RQbHVnaW5zIHhtaTppZD0iXzViUzVRRTIwRWR1REE2RG56U3ljS1EiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UUUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtLy5wcm9qZWN0IGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzkyZTU0Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPjE1MDcwMm08L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL1BsdWdBL2NhcGFiaWxpdHlwYXR0ZXJucy9jcG0vY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwbS9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjliMjlkMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwbS9jb250ZW50LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWciIG5hbWU9ImNwLF9KUlJUY1UyMUVkdURBNkRuelN5Y0tRIiBndWlkPSItaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyIgdmVyc2lvbj0iMS4wLjAiPgotICA8bWFpbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIG0KLSZsdDsvcCZndDs8L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPiZsdDtwJmd0OwotICAgIG0KLSZsdDsvcCZndDs8L2tleUNvbnNpZGVyYXRpb25zPgotICA8cHVycG9zZT4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPiZsdDtwJmd0OwotICAgIG0KLSZsdDsvcCZndDs8L2FsdGVybmF0aXZlcz4KLSAgPGhvd3RvU3RhZmY+Jmx0O3AmZ3Q7Ci0gICAgbQotJmx0Oy9wJmd0OzwvaG93dG9TdGFmZj4KLSAgPGV4dGVybmFsSWQ+bTwvZXh0ZXJuYWxJZD4KLSAgPHNjb3BlPiZsdDtwJmd0OwotICAgIG0KLSZsdDsvcCZndDs8L3Njb3BlPgotICA8dXNhZ2VOb3Rlcz4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC91c2FnZU5vdGVzPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9QbHVnQS9jYXBhYmlsaXR5cGF0dGVybnMvY3BtL21vZGVsLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9QbHVnQS9jYXBhYmlsaXR5cGF0dGVybnMvY3BtL21vZGVsLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RmOTMzMy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwbS9tb2RlbC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9KU09Wc0UyMUVkdURBNkRuelN5Y0tRIiBndWlkPSJfSlNPVnNFMjFFZHVEQTZEbnpTeWNLUSI+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSlNPVnNVMjFFZHVEQTZEbnpTeWNLUSIgaWQ9Ii1pNU9ZQ0t5SXRlV1YyWEgxRHQycWFnIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IHhtaTppZD0iX0pSUlRjRTIxRWR1REE2RG56U3ljS1EiIG5hbWU9ImNwbSIgZ3VpZD0iX0pSUlRjRTIxRWR1REE2RG56U3ljS1EiPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiB4bWk6aWQ9Il9KUlJUY1UyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJjcG0iIGd1aWQ9Il9KUlJUY1UyMUVkdURBNkRuelN5Y0tRIiBicmllZkRlc2NyaXB0aW9uPSJtIiBwcmVzZW50YXRpb25OYW1lPSJjcG0iPgotICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1pNU9ZQ0t5SXRlV1YyWEgxRHQycWFnIiBocmVmPSJ1bWE6Ly8taTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyMtaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyIvPgotICAgICAgPGRlZmF1bHRDb250ZXh0IGhyZWY9InVtYTovL18zT25tVUUyMEVkdURBNkRuelN5Y0tRI184ZmQwNEUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICA8dmFsaWRDb250ZXh0IGhyZWY9InVtYTovL18zT25tVUUyMEVkdURBNkRuelN5Y0tRI184ZmQwNEUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgPC9wcm9jZXNzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudD4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9QbHVnQS9wbHVnaW4ueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL1BsdWdBL3BsdWdpbi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNThjZjEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL1BsdWdBL3BsdWdpbi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il81YmZHZ1UyMEVkdURBNkRuelN5Y0tRIiBndWlkPSJfNWJmR2dVMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX0pTT1ZzRTIxRWR1REE2RG56U3ljS1EiIGhyZWY9InVtYTovL19KUlJUY0UyMUVkdURBNkRuelN5Y0tRI19KU09Wc0UyMUVkdURBNkRuelN5Y0tRIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRnd2TDhVMjFFZHVEQTZEbnpTeWNLUSIgaWQ9Ii1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIiB1cmk9InJvbGVzL25ld19yb2xlX20ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSDRwVG9FMjFFZHVEQTZEbnpTeWNLUSIgaWQ9Ii0xQ3J1cWdQaEQ2ZmptTWxuTkdxcS1RIiB1cmk9InRhc2tzL25ld190YXNrJTIwbS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9KUlhhRVUyMUVkdURBNkRuelN5Y0tRIiBpZD0iX0pSUlRjRTIxRWR1REE2RG56U3ljS1EiIHVyaT0iY2FwYWJpbGl0eXBhdHRlcm5zL2NwbS9tb2RlbC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiB4bWk6aWQ9Il81YlM1UUUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJQbHVnQSIgZ3VpZD0iXzViUzVRRTIwRWR1REE2RG56U3ljS1EiPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVFVMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ29udGVudCIgZ3VpZD0iXzViUzVRVTIwRWR1REE2RG56U3ljS1EiPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVRazIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il81YlM1UWsyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVRMDIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il81YlM1UTAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UkUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iXzViUzVSRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVSVTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfNWJTNVJVMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVJrMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il81YlM1UmsyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UjAyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJUb29scyIgZ3VpZD0iXzViUzVSMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVTRTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iXzViUzVTRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVTVTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il81YlM1U1UyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVNrMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iSGlkZGVuIiBndWlkPSJfNWJTNVNrMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il81YlM1UzAyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iXzViUzVTMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1VEUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iXzViUzVURTIwRWR1REE2RG56U3ljS1EiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfX2tTMzBFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iY29udGVudF9wYWNrYWdlXzEiIGd1aWQ9Il9fa1MzMEUyMEVkdURBNkRuelN5Y0tRIiBicmllZkRlc2NyaXB0aW9uPSIxIj4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGUiIHhtaTppZD0iX0JJWWd3RTIxRWR1REE2RG56U3ljS1EiIG5hbWU9Im5ld19yb2xlX20iIGd1aWQ9Il9CSVlnd0UyMUVkdURBNkRuelN5Y0tRIiBicmllZkRlc2NyaXB0aW9uPSJtIiBwcmVzZW50YXRpb25OYW1lPSJOZXcgUm9sZSBtIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItQlF2QWZ0OEtSbk91SzMyTkl0Wkc0USIgaHJlZj0idW1hOi8vLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEjLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2siIHhtaTppZD0iX0dlclFBRTIxRWR1REE2RG56U3ljS1EiIG5hbWU9Im5ld190YXNrIG0iIGd1aWQ9Il9HZXJRQUUyMUVkdURBNkRuelN5Y0tRIiBicmllZkRlc2NyaXB0aW9uPSJtIiBwcmVzZW50YXRpb25OYW1lPSJOZXcgVGFzayBtIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgaHJlZj0idW1hOi8vLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEjLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXzViUzVUVTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgZ3VpZD0iXzViUzVUVTIwRWR1REE2RG56U3ljS1EiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIiBocmVmPSJ1bWE6Ly9fSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSNfSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il81YlM1VGsyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgZ3VpZD0iXzViUzVUazIwRWR1REE2RG56U3ljS1EiLz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXzViUzVUMDIwRWR1REE2RG56U3ljS1EiIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBndWlkPSJfNWJTNVQwMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL1BsdWdBL3JvbGVzL25ld19yb2xlX20ueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL1BsdWdBL3JvbGVzL25ld19yb2xlX20ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGI1NWY4Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9QbHVnQS9yb2xlcy9uZXdfcm9sZV9tLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEiIG5hbWU9Im5ld19yb2xlX20sX0JJWWd3RTIxRWR1REE2RG56U3ljS1EiIGd1aWQ9Ii1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIiBhdXRob3JzPSJtIiBjaGFuZ2VEYXRlPSIyMDA2LTA5LTI2VDE2OjE2OjQxLjU4MC0wNzAwIiBjaGFuZ2VEZXNjcmlwdGlvbj0iMSIgdmVyc2lvbj0iMS4wLjAiPgotICA8bWFpbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIG0KLSZsdDsvcCZndDs8L21haW5EZXNjcmlwdGlvbj4KLSAgPHNraWxscz4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9za2lsbHM+Ci0gIDxhc3NpZ25tZW50QXBwcm9hY2hlcz4xPC9hc3NpZ25tZW50QXBwcm9hY2hlcz4KLSAgPHN5bm9ueW1zPjE8L3N5bm9ueW1zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9QbHVnQS90YXNrcy9uZXdfdGFzayBtLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9QbHVnQS90YXNrcy9uZXdfdGFzayBtLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc2MDQ5ZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vUGx1Z0EvdGFza3MvbmV3X3Rhc2sgbS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii0xQ3J1cWdQaEQ2ZmptTWxuTkdxcS1RIiBuYW1lPSJuZXdfdGFzayBtLF9HZXJRQUUyMUVkdURBNkRuelN5Y0tRIiBndWlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgY2hhbmdlRGF0ZT0iMjAwNi0wOS0yNlQxNjoxNzowMS45NzktMDcwMCIgdmVyc2lvbj0iMS4wLjAiPgotICA8bWFpbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIG0KLSZsdDsvcCZndDs8L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPiZsdDtwJmd0OwotICAgIG0KLSZsdDsvcCZndDs8L2tleUNvbnNpZGVyYXRpb25zPgotICA8cHVycG9zZT4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPiZsdDtwJmd0OwotICAgIG0KLSZsdDsvcCZndDs8L2FsdGVybmF0aXZlcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vY29uZmlndXJhdGlvbnMvQ29uZmlnQS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vY29uZmlndXJhdGlvbnMvQ29uZmlnQS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYjliZjUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ0EueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iXzhmZDA0RTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkNvbmZpZ0EiIGd1aWQ9Il84ZmQwNEUyMEVkdURBNkRuelN5Y0tRIj4KLSAgPG1ldGhvZFBsdWdpblNlbGVjdGlvbiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVURTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UVUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVJVMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVRazIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UkUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVEwMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVSMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1VFUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVRrMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVSazIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1VDAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVNVMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVTRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1U2syMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfX2tTMzBFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSNfSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSIvPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vbGlicmFyeS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vbGlicmFyeS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlN2FiZjAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL2xpYnJhcnkueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfM090czhFMjBFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iXzNPdHM4RTIwRWR1REE2RG56U3ljS1EiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il81YmZHZ1UyMEVkdURBNkRuelN5Y0tRIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJmR2dVMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzNPdHM4VTIwRWR1REE2RG56U3ljS1EiIGlkPSJfM09ubVVFMjBFZHVEQTZEbnpTeWNLUSIgdXJpPSIiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il81YmZHZ2syMEVkdURBNkRuelN5Y0tRIiBpZD0iXzViZkdnVTIwRWR1REE2RG56U3ljS1EiIHVyaT0iUGx1Z0EvcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzVibE5JRTIwRWR1REE2RG56U3ljS1EiIGlkPSJfNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSIgdXJpPSJQbHVnQS9wbHVnaW4ueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5IHhtaTppZD0iXzNPbm1VRTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IjE1MDcwMm0iIGd1aWQ9Il8zT25tVUUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICA8bWV0aG9kUGx1Z2lucyB4bWk6aWQ9Il81YlM1UUUyMEVkdURBNkRuelN5Y0tRIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMyLnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzIudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMjc5NTYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzIudGMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0PgotCQotCTxDb3B5TGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNTc5MzJnb2xkZW4iPgotCTwvQ29weUxpYnJhcnk+CQotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNTc5MzJnb2xkZW4iPgotCTwvT3BlbkxpYnJhcnk+Ci0KLQk8Q29weUxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTU3OTMybSI+Ci0JPC9Db3B5TGlicmFyeT4JCi0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE1NzkzMm0iPgotCTwvT3BlbkxpYnJhcnk+Ci0JCi0JPEltcG9ydFhtbCBpbXBvcnRGb2xkZXJOYW1lPSIxNTc5MzJlIj4KLQk8L0ltcG9ydFhtbD4KLQkKLQk8Q29tcGFyZVRvTGlicmFyeSAKLQkJZ29sZGVuTGliRm9sZGVyTmFtZT0iMTU3OTMyZ29sZGVuIiAKLQkJZGlmZkNvdW50PSIwIiAKLQkJZWxlbWVudENvdW50PSIzMyIKLQkJdXNlTmFtZUFzSWQ9InRydWUiPgkJCi0JPC9Db21wYXJlVG9MaWJyYXJ5PgotCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMyZS8xNTc5MzJlLnhtbCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMyZS8xNTc5MzJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg3M2U5Zi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmUvMTU3OTMyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08dW1hOk1ldGhvZExpYnJhcnkgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6dW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMiIG5hbWU9IjE1NzkzMm0iIGJyaWVmRGVzY3JpcHRpb249IiIgaWQ9Il9lR2gyb0UyckVkdVdKZGZaOWduNkpRIiBvcmRlcmluZ0d1aWRlPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgdG9vbD0iZXBmPTEuMi4wIj4KLSAgPE1ldGhvZFBsdWdpbiBuYW1lPSJuZXdfcGx1Zy1pbiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBpZD0iX2Y0OFBjRTJyRWR1V0pkZlo5Z242SlEiIG9yZGVyaW5nR3VpZGU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiB1c2VyQ2hhbmdlYWJsZT0idHJ1ZSI+Ci0gICAgPE1ldGhvZFBhY2thZ2UgeHNpOnR5cGU9InVtYTpDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIiBuYW1lPSJDb250ZW50Q2F0ZWdvcmllcyIgaWQ9Il9rRXBhNEUyckVkdVdKZGZaOWduNkpRIi8+Ci0gIDwvTWV0aG9kUGx1Z2luPgotPC91bWE6TWV0aG9kTGlicmFyeT4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMyZ29sZGVuLy5wcm9qZWN0IGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJnb2xkZW4vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMzlhOGUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJnb2xkZW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT4xNTc5MzJnb2xkZW48L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJnb2xkZW4vbGlicmFyeS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmdvbGRlbi9saWJyYXJ5LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZjYjllOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmdvbGRlbi9saWJyYXJ5LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX3BvWlhVRTJyRWR1aUc1M05xdkU0SGciIGd1aWQ9Il9wb1pYVUUyckVkdWlHNTNOcXZFNEhnIj4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfcWJmb01FMnJFZHVpRzUzTnF2RTRIZyIgaHJlZj0idW1hOi8vX3FiWmhrRTJyRWR1aUc1M05xdkU0SGcjX3FiZm9NRTJyRWR1aUc1M05xdkU0SGciLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfMjBTSjBFMnJFZHV3ME91bE1iMkoydyIgaHJlZj0idW1hOi8vX2Y0OFBjRTJyRWR1V0pkZlo5Z242SlEjXzIwU0owRTJyRWR1dzBPdWxNYjJKMnciLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9wb2xra0UyckVkdWlHNTNOcXZFNEhnIiBpZD0iX3BvVFFzRTJyRWR1aUc1M05xdkU0SGciIHVyaT0iIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfcWJmb01VMnJFZHVpRzUzTnF2RTRIZyIgaWQ9Il9xYmZvTUUyckVkdWlHNTNOcXZFNEhnIiB1cmk9Im5ld19wbHVnLWluL3BsdWdpbi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9xYmZvTWsyckVkdWlHNTNOcXZFNEhnIiBpZD0iX3FiWmhrRTJyRWR1aUc1M05xdkU0SGciIHVyaT0ibmV3X3BsdWctaW5fcmVuYW1lZC9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfMjBTSjBVMnJFZHV3ME91bE1iMkoydyIgaWQ9Il8yMFNKMEUyckVkdXcwT3VsTWIySjJ3IiB1cmk9Im5ld19wbHVnLWluL3BsdWdpbi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il8yMFNKMGsyckVkdXcwT3VsTWIySjJ3IiBpZD0iX2Y0OFBjRTJyRWR1V0pkZlo5Z242SlEiIHVyaT0ibmV3X3BsdWctaW4vcGx1Z2luLnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeSB4bWk6aWQ9Il9lR2gyb0UyckVkdVdKZGZaOWduNkpRIiBuYW1lPSIxNTc5MzJtIiBndWlkPSJfZUdoMm9FMnJFZHVXSmRmWjlnbjZKUSI+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfcWJaaGtFMnJFZHVpRzUzTnF2RTRIZyIgaHJlZj0idW1hOi8vX3FiWmhrRTJyRWR1aUc1M05xdkU0SGcjX3FiWmhrRTJyRWR1aUc1M05xdkU0SGciLz4KLSAgICA8bWV0aG9kUGx1Z2lucyB4bWk6aWQ9Il9mNDhQY0UyckVkdVdKZGZaOWduNkpRIiBocmVmPSJ1bWE6Ly9fZjQ4UGNFMnJFZHVXSmRmWjlnbjZKUSNfZjQ4UGNFMnJFZHVXSmRmWjlnbjZKUSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMyZ29sZGVuL25ld19wbHVnLWluL3BsdWdpbi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmdvbGRlbi9uZXdfcGx1Zy1pbi9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTlmOTgxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMyZ29sZGVuL25ld19wbHVnLWluL3BsdWdpbi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il8yMFNKMEUyckVkdXcwT3VsTWIySjJ3IiBndWlkPSJfMjBTSjBFMnJFZHV3ME91bE1iMkoydyIvPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4geG1pOmlkPSJfZjQ4UGNFMnJFZHVXSmRmWjlnbjZKUSIgbmFtZT0ibmV3X3BsdWctaW4iIGd1aWQ9Il9mNDhQY0UyckVkdVdKZGZaOWduNkpRIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzJ6NXZVRTJyRWR1dzBPdWxNYjJKMnciIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il8yejV2VUUyckVkdXcwT3VsTWIySjJ3Ij4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8yejV2VVUyckVkdXcwT3VsTWIySjJ3IiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfMno1dlVVMnJFZHV3ME91bE1iMkoydyI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8yejV2VWsyckVkdXcwT3VsTWIySjJ3IiBuYW1lPSJEb21haW5zIiBndWlkPSJfMno1dlVrMnJFZHV3ME91bE1iMkoydyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfMno1dlUwMnJFZHV3ME91bE1iMkoydyIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il8yejV2VTAyckVkdXcwT3VsTWIySjJ3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8yejV2VkUyckVkdXcwT3VsTWIySjJ3IiBuYW1lPSJSb2xlU2V0cyIgZ3VpZD0iXzJ6NXZWRTJyRWR1dzBPdWxNYjJKMnciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzJ6NXZWVTJyRWR1dzBPdWxNYjJKMnciIG5hbWU9IldQIFR5cGVzIiBndWlkPSJfMno1dlZVMnJFZHV3ME91bE1iMkoydyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfMno1dlZrMnJFZHV3ME91bE1iMkoydyIgbmFtZT0iVG9vbHMiIGd1aWQ9Il8yejV2VmsyckVkdXcwT3VsTWIySjJ3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8yejV2VjAyckVkdXcwT3VsTWIySjJ3IiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il8yejV2VjAyckVkdXcwT3VsTWIySjJ3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8yejV2V0UyckVkdXcwT3VsTWIySjJ3IiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfMno1dldFMnJFZHV3ME91bE1iMkoydyI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzJ6NXZXVTJyRWR1dzBPdWxNYjJKMnciIG5hbWU9IkhpZGRlbiIgZ3VpZD0iXzJ6NXZXVTJyRWR1dzBPdWxNYjJKMnciPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfMno1dldrMnJFZHV3ME91bE1iMkoydyIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il8yejV2V2syckVkdXcwT3VsTWIySjJ3IiBwcmVzZW50YXRpb25OYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIvPgotICAgICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzJ6NXZXMDJyRWR1dzBPdWxNYjJKMnciIG5hbWU9IkNvcmVDb250ZW50IiBndWlkPSJfMno1dlcwMnJFZHV3ME91bE1iMkoydyIvPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXzJ6NXZYRTJyRWR1dzBPdWxNYjJKMnciIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgZ3VpZD0iXzJ6NXZYRTJyRWR1dzBPdWxNYjJKMnciLz4KLSAgICA8L21ldGhvZFBhY2thZ2VzPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfMno1dlhVMnJFZHV3ME91bE1iMkoydyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGd1aWQ9Il8yejV2WFUyckVkdXcwT3VsTWIySjJ3Ii8+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il8yejV2WGsyckVkdXcwT3VsTWIySjJ3IiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgZ3VpZD0iXzJ6NXZYazJyRWR1dzBPdWxNYjJKMnciLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMyZ29sZGVuL25ld19wbHVnLWluX3JlbmFtZWQvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMyZ29sZGVuL25ld19wbHVnLWluX3JlbmFtZWQvcGx1Z2luLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM4NjBjYi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmdvbGRlbi9uZXdfcGx1Zy1pbl9yZW5hbWVkL3BsdWdpbi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9xYmZvTUUyckVkdWlHNTNOcXZFNEhnIiBndWlkPSJfcWJmb01FMnJFZHVpRzUzTnF2RTRIZyIvPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4geG1pOmlkPSJfcWJaaGtFMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0ibmV3X3BsdWctaW5fcmVuYW1lZCIgZ3VpZD0iX3FiWmhrRTJyRWR1aUc1M05xdkU0SGciPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaGtVMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iQ29udGVudCIgZ3VpZD0iX3FiWmhrVTJyRWR1aUc1M05xdkU0SGciPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhrazJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il9xYlpoa2syckVkdWlHNTNOcXZFNEhnIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhrMDJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il9xYlpoazAyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobEUyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iX3FiWmhsRTJyRWR1aUc1M05xdkU0SGciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhsVTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfcWJaaGxVMnJFZHVpRzUzTnF2RTRIZyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaGxrMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il9xYlpobGsyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobDAyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJUb29scyIgZ3VpZD0iX3FiWmhsMDJyRWR1aUc1M05xdkU0SGciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhtRTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iX3FiWmhtRTJyRWR1aUc1M05xdkU0SGciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhtVTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il9xYlpobVUyckVkdWlHNTNOcXZFNEhnIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaG1rMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iSGlkZGVuIiBndWlkPSJfcWJaaG1rMnJFZHVpRzUzTnF2RTRIZyI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il9xYlpobTAyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iX3FiWmhtMDJyRWR1aUc1M05xdkU0SGciIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yaWVzIi8+Ci0gICAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaG5FMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iQ29yZUNvbnRlbnQiIGd1aWQ9Il9xYlpobkUyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfcWJaaG5VMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBndWlkPSJfcWJaaG5VMnJFZHVpRzUzTnF2RTRIZyIvPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobmsyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgZ3VpZD0iX3FiWmhuazJyRWR1aUc1M05xdkU0SGciLz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX3FiWmhuMDJyRWR1aUc1M05xdkU0SGciIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBndWlkPSJfcWJaaG4wMnJFZHVpRzUzTnF2RTRIZyIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJtLy5wcm9qZWN0IGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJtLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzIyZTRhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMybS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPjE1NzkzMm08L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJtL2xpYnJhcnkueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJtL2xpYnJhcnkueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2Y0NjliLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMybS9saWJyYXJ5LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX3BvWlhVRTJyRWR1aUc1M05xdkU0SGciIGd1aWQ9Il9wb1pYVUUyckVkdWlHNTNOcXZFNEhnIj4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfcWJmb01FMnJFZHVpRzUzTnF2RTRIZyIgaHJlZj0idW1hOi8vX3FiWmhrRTJyRWR1aUc1M05xdkU0SGcjX3FiZm9NRTJyRWR1aUc1M05xdkU0SGciLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9wb2xra0UyckVkdWlHNTNOcXZFNEhnIiBpZD0iX3BvVFFzRTJyRWR1aUc1M05xdkU0SGciIHVyaT0iIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfcWJmb01VMnJFZHVpRzUzTnF2RTRIZyIgaWQ9Il9xYmZvTUUyckVkdWlHNTNOcXZFNEhnIiB1cmk9Im5ld19wbHVnLWluL3BsdWdpbi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9xYmZvTWsyckVkdWlHNTNOcXZFNEhnIiBpZD0iX3FiWmhrRTJyRWR1aUc1M05xdkU0SGciIHVyaT0ibmV3X3BsdWctaW4vcGx1Z2luLnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeSB4bWk6aWQ9Il9wb1RRc0UyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSIxNTc5MzJtIiBndWlkPSJfcG9UUXNFMnJFZHVpRzUzTnF2RTRIZyI+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfcWJaaGtFMnJFZHVpRzUzTnF2RTRIZyIgaHJlZj0idW1hOi8vX3FiWmhrRTJyRWR1aUc1M05xdkU0SGcjX3FiWmhrRTJyRWR1aUc1M05xdkU0SGciLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnk+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMm0vbmV3X3BsdWctaW4vcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMybS9uZXdfcGx1Zy1pbi9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTZiNTdiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMybS9uZXdfcGx1Zy1pbi9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfcWJmb01FMnJFZHVpRzUzTnF2RTRIZyIgZ3VpZD0iX3FiZm9NRTJyRWR1aUc1M05xdkU0SGciLz4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIHhtaTppZD0iX3FiWmhrRTJyRWR1aUc1M05xdkU0SGciIG5hbWU9Im5ld19wbHVnLWluIiBndWlkPSJfcWJaaGtFMnJFZHVpRzUzTnF2RTRIZyI+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpoa1UyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJDb250ZW50IiBndWlkPSJfcWJaaGtVMnJFZHVpRzUzTnF2RTRIZyI+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaGtrMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iQ2F0ZWdvcmllcyIgZ3VpZD0iX3FiWmhrazJyRWR1aUc1M05xdkU0SGciPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaGswMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iRG9tYWlucyIgZ3VpZD0iX3FiWmhrMDJyRWR1aUc1M05xdkU0SGciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhsRTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkRpc2NpcGxpbmVzIiBndWlkPSJfcWJaaGxFMnJFZHVpRzUzTnF2RTRIZyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaGxVMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iUm9sZVNldHMiIGd1aWQ9Il9xYlpobFUyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobGsyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJXUCBUeXBlcyIgZ3VpZD0iX3FiWmhsazJyRWR1aUc1M05xdkU0SGciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhsMDJyRWR1aUc1M05xdkU0SGciIG5hbWU9IlRvb2xzIiBndWlkPSJfcWJaaGwwMnJFZHVpRzUzTnF2RTRIZyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaG1FMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBndWlkPSJfcWJaaG1FMnJFZHVpRzUzTnF2RTRIZyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaG1VMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcmllcyIgZ3VpZD0iX3FiWmhtVTJyRWR1aUc1M05xdkU0SGciPgotICAgICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobWsyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJIaWRkZW4iIGd1aWQ9Il9xYlpobWsyckVkdWlHNTNOcXZFNEhnIj4KLSAgICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIHhtaTppZD0iX3FiWmhtMDJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkN1c3RvbSBDYXRlZ29yaWVzIiBndWlkPSJfcWJaaG0wMnJFZHVpRzUzTnF2RTRIZyIvPgotICAgICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhuRTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkNvcmVDb250ZW50IiBndWlkPSJfcWJaaG5FMnJFZHVpRzUzTnF2RTRIZyIvPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX3FiWmhuVTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgZ3VpZD0iX3FiWmhuVTJyRWR1aUc1M05xdkU0SGciLz4KLSAgICA8L21ldGhvZFBhY2thZ2VzPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfcWJaaG5rMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGd1aWQ9Il9xYlpobmsyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobjAyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgZ3VpZD0iX3FiWmhuMDJyRWR1aUc1M05xdkU0SGciLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjUudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1LnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDUzNTkwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjUudGMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0PgotCQotCTxDb3B5TGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNTg5MTNuMTU4OTI1Z29sZGVuIj4KLQk8L0NvcHlMaWJyYXJ5PgkKLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTU4OTEzbjE1ODkyNWdvbGRlbiI+Ci0JPC9PcGVuTGlicmFyeT4KLQotCTxDb3B5TGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNTg5MTNuMTU4OTI1bSI+Ci0JPC9Db3B5TGlicmFyeT4JCi0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE1ODkxM24xNTg5MjVtIj4KLQk8L09wZW5MaWJyYXJ5PgotCQotCTxJbXBvcnRYbWwgaW1wb3J0Rm9sZGVyTmFtZT0iMTU4OTEzbjE1ODkyNWUiPgotCTwvSW1wb3J0WG1sPgotCQotCTxDb21wYXJlVG9MaWJyYXJ5IAotCQlnb2xkZW5MaWJGb2xkZXJOYW1lPSIxNTg5MTNuMTU4OTI1Z29sZGVuIgotCQlkaWZmQ291bnQ9IjAiIAotCQllbGVtZW50Q291bnQ9IjIxIgotCQl1c2VOYW1lQXNJZD0idHJ1ZSI+CQkKLQk8L0NvbXBhcmVUb0xpYnJhcnk+Ci0KLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWUvMTU4OTEzbjE1ODkyNWUueG1sIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWUvMTU4OTEzbjE1ODkyNWUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2U2Y2UzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVlLzE1ODkxM24xNTg5MjVlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08dW1hOk1ldGhvZExpYnJhcnkgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6dW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMiIG5hbWU9IjE1ODkxM24xNTg5MjVtIiBicmllZkRlc2NyaXB0aW9uPSIiIGlkPSJfOHlnejBFNVFFZHVHa3FXR3p3cG43USIgb3JkZXJpbmdHdWlkZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIHRvb2w9ImVwZj0xLjIuMCI+Ci0gIDxNZXRob2RQbHVnaW4gbmFtZT0ibmV3X3BsdWctaW4iIGJyaWVmRGVzY3JpcHRpb249IiIgaWQ9Il8tUEREUUU1UUVkdUdrcVdHendwbjdRIiBvcmRlcmluZ0d1aWRlPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgdXNlckNoYW5nZWFibGU9InRydWUiPgotICAgIDxNZXRob2RQYWNrYWdlIHhzaTp0eXBlPSJ1bWE6Q29udGVudENhdGVnb3J5UGFja2FnZSIgbmFtZT0iQ29udGVudENhdGVnb3JpZXMiIGlkPSJfR1Q2NG9FNVJFZHVHa3FXR3p3cG43USIvPgotICAgIDxNZXRob2RQYWNrYWdlIHhzaTp0eXBlPSJ1bWE6Q29udGVudFBhY2thZ2UiIG5hbWU9Im5ld19jb250ZW50X3BhY2thZ2UiIGJyaWVmRGVzY3JpcHRpb249IiIgaWQ9Il9EMWZIVUU1UkVkdUdrcVdHendwbjdRIiBvcmRlcmluZ0d1aWRlPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBnbG9iYWw9ImZhbHNlIi8+Ci0gICAgPE1ldGhvZFBhY2thZ2UgeHNpOnR5cGU9InVtYTpQcm9jZXNzQ29tcG9uZW50IiBuYW1lPSJjcCIgYnJpZWZEZXNjcmlwdGlvbj0iIiBpZD0iX0NlTDlNRTVSRWR1R2txV0d6d3BuN1EiIG9yZGVyaW5nR3VpZGU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIGdsb2JhbD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIj4KLSAgICAgIDxQcm9jZXNzIHhzaTp0eXBlPSJ1bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIG5hbWU9ImNwIiBicmllZkRlc2NyaXB0aW9uPSIiIGlkPSJfQ2VMOU1VNVJFZHVHa3FXR3p3cG43USIgb3JkZXJpbmdHdWlkZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgcHJlc2VudGF0aW9uTmFtZT0iY3AiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNQbGFubmVkPSJ0cnVlIiBwcmVmaXg9IiIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIElzRW5hY3RhYmxlPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci0gICAgICAgIDxQcmVzZW50YXRpb24geHNpOnR5cGU9InVtYTpQcm9jZXNzRGVzY3JpcHRpb24iIG5hbWU9ImNwLF9DZUw5TVU1UkVkdUdrcVdHendwbjdRIiBicmllZkRlc2NyaXB0aW9uPSIiIGlkPSItdDcySndicXZLOXU0c3RqMzFicUNvZyIgb3JkZXJpbmdHdWlkZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIHVzYWdlR3VpZGFuY2U9IiIgZXh0ZXJuYWxJZD0iIj4KLSAgICAgICAgICA8TWFpbkRlc2NyaXB0aW9uPjwvTWFpbkRlc2NyaXB0aW9uPgotICAgICAgICAgIDxLZXlDb25zaWRlcmF0aW9ucz48L0tleUNvbnNpZGVyYXRpb25zPgotICAgICAgICAgIDxBbHRlcm5hdGl2ZXM+PC9BbHRlcm5hdGl2ZXM+Ci0gICAgICAgICAgPEhvd1RvU3RhZmY+PC9Ib3dUb1N0YWZmPgotICAgICAgICAgIDxQdXJwb3NlPjwvUHVycG9zZT4KLSAgICAgICAgICA8U2NvcGU+PC9TY29wZT4KLSAgICAgICAgICA8VXNhZ2VOb3Rlcz48L1VzYWdlTm90ZXM+Ci0gICAgICAgIDwvUHJlc2VudGF0aW9uPgotICAgICAgICA8RGVmYXVsdENvbnRleHQ+X0FnQm5ZRTVSRWR1R2txV0d6d3BuN1E8L0RlZmF1bHRDb250ZXh0PgotICAgICAgICA8VmFsaWRDb250ZXh0Pl9BZ0JuWUU1UkVkdUdrcVdHendwbjdRPC9WYWxpZENvbnRleHQ+Ci0gICAgICA8L1Byb2Nlc3M+Ci0gICAgPC9NZXRob2RQYWNrYWdlPgotICA8L01ldGhvZFBsdWdpbj4KLSAgPE1ldGhvZENvbmZpZ3VyYXRpb24gbmFtZT0iYyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBpZD0iX0FnQm5ZRTVSRWR1R2txV0d6d3BuN1EiIG9yZGVyaW5nR3VpZGU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIj4KLSAgICA8TWV0aG9kUGx1Z2luU2VsZWN0aW9uPl8tUEREUUU1UUVkdUdrcVdHendwbjdRPC9NZXRob2RQbHVnaW5TZWxlY3Rpb24+Ci0gICAgPE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24+X0NlTDlNRTVSRWR1R2txV0d6d3BuN1E8L01ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci0gICAgPE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Xy1QRERUVTVRRWR1R2txV0d6d3BuN1E8L01ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci0gICAgPE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Xy1QRERRVTVRRWR1R2txV0d6d3BuN1E8L01ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci0gIDwvTWV0aG9kQ29uZmlndXJhdGlvbj4KLTwvdW1hOk1ldGhvZExpYnJhcnk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuLy5wcm9qZWN0IGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY4ZDc2Yy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+MTU4OTEzbjE1ODkyNWdvbGRlbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL2NvbmZpZ3VyYXRpb25zL2MueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi9jb25maWd1cmF0aW9ucy9jLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWExMzIwZi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL2NvbmZpZ3VyYXRpb25zL2MueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iX0FnQm5ZRTVSRWR1R2txV0d6d3BuN1EiIG5hbWU9ImMiIGd1aWQ9Il9BZ0JuWUU1UkVkdUdrcVdHendwbjdRIj4KLSAgPG1ldGhvZFBsdWdpblNlbGVjdGlvbiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFFFNVFFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERUVTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREUVU1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIGhyZWY9InVtYTovL19MYnNxd0U1UkVkdUdrcVdHendwbjdRI19MYnNxd0U1UkVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIGhyZWY9InVtYTovL19DZUw5TUU1UkVkdUdrcVdHendwbjdRI19DZUw5TUU1UkVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFRFNVFFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERSVTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREUWs1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFJFNVFFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERRMDVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREUjA1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFRrNVFFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERSazVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREVDA1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFNVNVFFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERTRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREU2s1UUVkdUdrcVdHendwbjdRIi8+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbGlicmFyeS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL2xpYnJhcnkueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmY1ZjA2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbGlicmFyeS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il84ekZia0U1UUVkdUdrcVdHendwbjdRIiBndWlkPSJfOHpGYmtFNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iXy1QSko0VTVRRWR1R2txV0d6d3BuN1EiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEpKNFU1UUVkdUdrcVdHendwbjdRIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfOHpSbzBFNVFFZHVHa3FXR3p3cG43USIgaWQ9Il84eWd6MEU1UUVkdUdrcVdHendwbjdRIiB1cmk9IiIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXy1QSko0azVRRWR1R2txV0d6d3BuN1EiIGlkPSJfLVBKSjRVNVFFZHVHa3FXR3p3cG43USIgdXJpPSJuZXdfcGx1Zy1pbi9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfLVBKSjQwNVFFZHVHa3FXR3p3cG43USIgaWQ9Il8tUEREUUU1UUVkdUdrcVdHendwbjdRIiB1cmk9Im5ld19wbHVnLWluL3BsdWdpbi54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnkgeG1pOmlkPSJfOHlnejBFNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iMTU4OTEzbjE1ODkyNW0iIGd1aWQ9Il84eWd6MEU1UUVkdUdrcVdHendwbjdRIj4KLSAgICA8bWV0aG9kUGx1Z2lucyB4bWk6aWQ9Il8tUEREUUU1UUVkdUdrcVdHendwbjdRIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFFFNVFFZHVHa3FXR3p3cG43USIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi9uZXdfcGx1Zy1pbi9jYXBhYmlsaXR5cGF0dGVybnMvY3AvY29udGVudC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmN2ZlYmQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi9uZXdfcGx1Zy1pbi9jYXBhYmlsaXR5cGF0dGVybnMvY3AvY29udGVudC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLXQ3Mkp3YnF2Szl1NHN0ajMxYnFDb2ciIG5hbWU9ImNwLF9DZUw5TVU1UkVkdUdrcVdHendwbjdRIiBndWlkPSItdDcySndicXZLOXU0c3RqMzFicUNvZyIvPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi9uZXdfcGx1Zy1pbi9jYXBhYmlsaXR5cGF0dGVybnMvY3AvbW9kZWwueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi9uZXdfcGx1Zy1pbi9jYXBhYmlsaXR5cGF0dGVybnMvY3AvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTc5NzY2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX25xN2dvVTVSRWR1T29wcTVUZXZZYXciIGd1aWQ9Il9ucTdnb1U1UkVkdU9vcHE1VGV2WWF3Ij4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9ucTdnb2s1UkVkdU9vcHE1VGV2WWF3IiBpZD0iLXQ3Mkp3YnF2Szl1NHN0ajMxYnFDb2ciIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfQ2VMOU1FNVJFZHVHa3FXR3p3cG43USIgbmFtZT0iY3AiIGd1aWQ9Il9DZUw5TUU1UkVkdUdrcVdHendwbjdRIj4KLSAgICA8cHJvY2VzcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgeG1pOmlkPSJfQ2VMOU1VNVJFZHVHa3FXR3p3cG43USIgbmFtZT0iY3AiIGd1aWQ9Il9DZUw5TVU1UkVkdUdrcVdHendwbjdRIiBwcmVzZW50YXRpb25OYW1lPSJjcCI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXQ3Mkp3YnF2Szl1NHN0ajMxYnFDb2ciIGhyZWY9InVtYTovLy10NzJKd2Jxdks5dTRzdGozMWJxQ29nIy10NzJKd2Jxdks5dTRzdGozMWJxQ29nIi8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vXzh5Z3owRTVRRWR1R2txV0d6d3BuN1EjX0FnQm5ZRTVSRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vXzh5Z3owRTVRRWR1R2txV0d6d3BuN1EjX0FnQm5ZRTVSRWR1R2txV0d6d3BuN1EiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi9uZXdfcGx1Zy1pbi9jYXBhYmlsaXR5cGF0dGVybnMvY3BfcmVuYW1lZC9jb250ZW50LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwX3JlbmFtZWQvY29udGVudC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMDA3YjMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi9uZXdfcGx1Zy1pbi9jYXBhYmlsaXR5cGF0dGVybnMvY3BfcmVuYW1lZC9jb250ZW50LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItdkJkZnVpazV1amhKZVZLeXpWN19ZQSIgbmFtZT0iY3AsX0xic3F3VTVSRWR1R2txV0d6d3BuN1EiIGd1aWQ9Ii12QmRmdWlrNXVqaEplVkt5elY3X1lBIi8+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcF9yZW5hbWVkL21vZGVsLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwX3JlbmFtZWQvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjM0OTNiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwX3JlbmFtZWQvbW9kZWwueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfTGNSU2dVNVJFZHVHa3FXR3p3cG43USIgZ3VpZD0iX0xjUlNnVTVSRWR1R2txV0d6d3BuN1EiPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0xjUlNnazVSRWR1R2txV0d6d3BuN1EiIGlkPSItdkJkZnVpazV1amhKZVZLeXpWN19ZQSIgdXJpPSJjb250ZW50LnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCB4bWk6aWQ9Il9MYnNxd0U1UkVkdUdrcVdHendwbjdRIiBuYW1lPSJjcF9yZW5hbWVkIiBndWlkPSJfTGJzcXdFNVJFZHVHa3FXR3p3cG43USI+Ci0gICAgPHByb2Nlc3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIHhtaTppZD0iX0xic3F3VTVSRWR1R2txV0d6d3BuN1EiIG5hbWU9ImNwX3JlbmFtZWQiIGd1aWQ9Il9MYnNxd1U1UkVkdUdrcVdHendwbjdRIiBwcmVzZW50YXRpb25OYW1lPSJjcCI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXZCZGZ1aWs1dWpoSmVWS3l6VjdfWUEiIGhyZWY9InVtYTovLy12QmRmdWlrNXVqaEplVkt5elY3X1lBIy12QmRmdWlrNXVqaEplVkt5elY3X1lBIi8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vXzh5Z3owRTVRRWR1R2txV0d6d3BuN1EjX0FnQm5ZRTVSRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vXzh5Z3owRTVRRWR1R2txV0d6d3BuN1EjX0FnQm5ZRTVSRWR1R2txV0d6d3BuN1EiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi9uZXdfcGx1Zy1pbi9wbHVnaW4ueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi9uZXdfcGx1Zy1pbi9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTBhZTc0Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vcGx1Z2luLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iXy1QSko0VTVRRWR1R2txV0d6d3BuN1EiIGd1aWQ9Il8tUEpKNFU1UUVkdUdrcVdHendwbjdRIj4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfTGNSU2dVNVJFZHVHa3FXR3p3cG43USIgaHJlZj0idW1hOi8vX0xic3F3RTVSRWR1R2txV0d6d3BuN1EjX0xjUlNnVTVSRWR1R2txV0d6d3BuN1EiLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfbnE3Z29VNVJFZHVPb3BxNVRldllhdyIgaHJlZj0idW1hOi8vX0NlTDlNRTVSRWR1R2txV0d6d3BuN1EjX25xN2dvVTVSRWR1T29wcTVUZXZZYXciLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9MYnl4WVU1UkVkdUdrcVdHendwbjdRIiBpZD0iX0xic3F3RTVSRWR1R2txV0d6d3BuN1EiIHVyaT0iY2FwYWJpbGl0eXBhdHRlcm5zL2NwX3JlbmFtZWQvbW9kZWwueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfbnE3Z29FNVJFZHVPb3BxNVRldllhdyIgaWQ9Il9DZUw5TUU1UkVkdUdrcVdHendwbjdRIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9jcC9tb2RlbC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiB4bWk6aWQ9Il8tUEREUUU1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJuZXdfcGx1Zy1pbiIgZ3VpZD0iXy1QRERRRTVRRWR1R2txV0d6d3BuN1EiPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFFVNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iQ29udGVudCIgZ3VpZD0iXy1QRERRVTVRRWR1R2txV0d6d3BuN1EiPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERRazVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il8tUEREUWs1UUVkdUdrcVdHendwbjdRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERRMDVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il8tUEREUTA1UUVkdUdrcVdHendwbjdRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREUkU1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iXy1QRERSRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERSVTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfLVBERFJVNVFFZHVHa3FXR3p3cG43USIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFJrNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il8tUEREUms1UUVkdUdrcVdHendwbjdRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREUjA1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJUb29scyIgZ3VpZD0iXy1QRERSMDVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERTRTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iXy1QRERTRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERTVTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il8tUEREU1U1UUVkdUdrcVdHendwbjdRIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFNrNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iSGlkZGVuIiBndWlkPSJfLVBERFNrNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il8tUEREUzA1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iXy1QRERTMDVRRWR1R2txV0d6d3BuN1EiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yaWVzIi8+Ci0gICAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFRFNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iQ29yZUNvbnRlbnQiIGd1aWQ9Il8tUEREVEU1UUVkdUdrcVdHendwbjdRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0tScnVzRTVSRWR1R2txV0d6d3BuN1EiIG5hbWU9Im5ld19jb250ZW50X3BhY2thZ2VfcmVuYW1lZCIgZ3VpZD0iX0tScnVzRTVSRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0QxZkhVRTVSRWR1R2txV0d6d3BuN1EiIG5hbWU9Im5ld19jb250ZW50X3BhY2thZ2UiIGd1aWQ9Il9EMWZIVUU1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfLVBERFRVNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBndWlkPSJfLVBERFRVNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIHhtaTppZD0iX0xic3F3RTVSRWR1R2txV0d6d3BuN1EiIGhyZWY9InVtYTovL19MYnNxd0U1UkVkdUdrcVdHendwbjdRI19MYnNxd0U1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIHhtaTppZD0iX0NlTDlNRTVSRWR1R2txV0d6d3BuN1EiIGhyZWY9InVtYTovL19DZUw5TUU1UkVkdUdrcVdHendwbjdRI19DZUw5TUU1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXy1QRERUazVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBndWlkPSJfLVBERFRrNVFFZHVHa3FXR3p3cG43USIvPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfLVBERFQwNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGd1aWQ9Il8tUEREVDA1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2EyMzJjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+MTU4OTEzbjE1ODkyNW08L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNW0vY29uZmlndXJhdGlvbnMvYy54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS9jb25maWd1cmF0aW9ucy9jLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwYWM4Mi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS9jb25maWd1cmF0aW9ucy9jLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iX0FnQm5ZRTVSRWR1R2txV0d6d3BuN1EiIG5hbWU9ImMiIGd1aWQ9Il9BZ0JuWUU1UkVkdUdrcVdHendwbjdRIj4KLSAgPG1ldGhvZFBsdWdpblNlbGVjdGlvbiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFFFNVFFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERUVTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREUVU1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIGhyZWY9InVtYTovL19MYnNxd0U1UkVkdUdrcVdHendwbjdRI19MYnNxd0U1UkVkdUdrcVdHendwbjdRIi8+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL2xpYnJhcnkueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNW0vbGlicmFyeS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZjVmMDYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNW0vbGlicmFyeS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il84ekZia0U1UUVkdUdrcVdHendwbjdRIiBndWlkPSJfOHpGYmtFNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iXy1QSko0VTVRRWR1R2txV0d6d3BuN1EiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEpKNFU1UUVkdUdrcVdHendwbjdRIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfOHpSbzBFNVFFZHVHa3FXR3p3cG43USIgaWQ9Il84eWd6MEU1UUVkdUdrcVdHendwbjdRIiB1cmk9IiIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXy1QSko0azVRRWR1R2txV0d6d3BuN1EiIGlkPSJfLVBKSjRVNVFFZHVHa3FXR3p3cG43USIgdXJpPSJuZXdfcGx1Zy1pbi9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfLVBKSjQwNVFFZHVHa3FXR3p3cG43USIgaWQ9Il8tUEREUUU1UUVkdUdrcVdHendwbjdRIiB1cmk9Im5ld19wbHVnLWluL3BsdWdpbi54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnkgeG1pOmlkPSJfOHlnejBFNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iMTU4OTEzbjE1ODkyNW0iIGd1aWQ9Il84eWd6MEU1UUVkdUdrcVdHendwbjdRIj4KLSAgICA8bWV0aG9kUGx1Z2lucyB4bWk6aWQ9Il8tUEREUUU1UUVkdUdrcVdHendwbjdRIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFFFNVFFZHVHa3FXR3p3cG43USIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9jb250ZW50LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMwMDdiMy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS9uZXdfcGx1Zy1pbi9jYXBhYmlsaXR5cGF0dGVybnMvY3AvY29udGVudC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLXZCZGZ1aWs1dWpoSmVWS3l6VjdfWUEiIG5hbWU9ImNwLF9MYnNxd1U1UkVkdUdrcVdHendwbjdRIiBndWlkPSItdkJkZnVpazV1amhKZVZLeXpWN19ZQSIvPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNW0vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwL21vZGVsLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9tb2RlbC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YWQ2OGMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNW0vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX0xjUlNnVTVSRWR1R2txV0d6d3BuN1EiIGd1aWQ9Il9MY1JTZ1U1UkVkdUdrcVdHendwbjdRIj4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9MY1JTZ2s1UkVkdUdrcVdHendwbjdRIiBpZD0iLXZCZGZ1aWs1dWpoSmVWS3l6VjdfWUEiIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfTGJzcXdFNVJFZHVHa3FXR3p3cG43USIgbmFtZT0iY3AiIGd1aWQ9Il9MYnNxd0U1UkVkdUdrcVdHendwbjdRIj4KLSAgICA8cHJvY2VzcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgeG1pOmlkPSJfTGJzcXdVNVJFZHVHa3FXR3p3cG43USIgbmFtZT0iY3AiIGd1aWQ9Il9MYnNxd1U1UkVkdUdrcVdHendwbjdRIiBwcmVzZW50YXRpb25OYW1lPSJjcCI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXZCZGZ1aWs1dWpoSmVWS3l6VjdfWUEiIGhyZWY9InVtYTovLy12QmRmdWlrNXVqaEplVkt5elY3X1lBIy12QmRmdWlrNXVqaEplVkt5elY3X1lBIi8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vXzh5Z3owRTVRRWR1R2txV0d6d3BuN1EjX0FnQm5ZRTVSRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vXzh5Z3owRTVRRWR1R2txV0d6d3BuN1EjX0FnQm5ZRTVSRWR1R2txV0d6d3BuN1EiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNW0vbmV3X3BsdWctaW4vcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL25ld19wbHVnLWluL3BsdWdpbi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhM2ZkZWQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNW0vbmV3X3BsdWctaW4vcGx1Z2luLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iXy1QSko0VTVRRWR1R2txV0d6d3BuN1EiIGd1aWQ9Il8tUEpKNFU1UUVkdUdrcVdHendwbjdRIj4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfTGNSU2dVNVJFZHVHa3FXR3p3cG43USIgaHJlZj0idW1hOi8vX0xic3F3RTVSRWR1R2txV0d6d3BuN1EjX0xjUlNnVTVSRWR1R2txV0d6d3BuN1EiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9MYnl4WVU1UkVkdUdrcVdHendwbjdRIiBpZD0iX0xic3F3RTVSRWR1R2txV0d6d3BuN1EiIHVyaT0iY2FwYWJpbGl0eXBhdHRlcm5zL2NwL21vZGVsLnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIHhtaTppZD0iXy1QRERRRTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9Im5ld19wbHVnLWluIiBndWlkPSJfLVBERFFFNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREUVU1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJDb250ZW50IiBndWlkPSJfLVBERFFVNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFFrNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iQ2F0ZWdvcmllcyIgZ3VpZD0iXy1QRERRazVRRWR1R2txV0d6d3BuN1EiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFEwNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iRG9tYWlucyIgZ3VpZD0iXy1QRERRMDVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERSRTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkRpc2NpcGxpbmVzIiBndWlkPSJfLVBERFJFNVFFZHVHa3FXR3p3cG43USIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFJVNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iUm9sZVNldHMiIGd1aWQ9Il8tUEREUlU1UUVkdUdrcVdHendwbjdRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREUms1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJXUCBUeXBlcyIgZ3VpZD0iXy1QRERSazVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERSMDVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IlRvb2xzIiBndWlkPSJfLVBERFIwNVFFZHVHa3FXR3p3cG43USIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFNFNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBndWlkPSJfLVBERFNFNVFFZHVHa3FXR3p3cG43USIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFNVNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcmllcyIgZ3VpZD0iXy1QRERTVTVRRWR1R2txV0d6d3BuN1EiPgotICAgICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREU2s1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJIaWRkZW4iIGd1aWQ9Il8tUEREU2s1UUVkdUdrcVdHendwbjdRIj4KLSAgICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIHhtaTppZD0iXy1QRERTMDVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkN1c3RvbSBDYXRlZ29yaWVzIiBndWlkPSJfLVBERFMwNVFFZHVHa3FXR3p3cG43USIvPgotICAgICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERURTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkNvcmVDb250ZW50IiBndWlkPSJfLVBERFRFNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9LUnJ1c0U1UkVkdUdrcVdHendwbjdRIiBuYW1lPSJuZXdfY29udGVudF9wYWNrYWdlIiBndWlkPSJfS1JydXNFNVJFZHVHa3FXR3p3cG43USIvPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXy1QRERUVTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgZ3VpZD0iXy1QRERUVTVRRWR1R2txV0d6d3BuN1EiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9MYnNxd0U1UkVkdUdrcVdHendwbjdRIiBocmVmPSJ1bWE6Ly9fTGJzcXdFNVJFZHVHa3FXR3p3cG43USNfTGJzcXdFNVJFZHVHa3FXR3p3cG43USIvPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il8tUEREVGs1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgZ3VpZD0iXy1QRERUazVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXy1QRERUMDVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBndWlkPSJfLVBERFQwNVFFZHVHa3FXR3p3cG43USIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvLnByb2plY3QgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVkYjAxYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPlBhcmlzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQTEvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEExL2NvbnRlbnQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2Q4YmZlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQTEvY29udGVudC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTk4V1RXdXJCTVNpRWhoWkZJc3lra0EiIG5hbWU9IkNQIEExLF9kQmh2a1VBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSItOThXVFd1ckJNU2lFaGhaRklzeWtrQSIvPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBBMS9kaWFncmFtLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQTEvZGlhZ3JhbS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MTZkYjAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBBMS9kaWFncmFtLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpub3RhdGlvbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvcnVudGltZS8xLjAuMC9ub3RhdGlvbiIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpBY3Rpdml0eURldGFpbERpYWdyYW0geG1pOmlkPSJfSWNValFPeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19kQmh2a1VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtPgotICA8bm90YXRpb246RGlhZ3JhbSB4bWk6aWQ9Il9JY1VqUWV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSJBREQiIGVsZW1lbnQ9Il9JY1VqUU94NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJDUCBBMSIgbWVhc3VyZW1lbnRVbml0PSJQaXhlbCI+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246UGFnZVN0eWxlIiB4bWk6aWQ9Il9JY1VqUXV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246R3VpZGVTdHlsZSIgeG1pOmlkPSJfSWNValEteDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0ljVWpST3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgPC9ub3RhdGlvbjpEaWFncmFtPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0ljbTNPZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyIvPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZVRhc2tDb21wb3NpdGUiIHhtaTppZD0iX0ljbTNPdXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19nRjdVc1VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVOb2RlIiB4bWk6aWQ9Il9JY20zTy14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJSb2xlIEExIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19nRjdVc1VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpUYXNrTm9kZSIgeG1pOmlkPSJfSWNtM1BPeDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0ljbTNQLXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2sgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfZ0Y3VXNFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWNtM1BleDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWNtM1F1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0ljbTNQdXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19nRjdVc0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWNtM1AteDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWNtM1BPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JY20zUU94NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfZ0Y3VXMwQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWNtM1FleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2dHRWVvRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JY20zUXV4NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSWNtM1BleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2dGN1VzRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWNtM1EteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfZ0dFZW9rQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZVRhc2tDb21wb3NpdGUiIHhtaTppZD0iX0ljbTNST3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19qdlNCQUVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVOb2RlIiB4bWk6aWQ9Il9JY20zUmV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJSb2xlIEIxIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2p2U0JBRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlRhc2tOb2RlIiB4bWk6aWQ9Il9JY20zUnV4NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSWNtM1NleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iVGFzayBCMSBwcmVzbmV0Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19qQkZlUUVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JY20zUi14NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JY20zUy14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWNtM1NPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2pCRmVRRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JY20zU2V4NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JY20zUnV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0ljbTNTdXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFydGlmYWN0IEIxIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19qdlNCQWtBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWNtM1MteDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0ljbTNSLXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjIiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19qQkZlUUVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0ljbTNUT3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9Ik91dGNvbWUgQjEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2p2U0JCRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVUYXNrQ29tcG9zaXRlIiB4bWk6aWQ9Il9JY20zVGV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfanZTQkFVQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlTm9kZSIgeG1pOmlkPSJfSWNtM1R1eDRFZHUyT282cS1uSFdnZyIgbmFtZT0iUm9sZSBCMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19qdlNCQVVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpUYXNrTm9kZSIgeG1pOmlkPSJfSWNtM1QteDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0ljbTNVdXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2sgQjIgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfa1lqbmdFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWNtM1VPeDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWNtM1ZPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0ljbTNVZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19rWWpuZ0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWNtM1V1eDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWNtM1QteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JY20zVS14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBcnRpZmFjdCBCMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfa1lfc1lFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0ljbTNWT3g0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JY20zVU94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfa1lqbmdFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JY20zVmV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19rWV9zWWtBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlVGFza0NvbXBvc2l0ZSIgeG1pOmlkPSJfSWNtM1Z1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2dGN1Vza0F2RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0ljbTNWLXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JY20zV094NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfYTBna3dFQTNFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0ljbTNXT3g0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0ljbTNWLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWNtM1dleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2ExdGVvRUEzRWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JY20zV3V4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfYTBna3dFQTNFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JY20zVy14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19hM01zWUVBM0VkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtPgotICA8bm90YXRpb246RGlhZ3JhbSB4bWk6aWQ9Il9JY20zWE94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSJBREQiIGVsZW1lbnQ9Il9JY20zT2V4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBY3QxIiBtZWFzdXJlbWVudFVuaXQ9IlBpeGVsIj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0ljbTNZT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JY20zT3V4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWNtM1lleDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JY20zWXV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0ljbTNZLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWNtM1pPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWNtM1p1eDRFZHUyT282cS1uSFdnZyIgeD0iMjAiIHk9IjE2OSIgd2lkdGg9IjE1OCIgaGVpZ2h0PSI1MyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JY20zWi14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWNtM1B1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0ljbTNhT3g0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNtM2FleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JY20zYXV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0ljbTNhLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ljbTNiZXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ijg2IiB5PSIxIiB3aWR0aD0iODQiIGhlaWdodD0iMTQ4Ii8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0ljbTNidXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDIiIGVsZW1lbnQ9Il9JY20zUXV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWNtM2IteDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JY20zY094NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0ljbTNjZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWNtM2N1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWNtM2RPeDRFZHUyT282cS1uSFdnZyIgeD0iOTEiIHk9IjI0MiIgd2lkdGg9Ijc0IiBoZWlnaHQ9IjExMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JY20zZGV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWNtM1JPeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0ljbTNkdXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNtM2QteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JY20zZU94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0ljbTNlZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ljbTNlLXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjIwIiB5PSI3OTMiIHdpZHRoPSIxOTYiIGhlaWdodD0iNTMiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWNtM2ZPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0ljbTNTT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JY20zZmV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0ljbTNmdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWNtM2YteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JY20zZ094NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JY20zZ3V4NEVkdTJPbzZxLW5IV2dnIiB4PSIxMzAiIHk9IjcwNiIgd2lkdGg9IjczIiBoZWlnaHQ9IjY3Ii8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0ljbTNnLXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDIiIGVsZW1lbnQ9Il9JY20zUy14NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWNtM2hPeDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JY20zaGV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0ljbTNodXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWNtM2gteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWNzOXdPeDRFZHUyT282cS1uSFdnZyIgeD0iMTMwIiB5PSI4NjYiIHdpZHRoPSI3MyIgaGVpZ2h0PSIxMTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWNzOXdleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0ljbTNUZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JY3M5d3V4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0ljczl3LXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWNzOXhPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JY3M5eGV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JY3M5eC14NEVkdTJPbzZxLW5IV2dnIiB4PSIyMCIgeT0iMTEwNSIgd2lkdGg9IjE5NiIgaGVpZ2h0PSI1MyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JY3M5eU94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWNtM1VleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0ljczl5ZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNzOXl1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JY3M5eS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0ljczl6T3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ljczl6dXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEzMCIgeT0iMTAxOCIgd2lkdGg9IjczIiBoZWlnaHQ9IjY3Ii8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0ljczl6LXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDIiIGVsZW1lbnQ9Il9JY20zVk94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWNzOTBPeDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JY3M5MGV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0ljczkwdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWNzOTAteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWNzOTFleDRFZHUyT282cS1uSFdnZyIgeD0iMTMwIiB5PSIxMTc4IiB3aWR0aD0iNzMiIGhlaWdodD0iMTExIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0ljczkxdXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JY20zVnV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWNzOTEteDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JY3M5Mk94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0ljczkyZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWNzOTJ1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWNzOTNPeDRFZHUyT282cS1uSFdnZyIgeD0iMjAiIHk9IjQ4MSIgd2lkdGg9IjEyNCIgaGVpZ2h0PSI1MyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JY3M5M2V4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWNtM1YteDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0ljczkzdXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNzOTMteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JY3M5NE94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0ljczk0ZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ljczk0LXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ijc2IiB5PSIzOTQiIHdpZHRoPSI3NCIgaGVpZ2h0PSI2NyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JY3M5NU94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWNtM1d1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0ljczk1ZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNzOTV1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JY3M5NS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0ljczk2T3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ljczk2dXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ijc2IiB5PSI1NTQiIHdpZHRoPSI3NCIgaGVpZ2h0PSIxMTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlBhZ2VTdHlsZSIgeG1pOmlkPSJfSWNtM1hleDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkd1aWRlU3R5bGUiIHhtaTppZD0iX0ljbTNYdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JY20zWC14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gIDwvbm90YXRpb246RGlhZ3JhbT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQTEvbW9kZWwueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBBMS9tb2RlbC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZTJhZDYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBBMS9tb2RlbC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfZEYyTzRFQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX2RGMk80RUF2RWRxRnFJdTgtY2tvbGciPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2RGMk80VUF2RWRxRnFJdTgtY2tvbGciIGlkPSItOThXVFd1ckJNU2lFaGhaRklzeWtrQSIgdXJpPSJjb250ZW50LnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCB4bWk6aWQ9Il9kQmh2a0VBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJDUCBBMSIgZ3VpZD0iX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGciPgotICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9lWlN6d0VBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJBY3QxIiBndWlkPSJfZVpTendFQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiB4bWk6aWQ9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJBY3QxIiBndWlkPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyIgcHJlc2VudGF0aW9uTmFtZT0iQWN0MSIgc3VwZXJBY3Rpdml0aWVzPSJfZEJodmtVQXZFZHFGcUl1OC1ja29sZyIgYnJlYWtkb3duRWxlbWVudHM9Il9nRjdVc0VBdkVkcUZxSXU4LWNrb2xnIF9nRjdVc1VBdkVkcUZxSXU4LWNrb2xnIF9nRjdVc2tBdkVkcUZxSXU4LWNrb2xnIF9nRjdVczBBdkVkcUZxSXU4LWNrb2xnIF9nR0Vlb0VBdkVkcUZxSXU4LWNrb2xnIF9nR0Vlb1VBdkVkcUZxSXU4LWNrb2xnIF9nR0Vlb2tBdkVkcUZxSXU4LWNrb2xnIF9qQkZlUUVBdkVkcUZxSXU4LWNrb2xnIF9qdlNCQUVBdkVkcUZxSXU4LWNrb2xnIF9qdlNCQVVBdkVkcUZxSXU4LWNrb2xnIF9qdlNCQWtBdkVkcUZxSXU4LWNrb2xnIF9qdlNCQTBBdkVkcUZxSXU4LWNrb2xnIF9qdlNCQkVBdkVkcUZxSXU4LWNrb2xnIF9rWWpuZ0VBdkVkcUZxSXU4LWNrb2xnIF9rWV9zWUVBdkVkcUZxSXU4LWNrb2xnIF9rWV9zWVVBdkVkcUZxSXU4LWNrb2xnIF9rWV9zWWtBdkVkcUZxSXU4LWNrb2xnIF9hMGdrd0VBM0VkcUZxSXU4LWNrb2xnIF9hMXRlb0VBM0VkcUZxSXU4LWNrb2xnIF9hMmRGZ0VBM0VkcUZxSXU4LWNrb2xnIF9hM01zWUVBM0VkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il9nRjdVc0VBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJ0YXNrX0ExIiBndWlkPSJfZ0Y3VXNFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iX2dGN1Vza0F2RWRxRnFJdTgtY2tvbGciIG1hbmRhdG9yeUlucHV0PSJfZ0Y3VXMwQXZFZHFGcUl1OC1ja29sZyBfZ0dFZW9FQXZFZHFGcUl1OC1ja29sZyIgb3B0aW9uYWxJbnB1dD0iX2dHRWVvVUF2RWRxRnFJdTgtY2tvbGciIG91dHB1dD0iX2dHRWVva0F2RWRxRnFJdTgtY2tvbGciIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfZ0Y3VXNVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxUYXNrIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI183TThuc0EtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I190dkY0TUJCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I190emtJZ0JCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I191Q0JiUUJCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iX2dGN1VzVUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9InJvbGVfQTEiIGd1aWQ9Il9nRjdVc1VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEExIiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIiByZXNwb25zaWJsZUZvcj0iX2dHRWVvRUF2RWRxRnFJdTgtY2tvbGcgX2dHRWVvVUF2RWRxRnFJdTgtY2tvbGcgX2dHRWVva0F2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il9nRjdVc2tBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJyb2xlX0EyIiBndWlkPSJfZ0Y3VXNrQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiAiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNmszVUFBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfZ0Y3VXMwQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGd1aWQ9Il9nRjdVczBBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2dHRWVvRUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9ImFydGlmYWN0X0ExIiBndWlkPSJfZ0dFZW9FQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI185S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9nR0Vlb1VBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJkZWxpdmVyYWJsZV9BMSIgZ3VpZD0iX2dHRWVvVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIiBkZWxpdmVyYWJsZVBhcnRzPSJfZ0dFZW8wQXZFZHFGcUl1OC1ja29sZyBfZ0dFZXBFQXZFZHFGcUl1OC1ja29sZyBfZ0dFZXBVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0lJU25VQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2dHRWVva0F2RWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQTEiIGd1aWQ9Il9nR0Vlb2tBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2dHRWVvMEF2RWRxRnFJdTgtY2tvbGciIG5hbWU9ImFydGlmYWN0X0ExIiBndWlkPSJfZ0dFZW8wQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI185S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9nR0VlcEVBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgZ3VpZD0iX2dHRWVwRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRjUxeXdBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfZ0dFZXBVQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0ib3V0Y29tZV9BMSIgZ3VpZD0iX2dHRWVwVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS0FfMVlBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il9qQkZlUUVBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJ0YXNrX0IxIiBndWlkPSJfakJGZVFFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBCMSBwcmVzbmV0IiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iX2p2U0JBVUF2RWRxRnFJdTgtY2tvbGciIG1hbmRhdG9yeUlucHV0PSJfanZTQkFrQXZFZHFGcUl1OC1ja29sZyIgb3B0aW9uYWxJbnB1dD0iX2p2U0JBMEF2RWRxRnFJdTgtY2tvbGciIG91dHB1dD0iX2p2U0JCRUF2RWRxRnFJdTgtY2tvbGciIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfanZTQkFFQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxUYXNrIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19YVTZMVUI4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1sWWpyNlZpdEwxVm5uRk5PNzhYdVl3I19UNEFxQUI4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1sWWpyNlZpdEwxVm5uRk5PNzhYdVl3I19UNThqc0I4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1sWWpyNlZpdEwxVm5uRk5PNzhYdVl3I19UOFZKVUI4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iX2p2U0JBRUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9InJvbGVfQjEiIGd1aWQ9Il9qdlNCQUVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIxIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciIHJlc3BvbnNpYmxlRm9yPSJfanZTQkFrQXZFZHFGcUl1OC1ja29sZyBfanZTQkEwQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxSb2xlIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19BOURZZ0I4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iX2p2U0JBVUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9InJvbGVfQjIiIGd1aWQ9Il9qdlNCQVVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfS0NNX0lCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfanZTQkFrQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQjEiIGd1aWQ9Il9qdlNCQWtBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX21xSjNBQjhQRWRxc2hNTlNJMDdYT2ciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2p2U0JBMEF2RWRxRnFJdTgtY2tvbGciIG5hbWU9ImRlbGl2ZXJhYmxlX0IxIiBndWlkPSJfanZTQkEwQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIxIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciIGRlbGl2ZXJhYmxlUGFydHM9Il9qdmJLOEVBdkVkcUZxSXU4LWNrb2xnIF9qdmJLOFVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfWkhmMllCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfanZTQkJFQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0ib3V0Y29tZV9CMSIgZ3VpZD0iX2p2U0JCRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfY1hYcnNCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfanZiSzhFQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQjEiIGd1aWQ9Il9qdmJLOEVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjEgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX21xSjNBQjhQRWRxc2hNTlNJMDdYT2ciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2p2Yks4VUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQjEiIGd1aWQ9Il9qdmJLOFVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIxIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2NYWHJzQjhuRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgeG1pOmlkPSJfa1lqbmdFQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0idGFza19CMiIgZ3VpZD0iX2tZam5nRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyIgYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk9Il9qdlNCQUVBdkVkcUZxSXU4LWNrb2xnIiBtYW5kYXRvcnlJbnB1dD0iX2tZX3NZRUF2RWRxRnFJdTgtY2tvbGciIG9wdGlvbmFsSW5wdXQ9Il9rWV9zWVVBdkVkcUZxSXU4LWNrb2xnIiBvdXRwdXQ9Il9rWV9zWWtBdkVkcUZxSXU4LWNrb2xnIiBwZXJmb3JtZWRQcmltYXJpbHlCeT0iX2p2U0JBVUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8VGFzayBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfWkxPTXNCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tSjN6MElHZmplaGl0MHVGYlRKY2E3ZyNfb3FZc3dCODRFZHFOdmVseWJEWFpGUSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tSjN6MElHZmplaGl0MHVGYlRKY2E3ZyNfcXVRcEFCODRFZHFOdmVseWJEWFpGUSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tSjN6MElHZmplaGl0MHVGYlRKY2E3ZyNfcXl1NVVCODRFZHFOdmVseWJEWFpGUSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfa1lfc1lFQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQjIiIGd1aWQ9Il9rWV9zWUVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX195RzdjQjhtRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2tZX3NZVUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9ImRlbGl2ZXJhYmxlX0IyIiBndWlkPSJfa1lfc1lVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciIGRlbGl2ZXJhYmxlUGFydHM9Il9rWkpkWUVBdkVkcUZxSXU4LWNrb2xnIF9rWkpkWVVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfbnFGV0VCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfa1lfc1lrQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0ib3V0Y29tZV9CMiIgZ3VpZD0iX2tZX3NZa0F2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfYXNGT2tCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfa1pKZFlFQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQjIiIGd1aWQ9Il9rWkpkWUVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX195RzdjQjhtRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2taSmRZVUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQjIiIGd1aWQ9Il9rWkpkWVVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2FzRk9rQjhuRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgeG1pOmlkPSJfYTBna3dFQTNFZHFGcUl1OC1ja29sZyIgbmFtZT0idGFza19BMiIgZ3VpZD0iX2EwZ2t3RUEzRWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTIgIiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iX2dGN1VzVUF2RWRxRnFJdTgtY2tvbGciIG1hbmRhdG9yeUlucHV0PSJfYTF0ZW9FQTNFZHFGcUl1OC1ja29sZyIgb3B0aW9uYWxJbnB1dD0iX2EyZEZnRUEzRWRxRnFJdTgtY2tvbGciIG91dHB1dD0iX2EzTXNZRUEzRWRxRnFJdTgtY2tvbGciIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfZ0Y3VXNrQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxUYXNrIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI183NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190aTJCWUJCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190azdzRUJCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190bmRib0JCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9hMXRlb0VBM0VkcUZxSXU4LWNrb2xnIiBuYW1lPSJhcnRpZmFjdF9BMiIgZ3VpZD0iX2ExdGVvRUEzRWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfYTJkRmdFQTNFZHFGcUl1OC1ja29sZyIgbmFtZT0iZGVsaXZlcmFibGVfQTIiIGd1aWQ9Il9hMmRGZ0VBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyIgZGVsaXZlcmFibGVQYXJ0cz0iX2E0R0VRRUEzRWRxRnFJdTgtY2tvbGcgX2E0MXJJRUEzRWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19KQnFmVUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9hM01zWUVBM0VkcUZxSXU4LWNrb2xnIiBuYW1lPSJvdXRjb21lX0EyIiBndWlkPSJfYTNNc1lFQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9hNEdFUUVBM0VkcUZxSXU4LWNrb2xnIiBuYW1lPSJhcnRpZmFjdF9BMiIgZ3VpZD0iX2E0R0VRRUEzRWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfYTQxcklFQTNFZHFGcUl1OC1ja29sZyIgbmFtZT0ib3V0Y29tZV9BMiIgZ3VpZD0iX2E0MXJJRUEzRWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfd19URmtFQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZrRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfd19URmtVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZrVUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il93X1RGa2tBdkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URmswQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZrMEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9nRjdVc0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URmxFQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZsVUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGbFVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URmxrQXZFZHFGcUl1OC1ja29sZyIgeD0iMjAuMCIgeT0iMTY5LjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGbDBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URmwwQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2dGN1VzVUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGbUVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iMTU4LjAiIGhlaWdodD0iNTMuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZtVUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGbVVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URm1rQXZFZHFGcUl1OC1ja29sZyIgeD0iMjAuMCIgeT0iNDgxLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGbTBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URm0wQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2dGN1Vza0F2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGbkVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iMTI0LjAiIGhlaWdodD0iNTMuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZuVUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGblVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URm5rQXZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3dfVEZuMEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGbjBBdkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfZ0Y3VXMwQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3dfVEZvRUF2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGb1VBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URm9VQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEZva0F2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGbzBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URm8wQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2dHRWVvRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGcEVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfd19URnBVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZwVUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il93X1RGcGtBdkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URnAwQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZwMEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9nR0Vlb1VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URnFFQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZxVUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGcVVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URnFrQXZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3dfVEZxMEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGcTBBdkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfZ0dFZW9rQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3dfVEZyRUF2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGclVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnJVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEZya0F2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGcjBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnIwQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2pCRmVRRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGc0VBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfd19URnNVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZzVUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il93X1RGc2tBdkVkcUZxSXU4LWNrb2xnIiB4PSIyMC4wIiB5PSI3OTMuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3dfVEZzMEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGczBBdkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfanZTQkFFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3dfVEZ0RUF2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSIxOTYuMCIgaGVpZ2h0PSI1My4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfd19URnRVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZ0VUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il93X1RGdGtBdkVkcUZxSXU4LWNrb2xnIiB4PSIyMC4wIiB5PSIxMTA1LjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGdDBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnQwQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2p2U0JBVUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGdUVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iMTk2LjAiIGhlaWdodD0iNTMuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZ1VUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGdVVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URnVrQXZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3dfVEZ1MEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGdTBBdkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfanZTQkFrQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3dfVEZ2RUF2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGdlVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnZVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEZ2a0F2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGdjBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnYwQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2p2U0JBMEF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGd0VBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfd19URndVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZ3VUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il93X1RGd2tBdkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URncwQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZ3MEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9qdlNCQkVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URnhFQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZ4VUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGeFVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URnhrQXZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3dfVEZ4MEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGeDBBdkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfa1lqbmdFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3dfVEZ5RUF2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGeVVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnlVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEZ5a0F2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGeTBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnkwQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2tZX3NZRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGekVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfd19URnpVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZ6VUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il93X1RGemtBdkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URnowQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZ6MEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9rWV9zWVVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URjBFQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEYwVUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGMFVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URjBrQXZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3dfVEYwMEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGMDBBdkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfa1lfc1lrQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3dfVEYxRUF2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X2Mya0VBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19jMmtFQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iX3dfYzJrVUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X2Mya1VBdkVkcUZxSXU4LWNrb2xnIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19jMmtrQXZFZHFGcUl1OC1ja29sZyIgeD0iODYuMCIgeT0iMS4wIi8+Ci0gICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX3dfYzJtMEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X2MybTBBdkVkcUZxSXU4LWNrb2xnIiBhbmNob3I9Il93X2MybWtBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX3pVS3JSVUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyUlVBdkVkcUZxSXU4LWNrb2xnIiBhbmNob3I9Il96VUtyUkVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iXzZWNGFjVUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il82VjRhY1VBdkVkcUZxSXU4LWNrb2xnIiBhbmNob3I9Il82VjRhY0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX251YTZvVUF3RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9udWE2b1VBd0VkcUZxSXU4LWNrb2xnIiBhbmNob3I9Il9udWE2b0VBd0VkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX19vTFpnRUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9fb0xaZ0VBNkVkcUZxSXU4LWNrb2xnIiBhbmNob3I9Il9fbnZVb0VBNkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il93X2MybWtBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19jMm1rQXZFZHFGcUl1OC1ja29sZyIgZ3JhcGhFZGdlPSJfd19jMm0wQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfelVLclJFQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JSRUF2RWRxRnFJdTgtY2tvbGciIGdyYXBoRWRnZT0iX3pVS3JSVUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iXzZWNGFjRUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il82VjRhY0VBdkVkcUZxSXU4LWNrb2xnIiBncmFwaEVkZ2U9Il82VjRhY1VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9udWE2b0VBd0VkcUZxSXU4LWNrb2xnIiBndWlkPSJfbnVhNm9FQXdFZHFGcUl1OC1ja29sZyIgZ3JhcGhFZGdlPSJfbnVhNm9VQXdFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfX252VW9FQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX19udlVvRUE2RWRxRnFJdTgtY2tvbGciIGdyYXBoRWRnZT0iX19vTFpnRUE2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X2MyazBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19jMmswQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2dGN1VzRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X2MybEVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iODQuMCIgaGVpZ2h0PSIxNDguMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfYzJsVUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X2MybFVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfd19jMmxrQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfYzJsa0F2RWRxRnFJdTgtY2tvbGciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il93X2MybDBBdkVkcUZxSXU4LWNrb2xnIiB4PSI5MS4wIiB5PSIyNDIuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3dfYzJtRUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X2MybUVBdkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfZ0Y3VXNFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3dfYzJtVUF2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSI3NC4wIiBoZWlnaHQ9IjExMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfelVLck1FQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JNRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il96VUtyTVVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfelVLck1VQXZFZHFGcUl1OC1ja29sZyIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3pVS3JNa0F2RWRxRnFJdTgtY2tvbGciIHg9IjEzMC4wIiB5PSI3MDYuMCIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il96VUtyUjBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfelVLclIwQXZFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfelVLclJrQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9fcEV4WUVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfX3BFeFlFQTZFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfX29vRmNFQTZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfelVLclJrQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JSa0F2RWRxRnFJdTgtY2tvbGciIGdyYXBoRWRnZT0iX3pVS3JSMEF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX19vb0ZjRUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9fb29GY0VBNkVkcUZxSXU4LWNrb2xnIiBncmFwaEVkZ2U9Il9fcEV4WUVBNkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfelVLck0wQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JNMEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9qQkZlUUVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfelVLck5FQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjczLjAiIGhlaWdodD0iNjcuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3pVS3JOVUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyTlVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfelVLck5rQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JOa0F2RWRxRnFJdTgtY2tvbGciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il96VUtyTjBBdkVkcUZxSXU4LWNrb2xnIiB4PSIxMzAuMCIgeT0iODY2LjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il96VUtyT0VBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfelVLck9FQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2pCRmVRRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il96VUtyT1VBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iNzMuMCIgaGVpZ2h0PSIxMTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3pVS3JPa0F2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyT2tBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfelVLck8wQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JPMEF2RWRxRnFJdTgtY2tvbGciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il96VUtyUEVBdkVkcUZxSXU4LWNrb2xnIiB4PSIxMzAuMCIgeT0iMTAxOC4wIi8+Ci0gICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX3pVS3JTVUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyU1VBdkVkcUZxSXU4LWNrb2xnIiBhbmNob3I9Il96VUtyU0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX19wMFlRRUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9fcDBZUUVBNkVkcUZxSXU4LWNrb2xnIiBhbmNob3I9Il9fcGhkVUVBNkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il96VUtyU0VBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfelVLclNFQXZFZHFGcUl1OC1ja29sZyIgZ3JhcGhFZGdlPSJfelVLclNVQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfX3BoZFVFQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX19waGRVRUE2RWRxRnFJdTgtY2tvbGciIGdyYXBoRWRnZT0iX19wMFlRRUE2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il96VUtyUFVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfelVLclBVQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2tZam5nRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il96VUtyUGtBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iNzMuMCIgaGVpZ2h0PSI2Ny4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfelVLclAwQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JQMEF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il96VUtyUUVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfelVLclFFQXZFZHFGcUl1OC1ja29sZyIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIi8+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3pVS3JRVUF2RWRxRnFJdTgtY2tvbGciIHg9IjEzMC4wIiB5PSIxMTc4LjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il96VUtyUWtBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfelVLclFrQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2tZam5nRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il96VUtyUTBBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iNzMuMCIgaGVpZ2h0PSIxMTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX19tMTh3RUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9fbTE4d0VBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfX20xOHdVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX19tMTh3VUE2RWRxRnFJdTgtY2tvbGciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9fbTE4d2tBNkVkcUZxSXU4LWNrb2xnIiB4PSI3Ni4wIiB5PSIzOTQuMCIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9fcVJFTVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfX3FSRU1VQTZFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfX3FSRU1FQTZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfX3FSRU1FQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX19xUkVNRUE2RWRxRnFJdTgtY2tvbGciIGdyYXBoRWRnZT0iX19xUkVNVUE2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9fbTE4dzBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfX20xOHcwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2EwZ2t3RUEzRWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9fbTE4eEVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iNzQuMCIgaGVpZ2h0PSI2Ny4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfX25Tb3NFQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX19uU29zRUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il9fblNvc1VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfX25Tb3NVQTZFZHFGcUl1OC1ja29sZyIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIi8+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX19uU29za0E2RWRxRnFJdTgtY2tvbGciIHg9Ijc2LjAiIHk9IjU1NC4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfX25Tb3MwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX19uU29zMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9hMGdrd0VBM0VkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfX25Tb3RFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ijc0LjAiIGhlaWdodD0iMTExLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3dfVEYxVUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGMVVBdkVkcUZxSXU4LWNrb2xnIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCIgZWxlbWVudD0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvZGlhZ3JhbXM+Ci0gICAgPC9jaGlsZFBhY2thZ2VzPgotICAgIDxkaWFncmFtcyB4bWk6aWQ9Il9ubTBkMEVBd0VkcUZxSXU4LWNrb2xnIiBndWlkPSJfbm0wZDBFQXdFZHFGcUl1OC1ja29sZyI+Ci0gICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9ubTBkMFVBd0VkcUZxSXU4LWNrb2xnIiBndWlkPSJfbm0wZDBVQXdFZHFGcUl1OC1ja29sZyIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiIGVsZW1lbnQ9Il9kQmh2a1VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgPC9kaWFncmFtcz4KLSAgICA8cHJvY2VzcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgeG1pOmlkPSJfZEJodmtVQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0iQ1AgQTEiIGd1aWQ9Il9kQmh2a1VBdkVkcUZxSXU4LWNrb2xnIiBwcmVzZW50YXRpb25OYW1lPSJDUCBBMSIgYnJlYWtkb3duRWxlbWVudHM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItOThXVFd1ckJNU2lFaGhaRklzeWtrQSIgaHJlZj0idW1hOi8vLTk4V1RXdXJCTVNpRWhoWkZJc3lra0EjLTk4V1RXdXJCTVNpRWhoWkZJc3lra0EiLz4KLSAgICAgIDxkZWZhdWx0Q29udGV4dCBocmVmPSJ1bWE6Ly9fcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSNfcnJtQ0lCQWRFZHE3RnJjX3lNaFEtQSIvPgotICAgICAgPHZhbGlkQ29udGV4dCBocmVmPSJ1bWE6Ly9fcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSNfcnJtQ0lCQWRFZHE3RnJjX3lNaFEtQSIvPgotICAgIDwvcHJvY2Vzcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQ+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgImEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBleHRlbmRpbmcgXDA0N0NQMSB3aXRoIGFsbCBlbGVtZW50c1wwNDcvY29udGVudC54bWkiICJiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgZXh0ZW5kaW5nIFwwNDdDUDEgd2l0aCBhbGwgZWxlbWVudHNcMDQ3L2NvbnRlbnQueG1pIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI3MzMzMS4uMDAwMDAwMAotLS0gImEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBleHRlbmRpbmcgXDA0N0NQMSB3aXRoIGFsbCBlbGVtZW50c1wwNDcvY29udGVudC54bWkiCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItYnEwMG84djEyRFhVVkZ0Q25pSk5jZyIgbmFtZT0iQ2FwUGF0IEExLF9hSFVTUVJCTkVkcUJzN0toZFZMUkxBIiBndWlkPSItYnEwMG84djEyRFhVVkZ0Q25pSk5jZyI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Q1AgZXh0ZW5kaW5nICdDUDEgd2l0aCBhbGwgZWxlbWVudHMnIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPkNQIGV4dGVuZGluZyAnQ1AxIHdpdGggYWxsIGVsZW1lbnRzJyBrZXkgY29uPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHB1cnBvc2U+Jmx0O3AmZ3Q7Ci0gICAgcHVycG9zZTogQ1AgZXh0ZW5kaW5nICdDUDEgd2l0aCBhbGwgZWxlbWVudHMnCi0mbHQ7L3AmZ3Q7PC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPkNQIGV4dGVuZGluZyAnQ1AxIHdpdGggYWxsICZsdDtzdHJvbmcmZ3Q7ZWxlbWVudHMnIGFsdGVybiZsdDsvc3Ryb25nJmd0OzwvYWx0ZXJuYXRpdmVzPgotICA8aG93dG9TdGFmZj5DUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCBlbGVtZW50cycgc3RhZmY8L2hvd3RvU3RhZmY+Ci0gIDxleHRlcm5hbElkPmV4dGVybklEOkNQIGV4dGVuZGluZyAnQ1AxIHdpdGggYWxsIGVsZW1lbnRzJzwvZXh0ZXJuYWxJZD4KLSAgPHNjb3BlPkNQIGV4dGVuZGluZyAnQ1AxIHdpdGggYWxsIGVsZW1lbnRzJyBzY29wZTwvc2NvcGU+Ci0gIDx1c2FnZU5vdGVzPkNQIGV4dGVuZGluZyAnQ1AxIHdpdGggYWxsIGVsZW1lbnRzJ3VzYWdlPC91c2FnZU5vdGVzPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCAiYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIGV4dGVuZGluZyBcMDQ3Q1AxIHdpdGggYWxsIGVsZW1lbnRzXDA0Ny9kaWFncmFtLnhtaSIgImIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBleHRlbmRpbmcgXDA0N0NQMSB3aXRoIGFsbCBlbGVtZW50c1wwNDcvZGlhZ3JhbS54bWkiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTIwY2ExLi4wMDAwMDAwCi0tLSAiYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIGV4dGVuZGluZyBcMDQ3Q1AxIHdpdGggYWxsIGVsZW1lbnRzXDA0Ny9kaWFncmFtLnhtaSIKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpub3RhdGlvbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvcnVudGltZS8xLjAuMC9ub3RhdGlvbiIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpBY3Rpdml0eURldGFpbERpYWdyYW0geG1pOmlkPSJfSWNPY29PeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIGhyZWY9InVtYTovL19hSFVTUUJCTkVkcUJzN0toZFZMUkxBI19hSFVTUVJCTkVkcUJzN0toZFZMUkxBIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtPgotICA8bm90YXRpb246RGlhZ3JhbSB4bWk6aWQ9Il9JY09jb2V4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSJBREQiIGVsZW1lbnQ9Il9JY09jb094NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJDUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCBlbGVtZW50cyciIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlBhZ2VTdHlsZSIgeG1pOmlkPSJfSWNPY291eDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkd1aWRlU3R5bGUiIHhtaTppZD0iX0ljT2NvLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JY09jcE94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gIDwvbm90YXRpb246RGlhZ3JhbT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCAiYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIGV4dGVuZGluZyBcMDQ3Q1AxIHdpdGggYWxsIGVsZW1lbnRzXDA0Ny9tb2RlbC54bWkiICJiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgZXh0ZW5kaW5nIFwwNDdDUDEgd2l0aCBhbGwgZWxlbWVudHNcMDQ3L21vZGVsLnhtaSIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNjIyNTEuLjAwMDAwMDAKLS0tICJhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgZXh0ZW5kaW5nIFwwNDdDUDEgd2l0aCBhbGwgZWxlbWVudHNcMDQ3L21vZGVsLnhtaSIKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9jbldtRUJCTkVkcUJzN0toZFZMUkxBIiBndWlkPSJfY25XbUVCQk5FZHFCczdLaGRWTFJMQSI+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfY25XbUVSQk5FZHFCczdLaGRWTFJMQSIgaWQ9Ii1icTAwbzh2MTJEWFVWRnRDbmlKTmNnIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IHhtaTppZD0iX2FIVVNRQkJORWRxQnM3S2hkVkxSTEEiIG5hbWU9IkNQIGV4dGVuZGluZyAnQ1AxIHdpdGggYWxsIGVsZW1lbnRzJyIgZ3VpZD0iX2FIVVNRQkJORWRxQnM3S2hkVkxSTEEiPgotICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9FVzA5TUQwS0VkcWpBSTc3REh2QndBIiBuYW1lPSJDUDEgd2l0aCBhbGwgZWxlbWVudHMiIGd1aWQ9Il9FVzA5TUQwS0VkcWpBSTc3REh2QndBIj4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHkiIHhtaTppZD0iX0VYYXpFRDBLRWRxakFJNzdESHZCd0EiIG5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgZ3VpZD0iX0VYYXpFRDBLRWRxakFJNzdESHZCd0EiIHN1cGVyQWN0aXZpdGllcz0iX2FIVVNRUkJORWRxQnM3S2hkVkxSTEEiIHZhcmlhYmlsaXR5VHlwZT0iZXh0ZW5kcyI+Ci0gICAgICAgIDx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfNHNDdHNUemdFZHE1eXNGT05yMUJHUSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgPC9jaGlsZFBhY2thZ2VzPgotICAgIDxkaWFncmFtcyB4bWk6aWQ9Il9acUpPOEVBdEVkcUZxSXU4LWNrb2xnIiBndWlkPSJfWnFKTzhFQXRFZHFGcUl1OC1ja29sZyI+Ci0gICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9acUpPOFVBdEVkcUZxSXU4LWNrb2xnIiBndWlkPSJfWnFKTzhVQXRFZHFGcUl1OC1ja29sZyIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiIGVsZW1lbnQ9Il9hSFVTUVJCTkVkcUJzN0toZFZMUkxBIi8+Ci0gICAgPC9kaWFncmFtcz4KLSAgICA8cHJvY2VzcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgeG1pOmlkPSJfYUhVU1FSQk5FZHFCczdLaGRWTFJMQSIgbmFtZT0iQ1AgZXh0ZW5kaW5nICdDUDEgd2l0aCBhbGwgZWxlbWVudHMnIiBndWlkPSJfYUhVU1FSQk5FZHFCczdLaGRWTFJMQSIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWZDUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCBlbGVtZW50cyciIHByZXNlbnRhdGlvbk5hbWU9IkNQIGV4dGVuZGluZyAnQ1AxIHdpdGggYWxsIGVsZW1lbnRzJyIgYnJlYWtkb3duRWxlbWVudHM9Il9FWGF6RUQwS0VkcWpBSTc3REh2QndBIj4KLSAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItYnEwMG84djEyRFhVVkZ0Q25pSk5jZyIgaHJlZj0idW1hOi8vLWJxMDBvOHYxMkRYVVZGdENuaUpOY2cjLWJxMDBvOHYxMkRYVVZGdENuaUpOY2ciLz4KLSAgICAgIDxkZWZhdWx0Q29udGV4dCBocmVmPSJ1bWE6Ly9fcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSNfcnJtQ0lCQWRFZHE3RnJjX3lNaFEtQSIvPgotICAgICAgPHZhbGlkQ29udGV4dCBocmVmPSJ1bWE6Ly9fcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSNfcnJtQ0lCQWRFZHE3RnJjX3lNaFEtQSIvPgotICAgIDwvcHJvY2Vzcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQ+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9jb250ZW50LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL2NvbnRlbnQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmVmYWQzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsOTY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53IiBuYW1lPSJDUDEgd2l0aCBhbGwgZWxlbWVudHMsXzRzQ3RzVHpnRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53Ij4KLSAgICA8bWFpbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIFRoZSBzdWJjYXRlZ29yaWVzIG9mIHByb2Nlc3MgYXJlIGRlbGl2ZXJ5IHByb2Nlc3MgYW5kIGNhcGFiaWxpdHkgcGF0dGVybi4mYW1wO25ic3A7IEEgZGVsaXZlcnkgcHJvY2VzcyBkZWZpbmVzIGEgY29tcGxldGUKLSAgICBvciBlbmQtdG8tZW5kIHByb2Nlc3MuJmFtcDtuYnNwOyBBIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBhIHByb2Nlc3MgZnJhZ21lbnQgdXNlZCB0byBjb21wb3NlIGEgZGVsaXZlcnkgcHJvY2Vzcy4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgICZhbXA7bmJzcDsKLSZsdDsvcCZndDs8L21haW5EZXNjcmlwdGlvbj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+VGhpcyBjYXBhYmlsaXR5IHBhdHRlcm4gY2FuIGJlIHVzZWQgdG8gcXVpY2tseSBjb25zdHJ1Y3QgYW4gSW5jZXB0aW9uIHBoYXNlIGl0ZXJhdGlvbiBpbiBhIGRlbGl2ZXJ5IHByb2Nlc3MuJmFtcDtuYnNwOyBDb3B5IG9yCi1leHRlbmQgdGhlIHBhdHRlcm4mYW1wO25ic3A7cmVwZWF0ZWRseSB0byBjcmVhdGUgYXMgbWFueSBpdGVyYXRpb25zIGFzIG5lY2Vzc2FyeSBmb3IgdGhlIHBhcnRpY3VsYXIgZGVsaXZlcnkgcHJvY2Vzcy48L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDxwdXJwb3NlPlRoaXMgY2FwYWJpbGl0eSBwYXR0ZXJuIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgY29uc3RydWN0IGFuIEluY2VwdGlvbiBwaGFzZSBpdGVyYXRpb24gaW4gYSBkZWxpdmVyeSBwcm9jZXNzLiZhbXA7bmJzcDsgQ29weSBvcgotZXh0ZW5kIHRoZSBwYXR0ZXJuJmFtcDtuYnNwO3JlcGVhdGVkbHkgdG8gY3JlYXRlIGFzIG1hbnkgaXRlcmF0aW9ucyBhcyBuZWNlc3NhcnkgZm9yIHRoZSBwYXJ0aWN1bGFyIGRlbGl2ZXJ5IHByb2Nlc3MuICZsdDticiAvJmd0OwotJmx0O2JyIC8mZ3Q7PC9wdXJwb3NlPgotICAgIDxhbHRlcm5hdGl2ZXM+Jmx0O3AmZ3Q7Ci0gICAgVG8gZXhwbGFpbiB0aGUgd29yayBpbnZvbHZlZCBpbiB0aGUgQW5hbHlzaXMgYW5kIERlc2lnbiBkaXNjaXBsaW5lLCB0aGUgYWN0aXZpdGllcyBhbmQgd29yayBwcm9kdWN0cyBhcmUgb3JnYW5pemVkIGludG8KLSAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBmb3IgdGhlIGRpc2NpcGxpbmUuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBJbiB0aGUgSW5jZXB0aW9uIFBoYXNlLCBhbmFseXNpcyBhbmQgZGVzaWduIGlzIGNvbmNlcm5lZCB3aXRoIGVzdGFibGlzaGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gYXMgZW52aXNpb25lZCBpcwotICAgIGZlYXNpYmxlLCBhbmQgd2l0aCBhc3Nlc3NpbmcgcG90ZW50aWFsIHRlY2hub2xvZ2llcyBmb3IgdGhlIHNvbHV0aW9uIChpbiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYXJjaHN5bi5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQKLSAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1BlcmZvcm0gQXJjaGl0ZWN0dXJhbCBTeW50aGVzaXMmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykuIElmIGl0IGlzIGZlbHQgdGhhdCBsaXR0bGUgcmlzayBhdHRhY2hlcyB0byB0aGUgZGV2ZWxvcG1lbnQKLSAgICAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkb21haW4gaXMgd2VsbCB1bmRlcnN0b29kLCB0aGUgc3lzdGVtIGlzIG5vdCBub3ZlbCwgYW5kIHNvIG9uKSB0aGVuIHRoaXMgd29ya2Zsb3cgZGV0YWlsIG1heQotICAgIGJlIG9taXR0ZWQuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBUaGUgZWFybHkgRWxhYm9yYXRpb24gUGhhc2UgZm9jdXNlcyBvbiBjcmVhdGluZyBhbiBpbml0aWFsIGFyY2hpdGVjdHVyZSBmb3IgdGhlIHN5c3RlbSAoICZsdDthCi0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDEuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVmaW5lIGEgQ2FuZGlkYXRlIEFyY2hpdGVjdHVyZSZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7KSB0byBwcm92aWRlIGEgc3RhcnRpbmcKLSAgICBwb2ludCBmb3IgdGhlIG1haW4gYW5hbHlzaXMgd29yay4gSWYgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIHByb2R1Y2VkIGluIHByZXZpb3VzCi0gICAgaXRlcmF0aW9ucywgaW4gcHJldmlvdXMgcHJvamVjdHMsIG9yIGlzIG9idGFpbmVkIGZyb20gYW4gYXBwbGljYXRpb24gZnJhbWV3b3JrKSwgdGhlIGZvY3VzIG9mIHRoZSB3b3JrIGNoYW5nZXMgdG8KLSAgICByZWZpbmluZyB0aGUgYXJjaGl0ZWN0dXJlICggJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDIuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7UmVmaW5lIHRoZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykKLSAgICBhbmQgYW5hbHl6aW5nIGJlaGF2aW9yIGFuZCBjcmVhdGluZyBhbiBpbml0aWFsIHNldCBvZiBlbGVtZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciAoICZsdDthCi0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDMuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7QW5hbHl6ZSBCZWhhdmlvciZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7KS4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIEFmdGVyIHRoZSBpbml0aWFsIGVsZW1lbnRzIGFyZSBpZGVudGlmaWVkLCB0aGV5IGFyZSBmdXJ0aGVyIHJlZmluZWQuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ0Lmh0bSZxdW90OyZndDsmbHQ7Zm9udAotICAgIGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVzaWduIENvbXBvbmVudHMmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OyBwcm9kdWNlIGEgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IgdG8KLSAgICBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHN5c3RlbS4gSWYgdGhlIHN5c3RlbSBpbmNsdWRlcyBhIGRhdGFiYXNlLCB0aGVuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ3Lmh0bSZxdW90OyZndDsmbHQ7Zm9udAotICAgIGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVzaWduIHRoZSBEYXRhYmFzZSZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7IG9jY3VycyBpbiBwYXJhbGxlbC4gVGhlIHJlc3VsdCBpcyBhbiBpbml0aWFsIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIGFyZQotICAgIGZ1cnRoZXIgcmVmaW5lZCBpbiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZmRfaW1wLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0ltcGxlbWVudGF0aW9uJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsuJmx0O2JyIC8mZ3Q7Ci0mbHQ7L3AmZ3Q7JmFtcDtuYnNwOyZsdDticiAvJmd0OwotJmx0O2JyIC8mZ3Q7PC9hbHRlcm5hdGl2ZXM+Ci0gICAgPGhvd3RvU3RhZmY+Jmx0O3AmZ3Q7Ci0gICAgVG8gZXhwbGFpbiB0aGUgd29yayBpbnZvbHZlZCBpbiB0aGUgQW5hbHlzaXMgYW5kIERlc2lnbiBkaXNjaXBsaW5lLCB0aGUgYWN0aXZpdGllcyBhbmQgd29yayBwcm9kdWN0cyBhcmUgb3JnYW5pemVkIGludG8KLSAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBmb3IgdGhlIGRpc2NpcGxpbmUuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBJbiB0aGUgSW5jZXB0aW9uIFBoYXNlLCBhbmFseXNpcyBhbmQgZGVzaWduIGlzIGNvbmNlcm5lZCB3aXRoIGVzdGFibGlzaGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gYXMgZW52aXNpb25lZCBpcwotICAgIGZlYXNpYmxlLCBhbmQgd2l0aCBhc3Nlc3NpbmcgcG90ZW50aWFsIHRlY2hub2xvZ2llcyBmb3IgdGhlIHNvbHV0aW9uIChpbiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYXJjaHN5bi5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQKLSAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1BlcmZvcm0gQXJjaGl0ZWN0dXJhbCBTeW50aGVzaXMmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykuIElmIGl0IGlzIGZlbHQgdGhhdCBsaXR0bGUgcmlzayBhdHRhY2hlcyB0byB0aGUgZGV2ZWxvcG1lbnQKLSAgICAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkb21haW4gaXMgd2VsbCB1bmRlcnN0b29kLCB0aGUgc3lzdGVtIGlzIG5vdCBub3ZlbCwgYW5kIHNvIG9uKSB0aGVuIHRoaXMgd29ya2Zsb3cgZGV0YWlsIG1heQotICAgIGJlIG9taXR0ZWQuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBUaGUgZWFybHkgRWxhYm9yYXRpb24gUGhhc2UgZm9jdXNlcyBvbiBjcmVhdGluZyBhbiBpbml0aWFsIGFyY2hpdGVjdHVyZSBmb3IgdGhlIHN5c3RlbSAoICZsdDthCi0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDEuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVmaW5lIGEgQ2FuZGlkYXRlIEFyY2hpdGVjdHVyZSZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7KSB0byBwcm92aWRlIGEgc3RhcnRpbmcKLSAgICBwb2ludCBmb3IgdGhlIG1haW4gYW5hbHlzaXMgd29yay4gSWYgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIHByb2R1Y2VkIGluIHByZXZpb3VzCi0gICAgaXRlcmF0aW9ucywgaW4gcHJldmlvdXMgcHJvamVjdHMsIG9yIGlzIG9idGFpbmVkIGZyb20gYW4gYXBwbGljYXRpb24gZnJhbWV3b3JrKSwgdGhlIGZvY3VzIG9mIHRoZSB3b3JrIGNoYW5nZXMgdG8KLSAgICByZWZpbmluZyB0aGUgYXJjaGl0ZWN0dXJlICggJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDIuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7UmVmaW5lIHRoZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykKLSAgICBhbmQgYW5hbHl6aW5nIGJlaGF2aW9yIGFuZCBjcmVhdGluZyBhbiBpbml0aWFsIHNldCBvZiBlbGVtZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciAoICZsdDthCi0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDMuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7QW5hbHl6ZSBCZWhhdmlvciZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7KS4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIEFmdGVyIHRoZSBpbml0aWFsIGVsZW1lbnRzIGFyZSBpZGVudGlmaWVkLCB0aGV5IGFyZSBmdXJ0aGVyIHJlZmluZWQuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ0Lmh0bSZxdW90OyZndDsmbHQ7Zm9udAotICAgIGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVzaWduIENvbXBvbmVudHMmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OyBwcm9kdWNlIGEgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IgdG8KLSAgICBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHN5c3RlbS4gSWYgdGhlIHN5c3RlbSBpbmNsdWRlcyBhIGRhdGFiYXNlLCB0aGVuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ3Lmh0bSZxdW90OyZndDsmbHQ7Zm9udAotICAgIGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVzaWduIHRoZSBEYXRhYmFzZSZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7IG9jY3VycyBpbiBwYXJhbGxlbC4gVGhlIHJlc3VsdCBpcyBhbiBpbml0aWFsIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIGFyZQotICAgIGZ1cnRoZXIgcmVmaW5lZCBpbiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZmRfaW1wLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0ltcGxlbWVudGF0aW9uJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsuJmx0O2JyIC8mZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mYW1wO25ic3A7Jmx0O2JyIC8mZ3Q7Ci0mbHQ7YnIgLyZndDs8L2hvd3RvU3RhZmY+Ci0gICAgPGV4dGVybmFsSWQ+RVh0ZXJuYWwgSUQ6Q1AxIHdpdGggYWxsIGVsZW1lbnRzPC9leHRlcm5hbElkPgotICAgIDxzY29wZT4mbHQ7cCZndDsKLSAgICBUbyBleHBsYWluIHRoZSB3b3JrIGludm9sdmVkIGluIHRoZSBBbmFseXNpcyBhbmQgRGVzaWduIGRpc2NpcGxpbmUsIHRoZSBhY3Rpdml0aWVzIGFuZCB3b3JrIHByb2R1Y3RzIGFyZSBvcmdhbml6ZWQgaW50bwotICAgIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGZvciB0aGUgZGlzY2lwbGluZS4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIEluIHRoZSBJbmNlcHRpb24gUGhhc2UsIGFuYWx5c2lzIGFuZCBkZXNpZ24gaXMgY29uY2VybmVkIHdpdGggZXN0YWJsaXNoaW5nIHdoZXRoZXIgdGhlIHN5c3RlbSBhcyBlbnZpc2lvbmVkIGlzCi0gICAgZmVhc2libGUsIGFuZCB3aXRoIGFzc2Vzc2luZyBwb3RlbnRpYWwgdGVjaG5vbG9naWVzIGZvciB0aGUgc29sdXRpb24gKGluICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hcmNoc3luLmh0bSZxdW90OyZndDsmbHQ7Zm9udAotICAgIGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7UGVyZm9ybSBBcmNoaXRlY3R1cmFsIFN5bnRoZXNpcyZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7KS4gSWYgaXQgaXMgZmVsdCB0aGF0IGxpdHRsZSByaXNrIGF0dGFjaGVzIHRvIHRoZSBkZXZlbG9wbWVudAotICAgIChiZWNhdXNlLCBmb3IgZXhhbXBsZSwgdGhlIGRvbWFpbiBpcyB3ZWxsIHVuZGVyc3Rvb2QsIHRoZSBzeXN0ZW0gaXMgbm90IG5vdmVsLCBhbmQgc28gb24pIHRoZW4gdGhpcyB3b3JrZmxvdyBkZXRhaWwgbWF5Ci0gICAgYmUgb21pdHRlZC4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIFRoZSBlYXJseSBFbGFib3JhdGlvbiBQaGFzZSBmb2N1c2VzIG9uIGNyZWF0aW5nIGFuIGluaXRpYWwgYXJjaGl0ZWN0dXJlIGZvciB0aGUgc3lzdGVtICggJmx0O2EKLSAgICBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kMS5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtEZWZpbmUgYSBDYW5kaWRhdGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspIHRvIHByb3ZpZGUgYSBzdGFydGluZwotICAgIHBvaW50IGZvciB0aGUgbWFpbiBhbmFseXNpcyB3b3JrLiBJZiB0aGUgYXJjaGl0ZWN0dXJlIGFscmVhZHkgZXhpc3RzIChlaXRoZXIgYmVjYXVzZSBpdCB3YXMgcHJvZHVjZWQgaW4gcHJldmlvdXMKLSAgICBpdGVyYXRpb25zLCBpbiBwcmV2aW91cyBwcm9qZWN0cywgb3IgaXMgb2J0YWluZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmcmFtZXdvcmspLCB0aGUgZm9jdXMgb2YgdGhlIHdvcmsgY2hhbmdlcyB0bwotICAgIHJlZmluaW5nIHRoZSBhcmNoaXRlY3R1cmUgKCAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kMi5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtSZWZpbmUgdGhlIEFyY2hpdGVjdHVyZSZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7KQotICAgIGFuZCBhbmFseXppbmcgYmVoYXZpb3IgYW5kIGNyZWF0aW5nIGFuIGluaXRpYWwgc2V0IG9mIGVsZW1lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yICggJmx0O2EKLSAgICBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kMy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtBbmFseXplIEJlaGF2aW9yJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgQWZ0ZXIgdGhlIGluaXRpYWwgZWxlbWVudHMgYXJlIGlkZW50aWZpZWQsIHRoZXkgYXJlIGZ1cnRoZXIgcmVmaW5lZC4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDQuaHRtJnF1b3Q7Jmd0OyZsdDtmb250Ci0gICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtEZXNpZ24gQ29tcG9uZW50cyZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7IHByb2R1Y2UgYSBzZXQgb2YgY29tcG9uZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciB0bwotICAgIHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50cyBvbiB0aGUgc3lzdGVtLiBJZiB0aGUgc3lzdGVtIGluY2x1ZGVzIGEgZGF0YWJhc2UsIHRoZW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDcuaHRtJnF1b3Q7Jmd0OyZsdDtmb250Ci0gICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtEZXNpZ24gdGhlIERhdGFiYXNlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgb2NjdXJzIGluIHBhcmFsbGVsLiBUaGUgcmVzdWx0IGlzIGFuIGluaXRpYWwgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggYXJlCi0gICAgZnVydGhlciByZWZpbmVkIGluICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmZF9pbXAuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7SW1wbGVtZW50YXRpb24mbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0Oy4mbHQ7YnIgLyZndDsKLSZsdDsvcCZndDsmYW1wO25ic3A7Jmx0O2JyIC8mZ3Q7Ci0mbHQ7YnIgLyZndDs8L3Njb3BlPgotICAgIDx1c2FnZU5vdGVzPiZsdDtwJmd0OwotICAgIFRoZSBzdWJjYXRlZ29yaWVzIG9mIHByb2Nlc3MgYXJlIGRlbGl2ZXJ5IHByb2Nlc3MgYW5kIGNhcGFiaWxpdHkgcGF0dGVybi4mYW1wO25ic3A7IEEgZGVsaXZlcnkgcHJvY2VzcyBkZWZpbmVzIGEgY29tcGxldGUKLSAgICBvciBlbmQtdG8tZW5kIHByb2Nlc3MuJmFtcDtuYnNwOyBBIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBhIHByb2Nlc3MgZnJhZ21lbnQgdXNlZCB0byBjb21wb3NlIGEgZGVsaXZlcnkgcHJvY2Vzcy4KLSZsdDsvcCZndDs8L3VzYWdlTm90ZXM+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5RGVzY3JpcHRpb24geG1pOmlkPSItWVZUWlJFNW95NW9HY3VlMVhYaDNkUSIgbmFtZT0iQWN0aXZpdHkxLF9FNzNySVR6aUVkcTV5c0ZPTnIxQkdRIiBndWlkPSItWVZUWlJFNW95NW9HY3VlMVhYaDNkUSI+Ci0gICAgPG1haW5EZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICBUaGlzIFdvcmtmbG93IERldGFpbDoKLSZsdDsvcCZndDsKLSZsdDt1bCZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIFByb3ZpZGVzIHRoZSBuYXR1cmFsICZsdDtiJmd0O3RyYW5zaXRpb24gZnJvbSBhbmFseXNpcyZsdDsvYiZndDsgYWN0aXZpdGllcyAmbHQ7YiZndDt0byBkZXNpZ24mbHQ7L2ImZ3Q7IGFjdGl2aXRpZXMsIGlkZW50aWZ5aW5nOiAKLSAgICAgICAgJmx0O3VsJmd0OwotICAgICAgICAgICAgJmx0O2xpJmd0OwotICAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGRlc2lnbiBlbGVtZW50cyBmcm9tIGFuYWx5c2lzIGVsZW1lbnRzCi0gICAgICAgICAgICAmbHQ7L2xpJmd0OwotICAgICAgICAgICAgJmx0O2xpJmd0OwotICAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGRlc2lnbiBtZWNoYW5pc21zIGZyb20gcmVsYXRlZCBhbmFseXNpcyBtZWNoYW5pc21zCi0gICAgICAgICAgICAmbHQ7L2xpJmd0OwotICAgICAgICAmbHQ7L3VsJmd0OwotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICAmbHQ7YiZndDtEZXNjcmliZXMmbHQ7L2ImZ3Q7IHRoZSBvcmdhbml6YXRpb24gb2YgdGhlIHN5c3RlbSdzICZsdDtiJmd0O3J1bi10aW1lIGFuZCBkZXBsb3ltZW50IGFyY2hpdGVjdHVyZSZsdDsvYiZndDsKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgJmx0O2ImZ3Q7T3JnYW5pemVzIHRoZSBpbXBsZW1lbnRhdGlvbiBtb2RlbCZsdDsvYiZndDsgc28gYXMgdG8gbWFrZSB0aGUgdHJhbnNpdGlvbiBiZXR3ZWVuIGRlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gc2VhbWxlc3MKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgJmx0O2ImZ3Q7TWFpbnRhaW5zIHRoZSBjb25zaXN0ZW5jeSBhbmQgaW50ZWdyaXR5IG9mIHRoZSBhcmNoaXRlY3R1cmUmbHQ7L2ImZ3Q7LCBlbnN1cmluZyB0aGF0OiAKLSAgICAgICAgJmx0O3VsJmd0OwotICAgICAgICAgICAgJmx0O2xpJmd0OwotICAgICAgICAgICAgICAgIG5ldyBkZXNpZ24gZWxlbWVudHMgaWRlbnRpZmllZCBmb3IgdGhlIGN1cnJlbnQgaXRlcmF0aW9uIGFyZSBpbnRlZ3JhdGVkIHdpdGggcHJlLWV4aXN0aW5nIGRlc2lnbiBlbGVtZW50cy4KLSAgICAgICAgICAgICZsdDsvbGkmZ3Q7Ci0gICAgICAgICAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgICAgICAgICAgbWF4aW1hbCByZS11c2Ugb2YgYXZhaWxhYmxlIGNvbXBvbmVudHMgYW5kIGRlc2lnbiBlbGVtZW50cyBpcyBhY2hpZXZlZCBhcyBlYXJseSBhcyBwb3NzaWJsZSBpbiB0aGUgZGVzaWduCi0gICAgICAgICAgICAgICAgZWZmb3J0LgotICAgICAgICAgICAgJmx0Oy9saSZndDsKLSAgICAgICAgJmx0Oy91bCZndDsKLSAgICAmbHQ7L2xpJmd0OwotJmx0Oy91bCZndDs8L21haW5EZXNjcmlwdGlvbj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+Jmx0O3AmZ3Q7Ci0gICAgS2V5IGNvbnNpZGVyYXRpb25zOgotJmx0Oy9wJmd0OwotJmx0O3VsJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2V5MQotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrZXkyCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTMKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2V5NAotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrZXk1Ci0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTYKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2V5NwotICAgICZsdDsvbGkmZ3Q7Ci0mbHQ7L3VsJmd0Ozwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+Jmx0O3AmZ3Q7Ci0gICAgVGhlIHdvcmsgaXMgYmVzdCBkb25lIGluIHNldmVyYWwgc2Vzc2lvbnMsIHBlcmhhcHMgcGVyZm9ybWVkIG92ZXIgYSBmZXcgZGF5cyAob3Igd2Vla3MgYW5kIG1vbnRocyBmb3IgdmVyeSBsYXJnZQotICAgIHN5c3RlbXMpLiBUaGUgaW5pdGlhbCBmb2N1cyB3aWxsIGJlIG9uIHRoZSBhY3Rpdml0aWVzICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX21lY2hhbmlzbXMse0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0uaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7e0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0mcXVvdDsmZ3Q7SWRlbnRpZnkgRGVzaWduIE1lY2hhbmlzbXMmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduLHs1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9JnF1b3Q7Jmd0O2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduJmx0Oy9hJmd0Oywgd2l0aCBhIGdyZWF0IGRlYWwgb2YKLSAgICBpdGVyYXRpb24gd2l0aCB0aGUgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsKLSAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pbmNvcnBvcmF0ZV9kZXNpZ25fZWxlbWVudHMsezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0uaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7ezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0mcXVvdDsmZ3Q7SW5jb3Jwb3JhdGUgRXhpc3RpbmcgRGVzaWduIEVsZW1lbnRzJmx0Oy9hJmd0OyBhY3Rpdml0eSB0byBtYWtlIHN1cmUgdGhhdCBuZXcKLSAgICBlbGVtZW50cyBkbyBub3QgZHVwbGljYXRlIGZ1bmN0aW9uYWxpdHkgb2YgZXhpc3RpbmcgZWxlbWVudHMuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBBcyB0aGUgZGVzaWduIGVtZXJnZXMsIGNvbmN1cnJlbmN5IGFuZCBkaXN0cmlidXRpb24gaXNzdWVzIGFyZSBpbnRyb2R1Y2VkIGluIHRoZSBhY3Rpdml0aWVzICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvZGVzY3JpYmVfcnVudGltZV9hcmNoaXRlY3R1cmUsezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0uaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7ezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0mcXVvdDsmZ3Q7RGVzY3JpYmUgdGhlIFJ1bi10aW1lIEFyY2hpdGVjdHVyZSZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvZGVzY3JpYmVfZGlzdHJpYnV0aW9uLHs2QTExMjgwOC0wQTkwLTQyN0EtQkFCOS1FMTRGM0ZCRjcyQjV9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s2QTExMjgwOC0wQTkwLTQyN0EtQkFCOS1FMTRGM0ZCRjcyQjV9JnF1b3Q7Jmd0O0Rlc2NyaWJlIERpc3RyaWJ1dGlvbiZsdDsvYSZndDssIHJlc3BlY3RpdmVseS4gQXMgdGhlc2UgaXNzdWVzIGFyZSBjb25zaWRlcmVkLAotICAgIGNoYW5nZXMgdG8gZGVzaWduIGVsZW1lbnRzIG1heSBiZSByZXF1aXJlZCB0byBzcGxpdCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzLCB0aHJlYWRzIG9yIG5vZGVzLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgQXMgdGhlIGluZGl2aWR1YWwgbW9kZWxzIGFyZSByZWZpbmVkIHRvIGluY29ycG9yYXRlIHRoZSBhcmNoaXRlY3R1cmFsIGRlY2lzaW9ucywgdGhlIHJlc3VsdHMgYXJlIGRvY3VtZW50ZWQgaW4KLSAgICByZXNwZWN0aXZlIHZpZXcgc2VjdGlvbnMgaW4gdGhlIFNvZnR3YXJlIEFyY2hpdGVjdHVyZSBEb2N1bWVudCAoZS5nLiwgYXMgdGhlIERlc2lnbiBNb2RlbCBpcyByZWZpbmVkLCB0aGUgTG9naWNhbCBWaWV3Ci0gICAgb2YgdGhlIFNvZnR3YXJlIEFyY2hpdGVjdHVyZSBEb2N1bWVudCBpcyByZWZpbmVkLCBhcyB3ZWxsKS4gVGhlIHJlc3VsdGluZyBhcmNoaXRlY3R1cmUgaXMgcmV2aWV3ZWQuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7YnIgLyZndDsKLSZsdDticiAvJmd0OzwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cHVycG9zZT4mbHQ7cCZndDsKLSAgICBQdXJwb3NlIG9mIHRoaXMgYWN0aXZpdHkgaXMgdG8gaGF2ZSB0YXNrcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHRvIG90aGVyIHRhc2tzLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgJmFtcDtuYnNwOyZsdDtpbWcgaGVpZ2h0PSZxdW90OzcxJnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9ydXAuanBnJnF1b3Q7IHdpZHRoPSZxdW90OzE3NiZxdW90OyAvJmd0OwotJmx0Oy9wJmd0OzwvcHVycG9zZT4KLSAgICA8YWx0ZXJuYXRpdmVzPiZsdDtwJmd0OwotICAgIEFsdGVyYW50aXZlczoKLSZsdDsvcCZndDsKLSZsdDtvbCZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIEFsdGVyMQotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBBbHRlcjIKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgQWx0ZXIzCi0gICAgJmx0Oy9saSZndDsKLSZsdDsvb2wmZ3Q7PC9hbHRlcm5hdGl2ZXM+Ci0gICAgPGhvd3RvU3RhZmY+Jmx0O3AmZ3Q7Ci0gICAgVGhlc2UgYWN0aXZpdGllcyBhcmUgYmVzdCBjYXJyaWVkIG91dCBieSBhIHNtYWxsIHRlYW0gc3RhZmZlZCBieSBjcm9zcy1mdW5jdGlvbmFsIHRlYW0gbWVtYmVycy4gSXNzdWVzIHRoYXQgYXJlCi0gICAgdHlwaWNhbGx5IGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCBpbmNsdWRlIHVzYWJpbGl0eSwgcGVyZm9ybWFuY2UsIHNjYWxpbmcsIHByb2Nlc3MgYW5kIHRocmVhZCBzeW5jaHJvbml6YXRpb24sIGFuZAotICAgIGRpc3RyaWJ1dGlvbi4gVGhlIHRlYW0gc2hvdWxkIGFsc28gaW5jbHVkZSBtZW1iZXJzIHdpdGggZG9tYWluIGV4cGVyaWVuY2Ugd2hvIGNhbiBpZGVudGlmeSBrZXkgYWJzdHJhY3Rpb25zLiBUaGUgdGVhbQotICAgIHNob3VsZCBhbHNvIGhhdmUgZXhwZXJpZW5jZSB3aXRoIG1vZGVsIG9yZ2FuaXphdGlvbiBhbmQgbGF5ZXJpbmcuIFRoZSB0ZWFtIHdpbGwgbmVlZCB0byBiZSBhYmxlIHRvIHB1bGwgYWxsIHRoZXNlCi0gICAgZGlzcGFyYXRlIHRocmVhZHMgaW50byBhIGNvaGVzaXZlLCBjb2hlcmVudCAoYWxiZWl0IHByZWxpbWluYXJ5KSBhcmNoaXRlY3R1cmUuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBCZWNhdXNlIHRoZSBmb2N1cyBvZiB0aGUgYXJjaGl0ZWN0dXJlIGVmZm9ydCBpcyBzaGlmdGluZyB0b3dhcmQgaW1wbGVtZW50YXRpb24gaXNzdWVzLCBncmVhdGVyIGF0dGVudGlvbiBuZWVkcyB0byBiZQotICAgIHBhaWQgdG8gc3BlY2lmaWMgdGVjaG5vbG9neSBpc3N1ZXMuIFRoaXMgd2lsbCBmb3JjZSB0aGUgYXJjaGl0ZWN0dXJlIHRlYW0gdG8gc2hpZnQgbWVtYmVycyBvciBleHBhbmQgdG8gaW5jbHVkZSBwZW9wbGUKLSAgICB3aXRoIGRpc3RyaWJ1dGlvbiBhbmQgZGVwbG95bWVudCBleHBlcnRpc2UgKGlmIHRob3NlIGlzc3VlcyBhcmUgYXJjaGl0ZWN0dXJhbGx5IHNpZ25pZmljYW50KS4gSW4gb3JkZXIgdG8gdW5kZXJzdGFuZAotICAgIHRoZSBwb3RlbnRpYWwgaW1wYWN0IG9mIHRoZSBzdHJ1Y3R1cmUgb24gdGhlIGltcGxlbWVudGF0aW9uIG1vZGVsIG9uIHRoZSBlYXNlIG9mIGludGVncmF0aW9uLCBleHBlcnRpc2UgaW4gdGhlIHNvZnR3YXJlCi0gICAgYnVpbGQgbWFuYWdlbWVudCBwcm9jZXNzIGlzIHVzZWZ1bCB0byBoYXZlLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgQXQgdGhlIHNhbWUgdGltZSwgaXQgaXMgZXNzZW50aWFsIHRoYXQgdGhlIGFyY2hpdGVjdHVyZSB0ZWFtIG5vdCBiZSBjb21wb3NlZCBvZiBhIGxhcmdlIGV4dGVuZGVkIHRlYW0uIEEgc3RyYXRlZ3kgZm9yCi0gICAgY291bnRlcmluZyB0aGlzIHRyZW5kIGlzIHRvIHJldGFpbiBhIHJlbGF0aXZlbHkgc21hbGwgY29yZSB0ZWFtIHdpdGggYSBzYXRlbGxpdGUgZ3JvdXAgb2YgZXh0ZW5kZWQgdGVhbSBtZW1iZXJzIHRoYXQKLSAgICBhcmUgYnJvdWdodCBpbiBhcyAmcXVvdDtjb25zdWx0YW50cyZxdW90OyBvbiBrZXkgaXNzdWVzJmx0O2ImZ3Q7LiZsdDsvYiZndDsgVGhpcyBzdHJ1Y3R1cmUgYWxzbyB3b3JrcyB3ZWxsIGZvciBzbWFsbGVyIHByb2plY3RzIHdoZXJlCi0gICAgc3BlY2lmaWMgZXhwZXJ0aXNlIG1heSBiZSBib3Jyb3dlZCBvciBjb250cmFjdGVkIGZyb20gb3RoZXIgb3JnYW5pemF0aW9uczsgdGhleSBjYW4gYmUgYnJvdWdodCBpbiBhcyBzcGVjaWZpYyBpc3N1ZXMKLSAgICBuZWVkIHRvIGJlIGFkZHJlc3NlZC4KLSZsdDsvcCZndDs8L2hvd3RvU3RhZmY+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eURlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eURlc2NyaXB0aW9uIHhtaTppZD0iLVZSVUNTaEF2WHJzTGdzN1BaekhnVXciIG5hbWU9Ikl0ZXJhdGlvbjEsX0VGVnJ3VHppRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1WUlVDU2hBdlhyc0xnczdQWnpIZ1V3Ij4KLSAgICA8bWFpbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIFRoaXMgd29ya2Zsb3cgZGV0YWlsIGhhcyB0aGUgZm9sbG93aW5nIGdvYWxzOgotJmx0Oy9wJmd0OwotJmx0O3VsJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgQ3JlYXRlIGFuIGluaXRpYWwgc2tldGNoIG9mIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIHN5c3RlbSAKLSAgICAgICAgJmx0O3VsJmd0OwotICAgICAgICAgICAgJmx0O2xpJmd0OwotICAgICAgICAgICAgICAgIERlZmluZSBhbiBpbml0aWFsIHNldCBvZiBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgZWxlbWVudHMgdG8gdXNlIGFzIHRoZSBiYXNpcyBmb3IgYW5hbHlzaXMKLSAgICAgICAgICAgICZsdDsvbGkmZ3Q7Ci0gICAgICAgICAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgICAgICAgICAgRGVmaW5lIGFuIGluaXRpYWwgc2V0IG9mIGFuYWx5c2lzIG1lY2hhbmlzbXMKLSAgICAgICAgICAgICZsdDsvbGkmZ3Q7Ci0gICAgICAgICAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBpbml0aWFsIGxheWVyaW5nIGFuZCBvcmdhbml6YXRpb24gb2YgdGhlIHN5c3RlbQotICAgICAgICAgICAgJmx0Oy9saSZndDsKLSAgICAgICAgICAgICZsdDtsaSZndDsKLSAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIHVzZS1jYXNlIHJlYWxpemF0aW9ucyB0byBiZSBhZGRyZXNzZWQgaW4gdGhlIGN1cnJlbnQgaXRlcmF0aW9uCi0gICAgICAgICAgICAmbHQ7L2xpJmd0OwotICAgICAgICAmbHQ7L3VsJmd0OwotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBJZGVudGlmeSBhbmFseXNpcyBjbGFzc2VzIGZyb20gdGhlIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCB1c2UgY2FzZXMKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgVXBkYXRlIHRoZSB1c2UtY2FzZSByZWFsaXphdGlvbnMgd2l0aCBhbmFseXNpcyBjbGFzcyBpbnRlcmFjdGlvbnMKLSAgICAmbHQ7L2xpJmd0OwotJmx0Oy91bCZndDs8L21haW5EZXNjcmlwdGlvbj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+Jmx0O3AmZ3Q7Ci0gICAgS2V5IGNvbnNpZGVyYXRpb25zOgotJmx0Oy9wJmd0OwotJmx0O3VsJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2V5MTEKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2V5MjIKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2V5MzMKLSAgICAmbHQ7L2xpJmd0OwotJmx0Oy91bCZndDs8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPiZsdDtwJmd0OwotICAgIFRoZSB3b3JrIGlzIGJlc3QgZG9uZSBpbiBzZXZlcmFsIHNlc3Npb25zLCBwZXJoYXBzIHBlcmZvcm1lZCBvdmVyIGEgZmV3IGRheXMgKG9yIHdlZWtzIGFuZCBtb250aHMgZm9yIHZlcnkgbGFyZ2UKLSAgICBzeXN0ZW1zKSwgd2l0aCBpdGVyYXRpb24gYmV0d2VlbiAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2FyY2hpdGVjdHVyYWxfYW5hbHlzaXMsezhDQjQ4NDAyLUQ0QzUtNEUxNy1CQjMzLTUwNzMxNUNCMUJCRn0uaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7ezhDQjQ4NDAyLUQ0QzUtNEUxNy1CQjMzLTUwNzMxNUNCMUJCRn0mcXVvdDsmZ3Q7QXJjaGl0ZWN0dXJhbCBBbmFseXNpcyZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvdXNlX2Nhc2VfYW5hbHlzaXMsezI4MDE0NjE1LUE2MkYtNDUyRC1CODIxLTMwQzdDQUIwRUM0NH0uaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7ezI4MDE0NjE1LUE2MkYtNDUyRC1CODIxLTMwQzdDQUIwRUM0NH0mcXVvdDsmZ3Q7VXNlLUNhc2UgQW5hbHlzaXMmbHQ7L2EmZ3Q7LiBQZXJmb3JtIGFuIGluaXRpYWwgcGFzcyBhdCB0aGUgYXJjaGl0ZWN0dXJlIGluICZsdDthCi0gICAgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsgaHJlZj0mcXVvdDtyZXNvdXJjZXMvYXJjaGl0ZWN0dXJhbF9hbmFseXNpcyx7OENCNDg0MDItRDRDNS00RTE3LUJCMzMtNTA3MzE1Q0IxQkJGfS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDt7OENCNDg0MDItRDRDNS00RTE3LUJCMzMtNTA3MzE1Q0IxQkJGfSZxdW90OyZndDtBcmNoaXRlY3R1cmFsIEFuYWx5c2lzJmx0Oy9hJmd0OywgdGhlbiBjaG9vc2UgYXJjaGl0ZWN0dXJhbGx5IHNpZ25pZmljYW50IHVzZQotICAgIGNhc2VzLCBwZXJmb3JtaW5nICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7IGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3VzZV9jYXNlX2FuYWx5c2lzLHsyODAxNDYxNS1BNjJGLTQ1MkQtQjgyMS0zMEM3Q0FCMEVDNDR9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3syODAxNDYxNS1BNjJGLTQ1MkQtQjgyMS0zMEM3Q0FCMEVDNDR9JnF1b3Q7Jmd0O1VzZS1DYXNlIEFuYWx5c2lzJmx0Oy9hJmd0OyBvbiBlYWNoIG9uZS4gQWZ0ZXIgKG9yIGFzKSBlYWNoIHVzZSBjYXNlIGlzCi0gICAgYW5hbHl6ZWQsIHVwZGF0ZSB0aGUgYXJjaGl0ZWN0dXJlIGFzIG5lZWRlZCB0byByZWZsZWN0IGFkYXB0YXRpb25zIHJlcXVpcmVkIHRvIGFjY29tbW9kYXRlIG5ldyBiZWhhdmlvciBvZiB0aGUgc3lzdGVtCi0gICAgYW5kIHRvIGFkZHJlc3MgcG90ZW50aWFsIGFyY2hpdGVjdHVyYWwgcHJvYmxlbXMgd2hpY2ggYXJlIGlkZW50aWZpZWQuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBXaGVyZSB0aGUgYXJjaGl0ZWN0dXJlIGFscmVhZHkgZXhpc3RzIChlaXRoZXIgZnJvbSBhIHByaW9yIHByb2plY3Qgb3IgaXRlcmF0aW9uKSwgY2hhbmdlIHJlcXVlc3RzIG1heSBuZWVkIHRvIGJlCi0gICAgY3JlYXRlZCB0byBjaGFuZ2UgdGhlIGFyY2hpdGVjdHVyZSB0byBhY2NvdW50IGZvciB0aGUgbmV3IGJlaGF2aW9yIHRoZSBzeXN0ZW0gbXVzdCBzdXBwb3J0LiBUaGVzZSBjaGFuZ2VzIG1heSBiZSB0byBhbnkKLSAgICBhcnRpZmFjdCBpbiB0aGUgcHJvY2VzcywgZGVwZW5kaW5nIG9uIHRoZSBzY29wZSBvZiB0aGUgY2hhbmdlLgotJmx0Oy9wJmd0OwotJmx0O2JyIC8mZ3Q7Ci0mbHQ7YnIgLyZndDs8L3VzYWdlR3VpZGFuY2U+Ci0gICAgPHB1cnBvc2U+Jmx0O3AmZ3Q7Ci0gICAgUHVycG9zZTogVGhpcyBpdGVydGFpb24gaXMgY3JlYXRlZCBmb3IgdHdvIGFjdGl2aXRpZXMuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICAmYW1wO25ic3A7Jmx0O2ltZyBoZWlnaHQ9JnF1b3Q7NDc0JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9ydXBfcGxhdGZvcm0uanBnJnF1b3Q7IHdpZHRoPSZxdW90OzUwNCZxdW90OyAvJmd0OwotJmx0Oy9wJmd0OzwvcHVycG9zZT4KLSAgICA8YWx0ZXJuYXRpdmVzPiZsdDtwJmd0OwotICAgIEFsdGVybmF0aXZlczoKLSZsdDsvcCZndDsKLSZsdDtvbCZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgICZsdDthIGhyZWY9JnF1b3Q7Li4vcm9sZXMvcm9sZV9BMS54bWkmcXVvdDsgdGFyZ2V0PSZxdW90O19ibGFuayZxdW90OyZndDtyb2xlX0ExLnhtaSZsdDsvYSZndDsKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgJmx0O2EgaHJlZj0mcXVvdDsuLi90YXNrcy90YXNrX0EyLnhtaSZxdW90OyB0YXJnZXQ9JnF1b3Q7X2JsYW5rJnF1b3Q7Jmd0O3Rhc2tfQTIueG1pJmx0Oy9hJmd0OwotICAgICZsdDsvbGkmZ3Q7Ci0mbHQ7L29sJmd0OzwvYWx0ZXJuYXRpdmVzPgotICAgIDxob3d0b1N0YWZmPiZsdDtwJmd0OwotICAgIFRoZXNlIGFjdGl2aXRpZXMgYXJlIGJlc3QgY2FycmllZCBvdXQgYnkgYSBzbWFsbCB0ZWFtIHN0YWZmZWQgYnkgY3Jvc3MtZnVuY3Rpb25hbCB0ZWFtIG1lbWJlcnMuIElzc3VlcyB0aGF0IGFyZQotICAgIHR5cGljYWxseSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgaW5jbHVkZSBwZXJmb3JtYW5jZSwgc2NhbGluZywgcHJvY2VzcyBhbmQgdGhyZWFkIHN5bmNocm9uaXphdGlvbiwgYW5kCi0gICAgZGlzdHJpYnV0aW9uLiBUaGUgdGVhbSBzaG91bGQgYWxzbyBpbmNsdWRlIG1lbWJlcnMgd2l0aCBkb21haW4gZXhwZXJpZW5jZSB3aG8gY2FuIGlkZW50aWZ5IGtleSBhYnN0cmFjdGlvbnMuIFRoZSB0ZWFtCi0gICAgc2hvdWxkIGFsc28gaGF2ZSBleHBlcmllbmNlIHdpdGggbW9kZWwgb3JnYW5pemF0aW9uIGFuZCBsYXllcmluZy4gVGhlIHRlYW0gd2lsbCBuZWVkIHRvIGJlIGFibGUgdG8gcHVsbCBhbGwgdGhlc2UKLSAgICBkaXNwYXJhdGUgdGhyZWFkcyBpbnRvIGEgY29oZXNpdmUsIGNvaGVyZW50IChhbGJlaXQgcHJlbGltaW5hcnkpIGFyY2hpdGVjdHVyZS4KLSZsdDsvcCZndDs8L2hvd3RvU3RhZmY+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eURlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItblVIMHZvRDdSb0tRZ1BUMHJiT3dRUSIgbmFtZT0idGFza19CMixfTWNZSDBEemxFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLW5VSDB2b0Q3Um9LUWdQVDByYk93UVEiPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz4mbHQ7cCZndDsKLSAgICBrZXkgY29uc2lkZXJhdGlvbnM6Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7b2wmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrMQotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrMgotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrMwotICAgICZsdDsvbGkmZ3Q7Ci0mbHQ7L29sJmd0Ozwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+Jmx0O3AmZ3Q7Ci0gICAgdXNhZ2UgZ3VpZGFuY2UgZm9yIHRhc2tfQjIKLSZsdDsvcCZndDsKLSZsdDt0YWJsZSBjZWxsc3BhY2luZz0mcXVvdDsyJnF1b3Q7IGNlbGxwYWRkaW5nPSZxdW90OzImcXVvdDsgd2lkdGg9JnF1b3Q7MTgwJnF1b3Q7IGJvcmRlcj0mcXVvdDsxJnF1b3Q7Jmd0OwotICAgICZsdDt0Ym9keSZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAmbHQ7L3Rib2R5Jmd0OwotJmx0Oy90YWJsZSZndDsKLSZsdDt0YWJsZSBjZWxsc3BhY2luZz0mcXVvdDsyJnF1b3Q7IGNlbGxwYWRkaW5nPSZxdW90OzImcXVvdDsgd2lkdGg9JnF1b3Q7MTgwJnF1b3Q7IGJvcmRlcj0mcXVvdDsxJnF1b3Q7Jmd0OwotICAgICZsdDt0Ym9keSZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsKLSAgICAgICAgICAgICAgICByMQotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtjb2wmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgYzIKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIGMzCi0gICAgICAgICAgICAmbHQ7L3RoJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsKLSAgICAgICAgICAgICAgICBjNAotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O3JvdyZxdW90OyZndDsKLSAgICAgICAgICAgICAgICByMgotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICBhc2QKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgZHNmCi0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIGRzZgotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O3JvdyZxdW90OyZndDsKLSAgICAgICAgICAgICAgICByMwotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDsyOCZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvYnV0dG9ucy5qcGcmcXVvdDsgd2lkdGg9JnF1b3Q7MzM3JnF1b3Q7IC8mZ3Q7IAotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICBkc2YKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7L3RyJmd0OwotICAgICAgICAmbHQ7dHImZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7cm93JnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHI0Ci0gICAgICAgICAgICAmbHQ7L3RoJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgc2RmCi0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7L3RyJmd0OwotICAgICAgICAmbHQ7dHImZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7cm93JnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHI1Ci0gICAgICAgICAgICAmbHQ7L3RoJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIGRhZgotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICBzZGYKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTImcXVvdDsgYWx0PSZxdW90OyZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL2J1bGxldDEuZ2lmJnF1b3Q7IHdpZHRoPSZxdW90OzEyJnF1b3Q7IC8mZ3Q7IAotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAmbHQ7L3Rib2R5Jmd0OwotJmx0Oy90YWJsZSZndDsKLSZsdDticiAvJmd0OwotJmx0O2JyIC8mZ3Q7Ci0mbHQ7YnIgLyZndDsKLSZsdDticiAvJmd0OzwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3BhcGVycy5odG0mcXVvdDsgdGFyZ2V0PSZxdW90O19ibGFuayZxdW90OyZndDtwYXBlcnMuaHRtJmx0Oy9hJmd0OwotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgcmVmaW5lZCBkZXNjcmlwdGlvbjoKLSZsdDsvcCZndDs8L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLWFERTR5RnpFX21fbjJQSXpjT3Q0ckEiIG5hbWU9InRhc2tfQTIsX0pDckJFRHpsRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1hREU0eUZ6RV9tX24yUEl6Y090NHJBIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+Jmx0O3AmZ3Q7Ci0gICAga2V5czoKLSZsdDsvcCZndDsKLSZsdDtvbCZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtrMQotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrazIKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2szCi0gICAgJmx0Oy9saSZndDsKLSZsdDsvb2wmZ3Q7PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT4mbHQ7cCZndDsKLSAgICB1c2FnZSBndWlkYW5jZSBmb3IgdGFza19CMgotJmx0Oy9wJmd0OwotJmx0O3RhYmxlIGNlbGxzcGFjaW5nPSZxdW90OzImcXVvdDsgY2VsbHBhZGRpbmc9JnF1b3Q7MiZxdW90OyB3aWR0aD0mcXVvdDsxODAmcXVvdDsgYm9yZGVyPSZxdW90OzEmcXVvdDsmZ3Q7Ci0gICAgJmx0O3Rib2R5Jmd0OwotICAgICAgICAmbHQ7dHImZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHIxCi0gICAgICAgICAgICAmbHQ7L3RoJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsKLSAgICAgICAgICAgICAgICBjMgotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtjb2wmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgYzMKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIGM0Ci0gICAgICAgICAgICAmbHQ7L3RoJmd0OwotICAgICAgICAmbHQ7L3RyJmd0OwotICAgICAgICAmbHQ7dHImZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7cm93JnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHIyCi0gICAgICAgICAgICAmbHQ7L3RoJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIGFzZAotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICBkc2YKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgZHNmCi0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7L3RyJmd0OwotICAgICAgICAmbHQ7dHImZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7cm93JnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHIzCi0gICAgICAgICAgICAmbHQ7L3RoJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzI4JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9idXR0b25zLmpwZyZxdW90OyB3aWR0aD0mcXVvdDszMzcmcXVvdDsgLyZndDsgCi0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIGRzZgotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAgICZsdDt0ciZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtyb3cmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgcjQKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICBzZGYKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAgICZsdDt0ciZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtyb3cmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgcjUKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgZGFmCi0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIHNkZgotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDsxMiZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvYnVsbGV0MS5naWYmcXVvdDsgd2lkdGg9JnF1b3Q7MTImcXVvdDsgLyZndDsgCi0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7L3RyJmd0OwotICAgICZsdDsvdGJvZHkmZ3Q7Ci0mbHQ7L3RhYmxlJmd0OwotJmx0O2JyIC8mZ3Q7Ci0mbHQ7YnIgLyZndDsKLSZsdDticiAvJmd0OwotJmx0O2JyIC8mZ3Q7PC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+VGFzayBBMidzIHJlZmluZWQgZGVzY3JpcHRpb248L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLTV0OEd0b0w0SUJveGZhekJJXzBjckEiIG5hbWU9IndwRGVzYzEsX1NVR1FnRHppRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii01dDhHdG9MNElCb3hmYXpCSV8wY3JBIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5OndwRGVzYzE8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPnVzYWdlOndwRGVzYzE8L3VzYWdlR3VpZGFuY2U+Ci0gICAgPHJlZmluZWREZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICByZWZpbmVkOiB3cERlc2MxCi0mbHQ7L3AmZ3Q7PC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1pZm1RTkI1eTFSWktGMUhybTNDZFJBIiBuYW1lPSJ0YXNrIGFzc29jaWF0ZWQgdG8gdGFza0ExLF9GcnRNb0R6aUVkcTV5c0ZPTnIxQkdRIiBndWlkPSItaWZtUU5CNXkxUlpLRjFIcm0zQ2RSQSI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPiZsdDtwJmd0OwotICAgIGtleXM6Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBrZXkxLGtleTIKLSZsdDsvcCZndDs8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPiZsdDtwJmd0OwotICAgIHVzYWdlOgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgVGhlIHdvcmsgaXMgYmVzdCBkb25lIGluIHNldmVyYWwgc2Vzc2lvbnMsIHBlcmhhcHMgcGVyZm9ybWVkIG92ZXIgYSBmZXcgZGF5cyAob3Igd2Vla3MgYW5kIG1vbnRocyBmb3IgdmVyeSBsYXJnZQotICAgIHN5c3RlbXMpLiBUaGUgaW5pdGlhbCBmb2N1cyB3aWxsIGJlIG9uIHRoZSBhY3Rpdml0aWVzICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX21lY2hhbmlzbXMse0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0uaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7e0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0mcXVvdDsmZ3Q7SWRlbnRpZnkgRGVzaWduIE1lY2hhbmlzbXMmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduLHs1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9JnF1b3Q7Jmd0O2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduJmx0Oy9hJmd0Oywgd2l0aCBhIGdyZWF0IGRlYWwgb2YKLSAgICBpdGVyYXRpb24gd2l0aCB0aGUgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsKLSAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pbmNvcnBvcmF0ZV9kZXNpZ25fZWxlbWVudHMsezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0uaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7ezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0mcXVvdDsmZ3Q7SW5jb3Jwb3JhdGUgRXhpc3RpbmcgRGVzaWduIEVsZW1lbnRzJmx0Oy9hJmd0OyBhY3Rpdml0eSB0byBtYWtlIHN1cmUgdGhhdCBuZXcKLSAgICBlbGVtZW50cyBkbyBub3QgZHVwbGljYXRlIGZ1bmN0aW9uYWxpdHkgb2YgZXhpc3RpbmcgZWxlbWVudHMuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBBcyB0aGUgZGVzaWduIGVtZXJnZXMsIGNvbmN1cnJlbmN5IGFuZCBkaXN0cmlidXRpb24gaXNzdWVzIGFyZSBpbnRyb2R1Y2VkIGluIHRoZSBhY3Rpdml0aWVzICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvZGVzY3JpYmVfcnVudGltZV9hcmNoaXRlY3R1cmUsezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0uaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7ezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0mcXVvdDsmZ3Q7RGVzY3JpYmUgdGhlIFJ1bi10aW1lIEFyY2hpdGVjdHVyZSZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvZGVzY3JpYmVfZGlzdHJpYnV0aW9uLHs2QTExMjgwOC0wQTkwLTQyN0EtQkFCOS1FMTRGM0ZCRjcyQjV9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s2QTExMjgwOC0wQTkwLTQyN0EtQkFCOS1FMTRGM0ZCRjcyQjV9JnF1b3Q7Jmd0O0Rlc2NyaWJlIERpc3RyaWJ1dGlvbiZsdDsvYSZndDssIHJlc3BlY3RpdmVseS4gQXMgdGhlc2UgaXNzdWVzIGFyZSBjb25zaWRlcmVkLAotICAgIGNoYW5nZXMgdG8gZGVzaWduIGVsZW1lbnRzIG1heSBiZSByZXF1aXJlZCB0byBzcGxpdCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzLCB0aHJlYWRzIG9yIG5vZGVzLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgQXMgdGhlIGluZGl2aWR1YWwgbW9kZWxzIGFyZSByZWZpbmVkIHRvIGluY29ycG9yYXRlIHRoZSBhcmNoaXRlY3R1cmFsIGRlY2lzaW9ucywgdGhlIHJlc3VsdHMgYXJlIGRvY3VtZW50ZWQgaW4KLSAgICByZXNwZWN0aXZlIHZpZXcgc2VjdGlvbnMgaW4gdGhlIFNvZnR3YXJlIEFyY2hpdGVjdHVyZSBEb2N1bWVudCAoZS5nLiwgYXMgdGhlIERlc2lnbiBNb2RlbCBpcyByZWZpbmVkLCB0aGUgTG9naWNhbCBWaWV3Ci0gICAgb2YgdGhlIFNvZnR3YXJlIEFyY2hpdGVjdHVyZSBEb2N1bWVudCBpcyByZWZpbmVkLCBhcyB3ZWxsKS4gVGhlIHJlc3VsdGluZyBhcmNoaXRlY3R1cmUgaXMgcmV2aWV3ZWQuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICAmbHQ7YnIgLyZndDsKLSAgICAmbHQ7YnIgLyZndDsKLSAgICAmYW1wO25ic3A7Ci0mbHQ7L3AmZ3Q7PC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgcmVmaW5lZCBkZXNjcmlwdGlvbgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTYmcXVvdDsgYWx0PSZxdW90OyZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL2hlbHBib29rLmdpZiZxdW90OyB3aWR0aD0mcXVvdDsxNiZxdW90OyAvJmd0OwotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvcGFwZXJzLmh0bSZxdW90OyB0YXJnZXQ9JnF1b3Q7X2JsYW5rJnF1b3Q7Jmd0O3BhcGVycy5odG0mbHQ7L2EmZ3Q7Ci0mbHQ7L3AmZ3Q7PC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1wTzhMZWNlR1hqS2VhcHVMb0Zma3hBIiBuYW1lPSJyb2xlRGVzYzEsX1Axc1VZRHppRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1wTzhMZWNlR1hqS2VhcHVMb0Zma3hBIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+Jmx0O3AmZ3Q7Ci0gICAga2V5IGNvbnNpZGVyYXRpb25zOgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAga2V5MQotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAga2V5MgotJmx0Oy9wJmd0Ozwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+Jmx0O3AmZ3Q7Ci0gICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7NDc0JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9ydXBfcGxhdGZvcm0uanBnJnF1b3Q7IHdpZHRoPSZxdW90OzUwNCZxdW90OyAvJmd0O3VzYWdlIGZvciByb2xlQTEmYW1wO25ic3A7Ci0mbHQ7L3AmZ3Q7PC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+cmVmaW5lZCBkZXNjcmlwdGlvbiBmb3Igcm9sZURlc2MxPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1fVGgtanY1am0waDBmMG1GaEt0cWdRIiBuYW1lPSJyb2xlRGVzYzIsX1E5OWtBRHppRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1fVGgtanY1am0waDBmMG1GaEt0cWdRIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5IGNvbnNpZGVyYXRpb24gZm9yIHJvbGVBMjwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+Jmx0O3AmZ3Q7Ci0gICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTImcXVvdDsgYWx0PSZxdW90OyZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL2J1bGxldDEuZ2lmJnF1b3Q7IHdpZHRoPSZxdW90OzEyJnF1b3Q7IC8mZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICB1c2FnZSBndWlkYW5jZSBmb3Igcm9sZUEyCi0mbHQ7L3AmZ3Q7PC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgcmVmaW5lZCBkZXNjcmlwdGlvbiBmb3Igcm9sZUEyCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIHJlZmluZWQgZGVzY3JpcHRpb24gZm9yIHJvbGVBMgotJmx0Oy9wJmd0OzwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItQmt2NlZUZE1wZzRiRDBZa2ZIWjRkZyIgbmFtZT0idGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMixfTHdMUWdEemlFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLUJrdjZWVGRNcGc0YkQwWWtmSFo0ZGciPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5rZXlzOiB0YXNrIGFzc29jaWF0ZWQgdG8gdGFza0EyPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTp0YXNrIGFzc29jaWF0ZWQgdG8gdGFza0EyPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgcmVmaW5lZDp0YXNrIGFzc29jaWF0ZWQgdG8gdGFza0EyCi0mbHQ7L3AmZ3Q7Ci0mbHQ7dGFibGUgY2VsbHNwYWNpbmc9JnF1b3Q7MiZxdW90OyBjZWxscGFkZGluZz0mcXVvdDsyJnF1b3Q7IHdpZHRoPSZxdW90OzE4MCZxdW90OyBib3JkZXI9JnF1b3Q7MSZxdW90OyZndDsKLSAgICAmbHQ7dGJvZHkmZ3Q7Ci0gICAgICAgICZsdDt0ciZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtjb2wmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgMQotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtjb2wmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgegotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtjb2wmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgegotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtjb2wmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgegotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtjb2wmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgegotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtjb2wmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgegotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIHoKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgMgotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAgICZsdDt0ciZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICB6Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICAzCi0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7L3RyJmd0OwotICAgICAgICAmbHQ7dHImZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgegotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIDQKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIHoKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgNQotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDsvdHImZ3Q7Ci0gICAgJmx0Oy90Ym9keSZndDsKLSZsdDsvdGFibGUmZ3Q7PC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1UUnhoeEFzMXhPS05SckZDRVBwQWx3IiBuYW1lPSJ0YXNrIHdpdGggbm8gbGlua3MsXzVqSllBRHprRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1UUnhoeEFzMXhPS05SckZDRVBwQWx3Ij4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5OnRhc2sgd2l0aCBubyBsaW5rczwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6dGFzayB3aXRoIG5vIGxpbmtzPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgcmVmaW5lZDp0YXNrIHdpdGggbm8gbGlua3MKLSZsdDsvcCZndDs8L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHlEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1BZHdBam41dlJDbkVRUUxVYVlKMWR3IiBuYW1lPSJBY3Rpdml0eTIsX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1BZHdBam41dlJDbkVRUUxVYVlKMWR3Ij4KLSAgICA8bWFpbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIFRoaXMgV29ya2Zsb3cgRGV0YWlsOgotJmx0Oy9wJmd0OwotJmx0O3VsJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgUHJvdmlkZXMgdGhlIG5hdHVyYWwgJmx0O2ImZ3Q7dHJhbnNpdGlvbiBmcm9tIGFuYWx5c2lzJmx0Oy9iJmd0OyBhY3Rpdml0aWVzICZsdDtiJmd0O3RvIGRlc2lnbiZsdDsvYiZndDsgYWN0aXZpdGllcywgaWRlbnRpZnlpbmc6IAotICAgICAgICAmbHQ7dWwmZ3Q7Ci0gICAgICAgICAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZGVzaWduIGVsZW1lbnRzIGZyb20gYW5hbHlzaXMgZWxlbWVudHMKLSAgICAgICAgICAgICZsdDsvbGkmZ3Q7Ci0gICAgICAgICAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZGVzaWduIG1lY2hhbmlzbXMgZnJvbSByZWxhdGVkIGFuYWx5c2lzIG1lY2hhbmlzbXMKLSAgICAgICAgICAgICZsdDsvbGkmZ3Q7Ci0gICAgICAgICZsdDsvdWwmZ3Q7Ci0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgICZsdDtiJmd0O0Rlc2NyaWJlcyZsdDsvYiZndDsgdGhlIG9yZ2FuaXphdGlvbiBvZiB0aGUgc3lzdGVtJ3MgJmx0O2ImZ3Q7cnVuLXRpbWUgYW5kIGRlcGxveW1lbnQgYXJjaGl0ZWN0dXJlJmx0Oy9iJmd0OwotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICAmbHQ7YiZndDtPcmdhbml6ZXMgdGhlIGltcGxlbWVudGF0aW9uIG1vZGVsJmx0Oy9iJmd0OyBzbyBhcyB0byBtYWtlIHRoZSB0cmFuc2l0aW9uIGJldHdlZW4gZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBzZWFtbGVzcwotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICAmbHQ7YiZndDtNYWludGFpbnMgdGhlIGNvbnNpc3RlbmN5IGFuZCBpbnRlZ3JpdHkgb2YgdGhlIGFyY2hpdGVjdHVyZSZsdDsvYiZndDssIGVuc3VyaW5nIHRoYXQ6IAotICAgICAgICAmbHQ7dWwmZ3Q7Ci0gICAgICAgICAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgICAgICAgICAgbmV3IGRlc2lnbiBlbGVtZW50cyBpZGVudGlmaWVkIGZvciB0aGUgY3VycmVudCBpdGVyYXRpb24gYXJlIGludGVncmF0ZWQgd2l0aCBwcmUtZXhpc3RpbmcgZGVzaWduIGVsZW1lbnRzLgotICAgICAgICAgICAgJmx0Oy9saSZndDsKLSAgICAgICAgICAgICZsdDtsaSZndDsKLSAgICAgICAgICAgICAgICBtYXhpbWFsIHJlLXVzZSBvZiBhdmFpbGFibGUgY29tcG9uZW50cyBhbmQgZGVzaWduIGVsZW1lbnRzIGlzIGFjaGlldmVkIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGluIHRoZSBkZXNpZ24KLSAgICAgICAgICAgICAgICBlZmZvcnQuCi0gICAgICAgICAgICAmbHQ7L2xpJmd0OwotICAgICAgICAmbHQ7L3VsJmd0OwotICAgICZsdDsvbGkmZ3Q7Ci0mbHQ7L3VsJmd0OzwvbWFpbkRlc2NyaXB0aW9uPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz4mbHQ7cCZndDsKLSAgICBLZXkgY29uc2lkZXJhdGlvbnM6Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7dWwmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrZXkxCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTIKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2V5MwotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrZXk0Ci0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTUKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2V5NgotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrZXk3Ci0gICAgJmx0Oy9saSZndDsKLSZsdDsvdWwmZ3Q7PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT4mbHQ7cCZndDsKLSAgICBUaGUgd29yayBpcyBiZXN0IGRvbmUgaW4gc2V2ZXJhbCBzZXNzaW9ucywgcGVyaGFwcyBwZXJmb3JtZWQgb3ZlciBhIGZldyBkYXlzIChvciB3ZWVrcyBhbmQgbW9udGhzIGZvciB2ZXJ5IGxhcmdlCi0gICAgc3lzdGVtcykuIFRoZSBpbml0aWFsIGZvY3VzIHdpbGwgYmUgb24gdGhlIGFjdGl2aXRpZXMgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsKLSAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fbWVjaGFuaXNtcyx7QzdBMjZCRDctMzgyMC00OEQ5LTgzMEYtNjg0QzNBRjE1NUY5fS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDt7QzdBMjZCRDctMzgyMC00OEQ5LTgzMEYtNjg0QzNBRjE1NUY5fSZxdW90OyZndDtJZGVudGlmeSBEZXNpZ24gTWVjaGFuaXNtcyZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX2VsZW1lbnRzX3JlYWwtdGltZV9kZXNpZ24sezU4Njk2M0QwLTYwN0QtNEVDMi04RDUzLTI5MkRBRkFCOUM5Mn0uaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7ezU4Njk2M0QwLTYwN0QtNEVDMi04RDUzLTI5MkRBRkFCOUM5Mn0mcXVvdDsmZ3Q7aWRlbnRpZnlfZGVzaWduX2VsZW1lbnRzX3JlYWwtdGltZV9kZXNpZ24mbHQ7L2EmZ3Q7LCB3aXRoIGEgZ3JlYXQgZGVhbCBvZgotICAgIGl0ZXJhdGlvbiB3aXRoIHRoZSAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2luY29ycG9yYXRlX2Rlc2lnbl9lbGVtZW50cyx7NUM2NDcxNzMtNEUzMi00NTk0LTk2QTktMjU0OEI0NzcyMkZBfS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDt7NUM2NDcxNzMtNEUzMi00NTk0LTk2QTktMjU0OEI0NzcyMkZBfSZxdW90OyZndDtJbmNvcnBvcmF0ZSBFeGlzdGluZyBEZXNpZ24gRWxlbWVudHMmbHQ7L2EmZ3Q7IGFjdGl2aXR5IHRvIG1ha2Ugc3VyZSB0aGF0IG5ldwotICAgIGVsZW1lbnRzIGRvIG5vdCBkdXBsaWNhdGUgZnVuY3Rpb25hbGl0eSBvZiBleGlzdGluZyBlbGVtZW50cy4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIEFzIHRoZSBkZXNpZ24gZW1lcmdlcywgY29uY3VycmVuY3kgYW5kIGRpc3RyaWJ1dGlvbiBpc3N1ZXMgYXJlIGludHJvZHVjZWQgaW4gdGhlIGFjdGl2aXRpZXMgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsKLSAgICBocmVmPSZxdW90O3Jlc291cmNlcy9kZXNjcmliZV9ydW50aW1lX2FyY2hpdGVjdHVyZSx7NEQzNUMwMzgtQTJEMC00OEI4LTlFQ0QtNTI3MTdGRUFFMzNBfS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDt7NEQzNUMwMzgtQTJEMC00OEI4LTlFQ0QtNTI3MTdGRUFFMzNBfSZxdW90OyZndDtEZXNjcmliZSB0aGUgUnVuLXRpbWUgQXJjaGl0ZWN0dXJlJmx0Oy9hJmd0OyBhbmQgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsKLSAgICBocmVmPSZxdW90O3Jlc291cmNlcy9kZXNjcmliZV9kaXN0cmlidXRpb24sezZBMTEyODA4LTBBOTAtNDI3QS1CQUI5LUUxNEYzRkJGNzJCNX0uaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7ezZBMTEyODA4LTBBOTAtNDI3QS1CQUI5LUUxNEYzRkJGNzJCNX0mcXVvdDsmZ3Q7RGVzY3JpYmUgRGlzdHJpYnV0aW9uJmx0Oy9hJmd0OywgcmVzcGVjdGl2ZWx5LiBBcyB0aGVzZSBpc3N1ZXMgYXJlIGNvbnNpZGVyZWQsCi0gICAgY2hhbmdlcyB0byBkZXNpZ24gZWxlbWVudHMgbWF5IGJlIHJlcXVpcmVkIHRvIHNwbGl0IGJlaGF2aW9yIGFjcm9zcyBwcm9jZXNzZXMsIHRocmVhZHMgb3Igbm9kZXMuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBBcyB0aGUgaW5kaXZpZHVhbCBtb2RlbHMgYXJlIHJlZmluZWQgdG8gaW5jb3Jwb3JhdGUgdGhlIGFyY2hpdGVjdHVyYWwgZGVjaXNpb25zLCB0aGUgcmVzdWx0cyBhcmUgZG9jdW1lbnRlZCBpbgotICAgIHJlc3BlY3RpdmUgdmlldyBzZWN0aW9ucyBpbiB0aGUgU29mdHdhcmUgQXJjaGl0ZWN0dXJlIERvY3VtZW50IChlLmcuLCBhcyB0aGUgRGVzaWduIE1vZGVsIGlzIHJlZmluZWQsIHRoZSBMb2dpY2FsIFZpZXcKLSAgICBvZiB0aGUgU29mdHdhcmUgQXJjaGl0ZWN0dXJlIERvY3VtZW50IGlzIHJlZmluZWQsIGFzIHdlbGwpLiBUaGUgcmVzdWx0aW5nIGFyY2hpdGVjdHVyZSBpcyByZXZpZXdlZC4KLSZsdDsvcCZndDsKLSZsdDticiAvJmd0OwotJmx0O2JyIC8mZ3Q7PC91c2FnZUd1aWRhbmNlPgotICAgIDxwdXJwb3NlPiZsdDtwJmd0OwotICAgIFB1cnBvc2Ugb2YgdGhpcyBhY3Rpdml0eSBpcyB0byBoYXZlIHRhc2tzIHRoYXQgYXJlIGFzc29jaWF0ZWQgdG8gb3RoZXIgdGFza3MuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICAmYW1wO25ic3A7Jmx0O2ltZyBoZWlnaHQ9JnF1b3Q7NzEmcXVvdDsgYWx0PSZxdW90OyZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL3J1cC5qcGcmcXVvdDsgd2lkdGg9JnF1b3Q7MTc2JnF1b3Q7IC8mZ3Q7Ci0mbHQ7L3AmZ3Q7PC9wdXJwb3NlPgotICAgIDxhbHRlcm5hdGl2ZXM+Jmx0O3AmZ3Q7Ci0gICAgQWx0ZXJhbnRpdmVzOgotJmx0Oy9wJmd0OwotJmx0O29sJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgQWx0ZXIxCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIEFsdGVyMgotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBBbHRlcjMKLSAgICAmbHQ7L2xpJmd0OwotJmx0Oy9vbCZndDs8L2FsdGVybmF0aXZlcz4KLSAgICA8aG93dG9TdGFmZj4mbHQ7cCZndDsKLSAgICBUaGVzZSBhY3Rpdml0aWVzIGFyZSBiZXN0IGNhcnJpZWQgb3V0IGJ5IGEgc21hbGwgdGVhbSBzdGFmZmVkIGJ5IGNyb3NzLWZ1bmN0aW9uYWwgdGVhbSBtZW1iZXJzLiBJc3N1ZXMgdGhhdCBhcmUKLSAgICB0eXBpY2FsbHkgYXJjaGl0ZWN0dXJhbGx5IHNpZ25pZmljYW50IGluY2x1ZGUgdXNhYmlsaXR5LCBwZXJmb3JtYW5jZSwgc2NhbGluZywgcHJvY2VzcyBhbmQgdGhyZWFkIHN5bmNocm9uaXphdGlvbiwgYW5kCi0gICAgZGlzdHJpYnV0aW9uLiBUaGUgdGVhbSBzaG91bGQgYWxzbyBpbmNsdWRlIG1lbWJlcnMgd2l0aCBkb21haW4gZXhwZXJpZW5jZSB3aG8gY2FuIGlkZW50aWZ5IGtleSBhYnN0cmFjdGlvbnMuIFRoZSB0ZWFtCi0gICAgc2hvdWxkIGFsc28gaGF2ZSBleHBlcmllbmNlIHdpdGggbW9kZWwgb3JnYW5pemF0aW9uIGFuZCBsYXllcmluZy4gVGhlIHRlYW0gd2lsbCBuZWVkIHRvIGJlIGFibGUgdG8gcHVsbCBhbGwgdGhlc2UKLSAgICBkaXNwYXJhdGUgdGhyZWFkcyBpbnRvIGEgY29oZXNpdmUsIGNvaGVyZW50IChhbGJlaXQgcHJlbGltaW5hcnkpIGFyY2hpdGVjdHVyZS4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIEJlY2F1c2UgdGhlIGZvY3VzIG9mIHRoZSBhcmNoaXRlY3R1cmUgZWZmb3J0IGlzIHNoaWZ0aW5nIHRvd2FyZCBpbXBsZW1lbnRhdGlvbiBpc3N1ZXMsIGdyZWF0ZXIgYXR0ZW50aW9uIG5lZWRzIHRvIGJlCi0gICAgcGFpZCB0byBzcGVjaWZpYyB0ZWNobm9sb2d5IGlzc3Vlcy4gVGhpcyB3aWxsIGZvcmNlIHRoZSBhcmNoaXRlY3R1cmUgdGVhbSB0byBzaGlmdCBtZW1iZXJzIG9yIGV4cGFuZCB0byBpbmNsdWRlIHBlb3BsZQotICAgIHdpdGggZGlzdHJpYnV0aW9uIGFuZCBkZXBsb3ltZW50IGV4cGVydGlzZSAoaWYgdGhvc2UgaXNzdWVzIGFyZSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQpLiBJbiBvcmRlciB0byB1bmRlcnN0YW5kCi0gICAgdGhlIHBvdGVudGlhbCBpbXBhY3Qgb2YgdGhlIHN0cnVjdHVyZSBvbiB0aGUgaW1wbGVtZW50YXRpb24gbW9kZWwgb24gdGhlIGVhc2Ugb2YgaW50ZWdyYXRpb24sIGV4cGVydGlzZSBpbiB0aGUgc29mdHdhcmUKLSAgICBidWlsZCBtYW5hZ2VtZW50IHByb2Nlc3MgaXMgdXNlZnVsIHRvIGhhdmUuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBBdCB0aGUgc2FtZSB0aW1lLCBpdCBpcyBlc3NlbnRpYWwgdGhhdCB0aGUgYXJjaGl0ZWN0dXJlIHRlYW0gbm90IGJlIGNvbXBvc2VkIG9mIGEgbGFyZ2UgZXh0ZW5kZWQgdGVhbS4gQSBzdHJhdGVneSBmb3IKLSAgICBjb3VudGVyaW5nIHRoaXMgdHJlbmQgaXMgdG8gcmV0YWluIGEgcmVsYXRpdmVseSBzbWFsbCBjb3JlIHRlYW0gd2l0aCBhIHNhdGVsbGl0ZSBncm91cCBvZiBleHRlbmRlZCB0ZWFtIG1lbWJlcnMgdGhhdAotICAgIGFyZSBicm91Z2h0IGluIGFzICZxdW90O2NvbnN1bHRhbnRzJnF1b3Q7IG9uIGtleSBpc3N1ZXMmbHQ7YiZndDsuJmx0Oy9iJmd0OyBUaGlzIHN0cnVjdHVyZSBhbHNvIHdvcmtzIHdlbGwgZm9yIHNtYWxsZXIgcHJvamVjdHMgd2hlcmUKLSAgICBzcGVjaWZpYyBleHBlcnRpc2UgbWF5IGJlIGJvcnJvd2VkIG9yIGNvbnRyYWN0ZWQgZnJvbSBvdGhlciBvcmdhbml6YXRpb25zOyB0aGV5IGNhbiBiZSBicm91Z2h0IGluIGFzIHNwZWNpZmljIGlzc3VlcwotICAgIG5lZWQgdG8gYmUgYWRkcmVzc2VkLgotJmx0Oy9wJmd0OzwvaG93dG9TdGFmZj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5RGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1CWV9fdGlqd1JyVjQxWVVyWEl0VTB3IiBuYW1lPSJyb2xlX0EyLF9KQzk4QUR6bEVkcTV5c0ZPTnIxQkdRIiBndWlkPSItQllfX3RpandSclY0MVlVclhJdFUwdyI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleXMgY29uc2lkZXJhdGlvbjpSb2xlIEEyPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTpSb2xlIEEyPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgcmVmaW5lZCBkZXNjcmlwdGlvbiA6IFJvbGUgQTIKLSZsdDsvcCZndDs8L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLURPWnJSX3Nad3dwY1V0Y291LWpJeVEiIG5hbWU9InJvbGVfQTEsX0pDOThBVHpsRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1ET1pyUl9zWnd3cGNVdGNvdS1qSXlRIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+Um9sZSBBMTprZXkgY29uc2lkZXJhdGlvbjwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+Um9sZSBBMTp1c2FnZTwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPlJvbGUgQTE6UmVmaW5lZCBkZXNjcmlwdGlvbjwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItYXJGckppc0J5UDkwWUNyTWItaXlqZyIgbmFtZT0icm9sZURlc2Mgd2l0aCBubyBsaW5rcyxfM19VTndEemtFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLWFyRnJKaXNCeVA5MFlDck1iLWl5amciPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5rZXkgY29uc2lkZXJhdGlvbjpyb2xlRGVzYyB3aXRoIG5vIGxpbmtzPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTpyb2xlRGVzYyB3aXRoIG5vIGxpbmtzPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+cmVmaW5lZCBkZXNjcmlwdGlvbiA6IHJvbGVEZXNjIHdpdGggbm8gbGlua3M8L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLTVPZUdQSDhKUnpTUkFGUHpCZ0huSkEiIG5hbWU9InJvbGVfQjIsX01jMHp3RHpsRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii01T2VHUEg4SlJ6U1JBRlB6QmdIbkpBIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5OlJvbGUgQjI8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPnVzYWdlOlJvbGUgQjI8L3VzYWdlR3VpZGFuY2U+Ci0gICAgPHJlZmluZWREZXNjcmlwdGlvbj5yZWZpbmVkOlJvbGUgQjI8L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLVllcklqRHJJbGV3ZDhpRGhJU01nMWciIG5hbWU9InJvbGVfQjEsX01jMHp3VHpsRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1ZZXJJakRySWxld2Q4aURoSVNNZzFnIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5OlJvbGUgQjE8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPnVzYWdlOlJvbGUgQjE8L3VzYWdlR3VpZGFuY2U+Ci0gICAgPHJlZmluZWREZXNjcmlwdGlvbj5yZWZpbmVkOiBSb2xlIEIxPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1uY0xoVTR2aGc2ZGhvRUtUVGtLa0RRIiBuYW1lPSJ3cERlc2MyLF9UQ3U0SUR6aUVkcTV5c0ZPTnIxQkdRIiBndWlkPSItbmNMaFU0dmhnNmRob0VLVFRrS2tEUSI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleTp3cGRlc2MyPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTp3cGRlc2MyPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+cmVmaW5lZDogd3BkZXNjMjwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItckRYb1c2YldaXzdta0xfRTlXY3loZyIgbmFtZT0id3BEZXNjMyB3aXRoIG5vIGxpbmtzLF8xeDU3QUR6a0VkcTV5c0ZPTnIxQkdRIiBndWlkPSItckRYb1c2YldaXzdta0xfRTlXY3loZyI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleTogd3BEZXNjMyB3aXRoIG5vIGxpbmtzPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTogd3BEZXNjMyB3aXRoIG5vIGxpbmtzPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+cmVmaW5lZDogd3BEZXNjMyB3aXRoIG5vIGxpbmtzPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1obUNDci1ES1o2enI4UzZEWGRxZlNBIiBuYW1lPSJhcnRpZmFjdF9BMixfSkM5OEFqemxFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLWhtQ0NyLURLWjZ6cjhTNkRYZHFmU0EiPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5rZXkgOiBBcnRpZmFjdCBBMjwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6IEFydGlmYWN0IEEyPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+cmVmaW5lZDogQXJ0aWZhY3QgQTI8L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLUNESm9fb1lDZERpNXZwOEk2OXY5T3ciIG5hbWU9ImRlbGl2ZXJhYmxlX0EyLF9KQzk4QXp6bEVkcTV5c0ZPTnIxQkdRIiBndWlkPSItQ0RKb19vWUNkRGk1dnA4STY5djlPdyI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleXM6IERlbGl2ZXJhYmxlIEEyPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTogRGVsaXZlcmFibGUgQTI8L3VzYWdlR3VpZGFuY2U+Ci0gICAgPHJlZmluZWREZXNjcmlwdGlvbj5yZWZpbmVkOkRlbGl2ZXJhYmxlIEEyPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1RTjlSR0w1Y24wU2xiVXduR1YyR19BIiBuYW1lPSJhcnRpZmFjdF9BMixfSkRIdEFEemxFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLVFOOVJHTDVjbjBTbGJVd25HVjJHX0EiPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5rZXlzOkFydGlmYWN0IEEyPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTpBcnRpZmFjdCBBMjwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPnJlZmluZWQ6QXJ0aWZhY3QgQTI8L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLTFqVERxUzRSdl9QQUVIWUZwZW9qbUEiIG5hbWU9Im91dGNvbWVfQTIsX0pESHRBVHpsRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii0xalREcVM0UnZfUEFFSFlGcGVvam1BIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5Ok91dGNvbWUgQTI8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPnVzYWdlOk91dGNvbWUgQTI8L3VzYWdlR3VpZGFuY2U+Ci0gICAgPHJlZmluZWREZXNjcmlwdGlvbj5yZWZpbmVkOk91dGNvbWUgQTI8L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLURha3ptdkEtcWh3R0VTQ2ZaSzExc1EiIG5hbWU9ImFydGlmYWN0X0IyLF9NZFJmc0R6bEVkcTV5c0ZPTnIxQkdRIiBndWlkPSItRGFrem12QS1xaHdHRVNDZlpLMTFzUSI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleTpBcnRpZmFjdCBCMjwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6QXJ0aWZhY3QgQjI8L3VzYWdlR3VpZGFuY2U+Ci0gICAgPHJlZmluZWREZXNjcmlwdGlvbj5yZWZpbmVkOkFydGlmYWN0IEIyPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1MYUR5QXVqeEJrUFRocjI4dDJYZHdnIiBuYW1lPSJkZWxpdmVyYWJsZV9CMixfTWRSZnNUemxFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLUxhRHlBdWp4QmtQVGhyMjh0Mlhkd2ciPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5rZXk6RGVsaXZlcmFibGUgQjI8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPnVzYWdlOkRlbGl2ZXJhYmxlIEIyPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+cmVmaW5lZDpEZWxpdmVyYWJsZSBCMjwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItblR0Nkgzclh5dFVzT3FwSkxFUWpkdyIgbmFtZT0ib3V0Y29tZV9CMixfTWRrYW9UemxFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLW5UdDZIM3JYeXRVc09xcEpMRVFqZHciPgotICAgIDx1c2FnZUd1aWRhbmNlPiZhbXA7bmJzcDsmYW1wO25ic3A7JmFtcDtuYnNwOzwvdXNhZ2VHdWlkYW5jZT4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLXpCQXMxMVJnTGdfWVNiczdCZGtTdVEiIG5hbWU9InRhc2tfQTEsXzBEUl9RRURFRWRxTzlNM2Z1a1lBX0EiIGd1aWQ9Ii16QkFzMTFSZ0xnX1lTYnM3QmRrU3VRIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+VGFzayBBMSZhbXA7bmJzcDsga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT4mbHQ7cCZndDsKLSAgICBUYXNrIEExJmFtcDtuYnNwOyBndWlkYW5jZQotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTYmcXVvdDsgYWx0PSZxdW90OyZxdW90OwotICAgIHNyYz0mcXVvdDtmaWxlOi8vL0M6L0RvY3VtZW50cyUyMGFuZCUyMFNldHRpbmdzL0FkbWluaXN0cmF0b3IvSUJNL01ldGhvZExpYnJhcmllcy9QYXJpcy9QYXJpcy9QbHVnJTIwQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3N5bmNlZC5naWYmcXVvdDsKLSAgICAgd2lkdGg9JnF1b3Q7MTYmcXVvdDsgLyZndDsKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzE2JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsKLSAgICBzcmM9JnF1b3Q7ZmlsZTovLy9DOi9Eb2N1bWVudHMlMjBhbmQlMjBTZXR0aW5ncy9BZG1pbmlzdHJhdG9yL0lCTS9NZXRob2RMaWJyYXJpZXMvUGFyaXMvUGFyaXMvUGx1ZyUyMEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9oZWxwYm9vay5naWYmcXVvdDsKLSAgICAgd2lkdGg9JnF1b3Q7MTYmcXVvdDsgLyZndDsKLSZsdDsvcCZndDs8L3VzYWdlR3VpZGFuY2U+Ci0gICAgPHJlZmluZWREZXNjcmlwdGlvbj5UYXNrIEExJmFtcDtuYnNwOyByZWZpbmVkIGRlc2NyaXB0aW9uPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii15Yi1MR2lrY0E1TVBlUjhMM1lXMkNBIiBuYW1lPSJ0YXNrX0EyLF8yODg3RUVERUVkcU85TTNmdWtZQV9BIiBndWlkPSIteWItTEdpa2NBNU1QZVI4TDNZVzJDQSI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPlRhc2sgQTIga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT5UYXNrIEEyIGd1aWRhbmNlPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+VGFzayBBMiByZWZpbmVkIGRlc2NyaXB0aW9uPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii13QlZ3bktOQTd2eFBacFk1aDBuakJRIiBuYW1lPSJyb2xlX0ExLF8wRGs2TUVERUVkcU85TTNmdWtZQV9BIiBndWlkPSItd0JWd25LTkE3dnhQWnBZNWgwbmpCUSI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPlJvbGUgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT5Sb2xlIEExIGd1aWRhbmNlPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgUm9sZSBBMSByZWZpbmVkIGRlc2MKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzcxJnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsKLSAgICBzcmM9JnF1b3Q7ZmlsZTovLy9DOi9Eb2N1bWVudHMlMjBhbmQlMjBTZXR0aW5ncy9BZG1pbmlzdHJhdG9yL0lCTS9NZXRob2RMaWJyYXJpZXMvUGFyaXMvUGFyaXMvUGx1ZyUyMEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9ydXAuanBnJnF1b3Q7Ci0gICAgIHdpZHRoPSZxdW90OzE3NiZxdW90OyAvJmd0OwotJmx0Oy9wJmd0OzwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItX2ozZjhkandLeHNLYUNIRG5KSXFWQSIgbmFtZT0icm9sZV9BMixfMERrNk1VREVFZHFPOU0zZnVrWUFfQSIgZ3VpZD0iLV9qM2Y4ZGp3S3hzS2FDSERuSklxVkEiPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz4mbHQ7cCZndDsKLSAgICBSb2xlIEEyIGtleQotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTY3JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsKLSAgICBzcmM9JnF1b3Q7ZmlsZTovLy9DOi9Eb2N1bWVudHMlMjBhbmQlMjBTZXR0aW5ncy9BZG1pbmlzdHJhdG9yL0lCTS9NZXRob2RMaWJyYXJpZXMvUGFyaXMvUGFyaXMvUGx1ZyUyMEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9ydXAxX2EuZ2lmJnF1b3Q7Ci0gICAgIHdpZHRoPSZxdW90OzI2JnF1b3Q7IC8mZ3Q7Ci0mbHQ7L3AmZ3Q7PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT5Sb2xlIEEyIHVzYWdlPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+Um9sZSBBMiByZWZpbmVkIGRlc2M8L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL2RpYWdyYW0ueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUDEgd2l0aCBhbGwgZWxlbWVudHMvZGlhZ3JhbS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNThjZGIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUDEgd2l0aCBhbGwgZWxlbWVudHMvZGlhZ3JhbS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6bm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mL3J1bnRpbWUvMS4wLjAvbm90YXRpb24iIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0lIZ0owT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfNHNDdHNUemdFZHE1eXNGT05yMUJHUSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSUhnSjBleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iQUREIiBlbGVtZW50PSJfSUhnSjBPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBtZWFzdXJlbWVudFVuaXQ9IlBpeGVsIj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpQYWdlU3R5bGUiIHhtaTppZD0iX0lIZ0owdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpHdWlkZVN0eWxlIiB4bWk6aWQ9Il9JSGdKMC14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSUhnSjFPeDRFZHUyT282cS1uSFdnZyIvPgotICA8L25vdGF0aW9uOkRpYWdyYW0+Ci0gIDxvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpBY3Rpdml0eURldGFpbERpYWdyYW0geG1pOmlkPSJfSUhzWEVPeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UGhhc2UiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19EYWtRY0R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtPgotICA8bm90YXRpb246RGlhZ3JhbSB4bWk6aWQ9Il9JSHNYRWV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSJBREQiIGVsZW1lbnQ9Il9JSHNYRU94NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJQaGFzZTEiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlBhZ2VTdHlsZSIgeG1pOmlkPSJfSUhzWEV1eDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkd1aWRlU3R5bGUiIHhtaTppZD0iX0lIc1hFLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JSHNYRk94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gIDwvbm90YXRpb246RGlhZ3JhbT4KLSAgPG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSB4bWk6aWQ9Il9JSHNYRmV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpJdGVyYXRpb24iIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19FRlZyd1R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtPgotICA8bm90YXRpb246RGlhZ3JhbSB4bWk6aWQ9Il9JSHNYRnV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSJBREQiIGVsZW1lbnQ9Il9JSHNYRmV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJJdGVyYXRpb24xIiBtZWFzdXJlbWVudFVuaXQ9IlBpeGVsIj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpQYWdlU3R5bGUiIHhtaTppZD0iX0lIc1hGLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpHdWlkZVN0eWxlIiB4bWk6aWQ9Il9JSHNYR094NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSUhzWEdleDRFZHUyT282cS1uSFdnZyIvPgotICA8L25vdGF0aW9uOkRpYWdyYW0+Ci0gIDxvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpBY3Rpdml0eURldGFpbERpYWdyYW0geG1pOmlkPSJfSU1GdTZleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHkiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19FNzNySVR6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlVGFza0NvbXBvc2l0ZSIgeG1pOmlkPSJfSU1GdTZ1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX1Axc1VZRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZU5vZGUiIHhtaTppZD0iX0lNRnU2LXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9InJvbGVEZXNjMSI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfUDFzVVlEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6VGFza05vZGUiIHhtaTppZD0iX0lNRnU3T3g0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JTUZ1Ny14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJUYXNrX0xpbmtlZF9Ub19UYXNrQTEiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX0ZydE1vRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0lNRnU3ZXg0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0lNRnU4ZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JTUZ1N3V4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfRnJ0TW9EemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0lNRnU3LXg0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0lNRnU3T3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSU1GdThPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0id3BEZXNjMSBpcyBsaW5rZWQgdG8gYXJ0aWZhY3QiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19TVUdRZ0R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSU1GdThleDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lNRnU3ZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjIiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19GcnRNb0R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lNRnU4dXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IndwRGVzYzIgbGlua2VkIHRvIGRlbGl2ZXJhYmxlIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfVEN1NElEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZVRhc2tDb21wb3NpdGUiIHhtaTppZD0iX0lNRnU4LXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19ROTlrQUR6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVOb2RlIiB4bWk6aWQ9Il9JTUZ1OU94NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJyb2xlRGVzYzIiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX1E5OWtBRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlRhc2tOb2RlIiB4bWk6aWQ9Il9JTUZ1OWV4NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSU1GdS1PeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iVGFza19MaW5rZWRfVG9fdGFza0EyIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19Md0xRZ0R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JTUZ1OXV4NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JTUZ1LXV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSU1GdTkteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX0x3TFFnRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JTUZ1LU94NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JTUZ1OWV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lNRnUtZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IndwRGVzYzIgbGlua2VkIHRvIGRlbGl2ZXJhYmxlIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfVEN1NElEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lNRnUtdXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JTUZ1OXV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfTHdMUWdEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JTUZ1LS14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJ3cERlc2MxIGlzIGxpbmtlZCB0byBhcnRpZmFjdCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX1NVR1FnRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpBY3Rpdml0eURldGFpbERpYWdyYW0+Ci0gIDxub3RhdGlvbjpEaWFncmFtIHhtaTppZD0iX0lNRnVfT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IkFERCIgZWxlbWVudD0iX0lNRnU2ZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFjdGl2aXR5MSIgbWVhc3VyZW1lbnRVbml0PSJQaXhlbCI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JVVpXVU94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSU1GdTZ1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lVWldVZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSVVaV1V1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JVVpXVS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lVWldWT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lWRUVzT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEwIiB5PSIxODYiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVZRUjhPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lNRnU3dXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVlFSOGV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lWUVI4dXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVZRUjgteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVlFSOU94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVlFSOXV4NEVkdTJPbzZxLW5IV2dnIiB4PSItMTIiIHk9IjQ5IiB3aWR0aD0iMTUxIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lWV1lrT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDIiIGVsZW1lbnQ9Il9JTUZ1OGV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSVZXWWtleDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JVldZa3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lWV1lrLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSVZXWWxPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSVZXWWx1eDRFZHUyT282cS1uSFdnZyIgeD0iNjkiIHk9IjI5NyIgd2lkdGg9Ijk2Ii8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lWV1lsLXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JTUZ1OC14NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSVZXWW1PeDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JVldZbWV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lWV1ltdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSVZXWW0teDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSVZXWW5leDRFZHUyT282cS1uSFdnZyIgeD0iMjExIiB5PSIxMjkiIHdpZHRoPSIyMTAiIGhlaWdodD0iNTIiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVZXWW51eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lNRnU5LXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVldZbi14NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lWV1lvT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVZXWW9leDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVldZb3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVldZcE94NEVkdTJPbzZxLW5IV2dnIiB4PSIzNDIiIHk9IjUyIiB3aWR0aD0iNjMiIGhlaWdodD0iNTIiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVZXWXBleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lNRnUtdXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVldZcHV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lWV1lwLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVZXWXFPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVldZcWV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVldZcS14NEVkdTJPbzZxLW5IV2dnIiB4PSIyNzQiIHk9IjI1NSIgd2lkdGg9IjE1NCIgaGVpZ2h0PSI1MiIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246UGFnZVN0eWxlIiB4bWk6aWQ9Il9JTUZ1X2V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246R3VpZGVTdHlsZSIgeG1pOmlkPSJfSU1GdV91eDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lNRnVfLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgPC9ub3RhdGlvbjpEaWFncmFtPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0lWaWwydXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfQlM2Z0VUemxFZHE1eXNGT05yMUJHUSIvPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZVRhc2tDb21wb3NpdGUiIHhtaTppZD0iX0lWaWwyLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI18wRGs2TUVERUVkcU85TTNmdWtZQV9BIi8+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JVmlsM094NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSVZpbDNleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzBEUl9RRURFRWRxTzlNM2Z1a1lBX0EiLz4KLSAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JVmlsM2V4NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JVmlsM094NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lWaWwzdXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI18wRHVyTUVERUVkcU85TTNmdWtZQV9BIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JVmlsMy14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfMER1ck1VREVFZHFPOU0zZnVrWUFfQSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lWaWw0T3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjIiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI18wRFJfUUVERUVkcU85TTNmdWtZQV9BIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lWaWw0ZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzBEdXJNMERFRWRxTzlNM2Z1a1lBX0EiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVUYXNrQ29tcG9zaXRlIiB4bWk6aWQ9Il9JVmlsNHV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfMERrNk1VREVFZHFPOU0zZnVrWUFfQSIvPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSVZpbDQteDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lWaWw1T3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI18yODg3RUVERUVkcU85TTNmdWtZQV9BIi8+Ci0gICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSVZpbDVPeDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSVZpbDQteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JVmlsNWV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfMjlabkFFREVFZHFPOU0zZnVrWUFfQSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lWaWw1dXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjIiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI18yODg3RUVERUVkcU85TTNmdWtZQV9BIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lWaWw1LXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzI5Wm5Ba0RFRWRxTzlNM2Z1a1lBX0EiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpBY3Rpdml0eURldGFpbERpYWdyYW0+Ci0gIDxub3RhdGlvbjpEaWFncmFtIHhtaTppZD0iX0lWaWw2T3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IkFERCIgZWxlbWVudD0iX0lWaWwydXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFjdGl2aXR5MiIgbWVhc3VyZW1lbnRVbml0PSJQaXhlbCI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JVmlsN094NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSVZpbDIteDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lWaWw3ZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSVZpbDd1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JVmlsNy14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lWaWw4T3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lWaWw4dXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JVmlsOC14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSVZpbDNPeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lWaWw5T3g0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSVZpbDlleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JVmlsOXV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lWaWw5LXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lWaWwtZXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JVmlsLXV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSVZpbDRPeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lWaWwtLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSVZpbF9PeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JVmlsX2V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lWaWxfdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lWaW1BT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JVmltQWV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSVZpbDR1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lWaW1BdXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSVZpbUEteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JVmltQk94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lWaW1CZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lWaW1CLXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JVmltQ094NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSVZpbDQteDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lWaW1DZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSVZpbUN1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JVmltQy14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lWaW1ET3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lWaW1EdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JVmltRC14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSVZpbDV1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lWaW1FT3g0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSVZpbUVleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JVmltRXV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lWaW1FLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lWaW1GZXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246UGFnZVN0eWxlIiB4bWk6aWQ9Il9JVmlsNmV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246R3VpZGVTdHlsZSIgeG1pOmlkPSJfSVZpbDZ1eDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lWaWw2LXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkVkZ2UiIHhtaTppZD0iX0lXSE5rT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjMwMDEiIGVsZW1lbnQ9Il9JVmlsM2V4NEVkdTJPbzZxLW5IV2dnIiBzb3VyY2U9Il9JVmlsOC14NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JVmlsOC14NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVhjcVVPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwNCI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSVhjcVVleDRFZHUyT282cS1uSFdnZyIgeT0iNDAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpSb3V0aW5nU3R5bGUiIHhtaTppZD0iX0lXSE5rZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSVdITmt1eDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lXSE5rLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0lhQ0VRT3g0RWR1Mk9vNnEtbkhXZ2ciIHBvaW50cz0iWzAsIDAsIDAsIDBdJFswLCAwLCAwLCAwXSIvPgotICAgIDwvZWRnZXM+Ci0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpFZGdlIiB4bWk6aWQ9Il9JYUNFUWV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIzMDAxIiBlbGVtZW50PSJfSVZpbDVPeDRFZHUyT282cS1uSFdnZyIgc291cmNlPSJfSVZpbUNPeDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSVZpbUNPeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lhSUs0T3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDQiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0lhSUs0ZXg0RWR1Mk9vNnEtbkhXZ2ciIHk9IjQwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Um91dGluZ1N0eWxlIiB4bWk6aWQ9Il9JYUNFUXV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lhQ0VRLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JYUNFUk94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9JYUlLNHV4NEVkdTJPbzZxLW5IV2dnIiBwb2ludHM9IlswLCAwLCAwLCAwXSRbMCwgMCwgMCwgMF0iLz4KLSAgICA8L2VkZ2VzPgotICA8L25vdGF0aW9uOkRpYWdyYW0+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9tb2RlbC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9tb2RlbC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYmI0YjEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUDEgd2l0aCBhbGwgZWxlbWVudHMvbW9kZWwueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iXzR5YzNzVHpnRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il80eWMzc1R6Z0VkcTV5c0ZPTnIxQkdRIj4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il80eWMzc2p6Z0VkcTV5c0ZPTnIxQkdRIiBpZD0iLUUtZDRKY3UyOTdyeFVxOGx0ZThxbnciIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il93eURud0R6aUVkcTV5c0ZPTnIxQkdRIiBpZD0iLVlWVFpSRTVveTVvR2N1ZTFYWGgzZFEiIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9QMld3MFR6a0VkcTV5c0ZPTnIxQkdRIiBpZD0iLVZSVUNTaEF2WHJzTGdzN1BaekhnVXciIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9MLTZUUUR6bUVkcTV5c0ZPTnIxQkdRIiBpZD0iLW5VSDB2b0Q3Um9LUWdQVDByYk93UVEiIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9pb1YtUUR6bUVkcTV5c0ZPTnIxQkdRIiBpZD0iLWFERTR5RnpFX21fbjJQSXpjT3Q0ckEiIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il80SE40b0R6OEVkcUVacFRLMFdBVWR3IiBpZD0iLWlmbVFOQjV5MVJaS0YxSHJtM0NkUkEiIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il80STIzWUR6OEVkcUVacFRLMFdBVWR3IiBpZD0iLTV0OEd0b0w0SUJveGZhekJJXzBjckEiIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9tTmZva0R6OUVkcUVacFRLMFdBVWR3IiBpZD0iLXBPOExlY2VHWGpLZWFwdUxvRmZreEEiIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il8zalZUQUR6OUVkcUVacFRLMFdBVWR3IiBpZD0iLV9UaC1qdjVqbTBoMGYwbUZoS3RxZ1EiIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9GaEREc0QwQkVkcUVacFRLMFdBVWR3IiBpZD0iLUJrdjZWVGRNcGc0YkQwWWtmSFo0ZGciIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9MWUc5c0QwQkVkcUVacFRLMFdBVWR3IiBpZD0iLVRSeGh4QXMxeE9LTlJyRkNFUHBBbHciIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9XZTlyY0QwREVkcUVacFRLMFdBVWR3IiBpZD0iLUFkd0FqbjV2UkNuRVFRTFVhWUoxZHciIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9oRmFGc0QwREVkcUVacFRLMFdBVWR3IiBpZD0iLUJZX190aWp3UnJWNDFZVXJYSXRVMHciIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9FVE5RTUQwRUVkcUVacFRLMFdBVWR3IiBpZD0iLURPWnJSX3Nad3dwY1V0Y291LWpJeVEiIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9TYUVkTUQwRUVkcUVacFRLMFdBVWR3IiBpZD0iLWFyRnJKaXNCeVA5MFlDck1iLWl5amciIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9JY19vc0QwSEVkcWpBSTc3REh2QndBIiBpZD0iLTVPZUdQSDhKUnpTUkFGUHpCZ0huSkEiIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9JZEl5b0QwSEVkcWpBSTc3REh2QndBIiBpZD0iLVllcklqRHJJbGV3ZDhpRGhJU01nMWciIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9MNHlhSUQwSEVkcWpBSTc3REh2QndBIiBpZD0iLW5jTGhVNHZoZzZkaG9FS1RUa0trRFEiIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9VREVUOEQwSEVkcWpBSTc3REh2QndBIiBpZD0iLXJEWG9XNmJXWl83bWtMX0U5V2N5aGciIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9hYlpTZ0QwSUVkcWpBSTc3REh2QndBIiBpZD0iLWhtQ0NyLURLWjZ6cjhTNkRYZHFmU0EiIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9NTDdHb0QwSkVkcWpBSTc3REh2QndBIiBpZD0iLUNESm9fb1lDZERpNXZwOEk2OXY5T3ciIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9RaDB2NEQwSkVkcWpBSTc3REh2QndBIiBpZD0iLVFOOVJHTDVjbjBTbGJVd25HVjJHX0EiIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9zWmdCWUQwSkVkcWpBSTc3REh2QndBIiBpZD0iLTFqVERxUzRSdl9QQUVIWUZwZW9qbUEiIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il92ZlBEUUQwSkVkcWpBSTc3REh2QndBIiBpZD0iLURha3ptdkEtcWh3R0VTQ2ZaSzExc1EiIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il84ZzlOSUQwSkVkcWpBSTc3REh2QndBIiBpZD0iLUxhRHlBdWp4QmtQVGhyMjh0Mlhkd2ciIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9xNjBhNEQwZkVkcU5NX1lQNTNIS0J3IiBpZD0iLW5UdDZIM3JYeXRVc09xcEpMRVFqZHciIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il84Ri1EVUVERUVkcU85TTNmdWtZQV9BIiBpZD0iLXpCQXMxMVJnTGdfWVNiczdCZGtTdVEiIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9fR01URUVERUVkcU85TTNmdWtZQV9BIiBpZD0iLXliLUxHaWtjQTVNUGVSOEwzWVcyQ0EiIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9HX1dBb0VERkVkcU85TTNmdWtZQV9BIiBpZD0iLXdCVnduS05BN3Z4UFpwWTVoMG5qQlEiIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9PckU5UUVERkVkcU85TTNmdWtZQV9BIiBpZD0iLV9qM2Y4ZGp3S3hzS2FDSERuSklxVkEiIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfNHNDdHNEemdFZHE1eXNGT05yMUJHUSIgbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBndWlkPSJfNHNDdHNEemdFZHE1eXNGT05yMUJHUSI+Ci0gICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX0RhSGtnRHppRWRxNXlzRk9OcjFCR1EiIG5hbWU9IlBoYXNlMSIgZ3VpZD0iX0RhSGtnRHppRWRxNXlzRk9OcjFCR1EiPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX0VGVnJ3RHppRWRxNXlzRk9OcjFCR1EiIG5hbWU9Ikl0ZXJhdGlvbjEiIGd1aWQ9Il9FRlZyd0R6aUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX0U3M3JJRHppRWRxNXlzRk9OcjFCR1EiIG5hbWU9IkFjdGl2aXR5MSIgZ3VpZD0iX0U3M3JJRHppRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHkiIHhtaTppZD0iX0U3M3JJVHppRWRxNXlzRk9OcjFCR1EiIG5hbWU9IkFjdGl2aXR5MSIgZ3VpZD0iX0U3M3JJVHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IlRoaXMgYWN0aXZpdHkgY29udGFpbnMgdGFza3MgdGhhdCBhcmUgYXNzb2NpYXRlZCB0byBhbm90aGVyIHRhc2tzLkFsc28gdGhlaXIgc3RlcHMgYXJlIGFkZGVkLiIgcHJlc2VudGF0aW9uTmFtZT0iQWN0aXZpdHkxIGNvbnRhaW5pbmcgdGFza3MgbGlua2VkIHRvIG1ldGhvZCBlbGVtZW50cyIgcHJlZml4PSJQcmVmaXgiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9InRydWUiIHN1cGVyQWN0aXZpdGllcz0iX0VGVnJ3VHppRWRxNXlzRk9OcjFCR1EiIGJyZWFrZG93bkVsZW1lbnRzPSJfRnJ0TW9EemlFZHE1eXNGT05yMUJHUSBfTHdMUWdEemlFZHE1eXNGT05yMUJHUSBfUDFzVVlEemlFZHE1eXNGT05yMUJHUSBfUTk5a0FEemlFZHE1eXNGT05yMUJHUSBfU1VHUWdEemlFZHE1eXNGT05yMUJHUSBfVEN1NElEemlFZHE1eXNGT05yMUJHUSBfMXg1N0FEemtFZHE1eXNGT05yMUJHUSBfM19VTndEemtFZHE1eXNGT05yMUJHUSBfNWpKWUFEemtFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVlWVFpSRTVveTVvR2N1ZTFYWGgzZFEiIGhyZWY9InVtYTovLy1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53Iy1ZVlRaUkU1b3k1b0djdWUxWFhoM2RRIi8+Ci0gICAgICAgICAgICA8cm9hZG1hcHMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX1prMzlnQS1TRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICAgIDxzdXBwb3J0aW5nTWF0ZXJpYWxzIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgICA8Y2hlY2tsaXN0cyBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgICAgPGNvbmNlcHRzIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19OREwta0EtU0VkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgICA8Y29uY2VwdHMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX2g4UkdRQS1TRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICAgIDxleGFtcGxlcyBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgICAgPGd1aWRlbGluZXMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICAgIDxyZXVzYWJsZUFzc2V0cyBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIHhtaTppZD0iX0ZydE1vRHppRWRxNXlzRk9OcjFCR1EiIG5hbWU9InRhc2sgbGlua2VkIHRvIHRhc2tBMSIgZ3VpZD0iX0ZydE1vRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249InRhc2sgYXNzb2NpYXRlZCB0byB0YXNrQTEiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2tfTGlua2VkX1RvX1Rhc2tBMSIgc3VwZXJBY3Rpdml0aWVzPSJfRTczcklUemlFZHE1eXNGT05yMUJHUSIgYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk9Il9ROTlrQUR6aUVkcTV5c0ZPTnIxQkdRIiBtYW5kYXRvcnlJbnB1dD0iX1NVR1FnRHppRWRxNXlzRk9OcjFCR1EiIG91dHB1dD0iX1RDdTRJRHppRWRxNXlzRk9OcjFCR1EiIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfUDFzVVlEemlFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWlmbVFOQjV5MVJaS0YxSHJtM0NkUkEiIGhyZWY9InVtYTovLy1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53Iy1pZm1RTkI1eTFSWktGMUhybTNDZFJBIi8+Ci0gICAgICAgICAgICA8VGFzayBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfN004bnNBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLVMxaWdMU2k2QUlfdmx1eldPQ3U2VHcjX3R2RjRNQkJQRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I190emtJZ0JCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tUzFpZ0xTaTZBSV92bHV6V09DdTZUdyNfdUNCYlFCQlBFZHFCczdLaGRWTFJMQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIHhtaTppZD0iX0x3TFFnRHppRWRxNXlzRk9OcjFCR1EiIG5hbWU9InRhc2sgbGlua2VkIHRvIHRhc2tBMiIgZ3VpZD0iX0x3TFFnRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249InRhc2sgbGlua2VkIHRvIHRhc2tBMiIgcHJlc2VudGF0aW9uTmFtZT0iVGFza19MaW5rZWRfVG9fdGFza0EyIiBzdXBlckFjdGl2aXRpZXM9Il9FNzNySVR6aUVkcTV5c0ZPTnIxQkdRIiBtYW5kYXRvcnlJbnB1dD0iX1RDdTRJRHppRWRxNXlzRk9OcjFCR1EiIG91dHB1dD0iX1NVR1FnRHppRWRxNXlzRk9OcjFCR1EiIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfUTk5a0FEemlFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUJrdjZWVGRNcGc0YkQwWWtmSFo0ZGciIGhyZWY9InVtYTovLy1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53Iy1Ca3Y2VlRkTXBnNGJEMFlrZkhaNGRnIi8+Ci0gICAgICAgICAgICA8VGFzayBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLTEzcThKSkFhMGl4NnJETVpBcXd5MXcjX3RpMkJZQkJPRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190azdzRUJCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyNfdG5kYm9CQk9FZHFCczdLaGRWTFJMQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iX1Axc1VZRHppRWRxNXlzRk9OcjFCR1EiIG5hbWU9InJvbGVEZXNjMSIgZ3VpZD0iX1Axc1VZRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249InJvbGVEZXNjMSBsaW5rZWQgdG8gcm9sZUExIiBwcmVzZW50YXRpb25OYW1lPSJyb2xlRGVzYzEiIHByZWZpeD0icHJlZml4IiBzdXBlckFjdGl2aXRpZXM9Il9FNzNySVR6aUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItcE84TGVjZUdYaktlYXB1TG9GZmt4QSIgaHJlZj0idW1hOi8vLUUtZDRKY3UyOTdyeFVxOGx0ZThxbncjLXBPOExlY2VHWGpLZWFwdUxvRmZreEEiLz4KLSAgICAgICAgICAgIDxSb2xlIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI181NXprMEEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgeG1pOmlkPSJfUTk5a0FEemlFZHE1eXNGT05yMUJHUSIgbmFtZT0icm9sZURlc2MyIiBndWlkPSJfUTk5a0FEemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0icm9sZURlc2MyIGxpbmtlZCB0byByb2xlQTIiIHByZXNlbnRhdGlvbk5hbWU9InJvbGVEZXNjMiIgc3VwZXJBY3Rpdml0aWVzPSJfRTczcklUemlFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLV9UaC1qdjVqbTBoMGYwbUZoS3RxZ1EiIGhyZWY9InVtYTovLy1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53Iy1fVGgtanY1am0waDBmMG1GaEt0cWdRIi8+Ci0gICAgICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNmszVUFBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9TVUdRZ0R6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJ3cERlc2MxIiBndWlkPSJfU1VHUWdEemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0idGhpcyB3cCBpcyBsaW5rZWQgdG8gYXJ0aWZhY3QiIHByZXNlbnRhdGlvbk5hbWU9IndwRGVzYzEgaXMgbGlua2VkIHRvIGFydGlmYWN0IiBwcmVmaXg9InByZWZpeCIgc3VwZXJBY3Rpdml0aWVzPSJfRTczcklUemlFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTV0OEd0b0w0SUJveGZhekJJXzBjckEiIGhyZWY9InVtYTovLy1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53Iy01dDhHdG9MNElCb3hmYXpCSV8wY3JBIi8+Ci0gICAgICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19FN1owa0EtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX1RDdTRJRHppRWRxNXlzRk9OcjFCR1EiIG5hbWU9IndwRGVzYzIiIGd1aWQ9Il9UQ3U0SUR6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSJ3cGRlc2MyIGxpbmtlZCB0byBkZWxpdmVyYWJsZSIgcHJlc2VudGF0aW9uTmFtZT0id3BEZXNjMiBsaW5rZWQgdG8gZGVsaXZlcmFibGUiIHByZWZpeD0icHJlZml4IiBzdXBlckFjdGl2aXRpZXM9Il9FNzNySVR6aUVkcTV5c0ZPTnIxQkdRIiBkZWxpdmVyYWJsZVBhcnRzPSJfV3JfeThEemtFZHE1eXNGT05yMUJHUSBfWHNYcTBEemtFZHE1eXNGT05yMUJHUSBfUk1ON0VEemxFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLW5jTGhVNHZoZzZkaG9FS1RUa0trRFEiIGhyZWY9InVtYTovLy1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53Iy1uY0xoVTR2aGc2ZGhvRUtUVGtLa0RRIi8+Ci0gICAgICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19KQnFmVUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX1dyX3k4RHprRWRxNXlzRk9OcjFCR1EiIG5hbWU9Im91dGNvbWVfQTEiIGd1aWQ9Il9Xcl95OER6a0VkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX1hzWHEwRHprRWRxNXlzRk9OcjFCR1EiIG5hbWU9ImFydGlmYWN0X0ExIiBndWlkPSJfWHNYcTBEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il8xeDU3QUR6a0VkcTV5c0ZPTnIxQkdRIiBuYW1lPSJ3cERlc2MzIHdpdGggbm8gbGlua3MiIGd1aWQ9Il8xeDU3QUR6a0VkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjogd3BEZXNjMyB3aXRoIG5vIGxpbmtzIiBwcmVzZW50YXRpb25OYW1lPSJ3cERlc2MzIHdpdGggbm8gbGlua3MiIHByZWZpeD0icHJlZml4IiBzdXBlckFjdGl2aXRpZXM9Il9FNzNySVR6aUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItckRYb1c2YldaXzdta0xfRTlXY3loZyIgaHJlZj0idW1hOi8vLUUtZDRKY3UyOTdyeFVxOGx0ZThxbncjLXJEWG9XNmJXWl83bWtMX0U5V2N5aGciLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il8zX1VOd0R6a0VkcTV5c0ZPTnIxQkdRIiBuYW1lPSJyb2xlRGVzYyB3aXRoIG5vIGxpbmtzIiBndWlkPSJfM19VTndEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6cm9sZURlc2Mgd2l0aCBubyBsaW5rcyIgcHJlc2VudGF0aW9uTmFtZT0icm9sZURlc2Mgd2l0aCBubyBsaW5rcyIgc3VwZXJBY3Rpdml0aWVzPSJfRTczcklUemlFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWFyRnJKaXNCeVA5MFlDck1iLWl5amciIGhyZWY9InVtYTovLy1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53Iy1hckZySmlzQnlQOTBZQ3JNYi1peWpnIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgeG1pOmlkPSJfNWpKWUFEemtFZHE1eXNGT05yMUJHUSIgbmFtZT0idGFzayB3aXRoIG5vIGxpbmtzIiBndWlkPSJfNWpKWUFEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6dGFzayB3aXRoIG5vIGxpbmtzIiBwcmVzZW50YXRpb25OYW1lPSJ0YXNrIHdpdGggbm8gbGlua3MiIHN1cGVyQWN0aXZpdGllcz0iX0U3M3JJVHppRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1UUnhoeEFzMXhPS05SckZDRVBwQWx3IiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtVFJ4aHhBczF4T0tOUnJGQ0VQcEFsdyIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9STU43RUR6bEVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgZ3VpZD0iX1JNTjdFRHpsRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfZjZwd1VEempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y2cHdVRHpqRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX2Y2cHdVVHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mNnB3VVR6akVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX2Y2cHdVanpqRWRxNXlzRk9OcjFCR1EiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfZjZwd1V6empFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y2cHdVenpqRWRxNXlzRk9OcjFCR1EiIGVsZW1lbnQ9Il9GcnRNb0R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX2Y2cHdWRHpqRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX2Y2cHdWVHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mNnB3VlR6akVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX2Y2cHdWanpqRWRxNXlzRk9OcjFCR1EiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfZjZwd1Z6empFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y2cHdWenpqRWRxNXlzRk9OcjFCR1EiIGVsZW1lbnQ9Il9Md0xRZ0R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX2Y2cHdXRHpqRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX2Y2cHdXVHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mNnB3V1R6akVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX2Y2cHdXanpqRWRxNXlzRk9OcjFCR1EiIHg9IjEwLjAiIHk9IjE4Ni4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX2Y2cHdXenpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mNnB3V3p6akVkcTV5c0ZPTnIxQkdRIiBlbGVtZW50PSJfUDFzVVlEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9mNnB3WER6akVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9mNnB3WFR6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjZwd1hUempFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9mNnB3WGp6akVkcTV5c0ZPTnIxQkdRIiB4PSIyMTEuMCIgeT0iMTI5LjAiLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfZjZwd1h6empFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y2cHdYenpqRWRxNXlzRk9OcjFCR1EiIGVsZW1lbnQ9Il9ROTlrQUR6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX2Y2cHdZRHpqRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSIyMTAuMCIgaGVpZ2h0PSI1Mi4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9mNnB3WVR6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjZwd1lUempFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9mNnB3WWp6akVkcTV5c0ZPTnIxQkdRIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX2Y2cHdZenpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mNnB3WXp6akVkcTV5c0ZPTnIxQkdRIiBlbGVtZW50PSJfU1VHUWdEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9mNnB3WkR6akVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9mNnB3WlR6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjZwd1pUempFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9mNnB3Wmp6akVkcTV5c0ZPTnIxQkdRIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX2Y2cHdaenpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mNnB3Wnp6akVkcTV5c0ZPTnIxQkdRIiBlbGVtZW50PSJfVEN1NElEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9mNnB3YUR6akVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9mN1BtTUR6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjdQbU1EempFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il9mN1BtTVR6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjdQbU1UempFZHE1eXNGT05yMUJHUSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9mN1BtTWp6akVkcTV5c0ZPTnIxQkdRIiB4PSItMTIuMCIgeT0iNDkuMCIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfZjdqSU1UempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y3aklNVHpqRWRxNXlzRk9OcjFCR1EiIGFuY2hvcj0iX2Y3aklNRHpqRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX2dXWGI4VHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9nV1hiOFR6akVkcTV5c0ZPTnIxQkdRIiBhbmNob3I9Il9nV1hiOER6akVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9zUW9Qc1R6OUVkcUVacFRLMFdBVWR3IiBndWlkPSJfc1FvUHNUejlFZHFFWnBUSzBXQVVkdyIgYW5jaG9yPSJfc1FvUHNEejlFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfdGlsbTBUejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iX3RpbG0wVHo5RWRxRVpwVEswV0FVZHciIGFuY2hvcj0iX3RpbG0wRHo5RWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX3hINnV3VHo5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il94SDZ1d1R6OUVkcUVacFRLMFdBVWR3IiBhbmNob3I9Il94SDZ1d0R6OUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il8wVTlTZ1R6OUVkcUVacFRLMFdBVWR3IiBndWlkPSJfMFU5U2dUejlFZHFFWnBUSzBXQVVkdyIgYW5jaG9yPSJfMFU5U2dEejlFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfOGlFZDZ6ejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iXzhpRWQ2eno5RWRxRVpwVEswV0FVZHciIGFuY2hvcj0iXzhpRWQ2ano5RWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX1lkcmlRVDBBRWRxRVpwVEswV0FVZHciIGd1aWQ9Il9ZZHJpUVQwQUVkcUVacFRLMFdBVWR3IiBhbmNob3I9Il9ZZHJpUUQwQUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9ZdzVaTVQwQUVkcUVacFRLMFdBVWR3IiBndWlkPSJfWXc1Wk1UMEFFZHFFWnBUSzBXQVVkdyIgYW5jaG9yPSJfWXc1Wk1EMEFFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfeUtYQU1UMGVFZHFOTV9ZUDUzSEtCdyIgZ3VpZD0iX3lLWEFNVDBlRWRxTk1fWVA1M0hLQnciIGFuY2hvcj0iX3lLWEFNRDBlRWRxTk1fWVA1M0hLQnciLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX3lpREhjRDBlRWRxTk1fWVA1M0hLQnciIGd1aWQ9Il95aURIY0QwZUVkcU5NX1lQNTNIS0J3IiBhbmNob3I9Il95aDU5Z0QwZUVkcU5NX1lQNTNIS0J3Ii8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfZjdqSU1EempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y3aklNRHpqRWRxNXlzRk9OcjFCR1EiIGdyYXBoRWRnZT0iX2Y3aklNVHpqRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9nV1hiOER6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZ1dYYjhEempFZHE1eXNGT05yMUJHUSIgZ3JhcGhFZGdlPSJfZ1dYYjhUempFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX3NRb1BzRHo5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il9zUW9Qc0R6OUVkcUVacFRLMFdBVWR3IiBncmFwaEVkZ2U9Il9zUW9Qc1R6OUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfdGlsbTBEejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iX3RpbG0wRHo5RWRxRVpwVEswV0FVZHciIGdyYXBoRWRnZT0iX3RpbG0wVHo5RWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il94SDZ1d0R6OUVkcUVacFRLMFdBVWR3IiBndWlkPSJfeEg2dXdEejlFZHFFWnBUSzBXQVVkdyIgZ3JhcGhFZGdlPSJfeEg2dXdUejlFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iXzBVOVNnRHo5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il8wVTlTZ0R6OUVkcUVacFRLMFdBVWR3IiBncmFwaEVkZ2U9Il8wVTlTZ1R6OUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfOGlFZDZqejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iXzhpRWQ2ano5RWRxRVpwVEswV0FVZHciIGdyYXBoRWRnZT0iXzhpRWQ2eno5RWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9ZZHJpUUQwQUVkcUVacFRLMFdBVWR3IiBndWlkPSJfWWRyaVFEMEFFZHFFWnBUSzBXQVVkdyIgZ3JhcGhFZGdlPSJfWWRyaVFUMEFFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX1l3NVpNRDBBRWRxRVpwVEswV0FVZHciIGd1aWQ9Il9ZdzVaTUQwQUVkcUVacFRLMFdBVWR3IiBncmFwaEVkZ2U9Il9ZdzVaTVQwQUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfeUtYQU1EMGVFZHFOTV9ZUDUzSEtCdyIgZ3VpZD0iX3lLWEFNRDBlRWRxTk1fWVA1M0hLQnciIGdyYXBoRWRnZT0iX3lLWEFNVDBlRWRxTk1fWVA1M0hLQnciLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il95aDU5Z0QwZUVkcU5NX1lQNTNIS0J3IiBndWlkPSJfeWg1OWdEMGVFZHFOTV9ZUDUzSEtCdyIgZ3JhcGhFZGdlPSJfeWlESGNEMGVFZHFOTV9ZUDUzSEtCdyIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9mN1BtTXp6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjdQbU16empFZHE1eXNGT05yMUJHUSIgZWxlbWVudD0iX0ZydE1vRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfZjdQbU5EempFZHE1eXNGT05yMUJHUSIgd2lkdGg9IjE1MS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX2Y3UG1OVHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mN1BtTlR6akVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iX2Y3UG1OanpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mN1BtTmp6akVkcTV5c0ZPTnIxQkdRIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiLz4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX2Y3UG1OenpqRWRxNXlzRk9OcjFCR1EiIHg9IjY5LjAiIHk9IjI5Ny4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX2Y3UG1PRHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mN1BtT0R6akVkcTV5c0ZPTnIxQkdRIiBlbGVtZW50PSJfRnJ0TW9EemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9mN1BtT1R6akVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iOTYuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il84aUVkNER6OUVkcUVacFRLMFdBVWR3IiBndWlkPSJfOGlFZDREejlFZHFFWnBUSzBXQVVkdyI+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il84aUVkNFR6OUVkcUVacFRLMFdBVWR3IiBndWlkPSJfOGlFZDRUejlFZHFFWnBUSzBXQVVkdyIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il84aUVkNGp6OUVkcUVacFRLMFdBVWR3IiB4PSIzNDIuMCIgeT0iNTIuMCIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfOGlFZDdUejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iXzhpRWQ3VHo5RWRxRVpwVEswV0FVZHciIGFuY2hvcj0iXzhpRWQ3RHo5RWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX1lkcmlRejBBRWRxRVpwVEswV0FVZHciIGd1aWQ9Il9ZZHJpUXowQUVkcUVacFRLMFdBVWR3IiBhbmNob3I9Il9ZZHJpUWowQUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9ZdzVaTXowQUVkcUVacFRLMFdBVWR3IiBndWlkPSJfWXc1Wk16MEFFZHFFWnBUSzBXQVVkdyIgYW5jaG9yPSJfWXc1Wk1qMEFFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfeUtYQU16MGVFZHFOTV9ZUDUzSEtCdyIgZ3VpZD0iX3lLWEFNejBlRWRxTk1fWVA1M0hLQnciIGFuY2hvcj0iX3lLWEFNajBlRWRxTk1fWVA1M0hLQnciLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX3lpREhjajBlRWRxTk1fWVA1M0hLQnciIGd1aWQ9Il95aURIY2owZUVkcU5NX1lQNTNIS0J3IiBhbmNob3I9Il95aURIY1QwZUVkcU5NX1lQNTNIS0J3Ii8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfOGlFZDdEejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iXzhpRWQ3RHo5RWRxRVpwVEswV0FVZHciIGdyYXBoRWRnZT0iXzhpRWQ3VHo5RWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9ZZHJpUWowQUVkcUVacFRLMFdBVWR3IiBndWlkPSJfWWRyaVFqMEFFZHFFWnBUSzBXQVVkdyIgZ3JhcGhFZGdlPSJfWWRyaVF6MEFFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX1l3NVpNajBBRWRxRVpwVEswV0FVZHciIGd1aWQ9Il9ZdzVaTWowQUVkcUVacFRLMFdBVWR3IiBncmFwaEVkZ2U9Il9ZdzVaTXowQUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfeUtYQU1qMGVFZHFOTV9ZUDUzSEtCdyIgZ3VpZD0iX3lLWEFNajBlRWRxTk1fWVA1M0hLQnciIGdyYXBoRWRnZT0iX3lLWEFNejBlRWRxTk1fWVA1M0hLQnciLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il95aURIY1QwZUVkcU5NX1lQNTNIS0J3IiBndWlkPSJfeWlESGNUMGVFZHFOTV9ZUDUzSEtCdyIgZ3JhcGhFZGdlPSJfeWlESGNqMGVFZHFOTV9ZUDUzSEtCdyIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il84aUVkNHp6OUVkcUVacFRLMFdBVWR3IiBndWlkPSJfOGlFZDR6ejlFZHFFWnBUSzBXQVVkdyIgZWxlbWVudD0iX0x3TFFnRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfOGlFZDVEejlFZHFFWnBUSzBXQVVkdyIgd2lkdGg9IjYzLjAiIGhlaWdodD0iNTIuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfOGlFZDVUejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iXzhpRWQ1VHo5RWRxRVpwVEswV0FVZHciPgotICAgICAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfOGlFZDVqejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iXzhpRWQ1ano5RWRxRVpwVEswV0FVZHciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiIvPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfOGlFZDV6ejlFZHFFWnBUSzBXQVVkdyIgeD0iMjc0LjAiIHk9IjI1NS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iXzhpRWQ2RHo5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il84aUVkNkR6OUVkcUVacFRLMFdBVWR3IiBlbGVtZW50PSJfTHdMUWdEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il84aUVkNlR6OUVkcUVacFRLMFdBVWR3IiB3aWR0aD0iMTU0LjAiIGhlaWdodD0iNTIuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9mNnk2UUR6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjZ5NlFEempFZHE1eXNGT05yMUJHUSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiIGVsZW1lbnQ9Il9FNzNySVR6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgPC9kaWFncmFtcz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfQlM2Z0VEemxFZHE1eXNGT05yMUJHUSIgbmFtZT0iQWN0aXZpdHkyIiBndWlkPSJfQlM2Z0VEemxFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eSIgeG1pOmlkPSJfQlM2Z0VUemxFZHE1eXNGT05yMUJHUSIgbmFtZT0iQWN0aXZpdHkyIiBndWlkPSJfQlM2Z0VUemxFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iQWN0aXZpdHkyIGNvbnRhaW5pbmQgRG5EIHRhc2tzIiBwcmVzZW50YXRpb25OYW1lPSJBY3Rpdml0eTIgY29udGFpbmluZCBEbkQgdGFza3MiIHByZWZpeD0iUHJlZml4IiBzdXBlckFjdGl2aXRpZXM9Il9FRlZyd1R6aUVkcTV5c0ZPTnIxQkdRIiBicmVha2Rvd25FbGVtZW50cz0iXzBEUl9RRURFRWRxTzlNM2Z1a1lBX0EgXzBEazZNRURFRWRxTzlNM2Z1a1lBX0EgXzBEazZNVURFRWRxTzlNM2Z1a1lBX0EgXzBEdXJNRURFRWRxTzlNM2Z1a1lBX0EgXzBEdXJNVURFRWRxTzlNM2Z1a1lBX0EgXzBEdXJNa0RFRWRxTzlNM2Z1a1lBX0EgXzBEdXJNMERFRWRxTzlNM2Z1a1lBX0EgXzI4ODdFRURFRWRxTzlNM2Z1a1lBX0EgXzI5Wm5BRURFRWRxTzlNM2Z1a1lBX0EgXzI5Wm5BVURFRWRxTzlNM2Z1a1lBX0EgXzI5Wm5Ba0RFRWRxTzlNM2Z1a1lBX0EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1BZHdBam41dlJDbkVRUUxVYVlKMWR3IiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtQWR3QWpuNXZSQ25FUVFMVWFZSjFkdyIvPgotICAgICAgICAgICAgPHJvYWRtYXBzIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I184aFdqRUI4ckVkcVF2T2pYOGRvQ0N3Ii8+Ci0gICAgICAgICAgICA8c3VwcG9ydGluZ01hdGVyaWFscyBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIvPgotICAgICAgICAgICAgPGNoZWNrbGlzdHMgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX3VyTGRjQjhyRWRxUXZPalg4ZG9DQ3ciLz4KLSAgICAgICAgICAgIDxjb25jZXB0cyBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfSXZEMkVCOHNFZHFRdk9qWDhkb0NDdyIvPgotICAgICAgICAgICAgPGNvbmNlcHRzIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I193NkU5OEI4ckVkcVF2T2pYOGRvQ0N3Ii8+Ci0gICAgICAgICAgICA8ZXhhbXBsZXMgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX3lRemdVQjhyRWRxUXZPalg4ZG9DQ3ciLz4KLSAgICAgICAgICAgIDxndWlkZWxpbmVzIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I196a1pQSUI4ckVkcVF2T2pYOGRvQ0N3Ii8+Ci0gICAgICAgICAgICA8cmV1c2FibGVBc3NldHMgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjXzY3azRFQjhyRWRxUXZPalg4ZG9DQ3ciLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il8wRFJfUUVERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJ0YXNrX0ExIiBndWlkPSJfMERSX1FFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMSAiIHN1cGVyQWN0aXZpdGllcz0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiIGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PSJfMERrNk1VREVFZHFPOU0zZnVrWUFfQSIgbWFuZGF0b3J5SW5wdXQ9Il8wRHVyTUVERUVkcU85TTNmdWtZQV9BIF8wRHVyTVVERUVkcU85TTNmdWtZQV9BIiBvcHRpb25hbElucHV0PSJfMER1ck1rREVFZHFPOU0zZnVrWUFfQSIgb3V0cHV0PSJfMER1ck0wREVFZHFPOU0zZnVrWUFfQSIgcGVyZm9ybWVkUHJpbWFyaWx5Qnk9Il8wRGs2TUVERUVkcU85TTNmdWtZQV9BIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItekJBczExUmdMZ19ZU2JzN0Jka1N1USIgaHJlZj0idW1hOi8vLUUtZDRKY3UyOTdyeFVxOGx0ZThxbncjLXpCQXMxMVJnTGdfWVNiczdCZGtTdVEiLz4KLSAgICAgICAgICAgIDxUYXNrIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI183TThuc0EtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tUzFpZ0xTaTZBSV92bHV6V09DdTZUdyNfdHZGNE1CQlBFZHFCczdLaGRWTFJMQSIvPgotICAgICAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLVMxaWdMU2k2QUlfdmx1eldPQ3U2VHcjX3R6a0lnQkJQRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I191Q0JiUUJCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgeG1pOmlkPSJfMERrNk1FREVFZHFPOU0zZnVrWUFfQSIgbmFtZT0icm9sZV9BMSIgZ3VpZD0iXzBEazZNRURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHN1cGVyQWN0aXZpdGllcz0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiIHJlc3BvbnNpYmxlRm9yPSJfMER1ck1VREVFZHFPOU0zZnVrWUFfQSBfMER1ck1rREVFZHFPOU0zZnVrWUFfQSBfMER1ck0wREVFZHFPOU0zZnVrWUFfQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXdCVnduS05BN3Z4UFpwWTVoMG5qQlEiIGhyZWY9InVtYTovLy1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53Iy13QlZ3bktOQTd2eFBacFk1aDBuakJRIi8+Ci0gICAgICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iXzBEazZNVURFRWRxTzlNM2Z1a1lBX0EiIG5hbWU9InJvbGVfQTIiIGd1aWQ9Il8wRGs2TVVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEEyICIgc3VwZXJBY3Rpdml0aWVzPSJfQlM2Z0VUemxFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLV9qM2Y4ZGp3S3hzS2FDSERuSklxVkEiIGhyZWY9InVtYTovLy1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53Iy1fajNmOGRqd0t4c0thQ0hEbkpJcVZBIi8+Ci0gICAgICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNmszVUFBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il8wRHVyTUVERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgZ3VpZD0iXzBEdXJNRURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfMER1ck1VREVFZHFPOU0zZnVrWUFfQSIgbmFtZT0iYXJ0aWZhY3RfQTEiIGd1aWQ9Il8wRHVyTVVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfQlM2Z0VUemxFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI185S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzBEdXJNa0RFRWRxTzlNM2Z1a1lBX0EiIG5hbWU9ImRlbGl2ZXJhYmxlX0ExIiBndWlkPSJfMER1ck1rREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEExIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiIGRlbGl2ZXJhYmxlUGFydHM9Il8wRVVoRUVERUVkcU85TTNmdWtZQV9BIF8wRVVoRVVERUVkcU85TTNmdWtZQV9BIF8wRVVoRWtERUVkcU85TTNmdWtZQV9BIj4KLSAgICAgICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0lJU25VQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfMER1ck0wREVFZHFPOU0zZnVrWUFfQSIgbmFtZT0ib3V0Y29tZV9BMSIgZ3VpZD0iXzBEdXJNMERFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfQlM2Z0VUemxFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfMEVVaEVFREVFZHFPOU0zZnVrWUFfQSIgbmFtZT0iYXJ0aWZhY3RfQTEiIGd1aWQ9Il8wRVVoRUVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI185S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzBFVWhFVURFRWRxTzlNM2Z1a1lBX0EiIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBndWlkPSJfMEVVaEVVREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRjUxeXdBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il8wRVVoRWtERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJvdXRjb21lX0ExIiBndWlkPSJfMEVVaEVrREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS0FfMVlBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIHhtaTppZD0iXzI4ODdFRURFRWRxTzlNM2Z1a1lBX0EiIG5hbWU9InRhc2tfQTIiIGd1aWQ9Il8yODg3RUVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEEyICIgcHJlZml4PSJQcmVmaXgiIHN1cGVyQWN0aXZpdGllcz0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiIGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PSJfMERrNk1FREVFZHFPOU0zZnVrWUFfQSIgbWFuZGF0b3J5SW5wdXQ9Il8yOVpuQUVERUVkcU85TTNmdWtZQV9BIiBvcHRpb25hbElucHV0PSJfMjlabkFVREVFZHFPOU0zZnVrWUFfQSIgb3V0cHV0PSJfMjlabkFrREVFZHFPOU0zZnVrWUFfQSIgcGVyZm9ybWVkUHJpbWFyaWx5Qnk9Il8wRGs2TVVERUVkcU85TTNmdWtZQV9BIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSIteWItTEdpa2NBNU1QZVI4TDNZVzJDQSIgaHJlZj0idW1hOi8vLUUtZDRKY3UyOTdyeFVxOGx0ZThxbncjLXliLUxHaWtjQTVNUGVSOEwzWVcyQ0EiLz4KLSAgICAgICAgICAgIDxUYXNrIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI183NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyNfdGkyQllCQk9FZHFCczdLaGRWTFJMQSIvPgotICAgICAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLTEzcThKSkFhMGl4NnJETVpBcXd5MXcjX3RrN3NFQkJPRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190bmRib0JCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzI5Wm5BRURFRWRxTzlNM2Z1a1lBX0EiIG5hbWU9ImFydGlmYWN0X0EyIiBndWlkPSJfMjlabkFFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il8yOVpuQVVERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJkZWxpdmVyYWJsZV9BMiIgZ3VpZD0iXzI5Wm5BVURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIiBkZWxpdmVyYWJsZVBhcnRzPSJfMjlzaDhFREVFZHFPOU0zZnVrWUFfQSBfMjlzaDhVREVFZHFPOU0zZnVrWUFfQSI+Ci0gICAgICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19KQnFmVUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzI5Wm5Ba0RFRWRxTzlNM2Z1a1lBX0EiIG5hbWU9Im91dGNvbWVfQTIiIGd1aWQ9Il8yOVpuQWtERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzI5c2g4RURFRWRxTzlNM2Z1a1lBX0EiIG5hbWU9ImFydGlmYWN0X0EyIiBndWlkPSJfMjlzaDhFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il8yOXNoOFVERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJvdXRjb21lX0EyIiBndWlkPSJfMjlzaDhVREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxkaWFncmFtcyB4bWk6aWQ9Il9OZ0Q4OER6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEODhEem1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfTmdEODhUem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDg4VHptRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfTmdEODhqem1FZHE1eXNGT05yMUJHUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ0Q4OHp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEODh6em1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ0Q4OUR6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9OZ0Q4OVR6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEODlUem1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9OZ0Q4OWp6bUVkcTV5c0ZPTnIxQkdRIiB4PSIxMC4wIiB5PSIxODYuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ0Q4OXp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEODl6em1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ0Q4LUR6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9OZ0Q4LVR6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOC1Uem1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9OZ0Q4LWp6bUVkcTV5c0ZPTnIxQkdRIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX05nRDgtenptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q4LXp6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX05nRDhfRHptRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX05nRDhfVHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q4X1R6bUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX05nRDhfanptRWRxNXlzRk9OcjFCR1EiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfTmdEOF96em1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDhfenptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfTmdEOUFEem1FZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfTmdEOUFUem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDlBVHptRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfTmdEOUFqem1FZHE1eXNGT05yMUJHUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ0Q5QXp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOUF6em1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ0Q5QkR6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9OZ0Q5QlR6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOUJUem1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9OZ0Q5Qmp6bUVkcTV5c0ZPTnIxQkdRIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX05nRDlCenptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5Qnp6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX05nRDlDRHptRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX05nRDlDVHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5Q1R6bUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX05nRDlDanptRWRxNXlzRk9OcjFCR1EiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfTmdEOUN6em1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDlDenptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfTmdEOUREem1FZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfTmdEOURUem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDlEVHptRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfTmdEOURqem1FZHE1eXNGT05yMUJHUSIgeD0iMTAuMCIgeT0iNTg0LjAiLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfTmdEOUR6em1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDlEenptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfTmdEOUVEem1FZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfTmdEOUVUem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDlFVHptRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfTmdEOUVqem1FZHE1eXNGT05yMUJHUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ0Q5RXp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOUV6em1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ0Q5RkR6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9OZ0Q5RlR6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOUZUem1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9OZ0Q5Rmp6bUVkcTV5c0ZPTnIxQkdRIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX05nRDlGenptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5Rnp6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX05nRDlHRHptRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX05nRDlHVHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5R1R6bUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX05nRDlHanptRWRxNXlzRk9OcjFCR1EiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfTmdEOUd6em1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDlHenptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfTmdEOUhEem1FZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfTmdEOUhUem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDlIVHptRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfTmdEOUhqem1FZHE1eXNGT05yMUJHUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ0Q5SHp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOUh6em1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ0Q5SUR6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9OZ050OER6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdDhEem1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il9OZ050OFR6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdDhUem1FZHE1eXNGT05yMUJHUSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9OZ050OGp6bUVkcTV5c0ZPTnIxQkdRIiB4PSIxMC4wIiB5PSI2MC4wIi8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9OZ051QlR6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdUJUem1FZHE1eXNGT05yMUJHUSIgYW5jaG9yPSJfTmdOdUJEem1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfTjA3WnNUem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX04wN1pzVHptRWRxNXlzRk9OcjFCR1EiIGFuY2hvcj0iX04wN1pzRHptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9OZ051QkR6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdUJEem1FZHE1eXNGT05yMUJHUSIgZ3JhcGhFZGdlPSJfTmdOdUJUem1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX04wN1pzRHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OMDdac0R6bUVkcTV5c0ZPTnIxQkdRIiBncmFwaEVkZ2U9Il9OMDdac1R6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX05nTnQ4enptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ050OHp6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX05nTnQ5RHptRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX05nTnQ5VHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ050OVR6bUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iX05nTnQ5anptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ050OWp6bUVkcTV5c0ZPTnIxQkdRIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiLz4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX05nTnQ5enptRWRxNXlzRk9OcjFCR1EiIHg9IjEwLjAiIHk9IjMxMi4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX05nTnQtRHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ050LUR6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX05nTnQtVHptRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX05nTnQtanptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ050LWp6bUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iX05nTnQtenptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ050LXp6bUVkcTV5c0ZPTnIxQkdRIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX05nTnRfRHptRWRxNXlzRk9OcjFCR1EiIHg9IjEwLjAiIHk9IjQ0OC4wIi8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9OZ051Qnp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdUJ6em1FZHE1eXNGT05yMUJHUSIgYW5jaG9yPSJfTmdOdUJqem1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfTjA3WnN6em1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX04wN1pzenptRWRxNXlzRk9OcjFCR1EiIGFuY2hvcj0iX04wN1pzanptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9OZ051Qmp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdUJqem1FZHE1eXNGT05yMUJHUSIgZ3JhcGhFZGdlPSJfTmdOdUJ6em1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX04wN1pzanptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OMDdac2p6bUVkcTV5c0ZPTnIxQkdRIiBncmFwaEVkZ2U9Il9OMDdac3p6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX05nTnRfVHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ050X1R6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX05nTnRfanptRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX05nTnRfenptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ050X3p6bUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iX05nTnVBRHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ051QUR6bUVkcTV5c0ZPTnIxQkdRIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiLz4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX05nTnVBVHptRWRxNXlzRk9OcjFCR1EiIHg9IjEwLjAiIHk9IjcyMC4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX05nTnVBanptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ051QWp6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX05nTnVBenptRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfTmdEOUlUem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDlJVHptRWRxNXlzRk9OcjFCR1EiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIiBlbGVtZW50PSJfQlM2Z0VUemxFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgIDwvZGlhZ3JhbXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpJdGVyYXRpb24iIHhtaTppZD0iX0VGVnJ3VHppRWRxNXlzRk9OcjFCR1EiIG5hbWU9Ikl0ZXJhdGlvbjEiIGd1aWQ9Il9FRlZyd1R6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSJUaGlzIGl0ZXJhdGlvbiBjb250YWlucyB0d28gYWN0aXZpdGllcyIgcHJlc2VudGF0aW9uTmFtZT0iSXRlcmF0aW9uMSIgcHJlZml4PSJQcmVmaXgiIHN1cGVyQWN0aXZpdGllcz0iX0Rha1FjRHppRWRxNXlzRk9OcjFCR1EiIGlzT25nb2luZz0idHJ1ZSIgYnJlYWtkb3duRWxlbWVudHM9Il9FNzNySVR6aUVkcTV5c0ZPTnIxQkdRIF9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVZSVUNTaEF2WHJzTGdzN1BaekhnVXciIGhyZWY9InVtYTovLy1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53Iy1WUlVDU2hBdlhyc0xnczdQWnpIZ1V3Ii8+Ci0gICAgICAgICAgPHJvYWRtYXBzIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19ZdWtnUUEtVkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPHN1cHBvcnRpbmdNYXRlcmlhbHMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX21Qc19jQS1VRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8Y2hlY2tsaXN0cyBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDxjb25jZXB0cyBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfM1hyMEVBLVVFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDxjb25jZXB0cyBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDxleGFtcGxlcyBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDxndWlkZWxpbmVzIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI182WVV3QUEtVEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPHJldXNhYmxlQXNzZXRzIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfcmtXOGtEMGVFZHFOTV9ZUDUzSEtCdyIgZ3VpZD0iX3JrVzhrRDBlRWRxTk1fWVA1M0hLQnciPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3JrVzhrVDBlRWRxTk1fWVA1M0hLQnciIGd1aWQ9Il9ya1c4a1QwZUVkcU5NX1lQNTNIS0J3IiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCIgZWxlbWVudD0iX0VGVnJ3VHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgPC9kaWFncmFtcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UGhhc2UiIHhtaTppZD0iX0Rha1FjRHppRWRxNXlzRk9OcjFCR1EiIG5hbWU9IlBoYXNlMSIgZ3VpZD0iX0Rha1FjRHppRWRxNXlzRk9OcjFCR1EiIHByZXNlbnRhdGlvbk5hbWU9IlBoYXNlMSIgc3VwZXJBY3Rpdml0aWVzPSJfNHNDdHNUemdFZHE1eXNGT05yMUJHUSIgYnJlYWtkb3duRWxlbWVudHM9Il9FRlZyd1R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfZXdsdzhEempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2V3bHc4RHpqRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9ld2x3OFR6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZXdsdzhUempFZHE1eXNGT05yMUJHUSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiIGVsZW1lbnQ9Il9EYWtRY0R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICA8L2RpYWdyYW1zPgotICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfYmNzWFFEempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Jjc1hRRHpqRWRxNXlzRk9OcjFCR1EiPgotICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfYmNzWFFUempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Jjc1hRVHpqRWRxNXlzRk9OcjFCR1EiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIiBlbGVtZW50PSJfNHNDdHNUemdFZHE1eXNGT05yMUJHUSIvPgotICAgIDwvZGlhZ3JhbXM+Ci0gICAgPHByb2Nlc3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIHhtaTppZD0iXzRzQ3RzVHpnRWRxNXlzRk9OcjFCR1EiIG5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgZ3VpZD0iXzRzQ3RzVHpnRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IkJyaWVmOkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgcHJlc2VudGF0aW9uTmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBicmVha2Rvd25FbGVtZW50cz0iX0Rha1FjRHppRWRxNXlzRk9OcjFCR1EiPgotICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53IiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtRS1kNEpjdTI5N3J4VXE4bHRlOHFudyIvPgotICAgICAgPGRlZmF1bHRDb250ZXh0IGhyZWY9InVtYTovL19xend5d0EtUEVkcUwyTzFQSlY5Y1pBI19ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIi8+Ci0gICAgICA8dmFsaWRDb250ZXh0IGhyZWY9InVtYTovL19xend5d0EtUEVkcUwyTzFQSlY5Y1pBI19ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIi8+Ci0gICAgPC9wcm9jZXNzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudD4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2NvbnRlbnQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjRjNGQ4Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvY29udGVudC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24geG1pOmlkPSItaWNPNnBJSGRabTlWeHljLUpaOVV5dyIgbmFtZT0iQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMsX1p0WmJNVURGRWRxTzlNM2Z1a1lBX0EiIGd1aWQ9Ii1pY082cElIZFptOVZ4eWMtSlo5VXl3Ij4KLSAgICA8bWFpbkRlc2NyaXB0aW9uPm1haW46IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzPC9tYWluRGVzY3JpcHRpb24+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPktleXM6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHM8L3VzYWdlR3VpZGFuY2U+Ci0gICAgPHB1cnBvc2U+UHVycG9zZTogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHM8L3B1cnBvc2U+Ci0gICAgPGFsdGVybmF0aXZlcz5hbHRlcm5hdGl2ZXM6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzPC9hbHRlcm5hdGl2ZXM+Ci0gICAgPGhvd3RvU3RhZmY+SG93IHRvIHN0YWZmOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50czwvaG93dG9TdGFmZj4KLSAgICA8ZXh0ZXJuYWxJZD5FeHRlcm5hbCBJRDogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHM8L2V4dGVybmFsSWQ+Ci0gICAgPHNjb3BlPnNjb3BlOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50czwvc2NvcGU+Ci0gICAgPHVzYWdlTm90ZXM+dXNhZ2U6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzPC91c2FnZU5vdGVzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eURlc2NyaXB0aW9uIHhtaTppZD0iLVNyY1ZTLTdkU1lERTJScG03U0lreUEiIG5hbWU9IixfbERobDhFREZFZHFPOU0zZnVrWUFfQSIgZ3VpZD0iLVNyY1ZTLTdkU1lERTJScG03U0lreUEiPgotICAgIDxtYWluRGVzY3JpcHRpb24+bWFpbjogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzPC9tYWluRGVzY3JpcHRpb24+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleTogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzPC91c2FnZUd1aWRhbmNlPgotICAgIDxwdXJwb3NlPnB1cnBvc2U6IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50czwvcHVycG9zZT4KLSAgICA8YWx0ZXJuYXRpdmVzPmFsdGVybmF0aXZlczogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzPC9hbHRlcm5hdGl2ZXM+Ci0gICAgPGhvd3RvU3RhZmY+aG93IHRvIHN0YWZmOiBBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHM8L2hvd3RvU3RhZmY+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eURlc2NyaXB0aW9uPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9kaWFncmFtLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvZGlhZ3JhbS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZWIzNzcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9kaWFncmFtLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpub3RhdGlvbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvcnVudGltZS8xLjAuMC9ub3RhdGlvbiIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpBY3Rpdml0eURldGFpbERpYWdyYW0geG1pOmlkPSJfSWF5NVJ1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHkiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19sRGhsOEVERkVkcU85TTNmdWtZQV9BIi8+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlVGFza0NvbXBvc2l0ZSIgeG1pOmlkPSJfSWF5NVIteDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX0dxWDFNVURRRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZU5vZGUiIHhtaTppZD0iX0lheTVTT3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlJvbGUgQTMgZXh0ZW5kcyBSb2xlIEEyIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19HcVgxTVVEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpUYXNrTm9kZSIgeG1pOmlkPSJfSWF5NVNleDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lheTVUT3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2sgQTMgZXh0ZW5kcyBUYXNrIEEyIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19HcVgxTUVEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JYXk1U3V4NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JYXk1VHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWF5NVMteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX0dxWDFNRURRRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JYXk1VE94NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JYXk1U2V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lheTVUZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19HcWhtTWtEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWF5NVR1eDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lheTVTdXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjIiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19HcVgxTUVEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lheTVULXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX0dxaG1ORURRRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpBY3Rpdml0eURldGFpbERpYWdyYW0+Ci0gIDxub3RhdGlvbjpEaWFncmFtIHhtaTppZD0iX0lheTVVT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IkFERCIgZWxlbWVudD0iX0lheTVSdXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9ImFjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyIgbWVhc3VyZW1lbnRVbml0PSJQaXhlbCI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JYXk1Vk94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWF5NVIteDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lheTVWZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWF5NVZ1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JYXk1Vi14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lheTVXT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lheTVXdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjMwIiB5PSI4OCIgd2lkdGg9IjIyOCIgaGVpZ2h0PSI2NyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JYXk1Vy14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWF5NVMteDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lheTVYT3g0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWF5NVhleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JYXk1WHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lheTVYLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lheTVZZXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjE0MyIgeT0iMSIgd2lkdGg9Ijg0IiBoZWlnaHQ9IjY3Ii8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lheTVZdXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDIiIGVsZW1lbnQ9Il9JYXk1VHV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWF5NVkteDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JYXk1Wk94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lheTVaZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWF5NVp1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWF5NWFPeDRFZHUyT282cS1uSFdnZyIgeD0iMTQzIiB5PSIxNzUiIHdpZHRoPSI4NCIgaGVpZ2h0PSI4MyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246UGFnZVN0eWxlIiB4bWk6aWQ9Il9JYXk1VWV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246R3VpZGVTdHlsZSIgeG1pOmlkPSJfSWF5NVV1eDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lheTVVLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgPC9ub3RhdGlvbjpEaWFncmFtPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0lhNF80LXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfZFlHbTBFRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZVRhc2tDb21wb3NpdGUiIHhtaTppZD0iX0lhNF81T3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19sNXlVQVVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVOb2RlIiB4bWk6aWQ9Il9JYTRfNWV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJSb2xlIEIyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX2w1eVVBVURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlRhc2tOb2RlIiB4bWk6aWQ9Il9JYTRfNXV4NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSWE0XzZleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iVGFzayBCMiBleHRlbmRzIFRhc2sgQTEiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX2w1eVVBRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0lhNF81LXg0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0lhNF83ZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JYTRfNk94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfbDV5VUFFRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0lhNF82ZXg0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0lhNF81dXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWE0XzZ1eDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX2w1eVVCRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lhNF82LXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19sNXlVQlVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JYTRfN094NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfbDV5VUJrRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lhNF83ZXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JYTRfNS14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfbDV5VUFFRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JYTRfN3V4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19sNXlVQ1VEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JYTRfNy14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEExIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19sNXlVQ2tEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtPgotICA8bm90YXRpb246RGlhZ3JhbSB4bWk6aWQ9Il9JYTRfOE94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSJBREQiIGVsZW1lbnQ9Il9JYTRfNC14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBtZWFzdXJlbWVudFVuaXQ9IlBpeGVsIj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lhNF85T3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JYTRfNU94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWE0XzlleDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JYTRfOXV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lhNF85LXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWE0Xy1PeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWE0Xy11eDRFZHUyT282cS1uSFdnZyIgeD0iMzAiIHk9IjIzNiIgd2lkdGg9IjIyMSIgaGVpZ2h0PSI2NyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JYTRfLS14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWE0XzZPeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lhNF9fT3g0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWE0X19leDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JYTRfX3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lhNF9fLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lhNUFBZXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEzMiIgeT0iMSIgd2lkdGg9Ijk0IiBoZWlnaHQ9IjIxNSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JYTVBQXV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWE0XzdleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lhNUFBLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWE1QUJPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JYTVBQmV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lhNUFCdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lhNUFDT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEzNyIgeT0iMzIzIiB3aWR0aD0iODQiIGhlaWdodD0iMTY2Ii8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpQYWdlU3R5bGUiIHhtaTppZD0iX0lhNF84ZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpHdWlkZVN0eWxlIiB4bWk6aWQ9Il9JYTRfOHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWE0XzgteDRFZHUyT282cS1uSFdnZyIvPgotICA8L25vdGF0aW9uOkRpYWdyYW0+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL21vZGVsLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2QzOWMwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvbW9kZWwueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX1p6RFhRVURGRWRxTzlNM2Z1a1lBX0EiIGd1aWQ9Il9aekRYUVVERkVkcU85TTNmdWtZQV9BIj4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9aekRYUWtERkVkcU85TTNmdWtZQV9BIiBpZD0iLWljTzZwSUhkWm05Vnh5Yy1KWjlVeXciIHVyaT0iY29udGVudC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il90R0Y0d1VER0VkcU85TTNmdWtZQV9BIiBpZD0iLVNyY1ZTLTdkU1lERTJScG03U0lreUEiIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfWnRaYk1FREZFZHFPOU0zZnVrWUFfQSIgbmFtZT0iQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGd1aWQ9Il9adFpiTUVERkVkcU85TTNmdWtZQV9BIj4KLSAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfbEM3d0VFREZFZHFPOU0zZnVrWUFfQSIgbmFtZT0iYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIiBndWlkPSJfbEM3d0VFREZFZHFPOU0zZnVrWUFfQSI+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiB4bWk6aWQ9Il9sRGhsOEVERkVkcU85TTNmdWtZQV9BIiBuYW1lPSJhY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiIGd1aWQ9Il9sRGhsOEVERkVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwcmVzZW50YXRpb25OYW1lPSJBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHMiIHByZWZpeD0iUHJlZml4IiBzdXBlckFjdGl2aXRpZXM9Il9adFpiTVVERkVkcU85TTNmdWtZQV9BIiBicmVha2Rvd25FbGVtZW50cz0iX0dxWDFNRURRRWRxcmhzWmgzUU5BTVEgX0dxWDFNVURRRWRxcmhzWmgzUU5BTVEgX0dxaG1NRURRRWRxcmhzWmgzUU5BTVEgX0dxaG1NVURRRWRxcmhzWmgzUU5BTVEgX0dxaG1Na0RRRWRxcmhzWmgzUU5BTVEgX0dxaG1NMERRRWRxcmhzWmgzUU5BTVEgX0dxaG1ORURRRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVNyY1ZTLTdkU1lERTJScG03U0lreUEiIGhyZWY9InVtYTovLy1pY082cElIZFptOVZ4eWMtSlo5VXl3Iy1TcmNWUy03ZFNZREUyUnBtN1NJa3lBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIHhtaTppZD0iX0dxWDFNRURRRWRxcmhzWmgzUU5BTVEiIG5hbWU9InRhc2tfQTMiIGd1aWQ9Il9HcVgxTUVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjogVGFzayBBMyIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMyBleHRlbmRzIFRhc2sgQTIiIHN1cGVyQWN0aXZpdGllcz0iX2xEaGw4RURGRWRxTzlNM2Z1a1lBX0EiIGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PSJfR3FobU1FRFFFZHFyaHNaaDNRTkFNUSBfR3FobU1VRFFFZHFyaHNaaDNRTkFNUSIgbWFuZGF0b3J5SW5wdXQ9Il9HcWhtTWtEUUVkcXJoc1poM1FOQU1RIiBvcHRpb25hbElucHV0PSJfR3FobU0wRFFFZHFyaHNaaDNRTkFNUSIgb3V0cHV0PSJfR3FobU5FRFFFZHFyaHNaaDNRTkFNUSIgcGVyZm9ybWVkUHJpbWFyaWx5Qnk9Il9HcVgxTVVEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFRhc2sgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLWJSOVRYMWJaNlc5Ulk1SXZJUEdVamcjX3JDV3dVRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLWJSOVRYMWJaNlc5Ulk1SXZJUEdVamcjX3VteWdZRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLWJSOVRYMWJaNlc5Ulk1SXZJUEdVamcjX3Z4NUJrRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLTEzcThKSkFhMGl4NnJETVpBcXd5MXcjX3RpMkJZQkJPRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLTEzcThKSkFhMGl4NnJETVpBcXd5MXcjX3RrN3NFQkJPRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLTEzcThKSkFhMGl4NnJETVpBcXd5MXcjX3RuZGJvQkJPRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgeG1pOmlkPSJfR3FYMU1VRFFFZHFyaHNaaDNRTkFNUSIgbmFtZT0icm9sZV9BMyIgZ3VpZD0iX0dxWDFNVURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmIDogUm9sZSBBMyIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMyBleHRlbmRzIFJvbGUgQTIiIHN1cGVyQWN0aXZpdGllcz0iX2xEaGw4RURGRWRxTzlNM2Z1a1lBX0EiPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfOFpONkFFREZFZHFPOU0zZnVrWUFfQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il9HcWhtTUVEUUVkcXJoc1poM1FOQU1RIiBuYW1lPSJyb2xlX0EyIiBndWlkPSJfR3FobU1FRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiBleHRlbmRlZCBieSBSb2xlIEEzIiBzdXBlckFjdGl2aXRpZXM9Il9sRGhsOEVERkVkcU85TTNmdWtZQV9BIiByZXNwb25zaWJsZUZvcj0iX0dxaG1Na0RRRWRxcmhzWmgzUU5BTVEgX0dxaG1NMERRRWRxcmhzWmgzUU5BTVEgX0dxaG1ORURRRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNmszVUFBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il9HcWhtTVVEUUVkcXJoc1poM1FOQU1RIiBuYW1lPSJyb2xlX0ExIiBndWlkPSJfR3FobU1VRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMSIgc3VwZXJBY3Rpdml0aWVzPSJfbERobDhFREZFZHFPOU0zZnVrWUFfQSI+Ci0gICAgICAgIDxSb2xlIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI181NXprMEEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9HcWhtTWtEUUVkcXJoc1poM1FOQU1RIiBuYW1lPSJhcnRpZmFjdF9BMiIgZ3VpZD0iX0dxaG1Na0RRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9sRGhsOEVERkVkcU85TTNmdWtZQV9BIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfR3FobU0wRFFFZHFyaHNaaDNRTkFNUSIgbmFtZT0iZGVsaXZlcmFibGVfQTIiIGd1aWQ9Il9HcWhtTTBEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfbERobDhFREZFZHFPOU0zZnVrWUFfQSIgZGVsaXZlcmFibGVQYXJ0cz0iX0dxcXdJRURRRWRxcmhzWmgzUU5BTVEgX0dxcXdJVURRRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19KQnFmVUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9HcWhtTkVEUUVkcXJoc1poM1FOQU1RIiBuYW1lPSJvdXRjb21lX0EyIiBndWlkPSJfR3FobU5FRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9sRGhsOEVERkVkcU85TTNmdWtZQV9BIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9HcXF3SUVEUUVkcXJoc1poM1FOQU1RIiBuYW1lPSJhcnRpZmFjdF9BMiIgZ3VpZD0iX0dxcXdJRURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfR3Fxd0lVRFFFZHFyaHNaaDNRTkFNUSIgbmFtZT0ib3V0Y29tZV9BMiIgZ3VpZD0iX0dxcXdJVURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfX3BsZGtFRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19wbGRrRURRRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfX3BsZGtVRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19wbGRrVURRRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9fcGxka2tEUUVkcXJoc1poM1FOQU1RIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfX3BsZGswRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19wbGRrMERRRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9HcVgxTUVEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfX3BsZGxFRFFFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX19wbGRsVURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxkbFVEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfX3BsZGxrRFFFZHFyaHNaaDNRTkFNUSIgeD0iMzAuMCIgeT0iODguMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX19wbGRsMERRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxkbDBEUUVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfR3FYMU1VRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX19wbGRtRURRRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSIyMjguMCIgaGVpZ2h0PSI2Ny4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfX3BsZG1VRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19wbGRtVURRRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9fcGxkbWtEUUVkcXJoc1poM1FOQU1RIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfX3BsZG0wRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19wbGRtMERRRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9HcWhtTUVEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfX3BsZG5FRFFFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX19wbGRuVURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxkblVEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfX3BsZG5rRFFFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX19wbGRuMERRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxkbjBEUUVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfR3FobU1VRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX19wbGRvRURRRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9fcGxkb1VEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3BsZG9VRFFFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX19wbGRva0RRRWRxcmhzWmgzUU5BTVEiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9fcGxkbzBEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3BsZG8wRFFFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX0dxaG1Na0RRRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9fcGxkcEVEUUVkcXJoc1poM1FOQU1RIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfX3BsZHBVRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19wbGRwVURRRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9fcGxkcGtEUUVkcXJoc1poM1FOQU1RIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfX3BsZHAwRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19wbGRwMERRRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9HcWhtTTBEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfX3BsZHFFRFFFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX19wbGRxVURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxkcVVEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfX3BsZHFrRFFFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX19wbGRxMERRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxkcTBEUUVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfR3FobU5FRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX19wbGRyRURRRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9fcDRZZ0VEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3A0WWdFRFFFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iX19wNFlnVURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcDRZZ1VEUUVkcXJoc1poM1FOQU1RIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfX3A0WWdrRFFFZHFyaHNaaDNRTkFNUSIgeD0iMTQzLjAiIHk9IjEuMCIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9fcUNKZ1VEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3FDSmdVRFFFZHFyaHNaaDNRTkFNUSIgYW5jaG9yPSJfX3FDSmdFRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfX3FDSmdFRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19xQ0pnRURRRWRxcmhzWmgzUU5BTVEiIGdyYXBoRWRnZT0iX19xQ0pnVURRRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9fcDRZZzBEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3A0WWcwRFFFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX0dxWDFNRURRRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9fcDRZaEVEUUVkcXJoc1poM1FOQU1RIiB3aWR0aD0iODQuMCIgaGVpZ2h0PSI2Ny4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfX3A0WWhVRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19wNFloVURRRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il9fcDRZaGtEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3A0WWhrRFFFZHFyaHNaaDNRTkFNUSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIi8+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX19wNFloMERRRWRxcmhzWmgzUU5BTVEiIHg9IjE0My4wIiB5PSIxNzUuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX19wNFlpRURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcDRZaUVEUUVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfR3FYMU1FRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX19wNFlpVURRRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSI4NC4wIiBoZWlnaHQ9IjgzLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX19wbGRyVURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxkclVEUUVkcXJoc1poM1FOQU1RIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCIgZWxlbWVudD0iX2xEaGw4RURGRWRxTzlNM2Z1a1lBX0EiLz4KLSAgICAgIDwvZGlhZ3JhbXM+Ci0gICAgPC9jaGlsZFBhY2thZ2VzPgotICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9kWERkOEVEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJBY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBndWlkPSJfZFhEZDhFRFBFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiB4bWk6aWQ9Il9kWUdtMEVEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJBY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBndWlkPSJfZFlHbTBFRFBFZHFyaHNaaDNRTkFNUSIgcHJlc2VudGF0aW9uTmFtZT0iQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyIgc3VwZXJBY3Rpdml0aWVzPSJfWnRaYk1VREZFZHFPOU0zZnVrWUFfQSIgYnJlYWtkb3duRWxlbWVudHM9Il9sNXlVQUVEUEVkcXJoc1poM1FOQU1RIF9sNXlVQVVEUEVkcXJoc1poM1FOQU1RIF9sNXlVQWtEUEVkcXJoc1poM1FOQU1RIF9sNXlVQTBEUEVkcXJoc1poM1FOQU1RIF9sNXlVQkVEUEVkcXJoc1poM1FOQU1RIF9sNXlVQlVEUEVkcXJoc1poM1FOQU1RIF9sNXlVQmtEUEVkcXJoc1poM1FOQU1RIF9sNXlVQjBEUEVkcXJoc1poM1FOQU1RIF9sNXlVQ0VEUEVkcXJoc1poM1FOQU1RIF9sNXlVQ1VEUEVkcXJoc1poM1FOQU1RIF9sNXlVQ2tEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il9sNXlVQUVEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJ0YXNrX0IyIiBndWlkPSJfbDV5VUFFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBCMiBleHRlbmRzIFRhc2sgQTEiIHN1cGVyQWN0aXZpdGllcz0iX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiIGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PSJfbDV5VUFrRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUEwRFBFZHFyaHNaaDNRTkFNUSIgbWFuZGF0b3J5SW5wdXQ9Il9sNXlVQkVEUEVkcXJoc1poM1FOQU1RIF9sNXlVQlVEUEVkcXJoc1poM1FOQU1RIF9sNXlVQmtEUEVkcXJoc1poM1FOQU1RIiBvcHRpb25hbElucHV0PSJfbDV5VUIwRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUNFRFBFZHFyaHNaaDNRTkFNUSIgb3V0cHV0PSJfbDV5VUNVRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUNrRFBFZHFyaHNaaDNRTkFNUSIgcGVyZm9ybWVkUHJpbWFyaWx5Qnk9Il9sNXlVQVVEUEVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFRhc2sgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX1pMT01zQjhQRWRxc2hNTlNJMDdYT2ciLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLUozejBJR2ZqZWhpdDB1RmJUSmNhN2cjX29xWXN3Qjg0RWRxTnZlbHliRFhaRlEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLUozejBJR2ZqZWhpdDB1RmJUSmNhN2cjX3F1UXBBQjg0RWRxTnZlbHliRFhaRlEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLUozejBJR2ZqZWhpdDB1RmJUSmNhN2cjX3F5dTVVQjg0RWRxTnZlbHliRFhaRlEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLVMxaWdMU2k2QUlfdmx1eldPQ3U2VHcjX3R2RjRNQkJQRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLVMxaWdMU2k2QUlfdmx1eldPQ3U2VHcjX3R6a0lnQkJQRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLVMxaWdMU2k2QUlfdmx1eldPQ3U2VHcjX3VDQmJRQkJQRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgeG1pOmlkPSJfbDV5VUFVRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0icm9sZV9CMiIgZ3VpZD0iX2w1eVVBVURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQjIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZFlHbTBFRFBFZHFyaHNaaDNRTkFNUSIgcmVzcG9uc2libGVGb3I9Il9sNXlVQkVEUEVkcXJoc1poM1FOQU1RIF9sNXlVQjBEUEVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2ciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgeG1pOmlkPSJfbDV5VUFrRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0icm9sZV9CMSIgZ3VpZD0iX2w1eVVBa0RQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQjEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZFlHbTBFRFBFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgIDxSb2xlIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19BOURZZ0I4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iX2w1eVVBMERQRWRxcmhzWmgzUU5BTVEiIG5hbWU9InJvbGVfQTIiIGd1aWQ9Il9sNXlVQTBEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEEyIGV4dGVuZGVkIGJ5IFJvbGUgQTMiIHN1cGVyQWN0aXZpdGllcz0iX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNmszVUFBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfbDV5VUJFRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0iYXJ0aWZhY3RfQjIiIGd1aWQ9Il9sNXlVQkVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZFlHbTBFRFBFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX195RzdjQjhtRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2w1eVVCVURQRWRxcmhzWmgzUU5BTVEiIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBndWlkPSJfbDV5VUJVRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9sNXlVQmtEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJhcnRpZmFjdF9BMSIgZ3VpZD0iX2w1eVVCa0RQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9kWUdtMEVEUEVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfbDV5VUIwRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0iZGVsaXZlcmFibGVfQjIiIGd1aWQ9Il9sNXlVQjBEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQjIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZFlHbTBFRFBFZHFyaHNaaDNRTkFNUSIgZGVsaXZlcmFibGVQYXJ0cz0iX2w1N2Q4RURQRWRxcmhzWmgzUU5BTVEgX2w1N2Q4VURQRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19ucUZXRUI4bkVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9sNXlVQ0VEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJkZWxpdmVyYWJsZV9BMSIgZ3VpZD0iX2w1eVVDRURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9kWUdtMEVEUEVkcXJoc1poM1FOQU1RIiBkZWxpdmVyYWJsZVBhcnRzPSJfbDU3ZDhrRFBFZHFyaHNaaDNRTkFNUSBfbDU3ZDgwRFBFZHFyaHNaaDNRTkFNUSBfbDU3ZDlFRFBFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0lJU25VQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2w1eVVDVURQRWRxcmhzWmgzUU5BTVEiIG5hbWU9Im91dGNvbWVfQjIiIGd1aWQ9Il9sNXlVQ1VEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2FzRk9rQjhuRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2w1eVVDa0RQRWRxcmhzWmgzUU5BTVEiIG5hbWU9Im91dGNvbWVfQTEiIGd1aWQ9Il9sNXlVQ2tEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2w1N2Q4RURQRWRxcmhzWmgzUU5BTVEiIG5hbWU9ImFydGlmYWN0X0IyIiBndWlkPSJfbDU3ZDhFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19feUc3Y0I4bUVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9sNTdkOFVEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJvdXRjb21lX0IyIiBndWlkPSJfbDU3ZDhVRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19hc0ZPa0I4bkVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9sNTdkOGtEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJhcnRpZmFjdF9BMSIgZ3VpZD0iX2w1N2Q4a0RQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfbDU3ZDgwRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGd1aWQ9Il9sNTdkODBEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2w1N2Q5RURQRWRxcmhzWmgzUU5BTVEiIG5hbWU9Im91dGNvbWVfQTEiIGd1aWQ9Il9sNTdkOUVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPGRpYWdyYW1zIHhtaTppZD0iX0I5R19ZRURSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfWUVEUkVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX0I5R19ZVURSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfWVVEUkVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfQjlHX1lrRFJFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX0I5R19ZMERSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfWTBEUkVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfbDV5VUFFRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX0I5R19aRURSRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9COUdfWlVEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX1pVRFJFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX0I5R19aa0RSRWRxcmhzWmgzUU5BTVEiIHg9IjMwLjAiIHk9IjIzNi4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfQjlHX1owRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19aMERSRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9sNXlVQVVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfQjlHX2FFRFJFZHFyaHNaaDNRTkFNUSIgd2lkdGg9IjIyMS4wIiBoZWlnaHQ9IjY3LjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9COUdfYVVEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2FVRFJFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX0I5R19ha0RSRWRxcmhzWmgzUU5BTVEiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9COUdfYTBEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2EwRFJFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX2w1eVVBa0RQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9COUdfYkVEUkVkcXJoc1poM1FOQU1RIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfQjlHX2JVRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19iVURSRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9COUdfYmtEUkVkcXJoc1poM1FOQU1RIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfQjlHX2IwRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19iMERSRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9sNXlVQTBEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfQjlHX2NFRFJFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX0I5R19jVURSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfY1VEUkVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfQjlHX2NrRFJFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX0I5R19jMERSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfYzBEUkVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfbDV5VUJFRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX0I5R19kRURSRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9COUdfZFVEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2RVRFJFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX0I5R19ka0RSRWRxcmhzWmgzUU5BTVEiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9COUdfZDBEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2QwRFJFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX2w1eVVCVURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9COUdfZUVEUkVkcXJoc1poM1FOQU1RIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfQjlHX2VVRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19lVURSRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9COUdfZWtEUkVkcXJoc1poM1FOQU1RIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfQjlHX2UwRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19lMERSRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9sNXlVQmtEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfQjlHX2ZFRFJFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX0I5R19mVURSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfZlVEUkVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfQjlHX2ZrRFJFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX0I5R19mMERSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfZjBEUkVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfbDV5VUIwRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX0I5R19nRURSRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9COUdfZ1VEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2dVRFJFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX0I5R19na0RSRWRxcmhzWmgzUU5BTVEiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9COUdfZzBEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2cwRFJFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX2w1eVVDRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9COUdfaEVEUkVkcXJoc1poM1FOQU1RIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfQjlHX2hVRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19oVURSRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9COUdfaGtEUkVkcXJoc1poM1FOQU1RIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfQjlHX2gwRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19oMERSRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9sNXlVQ1VEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfQjlHX2lFRFJFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX0I5R19pVURSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfaVVEUkVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfQjlHX2lrRFJFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX0I5R19pMERSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfaTBEUkVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfbDV5VUNrRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX0I5R19qRURSRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9COUdfamtEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2prRFJFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iX0I5R19qMERSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfajBEUkVkcXJoc1poM1FOQU1RIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfQjlHX2tFRFJFZHFyaHNaaDNRTkFNUSIgeD0iMTMyLjAiIHk9IjEuMCIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9COUdfbVVEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX21VRFJFZHFyaHNaaDNRTkFNUSIgYW5jaG9yPSJfQjlHX21FRFJFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfQjlHX21FRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19tRURSRWRxcmhzWmgzUU5BTVEiIGdyYXBoRWRnZT0iX0I5R19tVURSRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9COUdfa1VEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2tVRFJFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX2w1eVVBRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9COUdfa2tEUkVkcXJoc1poM1FOQU1RIiB3aWR0aD0iOTQuMCIgaGVpZ2h0PSIyMTUuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX0I5R19rMERSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfazBEUkVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfQjlHX2xFRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19sRURSRWRxcmhzWmgzUU5BTVEiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9COUdfbFVEUkVkcXJoc1poM1FOQU1RIiB4PSIxMzcuMCIgeT0iMzIzLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9COUdfbGtEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2xrRFJFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX2w1eVVBRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9COUdfbDBEUkVkcXJoc1poM1FOQU1RIiB3aWR0aD0iODQuMCIgaGVpZ2h0PSIxNjYuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfQjlHX2pVRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19qVURSRWRxcmhzWmgzUU5BTVEiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIiBlbGVtZW50PSJfZFlHbTBFRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPC9kaWFncmFtcz4KLSAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgPHByb2Nlc3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIHhtaTppZD0iX1p0WmJNVURGRWRxTzlNM2Z1a1lBX0EiIG5hbWU9IkNQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBndWlkPSJfWnRaYk1VREZFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWY6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwcmVzZW50YXRpb25OYW1lPSJDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgYnJlYWtkb3duRWxlbWVudHM9Il9sRGhsOEVERkVkcU85TTNmdWtZQV9BIF9kWUdtMEVEUEVkcXJoc1poM1FOQU1RIj4KLSAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItaWNPNnBJSGRabTlWeHljLUpaOVV5dyIgaHJlZj0idW1hOi8vLWljTzZwSUhkWm05Vnh5Yy1KWjlVeXcjLWljTzZwSUhkWm05Vnh5Yy1KWjlVeXciLz4KLSAgICAgIDxkZWZhdWx0Q29udGV4dCBocmVmPSJ1bWE6Ly9fcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSNfcnJtQ0lCQWRFZHE3RnJjX3lNaFEtQSIvPgotICAgICAgPHZhbGlkQ29udGV4dCBocmVmPSJ1bWE6Ly9fcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSNfcnJtQ0lCQWRFZHE3RnJjX3lNaFEtQSIvPgotICAgIDwvcHJvY2Vzcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQ+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9FZGl0b3JMb2FkLnJ0ZiBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL0VkaXRvckxvYWQucnRmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzljMTA1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL0VkaXRvckxvYWQucnRmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvYXBwbGllZGlzLmdpZiBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2FwcGxpZWRpcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NWYxYjAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvYXBwbGllZGlzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2J1bGxldDEuZ2lmIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvYnVsbGV0MS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMzhjMjQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvYnVsbGV0MS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9idXR0b25zLmpwZyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2J1dHRvbnMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTRiMmQyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2J1dHRvbnMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvaGVscGJvb2suZ2lmIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvaGVscGJvb2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDJkNjJkLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2hlbHBib29rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL25pX2dldFN0YXJ0ZWQuZ2lmIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvbmlfZ2V0U3RhcnRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZDhjYTAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvbmlfZ2V0U3RhcnRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9wYXBlcnMuaHRtIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcGFwZXJzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNlZDNkMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9wYXBlcnMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLSAKLSA8aHRtbD4KLQotPGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPiA8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9Im90aGVyIj4gIDxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiI+IAotPHRpdGxlPldoaXRlIFBhcGVyczwvdGl0bGU+Ci08bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9Ii4uL3JvcC5jc3MiIHR5cGU9InRleHQvY3NzIj4KLQotPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNaWNyb3NvZnQgRnJvbnRQYWdlIDQuMCI+Ci08bWV0YSBuYW1lPSJQcm9nSWQiIGNvbnRlbnQ9IkZyb250UGFnZS5FZGl0b3IuRG9jdW1lbnQiPgotPC9oZWFkPgotCi08Ym9keT4KLQotIAotPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+PHRyPjx0ZCB2YWxpZ249InRvcCI+Ci0KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotPCEtLQotCi0vL1RlbGwgdGhlIFRyZWVQYXRoIHRvIHVwZGF0ZSBpdHNlbGYKLXZhciB0aGVQYXRoID0gIiI7Ci12YXIgdHlwZSA9IHR5cGVvZiBwYXJlbnQub3J5X2J1dHRvbjsKLWlmICh0eXBlICE9ICJ1bmRlZmluZWQiKSB7Ci0JIHR5cGUgPSB0eXBlb2YgcGFyZW50Lm9yeV9idXR0b24uZ2V0VHJlZVBhdGgoKTsKLQkgaWYgKHR5cGUgIT0gInVuZGVmaW5lZCIpIHsKLQkgCSB0aGVQYXRoID0gcGFyZW50Lm9yeV9idXR0b24uZ2V0VHJlZVBhdGgoKTsKLQkgfQotfQotZG9jdW1lbnQud3JpdGUodGhlUGF0aCk7Ci0tLT4KLTwvc2NyaXB0PgotCi0gCi0KLQotCi08aDEgY2xhc3M9ImJhbm5lciI+PGI+UmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzOiZuYnNwO1doaXRlIFBhcGVyczwvYj48L2gxPgotPHAgY2xhc3M9ImJhbm5lciI+VGhlIFJVUCBpbmNsdWRlcyBhIG51bWJlciBvZiB3aGl0ZSBwYXBlcnMsIGxpc3RlZCBiZWxvdy48L3A+Ci08dWw+Ci08bGk+PGEgaHJlZj0iLi4vY29tcG9uZW50cy9wY19kaXNjaXBsaW5lcy5odG0iPkRpc2NpcGxpbmVzPC9hPjx1bD4KLTxsaT48YSBocmVmPSJhcHBybXVjLmh0bSI+QXBwbHlpbmcgUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQgd2l0aCBVc2UgQ2FzZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJ0cmFjZWFiaWxpdHkuaHRtIj5UcmFjZWFiaWxpdHkgU3RyYXRlZ2llcyBmb3IgTWFuYWdpbmcgUmVxdWlyZW1lbnRzIHdpdGggVXNlIENhc2VzPC9hPjwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT48YSBocmVmPSIuLi9jb21wb25lbnRzL3BjX3JlcXVpcmVtZW50cy5odG0iPlJlcXVpcmVtZW50czwvYT48dWw+Ci08bGk+PGEgaHJlZj0iYXBwcm11Yy5odG0iPkFwcGx5aW5nIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50IHdpdGggVXNlIENhc2VzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idXNlY2FzZS5odG0iPlRoZSBFc3RpbWF0aW9uIG9mIEVmZm9ydCBCYXNlZCBvbiBVc2UgQ2FzZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJ0cmFjZWFiaWxpdHkuaHRtIj5UcmFjZWFiaWxpdHkgU3RyYXRlZ2llcyBmb3IgTWFuYWdpbmcgUmVxdWlyZW1lbnRzIHdpdGggVXNlIENhc2VzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idGVuZXNzLmh0bSI+VGhlIFRlbiBFc3NlbnRpYWxzIG9mIFJVUDwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0iLi4vY29tcG9uZW50cy9wY19hcmNoaXRlY3R1cmUuaHRtIj5BcmNoaXRlY3R1cmU8L2E+PHVsPgotPGxpPjxhIGhyZWY9ImxheWVyaW5nX3N0cmF0ZWdpZXMuaHRtIj5MYXllcmluZyBTdHJhdGVnaWVzPC9hPjwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT48YSBocmVmPSIuLi9jb21wb25lbnRzL3BjX2Rlc2lnbi5odG0iPkRlc2lnbjwvYT48dWw+Ci08bGk+PGEgaHJlZj0ieHByZWZhY3QuaHRtIj5SVVAvWFAgR3VpZGVsaW5lczogVGVzdC1maXJzdCBEZXNpZ24gYW5kIFJlZmFjdG9yaW5nPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ic2lzLmh0bSI+RGV2ZWxvcGluZyBMYXJnZS1TY2FsZSBTeXN0ZW1zIHdpdGggdGhlIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzczwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0iLi4vY29tcG9uZW50cy9wY19pbXBsZW1lbnRhdGlvbi5odG0iPkltcGxlbWVudGF0aW9uPC9hPjx1bD4KLTxsaT48YSBocmVmPSJ4cHJlZmFjdC5odG0iPlJVUC9YUCBHdWlkZWxpbmVzOiBUZXN0LWZpcnN0IERlc2lnbiBhbmQgUmVmYWN0b3Jpbmc8L2E+PC9saT4KLTxsaT48YSBocmVmPSJ4cHBhaXIuaHRtIj5SVVAvWFAgR3VpZGVsaW5lczogUGFpciBQcm9ncmFtbWluZzwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0iLi4vY29tcG9uZW50cy9wY19hc3Nlc3NtZW50Lmh0bSI+QXNzZXNzbWVudDwvYT48dWw+Ci08bGk+PGEgaHJlZj0iLi4vY29tcG9uZW50cy9hc3Nlc3NtZW50L3BjX3Rlc3QuaHRtIj5UZXN0PC9hPjx1bD4KLTxsaT48YSBocmVmPSJydF90ZXN0Lmh0bSI+VGVzdGluZyBFbWJlZGRlZCBTeXN0ZW1zPC9hPjwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9Ii4uL2NvbXBvbmVudHMvcGNfbWFuYWdlbWVudC5odG0iPk1hbmFnZW1lbnQ8L2E+PHVsPgotPGxpPjxhIGhyZWY9Ii4uL2NvbXBvbmVudHMvbWFuYWdlbWVudC9wY19jY20uaHRtIj5Db25maWd1cmF0aW9uICYgQ2hhbmdlIE1hbmFnZW1lbnQ8L2E+PHVsPgotPGxpPjxhIGhyZWY9ImNvbnRlbnRtZ210Lmh0bSI+Q29udGVudCBNYW5hZ2VtZW50IFVzaW5nIHRoZSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3M8L2E+PC9saT4KLTxsaT48YSBocmVmPSJ0ZW5lc3MuaHRtIj5UaGUgVGVuIEVzc2VudGlhbHMgb2YgUlVQPC9hPjwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT48YSBocmVmPSJ0ZW5lc3MuaHRtIj5UaGUgVGVuIEVzc2VudGlhbHMgb2YgUlVQPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idHJhbnN3ZmFsbC5odG0iPkZyb20gV2F0ZXJmYWxsIHRvIEl0ZXJhdGl2ZSBMaWZlY3ljbGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJ1c2VjYXNlLmh0bSI+VGhlIEVzdGltYXRpb24gb2YgRWZmb3J0IEJhc2VkIG9uIFVzZSBDYXNlczwvYT48L2xpPgotPGxpPjxhIGhyZWY9InJ1cHhwLmh0bSI+QSBDb21wYXJpc29uIG9mIFJVUCBhbmQgWFA8L2E+PC9saT4KLTxsaT48YSBocmVmPSJzbXByb2ouaHRtIj5Vc2luZyB0aGUgUlVQIGZvciBTbWFsbCBQcm9qZWN0czogRXhwYW5kaW5nIHVwb24gZVh0cmVtZSBQcm9ncmFtbWluZzwvYT48L2xpPgotPGxpPjxhIGhyZWY9InJ1cGNtbS5odG0iPlJlYWNoaW5nIENNTSBMZXZlbHMgMiBhbmQgMzwvYT48L2xpPgotPGxpPjxhIGhyZWY9InByb2Nlc3NfbWF0dXJpdHkuaHRtIj5BbiBFbmFibGVyIGZvciBIaWdoZXIgUHJvY2VzcyBNYXR1cml0eTwvYT48L2xpPgotPGxpPjxhIGhyZWY9InNpcy5odG0iPkRldmVsb3BpbmcgTGFyZ2UtU2NhbGUgU3lzdGVtcyB3aXRoIHRoZSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3M8L2E+PC9saT4KLTxsaT48YSBocmVmPSJ2YXJpYW50cy5odG0iPlN5c3RlbSBWYXJpYW50czwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0iLi4vY29tcG9uZW50cy9wY190b29scy5odG0iPlRvb2xzPC9hPjx1bD4KLTxsaT48YSBocmVmPSIuLi90b29sbWVudC94ZGVfZWNsaXBzZS9tb2RlbF9zdHJ1Y3R1cmVfZ3VpZGVsaW5lcy5odG0iPk1vZGVsIFN0cnVjdHVyZSBHdWlkZWxpbmVzIGZvciBSYXRpb25hbCBYREUgRGV2ZWxvcGVyIC0gSmF2YSBQbGF0Zm9ybSBFZGl0aW9uPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iLi4vdG9vbG1lbnQveGRlX3ZzbmV0L21vZGVsX3N0cnVjdHVyZV9ndWlkZWxpbmVzLmh0bSI+TW9kZWwgU3RydWN0dXJlIEd1aWRlbGluZXMgZm9yIFJhdGlvbmFsIFhERSBEZXZlbG9wZXIgLSAuTkVUIEVkaXRpb248L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLQotPHA+SWYgeW91IGhhdmUgSW50ZXJuZXQgYWNjZXNzLCZuYnNwOyBzb21lIG9mIHRoZSBSVVAgd2hpdGUgcGFwZXJzIGNhbiBiZSBkb3dubG9hZGVkIAotICBmcm9tJm5ic3A7dGhlIDxhIGhyZWY9Imh0dHA6Ly93d3ctMzA2LmlibS5jb20vc29mdHdhcmUvcmF0aW9uYWwvaW5mby9saXRlcmF0dXJlL3doaXRlcGFwZXJzLmpzcCIgdGFyZ2V0PSJfYmxhbmsiPklCTSBXZWIgc2l0ZS48L2E+PC9wPgotPGJyPjxicj4KLQotIAotPGRpdiBjbGFzcz0ibWFyZ2luczIwIj4KLTxwPgotIDxhIGhyZWY9Ii4uL2NvcHlyaXRlL2NvcHlyaXRlLmh0bSI+Ci0gPGZvbnQgc2l6ZT0iLTIiPiZjb3B5OyBDb3B5cmlnaHQgSUJNIENvcnAuIDE5ODcsIDIwMDQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuPC9mb250PgotIDwvYT4KLTwvcD4KLTwvZGl2PgotCi0KLTwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQiPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMSUiPgotPHA+Ci08YSBocmVmPSIuLi9pbmRleC5odG0iPjwvYT4KLTwvcD4KLQotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci08IS0tCi0KLWZ1bmN0aW9uIGxvYWRUb3AoKQotewotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiBwYXJlbnQuZnJhbWVzWzFdLm5hbWU9PSJvcnlfdG9jIikKLSAgewotCSB2YXIgbXNnID0gIlRoZSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgaXMgYWxyZWFkeSBkaXNwbGF5ZWQgdXNpbmcgZnJhbWVzIjsKLSAgICAgYWxlcnQobXNnKTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICB2YXIgZXhwaXJlcyA9IG5ldyBEYXRlKCk7Ci0gICAgZXhwaXJlcy5zZXRUaW1lIChleHBpcmVzLmdldFRpbWUoKSArICgxMDAwICogMjApKTsKLSAgICBkb2N1bWVudC5jb29raWUgPSAicnVwX29yeV9kb2M9IiArIGVzY2FwZSAoZG9jdW1lbnQuVVJMKSArCi0gICAgIjsgZXhwaXJlcz0iICsgZXhwaXJlcy50b1VUQ1N0cmluZygpICsgICI7IHBhdGg9LyI7Ci0KLSAgICB2YXIgbmV3X29yeV9kb2NfbG9jID0gbnVsbDsKLQotICAgIGZvcihpPWRvY3VtZW50LmxpbmtzLmxlbmd0aC0xO2k+PTA7aS0tKQotICAgIHsKLSAgICAgICBpZihkb2N1bWVudC5saW5rc1tpXS5ocmVmLmluZGV4T2YoImluZGV4Lmh0bSIpIT0tMSkKLSAgICAgICB7Ci0gICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBkb2N1bWVudC5saW5rc1tpXS5ocmVmOwotICAgICAgICAgYnJlYWs7Ci0gICAgICAgfQotICAgIH0KLQotICAgIGlmKG5ld19vcnlfZG9jX2xvYyE9bnVsbCkKLSAgICB7Ci0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQotCXsKLQkJd2luZG93LmNsb3NlKCk7Ci0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsJCQotCX0KLQllbHNlCi0JewotCSAgICAgICAJdG9wLmxvY2F0aW9uID0gbmV3X29yeV9kb2NfbG9jOwotCX0KLSAgICB9Ci0gICB9Ci19Ci0vLyAtLT4KLTwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci08IS0tCi0gIGZ1bmN0aW9uIGdldEltYWdlVXJsKGltYWdlKQotICB7Ci0gICAgdmFyIG5ld19vcnlfZG9jX2xvYz1udWxsOwotICAgIGZvcihpPWRvY3VtZW50LmxpbmtzLmxlbmd0aC0xO2k+PTA7aS0tKQotICAgIHsKLSAgICAgICBpZihkb2N1bWVudC5saW5rc1tpXS5ocmVmLmluZGV4T2YoImluZGV4Lmh0bSIpIT0tMSkKLSAgICAgICB7Ci0gICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBkb2N1bWVudC5saW5rc1tpXS5ocmVmLnN1YnN0cmluZygwLGRvY3VtZW50LmxpbmtzW2ldLmhyZWYubGFzdEluZGV4T2YoIi8iKSk7Ci0gICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBuZXdfb3J5X2RvY19sb2MgKyAiIiArIGltYWdlOwotICAgICAgICAgcmV0dXJuIG5ld19vcnlfZG9jX2xvYzsKLSAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0vLyAtLT4KLTwvc2NyaXB0PgotPHNjcmlwdAotbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotPCEtLQotTVNGUGhvdmVyID0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gMyApKSB8fAotICAoKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSAmJgotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOwotCi0gIGZ1bmN0aW9uIE1TRlBwcmVsb2FkKGltZykKLSAgewotICAgICB2YXIgYT1uZXcgSW1hZ2UoKTsKLSAgICAgYS5zcmM9aW1nOwotICAgICByZXR1cm4gYTsKLSAgfQotLy8gLS0+Ci08L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotPCEtLQotICAgIGlmKE1TRlBob3ZlcikKLSAgICB7Ci0gICAgICAgIFJ1cEdyYXk9TVNGUHByZWxvYWQoZ2V0SW1hZ2VVcmwoJy9pbWFnZXMvcnVwMS5naWYnKSk7Ci0gICAgICAgIFJ1cEJsdWU9TVNGUHByZWxvYWQoZ2V0SW1hZ2VVcmwoJy9pbWFnZXMvcnVwMV9hLmdpZicpKTsKLSAgICB9Ci0vLyAtLT4KLQotLy9kaXNwbGF5IHRoZSBsb2FkIGJ1dHRvbiBvciBub3QKLXZhciBvcnlfdG9jX2V4aXN0ID0gdHlwZW9mIHBhcmVudC5vcnlfdG9jOwotaWYgKG9yeV90b2NfZXhpc3QgPT0gInVuZGVmaW5lZCIpIHsKLQkvLyBzcGxpdCBhbHQgdGV4dCBvdXQgdG8gYWxsb3cgdHJhbnNsYXRpb24KLQl2YXIgYWx0VGV4dCA9ICJEaXNwbGF5IFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB1c2luZyBmcmFtZXMiOwotCWRvY3VtZW50LndyaXRlKCI8YSBocmVmPVwiSmF2YVNjcmlwdDpsb2FkVG9wKCk7XCIgb25tb3VzZW92ZXI9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEJsdWUuc3JjOyBzZWxmLnN0YXR1cz0nICc7IHJldHVybiB0cnVlXCIgb25tb3VzZW91dD1cImlmKE1TRlBob3ZlcikgZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwR3JheS5zcmM7IHNlbGYuc3RhdHVzPSAnICc7cmV0dXJuIHRydWVcIj4gPGJyPiA8aW1nIHNyYz1cIi4uL2ltYWdlcy9ydXAxLmdpZiIpOwotCWRvY3VtZW50LndyaXRlKCJcIiAgYm9yZGVyPVwiMFwiIGFsdD1cIiIpOwotICAgICAgICBkb2N1bWVudC53cml0ZShhbHRUZXh0KTsKLSAgICAgICAgZG9jdW1lbnQud3JpdGUoIlwiIG5hbWU9XCJIb21lXCIgd2lkdGg9XCIyNlwiIGhlaWdodD1cIjE2N1wiPjwvYT4iKTsKLQotfQotZWxzZSB7Ci0JdmFyIG5ic3AgPSAiJm5ic3A7IjsKLQlkb2N1bWVudC53cml0ZShuYnNwKTsKLX0KLTwvc2NyaXB0PgotCi08L3RkPjwvdHI+PC90YWJsZT48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj48dHI+PHRkPgotPHAgYWxpZ249InJpZ2h0Ij48c21hbGw+PHNtYWxsPlJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyZuYnNwOyZuYnNwOyAKLTxpbWcgYm9yZGVyPSIwIiBhbHQ9IjIwMDMuMDYuMTUiIHNyYz0iLi4vaW1hZ2VzL3J1cHZlcnNpb24uZ2lmIj4KLTwvc21hbGw+PC9zbWFsbD4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi0gCi0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwLmpwZyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3J1cC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0N2Y1MzYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3J1cDFfYS5naWYgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9ydXAxX2EuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTk2MzhkLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3J1cDFfYS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9ydXBfcGxhdGZvcm0uanBnIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwX3BsYXRmb3JtLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYwYzc4MC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9ydXBfcGxhdGZvcm0uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvc3luY2VkLmdpZiBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3N5bmNlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MDkzNGIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvc3luY2VkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjEyYWIzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTVSVEsxR09mQm0yY2NPam4xaW5mc3ciIG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9BMSxfTUtQbmtBLVdFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLTVSVEsxR09mQm0yY2NPam4xaW5mc3ciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTc6NTM6MTUuODI4LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkN1c3RvbSBDYXRlZ29yeSBBMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5DdXN0b20gQ2F0ZWdvcnkgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2N1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyMzMwMS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1WcGh6NjVaMUI5LXJJTUpLalg3aDBBIiBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQTIsX09TU1NJQS1XRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1WcGh6NjVaMUI5LXJJTUpLalg3aDBBIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE4OjAyOjA3LjE3Mi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5DdXN0b20gQ2F0ZWdvcnkgQTIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+Q3VzdG9tIENhdGVnb3J5IEEyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2N1c3RvbWNhdGVnb3JpZXMvc3ViX2N1c3RvbV9jYXRlZ29yeV9BMS4xLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jdXN0b21jYXRlZ29yaWVzL3N1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZDUxYTIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2N1c3RvbWNhdGVnb3JpZXMvc3ViX2N1c3RvbV9jYXRlZ29yeV9BMS4xLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItanFTcmJGWlk5R2I0anBEaVlTWmNGUSIgbmFtZT0ic3ViX2N1c3RvbV9jYXRlZ29yeV9BMS4xLF83ZFhZVUJCS0VkcUJzN0toZFZMUkxBIiBndWlkPSItanFTcmJGWlk5R2I0anBEaVlTWmNGUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxODowMToyNi44MjgtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+U3ViLUN1c3RvbSBDYXRlZ29yeSBBMS4xIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlN1Yi1DdXN0b20gQ2F0ZWdvcnkgQTEuMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jUGFrX0ExLjEvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY1Bha19BMS4xL2NvbnRlbnQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWVlYmI4Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jUGFrX0ExLjEvY29udGVudC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTYzdXNnUVdGalZfZ0htUVlNM1JVeXciIG5hbWU9ImRlbFByb2NQYWtfQTEuMSxfdXE1SzhSTTFFZHFxbmRpLWdEdXhwdyIgZ3VpZD0iLTYzdXNnUVdGalZfZ0htUVlNM1JVeXciPgotICA8bWFpbkRlc2NyaXB0aW9uPkRlbFByb2NQYWsgQTEuMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5EZWxQcm9jUGFrIEExLjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHB1cnBvc2U+RGVsUHJvY1BhayBBMS4xIHBvcnBvaXNlPC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPkRlbFByb2NQYWsgQTEuMSBhbHQ8L2FsdGVybmF0aXZlcz4KLSAgPGhvd3RvU3RhZmY+RGVsUHJvY1BhayBBMS4xIHN0YWZmPC9ob3d0b1N0YWZmPgotICA8ZXh0ZXJuYWxJZD5EZWxQcm9jUGFrIEExLjEgZXh0ZXJuSUQ8L2V4dGVybmFsSWQ+Ci0gIDxzY29wZT5EZWxQcm9jUGFrIEExLjEgc2NvcGU8L3Njb3BlPgotICA8dXNhZ2VOb3Rlcz5EZWxQcm9jUGFrIEExLjEgdXNhZ2U8L3VzYWdlTm90ZXM+Ci0gIDxzY2FsZT5EZWxQcm9jUGFrIEExLjEgc2NhbGU8L3NjYWxlPgotICA8cHJvamVjdENoYXJhY3RlcmlzdGljcz5EZWxQcm9jUGFrIEExLjEgY2hhcjwvcHJvamVjdENoYXJhY3RlcmlzdGljcz4KLSAgPHJpc2tMZXZlbD5EZWxQcm9jUGFrIEExLjEgcmlzazwvcmlza0xldmVsPgotICA8ZXN0aW1hdGluZ1RlY2huaXF1ZT5EZWxQcm9jUGFrIEExLjEmYW1wO25ic3A7ZXN0aW1hdGluZyB0ZWNoJmx0OyEtLVN0YXJ0RnJhZ21lbnQtLSZndDsmbHQ7IS0tRW5kRnJhZ21lbnQtLSZndDs8L2VzdGltYXRpbmdUZWNobmlxdWU+Ci0gIDxwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPkRlbFByb2NQYWsgQTEuMSBleHBlcnRpc2U8L3Byb2plY3RNZW1iZXJFeHBlcnRpc2U+Ci0gIDx0eXBlT2ZDb250cmFjdD5EZWxQcm9jUGFrIEExLjEmYW1wO25ic3A7Y29udHJhY3Q8L3R5cGVPZkNvbnRyYWN0PgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NQYWtfQTEuMS9tb2RlbC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY1Bha19BMS4xL21vZGVsLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyMjI5MS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY1Bha19BMS4xL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX3V1bjBZQk0xRWRxcW5kaS1nRHV4cHciIGd1aWQ9Il91dW4wWUJNMUVkcXFuZGktZ0R1eHB3Ij4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il91dW4wWVJNMUVkcXFuZGktZ0R1eHB3IiBpZD0iLTYzdXNnUVdGalZfZ0htUVlNM1JVeXciIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfdXE1SzhCTTFFZHFxbmRpLWdEdXhwdyIgbmFtZT0iZGVsUHJvY1Bha19BMS4xIiBndWlkPSJfdXE1SzhCTTFFZHFxbmRpLWdEdXhwdyI+Ci0gICAgPHByb2Nlc3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcnlQcm9jZXNzIiB4bWk6aWQ9Il91cTVLOFJNMUVkcXFuZGktZ0R1eHB3IiBuYW1lPSJkZWxQcm9jUGFrX0ExLjEiIGd1aWQ9Il91cTVLOFJNMUVkcXFuZGktZ0R1eHB3IiBicmllZkRlc2NyaXB0aW9uPSJEZWxQcm9jUGFrIEExLjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbFByb2NQYWsgQTEuMSBwcmVzZW50Ij4KLSAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItNjN1c2dRV0ZqVl9nSG1RWU0zUlV5dyIgaHJlZj0idW1hOi8vLTYzdXNnUVdGalZfZ0htUVlNM1JVeXcjLTYzdXNnUVdGalZfZ0htUVlNM1JVeXciLz4KLSAgICAgIDxkZWZhdWx0Q29udGV4dCBocmVmPSJ1bWE6Ly9fcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSNfcnJtQ0lCQWRFZHE3RnJjX3lNaFEtQSIvPgotICAgICAgPHZhbGlkQ29udGV4dCBocmVmPSJ1bWE6Ly9fcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSNfcnJtQ0lCQWRFZHE3RnJjX3lNaFEtQSIvPgotICAgIDwvcHJvY2Vzcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQ+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19BMS9jb250ZW50LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0ExL2NvbnRlbnQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjkwN2M3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0ExL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1VOF9MR3ZNU29mLWRiMjRhRkFNYjZ3IiBuYW1lPSJEZWxQcm9jIEExLF9XNmE0Y1JCTkVkcUJzN0toZFZMUkxBIiBndWlkPSItVThfTEd2TVNvZi1kYjI0YUZBTWI2dyI+Ci0gIDxtYWluRGVzY3JpcHRpb24+RGVsUHJvYyBBMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5EZWxQcm9jIEExIGtleSBjb248L2tleUNvbnNpZGVyYXRpb25zPgotICA8cHVycG9zZT5EZWxQcm9jIEExIHBvcnBvaXNlPC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPkRlbFByb2MgQTEgYWx0ZXJuPC9hbHRlcm5hdGl2ZXM+Ci0gIDxob3d0b1N0YWZmPkRlbFByb2MgQTEgc3RhZmY8L2hvd3RvU3RhZmY+Ci0gIDxleHRlcm5hbElkPkRlbFByb2MgQTEgZXh0ZXJuSUQ8L2V4dGVybmFsSWQ+Ci0gIDxzY29wZT5EZWxQcm9jIEExIHNjb3BlPC9zY29wZT4KLSAgPHVzYWdlTm90ZXM+RGVsUHJvYyBBMSB1c2FnZTwvdXNhZ2VOb3Rlcz4KLSAgPHNjYWxlPkRlbFByb2MgQTEgc2NhbGU8L3NjYWxlPgotICA8cHJvamVjdENoYXJhY3RlcmlzdGljcz5EZWxQcm9jIEExIHByb2ogY2hhcjwvcHJvamVjdENoYXJhY3RlcmlzdGljcz4KLSAgPHJpc2tMZXZlbD5EZWxQcm9jIEExIHJpc2s8L3Jpc2tMZXZlbD4KLSAgPGVzdGltYXRpbmdUZWNobmlxdWU+RGVsUHJvYyBBMSBlc3QgdGVjaDwvZXN0aW1hdGluZ1RlY2huaXF1ZT4KLSAgPHByb2plY3RNZW1iZXJFeHBlcnRpc2U+RGVsUHJvYyBBMSBleHBlcnRpc2U8L3Byb2plY3RNZW1iZXJFeHBlcnRpc2U+Ci0gIDx0eXBlT2ZDb250cmFjdD5EZWxQcm9jIEExIGNvbnR5cGU8L3R5cGVPZkNvbnRyYWN0PgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQTEvbW9kZWwueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQTEvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODhmMWVhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0ExL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX1hWWTlNQkJORWRxQnM3S2hkVkxSTEEiIGd1aWQ9Il9YVlk5TUJCTkVkcUJzN0toZFZMUkxBIj4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9YVml1TUJCTkVkcUJzN0toZFZMUkxBIiBpZD0iLVU4X0xHdk1Tb2YtZGIyNGFGQU1iNnciIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfVzZhNGNCQk5FZHFCczdLaGRWTFJMQSIgbmFtZT0iZGVsUHJvY19BMSIgZ3VpZD0iX1c2YTRjQkJORWRxQnM3S2hkVkxSTEEiPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJ5UHJvY2VzcyIgeG1pOmlkPSJfVzZhNGNSQk5FZHFCczdLaGRWTFJMQSIgbmFtZT0iZGVsUHJvY19BMSIgZ3VpZD0iX1c2YTRjUkJORWRxQnM3S2hkVkxSTEEiIGJyaWVmRGVzY3JpcHRpb249IkRlbFByb2MgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbFByb2MgQTEgcHJlc2VudCI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVU4X0xHdk1Tb2YtZGIyNGFGQU1iNnciIGhyZWY9InVtYTovLy1VOF9MR3ZNU29mLWRiMjRhRkFNYjZ3Iy1VOF9MR3ZNU29mLWRiMjRhRkFNYjZ3Ii8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2Rpc2NpcGxpbmVncm91cGluZ3MvZGlzY2lwbGluZV9ncm91cGluZ19BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGlzY2lwbGluZWdyb3VwaW5ncy9kaXNjaXBsaW5lX2dyb3VwaW5nX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExMGI3OS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGlzY2lwbGluZWdyb3VwaW5ncy9kaXNjaXBsaW5lX2dyb3VwaW5nX0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItbXVBa1hESmZvX0tiUkY0S09ibjlPUSIgbmFtZT0iZGlzY2lwbGluZV9ncm91cGluZ19BMSxfQ0NWamNBLVdFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLW11QWtYREpmb19LYlJGNEtPYm45T1EiIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTc6NDI6MzcuNzgxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkRpc2NpcGxpbmUgR3JvdXBpbmcgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RGlzY2lwbGluZSBHcm91cGluZyBBMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQzZmNlYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGlzY2lwbGluZXMvZGlzY2lwbGluZV9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUdhR2w1a0hKNHhLQ19TaGc2WjE2WmciIG5hbWU9ImRpc2NpcGxpbmVfQTEsX0M1ZF93QS1XRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1HYUdsNWtISjR4S0NfU2hnNloxNlpnIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTIyVDEwOjQ1OjAyLjk2OS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5EaXNjaXBsaW5lIEExIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPkRpc2NpcGxpbmUgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGlzY2lwbGluZXMvZGlzY2lwbGluZV9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGlzY2lwbGluZXMvZGlzY2lwbGluZV9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YjQ1OGEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1RMGxpYTV5RXlOWFdkLUtOSjZjR3JBIiBuYW1lPSJkaXNjaXBsaW5lX0EyLF9EenZQb0EtV0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItUTBsaWE1eUV5TlhXZC1LTko2Y0dyQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNzo0NDoxNC43MzQtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+RGlzY2lwbGluZSBBMiBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5EaXNjaXBsaW5lIEEyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RvbWFpbnMvZG9tYWluX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kb21haW5zL2RvbWFpbl9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZjVmODUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RvbWFpbnMvZG9tYWluX0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItTzEzVXVKYjhHcUJMVnRXYVVxZ3FSdyIgbmFtZT0iZG9tYWluX0ExLF9GRXpPNEEtV0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItTzEzVXVKYjhHcUJMVnRXYVVxZ3FSdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxOToxNTozNS4wMzEtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgRG9tYWluIEExIG1haW4KLSZsdDsvcCZndDs8L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPkRvbWFpbiBBMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kb21haW5zL2RvbWFpbl9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZG9tYWlucy9kb21haW5fQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTU1NmI1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kb21haW5zL2RvbWFpbl9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTNoWUp5cjNUcWlNZzZRZHk5QVhJeHciIG5hbWU9ImRvbWFpbl9BMixfRnFXTDhBLVdFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLTNoWUp5cjNUcWlNZzZRZHk5QVhJeHciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTc6NDc6MjguNzY2LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkRvbWFpbiBBMiBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Eb21haW4gQTIga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZG9tYWlucy9zdWJfZG9tYWluX0ExLjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RvbWFpbnMvc3ViX2RvbWFpbl9BMS4xLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZiY2EwYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZG9tYWlucy9zdWJfZG9tYWluX0ExLjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1LRDcyRW81bE1NUHA3YlM4b1BCdlB3IiBuYW1lPSJzdWJfZG9tYWluX0ExLjEsX0dPWjdRQS1XRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1LRDcyRW81bE1NUHA3YlM4b1BCdlB3IiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE3OjQ2OjUzLjkyMi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5TdWItRG9tYWluIEExLjEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+U3ViLURvbWFpbiBBMS4xIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jaGVja2xpc3RzL2NoZWNrbGlzdF9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFmYjZjOS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItb1dvM1VDaWZYNEljX1ZCSUNXd3FSdyIgbmFtZT0iY2hlY2tsaXN0X0ExLF9LVjRxMEEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItb1dvM1VDaWZYNEljX1ZCSUNXd3FSdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDozNC4xMjUtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Q2hlY2tsaXN0IEExIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvY2hlY2tsaXN0cy9jaGVja2xpc3RfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDZjMzRlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvY2hlY2tsaXN0cy9jaGVja2xpc3RfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1KOVVyOXNtcFF1dlZHcHVHOWlfd2tRIiBuYW1lPSJjaGVja2xpc3RfQTIsX2tyaVRjQS1URWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1KOVVyOXNtcFF1dlZHcHVHOWlfd2tRIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMwOjM2LjIxOS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5DaGVja2xpc3QgQTIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjEyODc4Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii02eTdhQlF0M2NDU0JMbzhzbU1SZW1BIiBuYW1lPSJjb25jZXB0X0ExLF9OREwta0EtU0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItNnk3YUJRdDNjQ1NCTG84c21NUmVtQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDozMC45MzgtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgQ29uY2VwdCBBMSBjb250ZW50Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBGaWxlIGxpbms6JmFtcDtuYnNwOyZsdDthIGhyZWY9JnF1b3Q7ZmlsZTovLy9yZXNvdXJjZXMvY29uY2VwdF9BMS54bWkmcXVvdDsmZ3Q7Y29uY2VwdF9BMS54bWkmbHQ7L2EmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBVUkw6JmFtcDtuYnNwOyZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5wb3NpdHJvbmdyb3VwLmNvbSZxdW90OyZndDtodHRwOi8vd3d3LnBvc2l0cm9uZ3JvdXAuY29tJmx0Oy9hJmd0OwotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgSW1hZ2U6JmFtcDtuYnNwOyZsdDtpbWcgaGVpZ2h0PSZxdW90OzMyJnF1b3Q7IGFsdD0mcXVvdDtQJnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvdHlyYW5ub3NhdXJ1cy5naWYmcXVvdDsgd2lkdGg9JnF1b3Q7MzImcXVvdDsgLyZndDsKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIEVsZW1lbnQgcGxhaW46JmFtcDtuYnNwOyZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDsuLy4uLy4uLy4uL1BsdWclMjBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLF9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBLmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O19PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBJnF1b3Q7Jmd0O0NvbmNlcHQgQTIgcHJlc2VudCZsdDsvYSZndDsKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIEVsZW1lbnQgd2l0aCB0eXBlOiZhbXA7bmJzcDsmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGlua1dpdGhUeXBlJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDsuLy4uLy4uLy4uL1BsdWclMjBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLF9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBLmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O19PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBJnF1b3Q7Jmd0O0NvbmNlcHQ6IENvbmNlcHQgQTIgcHJlc2VudCZsdDsvYSZndDsKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIEVsZW1lbnQgd2l0aCB1c2VyIHRleHQ6JmFtcDtuYnNwOyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGlua1dpdGhVc2VyVGV4dCZxdW90OwotICAgIGhyZWY9JnF1b3Q7Li8uLi8uLi8uLi9QbHVnJTIwQS9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9BMixfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDtfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSZxdW90OyZndDtjb25jZXB0X0EyIHVzZXIgdGV4dCZsdDsvYSZndDsKLSZsdDsvcCZndDs8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkOThmNC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1MUElheE9ITFhxOWlkR1Y0MWlVcjlnIiBuYW1lPSJjb25jZXB0X0EyLF9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIiBndWlkPSItTFBJYXhPSExYcTlpZEdWNDFpVXI5ZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDoyNC41NzgtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Q29uY2VwdCBBMiBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9yZXNvdXJjZXMvY29uY2VwdF9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2NvbmNlcHRzL3Jlc291cmNlcy9jb25jZXB0X0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UyNjUyMS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2NvbmNlcHRzL3Jlc291cmNlcy9jb25jZXB0X0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb20uaWJtLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpjb20uaWJtLnVtYT0iaHR0cDovL3d3dy5pYm0uY29tL3VtYS8xLjAuMi91bWEuZWNvcmUiIHhtaTppZD0iLTZ5N2FCUXQzY0NTQkxvOHNtTVJlbUEiIG5hbWU9ImNvbmNlcHRfQTEsX05ETC1rQS1TRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii02eTdhQlF0M2NDU0JMbzhzbU1SZW1BIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMwOjMwLjkzOC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Db25jZXB0IEExIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvY29tLmlibS51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9yZXNvdXJjZXMvdHlyYW5ub3NhdXJ1cy5naWYgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2NvbmNlcHRzL3Jlc291cmNlcy90eXJhbm5vc2F1cnVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYyZTdiMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2NvbmNlcHRzL3Jlc291cmNlcy90eXJhbm5vc2F1cnVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvZXhhbXBsZXMvZXhhbXBsZV9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2V4YW1wbGVzL2V4YW1wbGVfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjY0NDFmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvZXhhbXBsZXMvZXhhbXBsZV9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1BOTQ5d0hkVEZxRzNXczYzLXE5QjJ3IiBuYW1lPSJleGFtcGxlX0ExLF9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItQTk0OXdIZFRGcUczV3M2My1xOUIydyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDozOC45NjktMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+RXhhbXBsZSBBMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvZXhhbXBsZXMvZXhhbXBsZV9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2V4YW1wbGVzL2V4YW1wbGVfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTQxMjQ0Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvZXhhbXBsZXMvZXhhbXBsZV9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1wbEQyTTFzaFNFLUxsYkR3NXlZcHJnIiBuYW1lPSJleGFtcGxlX0EyLF91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIiBndWlkPSItcGxEMk0xc2hTRS1MbGJEdzV5WXByZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDo0MS4wMTYtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+RXhhbXBsZSBBMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvZ3VpZGVsaW5lcy9ndWlkZWxpbmVfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9ndWlkZWxpbmVzL2d1aWRlbGluZV9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2Y2UwNWYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9ndWlkZWxpbmVzL2d1aWRlbGluZV9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLV8yMV9FaXNRU1RId3RsSmpvSjhidnciIG5hbWU9Imd1aWRlbGluZV9BMSxfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLV8yMV9FaXNRU1RId3RsSmpvSjhidnciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6NDMuMzEyLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkd1aWRlbGluZSBBMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9ndWlkZWxpbmVzL2d1aWRlbGluZV9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2d1aWRlbGluZXMvZ3VpZGVsaW5lX0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0YThjYy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2d1aWRlbGluZXMvZ3VpZGVsaW5lX0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItUGNadHRWLXNjLUVjVVF3Qi1aaEFJdyIgbmFtZT0iZ3VpZGVsaW5lX0EyLF82WVV3QUEtVEVkcUwyTzFQSlY5Y1pBIiBndWlkPSItUGNadHRWLXNjLUVjVVF3Qi1aaEFJdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDo0NS43MzQtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+R3VpZGVsaW5lIEEyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9BMS4xLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0ExLjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTE3YjUxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0ExLjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTl4UDRkN2JhNm9zd0drUGVwWFdrX3ciIG5hbWU9InByYWN0aWNlX0ExLjEsXy1GU1VnQS1VRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii05eFA0ZDdiYTZvc3dHa1BlcFhXa193IiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMxOjIwLjcwMy0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5QcmFjdGljZSBBMS4xIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLSAgPGFkZGl0aW9uYWxJbmZvPlByYWN0aWNlIEExLjEgYWRkPC9hZGRpdGlvbmFsSW5mbz4KLSAgPHByb2JsZW0+UHJhY3RpY2UgQTEuMSBwcm9ibGVtPC9wcm9ibGVtPgotICA8YmFja2dyb3VuZD5QcmFjdGljZSBBMS4xIGJhY2s8L2JhY2tncm91bmQ+Ci0gIDxnb2Fscz5QcmFjdGljZSBBMS4xIGdvYWw8L2dvYWxzPgotICA8YXBwbGljYXRpb24+UHJhY3RpY2UgQTEuMSBhcHA8L2FwcGxpY2F0aW9uPgotICA8bGV2ZWxzT2ZBZG9wdGlvbj5QcmFjdGljZSBBMS4xIGxldmVsPC9sZXZlbHNPZkFkb3B0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNjMzMmIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVo3a2RJa0NwLW1IVWRiX0pvUXB6V1EiIG5hbWU9InByYWN0aWNlX0ExLF9QOGpZWUEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItWjdrZElrQ3AtbUhVZGJfSm9RcHpXUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMToxOC4yOTctMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+UHJhY3RpY2UgQTEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotICA8YWRkaXRpb25hbEluZm8+UHJhY3RpY2UgQTEgYWRkPC9hZGRpdGlvbmFsSW5mbz4KLSAgPHByb2JsZW0+UHJhY3RpY2UgQTEgcHJvYmxlbTwvcHJvYmxlbT4KLSAgPGJhY2tncm91bmQ+UHJhY3RpY2UgQTEgYmFjazwvYmFja2dyb3VuZD4KLSAgPGdvYWxzPlByYWN0aWNlIEExIGdvYWw8L2dvYWxzPgotICA8YXBwbGljYXRpb24+UHJhY3RpY2UgQTEgYXBwPC9hcHBsaWNhdGlvbj4KLSAgPGxldmVsc09mQWRvcHRpb24+UHJhY3RpY2UgQTEgbGV2ZWw8L2xldmVsc09mQWRvcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0EyLjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQTIuMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYmRiYzMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQTIuMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItUjlzUXpvSmpRbTQtTkJ4VXFhTFdMZyIgbmFtZT0icHJhY3RpY2VfQTIuMSxfSnJnd3dBLVZFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLVI5c1F6b0pqUW00LU5CeFVxYUxXTGciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6MjUuMDk0LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlByYWN0aWNlIEEyLjEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotICA8YWRkaXRpb25hbEluZm8+UHJhY3RpY2UgQTIuMSBhZGQ8L2FkZGl0aW9uYWxJbmZvPgotICA8cHJvYmxlbT5QcmFjdGljZSBBMi4xIHByb2JsZW08L3Byb2JsZW0+Ci0gIDxiYWNrZ3JvdW5kPlByYWN0aWNlIEEyLjEgYmFjazwvYmFja2dyb3VuZD4KLSAgPGdvYWxzPlByYWN0aWNlIEEyLjEgZ29hbDwvZ29hbHM+Ci0gIDxhcHBsaWNhdGlvbj5QcmFjdGljZSBBMi4xIGFwcDwvYXBwbGljYXRpb24+Ci0gIDxsZXZlbHNPZkFkb3B0aW9uPlByYWN0aWNlIEEyLjEgbGV2ZWw8L2xldmVsc09mQWRvcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I4ZDJlMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItTmNTTVRmaE1sdHRQVUsyRjZ3WGdFZyIgbmFtZT0icHJhY3RpY2VfQTIsX0VwZm9ZQS1WRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1OY1NNVGZoTWx0dFBVSzJGNndYZ0VnIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMxOjIzLjA5NC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5QcmFjdGljZSBBMiBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxhZGRpdGlvbmFsSW5mbz5QcmFjdGljZSBBMiBhZGQ8L2FkZGl0aW9uYWxJbmZvPgotICA8cHJvYmxlbT5QcmFjdGljZSBBMiBwcm9ibGVtPC9wcm9ibGVtPgotICA8YmFja2dyb3VuZD5QcmFjdGljZSBBMiBiYWNrPC9iYWNrZ3JvdW5kPgotICA8Z29hbHM+UHJhY3RpY2UgQTIgZ29hbDwvZ29hbHM+Ci0gIDxhcHBsaWNhdGlvbj5QcmFjdGljZSBBMiBhcHA8L2FwcGxpY2F0aW9uPgotICA8bGV2ZWxzT2ZBZG9wdGlvbj5QcmFjdGljZSBBMiBsZXZlbDwvbGV2ZWxzT2ZBZG9wdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcmFjdGljZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3JlcG9ydHMvcmVwb3J0X0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyZjAxMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3JlcG9ydHMvcmVwb3J0X0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItWFJlQkxkTjRpTGJ2YWZmQndlYk5DdyIgbmFtZT0icmVwb3J0X0ExLF9RNURjNEEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItWFJlQkxkTjRpTGJ2YWZmQndlYk5DdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDo1MS40MjItMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+UmVwb3J0IEExIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3JlcG9ydHMvcmVwb3J0X0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcmVwb3J0cy9yZXBvcnRfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2YzZmY0Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcmVwb3J0cy9yZXBvcnRfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii01TG5kbWR4eGJHMU0xTWZwQVBLcEFRIiBuYW1lPSJyZXBvcnRfQTIsX0dyR3dRQS1VRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii01TG5kbWR4eGJHMU0xTWZwQVBLcEFRIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMwOjUzLjk4NC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5SZXBvcnQgQTIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcmV1c2FibGVhc3NldHMvcmV1c2FibGVfYXNzZXRfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMGZjNGEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii0xaEhFT0w4cXl4VE1NUjc3NVVHZnJ3IiBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMSxfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLTFoSEVPTDhxeXhUTU1SNzc1VUdmcnciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6MjcuMjE5LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJldXNhYmxlIEFzc2V0IEExIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3JldXNhYmxlYXNzZXRzL3JldXNhYmxlX2Fzc2V0X0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdmN2M5My4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3JldXNhYmxlYXNzZXRzL3JldXNhYmxlX2Fzc2V0X0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTdnbEdZaUphczloWkdrSjljY1E1S1EiIG5hbWU9InJldXNhYmxlX2Fzc2V0X0EyLF9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIiBndWlkPSItN2dsR1lpSmFzOWhaR2tKOWNjUTVLUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMToyOS40MjItMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+UmV1c2FibGUgQXNzZXQgQTIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3JvYWRtYXBzL3JvYWRtYXBfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yb2FkbWFwcy9yb2FkbWFwX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JiNjY3OC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3JvYWRtYXBzL3JvYWRtYXBfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii14b0RaYXFyN0otd2YybEI3clNqU1p3IiBuYW1lPSJyb2FkbWFwX0ExLF9aazM5Z0EtU0VkcUwyTzFQSlY5Y1pBIiBndWlkPSIteG9EWmFxcjdKLXdmMmxCN3JTalNadyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDowNC4wNDctMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Um9hZG1hcCBBMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yb2FkbWFwcy9yb2FkbWFwX0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4M2Q5ZTkuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yb2FkbWFwcy9yb2FkbWFwX0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItSjBzendyS2JpTDJKbS1GaWZRdEk5dyIgbmFtZT0icm9hZG1hcF9BMixfWXVrZ1FBLVZFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLUowc3p3cktiaUwySm0tRmlmUXRJOXciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6MDYuODU5LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJvYWRtYXAgQTIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvc3VwcG9ydGluZ21hdGVyaWFscy9zdXBwb3J0aW5nX21hdGVyaWFsX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvc3VwcG9ydGluZ21hdGVyaWFscy9zdXBwb3J0aW5nX21hdGVyaWFsX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE0NWJmNi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTQ2QUpsQXZ0NUJEWWZMOV9nLTJSN3ciIG5hbWU9InN1cHBvcnRpbmdfbWF0ZXJpYWxfQTEsX2FGcHZVQS1TRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii00NkFKbEF2dDVCRFlmTDlfZy0yUjd3IiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMxOjAxLjI4MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5TdXBwb3J0aW5nIE1hdGVyaWFsIEExIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMmI2MGMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii03dzUzakZPendwTkJnZUNEX0FfdllnIiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0EyLF9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBndWlkPSItN3c1M2pGT3p3cE5CZ2VDRF9BX3ZZZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMTowMy41MTYtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+U3VwcG9ydGluZyBNYXRlcmlhbCBBMiBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy90ZW1wbGF0ZXMvdGVtcGxhdGVfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy90ZW1wbGF0ZXMvdGVtcGxhdGVfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWM2ZjY5Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdGVtcGxhdGVzL3RlbXBsYXRlX0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWM5c2I5RGk0TVltUi1Sb29Ga1AzanciIG5hbWU9InRlbXBsYXRlX0ExLF9iRklQVUEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItYzlzYjlEaTRNWW1SLVJvb0ZrUDNqdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDo1Ni40ODQtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+VGVtcGxhdGUgQTEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3RlbXBsYXRlcy90ZW1wbGF0ZV9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3RlbXBsYXRlcy90ZW1wbGF0ZV9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMWZjYTMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy90ZW1wbGF0ZXMvdGVtcGxhdGVfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItaExTT1dyRzViaVNYLVBBa18zQmI5QSIgbmFtZT0idGVtcGxhdGVfQTIsX1pYcTlFQS1VRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1oTFNPV3JHNWJpU1gtUEFrXzNCYjlBIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMwOjU4Ljk1My0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5UZW1wbGF0ZSBBMiBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3Rlcm1kZWZpbml0aW9ucy90ZXJtX2RlZmluaXRpb25fQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjBiODNhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLU52Y3RTdW03bW1PNHFfMDhnTHBENUEiIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9BMSxfc2ZpSlVBLVZFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLU52Y3RTdW03bW1PNHFfMDhnTHBENUEiIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6MTIuMTQxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRlcm0gRGVmaW5pdGlvbiBBMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy90ZXJtZGVmaW5pdGlvbnMvdGVybV9kZWZpbml0aW9uX0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZjlkMDQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy90ZXJtZGVmaW5pdGlvbnMvdGVybV9kZWZpbml0aW9uX0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItOEJQUklnX1NiSFR3UUFpQVp5ODNQdyIgbmFtZT0idGVybV9kZWZpbml0aW9uX0EyLF9vOEk3RUEtVkVkcUwyTzFQSlY5Y1pBIiBndWlkPSItOEJQUklnX1NiSFR3UUFpQVp5ODNQdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMTo0Mi42NTYtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+VGVybSBEZWZpbml0aW9uIEEyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3Rvb2xtZW50b3JzL3Rvb2xtZW50b3JfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RhZGNkMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3Rvb2xtZW50b3JzL3Rvb2xtZW50b3JfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1wNHhrUW1QekVxYW5YbjFrU2JXWUFnIiBuYW1lPSJ0b29sbWVudG9yX0ExLF9oSEVqb0EtU0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItcDR4a1FtUHpFcWFuWG4xa1NiV1lBZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMTowNS44MjgtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+VG9vbG1lbnRvciBBMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdG9vbG1lbnRvcnMvdG9vbG1lbnRvcl9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NTBjODguLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItc3hWcS01YWFJZTN6dDVhRXVuOEZDZyIgbmFtZT0idG9vbG1lbnRvcl9BMixfdjdKS0FBLVVFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLXN4VnEtNWFhSWUzenQ1YUV1bjhGQ2ciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6MDguNTk0LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRvb2xtZW50b3IgQTIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvd2hpdGVwYXBlcnMvd2hpdGVwYXBlcl9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTM0NmFlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvd2hpdGVwYXBlcnMvd2hpdGVwYXBlcl9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii03UFpITEZTS1ZMc1lPQU5uMGdHcUl3IiBuYW1lPSJ3aGl0ZXBhcGVyX0ExLF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItN1BaSExGU0tWTHNZT0FObjBnR3FJdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMToxMy4zNTktMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+V2hpdGVwYXBlciBBMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvd2hpdGVwYXBlcnMvd2hpdGVwYXBlcl9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2RiYWUyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvd2hpdGVwYXBlcnMvd2hpdGVwYXBlcl9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii10R0RGaWg1VDFsdFZuTVplZjhBNzZ3IiBuYW1lPSJ3aGl0ZXBhcGVyX0EyLF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBndWlkPSItdEdERmloNVQxbHRWbk1aZWY4QTc2dyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMToxNS41NzgtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+V2hpdGVwYXBlciBBMiBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9wbHVnaW4ueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3BsdWdpbi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYjFmY2MuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3BsdWdpbi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfNmxLMkFBLVBFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iXzZsSzJBQS1QRWRxTDJPMVBKVjljWkEiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il9YVlk5TUJCTkVkcUJzN0toZFZMUkxBIiBocmVmPSJ1bWE6Ly9fVzZhNGNCQk5FZHFCczdLaGRWTFJMQSNfWFZZOU1CQk5FZHFCczdLaGRWTFJMQSIvPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il9jbldtRUJCTkVkcUJzN0toZFZMUkxBIiBocmVmPSJ1bWE6Ly9fYUhVU1FCQk5FZHFCczdLaGRWTFJMQSNfY25XbUVCQk5FZHFCczdLaGRWTFJMQSIvPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il91dW4wWUJNMUVkcXFuZGktZ0R1eHB3IiBocmVmPSJ1bWE6Ly9fdXE1SzhCTTFFZHFxbmRpLWdEdXhwdyNfdXVuMFlCTTFFZHFxbmRpLWdEdXhwdyIvPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il80eWMzc1R6Z0VkcTV5c0ZPTnIxQkdRIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfNHljM3NUemdFZHE1eXNGT05yMUJHUSIvPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il9kRjJPNEVBdkVkcUZxSXU4LWNrb2xnIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfZEYyTzRFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il9aekRYUVVERkVkcU85TTNmdWtZQV9BIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfWnpEWFFVREZFZHFPOU0zZnVrWUFfQSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzZsSzJBUS1QRWRxTDJPMVBKVjljWkEiIGlkPSItZzdtOThKbDhhUmJWNm5mT0dVcEduZyIgdXJpPSJyb2xlcy9yb2xlX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzdOX3drQS1QRWRxTDJPMVBKVjljWkEiIGlkPSItSHhrY1ZpSHU1N2JER3VsNDIxckJ2ZyIgdXJpPSJyb2xlcy9yb2xlX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzdPSTZnQS1QRWRxTDJPMVBKVjljWkEiIGlkPSItUzFpZ0xTaTZBSV92bHV6V09DdTZUdyIgdXJpPSJ0YXNrcy90YXNrX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzc3UzdjQS1QRWRxTDJPMVBKVjljWkEiIGlkPSItMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyIgdXJpPSJ0YXNrcy90YXNrX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0U4QVJnQS1SRWRxTDJPMVBKVjljWkEiIGlkPSItbjlUSlFhMEZKdkdfYXZEWGFBVGpJUSIgdXJpPSJ3b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQTEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRjdMUGdBLVJFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1KVFdLbjVkNENMYzRLRlFNRFRGcFNRIiB1cmk9Indvcmtwcm9kdWN0cy9hcnRpZmFjdF9BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9IRVYzQUEtUkVkcUwyTzFQSlY5Y1pBIiBpZD0iLTluMVdYNWQ3SUZoVko0cHpIVl92clEiIHVyaT0id29ya3Byb2R1Y3RzL3N1Yl9hcnRpZmFjdF9BMS4xLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0lJbUpVQS1SRWRxTDJPMVBKVjljWkEiIGlkPSItVUZSb2VBS0hkWFgyU1NCMUtVWHRZQSIgdXJpPSJ3b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQTIuMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9KQ0hMUUEtUkVkcUwyTzFQSlY5Y1pBIiBpZD0iLUFiWFJnNDRMOFR4eDRDa0IyaHg1TlEiIHVyaT0id29ya3Byb2R1Y3RzL2RlbGl2ZXJhYmxlX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0tCdmNRQS1SRWRxTDJPMVBKVjljWkEiIGlkPSItTWRxb2Etbnh3RUhmQUpjb0E2WE5LUSIgdXJpPSJ3b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfS3cwdjBBLVJFZHFMMk8xUEpWOWNaQSIgaWQ9Ii0zb2R5QnlJZXpSUlhnUWdlSHVNNlNBIiB1cmk9Indvcmtwcm9kdWN0cy9vdXRjb21lX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0ZiVTFVQS1TRWRxTDJPMVBKVjljWkEiIGlkPSItNEdiQVdHYjg3QWx6LUd6X0dfOXAxZyIgdXJpPSJ3b3JrcHJvZHVjdHMvb3V0Y29tZV9BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9ORGU1Z0EtU0VkcUwyTzFQSlY5Y1pBIiBpZD0iLW9XbzNVQ2lmWDRJY19WQklDV3dxUnciIHVyaT0iZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX09DTnlvQS1TRWRxTDJPMVBKVjljWkEiIGlkPSItNnk3YUJRdDNjQ1NCTG84c21NUmVtQSIgdXJpPSJndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9Pa1ZvUUEtU0VkcUwyTzFQSlY5Y1pBIiBpZD0iLUE5NDl3SGRURnFHM1dzNjMtcTlCMnciIHVyaT0iZ3VpZGFuY2VzL2V4YW1wbGVzL2V4YW1wbGVfQTEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUDgyNllBLVNFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1fMjFfRWlzUVNUSHd0bEpqb0o4YnZ3IiB1cmk9Imd1aWRhbmNlcy9ndWlkZWxpbmVzL2d1aWRlbGluZV9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9RNWdJMEEtU0VkcUwyTzFQSlY5Y1pBIiBpZD0iLVo3a2RJa0NwLW1IVWRiX0pvUXB6V1EiIHVyaT0iZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9UV1JHTUEtU0VkcUwyTzFQSlY5Y1pBIiBpZD0iLVhSZUJMZE40aUxidmFmZkJ3ZWJOQ3ciIHVyaT0iZ3VpZGFuY2VzL3JlcG9ydHMvcmVwb3J0X0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1psVUNZQS1TRWRxTDJPMVBKVjljWkEiIGlkPSItMWhIRU9MOHF5eFRNTVI3NzVVR2ZydyIgdXJpPSJndWlkYW5jZXMvcmV1c2FibGVhc3NldHMvcmV1c2FibGVfYXNzZXRfQTEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfYUdHYlFBLVNFZHFMMk8xUEpWOWNaQSIgaWQ9Ii14b0RaYXFyN0otd2YybEI3clNqU1p3IiB1cmk9Imd1aWRhbmNlcy9yb2FkbWFwcy9yb2FkbWFwX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2JGazdRQS1TRWRxTDJPMVBKVjljWkEiIGlkPSItNDZBSmxBdnQ1QkRZZkw5X2ctMlI3dyIgdXJpPSJndWlkYW5jZXMvc3VwcG9ydGluZ21hdGVyaWFscy9zdXBwb3J0aW5nX21hdGVyaWFsX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2hIaFBrQS1TRWRxTDJPMVBKVjljWkEiIGlkPSItYzlzYjlEaTRNWW1SLVJvb0ZrUDNqdyIgdXJpPSJndWlkYW5jZXMvdGVtcGxhdGVzL3RlbXBsYXRlX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2g4dHlNQS1TRWRxTDJPMVBKVjljWkEiIGlkPSItcDR4a1FtUHpFcWFuWG4xa1NiV1lBZyIgdXJpPSJndWlkYW5jZXMvdG9vbG1lbnRvcnMvdG9vbG1lbnRvcl9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9PV04zUUEtVEVkcUwyTzFQSlY5Y1pBIiBpZD0iLTdQWkhMRlNLVkxzWU9BTm4wZ0dxSXciIHVyaT0iZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQTEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfa3NJd1lBLVRFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1MUElheE9ITFhxOWlkR1Y0MWlVcjlnIiB1cmk9Imd1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3ViSnpZQS1URWRxTDJPMVBKVjljWkEiIGlkPSItSjlVcjlzbXBRdXZWR3B1RzlpX3drUSIgdXJpPSJndWlkYW5jZXMvY2hlY2tsaXN0cy9jaGVja2xpc3RfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNlk3TThBLVRFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1wbEQyTTFzaFNFLUxsYkR3NXlZcHJnIiB1cmk9Imd1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0dydE5NQS1VRWRxTDJPMVBKVjljWkEiIGlkPSItUGNadHRWLXNjLUVjVVF3Qi1aaEFJdyIgdXJpPSJndWlkYW5jZXMvZ3VpZGVsaW5lcy9ndWlkZWxpbmVfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUXd4WXNBLVVFZHFMMk8xUEpWOWNaQSIgaWQ9Ii01TG5kbWR4eGJHMU0xTWZwQVBLcEFRIiB1cmk9Imd1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9tUUpyWUEtVUVkcUwyTzFQSlY5Y1pBIiBpZD0iLWhMU09Xckc1YmlTWC1QQWtfM0JiOUEiIHVyaT0iZ3VpZGFuY2VzL3RlbXBsYXRlcy90ZW1wbGF0ZV9BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il90bVNMY0EtVUVkcUwyTzFQSlY5Y1pBIiBpZD0iLTd3NTNqRk96d3BOQmdlQ0RfQV92WWciIHVyaT0iZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il8zWVNSQUEtVUVkcUwyTzFQSlY5Y1pBIiBpZD0iLXN4VnEtNWFhSWUzenQ1YUV1bjhGQ2ciIHVyaT0iZ3VpZGFuY2VzL3Rvb2xtZW50b3JzL3Rvb2xtZW50b3JfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRXFfZE1BLVZFZHFMMk8xUEpWOWNaQSIgaWQ9Ii05eFA0ZDdiYTZvc3dHa1BlcFhXa193IiB1cmk9Imd1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQTEuMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9FclNZSUEtVkVkcUwyTzFQSlY5Y1pBIiBpZD0iLXRHREZpaDVUMWx0Vm5NWmVmOEE3NnciIHVyaT0iZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfU05DczhBLVZFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1OY1NNVGZoTWx0dFBVSzJGNndYZ0VnIiB1cmk9Imd1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfU05NZDhBLVZFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1SOXNRem9KalFtNC1OQnhVcWFMV0xnIiB1cmk9Imd1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQTIuMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9Zdks5TUEtVkVkcUwyTzFQSlY5Y1pBIiBpZD0iLTdnbEdZaUphczloWkdrSjljY1E1S1EiIHVyaT0iZ3VpZGFuY2VzL3JldXNhYmxlYXNzZXRzL3JldXNhYmxlX2Fzc2V0X0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX29ILTZRQS1WRWRxTDJPMVBKVjljWkEiIGlkPSItSjBzendyS2JpTDJKbS1GaWZRdEk5dyIgdXJpPSJndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9yeXJxWUEtVkVkcUwyTzFQSlY5Y1pBIiBpZD0iLThCUFJJZ19TYkhUd1FBaUFaeTgzUHciIHVyaT0iZ3VpZGFuY2VzL3Rlcm1kZWZpbml0aW9ucy90ZXJtX2RlZmluaXRpb25fQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfMmFVLWdBLVZFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1OdmN0U3VtN21tTzRxXzA4Z0xwRDVBIiB1cmk9Imd1aWRhbmNlcy90ZXJtZGVmaW5pdGlvbnMvdGVybV9kZWZpbml0aW9uX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0M1ZF93US1XRWRxTDJPMVBKVjljWkEiIGlkPSItbXVBa1hESmZvX0tiUkY0S09ibjlPUSIgdXJpPSJkaXNjaXBsaW5lZ3JvdXBpbmdzL2Rpc2NpcGxpbmVfZ3JvdXBpbmdfQTEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRDFZT1lBLVdFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1HYUdsNWtISjR4S0NfU2hnNloxNlpnIiB1cmk9ImRpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRVpKQ3dBLVdFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1RMGxpYTV5RXlOWFdkLUtOSjZjR3JBIiB1cmk9ImRpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRnFwRzRBLVdFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1PMTNVdUpiOEdxQkxWdFdhVXFncVJ3IiB1cmk9ImRvbWFpbnMvZG9tYWluX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0dPdGRRQS1XRWRxTDJPMVBKVjljWkEiIGlkPSItM2hZSnlyM1RxaU1nNlFkeTlBWEl4dyIgdXJpPSJkb21haW5zL2RvbWFpbl9BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9HNUJsa0EtV0VkcUwyTzFQSlY5Y1pBIiBpZD0iLUtENzJFbzVsTU1QcDdiUzhvUEJ2UHciIHVyaT0iZG9tYWlucy9zdWJfZG9tYWluX0ExLjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSUdOeGNBLVdFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1UZlJEb0hpc21zaGo4Y0wybE9SdGNnIiB1cmk9Indvcmtwcm9kdWN0dHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQTEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSlk2dmNBLVdFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1jbGZEQTBQTTZ4TElqeWhTcDFpTFFRIiB1cmk9Indvcmtwcm9kdWN0dHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfS0d6d01BLVdFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1GVjk5SzBWTTdmNGNsQVVrWWJvRk9RIiB1cmk9InJvbGVzZXRncm91cGluZ3Mvcm9sZV9zZXRfZ3JvdXBpbmdfQTEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTGgyeDRBLVdFZHFMMk8xUEpWOWNaQSIgaWQ9Ii15MDR3UEUxMC1TQjhpRm51NWNYYU1BIiB1cmk9InRvb2xzL3Rvb2xfQTEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTUtZeGdBLVdFZHFMMk8xUEpWOWNaQSIgaWQ9Ii16ekJQLTU0R3VRV2ZWVHo2MFNkUXN3IiB1cmk9InRvb2xzL3Rvb2xfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfT1NsMElBLVdFZHFMMk8xUEpWOWNaQSIgaWQ9Ii01UlRLMUdPZkJtMmNjT2puMWluZnN3IiB1cmk9ImN1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1RRdWlFQS1XRWRxTDJPMVBKVjljWkEiIGlkPSItVnBoejY1WjFCOS1ySU1KS2pYN2gwQSIgdXJpPSJjdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il85UDh3UUJCS0VkcUJzN0toZFZMUkxBIiBpZD0iLWpxU3JiRlpZOUdiNGpwRGlZU1pjRlEiIHVyaT0iY3VzdG9tY2F0ZWdvcmllcy9zdWJfY3VzdG9tX2NhdGVnb3J5X0ExLjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfLXU0TVlCQktFZHFCczdLaGRWTFJMQSIgaWQ9Ii1XR2E5TlFKLWJNNVVaMEp1WV9BRVB3IiB1cmk9InJvbGVzZXRzL3JvbGVfc2V0X0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX19YYU1BQkJLRWRxQnM3S2hkVkxSTEEiIGlkPSItTFJHbGVISXBOczVNYjlRQU9HZlpRdyIgdXJpPSJyb2xlc2V0cy9yb2xlX3NldF9BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9XNjNrWUJCTkVkcUJzN0toZFZMUkxBIiBpZD0iX1c2YTRjQkJORWRxQnM3S2hkVkxSTEEiIHVyaT0iZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19BMS9tb2RlbC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9hSWYtQUJCTkVkcUJzN0toZFZMUkxBIiBpZD0iX2FIVVNRQkJORWRxQnM3S2hkVkxSTEEiIHVyaT0iY2FwYWJpbGl0eXBhdHRlcm5zL0NQJTIwZXh0ZW5kaW5nJTIwJ0NQMSUyMHdpdGglMjBhbGwlMjBlbGVtZW50cycvbW9kZWwueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfdXNpSnNCTTFFZHFxbmRpLWdEdXhwdyIgaWQ9Il91cTVLOEJNMUVkcXFuZGktZ0R1eHB3IiB1cmk9ImRlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NQYWtfQTEuMS9tb2RlbC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il80dEZQZ0R6Z0VkcTV5c0ZPTnIxQkdRIiBpZD0iXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EiIHVyaT0iY2FwYWJpbGl0eXBhdHRlcm5zL0NQMSUyMHdpdGglMjBhbGwlMjBlbGVtZW50cy9tb2RlbC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9kRHdrTUVBdkVkcUZxSXU4LWNrb2xnIiBpZD0iX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGciIHVyaT0iY2FwYWJpbGl0eXBhdHRlcm5zL0NQJTIwQTEvbW9kZWwueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfWnViOUFFREZFZHFPOU0zZnVrWUFfQSIgaWQ9Il9adFpiTUVERkVkcU85TTNmdWtZQV9BIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9DUDIlMjBjb250YWluaW5nJTIwdmFyaWFiaWxpdHklMjBlbGVtZW50cy9tb2RlbC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il93V0ZmVUVERkVkcU85TTNmdWtZQV9BIiBpZD0iLWJSOVRYMWJaNlc5Ulk1SXZJUEdVamciIHVyaT0idGFza3MvdGFza19BMy54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9fQ011Y0VERkVkcU85TTNmdWtZQV9BIiBpZD0iLVl1bWRzVU9IRlZoR2tld3dJQ05kZ3ciIHVyaT0icm9sZXMvcm9sZV9BMy54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiB4bWk6aWQ9Il95VWVMSUEtUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJQbHVnIEEiIGd1aWQ9Il95VWVMSUEtUEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJQbHVnIEEgYnJpZWYiIGF1dGhvcnM9IlBsdWcgQSBBcnRodXIiPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfeVVlTElRLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iQ29udGVudCIgZ3VpZD0iX3lVZUxJUS1QRWRxTDJPMVBKVjljWkEiPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3lVZUxJZy1QRWRxTDJPMVBKVjljWkEiIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il95VWVMSWctUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3lVZUxJdy1QRWRxTDJPMVBKVjljWkEiIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il95VWVMSXctUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRvbWFpbiIgeG1pOmlkPSJfRkV6TzRBLVdFZHFMMk8xUEpWOWNaQSIgbmFtZT0iZG9tYWluX0ExIiBndWlkPSJfRkV6TzRBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iRG9tYWluIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEb21haW4gQTEgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX2FGcHZVQS1TRWRxTDJPMVBKVjljWkEiIGNvbmNlcHRzQW5kUGFwZXJzPSJfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSBfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSIgY2hlY2tsaXN0cz0iX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGd1aWRlbGluZXM9Il9Pa0N0VUEtU0VkcUwyTzFQSlY5Y1pBIiBleGFtcGxlcz0iX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiIGFzc2V0cz0iX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIHdvcmtQcm9kdWN0cz0iX0lJU25VQS1SRWRxTDJPMVBKVjljWkEgX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1PMTNVdUpiOEdxQkxWdFdhVXFncVJ3IiBocmVmPSJ1bWE6Ly8tTzEzVXVKYjhHcUJMVnRXYVVxZ3FSdyMtTzEzVXVKYjhHcUJMVnRXYVVxZ3FSdyIvPgotICAgICAgICAgICAgPHN1YmRvbWFpbnMgeG1pOmlkPSJfR09aN1FBLVdFZHFMMk8xUEpWOWNaQSIgbmFtZT0ic3ViX2RvbWFpbl9BMS4xIiBndWlkPSJfR09aN1FBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViLURvbWFpbiBBMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJTdWItRG9tYWluIEExLjEgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX2FGcHZVQS1TRWRxTDJPMVBKVjljWkEiIGNvbmNlcHRzQW5kUGFwZXJzPSJfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSBfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSIgY2hlY2tsaXN0cz0iX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGd1aWRlbGluZXM9Il9Pa0N0VUEtU0VkcUwyTzFQSlY5Y1pBIiBleGFtcGxlcz0iX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiIGFzc2V0cz0iX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIHdvcmtQcm9kdWN0cz0iX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUtENzJFbzVsTU1QcDdiUzhvUEJ2UHciIGhyZWY9InVtYTovLy1LRDcyRW81bE1NUHA3YlM4b1BCdlB3Iy1LRDcyRW81bE1NUHA3YlM4b1BCdlB3Ii8+Ci0gICAgICAgICAgICA8L3N1YmRvbWFpbnM+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEb21haW4iIHhtaTppZD0iX0ZxV0w4QS1XRWRxTDJPMVBKVjljWkEiIG5hbWU9ImRvbWFpbl9BMiIgZ3VpZD0iX0ZxV0w4QS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkRvbWFpbiBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRG9tYWluIEEyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX09WTFZjQS1URWRxTDJPMVBKVjljWkEgXzNYcjBFQS1VRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIiB3b3JrUHJvZHVjdHM9Il85S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIF9IRU10RUEtUkVkcUwyTzFQSlY5Y1pBIF9FN1owa0EtUkVkcUwyTzFQSlY5Y1pBIF9KQnFmVUEtUkVkcUwyTzFQSlY5Y1pBIF9Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItM2hZSnlyM1RxaU1nNlFkeTlBWEl4dyIgaHJlZj0idW1hOi8vLTNoWUp5cjNUcWlNZzZRZHk5QVhJeHcjLTNoWUp5cjNUcWlNZzZRZHk5QVhJeHciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfeVVlTEpBLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il95VWVMSkEtUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRpc2NpcGxpbmVHcm91cGluZyIgeG1pOmlkPSJfQ0NWamNBLVdFZHFMMk8xUEpWOWNaQSIgbmFtZT0iZGlzY2lwbGluZV9ncm91cGluZ19BMSIgZ3VpZD0iX0NDVmpjQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgR3JvdXBpbmcgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRpc2NpcGxpbmUgR3JvdXBpbmcgQTEgcHJlc2VudCIgZGlzY2lwbGluZXM9Il9DNWRfd0EtV0VkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItbXVBa1hESmZvX0tiUkY0S09ibjlPUSIgaHJlZj0idW1hOi8vLW11QWtYREpmb19LYlJGNEtPYm45T1EjLW11QWtYREpmb19LYlJGNEtPYm45T1EiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRpc2NpcGxpbmUiIHhtaTppZD0iX0M1ZF93QS1XRWRxTDJPMVBKVjljWkEiIG5hbWU9ImRpc2NpcGxpbmVfQTEiIGd1aWQ9Il9DNWRfd0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEExIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX05ETC1rQS1TRWRxTDJPMVBKVjljWkEgX2g4UkdRQS1TRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9LVjRxMEEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9UVjBhUUEtU0VkcUwyTzFQSlY5Y1pBIiB0YXNrcz0iXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1HYUdsNWtISjR4S0NfU2hnNloxNlpnIiBocmVmPSJ1bWE6Ly8tR2FHbDVrSEo0eEtDX1NoZzZaMTZaZyMtR2FHbDVrSEo0eEtDX1NoZzZaMTZaZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGlzY2lwbGluZSIgeG1pOmlkPSJfRHp2UG9BLVdFZHFMMk8xUEpWOWNaQSIgbmFtZT0iZGlzY2lwbGluZV9BMiIgZ3VpZD0iX0R6dlBvQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRpc2NpcGxpbmUgQTIgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX21Qc19jQS1VRWRxTDJPMVBKVjljWkEiIGNvbmNlcHRzQW5kUGFwZXJzPSJfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSBfM1hyMEVBLVVFZHFMMk8xUEpWOWNaQSIgY2hlY2tsaXN0cz0iX2tyaVRjQS1URWRxTDJPMVBKVjljWkEiIGd1aWRlbGluZXM9Il82WVV3QUEtVEVkcUwyTzFQSlY5Y1pBIiBleGFtcGxlcz0iX3VhaldjQS1URWRxTDJPMVBKVjljWkEiIGFzc2V0cz0iX1NNYzNFQS1WRWRxTDJPMVBKVjljWkEiIHRhc2tzPSJfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVEwbGlhNXlFeU5YV2QtS05KNmNHckEiIGhyZWY9InVtYTovLy1RMGxpYTV5RXlOWFdkLUtOSjZjR3JBIy1RMGxpYTV5RXlOWFdkLUtOSjZjR3JBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3lVZUxKUS1QRWRxTDJPMVBKVjljWkEiIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfeVVlTEpRLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlU2V0R3JvdXBpbmciIHhtaTppZD0iX0pZbjBnQS1XRWRxTDJPMVBKVjljWkEiIG5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0ExIiBndWlkPSJfSlluMGdBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBTZXQgR3JvdXBpbmcgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgU2V0IEdyb3VwaW5nIEExIHByZXNlbnQiIHJvbGVTZXRzPSJfOVBwMVVCQktFZHFCczdLaGRWTFJMQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUZWOTlLMFZNN2Y0Y2xBVWtZYm9GT1EiIGhyZWY9InVtYTovLy1GVjk5SzBWTTdmNGNsQVVrWWJvRk9RIy1GVjk5SzBWTTdmNGNsQVVrWWJvRk9RIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlU2V0IiB4bWk6aWQ9Il85UHAxVUJCS0VkcUJzN0toZFZMUkxBIiBuYW1lPSJyb2xlX3NldF9BMSIgZ3VpZD0iXzlQcDFVQkJLRWRxQnM3S2hkVkxSTEEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgU2V0IEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIFNldCBBMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9OREwta0EtU0VkcUwyTzFQSlY5Y1pBIF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSIgcm9sZXM9Il81NXprMEEtUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItV0dhOU5RSi1iTTVVWjBKdVlfQUVQdyIgaHJlZj0idW1hOi8vLVdHYTlOUUotYk01VVowSnVZX0FFUHcjLVdHYTlOUUotYk01VVowSnVZX0FFUHciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVTZXQiIHhtaTppZD0iXy11YmdjQkJLRWRxQnM3S2hkVkxSTEEiIG5hbWU9InJvbGVfc2V0X0EyIiBndWlkPSJfLXViZ2NCQktFZHFCczdLaGRWTFJMQSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBTZXQgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgU2V0IEEyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX09WTFZjQS1URWRxTDJPMVBKVjljWkEgXzNYcjBFQS1VRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIiByb2xlcz0iXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1MUkdsZUhJcE5zNU1iOVFBT0dmWlF3IiBocmVmPSJ1bWE6Ly8tTFJHbGVISXBOczVNYjlRQU9HZlpRdyMtTFJHbGVISXBOczVNYjlRQU9HZlpRdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il95VWVMSmctUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJXUCBUeXBlcyIgZ3VpZD0iX3lVZUxKZy1QRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3RUeXBlIiB4bWk6aWQ9Il9IZ2hEWUEtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9BMSIgZ3VpZD0iX0hnaERZQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IldvcmsgUHJvZHVjdCBUeXBlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJXb3JrIFByb2R1Y3QgVHlwZSBBMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9OREwta0EtU0VkcUwyTzFQSlY5Y1pBIF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSIgd29ya1Byb2R1Y3RzPSJfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSBfRjUxeXdBLVJFZHFMMk8xUEpWOWNaQSBfSUlTblVBLVJFZHFMMk8xUEpWOWNaQSBfS0FfMVlBLVJFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVRmUkRvSGlzbXNoajhjTDJsT1J0Y2ciIGhyZWY9InVtYTovLy1UZlJEb0hpc21zaGo4Y0wybE9SdGNnIy1UZlJEb0hpc21zaGo4Y0wybE9SdGNnIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdFR5cGUiIHhtaTppZD0iX0lGblVnQS1XRWRxTDJPMVBKVjljWkEiIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0EyIiBndWlkPSJfSUZuVWdBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iV29yayBQcm9kdWN0IFR5cGUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IldvcmsgUHJvZHVjdCBUeXBlIEEyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX09WTFZjQS1URWRxTDJPMVBKVjljWkEgXzNYcjBFQS1VRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIiB3b3JrUHJvZHVjdHM9Il9FN1owa0EtUkVkcUwyTzFQSlY5Y1pBIF9IRU10RUEtUkVkcUwyTzFQSlY5Y1pBIF9KQnFmVUEtUkVkcUwyTzFQSlY5Y1pBIF9Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItY2xmREEwUE02eExJanloU3AxaUxRUSIgaHJlZj0idW1hOi8vLWNsZkRBMFBNNnhMSWp5aFNwMWlMUVEjLWNsZkRBMFBNNnhMSWp5aFNwMWlMUVEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfeVVlTEp3LVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iVG9vbHMiIGd1aWQ9Il95VWVMSnctUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRvb2wiIHhtaTppZD0iX0t4YmFnQS1XRWRxTDJPMVBKVjljWkEiIG5hbWU9InRvb2xfQTEiIGd1aWQ9Il9LeGJhZ0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJUb29sIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUb29sIEExIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX05ETC1rQS1TRWRxTDJPMVBKVjljWkEgX2g4UkdRQS1TRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9LVjRxMEEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9UVjBhUUEtU0VkcUwyTzFQSlY5Y1pBIiB0b29sTWVudG9ycz0iX2hIRWpvQS1TRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii15MDR3UEUxMC1TQjhpRm51NWNYYU1BIiBocmVmPSJ1bWE6Ly8teTA0d1BFMTAtU0I4aUZudTVjWGFNQSMteTA0d1BFMTAtU0I4aUZudTVjWGFNQSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VG9vbCIgeG1pOmlkPSJfTGhhRjhBLVdFZHFMMk8xUEpWOWNaQSIgbmFtZT0idG9vbF9BMiIgZ3VpZD0iX0xoYUY4QS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlRvb2wgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2wgQTIgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX21Qc19jQS1VRWRxTDJPMVBKVjljWkEiIGNvbmNlcHRzQW5kUGFwZXJzPSJfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSBfM1hyMEVBLVVFZHFMMk8xUEpWOWNaQSIgY2hlY2tsaXN0cz0iX2tyaVRjQS1URWRxTDJPMVBKVjljWkEiIGd1aWRlbGluZXM9Il82WVV3QUEtVEVkcUwyTzFQSlY5Y1pBIiBleGFtcGxlcz0iX3VhaldjQS1URWRxTDJPMVBKVjljWkEiIGFzc2V0cz0iX1NNYzNFQS1WRWRxTDJPMVBKVjljWkEiIHRvb2xNZW50b3JzPSJfdjdKS0FBLVVFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXp6QlAtNTRHdVFXZlZUejYwU2RRc3ciIGhyZWY9InVtYTovLy16ekJQLTU0R3VRV2ZWVHo2MFNkUXN3Iy16ekJQLTU0R3VRV2ZWVHo2MFNkUXN3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3lVZUxLQS1QRWRxTDJPMVBKVjljWkEiIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iX3lVZUxLQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3lVZUxLUS1QRWRxTDJPMVBKVjljWkEiIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il95VWVMS1EtUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfeVVlTEtnLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iSGlkZGVuIiBndWlkPSJfeVVlTEtnLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il95VWVMS3ctUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iX3lVZUxLdy1QRWRxTDJPMVBKVjljWkEiIGNhdGVnb3JpemVkRWxlbWVudHM9Il9NS1Bua0EtV0VkcUwyTzFQSlY5Y1pBIF9PU1NTSUEtV0VkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIHhtaTppZD0iX01LUG5rQS1XRWRxTDJPMVBKVjljWkEiIG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9BMSIgZ3VpZD0iX01LUG5rQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkN1c3RvbSBDYXRlZ29yeSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQ3VzdG9tIENhdGVnb3J5IEExIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii01UlRLMUdPZkJtMmNjT2puMWluZnN3IiBocmVmPSJ1bWE6Ly8tNVJUSzFHT2ZCbTJjY09qbjFpbmZzdyMtNVJUSzFHT2ZCbTJjY09qbjFpbmZzdyIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIGhyZWY9IiNfN2RYWVVCQktFZHFCczdLaGRWTFJMQSIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZSIgaHJlZj0iI181NXprMEEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrIiBocmVmPSIjXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSIjXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSIjX0lJU25VQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9IiNfS0FfMVlBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI180c0N0c1R6Z0VkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2RCaHZrVUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiBocmVmPSJ1bWE6Ly9fYUhVU1FCQk5FZHFCczdLaGRWTFJMQSNfYUhVU1FSQk5FZHFCczdLaGRWTFJMQSIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcnlQcm9jZXNzIiBocmVmPSJ1bWE6Ly9fdXE1SzhCTTFFZHFxbmRpLWdEdXhwdyNfdXE1SzhSTTFFZHFxbmRpLWdEdXhwdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIHhtaTppZD0iX09TU1NJQS1XRWRxTDJPMVBKVjljWkEiIG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9BMiIgZ3VpZD0iX09TU1NJQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkN1c3RvbSBDYXRlZ29yeSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQ3VzdG9tIENhdGVnb3J5IEEyIHByZXNlbnQiIGNhdGVnb3JpemVkRWxlbWVudHM9Il82azNVQUEtUEVkcUwyTzFQSlY5Y1pBIF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBIF9FN1owa0EtUkVkcUwyTzFQSlY5Y1pBIF9IRU10RUEtUkVkcUwyTzFQSlY5Y1pBIF9KQnFmVUEtUkVkcUwyTzFQSlY5Y1pBIF9Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItVnBoejY1WjFCOS1ySU1KS2pYN2gwQSIgaHJlZj0idW1hOi8vLVZwaHo2NVoxQjktcklNSktqWDdoMEEjLVZwaHo2NVoxQjktcklNSktqWDdoMEEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il83ZFhZVUJCS0VkcUJzN0toZFZMUkxBIiBuYW1lPSJzdWJfY3VzdG9tX2NhdGVnb3J5X0ExLjEiIGd1aWQ9Il83ZFhZVUJCS0VkcUJzN0toZFZMUkxBIiBicmllZkRlc2NyaXB0aW9uPSJTdWItQ3VzdG9tIENhdGVnb3J5IEExLjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yi1DdXN0b20gQ2F0ZWdvcnkgQTEuMSBwcmVzZW50IiBjYXRlZ29yaXplZEVsZW1lbnRzPSJfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSBfRjUxeXdBLVJFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWpxU3JiRlpZOUdiNGpwRGlZU1pjRlEiIGhyZWY9InVtYTovLy1qcVNyYkZaWTlHYjRqcERpWVNaY0ZRIy1qcVNyYkZaWTlHYjRqcERpWVNaY0ZRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il95VWVMTEEtUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iX3lVZUxMQS1QRWRxTDJPMVBKVjljWkEiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfemlfendBLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iY29udGVudF9wYWNrYWdlX0ExIiBndWlkPSJfemlfendBLVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uUGFrIEExIGJyaWVmIj4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGUiIHhtaTppZD0iXzU1emswQS1QRWRxTDJPMVBKVjljWkEiIG5hbWU9InJvbGVfQTEiIGd1aWQ9Il81NXprMEEtUEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEExIiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9OREwta0EtU0VkcUwyTzFQSlY5Y1pBIF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSIgcmVzcG9uc2libGVGb3I9Il85S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIF9JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIF9LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItZzdtOThKbDhhUmJWNm5mT0dVcEduZyIgaHJlZj0idW1hOi8vLWc3bTk4Smw4YVJiVjZuZk9HVXBHbmcjLWc3bTk4Smw4YVJiVjZuZk9HVXBHbmciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGUiIHhtaTppZD0iXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiIG5hbWU9InJvbGVfQTIiIGd1aWQ9Il82azNVQUEtUEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEEyIGV4dGVuZGVkIGJ5IFJvbGUgQTMiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX09WTFZjQS1URWRxTDJPMVBKVjljWkEgXzNYcjBFQS1VRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIiByZXNwb25zaWJsZUZvcj0iX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEgX0pCcWZVQS1SRWRxTDJPMVBKVjljWkEgX0t2THhFQS1SRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1IeGtjVmlIdTU3YkRHdWw0MjFyQnZnIiBocmVmPSJ1bWE6Ly8tSHhrY1ZpSHU1N2JER3VsNDIxckJ2ZyMtSHhrY1ZpSHU1N2JER3VsNDIxckJ2ZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFzayIgeG1pOmlkPSJfN004bnNBLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0idGFza19BMSIgZ3VpZD0iXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTEgIiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9OREwta0EtU0VkcUwyTzFQSlY5Y1pBIF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSIgcGVyZm9ybWVkQnk9Il81NXprMEEtUEVkcUwyTzFQSlY5Y1pBIiBtYW5kYXRvcnlJbnB1dD0iX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEgXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiIG91dHB1dD0iX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiIGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PSJfNmszVUFBLVBFZHFMMk8xUEpWOWNaQSIgb3B0aW9uYWxJbnB1dD0iX0lJU25VQS1SRWRxTDJPMVBKVjljWkEiIHRvb2xNZW50b3JzPSJfaEhFam9BLVNFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVMxaWdMU2k2QUlfdmx1eldPQ3U2VHciIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3Iy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrIiB4bWk6aWQ9Il83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJ0YXNrX0EyIiBndWlkPSJfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMiAoIGV4dGVuZGVkIGJ5IFRhc2sgQTMgKSIgc3VwcG9ydGluZ01hdGVyaWFscz0iX21Qc19jQS1VRWRxTDJPMVBKVjljWkEiIGNvbmNlcHRzQW5kUGFwZXJzPSJfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSBfM1hyMEVBLVVFZHFMMk8xUEpWOWNaQSIgY2hlY2tsaXN0cz0iX2tyaVRjQS1URWRxTDJPMVBKVjljWkEiIGd1aWRlbGluZXM9Il82WVV3QUEtVEVkcUwyTzFQSlY5Y1pBIiBleGFtcGxlcz0iX3VhaldjQS1URWRxTDJPMVBKVjljWkEiIGFzc2V0cz0iX1NNYzNFQS1WRWRxTDJPMVBKVjljWkEiIHBlcmZvcm1lZEJ5PSJfNmszVUFBLVBFZHFMMk8xUEpWOWNaQSIgbWFuZGF0b3J5SW5wdXQ9Il9FN1owa0EtUkVkcUwyTzFQSlY5Y1pBIiBvdXRwdXQ9Il9Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iXzU1emswQS1QRWRxTDJPMVBKVjljWkEiIG9wdGlvbmFsSW5wdXQ9Il9KQnFmVUEtUkVkcUwyTzFQSlY5Y1pBIiB0b29sTWVudG9ycz0iX3Y3SktBQS1VRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3IiBocmVmPSJ1bWE6Ly8tMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyMtMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIHhtaTppZD0iXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiIG5hbWU9ImFydGlmYWN0X0ExIiBndWlkPSJfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX05ETC1rQS1TRWRxTDJPMVBKVjljWkEgX2g4UkdRQS1TRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9LVjRxMEEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9UVjBhUUEtU0VkcUwyTzFQSlY5Y1pBIiByZXBvcnRzPSJfUTVEYzRBLVNFZHFMMk8xUEpWOWNaQSIgdGVtcGxhdGVzPSJfYkZJUFVBLVNFZHFMMk8xUEpWOWNaQSIgdG9vbE1lbnRvcnM9Il9oSEVqb0EtU0VkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItbjlUSlFhMEZKdkdfYXZEWGFBVGpJUSIgaHJlZj0idW1hOi8vLW45VEpRYTBGSnZHX2F2RFhhQVRqSVEjLW45VEpRYTBGSnZHX2F2RFhhQVRqSVEiLz4KLSAgICAgICAgICAgIDxjb250YWluZWRBcnRpZmFjdHMgeG1pOmlkPSJfRjUxeXdBLVJFZHFMMk8xUEpWOWNaQSIgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGd1aWQ9Il9GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX2FGcHZVQS1TRWRxTDJPMVBKVjljWkEiIGNvbmNlcHRzQW5kUGFwZXJzPSJfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSBfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSIgY2hlY2tsaXN0cz0iX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGd1aWRlbGluZXM9Il9Pa0N0VUEtU0VkcUwyTzFQSlY5Y1pBIiBleGFtcGxlcz0iX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiIGFzc2V0cz0iX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIHJlcG9ydHM9Il9RNURjNEEtU0VkcUwyTzFQSlY5Y1pBIiB0ZW1wbGF0ZXM9Il9iRklQVUEtU0VkcUwyTzFQSlY5Y1pBIiB0b29sTWVudG9ycz0iX2hIRWpvQS1TRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTluMVdYNWQ3SUZoVko0cHpIVl92clEiIGhyZWY9InVtYTovLy05bjFXWDVkN0lGaFZKNHB6SFZfdnJRIy05bjFXWDVkN0lGaFZKNHB6SFZfdnJRIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZEFydGlmYWN0cz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiB4bWk6aWQ9Il9FN1owa0EtUkVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJhcnRpZmFjdF9BMiIgZ3VpZD0iX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iXzZZVXdBQS1URWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgcmVwb3J0cz0iX0dyR3dRQS1VRWRxTDJPMVBKVjljWkEiIHRlbXBsYXRlcz0iX1pYcTlFQS1VRWRxTDJPMVBKVjljWkEiIHRvb2xNZW50b3JzPSJfdjdKS0FBLVVFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUpUV0tuNWQ0Q0xjNEtGUU1EVEZwU1EiIGhyZWY9InVtYTovLy1KVFdLbjVkNENMYzRLRlFNRFRGcFNRIy1KVFdLbjVkNENMYzRLRlFNRFRGcFNRIi8+Ci0gICAgICAgICAgICA8Y29udGFpbmVkQXJ0aWZhY3RzIHhtaTppZD0iX0hFTXRFQS1SRWRxTDJPMVBKVjljWkEiIG5hbWU9ImFydGlmYWN0X0EyLjEiIGd1aWQ9Il9IRU10RUEtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMi4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMi4xIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX09WTFZjQS1URWRxTDJPMVBKVjljWkEgXzNYcjBFQS1VRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIiByZXBvcnRzPSJfR3JHd1FBLVVFZHFMMk8xUEpWOWNaQSIgdGVtcGxhdGVzPSJfWlhxOUVBLVVFZHFMMk8xUEpWOWNaQSIgdG9vbE1lbnRvcnM9Il92N0pLQUEtVUVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1VRlJvZUFLSGRYWDJTU0IxS1VYdFlBIiBocmVmPSJ1bWE6Ly8tVUZSb2VBS0hkWFgyU1NCMUtVWHRZQSMtVUZSb2VBS0hkWFgyU1NCMUtVWHRZQSIvPgotICAgICAgICAgICAgPC9jb250YWluZWRBcnRpZmFjdHM+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZSIgeG1pOmlkPSJfSUlTblVBLVJFZHFMMk8xUEpWOWNaQSIgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGd1aWQ9Il9JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTEgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX2FGcHZVQS1TRWRxTDJPMVBKVjljWkEiIGNvbmNlcHRzQW5kUGFwZXJzPSJfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSBfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSIgY2hlY2tsaXN0cz0iX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGd1aWRlbGluZXM9Il9Pa0N0VUEtU0VkcUwyTzFQSlY5Y1pBIiBleGFtcGxlcz0iX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiIGFzc2V0cz0iX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIHJlcG9ydHM9Il9RNURjNEEtU0VkcUwyTzFQSlY5Y1pBIiB0ZW1wbGF0ZXM9Il9iRklQVUEtU0VkcUwyTzFQSlY5Y1pBIiB0b29sTWVudG9ycz0iX2hIRWpvQS1TRWRxTDJPMVBKVjljWkEiIGRlbGl2ZXJlZFdvcmtQcm9kdWN0cz0iXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEgX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEgX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1BYlhSZzQ0TDhUeHg0Q2tCMmh4NU5RIiBocmVmPSJ1bWE6Ly8tQWJYUmc0NEw4VHh4NENrQjJoeDVOUSMtQWJYUmc0NEw4VHh4NENrQjJoeDVOUSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIHhtaTppZD0iX0pCcWZVQS1SRWRxTDJPMVBKVjljWkEiIG5hbWU9ImRlbGl2ZXJhYmxlX0EyIiBndWlkPSJfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX09WTFZjQS1URWRxTDJPMVBKVjljWkEgXzNYcjBFQS1VRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIiByZXBvcnRzPSJfR3JHd1FBLVVFZHFMMk8xUEpWOWNaQSIgdGVtcGxhdGVzPSJfWlhxOUVBLVVFZHFMMk8xUEpWOWNaQSIgdG9vbE1lbnRvcnM9Il92N0pLQUEtVUVkcUwyTzFQSlY5Y1pBIiBkZWxpdmVyZWRXb3JrUHJvZHVjdHM9Il9FN1owa0EtUkVkcUwyTzFQSlY5Y1pBIF9Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItTWRxb2Etbnh3RUhmQUpjb0E2WE5LUSIgaHJlZj0idW1hOi8vLU1kcW9hLW54d0VIZkFKY29BNlhOS1EjLU1kcW9hLW54d0VIZkFKY29BNlhOS1EiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIHhtaTppZD0iX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiIG5hbWU9Im91dGNvbWVfQTEiIGd1aWQ9Il9LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX05ETC1rQS1TRWRxTDJPMVBKVjljWkEgX2g4UkdRQS1TRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9LVjRxMEEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9UVjBhUUEtU0VkcUwyTzFQSlY5Y1pBIiByZXBvcnRzPSJfUTVEYzRBLVNFZHFMMk8xUEpWOWNaQSIgdGVtcGxhdGVzPSJfYkZJUFVBLVNFZHFMMk8xUEpWOWNaQSIgdG9vbE1lbnRvcnM9Il9oSEVqb0EtU0VkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItM29keUJ5SWV6UlJYZ1FnZUh1TTZTQSIgaHJlZj0idW1hOi8vLTNvZHlCeUllelJSWGdRZ2VIdU02U0EjLTNvZHlCeUllelJSWGdRZ2VIdU02U0EiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIHhtaTppZD0iX0t2THhFQS1SRWRxTDJPMVBKVjljWkEiIG5hbWU9Im91dGNvbWVfQTIiIGd1aWQ9Il9Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX09WTFZjQS1URWRxTDJPMVBKVjljWkEgXzNYcjBFQS1VRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIiByZXBvcnRzPSJfR3JHd1FBLVVFZHFMMk8xUEpWOWNaQSIgdGVtcGxhdGVzPSJfWlhxOUVBLVVFZHFMMk8xUEpWOWNaQSIgdG9vbE1lbnRvcnM9Il92N0pLQUEtVUVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItNEdiQVdHYjg3QWx6LUd6X0dfOXAxZyIgaHJlZj0idW1hOi8vLTRHYkFXR2I4N0Fsei1Hel9HXzlwMWcjLTRHYkFXR2I4N0Fsei1Hel9HXzlwMWciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNoZWNrbGlzdCIgeG1pOmlkPSJfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIgbmFtZT0iY2hlY2tsaXN0X0ExIiBndWlkPSJfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iQ2hlY2tsaXN0IEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJDaGVja2xpc3QgQTEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLW9XbzNVQ2lmWDRJY19WQklDV3dxUnciIGhyZWY9InVtYTovLy1vV28zVUNpZlg0SWNfVkJJQ1d3cVJ3Iy1vV28zVUNpZlg0SWNfVkJJQ1d3cVJ3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb25jZXB0IiB4bWk6aWQ9Il9OREwta0EtU0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJjb25jZXB0X0ExIiBndWlkPSJfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uY2VwdCBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQ29uY2VwdCBBMSBwcmVzZW50IiBzaGFwZWljb249ImZpbGU6L0M6L0RvY3VtZW50cyUyMGFuZCUyMFNldHRpbmdzL3RyYW4tbHV1L0lCTS9NZXRob2RMaWJyYXJpZXMvcGFyaXMvUGx1ZyUyMEEvZ3VpZGFuY2VzL2NvbmNlcHRzL3Jlc291cmNlcy90eXJhbm5vc2F1cnVzLmdpZiI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTZ5N2FCUXQzY0NTQkxvOHNtTVJlbUEiIGhyZWY9InVtYTovLy02eTdhQlF0M2NDU0JMbzhzbU1SZW1BIy02eTdhQlF0M2NDU0JMbzhzbU1SZW1BIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpFeGFtcGxlIiB4bWk6aWQ9Il9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJleGFtcGxlX0ExIiBndWlkPSJfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iRXhhbXBsZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRXhhbXBsZSBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItQTk0OXdIZFRGcUczV3M2My1xOUIydyIgaHJlZj0idW1hOi8vLUE5NDl3SGRURnFHM1dzNjMtcTlCMncjLUE5NDl3SGRURnFHM1dzNjMtcTlCMnciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRlbGluZSIgeG1pOmlkPSJfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSIgbmFtZT0iZ3VpZGVsaW5lX0ExIiBndWlkPSJfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iR3VpZGVsaW5lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJHdWlkZWxpbmUgQTEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLV8yMV9FaXNRU1RId3RsSmpvSjhidnciIGhyZWY9InVtYTovLy1fMjFfRWlzUVNUSHd0bEpqb0o4YnZ3Iy1fMjFfRWlzUVNUSHd0bEpqb0o4YnZ3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcmFjdGljZSIgeG1pOmlkPSJfUDhqWVlBLVNFZHFMMk8xUEpWOWNaQSIgbmFtZT0icHJhY3RpY2VfQTEiIGd1aWQ9Il9QOGpZWUEtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQTEgcHJlc2VudCIgY29udGVudFJlZmVyZW5jZXM9Il85S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIF9NS1Bua0EtV0VkcUwyTzFQSlY5Y1pBIF9DNWRfd0EtV0VkcUwyTzFQSlY5Y1pBIF9GRXpPNEEtV0VkcUwyTzFQSlY5Y1pBIF85UHAxVUJCS0VkcUJzN0toZFZMUkxBIF9LeGJhZ0EtV0VkcUwyTzFQSlY5Y1pBIF9IZ2hEWUEtV0VkcUwyTzFQSlY5Y1pBIF9LVjRxMEEtU0VkcUwyTzFQSlY5Y1pBIF9OREwta0EtU0VkcUwyTzFQSlY5Y1pBIF9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIF9Pa0N0VUEtU0VkcUwyTzFQSlY5Y1pBIF9LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIF9FcGZvWUEtVkVkcUwyTzFQSlY5Y1pBIF9RNURjNEEtU0VkcUwyTzFQSlY5Y1pBIF9UVjBhUUEtU0VkcUwyTzFQSlY5Y1pBIF9aazM5Z0EtU0VkcUwyTzFQSlY5Y1pBIF81NXprMEEtUEVkcUwyTzFQSlY5Y1pBIF9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBIF9iRklQVUEtU0VkcUwyTzFQSlY5Y1pBIF9oSEVqb0EtU0VkcUwyTzFQSlY5Y1pBIF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIF9GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIF9JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIF83ZFhZVUJCS0VkcUJzN0toZFZMUkxBIF9DQ1ZqY0EtV0VkcUwyTzFQSlY5Y1pBIF9HT1o3UUEtV0VkcUwyTzFQSlY5Y1pBIF9KWW4wZ0EtV0VkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItWjdrZElrQ3AtbUhVZGJfSm9RcHpXUSIgaHJlZj0idW1hOi8vLVo3a2RJa0NwLW1IVWRiX0pvUXB6V1EjLVo3a2RJa0NwLW1IVWRiX0pvUXB6V1EiLz4KLSAgICAgICAgICAgIDxzdWJQcmFjdGljZXMgeG1pOmlkPSJfLUZTVWdBLVVFZHFMMk8xUEpWOWNaQSIgbmFtZT0icHJhY3RpY2VfQTEuMSIgZ3VpZD0iXy1GU1VnQS1VRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlByYWN0aWNlIEExLjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEExLjEgcHJlc2VudCI+Ci0gICAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItOXhQNGQ3YmE2b3N3R2tQZXBYV2tfdyIgaHJlZj0idW1hOi8vLTl4UDRkN2JhNm9zd0drUGVwWFdrX3cjLTl4UDRkN2JhNm9zd0drUGVwWFdrX3ciLz4KLSAgICAgICAgICAgIDwvc3ViUHJhY3RpY2VzPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UmVwb3J0IiB4bWk6aWQ9Il9RNURjNEEtU0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJyZXBvcnRfQTEiIGd1aWQ9Il9RNURjNEEtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJSZXBvcnQgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJlcG9ydCBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItWFJlQkxkTjRpTGJ2YWZmQndlYk5DdyIgaHJlZj0idW1hOi8vLVhSZUJMZE40aUxidmFmZkJ3ZWJOQ3cjLVhSZUJMZE40aUxidmFmZkJ3ZWJOQ3ciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJldXNhYmxlQXNzZXQiIHhtaTppZD0iX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIG5hbWU9InJldXNhYmxlX2Fzc2V0X0ExIiBndWlkPSJfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iUmV1c2FibGUgQXNzZXQgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJldXNhYmxlIEFzc2V0IEExIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii0xaEhFT0w4cXl4VE1NUjc3NVVHZnJ3IiBocmVmPSJ1bWE6Ly8tMWhIRU9MOHF5eFRNTVI3NzVVR2ZydyMtMWhIRU9MOHF5eFRNTVI3NzVVR2ZydyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9hZG1hcCIgeG1pOmlkPSJfWmszOWdBLVNFZHFMMk8xUEpWOWNaQSIgbmFtZT0icm9hZG1hcF9BMSIgZ3VpZD0iX1prMzlnQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlJvYWRtYXAgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvYWRtYXAgQTEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXhvRFphcXI3Si13ZjJsQjdyU2pTWnciIGhyZWY9InVtYTovLy14b0RaYXFyN0otd2YybEI3clNqU1p3Iy14b0RaYXFyN0otd2YybEI3clNqU1p3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpTdXBwb3J0aW5nTWF0ZXJpYWwiIHhtaTppZD0iX2FGcHZVQS1TRWRxTDJPMVBKVjljWkEiIG5hbWU9InN1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiIGd1aWQ9Il9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEExIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii00NkFKbEF2dDVCRFlmTDlfZy0yUjd3IiBocmVmPSJ1bWE6Ly8tNDZBSmxBdnQ1QkRZZkw5X2ctMlI3dyMtNDZBSmxBdnQ1QkRZZkw5X2ctMlI3dyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGVtcGxhdGUiIHhtaTppZD0iX2JGSVBVQS1TRWRxTDJPMVBKVjljWkEiIG5hbWU9InRlbXBsYXRlX0ExIiBndWlkPSJfYkZJUFVBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iVGVtcGxhdGUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRlbXBsYXRlIEExIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1jOXNiOURpNE1ZbVItUm9vRmtQM2p3IiBocmVmPSJ1bWE6Ly8tYzlzYjlEaTRNWW1SLVJvb0ZrUDNqdyMtYzlzYjlEaTRNWW1SLVJvb0ZrUDNqdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VG9vbE1lbnRvciIgeG1pOmlkPSJfaEhFam9BLVNFZHFMMk8xUEpWOWNaQSIgbmFtZT0idG9vbG1lbnRvcl9BMSIgZ3VpZD0iX2hIRWpvQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlRvb2xtZW50b3IgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2xtZW50b3IgQTEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXA0eGtRbVB6RXFhblhuMWtTYldZQWciIGhyZWY9InVtYTovLy1wNHhrUW1QekVxYW5YbjFrU2JXWUFnIy1wNHhrUW1QekVxYW5YbjFrU2JXWUFnIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXaGl0ZXBhcGVyIiB4bWk6aWQ9Il9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJ3aGl0ZXBhcGVyX0ExIiBndWlkPSJfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iV2hpdGVwYXBlciBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItN1BaSExGU0tWTHNZT0FObjBnR3FJdyIgaHJlZj0idW1hOi8vLTdQWkhMRlNLVkxzWU9BTm4wZ0dxSXcjLTdQWkhMRlNLVkxzWU9BTm4wZ0dxSXciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbmNlcHQiIHhtaTppZD0iX09WTFZjQS1URWRxTDJPMVBKVjljWkEiIG5hbWU9ImNvbmNlcHRfQTIiIGd1aWQ9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJDb25jZXB0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJDb25jZXB0IEEyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1MUElheE9ITFhxOWlkR1Y0MWlVcjlnIiBocmVmPSJ1bWE6Ly8tTFBJYXhPSExYcTlpZEdWNDFpVXI5ZyMtTFBJYXhPSExYcTlpZEdWNDFpVXI5ZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2hlY2tsaXN0IiB4bWk6aWQ9Il9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJjaGVja2xpc3RfQTIiIGd1aWQ9Il9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkNoZWNrbGlzdCBBMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItSjlVcjlzbXBRdXZWR3B1RzlpX3drUSIgaHJlZj0idW1hOi8vLUo5VXI5c21wUXV2VkdwdUc5aV93a1EjLUo5VXI5c21wUXV2VkdwdUc5aV93a1EiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkV4YW1wbGUiIHhtaTppZD0iX3VhaldjQS1URWRxTDJPMVBKVjljWkEiIG5hbWU9ImV4YW1wbGVfQTIiIGd1aWQ9Il91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJFeGFtcGxlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJFeGFtcGxlIEExIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1wbEQyTTFzaFNFLUxsYkR3NXlZcHJnIiBocmVmPSJ1bWE6Ly8tcGxEMk0xc2hTRS1MbGJEdzV5WXByZyMtcGxEMk0xc2hTRS1MbGJEdzV5WXByZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGVsaW5lIiB4bWk6aWQ9Il82WVV3QUEtVEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJndWlkZWxpbmVfQTIiIGd1aWQ9Il82WVV3QUEtVEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJHdWlkZWxpbmUgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ikd1aWRlbGluZSBBMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItUGNadHRWLXNjLUVjVVF3Qi1aaEFJdyIgaHJlZj0idW1hOi8vLVBjWnR0Vi1zYy1FY1VRd0ItWmhBSXcjLVBjWnR0Vi1zYy1FY1VRd0ItWmhBSXciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJlcG9ydCIgeG1pOmlkPSJfR3JHd1FBLVVFZHFMMk8xUEpWOWNaQSIgbmFtZT0icmVwb3J0X0EyIiBndWlkPSJfR3JHd1FBLVVFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iUmVwb3J0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSZXBvcnQgQTIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTVMbmRtZHh4YkcxTTFNZnBBUEtwQVEiIGhyZWY9InVtYTovLy01TG5kbWR4eGJHMU0xTWZwQVBLcEFRIy01TG5kbWR4eGJHMU0xTWZwQVBLcEFRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUZW1wbGF0ZSIgeG1pOmlkPSJfWlhxOUVBLVVFZHFMMk8xUEpWOWNaQSIgbmFtZT0idGVtcGxhdGVfQTIiIGd1aWQ9Il9aWHE5RUEtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJUZW1wbGF0ZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVGVtcGxhdGUgQTIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWhMU09Xckc1YmlTWC1QQWtfM0JiOUEiIGhyZWY9InVtYTovLy1oTFNPV3JHNWJpU1gtUEFrXzNCYjlBIy1oTFNPV3JHNWJpU1gtUEFrXzNCYjlBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpTdXBwb3J0aW5nTWF0ZXJpYWwiIHhtaTppZD0iX21Qc19jQS1VRWRxTDJPMVBKVjljWkEiIG5hbWU9InN1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiIGd1aWQ9Il9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEEyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii03dzUzakZPendwTkJnZUNEX0FfdllnIiBocmVmPSJ1bWE6Ly8tN3c1M2pGT3p3cE5CZ2VDRF9BX3ZZZyMtN3c1M2pGT3p3cE5CZ2VDRF9BX3ZZZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VG9vbE1lbnRvciIgeG1pOmlkPSJfdjdKS0FBLVVFZHFMMk8xUEpWOWNaQSIgbmFtZT0idG9vbG1lbnRvcl9BMiIgZ3VpZD0iX3Y3SktBQS1VRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlRvb2xtZW50b3IgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2xtZW50b3IgQTIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXN4VnEtNWFhSWUzenQ1YUV1bjhGQ2ciIGhyZWY9InVtYTovLy1zeFZxLTVhYUllM3p0NWFFdW44RkNnIy1zeFZxLTVhYUllM3p0NWFFdW44RkNnIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXaGl0ZXBhcGVyIiB4bWk6aWQ9Il8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJ3aGl0ZXBhcGVyX0EyIiBndWlkPSJfM1hyMEVBLVVFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iV2hpdGVwYXBlciBBMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItdEdERmloNVQxbHRWbk1aZWY4QTc2dyIgaHJlZj0idW1hOi8vLXRHREZpaDVUMWx0Vm5NWmVmOEE3NncjLXRHREZpaDVUMWx0Vm5NWmVmOEE3NnciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlIiB4bWk6aWQ9Il9FcGZvWUEtVkVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJwcmFjdGljZV9BMiIgZ3VpZD0iX0VwZm9ZQS1WRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlByYWN0aWNlIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJQcmFjdGljZSBBMiBwcmVzZW50IiBjb250ZW50UmVmZXJlbmNlcz0iX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEgX0hFTXRFQS1SRWRxTDJPMVBKVjljWkEgX2tyaVRjQS1URWRxTDJPMVBKVjljWkEgX09WTFZjQS1URWRxTDJPMVBKVjljWkEgX0pCcWZVQS1SRWRxTDJPMVBKVjljWkEgX3VhaldjQS1URWRxTDJPMVBKVjljWkEgXzZZVXdBQS1URWRxTDJPMVBKVjljWkEgX0t2THhFQS1SRWRxTDJPMVBKVjljWkEgX1A4allZQS1TRWRxTDJPMVBKVjljWkEgX0dyR3dRQS1VRWRxTDJPMVBKVjljWkEgX1NNYzNFQS1WRWRxTDJPMVBKVjljWkEgX1l1a2dRQS1WRWRxTDJPMVBKVjljWkEgXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEgX21Qc19jQS1VRWRxTDJPMVBKVjljWkEgXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEgX1pYcTlFQS1VRWRxTDJPMVBKVjljWkEgX3Y3SktBQS1VRWRxTDJPMVBKVjljWkEgXzNYcjBFQS1VRWRxTDJPMVBKVjljWkEgX09TU1NJQS1XRWRxTDJPMVBKVjljWkEgX0R6dlBvQS1XRWRxTDJPMVBKVjljWkEgX0ZxV0w4QS1XRWRxTDJPMVBKVjljWkEgXy11YmdjQkJLRWRxQnM3S2hkVkxSTEEgX0xoYUY4QS1XRWRxTDJPMVBKVjljWkEgX0lGblVnQS1XRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1OY1NNVGZoTWx0dFBVSzJGNndYZ0VnIiBocmVmPSJ1bWE6Ly8tTmNTTVRmaE1sdHRQVUsyRjZ3WGdFZyMtTmNTTVRmaE1sdHRQVUsyRjZ3WGdFZyIvPgotICAgICAgICAgICAgPHN1YlByYWN0aWNlcyB4bWk6aWQ9Il9Kcmd3d0EtVkVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJwcmFjdGljZV9BMi4xIiBndWlkPSJfSnJnd3dBLVZFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTIuMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQTIuMSBwcmVzZW50Ij4KLSAgICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1SOXNRem9KalFtNC1OQnhVcWFMV0xnIiBocmVmPSJ1bWE6Ly8tUjlzUXpvSmpRbTQtTkJ4VXFhTFdMZyMtUjlzUXpvSmpRbTQtTkJ4VXFhTFdMZyIvPgotICAgICAgICAgICAgPC9zdWJQcmFjdGljZXM+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSZXVzYWJsZUFzc2V0IiB4bWk6aWQ9Il9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMiIgZ3VpZD0iX1NNYzNFQS1WRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlJldXNhYmxlIEFzc2V0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSZXVzYWJsZSBBc3NldCBBMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItN2dsR1lpSmFzOWhaR2tKOWNjUTVLUSIgaHJlZj0idW1hOi8vLTdnbEdZaUphczloWkdrSjljY1E1S1EjLTdnbEdZaUphczloWkdrSjljY1E1S1EiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvYWRtYXAiIHhtaTppZD0iX1l1a2dRQS1WRWRxTDJPMVBKVjljWkEiIG5hbWU9InJvYWRtYXBfQTIiIGd1aWQ9Il9ZdWtnUUEtVkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJSb2FkbWFwIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2FkbWFwIEEyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1KMHN6d3JLYmlMMkptLUZpZlF0STl3IiBocmVmPSJ1bWE6Ly8tSjBzendyS2JpTDJKbS1GaWZRdEk5dyMtSjBzendyS2JpTDJKbS1GaWZRdEk5dyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGVybURlZmluaXRpb24iIHhtaTppZD0iX284STdFQS1WRWRxTDJPMVBKVjljWkEiIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9BMiIgZ3VpZD0iX284STdFQS1WRWRxTDJPMVBKVjljWkEiIHByZXNlbnRhdGlvbk5hbWU9IlRlcm0gRGVmaW5pdGlvbiBBMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItOEJQUklnX1NiSFR3UUFpQVp5ODNQdyIgaHJlZj0idW1hOi8vLThCUFJJZ19TYkhUd1FBaUFaeTgzUHcjLThCUFJJZ19TYkhUd1FBaUFaeTgzUHciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRlcm1EZWZpbml0aW9uIiB4bWk6aWQ9Il9zZmlKVUEtVkVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQTEiIGd1aWQ9Il9zZmlKVUEtVkVkcUwyTzFQSlY5Y1pBIiBwcmVzZW50YXRpb25OYW1lPSJUZXJtIERlZmluaXRpb24gQTEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLU52Y3RTdW03bW1PNHFfMDhnTHBENUEiIGhyZWY9InVtYTovLy1OdmN0U3VtN21tTzRxXzA4Z0xwRDVBIy1OdmN0U3VtN21tTzRxXzA4Z0xwRDVBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrIiB4bWk6aWQ9Il9vVWx1RUVERkVkcU85TTNmdWtZQV9BIiBuYW1lPSJ0YXNrX0EzIiBndWlkPSJfb1VsdUVFREZFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6IFRhc2sgQTMiIG9yZGVyaW5nR3VpZGU9IiZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O0FTQ0lJJnF1b3Q7PyZndDsgJmx0O2NvbS5pYm0udW1hLmVkaXQudG5nLnV0aWwubW9kZWw6T3JkZXJJbmZvQ29sbGVjdGlvbiB4bWk6dmVyc2lvbj0mcXVvdDsyLjAmcXVvdDsgeG1sbnM6eG1pPSZxdW90O2h0dHA6Ly93d3cub21nLm9yZy9YTUkmcXVvdDsgeG1sbnM6Y29tLmlibS51bWEuZWRpdC50bmcudXRpbC5tb2RlbD0mcXVvdDtodHRwOi8vL2NvbS9pYm0vdW1hL2VkaXQvdG5nL3V0aWwvbW9kZWwuZWNvcmUmcXVvdDsmZ3Q7ICAgJmx0O29yZGVySW5mb3MgbmFtZT0mcXVvdDtzZWN0aW9ucyZxdW90OyB0aW1lc3RhbXA9JnF1b3Q7MTEyOTc0NzI2NDEwOSZxdW90OyZndDsgICAgICZsdDtnVUlEcyZndDtfckNXd1VFRFBFZHFyaHNaaDNRTkFNUSZsdDsvZ1VJRHMmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3RpMkJZQkJPRWRxQnM3S2hkVkxSTEEmbHQ7L2dVSURzJmd0OyAgICAgJmx0O2dVSURzJmd0O191bXlnWUVEUEVkcXJoc1poM1FOQU1RJmx0Oy9nVUlEcyZndDsgICAgICZsdDtnVUlEcyZndDtfdGs3c0VCQk9FZHFCczdLaGRWTFJMQSZsdDsvZ1VJRHMmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3Z4NUJrRURQRWRxcmhzWmgzUU5BTVEmbHQ7L2dVSURzJmd0OyAgICAgJmx0O2dVSURzJmd0O190bmRib0JCT0VkcUJzN0toZFZMUkxBJmx0Oy9nVUlEcyZndDsgICAmbHQ7L29yZGVySW5mb3MmZ3Q7ICZsdDsvY29tLmlibS51bWEuZWRpdC50bmcudXRpbC5tb2RlbDpPcmRlckluZm9Db2xsZWN0aW9uJmd0OyAiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTMgZXh0ZW5kcyBUYXNrIEEyIiB2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ9Il83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBIiBwZXJmb3JtZWRCeT0iXzhaTjZBRURGRWRxTzlNM2Z1a1lBX0EiIGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PSJfNmszVUFBLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWJSOVRYMWJaNlc5Ulk1SXZJUEdVamciIGhyZWY9InVtYTovLy1iUjlUWDFiWjZXOVJZNUl2SVBHVWpnIy1iUjlUWDFiWjZXOVJZNUl2SVBHVWpnIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlIiB4bWk6aWQ9Il84Wk42QUVERkVkcU85TTNmdWtZQV9BIiBuYW1lPSJyb2xlX0EzIiBndWlkPSJfOFpONkFFREZFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWYgOiBSb2xlIEEzIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEEzIGV4dGVuZHMgUm9sZSBBMiIgdmFyaWFiaWxpdHlUeXBlPSJleHRlbmRzIiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PSJfNmszVUFBLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVl1bWRzVU9IRlZoR2tld3dJQ05kZ3ciIGhyZWY9InVtYTovLy1ZdW1kc1VPSEZWaEdrZXd3SUNOZGd3Iy1ZdW1kc1VPSEZWaEdrZXd3SUNOZGd3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il95VWVMTFEtUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il95VWVMTFEtUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX1RRYm5JQS1XRWRxTDJPMVBKVjljWkEiIG5hbWU9ImNhcFBhdFBha19BMSIgZ3VpZD0iX1RRYm5JQS1XRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIHhtaTppZD0iXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgeG1pOmlkPSJfWnRaYk1FREZFZHFPOU0zZnVrWUFfQSIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EiLz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9hSFVTUUJCTkVkcUJzN0toZFZMUkxBIiBocmVmPSJ1bWE6Ly9fYUhVU1FCQk5FZHFCczdLaGRWTFJMQSNfYUhVU1FCQk5FZHFCczdLaGRWTFJMQSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9kQmh2a0VBdkVkcUZxSXU4LWNrb2xnIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfZEJodmtFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il95VWVMTGctUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgZ3VpZD0iX3lVZUxMZy1QRWRxTDJPMVBKVjljWkEiPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgeG1pOmlkPSJfVzZhNGNCQk5FZHFCczdLaGRWTFJMQSIgaHJlZj0idW1hOi8vX1c2YTRjQkJORWRxQnM3S2hkVkxSTEEjX1c2YTRjQkJORWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9qVU5mb0JCTkVkcUJzN0toZFZMUkxBIiBuYW1lPSJkZWxQcm9jUGFrIEExIiBndWlkPSJfalVOZm9CQk5FZHFCczdLaGRWTFJMQSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIHhtaTppZD0iX3VxNUs4Qk0xRWRxcW5kaS1nRHV4cHciIGhyZWY9InVtYTovL191cTVLOEJNMUVkcXFuZGktZ0R1eHB3I191cTVLOEJNMUVkcXFuZGktZ0R1eHB3Ii8+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX3lVZUxMdy1QRWRxTDJPMVBKVjljWkEiIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBndWlkPSJfeVVlTEx3LVBFZHFMMk8xUEpWOWNaQSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3JvbGVzL3JvbGVfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3JvbGVzL3JvbGVfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzhmOThmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlcy9yb2xlX0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItZzdtOThKbDhhUmJWNm5mT0dVcEduZyIgbmFtZT0icm9sZV9BMSxfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLWc3bTk4Smw4YVJiVjZuZk9HVXBHbmciIGNoYW5nZURhdGU9IjIwMDUtMTAtMThUMTY6MDQ6MTAuNjA5LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJvbGUgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+Um9sZSBBMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8c2tpbGxzPlJvbGUgQTEgc2tpbGxzPC9za2lsbHM+Ci0gIDxhc3NpZ25tZW50QXBwcm9hY2hlcz5Sb2xlIEExIGFzc2lnbjwvYXNzaWdubWVudEFwcHJvYWNoZXM+Ci0gIDxzeW5vbnltcz5Sb2xlIEExIHN5bjwvc3lub255bXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3JvbGVzL3JvbGVfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3JvbGVzL3JvbGVfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTE1MWNiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlcy9yb2xlX0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItSHhrY1ZpSHU1N2JER3VsNDIxckJ2ZyIgbmFtZT0icm9sZV9BMixfNmszVUFBLVBFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLUh4a2NWaUh1NTdiREd1bDQyMXJCdmciIGNoYW5nZURhdGU9IjIwMDUtMTAtMTlUMTA6MzI6MzUuNDIyLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJvbGUgQTIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+Um9sZSBBMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8c2tpbGxzPlJvbGUgQTIgc2tpbGxzPC9za2lsbHM+Ci0gIDxhc3NpZ25tZW50QXBwcm9hY2hlcz5Sb2xlIEEyIGFzc2lnbjwvYXNzaWdubWVudEFwcHJvYWNoZXM+Ci0gIDxzeW5vbnltcz5Sb2xlIEEyIHN5bjwvc3lub255bXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3JvbGVzL3JvbGVfQTMueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3JvbGVzL3JvbGVfQTMueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjY2MzA2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlcy9yb2xlX0EzLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItWXVtZHNVT0hGVmhHa2V3d0lDTmRndyIgbmFtZT0ibmV3X3JvbGUsXzhaTjZBRURGRWRxTzlNM2Z1a1lBX0EiIGd1aWQ9Ii1ZdW1kc1VPSEZWaEdrZXd3SUNOZGd3IiBjaGFuZ2VEYXRlPSIyMDA1LTEwLTE5VDEwOjI5OjU5LjQ1My0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5tYWluOiBSb2xlIEEzPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5rZXk6IFJvbGUgQTM8L2tleUNvbnNpZGVyYXRpb25zPgotICA8c2tpbGxzPnNraWxsczogUm9sZSBBMzwvc2tpbGxzPgotICA8YXNzaWdubWVudEFwcHJvYWNoZXM+YXNzaWdubWVudDogUm9sZSBBMzwvYXNzaWdubWVudEFwcHJvYWNoZXM+Ci0gIDxzeW5vbnltcz5zeW5vbnltbnMgOiBSb2xlIEEzPC9zeW5vbnltcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvcm9sZXNldGdyb3VwaW5ncy9yb2xlX3NldF9ncm91cGluZ19BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvcm9sZXNldGdyb3VwaW5ncy9yb2xlX3NldF9ncm91cGluZ19BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZTA5MWMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3JvbGVzZXRncm91cGluZ3Mvcm9sZV9zZXRfZ3JvdXBpbmdfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1GVjk5SzBWTTdmNGNsQVVrWWJvRk9RIiBuYW1lPSJyb2xlX3NldF9ncm91cGluZ19BMSxfSlluMGdBLVdFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLUZWOTlLMFZNN2Y0Y2xBVWtZYm9GT1EiIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTc6NDk6MzEuNjQxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJvbGUgU2V0IEdyb3VwaW5nIEExIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlJvbGUgU2V0IEdyb3VwaW5nIEExIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3JvbGVzZXRzL3JvbGVfc2V0X0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlc2V0cy9yb2xlX3NldF9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYjFhOTQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3JvbGVzZXRzL3JvbGVfc2V0X0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItV0dhOU5RSi1iTTVVWjBKdVlfQUVQdyIgbmFtZT0icm9sZV9zZXRfQTEsXzlQcDFVQkJLRWRxQnM3S2hkVkxSTEEiIGd1aWQ9Ii1XR2E5TlFKLWJNNVVaMEp1WV9BRVB3IiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTIyVDEwOjQ3OjIzLjI1MC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2xlIFNldCBBMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Sb2xlIFNldCBBMTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvcm9sZXNldHMvcm9sZV9zZXRfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3JvbGVzZXRzL3JvbGVfc2V0X0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwNWYzMy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvcm9sZXNldHMvcm9sZV9zZXRfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1MUkdsZUhJcE5zNU1iOVFBT0dmWlF3IiBuYW1lPSJyb2xlX3NldF9BMixfLXViZ2NCQktFZHFCczdLaGRWTFJMQSIgZ3VpZD0iLUxSR2xlSElwTnM1TWI5UUFPR2ZaUXciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTc6NTA6NDAuMzI4LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJvbGUgU2V0IEEyIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlJvbGUgU2V0IEEyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3Rhc2tzL3Rhc2tfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3Rhc2tzL3Rhc2tfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2UxOWE1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS90YXNrcy90YXNrX0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVMxaWdMU2k2QUlfdmx1eldPQ3U2VHciIG5hbWU9InRhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3IiBjaGFuZ2VEYXRlPSIyMDA1LTEwLTE5VDEwOjI4OjM5LjQyMi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5UYXNrIEExIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX3R2RjRNQkJQRWRxQnM3S2hkVkxSTEEiIG5hbWU9IlN0ZXAgQTEuMSIgZ3VpZD0iX3R2RjRNQkJQRWRxQnM3S2hkVkxSTEEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+YWxwaGE8L3NlY3Rpb25EZXNjcmlwdGlvbj4KLSAgPC9zZWN0aW9ucz4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX3R6a0lnQkJQRWRxQnM3S2hkVkxSTEEiIG5hbWU9IlN0ZXAgQTEuMiIgZ3VpZD0iX3R6a0lnQkJQRWRxQnM3S2hkVkxSTEEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+YmV0YTwvc2VjdGlvbkRlc2NyaXB0aW9uPgotICA8L3NlY3Rpb25zPgotICA8c2VjdGlvbnMgeG1pOmlkPSJfdUNCYlFCQlBFZHFCczdLaGRWTFJMQSIgbmFtZT0iU3RlcCBBMS4zIiBndWlkPSJfdUNCYlFCQlBFZHFCczdLaGRWTFJMQSI+Ci0gICAgPHNlY3Rpb25EZXNjcmlwdGlvbj5nYW1tYTwvc2VjdGlvbkRlc2NyaXB0aW9uPgotICA8L3NlY3Rpb25zPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+VGFzayBBMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8cHVycG9zZT5UYXNrIEExIHB1cnBvc2U8L3B1cnBvc2U+Ci0gIDxhbHRlcm5hdGl2ZXM+VGFzayBBMSBhbHQ8L2FsdGVybmF0aXZlcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvdGFza3MvdGFza19BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvdGFza3MvdGFza19BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZDdiNzEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3Rhc2tzL3Rhc2tfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyIgbmFtZT0idGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLTEzcThKSkFhMGl4NnJETVpBcXd5MXciIGNoYW5nZURhdGU9IjIwMDUtMTAtMTlUMTA6Mjk6MjIuNTQ3LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRhc2sgQTIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8c2VjdGlvbnMgeG1pOmlkPSJfdGkyQllCQk9FZHFCczdLaGRWTFJMQSIgbmFtZT0iU3RlcCBBMi4xIiBndWlkPSJfdGkyQllCQk9FZHFCczdLaGRWTFJMQSI+Ci0gICAgPHNlY3Rpb25EZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICBwdXQgeW91ciByaWdodCBmb290IGluCi0mbHQ7L3AmZ3Q7PC9zZWN0aW9uRGVzY3JpcHRpb24+Ci0gIDwvc2VjdGlvbnM+Ci0gIDxzZWN0aW9ucyB4bWk6aWQ9Il90azdzRUJCT0VkcUJzN0toZFZMUkxBIiBuYW1lPSJTdGVwIEEyLjIiIGd1aWQ9Il90azdzRUJCT0VkcUJzN0toZFZMUkxBIj4KLSAgICA8c2VjdGlvbkRlc2NyaXB0aW9uPnB1dCB5b3VyIHJpZ2h0IGZvb3Qgb3V0PC9zZWN0aW9uRGVzY3JpcHRpb24+Ci0gIDwvc2VjdGlvbnM+Ci0gIDxzZWN0aW9ucyB4bWk6aWQ9Il90bmRib0JCT0VkcUJzN0toZFZMUkxBIiBuYW1lPSJTdGVwIEEyLjMiIGd1aWQ9Il90bmRib0JCT0VkcUJzN0toZFZMUkxBIj4KLSAgICA8c2VjdGlvbkRlc2NyaXB0aW9uPkRvIHRoZSBob2tleS1wb2tleTwvc2VjdGlvbkRlc2NyaXB0aW9uPgotICA8L3NlY3Rpb25zPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+VGFzayBBMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8cHVycG9zZT5UYXNrIEEyIHB1cnBvc2U8L3B1cnBvc2U+Ci0gIDxhbHRlcm5hdGl2ZXM+VGFzayBBMiBhbHQ8L2FsdGVybmF0aXZlcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvdGFza3MvdGFza19BMy54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvdGFza3MvdGFza19BMy54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzM2FmM2MuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3Rhc2tzL3Rhc2tfQTMueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItYlI5VFgxYlo2VzlSWTVJdklQR1VqZyIgbmFtZT0iLF9vVWx1RUVERkVkcU85TTNmdWtZQV9BIiBndWlkPSItYlI5VFgxYlo2VzlSWTVJdklQR1VqZyIgY2hhbmdlRGF0ZT0iMjAwNS0xMC0xOVQxMDoyNzo0My4wMDAtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+bWFpbjogVGFzayBBMzwvbWFpbkRlc2NyaXB0aW9uPgotICA8c2VjdGlvbnMgeG1pOmlkPSJfckNXd1VFRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0iU3RlcCBBMy4xIiBndWlkPSJfckNXd1VFRFBFZHFyaHNaaDNRTkFNUSI+Ci0gICAgPHNlY3Rpb25EZXNjcmlwdGlvbj5TdGVwIEEzLjE8L3NlY3Rpb25EZXNjcmlwdGlvbj4KLSAgPC9zZWN0aW9ucz4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX3VteWdZRURQRWRxcmhzWmgzUU5BTVEiIG5hbWU9IlN0ZXAgQTMuMiIgZ3VpZD0iX3VteWdZRURQRWRxcmhzWmgzUU5BTVEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+U3RlcCBBMy4yPC9zZWN0aW9uRGVzY3JpcHRpb24+Ci0gIDwvc2VjdGlvbnM+Ci0gIDxzZWN0aW9ucyB4bWk6aWQ9Il92eDVCa0VEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJTdGVwIEEzLjMiIGd1aWQ9Il92eDVCa0VEUEVkcXJoc1poM1FOQU1RIj4KLSAgICA8c2VjdGlvbkRlc2NyaXB0aW9uPlN0ZXAgQTMuMzwvc2VjdGlvbkRlc2NyaXB0aW9uPgotICA8L3NlY3Rpb25zPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5czogVGFzayBBMzwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxwdXJwb3NlPnB1cnBvc2U6IFRhc2sgQTM8L3B1cnBvc2U+Ci0gIDxhbHRlcm5hdGl2ZXM+YWx0ZXJuYXRpdmVzOiBUYXNrIEEzPC9hbHRlcm5hdGl2ZXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3Rvb2xzL3Rvb2xfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3Rvb2xzL3Rvb2xfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjQyNzAyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS90b29scy90b29sX0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSIteTA0d1BFMTAtU0I4aUZudTVjWGFNQSIgbmFtZT0idG9vbF9BMSxfS3hiYWdBLVdFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLXkwNHdQRTEwLVNCOGlGbnU1Y1hhTUEiIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTc6NTI6MDcuMjAzLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRvb2wgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+VG9vbCBBMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS90b29scy90b29sX0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS90b29scy90b29sX0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM3M2JmMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvdG9vbHMvdG9vbF9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLXp6QlAtNTRHdVFXZlZUejYwU2RRc3ciIG5hbWU9InRvb2xfQTIsX0xoYUY4QS1XRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii16ekJQLTU0R3VRV2ZWVHo2MFNkUXN3IiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE3OjUyOjM0LjU3OC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Ub29sIEEyIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlRvb2wgQTIga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL2FydGlmYWN0X0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzMwMGJiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLW45VEpRYTBGSnZHX2F2RFhhQVRqSVEiIG5hbWU9ImFydGlmYWN0X0ExIHgsXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1uOVRKUWEwRkp2R19hdkRYYUFUaklRIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA3VDE0OjUyOjQ0Ljk4NC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5BcnRpZmFjdCBBMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5BcnRpZmFjdCBBMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8ZXh0ZXJuYWxJZD5BcnRpZmFjdCBBMSB1bmlxdWU8L2V4dGVybmFsSWQ+Ci0gIDxwdXJwb3NlPkFydGlmYWN0IEExIHB1cnBvc2U8L3B1cnBvc2U+Ci0gIDxpbXBhY3RPZk5vdEhhdmluZz5BcnRpZmFjdCBBMSBpbXBhY3Q8L2ltcGFjdE9mTm90SGF2aW5nPgotICA8cmVhc29uc0Zvck5vdE5lZWRpbmc+QXJ0aWZhY3QgQTEgcmVhc29uPC9yZWFzb25zRm9yTm90TmVlZGluZz4KLSAgPGJyaWVmT3V0bGluZT5BcnRpZmFjdCBBMSBicmllZjwvYnJpZWZPdXRsaW5lPgotICA8cmVwcmVzZW50YXRpb25PcHRpb25zPkFydGlmYWN0IEExIHJlcDwvcmVwcmVzZW50YXRpb25PcHRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL2FydGlmYWN0X0EyLjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9hcnRpZmFjdF9BMi4xLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVhOTFmMS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL2FydGlmYWN0X0EyLjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVVGUm9lQUtIZFhYMlNTQjFLVVh0WUEiIG5hbWU9ImFydGlmYWN0X0EyLjEsX0hFTXRFQS1SRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1VRlJvZUFLSGRYWDJTU0IxS1VYdFlBIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE3VDE5OjQ0OjA3Ljc4MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5BcnRpZmFjdCBBMi4xIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPkFydGlmYWN0IEEyLjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+QXJ0aWZhY3QgQTIuMSB1bmlxdWU8L2V4dGVybmFsSWQ+Ci0gIDxwdXJwb3NlPkFydGlmYWN0IEEyLjEgcHVycG9zZTwvcHVycG9zZT4KLSAgPGltcGFjdE9mTm90SGF2aW5nPkFydGlmYWN0IEEyLjEgaW1wYWN0PC9pbXBhY3RPZk5vdEhhdmluZz4KLSAgPHJlYXNvbnNGb3JOb3ROZWVkaW5nPkFydGlmYWN0IEEyLjEgcmVhc29uPC9yZWFzb25zRm9yTm90TmVlZGluZz4KLSAgPGJyaWVmT3V0bGluZT5BcnRpZmFjdCBBMi4xIGJyaWVmPC9icmllZk91dGxpbmU+Ci0gIDxyZXByZXNlbnRhdGlvbk9wdGlvbnM+QXJ0aWZhY3QgQTIuMSByZXA8L3JlcHJlc2VudGF0aW9uT3B0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9hcnRpZmFjdF9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL2FydGlmYWN0X0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I5YjNhYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL2FydGlmYWN0X0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1KVFdLbjVkNENMYzRLRlFNRFRGcFNRIiBuYW1lPSJhcnRpZmFjdF9BMixfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLUpUV0tuNWQ0Q0xjNEtGUU1EVEZwU1EiIGNoYW5nZURhdGU9IjIwMDUtMDgtMTdUMTk6NDE6MjQuMzkxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkFydGlmYWN0IEEyIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPkFydGlmYWN0IEEyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxleHRlcm5hbElkPkFydGlmYWN0IEEyIHVuaXF1ZTwvZXh0ZXJuYWxJZD4KLSAgPHB1cnBvc2U+QXJ0aWZhY3QgQTIgcHVycG9zZTwvcHVycG9zZT4KLSAgPGltcGFjdE9mTm90SGF2aW5nPkFydGlmYWN0IEEyIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5BcnRpZmFjdCBBMiByZWFzb248L3JlYXNvbnNGb3JOb3ROZWVkaW5nPgotICA8YnJpZWZPdXRsaW5lPkFydGlmYWN0IEEyIGJyaWVmPC9icmllZk91dGxpbmU+Ci0gIDxyZXByZXNlbnRhdGlvbk9wdGlvbnM+QXJ0aWZhY3QgQTIgcmVwPC9yZXByZXNlbnRhdGlvbk9wdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9kZWxpdmVyYWJsZV9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNjJhMjUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9kZWxpdmVyYWJsZV9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGVEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItQWJYUmc0NEw4VHh4NENrQjJoeDVOUSIgbmFtZT0iZGVsaXZlcmFibGVfQTEsX0lJU25VQS1SRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1BYlhSZzQ0TDhUeHg0Q2tCMmh4NU5RIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjI5OjU5LjM5MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5EZWxpdmVyYWJsZSBBMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5EZWxpdmVyYWJsZSBBMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8ZXh0ZXJuYWxJZD5EZWxpdmVyYWJsZSBBMSB1bmlxdWU8L2V4dGVybmFsSWQ+Ci0gIDxwdXJwb3NlPkRlbGl2ZXJhYmxlIEExIHBvcnBvaXNlPC9wdXJwb3NlPgotICA8aW1wYWN0T2ZOb3RIYXZpbmc+RGVsaXZlcmFibGUgQTEgaW1wYWN0PC9pbXBhY3RPZk5vdEhhdmluZz4KLSAgPHJlYXNvbnNGb3JOb3ROZWVkaW5nPkRlbGl2ZXJhYmxlIEExIHJlYXNvbjwvcmVhc29uc0Zvck5vdE5lZWRpbmc+Ci0gIDxleHRlcm5hbERlc2NyaXB0aW9uPkRlbGl2ZXJhYmxlIEExIGV4dGVybjwvZXh0ZXJuYWxEZXNjcmlwdGlvbj4KLSAgPHBhY2thZ2luZ0d1aWRhbmNlPkRlbGl2ZXJhYmxlIEExIHBrZzwvcGFja2FnaW5nR3VpZGFuY2U+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGVEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9kZWxpdmVyYWJsZV9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZjQ3ZTMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9kZWxpdmVyYWJsZV9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGVEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItTWRxb2Etbnh3RUhmQUpjb0E2WE5LUSIgbmFtZT0iZGVsaXZlcmFibGVfQTIsX0pCcWZVQS1SRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1NZHFvYS1ueHdFSGZBSmNvQTZYTktRIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMwOjE1LjE3Mi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5EZWxpdmVyYWJsZSBBMiBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5EZWxpdmVyYWJsZSBBMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8ZXh0ZXJuYWxJZD5EZWxpdmVyYWJsZSBBMiB1bmlxdWU8L2V4dGVybmFsSWQ+Ci0gIDxwdXJwb3NlPkRlbGl2ZXJhYmxlIEEyIHBvcnBvaXNlPC9wdXJwb3NlPgotICA8aW1wYWN0T2ZOb3RIYXZpbmc+RGVsaXZlcmFibGUgQTImYW1wO25ic3A7aW1wYWN0PC9pbXBhY3RPZk5vdEhhdmluZz4KLSAgPHJlYXNvbnNGb3JOb3ROZWVkaW5nPkRlbGl2ZXJhYmxlIEEyIHJlYXNvbjwvcmVhc29uc0Zvck5vdE5lZWRpbmc+Ci0gIDxleHRlcm5hbERlc2NyaXB0aW9uPkRlbGl2ZXJhYmxlIEEyIGV4dGVybjwvZXh0ZXJuYWxEZXNjcmlwdGlvbj4KLSAgPHBhY2thZ2luZ0d1aWRhbmNlPkRlbGl2ZXJhYmxlIEEyIHBrZzwvcGFja2FnaW5nR3VpZGFuY2U+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGVEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvb3V0Y29tZV9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL291dGNvbWVfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDhiNDYxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvb3V0Y29tZV9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii0zb2R5QnlJZXpSUlhnUWdlSHVNNlNBIiBuYW1lPSJvdXRjb21lX0ExLF9LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIiBndWlkPSItM29keUJ5SWV6UlJYZ1FnZUh1TTZTQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDoxOC4xODgtMDcwMCIgY2hhbmdlRGVzY3JpcHRpb249IiBPdXRjb21lIEExICI+Ci0gIDxtYWluRGVzY3JpcHRpb24+T3V0Y29tZSBBMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5PdXRjb21lIEExIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxleHRlcm5hbElkPk91dGNvbWUgQTEgdW5pcXVlPC9leHRlcm5hbElkPgotICA8cHVycG9zZT5PdXRjb21lIEExIHBvcnBvaXNlPC9wdXJwb3NlPgotICA8aW1wYWN0T2ZOb3RIYXZpbmc+T3V0Y29tZSBBMSBpbXBhY3Q8L2ltcGFjdE9mTm90SGF2aW5nPgotICA8cmVhc29uc0Zvck5vdE5lZWRpbmc+T3V0Y29tZSBBMSByZWFzb248L3JlYXNvbnNGb3JOb3ROZWVkaW5nPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL291dGNvbWVfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9vdXRjb21lX0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNiMWU0My4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL291dGNvbWVfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItNEdiQVdHYjg3QWx6LUd6X0dfOXAxZyIgbmFtZT0ib3V0Y29tZV9BMixfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLTRHYkFXR2I4N0Fsei1Hel9HXzlwMWciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6MjEuMjgxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPk91dGNvbWUgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+T3V0Y29tZSBBMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8ZXh0ZXJuYWxJZD5PdXRjb21lIEExIHVuaXF1ZTwvZXh0ZXJuYWxJZD4KLSAgPHB1cnBvc2U+T3V0Y29tZSBBMSBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGltcGFjdE9mTm90SGF2aW5nPk91dGNvbWUgQTEgaW1wYWN0PC9pbXBhY3RPZk5vdEhhdmluZz4KLSAgPHJlYXNvbnNGb3JOb3ROZWVkaW5nPk91dGNvbWUgQTEgcmVhc29uPC9yZWFzb25zRm9yTm90TmVlZGluZz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9zdWJfYXJ0aWZhY3RfQTEuMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL3N1Yl9hcnRpZmFjdF9BMS4xLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIyYTVjNC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL3N1Yl9hcnRpZmFjdF9BMS4xLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii05bjFXWDVkN0lGaFZKNHB6SFZfdnJRIiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfRjUxeXdBLVJFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLTluMVdYNWQ3SUZoVko0cHpIVl92clEiIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTg6MDQ6MTkuMzEyLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlN1Yl9BcnRpZmFjdCBBMS4xIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlN1Yl9BcnRpZmFjdCBBMS4xIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxleHRlcm5hbElkPlN1Yl9BcnRpZmFjdCBBMS4xIHVuaXF1ZTwvZXh0ZXJuYWxJZD4KLSAgPHB1cnBvc2U+U3ViX0FydGlmYWN0IEExLjEgcHVycG9zZTwvcHVycG9zZT4KLSAgPGltcGFjdE9mTm90SGF2aW5nPkFydGlmYWN0IEExLjEgaW1wYWN0PC9pbXBhY3RPZk5vdEhhdmluZz4KLSAgPHJlYXNvbnNGb3JOb3ROZWVkaW5nPkFydGlmYWN0IEExLjEgcmVhc29uPC9yZWFzb25zRm9yTm90TmVlZGluZz4KLSAgPGJyaWVmT3V0bGluZT5TdWJfQXJ0aWZhY3QgQTEuMSBicmllZjwvYnJpZWZPdXRsaW5lPgotICA8cmVwcmVzZW50YXRpb25PcHRpb25zPlN1Yl9BcnRpZmFjdCBBMS4xIHJlcDwvcmVwcmVzZW50YXRpb25PcHRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3R0eXBlcy93b3JrX3Byb2R1Y3RfdHlwZV9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3R0eXBlcy93b3JrX3Byb2R1Y3RfdHlwZV9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2N2M4ZjMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0dHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1UZlJEb0hpc21zaGo4Y0wybE9SdGNnIiBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9BMSxfSGdoRFlBLVdFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLVRmUkRvSGlzbXNoajhjTDJsT1J0Y2ciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTg6MDI6NDQuMTI1LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPldvcmsgUHJvZHVjdCBUeXBlIEExIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPldvcmsgUHJvZHVjdCBUeXBlIEExIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0dHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0dHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzU0NzY1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItY2xmREEwUE02eExJanloU3AxaUxRUSIgbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQTIsX0lGblVnQS1XRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1jbGZEQTBQTTZ4TElqeWhTcDFpTFFRIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE4OjAzOjE2LjM0NC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Xb3JrIFByb2R1Y3QgVHlwZSBBMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Xb3JrIFByb2R1Y3QgVHlwZSBBMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQjEvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEIxL2NvbnRlbnQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjNlMDg0Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQjEvY29udGVudC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLXd5YkhLVWRsWGJERkcwSE9QaEFKNlEiIG5hbWU9IkNQIEExLF9kQmh2a1VBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSItd3liSEtVZGxYYkRGRzBIT1BoQUo2USIvPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBCMS9kaWFncmFtLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQjEvZGlhZ3JhbS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNTU2OWYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBCMS9kaWFncmFtLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgeG1sbnM6bm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mL3J1bnRpbWUvMS4wLjAvbm90YXRpb24iIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOnVtbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpBY3Rpdml0eURldGFpbERpYWdyYW0geG1pOmlkPSJfSWNfUm9PeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZb2tBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtPgotICA8bm90YXRpb246RGlhZ3JhbSB4bWk6aWQ9Il9JY19Sb2V4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSJBREQiIGVsZW1lbnQ9Il9JY19Sb094NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJDUCBCMSIgbWVhc3VyZW1lbnRVbml0PSJQaXhlbCI+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246UGFnZVN0eWxlIiB4bWk6aWQ9Il9JY19Sb3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246R3VpZGVTdHlsZSIgeG1pOmlkPSJfSWNfUm8teDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0ljX1JwT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgPC9ub3RhdGlvbjpEaWFncmFtPgotICA8dW1sOkFjdGl2aXR5IHhtaTppZD0iX0llX2N3T3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFjdDEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9JZV9jd2V4NEVkdTJPbzZxLW5IV2dnIiBzb3VyY2U9InVtYV9lbGVtZW50Ij4KLSAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfSWVfY3d1eDRFZHUyT282cS1uSFdnZyIga2V5PSJ1cmkiIHZhbHVlPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9JZV9jdy14NEVkdTJPbzZxLW5IV2dnIiBrZXk9InR5cGUiIHZhbHVlPSJBY3Rpdml0eSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHlQYXJhbWV0ZXJOb2RlIiB4bWk6aWQ9Il9JZ0pUVU94NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJUYXNrIEExIHByZXNlbnQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX0lnVmdrT3g0RWR1Mk9vNnEtbkhXZ2ciIHNvdXJjZT0idW1hX2VsZW1lbnQiPgotICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0lnVmdrZXg0RWR1Mk9vNnEtbkhXZ2ciIGtleT0idXJpIiB2YWx1ZT0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lTVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9JZ1Zna3V4NEVkdTJPbzZxLW5IV2dnIiBrZXk9InR5cGUiIHZhbHVlPSJUYXNrIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L25vZGU+Ci0gICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBY3Rpdml0eVBhcmFtZXRlck5vZGUiIHhtaTppZD0iX0loM0trdXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2sgQjEgcHJlc25ldCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfSWgzS2steDRFZHUyT282cS1uSFdnZyIgc291cmNlPSJ1bWFfZWxlbWVudCI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfSWgzS2xPeDRFZHUyT282cS1uSFdnZyIga2V5PSJ1cmkiIHZhbHVlPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVIwQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0loM0tsZXg0RWR1Mk9vNnEtbkhXZ2ciIGtleT0idHlwZSIgdmFsdWU9IlRhc2siLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvbm9kZT4KLSAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFjdGl2aXR5UGFyYW1ldGVyTm9kZSIgeG1pOmlkPSJfSWgzS24teDRFZHUyT282cS1uSFdnZyIgbmFtZT0iVGFzayBCMiBwcmVzZW50Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9JaDNLb094NEVkdTJPbzZxLW5IV2dnIiBzb3VyY2U9InVtYV9lbGVtZW50Ij4KLSAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9JaDNLb2V4NEVkdTJPbzZxLW5IV2dnIiBrZXk9InVyaSIgdmFsdWU9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZUkVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfSWgzS291eDRFZHUyT282cS1uSFdnZyIga2V5PSJ0eXBlIiB2YWx1ZT0iVGFzayIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9ub2RlPgotICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHlQYXJhbWV0ZXJOb2RlIiB4bWk6aWQ9Il9JaDNLck94NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJUYXNrIEEyICI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfSWgzS3JleDRFZHUyT282cS1uSFdnZyIgc291cmNlPSJ1bWFfZWxlbWVudCI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfSWgzS3J1eDRFZHUyT282cS1uSFdnZyIga2V5PSJ1cmkiIHZhbHVlPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVJrQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0loM0tyLXg0RWR1Mk9vNnEtbkhXZ2ciIGtleT0idHlwZSIgdmFsdWU9IlRhc2siLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvbm9kZT4KLSAgPC91bWw6QWN0aXZpdHk+Ci0gIDxub3RhdGlvbjpEaWFncmFtIHhtaTppZD0iX0lmUndvT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IkFEIiBlbGVtZW50PSJfSWVfY3dPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQWN0MSIgbWVhc3VyZW1lbnRVbml0PSJQaXhlbCI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaGsyc094NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDA5IiBlbGVtZW50PSJfSWdKVFVPeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0loeEQ4T3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDgiLz4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWgzS2tPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JaGsyc2V4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0loazJzdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWhrMnMteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JaGsydE94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JaDNLa2V4NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWgzS2x1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwOSIgZWxlbWVudD0iX0loM0trdXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaDNLbk94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDA4Ii8+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0loM0tuZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWgzS2wteDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JaDNLbU94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0loM0ttZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWgzS211eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWgzS251eDRFZHUyT282cS1uSFdnZyIgeD0iMTAiIHk9IjEwIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0loM0tvLXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDkiIGVsZW1lbnQ9Il9JaDNLbi14NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWgzS3FleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwOCIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaDNLcXV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDA4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0loM0twT3g0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWgzS3BleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaDNLcHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0loM0twLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0loM0txLXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEyOSIgeT0iMTAiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWgzS3NPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwOSIgZWxlbWVudD0iX0loM0tyT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaDlSTU94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDA4Ii8+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0loOVJNZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWgzS3NleDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JaDNLc3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0loM0tzLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWgzS3RPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWg5Uk11eDRFZHUyT282cS1uSFdnZyIgeD0iLTEiIHk9Ii0xIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpQYWdlU3R5bGUiIHhtaTppZD0iX0lmUndvZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpHdWlkZVN0eWxlIiB4bWk6aWQ9Il9JZlJ3b3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWZSd28teDRFZHUyT282cS1uSFdnZyIvPgotICA8L25vdGF0aW9uOkRpYWdyYW0+Ci0gIDxvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpBY3Rpdml0eURldGFpbERpYWdyYW0geG1pOmlkPSJfSWlWcjBPeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHkiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZUTBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlVGFza0NvbXBvc2l0ZSIgeG1pOmlkPSJfSWlWcjBleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lTRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZU5vZGUiIHhtaTppZD0iX0lpVnIwdXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlJvbGUgQTEiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lTRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlRhc2tOb2RlIiB4bWk6aWQ9Il9JaVZyMC14NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSWlWcjF1eDRFZHUyT282cS1uSFdnZyIgbmFtZT0iVGFzayBBMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZU1VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JaVZyMU94NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JaVZyMmV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWlWcjFleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lTVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JaVZyMXV4NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JaVZyMC14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lpVnIxLXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZb1VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JaVZyMk94NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WW5rQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lpVnIyZXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JaVZyMU94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVNVQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JaVZyMnV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEExIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbjBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlVGFza0NvbXBvc2l0ZSIgeG1pOmlkPSJfSWlWcjIteDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lrMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZU5vZGUiIHhtaTppZD0iX0lpVnIzT3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlJvbGUgQjEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WWswQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6VGFza05vZGUiIHhtaTppZD0iX0lpVnIzZXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JaVZyNE94NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJUYXNrIEIxIHByZXNuZXQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lSMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0lpVnIzdXg0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0lpVnI0dXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JaVZyMy14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVIwQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0lpVnI0T3g0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0lpVnIzZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWlWcjRleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQjEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1luVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JaVZyNHV4NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSWlWcjN1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lSMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWlWcjQteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBCMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WWxVQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZVRhc2tDb21wb3NpdGUiIHhtaTppZD0iX0lpVnI1T3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbDBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVOb2RlIiB4bWk6aWQ9Il9JaVZyNWV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJSb2xlIEIyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lsMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlRhc2tOb2RlIiB4bWk6aWQ9Il9JaVZyNXV4NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSWlWcjZleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iVGFzayBCMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZUkVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JaVZyNS14NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JaVZyNi14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWlWcjZPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lSRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JaVZyNmV4NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JaVZyNXV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lpVnI2dXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZUWtBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWlWcjYteDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lpVnI1LXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjIiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZUkVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lpVnI3T3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lsa0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVUYXNrQ29tcG9zaXRlIiB4bWk6aWQ9Il9JaVZyN2V4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WW1VQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlTm9kZSIgeG1pOmlkPSJfSWlWcjd1eDRFZHUyT282cS1uSFdnZyIgbmFtZT0iUm9sZSBBMiAiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1ltVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlRhc2tOb2RlIiB4bWk6aWQ9Il9JaVZyNy14NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSWlWcjh1eDRFZHUyT282cS1uSFdnZyIgbmFtZT0iVGFzayBBMiAiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lSa0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0lpVnI4T3g0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0lpVnI5T3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JaVZyOGV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVJrQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0lpVnI4dXg0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0lpVnI3LXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWlWcjgteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lrRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JaVZyOU94NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSWlWcjhPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lSa0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWlWcjlleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WWowQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSWlWcjl1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iQUREIiBlbGVtZW50PSJfSWlWcjBPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQWN0MSIgbWVhc3VyZW1lbnRVbml0PSJQaXhlbCI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaVZyLXV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWlWcjBleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lpVnItLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWlWcl9PeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaVZyX2V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lpVnJfdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lpVnNBT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaVZzQWV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWlWcjFleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lpVnNBdXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWlWc0EteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaVZzQk94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lpVnNCZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lpVnNCLXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaVZzQ094NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWlWcjJleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lpVnNDZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWlWc0N1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaVZzQy14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lpVnNET3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lpVnNEdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaVZzRC14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWlWcjIteDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lpVnNFT3g0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWlWc0VleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaVZzRXV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lpVnNFLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lpVnNGZXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjIwIiB5PSI4OCIgd2lkdGg9IjE5NiIgaGVpZ2h0PSI1MyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaVZzRnV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWlWcjMteDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lpVnNGLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWlWc0dPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaVZzR2V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lpVnNHdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lpVnNIT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEzMCIgeT0iMSIgd2lkdGg9IjczIiBoZWlnaHQ9IjY3Ii8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lpVnNIZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDIiIGVsZW1lbnQ9Il9JaVZyNHV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWlWc0h1eDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JaVZzSC14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lpVnNJT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWlWc0lleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWlieVVPeDRFZHUyT282cS1uSFdnZyIgeD0iMTMwIiB5PSIxNjEiIHdpZHRoPSI3MyIgaGVpZ2h0PSIxMTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWlieVVleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lpVnI1T3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JaWJ5VXV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lpYnlVLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWlieVZPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JaWJ5VmV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JaWJ5Vi14NEVkdTJPbzZxLW5IV2dnIiB4PSIyMCIgeT0iNDAwIiB3aWR0aD0iMTk2IiBoZWlnaHQ9IjUzIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lpYnlXT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDIiIGVsZW1lbnQ9Il9JaVZyNk94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWlieVdleDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JaWJ5V3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lpYnlXLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWlieVhPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWlieVh1eDRFZHUyT282cS1uSFdnZyIgeD0iMTMwIiB5PSIzMTMiIHdpZHRoPSI3MyIgaGVpZ2h0PSI2NyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaWJ5WC14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWlWcjYteDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lpYnlZT3g0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWlieVlleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaWJ5WXV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lpYnlZLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lpYnlaZXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEzMCIgeT0iNDczIiB3aWR0aD0iNzMiIGhlaWdodD0iMTExIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lpYnladXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JaVZyN2V4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWlieVoteDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JaWJ5YU94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lpYnlhZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWlieWF1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWlieWJPeDRFZHUyT282cS1uSFdnZyIgeD0iLTEiIHk9Ii0xIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lpYnliZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDIiIGVsZW1lbnQ9Il9JaVZyOGV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWlieWJ1eDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JaWJ5Yi14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lpYnljT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWlieWNleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWlieWMteDRFZHUyT282cS1uSFdnZyIgeD0iLTEiIHk9Ii0xIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lpYnlkT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDIiIGVsZW1lbnQ9Il9JaVZyOU94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWlieWRleDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JaWJ5ZHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lpYnlkLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWlieWVPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWlieWV1eDRFZHUyT282cS1uSFdnZyIgeD0iLTEiIHk9Ii0xIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpQYWdlU3R5bGUiIHhtaTppZD0iX0lpVnI5LXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpHdWlkZVN0eWxlIiB4bWk6aWQ9Il9JaVZyLU94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWlWci1leDRFZHUyT282cS1uSFdnZyIvPgotICA8L25vdGF0aW9uOkRpYWdyYW0+Ci0gIDxvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIHhtaTppZD0iX0lqU3Q4T3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyIvPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3ROb2RlIiB4bWk6aWQ9Il9JalN0OGV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiB0eXBlPSIxIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lua0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3ROb2RlIiB4bWk6aWQ9Il9JalN0OHV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1ltRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3ROb2RlIiB4bWk6aWQ9Il9JalN0OC14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHR5cGU9IjMiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WW4wQTVFZHFGcUl1OC1ja29sZyIvPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdE5vZGUiIHhtaTppZD0iX0lqU3Q5T3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFydGlmYWN0IEIxIHByZXNlbnQiIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WW5VQTVFZHFGcUl1OC1ja29sZyIvPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdE5vZGUiIHhtaTppZD0iX0lqU3Q5ZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkRlbGl2ZXJhYmxlIEIxIHByZXNlbnQiIHR5cGU9IjIiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WW9FQTVFZHFGcUl1OC1ja29sZyIvPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdE5vZGUiIHhtaTppZD0iX0lqU3Q5dXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9Ik91dGNvbWUgQjEgcHJlc2VudCIgdHlwZT0iMyI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbFVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Tm9kZSIgeG1pOmlkPSJfSWpTdDkteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZUWtBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Tm9kZSIgeG1pOmlkPSJfSWpTdC1PeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iRGVsaXZlcmFibGUgQjIgcHJlc2VudCIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbEVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Tm9kZSIgeG1pOmlkPSJfSWpTdC1leDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50IiB0eXBlPSIzIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lsa0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3ROb2RlIiB4bWk6aWQ9Il9JalN0LXV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiB0eXBlPSIxIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lrRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3ROb2RlIiB4bWk6aWQ9Il9JalN0LS14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJEZWxpdmVyYWJsZSBBMiBwcmVzZW50IiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1ltMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3ROb2RlIiB4bWk6aWQ9Il9JalN0X094NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHR5cGU9IjMiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WWowQTVFZHFGcUl1OC1ja29sZyIvPgotICAgIDwvbm9kZXM+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSWpZMGtPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iV1BERCIgZWxlbWVudD0iX0lqU3Q4T3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFjdDEiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWplN01PeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lqU3Q4ZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JamxCME94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqbEIwZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWplN01leDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JamU3TXV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lqZTdNLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWplN05PeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWpsQjB1eDRFZHUyT282cS1uSFdnZyIgeD0iLTEiIHk9Ii0xIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqbEIwLXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JalN0OHV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpsQjJleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JamxCMnV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lqbEIxT3g0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWpsQjFleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JamxCMXV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lqbEIxLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lqbEIyLXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JamxCM094NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWpTdDgteDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqbEI0dXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpsQjQteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JamxCM2V4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lqbEIzdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWpsQjMteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JamxCNE94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JamxCNU94NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpsQjVleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lqU3Q5T3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJY094NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqckljZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWpsQjV1eDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JamxCNS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lqbEI2T3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWpsQjZleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWpySWN1eDRFZHUyT282cS1uSFdnZyIgeD0iMTAiIHk9IjEwIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqckljLXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JalN0OWV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpySWVleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJZXV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lqcklkT3g0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWpySWRleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JanJJZHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lqcklkLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lqckllLXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjE0MiIgeT0iMTAiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpySWZPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lqU3Q5dXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJZ3V4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqcklnLXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWpySWZleDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JanJJZnV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lqcklmLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWpySWdPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWpySWhPeDRFZHUyT282cS1uSFdnZyIgeD0iMjkxIiB5PSIxMCIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJaGV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWpTdDkteDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqcklpLXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpySWpPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JanJJaHV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lqckloLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWpySWlPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JanJJaWV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JanJJamV4NEVkdTJPbzZxLW5IV2dnIiB4PSI0MzAiIHk9IjEwIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqcklqdXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JalN0LU94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpySWxPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJbGV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lqcklqLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWpySWtPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JanJJa2V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lqcklrdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lqcklsdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjU2MiIgeT0iMTAiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpySWwteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lqU3QtZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJbmV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqckludXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWpySW1PeDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JanJJbWV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lqckltdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWpySW0teDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWp4UEVPeDRFZHUyT282cS1uSFdnZyIgeD0iNzExIiB5PSIxMCIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanhQRWV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWpTdC11eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqeFBGLXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWp4UEdPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JanhQRXV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lqeFBFLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWp4UEZPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JanhQRmV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JanhQR2V4NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWp4UEd1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lqU3QtLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanhQSU94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqeFBJZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWp4UEcteDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JanhQSE94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lqeFBIZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWp4UEh1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWp4UEl1eDRFZHUyT282cS1uSFdnZyIgeD0iLTEiIHk9Ii0xIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqeFBJLXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JalN0X094NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWp4UEtleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanhQS3V4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lqeFBKT3g0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWp4UEpleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JanhQSnV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lqeFBKLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lqeFBLLXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246UGFnZVN0eWxlIiB4bWk6aWQ9Il9Jalkwa2V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246R3VpZGVTdHlsZSIgeG1pOmlkPSJfSWpZMGt1eDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lqWTBrLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgPC9ub3RhdGlvbjpEaWFncmFtPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBCMS9tb2RlbC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEIxL21vZGVsLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM0NDcwYi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEIxL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il81OXdDd0VBNUVkcUZxSXU4LWNrb2xnIiBndWlkPSJfNTl3Q3dFQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNTl3Q3dVQTVFZHFGcUl1OC1ja29sZyIgaWQ9Ii13eWJIS1VkbFhiREZHMEhPUGhBSjZRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IHhtaTppZD0iXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9IkNQIEIxIiBndWlkPSJfNTZ4blFFQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXzU2N1lRRUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9IkFjdDEiIGd1aWQ9Il81NjdZUUVBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHkiIHhtaTppZD0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciIG5hbWU9IkFjdDEiIGd1aWQ9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIiBwcmVzZW50YXRpb25OYW1lPSJBY3QxIiBzdXBlckFjdGl2aXRpZXM9Il81NjdZb2tBNUVkcUZxSXU4LWNrb2xnIiBicmVha2Rvd25FbGVtZW50cz0iXzU2N1lTVUE1RWRxRnFJdTgtY2tvbGcgXzU2N1lTRUE1RWRxRnFJdTgtY2tvbGcgXzU2N1ltVUE1RWRxRnFJdTgtY2tvbGcgXzU2N1lvVUE1RWRxRnFJdTgtY2tvbGcgXzU2N1lua0E1RWRxRnFJdTgtY2tvbGcgXzU2N1ltRUE1RWRxRnFJdTgtY2tvbGcgXzU2N1luMEE1RWRxRnFJdTgtY2tvbGcgXzU2N1lSMEE1RWRxRnFJdTgtY2tvbGcgXzU2N1lrMEE1RWRxRnFJdTgtY2tvbGcgXzU2N1lsMEE1RWRxRnFJdTgtY2tvbGcgXzU2N1luVUE1RWRxRnFJdTgtY2tvbGcgXzU2N1lvRUE1RWRxRnFJdTgtY2tvbGcgXzU2N1lsVUE1RWRxRnFJdTgtY2tvbGcgXzU2N1lSRUE1RWRxRnFJdTgtY2tvbGcgXzU2N1lRa0E1RWRxRnFJdTgtY2tvbGcgXzU2N1lsRUE1RWRxRnFJdTgtY2tvbGcgXzU2N1lsa0E1RWRxRnFJdTgtY2tvbGcgXzU2N1lSa0E1RWRxRnFJdTgtY2tvbGcgXzU2N1lrRUE1RWRxRnFJdTgtY2tvbGcgXzU2N1ltMEE1RWRxRnFJdTgtY2tvbGcgXzU2N1lqMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lTVUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9InRhc2tfQTEiIGd1aWQ9Il81NjdZU1VBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEExIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciIGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PSJfNTY3WW1VQTVFZHFGcUl1OC1ja29sZyIgbWFuZGF0b3J5SW5wdXQ9Il81NjdZb1VBNUVkcUZxSXU4LWNrb2xnIF81NjdZbmtBNUVkcUZxSXU4LWNrb2xnIiBvcHRpb25hbElucHV0PSJfNTY3WW1FQTVFZHFGcUl1OC1ja29sZyIgb3V0cHV0PSJfNTY3WW4wQTVFZHFGcUl1OC1ja29sZyIgcGVyZm9ybWVkUHJpbWFyaWx5Qnk9Il81NjdZU0VBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFRhc2sgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLVMxaWdMU2k2QUlfdmx1eldPQ3U2VHcjX3R2RjRNQkJQRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLVMxaWdMU2k2QUlfdmx1eldPQ3U2VHcjX3R6a0lnQkJQRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLVMxaWdMU2k2QUlfdmx1eldPQ3U2VHcjX3VDQmJRQkJQRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WVNFQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0icm9sZV9BMSIgZ3VpZD0iXzU2N1lTRUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciIHJlc3BvbnNpYmxlRm9yPSJfNTY3WW5rQTVFZHFGcUl1OC1ja29sZyBfNTY3WW1FQTVFZHFGcUl1OC1ja29sZyBfNTY3WW4wQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxSb2xlIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI181NXprMEEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1ltVUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9InJvbGVfQTIiIGd1aWQ9Il81NjdZbVVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEEyICIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxSb2xlIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI182azNVQUEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZb1VBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgZ3VpZD0iXzU2N1lvVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRjUxeXdBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WW5rQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQTEiIGd1aWQ9Il81NjdZbmtBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1ltRUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9ImRlbGl2ZXJhYmxlX0ExIiBndWlkPSJfNTY3WW1FQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEExIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciIGRlbGl2ZXJhYmxlUGFydHM9Il81NjdZUVVBNUVkcUZxSXU4LWNrb2xnIF81NjdZa2tBNUVkcUZxSXU4LWNrb2xnIF81NjdZbkVBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfSUlTblVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WW4wQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0ib3V0Y29tZV9BMSIgZ3VpZD0iXzU2N1luMEE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS0FfMVlBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WW5FQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQTEiIGd1aWQ9Il81NjdZbkVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lra0E1RWRxRnFJdTgtY2tvbGciIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBndWlkPSJfNTY3WWtrQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZUVVBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJvdXRjb21lX0ExIiBndWlkPSJfNTY3WVFVQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lSMEE1RWRxRnFJdTgtY2tvbGciIG5hbWU9InRhc2tfQjEiIGd1aWQ9Il81NjdZUjBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEIxIHByZXNuZXQiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciIGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PSJfNTY3WWwwQTVFZHFGcUl1OC1ja29sZyIgbWFuZGF0b3J5SW5wdXQ9Il81NjdZblVBNUVkcUZxSXU4LWNrb2xnIiBvcHRpb25hbElucHV0PSJfNTY3WW9FQTVFZHFGcUl1OC1ja29sZyIgb3V0cHV0PSJfNTY3WWxVQTVFZHFGcUl1OC1ja29sZyIgcGVyZm9ybWVkUHJpbWFyaWx5Qnk9Il81NjdZazBBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFRhc2sgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2ciLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLWxZanI2Vml0TDFWbm5GTk83OFh1WXcjX1Q0QXFBQjg0RWRxTnZlbHliRFhaRlEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLWxZanI2Vml0TDFWbm5GTk83OFh1WXcjX1Q1OGpzQjg0RWRxTnZlbHliRFhaRlEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLWxZanI2Vml0TDFWbm5GTk83OFh1WXcjX1Q4VkpVQjg0RWRxTnZlbHliRFhaRlEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WWswQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0icm9sZV9CMSIgZ3VpZD0iXzU2N1lrMEE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQjEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyIgcmVzcG9uc2libGVGb3I9Il81NjdZblVBNUVkcUZxSXU4LWNrb2xnIF81NjdZb0VBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX0E5RFlnQjhQRWRxc2hNTlNJMDdYT2ciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WWwwQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0icm9sZV9CMiIgZ3VpZD0iXzU2N1lsMEE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQjIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxSb2xlIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19LQ01fSUI4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZblVBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJhcnRpZmFjdF9CMSIgZ3VpZD0iXzU2N1luVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfbXFKM0FCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WW9FQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0iZGVsaXZlcmFibGVfQjEiIGd1aWQ9Il81NjdZb0VBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQjEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyIgZGVsaXZlcmFibGVQYXJ0cz0iXzU2N1lTMEE1RWRxRnFJdTgtY2tvbGcgXzU2N1lURUE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19aSGYyWUI4bkVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZbFVBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJvdXRjb21lX0IxIiBndWlkPSJfNTY3WWxVQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19jWFhyc0I4bkVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZUzBBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJhcnRpZmFjdF9CMSIgZ3VpZD0iXzU2N1lTMEE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMSBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfbXFKM0FCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WVRFQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0ib3V0Y29tZV9CMSIgZ3VpZD0iXzU2N1lURUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjEgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfY1hYcnNCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZUkVBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJ0YXNrX0IyIiBndWlkPSJfNTY3WVJFQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBCMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iXzU2N1lrMEE1RWRxRnFJdTgtY2tvbGciIG1hbmRhdG9yeUlucHV0PSJfNTY3WVFrQTVFZHFGcUl1OC1ja29sZyIgb3B0aW9uYWxJbnB1dD0iXzU2N1lsRUE1RWRxRnFJdTgtY2tvbGciIG91dHB1dD0iXzU2N1lsa0E1RWRxRnFJdTgtY2tvbGciIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfNTY3WWwwQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxUYXNrIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1KM3owSUdmamVoaXQwdUZiVEpjYTdnI19vcVlzd0I4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1KM3owSUdmamVoaXQwdUZiVEpjYTdnI19xdVFwQUI4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1KM3owSUdmamVoaXQwdUZiVEpjYTdnI19xeXU1VUI4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZUWtBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJhcnRpZmFjdF9CMiIgZ3VpZD0iXzU2N1lRa0E1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfX3lHN2NCOG1FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WWxFQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0iZGVsaXZlcmFibGVfQjIiIGd1aWQ9Il81NjdZbEVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQjIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyIgZGVsaXZlcmFibGVQYXJ0cz0iXzU2N1lrVUE1RWRxRnFJdTgtY2tvbGcgXzU2N1lta0E1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19ucUZXRUI4bkVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZbGtBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJvdXRjb21lX0IyIiBndWlkPSJfNTY3WWxrQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19hc0ZPa0I4bkVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZbWtBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJhcnRpZmFjdF9CMiIgZ3VpZD0iXzU2N1lta0E1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMiBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfX3lHN2NCOG1FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WWtVQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0ib3V0Y29tZV9CMiIgZ3VpZD0iXzU2N1lrVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfYXNGT2tCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZUmtBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJ0YXNrX0EyIiBndWlkPSJfNTY3WVJrQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMiAiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciIGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PSJfNTY3WVNFQTVFZHFGcUl1OC1ja29sZyIgbWFuZGF0b3J5SW5wdXQ9Il81NjdZa0VBNUVkcUZxSXU4LWNrb2xnIiBvcHRpb25hbElucHV0PSJfNTY3WW0wQTVFZHFGcUl1OC1ja29sZyIgb3V0cHV0PSJfNTY3WWowQTVFZHFGcUl1OC1ja29sZyIgcGVyZm9ybWVkUHJpbWFyaWx5Qnk9Il81NjdZbVVBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFRhc2sgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLTEzcThKSkFhMGl4NnJETVpBcXd5MXcjX3RpMkJZQkJPRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLTEzcThKSkFhMGl4NnJETVpBcXd5MXcjX3RrN3NFQkJPRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLTEzcThKSkFhMGl4NnJETVpBcXd5MXcjX3RuZGJvQkJPRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lrRUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9ImFydGlmYWN0X0EyIiBndWlkPSJfNTY3WWtFQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19FN1owa0EtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZbTBBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJkZWxpdmVyYWJsZV9BMiIgZ3VpZD0iXzU2N1ltMEE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIiBkZWxpdmVyYWJsZVBhcnRzPSJfNTY3WVJVQTVFZHFGcUl1OC1ja29sZyBfNTY3WVNrQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0pCcWZVQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lqMEE1RWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQTIiIGd1aWQ9Il81NjdZajBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0t2THhFQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lTa0E1RWRxRnFJdTgtY2tvbGciIG5hbWU9ImFydGlmYWN0X0EyIiBndWlkPSJfNTY3WVNrQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19FN1owa0EtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZUlVBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJvdXRjb21lX0EyIiBndWlkPSJfNTY3WVJVQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxkaWFncmFtcyB4bWk6aWQ9Il9yYXhGQUVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfcmF4RkFFQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9yYk5KNEVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfcmJOSjRFQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3JiTko0VUE2RWRxRnFJdTgtY2tvbGciIHg9IjEwLjAiIHk9IjEwLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9yYk5KNGtBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfcmJOSjRrQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lSMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9yYk5KNDBBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfcmJOSjVFQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3JiTko1RUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9yYk5KNVVBNkVkcUZxSXU4LWNrb2xnIiB4PSIxMjkuMCIgeT0iMTAuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3JiTko1a0E2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9yYk5KNWtBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WVJFQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3JiTko1MEE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3JheEZBVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9yYXhGQVVBNkVkcUZxSXU4LWNrb2xnIiBwcmVzZW50YXRpb249IldvcmtmbG93IiBlbGVtZW50PSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9kaWFncmFtcz4KLSAgICAgIDxkaWFncmFtcyB4bWk6aWQ9Il9zQWR6RUVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkekVFQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9zQWR6RVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkekVVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3NBZHpFa0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9zQWR6RTBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkekUwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lvVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9zQWR6RkVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfc0FkekZVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpGVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9zQWR6RmtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfc0FkekYwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpGMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZbmtBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfc0FkekdFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3NBZHpHVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6R1VBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfc0FkekdrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3NBZHpHMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6RzBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WW1FQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3NBZHpIRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9zQWR6SFVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkekhVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3NBZHpIa0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9zQWR6SDBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkekgwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1luMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9zQWR6SUVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfc0FkeklVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpJVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9zQWR6SWtBNkVkcUZxSXU4LWNrb2xnIiB4PSIxMC4wIiB5PSIxMC4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfc0FkekkwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpJMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZblVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfc0FkekpFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3NBZHpKVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6SlVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfc0FkekprQTZFZHFGcUl1OC1ja29sZyIgeD0iMTQyLjAiIHk9IjEwLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9zQWR6SjBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkekowQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lvRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9zQWR6S0VBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfc0FkektVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpLVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9zQWR6S2tBNkVkcUZxSXU4LWNrb2xnIiB4PSIyOTEuMCIgeT0iMTAuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3NBZHpLMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6SzBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WWxVQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3NBZHpMRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9zQWR6TFVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkekxVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3NBZHpMa0E2RWRxRnFJdTgtY2tvbGciIHg9IjQzMC4wIiB5PSIxMC4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfc0FkekwwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpMMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZUWtBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfc0Fkek1FQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3NBZHpNVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6TVVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfc0Fkek1rQTZFZHFGcUl1OC1ja29sZyIgeD0iNTYyLjAiIHk9IjEwLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9zQWR6TTBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0Fkek0wQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lsRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9zQWR6TkVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfc0Fkek5VQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpOVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9zQWR6TmtBNkVkcUZxSXU4LWNrb2xnIiB4PSI3MTEuMCIgeT0iMTAuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3NBZHpOMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6TjBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WWxrQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3NBZHpPRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9zQWR6T1VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0Fkek9VQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3NBZHpPa0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9zQWR6TzBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0Fkek8wQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lrRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9zQWR6UEVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfc0FkelBVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpQVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9zQWR6UGtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfc0FkelAwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpQMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZbTBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfc0FkelFFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3NBZHpRVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6UVVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfc0FkelFrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3NBZHpRMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6UTBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WWowQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3NBZHpSRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3NBZHpSVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6UlVBNkVkcUZxSXU4LWNrb2xnIiBwcmVzZW50YXRpb249IldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IiBlbGVtZW50PSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9kaWFncmFtcz4KLSAgICAgIDxkaWFncmFtcyB4bWk6aWQ9Il91MzVUTUVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VE1FQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUTVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VE1VQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRNa0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUTTBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VE0wQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lTVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUTkVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VE5VQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVROVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUTmtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VE4wQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVROMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZU0VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VE9FQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRPVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUT1VBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VE9rQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRPMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUTzBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WW1VQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRQRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUUFVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFBVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRQa0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUUDBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFAwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lvVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUUUVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VFFVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRRVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUUWtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VFEwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRRMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZbmtBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VFJFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRSVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUUlVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VFJrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRSMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUUjBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WW1FQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRTRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUU1VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFNVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRTa0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUUzBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFMwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1luMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUVEVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VFRVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRUVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUVGtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VFQwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRUMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZUjBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VFVFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRVVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUVVVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VFVrQTZFZHFGcUl1OC1ja29sZyIgeD0iMjAuMCIgeT0iODguMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRVMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUVTBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WWswQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRWRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSIxOTYuMCIgaGVpZ2h0PSI1My4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VFZVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRWVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUVmtBNkVkcUZxSXU4LWNrb2xnIiB4PSIyMC4wIiB5PSI0MDAuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRWMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUVjBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WWwwQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRXRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSIxOTYuMCIgaGVpZ2h0PSI1My4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VFdVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRXVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUV2tBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VFcwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRXMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZblVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VFhFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRYVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUWFVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VFhrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRYMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUWDBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WW9FQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRZRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUWVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFlVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRZa0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUWTBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFkwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lsVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUWkVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VFpVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRaVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUWmtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VFowQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRaMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZUkVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VGFFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRhVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUYVVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VGFrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRhMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUYTBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WVFrQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRiRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUYlVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VGJVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRia0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUYjBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VGIwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lsRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUY0VBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VGNVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRjVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUY2tBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VGMwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRjMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZbGtBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VGRFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRkVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUZFVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VGRrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRkMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUZDBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WVJrQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRlRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUZVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VGVVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRla0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUZTBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VGUwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lrRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUZkVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VGZVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRmVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUZmtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VGYwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRmMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZbTBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VGdFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRnVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUZ1VBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VGdrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRnMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUZzBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WWowQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRoRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91NFZfSUVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTRWX0lFQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iX3U0Vl9JVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91NFZfSVVBNkVkcUZxSXU4LWNrb2xnIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTRWX0lrQTZFZHFGcUl1OC1ja29sZyIgeD0iMTMwLjAiIHk9IjEuMCIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il91NGZ3S1VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTRmd0tVQTZFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfdTRmd0tFQTZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfdTRmd0tFQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0ZndLRUE2RWRxRnFJdTgtY2tvbGciIGdyYXBoRWRnZT0iX3U0ZndLVUE2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91NFZfSTBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTRWX0kwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lSMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91NFZfSkVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iNzMuMCIgaGVpZ2h0PSI2Ny4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTRWX0pVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0Vl9KVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il91NFZfSmtBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTRWX0prQTZFZHFGcUl1OC1ja29sZyIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIi8+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3U0Vl9KMEE2RWRxRnFJdTgtY2tvbGciIHg9IjEzMC4wIiB5PSIxNjEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3U0Vl9LRUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91NFZfS0VBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WVIwQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3U0Vl9LVUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSI3My4wIiBoZWlnaHQ9IjExMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTRWX0trQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0Vl9La0E2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il91NFZfSzBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTRWX0swQTZFZHFGcUl1OC1ja29sZyIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3U0ZndJRUE2RWRxRnFJdTgtY2tvbGciIHg9IjEzMC4wIiB5PSIzMTMuMCIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il91NGZ3SzBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTRmd0swQTZFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfdTRmd0trQTZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfdTRmd0trQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0ZndLa0E2RWRxRnFJdTgtY2tvbGciIGdyYXBoRWRnZT0iX3U0ZndLMEE2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91NGZ3SVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTRmd0lVQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lSRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91NGZ3SWtBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iNzMuMCIgaGVpZ2h0PSI2Ny4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTRmd0kwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0ZndJMEE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il91NGZ3SkVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTRmd0pFQTZFZHFGcUl1OC1ja29sZyIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIi8+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3U0ZndKVUE2RWRxRnFJdTgtY2tvbGciIHg9IjEzMC4wIiB5PSI0NzMuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3U0ZndKa0E2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91NGZ3SmtBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WVJFQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3U0ZndKMEE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSI3My4wIiBoZWlnaHQ9IjExMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUaFVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VGhVQTZFZHFGcUl1OC1ja29sZyIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiIGVsZW1lbnQ9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L2RpYWdyYW1zPgotICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfNTZ4blFVQTVFZHFGcUl1OC1ja29sZyIgZ3VpZD0iXzU2eG5RVUE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfNTZ4blFrQTVFZHFGcUl1OC1ja29sZyIgZ3VpZD0iXzU2eG5Ra0E1RWRxRnFJdTgtY2tvbGciIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIiBlbGVtZW50PSJfNTY3WW9rQTVFZHFGcUl1OC1ja29sZyIvPgotICAgIDwvZGlhZ3JhbXM+Ci0gICAgPHByb2Nlc3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIHhtaTppZD0iXzU2N1lva0E1RWRxRnFJdTgtY2tvbGciIG5hbWU9IkNQIEIxIiBndWlkPSJfNTY3WW9rQTVFZHFGcUl1OC1ja29sZyIgcHJlc2VudGF0aW9uTmFtZT0iQ1AgQjEiIGJyZWFrZG93bkVsZW1lbnRzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXd5YkhLVWRsWGJERkcwSE9QaEFKNlEiIGhyZWY9InVtYTovLy13eWJIS1VkbFhiREZHMEhPUGhBSjZRIy13eWJIS1VkbFhiREZHMEhPUGhBSjZRIi8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9jYXBQYXRfQjEuMS9jb250ZW50LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvY2FwUGF0X0IxLjEvY29udGVudC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNzMyOTkuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9jYXBQYXRfQjEuMS9jb250ZW50LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItb0V1T2RlV0pjdEdmVE5ZVXo4MlpuZyIgbmFtZT0iY2FwUGF0X0IxLjEsX0lQZFo0UjgxRWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii1vRXVPZGVXSmN0R2ZUTllVejgyWm5nIi8+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL2NhcFBhdF9CMS4xL21vZGVsLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvY2FwUGF0X0IxLjEvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjZhNjMyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvY2FwUGF0X0IxLjEvbW9kZWwueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfSVRDU1VCODFFZHFnQklUdUlDTEpFdyIgZ3VpZD0iX0lUQ1NVQjgxRWRxZ0JJVHVJQ0xKRXciPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0lUQ1NVUjgxRWRxZ0JJVHVJQ0xKRXciIGlkPSItb0V1T2RlV0pjdEdmVE5ZVXo4MlpuZyIgdXJpPSJjb250ZW50LnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCB4bWk6aWQ9Il9JUGRaNEI4MUVkcWdCSVR1SUNMSkV3IiBuYW1lPSJjYXBQYXRfQjEuMSIgZ3VpZD0iX0lQZFo0QjgxRWRxZ0JJVHVJQ0xKRXciPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiB4bWk6aWQ9Il9JUGRaNFI4MUVkcWdCSVR1SUNMSkV3IiBuYW1lPSJjYXBQYXRfQjEuMSIgZ3VpZD0iX0lQZFo0UjgxRWRxZ0JJVHVJQ0xKRXciIHByZXNlbnRhdGlvbk5hbWU9ImNhcFBhdF9CMS4xIj4KLSAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItb0V1T2RlV0pjdEdmVE5ZVXo4MlpuZyIgaHJlZj0idW1hOi8vLW9FdU9kZVdKY3RHZlROWVV6ODJabmcjLW9FdU9kZVdKY3RHZlROWVV6ODJabmciLz4KLSAgICAgIDxkZWZhdWx0Q29udGV4dCBocmVmPSJ1bWE6Ly9fcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSNfcnJtQ0lCQWRFZHE3RnJjX3lNaFEtQSIvPgotICAgICAgPHZhbGlkQ29udGV4dCBocmVmPSJ1bWE6Ly9fcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSNfcnJtQ0lCQWRFZHE3RnJjX3lNaFEtQSIvPgotICAgIDwvcHJvY2Vzcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQ+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL2NhcFBhdF9CMS9jb250ZW50LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvY2FwUGF0X0IxL2NvbnRlbnQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZThjYWM4Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvY2FwUGF0X0IxL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1YODNLMW85YnNwbE5lMV9hX0tVMkZRIiBuYW1lPSJjYXBQYXRfQjEsX0U2RXljUjgxRWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii1YODNLMW85YnNwbE5lMV9hX0tVMkZRIi8+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL2NhcFBhdF9CMS9tb2RlbC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL2NhcFBhdF9CMS9tb2RlbC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiOTI4NzUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9jYXBQYXRfQjEvbW9kZWwueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfRThtaUFCODFFZHFnQklUdUlDTEpFdyIgZ3VpZD0iX0U4bWlBQjgxRWRxZ0JJVHVJQ0xKRXciPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0U4d1RBQjgxRWRxZ0JJVHVJQ0xKRXciIGlkPSItWDgzSzFvOWJzcGxOZTFfYV9LVTJGUSIgdXJpPSJjb250ZW50LnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCB4bWk6aWQ9Il9FNkV5Y0I4MUVkcWdCSVR1SUNMSkV3IiBuYW1lPSJjYXBQYXRfQjEiIGd1aWQ9Il9FNkV5Y0I4MUVkcWdCSVR1SUNMSkV3Ij4KLSAgICA8cHJvY2VzcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgeG1pOmlkPSJfRTZFeWNSODFFZHFnQklUdUlDTEpFdyIgbmFtZT0iY2FwUGF0X0IxIiBndWlkPSJfRTZFeWNSODFFZHFnQklUdUlDTEpFdyIgcHJlc2VudGF0aW9uTmFtZT0iY2FwUGF0X0IxIj4KLSAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItWDgzSzFvOWJzcGxOZTFfYV9LVTJGUSIgaHJlZj0idW1hOi8vLVg4M0sxbzlic3BsTmUxX2FfS1UyRlEjLVg4M0sxbzlic3BsTmUxX2FfS1UyRlEiLz4KLSAgICAgIDxkZWZhdWx0Q29udGV4dCBocmVmPSJ1bWE6Ly9fcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSNfcnJtQ0lCQWRFZHE3RnJjX3lNaFEtQSIvPgotICAgICAgPHZhbGlkQ29udGV4dCBocmVmPSJ1bWE6Ly9fcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSNfcnJtQ0lCQWRFZHE3RnJjX3lNaFEtQSIvPgotICAgIDwvcHJvY2Vzcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQ+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjEuMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjEuMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZGVhM2EuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2N1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IxLjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1ZemNLYVQzR1laWFJrWTNaTXJfbVJnIiBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQjEuMSxfWGZUZG9CODBFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLVl6Y0thVDNHWVpYUmtZM1pNcl9tUmciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MTQ6NDQuMDc4LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkN1c3RvbSBDYXRlZ29yeSBCMS4xIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPkN1c3RvbSBDYXRlZ29yeSBCMS4xIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2N1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYmRlMzUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2N1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItV1BxaHhVcHg0dUc2V3lyNVVqZm9pZyIgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0IxLF8zRVNaUUI4eUVkcWdCSVR1SUNMSkV3IiBndWlkPSItV1BxaHhVcHg0dUc2V3lyNVVqZm9pZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNzowNTo0MC42NDEtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Q3VzdG9tIENhdGVnb3J5IEIxIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPkN1c3RvbSBDYXRlZ29yeSBCMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjFmMmE3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLThYZlBtdDU1SE5CVlV5X2ZXU3ZONVEiIG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9CMixfM3NFeUFCOHlFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLThYZlBtdDU1SE5CVlV5X2ZXU3ZONVEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MDY6MTIuODEyLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkN1c3RvbSBDYXRlZ29yeSBCMiBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5DdXN0b20gQ2F0ZWdvcnkgQjIga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19CMS4xL2NvbnRlbnQueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQjEuMS9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY4NDMzNS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19CMS4xL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVZMQVhWaHFFWTJ0VTcwRVNaWnY3RmciIG5hbWU9ImRlbFByb2NfQjEuMSxfVjBWN01SODFFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLVZMQVhWaHFFWTJ0VTcwRVNaWnY3RmciLz4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0IxLjEvbW9kZWwueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQjEuMS9tb2RlbC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjkxYTMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQjEuMS9tb2RlbC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9WM0xNd0I4MUVkcWdCSVR1SUNMSkV3IiBndWlkPSJfVjNMTXdCODFFZHFnQklUdUlDTEpFdyI+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfVjNMTXdSODFFZHFnQklUdUlDTEpFdyIgaWQ9Ii1WTEFYVmhxRVkydFU3MEVTWlp2N0ZnIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IHhtaTppZD0iX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXciIG5hbWU9ImRlbFByb2NfQjEuMSIgZ3VpZD0iX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXciPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJ5UHJvY2VzcyIgeG1pOmlkPSJfVjBWN01SODFFZHFnQklUdUlDTEpFdyIgbmFtZT0iZGVsUHJvY19CMS4xIiBndWlkPSJfVjBWN01SODFFZHFnQklUdUlDTEpFdyIgcHJlc2VudGF0aW9uTmFtZT0iZGVsUHJvY19CMS4xIj4KLSAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItVkxBWFZocUVZMnRVNzBFU1padjdGZyIgaHJlZj0idW1hOi8vLVZMQVhWaHFFWTJ0VTcwRVNaWnY3RmcjLVZMQVhWaHFFWTJ0VTcwRVNaWnY3RmciLz4KLSAgICAgIDxkZWZhdWx0Q29udGV4dCBocmVmPSJ1bWE6Ly9fcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSNfcnJtQ0lCQWRFZHE3RnJjX3lNaFEtQSIvPgotICAgICAgPHZhbGlkQ29udGV4dCBocmVmPSJ1bWE6Ly9fcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSNfcnJtQ0lCQWRFZHE3RnJjX3lNaFEtQSIvPgotICAgIDwvcHJvY2Vzcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQ+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19CMS9jb250ZW50LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0IxL2NvbnRlbnQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTI2MTZlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0IxL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWNkUkNDQ0YxMVZoN1JJSWVKX2tmNHciIG5hbWU9ImRlbFByb2NfQjEsX1JmeHVzUjgxRWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii1jZFJDQ0NGMTFWaDdSSUllSl9rZjR3Ii8+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19CMS9tb2RlbC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19CMS9tb2RlbC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNzBkZmMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQjEvbW9kZWwueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfUmlLVVVCODFFZHFnQklUdUlDTEpFdyIgZ3VpZD0iX1JpS1VVQjgxRWRxZ0JJVHVJQ0xKRXciPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1JpS1VVUjgxRWRxZ0JJVHVJQ0xKRXciIGlkPSItY2RSQ0NDRjExVmg3UklJZUpfa2Y0dyIgdXJpPSJjb250ZW50LnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCB4bWk6aWQ9Il9SZnh1c0I4MUVkcWdCSVR1SUNMSkV3IiBuYW1lPSJkZWxQcm9jX0IxIiBndWlkPSJfUmZ4dXNCODFFZHFnQklUdUlDTEpFdyI+Ci0gICAgPHByb2Nlc3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcnlQcm9jZXNzIiB4bWk6aWQ9Il9SZnh1c1I4MUVkcWdCSVR1SUNMSkV3IiBuYW1lPSJkZWxQcm9jX0IxIiBndWlkPSJfUmZ4dXNSODFFZHFnQklUdUlDTEpFdyIgcHJlc2VudGF0aW9uTmFtZT0iZGVsUHJvY19CMSI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWNkUkNDQ0YxMVZoN1JJSWVKX2tmNHciIGhyZWY9InVtYTovLy1jZFJDQ0NGMTFWaDdSSUllSl9rZjR3Iy1jZFJDQ0NGMTFWaDdSSUllSl9rZjR3Ii8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2Rpc2NpcGxpbmVncm91cGluZ3MvZGlzY2lwbGluZV9ncm91cGluZ19CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGlzY2lwbGluZWdyb3VwaW5ncy9kaXNjaXBsaW5lX2dyb3VwaW5nX0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY3YzJhNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGlzY2lwbGluZWdyb3VwaW5ncy9kaXNjaXBsaW5lX2dyb3VwaW5nX0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItNnJ2bTN1dnpxSTB5OGgtMVB2VmY3QSIgbmFtZT0iZGlzY2lwbGluZV9ncm91cGluZ19CMSxfU1pNeFlCOHlFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLTZydm0zdXZ6cUkweThoLTFQdlZmN0EiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MDA6MTkuMzEyLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkRpc2NpcGxpbmUgR3JvdXBpbmcgQjEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RGlzY2lwbGluZSBHcm91cGluZyBCMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEyNjY5NS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGlzY2lwbGluZXMvZGlzY2lwbGluZV9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUZlZkptYUJNVW5QRkxaaDlGU3VfOWciIG5hbWU9ImRpc2NpcGxpbmVfQjEsX2NZNTd3Qjh5RWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii1GZWZKbWFCTVVuUEZMWmg5RlN1XzlnIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE3OjAwOjU3LjcxOS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5EaXNjaXBsaW5lIEIxIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPkRpc2NpcGxpbmUgQjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGlzY2lwbGluZXMvZGlzY2lwbGluZV9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGlzY2lwbGluZXMvZGlzY2lwbGluZV9CMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMDRjMTkuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1oRTVOVlB6TUJjZnZYVk80dWxvMXJBIiBuYW1lPSJkaXNjaXBsaW5lX0IyLF9oOWZsc0I4eUVkcWdCSVR1SUNMSkV3IiBndWlkPSItaEU1TlZQek1CY2Z2WFZPNHVsbzFyQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNzowMTozNC4yNTAtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgRGlzY2lwbGluZSBCMiBtYWluCi0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5EaXNjaXBsaW5lIEIyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RvbWFpbnMvZG9tYWluX0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kb21haW5zL2RvbWFpbl9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhOTc0OGIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RvbWFpbnMvZG9tYWluX0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSIta0Zqa3hvZ0o0akFPei1nV1FQc3FMQSIgbmFtZT0iZG9tYWluX0IxLF9tZHJ6WUI4eUVkcWdCSVR1SUNMSkV3IiBndWlkPSIta0Zqa3hvZ0o0akFPei1nV1FQc3FMQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNzowMjowNC43ODEtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+RG9tYWluIEIxIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPkRvbWFpbiBCMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kb21haW5zL2RvbWFpbl9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZG9tYWlucy9kb21haW5fQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGRhZjFkLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kb21haW5zL2RvbWFpbl9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVVqYVZvM295bEx0bU9iVzFlMjV0dHciIG5hbWU9ImRvbWFpbl9CMixfcmFvT2dCOHlFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLVVqYVZvM295bEx0bU9iVzFlMjV0dHciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MDI6MzcuNzUwLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkRvbWFpbiBCMiBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Eb21haW4gQjIga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvY2hlY2tsaXN0cy9jaGVja2xpc3RfQjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjExZTY1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvY2hlY2tsaXN0cy9jaGVja2xpc3RfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1HYWktMHZDbnFCMFdnS2NrMWJtbnB3IiBuYW1lPSJjaGVja2xpc3RfQjEsX3VyTGRjQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1HYWktMHZDbnFCMFdnS2NrMWJtbnB3IiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjI3OjIyLjY1Ni0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5DaGVja2xpc3QgQjEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvY2hlY2tsaXN0cy9jaGVja2xpc3RfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9jaGVja2xpc3RzL2NoZWNrbGlzdF9CMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MTNiZDIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9jaGVja2xpc3RzL2NoZWNrbGlzdF9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVc3d0RIVmVJUUVEUDU5ZTlENDFLdXciIG5hbWU9ImNoZWNrbGlzdF9CMixfd0V1cVVCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLVc3d0RIVmVJUUVEUDU5ZTlENDFLdXciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6Mjg6MDQuMjgxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkNoZWNrbGlzdCBCMiBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNzJkNWUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItbi1IV1ppS2ZYcTlSUlJLZUZPQjBVQSIgbmFtZT0iY29uY2VwdF9CMSxfdzZFOThCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLW4tSFdaaUtmWHE5UlJSS2VGT0IwVUEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6MTY6MDEuNzM0LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkNvbmNlcHQgQjEgY29udGV4dDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTViZmY1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTZMcE9naWNXU2h3MkNkQmhWWkhxMHciIG5hbWU9ImNvbmNlcHRfQjIsX3huRk40QjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii02THBPZ2ljV1NodzJDZEJoVlpIcTB3IiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjE2OjI3LjgxMi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Db25jZXB0IEIyIGNvbnRleHQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2V4YW1wbGVzL2V4YW1wbGVfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAwOTgwNC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2V4YW1wbGVzL2V4YW1wbGVfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItYkQtMmlFR1JoZEw3dWhrOVZnWTFpUSIgbmFtZT0iZXhhbXBsZV9CMSxfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLWJELTJpRUdSaGRMN3VoazlWZ1kxaVEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6Mjg6MzcuNTc4LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkV4YW1wbGUgQjEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2V4YW1wbGVzL2V4YW1wbGVfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUxMzRiYy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2V4YW1wbGVzL2V4YW1wbGVfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItT2RrUU43Z3lVemRiLWxWNUtIUXM5QSIgbmFtZT0ibmV3X2V4YW1wbGVfQjIsX3pBb2F3QjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1PZGtRTjdneVV6ZGItbFY1S0hRczlBIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjI5OjE4LjA5NC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5FeGFtcGxlIEIyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9ndWlkZWxpbmVzL2d1aWRlbGluZV9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2d1aWRlbGluZXMvZ3VpZGVsaW5lX0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM2MDI1YS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2d1aWRlbGluZXMvZ3VpZGVsaW5lX0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItMGkzRExDb2FJNHhoV19zMzRMcDdKdyIgbmFtZT0iZ3VpZGVsaW5lX0IxLF96a1pQSUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSItMGkzRExDb2FJNHhoV19zMzRMcDdKdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjozNzo1NS4xODgtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+R3VpZGVsaW5lIEIxIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2d1aWRlbGluZXMvZ3VpZGVsaW5lX0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvZ3VpZGVsaW5lcy9ndWlkZWxpbmVfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWFlYmY3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvZ3VpZGVsaW5lcy9ndWlkZWxpbmVfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1heEtSR0xHeGJ2M0ZFMkhIbUVicWR3IiBuYW1lPSJndWlkZWxpbmVfQjIsXzBRZ3VRQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1heEtSR0xHeGJ2M0ZFMkhIbUVicWR3IiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjQ2OjU0LjQzOC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5HdWlkZWxpbmUgQjIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0IxLjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQjEuMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMmRmZjguLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQjEuMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItZ1Z2QjBQeFJLNzVNeG9PZG05MzBfdyIgbmFtZT0icHJhY3RpY2VfQjEuMSxfMnZNLVFCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLWdWdkIwUHhSSzc1TXhvT2RtOTMwX3ciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6NDM6NDguMTcyLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlByYWN0aWNlIEIxLjEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotICA8YWRkaXRpb25hbEluZm8+UHJhY3RpY2UgQjEuMSBhZGQ8L2FkZGl0aW9uYWxJbmZvPgotICA8cHJvYmxlbT5QcmFjdGljZSBCMS4xIHByb2I8L3Byb2JsZW0+Ci0gIDxiYWNrZ3JvdW5kPlByYWN0aWNlIEIxLjEgYmFjazwvYmFja2dyb3VuZD4KLSAgPGdvYWxzPlByYWN0aWNlIEIxLjEgZ29hbDwvZ29hbHM+Ci0gIDxhcHBsaWNhdGlvbj5QcmFjdGljZSBCMS4xIGFwcDwvYXBwbGljYXRpb24+Ci0gIDxsZXZlbHNPZkFkb3B0aW9uPlByYWN0aWNlIEIxLjEgbGV2ZWw8L2xldmVsc09mQWRvcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlkNjZkMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSIteU5zS3d3UDhCWmZzMTJQYlpBNUFlUSIgbmFtZT0icHJhY3RpY2VfQjEsXzFJLW5VQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii15TnNLd3dQOEJaZnMxMlBiWkE1QWVRIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjQyOjAwLjA0Ny0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5QcmFjdGljZSBCMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxhZGRpdGlvbmFsSW5mbz5QcmFjdGljZSBCMSBhZGQ8L2FkZGl0aW9uYWxJbmZvPgotICA8cHJvYmxlbT5QcmFjdGljZSBCMSBwcm9iPC9wcm9ibGVtPgotICA8YmFja2dyb3VuZD5QcmFjdGljZSBCMSBiYWNrPC9iYWNrZ3JvdW5kPgotICA8Z29hbHM+UHJhY3RpY2UgQjEgZ29hbDwvZ29hbHM+Ci0gIDxhcHBsaWNhdGlvbj5QcmFjdGljZSBCMSBhcHA8L2FwcGxpY2F0aW9uPgotICA8bGV2ZWxzT2ZBZG9wdGlvbj5QcmFjdGljZSBCMSBsZXZlbDwvbGV2ZWxzT2ZBZG9wdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcmFjdGljZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjBhMDIwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcmFjdGljZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1EeGxNdHZLaXVWSHUta3RaMlUyWlRBIiBuYW1lPSJwcmFjdGljZV9CMixfNGkxZkVCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLUR4bE10dktpdVZIdS1rdFoyVTJaVEEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6NDA6NTAuNzM0LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlByYWN0aWNlIEIyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLSAgPGFkZGl0aW9uYWxJbmZvPlByYWN0aWNlIEIyIGFkZDwvYWRkaXRpb25hbEluZm8+Ci0gIDxwcm9ibGVtPlByYWN0aWNlIEIyIHByb2I8L3Byb2JsZW0+Ci0gIDxiYWNrZ3JvdW5kPlByYWN0aWNlIEIyIGJhY2s8L2JhY2tncm91bmQ+Ci0gIDxnb2Fscz5QcmFjdGljZSBCMiBnb2FsPC9nb2Fscz4KLSAgPGFwcGxpY2F0aW9uPlByYWN0aWNlJmFtcDtuYnNwOyBhcHA8L2FwcGxpY2F0aW9uPgotICA8bGV2ZWxzT2ZBZG9wdGlvbj5QcmFjdGljZSBCMiBsZXZlbDwvbGV2ZWxzT2ZBZG9wdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcmFjdGljZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3JlcG9ydHMvcmVwb3J0X0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE2Y2FkMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3JlcG9ydHMvcmVwb3J0X0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItNmlNT1hLamhQVE1xcGFnNTRiUTN3dyIgbmFtZT0icmVwb3J0X0IxLF81a2phd0I4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSItNmlNT1hLamhQVE1xcGFnNTRiUTN3dyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjozODozOC4zOTEtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+UmVwb3J0IEIxIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3JlcG9ydHMvcmVwb3J0X0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcmVwb3J0cy9yZXBvcnRfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDgzYzNhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcmVwb3J0cy9yZXBvcnRfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii11NURhOEx4ZlFSaEg2TGg1Y3ZfYlpBIiBuYW1lPSJyZXBvcnRfQjIsXzZPdVpJQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii11NURhOEx4ZlFSaEg2TGg1Y3ZfYlpBIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjM5OjA3LjY1Ni0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5SZXBvcnQgQjIgY29udGV4dDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcmV1c2FibGVhc3NldHMvcmV1c2FibGVfYXNzZXRfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMDQ1MzIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1lX3BCRzNkOTA5TkIwT3ZuZlFvSjlBIiBuYW1lPSJyZXVzYWJsZV9hc3NldF9CMSxfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLWVfcEJHM2Q5MDlOQjBPdm5mUW9KOUEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6NDY6MTkuMjUwLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJldXNhYmxlIEFzc2V0IEIxIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3JldXNhYmxlYXNzZXRzL3JldXNhYmxlX2Fzc2V0X0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM0ZDMyYi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3JldXNhYmxlYXNzZXRzL3JldXNhYmxlX2Fzc2V0X0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTBhMjNnLWFRaGNaclRIN3AycnR5QVEiIG5hbWU9InJldXNhYmxlX2Fzc2V0X0IyLF83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSItMGEyM2ctYVFoY1pyVEg3cDJydHlBUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjo0MDowMC4wMDAtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+UmV1c2FibGUgQXNzZXQgQjIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3JvYWRtYXBzL3JvYWRtYXBfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yb2FkbWFwcy9yb2FkbWFwX0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0MGEzNi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3JvYWRtYXBzL3JvYWRtYXBfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1lYUpacldlRlZjNFBFTUE5S3YxMERBIiBuYW1lPSJyb2FkbWFwX0IxLF84aFdqRUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSItZWFKWnJXZUZWYzRQRU1BOUt2MTBEQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjozNjowMi44MTItMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Um9hZG1hcCBCMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yb2FkbWFwcy9yb2FkbWFwX0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9CMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExM2JjZDMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yb2FkbWFwcy9yb2FkbWFwX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItM25RNUpnUElFMUptelFtVElaaEt0ZyIgbmFtZT0icm9hZG1hcF9CMixfLWd3UEFCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLTNuUTVKZ1BJRTFKbXpRbVRJWmhLdGciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6MzU6MzUuNzE5LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJvYWRtYXAgQjIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvc3VwcG9ydGluZ21hdGVyaWFscy9zdXBwb3J0aW5nX21hdGVyaWFsX0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvc3VwcG9ydGluZ21hdGVyaWFscy9zdXBwb3J0aW5nX21hdGVyaWFsX0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk2MTJkMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUpGaWp5LUU5dm5aNVFKWkpUMUFBMkEiIG5hbWU9InN1cHBvcnRpbmdfbWF0ZXJpYWxfQjEsX19iS28wQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1KRmlqeS1FOXZuWjVRSlpKVDFBQTJBIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjQ1OjMxLjIzNC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5TdXBwb3J0aW5nIE1hdGVyaWFsIEIxIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9CMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOWRlMzAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1pbGJOT2FxNjM1dkpHZWI2dWhDUFRBIiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0IyLF9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBndWlkPSItaWxiTk9hcTYzNXZKR2ViNnVoQ1BUQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjo0NDo1Mi4xNzItMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+U3VwcG9ydGluZyBNYXRlcmlhbCBCMiBDb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy90ZW1wbGF0ZXMvcmVzb3VyY2VzL1RlbXBsYXRlIGZvciBQYXN0ZSBUZXN0IENhc2VzLmRvYyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVtcGxhdGVzL3Jlc291cmNlcy9UZW1wbGF0ZSBmb3IgUGFzdGUgVGVzdCBDYXNlcy5kb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YTkwNzIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy90ZW1wbGF0ZXMvcmVzb3VyY2VzL1RlbXBsYXRlIGZvciBQYXN0ZSBUZXN0IENhc2VzLmRvYworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVtcGxhdGVzL3RlbXBsYXRlX0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVtcGxhdGVzL3RlbXBsYXRlX0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE0NzBhMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3RlbXBsYXRlcy90ZW1wbGF0ZV9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1lYTZkdzNCal9OZnBuVGZsMGhfN0hBIiBuYW1lPSJ0ZW1wbGF0ZV9CMSxfQzkwUU1COHNFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLWVhNmR3M0JqX05mcG5UZmwwaF83SEEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6MzY6NTEuMjgxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRlbXBsYXRlIEIxIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy90ZW1wbGF0ZXMvdGVtcGxhdGVfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy90ZW1wbGF0ZXMvdGVtcGxhdGVfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjhlMzExLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVtcGxhdGVzL3RlbXBsYXRlX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVRHaWpma0thbDQ4ZzA2cXRqSFZISmciIG5hbWU9InRlbXBsYXRlX0IyLF9ELXg5OEI4c0VkcVF2T2pYOGRvQ0N3IiBndWlkPSItVEdpamZrS2FsNDhnMDZxdGpIVkhKZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjoyNDo1NC42NDEtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+VGVtcGxhdGUgQjIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotICA8YXR0YWNobWVudHM+cmVzb3VyY2VzL1RlbXBsYXRlIGZvciBQYXN0ZSBUZXN0IENhc2VzLmRvYzwvYXR0YWNobWVudHM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3Rlcm1kZWZpbml0aW9ucy90ZXJtX2RlZmluaXRpb25fQjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzc3ZmY3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWQtNVFSajdxSm16bjYyQ0UtX0U2VUEiIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9CMSxfRXBzak1COHNFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLWQtNVFSajdxSm16bjYyQ0UtX0U2VUEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6MjM6NTUuNDg0LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRlcm0gRGVmaW5pdGlvbiBCMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy90ZXJtZGVmaW5pdGlvbnMvdGVybV9kZWZpbml0aW9uX0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9CMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMmU2YTIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy90ZXJtZGVmaW5pdGlvbnMvdGVybV9kZWZpbml0aW9uX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItcFNTeHRNTlA1aXN4b20xR2U5VEIzZyIgbmFtZT0idGVybV9kZWZpbml0aW9uX0IyLF9HRVM0OEI4c0VkcVF2T2pYOGRvQ0N3IiBndWlkPSItcFNTeHRNTlA1aXN4b20xR2U5VEIzZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjoyMzoxMC4zNTktMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgVGVybSBEZWZpbml0aW9uIEIyIGNvbnRlbnQKLSZsdDsvcCZndDs8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3Rvb2xtZW50b3JzL3Rvb2xtZW50b3JfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2ZGVmMy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3Rvb2xtZW50b3JzL3Rvb2xtZW50b3JfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii15aTBvOWdrVVVOMDZ6TmNDZjl0V0pBIiBuYW1lPSJ0b29sbWVudG9yX0IxLF9Hb0R0VUI4c0VkcVF2T2pYOGRvQ0N3IiBndWlkPSIteWkwbzlna1VVTjA2ek5jQ2Y5dFdKQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjoyMDozNC41MzEtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+VG9vbG1lbnRvciBCMSBjb250ZXh0PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdG9vbG1lbnRvcnMvdG9vbG1lbnRvcl9CMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NmFkNmIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItQnZuQWZHWERpYmNKTTRkXzdxV1hRUSIgbmFtZT0idG9vbG1lbnRvcl9CMixfSDRPVXNCOHNFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLUJ2bkFmR1hEaWJjSk00ZF83cVdYUVEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6MTk6NDQuMjAzLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRvb2xtZW50b3IgQjIgY29udGV4dDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvd2hpdGVwYXBlcnMvd2hpdGVwYXBlcl9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDBmOTM0Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvd2hpdGVwYXBlcnMvd2hpdGVwYXBlcl9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii02Q2RtNFM4QkE0VV9WYTVOVW9YWXN3IiBuYW1lPSJ3aGl0ZXBhcGVyX0IxLF9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IiBndWlkPSItNkNkbTRTOEJBNFVfVmE1TlVvWFlzdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjoxOTowNy4yODEtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+V2hpdGVwYXBlciBCMSBjb250ZXh0PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvd2hpdGVwYXBlcnMvd2hpdGVwYXBlcl9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjYxNjE2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvd2hpdGVwYXBlcnMvd2hpdGVwYXBlcl9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1qSTdObndHRkRTLXpKVy1qa3FKZE1BIiBuYW1lPSJ3aGl0ZXBhcGVyX0IyLF9KZHRFd0I4c0VkcVF2T2pYOGRvQ0N3IiBndWlkPSItakk3Tm53R0ZEUy16SlctamtxSmRNQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjoxODozNi44OTEtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+V2hpdGVwYXBlciBCMiBjb250ZXh0PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9wbHVnaW4ueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3BsdWdpbi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYjMzZDkuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3BsdWdpbi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfSlI2eHNCOFBFZHFzaE1OU0kwN1hPZyIgZ3VpZD0iX0pSNnhzQjhQRWRxc2hNTlNJMDdYT2ciPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il9FOG1pQUI4MUVkcWdCSVR1SUNMSkV3IiBocmVmPSJ1bWE6Ly9fRTZFeWNCODFFZHFnQklUdUlDTEpFdyNfRThtaUFCODFFZHFnQklUdUlDTEpFdyIvPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il9JVENTVUI4MUVkcWdCSVR1SUNMSkV3IiBocmVmPSJ1bWE6Ly9fSVBkWjRCODFFZHFnQklUdUlDTEpFdyNfSVRDU1VCODFFZHFnQklUdUlDTEpFdyIvPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il9SaUtVVUI4MUVkcWdCSVR1SUNMSkV3IiBocmVmPSJ1bWE6Ly9fUmZ4dXNCODFFZHFnQklUdUlDTEpFdyNfUmlLVVVCODFFZHFnQklUdUlDTEpFdyIvPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il9WM0xNd0I4MUVkcWdCSVR1SUNMSkV3IiBocmVmPSJ1bWE6Ly9fVjBWN01CODFFZHFnQklUdUlDTEpFdyNfVjNMTXdCODFFZHFnQklUdUlDTEpFdyIvPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il81OXdDd0VBNUVkcUZxSXU4LWNrb2xnIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTl3Q3dFQTVFZHFGcUl1OC1ja29sZyIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0pSNnhzUjhQRWRxc2hNTlNJMDdYT2ciIGlkPSItRmMydVlYQV80N3M3dFJUQm1tS1F2USIgdXJpPSJyb2xlcy9yb2xlX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1JYY0hVQjhQRWRxc2hNTlNJMDdYT2ciIGlkPSItRmlkZUQwMXBVRFVYTVhFc1ZyczNHUSIgdXJpPSJyb2xlcy9yb2xlX0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1hXR2VJQjhQRWRxc2hNTlNJMDdYT2ciIGlkPSItbFlqcjZWaXRMMVZubkZOTzc4WHVZdyIgdXJpPSJ0YXNrcy90YXNrX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1pNa1FnQjhQRWRxc2hNTlNJMDdYT2ciIGlkPSItSjN6MElHZmplaGl0MHVGYlRKY2E3ZyIgdXJpPSJ0YXNrcy90YXNrX0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX19MWEVnUjhtRWRxMU9vLURvd2RwQmciIGlkPSItLXVnaXZ6MTFMNkxiak92djUzcl9UZyIgdXJpPSJ3b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfS0h1RVlCOG5FZHExT28tRG93ZHBCZyIgaWQ9Ii1NamVlZWRfcF9NUXlnclc3REJrQXJnIiB1cmk9Indvcmtwcm9kdWN0cy9hcnRpZmFjdF9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9hSVVhTUI4bkVkcTFPby1Eb3dkcEJnIiBpZD0iLWd1Zng0UmFGd2hpVWhoQmtvcTN2WmciIHVyaT0id29ya3Byb2R1Y3RzL2RlbGl2ZXJhYmxlX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2JXWjk4QjhuRWRxMU9vLURvd2RwQmciIGlkPSItSE5YTEgxSGdkbjcyV1hHNzdBSEdaQSIgdXJpPSJ3b3JrcHJvZHVjdHMvb3V0Y29tZV9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9uc1VLc0I4bkVkcTFPby1Eb3dkcEJnIiBpZD0iLXliVFB1Vk80Ukd3bl93UWx2QVdhYXciIHVyaT0id29ya3Byb2R1Y3RzL291dGNvbWVfQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfVms0MTBCOG9FZHExT28tRG93ZHBCZyIgaWQ9Ii1LeE5zRndnOWNONC0xczViczN4WklnIiB1cmk9Indvcmtwcm9kdWN0cy9kZWxpdmVyYWJsZV9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il93Rnh6TUI4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLUdhaS0wdkNucUIwV2dLY2sxYm1ucHciIHVyaT0iZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3c3SGZ3QjhyRWRxUXZPalg4ZG9DQ3ciIGlkPSItVzd3REhWZUlRRURQNTllOUQ0MUt1dyIgdXJpPSJndWlkYW5jZXMvY2hlY2tsaXN0cy9jaGVja2xpc3RfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfeG9IdnNCOHJFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1uLUhXWmlLZlhxOVJSUktlRk9CMFVBIiB1cmk9Imd1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3lSWldNQjhyRWRxUXZPalg4ZG9DQ3ciIGlkPSItNkxwT2dpY1dTaHcyQ2RCaFZaSHEwdyIgdXJpPSJndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il96Qllvc0I4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLWJELTJpRUdSaGRMN3VoazlWZ1kxaVEiIHVyaT0iZ3VpZGFuY2VzL2V4YW1wbGVzL2V4YW1wbGVfQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfemxjWUFCOHJFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1PZGtRTjdneVV6ZGItbFY1S0hRczlBIiB1cmk9Imd1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzBSR2tJQjhyRWRxUXZPalg4ZG9DQ3ciIGlkPSItMGkzRExDb2FJNHhoV19zMzRMcDdKdyIgdXJpPSJndWlkYW5jZXMvZ3VpZGVsaW5lcy9ndWlkZWxpbmVfQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfMUpsRVFCOHJFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1heEtSR0xHeGJ2M0ZFMkhIbUVicWR3IiB1cmk9Imd1aWRhbmNlcy9ndWlkZWxpbmVzL2d1aWRlbGluZV9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il80azdKd0I4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLXlOc0t3d1A4QlpmczEyUGJaQTVBZVEiIHVyaT0iZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il80bEU2d0I4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLWdWdkIwUHhSSzc1TXhvT2RtOTMwX3ciIHVyaT0iZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9CMS4xLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzVsY3lvQjhyRWRxUXZPalg4ZG9DQ3ciIGlkPSItRHhsTXR2S2l1Vkh1LWt0WjJVMlpUQSIgdXJpPSJndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzZQbko4QjhyRWRxUXZPalg4ZG9DQ3ciIGlkPSItNmlNT1hLamhQVE1xcGFnNTRiUTN3dyIgdXJpPSJndWlkYW5jZXMvcmVwb3J0cy9yZXBvcnRfQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNjhLdDhCOHJFZHFRdk9qWDhkb0NDdyIgaWQ9Ii11NURhOEx4ZlFSaEg2TGg1Y3ZfYlpBIiB1cmk9Imd1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il83eHo4Z0I4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLWVfcEJHM2Q5MDlOQjBPdm5mUW9KOUEiIHVyaT0iZ3VpZGFuY2VzL3JldXNhYmxlYXNzZXRzL3JldXNhYmxlX2Fzc2V0X0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzhpR0o4QjhyRWRxUXZPalg4ZG9DQ3ciIGlkPSItMGEyM2ctYVFoY1pyVEg3cDJydHlBUSIgdXJpPSJndWlkYW5jZXMvcmV1c2FibGVhc3NldHMvcmV1c2FibGVfYXNzZXRfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfOUdjME1COHJFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1lYUpacldlRlZjNFBFTUE5S3YxMERBIiB1cmk9Imd1aWRhbmNlcy9yb2FkbWFwcy9yb2FkbWFwX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX19iNlBzQjhyRWRxUXZPalg4ZG9DQ3ciIGlkPSItM25RNUpnUElFMUptelFtVElaaEt0ZyIgdXJpPSJndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9CUGl3Z0I4c0VkcVF2T2pYOGRvQ0N3IiBpZD0iLUpGaWp5LUU5dm5aNVFKWkpUMUFBMkEiIHVyaT0iZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9DX0pzOEI4c0VkcVF2T2pYOGRvQ0N3IiBpZD0iLWlsYk5PYXE2MzV2SkdlYjZ1aENQVEEiIHVyaT0iZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9EX3JWMEI4c0VkcVF2T2pYOGRvQ0N3IiBpZD0iLWVhNmR3M0JqX05mcG5UZmwwaF83SEEiIHVyaT0iZ3VpZGFuY2VzL3RlbXBsYXRlcy90ZW1wbGF0ZV9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9FcWNLRUI4c0VkcVF2T2pYOGRvQ0N3IiBpZD0iLVRHaWpma0thbDQ4ZzA2cXRqSFZISmciIHVyaT0iZ3VpZGFuY2VzL3RlbXBsYXRlcy90ZW1wbGF0ZV9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9HRkNmMEI4c0VkcVF2T2pYOGRvQ0N3IiBpZD0iLWQtNVFSajdxSm16bjYyQ0UtX0U2VUEiIHVyaT0iZ3VpZGFuY2VzL3Rlcm1kZWZpbml0aW9ucy90ZXJtX2RlZmluaXRpb25fQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfR3BHUElCOHNFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1wU1N4dE1OUDVpc3hvbTFHZTlUQjNnIiB1cmk9Imd1aWRhbmNlcy90ZXJtZGVmaW5pdGlvbnMvdGVybV9kZWZpbml0aW9uX0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0g1UmRrQjhzRWRxUXZPalg4ZG9DQ3ciIGlkPSIteWkwbzlna1VVTjA2ek5jQ2Y5dFdKQSIgdXJpPSJndWlkYW5jZXMvdG9vbG1lbnRvcnMvdG9vbG1lbnRvcl9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9Jd3MwMEI4c0VkcVF2T2pYOGRvQ0N3IiBpZD0iLUJ2bkFmR1hEaWJjSk00ZF83cVdYUVEiIHVyaT0iZ3VpZGFuY2VzL3Rvb2xtZW50b3JzL3Rvb2xtZW50b3JfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSmVtY29COHNFZHFRdk9qWDhkb0NDdyIgaWQ9Ii02Q2RtNFM4QkE0VV9WYTVOVW9YWXN3IiB1cmk9Imd1aWRhbmNlcy93aGl0ZXBhcGVycy93aGl0ZXBhcGVyX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2VpYU5vQjhzRWRxUXZPalg4ZG9DQ3ciIGlkPSItakk3Tm53R0ZEUy16SlctamtxSmRNQSIgdXJpPSJndWlkYW5jZXMvd2hpdGVwYXBlcnMvd2hpdGVwYXBlcl9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9jWjlFb0I4eUVkcWdCSVR1SUNMSkV3IiBpZD0iLTZydm0zdXZ6cUkweThoLTFQdlZmN0EiIHVyaT0iZGlzY2lwbGluZWdyb3VwaW5ncy9kaXNjaXBsaW5lX2dyb3VwaW5nX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2gtR0NvQjh5RWRxZ0JJVHVJQ0xKRXciIGlkPSItRmVmSm1hQk1VblBGTFpoOUZTdV85ZyIgdXJpPSJkaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX21kLXVVQjh5RWRxZ0JJVHVJQ0xKRXciIGlkPSItaEU1TlZQek1CY2Z2WFZPNHVsbzFyQSIgdXJpPSJkaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3JiaG1ZQjh5RWRxZ0JJVHVJQ0xKRXciIGlkPSIta0Zqa3hvZ0o0akFPei1nV1FQc3FMQSIgdXJpPSJkb21haW5zL2RvbWFpbl9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il92dW1sSUI4eUVkcWdCSVR1SUNMSkV3IiBpZD0iLVVqYVZvM295bEx0bU9iVzFlMjV0dHciIHVyaT0iZG9tYWlucy9kb21haW5fQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfeUMzR3dCOHlFZHFnQklUdUlDTEpFdyIgaWQ9Ii1maDhYbzlJSXEyRlp5RGRwMWVpZG9nIiB1cmk9Indvcmtwcm9kdWN0dHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfemJPbjRCOHlFZHFnQklUdUlDTEpFdyIgaWQ9Ii1Lb1VudTJiTF9GX09fMzBTZDVQSjl3IiB1cmk9Indvcmtwcm9kdWN0dHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfME41YThCOHlFZHFnQklUdUlDTEpFdyIgaWQ9Ii1mdnN5WDY1WnNlSzJ4OEJOYkxicGxRIiB1cmk9InJvbGVzZXRncm91cGluZ3Mvcm9sZV9zZXRfZ3JvdXBpbmdfQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfMHVZUjBCOHlFZHFnQklUdUlDTEpFdyIgaWQ9Ii1ZbGpFWUdCNGZQQ0U1THZUNERhUHRBIiB1cmk9InRvb2xzL3Rvb2xfQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfM0ZMS0VCOHlFZHFnQklUdUlDTEpFdyIgaWQ9Ii0zXy1BYXp6c19sNDNIT09HOERBc1l3IiB1cmk9InRvb2xzL3Rvb2xfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfM3NnMjRCOHlFZHFnQklUdUlDTEpFdyIgaWQ9Ii1XUHFoeFVweDR1RzZXeXI1VWpmb2lnIiB1cmk9ImN1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzR0VmFzQjh5RWRxZ0JJVHVJQ0xKRXciIGlkPSItOFhmUG10NTVITkJWVXlfZldTdk41USIgdXJpPSJjdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9kSFVQQUI4MEVkcWdCSVR1SUNMSkV3IiBpZD0iLVl6Y0thVDNHWVpYUmtZM1pNcl9tUmciIHVyaT0iY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjEuMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9FNjlqUUI4MUVkcWdCSVR1SUNMSkV3IiBpZD0iX0U2RXljQjgxRWRxZ0JJVHVJQ0xKRXciIHVyaT0iY2FwYWJpbGl0eXBhdHRlcm5zL2NhcFBhdF9CMS9tb2RlbC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9JUU5Bd0I4MUVkcWdCSVR1SUNMSkV3IiBpZD0iX0lQZFo0QjgxRWRxZ0JJVHVJQ0xKRXciIHVyaT0iY2FwYWJpbGl0eXBhdHRlcm5zL2NhcFBhdF9CMS4xL21vZGVsLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1JnaFZrQjgxRWRxZ0JJVHVJQ0xKRXciIGlkPSJfUmZ4dXNCODFFZHFnQklUdUlDTEpFdyIgdXJpPSJkZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0IxL21vZGVsLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1YweW5JQjgxRWRxZ0JJVHVJQ0xKRXciIGlkPSJfVjBWN01CODFFZHFnQklUdUlDTEpFdyIgdXJpPSJkZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0IxLjEvbW9kZWwueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfMFp1elVCODVFZHFOdmVseWJEWFpGUSIgaWQ9Ii1OTHdacFZlNDNBM3BFdjFMMG5td21BIiB1cmk9InJvbGVzZXRzL3JvbGVfc2V0X0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzZRREdjQjg1RWRxTnZlbHliRFhaRlEiIGlkPSIta0h1M0g0ZV84SWtERTFJYWJ5NXFndyIgdXJpPSJyb2xlc2V0cy9yb2xlX3NldF9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il81OW00MEVBNUVkcUZxSXU4LWNrb2xnIiBpZD0iXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGciIHVyaT0iY2FwYWJpbGl0eXBhdHRlcm5zL0NQJTIwQjEvbW9kZWwueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4geG1pOmlkPSJfZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iUGx1ZyBCIiBndWlkPSJfZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyIgYnJpZWZEZXNjcmlwdGlvbj0iUGx1ZyBCIGJyaWVmIiBhdXRob3JzPSJQbHVnIEIgYXJ0aHVyIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VjeTV3Uk0zRWRxcW5kaS1nRHV4cHciIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il9lY3k1d1JNM0VkcXFuZGktZ0R1eHB3Ij4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lY3k1d2hNM0VkcXFuZGktZ0R1eHB3IiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfZWN5NXdoTTNFZHFxbmRpLWdEdXhwdyI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lY3k1d3hNM0VkcXFuZGktZ0R1eHB3IiBuYW1lPSJEb21haW5zIiBndWlkPSJfZWN5NXd4TTNFZHFxbmRpLWdEdXhwdyI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEb21haW4iIHhtaTppZD0iX21kcnpZQjh5RWRxZ0JJVHVJQ0xKRXciIG5hbWU9ImRvbWFpbl9CMSIgZ3VpZD0iX21kcnpZQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IkRvbWFpbiBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRG9tYWluIEIxIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9fYktvMEI4ckVkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3c2RTk4QjhyRWRxUXZPalg4ZG9DQ3cgX0l2RDJFQjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il91ckxkY0I4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfemtaUElCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il95UXpnVUI4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il82N2s0RUI4ckVkcVF2T2pYOGRvQ0N3IiB3b3JrUHJvZHVjdHM9Il9tcUozQUI4UEVkcXNoTU5TSTA3WE9nIF9aSGYyWUI4bkVkcTFPby1Eb3dkcEJnIF9jWFhyc0I4bkVkcTFPby1Eb3dkcEJnIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSIta0Zqa3hvZ0o0akFPei1nV1FQc3FMQSIgaHJlZj0idW1hOi8vLWtGamt4b2dKNGpBT3otZ1dRUHNxTEEjLWtGamt4b2dKNGpBT3otZ1dRUHNxTEEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRvbWFpbiIgeG1pOmlkPSJfcmFvT2dCOHlFZHFnQklUdUlDTEpFdyIgbmFtZT0iZG9tYWluX0IyIiBndWlkPSJfcmFvT2dCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iRG9tYWluIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEb21haW4gQjIgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX0JONXh3QjhzRWRxUXZPalg4ZG9DQ3ciIGNvbmNlcHRzQW5kUGFwZXJzPSJfeG5GTjRCOHJFZHFRdk9qWDhkb0NDdyBfSmR0RXdCOHNFZHFRdk9qWDhkb0NDdyIgY2hlY2tsaXN0cz0iX3dFdXFVQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWRlbGluZXM9Il8wUWd1UUI4ckVkcVF2T2pYOGRvQ0N3IiBleGFtcGxlcz0iX3pBb2F3QjhyRWRxUXZPalg4ZG9DQ3ciIGFzc2V0cz0iXzd4T0dvQjhyRWRxUXZPalg4ZG9DQ3ciIHdvcmtQcm9kdWN0cz0iX195RzdjQjhtRWRxMU9vLURvd2RwQmcgX2FzRk9rQjhuRWRxMU9vLURvd2RwQmciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1VamFWbzNveWxMdG1PYlcxZTI1dHR3IiBocmVmPSJ1bWE6Ly8tVWphVm8zb3lsTHRtT2JXMWUyNXR0dyMtVWphVm8zb3lsTHRtT2JXMWUyNXR0dyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lY3k1eEJNM0VkcXFuZGktZ0R1eHB3IiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iX2VjeTV4Qk0zRWRxcW5kaS1nRHV4cHciPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGlzY2lwbGluZUdyb3VwaW5nIiB4bWk6aWQ9Il9TWk14WUI4eUVkcWdCSVR1SUNMSkV3IiBuYW1lPSJkaXNjaXBsaW5lX2dyb3VwaW5nX0IxIiBndWlkPSJfU1pNeFlCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBHcm91cGluZyBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGlzY2lwbGluZSBHcm91cGluZyBCMSBwcmVzZW50IiBkaXNjaXBsaW5lcz0iX2NZNTd3Qjh5RWRxZ0JJVHVJQ0xKRXciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii02cnZtM3V2enFJMHk4aC0xUHZWZjdBIiBocmVmPSJ1bWE6Ly8tNnJ2bTN1dnpxSTB5OGgtMVB2VmY3QSMtNnJ2bTN1dnpxSTB5OGgtMVB2VmY3QSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGlzY2lwbGluZSIgeG1pOmlkPSJfY1k1N3dCOHlFZHFnQklUdUlDTEpFdyIgbmFtZT0iZGlzY2lwbGluZV9CMSIgZ3VpZD0iX2NZNTd3Qjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRpc2NpcGxpbmUgQjEgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX19iS28wQjhyRWRxUXZPalg4ZG9DQ3ciIGNvbmNlcHRzQW5kUGFwZXJzPSJfdzZFOThCOHJFZHFRdk9qWDhkb0NDdyBfSXZEMkVCOHNFZHFRdk9qWDhkb0NDdyIgY2hlY2tsaXN0cz0iX3VyTGRjQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWRlbGluZXM9Il96a1pQSUI4ckVkcVF2T2pYOGRvQ0N3IiBleGFtcGxlcz0iX3lRemdVQjhyRWRxUXZPalg4ZG9DQ3ciIGFzc2V0cz0iXzY3azRFQjhyRWRxUXZPalg4ZG9DQ3ciIHRhc2tzPSJfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUZlZkptYUJNVW5QRkxaaDlGU3VfOWciIGhyZWY9InVtYTovLy1GZWZKbWFCTVVuUEZMWmg5RlN1XzlnIy1GZWZKbWFCTVVuUEZMWmg5RlN1XzlnIi8+Ci0gICAgICAgICAgICA8cmVmZXJlbmNlV29ya2Zsb3dzIGhyZWY9InVtYTovL19FNkV5Y0I4MUVkcWdCSVR1SUNMSkV3I19FNkV5Y1I4MUVkcWdCSVR1SUNMSkV3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEaXNjaXBsaW5lIiB4bWk6aWQ9Il9oOWZsc0I4eUVkcWdCSVR1SUNMSkV3IiBuYW1lPSJkaXNjaXBsaW5lX0IyIiBndWlkPSJfaDlmbHNCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGlzY2lwbGluZSBCMiBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfQk41eHdCOHNFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il94bkZONEI4ckVkcVF2T2pYOGRvQ0N3IF9KZHRFd0I4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfd0V1cVVCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iXzBRZ3VRQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfekFvYXdCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfN3hPR29COHJFZHFRdk9qWDhkb0NDdyIgdGFza3M9Il9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItaEU1TlZQek1CY2Z2WFZPNHVsbzFyQSIgaHJlZj0idW1hOi8vLWhFNU5WUHpNQmNmdlhWTzR1bG8xckEjLWhFNU5WUHpNQmNmdlhWTzR1bG8xckEiLz4KLSAgICAgICAgICAgIDxyZWZlcmVuY2VXb3JrZmxvd3MgaHJlZj0idW1hOi8vX0lQZFo0QjgxRWRxZ0JJVHVJQ0xKRXcjX0lQZFo0UjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZWN5NXhSTTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iUm9sZVNldHMiIGd1aWQ9Il9lY3k1eFJNM0VkcXFuZGktZ0R1eHB3Ij4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVTZXRHcm91cGluZyIgeG1pOmlkPSJfemFWUUFCOHlFZHFnQklUdUlDTEpFdyIgbmFtZT0icm9sZV9zZXRfZ3JvdXBpbmdfQjEiIGd1aWQ9Il96YVZRQUI4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBHcm91cGluZyBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgR3JvdXBpbmcgQjEgcHJlc2VudCIgcm9sZVNldHM9Il91UEFXY0I4NUVkcU52ZWx5YkRYWkZRIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItZnZzeVg2NVpzZUsyeDhCTmJMYnBsUSIgaHJlZj0idW1hOi8vLWZ2c3lYNjVac2VLMng4Qk5iTGJwbFEjLWZ2c3lYNjVac2VLMng4Qk5iTGJwbFEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVTZXQiIHhtaTppZD0iX3VQQVdjQjg1RWRxTnZlbHliRFhaRlEiIG5hbWU9InJvbGVfc2V0X0IxIiBndWlkPSJfdVBBV2NCODVFZHFOdmVseWJEWFpGUSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBTZXQgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgU2V0IEIxIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9fYktvMEI4ckVkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3c2RTk4QjhyRWRxUXZPalg4ZG9DQ3cgX0l2RDJFQjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il91ckxkY0I4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfemtaUElCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il95UXpnVUI4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il82N2s0RUI4ckVkcVF2T2pYOGRvQ0N3IiByb2xlcz0iX0E5RFlnQjhQRWRxc2hNTlNJMDdYT2ciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1OTHdacFZlNDNBM3BFdjFMMG5td21BIiBocmVmPSJ1bWE6Ly8tTkx3WnBWZTQzQTNwRXYxTDBubXdtQSMtTkx3WnBWZTQzQTNwRXYxTDBubXdtQSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZVNldCIgeG1pOmlkPSJfMFlfTWNCODVFZHFOdmVseWJEWFpGUSIgbmFtZT0icm9sZV9zZXRfQjIiIGd1aWQ9Il8wWV9NY0I4NUVkcU52ZWx5YkRYWkZRIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgQjIgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX0JONXh3QjhzRWRxUXZPalg4ZG9DQ3ciIGNvbmNlcHRzQW5kUGFwZXJzPSJfeG5GTjRCOHJFZHFRdk9qWDhkb0NDdyBfSmR0RXdCOHNFZHFRdk9qWDhkb0NDdyIgY2hlY2tsaXN0cz0iX3dFdXFVQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWRlbGluZXM9Il8wUWd1UUI4ckVkcVF2T2pYOGRvQ0N3IiBleGFtcGxlcz0iX3pBb2F3QjhyRWRxUXZPalg4ZG9DQ3ciIGFzc2V0cz0iXzd4T0dvQjhyRWRxUXZPalg4ZG9DQ3ciIHJvbGVzPSJfS0NNX0lCOFBFZHFzaE1OU0kwN1hPZyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWtIdTNINGVfOElrREUxSWFieTVxZ3ciIGhyZWY9InVtYTovLy1rSHUzSDRlXzhJa0RFMUlhYnk1cWd3Iy1rSHUzSDRlXzhJa0RFMUlhYnk1cWd3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VjeTV4aE0zRWRxcW5kaS1nRHV4cHciIG5hbWU9IldQIFR5cGVzIiBndWlkPSJfZWN5NXhoTTNFZHFxbmRpLWdEdXhwdyI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdFR5cGUiIHhtaTppZD0iX3hLc0lvQjh5RWRxZ0JJVHVJQ0xKRXciIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0IxIiBndWlkPSJfeEtzSW9COHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iV29yayBQcm9kdWN0IFR5cGUgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IldvcmsgUHJvZHVjdCBUeXBlIEIxIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9fYktvMEI4ckVkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3c2RTk4QjhyRWRxUXZPalg4ZG9DQ3cgX0l2RDJFQjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il91ckxkY0I4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfemtaUElCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il95UXpnVUI4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il82N2s0RUI4ckVkcVF2T2pYOGRvQ0N3IiB3b3JrUHJvZHVjdHM9Il9tcUozQUI4UEVkcXNoTU5TSTA3WE9nIF9aSGYyWUI4bkVkcTFPby1Eb3dkcEJnIF9jWFhyc0I4bkVkcTFPby1Eb3dkcEJnIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItZmg4WG85SUlxMkZaeURkcDFlaWRvZyIgaHJlZj0idW1hOi8vLWZoOFhvOUlJcTJGWnlEZHAxZWlkb2cjLWZoOFhvOUlJcTJGWnlEZHAxZWlkb2ciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0VHlwZSIgeG1pOmlkPSJfeUNrTDBCOHlFZHFnQklUdUlDTEpFdyIgbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQjIiIGd1aWQ9Il95Q2tMMEI4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSJXb3JrIFByb2R1Y3QgVHlwZSBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iV29yayBQcm9kdWN0IFR5cGUgQjIgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX0JONXh3QjhzRWRxUXZPalg4ZG9DQ3ciIGNvbmNlcHRzQW5kUGFwZXJzPSJfeG5GTjRCOHJFZHFRdk9qWDhkb0NDdyBfSmR0RXdCOHNFZHFRdk9qWDhkb0NDdyIgY2hlY2tsaXN0cz0iX3dFdXFVQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWRlbGluZXM9Il8wUWd1UUI4ckVkcVF2T2pYOGRvQ0N3IiBleGFtcGxlcz0iX3pBb2F3QjhyRWRxUXZPalg4ZG9DQ3ciIGFzc2V0cz0iXzd4T0dvQjhyRWRxUXZPalg4ZG9DQ3ciIHdvcmtQcm9kdWN0cz0iX195RzdjQjhtRWRxMU9vLURvd2RwQmcgX2FzRk9rQjhuRWRxMU9vLURvd2RwQmciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1Lb1VudTJiTF9GX09fMzBTZDVQSjl3IiBocmVmPSJ1bWE6Ly8tS29VbnUyYkxfRl9PXzMwU2Q1UEo5dyMtS29VbnUyYkxfRl9PXzMwU2Q1UEo5dyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lY3k1eHhNM0VkcXFuZGktZ0R1eHB3IiBuYW1lPSJUb29scyIgZ3VpZD0iX2VjeTV4eE0zRWRxcW5kaS1nRHV4cHciPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VG9vbCIgeG1pOmlkPSJfME5jdkFCOHlFZHFnQklUdUlDTEpFdyIgbmFtZT0idG9vbF9CMSIgZ3VpZD0iXzBOY3ZBQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IlRvb2wgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2wgQjEgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX19iS28wQjhyRWRxUXZPalg4ZG9DQ3ciIGNvbmNlcHRzQW5kUGFwZXJzPSJfdzZFOThCOHJFZHFRdk9qWDhkb0NDdyBfSXZEMkVCOHNFZHFRdk9qWDhkb0NDdyIgY2hlY2tsaXN0cz0iX3VyTGRjQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWRlbGluZXM9Il96a1pQSUI4ckVkcVF2T2pYOGRvQ0N3IiBleGFtcGxlcz0iX3lRemdVQjhyRWRxUXZPalg4ZG9DQ3ciIGFzc2V0cz0iXzY3azRFQjhyRWRxUXZPalg4ZG9DQ3ciIHRvb2xNZW50b3JzPSJfR29EdFVCOHNFZHFRdk9qWDhkb0NDdyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVlsakVZR0I0ZlBDRTVMdlQ0RGFQdEEiIGhyZWY9InVtYTovLy1ZbGpFWUdCNGZQQ0U1THZUNERhUHRBIy1ZbGpFWUdCNGZQQ0U1THZUNERhUHRBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUb29sIiB4bWk6aWQ9Il8xN0h4d0I4eUVkcWdCSVR1SUNMSkV3IiBuYW1lPSJ0b29sX0IyIiBndWlkPSJfMTdIeHdCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iVG9vbCBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVG9vbCBCMiBwcmVzZW50YXRpb24iIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3cgX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il93RXVxVUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiB0b29sTWVudG9ycz0iX0g0T1VzQjhzRWRxUXZPalg4ZG9DQ3ciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii0zXy1BYXp6c19sNDNIT09HOERBc1l3IiBocmVmPSJ1bWE6Ly8tM18tQWF6enNfbDQzSE9PRzhEQXNZdyMtM18tQWF6enNfbDQzSE9PRzhEQXNZdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lY3k1eUJNM0VkcXFuZGktZ0R1eHB3IiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il9lY3k1eUJNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lY3k1eVJNM0VkcXFuZGktZ0R1eHB3IiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfZWN5NXlSTTNFZHFxbmRpLWdEdXhwdyI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VjeTV5aE0zRWRxcW5kaS1nRHV4cHciIG5hbWU9IkhpZGRlbiIgZ3VpZD0iX2VjeTV5aE0zRWRxcW5kaS1nRHV4cHciPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfZWN5NXl4TTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il9lY3k1eXhNM0VkcXFuZGktZ0R1eHB3IiBjYXRlZ29yaXplZEVsZW1lbnRzPSJfM0VTWlFCOHlFZHFnQklUdUlDTEpFdyBfM3NFeUFCOHlFZHFnQklUdUlDTEpFdyIvPgotICAgICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il8zRVNaUUI4eUVkcWdCSVR1SUNMSkV3IiBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQjEiIGd1aWQ9Il8zRVNaUUI4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItV1BxaHhVcHg0dUc2V3lyNVVqZm9pZyIgaHJlZj0idW1hOi8vLVdQcWh4VXB4NHVHNld5cjVVamZvaWcjLVdQcWh4VXB4NHVHNld5cjVVamZvaWciLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiBocmVmPSIjX1hmVGRvQjgwRWRxZ0JJVHVJQ0xKRXciLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2siIGhyZWY9IiNfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZSIgaHJlZj0iI19BOURZZ0I4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0iI19tcUozQUI4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZSIgaHJlZj0iI19aSGYyWUI4bkVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSIjX2NYWHJzQjhuRWRxMU9vLURvd2RwQmciLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfNHNDdHNUemdFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIGhyZWY9InVtYTovL19hSFVTUUJCTkVkcUJzN0toZFZMUkxBI19hSFVTUVJCTkVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lva0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il8zc0V5QUI4eUVkcWdCSVR1SUNMSkV3IiBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQjIiIGd1aWQ9Il8zc0V5QUI4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBCMiBwcmVzZW50IiBjYXRlZ29yaXplZEVsZW1lbnRzPSJfWkxPTXNCOFBFZHFzaE1OU0kwN1hPZyBfX3lHN2NCOG1FZHExT28tRG93ZHBCZyBfYXNGT2tCOG5FZHExT28tRG93ZHBCZyBfS0NNX0lCOFBFZHFzaE1OU0kwN1hPZyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLThYZlBtdDU1SE5CVlV5X2ZXU3ZONVEiIGhyZWY9InVtYTovLy04WGZQbXQ1NUhOQlZVeV9mV1N2TjVRIy04WGZQbXQ1NUhOQlZVeV9mV1N2TjVRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfWGZUZG9CODBFZHFnQklUdUlDTEpFdyIgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0IxLjEiIGd1aWQ9Il9YZlRkb0I4MEVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQjEuMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQ3VzdG9tIENhdGVnb3J5IEIxLjEgcHJlc2VudGF0aW9uIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItWXpjS2FUM0dZWlhSa1kzWk1yX21SZyIgaHJlZj0idW1hOi8vLVl6Y0thVDNHWVpYUmtZM1pNcl9tUmcjLVl6Y0thVDNHWVpYUmtZM1pNcl9tUmciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VjeTV6Qk0zRWRxcW5kaS1nRHV4cHciIG5hbWU9IkNvcmVDb250ZW50IiBndWlkPSJfZWN5NXpCTTNFZHFxbmRpLWdEdXhwdyI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81bnJHWUI4T0VkcXNoTU5TSTA3WE9nIiBuYW1lPSJjb250ZW50X3BhY2thZ2VfQjEiIGd1aWQ9Il81bnJHWUI4T0VkcXNoTU5TSTA3WE9nIiBicmllZkRlc2NyaXB0aW9uPSJDb24gUGFrIEIxIGJyaWVmIj4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGUiIHhtaTppZD0iX0E5RFlnQjhQRWRxc2hNTlNJMDdYT2ciIG5hbWU9InJvbGVfQjEiIGd1aWQ9Il9BOURZZ0I4UEVkcXNoTU5TSTA3WE9nIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIxIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9fYktvMEI4ckVkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3c2RTk4QjhyRWRxUXZPalg4ZG9DQ3cgX0l2RDJFQjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il91ckxkY0I4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfemtaUElCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il95UXpnVUI4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il82N2s0RUI4ckVkcVF2T2pYOGRvQ0N3IiByZXNwb25zaWJsZUZvcj0iX21xSjNBQjhQRWRxc2hNTlNJMDdYT2cgX1pIZjJZQjhuRWRxMU9vLURvd2RwQmciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1GYzJ1WVhBXzQ3czd0UlRCbW1LUXZRIiBocmVmPSJ1bWE6Ly8tRmMydVlYQV80N3M3dFJUQm1tS1F2USMtRmMydVlYQV80N3M3dFJUQm1tS1F2USIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZSIgeG1pOmlkPSJfS0NNX0lCOFBFZHFzaE1OU0kwN1hPZyIgbmFtZT0icm9sZV9CMiIgZ3VpZD0iX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2ciIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQjIgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX0JONXh3QjhzRWRxUXZPalg4ZG9DQ3ciIGNvbmNlcHRzQW5kUGFwZXJzPSJfeG5GTjRCOHJFZHFRdk9qWDhkb0NDdyBfSmR0RXdCOHNFZHFRdk9qWDhkb0NDdyIgY2hlY2tsaXN0cz0iX3dFdXFVQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWRlbGluZXM9Il8wUWd1UUI4ckVkcVF2T2pYOGRvQ0N3IiBleGFtcGxlcz0iX3pBb2F3QjhyRWRxUXZPalg4ZG9DQ3ciIGFzc2V0cz0iXzd4T0dvQjhyRWRxUXZPalg4ZG9DQ3ciIHJlc3BvbnNpYmxlRm9yPSJfX3lHN2NCOG1FZHExT28tRG93ZHBCZyBfbnFGV0VCOG5FZHExT28tRG93ZHBCZyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUZpZGVEMDFwVURVWE1YRXNWcnMzR1EiIGhyZWY9InVtYTovLy1GaWRlRDAxcFVEVVhNWEVzVnJzM0dRIy1GaWRlRDAxcFVEVVhNWEVzVnJzM0dRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrIiB4bWk6aWQ9Il9YVTZMVUI4UEVkcXNoTU5TSTA3WE9nIiBuYW1lPSJ0YXNrX0IxIiBndWlkPSJfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZyIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBCMSBwcmVzbmV0IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IF9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyIgcGVyZm9ybWVkQnk9Il9BOURZZ0I4UEVkcXNoTU5TSTA3WE9nIiBtYW5kYXRvcnlJbnB1dD0iX21xSjNBQjhQRWRxc2hNTlNJMDdYT2ciIG91dHB1dD0iX2NYWHJzQjhuRWRxMU9vLURvd2RwQmciIGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PSJfS0NNX0lCOFBFZHFzaE1OU0kwN1hPZyIgb3B0aW9uYWxJbnB1dD0iX1pIZjJZQjhuRWRxMU9vLURvd2RwQmciIHRvb2xNZW50b3JzPSJfR29EdFVCOHNFZHFRdk9qWDhkb0NDdyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWxZanI2Vml0TDFWbm5GTk83OFh1WXciIGhyZWY9InVtYTovLy1sWWpyNlZpdEwxVm5uRk5PNzhYdVl3Iy1sWWpyNlZpdEwxVm5uRk5PNzhYdVl3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrIiB4bWk6aWQ9Il9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nIiBuYW1lPSJ0YXNrX0IyIiBndWlkPSJfWkxPTXNCOFBFZHFzaE1OU0kwN1hPZyIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBCMiBleHRlbmRzIFRhc2sgQTEiIHZhcmlhYmlsaXR5VHlwZT0iZXh0ZW5kcyIgc3VwcG9ydGluZ01hdGVyaWFscz0iX0JONXh3QjhzRWRxUXZPalg4ZG9DQ3ciIGNvbmNlcHRzQW5kUGFwZXJzPSJfeG5GTjRCOHJFZHFRdk9qWDhkb0NDdyBfSmR0RXdCOHNFZHFRdk9qWDhkb0NDdyIgY2hlY2tsaXN0cz0iX3dFdXFVQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWRlbGluZXM9Il8wUWd1UUI4ckVkcVF2T2pYOGRvQ0N3IiBleGFtcGxlcz0iX3pBb2F3QjhyRWRxUXZPalg4ZG9DQ3ciIGFzc2V0cz0iXzd4T0dvQjhyRWRxUXZPalg4ZG9DQ3ciIHBlcmZvcm1lZEJ5PSJfS0NNX0lCOFBFZHFzaE1OU0kwN1hPZyIgbWFuZGF0b3J5SW5wdXQ9Il9feUc3Y0I4bUVkcTFPby1Eb3dkcEJnIiBvdXRwdXQ9Il9hc0ZPa0I4bkVkcTFPby1Eb3dkcEJnIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iX0E5RFlnQjhQRWRxc2hNTlNJMDdYT2ciIG9wdGlvbmFsSW5wdXQ9Il9ucUZXRUI4bkVkcTFPby1Eb3dkcEJnIiB0b29sTWVudG9ycz0iX0g0T1VzQjhzRWRxUXZPalg4ZG9DQ3ciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1KM3owSUdmamVoaXQwdUZiVEpjYTdnIiBocmVmPSJ1bWE6Ly8tSjN6MElHZmplaGl0MHVGYlRKY2E3ZyMtSjN6MElHZmplaGl0MHVGYlRKY2E3ZyIvPgotICAgICAgICAgICAgPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFzayIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiB4bWk6aWQ9Il9tcUozQUI4UEVkcXNoTU5TSTA3WE9nIiBuYW1lPSJhcnRpZmFjdF9CMSIgZ3VpZD0iX21xSjNBQjhQRWRxc2hNTlNJMDdYT2ciIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IF9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyIgcmVwb3J0cz0iXzVramF3QjhyRWRxUXZPalg4ZG9DQ3ciIHRlbXBsYXRlcz0iX0M5MFFNQjhzRWRxUXZPalg4ZG9DQ3ciIHRvb2xNZW50b3JzPSJfR29EdFVCOHNFZHFRdk9qWDhkb0NDdyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLS11Z2l2ejExTDZMYmpPdnY1M3JfVGciIGhyZWY9InVtYTovLy0tdWdpdnoxMUw2TGJqT3Z2NTNyX1RnIy0tdWdpdnoxMUw2TGJqT3Z2NTNyX1RnIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgeG1pOmlkPSJfX3lHN2NCOG1FZHExT28tRG93ZHBCZyIgbmFtZT0iYXJ0aWZhY3RfQjIiIGd1aWQ9Il9feUc3Y0I4bUVkcTFPby1Eb3dkcEJnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX0JONXh3QjhzRWRxUXZPalg4ZG9DQ3ciIGNvbmNlcHRzQW5kUGFwZXJzPSJfeG5GTjRCOHJFZHFRdk9qWDhkb0NDdyBfSmR0RXdCOHNFZHFRdk9qWDhkb0NDdyIgY2hlY2tsaXN0cz0iX3dFdXFVQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWRlbGluZXM9Il8wUWd1UUI4ckVkcVF2T2pYOGRvQ0N3IiBleGFtcGxlcz0iX3pBb2F3QjhyRWRxUXZPalg4ZG9DQ3ciIGFzc2V0cz0iXzd4T0dvQjhyRWRxUXZPalg4ZG9DQ3ciIHJlcG9ydHM9Il82T3VaSUI4ckVkcVF2T2pYOGRvQ0N3IiB0ZW1wbGF0ZXM9Il9ELXg5OEI4c0VkcVF2T2pYOGRvQ0N3IiB0b29sTWVudG9ycz0iX0g0T1VzQjhzRWRxUXZPalg4ZG9DQ3ciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1NamVlZWRfcF9NUXlnclc3REJrQXJnIiBocmVmPSJ1bWE6Ly8tTWplZWVkX3BfTVF5Z3JXN0RCa0FyZyMtTWplZWVkX3BfTVF5Z3JXN0RCa0FyZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIHhtaTppZD0iX1pIZjJZQjhuRWRxMU9vLURvd2RwQmciIG5hbWU9ImRlbGl2ZXJhYmxlX0IxIiBndWlkPSJfWkhmMllCOG5FZHExT28tRG93ZHBCZyIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIxIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9fYktvMEI4ckVkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3c2RTk4QjhyRWRxUXZPalg4ZG9DQ3cgX0l2RDJFQjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il91ckxkY0I4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfemtaUElCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il95UXpnVUI4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il82N2s0RUI4ckVkcVF2T2pYOGRvQ0N3IiByZXBvcnRzPSJfNWtqYXdCOHJFZHFRdk9qWDhkb0NDdyIgdGVtcGxhdGVzPSJfQzkwUU1COHNFZHFRdk9qWDhkb0NDdyIgdG9vbE1lbnRvcnM9Il9Hb0R0VUI4c0VkcVF2T2pYOGRvQ0N3IiBkZWxpdmVyZWRXb3JrUHJvZHVjdHM9Il9tcUozQUI4UEVkcXNoTU5TSTA3WE9nIF9jWFhyc0I4bkVkcTFPby1Eb3dkcEJnIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItZ3VmeDRSYUZ3aGlVaGhCa29xM3ZaZyIgaHJlZj0idW1hOi8vLWd1Zng0UmFGd2hpVWhoQmtvcTN2WmcjLWd1Zng0UmFGd2hpVWhoQmtvcTN2WmciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIHhtaTppZD0iX2FzRk9rQjhuRWRxMU9vLURvd2RwQmciIG5hbWU9Im91dGNvbWVfQjIiIGd1aWQ9Il9hc0ZPa0I4bkVkcTFPby1Eb3dkcEJnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3cgX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il93RXVxVUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiByZXBvcnRzPSJfNk91WklCOHJFZHFRdk9qWDhkb0NDdyIgdGVtcGxhdGVzPSJfRC14OThCOHNFZHFRdk9qWDhkb0NDdyIgdG9vbE1lbnRvcnM9Il9INE9Vc0I4c0VkcVF2T2pYOGRvQ0N3Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItSE5YTEgxSGdkbjcyV1hHNzdBSEdaQSIgaHJlZj0idW1hOi8vLUhOWExIMUhnZG43MldYRzc3QUhHWkEjLUhOWExIMUhnZG43MldYRzc3QUhHWkEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIHhtaTppZD0iX2NYWHJzQjhuRWRxMU9vLURvd2RwQmciIG5hbWU9Im91dGNvbWVfQjEiIGd1aWQ9Il9jWFhyc0I4bkVkcTFPby1Eb3dkcEJnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIxIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9fYktvMEI4ckVkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3c2RTk4QjhyRWRxUXZPalg4ZG9DQ3cgX0l2RDJFQjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il91ckxkY0I4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfemtaUElCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il95UXpnVUI4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il82N2s0RUI4ckVkcVF2T2pYOGRvQ0N3IiByZXBvcnRzPSJfNWtqYXdCOHJFZHFRdk9qWDhkb0NDdyIgdGVtcGxhdGVzPSJfQzkwUU1COHNFZHFRdk9qWDhkb0NDdyIgdG9vbE1lbnRvcnM9Il9Hb0R0VUI4c0VkcVF2T2pYOGRvQ0N3Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSIteWJUUHVWTzRSR3duX3dRbHZBV2FhdyIgaHJlZj0idW1hOi8vLXliVFB1Vk80Ukd3bl93UWx2QVdhYXcjLXliVFB1Vk80Ukd3bl93UWx2QVdhYXciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiB4bWk6aWQ9Il9ucUZXRUI4bkVkcTFPby1Eb3dkcEJnIiBuYW1lPSJkZWxpdmVyYWJsZV9CMiIgZ3VpZD0iX25xRldFQjhuRWRxMU9vLURvd2RwQmciIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBCMiBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfQk41eHdCOHNFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il94bkZONEI4ckVkcVF2T2pYOGRvQ0N3IF9KZHRFd0I4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfd0V1cVVCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iXzBRZ3VRQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfekFvYXdCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfN3hPR29COHJFZHFRdk9qWDhkb0NDdyIgcmVwb3J0cz0iXzZPdVpJQjhyRWRxUXZPalg4ZG9DQ3ciIHRlbXBsYXRlcz0iX0QteDk4QjhzRWRxUXZPalg4ZG9DQ3ciIHRvb2xNZW50b3JzPSJfSDRPVXNCOHNFZHFRdk9qWDhkb0NDdyIgZGVsaXZlcmVkV29ya1Byb2R1Y3RzPSJfX3lHN2NCOG1FZHExT28tRG93ZHBCZyBfYXNGT2tCOG5FZHExT28tRG93ZHBCZyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUt4TnNGd2c5Y040LTFzNWJzM3haSWciIGhyZWY9InVtYTovLy1LeE5zRndnOWNONC0xczViczN4WklnIy1LeE5zRndnOWNONC0xczViczN4WklnIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDaGVja2xpc3QiIHhtaTppZD0iX3VyTGRjQjhyRWRxUXZPalg4ZG9DQ3ciIG5hbWU9ImNoZWNrbGlzdF9CMSIgZ3VpZD0iX3VyTGRjQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IkNoZWNrbGlzdCBCMSIgcHJlc2VudGF0aW9uTmFtZT0iQ2hlY2tsaXN0IEIxIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1HYWktMHZDbnFCMFdnS2NrMWJtbnB3IiBocmVmPSJ1bWE6Ly8tR2FpLTB2Q25xQjBXZ0tjazFibW5wdyMtR2FpLTB2Q25xQjBXZ0tjazFibW5wdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2hlY2tsaXN0IiB4bWk6aWQ9Il93RXVxVUI4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJjaGVja2xpc3RfQjIiIGd1aWQ9Il93RXVxVUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkNoZWNrbGlzdCBCMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItVzd3REhWZUlRRURQNTllOUQ0MUt1dyIgaHJlZj0idW1hOi8vLVc3d0RIVmVJUUVEUDU5ZTlENDFLdXcjLVc3d0RIVmVJUUVEUDU5ZTlENDFLdXciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbmNlcHQiIHhtaTppZD0iX3c2RTk4QjhyRWRxUXZPalg4ZG9DQ3ciIG5hbWU9ImNvbmNlcHRfQjEiIGd1aWQ9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJDb25jZXB0IEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJDb25jZXB0IEIxIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1uLUhXWmlLZlhxOVJSUktlRk9CMFVBIiBocmVmPSJ1bWE6Ly8tbi1IV1ppS2ZYcTlSUlJLZUZPQjBVQSMtbi1IV1ppS2ZYcTlSUlJLZUZPQjBVQSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29uY2VwdCIgeG1pOmlkPSJfeG5GTjRCOHJFZHFRdk9qWDhkb0NDdyIgbmFtZT0iY29uY2VwdF9CMiIgZ3VpZD0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IkNvbmNlcHQgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkNvbmNlcHQgQjIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTZMcE9naWNXU2h3MkNkQmhWWkhxMHciIGhyZWY9InVtYTovLy02THBPZ2ljV1NodzJDZEJoVlpIcTB3Iy02THBPZ2ljV1NodzJDZEJoVlpIcTB3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpFeGFtcGxlIiB4bWk6aWQ9Il95UXpnVUI4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJleGFtcGxlX0IxIiBndWlkPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iRXhhbXBsZSBCMSByaWVmIiBwcmVzZW50YXRpb25OYW1lPSJFeGFtcGxlIEIxIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1iRC0yaUVHUmhkTDd1aGs5VmdZMWlRIiBocmVmPSJ1bWE6Ly8tYkQtMmlFR1JoZEw3dWhrOVZnWTFpUSMtYkQtMmlFR1JoZEw3dWhrOVZnWTFpUSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RXhhbXBsZSIgeG1pOmlkPSJfekFvYXdCOHJFZHFRdk9qWDhkb0NDdyIgbmFtZT0iZXhhbXBsZV9CMiIgZ3VpZD0iX3pBb2F3QjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IkV4YW1wbGUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkV4YW1wbGUgQjIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLU9ka1FON2d5VXpkYi1sVjVLSFFzOUEiIGhyZWY9InVtYTovLy1PZGtRTjdneVV6ZGItbFY1S0hRczlBIy1PZGtRTjdneVV6ZGItbFY1S0hRczlBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkZWxpbmUiIHhtaTppZD0iX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIG5hbWU9Imd1aWRlbGluZV9CMSIgZ3VpZD0iX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249Ikd1aWRlbGluZSBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iR3VpZGVsaW5lIEIxIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii0waTNETENvYUk0eGhXX3MzNExwN0p3IiBocmVmPSJ1bWE6Ly8tMGkzRExDb2FJNHhoV19zMzRMcDdKdyMtMGkzRExDb2FJNHhoV19zMzRMcDdKdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGVsaW5lIiB4bWk6aWQ9Il8wUWd1UUI4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJndWlkZWxpbmVfQjIiIGd1aWQ9Il8wUWd1UUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJHdWlkZWxpbmUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ikd1aWRlbGluZSBCMiI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWF4S1JHTEd4YnYzRkUySEhtRWJxZHciIGhyZWY9InVtYTovLy1heEtSR0xHeGJ2M0ZFMkhIbUVicWR3Iy1heEtSR0xHeGJ2M0ZFMkhIbUVicWR3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcmFjdGljZSIgeG1pOmlkPSJfMUktblVCOHJFZHFRdk9qWDhkb0NDdyIgbmFtZT0icHJhY3RpY2VfQjEiIGd1aWQ9Il8xSS1uVUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQjEgcHJlc2VudCIgY29udGVudFJlZmVyZW5jZXM9Il9tcUozQUI4UEVkcXNoTU5TSTA3WE9nIF8zRVNaUUI4eUVkcWdCSVR1SUNMSkV3IF9jWTU3d0I4eUVkcWdCSVR1SUNMSkV3IF9tZHJ6WUI4eUVkcWdCSVR1SUNMSkV3IF91UEFXY0I4NUVkcU52ZWx5YkRYWkZRIF8wTmN2QUI4eUVkcWdCSVR1SUNMSkV3IF94S3NJb0I4eUVkcWdCSVR1SUNMSkV3IF91ckxkY0I4ckVkcVF2T2pYOGRvQ0N3IF93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IF9aSGYyWUI4bkVkcTFPby1Eb3dkcEJnIF95UXpnVUI4ckVkcVF2T2pYOGRvQ0N3IF96a1pQSUI4ckVkcVF2T2pYOGRvQ0N3IF9jWFhyc0I4bkVkcTFPby1Eb3dkcEJnIF80aTFmRUI4ckVkcVF2T2pYOGRvQ0N3IF81a2phd0I4ckVkcVF2T2pYOGRvQ0N3IF82N2s0RUI4ckVkcVF2T2pYOGRvQ0N3IF84aFdqRUI4ckVkcVF2T2pYOGRvQ0N3IF9BOURZZ0I4UEVkcXNoTU5TSTA3WE9nIF9fYktvMEI4ckVkcVF2T2pYOGRvQ0N3IF9YVTZMVUI4UEVkcXNoTU5TSTA3WE9nIF9DOTBRTUI4c0VkcVF2T2pYOGRvQ0N3IF9Hb0R0VUI4c0VkcVF2T2pYOGRvQ0N3IF9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IF9YZlRkb0I4MEVkcWdCSVR1SUNMSkV3Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSIteU5zS3d3UDhCWmZzMTJQYlpBNUFlUSIgaHJlZj0idW1hOi8vLXlOc0t3d1A4QlpmczEyUGJaQTVBZVEjLXlOc0t3d1A4QlpmczEyUGJaQTVBZVEiLz4KLSAgICAgICAgICAgIDxzdWJQcmFjdGljZXMgeG1pOmlkPSJfMnZNLVFCOHJFZHFRdk9qWDhkb0NDdyIgbmFtZT0icHJhY3RpY2VfQjEuMSIgZ3VpZD0iXzJ2TS1RQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IlByYWN0aWNlIEIxLjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEIxLjEgcHJlc2VudCI+Ci0gICAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItZ1Z2QjBQeFJLNzVNeG9PZG05MzBfdyIgaHJlZj0idW1hOi8vLWdWdkIwUHhSSzc1TXhvT2RtOTMwX3cjLWdWdkIwUHhSSzc1TXhvT2RtOTMwX3ciLz4KLSAgICAgICAgICAgIDwvc3ViUHJhY3RpY2VzPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2UiIHhtaTppZD0iXzRpMWZFQjhyRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InByYWN0aWNlX0IyIiBndWlkPSJfNGkxZkVCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEIyIHByZXNlbnQiIGNvbnRlbnRSZWZlcmVuY2VzPSJfX3lHN2NCOG1FZHExT28tRG93ZHBCZyBfd0V1cVVCOHJFZHFRdk9qWDhkb0NDdyBfeG5GTjRCOHJFZHFRdk9qWDhkb0NDdyBfbnFGV0VCOG5FZHExT28tRG93ZHBCZyBfekFvYXdCOHJFZHFRdk9qWDhkb0NDdyBfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyBfYXNGT2tCOG5FZHExT28tRG93ZHBCZyBfMUktblVCOHJFZHFRdk9qWDhkb0NDdyBfMnZNLVFCOHJFZHFRdk9qWDhkb0NDdyBfNk91WklCOHJFZHFRdk9qWDhkb0NDdyBfN3hPR29COHJFZHFRdk9qWDhkb0NDdyBfLWd3UEFCOHJFZHFRdk9qWDhkb0NDdyBfS0NNX0lCOFBFZHFzaE1OU0kwN1hPZyBfQk41eHdCOHNFZHFRdk9qWDhkb0NDdyBfWkxPTXNCOFBFZHFzaE1OU0kwN1hPZyBfRC14OThCOHNFZHFRdk9qWDhkb0NDdyBfSDRPVXNCOHNFZHFRdk9qWDhkb0NDdyBfSmR0RXdCOHNFZHFRdk9qWDhkb0NDdyBfM3NFeUFCOHlFZHFnQklUdUlDTEpFdyBfaDlmbHNCOHlFZHFnQklUdUlDTEpFdyBfcmFvT2dCOHlFZHFnQklUdUlDTEpFdyBfMFlfTWNCODVFZHFOdmVseWJEWFpGUSBfMTdIeHdCOHlFZHFnQklUdUlDTEpFdyBfeUNrTDBCOHlFZHFnQklUdUlDTEpFdyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUR4bE10dktpdVZIdS1rdFoyVTJaVEEiIGhyZWY9InVtYTovLy1EeGxNdHZLaXVWSHUta3RaMlUyWlRBIy1EeGxNdHZLaXVWSHUta3RaMlUyWlRBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSZXBvcnQiIHhtaTppZD0iXzVramF3QjhyRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InJlcG9ydF9CMSIgZ3VpZD0iXzVramF3QjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IlJlcG9ydCBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUmVwb3J0IEIxIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii02aU1PWEtqaFBUTXFwYWc1NGJRM3d3IiBocmVmPSJ1bWE6Ly8tNmlNT1hLamhQVE1xcGFnNTRiUTN3dyMtNmlNT1hLamhQVE1xcGFnNTRiUTN3dyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UmVwb3J0IiB4bWk6aWQ9Il82T3VaSUI4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJyZXBvcnRfQjIiIGd1aWQ9Il82T3VaSUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJSZXBvcnQgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJlcG9ydCBCMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItdTVEYThMeGZRUmhINkxoNWN2X2JaQSIgaHJlZj0idW1hOi8vLXU1RGE4THhmUVJoSDZMaDVjdl9iWkEjLXU1RGE4THhmUVJoSDZMaDVjdl9iWkEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJldXNhYmxlQXNzZXQiIHhtaTppZD0iXzY3azRFQjhyRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InJldXNhYmxlX2Fzc2V0X0IxIiBndWlkPSJfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iUmV1c2FibGUgQXNzZXQgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJldXNhYmxlIEFzc2V0IEIxIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1lX3BCRzNkOTA5TkIwT3ZuZlFvSjlBIiBocmVmPSJ1bWE6Ly8tZV9wQkczZDkwOU5CME92bmZRb0o5QSMtZV9wQkczZDkwOU5CME92bmZRb0o5QSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UmV1c2FibGVBc3NldCIgeG1pOmlkPSJfN3hPR29COHJFZHFRdk9qWDhkb0NDdyIgbmFtZT0icmV1c2FibGVfYXNzZXRfQjIiIGd1aWQ9Il83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJSZXVzYWJsZSBBc3NldCBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUmV1c2FibGUgQXNzZXQgQjIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTBhMjNnLWFRaGNaclRIN3AycnR5QVEiIGhyZWY9InVtYTovLy0wYTIzZy1hUWhjWnJUSDdwMnJ0eUFRIy0wYTIzZy1hUWhjWnJUSDdwMnJ0eUFRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2FkbWFwIiB4bWk6aWQ9Il84aFdqRUI4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJyb2FkbWFwX0IxIiBndWlkPSJfOGhXakVCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iUm9hZG1hcCBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9hZG1hcCBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItZWFKWnJXZUZWYzRQRU1BOUt2MTBEQSIgaHJlZj0idW1hOi8vLWVhSlpyV2VGVmM0UEVNQTlLdjEwREEjLWVhSlpyV2VGVmM0UEVNQTlLdjEwREEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvYWRtYXAiIHhtaTppZD0iXy1nd1BBQjhyRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InJvYWRtYXBfQjIiIGd1aWQ9Il8tZ3dQQUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJSb2FkbWFwIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2FkbWFwIEIyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii0zblE1SmdQSUUxSm16UW1USVpoS3RnIiBocmVmPSJ1bWE6Ly8tM25RNUpnUElFMUptelFtVElaaEt0ZyMtM25RNUpnUElFMUptelFtVElaaEt0ZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6U3VwcG9ydGluZ01hdGVyaWFsIiB4bWk6aWQ9Il9fYktvMEI4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0IxIiBndWlkPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3VwcG9ydGluZyBNYXRlcmlhbCBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItSkZpanktRTl2blo1UUpaSlQxQUEyQSIgaHJlZj0idW1hOi8vLUpGaWp5LUU5dm5aNVFKWkpUMUFBMkEjLUpGaWp5LUU5dm5aNVFKWkpUMUFBMkEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlN1cHBvcnRpbmdNYXRlcmlhbCIgeG1pOmlkPSJfQk41eHdCOHNFZHFRdk9qWDhkb0NDdyIgbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9CMiIgZ3VpZD0iX0JONXh3QjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQjIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWlsYk5PYXE2MzV2SkdlYjZ1aENQVEEiIGhyZWY9InVtYTovLy1pbGJOT2FxNjM1dkpHZWI2dWhDUFRBIy1pbGJOT2FxNjM1dkpHZWI2dWhDUFRBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUZW1wbGF0ZSIgeG1pOmlkPSJfQzkwUU1COHNFZHFRdk9qWDhkb0NDdyIgbmFtZT0idGVtcGxhdGVfQjEiIGd1aWQ9Il9DOTBRTUI4c0VkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJUZW1wbGF0ZSBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVGVtcGxhdGUgQjEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWVhNmR3M0JqX05mcG5UZmwwaF83SEEiIGhyZWY9InVtYTovLy1lYTZkdzNCal9OZnBuVGZsMGhfN0hBIy1lYTZkdzNCal9OZnBuVGZsMGhfN0hBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUZW1wbGF0ZSIgeG1pOmlkPSJfRC14OThCOHNFZHFRdk9qWDhkb0NDdyIgbmFtZT0idGVtcGxhdGVfQjIiIGd1aWQ9Il9ELXg5OEI4c0VkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJUZW1wbGF0ZSBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVGVtcGxhdGUgQjIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVRHaWpma0thbDQ4ZzA2cXRqSFZISmciIGhyZWY9InVtYTovLy1UR2lqZmtLYWw0OGcwNnF0akhWSEpnIy1UR2lqZmtLYWw0OGcwNnF0akhWSEpnIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUZXJtRGVmaW5pdGlvbiIgeG1pOmlkPSJfRXBzak1COHNFZHFRdk9qWDhkb0NDdyIgbmFtZT0idGVybV9kZWZpbml0aW9uX0IxIiBndWlkPSJfRXBzak1COHNFZHFRdk9qWDhkb0NDdyIgcHJlc2VudGF0aW9uTmFtZT0iVGVybSBEZWZpbml0aW9uIEIxIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1kLTVRUmo3cUptem42MkNFLV9FNlVBIiBocmVmPSJ1bWE6Ly8tZC01UVJqN3FKbXpuNjJDRS1fRTZVQSMtZC01UVJqN3FKbXpuNjJDRS1fRTZVQSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGVybURlZmluaXRpb24iIHhtaTppZD0iX0dFUzQ4QjhzRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9CMiIgZ3VpZD0iX0dFUzQ4QjhzRWRxUXZPalg4ZG9DQ3ciIHByZXNlbnRhdGlvbk5hbWU9IlRlcm0gRGVmaW5pdGlvbiBCMiBicmllZiI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXBTU3h0TU5QNWlzeG9tMUdlOVRCM2ciIGhyZWY9InVtYTovLy1wU1N4dE1OUDVpc3hvbTFHZTlUQjNnIy1wU1N4dE1OUDVpc3hvbTFHZTlUQjNnIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUb29sTWVudG9yIiB4bWk6aWQ9Il9Hb0R0VUI4c0VkcVF2T2pYOGRvQ0N3IiBuYW1lPSJ0b29sbWVudG9yX0IxIiBndWlkPSJfR29EdFVCOHNFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iVG9vbG1lbnRvIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUb29sbWVudG9yIEIxIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii15aTBvOWdrVVVOMDZ6TmNDZjl0V0pBIiBocmVmPSJ1bWE6Ly8teWkwbzlna1VVTjA2ek5jQ2Y5dFdKQSMteWkwbzlna1VVTjA2ek5jQ2Y5dFdKQSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VG9vbE1lbnRvciIgeG1pOmlkPSJfSDRPVXNCOHNFZHFRdk9qWDhkb0NDdyIgbmFtZT0idG9vbG1lbnRvcl9CMiIgZ3VpZD0iX0g0T1VzQjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IlRvb2xtZW50b3IgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2xtZW50b3IgQjIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUJ2bkFmR1hEaWJjSk00ZF83cVdYUVEiIGhyZWY9InVtYTovLy1Cdm5BZkdYRGliY0pNNGRfN3FXWFFRIy1Cdm5BZkdYRGliY0pNNGRfN3FXWFFRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXaGl0ZXBhcGVyIiB4bWk6aWQ9Il9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IiBuYW1lPSJ3aGl0ZXBhcGVyX0IxIiBndWlkPSJfSXZEMkVCOHNFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iV2hpdGVwYXBlciBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItNkNkbTRTOEJBNFVfVmE1TlVvWFlzdyIgaHJlZj0idW1hOi8vLTZDZG00UzhCQTRVX1ZhNU5Vb1hZc3cjLTZDZG00UzhCQTRVX1ZhNU5Vb1hZc3ciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldoaXRlcGFwZXIiIHhtaTppZD0iX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIG5hbWU9IndoaXRlcGFwZXJfQjIiIGd1aWQ9Il9KZHRFd0I4c0VkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJXaGl0ZXBhcGVyIEIyIiBwcmVzZW50YXRpb25OYW1lPSJXaGl0ZXBhcGVyIEIyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1qSTdObndHRkRTLXpKVy1qa3FKZE1BIiBocmVmPSJ1bWE6Ly8takk3Tm53R0ZEUy16SlctamtxSmRNQSMtakk3Tm53R0ZEUy16SlctamtxSmRNQSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfZWN5NXpSTTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBndWlkPSJfZWN5NXpSTTNFZHFxbmRpLWdEdXhwdyI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il82X3VwTUI4MEVkcWdCSVR1SUNMSkV3IiBuYW1lPSJjYXBQYXRQYWtfQjEiIGd1aWQ9Il82X3VwTUI4MEVkcWdCSVR1SUNMSkV3Ij4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfX1U1U29CODBFZHFnQklUdUlDTEpFdyIgbmFtZT0iY2FwUGF0UGFrX0IxLjEiIGd1aWQ9Il9fVTVTb0I4MEVkcWdCSVR1SUNMSkV3Ij4KLSAgICAgICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIHhtaTppZD0iX0lQZFo0QjgxRWRxZ0JJVHVJQ0xKRXciIGhyZWY9InVtYTovL19JUGRaNEI4MUVkcWdCSVR1SUNMSkV3I19JUGRaNEI4MUVkcWdCSVR1SUNMSkV3Ii8+Ci0gICAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIHhtaTppZD0iX0U2RXljQjgxRWRxZ0JJVHVJQ0xKRXciIGhyZWY9InVtYTovL19FNkV5Y0I4MUVkcWdCSVR1SUNMSkV3I19FNkV5Y0I4MUVkcWdCSVR1SUNMSkV3Ii8+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgeG1pOmlkPSJfNTZ4blFFQTVFZHFGcUl1OC1ja29sZyIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8L21ldGhvZFBhY2thZ2VzPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfZWN5NXpoTTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGd1aWQ9Il9lY3k1emhNM0VkcXFuZGktZ0R1eHB3Ij4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9MNkppOEI4MUVkcWdCSVR1SUNMSkV3IiBuYW1lPSJkZWxQcm9jUGFrX0IxIiBndWlkPSJfTDZKaThCODFFZHFnQklUdUlDTEpFdyI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9OMGZJc0I4MUVkcWdCSVR1SUNMSkV3IiBuYW1lPSJkZWxQcm9jUGFrX0IxLjEiIGd1aWQ9Il9OMGZJc0I4MUVkcWdCSVR1SUNMSkV3Ij4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9WMFY3TUI4MUVkcWdCSVR1SUNMSkV3IiBocmVmPSJ1bWE6Ly9fVjBWN01CODFFZHFnQklUdUlDTEpFdyNfVjBWN01CODFFZHFnQklUdUlDTEpFdyIvPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIHhtaTppZD0iX1JmeHVzQjgxRWRxZ0JJVHVJQ0xKRXciIGhyZWY9InVtYTovL19SZnh1c0I4MUVkcWdCSVR1SUNMSkV3I19SZnh1c0I4MUVkcWdCSVR1SUNMSkV3Ii8+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX2VjeTV6eE0zRWRxcW5kaS1nRHV4cHciIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBndWlkPSJfZWN5NXp4TTNFZHFxbmRpLWdEdXhwdyIvPgotICAgIDxiYXNlcyBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfeVVlTElBLVBFZHFMMk8xUEpWOWNaQSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3JvbGVzL3JvbGVfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3JvbGVzL3JvbGVfQjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzcxMjFmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9yb2xlcy9yb2xlX0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItRmMydVlYQV80N3M3dFJUQm1tS1F2USIgbmFtZT0icm9sZV9CMSxfQTlEWWdCOFBFZHFzaE1OU0kwN1hPZyIgZ3VpZD0iLUZjMnVZWEFfNDdzN3RSVEJtbUtRdlEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTI6NDc6MjMuMTQxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJvbGUgQjEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+Um9sZSBCMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8c2tpbGxzPlJvbGUgQjEgc2tpbGw8L3NraWxscz4KLSAgPGFzc2lnbm1lbnRBcHByb2FjaGVzPlJvbGUgQjEgYXNzaWduPC9hc3NpZ25tZW50QXBwcm9hY2hlcz4KLSAgPHN5bm9ueW1zPlJvbGUgQjEgc3luPC9zeW5vbnltcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvcm9sZXMvcm9sZV9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvcm9sZXMvcm9sZV9CMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYTkyOGEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3JvbGVzL3JvbGVfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1GaWRlRDAxcFVEVVhNWEVzVnJzM0dRIiBuYW1lPSJyb2xlX0IyLF9LQ01fSUI4UEVkcXNoTU5TSTA3WE9nIiBndWlkPSItRmlkZUQwMXBVRFVYTVhFc1ZyczNHUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxMjo0ODoyMS43MzQtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Um9sZSBCMiBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Sb2xlIEIyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxza2lsbHM+Um9sZSBCMiBza2lsbDwvc2tpbGxzPgotICA8YXNzaWdubWVudEFwcHJvYWNoZXM+Um9sZSBCMiBhc3M8L2Fzc2lnbm1lbnRBcHByb2FjaGVzPgotICA8c3lub255bXM+Um9sZSBCMiBzeW48L3N5bm9ueW1zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9yb2xlc2V0Z3JvdXBpbmdzL3JvbGVfc2V0X2dyb3VwaW5nX0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9yb2xlc2V0Z3JvdXBpbmdzL3JvbGVfc2V0X2dyb3VwaW5nX0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFhYjNiNC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvcm9sZXNldGdyb3VwaW5ncy9yb2xlX3NldF9ncm91cGluZ19CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWZ2c3lYNjVac2VLMng4Qk5iTGJwbFEiIG5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0IxLF96YVZRQUI4eUVkcWdCSVR1SUNMSkV3IiBndWlkPSItZnZzeVg2NVpzZUsyeDhCTmJMYnBsUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNzoxNjoyNS41MDAtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Um9sZSBTZXQgR3JvdXBpbmcgQjEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+Um9sZSBTZXQgR3JvdXBpbmcgQjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvcm9sZXNldHMvcm9sZV9zZXRfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3JvbGVzZXRzL3JvbGVfc2V0X0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMwNTQxNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvcm9sZXNldHMvcm9sZV9zZXRfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1OTHdacFZlNDNBM3BFdjFMMG5td21BIiBuYW1lPSJyb2xlX3NldF9CMSxfdVBBV2NCODVFZHFOdmVseWJEWFpGUSIgZ3VpZD0iLU5Md1pwVmU0M0EzcEV2MUwwbm13bUEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6NTM6MDcuMzc1LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJvbGUgU2V0IEIxIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlJvbGUgU2V0IEIxIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3JvbGVzZXRzL3JvbGVfc2V0X0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9yb2xlc2V0cy9yb2xlX3NldF9CMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlN2NhYzMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3JvbGVzZXRzL3JvbGVfc2V0X0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSIta0h1M0g0ZV84SWtERTFJYWJ5NXFndyIgbmFtZT0icm9sZV9zZXRfQjIsXzBZX01jQjg1RWRxTnZlbHliRFhaRlEiIGd1aWQ9Ii1rSHUzSDRlXzhJa0RFMUlhYnk1cWd3IiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE3OjUzOjQzLjU0Ny0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICBSb2xlIFNldCBCMiBtYWluCi0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz4mbHQ7cCZndDsKLSAgICBSb2xlIFNldCBCMiBrZXkKLSZsdDsvcCZndDs8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi90YXNrcy90YXNrX0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi90YXNrcy90YXNrX0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIyNTQ1Yy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvdGFza3MvdGFza19CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1sWWpyNlZpdEwxVm5uRk5PNzhYdVl3IiBuYW1lPSJ0YXNrX0IxLF9YVTZMVUI4UEVkcXNoTU5TSTA3WE9nIiBndWlkPSItbFlqcjZWaXRMMVZubkZOTzc4WHVZdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxMjo1MDo0Ny4yMDMtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgVGFzayBCMSBtYWluICZhbXA7YW1wOyBcIFxcICZxdW90OyAnICUgJmFtcDtndDsgJmFtcDtsdDsKLSZsdDsvcCZndDs8L21haW5EZXNjcmlwdGlvbj4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX1Q0QXFBQjg0RWRxTnZlbHliRFhaRlEiIG5hbWU9IlN0ZXAgQjEuMSIgZ3VpZD0iX1Q0QXFBQjg0RWRxTnZlbHliRFhaRlEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+dXA8L3NlY3Rpb25EZXNjcmlwdGlvbj4KLSAgPC9zZWN0aW9ucz4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX1Q1OGpzQjg0RWRxTnZlbHliRFhaRlEiIG5hbWU9IlN0ZXAgQjEuMiIgZ3VpZD0iX1Q1OGpzQjg0RWRxTnZlbHliRFhaRlEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgRG93bgotJmx0Oy9wJmd0Ozwvc2VjdGlvbkRlc2NyaXB0aW9uPgotICA8L3NlY3Rpb25zPgotICA8c2VjdGlvbnMgeG1pOmlkPSJfVDhWSlVCODRFZHFOdmVseWJEWFpGUSIgbmFtZT0iU3RlcCBCMS4zIiBndWlkPSJfVDhWSlVCODRFZHFOdmVseWJEWFpGUSI+Ci0gICAgPHNlY3Rpb25EZXNjcmlwdGlvbj5PdmVyPC9zZWN0aW9uRGVzY3JpcHRpb24+Ci0gIDwvc2VjdGlvbnM+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5UYXNrIEIxIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxwdXJwb3NlPlRhc2sgQjEgcG9ycG9pc2U8L3B1cnBvc2U+Ci0gIDxhbHRlcm5hdGl2ZXM+VGFzayBCMSBhbHQ8L2FsdGVybmF0aXZlcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvdGFza3MvdGFza19CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvdGFza3MvdGFza19CMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YTA5YWYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3Rhc2tzL3Rhc2tfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItSjN6MElHZmplaGl0MHVGYlRKY2E3ZyIgbmFtZT0idGFza19CMixfWkxPTXNCOFBFZHFzaE1OU0kwN1hPZyIgZ3VpZD0iLUozejBJR2ZqZWhpdDB1RmJUSmNhN2ciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTI6NTA6MDcuNzAzLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRhc2sgQjIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8c2VjdGlvbnMgeG1pOmlkPSJfb3FZc3dCODRFZHFOdmVseWJEWFpGUSIgbmFtZT0iU3RlcCBCMi4xIiBndWlkPSJfb3FZc3dCODRFZHFOdmVseWJEWFpGUSI+Ci0gICAgPHNlY3Rpb25EZXNjcmlwdGlvbj5FaW48L3NlY3Rpb25EZXNjcmlwdGlvbj4KLSAgPC9zZWN0aW9ucz4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX3F1UXBBQjg0RWRxTnZlbHliRFhaRlEiIG5hbWU9IlN0ZXAgQjIuMiIgZ3VpZD0iX3F1UXBBQjg0RWRxTnZlbHliRFhaRlEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgWndlaQotJmx0Oy9wJmd0Ozwvc2VjdGlvbkRlc2NyaXB0aW9uPgotICA8L3NlY3Rpb25zPgotICA8c2VjdGlvbnMgeG1pOmlkPSJfcXl1NVVCODRFZHFOdmVseWJEWFpGUSIgbmFtZT0iU3RlcCBCMi4zIiBndWlkPSJfcXl1NVVCODRFZHFOdmVseWJEWFpGUSI+Ci0gICAgPHNlY3Rpb25EZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICBEcmVpCi0mbHQ7L3AmZ3Q7PC9zZWN0aW9uRGVzY3JpcHRpb24+Ci0gIDwvc2VjdGlvbnM+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5UYXNrIEIyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxwdXJwb3NlPlRhc2sgQjIgcG9ycG9pc2U8L3B1cnBvc2U+Ci0gIDxhbHRlcm5hdGl2ZXM+VGFzayBCMiBhbHQ8L2FsdGVybmF0aXZlcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvdG9vbHMvdG9vbF9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvdG9vbHMvdG9vbF9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNmM3OTUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3Rvb2xzL3Rvb2xfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1ZbGpFWUdCNGZQQ0U1THZUNERhUHRBIiBuYW1lPSJ0b29sX0IxLF8wTmN2QUI4eUVkcWdCSVR1SUNMSkV3IiBndWlkPSItWWxqRVlHQjRmUENFNUx2VDREYVB0QSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNzoxNToyOS4wMDAtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+VG9vbCBCMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Ub29sIEIxIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3Rvb2xzL3Rvb2xfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3Rvb2xzL3Rvb2xfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDc0MWE1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi90b29scy90b29sX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItM18tQWF6enNfbDQzSE9PRzhEQXNZdyIgbmFtZT0idG9vbF9CMixfMTdIeHdCOHlFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLTNfLUFhenpzX2w0M0hPT0c4REFzWXciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MTU6NTguNzE5LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRvb2wgQjIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+VG9vbCBCMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0cy9hcnRpZmFjdF9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYTMwNTUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0cy9hcnRpZmFjdF9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3REZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItLXVnaXZ6MTFMNkxiak92djUzcl9UZyIgbmFtZT0iYXJ0aWZhY3RfQjEsX21xSjNBQjhQRWRxc2hNTlNJMDdYT2ciIGd1aWQ9Ii0tdWdpdnoxMUw2TGJqT3Z2NTNyX1RnIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE1OjM3OjQwLjA3OC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5BcnRpZmFjdCBCMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5BcnRpZmFjdCBCMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8ZXh0ZXJuYWxJZD5BcnRpZmFjdCBCMSB1bmlxdWUgSUQ8L2V4dGVybmFsSWQ+Ci0gIDxwdXJwb3NlPkFydGlmYWN0IEIxIHBvcnBvaXNlPC9wdXJwb3NlPgotICA8aW1wYWN0T2ZOb3RIYXZpbmc+QXJ0aWZhY3QgQjEgaW1wYWN0PC9pbXBhY3RPZk5vdEhhdmluZz4KLSAgPHJlYXNvbnNGb3JOb3ROZWVkaW5nPkFydGlmYWN0IEIxIHJlYXNvbjwvcmVhc29uc0Zvck5vdE5lZWRpbmc+Ci0gIDxicmllZk91dGxpbmU+QXJ0aWZhY3QgQjEgb3V0bGluZTwvYnJpZWZPdXRsaW5lPgotICA8cmVwcmVzZW50YXRpb25PcHRpb25zPkFydGlmYWN0IEIxIHJlcDwvcmVwcmVzZW50YXRpb25PcHRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3RzL2FydGlmYWN0X0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTBiM2RiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLU1qZWVlZF9wX01ReWdyVzdEQmtBcmciIG5hbWU9ImFydGlmYWN0X0IyLF9feUc3Y0I4bUVkcTFPby1Eb3dkcEJnIiBndWlkPSItTWplZWVkX3BfTVF5Z3JXN0RCa0FyZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNTozOTowNC45NjktMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+QXJ0aWZhY3QgQjIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+QXJ0aWZhY3QgQjIga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+QXJ0aWZhY3QgQjIgdW5pcXVlIElEPC9leHRlcm5hbElkPgotICA8cHVycG9zZT5BcnRpZmFjdCBCMiBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGltcGFjdE9mTm90SGF2aW5nPkFydGlmYWN0IEIyIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5BcnRpZmFjdCBCMiByZWFzb248L3JlYXNvbnNGb3JOb3ROZWVkaW5nPgotICA8YnJpZWZPdXRsaW5lPkFydGlmYWN0IEIyIG91dGxpbmU8L2JyaWVmT3V0bGluZT4KLSAgPHJlcHJlc2VudGF0aW9uT3B0aW9ucz5BcnRpZmFjdCBCMiByZXA8L3JlcHJlc2VudGF0aW9uT3B0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0cy9kZWxpdmVyYWJsZV9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3RzL2RlbGl2ZXJhYmxlX0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI5YjVkZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3RzL2RlbGl2ZXJhYmxlX0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1ndWZ4NFJhRndoaVVoaEJrb3EzdlpnIiBuYW1lPSJkZWxpdmVyYWJsZV9CMSxfWkhmMllCOG5FZHExT28tRG93ZHBCZyIgZ3VpZD0iLWd1Zng0UmFGd2hpVWhoQmtvcTN2WmciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTU6NDI6MTQuNzgxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkRlbGl2ZXJhYmxlIEIxIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPkRlbGl2ZXJhYmxlIEIxIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxleHRlcm5hbElkPkRlbGl2ZXJhYmxlIEIxIHVuaXF1ZSBJRDwvZXh0ZXJuYWxJZD4KLSAgPHB1cnBvc2U+RGVsaXZlcmFibGUgQjEgcG9ycG9pc2U8L3B1cnBvc2U+Ci0gIDxpbXBhY3RPZk5vdEhhdmluZz5EZWxpdmVyYWJsZSBCMSBpbXBhY3Q8L2ltcGFjdE9mTm90SGF2aW5nPgotICA8cmVhc29uc0Zvck5vdE5lZWRpbmc+RGVsaXZlcmFibGUgQjEgcmVhc29uPC9yZWFzb25zRm9yTm90TmVlZGluZz4KLSAgPGV4dGVybmFsRGVzY3JpcHRpb24+RGVsaXZlcmFibGUgQjEgZXh0ZXJuPC9leHRlcm5hbERlc2NyaXB0aW9uPgotICA8cGFja2FnaW5nR3VpZGFuY2U+RGVsaXZlcmFibGUgQjEgcGFjazwvcGFja2FnaW5nR3VpZGFuY2U+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGVEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0cy9kZWxpdmVyYWJsZV9CMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMGRiNDIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0cy9kZWxpdmVyYWJsZV9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGVEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItS3hOc0Z3ZzljTjQtMXM1YnMzeFpJZyIgbmFtZT0iZGVsaXZlcmFibGVfQjIsX25xRldFQjhuRWRxMU9vLURvd2RwQmciIGd1aWQ9Ii1LeE5zRndnOWNONC0xczViczN4WklnIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE1OjQzOjMwLjU2Mi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5EZWxpdmVyYWJsZSBCMiBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5EZWxpdmVyYWJsZSBCMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8ZXh0ZXJuYWxJZD5EZWxpdmVyYWJsZSBCMiB1bmlxdWUgSUQ8L2V4dGVybmFsSWQ+Ci0gIDxwdXJwb3NlPkRlbGl2ZXJhYmxlIEIyIHBvcnBvaXNlPC9wdXJwb3NlPgotICA8aW1wYWN0T2ZOb3RIYXZpbmc+RGVsaXZlcmFibGUgQjIgaW1wYWN0PC9pbXBhY3RPZk5vdEhhdmluZz4KLSAgPHJlYXNvbnNGb3JOb3ROZWVkaW5nPkRlbGl2ZXJhYmxlIEIyIHJlYXNvbjwvcmVhc29uc0Zvck5vdE5lZWRpbmc+Ci0gIDxleHRlcm5hbERlc2NyaXB0aW9uPkRlbGl2ZXJhYmxlIEIyIGV4dGVybjwvZXh0ZXJuYWxEZXNjcmlwdGlvbj4KLSAgPHBhY2thZ2luZ0d1aWRhbmNlPkRlbGl2ZXJhYmxlIEIyIHBhY2s8L3BhY2thZ2luZ0d1aWRhbmNlPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3RzL291dGNvbWVfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0cy9vdXRjb21lX0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYxNTYxNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3RzL291dGNvbWVfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSIteWJUUHVWTzRSR3duX3dRbHZBV2FhdyIgbmFtZT0ib3V0Y29tZV9CMSxfY1hYcnNCOG5FZHExT28tRG93ZHBCZyIgZ3VpZD0iLXliVFB1Vk80Ukd3bl93UWx2QVdhYXciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTU6NDc6MzguMTA5LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPk91dGNvbWUgQjEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+T3V0Y29tZSBCMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8ZXh0ZXJuYWxJZD5PdXRjb21lIEIxIHVuaXF1ZSBJRDwvZXh0ZXJuYWxJZD4KLSAgPHB1cnBvc2U+T3V0Y29tZSBCMSBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGltcGFjdE9mTm90SGF2aW5nPk91dGNvbWUgQjEgaW1wYWN0PC9pbXBhY3RPZk5vdEhhdmluZz4KLSAgPHJlYXNvbnNGb3JOb3ROZWVkaW5nPk91dGNvbWUgQjEgcmVhc29uPC9yZWFzb25zRm9yTm90TmVlZGluZz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0cy9vdXRjb21lX0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvb3V0Y29tZV9CMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYWQ0NmYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0cy9vdXRjb21lX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUhOWExIMUhnZG43MldYRzc3QUhHWkEiIG5hbWU9Im91dGNvbWVfQjIsX2FzRk9rQjhuRWRxMU9vLURvd2RwQmciIGd1aWQ9Ii1ITlhMSDFIZ2RuNzJXWEc3N0FIR1pBIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE1OjQ2OjAxLjE1Ni0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5PdXRjb21lIEIyIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPk91dGNvbWUgQjIga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+T3V0Y29tZSBCMiB1bmlxdWUgSUQ8L2V4dGVybmFsSWQ+Ci0gIDxwdXJwb3NlPk91dGNvbWUgQjIgcG9ycG9pc2U8L3B1cnBvc2U+Ci0gIDxpbXBhY3RPZk5vdEhhdmluZz5PdXRjb21lIEIyIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5PdXRjb21lIEIyIHJlYXNvbjwvcmVhc29uc0Zvck5vdE5lZWRpbmc+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYxNjYzNi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3R0eXBlcy93b3JrX3Byb2R1Y3RfdHlwZV9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWZoOFhvOUlJcTJGWnlEZHAxZWlkb2ciIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0IxLF94S3NJb0I4eUVkcWdCSVR1SUNMSkV3IiBndWlkPSItZmg4WG85SUlxMkZaeURkcDFlaWRvZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNzoxNzoyOC40ODQtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+V29yayBQcm9kdWN0IFR5cGUgQjEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+V29yayBQcm9kdWN0IFR5cGUgQjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3R0eXBlcy93b3JrX3Byb2R1Y3RfdHlwZV9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3R0eXBlcy93b3JrX3Byb2R1Y3RfdHlwZV9CMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZjViZDEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0dHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1Lb1VudTJiTF9GX09fMzBTZDVQSjl3IiBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9CMixfeUNrTDBCOHlFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLUtvVW51MmJMX0ZfT18zMFNkNVBKOXciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MDQ6NTUuNzY2LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPldvcmsgUHJvZHVjdCBUeXBlIEIyIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPldvcmsgUHJvZHVjdCBUeXBlIEIyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvY29uZmlndXJhdGlvbnMvQ29uZmlnIEEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvY29uZmlndXJhdGlvbnMvQ29uZmlnIEEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzcyZGNlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL2NvbmZpZ3VyYXRpb25zL0NvbmZpZyBBLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Il9ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIiBuYW1lPSJDb25maWcgQSIgZ3VpZD0iX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiIGJyaWVmRGVzY3JpcHRpb249IkNvbmZpZyBBIGRlc2NyaXB0aW9uIj4KLSAgPG1ldGhvZFBsdWdpblNlbGVjdGlvbiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfeVVlTElBLVBFZHFMMk8xUEpWOWNaQSIvPgotICA8bWV0aG9kUGx1Z2luU2VsZWN0aW9uIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfeVVlTExBLVBFZHFMMk8xUEpWOWNaQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxJUS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI196aV96d0EtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfeVVlTExRLVBFZHFMMk8xUEpWOWNaQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX1RRYm5JQS1XRWRxTDJPMVBKVjljWkEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19EYUhrZ0R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfRUZWcndEemlFZHE1eXNGT05yMUJHUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX0U3M3JJRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19CUzZnRUR6bEVkcTV5c0ZPTnIxQkdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19adFpiTUVERkVkcU85TTNmdWtZQV9BIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfbEM3d0VFREZFZHFPOU0zZnVrWUFfQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX2RYRGQ4RURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19lWlN6d0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIGhyZWY9InVtYTovL19hSFVTUUJCTkVkcUJzN0toZFZMUkxBI19hSFVTUUJCTkVkcUJzN0toZFZMUkxBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fYUhVU1FCQk5FZHFCczdLaGRWTFJMQSNfRVcwOU1EMEtFZHFqQUk3N0RIdkJ3QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxMZy1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19qVU5mb0JCTkVkcUJzN0toZFZMUkxBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIGhyZWY9InVtYTovL191cTVLOEJNMUVkcXFuZGktZ0R1eHB3I191cTVLOEJNMUVkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIGhyZWY9InVtYTovL19XNmE0Y0JCTkVkcUJzN0toZFZMUkxBI19XNmE0Y0JCTkVkcUJzN0toZFZMUkxBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfZWN5NXpCTTNFZHFxbmRpLWdEdXhwdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV3Uk0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I181bnJHWUI4T0VkcXNoTU5TSTA3WE9nIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfZWN5NXpSTTNFZHFxbmRpLWdEdXhwdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjXzZfdXBNQjgwRWRxZ0JJVHVJQ0xKRXciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19fVTVTb0I4MEVkcWdCSVR1SUNMSkV3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIGhyZWY9InVtYTovL19JUGRaNEI4MUVkcWdCSVR1SUNMSkV3I19JUGRaNEI4MUVkcWdCSVR1SUNMSkV3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIGhyZWY9InVtYTovL19FNkV5Y0I4MUVkcWdCSVR1SUNMSkV3I19FNkV5Y0I4MUVkcWdCSVR1SUNMSkV3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NnhuUUVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVFFQTVFZHFGcUl1OC1ja29sZyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV6aE0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19MNkppOEI4MUVkcWdCSVR1SUNMSkV3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfTjBmSXNCODFFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fVjBWN01CODFFZHFnQklUdUlDTEpFdyNfVjBWN01CODFFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fUmZ4dXNCODFFZHFnQklUdUlDTEpFdyNfUmZ4dXNCODFFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxKdy1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI195VWVMSWctUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfeVVlTEpnLVBFZHFMMk8xUEpWOWNaQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxKQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI195VWVMS1EtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfeVVlTEtnLVBFZHFMMk8xUEpWOWNaQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxKUS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI195VWVMSXctUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfZWN5NXhoTTNFZHFxbmRpLWdEdXhwdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV3aE0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1eEJNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfZWN5NXh4TTNFZHFxbmRpLWdEdXhwdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV3eE0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1eVJNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfZWN5NXloTTNFZHFxbmRpLWdEdXhwdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV4Uk0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPHByb2Nlc3NWaWV3cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX01LUG5rQS1XRWRxTDJPMVBKVjljWkEiLz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvY29uZmlndXJhdGlvbnMvQ29uZmlnIEIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvY29uZmlndXJhdGlvbnMvQ29uZmlnIEIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmU3YjU3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL2NvbmZpZ3VyYXRpb25zL0NvbmZpZyBCLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Il9VTHFCSUJNM0VkcXFuZGktZ0R1eHB3IiBuYW1lPSJDb25maWcgQiIgZ3VpZD0iX1VMcUJJQk0zRWRxcW5kaS1nRHV4cHciPgotICA8bWV0aG9kUGx1Z2luU2VsZWN0aW9uIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfZWN5NXpCTTNFZHFxbmRpLWdEdXhwdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV3Uk0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I181bnJHWUI4T0VkcXNoTU5TSTA3WE9nIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfZWN5NXpSTTNFZHFxbmRpLWdEdXhwdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjXzZfdXBNQjgwRWRxZ0JJVHVJQ0xKRXciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19fVTVTb0I4MEVkcWdCSVR1SUNMSkV3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIGhyZWY9InVtYTovL19JUGRaNEI4MUVkcWdCSVR1SUNMSkV3I19JUGRaNEI4MUVkcWdCSVR1SUNMSkV3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIGhyZWY9InVtYTovL19FNkV5Y0I4MUVkcWdCSVR1SUNMSkV3I19FNkV5Y0I4MUVkcWdCSVR1SUNMSkV3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NnhuUUVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVFFQTVFZHFGcUl1OC1ja29sZyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV6aE0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19MNkppOEI4MUVkcWdCSVR1SUNMSkV3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfTjBmSXNCODFFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fVjBWN01CODFFZHFnQklUdUlDTEpFdyNfVjBWN01CODFFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fUmZ4dXNCODFFZHFnQklUdUlDTEpFdyNfUmZ4dXNCODFFZHFnQklUdUlDTEpFdyIvPgotICA8cHJvY2Vzc1ZpZXdzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfM0VTWlFCOHlFZHFnQklUdUlDTEpFdyIvPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9jb25maWd1cmF0aW9ucy9wcm9jX0ZhbWlseV9BLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL2NvbmZpZ3VyYXRpb25zL3Byb2NfRmFtaWx5X0EueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzBiOWIxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL2NvbmZpZ3VyYXRpb25zL3Byb2NfRmFtaWx5X0EueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0ZhbWlseSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSJfWVVpQUFCODFFZHFnQklUdUlDTEpFdyIgbmFtZT0icHJvY19GYW1pbHlfQSIgZ3VpZD0iX1lVaUFBQjgxRWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249InByb2NfRmFtaWx5X0EgZGVzY3JpcHRpb24iLz4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL2xpYnJhcnkueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvbGlicmFyeS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NGNiMTEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvbGlicmFyeS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9xend5d1EtUEVkcUwyTzFQSlY5Y1pBIiBndWlkPSJfcXp3eXdRLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iXzZsSzJBQS1QRWRxTDJPMVBKVjljWkEiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI182bEsyQUEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX0pSNnhzQjhQRWRxc2hNTlNJMDdYT2ciIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19KUjZ4c0I4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfcXp3eXdnLVBFZHFMMk8xUEpWOWNaQSIgaWQ9Il9xend5d0EtUEVkcUwyTzFQSlY5Y1pBIiB1cmk9IiIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3lVbjhJQS1QRWRxTDJPMVBKVjljWkEiIGlkPSJfeVVlTElBLVBFZHFMMk8xUEpWOWNaQSIgdXJpPSJQbHVnJTIwQS9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfZWRQbHNCTTNFZHFxbmRpLWdEdXhwdyIgaWQ9Il9lY3k1d0JNM0VkcXFuZGktZ0R1eHB3IiB1cmk9IlBsdWclMjBCL3BsdWdpbi54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnkgeG1pOmlkPSJfcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iUGFyaXMiIGd1aWQ9Il9xend5d0EtUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICA8bWV0aG9kUGx1Z2lucyB4bWk6aWQ9Il95VWVMSUEtUEVkcUwyTzFQSlY5Y1pBIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfeVVlTElBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgIDxtZXRob2RQbHVnaW5zIHhtaTppZD0iX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHciIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzLzFzdFRlc3QudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvMXN0VGVzdC50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMyOWM4Zi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvMXN0VGVzdC50YworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08TWV0aG9kTGlicmFyeVRlc3QgZGlzYWJsZT0iZmFsc2UiPgotCQotCTxDb3B5TGlicmFyeSBsaWJGb2xkZXJOYW1lPSIuLi9FeHBvcnRJbXBvcnQvUGFyaXMiPgotCTwvQ29weUxpYnJhcnk+CQotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSJQYXJpcyI+Ci0JPC9PcGVuTGlicmFyeT4KLQkKLQk8RXhwb3J0UGx1Z2lucyBleHBvcnRGb2xkZXJOYW1lPSJFeHBvcnRlZDAwMSI+Ci0JPC9FeHBvcnRQbHVnaW5zPgotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSJCYXNlXzEiPgotCTwvT3BlbkxpYnJhcnk+Ci0JCi0JPEltcG9ydFBsdWdpbnMgaW1wb3J0Rm9sZGVyTmFtZT0iRXhwb3J0ZWQwMDEiPgotCTwvSW1wb3J0UGx1Z2lucz4KLQkKLQk8T3V0cHV0TGlicmFyeSBkaXNhYmxlPSJ0cnVlIiAvPgotCQotCTxPdXRwdXRQbHVnaW4gcGF0aD0iUGx1ZyBBIiByZWN1cnNpdmU9ImZhbHNlIj4KLQk8L091dHB1dFBsdWdpbj4KLQkKLQk8T3V0cHV0Q29uZmlndXJhdGlvbiBwYXRoPSJDb25maWcgQSIgcmVjdXJzaXZlPSJmYWxzZSI+Ci0JPC9PdXRwdXRDb25maWd1cmF0aW9uPgotCQotCTxPdXRwdXRNZXRob2RFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIgcmVjdXJzaXZlPSJmYWxzZSI+Ci0JPC9PdXRwdXRNZXRob2RFbGVtZW50PgotCi0JPE91dHB1dE1ldGhvZEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTIiIHJlY3Vyc2l2ZT0idHJ1ZSI+Ci0JPC9PdXRwdXRNZXRob2RFbGVtZW50PgotCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy8xc3RUZXN0LnhtbCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy8xc3RUZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMwYzMwNS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvMXN0VGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NjY5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08VGVzdGVyT3V0cHV0PgotPE1ldGhvZExpYnJhcnkgbmFtZT0iQmFzZV8xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIj4KLTxNZXRob2RQbHVnaW4gbmFtZT0iUGx1ZyBBIiBicmllZkRlc2NyaXB0aW9uPSJQbHVnIEEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IlBsdWcgQSBBcnRodXIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgdXNlckNoYW5nZWFibGU9InRydWUiPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IkNvbnRlbnQiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iQ2F0ZWdvcmllcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IkRvbWFpbnMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0RvbWFpbnMiPgotPC9wYXJlbnRQYWNrYWdlPgotPERvbWFpbiBuYW1lPSJkb21haW5fQTEiIGJyaWVmRGVzY3JpcHRpb249IkRvbWFpbiBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRG9tYWluIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJkb21haW5fQTEsX0ZFek80QS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE5OjE1OjM1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIERvbWFpbiBBMSBtYWluJiMxMzsmIzEwOyZsdDsvcCZndDsiIGtleUNvbnNpZGVyYXRpb25zPSJEb21haW4gQTEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvd29ya1Byb2R1Y3RzPgotPERvbWFpbiBuYW1lPSJzdWJfZG9tYWluX0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yi1Eb21haW4gQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViLURvbWFpbiBBMS4xIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJzdWJfZG9tYWluX0ExLjEsX0dPWjdRQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE3OjQ2OjUzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJTdWItRG9tYWluIEExLjEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlN1Yi1Eb21haW4gQTEuMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTwvRG9tYWluPgotPC9Eb21haW4+Ci08RG9tYWluIG5hbWU9ImRvbWFpbl9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRG9tYWluIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEb21haW4gQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImRvbWFpbl9BMixfRnFXTDhBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTc6NDc6MjggUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRvbWFpbiBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRG9tYWluIEEyIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIvYXJ0aWZhY3RfQTIuMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTIiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPC9Eb21haW4+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IkRpc2NpcGxpbmVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08RGlzY2lwbGluZUdyb3VwaW5nIG5hbWU9ImRpc2NpcGxpbmVfZ3JvdXBpbmdfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgR3JvdXBpbmcgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRpc2NpcGxpbmUgR3JvdXBpbmcgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImRpc2NpcGxpbmVfZ3JvdXBpbmdfQTEsX0NDVmpjQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE3OjQyOjM3IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxkaXNjaXBsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTEiPgotPC9kaXNjaXBsaW5lcz4KLTwvRGlzY2lwbGluZUdyb3VwaW5nPgotPERpc2NpcGxpbmUgbmFtZT0iZGlzY2lwbGluZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGlzY2lwbGluZSBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZGlzY2lwbGluZV9BMSxfQzVkX3dBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9Ik1vbiBBdWcgMjIgMTA6NDU6MDIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkRpc2NpcGxpbmUgQTEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHRhc2tzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExIj4KLTwvdGFza3M+Ci08L0Rpc2NpcGxpbmU+Ci08RGlzY2lwbGluZSBuYW1lPSJkaXNjaXBsaW5lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJkaXNjaXBsaW5lX0EyLF9EenZQb0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo0NDoxNCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGlzY2lwbGluZSBBMiBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08dGFza3MgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIiPgotPC90YXNrcz4KLTwvRGlzY2lwbGluZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iUm9sZVNldHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxSb2xlU2V0R3JvdXBpbmcgbmFtZT0icm9sZV9zZXRfZ3JvdXBpbmdfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgU2V0IEdyb3VwaW5nIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIFNldCBHcm91cGluZyBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icm9sZV9zZXRfZ3JvdXBpbmdfQTEsX0pZbjBnQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE3OjQ5OjMxIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSb2xlIFNldCBHcm91cGluZyBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBTZXQgR3JvdXBpbmcgQTEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHJvbGVTZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvUm9sZVNldHMvcm9sZV9zZXRfQTEiPgotPC9yb2xlU2V0cz4KLTwvUm9sZVNldEdyb3VwaW5nPgotPFJvbGVTZXQgbmFtZT0icm9sZV9zZXRfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgU2V0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIFNldCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icm9sZV9zZXRfQTEsXzlQcDFVQkJLRWRxQnM3S2hkVkxSTEEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJNb24gQXVnIDIyIDEwOjQ3OjIzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSb2xlIFNldCBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBTZXQgQTExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTxyb2xlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMSI+Ci08L3JvbGVzPgotPC9Sb2xlU2V0PgotPFJvbGVTZXQgbmFtZT0icm9sZV9zZXRfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgU2V0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIFNldCBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icm9sZV9zZXRfQTIsXy11YmdjQkJLRWRxQnM3S2hkVkxSTEEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE3OjUwOjQwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSb2xlIFNldCBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBTZXQgQTIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHJvbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0EyIj4KLTwvcm9sZXM+Ci08L1JvbGVTZXQ+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IldQIFR5cGVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9XUCBUeXBlcyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08V29ya1Byb2R1Y3RUeXBlIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJXb3JrIFByb2R1Y3QgVHlwZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iV29yayBQcm9kdWN0IFR5cGUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0ExLF9IZ2hEWUEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxODowMjo0NCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iV29yayBQcm9kdWN0IFR5cGUgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IldvcmsgUHJvZHVjdCBUeXBlIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9kZWxpdmVyYWJsZV9BMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTEiPgotPC93b3JrUHJvZHVjdHM+Ci08L1dvcmtQcm9kdWN0VHlwZT4KLTxXb3JrUHJvZHVjdFR5cGUgbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IldvcmsgUHJvZHVjdCBUeXBlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJXb3JrIFByb2R1Y3QgVHlwZSBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQTIsX0lGblVnQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE4OjAzOjE2IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJXb3JrIFByb2R1Y3QgVHlwZSBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iV29yayBQcm9kdWN0IFR5cGUgQTEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMi9hcnRpZmFjdF9BMi4xIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTIiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPC9Xb3JrUHJvZHVjdFR5cGU+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IlRvb2xzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Ub29scyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08VG9vbCBuYW1lPSJ0b29sX0ExIiBicmllZkRlc2NyaXB0aW9uPSJUb29sIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUb29sIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0b29sX0ExLF9LeGJhZ0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo1MjowNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVG9vbCBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iVG9vbCBBMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTEiPgotPC90b29sTWVudG9ycz4KLTwvVG9vbD4KLTxUb29sIG5hbWU9InRvb2xfQTIiIGJyaWVmRGVzY3JpcHRpb249IlRvb2wgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2wgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRvb2xfQTIsX0xoYUY4QS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE3OjUyOjM0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUb29sIEEyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJUb29sIEEyIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMiI+Ci08L3Rvb2xNZW50b3JzPgotPC9Ub29sPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1N0YW5kYXJkQ2F0ZWdvcmllcyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IkhpZGRlbiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9IaWRkZW4iPgotPC9wYXJlbnRQYWNrYWdlPgotPEN1c3RvbUNhdGVnb3J5IG5hbWU9IkN1c3RvbSBDYXRlZ29yaWVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9IkN1c3RvbSBDYXRlZ29yaWVzLF95VWVMS3ctUEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9BMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08L0N1c3RvbUNhdGVnb3J5PgotPC9Db250ZW50UGFja2FnZT4KLTxDdXN0b21DYXRlZ29yeSBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQTEiIGJyaWVmRGVzY3JpcHRpb249IkN1c3RvbSBDYXRlZ29yeSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ3VzdG9tIENhdGVnb3J5IEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQTEsX01LUG5rQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE3OjUzOjE1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkN1c3RvbSBDYXRlZ29yeSBBMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvc3ViX2N1c3RvbV9jYXRlZ29yeV9BMS4xIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvQ1AxIHdpdGggYWxsIGVsZW1lbnRzIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9DUCBBMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7Ij4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrIEExL2RlbFByb2NQYWtfQTEuMS9kZWxQcm9jUGFrX0ExLjEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPC9DdXN0b21DYXRlZ29yeT4KLTxDdXN0b21DYXRlZ29yeSBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQTIiIGJyaWVmRGVzY3JpcHRpb249IkN1c3RvbSBDYXRlZ29yeSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ3VzdG9tIENhdGVnb3J5IEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQTIsX09TU1NJQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE4OjAyOjA3IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkN1c3RvbSBDYXRlZ29yeSBBMiBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyL2FydGlmYWN0X0EyLjEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0EyIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTwvQ3VzdG9tQ2F0ZWdvcnk+Ci08Q3VzdG9tQ2F0ZWdvcnkgbmFtZT0ic3ViX2N1c3RvbV9jYXRlZ29yeV9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWItQ3VzdG9tIENhdGVnb3J5IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yi1DdXN0b20gQ2F0ZWdvcnkgQTEuMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0ic3ViX2N1c3RvbV9jYXRlZ29yeV9BMS4xLF83ZFhZVUJCS0VkcUJzN0toZFZMUkxBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxODowMToyNiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iU3ViLUN1c3RvbSBDYXRlZ29yeSBBMS4xIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJTdWItQ3VzdG9tIENhdGVnb3J5IEExLjEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTwvQ3VzdG9tQ2F0ZWdvcnk+Ci08L0NvbnRlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJDb3JlQ29udGVudCIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50Ij4KLTwvcGFyZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJjb250ZW50X3BhY2thZ2VfQTEiIGJyaWVmRGVzY3JpcHRpb249IkNvblBhayBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiPgotPC9wYXJlbnRQYWNrYWdlPgotPFJvbGUgbmFtZT0icm9sZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMSIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Um9sZURlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTEsXzU1emswQS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgT2N0IDE4IDE2OjA0OjEwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSb2xlIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJSb2xlIEExIGtleSIgc2tpbGxzPSJSb2xlIEExIHNraWxscyIgYXNzaWdubWVudEFwcHJvYWNoZXM9IlJvbGUgQTEgYXNzaWduIiBzeW5vbnltcz0iUm9sZSBBMSBzeW4iPgotPC9Sb2xlRGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTEiPgotPC9tb2RpZmllcz4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPC9Sb2xlPgotPFJvbGUgbmFtZT0icm9sZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiBleHRlbmRlZCBieSBSb2xlIEEzIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxSb2xlRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMixfNmszVUFBLVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IldlZCBPY3QgMTkgMTA6MzI6MzUgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJvbGUgQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgQTIga2V5IiBza2lsbHM9IlJvbGUgQTIgc2tpbGxzIiBhc3NpZ25tZW50QXBwcm9hY2hlcz0iUm9sZSBBMiBhc3NpZ24iIHN5bm9ueW1zPSJSb2xlIEEyIHN5biI+Ci08L1JvbGVEZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9kZWxpdmVyYWJsZV9BMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGU+Ci08VGFzayBuYW1lPSJ0YXNrX0ExIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEExICIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08VGFza0Rlc2NyaXB0aW9uIG5hbWU9InRhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgT2N0IDE5IDEwOjI4OjM5IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUYXNrIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJUYXNrIEExIGtleSIgcHVycG9zZT0iVGFzayBBMSBwdXJwb3NlIiBhbHRlcm5hdGl2ZXM9IlRhc2sgQTEgYWx0Ij4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249ImFscGhhIj4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQTEuMiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249ImJldGEiPgotPC9TZWN0aW9uPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMS4zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iZ2FtbWEiPgotPC9TZWN0aW9uPgotPC9UYXNrRGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08cGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEiPgotPC9wZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTEiPgotPC9vdXRwdXQ+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9kZWxpdmVyYWJsZV9BMSI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjEiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMiI+Ci08L3N0ZXBzPgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4zIj4KLTwvc3RlcHM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTEiPgotPC90b29sTWVudG9ycz4KLTwvVGFzaz4KLTxUYXNrIG5hbWU9InRhc2tfQTIiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTIgKCBleHRlbmRlZCBieSBUYXNrIEEzICkiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFRhc2tEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iV2VkIE9jdCAxOSAxMDoyOToyMiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGFzayBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iVGFzayBBMiBrZXkiIHB1cnBvc2U9IlRhc2sgQTIgcHVycG9zZSIgYWx0ZXJuYXRpdmVzPSJUYXNrIEEyIGFsdCI+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEEyLjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHB1dCB5b3VyIHJpZ2h0IGZvb3QgaW4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L1NlY3Rpb24+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEEyLjIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJwdXQgeW91ciByaWdodCBmb290IG91dCI+Ci08L1NlY3Rpb24+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEEyLjMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJEbyB0aGUgaG9rZXktcG9rZXkiPgotPC9TZWN0aW9uPgotPC9UYXNrRGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08cGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIiPgotPC9wZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTIiPgotPC9vdXRwdXQ+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTEiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9kZWxpdmVyYWJsZV9BMiI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjEiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMiI+Ci08L3N0ZXBzPgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyL3Rhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMi4zIj4KLTwvc3RlcHM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC90b29sTWVudG9ycz4KLTwvVGFzaz4KLTxBcnRpZmFjdCBuYW1lPSJhcnRpZmFjdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFydGlmYWN0RGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTEgeCxfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IldlZCBTZXAgMDcgMTQ6NTI6NDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkFydGlmYWN0IEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJBcnRpZmFjdCBBMSBrZXkiIGV4dGVybmFsSWQ9IkFydGlmYWN0IEExIHVuaXF1ZSIgcHVycG9zZT0iQXJ0aWZhY3QgQTEgcHVycG9zZSIgaW1wYWN0T2ZOb3RIYXZpbmc9IkFydGlmYWN0IEExIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9IkFydGlmYWN0IEExIHJlYXNvbiIgYnJpZWZPdXRsaW5lPSJBcnRpZmFjdCBBMSBicmllZiIgcmVwcmVzZW50YXRpb25PcHRpb25zPSJBcnRpZmFjdCBBMSByZXAiPgotPC9BcnRpZmFjdERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMSI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMSI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMSI+Ci08L3Rvb2xNZW50b3JzPgotPEFydGlmYWN0IG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08QXJ0aWZhY3REZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfRjUxeXdBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTg6MDQ6MTkgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJTdWJfQXJ0aWZhY3QgQTEuMSBrZXkiIGV4dGVybmFsSWQ9IlN1Yl9BcnRpZmFjdCBBMS4xIHVuaXF1ZSIgcHVycG9zZT0iU3ViX0FydGlmYWN0IEExLjEgcHVycG9zZSIgaW1wYWN0T2ZOb3RIYXZpbmc9IkFydGlmYWN0IEExLjEgaW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iQXJ0aWZhY3QgQTEuMSByZWFzb24iIGJyaWVmT3V0bGluZT0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHJlcHJlc2VudGF0aW9uT3B0aW9ucz0iU3ViX0FydGlmYWN0IEExLjEgcmVwIj4KLTwvQXJ0aWZhY3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTEiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTEiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTEiPgotPC90b29sTWVudG9ycz4KLTxjb250YWluZXJBcnRpZmFjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9jb250YWluZXJBcnRpZmFjdD4KLTwvQXJ0aWZhY3Q+Ci08L0FydGlmYWN0PgotPEFydGlmYWN0IG5hbWU9ImFydGlmYWN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08QXJ0aWZhY3REZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IldlZCBBdWcgMTcgMTk6NDE6MjQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJBcnRpZmFjdCBBMiBrZXkiIGV4dGVybmFsSWQ9IkFydGlmYWN0IEEyIHVuaXF1ZSIgcHVycG9zZT0iQXJ0aWZhY3QgQTIgcHVycG9zZSIgaW1wYWN0T2ZOb3RIYXZpbmc9IkFydGlmYWN0IEEyIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9IkFydGlmYWN0IEEyIHJlYXNvbiIgYnJpZWZPdXRsaW5lPSJBcnRpZmFjdCBBMiBicmllZiIgcmVwcmVzZW50YXRpb25PcHRpb25zPSJBcnRpZmFjdCBBMiByZXAiPgotPC9BcnRpZmFjdERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMiI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMiI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMiI+Ci08L3Rvb2xNZW50b3JzPgotPEFydGlmYWN0IG5hbWU9ImFydGlmYWN0X0EyLjEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyLjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08QXJ0aWZhY3REZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMi4xLF9IRU10RUEtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iV2VkIEF1ZyAxNyAxOTo0NDowNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIuMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQXJ0aWZhY3QgQTIuMSBrZXkiIGV4dGVybmFsSWQ9IkFydGlmYWN0IEEyLjEgdW5pcXVlIiBwdXJwb3NlPSJBcnRpZmFjdCBBMi4xIHB1cnBvc2UiIGltcGFjdE9mTm90SGF2aW5nPSJBcnRpZmFjdCBBMi4xIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9IkFydGlmYWN0IEEyLjEgcmVhc29uIiBicmllZk91dGxpbmU9IkFydGlmYWN0IEEyLjEgYnJpZWYiIHJlcHJlc2VudGF0aW9uT3B0aW9ucz0iQXJ0aWZhY3QgQTIuMSByZXAiPgotPC9BcnRpZmFjdERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMiI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMiI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMiI+Ci08L3Rvb2xNZW50b3JzPgotPGNvbnRhaW5lckFydGlmYWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMi9hcnRpZmFjdF9BMi4xIj4KLTwvY29udGFpbmVyQXJ0aWZhY3Q+Ci08L0FydGlmYWN0PgotPC9BcnRpZmFjdD4KLTxEZWxpdmVyYWJsZSBuYW1lPSJkZWxpdmVyYWJsZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTEsX0lJU25VQS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjI5OjU5IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGVsaXZlcmFibGUgQTEga2V5IiBleHRlcm5hbElkPSJEZWxpdmVyYWJsZSBBMSB1bmlxdWUiIHB1cnBvc2U9IkRlbGl2ZXJhYmxlIEExIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iRGVsaXZlcmFibGUgQTEgaW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iRGVsaXZlcmFibGUgQTEgcmVhc29uIiBleHRlcm5hbERlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMSBleHRlcm4iIHBhY2thZ2luZ0d1aWRhbmNlPSJEZWxpdmVyYWJsZSBBMSBwa2ciPgotPC9EZWxpdmVyYWJsZURlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMSI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMSI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMSI+Ci08L3Rvb2xNZW50b3JzPgotPGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEiPgotPC9kZWxpdmVyZWRXb3JrUHJvZHVjdHM+Ci08ZGVsaXZlcmVkV29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L2RlbGl2ZXJlZFdvcmtQcm9kdWN0cz4KLTxkZWxpdmVyZWRXb3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTEiPgotPC9kZWxpdmVyZWRXb3JrUHJvZHVjdHM+Ci08L0RlbGl2ZXJhYmxlPgotPERlbGl2ZXJhYmxlIG5hbWU9ImRlbGl2ZXJhYmxlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08RGVsaXZlcmFibGVEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMixfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MTUgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEEyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEZWxpdmVyYWJsZSBBMiBrZXkiIGV4dGVybmFsSWQ9IkRlbGl2ZXJhYmxlIEEyIHVuaXF1ZSIgcHVycG9zZT0iRGVsaXZlcmFibGUgQTIgcG9ycG9pc2UiIGltcGFjdE9mTm90SGF2aW5nPSJEZWxpdmVyYWJsZSBBMiZhbXA7bmJzcDtpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJEZWxpdmVyYWJsZSBBMiByZWFzb24iIGV4dGVybmFsRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEEyIGV4dGVybiIgcGFja2FnaW5nR3VpZGFuY2U9IkRlbGl2ZXJhYmxlIEEyIHBrZyI+Ci08L0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08cmVwb3J0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmVwb3J0X0EyIj4KLTwvcmVwb3J0cz4KLTx0ZW1wbGF0ZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0EyIj4KLTwvdGVtcGxhdGVzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0EyIj4KLTwvdG9vbE1lbnRvcnM+Ci08ZGVsaXZlcmVkV29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMiI+Ci08L2RlbGl2ZXJlZFdvcmtQcm9kdWN0cz4KLTxkZWxpdmVyZWRXb3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTIiPgotPC9kZWxpdmVyZWRXb3JrUHJvZHVjdHM+Ci08L0RlbGl2ZXJhYmxlPgotPE91dGNvbWUgbmFtZT0ib3V0Y29tZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjE4IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIE91dGNvbWUgQTEgIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJPdXRjb21lIEExIGtleSIgZXh0ZXJuYWxJZD0iT3V0Y29tZSBBMSB1bmlxdWUiIHB1cnBvc2U9Ik91dGNvbWUgQTEgcG9ycG9pc2UiIGltcGFjdE9mTm90SGF2aW5nPSJPdXRjb21lIEExIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9Ik91dGNvbWUgQTEgcmVhc29uIj4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTEiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTEiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTEiPgotPC90b29sTWVudG9ycz4KLTwvT3V0Y29tZT4KLTxPdXRjb21lIG5hbWU9Im91dGNvbWVfQTIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08V29ya1Byb2R1Y3REZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0EyLF9Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDoyMSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iT3V0Y29tZSBBMSBrZXkiIGV4dGVybmFsSWQ9Ik91dGNvbWUgQTEgdW5pcXVlIiBwdXJwb3NlPSJPdXRjb21lIEExIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iT3V0Y29tZSBBMSBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJPdXRjb21lIEExIHJlYXNvbiI+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08cmVwb3J0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmVwb3J0X0EyIj4KLTwvcmVwb3J0cz4KLTx0ZW1wbGF0ZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0EyIj4KLTwvdGVtcGxhdGVzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0EyIj4KLTwvdG9vbE1lbnRvcnM+Ci08L091dGNvbWU+Ci08Q2hlY2tsaXN0IG5hbWU9ImNoZWNrbGlzdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQ2hlY2tsaXN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDaGVja2xpc3QgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImNoZWNrbGlzdF9BMSxfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MzQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkNoZWNrbGlzdCBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9DaGVja2xpc3Q+Ci08Q29uY2VwdCBuYW1lPSJjb25jZXB0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJDb25jZXB0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDb25jZXB0IEExIHByZXNlbnQiIHNoYXBlaWNvbj0iZmlsZTovQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvdHJhbi1sdXUvSUJNL01ldGhvZExpYnJhcmllcy9wYXJpcy9QbHVnJTIwQS9ndWlkYW5jZXMvY29uY2VwdHMvcmVzb3VyY2VzL3R5cmFubm9zYXVydXMuZ2lmIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY29uY2VwdF9BMSxfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MzAgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQ29uY2VwdCBBMSBjb250ZW50JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBGaWxlIGxpbms6JmFtcDtuYnNwOyZsdDthIGhyZWY9JnF1b3Q7ZmlsZTovLy9yZXNvdXJjZXMvY29uY2VwdF9BMS54bWkmcXVvdDsmZ3Q7Y29uY2VwdF9BMS54bWkmbHQ7L2EmZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBVUkw6JmFtcDtuYnNwOyZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5wb3NpdHJvbmdyb3VwLmNvbSZxdW90OyZndDtodHRwOi8vd3d3LnBvc2l0cm9uZ3JvdXAuY29tJmx0Oy9hJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgSW1hZ2U6JmFtcDtuYnNwOyZsdDtpbWcgaGVpZ2h0PSZxdW90OzMyJnF1b3Q7IGFsdD0mcXVvdDtQJnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvdHlyYW5ub3NhdXJ1cy5naWYmcXVvdDsgd2lkdGg9JnF1b3Q7MzImcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEVsZW1lbnQgcGxhaW46JmFtcDtuYnNwOyZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90Oy4vLi4vLi4vLi4vUGx1ZyUyMEEvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQTIsX09WTFZjQS1URWRxTDJPMVBKVjljWkEuaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDtfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSZxdW90OyZndDtDb25jZXB0IEEyIHByZXNlbnQmbHQ7L2EmZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBFbGVtZW50IHdpdGggdHlwZTomYW1wO25ic3A7Jmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmtXaXRoVHlwZSZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDsuLy4uLy4uLy4uL1BsdWclMjBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLF9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBLmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7X09WTFZjQS1URWRxTDJPMVBKVjljWkEmcXVvdDsmZ3Q7Q29uY2VwdDogQ29uY2VwdCBBMiBwcmVzZW50Jmx0Oy9hJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgRWxlbWVudCB3aXRoIHVzZXIgdGV4dDomYW1wO25ic3A7ICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rV2l0aFVzZXJUZXh0JnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90Oy4vLi4vLi4vLi4vUGx1ZyUyMEEvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQTIsX09WTFZjQS1URWRxTDJPMVBKVjljWkEuaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDtfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSZxdW90OyZndDtjb25jZXB0X0EyIHVzZXIgdGV4dCZsdDsvYSZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvQ29uY2VwdD4KLTxFeGFtcGxlIG5hbWU9ImV4YW1wbGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkV4YW1wbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkV4YW1wbGUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImV4YW1wbGVfQTEsX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjM4IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJFeGFtcGxlIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0V4YW1wbGU+Ci08R3VpZGVsaW5lIG5hbWU9Imd1aWRlbGluZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iR3VpZGVsaW5lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJHdWlkZWxpbmUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9Imd1aWRlbGluZV9BMSxfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NDMgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249Ikd1aWRlbGluZSBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9HdWlkZWxpbmU+Ci08UHJhY3RpY2UgbmFtZT0icHJhY3RpY2VfQTEiIGJyaWVmRGVzY3JpcHRpb249IlByYWN0aWNlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJQcmFjdGljZSBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxQcmFjdGljZURlc2NyaXB0aW9uIG5hbWU9InByYWN0aWNlX0ExLF9QOGpZWUEtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMToxOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiIgYWRkaXRpb25hbEluZm89IlByYWN0aWNlIEExIGFkZCIgcHJvYmxlbT0iUHJhY3RpY2UgQTEgcHJvYmxlbSIgYmFja2dyb3VuZD0iUHJhY3RpY2UgQTEgYmFjayIgZ29hbHM9IlByYWN0aWNlIEExIGdvYWwiIGFwcGxpY2F0aW9uPSJQcmFjdGljZSBBMSBhcHAiIGxldmVsc09mQWRvcHRpb249IlByYWN0aWNlIEExIGxldmVsIj4KLTwvUHJhY3RpY2VEZXNjcmlwdGlvbj4KLTxQcmFjdGljZSBuYW1lPSJwcmFjdGljZV9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJQcmFjdGljZSBBMS4xIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFByYWN0aWNlRGVzY3JpcHRpb24gbmFtZT0icHJhY3RpY2VfQTEuMSxfLUZTVWdBLVVFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MjAgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlByYWN0aWNlIEExLjEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiIgYWRkaXRpb25hbEluZm89IlByYWN0aWNlIEExLjEgYWRkIiBwcm9ibGVtPSJQcmFjdGljZSBBMS4xIHByb2JsZW0iIGJhY2tncm91bmQ9IlByYWN0aWNlIEExLjEgYmFjayIgZ29hbHM9IlByYWN0aWNlIEExLjEgZ29hbCIgYXBwbGljYXRpb249IlByYWN0aWNlIEExLjEgYXBwIiBsZXZlbHNPZkFkb3B0aW9uPSJQcmFjdGljZSBBMS4xIGxldmVsIj4KLTwvUHJhY3RpY2VEZXNjcmlwdGlvbj4KLTwvUHJhY3RpY2U+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMvZGlzY2lwbGluZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRG9tYWlucy9kb21haW5fQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzL3JvbGVfc2V0X0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Ub29scy90b29sX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9XUCBUeXBlcy93b3JrX3Byb2R1Y3RfdHlwZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3ByYWN0aWNlX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2FkbWFwX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9kZWxpdmVyYWJsZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9zdWJfY3VzdG9tX2NhdGVnb3J5X0ExLjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfZ3JvdXBpbmdfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0RvbWFpbnMvZG9tYWluX0ExL3N1Yl9kb21haW5fQTEuMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvUm9sZVNldHMvcm9sZV9zZXRfZ3JvdXBpbmdfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTwvUHJhY3RpY2U+Ci08UmVwb3J0IG5hbWU9InJlcG9ydF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iUmVwb3J0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSZXBvcnQgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJlcG9ydF9BMSxfUTVEYzRBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NTEgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJlcG9ydCBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9SZXBvcnQ+Ci08UmV1c2FibGVBc3NldCBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iUmV1c2FibGUgQXNzZXQgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJldXNhYmxlIEFzc2V0IEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMSxfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MjcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJldXNhYmxlIEFzc2V0IEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1JldXNhYmxlQXNzZXQ+Ci08Um9hZG1hcCBuYW1lPSJyb2FkbWFwX0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2FkbWFwIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2FkbWFwIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyb2FkbWFwX0ExLF9aazM5Z0EtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDowNCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9hZG1hcCBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Sb2FkbWFwPgotPFN1cHBvcnRpbmdNYXRlcmlhbCBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0ExIiBicmllZkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0ExLF9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMTowMSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9TdXBwb3J0aW5nTWF0ZXJpYWw+Ci08VGVtcGxhdGUgbmFtZT0idGVtcGxhdGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IlRlbXBsYXRlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUZW1wbGF0ZSBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxHdWlkYW5jZURlc2NyaXB0aW9uIG5hbWU9InRlbXBsYXRlX0ExLF9iRklQVUEtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDo1NiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGVtcGxhdGUgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiIgYXR0YWNobWVudHM9IiI+Ci08L0d1aWRhbmNlRGVzY3JpcHRpb24+Ci08L1RlbXBsYXRlPgotPFRvb2xNZW50b3IgbmFtZT0idG9vbG1lbnRvcl9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iVG9vbG1lbnRvciBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVG9vbG1lbnRvciBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0idG9vbG1lbnRvcl9BMSxfaEhFam9BLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MDUgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRvb2xtZW50b3IgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvVG9vbE1lbnRvcj4KLTxXaGl0ZXBhcGVyIG5hbWU9IndoaXRlcGFwZXJfQTEiIGJyaWVmRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IldoaXRlcGFwZXIgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9IndoaXRlcGFwZXJfQTEsX2g4UkdRQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjEzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJXaGl0ZXBhcGVyIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1doaXRlcGFwZXI+Ci08Q29uY2VwdCBuYW1lPSJjb25jZXB0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJDb25jZXB0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDb25jZXB0IEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJjb25jZXB0X0EyLF9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDoyNCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ29uY2VwdCBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Db25jZXB0PgotPENoZWNrbGlzdCBuYW1lPSJjaGVja2xpc3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkNoZWNrbGlzdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ2hlY2tsaXN0IEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJjaGVja2xpc3RfQTIsX2tyaVRjQS1URWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjM2IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQTIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvQ2hlY2tsaXN0PgotPEV4YW1wbGUgbmFtZT0iZXhhbXBsZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRXhhbXBsZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRXhhbXBsZSBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZXhhbXBsZV9BMixfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NDEgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkV4YW1wbGUgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvRXhhbXBsZT4KLTxHdWlkZWxpbmUgbmFtZT0iZ3VpZGVsaW5lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJHdWlkZWxpbmUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ikd1aWRlbGluZSBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZ3VpZGVsaW5lX0EyLF82WVV3QUEtVEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDo0NSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iR3VpZGVsaW5lIEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0d1aWRlbGluZT4KLTxSZXBvcnQgbmFtZT0icmVwb3J0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJSZXBvcnQgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJlcG9ydCBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icmVwb3J0X0EyLF9Hckd3UUEtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDo1MyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUmVwb3J0IEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1JlcG9ydD4KLTxUZW1wbGF0ZSBuYW1lPSJ0ZW1wbGF0ZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iVGVtcGxhdGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRlbXBsYXRlIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEd1aWRhbmNlRGVzY3JpcHRpb24gbmFtZT0idGVtcGxhdGVfQTIsX1pYcTlFQS1VRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjU4IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUZW1wbGF0ZSBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhdHRhY2htZW50cz0iIj4KLTwvR3VpZGFuY2VEZXNjcmlwdGlvbj4KLTwvVGVtcGxhdGU+Ci08U3VwcG9ydGluZ01hdGVyaWFsIG5hbWU9InN1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiIGJyaWVmRGVzY3JpcHRpb249IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InN1cHBvcnRpbmdfbWF0ZXJpYWxfQTIsX21Qc19jQS1VRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjAzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1N1cHBvcnRpbmdNYXRlcmlhbD4KLTxUb29sTWVudG9yIG5hbWU9InRvb2xtZW50b3JfQTIiIGJyaWVmRGVzY3JpcHRpb249IlRvb2xtZW50b3IgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2xtZW50b3IgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRvb2xtZW50b3JfQTIsX3Y3SktBQS1VRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjA4IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1Rvb2xNZW50b3I+Ci08V2hpdGVwYXBlciBuYW1lPSJ3aGl0ZXBhcGVyX0EyIiBicmllZkRlc2NyaXB0aW9uPSJXaGl0ZXBhcGVyIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJXaGl0ZXBhcGVyIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ3aGl0ZXBhcGVyX0EyLF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMToxNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9XaGl0ZXBhcGVyPgotPFByYWN0aWNlIG5hbWU9InByYWN0aWNlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08UHJhY3RpY2VEZXNjcmlwdGlvbiBuYW1lPSJwcmFjdGljZV9BMixfRXBmb1lBLVZFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MjMgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlByYWN0aWNlIEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGFkZGl0aW9uYWxJbmZvPSJQcmFjdGljZSBBMiBhZGQiIHByb2JsZW09IlByYWN0aWNlIEEyIHByb2JsZW0iIGJhY2tncm91bmQ9IlByYWN0aWNlIEEyIGJhY2siIGdvYWxzPSJQcmFjdGljZSBBMiBnb2FsIiBhcHBsaWNhdGlvbj0iUHJhY3RpY2UgQTIgYXBwIiBsZXZlbHNPZkFkb3B0aW9uPSJQcmFjdGljZSBBMiBsZXZlbCI+Ci08L1ByYWN0aWNlRGVzY3JpcHRpb24+Ci08UHJhY3RpY2UgbmFtZT0icHJhY3RpY2VfQTIuMSIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTIuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQTIuMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxQcmFjdGljZURlc2NyaXB0aW9uIG5hbWU9InByYWN0aWNlX0EyLjEsX0pyZ3d3QS1WRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjI1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMi4xIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGFkZGl0aW9uYWxJbmZvPSJQcmFjdGljZSBBMi4xIGFkZCIgcHJvYmxlbT0iUHJhY3RpY2UgQTIuMSBwcm9ibGVtIiBiYWNrZ3JvdW5kPSJQcmFjdGljZSBBMi4xIGJhY2siIGdvYWxzPSJQcmFjdGljZSBBMi4xIGdvYWwiIGFwcGxpY2F0aW9uPSJQcmFjdGljZSBBMi4xIGFwcCIgbGV2ZWxzT2ZBZG9wdGlvbj0iUHJhY3RpY2UgQTIuMSBsZXZlbCI+Ci08L1ByYWN0aWNlRGVzY3JpcHRpb24+Ci08L1ByYWN0aWNlPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMi9hcnRpZmFjdF9BMi4xIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcHJhY3RpY2VfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmVwb3J0X0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvYWRtYXBfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMvZGlzY2lwbGluZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRG9tYWlucy9kb21haW5fQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzL3JvbGVfc2V0X0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Ub29scy90b29sX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9XUCBUeXBlcy93b3JrX3Byb2R1Y3RfdHlwZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPC9QcmFjdGljZT4KLTxSZXVzYWJsZUFzc2V0IG5hbWU9InJldXNhYmxlX2Fzc2V0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJSZXVzYWJsZSBBc3NldCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUmV1c2FibGUgQXNzZXQgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJldXNhYmxlX2Fzc2V0X0EyLF9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMToyOSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUmV1c2FibGUgQXNzZXQgQTIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvUmV1c2FibGVBc3NldD4KLTxSb2FkbWFwIG5hbWU9InJvYWRtYXBfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvYWRtYXAgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvYWRtYXAgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvYWRtYXBfQTIsX1l1a2dRQS1WRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjA2IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSb2FkbWFwIEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1JvYWRtYXA+Ci08VGVybURlZmluaXRpb24gbmFtZT0idGVybV9kZWZpbml0aW9uX0EyIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRlcm0gRGVmaW5pdGlvbiBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0idGVybV9kZWZpbml0aW9uX0EyLF9vOEk3RUEtVkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMTo0MiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGVybSBEZWZpbml0aW9uIEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1Rlcm1EZWZpbml0aW9uPgotPFRlcm1EZWZpbml0aW9uIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUZXJtIERlZmluaXRpb24gQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9BMSxfc2ZpSlVBLVZFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MTIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRlcm0gRGVmaW5pdGlvbiBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9UZXJtRGVmaW5pdGlvbj4KLTxUYXNrIG5hbWU9InRhc2tfQTMiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmOiBUYXNrIEEzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iJmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7QVNDSUkmcXVvdDs/Jmd0OyAmbHQ7Y29tLmlibS51bWEuZWRpdC50bmcudXRpbC5tb2RlbDpPcmRlckluZm9Db2xsZWN0aW9uIHhtaTp2ZXJzaW9uPSZxdW90OzIuMCZxdW90OyB4bWxuczp4bWk9JnF1b3Q7aHR0cDovL3d3dy5vbWcub3JnL1hNSSZxdW90OyB4bWxuczpjb20uaWJtLnVtYS5lZGl0LnRuZy51dGlsLm1vZGVsPSZxdW90O2h0dHA6Ly8vY29tL2libS91bWEvZWRpdC90bmcvdXRpbC9tb2RlbC5lY29yZSZxdW90OyZndDsgICAmbHQ7b3JkZXJJbmZvcyBuYW1lPSZxdW90O3NlY3Rpb25zJnF1b3Q7IHRpbWVzdGFtcD0mcXVvdDsxMTI5NzQ3MjY0MTA5JnF1b3Q7Jmd0OyAgICAgJmx0O2dVSURzJmd0O19yQ1d3VUVEUEVkcXJoc1poM1FOQU1RJmx0Oy9nVUlEcyZndDsgICAgICZsdDtnVUlEcyZndDtfdGkyQllCQk9FZHFCczdLaGRWTFJMQSZsdDsvZ1VJRHMmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3VteWdZRURQRWRxcmhzWmgzUU5BTVEmbHQ7L2dVSURzJmd0OyAgICAgJmx0O2dVSURzJmd0O190azdzRUJCT0VkcUJzN0toZFZMUkxBJmx0Oy9nVUlEcyZndDsgICAgICZsdDtnVUlEcyZndDtfdng1QmtFRFBFZHFyaHNaaDNRTkFNUSZsdDsvZ1VJRHMmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3RuZGJvQkJPRWRxQnM3S2hkVkxSTEEmbHQ7L2dVSURzJmd0OyAgICZsdDsvb3JkZXJJbmZvcyZndDsgJmx0Oy9jb20uaWJtLnVtYS5lZGl0LnRuZy51dGlsLm1vZGVsOk9yZGVySW5mb0NvbGxlY3Rpb24mZ3Q7ICIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMyBleHRlbmRzIFRhc2sgQTIiIHZhcmlhYmlsaXR5VHlwZT0iZXh0ZW5kcyI+Ci08VGFza0Rlc2NyaXB0aW9uIG5hbWU9Iixfb1VsdUVFREZFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IldlZCBPY3QgMTkgMTA6Mjc6NDMgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249Im1haW46IFRhc2sgQTMiIGtleUNvbnNpZGVyYXRpb25zPSJrZXlzOiBUYXNrIEEzIiBwdXJwb3NlPSJwdXJwb3NlOiBUYXNrIEEzIiBhbHRlcm5hdGl2ZXM9ImFsdGVybmF0aXZlczogVGFzayBBMyI+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEEzLjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJTdGVwIEEzLjEiPgotPC9TZWN0aW9uPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMy4yIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iU3RlcCBBMy4yIj4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQTMuMyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249IlN0ZXAgQTMuMyI+Ci08L1NlY3Rpb24+Ci08L1Rhc2tEZXNjcmlwdGlvbj4KLTx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EzIj4KLTwvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4KLTxwZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMyI+Ci08L3BlcmZvcm1lZEJ5PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0EyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTMvLF9vVWx1RUVERkVkcU85TTNmdWtZQV9BL1N0ZXAgQTMuMSI+Ci08L3N0ZXBzPgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EzLyxfb1VsdUVFREZFZHFPOU0zZnVrWUFfQS9TdGVwIEEzLjIiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMy8sX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EvU3RlcCBBMy4zIj4KLTwvc3RlcHM+Ci08L1Rhc2s+Ci08Um9sZSBuYW1lPSJyb2xlX0EzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZiA6IFJvbGUgQTMiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTMgZXh0ZW5kcyBSb2xlIEEyIiB2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiPgotPFJvbGVEZXNjcmlwdGlvbiBuYW1lPSJuZXdfcm9sZSxfOFpONkFFREZFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IldlZCBPY3QgMTkgMTA6Mjk6NTkgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249Im1haW46IFJvbGUgQTMiIGtleUNvbnNpZGVyYXRpb25zPSJrZXk6IFJvbGUgQTMiIHNraWxscz0ic2tpbGxzOiBSb2xlIEEzIiBhc3NpZ25tZW50QXBwcm9hY2hlcz0iYXNzaWdubWVudDogUm9sZSBBMyIgc3lub255bXM9InN5bm9ueW1ucyA6IFJvbGUgQTMiPgotPC9Sb2xlRGVzY3JpcHRpb24+Ci08dmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMyI+Ci08L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci08L1JvbGU+Ci08L0NvbnRlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9ImNhcFBhdFBha19BMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NDb21wb25lbnQgbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJQaGFzZTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9Ikl0ZXJhdGlvbjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iQWN0aXZpdHkxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvcGFyZW50UGFja2FnZT4KLTxBY3Rpdml0eSBuYW1lPSJBY3Rpdml0eTEiIGJyaWVmRGVzY3JpcHRpb249IlRoaXMgYWN0aXZpdHkgY29udGFpbnMgdGFza3MgdGhhdCBhcmUgYXNzb2NpYXRlZCB0byBhbm90aGVyIHRhc2tzLkFsc28gdGhlaXIgc3RlcHMgYXJlIGFkZGVkLiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQWN0aXZpdHkxIGNvbnRhaW5pbmcgdGFza3MgbGlua2VkIHRvIG1ldGhvZCBlbGVtZW50cyIgcHJlZml4PSJQcmVmaXgiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0idHJ1ZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iQWN0aXZpdHkxLF9FNzNySVR6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhpcyBXb3JrZmxvdyBEZXRhaWw6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3VsJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIFByb3ZpZGVzIHRoZSBuYXR1cmFsICZsdDtiJmd0O3RyYW5zaXRpb24gZnJvbSBhbmFseXNpcyZsdDsvYiZndDsgYWN0aXZpdGllcyAmbHQ7YiZndDt0byBkZXNpZ24mbHQ7L2ImZ3Q7IGFjdGl2aXRpZXMsIGlkZW50aWZ5aW5nOiAmIzEzOyYjMTA7ICAgICAgICAmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGRlc2lnbiBlbGVtZW50cyBmcm9tIGFuYWx5c2lzIGVsZW1lbnRzJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGRlc2lnbiBtZWNoYW5pc21zIGZyb20gcmVsYXRlZCBhbmFseXNpcyBtZWNoYW5pc21zJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0Oy91bCZndDsmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0O2ImZ3Q7RGVzY3JpYmVzJmx0Oy9iJmd0OyB0aGUgb3JnYW5pemF0aW9uIG9mIHRoZSBzeXN0ZW0mYXBvcztzICZsdDtiJmd0O3J1bi10aW1lIGFuZCBkZXBsb3ltZW50IGFyY2hpdGVjdHVyZSZsdDsvYiZndDsmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0O2ImZ3Q7T3JnYW5pemVzIHRoZSBpbXBsZW1lbnRhdGlvbiBtb2RlbCZsdDsvYiZndDsgc28gYXMgdG8gbWFrZSB0aGUgdHJhbnNpdGlvbiBiZXR3ZWVuIGRlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gc2VhbWxlc3MmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0O2ImZ3Q7TWFpbnRhaW5zIHRoZSBjb25zaXN0ZW5jeSBhbmQgaW50ZWdyaXR5IG9mIHRoZSBhcmNoaXRlY3R1cmUmbHQ7L2ImZ3Q7LCBlbnN1cmluZyB0aGF0OiAmIzEzOyYjMTA7ICAgICAgICAmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIG5ldyBkZXNpZ24gZWxlbWVudHMgaWRlbnRpZmllZCBmb3IgdGhlIGN1cnJlbnQgaXRlcmF0aW9uIGFyZSBpbnRlZ3JhdGVkIHdpdGggcHJlLWV4aXN0aW5nIGRlc2lnbiBlbGVtZW50cy4mIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgbWF4aW1hbCByZS11c2Ugb2YgYXZhaWxhYmxlIGNvbXBvbmVudHMgYW5kIGRlc2lnbiBlbGVtZW50cyBpcyBhY2hpZXZlZCBhcyBlYXJseSBhcyBwb3NzaWJsZSBpbiB0aGUgZGVzaWduJiMxMzsmIzEwOyAgICAgICAgICAgICAgICBlZmZvcnQuJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0Oy91bCZndDsmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyZsdDsvdWwmZ3Q7IiBrZXlDb25zaWRlcmF0aW9ucz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBLZXkgY29uc2lkZXJhdGlvbnM6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3VsJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTEmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5MiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTQmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5NSYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk2JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTcmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyZsdDsvdWwmZ3Q7IiB1c2FnZUd1aWRhbmNlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSB3b3JrIGlzIGJlc3QgZG9uZSBpbiBzZXZlcmFsIHNlc3Npb25zLCBwZXJoYXBzIHBlcmZvcm1lZCBvdmVyIGEgZmV3IGRheXMgKG9yIHdlZWtzIGFuZCBtb250aHMgZm9yIHZlcnkgbGFyZ2UmIzEzOyYjMTA7ICAgIHN5c3RlbXMpLiBUaGUgaW5pdGlhbCBmb2N1cyB3aWxsIGJlIG9uIHRoZSBhY3Rpdml0aWVzICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fbWVjaGFuaXNtcyx7QzdBMjZCRDctMzgyMC00OEQ5LTgzMEYtNjg0QzNBRjE1NUY5fS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3tDN0EyNkJENy0zODIwLTQ4RDktODMwRi02ODRDM0FGMTU1Rjl9JnF1b3Q7Jmd0O0lkZW50aWZ5IERlc2lnbiBNZWNoYW5pc21zJmx0Oy9hJmd0OyBhbmQgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduLHs1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezU4Njk2M0QwLTYwN0QtNEVDMi04RDUzLTI5MkRBRkFCOUM5Mn0mcXVvdDsmZ3Q7aWRlbnRpZnlfZGVzaWduX2VsZW1lbnRzX3JlYWwtdGltZV9kZXNpZ24mbHQ7L2EmZ3Q7LCB3aXRoIGEgZ3JlYXQgZGVhbCBvZiYjMTM7JiMxMDsgICAgaXRlcmF0aW9uIHdpdGggdGhlICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pbmNvcnBvcmF0ZV9kZXNpZ25fZWxlbWVudHMsezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NUM2NDcxNzMtNEUzMi00NTk0LTk2QTktMjU0OEI0NzcyMkZBfSZxdW90OyZndDtJbmNvcnBvcmF0ZSBFeGlzdGluZyBEZXNpZ24gRWxlbWVudHMmbHQ7L2EmZ3Q7IGFjdGl2aXR5IHRvIG1ha2Ugc3VyZSB0aGF0IG5ldyYjMTM7JiMxMDsgICAgZWxlbWVudHMgZG8gbm90IGR1cGxpY2F0ZSBmdW5jdGlvbmFsaXR5IG9mIGV4aXN0aW5nIGVsZW1lbnRzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXMgdGhlIGRlc2lnbiBlbWVyZ2VzLCBjb25jdXJyZW5jeSBhbmQgZGlzdHJpYnV0aW9uIGlzc3VlcyBhcmUgaW50cm9kdWNlZCBpbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvZGVzY3JpYmVfcnVudGltZV9hcmNoaXRlY3R1cmUsezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NEQzNUMwMzgtQTJEMC00OEI4LTlFQ0QtNTI3MTdGRUFFMzNBfSZxdW90OyZndDtEZXNjcmliZSB0aGUgUnVuLXRpbWUgQXJjaGl0ZWN0dXJlJmx0Oy9hJmd0OyBhbmQgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX2Rpc3RyaWJ1dGlvbix7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s2QTExMjgwOC0wQTkwLTQyN0EtQkFCOS1FMTRGM0ZCRjcyQjV9JnF1b3Q7Jmd0O0Rlc2NyaWJlIERpc3RyaWJ1dGlvbiZsdDsvYSZndDssIHJlc3BlY3RpdmVseS4gQXMgdGhlc2UgaXNzdWVzIGFyZSBjb25zaWRlcmVkLCYjMTM7JiMxMDsgICAgY2hhbmdlcyB0byBkZXNpZ24gZWxlbWVudHMgbWF5IGJlIHJlcXVpcmVkIHRvIHNwbGl0IGJlaGF2aW9yIGFjcm9zcyBwcm9jZXNzZXMsIHRocmVhZHMgb3Igbm9kZXMuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBcyB0aGUgaW5kaXZpZHVhbCBtb2RlbHMgYXJlIHJlZmluZWQgdG8gaW5jb3Jwb3JhdGUgdGhlIGFyY2hpdGVjdHVyYWwgZGVjaXNpb25zLCB0aGUgcmVzdWx0cyBhcmUgZG9jdW1lbnRlZCBpbiYjMTM7JiMxMDsgICAgcmVzcGVjdGl2ZSB2aWV3IHNlY3Rpb25zIGluIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgKGUuZy4sIGFzIHRoZSBEZXNpZ24gTW9kZWwgaXMgcmVmaW5lZCwgdGhlIExvZ2ljYWwgVmlldyYjMTM7JiMxMDsgICAgb2YgdGhlIFNvZnR3YXJlIEFyY2hpdGVjdHVyZSBEb2N1bWVudCBpcyByZWZpbmVkLCBhcyB3ZWxsKS4gVGhlIHJlc3VsdGluZyBhcmNoaXRlY3R1cmUgaXMgcmV2aWV3ZWQuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7JiMxMzsmIzEwOyZsdDticiAvJmd0OyIgcHVycG9zZT0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBQdXJwb3NlIG9mIHRoaXMgYWN0aXZpdHkgaXMgdG8gaGF2ZSB0YXNrcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHRvIG90aGVyIHRhc2tzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmFtcDtuYnNwOyZsdDtpbWcgaGVpZ2h0PSZxdW90OzcxJnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9ydXAuanBnJnF1b3Q7IHdpZHRoPSZxdW90OzE3NiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiBhbHRlcm5hdGl2ZXM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQWx0ZXJhbnRpdmVzOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtvbCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBBbHRlcjEmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgQWx0ZXIyJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIEFsdGVyMyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7Jmx0Oy9vbCZndDsiIGhvd3RvU3RhZmY9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlc2UgYWN0aXZpdGllcyBhcmUgYmVzdCBjYXJyaWVkIG91dCBieSBhIHNtYWxsIHRlYW0gc3RhZmZlZCBieSBjcm9zcy1mdW5jdGlvbmFsIHRlYW0gbWVtYmVycy4gSXNzdWVzIHRoYXQgYXJlJiMxMzsmIzEwOyAgICB0eXBpY2FsbHkgYXJjaGl0ZWN0dXJhbGx5IHNpZ25pZmljYW50IGluY2x1ZGUgdXNhYmlsaXR5LCBwZXJmb3JtYW5jZSwgc2NhbGluZywgcHJvY2VzcyBhbmQgdGhyZWFkIHN5bmNocm9uaXphdGlvbiwgYW5kJiMxMzsmIzEwOyAgICBkaXN0cmlidXRpb24uIFRoZSB0ZWFtIHNob3VsZCBhbHNvIGluY2x1ZGUgbWVtYmVycyB3aXRoIGRvbWFpbiBleHBlcmllbmNlIHdobyBjYW4gaWRlbnRpZnkga2V5IGFic3RyYWN0aW9ucy4gVGhlIHRlYW0mIzEzOyYjMTA7ICAgIHNob3VsZCBhbHNvIGhhdmUgZXhwZXJpZW5jZSB3aXRoIG1vZGVsIG9yZ2FuaXphdGlvbiBhbmQgbGF5ZXJpbmcuIFRoZSB0ZWFtIHdpbGwgbmVlZCB0byBiZSBhYmxlIHRvIHB1bGwgYWxsIHRoZXNlJiMxMzsmIzEwOyAgICBkaXNwYXJhdGUgdGhyZWFkcyBpbnRvIGEgY29oZXNpdmUsIGNvaGVyZW50IChhbGJlaXQgcHJlbGltaW5hcnkpIGFyY2hpdGVjdHVyZS4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEJlY2F1c2UgdGhlIGZvY3VzIG9mIHRoZSBhcmNoaXRlY3R1cmUgZWZmb3J0IGlzIHNoaWZ0aW5nIHRvd2FyZCBpbXBsZW1lbnRhdGlvbiBpc3N1ZXMsIGdyZWF0ZXIgYXR0ZW50aW9uIG5lZWRzIHRvIGJlJiMxMzsmIzEwOyAgICBwYWlkIHRvIHNwZWNpZmljIHRlY2hub2xvZ3kgaXNzdWVzLiBUaGlzIHdpbGwgZm9yY2UgdGhlIGFyY2hpdGVjdHVyZSB0ZWFtIHRvIHNoaWZ0IG1lbWJlcnMgb3IgZXhwYW5kIHRvIGluY2x1ZGUgcGVvcGxlJiMxMzsmIzEwOyAgICB3aXRoIGRpc3RyaWJ1dGlvbiBhbmQgZGVwbG95bWVudCBleHBlcnRpc2UgKGlmIHRob3NlIGlzc3VlcyBhcmUgYXJjaGl0ZWN0dXJhbGx5IHNpZ25pZmljYW50KS4gSW4gb3JkZXIgdG8gdW5kZXJzdGFuZCYjMTM7JiMxMDsgICAgdGhlIHBvdGVudGlhbCBpbXBhY3Qgb2YgdGhlIHN0cnVjdHVyZSBvbiB0aGUgaW1wbGVtZW50YXRpb24gbW9kZWwgb24gdGhlIGVhc2Ugb2YgaW50ZWdyYXRpb24sIGV4cGVydGlzZSBpbiB0aGUgc29mdHdhcmUmIzEzOyYjMTA7ICAgIGJ1aWxkIG1hbmFnZW1lbnQgcHJvY2VzcyBpcyB1c2VmdWwgdG8gaGF2ZS4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEF0IHRoZSBzYW1lIHRpbWUsIGl0IGlzIGVzc2VudGlhbCB0aGF0IHRoZSBhcmNoaXRlY3R1cmUgdGVhbSBub3QgYmUgY29tcG9zZWQgb2YgYSBsYXJnZSBleHRlbmRlZCB0ZWFtLiBBIHN0cmF0ZWd5IGZvciYjMTM7JiMxMDsgICAgY291bnRlcmluZyB0aGlzIHRyZW5kIGlzIHRvIHJldGFpbiBhIHJlbGF0aXZlbHkgc21hbGwgY29yZSB0ZWFtIHdpdGggYSBzYXRlbGxpdGUgZ3JvdXAgb2YgZXh0ZW5kZWQgdGVhbSBtZW1iZXJzIHRoYXQmIzEzOyYjMTA7ICAgIGFyZSBicm91Z2h0IGluIGFzICZxdW90O2NvbnN1bHRhbnRzJnF1b3Q7IG9uIGtleSBpc3N1ZXMmbHQ7YiZndDsuJmx0Oy9iJmd0OyBUaGlzIHN0cnVjdHVyZSBhbHNvIHdvcmtzIHdlbGwgZm9yIHNtYWxsZXIgcHJvamVjdHMgd2hlcmUmIzEzOyYjMTA7ICAgIHNwZWNpZmljIGV4cGVydGlzZSBtYXkgYmUgYm9ycm93ZWQgb3IgY29udHJhY3RlZCBmcm9tIG90aGVyIG9yZ2FuaXphdGlvbnM7IHRoZXkgY2FuIGJlIGJyb3VnaHQgaW4gYXMgc3BlY2lmaWMgaXNzdWVzJiMxMzsmIzEwOyAgICBuZWVkIHRvIGJlIGFkZHJlc3NlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9BY3Rpdml0eTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgbGlua2VkIHRvIHRhc2tBMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvcm9sZURlc2MxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvd3BEZXNjMyB3aXRoIG5vIGxpbmtzIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjIHdpdGggbm8gbGlua3MiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayB3aXRoIG5vIGxpbmtzIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08cm9hZG1hcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvYWRtYXBfQTEiPgotPC9yb2FkbWFwcz4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGNvbmNlcHRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHM+Ci08Y29uY2VwdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0cz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08cmV1c2FibGVBc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvcmV1c2FibGVBc3NldHM+Ci08L0FjdGl2aXR5PgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2sgbGlua2VkIHRvIHRhc2tBMSIgYnJpZWZEZXNjcmlwdGlvbj0idGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMSIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFza19MaW5rZWRfVG9fVGFza0ExIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMSxfRnJ0TW9EemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIGtleXM6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXkxLGtleTImIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgdXNhZ2VHdWlkYW5jZT0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICB1c2FnZTomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSB3b3JrIGlzIGJlc3QgZG9uZSBpbiBzZXZlcmFsIHNlc3Npb25zLCBwZXJoYXBzIHBlcmZvcm1lZCBvdmVyIGEgZmV3IGRheXMgKG9yIHdlZWtzIGFuZCBtb250aHMgZm9yIHZlcnkgbGFyZ2UmIzEzOyYjMTA7ICAgIHN5c3RlbXMpLiBUaGUgaW5pdGlhbCBmb2N1cyB3aWxsIGJlIG9uIHRoZSBhY3Rpdml0aWVzICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fbWVjaGFuaXNtcyx7QzdBMjZCRDctMzgyMC00OEQ5LTgzMEYtNjg0QzNBRjE1NUY5fS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3tDN0EyNkJENy0zODIwLTQ4RDktODMwRi02ODRDM0FGMTU1Rjl9JnF1b3Q7Jmd0O0lkZW50aWZ5IERlc2lnbiBNZWNoYW5pc21zJmx0Oy9hJmd0OyBhbmQgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduLHs1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezU4Njk2M0QwLTYwN0QtNEVDMi04RDUzLTI5MkRBRkFCOUM5Mn0mcXVvdDsmZ3Q7aWRlbnRpZnlfZGVzaWduX2VsZW1lbnRzX3JlYWwtdGltZV9kZXNpZ24mbHQ7L2EmZ3Q7LCB3aXRoIGEgZ3JlYXQgZGVhbCBvZiYjMTM7JiMxMDsgICAgaXRlcmF0aW9uIHdpdGggdGhlICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pbmNvcnBvcmF0ZV9kZXNpZ25fZWxlbWVudHMsezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NUM2NDcxNzMtNEUzMi00NTk0LTk2QTktMjU0OEI0NzcyMkZBfSZxdW90OyZndDtJbmNvcnBvcmF0ZSBFeGlzdGluZyBEZXNpZ24gRWxlbWVudHMmbHQ7L2EmZ3Q7IGFjdGl2aXR5IHRvIG1ha2Ugc3VyZSB0aGF0IG5ldyYjMTM7JiMxMDsgICAgZWxlbWVudHMgZG8gbm90IGR1cGxpY2F0ZSBmdW5jdGlvbmFsaXR5IG9mIGV4aXN0aW5nIGVsZW1lbnRzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXMgdGhlIGRlc2lnbiBlbWVyZ2VzLCBjb25jdXJyZW5jeSBhbmQgZGlzdHJpYnV0aW9uIGlzc3VlcyBhcmUgaW50cm9kdWNlZCBpbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvZGVzY3JpYmVfcnVudGltZV9hcmNoaXRlY3R1cmUsezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NEQzNUMwMzgtQTJEMC00OEI4LTlFQ0QtNTI3MTdGRUFFMzNBfSZxdW90OyZndDtEZXNjcmliZSB0aGUgUnVuLXRpbWUgQXJjaGl0ZWN0dXJlJmx0Oy9hJmd0OyBhbmQgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX2Rpc3RyaWJ1dGlvbix7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s2QTExMjgwOC0wQTkwLTQyN0EtQkFCOS1FMTRGM0ZCRjcyQjV9JnF1b3Q7Jmd0O0Rlc2NyaWJlIERpc3RyaWJ1dGlvbiZsdDsvYSZndDssIHJlc3BlY3RpdmVseS4gQXMgdGhlc2UgaXNzdWVzIGFyZSBjb25zaWRlcmVkLCYjMTM7JiMxMDsgICAgY2hhbmdlcyB0byBkZXNpZ24gZWxlbWVudHMgbWF5IGJlIHJlcXVpcmVkIHRvIHNwbGl0IGJlaGF2aW9yIGFjcm9zcyBwcm9jZXNzZXMsIHRocmVhZHMgb3Igbm9kZXMuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBcyB0aGUgaW5kaXZpZHVhbCBtb2RlbHMgYXJlIHJlZmluZWQgdG8gaW5jb3Jwb3JhdGUgdGhlIGFyY2hpdGVjdHVyYWwgZGVjaXNpb25zLCB0aGUgcmVzdWx0cyBhcmUgZG9jdW1lbnRlZCBpbiYjMTM7JiMxMDsgICAgcmVzcGVjdGl2ZSB2aWV3IHNlY3Rpb25zIGluIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgKGUuZy4sIGFzIHRoZSBEZXNpZ24gTW9kZWwgaXMgcmVmaW5lZCwgdGhlIExvZ2ljYWwgVmlldyYjMTM7JiMxMDsgICAgb2YgdGhlIFNvZnR3YXJlIEFyY2hpdGVjdHVyZSBEb2N1bWVudCBpcyByZWZpbmVkLCBhcyB3ZWxsKS4gVGhlIHJlc3VsdGluZyBhcmNoaXRlY3R1cmUgaXMgcmV2aWV3ZWQuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7YnIgLyZndDsmIzEzOyYjMTA7ICAgICZsdDticiAvJmd0OyYjMTM7JiMxMDsgICAgJmFtcDtuYnNwOyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiByZWZpbmVkRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgcmVmaW5lZCBkZXNjcmlwdGlvbiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTYmcXVvdDsgYWx0PSZxdW90OyZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL2hlbHBib29rLmdpZiZxdW90OyB3aWR0aD0mcXVvdDsxNiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvcGFwZXJzLmh0bSZxdW90OyB0YXJnZXQ9JnF1b3Q7X2JsYW5rJnF1b3Q7Jmd0O3BhcGVycy5odG0mbHQ7L2EmZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0ExIj4KLTwvVGFzaz4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvcm9sZURlc2MyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzIiPgotPC9vdXRwdXQ+Ci08cGVyZm9ybWVkUHJpbWFyaWx5QnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgbGlua2VkIHRvIHRhc2tBMSI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrIGxpbmtlZCB0byB0YXNrQTIiIGJyaWVmRGVzY3JpcHRpb249InRhc2sgbGlua2VkIHRvIHRhc2tBMiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFza19MaW5rZWRfVG9fdGFza0EyIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMixfTHdMUWdEemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJrZXlzOiB0YXNrIGFzc29jaWF0ZWQgdG8gdGFza0EyIiB1c2FnZUd1aWRhbmNlPSJ1c2FnZTp0YXNrIGFzc29jaWF0ZWQgdG8gdGFza0EyIiByZWZpbmVkRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgcmVmaW5lZDp0YXNrIGFzc29jaWF0ZWQgdG8gdGFza0EyJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3RhYmxlIGNlbGxzcGFjaW5nPSZxdW90OzImcXVvdDsgY2VsbHBhZGRpbmc9JnF1b3Q7MiZxdW90OyB3aWR0aD0mcXVvdDsxODAmcXVvdDsgYm9yZGVyPSZxdW90OzEmcXVvdDsmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7dGJvZHkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0O3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgMSYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RoJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RoJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RoJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RoJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RoJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RoJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdHImZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0O3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICB6JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIDImIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdHImZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0O3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICB6JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgMyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdHImZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0O3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICB6JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICA0JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdHImZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0O3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICB6JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIDUmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdHImZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L3Rib2R5Jmd0OyYjMTM7JiMxMDsmbHQ7L3RhYmxlJmd0OyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgbGlua2VkIHRvIHRhc2tBMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTIiPgotPC9UYXNrPgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTIiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyL3Rhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMi4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyL3Rhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMi4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyL3Rhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMi4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZURlc2MxIiBicmllZkRlc2NyaXB0aW9uPSJyb2xlRGVzYzEgbGlua2VkIHRvIHJvbGVBMSIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0icm9sZURlc2MxIiBwcmVmaXg9InByZWZpeCIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVEZXNjMSxfUDFzVVlEemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIGtleSBjb25zaWRlcmF0aW9uczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIGtleTEmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIGtleTImIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgdXNhZ2VHdWlkYW5jZT0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDs0NzQmcXVvdDsgYWx0PSZxdW90OyZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL3J1cF9wbGF0Zm9ybS5qcGcmcXVvdDsgd2lkdGg9JnF1b3Q7NTA0JnF1b3Q7IC8mZ3Q7dXNhZ2UgZm9yIHJvbGVBMSZhbXA7bmJzcDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgcmVmaW5lZERlc2NyaXB0aW9uPSJyZWZpbmVkIGRlc2NyaXB0aW9uIGZvciByb2xlRGVzYzEiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9yb2xlRGVzYzEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvcm9sZURlc2MxIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvd3BEZXNjMiI+Ci08L21vZGlmaWVzPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlRGVzYzIiIGJyaWVmRGVzY3JpcHRpb249InJvbGVEZXNjMiBsaW5rZWQgdG8gcm9sZUEyIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJyb2xlRGVzYzIiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZURlc2MyLF9ROTlrQUR6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9ImtleSBjb25zaWRlcmF0aW9uIGZvciByb2xlQTIiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTImcXVvdDsgYWx0PSZxdW90OyZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL2J1bGxldDEuZ2lmJnF1b3Q7IHdpZHRoPSZxdW90OzEyJnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICB1c2FnZSBndWlkYW5jZSBmb3Igcm9sZUEyJiMxMzsmIzEwOyZsdDsvcCZndDsiIHJlZmluZWREZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICByZWZpbmVkIGRlc2NyaXB0aW9uIGZvciByb2xlQTImIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHJlZmluZWQgZGVzY3JpcHRpb24gZm9yIHJvbGVBMiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvcm9sZURlc2MyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMiI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzEiPgotPC9tb2RpZmllcz4KLTwvUm9sZURlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9IndwRGVzYzEiIGJyaWVmRGVzY3JpcHRpb249InRoaXMgd3AgaXMgbGlua2VkIHRvIGFydGlmYWN0IiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJ3cERlc2MxIGlzIGxpbmtlZCB0byBhcnRpZmFjdCIgcHJlZml4PSJwcmVmaXgiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0id3BEZXNjMSxfU1VHUWdEemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJrZXk6d3BEZXNjMSIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6d3BEZXNjMSIgcmVmaW5lZERlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHJlZmluZWQ6IHdwRGVzYzEmIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJ3cERlc2MyIiBicmllZkRlc2NyaXB0aW9uPSJ3cGRlc2MyIGxpbmtlZCB0byBkZWxpdmVyYWJsZSIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0id3BEZXNjMiBsaW5rZWQgdG8gZGVsaXZlcmFibGUiIHByZWZpeD0icHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9IndwRGVzYzIsX1RDdTRJRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5OndwZGVzYzIiIHVzYWdlR3VpZGFuY2U9InVzYWdlOndwZGVzYzIiIHJlZmluZWREZXNjcmlwdGlvbj0icmVmaW5lZDogd3BkZXNjMiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzIiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9vdXRjb21lX0ExIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9hcnRpZmFjdF9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMSxfV3JfeThEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExLF9Yc1hxMER6a0VkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvYXJ0aWZhY3RfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJ3cERlc2MzIHdpdGggbm8gbGlua3MiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmOiB3cERlc2MzIHdpdGggbm8gbGlua3MiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IndwRGVzYzMgd2l0aCBubyBsaW5rcyIgcHJlZml4PSJwcmVmaXgiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0id3BEZXNjMyB3aXRoIG5vIGxpbmtzLF8xeDU3QUR6a0VkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9ImtleTogd3BEZXNjMyB3aXRoIG5vIGxpbmtzIiB1c2FnZUd1aWRhbmNlPSJ1c2FnZTogd3BEZXNjMyB3aXRoIG5vIGxpbmtzIiByZWZpbmVkRGVzY3JpcHRpb249InJlZmluZWQ6IHdwRGVzYzMgd2l0aCBubyBsaW5rcyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzMgd2l0aCBubyBsaW5rcyI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVEZXNjIHdpdGggbm8gbGlua3MiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmOnJvbGVEZXNjIHdpdGggbm8gbGlua3MiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9InJvbGVEZXNjIHdpdGggbm8gbGlua3MiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZURlc2Mgd2l0aCBubyBsaW5rcyxfM19VTndEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJrZXkgY29uc2lkZXJhdGlvbjpyb2xlRGVzYyB3aXRoIG5vIGxpbmtzIiB1c2FnZUd1aWRhbmNlPSJ1c2FnZTpyb2xlRGVzYyB3aXRoIG5vIGxpbmtzIiByZWZpbmVkRGVzY3JpcHRpb249InJlZmluZWQgZGVzY3JpcHRpb24gOiByb2xlRGVzYyB3aXRoIG5vIGxpbmtzIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvcm9sZURlc2Mgd2l0aCBubyBsaW5rcyI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTwvUm9sZURlc2NyaXB0b3I+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFzayB3aXRoIG5vIGxpbmtzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjp0YXNrIHdpdGggbm8gbGlua3MiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9InRhc2sgd2l0aCBubyBsaW5rcyIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2sgd2l0aCBubyBsaW5rcyxfNWpKWUFEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJrZXk6dGFzayB3aXRoIG5vIGxpbmtzIiB1c2FnZUd1aWRhbmNlPSJ1c2FnZTp0YXNrIHdpdGggbm8gbGlua3MiIHJlZmluZWREZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICByZWZpbmVkOnRhc2sgd2l0aCBubyBsaW5rcyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayB3aXRoIG5vIGxpbmtzIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfUk1ON0VEemxFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIj4KLTwvUHJvcGVydHk+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IkFjdGl2aXR5MiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L3BhcmVudFBhY2thZ2U+Ci08QWN0aXZpdHkgbmFtZT0iQWN0aXZpdHkyIiBicmllZkRlc2NyaXB0aW9uPSJBY3Rpdml0eTIgY29udGFpbmluZCBEbkQgdGFza3MiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFjdGl2aXR5MiBjb250YWluaW5kIERuRCB0YXNrcyIgcHJlZml4PSJQcmVmaXgiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9IkFjdGl2aXR5MixfQlM2Z0VUemxFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoaXMgV29ya2Zsb3cgRGV0YWlsOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBQcm92aWRlcyB0aGUgbmF0dXJhbCAmbHQ7YiZndDt0cmFuc2l0aW9uIGZyb20gYW5hbHlzaXMmbHQ7L2ImZ3Q7IGFjdGl2aXRpZXMgJmx0O2ImZ3Q7dG8gZGVzaWduJmx0Oy9iJmd0OyBhY3Rpdml0aWVzLCBpZGVudGlmeWluZzogJiMxMzsmIzEwOyAgICAgICAgJmx0O3VsJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBkZXNpZ24gZWxlbWVudHMgZnJvbSBhbmFseXNpcyBlbGVtZW50cyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBkZXNpZ24gbWVjaGFuaXNtcyBmcm9tIHJlbGF0ZWQgYW5hbHlzaXMgbWVjaGFuaXNtcyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O0Rlc2NyaWJlcyZsdDsvYiZndDsgdGhlIG9yZ2FuaXphdGlvbiBvZiB0aGUgc3lzdGVtJmFwb3M7cyAmbHQ7YiZndDtydW4tdGltZSBhbmQgZGVwbG95bWVudCBhcmNoaXRlY3R1cmUmbHQ7L2ImZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O09yZ2FuaXplcyB0aGUgaW1wbGVtZW50YXRpb24gbW9kZWwmbHQ7L2ImZ3Q7IHNvIGFzIHRvIG1ha2UgdGhlIHRyYW5zaXRpb24gYmV0d2VlbiBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIHNlYW1sZXNzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O01haW50YWlucyB0aGUgY29uc2lzdGVuY3kgYW5kIGludGVncml0eSBvZiB0aGUgYXJjaGl0ZWN0dXJlJmx0Oy9iJmd0OywgZW5zdXJpbmcgdGhhdDogJiMxMzsmIzEwOyAgICAgICAgJmx0O3VsJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBuZXcgZGVzaWduIGVsZW1lbnRzIGlkZW50aWZpZWQgZm9yIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiBhcmUgaW50ZWdyYXRlZCB3aXRoIHByZS1leGlzdGluZyBkZXNpZ24gZWxlbWVudHMuJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIG1heGltYWwgcmUtdXNlIG9mIGF2YWlsYWJsZSBjb21wb25lbnRzIGFuZCBkZXNpZ24gZWxlbWVudHMgaXMgYWNoaWV2ZWQgYXMgZWFybHkgYXMgcG9zc2libGUgaW4gdGhlIGRlc2lnbiYjMTM7JiMxMDsgICAgICAgICAgICAgICAgZWZmb3J0LiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgS2V5IGNvbnNpZGVyYXRpb25zOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkxJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTImIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5MyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk0JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTUmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5NiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk3JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIgdXNhZ2VHdWlkYW5jZT0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGUgd29yayBpcyBiZXN0IGRvbmUgaW4gc2V2ZXJhbCBzZXNzaW9ucywgcGVyaGFwcyBwZXJmb3JtZWQgb3ZlciBhIGZldyBkYXlzIChvciB3ZWVrcyBhbmQgbW9udGhzIGZvciB2ZXJ5IGxhcmdlJiMxMzsmIzEwOyAgICBzeXN0ZW1zKS4gVGhlIGluaXRpYWwgZm9jdXMgd2lsbCBiZSBvbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX21lY2hhbmlzbXMse0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7QzdBMjZCRDctMzgyMC00OEQ5LTgzMEYtNjg0QzNBRjE1NUY5fSZxdW90OyZndDtJZGVudGlmeSBEZXNpZ24gTWVjaGFuaXNtcyZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbix7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9JnF1b3Q7Jmd0O2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduJmx0Oy9hJmd0Oywgd2l0aCBhIGdyZWF0IGRlYWwgb2YmIzEzOyYjMTA7ICAgIGl0ZXJhdGlvbiB3aXRoIHRoZSAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaW5jb3Jwb3JhdGVfZGVzaWduX2VsZW1lbnRzLHs1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0mcXVvdDsmZ3Q7SW5jb3Jwb3JhdGUgRXhpc3RpbmcgRGVzaWduIEVsZW1lbnRzJmx0Oy9hJmd0OyBhY3Rpdml0eSB0byBtYWtlIHN1cmUgdGhhdCBuZXcmIzEzOyYjMTA7ICAgIGVsZW1lbnRzIGRvIG5vdCBkdXBsaWNhdGUgZnVuY3Rpb25hbGl0eSBvZiBleGlzdGluZyBlbGVtZW50cy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFzIHRoZSBkZXNpZ24gZW1lcmdlcywgY29uY3VycmVuY3kgYW5kIGRpc3RyaWJ1dGlvbiBpc3N1ZXMgYXJlIGludHJvZHVjZWQgaW4gdGhlIGFjdGl2aXRpZXMgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX3J1bnRpbWVfYXJjaGl0ZWN0dXJlLHs0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0mcXVvdDsmZ3Q7RGVzY3JpYmUgdGhlIFJ1bi10aW1lIEFyY2hpdGVjdHVyZSZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9kZXNjcmliZV9kaXN0cmlidXRpb24sezZBMTEyODA4LTBBOTAtNDI3QS1CQUI5LUUxNEYzRkJGNzJCNX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fSZxdW90OyZndDtEZXNjcmliZSBEaXN0cmlidXRpb24mbHQ7L2EmZ3Q7LCByZXNwZWN0aXZlbHkuIEFzIHRoZXNlIGlzc3VlcyBhcmUgY29uc2lkZXJlZCwmIzEzOyYjMTA7ICAgIGNoYW5nZXMgdG8gZGVzaWduIGVsZW1lbnRzIG1heSBiZSByZXF1aXJlZCB0byBzcGxpdCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzLCB0aHJlYWRzIG9yIG5vZGVzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXMgdGhlIGluZGl2aWR1YWwgbW9kZWxzIGFyZSByZWZpbmVkIHRvIGluY29ycG9yYXRlIHRoZSBhcmNoaXRlY3R1cmFsIGRlY2lzaW9ucywgdGhlIHJlc3VsdHMgYXJlIGRvY3VtZW50ZWQgaW4mIzEzOyYjMTA7ICAgIHJlc3BlY3RpdmUgdmlldyBzZWN0aW9ucyBpbiB0aGUgU29mdHdhcmUgQXJjaGl0ZWN0dXJlIERvY3VtZW50IChlLmcuLCBhcyB0aGUgRGVzaWduIE1vZGVsIGlzIHJlZmluZWQsIHRoZSBMb2dpY2FsIFZpZXcmIzEzOyYjMTA7ICAgIG9mIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgaXMgcmVmaW5lZCwgYXMgd2VsbCkuIFRoZSByZXN1bHRpbmcgYXJjaGl0ZWN0dXJlIGlzIHJldmlld2VkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsiIHB1cnBvc2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgUHVycG9zZSBvZiB0aGlzIGFjdGl2aXR5IGlzIHRvIGhhdmUgdGFza3MgdGhhdCBhcmUgYXNzb2NpYXRlZCB0byBvdGhlciB0YXNrcy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZhbXA7bmJzcDsmbHQ7aW1nIGhlaWdodD0mcXVvdDs3MSZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvcnVwLmpwZyZxdW90OyB3aWR0aD0mcXVvdDsxNzYmcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgYWx0ZXJuYXRpdmVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFsdGVyYW50aXZlczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7b2wmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgQWx0ZXIxJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIEFsdGVyMiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBBbHRlcjMmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyZsdDsvb2wmZ3Q7IiBob3d0b1N0YWZmPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZXNlIGFjdGl2aXRpZXMgYXJlIGJlc3QgY2FycmllZCBvdXQgYnkgYSBzbWFsbCB0ZWFtIHN0YWZmZWQgYnkgY3Jvc3MtZnVuY3Rpb25hbCB0ZWFtIG1lbWJlcnMuIElzc3VlcyB0aGF0IGFyZSYjMTM7JiMxMDsgICAgdHlwaWNhbGx5IGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCBpbmNsdWRlIHVzYWJpbGl0eSwgcGVyZm9ybWFuY2UsIHNjYWxpbmcsIHByb2Nlc3MgYW5kIHRocmVhZCBzeW5jaHJvbml6YXRpb24sIGFuZCYjMTM7JiMxMDsgICAgZGlzdHJpYnV0aW9uLiBUaGUgdGVhbSBzaG91bGQgYWxzbyBpbmNsdWRlIG1lbWJlcnMgd2l0aCBkb21haW4gZXhwZXJpZW5jZSB3aG8gY2FuIGlkZW50aWZ5IGtleSBhYnN0cmFjdGlvbnMuIFRoZSB0ZWFtJiMxMzsmIzEwOyAgICBzaG91bGQgYWxzbyBoYXZlIGV4cGVyaWVuY2Ugd2l0aCBtb2RlbCBvcmdhbml6YXRpb24gYW5kIGxheWVyaW5nLiBUaGUgdGVhbSB3aWxsIG5lZWQgdG8gYmUgYWJsZSB0byBwdWxsIGFsbCB0aGVzZSYjMTM7JiMxMDsgICAgZGlzcGFyYXRlIHRocmVhZHMgaW50byBhIGNvaGVzaXZlLCBjb2hlcmVudCAoYWxiZWl0IHByZWxpbWluYXJ5KSBhcmNoaXRlY3R1cmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBCZWNhdXNlIHRoZSBmb2N1cyBvZiB0aGUgYXJjaGl0ZWN0dXJlIGVmZm9ydCBpcyBzaGlmdGluZyB0b3dhcmQgaW1wbGVtZW50YXRpb24gaXNzdWVzLCBncmVhdGVyIGF0dGVudGlvbiBuZWVkcyB0byBiZSYjMTM7JiMxMDsgICAgcGFpZCB0byBzcGVjaWZpYyB0ZWNobm9sb2d5IGlzc3Vlcy4gVGhpcyB3aWxsIGZvcmNlIHRoZSBhcmNoaXRlY3R1cmUgdGVhbSB0byBzaGlmdCBtZW1iZXJzIG9yIGV4cGFuZCB0byBpbmNsdWRlIHBlb3BsZSYjMTM7JiMxMDsgICAgd2l0aCBkaXN0cmlidXRpb24gYW5kIGRlcGxveW1lbnQgZXhwZXJ0aXNlIChpZiB0aG9zZSBpc3N1ZXMgYXJlIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCkuIEluIG9yZGVyIHRvIHVuZGVyc3RhbmQmIzEzOyYjMTA7ICAgIHRoZSBwb3RlbnRpYWwgaW1wYWN0IG9mIHRoZSBzdHJ1Y3R1cmUgb24gdGhlIGltcGxlbWVudGF0aW9uIG1vZGVsIG9uIHRoZSBlYXNlIG9mIGludGVncmF0aW9uLCBleHBlcnRpc2UgaW4gdGhlIHNvZnR3YXJlJiMxMzsmIzEwOyAgICBidWlsZCBtYW5hZ2VtZW50IHByb2Nlc3MgaXMgdXNlZnVsIHRvIGhhdmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBdCB0aGUgc2FtZSB0aW1lLCBpdCBpcyBlc3NlbnRpYWwgdGhhdCB0aGUgYXJjaGl0ZWN0dXJlIHRlYW0gbm90IGJlIGNvbXBvc2VkIG9mIGEgbGFyZ2UgZXh0ZW5kZWQgdGVhbS4gQSBzdHJhdGVneSBmb3ImIzEzOyYjMTA7ICAgIGNvdW50ZXJpbmcgdGhpcyB0cmVuZCBpcyB0byByZXRhaW4gYSByZWxhdGl2ZWx5IHNtYWxsIGNvcmUgdGVhbSB3aXRoIGEgc2F0ZWxsaXRlIGdyb3VwIG9mIGV4dGVuZGVkIHRlYW0gbWVtYmVycyB0aGF0JiMxMzsmIzEwOyAgICBhcmUgYnJvdWdodCBpbiBhcyAmcXVvdDtjb25zdWx0YW50cyZxdW90OyBvbiBrZXkgaXNzdWVzJmx0O2ImZ3Q7LiZsdDsvYiZndDsgVGhpcyBzdHJ1Y3R1cmUgYWxzbyB3b3JrcyB3ZWxsIGZvciBzbWFsbGVyIHByb2plY3RzIHdoZXJlJiMxMzsmIzEwOyAgICBzcGVjaWZpYyBleHBlcnRpc2UgbWF5IGJlIGJvcnJvd2VkIG9yIGNvbnRyYWN0ZWQgZnJvbSBvdGhlciBvcmdhbml6YXRpb25zOyB0aGV5IGNhbiBiZSBicm91Z2h0IGluIGFzIHNwZWNpZmljIGlzc3VlcyYjMTM7JiMxMDsgICAgbmVlZCB0byBiZSBhZGRyZXNzZWQuJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvQWN0aXZpdHkyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3JvbGVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvcm9sZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9kZWxpdmVyYWJsZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3Rhc2tfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPHJvYWRtYXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yb2FkbWFwX0IxIj4KLTwvcm9hZG1hcHM+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IxIj4KLTwvY2hlY2tsaXN0cz4KLTxjb25jZXB0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMSI+Ci08L2NvbmNlcHRzPgotPGNvbmNlcHRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IxIj4KLTwvY29uY2VwdHM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjEiPgotPC9leGFtcGxlcz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjEiPgotPC9ndWlkZWxpbmVzPgotPHJldXNhYmxlQXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMSI+Ci08L3JldXNhYmxlQXNzZXRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0ExIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEExICIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQTEsXzBEUl9RRURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iVGFzayBBMSZhbXA7bmJzcDsga2V5IiB1c2FnZUd1aWRhbmNlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRhc2sgQTEmYW1wO25ic3A7IGd1aWRhbmNlJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDsxNiZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7JiMxMzsmIzEwOyAgICBzcmM9JnF1b3Q7ZmlsZTovLy9DOi9Eb2N1bWVudHMlMjBhbmQlMjBTZXR0aW5ncy9BZG1pbmlzdHJhdG9yL0lCTS9NZXRob2RMaWJyYXJpZXMvUGFyaXMvUGFyaXMvUGx1ZyUyMEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9zeW5jZWQuZ2lmJnF1b3Q7JiMxMzsmIzEwOyAgICAgd2lkdGg9JnF1b3Q7MTYmcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzE2JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsmIzEzOyYjMTA7ICAgIHNyYz0mcXVvdDtmaWxlOi8vL0M6L0RvY3VtZW50cyUyMGFuZCUyMFNldHRpbmdzL0FkbWluaXN0cmF0b3IvSUJNL01ldGhvZExpYnJhcmllcy9QYXJpcy9QYXJpcy9QbHVnJTIwQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2hlbHBib29rLmdpZiZxdW90OyYjMTM7JiMxMDsgICAgIHdpZHRoPSZxdW90OzE2JnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsiIHJlZmluZWREZXNjcmlwdGlvbj0iVGFzayBBMSZhbXA7bmJzcDsgcmVmaW5lZCBkZXNjcmlwdGlvbiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3Rhc2tfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvdGFza19BMSI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3JvbGVfQTIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9kZWxpdmVyYWJsZV9BMSI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0ExIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0ExIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMSxfMERrNk1FREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJSb2xlIEExIGtleSIgdXNhZ2VHdWlkYW5jZT0iUm9sZSBBMSBndWlkYW5jZSIgcmVmaW5lZERlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFJvbGUgQTEgcmVmaW5lZCBkZXNjJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDs3MSZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7JiMxMzsmIzEwOyAgICBzcmM9JnF1b3Q7ZmlsZTovLy9DOi9Eb2N1bWVudHMlMjBhbmQlMjBTZXR0aW5ncy9BZG1pbmlzdHJhdG9yL0lCTS9NZXRob2RMaWJyYXJpZXMvUGFyaXMvUGFyaXMvUGx1ZyUyMEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9ydXAuanBnJnF1b3Q7JiMxMzsmIzEwOyAgICAgd2lkdGg9JnF1b3Q7MTc2JnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3JvbGVfQTEiPgotPC9Sb2xlPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0ExIj4KLTwvbW9kaWZpZXM+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2RlbGl2ZXJhYmxlX0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZURlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiAiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMixfMERrNk1VREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFJvbGUgQTIga2V5JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDsxNjcmcXVvdDsgYWx0PSZxdW90OyZxdW90OyYjMTM7JiMxMDsgICAgc3JjPSZxdW90O2ZpbGU6Ly8vQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9JQk0vTWV0aG9kTGlicmFyaWVzL1BhcmlzL1BhcmlzL1BsdWclMjBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwMV9hLmdpZiZxdW90OyYjMTM7JiMxMDsgICAgIHdpZHRoPSZxdW90OzI2JnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsiIHVzYWdlR3VpZGFuY2U9IlJvbGUgQTIgdXNhZ2UiIHJlZmluZWREZXNjcmlwdGlvbj0iUm9sZSBBMiByZWZpbmVkIGRlc2MiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3JvbGVfQTIiPgotPC9Sb2xlPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0EyIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xLF8wRHVyTUVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTEsXzBEdXJNVURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMSxfMER1ck1rREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9kZWxpdmVyYWJsZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMSxfMER1ck0wREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMSxfMEVVaEVFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfMEVVaEVVREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF8wRVVoRWtERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFza19BMiIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMiAiIHByZWZpeD0iUHJlZml4IiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0EyLF8yODg3RUVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IlRhc2sgQTIga2V5IiB1c2FnZUd1aWRhbmNlPSJUYXNrIEEyIGd1aWRhbmNlIiByZWZpbmVkRGVzY3JpcHRpb249IlRhc2sgQTIgcmVmaW5lZCBkZXNjcmlwdGlvbiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3Rhc2tfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvdGFza19BMiI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3JvbGVfQTEiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9kZWxpdmVyYWJsZV9BMiI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0EyIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0EyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0EyLF8yOVpuQUVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImRlbGl2ZXJhYmxlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTIsXzI5Wm5BVURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2RlbGl2ZXJhYmxlX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfMjlabkFrREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfMjlzaDhFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0EyLF8yOXNoOFVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+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+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIj4KLTwvUHJvcGVydHk+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPEl0ZXJhdGlvbiBuYW1lPSJJdGVyYXRpb24xIiBicmllZkRlc2NyaXB0aW9uPSJUaGlzIGl0ZXJhdGlvbiBjb250YWlucyB0d28gYWN0aXZpdGllcyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iSXRlcmF0aW9uMSIgcHJlZml4PSJQcmVmaXgiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9InRydWUiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iSXRlcmF0aW9uMSxfRUZWcndUemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoaXMgd29ya2Zsb3cgZGV0YWlsIGhhcyB0aGUgZm9sbG93aW5nIGdvYWxzOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBDcmVhdGUgYW4gaW5pdGlhbCBza2V0Y2ggb2YgdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgc3lzdGVtICYjMTM7JiMxMDsgICAgICAgICZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgRGVmaW5lIGFuIGluaXRpYWwgc2V0IG9mIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCBlbGVtZW50cyB0byB1c2UgYXMgdGhlIGJhc2lzIGZvciBhbmFseXNpcyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBEZWZpbmUgYW4gaW5pdGlhbCBzZXQgb2YgYW5hbHlzaXMgbWVjaGFuaXNtcyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIGluaXRpYWwgbGF5ZXJpbmcgYW5kIG9yZ2FuaXphdGlvbiBvZiB0aGUgc3lzdGVtJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIERlZmluZSB0aGUgdXNlLWNhc2UgcmVhbGl6YXRpb25zIHRvIGJlIGFkZHJlc3NlZCBpbiB0aGUgY3VycmVudCBpdGVyYXRpb24mIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3VsJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBJZGVudGlmeSBhbmFseXNpcyBjbGFzc2VzIGZyb20gdGhlIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCB1c2UgY2FzZXMmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgVXBkYXRlIHRoZSB1c2UtY2FzZSByZWFsaXphdGlvbnMgd2l0aCBhbmFseXNpcyBjbGFzcyBpbnRlcmFjdGlvbnMmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyZsdDsvdWwmZ3Q7IiBrZXlDb25zaWRlcmF0aW9ucz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBLZXkgY29uc2lkZXJhdGlvbnM6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3VsJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTExJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTIyJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTMzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIgdXNhZ2VHdWlkYW5jZT0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGUgd29yayBpcyBiZXN0IGRvbmUgaW4gc2V2ZXJhbCBzZXNzaW9ucywgcGVyaGFwcyBwZXJmb3JtZWQgb3ZlciBhIGZldyBkYXlzIChvciB3ZWVrcyBhbmQgbW9udGhzIGZvciB2ZXJ5IGxhcmdlJiMxMzsmIzEwOyAgICBzeXN0ZW1zKSwgd2l0aCBpdGVyYXRpb24gYmV0d2VlbiAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvYXJjaGl0ZWN0dXJhbF9hbmFseXNpcyx7OENCNDg0MDItRDRDNS00RTE3LUJCMzMtNTA3MzE1Q0IxQkJGfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s4Q0I0ODQwMi1ENEM1LTRFMTctQkIzMy01MDczMTVDQjFCQkZ9JnF1b3Q7Jmd0O0FyY2hpdGVjdHVyYWwgQW5hbHlzaXMmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvdXNlX2Nhc2VfYW5hbHlzaXMsezI4MDE0NjE1LUE2MkYtNDUyRC1CODIxLTMwQzdDQUIwRUM0NH0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7MjgwMTQ2MTUtQTYyRi00NTJELUI4MjEtMzBDN0NBQjBFQzQ0fSZxdW90OyZndDtVc2UtQ2FzZSBBbmFseXNpcyZsdDsvYSZndDsuIFBlcmZvcm0gYW4gaW5pdGlhbCBwYXNzIGF0IHRoZSBhcmNoaXRlY3R1cmUgaW4gJmx0O2EmIzEzOyYjMTA7ICAgIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7IGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2FyY2hpdGVjdHVyYWxfYW5hbHlzaXMsezhDQjQ4NDAyLUQ0QzUtNEUxNy1CQjMzLTUwNzMxNUNCMUJCRn0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7OENCNDg0MDItRDRDNS00RTE3LUJCMzMtNTA3MzE1Q0IxQkJGfSZxdW90OyZndDtBcmNoaXRlY3R1cmFsIEFuYWx5c2lzJmx0Oy9hJmd0OywgdGhlbiBjaG9vc2UgYXJjaGl0ZWN0dXJhbGx5IHNpZ25pZmljYW50IHVzZSYjMTM7JiMxMDsgICAgY2FzZXMsIHBlcmZvcm1pbmcgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsgaHJlZj0mcXVvdDtyZXNvdXJjZXMvdXNlX2Nhc2VfYW5hbHlzaXMsezI4MDE0NjE1LUE2MkYtNDUyRC1CODIxLTMwQzdDQUIwRUM0NH0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7MjgwMTQ2MTUtQTYyRi00NTJELUI4MjEtMzBDN0NBQjBFQzQ0fSZxdW90OyZndDtVc2UtQ2FzZSBBbmFseXNpcyZsdDsvYSZndDsgb24gZWFjaCBvbmUuIEFmdGVyIChvciBhcykgZWFjaCB1c2UgY2FzZSBpcyYjMTM7JiMxMDsgICAgYW5hbHl6ZWQsIHVwZGF0ZSB0aGUgYXJjaGl0ZWN0dXJlIGFzIG5lZWRlZCB0byByZWZsZWN0IGFkYXB0YXRpb25zIHJlcXVpcmVkIHRvIGFjY29tbW9kYXRlIG5ldyBiZWhhdmlvciBvZiB0aGUgc3lzdGVtJiMxMzsmIzEwOyAgICBhbmQgdG8gYWRkcmVzcyBwb3RlbnRpYWwgYXJjaGl0ZWN0dXJhbCBwcm9ibGVtcyB3aGljaCBhcmUgaWRlbnRpZmllZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFdoZXJlIHRoZSBhcmNoaXRlY3R1cmUgYWxyZWFkeSBleGlzdHMgKGVpdGhlciBmcm9tIGEgcHJpb3IgcHJvamVjdCBvciBpdGVyYXRpb24pLCBjaGFuZ2UgcmVxdWVzdHMgbWF5IG5lZWQgdG8gYmUmIzEzOyYjMTA7ICAgIGNyZWF0ZWQgdG8gY2hhbmdlIHRoZSBhcmNoaXRlY3R1cmUgdG8gYWNjb3VudCBmb3IgdGhlIG5ldyBiZWhhdmlvciB0aGUgc3lzdGVtIG11c3Qgc3VwcG9ydC4gVGhlc2UgY2hhbmdlcyBtYXkgYmUgdG8gYW55JiMxMzsmIzEwOyAgICBhcnRpZmFjdCBpbiB0aGUgcHJvY2VzcywgZGVwZW5kaW5nIG9uIHRoZSBzY29wZSBvZiB0aGUgY2hhbmdlLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsiIHB1cnBvc2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgUHVycG9zZTogVGhpcyBpdGVydGFpb24gaXMgY3JlYXRlZCBmb3IgdHdvIGFjdGl2aXRpZXMuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmYW1wO25ic3A7Jmx0O2ltZyBoZWlnaHQ9JnF1b3Q7NDc0JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9ydXBfcGxhdGZvcm0uanBnJnF1b3Q7IHdpZHRoPSZxdW90OzUwNCZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiBhbHRlcm5hdGl2ZXM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQWx0ZXJuYXRpdmVzOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtvbCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YSBocmVmPSZxdW90Oy4uL3JvbGVzL3JvbGVfQTEueG1pJnF1b3Q7IHRhcmdldD0mcXVvdDtfYmxhbmsmcXVvdDsmZ3Q7cm9sZV9BMS54bWkmbHQ7L2EmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDthIGhyZWY9JnF1b3Q7Li4vdGFza3MvdGFza19BMi54bWkmcXVvdDsgdGFyZ2V0PSZxdW90O19ibGFuayZxdW90OyZndDt0YXNrX0EyLnhtaSZsdDsvYSZndDsmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyZsdDsvb2wmZ3Q7IiBob3d0b1N0YWZmPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZXNlIGFjdGl2aXRpZXMgYXJlIGJlc3QgY2FycmllZCBvdXQgYnkgYSBzbWFsbCB0ZWFtIHN0YWZmZWQgYnkgY3Jvc3MtZnVuY3Rpb25hbCB0ZWFtIG1lbWJlcnMuIElzc3VlcyB0aGF0IGFyZSYjMTM7JiMxMDsgICAgdHlwaWNhbGx5IGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCBpbmNsdWRlIHBlcmZvcm1hbmNlLCBzY2FsaW5nLCBwcm9jZXNzIGFuZCB0aHJlYWQgc3luY2hyb25pemF0aW9uLCBhbmQmIzEzOyYjMTA7ICAgIGRpc3RyaWJ1dGlvbi4gVGhlIHRlYW0gc2hvdWxkIGFsc28gaW5jbHVkZSBtZW1iZXJzIHdpdGggZG9tYWluIGV4cGVyaWVuY2Ugd2hvIGNhbiBpZGVudGlmeSBrZXkgYWJzdHJhY3Rpb25zLiBUaGUgdGVhbSYjMTM7JiMxMDsgICAgc2hvdWxkIGFsc28gaGF2ZSBleHBlcmllbmNlIHdpdGggbW9kZWwgb3JnYW5pemF0aW9uIGFuZCBsYXllcmluZy4gVGhlIHRlYW0gd2lsbCBuZWVkIHRvIGJlIGFibGUgdG8gcHVsbCBhbGwgdGhlc2UmIzEzOyYjMTA7ICAgIGRpc3BhcmF0ZSB0aHJlYWRzIGludG8gYSBjb2hlc2l2ZSwgY29oZXJlbnQgKGFsYmVpdCBwcmVsaW1pbmFyeSkgYXJjaGl0ZWN0dXJlLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvQWN0aXZpdHlEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvSXRlcmF0aW9uMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvQWN0aXZpdHkxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL0FjdGl2aXR5MiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPHJvYWRtYXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2FkbWFwX0EyIj4KLTwvcm9hZG1hcHM+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxjb25jZXB0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzPgotPGNvbmNlcHRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPHJldXNhYmxlQXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L3JldXNhYmxlQXNzZXRzPgotPC9JdGVyYXRpb24+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFBoYXNlIG5hbWU9IlBoYXNlMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJQaGFzZTEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08QWN0aXZpdHlEZXNjcmlwdGlvbiBuYW1lPSJQaGFzZTEsX0Rha1FjRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9QaGFzZTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvSXRlcmF0aW9uMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPC9QaGFzZT4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvRGlhZ3JhbT4KLTxDYXBhYmlsaXR5UGF0dGVybiBuYW1lPSJDUDEgd2l0aCBhbGwgZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IkJyaWVmOkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPFByb2Nlc3NEZXNjcmlwdGlvbiBuYW1lPSJDUDEgd2l0aCBhbGwgZWxlbWVudHMsXzRzQ3RzVHpnRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGUgc3ViY2F0ZWdvcmllcyBvZiBwcm9jZXNzIGFyZSBkZWxpdmVyeSBwcm9jZXNzIGFuZCBjYXBhYmlsaXR5IHBhdHRlcm4uJmFtcDtuYnNwOyBBIGRlbGl2ZXJ5IHByb2Nlc3MgZGVmaW5lcyBhIGNvbXBsZXRlJiMxMzsmIzEwOyAgICBvciBlbmQtdG8tZW5kIHByb2Nlc3MuJmFtcDtuYnNwOyBBIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBhIHByb2Nlc3MgZnJhZ21lbnQgdXNlZCB0byBjb21wb3NlIGEgZGVsaXZlcnkgcHJvY2Vzcy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZhbXA7bmJzcDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IlRoaXMgY2FwYWJpbGl0eSBwYXR0ZXJuIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgY29uc3RydWN0IGFuIEluY2VwdGlvbiBwaGFzZSBpdGVyYXRpb24gaW4gYSBkZWxpdmVyeSBwcm9jZXNzLiZhbXA7bmJzcDsgQ29weSBvciYjMTM7JiMxMDtleHRlbmQgdGhlIHBhdHRlcm4mYW1wO25ic3A7cmVwZWF0ZWRseSB0byBjcmVhdGUgYXMgbWFueSBpdGVyYXRpb25zIGFzIG5lY2Vzc2FyeSBmb3IgdGhlIHBhcnRpY3VsYXIgZGVsaXZlcnkgcHJvY2Vzcy4iIHVzYWdlR3VpZGFuY2U9IiIgcHVycG9zZT0iVGhpcyBjYXBhYmlsaXR5IHBhdHRlcm4gY2FuIGJlIHVzZWQgdG8gcXVpY2tseSBjb25zdHJ1Y3QgYW4gSW5jZXB0aW9uIHBoYXNlIGl0ZXJhdGlvbiBpbiBhIGRlbGl2ZXJ5IHByb2Nlc3MuJmFtcDtuYnNwOyBDb3B5IG9yJiMxMzsmIzEwO2V4dGVuZCB0aGUgcGF0dGVybiZhbXA7bmJzcDtyZXBlYXRlZGx5IHRvIGNyZWF0ZSBhcyBtYW55IGl0ZXJhdGlvbnMgYXMgbmVjZXNzYXJ5IGZvciB0aGUgcGFydGljdWxhciBkZWxpdmVyeSBwcm9jZXNzLiAmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBhbHRlcm5hdGl2ZXM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVG8gZXhwbGFpbiB0aGUgd29yayBpbnZvbHZlZCBpbiB0aGUgQW5hbHlzaXMgYW5kIERlc2lnbiBkaXNjaXBsaW5lLCB0aGUgYWN0aXZpdGllcyBhbmQgd29yayBwcm9kdWN0cyBhcmUgb3JnYW5pemVkIGludG8mIzEzOyYjMTA7ICAgIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGZvciB0aGUgZGlzY2lwbGluZS4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEluIHRoZSBJbmNlcHRpb24gUGhhc2UsIGFuYWx5c2lzIGFuZCBkZXNpZ24gaXMgY29uY2VybmVkIHdpdGggZXN0YWJsaXNoaW5nIHdoZXRoZXIgdGhlIHN5c3RlbSBhcyBlbnZpc2lvbmVkIGlzJiMxMzsmIzEwOyAgICBmZWFzaWJsZSwgYW5kIHdpdGggYXNzZXNzaW5nIHBvdGVudGlhbCB0ZWNobm9sb2dpZXMgZm9yIHRoZSBzb2x1dGlvbiAoaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FyY2hzeW4uaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1BlcmZvcm0gQXJjaGl0ZWN0dXJhbCBTeW50aGVzaXMmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykuIElmIGl0IGlzIGZlbHQgdGhhdCBsaXR0bGUgcmlzayBhdHRhY2hlcyB0byB0aGUgZGV2ZWxvcG1lbnQmIzEzOyYjMTA7ICAgIChiZWNhdXNlLCBmb3IgZXhhbXBsZSwgdGhlIGRvbWFpbiBpcyB3ZWxsIHVuZGVyc3Rvb2QsIHRoZSBzeXN0ZW0gaXMgbm90IG5vdmVsLCBhbmQgc28gb24pIHRoZW4gdGhpcyB3b3JrZmxvdyBkZXRhaWwgbWF5JiMxMzsmIzEwOyAgICBiZSBvbWl0dGVkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIGVhcmx5IEVsYWJvcmF0aW9uIFBoYXNlIGZvY3VzZXMgb24gY3JlYXRpbmcgYW4gaW5pdGlhbCBhcmNoaXRlY3R1cmUgZm9yIHRoZSBzeXN0ZW0gKCAmbHQ7YSYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDEuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVmaW5lIGEgQ2FuZGlkYXRlIEFyY2hpdGVjdHVyZSZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7KSB0byBwcm92aWRlIGEgc3RhcnRpbmcmIzEzOyYjMTA7ICAgIHBvaW50IGZvciB0aGUgbWFpbiBhbmFseXNpcyB3b3JrLiBJZiB0aGUgYXJjaGl0ZWN0dXJlIGFscmVhZHkgZXhpc3RzIChlaXRoZXIgYmVjYXVzZSBpdCB3YXMgcHJvZHVjZWQgaW4gcHJldmlvdXMmIzEzOyYjMTA7ICAgIGl0ZXJhdGlvbnMsIGluIHByZXZpb3VzIHByb2plY3RzLCBvciBpcyBvYnRhaW5lZCBmcm9tIGFuIGFwcGxpY2F0aW9uIGZyYW1ld29yayksIHRoZSBmb2N1cyBvZiB0aGUgd29yayBjaGFuZ2VzIHRvJiMxMzsmIzEwOyAgICByZWZpbmluZyB0aGUgYXJjaGl0ZWN0dXJlICggJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDIuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7UmVmaW5lIHRoZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykmIzEzOyYjMTA7ICAgIGFuZCBhbmFseXppbmcgYmVoYXZpb3IgYW5kIGNyZWF0aW5nIGFuIGluaXRpYWwgc2V0IG9mIGVsZW1lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQzLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0FuYWx5emUgQmVoYXZpb3ImbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBZnRlciB0aGUgaW5pdGlhbCBlbGVtZW50cyBhcmUgaWRlbnRpZmllZCwgdGhleSBhcmUgZnVydGhlciByZWZpbmVkLiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kNC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQmIzEzOyYjMTA7ICAgIGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVzaWduIENvbXBvbmVudHMmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OyBwcm9kdWNlIGEgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IgdG8mIzEzOyYjMTA7ICAgIHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50cyBvbiB0aGUgc3lzdGVtLiBJZiB0aGUgc3lzdGVtIGluY2x1ZGVzIGEgZGF0YWJhc2UsIHRoZW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDcuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiB0aGUgRGF0YWJhc2UmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OyBvY2N1cnMgaW4gcGFyYWxsZWwuIFRoZSByZXN1bHQgaXMgYW4gaW5pdGlhbCBzZXQgb2YgY29tcG9uZW50cyB3aGljaCBhcmUmIzEzOyYjMTA7ICAgIGZ1cnRoZXIgcmVmaW5lZCBpbiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZmRfaW1wLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0ltcGxlbWVudGF0aW9uJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsuJmx0O2JyIC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7JmFtcDtuYnNwOyZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsiIGhvd3RvU3RhZmY9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVG8gZXhwbGFpbiB0aGUgd29yayBpbnZvbHZlZCBpbiB0aGUgQW5hbHlzaXMgYW5kIERlc2lnbiBkaXNjaXBsaW5lLCB0aGUgYWN0aXZpdGllcyBhbmQgd29yayBwcm9kdWN0cyBhcmUgb3JnYW5pemVkIGludG8mIzEzOyYjMTA7ICAgIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGZvciB0aGUgZGlzY2lwbGluZS4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEluIHRoZSBJbmNlcHRpb24gUGhhc2UsIGFuYWx5c2lzIGFuZCBkZXNpZ24gaXMgY29uY2VybmVkIHdpdGggZXN0YWJsaXNoaW5nIHdoZXRoZXIgdGhlIHN5c3RlbSBhcyBlbnZpc2lvbmVkIGlzJiMxMzsmIzEwOyAgICBmZWFzaWJsZSwgYW5kIHdpdGggYXNzZXNzaW5nIHBvdGVudGlhbCB0ZWNobm9sb2dpZXMgZm9yIHRoZSBzb2x1dGlvbiAoaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FyY2hzeW4uaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1BlcmZvcm0gQXJjaGl0ZWN0dXJhbCBTeW50aGVzaXMmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykuIElmIGl0IGlzIGZlbHQgdGhhdCBsaXR0bGUgcmlzayBhdHRhY2hlcyB0byB0aGUgZGV2ZWxvcG1lbnQmIzEzOyYjMTA7ICAgIChiZWNhdXNlLCBmb3IgZXhhbXBsZSwgdGhlIGRvbWFpbiBpcyB3ZWxsIHVuZGVyc3Rvb2QsIHRoZSBzeXN0ZW0gaXMgbm90IG5vdmVsLCBhbmQgc28gb24pIHRoZW4gdGhpcyB3b3JrZmxvdyBkZXRhaWwgbWF5JiMxMzsmIzEwOyAgICBiZSBvbWl0dGVkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIGVhcmx5IEVsYWJvcmF0aW9uIFBoYXNlIGZvY3VzZXMgb24gY3JlYXRpbmcgYW4gaW5pdGlhbCBhcmNoaXRlY3R1cmUgZm9yIHRoZSBzeXN0ZW0gKCAmbHQ7YSYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDEuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVmaW5lIGEgQ2FuZGlkYXRlIEFyY2hpdGVjdHVyZSZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7KSB0byBwcm92aWRlIGEgc3RhcnRpbmcmIzEzOyYjMTA7ICAgIHBvaW50IGZvciB0aGUgbWFpbiBhbmFseXNpcyB3b3JrLiBJZiB0aGUgYXJjaGl0ZWN0dXJlIGFscmVhZHkgZXhpc3RzIChlaXRoZXIgYmVjYXVzZSBpdCB3YXMgcHJvZHVjZWQgaW4gcHJldmlvdXMmIzEzOyYjMTA7ICAgIGl0ZXJhdGlvbnMsIGluIHByZXZpb3VzIHByb2plY3RzLCBvciBpcyBvYnRhaW5lZCBmcm9tIGFuIGFwcGxpY2F0aW9uIGZyYW1ld29yayksIHRoZSBmb2N1cyBvZiB0aGUgd29yayBjaGFuZ2VzIHRvJiMxMzsmIzEwOyAgICByZWZpbmluZyB0aGUgYXJjaGl0ZWN0dXJlICggJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDIuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7UmVmaW5lIHRoZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykmIzEzOyYjMTA7ICAgIGFuZCBhbmFseXppbmcgYmVoYXZpb3IgYW5kIGNyZWF0aW5nIGFuIGluaXRpYWwgc2V0IG9mIGVsZW1lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQzLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0FuYWx5emUgQmVoYXZpb3ImbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBZnRlciB0aGUgaW5pdGlhbCBlbGVtZW50cyBhcmUgaWRlbnRpZmllZCwgdGhleSBhcmUgZnVydGhlciByZWZpbmVkLiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kNC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQmIzEzOyYjMTA7ICAgIGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVzaWduIENvbXBvbmVudHMmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OyBwcm9kdWNlIGEgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IgdG8mIzEzOyYjMTA7ICAgIHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50cyBvbiB0aGUgc3lzdGVtLiBJZiB0aGUgc3lzdGVtIGluY2x1ZGVzIGEgZGF0YWJhc2UsIHRoZW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDcuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiB0aGUgRGF0YWJhc2UmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OyBvY2N1cnMgaW4gcGFyYWxsZWwuIFRoZSByZXN1bHQgaXMgYW4gaW5pdGlhbCBzZXQgb2YgY29tcG9uZW50cyB3aGljaCBhcmUmIzEzOyYjMTA7ICAgIGZ1cnRoZXIgcmVmaW5lZCBpbiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZmRfaW1wLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0ltcGxlbWVudGF0aW9uJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsuJmx0O2JyIC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7JmFtcDtuYnNwOyZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsiIGV4dGVybmFsSWQ9IkVYdGVybmFsIElEOkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgc2NvcGU9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVG8gZXhwbGFpbiB0aGUgd29yayBpbnZvbHZlZCBpbiB0aGUgQW5hbHlzaXMgYW5kIERlc2lnbiBkaXNjaXBsaW5lLCB0aGUgYWN0aXZpdGllcyBhbmQgd29yayBwcm9kdWN0cyBhcmUgb3JnYW5pemVkIGludG8mIzEzOyYjMTA7ICAgIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGZvciB0aGUgZGlzY2lwbGluZS4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEluIHRoZSBJbmNlcHRpb24gUGhhc2UsIGFuYWx5c2lzIGFuZCBkZXNpZ24gaXMgY29uY2VybmVkIHdpdGggZXN0YWJsaXNoaW5nIHdoZXRoZXIgdGhlIHN5c3RlbSBhcyBlbnZpc2lvbmVkIGlzJiMxMzsmIzEwOyAgICBmZWFzaWJsZSwgYW5kIHdpdGggYXNzZXNzaW5nIHBvdGVudGlhbCB0ZWNobm9sb2dpZXMgZm9yIHRoZSBzb2x1dGlvbiAoaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FyY2hzeW4uaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1BlcmZvcm0gQXJjaGl0ZWN0dXJhbCBTeW50aGVzaXMmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykuIElmIGl0IGlzIGZlbHQgdGhhdCBsaXR0bGUgcmlzayBhdHRhY2hlcyB0byB0aGUgZGV2ZWxvcG1lbnQmIzEzOyYjMTA7ICAgIChiZWNhdXNlLCBmb3IgZXhhbXBsZSwgdGhlIGRvbWFpbiBpcyB3ZWxsIHVuZGVyc3Rvb2QsIHRoZSBzeXN0ZW0gaXMgbm90IG5vdmVsLCBhbmQgc28gb24pIHRoZW4gdGhpcyB3b3JrZmxvdyBkZXRhaWwgbWF5JiMxMzsmIzEwOyAgICBiZSBvbWl0dGVkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIGVhcmx5IEVsYWJvcmF0aW9uIFBoYXNlIGZvY3VzZXMgb24gY3JlYXRpbmcgYW4gaW5pdGlhbCBhcmNoaXRlY3R1cmUgZm9yIHRoZSBzeXN0ZW0gKCAmbHQ7YSYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDEuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVmaW5lIGEgQ2FuZGlkYXRlIEFyY2hpdGVjdHVyZSZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7KSB0byBwcm92aWRlIGEgc3RhcnRpbmcmIzEzOyYjMTA7ICAgIHBvaW50IGZvciB0aGUgbWFpbiBhbmFseXNpcyB3b3JrLiBJZiB0aGUgYXJjaGl0ZWN0dXJlIGFscmVhZHkgZXhpc3RzIChlaXRoZXIgYmVjYXVzZSBpdCB3YXMgcHJvZHVjZWQgaW4gcHJldmlvdXMmIzEzOyYjMTA7ICAgIGl0ZXJhdGlvbnMsIGluIHByZXZpb3VzIHByb2plY3RzLCBvciBpcyBvYnRhaW5lZCBmcm9tIGFuIGFwcGxpY2F0aW9uIGZyYW1ld29yayksIHRoZSBmb2N1cyBvZiB0aGUgd29yayBjaGFuZ2VzIHRvJiMxMzsmIzEwOyAgICByZWZpbmluZyB0aGUgYXJjaGl0ZWN0dXJlICggJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDIuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7UmVmaW5lIHRoZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykmIzEzOyYjMTA7ICAgIGFuZCBhbmFseXppbmcgYmVoYXZpb3IgYW5kIGNyZWF0aW5nIGFuIGluaXRpYWwgc2V0IG9mIGVsZW1lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQzLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0FuYWx5emUgQmVoYXZpb3ImbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBZnRlciB0aGUgaW5pdGlhbCBlbGVtZW50cyBhcmUgaWRlbnRpZmllZCwgdGhleSBhcmUgZnVydGhlciByZWZpbmVkLiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kNC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQmIzEzOyYjMTA7ICAgIGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVzaWduIENvbXBvbmVudHMmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OyBwcm9kdWNlIGEgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IgdG8mIzEzOyYjMTA7ICAgIHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50cyBvbiB0aGUgc3lzdGVtLiBJZiB0aGUgc3lzdGVtIGluY2x1ZGVzIGEgZGF0YWJhc2UsIHRoZW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDcuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiB0aGUgRGF0YWJhc2UmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OyBvY2N1cnMgaW4gcGFyYWxsZWwuIFRoZSByZXN1bHQgaXMgYW4gaW5pdGlhbCBzZXQgb2YgY29tcG9uZW50cyB3aGljaCBhcmUmIzEzOyYjMTA7ICAgIGZ1cnRoZXIgcmVmaW5lZCBpbiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZmRfaW1wLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0ltcGxlbWVudGF0aW9uJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsuJmx0O2JyIC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7JmFtcDtuYnNwOyZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsiIHVzYWdlTm90ZXM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIHN1YmNhdGVnb3JpZXMgb2YgcHJvY2VzcyBhcmUgZGVsaXZlcnkgcHJvY2VzcyBhbmQgY2FwYWJpbGl0eSBwYXR0ZXJuLiZhbXA7bmJzcDsgQSBkZWxpdmVyeSBwcm9jZXNzIGRlZmluZXMgYSBjb21wbGV0ZSYjMTM7JiMxMDsgICAgb3IgZW5kLXRvLWVuZCBwcm9jZXNzLiZhbXA7bmJzcDsgQSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgYSBwcm9jZXNzIGZyYWdtZW50IHVzZWQgdG8gY29tcG9zZSBhIGRlbGl2ZXJ5IHByb2Nlc3MuJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9Qcm9jZXNzRGVzY3JpcHRpb24+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL1BoYXNlMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvQ2FwYWJpbGl0eVBhdHRlcm4+Ci08L1Byb2Nlc3NDb21wb25lbnQ+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJhY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08QWN0aXZpdHkgbmFtZT0iYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHMiIHByZWZpeD0iUHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08QWN0aXZpdHlEZXNjcmlwdGlvbiBuYW1lPSIsX2xEaGw4RURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0ibWFpbjogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5OiBBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHMiIHVzYWdlR3VpZGFuY2U9InVzYWdlOiBBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHMiIHB1cnBvc2U9InB1cnBvc2U6IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50cyIgYWx0ZXJuYXRpdmVzPSJhbHRlcm5hdGl2ZXM6IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50cyIgaG93dG9TdGFmZj0iaG93IHRvIHN0YWZmOiBBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvdGFza19BMyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTMiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvcm9sZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2FydGlmYWN0X0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvZGVsaXZlcmFibGVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08L0FjdGl2aXR5PgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQTMiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmOiBUYXNrIEEzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEEzIGV4dGVuZHMgVGFzayBBMiIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQTMsX0dxWDFNRURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy90YXNrX0EzIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvdGFza19BMyI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvcm9sZV9BMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTEiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L21hbmRhdG9yeUlucHV0PgotPG9wdGlvbmFsSW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvZGVsaXZlcmFibGVfQTIiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3Rhc2tfQTMiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EzLyxfb1VsdUVFREZFZHFPOU0zZnVrWUFfQS9TdGVwIEEzLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTMvLF9vVWx1RUVERkVkcU85TTNmdWtZQV9BL1N0ZXAgQTMuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMy8sX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EvU3RlcCBBMy4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyL3Rhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMi4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyL3Rhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMi4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyL3Rhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMi4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9BMyIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWYgOiBSb2xlIEEzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEEzIGV4dGVuZHMgUm9sZSBBMiIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0EzLF9HcVgxTVVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvcm9sZV9BMyI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTMiPgotPC9Sb2xlPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL291dGNvbWVfQTIiPgotPC9tb2RpZmllcz4KLTwvUm9sZURlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiBleHRlbmRlZCBieSBSb2xlIEEzIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTIsX0dxaG1NRURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvcm9sZV9BMiI+Ci08L1JvbGU+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYXJ0aWZhY3RfQTIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9kZWxpdmVyYWJsZV9BMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL291dGNvbWVfQTIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZURlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMSIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0ExLF9HcWhtTVVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvcm9sZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTEiPgotPC9Sb2xlPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfR3FobU1rRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2FydGlmYWN0X0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2FydGlmYWN0X0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMixfR3FobU0wRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2RlbGl2ZXJhYmxlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2RlbGl2ZXJhYmxlX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTIsX0dxaG1ORURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL291dGNvbWVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0EyLF9HcXF3SUVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfR3Fxd0lVRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvRGlhZ3JhbT4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08QWN0aXZpdHkgbmFtZT0iQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyxfZFlHbTBFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcHVycG9zZT0iIiBhbHRlcm5hdGl2ZXM9IiIgaG93dG9TdGFmZj0iIj4KLTwvQWN0aXZpdHlEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3Rhc2tfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08L0FjdGl2aXR5PgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQjIiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjIgZXh0ZW5kcyBUYXNrIEExIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFza19CMixfbDV5VUFFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy90YXNrX0IyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3Rhc2tfQjIiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0IxIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQTIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQjIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQTEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9CMiI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQTEiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9CMiI+Ci08L291dHB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQTEiPgotPC9vdXRwdXQ+Ci08cGVyZm9ybWVkUHJpbWFyaWx5QnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3Rhc2tfQjIiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9InRhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9InRhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9InRhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQjIsX2w1eVVBVURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0IyIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9CMiI+Ci08L21vZGlmaWVzPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0ExIj4KLTwvbW9kaWZpZXM+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0IyIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0IyIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQjEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0IxLF9sNXlVQWtEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMSI+Ci08L1JvbGU+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgZXh0ZW5kZWQgYnkgUm9sZSBBMyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0EyLF9sNXlVQTBEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9BMiI+Ci08L1JvbGU+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IyLF9sNXlVQkVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0IyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsX2w1eVVCVURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMSxfbDV5VUJrRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0IyLF9sNXlVQjBEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0IyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0IyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0IyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0ExLF9sNXlVQ0VEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0IyLF9sNXlVQ1VEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsX2w1eVVDa0RQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQjIsX2w1N2Q4RURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMixfbDU3ZDhVRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExLF9sNTdkOGtEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xLF9sNTdkODBEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsX2w1N2Q5RURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+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+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPENhcGFiaWxpdHlQYXR0ZXJuIG5hbWU9IkNQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSJCcmllZjogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPFByb2Nlc3NEZXNjcmlwdGlvbiBuYW1lPSJDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyxfWnRaYk1VREZFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSJtYWluOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIga2V5Q29uc2lkZXJhdGlvbnM9IktleXM6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiB1c2FnZUd1aWRhbmNlPSJ1c2FnZTogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIHB1cnBvc2U9IlB1cnBvc2U6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBhbHRlcm5hdGl2ZXM9ImFsdGVybmF0aXZlczogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGhvd3RvU3RhZmY9IkhvdyB0byBzdGFmZjogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGV4dGVybmFsSWQ9IkV4dGVybmFsIElEOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgc2NvcGU9InNjb3BlOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgdXNhZ2VOb3Rlcz0idXNhZ2U6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08ZGVmYXVsdENvbnRleHQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvQ2FwYWJpbGl0eVBhdHRlcm4+Ci08L1Byb2Nlc3NDb21wb25lbnQ+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NDb21wb25lbnQgbmFtZT0iQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsvQ1AxIHdpdGggYWxsIGVsZW1lbnRzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxBY3Rpdml0eSBuYW1lPSJDUDEgd2l0aCBhbGwgZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08QWN0aXZpdHlEZXNjcmlwdGlvbiBuYW1lPSJDUDEgd2l0aCBhbGwgZWxlbWVudHMsX0VYYXpFRDBLRWRxakFJNzdESHZCd0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7L0NQMSB3aXRoIGFsbCBlbGVtZW50cy9DUDEgd2l0aCBhbGwgZWxlbWVudHMiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08dmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOy9DUDEgd2l0aCBhbGwgZWxlbWVudHMvQ1AxIHdpdGggYWxsIGVsZW1lbnRzIj4KLTwvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4KLTwvQWN0aXZpdHk+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7Ij4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPENhcGFiaWxpdHlQYXR0ZXJuIG5hbWU9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iQ2FwUGF0IEExLF9hSFVTUVJCTkVkcUJzN0toZFZMUkxBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyBrZXkgY29uIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgcHVycG9zZTogQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiBhbHRlcm5hdGl2ZXM9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgJmx0O3N0cm9uZyZndDtlbGVtZW50cyZhcG9zOyBhbHRlcm4mbHQ7L3N0cm9uZyZndDsiIGhvd3RvU3RhZmY9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsgc3RhZmYiIGV4dGVybmFsSWQ9ImV4dGVybklEOkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiIHNjb3BlPSJDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7IHNjb3BlIiB1c2FnZU5vdGVzPSJDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7dXNhZ2UiPgotPC9Qcm9jZXNzRGVzY3JpcHRpb24+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7L0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPFByb2Nlc3NDb21wb25lbnQgbmFtZT0iQ1AgQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJBY3QxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9wYXJlbnRQYWNrYWdlPgotPEFjdGl2aXR5IG5hbWU9IkFjdDEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQWN0MSIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9IkFjdDEsX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL0FjdDEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08L0FjdGl2aXR5PgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQTEiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQTEsX2dGN1VzRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMSI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0ExIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMSI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0ExIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMSxfZ0Y3VXNVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0ExIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvbW9kaWZpZXM+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9BMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZURlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiAiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMixfZ0Y3VXNrQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0EyIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0EyIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xLF9nRjdVczBBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExLF9nR0Vlb0VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0ExLF9nR0Vlb1VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMSxfZ0dFZW9rQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTEsX2dHRWVvMEF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfZ0dFZXBFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsX2dHRWVwVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQjEiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjEgcHJlc25ldCIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQjEsX2pCRmVRRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19CMSI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9CMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9CMSI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjEiPgotPC9vdXRwdXQ+Ci08cGVyZm9ybWVkUHJpbWFyaWx5QnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19CMSI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0idGFza19CMSxfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIxLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0idGFza19CMSxfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIxLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0idGFza19CMSxfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIxLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0IxIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9CMSxfanZTQkFFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IxIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvbW9kaWZpZXM+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9CMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0IyIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9CMixfanZTQkFVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IyIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IyIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IxLF9qdlNCQWtBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0IxLF9qdlNCQTBBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMSxfanZTQkJFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0IxIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQjEsX2p2Yks4RUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0IxLF9qdmJLOFVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0IyIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0IyLF9rWWpuZ0VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjIiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQjEiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L21hbmRhdG9yeUlucHV0PgotPG9wdGlvbmFsSW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjIiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IyIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjIiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9InRhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9InRhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9InRhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQjIsX2tZX3NZRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImRlbGl2ZXJhYmxlX0IyIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQjIsX2tZX3NZVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0IyLF9rWV9zWWtBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQjIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9CMixfa1pKZFlFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0IyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQjIsX2taSmRZVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQTIiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTIgIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFza19BMixfYTBna3dFQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0EyIj4KLTwvVGFzaz4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0ExIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQTIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0EyIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMiI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0EyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0EyLF9hMXRlb0VBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0EyLF9hMmRGZ0VBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfYTNNc1lFQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsX2E0R0VRRUEzRWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0EyLF9hNDFySUVBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+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+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+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+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08Q2FwYWJpbGl0eVBhdHRlcm4gbmFtZT0iQ1AgQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ1AgQTEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9IkNQIEExLF9kQmh2a1VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiIgZXh0ZXJuYWxJZD0iIiBzY29wZT0iIiB1c2FnZU5vdGVzPSIiPgotPC9Qcm9jZXNzRGVzY3JpcHRpb24+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvQWN0MSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9DUCBBMSI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvQ2FwYWJpbGl0eVBhdHRlcm4+Ci08L1Byb2Nlc3NDb21wb25lbnQ+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9ImRlbFByb2NfQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NfQTEiPgotPC9wYXJlbnRQYWNrYWdlPgotPERlbGl2ZXJ5UHJvY2VzcyBuYW1lPSJkZWxQcm9jX0ExIiBicmllZkRlc2NyaXB0aW9uPSJEZWxQcm9jIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxQcm9jIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iRGVsUHJvYyBBMSxfVzZhNGNSQk5FZHFCczdLaGRWTFJMQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRlbFByb2MgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkRlbFByb2MgQTEga2V5IGNvbiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSJEZWxQcm9jIEExIHBvcnBvaXNlIiBhbHRlcm5hdGl2ZXM9IkRlbFByb2MgQTEgYWx0ZXJuIiBob3d0b1N0YWZmPSJEZWxQcm9jIEExIHN0YWZmIiBleHRlcm5hbElkPSJEZWxQcm9jIEExIGV4dGVybklEIiBzY29wZT0iRGVsUHJvYyBBMSBzY29wZSIgdXNhZ2VOb3Rlcz0iRGVsUHJvYyBBMSB1c2FnZSIgc2NhbGU9IkRlbFByb2MgQTEgc2NhbGUiIHByb2plY3RDaGFyYWN0ZXJpc3RpY3M9IkRlbFByb2MgQTEgcHJvaiBjaGFyIiByaXNrTGV2ZWw9IkRlbFByb2MgQTEgcmlzayIgZXN0aW1hdGluZ1RlY2huaXF1ZT0iRGVsUHJvYyBBMSBlc3QgdGVjaCIgcHJvamVjdE1lbWJlckV4cGVydGlzZT0iRGVsUHJvYyBBMSBleHBlcnRpc2UiIHR5cGVPZkNvbnRyYWN0PSJEZWxQcm9jIEExIGNvbnR5cGUiPgotPC9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbj4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY19BMS9kZWxQcm9jX0ExIj4KLTwvZGVmYXVsdENvbnRleHQ+Ci08dmFsaWRDb250ZXh0IHBhdGg9IkNvbmZpZyBBIj4KLTwvdmFsaWRDb250ZXh0PgotPC9EZWxpdmVyeVByb2Nlc3M+Ci08L1Byb2Nlc3NDb21wb25lbnQ+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iZGVsUHJvY1BhayBBMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrIEExIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9ImRlbFByb2NQYWtfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1BhayBBMS9kZWxQcm9jUGFrX0ExLjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPERlbGl2ZXJ5UHJvY2VzcyBuYW1lPSJkZWxQcm9jUGFrX0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IkRlbFByb2NQYWsgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsUHJvY1BhayBBMS4xIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iZGVsUHJvY1Bha19BMS4xLF91cTVLOFJNMUVkcXFuZGktZ0R1eHB3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRGVsUHJvY1BhayBBMS4xIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEZWxQcm9jUGFrIEExLjEga2V5IiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IkRlbFByb2NQYWsgQTEuMSBwb3Jwb2lzZSIgYWx0ZXJuYXRpdmVzPSJEZWxQcm9jUGFrIEExLjEgYWx0IiBob3d0b1N0YWZmPSJEZWxQcm9jUGFrIEExLjEgc3RhZmYiIGV4dGVybmFsSWQ9IkRlbFByb2NQYWsgQTEuMSBleHRlcm5JRCIgc2NvcGU9IkRlbFByb2NQYWsgQTEuMSBzY29wZSIgdXNhZ2VOb3Rlcz0iRGVsUHJvY1BhayBBMS4xIHVzYWdlIiBzY2FsZT0iRGVsUHJvY1BhayBBMS4xIHNjYWxlIiBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzPSJEZWxQcm9jUGFrIEExLjEgY2hhciIgcmlza0xldmVsPSJEZWxQcm9jUGFrIEExLjEgcmlzayIgZXN0aW1hdGluZ1RlY2huaXF1ZT0iRGVsUHJvY1BhayBBMS4xJmFtcDtuYnNwO2VzdGltYXRpbmcgdGVjaCZsdDshLS1TdGFydEZyYWdtZW50LS0mZ3Q7Jmx0OyEtLUVuZEZyYWdtZW50LS0mZ3Q7IiBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPSJEZWxQcm9jUGFrIEExLjEgZXhwZXJ0aXNlIiB0eXBlT2ZDb250cmFjdD0iRGVsUHJvY1BhayBBMS4xJmFtcDtuYnNwO2NvbnRyYWN0Ij4KLTwvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24+Ci08ZGVmYXVsdENvbnRleHQgcGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWsgQTEvZGVsUHJvY1Bha19BMS4xL2RlbFByb2NQYWtfQTEuMSI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvRGVsaXZlcnlQcm9jZXNzPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPC9NZXRob2RQbHVnaW4+Ci08TWV0aG9kUGx1Z2luIG5hbWU9IlBsdWcgQiIgYnJpZWZEZXNjcmlwdGlvbj0iUGx1ZyBCIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSJQbHVnIEIgYXJ0aHVyIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIHVzZXJDaGFuZ2VhYmxlPSJ0cnVlIj4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJDb250ZW50IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IkNhdGVnb3JpZXMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJEb21haW5zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9Eb21haW5zIj4KLTwvcGFyZW50UGFja2FnZT4KLTxEb21haW4gbmFtZT0iZG9tYWluX0IxIiBicmllZkRlc2NyaXB0aW9uPSJEb21haW4gQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRvbWFpbiBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZG9tYWluX0IxLF9tZHJ6WUI4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNzowMjowNCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRG9tYWluIEIxIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEb21haW4gQjEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IxIj4KLTwvYXNzZXRzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjEiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9kZWxpdmVyYWJsZV9CMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL291dGNvbWVfQjEiPgotPC93b3JrUHJvZHVjdHM+Ci08L0RvbWFpbj4KLTxEb21haW4gbmFtZT0iZG9tYWluX0IyIiBicmllZkRlc2NyaXB0aW9uPSJEb21haW4gQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRvbWFpbiBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZG9tYWluX0IyLF9yYW9PZ0I4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNzowMjozNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRG9tYWluIEIyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEb21haW4gQjIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IyIj4KLTwvYXNzZXRzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjIiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9vdXRjb21lX0IyIj4KLTwvd29ya1Byb2R1Y3RzPgotPC9Eb21haW4+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IkRpc2NpcGxpbmVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08RGlzY2lwbGluZUdyb3VwaW5nIG5hbWU9ImRpc2NpcGxpbmVfZ3JvdXBpbmdfQjEiIGJyaWVmRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgR3JvdXBpbmcgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRpc2NpcGxpbmUgR3JvdXBpbmcgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImRpc2NpcGxpbmVfZ3JvdXBpbmdfQjEsX1NaTXhZQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE3OjAwOjE5IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEIxIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEIxIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxkaXNjaXBsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL0Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQjEiPgotPC9kaXNjaXBsaW5lcz4KLTwvRGlzY2lwbGluZUdyb3VwaW5nPgotPERpc2NpcGxpbmUgbmFtZT0iZGlzY2lwbGluZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGlzY2lwbGluZSBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZGlzY2lwbGluZV9CMSxfY1k1N3dCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTc6MDA6NTcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQjEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkRpc2NpcGxpbmUgQjEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IxIj4KLTwvYXNzZXRzPgotPHRhc2tzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IxIj4KLTwvdGFza3M+Ci08cmVmZXJlbmNlV29ya2Zsb3dzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEvY2FwUGF0X0IxL2NhcFBhdF9CMSI+Ci08L3JlZmVyZW5jZVdvcmtmbG93cz4KLTwvRGlzY2lwbGluZT4KLTxEaXNjaXBsaW5lIG5hbWU9ImRpc2NpcGxpbmVfQjIiIGJyaWVmRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRpc2NpcGxpbmUgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImRpc2NpcGxpbmVfQjIsX2g5ZmxzQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE3OjAxOjM0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIERpc2NpcGxpbmUgQjIgbWFpbiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiBrZXlDb25zaWRlcmF0aW9ucz0iRGlzY2lwbGluZSBCMiBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjIiPgotPC9hc3NldHM+Ci08dGFza3MgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjIiPgotPC90YXNrcz4KLTxyZWZlcmVuY2VXb3JrZmxvd3MgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19CMS9jYXBQYXRQYWtfQjEuMS9jYXBQYXRfQjEuMS9jYXBQYXRfQjEuMSI+Ci08L3JlZmVyZW5jZVdvcmtmbG93cz4KLTwvRGlzY2lwbGluZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iUm9sZVNldHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxSb2xlU2V0R3JvdXBpbmcgbmFtZT0icm9sZV9zZXRfZ3JvdXBpbmdfQjEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgU2V0IEdyb3VwaW5nIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIFNldCBHcm91cGluZyBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icm9sZV9zZXRfZ3JvdXBpbmdfQjEsX3phVlFBQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE3OjE2OjI1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSb2xlIFNldCBHcm91cGluZyBCMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBTZXQgR3JvdXBpbmcgQjEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHJvbGVTZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvUm9sZVNldHMvcm9sZV9zZXRfQjEiPgotPC9yb2xlU2V0cz4KLTwvUm9sZVNldEdyb3VwaW5nPgotPFJvbGVTZXQgbmFtZT0icm9sZV9zZXRfQjEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgU2V0IEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIFNldCBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icm9sZV9zZXRfQjEsX3VQQVdjQjg1RWRxTnZlbHliRFhaRlEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE3OjUzOjA3IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSb2xlIFNldCBCMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBTZXQgQjEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IxIj4KLTwvYXNzZXRzPgotPHJvbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yb2xlX0IxIj4KLTwvcm9sZXM+Ci08L1JvbGVTZXQ+Ci08Um9sZVNldCBuYW1lPSJyb2xlX3NldF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBTZXQgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgU2V0IEIyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyb2xlX3NldF9CMixfMFlfTWNCODVFZHFOdmVseWJEWFpGUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTc6NTM6NDMgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgUm9sZSBTZXQgQjIgbWFpbiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiBrZXlDb25zaWRlcmF0aW9ucz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBSb2xlIFNldCBCMiBrZXkmIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMiI+Ci08L2Fzc2V0cz4KLTxyb2xlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9sZV9CMiI+Ci08L3JvbGVzPgotPC9Sb2xlU2V0PgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJXUCBUeXBlcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPFdvcmtQcm9kdWN0VHlwZSBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iV29yayBQcm9kdWN0IFR5cGUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IldvcmsgUHJvZHVjdCBUeXBlIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9CMSxfeEtzSW9COHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTc6MTc6MjggUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IldvcmsgUHJvZHVjdCBUeXBlIEIxIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJXb3JrIFByb2R1Y3QgVHlwZSBCMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IxIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjEiPgotPC9hc3NldHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9hcnRpZmFjdF9CMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvb3V0Y29tZV9CMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTwvV29ya1Byb2R1Y3RUeXBlPgotPFdvcmtQcm9kdWN0VHlwZSBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iV29yayBQcm9kdWN0IFR5cGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IldvcmsgUHJvZHVjdCBUeXBlIEIyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9CMixfeUNrTDBCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTc6MDQ6NTUgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IldvcmsgUHJvZHVjdCBUeXBlIEIyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJXb3JrIFByb2R1Y3QgVHlwZSBCMiBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjIiPgotPC9hc3NldHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9hcnRpZmFjdF9CMiI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL291dGNvbWVfQjIiPgotPC93b3JrUHJvZHVjdHM+Ci08L1dvcmtQcm9kdWN0VHlwZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iVG9vbHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1Rvb2xzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxUb29sIG5hbWU9InRvb2xfQjEiIGJyaWVmRGVzY3JpcHRpb249IlRvb2wgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2wgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRvb2xfQjEsXzBOY3ZBQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE3OjE1OjI5IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUb29sIEIxIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJUb29sIEIxIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IxIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IxIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMSI+Ci08L2Fzc2V0cz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdG9vbG1lbnRvcl9CMSI+Ci08L3Rvb2xNZW50b3JzPgotPC9Ub29sPgotPFRvb2wgbmFtZT0idG9vbF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iVG9vbCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVG9vbCBCMiBwcmVzZW50YXRpb24iIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0b29sX0IyLF8xN0h4d0I4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNzoxNTo1OCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVG9vbCBCMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iVG9vbCBCMiBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjIiPgotPC9hc3NldHM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rvb2xtZW50b3JfQjIiPgotPC90b29sTWVudG9ycz4KLTwvVG9vbD4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9TdGFuZGFyZENhdGVnb3JpZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJIaWRkZW4iIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvSGlkZGVuIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDdXN0b21DYXRlZ29yeSBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyxfZWN5NXl4TTNFZHFxbmRpLWdEdXhwdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IxIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjIiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPC9DdXN0b21DYXRlZ29yeT4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q3VzdG9tQ2F0ZWdvcnkgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0IxIiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0IxLF8zRVNaUUI4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNzowNTo0MCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEIxIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJDdXN0b20gQ2F0ZWdvcnkgQjEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMS4xIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IxIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yb2xlX0IxIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9hcnRpZmFjdF9CMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZGVsaXZlcmFibGVfQjEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL291dGNvbWVfQjEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvQ1AxIHdpdGggYWxsIGVsZW1lbnRzIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7L0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0NQIEIxIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTwvQ3VzdG9tQ2F0ZWdvcnk+Ci08Q3VzdG9tQ2F0ZWdvcnkgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0IyIiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0IyLF8zc0V5QUI4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNzowNjoxMiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEIyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJDdXN0b20gQ2F0ZWdvcnkgQjIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjIiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2FydGlmYWN0X0IyIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9vdXRjb21lX0IyIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yb2xlX0IyIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTwvQ3VzdG9tQ2F0ZWdvcnk+Ci08Q3VzdG9tQ2F0ZWdvcnkgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0IxLjEiIGJyaWVmRGVzY3JpcHRpb249IkN1c3RvbSBDYXRlZ29yeSBCMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDdXN0b20gQ2F0ZWdvcnkgQjEuMSBwcmVzZW50YXRpb24iIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQjEuMSxfWGZUZG9CODBFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTc6MTQ6NDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkN1c3RvbSBDYXRlZ29yeSBCMS4xIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJDdXN0b20gQ2F0ZWdvcnkgQjEuMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0N1c3RvbUNhdGVnb3J5PgotPC9Db250ZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iQ29yZUNvbnRlbnQiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudCI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iY29udGVudF9wYWNrYWdlX0IxIiBicmllZkRlc2NyaXB0aW9uPSJDb24gUGFrIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Um9sZSBuYW1lPSJyb2xlX0IxIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFJvbGVEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0IxLF9BOURZZ0I4UEVkcXNoTU5TSTA3WE9nIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxMjo0NzoyMyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBCMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBCMSBrZXkiIHNraWxscz0iUm9sZSBCMSBza2lsbCIgYXNzaWdubWVudEFwcHJvYWNoZXM9IlJvbGUgQjEgYXNzaWduIiBzeW5vbnltcz0iUm9sZSBCMSBzeW4iPgotPC9Sb2xlRGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IxIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjEiPgotPC9hc3NldHM+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL291dGNvbWVfQjEiPgotPC9tb2RpZmllcz4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZGVsaXZlcmFibGVfQjEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZT4KLTxSb2xlIG5hbWU9InJvbGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Um9sZURlc2NyaXB0aW9uIG5hbWU9InJvbGVfQjIsX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDEyOjQ4OjIxIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSb2xlIEIyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJSb2xlIEIyIGtleSIgc2tpbGxzPSJSb2xlIEIyIHNraWxsIiBhc3NpZ25tZW50QXBwcm9hY2hlcz0iUm9sZSBCMiBhc3MiIHN5bm9ueW1zPSJSb2xlIEIyIHN5biI+Ci08L1JvbGVEZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMiI+Ci08L2Fzc2V0cz4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvb3V0Y29tZV9CMiI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9hcnRpZmFjdF9CMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9kZWxpdmVyYWJsZV9CMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPC9Sb2xlPgotPFRhc2sgbmFtZT0idGFza19CMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBCMSBwcmVzbmV0IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxUYXNrRGVzY3JpcHRpb24gbmFtZT0idGFza19CMSxfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTI6NTA6NDcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGFzayBCMSBtYWluICZhbXA7YW1wOyBcIFxcICZxdW90OyAmYXBvczsgJSAmYW1wO2d0OyAmYW1wO2x0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiBrZXlDb25zaWRlcmF0aW9ucz0iVGFzayBCMSBrZXkiIHB1cnBvc2U9IlRhc2sgQjEgcG9ycG9pc2UiIGFsdGVybmF0aXZlcz0iVGFzayBCMSBhbHQiPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBCMS4xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0idXAiPgotPC9TZWN0aW9uPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBCMS4yIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBEb3duJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9TZWN0aW9uPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBCMS4zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iT3ZlciI+Ci08L1NlY3Rpb24+Ci08L1Rhc2tEZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IxIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IxIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMSI+Ci08L2Fzc2V0cz4KLTxwZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMSI+Ci08L3BlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9hcnRpZmFjdF9CMSI+Ci08L21hbmRhdG9yeUlucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvb3V0Y29tZV9CMSI+Ci08L291dHB1dD4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9sZV9CMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG9wdGlvbmFsSW5wdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxzdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMS90YXNrX0IxLF9YVTZMVUI4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjEuMSI+Ci08L3N0ZXBzPgotPHN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IxL3Rhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMS4yIj4KLTwvc3RlcHM+Ci08c3RlcHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjEvdGFza19CMSxfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIxLjMiPgotPC9zdGVwcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdG9vbG1lbnRvcl9CMSI+Ci08L3Rvb2xNZW50b3JzPgotPC9UYXNrPgotPFRhc2sgbmFtZT0idGFza19CMiIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBCMiBleHRlbmRzIFRhc2sgQTEiIHZhcmlhYmlsaXR5VHlwZT0iZXh0ZW5kcyI+Ci08VGFza0Rlc2NyaXB0aW9uIG5hbWU9InRhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDEyOjUwOjA3IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUYXNrIEIyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJUYXNrIEIyIGtleSIgcHVycG9zZT0iVGFzayBCMiBwb3Jwb2lzZSIgYWx0ZXJuYXRpdmVzPSJUYXNrIEIyIGFsdCI+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEIyLjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJFaW4iPgotPC9TZWN0aW9uPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBCMi4yIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBad2VpJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9TZWN0aW9uPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBCMi4zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBEcmVpJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9TZWN0aW9uPgotPC9UYXNrRGVzY3JpcHRpb24+Ci08dmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMiI+Ci08L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjIiPgotPC9hc3NldHM+Ci08cGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjIiPgotPC9wZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL291dGNvbWVfQjIiPgotPC9vdXRwdXQ+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JvbGVfQjEiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9kZWxpdmVyYWJsZV9CMiI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08c3RlcHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjIvdGFza19CMixfWkxPTXNCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIyLjEiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMi90YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMiI+Ci08L3N0ZXBzPgotPHN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyL3Rhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4zIj4KLTwvc3RlcHM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rvb2xtZW50b3JfQjIiPgotPC90b29sTWVudG9ycz4KLTwvVGFzaz4KLTxBcnRpZmFjdCBuYW1lPSJhcnRpZmFjdF9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFydGlmYWN0RGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQjEsX21xSjNBQjhQRWRxc2hNTlNJMDdYT2ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE1OjM3OjQwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQXJ0aWZhY3QgQjEga2V5IiBleHRlcm5hbElkPSJBcnRpZmFjdCBCMSB1bmlxdWUgSUQiIHB1cnBvc2U9IkFydGlmYWN0IEIxIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iQXJ0aWZhY3QgQjEgaW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iQXJ0aWZhY3QgQjEgcmVhc29uIiBicmllZk91dGxpbmU9IkFydGlmYWN0IEIxIG91dGxpbmUiIHJlcHJlc2VudGF0aW9uT3B0aW9ucz0iQXJ0aWZhY3QgQjEgcmVwIj4KLTwvQXJ0aWZhY3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IxIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IxIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMSI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXBvcnRfQjEiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGVtcGxhdGVfQjEiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rvb2xtZW50b3JfQjEiPgotPC90b29sTWVudG9ycz4KLTwvQXJ0aWZhY3Q+Ci08QXJ0aWZhY3QgbmFtZT0iYXJ0aWZhY3RfQjIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxBcnRpZmFjdERlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IyLF9feUc3Y0I4bUVkcTFPby1Eb3dkcEJnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNTozOTowNCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkFydGlmYWN0IEIyIGtleSIgZXh0ZXJuYWxJZD0iQXJ0aWZhY3QgQjIgdW5pcXVlIElEIiBwdXJwb3NlPSJBcnRpZmFjdCBCMiBwb3Jwb2lzZSIgaW1wYWN0T2ZOb3RIYXZpbmc9IkFydGlmYWN0IEIyIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9IkFydGlmYWN0IEIyIHJlYXNvbiIgYnJpZWZPdXRsaW5lPSJBcnRpZmFjdCBCMiBvdXRsaW5lIiByZXByZXNlbnRhdGlvbk9wdGlvbnM9IkFydGlmYWN0IEIyIHJlcCI+Ci08L0FydGlmYWN0RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjIiPgotPC9hc3NldHM+Ci08cmVwb3J0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmVwb3J0X0IyIj4KLTwvcmVwb3J0cz4KLTx0ZW1wbGF0ZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3RlbXBsYXRlX0IyIj4KLTwvdGVtcGxhdGVzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90b29sbWVudG9yX0IyIj4KLTwvdG9vbE1lbnRvcnM+Ci08L0FydGlmYWN0PgotPERlbGl2ZXJhYmxlIG5hbWU9ImRlbGl2ZXJhYmxlX0IxIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08RGVsaXZlcmFibGVEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9CMSxfWkhmMllCOG5FZHExT28tRG93ZHBCZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTU6NDI6MTQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIxIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEZWxpdmVyYWJsZSBCMSBrZXkiIGV4dGVybmFsSWQ9IkRlbGl2ZXJhYmxlIEIxIHVuaXF1ZSBJRCIgcHVycG9zZT0iRGVsaXZlcmFibGUgQjEgcG9ycG9pc2UiIGltcGFjdE9mTm90SGF2aW5nPSJEZWxpdmVyYWJsZSBCMSBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJEZWxpdmVyYWJsZSBCMSByZWFzb24iIGV4dGVybmFsRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIxIGV4dGVybiIgcGFja2FnaW5nR3VpZGFuY2U9IkRlbGl2ZXJhYmxlIEIxIHBhY2siPgotPC9EZWxpdmVyYWJsZURlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IxIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JlcG9ydF9CMSI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90ZW1wbGF0ZV9CMSI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdG9vbG1lbnRvcl9CMSI+Ci08L3Rvb2xNZW50b3JzPgotPGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjEiPgotPC9kZWxpdmVyZWRXb3JrUHJvZHVjdHM+Ci08ZGVsaXZlcmVkV29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9vdXRjb21lX0IxIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPC9EZWxpdmVyYWJsZT4KLTxPdXRjb21lIG5hbWU9Im91dGNvbWVfQjIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08V29ya1Byb2R1Y3REZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0IyLF9hc0ZPa0I4bkVkcTFPby1Eb3dkcEJnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNTo0NjowMSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iT3V0Y29tZSBCMiBrZXkiIGV4dGVybmFsSWQ9Ik91dGNvbWUgQjIgdW5pcXVlIElEIiBwdXJwb3NlPSJPdXRjb21lIEIyIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iT3V0Y29tZSBCMiBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJPdXRjb21lIEIyIHJlYXNvbiI+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjIiPgotPC9hc3NldHM+Ci08cmVwb3J0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmVwb3J0X0IyIj4KLTwvcmVwb3J0cz4KLTx0ZW1wbGF0ZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3RlbXBsYXRlX0IyIj4KLTwvdGVtcGxhdGVzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90b29sbWVudG9yX0IyIj4KLTwvdG9vbE1lbnRvcnM+Ci08L091dGNvbWU+Ci08T3V0Y29tZSBuYW1lPSJvdXRjb21lX0IxIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMSxfY1hYcnNCOG5FZHExT28tRG93ZHBCZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTU6NDc6MzggUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249Ik91dGNvbWUgQjEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9Ik91dGNvbWUgQjEga2V5IiBleHRlcm5hbElkPSJPdXRjb21lIEIxIHVuaXF1ZSBJRCIgcHVycG9zZT0iT3V0Y29tZSBCMSBwb3Jwb2lzZSIgaW1wYWN0T2ZOb3RIYXZpbmc9Ik91dGNvbWUgQjEgaW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iT3V0Y29tZSBCMSByZWFzb24iPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IxIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JlcG9ydF9CMSI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90ZW1wbGF0ZV9CMSI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdG9vbG1lbnRvcl9CMSI+Ci08L3Rvb2xNZW50b3JzPgotPC9PdXRjb21lPgotPERlbGl2ZXJhYmxlIG5hbWU9ImRlbGl2ZXJhYmxlX0IyIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08RGVsaXZlcmFibGVEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9CMixfbnFGV0VCOG5FZHExT28tRG93ZHBCZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTU6NDM6MzAgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEZWxpdmVyYWJsZSBCMiBrZXkiIGV4dGVybmFsSWQ9IkRlbGl2ZXJhYmxlIEIyIHVuaXF1ZSBJRCIgcHVycG9zZT0iRGVsaXZlcmFibGUgQjIgcG9ycG9pc2UiIGltcGFjdE9mTm90SGF2aW5nPSJEZWxpdmVyYWJsZSBCMiBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJEZWxpdmVyYWJsZSBCMiByZWFzb24iIGV4dGVybmFsRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIyIGV4dGVybiIgcGFja2FnaW5nR3VpZGFuY2U9IkRlbGl2ZXJhYmxlIEIyIHBhY2siPgotPC9EZWxpdmVyYWJsZURlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IyIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JlcG9ydF9CMiI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90ZW1wbGF0ZV9CMiI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdG9vbG1lbnRvcl9CMiI+Ci08L3Rvb2xNZW50b3JzPgotPGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjIiPgotPC9kZWxpdmVyZWRXb3JrUHJvZHVjdHM+Ci08ZGVsaXZlcmVkV29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9vdXRjb21lX0IyIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPC9EZWxpdmVyYWJsZT4KLTxDaGVja2xpc3QgbmFtZT0iY2hlY2tsaXN0X0IxIiBicmllZkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQjEiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNoZWNrbGlzdCBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY2hlY2tsaXN0X0IxLF91ckxkY0I4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjoyNzoyMiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ2hlY2tsaXN0IEIxIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0NoZWNrbGlzdD4KLTxDaGVja2xpc3QgbmFtZT0iY2hlY2tsaXN0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNoZWNrbGlzdCBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY2hlY2tsaXN0X0IyLF93RXVxVUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjoyODowNCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ2hlY2tsaXN0IEIyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0NoZWNrbGlzdD4KLTxDb25jZXB0IG5hbWU9ImNvbmNlcHRfQjEiIGJyaWVmRGVzY3JpcHRpb249IkNvbmNlcHQgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNvbmNlcHQgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImNvbmNlcHRfQjEsX3c2RTk4QjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjE2OjAxIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJDb25jZXB0IEIxIGNvbnRleHQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0NvbmNlcHQ+Ci08Q29uY2VwdCBuYW1lPSJjb25jZXB0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJDb25jZXB0IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDb25jZXB0IEIyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJjb25jZXB0X0IyLF94bkZONEI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjoxNjoyNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ29uY2VwdCBCMiBjb250ZXh0IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Db25jZXB0PgotPEV4YW1wbGUgbmFtZT0iZXhhbXBsZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iRXhhbXBsZSBCMSByaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJFeGFtcGxlIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJleGFtcGxlX0IxLF95UXpnVUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjoyODozNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRXhhbXBsZSBCMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9FeGFtcGxlPgotPEV4YW1wbGUgbmFtZT0iZXhhbXBsZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iRXhhbXBsZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRXhhbXBsZSBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0ibmV3X2V4YW1wbGVfQjIsX3pBb2F3QjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjI5OjE4IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJFeGFtcGxlIEIyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0V4YW1wbGU+Ci08R3VpZGVsaW5lIG5hbWU9Imd1aWRlbGluZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iR3VpZGVsaW5lIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJHdWlkZWxpbmUgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9Imd1aWRlbGluZV9CMSxfemtaUElCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6Mzc6NTUgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249Ikd1aWRlbGluZSBCMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9HdWlkZWxpbmU+Ci08R3VpZGVsaW5lIG5hbWU9Imd1aWRlbGluZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iR3VpZGVsaW5lIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJHdWlkZWxpbmUgQjIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJndWlkZWxpbmVfQjIsXzBRZ3VRQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjQ2OjU0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJHdWlkZWxpbmUgQjIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvR3VpZGVsaW5lPgotPFByYWN0aWNlIG5hbWU9InByYWN0aWNlX0IxIiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08UHJhY3RpY2VEZXNjcmlwdGlvbiBuYW1lPSJwcmFjdGljZV9CMSxfMUktblVCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6NDI6MDAgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlByYWN0aWNlIEIxIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGFkZGl0aW9uYWxJbmZvPSJQcmFjdGljZSBCMSBhZGQiIHByb2JsZW09IlByYWN0aWNlIEIxIHByb2IiIGJhY2tncm91bmQ9IlByYWN0aWNlIEIxIGJhY2siIGdvYWxzPSJQcmFjdGljZSBCMSBnb2FsIiBhcHBsaWNhdGlvbj0iUHJhY3RpY2UgQjEgYXBwIiBsZXZlbHNPZkFkb3B0aW9uPSJQcmFjdGljZSBCMSBsZXZlbCI+Ci08L1ByYWN0aWNlRGVzY3JpcHRpb24+Ci08UHJhY3RpY2UgbmFtZT0icHJhY3RpY2VfQjEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQjEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQjEuMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxQcmFjdGljZURlc2NyaXB0aW9uIG5hbWU9InByYWN0aWNlX0IxLjEsXzJ2TS1RQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjQzOjQ4IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJQcmFjdGljZSBCMS4xIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGFkZGl0aW9uYWxJbmZvPSJQcmFjdGljZSBCMS4xIGFkZCIgcHJvYmxlbT0iUHJhY3RpY2UgQjEuMSBwcm9iIiBiYWNrZ3JvdW5kPSJQcmFjdGljZSBCMS4xIGJhY2siIGdvYWxzPSJQcmFjdGljZSBCMS4xIGdvYWwiIGFwcGxpY2F0aW9uPSJQcmFjdGljZSBCMS4xIGFwcCIgbGV2ZWxzT2ZBZG9wdGlvbj0iUHJhY3RpY2UgQjEuMSBsZXZlbCI+Ci08L1ByYWN0aWNlRGVzY3JpcHRpb24+Ci08L1ByYWN0aWNlPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9hcnRpZmFjdF9CMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL0Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL0RvbWFpbnMvZG9tYWluX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cy9yb2xlX3NldF9CMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvVG9vbHMvdG9vbF9CMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZGVsaXZlcmFibGVfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvb3V0Y29tZV9CMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9wcmFjdGljZV9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXBvcnRfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9hZG1hcF9CMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yb2xlX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90ZW1wbGF0ZV9CMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90b29sbWVudG9yX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IxLjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTwvUHJhY3RpY2U+Ci08UHJhY3RpY2UgbmFtZT0icHJhY3RpY2VfQjIiIGJyaWVmRGVzY3JpcHRpb249IlByYWN0aWNlIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJQcmFjdGljZSBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxQcmFjdGljZURlc2NyaXB0aW9uIG5hbWU9InByYWN0aWNlX0IyLF80aTFmRUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjo0MDo1MCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUHJhY3RpY2UgQjIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiIgYWRkaXRpb25hbEluZm89IlByYWN0aWNlIEIyIGFkZCIgcHJvYmxlbT0iUHJhY3RpY2UgQjIgcHJvYiIgYmFja2dyb3VuZD0iUHJhY3RpY2UgQjIgYmFjayIgZ29hbHM9IlByYWN0aWNlIEIyIGdvYWwiIGFwcGxpY2F0aW9uPSJQcmFjdGljZSZhbXA7bmJzcDsgYXBwIiBsZXZlbHNPZkFkb3B0aW9uPSJQcmFjdGljZSBCMiBsZXZlbCI+Ci08L1ByYWN0aWNlRGVzY3JpcHRpb24+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2FydGlmYWN0X0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2RlbGl2ZXJhYmxlX0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL291dGNvbWVfQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcHJhY3RpY2VfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcHJhY3RpY2VfQjEvcHJhY3RpY2VfQjEuMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXBvcnRfQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9hZG1hcF9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yb2xlX0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90ZW1wbGF0ZV9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90b29sbWVudG9yX0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9Eb21haW5zL2RvbWFpbl9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvUm9sZVNldHMvcm9sZV9zZXRfQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1Rvb2xzL3Rvb2xfQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1dQIFR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08L1ByYWN0aWNlPgotPFJlcG9ydCBuYW1lPSJyZXBvcnRfQjEiIGJyaWVmRGVzY3JpcHRpb249IlJlcG9ydCBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUmVwb3J0IEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyZXBvcnRfQjEsXzVramF3QjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjM4OjM4IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSZXBvcnQgQjEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvUmVwb3J0PgotPFJlcG9ydCBuYW1lPSJyZXBvcnRfQjIiIGJyaWVmRGVzY3JpcHRpb249IlJlcG9ydCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUmVwb3J0IEIyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyZXBvcnRfQjIsXzZPdVpJQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjM5OjA3IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSZXBvcnQgQjIgY29udGV4dCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvUmVwb3J0PgotPFJldXNhYmxlQXNzZXQgbmFtZT0icmV1c2FibGVfYXNzZXRfQjEiIGJyaWVmRGVzY3JpcHRpb249IlJldXNhYmxlIEFzc2V0IEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSZXVzYWJsZSBBc3NldCBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icmV1c2FibGVfYXNzZXRfQjEsXzY3azRFQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjQ2OjE5IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSZXVzYWJsZSBBc3NldCBCMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9SZXVzYWJsZUFzc2V0PgotPFJldXNhYmxlQXNzZXQgbmFtZT0icmV1c2FibGVfYXNzZXRfQjIiIGJyaWVmRGVzY3JpcHRpb249IlJldXNhYmxlIEFzc2V0IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSZXVzYWJsZSBBc3NldCBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icmV1c2FibGVfYXNzZXRfQjIsXzd4T0dvQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjQwOjAwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSZXVzYWJsZSBBc3NldCBCMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9SZXVzYWJsZUFzc2V0PgotPFJvYWRtYXAgbmFtZT0icm9hZG1hcF9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9hZG1hcCBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9hZG1hcCBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icm9hZG1hcF9CMSxfOGhXakVCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6MzY6MDIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJvYWRtYXAgQjEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvUm9hZG1hcD4KLTxSb2FkbWFwIG5hbWU9InJvYWRtYXBfQjIiIGJyaWVmRGVzY3JpcHRpb249IlJvYWRtYXAgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvYWRtYXAgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvYWRtYXBfQjIsXy1nd1BBQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjM1OjM1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSb2FkbWFwIEIyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1JvYWRtYXA+Ci08U3VwcG9ydGluZ01hdGVyaWFsIG5hbWU9InN1cHBvcnRpbmdfbWF0ZXJpYWxfQjEiIGJyaWVmRGVzY3JpcHRpb249IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InN1cHBvcnRpbmdfbWF0ZXJpYWxfQjEsX19iS28wQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjQ1OjMxIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEIxIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1N1cHBvcnRpbmdNYXRlcmlhbD4KLTxTdXBwb3J0aW5nTWF0ZXJpYWwgbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3VwcG9ydGluZyBNYXRlcmlhbCBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9CMixfQk41eHdCOHNFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6NDQ6NTIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQjIgQ29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvU3VwcG9ydGluZ01hdGVyaWFsPgotPFRlbXBsYXRlIG5hbWU9InRlbXBsYXRlX0IxIiBicmllZkRlc2NyaXB0aW9uPSJUZW1wbGF0ZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGVtcGxhdGUgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08R3VpZGFuY2VEZXNjcmlwdGlvbiBuYW1lPSJ0ZW1wbGF0ZV9CMSxfQzkwUU1COHNFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6MzY6NTEgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRlbXBsYXRlIEIxIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGF0dGFjaG1lbnRzPSIiPgotPC9HdWlkYW5jZURlc2NyaXB0aW9uPgotPC9UZW1wbGF0ZT4KLTxUZW1wbGF0ZSBuYW1lPSJ0ZW1wbGF0ZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iVGVtcGxhdGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRlbXBsYXRlIEIyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEd1aWRhbmNlRGVzY3JpcHRpb24gbmFtZT0idGVtcGxhdGVfQjIsX0QteDk4QjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjI0OjU0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUZW1wbGF0ZSBCMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhdHRhY2htZW50cz0icmVzb3VyY2VzL1RlbXBsYXRlIGZvciBQYXN0ZSBUZXN0IENhc2VzLmRvYyI+Ci08L0d1aWRhbmNlRGVzY3JpcHRpb24+Ci08L1RlbXBsYXRlPgotPFRlcm1EZWZpbml0aW9uIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUZXJtIERlZmluaXRpb24gQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9CMSxfRXBzak1COHNFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6MjM6NTUgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRlcm0gRGVmaW5pdGlvbiBCMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9UZXJtRGVmaW5pdGlvbj4KLTxUZXJtRGVmaW5pdGlvbiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQjIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGVybSBEZWZpbml0aW9uIEIyIGJyaWVmIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0idGVybV9kZWZpbml0aW9uX0IyLF9HRVM0OEI4c0VkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjoyMzoxMCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUZXJtIERlZmluaXRpb24gQjIgY29udGVudCYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9UZXJtRGVmaW5pdGlvbj4KLTxUb29sTWVudG9yIG5hbWU9InRvb2xtZW50b3JfQjEiIGJyaWVmRGVzY3JpcHRpb249IlRvb2xtZW50byBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVG9vbG1lbnRvciBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0idG9vbG1lbnRvcl9CMSxfR29EdFVCOHNFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6MjA6MzQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRvb2xtZW50b3IgQjEgY29udGV4dCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvVG9vbE1lbnRvcj4KLTxUb29sTWVudG9yIG5hbWU9InRvb2xtZW50b3JfQjIiIGJyaWVmRGVzY3JpcHRpb249IlRvb2xtZW50b3IgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2xtZW50b3IgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRvb2xtZW50b3JfQjIsX0g0T1VzQjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjE5OjQ0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEIyIGNvbnRleHQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1Rvb2xNZW50b3I+Ci08V2hpdGVwYXBlciBuYW1lPSJ3aGl0ZXBhcGVyX0IxIiBicmllZkRlc2NyaXB0aW9uPSJXaGl0ZXBhcGVyIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJXaGl0ZXBhcGVyIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ3aGl0ZXBhcGVyX0IxLF9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjoxOTowNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBCMSBjb250ZXh0IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9XaGl0ZXBhcGVyPgotPFdoaXRlcGFwZXIgbmFtZT0id2hpdGVwYXBlcl9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBCMiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iV2hpdGVwYXBlciBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0id2hpdGVwYXBlcl9CMixfSmR0RXdCOHNFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6MTg6MzYgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQjIgY29udGV4dCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvV2hpdGVwYXBlcj4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iY2FwUGF0UGFrX0IxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19CMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iY2FwUGF0UGFrX0IxLjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0IxL2NhcFBhdFBha19CMS4xIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9ImNhcFBhdF9CMS4xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEvY2FwUGF0UGFrX0IxLjEvY2FwUGF0X0IxLjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPENhcGFiaWxpdHlQYXR0ZXJuIG5hbWU9ImNhcFBhdF9CMS4xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9ImNhcFBhdF9CMS4xIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPFByb2Nlc3NEZXNjcmlwdGlvbiBuYW1lPSJjYXBQYXRfQjEuMSxfSVBkWjRSODFFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiIGV4dGVybmFsSWQ9IiIgc2NvcGU9IiIgdXNhZ2VOb3Rlcz0iIj4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEvY2FwUGF0UGFrX0IxLjEvY2FwUGF0X0IxLjEvY2FwUGF0X0IxLjEiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9ImNhcFBhdF9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0IxL2NhcFBhdF9CMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Q2FwYWJpbGl0eVBhdHRlcm4gbmFtZT0iY2FwUGF0X0IxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9ImNhcFBhdF9CMSIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iY2FwUGF0X0IxLF9FNkV5Y1I4MUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiIgZXh0ZXJuYWxJZD0iIiBzY29wZT0iIiB1c2FnZU5vdGVzPSIiPgotPC9Qcm9jZXNzRGVzY3JpcHRpb24+Ci08ZGVmYXVsdENvbnRleHQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19CMS9jYXBQYXRfQjEvY2FwUGF0X0IxIj4KLTwvZGVmYXVsdENvbnRleHQ+Ci08dmFsaWRDb250ZXh0IHBhdGg9IkNvbmZpZyBBIj4KLTwvdmFsaWRDb250ZXh0PgotPC9DYXBhYmlsaXR5UGF0dGVybj4KLTwvUHJvY2Vzc0NvbXBvbmVudD4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJDUCBCMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IkFjdDEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08QWN0aXZpdHkgbmFtZT0iQWN0MSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBY3QxIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iQWN0MSxfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcHVycG9zZT0iIiBhbHRlcm5hdGl2ZXM9IiIgaG93dG9TdGFmZj0iIj4KLTwvQWN0aXZpdHlEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvQWN0MSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS90YXNrX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvcm9sZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS90YXNrX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS90YXNrX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTwvQWN0aXZpdHk+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFza19BMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFza19BMSxfNTY3WVNVQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3Rhc2tfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS90YXNrX0ExIj4KLTwvVGFzaz4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0EyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9BMSI+Ci08L21hbmRhdG9yeUlucHV0PgotPG9wdGlvbmFsSW5wdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQTEiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0ExIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3Rhc2tfQTEiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMSIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0ExLF81NjdZU0VBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvcm9sZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQTEiPgotPC9Sb2xlPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQTEiPgotPC9tb2RpZmllcz4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9BMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2RlbGl2ZXJhYmxlX0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9BMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEEyICIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0EyLF81NjdZbVVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvcm9sZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQTIiPgotPC9Sb2xlPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQTIiPgotPC9tb2RpZmllcz4KLTwvUm9sZURlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsXzU2N1lvVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTEsXzU2N1lua0E1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImRlbGl2ZXJhYmxlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTEsXzU2N1ltRUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF81NjdZbjBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMSxfNTY3WW5FQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xLF81NjdZa2tBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMSxfNTY3WVFVQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFza19CMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBCMSBwcmVzbmV0IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFza19CMSxfNTY3WVIwQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3Rhc2tfQjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS90YXNrX0IxIj4KLTwvVGFzaz4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0IyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQjEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9CMSI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS90YXNrX0IxIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMS90YXNrX0IxLF9YVTZMVUI4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjEuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMS90YXNrX0IxLF9YVTZMVUI4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjEuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMS90YXNrX0IxLF9YVTZMVUI4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjEuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQjEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0IxLF81NjdZazBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvcm9sZV9CMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQjEiPgotPC9Sb2xlPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQjEiPgotPC9tb2RpZmllcz4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0IyLF81NjdZbDBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvcm9sZV9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQjIiPgotPC9Sb2xlPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQjIiPgotPC9tb2RpZmllcz4KLTwvUm9sZURlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0IxIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQjEsXzU2N1luVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImRlbGl2ZXJhYmxlX0IxIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQjEsXzU2N1lvRUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9CMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9CMSI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQjEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9CMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0IxLF81NjdZbFVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9CMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQjEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9CMSxfNTY3WVMwQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0IxIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQjEsXzU2N1lURUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQjIiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQjIsXzU2N1lSRUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS90YXNrX0IyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19CMiI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvcm9sZV9CMSI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0IyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9CMiI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQjIiPgotPC9vdXRwdXQ+Ci08cGVyZm9ybWVkUHJpbWFyaWx5QnkgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19CMiI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjIvdGFza19CMixfWkxPTXNCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIyLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjIvdGFza19CMixfWkxPTXNCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIyLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjIvdGFza19CMixfWkxPTXNCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIyLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQjIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9CMixfNTY3WVFrQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0IyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9CMixfNTY3WWxFQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2RlbGl2ZXJhYmxlX0IyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2RlbGl2ZXJhYmxlX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0IyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0IyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQjIsXzU2N1lsa0E1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IyLF81NjdZbWtBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMixfNTY3WWtVQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFza19BMiIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMiAiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0EyLF81NjdZUmtBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3Rhc2tfQTIiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQTEiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9BMiI+Ci08L21hbmRhdG9yeUlucHV0PgotPG9wdGlvbmFsSW5wdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQTIiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0EyIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3Rhc2tfQTIiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyL3Rhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMi4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyL3Rhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMi4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyL3Rhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMi4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsXzU2N1lrRUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImRlbGl2ZXJhYmxlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTIsXzU2N1ltMEE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9BMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9BMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0EyLF81NjdZajBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfNTY3WVNrQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTIsXzU2N1lSVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJXb3JrZmxvdyI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+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+Ci08L0dyYXBoTm9kZT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iV29yayBQcm9kdWN0IERlcGVuZGVuY3kiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+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+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+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvRGlhZ3JhbT4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvRGlhZ3JhbT4KLTxDYXBhYmlsaXR5UGF0dGVybiBuYW1lPSJDUCBCMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDUCBCMSIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iQ1AgQTEsX2RCaHZrVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcHVycG9zZT0iIiBhbHRlcm5hdGl2ZXM9IiIgaG93dG9TdGFmZj0iIiBleHRlcm5hbElkPSIiIHNjb3BlPSIiIHVzYWdlTm90ZXM9IiI+Ci08L1Byb2Nlc3NEZXNjcmlwdGlvbj4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9BY3QxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08ZGVmYXVsdENvbnRleHQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0NQIEIxIj4KLTwvZGVmYXVsdENvbnRleHQ+Ci08dmFsaWRDb250ZXh0IHBhdGg9IkNvbmZpZyBBIj4KLTwvdmFsaWRDb250ZXh0PgotPC9DYXBhYmlsaXR5UGF0dGVybj4KLTwvUHJvY2Vzc0NvbXBvbmVudD4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9ImRlbFByb2NQYWtfQjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEIvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1Bha19CMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iZGVsUHJvY1Bha19CMS4xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEvZGVsUHJvY1Bha19CMS4xIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9ImRlbFByb2NfQjEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEIvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1Bha19CMS9kZWxQcm9jUGFrX0IxLjEvZGVsUHJvY19CMS4xIj4KLTwvcGFyZW50UGFja2FnZT4KLTxEZWxpdmVyeVByb2Nlc3MgbmFtZT0iZGVsUHJvY19CMS4xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9ImRlbFByb2NfQjEuMSIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBuYW1lPSJkZWxQcm9jX0IxLjEsX1YwVjdNUjgxRWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcHVycG9zZT0iIiBhbHRlcm5hdGl2ZXM9IiIgaG93dG9TdGFmZj0iIiBleHRlcm5hbElkPSIiIHNjb3BlPSIiIHVzYWdlTm90ZXM9IiIgc2NhbGU9IiIgcHJvamVjdENoYXJhY3RlcmlzdGljcz0iIiByaXNrTGV2ZWw9IiIgZXN0aW1hdGluZ1RlY2huaXF1ZT0iIiBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPSIiIHR5cGVPZkNvbnRyYWN0PSIiPgotPC9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbj4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEIvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1Bha19CMS9kZWxQcm9jUGFrX0IxLjEvZGVsUHJvY19CMS4xL2RlbFByb2NfQjEuMSI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvRGVsaXZlcnlQcm9jZXNzPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9ImRlbFByb2NfQjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEvZGVsUHJvY19CMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08RGVsaXZlcnlQcm9jZXNzIG5hbWU9ImRlbFByb2NfQjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iZGVsUHJvY19CMSIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBuYW1lPSJkZWxQcm9jX0IxLF9SZnh1c1I4MUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiIgZXh0ZXJuYWxJZD0iIiBzY29wZT0iIiB1c2FnZU5vdGVzPSIiIHNjYWxlPSIiIHByb2plY3RDaGFyYWN0ZXJpc3RpY3M9IiIgcmlza0xldmVsPSIiIGVzdGltYXRpbmdUZWNobmlxdWU9IiIgcHJvamVjdE1lbWJlckV4cGVydGlzZT0iIiB0eXBlT2ZDb250cmFjdD0iIj4KLTwvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24+Ci08ZGVmYXVsdENvbnRleHQgcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEvZGVsUHJvY19CMS9kZWxQcm9jX0IxIj4KLTwvZGVmYXVsdENvbnRleHQ+Ci08dmFsaWRDb250ZXh0IHBhdGg9IkNvbmZpZyBBIj4KLTwvdmFsaWRDb250ZXh0PgotPC9EZWxpdmVyeVByb2Nlc3M+Ci08L1Byb2Nlc3NDb21wb25lbnQ+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08YmFzZXMgcGF0aD0iUGx1ZyBBIj4KLTwvYmFzZXM+Ci08L01ldGhvZFBsdWdpbj4KLTxNZXRob2RDb25maWd1cmF0aW9uIG5hbWU9IkNvbmZpZyBBIiBicmllZkRlc2NyaXB0aW9uPSJDb25maWcgQSBkZXNjcmlwdGlvbiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCI+Ci08bWV0aG9kUGx1Z2luU2VsZWN0aW9uIHBhdGg9IlBsdWcgQSI+Ci08L21ldGhvZFBsdWdpblNlbGVjdGlvbj4KLTxtZXRob2RQbHVnaW5TZWxlY3Rpb24gcGF0aD0iUGx1ZyBCIj4KLTwvbWV0aG9kUGx1Z2luU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOy9DUDEgd2l0aCBhbGwgZWxlbWVudHMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrIEExIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrIEExL2RlbFByb2NQYWtfQTEuMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY19BMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudCI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudCI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19CMS9jYXBQYXRQYWtfQjEuMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0IxL2NhcFBhdFBha19CMS4xL2NhcFBhdF9CMS4xIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEvY2FwUGF0X0IxIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvRGVsaXZlcnlQcm9jZXNzZXMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEvZGVsUHJvY1Bha19CMS4xIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrX0IxL2RlbFByb2NQYWtfQjEuMS9kZWxQcm9jX0IxLjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEvZGVsUHJvY19CMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1Rvb2xzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9XUCBUeXBlcyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0Rpc2NpcGxpbmVzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvSGlkZGVuIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvUm9sZVNldHMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Eb21haW5zIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL0Rpc2NpcGxpbmVzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvVG9vbHMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9Eb21haW5zIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvSGlkZGVuIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvUm9sZVNldHMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPHByb2Nlc3NWaWV3cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0ExIj4KLTwvcHJvY2Vzc1ZpZXdzPgotPC9NZXRob2RDb25maWd1cmF0aW9uPgotPE1ldGhvZENvbmZpZ3VyYXRpb24gbmFtZT0iQ29uZmlnIEIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCI+Ci08bWV0aG9kUGx1Z2luU2VsZWN0aW9uIHBhdGg9IlBsdWcgQiI+Ci08L21ldGhvZFBsdWdpblNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50Ij4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50Ij4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19CMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0IxL2NhcFBhdFBha19CMS4xIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEvY2FwUGF0UGFrX0IxLjEvY2FwUGF0X0IxLjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19CMS9jYXBQYXRfQjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9EZWxpdmVyeVByb2Nlc3NlcyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1Bha19CMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1Bha19CMS9kZWxQcm9jUGFrX0IxLjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEvZGVsUHJvY1Bha19CMS4xL2RlbFByb2NfQjEuMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1Bha19CMS9kZWxQcm9jX0IxIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxwcm9jZXNzVmlld3MgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMSI+Ci08L3Byb2Nlc3NWaWV3cz4KLTwvTWV0aG9kQ29uZmlndXJhdGlvbj4KLTwvTWV0aG9kTGlicmFyeT4KLTxNZXRob2RQbHVnaW4gbmFtZT0iUGx1ZyBBIiBicmllZkRlc2NyaXB0aW9uPSJQbHVnIEEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IlBsdWcgQSBBcnRodXIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgdXNlckNoYW5nZWFibGU9InRydWUiPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IkNvbnRlbnQiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iQ2F0ZWdvcmllcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IkRvbWFpbnMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0RvbWFpbnMiPgotPC9wYXJlbnRQYWNrYWdlPgotPERvbWFpbiBuYW1lPSJkb21haW5fQTEiIGJyaWVmRGVzY3JpcHRpb249IkRvbWFpbiBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRG9tYWluIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJkb21haW5fQTEsX0ZFek80QS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE5OjE1OjM1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIERvbWFpbiBBMSBtYWluJiMxMzsmIzEwOyZsdDsvcCZndDsiIGtleUNvbnNpZGVyYXRpb25zPSJEb21haW4gQTEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvd29ya1Byb2R1Y3RzPgotPERvbWFpbiBuYW1lPSJzdWJfZG9tYWluX0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yi1Eb21haW4gQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViLURvbWFpbiBBMS4xIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJzdWJfZG9tYWluX0ExLjEsX0dPWjdRQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE3OjQ2OjUzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJTdWItRG9tYWluIEExLjEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlN1Yi1Eb21haW4gQTEuMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTwvRG9tYWluPgotPC9Eb21haW4+Ci08RG9tYWluIG5hbWU9ImRvbWFpbl9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRG9tYWluIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEb21haW4gQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImRvbWFpbl9BMixfRnFXTDhBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTc6NDc6MjggUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRvbWFpbiBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRG9tYWluIEEyIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIvYXJ0aWZhY3RfQTIuMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTIiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPC9Eb21haW4+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IkRpc2NpcGxpbmVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08RGlzY2lwbGluZUdyb3VwaW5nIG5hbWU9ImRpc2NpcGxpbmVfZ3JvdXBpbmdfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgR3JvdXBpbmcgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRpc2NpcGxpbmUgR3JvdXBpbmcgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImRpc2NpcGxpbmVfZ3JvdXBpbmdfQTEsX0NDVmpjQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE3OjQyOjM3IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxkaXNjaXBsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTEiPgotPC9kaXNjaXBsaW5lcz4KLTwvRGlzY2lwbGluZUdyb3VwaW5nPgotPERpc2NpcGxpbmUgbmFtZT0iZGlzY2lwbGluZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGlzY2lwbGluZSBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZGlzY2lwbGluZV9BMSxfQzVkX3dBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9Ik1vbiBBdWcgMjIgMTA6NDU6MDIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkRpc2NpcGxpbmUgQTEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHRhc2tzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExIj4KLTwvdGFza3M+Ci08L0Rpc2NpcGxpbmU+Ci08RGlzY2lwbGluZSBuYW1lPSJkaXNjaXBsaW5lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJkaXNjaXBsaW5lX0EyLF9EenZQb0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo0NDoxNCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGlzY2lwbGluZSBBMiBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08dGFza3MgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIiPgotPC90YXNrcz4KLTwvRGlzY2lwbGluZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iUm9sZVNldHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxSb2xlU2V0R3JvdXBpbmcgbmFtZT0icm9sZV9zZXRfZ3JvdXBpbmdfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgU2V0IEdyb3VwaW5nIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIFNldCBHcm91cGluZyBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icm9sZV9zZXRfZ3JvdXBpbmdfQTEsX0pZbjBnQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE3OjQ5OjMxIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSb2xlIFNldCBHcm91cGluZyBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBTZXQgR3JvdXBpbmcgQTEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHJvbGVTZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvUm9sZVNldHMvcm9sZV9zZXRfQTEiPgotPC9yb2xlU2V0cz4KLTwvUm9sZVNldEdyb3VwaW5nPgotPFJvbGVTZXQgbmFtZT0icm9sZV9zZXRfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgU2V0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIFNldCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icm9sZV9zZXRfQTEsXzlQcDFVQkJLRWRxQnM3S2hkVkxSTEEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJNb24gQXVnIDIyIDEwOjQ3OjIzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSb2xlIFNldCBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBTZXQgQTExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTxyb2xlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMSI+Ci08L3JvbGVzPgotPC9Sb2xlU2V0PgotPFJvbGVTZXQgbmFtZT0icm9sZV9zZXRfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgU2V0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIFNldCBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icm9sZV9zZXRfQTIsXy11YmdjQkJLRWRxQnM3S2hkVkxSTEEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE3OjUwOjQwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSb2xlIFNldCBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBTZXQgQTIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHJvbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0EyIj4KLTwvcm9sZXM+Ci08L1JvbGVTZXQ+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IldQIFR5cGVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9XUCBUeXBlcyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08V29ya1Byb2R1Y3RUeXBlIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJXb3JrIFByb2R1Y3QgVHlwZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iV29yayBQcm9kdWN0IFR5cGUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0ExLF9IZ2hEWUEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxODowMjo0NCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iV29yayBQcm9kdWN0IFR5cGUgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IldvcmsgUHJvZHVjdCBUeXBlIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9kZWxpdmVyYWJsZV9BMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTEiPgotPC93b3JrUHJvZHVjdHM+Ci08L1dvcmtQcm9kdWN0VHlwZT4KLTxXb3JrUHJvZHVjdFR5cGUgbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IldvcmsgUHJvZHVjdCBUeXBlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJXb3JrIFByb2R1Y3QgVHlwZSBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQTIsX0lGblVnQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE4OjAzOjE2IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJXb3JrIFByb2R1Y3QgVHlwZSBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iV29yayBQcm9kdWN0IFR5cGUgQTEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMi9hcnRpZmFjdF9BMi4xIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTIiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPC9Xb3JrUHJvZHVjdFR5cGU+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IlRvb2xzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Ub29scyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08VG9vbCBuYW1lPSJ0b29sX0ExIiBicmllZkRlc2NyaXB0aW9uPSJUb29sIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUb29sIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0b29sX0ExLF9LeGJhZ0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo1MjowNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVG9vbCBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iVG9vbCBBMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTEiPgotPC90b29sTWVudG9ycz4KLTwvVG9vbD4KLTxUb29sIG5hbWU9InRvb2xfQTIiIGJyaWVmRGVzY3JpcHRpb249IlRvb2wgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2wgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRvb2xfQTIsX0xoYUY4QS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE3OjUyOjM0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUb29sIEEyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJUb29sIEEyIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMiI+Ci08L3Rvb2xNZW50b3JzPgotPC9Ub29sPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1N0YW5kYXJkQ2F0ZWdvcmllcyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IkhpZGRlbiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9IaWRkZW4iPgotPC9wYXJlbnRQYWNrYWdlPgotPEN1c3RvbUNhdGVnb3J5IG5hbWU9IkN1c3RvbSBDYXRlZ29yaWVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9IkN1c3RvbSBDYXRlZ29yaWVzLF95VWVMS3ctUEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9BMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08L0N1c3RvbUNhdGVnb3J5PgotPC9Db250ZW50UGFja2FnZT4KLTxDdXN0b21DYXRlZ29yeSBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQTEiIGJyaWVmRGVzY3JpcHRpb249IkN1c3RvbSBDYXRlZ29yeSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ3VzdG9tIENhdGVnb3J5IEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQTEsX01LUG5rQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE3OjUzOjE1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkN1c3RvbSBDYXRlZ29yeSBBMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvc3ViX2N1c3RvbV9jYXRlZ29yeV9BMS4xIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvQ1AxIHdpdGggYWxsIGVsZW1lbnRzIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9DUCBBMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7Ij4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrIEExL2RlbFByb2NQYWtfQTEuMS9kZWxQcm9jUGFrX0ExLjEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPC9DdXN0b21DYXRlZ29yeT4KLTxDdXN0b21DYXRlZ29yeSBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQTIiIGJyaWVmRGVzY3JpcHRpb249IkN1c3RvbSBDYXRlZ29yeSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ3VzdG9tIENhdGVnb3J5IEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQTIsX09TU1NJQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE4OjAyOjA3IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkN1c3RvbSBDYXRlZ29yeSBBMiBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyL2FydGlmYWN0X0EyLjEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0EyIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTwvQ3VzdG9tQ2F0ZWdvcnk+Ci08Q3VzdG9tQ2F0ZWdvcnkgbmFtZT0ic3ViX2N1c3RvbV9jYXRlZ29yeV9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWItQ3VzdG9tIENhdGVnb3J5IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yi1DdXN0b20gQ2F0ZWdvcnkgQTEuMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0ic3ViX2N1c3RvbV9jYXRlZ29yeV9BMS4xLF83ZFhZVUJCS0VkcUJzN0toZFZMUkxBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxODowMToyNiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iU3ViLUN1c3RvbSBDYXRlZ29yeSBBMS4xIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJTdWItQ3VzdG9tIENhdGVnb3J5IEExLjEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTwvQ3VzdG9tQ2F0ZWdvcnk+Ci08L0NvbnRlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJDb3JlQ29udGVudCIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50Ij4KLTwvcGFyZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJjb250ZW50X3BhY2thZ2VfQTEiIGJyaWVmRGVzY3JpcHRpb249IkNvblBhayBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiPgotPC9wYXJlbnRQYWNrYWdlPgotPFJvbGUgbmFtZT0icm9sZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMSIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Um9sZURlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTEsXzU1emswQS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgT2N0IDE4IDE2OjA0OjEwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSb2xlIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJSb2xlIEExIGtleSIgc2tpbGxzPSJSb2xlIEExIHNraWxscyIgYXNzaWdubWVudEFwcHJvYWNoZXM9IlJvbGUgQTEgYXNzaWduIiBzeW5vbnltcz0iUm9sZSBBMSBzeW4iPgotPC9Sb2xlRGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTEiPgotPC9tb2RpZmllcz4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPC9Sb2xlPgotPFJvbGUgbmFtZT0icm9sZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiBleHRlbmRlZCBieSBSb2xlIEEzIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxSb2xlRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMixfNmszVUFBLVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IldlZCBPY3QgMTkgMTA6MzI6MzUgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJvbGUgQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgQTIga2V5IiBza2lsbHM9IlJvbGUgQTIgc2tpbGxzIiBhc3NpZ25tZW50QXBwcm9hY2hlcz0iUm9sZSBBMiBhc3NpZ24iIHN5bm9ueW1zPSJSb2xlIEEyIHN5biI+Ci08L1JvbGVEZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9kZWxpdmVyYWJsZV9BMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGU+Ci08VGFzayBuYW1lPSJ0YXNrX0ExIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEExICIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08VGFza0Rlc2NyaXB0aW9uIG5hbWU9InRhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgT2N0IDE5IDEwOjI4OjM5IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUYXNrIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJUYXNrIEExIGtleSIgcHVycG9zZT0iVGFzayBBMSBwdXJwb3NlIiBhbHRlcm5hdGl2ZXM9IlRhc2sgQTEgYWx0Ij4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249ImFscGhhIj4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQTEuMiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249ImJldGEiPgotPC9TZWN0aW9uPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMS4zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iZ2FtbWEiPgotPC9TZWN0aW9uPgotPC9UYXNrRGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08cGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEiPgotPC9wZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTEiPgotPC9vdXRwdXQ+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9kZWxpdmVyYWJsZV9BMSI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjEiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMiI+Ci08L3N0ZXBzPgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4zIj4KLTwvc3RlcHM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTEiPgotPC90b29sTWVudG9ycz4KLTwvVGFzaz4KLTxUYXNrIG5hbWU9InRhc2tfQTIiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTIgKCBleHRlbmRlZCBieSBUYXNrIEEzICkiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFRhc2tEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iV2VkIE9jdCAxOSAxMDoyOToyMiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGFzayBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iVGFzayBBMiBrZXkiIHB1cnBvc2U9IlRhc2sgQTIgcHVycG9zZSIgYWx0ZXJuYXRpdmVzPSJUYXNrIEEyIGFsdCI+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEEyLjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHB1dCB5b3VyIHJpZ2h0IGZvb3QgaW4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L1NlY3Rpb24+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEEyLjIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJwdXQgeW91ciByaWdodCBmb290IG91dCI+Ci08L1NlY3Rpb24+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEEyLjMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJEbyB0aGUgaG9rZXktcG9rZXkiPgotPC9TZWN0aW9uPgotPC9UYXNrRGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08cGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIiPgotPC9wZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTIiPgotPC9vdXRwdXQ+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTEiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9kZWxpdmVyYWJsZV9BMiI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjEiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMiI+Ci08L3N0ZXBzPgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyL3Rhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMi4zIj4KLTwvc3RlcHM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC90b29sTWVudG9ycz4KLTwvVGFzaz4KLTxBcnRpZmFjdCBuYW1lPSJhcnRpZmFjdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFydGlmYWN0RGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTEgeCxfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IldlZCBTZXAgMDcgMTQ6NTI6NDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkFydGlmYWN0IEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJBcnRpZmFjdCBBMSBrZXkiIGV4dGVybmFsSWQ9IkFydGlmYWN0IEExIHVuaXF1ZSIgcHVycG9zZT0iQXJ0aWZhY3QgQTEgcHVycG9zZSIgaW1wYWN0T2ZOb3RIYXZpbmc9IkFydGlmYWN0IEExIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9IkFydGlmYWN0IEExIHJlYXNvbiIgYnJpZWZPdXRsaW5lPSJBcnRpZmFjdCBBMSBicmllZiIgcmVwcmVzZW50YXRpb25PcHRpb25zPSJBcnRpZmFjdCBBMSByZXAiPgotPC9BcnRpZmFjdERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMSI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMSI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMSI+Ci08L3Rvb2xNZW50b3JzPgotPEFydGlmYWN0IG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08QXJ0aWZhY3REZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfRjUxeXdBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTg6MDQ6MTkgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJTdWJfQXJ0aWZhY3QgQTEuMSBrZXkiIGV4dGVybmFsSWQ9IlN1Yl9BcnRpZmFjdCBBMS4xIHVuaXF1ZSIgcHVycG9zZT0iU3ViX0FydGlmYWN0IEExLjEgcHVycG9zZSIgaW1wYWN0T2ZOb3RIYXZpbmc9IkFydGlmYWN0IEExLjEgaW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iQXJ0aWZhY3QgQTEuMSByZWFzb24iIGJyaWVmT3V0bGluZT0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHJlcHJlc2VudGF0aW9uT3B0aW9ucz0iU3ViX0FydGlmYWN0IEExLjEgcmVwIj4KLTwvQXJ0aWZhY3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTEiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTEiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTEiPgotPC90b29sTWVudG9ycz4KLTxjb250YWluZXJBcnRpZmFjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9jb250YWluZXJBcnRpZmFjdD4KLTwvQXJ0aWZhY3Q+Ci08L0FydGlmYWN0PgotPEFydGlmYWN0IG5hbWU9ImFydGlmYWN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08QXJ0aWZhY3REZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IldlZCBBdWcgMTcgMTk6NDE6MjQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJBcnRpZmFjdCBBMiBrZXkiIGV4dGVybmFsSWQ9IkFydGlmYWN0IEEyIHVuaXF1ZSIgcHVycG9zZT0iQXJ0aWZhY3QgQTIgcHVycG9zZSIgaW1wYWN0T2ZOb3RIYXZpbmc9IkFydGlmYWN0IEEyIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9IkFydGlmYWN0IEEyIHJlYXNvbiIgYnJpZWZPdXRsaW5lPSJBcnRpZmFjdCBBMiBicmllZiIgcmVwcmVzZW50YXRpb25PcHRpb25zPSJBcnRpZmFjdCBBMiByZXAiPgotPC9BcnRpZmFjdERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMiI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMiI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMiI+Ci08L3Rvb2xNZW50b3JzPgotPEFydGlmYWN0IG5hbWU9ImFydGlmYWN0X0EyLjEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyLjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08QXJ0aWZhY3REZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMi4xLF9IRU10RUEtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iV2VkIEF1ZyAxNyAxOTo0NDowNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIuMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQXJ0aWZhY3QgQTIuMSBrZXkiIGV4dGVybmFsSWQ9IkFydGlmYWN0IEEyLjEgdW5pcXVlIiBwdXJwb3NlPSJBcnRpZmFjdCBBMi4xIHB1cnBvc2UiIGltcGFjdE9mTm90SGF2aW5nPSJBcnRpZmFjdCBBMi4xIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9IkFydGlmYWN0IEEyLjEgcmVhc29uIiBicmllZk91dGxpbmU9IkFydGlmYWN0IEEyLjEgYnJpZWYiIHJlcHJlc2VudGF0aW9uT3B0aW9ucz0iQXJ0aWZhY3QgQTIuMSByZXAiPgotPC9BcnRpZmFjdERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMiI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMiI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMiI+Ci08L3Rvb2xNZW50b3JzPgotPGNvbnRhaW5lckFydGlmYWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMi9hcnRpZmFjdF9BMi4xIj4KLTwvY29udGFpbmVyQXJ0aWZhY3Q+Ci08L0FydGlmYWN0PgotPC9BcnRpZmFjdD4KLTxEZWxpdmVyYWJsZSBuYW1lPSJkZWxpdmVyYWJsZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTEsX0lJU25VQS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjI5OjU5IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGVsaXZlcmFibGUgQTEga2V5IiBleHRlcm5hbElkPSJEZWxpdmVyYWJsZSBBMSB1bmlxdWUiIHB1cnBvc2U9IkRlbGl2ZXJhYmxlIEExIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iRGVsaXZlcmFibGUgQTEgaW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iRGVsaXZlcmFibGUgQTEgcmVhc29uIiBleHRlcm5hbERlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMSBleHRlcm4iIHBhY2thZ2luZ0d1aWRhbmNlPSJEZWxpdmVyYWJsZSBBMSBwa2ciPgotPC9EZWxpdmVyYWJsZURlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMSI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMSI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMSI+Ci08L3Rvb2xNZW50b3JzPgotPGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEiPgotPC9kZWxpdmVyZWRXb3JrUHJvZHVjdHM+Ci08ZGVsaXZlcmVkV29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L2RlbGl2ZXJlZFdvcmtQcm9kdWN0cz4KLTxkZWxpdmVyZWRXb3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTEiPgotPC9kZWxpdmVyZWRXb3JrUHJvZHVjdHM+Ci08L0RlbGl2ZXJhYmxlPgotPERlbGl2ZXJhYmxlIG5hbWU9ImRlbGl2ZXJhYmxlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08RGVsaXZlcmFibGVEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMixfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MTUgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEEyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEZWxpdmVyYWJsZSBBMiBrZXkiIGV4dGVybmFsSWQ9IkRlbGl2ZXJhYmxlIEEyIHVuaXF1ZSIgcHVycG9zZT0iRGVsaXZlcmFibGUgQTIgcG9ycG9pc2UiIGltcGFjdE9mTm90SGF2aW5nPSJEZWxpdmVyYWJsZSBBMiZhbXA7bmJzcDtpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJEZWxpdmVyYWJsZSBBMiByZWFzb24iIGV4dGVybmFsRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEEyIGV4dGVybiIgcGFja2FnaW5nR3VpZGFuY2U9IkRlbGl2ZXJhYmxlIEEyIHBrZyI+Ci08L0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08cmVwb3J0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmVwb3J0X0EyIj4KLTwvcmVwb3J0cz4KLTx0ZW1wbGF0ZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0EyIj4KLTwvdGVtcGxhdGVzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0EyIj4KLTwvdG9vbE1lbnRvcnM+Ci08ZGVsaXZlcmVkV29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMiI+Ci08L2RlbGl2ZXJlZFdvcmtQcm9kdWN0cz4KLTxkZWxpdmVyZWRXb3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTIiPgotPC9kZWxpdmVyZWRXb3JrUHJvZHVjdHM+Ci08L0RlbGl2ZXJhYmxlPgotPE91dGNvbWUgbmFtZT0ib3V0Y29tZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjE4IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIE91dGNvbWUgQTEgIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJPdXRjb21lIEExIGtleSIgZXh0ZXJuYWxJZD0iT3V0Y29tZSBBMSB1bmlxdWUiIHB1cnBvc2U9Ik91dGNvbWUgQTEgcG9ycG9pc2UiIGltcGFjdE9mTm90SGF2aW5nPSJPdXRjb21lIEExIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9Ik91dGNvbWUgQTEgcmVhc29uIj4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTEiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTEiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTEiPgotPC90b29sTWVudG9ycz4KLTwvT3V0Y29tZT4KLTxPdXRjb21lIG5hbWU9Im91dGNvbWVfQTIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08V29ya1Byb2R1Y3REZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0EyLF9Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDoyMSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iT3V0Y29tZSBBMSBrZXkiIGV4dGVybmFsSWQ9Ik91dGNvbWUgQTEgdW5pcXVlIiBwdXJwb3NlPSJPdXRjb21lIEExIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iT3V0Y29tZSBBMSBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJPdXRjb21lIEExIHJlYXNvbiI+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08cmVwb3J0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmVwb3J0X0EyIj4KLTwvcmVwb3J0cz4KLTx0ZW1wbGF0ZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0EyIj4KLTwvdGVtcGxhdGVzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0EyIj4KLTwvdG9vbE1lbnRvcnM+Ci08L091dGNvbWU+Ci08Q2hlY2tsaXN0IG5hbWU9ImNoZWNrbGlzdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQ2hlY2tsaXN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDaGVja2xpc3QgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImNoZWNrbGlzdF9BMSxfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MzQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkNoZWNrbGlzdCBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9DaGVja2xpc3Q+Ci08Q29uY2VwdCBuYW1lPSJjb25jZXB0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJDb25jZXB0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDb25jZXB0IEExIHByZXNlbnQiIHNoYXBlaWNvbj0iZmlsZTovQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvdHJhbi1sdXUvSUJNL01ldGhvZExpYnJhcmllcy9wYXJpcy9QbHVnJTIwQS9ndWlkYW5jZXMvY29uY2VwdHMvcmVzb3VyY2VzL3R5cmFubm9zYXVydXMuZ2lmIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY29uY2VwdF9BMSxfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MzAgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQ29uY2VwdCBBMSBjb250ZW50JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBGaWxlIGxpbms6JmFtcDtuYnNwOyZsdDthIGhyZWY9JnF1b3Q7ZmlsZTovLy9yZXNvdXJjZXMvY29uY2VwdF9BMS54bWkmcXVvdDsmZ3Q7Y29uY2VwdF9BMS54bWkmbHQ7L2EmZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBVUkw6JmFtcDtuYnNwOyZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5wb3NpdHJvbmdyb3VwLmNvbSZxdW90OyZndDtodHRwOi8vd3d3LnBvc2l0cm9uZ3JvdXAuY29tJmx0Oy9hJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgSW1hZ2U6JmFtcDtuYnNwOyZsdDtpbWcgaGVpZ2h0PSZxdW90OzMyJnF1b3Q7IGFsdD0mcXVvdDtQJnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvdHlyYW5ub3NhdXJ1cy5naWYmcXVvdDsgd2lkdGg9JnF1b3Q7MzImcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEVsZW1lbnQgcGxhaW46JmFtcDtuYnNwOyZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90Oy4vLi4vLi4vLi4vUGx1ZyUyMEEvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQTIsX09WTFZjQS1URWRxTDJPMVBKVjljWkEuaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDtfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSZxdW90OyZndDtDb25jZXB0IEEyIHByZXNlbnQmbHQ7L2EmZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBFbGVtZW50IHdpdGggdHlwZTomYW1wO25ic3A7Jmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmtXaXRoVHlwZSZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDsuLy4uLy4uLy4uL1BsdWclMjBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLF9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBLmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7X09WTFZjQS1URWRxTDJPMVBKVjljWkEmcXVvdDsmZ3Q7Q29uY2VwdDogQ29uY2VwdCBBMiBwcmVzZW50Jmx0Oy9hJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgRWxlbWVudCB3aXRoIHVzZXIgdGV4dDomYW1wO25ic3A7ICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rV2l0aFVzZXJUZXh0JnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90Oy4vLi4vLi4vLi4vUGx1ZyUyMEEvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQTIsX09WTFZjQS1URWRxTDJPMVBKVjljWkEuaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDtfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSZxdW90OyZndDtjb25jZXB0X0EyIHVzZXIgdGV4dCZsdDsvYSZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvQ29uY2VwdD4KLTxFeGFtcGxlIG5hbWU9ImV4YW1wbGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkV4YW1wbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkV4YW1wbGUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImV4YW1wbGVfQTEsX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjM4IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJFeGFtcGxlIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0V4YW1wbGU+Ci08R3VpZGVsaW5lIG5hbWU9Imd1aWRlbGluZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iR3VpZGVsaW5lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJHdWlkZWxpbmUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9Imd1aWRlbGluZV9BMSxfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NDMgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249Ikd1aWRlbGluZSBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9HdWlkZWxpbmU+Ci08UHJhY3RpY2UgbmFtZT0icHJhY3RpY2VfQTEiIGJyaWVmRGVzY3JpcHRpb249IlByYWN0aWNlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJQcmFjdGljZSBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxQcmFjdGljZURlc2NyaXB0aW9uIG5hbWU9InByYWN0aWNlX0ExLF9QOGpZWUEtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMToxOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiIgYWRkaXRpb25hbEluZm89IlByYWN0aWNlIEExIGFkZCIgcHJvYmxlbT0iUHJhY3RpY2UgQTEgcHJvYmxlbSIgYmFja2dyb3VuZD0iUHJhY3RpY2UgQTEgYmFjayIgZ29hbHM9IlByYWN0aWNlIEExIGdvYWwiIGFwcGxpY2F0aW9uPSJQcmFjdGljZSBBMSBhcHAiIGxldmVsc09mQWRvcHRpb249IlByYWN0aWNlIEExIGxldmVsIj4KLTwvUHJhY3RpY2VEZXNjcmlwdGlvbj4KLTxQcmFjdGljZSBuYW1lPSJwcmFjdGljZV9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJQcmFjdGljZSBBMS4xIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFByYWN0aWNlRGVzY3JpcHRpb24gbmFtZT0icHJhY3RpY2VfQTEuMSxfLUZTVWdBLVVFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MjAgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlByYWN0aWNlIEExLjEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiIgYWRkaXRpb25hbEluZm89IlByYWN0aWNlIEExLjEgYWRkIiBwcm9ibGVtPSJQcmFjdGljZSBBMS4xIHByb2JsZW0iIGJhY2tncm91bmQ9IlByYWN0aWNlIEExLjEgYmFjayIgZ29hbHM9IlByYWN0aWNlIEExLjEgZ29hbCIgYXBwbGljYXRpb249IlByYWN0aWNlIEExLjEgYXBwIiBsZXZlbHNPZkFkb3B0aW9uPSJQcmFjdGljZSBBMS4xIGxldmVsIj4KLTwvUHJhY3RpY2VEZXNjcmlwdGlvbj4KLTwvUHJhY3RpY2U+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMvZGlzY2lwbGluZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRG9tYWlucy9kb21haW5fQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzL3JvbGVfc2V0X0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Ub29scy90b29sX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9XUCBUeXBlcy93b3JrX3Byb2R1Y3RfdHlwZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3ByYWN0aWNlX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2FkbWFwX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9kZWxpdmVyYWJsZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9zdWJfY3VzdG9tX2NhdGVnb3J5X0ExLjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfZ3JvdXBpbmdfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0RvbWFpbnMvZG9tYWluX0ExL3N1Yl9kb21haW5fQTEuMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvUm9sZVNldHMvcm9sZV9zZXRfZ3JvdXBpbmdfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTwvUHJhY3RpY2U+Ci08UmVwb3J0IG5hbWU9InJlcG9ydF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iUmVwb3J0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSZXBvcnQgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJlcG9ydF9BMSxfUTVEYzRBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NTEgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJlcG9ydCBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9SZXBvcnQ+Ci08UmV1c2FibGVBc3NldCBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iUmV1c2FibGUgQXNzZXQgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJldXNhYmxlIEFzc2V0IEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMSxfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MjcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJldXNhYmxlIEFzc2V0IEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1JldXNhYmxlQXNzZXQ+Ci08Um9hZG1hcCBuYW1lPSJyb2FkbWFwX0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2FkbWFwIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2FkbWFwIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyb2FkbWFwX0ExLF9aazM5Z0EtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDowNCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9hZG1hcCBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Sb2FkbWFwPgotPFN1cHBvcnRpbmdNYXRlcmlhbCBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0ExIiBicmllZkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0ExLF9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMTowMSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9TdXBwb3J0aW5nTWF0ZXJpYWw+Ci08VGVtcGxhdGUgbmFtZT0idGVtcGxhdGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IlRlbXBsYXRlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUZW1wbGF0ZSBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxHdWlkYW5jZURlc2NyaXB0aW9uIG5hbWU9InRlbXBsYXRlX0ExLF9iRklQVUEtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDo1NiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGVtcGxhdGUgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiIgYXR0YWNobWVudHM9IiI+Ci08L0d1aWRhbmNlRGVzY3JpcHRpb24+Ci08L1RlbXBsYXRlPgotPFRvb2xNZW50b3IgbmFtZT0idG9vbG1lbnRvcl9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iVG9vbG1lbnRvciBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVG9vbG1lbnRvciBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0idG9vbG1lbnRvcl9BMSxfaEhFam9BLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MDUgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRvb2xtZW50b3IgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvVG9vbE1lbnRvcj4KLTxXaGl0ZXBhcGVyIG5hbWU9IndoaXRlcGFwZXJfQTEiIGJyaWVmRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IldoaXRlcGFwZXIgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9IndoaXRlcGFwZXJfQTEsX2g4UkdRQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjEzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJXaGl0ZXBhcGVyIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1doaXRlcGFwZXI+Ci08Q29uY2VwdCBuYW1lPSJjb25jZXB0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJDb25jZXB0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDb25jZXB0IEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJjb25jZXB0X0EyLF9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDoyNCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ29uY2VwdCBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Db25jZXB0PgotPENoZWNrbGlzdCBuYW1lPSJjaGVja2xpc3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkNoZWNrbGlzdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ2hlY2tsaXN0IEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJjaGVja2xpc3RfQTIsX2tyaVRjQS1URWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjM2IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQTIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvQ2hlY2tsaXN0PgotPEV4YW1wbGUgbmFtZT0iZXhhbXBsZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRXhhbXBsZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRXhhbXBsZSBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZXhhbXBsZV9BMixfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NDEgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkV4YW1wbGUgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvRXhhbXBsZT4KLTxHdWlkZWxpbmUgbmFtZT0iZ3VpZGVsaW5lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJHdWlkZWxpbmUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ikd1aWRlbGluZSBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZ3VpZGVsaW5lX0EyLF82WVV3QUEtVEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDo0NSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iR3VpZGVsaW5lIEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0d1aWRlbGluZT4KLTxSZXBvcnQgbmFtZT0icmVwb3J0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJSZXBvcnQgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJlcG9ydCBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icmVwb3J0X0EyLF9Hckd3UUEtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDo1MyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUmVwb3J0IEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1JlcG9ydD4KLTxUZW1wbGF0ZSBuYW1lPSJ0ZW1wbGF0ZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iVGVtcGxhdGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRlbXBsYXRlIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEd1aWRhbmNlRGVzY3JpcHRpb24gbmFtZT0idGVtcGxhdGVfQTIsX1pYcTlFQS1VRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjU4IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUZW1wbGF0ZSBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhdHRhY2htZW50cz0iIj4KLTwvR3VpZGFuY2VEZXNjcmlwdGlvbj4KLTwvVGVtcGxhdGU+Ci08U3VwcG9ydGluZ01hdGVyaWFsIG5hbWU9InN1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiIGJyaWVmRGVzY3JpcHRpb249IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InN1cHBvcnRpbmdfbWF0ZXJpYWxfQTIsX21Qc19jQS1VRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjAzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1N1cHBvcnRpbmdNYXRlcmlhbD4KLTxUb29sTWVudG9yIG5hbWU9InRvb2xtZW50b3JfQTIiIGJyaWVmRGVzY3JpcHRpb249IlRvb2xtZW50b3IgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2xtZW50b3IgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRvb2xtZW50b3JfQTIsX3Y3SktBQS1VRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjA4IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1Rvb2xNZW50b3I+Ci08V2hpdGVwYXBlciBuYW1lPSJ3aGl0ZXBhcGVyX0EyIiBicmllZkRlc2NyaXB0aW9uPSJXaGl0ZXBhcGVyIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJXaGl0ZXBhcGVyIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ3aGl0ZXBhcGVyX0EyLF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMToxNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9XaGl0ZXBhcGVyPgotPFByYWN0aWNlIG5hbWU9InByYWN0aWNlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08UHJhY3RpY2VEZXNjcmlwdGlvbiBuYW1lPSJwcmFjdGljZV9BMixfRXBmb1lBLVZFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MjMgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlByYWN0aWNlIEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGFkZGl0aW9uYWxJbmZvPSJQcmFjdGljZSBBMiBhZGQiIHByb2JsZW09IlByYWN0aWNlIEEyIHByb2JsZW0iIGJhY2tncm91bmQ9IlByYWN0aWNlIEEyIGJhY2siIGdvYWxzPSJQcmFjdGljZSBBMiBnb2FsIiBhcHBsaWNhdGlvbj0iUHJhY3RpY2UgQTIgYXBwIiBsZXZlbHNPZkFkb3B0aW9uPSJQcmFjdGljZSBBMiBsZXZlbCI+Ci08L1ByYWN0aWNlRGVzY3JpcHRpb24+Ci08UHJhY3RpY2UgbmFtZT0icHJhY3RpY2VfQTIuMSIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTIuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQTIuMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxQcmFjdGljZURlc2NyaXB0aW9uIG5hbWU9InByYWN0aWNlX0EyLjEsX0pyZ3d3QS1WRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjI1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMi4xIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGFkZGl0aW9uYWxJbmZvPSJQcmFjdGljZSBBMi4xIGFkZCIgcHJvYmxlbT0iUHJhY3RpY2UgQTIuMSBwcm9ibGVtIiBiYWNrZ3JvdW5kPSJQcmFjdGljZSBBMi4xIGJhY2siIGdvYWxzPSJQcmFjdGljZSBBMi4xIGdvYWwiIGFwcGxpY2F0aW9uPSJQcmFjdGljZSBBMi4xIGFwcCIgbGV2ZWxzT2ZBZG9wdGlvbj0iUHJhY3RpY2UgQTIuMSBsZXZlbCI+Ci08L1ByYWN0aWNlRGVzY3JpcHRpb24+Ci08L1ByYWN0aWNlPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMi9hcnRpZmFjdF9BMi4xIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcHJhY3RpY2VfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmVwb3J0X0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvYWRtYXBfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMvZGlzY2lwbGluZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRG9tYWlucy9kb21haW5fQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzL3JvbGVfc2V0X0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Ub29scy90b29sX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9XUCBUeXBlcy93b3JrX3Byb2R1Y3RfdHlwZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPC9QcmFjdGljZT4KLTxSZXVzYWJsZUFzc2V0IG5hbWU9InJldXNhYmxlX2Fzc2V0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJSZXVzYWJsZSBBc3NldCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUmV1c2FibGUgQXNzZXQgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJldXNhYmxlX2Fzc2V0X0EyLF9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMToyOSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUmV1c2FibGUgQXNzZXQgQTIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvUmV1c2FibGVBc3NldD4KLTxSb2FkbWFwIG5hbWU9InJvYWRtYXBfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvYWRtYXAgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvYWRtYXAgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvYWRtYXBfQTIsX1l1a2dRQS1WRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjA2IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSb2FkbWFwIEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1JvYWRtYXA+Ci08VGVybURlZmluaXRpb24gbmFtZT0idGVybV9kZWZpbml0aW9uX0EyIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRlcm0gRGVmaW5pdGlvbiBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0idGVybV9kZWZpbml0aW9uX0EyLF9vOEk3RUEtVkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMTo0MiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGVybSBEZWZpbml0aW9uIEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1Rlcm1EZWZpbml0aW9uPgotPFRlcm1EZWZpbml0aW9uIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUZXJtIERlZmluaXRpb24gQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9BMSxfc2ZpSlVBLVZFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MTIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRlcm0gRGVmaW5pdGlvbiBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9UZXJtRGVmaW5pdGlvbj4KLTxUYXNrIG5hbWU9InRhc2tfQTMiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmOiBUYXNrIEEzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iJmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7QVNDSUkmcXVvdDs/Jmd0OyAmbHQ7Y29tLmlibS51bWEuZWRpdC50bmcudXRpbC5tb2RlbDpPcmRlckluZm9Db2xsZWN0aW9uIHhtaTp2ZXJzaW9uPSZxdW90OzIuMCZxdW90OyB4bWxuczp4bWk9JnF1b3Q7aHR0cDovL3d3dy5vbWcub3JnL1hNSSZxdW90OyB4bWxuczpjb20uaWJtLnVtYS5lZGl0LnRuZy51dGlsLm1vZGVsPSZxdW90O2h0dHA6Ly8vY29tL2libS91bWEvZWRpdC90bmcvdXRpbC9tb2RlbC5lY29yZSZxdW90OyZndDsgICAmbHQ7b3JkZXJJbmZvcyBuYW1lPSZxdW90O3NlY3Rpb25zJnF1b3Q7IHRpbWVzdGFtcD0mcXVvdDsxMTI5NzQ3MjY0MTA5JnF1b3Q7Jmd0OyAgICAgJmx0O2dVSURzJmd0O19yQ1d3VUVEUEVkcXJoc1poM1FOQU1RJmx0Oy9nVUlEcyZndDsgICAgICZsdDtnVUlEcyZndDtfdGkyQllCQk9FZHFCczdLaGRWTFJMQSZsdDsvZ1VJRHMmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3VteWdZRURQRWRxcmhzWmgzUU5BTVEmbHQ7L2dVSURzJmd0OyAgICAgJmx0O2dVSURzJmd0O190azdzRUJCT0VkcUJzN0toZFZMUkxBJmx0Oy9nVUlEcyZndDsgICAgICZsdDtnVUlEcyZndDtfdng1QmtFRFBFZHFyaHNaaDNRTkFNUSZsdDsvZ1VJRHMmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3RuZGJvQkJPRWRxQnM3S2hkVkxSTEEmbHQ7L2dVSURzJmd0OyAgICZsdDsvb3JkZXJJbmZvcyZndDsgJmx0Oy9jb20uaWJtLnVtYS5lZGl0LnRuZy51dGlsLm1vZGVsOk9yZGVySW5mb0NvbGxlY3Rpb24mZ3Q7ICIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMyBleHRlbmRzIFRhc2sgQTIiIHZhcmlhYmlsaXR5VHlwZT0iZXh0ZW5kcyI+Ci08VGFza0Rlc2NyaXB0aW9uIG5hbWU9Iixfb1VsdUVFREZFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IldlZCBPY3QgMTkgMTA6Mjc6NDMgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249Im1haW46IFRhc2sgQTMiIGtleUNvbnNpZGVyYXRpb25zPSJrZXlzOiBUYXNrIEEzIiBwdXJwb3NlPSJwdXJwb3NlOiBUYXNrIEEzIiBhbHRlcm5hdGl2ZXM9ImFsdGVybmF0aXZlczogVGFzayBBMyI+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEEzLjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJTdGVwIEEzLjEiPgotPC9TZWN0aW9uPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMy4yIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iU3RlcCBBMy4yIj4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQTMuMyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249IlN0ZXAgQTMuMyI+Ci08L1NlY3Rpb24+Ci08L1Rhc2tEZXNjcmlwdGlvbj4KLTx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EzIj4KLTwvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4KLTxwZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMyI+Ci08L3BlcmZvcm1lZEJ5PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0EyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTMvLF9vVWx1RUVERkVkcU85TTNmdWtZQV9BL1N0ZXAgQTMuMSI+Ci08L3N0ZXBzPgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EzLyxfb1VsdUVFREZFZHFPOU0zZnVrWUFfQS9TdGVwIEEzLjIiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMy8sX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EvU3RlcCBBMy4zIj4KLTwvc3RlcHM+Ci08L1Rhc2s+Ci08Um9sZSBuYW1lPSJyb2xlX0EzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZiA6IFJvbGUgQTMiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTMgZXh0ZW5kcyBSb2xlIEEyIiB2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiPgotPFJvbGVEZXNjcmlwdGlvbiBuYW1lPSJuZXdfcm9sZSxfOFpONkFFREZFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IldlZCBPY3QgMTkgMTA6Mjk6NTkgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249Im1haW46IFJvbGUgQTMiIGtleUNvbnNpZGVyYXRpb25zPSJrZXk6IFJvbGUgQTMiIHNraWxscz0ic2tpbGxzOiBSb2xlIEEzIiBhc3NpZ25tZW50QXBwcm9hY2hlcz0iYXNzaWdubWVudDogUm9sZSBBMyIgc3lub255bXM9InN5bm9ueW1ucyA6IFJvbGUgQTMiPgotPC9Sb2xlRGVzY3JpcHRpb24+Ci08dmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMyI+Ci08L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci08L1JvbGU+Ci08L0NvbnRlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9ImNhcFBhdFBha19BMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NDb21wb25lbnQgbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJQaGFzZTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9Ikl0ZXJhdGlvbjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iQWN0aXZpdHkxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvcGFyZW50UGFja2FnZT4KLTxBY3Rpdml0eSBuYW1lPSJBY3Rpdml0eTEiIGJyaWVmRGVzY3JpcHRpb249IlRoaXMgYWN0aXZpdHkgY29udGFpbnMgdGFza3MgdGhhdCBhcmUgYXNzb2NpYXRlZCB0byBhbm90aGVyIHRhc2tzLkFsc28gdGhlaXIgc3RlcHMgYXJlIGFkZGVkLiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQWN0aXZpdHkxIGNvbnRhaW5pbmcgdGFza3MgbGlua2VkIHRvIG1ldGhvZCBlbGVtZW50cyIgcHJlZml4PSJQcmVmaXgiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0idHJ1ZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iQWN0aXZpdHkxLF9FNzNySVR6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhpcyBXb3JrZmxvdyBEZXRhaWw6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3VsJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIFByb3ZpZGVzIHRoZSBuYXR1cmFsICZsdDtiJmd0O3RyYW5zaXRpb24gZnJvbSBhbmFseXNpcyZsdDsvYiZndDsgYWN0aXZpdGllcyAmbHQ7YiZndDt0byBkZXNpZ24mbHQ7L2ImZ3Q7IGFjdGl2aXRpZXMsIGlkZW50aWZ5aW5nOiAmIzEzOyYjMTA7ICAgICAgICAmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGRlc2lnbiBlbGVtZW50cyBmcm9tIGFuYWx5c2lzIGVsZW1lbnRzJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGRlc2lnbiBtZWNoYW5pc21zIGZyb20gcmVsYXRlZCBhbmFseXNpcyBtZWNoYW5pc21zJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0Oy91bCZndDsmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0O2ImZ3Q7RGVzY3JpYmVzJmx0Oy9iJmd0OyB0aGUgb3JnYW5pemF0aW9uIG9mIHRoZSBzeXN0ZW0mYXBvcztzICZsdDtiJmd0O3J1bi10aW1lIGFuZCBkZXBsb3ltZW50IGFyY2hpdGVjdHVyZSZsdDsvYiZndDsmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0O2ImZ3Q7T3JnYW5pemVzIHRoZSBpbXBsZW1lbnRhdGlvbiBtb2RlbCZsdDsvYiZndDsgc28gYXMgdG8gbWFrZSB0aGUgdHJhbnNpdGlvbiBiZXR3ZWVuIGRlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gc2VhbWxlc3MmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0O2ImZ3Q7TWFpbnRhaW5zIHRoZSBjb25zaXN0ZW5jeSBhbmQgaW50ZWdyaXR5IG9mIHRoZSBhcmNoaXRlY3R1cmUmbHQ7L2ImZ3Q7LCBlbnN1cmluZyB0aGF0OiAmIzEzOyYjMTA7ICAgICAgICAmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIG5ldyBkZXNpZ24gZWxlbWVudHMgaWRlbnRpZmllZCBmb3IgdGhlIGN1cnJlbnQgaXRlcmF0aW9uIGFyZSBpbnRlZ3JhdGVkIHdpdGggcHJlLWV4aXN0aW5nIGRlc2lnbiBlbGVtZW50cy4mIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgbWF4aW1hbCByZS11c2Ugb2YgYXZhaWxhYmxlIGNvbXBvbmVudHMgYW5kIGRlc2lnbiBlbGVtZW50cyBpcyBhY2hpZXZlZCBhcyBlYXJseSBhcyBwb3NzaWJsZSBpbiB0aGUgZGVzaWduJiMxMzsmIzEwOyAgICAgICAgICAgICAgICBlZmZvcnQuJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0Oy91bCZndDsmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyZsdDsvdWwmZ3Q7IiBrZXlDb25zaWRlcmF0aW9ucz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBLZXkgY29uc2lkZXJhdGlvbnM6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3VsJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTEmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5MiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTQmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5NSYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk2JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTcmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyZsdDsvdWwmZ3Q7IiB1c2FnZUd1aWRhbmNlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSB3b3JrIGlzIGJlc3QgZG9uZSBpbiBzZXZlcmFsIHNlc3Npb25zLCBwZXJoYXBzIHBlcmZvcm1lZCBvdmVyIGEgZmV3IGRheXMgKG9yIHdlZWtzIGFuZCBtb250aHMgZm9yIHZlcnkgbGFyZ2UmIzEzOyYjMTA7ICAgIHN5c3RlbXMpLiBUaGUgaW5pdGlhbCBmb2N1cyB3aWxsIGJlIG9uIHRoZSBhY3Rpdml0aWVzICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fbWVjaGFuaXNtcyx7QzdBMjZCRDctMzgyMC00OEQ5LTgzMEYtNjg0QzNBRjE1NUY5fS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3tDN0EyNkJENy0zODIwLTQ4RDktODMwRi02ODRDM0FGMTU1Rjl9JnF1b3Q7Jmd0O0lkZW50aWZ5IERlc2lnbiBNZWNoYW5pc21zJmx0Oy9hJmd0OyBhbmQgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduLHs1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezU4Njk2M0QwLTYwN0QtNEVDMi04RDUzLTI5MkRBRkFCOUM5Mn0mcXVvdDsmZ3Q7aWRlbnRpZnlfZGVzaWduX2VsZW1lbnRzX3JlYWwtdGltZV9kZXNpZ24mbHQ7L2EmZ3Q7LCB3aXRoIGEgZ3JlYXQgZGVhbCBvZiYjMTM7JiMxMDsgICAgaXRlcmF0aW9uIHdpdGggdGhlICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pbmNvcnBvcmF0ZV9kZXNpZ25fZWxlbWVudHMsezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NUM2NDcxNzMtNEUzMi00NTk0LTk2QTktMjU0OEI0NzcyMkZBfSZxdW90OyZndDtJbmNvcnBvcmF0ZSBFeGlzdGluZyBEZXNpZ24gRWxlbWVudHMmbHQ7L2EmZ3Q7IGFjdGl2aXR5IHRvIG1ha2Ugc3VyZSB0aGF0IG5ldyYjMTM7JiMxMDsgICAgZWxlbWVudHMgZG8gbm90IGR1cGxpY2F0ZSBmdW5jdGlvbmFsaXR5IG9mIGV4aXN0aW5nIGVsZW1lbnRzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXMgdGhlIGRlc2lnbiBlbWVyZ2VzLCBjb25jdXJyZW5jeSBhbmQgZGlzdHJpYnV0aW9uIGlzc3VlcyBhcmUgaW50cm9kdWNlZCBpbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvZGVzY3JpYmVfcnVudGltZV9hcmNoaXRlY3R1cmUsezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NEQzNUMwMzgtQTJEMC00OEI4LTlFQ0QtNTI3MTdGRUFFMzNBfSZxdW90OyZndDtEZXNjcmliZSB0aGUgUnVuLXRpbWUgQXJjaGl0ZWN0dXJlJmx0Oy9hJmd0OyBhbmQgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX2Rpc3RyaWJ1dGlvbix7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s2QTExMjgwOC0wQTkwLTQyN0EtQkFCOS1FMTRGM0ZCRjcyQjV9JnF1b3Q7Jmd0O0Rlc2NyaWJlIERpc3RyaWJ1dGlvbiZsdDsvYSZndDssIHJlc3BlY3RpdmVseS4gQXMgdGhlc2UgaXNzdWVzIGFyZSBjb25zaWRlcmVkLCYjMTM7JiMxMDsgICAgY2hhbmdlcyB0byBkZXNpZ24gZWxlbWVudHMgbWF5IGJlIHJlcXVpcmVkIHRvIHNwbGl0IGJlaGF2aW9yIGFjcm9zcyBwcm9jZXNzZXMsIHRocmVhZHMgb3Igbm9kZXMuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBcyB0aGUgaW5kaXZpZHVhbCBtb2RlbHMgYXJlIHJlZmluZWQgdG8gaW5jb3Jwb3JhdGUgdGhlIGFyY2hpdGVjdHVyYWwgZGVjaXNpb25zLCB0aGUgcmVzdWx0cyBhcmUgZG9jdW1lbnRlZCBpbiYjMTM7JiMxMDsgICAgcmVzcGVjdGl2ZSB2aWV3IHNlY3Rpb25zIGluIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgKGUuZy4sIGFzIHRoZSBEZXNpZ24gTW9kZWwgaXMgcmVmaW5lZCwgdGhlIExvZ2ljYWwgVmlldyYjMTM7JiMxMDsgICAgb2YgdGhlIFNvZnR3YXJlIEFyY2hpdGVjdHVyZSBEb2N1bWVudCBpcyByZWZpbmVkLCBhcyB3ZWxsKS4gVGhlIHJlc3VsdGluZyBhcmNoaXRlY3R1cmUgaXMgcmV2aWV3ZWQuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7JiMxMzsmIzEwOyZsdDticiAvJmd0OyIgcHVycG9zZT0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBQdXJwb3NlIG9mIHRoaXMgYWN0aXZpdHkgaXMgdG8gaGF2ZSB0YXNrcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHRvIG90aGVyIHRhc2tzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmFtcDtuYnNwOyZsdDtpbWcgaGVpZ2h0PSZxdW90OzcxJnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9ydXAuanBnJnF1b3Q7IHdpZHRoPSZxdW90OzE3NiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiBhbHRlcm5hdGl2ZXM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQWx0ZXJhbnRpdmVzOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtvbCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBBbHRlcjEmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgQWx0ZXIyJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIEFsdGVyMyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7Jmx0Oy9vbCZndDsiIGhvd3RvU3RhZmY9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlc2UgYWN0aXZpdGllcyBhcmUgYmVzdCBjYXJyaWVkIG91dCBieSBhIHNtYWxsIHRlYW0gc3RhZmZlZCBieSBjcm9zcy1mdW5jdGlvbmFsIHRlYW0gbWVtYmVycy4gSXNzdWVzIHRoYXQgYXJlJiMxMzsmIzEwOyAgICB0eXBpY2FsbHkgYXJjaGl0ZWN0dXJhbGx5IHNpZ25pZmljYW50IGluY2x1ZGUgdXNhYmlsaXR5LCBwZXJmb3JtYW5jZSwgc2NhbGluZywgcHJvY2VzcyBhbmQgdGhyZWFkIHN5bmNocm9uaXphdGlvbiwgYW5kJiMxMzsmIzEwOyAgICBkaXN0cmlidXRpb24uIFRoZSB0ZWFtIHNob3VsZCBhbHNvIGluY2x1ZGUgbWVtYmVycyB3aXRoIGRvbWFpbiBleHBlcmllbmNlIHdobyBjYW4gaWRlbnRpZnkga2V5IGFic3RyYWN0aW9ucy4gVGhlIHRlYW0mIzEzOyYjMTA7ICAgIHNob3VsZCBhbHNvIGhhdmUgZXhwZXJpZW5jZSB3aXRoIG1vZGVsIG9yZ2FuaXphdGlvbiBhbmQgbGF5ZXJpbmcuIFRoZSB0ZWFtIHdpbGwgbmVlZCB0byBiZSBhYmxlIHRvIHB1bGwgYWxsIHRoZXNlJiMxMzsmIzEwOyAgICBkaXNwYXJhdGUgdGhyZWFkcyBpbnRvIGEgY29oZXNpdmUsIGNvaGVyZW50IChhbGJlaXQgcHJlbGltaW5hcnkpIGFyY2hpdGVjdHVyZS4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEJlY2F1c2UgdGhlIGZvY3VzIG9mIHRoZSBhcmNoaXRlY3R1cmUgZWZmb3J0IGlzIHNoaWZ0aW5nIHRvd2FyZCBpbXBsZW1lbnRhdGlvbiBpc3N1ZXMsIGdyZWF0ZXIgYXR0ZW50aW9uIG5lZWRzIHRvIGJlJiMxMzsmIzEwOyAgICBwYWlkIHRvIHNwZWNpZmljIHRlY2hub2xvZ3kgaXNzdWVzLiBUaGlzIHdpbGwgZm9yY2UgdGhlIGFyY2hpdGVjdHVyZSB0ZWFtIHRvIHNoaWZ0IG1lbWJlcnMgb3IgZXhwYW5kIHRvIGluY2x1ZGUgcGVvcGxlJiMxMzsmIzEwOyAgICB3aXRoIGRpc3RyaWJ1dGlvbiBhbmQgZGVwbG95bWVudCBleHBlcnRpc2UgKGlmIHRob3NlIGlzc3VlcyBhcmUgYXJjaGl0ZWN0dXJhbGx5IHNpZ25pZmljYW50KS4gSW4gb3JkZXIgdG8gdW5kZXJzdGFuZCYjMTM7JiMxMDsgICAgdGhlIHBvdGVudGlhbCBpbXBhY3Qgb2YgdGhlIHN0cnVjdHVyZSBvbiB0aGUgaW1wbGVtZW50YXRpb24gbW9kZWwgb24gdGhlIGVhc2Ugb2YgaW50ZWdyYXRpb24sIGV4cGVydGlzZSBpbiB0aGUgc29mdHdhcmUmIzEzOyYjMTA7ICAgIGJ1aWxkIG1hbmFnZW1lbnQgcHJvY2VzcyBpcyB1c2VmdWwgdG8gaGF2ZS4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEF0IHRoZSBzYW1lIHRpbWUsIGl0IGlzIGVzc2VudGlhbCB0aGF0IHRoZSBhcmNoaXRlY3R1cmUgdGVhbSBub3QgYmUgY29tcG9zZWQgb2YgYSBsYXJnZSBleHRlbmRlZCB0ZWFtLiBBIHN0cmF0ZWd5IGZvciYjMTM7JiMxMDsgICAgY291bnRlcmluZyB0aGlzIHRyZW5kIGlzIHRvIHJldGFpbiBhIHJlbGF0aXZlbHkgc21hbGwgY29yZSB0ZWFtIHdpdGggYSBzYXRlbGxpdGUgZ3JvdXAgb2YgZXh0ZW5kZWQgdGVhbSBtZW1iZXJzIHRoYXQmIzEzOyYjMTA7ICAgIGFyZSBicm91Z2h0IGluIGFzICZxdW90O2NvbnN1bHRhbnRzJnF1b3Q7IG9uIGtleSBpc3N1ZXMmbHQ7YiZndDsuJmx0Oy9iJmd0OyBUaGlzIHN0cnVjdHVyZSBhbHNvIHdvcmtzIHdlbGwgZm9yIHNtYWxsZXIgcHJvamVjdHMgd2hlcmUmIzEzOyYjMTA7ICAgIHNwZWNpZmljIGV4cGVydGlzZSBtYXkgYmUgYm9ycm93ZWQgb3IgY29udHJhY3RlZCBmcm9tIG90aGVyIG9yZ2FuaXphdGlvbnM7IHRoZXkgY2FuIGJlIGJyb3VnaHQgaW4gYXMgc3BlY2lmaWMgaXNzdWVzJiMxMzsmIzEwOyAgICBuZWVkIHRvIGJlIGFkZHJlc3NlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9BY3Rpdml0eTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgbGlua2VkIHRvIHRhc2tBMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvcm9sZURlc2MxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvd3BEZXNjMyB3aXRoIG5vIGxpbmtzIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjIHdpdGggbm8gbGlua3MiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayB3aXRoIG5vIGxpbmtzIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08cm9hZG1hcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvYWRtYXBfQTEiPgotPC9yb2FkbWFwcz4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGNvbmNlcHRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHM+Ci08Y29uY2VwdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0cz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08cmV1c2FibGVBc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvcmV1c2FibGVBc3NldHM+Ci08L0FjdGl2aXR5PgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2sgbGlua2VkIHRvIHRhc2tBMSIgYnJpZWZEZXNjcmlwdGlvbj0idGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMSIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFza19MaW5rZWRfVG9fVGFza0ExIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMSxfRnJ0TW9EemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIGtleXM6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXkxLGtleTImIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgdXNhZ2VHdWlkYW5jZT0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICB1c2FnZTomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSB3b3JrIGlzIGJlc3QgZG9uZSBpbiBzZXZlcmFsIHNlc3Npb25zLCBwZXJoYXBzIHBlcmZvcm1lZCBvdmVyIGEgZmV3IGRheXMgKG9yIHdlZWtzIGFuZCBtb250aHMgZm9yIHZlcnkgbGFyZ2UmIzEzOyYjMTA7ICAgIHN5c3RlbXMpLiBUaGUgaW5pdGlhbCBmb2N1cyB3aWxsIGJlIG9uIHRoZSBhY3Rpdml0aWVzICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fbWVjaGFuaXNtcyx7QzdBMjZCRDctMzgyMC00OEQ5LTgzMEYtNjg0QzNBRjE1NUY5fS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3tDN0EyNkJENy0zODIwLTQ4RDktODMwRi02ODRDM0FGMTU1Rjl9JnF1b3Q7Jmd0O0lkZW50aWZ5IERlc2lnbiBNZWNoYW5pc21zJmx0Oy9hJmd0OyBhbmQgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduLHs1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezU4Njk2M0QwLTYwN0QtNEVDMi04RDUzLTI5MkRBRkFCOUM5Mn0mcXVvdDsmZ3Q7aWRlbnRpZnlfZGVzaWduX2VsZW1lbnRzX3JlYWwtdGltZV9kZXNpZ24mbHQ7L2EmZ3Q7LCB3aXRoIGEgZ3JlYXQgZGVhbCBvZiYjMTM7JiMxMDsgICAgaXRlcmF0aW9uIHdpdGggdGhlICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pbmNvcnBvcmF0ZV9kZXNpZ25fZWxlbWVudHMsezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NUM2NDcxNzMtNEUzMi00NTk0LTk2QTktMjU0OEI0NzcyMkZBfSZxdW90OyZndDtJbmNvcnBvcmF0ZSBFeGlzdGluZyBEZXNpZ24gRWxlbWVudHMmbHQ7L2EmZ3Q7IGFjdGl2aXR5IHRvIG1ha2Ugc3VyZSB0aGF0IG5ldyYjMTM7JiMxMDsgICAgZWxlbWVudHMgZG8gbm90IGR1cGxpY2F0ZSBmdW5jdGlvbmFsaXR5IG9mIGV4aXN0aW5nIGVsZW1lbnRzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXMgdGhlIGRlc2lnbiBlbWVyZ2VzLCBjb25jdXJyZW5jeSBhbmQgZGlzdHJpYnV0aW9uIGlzc3VlcyBhcmUgaW50cm9kdWNlZCBpbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvZGVzY3JpYmVfcnVudGltZV9hcmNoaXRlY3R1cmUsezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NEQzNUMwMzgtQTJEMC00OEI4LTlFQ0QtNTI3MTdGRUFFMzNBfSZxdW90OyZndDtEZXNjcmliZSB0aGUgUnVuLXRpbWUgQXJjaGl0ZWN0dXJlJmx0Oy9hJmd0OyBhbmQgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX2Rpc3RyaWJ1dGlvbix7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s2QTExMjgwOC0wQTkwLTQyN0EtQkFCOS1FMTRGM0ZCRjcyQjV9JnF1b3Q7Jmd0O0Rlc2NyaWJlIERpc3RyaWJ1dGlvbiZsdDsvYSZndDssIHJlc3BlY3RpdmVseS4gQXMgdGhlc2UgaXNzdWVzIGFyZSBjb25zaWRlcmVkLCYjMTM7JiMxMDsgICAgY2hhbmdlcyB0byBkZXNpZ24gZWxlbWVudHMgbWF5IGJlIHJlcXVpcmVkIHRvIHNwbGl0IGJlaGF2aW9yIGFjcm9zcyBwcm9jZXNzZXMsIHRocmVhZHMgb3Igbm9kZXMuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBcyB0aGUgaW5kaXZpZHVhbCBtb2RlbHMgYXJlIHJlZmluZWQgdG8gaW5jb3Jwb3JhdGUgdGhlIGFyY2hpdGVjdHVyYWwgZGVjaXNpb25zLCB0aGUgcmVzdWx0cyBhcmUgZG9jdW1lbnRlZCBpbiYjMTM7JiMxMDsgICAgcmVzcGVjdGl2ZSB2aWV3IHNlY3Rpb25zIGluIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgKGUuZy4sIGFzIHRoZSBEZXNpZ24gTW9kZWwgaXMgcmVmaW5lZCwgdGhlIExvZ2ljYWwgVmlldyYjMTM7JiMxMDsgICAgb2YgdGhlIFNvZnR3YXJlIEFyY2hpdGVjdHVyZSBEb2N1bWVudCBpcyByZWZpbmVkLCBhcyB3ZWxsKS4gVGhlIHJlc3VsdGluZyBhcmNoaXRlY3R1cmUgaXMgcmV2aWV3ZWQuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7YnIgLyZndDsmIzEzOyYjMTA7ICAgICZsdDticiAvJmd0OyYjMTM7JiMxMDsgICAgJmFtcDtuYnNwOyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiByZWZpbmVkRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgcmVmaW5lZCBkZXNjcmlwdGlvbiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTYmcXVvdDsgYWx0PSZxdW90OyZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL2hlbHBib29rLmdpZiZxdW90OyB3aWR0aD0mcXVvdDsxNiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvcGFwZXJzLmh0bSZxdW90OyB0YXJnZXQ9JnF1b3Q7X2JsYW5rJnF1b3Q7Jmd0O3BhcGVycy5odG0mbHQ7L2EmZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0ExIj4KLTwvVGFzaz4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvcm9sZURlc2MyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzIiPgotPC9vdXRwdXQ+Ci08cGVyZm9ybWVkUHJpbWFyaWx5QnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgbGlua2VkIHRvIHRhc2tBMSI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrIGxpbmtlZCB0byB0YXNrQTIiIGJyaWVmRGVzY3JpcHRpb249InRhc2sgbGlua2VkIHRvIHRhc2tBMiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFza19MaW5rZWRfVG9fdGFza0EyIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMixfTHdMUWdEemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJrZXlzOiB0YXNrIGFzc29jaWF0ZWQgdG8gdGFza0EyIiB1c2FnZUd1aWRhbmNlPSJ1c2FnZTp0YXNrIGFzc29jaWF0ZWQgdG8gdGFza0EyIiByZWZpbmVkRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgcmVmaW5lZDp0YXNrIGFzc29jaWF0ZWQgdG8gdGFza0EyJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3RhYmxlIGNlbGxzcGFjaW5nPSZxdW90OzImcXVvdDsgY2VsbHBhZGRpbmc9JnF1b3Q7MiZxdW90OyB3aWR0aD0mcXVvdDsxODAmcXVvdDsgYm9yZGVyPSZxdW90OzEmcXVvdDsmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7dGJvZHkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0O3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgMSYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RoJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RoJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RoJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RoJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RoJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RoJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdHImZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0O3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICB6JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIDImIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdHImZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0O3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICB6JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgMyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdHImZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0O3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICB6JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICA0JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdHImZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0O3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICB6JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIDUmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdHImZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L3Rib2R5Jmd0OyYjMTM7JiMxMDsmbHQ7L3RhYmxlJmd0OyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgbGlua2VkIHRvIHRhc2tBMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTIiPgotPC9UYXNrPgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTIiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyL3Rhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMi4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyL3Rhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMi4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyL3Rhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMi4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZURlc2MxIiBicmllZkRlc2NyaXB0aW9uPSJyb2xlRGVzYzEgbGlua2VkIHRvIHJvbGVBMSIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0icm9sZURlc2MxIiBwcmVmaXg9InByZWZpeCIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVEZXNjMSxfUDFzVVlEemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIGtleSBjb25zaWRlcmF0aW9uczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIGtleTEmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIGtleTImIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgdXNhZ2VHdWlkYW5jZT0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDs0NzQmcXVvdDsgYWx0PSZxdW90OyZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL3J1cF9wbGF0Zm9ybS5qcGcmcXVvdDsgd2lkdGg9JnF1b3Q7NTA0JnF1b3Q7IC8mZ3Q7dXNhZ2UgZm9yIHJvbGVBMSZhbXA7bmJzcDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgcmVmaW5lZERlc2NyaXB0aW9uPSJyZWZpbmVkIGRlc2NyaXB0aW9uIGZvciByb2xlRGVzYzEiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9yb2xlRGVzYzEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvcm9sZURlc2MxIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvd3BEZXNjMiI+Ci08L21vZGlmaWVzPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlRGVzYzIiIGJyaWVmRGVzY3JpcHRpb249InJvbGVEZXNjMiBsaW5rZWQgdG8gcm9sZUEyIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJyb2xlRGVzYzIiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZURlc2MyLF9ROTlrQUR6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9ImtleSBjb25zaWRlcmF0aW9uIGZvciByb2xlQTIiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTImcXVvdDsgYWx0PSZxdW90OyZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL2J1bGxldDEuZ2lmJnF1b3Q7IHdpZHRoPSZxdW90OzEyJnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICB1c2FnZSBndWlkYW5jZSBmb3Igcm9sZUEyJiMxMzsmIzEwOyZsdDsvcCZndDsiIHJlZmluZWREZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICByZWZpbmVkIGRlc2NyaXB0aW9uIGZvciByb2xlQTImIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHJlZmluZWQgZGVzY3JpcHRpb24gZm9yIHJvbGVBMiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvcm9sZURlc2MyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMiI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzEiPgotPC9tb2RpZmllcz4KLTwvUm9sZURlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9IndwRGVzYzEiIGJyaWVmRGVzY3JpcHRpb249InRoaXMgd3AgaXMgbGlua2VkIHRvIGFydGlmYWN0IiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJ3cERlc2MxIGlzIGxpbmtlZCB0byBhcnRpZmFjdCIgcHJlZml4PSJwcmVmaXgiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0id3BEZXNjMSxfU1VHUWdEemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJrZXk6d3BEZXNjMSIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6d3BEZXNjMSIgcmVmaW5lZERlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHJlZmluZWQ6IHdwRGVzYzEmIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJ3cERlc2MyIiBicmllZkRlc2NyaXB0aW9uPSJ3cGRlc2MyIGxpbmtlZCB0byBkZWxpdmVyYWJsZSIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0id3BEZXNjMiBsaW5rZWQgdG8gZGVsaXZlcmFibGUiIHByZWZpeD0icHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9IndwRGVzYzIsX1RDdTRJRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5OndwZGVzYzIiIHVzYWdlR3VpZGFuY2U9InVzYWdlOndwZGVzYzIiIHJlZmluZWREZXNjcmlwdGlvbj0icmVmaW5lZDogd3BkZXNjMiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzIiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9vdXRjb21lX0ExIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9hcnRpZmFjdF9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMSxfV3JfeThEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExLF9Yc1hxMER6a0VkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvYXJ0aWZhY3RfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJ3cERlc2MzIHdpdGggbm8gbGlua3MiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmOiB3cERlc2MzIHdpdGggbm8gbGlua3MiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IndwRGVzYzMgd2l0aCBubyBsaW5rcyIgcHJlZml4PSJwcmVmaXgiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0id3BEZXNjMyB3aXRoIG5vIGxpbmtzLF8xeDU3QUR6a0VkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9ImtleTogd3BEZXNjMyB3aXRoIG5vIGxpbmtzIiB1c2FnZUd1aWRhbmNlPSJ1c2FnZTogd3BEZXNjMyB3aXRoIG5vIGxpbmtzIiByZWZpbmVkRGVzY3JpcHRpb249InJlZmluZWQ6IHdwRGVzYzMgd2l0aCBubyBsaW5rcyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzMgd2l0aCBubyBsaW5rcyI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVEZXNjIHdpdGggbm8gbGlua3MiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmOnJvbGVEZXNjIHdpdGggbm8gbGlua3MiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9InJvbGVEZXNjIHdpdGggbm8gbGlua3MiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZURlc2Mgd2l0aCBubyBsaW5rcyxfM19VTndEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJrZXkgY29uc2lkZXJhdGlvbjpyb2xlRGVzYyB3aXRoIG5vIGxpbmtzIiB1c2FnZUd1aWRhbmNlPSJ1c2FnZTpyb2xlRGVzYyB3aXRoIG5vIGxpbmtzIiByZWZpbmVkRGVzY3JpcHRpb249InJlZmluZWQgZGVzY3JpcHRpb24gOiByb2xlRGVzYyB3aXRoIG5vIGxpbmtzIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvcm9sZURlc2Mgd2l0aCBubyBsaW5rcyI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTwvUm9sZURlc2NyaXB0b3I+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFzayB3aXRoIG5vIGxpbmtzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjp0YXNrIHdpdGggbm8gbGlua3MiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9InRhc2sgd2l0aCBubyBsaW5rcyIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2sgd2l0aCBubyBsaW5rcyxfNWpKWUFEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJrZXk6dGFzayB3aXRoIG5vIGxpbmtzIiB1c2FnZUd1aWRhbmNlPSJ1c2FnZTp0YXNrIHdpdGggbm8gbGlua3MiIHJlZmluZWREZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICByZWZpbmVkOnRhc2sgd2l0aCBubyBsaW5rcyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayB3aXRoIG5vIGxpbmtzIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfUk1ON0VEemxFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIj4KLTwvUHJvcGVydHk+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IkFjdGl2aXR5MiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L3BhcmVudFBhY2thZ2U+Ci08QWN0aXZpdHkgbmFtZT0iQWN0aXZpdHkyIiBicmllZkRlc2NyaXB0aW9uPSJBY3Rpdml0eTIgY29udGFpbmluZCBEbkQgdGFza3MiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFjdGl2aXR5MiBjb250YWluaW5kIERuRCB0YXNrcyIgcHJlZml4PSJQcmVmaXgiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9IkFjdGl2aXR5MixfQlM2Z0VUemxFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoaXMgV29ya2Zsb3cgRGV0YWlsOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBQcm92aWRlcyB0aGUgbmF0dXJhbCAmbHQ7YiZndDt0cmFuc2l0aW9uIGZyb20gYW5hbHlzaXMmbHQ7L2ImZ3Q7IGFjdGl2aXRpZXMgJmx0O2ImZ3Q7dG8gZGVzaWduJmx0Oy9iJmd0OyBhY3Rpdml0aWVzLCBpZGVudGlmeWluZzogJiMxMzsmIzEwOyAgICAgICAgJmx0O3VsJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBkZXNpZ24gZWxlbWVudHMgZnJvbSBhbmFseXNpcyBlbGVtZW50cyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBkZXNpZ24gbWVjaGFuaXNtcyBmcm9tIHJlbGF0ZWQgYW5hbHlzaXMgbWVjaGFuaXNtcyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O0Rlc2NyaWJlcyZsdDsvYiZndDsgdGhlIG9yZ2FuaXphdGlvbiBvZiB0aGUgc3lzdGVtJmFwb3M7cyAmbHQ7YiZndDtydW4tdGltZSBhbmQgZGVwbG95bWVudCBhcmNoaXRlY3R1cmUmbHQ7L2ImZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O09yZ2FuaXplcyB0aGUgaW1wbGVtZW50YXRpb24gbW9kZWwmbHQ7L2ImZ3Q7IHNvIGFzIHRvIG1ha2UgdGhlIHRyYW5zaXRpb24gYmV0d2VlbiBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIHNlYW1sZXNzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O01haW50YWlucyB0aGUgY29uc2lzdGVuY3kgYW5kIGludGVncml0eSBvZiB0aGUgYXJjaGl0ZWN0dXJlJmx0Oy9iJmd0OywgZW5zdXJpbmcgdGhhdDogJiMxMzsmIzEwOyAgICAgICAgJmx0O3VsJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBuZXcgZGVzaWduIGVsZW1lbnRzIGlkZW50aWZpZWQgZm9yIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiBhcmUgaW50ZWdyYXRlZCB3aXRoIHByZS1leGlzdGluZyBkZXNpZ24gZWxlbWVudHMuJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIG1heGltYWwgcmUtdXNlIG9mIGF2YWlsYWJsZSBjb21wb25lbnRzIGFuZCBkZXNpZ24gZWxlbWVudHMgaXMgYWNoaWV2ZWQgYXMgZWFybHkgYXMgcG9zc2libGUgaW4gdGhlIGRlc2lnbiYjMTM7JiMxMDsgICAgICAgICAgICAgICAgZWZmb3J0LiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgS2V5IGNvbnNpZGVyYXRpb25zOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkxJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTImIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5MyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk0JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTUmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5NiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk3JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIgdXNhZ2VHdWlkYW5jZT0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGUgd29yayBpcyBiZXN0IGRvbmUgaW4gc2V2ZXJhbCBzZXNzaW9ucywgcGVyaGFwcyBwZXJmb3JtZWQgb3ZlciBhIGZldyBkYXlzIChvciB3ZWVrcyBhbmQgbW9udGhzIGZvciB2ZXJ5IGxhcmdlJiMxMzsmIzEwOyAgICBzeXN0ZW1zKS4gVGhlIGluaXRpYWwgZm9jdXMgd2lsbCBiZSBvbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX21lY2hhbmlzbXMse0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7QzdBMjZCRDctMzgyMC00OEQ5LTgzMEYtNjg0QzNBRjE1NUY5fSZxdW90OyZndDtJZGVudGlmeSBEZXNpZ24gTWVjaGFuaXNtcyZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbix7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9JnF1b3Q7Jmd0O2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduJmx0Oy9hJmd0Oywgd2l0aCBhIGdyZWF0IGRlYWwgb2YmIzEzOyYjMTA7ICAgIGl0ZXJhdGlvbiB3aXRoIHRoZSAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaW5jb3Jwb3JhdGVfZGVzaWduX2VsZW1lbnRzLHs1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0mcXVvdDsmZ3Q7SW5jb3Jwb3JhdGUgRXhpc3RpbmcgRGVzaWduIEVsZW1lbnRzJmx0Oy9hJmd0OyBhY3Rpdml0eSB0byBtYWtlIHN1cmUgdGhhdCBuZXcmIzEzOyYjMTA7ICAgIGVsZW1lbnRzIGRvIG5vdCBkdXBsaWNhdGUgZnVuY3Rpb25hbGl0eSBvZiBleGlzdGluZyBlbGVtZW50cy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFzIHRoZSBkZXNpZ24gZW1lcmdlcywgY29uY3VycmVuY3kgYW5kIGRpc3RyaWJ1dGlvbiBpc3N1ZXMgYXJlIGludHJvZHVjZWQgaW4gdGhlIGFjdGl2aXRpZXMgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX3J1bnRpbWVfYXJjaGl0ZWN0dXJlLHs0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0mcXVvdDsmZ3Q7RGVzY3JpYmUgdGhlIFJ1bi10aW1lIEFyY2hpdGVjdHVyZSZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9kZXNjcmliZV9kaXN0cmlidXRpb24sezZBMTEyODA4LTBBOTAtNDI3QS1CQUI5LUUxNEYzRkJGNzJCNX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fSZxdW90OyZndDtEZXNjcmliZSBEaXN0cmlidXRpb24mbHQ7L2EmZ3Q7LCByZXNwZWN0aXZlbHkuIEFzIHRoZXNlIGlzc3VlcyBhcmUgY29uc2lkZXJlZCwmIzEzOyYjMTA7ICAgIGNoYW5nZXMgdG8gZGVzaWduIGVsZW1lbnRzIG1heSBiZSByZXF1aXJlZCB0byBzcGxpdCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzLCB0aHJlYWRzIG9yIG5vZGVzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXMgdGhlIGluZGl2aWR1YWwgbW9kZWxzIGFyZSByZWZpbmVkIHRvIGluY29ycG9yYXRlIHRoZSBhcmNoaXRlY3R1cmFsIGRlY2lzaW9ucywgdGhlIHJlc3VsdHMgYXJlIGRvY3VtZW50ZWQgaW4mIzEzOyYjMTA7ICAgIHJlc3BlY3RpdmUgdmlldyBzZWN0aW9ucyBpbiB0aGUgU29mdHdhcmUgQXJjaGl0ZWN0dXJlIERvY3VtZW50IChlLmcuLCBhcyB0aGUgRGVzaWduIE1vZGVsIGlzIHJlZmluZWQsIHRoZSBMb2dpY2FsIFZpZXcmIzEzOyYjMTA7ICAgIG9mIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgaXMgcmVmaW5lZCwgYXMgd2VsbCkuIFRoZSByZXN1bHRpbmcgYXJjaGl0ZWN0dXJlIGlzIHJldmlld2VkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsiIHB1cnBvc2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgUHVycG9zZSBvZiB0aGlzIGFjdGl2aXR5IGlzIHRvIGhhdmUgdGFza3MgdGhhdCBhcmUgYXNzb2NpYXRlZCB0byBvdGhlciB0YXNrcy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZhbXA7bmJzcDsmbHQ7aW1nIGhlaWdodD0mcXVvdDs3MSZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvcnVwLmpwZyZxdW90OyB3aWR0aD0mcXVvdDsxNzYmcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgYWx0ZXJuYXRpdmVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFsdGVyYW50aXZlczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7b2wmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgQWx0ZXIxJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIEFsdGVyMiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBBbHRlcjMmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyZsdDsvb2wmZ3Q7IiBob3d0b1N0YWZmPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZXNlIGFjdGl2aXRpZXMgYXJlIGJlc3QgY2FycmllZCBvdXQgYnkgYSBzbWFsbCB0ZWFtIHN0YWZmZWQgYnkgY3Jvc3MtZnVuY3Rpb25hbCB0ZWFtIG1lbWJlcnMuIElzc3VlcyB0aGF0IGFyZSYjMTM7JiMxMDsgICAgdHlwaWNhbGx5IGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCBpbmNsdWRlIHVzYWJpbGl0eSwgcGVyZm9ybWFuY2UsIHNjYWxpbmcsIHByb2Nlc3MgYW5kIHRocmVhZCBzeW5jaHJvbml6YXRpb24sIGFuZCYjMTM7JiMxMDsgICAgZGlzdHJpYnV0aW9uLiBUaGUgdGVhbSBzaG91bGQgYWxzbyBpbmNsdWRlIG1lbWJlcnMgd2l0aCBkb21haW4gZXhwZXJpZW5jZSB3aG8gY2FuIGlkZW50aWZ5IGtleSBhYnN0cmFjdGlvbnMuIFRoZSB0ZWFtJiMxMzsmIzEwOyAgICBzaG91bGQgYWxzbyBoYXZlIGV4cGVyaWVuY2Ugd2l0aCBtb2RlbCBvcmdhbml6YXRpb24gYW5kIGxheWVyaW5nLiBUaGUgdGVhbSB3aWxsIG5lZWQgdG8gYmUgYWJsZSB0byBwdWxsIGFsbCB0aGVzZSYjMTM7JiMxMDsgICAgZGlzcGFyYXRlIHRocmVhZHMgaW50byBhIGNvaGVzaXZlLCBjb2hlcmVudCAoYWxiZWl0IHByZWxpbWluYXJ5KSBhcmNoaXRlY3R1cmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBCZWNhdXNlIHRoZSBmb2N1cyBvZiB0aGUgYXJjaGl0ZWN0dXJlIGVmZm9ydCBpcyBzaGlmdGluZyB0b3dhcmQgaW1wbGVtZW50YXRpb24gaXNzdWVzLCBncmVhdGVyIGF0dGVudGlvbiBuZWVkcyB0byBiZSYjMTM7JiMxMDsgICAgcGFpZCB0byBzcGVjaWZpYyB0ZWNobm9sb2d5IGlzc3Vlcy4gVGhpcyB3aWxsIGZvcmNlIHRoZSBhcmNoaXRlY3R1cmUgdGVhbSB0byBzaGlmdCBtZW1iZXJzIG9yIGV4cGFuZCB0byBpbmNsdWRlIHBlb3BsZSYjMTM7JiMxMDsgICAgd2l0aCBkaXN0cmlidXRpb24gYW5kIGRlcGxveW1lbnQgZXhwZXJ0aXNlIChpZiB0aG9zZSBpc3N1ZXMgYXJlIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCkuIEluIG9yZGVyIHRvIHVuZGVyc3RhbmQmIzEzOyYjMTA7ICAgIHRoZSBwb3RlbnRpYWwgaW1wYWN0IG9mIHRoZSBzdHJ1Y3R1cmUgb24gdGhlIGltcGxlbWVudGF0aW9uIG1vZGVsIG9uIHRoZSBlYXNlIG9mIGludGVncmF0aW9uLCBleHBlcnRpc2UgaW4gdGhlIHNvZnR3YXJlJiMxMzsmIzEwOyAgICBidWlsZCBtYW5hZ2VtZW50IHByb2Nlc3MgaXMgdXNlZnVsIHRvIGhhdmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBdCB0aGUgc2FtZSB0aW1lLCBpdCBpcyBlc3NlbnRpYWwgdGhhdCB0aGUgYXJjaGl0ZWN0dXJlIHRlYW0gbm90IGJlIGNvbXBvc2VkIG9mIGEgbGFyZ2UgZXh0ZW5kZWQgdGVhbS4gQSBzdHJhdGVneSBmb3ImIzEzOyYjMTA7ICAgIGNvdW50ZXJpbmcgdGhpcyB0cmVuZCBpcyB0byByZXRhaW4gYSByZWxhdGl2ZWx5IHNtYWxsIGNvcmUgdGVhbSB3aXRoIGEgc2F0ZWxsaXRlIGdyb3VwIG9mIGV4dGVuZGVkIHRlYW0gbWVtYmVycyB0aGF0JiMxMzsmIzEwOyAgICBhcmUgYnJvdWdodCBpbiBhcyAmcXVvdDtjb25zdWx0YW50cyZxdW90OyBvbiBrZXkgaXNzdWVzJmx0O2ImZ3Q7LiZsdDsvYiZndDsgVGhpcyBzdHJ1Y3R1cmUgYWxzbyB3b3JrcyB3ZWxsIGZvciBzbWFsbGVyIHByb2plY3RzIHdoZXJlJiMxMzsmIzEwOyAgICBzcGVjaWZpYyBleHBlcnRpc2UgbWF5IGJlIGJvcnJvd2VkIG9yIGNvbnRyYWN0ZWQgZnJvbSBvdGhlciBvcmdhbml6YXRpb25zOyB0aGV5IGNhbiBiZSBicm91Z2h0IGluIGFzIHNwZWNpZmljIGlzc3VlcyYjMTM7JiMxMDsgICAgbmVlZCB0byBiZSBhZGRyZXNzZWQuJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvQWN0aXZpdHkyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3JvbGVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvcm9sZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9kZWxpdmVyYWJsZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3Rhc2tfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPHJvYWRtYXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yb2FkbWFwX0IxIj4KLTwvcm9hZG1hcHM+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IxIj4KLTwvY2hlY2tsaXN0cz4KLTxjb25jZXB0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMSI+Ci08L2NvbmNlcHRzPgotPGNvbmNlcHRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IxIj4KLTwvY29uY2VwdHM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjEiPgotPC9leGFtcGxlcz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjEiPgotPC9ndWlkZWxpbmVzPgotPHJldXNhYmxlQXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMSI+Ci08L3JldXNhYmxlQXNzZXRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0ExIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEExICIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQTEsXzBEUl9RRURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iVGFzayBBMSZhbXA7bmJzcDsga2V5IiB1c2FnZUd1aWRhbmNlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRhc2sgQTEmYW1wO25ic3A7IGd1aWRhbmNlJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDsxNiZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7JiMxMzsmIzEwOyAgICBzcmM9JnF1b3Q7ZmlsZTovLy9DOi9Eb2N1bWVudHMlMjBhbmQlMjBTZXR0aW5ncy9BZG1pbmlzdHJhdG9yL0lCTS9NZXRob2RMaWJyYXJpZXMvUGFyaXMvUGFyaXMvUGx1ZyUyMEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9zeW5jZWQuZ2lmJnF1b3Q7JiMxMzsmIzEwOyAgICAgd2lkdGg9JnF1b3Q7MTYmcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzE2JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsmIzEzOyYjMTA7ICAgIHNyYz0mcXVvdDtmaWxlOi8vL0M6L0RvY3VtZW50cyUyMGFuZCUyMFNldHRpbmdzL0FkbWluaXN0cmF0b3IvSUJNL01ldGhvZExpYnJhcmllcy9QYXJpcy9QYXJpcy9QbHVnJTIwQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2hlbHBib29rLmdpZiZxdW90OyYjMTM7JiMxMDsgICAgIHdpZHRoPSZxdW90OzE2JnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsiIHJlZmluZWREZXNjcmlwdGlvbj0iVGFzayBBMSZhbXA7bmJzcDsgcmVmaW5lZCBkZXNjcmlwdGlvbiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3Rhc2tfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvdGFza19BMSI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3JvbGVfQTIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9kZWxpdmVyYWJsZV9BMSI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0ExIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0ExIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMSxfMERrNk1FREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJSb2xlIEExIGtleSIgdXNhZ2VHdWlkYW5jZT0iUm9sZSBBMSBndWlkYW5jZSIgcmVmaW5lZERlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFJvbGUgQTEgcmVmaW5lZCBkZXNjJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDs3MSZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7JiMxMzsmIzEwOyAgICBzcmM9JnF1b3Q7ZmlsZTovLy9DOi9Eb2N1bWVudHMlMjBhbmQlMjBTZXR0aW5ncy9BZG1pbmlzdHJhdG9yL0lCTS9NZXRob2RMaWJyYXJpZXMvUGFyaXMvUGFyaXMvUGx1ZyUyMEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9ydXAuanBnJnF1b3Q7JiMxMzsmIzEwOyAgICAgd2lkdGg9JnF1b3Q7MTc2JnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3JvbGVfQTEiPgotPC9Sb2xlPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0ExIj4KLTwvbW9kaWZpZXM+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2RlbGl2ZXJhYmxlX0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZURlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiAiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMixfMERrNk1VREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFJvbGUgQTIga2V5JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDsxNjcmcXVvdDsgYWx0PSZxdW90OyZxdW90OyYjMTM7JiMxMDsgICAgc3JjPSZxdW90O2ZpbGU6Ly8vQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9JQk0vTWV0aG9kTGlicmFyaWVzL1BhcmlzL1BhcmlzL1BsdWclMjBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwMV9hLmdpZiZxdW90OyYjMTM7JiMxMDsgICAgIHdpZHRoPSZxdW90OzI2JnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsiIHVzYWdlR3VpZGFuY2U9IlJvbGUgQTIgdXNhZ2UiIHJlZmluZWREZXNjcmlwdGlvbj0iUm9sZSBBMiByZWZpbmVkIGRlc2MiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3JvbGVfQTIiPgotPC9Sb2xlPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0EyIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xLF8wRHVyTUVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTEsXzBEdXJNVURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMSxfMER1ck1rREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9kZWxpdmVyYWJsZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMSxfMER1ck0wREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMSxfMEVVaEVFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfMEVVaEVVREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF8wRVVoRWtERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFza19BMiIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMiAiIHByZWZpeD0iUHJlZml4IiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0EyLF8yODg3RUVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IlRhc2sgQTIga2V5IiB1c2FnZUd1aWRhbmNlPSJUYXNrIEEyIGd1aWRhbmNlIiByZWZpbmVkRGVzY3JpcHRpb249IlRhc2sgQTIgcmVmaW5lZCBkZXNjcmlwdGlvbiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3Rhc2tfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvdGFza19BMiI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3JvbGVfQTEiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9kZWxpdmVyYWJsZV9BMiI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0EyIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0EyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0EyLF8yOVpuQUVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImRlbGl2ZXJhYmxlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTIsXzI5Wm5BVURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2RlbGl2ZXJhYmxlX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfMjlabkFrREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfMjlzaDhFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0EyLF8yOXNoOFVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+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+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIj4KLTwvUHJvcGVydHk+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPEl0ZXJhdGlvbiBuYW1lPSJJdGVyYXRpb24xIiBicmllZkRlc2NyaXB0aW9uPSJUaGlzIGl0ZXJhdGlvbiBjb250YWlucyB0d28gYWN0aXZpdGllcyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iSXRlcmF0aW9uMSIgcHJlZml4PSJQcmVmaXgiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9InRydWUiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iSXRlcmF0aW9uMSxfRUZWcndUemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoaXMgd29ya2Zsb3cgZGV0YWlsIGhhcyB0aGUgZm9sbG93aW5nIGdvYWxzOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBDcmVhdGUgYW4gaW5pdGlhbCBza2V0Y2ggb2YgdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgc3lzdGVtICYjMTM7JiMxMDsgICAgICAgICZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgRGVmaW5lIGFuIGluaXRpYWwgc2V0IG9mIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCBlbGVtZW50cyB0byB1c2UgYXMgdGhlIGJhc2lzIGZvciBhbmFseXNpcyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBEZWZpbmUgYW4gaW5pdGlhbCBzZXQgb2YgYW5hbHlzaXMgbWVjaGFuaXNtcyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIGluaXRpYWwgbGF5ZXJpbmcgYW5kIG9yZ2FuaXphdGlvbiBvZiB0aGUgc3lzdGVtJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIERlZmluZSB0aGUgdXNlLWNhc2UgcmVhbGl6YXRpb25zIHRvIGJlIGFkZHJlc3NlZCBpbiB0aGUgY3VycmVudCBpdGVyYXRpb24mIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3VsJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBJZGVudGlmeSBhbmFseXNpcyBjbGFzc2VzIGZyb20gdGhlIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCB1c2UgY2FzZXMmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgVXBkYXRlIHRoZSB1c2UtY2FzZSByZWFsaXphdGlvbnMgd2l0aCBhbmFseXNpcyBjbGFzcyBpbnRlcmFjdGlvbnMmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyZsdDsvdWwmZ3Q7IiBrZXlDb25zaWRlcmF0aW9ucz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBLZXkgY29uc2lkZXJhdGlvbnM6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3VsJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTExJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTIyJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTMzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIgdXNhZ2VHdWlkYW5jZT0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGUgd29yayBpcyBiZXN0IGRvbmUgaW4gc2V2ZXJhbCBzZXNzaW9ucywgcGVyaGFwcyBwZXJmb3JtZWQgb3ZlciBhIGZldyBkYXlzIChvciB3ZWVrcyBhbmQgbW9udGhzIGZvciB2ZXJ5IGxhcmdlJiMxMzsmIzEwOyAgICBzeXN0ZW1zKSwgd2l0aCBpdGVyYXRpb24gYmV0d2VlbiAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvYXJjaGl0ZWN0dXJhbF9hbmFseXNpcyx7OENCNDg0MDItRDRDNS00RTE3LUJCMzMtNTA3MzE1Q0IxQkJGfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s4Q0I0ODQwMi1ENEM1LTRFMTctQkIzMy01MDczMTVDQjFCQkZ9JnF1b3Q7Jmd0O0FyY2hpdGVjdHVyYWwgQW5hbHlzaXMmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvdXNlX2Nhc2VfYW5hbHlzaXMsezI4MDE0NjE1LUE2MkYtNDUyRC1CODIxLTMwQzdDQUIwRUM0NH0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7MjgwMTQ2MTUtQTYyRi00NTJELUI4MjEtMzBDN0NBQjBFQzQ0fSZxdW90OyZndDtVc2UtQ2FzZSBBbmFseXNpcyZsdDsvYSZndDsuIFBlcmZvcm0gYW4gaW5pdGlhbCBwYXNzIGF0IHRoZSBhcmNoaXRlY3R1cmUgaW4gJmx0O2EmIzEzOyYjMTA7ICAgIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7IGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2FyY2hpdGVjdHVyYWxfYW5hbHlzaXMsezhDQjQ4NDAyLUQ0QzUtNEUxNy1CQjMzLTUwNzMxNUNCMUJCRn0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7OENCNDg0MDItRDRDNS00RTE3LUJCMzMtNTA3MzE1Q0IxQkJGfSZxdW90OyZndDtBcmNoaXRlY3R1cmFsIEFuYWx5c2lzJmx0Oy9hJmd0OywgdGhlbiBjaG9vc2UgYXJjaGl0ZWN0dXJhbGx5IHNpZ25pZmljYW50IHVzZSYjMTM7JiMxMDsgICAgY2FzZXMsIHBlcmZvcm1pbmcgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsgaHJlZj0mcXVvdDtyZXNvdXJjZXMvdXNlX2Nhc2VfYW5hbHlzaXMsezI4MDE0NjE1LUE2MkYtNDUyRC1CODIxLTMwQzdDQUIwRUM0NH0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7MjgwMTQ2MTUtQTYyRi00NTJELUI4MjEtMzBDN0NBQjBFQzQ0fSZxdW90OyZndDtVc2UtQ2FzZSBBbmFseXNpcyZsdDsvYSZndDsgb24gZWFjaCBvbmUuIEFmdGVyIChvciBhcykgZWFjaCB1c2UgY2FzZSBpcyYjMTM7JiMxMDsgICAgYW5hbHl6ZWQsIHVwZGF0ZSB0aGUgYXJjaGl0ZWN0dXJlIGFzIG5lZWRlZCB0byByZWZsZWN0IGFkYXB0YXRpb25zIHJlcXVpcmVkIHRvIGFjY29tbW9kYXRlIG5ldyBiZWhhdmlvciBvZiB0aGUgc3lzdGVtJiMxMzsmIzEwOyAgICBhbmQgdG8gYWRkcmVzcyBwb3RlbnRpYWwgYXJjaGl0ZWN0dXJhbCBwcm9ibGVtcyB3aGljaCBhcmUgaWRlbnRpZmllZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFdoZXJlIHRoZSBhcmNoaXRlY3R1cmUgYWxyZWFkeSBleGlzdHMgKGVpdGhlciBmcm9tIGEgcHJpb3IgcHJvamVjdCBvciBpdGVyYXRpb24pLCBjaGFuZ2UgcmVxdWVzdHMgbWF5IG5lZWQgdG8gYmUmIzEzOyYjMTA7ICAgIGNyZWF0ZWQgdG8gY2hhbmdlIHRoZSBhcmNoaXRlY3R1cmUgdG8gYWNjb3VudCBmb3IgdGhlIG5ldyBiZWhhdmlvciB0aGUgc3lzdGVtIG11c3Qgc3VwcG9ydC4gVGhlc2UgY2hhbmdlcyBtYXkgYmUgdG8gYW55JiMxMzsmIzEwOyAgICBhcnRpZmFjdCBpbiB0aGUgcHJvY2VzcywgZGVwZW5kaW5nIG9uIHRoZSBzY29wZSBvZiB0aGUgY2hhbmdlLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsiIHB1cnBvc2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgUHVycG9zZTogVGhpcyBpdGVydGFpb24gaXMgY3JlYXRlZCBmb3IgdHdvIGFjdGl2aXRpZXMuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmYW1wO25ic3A7Jmx0O2ltZyBoZWlnaHQ9JnF1b3Q7NDc0JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9ydXBfcGxhdGZvcm0uanBnJnF1b3Q7IHdpZHRoPSZxdW90OzUwNCZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiBhbHRlcm5hdGl2ZXM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQWx0ZXJuYXRpdmVzOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtvbCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YSBocmVmPSZxdW90Oy4uL3JvbGVzL3JvbGVfQTEueG1pJnF1b3Q7IHRhcmdldD0mcXVvdDtfYmxhbmsmcXVvdDsmZ3Q7cm9sZV9BMS54bWkmbHQ7L2EmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDthIGhyZWY9JnF1b3Q7Li4vdGFza3MvdGFza19BMi54bWkmcXVvdDsgdGFyZ2V0PSZxdW90O19ibGFuayZxdW90OyZndDt0YXNrX0EyLnhtaSZsdDsvYSZndDsmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyZsdDsvb2wmZ3Q7IiBob3d0b1N0YWZmPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZXNlIGFjdGl2aXRpZXMgYXJlIGJlc3QgY2FycmllZCBvdXQgYnkgYSBzbWFsbCB0ZWFtIHN0YWZmZWQgYnkgY3Jvc3MtZnVuY3Rpb25hbCB0ZWFtIG1lbWJlcnMuIElzc3VlcyB0aGF0IGFyZSYjMTM7JiMxMDsgICAgdHlwaWNhbGx5IGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCBpbmNsdWRlIHBlcmZvcm1hbmNlLCBzY2FsaW5nLCBwcm9jZXNzIGFuZCB0aHJlYWQgc3luY2hyb25pemF0aW9uLCBhbmQmIzEzOyYjMTA7ICAgIGRpc3RyaWJ1dGlvbi4gVGhlIHRlYW0gc2hvdWxkIGFsc28gaW5jbHVkZSBtZW1iZXJzIHdpdGggZG9tYWluIGV4cGVyaWVuY2Ugd2hvIGNhbiBpZGVudGlmeSBrZXkgYWJzdHJhY3Rpb25zLiBUaGUgdGVhbSYjMTM7JiMxMDsgICAgc2hvdWxkIGFsc28gaGF2ZSBleHBlcmllbmNlIHdpdGggbW9kZWwgb3JnYW5pemF0aW9uIGFuZCBsYXllcmluZy4gVGhlIHRlYW0gd2lsbCBuZWVkIHRvIGJlIGFibGUgdG8gcHVsbCBhbGwgdGhlc2UmIzEzOyYjMTA7ICAgIGRpc3BhcmF0ZSB0aHJlYWRzIGludG8gYSBjb2hlc2l2ZSwgY29oZXJlbnQgKGFsYmVpdCBwcmVsaW1pbmFyeSkgYXJjaGl0ZWN0dXJlLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvQWN0aXZpdHlEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvSXRlcmF0aW9uMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvQWN0aXZpdHkxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL0FjdGl2aXR5MiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPHJvYWRtYXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2FkbWFwX0EyIj4KLTwvcm9hZG1hcHM+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxjb25jZXB0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzPgotPGNvbmNlcHRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPHJldXNhYmxlQXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L3JldXNhYmxlQXNzZXRzPgotPC9JdGVyYXRpb24+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFBoYXNlIG5hbWU9IlBoYXNlMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJQaGFzZTEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08QWN0aXZpdHlEZXNjcmlwdGlvbiBuYW1lPSJQaGFzZTEsX0Rha1FjRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9QaGFzZTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvSXRlcmF0aW9uMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPC9QaGFzZT4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvRGlhZ3JhbT4KLTxDYXBhYmlsaXR5UGF0dGVybiBuYW1lPSJDUDEgd2l0aCBhbGwgZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IkJyaWVmOkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPFByb2Nlc3NEZXNjcmlwdGlvbiBuYW1lPSJDUDEgd2l0aCBhbGwgZWxlbWVudHMsXzRzQ3RzVHpnRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGUgc3ViY2F0ZWdvcmllcyBvZiBwcm9jZXNzIGFyZSBkZWxpdmVyeSBwcm9jZXNzIGFuZCBjYXBhYmlsaXR5IHBhdHRlcm4uJmFtcDtuYnNwOyBBIGRlbGl2ZXJ5IHByb2Nlc3MgZGVmaW5lcyBhIGNvbXBsZXRlJiMxMzsmIzEwOyAgICBvciBlbmQtdG8tZW5kIHByb2Nlc3MuJmFtcDtuYnNwOyBBIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBhIHByb2Nlc3MgZnJhZ21lbnQgdXNlZCB0byBjb21wb3NlIGEgZGVsaXZlcnkgcHJvY2Vzcy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZhbXA7bmJzcDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IlRoaXMgY2FwYWJpbGl0eSBwYXR0ZXJuIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgY29uc3RydWN0IGFuIEluY2VwdGlvbiBwaGFzZSBpdGVyYXRpb24gaW4gYSBkZWxpdmVyeSBwcm9jZXNzLiZhbXA7bmJzcDsgQ29weSBvciYjMTM7JiMxMDtleHRlbmQgdGhlIHBhdHRlcm4mYW1wO25ic3A7cmVwZWF0ZWRseSB0byBjcmVhdGUgYXMgbWFueSBpdGVyYXRpb25zIGFzIG5lY2Vzc2FyeSBmb3IgdGhlIHBhcnRpY3VsYXIgZGVsaXZlcnkgcHJvY2Vzcy4iIHVzYWdlR3VpZGFuY2U9IiIgcHVycG9zZT0iVGhpcyBjYXBhYmlsaXR5IHBhdHRlcm4gY2FuIGJlIHVzZWQgdG8gcXVpY2tseSBjb25zdHJ1Y3QgYW4gSW5jZXB0aW9uIHBoYXNlIGl0ZXJhdGlvbiBpbiBhIGRlbGl2ZXJ5IHByb2Nlc3MuJmFtcDtuYnNwOyBDb3B5IG9yJiMxMzsmIzEwO2V4dGVuZCB0aGUgcGF0dGVybiZhbXA7bmJzcDtyZXBlYXRlZGx5IHRvIGNyZWF0ZSBhcyBtYW55IGl0ZXJhdGlvbnMgYXMgbmVjZXNzYXJ5IGZvciB0aGUgcGFydGljdWxhciBkZWxpdmVyeSBwcm9jZXNzLiAmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBhbHRlcm5hdGl2ZXM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVG8gZXhwbGFpbiB0aGUgd29yayBpbnZvbHZlZCBpbiB0aGUgQW5hbHlzaXMgYW5kIERlc2lnbiBkaXNjaXBsaW5lLCB0aGUgYWN0aXZpdGllcyBhbmQgd29yayBwcm9kdWN0cyBhcmUgb3JnYW5pemVkIGludG8mIzEzOyYjMTA7ICAgIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGZvciB0aGUgZGlzY2lwbGluZS4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEluIHRoZSBJbmNlcHRpb24gUGhhc2UsIGFuYWx5c2lzIGFuZCBkZXNpZ24gaXMgY29uY2VybmVkIHdpdGggZXN0YWJsaXNoaW5nIHdoZXRoZXIgdGhlIHN5c3RlbSBhcyBlbnZpc2lvbmVkIGlzJiMxMzsmIzEwOyAgICBmZWFzaWJsZSwgYW5kIHdpdGggYXNzZXNzaW5nIHBvdGVudGlhbCB0ZWNobm9sb2dpZXMgZm9yIHRoZSBzb2x1dGlvbiAoaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FyY2hzeW4uaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1BlcmZvcm0gQXJjaGl0ZWN0dXJhbCBTeW50aGVzaXMmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykuIElmIGl0IGlzIGZlbHQgdGhhdCBsaXR0bGUgcmlzayBhdHRhY2hlcyB0byB0aGUgZGV2ZWxvcG1lbnQmIzEzOyYjMTA7ICAgIChiZWNhdXNlLCBmb3IgZXhhbXBsZSwgdGhlIGRvbWFpbiBpcyB3ZWxsIHVuZGVyc3Rvb2QsIHRoZSBzeXN0ZW0gaXMgbm90IG5vdmVsLCBhbmQgc28gb24pIHRoZW4gdGhpcyB3b3JrZmxvdyBkZXRhaWwgbWF5JiMxMzsmIzEwOyAgICBiZSBvbWl0dGVkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIGVhcmx5IEVsYWJvcmF0aW9uIFBoYXNlIGZvY3VzZXMgb24gY3JlYXRpbmcgYW4gaW5pdGlhbCBhcmNoaXRlY3R1cmUgZm9yIHRoZSBzeXN0ZW0gKCAmbHQ7YSYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDEuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVmaW5lIGEgQ2FuZGlkYXRlIEFyY2hpdGVjdHVyZSZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7KSB0byBwcm92aWRlIGEgc3RhcnRpbmcmIzEzOyYjMTA7ICAgIHBvaW50IGZvciB0aGUgbWFpbiBhbmFseXNpcyB3b3JrLiBJZiB0aGUgYXJjaGl0ZWN0dXJlIGFscmVhZHkgZXhpc3RzIChlaXRoZXIgYmVjYXVzZSBpdCB3YXMgcHJvZHVjZWQgaW4gcHJldmlvdXMmIzEzOyYjMTA7ICAgIGl0ZXJhdGlvbnMsIGluIHByZXZpb3VzIHByb2plY3RzLCBvciBpcyBvYnRhaW5lZCBmcm9tIGFuIGFwcGxpY2F0aW9uIGZyYW1ld29yayksIHRoZSBmb2N1cyBvZiB0aGUgd29yayBjaGFuZ2VzIHRvJiMxMzsmIzEwOyAgICByZWZpbmluZyB0aGUgYXJjaGl0ZWN0dXJlICggJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDIuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7UmVmaW5lIHRoZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykmIzEzOyYjMTA7ICAgIGFuZCBhbmFseXppbmcgYmVoYXZpb3IgYW5kIGNyZWF0aW5nIGFuIGluaXRpYWwgc2V0IG9mIGVsZW1lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQzLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0FuYWx5emUgQmVoYXZpb3ImbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBZnRlciB0aGUgaW5pdGlhbCBlbGVtZW50cyBhcmUgaWRlbnRpZmllZCwgdGhleSBhcmUgZnVydGhlciByZWZpbmVkLiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kNC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQmIzEzOyYjMTA7ICAgIGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVzaWduIENvbXBvbmVudHMmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OyBwcm9kdWNlIGEgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IgdG8mIzEzOyYjMTA7ICAgIHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50cyBvbiB0aGUgc3lzdGVtLiBJZiB0aGUgc3lzdGVtIGluY2x1ZGVzIGEgZGF0YWJhc2UsIHRoZW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDcuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiB0aGUgRGF0YWJhc2UmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OyBvY2N1cnMgaW4gcGFyYWxsZWwuIFRoZSByZXN1bHQgaXMgYW4gaW5pdGlhbCBzZXQgb2YgY29tcG9uZW50cyB3aGljaCBhcmUmIzEzOyYjMTA7ICAgIGZ1cnRoZXIgcmVmaW5lZCBpbiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZmRfaW1wLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0ltcGxlbWVudGF0aW9uJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsuJmx0O2JyIC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7JmFtcDtuYnNwOyZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsiIGhvd3RvU3RhZmY9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVG8gZXhwbGFpbiB0aGUgd29yayBpbnZvbHZlZCBpbiB0aGUgQW5hbHlzaXMgYW5kIERlc2lnbiBkaXNjaXBsaW5lLCB0aGUgYWN0aXZpdGllcyBhbmQgd29yayBwcm9kdWN0cyBhcmUgb3JnYW5pemVkIGludG8mIzEzOyYjMTA7ICAgIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGZvciB0aGUgZGlzY2lwbGluZS4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEluIHRoZSBJbmNlcHRpb24gUGhhc2UsIGFuYWx5c2lzIGFuZCBkZXNpZ24gaXMgY29uY2VybmVkIHdpdGggZXN0YWJsaXNoaW5nIHdoZXRoZXIgdGhlIHN5c3RlbSBhcyBlbnZpc2lvbmVkIGlzJiMxMzsmIzEwOyAgICBmZWFzaWJsZSwgYW5kIHdpdGggYXNzZXNzaW5nIHBvdGVudGlhbCB0ZWNobm9sb2dpZXMgZm9yIHRoZSBzb2x1dGlvbiAoaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FyY2hzeW4uaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1BlcmZvcm0gQXJjaGl0ZWN0dXJhbCBTeW50aGVzaXMmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykuIElmIGl0IGlzIGZlbHQgdGhhdCBsaXR0bGUgcmlzayBhdHRhY2hlcyB0byB0aGUgZGV2ZWxvcG1lbnQmIzEzOyYjMTA7ICAgIChiZWNhdXNlLCBmb3IgZXhhbXBsZSwgdGhlIGRvbWFpbiBpcyB3ZWxsIHVuZGVyc3Rvb2QsIHRoZSBzeXN0ZW0gaXMgbm90IG5vdmVsLCBhbmQgc28gb24pIHRoZW4gdGhpcyB3b3JrZmxvdyBkZXRhaWwgbWF5JiMxMzsmIzEwOyAgICBiZSBvbWl0dGVkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIGVhcmx5IEVsYWJvcmF0aW9uIFBoYXNlIGZvY3VzZXMgb24gY3JlYXRpbmcgYW4gaW5pdGlhbCBhcmNoaXRlY3R1cmUgZm9yIHRoZSBzeXN0ZW0gKCAmbHQ7YSYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDEuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVmaW5lIGEgQ2FuZGlkYXRlIEFyY2hpdGVjdHVyZSZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7KSB0byBwcm92aWRlIGEgc3RhcnRpbmcmIzEzOyYjMTA7ICAgIHBvaW50IGZvciB0aGUgbWFpbiBhbmFseXNpcyB3b3JrLiBJZiB0aGUgYXJjaGl0ZWN0dXJlIGFscmVhZHkgZXhpc3RzIChlaXRoZXIgYmVjYXVzZSBpdCB3YXMgcHJvZHVjZWQgaW4gcHJldmlvdXMmIzEzOyYjMTA7ICAgIGl0ZXJhdGlvbnMsIGluIHByZXZpb3VzIHByb2plY3RzLCBvciBpcyBvYnRhaW5lZCBmcm9tIGFuIGFwcGxpY2F0aW9uIGZyYW1ld29yayksIHRoZSBmb2N1cyBvZiB0aGUgd29yayBjaGFuZ2VzIHRvJiMxMzsmIzEwOyAgICByZWZpbmluZyB0aGUgYXJjaGl0ZWN0dXJlICggJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDIuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7UmVmaW5lIHRoZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykmIzEzOyYjMTA7ICAgIGFuZCBhbmFseXppbmcgYmVoYXZpb3IgYW5kIGNyZWF0aW5nIGFuIGluaXRpYWwgc2V0IG9mIGVsZW1lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQzLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0FuYWx5emUgQmVoYXZpb3ImbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBZnRlciB0aGUgaW5pdGlhbCBlbGVtZW50cyBhcmUgaWRlbnRpZmllZCwgdGhleSBhcmUgZnVydGhlciByZWZpbmVkLiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kNC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQmIzEzOyYjMTA7ICAgIGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVzaWduIENvbXBvbmVudHMmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OyBwcm9kdWNlIGEgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IgdG8mIzEzOyYjMTA7ICAgIHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50cyBvbiB0aGUgc3lzdGVtLiBJZiB0aGUgc3lzdGVtIGluY2x1ZGVzIGEgZGF0YWJhc2UsIHRoZW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDcuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiB0aGUgRGF0YWJhc2UmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OyBvY2N1cnMgaW4gcGFyYWxsZWwuIFRoZSByZXN1bHQgaXMgYW4gaW5pdGlhbCBzZXQgb2YgY29tcG9uZW50cyB3aGljaCBhcmUmIzEzOyYjMTA7ICAgIGZ1cnRoZXIgcmVmaW5lZCBpbiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZmRfaW1wLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0ltcGxlbWVudGF0aW9uJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsuJmx0O2JyIC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7JmFtcDtuYnNwOyZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsiIGV4dGVybmFsSWQ9IkVYdGVybmFsIElEOkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgc2NvcGU9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVG8gZXhwbGFpbiB0aGUgd29yayBpbnZvbHZlZCBpbiB0aGUgQW5hbHlzaXMgYW5kIERlc2lnbiBkaXNjaXBsaW5lLCB0aGUgYWN0aXZpdGllcyBhbmQgd29yayBwcm9kdWN0cyBhcmUgb3JnYW5pemVkIGludG8mIzEzOyYjMTA7ICAgIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGZvciB0aGUgZGlzY2lwbGluZS4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEluIHRoZSBJbmNlcHRpb24gUGhhc2UsIGFuYWx5c2lzIGFuZCBkZXNpZ24gaXMgY29uY2VybmVkIHdpdGggZXN0YWJsaXNoaW5nIHdoZXRoZXIgdGhlIHN5c3RlbSBhcyBlbnZpc2lvbmVkIGlzJiMxMzsmIzEwOyAgICBmZWFzaWJsZSwgYW5kIHdpdGggYXNzZXNzaW5nIHBvdGVudGlhbCB0ZWNobm9sb2dpZXMgZm9yIHRoZSBzb2x1dGlvbiAoaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FyY2hzeW4uaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1BlcmZvcm0gQXJjaGl0ZWN0dXJhbCBTeW50aGVzaXMmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykuIElmIGl0IGlzIGZlbHQgdGhhdCBsaXR0bGUgcmlzayBhdHRhY2hlcyB0byB0aGUgZGV2ZWxvcG1lbnQmIzEzOyYjMTA7ICAgIChiZWNhdXNlLCBmb3IgZXhhbXBsZSwgdGhlIGRvbWFpbiBpcyB3ZWxsIHVuZGVyc3Rvb2QsIHRoZSBzeXN0ZW0gaXMgbm90IG5vdmVsLCBhbmQgc28gb24pIHRoZW4gdGhpcyB3b3JrZmxvdyBkZXRhaWwgbWF5JiMxMzsmIzEwOyAgICBiZSBvbWl0dGVkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIGVhcmx5IEVsYWJvcmF0aW9uIFBoYXNlIGZvY3VzZXMgb24gY3JlYXRpbmcgYW4gaW5pdGlhbCBhcmNoaXRlY3R1cmUgZm9yIHRoZSBzeXN0ZW0gKCAmbHQ7YSYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDEuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVmaW5lIGEgQ2FuZGlkYXRlIEFyY2hpdGVjdHVyZSZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7KSB0byBwcm92aWRlIGEgc3RhcnRpbmcmIzEzOyYjMTA7ICAgIHBvaW50IGZvciB0aGUgbWFpbiBhbmFseXNpcyB3b3JrLiBJZiB0aGUgYXJjaGl0ZWN0dXJlIGFscmVhZHkgZXhpc3RzIChlaXRoZXIgYmVjYXVzZSBpdCB3YXMgcHJvZHVjZWQgaW4gcHJldmlvdXMmIzEzOyYjMTA7ICAgIGl0ZXJhdGlvbnMsIGluIHByZXZpb3VzIHByb2plY3RzLCBvciBpcyBvYnRhaW5lZCBmcm9tIGFuIGFwcGxpY2F0aW9uIGZyYW1ld29yayksIHRoZSBmb2N1cyBvZiB0aGUgd29yayBjaGFuZ2VzIHRvJiMxMzsmIzEwOyAgICByZWZpbmluZyB0aGUgYXJjaGl0ZWN0dXJlICggJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDIuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7UmVmaW5lIHRoZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykmIzEzOyYjMTA7ICAgIGFuZCBhbmFseXppbmcgYmVoYXZpb3IgYW5kIGNyZWF0aW5nIGFuIGluaXRpYWwgc2V0IG9mIGVsZW1lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQzLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0FuYWx5emUgQmVoYXZpb3ImbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBZnRlciB0aGUgaW5pdGlhbCBlbGVtZW50cyBhcmUgaWRlbnRpZmllZCwgdGhleSBhcmUgZnVydGhlciByZWZpbmVkLiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kNC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQmIzEzOyYjMTA7ICAgIGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVzaWduIENvbXBvbmVudHMmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OyBwcm9kdWNlIGEgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IgdG8mIzEzOyYjMTA7ICAgIHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50cyBvbiB0aGUgc3lzdGVtLiBJZiB0aGUgc3lzdGVtIGluY2x1ZGVzIGEgZGF0YWJhc2UsIHRoZW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDcuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiB0aGUgRGF0YWJhc2UmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OyBvY2N1cnMgaW4gcGFyYWxsZWwuIFRoZSByZXN1bHQgaXMgYW4gaW5pdGlhbCBzZXQgb2YgY29tcG9uZW50cyB3aGljaCBhcmUmIzEzOyYjMTA7ICAgIGZ1cnRoZXIgcmVmaW5lZCBpbiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZmRfaW1wLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0ltcGxlbWVudGF0aW9uJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsuJmx0O2JyIC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7JmFtcDtuYnNwOyZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsiIHVzYWdlTm90ZXM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIHN1YmNhdGVnb3JpZXMgb2YgcHJvY2VzcyBhcmUgZGVsaXZlcnkgcHJvY2VzcyBhbmQgY2FwYWJpbGl0eSBwYXR0ZXJuLiZhbXA7bmJzcDsgQSBkZWxpdmVyeSBwcm9jZXNzIGRlZmluZXMgYSBjb21wbGV0ZSYjMTM7JiMxMDsgICAgb3IgZW5kLXRvLWVuZCBwcm9jZXNzLiZhbXA7bmJzcDsgQSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgYSBwcm9jZXNzIGZyYWdtZW50IHVzZWQgdG8gY29tcG9zZSBhIGRlbGl2ZXJ5IHByb2Nlc3MuJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9Qcm9jZXNzRGVzY3JpcHRpb24+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL1BoYXNlMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvQ2FwYWJpbGl0eVBhdHRlcm4+Ci08L1Byb2Nlc3NDb21wb25lbnQ+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJhY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08QWN0aXZpdHkgbmFtZT0iYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHMiIHByZWZpeD0iUHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08QWN0aXZpdHlEZXNjcmlwdGlvbiBuYW1lPSIsX2xEaGw4RURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0ibWFpbjogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5OiBBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHMiIHVzYWdlR3VpZGFuY2U9InVzYWdlOiBBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHMiIHB1cnBvc2U9InB1cnBvc2U6IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50cyIgYWx0ZXJuYXRpdmVzPSJhbHRlcm5hdGl2ZXM6IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50cyIgaG93dG9TdGFmZj0iaG93IHRvIHN0YWZmOiBBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvdGFza19BMyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTMiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvcm9sZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2FydGlmYWN0X0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvZGVsaXZlcmFibGVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08L0FjdGl2aXR5PgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQTMiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmOiBUYXNrIEEzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEEzIGV4dGVuZHMgVGFzayBBMiIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQTMsX0dxWDFNRURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy90YXNrX0EzIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvdGFza19BMyI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvcm9sZV9BMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTEiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L21hbmRhdG9yeUlucHV0PgotPG9wdGlvbmFsSW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvZGVsaXZlcmFibGVfQTIiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3Rhc2tfQTMiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EzLyxfb1VsdUVFREZFZHFPOU0zZnVrWUFfQS9TdGVwIEEzLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTMvLF9vVWx1RUVERkVkcU85TTNmdWtZQV9BL1N0ZXAgQTMuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMy8sX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EvU3RlcCBBMy4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyL3Rhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMi4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyL3Rhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMi4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyL3Rhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMi4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9BMyIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWYgOiBSb2xlIEEzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEEzIGV4dGVuZHMgUm9sZSBBMiIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0EzLF9HcVgxTVVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvcm9sZV9BMyI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTMiPgotPC9Sb2xlPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL291dGNvbWVfQTIiPgotPC9tb2RpZmllcz4KLTwvUm9sZURlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiBleHRlbmRlZCBieSBSb2xlIEEzIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTIsX0dxaG1NRURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvcm9sZV9BMiI+Ci08L1JvbGU+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYXJ0aWZhY3RfQTIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9kZWxpdmVyYWJsZV9BMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL291dGNvbWVfQTIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZURlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMSIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0ExLF9HcWhtTVVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvcm9sZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTEiPgotPC9Sb2xlPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfR3FobU1rRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2FydGlmYWN0X0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2FydGlmYWN0X0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMixfR3FobU0wRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2RlbGl2ZXJhYmxlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2RlbGl2ZXJhYmxlX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTIsX0dxaG1ORURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL291dGNvbWVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0EyLF9HcXF3SUVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfR3Fxd0lVRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvRGlhZ3JhbT4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08QWN0aXZpdHkgbmFtZT0iQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyxfZFlHbTBFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcHVycG9zZT0iIiBhbHRlcm5hdGl2ZXM9IiIgaG93dG9TdGFmZj0iIj4KLTwvQWN0aXZpdHlEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3Rhc2tfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08L0FjdGl2aXR5PgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQjIiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjIgZXh0ZW5kcyBUYXNrIEExIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFza19CMixfbDV5VUFFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy90YXNrX0IyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3Rhc2tfQjIiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0IxIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQTIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQjIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQTEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9CMiI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQTEiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9CMiI+Ci08L291dHB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQTEiPgotPC9vdXRwdXQ+Ci08cGVyZm9ybWVkUHJpbWFyaWx5QnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3Rhc2tfQjIiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyL3Rhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyL3Rhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyL3Rhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQjIsX2w1eVVBVURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0IyIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9CMiI+Ci08L21vZGlmaWVzPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0ExIj4KLTwvbW9kaWZpZXM+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0IyIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0IyIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQjEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0IxLF9sNXlVQWtEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMSI+Ci08L1JvbGU+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgZXh0ZW5kZWQgYnkgUm9sZSBBMyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0EyLF9sNXlVQTBEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9BMiI+Ci08L1JvbGU+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IyLF9sNXlVQkVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0IyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsX2w1eVVCVURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMSxfbDV5VUJrRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0IyLF9sNXlVQjBEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0IyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0IyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0IyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0ExLF9sNXlVQ0VEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0IyLF9sNXlVQ1VEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsX2w1eVVDa0RQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQjIsX2w1N2Q4RURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMixfbDU3ZDhVRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExLF9sNTdkOGtEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xLF9sNTdkODBEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsX2w1N2Q5RURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+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+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPENhcGFiaWxpdHlQYXR0ZXJuIG5hbWU9IkNQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSJCcmllZjogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPFByb2Nlc3NEZXNjcmlwdGlvbiBuYW1lPSJDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyxfWnRaYk1VREZFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSJtYWluOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIga2V5Q29uc2lkZXJhdGlvbnM9IktleXM6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiB1c2FnZUd1aWRhbmNlPSJ1c2FnZTogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIHB1cnBvc2U9IlB1cnBvc2U6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBhbHRlcm5hdGl2ZXM9ImFsdGVybmF0aXZlczogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGhvd3RvU3RhZmY9IkhvdyB0byBzdGFmZjogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGV4dGVybmFsSWQ9IkV4dGVybmFsIElEOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgc2NvcGU9InNjb3BlOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgdXNhZ2VOb3Rlcz0idXNhZ2U6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08ZGVmYXVsdENvbnRleHQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvQ2FwYWJpbGl0eVBhdHRlcm4+Ci08L1Byb2Nlc3NDb21wb25lbnQ+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NDb21wb25lbnQgbmFtZT0iQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsvQ1AxIHdpdGggYWxsIGVsZW1lbnRzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxBY3Rpdml0eSBuYW1lPSJDUDEgd2l0aCBhbGwgZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08QWN0aXZpdHlEZXNjcmlwdGlvbiBuYW1lPSJDUDEgd2l0aCBhbGwgZWxlbWVudHMsX0VYYXpFRDBLRWRxakFJNzdESHZCd0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7L0NQMSB3aXRoIGFsbCBlbGVtZW50cy9DUDEgd2l0aCBhbGwgZWxlbWVudHMiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08dmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOy9DUDEgd2l0aCBhbGwgZWxlbWVudHMvQ1AxIHdpdGggYWxsIGVsZW1lbnRzIj4KLTwvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4KLTwvQWN0aXZpdHk+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7Ij4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPENhcGFiaWxpdHlQYXR0ZXJuIG5hbWU9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iQ2FwUGF0IEExLF9hSFVTUVJCTkVkcUJzN0toZFZMUkxBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyBrZXkgY29uIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgcHVycG9zZTogQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiBhbHRlcm5hdGl2ZXM9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgJmx0O3N0cm9uZyZndDtlbGVtZW50cyZhcG9zOyBhbHRlcm4mbHQ7L3N0cm9uZyZndDsiIGhvd3RvU3RhZmY9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsgc3RhZmYiIGV4dGVybmFsSWQ9ImV4dGVybklEOkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiIHNjb3BlPSJDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7IHNjb3BlIiB1c2FnZU5vdGVzPSJDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7dXNhZ2UiPgotPC9Qcm9jZXNzRGVzY3JpcHRpb24+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7L0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPFByb2Nlc3NDb21wb25lbnQgbmFtZT0iQ1AgQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJBY3QxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9wYXJlbnRQYWNrYWdlPgotPEFjdGl2aXR5IG5hbWU9IkFjdDEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQWN0MSIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9IkFjdDEsX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL0FjdDEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08L0FjdGl2aXR5PgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQTEiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQTEsX2dGN1VzRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMSI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0ExIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMSI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0ExIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMSxfZ0Y3VXNVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0ExIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvbW9kaWZpZXM+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9BMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZURlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiAiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMixfZ0Y3VXNrQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0EyIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0EyIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xLF9nRjdVczBBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExLF9nR0Vlb0VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0ExLF9nR0Vlb1VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMSxfZ0dFZW9rQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTEsX2dHRWVvMEF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfZ0dFZXBFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsX2dHRWVwVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQjEiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjEgcHJlc25ldCIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQjEsX2pCRmVRRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19CMSI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9CMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9CMSI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjEiPgotPC9vdXRwdXQ+Ci08cGVyZm9ybWVkUHJpbWFyaWx5QnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19CMSI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjEvdGFza19CMSxfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIxLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjEvdGFza19CMSxfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIxLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjEvdGFza19CMSxfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIxLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0IxIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9CMSxfanZTQkFFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IxIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvbW9kaWZpZXM+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9CMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0IyIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9CMixfanZTQkFVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IyIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IyIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IxLF9qdlNCQWtBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0IxLF9qdlNCQTBBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMSxfanZTQkJFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0IxIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQjEsX2p2Yks4RUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0IxLF9qdmJLOFVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0IyIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0IyLF9rWWpuZ0VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjIiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQjEiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L21hbmRhdG9yeUlucHV0PgotPG9wdGlvbmFsSW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjIiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IyIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjIiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyL3Rhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyL3Rhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyL3Rhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQjIsX2tZX3NZRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImRlbGl2ZXJhYmxlX0IyIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQjIsX2tZX3NZVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0IyLF9rWV9zWWtBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQjIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9CMixfa1pKZFlFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0IyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQjIsX2taSmRZVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQTIiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTIgIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFza19BMixfYTBna3dFQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0EyIj4KLTwvVGFzaz4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0ExIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQTIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0EyIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMiI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0EyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0EyLF9hMXRlb0VBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0EyLF9hMmRGZ0VBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfYTNNc1lFQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsX2E0R0VRRUEzRWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0EyLF9hNDFySUVBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+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+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+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+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08Q2FwYWJpbGl0eVBhdHRlcm4gbmFtZT0iQ1AgQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ1AgQTEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9IkNQIEExLF9kQmh2a1VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiIgZXh0ZXJuYWxJZD0iIiBzY29wZT0iIiB1c2FnZU5vdGVzPSIiPgotPC9Qcm9jZXNzRGVzY3JpcHRpb24+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvQWN0MSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9DUCBBMSI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvQ2FwYWJpbGl0eVBhdHRlcm4+Ci08L1Byb2Nlc3NDb21wb25lbnQ+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9ImRlbFByb2NfQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NfQTEiPgotPC9wYXJlbnRQYWNrYWdlPgotPERlbGl2ZXJ5UHJvY2VzcyBuYW1lPSJkZWxQcm9jX0ExIiBicmllZkRlc2NyaXB0aW9uPSJEZWxQcm9jIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxQcm9jIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iRGVsUHJvYyBBMSxfVzZhNGNSQk5FZHFCczdLaGRWTFJMQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRlbFByb2MgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkRlbFByb2MgQTEga2V5IGNvbiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSJEZWxQcm9jIEExIHBvcnBvaXNlIiBhbHRlcm5hdGl2ZXM9IkRlbFByb2MgQTEgYWx0ZXJuIiBob3d0b1N0YWZmPSJEZWxQcm9jIEExIHN0YWZmIiBleHRlcm5hbElkPSJEZWxQcm9jIEExIGV4dGVybklEIiBzY29wZT0iRGVsUHJvYyBBMSBzY29wZSIgdXNhZ2VOb3Rlcz0iRGVsUHJvYyBBMSB1c2FnZSIgc2NhbGU9IkRlbFByb2MgQTEgc2NhbGUiIHByb2plY3RDaGFyYWN0ZXJpc3RpY3M9IkRlbFByb2MgQTEgcHJvaiBjaGFyIiByaXNrTGV2ZWw9IkRlbFByb2MgQTEgcmlzayIgZXN0aW1hdGluZ1RlY2huaXF1ZT0iRGVsUHJvYyBBMSBlc3QgdGVjaCIgcHJvamVjdE1lbWJlckV4cGVydGlzZT0iRGVsUHJvYyBBMSBleHBlcnRpc2UiIHR5cGVPZkNvbnRyYWN0PSJEZWxQcm9jIEExIGNvbnR5cGUiPgotPC9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbj4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY19BMS9kZWxQcm9jX0ExIj4KLTwvZGVmYXVsdENvbnRleHQ+Ci08dmFsaWRDb250ZXh0IHBhdGg9IkNvbmZpZyBBIj4KLTwvdmFsaWRDb250ZXh0PgotPC9EZWxpdmVyeVByb2Nlc3M+Ci08L1Byb2Nlc3NDb21wb25lbnQ+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iZGVsUHJvY1BhayBBMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrIEExIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9ImRlbFByb2NQYWtfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1BhayBBMS9kZWxQcm9jUGFrX0ExLjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPERlbGl2ZXJ5UHJvY2VzcyBuYW1lPSJkZWxQcm9jUGFrX0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IkRlbFByb2NQYWsgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsUHJvY1BhayBBMS4xIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iZGVsUHJvY1Bha19BMS4xLF91cTVLOFJNMUVkcXFuZGktZ0R1eHB3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRGVsUHJvY1BhayBBMS4xIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEZWxQcm9jUGFrIEExLjEga2V5IiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IkRlbFByb2NQYWsgQTEuMSBwb3Jwb2lzZSIgYWx0ZXJuYXRpdmVzPSJEZWxQcm9jUGFrIEExLjEgYWx0IiBob3d0b1N0YWZmPSJEZWxQcm9jUGFrIEExLjEgc3RhZmYiIGV4dGVybmFsSWQ9IkRlbFByb2NQYWsgQTEuMSBleHRlcm5JRCIgc2NvcGU9IkRlbFByb2NQYWsgQTEuMSBzY29wZSIgdXNhZ2VOb3Rlcz0iRGVsUHJvY1BhayBBMS4xIHVzYWdlIiBzY2FsZT0iRGVsUHJvY1BhayBBMS4xIHNjYWxlIiBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzPSJEZWxQcm9jUGFrIEExLjEgY2hhciIgcmlza0xldmVsPSJEZWxQcm9jUGFrIEExLjEgcmlzayIgZXN0aW1hdGluZ1RlY2huaXF1ZT0iRGVsUHJvY1BhayBBMS4xJmFtcDtuYnNwO2VzdGltYXRpbmcgdGVjaCZsdDshLS1TdGFydEZyYWdtZW50LS0mZ3Q7Jmx0OyEtLUVuZEZyYWdtZW50LS0mZ3Q7IiBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPSJEZWxQcm9jUGFrIEExLjEgZXhwZXJ0aXNlIiB0eXBlT2ZDb250cmFjdD0iRGVsUHJvY1BhayBBMS4xJmFtcDtuYnNwO2NvbnRyYWN0Ij4KLTwvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24+Ci08ZGVmYXVsdENvbnRleHQgcGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWsgQTEvZGVsUHJvY1Bha19BMS4xL2RlbFByb2NQYWtfQTEuMSI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvRGVsaXZlcnlQcm9jZXNzPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPC9NZXRob2RQbHVnaW4+Ci08L1Rlc3Rlck91dHB1dD4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy9TdWJEaXJfMS8ybmRUZXN0LnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzL1N1YkRpcl8xLzJuZFRlc3QudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NWIxZjMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzL1N1YkRpcl8xLzJuZFRlc3QudGMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0IGRpc2FibGU9InRydWUiPgotCQotCTxDb3B5TGlicmFyeSBsaWJGb2xkZXJOYW1lPSIuLi8uLi9FeHBvcnRJbXBvcnQvUGFyaXMiPgotCTwvQ29weUxpYnJhcnk+CQotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSJQYXJpcyI+Ci0JPC9PcGVuTGlicmFyeT4KLQkKLQk8RXhwb3J0Q29uZmlndXJhdGlvbiBleHBvcnRGb2xkZXJOYW1lPSJFeHBvcnQwMDAxIiBzZWxlY3RlZENvbmZpZ05hbWU9IkNvbmZpZyBBIj4KLQk8L0V4cG9ydENvbmZpZ3VyYXRpb24+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IkJhc2VfMSI+Ci0JPC9PcGVuTGlicmFyeT4KLQkKLQk8SW1wb3J0Q29uZmlndXJhdGlvbiBpbXBvcnRGb2xkZXJOYW1lPSJFeHBvcnQwMDAxIj4KLQk8L0ltcG9ydENvbmZpZ3VyYXRpb24+Ci0JCi0JPENvbXBhcmVUb0xpYnJhcnkgCi0JCWdvbGRlbkxpYkZvbGRlck5hbWU9IlBhcmlzIiAKLQkJZGlmZkNvdW50PSIwIiAKLQkJZWxlbWVudENvdW50PSIwIgotCQl1c2VOYW1lQXNJZD0iZmFsc2UiPgotCQkKLQk8L0NvbXBhcmVUb0xpYnJhcnk+Ci0KLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzL1N1YkRpcl8xL1N1YlN1Yi8zcmRUZXN0LnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzL1N1YkRpcl8xL1N1YlN1Yi8zcmRUZXN0LnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTgzODMwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy9TdWJEaXJfMS9TdWJTdWIvM3JkVGVzdC50YworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08TWV0aG9kTGlicmFyeVRlc3Q+Ci0JCi0JPENvcHlMaWJyYXJ5IGxpYkZvbGRlck5hbWU9Ii4uLy4uLy4uL0V4cG9ydEltcG9ydC9QYXJpcyI+Ci0JPC9Db3B5TGlicmFyeT4JCi0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IlBhcmlzIj4KLQk8L09wZW5MaWJyYXJ5PgotCQotCTxFeHBvcnRYbWwgZXhwb3J0Rm9sZGVyTmFtZT0iRXhwb3J0MDAwMSI+Ci0JPC9FeHBvcnRYbWw+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IkJhc2VfMSI+Ci0JPC9PcGVuTGlicmFyeT4KLQkKLQk8SW1wb3J0WG1sIGltcG9ydEZvbGRlck5hbWU9IkV4cG9ydDAwMDEiIG1lcmdlPSJmYWxzZSI+Ci0JPC9JbXBvcnRYbWw+Ci0JCi0JPENvbXBhcmVUb0xpYnJhcnkgCi0JCWdvbGRlbkxpYkZvbGRlck5hbWU9IlBhcmlzIiAKLQkJZGlmZkNvdW50PSIyOCIgCi0JCWVsZW1lbnRDb3VudD0iMzcwIgotCQl1c2VOYW1lQXNJZD0idHJ1ZSI+Ci0JCQotCTwvQ29tcGFyZVRvTGlicmFyeT4KLQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvU3ViRGlyXzIvMXN0VGVzdC50YyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy9TdWJEaXJfMi8xc3RUZXN0LnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2IzMDhmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy9TdWJEaXJfMi8xc3RUZXN0LnRjCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdCBkaXNhYmxlPSJ0cnVlIj4KLQkKLQk8Q29weUxpYnJhcnkgbGliRm9sZGVyTmFtZT0iLi4vLi4vRXhwb3J0SW1wb3J0L1BhcmlzIj4KLQk8L0NvcHlMaWJyYXJ5PgkKLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iUGFyaXMiPgotCTwvT3BlbkxpYnJhcnk+Ci0JCi0JPEV4cG9ydFBsdWdpbnMgZXhwb3J0Rm9sZGVyTmFtZT0iRXhwb3J0ZWQwMDEiPgotCTwvRXhwb3J0UGx1Z2lucz4KLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iQmFzZV8xIj4KLQk8L09wZW5MaWJyYXJ5PgotCQotCTxJbXBvcnRQbHVnaW5zIGltcG9ydEZvbGRlck5hbWU9IkV4cG9ydGVkMDAxIj4KLQk8L0ltcG9ydFBsdWdpbnM+Ci0JCi0JPENvbXBhcmVUb0xpYnJhcnkgCi0JCWdvbGRlbkxpYkZvbGRlck5hbWU9IlBhcmlzIiAKLQkJZGlmZkNvdW50PSIwIiAKLQkJZWxlbWVudENvdW50PSIwIgotCQl1c2VOYW1lQXNJZD0iZmFsc2UiPgotCQkKLQk8L0NvbXBhcmVUb0xpYnJhcnk+Ci0KLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzL1N1YkRpcl8yLzJuZFRlc3QudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvU3ViRGlyXzIvMm5kVGVzdC50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2YTI4Ny4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvU3ViRGlyXzIvMm5kVGVzdC50YworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08TWV0aG9kTGlicmFyeVRlc3Q+Ci0JCi0JPENvcHlMaWJyYXJ5IGxpYkZvbGRlck5hbWU9Ii4uLy4uL0V4cG9ydEltcG9ydC9QYXJpcyI+Ci0JPC9Db3B5TGlicmFyeT4JCi0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IlBhcmlzIj4KLQk8L09wZW5MaWJyYXJ5PgotCQotCTxFeHBvcnRDb25maWd1cmF0aW9uIGV4cG9ydEZvbGRlck5hbWU9IkV4cG9ydDAwMDEiIHNlbGVjdGVkQ29uZmlnTmFtZT0iQ29uZmlnIEEiPgotCTwvRXhwb3J0Q29uZmlndXJhdGlvbj4KLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iQmFzZV8xIj4KLQk8L09wZW5MaWJyYXJ5PgotCQotCTxJbXBvcnRDb25maWd1cmF0aW9uIGltcG9ydEZvbGRlck5hbWU9IkV4cG9ydDAwMDEiPgotCTwvSW1wb3J0Q29uZmlndXJhdGlvbj4KLQkKLQk8Q29tcGFyZVRvTGlicmFyeSAKLQkJZ29sZGVuTGliRm9sZGVyTmFtZT0iUGFyaXMiIAotCQlkaWZmQ291bnQ9IjAiIAotCQllbGVtZW50Q291bnQ9IjAiCi0JCXVzZU5hbWVBc0lkPSJmYWxzZSI+Ci0JCQotCTwvQ29tcGFyZVRvTGlicmFyeT4KLQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9lZGl0QWxsRWxlbWVudHMudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9lZGl0QWxsRWxlbWVudHMudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMDI2Y2YuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvZWRpdEFsbEVsZW1lbnRzLnRjCisrKyAvZGV2L251bGwKQEAgLTEsNTU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08TWV0aG9kTGlicmFyeVRlc3QgZGlzYWJsZT0iZmFsc2UiIHZlcmJvc2U9ImZhbHNlIj4KLQkKLTwhLS0gVGhpcyBjYXNlIGluY2x1ZGVzIGNyZWF0aW5nIGFuZCBlZGl0bmcgYWxtb3N0IGV2ZXJ5IHR5cGUgb2YgbWVodG9kIGVsZW1lbnQgLS0+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9ImFsbEVsZW1lbnRzIj4KLQk8L09wZW5MaWJyYXJ5PgkKLQkKLTwhLS0gUGx1ZyBBIC0tPgotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9Ik1ldGhvZFBsdWdpbiIgCi0JCW5hbWU9IlBsdWcgQSIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBQbHVnIEEiCi0JCWF1dGhvcnM9IlBsdWcgQSBBdXRob3IiCQotCQk+CQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0KLTwhLS0gY29udGVudF9wYWNrYWdlX0ExIC0tPgotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IkNvbnRlbnRQYWNrYWdlIgotCQluYW1lPSJjb250ZW50X3BhY2thZ2VfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50IgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIGNvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLTwhLS0gQ29uZmlnX0EgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJNZXRob2RDb25maWd1cmF0aW9uIgotCQluYW1lPSJDb25maWdfQSIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBDb25maWdfQSIKLQkJPgotCSAgPG1ldGhvZFBsdWdpblNlbGVjdGlvbj4KLQkgIAk8VmFsdWU+UGx1ZyBBPC9WYWx1ZT4KLSAgCSAgPC9tZXRob2RQbHVnaW5TZWxlY3Rpb24+Ci0JCQkJCQotCSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci0JICAJPFZhbHVlPlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMTwvVmFsdWU+Ci0gIAkgIDwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQkJCQotCQotPCEtLSByb2xlX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJSb2xlIgotCQluYW1lPSJyb2xlX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iUm9sZSBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgQTEga2V5IgotCQkJc2tpbGxzPSJSb2xlIEExIHNraWxscyIKLQkJCWFzc2lnbm1lbnRBcHByb2FjaGVzPSJSb2xlIEExIGFzc2lnIEFwcCIKLQkJCXN5bm9ueW1zPSJSb2xlIHN5biIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi08IS0tIHRhc2tfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IlRhc2siCi0JCW5hbWU9InRhc2tfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJUYXNrIEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iVGFzayBBMSBrZXkiCi0JCQlza2lsbHM9IlRhc2sgQTEgc2tpbGxzIgotCQkJYXNzaWdubWVudEFwcHJvYWNoZXM9IlRhc2sgQTEgYXNzaWcgQXBwIgotCQkJc3lub255bXM9IlRhc2sgc3luIgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4KLQkJCQotCQk8b3duZWRSdWxlcyBib2R5PSJCb2R5IDEiIC8+Ci0JCTxvd25lZFJ1bGVzIGJvZHk9IkJvZHkgMiIgLz4KLQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLTwhLS0gYXJ0aWZhY3RfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IkFydGlmYWN0IgotCQluYW1lPSJhcnRpZmFjdF9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IkFydGlmaWZhY3QgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJBcnRpZmlmYWN0IEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCi08IS0tIGRlbGl2ZXJhYmxlX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJEZWxpdmVyYWJsZSIKLQkJbmFtZT0iZGVsaXZlcmFibGVfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IkRlbGl2ZXJhYmxlIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCi08IS0tIG91dGNvbWVfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9Ik91dGNvbWUiCi0JCW5hbWU9Im91dGNvbWVfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iT3V0Y29tZSBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi08IS0tIGNvbmNlcHRfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IkNvbmNlcHQiCi0JCW5hbWU9ImNvbmNlcHRfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJDb25jZXB0IEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iQ29uY2VwdCBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLTwhLS0gY2hlY2tsaXN0X0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJDaGVja2xpc3QiCi0JCW5hbWU9ImNoZWNrbGlzdF9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IkNoZWNrbGlzdCBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IkNoZWNrbGlzdCBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi08IS0tIGV4YW1wbGVfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IkV4YW1wbGUiCi0JCW5hbWU9ImV4YW1wbGVfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJFeGFtcGxlIEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iRXhhbXBsZSBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCQotCQotPCEtLSBndWlkZWxpbmVfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9Ikd1aWRlbGluZSIKLQkJbmFtZT0iZ3VpZGVsaW5lX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iR3VpZGVsaW5lIEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iR3VpZGVsaW5lIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQotCQkKLTwhLS0gcmVwb3J0X0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJSZXBvcnQiCi0JCW5hbWU9InJlcG9ydF9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IlJlcG9ydCBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlJlcG9ydCBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLTwhLS0gdGVtcGxhdGVfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IlRlbXBsYXRlIgotCQluYW1lPSJ0ZW1wbGF0ZV9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IlRlbXBsYXRlIEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iVGVtcGxhdGUgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi08IS0tIHN1cHBvcnRpbmdfbWF0ZXJpYWxfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IlN1cHBvcnRpbmdNYXRlcmlhbCIKLQkJbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IlN1cHBvcnRpbmdfbWF0ZXJpYWwgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJTdXBwb3J0aW5nX21hdGVyaWFsIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotPCEtLSB0b29sbWVudG9yX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJUb29sTWVudG9yIgotCQluYW1lPSJ0b29sbWVudG9yX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iVG9vbG1lbnRvciBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlRvb2xtZW50b3IgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQkJCi0KLTwhLS0gd2hpdGVwYXBlcl9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iV2hpdGVwYXBlciIKLQkJbmFtZT0id2hpdGVwYXBlcl9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJXaGl0ZXBhcGVyIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLTwhLS0gcHJhY3RpY2VfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IlByYWN0aWNlIgotCQluYW1lPSJwcmFjdGljZV9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IlByYWN0aWNlIEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iUHJhY3RpY2UgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi08IS0tIHJldXNhYmxlX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJSZXVzYWJsZUFzc2V0IgotCQluYW1lPSJyZXVzYWJsZV9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IlJldXNhYmxlIEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iUmV1c2FibGUgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotPCEtLSByb2FkbWFwX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJSb2FkbWFwIgotCQluYW1lPSJyb2FkbWFwX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iUm9hZG1hcCBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlJvYWRtYXAgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi08IS0tIHRlcm1fZGVmaW5pdGlvbl9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iVGVybURlZmluaXRpb24iCi0JCW5hbWU9InRlcm1fZGVmaW5pdGlvbl9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IlRlcm1fZGVmaW5pdGlvbiBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlRlcm1fZGVmaW5pdGlvbiBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLTwhLS0gZGlzY2lwbGluZV9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iRGlzY2lwbGluZSIKLQkJbmFtZT0iZGlzY2lwbGluZV9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcyIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iRGlzY2lwbGluZSBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQk8dGFza3M+Ci0JCQk8VmFsdWU+UGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTE8L1ZhbHVlPgotCQk8L3Rhc2tzPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi08IS0tIGRpc2NpcGxpbmVfZ3JvdXBpbmdfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IkRpc2NpcGxpbmVHcm91cGluZyIKLQkJbmFtZT0iZGlzY2lwbGluZV9ncm91cGluZ19BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcyIKLQkJPgkJCQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IkRpc2NpcGxpbmVHcm91cGluZyBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IkRpc2NpcGxpbmVHcm91cGluZyBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQk8ZGlzY2lwbGluZXM+Ci0JCQk8VmFsdWU+UGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0ExPC9WYWx1ZT4KLQkJPC9kaXNjaXBsaW5lcz4JCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi0JCi08IS0tIGRpc2NpcGxpbmVfQTIgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IkRpc2NpcGxpbmUiCi0JCW5hbWU9ImRpc2NpcGxpbmVfQTIiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBBMiBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IkRpc2NpcGxpbmUgQTIga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQkJCQkJCQkJCQkJCQkJCi0JCQotPCEtLSBkb21haW5fQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IkRvbWFpbiIKLQkJbmFtZT0iZG9tYWluX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0RvbWFpbnMiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iRG9tYWluIEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iRG9tYWluIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+Ci0JCTxzdWJkb21haW5zIAotCQkJbmFtZT0ic3ViX2RvbWFpbl9BMSIKLQkJCT4KLQkJCTxwcmVzZW50YXRpb24KLQkJCQltYWluRGVzY3JpcHRpb249IlN1YiBEb21haW4gQTEgbWFpbiIKLQkJCQlrZXlDb25zaWRlcmF0aW9ucz0iU3ViIERvbWFpbiBBMSBrZXkiCi0JCQkJPgkJCQotCQkJPC9wcmVzZW50YXRpb24+Ci0JCTwvc3ViZG9tYWlucz4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQkJCi0JCQotPCEtLSB3b3JrX3Byb2R1Y3RfdHlwZV9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iV29ya1Byb2R1Y3RUeXBlIgotCQluYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9XUCBUeXBlcyIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJXb3JrUHJvZHVjdFR5cGUgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJXb3JrUHJvZHVjdFR5cGUgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi08IS0tIHJvbGVfc2V0X0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJSb2xlU2V0IgotCQluYW1lPSJyb2xlX3NldF9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cyIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJSb2xlU2V0IEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iUm9sZVNldCBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQk8cm9sZXM+Ci0JCQk8VmFsdWU+UGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTE8L1ZhbHVlPgotCQk8L3JvbGVzPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi08IS0tIHJvbGVfc2V0X2dyb3VwaW5nX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJSb2xlU2V0R3JvdXBpbmciCi0JCW5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzIgotCQk+CQkJCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iUm9sZVNldEdyb3VwaW5nIEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iUm9sZVNldEdyb3VwaW5nIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+Ci0JCTxyb2xlU2V0cz4KLQkJCTxWYWx1ZT5QbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzL3JvbGVfc2V0X0ExPC9WYWx1ZT4KLQkJPC9yb2xlU2V0cz4JCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi0JCi08IS0tIHJvbGVfc2V0X0EyIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJSb2xlU2V0IgotCQluYW1lPSJyb2xlX3NldF9BMiIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cyIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJSb2xlU2V0IEEyIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iUm9sZVNldCBBMiBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQk8cm9sZXM+Ci0JCQk8VmFsdWU+UGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTE8L1ZhbHVlPgotCQk8L3JvbGVzPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLQkKLTwhLS0gdG9vbF9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iVG9vbCIKLQkJbmFtZT0idG9vbF9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Ub29scyIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJUb29sIEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iVG9vbCBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotPCEtLSBzdWJfY3VzdG9tX2NhdGVnb3J5X0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJDdXN0b21DYXRlZ29yeSIKLQkJbmFtZT0ic3ViX2N1c3RvbV9jYXRlZ29yeV9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249InN1Yl9jdXN0b21fY2F0ZWdvcnlfQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJzdWJfY3VzdG9tX2NhdGVnb3J5X0ExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+Ci0JCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotPCEtLSBjdXN0b21fY2F0ZWdvcnlfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IkN1c3RvbUNhdGVnb3J5IgotCQluYW1lPSJjdXN0b21fY2F0ZWdvcnlfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcyIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJjdXN0b21fY2F0ZWdvcnlfQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJjdXN0b21fY2F0ZWdvcnlfQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4KLQkJPGNhdGVnb3JpemVkRWxlbWVudHM+Ci0JCQk8VmFsdWU+UGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL3N1Yl9jdXN0b21fY2F0ZWdvcnlfQTE8L1ZhbHVlPgotCQk8L2NhdGVnb3JpemVkRWxlbWVudHM+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotCTwhLS0gY3VzdG9tX2NhdGVnb3J5X0EyIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJDdXN0b21DYXRlZ29yeSIKLQkJbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0EyIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iY3VzdG9tX2NhdGVnb3J5X0EyIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iY3VzdG9tX2NhdGVnb3J5X0EyIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQ3VzdG9tQ2F0ZWdvcnkiCi0JCXBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9IaWRkZW4vQ3VzdG9tIENhdGVnb3JpZXMiCi0JCT4JCi0JCTxjYXRlZ29yaXplZEVsZW1lbnRzPgotCQkJPFZhbHVlPlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTE8L1ZhbHVlPgotCQkJPFZhbHVlPlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTI8L1ZhbHVlPgkJCQotCQk8L2NhdGVnb3JpemVkRWxlbWVudHM+CQkJCQotCTwvRWRpdE1ldGhvZEVsZW1lbnQ+CQkJCQkJCQkJCQkJCQkJCi0JCQotPCEtLSBjYXBQYXRQYWtfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IlByb2Nlc3NQYWNrYWdlIgotCQluYW1lPSJjYXBQYXRQYWtfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyIKLQkJPgkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotPCEtLSBDUDEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQluYW1lPSJDUDEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iQ1AxIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iQ1AxIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+Ci0JCTxkZWZhdWx0Q29udGV4dD4KLQkJCTxWYWx1ZT5Db25maWdfQTwvVmFsdWU+Ci0JCTwvZGVmYXVsdENvbnRleHQ+Ci0JCTx2YWxpZENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L3ZhbGlkQ29udGV4dD4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQkKLQkKLTwhLS0gQ1AxX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJDYXBhYmlsaXR5UGF0dGVybiIKLQkJbmFtZT0iQ1AxX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iQ1AxX0ExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iQ1AxX0ExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+Ci0JCTxkZWZhdWx0Q29udGV4dD4KLQkJCTxWYWx1ZT5Db25maWdfQTwvVmFsdWU+Ci0JCTwvZGVmYXVsdENvbnRleHQ+Ci0JCTx2YWxpZENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L3ZhbGlkQ29udGV4dD4JCQkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQkKLQkKLTwhLS0gZGVsUHJvY1Bha19BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IlByb2Nlc3NQYWNrYWdlIgotCQluYW1lPSJkZWxQcm9jUGFrX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMiCi0JCT4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotPCEtLSBEUDEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IkRlbGl2ZXJ5UHJvY2VzcyIKLQkJbmFtZT0iRFAxIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1Bha19BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJEUDEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJEUDEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4KLQkJPGRlZmF1bHRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC9kZWZhdWx0Q29udGV4dD4KLQkJPHZhbGlkQ29udGV4dD4KLQkJCTxWYWx1ZT5Db25maWdfQTwvVmFsdWU+Ci0JCTwvdmFsaWRDb250ZXh0PgkJCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQkKLQkJCi0JPE91dHB1dExpYnJhcnkgb3V0cHV0RmlsZU5hbWU9InQueG1sIi8+CQotCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL2tlbHZpbkNhc2UudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9rZWx2aW5DYXNlLnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzZhNmE2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL2tlbHZpbkNhc2UudGMKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0IGRpc2FibGU9ImZhbHNlIj4KLQkKLTwhLS0gMS4gQ3JlYXRlIGEgbmV3IG1ldGhvZCBsaWJyYXJ5IC0tPgkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0ia2VsdmluQ2FzZSI+Ci0JPC9PcGVuTGlicmFyeT4JCi0JCi08IS0tIDIuIENyZWF0ZSBhIG5ldyBwbHVnaW5fMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iTWV0aG9kUGx1Z2luIiAKLQkJbmFtZT0icGx1Z2luXzEiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgcGx1Z2luXzEiCi0JCWF1dGhvcnM9IktlbHZpbiIJCi0JCT4JCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkJCi08IS0tIDMuIENyZWF0ZSBhIG5ldyBjb250ZW50UGFja2FnZV8xIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJDb250ZW50UGFja2FnZSIKLQkJbmFtZT0iY29udGVudFBhY2thZ2VfMSIKLQkJcGFyZW50UGF0aD0icGx1Z2luXzEvQ29udGVudC9Db3JlQ29udGVudCIKLQkJPgkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi08IS0tIDQuIENyZWF0ZSBhIG5ldyB0YXNrXzEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IlRhc2siCi0JCW5hbWU9InRhc2tfMSIKLQkJcGFyZW50UGF0aD0icGx1Z2luXzEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50UGFja2FnZV8xIgotCQk+CQotCQk8cHJlc2VudGF0aW9uIAotCQkJbWFpbkRlc2NyaXB0aW9uPSJUaGlzIGlzIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRhc2tfMSI+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotPCEtLSA1LiBDcmVhdGUgYSBuZXcgY29uZmlnXzEgdGhhdCBpbmNsdWRlcyBwbHVnaW5fMSAmIGNvbnRlbnRQYWNrYWdlXzEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJNZXRob2RDb25maWd1cmF0aW9uIgotCQluYW1lPSJjb25maWdfMSIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBjb25maWdfMSIKLQkJPgotCSAgPG1ldGhvZFBsdWdpblNlbGVjdGlvbj4KLQkgIAk8VmFsdWU+cGx1Z2luXzE8L1ZhbHVlPgotICAJICA8L21ldGhvZFBsdWdpblNlbGVjdGlvbj4KLQkJCQkJCi0JICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLQkgIAk8VmFsdWU+cGx1Z2luXzEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50UGFja2FnZV8xPC9WYWx1ZT4KLSAgCSAgPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi08IS0tIDYuIENyZWF0ZSBhIG5ldyBjcF8xIHVzaW5nIGNvbmZpZ18xIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudCAKLQkJdHlwZT0iQ2FwYWJpbGl0eVBhdHRlcm4iCi0JCXBhcmVudFBhdGg9InBsdWdpbl8xL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIgotCQluYW1lPSJjcF8xIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIGNwXzEiCi0JCT4JCQotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Y29uZmlnXzE8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgotCQkJCQotCQk8cHJlc2VudGF0aW9uIAotCQkJbWFpbkRlc2NyaXB0aW9uPSJUaGlzIGlzIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIGNwXzEiPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQkKLTwhLS0gNi4gQWRkIGEgbmV3IHRkXzEgdG8gY3BfMSB0aGF0IGlzIGxpbmtlZCB0byB0YXNrXzEgLS0+CQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgCi0JCXR5cGU9IlRhc2tEZXNjcmlwdG9yIgotCQlwYXJlbnRQYXRoPSJwbHVnaW5fMS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcF8xIgotCQluYW1lPSJ0ZF8xIgotCQk+Ci0JCTxUYXNrPgotCQkJPFZhbHVlPnBsdWdpbl8xL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudFBhY2thZ2VfMS90YXNrXzE8L1ZhbHVlPgotCQk8L1Rhc2s+CQkJCQotCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotPCEtLSA3LiBTdXBwcmVzcyB0ZF8xIC0tPgkJCQotCTxFZGl0TWV0aG9kRWxlbWVudCAKLQkJdHlwZT0iVGFza0Rlc2NyaXB0b3IiCi0JCXBhdGg9InBsdWdpbl8xL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NwXzEvdGRfMSIKLQkJc3VwcHJlc3NlZD0idHJ1ZSIKLQkJPgkKLQk8L0VkaXRNZXRob2RFbGVtZW50PiAJCQkKLQkKLQk8T3V0cHV0TGlicmFyeSBvdXRwdXRGaWxlTmFtZT0idC54bWwiLz4JCi0JCi0JPENvbXBhcmVUb0dvbGRlbkZpbGUgIAotCQlnb2xkZW5GaWxlTmFtZT0ia2VsdmluQ2FzZS54bWwiIAotCQlkaWZmQ291bnQ9IjAiIAotCQllbGVtZW50Q291bnQ9IjM1IgotCQk+Ci0JPC9Db21wYXJlVG9Hb2xkZW5GaWxlPgotCQotCQkKLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMva2VsdmluQ2FzZS54bWwgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9rZWx2aW5DYXNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlMzczZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9rZWx2aW5DYXNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08VGVzdGVyT3V0cHV0PgotPE1ldGhvZExpYnJhcnkgYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGd1aWQ9Il9lYjktY05CV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJrZWx2aW5DYXNlIiBvcmRlcmluZ0d1aWRlPSIiIHBhdGg9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTxNZXRob2RQbHVnaW4gYXV0aG9ycz0iS2VsdmluIiBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIHBsdWdpbl8xIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfZWhmLXNOQldFZHlTS09jQ0xMdFRaUSIgbmFtZT0icGx1Z2luXzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdXNlckNoYW5nZWFibGU9InRydWUiIHZlcnNpb249IiI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfZWhmLXNkQldFZHlTS09jQ0xMdFRaUSIgbmFtZT0iQ29udGVudCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9laGYtc3RCV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJDYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX2VoZi1zOUJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9IkRvbWFpbnMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX2VoZi10TkJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9IkRpc2NpcGxpbmVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9laGYtdGRCV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJSb2xlU2V0cyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfZWhmLXR0QldFZHlTS09jQ0xMdFRaUSIgbmFtZT0iV1AgVHlwZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX2VoZi10OUJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9IlRvb2xzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9laGYtdU5CV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX2VoZi11ZEJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfZWhmLXV0QldFZHlTS09jQ0xMdFRaUSIgbmFtZT0iSGlkZGVuIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPEN1c3RvbUNhdGVnb3J5IGJyaWVmRGVzY3JpcHRpb249IiIgZ3VpZD0iX2VoZi11OUJXRWR5U0tPY0NMTHRUWlEiIGlzQWJzdHJhY3Q9ImZhbHNlIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGV4dGVybmFsSWQ9IiIgZ3VpZD0iLVBsQ0ZFNHhvNW8zWE81ZmxFcllqTlEiIGtleUNvbnNpZGVyYXRpb25zPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyxfZWhmLXU5QldFZHlTS09jQ0xMdFRaUSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2ZXJzaW9uPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0N1c3RvbUNhdGVnb3J5PgotPC9Db250ZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX2VoZi12TkJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9IkNvcmVDb250ZW50IiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX2VtZC1RTkJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9ImNvbnRlbnRQYWNrYWdlXzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08VGFzayBicmllZkRlc2NyaXB0aW9uPSIiIGd1aWQ9Il9lbTJZd05CV0VkeVNLT2NDTEx0VFpRIiBpc0Fic3RyYWN0PSJmYWxzZSIgbmFtZT0idGFza18xIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFRhc2tEZXNjcmlwdGlvbiBhbHRlcm5hdGl2ZXM9IiIgYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURhdGU9IlRodSBKYW4gMzEgMTU6NDQ6MzUgUFNUIDIwMDgiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGV4dGVybmFsSWQ9IiIgZ3VpZD0iLS03a2p5VWpSZm10T2prUXBzQ3pIV1EiIGtleUNvbnNpZGVyYXRpb25zPSIiIG1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0YXNrXzEiIG5hbWU9InRhc2tfMSxfZW0yWXdOQldFZHlTS09jQ0xMdFRaUSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHB1cnBvc2U9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHZlcnNpb249IiI+Ci08L1Rhc2tEZXNjcmlwdGlvbj4KLTwvVGFzaz4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX2VoZi12ZEJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxQcm9jZXNzQ29tcG9uZW50IGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfZXJKcDhOQldFZHlTS09jQ0xMdFRaUSIgbmFtZT0iY3BfMSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2ZXJzaW9uPSIiPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX2VzeGFrZEJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9InRkXzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08VGFza0Rlc2NyaXB0b3IgYnJpZWZEZXNjcmlwdGlvbj0iIiBndWlkPSJfZXN4YWtOQldFZHlTS09jQ0xMdFRaUSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzQWJzdHJhY3Q9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUGxhbm5lZD0idHJ1ZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBuYW1lPSJ0ZF8xIiBvcmRlcmluZ0d1aWRlPSIiIHByZWZpeD0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBhdXRob3JzPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgZXh0ZXJuYWxJZD0iIiBndWlkPSItR1BZTW41OFhlemE5OGVMQVNuQndUdyIga2V5Q29uc2lkZXJhdGlvbnM9IiIgbWFpbkRlc2NyaXB0aW9uPSIiIG5hbWU9InRkXzEsX2VzeGFrTkJXRWR5U0tPY0NMTHRUWlEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHVzYWdlR3VpZGFuY2U9IiIgdmVyc2lvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJwbHVnaW5fMS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcF8xL2NwXzEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJwbHVnaW5fMS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRQYWNrYWdlXzEvdGFza18xIj4KLTwvVGFzaz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPENhcGFiaWxpdHlQYXR0ZXJuIGJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgY3BfMSIgZ3VpZD0iX2VxOWNzZEJXRWR5U0tPY0NMTHRUWlEiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc0Fic3RyYWN0PSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1BsYW5uZWQ9InRydWUiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIG5hbWU9ImNwXzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlZml4PSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFByb2Nlc3NEZXNjcmlwdGlvbiBhbHRlcm5hdGl2ZXM9IiIgYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURhdGU9IlRodSBKYW4gMzEgMTU6NDQ6MzUgUFNUIDIwMDgiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGV4dGVybmFsSWQ9IiIgZ3VpZD0iLUxKU1dJcG9USS1rOG5OaVRrY3BnemciIGhvd3RvU3RhZmY9IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgbWFpbkRlc2NyaXB0aW9uPSJUaGlzIGlzIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIGNwXzEiIG5hbWU9ImNwXzEsX2VxOWNzZEJXRWR5U0tPY0NMTHRUWlEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBwdXJwb3NlPSIiIHNjb3BlPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB1c2FnZUd1aWRhbmNlPSIiIHVzYWdlTm90ZXM9IiIgdmVyc2lvbj0iIj4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9InBsdWdpbl8xL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NwXzEvdGRfMS90ZF8xIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08ZGVmYXVsdENvbnRleHQgcGF0aD0iY29uZmlnXzEiPgotPC9kZWZhdWx0Q29udGV4dD4KLTwvQ2FwYWJpbGl0eVBhdHRlcm4+Ci08L1Byb2Nlc3NDb21wb25lbnQ+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9laGYtdnRCV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfZWhmLXY5QldFZHlTS09jQ0xMdFRaUSIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPC9NZXRob2RQbHVnaW4+Ci08TWV0aG9kQ29uZmlndXJhdGlvbiBhdXRob3JzPSIiIGJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgY29uZmlnXzEiIGNoYW5nZURhdGU9IlRodSBKYW4gMzEgMTU6NDQ6MzUgUFNUIDIwMDgiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGd1aWQ9Il9lcWxDTU5CV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJjb25maWdfMSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2ZXJzaW9uPSIiPgotPG1ldGhvZFBsdWdpblNlbGVjdGlvbiBwYXRoPSJwbHVnaW5fMSI+Ci08L21ldGhvZFBsdWdpblNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9InBsdWdpbl8xL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudFBhY2thZ2VfMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08L01ldGhvZENvbmZpZ3VyYXRpb24+Ci08L01ldGhvZExpYnJhcnk+Ci08L1Rlc3Rlck91dHB1dD4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZEVsZW1lbnRzL25ld0FjdGl2aXRpZXMudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RFbGVtZW50cy9uZXdBY3Rpdml0aWVzLnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDVjNTEzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZEVsZW1lbnRzL25ld0FjdGl2aXRpZXMudGMKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0IGRpc2FibGU9ImZhbHNlIj4KLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0ibmV3TGliIj4KLQk8L09wZW5MaWJyYXJ5PgkKLQkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJNZXRob2RQbHVnaW4iIAotCQluYW1lPSJQbHVnX0EiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgUGx1Z19BIgotCQlhdXRob3JzPSJTb21lYm9keSIJCi0JCT4JCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLQk8TmV3TWV0aG9kRWxlbWVudCAKLQkJdHlwZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIKLQkJbmFtZT0iQ29uZmlnX0EiCi0JCT4JCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQkJCQkJCQkJCQotCQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQ2FwYWJpbGl0eVBhdHRlcm4iCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyIKLQkJbmFtZT0iY3BfMSIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBjcF8xIgotCQk+CQkKLQkJPGRlZmF1bHRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC9kZWZhdWx0Q29udGV4dD4JCQotCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLQkKLQk8RWRpdE1ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQlwYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY3BfMSIJCi0JCT4JCi0JCTxwcmVzZW50YXRpb24gCi0JCQltYWluRGVzY3JpcHRpb249IlRoaXMgaXMgdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgY3BfMSI+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQotCQkJCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NwXzEiCi0JCW5hbWU9ImFjdF8xIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIGFjdF8xIgotCQk+CQkJCQotCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLQk8RWRpdE1ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY3BfMS9hY3RfMSIKLQkJPgkJCQkKLQkJPHByZXNlbnRhdGlvbiAKLQkJCW1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiBhY3RfMSI+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQotCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJQaGFzZSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NwXzEvYWN0XzEiCi0JCW5hbWU9InBoYXNlXzEiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgcGhhc2VfMSIKLQkJPgkJCQkKLQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JCi0JCi0JPE91dHB1dExpYnJhcnkgLz4JCi0JCi0JPENvbXBhcmVUb0dvbGRlbkZpbGUgIGRpc2FibGU9ImZhbHNlIgotCQlnb2xkZW5GaWxlTmFtZT0ibmV3QWN0aXZpdGllcy54bWwiIAotCQlkaWZmQ291bnQ9IjAiIAotCQllbGVtZW50Q291bnQ9IjM0IgotCQk+Ci0JPC9Db21wYXJlVG9Hb2xkZW5GaWxlPgotCQotCQkKLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kRWxlbWVudHMvbmV3QWN0aXZpdGllcy54bWwgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RFbGVtZW50cy9uZXdBY3Rpdml0aWVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEwYTA4MC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RFbGVtZW50cy9uZXdBY3Rpdml0aWVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08VGVzdGVyT3V0cHV0PgotPE1ldGhvZExpYnJhcnkgYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGd1aWQ9Il9vT3MxME5Ed0VkeU03UHkxbXNTYVdnIiBuYW1lPSJuZXdMaWIiIG9yZGVyaW5nR3VpZGU9IiIgcGF0aD0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2ZXJzaW9uPSIiPgotPE1ldGhvZFBsdWdpbiBhdXRob3JzPSJTb21lYm9keSIgYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBQbHVnX0EiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGd1aWQ9Il9vVVU4c05Ed0VkeU03UHkxbXNTYVdnIiBuYW1lPSJQbHVnX0EiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdXNlckNoYW5nZWFibGU9InRydWUiIHZlcnNpb249IiI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb1VVOHNkRHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iQ29udGVudCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vVVU4c3REd0VkeU03UHkxbXNTYVdnIiBuYW1lPSJDYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX29VVThzOUR3RWR5TTdQeTFtc1NhV2ciIG5hbWU9IkRvbWFpbnMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX29VVTh0TkR3RWR5TTdQeTFtc1NhV2ciIG5hbWU9IkRpc2NpcGxpbmVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vVVU4dGREd0VkeU03UHkxbXNTYVdnIiBuYW1lPSJSb2xlU2V0cyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb1VVOHR0RHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iV1AgVHlwZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX29VVTh0OUR3RWR5TTdQeTFtc1NhV2ciIG5hbWU9IlRvb2xzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vVVU4dU5Ed0VkeU03UHkxbXNTYVdnIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX29VVTh1ZER3RWR5TTdQeTFtc1NhV2ciIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb1VVOHV0RHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iSGlkZGVuIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPEN1c3RvbUNhdGVnb3J5IGJyaWVmRGVzY3JpcHRpb249IiIgZ3VpZD0iX29VVTh1OUR3RWR5TTdQeTFtc1NhV2ciIGlzQWJzdHJhY3Q9ImZhbHNlIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGV4dGVybmFsSWQ9IiIgZ3VpZD0iLXNNV1FiczYzUWRNNkJBeUVCWG9QZFEiIGtleUNvbnNpZGVyYXRpb25zPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyxfb1VVOHU5RHdFZHlNN1B5MW1zU2FXZyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2ZXJzaW9uPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0N1c3RvbUNhdGVnb3J5PgotPC9Db250ZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX29VVTh2TkR3RWR5TTdQeTFtc1NhV2ciIG5hbWU9IkNvcmVDb250ZW50IiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vVVU4dmREd0VkeU03UHkxbXNTYVdnIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08UHJvY2Vzc0NvbXBvbmVudCBhdXRob3JzPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX29Yd0VJZER3RWR5TTdQeTFtc1NhV2ciIG5hbWU9ImNwXzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTxQcm9jZXNzUGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vYUlwd2REd0VkeU03UHkxbXNTYVdnIiBuYW1lPSJhY3RfMSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxQcm9jZXNzUGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vYW5LNGREd0VkeU03UHkxbXNTYVdnIiBuYW1lPSJwaGFzZV8xIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPFBoYXNlIGJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgcGhhc2VfMSIgZ3VpZD0iX29hbks0TkR3RWR5TTdQeTFtc1NhV2ciIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc0Fic3RyYWN0PSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1BsYW5uZWQ9InRydWUiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIG5hbWU9InBoYXNlXzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlZml4PSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gYWx0ZXJuYXRpdmVzPSIiIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii1NR0ZqYUtFSndvd090QzY2YnNEMzV3IiBob3d0b1N0YWZmPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBuYW1lPSJwaGFzZV8xLF9vYW5LNE5Ed0VkeU03UHkxbXNTYVdnIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgcHVycG9zZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdXNhZ2VHdWlkYW5jZT0iIiB2ZXJzaW9uPSIiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY3BfMS9hY3RfMS9hY3RfMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTwvUGhhc2U+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPEFjdGl2aXR5IGJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgYWN0XzEiIGd1aWQ9Il9vYUlwd05Ed0VkeU03UHkxbXNTYVdnIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNBYnN0cmFjdD0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNQbGFubmVkPSJ0cnVlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBuYW1lPSJhY3RfMSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVmaXg9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08QWN0aXZpdHlEZXNjcmlwdGlvbiBhbHRlcm5hdGl2ZXM9IiIgYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURhdGU9IkZyaSBGZWIgMDEgMTA6MDg6MDMgUFNUIDIwMDgiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGV4dGVybmFsSWQ9IiIgZ3VpZD0iLVRyVmZ0eUhRckc1ZzhUTklWM2hPMnciIGhvd3RvU3RhZmY9IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgbWFpbkRlc2NyaXB0aW9uPSJUaGlzIGlzIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIGFjdF8xIiBuYW1lPSJhY3RfMSxfb2FJcHdORHdFZHlNN1B5MW1zU2FXZyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHB1cnBvc2U9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHVzYWdlR3VpZGFuY2U9IiIgdmVyc2lvbj0iIj4KLTwvQWN0aXZpdHlEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NwXzEvY3BfMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY3BfMS9hY3RfMS9waGFzZV8xL3BoYXNlXzEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTwvQWN0aXZpdHk+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPENhcGFiaWxpdHlQYXR0ZXJuIGJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgY3BfMSIgZ3VpZD0iX29Yd0VJTkR3RWR5TTdQeTFtc1NhV2ciIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc0Fic3RyYWN0PSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1BsYW5uZWQ9InRydWUiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIG5hbWU9ImNwXzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlZml4PSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFByb2Nlc3NEZXNjcmlwdGlvbiBhbHRlcm5hdGl2ZXM9IiIgYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURhdGU9IkZyaSBGZWIgMDEgMTA6MDg6MDMgUFNUIDIwMDgiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGV4dGVybmFsSWQ9IiIgZ3VpZD0iLV9YYTZxNFNlVXRUcjRkOFA3ZW9xQWciIGhvd3RvU3RhZmY9IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgbWFpbkRlc2NyaXB0aW9uPSJUaGlzIGlzIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIGNwXzEiIG5hbWU9ImNwXzEsX29Yd0VJTkR3RWR5TTdQeTFtc1NhV2ciIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBwdXJwb3NlPSIiIHNjb3BlPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB1c2FnZUd1aWRhbmNlPSIiIHVzYWdlTm90ZXM9IiIgdmVyc2lvbj0iIj4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcF8xL2FjdF8xL2FjdF8xIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08ZGVmYXVsdENvbnRleHQgcGF0aD0iQ29uZmlnX0EiPgotPC9kZWZhdWx0Q29udGV4dD4KLTwvQ2FwYWJpbGl0eVBhdHRlcm4+Ci08L1Byb2Nlc3NDb21wb25lbnQ+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vVVU4dnREd0VkeU03UHkxbXNTYVdnIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb1VVOHY5RHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPC9NZXRob2RQbHVnaW4+Ci08TWV0aG9kQ29uZmlndXJhdGlvbiBhdXRob3JzPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgY2hhbmdlRGF0ZT0iRnJpIEZlYiAwMSAxMDowODowMyBQU1QgMjAwOCIgY2hhbmdlRGVzY3JpcHRpb249IiIgZ3VpZD0iX29XX1BJTkR3RWR5TTdQeTFtc1NhV2ciIG5hbWU9IkNvbmZpZ19BIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHZlcnNpb249IiI+Ci08L01ldGhvZENvbmZpZ3VyYXRpb24+Ci08L01ldGhvZExpYnJhcnk+Ci08L1Rlc3Rlck91dHB1dD4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZEVsZW1lbnRzL25ld01ldGhvZEVsZW1lbnRzLnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kRWxlbWVudHMvbmV3TWV0aG9kRWxlbWVudHMudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MjdmYmIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kRWxlbWVudHMvbmV3TWV0aG9kRWxlbWVudHMudGMKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0IGRpc2FibGU9ImZhbHNlIj4KLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0ibmV3TGliIj4KLQk8L09wZW5MaWJyYXJ5PgkKLQkKLQk8TmV3TWV0aG9kRWxlbWVudCAKLQkJdHlwZT0iTWV0aG9kUGx1Z2luIgotCQluYW1lPSJQbHVnVGVzdCIKLQkJPgkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJNZXRob2RDb25maWd1cmF0aW9uIgotCQluYW1lPSJDb25maWdfVGVzdCIKLQkJPgkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkJCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iTWV0aG9kUGx1Z2luIiAgCi0JCW5hbWU9IlBsdWdfQSIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBQbHVnX0EiCi0JCWF1dGhvcnM9IlJNQyB0ZWFtIG1lbWJlciBBIgkKLQkJPgkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iTWV0aG9kUGx1Z2luIiAKLQkJbmFtZT0iUGx1Z19CIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIFBsdWdfQiIKLQkJYXV0aG9ycz0iUk1DIHRlYW0gbWVtYmVyIEIiCQotCQk+Ci0JCTxiYXNlcz4KLQkJCTxWYWx1ZT5QbHVnX0E8L1ZhbHVlPgotCQk8L2Jhc2VzPgkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkJCQotCTxFZGl0TWV0aG9kRWxlbWVudAotCQl0eXBlPSJNZXRob2RQbHVnaW4iCi0JCXBhdGg9IlBsdWdfQiIKLQkJPgotCQk8YmFzZXM+Ci0JCQk8VmFsdWU+UGx1Z19BMDwvVmFsdWU+Ci0JCTwvYmFzZXM+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQkJCi0JCQkKLQk8TmV3TWV0aG9kQ29uZmlndXJhdGlvbiBkaXNhYmxlPSJmYWxzZSIKLQkJbmFtZT0iQ29uZmlnX0EiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgQ29uZmlnX0EiCi0JCT4JCQkKLQk8L05ld01ldGhvZENvbmZpZ3VyYXRpb24+Ci0JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iQ29udGVudFBhY2thZ2UiCi0JCW5hbWU9IkNvbnRlbnRQYWNrYWdlXzEiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NvcmVDb250ZW50IgotCQk+CQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJSb2xlIgotCQluYW1lPSJyb2xlXzEiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NvcmVDb250ZW50L0NvbnRlbnRQYWNrYWdlXzEiCi0JCT4JCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JCQotCTxFZGl0TWV0aG9kRWxlbWVudAotCQl0eXBlPSJSb2xlIgotCQlwYXRoPSJQbHVnX0EvQ29udGVudC9Db3JlQ29udGVudC9Db250ZW50UGFja2FnZV8xL3JvbGVfMSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iUm9sZSAxIgotCQlicmllZkRlc2NyaXB0aW9uPSJUaGlzIGlzIGEgYnJpZWYgZHNlc2NyaXB0aW9uIG9mIFJvbGUgMSIKLQkJPgotCQk8cHJlc2VudGF0aW9uIG1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiBSb2xlIDEiPgotCQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQotCTwvRWRpdE1ldGhvZEVsZW1lbnQ+CQkKLQkKLQk8T3V0cHV0TGlicmFyeSBkaXNhYmxlPSJmYWxzZSIgLz4KLQkKLQk8T3V0cHV0UGx1Z2luIHBhdGg9IlBsdWdfQSIgcmVjdXJzaXZlPSJmYWxzZSI+Ci0JPC9PdXRwdXRQbHVnaW4+Ci0JCi0JPE91dHB1dENvbmZpZ3VyYXRpb24gcGF0aD0iQ29uZmlnX0EiIHJlY3Vyc2l2ZT0iZmFsc2UiPgotCTwvT3V0cHV0Q29uZmlndXJhdGlvbj4KLQkKLQk8Q29tcGFyZVRvR29sZGVuRmlsZSAKLQkJZ29sZGVuRmlsZU5hbWU9Im5ld01ldGhvZEVsZW1lbnRzLnhtbCIgCi0JCWRpZmZDb3VudD0iMCIgCi0JCWVsZW1lbnRDb3VudD0iNjQiCi0JCT4KLQk8L0NvbXBhcmVUb0dvbGRlbkZpbGU+Ci0JCi0JCQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RFbGVtZW50cy9uZXdNZXRob2RFbGVtZW50cy54bWwgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RFbGVtZW50cy9uZXdNZXRob2RFbGVtZW50cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MGUxZDYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kRWxlbWVudHMvbmV3TWV0aG9kRWxlbWVudHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08VGVzdGVyT3V0cHV0PgotPE1ldGhvZExpYnJhcnkgYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGd1aWQ9Il81QlphWU5CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJuZXdMaWIiIG9yZGVyaW5nR3VpZGU9IiIgcGF0aD0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2ZXJzaW9uPSIiPgotPE1ldGhvZFBsdWdpbiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfNUhPVmtOQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iUGx1Z1Rlc3QiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdXNlckNoYW5nZWFibGU9InRydWUiIHZlcnNpb249IiI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNUhPVmtkQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ29udGVudCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81SE9Wa3RCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVIT1ZrOUJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkRvbWFpbnMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVIT1ZsTkJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkRpc2NpcGxpbmVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81SE9WbGRCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJSb2xlU2V0cyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNUhPVmx0QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iV1AgVHlwZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVIT1ZsOUJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IlRvb2xzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81SE9WbU5CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVIT1ZtZEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNUhPVm10QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iSGlkZGVuIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPEN1c3RvbUNhdGVnb3J5IGJyaWVmRGVzY3JpcHRpb249IiIgZ3VpZD0iXzVIT1ZtOUJWRWR5ZmFMYUpZdlc0UWciIGlzQWJzdHJhY3Q9ImZhbHNlIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGV4dGVybmFsSWQ9IiIgZ3VpZD0iLTZIX2NEUU1fUUFiekc2eWZQSUp4VkEiIGtleUNvbnNpZGVyYXRpb25zPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyxfNUhPVm05QlZFZHlmYUxhSll2VzRRZyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2ZXJzaW9uPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0N1c3RvbUNhdGVnb3J5PgotPC9Db250ZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVIT1ZuTkJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkNvcmVDb250ZW50IiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81SE9WbmRCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81SE9WbnRCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNUhPVm45QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPC9NZXRob2RQbHVnaW4+Ci08TWV0aG9kUGx1Z2luIGF1dGhvcnM9IlJNQyB0ZWFtIG1lbWJlciBBIiBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIFBsdWdfQSIgY2hhbmdlRGVzY3JpcHRpb249IiIgZ3VpZD0iXzVPOVZRZEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IlBsdWdfQSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB1c2VyQ2hhbmdlYWJsZT0idHJ1ZSIgdmVyc2lvbj0iIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81TzlWUXRCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDb250ZW50IiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZROUJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkNhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNU85VlJOQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iRG9tYWlucyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNU85VlJkQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iRGlzY2lwbGluZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZSdEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IlJvbGVTZXRzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81TzlWUjlCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJXUCBUeXBlcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNU85VlNOQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iVG9vbHMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZTZEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNU85VlN0QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcmllcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81TzlWUzlCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJIaWRkZW4iIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Q3VzdG9tQ2F0ZWdvcnkgYnJpZWZEZXNjcmlwdGlvbj0iIiBndWlkPSJfNU85VlROQlZFZHlmYUxhSll2VzRRZyIgaXNBYnN0cmFjdD0iZmFsc2UiIG5hbWU9IkN1c3RvbSBDYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBhdXRob3JzPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgZXh0ZXJuYWxJZD0iIiBndWlkPSItYVpCU1BwYWtVSW5yVzUwcXRHakhrUSIga2V5Q29uc2lkZXJhdGlvbnM9IiIgbWFpbkRlc2NyaXB0aW9uPSIiIG5hbWU9IkN1c3RvbSBDYXRlZ29yaWVzLF81TzlWVE5CVkVkeWZhTGFKWXZXNFFnIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHZlcnNpb249IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvQ3VzdG9tQ2F0ZWdvcnk+Ci08L0NvbnRlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNU85VlRkQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ29yZUNvbnRlbnQiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNVRjenNOQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ29udGVudFBhY2thZ2VfMSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxSb2xlIGJyaWVmRGVzY3JpcHRpb249IlRoaXMgaXMgYSBicmllZiBkc2VzY3JpcHRpb24gb2YgUm9sZSAxIiBndWlkPSJfNVRwQThOQlZFZHlmYUxhSll2VzRRZyIgaXNBYnN0cmFjdD0iZmFsc2UiIG5hbWU9InJvbGVfMSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIDEiIHN1cHByZXNzZWQ9ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxSb2xlRGVzY3JpcHRpb24gYXNzaWdubWVudEFwcHJvYWNoZXM9IiIgYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURhdGU9IlRodSBKYW4gMzEgMTU6NDA6MjUgUFNUIDIwMDgiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGV4dGVybmFsSWQ9IiIgZ3VpZD0iLXlaUF9xOVItSFlSM2lfZ2hDck5JZ0EiIGtleUNvbnNpZGVyYXRpb25zPSIiIG1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiBSb2xlIDEiIG5hbWU9InJvbGVfMSxfNVRwQThOQlZFZHlmYUxhSll2VzRRZyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHNraWxscz0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgc3lub255bXM9IiIgdmVyc2lvbj0iIj4KLTwvUm9sZURlc2NyaXB0aW9uPgotPC9Sb2xlPgotPC9Db250ZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNU85VlR0QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNU85VlQ5QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZVTkJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvTWV0aG9kUGx1Z2luPgotPE1ldGhvZFBsdWdpbiBhdXRob3JzPSJSTUMgdGVhbSBtZW1iZXIgQiIgYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBQbHVnX0IiIGNoYW5nZURhdGU9IlRodSBKYW4gMzEgMTU6NDA6MjQgUFNUIDIwMDgiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGd1aWQ9Il81UFZ2d05CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJQbHVnX0IiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdXNlckNoYW5nZWFibGU9InRydWUiIHZlcnNpb249IiI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNVBWdndkQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ29udGVudCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81UFZ2d3RCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVQVnZ3OUJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkRvbWFpbnMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVQVnZ4TkJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkRpc2NpcGxpbmVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81UFZ2eGRCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJSb2xlU2V0cyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNVBWdnh0QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iV1AgVHlwZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVQVnZ4OUJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IlRvb2xzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81UFZ2eU5CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVQVnZ5ZEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNVBWdnl0QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iSGlkZGVuIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPEN1c3RvbUNhdGVnb3J5IGJyaWVmRGVzY3JpcHRpb249IiIgZ3VpZD0iXzVQVnZ5OUJWRWR5ZmFMYUpZdlc0UWciIGlzQWJzdHJhY3Q9ImZhbHNlIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGV4dGVybmFsSWQ9IiIgZ3VpZD0iLXFzUUotLXJKT2FWSWE5UGM2bWQ2akEiIGtleUNvbnNpZGVyYXRpb25zPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyxfNVBWdnk5QlZFZHlmYUxhSll2VzRRZyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2ZXJzaW9uPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0N1c3RvbUNhdGVnb3J5PgotPC9Db250ZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVQVnZ6TkJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkNvcmVDb250ZW50IiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81UFZ2emRCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81UFZ2enRCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNVBWdno5QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPGJhc2VzIHBhdGg9IlBsdWdfQSI+Ci08L2Jhc2VzPgotPC9NZXRob2RQbHVnaW4+Ci08TWV0aG9kQ29uZmlndXJhdGlvbiBhdXRob3JzPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgY2hhbmdlRGF0ZT0iVGh1IEphbiAzMSAxNTo0MDoyNCBQU1QgMjAwOCIgY2hhbmdlRGVzY3JpcHRpb249IiIgZ3VpZD0iXzVPZTBJTkJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkNvbmZpZ19UZXN0IiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHZlcnNpb249IiI+Ci08L01ldGhvZENvbmZpZ3VyYXRpb24+Ci08TWV0aG9kQ29uZmlndXJhdGlvbiBhdXRob3JzPSIiIGJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgQ29uZmlnX0EiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGd1aWQ9Il81UDBRNE5CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDb25maWdfQSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2ZXJzaW9uPSIiPgotPC9NZXRob2RDb25maWd1cmF0aW9uPgotPC9NZXRob2RMaWJyYXJ5PgotPE1ldGhvZFBsdWdpbiBhdXRob3JzPSJSTUMgdGVhbSBtZW1iZXIgQSIgYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBQbHVnX0EiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGd1aWQ9Il81TzlWUWRCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJQbHVnX0EiIG9yZGVyaW5nR3VpZGU9IiIgcGF0aD0iUGx1Z19BIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB1c2VyQ2hhbmdlYWJsZT0idHJ1ZSIgdmVyc2lvbj0iIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81TzlWUXRCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDb250ZW50IiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81TzlWVDlCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNU85VlVOQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPC9NZXRob2RQbHVnaW4+Ci08TWV0aG9kQ29uZmlndXJhdGlvbiBhdXRob3JzPSIiIGJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgQ29uZmlnX0EiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGd1aWQ9Il81UDBRNE5CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDb25maWdfQSIgb3JkZXJpbmdHdWlkZT0iIiBwYXRoPSJDb25maWdfQSIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTwvTWV0aG9kQ29uZmlndXJhdGlvbj4KLTwvVGVzdGVyT3V0cHV0PgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kUGx1Z2luL25ld01ldGhvZFBsdWdpbi50YyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZFBsdWdpbi9uZXdNZXRob2RQbHVnaW4udGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZWMxMDUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kUGx1Z2luL25ld01ldGhvZFBsdWdpbi50YworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08TWV0aG9kTGlicmFyeVRlc3QgZGlzYWJsZT0iZmFsc2UiPgotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSJuZXdMaWIiPgotCTwvT3BlbkxpYnJhcnk+Ci0JCi0JPE5ld01ldGhvZFBsdWdpbiAKLQkJbmFtZT0iTXkgMXN0IHBsdWdpbiIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBhYm95dCB0aGUgMXN0IHBsdWdpbiIKLQkJYXV0aG9ycz0ibmFtZSAxLCBuYW1lMiwgbmFtZTMgZXRjIgkKLQkJPgkKLQk8L05ld01ldGhvZFBsdWdpbj4KLQkKLQk8TmV3TWV0aG9kUGx1Z2luIGRpc2FibGU9ImZhbHNlIgotCQluYW1lPSJNeSAybmQgcGx1Z2luIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIGFib3l0IHRoZSAybmQgcGx1Z2luIgotCQlhdXRob3JzPSJuYW1lIDExLCBuYW1lMjIsIG5hbWUzMyBldGMiCQotCQk+Ci0JCTxiYXNlcz4KLQkJCTxWYWx1ZT5NeSAxc3QgcGx1Z2luPC9WYWx1ZT4KLQkJPC9iYXNlcz4JCQkKLQk8L05ld01ldGhvZFBsdWdpbj4KLQkKLQk8Q29weUxpYnJhcnkgbGliRm9sZGVyTmFtZT0ibmV3TWV0aG9kUGx1Z2luIj4KLQk8L0NvcHlMaWJyYXJ5PgotCQotCTxDb21wYXJlVG9MaWJyYXJ5IAotCQlnb2xkZW5MaWJGb2xkZXJOYW1lPSJuZXdNZXRob2RQbHVnaW4iIAotCQlkaWZmQ291bnQ9IjAiIAotCQllbGVtZW50Q291bnQ9IjMzIgotCQl1c2VOYW1lQXNJZD0idHJ1ZSIKLQkJPgkJCi0JPC9Db21wYXJlVG9MaWJyYXJ5PgkKLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kUGx1Z2luL25ld01ldGhvZFBsdWdpbi9NeSAxc3QgcGx1Z2luL3BsdWdpbi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RQbHVnaW4vbmV3TWV0aG9kUGx1Z2luL015IDFzdCBwbHVnaW4vcGx1Z2luLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFkY2JmYy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RQbHVnaW4vbmV3TWV0aG9kUGx1Z2luL015IDFzdCBwbHVnaW4vcGx1Z2luLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMy91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiBybWM6dmVyc2lvbj0iNy4xLjAiIGVwZjp2ZXJzaW9uPSIxLjAuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfZVU3TlVGdTBFZHVzcU9jVWp4Y1IxdyIgZ3VpZD0iX2VVN05VRnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIHhtaTppZD0iX2VVMUdzRnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9Ik15IDFzdCBwbHVnaW4iIGd1aWQ9Il9lVTFHc0Z1MEVkdXNxT2NVanhjUjF3IiBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIGFib3l0IHRoZSAxc3QgcGx1Z2luIiBhdXRob3JzPSJuYW1lIDEsIG5hbWUyLCBuYW1lMyBldGMiPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVUxR3NWdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iQ29udGVudCIgZ3VpZD0iX2VVMUdzVnUwRWR1c3FPY1VqeGNSMXciPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VVMUdzbHUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il9lVTFHc2x1MEVkdXNxT2NVanhjUjF3Ij4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VVMUdzMXUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il9lVTFHczF1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVTFHdEZ1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iX2VVMUd0RnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VVMUd0VnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfZVUxR3RWdTBFZHVzcU9jVWp4Y1IxdyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVUxR3RsdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il9lVTFHdGx1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVTFHdDF1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJUb29scyIgZ3VpZD0iX2VVMUd0MXUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VVMUd1RnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iX2VVMUd1RnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VVMUd1VnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il9lVTFHdVZ1MEVkdXNxT2NVanhjUjF3Ij4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVUxR3VsdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iSGlkZGVuIiBndWlkPSJfZVUxR3VsdTBFZHVzcU9jVWp4Y1IxdyI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il9lVTFHdTF1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iX2VVMUd1MXUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVTFHdkZ1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iX2VVMUd2RnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9lVTFHdlZ1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il9lVTFHdlZ1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX2VVMUd2bHUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBndWlkPSJfZVUxR3ZsdTBFZHVzcU9jVWp4Y1IxdyIvPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfZVUxR3YxdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGd1aWQ9Il9lVTFHdjF1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RQbHVnaW4vbmV3TWV0aG9kUGx1Z2luL015IDJuZCBwbHVnaW4vcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZFBsdWdpbi9uZXdNZXRob2RQbHVnaW4vTXkgMm5kIHBsdWdpbi9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2UwNWFmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZFBsdWdpbi9uZXdNZXRob2RQbHVnaW4vTXkgMm5kIHBsdWdpbi9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zL3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHJtYzp2ZXJzaW9uPSI3LjEuMCIgZXBmOnZlcnNpb249IjEuMC4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9lVk5oTUZ1MEVkdXNxT2NVanhjUjF3IiBndWlkPSJfZVZOaE1GdTBFZHVzcU9jVWp4Y1IxdyIvPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4geG1pOmlkPSJfZVZIYWtGdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iTXkgMm5kIHBsdWdpbiIgZ3VpZD0iX2VWSGFrRnUwRWR1c3FPY1VqeGNSMXciIGJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gYWJveXQgdGhlIDJuZCBwbHVnaW4iIGF1dGhvcnM9Im5hbWUgMTEsIG5hbWUyMiwgbmFtZTMzIGV0YyI+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVkhha1Z1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJDb250ZW50IiBndWlkPSJfZVZIYWtWdTBFZHVzcU9jVWp4Y1IxdyI+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVZIYWtsdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iQ2F0ZWdvcmllcyIgZ3VpZD0iX2VWSGFrbHUwRWR1c3FPY1VqeGNSMXciPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVZIYWsxdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iRG9tYWlucyIgZ3VpZD0iX2VWSGFrMXUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VWSGFsRnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkRpc2NpcGxpbmVzIiBndWlkPSJfZVZIYWxGdTBFZHVzcU9jVWp4Y1IxdyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVZIYWxWdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iUm9sZVNldHMiIGd1aWQ9Il9lVkhhbFZ1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVkhhbGx1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJXUCBUeXBlcyIgZ3VpZD0iX2VWSGFsbHUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VWSGFsMXUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IlRvb2xzIiBndWlkPSJfZVZIYWwxdTBFZHVzcU9jVWp4Y1IxdyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVZIYW1GdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBndWlkPSJfZVZIYW1GdTBFZHVzcU9jVWp4Y1IxdyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVZIYW1WdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcmllcyIgZ3VpZD0iX2VWSGFtVnUwRWR1c3FPY1VqeGNSMXciPgotICAgICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVkhhbWx1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJIaWRkZW4iIGd1aWQ9Il9lVkhhbWx1MEVkdXNxT2NVanhjUjF3Ij4KLSAgICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIHhtaTppZD0iX2VWSGFtMXUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkN1c3RvbSBDYXRlZ29yaWVzIiBndWlkPSJfZVZIYW0xdTBFZHVzcU9jVWp4Y1IxdyIvPgotICAgICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VWSGFuRnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkNvcmVDb250ZW50IiBndWlkPSJfZVZIYW5GdTBFZHVzcU9jVWp4Y1IxdyIvPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX2VWSGFuVnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgZ3VpZD0iX2VWSGFuVnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICA8L21ldGhvZFBhY2thZ2VzPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfZVZIYW5sdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGd1aWQ9Il9lVkhhbmx1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9lVkhhbjF1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgZ3VpZD0iX2VWSGFuMXUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICA8YmFzZXMgaHJlZj0idW1hOi8vX2VVMUdzRnUwRWR1c3FPY1VqeGNSMXcjX2VVMUdzRnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZFBsdWdpbi9uZXdNZXRob2RQbHVnaW4vbGlicmFyeS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RQbHVnaW4vbmV3TWV0aG9kUGx1Z2luL2xpYnJhcnkueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGYwOTM0Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZFBsdWdpbi9uZXdNZXRob2RQbHVnaW4vbGlicmFyeS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgcm1jOnZlcnNpb249IjcuMS4wIiBlcGY6dmVyc2lvbj0iMS4wLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX2VQM0hJRnUwRWR1c3FPY1VqeGNSMXciIGd1aWQ9Il9lUDNISUZ1MEVkdXNxT2NVanhjUjF3Ij4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfZVU3TlVGdTBFZHVzcU9jVWp4Y1IxdyIgaHJlZj0idW1hOi8vX2VVMUdzRnUwRWR1c3FPY1VqeGNSMXcjX2VVN05VRnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfZVZOaE1GdTBFZHVzcU9jVWp4Y1IxdyIgaHJlZj0idW1hOi8vX2VWSGFrRnUwRWR1c3FPY1VqeGNSMXcjX2VWTmhNRnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9lUDNISVZ1MEVkdXNxT2NVanhjUjF3IiBpZD0iX2VQeEFnRnUwRWR1c3FPY1VqeGNSMXciIHVyaT0iIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfZVU3TlVWdTBFZHVzcU9jVWp4Y1IxdyIgaWQ9Il9lVTdOVUZ1MEVkdXNxT2NVanhjUjF3IiB1cmk9Ik15JTIwMXN0JTIwcGx1Z2luL3BsdWdpbi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9lVTdOVWx1MEVkdXNxT2NVanhjUjF3IiBpZD0iX2VVMUdzRnUwRWR1c3FPY1VqeGNSMXciIHVyaT0iTXklMjAxc3QlMjBwbHVnaW4vcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2VWTmhNVnUwRWR1c3FPY1VqeGNSMXciIGlkPSJfZVZOaE1GdTBFZHVzcU9jVWp4Y1IxdyIgdXJpPSJNeSUyMDJuZCUyMHBsdWdpbi9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfZVZOaE1sdTBFZHVzcU9jVWp4Y1IxdyIgaWQ9Il9lVkhha0Z1MEVkdXNxT2NVanhjUjF3IiB1cmk9Ik15JTIwMm5kJTIwcGx1Z2luL3BsdWdpbi54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnkgeG1pOmlkPSJfZVB4QWdGdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0ibmV3TGliIiBndWlkPSJfZVB4QWdGdTBFZHVzcU9jVWp4Y1IxdyI+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfZVUxR3NGdTBFZHVzcU9jVWp4Y1IxdyIgaHJlZj0idW1hOi8vX2VVMUdzRnUwRWR1c3FPY1VqeGNSMXcjX2VVMUdzRnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICA8bWV0aG9kUGx1Z2lucyB4bWk6aWQ9Il9lVkhha0Z1MEVkdXNxT2NVanhjUjF3IiBocmVmPSJ1bWE6Ly9fZVZIYWtGdTBFZHVzcU9jVWp4Y1IxdyNfZVZIYWtGdTBFZHVzcU9jVWp4Y1IxdyIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVmFsaWRhdGlvbi9CdWdzLzE2MjE0OC50YyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVmFsaWRhdGlvbi9CdWdzLzE2MjE0OC50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwYjQ4YS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNjIxNDgudGMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdCBkaXNhYmxlPSJmYWxzZSIgdmVyYm9zZT0idHJ1ZSI+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE2MjE0OCI+Ci0JPC9PcGVuTGlicmFyeT4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iTWV0aG9kUGx1Z2luIiAKLQkJbmFtZT0iUGx1Z19BIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIFBsdWdfQSIKLQkJYXV0aG9ycz0iU29tZWJvZHkiCQotCQk+CQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQgCi0JCXR5cGU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iCi0JCW5hbWU9IkNvbmZpZ19BIgotCQk+CQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQkJCQkJCQkKLQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiCi0JCW5hbWU9IkIiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkIiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgQiIKLQkJPgkJCi0JCTxkZWZhdWx0Q29udGV4dD4KLQkJCTxWYWx1ZT5Db25maWdfQTwvVmFsdWU+Ci0JCTwvZGVmYXVsdENvbnRleHQ+CQkKLQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiIAotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0IiCi0JCW5hbWU9IkIxIgotCQlwcmVzZW50YXRpb25OYW1lPSJCMSIKLQkJPgkJCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiIAotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0IvQjEiCi0JCW5hbWU9IkIyIgotCQlwcmVzZW50YXRpb25OYW1lPSJCMiIKLQkJPgkJCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQkKLQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJDYXBhYmlsaXR5UGF0dGVybiIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIgotCQluYW1lPSJBIgotCQlwcmVzZW50YXRpb25OYW1lPSJBIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIEEiCi0JCT4JCQotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgkJCi0JCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiCi0JCW5hbWU9IkMiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkMiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgQyIKLQkJPgkJCi0JCTxkZWZhdWx0Q29udGV4dD4KLQkJCTxWYWx1ZT5Db25maWdfQTwvVmFsdWU+Ci0JCTwvZGVmYXVsdENvbnRleHQ+CQkKLQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JPEVkaXRNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0IiCi0JCXZhcmlhYmlsaXR5VHlwZT0iY29udHJpYnV0ZXMiCi0JCT4JCQkJCi0JCTxwcmVzZW50YXRpb24gCi0JCQltYWluRGVzY3JpcHRpb249IlRoaXMgaXMgdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgQiI+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQk8dmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4KLQkJCTxWYWx1ZT5QbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQTwvVmFsdWU+Ci0JCTwvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4JCQotCTwvRWRpdE1ldGhvZEVsZW1lbnQ+Ci0JCi0JPEVkaXRNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0MiCi0JCXZhcmlhYmlsaXR5VHlwZT0iZXh0ZW5kcyIKLQkJPgkJCQkKLQkJPHByZXNlbnRhdGlvbiAKLQkJCW1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiBDIj4JCQkKLQkJPC9wcmVzZW50YXRpb24+Ci0JCTx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotCQkJPFZhbHVlPlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9BPC9WYWx1ZT4KLQkJPC92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgkJCi0JPC9FZGl0TWV0aG9kRWxlbWVudD4KLQkKLQk8RWRpdE1ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQi9CMS9CMiIKLQkJdmFyaWFiaWxpdHlUeXBlPSJleHRlbmRzIgotCQk+CQkJCQotCQk8cHJlc2VudGF0aW9uIAotCQkJbWFpbkRlc2NyaXB0aW9uPSJUaGlzIGlzIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIEIyIj4JCQkKLQkJPC9wcmVzZW50YXRpb24+Ci0JCTx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotCQkJPFZhbHVlPlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DPC9WYWx1ZT4KLQkJPC92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgkJCi0JPC9FZGl0TWV0aG9kRWxlbWVudD4KLQkJCi0JPENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrIGRpc2FibGU9ImZhbHNlIiAKLQkJZXJyb3JDb3VudD0iMSIKLQkJY2lyY3VsYXJFbGVtZW50Q291bnQ9IjUiCi0JCT4KLQk8L0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrPgkKLQkKLQkKLQkJCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVmFsaWRhdGlvbi9CdWdzLzE2OTUwMS50YyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVmFsaWRhdGlvbi9CdWdzLzE2OTUwMS50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQxMDRmYi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNjk1MDEudGMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0IGRpc2FibGU9ImZhbHNlIiB2ZXJib3NlPSJ0cnVlIj4KLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTY5NTAxIj4KLQk8L09wZW5MaWJyYXJ5PgkKLQkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJNZXRob2RQbHVnaW4iIAotCQluYW1lPSJQbHVnX0EiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgUGx1Z19BIgotCQlhdXRob3JzPSJTb21lYm9keSIJCi0JCT4JCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLQk8TmV3TWV0aG9kRWxlbWVudCAKLQkJdHlwZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIKLQkJbmFtZT0iQ29uZmlnX0EiCi0JCT4JCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQkJCQkJCQkJCQotCQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQ2FwYWJpbGl0eVBhdHRlcm4iCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyIKLQkJbmFtZT0iY3AxIgotCQlwcmVzZW50YXRpb25OYW1lPSJjcDEiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgY3AxIgotCQk+CQkKLQkJPGRlZmF1bHRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC9kZWZhdWx0Q29udGV4dD4JCQotCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkJCQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIgCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY3AxIgotCQluYW1lPSJhMSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iYTEiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQ2FwYWJpbGl0eVBhdHRlcm4iCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyIKLQkJbmFtZT0iY3AyIgotCQlwcmVzZW50YXRpb25OYW1lPSJjcDIiCi0JCT4JCQotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgkJCi0JCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQkJCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NwMiIKLQkJbmFtZT0iYTIiCi0JCXByZXNlbnRhdGlvbk5hbWU9ImEyIgotCQk+CQkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcDEvYTEiCi0JCXZhcmlhYmlsaXR5VHlwZT0iY29udHJpYnV0ZXMiCi0JCT4JCQkJCi0JCTxwcmVzZW50YXRpb24gCi0JCQltYWluRGVzY3JpcHRpb249IlRoaXMgaXMgdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgYTEiPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4KLQkJPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci0JCQk8VmFsdWU+UGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NwMi9hMjwvVmFsdWU+Ci0JCTwvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4JCQotCTwvRWRpdE1ldGhvZEVsZW1lbnQ+Ci0JCQotCTxDaXJjdWxhckRlcGVuZGVuY3lDaGVjayBkaXNhYmxlPSJmYWxzZSIgZXJyb3JDb3VudD0iMCI+Ci0JPC9DaXJjdWxhckRlcGVuZGVuY3lDaGVjaz4JCi0JCi0JCi0JCQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNzAyOTQudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNzAyOTQudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZjZmNTkuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9WYWxpZGF0aW9uL0J1Z3MvMTcwMjk0LnRjCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08TWV0aG9kTGlicmFyeVRlc3QgZGlzYWJsZT0iZmFsc2UiIHZlcmJvc2U9ImZhbHNlIj4KLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTcwMjk0Ij4KLQk8L09wZW5MaWJyYXJ5PgkKLQkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJNZXRob2RQbHVnaW4iIAotCQluYW1lPSJQbHVnX0EiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgUGx1Z19BIgotCQlhdXRob3JzPSJTb21lYm9keSIJCi0JCT4JCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLQk8TmV3TWV0aG9kRWxlbWVudCAKLQkJdHlwZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIKLQkJbmFtZT0iQ29uZmlnX0EiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCQkJCQkJCQkJCi0JCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJDYXBhYmlsaXR5UGF0dGVybiIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIgotCQluYW1lPSJDUGEiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkNQYSIKLQkJPgkJCi0JCTxkZWZhdWx0Q29udGV4dD4KLQkJCTxWYWx1ZT5Db25maWdfQTwvVmFsdWU+Ci0JCTwvZGVmYXVsdENvbnRleHQ+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQkJCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIiAKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUGEiCi0JCW5hbWU9ImExIgotCQlwcmVzZW50YXRpb25OYW1lPSJhMSIKLQkJPgkJCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIiAKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUGEvYTEiCi0JCW5hbWU9ImExMSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iYTExIgotCQk+CQkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiIAotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYS9hMS9hMTEiCi0JCW5hbWU9ImExMTEiCi0JCXByZXNlbnRhdGlvbk5hbWU9ImExMTEiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQ2FwYWJpbGl0eVBhdHRlcm4iCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyIKLQkJbmFtZT0iQ1BiIgotCQlwcmVzZW50YXRpb25OYW1lPSJDUGIiCi0JCT4JCQotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkJCQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIgCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1BiIgotCQluYW1lPSJiMSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iYjEiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIgCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1BiL2IxIgotCQluYW1lPSJiMTEiCi0JCXByZXNlbnRhdGlvbk5hbWU9ImIxMSIKLQkJPgkJCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIiAKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUGIvYjEvYjExIgotCQluYW1lPSJiMTExIgotCQlwcmVzZW50YXRpb25OYW1lPSJiMTExIgotCQk+CQkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JPEVkaXRNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYS9hMSIKLQkJdmFyaWFiaWxpdHlUeXBlPSJjb250cmlidXRlcyIKLQkJPgkJCQkKLQkJPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci0JCQk8VmFsdWU+UGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYi9iMTwvVmFsdWU+Ci0JCTwvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4JCQotCTwvRWRpdE1ldGhvZEVsZW1lbnQ+Ci0JCi0JPEVkaXRNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYS9hMS9hMTEvYTExMSIKLQkJdmFyaWFiaWxpdHlUeXBlPSJleHRlbmRzIgotCQk+CQkJCQotCQk8dmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4KLQkJCTxWYWx1ZT5QbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1BiL2IxPC9WYWx1ZT4KLQkJPC92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgkJCi0JPC9FZGl0TWV0aG9kRWxlbWVudD4KLQkJCi0JPENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrIGRpc2FibGU9ImZhbHNlIiAKLQkJZXJyb3JDb3VudD0iMiIKLQkJY2lyY3VsYXJFbGVtZW50Q291bnQ9IjkiCi0JCT4KLQk8L0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrPgkKLQkKLQkKLQkJCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVmFsaWRhdGlvbi9CdWdzLzE3MDU5Ny50YyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVmFsaWRhdGlvbi9CdWdzLzE3MDU5Ny50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlhZjI0NS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNzA1OTcudGMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdCBkaXNhYmxlPSJmYWxzZSIgdmVyYm9zZT0iZmFsc2UiPgotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNzA1OTciPgotCTwvT3BlbkxpYnJhcnk+CQotCQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9Ik1ldGhvZFBsdWdpbiIgCi0JCW5hbWU9IlBsdWdfQSIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBQbHVnX0EiCi0JCWF1dGhvcnM9IlNvbWVib2R5IgkKLQkJPgkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotCTxOZXdNZXRob2RFbGVtZW50IAotCQl0eXBlPSJNZXRob2RDb25maWd1cmF0aW9uIgotCQluYW1lPSJDb25maWdfQSIKLQkJPgkJCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQkJCQkJCQkKLQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiCi0JCW5hbWU9IkNQMSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQ1AxIgotCQk+CQkKLQkJPGRlZmF1bHRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC9kZWZhdWx0Q29udGV4dD4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0KLQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQ2FwYWJpbGl0eVBhdHRlcm4iCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyIKLQkJbmFtZT0iQ1AyIgotCQlwcmVzZW50YXRpb25OYW1lPSJDUDIiCi0JCT4JCQotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkJCQkKLQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJDYXBhYmlsaXR5UGF0dGVybiIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIgotCQluYW1lPSJDUDMiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkNQMyIKLQkJPgkJCi0JCTxkZWZhdWx0Q29udGV4dD4KLQkJCTxWYWx1ZT5Db25maWdfQTwvVmFsdWU+Ci0JCTwvZGVmYXVsdENvbnRleHQ+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQkJCQkJCQkJCQkJCQkJCQkJCi0JCQkJCQkJCQkJCQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUDEiCi0JCW5hbWU9IkNQMiIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQ1AyIgotCQk+CQkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0KLQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUDIiCi0JCW5hbWU9IkNQMyIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQ1AzIgotCQk+CQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkJCQkKLQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQMyIKLQkJbmFtZT0iQ1AxIgotCQlwcmVzZW50YXRpb25OYW1lPSJDUDEiCi0JCT4JCQotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQotCi0JPEVkaXRNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQMS9DUDIiCi0JCXZhcmlhYmlsaXR5VHlwZT0iZXh0ZW5kcyIKLQkJPgkJCQkKLQkJPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci0JCQk8VmFsdWU+UGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQMjwvVmFsdWU+Ci0JCTwvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4JCQotCTwvRWRpdE1ldGhvZEVsZW1lbnQ+CQotCi0JPEVkaXRNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQMi9DUDMiCi0JCXZhcmlhYmlsaXR5VHlwZT0iZXh0ZW5kcyIKLQkJPgkJCQkKLQkJPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci0JCQk8VmFsdWU+UGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQMzwvVmFsdWU+Ci0JCTwvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4JCQotCTwvRWRpdE1ldGhvZEVsZW1lbnQ+Ci0JCi0JCi0JPEVkaXRNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQMy9DUDEiCi0JCXZhcmlhYmlsaXR5VHlwZT0iZXh0ZW5kcyIKLQkJPgkJCQkKLQkJPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci0JCQk8VmFsdWU+UGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQMTwvVmFsdWU+Ci0JCTwvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4JCQotCTwvRWRpdE1ldGhvZEVsZW1lbnQ+Ci0JCi0JCQotCTxDaXJjdWxhckRlcGVuZGVuY3lDaGVjayBkaXNhYmxlPSJmYWxzZSIgCi0JCWVycm9yQ291bnQ9IjEiCi0JCWNpcmN1bGFyRWxlbWVudENvdW50PSI2IgotCQk+Ci0JPC9DaXJjdWxhckRlcGVuZGVuY3lDaGVjaz4JCi0JCi0JCi0JCQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNzEwMjgudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNzEwMjgudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NDRkNzQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9WYWxpZGF0aW9uL0J1Z3MvMTcxMDI4LnRjCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08TWV0aG9kTGlicmFyeVRlc3QgZGlzYWJsZT0iZmFsc2UiIHZlcmJvc2U9ImZhbHNlIj4KLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTcxMDI4Ij4KLQk8L09wZW5MaWJyYXJ5PgkKLQkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJNZXRob2RQbHVnaW4iIAotCQluYW1lPSJQbHVnX0EiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgUGx1Z19BIgotCQlhdXRob3JzPSJTb21lYm9keSIJCi0JCT4JCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLQk8TmV3TWV0aG9kRWxlbWVudCAKLQkJdHlwZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIKLQkJbmFtZT0iQ29uZmlnX0EiCi0JCT4JCQotCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQkJCQkJCQkKLQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiCi0JCW5hbWU9IkNQYSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQ1BhIgotCQk+CQkKLQkJPGRlZmF1bHRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC9kZWZhdWx0Q29udGV4dD4JCQotCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkJCQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIgCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1BhIgotCQluYW1lPSJBMSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQTEiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIgCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1BhL0ExIgotCQluYW1lPSJBMTEiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkExMSIKLQkJPgkJCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJDYXBhYmlsaXR5UGF0dGVybiIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIgotCQluYW1lPSJDUGIiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkNQYiIKLQkJPgkJCi0JCTxkZWZhdWx0Q29udGV4dD4KLQkJCTxWYWx1ZT5Db25maWdfQTwvVmFsdWU+Ci0JCTwvZGVmYXVsdENvbnRleHQ+CQkKLQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1BiIgotCQluYW1lPSJCMSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQjEiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1BiL0IxIgotCQluYW1lPSJCMTEiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkIxMSIKLQkJPgkJCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLQk8RWRpdE1ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1BhL0ExL0ExMSIKLQkJdmFyaWFiaWxpdHlUeXBlPSJleHRlbmRzIgotCQk+CQkJCQotCQk8dmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4KLQkJCTxWYWx1ZT5QbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1BiL0IxL0IxMTwvVmFsdWU+Ci0JCTwvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4JCQotCTwvRWRpdE1ldGhvZEVsZW1lbnQ+Ci0JCi0JPEVkaXRNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYi9CMS9CMTEiCi0JCXZhcmlhYmlsaXR5VHlwZT0iZXh0ZW5kcyIKLQkJPgkJCQkKLQkJPHByZXNlbnRhdGlvbiAKLQkJCW1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiBCMTEiPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4KLQkJPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci0JCQk8VmFsdWU+UGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYS9BMTwvVmFsdWU+Ci0JCTwvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4JCQotCTwvRWRpdE1ldGhvZEVsZW1lbnQ+Ci0JCQotCTxDaXJjdWxhckRlcGVuZGVuY3lDaGVjayBkaXNhYmxlPSJmYWxzZSIgCi0JCWVycm9yQ291bnQ9IjEiCi0JCWNpcmN1bGFyRWxlbWVudENvdW50PSIzIgotCQk+Ci0JPC9DaXJjdWxhckRlcGVuZGVuY3lDaGVjaz4JCi0JCi0JCi0JCQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZGI4NDcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogTGlicmFyeSBUZXN0cyBQbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWksCi0gb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeSwKLSBvcmcuanVuaXQsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWksCi0gb3JnLmVjbGlwc2UuZXBmLmltcG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbCwKLSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbCwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cwotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuVGVzdHNQbHVnaW4KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvYnVpbGQucHJvcGVydGllcyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjljNTEwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTGlicmFyaWVzLwpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvTGlicmFyeURpZmZBbmFseXpvci5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvTGlicmFyeURpZmZBbmFseXpvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2E0MWY4Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlEaWZmQW5hbHl6b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5FUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5SZXNvdXJjZVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRlc3RUcmFjZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci0KLS8qKgotICogQ2xhc3MgdG8gYW5hbHl6ZSB0aGUgZGlmZmVybmVjZXMgYmV0d2VlbiB0d28gbWV0aG9kIGxpYnJhcmllcwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeURpZmZBbmFseXpvciB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGxvY2FsRGVidWcgPSBmYWxzZTsKLQlwcml2YXRlIFRlc3RUcmFjZXIgdHJhY2VyOwotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsaWIxOwotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsYmkyOwotCXByaXZhdGUgYm9vbGVhbiBncmVlZHkgPSB0cnVlOwotCXByaXZhdGUgaW50IGNvbXBhcmVPcHRpb24gPSAxOwkJLy8wOiBlbGVtZW50MSBhbmQgZWxlbWVudDIgYXJlIG9uIGVxdWFsIGZvb3RpbmcsIC8vMTogZWxlbWVudDEgaXMgYSBzdXBlciBzZXQgb2YgZWxlbWVudDIKLQlwcml2YXRlIGJvb2xlYW4gbmVlZFRvQW5hbHl6ZSA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGNvbXBhcmVSZXN1bHQgPSBmYWxzZTsKLQlwcml2YXRlIGludCBkaWZmQ291bnQgPSAwOwotCXByaXZhdGUgaW50IGVsZW1Db21wYXJlZENvdW50ID0gMDsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZW1wdHlTdHJpbmcgPSAiIjsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIGVtcHR5TGluZSA9IFBhdHRlcm4uY29tcGlsZSgiXFxzIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB0cmltID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgIGJvb2xlYW4gc2tpcFJlZiA9IHRydWU7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB1c2VOYW1lQXMybmRJZCA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIFNldCBza2lwRmVhdHVyZVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwdWJsaWMgTGlicmFyeURpZmZBbmFseXpvcihUZXN0VHJhY2VyIHQsIE1ldGhvZExpYnJhcnkgbDEsIE1ldGhvZExpYnJhcnkgbDIpIHsKLQkJdHJhY2VyID0gdDsKLQkJbGliMSA9IGwxOwotCQlsYmkyID0gbDI7Ci0JCUxpYnJhcnlVdGlsLmxvYWRBbGwoKE1ldGhvZExpYnJhcnkpIGxpYjEpOwotCQlMaWJyYXJ5VXRpbC5sb2FkQWxsKChNZXRob2RMaWJyYXJ5KSBsYmkyKTsKLQl9CQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRUcmltKGJvb2xlYW4gYikgewotCQl0cmltID0gYjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNraXBSZWYoYm9vbGVhbiBiKSB7Ci0JCXNraXBSZWYgPSBiOwotCX0KLQkJCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEV4Y2x1ZGVkRmVhdHVyZShTdHJpbmcgZmVhdHVyZU5hbWUpIHsKLQkJc2tpcEZlYXR1cmVTZXQuYWRkKGZlYXR1cmVOYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFuYWx5emUoKSB7Ci0JCWlmICghIG5lZWRUb0FuYWx5emUpIHsKLQkJCXJldHVybjsKLQkJfQotCQljb21wYXJlUmVzdWx0ID0gZWxlbWVudEVxdWFscyhsaWIxLCBsYmkyKTsKLQkJbmVlZFRvQW5hbHl6ZSA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbXBhcmUoKSB7Ci0JCWFuYWx5emUoKTsKLQkJcmV0dXJuIGNvbXBhcmVSZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEdyZWVkeShib29sZWFuIGIpIHsKLQkJaWYgKGdyZWVkeSAhPSBiKSB7Ci0JCQluZWVkVG9BbmFseXplID0gdHJ1ZTsKLQkJfQotCQlncmVlZHkgPSBiOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDb21wYXJlT3B0aW9uKGludCBpeCkgewotCQlpZiAoY29tcGFyZU9wdGlvbiAhPSBpeCkgewotCQkJbmVlZFRvQW5hbHl6ZSA9IHRydWU7Ci0JCX0KLQkJY29tcGFyZU9wdGlvbiA9IGl4OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXNlTmFtZUFzMm5kSWQoYm9vbGVhbiBiKSB7Ci0JCXVzZU5hbWVBczJuZElkID0gYjsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRyYWNlKFN0cmluZyBsaW5lKSB7Ci0JCWlmICh0cmFjZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRyYWNlci50cmFjZShsaW5lKTsKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihsaW5lKTsKLQkJfQotCX0KLQkKLQkvL1RvcCBlbnRyeSBmb3IgY29tcGFyaXpvbgotCXB1YmxpYyBib29sZWFuIGVsZW1lbnRFcXVhbHMoTWV0aG9kRWxlbWVudCBlbGVtMSwgIE1ldGhvZEVsZW1lbnQgZWxlbTIpIHsKLQkJZGlmZkNvdW50ID0gMDsKLQkJZWxlbUNvbXBhcmVkQ291bnQgPSAwOwotCQl0cmFjZSgiIik7Ci0JCXRyYWNlKCJlbGVtZW50RXF1YWxzIC0+ICIpOwotCQl0cmFjZSgiZWxlbTE6ICIgKyBlbGVtMSk7Ci0JCXRyYWNlKCJlbGVtMjogIiArIGVsZW0yICsgIlxuIik7Ci0JCWNvbXBhcmUobmV3IEFycmF5TGlzdCgpLCBlbGVtMSwgZWxlbTIsIG5ldyBIYXNoTWFwKCkpOwotCQl0cmFjZSgiZWxlbWVudEVxdWFscyA8LSBkaWZmczogIiArIGRpZmZDb3VudCArICIsIGVsZW1lbnRzOiAiICsgZWxlbUNvbXBhcmVkQ291bnQgKyAiXG4iKTsKLQkJcmV0dXJuIGRpZmZDb3VudCA9PSAwOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY29tcGFyZShMaXN0IHBhdGgsIE1ldGhvZEVsZW1lbnQgZWxlbTEsICBNZXRob2RFbGVtZW50IGVsZW0yLCBNYXAgY29tcGFyZWRFbGVtTWFwKSB7Ci0JCXBhdGguYWRkKGVsZW0xKTsKLQkJZWxlbUNvbXBhcmVkQ291bnQrKzsKLQkJY29tcGFyZV8ocGF0aCwgZWxlbTEsIGVsZW0yLCBjb21wYXJlZEVsZW1NYXApOwotCQlwYXRoLnJlbW92ZShwYXRoLnNpemUoKSAtIDEpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY29tcGFyZV8oTGlzdCBwYXRoLCBNZXRob2RFbGVtZW50IGVsZW0xLCAgTWV0aG9kRWxlbWVudCBlbGVtMiwgTWFwIGNvbXBhcmVkRWxlbU1hcCkgewotCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJdHJhY2UoInBhdGg6ICIgKyBwYXRoVG9TdHJpbmcocGF0aCkpOwotCQl9CQkJCQotCQkKLQkJYm9vbGVhbiB0b3BMZXZlbCA9IGVsZW0xID09IGxpYjEgJiYgZWxlbTIgPT0gbGJpMjsKLQkJYm9vbGVhbiBjaGVja0VxdWFsU2l6ZSA9IGNvbXBhcmVPcHRpb24gPT0gMCAmJiAhdG9wTGV2ZWw7Ci0JCQotCQlMaXN0IGNvbnRlbnRMaXN0MSA9IGVsZW0xLmVDb250ZW50cygpOwotCQlMaXN0IGNvbnRlbnRMaXN0MiA9IGVsZW0yLmVDb250ZW50cygpOwotCQlpbnQgc3oxID0gY29udGVudExpc3QxLnNpemUoKTsKLQkJaW50IHN6MiA9IGNvbnRlbnRMaXN0Mi5zaXplKCk7Ci0JCQotCQlpZiAoIGNoZWNrRXF1YWxTaXplICYmIHN6MSAhPSBzejIpIHsKLQkJCVN0cmluZyBtc2cgPSAic3oxICE9IHN6MjogIiArIHN6MSArICIgIT0gIiArIHN6MjsKLQkJCWxvZ1dhcm5pbmcobXNnLCBwYXRoLCBlbGVtMSwgZWxlbTIpOwkJCi0JCX0JCQotCQkKLQkJaW50IGVsZW1Db3VudDEgPSAwOwotCQlIYXNoTWFwIGVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlIYXNoTWFwIGVsZW1lbnROYW1lTWFwID0gdXNlTmFtZUFzMm5kSWQgPyBuZXcgSGFzaE1hcCgpIDogbnVsbDsKLQkJSGFzaE1hcCBlbGVtZW50Q2hpbGRNYXAgPSB1c2VOYW1lQXMybmRJZCA/IG5ldyBIYXNoTWFwKCkgOiBudWxsOwotCQlmb3IgKGludCBpPTA7IGkgPCBzejE7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGNvbnRlbnRMaXN0MS5nZXQoaSk7Ci0JCQlpZiAodG9DaGVja09iamVjdChvYmopKSB7Ci0JCQkJZWxlbUNvdW50MSsrOwotCQkJCVN0cmluZyBndWlkID0gKChNZXRob2RFbGVtZW50KSBvYmopLmdldEd1aWQoKTsKLQkJCQlTdHJpbmcgbmFtZSA9ICgoTWV0aG9kRWxlbWVudCkgb2JqKS5nZXROYW1lKCk7Ci0JCQkJaWYgKCEgY29tcGFyZWRFbGVtTWFwLmNvbnRhaW5zS2V5KGd1aWQpKSB7Ci0JCQkJCWVsZW1lbnRNYXAucHV0KGd1aWQsIG9iaik7Ci0JCQkJCWlmICh1c2VOYW1lQXMybmRJZCkgewotCQkJCQkJT2JqZWN0IG9iakluTWFwID0gZWxlbWVudE5hbWVNYXAuZ2V0KG5hbWUpOwotCQkJCQkJaWYgKG9iakluTWFwID09IG51bGwpIHsKLQkJCQkJCQllbGVtZW50TmFtZU1hcC5wdXQobmFtZSwgb2JqKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJTGlzdCBsaXN0ID0gbnVsbDsKLQkJCQkJCQlpZiAob2JqSW5NYXAgaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJCQkJCWxpc3QgPSAoTGlzdCkgb2JqSW5NYXA7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJbGlzdC5hZGQob2JqSW5NYXApOwotCQkJCQkJCX0KLQkJCQkJCQlsaXN0LmFkZChvYmopOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlMaXN0IGNoaWxkTGlzdCA9IG51bGw7Ci0JCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCQkJCWNoaWxkTGlzdCA9ICgoTWV0aG9kUGFja2FnZSkgb2JqKS5lQ29udGVudHMoKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChjaGlsZExpc3QgIT0gbnVsbCAmJiAhIGNoaWxkTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlNZXRob2RFbGVtZW50IGNoMCA9IChNZXRob2RFbGVtZW50KSBjaGlsZExpc3QuZ2V0KDApOwotCQkJCQkJCWVsZW1lbnRDaGlsZE1hcC5wdXQoY2gwLmdldEd1aWQoKSwgb2JqKTsKLQkJCQkJCX0JCQkJCQkKLQkJCQkJfQotCQkJCQkKLQkJCQkJY29tcGFyZWRFbGVtTWFwLnB1dChndWlkLCBvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpbnQgZWxlbUNvdW50MiA9IDA7Ci0JCWZvciAoaW50IGk9MDsgaSA8IHN6MjsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gY29udGVudExpc3QyLmdldChpKTsKLQkJCWlmICh0b0NoZWNrT2JqZWN0KG9iaikpIHsKLQkJCQllbGVtQ291bnQyKys7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVsZW1Db3VudDEgPCBlbGVtQ291bnQyIHx8IGVsZW1Db3VudDEgPiBlbGVtQ291bnQyICYmIGNoZWNrRXF1YWxTaXplKSB7Ci0JCQlTdHJpbmcgbXNnID0gImVsZW1Db3VudDEgIT0gZWxlbUNvdW50MjogIiArIGVsZW1Db3VudDEgKyAiICE9ICIgKyBlbGVtQ291bnQyOwotCQkJbG9nRGlmZihtc2csIHBhdGgsIGVsZW0xLCBlbGVtMik7Ci0JCQlpZiAoIWdyZWVkeSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkJCQotCQlpZiAoISAoZWxlbTEgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSkgewotCQkJTGlzdCBwcm9wZXJ0aWVzID0gZWxlbTEuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFUHJvcGVydHkgZXAgPSAoRVByb3BlcnR5KSBwcm9wZXJ0aWVzLmdldChpKTsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGVwLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQkJCWlmIChza2lwRmVhdHVyZVNldC5jb250YWlucyhmZWF0dXJlLmdldE5hbWUoKSkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCU9iamVjdCB2YWwxID0gIjEgLi4uID8iOwotCQkJCU9iamVjdCB2YWwyID0gIjIgLi4uID8iOwotCQkJCXRyeSB7Ci0JCQkJCXZhbDEgPSBlbGVtMS5lR2V0KGZlYXR1cmUpOwotCQkJCQl2YWwyID0gZWxlbTIuZUdldChmZWF0dXJlKTsKLQkJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewkJCQkJCi0JCQkJfQotCQkJCWlmICghIGZlYXR1cmVWYWx1ZUVxdWFscyh2YWwxLCB2YWwyKSkgewotCQkJCQlpZiAoZmVhdHVyZS5nZXROYW1lKCkgIT0gImd1aWQiIHx8ICF1c2VOYW1lQXMybmRJZCkgewotCQkJCQkJU3RyaW5nIG1zZyA9ICJEaWZmIHZhbHVlcyBpbiBmZWF0dXJlOiAiICsgZmVhdHVyZS5nZXROYW1lKCk7Ci0JCQkJCQlsb2dEaWZmKG1zZywgcGF0aCwgZWxlbTEsIGVsZW0yLCB2YWwxLCB2YWwyKTsKLQkJCQkJCWlmICghZ3JlZWR5KSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQkJCi0JCS8vQ29tcGFyZSBmb3IgY29udGFpbmVkIGVsZW1lbnRzCQkKLQkJZm9yIChpbnQgaT0wOyBpIDwgc3oyOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBjb250ZW50TGlzdDIuZ2V0KGkpOwotCQkJaWYgKCEgdG9DaGVja09iamVjdChvYmopKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCU1ldGhvZEVsZW1lbnQgc3ViRWxlbTIgPSAoTWV0aG9kRWxlbWVudCkgb2JqOwotCQkJTWV0aG9kRWxlbWVudCBzdWJFbGVtMSA9IChNZXRob2RFbGVtZW50KSBlbGVtZW50TWFwLmdldChzdWJFbGVtMi5nZXRHdWlkKCkpOwotCQkJaWYgKHVzZU5hbWVBczJuZElkICYmIHN1YkVsZW0xID09IG51bGwpIHsKLQkJCQlPYmplY3Qgc3ViT2JqMSA9IGVsZW1lbnROYW1lTWFwLmdldChzdWJFbGVtMi5nZXROYW1lKCkpOwotCQkJCWlmIChzdWJPYmoxIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlzdWJFbGVtMSA9IChNZXRob2RFbGVtZW50KSAgc3ViT2JqMTsKLQkJCQl9IGVsc2UgaWYgKHN1Yk9iajEgaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJCWxvZ1dhcm5pbmcoInN1Yk9iajEgaXMgbGlzdDogIiArIHN1Yk9iajEudG9TdHJpbmcoKSwgcGF0aCwgc3ViRWxlbTEsIHN1YkVsZW0yKTsJCQkKLQkJCQl9Ci0JCQkJaWYgKHN1YkVsZW0xID09IG51bGwgJiYgc3ViRWxlbTIgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCUxpc3QgY2hpbGRMaXN0ID0gKChNZXRob2RQYWNrYWdlKSBzdWJFbGVtMikuZUNvbnRlbnRzKCk7Ci0JCQkJCWlmIChjaGlsZExpc3QgIT0gbnVsbCAmJiAhIGNoaWxkTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgY2gwID0gKE1ldGhvZEVsZW1lbnQpIGNoaWxkTGlzdC5nZXQoMCk7Ci0JCQkJCQlzdWJFbGVtMSA9ICAoTWV0aG9kRWxlbWVudCkgZWxlbWVudENoaWxkTWFwLmdldChjaDAuZ2V0R3VpZCgpKTsKLQkJCQkJfQkKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoc3ViRWxlbTEgPT0gbnVsbCkgewotCQkJCWxvZ0RpZmYoInN1YkVsZW0xID09IG51bGwiICwgcGF0aCwgc3ViRWxlbTEsIHN1YkVsZW0yKTsJCQkKLQkJCQlpZiAoIWdyZWVkeSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWNvbnRpbnVlOwotCQkJfQkJCQotCQkJY29tcGFyZShwYXRoLCBzdWJFbGVtMSwgc3ViRWxlbTIsIGNvbXBhcmVkRWxlbU1hcCk7CQkJCi0JCQlpZiAoZGlmZkNvdW50ID4gMCAmJiAhZ3JlZWR5KSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9CQkJCQkKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGZlYXR1cmVWYWx1ZUVxdWFscyhPYmplY3QgdmFsMSwgT2JqZWN0IHZhbDIpIHsKLQkJaWYgKHZhbDEgPT0gbnVsbCkgewotCQkJcmV0dXJuIHZhbDIgPT0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKHZhbDIgPT0gbnVsbCkgewotCQkJcmV0dXJuIHZhbDEgPT0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKHZhbDEgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlpZiAoISAodmFsMSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJYm9vbGVhbiBiICA9ICgoTWV0aG9kRWxlbWVudCkgdmFsMSkuZ2V0R3VpZCgpLmVxdWFscygoKE1ldGhvZEVsZW1lbnQpIHZhbDEpLmdldEd1aWQoKSk7Ci0JCQlpZiAoIWIgJiYgdXNlTmFtZUFzMm5kSWQpIHsKLQkJCQliID0gKChNZXRob2RFbGVtZW50KSB2YWwxKS5nZXROYW1lKCkuZXF1YWxzKCgoTWV0aG9kRWxlbWVudCkgdmFsMSkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiBiOwotCQl9CQkJCQotCQkKLQkJaW50IG9wdGlvbiA9IDA7IAkvLzA6IG5vdCB0byBjb21wYXJlIGxpc3QgdmFsdWVzCi0JCQkJCQkJLy8xOiAgICAgICAgY29tcGFyZSBsaXN0IHZhbHVlcwotCQkJCQkJCS8vMjoJCWNvbXBhcmUgc2l6ZSBzdHJpY3RseQotCQlpZiAob3B0aW9uID4gMCAmJiB2YWwxIGluc3RhbmNlb2YgTGlzdCkgewkJCQotCQkJaWYgKCEgKHZhbDIgaW5zdGFuY2VvZiBMaXN0KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCUxpc3QgbDEgPSAoTGlzdCkgdmFsMTsKLQkJCUxpc3QgbDIgPSAoTGlzdCkgdmFsMjsKLQkJCWlmIChsMS5zaXplKCkgPCBsMi5zaXplKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCWlmIChvcHRpb24gPiAxICYmIGwxLnNpemUoKSA+IGwyLnNpemUoKSkgewkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlib29sZWFuIG1lID0gbDEuc2l6ZSgpID09IDAgPyBmYWxzZSA6IGwxLmdldCgwKSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQ7Ci0JCQlpZiAobWUpIHsKLQkJCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlNYXAgbmFtZU1hcCA9IHVzZU5hbWVBczJuZElkID8gbmV3IEhhc2hNYXAoKSA6IG51bGw7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPGwxLnNpemUoKTsgaSsrKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZTEgPSAoTWV0aG9kRWxlbWVudCkgbDEuZ2V0KGkpOwotCQkJCQltYXAucHV0KGUxLmdldEd1aWQoKSwgZTEpOwotCQkJCQlpZiAodXNlTmFtZUFzMm5kSWQpIHsKLQkJCQkJCW5hbWVNYXAucHV0KGUxLmdldE5hbWUoKSwgZTEpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZvciAoaW50IGk9MDsgaTxsMi5zaXplKCk7IGkrKykgewotCQkJCQlNZXRob2RFbGVtZW50IGUyID0gKE1ldGhvZEVsZW1lbnQpIGwyLmdldChpKTsKLQkJCQkJYm9vbGVhbiBmb3VuZCA9IG1hcC5jb250YWluc0tleShlMi5nZXRHdWlkKCkpIHx8IAotCQkJCQkJCXVzZU5hbWVBczJuZElkICYmIG5hbWVNYXAuY29udGFpbnNLZXkoZTIuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKCFmb3VuZCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQkJCQkJCi0JCQl9IGVsc2UgewotCQkJCWZvciAoaW50IGk9MDsgaTxsMS5zaXplKCk7IGkrKykgewotCQkJCQlpZiAoISAoZmVhdHVyZVZhbHVlRXF1YWxzKGwxLmdldChpKSwgbDIuZ2V0KGkpKSkpICB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCQkKLQkJaWYgKHZhbDEgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCWlmICghKHZhbDIgaW5zdGFuY2VvZiBTdHJpbmcpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJU3RyaW5nIHN0cjEgPSAoU3RyaW5nKSB2YWwxOwotCQkJU3RyaW5nIHN0cjIgPSAoU3RyaW5nKSB2YWwyOwotCQkJaWYgKHNraXBSZWYpIHsKLQkJCQlzdHIxID0gcmVwbGFjZVJlZldpdGhEdW1teShzdHIxKTsKLQkJCQlzdHIyID0gcmVwbGFjZVJlZldpdGhEdW1teShzdHIyKTsKLQkJCX0KLQkJCQotCQkJaWYgKHRyaW0pIHsKLQkJCQlzdHIxID0gc3RyMS50cmltKCk7Ci0JCQkJc3RyMiA9IHN0cjIudHJpbSgpOwotCQkJCWlmICh1c2VOYW1lQXMybmRJZCAmJiBzdHIxLmxlbmd0aCgpID4gMjUwICYmIHN0cjIubGVuZ3RoKCkgPiAyNTApIHsKLQkJCQkJc3RyMSA9IHN0cjEuc3Vic3RyaW5nKDAsIDI1MCk7Ci0JCQkJCXN0cjIgPSBzdHIyLnN1YnN0cmluZygwLCAyNTApOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzdHIxLmVxdWFscyhzdHIyKTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgaW50IGluY0RpZmZDb3VudCgpIHsKLQkJcmV0dXJuICsrZGlmZkNvdW50OwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXREaWZmUHJvbXB0KCkgewotCQlyZXR1cm4gIkRfIiArIGRpZmZDb3VudCArICI+ICI7CQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgbXNnLCBMaXN0IHBhdGgsIE1ldGhvZEVsZW1lbnQgZWxlbTEsIE1ldGhvZEVsZW1lbnQgZWxlbTIpIHsKLQkJbG9nKG1zZywgcGF0aCwgZWxlbTEsIGVsZW0yLCBmYWxzZSk7Ci0JCXRyYWNlKCIiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvZ0RpZmYoU3RyaW5nIG1zZywgTGlzdCBwYXRoLCBNZXRob2RFbGVtZW50IGVsZW0xLCBNZXRob2RFbGVtZW50IGVsZW0yKSB7Ci0JCWxvZyhtc2csIHBhdGgsIGVsZW0xLCBlbGVtMiwgdHJ1ZSk7Ci0JCXRyYWNlKCIiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgbXNnLCBMaXN0IHBhdGgsIE1ldGhvZEVsZW1lbnQgZWxlbTEsIE1ldGhvZEVsZW1lbnQgZWxlbTIsIGJvb2xlYW4gZGlmZikgewotCQlpZiAoZGlmZikgewotCQkJaW5jRGlmZkNvdW50KCk7Ci0JCX0KLQkJU3RyaW5nIHByb21wdCA9IGRpZmYgPyBnZXREaWZmUHJvbXB0KCkgOiAiV2FybmluZz4gIjsKLQkJdHJhY2UocHJvbXB0ICsgInBhdGg6ICIgKyBwYXRoVG9TdHJpbmcocGF0aCkpOwotCQl0cmFjZShwcm9tcHQgKyAibXNnOiAiICsgbXNnKTsKLQkJTWV0aG9kRWxlbWVudCBlbGVtMCA9IChNZXRob2RFbGVtZW50KSBwYXRoLmdldChwYXRoLnNpemUoKSAtIDEpOwotCQlpZiAoZWxlbTAgIT0gZWxlbTEpIHsKLQkJCXRyYWNlKHByb21wdCArIGdldEVsZW1TdHJpbmcoZWxlbTAsICJlbGVtMCIpKTsKLQkJfQotCQl0cmFjZShwcm9tcHQgKyBnZXRFbGVtU3RyaW5nKGVsZW0xLCAiZWxlbTEiKSk7Ci0JCXRyYWNlKHByb21wdCArIGdldEVsZW1TdHJpbmcoZWxlbTIsICJlbGVtMiIpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RWxlbVN0cmluZyhNZXRob2RFbGVtZW50IGVsZW0sIFN0cmluZyBsYWJlbCkgewotCQlTdHJpbmcgc3RyID0gbGFiZWw7Ci0JCWlmIChlbGVtID09IG51bGwpIHsKLQkJCXN0ciArPSAiIC0+IG51bGwiOwotCQl9IGVsc2UgewkJCi0JCQlzdHIgKz0gIiAtPiB0eXBlOiAiICsgZ2V0Q2xhc3NMYXN0TmFtZShlbGVtKSArICIsIG5hbWU6ICIgKyBlbGVtLmdldE5hbWUoKSArICIsIGd1aWQ6ICIgKyBlbGVtLmdldEd1aWQoKTsKLQkJfQotCQlyZXR1cm4gc3RyOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRDbGFzc0xhc3ROYW1lKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIHN0ciA9IG9iai5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJaW50IGl4ID0gc3RyLmxhc3RJbmRleE9mKCIuIikgKyAxOwotCQlyZXR1cm4gc3RyLnN1YnN0cmluZyhpeCk7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvZ0RpZmYoU3RyaW5nIG1zZywgTGlzdCBwYXRoLCBNZXRob2RFbGVtZW50IGVsZW0xLCBNZXRob2RFbGVtZW50IGVsZW0yLCBPYmplY3QgdmFsMSwgT2JqZWN0IHZhbDIpIHsKLQkJbG9nKG1zZywgcGF0aCwgZWxlbTEsIGVsZW0yLCB0cnVlKTsKLQkJU3RyaW5nIHByb21wdCA9IGdldERpZmZQcm9tcHQoKTsKLQkJdHJhY2UocHJvbXB0ICsgInZhbDE6ICIgKyB2YWwxKTsKLQkJdHJhY2UocHJvbXB0ICsgInZhbDI6ICIgKyB2YWwyKTsJCi0JCXRyYWNlKCIiKTsKLQl9CQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBwYXRoVG9TdHJpbmcoTGlzdCBwYXRoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxwYXRoLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW0gPSAoTWV0aG9kRWxlbWVudCkgcGF0aC5nZXQoaSk7Ci0JCQlpZiAoZWxlbSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChidWYubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJYnVmLmFwcGVuZCgiOiIpOwotCQkJfQotCQkJYnVmLmFwcGVuZChlbGVtLmdldE5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldERpZmZDb3VudCgpIHsKLQkJcmV0dXJuIGRpZmZDb3VudDsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRFbGVtQ29tcGFyZWRDb3VudCgpIHsKLQkJcmV0dXJuIGVsZW1Db21wYXJlZENvdW50OwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gdG9DaGVja09iamVjdChPYmplY3Qgb2JqKSB7Ci0JCWlmICghIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAodXNlTmFtZUFzMm5kSWQgJiYgb2JqIGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAob2JqIGluc3RhbmNlb2YgR3JhcGhOb2RlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkJCi0JcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZVJlZldpdGhEdW1teShTdHJpbmcgc291cmNlKSB7CQkKLQkJU3RyaW5nIHJldCA9IHJlcGxhY2VSZWZXaXRoRHVtbXkoc291cmNlLCBSZXNvdXJjZVNjYW5uZXIucF9zcmNfcmVmLCBlbXB0eVN0cmluZyk7Ci0JCXJldCA9IHJlcGxhY2VSZWZXaXRoRHVtbXkocmV0LCBSZXNvdXJjZVNjYW5uZXIucF9ocmVmX3JlZiwgZW1wdHlTdHJpbmcpOwotCQlyZXQgPSByZXBsYWNlUmVmV2l0aER1bW15KHJldCwgZW1wdHlMaW5lLCBlbXB0eVN0cmluZyk7Ci0JCWlmIChmYWxzZSAmJiAhc291cmNlLmVxdWFscyhyZXQpKSB7Ci0JCQl0cmFjZSgiTEQ+IHNvdXJjZTogIiArIHNvdXJjZSk7Ci0JCQl0cmFjZSgiTEQ+IHJldDogICAgIiArIHJldCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZVJlZldpdGhEdW1teShTdHJpbmcgc291cmNlLCBQYXR0ZXJuIHBhdHRlcm4sIFN0cmluZyByZXBsYWNlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTWF0Y2hlciBtID0gcGF0dGVybi5tYXRjaGVyKHNvdXJjZSk7Ci0JCi0JCXdoaWxlIChtLmZpbmQoKSkgewotCQkJU3RyaW5nIHRleHQgPSBtLmdyb3VwKCk7CQkJCQkJCi0JCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCByZXBsYWNlKTsJCi0JCX0KLQotCQltLmFwcGVuZFRhaWwoc2IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9MaWJyYXJ5SnVuaXRUZXN0U2VydmljZS5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvTGlicmFyeUp1bml0VGVzdFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZjNjNhNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9MaWJyYXJ5SnVuaXRUZXN0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLkxpYnJhcnlKdW5pdFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLkxpYnJhcnlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRlc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UZXN0VHJhY2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLlRlc3RzUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgTGlicmFyeVRlc3RlciBzZXJ2aWNlIGFuZCBpcyB1c2VkIGluIExpYnJhcnlKdW5pdFRlc3QuICAKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlIGV4dGVuZHMgVGVzdEZvbGRlclNldHVwIGltcGxlbWVudHMgVGVzdFRyYWNlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRlc3RHcm91cE5hbWUgPSAiSnVuaXRUZXN0cyI7Ci0JcHJpdmF0ZSBzdGF0aWMgRmlsZSB0ZXN0R3JvdXA7Ci0JCQotCXByaXZhdGUgTGlicmFyeVRlc3RlciB0ZXN0ZXI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGluc3RhbmNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBGaWxlIHRvcENsZWFuVXBGb2xkZXI7Ci0JCi0JcHJpdmF0ZSBMaWJyYXJ5SnVuaXRUZXN0U2VydmljZSAoKSB7Ci0JCXRlc3RlciA9IExpYnJhcnlUZXN0ZXJGYWN0b3J5Lm5ld1Rlc3RlcihmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlicmFyeUp1bml0VGVzdFNlcnZpY2UgZ2V0SW5zdGFuY2UoTGlicmFyeUp1bml0VGVzdCB0ZXN0Q2FzZSkgewotCQlDbGFzcyB0ZXN0Q2xhc3MgPSB0ZXN0Q2FzZS5nZXRDbGFzcygpOyAKLQkJTGlicmFyeUp1bml0VGVzdFNlcnZpY2UgaW5zdGFuY2UgPSAoTGlicmFyeUp1bml0VGVzdFNlcnZpY2UpIGluc3RhbmNlcy5nZXQodGVzdENsYXNzKTsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IExpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlKCk7Ci0JCQlpbnN0YW5jZXMucHV0KHRlc3RDbGFzcywgaW5zdGFuY2UpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCBGaWxlIGdldFRlc3RHcm91cCgpIHsKLQkJaWYgKHRlc3RHcm91cCA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IGdldFRlc3RIb21lKCkuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIHRlc3RHcm91cE5hbWU7Ci0JCQl0ZXN0R3JvdXAgPSBuZXcgRmlsZShwYXRoKTsKLQkJfQotCQlyZXR1cm4gdGVzdEdyb3VwOwotCX0KLQkKLQkvKioKLQkgKiBDYWxsZWQgZnJvbSBMaWJyYXJ5SnVuaXRUZXN0J3Mgc2V0VXAgbWV0aG9kIHRvIHVwZGF0ZSB0ZXN0ZXIncwotCSAqIGZvbGRlciBzZXR1cC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcChGaWxlIHRlc3RSb290U291cmNlLCBGaWxlIHRlc3RSb290V29ya2luZywgRmlsZSB0ZXN0RGlyLCBMaWJyYXJ5SnVuaXRUZXN0IHRlc3RDYXNlKSB7Ci0JCXRlc3Rlci5zZXRUZXN0Um9vdFNvdXJjZSh0ZXN0Um9vdFNvdXJjZSk7Ci0JCXRlc3Rlci5zZXRUZXN0Um9vdFdvcmtpbmcodGVzdFJvb3RXb3JraW5nKTsKLQkJRmlsZSBwYXJlbnQgPSB0ZXN0Um9vdFdvcmtpbmcuZ2V0UGFyZW50RmlsZSgpOwotCQlpZiAodG9wQ2xlYW5VcEZvbGRlciA9PSBudWxsKSB7Ci0JCQl0b3BDbGVhblVwRm9sZGVyID0gcGFyZW50OwotCQl9IGVsc2UgaWYgKCEgdG9wQ2xlYW5VcEZvbGRlci5lcXVhbHMocGFyZW50KSl7Ci0JCQkvL1dvbid0IGhhcHBlbiBmb3Igbm93Ci0JCX0KLQkJdGVzdGVyLm9wZW5DdXJyVGVzdERpcih0ZXN0RGlyKTsKLQl9CQotCQotCS8qKgotCSAqIENhbGxlZCBmcm9tIExpYnJhcnlKdW5pdFRlc3QncyB0ZWFyRG93biBtZXRob2QgdG8gY2xlYXIgc29tZQotCSAqIHJlc291cmNlcyBpbiB0ZXN0ZXIuCi0JICovCi0JcHVibGljIHZvaWQgdGVhckRvd24oTGlicmFyeUp1bml0VGVzdCB0ZXN0Q2FzZSkgewotCQl0ZXN0ZXIuY2xvc2VDdXJyVGVzdERpcigpOwotCQlpZiAodGVzdGVyLmluY0V4ZWN1dGVkVGVzdENvdW50KCkgPT0gdGVzdENhc2UubnVtVGVzdENhc2VzKCkpIHsKLQkJCXRlc3Rlci5kb25lV2l0aEFsbFRlc3RzKGdldFRlc3RHcm91cCgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSB0ZXN0IGNvbW1hbmQgaW5zdGFuY2Ugb2YgdGhlIHRweWUgImNscyIuCi0JICovCi0JcHVibGljIFRlc3RDb21tYW5kIG5ld1Rlc3RDb21tYW5kKENsYXNzIGNscykgewotCQlyZXR1cm4gdGVzdGVyID09IG51bGwgPyBudWxsIDogdGVzdGVyLm5ld1Rlc3RDb21tYW5kKGNscyk7Ci0JfQotCQotCS8qKgotCSAqIFRyYWNpbmcgbWV0aG9kIHRoYXQgY2FuIGJlIGNhbGxlZCBieSBpbiBMaWJyYXJ5SnVuaXRUZXN0J3MgY29kZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0cmFjZShTdHJpbmcgbGluZSkgewotCQlpZiAodGVzdGVyICE9IG51bGwpIHsKLQkJCXRlc3Rlci50cmFjZShsaW5lKTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlUZXN0U2VydmljZS5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvTGlicmFyeVRlc3RTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYmFlMGIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvTGlicmFyeVRlc3RTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdXNlZCBpbiBKVW5pdCB0ZXN0cyBmb3IgbGlicmFyeSBleHBvcnQvaW1wb3J0Ci0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VGVzdFNlcnZpY2UgewkKLQkKLQlwcml2YXRlIHN0YXRpYyBMaWJyYXJ5VGVzdFNlcnZpY2UgaW5zdGFuY2UgPSBuZXcgTGlicmFyeVRlc3RTZXJ2aWNlKCk7CQotCQkKLQlwcml2YXRlIExpYnJhcnlUZXN0U2VydmljZSgpIHsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5VGVzdFNlcnZpY2UgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9CQotCQkJCi0JcHVibGljIE1ldGhvZExpYnJhcnkgY3JlYXRlTGlicmFyeShTdHJpbmcgcGF0aCwgU3RyaW5nIGxpYk5hbWUpIHsKLQkJdHJ5IHsKLQkJCU1hcCBwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJcGFyYW1zLnB1dCgibGlicmFyeS5wYXRoIiwgcGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCU1ldGhvZExpYnJhcnkgbGliID0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuY3JlYXRlTWV0aG9kTGlicmFyeShsaWJOYW1lLCAieG1pIiwgcGFyYW1zKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldEN1cnJlbnRNZXRob2RMaWJyYXJ5KGxpYik7Ci0JCQlyZXR1cm4gbGliOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBjbG9zZSB0aGUgdGVtcCBsaWJyYXJ5IGFuZCBkZWxldGUgdGhlIGxpYnJhcnkgcmVzb3VyY2UgZmlsZXMKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYikgewotCQlpZiAobGliID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJaWYgKGxpYiAhPSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCQotCQkJRmlsZSBsaWJGb2xkZXIgPSBuZXcgRmlsZShsaWIuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudEZpbGUoKTsKLQkJCQotCQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5jbG9zZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7CQkKLQkJCQotCQkJTWV0aG9kTGlicmFyeVByb2plY3QuY2xvc2VQcm9qZWN0KGxpYkZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSwgbnVsbCk7Ci0JCQkKLQkJfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGxvYWRMaWJyYXJ5KGZpbmFsIFN0cmluZyBwYXRoKSB7Ci0JCWZpbmFsIE1ldGhvZExpYnJhcnlbXSBsaWIgPSBuZXcgTWV0aG9kTGlicmFyeVsxXTsKLQkJbGliWzBdID0gbnVsbDsKLQkJCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlNZXRob2RMaWJyYXJ5UHJvamVjdC5vcGVuUHJvamVjdChwYXRoLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJbGliWzBdID0gTGlicmFyeVV0aWwubG9hZExpYnJhcnkocGF0aCArIEZpbGUuc2VwYXJhdG9yICsgImxpYnJhcnkueG1pIik7Ci0JCQkJCU1ldGhvZExpYnJhcnlQcm9qZWN0LmNsb3NlUHJvamVjdChwYXRoLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGxpYlswXTsKLQl9CQkKLQkKLQlwdWJsaWMgdm9pZCBkZWxldGVGb2xkZXIoRmlsZSBmb2xkZXIpIHsKLQkJaWYgKGZvbGRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRmlsZVV0aWwuZGVsZXRlQWxsRmlsZXMoZm9sZGVyLmdldEFic29sdXRlUGF0aCgpKTsKLQkJZm9sZGVyLmRlbGV0ZSgpOwotCX0JCQkKLQkKLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0RWxlbWVudChMaXN0IGVsZW1lbnRzLCBTdHJpbmcgbmFtZSkgewotCQlpbnQgc3ogPSBlbGVtZW50cyA9PSBudWxsID8gMCA6IGVsZW1lbnRzLnNpemUoKTsKLQkJaWYgKHN6ID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZvciAoaW50IGk9MDsgaTxzejsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gZWxlbWVudHMuZ2V0KGkpOwotCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gb2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCA/IChNZXRob2RFbGVtZW50KSBvYmogOiBudWxsOwotCQkJaWYgKGVsZW0gIT0gbnVsbCAmJiBlbGVtLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gZWxlbTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvTGlicmFyeVRlc3RlckZhY3RvcnkuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlUZXN0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YmQxZGMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvTGlicmFyeVRlc3RlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5MaWJyYXJ5VGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLkxpYnJhcnlUZXN0ZXJJbXBsOwotCi0vKioKLSAqIENsYXNzIGZhY3RvcnkgZm9yIExpYnJhcnlUZXNlciBpbnN0YW5jZXMKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlUZXN0ZXJGYWN0b3J5IHsJCi0JCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5VGVzdGVyIG5ld1Rlc3Rlcihib29sZWFuIHRyYWNlKSB7CQkJCi0JCXJldHVybiBuZXcgTGlicmFyeVRlc3RlckltcGwodHJhY2UpOwotCX0KLQkJCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvT3V0cHV0RGlmZkFuYWx5em9yLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9PdXRwdXREaWZmQW5hbHl6b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMyMmJkZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9PdXRwdXREaWZmQW5hbHl6b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UZXN0VHJhY2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIENsYXNzIHRvIGFuYWx5emUgdGhlIGRpZmZlcm5lY2VzIGJldHdlZW4gdHdvIGxpYnJhcnkgdGVzdGVyIG91dHB1dHMKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE91dHB1dERpZmZBbmFseXpvciB7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGxvY2FsRGVidWcgPSBmYWxzZTsKLQlwcml2YXRlIFRlc3RUcmFjZXIgdHJhY2VyOwotCXByaXZhdGUgYm9vbGVhbiBuZWVkVG9BbmFseXplID0gdHJ1ZTsgCi0JcHJpdmF0ZSBGaWxlIGYxOwotCXByaXZhdGUgRmlsZSBmMjsKLQlwcml2YXRlIERvY3VtZW50IGQxOwotCXByaXZhdGUgRG9jdW1lbnQgZDI7Ci0JcHJpdmF0ZSBpbnQgZGlmZkNvdW50ID0gMDsKLQlwcml2YXRlIGludCBlbGVtQ29tcGFyZWRDb3VudCA9IDA7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBleGNsdWRlR3VpZEZyb21OYW1lID0gdHJ1ZTsKLQkvL01heSB3YW50IHRvIHVzZSBmZWF0dXJlIGNsYXNzZXMgZGlyZWN0bHkgaW5zdGVhZCBvZiBuYW1lcyBsYXRlcgotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGV4Y2x1ZGVkRmVhdHVyZXMgPSB7Ci0JCSJndWlkIiwKLQkJImNoYW5nZURhdGUiCi0JfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBTZXQgZXhjbHVkZWRGZWF0dXJlU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkKLQlzdGF0aWMgewotCQlmb3IgKGludCBpPTA7IGk8ZXhjbHVkZWRGZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJZXhjbHVkZWRGZWF0dXJlU2V0LmFkZChleGNsdWRlZEZlYXR1cmVzW2ldKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgT3V0cHV0RGlmZkFuYWx5em9yKFRlc3RUcmFjZXIgdCwgRG9jdW1lbnQgZDEsIERvY3VtZW50IGQyLCBGaWxlIGYxLCBGaWxlIGYyKSB7Ci0JCXRyYWNlciA9IHQ7Ci0JCXRoaXMuZjEgPSBmMTsKLQkJdGhpcy5mMiA9IGYyOwotCQl0aGlzLmQxID0gZDEgPT0gbnVsbCA/IGdldERvY3VtZW50KGYxKSA6IGQxOwotCQl0aGlzLmQyID0gZDIgPT0gbnVsbCA/IGdldERvY3VtZW50KGYyKSA6IGQyOwotCX0JCQotCQotCXByaXZhdGUgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBYTUxVdGlsLmxvYWRYbWwoZmlsZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB0cmFjZShTdHJpbmcgbGluZSkgewotCQl0cmFjZXIudHJhY2UobGluZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhbmFseXplKCkgewotCQl0cmFjZSgiT3V0cHV0RGlmZkFuYWx5em9yLmFuYWx5emUgLT4iKTsKLQkJdHJhY2UoImYxOiAiICsgZjEuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl0cmFjZSgiZjI6ICIgKyBmMi5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCXRyYWNlKCIiKTsJCQotCQlhbmFseXplXygpOwotCQl0cmFjZSgiT3V0cHV0RGlmZkFuYWx5em9yLmFuYWx5emUgPC0iKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFuYWx5emVfKCkgewotCQlpZiAoISBuZWVkVG9BbmFseXplKSB7Ci0JCQl0cmFjZSgibm8gbmVlZCB0byBhbmFseXNlIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY29tcGFyZVJvb3QoZDEuZ2V0RG9jdW1lbnRFbGVtZW50KCksIGQyLmdldERvY3VtZW50RWxlbWVudCgpKTsKLQkJbmVlZFRvQW5hbHl6ZSA9IGZhbHNlOwotCX0KLQkKLS8vCVRvcCBlbnRyeSBmb3IgbWV0aG9kIGVsZW1lbnQgY29tcGFyaXNvbgotCXB1YmxpYyB2b2lkIGNvbXBhcmVSb290KEVsZW1lbnQgcm9vdDEsICBFbGVtZW50IHJvb3QyKSB7CQkKLQkJZGlmZkNvdW50ID0gMDsKLQkJZWxlbUNvbXBhcmVkQ291bnQgPSAxOwkJCi0JCXRyYWNlKCIiKTsKLQkJdHJhY2UoImNvbXBhcmVSb290IC0+ICIpOwotCQotCQlMaXN0IGVsZW1lbnRMaXN0MSA9IGNvbGxlY3RFbGVtZW50cyhyb290MS5nZXRDaGlsZE5vZGVzKCkpOwotCQlMaXN0IGVsZW1lbnRMaXN0MiA9IGNvbGxlY3RFbGVtZW50cyhyb290Mi5nZXRDaGlsZE5vZGVzKCkpOwkJCi0JCWludCBzejEgPSBlbGVtZW50TGlzdDEuc2l6ZSgpOwotCQlpbnQgc3oyID0gZWxlbWVudExpc3QyLnNpemUoKTsKLQotCQlpZiAoc3oxICE9IHN6MikgewotCQkJU3RyaW5nIG1zZyA9ICJyb290IGNoaWxkIGVsZW1lbnRzOiBzejEgIT0gc3oyIC0+ICIgKyBJbnRlZ2VyLnRvU3RyaW5nKHN6MSkgKyAiICE9ICIgKyBJbnRlZ2VyLnRvU3RyaW5nKHN6Mik7Ci0JCQlsb2dEaWZmKG1zZywgcm9vdDEsIHJvb3QyKTsKLQkJfQotCQkKLQkJaW50IHN6ID0gc3oxIDwgc3oyID8gc3oxIDogc3oyOwotCQlmb3IgKGludCBpPTA7IGk8c3o7IGkrKykgewotCQkJY29tcGFyZSgoRWxlbWVudCkgZWxlbWVudExpc3QxLmdldChpKSwgKEVsZW1lbnQpIGVsZW1lbnRMaXN0Mi5nZXQoaSkpOwotCQl9Ci0JCQotCQl0cmFjZSgiY29tcGFyZVJvb3QgPC0gZGlmZnM6ICIgKyBkaWZmQ291bnQgKyAiLCBlbGVtZW50czogIiArIGVsZW1Db21wYXJlZENvdW50ICsgIlxuIik7Ci0JfQotCQotCXByaXZhdGUgTGlzdCBjb2xsZWN0RWxlbWVudHMoTm9kZUxpc3Qgbm9kZUxpc3QpIHsKLQkJTGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaT0wOyBpPG5vZGVMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQllbGVtZW50cy5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0JCQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjb21wYXJlKEVsZW1lbnQgbm9kZTEsICBFbGVtZW50IG5vZGUyKSB7Ci0JCXRyYWNlKCJjb21wYXJlIC0+ICIpOwotCQljb21wYXJlSW5uZXIobm9kZTEsIG5vZGUyKTsKLQkJdHJhY2UoImNvbXBhcmUgPC0gIik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjb21wYXJlSW5uZXIoRWxlbWVudCBub2RlMSwgIEVsZW1lbnQgbm9kZTIpIHsKLQkJZWxlbUNvbXBhcmVkQ291bnQrKzsKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCXRyYWNlKCJjb21wYXJlSW5uZXIsIG5vZGUxOiAiICsgb3V0cHV0U3RyaW5nKG5vZGUxKSk7Ci0JCQl0cmFjZSgiY29tcGFyZUlubmVyLCBub2RlMjogIiArIG91dHB1dFN0cmluZyhub2RlMSkpOwotCQkJdHJhY2UoIiIpOwotCQl9Ci0JCQotCQlhdHRyaWJ1dGVFcXVhbHMobm9kZTEsIG5vZGUyKTsKLQkJCQotCQlMaXN0IGVsZW1lbnRMaXN0MSA9IGNvbGxlY3RFbGVtZW50cyhub2RlMS5nZXRDaGlsZE5vZGVzKCkpOwotCQlMaXN0IGVsZW1lbnRMaXN0MiA9IGNvbGxlY3RFbGVtZW50cyhub2RlMi5nZXRDaGlsZE5vZGVzKCkpOwkJCi0JCWludCBzejEgPSBlbGVtZW50TGlzdDEuc2l6ZSgpOwotCQlpbnQgc3oyID0gZWxlbWVudExpc3QyLnNpemUoKTsKLQotCQlpZiAoc3oxICE9IHN6MikgewotCQkJU3RyaW5nIG1zZyA9ICJDaGlsZCBlbGVtZW50czogc3oxICE9IHN6MiAtPiAiICsgSW50ZWdlci50b1N0cmluZyhzejEpICsgIiAhPSAiICsgSW50ZWdlci50b1N0cmluZyhzejIpOwotCQkJbG9nRGlmZihtc2csIG5vZGUxLCBub2RlMik7Ci0JCX0KLQkJCi0JCWludCBzeiA9IHN6MSA8IHN6MiA/IHN6MSA6IHN6MjsKLQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCWNvbXBhcmVJbm5lcigoRWxlbWVudCkgZWxlbWVudExpc3QxLmdldChpKSwgKEVsZW1lbnQpIGVsZW1lbnRMaXN0Mi5nZXQoaSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGF0dHJpYnV0ZUVxdWFscyhFbGVtZW50IG5vZGUxLCBFbGVtZW50IG5vZGUyKSB7Ci0JCWJvb2xlYW4gcmV0ID0gdHJ1ZTsKLQkJCi0JCU5hbWVkTm9kZU1hcCBhdHRzMSA9IG5vZGUxLmdldEF0dHJpYnV0ZXMoKTsKLQkJTmFtZWROb2RlTWFwIGF0dHMyID0gbm9kZTIuZ2V0QXR0cmlidXRlcygpOwotCQlpbnQgc3oxID0gYXR0czEuZ2V0TGVuZ3RoKCk7Ci0JCWludCBzejIgPSBhdHRzMi5nZXRMZW5ndGgoKTsKLQkJaWYgKHN6MSAhPSBzejIpIHsKLQkJCWxvZ0RpZmYoIkF0dHJpYnV0ZXM6IHN6MSAhPSBzejIiLCBub2RlMSwgbm9kZTIpOwotCQkJcmV0ID0gZmFsc2U7Ci0JCX0KLQkJaW50IHN6ID0gc3oxIDwgc3oyID8gc3oxIDogc3oyOwkJCi0JCWZvciAoaW50IGk9MDsgaTxzejsgaSsrKSB7Ci0JCQlTdHJpbmcgYXR0TmFtZSA9IGF0dHMxLml0ZW0oaSkuZ2V0Tm9kZU5hbWUoKTsKLQkJCWlmIChleGNsdWRlZEZlYXR1cmVTZXQuY29udGFpbnMoYXR0TmFtZSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZyB2YWwxID0gbm9kZTEuZ2V0QXR0cmlidXRlKGF0dE5hbWUpOwotCQkJU3RyaW5nIHZhbDIgPSBub2RlMi5nZXRBdHRyaWJ1dGUoYXR0TmFtZSk7Ci0JCQlpZiAoYXR0TmFtZS5lcXVhbHMoIm5hbWUiKSAmJiBleGNsdWRlR3VpZEZyb21OYW1lKSB7Ci0JCQkJaW50IGl4ID0gdmFsMS5pbmRleE9mKCIsIik7Ci0JCQkJaWYgKGl4ID4gMCkgewotCQkJCQl2YWwxID0gdmFsMS5zdWJzdHJpbmcoMCwgaXgpOwotCQkJCX0KLQkJCQlpeCA9IHZhbDIuaW5kZXhPZigiLCIpOwotCQkJCWlmIChpeCA+IDApIHsKLQkJCQkJdmFsMiA9IHZhbDIuc3Vic3RyaW5nKDAsIGl4KTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoISB2YWx1ZUVxdWFscyh2YWwxLCB2YWwyKSkgewotCQkJCVN0cmluZyBtc2cgPSBhdHROYW1lICsgIiB2YWx1ZXMgbm90IHRoZSBzYW1lISI7Ci0JCQkJbG9nRGlmZihtc2csIG5vZGUxLCBub2RlMiwgdmFsMSwgdmFsMik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiByZXQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiB2YWx1ZUVxdWFscyhPYmplY3QgdmFsMSwgT2JqZWN0IHZhbDIpIHsKLQkJaWYgKHZhbDEgPT0gbnVsbCkgewotCQkJdmFsMSA9ICIiOwotCQl9Ci0JCQotCQlpZiAodmFsMiA9PSBudWxsKSB7Ci0JCQl2YWwyID0gIiI7Ci0JCX0KLQkJCi0JCWlmICh2YWwxIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlTdHJpbmcgc3RyMSA9IChTdHJpbmcpIHZhbDE7Ci0JCQlTdHJpbmcgc3RyMiA9IChTdHJpbmcpIHZhbDI7Ci0JCQlyZXR1cm4gc3RyMS5lcXVhbHMoc3RyMik7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGxvZ0RpZmYoU3RyaW5nIG1zZywgRWxlbWVudCBub2RlMSwgRWxlbWVudCBub2RlMiwgT2JqZWN0IHZhbDEsIE9iamVjdCB2YWwyKSB7Ci0JCWxvZyhtc2csIG5vZGUxLCBub2RlMiwgdHJ1ZSk7Ci0JCVN0cmluZyBwcm9tcHQgPSBnZXREaWZmUHJvbXB0KCk7Ci0JCXRyYWNlKHByb21wdCArICJ2YWwxOiAiICsgdmFsMSk7Ci0JCXRyYWNlKHByb21wdCArICJ2YWwyOiAiICsgdmFsMik7CQotCQl0cmFjZSgiIik7Ci0JfQkKLQkJCi0JcHJpdmF0ZSBpbnQgaW5jRGlmZkNvdW50KCkgewotCQlyZXR1cm4gKytkaWZmQ291bnQ7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldERpZmZQcm9tcHQoKSB7Ci0JCXJldHVybiAiRF8iICsgZGlmZkNvdW50ICsgIj4gIjsJCi0JfQkKLQkKLQlwcml2YXRlIHZvaWQgbG9nRGlmZihTdHJpbmcgbXNnLCBFbGVtZW50IG5vZGUxLCBFbGVtZW50IG5vZGUyKSB7Ci0JCWxvZyhtc2csIG5vZGUxLCBub2RlMiwgdHJ1ZSk7Ci0JCXRyYWNlKCIiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgbXNnLCBFbGVtZW50IG5vZGUxLCBFbGVtZW50IG5vZGUyLCBib29sZWFuIGRpZmYpIHsKLQkJaWYgKGRpZmYpIHsKLQkJCWluY0RpZmZDb3VudCgpOwotCQl9Ci0JCVN0cmluZyBwcm9tcHQgPSBkaWZmID8gZ2V0RGlmZlByb21wdCgpIDogIldhcm5pbmc+ICI7Ci0JCS8vdHJhY2UocHJvbXB0ICsgInBhdGg6ICIgKyBwYXRoU3RyaW5nKG5vZGUxKSk7Ci0JCXRyYWNlKHByb21wdCArICJtc2c6ICIgKyBtc2cpOwotCQl0cmFjZShwcm9tcHQgKyAibm9kZTE6ICIgKyBvdXRwdXRTdHJpbmcobm9kZTEpKTsKLQkJdHJhY2UocHJvbXB0ICsgIm5vZGUyOiAiICsgb3V0cHV0U3RyaW5nKG5vZGUyKSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIHBhdGhTdHJpbmcoRWxlbWVudCBub2RlKSB7Ci0JCVN0YWNrIHBhdGhzID0gbmV3IFN0YWNrKCk7Ci0JCU5vZGUgY3Vyck5vZGUgPSBub2RlOwotCQl3aGlsZSAoY3Vyck5vZGUgIT0gbnVsbCAmJiBjdXJyTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCVN0cmluZyBuYW1lID0gKChFbGVtZW50KSBjdXJyTm9kZSkuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JCQlwYXRocy5wdXNoKG5hbWUpOwotCQkJY3Vyck5vZGUgPSBjdXJyTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJU3RyaW5nIHJldCA9ICIiOwotCQl3aGlsZSghIHBhdGhzLmlzRW1wdHkoKSkgewotCQkJcmV0ICs9ICIvIiArIHBhdGhzLnBvcCgpOwotCQl9CQkKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29tcGFyZSgpIHsKLQkJYW5hbHl6ZSgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgb3V0cHV0U3RyaW5nKEVsZW1lbnQgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQkJCQotCQlTdHJpbmcgdHlwZSA9IG5vZGUuZ2V0QXR0cmlidXRlKCJ0eXBlIik7Ci0JCXJldHVybiB0eXBlICsgIjogIiArIHBhdGhTdHJpbmcobm9kZSk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0RGlmZkNvdW50KCkgewotCQlyZXR1cm4gZGlmZkNvdW50OwotCX0KLQkKLQlwdWJsaWMgaW50IGdldEVsZW1Db21wYXJlZENvdW50KCkgewotCQlyZXR1cm4gZWxlbUNvbXBhcmVkQ291bnQ7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9RYVRlc3RTZXJ2aWNlLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9RYVRlc3RTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNzBmNTAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvUWFUZXN0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuSVRlc3RGb2xkZXJTZXR1cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuTGlicmFyeVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRlc3RDb21tYW5kOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgTGlicmFyeVRlc3RlciBzZXJ2aWNlIHRvIHJ1biB0ZXN0IGNvbW1hbmQgZmlsZXMuCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBRYVRlc3RTZXJ2aWNlIGltcGxlbWVudHMgSVRlc3RGb2xkZXJTZXR1cCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRlc3RHcm91cE5hbWUgPSAiVGVzdENvbW1hbmRGaWxlVGVzdHMiOwotCXByaXZhdGUgc3RhdGljIEZpbGUgdGVzdEdyb3VwOwkJCi0JCi0JcHJpdmF0ZSBMaWJyYXJ5VGVzdGVyIHRlc3RlcjsKLQlwcml2YXRlIElUZXN0Rm9sZGVyU2V0dXAgdGVzdEZvbGRlclNldHVwOwotCQotCXB1YmxpYyBzdGF0aWMgRmlsZUZpbHRlciB0Y0ZpbHRlciA9IG5ldyBGaWxlRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkgewotCQkJcmV0dXJuIHBhdGhuYW1lLmdldE5hbWUoKS5lbmRzV2l0aChUZXN0Q29tbWFuZC5UZXN0TmFtZUV4dCk7Ci0JCX07CQkJCi0JfTsKLQkKLQlwdWJsaWMgc3RhdGljIEZpbGVGaWx0ZXIgZGlyRmlsdGVyID0gbmV3IEZpbGVGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIHBhdGhuYW1lKSB7Ci0JCQlyZXR1cm4gcGF0aG5hbWUuaXNEaXJlY3RvcnkoKTsKLQkJfTsJCQkKLQl9OwotCQotCXB1YmxpYyBRYVRlc3RTZXJ2aWNlKElUZXN0Rm9sZGVyU2V0dXAgdGVzdEZvbGRlclNldHVwLCBib29sZWFuIHRyYWNlKSB7Ci0JCXRoaXMudGVzdEZvbGRlclNldHVwID0gdGVzdEZvbGRlclNldHVwOwotCQl0ZXN0ZXIgPSBMaWJyYXJ5VGVzdGVyRmFjdG9yeS5uZXdUZXN0ZXIodHJhY2UpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdG9wIHRlc3Qgcm9vdCBzb3VyY2UgZm9sZGVyIGZpbGUKLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRUb3BUZXN0Um9vdFNvdXJjZSgpIHsKLQkJcmV0dXJuIHRlc3RGb2xkZXJTZXR1cC5nZXRUb3BUZXN0Um9vdFNvdXJjZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGVzdCBob21lIGZvbGRlciBmaWxlCi0JICovCi0JcHVibGljIEZpbGUgZ2V0VGVzdEhvbWUoKSB7Ci0JCXJldHVybiB0ZXN0Rm9sZGVyU2V0dXAuZ2V0VGVzdEhvbWUoKTsKLQl9CQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgRmlsZSBnZXRUZXN0R3JvdXAoKSB7Ci0JCWlmICh0ZXN0R3JvdXAgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGggPSBnZXRUZXN0SG9tZSgpLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyB0ZXN0R3JvdXBOYW1lOwotCQkJdGVzdEdyb3VwID0gbmV3IEZpbGUocGF0aCk7Ci0JCX0KLQkJcmV0dXJuIHRlc3RHcm91cDsKLQl9Ci0JCi0JLyoqCi0JICogUGlja3MgdXAgYW5kIHJ1bnMgYWxsIHRlc3QgY29tbWFuZCBmaWxlcyB1bmRlciAic3RhcnRpbmdUZXN0Um9vdFNvdXJjZSIKLQkgKiBmb2xkZXIgcmVjdXJzaXZlbHkuIFRlc3Qgd29ya2luZyBsb2NhdGlvbiBzdGFydHMgZnJvbSAic3RhcnRpbmdUZXN0Um9vdFdvcmtpbmciLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgcnVuQWxsQ2FzZXMoRmlsZSBzdGFydGluZ1Rlc3RSb290U291cmNlLCBGaWxlIHN0YXJ0aW5nVGVzdFJvb3RXb3JraW5nKSB7CQotCQlTdHJpbmdCdWZmZXIgZXJyb3JNc2dCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXRyYXZlcnNlRm9sZGVyKHN0YXJ0aW5nVGVzdFJvb3RTb3VyY2UsIHN0YXJ0aW5nVGVzdFJvb3RXb3JraW5nLCBlcnJvck1zZ0J1ZiwgdHJ1ZSk7Ci0JCXRlc3Rlci5jbG9zZUN1cnJUZXN0RGlyKCk7Ci0JCXRlc3Rlci5kb25lV2l0aEFsbFRlc3RzKGdldFRlc3RHcm91cCgpKTsKLQkJcmV0dXJuIGVycm9yTXNnQnVmLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIFBpY2tzIHVwIGFuZCBydW5zIGFsbCBsb2NhbCB0ZXN0IGNvbW1hbmQgZmlsZXMgdW5kZXIgInRlc3RSb290U291cmNlIgotCSAqIGZvbGRlci4gVGVzdCB3b3JraW5nIGxvY2F0aW9uIGlzIGdpdmVuIGJ5ICJ0ZXN0Um9vdFdvcmtpbmciLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgcnVuTG9jYWxDYXNlcyhGaWxlIHRlc3RSb290U291cmNlLCBGaWxlIHRlc3RSb290V29ya2luZykgewkKLQkJU3RyaW5nQnVmZmVyIGVycm9yTXNnQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0cmF2ZXJzZUZvbGRlcih0ZXN0Um9vdFNvdXJjZSwgdGVzdFJvb3RXb3JraW5nLCBlcnJvck1zZ0J1ZiwgZmFsc2UpOwotCQlyZXR1cm4gZXJyb3JNc2dCdWYudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogUnVucyB0aGUgdGVzdCBjb21tYW5kIGZpbGUgInRjRmlsZSIgd2l0aCB0ZXN0IHJvb3Qgc291cmNlIGZvbGRlcgotCSAqIGdpdmVuIGJ5ICJ0ZXN0Um9vdFNvdXJjZSIgYW5kIHRlc3Qgcm9vdCB3b3JraW5nIGZvbGRlciBnaXZlbiBieQotCSAqICJ0ZXN0Um9vdFdvcmtpbmciLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgcnVuQ2FzZShGaWxlIHRlc3RSb290U291cmNlLCBGaWxlIHRlc3RSb290V29ya2luZywgRmlsZSB0Y0ZpbGUpIHsJCi0JCXRlc3Rlci5zZXRUZXN0Um9vdFNvdXJjZSh0ZXN0Um9vdFNvdXJjZSk7Ci0JCXRlc3Rlci5zZXRUZXN0Um9vdFdvcmtpbmcodGVzdFJvb3RXb3JraW5nKTsKLQkJCi0JCVN0cmluZ0J1ZmZlciBlcnJvck1zZ0J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJcnVuQ2FzZShlcnJvck1zZ0J1ZiwgdGNGaWxlKTsKLQkJcmV0dXJuIGVycm9yTXNnQnVmLnRvU3RyaW5nKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB0cmF2ZXJzZUZvbGRlcihGaWxlIHRlc3RSb290U291cmNlLCBGaWxlIHRlc3RSb290V29ya2luZywgCi0JCQlTdHJpbmdCdWZmZXIgZXJyb3JNc2dCdWYsIGJvb2xlYW4gcmVjdXJzdXZlbHkpIHsJCQotCQkJCQkKLQkJRmlsZSBmaWxlc1tdID0gdGVzdFJvb3RTb3VyY2UubGlzdEZpbGVzKHRjRmlsdGVyKTsKLQkJZXhlY3V0ZVRDRmlsZXModGVzdFJvb3RTb3VyY2UsIHRlc3RSb290V29ya2luZywgIGZpbGVzLCBlcnJvck1zZ0J1Zik7Ci0JCWlmICghIHJlY3Vyc3V2ZWx5KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCQotCQlGaWxlIGRpcnNbXSA9IHRlc3RSb290U291cmNlLmxpc3RGaWxlcyhkaXJGaWx0ZXIpOwotCQlpbnQgc3ogPSBkaXJzID09IG51bGwgPyAwIDogZGlycy5sZW5ndGg7Ci0JCWlmIChzeiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCUZpbGUgZGlyID0gZGlyc1tpXTsKLQkJCVN0cmluZyBwYXRoID0gdGVzdFJvb3RXb3JraW5nLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBkaXIuZ2V0TmFtZSgpIAotCQkJCQkJCQkrIEZpbGUuc2VwYXJhdG9yOwotCQkJdHJhdmVyc2VGb2xkZXIoZGlyLCBuZXcgRmlsZShwYXRoKSwgZXJyb3JNc2dCdWYsIHJlY3Vyc3V2ZWx5KTsKLQkJfQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVUQ0ZpbGVzKEZpbGUgdGVzdFJvb3RTb3VyY2UsIEZpbGUgdGVzdFJvb3RXb3JraW5nLCBGaWxlIHRjRmlsZXNbXSwgU3RyaW5nQnVmZmVyIGVycm9yTXNnQnVmKSB7Ci0JCWludCBzeiA9IHRjRmlsZXMgPT0gbnVsbCA/IDAgOiB0Y0ZpbGVzLmxlbmd0aDsKLQkJaWYgKHN6ID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQkJCQotCQl0ZXN0ZXIuc2V0VGVzdFJvb3RTb3VyY2UodGVzdFJvb3RTb3VyY2UpOwotCQl0ZXN0ZXIuc2V0VGVzdFJvb3RXb3JraW5nKHRlc3RSb290V29ya2luZyk7Ci0JCQotCQlmb3IgKGludCBpPTA7IGk8c3o7IGkrKykgewotCQkJRmlsZSB0Y0ZpbGUgPSB0Y0ZpbGVzW2ldOwotCQkJcnVuQ2FzZShlcnJvck1zZ0J1ZiwgdGNGaWxlKTsJCQkKLQkJfQkJCQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcnVuQ2FzZShTdHJpbmdCdWZmZXIgZXJyb3JNc2dCdWYsIEZpbGUgdGNGaWxlKSB7CQotCQl0ZXN0ZXIuc2V0VGVzdCh0Y0ZpbGUpOwotCQlUQ0V4ZVJlcGx5TGlzdCByZXN1bHQgPSB0ZXN0ZXIuZXhlY3V0ZSgpOwotCQlpZiAoISByZXN1bHQucGFzc2luZygpKSB7Ci0JCQlTdHJpbmcgbXNnID0gcmVzdWx0LmdldFN1bW1hcnlSZXBseSgpOwotCQkJZXJyb3JNc2dCdWYuYXBwZW5kKCJcbiIgKyBtc2cpOwotCQkJdGVzdGVyLnRyYWNlKG1zZyk7Ci0JCX0KLQl9Ci0JCi0KLQkKLQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL1Rlc3RDb21tYW5kRmlsZVRlc3QuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL1Rlc3RDb21tYW5kRmlsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk2MDE4YS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0Q29tbWFuZEZpbGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogSlVOSVQgdGVzdCBvbiBydW5pbmcgYSB0ZXN0IGNvbW1hbmQgZmlsZSBpbiB0cmFjZSBtb2RlCi0gKiBmb3IgZGVidWcgcHVycG9zZS4KLSAqIFRoZSBsb2NhdGlvbiBvZiB0ZXN0IGZpbGUgaXMgaGFyZCBjb2RlZCBmb3Igbm93LgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGVzdENvbW1hbmRGaWxlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQkvKioKLQkgKiBUZXN0IGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0b3BUZXN0Um9vdFNvdXJjZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0Y0ZpbGVQYXRoRnJvbVRvcFJvb3RTb3VyY2VbXSA9IHsKLS8qCQkiVGVzdENvbW1hbmRzIiwKLQkJIm5ld01ldGhvZFBsdWdpbiIsCi0JCSJuZXdNZXRob2RQbHVnaW4udGMiKi8KLS8qCQkKLQkJIkV4cG9ydEltcG9ydCIsCi0JCSJCdWdzXzEiLAotCQkiMTUwNzAyIiwKLQkJIjE1MDcwMi50YyIqLwkJCi0JCQotCQkiVGVzdENvbW1hbmRzIiwKLQkJIm5ld01ldGhvZEVsZW1lbnRzIiwKLQkJIm5ld01ldGhvZEVsZW1lbnRzLnRjIgotCQkKLS8qCQkiVGVzdENvbW1hbmRzIiwKLQkJImtlbHZpbkNhc2UudGMiKi8KLQkJCi0vKgkJIlZhbGlkYXRpb24iLAotCQkiQnVncyIsCi0JCSIxNzEwMjgudGMiKi8KLQl9OwotCQkKLQlwcml2YXRlIFFhVGVzdFNlcnZpY2Ugc2VydmljZSA9IG5ldwlRYVRlc3RTZXJ2aWNlKG5ldyBUZXN0Rm9sZGVyU2V0dXAoKSwgdHJ1ZSk7Ci0JCi0JcHVibGljIFRlc3RDb21tYW5kRmlsZVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgdGVzdCBydW5zIHRoZSBnaXZlbiB0ZXN0IGNvbW1hbmQgZmlsZS4KLQkgKi8gCi0JcHVibGljIHZvaWQgdGVzdE9uZUNhc2UoKSB7Ci0JCXJ1blRlc3RPbmVDYXNlKHNlcnZpY2UsIHRjRmlsZVBhdGhGcm9tVG9wUm9vdFNvdXJjZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5UZXN0T25lQ2FzZShRYVRlc3RTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyB0Y0ZpbGVQYXRoRnJvbVRvcFJvb3RTb3VyY2VbXSkgewotCQlTdHJpbmcgcGF0aCA9IHNlcnZpY2UuZ2V0VGVzdEdyb3VwKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCS8vcGF0aCArPSBGaWxlLnNlcGFyYXRvciArIExvbmcudG9IZXhTdHJpbmcoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lSW5NaWxsaXMoKSkgKyBGaWxlLnNlcGFyYXRvcjsJCQotCQlGaWxlIHRlc3RSb290V29ya2luZyA9IG5ldyBGaWxlKHBhdGgpOwotCQlMaWJyYXJ5VGVzdFNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5kZWxldGVGb2xkZXIodGVzdFJvb3RXb3JraW5nKTsKLQkJCi0JCUZpbGUgdG9wVGVzdFJvb3RTb3VyY2UgPSBzZXJ2aWNlLmdldFRvcFRlc3RSb290U291cmNlKCk7Ci0JCQotCQlwYXRoID0gdG9wVGVzdFJvb3RTb3VyY2UuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCWZvciAoaW50IGk9MDsgaTx0Y0ZpbGVQYXRoRnJvbVRvcFJvb3RTb3VyY2UubGVuZ3RoOyBpKyspIHsKLQkJCXBhdGggKz0gRmlsZS5zZXBhcmF0b3IgKyB0Y0ZpbGVQYXRoRnJvbVRvcFJvb3RTb3VyY2VbaV07Ci0JCX0KLQkJRmlsZSB0Y0ZpbGUgPSBuZXcgRmlsZShwYXRoKTsJCQotCQkKLQkJU3RyaW5nIGVycm9yTXNnID0gc2VydmljZS5ydW5DYXNlKHRjRmlsZS5nZXRQYXJlbnRGaWxlKCksIHRlc3RSb290V29ya2luZywgdGNGaWxlKTsKLQkJYXNzZXJ0VHJ1ZShlcnJvck1zZywgZXJyb3JNc2cubGVuZ3RoKCkgPT0gMCk7Ci0JfQotCQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL1Rlc3RDb21tYW5kRmlsZVRlc3RzLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0Q29tbWFuZEZpbGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTQ0MWNhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL1Rlc3RDb21tYW5kRmlsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5DYWxlbmRhcjsKLQotLyoqCi0gKiBKVU5JVCB0ZXN0IG9uIHRlc3QgY29tbWFuZCBmaWxlcwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGVzdENvbW1hbmRGaWxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBRYVRlc3RTZXJ2aWNlIHNlcnZpY2UgPSBuZXcJUWFUZXN0U2VydmljZShuZXcgVGVzdEZvbGRlclNldHVwKCksIGZhbHNlKTsKLQkKLQlwdWJsaWMgVGVzdENvbW1hbmRGaWxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQkJCQkJCQotCQkJCi0JLyoqCi0JICogVGhpcyB0ZXN0IHBpY2tzIHVwIGFuZCBydW5zIGFsbCB0ZXN0IGNvbW1hbmQgZmlsZXMgdW5kZXIgdGhlCi0JICogZm9sZGVyIHNlcnZpY2UuZ2V0VG9wVGVzdFJvb3RTb3VyY2UoKSByZWN1cnNpdmVseS4gCi0JICovIAotCXB1YmxpYyB2b2lkIHRlc3RBbGxDYXNlcygpIHsKLQkJcnVuVGVzdEFsbENhc2VzKHNlcnZpY2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuVGVzdEFsbENhc2VzKFFhVGVzdFNlcnZpY2Ugc2VydmljZSkgewotCQlTdHJpbmcgcGF0aCA9IHNlcnZpY2UuZ2V0VGVzdEdyb3VwKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQotCQlTaW1wbGVEYXRlRm9ybWF0IHNkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIGhoOm1tOnNzOlNTUyIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkdFN0ciA9IHNkZi5mb3JtYXQobmV3IERhdGUoKSk7Ci0JCWR0U3RyID0gZHRTdHIucmVwbGFjZSgnICcsICdfJyk7Ci0JCWR0U3RyID0gZHRTdHIucmVwbGFjZSgnOicsICctJyk7Ci0JCQotCQlwYXRoICs9IEZpbGUuc2VwYXJhdG9yICsgZHRTdHIgKyBGaWxlLnNlcGFyYXRvcjsKLQkJU3RyaW5nIGVycm9yTXNnID0gc2VydmljZS5ydW5BbGxDYXNlcyhzZXJ2aWNlLmdldFRvcFRlc3RSb290U291cmNlKCksIG5ldyBGaWxlKHBhdGgpKTsKLQkJYXNzZXJ0VHJ1ZShlcnJvck1zZywgZXJyb3JNc2cubGVuZ3RoKCkgPT0gMCk7Ci0JfQotCQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL1Rlc3RGb2xkZXJTZXR1cC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvVGVzdEZvbGRlclNldHVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNzkzNDYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvVGVzdEZvbGRlclNldHVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuSVRlc3RGb2xkZXJTZXR1cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5UZXN0c1BsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHNldHMgdGhlIHRvcCBmb2xkZXIgbG9jYXRpb25zIGZvciBMaWJyYXJ5VGVzdGVyIAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGVzdEZvbGRlclNldHVwIGltcGxlbWVudHMgSVRlc3RGb2xkZXJTZXR1cCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZSB0b3BUZXN0Um9vdFNvdXJjZSA9IG5ldyBGaWxlIChUZXN0c1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW5zdGFsbFBhdGgoKSArICAKLQkJCSJMaWJyYXJpZXMiICsgRmlsZS5zZXBhcmF0b3IgKyAiMS4wLjAiICsgRmlsZS5zZXBhcmF0b3IpIDsKLQkJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZSB0ZXN0SG9tZSA9IG5ldyBGaWxlIChTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpICsgRmlsZS5zZXBhcmF0b3IgLy8kTk9OLU5MUy0yJAotCQkJKyAiRVBGIiArIEZpbGUuc2VwYXJhdG9yICsgInRlc3QiICsgRmlsZS5zZXBhcmF0b3IpOwotCQotCS8qKgotCSAqIFJldHVybiB0b3AgdGVzdCByb290IHNvdXJjZSBmb2xkZXIgZmlsZQotCSAqLwotCXB1YmxpYyBGaWxlIGdldFRvcFRlc3RSb290U291cmNlKCkgewotCQlyZXR1cm4gdG9wVGVzdFJvb3RTb3VyY2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0ZXN0IGhvbWUgZm9sZGVyIGZpbGUKLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRUZXN0SG9tZSgpIHsKLQkJcmV0dXJuIHRlc3RIb21lOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL1Rlc3Rlck91dHB1dFV0aWwuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL1Rlc3Rlck91dHB1dFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThhOTJlNC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0ZXJPdXRwdXRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UZXN0VHJhY2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgdGVzdGVyIG91dHB1dCBtYW5pcHVsYXRpb25zCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0ZXJPdXRwdXRVdGlsIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBUZXN0VHJhY2VyIHRyYWNlcjsKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VHJhY2VyKFRlc3RUcmFjZXIgdCkgewotCQl0cmFjZXIgPSB0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGxpbmUpIHsKLQkJaWYgKHRyYWNlciA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obGluZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0cmFjZXIudHJhY2UobGluZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBsb2NhbERlYnVnID0gZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyBNZXRob2RQbHVnaW4gZ2V0TWV0aG9kUGx1Z2luKE1ldGhvZExpYnJhcnkgbGliLCBTdHJpbmcgbmFtZSkgewotCQlNYXAgbmFtZU1hcCA9IGdldE1ldGhvZEVsZW1lbnROYW1lTWFwKGxpYi5nZXRNZXRob2RQbHVnaW5zKCkpOwotCQlyZXR1cm4gKE1ldGhvZFBsdWdpbikgbmFtZU1hcC5nZXQobmFtZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZExpYnJhcnkgbGliLCBTdHJpbmcgbmFtZSkgewotCQlNYXAgbmFtZU1hcCA9IGdldE1ldGhvZEVsZW1lbnROYW1lTWFwKGxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSk7Ci0JCXJldHVybiAoTWV0aG9kQ29uZmlndXJhdGlvbikgbmFtZU1hcC5nZXQobmFtZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KE1ldGhvZExpYnJhcnkgbGliLCBTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gZ2V0TWV0aG9kRWxlbWVudF8obGliLCBwYXRoLHRydWUpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnRfKE1ldGhvZExpYnJhcnkgbGliLCBTdHJpbmcgcGF0aCwgYm9vbGVhbiByZXNvbHZlUHJvY2Vzc0VsZW1lbnQpIHsKLQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gZ2V0TWV0aG9kRWxlbWVudF8obGliLCBwYXRoKTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSAmJiByZXNvbHZlUHJvY2Vzc0VsZW1lbnQpIHsKLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgZWxlbWVudDsKLQkJCUxpc3QgY2hpbGRyZW4gPSBwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCk7Ci0JCQlpZiAoY2hpbGRyZW4uc2l6ZSgpID09IDEgJiYgCi0JCQkJCSgoUHJvY2Vzc0VsZW1lbnQpIGNoaWxkcmVuLmdldCgwKSkuZ2V0TmFtZSgpLmVxdWFscyhwa2cuZ2V0TmFtZSgpKSkgewotCQkJCXJldHVybiAoTWV0aG9kRWxlbWVudCkgY2hpbGRyZW4uZ2V0KDApOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnRfKE1ldGhvZExpYnJhcnkgbGliLCBTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGxpYjsKLQkJfQotCQlMaXN0IHBhdGhzID0gcGFyc2VNZXRob2RFbGVtZW50UGF0aChwYXRoKTsKLQkJaW50IHN6ID0gcGF0aHMuc2l6ZSgpOwotCQlpZiAoc3ogPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0JCQotCQlNZXRob2RFbGVtZW50IG1lID0gZ2V0Rmlyc3RNZXRob2RFbGVtZW50KGxpYiwgKFN0cmluZykgcGF0aHMuZ2V0KDApKTsKLQkJaWYgKG1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZvciAoaW50IGk9MTsgaTxzejsgaSsrKSB7Ci0JCQlNYXAgbmFtZU1hcCA9IGdldE1ldGhvZEVsZW1lbnROYW1lTWFwKG1lLmVDb250ZW50cygpKTsKLQkJCW1lID0gKE1ldGhvZEVsZW1lbnQpIG5hbWVNYXAuZ2V0KHBhdGhzLmdldChpKSk7Ci0JCQlpZiAobWUgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9CQkKLQkJcmV0dXJuIG1lOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldEZpcnN0TWV0aG9kRWxlbWVudChNZXRob2RMaWJyYXJ5IGxpYiwgU3RyaW5nIGZpcnN0UGF0aCkgewotCQlNZXRob2RFbGVtZW50IG1lID0gZ2V0TWV0aG9kUGx1Z2luKGxpYiwgZmlyc3RQYXRoKTsKLQkJaWYgKG1lICE9IG51bGwpIHsKLQkJCXJldHVybiBtZTsKLQkJfQotCQlyZXR1cm4gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihsaWIsIGZpcnN0UGF0aCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUHJvY2Vzc0VsZW1lbnQgZ2V0UHJvY2Vzc0VsZW1lbnQoTWV0aG9kTGlicmFyeSBsaWIsIFN0cmluZyBwYXRoKSB7Ci0JCWludCBpeCA9IHBhdGgubGFzdEluZGV4T2YoIi8iKTsKLQkJU3RyaW5nIHBhcmVudFBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBpeCk7Ci0JCVN0cmluZyBuYW1lID0gcGF0aC5zdWJzdHJpbmcoaXggKyAxKTsKLQkJCi0JCVByb2Nlc3NQYWNrYWdlIG91dGVyUGFyZW50ID0gZ2V0UHJvY2Vzc0VsZW1lbnRQYXJlbnQobGliLCBwYXJlbnRQYXRoKTsKLQkJCi0JCU1hcCBuYW1lTWFwID0gZ2V0TWV0aG9kRWxlbWVudE5hbWVNYXAob3V0ZXJQYXJlbnQuZ2V0Q2hpbGRQYWNrYWdlcygpKTsKLQkJUHJvY2Vzc1BhY2thZ2UgaW5uZXJQYXJlbnQgPSAoUHJvY2Vzc1BhY2thZ2UpIG5hbWVNYXAuZ2V0KG5hbWUpOwotCQlpZiAoaW5uZXJQYXJlbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlyZXR1cm4gKChQcm9jZXNzQ29tcG9uZW50KSBpbm5lclBhcmVudCkuZ2V0UHJvY2VzcygpOwotCQl9Ci0JCUxpc3QgcGVzID0gaW5uZXJQYXJlbnQuZ2V0UHJvY2Vzc0VsZW1lbnRzKCk7Ci0JCWlmIChwZXMuc2l6ZSgpICE9IDEpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHBlcy5zaXplKCkgPT0gIiArIHBlcy5zaXplKCkgKyAiICE9IDEiKTsKLQkJfQotCQkKLQkJcmV0dXJuIChQcm9jZXNzRWxlbWVudCkgcGVzLmdldCgwKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzUGFja2FnZSBnZXRQcm9jZXNzRWxlbWVudFBhcmVudChNZXRob2RMaWJyYXJ5IGxpYiwgU3RyaW5nIHBhcmVudFBhdGgpIHsKLQkJCXJldHVybiAoUHJvY2Vzc1BhY2thZ2UpIGdldE1ldGhvZEVsZW1lbnRfKGxpYiwgcGFyZW50UGF0aCwgZmFsc2UpOwkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0IHBhcnNlTWV0aG9kRWxlbWVudFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJTGlzdCByZXQgPSBuZXcgQXJyYXlMaXN0KCk7CQkKLQkJU3RyaW5nIG5hbWUgPSBwYXRoOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJaW50IGl4ID0gcGF0aC5pbmRleE9mKCIvIik7Ci0JCQlpZiAoaXggPCAwKSB7Ci0JCQkJcmV0LmFkZChwYXRoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXJldC5hZGQocGF0aC5zdWJzdHJpbmcoMCwgaXgpKTsKLQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZyhpeCArIDEpOwotCQl9CQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBNYXAgZ2V0TWV0aG9kRWxlbWVudE5hbWVNYXAoTGlzdCBjb250ZW50cykgewotCQlNYXAgbmFtZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxjb250ZW50cy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGNvbnRlbnRzLmdldChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQkJCQluYW1lTWFwLnB1dChlbGVtLmdldE5hbWUoKSwgZWxlbSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWVNYXA7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE91dHB1dFBhdGgoTWV0aG9kRWxlbWVudCBtZSkgewotCQlpZiAobWUgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJaWYgKG1lIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IG1lIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJcmV0dXJuIG1lLmdldE5hbWUoKTsKLQkJfQotCQlTdGFjayBzdGFjayA9IG5ldyBTdGFjaygpOwotCQlNZXRob2RFbGVtZW50IGN1cnJNZSA9IG1lOwotCQl3aGlsZSAoISAoY3Vyck1lIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkpIHsKLQkJCVN0cmluZyBuYW1lID0gY3Vyck1lLmdldE5hbWUoKTsKLQkJCWlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlzdGFjay5wdXNoKG5hbWUpOwotCQkJfQotCQkJTWV0aG9kRWxlbWVudCBvbGRNZSA9IGN1cnJNZTsKLQkJCWN1cnJNZSA9IChNZXRob2RFbGVtZW50KSBjdXJyTWUuZUNvbnRhaW5lcigpOwotCQkJaWYgKGN1cnJNZSA9PSBudWxsICkgewotCQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGN1cnJNZSA9PSBudWxsLCBvbGRNZTogIiArIG9sZE1lKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIHBhdGggPSAiIjsKLQkJd2hpbGUgKCEgc3RhY2suaXNFbXB0eSgpKSB7Ci0JCQlwYXRoICs9IChTdHJpbmcpIHN0YWNrLnBvcCgpICsgIi8iOwkJCQotCQl9Ci0JCWludCBpeCA9IHBhdGgubGVuZ3RoKCkgLSAxOwotCQlyZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgaXgpOwotCX0KLQkJCi0JcHVibGljIHN0YXRpYyB2b2lkIHNob3coU3RyaW5nIG1zZywgTGlzdCBsaXN0KSB7Ci0JCXRyYWNlKG1zZyk7Ci0JCWZvciAoaW50IGk9MDsgaTxsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQl0cmFjZSgibGlzdFsiICsgaSArICJdIiArIGxpc3QuZ2V0KGkpKTsKLQkJfQotCQl0cmFjZSgiIik7Ci0JfQotCQkKLX0KLQotCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9JVGVzdEZvbGRlclNldHVwLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9JVGVzdEZvbGRlclNldHVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZWExYzAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvSVRlc3RGb2xkZXJTZXR1cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVRlc3RGb2xkZXJTZXR1cCB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdG9wIHRlc3Qgcm9vdCBzb3VyY2UgZm9sZGVyIGZpbGUKLQkgKi8KLQlGaWxlIGdldFRvcFRlc3RSb290U291cmNlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRlc3QgaG9tZSBmb2xkZXIgZmlsZQotCSAqLwotCUZpbGUgZ2V0VGVzdEhvbWUoKTsJCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9MaWJyYXJ5SnVuaXRUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9MaWJyYXJ5SnVuaXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiOTNkMjIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvTGlicmFyeUp1bml0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlOwotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IGFsbCBUZXN0Q2FzZQotICogY2xhc3NlcyB0aGF0IHdhbnQgdG8gdXNlIExpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlLiAKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBMaWJyYXJ5SnVuaXRUZXN0IHsKLQkKLQkvKgotCSAqIE51bWJlciBvZiB0ZXN0IGNhc2VzIGluIHRoZSBpbXBsZW1lbnRpbmcKLQkgKiBUZXN0Q2FzZSBjbGFzcy4gSXQgaXMgdXNlZCBieSBMaWJyYXJ5SnVuaXRUZXN0U2VydmljZQotCSAqIHRvIGRldGVybWluZSB3aGVuIHRvIGNsZWFyIHVwIHNvbWUgdGVzdGVyIHJlc291cmNlcy4KLQkgKi8KLQlpbnQgbnVtVGVzdENhc2VzKCk7Ci0JCi0JLyoKLQkgKiBOYW1lIG9mIHRoZSB0ZXN0IGNsYXNzIGluc3RhbmNlCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2lmYWNlL0xpYnJhcnlUZXN0ZXIuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2lmYWNlL0xpYnJhcnlUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiMTQyMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9MaWJyYXJ5VGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuTGlicmFyeVRlc3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBVc2VkIGluIEpVbml0IHRlc3RzIAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpYnJhcnlUZXN0ZXIgZXh0ZW5kcyBUZXN0VHJhY2VyIHsJCi0JCi0JVGVzdENvbW1hbmQgbmV3VGVzdENvbW1hbmQoQ2xhc3MgY2xzKTsJCi0JCi0Jdm9pZCBzZXRUZXN0Um9vdFNvdXJjZShGaWxlIGRpckZpbGUpOwotCQotCXZvaWQgc2V0VGVzdFJvb3RXb3JraW5nKEZpbGUgZGlyRmlsZSk7Ci0JCi0Jdm9pZCBvcGVuQ3VyclRlc3REaXIoRmlsZSBkaXJGaWxlKTsKLQkKLQl2b2lkIGNsb3NlQ3VyclRlc3REaXIoKTsKLQkKLQl2b2lkIGRvbmVXaXRoQWxsVGVzdHMoRmlsZSB0b3BDbGVhblVwRm9sZGVyKTsJCi0JCQotCXZvaWQgc2V0VGVzdChGaWxlIHRlc3RGaWxlKTsJCQkKLQkKLQlpbnQgaW5jRXhlY3V0ZWRUZXN0Q291bnQoKTsKLQkKLQl2b2lkIHRyYWNlKFN0cmluZyBsaW5lKTsKLQkKLQlUQ0V4ZVJlcGx5TGlzdCBleGVjdXRlKCk7Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9UQ0V4ZVJlcGx5LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9UQ0V4ZVJlcGx5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYTkzZDcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvVENFeGVSZXBseS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogSW50ZXJmYWNlIHJlcHJlc2VudGluZyByZXBseSBmcm9tIGEgdGVzdCBjb21tYW5kIGV4ZWN1dGlvbiAKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBUQ0V4ZVJlcGx5IHsKLQlTdHJpbmcgZ2V0TGFzdE1zZygpOwotCUxpc3QgZ2V0TXNncygpOwotCWJvb2xlYW4gcGFzc2luZygpOwkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2lmYWNlL1RDRXhlUmVwbHlMaXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9UQ0V4ZVJlcGx5TGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzgwNzlkLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2lmYWNlL1RDRXhlUmVwbHlMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgcmVwcmVzZW50aW5nIHJlcGx5IGZyb20gYSB0ZXN0IGNvbW1hbmQgZXhlY3V0aW9uIAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRDRXhlUmVwbHlMaXN0IHsKLQlpbnQgc2l6ZSgpOwotCVRDRXhlUmVwbHkgaXRlbShpbnQgaSk7Ci0JU3RyaW5nIGdldFN1bW1hcnlSZXBseSgpOwotCWJvb2xlYW4gcGFzc2luZygpOwkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2lmYWNlL1Rlc3RDb21tYW5kLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9UZXN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmNlY2QxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2lmYWNlL1Rlc3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2U7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIFVzZWQgaW4gSlVuaXQgdGVzdHMgCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGVzdENvbW1hbmQgewkJCQkKLQkKLQlTdHJpbmcgVGVzdE5hbWVFeHQgPSAiLnRjIjsKLQkKLQkvL0FsbCB0aGUgdGFncyB3aWxsIGJlIGZvcm1hbGx5IHNwZWNpZmllZCBhbmQgcmVhZCBmcm9tCi0JLy9hIHNjaGVtYSBsYXRlci4KLQkKLQkvL0F0dHJpYnV0ZSB0YWdzCi0JU3RyaW5nIEFUX0V4dElkID0gImV4dElkIjsKLQlTdHJpbmcgQVRfRGlzYWJsZSA9ICJkaXNhYmxlIjsKLQlTdHJpbmcgQVRfTGliRm9sZGVyTmFtZSA9ICJsaWJGb2xkZXJOYW1lIjsKLQlTdHJpbmcgQVRfRXhwb3J0Rm9sZGVyTmFtZSA9ICJleHBvcnRGb2xkZXJOYW1lIjsKLQlTdHJpbmcgQVRfSW1wb3J0Rm9sZGVyTmFtZSA9ICJpbXBvcnRGb2xkZXJOYW1lIjsKLQlTdHJpbmcgQVRfR29sZGVuTGliRm9sZGVyTmFtZSA9ICJnb2xkZW5MaWJGb2xkZXJOYW1lIjsKLQlTdHJpbmcgQVRfU2VsZWN0ZWRDb25maWdOYW1lID0gInNlbGVjdGVkQ29uZmlnTmFtZSI7Ci0JU3RyaW5nIEFUX0RpZmZDb3VudCA9ICJkaWZmQ291bnQiOwotCVN0cmluZyBBVF9FbGVtZW50Q291bnQgPSAiZWxlbWVudENvdW50IjsKLQlTdHJpbmcgQVRfVXNlTmFtZUFzSWQ9ICJ1c2VOYW1lQXNJZCI7Ci0JU3RyaW5nIEFUX01lcmdlID0gIm1lcmdlIjsKLQlTdHJpbmcgQVRfTmFtZSA9ICJuYW1lIjsKLQlTdHJpbmcgQVRfVHlwZSA9ICJ0eXBlIjsKLQlTdHJpbmcgQVRfQnJpZWZEZXNjcmlwdGlvbiA9ICJicmllZkRlc2NyaXB0aW9uIjsKLQlTdHJpbmcgQVRfQXV0aG9ycyA9ICJhdXRob3JzIjsKLQlTdHJpbmcgQVRfUGFyZW50UGF0aD0icGFyZW50UGF0aCI7Ci0JU3RyaW5nIEFUX1BhcmVudEV4dElkPSJwYXJlbnRFeHRJZCI7Ci0JU3RyaW5nIEFUX1BhdGg9InBhdGgiOwotCVN0cmluZyBBVF9SZWN1cnNpdmU9InJlY3Vyc2l2ZSI7Ci0JU3RyaW5nIEFUX0dvbGRlbkZpbGVOYW1lID0gImdvbGRlbkZpbGVOYW1lIjsKLQlTdHJpbmcgQVRfT3V0cHV0RmlsZU5hbWUgPSAib3V0cHV0RmlsZU5hbWUiOwotCVN0cmluZyBBVF9FcnJvckNvdW50ID0gImVycm9yQ291bnQiOwotCVN0cmluZyBBVF9DaXJjdWxhckVsZW1lbnRDb3VudCA9ICJjaXJjdWxhckVsZW1lbnRDb3VudCI7Ci0JU3RyaW5nIEFUX1ZlcmJvc2UgPSAidmVyYm9zZSI7Ci0JCQotCS8vVmFsdWUgZWxlbWVudCB0YWdzCi0JU3RyaW5nIFZUX2Jhc2VzID0gImJhc2VzIjsKLQlTdHJpbmcgVlRfVmFsdWUgPSAiVmFsdWUiOwotCQkJCQotCVN0cmluZyB0YWdOYW1lKCk7Ci0JLy9MaWJyYXJ5VGVzdGVyIGdldFRlc3RlcigpOwkKLQl2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0TmFtZSwgU3RyaW5nIGF0dFZhbHVlKTsKLQlTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBhdHROYW1lKTsKLQl2b2lkIHBhcnNlKEVsZW1lbnQgZWxlbWVudCk7Ci0JVENFeGVSZXBseSBleGVjdXRlKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9UZXN0VHJhY2VyLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9UZXN0VHJhY2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ODJjZjcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvVGVzdFRyYWNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlOwotCi0vKioKLSAqIFVzZWQgaW4gSlVuaXQgdGVzdHMgCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGVzdFRyYWNlciB7Ci0Jdm9pZCB0cmFjZShTdHJpbmcgbGluZSk7Ci19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL0V4cG9ydEltcG9ydFRlc3RJbXBsLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL0V4cG9ydEltcG9ydFRlc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZjgzYzUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9FeHBvcnRJbXBvcnRUZXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLlRlc3RzUGx1Z2luOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuQ2FsZW5kYXI7Ci0KLS8qKgotICogSlVuaXQgdGVzdHMgZm9yIHBsdWdpbiBleHBvcnQvaW1wb3J0Ci0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHBvcnRJbXBvcnRUZXN0SW1wbCBleHRlbmRzIExpYnJhcnlKdW5pdFRlc3RJbXBsIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc291cmNlRm9sZGVyTmFtZSA9ICJFeHBvcnRJbXBvcnQiOwotCXByaXZhdGUgc3RhdGljICBGaWxlIHRlc3RSb290U291cmNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIHRlc3RSb290V29ya2luZ01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHJpdmF0ZSBGaWxlIGRlZmF1bHRUZXN0RGlyOyAKLQkKLQlwdWJsaWMgRXhwb3J0SW1wb3J0VGVzdEltcGwoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgRmlsZSBnZXRUZXN0Um9vdFNvdXJjZSgpIHsKLQkJaWYgKHRlc3RSb290U291cmNlID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXRoID0gZ2V0U2VydmljZSgpLmdldFRvcFRlc3RSb290U291cmNlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQlwYXRoICs9IEZpbGUuc2VwYXJhdG9yICsgc291cmNlRm9sZGVyTmFtZSArICBGaWxlLnNlcGFyYXRvcjsKLQkJCXRlc3RSb290U291cmNlID0gbmV3IEZpbGUocGF0aCk7Ci0JCX0KLQkJcmV0dXJuIHRlc3RSb290U291cmNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIEZpbGUgZ2V0VGVzdFJvb3RXb3JraW5nKCkgewotCQlGaWxlIHRlc3RSb290V29ya2luZyA9IChGaWxlKSB0ZXN0Um9vdFdvcmtpbmdNYXAuZ2V0KGdldENsYXNzKCkpOwotCQlpZiAodGVzdFJvb3RXb3JraW5nID09IG51bGwpIHsKLQkJCUNsYXNzIGNscyA9IGdldENsYXNzKCk7Ci0JCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBjbHMuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKLQkJCQotCQkJU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCBoaDptbTpzczpTU1MiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGR0U3RyID0gc2RmLmZvcm1hdChuZXcgRGF0ZSgpKTsKLQkJCWR0U3RyID0gZHRTdHIucmVwbGFjZSgnICcsICdfJyk7Ci0JCQlkdFN0ciA9IGR0U3RyLnJlcGxhY2UoJzonLCAnLScpOwotCQkJCi0JCQlTdHJpbmcgcGF0aCA9IGdldFNlcnZpY2UoKS5nZXRUZXN0R3JvdXAoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCXBhdGggKz0gRmlsZS5zZXBhcmF0b3IgKyBjbHMuZ2V0TmFtZSgpLnN1YnN0cmluZyhwYWNrYWdlTmFtZS5sZW5ndGgoKSArIDEpOwotCQkJcGF0aCArPSAiXyIgKyBkdFN0ciArIEZpbGUuc2VwYXJhdG9yOwotCQkJdGVzdFJvb3RXb3JraW5nID0gbmV3IEZpbGUocGF0aCk7Ci0JCQl0ZXN0Um9vdFdvcmtpbmdNYXAucHV0KGdldENsYXNzKCksIHRlc3RSb290V29ya2luZyk7Ci0JCX0KLQkJcmV0dXJuIHRlc3RSb290V29ya2luZzsKLQl9Ci0JCi0JcHJvdGVjdGVkIEZpbGUgZ2V0RGVmYXVsdFRlc3REaXIoKSB7Ci0JCWlmIChkZWZhdWx0VGVzdERpciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IGdldFRlc3RSb290V29ya2luZygpLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBnZXROYW1lKCk7IAotCQkJZGVmYXVsdFRlc3REaXIgPSBuZXcgRmlsZShwYXRoKTsKLQkJfQotCQkKLQkJcmV0dXJuIGRlZmF1bHRUZXN0RGlyOwotCX0KLQkJCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL0xpYnJhcnlKdW5pdFRlc3RJbXBsLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL0xpYnJhcnlKdW5pdFRlc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MTE3MGUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9MaWJyYXJ5SnVuaXRUZXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuTGlicmFyeUp1bml0VGVzdFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLkxpYnJhcnlUZXN0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5MaWJyYXJ5SnVuaXRUZXN0OwotCi0vKioKLSAqIExpYnJhcnkganVuaXQgdGVzdCBiYXNlIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaWJyYXJ5SnVuaXRUZXN0SW1wbCBleHRlbmRzIFRlc3RDYXNlIGltcGxlbWVudHMgTGlicmFyeUp1bml0VGVzdCB7Ci0KLQlwcml2YXRlIExpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlIHNlcnZpY2U7CQotCQotCXB1YmxpYyBMaWJyYXJ5SnVuaXRUZXN0SW1wbChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQkJc2VydmljZSA9IExpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlLmdldEluc3RhbmNlKHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRmlsZSBnZXRUZXN0Um9vdFNvdXJjZSgpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBGaWxlIGdldFRlc3RSb290V29ya2luZygpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBGaWxlIGdldERlZmF1bHRUZXN0RGlyKCk7Ci0JCi0JCi0JcHVibGljIExpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlIGdldFNlcnZpY2UoKSB7Ci0JCXJldHVybiBzZXJ2aWNlOwotCX0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJc2VydmljZS5zZXRVcChnZXRUZXN0Um9vdFNvdXJjZSgpLCBnZXRUZXN0Um9vdFdvcmtpbmcoKSwgZ2V0RGVmYXVsdFRlc3REaXIoKSwgdGhpcyk7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQlzZXJ2aWNlLnRlYXJEb3duKHRoaXMpOwotCX0JCQotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGVuZFNldFVwKCkgewotCQlzZXJ2aWNlLnRyYWNlKCJlbmRTZXRVcDogIiArIGdldE5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGVuZFRlYXJEb3duKCkgewkJCi0JCXNlcnZpY2UudHJhY2UoImVuZFRlYXJEb3duOiAiICsgZ2V0TmFtZSgpKTsKLQkJc2VydmljZS50cmFjZSgiIik7CQotCX0JCQotCQotCXB1YmxpYyBpbnQgbnVtVGVzdENhc2VzKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL0xpYnJhcnlUZXN0ZXJJbXBsLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL0xpYnJhcnlUZXN0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhY2M5NmUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9MaWJyYXJ5VGVzdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuTGlicmFyeVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRlc3RDb21tYW5kOwotCi0vKioKLSAqIFVzZWQgaW4gSlVuaXQgdGVzdHMgCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VGVzdGVySW1wbCBpbXBsZW1lbnRzIExpYnJhcnlUZXN0ZXIgewotCQotCXByaXZhdGUgVGVzdENvbW1hbmRNZ3IgdGVzdENvbW1hbmRNZ3I7Ci0JCi0JcHVibGljIExpYnJhcnlUZXN0ZXJJbXBsKGJvb2xlYW4gdHJhY2UpIHsKLQkJdGVzdENvbW1hbmRNZ3IgPSBuZXcgVGVzdENvbW1hbmRNZ3IodHJhY2UpOwotCX0JCQkKLQkKLQlwdWJsaWMgdm9pZCBzZXRUZXN0Um9vdFNvdXJjZShGaWxlIGRpckZpbGUpIHsKLQkJdGVzdENvbW1hbmRNZ3Iuc2V0VGVzdFJvb3RTb3VyY2UoZGlyRmlsZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRlc3RSb290V29ya2luZyhGaWxlIGRpckZpbGUpIHsKLQkJdGVzdENvbW1hbmRNZ3Iuc2V0VGVzdFJvb3RXb3JraW5nKGRpckZpbGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBvcGVuQ3VyclRlc3REaXIoRmlsZSBkaXJGaWxlKSB7Ci0JCXRlc3RDb21tYW5kTWdyLm9wZW5DdXJyVGVzdERpcihkaXJGaWxlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xvc2VDdXJyVGVzdERpcigpIHsKLQkJdGVzdENvbW1hbmRNZ3IuY2xvc2VDdXJyVGVzdERpcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb25lV2l0aEFsbFRlc3RzKEZpbGUgdG9wQ2xlYW5VcEZvbGRlcikgewotCQl0ZXN0Q29tbWFuZE1nci5kb25lV2l0aEFsbFRlc3RzKHRvcENsZWFuVXBGb2xkZXIpOwotCX0KLQkKLQlwdWJsaWMgRmlsZSBnZXRDdXJyVGVzdERpcigpIHsKLQkJcmV0dXJuIHRlc3RDb21tYW5kTWdyLmdldEN1cnJUZXN0RGlyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRlc3QoRmlsZSB0ZXN0RmlsZSkgewotCQl0ZXN0Q29tbWFuZE1nci5zZXRUZXN0KHRlc3RGaWxlKTsKLQl9CQkKLQkKLQlwdWJsaWMgVENFeGVSZXBseUxpc3QgZXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHRlc3RDb21tYW5kTWdyLmV4ZWN1dGUoKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRyYWNlKFN0cmluZyBsaW5lKSB7Ci0JCXRlc3RDb21tYW5kTWdyLnRyYWNlKGxpbmUpOwotCX0JCi0JCi0JcHVibGljIFRlc3RDb21tYW5kIG5ld1Rlc3RDb21tYW5kKENsYXNzIGNscykgewotCQlyZXR1cm4gdGVzdENvbW1hbmRNZ3IubmV3VGVzdENvbW1hbmQoY2xzKTsKLQl9CQkKLQkKLQlwdWJsaWMgaW50IGluY0V4ZWN1dGVkVGVzdENvdW50KCkgewotCQlyZXR1cm4gdGVzdENvbW1hbmRNZ3IuaW5jRXhlY3V0ZWRUZXN0Q291bnQoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL1Rlc3RDb21tYW5kSW1wbC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9UZXN0Q29tbWFuZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEyNGNmNC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL1Rlc3RDb21tYW5kSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRlc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ05ld01ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogVXNlZCBpbiBKVW5pdCB0ZXN0cyAKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRlc3RDb21tYW5kSW1wbCBpbXBsZW1lbnRzIFRlc3RDb21tYW5kIHsKLQotCXByaXZhdGUgc3RhdGljIFRDTmV3TWV0aG9kRWxlbWVudCBuZXdNZXRob2RFbGVtZW50ID0gbmV3IFRDTmV3TWV0aG9kRWxlbWVudCgpOyAKLQkKLQlwcml2YXRlIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCXByaXZhdGUgRWxlbWVudCBlbGVtZW50OwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBsb2NhbERlYnVnID0gZmFsc2U7Ci0JcHJpdmF0ZSBUZXN0Q29tbWFuZE1nciBvd25lcjsKLQlwcml2YXRlIE1hcCBhdHR0aWJ1dGVNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCQotCXB1YmxpYyB2b2lkIHNldE93bmVyKFRlc3RDb21tYW5kTWdyIG1ncikgewotCQlvd25lciA9IG1ncjsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1hcCBnZXRBdHRyaWJ1dGVNYXAoKSB7Ci0JCXJldHVybiBhdHR0aWJ1dGVNYXA7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0TmFtZSwgU3RyaW5nIGF0dFZhbHVlKSB7Ci0JCWlmIChhdHRWYWx1ZSAhPSBudWxsICYmIGF0dFZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJYXR0dGlidXRlTWFwLnB1dChhdHROYW1lLCBhdHRWYWx1ZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFN0cmluZyByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIGF0dE5hbWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGF0dHRpYnV0ZU1hcC5yZW1vdmUoYXR0TmFtZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBhdHROYW1lKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBhdHR0aWJ1dGVNYXAuZ2V0KGF0dE5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJc2V0QXR0cmlidXRlKEFUX1ZlcmJvc2UsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX1ZlcmJvc2UpKTsKLQkJdmVyYm9zZSA9IHBhcnNlQm9vbGVhbihBVF9WZXJib3NlLCB2ZXJib3NlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0VmVyYm9zZSgpIHsKLQkJcmV0dXJuIHZlcmJvc2U7Ci0JfQotCQotCXByb3RlY3RlZCBFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZUNoaWxkcmVuKEVsZW1lbnQgZWxlbWVudCkgewotCX0KLQkKLQlwcm90ZWN0ZWQgVGVzdENvbW1hbmRNZ3IgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiBvd25lcjsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IFRDRXhlUmVwbHkgZXhlY3V0ZSgpOwotCQotCXB1YmxpYyBTdHJpbmcgdGFnTmFtZSgpIHsKLQkJcmV0dXJuIG93bmVyID09IG51bGwgPyBudWxsIDogb3duZXIuZ2V0VGFnTmFtZSh0aGlzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2VCb29sZWFuKFN0cmluZyBhdHQsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCVN0cmluZyB0b0NoZWNrU3RyID0gZGVmYXVsdFZhbHVlID8gImZhbHNlIiA6ICJ0cnVlIjsKLQkJU3RyaW5nIHN0ciA9IGdldEF0dHJpYnV0ZShhdHQpOwotCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmVxdWFsc0lnbm9yZUNhc2UodG9DaGVja1N0cikpIHsKLQkJCXJldHVybiAhZGVmYXVsdFZhbHVlOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBwYXJzZUludGVnZXIoU3RyaW5nIGF0dCwgaW50IGRlZmF1bHRWYWx1ZSkgewotCQlpZiAoYXR0ICE9IG51bGwgJiYgYXR0Lmxlbmd0aCgpID4gMCkgewotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoYXR0KTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCX0KLQkKLQlwdWJsaWMgRUNsYXNzIGdldEVDbGFzcyhTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gbmV3TWV0aG9kRWxlbWVudC5nZXRFQ2xhc3ModHlwZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNhdmUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCW5ld01ldGhvZEVsZW1lbnQuc2F2ZShlbGVtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIGxpbmUpIHsKLQkJZ2V0T3duZXIoKS5sb2cobGluZSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9UZXN0Q29tbWFuZE1nci5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9UZXN0Q29tbWFuZE1nci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjYzNWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvVGVzdENvbW1hbmRNZ3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0aW5nU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5MaWJyYXJ5RGlmZkFuYWx5em9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5MaWJyYXJ5VGVzdFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLkxpYnJhcnlKdW5pdFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UZXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVGVzdFRyYWNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENDaXJjdWxhckRlcGVuZGVuY3lDaGVjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENDb21wYXJlVG9Hb2xkZW5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0NvbXBhcmVUb0xpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDQ29weUxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDRWRpdE1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDRXhlUmVwbHlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0V4ZVJlcGx5TGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDRXhwb3J0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENFeHBvcnRQbHVnaW5zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0V4cG9ydFhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENJbXBvcnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0ltcG9ydFBsdWdpbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDSW1wb3J0WG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ05ld01ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDTmV3TWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENOZXdNZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDT3BlbkxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDT3V0cHV0TWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5MaWJyYXJ5VGVzdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIFVzZWQgaW4gSlVuaXQgdGVzdHMgCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0Q29tbWFuZE1nciBpbXBsZW1lbnRzIFRlc3RUcmFjZXIgewkKLQkKLQkvL0FsbCB0aGUgdGFncyB3aWxsIGJlIGZvcm1hbGx5IHNwZWNpZmllZCBhbmQgcmVhZCBmcm9tCi0JLy9hIHNjaGVtYSBsYXRlci4JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDQ29weUxpYnJhcnkgPSAiQ29weUxpYnJhcnkiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ09wZW5MaWJyYXJ5ID0gIk9wZW5MaWJyYXJ5IjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVENFeHBvcnRQbHVnaW5zID0gIkV4cG9ydFBsdWdpbnMiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ0ltcG9ydFBsdWdpbnMgPSAiSW1wb3J0UGx1Z2lucyI7CQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ0V4cG9ydENvbmZpZ3VyYXRpb24gPSAiRXhwb3J0Q29uZmlndXJhdGlvbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDSW1wb3J0Q29uZmlndXJhdGlvbiA9ICJJbXBvcnRDb25maWd1cmF0aW9uIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVENFeHBvcnRYbWwgPSAiRXhwb3J0WG1sIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVENJbXBvcnRYbWwgPSAiSW1wb3J0WG1sIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVENDb21wYXJlVG9MaWJyYXJ5ID0gIkNvbXBhcmVUb0xpYnJhcnkiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ0NvbXBhcmVUb0dvbGRlbkZpbGUgPSAiQ29tcGFyZVRvR29sZGVuRmlsZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDTmV3TWV0aG9kUGx1Z2luID0gIk5ld01ldGhvZFBsdWdpbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDTmV3TWV0aG9kQ29uZmlndXJhdGlvbiA9ICJOZXdNZXRob2RDb25maWd1cmF0aW9uIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVENOZXdNZXRob2RFbGVtZW50ID0gIk5ld01ldGhvZEVsZW1lbnQiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ0VkaXRNZXRob2RFbGVtZW50ID0gIkVkaXRNZXRob2RFbGVtZW50IjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVENDaXJjdWxhckRlcGVuZGVuY3lDaGVjayA9ICJDaXJjdWxhckRlcGVuZGVuY3lDaGVjayI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDRW5kID0gIkVuZCI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDRWRpdFBsdWdpbj0iRWRpdFBsdWdpbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDRWRpdENvbmZpZ3VyYXRpb249IkVkaXRDb25maWd1cmF0aW9uIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVENFZGl0Q29udGVudFBhY2thZ2U9IkVkaXRDb250ZW50UGFja2FnZSI7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVENPdXRwdXRMaWJyYXJ5PSJPdXRwdXRMaWJyYXJ5IjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUQ091dHB1dFBsdWdpbj0iT3V0cHV0UGx1Z2luIjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUQ091dHB1dENvbmZpZ3VyYXRpb249Ik91dHB1dENvbmZpZ3VyYXRpb24iOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRDT3V0cHV0TWV0aG9kRWxlbWVudD0iT3V0cHV0TWV0aG9kRWxlbWVudCI7Ci0JCQotCXByaXZhdGUgYm9vbGVhbiB0cmFjZSA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiByZW1vdmVGaWxlcyA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBGaWxlIHRlc3RSb290U291cmNlOwotCXByaXZhdGUgRmlsZSB0ZXN0Um9vdFdvcmtpbmc7Ci0JcHJpdmF0ZSBGaWxlIGN1cnJUZXN0RGlyOwotCXByaXZhdGUgU3RyaW5nIG91dHB1dFBhdGg7Ci0JcHJpdmF0ZSBEb2N1bWVudCBvdXRwdXREb2N1bWVudDsKLQlwcml2YXRlIFByaW50U3RyZWFtIHRlc3RSb290T3V0OwotCXByaXZhdGUgUHJpbnRTdHJlYW0gY3VyclRlc3RPdXQ7Ci0JcHJpdmF0ZSBpbnQgZXhlY3V0ZWRUZXN0Q291bnQgPSAwOwkKLQkJCi0JcHJpdmF0ZSBzdGF0aWMgTGlicmFyeVRlc3RTZXJ2aWNlIHNlcnZpY2UgPSBMaWJyYXJ5VGVzdFNlcnZpY2UuZ2V0SW5zdGFuY2UoKTsKLQlwcml2YXRlIEZpbGUgdGVzdEZpbGU7Ci0JcHJpdmF0ZSBMaXN0IHRlc3RDb21tYW5kTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIExpYnJhcnlKdW5pdFRlc3QganVuaXRUZXN0Q2FzZTsKLQkKLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgY3VycmVudEJhc2VMaWI7Ci0JcHJpdmF0ZSBNYXAgYWxsTGlicyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBNYXAgYWxsRXhwb3J0cyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CQotCQotCXByaXZhdGUgc3RhdGljIE1hcCB0Y0NsYXNzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIHN0YXRpYyBNYXAgdGNUYWdOYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwcml2YXRlIFByaW50U3RyZWFtIGxvZ1BTID0gU3lzdGVtLm91dDsKLQkKLQlzdGF0aWMgewotCQlhZGRUb1RjQ2xhc3NNYXAoVENDb3B5TGlicmFyeSwgVENDb3B5TGlicmFyeS5jbGFzcyk7Ci0JCWFkZFRvVGNDbGFzc01hcChUQ09wZW5MaWJyYXJ5LCBUQ09wZW5MaWJyYXJ5LmNsYXNzKTsKLQkJYWRkVG9UY0NsYXNzTWFwKFRDRXhwb3J0UGx1Z2lucywgVENFeHBvcnRQbHVnaW5zLmNsYXNzKTsKLQkJYWRkVG9UY0NsYXNzTWFwKFRDSW1wb3J0UGx1Z2lucywgVENJbXBvcnRQbHVnaW5zLmNsYXNzKTsJCQotCQlhZGRUb1RjQ2xhc3NNYXAoVENFeHBvcnRDb25maWd1cmF0aW9uLCBUQ0V4cG9ydENvbmZpZ3VyYXRpb24uY2xhc3MpOwotCQlhZGRUb1RjQ2xhc3NNYXAoVENJbXBvcnRDb25maWd1cmF0aW9uLCBUQ0ltcG9ydENvbmZpZ3VyYXRpb24uY2xhc3MpOwotCQlhZGRUb1RjQ2xhc3NNYXAoVENFeHBvcnRYbWwsIFRDRXhwb3J0WG1sLmNsYXNzKTsKLQkJYWRkVG9UY0NsYXNzTWFwKFRDSW1wb3J0WG1sLCBUQ0ltcG9ydFhtbC5jbGFzcyk7CQkKLQkJYWRkVG9UY0NsYXNzTWFwKFRDQ29tcGFyZVRvTGlicmFyeSwgVENDb21wYXJlVG9MaWJyYXJ5LmNsYXNzKTsKLQkJYWRkVG9UY0NsYXNzTWFwKFRDQ29tcGFyZVRvR29sZGVuRmlsZSwgVENDb21wYXJlVG9Hb2xkZW5GaWxlLmNsYXNzKTsKLQkJCi0JCWFkZFRvVGNDbGFzc01hcChUQ05ld01ldGhvZFBsdWdpbiwgVENOZXdNZXRob2RQbHVnaW4uY2xhc3MpOwotCQlhZGRUb1RjQ2xhc3NNYXAoVENOZXdNZXRob2RDb25maWd1cmF0aW9uLCBUQ05ld01ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MpOwkJCi0JCWFkZFRvVGNDbGFzc01hcChUQ05ld01ldGhvZEVsZW1lbnQsIFRDTmV3TWV0aG9kRWxlbWVudC5jbGFzcyk7Ci0JCWFkZFRvVGNDbGFzc01hcChUQ0VkaXRNZXRob2RFbGVtZW50LCBUQ0VkaXRNZXRob2RFbGVtZW50LmNsYXNzKTsKLQkJCi0JCWFkZFRvVGNDbGFzc01hcChUQ0VkaXRQbHVnaW4sIFRDRWRpdE1ldGhvZEVsZW1lbnQuY2xhc3MpOwotCQlhZGRUb1RjQ2xhc3NNYXAoVENFZGl0Q29uZmlndXJhdGlvbiwgVENFZGl0TWV0aG9kRWxlbWVudC5jbGFzcyk7Ci0JCWFkZFRvVGNDbGFzc01hcChUQ0VkaXRDb250ZW50UGFja2FnZSwgVENFZGl0TWV0aG9kRWxlbWVudC5jbGFzcyk7Ci0JCQotCQlhZGRUb1RjQ2xhc3NNYXAoVENPdXRwdXRMaWJyYXJ5LCBUQ091dHB1dE1ldGhvZEVsZW1lbnQuY2xhc3MpOwotCQlhZGRUb1RjQ2xhc3NNYXAoVENPdXRwdXRQbHVnaW4sIFRDT3V0cHV0TWV0aG9kRWxlbWVudC5jbGFzcyk7Ci0JCWFkZFRvVGNDbGFzc01hcChUQ091dHB1dENvbmZpZ3VyYXRpb24sIFRDT3V0cHV0TWV0aG9kRWxlbWVudC5jbGFzcyk7Ci0JCWFkZFRvVGNDbGFzc01hcChUQ091dHB1dE1ldGhvZEVsZW1lbnQsIFRDT3V0cHV0TWV0aG9kRWxlbWVudC5jbGFzcyk7Ci0JCWFkZFRvVGNDbGFzc01hcChUQ0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrLCBUQ0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrLmNsYXNzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRUb1RjQ2xhc3NNYXAoU3RyaW5nIGVsZW1lbnROYW1lLCBDbGFzcyBjbHMpIHsKLQkJT2JqZWN0IGluc3RhbmNlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWluc3RhbmNlID0gY2xzLm5ld0luc3RhbmNlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgVGVzdENvbW1hbmQpIHsKLQkJCXRjQ2xhc3NNYXAucHV0KGVsZW1lbnROYW1lLCBpbnN0YW5jZSk7Ci0JCQl0Y1RhZ05hbWVNYXAucHV0KGNscywgZWxlbWVudE5hbWUpOwotCQl9CQkKLQl9Ci0KLQlwdWJsaWMgVGVzdENvbW1hbmRNZ3IoYm9vbGVhbiB0cmFjZSkgewotCQlpZiAodHJhY2UpIHsKLQkJCXRoaXMudHJhY2UgPSB0cmFjZTsKLQkJCXRoaXMucmVtb3ZlRmlsZXMgPSAhdHJhY2U7Ci0JCX0KLQl9CQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnTmFtZShUZXN0Q29tbWFuZCB0Y0luc3RhbmNlKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0Y1RhZ05hbWVNYXAuZ2V0KHRjSW5zdGFuY2UuZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRlc3RSb290U291cmNlKEZpbGUgZGlyRmlsZSkgewotCQl0ZXN0Um9vdFNvdXJjZSA9IGRpckZpbGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRlc3RSb290V29ya2luZyhGaWxlIGRpckZpbGUpIHsKLQkJYm9vbGVhbiBuZWVkVG9DcmVhdGVPdXRwdXRGaWxlID0gdGVzdFJvb3RXb3JraW5nID09IG51bGwgfHwKLQkJCQkJCQkJISB0ZXN0Um9vdFdvcmtpbmcuZXF1YWxzKGRpckZpbGUpOwotCQkKLQkJdGVzdFJvb3RXb3JraW5nID0gZGlyRmlsZTsKLQkJCi0JCWlmICh0cmFjZSAmJiBuZWVkVG9DcmVhdGVPdXRwdXRGaWxlKSB7Ci0JCQl0cnkgewotCQkJCWlmICghIHRlc3RSb290V29ya2luZy5leGlzdHMoKSkgewkJCQkJCi0JCQkJCWlmICghIG1rRGlyKHRlc3RSb290V29ya2luZykpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAodGVzdFJvb3RPdXQgIT0gbnVsbCkgewotCQkJCQl0ZXN0Um9vdE91dC5jbG9zZSgpOwotCQkJCX0KLQkJCQlTdHJpbmcgcGF0aCA9IHRlc3RSb290V29ya2luZy5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgInRyYWNlcy5vdXQiOwotCQkJCXRlc3RSb290T3V0ID0gbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHBhdGgpKTsKLQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsJCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gbWtEaXIoRmlsZSBmaWxlKSB7Ci0JCUZpbGUgcEZpbGUgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsJCQotCQlpZiAoISBwRmlsZS5leGlzdHMoKSkgewkJCQkJCi0JCQlpZiAoISBta0RpcihwRmlsZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbGUubWtkaXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgb3BlbkN1cnJUZXN0RGlyKEZpbGUgZGlyRmlsZSkgewotCQljdXJyVGVzdERpciA9IGRpckZpbGU7Ci0JCQotCQl0cnkgewotCQkJaWYgKCEgY3VyclRlc3REaXIuZXhpc3RzKCkpIHsKLQkJCQljdXJyVGVzdERpci5ta2RpcigpOwotCQkJfQotCQkJU3RyaW5nIHBhdGggPSBjdXJyVGVzdERpci5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yOwotCQkJaWYgKHRyYWNlKSB7Ci0JCQkJY3VyclRlc3RPdXQgPSBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0ocGF0aCArICJ0cmFjZS5vdXQiKSk7Ci0JCQl9Ci0JCQlvdXRwdXRQYXRoID0gcGF0aCArICJvdXRwdXQueG1sIjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsJCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsb3NlQ3VyclRlc3REaXIoKSB7Ci0JCWNsb3NlTGlicmFyeShnZXRDdXJyZW50QmFzZUxpYigpKTsKLQkJaWYgKGN1cnJUZXN0T3V0ICE9IG51bGwpIHsKLQkJCWN1cnJUZXN0T3V0LmNsb3NlKCk7Ci0JCQljdXJyVGVzdE91dCA9IG51bGw7Ci0JCX0KLQkJY2xlYXJPdXRwdXREb2N1bWVudCgpOwotCQlhbGxMaWJzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLQkJYWxsRXhwb3J0cyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0JCWNsb3NlRm9sZGVyKGN1cnJUZXN0RGlyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9uZVdpdGhBbGxUZXN0cyhGaWxlIHRvcENsZWFuVXBGb2xkZXIpIHsKLQkJY2xvc2VBbGxFeHBvcnRQcm9qZWN0cygpOwotCQlpZiAodGVzdFJvb3RPdXQgIT0gbnVsbCkgewotCQkJdGVzdFJvb3RPdXQuY2xvc2UoKTsKLQkJfQotCQljbG9zZUZvbGRlcih0b3BDbGVhblVwRm9sZGVyKTsKLQl9Ci0JCi0JcHVibGljIEZpbGUgZ2V0Q3VyclRlc3REaXIoKSB7Ci0JCXJldHVybiBjdXJyVGVzdERpcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VGVzdChGaWxlIHRlc3RGaWxlKSB7Ci0JCXRoaXMudGVzdEZpbGUgPSB0ZXN0RmlsZTsJCQotCX0JCi0JCi0JcHVibGljIEZpbGUgZ2V0VGVzdEZpbGUoKSB7Ci0JCXJldHVybiB0ZXN0RmlsZTsJCQotCX0JCi0JCi0JCi0JcHVibGljIExpYnJhcnlUZXN0U2VydmljZSBnZXRTZXJ2aWNlKCkgewotCQlyZXR1cm4gc2VydmljZTsKLQl9Ci0JCi0JcHVibGljIFRDRXhlUmVwbHlMaXN0IGV4ZWN1dGUoKSB7Ci0JCXRyYWNlKCJCZWdpbiBleGVjdXRpbmc6ICIgKyB0ZXN0RmlsZSk7Ci0KLQkJVENFeGVSZXBseUxpc3QgcmVzdWx0ID0gbnVsbDsKLQkJYm9vbGVhbiBsb2FkZWQgPSBmYWxzZTsKLQkJRXhjZXB0aW9uIGxvYWRFeGNlcHRpb24gPSBudWxsOwotCQl0cnkgewotCQkJbG9hZGVkID0gbG9hZFRlc3QoKTsJCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWxvYWRFeGNlcHRpb24gPSBlOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJaWYgKGxvYWRlZCkgewkJCQotCQkJU3RyaW5nIHBhdGggPSB0ZXN0Um9vdFdvcmtpbmcuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIHRlc3RGaWxlLmdldE5hbWUoKSArICIuZGlyIjsKLQkJCW9wZW5DdXJyVGVzdERpcihuZXcgRmlsZSAocGF0aCkpOwotCQkJcmVzdWx0ID0gZXhlY3V0ZUNvbW1hbmRzKCk7CQkKLQkJCWNsb3NlQ3VyclRlc3REaXIoKTsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IG5ldyBUQ0V4ZVJlcGx5TGlzdEltcGwoKTsKLQkJCWlmIChsb2FkRXhjZXB0aW9uICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbXNnID0gIlRlc3QgbG9hZCBmYWlsZWQ6ICIgKyBsb2FkRXhjZXB0aW9uLmdldE1lc3NhZ2UoKTsKLQkJCQkoKFRDRXhlUmVwbHlMaXN0SW1wbCkgcmVzdWx0KS5hZGQobmV3IFRDRXhlUmVwbHlJbXBsKG1zZywgZmFsc2UpKTsKLQkJCQl0cmFjZShtc2cpOwotCQkJfSBlbHNlIHsJCQkKLQkJCQl0cmFjZSgiVGVzdCBkaXNhYmxlZCIpOwotCQkJfQotCQl9Ci0JCQotCQl0cmFjZSgiRW5kIGV4ZWN1dGluZyAgOiAiICsgdGVzdEZpbGUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gbG9hZFRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGVzdENvbW1hbmRMaXN0LmNsZWFyKCk7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gWE1MVXRpbC5sb2FkWG1sKHRlc3RGaWxlKTsJCi0JCUVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCQlpZiAocm9vdC5nZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfRGlzYWJsZSkuZXF1YWxzKCJ0cnVlIikpIHsKLQkJCXJldHVybiBmYWxzZTsJCQkJCi0JCX0KLQkJYm9vbGVhbiB2ZXJib3NlID0gcm9vdC5nZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfVmVyYm9zZSkuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOwotCQlOb2RlTGlzdCBub2RlcyA9IHJvb3QuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgc3ogPSBub2RlcyA9PSBudWxsID8gMCA6IG5vZGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpPTA7IGk8c3o7IGkrKykgewotCQkJTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQkJCWlmICh2ZXJib3NlKSB7Ci0JCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX1ZlcmJvc2UsICJ0cnVlIik7Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50LmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKFRDRW5kKSkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYWRkQ29tbWFuZChub2RlKTsKLQkJCX0KLQkJfQkJCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIFRDRXhlUmVwbHlMaXN0IGV4ZWN1dGVDb21tYW5kcygpIHsKLQkJVENFeGVSZXBseUxpc3RJbXBsIHJlc3VsdCA9IG5ldyBUQ0V4ZVJlcGx5TGlzdEltcGwoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHRlc3RDb21tYW5kTGlzdC5zaXplKCk7IGkrKykgewotCQkJVGVzdENvbW1hbmRJbXBsIGNvbW1hbmQgPSAoVGVzdENvbW1hbmRJbXBsKSB0ZXN0Q29tbWFuZExpc3QuZ2V0KGkpOwotCQkJVENFeGVSZXBseSByZXBseSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXJlcGx5ID0gY29tbWFuZC5leGVjdXRlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJcmVwbHkgPSBuZXcgVENFeGVSZXBseUltcGwoZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJCX0KLQkJCWlmIChyZXBseSAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0LmFkZChyZXBseSk7Ci0JCQkJaWYgKCFyZXBseS5wYXNzaW5nKCkpIHsKLQkJCQkJbG9nKCJcblRoZSBmb2xsb3dpbmcgY29tbWFuZCBpcyBub3QgcGFzc2luZzogXG4iICsgIGNvbW1hbmQuZ2V0RWxlbWVudCgpICsgIlxuIik7Ci0JCQkJfQotCQkJfQotCQl9CQkJCi0JCQotCQlTdHJpbmcgbGluZSA9IHRlc3RGaWxlLmdldE5hbWUoKSArICIgaXMgIjsKLQkJU3RyaW5nIGRpclN0ciA9ICJ0ZXN0Um9vdFNvdXJjZTogIiArIHRlc3RSb290U291cmNlIAotCQkJCQkJKyAiLCB0ZXN0Um9vdFdvcmtpbmc6ICIgKyB0ZXN0Um9vdFdvcmtpbmc7Ci0JCWlmIChyZXN1bHQucGFzc2luZygpKSB7Ci0JCQlsaW5lICs9ICJwYXNzaW5nLiAiICsgZGlyU3RyOwotCQl9IGVsc2UgewotCQkJbGluZSArPSAiZmFpbGluZyEgIiArIGRpclN0cjsKLQkJfQotCQlyZXN1bHQuc2V0U3VtbWFyeVJlcGx5KGxpbmUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0cmFjZShTdHJpbmcgbGluZSkgewotCQlpZiAodGVzdFJvb3RPdXQgIT0gbnVsbCkgewotCQkJdGVzdFJvb3RPdXQucHJpbnRsbihsaW5lKTsKLQkJfQotCQkKLQkJaWYgKGN1cnJUZXN0T3V0ICE9IG51bGwpIHsKLQkJCWN1cnJUZXN0T3V0LnByaW50bG4obGluZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZENvbW1hbmQoTm9kZSBub2RlKSB7Ci0JCWlmICggIShub2RlIGluc3RhbmNlb2YgRWxlbWVudCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJaWYgKCEgZWxlbWVudC5nZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfRGlzYWJsZSkuZXF1YWxzKCJ0cnVlIikpIHsKLQkJCVRlc3RDb21tYW5kIGNvbW1hbmQgPSBuZXdUZXN0Q29tbWFuZChlbGVtZW50LmdldFRhZ05hbWUoKSk7Ci0JCQlpZiAoY29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJY29tbWFuZC5wYXJzZShlbGVtZW50KTsKLQkJCQl0ZXN0Q29tbWFuZExpc3QuYWRkKGNvbW1hbmQpOwotCQkJfQotCQl9Ci0JfQkKLQkKLQlwcml2YXRlIFRlc3RDb21tYW5kIG5ld1Rlc3RDb21tYW5kKFN0cmluZyBjb21hbmROYW1lKSB7Ci0JCU9iamVjdCBvYmogPSB0Y0NsYXNzTWFwLmdldChjb21hbmROYW1lKTsKLQkJcmV0dXJuIG9iaiA9PSBudWxsID8gbnVsbCA6IG5ld1Rlc3RDb21tYW5kKG9iai5nZXRDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIFRlc3RDb21tYW5kIG5ld1Rlc3RDb21tYW5kKENsYXNzIGNscykgewotCQlUZXN0Q29tbWFuZCByZXQgPSBudWxsOwotCQl0cnkgewotCQkJcmV0ID0gKFRlc3RDb21tYW5kKSBjbHMubmV3SW5zdGFuY2UoKTsKLQkJCSgoVGVzdENvbW1hbmRJbXBsKSByZXQpLnNldE93bmVyKHRoaXMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQkJCi0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGxvYWRCYXNlTGliKFN0cmluZyBuYW1lLCBib29sZWFuIGlmTmV3VGhlbkJ1aWxkRGVhZmF1bHRMaWIpIHsKLQkJaWYgKGN1cnJlbnRCYXNlTGliICE9IG51bGwpIHsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGN1cnJlbnRCYXNlTGliLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQlpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CQkJCi0JCQkJcmV0dXJuIGN1cnJlbnRCYXNlTGliOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoYWxsRXhwb3J0cy5jb250YWluc0tleShuYW1lKSkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJCi0JCXNlcnZpY2UuY2xvc2VMaWJyYXJ5KGN1cnJlbnRCYXNlTGliKTsKLQkJCi0JCWN1cnJlbnRCYXNlTGliID0gbnVsbDsKLQkJU3RyaW5nIGxpYlBhdGggPSAoU3RyaW5nKSBhbGxMaWJzLmdldChuYW1lKTsKLQkJaWYgKGxpYlBhdGggPT0gbnVsbCkgewotCQkJbGliUGF0aCA9IGN1cnJUZXN0RGlyLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBuYW1lOwkKLQkJCXRyeSB7Ci0JCQkJY3VycmVudEJhc2VMaWIgPSBjb3B5RnJvbVRlc3RMaWJzKGxpYlBhdGgsIG5hbWUpID8gIAotCQkJCQkJCQlYTUlMaWJyYXJ5VXRpbC5vcGVuTWV0aG9kTGlicmFyeShsaWJQYXRoKSA6IG51bGw7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewkJCQkKLQkJCX0KLQkJCWlmIChjdXJyZW50QmFzZUxpYiA9PSBudWxsKSB7Ci0JCQkJY3VycmVudEJhc2VMaWIgPSBzZXJ2aWNlLmNyZWF0ZUxpYnJhcnkobGliUGF0aCwgbmFtZSk7Ci0JCQkJaWYgKGlmTmV3VGhlbkJ1aWxkRGVhZmF1bHRMaWIpIHsKLQkJCQkJYnVpbGREZWZhdWx0TGlicmFyeSgpOwotCQkJCX0KLQkJCQl0cmFjZSgiQmFzZSBsaWIgXCIiICsgbmFtZSArICJcIiBpcyBjcmVhdGVkLiIpOwotCQkJfSBlbHNlIHsKLQkJCQl0cmFjZSgiQmFzZSBsaWIgXCIiICsgbmFtZSArICJcIiBpcyBjb3BpZWQgZnJvbSB0ZXN0TGlicyBhbmQgbGFvZGVkLiIpOwotCQkJfQotCQkJYWxsTGlicy5wdXQobmFtZSwgbGliUGF0aCk7Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCWN1cnJlbnRCYXNlTGliID0gWE1JTGlicmFyeVV0aWwub3Blbk1ldGhvZExpYnJhcnkobGliUGF0aCk7Ci0JCQkJdHJhY2UoIkJhc2UgbGliIFwiIiArIG5hbWUgKyAiXCIgaXMgbG9hZGVkLiIpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsJCQkJCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGN1cnJlbnRCYXNlTGliOwotCX0JCQkKLQkKLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBsb2FkTm9uQmFzZUxpYihTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgbGliUGF0aCA9IChTdHJpbmcpIGFsbExpYnMuZ2V0KG5hbWUpOwotCQlpZiAobGliUGF0aCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gc2VydmljZS5sb2FkTGlicmFyeShsaWJQYXRoKTsKLQl9CQkJCi0JCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0Q3VycmVudEJhc2VMaWIoKSB7Ci0JCXJldHVybiBjdXJyZW50QmFzZUxpYjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudEJhc2VMaWIoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJY3VycmVudEJhc2VMaWIgPSBsaWI7Ci0JfQotCQotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGxvYWRCYXNlTGliKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBsb2FkQmFzZUxpYihuYW1lLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGxvYWRCYXNlTGliT3JCdWlsZEJhc2VXaXRoRGVmYXVsdChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbG9hZEJhc2VMaWIobmFtZSwgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBGaWxlIGdldEltcG9ydEZpbGUoU3RyaW5nIGltcG9ydEZvbGRlck5hbWUpIHsKLQkJRmlsZSBmaWxlID0gKEZpbGUpIGFsbEV4cG9ydHMuZ2V0KGltcG9ydEZvbGRlck5hbWUpOwotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlmaWxlID0gbmV3IEZpbGUodGVzdFJvb3RTb3VyY2UuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIGltcG9ydEZvbGRlck5hbWUpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJcmV0dXJuIGZpbGU7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JCi0JcHVibGljIEZpbGUgcmVnaXN0ZXJFeHBvcnREZXN0aW5hdGlvbihTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc1hNTCkgewotCQlpZiAoYWxsTGlicy5jb250YWluc0tleShuYW1lKSkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJRmlsZSBmaWxlID0gKEZpbGUpIGFsbEV4cG9ydHMuZ2V0KG5hbWUpOwotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IGN1cnJUZXN0RGlyLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBuYW1lOwotCQkJaWYgKGlzWE1MKSB7Ci0JCQkJcGF0aCArPSBGaWxlLnNlcGFyYXRvciArIG5hbWUgKyAiLnhtbCI7Ci0JCQl9Ci0JCQlmaWxlID0gIG5ldyBGaWxlKHBhdGgpOwotCQkJYWxsRXhwb3J0cy5wdXQobmFtZSwgZmlsZSk7Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCBjbG9zZUxpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJc2VydmljZS5jbG9zZUxpYnJhcnkobGliKTsKLQkJc2V0Q3VycmVudEJhc2VMaWIobnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsb3NlRm9sZGVyKEZpbGUgZm9sZGVyKSB7Ci0JCWlmIChyZW1vdmVGaWxlcykgewotCQkJc2VydmljZS5kZWxldGVGb2xkZXIoZm9sZGVyKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgaW50IGluY0V4ZWN1dGVkVGVzdENvdW50KCkgewotCQlyZXR1cm4gKytleGVjdXRlZFRlc3RDb3VudDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xvc2VBbGxFeHBvcnRQcm9qZWN0cygpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGFsbEV4cG9ydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRmlsZSBmaWxlID0gKEZpbGUpIGl0Lm5leHQoKTsKLQkJCXRyeSB7Ci0JCQkJTWV0aG9kTGlicmFyeVByb2plY3QuY2xvc2VQcm9qZWN0KGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpewkJCQkJCi0JCQl9Ci0JCX0JCi0JfQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBjb21wYXJlTGlicyhNZXRob2RMaWJyYXJ5IGxpYjEsICBNZXRob2RMaWJyYXJ5IGxpYjIpIHsKLQkJcmV0dXJuIGNvbXBhcmVMaWJzKGxpYjEsIGxpYjIsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29tcGFyZUxpYnMoTWV0aG9kTGlicmFyeSBsaWIxLCAgTWV0aG9kTGlicmFyeSBsaWIyLCBib29sZWFuIHVzZU5hbWVBczJuZElkKSB7Ci0JCUxpYnJhcnlEaWZmQW5hbHl6b3IgYW5hbHl6b3IgPSBuZXcgTGlicmFyeURpZmZBbmFseXpvcih0aGlzLCBsaWIxLCBsaWIyKTsKLQkJYW5hbHl6b3Iuc2V0R3JlZWR5KHRyYWNlKTsKLQkJYW5hbHl6b3Iuc2V0VXNlTmFtZUFzMm5kSWQodXNlTmFtZUFzMm5kSWQpOwotCQlyZXR1cm4gYW5hbHl6b3IuY29tcGFyZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb21wYXJlTGlicyhNZXRob2RMaWJyYXJ5IGxpYjEsICBNZXRob2RMaWJyYXJ5IGxpYjIsIGludCBkaWZmQ291bnQsIGludCBlbGVtQ29tcGFyZWRDb3VudCwgYm9vbGVhbiB1c2VOYW1lQXMybmRJZCkgewotCQlpZiAoZGlmZkNvdW50ID09IDAgJiYgZWxlbUNvbXBhcmVkQ291bnQgPT0gMCkgewotCQkJcmV0dXJuIGNvbXBhcmVMaWJzKGxpYjEsIGxpYjIsIHVzZU5hbWVBczJuZElkKTsKLQkJfQotCQlMaWJyYXJ5RGlmZkFuYWx5em9yIGFuYWx5em9yID0gbmV3IExpYnJhcnlEaWZmQW5hbHl6b3IodGhpcywgbGliMSwgbGliMik7Ci0JCWFuYWx5em9yLnNldEdyZWVkeSh0cnVlKTsKLQkJYW5hbHl6b3Iuc2V0VXNlTmFtZUFzMm5kSWQodXNlTmFtZUFzMm5kSWQpOwotCQlhbmFseXpvci5jb21wYXJlKCk7Ci0JCXJldHVybiAJYW5hbHl6b3IuZ2V0RGlmZkNvdW50KCkgPT0gZGlmZkNvdW50ICYmCi0JCQkgCWFuYWx5em9yLmdldEVsZW1Db21wYXJlZENvdW50KCkgPT0gZWxlbUNvbXBhcmVkQ291bnQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGJ1aWxkRGVmYXVsdExpYnJhcnkoKSB7CQkKLQkJdHJhY2UoImJ1aWxkRGVmYXVsdExpYnJhcnkgLT4iKTsKLQkJCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oIlBsdWdfQSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiQ29uZmlnX0EiKTsKLQkJQ2FwYWJpbGl0eVBhdHRlcm4gY3AxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4ocGx1Z2luLCAiQ1AxIiwgY29uZmlnKTsKLQkJQ2FwYWJpbGl0eVBhdHRlcm4gY3AyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4ocGx1Z2luLCAiQ1AyIiwgY29uZmlnKTsJCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyhjcDIsIGNwMSk7Ci0JCQotCQkvLyB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24KLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZCgoUHJvY2Vzc0NvbXBvbmVudCljcDEuZUNvbnRhaW5lcigpKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQoKFByb2Nlc3NDb21wb25lbnQpY3AyLmVDb250YWluZXIoKSk7Ci0JCQotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCQotCQlmaW5hbCBTdHJpbmcgY3AxX3RleHQgPSAiY3AxIG1haW4gZGVzYyI7Ci0JCWZpbmFsIFN0cmluZyBjcDJfdGV4dCA9ICJjcDIgbWFpbiBkZXNjIjsKLQkJCQotCQljcDEuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKGNwMV90ZXh0KTsKLQkJY3AyLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbihjcDJfdGV4dCk7Ci0KLQkJdHJhY2UoImJ1aWxkRGVmYXVsdExpYnJhcnkgPC0iKTsKLQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb3B5RnJvbVRlc3RMaWJzKFN0cmluZyBsaWJQYXRoLCBTdHJpbmcgcmVsTGliTmFtZVBhdGgpIHsKLQkJRmlsZSBzb3VyY2UgPSBuZXcgRmlsZSh0ZXN0Um9vdFNvdXJjZS5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgcmVsTGliTmFtZVBhdGgpOwotCQlTdHJpbmcgbGliTmFtZSA9IHNvdXJjZS5nZXROYW1lKCk7Ci0JCUZpbGUgbGliTGlzdFtdID0gc291cmNlLmdldFBhcmVudEZpbGUoKS5saXN0RmlsZXMoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGxpYkxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGUgZmlsZSA9IGxpYkxpc3RbaV07Ci0JCQlpZiAobGliTmFtZS5lcXVhbHMoZmlsZS5nZXROYW1lKCkpKSB7Ci0JCQkJRmlsZSB0YXJnZXQgPSBuZXcgRmlsZShsaWJQYXRoKTsKLQkJCQlQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlLmNvcHlEaXIoc291cmNlLCB0YXJnZXQpOwotCQkJCWFsbExpYnMucHV0KGxpYk5hbWUsIGxpYlBhdGgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIERvY3VtZW50IGdldE91dHB1dERvY3VtZW50KCkgewotCQlpZiAob3V0cHV0RG9jdW1lbnQgPT0gbnVsbCkgewkJCQotCQkJdHJ5IHsKLQkJCQlvdXRwdXREb2N1bWVudCA9IFhNTFV0aWwuY3JlYXRlRG9jdW1lbnQoKTsKLQkJICAgICAgICBFbGVtZW50IHJvb3QgPSBvdXRwdXREb2N1bWVudC5jcmVhdGVFbGVtZW50KCJUZXN0ZXJPdXRwdXQiKTsKLQkJICAgICAgICBvdXRwdXREb2N1bWVudC5hcHBlbmRDaGlsZChyb290KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb3V0cHV0RG9jdW1lbnQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjbGVhck91dHB1dERvY3VtZW50KCkgewotCQlvdXRwdXREb2N1bWVudCA9IG51bGw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0UGF0aCgpIHsKLQkJcmV0dXJuIG91dHB1dFBhdGg7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbGluZSkgewotCQlsb2dQUy5wcmludGxuKGxpbmUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2suamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQyYzNjZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUluZm9NZ3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLlRyYWNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRNZ3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBBIHRlc3QgY29tbWFuZCBjbGFzcwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVENDaXJjdWxhckRlcGVuZGVuY3lDaGVjayBleHRlbmRzIFRlc3RDb21tYW5kSW1wbCB7CQkJCQkKLQkKLQlwdWJsaWMgdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIucGFyc2UoZWxlbWVudCk7Ci0JCXNldEF0dHJpYnV0ZShBVF9FcnJvckNvdW50LCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9FcnJvckNvdW50KSk7Ci0JCXNldEF0dHJpYnV0ZShBVF9DaXJjdWxhckVsZW1lbnRDb3VudCwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfQ2lyY3VsYXJFbGVtZW50Q291bnQpKTsKLQl9CQotCQotCXB1YmxpYyBUQ0V4ZVJlcGx5IGV4ZWN1dGUoKSB7Ci0JCWludCBlcnJvckNvdW50ID0gcGFyc2VJbnRlZ2VyKGdldEF0dHJpYnV0ZShBVF9FcnJvckNvdW50KSwgMCk7Ci0JCWludCBjaXJjdWxhckVsZW1lbnRDb3VudCA9IHBhcnNlSW50ZWdlcihnZXRBdHRyaWJ1dGUoQVRfQ2lyY3VsYXJFbGVtZW50Q291bnQpLCAwKTsKLQkJZmluYWwgVGVzdENvbW1hbmRNZ3Igb3duZXIgPSBnZXRPd25lcigpOwotCQkKLQkJVHJhY2VyIHRyYWNlciA9IG5ldyBUcmFjZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB0cmFjZShTdHJpbmcgbGluZSkgewotCQkJCW93bmVyLnRyYWNlKGxpbmUpOwotCQkJfQotCQl9OwotCQkKLQkJRGVwZW5kZW5jeUluZm9NZ3IgaW5mb01nciA9IG5ldyBEZXBlbmRlbmN5SW5mb01ncihvd25lci5nZXRDdXJyZW50QmFzZUxpYigpKTsKLQkJRGVwZW5kZW5jeUluZm9NZ3IuQ2hlY2tSZXN1bHQgY2hlY2tSZXN1bHQgPSBpbmZvTWdyLmNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5KHRyYWNlcik7Ci0JCQotCQlpZiAoY2hlY2tSZXN1bHQuZ2V0RXJyb3JDb3VudCgpICE9IGVycm9yQ291bnQgfHwgCi0JCQkJY2hlY2tSZXN1bHQuZ2V0Q2lyY3VsYXJFbGVtZW50Q291bnQoKSAhPSBjaXJjdWxhckVsZW1lbnRDb3VudCkgewotCQkJU3RyaW5nIG1zZyA9ICJjaGVja1Jlc3VsdC5nZXRFcnJvckNvdW50KCkgPSAiICsgY2hlY2tSZXN1bHQuZ2V0RXJyb3JDb3VudCgpICsgIlxuIjsKLQkJCW1zZyArPSAiY2hlY2tSZXN1bHQuZ2V0Q2lyY3VsYXJFbGVtZW50Q291bnQoKSA9ICIgKyBjaGVja1Jlc3VsdC5nZXRDaXJjdWxhckVsZW1lbnRDb3VudCgpOwotCQkJb3duZXIudHJhY2UobXNnKTsKLQkJCXJldHVybiBuZXcgVENFeGVSZXBseUltcGwobXNnLCBmYWxzZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDQ29tcGFyZVRvR29sZGVuRmlsZS5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENDb21wYXJlVG9Hb2xkZW5GaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMzYwZmEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENDb21wYXJlVG9Hb2xkZW5GaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLk91dHB1dERpZmZBbmFseXpvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRNZ3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBBIHRlc3QgY29tbWFuZCBjbGFzcwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVENDb21wYXJlVG9Hb2xkZW5GaWxlIGV4dGVuZHMgVGVzdENvbW1hbmRJbXBsIHsJCQkJCQotCQotCXB1YmxpYyB2b2lkIHBhcnNlKEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5wYXJzZShlbGVtZW50KTsKLQkJc2V0QXR0cmlidXRlKEFUX0dvbGRlbkZpbGVOYW1lLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9Hb2xkZW5GaWxlTmFtZSkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfRGlmZkNvdW50LCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9EaWZmQ291bnQpKTsKLQkJc2V0QXR0cmlidXRlKEFUX0VsZW1lbnRDb3VudCwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfRWxlbWVudENvdW50KSk7Ci0JfQkKLQkKLQlwdWJsaWMgVENFeGVSZXBseSBleGVjdXRlKCkgewotCQlTdHJpbmcgZ29sZGVuRmlsZU5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRfR29sZGVuRmlsZU5hbWUpOwotCQlpbnQgZGlmZkNvdW50ID0gcGFyc2VJbnRlZ2VyKGdldEF0dHJpYnV0ZShBVF9EaWZmQ291bnQpLCAwKTsKLQkJaW50IGVsZW1lbnRDb3VudCA9IHBhcnNlSW50ZWdlcihnZXRBdHRyaWJ1dGUoQVRfRWxlbWVudENvdW50KSwgMCk7CQotCQlUZXN0Q29tbWFuZE1nciBvd25lciA9IGdldE93bmVyKCk7Ci0JCQotCQlEb2N1bWVudCBvdXRwdXREb2N1bWVudCA9IG93bmVyLmdldE91dHB1dERvY3VtZW50KCk7Ci0JCWlmIChvdXRwdXREb2N1bWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJU3RyaW5nIG91dHB1dFBhdGggPSBvd25lci5nZXRPdXRwdXRQYXRoKCk7Ci0JCXRyeSB7Ci0JCQlYTUxVdGlsLnNhdmVEb2N1bWVudChvdXRwdXREb2N1bWVudCwgb3V0cHV0UGF0aCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJU3RyaW5nIHBhdGggPSBvd25lci5nZXRUZXN0RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQlpbnQgaXggPSBwYXRoLmxhc3RJbmRleE9mKCIuIik7Ci0JCXBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBpeCkgKyAiLnhtbCI7Ci0JCUZpbGUgZ29sZGVuT3V0cHV0ID0gbmV3IEZpbGUocGF0aCk7Ci0JCWlmIChnb2xkZW5PdXRwdXQuZXhpc3RzKCkpIHsKLQkJCU91dHB1dERpZmZBbmFseXpvciBhbmFseXNvciA9IG5ldyBPdXRwdXREaWZmQW5hbHl6b3Iob3duZXIsIG51bGwsIG91dHB1dERvY3VtZW50LAotCQkJCQlnb2xkZW5PdXRwdXQsIG5ldyBGaWxlKG91dHB1dFBhdGgpKTsKLQkJCWFuYWx5c29yLmNvbXBhcmUoKTsKLQkJCWlmIChhbmFseXNvci5nZXREaWZmQ291bnQoKSAhPSBkaWZmQ291bnQgfHwKLQkJCQkJZWxlbWVudENvdW50ICE9IDAgJiYgYW5hbHlzb3IuZ2V0RWxlbUNvbXBhcmVkQ291bnQoKSAhPSBlbGVtZW50Q291bnQpIHsJCQkJCi0JCQkJU3RyaW5nIG1zZyA9ICJPdXB0dXQgYW5kIGdvbGRlbiBmaWxlIGNvbXBhcmlzb24gZmFpbHMhICI7Ci0JCQkJb3duZXIudHJhY2UobXNnKTsKLQkJCQlyZXR1cm4gbmV3IFRDRXhlUmVwbHlJbXBsKG1zZywgZmFsc2UpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0NvbXBhcmVUb0xpYnJhcnkuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDQ29tcGFyZVRvTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTFlMzVkLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDQ29tcGFyZVRvTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRNZ3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDQ29tcGFyZVRvTGlicmFyeSBleHRlbmRzIFRlc3RDb21tYW5kSW1wbCB7CQkJCQkKLQkKLQlwdWJsaWMgdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIucGFyc2UoZWxlbWVudCk7Ci0JCXNldEF0dHJpYnV0ZShBVF9Hb2xkZW5MaWJGb2xkZXJOYW1lLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9Hb2xkZW5MaWJGb2xkZXJOYW1lKSk7Ci0JCXNldEF0dHJpYnV0ZShBVF9EaWZmQ291bnQsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0RpZmZDb3VudCkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfRWxlbWVudENvdW50LCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9FbGVtZW50Q291bnQpKTsKLQkJc2V0QXR0cmlidXRlKEFUX1VzZU5hbWVBc0lkLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9Vc2VOYW1lQXNJZCkpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJU3RyaW5nIGdvbGRlbkxpYkZvbGRlck5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRfR29sZGVuTGliRm9sZGVyTmFtZSk7Ci0JCWludCBkaWZmQ291bnQgPSAwOwotCQlpbnQgZWxlbWVudENvdW50ID0gMDsKLQkJYm9vbGVhbiB1c2VOYW1lQXNJZCA9IGZhbHNlOwotCQkKLQkJU3RyaW5nIHN0ciA9IGdldEF0dHJpYnV0ZShBVF9EaWZmQ291bnQpOwotCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID4gMCkgewotCQkJZGlmZkNvdW50ID0gSW50ZWdlci5wYXJzZUludChzdHIpOwotCQl9Ci0JCXN0ciA9IGdldEF0dHJpYnV0ZShBVF9FbGVtZW50Q291bnQpOwotCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID4gMCkgewotCQkJZWxlbWVudENvdW50ID0gSW50ZWdlci5wYXJzZUludChzdHIpOwotCQl9CQkKLQkJc3RyID0gZ2V0QXR0cmlidXRlKEFUX1VzZU5hbWVBc0lkKTsKLQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5sZW5ndGgoKSA+IDApIHsKLQkJCXVzZU5hbWVBc0lkID0gc3RyLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsKLQkJfQkKLQkJCi0JCVRlc3RDb21tYW5kTWdyIG93bmVyID0gZ2V0T3duZXIoKTsKLQkJTWV0aG9kTGlicmFyeSBnb2xkZW5MaWIgID0gb3duZXIubG9hZE5vbkJhc2VMaWIoZ29sZGVuTGliRm9sZGVyTmFtZSk7Ci0JCU1ldGhvZExpYnJhcnkgY3VyTGliICA9IG93bmVyLmdldEN1cnJlbnRCYXNlTGliKCk7CQotCQlpZiAodXNlTmFtZUFzSWQpIHsKLQkJCUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlLmZpeEltcG9ydExpYnJhcnlTeXN0ZW1QYWNrYWdlR1VJRHMoZ29sZGVuTGliLCBjdXJMaWIpOwotCQl9Ci0JCWJvb2xlYW4gcmVzdWx0ID0gb3duZXIuY29tcGFyZUxpYnMoZ29sZGVuTGliLCBjdXJMaWIsIGRpZmZDb3VudCwgZWxlbWVudENvdW50LCB1c2VOYW1lQXNJZCk7Ci0JCXJldHVybiBuZXcgVENFeGVSZXBseUltcGwoIiIsIHJlc3VsdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENDb3B5TGlicmFyeS5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENDb3B5TGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGRhMWNkLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDQ29weUxpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kSW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ0NvcHlMaWJyYXJ5IGV4dGVuZHMgVGVzdENvbW1hbmRJbXBsIHsJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfTGliRm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfTGliRm9sZGVyTmFtZSkpOwotCX0KLQkKLQlwdWJsaWMgVENFeGVSZXBseSBleGVjdXRlKCkgewotCQlTdHJpbmcgcmVsTGliTmFtZVBhdGggPSBnZXRBdHRyaWJ1dGUoQVRfTGliRm9sZGVyTmFtZSk7Ci0JCWludCBpeCA9IHJlbExpYk5hbWVQYXRoLmxhc3RJbmRleE9mKCIvIik7CQkKLQkJU3RyaW5nIGxpYkZvbGRlck5hbWUgPSBpeCA8IDAgPyByZWxMaWJOYW1lUGF0aCA6IHJlbExpYk5hbWVQYXRoLnN1YnN0cmluZyhpeCArIDEpOwotCQlTdHJpbmcgbGliUGF0aCA9IGdldE93bmVyKCkuZ2V0Q3VyclRlc3REaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgbGliRm9sZGVyTmFtZTsJCi0JCWdldE93bmVyKCkuY29weUZyb21UZXN0TGlicyhsaWJQYXRoLCByZWxMaWJOYW1lUGF0aCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRWRpdE1ldGhvZEVsZW1lbnQuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRWRpdE1ldGhvZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUzODkyNC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0VkaXRNZXRob2RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuVGVzdGVyT3V0cHV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVGVzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBBIHRlc3QgY29tbWFuZCBjbGFzcwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVENFZGl0TWV0aG9kRWxlbWVudCBleHRlbmRzIFRDRWRpdE1ldGhvZEVsZW1lbnRCYXNlIHsJCQkJCQotCQotCXB1YmxpYyB2b2lkIHBhcnNlKEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5wYXJzZShlbGVtZW50KTsKLQl9CQotCQotCXB1YmxpYyBUQ0V4ZVJlcGx5IGV4ZWN1dGUoKSB7Ci0JCXJldHVybiBzdXBlci5leGVjdXRlKCk7Ci0JfQotCi0JCi19Ci0KLQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENFZGl0TWV0aG9kRWxlbWVudEJhc2UuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRWRpdE1ldGhvZEVsZW1lbnRCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ODZjY2UuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENFZGl0TWV0aG9kRWxlbWVudEJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5UZXN0ZXJPdXRwdXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UZXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLQotLyoqCi0gKiBBIHRlc3QgY29tbWFuZCBjbGFzcwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVENFZGl0TWV0aG9kRWxlbWVudEJhc2UgZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkJCi0JCi0Jc3RhdGljIGNsYXNzIFRhZ0RhdGEgewotCQlwdWJsaWMgTWFwIGF0dE1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0JCXB1YmxpYyBNYXAgcmVmTWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBFQ2xhc3MgZWNsYXNzOwotCXByaXZhdGUgVGFnRGF0YSB0YWdEYXRhOwotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50OwotCXByaXZhdGUgTWFwIHJlZlZhbHVlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIHN0YXRpYyBNYXAgZWNsYXNzRGF0YU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBMaXN0IGNoaWxkQ29tbWFuZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBib29sZWFuIGlzQ2hpbGRDb21tYW5kID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIFRlc3RDb21tYW5kIG5ld0NoaWxkQ29tbWFuZChDbGFzcyB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlUQ0VkaXRNZXRob2RFbGVtZW50QmFzZSBjb21tYW5kID0gKFRDRWRpdE1ldGhvZEVsZW1lbnRCYXNlKSB0eXBlLm5ld0luc3RhbmNlKCk7Ci0JCQljb21tYW5kLnNldE93bmVyKGdldE93bmVyKCkpOwotCQkJY29tbWFuZC5zZXRJc0NoaWxkQ29tbWFuZCh0cnVlKTsKLQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gbmV3Q2hpbGRDb21tYW5kOiAiICsgdHlwZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY29tbWFuZDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlpbml0KGVsZW1lbnQpOwotCQlwYXJzZUF0dHJpYnV0ZXMoKTsJCQotCQlwYXJzZVZhbHVlQ2hpbGRyZW4oKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB0eXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfVHlwZSk7Ci0JCWVjbGFzcyA9IG1ldGhvZEVsZW1lbnQgPT0gbnVsbCA/IGdldEVDbGFzcyh0eXBlKSA6IG1ldGhvZEVsZW1lbnQuZUNsYXNzKCk7Ci0JCWlmIChlY2xhc3MgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRhZ0RhdGEgPSAoVGFnRGF0YSkgZWNsYXNzRGF0YU1hcC5nZXQoZWNsYXNzKTsKLQkJaWYgKHRhZ0RhdGEgIT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9CQkKLQkJdGFnRGF0YSA9IG5ldyBUYWdEYXRhKCk7Ci0JCWVjbGFzc0RhdGFNYXAucHV0KGVjbGFzcywgdGFnRGF0YSk7Ci0JCQotCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZWNsYXNzOiAiICsgZWNsYXNzLmdldE5hbWUoKSk7Ci0JCQlUZXN0ZXJPdXRwdXRVdGlsLnNob3coImVjbGFzcy5nZXRFQWxsQXR0cmlidXRlcygpIiwgZWNsYXNzLmdldEVBbGxBdHRyaWJ1dGVzKCkpOwotCQkJVGVzdGVyT3V0cHV0VXRpbC5zaG93KCJlY2xhc3MuZ2V0RUFsbFJlZmVyZW5jZXMoKSIsIGVjbGFzcy5nZXRFQWxsUmVmZXJlbmNlcygpKTsKLQkJfQotCQkKLQkJYWRkVG9FY2xhc3NEYXRhTWFwKGVjbGFzcy5nZXRFQWxsQXR0cmlidXRlcygpLCB0YWdEYXRhLmF0dE1hcCk7Ci0JCWFkZFRvRWNsYXNzRGF0YU1hcChlY2xhc3MuZ2V0RUFsbFJlZmVyZW5jZXMoKSwgdGFnRGF0YS5yZWZNYXApOwotCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFRvRWNsYXNzRGF0YU1hcChMaXN0IGZlYXR1cmVzLCBNYXAgZmVhTWFwKSB7Ci0JCWJvb2xlYW4gdmVyYm9zZSA9IGdldFZlcmJvc2UoKTsKLQkJYm9vbGVhbiBpc1JlZiA9IGZhbHNlOwotCQlpZiAodmVyYm9zZSkgewotCQkJaWYgKGZlYU1hcCA9PSB0YWdEYXRhLmF0dE1hcCkgewotCQkJCWxvZygiXG5BdHRyaWJ1dGUgZmVhdHVlcyBmb3IgIiArICJcIiIgKyBlY2xhc3MuZ2V0TmFtZSgpICsgIlwiOiAiKTsKLQkJCX0gZWxzZSBpZiAoZmVhTWFwID09IHRhZ0RhdGEucmVmTWFwKSB7Ci0JCQkJbG9nKCJcblJlZmVyZW5jZSBmZWF0dWVzIGZvciAiICsgIlwiIiArIGVjbGFzcy5nZXROYW1lKCkgKyAiXCI6ICIpOwotCQkJCWlzUmVmID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlmb3IgKGludCBpPTA7IGk8ZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwkJCQotCQkJZmVhTWFwLnB1dChmZWF0dXJlLmdldE5hbWUoKSwgZmVhdHVyZSk7Ci0JCQlpZiAodmVyYm9zZSkgewotCQkJCVN0cmluZyBsaW5lID0gIiI7Ci0JCQkJaWYgKGlzUmVmKSB7Ci0JCQkJCWxpbmUgKz0gKChFUmVmZXJlbmNlKSBmZWF0dXJlKS5pc0NvbnRhaW5tZW50KCkgPwotCQkJCQkJCSJjb250YWluZWQsICIgOiAicmVmZXJyZWQgLCAiOwotCQkJCQlsaW5lICs9ICgoRVJlZmVyZW5jZSkgZmVhdHVyZSkuaXNNYW55KCkgPwotCQkJCQkJCSJtYW55ICAgLT4gIiA6ICJzaW5nbGUgLT4gIjsKLQkJCQl9Ci0JCQkJbGluZSArPSBmZWF0dXJlLmdldE5hbWUoKSArICI6ICI7Ci0JCQkJbGluZSArPSBpc1JlZiA/ICgoRVJlZmVyZW5jZSkgZmVhdHVyZSkuZ2V0RVJlZmVyZW5jZVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzTmFtZSgpCi0JCQkJCQkJOiAoKEVBdHRyaWJ1dGUpIGZlYXR1cmUpLmdldEVBdHRyaWJ1dGVUeXBlKCkuZ2V0SW5zdGFuY2VDbGFzc05hbWUoKTsKLQkJCQlsb2cobGluZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2VBdHRyaWJ1dGVzKCkgewotCQlzZXRBdHRyaWJ1dGUoQVRfVHlwZSwgZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShBVF9UeXBlKSk7Ci0JCXNldEF0dHJpYnV0ZShBVF9QYXRoLCBnZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKEFUX1BhdGgpKTsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSB0YWdEYXRhLmF0dE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBhdF90YWcgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCXNldEF0dHJpYnV0ZShhdF90YWcsIGdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoYXRfdGFnKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2VWYWx1ZUNoaWxkcmVuKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdGFnRGF0YS5yZWZNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgY2hpbGRUYWcgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCXNldEF0dHJpYnV0ZShjaGlsZFRhZywgZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShjaGlsZFRhZykpOwotCQkJcGFyc2VDaGlsZFRhZ0FzVmFsdWUoY2hpbGRUYWcpOwkJCQkJCQkJCQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhcnNlQ2hpbGRUYWdBc1ZhbHVlKFN0cmluZyBjaGlsZFRhZykgewotCQlOb2RlTGlzdCBjbm9kZXMgPSBnZXRFbGVtZW50KCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoY2hpbGRUYWcpOwotCQlpZiAoY25vZGVzID09IG51bGwgfHwgY25vZGVzLmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlFbGVtZW50IGNFbGVtZW50ID0gKEVsZW1lbnQpIGNub2Rlcy5pdGVtKDApOwotCQljbm9kZXMgPSBjRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShWVF9WYWx1ZSk7CQotCQlpZiAoY25vZGVzID09IG51bGwgfHwgY25vZGVzLmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlMaXN0IHZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGNub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlFbGVtZW50IHZFbGVtID0gKEVsZW1lbnQpIGNub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIHZhbHVlID0gdkVsZW0uZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVWYWx1ZSgpOwotCQkJdmFsdWVMaXN0LmFkZCh2YWx1ZSk7Ci0JCX0KLQkJcmVmVmFsdWVNYXAucHV0KGNoaWxkVGFnLCB2YWx1ZUxpc3QpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0TWV0aG9kRWxlbWVudChNZXRob2RFbGVtZW50IGUpIHsKLQkJbWV0aG9kRWxlbWVudCA9IGU7Ci0JfQotCQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50OwotCX0JCi0JCi0JcHJvdGVjdGVkIFRhZ0RhdGEgZ2V0VGFnRGF0YSgpIHsKLQkJcmV0dXJuIHRhZ0RhdGE7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBwYXJzZUNoaWxkVGFnQXNDb21tYW5kKEVsZW1lbnQgY0VsZW1lbnQsIFN0cmluZyBjaGlsZFRhZykgewotCQlFUmVmZXJlbmNlIGZlYXR1cmUgPSAoRVJlZmVyZW5jZSkgdGFnRGF0YS5yZWZNYXAuZ2V0KGNoaWxkVGFnKTsKLQkJaWYgKCEgZmVhdHVyZS5pc0NvbnRhaW5tZW50KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlUQ0VkaXRNZXRob2RFbGVtZW50QmFzZSBjaGlsZENvbW1hbmQgPSAoVENFZGl0TWV0aG9kRWxlbWVudEJhc2UpIG5ld0NoaWxkQ29tbWFuZChUQ0VkaXRNZXRob2RFbGVtZW50LmNsYXNzKTsKLQkJT2JqZWN0IGZlYXR1cmVPYmogPSBtZXRob2RFbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlMaXN0IG93bmVyTGlzdCA9IChMaXN0KSBmZWF0dXJlT2JqOwotCQkJZmVhdHVyZU9iaiA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZShmZWF0dXJlLmdldEVSZWZlcmVuY2VUeXBlKCkpOwotCQkJb3duZXJMaXN0LmFkZChmZWF0dXJlT2JqKTsKLQkJfSAKLQkJY2hpbGRDb21tYW5kLnNldE1ldGhvZEVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpIGZlYXR1cmVPYmopOwotCQlpZiAoZ2V0VmVyYm9zZSgpKSB7Ci0JCQljRWxlbWVudC5zZXRBdHRyaWJ1dGUoQVRfVmVyYm9zZSwgInRydWUiKTsKLQkJfQotCQljaGlsZENvbW1hbmQucGFyc2UoY0VsZW1lbnQpOwotCQlhZGRUb0NoaWxkQ29tbWFuZHMoY2hpbGRDb21tYW5kKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwYXJzZUNvbW1hbmRDaGlsZHJlbigpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHRhZ0RhdGEucmVmTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJU3RyaW5nIGNoaWxkVGFnID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQlOb2RlTGlzdCBjbm9kZXMgPSBnZXRFbGVtZW50KCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoY2hpbGRUYWcpOwotCQkJaWYgKGNub2RlcyA9PSBudWxsIHx8IGNub2Rlcy5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlmb3IgKGludCBpPTA7IGk8Y25vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlFbGVtZW50IGNFbGVtZW50ID0gKEVsZW1lbnQpIGNub2Rlcy5pdGVtKGkpOwotCQkJCXBhcnNlQ2hpbGRUYWdBc0NvbW1hbmQoY0VsZW1lbnQsIGNoaWxkVGFnKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIFRDRXhlUmVwbHkgZXhlY3V0ZUNoaWxkQ29tbWFuZHMoKSB7Ci0JCWZvciAoaW50IGk9MDsgaTxjaGlsZENvbW1hbmRzLnNpemUoKTsgaSsrKSB7Ci0JCQlUZXN0Q29tbWFuZCBjb21tYW5kID0gKFRlc3RDb21tYW5kKSBjaGlsZENvbW1hbmRzLmdldChpKTsKLQkJCVRDRXhlUmVwbHkgcmVzdWx0ID0gY29tbWFuZC5leGVjdXRlKCk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgIXJlc3VsdC5wYXNzaW5nKCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgVENFeGVSZXBseSBleGVjdXRlKCkgewkJCi0JCU1ldGhvZExpYnJhcnkgY3VyckxpYiA9IGdldE93bmVyKCkuZ2V0Q3VycmVudEJhc2VMaWIoKTsJCQotCQlTdHJpbmcgcGF0aCA9IGdldEF0dHJpYnV0ZShBVF9QYXRoKTsKLQkJaWYgKG1ldGhvZEVsZW1lbnQgPT0gbnVsbCkgewotCQkJaWYgKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZShlY2xhc3MpIGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQpIHsKLQkJCQltZXRob2RFbGVtZW50ID0gVGVzdGVyT3V0cHV0VXRpbC5nZXRQcm9jZXNzRWxlbWVudChjdXJyTGliLCBwYXRoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWV0aG9kRWxlbWVudCA9IFRlc3Rlck91dHB1dFV0aWwuZ2V0TWV0aG9kRWxlbWVudChjdXJyTGliLCBwYXRoKTsKLQkJCX0KLQkJfQotCQlpZiAobWV0aG9kRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlwYXJzZUNvbW1hbmRDaGlsZHJlbigpOwotCQkKLQkJZVNldEJ5QXR0cmlidXRlcygpOwotCQllU2V0QnlWYWx1ZUNoaWxkcmVuKCk7Ci0JCQotCQlleGVjdXRlQ2hpbGRDb21tYW5kcygpOwotCQkKLQkJaWYgKCEgZ2V0SXNDaGlsZENvbW1hbmQoKSkgewotCQkJc2F2ZShtZXRob2RFbGVtZW50KTsKLQkJCS8vc2F2ZSgoTWV0aG9kRWxlbWVudCkgbWV0aG9kRWxlbWVudC5lQ29udGFpbmVyKCkpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVTZXRCeUF0dHJpYnV0ZXMoKSB7Ci0JCU1hcCBhdHRNYXAgPSBnZXRUYWdEYXRhKCkuYXR0TWFwOwotCQlNYXAgYXR0cmlidXRlTWFwID0gZ2V0QXR0cmlidXRlTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBhdHRNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgYXRfdGFnID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQlFQXR0cmlidXRlIGVhdHQgPSAoRUF0dHJpYnV0ZSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCUVEYXRhVHlwZSBkYXRhVHlwZSA9IGVhdHQuZ2V0RUF0dHJpYnV0ZVR5cGUoKTsKLQkJCVN0cmluZyBhdF92YWwgPSAoU3RyaW5nKSBhdHRyaWJ1dGVNYXAuZ2V0KGF0X3RhZyk7Ci0JCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGF0X3RhZzogIiArIGF0X3RhZyk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gYXRfdmFsOiAiICsgYXRfdmFsKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBlYXR0OiAiICsgZWF0dCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZGF0YVR5cGU6ICIgKyBkYXRhVHlwZSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsKLQkJCX0JCQkKLQkJCWlmIChhdF92YWwgPT0gbnVsbCB8fCBhdF92YWwubGVuZ3RoKCkgPT0gMCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJT2JqZWN0IG5ld1ZhbHVlID0gZ2V0RVNldFZhbHVlKGRhdGFUeXBlLCBhdF92YWwpOwotCQkJCi0JCQlpZiAobmV3VmFsdWUgIT0gbnVsbCkgewotCQkJCW1ldGhvZEVsZW1lbnQuZVNldChlYXR0LCBuZXdWYWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWxvZygiXG5XYXJuaW5nOiBub3QgaGFuZGxlZCBkYXRhVHlwZTogIiArIGRhdGFUeXBlLmdldEluc3RhbmNlQ2xhc3NOYW1lKCkpOwotCQkJfQotCQl9Ci0JCUVBdHRyaWJ1dGUgZGF0ZUF0dCA9IChFQXR0cmlidXRlKSBhdHRNYXAuZ2V0KCJjaGFuZ2VEYXRlIik7Ci0JCWlmIChkYXRlQXR0ICE9IG51bGwpIHsKLQkJCW1ldGhvZEVsZW1lbnQuZVNldChkYXRlQXR0LCBuZXcgRGF0ZSgpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIE9iamVjdCBnZXRFU2V0VmFsdWUoRURhdGFUeXBlIGRhdGFUeXBlLCBTdHJpbmcgc3RyVmFsKSB7Ci0JCUNsYXNzIGNscyA9IGRhdGFUeXBlLmdldEluc3RhbmNlQ2xhc3MoKTsJCQotCQlpZiAoY2xzLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7Ci0JCQlyZXR1cm4gc3RyVmFsOwotCQl9Ci0JCWlmIChjbHMuZXF1YWxzKEJvb2xlYW4uY2xhc3MpKSB7Ci0JCQlib29sZWFuIGIgPSBzdHJWYWwuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOwotCQkJaWYgKCFiICYmICFzdHJWYWwuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGIpOwotCQl9Ci0JCWlmIChjbHMuZXF1YWxzKERhdGUuY2xhc3MpKSB7Ci0JCQlTaW1wbGVEYXRlRm9ybWF0IHNkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIik7Ci0JCQlEYXRlIGRhdGUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlkYXRlID0gc2RmLnBhcnNlKHN0clZhbCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCXJldHVybiBkYXRlOwotCQl9Ci0JCWlmIChjbHMuZXF1YWxzKFZhcmlhYmlsaXR5VHlwZS5jbGFzcykpIHsKLQkJCWlmIChzdHJWYWwuZXF1YWxzKCJjb250cmlidXRlcyIpKSB7Ci0JCQkJcmV0dXJuIFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUzsKLQkJCX0KLQkJCWlmIChzdHJWYWwuZXF1YWxzKCJleHRlbmRzIikpIHsKLQkJCQlyZXR1cm4gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFM7Ci0JCQl9Ci0JCQlpZiAoc3RyVmFsLmVxdWFscygicmVwbGFjZXMiKSkgewotCQkJCXJldHVybiBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBlU2V0QnlWYWx1ZUNoaWxkcmVuKCkgewotCQlNZXRob2RMaWJyYXJ5IGN1cnJMaWIgPSBnZXRPd25lcigpLmdldEN1cnJlbnRCYXNlTGliKCk7CQotCQlNYXAgcmVmTWFwID0gZ2V0VGFnRGF0YSgpLnJlZk1hcDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHJlZk1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyByZWZfdGFnID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQlFUmVmZXJlbmNlIGVyZWYgPSAoRVJlZmVyZW5jZSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCUVDbGFzc2lmaWVyIGVUeXBlID0gZXJlZi5nZXRFVHlwZSgpOwotCQkJTGlzdCB2YWx1ZUxpc3QgPSAoTGlzdCkgcmVmVmFsdWVNYXAuZ2V0KHJlZl90YWcpOwotCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiByZWZfdGFnOiAiICsgcmVmX3RhZyk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gdmFsdWVMaXN0OiAiICsgdmFsdWVMaXN0KTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBlcmVmOiAiICsgZXJlZik7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZVR5cGU6ICIgKyBlVHlwZSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsKLQkJCX0KLQkJCQotCQkJaW50IHN6ID0gdmFsdWVMaXN0ID09IG51bGwgPyAwIDogdmFsdWVMaXN0LnNpemUoKTsKLQkJCWlmIChzeiA9PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoZXJlZi5pc01hbnkoKSkgewotCQkJCUxpc3Qgb3duZXJMaXN0ID0gKExpc3QpIG1ldGhvZEVsZW1lbnQuZUdldChlcmVmKTsKLQkJCQlmb3IgKGludCBpPTA7IGk8c3o7IGkrKykgewotCQkJCQlTdHJpbmcgcmVmUGF0aCA9IChTdHJpbmcpIHZhbHVlTGlzdC5nZXQoaSk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudCA9IFRlc3Rlck91dHB1dFV0aWwuZ2V0TWV0aG9kRWxlbWVudChjdXJyTGliLCByZWZQYXRoKTsKLQkJCQkJaWYgKHJlZkVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJb3duZXJMaXN0LmFkZChyZWZFbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoc3ogPT0gMSl7Ci0JCQkJU3RyaW5nIHJlZlBhdGggPSAoU3RyaW5nKSB2YWx1ZUxpc3QuZ2V0KDApOwotCQkJCU1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudCA9IFRlc3Rlck91dHB1dFV0aWwuZ2V0TWV0aG9kRWxlbWVudChjdXJyTGliLCByZWZQYXRoKTsKLQkJCQlpZiAoZXJlZi5nZXROYW1lKCkuZXF1YWxzKCJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IikgCi0JCQkJCQkmJiByZWZFbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlyZWZFbGVtZW50ID0gKChQcm9jZXNzQ29tcG9uZW50KXJlZkVsZW1lbnQpLmdldFByb2Nlc3MoKTsKLQkJCQl9Ci0JCQkJbWV0aG9kRWxlbWVudC5lU2V0KGVyZWYsIHJlZkVsZW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCQotCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJc0NoaWxkQ29tbWFuZChib29sZWFuIGIpIHsKLQkJaXNDaGlsZENvbW1hbmQgPSBiOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRJc0NoaWxkQ29tbWFuZCgpIHsKLQkJcmV0dXJuIGlzQ2hpbGRDb21tYW5kOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb0NoaWxkQ29tbWFuZHMoVGVzdENvbW1hbmQgY29tbWFuZCkgewotCQljaGlsZENvbW1hbmRzLmFkZChjb21tYW5kKTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENFeGVSZXBseUltcGwuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhlUmVwbHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxN2Q2MmUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENFeGVSZXBseUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLQotLyoqCi0gKiBJbXBsZW1lbnRpbmcgVENFeGVSZXBseQotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVENFeGVSZXBseUltcGwgaW1wbGVtZW50cyBUQ0V4ZVJlcGx5IHsKLQkKLQlwcml2YXRlIGJvb2xlYW4gcGFzc2luZyA9IHRydWU7Ci0JcHJpdmF0ZSBMaXN0IG1zZ3M7Ci0JCi0JcHVibGljIFRDRXhlUmVwbHlJbXBsKFN0cmluZyBtc2csIGJvb2xlYW4gcGFzc2luZykgewotCQlhZGRNc2cobXNnKTsKLQkJc2V0UGFzc2luZyhwYXNzaW5nKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYXN0TXNnKCkgewotCQlpbnQgc3ogPSBtc2dzID09IG51bGwgPyAwIDogbXNncy5zaXplKCk7CQkJCi0JCXJldHVybiBzeiA9PSAwID8gbnVsbCA6IChTdHJpbmcpIG1zZ3MuZ2V0KHN6IC0gMSk7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldE1zZ3MoKSB7Ci0JCXJldHVybiBtc2dzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwYXNzaW5nKCkgewotCQlyZXR1cm4gcGFzc2luZzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkTXNnKFN0cmluZyBtc2cpIHsKLQkJaWYgKG1zZyA9PSBudWxsIHx8IG1zZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG1zZ3MgPT0gbnVsbCkgewotCQkJbXNncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQltc2dzLmFkZChtc2cpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQYXNzaW5nKGJvb2xlYW4gYikgewotCQlwYXNzaW5nID0gYjsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhlUmVwbHlMaXN0SW1wbC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENFeGVSZXBseUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYzA2YzAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENFeGVSZXBseUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHlMaXN0OwotCi0vKioKLSAqIEltcGxlbWVudGluZyBDRXhlUmVwbHlMaXN0Ci0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLQotcHVibGljIGNsYXNzIFRDRXhlUmVwbHlMaXN0SW1wbCBpbXBsZW1lbnRzIFRDRXhlUmVwbHlMaXN0IHsKLQlMaXN0IHJlcGx5TGlzdCA9IG51bGw7Ci0JU3RyaW5nIAlzdW1tYXJ5UmVwbHk7Ci0JCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gcmVwbHlMaXN0ID09IG51bGwgPyAwIDogcmVwbHlMaXN0LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgVENFeGVSZXBseSBpdGVtKGludCBpKSB7Ci0JCXJldHVybiAoVENFeGVSZXBseSkgcmVwbHlMaXN0LmdldChpKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcGFzc2luZygpIHsJCi0JCWZvciAoaW50IGk9MDsgaTxzaXplKCk7IGkrKykgewotCQkJaWYgKCEgaXRlbShpKS5wYXNzaW5nKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkKFRDRXhlUmVwbHkgcmVwbHkpIHsKLQkJaWYgKHJlcGx5TGlzdCA9PSBudWxsKSB7Ci0JCQlyZXBseUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJcmVwbHlMaXN0LmFkZChyZXBseSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFN1bW1hcnlSZXBseShTdHJpbmcgc3RyKSB7Ci0JCXN1bW1hcnlSZXBseSA9IHN0cjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRTdW1tYXJ5UmVwbHkoKSB7Ci0JCXJldHVybiBzdW1tYXJ5UmVwbHk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0V4cG9ydENvbmZpZ3VyYXRpb24uamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhwb3J0Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGNjY2Q4Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhwb3J0Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLkxpYnJhcnlUZXN0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRNZ3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ0V4cG9ydENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkKLQkKLQlwdWJsaWMgdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIucGFyc2UoZWxlbWVudCk7Ci0JCXNldEF0dHJpYnV0ZShBVF9FeHBvcnRGb2xkZXJOYW1lLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9FeHBvcnRGb2xkZXJOYW1lKSk7Ci0JCXNldEF0dHJpYnV0ZShBVF9TZWxlY3RlZENvbmZpZ05hbWUsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX1NlbGVjdGVkQ29uZmlnTmFtZSkpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJVGVzdENvbW1hbmRNZ3Igb3duZXIgPSBnZXRPd25lcigpOwotCQlNZXRob2RMaWJyYXJ5IGN1cnJMaWIgPSBvd25lci5nZXRDdXJyZW50QmFzZUxpYigpOwotCQlpZiAoY3VyckxpYiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJU3RyaW5nIGV4cG9ydEZvbGRlck5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRfRXhwb3J0Rm9sZGVyTmFtZSk7CQkKLQkJU3RyaW5nIHNlbGVjdGVkQ29uZmlnTmFtZSA9IGdldEF0dHJpYnV0ZShBVF9TZWxlY3RlZENvbmZpZ05hbWUpOwotCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgTGlicmFyeVRlc3RTZXJ2aWNlLmdldEVsZW1lbnQKLQkJCQkJCShjdXJyTGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLCBzZWxlY3RlZENvbmZpZ05hbWUpOwotCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlGaWxlIGV4cG9ydEZvbGRlciA9IG93bmVyLnJlZ2lzdGVyRXhwb3J0RGVzdGluYXRpb24oZXhwb3J0Rm9sZGVyTmFtZSwgZmFsc2UpOwkJCQkKLQkJZmluYWwgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YSA9IG5ldyBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSgpOwotCQlkYXRhLmxsRGF0YS5zZXRMaWJOYW1lKGN1cnJMaWIuZ2V0TmFtZSgpKTsKLQkJZGF0YS5sbERhdGEuc2V0UGFyZW50Rm9sZGVyKGV4cG9ydEZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWRhdGEuZXhwb3J0T25lQ29uZmlnID0gdHJ1ZTsKLQkJZGF0YS5leHBvcnRDb25maWdTcGVjcyA9IGZhbHNlOwotCQlkYXRhLnNlbGVjdGVkQ29uZmlncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZGF0YS5zZWxlY3RlZENvbmZpZ3MuYWRkKGNvbmZpZyk7Ci0JCQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJKG5ldyBDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZShkYXRhKSkucnVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhwb3J0UGx1Z2lucy5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENFeHBvcnRQbHVnaW5zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MjY2ZWMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENFeHBvcnRQbHVnaW5zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuUGx1Z2luRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDRXhwb3J0UGx1Z2lucyBleHRlbmRzIFRlc3RDb21tYW5kSW1wbCB7CQkJCQkKLQkKLQlwdWJsaWMgdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIucGFyc2UoZWxlbWVudCk7Ci0JCXNldEF0dHJpYnV0ZShBVF9FeHBvcnRGb2xkZXJOYW1lLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9FeHBvcnRGb2xkZXJOYW1lKSk7Ci0JfQkKLQkKLQlwdWJsaWMgVENFeGVSZXBseSBleGVjdXRlKCkgewotCQlMaXN0IHNlbGVjdGVkUGx1Z2lucyA9IG5ldyBBcnJheUxpc3QoZ2V0T3duZXIoKS5nZXRDdXJyZW50QmFzZUxpYigpLmdldE1ldGhvZFBsdWdpbnMoKSk7CQotCQkKLQkJaW50IHN6ID0gc2VsZWN0ZWRQbHVnaW5zID09IG51bGwgPyAwIDogc2VsZWN0ZWRQbHVnaW5zLnNpemUoKTsKLQkJaWYgKHN6ID09IDApIHsKLQkJCXJldHVybiBudWxsOyAKLQkJfQotCQkKLQkJU3RyaW5nIGV4cG9ydEZvbGRlck5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRfRXhwb3J0Rm9sZGVyTmFtZSk7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBzZWxlY3RlZFBsdWdpbnMuZ2V0KDApOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwbHVnaW4uZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQlmaWxlID0gZmlsZS5nZXRQYXJlbnRGaWxlKCkuZ2V0UGFyZW50RmlsZSgpOwotCQlGaWxlIGV4cG9ydEZvbGRlciA9IGdldE93bmVyKCkucmVnaXN0ZXJFeHBvcnREZXN0aW5hdGlvbihleHBvcnRGb2xkZXJOYW1lLCBmYWxzZSk7Ci0JCQotCQlmaW5hbCBQbHVnaW5FeHBvcnREYXRhIGRhdGEgPSBuZXcgUGx1Z2luRXhwb3J0RGF0YSgpOwotCQlkYXRhLmxsRGF0YS5zZXRMaWJOYW1lKGZpbGUuZ2V0TmFtZSgpKTsKLQkJZGF0YS5sbERhdGEuc2V0UGFyZW50Rm9sZGVyKGV4cG9ydEZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWRhdGEuc2V0U2VsZWN0ZWRQbHVnaW5zKHNlbGVjdGVkUGx1Z2lucyk7Ci0JCWRhdGEuYnVpbGRBc3NvY2lhdGVkQ29uZmlnTWFwKCk7Ci0KLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCShuZXcgUGx1Z2luRXhwb3J0U2VydmljZShkYXRhKSkucnVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0V4cG9ydFhtbC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENFeHBvcnRYbWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdhN2RlZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0V4cG9ydFhtbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuc2VydmljZXMuRXhwb3J0WE1MRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcy5FeHBvcnRYTUxTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZE1ncjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBBIHRlc3QgY29tbWFuZCBjbGFzcwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVENFeHBvcnRYbWwgZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkKLQkKLQlwdWJsaWMgdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIucGFyc2UoZWxlbWVudCk7Ci0JCXNldEF0dHJpYnV0ZShBVF9FeHBvcnRGb2xkZXJOYW1lLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9FeHBvcnRGb2xkZXJOYW1lKSk7Ci0JfQkKLQkKLQlwdWJsaWMgVENFeGVSZXBseSBleGVjdXRlKCkgewotCQlUZXN0Q29tbWFuZE1nciBvd25lciA9IGdldE93bmVyKCk7Ci0JCVN0cmluZyBleHBvcnRGb2xkZXJOYW1lID0gZ2V0QXR0cmlidXRlKEFUX0V4cG9ydEZvbGRlck5hbWUpOwotCQkKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBvd25lci5nZXRDdXJyZW50QmFzZUxpYigpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShsaWIuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQlmaWxlID0gZmlsZS5nZXRQYXJlbnRGaWxlKCkuZ2V0UGFyZW50RmlsZSgpOwotCQlGaWxlIGV4cG9ydEZpbGUgPSBvd25lci5yZWdpc3RlckV4cG9ydERlc3RpbmF0aW9uKGV4cG9ydEZvbGRlck5hbWUsIHRydWUpOwkJCi0JCQotCQlmaW5hbCBFeHBvcnRYTUxEYXRhIGRhdGEgPSBuZXcgRXhwb3J0WE1MRGF0YSgpOwotCQlkYXRhLnNldEV4cG9ydFR5cGUoRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX0xJQlJBUlkpOwotCQlkYXRhLnNldFhNTEZpbGUoZXhwb3J0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJKG5ldyBFeHBvcnRYTUxTZXJ2aWNlKGRhdGEpKS5kb0V4cG9ydChuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0ltcG9ydENvbmZpZ3VyYXRpb24uamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDSW1wb3J0Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDM2ZTEwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDSW1wb3J0Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuRWxlbWVudERpZmZUcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZE1ncjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBBIHRlc3QgY29tbWFuZCBjbGFzcwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVENJbXBvcnRDb25maWd1cmF0aW9uIGV4dGVuZHMgVGVzdENvbW1hbmRJbXBsIHsJCQkJCi0KLQlwdWJsaWMgdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIucGFyc2UoZWxlbWVudCk7Ci0JCXNldEF0dHJpYnV0ZShBVF9JbXBvcnRGb2xkZXJOYW1lLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9JbXBvcnRGb2xkZXJOYW1lKSk7Ci0JfQkKLQkKLQlwdWJsaWMgVENFeGVSZXBseSBleGVjdXRlKCkgewotCQlmaW5hbCBUZXN0Q29tbWFuZE1nciBvd25lciA9IGdldE93bmVyKCk7Ci0JCVN0cmluZyBpbXBvcnRGb2xkZXJOYW1lID0gZ2V0QXR0cmlidXRlKEFUX0ltcG9ydEZvbGRlck5hbWUpOwotCQkKLQkJRmlsZSBmaWxlID0gb3duZXIuZ2V0SW1wb3J0RmlsZShpbXBvcnRGb2xkZXJOYW1lKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUNvbmZpZ3VyYXRpb25JbXBvcnREYXRhIGRhdGEgPSBuZXcgQ29uZmlndXJhdGlvbkltcG9ydERhdGEoKTsKLQkJZGF0YS5sbERhdGEuc2V0TGliTmFtZShpbXBvcnRGb2xkZXJOYW1lKTsKLQkJZGF0YS5sbERhdGEuc2V0UGFyZW50Rm9sZGVyKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwkKLQotCQlmaW5hbCBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZSBpbXBvcnRTZXJ2aWNlID0gbmV3IENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlKGRhdGEpOwotCQlpbXBvcnRTZXJ2aWNlLmFuYWx5emUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJT2JqZWN0W10gZWxlbWVudHMgPSBnZXRFbGVtZW50cyhpbXBvcnRTZXJ2aWNlLmdldERpZmZUcmVlKCkpOwotCQlkYXRhLmltcG9ydExpc3QuY2xlYXIoKTsKLQkJZm9yICggaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKysgKSB7Ci0JCQlkYXRhLmltcG9ydExpc3QuYWRkKGVsZW1lbnRzW2ldKTsKLQkJfQotCQkKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWltcG9ydFNlcnZpY2UucGVyZm9ybUltcG9ydChuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJTWV0aG9kTGlicmFyeSBsaWIgID0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCQlvd25lci5zZXRDdXJyZW50QmFzZUxpYihsaWIpOwotCQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gc2VsZWN0YWJsZShFbGVtZW50RGlmZlRyZWUgbm9kZSkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAobm9kZS5pc09sZE9ubHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCU1ldGhvZEVsZW1lbnQgYmFzZSA9IG5vZGUuZ2V0QmFzZUVsZW1lbnQoKTsKLQkJaWYgKCAoYmFzZSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIAotCQkJCSYmIFRuZ1V0aWwuaXNSb290Q3V0b21DYXRlZ29yeVBhY2thZ2UoKE1ldGhvZFBhY2thZ2UpYmFzZSkgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZWxlY3ROb2RlcyhFbGVtZW50RGlmZlRyZWUgbm9kZSwgQXJyYXlMaXN0IHNlbGVjdGVkTm9kZXMpIHsKLQkJaWYgKCEgc2VsZWN0YWJsZShub2RlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXNlbGVjdGVkTm9kZXMuYWRkKG5vZGUpOwotCQlMaXN0IGNub2RlcyA9IG5vZGUuZ2V0Q2hpbGRyZW4oKTsKLQkJaW50IHN6ID0gY25vZGVzID09IG51bGwgPyAwIDogY25vZGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCUVsZW1lbnREaWZmVHJlZSBjbm9kZSA9IChFbGVtZW50RGlmZlRyZWUpIGNub2Rlcy5nZXQoaSk7Ci0JCQlzZWxlY3ROb2Rlcyhjbm9kZSwgc2VsZWN0ZWROb2Rlcyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBPYmplY3RbXSBnZXRFbGVtZW50cyhFbGVtZW50RGlmZlRyZWUgcm9vdCkgewotCQlBcnJheUxpc3Qgc2VsZWN0ZWROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc2VsZWN0Tm9kZXMocm9vdCwgc2VsZWN0ZWROb2Rlcyk7Ci0JCXJldHVybiBzZWxlY3RlZE5vZGVzLnRvQXJyYXkoKTsKLQl9Ci0JCi19Ci0KLQotCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0ltcG9ydFBsdWdpbnMuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDSW1wb3J0UGx1Z2lucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTdiODVlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDSW1wb3J0UGx1Z2lucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5QbHVnaW5JbXBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0aW5nU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLlBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDSW1wb3J0UGx1Z2lucyBleHRlbmRzIFRlc3RDb21tYW5kSW1wbCB7CQkJCQkKLQkKLQlwdWJsaWMgdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIucGFyc2UoZWxlbWVudCk7Ci0JCXNldEF0dHJpYnV0ZShBVF9JbXBvcnRGb2xkZXJOYW1lLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9JbXBvcnRGb2xkZXJOYW1lKSk7Ci0JfQkKLQkKLQlwdWJsaWMgVENFeGVSZXBseSBleGVjdXRlKCkgewotCQlTdHJpbmcgaW1wb3J0Rm9sZGVyTmFtZSA9IGdldEF0dHJpYnV0ZShBVF9JbXBvcnRGb2xkZXJOYW1lKTsKLQkJCi0JCUZpbGUgZmlsZSA9IGdldE93bmVyKCkuZ2V0SW1wb3J0RmlsZShpbXBvcnRGb2xkZXJOYW1lKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBUQ0V4ZVJlcGx5SW1wbCgiQ2FuIG5vdCBsb2NhdGUgaW1wb3J0Rm9sZGVyTmFtZTogIiArIGltcG9ydEZvbGRlck5hbWUsIGZhbHNlKTsKLQkJfQotCQkKLQkJUGx1Z2luSW1wb3J0RGF0YSBkYXRhID0gbmV3IFBsdWdpbkltcG9ydERhdGEoKTsKLQkJZGF0YS5sbERhdGEuc2V0TGliTmFtZShpbXBvcnRGb2xkZXJOYW1lKTsKLQkJZGF0YS5sbERhdGEuc2V0UGFyZW50Rm9sZGVyKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwkJCi0JCWZpbmFsIFBsdWdpbkltcG9ydGluZ1NlcnZpY2UgaW1wb3J0U2VydmljZSA9IG5ldyBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlKGRhdGEpOwotCQlpbXBvcnRTZXJ2aWNlLnZhbGlkYXRlKG51bGwpOwotCQlMaXN0IGltcG9ydFBsdWdpbnMgPSBkYXRhLmdldFBsdWdpbnMoKTsKLQkJZm9yIChpbnQgaT0wOyBpIDwgaW1wb3J0UGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJUGx1Z2luSW5mbyBpbmZvID0gKFBsdWdpbkluZm8pIGltcG9ydFBsdWdpbnMuZ2V0KGkpOwotCQkJaW5mby5zZWxlY3RlZCA9IHRydWU7Ci0JCX0KLQkJCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlpbXBvcnRTZXJ2aWNlLnBlcmZvcm1JbXBvcnQobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCU1ldGhvZExpYnJhcnkgbGliICA9IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQkJZ2V0T3duZXIoKS5zZXRDdXJyZW50QmFzZUxpYihsaWIpOwotCQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENJbXBvcnRYbWwuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDSW1wb3J0WG1sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMjUyMjEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENJbXBvcnRYbWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnNlcnZpY2VzLkltcG9ydFhNTFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kTWdyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ0ltcG9ydFhtbCBleHRlbmRzIFRlc3RDb21tYW5kSW1wbCB7CQkJCQkKLQkKLQlwdWJsaWMgdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIucGFyc2UoZWxlbWVudCk7Ci0JCXNldEF0dHJpYnV0ZShBVF9JbXBvcnRGb2xkZXJOYW1lLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9JbXBvcnRGb2xkZXJOYW1lKSk7Ci0JCXNldEF0dHJpYnV0ZShBVF9NZXJnZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfTWVyZ2UpKTsKLQl9CQotCQotCXB1YmxpYyBUQ0V4ZVJlcGx5IGV4ZWN1dGUoKSB7Ci0JCWZpbmFsIFRlc3RDb21tYW5kTWdyIG93bmVyID0gZ2V0T3duZXIoKTsKLQkJU3RyaW5nIGltcG9ydEZvbGRlck5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRfSW1wb3J0Rm9sZGVyTmFtZSk7Ci0JCWJvb2xlYW4gbWVyZ2UgPSBmYWxzZTsKLQkJU3RyaW5nIHN0ciA9IGdldEF0dHJpYnV0ZShBVF9NZXJnZSk7Ci0JCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKSB7Ci0JCQltZXJnZSA9IGZhbHNlOwotCQl9Ci0JCQotCQlGaWxlIGZpbGUwID0gb3duZXIuZ2V0SW1wb3J0RmlsZShpbXBvcnRGb2xkZXJOYW1lKTsKLQkJaWYgKGZpbGUwLmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN0cmluZyBwYXRoID0gZmlsZTAuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIGZpbGUwLmdldE5hbWUoKSArICIueG1sIjsKLQkJCWZpbGUwID0gbmV3IEZpbGUocGF0aCk7Ci0JCX0KLQkJCi0JCWZpbmFsIEZpbGUgZmlsZSA9IGZpbGUwOwotCQlpZiAoZmlsZSA9PSBudWxsIHx8ICEgZmlsZS5leGlzdHMoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0JCQotCQkKLQkJZmluYWwgYm9vbGVhbiBvdmVyd3JpdGUgPSAhIG1lcmdlOwotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSW1wb3J0WE1MU2VydmljZSBpbXBvcnRTZXJ2aWNlID0gbmV3IEltcG9ydFhNTFNlcnZpY2UoKTsKLQkJCQkJaW1wb3J0U2VydmljZS5zZXRPdmVyd3JpdGUob3ZlcndyaXRlKTsKLQkJCQkJaW1wb3J0U2VydmljZS5sb2FkWG1sKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwkJCQkJCi0JCQkJCWltcG9ydFNlcnZpY2UuZG9JbXBvcnQobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCU1ldGhvZExpYnJhcnkgbGliICA9IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQkJb3duZXIuc2V0Q3VycmVudEJhc2VMaWIobGliKTsKLQkJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ05ld01ldGhvZENvbmZpZ3VyYXRpb24uamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDTmV3TWV0aG9kQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDlmMzM3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDTmV3TWV0aG9kQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlBlcnNwZWN0aXZlTGlzdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5VSUFjdGlvbkRpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDTmV3TWV0aG9kQ29uZmlndXJhdGlvbiBleHRlbmRzIFRlc3RDb21tYW5kSW1wbCB7CQkJCQotCQotCXByaXZhdGUgTGlzdCByZWZlcmVuY2VkUGx1Z2luczsKLQkKLQlwdWJsaWMgdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIucGFyc2UoZWxlbWVudCk7Ci0JCXNldEF0dHJpYnV0ZShBVF9OYW1lLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9OYW1lKSk7Ci0JCXNldEF0dHJpYnV0ZShBVF9CcmllZkRlc2NyaXB0aW9uLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9CcmllZkRlc2NyaXB0aW9uKSk7Ci0JfQkKLQkKLQlwdWJsaWMgVENFeGVSZXBseSBleGVjdXRlKCkgewotCQkKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRfTmFtZSk7Ci0JCVN0cmluZyBicmllZkRlc2NyaXB0aW9uID0gZ2V0QXR0cmlidXRlKEFUX0JyaWVmRGVzY3JpcHRpb24pOwotCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCQkKLQkJbmFtZSA9IG5hbWUudHJpbSgpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5jcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKAotCQkJCQkJCQluYW1lLAotCQkJCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQkJCWNvbmZpZy5zZXRCcmllZkRlc2NyaXB0aW9uKGJyaWVmRGVzY3JpcHRpb24pOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFQZXJzcGVjdGl2ZUxpc3RVdGlsLmlzQXV0aG9yaW5nUGVyc3BlY3RpdmUoKSkgewotCQkJVUlBY3Rpb25EaXNwYXRjaGVyLm9wZW5BdXRob3JpbmdQZXJzcGVjdGl2ZSgpOwotCQl9Ci0JCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudFBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCXRyeSB7Ci0JCQlwZXJzaXN0ZXIuc2F2ZShjb25maWcpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQkJCi0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENOZXdNZXRob2RFbGVtZW50LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ05ld01ldGhvZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NkM2UzMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ05ld01ldGhvZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BYnN0cmFjdE92ZXJyaWRlYWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5UZXN0ZXJPdXRwdXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDTmV3TWV0aG9kRWxlbWVudCBleHRlbmRzIFRlc3RDb21tYW5kSW1wbCB7CQkJCQotCQotCXByaXZhdGUgc3RhdGljIE1hcCB0eXBlQ2xhc3NNYXAgPSBuZXcgSGFzaE1hcCgpOwkKLQlzdGF0aWMgewotCQlVbWFGYWN0b3J5IHVmID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIk1ldGhvZFBsdWdpbiIsIHVmLmNyZWF0ZU1ldGhvZFBsdWdpbigpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiTWV0aG9kQ29uZmlndXJhdGlvbiIsIHVmLmNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIkNvbnRlbnRQYWNrYWdlIiwgdWYuY3JlYXRlQ29udGVudFBhY2thZ2UoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIlJvbGUiLCB1Zi5jcmVhdGVSb2xlKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJUYXNrIiwgdWYuY3JlYXRlVGFzaygpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiQXJ0aWZhY3QiLCB1Zi5jcmVhdGVBcnRpZmFjdCgpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiRGVsaXZlcmFibGUiLCB1Zi5jcmVhdGVEZWxpdmVyYWJsZSgpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiT3V0Y29tZSIsIHVmLmNyZWF0ZU91dGNvbWUoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIkNvbmNlcHQiLCB1Zi5jcmVhdGVDb25jZXB0KCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJDaGVja2xpc3QiLCB1Zi5jcmVhdGVDaGVja2xpc3QoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIkV4YW1wbGUiLCB1Zi5jcmVhdGVFeGFtcGxlKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJHdWlkZWxpbmUiLCB1Zi5jcmVhdGVHdWlkZWxpbmUoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIlJlcG9ydCIsIHVmLmNyZWF0ZVJlcG9ydCgpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiVGVtcGxhdGUiLCB1Zi5jcmVhdGVUZW1wbGF0ZSgpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiU3VwcG9ydGluZ01hdGVyaWFsIiwgdWYuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJUb29sTWVudG9yIiwgdWYuY3JlYXRlVG9vbE1lbnRvcigpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiV2hpdGVwYXBlciIsIHVmLmNyZWF0ZVdoaXRlcGFwZXIoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIlByYWN0aWNlIiwgdWYuY3JlYXRlUHJhY3RpY2UoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIlJldXNhYmxlQXNzZXQiLCB1Zi5jcmVhdGVSZXVzYWJsZUFzc2V0KCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJSb2FkbWFwIiwgdWYuY3JlYXRlUm9hZG1hcCgpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiVGVybURlZmluaXRpb24iLCB1Zi5jcmVhdGVUZXJtRGVmaW5pdGlvbigpLmVDbGFzcygpKTsKLQkJCQkKLQkJdHlwZUNsYXNzTWFwLnB1dCgiRGlzY2lwbGluZSIsIHVmLmNyZWF0ZURpc2NpcGxpbmUoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIkRpc2NpcGxpbmVHcm91cGluZyIsIHVmLmNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiRG9tYWluIiwgdWYuY3JlYXRlRG9tYWluKCkuZUNsYXNzKCkpOwkJCi0JCXR5cGVDbGFzc01hcC5wdXQoIldvcmtQcm9kdWN0VHlwZSIsIHVmLmNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpLmVDbGFzcygpKTsJCQotCQl0eXBlQ2xhc3NNYXAucHV0KCJSb2xlU2V0IiwgdWYuY3JlYXRlUm9sZVNldCgpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiUm9sZVNldEdyb3VwaW5nIiwgdWYuY3JlYXRlUm9sZVNldEdyb3VwaW5nKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJUb29sIiwgdWYuY3JlYXRlVG9vbCgpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiQ3VzdG9tQ2F0ZWdvcnkiLCB1Zi5jcmVhdGVDdXN0b21DYXRlZ29yeSgpLmVDbGFzcygpKTsKLQkJCi0JCXR5cGVDbGFzc01hcC5wdXQoIlByb2Nlc3NQYWNrYWdlIiwgdWYuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIkFjdGl2aXR5IiwgdWYuY3JlYXRlQWN0aXZpdHkoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIlBoYXNlIiwgdWYuY3JlYXRlUGhhc2UoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIkl0ZXJhdGlvbiIsIHVmLmNyZWF0ZUl0ZXJhdGlvbigpLmVDbGFzcygpKTsJCQotCQl0eXBlQ2xhc3NNYXAucHV0KCJDYXBhYmlsaXR5UGF0dGVybiIsIHVmLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJEZWxpdmVyeVByb2Nlc3MiLCB1Zi5jcmVhdGVEZWxpdmVyeVByb2Nlc3MoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIlRhc2tEZXNjcmlwdG9yIiwgdWYuY3JlYXRlVGFza0Rlc2NyaXB0b3IoKS5lQ2xhc3MoKSk7Ci0JCQotCX0KLQkKLQlwcml2YXRlIFRlc3RDb21tYW5kSW1wbCBkZWxlZ2F0ZTsKLQkJCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKS5lcXVhbHMoIk1ldGhvZFBsdWdpbiIpKSB7Ci0JCQlkZWxlZ2F0ZSA9IG5ldyBUQ05ld01ldGhvZFBsdWdpbigpOwotCQkJZGVsZWdhdGUuc2V0T3duZXIoZ2V0T3duZXIoKSk7Ci0JCQlkZWxlZ2F0ZS5wYXJzZShlbGVtZW50KTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3VwZXIucGFyc2UoZWxlbWVudCk7Ci0JCXNldEF0dHJpYnV0ZShBVF9UeXBlLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9UeXBlKSk7Ci0JCXNldEF0dHJpYnV0ZShBVF9OYW1lLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9OYW1lKSk7Ci0JCXNldEF0dHJpYnV0ZShBVF9QYXJlbnRQYXRoLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9QYXJlbnRQYXRoKSk7Ci0JfQkKLQkKLQlwdWJsaWMgVENFeGVSZXBseSBleGVjdXRlKCkgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRlbGVnYXRlLmV4ZWN1dGUoKTsKLQkJfQotCi0JCVN0cmluZyB0eXBlID0gZ2V0QXR0cmlidXRlKEFUX1R5cGUpOwotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVF9OYW1lKTsKLQkJU3RyaW5nIHBhcmVudFBhdGggPSBnZXRBdHRyaWJ1dGUoQVRfUGFyZW50UGF0aCk7Ci0JCQotCQlFQ2xhc3MgZUNsYXNzID0gZ2V0RUNsYXNzKHR5cGUpOwotCQlNZXRob2RFbGVtZW50IG1lID0gKE1ldGhvZEVsZW1lbnQpIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZShlQ2xhc3MpOwotCQltZS5zZXROYW1lKG5hbWUpOwotCQltZS5zZXRHdWlkKEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSk7Ci0JCVRDRXhlUmVwbHkgcmVwbHkgPSBhZGRUb0xpYihwYXJlbnRQYXRoLCBtZSk7Ci0JCWlmIChyZXBseSAhPSBudWxsICYmICFyZXBseS5wYXNzaW5nKCkpIHsKLQkJCXJldHVybiByZXBseTsKLQkJfQotCQlyZXR1cm4gZXhlY3V0ZUVkaXQobmFtZSwgcGFyZW50UGF0aCk7Ci0JfQotCi0JcHJpdmF0ZSBUQ0V4ZVJlcGx5IGV4ZWN1dGVFZGl0KFN0cmluZyBuYW1lLCBTdHJpbmcgcGFyZW50UGF0aCkgewkJCi0JCS8vVG8gZG86IGNoZWNrIHRvIHNlZSBpZiBlZGl0IGlzIG5lZWRlZC4gUmV0dXJuIGlmIG5vdCBuZWVkZWQuCi0JCQotCQlUZXN0Q29tbWFuZEltcGwgZWRpdCA9IG5ldyBUQ0VkaXRNZXRob2RFbGVtZW50KCk7Ci0JCWVkaXQuc2V0T3duZXIoZ2V0T3duZXIoKSk7Ci0JCWVkaXQucGFyc2UoZ2V0RWxlbWVudCgpKTsKLQkJU3RyaW5nIHBhdGggPSBwYXJlbnRQYXRoID09IG51bGwgfHwgcGFyZW50UGF0aC5sZW5ndGgoKSA9PSAwID8gbmFtZSAgOiBwYXJlbnRQYXRoICsgIi8iICsgbmFtZTsJCQotCQllZGl0LnJlbW92ZUF0dHJpYnV0ZShBVF9OYW1lKTsKLQkJZWRpdC5yZW1vdmVBdHRyaWJ1dGUoQVRfUGFyZW50UGF0aCk7Ci0JCWVkaXQuc2V0QXR0cmlidXRlKEFUX1BhdGgsIHBhdGgpOwotCQkKLQkJcmV0dXJuIGVkaXQuZXhlY3V0ZSgpOwotCX0KLQotCXByaXZhdGUgVENFeGVSZXBseSBhZGRUb0xpYihTdHJpbmcgcGFyZW50UGF0aCwgTWV0aG9kRWxlbWVudCBtZSkgewotCQlpZiAobWUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlyZXR1cm4gYWRkUHJvY2Vzc0VsZW1lbnRUb0xpYihwYXJlbnRQYXRoLCAoUHJvY2Vzc0VsZW1lbnQpIG1lKTsKLQkJfQotCQlNZXRob2RMaWJyYXJ5IGN1cnJMaWIgPSBnZXRPd25lcigpLmdldEN1cnJlbnRCYXNlTGliKCk7Ci0JCU1ldGhvZEVsZW1lbnQgcGFyZW50TWUgPSBUZXN0ZXJPdXRwdXRVdGlsLmdldE1ldGhvZEVsZW1lbnQoY3VyckxpYiwgcGFyZW50UGF0aCk7Ci0JCWlmIChwYXJlbnRNZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFRDRXhlUmVwbHlJbXBsKCJwYXJlbnRNZSA9PSBudWxsIiwgZmFsc2UpOwotCQl9CQkKLQkJYWRkVG9QYXJlbnQobWUsIHBhcmVudE1lKTsKLQotCQlzYXZlKG1lKTsKLQkJLy9zYXZlKHBhcmVudE1lKTsKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIFRDRXhlUmVwbHkgYWRkUHJvY2Vzc0VsZW1lbnRUb0xpYihTdHJpbmcgcGFyZW50UGF0aCwgUHJvY2Vzc0VsZW1lbnQgcGUpIHsKLQkJTWV0aG9kTGlicmFyeSBjdXJyTGliID0gZ2V0T3duZXIoKS5nZXRDdXJyZW50QmFzZUxpYigpOwotCQlQcm9jZXNzUGFja2FnZSBwYXJlbnRNZSA9IFRlc3Rlck91dHB1dFV0aWwuZ2V0UHJvY2Vzc0VsZW1lbnRQYXJlbnQoY3VyckxpYiwgcGFyZW50UGF0aCk7Ci0JCWlmIChwYXJlbnRNZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFRDRXhlUmVwbHlJbXBsKCJwYXJlbnRNZSA9PSBudWxsIiwgZmFsc2UpOwotCQl9Ci0JCWlmIChwZSBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuIHx8IHBlIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7CQkJCi0KLQkJCVByb2Nlc3NDb21wb25lbnQgcGMgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzQ29tcG9uZW50KCk7Ci0JCQlwYy5zZXRHdWlkKEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSk7Ci0JCQlwYy5zZXROYW1lKHBlLmdldE5hbWUoKSk7Ci0JCQlwYXJlbnRNZS5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKHBjKTsKLQkJCXBjLnNldFByb2Nlc3MoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgcGUpOwkJCQotCQkJYWRkVG9QYXJlbnQocGUsIHBjKTsKLQkJCQotCQl9IGVsc2UgaWYgKHBlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJQnJlYWtkb3duRWxlbWVudCBiZSA9IChCcmVha2Rvd25FbGVtZW50KSBwZTsKLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQlwa2cuc2V0TmFtZShwZS5nZXROYW1lKCkpOwotCQkJcGFyZW50TWUuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChwa2cpOzsKLQkJCWFkZFRvUGFyZW50KHBlLCBwa2cpOwotCQkJCi0JCQlBY3Rpdml0eSBwYXJlbnRBY3QgPSBwYXJlbnRNZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQgPyAKLQkJCQkJKChQcm9jZXNzQ29tcG9uZW50KSBwYXJlbnRNZSkuZ2V0UHJvY2VzcygpIDoKLQkJCQkJKEFjdGl2aXR5KSBwYXJlbnRNZS5nZXRQcm9jZXNzRWxlbWVudHMoKS5nZXQoMCk7Ci0JCQlwYXJlbnRBY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoYmUpOwotCQl9Ci0KLQkJc2F2ZShwYXJlbnRNZSk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCQotCi0JcHJpdmF0ZSB2b2lkIGFkZFRvUGFyZW50KE1ldGhvZEVsZW1lbnQgbWUsIE1ldGhvZEVsZW1lbnQgcGFyZW50TWUpIHsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRDb250YWlubWVudEZlYXR1cmUocGFyZW50TWUsIG1lKTsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcbldhcm5pbmc6IGNvbnRhaW5tZW50IGZlYXR1cmUgbm90IHJlZ2lzdGVyZWQhIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oICAiV2FybmluZzogcGFyZW50TWU6ICIgKyBwYXJlbnRNZSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oICAiV2FybmluZzogICAgICAgbWU6ICIgKyBtZSk7Ci0JCX0gZWxzZSBpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJRUxpc3QgZWxpc3QgPSBBYnN0cmFjdE92ZXJyaWRlYWJsZUNvbW1hbmQuZ2V0T3duZXJMaXN0KHBhcmVudE1lLCBmZWF0dXJlKTsgCi0JCQlMaXN0IGMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljLmFkZChtZSk7CQkKLQkJCWVsaXN0LmFkZEFsbChjKTsKLQkJfSBlbHNlIHsKLQkJCXBhcmVudE1lLmVTZXQoZmVhdHVyZSwgbWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBFQ2xhc3MgZ2V0RUNsYXNzKFN0cmluZyB0eXBlKSB7Ci0JCUVDbGFzcyByZXQgPSAoRUNsYXNzKSB0eXBlQ2xhc3NNYXAuZ2V0KHR5cGUpOwotCQlpZiAocmV0ID09IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5XYXJuaW5nOiBcIiIgKyB0eXBlICsgCi0JCQkJCSJcIiBpcyBub3QgcmVnaXN0ZXJlZCBpbiBcInR5cGVDbGFzc01hcFwiISIpOwotCQl9Ci0JCXJldHVybiByZXQ7CQkKLQl9Ci0JCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q29udGFpbm1lbnRGZWF0dXJlKEVPYmplY3Qgb3duZXIsIEVPYmplY3QgZW9iaikgewotCQlVbWFQYWNrYWdlIHVwID0gVW1hUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCQotCQlpZiAob3duZXIgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQlpZiAoZW9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiB1cC5nZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbnMoKTsKLQkJCX0KLQkJCWlmIChlb2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCXJldHVybiB1cC5nZXRNZXRob2RMaWJyYXJ5X1ByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQkJfQotCQl9CQkKLQkJCi0JCWlmIChvd25lciBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQlpZiAoZW9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIHVwLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAob3duZXIgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlpZiAoZW9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgewotCQkJCXJldHVybiB1cC5nZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKTsKLQkJCX0KLQkJfQotCQkJCQotCQlpZiAob3duZXIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJaWYgKGVvYmogaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCkgewotCQkJCXJldHVybiB1cC5nZXRQcm9jZXNzUGFja2FnZV9Qcm9jZXNzRWxlbWVudHMoKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKG93bmVyIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJaWYgKGVvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSB8fAotCQkJCWVvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZQkpIHsKLQkJCQlyZXR1cm4gdXAuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzYXZlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlmaW5hbCBJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldFBlcnNpc3RlckZvcihlbGVtZW50LmVSZXNvdXJjZSgpKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQlmaW5hbCBSZXNvdXJjZSByZXMgPSBlbGVtZW50LmVSZXNvdXJjZSgpOwotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzKTsKLQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENOZXdNZXRob2RQbHVnaW4uamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDTmV3TWV0aG9kUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZmE3OTYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENOZXdNZXRob2RQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuTGlicmFyeVRlc3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTW9kZWxTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDTmV3TWV0aG9kUGx1Z2luIGV4dGVuZHMgVGVzdENvbW1hbmRJbXBsIHsJCQkJCi0JCi0JcHJpdmF0ZSBMaXN0IHJlZmVyZW5jZWRQbHVnaW5zOwotCQotCXB1YmxpYyB2b2lkIHBhcnNlKEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5wYXJzZShlbGVtZW50KTsKLQkJc2V0QXR0cmlidXRlKEFUX05hbWUsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX05hbWUpKTsKLQkJc2V0QXR0cmlidXRlKEFUX0JyaWVmRGVzY3JpcHRpb24sIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0JyaWVmRGVzY3JpcHRpb24pKTsKLQkJc2V0QXR0cmlidXRlKEFUX0F1dGhvcnMsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0F1dGhvcnMpKTsKLQkJcGFyc2VDaGlsZHJlbihlbGVtZW50KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2VDaGlsZHJlbihFbGVtZW50IGVsZW1lbnQpIHsKLQkJTm9kZUxpc3QgY25vZGVzID0gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShWVF9iYXNlcyk7Ci0JCWlmIChjbm9kZXMgPT0gbnVsbCB8fCBjbm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUVsZW1lbnQgY0VsZW1lbnQgPSAoRWxlbWVudCkgY25vZGVzLml0ZW0oMCk7Ci0JCWNub2RlcyA9IGNFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFZUX1ZhbHVlKTsJCi0JCWlmIChjbm9kZXMgPT0gbnVsbCB8fCBjbm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXJlZmVyZW5jZWRQbHVnaW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpPTA7IGk8Y25vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUVsZW1lbnQgdkVsZW0gPSAoRWxlbWVudCkgY25vZGVzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgdmFsdWUgPSB2RWxlbS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQlyZWZlcmVuY2VkUGx1Z2lucy5hZGQodmFsdWUpOwotCQl9CQkKLQl9Ci0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJCi0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUX05hbWUpOwotCQlTdHJpbmcgYnJpZWZEZXNjcmlwdGlvbiA9IGdldEF0dHJpYnV0ZShBVF9CcmllZkRlc2NyaXB0aW9uKTsKLQkJU3RyaW5nIGF1dGhvcnMgPSBnZXRBdHRyaWJ1dGUoQVRfQXV0aG9ycyk7Ci0JCQotCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIG5ldyBUQ0V4ZVJlcGx5SW1wbCgiRW1wdHkgcGx1Z2luIG5hbWUiLCBmYWxzZSk7Ci0JCX0KLQkJU3RyaW5nIG1zZyA9IExpYnJhcnlVdGlsLmNoZWNrUGx1Z2luTmFtZShudWxsLCBuYW1lKTsKLQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFRDRXhlUmVwbHlJbXBsKG1zZywgZmFsc2UpOwotCQl9Ci0JCQkJCi0JCXRyeSB7Ci0JCQlNZXRob2RMaWJyYXJ5IGN1cnJMaWIgPSBnZXRPd25lcigpLmdldEN1cnJlbnRCYXNlTGliKCk7Ci0JCQlMaXN0IHBsdWdpbnMgPSBjdXJyTGliLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJCQotCQkJLy8gQ3JlYXRlIHRoZSBtZXRob2QgcGx1Zy1pbiBhbmQgYWRkIGl0IHRvIHRoZSBjdXJyZW50IG1ldGhvZAotCQkJLy8gbGlicmFyeS4KLQkJCWZpbmFsIE1ldGhvZFBsdWdpbiBuZXdQbHVnaW4gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RQbHVnaW4oKTsKLQkJCW5ld1BsdWdpbi5zZXROYW1lKFN0clV0aWwubWFrZVZhbGlkRmlsZU5hbWUobmFtZSkpOwotCQkJbmV3UGx1Z2luLnNldEJyaWVmRGVzY3JpcHRpb24oYnJpZWZEZXNjcmlwdGlvbik7Ci0JCQluZXdQbHVnaW4uc2V0QXV0aG9ycyhhdXRob3JzKTsKLQkJCQotCQkJaW50IHN6ID0gcmVmZXJlbmNlZFBsdWdpbnMgPT0gbnVsbCA/IDAgOiByZWZlcmVuY2VkUGx1Z2lucy5zaXplKCk7Ci0JCQlpZiAoc3ogPiAwICYmICEgcGx1Z2lucy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKGludCBpPTA7IGk8c3o7IGkrKykgewotCQkJCQlTdHJpbmcgcmVmZXJlZE5hbWUgPSAoU3RyaW5nKSByZWZlcmVuY2VkUGx1Z2lucy5nZXQoaSk7Ci0JCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBMaWJyYXJ5VGVzdFNlcnZpY2UuZ2V0RWxlbWVudAotCQkJCQkJKHBsdWdpbnMsIHJlZmVyZWROYW1lKTsKLQkJCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJCQluZXdQbHVnaW4uZ2V0QmFzZXMoKS5hZGQocGx1Z2luKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQltYW5hZ2VyLmFkZE1ldGhvZFBsdWdpbihNb2RlbFN0b3JhZ2UuaW5pdGlhbGl6ZShuZXdQbHVnaW4pKTsKLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ09wZW5MaWJyYXJ5LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ09wZW5MaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNzU2NjMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENPcGVuTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDT3BlbkxpYnJhcnkgZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkKLQkKLQlwdWJsaWMgdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIucGFyc2UoZWxlbWVudCk7Ci0JCXNldEF0dHJpYnV0ZShBVF9MaWJGb2xkZXJOYW1lLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9MaWJGb2xkZXJOYW1lKSk7Ci0JfQkKLQkKLQlwdWJsaWMgVENFeGVSZXBseSBleGVjdXRlKCkgewotCQlTdHJpbmcgbGliRm9sZGVyTmFtZSA9IGdldEF0dHJpYnV0ZShBVF9MaWJGb2xkZXJOYW1lKTsJCi0JCWdldE93bmVyKCkubG9hZEJhc2VMaWIobGliRm9sZGVyTmFtZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ091dHB1dE1ldGhvZEVsZW1lbnQuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDT3V0cHV0TWV0aG9kRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjMyMTc2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDT3V0cHV0TWV0aG9kRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuVGVzdGVyT3V0cHV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRNZ3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBBIHRlc3QgY29tbWFuZCBjbGFzcwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVENPdXRwdXRNZXRob2RFbGVtZW50IGV4dGVuZHMgVGVzdENvbW1hbmRJbXBsIHsKLQotCS8vTWF5IHdhbnQgdG8gdXNlIGZlYXR1cmUgY2xhc3NlcyBkaXJlY3RseSBpbnN0ZWFkIG9mIG5hbWVzIGxhdGVyCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZXhjbHVkZWRGZWF0dXJlcyA9IHsKLQkJLy8iZ3VpZCIsCi0JCS8vImdVSURzIgotCX07Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU2V0IGV4Y2x1ZGVkRmVhdHVyZVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCi0Jc3RhdGljIHsKLQkJZm9yIChpbnQgaT0wOyBpPGV4Y2x1ZGVkRmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCWV4Y2x1ZGVkRmVhdHVyZVNldC5hZGQoZXhjbHVkZWRGZWF0dXJlc1tpXSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBsb2NhbERlYnVnID0gZmFsc2U7Ci0JU3RyaW5nIHBhdGg7Ci0JcHJpdmF0ZSBEb2N1bWVudCBkb2M7Ci0JcHJpdmF0ZSBNYXAgc3lzdGVtUGtnTWFwID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIEVsZW1lbnQgcm9vdDsKLQlwcml2YXRlIGJvb2xlYW4gcmVjdXJzaXZlID0gdHJ1ZTsKLQlwcml2YXRlIFN0cmluZyB0YWdOYW1lOwotCQotCXB1YmxpYyB2b2lkIHBhcnNlKEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5wYXJzZShlbGVtZW50KTsKLQkJZG9jID0gZ2V0T3duZXIoKS5nZXRPdXRwdXREb2N1bWVudCgpOwotCQkvL1N0cmluZyB0YWdOYW1lID0gdGFnTmFtZSgpOyBuZWVkIHRvIGZpeCB0YWdOYW1lKCkgbWVodG9kCi0JCXRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCi0JCXNldEF0dHJpYnV0ZShBVF9QYXRoLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9QYXRoKSk7Ci0JCXNldEF0dHJpYnV0ZShBVF9SZWN1cnNpdmUsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX1JlY3Vyc2l2ZSkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfT3V0cHV0RmlsZU5hbWUsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX091dHB1dEZpbGVOYW1lKSk7CQotCX0JCQotCQotCXB1YmxpYyBUQ0V4ZVJlcGx5IGV4ZWN1dGUoKSB7CQotCQlwYXRoID0gZ2V0QXR0cmlidXRlKEFUX1BhdGgpOwotCQlyZWN1cnNpdmUgPSBwYXJzZUJvb2xlYW4oQVRfUmVjdXJzaXZlLCByZWN1cnNpdmUpOwotCQkKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRPd25lcigpLmdldEN1cnJlbnRCYXNlTGliKCk7Ci0JCXJvb3QgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQkJCi0JCWlmICh0YWdOYW1lLmVxdWFscyhUZXN0Q29tbWFuZE1nci5UQ091dHB1dExpYnJhcnkpKSB7Ci0JCQlvdXRwdXRNZXRob2RFbGVtZW50KGxpYiwgcm9vdCk7Ci0JCX0gZWxzZSBpZiAodGFnTmFtZS5lcXVhbHMoVGVzdENvbW1hbmRNZ3IuVENPdXRwdXRQbHVnaW4pKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVGVzdGVyT3V0cHV0VXRpbC5nZXRNZXRob2RQbHVnaW4obGliLCBwYXRoKTsKLQkJCW91dHB1dE1ldGhvZEVsZW1lbnQocGx1Z2luLCByb290KTsKLQkJfSBlbHNlIGlmICh0YWdOYW1lLmVxdWFscyhUZXN0Q29tbWFuZE1nci5UQ091dHB1dENvbmZpZ3VyYXRpb24pKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IFRlc3Rlck91dHB1dFV0aWwuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihsaWIsIHBhdGgpOwotCQkJb3V0cHV0TWV0aG9kRWxlbWVudChjb25maWcsIHJvb3QpOwotCQl9IGVsc2UgaWYgKHRhZ05hbWUuZXF1YWxzKFRlc3RDb21tYW5kTWdyLlRDT3V0cHV0TWV0aG9kRWxlbWVudCkpIHsKLQkJCU1ldGhvZEVsZW1lbnQgbWUgPSBUZXN0ZXJPdXRwdXRVdGlsLmdldE1ldGhvZEVsZW1lbnQobGliLCBwYXRoKTsKLQkJCW91dHB1dE1ldGhvZEVsZW1lbnQobWUsIHJvb3QpOwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlvdXRwdXRUb0ZpbGUoKTsJCQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG91dHB1dFRvRmlsZSgpIHsKLQkJU3RyaW5nIG91dHB1dEZpbGVOYW1lID0gZ2V0QXR0cmlidXRlKEFUX091dHB1dEZpbGVOYW1lKTsKLQkJaWYgKG91dHB1dEZpbGVOYW1lID09IG51bGwgfHwgb3V0cHV0RmlsZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBvdXRwdXRQYXRoID0gZ2V0T3duZXIoKS5nZXRPdXRwdXRQYXRoKCk7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG91dHB1dFBhdGgpLmdldFBhcmVudEZpbGUoKTsKLQkJb3V0cHV0UGF0aCA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIG91dHB1dEZpbGVOYW1lOwotCQkKLQkJRG9jdW1lbnQgb3V0cHV0RG9jdW1lbnQgPSBnZXRPd25lcigpLmdldE91dHB1dERvY3VtZW50KCk7Ci0JCXRyeSB7Ci0JCQlYTUxVdGlsLnNhdmVEb2N1bWVudChvdXRwdXREb2N1bWVudCwgb3V0cHV0UGF0aCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG91dHB1dE1ldGhvZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBFbGVtZW50IHBhcmVudE5vZGUpIHsJCi0JCUVsZW1lbnQgbm9kZSA9IGRvYy5jcmVhdGVFbGVtZW50KGdldFR5cGUoZWxlbWVudCkpOwkJCi0JCXBhcmVudE5vZGUuYXBwZW5kQ2hpbGQobm9kZSk7Ci0JCWlmIChwYXJlbnROb2RlID09IHJvb3QpIHsKLQkJCW5vZGUuc2V0QXR0cmlidXRlKCJwYXRoIiwgcGF0aCk7Ci0JCX0KLQkJb3V0cHV0RmVhdHVyZXMoZWxlbWVudCwgbm9kZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBvdXRwdXRSZWZlcmVuY2UoRVJlZmVyZW5jZSBmZWF0dXJlLCBNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVsZW1lbnQgcGFyZW50Tm9kZSkgewotCQlFbGVtZW50IG5vZGUgPSBkb2MuY3JlYXRlRWxlbWVudChmZWF0dXJlLmdldE5hbWUoKSk7Ci0JCXBhcmVudE5vZGUuYXBwZW5kQ2hpbGQobm9kZSk7Ci0JCW5vZGUuc2V0QXR0cmlidXRlKCJwYXRoIiwgVGVzdGVyT3V0cHV0VXRpbC5nZXRPdXRwdXRQYXRoKGVsZW1lbnQpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG91dHB1dEZlYXR1cmVzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRWxlbWVudCBub2RlKSB7Ci0JCUxpc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7CQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7Ci0JCQlFUHJvcGVydHkgZXAgPSAoRVByb3BlcnR5KSBwcm9wZXJ0aWVzLmdldChpKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZXAuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7Ci0JCQlpZiAoZXhjbHVkZWRGZWF0dXJlU2V0LmNvbnRhaW5zKGZlYXR1cmUuZ2V0TmFtZSgpKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgewotCQkJCWlmICghIHJlY3Vyc2l2ZSAmJiBub2RlLmdldFBhcmVudE5vZGUoKSAhPSByb290KSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlFUmVmZXJlbmNlIHJlZkZlYXR1cmUgPSAoRVJlZmVyZW5jZSkgZmVhdHVyZTsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJCW91dHB1dExpc3RGZWF0dXJlKHJlZkZlYXR1cmUsIChMaXN0KSB2YWx1ZSwgbm9kZSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJaWYgKHJlZkZlYXR1cmUuaXNDb250YWlubWVudCgpKSB7Ci0JCQkJCQlvdXRwdXRNZXRob2RFbGVtZW50KChNZXRob2RFbGVtZW50KSB2YWx1ZSwgbm9kZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlvdXRwdXRSZWZlcmVuY2UocmVmRmVhdHVyZSwgKE1ldGhvZEVsZW1lbnQpIHZhbHVlLCBub2RlKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAobG9jYWxEZWJ1Zyl7Ci0JCQkJCWdldE93bmVyKCkudHJhY2UoIldhcm5pbmc+IHZhbHVlIGlzIG9mIG5vbi1vdXRwdXQgdHlwZTogIiArIHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSB7Ci0JCQkJbm9kZS5zZXRBdHRyaWJ1dGUoZmVhdHVyZS5nZXROYW1lKCksIHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCQotCQl9CQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBvdXRwdXRMaXN0RmVhdHVyZShFUmVmZXJlbmNlIGZlYXR1cmUsIExpc3QgbGlzdCwgRWxlbWVudCBwYXJlbnROb2RlKSB7Ci0JCWludCBzeiA9IGxpc3QgPT0gbnVsbCA/IDAgOiBsaXN0LnNpemUoKTsKLQkJaWYgKHN6ID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoISAobGlzdC5nZXQoMCkgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSkgewotCQkJZ2V0T3duZXIoKS50cmFjZSgiV2FybmluZz4gbGlzdC5nZXQoMCkgaXMgb2YgdHlwZTogIiArIGxpc3QuZ2V0KDApLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQlib29sZWFuIGNvbnRhaW5tZW50ID0gZmVhdHVyZS5pc0NvbnRhaW5tZW50KCk7Ci0JCWZvciAoaW50IGk9MDsgaTxzejsgaSsrKSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgbGlzdC5nZXQoaSk7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoY29udGFpbm1lbnQpIHsKLQkJCQlvdXRwdXRNZXRob2RFbGVtZW50KGVsZW1lbnQsIHBhcmVudE5vZGUpOwotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXRSZWZlcmVuY2UoZmVhdHVyZSwgZWxlbWVudCwgcGFyZW50Tm9kZSk7Ci0JCQl9Ci0JCX0KLQl9CQotCQotCXByaXZhdGUgU3RyaW5nIGdldFR5cGUoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgY2xzTmFtZSA9IG9iai5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJaW50IGl4ID0gY2xzTmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMTsKLQkJU3RyaW5nIHR5cGUgPSBjbHNOYW1lLnN1YnN0cmluZyhpeCk7Ci0JCWl4ID0gdHlwZS5sYXN0SW5kZXhPZigiSW1wbCIpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBpeCArIDQgPT0gIHR5cGUubGVuZ3RoKCkpIHsKLQkJCXR5cGUgPSB0eXBlLnN1YnN0cmluZygwLCBpeCk7Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQkKLQkKLQkKLQkKLX0KLQotCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL0Fic3RyYWN0TGlicmFyeVRlc3RDYXNlLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL0Fic3RyYWN0TGlicmFyeVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NTg4ZmMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9BYnN0cmFjdExpYnJhcnlUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgSlVuaXQgdGVzdCBjYXNlcyB0aGF0IG5lZWRzIHRvIG9wZW4gYSBtZXRob2QgbGlicmFyeQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RMaWJyYXJ5VGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kTGlicmFyeSBsaWJyYXJ5OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVsZXRlTGlicmFyeU9uRXhpdCA9IGZhbHNlOwotCi0JcHVibGljIEFic3RyYWN0TGlicmFyeVRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQkKLQkJb3BlbkxpYnJhcnkoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGRlbGV0ZUxpYnJhcnlPbkV4aXQpIHsKLQkJCUxpYnJhcnlUZXN0SGVscGVyLmNsb3NlTGlicmFyeSgpOwotCQl9IGVsc2UgewotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jbG9zZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCX0KLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kTGlicmFyeSBvcGVuTGlicmFyeSgpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBsaWJQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJlcGYubGlicmFyeSIpOwotCQlpZiAobGliUGF0aCAhPSBudWxsKSB7Ci0JCQlsaWJyYXJ5ID0gWE1JTGlicmFyeVV0aWwub3Blbk1ldGhvZExpYnJhcnkobGliUGF0aCk7Ci0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldEN1cnJlbnRNZXRob2RMaWJyYXJ5KGxpYnJhcnkpOwotCQl9IGVsc2UgewotCQkJbGlicmFyeSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRlc3RNZXRob2RMaWJyYXJ5KCk7Ci0JCQlkZWxldGVMaWJyYXJ5T25FeGl0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gbGlicmFyeTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kTGlicmFyeSByZW9wZW5MaWJyYXJ5KCkgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVvcGVuQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvRGVwZW5kZW5jeUNoZWNrZXJUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL0RlcGVuZGVuY3lDaGVja2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWExNzlmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvRGVwZW5kZW5jeUNoZWNrZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlcGVuZGVuY3lDaGVja2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIERlcGVuZGVuY3lDaGVja2VyVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyI2NoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLmxhbmcuT2JqZWN0KX0uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KCkgewotCQkvKgotCQlwbHVnaW4xIDwtIHBsdWdpbjIgPC0gcGx1Z2luMyAKLQkJCQkJfAotCQkgICAgICAgICAgICB2Ci0JCSAgICAgICAgICAgcGx1Z2luNCAtPiBwbHVnaW41CQkgICAgICAgICAgIAotCQkqLwotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZExpYnJhcnkoKTsKLQkJCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4xID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0JCXBsdWdpbjEuc2V0TmFtZSgicGx1Z2luMSIpOwotCQlsaWIuZ2V0TWV0aG9kUGx1Z2lucygpLmFkZChwbHVnaW4xKTsKLQkJCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4yID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0JCXBsdWdpbjIuc2V0TmFtZSgicGx1Z2luMiIpOwotCQlwbHVnaW4yLmdldEJhc2VzKCkuYWRkKHBsdWdpbjEpOwotCQlsaWIuZ2V0TWV0aG9kUGx1Z2lucygpLmFkZChwbHVnaW4yKTsKLQotCQlNZXRob2RQbHVnaW4gcGx1Z2luMyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFBsdWdpbigpOwotCQlwbHVnaW4zLnNldE5hbWUoInBsdWdpbjMiKTsKLQkJcGx1Z2luMy5nZXRCYXNlcygpLmFkZChwbHVnaW4yKTsKLQkJbGliLmdldE1ldGhvZFBsdWdpbnMoKS5hZGQocGx1Z2luMyk7Ci0JCQotCQlNZXRob2RQbHVnaW4gcGx1Z2luNCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFBsdWdpbigpOwotCQlwbHVnaW40LnNldE5hbWUoInBsdWdpbjQiKTsKLQkJbGliLmdldE1ldGhvZFBsdWdpbnMoKS5hZGQocGx1Z2luNCk7Ci0JCQotCQlNZXRob2RQbHVnaW4gcGx1Z2luNSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFBsdWdpbigpOwotCQlwbHVnaW41LnNldE5hbWUoInBsdWdpbjUiKTsKLQkJbGliLmdldE1ldGhvZFBsdWdpbnMoKS5hZGQocGx1Z2luNSk7Ci0KLQkJcGx1Z2luMi5nZXRCYXNlcygpLmFkZChwbHVnaW40KTsKLQkJcGx1Z2luNC5nZXRCYXNlcygpLmFkZChwbHVnaW41KTsKLQotCi0JCWFzc2VydEZhbHNlKERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KHBsdWdpbjEsIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BMVUdJTl9fQkFTRVMsIHBsdWdpbjMpLmlzT0soKSk7Ci0JCWFzc2VydEZhbHNlKERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KHBsdWdpbjUsIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BMVUdJTl9fQkFTRVMsIHBsdWdpbjMpLmlzT0soKSk7Ci0JCWFzc2VydFRydWUoRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3kocGx1Z2luNSwgVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOX19CQVNFUywgcGx1Z2luMSkuaXNPSygpKTsKLQkJCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9MaWJyYXJ5U2VydmljZVRlc3QuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvTGlicmFyeVNlcnZpY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYjkyMWMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9MaWJyYXJ5U2VydmljZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTW9kZWxTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3IgdGhlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5IHBsdWctaW4uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVNlcnZpY2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJQlJBUllfWE1JID0gImxpYnJhcnkueG1pIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fWE1JID0gInBsdWdpbi54bWkiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTElCUkFSWV8xID0gImxpYnJhcnlfMSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BMVUdJTl8xID0gInBsdWdpbl8xIjsgLy8kTk9OLU5MUy0xJAkKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExpYnJhcnlTZXJ2aWNlVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB0aGUgY3JlYXRpb24gb2YgYSBtZXRob2QgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdGVzdENyZWF0ZU1ldGhvZExpYnJhcnkoKSB7Ci0JCXRyeSB7Ci0JCQlMaWJyYXJ5VGVzdEhlbHBlcgotCQkJCQkuY3JlYXRlVGVzdE1ldGhvZExpYnJhcnkoTGlicmFyeVRlc3RIZWxwZXIuVEVNUF9URVNUX0RJUgotCQkJCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyBURVNUX0xJQlJBUllfMSk7Ci0JCQlGaWxlIGxpYkZpbGUgPSBuZXcgRmlsZShMaWJyYXJ5VGVzdEhlbHBlci5URU1QX1RFU1RfRElSCi0JCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyBURVNUX0xJQlJBUllfMSArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCSsgTElCUkFSWV9YTUkpOwotCQkJYXNzZXJ0VHJ1ZShsaWJGaWxlLmV4aXN0cygpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRlc3RzIHRoZSBjcmVhdGlvbiBvZiBhIG1ldGhvZCBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0Q3JlYXRlTWV0aG9kUGx1Z2luKCkgewotCQl0cnkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFBsdWdpbigpOwotCQkJcGx1Z2luLnNldE5hbWUoVEVTVF9QTFVHSU5fMSk7Ci0KLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5hZGRNZXRob2RQbHVnaW4oTW9kZWxTdG9yYWdlLmluaXRpYWxpemUocGx1Z2luKSk7Ci0JCQl9Ci0KLQkJCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKExpYnJhcnlUZXN0SGVscGVyLlRFTVBfVEVTVF9ESVIKLQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIFRFU1RfTElCUkFSWV8xICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJKyBURVNUX1BMVUdJTl8xICsgRmlsZS5zZXBhcmF0b3IgKyBQTFVHSU5fWE1JKTsKLQkJCWFzc2VydFRydWUocGx1Z2luRmlsZS5leGlzdHMoKSk7Ci0KLQkJCUxpYnJhcnlUZXN0SGVscGVyLmNsb3NlTGlicmFyeSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9MaWJyYXJ5VGVzdEhlbHBlci5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9MaWJyYXJ5VGVzdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTI5NDU1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvTGlicmFyeVRlc3RIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5DYWxlbmRhcjsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gbWFuaXB1bGF0ZSBhIHRlc3QgbWV0aG9kIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VGVzdEhlbHBlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QX1RFU1RfRElSID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSArIEZpbGUuc2VwYXJhdG9yIC8vJE5PTi1OTFMtMiQKLQkJCSsgIkVQRiIgKyBGaWxlLnNlcGFyYXRvciArICJ0ZXN0IiArIEZpbGUuc2VwYXJhdG9yOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCUkFSWV9YTUkgPSAibGlicmFyeS54bWkiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNSV9UWVBFID0gInhtaSI7IC8vJE5PTi1OTFMtMSQJCQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB0ZXN0IG1ldGhvZCBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kTGlicmFyeSBjcmVhdGVUZXN0TWV0aG9kTGlicmFyeSgpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlTdHJpbmcgcGF0aCA9IFRFTVBfVEVTVF9ESVIKLQkJCQkrIExvbmcudG9IZXhTdHJpbmcoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lSW5NaWxsaXMoKSkKLQkJCQkrIEZpbGUuc2VwYXJhdG9yOwotCQkKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5jbG9zZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCU1hcCBwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotCQlwYXJhbXMucHV0KCJsaWJyYXJ5LnBhdGgiLCBwYXRoKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5jcmVhdGVNZXRob2RMaWJyYXJ5KExJQlJBUllfWE1JLCBYTUlfVFlQRSwgcGFyYW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdGVzdCBtZXRob2QgbGlicmFyeSBvbiBhIGdpdmVuIHBhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RMaWJyYXJ5IGNyZWF0ZVRlc3RNZXRob2RMaWJyYXJ5KFN0cmluZyBwYXRoKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJcGF0aCA9IFRFTVBfVEVTVF9ESVIKLQkJCQkJKyBMb25nCi0JCQkJCQkJLnRvSGV4U3RyaW5nKENhbGVuZGFyLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCS5nZXRUaW1lSW5NaWxsaXMoKSkgKyBGaWxlLnNlcGFyYXRvcjsKLQkJfQotCQkKLQkJLy8gSWYgdGhlIGxpYnJhcnkgcGF0aCBhbHJlYWR5IGV4aXN0cywgZGVsZXRlIGl0LgotCQlGaWxlIGxpYnJhcnlQYXRoID0gbmV3IEZpbGUocGF0aCk7Ci0JCWlmIChsaWJyYXJ5UGF0aC5leGlzdHMoKSkgewotCQkJRmlsZVV0aWwuZGVsZXRlQWxsRmlsZXMobGlicmFyeVBhdGguZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJbGlicmFyeVBhdGguZGVsZXRlKCk7CQkJCi0JCX0KLQkJCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuY2xvc2VDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlNYXAgcGFyYW1zID0gbmV3IEhhc2hNYXAoKTsKLQkJcGFyYW1zLnB1dCgibGlicmFyeS5wYXRoIiwgcGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuY3JlYXRlTWV0aG9kTGlicmFyeShMSUJSQVJZX1hNSSwgWE1JX1RZUEUsIHBhcmFtcyk7Ci0JfQotCi0JLyoqCi0JICogQ2xvc2VzIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IGFuZCBkZWxldGUgdGhlIGxpYnJhcnkgcmVzb3VyY2UgZmlsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlTGlicmFyeSgpIHsKLQkJdHJ5IHsKLQkJCUZpbGUgcGF0aCA9IG5ldyBGaWxlKG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlCi0JCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKSk7Ci0JCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5jbG9zZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkJCS8vIERlbGV0ZSB0aGUgbGlicmFyeSBmb2xkZXIgYW5kIGZpbGVzLgotCQkJRmlsZVV0aWwuZGVsZXRlQWxsRmlsZXMocGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQlwYXRoLmRlbGV0ZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVMaWJyYXJ5KCkgewotCQl0cnkgewotCQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuc2F2ZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCX0gY2F0Y2ggKExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1ldGhvZENvbmZpZ3VyYXRpb24gY3JlYXRlQ29uZmlndXJhdGlvbihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlQ29uZmlndXJhdGlvbihuYW1lLCBFY29yZVV0aWwKLQkJCQkuZ2VuZXJhdGVVVUlEKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGx1Z2luIGNyZWF0ZU1ldGhvZFBsdWdpbihTdHJpbmcgbmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlLklOU1RBTkNFLmNyZWF0ZVBsdWdpbihuYW1lLCBFY29yZVV0aWwKLQkJCQkJLmdlbmVyYXRlVVVJRCgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRGlzY2lwbGluZSBjcmVhdGVEaXNjaXBsaW5lKE1ldGhvZFBsdWdpbiBwbHVnaW4sIFN0cmluZyBuYW1lKSB7Ci0JCURpc2NpcGxpbmUgZWxlbWVudCA9IExpYnJhcnlTZXJ2aWNlLklOU1RBTkNFCi0JCQkJLmNyZWF0ZVBsdWdpblNlcnZpY2UocGx1Z2luKS5jcmVhdGVEaXNjaXBsaW5lKCk7Ci0JCWVsZW1lbnQuc2V0TmFtZShuYW1lKTsKLQkJZWxlbWVudC5zZXRHdWlkKEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSk7Ci0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSb2xlU2V0IGNyZWF0ZVJvbGVTZXQoTWV0aG9kUGx1Z2luIHBsdWdpbiwgU3RyaW5nIG5hbWUpIHsKLQkJUm9sZVNldCBlbGVtZW50ID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUGx1Z2luU2VydmljZShwbHVnaW4pCi0JCQkJLmNyZWF0ZVJvbGVTZXQoKTsKLQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCQllbGVtZW50LnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERvbWFpbiBjcmVhdGVEb21haW4oTWV0aG9kUGx1Z2luIHBsdWdpbiwgU3RyaW5nIG5hbWUpIHsKLQkJRG9tYWluIGVsZW1lbnQgPSBMaWJyYXJ5U2VydmljZS5JTlNUQU5DRS5jcmVhdGVQbHVnaW5TZXJ2aWNlKHBsdWdpbikKLQkJCQkuY3JlYXRlRG9tYWluKCk7Ci0JCWVsZW1lbnQuc2V0TmFtZShuYW1lKTsKLQkJZWxlbWVudC5zZXRHdWlkKEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSk7Ci0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBXb3JrUHJvZHVjdFR5cGUgY3JlYXRlV29ya1Byb2R1Y3RUeXBlKE1ldGhvZFBsdWdpbiBwbHVnaW4sCi0JCQlTdHJpbmcgbmFtZSkgewotCQlXb3JrUHJvZHVjdFR5cGUgZWxlbWVudCA9IExpYnJhcnlTZXJ2aWNlLklOU1RBTkNFLmNyZWF0ZVBsdWdpblNlcnZpY2UoCi0JCQkJcGx1Z2luKS5jcmVhdGVXb3JrUHJvZHVjdFR5cGUoKTsKLQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCQllbGVtZW50LnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEN1c3RvbUNhdGVnb3J5IGNyZWF0ZUN1c3RvbUNhdGVnb3J5KE1ldGhvZFBsdWdpbiBwbHVnaW4sCi0JCQlDdXN0b21DYXRlZ29yeSBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCUN1c3RvbUNhdGVnb3J5IGVsZW1lbnQgPSBMaWJyYXJ5U2VydmljZS5JTlNUQU5DRS5jcmVhdGVQbHVnaW5TZXJ2aWNlKAotCQkJCXBsdWdpbikuY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkocGFyZW50KTsKLQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCQllbGVtZW50LnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbnRlbnRQYWNrYWdlIGNyZWF0ZUNvbnRlbnRQYWNrYWdlKFN0cmluZyBuYW1lKSB7Ci0KLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnRQYWNrYWdlKG51bGwsIG5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29udGVudFBhY2thZ2UgY3JlYXRlQ29udGVudFBhY2thZ2UoTWV0aG9kUGx1Z2luIHBsdWdpbiwKLQkJCVN0cmluZyBuYW1lKSB7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJcGx1Z2luID0gY3JlYXRlTWV0aG9kUGx1Z2luKCJ0ZXN0IHBsdWdpbiIpOwotCQl9Ci0JCUNvbnRlbnRQYWNrYWdlIGVsZW1lbnQgPSBMaWJyYXJ5U2VydmljZS5JTlNUQU5DRS5jcmVhdGVQbHVnaW5TZXJ2aWNlKAotCQkJCXBsdWdpbikuY3JlYXRlQ29udGVudFBhY2thZ2UobnVsbCk7Ci0JCWVsZW1lbnQuc2V0TmFtZShuYW1lKTsKLQkJZWxlbWVudC5zZXRHdWlkKEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSk7Ci0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUYXNrIGNyZWF0ZVRhc2soQ29udGVudFBhY2thZ2UgcGtnLCBTdHJpbmcgbmFtZSkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHBrZyk7Ci0JCVRhc2sgZWxlbWVudCA9IExpYnJhcnlTZXJ2aWNlLklOU1RBTkNFLmNyZWF0ZVBsdWdpblNlcnZpY2UocGx1Z2luKQotCQkJCS5jcmVhdGVUYXNrKHBrZyk7Ci0JCWVsZW1lbnQuc2V0TmFtZShuYW1lKTsKLQkJZWxlbWVudC5zZXRHdWlkKEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSk7Ci0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSb2xlIGNyZWF0ZVJvbGUoQ29udGVudFBhY2thZ2UgcGtnLCBTdHJpbmcgbmFtZSkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHBrZyk7Ci0JCVJvbGUgZWxlbWVudCA9IExpYnJhcnlTZXJ2aWNlLklOU1RBTkNFLmNyZWF0ZVBsdWdpblNlcnZpY2UocGx1Z2luKQotCQkJCS5jcmVhdGVSb2xlKHBrZyk7Ci0JCWVsZW1lbnQuc2V0TmFtZShuYW1lKTsKLQkJZWxlbWVudC5zZXRHdWlkKEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSk7Ci0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBcnRpZmFjdCBjcmVhdGVBcnRpZmFjdChDb250ZW50UGFja2FnZSBwa2csIFN0cmluZyBuYW1lKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4ocGtnKTsKLQkJQXJ0aWZhY3QgZWxlbWVudCA9IExpYnJhcnlTZXJ2aWNlLklOU1RBTkNFLmNyZWF0ZVBsdWdpblNlcnZpY2UocGx1Z2luKQotCQkJCS5jcmVhdGVBcnRpZmFjdChwa2cpOwotCQllbGVtZW50LnNldE5hbWUobmFtZSk7Ci0JCWVsZW1lbnQuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgR3VpZGFuY2UgY3JlYXRlR3VpZGFuY2UoQ29udGVudFBhY2thZ2UgcGtnLCBTdHJpbmcgbmFtZSkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHBrZyk7Ci0JCUd1aWRhbmNlIGVsZW1lbnQgPSBMaWJyYXJ5U2VydmljZS5JTlNUQU5DRS5jcmVhdGVQbHVnaW5TZXJ2aWNlKHBsdWdpbikKLQkJCQkuY3JlYXRlR3VpZGFuY2UocGtnKTsKLQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCQllbGVtZW50LnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENoZWNrbGlzdCBjcmVhdGVDaGVja2xpc3QoQ29udGVudFBhY2thZ2UgcGtnLCBTdHJpbmcgbmFtZSkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHBrZyk7Ci0JCUNoZWNrbGlzdCBlbGVtZW50ID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUGx1Z2luU2VydmljZShwbHVnaW4pCi0JCQkJLmNyZWF0ZUNoZWNrbGlzdChwa2cpOwotCQllbGVtZW50LnNldE5hbWUobmFtZSk7Ci0JCWVsZW1lbnQuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3VwcG9ydGluZ01hdGVyaWFsIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbCgKLQkJCUNvbnRlbnRQYWNrYWdlIHBrZywgU3RyaW5nIG5hbWUpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbihwa2cpOwotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgZWxlbWVudCA9IExpYnJhcnlTZXJ2aWNlLklOU1RBTkNFCi0JCQkJLmNyZWF0ZVBsdWdpblNlcnZpY2UocGx1Z2luKS5jcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwocGtnKTsKLQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCQllbGVtZW50LnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNlY3Rpb24gY3JlYXRlU2VjdGlvbihDb250ZW50RGVzY3JpcHRpb24gZGVzYywgU3RyaW5nIG5hbWUsCi0JCQlTdHJpbmcgY29udGVudCkgewotCQlTZWN0aW9uIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZWN0aW9uKCk7Ci0JCWUuc2V0U2VjdGlvbk5hbWUobmFtZSk7Ci0JCWUuc2V0U2VjdGlvbkRlc2NyaXB0aW9uKGNvbnRlbnQpOwotCQllLnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQotCQlkZXNjLmdldFNlY3Rpb25zKCkuYWRkKGUpOwotCi0JCXJldHVybiBlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ2FwYWJpbGl0eVBhdHRlcm4gY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luLCBTdHJpbmcgbmFtZSwgTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29uZmlnKSB7Ci0JCUNhcGFiaWxpdHlQYXR0ZXJuIGNwID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUGx1Z2luU2VydmljZSgKLQkJCQlwbHVnaW4pLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKGRlZmF1bHRDb25maWcpOwotCQljcC5zZXROYW1lKG5hbWUpOwotCQkoKFByb2Nlc3NDb21wb25lbnQpIGNwLmVDb250YWluZXIoKSkuc2V0TmFtZShuYW1lKTsKLQotCQlzYXZlTGlicmFyeSgpOwotCi0JCXJldHVybiBjcDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFjdGl2aXR5IGNyZWF0ZUFjdGl2aXR5KE1ldGhvZFBsdWdpbiBwbHVnaW4sCi0JCQlBY3Rpdml0eSBzdXBlckFjdGl2aXR5LCBTdHJpbmcgbmFtZSwgVGFza1tdIHRhc2tzKSB7Ci0JCVBsdWdpblNlcnZpY2Ugc3ZjID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUGx1Z2luU2VydmljZShwbHVnaW4pOwotCQlBY3Rpdml0eSBhY3QgPSBzdmMuY3JlYXRlQWN0aXZpdHkoc3VwZXJBY3Rpdml0eSk7Ci0JCWFjdC5zZXROYW1lKG5hbWUpOwotCQlzYXZlTGlicmFyeSgpOwotCi0JCWlmICh0YXNrcyAhPSBudWxsICYmIHRhc2tzLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFza3MubGVuZ3RoOyBpKyspIHsKLQkJCQlzdmMuYWRkVGFza1RvQWN0aXZpdHkoYWN0LCB0YXNrc1tpXSk7Ci0JCQl9Ci0JCQlzYXZlTGlicmFyeSgpOwotCQl9Ci0KLQkJcmV0dXJuIGFjdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RXh0ZW5kcyhWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCwKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlKSB7Ci0JCWVsZW1lbnQuc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChiYXNlKTsKLQkJZWxlbWVudC5zZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb250cmlidXRlcyhWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCwKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlKSB7Ci0JCWVsZW1lbnQuc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChiYXNlKTsKLQkJZWxlbWVudC5zZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UmVwbGFjZXMoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQsCi0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSkgewotCQllbGVtZW50LnNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoYmFzZSk7Ci0JCWVsZW1lbnQuc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9MaWJyYXJ5VGVzdHMuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvTGlicmFyeVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYjc3NWEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9MaWJyYXJ5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5UZXN0Q29tbWFuZEZpbGVUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5leHBvcnRpbXBvcnQuQ29uZmlnRXhwb3J0SW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLmV4cG9ydGltcG9ydC5QbHVnaW5FeHBvcnRJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuZXhwb3J0aW1wb3J0LlhtbEV4cG9ydEltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy52YXJpYWJpbGl0eS5BY3Rpdml0eVZhcmlhYmlsaXR5VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy52YXJpYWJpbGl0eS5BdHRyaWJ1dGVGZWF0dXJlVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy52YXJpYWJpbGl0eS5Db3B5cmlnaHRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5LkluY29taW5nMDFGZWF0dXJlVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy52YXJpYWJpbGl0eS5JbmNvbWluZzBuRmVhdHVyZVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMudmFyaWFiaWxpdHkuT3V0Z29pbmcwMUZlYXR1cmVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5Lk91dGdvaW5nMG5GZWF0dXJlVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy52YXJpYWJpbGl0eS5SZWdyZXNzaW9uVGVzdDsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3IgdGhlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5IGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoTGlicmFyeVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQkvLyRKVW5pdC1CRUdJTiQKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExpYnJhcnlTZXJ2aWNlVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPdXRnb2luZzAxRmVhdHVyZVRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3V0Z29pbmcwbkZlYXR1cmVUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEluY29taW5nMDFGZWF0dXJlVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJbmNvbWluZzBuRmVhdHVyZVRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQXR0cmlidXRlRmVhdHVyZVRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29weXJpZ2h0VGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWdyZXNzaW9uVGVzdC5jbGFzcyk7CQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQWN0aXZpdHlWYXJpYWJpbGl0eVRlc3QuY2xhc3MpOwkKLQkJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUZXN0Q29tbWFuZEZpbGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQbHVnaW5FeHBvcnRJbXBvcnQuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29uZmlnRXhwb3J0SW1wb3J0LmNsYXNzKTsJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYbWxFeHBvcnRJbXBvcnQuY2xhc3MpOwotCQkKLQkJLy8kSlVuaXQtRU5EJAotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL1Rlc3RzUGx1Z2luLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL1Rlc3RzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNmFkMjMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9UZXN0c1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotKiBUaGUgVGVzdHMgcGx1Zy1pbiBjbGFzcy4KLSogCi0qIEBhdXRob3IJV2VpcGluZyBMdQotKiBAc2luY2UJMS4wCi0qLwotcHVibGljIGNsYXNzIFRlc3RzUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gVGVzdHNQbHVnaW4uY2xhc3MuZ2V0TmFtZSgpOwotCQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBUZXN0c1BsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgVGVzdHNQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5jb3JlLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmNvcmUucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVzdHNQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L0NvbmZpZ0V4cG9ydEltcG9ydC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvQ29uZmlnRXhwb3J0SW1wb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZjIyOTkuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvQ29uZmlnRXhwb3J0SW1wb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5leHBvcnRpbXBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5FeHBvcnRJbXBvcnRUZXN0SW1wbDsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3IgcGx1Z2luIGV4cG9ydC9pbXBvcnQKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ0V4cG9ydEltcG9ydCBleHRlbmRzIEV4cG9ydEltcG9ydFRlc3RJbXBsIHsKLQotCXB1YmxpYyBDb25maWdFeHBvcnRJbXBvcnQoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQkKLQkJCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsJCQotCQllbmRTZXRVcCgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCWVuZFRlYXJEb3duKCk7Ci0JfQkKLQkKLQlwdWJsaWMgaW50IG51bVRlc3RDYXNlcygpIHsKLQkJcmV0dXJuIDE7Ci0JfQkJCQotCQkJCi0JcHVibGljIHZvaWQgdGVzdDAwMDFfMSgpIHsKLQkJZ2V0U2VydmljZSgpLnRyYWNlKCJCZWdpbiAtPiB0ZXN0MDAwMV8xIik7Ci0JCW5ldyBDb25maWdFeHBvcnRJbXBvcnRUZXN0MDAwMSh0aGlzKS5leGVjdXRlKCJ0ZXN0MDAwMV8xIik7Ci0JCWdldFNlcnZpY2UoKS50cmFjZSgiRW5kICAgLT4gdGVzdDAwMDFfMSIpOwotCX0JCQkKLQkJCQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L0NvbmZpZ0V4cG9ydEltcG9ydFRlc3QwMDAxLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9Db25maWdFeHBvcnRJbXBvcnRUZXN0MDAwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTNhY2Q4Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L0NvbmZpZ0V4cG9ydEltcG9ydFRlc3QwMDAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5leHBvcnRpbXBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuTGlicmFyeUp1bml0VGVzdFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRlc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLkV4cG9ydEltcG9ydFRlc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0NvbXBhcmVUb0xpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDQ29weUxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDRXhwb3J0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENJbXBvcnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ09wZW5MaWJyYXJ5OwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciBwbHVnaW4gZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlnRXhwb3J0SW1wb3J0VGVzdDAwMDEgZXh0ZW5kcyBFeHBvcnRJbXBvcnRUZXN0TWV0aG9kQmFzZSB7Ci0JCi0JcHVibGljIENvbmZpZ0V4cG9ydEltcG9ydFRlc3QwMDAxKEV4cG9ydEltcG9ydFRlc3RJbXBsIG93bmVyKSB7Ci0JCXN1cGVyKG93bmVyKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZShTdHJpbmcgdGVzdE5hbWUpIHsKLQkJTGlicmFyeUp1bml0VGVzdFNlcnZpY2Ugc2VydmljZSA9IGdldE93bmVyKCkuZ2V0U2VydmljZSgpOwotCQkKLQkJVGVzdENvbW1hbmQgdGNzW10gPSBuZXcgVGVzdENvbW1hbmRbNl07Ci0JCQotCQl0Y3NbMF0gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDQ29weUxpYnJhcnkuY2xhc3MpOwotCQl0Y3NbMF0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0xpYkZvbGRlck5hbWUsICJQYXJpcyIpOwotCQkKLQkJdGNzWzFdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ09wZW5MaWJyYXJ5LmNsYXNzKTsKLQkJdGNzWzFdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9MaWJGb2xkZXJOYW1lLCAiUGFyaXMiKTsKLQkJCi0JCXRjc1syXSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENFeHBvcnRDb25maWd1cmF0aW9uLmNsYXNzKTsKLQkJdGNzWzJdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9FeHBvcnRGb2xkZXJOYW1lLCAiRXhwb3J0MDAwMSIpOwotCQl0Y3NbMl0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX1NlbGVjdGVkQ29uZmlnTmFtZSwgIkNvbmZpZyBBIik7Ci0KLQkJdGNzWzNdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ09wZW5MaWJyYXJ5LmNsYXNzKTsKLQkJdGNzWzNdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9MaWJGb2xkZXJOYW1lLCAiQmFzZV8xIik7Ci0JCQotCQl0Y3NbNF0gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDSW1wb3J0Q29uZmlndXJhdGlvbi5jbGFzcyk7Ci0JCXRjc1s0XS5zZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfSW1wb3J0Rm9sZGVyTmFtZSwgIkV4cG9ydDAwMDEiKTsKLQkJCi0JCXRjc1s1XSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENDb21wYXJlVG9MaWJyYXJ5LmNsYXNzKTsKLQkJdGNzWzVdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9Hb2xkZW5MaWJGb2xkZXJOYW1lLCAiUGFyaXMiKTsKLQkJCi0JCWJvb2xlYW4gcGFzc2luZyA9IHRydWU7Ci0JCWZvciAoaW50IGk9MDsgaTx0Y3MubGVuZ3RoOyBpKyspIHsKLQkJCVRDRXhlUmVwbHkgcmVwbHkgPSB0Y3NbaV0uZXhlY3V0ZSgpOwotCQkJaWYgKHJlcGx5ICE9IG51bGwgJiYgISByZXBseS5wYXNzaW5nKCkpIHsKLQkJCQlwYXNzaW5nID0gZmFsc2U7Ci0JCQl9CQkJCQotCQl9Ci0JCWdldE93bmVyKCkuYXNzZXJ0VHJ1ZShwYXNzaW5nKTsKLQkJCi0JCXJldHVybiBwYXNzaW5nOwotCQkJCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvRXhwb3J0SW1wb3J0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9FeHBvcnRJbXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ1ZDJkYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9FeHBvcnRJbXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLmV4cG9ydGltcG9ydDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuUWFUZXN0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuVGVzdEZvbGRlclNldHVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLlRlc3RzUGx1Z2luOwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciBleHBvcnQvaW1wb3J0Ci0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRJbXBvcnQgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlIHRlc3RSb290U291cmNlID0gbmV3IEZpbGUgKFRlc3RzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbnN0YWxsUGF0aCgpICsgIAotCQkiTGlicmFyaWVzIiArIEZpbGUuc2VwYXJhdG9yICsgIjEuMC4wIiArIEZpbGUuc2VwYXJhdG9yICsgIkV4cG9ydEltcG9ydCIpOwotCQotCXByaXZhdGUgU3RyaW5nIHRlc3RSb290UGFyZW50ID0gIFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIikgKyBGaWxlLnNlcGFyYXRvciAKLQkJCQkJCQkJCSsgIkVQRiIgKyBGaWxlLnNlcGFyYXRvciArICJ0ZXN0IiArIEZpbGUuc2VwYXJhdG9yOwotCi0JCi0JCi0JcHJpdmF0ZSBRYVRlc3RTZXJ2aWNlIHNlcnZpY2UgPSBuZXcJUWFUZXN0U2VydmljZShuZXcgVGVzdEZvbGRlclNldHVwKCksIHRydWUpOwotCQotCXB1YmxpYyBFeHBvcnRJbXBvcnQoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYXNlKCkgewkJCi0JCWZpbmFsIFN0cmluZyBmaWxlTmFtZSA9ICIxc3RUZXN0LnRjIjsKLQkJRmlsZUZpbHRlciBmaWx0ZXIgPSBuZXcgRmlsZUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIHBhdGhuYW1lKSB7Ci0JCQkJcmV0dXJuIHBhdGhuYW1lLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGZpbGVOYW1lKTsKLQkJCX07CQkJCi0JCX07Ci0JCQotCQlGaWxlIGZpbGVzW10gPSB0ZXN0Um9vdFNvdXJjZS5saXN0RmlsZXMoZmlsdGVyKTsKLQkJaWYgKGZpbGVzID09IG51bGwgfHwgZmlsZXMubGVuZ3RoID09IDApIHsKLQkJCWFzc2VydFRydWUoZmlsZU5hbWUgKyAiIGNhbm5vdCBiZSBmb3VuZCEiLCBmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlGaWxlIHRlc3RSb290V29ya2luZyA9IG5ldyBGaWxlKHRlc3RSb290UGFyZW50ICsgIkV4cG9ydEltcG9ydE9uZUNhc2UiKTsKLQkJU3RyaW5nIGVycm9yTXNnID0gc2VydmljZS5ydW5DYXNlKHRlc3RSb290U291cmNlLCB0ZXN0Um9vdFdvcmtpbmcsIGZpbGVzWzBdKTsKLQkJYXNzZXJ0VHJ1ZShlcnJvck1zZywgZXJyb3JNc2cubGVuZ3RoKCkgPT0gMCk7Ci0JfQkKLQkJCQotCXB1YmxpYyB2b2lkIHRlc3RMb2NhbENhc2VzKCkgewotCQlGaWxlIHRlc3RSb290V29ya2luZyA9IG5ldyBGaWxlKHRlc3RSb290UGFyZW50ICsgIkV4cG9ydEltcG9ydCIpOwkJCi0JCVN0cmluZyBlcnJvck1zZyA9IHNlcnZpY2UucnVuTG9jYWxDYXNlcyh0ZXN0Um9vdFNvdXJjZSwgdGVzdFJvb3RXb3JraW5nKTsKLQkJYXNzZXJ0VHJ1ZShlcnJvck1zZywgZXJyb3JNc2cubGVuZ3RoKCkgPT0gMCk7Ci0JfQkKLQkJCQkKLQkJCQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L0V4cG9ydEltcG9ydFRlc3RNZXRob2RCYXNlLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9FeHBvcnRJbXBvcnRUZXN0TWV0aG9kQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjc3NWM3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L0V4cG9ydEltcG9ydFRlc3RNZXRob2RCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5leHBvcnRpbXBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuTGlicmFyeVRlc3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLkV4cG9ydEltcG9ydFRlc3RJbXBsOwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciBwbHVnaW4gZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXhwb3J0SW1wb3J0VGVzdE1ldGhvZEJhc2UgewotCXByaXZhdGUgRXhwb3J0SW1wb3J0VGVzdEltcGwgb3duZXI7Ci0JCi0JcHVibGljIEV4cG9ydEltcG9ydFRlc3RNZXRob2RCYXNlKEV4cG9ydEltcG9ydFRlc3RJbXBsIG93bmVyKSB7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIEV4cG9ydEltcG9ydFRlc3RJbXBsIGdldE93bmVyKCkgewotCQlyZXR1cm4gb3duZXI7Ci0JfQkKLQkKLQlhYnN0cmFjdCBwdWJsaWMgYm9vbGVhbiBleGVjdXRlKFN0cmluZyB0ZXN0TmFtZSk7Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9QbHVnaW5FeHBvcnRJbXBvcnQuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1BsdWdpbkV4cG9ydEltcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWI0ZjJjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1BsdWdpbkV4cG9ydEltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuZXhwb3J0aW1wb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuRXhwb3J0SW1wb3J0VGVzdEltcGw7Ci0KLS8qKgotICogSlVuaXQgdGVzdHMgZm9yIHBsdWdpbiBleHBvcnQvaW1wb3J0Ci0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5FeHBvcnRJbXBvcnQgZXh0ZW5kcyBFeHBvcnRJbXBvcnRUZXN0SW1wbCB7Ci0KLQlwdWJsaWMgUGx1Z2luRXhwb3J0SW1wb3J0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0JCi0JCQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7CQkKLQkJZW5kU2V0VXAoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQllbmRUZWFyRG93bigpOwotCX0JCi0JCi0JcHVibGljIGludCBudW1UZXN0Q2FzZXMoKSB7Ci0JCXJldHVybiAxOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdDAwMDFfMSgpIHsKLQkJZ2V0U2VydmljZSgpLnRyYWNlKCJCZWdpbiAtPiB0ZXN0MDAwMV8xIik7Ci0JCW5ldyBQbHVnaW5FeHBvcnRJbXBvcnRUZXN0MDAwMSh0aGlzKS5leGVjdXRlKCJ0ZXN0MDAwMV8xIik7Ci0JCWdldFNlcnZpY2UoKS50cmFjZSgiRW5kICAgLT4gdGVzdDAwMDFfMSIpOwotCX0JCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9QbHVnaW5FeHBvcnRJbXBvcnRUZXN0MDAwMS5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvUGx1Z2luRXhwb3J0SW1wb3J0VGVzdDAwMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgwMmVkNS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9QbHVnaW5FeHBvcnRJbXBvcnRUZXN0MDAwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuZXhwb3J0aW1wb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLkxpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UZXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5FeHBvcnRJbXBvcnRUZXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENDb21wYXJlVG9MaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0NvcHlMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0V4cG9ydFBsdWdpbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDSW1wb3J0UGx1Z2luczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENPcGVuTGlicmFyeTsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3IgcGx1Z2luIGV4cG9ydC9pbXBvcnQKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkV4cG9ydEltcG9ydFRlc3QwMDAxIGV4dGVuZHMgRXhwb3J0SW1wb3J0VGVzdE1ldGhvZEJhc2UgewotCQotCXB1YmxpYyBQbHVnaW5FeHBvcnRJbXBvcnRUZXN0MDAwMShFeHBvcnRJbXBvcnRUZXN0SW1wbCBvd25lcikgewotCQlzdXBlcihvd25lcik7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoU3RyaW5nIHRlc3ROYW1lKSB7CQkKLQkJTGlicmFyeUp1bml0VGVzdFNlcnZpY2Ugc2VydmljZSA9IGdldE93bmVyKCkuZ2V0U2VydmljZSgpOwotCQkKLQkJVGVzdENvbW1hbmQgdGNzW10gPSBuZXcgVGVzdENvbW1hbmRbNl07Ci0JCQotCQl0Y3NbMF0gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDQ29weUxpYnJhcnkuY2xhc3MpOwotCQl0Y3NbMF0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0xpYkZvbGRlck5hbWUsICJQYXJpcyIpOwotCQkKLQkJdGNzWzFdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ09wZW5MaWJyYXJ5LmNsYXNzKTsKLQkJdGNzWzFdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9MaWJGb2xkZXJOYW1lLCAiUGFyaXMiKTsKLQkJCi0JCXRjc1syXSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENFeHBvcnRQbHVnaW5zLmNsYXNzKTsKLQkJdGNzWzJdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9FeHBvcnRGb2xkZXJOYW1lLCAiRXhwb3J0MDAwMSIpOwotCQkKLQkJdGNzWzNdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ09wZW5MaWJyYXJ5LmNsYXNzKTsKLQkJdGNzWzNdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9MaWJGb2xkZXJOYW1lLCAiQmFzZV8xIik7Ci0JCQotCQl0Y3NbNF0gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDSW1wb3J0UGx1Z2lucy5jbGFzcyk7Ci0JCXRjc1s0XS5zZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfSW1wb3J0Rm9sZGVyTmFtZSwgIkV4cG9ydDAwMDEiKTsKLQkJCi0JCXRjc1s1XSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENDb21wYXJlVG9MaWJyYXJ5LmNsYXNzKTsKLQkJdGNzWzVdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9Hb2xkZW5MaWJGb2xkZXJOYW1lLCAiUGFyaXMiKTsKLQkJCi0JCWJvb2xlYW4gcGFzc2luZyA9IHRydWU7Ci0JCWZvciAoaW50IGk9MDsgaTx0Y3MubGVuZ3RoOyBpKyspIHsKLQkJCVRDRXhlUmVwbHkgcmVwbHkgPSB0Y3NbaV0uZXhlY3V0ZSgpOwotCQkJaWYgKHJlcGx5ICE9IG51bGwgJiYgISByZXBseS5wYXNzaW5nKCkpIHsKLQkJCQlwYXNzaW5nID0gZmFsc2U7Ci0JCQl9CQkJCQotCQl9Ci0JCWdldE93bmVyKCkuYXNzZXJ0VHJ1ZShwYXNzaW5nKTsKLQkJCi0JCXJldHVybiBwYXNzaW5nOwotCX0JCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9TdGFuZEFsb25lVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvU3RhbmRBbG9uZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1YTBmNS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9TdGFuZEFsb25lVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuZXhwb3J0aW1wb3J0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuTGlicmFyeVRlc3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kTWdyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3IgcGx1Z2luIGV4cG9ydC9pbXBvcnQKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFN0YW5kQWxvbmVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBMaWJyYXJ5VGVzdFNlcnZpY2Ugc2VydmljZSA9IExpYnJhcnlUZXN0U2VydmljZS5nZXRJbnN0YW5jZSgpOwotCQotCXB1YmxpYyBTdGFuZEFsb25lVGVzdCgpIHsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3QwMDAxKCkgewotCi0gCQkvL0xpYnJhcnlEaWZmQW5hbHl6b3Iuc2V0VHJpbSh0cnVlKTsKLQkJLy9MaWJyYXJ5RGlmZkFuYWx5em9yLnNldFVzZU5hbWVBczJuZElkKHRydWUpOwotCQkvL0xpYnJhcnlEaWZmQW5hbHl6b3IuYWRkRXhjbHVkZWRGZWF0dXJlKCJ2ZXJzaW9uIik7Ci0JCS8vTGlicmFyeURpZmZBbmFseXpvci5hZGRFeGNsdWRlZEZlYXR1cmUoIm5hbWUiKTsKLQkJLy9MaWJyYXJ5RGlmZkFuYWx5em9yLmFkZEV4Y2x1ZGVkRmVhdHVyZSgicHJlc2VudGF0aW9uTmFtZSIpOwotCQkvL0xpYnJhcnlEaWZmQW5hbHl6b3IuYWRkRXhjbHVkZWRGZWF0dXJlKCJtYWluRGVzY3JpcHRpb24iKTsKLQkJLy9MaWJyYXJ5RGlmZkFuYWx5em9yLmFkZEV4Y2x1ZGVkRmVhdHVyZSgic2VjdGlvbkRlc2NyaXB0aW9uIik7CQotCQkKLQkJVGVzdENvbW1hbmRNZ3IgdGNNZ3IgPSBuZXcgVGVzdENvbW1hbmRNZ3IodHJ1ZSk7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKCJDOlxcTGlic1xcNzJcXCIpOwotCQl0Y01nci5vcGVuQ3VyclRlc3REaXIoZmlsZSk7Ci0JCQotCQlTdHJpbmcgbGliMVBhdGggPSAiQzpcXExpYnNcXDcyXFxPcGVuVXA3MiI7Ci0JCVN0cmluZyBsaWIyUGF0aCA9ICJDOlxcTGlic1xcNzJcXGEiOwkJCi0JCU1ldGhvZExpYnJhcnkgbGliMSA9IHNlcnZpY2UubG9hZExpYnJhcnkobGliMVBhdGgpOwotCQlNZXRob2RMaWJyYXJ5IGxpYjIgPSBzZXJ2aWNlLmxvYWRMaWJyYXJ5KGxpYjJQYXRoKTsKLQkJQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UuZml4SW1wb3J0TGlicmFyeVN5c3RlbVBhY2thZ2VHVUlEcyhsaWIxLCBsaWIyKTsKLQkJdGNNZ3IudHJhY2UoIkNvbXBhcmluZyBsaWJyYXJpZXMgLT4gQmVnaW4iKTsKLQkJdGNNZ3IudHJhY2UoImxpYjE6ICIgKyBsaWIxUGF0aCk7Ci0JCXRjTWdyLnRyYWNlKCJsaWIyOiAiICsgbGliMlBhdGgpOwotCi0JCWJvb2xlYW4gcmVzdWx0ID0gdGNNZ3IuY29tcGFyZUxpYnMobGliMSwgbGliMiwgMCwgMCwgdHJ1ZSk7Ci0JCWFzc2VydFRydWUocmVzdWx0KTsKLQkJdGNNZ3IudHJhY2UoIkNvbXBhcmluZyBsaWJyYXJpZXMgPC0gRW5kICIpOwotCX0JCQotCQkJCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9YbWxFeHBvcnRJbXBvcnQuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1htbEV4cG9ydEltcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmJkOTRmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1htbEV4cG9ydEltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuZXhwb3J0aW1wb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuRXhwb3J0SW1wb3J0VGVzdEltcGw7Ci0KLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3IgcGx1Z2luIGV4cG9ydC9pbXBvcnQKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFhtbEV4cG9ydEltcG9ydCBleHRlbmRzIEV4cG9ydEltcG9ydFRlc3RJbXBsIHsKLQotCXB1YmxpYyBYbWxFeHBvcnRJbXBvcnQoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQkKLQkJCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsJCQotCQllbmRTZXRVcCgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCWVuZFRlYXJEb3duKCk7Ci0JfQkKLQkKLQlwdWJsaWMgaW50IG51bVRlc3RDYXNlcygpIHsKLQkJcmV0dXJuIDE7Ci0JfQkJCi0JCi0JcHVibGljIHZvaWQgdGVzdDAwMDFfMSgpIHsKLQkJZ2V0U2VydmljZSgpLnRyYWNlKCJCZWdpbiAtPiB0ZXN0MDAwMV8xIik7Ci0JCW5ldyBYbWxFeHBvcnRJbXBvcnRUZXN0MDAwMSh0aGlzKS5leGVjdXRlKCJ0ZXN0MDAwMV8xIik7Ci0JCWdldFNlcnZpY2UoKS50cmFjZSgiRW5kICAgLT4gdGVzdDAwMDFfMSIpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1htbEV4cG9ydEltcG9ydFRlc3QwMDAxLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9YbWxFeHBvcnRJbXBvcnRUZXN0MDAwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTQxNTI3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1htbEV4cG9ydEltcG9ydFRlc3QwMDAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5leHBvcnRpbXBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuTGlicmFyeUp1bml0VGVzdFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRlc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLkV4cG9ydEltcG9ydFRlc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0NvbXBhcmVUb0xpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDQ29weUxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDRXhwb3J0WG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0ltcG9ydFhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENPcGVuTGlicmFyeTsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3IgcGx1Z2luIGV4cG9ydC9pbXBvcnQKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFhtbEV4cG9ydEltcG9ydFRlc3QwMDAxIGV4dGVuZHMgRXhwb3J0SW1wb3J0VGVzdE1ldGhvZEJhc2UgewotCQotCXB1YmxpYyBYbWxFeHBvcnRJbXBvcnRUZXN0MDAwMShFeHBvcnRJbXBvcnRUZXN0SW1wbCBvd25lcikgewotCQlzdXBlcihvd25lcik7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCUxpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlIHNlcnZpY2UgPSBnZXRPd25lcigpLmdldFNlcnZpY2UoKTsKLQkJCi0JCVRlc3RDb21tYW5kIHRjc1tdID0gbmV3IFRlc3RDb21tYW5kWzZdOwotCQkKLQkJdGNzWzBdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ0NvcHlMaWJyYXJ5LmNsYXNzKTsKLQkJdGNzWzBdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9MaWJGb2xkZXJOYW1lLCAiUGFyaXMiKTsKLQkJCi0JCXRjc1sxXSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENPcGVuTGlicmFyeS5jbGFzcyk7Ci0JCXRjc1sxXS5zZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfTGliRm9sZGVyTmFtZSwgIlBhcmlzIik7Ci0JCQotCQl0Y3NbMl0gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDRXhwb3J0WG1sLmNsYXNzKTsKLQkJdGNzWzJdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9FeHBvcnRGb2xkZXJOYW1lLCAiRXhwb3J0MDAwMSIpOwotCQkKLQkJdGNzWzNdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ09wZW5MaWJyYXJ5LmNsYXNzKTsKLQkJdGNzWzNdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9MaWJGb2xkZXJOYW1lLCAiQmFzZV8xIik7Ci0JCQotCQl0Y3NbNF0gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDSW1wb3J0WG1sLmNsYXNzKTsKLQkJdGNzWzRdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9JbXBvcnRGb2xkZXJOYW1lLCAiRXhwb3J0MDAwMSIpOwotCQkKLQkJdGNzWzVdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ0NvbXBhcmVUb0xpYnJhcnkuY2xhc3MpOwotCQl0Y3NbNV0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0dvbGRlbkxpYkZvbGRlck5hbWUsICJQYXJpcyIpOwkJCi0JCXRjc1s1XS5zZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfRGlmZkNvdW50LCAiMjgiKTsKLQkJdGNzWzVdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9FbGVtZW50Q291bnQsICIzNzAiKTsKLQkJdGNzWzVdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9Vc2VOYW1lQXNJZCwgInRydWUiKTsKLQkJCi0JCWJvb2xlYW4gcGFzc2luZyA9IHRydWU7Ci0JCWZvciAoaW50IGk9MDsgaTx0Y3MubGVuZ3RoOyBpKyspIHsKLQkJCVRDRXhlUmVwbHkgcmVwbHkgPSB0Y3NbaV0uZXhlY3V0ZSgpOwotCQkJaWYgKHJlcGx5ICE9IG51bGwgJiYgISByZXBseS5wYXNzaW5nKCkpIHsKLQkJCQlwYXNzaW5nID0gZmFsc2U7Ci0JCQl9CQkJCQotCQl9Ci0JCWdldE93bmVyKCkuYXNzZXJ0VHJ1ZShwYXNzaW5nKTsKLQkJCi0JCXJldHVybiBwYXNzaW5nOwotCX0JCQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFsaWRhdGlvbi9DaXJjdWxhckRlcGVuZGVuY3lDaGVjay5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YWxpZGF0aW9uL0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNzU4Y2YuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YWxpZGF0aW9uL0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLkxpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UZXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5FeHBvcnRJbXBvcnRUZXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENOZXdNZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ09wZW5MaWJyYXJ5OwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciBwbHVnaW4gZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2sgZXh0ZW5kcyBFeHBvcnRJbXBvcnRUZXN0SW1wbCB7Ci0KLQlwdWJsaWMgQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2soU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQkKLQkJCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsJCQotCQllbmRTZXRVcCgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCWVuZFRlYXJEb3duKCk7Ci0JfQkKLQkKLQlwdWJsaWMgaW50IG51bVRlc3RDYXNlcygpIHsKLQkJcmV0dXJuIDE7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MDAwMV8xNjk1MDEoKSB7Ci0JCUxpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKCk7Ci0JCQotCQlUZXN0Q29tbWFuZCB0Y3NbXSA9IG5ldyBUZXN0Q29tbWFuZFs4XTsKLQkJCi0JCXRjc1swXSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENPcGVuTGlicmFyeS5jbGFzcyk7Ci0JCXRjc1swXS5zZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfTGliRm9sZGVyTmFtZSwgIjE2OTUwMSIpOwotCQkKLS8qCQl0Y3NbMV0gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDTmV3TWV0aG9kRWxlbWVudC5jbGFzcyk7Ci0JCXRjc1sxXS5zZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfVHlwZSwgIk1ldGhvZFBsdWdpbiIpOwotCQl0Y3NbMV0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX05hbWUsICJQbHVnIEEiKTsJKi8JCQkJCQkJCQkJCQotCQkKLQkJYm9vbGVhbiBwYXNzaW5nID0gdHJ1ZTsKLQkJZm9yIChpbnQgaT0wOyBpPHRjcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRjc1tpXSAhPSBudWxsKSB7Ci0JCQkJVENFeGVSZXBseSByZXBseSA9IHRjc1tpXS5leGVjdXRlKCk7Ci0JCQkJaWYgKHJlcGx5ICE9IG51bGwgJiYgISByZXBseS5wYXNzaW5nKCkpIHsKLQkJCQkJcGFzc2luZyA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKHBhc3NpbmcpOwotCX0JCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblRlc3RJbXBsLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblRlc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYjczZjcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YWxpZGF0aW9uL1ZhbGlkYXRpb25UZXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuTGlicmFyeUp1bml0VGVzdEltcGw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci0KLS8qKgotICogSlVuaXQgdGVzdHMgZm9yIHBsdWdpbiBleHBvcnQvaW1wb3J0Ci0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYWxpZGF0aW9uVGVzdEltcGwgZXh0ZW5kcyBMaWJyYXJ5SnVuaXRUZXN0SW1wbCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNvdXJjZUZvbGRlck5hbWUgPSAiVmFsaWRhdGlvbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgIEZpbGUgdGVzdFJvb3RTb3VyY2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXAgdGVzdFJvb3RXb3JraW5nTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwcml2YXRlIEZpbGUgZGVmYXVsdFRlc3REaXI7IAotCQotCXB1YmxpYyBWYWxpZGF0aW9uVGVzdEltcGwoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgRmlsZSBnZXRUZXN0Um9vdFNvdXJjZSgpIHsKLQkJaWYgKHRlc3RSb290U291cmNlID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXRoID0gZ2V0U2VydmljZSgpLmdldFRvcFRlc3RSb290U291cmNlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQlwYXRoICs9IEZpbGUuc2VwYXJhdG9yICsgc291cmNlRm9sZGVyTmFtZSArICBGaWxlLnNlcGFyYXRvcjsKLQkJCXRlc3RSb290U291cmNlID0gbmV3IEZpbGUocGF0aCk7Ci0JCX0KLQkJcmV0dXJuIHRlc3RSb290U291cmNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIEZpbGUgZ2V0VGVzdFJvb3RXb3JraW5nKCkgewotCQlGaWxlIHRlc3RSb290V29ya2luZyA9IChGaWxlKSB0ZXN0Um9vdFdvcmtpbmdNYXAuZ2V0KGdldENsYXNzKCkpOwotCQlpZiAodGVzdFJvb3RXb3JraW5nID09IG51bGwpIHsKLQkJCUNsYXNzIGNscyA9IGdldENsYXNzKCk7Ci0JCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBjbHMuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKLQkJCQotCQkJU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCBoaDptbTpzczpTU1MiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGR0U3RyID0gc2RmLmZvcm1hdChuZXcgRGF0ZSgpKTsKLQkJCWR0U3RyID0gZHRTdHIucmVwbGFjZSgnICcsICdfJyk7Ci0JCQlkdFN0ciA9IGR0U3RyLnJlcGxhY2UoJzonLCAnLScpOwotCQkJCi0JCQlTdHJpbmcgcGF0aCA9IGdldFNlcnZpY2UoKS5nZXRUZXN0R3JvdXAoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCXBhdGggKz0gRmlsZS5zZXBhcmF0b3IgKyBjbHMuZ2V0TmFtZSgpLnN1YnN0cmluZyhwYWNrYWdlTmFtZS5sZW5ndGgoKSArIDEpOwotCQkJcGF0aCArPSAiXyIgKyBkdFN0ciArIEZpbGUuc2VwYXJhdG9yOwotCQkJdGVzdFJvb3RXb3JraW5nID0gbmV3IEZpbGUocGF0aCk7Ci0JCQl0ZXN0Um9vdFdvcmtpbmdNYXAucHV0KGdldENsYXNzKCksIHRlc3RSb290V29ya2luZyk7Ci0JCX0KLQkJcmV0dXJuIHRlc3RSb290V29ya2luZzsKLQl9Ci0JCi0JcHJvdGVjdGVkIEZpbGUgZ2V0RGVmYXVsdFRlc3REaXIoKSB7Ci0JCWlmIChkZWZhdWx0VGVzdERpciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IGdldFRlc3RSb290V29ya2luZygpLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBnZXROYW1lKCk7IAotCQkJZGVmYXVsdFRlc3REaXIgPSBuZXcgRmlsZShwYXRoKTsKLQkJfQotCQkKLQkJcmV0dXJuIGRlZmF1bHRUZXN0RGlyOwotCX0KLQkJCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0FjdGl2aXR5VmFyaWFiaWxpdHlUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0FjdGl2aXR5VmFyaWFiaWxpdHlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyN2I2MTkuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9BY3Rpdml0eVZhcmlhYmlsaXR5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkRlZmF1bHRFbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuTGlicmFyeVRlc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGVzdCBjYXNlIGZvciBhY3Rpdml0eSB2YXJhaWJpbGl0eS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5VmFyaWFiaWxpdHlUZXN0IGV4dGVuZHMgVmFyaWFibGl0eUJhc2VUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVZhcmlhYmlsaXR5VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF9jcF9jb250cmlidXRpb25fZm9yX2F0dHJpYnV0ZXMoKSB7Ci0JCQotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCi0JCS8vIG5vdyBjcmVhdGUgYSBjYXBhYmlsaXR5IHBhdHRlcm4KLQkJQ2FwYWJpbGl0eVBhdHRlcm4gY3AxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4ocGx1Z2luLCAiQ1AxIiwgY29uZmlnKTsKLQkJCi0JCS8vIG5vdyBjcmVhdGUgYSBjb250cmlidXRpbmcgY2FwYWJpbGl0eSBwYXR0ZXJuCi0JCUNhcGFiaWxpdHlQYXR0ZXJuIGNwMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKHBsdWdpbiwgIkNQMiIsIGNvbmZpZyk7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyhjcDIsIGNwMSk7Ci0JCQotCQkvLyB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24KLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZCgoUHJvY2Vzc0NvbXBvbmVudCljcDEuZUNvbnRhaW5lcigpKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQoKFByb2Nlc3NDb21wb25lbnQpY3AyLmVDb250YWluZXIoKSk7Ci0JCQotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCQotCQlmaW5hbCBTdHJpbmcgY3AxX3RleHQgPSAiY3AxIG1haW4gZGVzYyI7Ci0JCWZpbmFsIFN0cmluZyBjcDJfdGV4dCA9ICJjcDIgbWFpbiBkZXNjIjsKLQkJCQotCQljcDEuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKGNwMV90ZXh0KTsKLQkJY3AyLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbihjcDJfdGV4dCk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nICB0ZXh0ID0gKFN0cmluZylDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoY3AxLmdldFByZXNlbnRhdGlvbigpLCBjcDEsIGZlYXR1cmUsIGNvbmZpZyk7Ci0JCWludCBpMSA9IHRleHQuaW5kZXhPZihjcDFfdGV4dCk7Ci0JCWludCBpMiA9IHRleHQuaW5kZXhPZihjcDJfdGV4dCk7Ci0JCWFzc2VydFRydWUoaTEgPj0gMCApOwotCQlhc3NlcnRUcnVlKGkyID4gaTEpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X2NwX2NvbnRyaWJ1dGlvbl9mb3JfZ3VpZGFuY2VzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlDaGVja2xpc3QgY2sxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ2hlY2tsaXN0KHBrZywgImNrMSIpOwotCQlDaGVja2xpc3QgY2syID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ2hlY2tsaXN0KHBrZywgImNrMiIpOwotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQotCQkvLyBub3cgY3JlYXRlIGEgY2FwYWJpbGl0eSBwYXR0ZXJuCi0JCUNhcGFiaWxpdHlQYXR0ZXJuIGNwMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKHBsdWdpbiwgIkNQMSIsIGNvbmZpZyk7Ci0JCWNwMS5nZXRDaGVja2xpc3RzKCkuYWRkKGNrMSk7Ci0JCQotCQkvLyBub3cgY3JlYXRlIGEgY29udHJpYnV0aW5nIGNhcGFiaWxpdHkgcGF0dGVybgotCQlDYXBhYmlsaXR5UGF0dGVybiBjcDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybihwbHVnaW4sICJDUDIiLCBjb25maWcpOwotCQljcDIuZ2V0Q2hlY2tsaXN0cygpLmFkZChjazIpOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMoY3AyLCBjcDEpOwotCQkKLQkJLy8gdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uCi0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQoKFByb2Nlc3NDb21wb25lbnQpY3AxLmVDb250YWluZXIoKSk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKChQcm9jZXNzQ29tcG9uZW50KWNwMi5lQ29udGFpbmVyKCkpOwotCQkKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0NoZWNrbGlzdHMoKTsKLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGNwMSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGNrMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGNrMikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X2NwX2NvbnRyaWJ1dGlvbl9mb3JfYnJlYWtkb3duRWxlbWVudHMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0KLQkJLy8gbm93IGNyZWF0ZSBhIGNhcGFiaWxpdHkgcGF0dGVybgotCQlDYXBhYmlsaXR5UGF0dGVybiBjcDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybihwbHVnaW4sICJDUDEiLCBjb25maWcpOwotCQlBY3Rpdml0eSBhY3QxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQWN0aXZpdHkocGx1Z2luLCBjcDEsICJhY3QxIiwgbnVsbCk7Ci0JCQotCQkvLyBub3cgY3JlYXRlIGEgY29udHJpYnV0aW5nIGNhcGFiaWxpdHkgcGF0dGVybgotCQlDYXBhYmlsaXR5UGF0dGVybiBjcDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybihwbHVnaW4sICJDUDIiLCBjb25maWcpOwotCQlBY3Rpdml0eSBhY3QyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQWN0aXZpdHkocGx1Z2luLCBjcDIsICJhY3QyIiwgbnVsbCk7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyhjcDIsIGNwMSk7Ci0JCQotCQkvLyB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24KLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZCgoUHJvY2Vzc0NvbXBvbmVudCljcDEuZUNvbnRhaW5lcigpKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQoKFByb2Nlc3NDb21wb25lbnQpY3AyLmVDb250YWluZXIoKSk7Ci0JCQotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCUxpc3QgaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShjcDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7CQkKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhY3QxKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYWN0MikpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X2FjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX3dpdGhfY29udHJpYnV0b3IoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCQotCQkvLyBmaXJzdCBzZXQgb2YgdGFzaywgcm9sZSwgd3BzCi0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInQxIik7Ci0JCUFydGlmYWN0IGExXzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMTEiKTsKLQkJQXJ0aWZhY3QgYTFfMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImExMiIpOwotCQl0MS5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMSk7Ci0JCXQxLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGExXzEpOwotCQl0MS5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhMV8yKTsKLQkJdDEuZ2V0T3V0cHV0KCkuYWRkKGExXzIpOwotCQlyMS5nZXRSZXNwb25zaWJsZUZvcigpLmFkZChhMV8xKTsKLQkJCi0JCS8vIHNlY29uZCBzZXQgb2YgdGFzaywgcm9sZSwgd3BzCi0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCVJvbGUgcjIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInQyIik7Ci0JCUFydGlmYWN0IGEyXzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMjEiKTsKLQkJQXJ0aWZhY3QgYTJfMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEyMiIpOwotCQl0Mi5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMik7Ci0JCXQyLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGEyXzEpOwotCQl0Mi5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhMl8yKTsKLQkJdDIuZ2V0T3V0cHV0KCkuYWRkKGEyXzIpOwotCQlyMi5nZXRSZXNwb25zaWJsZUZvcigpLmFkZChhMl8xKTsKLQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0KLQkJLy8gbm93IGNyZWF0ZSBhIGNhcGFiaWxpdHkgcGF0dGVybgotCQlDYXBhYmlsaXR5UGF0dGVybiBjcDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybihwbHVnaW4sICJDUDEiLCBjb25maWcpOwotCQlBY3Rpdml0eSBhY3QxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQWN0aXZpdHkocGx1Z2luLCBjcDEsICJhY3QxIiwgbmV3IFRhc2tbXXt0MX0pOwotCQkKLQkJLy8gbm93IGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBjYXBhYmlsaXR5IHBhdHRlcm4KLQkJQ2FwYWJpbGl0eVBhdHRlcm4gY3AyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4ocGx1Z2luLCAiQ1AyIiwgY29uZmlnKTsKLQkJQWN0aXZpdHkgYWN0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFjdGl2aXR5KHBsdWdpbiwgY3AxLCAiYWN0MiIsIG5ldyBUYXNrW117dDJ9KTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKGNwMiwgY3AxKTsKLQkJCi0JCS8vIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbgotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKChQcm9jZXNzQ29tcG9uZW50KWNwMS5lQ29udGFpbmVyKCkpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZCgoUHJvY2Vzc0NvbXBvbmVudCljcDIuZUNvbnRhaW5lcigpKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpOwotCQlMaXN0IGl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoY3AxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYWN0MSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGFjdDIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0F0dHJpYnV0ZUZlYXR1cmVUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0F0dHJpYnV0ZUZlYXR1cmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMzM4ODUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9BdHRyaWJ1dGVGZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5EZWZhdWx0RWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLkxpYnJhcnlUZXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUZXN0IGNhc2UgZm9yIGF0dHJpYnV0ZSBmZWF0dXJlIHZhcmFpYmlsaXR5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlRmVhdHVyZVRlc3QgZXh0ZW5kcyBWYXJpYWJsaXR5QmFzZVRlc3RDYXNlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEF0dHJpYnV0ZUZlYXR1cmVUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RfdGFza19tYWluRGVzY3JpcHRpb25fd2l0aF9jb250cmlidXRvcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCVRhc2sgdDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQzIik7Ci0JCQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nIHRleHQ7Ci0JCQotCQlmaW5hbCBTdHJpbmcgdDF0ZXh0ID0gIi0tdDEgdGV4dC0tIjsKLQkJZmluYWwgU3RyaW5nIHQydGV4dCA9ICItLXQyIHRleHQtLSI7Ci0JCWZpbmFsIFN0cmluZyB0M3RleHQgPSAiLS10MyB0ZXh0LS0iOwotCQkKLQkJdDEuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKHQxdGV4dCk7Ci0JCXQyLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbih0MnRleHQpOwotCQl0My5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24odDN0ZXh0KTsKLQkJCi0JCXRleHQgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZSh0MS5nZXRQcmVzZW50YXRpb24oKSwgdDEsIGZlYXR1cmUsIGNvbmZpZyk7Ci0JCWFzc2VydEVxdWFscyh0MXRleHQsIHRleHQpOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXModDIsIHQxKTsKLQkJdGV4dCA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKHQxLmdldFByZXNlbnRhdGlvbigpLCB0MSwgZmVhdHVyZSwgY29uZmlnKTsKLQkJYXNzZXJ0VHJ1ZSh0ZXh0ICE9IG51bGwgCi0JCQkJJiYgdGV4dC5pbmRleE9mKHQxdGV4dCkgPj0gMCAKLQkJCQkmJiB0ZXh0LmluZGV4T2YodDJ0ZXh0KSA+PSAwICk7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyh0MywgdDEpOwotCQl0ZXh0ID0gKFN0cmluZylDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUodDEuZ2V0UHJlc2VudGF0aW9uKCksIHQxLCBmZWF0dXJlLCBjb25maWcpOwotCQlhc3NlcnRUcnVlKHRleHQgIT0gbnVsbCAKLQkJCQkmJiB0ZXh0LmluZGV4T2YodDF0ZXh0KSA+PSAwIAotCQkJCSYmIHRleHQuaW5kZXhPZih0MnRleHQpID49IDAgCi0JCQkJJiYgdGV4dC5pbmRleE9mKHQzdGV4dCkgPj0gMCApOwotCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfdGFza19tYWluRGVzY3JpcHRpb25fd2l0aF9yZXBsYWNlcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCVRhc2sgdDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQzIik7Ci0JCQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZyB0ZXh0OwotCQlUYXNrIHQ7Ci0JCQotCQlmaW5hbCBTdHJpbmcgdDF0ZXh0ID0gIi0tdDEgdGV4dC0tIjsKLQkJZmluYWwgU3RyaW5nIHQydGV4dCA9ICItLXQyIHRleHQtLSI7Ci0JCWZpbmFsIFN0cmluZyB0M3RleHQgPSAiLS10MyB0ZXh0LS0iOwotCQkKLQkJdDEuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKHQxdGV4dCk7Ci0JCXQyLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbih0MnRleHQpOwotCQl0My5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24odDN0ZXh0KTsKLQkJCi0JCS8vIDEKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0UmVwbGFjZXModDIsIHQxKTsKLQkJdCA9IChUYXNrKUNvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQodDEsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKHQyLCB0KTsgIC8vIGlmIHRoaXMgZmFpbCwgdGhlIHJlbWFpbmluZyBjb2RlIHdpbGwgbm90IGJlIGV4ZWN1dGVkCi0KLQkJdGV4dCA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKHQuZ2V0UHJlc2VudGF0aW9uKCksIHQsIGZlYXR1cmUsIGNvbmZpZyk7Ci0JCWFzc2VydEVxdWFscyh0MnRleHQsIHRleHQpOwotCQkKLQkJLy8gMgotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyh0MywgdDIpOwotCQl0ID0gKFRhc2spQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCh0MSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHModDMsIHQpOyAgLy8gaWYgdGhpcyBmYWlsLCB0aGUgcmVtYWluaW5nIGNvZGUgd2lsbCBub3QgYmUgZXhlY3V0ZWQKLQotCQl0ZXh0ID0gKFN0cmluZylDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUodC5nZXRQcmVzZW50YXRpb24oKSwgdCwgZmVhdHVyZSwgY29uZmlnKTsKLQkJYXNzZXJ0RXF1YWxzKHQzdGV4dCwgdGV4dCk7Ci0KLQkJLy8gMwotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyh0MywgdDEpOwotCQl0ID0gKFRhc2spQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCh0MSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHModDEsIHQpOyAgLy8gaWYgdGhpcyBmYWlsLCB0aGUgcmVtYWluaW5nIGNvZGUgd2lsbCBub3QgYmUgZXhlY3V0ZWQKLQotCQl0ZXh0ID0gKFN0cmluZylDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUodC5nZXRQcmVzZW50YXRpb24oKSwgdCwgZmVhdHVyZSwgY29uZmlnKTsKLQkJYXNzZXJ0RXF1YWxzKHQxdGV4dCwgdGV4dCk7Ci0KLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdF90YXNrX21haW5EZXNjcmlwdGlvbl93aXRoX2V4dGVuZGVycygpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDIiKTsKLQkJVGFzayB0MyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDMiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgdGV4dDsKLQkJCi0JCWZpbmFsIFN0cmluZyB0MXRleHQgPSAiLS10MSB0ZXh0LS0iOwotCQlmaW5hbCBTdHJpbmcgdDJ0ZXh0ID0gIi0tdDIgdGV4dC0tIjsKLQkJZmluYWwgU3RyaW5nIHQzdGV4dCA9ICItLXQzIHRleHQtLSI7Ci0JCQotCQl0MS5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24odDF0ZXh0KTsKLQkJdDMuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKHQzdGV4dCk7Ci0JCi0JCXRleHQgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZSh0Mi5nZXRQcmVzZW50YXRpb24oKSwgdDIsIGZlYXR1cmUsIGNvbmZpZyk7Ci0JCWFzc2VydFRydWUodGV4dD09bnVsbCB8fCB0ZXh0LmVxdWFscygiIikpOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0RXh0ZW5kcyh0MiwgdDEpOwotCQl0ZXh0ID0gKFN0cmluZylDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUodDIuZ2V0UHJlc2VudGF0aW9uKCksIHQyLCBmZWF0dXJlLCBjb25maWcpOwotCQlhc3NlcnRFcXVhbHModDF0ZXh0LCB0ZXh0KTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHModDMsIHQxKTsKLQkJdGV4dCA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKHQzLmdldFByZXNlbnRhdGlvbigpLCB0MywgZmVhdHVyZSwgY29uZmlnKTsKLQkJYXNzZXJ0RXF1YWxzKHQzdGV4dCwgdGV4dCk7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF90YXNrX21haW5EZXNjcmlwdGlvbl93aXRoX3JlcGxhY2VyX2NvbnRyaWJ1dG9yX2V4dGVuZGVyKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlUYXNrIHQzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MyIpOwotCQlUYXNrIHQ0ID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0NCIpOwotCQkJCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgdGV4dDsKLQkJVGFzayB0OwotCQkKLQkJZmluYWwgU3RyaW5nIHQxdGV4dCA9ICItLXQxIHRleHQtLSI7Ci0JCWZpbmFsIFN0cmluZyB0MnRleHQgPSAiLS10MiB0ZXh0LS0iOwotCQlmaW5hbCBTdHJpbmcgdDN0ZXh0ID0gIi0tdDMgdGV4dC0tIjsKLQkJZmluYWwgU3RyaW5nIHQ0dGV4dCA9ICItLXQ0IHRleHQtLSI7Ci0JCQotCQl0MS5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24odDF0ZXh0KTsKLQkJdDIuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKHQydGV4dCk7Ci0JCXQzLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbih0M3RleHQpOwotCQkvL3Q0LmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbih0NHRleHQpOwotCQkKLQkJLy8gMQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyh0MiwgdDEpOwotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyh0MywgdDEpOwotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKHQ0LCB0MSk7Ci0KLQkJdGV4dCA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKHQ0LmdldFByZXNlbnRhdGlvbigpLCB0NCwgZmVhdHVyZSwgY29uZmlnKTsKLQkJYXNzZXJ0RXF1YWxzKHQydGV4dCwgdGV4dCk7Ci0JCQotCQkvLyAyCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQzLCB0Mik7Ci0JCXRleHQgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZSh0NC5nZXRQcmVzZW50YXRpb24oKSwgdDQsIGZlYXR1cmUsIGNvbmZpZyk7Ci0JCWFzc2VydFRydWUodGV4dCAhPSBudWxsIAotCQkJCSYmIHRleHQuaW5kZXhPZih0MnRleHQpID49IDAgCi0JCQkJJiYgdGV4dC5pbmRleE9mKHQzdGV4dCkgPj0gMCApOwotCi0JCS8vIDMgc2luY2UgdDMgY29udHJpYnV0ZXMgdG8gdDQsIHRoZSBhdHRyaWJ1dGUgdmFsdWUgZnJvbSBiYXNlIGlzIG5vdCBpbmhlcml0ZWQuCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQzLCB0NCk7Ci0JCXRleHQgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZSh0NC5nZXRQcmVzZW50YXRpb24oKSwgdDQsIGZlYXR1cmUsIGNvbmZpZyk7Ci0JCWFzc2VydFRydWUodGV4dCAhPSBudWxsIAotCQkJCSYmIHRleHQuaW5kZXhPZih0M3RleHQpID49IDAgKTsKLQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvQ29weXJpZ2h0VGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9Db3B5cmlnaHRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZjdmZDYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9Db3B5cmlnaHRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMudmFyaWFiaWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuTGlicmFyeVRlc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci0KLS8qKgotICogdGVzdCBjYXNlIGZvciBjb3B5cmlnaHQgdGV4dCByZWFsaXphdGlvbgotICogCi0gKiBXaGVuIGEgY29udHJpYnV0aW5nIGVsZW1lbnQgaGFzIGEgY29weXJpZ2h0LCAKLSAqIGl0IHNob3VsZCBiZSBhcHBlbmRlZCB0byB0aGUgY29weXJpZ2h0IG9mIHRoZSBwYXJlbnQgZWxlbWVudCBvbiB0aGUgZmluYWwgcHVibGlzaGVkIHBhZ2UuCi0KLQlBbHNvLCB3aGVuIGFuIGV4dGVuZGluZyBlbGVtZW50IGhhcyBhIGNvcHlyaWdodCwgCi0JdGhlIHB1Ymxpc2hlZCBwYWdlIGZvciB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQgc2hvdWxkIAotCWhhdmUgdGhlIHBhcmVudCBlbGVtZW50J3MgY29weXJpZ2h0IGZvbGxvd2VkIGJ5IHRoZSBleHRlbmRpbmcgZWxlbWVudHMgY29weXJpZ2h0LgotCi0JRm9yIHJlcGxhY2VzLCB0aGUgcmVwbGFjaW5nIGNvcHlyaWdodCBzaG91bGQgYmUgcHJlc2VudC4KLQkKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29weXJpZ2h0VGVzdCBleHRlbmRzIFZhcmlhYmxpdHlCYXNlVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodF90ZXh0XzEgPSAiPT09PT09PT09PT09PT09PSBUaGlzIGlzIGNvcHlyaWdodCB0ZXh0IDEgPT09PT09PT09PT09PT09PT09PSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodF90ZXh0XzIgPSAiPT09PT09PT09PT09PT09PSBUaGlzIGlzIGNvcHlyaWdodCB0ZXh0IDIgPT09PT09PT09PT09PT09PT09PSI7Ci0JCi0JcHVibGljIENvcHlyaWdodFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5cmlnaHQoKSB7Ci0JCQkJCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luMSwgInAxIik7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBjb3B5cmlnaHRfMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbChwa2cxLCAiY29weXJpZ2h0IDEiKTsKLQkJY29weXJpZ2h0XzEuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKGNvcHlyaWdodF90ZXh0XzEpOwotCQlwbHVnaW4xLnNldENvcHlyaWdodFN0YXRlbWVudChjb3B5cmlnaHRfMSk7Ci0JCQotCQlNZXRob2RQbHVnaW4gcGx1Z2luMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDIiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbjIsICJwMiIpOwotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgY29weXJpZ2h0XzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwocGtnMiwgImNvcHlyaWdodCAyIik7Ci0JCWNvcHlyaWdodF8yLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbihjb3B5cmlnaHRfdGV4dF8yKTsKLQkJcGx1Z2luMi5zZXRDb3B5cmlnaHRTdGF0ZW1lbnQoY29weXJpZ2h0XzIpOwotCQlwbHVnaW4yLmdldEJhc2VzKCkuYWRkKHBsdWdpbjEpOwotCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbjEpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cxKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4yKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnMik7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJCi0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZzEsICJ0MSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2cyLCAidDIiKTsKLQotCQlTdHJpbmcgdGV4dCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29weXJpZ2h0VGV4dCh0MSwgY29uZmlnKTsKLQkJaW50IGluZGV4MSA9IHRleHQuaW5kZXhPZihjb3B5cmlnaHRfdGV4dF8xKTsKLQkJYXNzZXJ0VHJ1ZShpbmRleDE+PTApOwotCQkKLQkJdGV4dCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29weXJpZ2h0VGV4dCh0MiwgY29uZmlnKTsKLQkJaW50IGluZGV4MiA9IHRleHQuaW5kZXhPZihjb3B5cmlnaHRfdGV4dF8yKTsKLQkJYXNzZXJ0VHJ1ZShpbmRleDI+PTApOwotCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29weXJpZ2h0X3dpdGhfY29udHJpYnV0b3JzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbjEsICJwMSIpOwotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgY29weXJpZ2h0XzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwocGtnMSwgImNvcHlyaWdodCAxIik7Ci0JCWNvcHlyaWdodF8xLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbihjb3B5cmlnaHRfdGV4dF8xKTsKLQkJcGx1Z2luMS5zZXRDb3B5cmlnaHRTdGF0ZW1lbnQoY29weXJpZ2h0XzEpOwotCQkKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbjIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAyIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4yLCAicDIiKTsKLQkJU3VwcG9ydGluZ01hdGVyaWFsIGNvcHlyaWdodF8yID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKHBrZzIsICJjb3B5cmlnaHQgMiIpOwotCQljb3B5cmlnaHRfMi5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24oY29weXJpZ2h0X3RleHRfMik7Ci0JCXBsdWdpbjIuc2V0Q29weXJpZ2h0U3RhdGVtZW50KGNvcHlyaWdodF8yKTsKLQkJcGx1Z2luMi5nZXRCYXNlcygpLmFkZChwbHVnaW4xKTsKLQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luMSk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZzEpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbjIpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cyKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQkKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnMSwgInQxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZzIsICJ0MiIpOwotCQlUYXNrIHQzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2cyLCAidDMiKTsKLQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyh0MiwgdDEpOwotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyh0MywgdDEpOwotCQkKLQkJU3RyaW5nIHRleHQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvcHlyaWdodFRleHQodDEsIGNvbmZpZyk7Ci0JCWludCBpbmRleDEgPSB0ZXh0LmluZGV4T2YoY29weXJpZ2h0X3RleHRfMSk7CQkKLQkJaW50IGluZGV4MiA9IHRleHQuaW5kZXhPZihjb3B5cmlnaHRfdGV4dF8yKTsKLQkJaW50IGluZGV4MyA9IHRleHQuaW5kZXhPZihjb3B5cmlnaHRfdGV4dF8yLCBpbmRleDIgKyBjb3B5cmlnaHRfdGV4dF8yLmxlbmd0aCgpKTsKLQkJYXNzZXJ0VHJ1ZShpbmRleDE+PTApOwotCQlhc3NlcnRUcnVlKGluZGV4Mj49MCk7Ci0JCWFzc2VydFRydWUoaW5kZXgzPDApOyAvLyB0MiBhbmQgdDMgaGFzIHRoZSBzYW1lIGNvcHlyaWdodCwgc2hvdWxkIG9ubHkgc2hvdyBvbmNlCi0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29weXJpZ2h0X3dpdGhfcmVwbGFjZXIoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luMSwgInAxIik7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBjb3B5cmlnaHRfMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbChwa2cxLCAiY29weXJpZ2h0IDEiKTsKLQkJY29weXJpZ2h0XzEuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKGNvcHlyaWdodF90ZXh0XzEpOwotCQlwbHVnaW4xLnNldENvcHlyaWdodFN0YXRlbWVudChjb3B5cmlnaHRfMSk7Ci0JCQotCQlNZXRob2RQbHVnaW4gcGx1Z2luMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDIiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbjIsICJwMiIpOwotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgY29weXJpZ2h0XzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwocGtnMiwgImNvcHlyaWdodCAyIik7Ci0JCWNvcHlyaWdodF8yLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbihjb3B5cmlnaHRfdGV4dF8yKTsKLQkJcGx1Z2luMi5zZXRDb3B5cmlnaHRTdGF0ZW1lbnQoY29weXJpZ2h0XzIpOwotCQlwbHVnaW4yLmdldEJhc2VzKCkuYWRkKHBsdWdpbjEpOwotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4xKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnMSk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luMik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZzIpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCQotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2cxLCAidDEiKTsKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnMiwgInQyIik7Ci0KLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0UmVwbGFjZXModDIsIHQxKTsKLQkJCi0JCVN0cmluZyB0ZXh0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb3B5cmlnaHRUZXh0KHQyLCBjb25maWcpOwotCQlpbnQgaW5kZXgxID0gdGV4dC5pbmRleE9mKGNvcHlyaWdodF90ZXh0XzEpOwkJCi0JCWludCBpbmRleDIgPSB0ZXh0LmluZGV4T2YoY29weXJpZ2h0X3RleHRfMik7Ci0JCWFzc2VydFRydWUoaW5kZXgxIDwgMCk7Ci0JCWFzc2VydFRydWUoaW5kZXgyID49IDApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29weXJpZ2h0X3dpdGhfZXh0ZW5kZXJzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbjEsICJwMSIpOwotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgY29weXJpZ2h0XzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwocGtnMSwgImNvcHlyaWdodCAxIik7Ci0JCWNvcHlyaWdodF8xLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbihjb3B5cmlnaHRfdGV4dF8xKTsKLQkJcGx1Z2luMS5zZXRDb3B5cmlnaHRTdGF0ZW1lbnQoY29weXJpZ2h0XzEpOwotCQkKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbjIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAyIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4yLCAicDIiKTsKLQkJU3VwcG9ydGluZ01hdGVyaWFsIGNvcHlyaWdodF8yID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKHBrZzIsICJjb3B5cmlnaHQgMiIpOwotCQljb3B5cmlnaHRfMi5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24oY29weXJpZ2h0X3RleHRfMik7Ci0JCXBsdWdpbjIuc2V0Q29weXJpZ2h0U3RhdGVtZW50KGNvcHlyaWdodF8yKTsKLQkJcGx1Z2luMi5nZXRCYXNlcygpLmFkZChwbHVnaW4xKTsKLQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luMSk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZzEpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbjIpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cyKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQkKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnMSwgInQxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZzIsICJ0MiIpOwotCQlUYXNrIHQzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2cyLCAidDMiKTsKLQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKHQyLCB0MSk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHModDMsIHQyKTsKLQkJCi0JCWludCBpbmRleDEsIGluZGV4MiwgaW5kZXgzOwotCQkKLQkJU3RyaW5nIHRleHQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvcHlyaWdodFRleHQodDEsIGNvbmZpZyk7Ci0JCWluZGV4MSA9IHRleHQuaW5kZXhPZihjb3B5cmlnaHRfdGV4dF8xKTsJCi0JCWFzc2VydFRydWUoaW5kZXgxPj0wKTsKLQkJCi0JCXRleHQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvcHlyaWdodFRleHQodDIsIGNvbmZpZyk7CQotCQlpbmRleDEgPSB0ZXh0LmluZGV4T2YoY29weXJpZ2h0X3RleHRfMSk7CQotCQlpbmRleDIgPSB0ZXh0LmluZGV4T2YoY29weXJpZ2h0X3RleHRfMik7Ci0JCWFzc2VydFRydWUoaW5kZXgxID49IDApOwotCQlhc3NlcnRUcnVlKGluZGV4MiA+IGluZGV4MSk7IC8vIGJhc2UgY29weXJpZ2h0IGNvbWVzIGZpcnN0Ci0KLQkJU3RyaW5nIHRleHQzID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb3B5cmlnaHRUZXh0KHQzLCBjb25maWcpOwkKLQkJYXNzZXJ0RXF1YWxzKHRleHQsIHRleHQzKTsgLy8gdDIgYW5kIHQzIGhhcyB0aGUgc2FtZSBjb3B5cmlnaHQsIHNob3VsZCBvbmx5IHNob3cgb25jZSwgc28gc2FtZSBhcyBhYm92ZQkJCi0JfQotCQotCS8qKgotCSAqIFIwMDM4Mzg1NSAtIFNhbWUgY29weXJpZ2h0IG1lc3NhZ2UgZ2V0cyByZWFsaXplZCB0d2ljZQotCSAqIFN0ZXBzIHRvIHJlcHJvZHVjZToKLQkJMC4gQ3JlYXRlIGEgY29uZmlnIGluY2x1ZGUgcGx1Z2luIFggYW5kIFkuCi0JCTEuIEFzc2lnbiBjb3B5cmlnaHQgQSB0byBwbHVnaW4gWC4KLQkJMi4gQXNzaWduIGNvcHlyaWdodCBBIHRvIHBsdWdpbiBZLgotCQkzLiBIYXZlIGEgdGFzayBNIGluIHBsdWdpbiBZIHRvIGNvbnRyaWJ1dGUgdGFzayBOIGluIHBsdWdpbiBYLgotCQk0LiBwcmV2aWV3IHRhc2sgTiBhbmQgeW91IHdpbGwgYmUgdGhlIGNvcHlyaWdodCBkaXNwbGFlZCB0d2ljZSBhdCB0aGUgYm90dG9tLgotCSAqCi0JICovCi0JCi0JcHVibGljIHZvaWQgdGVzdF9SMDAzODM4NTUoKSB7Ci0JCQotCQkvLyBzYW1lIGFzIHRoZSBsYXN0IHBhcnQgb2YgdGVzdENvcHlyaWdodF93aXRoX2NvbnRyaWJ1dG9ycygpCi0JCXRlc3RDb3B5cmlnaHRfd2l0aF9jb250cmlidXRvcnMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0luY29taW5nMDFGZWF0dXJlVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9JbmNvbWluZzAxRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUwNmU3ZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0luY29taW5nMDFGZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5EZWZhdWx0RWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLkxpYnJhcnlUZXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiBUZXN0IGNhc2UgZm9yIGluY29taW5nIDAuLjEgZmVhdHVyZSB2YXJhaWJpbGl0eS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEluY29taW5nMDFGZWF0dXJlVGVzdCBleHRlbmRzIFZhcmlhYmxpdHlCYXNlVGVzdENhc2UgewotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgSW5jb21pbmcwMUZlYXR1cmVUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3Rfd29ya1Byb2R1Y3RfRG9tYWluKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlEb21haW4gZDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVEb21haW4ocGx1Z2luLCAiZDEiKTsKLQkJRG9tYWluIGQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlRG9tYWluKHBsdWdpbiwgImQyIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwotCQkJCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJT3Bwb3NpdGVGZWF0dXJlIG9mZWF0dXJlID0gQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfRG9tYWluczsKLQkJCi0JCS8vIHNpbmNlIDEuMiwgdGhpcyBpcyBhIHRvLW1hbnkgZmVhdHVyZSwgbm90IHRvLW9uZQotCQkvLyBjYXNlIDEKLQkJZDEuZ2V0V29ya1Byb2R1Y3RzKCkuYWRkKGExKTsKLQkJZDIuZ2V0V29ya1Byb2R1Y3RzKCkuYWRkKGEyKTsKLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGExLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQxLCBpdGVtcy5nZXQoMCkpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMiwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhkMiwgaXRlbXMuZ2V0KDApKTsKLQkJCi0JCS8vIGNhc2UgMjogCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKGQyLCBkMSk7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTEsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZDEsIGl0ZW1zLmdldCgwKSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGEyLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQxLCBpdGVtcy5nZXQoMCkpOwotCQkKLQkJLy8gY2FzZSAzOiAKLQkJLy8gaWYgZDIgcmVwbGFjZXMgZDEsIGl0J3Mgb3V0Z29pbmcgdG8tbWFueSBhc3NvY2lhdGlvbiBpcyByZXBhbGNlZCwgCi0JCS8vIGkuZSB0aGUgZW5kIHJlc3VsdCBpcyBkMiAtPiBhMiwgYnV0IGExIGRvZXMgbm90IGhhdmUgYSBkb21haW4KLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0UmVwbGFjZXMoZDIsIGQxKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGl0ZW1zLnNpemUoKSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGEyLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQyLCBpdGVtcy5nZXQoMCkpOwotCQkKLQkJLy8gY2FzZSA0OiAKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0RXh0ZW5kcyhkMiwgZDEpOwotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGExLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQxLCBpdGVtcy5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoZDIsIGl0ZW1zLmdldCgxKSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGEyLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQyLCBpdGVtcy5nZXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3dvcmtQcm9kdWN0X0RvbWFpbl93aXRoX2NvbnRyaWJ1dG9ycygpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJRG9tYWluIGQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlRG9tYWluKHBsdWdpbiwgImQxIik7Ci0JCURvbWFpbiBkMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZURvbWFpbihwbHVnaW4sICJkMiIpOwotCQlEb21haW4gZDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVEb21haW4ocGx1Z2luLCAiZDMiKTsKLQkJQXJ0aWZhY3QgYTEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMSIpOwotCQlBcnRpZmFjdCBhMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEyIik7Ci0JCUFydGlmYWN0IGEzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTMiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X0RvbWFpbnM7Ci0JCQotCQkvLyBjYXNlIDEKLQkJZDIuZ2V0V29ya1Byb2R1Y3RzKCkuYWRkKGEyKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMoYTIsIGExKTsKLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGExLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQyLCBpdGVtcy5nZXQoMCkpOwotCQkKLQkJLy8gY2FzZSAyOiAKLQkJZDEuZ2V0V29ya1Byb2R1Y3RzKCkuYWRkKGExKTsKLQkJZDIuZ2V0V29ya1Byb2R1Y3RzKCkuYWRkKGEyKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMoYTIsIGExKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoZDEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhkMikpOwotCQkJCQotCQkvLyBjYXNlIDM6IG1vcmUgdGhhbiBjb250cmlidXRvcnMsIHJldHVybiBudWxsCi0JCWQxLmdldFdvcmtQcm9kdWN0cygpLnJlbW92ZShhMSk7Ci0JCWQyLmdldFdvcmtQcm9kdWN0cygpLmFkZChhMik7Ci0JCWQzLmdldFdvcmtQcm9kdWN0cygpLmFkZChhMyk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKGEzLCBhMSk7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTEsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGQyKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoZDMpKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0luY29taW5nMG5GZWF0dXJlVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9JbmNvbWluZzBuRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwNmJmYy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0luY29taW5nMG5GZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5EZWZhdWx0RWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLkxpYnJhcnlUZXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogVGVzdCBjYXNlIGZvciBpbmNvbWluZyAwLi5uIGZlYXR1cmUgdmFyYWliaWxpdHkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmNvbWluZzBuRmVhdHVyZVRlc3QgZXh0ZW5kcyBWYXJpYWJsaXR5QmFzZVRlc3RDYXNlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEluY29taW5nMG5GZWF0dXJlVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCS8qKgotCSAqIHNpbmNlIDEuMG00LCBhIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtdWx0aXBsZSByb2xlcwotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF93b3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGVzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotCQlBcnRpZmFjdCBhMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImExIik7Ci0JCUFydGlmYWN0IGEyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTIiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXM7Ci0JCUxpc3QgaXRlbXM7Ci0JCQotCQlMaXN0IGxpc3QgPSByMS5nZXRSZXNwb25zaWJsZUZvcigpOwotCQlsaXN0LmFkZChhMSk7Ci0JCWxpc3QuYWRkKGExKTsKLQkJCi0JCS8vIGNhc2UgMQotCQlyMS5nZXRSZXNwb25zaWJsZUZvcigpLmFkZChhMSk7Ci0JCXIyLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGEyKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjEpKTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTIsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIyKSk7Ci0JCQotCQkvLyBjYXNlIDI6IAotCQlyMS5nZXRSZXNwb25zaWJsZUZvcigpLmFkZChhMSk7Ci0JCXIyLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGEyKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMocjIsIHIxKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjEpKTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTIsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIxKSk7Ci0JCQotCQkvLyBjYXNlIDM6IAotCQkvLyBzaW5jZSByMiByZXBsYWNlcyByMSwgdGhlIGVuZCByZXN1bHQgaXMgcjIgLT4gYTIsIAotCQkvLyByMSBkb2VzIG5vdCBleGlzdCBhbnkgbW9yZSwgc28gYTEgaGFzIG5vIHJlc3BvbnNpYmxlIHJvbGUKLQkJcjEuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQoYTEpOwotCQlyMi5nZXRSZXNwb25zaWJsZUZvcigpLmFkZChhMik7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHIyLCByMSk7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTEsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygwLCBpdGVtcy5zaXplKCkpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMiwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjIpKTsKLQkJCi0JCS8vIGNhc2UgNDogCi0JCXIxLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGExKTsKLQkJcjIuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQoYTIpOwotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKHIyLCByMSk7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTEsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIxKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjIpKTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTIsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIyKSk7Ci0JCQotCQkvLyBjYXNlIDU6IGJvdGggcjEgYW5kIHIyIHJlc3BvbnNpYmxlIGZvciBhMQotCQlyMS5nZXRSZXNwb25zaWJsZUZvcigpLmNsZWFyKCk7Ci0JCXIyLmdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJcjEuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQoYTEpOwotCQlyMi5nZXRSZXNwb25zaWJsZUZvcigpLmFkZChhMSk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHMocjIsIHIxKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7IC8vIHRoaXMgbmVlZCB0byB3YWl0IHRpbGwgdGhlIG9wcG9zaXRlIGZlYXR1cmUgY2hhbmdlIGZyb20gcGhvbmcgaXMgZGVsaXZlcmVkCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyMikpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMiwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGl0ZW1zLnNpemUoKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3dvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXNfd2l0aF9jb250cmlidXRvcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIxIik7Ci0JCVJvbGUgcjIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIyIik7Ci0JCVJvbGUgcjMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIzIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwotCQlBcnRpZmFjdCBhMyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEzIik7Ci0JCQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlPcHBvc2l0ZUZlYXR1cmUgb2ZlYXR1cmUgPSBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGVzOwotCQlMaXN0IGl0ZW1zOwotCQkKLQkJLy8gY2FzZSAxCi0JCXIyLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGEyKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMoYTIsIGExKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjIpKTsKLQkJCi0JCS8vIGNhc2UgMjogCi0JCXIxLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGExKTsKLQkJcjIuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQoYTIpOwotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyhhMiwgYTEpOwotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGExLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIyKSk7Ci0JCQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3Rfd29ya1Byb2R1Y3RfUmVzcG9uc2libGVSb2xlc193aXRoX3JlcGxhY2VyKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotLy8JCVJvbGUgcjMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIzIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwotLy8JCUFydGlmYWN0IGEzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTMiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXM7Ci0JCUxpc3QgaXRlbXM7Ci0JCQotCQkvLyBjYXNlIDEKLQkJcjEuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQoYTEpOwotCQlyMi5nZXRSZXNwb25zaWJsZUZvcigpLmFkZChhMik7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKGEyLCBhMSk7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTIsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIxKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjIpKTsKLQkJCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9PdXRnb2luZzAxRmVhdHVyZVRlc3QuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvT3V0Z29pbmcwMUZlYXR1cmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MTcxYzEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9PdXRnb2luZzAxRmVhdHVyZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy52YXJpYWJpbGl0eTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5EZWZhdWx0RWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLkxpYnJhcnlUZXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRlc3QgY2FzZSBmb3IgMC4uMSBmZWF0dXJlIHZhcmFpYmlsaXR5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3V0Z29pbmcwMUZlYXR1cmVUZXN0IGV4dGVuZHMgVmFyaWFibGl0eUJhc2VUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBPdXRnb2luZzAxRmVhdHVyZVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfcGVyZm9ybWVkQnkoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIxIik7Ci0JCQotCQl0MS5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0JCS8vTWV0aG9kRWxlbWVudCByID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJTGlzdDxNZXRob2RFbGVtZW50PiBsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKHIxLCBsaXN0LmdldCgwKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfdGFza19wZXJmb3JtZWRCeV93aXRoX2NvbnRyaWJ1dG9yKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MSIpOwotCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotCQkKLQkJdDEuZ2V0UGVyZm9ybWVkQnkoKS5hZGQocjEpOwotCQl0Mi5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMik7Ci0JCQotCQkvLyB0MiBjb250cmlidXRlcyB0byB0MSwgc2luY2UgdDEgYWxyZWFkeSBoYXMgYSB0by1vbmUgYXNzb2NpYXRpb24sIAotCQkvLyB0aGUgb25lIGZyb20gdGhlIGNvbnRyaWJ1dG9yIGlzIGlnbm9yZWQKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXModDIsIHQxKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKTsKLQkJLy9NZXRob2RFbGVtZW50IHIgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkvL2Fzc2VydEVxdWFscyhyMSwgcik7Ci0JCUxpc3Q8TWV0aG9kRWxlbWVudD4gbGlzdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyhyMSwgbGlzdC5nZXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfcGVyZm9ybWVkQnlfZnJvbV9jb250cmlidXRvcigpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLS8vCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotCQkKLQkJLy8gZG9uJ3Qgc2V0IHBlcmZvcm1lciBpbiB0MSwgc28gaXQgd2lsbCBnZXQgZnJvbSB0aGUgY29udHJpYnV0b3IKLQkJLy90MS5zZXRQZXJmb3JtZWRCeShyMSk7Ci0JCXQyLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHIyKTsKLQkJCi0JCS8vIHQyIGNvbnRyaWJ1dGVzIHRvIHQxLCBzaW5jZSB0MSBkb2VzIG5vdCBoYXZlIGEgdG8tb25lIGFzc29jaWF0aW9uLCAKLQkJLy8gdGhlIG9uZSBmcm9tIHRoZSBjb250cmlidXRvciBpcyB1c2VkCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQyLCB0MSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0JCS8vTWV0aG9kRWxlbWVudCByID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJLy9hc3NlcnRFcXVhbHMocjIsIHIpOwotCQlMaXN0PE1ldGhvZEVsZW1lbnQ+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==